summaryrefslogtreecommitdiffstats
path: root/devtools/client/debugger
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/debugger')
-rw-r--r--devtools/client/debugger/.remarkignore2
-rw-r--r--devtools/client/debugger/.remarkrc17
-rw-r--r--devtools/client/debugger/babel.config.js89
-rw-r--r--devtools/client/debugger/bin/bundle.js86
-rw-r--r--devtools/client/debugger/bin/watch.js31
-rw-r--r--devtools/client/debugger/dist/moz.build10
-rw-r--r--devtools/client/debugger/dist/parser-worker.js41439
-rw-r--r--devtools/client/debugger/dist/pretty-print-worker.js10624
-rw-r--r--devtools/client/debugger/dist/search-worker.js402
-rw-r--r--devtools/client/debugger/images/arrow-down.svg6
-rw-r--r--devtools/client/debugger/images/arrow-up.svg6
-rw-r--r--devtools/client/debugger/images/arrow.svg6
-rw-r--r--devtools/client/debugger/images/blackBox.svg9
-rw-r--r--devtools/client/debugger/images/breadcrumbs-divider.svg18
-rw-r--r--devtools/client/debugger/images/breakpoint.svg6
-rw-r--r--devtools/client/debugger/images/case-match.svg6
-rw-r--r--devtools/client/debugger/images/column-marker.svg6
-rw-r--r--devtools/client/debugger/images/command-chevron.svg6
-rw-r--r--devtools/client/debugger/images/disable-pausing.svg15
-rw-r--r--devtools/client/debugger/images/enable-pausing.svg15
-rw-r--r--devtools/client/debugger/images/file-small.svg6
-rw-r--r--devtools/client/debugger/images/folder.svg6
-rw-r--r--devtools/client/debugger/images/globe-small.svg7
-rw-r--r--devtools/client/debugger/images/globe.svg9
-rw-r--r--devtools/client/debugger/images/help.svg7
-rw-r--r--devtools/client/debugger/images/home.svg6
-rw-r--r--devtools/client/debugger/images/loader.svg7
-rw-r--r--devtools/client/debugger/images/markup-breakpoint.svg7
-rw-r--r--devtools/client/debugger/images/next-circle.svg9
-rw-r--r--devtools/client/debugger/images/next.svg8
-rw-r--r--devtools/client/debugger/images/pane-collapse.svg7
-rw-r--r--devtools/client/debugger/images/pane-expand.svg7
-rw-r--r--devtools/client/debugger/images/pause.svg8
-rw-r--r--devtools/client/debugger/images/plus.svg6
-rw-r--r--devtools/client/debugger/images/prettyPrint.svg6
-rw-r--r--devtools/client/debugger/images/regex-match.svg9
-rw-r--r--devtools/client/debugger/images/reload.svg7
-rw-r--r--devtools/client/debugger/images/search.svg6
-rw-r--r--devtools/client/debugger/images/sourcemap.svg6
-rw-r--r--devtools/client/debugger/images/sources/aframe.svg6
-rw-r--r--devtools/client/debugger/images/sources/angular.svg8
-rw-r--r--devtools/client/debugger/images/sources/babel.svg6
-rw-r--r--devtools/client/debugger/images/sources/backbone.svg6
-rw-r--r--devtools/client/debugger/images/sources/choo.svg14
-rw-r--r--devtools/client/debugger/images/sources/coffeescript.svg6
-rw-r--r--devtools/client/debugger/images/sources/dojo.svg4
-rw-r--r--devtools/client/debugger/images/sources/ember.svg4
-rw-r--r--devtools/client/debugger/images/sources/express.svg7
-rw-r--r--devtools/client/debugger/images/sources/extension.svg6
-rw-r--r--devtools/client/debugger/images/sources/immutable.svg6
-rw-r--r--devtools/client/debugger/images/sources/javascript.svg6
-rw-r--r--devtools/client/debugger/images/sources/jquery.svg6
-rw-r--r--devtools/client/debugger/images/sources/lodash.svg7
-rw-r--r--devtools/client/debugger/images/sources/marko.svg64
-rw-r--r--devtools/client/debugger/images/sources/mobx.svg7
-rw-r--r--devtools/client/debugger/images/sources/nextjs.svg17
-rw-r--r--devtools/client/debugger/images/sources/node.svg6
-rw-r--r--devtools/client/debugger/images/sources/nuxtjs.svg4
-rw-r--r--devtools/client/debugger/images/sources/preact.svg11
-rw-r--r--devtools/client/debugger/images/sources/pug.svg118
-rw-r--r--devtools/client/debugger/images/sources/react.svg6
-rw-r--r--devtools/client/debugger/images/sources/redux.svg6
-rw-r--r--devtools/client/debugger/images/sources/rxjs.svg33
-rw-r--r--devtools/client/debugger/images/sources/sencha-extjs.svg13
-rw-r--r--devtools/client/debugger/images/sources/typescript.svg6
-rw-r--r--devtools/client/debugger/images/sources/underscore.svg8
-rw-r--r--devtools/client/debugger/images/sources/vuejs.svg7
-rw-r--r--devtools/client/debugger/images/sources/webpack.svg8
-rw-r--r--devtools/client/debugger/images/stepIn.svg8
-rw-r--r--devtools/client/debugger/images/stepOut.svg8
-rw-r--r--devtools/client/debugger/images/tab.svg6
-rw-r--r--devtools/client/debugger/images/trace.svg6
-rw-r--r--devtools/client/debugger/images/webconsole-logpoint.svg6
-rw-r--r--devtools/client/debugger/images/whole-word-match.svg13
-rw-r--r--devtools/client/debugger/images/window.svg6
-rw-r--r--devtools/client/debugger/images/worker.svg7
-rw-r--r--devtools/client/debugger/index.html73
-rw-r--r--devtools/client/debugger/jest-test.config.js26
-rw-r--r--devtools/client/debugger/jest.config.js13
-rw-r--r--devtools/client/debugger/moz.build25
-rw-r--r--devtools/client/debugger/package.json102
-rw-r--r--devtools/client/debugger/panel.js376
-rw-r--r--devtools/client/debugger/src/.eslintignore5
-rw-r--r--devtools/client/debugger/src/.eslintrc.js363
-rw-r--r--devtools/client/debugger/src/actions/README.md26
-rw-r--r--devtools/client/debugger/src/actions/ast/index.js5
-rw-r--r--devtools/client/debugger/src/actions/ast/moz.build11
-rw-r--r--devtools/client/debugger/src/actions/ast/setInScopeLines.js98
-rw-r--r--devtools/client/debugger/src/actions/breakpoints/breakpointPositions.js331
-rw-r--r--devtools/client/debugger/src/actions/breakpoints/index.js395
-rw-r--r--devtools/client/debugger/src/actions/breakpoints/modify.js368
-rw-r--r--devtools/client/debugger/src/actions/breakpoints/moz.build13
-rw-r--r--devtools/client/debugger/src/actions/breakpoints/syncBreakpoint.js126
-rw-r--r--devtools/client/debugger/src/actions/breakpoints/tests/__snapshots__/breakpoints.spec.js.snap165
-rw-r--r--devtools/client/debugger/src/actions/breakpoints/tests/breakpoints.spec.js476
-rw-r--r--devtools/client/debugger/src/actions/context-menus/breakpoint-heading.js78
-rw-r--r--devtools/client/debugger/src/actions/context-menus/breakpoint.js396
-rw-r--r--devtools/client/debugger/src/actions/context-menus/editor-breakpoint.js273
-rw-r--r--devtools/client/debugger/src/actions/context-menus/editor.js436
-rw-r--r--devtools/client/debugger/src/actions/context-menus/frame.js97
-rw-r--r--devtools/client/debugger/src/actions/context-menus/index.js12
-rw-r--r--devtools/client/debugger/src/actions/context-menus/moz.build16
-rw-r--r--devtools/client/debugger/src/actions/context-menus/outline.js54
-rw-r--r--devtools/client/debugger/src/actions/context-menus/source-tree-item.js281
-rw-r--r--devtools/client/debugger/src/actions/context-menus/tab.js128
-rw-r--r--devtools/client/debugger/src/actions/event-listeners.js77
-rw-r--r--devtools/client/debugger/src/actions/exceptions.js30
-rw-r--r--devtools/client/debugger/src/actions/expressions.js210
-rw-r--r--devtools/client/debugger/src/actions/file-search.js51
-rw-r--r--devtools/client/debugger/src/actions/index.js50
-rw-r--r--devtools/client/debugger/src/actions/moz.build32
-rw-r--r--devtools/client/debugger/src/actions/navigation.js57
-rw-r--r--devtools/client/debugger/src/actions/pause/breakOnNext.js20
-rw-r--r--devtools/client/debugger/src/actions/pause/commands.js147
-rw-r--r--devtools/client/debugger/src/actions/pause/continueToHere.js63
-rw-r--r--devtools/client/debugger/src/actions/pause/expandScopes.js16
-rw-r--r--devtools/client/debugger/src/actions/pause/fetchFrames.js22
-rw-r--r--devtools/client/debugger/src/actions/pause/fetchScopes.js37
-rw-r--r--devtools/client/debugger/src/actions/pause/index.js32
-rw-r--r--devtools/client/debugger/src/actions/pause/inlinePreview.js239
-rw-r--r--devtools/client/debugger/src/actions/pause/mapFrames.js161
-rw-r--r--devtools/client/debugger/src/actions/pause/mapScopes.js201
-rw-r--r--devtools/client/debugger/src/actions/pause/moz.build26
-rw-r--r--devtools/client/debugger/src/actions/pause/pauseOnDebuggerStatement.js17
-rw-r--r--devtools/client/debugger/src/actions/pause/pauseOnExceptions.js34
-rw-r--r--devtools/client/debugger/src/actions/pause/paused.js69
-rw-r--r--devtools/client/debugger/src/actions/pause/resetBreakpointsPaneState.js18
-rw-r--r--devtools/client/debugger/src/actions/pause/resumed.js31
-rw-r--r--devtools/client/debugger/src/actions/pause/selectFrame.js37
-rw-r--r--devtools/client/debugger/src/actions/pause/skipPausing.js33
-rw-r--r--devtools/client/debugger/src/actions/pause/tests/__snapshots__/pauseOnExceptions.spec.js.snap10
-rw-r--r--devtools/client/debugger/src/actions/pause/tests/pause.spec.js290
-rw-r--r--devtools/client/debugger/src/actions/pause/tests/pauseOnExceptions.spec.js24
-rw-r--r--devtools/client/debugger/src/actions/pause/tests/skipPausing.spec.js18
-rw-r--r--devtools/client/debugger/src/actions/preview.js159
-rw-r--r--devtools/client/debugger/src/actions/project-text-search.js142
-rw-r--r--devtools/client/debugger/src/actions/quick-open.js21
-rw-r--r--devtools/client/debugger/src/actions/source-actors.js12
-rw-r--r--devtools/client/debugger/src/actions/sources-tree.js43
-rw-r--r--devtools/client/debugger/src/actions/sources/blackbox.js211
-rw-r--r--devtools/client/debugger/src/actions/sources/breakableLines.js68
-rw-r--r--devtools/client/debugger/src/actions/sources/index.js40
-rw-r--r--devtools/client/debugger/src/actions/sources/loadSourceText.js252
-rw-r--r--devtools/client/debugger/src/actions/sources/moz.build17
-rw-r--r--devtools/client/debugger/src/actions/sources/newSources.js382
-rw-r--r--devtools/client/debugger/src/actions/sources/prettyPrint.js358
-rw-r--r--devtools/client/debugger/src/actions/sources/select.js368
-rw-r--r--devtools/client/debugger/src/actions/sources/symbols.js62
-rw-r--r--devtools/client/debugger/src/actions/sources/tests/blackbox.spec.js247
-rw-r--r--devtools/client/debugger/src/actions/sources/tests/loadSource.spec.js216
-rw-r--r--devtools/client/debugger/src/actions/sources/tests/newSources.spec.js103
-rw-r--r--devtools/client/debugger/src/actions/sources/tests/select.spec.js195
-rw-r--r--devtools/client/debugger/src/actions/tabs.js104
-rw-r--r--devtools/client/debugger/src/actions/tests/__snapshots__/expressions.spec.js.snap11
-rw-r--r--devtools/client/debugger/src/actions/tests/__snapshots__/pending-breakpoints.spec.js.snap30
-rw-r--r--devtools/client/debugger/src/actions/tests/expressions.spec.js136
-rw-r--r--devtools/client/debugger/src/actions/tests/helpers/breakpoints.js65
-rw-r--r--devtools/client/debugger/src/actions/tests/helpers/mockCommandClient.js49
-rw-r--r--devtools/client/debugger/src/actions/tests/helpers/readFixture.js14
-rw-r--r--devtools/client/debugger/src/actions/tests/pending-breakpoints.spec.js251
-rw-r--r--devtools/client/debugger/src/actions/tests/ui.spec.js88
-rw-r--r--devtools/client/debugger/src/actions/threads.js58
-rw-r--r--devtools/client/debugger/src/actions/toolbox.js43
-rw-r--r--devtools/client/debugger/src/actions/tracing.js44
-rw-r--r--devtools/client/debugger/src/actions/ui.js282
-rw-r--r--devtools/client/debugger/src/actions/utils/create-store.js75
-rw-r--r--devtools/client/debugger/src/actions/utils/middleware/context.js90
-rw-r--r--devtools/client/debugger/src/actions/utils/middleware/log.js111
-rw-r--r--devtools/client/debugger/src/actions/utils/middleware/moz.build15
-rw-r--r--devtools/client/debugger/src/actions/utils/middleware/promise.js61
-rw-r--r--devtools/client/debugger/src/actions/utils/middleware/thunk.js22
-rw-r--r--devtools/client/debugger/src/actions/utils/middleware/timing.js26
-rw-r--r--devtools/client/debugger/src/actions/utils/middleware/wait-service.js62
-rw-r--r--devtools/client/debugger/src/actions/utils/moz.build12
-rw-r--r--devtools/client/debugger/src/client/README.md47
-rw-r--r--devtools/client/debugger/src/client/firefox.js206
-rw-r--r--devtools/client/debugger/src/client/firefox/commands.js515
-rw-r--r--devtools/client/debugger/src/client/firefox/create.js431
-rw-r--r--devtools/client/debugger/src/client/firefox/moz.build11
-rw-r--r--devtools/client/debugger/src/client/moz.build12
-rw-r--r--devtools/client/debugger/src/components/App.css151
-rw-r--r--devtools/client/debugger/src/components/App.js396
-rw-r--r--devtools/client/debugger/src/components/Editor/BlackboxLines.js139
-rw-r--r--devtools/client/debugger/src/components/Editor/Breakpoint.js157
-rw-r--r--devtools/client/debugger/src/components/Editor/Breakpoints.css153
-rw-r--r--devtools/client/debugger/src/components/Editor/Breakpoints.js78
-rw-r--r--devtools/client/debugger/src/components/Editor/ColumnBreakpoint.js128
-rw-r--r--devtools/client/debugger/src/components/Editor/ColumnBreakpoints.js94
-rw-r--r--devtools/client/debugger/src/components/Editor/ConditionalPanel.css39
-rw-r--r--devtools/client/debugger/src/components/Editor/ConditionalPanel.js280
-rw-r--r--devtools/client/debugger/src/components/Editor/DebugLine.js137
-rw-r--r--devtools/client/debugger/src/components/Editor/Editor.css216
-rw-r--r--devtools/client/debugger/src/components/Editor/EmptyLines.js91
-rw-r--r--devtools/client/debugger/src/components/Editor/Exception.js102
-rw-r--r--devtools/client/debugger/src/components/Editor/Exceptions.js66
-rw-r--r--devtools/client/debugger/src/components/Editor/Footer.css85
-rw-r--r--devtools/client/debugger/src/components/Editor/Footer.js288
-rw-r--r--devtools/client/debugger/src/components/Editor/HighlightLine.js194
-rw-r--r--devtools/client/debugger/src/components/Editor/HighlightLines.js74
-rw-r--r--devtools/client/debugger/src/components/Editor/InlinePreview.css29
-rw-r--r--devtools/client/debugger/src/components/Editor/InlinePreview.js74
-rw-r--r--devtools/client/debugger/src/components/Editor/InlinePreviewRow.js103
-rw-r--r--devtools/client/debugger/src/components/Editor/InlinePreviews.js80
-rw-r--r--devtools/client/debugger/src/components/Editor/Preview.css111
-rw-r--r--devtools/client/debugger/src/components/Editor/Preview/ExceptionPopup.js142
-rw-r--r--devtools/client/debugger/src/components/Editor/Preview/Popup.css174
-rw-r--r--devtools/client/debugger/src/components/Editor/Preview/Popup.js277
-rw-r--r--devtools/client/debugger/src/components/Editor/Preview/index.js128
-rw-r--r--devtools/client/debugger/src/components/Editor/Preview/moz.build12
-rw-r--r--devtools/client/debugger/src/components/Editor/Preview/tests/Popup.spec.js99
-rw-r--r--devtools/client/debugger/src/components/Editor/SearchInFileBar.css32
-rw-r--r--devtools/client/debugger/src/components/Editor/SearchInFileBar.js368
-rw-r--r--devtools/client/debugger/src/components/Editor/Tab.js148
-rw-r--r--devtools/client/debugger/src/components/Editor/Tabs.css127
-rw-r--r--devtools/client/debugger/src/components/Editor/Tabs.js320
-rw-r--r--devtools/client/debugger/src/components/Editor/index.js795
-rw-r--r--devtools/client/debugger/src/components/Editor/moz.build31
-rw-r--r--devtools/client/debugger/src/components/Editor/tests/Breakpoints.spec.js53
-rw-r--r--devtools/client/debugger/src/components/Editor/tests/ConditionalPanel.spec.js77
-rw-r--r--devtools/client/debugger/src/components/Editor/tests/DebugLine.spec.js88
-rw-r--r--devtools/client/debugger/src/components/Editor/tests/Footer.spec.js70
-rw-r--r--devtools/client/debugger/src/components/Editor/tests/__snapshots__/Breakpoints.spec.js.snap32
-rw-r--r--devtools/client/debugger/src/components/Editor/tests/__snapshots__/ConditionalPanel.spec.js.snap747
-rw-r--r--devtools/client/debugger/src/components/Editor/tests/__snapshots__/Footer.spec.js.snap93
-rw-r--r--devtools/client/debugger/src/components/PrimaryPanes/Outline.css158
-rw-r--r--devtools/client/debugger/src/components/PrimaryPanes/Outline.js388
-rw-r--r--devtools/client/debugger/src/components/PrimaryPanes/OutlineFilter.css23
-rw-r--r--devtools/client/debugger/src/components/PrimaryPanes/OutlineFilter.js68
-rw-r--r--devtools/client/debugger/src/components/PrimaryPanes/ProjectSearch.css227
-rw-r--r--devtools/client/debugger/src/components/PrimaryPanes/ProjectSearch.js480
-rw-r--r--devtools/client/debugger/src/components/PrimaryPanes/Sources.css244
-rw-r--r--devtools/client/debugger/src/components/PrimaryPanes/SourcesTree.js352
-rw-r--r--devtools/client/debugger/src/components/PrimaryPanes/SourcesTreeItem.js249
-rw-r--r--devtools/client/debugger/src/components/PrimaryPanes/index.js133
-rw-r--r--devtools/client/debugger/src/components/PrimaryPanes/moz.build15
-rw-r--r--devtools/client/debugger/src/components/QuickOpenModal.css28
-rw-r--r--devtools/client/debugger/src/components/QuickOpenModal.js508
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/Breakpoint.js235
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/BreakpointHeading.js84
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/Breakpoints.css235
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/ExceptionOption.js40
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/index.js172
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/moz.build13
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/tests/ExceptionOption.spec.js22
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/tests/__snapshots__/ExceptionOption.spec.js.snap18
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/CommandBar.css33
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/CommandBar.js502
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/DOMMutationBreakpoints.css76
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/DOMMutationBreakpoints.js189
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/EventListeners.css155
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/EventListeners.js339
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/Expressions.css171
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/Expressions.js486
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/Frames/Frame.js232
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/Frames/FrameIndent.js18
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/Frames/Frames.css185
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/Frames/Group.css38
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/Frames/Group.js191
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/Frames/index.js220
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/Frames/moz.build13
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/Frames/tests/Frame.spec.js110
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/Frames/tests/Frames.spec.js270
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/Frames/tests/Group.spec.js93
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/Frames/tests/__snapshots__/Frame.spec.js.snap1172
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/Frames/tests/__snapshots__/Frames.spec.js.snap1001
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/Frames/tests/__snapshots__/Group.spec.js.snap2286
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/Scopes.css100
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/Scopes.js413
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/SecondaryPanes.css98
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/Thread.js81
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/Threads.css64
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/Threads.js40
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/WhyPaused.css53
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/WhyPaused.js218
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/XHRBreakpoints.css108
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/XHRBreakpoints.js383
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/index.js548
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/moz.build22
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/tests/CommandBar.spec.js78
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/tests/EventListeners.spec.js136
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/tests/Expressions.spec.js77
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/tests/XHRBreakpoints.spec.js341
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/tests/__snapshots__/EventListeners.spec.js.snap408
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/tests/__snapshots__/Expressions.spec.js.snap203
-rw-r--r--devtools/client/debugger/src/components/SecondaryPanes/tests/__snapshots__/XHRBreakpoints.spec.js.snap619
-rw-r--r--devtools/client/debugger/src/components/ShortcutsModal.css47
-rw-r--r--devtools/client/debugger/src/components/ShortcutsModal.js155
-rw-r--r--devtools/client/debugger/src/components/WelcomeBox.css83
-rw-r--r--devtools/client/debugger/src/components/WelcomeBox.js137
-rw-r--r--devtools/client/debugger/src/components/moz.build18
-rw-r--r--devtools/client/debugger/src/components/shared/AccessibleImage.css201
-rw-r--r--devtools/client/debugger/src/components/shared/AccessibleImage.js21
-rw-r--r--devtools/client/debugger/src/components/shared/Accordion.css107
-rw-r--r--devtools/client/debugger/src/components/shared/Accordion.js89
-rw-r--r--devtools/client/debugger/src/components/shared/Badge.css16
-rw-r--r--devtools/client/debugger/src/components/shared/Badge.js30
-rw-r--r--devtools/client/debugger/src/components/shared/BracketArrow.css64
-rw-r--r--devtools/client/debugger/src/components/shared/BracketArrow.js28
-rw-r--r--devtools/client/debugger/src/components/shared/Button/CloseButton.js30
-rw-r--r--devtools/client/debugger/src/components/shared/Button/CommandBarButton.js55
-rw-r--r--devtools/client/debugger/src/components/shared/Button/PaneToggleButton.js58
-rw-r--r--devtools/client/debugger/src/components/shared/Button/index.js9
-rw-r--r--devtools/client/debugger/src/components/shared/Button/moz.build15
-rw-r--r--devtools/client/debugger/src/components/shared/Button/styles/CloseButton.css35
-rw-r--r--devtools/client/debugger/src/components/shared/Button/styles/CommandBarButton.css73
-rw-r--r--devtools/client/debugger/src/components/shared/Button/styles/PaneToggleButton.css29
-rw-r--r--devtools/client/debugger/src/components/shared/Button/styles/moz.build8
-rw-r--r--devtools/client/debugger/src/components/shared/Button/tests/CloseButton.spec.js31
-rw-r--r--devtools/client/debugger/src/components/shared/Button/tests/CommandBarButton.spec.js44
-rw-r--r--devtools/client/debugger/src/components/shared/Button/tests/PaneToggleButton.spec.js51
-rw-r--r--devtools/client/debugger/src/components/shared/Button/tests/__snapshots__/CloseButton.spec.js.snap13
-rw-r--r--devtools/client/debugger/src/components/shared/Button/tests/__snapshots__/CommandBarButton.spec.js.snap18
-rw-r--r--devtools/client/debugger/src/components/shared/Button/tests/__snapshots__/PaneToggleButton.spec.js.snap13
-rw-r--r--devtools/client/debugger/src/components/shared/Dropdown.css97
-rw-r--r--devtools/client/debugger/src/components/shared/Dropdown.js74
-rw-r--r--devtools/client/debugger/src/components/shared/Modal.css47
-rw-r--r--devtools/client/debugger/src/components/shared/Modal.js45
-rw-r--r--devtools/client/debugger/src/components/shared/Popover.css32
-rw-r--r--devtools/client/debugger/src/components/shared/Popover.js324
-rw-r--r--devtools/client/debugger/src/components/shared/PreviewFunction.css23
-rw-r--r--devtools/client/debugger/src/components/shared/PreviewFunction.js108
-rw-r--r--devtools/client/debugger/src/components/shared/ResultList.css131
-rw-r--r--devtools/client/debugger/src/components/shared/ResultList.js102
-rw-r--r--devtools/client/debugger/src/components/shared/SearchInput.css223
-rw-r--r--devtools/client/debugger/src/components/shared/SearchInput.js362
-rw-r--r--devtools/client/debugger/src/components/shared/SmartGap.js170
-rw-r--r--devtools/client/debugger/src/components/shared/SourceIcon.css176
-rw-r--r--devtools/client/debugger/src/components/shared/SourceIcon.js71
-rw-r--r--devtools/client/debugger/src/components/shared/menu.css55
-rw-r--r--devtools/client/debugger/src/components/shared/moz.build23
-rw-r--r--devtools/client/debugger/src/components/shared/tests/Accordion.spec.js47
-rw-r--r--devtools/client/debugger/src/components/shared/tests/Badge.spec.js19
-rw-r--r--devtools/client/debugger/src/components/shared/tests/BracketArrow.spec.js24
-rw-r--r--devtools/client/debugger/src/components/shared/tests/Dropdown.spec.js21
-rw-r--r--devtools/client/debugger/src/components/shared/tests/Modal.spec.js56
-rw-r--r--devtools/client/debugger/src/components/shared/tests/Popover.spec.js212
-rw-r--r--devtools/client/debugger/src/components/shared/tests/PreviewFunction.spec.js130
-rw-r--r--devtools/client/debugger/src/components/shared/tests/ResultList.spec.js48
-rw-r--r--devtools/client/debugger/src/components/shared/tests/SearchInput.spec.js126
-rw-r--r--devtools/client/debugger/src/components/shared/tests/__snapshots__/Accordion.spec.js.snap81
-rw-r--r--devtools/client/debugger/src/components/shared/tests/__snapshots__/Badge.spec.js.snap9
-rw-r--r--devtools/client/debugger/src/components/shared/tests/__snapshots__/BracketArrow.spec.js.snap27
-rw-r--r--devtools/client/debugger/src/components/shared/tests/__snapshots__/Dropdown.spec.js.snap34
-rw-r--r--devtools/client/debugger/src/components/shared/tests/__snapshots__/Modal.spec.js.snap13
-rw-r--r--devtools/client/debugger/src/components/shared/tests/__snapshots__/Popover.spec.js.snap549
-rw-r--r--devtools/client/debugger/src/components/shared/tests/__snapshots__/PreviewFunction.spec.js.snap23
-rw-r--r--devtools/client/debugger/src/components/shared/tests/__snapshots__/ResultList.spec.js.snap55
-rw-r--r--devtools/client/debugger/src/components/shared/tests/__snapshots__/SearchInput.spec.js.snap267
-rw-r--r--devtools/client/debugger/src/components/test/QuickOpenModal.spec.js803
-rw-r--r--devtools/client/debugger/src/components/test/WelcomeBox.spec.js58
-rw-r--r--devtools/client/debugger/src/components/test/WhyPaused.spec.js61
-rw-r--r--devtools/client/debugger/src/components/test/__snapshots__/QuickOpenModal.spec.js.snap1777
-rw-r--r--devtools/client/debugger/src/components/test/__snapshots__/WelcomeBox.spec.js.snap67
-rw-r--r--devtools/client/debugger/src/components/test/__snapshots__/WhyPaused.spec.js.snap103
-rw-r--r--devtools/client/debugger/src/components/variables.css45
-rw-r--r--devtools/client/debugger/src/constants.js15
-rw-r--r--devtools/client/debugger/src/context-menu/menu.js43
-rw-r--r--devtools/client/debugger/src/context-menu/moz.build8
-rw-r--r--devtools/client/debugger/src/debugger.css57
-rw-r--r--devtools/client/debugger/src/main.js149
-rw-r--r--devtools/client/debugger/src/moz.build20
-rw-r--r--devtools/client/debugger/src/reducers/ast.js92
-rw-r--r--devtools/client/debugger/src/reducers/breakpoints.js149
-rw-r--r--devtools/client/debugger/src/reducers/event-listeners.js38
-rw-r--r--devtools/client/debugger/src/reducers/exceptions.js78
-rw-r--r--devtools/client/debugger/src/reducers/expressions.js124
-rw-r--r--devtools/client/debugger/src/reducers/index.js76
-rw-r--r--devtools/client/debugger/src/reducers/moz.build26
-rw-r--r--devtools/client/debugger/src/reducers/pause.js427
-rw-r--r--devtools/client/debugger/src/reducers/pending-breakpoints.js135
-rw-r--r--devtools/client/debugger/src/reducers/quick-open.js41
-rw-r--r--devtools/client/debugger/src/reducers/source-actors.js109
-rw-r--r--devtools/client/debugger/src/reducers/source-blackbox.js145
-rw-r--r--devtools/client/debugger/src/reducers/sources-content.js139
-rw-r--r--devtools/client/debugger/src/reducers/sources-tree.js704
-rw-r--r--devtools/client/debugger/src/reducers/sources.js395
-rw-r--r--devtools/client/debugger/src/reducers/tabs.js200
-rw-r--r--devtools/client/debugger/src/reducers/tests/breakpoints.spec.js73
-rw-r--r--devtools/client/debugger/src/reducers/tests/quick-open.spec.js59
-rw-r--r--devtools/client/debugger/src/reducers/tests/ui.spec.js30
-rw-r--r--devtools/client/debugger/src/reducers/threads.js69
-rw-r--r--devtools/client/debugger/src/reducers/ui.js253
-rw-r--r--devtools/client/debugger/src/selectors/ast.js32
-rw-r--r--devtools/client/debugger/src/selectors/breakpointAtLocation.js120
-rw-r--r--devtools/client/debugger/src/selectors/breakpointSources.js52
-rw-r--r--devtools/client/debugger/src/selectors/breakpoints.js84
-rw-r--r--devtools/client/debugger/src/selectors/event-listeners.js19
-rw-r--r--devtools/client/debugger/src/selectors/exceptions.js58
-rw-r--r--devtools/client/debugger/src/selectors/expressions.js29
-rw-r--r--devtools/client/debugger/src/selectors/index.js48
-rw-r--r--devtools/client/debugger/src/selectors/isLineInScope.js22
-rw-r--r--devtools/client/debugger/src/selectors/isSelectedFrameVisible.js37
-rw-r--r--devtools/client/debugger/src/selectors/moz.build32
-rw-r--r--devtools/client/debugger/src/selectors/pause.js293
-rw-r--r--devtools/client/debugger/src/selectors/pending-breakpoints.js20
-rw-r--r--devtools/client/debugger/src/selectors/quick-open.js15
-rw-r--r--devtools/client/debugger/src/selectors/source-actors.js119
-rw-r--r--devtools/client/debugger/src/selectors/source-blackbox.js26
-rw-r--r--devtools/client/debugger/src/selectors/sources-content.js48
-rw-r--r--devtools/client/debugger/src/selectors/sources-tree.js151
-rw-r--r--devtools/client/debugger/src/selectors/sources.js410
-rw-r--r--devtools/client/debugger/src/selectors/tabs.js89
-rw-r--r--devtools/client/debugger/src/selectors/test/__snapshots__/visibleColumnBreakpoints.spec.js.snap269
-rw-r--r--devtools/client/debugger/src/selectors/test/visibleColumnBreakpoints.spec.js145
-rw-r--r--devtools/client/debugger/src/selectors/threads.js56
-rw-r--r--devtools/client/debugger/src/selectors/ui.js117
-rw-r--r--devtools/client/debugger/src/selectors/visibleBreakpoints.js55
-rw-r--r--devtools/client/debugger/src/selectors/visibleColumnBreakpoints.js149
-rw-r--r--devtools/client/debugger/src/test/__mocks__/request-animation-frame.js8
-rw-r--r--devtools/client/debugger/src/test/fixtures/README.md3
-rw-r--r--devtools/client/debugger/src/test/fixtures/foobar.json56
-rw-r--r--devtools/client/debugger/src/test/fixtures/index.js3
-rw-r--r--devtools/client/debugger/src/test/shim.js31
-rw-r--r--devtools/client/debugger/src/test/tests-setup.js61
-rw-r--r--devtools/client/debugger/src/utils/DevToolsUtils.js16
-rw-r--r--devtools/client/debugger/src/utils/assert.js22
-rw-r--r--devtools/client/debugger/src/utils/ast.js64
-rw-r--r--devtools/client/debugger/src/utils/async-value.js27
-rw-r--r--devtools/client/debugger/src/utils/bootstrap.js142
-rw-r--r--devtools/client/debugger/src/utils/breakpoint/breakpointPositions.js20
-rw-r--r--devtools/client/debugger/src/utils/breakpoint/index.js71
-rw-r--r--devtools/client/debugger/src/utils/breakpoint/moz.build11
-rw-r--r--devtools/client/debugger/src/utils/breakpoint/tests/index.spec.js28
-rw-r--r--devtools/client/debugger/src/utils/build-query.js80
-rw-r--r--devtools/client/debugger/src/utils/clipboard.js19
-rw-r--r--devtools/client/debugger/src/utils/context.js143
-rw-r--r--devtools/client/debugger/src/utils/dbg.js100
-rw-r--r--devtools/client/debugger/src/utils/editor/create-editor.js44
-rw-r--r--devtools/client/debugger/src/utils/editor/get-expression.js54
-rw-r--r--devtools/client/debugger/src/utils/editor/index.js222
-rw-r--r--devtools/client/debugger/src/utils/editor/moz.build15
-rw-r--r--devtools/client/debugger/src/utils/editor/source-documents.js256
-rw-r--r--devtools/client/debugger/src/utils/editor/source-editor.css271
-rw-r--r--devtools/client/debugger/src/utils/editor/source-search.js327
-rw-r--r--devtools/client/debugger/src/utils/editor/tests/__snapshots__/create-editor.spec.js.snapbin0 -> 3275 bytes
-rw-r--r--devtools/client/debugger/src/utils/editor/tests/create-editor.spec.js22
-rw-r--r--devtools/client/debugger/src/utils/editor/tests/editor.spec.js186
-rw-r--r--devtools/client/debugger/src/utils/editor/tests/source-documents.spec.js213
-rw-r--r--devtools/client/debugger/src/utils/editor/tests/source-search.spec.js182
-rw-r--r--devtools/client/debugger/src/utils/editor/tokens.js178
-rw-r--r--devtools/client/debugger/src/utils/environment.js15
-rw-r--r--devtools/client/debugger/src/utils/evaluation-result.js19
-rw-r--r--devtools/client/debugger/src/utils/expressions.js67
-rw-r--r--devtools/client/debugger/src/utils/function.js37
-rw-r--r--devtools/client/debugger/src/utils/indentation.js40
-rw-r--r--devtools/client/debugger/src/utils/isMinified.js58
-rw-r--r--devtools/client/debugger/src/utils/location.js124
-rw-r--r--devtools/client/debugger/src/utils/log.js30
-rw-r--r--devtools/client/debugger/src/utils/memoizableAction.js75
-rw-r--r--devtools/client/debugger/src/utils/memoize.js63
-rw-r--r--devtools/client/debugger/src/utils/memoizeLast.js27
-rw-r--r--devtools/client/debugger/src/utils/moz.build53
-rw-r--r--devtools/client/debugger/src/utils/path.js24
-rw-r--r--devtools/client/debugger/src/utils/pause/frames/annotateFrames.js68
-rw-r--r--devtools/client/debugger/src/utils/pause/frames/collapseFrames.js58
-rw-r--r--devtools/client/debugger/src/utils/pause/frames/displayName.js114
-rw-r--r--devtools/client/debugger/src/utils/pause/frames/getLibraryFromUrl.js140
-rw-r--r--devtools/client/debugger/src/utils/pause/frames/index.js8
-rw-r--r--devtools/client/debugger/src/utils/pause/frames/moz.build14
-rw-r--r--devtools/client/debugger/src/utils/pause/frames/tests/__snapshots__/collapseFrames.spec.js.snap87
-rw-r--r--devtools/client/debugger/src/utils/pause/frames/tests/collapseFrames.spec.js43
-rw-r--r--devtools/client/debugger/src/utils/pause/frames/tests/displayName.spec.js129
-rw-r--r--devtools/client/debugger/src/utils/pause/frames/tests/getLibraryFromUrl.spec.js127
-rw-r--r--devtools/client/debugger/src/utils/pause/index.js5
-rw-r--r--devtools/client/debugger/src/utils/pause/mapScopes/README.md191
-rw-r--r--devtools/client/debugger/src/utils/pause/mapScopes/buildGeneratedBindingList.js141
-rw-r--r--devtools/client/debugger/src/utils/pause/mapScopes/filtering.js45
-rw-r--r--devtools/client/debugger/src/utils/pause/mapScopes/findGeneratedBindingFromPosition.js305
-rw-r--r--devtools/client/debugger/src/utils/pause/mapScopes/getApplicableBindingsForOriginalPosition.js112
-rw-r--r--devtools/client/debugger/src/utils/pause/mapScopes/index.js586
-rw-r--r--devtools/client/debugger/src/utils/pause/mapScopes/locColumn.js13
-rw-r--r--devtools/client/debugger/src/utils/pause/mapScopes/mappingContains.js12
-rw-r--r--devtools/client/debugger/src/utils/pause/mapScopes/moz.build19
-rw-r--r--devtools/client/debugger/src/utils/pause/mapScopes/optimizedOut.js15
-rw-r--r--devtools/client/debugger/src/utils/pause/mapScopes/positionCmp.js24
-rw-r--r--devtools/client/debugger/src/utils/pause/mapScopes/rangeMetadata.js117
-rw-r--r--devtools/client/debugger/src/utils/pause/moz.build15
-rw-r--r--devtools/client/debugger/src/utils/pause/scopes.js283
-rw-r--r--devtools/client/debugger/src/utils/pause/tests/scopes.spec.js150
-rw-r--r--devtools/client/debugger/src/utils/pause/why.js40
-rw-r--r--devtools/client/debugger/src/utils/prefs.js170
-rw-r--r--devtools/client/debugger/src/utils/preview.js7
-rw-r--r--devtools/client/debugger/src/utils/quick-open.js113
-rw-r--r--devtools/client/debugger/src/utils/result-list.js26
-rw-r--r--devtools/client/debugger/src/utils/selected-location.js15
-rw-r--r--devtools/client/debugger/src/utils/shallow-equal.js51
-rw-r--r--devtools/client/debugger/src/utils/source-maps.js122
-rw-r--r--devtools/client/debugger/src/utils/source-queue.js40
-rw-r--r--devtools/client/debugger/src/utils/source.js534
-rw-r--r--devtools/client/debugger/src/utils/sources-tree/getURL.js180
-rw-r--r--devtools/client/debugger/src/utils/sources-tree/moz.build9
-rw-r--r--devtools/client/debugger/src/utils/sources-tree/tests/getUrl.spec.js50
-rw-r--r--devtools/client/debugger/src/utils/sources-tree/utils.js44
-rw-r--r--devtools/client/debugger/src/utils/tabs.js121
-rw-r--r--devtools/client/debugger/src/utils/task.js44
-rw-r--r--devtools/client/debugger/src/utils/telemetry.js72
-rw-r--r--devtools/client/debugger/src/utils/test-head.js283
-rw-r--r--devtools/client/debugger/src/utils/test-mockup.js268
-rw-r--r--devtools/client/debugger/src/utils/tests/DevToolsUtils.spec.js41
-rw-r--r--devtools/client/debugger/src/utils/tests/__snapshots__/expressions.spec.js.snap25
-rw-r--r--devtools/client/debugger/src/utils/tests/__snapshots__/function.spec.js.snap25
-rw-r--r--devtools/client/debugger/src/utils/tests/__snapshots__/indentation.spec.js.snap27
-rw-r--r--devtools/client/debugger/src/utils/tests/assert.spec.js30
-rw-r--r--devtools/client/debugger/src/utils/tests/build-query.spec.js256
-rw-r--r--devtools/client/debugger/src/utils/tests/clipboard.spec.js45
-rw-r--r--devtools/client/debugger/src/utils/tests/expressions.spec.js67
-rw-r--r--devtools/client/debugger/src/utils/tests/function.spec.js61
-rw-r--r--devtools/client/debugger/src/utils/tests/indentation.spec.js61
-rw-r--r--devtools/client/debugger/src/utils/tests/isMinified.spec.js18
-rw-r--r--devtools/client/debugger/src/utils/tests/location.spec.js31
-rw-r--r--devtools/client/debugger/src/utils/tests/log.spec.js35
-rw-r--r--devtools/client/debugger/src/utils/tests/memoize.spec.js48
-rw-r--r--devtools/client/debugger/src/utils/tests/memoizeLast.spec.js31
-rw-r--r--devtools/client/debugger/src/utils/tests/path.spec.js49
-rw-r--r--devtools/client/debugger/src/utils/tests/quick-open.spec.js35
-rw-r--r--devtools/client/debugger/src/utils/tests/result-list.spec.js32
-rw-r--r--devtools/client/debugger/src/utils/tests/source.spec.js367
-rw-r--r--devtools/client/debugger/src/utils/tests/telemetry.spec.js13
-rw-r--r--devtools/client/debugger/src/utils/tests/text.spec.js20
-rw-r--r--devtools/client/debugger/src/utils/tests/ui.spec.js15
-rw-r--r--devtools/client/debugger/src/utils/tests/url.spec.js89
-rw-r--r--devtools/client/debugger/src/utils/tests/utils.spec.js87
-rw-r--r--devtools/client/debugger/src/utils/tests/wasm.spec.js96
-rw-r--r--devtools/client/debugger/src/utils/text.js58
-rw-r--r--devtools/client/debugger/src/utils/ui.js48
-rw-r--r--devtools/client/debugger/src/utils/url.js75
-rw-r--r--devtools/client/debugger/src/utils/utils.js59
-rw-r--r--devtools/client/debugger/src/utils/wasm.js166
-rw-r--r--devtools/client/debugger/src/utils/worker.js49
-rw-r--r--devtools/client/debugger/src/workers/moz.build12
-rw-r--r--devtools/client/debugger/src/workers/parser/findBestMatchExpression.js37
-rw-r--r--devtools/client/debugger/src/workers/parser/findOutOfScopeLocations.js132
-rw-r--r--devtools/client/debugger/src/workers/parser/frameworks.js60
-rw-r--r--devtools/client/debugger/src/workers/parser/getScopes/index.js65
-rw-r--r--devtools/client/debugger/src/workers/parser/getScopes/visitor.js909
-rw-r--r--devtools/client/debugger/src/workers/parser/getSymbols.js567
-rw-r--r--devtools/client/debugger/src/workers/parser/index.js55
-rw-r--r--devtools/client/debugger/src/workers/parser/mapAwaitExpression.js208
-rw-r--r--devtools/client/debugger/src/workers/parser/mapBindings.js120
-rw-r--r--devtools/client/debugger/src/workers/parser/mapExpression.js50
-rw-r--r--devtools/client/debugger/src/workers/parser/mapOriginalExpression.js106
-rw-r--r--devtools/client/debugger/src/workers/parser/moz.build10
-rw-r--r--devtools/client/debugger/src/workers/parser/sources.js24
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/__snapshots__/findOutOfScopeLocations.spec.js.snap47
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/__snapshots__/getScopes.spec.js.snap18895
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/__snapshots__/getSymbols.spec.js.snap169
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/__snapshots__/validate.spec.js.snap3
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/contains.spec.js250
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/findOutOfScopeLocations.spec.js80
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/allSymbols.js33
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/async.js10
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/call-sites.js4
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/callExpressions.js7
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/calls.js21
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/class.js28
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/component.js84
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/computed-props.js8
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/control-flow.js39
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/decorators.js2
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/destructuring.js16
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/es6.js1
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/expression.js25
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/flow.js5
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/angular1FalsePositive.js11
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/angular1Module.js4
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/plainJavascript.js8
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/reactComponent.js3
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/reactComponentEs5.js3
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/reactLibrary.js19
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/reduxLibrary.js39
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/vueFileComponent.js3
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/vueFileDeclarative.js6
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/func.js50
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/functionNames.js50
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/generators.js4
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/jsx.js5
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/math.js15
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/modules.js10
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/object-expressions.js6
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/optional-chaining.js3
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/outOfScope.js62
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/outOfScopeComment.js4
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/parseScriptTags.html42
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/private-fields.js24
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/proto.js14
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/regexp.js1
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/resolveToken.js40
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/arrow-function.js11
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/binding-types.js24
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/block-statement.js13
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/class-declaration.js14
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/class-expression.js11
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/class-property.js10
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/complex-nesting.js29
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/expressions.js6
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/flowtype-bindings.js11
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/fn-body-lex-and-nonlex.js23
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/for-loops.js13
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/function-declaration.js11
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/function-expression.js7
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/jsx-component.js6
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/out-of-order-declarations.js21
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/pattern-declarations.js2
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/simple-module.js11
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/switch-statement.js22
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/try-catch.js9
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/ts-sample.ts41
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/tsx-sample.tsx41
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/vue-sample.vue26
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/statements.js40
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/thisExpression.js11
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/fixtures/var.js21
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/framework.spec.js63
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/getScopes.spec.js227
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/getSymbols.spec.js51
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/helpers/index.js86
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/mapBindings.spec.js161
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/mapExpression.spec.js796
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/mapOriginalExpression.spec.js93
-rw-r--r--devtools/client/debugger/src/workers/parser/tests/sources.spec.js14
-rw-r--r--devtools/client/debugger/src/workers/parser/utils/ast.js230
-rw-r--r--devtools/client/debugger/src/workers/parser/utils/contains.js29
-rw-r--r--devtools/client/debugger/src/workers/parser/utils/formatSymbols.js65
-rw-r--r--devtools/client/debugger/src/workers/parser/utils/getFunctionName.js96
-rw-r--r--devtools/client/debugger/src/workers/parser/utils/helpers.js232
-rw-r--r--devtools/client/debugger/src/workers/parser/utils/inferClassName.js93
-rw-r--r--devtools/client/debugger/src/workers/parser/utils/parse-script-tags/customParse.js132
-rw-r--r--devtools/client/debugger/src/workers/parser/utils/parse-script-tags/index.js60
-rw-r--r--devtools/client/debugger/src/workers/parser/utils/parse-script-tags/parseScriptFragment.js155
-rw-r--r--devtools/client/debugger/src/workers/parser/utils/simple-path.js104
-rw-r--r--devtools/client/debugger/src/workers/parser/utils/tests/ast.spec.js41
-rw-r--r--devtools/client/debugger/src/workers/parser/worker.js39
-rw-r--r--devtools/client/debugger/src/workers/pretty-print/LICENSE.md23
-rw-r--r--devtools/client/debugger/src/workers/pretty-print/index.js30
-rw-r--r--devtools/client/debugger/src/workers/pretty-print/moz.build10
-rw-r--r--devtools/client/debugger/src/workers/pretty-print/pretty-fast.js1178
-rw-r--r--devtools/client/debugger/src/workers/pretty-print/tests/__snapshots__/prettyFast.spec.js.snap1974
-rw-r--r--devtools/client/debugger/src/workers/pretty-print/tests/prettyFast.spec.js435
-rw-r--r--devtools/client/debugger/src/workers/pretty-print/worker.js98
-rw-r--r--devtools/client/debugger/src/workers/search/get-matches.js45
-rw-r--r--devtools/client/debugger/src/workers/search/index.js17
-rw-r--r--devtools/client/debugger/src/workers/search/moz.build10
-rw-r--r--devtools/client/debugger/src/workers/search/project-search.js70
-rw-r--r--devtools/client/debugger/src/workers/search/tests/get-matches.spec.js99
-rw-r--r--devtools/client/debugger/src/workers/search/worker.js9
-rw-r--r--devtools/client/debugger/test/mochitest/browser_aj.toml300
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-async-stepping.js23
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-asyncstacks.js21
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-audiocontext.js20
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-backgroundtask-debugging.js161
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-bfcache.js98
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-blackbox-all.js215
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-blackbox-original.js53
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-blackbox.js732
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-breaking-from-console.js38
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-breaking.js55
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-breakpoint-skipping-console.js20
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-breakpoint-skipping.js87
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-actions.js84
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-columns.js131
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-cond-functional.js79
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-cond-shortcut.js147
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-cond-source-maps.js45
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-cond-ui-state.js138
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-debugger-statement.js94
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-duplicate-functions.js38
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-in-evaled-sources.js92
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-list.js189
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-popup.js250
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-reloading-with-source-changes.js186
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-reloading.js124
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-same-file-per-target.js114
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-scroll-to-log.js61
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-sourcemap-with-sections.js27
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-breakpoints.js102
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-browser-toolbox-unselected-pause.js67
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-browser-toolbox-workers.js55
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-call-stack.js124
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-chrome-create.js65
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-console-async.js50
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-console-eval.js37
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-console-link.js29
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-console-map-bindings.js47
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-console.js28
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-content-script-sources.js52
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-continue-to-here-click.js48
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-continue-to-here.js58
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-custom-formatters.js154
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-debug-line.js46
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-debugger-buttons.js124
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-dom-mutation-breakpoints-fission.js110
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-dom-mutation-breakpoints.js171
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-eager-eval-skip-pause.js19
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-editor-exception.js26
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-editor-gutter.js144
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-editor-highlight.js50
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-editor-mode.js18
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-editor-scroll.js52
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-editor-select.js100
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-ember-original-variable-mapping-notifications.js78
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-es-module-worker.js75
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-eval-throw.js18
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-event-breakpoints-fission.js81
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-event-breakpoints.js317
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-event-handler.js18
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-expressions-error.js33
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-expressions-focus.js50
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-expressions-thread.js100
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-expressions-watch.js91
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-expressions.js104
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-extension-inspectedWindow-debugger-statement.js88
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-features-asm.js92
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-features-breakable-lines.js92
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-features-breakable-positions.js284
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-features-breakpoints.js73
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-features-browser-toolbox-source-tree.js122
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-features-source-text-content.js581
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-features-source-tree.js554
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-features-tabs.js92
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-features-wasm.js164
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-fission-frame-breakpoint.js101
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-fission-frame-pause-exceptions.js54
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-fission-frame-sources.js47
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-fission-project-search.js52
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-fission-switch-target.js32
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-gc-breakpoint-positions.js17
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-gc-sources.js29
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-go-to-line.js64
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-html-breakpoints.js54
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-idb-run-to-completion.js15
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-iframes.js60
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-inline-cache.js146
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-inline-exceptions-inline-script.js34
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-inline-exceptions-position.js42
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-inline-exceptions.js38
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-inline-preview.js117
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-inline-script-offset.js40
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-inspector-integration.js147
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-integration-reloading-compressed-sourcemaps.js23
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-integration-reloading-uncompressed-sourcemaps.js23
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-function-returns.js106
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-next-interation.js181
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-next-load.js131
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-values.js48
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-worker.js63
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer.js323
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-keyboard-navigation.js41
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-keyboard-shortcuts-modal.js49
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-keyboard-shortcuts.js58
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-layout-changes.js94
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-link-reload.js65
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-log-events.js25
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-log-point-mapping.js43
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-log-points-workers.js30
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-log-points.js93
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-many-breakpoints-same-line.js93
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-merge-scopes.js51
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-message-run-to-completion.js24
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-minified.js25
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-navigation-when-paused.js42
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-navigation.js73
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-no-duplicate-breakpoints-on-frame-reload.js101
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-old-breakpoint.js111
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-outline-filter.js82
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-outline-focus.js82
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-outline-pretty.js30
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-outline.js93
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-overrides.js130
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-pause-exceptions.js139
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-pause-on-next.js21
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-pause-on-unload.js87
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-pause-points.js97
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-pause-ux.js52
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-paused-overlay-iframe.js76
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-paused-overlay-loading.js48
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-paused-overlay.js73
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-breakpoints-columns.js119
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-breakpoints-delete.js113
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-breakpoints.js126
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-console.js66
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-flow.js78
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-inline-scripts.js256
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-paused-anonymous.js148
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-paused.js35
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-sourcemap.js164
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-pretty-print.js142
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-preview-frame.js68
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-preview-getter.js64
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-preview-module.js36
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-preview-source-maps.js38
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-preview-wrapped-lines.js154
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-preview.js333
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-project-root.js119
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-project-search.js306
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-quick-open.js172
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-react-app.js38
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-react-jsx.js20
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-reducer-cleanup-on-target-removal.js180
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-reloading.js39
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-remember-expanded-scopes.js41
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-restart-frame.js34
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-returnvalues.js106
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-scopes-duplicated.js196
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-scopes-mutations.js85
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-scopes-xrays.js67
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-scopes.js57
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-scroll-run-to-completion.js25
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-search-file-paused.js71
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-search-file-retains-query.js40
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-search-file.js131
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-settings-disable-javascript.js49
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-slow-script.js91
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-source-pragma.js26
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-sourceURL-breakpoint.js18
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-sourcemapped-breakpoint-console.js86
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-sourcemapped-preview.js206
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-sourcemapped-scopes.js1646
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-sourcemapped-stepping.js158
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-sourcemapped-toggle.js73
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-bogus.js91
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-breakpoints.js35
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-disabled.js23
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-ignorelist.js75
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-indexed.js51
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-redirect.js54
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-reloading-quickly.js28
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-reloading.js61
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps.js147
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps2.js60
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps3.js94
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-sources-project-search.js134
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-state-based-panels.js164
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-step-in-navigate.js34
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-step-in-uninitialized.js47
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-stepping.js48
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-tabs-keyboard.js29
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-tabs-pretty-print.js46
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-tabs-without-urls-selected.js28
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-tabs-without-urls.js46
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-tabs.js107
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-toggling-tools.js19
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-ua-widgets.js47
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-unselected-pause.js203
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-watchpoints.js118
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-windowless-service-workers-reload.js65
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-windowless-service-workers.js179
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-windowless-workers-early-breakpoint.js40
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-windowless-workers.js170
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-worker-exception.js26
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-worker-module.js19
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-worker-nested.js15
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-worker-scopes.js102
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-wrong-fetch.js27
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-xhr-breakpoints.js236
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg-xhr-run-to-completion.js54
-rw-r--r--devtools/client/debugger/test/mochitest/browser_kz.toml337
-rw-r--r--devtools/client/debugger/test/mochitest/examples/README.md14
-rw-r--r--devtools/client/debugger/test/mochitest/examples/asm.js10
-rw-r--r--devtools/client/debugger/test/mochitest/examples/async.js10
-rw-r--r--devtools/client/debugger/test/mochitest/examples/big-sourcemap.html40
-rw-r--r--devtools/client/debugger/test/mochitest/examples/big-sourcemap_files/bundle.js53505
-rw-r--r--devtools/client/debugger/test/mochitest/examples/big-sourcemap_files/bundle.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/collected-bundle.js76
-rw-r--r--devtools/client/debugger/test/mochitest/examples/collected-bundle2.js75
-rw-r--r--devtools/client/debugger/test/mochitest/examples/collected-bundle2.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/collected-bundle2.js^headers^1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/different_html.sjs31
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-all-workers.html32
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-asm.html20
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-async.html16
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-audiocontext.html49
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-bfcache1.html7
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-bfcache2.html6
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-blackbox-all.html15
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-command-click.html12
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-content-script-sources.html13
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-debugger-statements.html31
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-dom-mutation.html21
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-duplicate-functions.html27
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-early-xhr.html16
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-editor-scroll.html17
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-eval-throw.html9
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-event-breakpoints-fission.html23
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-event-breakpoints.html31
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-event-handler.html10
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-exception-position.html13
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-exceptions-inline-script.html10
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-exceptions.html10
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-frames-async.html21
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-frames.html21
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-gc-breakpoint-positions.html23
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-gc-sources.html26
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-html-breakpoints.html25
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-idb-run-to-completion.html30
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-iframes.html20
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-inline-preview.html25
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-inline-script-offset.html15
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-merge-scopes.html29
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-message-run-to-completion-frame.html1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-message-run-to-completion.html19
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-minified.html20
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-minified2.html21
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-module-worker.html10
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-navigation-when-paused.html17
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-nested-worker.html11
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-on-load.html21
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-pause-points.html16
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-pretty-print-inline-scripts.html44
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-pretty.html14
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-preview-getter.html11
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-preview.html27
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-react-jsx.html111
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-react.html10
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-reload-link.html5
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-remember-expanded-scopes.html7
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-return-values.html50
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-scopes-xrays.html11
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-script-mutate.html18
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-script-switching.html19
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-scripts-debugger.html20
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-scripts.html35
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-scroll-run-to-completion.html27
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-service-workers.html33
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-slow-script.html18
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-source-pragma.html7
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-sourceURL-breakpoint.html9
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-sourcemap-bogus.html16
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-sourcemapped.html574
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-sourcemaps-ignorelist.html14
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-sourcemaps-indexed.html21
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-sourcemaps.html15
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-sourcemaps2.html21
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-sourcemaps3.html16
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-sources.html25
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-step-in-uninitialized.html11
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-strict.html21
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-wasm-sourcemaps.html23
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-watchpoints.html31
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-windowless-workers-early-breakpoint.html19
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-windowless-workers.html25
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-worker-exception.html10
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-worker-scopes.html15
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-xhr-run-to-completion.html41
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc-xhr.html14
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc_dbg-custom-formatters.html31
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc_dbg-fission-frame-pause-exceptions.html20
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc_dbg-fission-frame-sources-frame.html12
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc_dbg-fission-frame-sources.html13
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc_dbg-fission-pause-exceptions.html13
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc_dbg-same-source-distinct-threads-frame.html13
-rw-r--r--devtools/client/debugger/test/mochitest/examples/doc_dbg-same-source-distinct-threads.html21
-rw-r--r--devtools/client/debugger/test/mochitest/examples/dom-mutation.js26
-rw-r--r--devtools/client/debugger/test/mochitest/examples/dom-mutation.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/ember/quickstart/.editorconfig20
-rw-r--r--devtools/client/debugger/test/mochitest/examples/ember/quickstart/.ember-cli9
-rw-r--r--devtools/client/debugger/test/mochitest/examples/ember/quickstart/.eslintrc.js38
-rw-r--r--devtools/client/debugger/test/mochitest/examples/ember/quickstart/.gitignore23
-rw-r--r--devtools/client/debugger/test/mochitest/examples/ember/quickstart/.travis.yml26
-rw-r--r--devtools/client/debugger/test/mochitest/examples/ember/quickstart/.watchmanconfig3
-rw-r--r--devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/quickstart.css0
-rw-r--r--devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/quickstart.js277
-rw-r--r--devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/quickstart.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/test-support.css471
-rw-r--r--devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/test-support.js12050
-rw-r--r--devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/test-support.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/tests.js62
-rw-r--r--devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/tests.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/vendor.css97
-rw-r--r--devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/vendor.js86407
-rw-r--r--devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/vendor.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/index.html26
-rw-r--r--devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/robots.txt3
-rw-r--r--devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/testem.js19
-rw-r--r--devtools/client/debugger/test/mochitest/examples/entry.js16
-rw-r--r--devtools/client/debugger/test/mochitest/examples/event-breakpoints.js94
-rw-r--r--devtools/client/debugger/test/mochitest/examples/exception-position-1.js4
-rw-r--r--devtools/client/debugger/test/mochitest/examples/exception-position-2.js2
-rw-r--r--devtools/client/debugger/test/mochitest/examples/exception-position-3.js2
-rw-r--r--devtools/client/debugger/test/mochitest/examples/exception-position-4.js2
-rw-r--r--devtools/client/debugger/test/mochitest/examples/exceptions.js88
-rw-r--r--devtools/client/debugger/test/mochitest/examples/fetch.js5
-rw-r--r--devtools/client/debugger/test/mochitest/examples/frames.js24
-rw-r--r--devtools/client/debugger/test/mochitest/examples/html-breakpoints-slow.js3
-rw-r--r--devtools/client/debugger/test/mochitest/examples/inline-preview.js60
-rw-r--r--devtools/client/debugger/test/mochitest/examples/inner-worker.js8
-rw-r--r--devtools/client/debugger/test/mochitest/examples/invalid-json-map.js3
-rw-r--r--devtools/client/debugger/test/mochitest/examples/long.js76
-rw-r--r--devtools/client/debugger/test/mochitest/examples/map-with-failed-original-request.js26
-rw-r--r--devtools/client/debugger/test/mochitest/examples/map-with-failed-original-request.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/map-with-json-error.map3
-rw-r--r--devtools/client/debugger/test/mochitest/examples/math.min.js3
-rw-r--r--devtools/client/debugger/test/mochitest/examples/nested/nested-source.js3
-rw-r--r--devtools/client/debugger/test/mochitest/examples/non-existant-map.js8
-rw-r--r--devtools/client/debugger/test/mochitest/examples/opts.js3
-rw-r--r--devtools/client/debugger/test/mochitest/examples/outer-worker.js8
-rw-r--r--devtools/client/debugger/test/mochitest/examples/output.js5
-rw-r--r--devtools/client/debugger/test/mochitest/examples/pause-points.js43
-rw-r--r--devtools/client/debugger/test/mochitest/examples/pretty.js10
-rw-r--r--devtools/client/debugger/test/mochitest/examples/preview-getter.js15
-rw-r--r--devtools/client/debugger/test/mochitest/examples/preview.js86
-rw-r--r--devtools/client/debugger/test/mochitest/examples/react/.gitignore20
-rw-r--r--devtools/client/debugger/test/mochitest/examples/react/README.md4
-rw-r--r--devtools/client/debugger/test/mochitest/examples/react/build/asset-manifest.json4
-rw-r--r--devtools/client/debugger/test/mochitest/examples/react/build/index.html1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/react/build/main.js6762
-rw-r--r--devtools/client/debugger/test/mochitest/examples/react/build/main.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/react/build/service-worker.js1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/react/config-overrides.js16
-rw-r--r--devtools/client/debugger/test/mochitest/examples/react/package.json21
-rw-r--r--devtools/client/debugger/test/mochitest/examples/react/public/index.html25
-rw-r--r--devtools/client/debugger/test/mochitest/examples/react/src/App.js25
-rw-r--r--devtools/client/debugger/test/mochitest/examples/react/src/index.js5
-rw-r--r--devtools/client/debugger/test/mochitest/examples/react/yarn.lock7090
-rw-r--r--devtools/client/debugger/test/mochitest/examples/reload/code_reload_1.js3
-rw-r--r--devtools/client/debugger/test/mochitest/examples/same-script.js9
-rw-r--r--devtools/client/debugger/test/mochitest/examples/scopes-worker.js13
-rw-r--r--devtools/client/debugger/test/mochitest/examples/script-mutate.js20
-rw-r--r--devtools/client/debugger/test/mochitest/examples/script-switching-01.js10
-rw-r--r--devtools/client/debugger/test/mochitest/examples/script-switching-02.js18
-rw-r--r--devtools/client/debugger/test/mochitest/examples/service-worker.sjs38
-rw-r--r--devtools/client/debugger/test/mochitest/examples/shared-worker.js1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/simple-worker.js11
-rw-r--r--devtools/client/debugger/test/mochitest/examples/simple1.js62
-rw-r--r--devtools/client/debugger/test/mochitest/examples/simple2.js6
-rw-r--r--devtools/client/debugger/test/mochitest/examples/simple3.js19
-rw-r--r--devtools/client/debugger/test/mochitest/examples/simple4.js15
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sjs_slow-load.sjs31
-rw-r--r--devtools/client/debugger/test/mochitest/examples/source-pragma.js6
-rw-r--r--devtools/client/debugger/test/mochitest/examples/source-pragma.js.map10
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/.rpt2_cache/120bf459f95b8b447674b99c6fe5d040b99b6a97/types/cache/f67752e2d3a8fd18a75558156ccfd8c764b544a10
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/README.md16
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/build.js82
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/parcel/index.js69
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/parcel/package.json6
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/parcel/yarn.lock4128
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/rollup-babel6/index.js82
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/rollup-babel6/package.json12
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/rollup-babel6/yarn.lock755
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/rollup-babel7/index.js82
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/rollup-babel7/package.json13
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/rollup-babel7/yarn.lock1115
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/rollup/index.js76
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/rollup/package.json11
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/rollup/yarn.lock337
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack3-babel6/index.js81
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack3-babel6/package.json12
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack3-babel6/yarn.lock2823
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack3-babel7/index.js81
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack3-babel7/package.json13
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack3-babel7/yarn.lock3089
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack3/index.js65
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack3/package.json10
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack3/yarn.lock2202
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack4-babel6/index.js82
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack4-babel6/package.json12
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack4-babel6/yarn.lock2787
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack4-babel7/index.js82
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack4-babel7/package.json13
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack4-babel7/yarn.lock3047
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack4/index.js66
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack4/package.json10
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack4/yarn.lock2194
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/babel-bindings-with-flow/input.js10
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/babel-bindings-with-flow/src/mod.js1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/babel-classes/input.js15
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/babel-flowtype-bindings/input.js10
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/babel-flowtype-bindings/src/mod.js2
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/classes/input.js22
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/input.js41
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod1.js1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod10.js1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod11.js1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod12.js2
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod2.js1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod3.js1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod4.js2
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod5.js1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod6.js1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod7.js1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod8.js2
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod9.js1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/optimized-out.js1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/input.js41
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod1.js1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod10.js1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod11.js1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod12.js2
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod2.js1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod3.js1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod4.js2
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod5.js1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod6.js1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod7.js1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod8.js2
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod9.js1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/optimized-out.js1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/input.js41
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod1.js1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod10.js1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod11.js1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod12.js2
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod2.js1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod3.js1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod4.js2
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod5.js1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod6.js1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod7.js1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod8.js2
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod9.js1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/optimized-out.js1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/eval-maps/input.js16
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/for-loops/input.js15
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/for-of/input.js12
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/functions/input.js14
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/lex-and-nonlex/input.js9
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/line-start-bindings-es6/input.js23
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/modules-cjs/input.js8
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/out-of-order-declarations-cjs/input.js17
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/out-of-order-declarations-cjs/src/mod.js1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/shadowed-vars/input.js21
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/step-over-for-of-array-closure/input.js10
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/step-over-for-of-array/input.js10
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/step-over-for-of-closure/input.js13
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/step-over-for-of/input.js11
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/step-over-function-params/input.js8
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/step-over-regenerator-await/input.js15
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/switches/input.js13
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/this-arguments-bindings/input.js14
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/try-catches/input.js10
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/type-module/input.js8
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/type-script-cjs/input.js10
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/typescript-classes/input.ts51
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/typescript-classes/src/mod.ts8
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/webpack-functions/input.js12
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/webpack-line-mappings/input.js18
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/webpack-line-mappings/src/mod1.js1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/babel-bindings-with-flow.js132
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/babel-bindings-with-flow.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/babel-classes.js132
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/babel-classes.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/babel-flowtype-bindings.js131
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/babel-flowtype-bindings.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/classes.js137
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/classes.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/esmodules-cjs.js259
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/esmodules-cjs.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/esmodules-es6.js259
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/esmodules-es6.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/esmodules.js259
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/esmodules.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/eval-maps.js130
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/eval-maps.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/for-loops.js130
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/for-loops.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/for-of.js127
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/for-of.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/functions.js129
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/functions.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/lex-and-nonlex.js124
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/lex-and-nonlex.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/line-start-bindings-es6.js137
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/line-start-bindings-es6.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/modules-cjs.js117
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/modules-cjs.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/out-of-order-declarations-cjs.js144
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/out-of-order-declarations-cjs.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/shadowed-vars.js136
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/shadowed-vars.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-for-of-array-closure.js125
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-for-of-array-closure.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-for-of-array.js125
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-for-of-array.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-for-of-closure.js128
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-for-of-closure.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-for-of.js126
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-for-of.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-function-params.js123
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-function-params.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-regenerator-await.js130
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-regenerator-await.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/switches.js129
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/switches.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/this-arguments-bindings.js129
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/this-arguments-bindings.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/try-catches.js125
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/try-catches.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/type-module.js123
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/type-module.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/type-script-cjs.js119
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/type-script-cjs.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/typescript-classes.js221
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/typescript-classes.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/webpack-functions.js126
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/webpack-functions.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/webpack-line-mappings.js147
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/webpack-line-mappings.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/babel-bindings-with-flow.js17
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/babel-bindings-with-flow.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/babel-classes.js37
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/babel-classes.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/babel-flowtype-bindings.js15
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/babel-flowtype-bindings.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/classes.js49
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/classes.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/esmodules-es6.js57
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/esmodules-es6.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/esmodules.js57
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/esmodules.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/eval-maps.js18
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/eval-maps.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/for-loops.js23
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/for-loops.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/for-of.js21
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/for-of.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/functions.js22
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/functions.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/lex-and-nonlex.js21
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/lex-and-nonlex.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/line-start-bindings-es6.js20
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/line-start-bindings-es6.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/shadowed-vars.js17
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/shadowed-vars.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-for-of-array-closure.js26
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-for-of-array-closure.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-for-of-array.js20
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-for-of-array.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-for-of-closure.js48
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-for-of-closure.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-for-of.js40
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-for-of.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-function-params.js25
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-function-params.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-regenerator-await.js47
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-regenerator-await.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/switches.js19
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/switches.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/this-arguments-bindings.js25
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/this-arguments-bindings.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/try-catches.js16
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/try-catches.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/type-module.js16
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/type-module.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/webpack-functions.js19
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/webpack-functions.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/webpack-line-mappings.js28
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/webpack-line-mappings.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/babel-bindings-with-flow.js15
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/babel-bindings-with-flow.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/babel-classes.js71
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/babel-classes.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/babel-flowtype-bindings.js14
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/babel-flowtype-bindings.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/classes.js70
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/classes.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/esmodules-es6.js55
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/esmodules-es6.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/esmodules.js55
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/esmodules.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/eval-maps.js16
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/eval-maps.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/for-loops.js26
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/for-loops.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/for-of.js21
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/for-of.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/functions.js23
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/functions.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/lex-and-nonlex.js25
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/lex-and-nonlex.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/line-start-bindings-es6.js18
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/line-start-bindings-es6.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/shadowed-vars.js16
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/shadowed-vars.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-for-of-array-closure.js26
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-for-of-array-closure.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-for-of-array.js20
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-for-of-array.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-for-of-closure.js27
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-for-of-closure.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-for-of.js19
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-for-of.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-function-params.js30
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-function-params.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-regenerator-await.js81
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-regenerator-await.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/switches.js20
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/switches.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/this-arguments-bindings.js26
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/this-arguments-bindings.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/try-catches.js16
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/try-catches.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/type-module.js16
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/type-module.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/webpack-functions.js19
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/webpack-functions.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/webpack-line-mappings.js30
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/webpack-line-mappings.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/classes.js27
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/classes.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/esmodules-es6.js57
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/esmodules-es6.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/esmodules.js57
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/esmodules.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/eval-maps.js18
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/eval-maps.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/for-loops.js22
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/for-loops.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/for-of.js18
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/for-of.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/functions.js22
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/functions.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/lex-and-nonlex.js17
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/lex-and-nonlex.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/line-start-bindings-es6.js20
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/line-start-bindings-es6.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/shadowed-vars.js16
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/shadowed-vars.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-for-of-array-closure.js18
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-for-of-array-closure.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-for-of-array.js18
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-for-of-array.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-for-of-closure.js21
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-for-of-closure.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-for-of.js19
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-for-of.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-function-params.js16
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-function-params.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-regenerator-await.js23
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-regenerator-await.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/switches.js18
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/switches.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/this-arguments-bindings.js22
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/this-arguments-bindings.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/try-catches.js16
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/try-catches.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/type-module.js16
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/type-module.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/typescript-classes.js97
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/typescript-classes.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/webpack-functions.js20
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/webpack-functions.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/webpack-line-mappings.js26
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/webpack-line-mappings.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/babel-bindings-with-flow.js96
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/babel-bindings-with-flow.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/babel-classes.js107
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/babel-classes.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/babel-flowtype-bindings.js95
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/babel-flowtype-bindings.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/classes.js121
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/classes.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/esmodules-cjs.js280
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/esmodules-cjs.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/esmodules-es6.js224
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/esmodules-es6.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/esmodules.js217
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/esmodules.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/eval-maps.js93
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/eval-maps.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/for-loops.js94
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/for-loops.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/for-of.js92
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/for-of.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/functions.js91
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/functions.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/lex-and-nonlex.js90
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/lex-and-nonlex.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/line-start-bindings-es6.js100
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/line-start-bindings-es6.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/modules-cjs.js85
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/modules-cjs.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/out-of-order-declarations-cjs.js115
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/out-of-order-declarations-cjs.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/shadowed-vars.js102
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/shadowed-vars.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-for-of-array-closure.js95
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-for-of-array-closure.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-for-of-array.js89
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-for-of-array.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-for-of-closure.js117
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-for-of-closure.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-for-of.js109
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-for-of.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-function-params.js95
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-function-params.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-regenerator-await.js116
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-regenerator-await.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/switches.js91
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/switches.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/this-arguments-bindings.js94
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/this-arguments-bindings.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/try-catches.js87
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/try-catches.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/type-module.js84
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/type-module.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/type-script-cjs.js87
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/type-script-cjs.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/typescript-classes.js75
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/typescript-classes.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/webpack-functions.js88
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/webpack-functions.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/webpack-line-mappings.js105
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/webpack-line-mappings.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/babel-bindings-with-flow.js94
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/babel-bindings-with-flow.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/babel-classes.js112
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/babel-classes.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/babel-flowtype-bindings.js92
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/babel-flowtype-bindings.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/classes.js125
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/classes.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/esmodules-cjs.js290
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/esmodules-cjs.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/esmodules-es6.js217
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/esmodules-es6.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/esmodules.js210
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/esmodules.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/eval-maps.js89
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/eval-maps.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/for-loops.js97
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/for-loops.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/for-of.js91
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/for-of.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/functions.js92
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/functions.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/lex-and-nonlex.js90
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/lex-and-nonlex.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/line-start-bindings-es6.js97
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/line-start-bindings-es6.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/modules-cjs.js85
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/modules-cjs.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/out-of-order-declarations-cjs.js118
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/out-of-order-declarations-cjs.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/shadowed-vars.js101
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/shadowed-vars.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-for-of-array-closure.js95
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-for-of-array-closure.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-for-of-array.js89
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-for-of-array.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-for-of-closure.js96
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-for-of-closure.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-for-of.js88
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-for-of.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-function-params.js100
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-function-params.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-regenerator-await.js118
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-regenerator-await.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/switches.js92
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/switches.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/this-arguments-bindings.js95
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/this-arguments-bindings.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/try-catches.js87
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/try-catches.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/type-module.js84
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/type-module.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/type-script-cjs.js87
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/type-script-cjs.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/webpack-functions.js88
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/webpack-functions.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/webpack-line-mappings.js106
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/webpack-line-mappings.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/classes.js100
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/classes.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/esmodules-cjs.js236
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/esmodules-cjs.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/esmodules-es6.js236
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/esmodules-es6.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/esmodules.js236
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/esmodules.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/eval-maps.js94
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/eval-maps.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/for-loops.js93
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/for-loops.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/for-of.js90
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/for-of.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/functions.js92
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/functions.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/lex-and-nonlex.js87
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/lex-and-nonlex.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/line-start-bindings-es6.js101
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/line-start-bindings-es6.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/modules-cjs.js83
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/modules-cjs.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/out-of-order-declarations-cjs.js104
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/out-of-order-declarations-cjs.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/shadowed-vars.js98
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/shadowed-vars.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-for-of-array-closure.js88
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-for-of-array-closure.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-for-of-array.js88
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-for-of-array.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-for-of-closure.js91
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-for-of-closure.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-for-of.js89
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-for-of.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-function-params.js86
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-function-params.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-regenerator-await.js93
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-regenerator-await.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/switches.js91
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/switches.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/this-arguments-bindings.js92
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/this-arguments-bindings.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/try-catches.js88
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/try-catches.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/type-module.js85
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/type-module.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/type-script-cjs.js85
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/type-script-cjs.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/typescript-classes.js179
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/typescript-classes.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/webpack-functions.js90
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/webpack-functions.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/webpack-line-mappings.js105
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/webpack-line-mappings.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/babel-bindings-with-flow.js129
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/babel-bindings-with-flow.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/babel-classes.js134
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/babel-classes.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/babel-flowtype-bindings.js128
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/babel-flowtype-bindings.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/classes.js148
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/classes.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/esmodules-cjs.js362
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/esmodules-cjs.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/esmodules-es6.js309
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/esmodules-es6.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/esmodules.js309
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/esmodules.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/eval-maps.js120
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/eval-maps.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/for-loops.js121
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/for-loops.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/for-of.js119
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/for-of.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/functions.js118
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/functions.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/lex-and-nonlex.js117
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/lex-and-nonlex.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/line-start-bindings-es6.js127
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/line-start-bindings-es6.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/modules-cjs.js112
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/modules-cjs.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/out-of-order-declarations-cjs.js147
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/out-of-order-declarations-cjs.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/shadowed-vars.js129
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/shadowed-vars.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-for-of-array-closure.js122
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-for-of-array-closure.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-for-of-array.js116
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-for-of-array.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-for-of-closure.js144
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-for-of-closure.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-for-of.js136
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-for-of.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-function-params.js122
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-function-params.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-regenerator-await.js143
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-regenerator-await.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/switches.js118
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/switches.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/this-arguments-bindings.js121
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/this-arguments-bindings.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/try-catches.js114
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/try-catches.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/type-module.js111
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/type-module.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/type-script-cjs.js114
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/type-script-cjs.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/webpack-functions.js115
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/webpack-functions.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/webpack-line-mappings.js138
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/webpack-line-mappings.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/babel-bindings-with-flow.js127
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/babel-bindings-with-flow.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/babel-classes.js139
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/babel-classes.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/babel-flowtype-bindings.js125
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/babel-flowtype-bindings.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/classes.js152
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/classes.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/esmodules-cjs.js372
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/esmodules-cjs.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/esmodules-es6.js302
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/esmodules-es6.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/esmodules.js302
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/esmodules.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/eval-maps.js116
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/eval-maps.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/for-loops.js124
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/for-loops.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/for-of.js118
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/for-of.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/functions.js119
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/functions.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/lex-and-nonlex.js117
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/lex-and-nonlex.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/line-start-bindings-es6.js124
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/line-start-bindings-es6.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/modules-cjs.js112
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/modules-cjs.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/out-of-order-declarations-cjs.js150
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/out-of-order-declarations-cjs.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/shadowed-vars.js128
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/shadowed-vars.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-for-of-array-closure.js122
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-for-of-array-closure.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-for-of-array.js116
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-for-of-array.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-for-of-closure.js123
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-for-of-closure.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-for-of.js115
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-for-of.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-function-params.js127
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-function-params.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-regenerator-await.js145
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-regenerator-await.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/switches.js119
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/switches.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/this-arguments-bindings.js122
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/this-arguments-bindings.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/try-catches.js114
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/try-catches.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/type-module.js111
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/type-module.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/type-script-cjs.js114
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/type-script-cjs.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/webpack-functions.js115
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/webpack-functions.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/webpack-line-mappings.js139
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/webpack-line-mappings.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/classes.js127
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/classes.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/esmodules-cjs.js321
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/esmodules-cjs.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/esmodules-es6.js321
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/esmodules-es6.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/esmodules.js321
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/esmodules.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/eval-maps.js121
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/eval-maps.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/for-loops.js120
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/for-loops.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/for-of.js117
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/for-of.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/functions.js119
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/functions.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/lex-and-nonlex.js114
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/lex-and-nonlex.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/line-start-bindings-es6.js128
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/line-start-bindings-es6.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/modules-cjs.js110
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/modules-cjs.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/out-of-order-declarations-cjs.js137
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/out-of-order-declarations-cjs.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/shadowed-vars.js125
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/shadowed-vars.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-for-of-array-closure.js115
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-for-of-array-closure.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-for-of-array.js115
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-for-of-array.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-for-of-closure.js118
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-for-of-closure.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-for-of.js116
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-for-of.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-function-params.js113
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-function-params.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-regenerator-await.js120
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-regenerator-await.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/switches.js118
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/switches.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/this-arguments-bindings.js119
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/this-arguments-bindings.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/try-catches.js115
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/try-catches.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/type-module.js112
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/type-module.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/type-script-cjs.js112
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/type-script-cjs.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/typescript-classes.js211
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/typescript-classes.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/webpack-functions.js117
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/webpack-functions.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/webpack-line-mappings.js138
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/webpack-line-mappings.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/package.json16
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/polyfill-bundle.js9037
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/tsconfig.json10
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemapped/yarn.lock2177
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-indexed/main.js15
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-indexed/main.js.map30
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-indexed/main.min.js2
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/README.md6
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/package.json20
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/bundle-with-another-original.js2
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/bundle-with-another-original.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/bundle.js2
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/bundle.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/iframe.html29
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/index.html74
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/onload.js21
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/original-with-no-update.js9
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/original.js10
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/query.js.x=11
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/query.js.x=21
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/query2.js.y=31
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/removed-original.js5
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/replaced-bundle.js2
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/replaced-bundle.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/same-url.sjs20
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/script.js8
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/test-functions.js14
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/webpack.config.js49
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/another-original.js15
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/bundle-with-another-original.js2
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/bundle-with-another-original.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/bundle.js2
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/bundle.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/iframe.html29
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/index.html32
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/new-original.js6
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/original-with-no-update.js9
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/original.js13
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/replaced-bundle.js2
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/replaced-bundle.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/script.js22
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/webpack.config.js54
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v3/bundle.js2
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v3/bundle.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v3/index.html17
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v3/original.js3
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v3/webpack.config.js31
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/README.md11
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/package.json19
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/bundle-with-another-original.js89
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/bundle-with-another-original.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/bundle.js90
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/bundle.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/iframe.html29
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/index.html77
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/onload.js21
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/original-with-no-update.js9
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/original.js10
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/query.js.x=11
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/query.js.x=21
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/query2.js.y=31
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/react-component-module.js2
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/removed-original.js5
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/replaced-bundle.js85
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/replaced-bundle.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/same-url.sjs20
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/script.js8
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/test-functions.js14
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/webpack.config.js49
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/another-original.js15
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/bundle-with-another-original.js110
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/bundle-with-another-original.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/bundle.js93
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/bundle.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/iframe.html29
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/index.html32
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/new-original.js6
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/original-with-no-update.js9
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/original.js13
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/replaced-bundle.js86
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/replaced-bundle.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/script.js22
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/webpack.config.js54
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v3/bundle.js83
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v3/bundle.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v3/index.html17
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v3/original.js3
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v3/webpack.config.js31
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/bundle.js35
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/bundle.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/package.json15
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/rollup.config.js14
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/src/index.js11
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/src/original-1.js4
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/src/original-2.js4
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/src/original-3.js4
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/src/original-4.js4
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/src/original-5.js3
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-with-sections/xbundle.js7
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps-with-sections/xbundle.js.map25
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps/bundle.js96
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps/bundle.js.map21
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps2/main.js15
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps2/main.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps2/main.min.js2
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps3/.babelrc1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps3/.gitignore2
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps3/README.md4
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps3/bundle.js2
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps3/bundle.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps3/package.json19
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps3/sorted.js43
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps3/test.js7
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sourcemaps3/webpack.config.js31
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sum/sum.js3
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sum/sum.min.js2
-rw-r--r--devtools/client/debugger/test/mochitest/examples/sum/sum.min.js.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/times2.js3
-rw-r--r--devtools/client/debugger/test/mochitest/examples/top-level.js3
-rw-r--r--devtools/client/debugger/test/mochitest/examples/trigger-gc.js4
-rw-r--r--devtools/client/debugger/test/mochitest/examples/wasm-sourcemaps/README.md20
-rw-r--r--devtools/client/debugger/test/mochitest/examples/wasm-sourcemaps/fib.c17
-rw-r--r--devtools/client/debugger/test/mochitest/examples/wasm-sourcemaps/fib.debug.wasmbin0 -> 1333 bytes
-rw-r--r--devtools/client/debugger/test/mochitest/examples/wasm-sourcemaps/fib.wasmbin0 -> 1516 bytes
-rw-r--r--devtools/client/debugger/test/mochitest/examples/wasm-sourcemaps/fib.wasm.map1
-rw-r--r--devtools/client/debugger/test/mochitest/examples/webpack.config.js8
-rw-r--r--devtools/client/debugger/test/mochitest/examples/worker-exception.js4
-rw-r--r--devtools/client/debugger/test/mochitest/head.js300
-rw-r--r--devtools/client/debugger/test/mochitest/integration-tests/1-reload-same-original.js166
-rw-r--r--devtools/client/debugger/test/mochitest/integration-tests/2-reload-replaced-original.js136
-rw-r--r--devtools/client/debugger/test/mochitest/integration-tests/3-reload-changed-generated.js198
-rw-r--r--devtools/client/debugger/test/mochitest/integration-tests/README.md29
-rw-r--r--devtools/client/debugger/test/mochitest/shared-head.js3121
-rw-r--r--devtools/client/debugger/test/xpcshell/.eslintrc.js10
-rw-r--r--devtools/client/debugger/test/xpcshell/test_sourcetree_utils_getRelativePath.js70
-rw-r--r--devtools/client/debugger/test/xpcshell/xpcshell.toml7
-rw-r--r--devtools/client/debugger/yarn.lock5638
1821 files changed, 410926 insertions, 0 deletions
diff --git a/devtools/client/debugger/.remarkignore b/devtools/client/debugger/.remarkignore
new file mode 100644
index 0000000000..7453613c87
--- /dev/null
+++ b/devtools/client/debugger/.remarkignore
@@ -0,0 +1,2 @@
+src/utils/pause/mapScopes/README.md
+src/test/mochitest/examples/sourcemapped/README.md
diff --git a/devtools/client/debugger/.remarkrc b/devtools/client/debugger/.remarkrc
new file mode 100644
index 0000000000..4970e65248
--- /dev/null
+++ b/devtools/client/debugger/.remarkrc
@@ -0,0 +1,17 @@
+{
+ "plugins": [
+ "preset-lint-recommended",
+ ["lint-list-item-bullet-indent", false],
+ ["lint-list-item-indent", false],
+ ["lint-ordered-list-marker-style", false],
+ ["lint-no-unused-definitions", false],
+ ["lint-no-shortcut-reference-link", false],
+ ["lint-no-shortcut-reference-image", false],
+ ["lint-no-table-indentation", true],
+ ["lint-table-cell-padding", "consistent"],
+ ["lint-table-pipes", false],
+ ["validate-links", {
+ "repository": ""
+ }]
+ ]
+}
diff --git a/devtools/client/debugger/babel.config.js b/devtools/client/debugger/babel.config.js
new file mode 100644
index 0000000000..a46a9e7b23
--- /dev/null
+++ b/devtools/client/debugger/babel.config.js
@@ -0,0 +1,89 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+/**
+ * NOTE: This file does not apply to builds in MC. This config is used for
+ * our Jest tests and for webpack bundle builds.
+ */
+module.exports = {
+ sourceType: "unambiguous",
+ overrides: [
+ {
+ test: [
+ "./src",
+ "./packages/*/index.js",
+ "./packages/*/src",
+ /[/\\]node_modules[/\\]devtools-/,
+ /[/\\]node_modules[/\\]react-aria-components[/\\]/,
+ "../../shared",
+ "../shared/worker-utils.js",
+ ],
+ presets: [
+ "@babel/preset-react",
+ [
+ "@babel/preset-env",
+ {
+ targets: {
+ browsers: ["last 1 Chrome version", "last 1 Firefox version"],
+ },
+ modules: "commonjs",
+ },
+ ],
+ ],
+ plugins: [
+ "@babel/plugin-proposal-class-static-block",
+ "@babel/plugin-proposal-class-properties",
+ "@babel/plugin-proposal-optional-chaining",
+ "@babel/plugin-proposal-nullish-coalescing-operator",
+ "@babel/plugin-proposal-private-methods",
+ "@babel/plugin-proposal-private-property-in-object",
+ "@babel/plugin-proposal-unicode-sets-regex",
+ [
+ "module-resolver",
+ {
+ alias: {
+ "devtools/client/shared/vendor/react": "react",
+ "devtools/client/shared/vendor/react-dom": "react-dom",
+ "devtools/client/shared/vendor/react-dom-factories":
+ "react-dom-factories",
+ "devtools/client/shared/vendor/react-prop-types": "prop-types",
+ // Map all require("devtools/...") to the real devtools root.
+ "^devtools\\/(.*)": `${__dirname}/../../\\1`,
+ "^resource://devtools/(.*)": `${__dirname}/../../\\1`,
+ },
+ },
+ ],
+ ],
+ env: {
+ test: {
+ presets: [
+ [
+ "@babel/preset-env",
+ {
+ targets: {
+ node: 7,
+ },
+ modules: "commonjs",
+ },
+ ],
+ ],
+ },
+ },
+ },
+ {
+ test: ["../shared/components"],
+ plugins: [
+ "@babel/plugin-proposal-class-static-block",
+ "@babel/plugin-proposal-class-properties",
+ "@babel/plugin-proposal-optional-chaining",
+ "@babel/plugin-proposal-nullish-coalescing-operator",
+ "@babel/plugin-proposal-private-methods",
+ "@babel/plugin-proposal-private-property-in-object",
+ "transform-amd-to-commonjs",
+ ],
+ },
+ ],
+};
diff --git a/devtools/client/debugger/bin/bundle.js b/devtools/client/debugger/bin/bundle.js
new file mode 100644
index 0000000000..b44f7dcd70
--- /dev/null
+++ b/devtools/client/debugger/bin/bundle.js
@@ -0,0 +1,86 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+const path = require("path");
+const { rollup } = require("rollup");
+const nodeResolve = require("@rollup/plugin-node-resolve");
+const commonjs = require("@rollup/plugin-commonjs");
+const injectProcessEnv = require("rollup-plugin-inject-process-env");
+const nodePolyfills = require("rollup-plugin-node-polyfills");
+
+const projectPath = path.resolve(__dirname, "..");
+const bundlePath = path.join(projectPath, "./dist");
+
+process.env.NODE_ENV = "production";
+
+function getEntry(filename) {
+ return path.join(__dirname, "..", filename);
+}
+
+/**
+ * The `bundle` module will build the following:
+ * - parser-worker.js, pretty-print-worker.js, search-worker:
+ * Workers used only by the debugger.
+ * Sources at devtools/client/debugger/src/workers/*
+ */
+(async function bundle() {
+ const rollupSucceeded = await bundleRollup();
+ process.exit(rollupSucceeded ? 0 : 1);
+})();
+
+/**
+ * Generates all dist/*-worker.js files
+ */
+async function bundleRollup() {
+ console.log(`[bundle|rollup] Start bundling…`);
+
+ let success = true;
+
+ // We need to handle workers 1 by 1 to be able to generate umd bundles.
+ const entries = {
+ "parser-worker": getEntry("src/workers/parser/worker.js"),
+ "pretty-print-worker": getEntry("src/workers/pretty-print/worker.js"),
+ "search-worker": getEntry("src/workers/search/worker.js"),
+ };
+
+ for (const [entryName, input] of Object.entries(entries)) {
+ let bundle;
+ try {
+ // create a bundle
+ bundle = await rollup({
+ input: {
+ [entryName]: input,
+ },
+ plugins: [
+ commonjs({
+ transformMixedEsModules: true,
+ strictRequires: true,
+ }),
+ injectProcessEnv({ NODE_ENV: "production" }),
+ nodeResolve(),
+ // read-wasm.js is part of source-map and is only for Node environment.
+ // we need to ignore it, otherwise __dirname is inlined with the path the bundle
+ // is generated from, which makes the verify-bundle task fail
+ nodePolyfills({ exclude: [/read-wasm\.js/] }),
+ ],
+ });
+ await bundle.write({
+ dir: bundlePath,
+ entryFileNames: "[name].js",
+ format: "umd",
+ });
+ } catch (error) {
+ success = false;
+ // do some error reporting
+ console.error("[bundle|rollup] Something went wrong.", error);
+ }
+ if (bundle) {
+ // closes the bundle
+ await bundle.close();
+ }
+ }
+
+ console.log(`[bundle|rollup] Done bundling`);
+ return success;
+}
diff --git a/devtools/client/debugger/bin/watch.js b/devtools/client/debugger/bin/watch.js
new file mode 100644
index 0000000000..d4d02e18ca
--- /dev/null
+++ b/devtools/client/debugger/bin/watch.js
@@ -0,0 +1,31 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+var chokidar = require("chokidar");
+var shell = require("shelljs");
+var path = require("path");
+
+const geckoPath = path.join(__dirname, "../../../..");
+const srcPath = path.join(__dirname, "../src");
+function watch() {
+ console.log("Watching for src changes");
+ const watcher = chokidar.watch(srcPath);
+ let working = false;
+ watcher.on("change", filePath => {
+ const relPath = path.relative(srcPath, filePath);
+ console.log(`Updating ${relPath}`);
+ if (working) {
+ return;
+ }
+ working = true;
+ const start = new Date();
+
+ shell.exec(`cd ${geckoPath}; ./mach build faster; cd -;`, { silent: true });
+ working = false;
+ const end = Math.round((new Date() - start) / 1000);
+ console.log(` Built in ${end}s`);
+ });
+}
+
+watch();
diff --git a/devtools/client/debugger/dist/moz.build b/devtools/client/debugger/dist/moz.build
new file mode 100644
index 0000000000..0d979d0d78
--- /dev/null
+++ b/devtools/client/debugger/dist/moz.build
@@ -0,0 +1,10 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DevToolsModules(
+ "parser-worker.js",
+ "pretty-print-worker.js",
+ "search-worker.js",
+)
diff --git a/devtools/client/debugger/dist/parser-worker.js b/devtools/client/debugger/dist/parser-worker.js
new file mode 100644
index 0000000000..ea014d7529
--- /dev/null
+++ b/devtools/client/debugger/dist/parser-worker.js
@@ -0,0 +1,41439 @@
+(function (factory) {
+ typeof define === 'function' && define.amd ? define(factory) :
+ factory();
+})((function () { 'use strict';
+
+ (function() {
+ const env = {"NODE_ENV":"production"};
+ try {
+ if (process) {
+ process.env = Object.assign({}, process.env);
+ Object.assign(process.env, env);
+ return;
+ }
+ } catch (e) {} // avoid ReferenceError: process is not defined
+ globalThis.process = { env:env };
+ })();
+
+ var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
+
+ function getDefaultExportFromCjs (x) {
+ return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
+ }
+
+ var lib$4 = {};
+
+ var isReactComponent$1 = {};
+
+ var buildMatchMemberExpression = {};
+
+ var matchesPattern = {};
+
+ var generated$3 = {};
+
+ var shallowEqual = {};
+
+ var hasRequiredShallowEqual;
+
+ function requireShallowEqual () {
+ if (hasRequiredShallowEqual) return shallowEqual;
+ hasRequiredShallowEqual = 1;
+
+ Object.defineProperty(shallowEqual, "__esModule", {
+ value: true
+ });
+ shallowEqual.default = shallowEqual$1;
+ function shallowEqual$1(actual, expected) {
+ const keys = Object.keys(expected);
+ for (const key of keys) {
+ if (actual[key] !== expected[key]) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+
+ return shallowEqual;
+ }
+
+ var deprecationWarning = {};
+
+ var hasRequiredDeprecationWarning;
+
+ function requireDeprecationWarning () {
+ if (hasRequiredDeprecationWarning) return deprecationWarning;
+ hasRequiredDeprecationWarning = 1;
+
+ Object.defineProperty(deprecationWarning, "__esModule", {
+ value: true
+ });
+ deprecationWarning.default = deprecationWarning$1;
+ const warnings = new Set();
+ function deprecationWarning$1(oldName, newName, prefix = "") {
+ if (warnings.has(oldName)) return;
+ warnings.add(oldName);
+ const {
+ internal,
+ trace
+ } = captureShortStackTrace(1, 2);
+ if (internal) {
+ return;
+ }
+ console.warn(`${prefix}\`${oldName}\` has been deprecated, please migrate to \`${newName}\`\n${trace}`);
+ }
+ function captureShortStackTrace(skip, length) {
+ const {
+ stackTraceLimit,
+ prepareStackTrace
+ } = Error;
+ let stackTrace;
+ Error.stackTraceLimit = 1 + skip + length;
+ Error.prepareStackTrace = function (err, stack) {
+ stackTrace = stack;
+ };
+ new Error().stack;
+ Error.stackTraceLimit = stackTraceLimit;
+ Error.prepareStackTrace = prepareStackTrace;
+ if (!stackTrace) return {
+ internal: false,
+ trace: ""
+ };
+ const shortStackTrace = stackTrace.slice(1 + skip, 1 + skip + length);
+ return {
+ internal: /[\\/]@babel[\\/]/.test(shortStackTrace[1].getFileName()),
+ trace: shortStackTrace.map(frame => ` at ${frame}`).join("\n")
+ };
+ }
+
+
+ return deprecationWarning;
+ }
+
+ var hasRequiredGenerated$3;
+
+ function requireGenerated$3 () {
+ if (hasRequiredGenerated$3) return generated$3;
+ hasRequiredGenerated$3 = 1;
+
+ Object.defineProperty(generated$3, "__esModule", {
+ value: true
+ });
+ generated$3.isAccessor = isAccessor;
+ generated$3.isAnyTypeAnnotation = isAnyTypeAnnotation;
+ generated$3.isArgumentPlaceholder = isArgumentPlaceholder;
+ generated$3.isArrayExpression = isArrayExpression;
+ generated$3.isArrayPattern = isArrayPattern;
+ generated$3.isArrayTypeAnnotation = isArrayTypeAnnotation;
+ generated$3.isArrowFunctionExpression = isArrowFunctionExpression;
+ generated$3.isAssignmentExpression = isAssignmentExpression;
+ generated$3.isAssignmentPattern = isAssignmentPattern;
+ generated$3.isAwaitExpression = isAwaitExpression;
+ generated$3.isBigIntLiteral = isBigIntLiteral;
+ generated$3.isBinary = isBinary;
+ generated$3.isBinaryExpression = isBinaryExpression;
+ generated$3.isBindExpression = isBindExpression;
+ generated$3.isBlock = isBlock;
+ generated$3.isBlockParent = isBlockParent;
+ generated$3.isBlockStatement = isBlockStatement;
+ generated$3.isBooleanLiteral = isBooleanLiteral;
+ generated$3.isBooleanLiteralTypeAnnotation = isBooleanLiteralTypeAnnotation;
+ generated$3.isBooleanTypeAnnotation = isBooleanTypeAnnotation;
+ generated$3.isBreakStatement = isBreakStatement;
+ generated$3.isCallExpression = isCallExpression;
+ generated$3.isCatchClause = isCatchClause;
+ generated$3.isClass = isClass;
+ generated$3.isClassAccessorProperty = isClassAccessorProperty;
+ generated$3.isClassBody = isClassBody;
+ generated$3.isClassDeclaration = isClassDeclaration;
+ generated$3.isClassExpression = isClassExpression;
+ generated$3.isClassImplements = isClassImplements;
+ generated$3.isClassMethod = isClassMethod;
+ generated$3.isClassPrivateMethod = isClassPrivateMethod;
+ generated$3.isClassPrivateProperty = isClassPrivateProperty;
+ generated$3.isClassProperty = isClassProperty;
+ generated$3.isCompletionStatement = isCompletionStatement;
+ generated$3.isConditional = isConditional;
+ generated$3.isConditionalExpression = isConditionalExpression;
+ generated$3.isContinueStatement = isContinueStatement;
+ generated$3.isDebuggerStatement = isDebuggerStatement;
+ generated$3.isDecimalLiteral = isDecimalLiteral;
+ generated$3.isDeclaration = isDeclaration;
+ generated$3.isDeclareClass = isDeclareClass;
+ generated$3.isDeclareExportAllDeclaration = isDeclareExportAllDeclaration;
+ generated$3.isDeclareExportDeclaration = isDeclareExportDeclaration;
+ generated$3.isDeclareFunction = isDeclareFunction;
+ generated$3.isDeclareInterface = isDeclareInterface;
+ generated$3.isDeclareModule = isDeclareModule;
+ generated$3.isDeclareModuleExports = isDeclareModuleExports;
+ generated$3.isDeclareOpaqueType = isDeclareOpaqueType;
+ generated$3.isDeclareTypeAlias = isDeclareTypeAlias;
+ generated$3.isDeclareVariable = isDeclareVariable;
+ generated$3.isDeclaredPredicate = isDeclaredPredicate;
+ generated$3.isDecorator = isDecorator;
+ generated$3.isDirective = isDirective;
+ generated$3.isDirectiveLiteral = isDirectiveLiteral;
+ generated$3.isDoExpression = isDoExpression;
+ generated$3.isDoWhileStatement = isDoWhileStatement;
+ generated$3.isEmptyStatement = isEmptyStatement;
+ generated$3.isEmptyTypeAnnotation = isEmptyTypeAnnotation;
+ generated$3.isEnumBody = isEnumBody;
+ generated$3.isEnumBooleanBody = isEnumBooleanBody;
+ generated$3.isEnumBooleanMember = isEnumBooleanMember;
+ generated$3.isEnumDeclaration = isEnumDeclaration;
+ generated$3.isEnumDefaultedMember = isEnumDefaultedMember;
+ generated$3.isEnumMember = isEnumMember;
+ generated$3.isEnumNumberBody = isEnumNumberBody;
+ generated$3.isEnumNumberMember = isEnumNumberMember;
+ generated$3.isEnumStringBody = isEnumStringBody;
+ generated$3.isEnumStringMember = isEnumStringMember;
+ generated$3.isEnumSymbolBody = isEnumSymbolBody;
+ generated$3.isExistsTypeAnnotation = isExistsTypeAnnotation;
+ generated$3.isExportAllDeclaration = isExportAllDeclaration;
+ generated$3.isExportDeclaration = isExportDeclaration;
+ generated$3.isExportDefaultDeclaration = isExportDefaultDeclaration;
+ generated$3.isExportDefaultSpecifier = isExportDefaultSpecifier;
+ generated$3.isExportNamedDeclaration = isExportNamedDeclaration;
+ generated$3.isExportNamespaceSpecifier = isExportNamespaceSpecifier;
+ generated$3.isExportSpecifier = isExportSpecifier;
+ generated$3.isExpression = isExpression;
+ generated$3.isExpressionStatement = isExpressionStatement;
+ generated$3.isExpressionWrapper = isExpressionWrapper;
+ generated$3.isFile = isFile;
+ generated$3.isFlow = isFlow;
+ generated$3.isFlowBaseAnnotation = isFlowBaseAnnotation;
+ generated$3.isFlowDeclaration = isFlowDeclaration;
+ generated$3.isFlowPredicate = isFlowPredicate;
+ generated$3.isFlowType = isFlowType;
+ generated$3.isFor = isFor;
+ generated$3.isForInStatement = isForInStatement;
+ generated$3.isForOfStatement = isForOfStatement;
+ generated$3.isForStatement = isForStatement;
+ generated$3.isForXStatement = isForXStatement;
+ generated$3.isFunction = isFunction;
+ generated$3.isFunctionDeclaration = isFunctionDeclaration;
+ generated$3.isFunctionExpression = isFunctionExpression;
+ generated$3.isFunctionParent = isFunctionParent;
+ generated$3.isFunctionTypeAnnotation = isFunctionTypeAnnotation;
+ generated$3.isFunctionTypeParam = isFunctionTypeParam;
+ generated$3.isGenericTypeAnnotation = isGenericTypeAnnotation;
+ generated$3.isIdentifier = isIdentifier;
+ generated$3.isIfStatement = isIfStatement;
+ generated$3.isImmutable = isImmutable;
+ generated$3.isImport = isImport;
+ generated$3.isImportAttribute = isImportAttribute;
+ generated$3.isImportDeclaration = isImportDeclaration;
+ generated$3.isImportDefaultSpecifier = isImportDefaultSpecifier;
+ generated$3.isImportExpression = isImportExpression;
+ generated$3.isImportNamespaceSpecifier = isImportNamespaceSpecifier;
+ generated$3.isImportOrExportDeclaration = isImportOrExportDeclaration;
+ generated$3.isImportSpecifier = isImportSpecifier;
+ generated$3.isIndexedAccessType = isIndexedAccessType;
+ generated$3.isInferredPredicate = isInferredPredicate;
+ generated$3.isInterfaceDeclaration = isInterfaceDeclaration;
+ generated$3.isInterfaceExtends = isInterfaceExtends;
+ generated$3.isInterfaceTypeAnnotation = isInterfaceTypeAnnotation;
+ generated$3.isInterpreterDirective = isInterpreterDirective;
+ generated$3.isIntersectionTypeAnnotation = isIntersectionTypeAnnotation;
+ generated$3.isJSX = isJSX;
+ generated$3.isJSXAttribute = isJSXAttribute;
+ generated$3.isJSXClosingElement = isJSXClosingElement;
+ generated$3.isJSXClosingFragment = isJSXClosingFragment;
+ generated$3.isJSXElement = isJSXElement;
+ generated$3.isJSXEmptyExpression = isJSXEmptyExpression;
+ generated$3.isJSXExpressionContainer = isJSXExpressionContainer;
+ generated$3.isJSXFragment = isJSXFragment;
+ generated$3.isJSXIdentifier = isJSXIdentifier;
+ generated$3.isJSXMemberExpression = isJSXMemberExpression;
+ generated$3.isJSXNamespacedName = isJSXNamespacedName;
+ generated$3.isJSXOpeningElement = isJSXOpeningElement;
+ generated$3.isJSXOpeningFragment = isJSXOpeningFragment;
+ generated$3.isJSXSpreadAttribute = isJSXSpreadAttribute;
+ generated$3.isJSXSpreadChild = isJSXSpreadChild;
+ generated$3.isJSXText = isJSXText;
+ generated$3.isLVal = isLVal;
+ generated$3.isLabeledStatement = isLabeledStatement;
+ generated$3.isLiteral = isLiteral;
+ generated$3.isLogicalExpression = isLogicalExpression;
+ generated$3.isLoop = isLoop;
+ generated$3.isMemberExpression = isMemberExpression;
+ generated$3.isMetaProperty = isMetaProperty;
+ generated$3.isMethod = isMethod;
+ generated$3.isMiscellaneous = isMiscellaneous;
+ generated$3.isMixedTypeAnnotation = isMixedTypeAnnotation;
+ generated$3.isModuleDeclaration = isModuleDeclaration;
+ generated$3.isModuleExpression = isModuleExpression;
+ generated$3.isModuleSpecifier = isModuleSpecifier;
+ generated$3.isNewExpression = isNewExpression;
+ generated$3.isNoop = isNoop;
+ generated$3.isNullLiteral = isNullLiteral;
+ generated$3.isNullLiteralTypeAnnotation = isNullLiteralTypeAnnotation;
+ generated$3.isNullableTypeAnnotation = isNullableTypeAnnotation;
+ generated$3.isNumberLiteral = isNumberLiteral;
+ generated$3.isNumberLiteralTypeAnnotation = isNumberLiteralTypeAnnotation;
+ generated$3.isNumberTypeAnnotation = isNumberTypeAnnotation;
+ generated$3.isNumericLiteral = isNumericLiteral;
+ generated$3.isObjectExpression = isObjectExpression;
+ generated$3.isObjectMember = isObjectMember;
+ generated$3.isObjectMethod = isObjectMethod;
+ generated$3.isObjectPattern = isObjectPattern;
+ generated$3.isObjectProperty = isObjectProperty;
+ generated$3.isObjectTypeAnnotation = isObjectTypeAnnotation;
+ generated$3.isObjectTypeCallProperty = isObjectTypeCallProperty;
+ generated$3.isObjectTypeIndexer = isObjectTypeIndexer;
+ generated$3.isObjectTypeInternalSlot = isObjectTypeInternalSlot;
+ generated$3.isObjectTypeProperty = isObjectTypeProperty;
+ generated$3.isObjectTypeSpreadProperty = isObjectTypeSpreadProperty;
+ generated$3.isOpaqueType = isOpaqueType;
+ generated$3.isOptionalCallExpression = isOptionalCallExpression;
+ generated$3.isOptionalIndexedAccessType = isOptionalIndexedAccessType;
+ generated$3.isOptionalMemberExpression = isOptionalMemberExpression;
+ generated$3.isParenthesizedExpression = isParenthesizedExpression;
+ generated$3.isPattern = isPattern;
+ generated$3.isPatternLike = isPatternLike;
+ generated$3.isPipelineBareFunction = isPipelineBareFunction;
+ generated$3.isPipelinePrimaryTopicReference = isPipelinePrimaryTopicReference;
+ generated$3.isPipelineTopicExpression = isPipelineTopicExpression;
+ generated$3.isPlaceholder = isPlaceholder;
+ generated$3.isPrivate = isPrivate;
+ generated$3.isPrivateName = isPrivateName;
+ generated$3.isProgram = isProgram;
+ generated$3.isProperty = isProperty;
+ generated$3.isPureish = isPureish;
+ generated$3.isQualifiedTypeIdentifier = isQualifiedTypeIdentifier;
+ generated$3.isRecordExpression = isRecordExpression;
+ generated$3.isRegExpLiteral = isRegExpLiteral;
+ generated$3.isRegexLiteral = isRegexLiteral;
+ generated$3.isRestElement = isRestElement;
+ generated$3.isRestProperty = isRestProperty;
+ generated$3.isReturnStatement = isReturnStatement;
+ generated$3.isScopable = isScopable;
+ generated$3.isSequenceExpression = isSequenceExpression;
+ generated$3.isSpreadElement = isSpreadElement;
+ generated$3.isSpreadProperty = isSpreadProperty;
+ generated$3.isStandardized = isStandardized;
+ generated$3.isStatement = isStatement;
+ generated$3.isStaticBlock = isStaticBlock;
+ generated$3.isStringLiteral = isStringLiteral;
+ generated$3.isStringLiteralTypeAnnotation = isStringLiteralTypeAnnotation;
+ generated$3.isStringTypeAnnotation = isStringTypeAnnotation;
+ generated$3.isSuper = isSuper;
+ generated$3.isSwitchCase = isSwitchCase;
+ generated$3.isSwitchStatement = isSwitchStatement;
+ generated$3.isSymbolTypeAnnotation = isSymbolTypeAnnotation;
+ generated$3.isTSAnyKeyword = isTSAnyKeyword;
+ generated$3.isTSArrayType = isTSArrayType;
+ generated$3.isTSAsExpression = isTSAsExpression;
+ generated$3.isTSBaseType = isTSBaseType;
+ generated$3.isTSBigIntKeyword = isTSBigIntKeyword;
+ generated$3.isTSBooleanKeyword = isTSBooleanKeyword;
+ generated$3.isTSCallSignatureDeclaration = isTSCallSignatureDeclaration;
+ generated$3.isTSConditionalType = isTSConditionalType;
+ generated$3.isTSConstructSignatureDeclaration = isTSConstructSignatureDeclaration;
+ generated$3.isTSConstructorType = isTSConstructorType;
+ generated$3.isTSDeclareFunction = isTSDeclareFunction;
+ generated$3.isTSDeclareMethod = isTSDeclareMethod;
+ generated$3.isTSEntityName = isTSEntityName;
+ generated$3.isTSEnumDeclaration = isTSEnumDeclaration;
+ generated$3.isTSEnumMember = isTSEnumMember;
+ generated$3.isTSExportAssignment = isTSExportAssignment;
+ generated$3.isTSExpressionWithTypeArguments = isTSExpressionWithTypeArguments;
+ generated$3.isTSExternalModuleReference = isTSExternalModuleReference;
+ generated$3.isTSFunctionType = isTSFunctionType;
+ generated$3.isTSImportEqualsDeclaration = isTSImportEqualsDeclaration;
+ generated$3.isTSImportType = isTSImportType;
+ generated$3.isTSIndexSignature = isTSIndexSignature;
+ generated$3.isTSIndexedAccessType = isTSIndexedAccessType;
+ generated$3.isTSInferType = isTSInferType;
+ generated$3.isTSInstantiationExpression = isTSInstantiationExpression;
+ generated$3.isTSInterfaceBody = isTSInterfaceBody;
+ generated$3.isTSInterfaceDeclaration = isTSInterfaceDeclaration;
+ generated$3.isTSIntersectionType = isTSIntersectionType;
+ generated$3.isTSIntrinsicKeyword = isTSIntrinsicKeyword;
+ generated$3.isTSLiteralType = isTSLiteralType;
+ generated$3.isTSMappedType = isTSMappedType;
+ generated$3.isTSMethodSignature = isTSMethodSignature;
+ generated$3.isTSModuleBlock = isTSModuleBlock;
+ generated$3.isTSModuleDeclaration = isTSModuleDeclaration;
+ generated$3.isTSNamedTupleMember = isTSNamedTupleMember;
+ generated$3.isTSNamespaceExportDeclaration = isTSNamespaceExportDeclaration;
+ generated$3.isTSNeverKeyword = isTSNeverKeyword;
+ generated$3.isTSNonNullExpression = isTSNonNullExpression;
+ generated$3.isTSNullKeyword = isTSNullKeyword;
+ generated$3.isTSNumberKeyword = isTSNumberKeyword;
+ generated$3.isTSObjectKeyword = isTSObjectKeyword;
+ generated$3.isTSOptionalType = isTSOptionalType;
+ generated$3.isTSParameterProperty = isTSParameterProperty;
+ generated$3.isTSParenthesizedType = isTSParenthesizedType;
+ generated$3.isTSPropertySignature = isTSPropertySignature;
+ generated$3.isTSQualifiedName = isTSQualifiedName;
+ generated$3.isTSRestType = isTSRestType;
+ generated$3.isTSSatisfiesExpression = isTSSatisfiesExpression;
+ generated$3.isTSStringKeyword = isTSStringKeyword;
+ generated$3.isTSSymbolKeyword = isTSSymbolKeyword;
+ generated$3.isTSThisType = isTSThisType;
+ generated$3.isTSTupleType = isTSTupleType;
+ generated$3.isTSType = isTSType;
+ generated$3.isTSTypeAliasDeclaration = isTSTypeAliasDeclaration;
+ generated$3.isTSTypeAnnotation = isTSTypeAnnotation;
+ generated$3.isTSTypeAssertion = isTSTypeAssertion;
+ generated$3.isTSTypeElement = isTSTypeElement;
+ generated$3.isTSTypeLiteral = isTSTypeLiteral;
+ generated$3.isTSTypeOperator = isTSTypeOperator;
+ generated$3.isTSTypeParameter = isTSTypeParameter;
+ generated$3.isTSTypeParameterDeclaration = isTSTypeParameterDeclaration;
+ generated$3.isTSTypeParameterInstantiation = isTSTypeParameterInstantiation;
+ generated$3.isTSTypePredicate = isTSTypePredicate;
+ generated$3.isTSTypeQuery = isTSTypeQuery;
+ generated$3.isTSTypeReference = isTSTypeReference;
+ generated$3.isTSUndefinedKeyword = isTSUndefinedKeyword;
+ generated$3.isTSUnionType = isTSUnionType;
+ generated$3.isTSUnknownKeyword = isTSUnknownKeyword;
+ generated$3.isTSVoidKeyword = isTSVoidKeyword;
+ generated$3.isTaggedTemplateExpression = isTaggedTemplateExpression;
+ generated$3.isTemplateElement = isTemplateElement;
+ generated$3.isTemplateLiteral = isTemplateLiteral;
+ generated$3.isTerminatorless = isTerminatorless;
+ generated$3.isThisExpression = isThisExpression;
+ generated$3.isThisTypeAnnotation = isThisTypeAnnotation;
+ generated$3.isThrowStatement = isThrowStatement;
+ generated$3.isTopicReference = isTopicReference;
+ generated$3.isTryStatement = isTryStatement;
+ generated$3.isTupleExpression = isTupleExpression;
+ generated$3.isTupleTypeAnnotation = isTupleTypeAnnotation;
+ generated$3.isTypeAlias = isTypeAlias;
+ generated$3.isTypeAnnotation = isTypeAnnotation;
+ generated$3.isTypeCastExpression = isTypeCastExpression;
+ generated$3.isTypeParameter = isTypeParameter;
+ generated$3.isTypeParameterDeclaration = isTypeParameterDeclaration;
+ generated$3.isTypeParameterInstantiation = isTypeParameterInstantiation;
+ generated$3.isTypeScript = isTypeScript;
+ generated$3.isTypeofTypeAnnotation = isTypeofTypeAnnotation;
+ generated$3.isUnaryExpression = isUnaryExpression;
+ generated$3.isUnaryLike = isUnaryLike;
+ generated$3.isUnionTypeAnnotation = isUnionTypeAnnotation;
+ generated$3.isUpdateExpression = isUpdateExpression;
+ generated$3.isUserWhitespacable = isUserWhitespacable;
+ generated$3.isV8IntrinsicIdentifier = isV8IntrinsicIdentifier;
+ generated$3.isVariableDeclaration = isVariableDeclaration;
+ generated$3.isVariableDeclarator = isVariableDeclarator;
+ generated$3.isVariance = isVariance;
+ generated$3.isVoidTypeAnnotation = isVoidTypeAnnotation;
+ generated$3.isWhile = isWhile;
+ generated$3.isWhileStatement = isWhileStatement;
+ generated$3.isWithStatement = isWithStatement;
+ generated$3.isYieldExpression = isYieldExpression;
+ var _shallowEqual = requireShallowEqual();
+ var _deprecationWarning = requireDeprecationWarning();
+ function isArrayExpression(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ArrayExpression") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isAssignmentExpression(node, opts) {
+ if (!node) return false;
+ if (node.type !== "AssignmentExpression") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isBinaryExpression(node, opts) {
+ if (!node) return false;
+ if (node.type !== "BinaryExpression") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isInterpreterDirective(node, opts) {
+ if (!node) return false;
+ if (node.type !== "InterpreterDirective") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isDirective(node, opts) {
+ if (!node) return false;
+ if (node.type !== "Directive") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isDirectiveLiteral(node, opts) {
+ if (!node) return false;
+ if (node.type !== "DirectiveLiteral") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isBlockStatement(node, opts) {
+ if (!node) return false;
+ if (node.type !== "BlockStatement") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isBreakStatement(node, opts) {
+ if (!node) return false;
+ if (node.type !== "BreakStatement") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isCallExpression(node, opts) {
+ if (!node) return false;
+ if (node.type !== "CallExpression") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isCatchClause(node, opts) {
+ if (!node) return false;
+ if (node.type !== "CatchClause") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isConditionalExpression(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ConditionalExpression") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isContinueStatement(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ContinueStatement") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isDebuggerStatement(node, opts) {
+ if (!node) return false;
+ if (node.type !== "DebuggerStatement") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isDoWhileStatement(node, opts) {
+ if (!node) return false;
+ if (node.type !== "DoWhileStatement") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isEmptyStatement(node, opts) {
+ if (!node) return false;
+ if (node.type !== "EmptyStatement") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isExpressionStatement(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ExpressionStatement") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isFile(node, opts) {
+ if (!node) return false;
+ if (node.type !== "File") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isForInStatement(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ForInStatement") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isForStatement(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ForStatement") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isFunctionDeclaration(node, opts) {
+ if (!node) return false;
+ if (node.type !== "FunctionDeclaration") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isFunctionExpression(node, opts) {
+ if (!node) return false;
+ if (node.type !== "FunctionExpression") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isIdentifier(node, opts) {
+ if (!node) return false;
+ if (node.type !== "Identifier") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isIfStatement(node, opts) {
+ if (!node) return false;
+ if (node.type !== "IfStatement") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isLabeledStatement(node, opts) {
+ if (!node) return false;
+ if (node.type !== "LabeledStatement") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isStringLiteral(node, opts) {
+ if (!node) return false;
+ if (node.type !== "StringLiteral") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isNumericLiteral(node, opts) {
+ if (!node) return false;
+ if (node.type !== "NumericLiteral") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isNullLiteral(node, opts) {
+ if (!node) return false;
+ if (node.type !== "NullLiteral") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isBooleanLiteral(node, opts) {
+ if (!node) return false;
+ if (node.type !== "BooleanLiteral") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isRegExpLiteral(node, opts) {
+ if (!node) return false;
+ if (node.type !== "RegExpLiteral") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isLogicalExpression(node, opts) {
+ if (!node) return false;
+ if (node.type !== "LogicalExpression") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isMemberExpression(node, opts) {
+ if (!node) return false;
+ if (node.type !== "MemberExpression") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isNewExpression(node, opts) {
+ if (!node) return false;
+ if (node.type !== "NewExpression") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isProgram(node, opts) {
+ if (!node) return false;
+ if (node.type !== "Program") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isObjectExpression(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ObjectExpression") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isObjectMethod(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ObjectMethod") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isObjectProperty(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ObjectProperty") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isRestElement(node, opts) {
+ if (!node) return false;
+ if (node.type !== "RestElement") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isReturnStatement(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ReturnStatement") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isSequenceExpression(node, opts) {
+ if (!node) return false;
+ if (node.type !== "SequenceExpression") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isParenthesizedExpression(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ParenthesizedExpression") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isSwitchCase(node, opts) {
+ if (!node) return false;
+ if (node.type !== "SwitchCase") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isSwitchStatement(node, opts) {
+ if (!node) return false;
+ if (node.type !== "SwitchStatement") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isThisExpression(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ThisExpression") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isThrowStatement(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ThrowStatement") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTryStatement(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TryStatement") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isUnaryExpression(node, opts) {
+ if (!node) return false;
+ if (node.type !== "UnaryExpression") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isUpdateExpression(node, opts) {
+ if (!node) return false;
+ if (node.type !== "UpdateExpression") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isVariableDeclaration(node, opts) {
+ if (!node) return false;
+ if (node.type !== "VariableDeclaration") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isVariableDeclarator(node, opts) {
+ if (!node) return false;
+ if (node.type !== "VariableDeclarator") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isWhileStatement(node, opts) {
+ if (!node) return false;
+ if (node.type !== "WhileStatement") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isWithStatement(node, opts) {
+ if (!node) return false;
+ if (node.type !== "WithStatement") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isAssignmentPattern(node, opts) {
+ if (!node) return false;
+ if (node.type !== "AssignmentPattern") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isArrayPattern(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ArrayPattern") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isArrowFunctionExpression(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ArrowFunctionExpression") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isClassBody(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ClassBody") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isClassExpression(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ClassExpression") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isClassDeclaration(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ClassDeclaration") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isExportAllDeclaration(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ExportAllDeclaration") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isExportDefaultDeclaration(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ExportDefaultDeclaration") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isExportNamedDeclaration(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ExportNamedDeclaration") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isExportSpecifier(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ExportSpecifier") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isForOfStatement(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ForOfStatement") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isImportDeclaration(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ImportDeclaration") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isImportDefaultSpecifier(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ImportDefaultSpecifier") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isImportNamespaceSpecifier(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ImportNamespaceSpecifier") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isImportSpecifier(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ImportSpecifier") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isImportExpression(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ImportExpression") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isMetaProperty(node, opts) {
+ if (!node) return false;
+ if (node.type !== "MetaProperty") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isClassMethod(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ClassMethod") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isObjectPattern(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ObjectPattern") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isSpreadElement(node, opts) {
+ if (!node) return false;
+ if (node.type !== "SpreadElement") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isSuper(node, opts) {
+ if (!node) return false;
+ if (node.type !== "Super") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTaggedTemplateExpression(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TaggedTemplateExpression") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTemplateElement(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TemplateElement") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTemplateLiteral(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TemplateLiteral") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isYieldExpression(node, opts) {
+ if (!node) return false;
+ if (node.type !== "YieldExpression") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isAwaitExpression(node, opts) {
+ if (!node) return false;
+ if (node.type !== "AwaitExpression") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isImport(node, opts) {
+ if (!node) return false;
+ if (node.type !== "Import") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isBigIntLiteral(node, opts) {
+ if (!node) return false;
+ if (node.type !== "BigIntLiteral") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isExportNamespaceSpecifier(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ExportNamespaceSpecifier") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isOptionalMemberExpression(node, opts) {
+ if (!node) return false;
+ if (node.type !== "OptionalMemberExpression") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isOptionalCallExpression(node, opts) {
+ if (!node) return false;
+ if (node.type !== "OptionalCallExpression") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isClassProperty(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ClassProperty") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isClassAccessorProperty(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ClassAccessorProperty") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isClassPrivateProperty(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ClassPrivateProperty") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isClassPrivateMethod(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ClassPrivateMethod") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isPrivateName(node, opts) {
+ if (!node) return false;
+ if (node.type !== "PrivateName") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isStaticBlock(node, opts) {
+ if (!node) return false;
+ if (node.type !== "StaticBlock") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isAnyTypeAnnotation(node, opts) {
+ if (!node) return false;
+ if (node.type !== "AnyTypeAnnotation") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isArrayTypeAnnotation(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ArrayTypeAnnotation") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isBooleanTypeAnnotation(node, opts) {
+ if (!node) return false;
+ if (node.type !== "BooleanTypeAnnotation") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isBooleanLiteralTypeAnnotation(node, opts) {
+ if (!node) return false;
+ if (node.type !== "BooleanLiteralTypeAnnotation") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isNullLiteralTypeAnnotation(node, opts) {
+ if (!node) return false;
+ if (node.type !== "NullLiteralTypeAnnotation") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isClassImplements(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ClassImplements") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isDeclareClass(node, opts) {
+ if (!node) return false;
+ if (node.type !== "DeclareClass") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isDeclareFunction(node, opts) {
+ if (!node) return false;
+ if (node.type !== "DeclareFunction") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isDeclareInterface(node, opts) {
+ if (!node) return false;
+ if (node.type !== "DeclareInterface") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isDeclareModule(node, opts) {
+ if (!node) return false;
+ if (node.type !== "DeclareModule") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isDeclareModuleExports(node, opts) {
+ if (!node) return false;
+ if (node.type !== "DeclareModuleExports") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isDeclareTypeAlias(node, opts) {
+ if (!node) return false;
+ if (node.type !== "DeclareTypeAlias") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isDeclareOpaqueType(node, opts) {
+ if (!node) return false;
+ if (node.type !== "DeclareOpaqueType") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isDeclareVariable(node, opts) {
+ if (!node) return false;
+ if (node.type !== "DeclareVariable") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isDeclareExportDeclaration(node, opts) {
+ if (!node) return false;
+ if (node.type !== "DeclareExportDeclaration") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isDeclareExportAllDeclaration(node, opts) {
+ if (!node) return false;
+ if (node.type !== "DeclareExportAllDeclaration") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isDeclaredPredicate(node, opts) {
+ if (!node) return false;
+ if (node.type !== "DeclaredPredicate") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isExistsTypeAnnotation(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ExistsTypeAnnotation") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isFunctionTypeAnnotation(node, opts) {
+ if (!node) return false;
+ if (node.type !== "FunctionTypeAnnotation") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isFunctionTypeParam(node, opts) {
+ if (!node) return false;
+ if (node.type !== "FunctionTypeParam") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isGenericTypeAnnotation(node, opts) {
+ if (!node) return false;
+ if (node.type !== "GenericTypeAnnotation") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isInferredPredicate(node, opts) {
+ if (!node) return false;
+ if (node.type !== "InferredPredicate") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isInterfaceExtends(node, opts) {
+ if (!node) return false;
+ if (node.type !== "InterfaceExtends") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isInterfaceDeclaration(node, opts) {
+ if (!node) return false;
+ if (node.type !== "InterfaceDeclaration") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isInterfaceTypeAnnotation(node, opts) {
+ if (!node) return false;
+ if (node.type !== "InterfaceTypeAnnotation") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isIntersectionTypeAnnotation(node, opts) {
+ if (!node) return false;
+ if (node.type !== "IntersectionTypeAnnotation") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isMixedTypeAnnotation(node, opts) {
+ if (!node) return false;
+ if (node.type !== "MixedTypeAnnotation") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isEmptyTypeAnnotation(node, opts) {
+ if (!node) return false;
+ if (node.type !== "EmptyTypeAnnotation") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isNullableTypeAnnotation(node, opts) {
+ if (!node) return false;
+ if (node.type !== "NullableTypeAnnotation") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isNumberLiteralTypeAnnotation(node, opts) {
+ if (!node) return false;
+ if (node.type !== "NumberLiteralTypeAnnotation") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isNumberTypeAnnotation(node, opts) {
+ if (!node) return false;
+ if (node.type !== "NumberTypeAnnotation") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isObjectTypeAnnotation(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ObjectTypeAnnotation") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isObjectTypeInternalSlot(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ObjectTypeInternalSlot") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isObjectTypeCallProperty(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ObjectTypeCallProperty") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isObjectTypeIndexer(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ObjectTypeIndexer") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isObjectTypeProperty(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ObjectTypeProperty") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isObjectTypeSpreadProperty(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ObjectTypeSpreadProperty") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isOpaqueType(node, opts) {
+ if (!node) return false;
+ if (node.type !== "OpaqueType") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isQualifiedTypeIdentifier(node, opts) {
+ if (!node) return false;
+ if (node.type !== "QualifiedTypeIdentifier") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isStringLiteralTypeAnnotation(node, opts) {
+ if (!node) return false;
+ if (node.type !== "StringLiteralTypeAnnotation") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isStringTypeAnnotation(node, opts) {
+ if (!node) return false;
+ if (node.type !== "StringTypeAnnotation") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isSymbolTypeAnnotation(node, opts) {
+ if (!node) return false;
+ if (node.type !== "SymbolTypeAnnotation") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isThisTypeAnnotation(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ThisTypeAnnotation") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTupleTypeAnnotation(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TupleTypeAnnotation") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTypeofTypeAnnotation(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TypeofTypeAnnotation") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTypeAlias(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TypeAlias") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTypeAnnotation(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TypeAnnotation") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTypeCastExpression(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TypeCastExpression") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTypeParameter(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TypeParameter") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTypeParameterDeclaration(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TypeParameterDeclaration") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTypeParameterInstantiation(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TypeParameterInstantiation") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isUnionTypeAnnotation(node, opts) {
+ if (!node) return false;
+ if (node.type !== "UnionTypeAnnotation") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isVariance(node, opts) {
+ if (!node) return false;
+ if (node.type !== "Variance") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isVoidTypeAnnotation(node, opts) {
+ if (!node) return false;
+ if (node.type !== "VoidTypeAnnotation") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isEnumDeclaration(node, opts) {
+ if (!node) return false;
+ if (node.type !== "EnumDeclaration") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isEnumBooleanBody(node, opts) {
+ if (!node) return false;
+ if (node.type !== "EnumBooleanBody") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isEnumNumberBody(node, opts) {
+ if (!node) return false;
+ if (node.type !== "EnumNumberBody") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isEnumStringBody(node, opts) {
+ if (!node) return false;
+ if (node.type !== "EnumStringBody") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isEnumSymbolBody(node, opts) {
+ if (!node) return false;
+ if (node.type !== "EnumSymbolBody") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isEnumBooleanMember(node, opts) {
+ if (!node) return false;
+ if (node.type !== "EnumBooleanMember") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isEnumNumberMember(node, opts) {
+ if (!node) return false;
+ if (node.type !== "EnumNumberMember") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isEnumStringMember(node, opts) {
+ if (!node) return false;
+ if (node.type !== "EnumStringMember") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isEnumDefaultedMember(node, opts) {
+ if (!node) return false;
+ if (node.type !== "EnumDefaultedMember") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isIndexedAccessType(node, opts) {
+ if (!node) return false;
+ if (node.type !== "IndexedAccessType") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isOptionalIndexedAccessType(node, opts) {
+ if (!node) return false;
+ if (node.type !== "OptionalIndexedAccessType") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isJSXAttribute(node, opts) {
+ if (!node) return false;
+ if (node.type !== "JSXAttribute") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isJSXClosingElement(node, opts) {
+ if (!node) return false;
+ if (node.type !== "JSXClosingElement") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isJSXElement(node, opts) {
+ if (!node) return false;
+ if (node.type !== "JSXElement") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isJSXEmptyExpression(node, opts) {
+ if (!node) return false;
+ if (node.type !== "JSXEmptyExpression") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isJSXExpressionContainer(node, opts) {
+ if (!node) return false;
+ if (node.type !== "JSXExpressionContainer") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isJSXSpreadChild(node, opts) {
+ if (!node) return false;
+ if (node.type !== "JSXSpreadChild") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isJSXIdentifier(node, opts) {
+ if (!node) return false;
+ if (node.type !== "JSXIdentifier") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isJSXMemberExpression(node, opts) {
+ if (!node) return false;
+ if (node.type !== "JSXMemberExpression") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isJSXNamespacedName(node, opts) {
+ if (!node) return false;
+ if (node.type !== "JSXNamespacedName") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isJSXOpeningElement(node, opts) {
+ if (!node) return false;
+ if (node.type !== "JSXOpeningElement") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isJSXSpreadAttribute(node, opts) {
+ if (!node) return false;
+ if (node.type !== "JSXSpreadAttribute") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isJSXText(node, opts) {
+ if (!node) return false;
+ if (node.type !== "JSXText") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isJSXFragment(node, opts) {
+ if (!node) return false;
+ if (node.type !== "JSXFragment") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isJSXOpeningFragment(node, opts) {
+ if (!node) return false;
+ if (node.type !== "JSXOpeningFragment") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isJSXClosingFragment(node, opts) {
+ if (!node) return false;
+ if (node.type !== "JSXClosingFragment") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isNoop(node, opts) {
+ if (!node) return false;
+ if (node.type !== "Noop") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isPlaceholder(node, opts) {
+ if (!node) return false;
+ if (node.type !== "Placeholder") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isV8IntrinsicIdentifier(node, opts) {
+ if (!node) return false;
+ if (node.type !== "V8IntrinsicIdentifier") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isArgumentPlaceholder(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ArgumentPlaceholder") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isBindExpression(node, opts) {
+ if (!node) return false;
+ if (node.type !== "BindExpression") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isImportAttribute(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ImportAttribute") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isDecorator(node, opts) {
+ if (!node) return false;
+ if (node.type !== "Decorator") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isDoExpression(node, opts) {
+ if (!node) return false;
+ if (node.type !== "DoExpression") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isExportDefaultSpecifier(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ExportDefaultSpecifier") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isRecordExpression(node, opts) {
+ if (!node) return false;
+ if (node.type !== "RecordExpression") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTupleExpression(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TupleExpression") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isDecimalLiteral(node, opts) {
+ if (!node) return false;
+ if (node.type !== "DecimalLiteral") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isModuleExpression(node, opts) {
+ if (!node) return false;
+ if (node.type !== "ModuleExpression") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTopicReference(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TopicReference") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isPipelineTopicExpression(node, opts) {
+ if (!node) return false;
+ if (node.type !== "PipelineTopicExpression") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isPipelineBareFunction(node, opts) {
+ if (!node) return false;
+ if (node.type !== "PipelineBareFunction") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isPipelinePrimaryTopicReference(node, opts) {
+ if (!node) return false;
+ if (node.type !== "PipelinePrimaryTopicReference") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSParameterProperty(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSParameterProperty") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSDeclareFunction(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSDeclareFunction") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSDeclareMethod(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSDeclareMethod") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSQualifiedName(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSQualifiedName") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSCallSignatureDeclaration(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSCallSignatureDeclaration") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSConstructSignatureDeclaration(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSConstructSignatureDeclaration") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSPropertySignature(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSPropertySignature") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSMethodSignature(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSMethodSignature") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSIndexSignature(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSIndexSignature") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSAnyKeyword(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSAnyKeyword") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSBooleanKeyword(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSBooleanKeyword") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSBigIntKeyword(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSBigIntKeyword") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSIntrinsicKeyword(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSIntrinsicKeyword") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSNeverKeyword(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSNeverKeyword") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSNullKeyword(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSNullKeyword") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSNumberKeyword(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSNumberKeyword") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSObjectKeyword(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSObjectKeyword") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSStringKeyword(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSStringKeyword") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSSymbolKeyword(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSSymbolKeyword") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSUndefinedKeyword(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSUndefinedKeyword") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSUnknownKeyword(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSUnknownKeyword") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSVoidKeyword(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSVoidKeyword") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSThisType(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSThisType") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSFunctionType(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSFunctionType") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSConstructorType(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSConstructorType") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSTypeReference(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSTypeReference") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSTypePredicate(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSTypePredicate") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSTypeQuery(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSTypeQuery") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSTypeLiteral(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSTypeLiteral") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSArrayType(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSArrayType") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSTupleType(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSTupleType") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSOptionalType(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSOptionalType") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSRestType(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSRestType") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSNamedTupleMember(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSNamedTupleMember") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSUnionType(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSUnionType") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSIntersectionType(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSIntersectionType") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSConditionalType(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSConditionalType") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSInferType(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSInferType") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSParenthesizedType(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSParenthesizedType") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSTypeOperator(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSTypeOperator") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSIndexedAccessType(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSIndexedAccessType") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSMappedType(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSMappedType") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSLiteralType(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSLiteralType") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSExpressionWithTypeArguments(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSExpressionWithTypeArguments") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSInterfaceDeclaration(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSInterfaceDeclaration") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSInterfaceBody(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSInterfaceBody") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSTypeAliasDeclaration(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSTypeAliasDeclaration") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSInstantiationExpression(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSInstantiationExpression") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSAsExpression(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSAsExpression") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSSatisfiesExpression(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSSatisfiesExpression") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSTypeAssertion(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSTypeAssertion") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSEnumDeclaration(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSEnumDeclaration") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSEnumMember(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSEnumMember") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSModuleDeclaration(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSModuleDeclaration") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSModuleBlock(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSModuleBlock") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSImportType(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSImportType") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSImportEqualsDeclaration(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSImportEqualsDeclaration") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSExternalModuleReference(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSExternalModuleReference") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSNonNullExpression(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSNonNullExpression") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSExportAssignment(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSExportAssignment") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSNamespaceExportDeclaration(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSNamespaceExportDeclaration") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSTypeAnnotation(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSTypeAnnotation") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSTypeParameterInstantiation(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSTypeParameterInstantiation") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSTypeParameterDeclaration(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSTypeParameterDeclaration") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSTypeParameter(node, opts) {
+ if (!node) return false;
+ if (node.type !== "TSTypeParameter") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isStandardized(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "ArrayExpression":
+ case "AssignmentExpression":
+ case "BinaryExpression":
+ case "InterpreterDirective":
+ case "Directive":
+ case "DirectiveLiteral":
+ case "BlockStatement":
+ case "BreakStatement":
+ case "CallExpression":
+ case "CatchClause":
+ case "ConditionalExpression":
+ case "ContinueStatement":
+ case "DebuggerStatement":
+ case "DoWhileStatement":
+ case "EmptyStatement":
+ case "ExpressionStatement":
+ case "File":
+ case "ForInStatement":
+ case "ForStatement":
+ case "FunctionDeclaration":
+ case "FunctionExpression":
+ case "Identifier":
+ case "IfStatement":
+ case "LabeledStatement":
+ case "StringLiteral":
+ case "NumericLiteral":
+ case "NullLiteral":
+ case "BooleanLiteral":
+ case "RegExpLiteral":
+ case "LogicalExpression":
+ case "MemberExpression":
+ case "NewExpression":
+ case "Program":
+ case "ObjectExpression":
+ case "ObjectMethod":
+ case "ObjectProperty":
+ case "RestElement":
+ case "ReturnStatement":
+ case "SequenceExpression":
+ case "ParenthesizedExpression":
+ case "SwitchCase":
+ case "SwitchStatement":
+ case "ThisExpression":
+ case "ThrowStatement":
+ case "TryStatement":
+ case "UnaryExpression":
+ case "UpdateExpression":
+ case "VariableDeclaration":
+ case "VariableDeclarator":
+ case "WhileStatement":
+ case "WithStatement":
+ case "AssignmentPattern":
+ case "ArrayPattern":
+ case "ArrowFunctionExpression":
+ case "ClassBody":
+ case "ClassExpression":
+ case "ClassDeclaration":
+ case "ExportAllDeclaration":
+ case "ExportDefaultDeclaration":
+ case "ExportNamedDeclaration":
+ case "ExportSpecifier":
+ case "ForOfStatement":
+ case "ImportDeclaration":
+ case "ImportDefaultSpecifier":
+ case "ImportNamespaceSpecifier":
+ case "ImportSpecifier":
+ case "ImportExpression":
+ case "MetaProperty":
+ case "ClassMethod":
+ case "ObjectPattern":
+ case "SpreadElement":
+ case "Super":
+ case "TaggedTemplateExpression":
+ case "TemplateElement":
+ case "TemplateLiteral":
+ case "YieldExpression":
+ case "AwaitExpression":
+ case "Import":
+ case "BigIntLiteral":
+ case "ExportNamespaceSpecifier":
+ case "OptionalMemberExpression":
+ case "OptionalCallExpression":
+ case "ClassProperty":
+ case "ClassAccessorProperty":
+ case "ClassPrivateProperty":
+ case "ClassPrivateMethod":
+ case "PrivateName":
+ case "StaticBlock":
+ break;
+ case "Placeholder":
+ switch (node.expectedNode) {
+ case "Identifier":
+ case "StringLiteral":
+ case "BlockStatement":
+ case "ClassBody":
+ break;
+ default:
+ return false;
+ }
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isExpression(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "ArrayExpression":
+ case "AssignmentExpression":
+ case "BinaryExpression":
+ case "CallExpression":
+ case "ConditionalExpression":
+ case "FunctionExpression":
+ case "Identifier":
+ case "StringLiteral":
+ case "NumericLiteral":
+ case "NullLiteral":
+ case "BooleanLiteral":
+ case "RegExpLiteral":
+ case "LogicalExpression":
+ case "MemberExpression":
+ case "NewExpression":
+ case "ObjectExpression":
+ case "SequenceExpression":
+ case "ParenthesizedExpression":
+ case "ThisExpression":
+ case "UnaryExpression":
+ case "UpdateExpression":
+ case "ArrowFunctionExpression":
+ case "ClassExpression":
+ case "ImportExpression":
+ case "MetaProperty":
+ case "Super":
+ case "TaggedTemplateExpression":
+ case "TemplateLiteral":
+ case "YieldExpression":
+ case "AwaitExpression":
+ case "Import":
+ case "BigIntLiteral":
+ case "OptionalMemberExpression":
+ case "OptionalCallExpression":
+ case "TypeCastExpression":
+ case "JSXElement":
+ case "JSXFragment":
+ case "BindExpression":
+ case "DoExpression":
+ case "RecordExpression":
+ case "TupleExpression":
+ case "DecimalLiteral":
+ case "ModuleExpression":
+ case "TopicReference":
+ case "PipelineTopicExpression":
+ case "PipelineBareFunction":
+ case "PipelinePrimaryTopicReference":
+ case "TSInstantiationExpression":
+ case "TSAsExpression":
+ case "TSSatisfiesExpression":
+ case "TSTypeAssertion":
+ case "TSNonNullExpression":
+ break;
+ case "Placeholder":
+ switch (node.expectedNode) {
+ case "Expression":
+ case "Identifier":
+ case "StringLiteral":
+ break;
+ default:
+ return false;
+ }
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isBinary(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "BinaryExpression":
+ case "LogicalExpression":
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isScopable(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "BlockStatement":
+ case "CatchClause":
+ case "DoWhileStatement":
+ case "ForInStatement":
+ case "ForStatement":
+ case "FunctionDeclaration":
+ case "FunctionExpression":
+ case "Program":
+ case "ObjectMethod":
+ case "SwitchStatement":
+ case "WhileStatement":
+ case "ArrowFunctionExpression":
+ case "ClassExpression":
+ case "ClassDeclaration":
+ case "ForOfStatement":
+ case "ClassMethod":
+ case "ClassPrivateMethod":
+ case "StaticBlock":
+ case "TSModuleBlock":
+ break;
+ case "Placeholder":
+ if (node.expectedNode === "BlockStatement") break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isBlockParent(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "BlockStatement":
+ case "CatchClause":
+ case "DoWhileStatement":
+ case "ForInStatement":
+ case "ForStatement":
+ case "FunctionDeclaration":
+ case "FunctionExpression":
+ case "Program":
+ case "ObjectMethod":
+ case "SwitchStatement":
+ case "WhileStatement":
+ case "ArrowFunctionExpression":
+ case "ForOfStatement":
+ case "ClassMethod":
+ case "ClassPrivateMethod":
+ case "StaticBlock":
+ case "TSModuleBlock":
+ break;
+ case "Placeholder":
+ if (node.expectedNode === "BlockStatement") break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isBlock(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "BlockStatement":
+ case "Program":
+ case "TSModuleBlock":
+ break;
+ case "Placeholder":
+ if (node.expectedNode === "BlockStatement") break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isStatement(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "BlockStatement":
+ case "BreakStatement":
+ case "ContinueStatement":
+ case "DebuggerStatement":
+ case "DoWhileStatement":
+ case "EmptyStatement":
+ case "ExpressionStatement":
+ case "ForInStatement":
+ case "ForStatement":
+ case "FunctionDeclaration":
+ case "IfStatement":
+ case "LabeledStatement":
+ case "ReturnStatement":
+ case "SwitchStatement":
+ case "ThrowStatement":
+ case "TryStatement":
+ case "VariableDeclaration":
+ case "WhileStatement":
+ case "WithStatement":
+ case "ClassDeclaration":
+ case "ExportAllDeclaration":
+ case "ExportDefaultDeclaration":
+ case "ExportNamedDeclaration":
+ case "ForOfStatement":
+ case "ImportDeclaration":
+ case "DeclareClass":
+ case "DeclareFunction":
+ case "DeclareInterface":
+ case "DeclareModule":
+ case "DeclareModuleExports":
+ case "DeclareTypeAlias":
+ case "DeclareOpaqueType":
+ case "DeclareVariable":
+ case "DeclareExportDeclaration":
+ case "DeclareExportAllDeclaration":
+ case "InterfaceDeclaration":
+ case "OpaqueType":
+ case "TypeAlias":
+ case "EnumDeclaration":
+ case "TSDeclareFunction":
+ case "TSInterfaceDeclaration":
+ case "TSTypeAliasDeclaration":
+ case "TSEnumDeclaration":
+ case "TSModuleDeclaration":
+ case "TSImportEqualsDeclaration":
+ case "TSExportAssignment":
+ case "TSNamespaceExportDeclaration":
+ break;
+ case "Placeholder":
+ switch (node.expectedNode) {
+ case "Statement":
+ case "Declaration":
+ case "BlockStatement":
+ break;
+ default:
+ return false;
+ }
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTerminatorless(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "BreakStatement":
+ case "ContinueStatement":
+ case "ReturnStatement":
+ case "ThrowStatement":
+ case "YieldExpression":
+ case "AwaitExpression":
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isCompletionStatement(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "BreakStatement":
+ case "ContinueStatement":
+ case "ReturnStatement":
+ case "ThrowStatement":
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isConditional(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "ConditionalExpression":
+ case "IfStatement":
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isLoop(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "DoWhileStatement":
+ case "ForInStatement":
+ case "ForStatement":
+ case "WhileStatement":
+ case "ForOfStatement":
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isWhile(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "DoWhileStatement":
+ case "WhileStatement":
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isExpressionWrapper(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "ExpressionStatement":
+ case "ParenthesizedExpression":
+ case "TypeCastExpression":
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isFor(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "ForInStatement":
+ case "ForStatement":
+ case "ForOfStatement":
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isForXStatement(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "ForInStatement":
+ case "ForOfStatement":
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isFunction(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "FunctionDeclaration":
+ case "FunctionExpression":
+ case "ObjectMethod":
+ case "ArrowFunctionExpression":
+ case "ClassMethod":
+ case "ClassPrivateMethod":
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isFunctionParent(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "FunctionDeclaration":
+ case "FunctionExpression":
+ case "ObjectMethod":
+ case "ArrowFunctionExpression":
+ case "ClassMethod":
+ case "ClassPrivateMethod":
+ case "StaticBlock":
+ case "TSModuleBlock":
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isPureish(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "FunctionDeclaration":
+ case "FunctionExpression":
+ case "StringLiteral":
+ case "NumericLiteral":
+ case "NullLiteral":
+ case "BooleanLiteral":
+ case "RegExpLiteral":
+ case "ArrowFunctionExpression":
+ case "BigIntLiteral":
+ case "DecimalLiteral":
+ break;
+ case "Placeholder":
+ if (node.expectedNode === "StringLiteral") break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isDeclaration(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "FunctionDeclaration":
+ case "VariableDeclaration":
+ case "ClassDeclaration":
+ case "ExportAllDeclaration":
+ case "ExportDefaultDeclaration":
+ case "ExportNamedDeclaration":
+ case "ImportDeclaration":
+ case "DeclareClass":
+ case "DeclareFunction":
+ case "DeclareInterface":
+ case "DeclareModule":
+ case "DeclareModuleExports":
+ case "DeclareTypeAlias":
+ case "DeclareOpaqueType":
+ case "DeclareVariable":
+ case "DeclareExportDeclaration":
+ case "DeclareExportAllDeclaration":
+ case "InterfaceDeclaration":
+ case "OpaqueType":
+ case "TypeAlias":
+ case "EnumDeclaration":
+ case "TSDeclareFunction":
+ case "TSInterfaceDeclaration":
+ case "TSTypeAliasDeclaration":
+ case "TSEnumDeclaration":
+ case "TSModuleDeclaration":
+ break;
+ case "Placeholder":
+ if (node.expectedNode === "Declaration") break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isPatternLike(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "Identifier":
+ case "RestElement":
+ case "AssignmentPattern":
+ case "ArrayPattern":
+ case "ObjectPattern":
+ case "TSAsExpression":
+ case "TSSatisfiesExpression":
+ case "TSTypeAssertion":
+ case "TSNonNullExpression":
+ break;
+ case "Placeholder":
+ switch (node.expectedNode) {
+ case "Pattern":
+ case "Identifier":
+ break;
+ default:
+ return false;
+ }
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isLVal(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "Identifier":
+ case "MemberExpression":
+ case "RestElement":
+ case "AssignmentPattern":
+ case "ArrayPattern":
+ case "ObjectPattern":
+ case "TSParameterProperty":
+ case "TSAsExpression":
+ case "TSSatisfiesExpression":
+ case "TSTypeAssertion":
+ case "TSNonNullExpression":
+ break;
+ case "Placeholder":
+ switch (node.expectedNode) {
+ case "Pattern":
+ case "Identifier":
+ break;
+ default:
+ return false;
+ }
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSEntityName(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "Identifier":
+ case "TSQualifiedName":
+ break;
+ case "Placeholder":
+ if (node.expectedNode === "Identifier") break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isLiteral(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "StringLiteral":
+ case "NumericLiteral":
+ case "NullLiteral":
+ case "BooleanLiteral":
+ case "RegExpLiteral":
+ case "TemplateLiteral":
+ case "BigIntLiteral":
+ case "DecimalLiteral":
+ break;
+ case "Placeholder":
+ if (node.expectedNode === "StringLiteral") break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isImmutable(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "StringLiteral":
+ case "NumericLiteral":
+ case "NullLiteral":
+ case "BooleanLiteral":
+ case "BigIntLiteral":
+ case "JSXAttribute":
+ case "JSXClosingElement":
+ case "JSXElement":
+ case "JSXExpressionContainer":
+ case "JSXSpreadChild":
+ case "JSXOpeningElement":
+ case "JSXText":
+ case "JSXFragment":
+ case "JSXOpeningFragment":
+ case "JSXClosingFragment":
+ case "DecimalLiteral":
+ break;
+ case "Placeholder":
+ if (node.expectedNode === "StringLiteral") break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isUserWhitespacable(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "ObjectMethod":
+ case "ObjectProperty":
+ case "ObjectTypeInternalSlot":
+ case "ObjectTypeCallProperty":
+ case "ObjectTypeIndexer":
+ case "ObjectTypeProperty":
+ case "ObjectTypeSpreadProperty":
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isMethod(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "ObjectMethod":
+ case "ClassMethod":
+ case "ClassPrivateMethod":
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isObjectMember(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "ObjectMethod":
+ case "ObjectProperty":
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isProperty(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "ObjectProperty":
+ case "ClassProperty":
+ case "ClassAccessorProperty":
+ case "ClassPrivateProperty":
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isUnaryLike(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "UnaryExpression":
+ case "SpreadElement":
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isPattern(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "AssignmentPattern":
+ case "ArrayPattern":
+ case "ObjectPattern":
+ break;
+ case "Placeholder":
+ if (node.expectedNode === "Pattern") break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isClass(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "ClassExpression":
+ case "ClassDeclaration":
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isImportOrExportDeclaration(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "ExportAllDeclaration":
+ case "ExportDefaultDeclaration":
+ case "ExportNamedDeclaration":
+ case "ImportDeclaration":
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isExportDeclaration(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "ExportAllDeclaration":
+ case "ExportDefaultDeclaration":
+ case "ExportNamedDeclaration":
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isModuleSpecifier(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "ExportSpecifier":
+ case "ImportDefaultSpecifier":
+ case "ImportNamespaceSpecifier":
+ case "ImportSpecifier":
+ case "ExportNamespaceSpecifier":
+ case "ExportDefaultSpecifier":
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isAccessor(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "ClassAccessorProperty":
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isPrivate(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "ClassPrivateProperty":
+ case "ClassPrivateMethod":
+ case "PrivateName":
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isFlow(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "AnyTypeAnnotation":
+ case "ArrayTypeAnnotation":
+ case "BooleanTypeAnnotation":
+ case "BooleanLiteralTypeAnnotation":
+ case "NullLiteralTypeAnnotation":
+ case "ClassImplements":
+ case "DeclareClass":
+ case "DeclareFunction":
+ case "DeclareInterface":
+ case "DeclareModule":
+ case "DeclareModuleExports":
+ case "DeclareTypeAlias":
+ case "DeclareOpaqueType":
+ case "DeclareVariable":
+ case "DeclareExportDeclaration":
+ case "DeclareExportAllDeclaration":
+ case "DeclaredPredicate":
+ case "ExistsTypeAnnotation":
+ case "FunctionTypeAnnotation":
+ case "FunctionTypeParam":
+ case "GenericTypeAnnotation":
+ case "InferredPredicate":
+ case "InterfaceExtends":
+ case "InterfaceDeclaration":
+ case "InterfaceTypeAnnotation":
+ case "IntersectionTypeAnnotation":
+ case "MixedTypeAnnotation":
+ case "EmptyTypeAnnotation":
+ case "NullableTypeAnnotation":
+ case "NumberLiteralTypeAnnotation":
+ case "NumberTypeAnnotation":
+ case "ObjectTypeAnnotation":
+ case "ObjectTypeInternalSlot":
+ case "ObjectTypeCallProperty":
+ case "ObjectTypeIndexer":
+ case "ObjectTypeProperty":
+ case "ObjectTypeSpreadProperty":
+ case "OpaqueType":
+ case "QualifiedTypeIdentifier":
+ case "StringLiteralTypeAnnotation":
+ case "StringTypeAnnotation":
+ case "SymbolTypeAnnotation":
+ case "ThisTypeAnnotation":
+ case "TupleTypeAnnotation":
+ case "TypeofTypeAnnotation":
+ case "TypeAlias":
+ case "TypeAnnotation":
+ case "TypeCastExpression":
+ case "TypeParameter":
+ case "TypeParameterDeclaration":
+ case "TypeParameterInstantiation":
+ case "UnionTypeAnnotation":
+ case "Variance":
+ case "VoidTypeAnnotation":
+ case "EnumDeclaration":
+ case "EnumBooleanBody":
+ case "EnumNumberBody":
+ case "EnumStringBody":
+ case "EnumSymbolBody":
+ case "EnumBooleanMember":
+ case "EnumNumberMember":
+ case "EnumStringMember":
+ case "EnumDefaultedMember":
+ case "IndexedAccessType":
+ case "OptionalIndexedAccessType":
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isFlowType(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "AnyTypeAnnotation":
+ case "ArrayTypeAnnotation":
+ case "BooleanTypeAnnotation":
+ case "BooleanLiteralTypeAnnotation":
+ case "NullLiteralTypeAnnotation":
+ case "ExistsTypeAnnotation":
+ case "FunctionTypeAnnotation":
+ case "GenericTypeAnnotation":
+ case "InterfaceTypeAnnotation":
+ case "IntersectionTypeAnnotation":
+ case "MixedTypeAnnotation":
+ case "EmptyTypeAnnotation":
+ case "NullableTypeAnnotation":
+ case "NumberLiteralTypeAnnotation":
+ case "NumberTypeAnnotation":
+ case "ObjectTypeAnnotation":
+ case "StringLiteralTypeAnnotation":
+ case "StringTypeAnnotation":
+ case "SymbolTypeAnnotation":
+ case "ThisTypeAnnotation":
+ case "TupleTypeAnnotation":
+ case "TypeofTypeAnnotation":
+ case "UnionTypeAnnotation":
+ case "VoidTypeAnnotation":
+ case "IndexedAccessType":
+ case "OptionalIndexedAccessType":
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isFlowBaseAnnotation(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "AnyTypeAnnotation":
+ case "BooleanTypeAnnotation":
+ case "NullLiteralTypeAnnotation":
+ case "MixedTypeAnnotation":
+ case "EmptyTypeAnnotation":
+ case "NumberTypeAnnotation":
+ case "StringTypeAnnotation":
+ case "SymbolTypeAnnotation":
+ case "ThisTypeAnnotation":
+ case "VoidTypeAnnotation":
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isFlowDeclaration(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "DeclareClass":
+ case "DeclareFunction":
+ case "DeclareInterface":
+ case "DeclareModule":
+ case "DeclareModuleExports":
+ case "DeclareTypeAlias":
+ case "DeclareOpaqueType":
+ case "DeclareVariable":
+ case "DeclareExportDeclaration":
+ case "DeclareExportAllDeclaration":
+ case "InterfaceDeclaration":
+ case "OpaqueType":
+ case "TypeAlias":
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isFlowPredicate(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "DeclaredPredicate":
+ case "InferredPredicate":
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isEnumBody(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "EnumBooleanBody":
+ case "EnumNumberBody":
+ case "EnumStringBody":
+ case "EnumSymbolBody":
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isEnumMember(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "EnumBooleanMember":
+ case "EnumNumberMember":
+ case "EnumStringMember":
+ case "EnumDefaultedMember":
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isJSX(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "JSXAttribute":
+ case "JSXClosingElement":
+ case "JSXElement":
+ case "JSXEmptyExpression":
+ case "JSXExpressionContainer":
+ case "JSXSpreadChild":
+ case "JSXIdentifier":
+ case "JSXMemberExpression":
+ case "JSXNamespacedName":
+ case "JSXOpeningElement":
+ case "JSXSpreadAttribute":
+ case "JSXText":
+ case "JSXFragment":
+ case "JSXOpeningFragment":
+ case "JSXClosingFragment":
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isMiscellaneous(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "Noop":
+ case "Placeholder":
+ case "V8IntrinsicIdentifier":
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTypeScript(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "TSParameterProperty":
+ case "TSDeclareFunction":
+ case "TSDeclareMethod":
+ case "TSQualifiedName":
+ case "TSCallSignatureDeclaration":
+ case "TSConstructSignatureDeclaration":
+ case "TSPropertySignature":
+ case "TSMethodSignature":
+ case "TSIndexSignature":
+ case "TSAnyKeyword":
+ case "TSBooleanKeyword":
+ case "TSBigIntKeyword":
+ case "TSIntrinsicKeyword":
+ case "TSNeverKeyword":
+ case "TSNullKeyword":
+ case "TSNumberKeyword":
+ case "TSObjectKeyword":
+ case "TSStringKeyword":
+ case "TSSymbolKeyword":
+ case "TSUndefinedKeyword":
+ case "TSUnknownKeyword":
+ case "TSVoidKeyword":
+ case "TSThisType":
+ case "TSFunctionType":
+ case "TSConstructorType":
+ case "TSTypeReference":
+ case "TSTypePredicate":
+ case "TSTypeQuery":
+ case "TSTypeLiteral":
+ case "TSArrayType":
+ case "TSTupleType":
+ case "TSOptionalType":
+ case "TSRestType":
+ case "TSNamedTupleMember":
+ case "TSUnionType":
+ case "TSIntersectionType":
+ case "TSConditionalType":
+ case "TSInferType":
+ case "TSParenthesizedType":
+ case "TSTypeOperator":
+ case "TSIndexedAccessType":
+ case "TSMappedType":
+ case "TSLiteralType":
+ case "TSExpressionWithTypeArguments":
+ case "TSInterfaceDeclaration":
+ case "TSInterfaceBody":
+ case "TSTypeAliasDeclaration":
+ case "TSInstantiationExpression":
+ case "TSAsExpression":
+ case "TSSatisfiesExpression":
+ case "TSTypeAssertion":
+ case "TSEnumDeclaration":
+ case "TSEnumMember":
+ case "TSModuleDeclaration":
+ case "TSModuleBlock":
+ case "TSImportType":
+ case "TSImportEqualsDeclaration":
+ case "TSExternalModuleReference":
+ case "TSNonNullExpression":
+ case "TSExportAssignment":
+ case "TSNamespaceExportDeclaration":
+ case "TSTypeAnnotation":
+ case "TSTypeParameterInstantiation":
+ case "TSTypeParameterDeclaration":
+ case "TSTypeParameter":
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSTypeElement(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "TSCallSignatureDeclaration":
+ case "TSConstructSignatureDeclaration":
+ case "TSPropertySignature":
+ case "TSMethodSignature":
+ case "TSIndexSignature":
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSType(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "TSAnyKeyword":
+ case "TSBooleanKeyword":
+ case "TSBigIntKeyword":
+ case "TSIntrinsicKeyword":
+ case "TSNeverKeyword":
+ case "TSNullKeyword":
+ case "TSNumberKeyword":
+ case "TSObjectKeyword":
+ case "TSStringKeyword":
+ case "TSSymbolKeyword":
+ case "TSUndefinedKeyword":
+ case "TSUnknownKeyword":
+ case "TSVoidKeyword":
+ case "TSThisType":
+ case "TSFunctionType":
+ case "TSConstructorType":
+ case "TSTypeReference":
+ case "TSTypePredicate":
+ case "TSTypeQuery":
+ case "TSTypeLiteral":
+ case "TSArrayType":
+ case "TSTupleType":
+ case "TSOptionalType":
+ case "TSRestType":
+ case "TSUnionType":
+ case "TSIntersectionType":
+ case "TSConditionalType":
+ case "TSInferType":
+ case "TSParenthesizedType":
+ case "TSTypeOperator":
+ case "TSIndexedAccessType":
+ case "TSMappedType":
+ case "TSLiteralType":
+ case "TSExpressionWithTypeArguments":
+ case "TSImportType":
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isTSBaseType(node, opts) {
+ if (!node) return false;
+ switch (node.type) {
+ case "TSAnyKeyword":
+ case "TSBooleanKeyword":
+ case "TSBigIntKeyword":
+ case "TSIntrinsicKeyword":
+ case "TSNeverKeyword":
+ case "TSNullKeyword":
+ case "TSNumberKeyword":
+ case "TSObjectKeyword":
+ case "TSStringKeyword":
+ case "TSSymbolKeyword":
+ case "TSUndefinedKeyword":
+ case "TSUnknownKeyword":
+ case "TSVoidKeyword":
+ case "TSThisType":
+ case "TSLiteralType":
+ break;
+ default:
+ return false;
+ }
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isNumberLiteral(node, opts) {
+ (0, _deprecationWarning.default)("isNumberLiteral", "isNumericLiteral");
+ if (!node) return false;
+ if (node.type !== "NumberLiteral") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isRegexLiteral(node, opts) {
+ (0, _deprecationWarning.default)("isRegexLiteral", "isRegExpLiteral");
+ if (!node) return false;
+ if (node.type !== "RegexLiteral") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isRestProperty(node, opts) {
+ (0, _deprecationWarning.default)("isRestProperty", "isRestElement");
+ if (!node) return false;
+ if (node.type !== "RestProperty") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isSpreadProperty(node, opts) {
+ (0, _deprecationWarning.default)("isSpreadProperty", "isSpreadElement");
+ if (!node) return false;
+ if (node.type !== "SpreadProperty") return false;
+ return opts == null || (0, _shallowEqual.default)(node, opts);
+ }
+ function isModuleDeclaration(node, opts) {
+ (0, _deprecationWarning.default)("isModuleDeclaration", "isImportOrExportDeclaration");
+ return isImportOrExportDeclaration(node, opts);
+ }
+
+
+ return generated$3;
+ }
+
+ var hasRequiredMatchesPattern;
+
+ function requireMatchesPattern () {
+ if (hasRequiredMatchesPattern) return matchesPattern;
+ hasRequiredMatchesPattern = 1;
+
+ Object.defineProperty(matchesPattern, "__esModule", {
+ value: true
+ });
+ matchesPattern.default = matchesPattern$1;
+ var _index = requireGenerated$3();
+ function matchesPattern$1(member, match, allowPartial) {
+ if (!(0, _index.isMemberExpression)(member)) return false;
+ const parts = Array.isArray(match) ? match : match.split(".");
+ const nodes = [];
+ let node;
+ for (node = member; (0, _index.isMemberExpression)(node); node = node.object) {
+ nodes.push(node.property);
+ }
+ nodes.push(node);
+ if (nodes.length < parts.length) return false;
+ if (!allowPartial && nodes.length > parts.length) return false;
+ for (let i = 0, j = nodes.length - 1; i < parts.length; i++, j--) {
+ const node = nodes[j];
+ let value;
+ if ((0, _index.isIdentifier)(node)) {
+ value = node.name;
+ } else if ((0, _index.isStringLiteral)(node)) {
+ value = node.value;
+ } else if ((0, _index.isThisExpression)(node)) {
+ value = "this";
+ } else {
+ return false;
+ }
+ if (parts[i] !== value) return false;
+ }
+ return true;
+ }
+
+
+ return matchesPattern;
+ }
+
+ var hasRequiredBuildMatchMemberExpression;
+
+ function requireBuildMatchMemberExpression () {
+ if (hasRequiredBuildMatchMemberExpression) return buildMatchMemberExpression;
+ hasRequiredBuildMatchMemberExpression = 1;
+
+ Object.defineProperty(buildMatchMemberExpression, "__esModule", {
+ value: true
+ });
+ buildMatchMemberExpression.default = buildMatchMemberExpression$1;
+ var _matchesPattern = requireMatchesPattern();
+ function buildMatchMemberExpression$1(match, allowPartial) {
+ const parts = match.split(".");
+ return member => (0, _matchesPattern.default)(member, parts, allowPartial);
+ }
+
+
+ return buildMatchMemberExpression;
+ }
+
+ var hasRequiredIsReactComponent;
+
+ function requireIsReactComponent () {
+ if (hasRequiredIsReactComponent) return isReactComponent$1;
+ hasRequiredIsReactComponent = 1;
+
+ Object.defineProperty(isReactComponent$1, "__esModule", {
+ value: true
+ });
+ isReactComponent$1.default = void 0;
+ var _buildMatchMemberExpression = requireBuildMatchMemberExpression();
+ const isReactComponent = (0, _buildMatchMemberExpression.default)("React.Component");
+ var _default = isReactComponent;
+ isReactComponent$1.default = _default;
+
+
+ return isReactComponent$1;
+ }
+
+ var isCompatTag = {};
+
+ var hasRequiredIsCompatTag;
+
+ function requireIsCompatTag () {
+ if (hasRequiredIsCompatTag) return isCompatTag;
+ hasRequiredIsCompatTag = 1;
+
+ Object.defineProperty(isCompatTag, "__esModule", {
+ value: true
+ });
+ isCompatTag.default = isCompatTag$1;
+ function isCompatTag$1(tagName) {
+ return !!tagName && /^[a-z]/.test(tagName);
+ }
+
+
+ return isCompatTag;
+ }
+
+ var buildChildren = {};
+
+ var cleanJSXElementLiteralChild = {};
+
+ var generated$2 = {};
+
+ var validateNode = {};
+
+ var validate = {};
+
+ var definitions = {};
+
+ var toFastProperties;
+ var hasRequiredToFastProperties;
+
+ function requireToFastProperties () {
+ if (hasRequiredToFastProperties) return toFastProperties;
+ hasRequiredToFastProperties = 1;
+
+ let fastProto = null;
+
+ // Creates an object with permanently fast properties in V8. See Toon Verwaest's
+ // post https://medium.com/@tverwaes/setting-up-prototypes-in-v8-ec9c9491dfe2#5f62
+ // for more details. Use %HasFastProperties(object) and the Node.js flag
+ // --allow-natives-syntax to check whether an object has fast properties.
+ function FastObject(o) {
+ // A prototype object will have "fast properties" enabled once it is checked
+ // against the inline property cache of a function, e.g. fastProto.property:
+ // https://github.com/v8/v8/blob/6.0.122/test/mjsunit/fast-prototype.js#L48-L63
+ if (fastProto !== null && typeof fastProto.property) {
+ const result = fastProto;
+ fastProto = FastObject.prototype = null;
+ return result;
+ }
+ fastProto = FastObject.prototype = o == null ? Object.create(null) : o;
+ return new FastObject;
+ }
+
+ // Initialize the inline property cache of FastObject
+ FastObject();
+
+ toFastProperties = function toFastproperties(o) {
+ return FastObject(o);
+ };
+ return toFastProperties;
+ }
+
+ var global$1 = (typeof global !== "undefined" ? global :
+ typeof self !== "undefined" ? self :
+ typeof window !== "undefined" ? window : {});
+
+ // shim for using process in browser
+ // based off https://github.com/defunctzombie/node-process/blob/master/browser.js
+
+ function defaultSetTimout() {
+ throw new Error('setTimeout has not been defined');
+ }
+ function defaultClearTimeout () {
+ throw new Error('clearTimeout has not been defined');
+ }
+ var cachedSetTimeout = defaultSetTimout;
+ var cachedClearTimeout = defaultClearTimeout;
+ if (typeof global$1.setTimeout === 'function') {
+ cachedSetTimeout = setTimeout;
+ }
+ if (typeof global$1.clearTimeout === 'function') {
+ cachedClearTimeout = clearTimeout;
+ }
+
+ function runTimeout(fun) {
+ if (cachedSetTimeout === setTimeout) {
+ //normal enviroments in sane situations
+ return setTimeout(fun, 0);
+ }
+ // if setTimeout wasn't available but was latter defined
+ if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
+ cachedSetTimeout = setTimeout;
+ return setTimeout(fun, 0);
+ }
+ try {
+ // when when somebody has screwed with setTimeout but no I.E. maddness
+ return cachedSetTimeout(fun, 0);
+ } catch(e){
+ try {
+ // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+ return cachedSetTimeout.call(null, fun, 0);
+ } catch(e){
+ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
+ return cachedSetTimeout.call(this, fun, 0);
+ }
+ }
+
+
+ }
+ function runClearTimeout(marker) {
+ if (cachedClearTimeout === clearTimeout) {
+ //normal enviroments in sane situations
+ return clearTimeout(marker);
+ }
+ // if clearTimeout wasn't available but was latter defined
+ if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
+ cachedClearTimeout = clearTimeout;
+ return clearTimeout(marker);
+ }
+ try {
+ // when when somebody has screwed with setTimeout but no I.E. maddness
+ return cachedClearTimeout(marker);
+ } catch (e){
+ try {
+ // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+ return cachedClearTimeout.call(null, marker);
+ } catch (e){
+ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
+ // Some versions of I.E. have different rules for clearTimeout vs setTimeout
+ return cachedClearTimeout.call(this, marker);
+ }
+ }
+
+
+
+ }
+ var queue = [];
+ var draining = false;
+ var currentQueue;
+ var queueIndex = -1;
+
+ function cleanUpNextTick() {
+ if (!draining || !currentQueue) {
+ return;
+ }
+ draining = false;
+ if (currentQueue.length) {
+ queue = currentQueue.concat(queue);
+ } else {
+ queueIndex = -1;
+ }
+ if (queue.length) {
+ drainQueue();
+ }
+ }
+
+ function drainQueue() {
+ if (draining) {
+ return;
+ }
+ var timeout = runTimeout(cleanUpNextTick);
+ draining = true;
+
+ var len = queue.length;
+ while(len) {
+ currentQueue = queue;
+ queue = [];
+ while (++queueIndex < len) {
+ if (currentQueue) {
+ currentQueue[queueIndex].run();
+ }
+ }
+ queueIndex = -1;
+ len = queue.length;
+ }
+ currentQueue = null;
+ draining = false;
+ runClearTimeout(timeout);
+ }
+ function nextTick(fun) {
+ var args = new Array(arguments.length - 1);
+ if (arguments.length > 1) {
+ for (var i = 1; i < arguments.length; i++) {
+ args[i - 1] = arguments[i];
+ }
+ }
+ queue.push(new Item(fun, args));
+ if (queue.length === 1 && !draining) {
+ runTimeout(drainQueue);
+ }
+ }
+ // v8 likes predictible objects
+ function Item(fun, array) {
+ this.fun = fun;
+ this.array = array;
+ }
+ Item.prototype.run = function () {
+ this.fun.apply(null, this.array);
+ };
+ var title = 'browser';
+ var platform = 'browser';
+ var browser = true;
+ var env = {};
+ var argv = [];
+ var version = ''; // empty string to avoid regexp issues
+ var versions = {};
+ var release = {};
+ var config = {};
+
+ function noop() {}
+
+ var on = noop;
+ var addListener = noop;
+ var once = noop;
+ var off = noop;
+ var removeListener = noop;
+ var removeAllListeners = noop;
+ var emit = noop;
+
+ function binding(name) {
+ throw new Error('process.binding is not supported');
+ }
+
+ function cwd () { return '/' }
+ function chdir (dir) {
+ throw new Error('process.chdir is not supported');
+ }function umask() { return 0; }
+
+ // from https://github.com/kumavis/browser-process-hrtime/blob/master/index.js
+ var performance = global$1.performance || {};
+ var performanceNow =
+ performance.now ||
+ performance.mozNow ||
+ performance.msNow ||
+ performance.oNow ||
+ performance.webkitNow ||
+ function(){ return (new Date()).getTime() };
+
+ // generate timestamp or delta
+ // see http://nodejs.org/api/process.html#process_process_hrtime
+ function hrtime(previousTimestamp){
+ var clocktime = performanceNow.call(performance)*1e-3;
+ var seconds = Math.floor(clocktime);
+ var nanoseconds = Math.floor((clocktime%1)*1e9);
+ if (previousTimestamp) {
+ seconds = seconds - previousTimestamp[0];
+ nanoseconds = nanoseconds - previousTimestamp[1];
+ if (nanoseconds<0) {
+ seconds--;
+ nanoseconds += 1e9;
+ }
+ }
+ return [seconds,nanoseconds]
+ }
+
+ var startTime = new Date();
+ function uptime() {
+ var currentTime = new Date();
+ var dif = currentTime - startTime;
+ return dif / 1000;
+ }
+
+ var browser$1 = {
+ nextTick: nextTick,
+ title: title,
+ browser: browser,
+ env: env,
+ argv: argv,
+ version: version,
+ versions: versions,
+ on: on,
+ addListener: addListener,
+ once: once,
+ off: off,
+ removeListener: removeListener,
+ removeAllListeners: removeAllListeners,
+ emit: emit,
+ binding: binding,
+ cwd: cwd,
+ chdir: chdir,
+ umask: umask,
+ hrtime: hrtime,
+ platform: platform,
+ release: release,
+ config: config,
+ uptime: uptime
+ };
+
+ var process$1 = browser$1;
+
+ var core = {};
+
+ var is = {};
+
+ var isType = {};
+
+ var hasRequiredIsType;
+
+ function requireIsType () {
+ if (hasRequiredIsType) return isType;
+ hasRequiredIsType = 1;
+
+ Object.defineProperty(isType, "__esModule", {
+ value: true
+ });
+ isType.default = isType$1;
+ var _index = requireDefinitions();
+ function isType$1(nodeType, targetType) {
+ if (nodeType === targetType) return true;
+ if (nodeType == null) return false;
+ if (_index.ALIAS_KEYS[targetType]) return false;
+ const aliases = _index.FLIPPED_ALIAS_KEYS[targetType];
+ if (aliases) {
+ if (aliases[0] === nodeType) return true;
+ for (const alias of aliases) {
+ if (nodeType === alias) return true;
+ }
+ }
+ return false;
+ }
+
+
+ return isType;
+ }
+
+ var isPlaceholderType = {};
+
+ var hasRequiredIsPlaceholderType;
+
+ function requireIsPlaceholderType () {
+ if (hasRequiredIsPlaceholderType) return isPlaceholderType;
+ hasRequiredIsPlaceholderType = 1;
+
+ Object.defineProperty(isPlaceholderType, "__esModule", {
+ value: true
+ });
+ isPlaceholderType.default = isPlaceholderType$1;
+ var _index = requireDefinitions();
+ function isPlaceholderType$1(placeholderType, targetType) {
+ if (placeholderType === targetType) return true;
+ const aliases = _index.PLACEHOLDERS_ALIAS[placeholderType];
+ if (aliases) {
+ for (const alias of aliases) {
+ if (targetType === alias) return true;
+ }
+ }
+ return false;
+ }
+
+
+ return isPlaceholderType;
+ }
+
+ var hasRequiredIs;
+
+ function requireIs () {
+ if (hasRequiredIs) return is;
+ hasRequiredIs = 1;
+
+ Object.defineProperty(is, "__esModule", {
+ value: true
+ });
+ is.default = is$1;
+ var _shallowEqual = requireShallowEqual();
+ var _isType = requireIsType();
+ var _isPlaceholderType = requireIsPlaceholderType();
+ var _index = requireDefinitions();
+ function is$1(type, node, opts) {
+ if (!node) return false;
+ const matches = (0, _isType.default)(node.type, type);
+ if (!matches) {
+ if (!opts && node.type === "Placeholder" && type in _index.FLIPPED_ALIAS_KEYS) {
+ return (0, _isPlaceholderType.default)(node.expectedNode, type);
+ }
+ return false;
+ }
+ if (typeof opts === "undefined") {
+ return true;
+ } else {
+ return (0, _shallowEqual.default)(node, opts);
+ }
+ }
+
+
+ return is;
+ }
+
+ var isValidIdentifier = {};
+
+ var lib$3 = {};
+
+ var identifier = {};
+
+ var hasRequiredIdentifier;
+
+ function requireIdentifier () {
+ if (hasRequiredIdentifier) return identifier;
+ hasRequiredIdentifier = 1;
+
+ Object.defineProperty(identifier, "__esModule", {
+ value: true
+ });
+ identifier.isIdentifierChar = isIdentifierChar;
+ identifier.isIdentifierName = isIdentifierName;
+ identifier.isIdentifierStart = isIdentifierStart;
+ let nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u0870-\u0887\u0889-\u088e\u08a0-\u08c9\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u09fc\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c5d\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cdd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u1711\u171f-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4c\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31bf\u31f0-\u31ff\u3400-\u4dbf\u4e00-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7ca\ua7d0\ua7d1\ua7d3\ua7d5-\ua7d9\ua7f2-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab69\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc";
+ let nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u0898-\u089f\u08ca-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3c\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0cf3\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ece\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u180f-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf-\u1ace\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1dff\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\u30fb\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f\uff65";
+ const nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]");
+ const nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]");
+ nonASCIIidentifierStartChars = nonASCIIidentifierChars = null;
+ const astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 68, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 349, 41, 7, 1, 79, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 159, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 264, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 4026, 582, 8634, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 689, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 43, 8, 8936, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 757, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4153, 7, 221, 3, 5761, 15, 7472, 16, 621, 2467, 541, 1507, 4938, 6, 4191];
+ const astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 370, 1, 81, 2, 71, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 3, 0, 158, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 193, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 84, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 406, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 330, 3, 10, 1, 2, 0, 49, 6, 4, 4, 14, 9, 5351, 0, 7, 14, 13835, 9, 87, 9, 39, 4, 60, 6, 26, 9, 1014, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4706, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 101, 0, 161, 6, 10, 9, 357, 0, 62, 13, 499, 13, 983, 6, 110, 6, 6, 9, 4759, 9, 787719, 239];
+ function isInAstralSet(code, set) {
+ let pos = 0x10000;
+ for (let i = 0, length = set.length; i < length; i += 2) {
+ pos += set[i];
+ if (pos > code) return false;
+ pos += set[i + 1];
+ if (pos >= code) return true;
+ }
+ return false;
+ }
+ function isIdentifierStart(code) {
+ if (code < 65) return code === 36;
+ if (code <= 90) return true;
+ if (code < 97) return code === 95;
+ if (code <= 122) return true;
+ if (code <= 0xffff) {
+ return code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code));
+ }
+ return isInAstralSet(code, astralIdentifierStartCodes);
+ }
+ function isIdentifierChar(code) {
+ if (code < 48) return code === 36;
+ if (code < 58) return true;
+ if (code < 65) return false;
+ if (code <= 90) return true;
+ if (code < 97) return code === 95;
+ if (code <= 122) return true;
+ if (code <= 0xffff) {
+ return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code));
+ }
+ return isInAstralSet(code, astralIdentifierStartCodes) || isInAstralSet(code, astralIdentifierCodes);
+ }
+ function isIdentifierName(name) {
+ let isFirst = true;
+ for (let i = 0; i < name.length; i++) {
+ let cp = name.charCodeAt(i);
+ if ((cp & 0xfc00) === 0xd800 && i + 1 < name.length) {
+ const trail = name.charCodeAt(++i);
+ if ((trail & 0xfc00) === 0xdc00) {
+ cp = 0x10000 + ((cp & 0x3ff) << 10) + (trail & 0x3ff);
+ }
+ }
+ if (isFirst) {
+ isFirst = false;
+ if (!isIdentifierStart(cp)) {
+ return false;
+ }
+ } else if (!isIdentifierChar(cp)) {
+ return false;
+ }
+ }
+ return !isFirst;
+ }
+
+
+ return identifier;
+ }
+
+ var keyword = {};
+
+ var hasRequiredKeyword;
+
+ function requireKeyword () {
+ if (hasRequiredKeyword) return keyword;
+ hasRequiredKeyword = 1;
+
+ Object.defineProperty(keyword, "__esModule", {
+ value: true
+ });
+ keyword.isKeyword = isKeyword;
+ keyword.isReservedWord = isReservedWord;
+ keyword.isStrictBindOnlyReservedWord = isStrictBindOnlyReservedWord;
+ keyword.isStrictBindReservedWord = isStrictBindReservedWord;
+ keyword.isStrictReservedWord = isStrictReservedWord;
+ const reservedWords = {
+ keyword: ["break", "case", "catch", "continue", "debugger", "default", "do", "else", "finally", "for", "function", "if", "return", "switch", "throw", "try", "var", "const", "while", "with", "new", "this", "super", "class", "extends", "export", "import", "null", "true", "false", "in", "instanceof", "typeof", "void", "delete"],
+ strict: ["implements", "interface", "let", "package", "private", "protected", "public", "static", "yield"],
+ strictBind: ["eval", "arguments"]
+ };
+ const keywords = new Set(reservedWords.keyword);
+ const reservedWordsStrictSet = new Set(reservedWords.strict);
+ const reservedWordsStrictBindSet = new Set(reservedWords.strictBind);
+ function isReservedWord(word, inModule) {
+ return inModule && word === "await" || word === "enum";
+ }
+ function isStrictReservedWord(word, inModule) {
+ return isReservedWord(word, inModule) || reservedWordsStrictSet.has(word);
+ }
+ function isStrictBindOnlyReservedWord(word) {
+ return reservedWordsStrictBindSet.has(word);
+ }
+ function isStrictBindReservedWord(word, inModule) {
+ return isStrictReservedWord(word, inModule) || isStrictBindOnlyReservedWord(word);
+ }
+ function isKeyword(word) {
+ return keywords.has(word);
+ }
+
+
+ return keyword;
+ }
+
+ var hasRequiredLib$4;
+
+ function requireLib$4 () {
+ if (hasRequiredLib$4) return lib$3;
+ hasRequiredLib$4 = 1;
+ (function (exports) {
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ Object.defineProperty(exports, "isIdentifierChar", {
+ enumerable: true,
+ get: function () {
+ return _identifier.isIdentifierChar;
+ }
+ });
+ Object.defineProperty(exports, "isIdentifierName", {
+ enumerable: true,
+ get: function () {
+ return _identifier.isIdentifierName;
+ }
+ });
+ Object.defineProperty(exports, "isIdentifierStart", {
+ enumerable: true,
+ get: function () {
+ return _identifier.isIdentifierStart;
+ }
+ });
+ Object.defineProperty(exports, "isKeyword", {
+ enumerable: true,
+ get: function () {
+ return _keyword.isKeyword;
+ }
+ });
+ Object.defineProperty(exports, "isReservedWord", {
+ enumerable: true,
+ get: function () {
+ return _keyword.isReservedWord;
+ }
+ });
+ Object.defineProperty(exports, "isStrictBindOnlyReservedWord", {
+ enumerable: true,
+ get: function () {
+ return _keyword.isStrictBindOnlyReservedWord;
+ }
+ });
+ Object.defineProperty(exports, "isStrictBindReservedWord", {
+ enumerable: true,
+ get: function () {
+ return _keyword.isStrictBindReservedWord;
+ }
+ });
+ Object.defineProperty(exports, "isStrictReservedWord", {
+ enumerable: true,
+ get: function () {
+ return _keyword.isStrictReservedWord;
+ }
+ });
+ var _identifier = requireIdentifier();
+ var _keyword = requireKeyword();
+
+
+ } (lib$3));
+ return lib$3;
+ }
+
+ var hasRequiredIsValidIdentifier;
+
+ function requireIsValidIdentifier () {
+ if (hasRequiredIsValidIdentifier) return isValidIdentifier;
+ hasRequiredIsValidIdentifier = 1;
+
+ Object.defineProperty(isValidIdentifier, "__esModule", {
+ value: true
+ });
+ isValidIdentifier.default = isValidIdentifier$1;
+ var _helperValidatorIdentifier = requireLib$4();
+ function isValidIdentifier$1(name, reserved = true) {
+ if (typeof name !== "string") return false;
+ if (reserved) {
+ if ((0, _helperValidatorIdentifier.isKeyword)(name) || (0, _helperValidatorIdentifier.isStrictReservedWord)(name, true)) {
+ return false;
+ }
+ }
+ return (0, _helperValidatorIdentifier.isIdentifierName)(name);
+ }
+
+
+ return isValidIdentifier;
+ }
+
+ var lib$2 = {};
+
+ var hasRequiredLib$3;
+
+ function requireLib$3 () {
+ if (hasRequiredLib$3) return lib$2;
+ hasRequiredLib$3 = 1;
+
+ Object.defineProperty(lib$2, "__esModule", {
+ value: true
+ });
+ lib$2.readCodePoint = readCodePoint;
+ lib$2.readInt = readInt;
+ lib$2.readStringContents = readStringContents;
+ var _isDigit = function isDigit(code) {
+ return code >= 48 && code <= 57;
+ };
+ const forbiddenNumericSeparatorSiblings = {
+ decBinOct: new Set([46, 66, 69, 79, 95, 98, 101, 111]),
+ hex: new Set([46, 88, 95, 120])
+ };
+ const isAllowedNumericSeparatorSibling = {
+ bin: ch => ch === 48 || ch === 49,
+ oct: ch => ch >= 48 && ch <= 55,
+ dec: ch => ch >= 48 && ch <= 57,
+ hex: ch => ch >= 48 && ch <= 57 || ch >= 65 && ch <= 70 || ch >= 97 && ch <= 102
+ };
+ function readStringContents(type, input, pos, lineStart, curLine, errors) {
+ const initialPos = pos;
+ const initialLineStart = lineStart;
+ const initialCurLine = curLine;
+ let out = "";
+ let firstInvalidLoc = null;
+ let chunkStart = pos;
+ const {
+ length
+ } = input;
+ for (;;) {
+ if (pos >= length) {
+ errors.unterminated(initialPos, initialLineStart, initialCurLine);
+ out += input.slice(chunkStart, pos);
+ break;
+ }
+ const ch = input.charCodeAt(pos);
+ if (isStringEnd(type, ch, input, pos)) {
+ out += input.slice(chunkStart, pos);
+ break;
+ }
+ if (ch === 92) {
+ out += input.slice(chunkStart, pos);
+ const res = readEscapedChar(input, pos, lineStart, curLine, type === "template", errors);
+ if (res.ch === null && !firstInvalidLoc) {
+ firstInvalidLoc = {
+ pos,
+ lineStart,
+ curLine
+ };
+ } else {
+ out += res.ch;
+ }
+ ({
+ pos,
+ lineStart,
+ curLine
+ } = res);
+ chunkStart = pos;
+ } else if (ch === 8232 || ch === 8233) {
+ ++pos;
+ ++curLine;
+ lineStart = pos;
+ } else if (ch === 10 || ch === 13) {
+ if (type === "template") {
+ out += input.slice(chunkStart, pos) + "\n";
+ ++pos;
+ if (ch === 13 && input.charCodeAt(pos) === 10) {
+ ++pos;
+ }
+ ++curLine;
+ chunkStart = lineStart = pos;
+ } else {
+ errors.unterminated(initialPos, initialLineStart, initialCurLine);
+ }
+ } else {
+ ++pos;
+ }
+ }
+ return {
+ pos,
+ str: out,
+ firstInvalidLoc,
+ lineStart,
+ curLine,
+ containsInvalid: !!firstInvalidLoc
+ };
+ }
+ function isStringEnd(type, ch, input, pos) {
+ if (type === "template") {
+ return ch === 96 || ch === 36 && input.charCodeAt(pos + 1) === 123;
+ }
+ return ch === (type === "double" ? 34 : 39);
+ }
+ function readEscapedChar(input, pos, lineStart, curLine, inTemplate, errors) {
+ const throwOnInvalid = !inTemplate;
+ pos++;
+ const res = ch => ({
+ pos,
+ ch,
+ lineStart,
+ curLine
+ });
+ const ch = input.charCodeAt(pos++);
+ switch (ch) {
+ case 110:
+ return res("\n");
+ case 114:
+ return res("\r");
+ case 120:
+ {
+ let code;
+ ({
+ code,
+ pos
+ } = readHexChar(input, pos, lineStart, curLine, 2, false, throwOnInvalid, errors));
+ return res(code === null ? null : String.fromCharCode(code));
+ }
+ case 117:
+ {
+ let code;
+ ({
+ code,
+ pos
+ } = readCodePoint(input, pos, lineStart, curLine, throwOnInvalid, errors));
+ return res(code === null ? null : String.fromCodePoint(code));
+ }
+ case 116:
+ return res("\t");
+ case 98:
+ return res("\b");
+ case 118:
+ return res("\u000b");
+ case 102:
+ return res("\f");
+ case 13:
+ if (input.charCodeAt(pos) === 10) {
+ ++pos;
+ }
+ case 10:
+ lineStart = pos;
+ ++curLine;
+ case 8232:
+ case 8233:
+ return res("");
+ case 56:
+ case 57:
+ if (inTemplate) {
+ return res(null);
+ } else {
+ errors.strictNumericEscape(pos - 1, lineStart, curLine);
+ }
+ default:
+ if (ch >= 48 && ch <= 55) {
+ const startPos = pos - 1;
+ const match = input.slice(startPos, pos + 2).match(/^[0-7]+/);
+ let octalStr = match[0];
+ let octal = parseInt(octalStr, 8);
+ if (octal > 255) {
+ octalStr = octalStr.slice(0, -1);
+ octal = parseInt(octalStr, 8);
+ }
+ pos += octalStr.length - 1;
+ const next = input.charCodeAt(pos);
+ if (octalStr !== "0" || next === 56 || next === 57) {
+ if (inTemplate) {
+ return res(null);
+ } else {
+ errors.strictNumericEscape(startPos, lineStart, curLine);
+ }
+ }
+ return res(String.fromCharCode(octal));
+ }
+ return res(String.fromCharCode(ch));
+ }
+ }
+ function readHexChar(input, pos, lineStart, curLine, len, forceLen, throwOnInvalid, errors) {
+ const initialPos = pos;
+ let n;
+ ({
+ n,
+ pos
+ } = readInt(input, pos, lineStart, curLine, 16, len, forceLen, false, errors, !throwOnInvalid));
+ if (n === null) {
+ if (throwOnInvalid) {
+ errors.invalidEscapeSequence(initialPos, lineStart, curLine);
+ } else {
+ pos = initialPos - 1;
+ }
+ }
+ return {
+ code: n,
+ pos
+ };
+ }
+ function readInt(input, pos, lineStart, curLine, radix, len, forceLen, allowNumSeparator, errors, bailOnError) {
+ const start = pos;
+ const forbiddenSiblings = radix === 16 ? forbiddenNumericSeparatorSiblings.hex : forbiddenNumericSeparatorSiblings.decBinOct;
+ const isAllowedSibling = radix === 16 ? isAllowedNumericSeparatorSibling.hex : radix === 10 ? isAllowedNumericSeparatorSibling.dec : radix === 8 ? isAllowedNumericSeparatorSibling.oct : isAllowedNumericSeparatorSibling.bin;
+ let invalid = false;
+ let total = 0;
+ for (let i = 0, e = len == null ? Infinity : len; i < e; ++i) {
+ const code = input.charCodeAt(pos);
+ let val;
+ if (code === 95 && allowNumSeparator !== "bail") {
+ const prev = input.charCodeAt(pos - 1);
+ const next = input.charCodeAt(pos + 1);
+ if (!allowNumSeparator) {
+ if (bailOnError) return {
+ n: null,
+ pos
+ };
+ errors.numericSeparatorInEscapeSequence(pos, lineStart, curLine);
+ } else if (Number.isNaN(next) || !isAllowedSibling(next) || forbiddenSiblings.has(prev) || forbiddenSiblings.has(next)) {
+ if (bailOnError) return {
+ n: null,
+ pos
+ };
+ errors.unexpectedNumericSeparator(pos, lineStart, curLine);
+ }
+ ++pos;
+ continue;
+ }
+ if (code >= 97) {
+ val = code - 97 + 10;
+ } else if (code >= 65) {
+ val = code - 65 + 10;
+ } else if (_isDigit(code)) {
+ val = code - 48;
+ } else {
+ val = Infinity;
+ }
+ if (val >= radix) {
+ if (val <= 9 && bailOnError) {
+ return {
+ n: null,
+ pos
+ };
+ } else if (val <= 9 && errors.invalidDigit(pos, lineStart, curLine, radix)) {
+ val = 0;
+ } else if (forceLen) {
+ val = 0;
+ invalid = true;
+ } else {
+ break;
+ }
+ }
+ ++pos;
+ total = total * radix + val;
+ }
+ if (pos === start || len != null && pos - start !== len || invalid) {
+ return {
+ n: null,
+ pos
+ };
+ }
+ return {
+ n: total,
+ pos
+ };
+ }
+ function readCodePoint(input, pos, lineStart, curLine, throwOnInvalid, errors) {
+ const ch = input.charCodeAt(pos);
+ let code;
+ if (ch === 123) {
+ ++pos;
+ ({
+ code,
+ pos
+ } = readHexChar(input, pos, lineStart, curLine, input.indexOf("}", pos) - pos, true, throwOnInvalid, errors));
+ ++pos;
+ if (code !== null && code > 0x10ffff) {
+ if (throwOnInvalid) {
+ errors.invalidCodePoint(pos, lineStart, curLine);
+ } else {
+ return {
+ code: null,
+ pos
+ };
+ }
+ }
+ } else {
+ ({
+ code,
+ pos
+ } = readHexChar(input, pos, lineStart, curLine, 4, false, throwOnInvalid, errors));
+ }
+ return {
+ code,
+ pos
+ };
+ }
+
+
+ return lib$2;
+ }
+
+ var constants = {};
+
+ var hasRequiredConstants;
+
+ function requireConstants () {
+ if (hasRequiredConstants) return constants;
+ hasRequiredConstants = 1;
+
+ Object.defineProperty(constants, "__esModule", {
+ value: true
+ });
+ constants.UPDATE_OPERATORS = constants.UNARY_OPERATORS = constants.STRING_UNARY_OPERATORS = constants.STATEMENT_OR_BLOCK_KEYS = constants.NUMBER_UNARY_OPERATORS = constants.NUMBER_BINARY_OPERATORS = constants.NOT_LOCAL_BINDING = constants.LOGICAL_OPERATORS = constants.INHERIT_KEYS = constants.FOR_INIT_KEYS = constants.FLATTENABLE_KEYS = constants.EQUALITY_BINARY_OPERATORS = constants.COMPARISON_BINARY_OPERATORS = constants.COMMENT_KEYS = constants.BOOLEAN_UNARY_OPERATORS = constants.BOOLEAN_NUMBER_BINARY_OPERATORS = constants.BOOLEAN_BINARY_OPERATORS = constants.BLOCK_SCOPED_SYMBOL = constants.BINARY_OPERATORS = constants.ASSIGNMENT_OPERATORS = void 0;
+ const STATEMENT_OR_BLOCK_KEYS = ["consequent", "body", "alternate"];
+ constants.STATEMENT_OR_BLOCK_KEYS = STATEMENT_OR_BLOCK_KEYS;
+ const FLATTENABLE_KEYS = ["body", "expressions"];
+ constants.FLATTENABLE_KEYS = FLATTENABLE_KEYS;
+ const FOR_INIT_KEYS = ["left", "init"];
+ constants.FOR_INIT_KEYS = FOR_INIT_KEYS;
+ const COMMENT_KEYS = ["leadingComments", "trailingComments", "innerComments"];
+ constants.COMMENT_KEYS = COMMENT_KEYS;
+ const LOGICAL_OPERATORS = ["||", "&&", "??"];
+ constants.LOGICAL_OPERATORS = LOGICAL_OPERATORS;
+ const UPDATE_OPERATORS = ["++", "--"];
+ constants.UPDATE_OPERATORS = UPDATE_OPERATORS;
+ const BOOLEAN_NUMBER_BINARY_OPERATORS = [">", "<", ">=", "<="];
+ constants.BOOLEAN_NUMBER_BINARY_OPERATORS = BOOLEAN_NUMBER_BINARY_OPERATORS;
+ const EQUALITY_BINARY_OPERATORS = ["==", "===", "!=", "!=="];
+ constants.EQUALITY_BINARY_OPERATORS = EQUALITY_BINARY_OPERATORS;
+ const COMPARISON_BINARY_OPERATORS = [...EQUALITY_BINARY_OPERATORS, "in", "instanceof"];
+ constants.COMPARISON_BINARY_OPERATORS = COMPARISON_BINARY_OPERATORS;
+ const BOOLEAN_BINARY_OPERATORS = [...COMPARISON_BINARY_OPERATORS, ...BOOLEAN_NUMBER_BINARY_OPERATORS];
+ constants.BOOLEAN_BINARY_OPERATORS = BOOLEAN_BINARY_OPERATORS;
+ const NUMBER_BINARY_OPERATORS = ["-", "/", "%", "*", "**", "&", "|", ">>", ">>>", "<<", "^"];
+ constants.NUMBER_BINARY_OPERATORS = NUMBER_BINARY_OPERATORS;
+ const BINARY_OPERATORS = ["+", ...NUMBER_BINARY_OPERATORS, ...BOOLEAN_BINARY_OPERATORS, "|>"];
+ constants.BINARY_OPERATORS = BINARY_OPERATORS;
+ const ASSIGNMENT_OPERATORS = ["=", "+=", ...NUMBER_BINARY_OPERATORS.map(op => op + "="), ...LOGICAL_OPERATORS.map(op => op + "=")];
+ constants.ASSIGNMENT_OPERATORS = ASSIGNMENT_OPERATORS;
+ const BOOLEAN_UNARY_OPERATORS = ["delete", "!"];
+ constants.BOOLEAN_UNARY_OPERATORS = BOOLEAN_UNARY_OPERATORS;
+ const NUMBER_UNARY_OPERATORS = ["+", "-", "~"];
+ constants.NUMBER_UNARY_OPERATORS = NUMBER_UNARY_OPERATORS;
+ const STRING_UNARY_OPERATORS = ["typeof"];
+ constants.STRING_UNARY_OPERATORS = STRING_UNARY_OPERATORS;
+ const UNARY_OPERATORS = ["void", "throw", ...BOOLEAN_UNARY_OPERATORS, ...NUMBER_UNARY_OPERATORS, ...STRING_UNARY_OPERATORS];
+ constants.UNARY_OPERATORS = UNARY_OPERATORS;
+ const INHERIT_KEYS = {
+ optional: ["typeAnnotation", "typeParameters", "returnType"],
+ force: ["start", "loc", "end"]
+ };
+ constants.INHERIT_KEYS = INHERIT_KEYS;
+ const BLOCK_SCOPED_SYMBOL = Symbol.for("var used to be block scoped");
+ constants.BLOCK_SCOPED_SYMBOL = BLOCK_SCOPED_SYMBOL;
+ const NOT_LOCAL_BINDING = Symbol.for("should not be considered a local binding");
+ constants.NOT_LOCAL_BINDING = NOT_LOCAL_BINDING;
+
+
+ return constants;
+ }
+
+ var utils = {};
+
+ var hasRequiredUtils;
+
+ function requireUtils () {
+ if (hasRequiredUtils) return utils;
+ hasRequiredUtils = 1;
+
+ Object.defineProperty(utils, "__esModule", {
+ value: true
+ });
+ utils.VISITOR_KEYS = utils.NODE_PARENT_VALIDATIONS = utils.NODE_FIELDS = utils.FLIPPED_ALIAS_KEYS = utils.DEPRECATED_KEYS = utils.BUILDER_KEYS = utils.ALIAS_KEYS = void 0;
+ utils.arrayOf = arrayOf;
+ utils.arrayOfType = arrayOfType;
+ utils.assertEach = assertEach;
+ utils.assertNodeOrValueType = assertNodeOrValueType;
+ utils.assertNodeType = assertNodeType;
+ utils.assertOneOf = assertOneOf;
+ utils.assertOptionalChainStart = assertOptionalChainStart;
+ utils.assertShape = assertShape;
+ utils.assertValueType = assertValueType;
+ utils.chain = chain;
+ utils.default = defineType;
+ utils.defineAliasedType = defineAliasedType;
+ utils.typeIs = typeIs;
+ utils.validate = validate;
+ utils.validateArrayOfType = validateArrayOfType;
+ utils.validateOptional = validateOptional;
+ utils.validateOptionalType = validateOptionalType;
+ utils.validateType = validateType;
+ var _is = requireIs();
+ var _validate = requireValidate();
+ const VISITOR_KEYS = {};
+ utils.VISITOR_KEYS = VISITOR_KEYS;
+ const ALIAS_KEYS = {};
+ utils.ALIAS_KEYS = ALIAS_KEYS;
+ const FLIPPED_ALIAS_KEYS = {};
+ utils.FLIPPED_ALIAS_KEYS = FLIPPED_ALIAS_KEYS;
+ const NODE_FIELDS = {};
+ utils.NODE_FIELDS = NODE_FIELDS;
+ const BUILDER_KEYS = {};
+ utils.BUILDER_KEYS = BUILDER_KEYS;
+ const DEPRECATED_KEYS = {};
+ utils.DEPRECATED_KEYS = DEPRECATED_KEYS;
+ const NODE_PARENT_VALIDATIONS = {};
+ utils.NODE_PARENT_VALIDATIONS = NODE_PARENT_VALIDATIONS;
+ function getType(val) {
+ if (Array.isArray(val)) {
+ return "array";
+ } else if (val === null) {
+ return "null";
+ } else {
+ return typeof val;
+ }
+ }
+ function validate(validate) {
+ return {
+ validate
+ };
+ }
+ function typeIs(typeName) {
+ return typeof typeName === "string" ? assertNodeType(typeName) : assertNodeType(...typeName);
+ }
+ function validateType(typeName) {
+ return validate(typeIs(typeName));
+ }
+ function validateOptional(validate) {
+ return {
+ validate,
+ optional: true
+ };
+ }
+ function validateOptionalType(typeName) {
+ return {
+ validate: typeIs(typeName),
+ optional: true
+ };
+ }
+ function arrayOf(elementType) {
+ return chain(assertValueType("array"), assertEach(elementType));
+ }
+ function arrayOfType(typeName) {
+ return arrayOf(typeIs(typeName));
+ }
+ function validateArrayOfType(typeName) {
+ return validate(arrayOfType(typeName));
+ }
+ function assertEach(callback) {
+ function validator(node, key, val) {
+ if (!Array.isArray(val)) return;
+ for (let i = 0; i < val.length; i++) {
+ const subkey = `${key}[${i}]`;
+ const v = val[i];
+ callback(node, subkey, v);
+ if (process$1.env.BABEL_TYPES_8_BREAKING) (0, _validate.validateChild)(node, subkey, v);
+ }
+ }
+ validator.each = callback;
+ return validator;
+ }
+ function assertOneOf(...values) {
+ function validate(node, key, val) {
+ if (values.indexOf(val) < 0) {
+ throw new TypeError(`Property ${key} expected value to be one of ${JSON.stringify(values)} but got ${JSON.stringify(val)}`);
+ }
+ }
+ validate.oneOf = values;
+ return validate;
+ }
+ function assertNodeType(...types) {
+ function validate(node, key, val) {
+ for (const type of types) {
+ if ((0, _is.default)(type, val)) {
+ (0, _validate.validateChild)(node, key, val);
+ return;
+ }
+ }
+ throw new TypeError(`Property ${key} of ${node.type} expected node to be of a type ${JSON.stringify(types)} but instead got ${JSON.stringify(val == null ? void 0 : val.type)}`);
+ }
+ validate.oneOfNodeTypes = types;
+ return validate;
+ }
+ function assertNodeOrValueType(...types) {
+ function validate(node, key, val) {
+ for (const type of types) {
+ if (getType(val) === type || (0, _is.default)(type, val)) {
+ (0, _validate.validateChild)(node, key, val);
+ return;
+ }
+ }
+ throw new TypeError(`Property ${key} of ${node.type} expected node to be of a type ${JSON.stringify(types)} but instead got ${JSON.stringify(val == null ? void 0 : val.type)}`);
+ }
+ validate.oneOfNodeOrValueTypes = types;
+ return validate;
+ }
+ function assertValueType(type) {
+ function validate(node, key, val) {
+ const valid = getType(val) === type;
+ if (!valid) {
+ throw new TypeError(`Property ${key} expected type of ${type} but got ${getType(val)}`);
+ }
+ }
+ validate.type = type;
+ return validate;
+ }
+ function assertShape(shape) {
+ function validate(node, key, val) {
+ const errors = [];
+ for (const property of Object.keys(shape)) {
+ try {
+ (0, _validate.validateField)(node, property, val[property], shape[property]);
+ } catch (error) {
+ if (error instanceof TypeError) {
+ errors.push(error.message);
+ continue;
+ }
+ throw error;
+ }
+ }
+ if (errors.length) {
+ throw new TypeError(`Property ${key} of ${node.type} expected to have the following:\n${errors.join("\n")}`);
+ }
+ }
+ validate.shapeOf = shape;
+ return validate;
+ }
+ function assertOptionalChainStart() {
+ function validate(node) {
+ var _current;
+ let current = node;
+ while (node) {
+ const {
+ type
+ } = current;
+ if (type === "OptionalCallExpression") {
+ if (current.optional) return;
+ current = current.callee;
+ continue;
+ }
+ if (type === "OptionalMemberExpression") {
+ if (current.optional) return;
+ current = current.object;
+ continue;
+ }
+ break;
+ }
+ throw new TypeError(`Non-optional ${node.type} must chain from an optional OptionalMemberExpression or OptionalCallExpression. Found chain from ${(_current = current) == null ? void 0 : _current.type}`);
+ }
+ return validate;
+ }
+ function chain(...fns) {
+ function validate(...args) {
+ for (const fn of fns) {
+ fn(...args);
+ }
+ }
+ validate.chainOf = fns;
+ if (fns.length >= 2 && "type" in fns[0] && fns[0].type === "array" && !("each" in fns[1])) {
+ throw new Error(`An assertValueType("array") validator can only be followed by an assertEach(...) validator.`);
+ }
+ return validate;
+ }
+ const validTypeOpts = ["aliases", "builder", "deprecatedAlias", "fields", "inherits", "visitor", "validate"];
+ const validFieldKeys = ["default", "optional", "deprecated", "validate"];
+ const store = {};
+ function defineAliasedType(...aliases) {
+ return (type, opts = {}) => {
+ let defined = opts.aliases;
+ if (!defined) {
+ var _store$opts$inherits$, _defined;
+ if (opts.inherits) defined = (_store$opts$inherits$ = store[opts.inherits].aliases) == null ? void 0 : _store$opts$inherits$.slice();
+ (_defined = defined) != null ? _defined : defined = [];
+ opts.aliases = defined;
+ }
+ const additional = aliases.filter(a => !defined.includes(a));
+ defined.unshift(...additional);
+ defineType(type, opts);
+ };
+ }
+ function defineType(type, opts = {}) {
+ const inherits = opts.inherits && store[opts.inherits] || {};
+ let fields = opts.fields;
+ if (!fields) {
+ fields = {};
+ if (inherits.fields) {
+ const keys = Object.getOwnPropertyNames(inherits.fields);
+ for (const key of keys) {
+ const field = inherits.fields[key];
+ const def = field.default;
+ if (Array.isArray(def) ? def.length > 0 : def && typeof def === "object") {
+ throw new Error("field defaults can only be primitives or empty arrays currently");
+ }
+ fields[key] = {
+ default: Array.isArray(def) ? [] : def,
+ optional: field.optional,
+ deprecated: field.deprecated,
+ validate: field.validate
+ };
+ }
+ }
+ }
+ const visitor = opts.visitor || inherits.visitor || [];
+ const aliases = opts.aliases || inherits.aliases || [];
+ const builder = opts.builder || inherits.builder || opts.visitor || [];
+ for (const k of Object.keys(opts)) {
+ if (validTypeOpts.indexOf(k) === -1) {
+ throw new Error(`Unknown type option "${k}" on ${type}`);
+ }
+ }
+ if (opts.deprecatedAlias) {
+ DEPRECATED_KEYS[opts.deprecatedAlias] = type;
+ }
+ for (const key of visitor.concat(builder)) {
+ fields[key] = fields[key] || {};
+ }
+ for (const key of Object.keys(fields)) {
+ const field = fields[key];
+ if (field.default !== undefined && builder.indexOf(key) === -1) {
+ field.optional = true;
+ }
+ if (field.default === undefined) {
+ field.default = null;
+ } else if (!field.validate && field.default != null) {
+ field.validate = assertValueType(getType(field.default));
+ }
+ for (const k of Object.keys(field)) {
+ if (validFieldKeys.indexOf(k) === -1) {
+ throw new Error(`Unknown field key "${k}" on ${type}.${key}`);
+ }
+ }
+ }
+ VISITOR_KEYS[type] = opts.visitor = visitor;
+ BUILDER_KEYS[type] = opts.builder = builder;
+ NODE_FIELDS[type] = opts.fields = fields;
+ ALIAS_KEYS[type] = opts.aliases = aliases;
+ aliases.forEach(alias => {
+ FLIPPED_ALIAS_KEYS[alias] = FLIPPED_ALIAS_KEYS[alias] || [];
+ FLIPPED_ALIAS_KEYS[alias].push(type);
+ });
+ if (opts.validate) {
+ NODE_PARENT_VALIDATIONS[type] = opts.validate;
+ }
+ store[type] = opts;
+ }
+
+
+ return utils;
+ }
+
+ var hasRequiredCore;
+
+ function requireCore () {
+ if (hasRequiredCore) return core;
+ hasRequiredCore = 1;
+
+ Object.defineProperty(core, "__esModule", {
+ value: true
+ });
+ core.patternLikeCommon = core.functionTypeAnnotationCommon = core.functionDeclarationCommon = core.functionCommon = core.classMethodOrPropertyCommon = core.classMethodOrDeclareMethodCommon = void 0;
+ var _is = requireIs();
+ var _isValidIdentifier = requireIsValidIdentifier();
+ var _helperValidatorIdentifier = requireLib$4();
+ var _helperStringParser = requireLib$3();
+ var _index = requireConstants();
+ var _utils = requireUtils();
+ const defineType = (0, _utils.defineAliasedType)("Standardized");
+ defineType("ArrayExpression", {
+ fields: {
+ elements: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeOrValueType)("null", "Expression", "SpreadElement"))),
+ default: !process$1.env.BABEL_TYPES_8_BREAKING ? [] : undefined
+ }
+ },
+ visitor: ["elements"],
+ aliases: ["Expression"]
+ });
+ defineType("AssignmentExpression", {
+ fields: {
+ operator: {
+ validate: function () {
+ if (!process$1.env.BABEL_TYPES_8_BREAKING) {
+ return (0, _utils.assertValueType)("string");
+ }
+ const identifier = (0, _utils.assertOneOf)(..._index.ASSIGNMENT_OPERATORS);
+ const pattern = (0, _utils.assertOneOf)("=");
+ return function (node, key, val) {
+ const validator = (0, _is.default)("Pattern", node.left) ? pattern : identifier;
+ validator(node, key, val);
+ };
+ }()
+ },
+ left: {
+ validate: !process$1.env.BABEL_TYPES_8_BREAKING ? (0, _utils.assertNodeType)("LVal", "OptionalMemberExpression") : (0, _utils.assertNodeType)("Identifier", "MemberExpression", "OptionalMemberExpression", "ArrayPattern", "ObjectPattern", "TSAsExpression", "TSSatisfiesExpression", "TSTypeAssertion", "TSNonNullExpression")
+ },
+ right: {
+ validate: (0, _utils.assertNodeType)("Expression")
+ }
+ },
+ builder: ["operator", "left", "right"],
+ visitor: ["left", "right"],
+ aliases: ["Expression"]
+ });
+ defineType("BinaryExpression", {
+ builder: ["operator", "left", "right"],
+ fields: {
+ operator: {
+ validate: (0, _utils.assertOneOf)(..._index.BINARY_OPERATORS)
+ },
+ left: {
+ validate: function () {
+ const expression = (0, _utils.assertNodeType)("Expression");
+ const inOp = (0, _utils.assertNodeType)("Expression", "PrivateName");
+ const validator = Object.assign(function (node, key, val) {
+ const validator = node.operator === "in" ? inOp : expression;
+ validator(node, key, val);
+ }, {
+ oneOfNodeTypes: ["Expression", "PrivateName"]
+ });
+ return validator;
+ }()
+ },
+ right: {
+ validate: (0, _utils.assertNodeType)("Expression")
+ }
+ },
+ visitor: ["left", "right"],
+ aliases: ["Binary", "Expression"]
+ });
+ defineType("InterpreterDirective", {
+ builder: ["value"],
+ fields: {
+ value: {
+ validate: (0, _utils.assertValueType)("string")
+ }
+ }
+ });
+ defineType("Directive", {
+ visitor: ["value"],
+ fields: {
+ value: {
+ validate: (0, _utils.assertNodeType)("DirectiveLiteral")
+ }
+ }
+ });
+ defineType("DirectiveLiteral", {
+ builder: ["value"],
+ fields: {
+ value: {
+ validate: (0, _utils.assertValueType)("string")
+ }
+ }
+ });
+ defineType("BlockStatement", {
+ builder: ["body", "directives"],
+ visitor: ["directives", "body"],
+ fields: {
+ directives: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("Directive"))),
+ default: []
+ },
+ body: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("Statement")))
+ }
+ },
+ aliases: ["Scopable", "BlockParent", "Block", "Statement"]
+ });
+ defineType("BreakStatement", {
+ visitor: ["label"],
+ fields: {
+ label: {
+ validate: (0, _utils.assertNodeType)("Identifier"),
+ optional: true
+ }
+ },
+ aliases: ["Statement", "Terminatorless", "CompletionStatement"]
+ });
+ defineType("CallExpression", {
+ visitor: ["callee", "arguments", "typeParameters", "typeArguments"],
+ builder: ["callee", "arguments"],
+ aliases: ["Expression"],
+ fields: Object.assign({
+ callee: {
+ validate: (0, _utils.assertNodeType)("Expression", "Super", "V8IntrinsicIdentifier")
+ },
+ arguments: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("Expression", "SpreadElement", "JSXNamespacedName", "ArgumentPlaceholder")))
+ }
+ }, !process$1.env.BABEL_TYPES_8_BREAKING ? {
+ optional: {
+ validate: (0, _utils.assertOneOf)(true, false),
+ optional: true
+ }
+ } : {}, {
+ typeArguments: {
+ validate: (0, _utils.assertNodeType)("TypeParameterInstantiation"),
+ optional: true
+ },
+ typeParameters: {
+ validate: (0, _utils.assertNodeType)("TSTypeParameterInstantiation"),
+ optional: true
+ }
+ })
+ });
+ defineType("CatchClause", {
+ visitor: ["param", "body"],
+ fields: {
+ param: {
+ validate: (0, _utils.assertNodeType)("Identifier", "ArrayPattern", "ObjectPattern"),
+ optional: true
+ },
+ body: {
+ validate: (0, _utils.assertNodeType)("BlockStatement")
+ }
+ },
+ aliases: ["Scopable", "BlockParent"]
+ });
+ defineType("ConditionalExpression", {
+ visitor: ["test", "consequent", "alternate"],
+ fields: {
+ test: {
+ validate: (0, _utils.assertNodeType)("Expression")
+ },
+ consequent: {
+ validate: (0, _utils.assertNodeType)("Expression")
+ },
+ alternate: {
+ validate: (0, _utils.assertNodeType)("Expression")
+ }
+ },
+ aliases: ["Expression", "Conditional"]
+ });
+ defineType("ContinueStatement", {
+ visitor: ["label"],
+ fields: {
+ label: {
+ validate: (0, _utils.assertNodeType)("Identifier"),
+ optional: true
+ }
+ },
+ aliases: ["Statement", "Terminatorless", "CompletionStatement"]
+ });
+ defineType("DebuggerStatement", {
+ aliases: ["Statement"]
+ });
+ defineType("DoWhileStatement", {
+ visitor: ["test", "body"],
+ fields: {
+ test: {
+ validate: (0, _utils.assertNodeType)("Expression")
+ },
+ body: {
+ validate: (0, _utils.assertNodeType)("Statement")
+ }
+ },
+ aliases: ["Statement", "BlockParent", "Loop", "While", "Scopable"]
+ });
+ defineType("EmptyStatement", {
+ aliases: ["Statement"]
+ });
+ defineType("ExpressionStatement", {
+ visitor: ["expression"],
+ fields: {
+ expression: {
+ validate: (0, _utils.assertNodeType)("Expression")
+ }
+ },
+ aliases: ["Statement", "ExpressionWrapper"]
+ });
+ defineType("File", {
+ builder: ["program", "comments", "tokens"],
+ visitor: ["program"],
+ fields: {
+ program: {
+ validate: (0, _utils.assertNodeType)("Program")
+ },
+ comments: {
+ validate: !process$1.env.BABEL_TYPES_8_BREAKING ? Object.assign(() => {}, {
+ each: {
+ oneOfNodeTypes: ["CommentBlock", "CommentLine"]
+ }
+ }) : (0, _utils.assertEach)((0, _utils.assertNodeType)("CommentBlock", "CommentLine")),
+ optional: true
+ },
+ tokens: {
+ validate: (0, _utils.assertEach)(Object.assign(() => {}, {
+ type: "any"
+ })),
+ optional: true
+ }
+ }
+ });
+ defineType("ForInStatement", {
+ visitor: ["left", "right", "body"],
+ aliases: ["Scopable", "Statement", "For", "BlockParent", "Loop", "ForXStatement"],
+ fields: {
+ left: {
+ validate: !process$1.env.BABEL_TYPES_8_BREAKING ? (0, _utils.assertNodeType)("VariableDeclaration", "LVal") : (0, _utils.assertNodeType)("VariableDeclaration", "Identifier", "MemberExpression", "ArrayPattern", "ObjectPattern", "TSAsExpression", "TSSatisfiesExpression", "TSTypeAssertion", "TSNonNullExpression")
+ },
+ right: {
+ validate: (0, _utils.assertNodeType)("Expression")
+ },
+ body: {
+ validate: (0, _utils.assertNodeType)("Statement")
+ }
+ }
+ });
+ defineType("ForStatement", {
+ visitor: ["init", "test", "update", "body"],
+ aliases: ["Scopable", "Statement", "For", "BlockParent", "Loop"],
+ fields: {
+ init: {
+ validate: (0, _utils.assertNodeType)("VariableDeclaration", "Expression"),
+ optional: true
+ },
+ test: {
+ validate: (0, _utils.assertNodeType)("Expression"),
+ optional: true
+ },
+ update: {
+ validate: (0, _utils.assertNodeType)("Expression"),
+ optional: true
+ },
+ body: {
+ validate: (0, _utils.assertNodeType)("Statement")
+ }
+ }
+ });
+ const functionCommon = () => ({
+ params: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("Identifier", "Pattern", "RestElement")))
+ },
+ generator: {
+ default: false
+ },
+ async: {
+ default: false
+ }
+ });
+ core.functionCommon = functionCommon;
+ const functionTypeAnnotationCommon = () => ({
+ returnType: {
+ validate: (0, _utils.assertNodeType)("TypeAnnotation", "TSTypeAnnotation", "Noop"),
+ optional: true
+ },
+ typeParameters: {
+ validate: (0, _utils.assertNodeType)("TypeParameterDeclaration", "TSTypeParameterDeclaration", "Noop"),
+ optional: true
+ }
+ });
+ core.functionTypeAnnotationCommon = functionTypeAnnotationCommon;
+ const functionDeclarationCommon = () => Object.assign({}, functionCommon(), {
+ declare: {
+ validate: (0, _utils.assertValueType)("boolean"),
+ optional: true
+ },
+ id: {
+ validate: (0, _utils.assertNodeType)("Identifier"),
+ optional: true
+ }
+ });
+ core.functionDeclarationCommon = functionDeclarationCommon;
+ defineType("FunctionDeclaration", {
+ builder: ["id", "params", "body", "generator", "async"],
+ visitor: ["id", "params", "body", "returnType", "typeParameters"],
+ fields: Object.assign({}, functionDeclarationCommon(), functionTypeAnnotationCommon(), {
+ body: {
+ validate: (0, _utils.assertNodeType)("BlockStatement")
+ },
+ predicate: {
+ validate: (0, _utils.assertNodeType)("DeclaredPredicate", "InferredPredicate"),
+ optional: true
+ }
+ }),
+ aliases: ["Scopable", "Function", "BlockParent", "FunctionParent", "Statement", "Pureish", "Declaration"],
+ validate: function () {
+ if (!process$1.env.BABEL_TYPES_8_BREAKING) return () => {};
+ const identifier = (0, _utils.assertNodeType)("Identifier");
+ return function (parent, key, node) {
+ if (!(0, _is.default)("ExportDefaultDeclaration", parent)) {
+ identifier(node, "id", node.id);
+ }
+ };
+ }()
+ });
+ defineType("FunctionExpression", {
+ inherits: "FunctionDeclaration",
+ aliases: ["Scopable", "Function", "BlockParent", "FunctionParent", "Expression", "Pureish"],
+ fields: Object.assign({}, functionCommon(), functionTypeAnnotationCommon(), {
+ id: {
+ validate: (0, _utils.assertNodeType)("Identifier"),
+ optional: true
+ },
+ body: {
+ validate: (0, _utils.assertNodeType)("BlockStatement")
+ },
+ predicate: {
+ validate: (0, _utils.assertNodeType)("DeclaredPredicate", "InferredPredicate"),
+ optional: true
+ }
+ })
+ });
+ const patternLikeCommon = () => ({
+ typeAnnotation: {
+ validate: (0, _utils.assertNodeType)("TypeAnnotation", "TSTypeAnnotation", "Noop"),
+ optional: true
+ },
+ optional: {
+ validate: (0, _utils.assertValueType)("boolean"),
+ optional: true
+ },
+ decorators: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("Decorator"))),
+ optional: true
+ }
+ });
+ core.patternLikeCommon = patternLikeCommon;
+ defineType("Identifier", {
+ builder: ["name"],
+ visitor: ["typeAnnotation", "decorators"],
+ aliases: ["Expression", "PatternLike", "LVal", "TSEntityName"],
+ fields: Object.assign({}, patternLikeCommon(), {
+ name: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("string"), Object.assign(function (node, key, val) {
+ if (!process$1.env.BABEL_TYPES_8_BREAKING) return;
+ if (!(0, _isValidIdentifier.default)(val, false)) {
+ throw new TypeError(`"${val}" is not a valid identifier name`);
+ }
+ }, {
+ type: "string"
+ }))
+ }
+ }),
+ validate(parent, key, node) {
+ if (!process$1.env.BABEL_TYPES_8_BREAKING) return;
+ const match = /\.(\w+)$/.exec(key);
+ if (!match) return;
+ const [, parentKey] = match;
+ const nonComp = {
+ computed: false
+ };
+ if (parentKey === "property") {
+ if ((0, _is.default)("MemberExpression", parent, nonComp)) return;
+ if ((0, _is.default)("OptionalMemberExpression", parent, nonComp)) return;
+ } else if (parentKey === "key") {
+ if ((0, _is.default)("Property", parent, nonComp)) return;
+ if ((0, _is.default)("Method", parent, nonComp)) return;
+ } else if (parentKey === "exported") {
+ if ((0, _is.default)("ExportSpecifier", parent)) return;
+ } else if (parentKey === "imported") {
+ if ((0, _is.default)("ImportSpecifier", parent, {
+ imported: node
+ })) return;
+ } else if (parentKey === "meta") {
+ if ((0, _is.default)("MetaProperty", parent, {
+ meta: node
+ })) return;
+ }
+ if (((0, _helperValidatorIdentifier.isKeyword)(node.name) || (0, _helperValidatorIdentifier.isReservedWord)(node.name, false)) && node.name !== "this") {
+ throw new TypeError(`"${node.name}" is not a valid identifier`);
+ }
+ }
+ });
+ defineType("IfStatement", {
+ visitor: ["test", "consequent", "alternate"],
+ aliases: ["Statement", "Conditional"],
+ fields: {
+ test: {
+ validate: (0, _utils.assertNodeType)("Expression")
+ },
+ consequent: {
+ validate: (0, _utils.assertNodeType)("Statement")
+ },
+ alternate: {
+ optional: true,
+ validate: (0, _utils.assertNodeType)("Statement")
+ }
+ }
+ });
+ defineType("LabeledStatement", {
+ visitor: ["label", "body"],
+ aliases: ["Statement"],
+ fields: {
+ label: {
+ validate: (0, _utils.assertNodeType)("Identifier")
+ },
+ body: {
+ validate: (0, _utils.assertNodeType)("Statement")
+ }
+ }
+ });
+ defineType("StringLiteral", {
+ builder: ["value"],
+ fields: {
+ value: {
+ validate: (0, _utils.assertValueType)("string")
+ }
+ },
+ aliases: ["Expression", "Pureish", "Literal", "Immutable"]
+ });
+ defineType("NumericLiteral", {
+ builder: ["value"],
+ deprecatedAlias: "NumberLiteral",
+ fields: {
+ value: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("number"), Object.assign(function (node, key, val) {
+ }, {
+ type: "number"
+ }))
+ }
+ },
+ aliases: ["Expression", "Pureish", "Literal", "Immutable"]
+ });
+ defineType("NullLiteral", {
+ aliases: ["Expression", "Pureish", "Literal", "Immutable"]
+ });
+ defineType("BooleanLiteral", {
+ builder: ["value"],
+ fields: {
+ value: {
+ validate: (0, _utils.assertValueType)("boolean")
+ }
+ },
+ aliases: ["Expression", "Pureish", "Literal", "Immutable"]
+ });
+ defineType("RegExpLiteral", {
+ builder: ["pattern", "flags"],
+ deprecatedAlias: "RegexLiteral",
+ aliases: ["Expression", "Pureish", "Literal"],
+ fields: {
+ pattern: {
+ validate: (0, _utils.assertValueType)("string")
+ },
+ flags: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("string"), Object.assign(function (node, key, val) {
+ if (!process$1.env.BABEL_TYPES_8_BREAKING) return;
+ const invalid = /[^gimsuy]/.exec(val);
+ if (invalid) {
+ throw new TypeError(`"${invalid[0]}" is not a valid RegExp flag`);
+ }
+ }, {
+ type: "string"
+ })),
+ default: ""
+ }
+ }
+ });
+ defineType("LogicalExpression", {
+ builder: ["operator", "left", "right"],
+ visitor: ["left", "right"],
+ aliases: ["Binary", "Expression"],
+ fields: {
+ operator: {
+ validate: (0, _utils.assertOneOf)(..._index.LOGICAL_OPERATORS)
+ },
+ left: {
+ validate: (0, _utils.assertNodeType)("Expression")
+ },
+ right: {
+ validate: (0, _utils.assertNodeType)("Expression")
+ }
+ }
+ });
+ defineType("MemberExpression", {
+ builder: ["object", "property", "computed", ...(!process$1.env.BABEL_TYPES_8_BREAKING ? ["optional"] : [])],
+ visitor: ["object", "property"],
+ aliases: ["Expression", "LVal"],
+ fields: Object.assign({
+ object: {
+ validate: (0, _utils.assertNodeType)("Expression", "Super")
+ },
+ property: {
+ validate: function () {
+ const normal = (0, _utils.assertNodeType)("Identifier", "PrivateName");
+ const computed = (0, _utils.assertNodeType)("Expression");
+ const validator = function (node, key, val) {
+ const validator = node.computed ? computed : normal;
+ validator(node, key, val);
+ };
+ validator.oneOfNodeTypes = ["Expression", "Identifier", "PrivateName"];
+ return validator;
+ }()
+ },
+ computed: {
+ default: false
+ }
+ }, !process$1.env.BABEL_TYPES_8_BREAKING ? {
+ optional: {
+ validate: (0, _utils.assertOneOf)(true, false),
+ optional: true
+ }
+ } : {})
+ });
+ defineType("NewExpression", {
+ inherits: "CallExpression"
+ });
+ defineType("Program", {
+ visitor: ["directives", "body"],
+ builder: ["body", "directives", "sourceType", "interpreter"],
+ fields: {
+ sourceFile: {
+ validate: (0, _utils.assertValueType)("string")
+ },
+ sourceType: {
+ validate: (0, _utils.assertOneOf)("script", "module"),
+ default: "script"
+ },
+ interpreter: {
+ validate: (0, _utils.assertNodeType)("InterpreterDirective"),
+ default: null,
+ optional: true
+ },
+ directives: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("Directive"))),
+ default: []
+ },
+ body: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("Statement")))
+ }
+ },
+ aliases: ["Scopable", "BlockParent", "Block"]
+ });
+ defineType("ObjectExpression", {
+ visitor: ["properties"],
+ aliases: ["Expression"],
+ fields: {
+ properties: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("ObjectMethod", "ObjectProperty", "SpreadElement")))
+ }
+ }
+ });
+ defineType("ObjectMethod", {
+ builder: ["kind", "key", "params", "body", "computed", "generator", "async"],
+ fields: Object.assign({}, functionCommon(), functionTypeAnnotationCommon(), {
+ kind: Object.assign({
+ validate: (0, _utils.assertOneOf)("method", "get", "set")
+ }, !process$1.env.BABEL_TYPES_8_BREAKING ? {
+ default: "method"
+ } : {}),
+ computed: {
+ default: false
+ },
+ key: {
+ validate: function () {
+ const normal = (0, _utils.assertNodeType)("Identifier", "StringLiteral", "NumericLiteral", "BigIntLiteral");
+ const computed = (0, _utils.assertNodeType)("Expression");
+ const validator = function (node, key, val) {
+ const validator = node.computed ? computed : normal;
+ validator(node, key, val);
+ };
+ validator.oneOfNodeTypes = ["Expression", "Identifier", "StringLiteral", "NumericLiteral", "BigIntLiteral"];
+ return validator;
+ }()
+ },
+ decorators: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("Decorator"))),
+ optional: true
+ },
+ body: {
+ validate: (0, _utils.assertNodeType)("BlockStatement")
+ }
+ }),
+ visitor: ["key", "params", "body", "decorators", "returnType", "typeParameters"],
+ aliases: ["UserWhitespacable", "Function", "Scopable", "BlockParent", "FunctionParent", "Method", "ObjectMember"]
+ });
+ defineType("ObjectProperty", {
+ builder: ["key", "value", "computed", "shorthand", ...(!process$1.env.BABEL_TYPES_8_BREAKING ? ["decorators"] : [])],
+ fields: {
+ computed: {
+ default: false
+ },
+ key: {
+ validate: function () {
+ const normal = (0, _utils.assertNodeType)("Identifier", "StringLiteral", "NumericLiteral", "BigIntLiteral", "DecimalLiteral", "PrivateName");
+ const computed = (0, _utils.assertNodeType)("Expression");
+ const validator = Object.assign(function (node, key, val) {
+ const validator = node.computed ? computed : normal;
+ validator(node, key, val);
+ }, {
+ oneOfNodeTypes: ["Expression", "Identifier", "StringLiteral", "NumericLiteral", "BigIntLiteral", "DecimalLiteral", "PrivateName"]
+ });
+ return validator;
+ }()
+ },
+ value: {
+ validate: (0, _utils.assertNodeType)("Expression", "PatternLike")
+ },
+ shorthand: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("boolean"), Object.assign(function (node, key, val) {
+ if (!process$1.env.BABEL_TYPES_8_BREAKING) return;
+ if (val && node.computed) {
+ throw new TypeError("Property shorthand of ObjectProperty cannot be true if computed is true");
+ }
+ }, {
+ type: "boolean"
+ }), function (node, key, val) {
+ if (!process$1.env.BABEL_TYPES_8_BREAKING) return;
+ if (val && !(0, _is.default)("Identifier", node.key)) {
+ throw new TypeError("Property shorthand of ObjectProperty cannot be true if key is not an Identifier");
+ }
+ }),
+ default: false
+ },
+ decorators: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("Decorator"))),
+ optional: true
+ }
+ },
+ visitor: ["key", "value", "decorators"],
+ aliases: ["UserWhitespacable", "Property", "ObjectMember"],
+ validate: function () {
+ const pattern = (0, _utils.assertNodeType)("Identifier", "Pattern", "TSAsExpression", "TSSatisfiesExpression", "TSNonNullExpression", "TSTypeAssertion");
+ const expression = (0, _utils.assertNodeType)("Expression");
+ return function (parent, key, node) {
+ if (!process$1.env.BABEL_TYPES_8_BREAKING) return;
+ const validator = (0, _is.default)("ObjectPattern", parent) ? pattern : expression;
+ validator(node, "value", node.value);
+ };
+ }()
+ });
+ defineType("RestElement", {
+ visitor: ["argument", "typeAnnotation"],
+ builder: ["argument"],
+ aliases: ["LVal", "PatternLike"],
+ deprecatedAlias: "RestProperty",
+ fields: Object.assign({}, patternLikeCommon(), {
+ argument: {
+ validate: !process$1.env.BABEL_TYPES_8_BREAKING ? (0, _utils.assertNodeType)("LVal") : (0, _utils.assertNodeType)("Identifier", "ArrayPattern", "ObjectPattern", "MemberExpression", "TSAsExpression", "TSSatisfiesExpression", "TSTypeAssertion", "TSNonNullExpression")
+ }
+ }),
+ validate(parent, key) {
+ if (!process$1.env.BABEL_TYPES_8_BREAKING) return;
+ const match = /(\w+)\[(\d+)\]/.exec(key);
+ if (!match) throw new Error("Internal Babel error: malformed key.");
+ const [, listKey, index] = match;
+ if (parent[listKey].length > +index + 1) {
+ throw new TypeError(`RestElement must be last element of ${listKey}`);
+ }
+ }
+ });
+ defineType("ReturnStatement", {
+ visitor: ["argument"],
+ aliases: ["Statement", "Terminatorless", "CompletionStatement"],
+ fields: {
+ argument: {
+ validate: (0, _utils.assertNodeType)("Expression"),
+ optional: true
+ }
+ }
+ });
+ defineType("SequenceExpression", {
+ visitor: ["expressions"],
+ fields: {
+ expressions: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("Expression")))
+ }
+ },
+ aliases: ["Expression"]
+ });
+ defineType("ParenthesizedExpression", {
+ visitor: ["expression"],
+ aliases: ["Expression", "ExpressionWrapper"],
+ fields: {
+ expression: {
+ validate: (0, _utils.assertNodeType)("Expression")
+ }
+ }
+ });
+ defineType("SwitchCase", {
+ visitor: ["test", "consequent"],
+ fields: {
+ test: {
+ validate: (0, _utils.assertNodeType)("Expression"),
+ optional: true
+ },
+ consequent: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("Statement")))
+ }
+ }
+ });
+ defineType("SwitchStatement", {
+ visitor: ["discriminant", "cases"],
+ aliases: ["Statement", "BlockParent", "Scopable"],
+ fields: {
+ discriminant: {
+ validate: (0, _utils.assertNodeType)("Expression")
+ },
+ cases: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("SwitchCase")))
+ }
+ }
+ });
+ defineType("ThisExpression", {
+ aliases: ["Expression"]
+ });
+ defineType("ThrowStatement", {
+ visitor: ["argument"],
+ aliases: ["Statement", "Terminatorless", "CompletionStatement"],
+ fields: {
+ argument: {
+ validate: (0, _utils.assertNodeType)("Expression")
+ }
+ }
+ });
+ defineType("TryStatement", {
+ visitor: ["block", "handler", "finalizer"],
+ aliases: ["Statement"],
+ fields: {
+ block: {
+ validate: (0, _utils.chain)((0, _utils.assertNodeType)("BlockStatement"), Object.assign(function (node) {
+ if (!process$1.env.BABEL_TYPES_8_BREAKING) return;
+ if (!node.handler && !node.finalizer) {
+ throw new TypeError("TryStatement expects either a handler or finalizer, or both");
+ }
+ }, {
+ oneOfNodeTypes: ["BlockStatement"]
+ }))
+ },
+ handler: {
+ optional: true,
+ validate: (0, _utils.assertNodeType)("CatchClause")
+ },
+ finalizer: {
+ optional: true,
+ validate: (0, _utils.assertNodeType)("BlockStatement")
+ }
+ }
+ });
+ defineType("UnaryExpression", {
+ builder: ["operator", "argument", "prefix"],
+ fields: {
+ prefix: {
+ default: true
+ },
+ argument: {
+ validate: (0, _utils.assertNodeType)("Expression")
+ },
+ operator: {
+ validate: (0, _utils.assertOneOf)(..._index.UNARY_OPERATORS)
+ }
+ },
+ visitor: ["argument"],
+ aliases: ["UnaryLike", "Expression"]
+ });
+ defineType("UpdateExpression", {
+ builder: ["operator", "argument", "prefix"],
+ fields: {
+ prefix: {
+ default: false
+ },
+ argument: {
+ validate: !process$1.env.BABEL_TYPES_8_BREAKING ? (0, _utils.assertNodeType)("Expression") : (0, _utils.assertNodeType)("Identifier", "MemberExpression")
+ },
+ operator: {
+ validate: (0, _utils.assertOneOf)(..._index.UPDATE_OPERATORS)
+ }
+ },
+ visitor: ["argument"],
+ aliases: ["Expression"]
+ });
+ defineType("VariableDeclaration", {
+ builder: ["kind", "declarations"],
+ visitor: ["declarations"],
+ aliases: ["Statement", "Declaration"],
+ fields: {
+ declare: {
+ validate: (0, _utils.assertValueType)("boolean"),
+ optional: true
+ },
+ kind: {
+ validate: (0, _utils.assertOneOf)("var", "let", "const", "using", "await using")
+ },
+ declarations: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("VariableDeclarator")))
+ }
+ },
+ validate(parent, key, node) {
+ if (!process$1.env.BABEL_TYPES_8_BREAKING) return;
+ if (!(0, _is.default)("ForXStatement", parent, {
+ left: node
+ })) return;
+ if (node.declarations.length !== 1) {
+ throw new TypeError(`Exactly one VariableDeclarator is required in the VariableDeclaration of a ${parent.type}`);
+ }
+ }
+ });
+ defineType("VariableDeclarator", {
+ visitor: ["id", "init"],
+ fields: {
+ id: {
+ validate: function () {
+ if (!process$1.env.BABEL_TYPES_8_BREAKING) {
+ return (0, _utils.assertNodeType)("LVal");
+ }
+ const normal = (0, _utils.assertNodeType)("Identifier", "ArrayPattern", "ObjectPattern");
+ const without = (0, _utils.assertNodeType)("Identifier");
+ return function (node, key, val) {
+ const validator = node.init ? normal : without;
+ validator(node, key, val);
+ };
+ }()
+ },
+ definite: {
+ optional: true,
+ validate: (0, _utils.assertValueType)("boolean")
+ },
+ init: {
+ optional: true,
+ validate: (0, _utils.assertNodeType)("Expression")
+ }
+ }
+ });
+ defineType("WhileStatement", {
+ visitor: ["test", "body"],
+ aliases: ["Statement", "BlockParent", "Loop", "While", "Scopable"],
+ fields: {
+ test: {
+ validate: (0, _utils.assertNodeType)("Expression")
+ },
+ body: {
+ validate: (0, _utils.assertNodeType)("Statement")
+ }
+ }
+ });
+ defineType("WithStatement", {
+ visitor: ["object", "body"],
+ aliases: ["Statement"],
+ fields: {
+ object: {
+ validate: (0, _utils.assertNodeType)("Expression")
+ },
+ body: {
+ validate: (0, _utils.assertNodeType)("Statement")
+ }
+ }
+ });
+ defineType("AssignmentPattern", {
+ visitor: ["left", "right", "decorators"],
+ builder: ["left", "right"],
+ aliases: ["Pattern", "PatternLike", "LVal"],
+ fields: Object.assign({}, patternLikeCommon(), {
+ left: {
+ validate: (0, _utils.assertNodeType)("Identifier", "ObjectPattern", "ArrayPattern", "MemberExpression", "TSAsExpression", "TSSatisfiesExpression", "TSTypeAssertion", "TSNonNullExpression")
+ },
+ right: {
+ validate: (0, _utils.assertNodeType)("Expression")
+ },
+ decorators: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("Decorator"))),
+ optional: true
+ }
+ })
+ });
+ defineType("ArrayPattern", {
+ visitor: ["elements", "typeAnnotation"],
+ builder: ["elements"],
+ aliases: ["Pattern", "PatternLike", "LVal"],
+ fields: Object.assign({}, patternLikeCommon(), {
+ elements: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeOrValueType)("null", "PatternLike", "LVal")))
+ }
+ })
+ });
+ defineType("ArrowFunctionExpression", {
+ builder: ["params", "body", "async"],
+ visitor: ["params", "body", "returnType", "typeParameters"],
+ aliases: ["Scopable", "Function", "BlockParent", "FunctionParent", "Expression", "Pureish"],
+ fields: Object.assign({}, functionCommon(), functionTypeAnnotationCommon(), {
+ expression: {
+ validate: (0, _utils.assertValueType)("boolean")
+ },
+ body: {
+ validate: (0, _utils.assertNodeType)("BlockStatement", "Expression")
+ },
+ predicate: {
+ validate: (0, _utils.assertNodeType)("DeclaredPredicate", "InferredPredicate"),
+ optional: true
+ }
+ })
+ });
+ defineType("ClassBody", {
+ visitor: ["body"],
+ fields: {
+ body: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("ClassMethod", "ClassPrivateMethod", "ClassProperty", "ClassPrivateProperty", "ClassAccessorProperty", "TSDeclareMethod", "TSIndexSignature", "StaticBlock")))
+ }
+ }
+ });
+ defineType("ClassExpression", {
+ builder: ["id", "superClass", "body", "decorators"],
+ visitor: ["id", "body", "superClass", "mixins", "typeParameters", "superTypeParameters", "implements", "decorators"],
+ aliases: ["Scopable", "Class", "Expression"],
+ fields: {
+ id: {
+ validate: (0, _utils.assertNodeType)("Identifier"),
+ optional: true
+ },
+ typeParameters: {
+ validate: (0, _utils.assertNodeType)("TypeParameterDeclaration", "TSTypeParameterDeclaration", "Noop"),
+ optional: true
+ },
+ body: {
+ validate: (0, _utils.assertNodeType)("ClassBody")
+ },
+ superClass: {
+ optional: true,
+ validate: (0, _utils.assertNodeType)("Expression")
+ },
+ superTypeParameters: {
+ validate: (0, _utils.assertNodeType)("TypeParameterInstantiation", "TSTypeParameterInstantiation"),
+ optional: true
+ },
+ implements: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("TSExpressionWithTypeArguments", "ClassImplements"))),
+ optional: true
+ },
+ decorators: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("Decorator"))),
+ optional: true
+ },
+ mixins: {
+ validate: (0, _utils.assertNodeType)("InterfaceExtends"),
+ optional: true
+ }
+ }
+ });
+ defineType("ClassDeclaration", {
+ inherits: "ClassExpression",
+ aliases: ["Scopable", "Class", "Statement", "Declaration"],
+ fields: {
+ id: {
+ validate: (0, _utils.assertNodeType)("Identifier"),
+ optional: true
+ },
+ typeParameters: {
+ validate: (0, _utils.assertNodeType)("TypeParameterDeclaration", "TSTypeParameterDeclaration", "Noop"),
+ optional: true
+ },
+ body: {
+ validate: (0, _utils.assertNodeType)("ClassBody")
+ },
+ superClass: {
+ optional: true,
+ validate: (0, _utils.assertNodeType)("Expression")
+ },
+ superTypeParameters: {
+ validate: (0, _utils.assertNodeType)("TypeParameterInstantiation", "TSTypeParameterInstantiation"),
+ optional: true
+ },
+ implements: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("TSExpressionWithTypeArguments", "ClassImplements"))),
+ optional: true
+ },
+ decorators: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("Decorator"))),
+ optional: true
+ },
+ mixins: {
+ validate: (0, _utils.assertNodeType)("InterfaceExtends"),
+ optional: true
+ },
+ declare: {
+ validate: (0, _utils.assertValueType)("boolean"),
+ optional: true
+ },
+ abstract: {
+ validate: (0, _utils.assertValueType)("boolean"),
+ optional: true
+ }
+ },
+ validate: function () {
+ const identifier = (0, _utils.assertNodeType)("Identifier");
+ return function (parent, key, node) {
+ if (!process$1.env.BABEL_TYPES_8_BREAKING) return;
+ if (!(0, _is.default)("ExportDefaultDeclaration", parent)) {
+ identifier(node, "id", node.id);
+ }
+ };
+ }()
+ });
+ defineType("ExportAllDeclaration", {
+ builder: ["source"],
+ visitor: ["source", "attributes", "assertions"],
+ aliases: ["Statement", "Declaration", "ImportOrExportDeclaration", "ExportDeclaration"],
+ fields: {
+ source: {
+ validate: (0, _utils.assertNodeType)("StringLiteral")
+ },
+ exportKind: (0, _utils.validateOptional)((0, _utils.assertOneOf)("type", "value")),
+ attributes: {
+ optional: true,
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("ImportAttribute")))
+ },
+ assertions: {
+ optional: true,
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("ImportAttribute")))
+ }
+ }
+ });
+ defineType("ExportDefaultDeclaration", {
+ visitor: ["declaration"],
+ aliases: ["Statement", "Declaration", "ImportOrExportDeclaration", "ExportDeclaration"],
+ fields: {
+ declaration: {
+ validate: (0, _utils.assertNodeType)("TSDeclareFunction", "FunctionDeclaration", "ClassDeclaration", "Expression")
+ },
+ exportKind: (0, _utils.validateOptional)((0, _utils.assertOneOf)("value"))
+ }
+ });
+ defineType("ExportNamedDeclaration", {
+ builder: ["declaration", "specifiers", "source"],
+ visitor: ["declaration", "specifiers", "source", "attributes", "assertions"],
+ aliases: ["Statement", "Declaration", "ImportOrExportDeclaration", "ExportDeclaration"],
+ fields: {
+ declaration: {
+ optional: true,
+ validate: (0, _utils.chain)((0, _utils.assertNodeType)("Declaration"), Object.assign(function (node, key, val) {
+ if (!process$1.env.BABEL_TYPES_8_BREAKING) return;
+ if (val && node.specifiers.length) {
+ throw new TypeError("Only declaration or specifiers is allowed on ExportNamedDeclaration");
+ }
+ }, {
+ oneOfNodeTypes: ["Declaration"]
+ }), function (node, key, val) {
+ if (!process$1.env.BABEL_TYPES_8_BREAKING) return;
+ if (val && node.source) {
+ throw new TypeError("Cannot export a declaration from a source");
+ }
+ })
+ },
+ attributes: {
+ optional: true,
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("ImportAttribute")))
+ },
+ assertions: {
+ optional: true,
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("ImportAttribute")))
+ },
+ specifiers: {
+ default: [],
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)(function () {
+ const sourced = (0, _utils.assertNodeType)("ExportSpecifier", "ExportDefaultSpecifier", "ExportNamespaceSpecifier");
+ const sourceless = (0, _utils.assertNodeType)("ExportSpecifier");
+ if (!process$1.env.BABEL_TYPES_8_BREAKING) return sourced;
+ return function (node, key, val) {
+ const validator = node.source ? sourced : sourceless;
+ validator(node, key, val);
+ };
+ }()))
+ },
+ source: {
+ validate: (0, _utils.assertNodeType)("StringLiteral"),
+ optional: true
+ },
+ exportKind: (0, _utils.validateOptional)((0, _utils.assertOneOf)("type", "value"))
+ }
+ });
+ defineType("ExportSpecifier", {
+ visitor: ["local", "exported"],
+ aliases: ["ModuleSpecifier"],
+ fields: {
+ local: {
+ validate: (0, _utils.assertNodeType)("Identifier")
+ },
+ exported: {
+ validate: (0, _utils.assertNodeType)("Identifier", "StringLiteral")
+ },
+ exportKind: {
+ validate: (0, _utils.assertOneOf)("type", "value"),
+ optional: true
+ }
+ }
+ });
+ defineType("ForOfStatement", {
+ visitor: ["left", "right", "body"],
+ builder: ["left", "right", "body", "await"],
+ aliases: ["Scopable", "Statement", "For", "BlockParent", "Loop", "ForXStatement"],
+ fields: {
+ left: {
+ validate: function () {
+ if (!process$1.env.BABEL_TYPES_8_BREAKING) {
+ return (0, _utils.assertNodeType)("VariableDeclaration", "LVal");
+ }
+ const declaration = (0, _utils.assertNodeType)("VariableDeclaration");
+ const lval = (0, _utils.assertNodeType)("Identifier", "MemberExpression", "ArrayPattern", "ObjectPattern", "TSAsExpression", "TSSatisfiesExpression", "TSTypeAssertion", "TSNonNullExpression");
+ return function (node, key, val) {
+ if ((0, _is.default)("VariableDeclaration", val)) {
+ declaration(node, key, val);
+ } else {
+ lval(node, key, val);
+ }
+ };
+ }()
+ },
+ right: {
+ validate: (0, _utils.assertNodeType)("Expression")
+ },
+ body: {
+ validate: (0, _utils.assertNodeType)("Statement")
+ },
+ await: {
+ default: false
+ }
+ }
+ });
+ defineType("ImportDeclaration", {
+ builder: ["specifiers", "source"],
+ visitor: ["specifiers", "source", "attributes", "assertions"],
+ aliases: ["Statement", "Declaration", "ImportOrExportDeclaration"],
+ fields: {
+ attributes: {
+ optional: true,
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("ImportAttribute")))
+ },
+ assertions: {
+ optional: true,
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("ImportAttribute")))
+ },
+ module: {
+ optional: true,
+ validate: (0, _utils.assertValueType)("boolean")
+ },
+ phase: {
+ default: null,
+ validate: (0, _utils.assertOneOf)("source", "defer")
+ },
+ specifiers: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("ImportSpecifier", "ImportDefaultSpecifier", "ImportNamespaceSpecifier")))
+ },
+ source: {
+ validate: (0, _utils.assertNodeType)("StringLiteral")
+ },
+ importKind: {
+ validate: (0, _utils.assertOneOf)("type", "typeof", "value"),
+ optional: true
+ }
+ }
+ });
+ defineType("ImportDefaultSpecifier", {
+ visitor: ["local"],
+ aliases: ["ModuleSpecifier"],
+ fields: {
+ local: {
+ validate: (0, _utils.assertNodeType)("Identifier")
+ }
+ }
+ });
+ defineType("ImportNamespaceSpecifier", {
+ visitor: ["local"],
+ aliases: ["ModuleSpecifier"],
+ fields: {
+ local: {
+ validate: (0, _utils.assertNodeType)("Identifier")
+ }
+ }
+ });
+ defineType("ImportSpecifier", {
+ visitor: ["local", "imported"],
+ aliases: ["ModuleSpecifier"],
+ fields: {
+ local: {
+ validate: (0, _utils.assertNodeType)("Identifier")
+ },
+ imported: {
+ validate: (0, _utils.assertNodeType)("Identifier", "StringLiteral")
+ },
+ importKind: {
+ validate: (0, _utils.assertOneOf)("type", "typeof", "value"),
+ optional: true
+ }
+ }
+ });
+ defineType("ImportExpression", {
+ visitor: ["source", "options"],
+ aliases: ["Expression"],
+ fields: {
+ phase: {
+ default: null,
+ validate: (0, _utils.assertOneOf)("source", "defer")
+ },
+ source: {
+ validate: (0, _utils.assertNodeType)("Expression")
+ },
+ options: {
+ validate: (0, _utils.assertNodeType)("Expression"),
+ optional: true
+ }
+ }
+ });
+ defineType("MetaProperty", {
+ visitor: ["meta", "property"],
+ aliases: ["Expression"],
+ fields: {
+ meta: {
+ validate: (0, _utils.chain)((0, _utils.assertNodeType)("Identifier"), Object.assign(function (node, key, val) {
+ if (!process$1.env.BABEL_TYPES_8_BREAKING) return;
+ let property;
+ switch (val.name) {
+ case "function":
+ property = "sent";
+ break;
+ case "new":
+ property = "target";
+ break;
+ case "import":
+ property = "meta";
+ break;
+ }
+ if (!(0, _is.default)("Identifier", node.property, {
+ name: property
+ })) {
+ throw new TypeError("Unrecognised MetaProperty");
+ }
+ }, {
+ oneOfNodeTypes: ["Identifier"]
+ }))
+ },
+ property: {
+ validate: (0, _utils.assertNodeType)("Identifier")
+ }
+ }
+ });
+ const classMethodOrPropertyCommon = () => ({
+ abstract: {
+ validate: (0, _utils.assertValueType)("boolean"),
+ optional: true
+ },
+ accessibility: {
+ validate: (0, _utils.assertOneOf)("public", "private", "protected"),
+ optional: true
+ },
+ static: {
+ default: false
+ },
+ override: {
+ default: false
+ },
+ computed: {
+ default: false
+ },
+ optional: {
+ validate: (0, _utils.assertValueType)("boolean"),
+ optional: true
+ },
+ key: {
+ validate: (0, _utils.chain)(function () {
+ const normal = (0, _utils.assertNodeType)("Identifier", "StringLiteral", "NumericLiteral");
+ const computed = (0, _utils.assertNodeType)("Expression");
+ return function (node, key, val) {
+ const validator = node.computed ? computed : normal;
+ validator(node, key, val);
+ };
+ }(), (0, _utils.assertNodeType)("Identifier", "StringLiteral", "NumericLiteral", "BigIntLiteral", "Expression"))
+ }
+ });
+ core.classMethodOrPropertyCommon = classMethodOrPropertyCommon;
+ const classMethodOrDeclareMethodCommon = () => Object.assign({}, functionCommon(), classMethodOrPropertyCommon(), {
+ params: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("Identifier", "Pattern", "RestElement", "TSParameterProperty")))
+ },
+ kind: {
+ validate: (0, _utils.assertOneOf)("get", "set", "method", "constructor"),
+ default: "method"
+ },
+ access: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("string"), (0, _utils.assertOneOf)("public", "private", "protected")),
+ optional: true
+ },
+ decorators: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("Decorator"))),
+ optional: true
+ }
+ });
+ core.classMethodOrDeclareMethodCommon = classMethodOrDeclareMethodCommon;
+ defineType("ClassMethod", {
+ aliases: ["Function", "Scopable", "BlockParent", "FunctionParent", "Method"],
+ builder: ["kind", "key", "params", "body", "computed", "static", "generator", "async"],
+ visitor: ["key", "params", "body", "decorators", "returnType", "typeParameters"],
+ fields: Object.assign({}, classMethodOrDeclareMethodCommon(), functionTypeAnnotationCommon(), {
+ body: {
+ validate: (0, _utils.assertNodeType)("BlockStatement")
+ }
+ })
+ });
+ defineType("ObjectPattern", {
+ visitor: ["properties", "typeAnnotation", "decorators"],
+ builder: ["properties"],
+ aliases: ["Pattern", "PatternLike", "LVal"],
+ fields: Object.assign({}, patternLikeCommon(), {
+ properties: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("RestElement", "ObjectProperty")))
+ }
+ })
+ });
+ defineType("SpreadElement", {
+ visitor: ["argument"],
+ aliases: ["UnaryLike"],
+ deprecatedAlias: "SpreadProperty",
+ fields: {
+ argument: {
+ validate: (0, _utils.assertNodeType)("Expression")
+ }
+ }
+ });
+ defineType("Super", {
+ aliases: ["Expression"]
+ });
+ defineType("TaggedTemplateExpression", {
+ visitor: ["tag", "quasi", "typeParameters"],
+ builder: ["tag", "quasi"],
+ aliases: ["Expression"],
+ fields: {
+ tag: {
+ validate: (0, _utils.assertNodeType)("Expression")
+ },
+ quasi: {
+ validate: (0, _utils.assertNodeType)("TemplateLiteral")
+ },
+ typeParameters: {
+ validate: (0, _utils.assertNodeType)("TypeParameterInstantiation", "TSTypeParameterInstantiation"),
+ optional: true
+ }
+ }
+ });
+ defineType("TemplateElement", {
+ builder: ["value", "tail"],
+ fields: {
+ value: {
+ validate: (0, _utils.chain)((0, _utils.assertShape)({
+ raw: {
+ validate: (0, _utils.assertValueType)("string")
+ },
+ cooked: {
+ validate: (0, _utils.assertValueType)("string"),
+ optional: true
+ }
+ }), function templateElementCookedValidator(node) {
+ const raw = node.value.raw;
+ let unterminatedCalled = false;
+ const error = () => {
+ throw new Error("Internal @babel/types error.");
+ };
+ const {
+ str,
+ firstInvalidLoc
+ } = (0, _helperStringParser.readStringContents)("template", raw, 0, 0, 0, {
+ unterminated() {
+ unterminatedCalled = true;
+ },
+ strictNumericEscape: error,
+ invalidEscapeSequence: error,
+ numericSeparatorInEscapeSequence: error,
+ unexpectedNumericSeparator: error,
+ invalidDigit: error,
+ invalidCodePoint: error
+ });
+ if (!unterminatedCalled) throw new Error("Invalid raw");
+ node.value.cooked = firstInvalidLoc ? null : str;
+ })
+ },
+ tail: {
+ default: false
+ }
+ }
+ });
+ defineType("TemplateLiteral", {
+ visitor: ["quasis", "expressions"],
+ aliases: ["Expression", "Literal"],
+ fields: {
+ quasis: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("TemplateElement")))
+ },
+ expressions: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("Expression", "TSType")), function (node, key, val) {
+ if (node.quasis.length !== val.length + 1) {
+ throw new TypeError(`Number of ${node.type} quasis should be exactly one more than the number of expressions.\nExpected ${val.length + 1} quasis but got ${node.quasis.length}`);
+ }
+ })
+ }
+ }
+ });
+ defineType("YieldExpression", {
+ builder: ["argument", "delegate"],
+ visitor: ["argument"],
+ aliases: ["Expression", "Terminatorless"],
+ fields: {
+ delegate: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("boolean"), Object.assign(function (node, key, val) {
+ if (!process$1.env.BABEL_TYPES_8_BREAKING) return;
+ if (val && !node.argument) {
+ throw new TypeError("Property delegate of YieldExpression cannot be true if there is no argument");
+ }
+ }, {
+ type: "boolean"
+ })),
+ default: false
+ },
+ argument: {
+ optional: true,
+ validate: (0, _utils.assertNodeType)("Expression")
+ }
+ }
+ });
+ defineType("AwaitExpression", {
+ builder: ["argument"],
+ visitor: ["argument"],
+ aliases: ["Expression", "Terminatorless"],
+ fields: {
+ argument: {
+ validate: (0, _utils.assertNodeType)("Expression")
+ }
+ }
+ });
+ defineType("Import", {
+ aliases: ["Expression"]
+ });
+ defineType("BigIntLiteral", {
+ builder: ["value"],
+ fields: {
+ value: {
+ validate: (0, _utils.assertValueType)("string")
+ }
+ },
+ aliases: ["Expression", "Pureish", "Literal", "Immutable"]
+ });
+ defineType("ExportNamespaceSpecifier", {
+ visitor: ["exported"],
+ aliases: ["ModuleSpecifier"],
+ fields: {
+ exported: {
+ validate: (0, _utils.assertNodeType)("Identifier")
+ }
+ }
+ });
+ defineType("OptionalMemberExpression", {
+ builder: ["object", "property", "computed", "optional"],
+ visitor: ["object", "property"],
+ aliases: ["Expression"],
+ fields: {
+ object: {
+ validate: (0, _utils.assertNodeType)("Expression")
+ },
+ property: {
+ validate: function () {
+ const normal = (0, _utils.assertNodeType)("Identifier");
+ const computed = (0, _utils.assertNodeType)("Expression");
+ const validator = Object.assign(function (node, key, val) {
+ const validator = node.computed ? computed : normal;
+ validator(node, key, val);
+ }, {
+ oneOfNodeTypes: ["Expression", "Identifier"]
+ });
+ return validator;
+ }()
+ },
+ computed: {
+ default: false
+ },
+ optional: {
+ validate: !process$1.env.BABEL_TYPES_8_BREAKING ? (0, _utils.assertValueType)("boolean") : (0, _utils.chain)((0, _utils.assertValueType)("boolean"), (0, _utils.assertOptionalChainStart)())
+ }
+ }
+ });
+ defineType("OptionalCallExpression", {
+ visitor: ["callee", "arguments", "typeParameters", "typeArguments"],
+ builder: ["callee", "arguments", "optional"],
+ aliases: ["Expression"],
+ fields: {
+ callee: {
+ validate: (0, _utils.assertNodeType)("Expression")
+ },
+ arguments: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("Expression", "SpreadElement", "JSXNamespacedName", "ArgumentPlaceholder")))
+ },
+ optional: {
+ validate: !process$1.env.BABEL_TYPES_8_BREAKING ? (0, _utils.assertValueType)("boolean") : (0, _utils.chain)((0, _utils.assertValueType)("boolean"), (0, _utils.assertOptionalChainStart)())
+ },
+ typeArguments: {
+ validate: (0, _utils.assertNodeType)("TypeParameterInstantiation"),
+ optional: true
+ },
+ typeParameters: {
+ validate: (0, _utils.assertNodeType)("TSTypeParameterInstantiation"),
+ optional: true
+ }
+ }
+ });
+ defineType("ClassProperty", {
+ visitor: ["key", "value", "typeAnnotation", "decorators"],
+ builder: ["key", "value", "typeAnnotation", "decorators", "computed", "static"],
+ aliases: ["Property"],
+ fields: Object.assign({}, classMethodOrPropertyCommon(), {
+ value: {
+ validate: (0, _utils.assertNodeType)("Expression"),
+ optional: true
+ },
+ definite: {
+ validate: (0, _utils.assertValueType)("boolean"),
+ optional: true
+ },
+ typeAnnotation: {
+ validate: (0, _utils.assertNodeType)("TypeAnnotation", "TSTypeAnnotation", "Noop"),
+ optional: true
+ },
+ decorators: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("Decorator"))),
+ optional: true
+ },
+ readonly: {
+ validate: (0, _utils.assertValueType)("boolean"),
+ optional: true
+ },
+ declare: {
+ validate: (0, _utils.assertValueType)("boolean"),
+ optional: true
+ },
+ variance: {
+ validate: (0, _utils.assertNodeType)("Variance"),
+ optional: true
+ }
+ })
+ });
+ defineType("ClassAccessorProperty", {
+ visitor: ["key", "value", "typeAnnotation", "decorators"],
+ builder: ["key", "value", "typeAnnotation", "decorators", "computed", "static"],
+ aliases: ["Property", "Accessor"],
+ fields: Object.assign({}, classMethodOrPropertyCommon(), {
+ key: {
+ validate: (0, _utils.chain)(function () {
+ const normal = (0, _utils.assertNodeType)("Identifier", "StringLiteral", "NumericLiteral", "BigIntLiteral", "PrivateName");
+ const computed = (0, _utils.assertNodeType)("Expression");
+ return function (node, key, val) {
+ const validator = node.computed ? computed : normal;
+ validator(node, key, val);
+ };
+ }(), (0, _utils.assertNodeType)("Identifier", "StringLiteral", "NumericLiteral", "BigIntLiteral", "Expression", "PrivateName"))
+ },
+ value: {
+ validate: (0, _utils.assertNodeType)("Expression"),
+ optional: true
+ },
+ definite: {
+ validate: (0, _utils.assertValueType)("boolean"),
+ optional: true
+ },
+ typeAnnotation: {
+ validate: (0, _utils.assertNodeType)("TypeAnnotation", "TSTypeAnnotation", "Noop"),
+ optional: true
+ },
+ decorators: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("Decorator"))),
+ optional: true
+ },
+ readonly: {
+ validate: (0, _utils.assertValueType)("boolean"),
+ optional: true
+ },
+ declare: {
+ validate: (0, _utils.assertValueType)("boolean"),
+ optional: true
+ },
+ variance: {
+ validate: (0, _utils.assertNodeType)("Variance"),
+ optional: true
+ }
+ })
+ });
+ defineType("ClassPrivateProperty", {
+ visitor: ["key", "value", "decorators", "typeAnnotation"],
+ builder: ["key", "value", "decorators", "static"],
+ aliases: ["Property", "Private"],
+ fields: {
+ key: {
+ validate: (0, _utils.assertNodeType)("PrivateName")
+ },
+ value: {
+ validate: (0, _utils.assertNodeType)("Expression"),
+ optional: true
+ },
+ typeAnnotation: {
+ validate: (0, _utils.assertNodeType)("TypeAnnotation", "TSTypeAnnotation", "Noop"),
+ optional: true
+ },
+ decorators: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("Decorator"))),
+ optional: true
+ },
+ static: {
+ validate: (0, _utils.assertValueType)("boolean"),
+ default: false
+ },
+ readonly: {
+ validate: (0, _utils.assertValueType)("boolean"),
+ optional: true
+ },
+ definite: {
+ validate: (0, _utils.assertValueType)("boolean"),
+ optional: true
+ },
+ variance: {
+ validate: (0, _utils.assertNodeType)("Variance"),
+ optional: true
+ }
+ }
+ });
+ defineType("ClassPrivateMethod", {
+ builder: ["kind", "key", "params", "body", "static"],
+ visitor: ["key", "params", "body", "decorators", "returnType", "typeParameters"],
+ aliases: ["Function", "Scopable", "BlockParent", "FunctionParent", "Method", "Private"],
+ fields: Object.assign({}, classMethodOrDeclareMethodCommon(), functionTypeAnnotationCommon(), {
+ kind: {
+ validate: (0, _utils.assertOneOf)("get", "set", "method"),
+ default: "method"
+ },
+ key: {
+ validate: (0, _utils.assertNodeType)("PrivateName")
+ },
+ body: {
+ validate: (0, _utils.assertNodeType)("BlockStatement")
+ }
+ })
+ });
+ defineType("PrivateName", {
+ visitor: ["id"],
+ aliases: ["Private"],
+ fields: {
+ id: {
+ validate: (0, _utils.assertNodeType)("Identifier")
+ }
+ }
+ });
+ defineType("StaticBlock", {
+ visitor: ["body"],
+ fields: {
+ body: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("Statement")))
+ }
+ },
+ aliases: ["Scopable", "BlockParent", "FunctionParent"]
+ });
+
+
+ return core;
+ }
+
+ var flow$1 = {};
+
+ var hasRequiredFlow$1;
+
+ function requireFlow$1 () {
+ if (hasRequiredFlow$1) return flow$1;
+ hasRequiredFlow$1 = 1;
+
+ var _utils = requireUtils();
+ const defineType = (0, _utils.defineAliasedType)("Flow");
+ const defineInterfaceishType = name => {
+ const isDeclareClass = name === "DeclareClass";
+ defineType(name, {
+ builder: ["id", "typeParameters", "extends", "body"],
+ visitor: ["id", "typeParameters", "extends", ...(isDeclareClass ? ["mixins", "implements"] : []), "body"],
+ aliases: ["FlowDeclaration", "Statement", "Declaration"],
+ fields: Object.assign({
+ id: (0, _utils.validateType)("Identifier"),
+ typeParameters: (0, _utils.validateOptionalType)("TypeParameterDeclaration"),
+ extends: (0, _utils.validateOptional)((0, _utils.arrayOfType)("InterfaceExtends"))
+ }, isDeclareClass ? {
+ mixins: (0, _utils.validateOptional)((0, _utils.arrayOfType)("InterfaceExtends")),
+ implements: (0, _utils.validateOptional)((0, _utils.arrayOfType)("ClassImplements"))
+ } : {}, {
+ body: (0, _utils.validateType)("ObjectTypeAnnotation")
+ })
+ });
+ };
+ defineType("AnyTypeAnnotation", {
+ aliases: ["FlowType", "FlowBaseAnnotation"]
+ });
+ defineType("ArrayTypeAnnotation", {
+ visitor: ["elementType"],
+ aliases: ["FlowType"],
+ fields: {
+ elementType: (0, _utils.validateType)("FlowType")
+ }
+ });
+ defineType("BooleanTypeAnnotation", {
+ aliases: ["FlowType", "FlowBaseAnnotation"]
+ });
+ defineType("BooleanLiteralTypeAnnotation", {
+ builder: ["value"],
+ aliases: ["FlowType"],
+ fields: {
+ value: (0, _utils.validate)((0, _utils.assertValueType)("boolean"))
+ }
+ });
+ defineType("NullLiteralTypeAnnotation", {
+ aliases: ["FlowType", "FlowBaseAnnotation"]
+ });
+ defineType("ClassImplements", {
+ visitor: ["id", "typeParameters"],
+ fields: {
+ id: (0, _utils.validateType)("Identifier"),
+ typeParameters: (0, _utils.validateOptionalType)("TypeParameterInstantiation")
+ }
+ });
+ defineInterfaceishType("DeclareClass");
+ defineType("DeclareFunction", {
+ visitor: ["id"],
+ aliases: ["FlowDeclaration", "Statement", "Declaration"],
+ fields: {
+ id: (0, _utils.validateType)("Identifier"),
+ predicate: (0, _utils.validateOptionalType)("DeclaredPredicate")
+ }
+ });
+ defineInterfaceishType("DeclareInterface");
+ defineType("DeclareModule", {
+ builder: ["id", "body", "kind"],
+ visitor: ["id", "body"],
+ aliases: ["FlowDeclaration", "Statement", "Declaration"],
+ fields: {
+ id: (0, _utils.validateType)(["Identifier", "StringLiteral"]),
+ body: (0, _utils.validateType)("BlockStatement"),
+ kind: (0, _utils.validateOptional)((0, _utils.assertOneOf)("CommonJS", "ES"))
+ }
+ });
+ defineType("DeclareModuleExports", {
+ visitor: ["typeAnnotation"],
+ aliases: ["FlowDeclaration", "Statement", "Declaration"],
+ fields: {
+ typeAnnotation: (0, _utils.validateType)("TypeAnnotation")
+ }
+ });
+ defineType("DeclareTypeAlias", {
+ visitor: ["id", "typeParameters", "right"],
+ aliases: ["FlowDeclaration", "Statement", "Declaration"],
+ fields: {
+ id: (0, _utils.validateType)("Identifier"),
+ typeParameters: (0, _utils.validateOptionalType)("TypeParameterDeclaration"),
+ right: (0, _utils.validateType)("FlowType")
+ }
+ });
+ defineType("DeclareOpaqueType", {
+ visitor: ["id", "typeParameters", "supertype"],
+ aliases: ["FlowDeclaration", "Statement", "Declaration"],
+ fields: {
+ id: (0, _utils.validateType)("Identifier"),
+ typeParameters: (0, _utils.validateOptionalType)("TypeParameterDeclaration"),
+ supertype: (0, _utils.validateOptionalType)("FlowType"),
+ impltype: (0, _utils.validateOptionalType)("FlowType")
+ }
+ });
+ defineType("DeclareVariable", {
+ visitor: ["id"],
+ aliases: ["FlowDeclaration", "Statement", "Declaration"],
+ fields: {
+ id: (0, _utils.validateType)("Identifier")
+ }
+ });
+ defineType("DeclareExportDeclaration", {
+ visitor: ["declaration", "specifiers", "source"],
+ aliases: ["FlowDeclaration", "Statement", "Declaration"],
+ fields: {
+ declaration: (0, _utils.validateOptionalType)("Flow"),
+ specifiers: (0, _utils.validateOptional)((0, _utils.arrayOfType)(["ExportSpecifier", "ExportNamespaceSpecifier"])),
+ source: (0, _utils.validateOptionalType)("StringLiteral"),
+ default: (0, _utils.validateOptional)((0, _utils.assertValueType)("boolean"))
+ }
+ });
+ defineType("DeclareExportAllDeclaration", {
+ visitor: ["source"],
+ aliases: ["FlowDeclaration", "Statement", "Declaration"],
+ fields: {
+ source: (0, _utils.validateType)("StringLiteral"),
+ exportKind: (0, _utils.validateOptional)((0, _utils.assertOneOf)("type", "value"))
+ }
+ });
+ defineType("DeclaredPredicate", {
+ visitor: ["value"],
+ aliases: ["FlowPredicate"],
+ fields: {
+ value: (0, _utils.validateType)("Flow")
+ }
+ });
+ defineType("ExistsTypeAnnotation", {
+ aliases: ["FlowType"]
+ });
+ defineType("FunctionTypeAnnotation", {
+ visitor: ["typeParameters", "params", "rest", "returnType"],
+ aliases: ["FlowType"],
+ fields: {
+ typeParameters: (0, _utils.validateOptionalType)("TypeParameterDeclaration"),
+ params: (0, _utils.validate)((0, _utils.arrayOfType)("FunctionTypeParam")),
+ rest: (0, _utils.validateOptionalType)("FunctionTypeParam"),
+ this: (0, _utils.validateOptionalType)("FunctionTypeParam"),
+ returnType: (0, _utils.validateType)("FlowType")
+ }
+ });
+ defineType("FunctionTypeParam", {
+ visitor: ["name", "typeAnnotation"],
+ fields: {
+ name: (0, _utils.validateOptionalType)("Identifier"),
+ typeAnnotation: (0, _utils.validateType)("FlowType"),
+ optional: (0, _utils.validateOptional)((0, _utils.assertValueType)("boolean"))
+ }
+ });
+ defineType("GenericTypeAnnotation", {
+ visitor: ["id", "typeParameters"],
+ aliases: ["FlowType"],
+ fields: {
+ id: (0, _utils.validateType)(["Identifier", "QualifiedTypeIdentifier"]),
+ typeParameters: (0, _utils.validateOptionalType)("TypeParameterInstantiation")
+ }
+ });
+ defineType("InferredPredicate", {
+ aliases: ["FlowPredicate"]
+ });
+ defineType("InterfaceExtends", {
+ visitor: ["id", "typeParameters"],
+ fields: {
+ id: (0, _utils.validateType)(["Identifier", "QualifiedTypeIdentifier"]),
+ typeParameters: (0, _utils.validateOptionalType)("TypeParameterInstantiation")
+ }
+ });
+ defineInterfaceishType("InterfaceDeclaration");
+ defineType("InterfaceTypeAnnotation", {
+ visitor: ["extends", "body"],
+ aliases: ["FlowType"],
+ fields: {
+ extends: (0, _utils.validateOptional)((0, _utils.arrayOfType)("InterfaceExtends")),
+ body: (0, _utils.validateType)("ObjectTypeAnnotation")
+ }
+ });
+ defineType("IntersectionTypeAnnotation", {
+ visitor: ["types"],
+ aliases: ["FlowType"],
+ fields: {
+ types: (0, _utils.validate)((0, _utils.arrayOfType)("FlowType"))
+ }
+ });
+ defineType("MixedTypeAnnotation", {
+ aliases: ["FlowType", "FlowBaseAnnotation"]
+ });
+ defineType("EmptyTypeAnnotation", {
+ aliases: ["FlowType", "FlowBaseAnnotation"]
+ });
+ defineType("NullableTypeAnnotation", {
+ visitor: ["typeAnnotation"],
+ aliases: ["FlowType"],
+ fields: {
+ typeAnnotation: (0, _utils.validateType)("FlowType")
+ }
+ });
+ defineType("NumberLiteralTypeAnnotation", {
+ builder: ["value"],
+ aliases: ["FlowType"],
+ fields: {
+ value: (0, _utils.validate)((0, _utils.assertValueType)("number"))
+ }
+ });
+ defineType("NumberTypeAnnotation", {
+ aliases: ["FlowType", "FlowBaseAnnotation"]
+ });
+ defineType("ObjectTypeAnnotation", {
+ visitor: ["properties", "indexers", "callProperties", "internalSlots"],
+ aliases: ["FlowType"],
+ builder: ["properties", "indexers", "callProperties", "internalSlots", "exact"],
+ fields: {
+ properties: (0, _utils.validate)((0, _utils.arrayOfType)(["ObjectTypeProperty", "ObjectTypeSpreadProperty"])),
+ indexers: {
+ validate: (0, _utils.arrayOfType)("ObjectTypeIndexer"),
+ optional: true,
+ default: []
+ },
+ callProperties: {
+ validate: (0, _utils.arrayOfType)("ObjectTypeCallProperty"),
+ optional: true,
+ default: []
+ },
+ internalSlots: {
+ validate: (0, _utils.arrayOfType)("ObjectTypeInternalSlot"),
+ optional: true,
+ default: []
+ },
+ exact: {
+ validate: (0, _utils.assertValueType)("boolean"),
+ default: false
+ },
+ inexact: (0, _utils.validateOptional)((0, _utils.assertValueType)("boolean"))
+ }
+ });
+ defineType("ObjectTypeInternalSlot", {
+ visitor: ["id", "value", "optional", "static", "method"],
+ aliases: ["UserWhitespacable"],
+ fields: {
+ id: (0, _utils.validateType)("Identifier"),
+ value: (0, _utils.validateType)("FlowType"),
+ optional: (0, _utils.validate)((0, _utils.assertValueType)("boolean")),
+ static: (0, _utils.validate)((0, _utils.assertValueType)("boolean")),
+ method: (0, _utils.validate)((0, _utils.assertValueType)("boolean"))
+ }
+ });
+ defineType("ObjectTypeCallProperty", {
+ visitor: ["value"],
+ aliases: ["UserWhitespacable"],
+ fields: {
+ value: (0, _utils.validateType)("FlowType"),
+ static: (0, _utils.validate)((0, _utils.assertValueType)("boolean"))
+ }
+ });
+ defineType("ObjectTypeIndexer", {
+ visitor: ["id", "key", "value", "variance"],
+ aliases: ["UserWhitespacable"],
+ fields: {
+ id: (0, _utils.validateOptionalType)("Identifier"),
+ key: (0, _utils.validateType)("FlowType"),
+ value: (0, _utils.validateType)("FlowType"),
+ static: (0, _utils.validate)((0, _utils.assertValueType)("boolean")),
+ variance: (0, _utils.validateOptionalType)("Variance")
+ }
+ });
+ defineType("ObjectTypeProperty", {
+ visitor: ["key", "value", "variance"],
+ aliases: ["UserWhitespacable"],
+ fields: {
+ key: (0, _utils.validateType)(["Identifier", "StringLiteral"]),
+ value: (0, _utils.validateType)("FlowType"),
+ kind: (0, _utils.validate)((0, _utils.assertOneOf)("init", "get", "set")),
+ static: (0, _utils.validate)((0, _utils.assertValueType)("boolean")),
+ proto: (0, _utils.validate)((0, _utils.assertValueType)("boolean")),
+ optional: (0, _utils.validate)((0, _utils.assertValueType)("boolean")),
+ variance: (0, _utils.validateOptionalType)("Variance"),
+ method: (0, _utils.validate)((0, _utils.assertValueType)("boolean"))
+ }
+ });
+ defineType("ObjectTypeSpreadProperty", {
+ visitor: ["argument"],
+ aliases: ["UserWhitespacable"],
+ fields: {
+ argument: (0, _utils.validateType)("FlowType")
+ }
+ });
+ defineType("OpaqueType", {
+ visitor: ["id", "typeParameters", "supertype", "impltype"],
+ aliases: ["FlowDeclaration", "Statement", "Declaration"],
+ fields: {
+ id: (0, _utils.validateType)("Identifier"),
+ typeParameters: (0, _utils.validateOptionalType)("TypeParameterDeclaration"),
+ supertype: (0, _utils.validateOptionalType)("FlowType"),
+ impltype: (0, _utils.validateType)("FlowType")
+ }
+ });
+ defineType("QualifiedTypeIdentifier", {
+ visitor: ["id", "qualification"],
+ fields: {
+ id: (0, _utils.validateType)("Identifier"),
+ qualification: (0, _utils.validateType)(["Identifier", "QualifiedTypeIdentifier"])
+ }
+ });
+ defineType("StringLiteralTypeAnnotation", {
+ builder: ["value"],
+ aliases: ["FlowType"],
+ fields: {
+ value: (0, _utils.validate)((0, _utils.assertValueType)("string"))
+ }
+ });
+ defineType("StringTypeAnnotation", {
+ aliases: ["FlowType", "FlowBaseAnnotation"]
+ });
+ defineType("SymbolTypeAnnotation", {
+ aliases: ["FlowType", "FlowBaseAnnotation"]
+ });
+ defineType("ThisTypeAnnotation", {
+ aliases: ["FlowType", "FlowBaseAnnotation"]
+ });
+ defineType("TupleTypeAnnotation", {
+ visitor: ["types"],
+ aliases: ["FlowType"],
+ fields: {
+ types: (0, _utils.validate)((0, _utils.arrayOfType)("FlowType"))
+ }
+ });
+ defineType("TypeofTypeAnnotation", {
+ visitor: ["argument"],
+ aliases: ["FlowType"],
+ fields: {
+ argument: (0, _utils.validateType)("FlowType")
+ }
+ });
+ defineType("TypeAlias", {
+ visitor: ["id", "typeParameters", "right"],
+ aliases: ["FlowDeclaration", "Statement", "Declaration"],
+ fields: {
+ id: (0, _utils.validateType)("Identifier"),
+ typeParameters: (0, _utils.validateOptionalType)("TypeParameterDeclaration"),
+ right: (0, _utils.validateType)("FlowType")
+ }
+ });
+ defineType("TypeAnnotation", {
+ visitor: ["typeAnnotation"],
+ fields: {
+ typeAnnotation: (0, _utils.validateType)("FlowType")
+ }
+ });
+ defineType("TypeCastExpression", {
+ visitor: ["expression", "typeAnnotation"],
+ aliases: ["ExpressionWrapper", "Expression"],
+ fields: {
+ expression: (0, _utils.validateType)("Expression"),
+ typeAnnotation: (0, _utils.validateType)("TypeAnnotation")
+ }
+ });
+ defineType("TypeParameter", {
+ visitor: ["bound", "default", "variance"],
+ fields: {
+ name: (0, _utils.validate)((0, _utils.assertValueType)("string")),
+ bound: (0, _utils.validateOptionalType)("TypeAnnotation"),
+ default: (0, _utils.validateOptionalType)("FlowType"),
+ variance: (0, _utils.validateOptionalType)("Variance")
+ }
+ });
+ defineType("TypeParameterDeclaration", {
+ visitor: ["params"],
+ fields: {
+ params: (0, _utils.validate)((0, _utils.arrayOfType)("TypeParameter"))
+ }
+ });
+ defineType("TypeParameterInstantiation", {
+ visitor: ["params"],
+ fields: {
+ params: (0, _utils.validate)((0, _utils.arrayOfType)("FlowType"))
+ }
+ });
+ defineType("UnionTypeAnnotation", {
+ visitor: ["types"],
+ aliases: ["FlowType"],
+ fields: {
+ types: (0, _utils.validate)((0, _utils.arrayOfType)("FlowType"))
+ }
+ });
+ defineType("Variance", {
+ builder: ["kind"],
+ fields: {
+ kind: (0, _utils.validate)((0, _utils.assertOneOf)("minus", "plus"))
+ }
+ });
+ defineType("VoidTypeAnnotation", {
+ aliases: ["FlowType", "FlowBaseAnnotation"]
+ });
+ defineType("EnumDeclaration", {
+ aliases: ["Statement", "Declaration"],
+ visitor: ["id", "body"],
+ fields: {
+ id: (0, _utils.validateType)("Identifier"),
+ body: (0, _utils.validateType)(["EnumBooleanBody", "EnumNumberBody", "EnumStringBody", "EnumSymbolBody"])
+ }
+ });
+ defineType("EnumBooleanBody", {
+ aliases: ["EnumBody"],
+ visitor: ["members"],
+ fields: {
+ explicitType: (0, _utils.validate)((0, _utils.assertValueType)("boolean")),
+ members: (0, _utils.validateArrayOfType)("EnumBooleanMember"),
+ hasUnknownMembers: (0, _utils.validate)((0, _utils.assertValueType)("boolean"))
+ }
+ });
+ defineType("EnumNumberBody", {
+ aliases: ["EnumBody"],
+ visitor: ["members"],
+ fields: {
+ explicitType: (0, _utils.validate)((0, _utils.assertValueType)("boolean")),
+ members: (0, _utils.validateArrayOfType)("EnumNumberMember"),
+ hasUnknownMembers: (0, _utils.validate)((0, _utils.assertValueType)("boolean"))
+ }
+ });
+ defineType("EnumStringBody", {
+ aliases: ["EnumBody"],
+ visitor: ["members"],
+ fields: {
+ explicitType: (0, _utils.validate)((0, _utils.assertValueType)("boolean")),
+ members: (0, _utils.validateArrayOfType)(["EnumStringMember", "EnumDefaultedMember"]),
+ hasUnknownMembers: (0, _utils.validate)((0, _utils.assertValueType)("boolean"))
+ }
+ });
+ defineType("EnumSymbolBody", {
+ aliases: ["EnumBody"],
+ visitor: ["members"],
+ fields: {
+ members: (0, _utils.validateArrayOfType)("EnumDefaultedMember"),
+ hasUnknownMembers: (0, _utils.validate)((0, _utils.assertValueType)("boolean"))
+ }
+ });
+ defineType("EnumBooleanMember", {
+ aliases: ["EnumMember"],
+ visitor: ["id"],
+ fields: {
+ id: (0, _utils.validateType)("Identifier"),
+ init: (0, _utils.validateType)("BooleanLiteral")
+ }
+ });
+ defineType("EnumNumberMember", {
+ aliases: ["EnumMember"],
+ visitor: ["id", "init"],
+ fields: {
+ id: (0, _utils.validateType)("Identifier"),
+ init: (0, _utils.validateType)("NumericLiteral")
+ }
+ });
+ defineType("EnumStringMember", {
+ aliases: ["EnumMember"],
+ visitor: ["id", "init"],
+ fields: {
+ id: (0, _utils.validateType)("Identifier"),
+ init: (0, _utils.validateType)("StringLiteral")
+ }
+ });
+ defineType("EnumDefaultedMember", {
+ aliases: ["EnumMember"],
+ visitor: ["id"],
+ fields: {
+ id: (0, _utils.validateType)("Identifier")
+ }
+ });
+ defineType("IndexedAccessType", {
+ visitor: ["objectType", "indexType"],
+ aliases: ["FlowType"],
+ fields: {
+ objectType: (0, _utils.validateType)("FlowType"),
+ indexType: (0, _utils.validateType)("FlowType")
+ }
+ });
+ defineType("OptionalIndexedAccessType", {
+ visitor: ["objectType", "indexType"],
+ aliases: ["FlowType"],
+ fields: {
+ objectType: (0, _utils.validateType)("FlowType"),
+ indexType: (0, _utils.validateType)("FlowType"),
+ optional: (0, _utils.validate)((0, _utils.assertValueType)("boolean"))
+ }
+ });
+
+
+ return flow$1;
+ }
+
+ var jsx$1 = {};
+
+ var hasRequiredJsx$1;
+
+ function requireJsx$1 () {
+ if (hasRequiredJsx$1) return jsx$1;
+ hasRequiredJsx$1 = 1;
+
+ var _utils = requireUtils();
+ const defineType = (0, _utils.defineAliasedType)("JSX");
+ defineType("JSXAttribute", {
+ visitor: ["name", "value"],
+ aliases: ["Immutable"],
+ fields: {
+ name: {
+ validate: (0, _utils.assertNodeType)("JSXIdentifier", "JSXNamespacedName")
+ },
+ value: {
+ optional: true,
+ validate: (0, _utils.assertNodeType)("JSXElement", "JSXFragment", "StringLiteral", "JSXExpressionContainer")
+ }
+ }
+ });
+ defineType("JSXClosingElement", {
+ visitor: ["name"],
+ aliases: ["Immutable"],
+ fields: {
+ name: {
+ validate: (0, _utils.assertNodeType)("JSXIdentifier", "JSXMemberExpression", "JSXNamespacedName")
+ }
+ }
+ });
+ defineType("JSXElement", {
+ builder: ["openingElement", "closingElement", "children", "selfClosing"],
+ visitor: ["openingElement", "children", "closingElement"],
+ aliases: ["Immutable", "Expression"],
+ fields: Object.assign({
+ openingElement: {
+ validate: (0, _utils.assertNodeType)("JSXOpeningElement")
+ },
+ closingElement: {
+ optional: true,
+ validate: (0, _utils.assertNodeType)("JSXClosingElement")
+ },
+ children: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("JSXText", "JSXExpressionContainer", "JSXSpreadChild", "JSXElement", "JSXFragment")))
+ }
+ }, {
+ selfClosing: {
+ validate: (0, _utils.assertValueType)("boolean"),
+ optional: true
+ }
+ })
+ });
+ defineType("JSXEmptyExpression", {});
+ defineType("JSXExpressionContainer", {
+ visitor: ["expression"],
+ aliases: ["Immutable"],
+ fields: {
+ expression: {
+ validate: (0, _utils.assertNodeType)("Expression", "JSXEmptyExpression")
+ }
+ }
+ });
+ defineType("JSXSpreadChild", {
+ visitor: ["expression"],
+ aliases: ["Immutable"],
+ fields: {
+ expression: {
+ validate: (0, _utils.assertNodeType)("Expression")
+ }
+ }
+ });
+ defineType("JSXIdentifier", {
+ builder: ["name"],
+ fields: {
+ name: {
+ validate: (0, _utils.assertValueType)("string")
+ }
+ }
+ });
+ defineType("JSXMemberExpression", {
+ visitor: ["object", "property"],
+ fields: {
+ object: {
+ validate: (0, _utils.assertNodeType)("JSXMemberExpression", "JSXIdentifier")
+ },
+ property: {
+ validate: (0, _utils.assertNodeType)("JSXIdentifier")
+ }
+ }
+ });
+ defineType("JSXNamespacedName", {
+ visitor: ["namespace", "name"],
+ fields: {
+ namespace: {
+ validate: (0, _utils.assertNodeType)("JSXIdentifier")
+ },
+ name: {
+ validate: (0, _utils.assertNodeType)("JSXIdentifier")
+ }
+ }
+ });
+ defineType("JSXOpeningElement", {
+ builder: ["name", "attributes", "selfClosing"],
+ visitor: ["name", "attributes"],
+ aliases: ["Immutable"],
+ fields: {
+ name: {
+ validate: (0, _utils.assertNodeType)("JSXIdentifier", "JSXMemberExpression", "JSXNamespacedName")
+ },
+ selfClosing: {
+ default: false
+ },
+ attributes: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("JSXAttribute", "JSXSpreadAttribute")))
+ },
+ typeParameters: {
+ validate: (0, _utils.assertNodeType)("TypeParameterInstantiation", "TSTypeParameterInstantiation"),
+ optional: true
+ }
+ }
+ });
+ defineType("JSXSpreadAttribute", {
+ visitor: ["argument"],
+ fields: {
+ argument: {
+ validate: (0, _utils.assertNodeType)("Expression")
+ }
+ }
+ });
+ defineType("JSXText", {
+ aliases: ["Immutable"],
+ builder: ["value"],
+ fields: {
+ value: {
+ validate: (0, _utils.assertValueType)("string")
+ }
+ }
+ });
+ defineType("JSXFragment", {
+ builder: ["openingFragment", "closingFragment", "children"],
+ visitor: ["openingFragment", "children", "closingFragment"],
+ aliases: ["Immutable", "Expression"],
+ fields: {
+ openingFragment: {
+ validate: (0, _utils.assertNodeType)("JSXOpeningFragment")
+ },
+ closingFragment: {
+ validate: (0, _utils.assertNodeType)("JSXClosingFragment")
+ },
+ children: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("JSXText", "JSXExpressionContainer", "JSXSpreadChild", "JSXElement", "JSXFragment")))
+ }
+ }
+ });
+ defineType("JSXOpeningFragment", {
+ aliases: ["Immutable"]
+ });
+ defineType("JSXClosingFragment", {
+ aliases: ["Immutable"]
+ });
+
+
+ return jsx$1;
+ }
+
+ var misc = {};
+
+ var placeholders = {};
+
+ var hasRequiredPlaceholders;
+
+ function requirePlaceholders () {
+ if (hasRequiredPlaceholders) return placeholders;
+ hasRequiredPlaceholders = 1;
+
+ Object.defineProperty(placeholders, "__esModule", {
+ value: true
+ });
+ placeholders.PLACEHOLDERS_FLIPPED_ALIAS = placeholders.PLACEHOLDERS_ALIAS = placeholders.PLACEHOLDERS = void 0;
+ var _utils = requireUtils();
+ const PLACEHOLDERS = ["Identifier", "StringLiteral", "Expression", "Statement", "Declaration", "BlockStatement", "ClassBody", "Pattern"];
+ placeholders.PLACEHOLDERS = PLACEHOLDERS;
+ const PLACEHOLDERS_ALIAS = {
+ Declaration: ["Statement"],
+ Pattern: ["PatternLike", "LVal"]
+ };
+ placeholders.PLACEHOLDERS_ALIAS = PLACEHOLDERS_ALIAS;
+ for (const type of PLACEHOLDERS) {
+ const alias = _utils.ALIAS_KEYS[type];
+ if (alias != null && alias.length) PLACEHOLDERS_ALIAS[type] = alias;
+ }
+ const PLACEHOLDERS_FLIPPED_ALIAS = {};
+ placeholders.PLACEHOLDERS_FLIPPED_ALIAS = PLACEHOLDERS_FLIPPED_ALIAS;
+ Object.keys(PLACEHOLDERS_ALIAS).forEach(type => {
+ PLACEHOLDERS_ALIAS[type].forEach(alias => {
+ if (!Object.hasOwnProperty.call(PLACEHOLDERS_FLIPPED_ALIAS, alias)) {
+ PLACEHOLDERS_FLIPPED_ALIAS[alias] = [];
+ }
+ PLACEHOLDERS_FLIPPED_ALIAS[alias].push(type);
+ });
+ });
+
+
+ return placeholders;
+ }
+
+ var hasRequiredMisc;
+
+ function requireMisc () {
+ if (hasRequiredMisc) return misc;
+ hasRequiredMisc = 1;
+
+ var _utils = requireUtils();
+ var _placeholders = requirePlaceholders();
+ const defineType = (0, _utils.defineAliasedType)("Miscellaneous");
+ {
+ defineType("Noop", {
+ visitor: []
+ });
+ }
+ defineType("Placeholder", {
+ visitor: [],
+ builder: ["expectedNode", "name"],
+ fields: {
+ name: {
+ validate: (0, _utils.assertNodeType)("Identifier")
+ },
+ expectedNode: {
+ validate: (0, _utils.assertOneOf)(..._placeholders.PLACEHOLDERS)
+ }
+ }
+ });
+ defineType("V8IntrinsicIdentifier", {
+ builder: ["name"],
+ fields: {
+ name: {
+ validate: (0, _utils.assertValueType)("string")
+ }
+ }
+ });
+
+
+ return misc;
+ }
+
+ var experimental = {};
+
+ var hasRequiredExperimental;
+
+ function requireExperimental () {
+ if (hasRequiredExperimental) return experimental;
+ hasRequiredExperimental = 1;
+
+ var _utils = requireUtils();
+ (0, _utils.default)("ArgumentPlaceholder", {});
+ (0, _utils.default)("BindExpression", {
+ visitor: ["object", "callee"],
+ aliases: ["Expression"],
+ fields: !process$1.env.BABEL_TYPES_8_BREAKING ? {
+ object: {
+ validate: Object.assign(() => {}, {
+ oneOfNodeTypes: ["Expression"]
+ })
+ },
+ callee: {
+ validate: Object.assign(() => {}, {
+ oneOfNodeTypes: ["Expression"]
+ })
+ }
+ } : {
+ object: {
+ validate: (0, _utils.assertNodeType)("Expression")
+ },
+ callee: {
+ validate: (0, _utils.assertNodeType)("Expression")
+ }
+ }
+ });
+ (0, _utils.default)("ImportAttribute", {
+ visitor: ["key", "value"],
+ fields: {
+ key: {
+ validate: (0, _utils.assertNodeType)("Identifier", "StringLiteral")
+ },
+ value: {
+ validate: (0, _utils.assertNodeType)("StringLiteral")
+ }
+ }
+ });
+ (0, _utils.default)("Decorator", {
+ visitor: ["expression"],
+ fields: {
+ expression: {
+ validate: (0, _utils.assertNodeType)("Expression")
+ }
+ }
+ });
+ (0, _utils.default)("DoExpression", {
+ visitor: ["body"],
+ builder: ["body", "async"],
+ aliases: ["Expression"],
+ fields: {
+ body: {
+ validate: (0, _utils.assertNodeType)("BlockStatement")
+ },
+ async: {
+ validate: (0, _utils.assertValueType)("boolean"),
+ default: false
+ }
+ }
+ });
+ (0, _utils.default)("ExportDefaultSpecifier", {
+ visitor: ["exported"],
+ aliases: ["ModuleSpecifier"],
+ fields: {
+ exported: {
+ validate: (0, _utils.assertNodeType)("Identifier")
+ }
+ }
+ });
+ (0, _utils.default)("RecordExpression", {
+ visitor: ["properties"],
+ aliases: ["Expression"],
+ fields: {
+ properties: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("ObjectProperty", "SpreadElement")))
+ }
+ }
+ });
+ (0, _utils.default)("TupleExpression", {
+ fields: {
+ elements: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("Expression", "SpreadElement"))),
+ default: []
+ }
+ },
+ visitor: ["elements"],
+ aliases: ["Expression"]
+ });
+ (0, _utils.default)("DecimalLiteral", {
+ builder: ["value"],
+ fields: {
+ value: {
+ validate: (0, _utils.assertValueType)("string")
+ }
+ },
+ aliases: ["Expression", "Pureish", "Literal", "Immutable"]
+ });
+ (0, _utils.default)("ModuleExpression", {
+ visitor: ["body"],
+ fields: {
+ body: {
+ validate: (0, _utils.assertNodeType)("Program")
+ }
+ },
+ aliases: ["Expression"]
+ });
+ (0, _utils.default)("TopicReference", {
+ aliases: ["Expression"]
+ });
+ (0, _utils.default)("PipelineTopicExpression", {
+ builder: ["expression"],
+ visitor: ["expression"],
+ fields: {
+ expression: {
+ validate: (0, _utils.assertNodeType)("Expression")
+ }
+ },
+ aliases: ["Expression"]
+ });
+ (0, _utils.default)("PipelineBareFunction", {
+ builder: ["callee"],
+ visitor: ["callee"],
+ fields: {
+ callee: {
+ validate: (0, _utils.assertNodeType)("Expression")
+ }
+ },
+ aliases: ["Expression"]
+ });
+ (0, _utils.default)("PipelinePrimaryTopicReference", {
+ aliases: ["Expression"]
+ });
+
+
+ return experimental;
+ }
+
+ var typescript$1 = {};
+
+ var hasRequiredTypescript$1;
+
+ function requireTypescript$1 () {
+ if (hasRequiredTypescript$1) return typescript$1;
+ hasRequiredTypescript$1 = 1;
+
+ var _utils = requireUtils();
+ var _core = requireCore();
+ var _is = requireIs();
+ const defineType = (0, _utils.defineAliasedType)("TypeScript");
+ const bool = (0, _utils.assertValueType)("boolean");
+ const tSFunctionTypeAnnotationCommon = () => ({
+ returnType: {
+ validate: (0, _utils.assertNodeType)("TSTypeAnnotation", "Noop"),
+ optional: true
+ },
+ typeParameters: {
+ validate: (0, _utils.assertNodeType)("TSTypeParameterDeclaration", "Noop"),
+ optional: true
+ }
+ });
+ defineType("TSParameterProperty", {
+ aliases: ["LVal"],
+ visitor: ["parameter"],
+ fields: {
+ accessibility: {
+ validate: (0, _utils.assertOneOf)("public", "private", "protected"),
+ optional: true
+ },
+ readonly: {
+ validate: (0, _utils.assertValueType)("boolean"),
+ optional: true
+ },
+ parameter: {
+ validate: (0, _utils.assertNodeType)("Identifier", "AssignmentPattern")
+ },
+ override: {
+ validate: (0, _utils.assertValueType)("boolean"),
+ optional: true
+ },
+ decorators: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("Decorator"))),
+ optional: true
+ }
+ }
+ });
+ defineType("TSDeclareFunction", {
+ aliases: ["Statement", "Declaration"],
+ visitor: ["id", "typeParameters", "params", "returnType"],
+ fields: Object.assign({}, (0, _core.functionDeclarationCommon)(), tSFunctionTypeAnnotationCommon())
+ });
+ defineType("TSDeclareMethod", {
+ visitor: ["decorators", "key", "typeParameters", "params", "returnType"],
+ fields: Object.assign({}, (0, _core.classMethodOrDeclareMethodCommon)(), tSFunctionTypeAnnotationCommon())
+ });
+ defineType("TSQualifiedName", {
+ aliases: ["TSEntityName"],
+ visitor: ["left", "right"],
+ fields: {
+ left: (0, _utils.validateType)("TSEntityName"),
+ right: (0, _utils.validateType)("Identifier")
+ }
+ });
+ const signatureDeclarationCommon = () => ({
+ typeParameters: (0, _utils.validateOptionalType)("TSTypeParameterDeclaration"),
+ ["parameters"]: (0, _utils.validateArrayOfType)(["ArrayPattern", "Identifier", "ObjectPattern", "RestElement"]),
+ ["typeAnnotation"]: (0, _utils.validateOptionalType)("TSTypeAnnotation")
+ });
+ const callConstructSignatureDeclaration = {
+ aliases: ["TSTypeElement"],
+ visitor: ["typeParameters", "parameters", "typeAnnotation"],
+ fields: signatureDeclarationCommon()
+ };
+ defineType("TSCallSignatureDeclaration", callConstructSignatureDeclaration);
+ defineType("TSConstructSignatureDeclaration", callConstructSignatureDeclaration);
+ const namedTypeElementCommon = () => ({
+ key: (0, _utils.validateType)("Expression"),
+ computed: {
+ default: false
+ },
+ optional: (0, _utils.validateOptional)(bool)
+ });
+ defineType("TSPropertySignature", {
+ aliases: ["TSTypeElement"],
+ visitor: ["key", "typeAnnotation", "initializer"],
+ fields: Object.assign({}, namedTypeElementCommon(), {
+ readonly: (0, _utils.validateOptional)(bool),
+ typeAnnotation: (0, _utils.validateOptionalType)("TSTypeAnnotation"),
+ initializer: (0, _utils.validateOptionalType)("Expression"),
+ kind: {
+ validate: (0, _utils.assertOneOf)("get", "set")
+ }
+ })
+ });
+ defineType("TSMethodSignature", {
+ aliases: ["TSTypeElement"],
+ visitor: ["key", "typeParameters", "parameters", "typeAnnotation"],
+ fields: Object.assign({}, signatureDeclarationCommon(), namedTypeElementCommon(), {
+ kind: {
+ validate: (0, _utils.assertOneOf)("method", "get", "set")
+ }
+ })
+ });
+ defineType("TSIndexSignature", {
+ aliases: ["TSTypeElement"],
+ visitor: ["parameters", "typeAnnotation"],
+ fields: {
+ readonly: (0, _utils.validateOptional)(bool),
+ static: (0, _utils.validateOptional)(bool),
+ parameters: (0, _utils.validateArrayOfType)("Identifier"),
+ typeAnnotation: (0, _utils.validateOptionalType)("TSTypeAnnotation")
+ }
+ });
+ const tsKeywordTypes = ["TSAnyKeyword", "TSBooleanKeyword", "TSBigIntKeyword", "TSIntrinsicKeyword", "TSNeverKeyword", "TSNullKeyword", "TSNumberKeyword", "TSObjectKeyword", "TSStringKeyword", "TSSymbolKeyword", "TSUndefinedKeyword", "TSUnknownKeyword", "TSVoidKeyword"];
+ for (const type of tsKeywordTypes) {
+ defineType(type, {
+ aliases: ["TSType", "TSBaseType"],
+ visitor: [],
+ fields: {}
+ });
+ }
+ defineType("TSThisType", {
+ aliases: ["TSType", "TSBaseType"],
+ visitor: [],
+ fields: {}
+ });
+ const fnOrCtrBase = {
+ aliases: ["TSType"],
+ visitor: ["typeParameters", "parameters", "typeAnnotation"]
+ };
+ defineType("TSFunctionType", Object.assign({}, fnOrCtrBase, {
+ fields: signatureDeclarationCommon()
+ }));
+ defineType("TSConstructorType", Object.assign({}, fnOrCtrBase, {
+ fields: Object.assign({}, signatureDeclarationCommon(), {
+ abstract: (0, _utils.validateOptional)(bool)
+ })
+ }));
+ defineType("TSTypeReference", {
+ aliases: ["TSType"],
+ visitor: ["typeName", "typeParameters"],
+ fields: {
+ typeName: (0, _utils.validateType)("TSEntityName"),
+ typeParameters: (0, _utils.validateOptionalType)("TSTypeParameterInstantiation")
+ }
+ });
+ defineType("TSTypePredicate", {
+ aliases: ["TSType"],
+ visitor: ["parameterName", "typeAnnotation"],
+ builder: ["parameterName", "typeAnnotation", "asserts"],
+ fields: {
+ parameterName: (0, _utils.validateType)(["Identifier", "TSThisType"]),
+ typeAnnotation: (0, _utils.validateOptionalType)("TSTypeAnnotation"),
+ asserts: (0, _utils.validateOptional)(bool)
+ }
+ });
+ defineType("TSTypeQuery", {
+ aliases: ["TSType"],
+ visitor: ["exprName", "typeParameters"],
+ fields: {
+ exprName: (0, _utils.validateType)(["TSEntityName", "TSImportType"]),
+ typeParameters: (0, _utils.validateOptionalType)("TSTypeParameterInstantiation")
+ }
+ });
+ defineType("TSTypeLiteral", {
+ aliases: ["TSType"],
+ visitor: ["members"],
+ fields: {
+ members: (0, _utils.validateArrayOfType)("TSTypeElement")
+ }
+ });
+ defineType("TSArrayType", {
+ aliases: ["TSType"],
+ visitor: ["elementType"],
+ fields: {
+ elementType: (0, _utils.validateType)("TSType")
+ }
+ });
+ defineType("TSTupleType", {
+ aliases: ["TSType"],
+ visitor: ["elementTypes"],
+ fields: {
+ elementTypes: (0, _utils.validateArrayOfType)(["TSType", "TSNamedTupleMember"])
+ }
+ });
+ defineType("TSOptionalType", {
+ aliases: ["TSType"],
+ visitor: ["typeAnnotation"],
+ fields: {
+ typeAnnotation: (0, _utils.validateType)("TSType")
+ }
+ });
+ defineType("TSRestType", {
+ aliases: ["TSType"],
+ visitor: ["typeAnnotation"],
+ fields: {
+ typeAnnotation: (0, _utils.validateType)("TSType")
+ }
+ });
+ defineType("TSNamedTupleMember", {
+ visitor: ["label", "elementType"],
+ builder: ["label", "elementType", "optional"],
+ fields: {
+ label: (0, _utils.validateType)("Identifier"),
+ optional: {
+ validate: bool,
+ default: false
+ },
+ elementType: (0, _utils.validateType)("TSType")
+ }
+ });
+ const unionOrIntersection = {
+ aliases: ["TSType"],
+ visitor: ["types"],
+ fields: {
+ types: (0, _utils.validateArrayOfType)("TSType")
+ }
+ };
+ defineType("TSUnionType", unionOrIntersection);
+ defineType("TSIntersectionType", unionOrIntersection);
+ defineType("TSConditionalType", {
+ aliases: ["TSType"],
+ visitor: ["checkType", "extendsType", "trueType", "falseType"],
+ fields: {
+ checkType: (0, _utils.validateType)("TSType"),
+ extendsType: (0, _utils.validateType)("TSType"),
+ trueType: (0, _utils.validateType)("TSType"),
+ falseType: (0, _utils.validateType)("TSType")
+ }
+ });
+ defineType("TSInferType", {
+ aliases: ["TSType"],
+ visitor: ["typeParameter"],
+ fields: {
+ typeParameter: (0, _utils.validateType)("TSTypeParameter")
+ }
+ });
+ defineType("TSParenthesizedType", {
+ aliases: ["TSType"],
+ visitor: ["typeAnnotation"],
+ fields: {
+ typeAnnotation: (0, _utils.validateType)("TSType")
+ }
+ });
+ defineType("TSTypeOperator", {
+ aliases: ["TSType"],
+ visitor: ["typeAnnotation"],
+ fields: {
+ operator: (0, _utils.validate)((0, _utils.assertValueType)("string")),
+ typeAnnotation: (0, _utils.validateType)("TSType")
+ }
+ });
+ defineType("TSIndexedAccessType", {
+ aliases: ["TSType"],
+ visitor: ["objectType", "indexType"],
+ fields: {
+ objectType: (0, _utils.validateType)("TSType"),
+ indexType: (0, _utils.validateType)("TSType")
+ }
+ });
+ defineType("TSMappedType", {
+ aliases: ["TSType"],
+ visitor: ["typeParameter", "typeAnnotation", "nameType"],
+ fields: {
+ readonly: (0, _utils.validateOptional)((0, _utils.assertOneOf)(true, false, "+", "-")),
+ typeParameter: (0, _utils.validateType)("TSTypeParameter"),
+ optional: (0, _utils.validateOptional)((0, _utils.assertOneOf)(true, false, "+", "-")),
+ typeAnnotation: (0, _utils.validateOptionalType)("TSType"),
+ nameType: (0, _utils.validateOptionalType)("TSType")
+ }
+ });
+ defineType("TSLiteralType", {
+ aliases: ["TSType", "TSBaseType"],
+ visitor: ["literal"],
+ fields: {
+ literal: {
+ validate: function () {
+ const unaryExpression = (0, _utils.assertNodeType)("NumericLiteral", "BigIntLiteral");
+ const unaryOperator = (0, _utils.assertOneOf)("-");
+ const literal = (0, _utils.assertNodeType)("NumericLiteral", "StringLiteral", "BooleanLiteral", "BigIntLiteral", "TemplateLiteral");
+ function validator(parent, key, node) {
+ if ((0, _is.default)("UnaryExpression", node)) {
+ unaryOperator(node, "operator", node.operator);
+ unaryExpression(node, "argument", node.argument);
+ } else {
+ literal(parent, key, node);
+ }
+ }
+ validator.oneOfNodeTypes = ["NumericLiteral", "StringLiteral", "BooleanLiteral", "BigIntLiteral", "TemplateLiteral", "UnaryExpression"];
+ return validator;
+ }()
+ }
+ }
+ });
+ defineType("TSExpressionWithTypeArguments", {
+ aliases: ["TSType"],
+ visitor: ["expression", "typeParameters"],
+ fields: {
+ expression: (0, _utils.validateType)("TSEntityName"),
+ typeParameters: (0, _utils.validateOptionalType)("TSTypeParameterInstantiation")
+ }
+ });
+ defineType("TSInterfaceDeclaration", {
+ aliases: ["Statement", "Declaration"],
+ visitor: ["id", "typeParameters", "extends", "body"],
+ fields: {
+ declare: (0, _utils.validateOptional)(bool),
+ id: (0, _utils.validateType)("Identifier"),
+ typeParameters: (0, _utils.validateOptionalType)("TSTypeParameterDeclaration"),
+ extends: (0, _utils.validateOptional)((0, _utils.arrayOfType)("TSExpressionWithTypeArguments")),
+ body: (0, _utils.validateType)("TSInterfaceBody")
+ }
+ });
+ defineType("TSInterfaceBody", {
+ visitor: ["body"],
+ fields: {
+ body: (0, _utils.validateArrayOfType)("TSTypeElement")
+ }
+ });
+ defineType("TSTypeAliasDeclaration", {
+ aliases: ["Statement", "Declaration"],
+ visitor: ["id", "typeParameters", "typeAnnotation"],
+ fields: {
+ declare: (0, _utils.validateOptional)(bool),
+ id: (0, _utils.validateType)("Identifier"),
+ typeParameters: (0, _utils.validateOptionalType)("TSTypeParameterDeclaration"),
+ typeAnnotation: (0, _utils.validateType)("TSType")
+ }
+ });
+ defineType("TSInstantiationExpression", {
+ aliases: ["Expression"],
+ visitor: ["expression", "typeParameters"],
+ fields: {
+ expression: (0, _utils.validateType)("Expression"),
+ typeParameters: (0, _utils.validateOptionalType)("TSTypeParameterInstantiation")
+ }
+ });
+ const TSTypeExpression = {
+ aliases: ["Expression", "LVal", "PatternLike"],
+ visitor: ["expression", "typeAnnotation"],
+ fields: {
+ expression: (0, _utils.validateType)("Expression"),
+ typeAnnotation: (0, _utils.validateType)("TSType")
+ }
+ };
+ defineType("TSAsExpression", TSTypeExpression);
+ defineType("TSSatisfiesExpression", TSTypeExpression);
+ defineType("TSTypeAssertion", {
+ aliases: ["Expression", "LVal", "PatternLike"],
+ visitor: ["typeAnnotation", "expression"],
+ fields: {
+ typeAnnotation: (0, _utils.validateType)("TSType"),
+ expression: (0, _utils.validateType)("Expression")
+ }
+ });
+ defineType("TSEnumDeclaration", {
+ aliases: ["Statement", "Declaration"],
+ visitor: ["id", "members"],
+ fields: {
+ declare: (0, _utils.validateOptional)(bool),
+ const: (0, _utils.validateOptional)(bool),
+ id: (0, _utils.validateType)("Identifier"),
+ members: (0, _utils.validateArrayOfType)("TSEnumMember"),
+ initializer: (0, _utils.validateOptionalType)("Expression")
+ }
+ });
+ defineType("TSEnumMember", {
+ visitor: ["id", "initializer"],
+ fields: {
+ id: (0, _utils.validateType)(["Identifier", "StringLiteral"]),
+ initializer: (0, _utils.validateOptionalType)("Expression")
+ }
+ });
+ defineType("TSModuleDeclaration", {
+ aliases: ["Statement", "Declaration"],
+ visitor: ["id", "body"],
+ fields: {
+ declare: (0, _utils.validateOptional)(bool),
+ global: (0, _utils.validateOptional)(bool),
+ id: (0, _utils.validateType)(["Identifier", "StringLiteral"]),
+ body: (0, _utils.validateType)(["TSModuleBlock", "TSModuleDeclaration"])
+ }
+ });
+ defineType("TSModuleBlock", {
+ aliases: ["Scopable", "Block", "BlockParent", "FunctionParent"],
+ visitor: ["body"],
+ fields: {
+ body: (0, _utils.validateArrayOfType)("Statement")
+ }
+ });
+ defineType("TSImportType", {
+ aliases: ["TSType"],
+ visitor: ["argument", "qualifier", "typeParameters"],
+ fields: {
+ argument: (0, _utils.validateType)("StringLiteral"),
+ qualifier: (0, _utils.validateOptionalType)("TSEntityName"),
+ typeParameters: (0, _utils.validateOptionalType)("TSTypeParameterInstantiation")
+ }
+ });
+ defineType("TSImportEqualsDeclaration", {
+ aliases: ["Statement"],
+ visitor: ["id", "moduleReference"],
+ fields: {
+ isExport: (0, _utils.validate)(bool),
+ id: (0, _utils.validateType)("Identifier"),
+ moduleReference: (0, _utils.validateType)(["TSEntityName", "TSExternalModuleReference"]),
+ importKind: {
+ validate: (0, _utils.assertOneOf)("type", "value"),
+ optional: true
+ }
+ }
+ });
+ defineType("TSExternalModuleReference", {
+ visitor: ["expression"],
+ fields: {
+ expression: (0, _utils.validateType)("StringLiteral")
+ }
+ });
+ defineType("TSNonNullExpression", {
+ aliases: ["Expression", "LVal", "PatternLike"],
+ visitor: ["expression"],
+ fields: {
+ expression: (0, _utils.validateType)("Expression")
+ }
+ });
+ defineType("TSExportAssignment", {
+ aliases: ["Statement"],
+ visitor: ["expression"],
+ fields: {
+ expression: (0, _utils.validateType)("Expression")
+ }
+ });
+ defineType("TSNamespaceExportDeclaration", {
+ aliases: ["Statement"],
+ visitor: ["id"],
+ fields: {
+ id: (0, _utils.validateType)("Identifier")
+ }
+ });
+ defineType("TSTypeAnnotation", {
+ visitor: ["typeAnnotation"],
+ fields: {
+ typeAnnotation: {
+ validate: (0, _utils.assertNodeType)("TSType")
+ }
+ }
+ });
+ defineType("TSTypeParameterInstantiation", {
+ visitor: ["params"],
+ fields: {
+ params: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("TSType")))
+ }
+ }
+ });
+ defineType("TSTypeParameterDeclaration", {
+ visitor: ["params"],
+ fields: {
+ params: {
+ validate: (0, _utils.chain)((0, _utils.assertValueType)("array"), (0, _utils.assertEach)((0, _utils.assertNodeType)("TSTypeParameter")))
+ }
+ }
+ });
+ defineType("TSTypeParameter", {
+ builder: ["constraint", "default", "name"],
+ visitor: ["constraint", "default"],
+ fields: {
+ name: {
+ validate: (0, _utils.assertValueType)("string")
+ },
+ in: {
+ validate: (0, _utils.assertValueType)("boolean"),
+ optional: true
+ },
+ out: {
+ validate: (0, _utils.assertValueType)("boolean"),
+ optional: true
+ },
+ const: {
+ validate: (0, _utils.assertValueType)("boolean"),
+ optional: true
+ },
+ constraint: {
+ validate: (0, _utils.assertNodeType)("TSType"),
+ optional: true
+ },
+ default: {
+ validate: (0, _utils.assertNodeType)("TSType"),
+ optional: true
+ }
+ }
+ });
+
+
+ return typescript$1;
+ }
+
+ var deprecatedAliases = {};
+
+ var hasRequiredDeprecatedAliases;
+
+ function requireDeprecatedAliases () {
+ if (hasRequiredDeprecatedAliases) return deprecatedAliases;
+ hasRequiredDeprecatedAliases = 1;
+
+ Object.defineProperty(deprecatedAliases, "__esModule", {
+ value: true
+ });
+ deprecatedAliases.DEPRECATED_ALIASES = void 0;
+ const DEPRECATED_ALIASES = {
+ ModuleDeclaration: "ImportOrExportDeclaration"
+ };
+ deprecatedAliases.DEPRECATED_ALIASES = DEPRECATED_ALIASES;
+
+
+ return deprecatedAliases;
+ }
+
+ var hasRequiredDefinitions;
+
+ function requireDefinitions () {
+ if (hasRequiredDefinitions) return definitions;
+ hasRequiredDefinitions = 1;
+ (function (exports) {
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ Object.defineProperty(exports, "ALIAS_KEYS", {
+ enumerable: true,
+ get: function () {
+ return _utils.ALIAS_KEYS;
+ }
+ });
+ Object.defineProperty(exports, "BUILDER_KEYS", {
+ enumerable: true,
+ get: function () {
+ return _utils.BUILDER_KEYS;
+ }
+ });
+ Object.defineProperty(exports, "DEPRECATED_ALIASES", {
+ enumerable: true,
+ get: function () {
+ return _deprecatedAliases.DEPRECATED_ALIASES;
+ }
+ });
+ Object.defineProperty(exports, "DEPRECATED_KEYS", {
+ enumerable: true,
+ get: function () {
+ return _utils.DEPRECATED_KEYS;
+ }
+ });
+ Object.defineProperty(exports, "FLIPPED_ALIAS_KEYS", {
+ enumerable: true,
+ get: function () {
+ return _utils.FLIPPED_ALIAS_KEYS;
+ }
+ });
+ Object.defineProperty(exports, "NODE_FIELDS", {
+ enumerable: true,
+ get: function () {
+ return _utils.NODE_FIELDS;
+ }
+ });
+ Object.defineProperty(exports, "NODE_PARENT_VALIDATIONS", {
+ enumerable: true,
+ get: function () {
+ return _utils.NODE_PARENT_VALIDATIONS;
+ }
+ });
+ Object.defineProperty(exports, "PLACEHOLDERS", {
+ enumerable: true,
+ get: function () {
+ return _placeholders.PLACEHOLDERS;
+ }
+ });
+ Object.defineProperty(exports, "PLACEHOLDERS_ALIAS", {
+ enumerable: true,
+ get: function () {
+ return _placeholders.PLACEHOLDERS_ALIAS;
+ }
+ });
+ Object.defineProperty(exports, "PLACEHOLDERS_FLIPPED_ALIAS", {
+ enumerable: true,
+ get: function () {
+ return _placeholders.PLACEHOLDERS_FLIPPED_ALIAS;
+ }
+ });
+ exports.TYPES = void 0;
+ Object.defineProperty(exports, "VISITOR_KEYS", {
+ enumerable: true,
+ get: function () {
+ return _utils.VISITOR_KEYS;
+ }
+ });
+ var _toFastProperties = requireToFastProperties();
+ requireCore();
+ requireFlow$1();
+ requireJsx$1();
+ requireMisc();
+ requireExperimental();
+ requireTypescript$1();
+ var _utils = requireUtils();
+ var _placeholders = requirePlaceholders();
+ var _deprecatedAliases = requireDeprecatedAliases();
+ Object.keys(_deprecatedAliases.DEPRECATED_ALIASES).forEach(deprecatedAlias => {
+ _utils.FLIPPED_ALIAS_KEYS[deprecatedAlias] = _utils.FLIPPED_ALIAS_KEYS[_deprecatedAliases.DEPRECATED_ALIASES[deprecatedAlias]];
+ });
+ _toFastProperties(_utils.VISITOR_KEYS);
+ _toFastProperties(_utils.ALIAS_KEYS);
+ _toFastProperties(_utils.FLIPPED_ALIAS_KEYS);
+ _toFastProperties(_utils.NODE_FIELDS);
+ _toFastProperties(_utils.BUILDER_KEYS);
+ _toFastProperties(_utils.DEPRECATED_KEYS);
+ _toFastProperties(_placeholders.PLACEHOLDERS_ALIAS);
+ _toFastProperties(_placeholders.PLACEHOLDERS_FLIPPED_ALIAS);
+ const TYPES = [].concat(Object.keys(_utils.VISITOR_KEYS), Object.keys(_utils.FLIPPED_ALIAS_KEYS), Object.keys(_utils.DEPRECATED_KEYS));
+ exports.TYPES = TYPES;
+
+
+ } (definitions));
+ return definitions;
+ }
+
+ var hasRequiredValidate;
+
+ function requireValidate () {
+ if (hasRequiredValidate) return validate;
+ hasRequiredValidate = 1;
+
+ Object.defineProperty(validate, "__esModule", {
+ value: true
+ });
+ validate.default = validate$1;
+ validate.validateChild = validateChild;
+ validate.validateField = validateField;
+ var _index = requireDefinitions();
+ function validate$1(node, key, val) {
+ if (!node) return;
+ const fields = _index.NODE_FIELDS[node.type];
+ if (!fields) return;
+ const field = fields[key];
+ validateField(node, key, val, field);
+ validateChild(node, key, val);
+ }
+ function validateField(node, key, val, field) {
+ if (!(field != null && field.validate)) return;
+ if (field.optional && val == null) return;
+ field.validate(node, key, val);
+ }
+ function validateChild(node, key, val) {
+ if (val == null) return;
+ const validate = _index.NODE_PARENT_VALIDATIONS[val.type];
+ if (!validate) return;
+ validate(node, key, val);
+ }
+
+
+ return validate;
+ }
+
+ var hasRequiredValidateNode;
+
+ function requireValidateNode () {
+ if (hasRequiredValidateNode) return validateNode;
+ hasRequiredValidateNode = 1;
+
+ Object.defineProperty(validateNode, "__esModule", {
+ value: true
+ });
+ validateNode.default = validateNode$1;
+ var _validate = requireValidate();
+ var _index = requireLib$2();
+ function validateNode$1(node) {
+ const keys = _index.BUILDER_KEYS[node.type];
+ for (const key of keys) {
+ (0, _validate.default)(node, key, node[key]);
+ }
+ return node;
+ }
+
+
+ return validateNode;
+ }
+
+ var hasRequiredGenerated$2;
+
+ function requireGenerated$2 () {
+ if (hasRequiredGenerated$2) return generated$2;
+ hasRequiredGenerated$2 = 1;
+
+ Object.defineProperty(generated$2, "__esModule", {
+ value: true
+ });
+ generated$2.anyTypeAnnotation = anyTypeAnnotation;
+ generated$2.argumentPlaceholder = argumentPlaceholder;
+ generated$2.arrayExpression = arrayExpression;
+ generated$2.arrayPattern = arrayPattern;
+ generated$2.arrayTypeAnnotation = arrayTypeAnnotation;
+ generated$2.arrowFunctionExpression = arrowFunctionExpression;
+ generated$2.assignmentExpression = assignmentExpression;
+ generated$2.assignmentPattern = assignmentPattern;
+ generated$2.awaitExpression = awaitExpression;
+ generated$2.bigIntLiteral = bigIntLiteral;
+ generated$2.binaryExpression = binaryExpression;
+ generated$2.bindExpression = bindExpression;
+ generated$2.blockStatement = blockStatement;
+ generated$2.booleanLiteral = booleanLiteral;
+ generated$2.booleanLiteralTypeAnnotation = booleanLiteralTypeAnnotation;
+ generated$2.booleanTypeAnnotation = booleanTypeAnnotation;
+ generated$2.breakStatement = breakStatement;
+ generated$2.callExpression = callExpression;
+ generated$2.catchClause = catchClause;
+ generated$2.classAccessorProperty = classAccessorProperty;
+ generated$2.classBody = classBody;
+ generated$2.classDeclaration = classDeclaration;
+ generated$2.classExpression = classExpression;
+ generated$2.classImplements = classImplements;
+ generated$2.classMethod = classMethod;
+ generated$2.classPrivateMethod = classPrivateMethod;
+ generated$2.classPrivateProperty = classPrivateProperty;
+ generated$2.classProperty = classProperty;
+ generated$2.conditionalExpression = conditionalExpression;
+ generated$2.continueStatement = continueStatement;
+ generated$2.debuggerStatement = debuggerStatement;
+ generated$2.decimalLiteral = decimalLiteral;
+ generated$2.declareClass = declareClass;
+ generated$2.declareExportAllDeclaration = declareExportAllDeclaration;
+ generated$2.declareExportDeclaration = declareExportDeclaration;
+ generated$2.declareFunction = declareFunction;
+ generated$2.declareInterface = declareInterface;
+ generated$2.declareModule = declareModule;
+ generated$2.declareModuleExports = declareModuleExports;
+ generated$2.declareOpaqueType = declareOpaqueType;
+ generated$2.declareTypeAlias = declareTypeAlias;
+ generated$2.declareVariable = declareVariable;
+ generated$2.declaredPredicate = declaredPredicate;
+ generated$2.decorator = decorator;
+ generated$2.directive = directive;
+ generated$2.directiveLiteral = directiveLiteral;
+ generated$2.doExpression = doExpression;
+ generated$2.doWhileStatement = doWhileStatement;
+ generated$2.emptyStatement = emptyStatement;
+ generated$2.emptyTypeAnnotation = emptyTypeAnnotation;
+ generated$2.enumBooleanBody = enumBooleanBody;
+ generated$2.enumBooleanMember = enumBooleanMember;
+ generated$2.enumDeclaration = enumDeclaration;
+ generated$2.enumDefaultedMember = enumDefaultedMember;
+ generated$2.enumNumberBody = enumNumberBody;
+ generated$2.enumNumberMember = enumNumberMember;
+ generated$2.enumStringBody = enumStringBody;
+ generated$2.enumStringMember = enumStringMember;
+ generated$2.enumSymbolBody = enumSymbolBody;
+ generated$2.existsTypeAnnotation = existsTypeAnnotation;
+ generated$2.exportAllDeclaration = exportAllDeclaration;
+ generated$2.exportDefaultDeclaration = exportDefaultDeclaration;
+ generated$2.exportDefaultSpecifier = exportDefaultSpecifier;
+ generated$2.exportNamedDeclaration = exportNamedDeclaration;
+ generated$2.exportNamespaceSpecifier = exportNamespaceSpecifier;
+ generated$2.exportSpecifier = exportSpecifier;
+ generated$2.expressionStatement = expressionStatement;
+ generated$2.file = file;
+ generated$2.forInStatement = forInStatement;
+ generated$2.forOfStatement = forOfStatement;
+ generated$2.forStatement = forStatement;
+ generated$2.functionDeclaration = functionDeclaration;
+ generated$2.functionExpression = functionExpression;
+ generated$2.functionTypeAnnotation = functionTypeAnnotation;
+ generated$2.functionTypeParam = functionTypeParam;
+ generated$2.genericTypeAnnotation = genericTypeAnnotation;
+ generated$2.identifier = identifier;
+ generated$2.ifStatement = ifStatement;
+ generated$2.import = _import;
+ generated$2.importAttribute = importAttribute;
+ generated$2.importDeclaration = importDeclaration;
+ generated$2.importDefaultSpecifier = importDefaultSpecifier;
+ generated$2.importExpression = importExpression;
+ generated$2.importNamespaceSpecifier = importNamespaceSpecifier;
+ generated$2.importSpecifier = importSpecifier;
+ generated$2.indexedAccessType = indexedAccessType;
+ generated$2.inferredPredicate = inferredPredicate;
+ generated$2.interfaceDeclaration = interfaceDeclaration;
+ generated$2.interfaceExtends = interfaceExtends;
+ generated$2.interfaceTypeAnnotation = interfaceTypeAnnotation;
+ generated$2.interpreterDirective = interpreterDirective;
+ generated$2.intersectionTypeAnnotation = intersectionTypeAnnotation;
+ generated$2.jSXAttribute = generated$2.jsxAttribute = jsxAttribute;
+ generated$2.jSXClosingElement = generated$2.jsxClosingElement = jsxClosingElement;
+ generated$2.jSXClosingFragment = generated$2.jsxClosingFragment = jsxClosingFragment;
+ generated$2.jSXElement = generated$2.jsxElement = jsxElement;
+ generated$2.jSXEmptyExpression = generated$2.jsxEmptyExpression = jsxEmptyExpression;
+ generated$2.jSXExpressionContainer = generated$2.jsxExpressionContainer = jsxExpressionContainer;
+ generated$2.jSXFragment = generated$2.jsxFragment = jsxFragment;
+ generated$2.jSXIdentifier = generated$2.jsxIdentifier = jsxIdentifier;
+ generated$2.jSXMemberExpression = generated$2.jsxMemberExpression = jsxMemberExpression;
+ generated$2.jSXNamespacedName = generated$2.jsxNamespacedName = jsxNamespacedName;
+ generated$2.jSXOpeningElement = generated$2.jsxOpeningElement = jsxOpeningElement;
+ generated$2.jSXOpeningFragment = generated$2.jsxOpeningFragment = jsxOpeningFragment;
+ generated$2.jSXSpreadAttribute = generated$2.jsxSpreadAttribute = jsxSpreadAttribute;
+ generated$2.jSXSpreadChild = generated$2.jsxSpreadChild = jsxSpreadChild;
+ generated$2.jSXText = generated$2.jsxText = jsxText;
+ generated$2.labeledStatement = labeledStatement;
+ generated$2.logicalExpression = logicalExpression;
+ generated$2.memberExpression = memberExpression;
+ generated$2.metaProperty = metaProperty;
+ generated$2.mixedTypeAnnotation = mixedTypeAnnotation;
+ generated$2.moduleExpression = moduleExpression;
+ generated$2.newExpression = newExpression;
+ generated$2.noop = noop;
+ generated$2.nullLiteral = nullLiteral;
+ generated$2.nullLiteralTypeAnnotation = nullLiteralTypeAnnotation;
+ generated$2.nullableTypeAnnotation = nullableTypeAnnotation;
+ generated$2.numberLiteral = NumberLiteral;
+ generated$2.numberLiteralTypeAnnotation = numberLiteralTypeAnnotation;
+ generated$2.numberTypeAnnotation = numberTypeAnnotation;
+ generated$2.numericLiteral = numericLiteral;
+ generated$2.objectExpression = objectExpression;
+ generated$2.objectMethod = objectMethod;
+ generated$2.objectPattern = objectPattern;
+ generated$2.objectProperty = objectProperty;
+ generated$2.objectTypeAnnotation = objectTypeAnnotation;
+ generated$2.objectTypeCallProperty = objectTypeCallProperty;
+ generated$2.objectTypeIndexer = objectTypeIndexer;
+ generated$2.objectTypeInternalSlot = objectTypeInternalSlot;
+ generated$2.objectTypeProperty = objectTypeProperty;
+ generated$2.objectTypeSpreadProperty = objectTypeSpreadProperty;
+ generated$2.opaqueType = opaqueType;
+ generated$2.optionalCallExpression = optionalCallExpression;
+ generated$2.optionalIndexedAccessType = optionalIndexedAccessType;
+ generated$2.optionalMemberExpression = optionalMemberExpression;
+ generated$2.parenthesizedExpression = parenthesizedExpression;
+ generated$2.pipelineBareFunction = pipelineBareFunction;
+ generated$2.pipelinePrimaryTopicReference = pipelinePrimaryTopicReference;
+ generated$2.pipelineTopicExpression = pipelineTopicExpression;
+ generated$2.placeholder = placeholder;
+ generated$2.privateName = privateName;
+ generated$2.program = program;
+ generated$2.qualifiedTypeIdentifier = qualifiedTypeIdentifier;
+ generated$2.recordExpression = recordExpression;
+ generated$2.regExpLiteral = regExpLiteral;
+ generated$2.regexLiteral = RegexLiteral;
+ generated$2.restElement = restElement;
+ generated$2.restProperty = RestProperty;
+ generated$2.returnStatement = returnStatement;
+ generated$2.sequenceExpression = sequenceExpression;
+ generated$2.spreadElement = spreadElement;
+ generated$2.spreadProperty = SpreadProperty;
+ generated$2.staticBlock = staticBlock;
+ generated$2.stringLiteral = stringLiteral;
+ generated$2.stringLiteralTypeAnnotation = stringLiteralTypeAnnotation;
+ generated$2.stringTypeAnnotation = stringTypeAnnotation;
+ generated$2.super = _super;
+ generated$2.switchCase = switchCase;
+ generated$2.switchStatement = switchStatement;
+ generated$2.symbolTypeAnnotation = symbolTypeAnnotation;
+ generated$2.taggedTemplateExpression = taggedTemplateExpression;
+ generated$2.templateElement = templateElement;
+ generated$2.templateLiteral = templateLiteral;
+ generated$2.thisExpression = thisExpression;
+ generated$2.thisTypeAnnotation = thisTypeAnnotation;
+ generated$2.throwStatement = throwStatement;
+ generated$2.topicReference = topicReference;
+ generated$2.tryStatement = tryStatement;
+ generated$2.tSAnyKeyword = generated$2.tsAnyKeyword = tsAnyKeyword;
+ generated$2.tSArrayType = generated$2.tsArrayType = tsArrayType;
+ generated$2.tSAsExpression = generated$2.tsAsExpression = tsAsExpression;
+ generated$2.tSBigIntKeyword = generated$2.tsBigIntKeyword = tsBigIntKeyword;
+ generated$2.tSBooleanKeyword = generated$2.tsBooleanKeyword = tsBooleanKeyword;
+ generated$2.tSCallSignatureDeclaration = generated$2.tsCallSignatureDeclaration = tsCallSignatureDeclaration;
+ generated$2.tSConditionalType = generated$2.tsConditionalType = tsConditionalType;
+ generated$2.tSConstructSignatureDeclaration = generated$2.tsConstructSignatureDeclaration = tsConstructSignatureDeclaration;
+ generated$2.tSConstructorType = generated$2.tsConstructorType = tsConstructorType;
+ generated$2.tSDeclareFunction = generated$2.tsDeclareFunction = tsDeclareFunction;
+ generated$2.tSDeclareMethod = generated$2.tsDeclareMethod = tsDeclareMethod;
+ generated$2.tSEnumDeclaration = generated$2.tsEnumDeclaration = tsEnumDeclaration;
+ generated$2.tSEnumMember = generated$2.tsEnumMember = tsEnumMember;
+ generated$2.tSExportAssignment = generated$2.tsExportAssignment = tsExportAssignment;
+ generated$2.tSExpressionWithTypeArguments = generated$2.tsExpressionWithTypeArguments = tsExpressionWithTypeArguments;
+ generated$2.tSExternalModuleReference = generated$2.tsExternalModuleReference = tsExternalModuleReference;
+ generated$2.tSFunctionType = generated$2.tsFunctionType = tsFunctionType;
+ generated$2.tSImportEqualsDeclaration = generated$2.tsImportEqualsDeclaration = tsImportEqualsDeclaration;
+ generated$2.tSImportType = generated$2.tsImportType = tsImportType;
+ generated$2.tSIndexSignature = generated$2.tsIndexSignature = tsIndexSignature;
+ generated$2.tSIndexedAccessType = generated$2.tsIndexedAccessType = tsIndexedAccessType;
+ generated$2.tSInferType = generated$2.tsInferType = tsInferType;
+ generated$2.tSInstantiationExpression = generated$2.tsInstantiationExpression = tsInstantiationExpression;
+ generated$2.tSInterfaceBody = generated$2.tsInterfaceBody = tsInterfaceBody;
+ generated$2.tSInterfaceDeclaration = generated$2.tsInterfaceDeclaration = tsInterfaceDeclaration;
+ generated$2.tSIntersectionType = generated$2.tsIntersectionType = tsIntersectionType;
+ generated$2.tSIntrinsicKeyword = generated$2.tsIntrinsicKeyword = tsIntrinsicKeyword;
+ generated$2.tSLiteralType = generated$2.tsLiteralType = tsLiteralType;
+ generated$2.tSMappedType = generated$2.tsMappedType = tsMappedType;
+ generated$2.tSMethodSignature = generated$2.tsMethodSignature = tsMethodSignature;
+ generated$2.tSModuleBlock = generated$2.tsModuleBlock = tsModuleBlock;
+ generated$2.tSModuleDeclaration = generated$2.tsModuleDeclaration = tsModuleDeclaration;
+ generated$2.tSNamedTupleMember = generated$2.tsNamedTupleMember = tsNamedTupleMember;
+ generated$2.tSNamespaceExportDeclaration = generated$2.tsNamespaceExportDeclaration = tsNamespaceExportDeclaration;
+ generated$2.tSNeverKeyword = generated$2.tsNeverKeyword = tsNeverKeyword;
+ generated$2.tSNonNullExpression = generated$2.tsNonNullExpression = tsNonNullExpression;
+ generated$2.tSNullKeyword = generated$2.tsNullKeyword = tsNullKeyword;
+ generated$2.tSNumberKeyword = generated$2.tsNumberKeyword = tsNumberKeyword;
+ generated$2.tSObjectKeyword = generated$2.tsObjectKeyword = tsObjectKeyword;
+ generated$2.tSOptionalType = generated$2.tsOptionalType = tsOptionalType;
+ generated$2.tSParameterProperty = generated$2.tsParameterProperty = tsParameterProperty;
+ generated$2.tSParenthesizedType = generated$2.tsParenthesizedType = tsParenthesizedType;
+ generated$2.tSPropertySignature = generated$2.tsPropertySignature = tsPropertySignature;
+ generated$2.tSQualifiedName = generated$2.tsQualifiedName = tsQualifiedName;
+ generated$2.tSRestType = generated$2.tsRestType = tsRestType;
+ generated$2.tSSatisfiesExpression = generated$2.tsSatisfiesExpression = tsSatisfiesExpression;
+ generated$2.tSStringKeyword = generated$2.tsStringKeyword = tsStringKeyword;
+ generated$2.tSSymbolKeyword = generated$2.tsSymbolKeyword = tsSymbolKeyword;
+ generated$2.tSThisType = generated$2.tsThisType = tsThisType;
+ generated$2.tSTupleType = generated$2.tsTupleType = tsTupleType;
+ generated$2.tSTypeAliasDeclaration = generated$2.tsTypeAliasDeclaration = tsTypeAliasDeclaration;
+ generated$2.tSTypeAnnotation = generated$2.tsTypeAnnotation = tsTypeAnnotation;
+ generated$2.tSTypeAssertion = generated$2.tsTypeAssertion = tsTypeAssertion;
+ generated$2.tSTypeLiteral = generated$2.tsTypeLiteral = tsTypeLiteral;
+ generated$2.tSTypeOperator = generated$2.tsTypeOperator = tsTypeOperator;
+ generated$2.tSTypeParameter = generated$2.tsTypeParameter = tsTypeParameter;
+ generated$2.tSTypeParameterDeclaration = generated$2.tsTypeParameterDeclaration = tsTypeParameterDeclaration;
+ generated$2.tSTypeParameterInstantiation = generated$2.tsTypeParameterInstantiation = tsTypeParameterInstantiation;
+ generated$2.tSTypePredicate = generated$2.tsTypePredicate = tsTypePredicate;
+ generated$2.tSTypeQuery = generated$2.tsTypeQuery = tsTypeQuery;
+ generated$2.tSTypeReference = generated$2.tsTypeReference = tsTypeReference;
+ generated$2.tSUndefinedKeyword = generated$2.tsUndefinedKeyword = tsUndefinedKeyword;
+ generated$2.tSUnionType = generated$2.tsUnionType = tsUnionType;
+ generated$2.tSUnknownKeyword = generated$2.tsUnknownKeyword = tsUnknownKeyword;
+ generated$2.tSVoidKeyword = generated$2.tsVoidKeyword = tsVoidKeyword;
+ generated$2.tupleExpression = tupleExpression;
+ generated$2.tupleTypeAnnotation = tupleTypeAnnotation;
+ generated$2.typeAlias = typeAlias;
+ generated$2.typeAnnotation = typeAnnotation;
+ generated$2.typeCastExpression = typeCastExpression;
+ generated$2.typeParameter = typeParameter;
+ generated$2.typeParameterDeclaration = typeParameterDeclaration;
+ generated$2.typeParameterInstantiation = typeParameterInstantiation;
+ generated$2.typeofTypeAnnotation = typeofTypeAnnotation;
+ generated$2.unaryExpression = unaryExpression;
+ generated$2.unionTypeAnnotation = unionTypeAnnotation;
+ generated$2.updateExpression = updateExpression;
+ generated$2.v8IntrinsicIdentifier = v8IntrinsicIdentifier;
+ generated$2.variableDeclaration = variableDeclaration;
+ generated$2.variableDeclarator = variableDeclarator;
+ generated$2.variance = variance;
+ generated$2.voidTypeAnnotation = voidTypeAnnotation;
+ generated$2.whileStatement = whileStatement;
+ generated$2.withStatement = withStatement;
+ generated$2.yieldExpression = yieldExpression;
+ var _validateNode = requireValidateNode();
+ var _deprecationWarning = requireDeprecationWarning();
+ function arrayExpression(elements = []) {
+ return (0, _validateNode.default)({
+ type: "ArrayExpression",
+ elements
+ });
+ }
+ function assignmentExpression(operator, left, right) {
+ return (0, _validateNode.default)({
+ type: "AssignmentExpression",
+ operator,
+ left,
+ right
+ });
+ }
+ function binaryExpression(operator, left, right) {
+ return (0, _validateNode.default)({
+ type: "BinaryExpression",
+ operator,
+ left,
+ right
+ });
+ }
+ function interpreterDirective(value) {
+ return (0, _validateNode.default)({
+ type: "InterpreterDirective",
+ value
+ });
+ }
+ function directive(value) {
+ return (0, _validateNode.default)({
+ type: "Directive",
+ value
+ });
+ }
+ function directiveLiteral(value) {
+ return (0, _validateNode.default)({
+ type: "DirectiveLiteral",
+ value
+ });
+ }
+ function blockStatement(body, directives = []) {
+ return (0, _validateNode.default)({
+ type: "BlockStatement",
+ body,
+ directives
+ });
+ }
+ function breakStatement(label = null) {
+ return (0, _validateNode.default)({
+ type: "BreakStatement",
+ label
+ });
+ }
+ function callExpression(callee, _arguments) {
+ return (0, _validateNode.default)({
+ type: "CallExpression",
+ callee,
+ arguments: _arguments
+ });
+ }
+ function catchClause(param = null, body) {
+ return (0, _validateNode.default)({
+ type: "CatchClause",
+ param,
+ body
+ });
+ }
+ function conditionalExpression(test, consequent, alternate) {
+ return (0, _validateNode.default)({
+ type: "ConditionalExpression",
+ test,
+ consequent,
+ alternate
+ });
+ }
+ function continueStatement(label = null) {
+ return (0, _validateNode.default)({
+ type: "ContinueStatement",
+ label
+ });
+ }
+ function debuggerStatement() {
+ return {
+ type: "DebuggerStatement"
+ };
+ }
+ function doWhileStatement(test, body) {
+ return (0, _validateNode.default)({
+ type: "DoWhileStatement",
+ test,
+ body
+ });
+ }
+ function emptyStatement() {
+ return {
+ type: "EmptyStatement"
+ };
+ }
+ function expressionStatement(expression) {
+ return (0, _validateNode.default)({
+ type: "ExpressionStatement",
+ expression
+ });
+ }
+ function file(program, comments = null, tokens = null) {
+ return (0, _validateNode.default)({
+ type: "File",
+ program,
+ comments,
+ tokens
+ });
+ }
+ function forInStatement(left, right, body) {
+ return (0, _validateNode.default)({
+ type: "ForInStatement",
+ left,
+ right,
+ body
+ });
+ }
+ function forStatement(init = null, test = null, update = null, body) {
+ return (0, _validateNode.default)({
+ type: "ForStatement",
+ init,
+ test,
+ update,
+ body
+ });
+ }
+ function functionDeclaration(id = null, params, body, generator = false, async = false) {
+ return (0, _validateNode.default)({
+ type: "FunctionDeclaration",
+ id,
+ params,
+ body,
+ generator,
+ async
+ });
+ }
+ function functionExpression(id = null, params, body, generator = false, async = false) {
+ return (0, _validateNode.default)({
+ type: "FunctionExpression",
+ id,
+ params,
+ body,
+ generator,
+ async
+ });
+ }
+ function identifier(name) {
+ return (0, _validateNode.default)({
+ type: "Identifier",
+ name
+ });
+ }
+ function ifStatement(test, consequent, alternate = null) {
+ return (0, _validateNode.default)({
+ type: "IfStatement",
+ test,
+ consequent,
+ alternate
+ });
+ }
+ function labeledStatement(label, body) {
+ return (0, _validateNode.default)({
+ type: "LabeledStatement",
+ label,
+ body
+ });
+ }
+ function stringLiteral(value) {
+ return (0, _validateNode.default)({
+ type: "StringLiteral",
+ value
+ });
+ }
+ function numericLiteral(value) {
+ return (0, _validateNode.default)({
+ type: "NumericLiteral",
+ value
+ });
+ }
+ function nullLiteral() {
+ return {
+ type: "NullLiteral"
+ };
+ }
+ function booleanLiteral(value) {
+ return (0, _validateNode.default)({
+ type: "BooleanLiteral",
+ value
+ });
+ }
+ function regExpLiteral(pattern, flags = "") {
+ return (0, _validateNode.default)({
+ type: "RegExpLiteral",
+ pattern,
+ flags
+ });
+ }
+ function logicalExpression(operator, left, right) {
+ return (0, _validateNode.default)({
+ type: "LogicalExpression",
+ operator,
+ left,
+ right
+ });
+ }
+ function memberExpression(object, property, computed = false, optional = null) {
+ return (0, _validateNode.default)({
+ type: "MemberExpression",
+ object,
+ property,
+ computed,
+ optional
+ });
+ }
+ function newExpression(callee, _arguments) {
+ return (0, _validateNode.default)({
+ type: "NewExpression",
+ callee,
+ arguments: _arguments
+ });
+ }
+ function program(body, directives = [], sourceType = "script", interpreter = null) {
+ return (0, _validateNode.default)({
+ type: "Program",
+ body,
+ directives,
+ sourceType,
+ interpreter,
+ sourceFile: null
+ });
+ }
+ function objectExpression(properties) {
+ return (0, _validateNode.default)({
+ type: "ObjectExpression",
+ properties
+ });
+ }
+ function objectMethod(kind = "method", key, params, body, computed = false, generator = false, async = false) {
+ return (0, _validateNode.default)({
+ type: "ObjectMethod",
+ kind,
+ key,
+ params,
+ body,
+ computed,
+ generator,
+ async
+ });
+ }
+ function objectProperty(key, value, computed = false, shorthand = false, decorators = null) {
+ return (0, _validateNode.default)({
+ type: "ObjectProperty",
+ key,
+ value,
+ computed,
+ shorthand,
+ decorators
+ });
+ }
+ function restElement(argument) {
+ return (0, _validateNode.default)({
+ type: "RestElement",
+ argument
+ });
+ }
+ function returnStatement(argument = null) {
+ return (0, _validateNode.default)({
+ type: "ReturnStatement",
+ argument
+ });
+ }
+ function sequenceExpression(expressions) {
+ return (0, _validateNode.default)({
+ type: "SequenceExpression",
+ expressions
+ });
+ }
+ function parenthesizedExpression(expression) {
+ return (0, _validateNode.default)({
+ type: "ParenthesizedExpression",
+ expression
+ });
+ }
+ function switchCase(test = null, consequent) {
+ return (0, _validateNode.default)({
+ type: "SwitchCase",
+ test,
+ consequent
+ });
+ }
+ function switchStatement(discriminant, cases) {
+ return (0, _validateNode.default)({
+ type: "SwitchStatement",
+ discriminant,
+ cases
+ });
+ }
+ function thisExpression() {
+ return {
+ type: "ThisExpression"
+ };
+ }
+ function throwStatement(argument) {
+ return (0, _validateNode.default)({
+ type: "ThrowStatement",
+ argument
+ });
+ }
+ function tryStatement(block, handler = null, finalizer = null) {
+ return (0, _validateNode.default)({
+ type: "TryStatement",
+ block,
+ handler,
+ finalizer
+ });
+ }
+ function unaryExpression(operator, argument, prefix = true) {
+ return (0, _validateNode.default)({
+ type: "UnaryExpression",
+ operator,
+ argument,
+ prefix
+ });
+ }
+ function updateExpression(operator, argument, prefix = false) {
+ return (0, _validateNode.default)({
+ type: "UpdateExpression",
+ operator,
+ argument,
+ prefix
+ });
+ }
+ function variableDeclaration(kind, declarations) {
+ return (0, _validateNode.default)({
+ type: "VariableDeclaration",
+ kind,
+ declarations
+ });
+ }
+ function variableDeclarator(id, init = null) {
+ return (0, _validateNode.default)({
+ type: "VariableDeclarator",
+ id,
+ init
+ });
+ }
+ function whileStatement(test, body) {
+ return (0, _validateNode.default)({
+ type: "WhileStatement",
+ test,
+ body
+ });
+ }
+ function withStatement(object, body) {
+ return (0, _validateNode.default)({
+ type: "WithStatement",
+ object,
+ body
+ });
+ }
+ function assignmentPattern(left, right) {
+ return (0, _validateNode.default)({
+ type: "AssignmentPattern",
+ left,
+ right
+ });
+ }
+ function arrayPattern(elements) {
+ return (0, _validateNode.default)({
+ type: "ArrayPattern",
+ elements
+ });
+ }
+ function arrowFunctionExpression(params, body, async = false) {
+ return (0, _validateNode.default)({
+ type: "ArrowFunctionExpression",
+ params,
+ body,
+ async,
+ expression: null
+ });
+ }
+ function classBody(body) {
+ return (0, _validateNode.default)({
+ type: "ClassBody",
+ body
+ });
+ }
+ function classExpression(id = null, superClass = null, body, decorators = null) {
+ return (0, _validateNode.default)({
+ type: "ClassExpression",
+ id,
+ superClass,
+ body,
+ decorators
+ });
+ }
+ function classDeclaration(id = null, superClass = null, body, decorators = null) {
+ return (0, _validateNode.default)({
+ type: "ClassDeclaration",
+ id,
+ superClass,
+ body,
+ decorators
+ });
+ }
+ function exportAllDeclaration(source) {
+ return (0, _validateNode.default)({
+ type: "ExportAllDeclaration",
+ source
+ });
+ }
+ function exportDefaultDeclaration(declaration) {
+ return (0, _validateNode.default)({
+ type: "ExportDefaultDeclaration",
+ declaration
+ });
+ }
+ function exportNamedDeclaration(declaration = null, specifiers = [], source = null) {
+ return (0, _validateNode.default)({
+ type: "ExportNamedDeclaration",
+ declaration,
+ specifiers,
+ source
+ });
+ }
+ function exportSpecifier(local, exported) {
+ return (0, _validateNode.default)({
+ type: "ExportSpecifier",
+ local,
+ exported
+ });
+ }
+ function forOfStatement(left, right, body, _await = false) {
+ return (0, _validateNode.default)({
+ type: "ForOfStatement",
+ left,
+ right,
+ body,
+ await: _await
+ });
+ }
+ function importDeclaration(specifiers, source) {
+ return (0, _validateNode.default)({
+ type: "ImportDeclaration",
+ specifiers,
+ source
+ });
+ }
+ function importDefaultSpecifier(local) {
+ return (0, _validateNode.default)({
+ type: "ImportDefaultSpecifier",
+ local
+ });
+ }
+ function importNamespaceSpecifier(local) {
+ return (0, _validateNode.default)({
+ type: "ImportNamespaceSpecifier",
+ local
+ });
+ }
+ function importSpecifier(local, imported) {
+ return (0, _validateNode.default)({
+ type: "ImportSpecifier",
+ local,
+ imported
+ });
+ }
+ function importExpression(source, options = null) {
+ return (0, _validateNode.default)({
+ type: "ImportExpression",
+ source,
+ options
+ });
+ }
+ function metaProperty(meta, property) {
+ return (0, _validateNode.default)({
+ type: "MetaProperty",
+ meta,
+ property
+ });
+ }
+ function classMethod(kind = "method", key, params, body, computed = false, _static = false, generator = false, async = false) {
+ return (0, _validateNode.default)({
+ type: "ClassMethod",
+ kind,
+ key,
+ params,
+ body,
+ computed,
+ static: _static,
+ generator,
+ async
+ });
+ }
+ function objectPattern(properties) {
+ return (0, _validateNode.default)({
+ type: "ObjectPattern",
+ properties
+ });
+ }
+ function spreadElement(argument) {
+ return (0, _validateNode.default)({
+ type: "SpreadElement",
+ argument
+ });
+ }
+ function _super() {
+ return {
+ type: "Super"
+ };
+ }
+ function taggedTemplateExpression(tag, quasi) {
+ return (0, _validateNode.default)({
+ type: "TaggedTemplateExpression",
+ tag,
+ quasi
+ });
+ }
+ function templateElement(value, tail = false) {
+ return (0, _validateNode.default)({
+ type: "TemplateElement",
+ value,
+ tail
+ });
+ }
+ function templateLiteral(quasis, expressions) {
+ return (0, _validateNode.default)({
+ type: "TemplateLiteral",
+ quasis,
+ expressions
+ });
+ }
+ function yieldExpression(argument = null, delegate = false) {
+ return (0, _validateNode.default)({
+ type: "YieldExpression",
+ argument,
+ delegate
+ });
+ }
+ function awaitExpression(argument) {
+ return (0, _validateNode.default)({
+ type: "AwaitExpression",
+ argument
+ });
+ }
+ function _import() {
+ return {
+ type: "Import"
+ };
+ }
+ function bigIntLiteral(value) {
+ return (0, _validateNode.default)({
+ type: "BigIntLiteral",
+ value
+ });
+ }
+ function exportNamespaceSpecifier(exported) {
+ return (0, _validateNode.default)({
+ type: "ExportNamespaceSpecifier",
+ exported
+ });
+ }
+ function optionalMemberExpression(object, property, computed = false, optional) {
+ return (0, _validateNode.default)({
+ type: "OptionalMemberExpression",
+ object,
+ property,
+ computed,
+ optional
+ });
+ }
+ function optionalCallExpression(callee, _arguments, optional) {
+ return (0, _validateNode.default)({
+ type: "OptionalCallExpression",
+ callee,
+ arguments: _arguments,
+ optional
+ });
+ }
+ function classProperty(key, value = null, typeAnnotation = null, decorators = null, computed = false, _static = false) {
+ return (0, _validateNode.default)({
+ type: "ClassProperty",
+ key,
+ value,
+ typeAnnotation,
+ decorators,
+ computed,
+ static: _static
+ });
+ }
+ function classAccessorProperty(key, value = null, typeAnnotation = null, decorators = null, computed = false, _static = false) {
+ return (0, _validateNode.default)({
+ type: "ClassAccessorProperty",
+ key,
+ value,
+ typeAnnotation,
+ decorators,
+ computed,
+ static: _static
+ });
+ }
+ function classPrivateProperty(key, value = null, decorators = null, _static = false) {
+ return (0, _validateNode.default)({
+ type: "ClassPrivateProperty",
+ key,
+ value,
+ decorators,
+ static: _static
+ });
+ }
+ function classPrivateMethod(kind = "method", key, params, body, _static = false) {
+ return (0, _validateNode.default)({
+ type: "ClassPrivateMethod",
+ kind,
+ key,
+ params,
+ body,
+ static: _static
+ });
+ }
+ function privateName(id) {
+ return (0, _validateNode.default)({
+ type: "PrivateName",
+ id
+ });
+ }
+ function staticBlock(body) {
+ return (0, _validateNode.default)({
+ type: "StaticBlock",
+ body
+ });
+ }
+ function anyTypeAnnotation() {
+ return {
+ type: "AnyTypeAnnotation"
+ };
+ }
+ function arrayTypeAnnotation(elementType) {
+ return (0, _validateNode.default)({
+ type: "ArrayTypeAnnotation",
+ elementType
+ });
+ }
+ function booleanTypeAnnotation() {
+ return {
+ type: "BooleanTypeAnnotation"
+ };
+ }
+ function booleanLiteralTypeAnnotation(value) {
+ return (0, _validateNode.default)({
+ type: "BooleanLiteralTypeAnnotation",
+ value
+ });
+ }
+ function nullLiteralTypeAnnotation() {
+ return {
+ type: "NullLiteralTypeAnnotation"
+ };
+ }
+ function classImplements(id, typeParameters = null) {
+ return (0, _validateNode.default)({
+ type: "ClassImplements",
+ id,
+ typeParameters
+ });
+ }
+ function declareClass(id, typeParameters = null, _extends = null, body) {
+ return (0, _validateNode.default)({
+ type: "DeclareClass",
+ id,
+ typeParameters,
+ extends: _extends,
+ body
+ });
+ }
+ function declareFunction(id) {
+ return (0, _validateNode.default)({
+ type: "DeclareFunction",
+ id
+ });
+ }
+ function declareInterface(id, typeParameters = null, _extends = null, body) {
+ return (0, _validateNode.default)({
+ type: "DeclareInterface",
+ id,
+ typeParameters,
+ extends: _extends,
+ body
+ });
+ }
+ function declareModule(id, body, kind = null) {
+ return (0, _validateNode.default)({
+ type: "DeclareModule",
+ id,
+ body,
+ kind
+ });
+ }
+ function declareModuleExports(typeAnnotation) {
+ return (0, _validateNode.default)({
+ type: "DeclareModuleExports",
+ typeAnnotation
+ });
+ }
+ function declareTypeAlias(id, typeParameters = null, right) {
+ return (0, _validateNode.default)({
+ type: "DeclareTypeAlias",
+ id,
+ typeParameters,
+ right
+ });
+ }
+ function declareOpaqueType(id, typeParameters = null, supertype = null) {
+ return (0, _validateNode.default)({
+ type: "DeclareOpaqueType",
+ id,
+ typeParameters,
+ supertype
+ });
+ }
+ function declareVariable(id) {
+ return (0, _validateNode.default)({
+ type: "DeclareVariable",
+ id
+ });
+ }
+ function declareExportDeclaration(declaration = null, specifiers = null, source = null) {
+ return (0, _validateNode.default)({
+ type: "DeclareExportDeclaration",
+ declaration,
+ specifiers,
+ source
+ });
+ }
+ function declareExportAllDeclaration(source) {
+ return (0, _validateNode.default)({
+ type: "DeclareExportAllDeclaration",
+ source
+ });
+ }
+ function declaredPredicate(value) {
+ return (0, _validateNode.default)({
+ type: "DeclaredPredicate",
+ value
+ });
+ }
+ function existsTypeAnnotation() {
+ return {
+ type: "ExistsTypeAnnotation"
+ };
+ }
+ function functionTypeAnnotation(typeParameters = null, params, rest = null, returnType) {
+ return (0, _validateNode.default)({
+ type: "FunctionTypeAnnotation",
+ typeParameters,
+ params,
+ rest,
+ returnType
+ });
+ }
+ function functionTypeParam(name = null, typeAnnotation) {
+ return (0, _validateNode.default)({
+ type: "FunctionTypeParam",
+ name,
+ typeAnnotation
+ });
+ }
+ function genericTypeAnnotation(id, typeParameters = null) {
+ return (0, _validateNode.default)({
+ type: "GenericTypeAnnotation",
+ id,
+ typeParameters
+ });
+ }
+ function inferredPredicate() {
+ return {
+ type: "InferredPredicate"
+ };
+ }
+ function interfaceExtends(id, typeParameters = null) {
+ return (0, _validateNode.default)({
+ type: "InterfaceExtends",
+ id,
+ typeParameters
+ });
+ }
+ function interfaceDeclaration(id, typeParameters = null, _extends = null, body) {
+ return (0, _validateNode.default)({
+ type: "InterfaceDeclaration",
+ id,
+ typeParameters,
+ extends: _extends,
+ body
+ });
+ }
+ function interfaceTypeAnnotation(_extends = null, body) {
+ return (0, _validateNode.default)({
+ type: "InterfaceTypeAnnotation",
+ extends: _extends,
+ body
+ });
+ }
+ function intersectionTypeAnnotation(types) {
+ return (0, _validateNode.default)({
+ type: "IntersectionTypeAnnotation",
+ types
+ });
+ }
+ function mixedTypeAnnotation() {
+ return {
+ type: "MixedTypeAnnotation"
+ };
+ }
+ function emptyTypeAnnotation() {
+ return {
+ type: "EmptyTypeAnnotation"
+ };
+ }
+ function nullableTypeAnnotation(typeAnnotation) {
+ return (0, _validateNode.default)({
+ type: "NullableTypeAnnotation",
+ typeAnnotation
+ });
+ }
+ function numberLiteralTypeAnnotation(value) {
+ return (0, _validateNode.default)({
+ type: "NumberLiteralTypeAnnotation",
+ value
+ });
+ }
+ function numberTypeAnnotation() {
+ return {
+ type: "NumberTypeAnnotation"
+ };
+ }
+ function objectTypeAnnotation(properties, indexers = [], callProperties = [], internalSlots = [], exact = false) {
+ return (0, _validateNode.default)({
+ type: "ObjectTypeAnnotation",
+ properties,
+ indexers,
+ callProperties,
+ internalSlots,
+ exact
+ });
+ }
+ function objectTypeInternalSlot(id, value, optional, _static, method) {
+ return (0, _validateNode.default)({
+ type: "ObjectTypeInternalSlot",
+ id,
+ value,
+ optional,
+ static: _static,
+ method
+ });
+ }
+ function objectTypeCallProperty(value) {
+ return (0, _validateNode.default)({
+ type: "ObjectTypeCallProperty",
+ value,
+ static: null
+ });
+ }
+ function objectTypeIndexer(id = null, key, value, variance = null) {
+ return (0, _validateNode.default)({
+ type: "ObjectTypeIndexer",
+ id,
+ key,
+ value,
+ variance,
+ static: null
+ });
+ }
+ function objectTypeProperty(key, value, variance = null) {
+ return (0, _validateNode.default)({
+ type: "ObjectTypeProperty",
+ key,
+ value,
+ variance,
+ kind: null,
+ method: null,
+ optional: null,
+ proto: null,
+ static: null
+ });
+ }
+ function objectTypeSpreadProperty(argument) {
+ return (0, _validateNode.default)({
+ type: "ObjectTypeSpreadProperty",
+ argument
+ });
+ }
+ function opaqueType(id, typeParameters = null, supertype = null, impltype) {
+ return (0, _validateNode.default)({
+ type: "OpaqueType",
+ id,
+ typeParameters,
+ supertype,
+ impltype
+ });
+ }
+ function qualifiedTypeIdentifier(id, qualification) {
+ return (0, _validateNode.default)({
+ type: "QualifiedTypeIdentifier",
+ id,
+ qualification
+ });
+ }
+ function stringLiteralTypeAnnotation(value) {
+ return (0, _validateNode.default)({
+ type: "StringLiteralTypeAnnotation",
+ value
+ });
+ }
+ function stringTypeAnnotation() {
+ return {
+ type: "StringTypeAnnotation"
+ };
+ }
+ function symbolTypeAnnotation() {
+ return {
+ type: "SymbolTypeAnnotation"
+ };
+ }
+ function thisTypeAnnotation() {
+ return {
+ type: "ThisTypeAnnotation"
+ };
+ }
+ function tupleTypeAnnotation(types) {
+ return (0, _validateNode.default)({
+ type: "TupleTypeAnnotation",
+ types
+ });
+ }
+ function typeofTypeAnnotation(argument) {
+ return (0, _validateNode.default)({
+ type: "TypeofTypeAnnotation",
+ argument
+ });
+ }
+ function typeAlias(id, typeParameters = null, right) {
+ return (0, _validateNode.default)({
+ type: "TypeAlias",
+ id,
+ typeParameters,
+ right
+ });
+ }
+ function typeAnnotation(typeAnnotation) {
+ return (0, _validateNode.default)({
+ type: "TypeAnnotation",
+ typeAnnotation
+ });
+ }
+ function typeCastExpression(expression, typeAnnotation) {
+ return (0, _validateNode.default)({
+ type: "TypeCastExpression",
+ expression,
+ typeAnnotation
+ });
+ }
+ function typeParameter(bound = null, _default = null, variance = null) {
+ return (0, _validateNode.default)({
+ type: "TypeParameter",
+ bound,
+ default: _default,
+ variance,
+ name: null
+ });
+ }
+ function typeParameterDeclaration(params) {
+ return (0, _validateNode.default)({
+ type: "TypeParameterDeclaration",
+ params
+ });
+ }
+ function typeParameterInstantiation(params) {
+ return (0, _validateNode.default)({
+ type: "TypeParameterInstantiation",
+ params
+ });
+ }
+ function unionTypeAnnotation(types) {
+ return (0, _validateNode.default)({
+ type: "UnionTypeAnnotation",
+ types
+ });
+ }
+ function variance(kind) {
+ return (0, _validateNode.default)({
+ type: "Variance",
+ kind
+ });
+ }
+ function voidTypeAnnotation() {
+ return {
+ type: "VoidTypeAnnotation"
+ };
+ }
+ function enumDeclaration(id, body) {
+ return (0, _validateNode.default)({
+ type: "EnumDeclaration",
+ id,
+ body
+ });
+ }
+ function enumBooleanBody(members) {
+ return (0, _validateNode.default)({
+ type: "EnumBooleanBody",
+ members,
+ explicitType: null,
+ hasUnknownMembers: null
+ });
+ }
+ function enumNumberBody(members) {
+ return (0, _validateNode.default)({
+ type: "EnumNumberBody",
+ members,
+ explicitType: null,
+ hasUnknownMembers: null
+ });
+ }
+ function enumStringBody(members) {
+ return (0, _validateNode.default)({
+ type: "EnumStringBody",
+ members,
+ explicitType: null,
+ hasUnknownMembers: null
+ });
+ }
+ function enumSymbolBody(members) {
+ return (0, _validateNode.default)({
+ type: "EnumSymbolBody",
+ members,
+ hasUnknownMembers: null
+ });
+ }
+ function enumBooleanMember(id) {
+ return (0, _validateNode.default)({
+ type: "EnumBooleanMember",
+ id,
+ init: null
+ });
+ }
+ function enumNumberMember(id, init) {
+ return (0, _validateNode.default)({
+ type: "EnumNumberMember",
+ id,
+ init
+ });
+ }
+ function enumStringMember(id, init) {
+ return (0, _validateNode.default)({
+ type: "EnumStringMember",
+ id,
+ init
+ });
+ }
+ function enumDefaultedMember(id) {
+ return (0, _validateNode.default)({
+ type: "EnumDefaultedMember",
+ id
+ });
+ }
+ function indexedAccessType(objectType, indexType) {
+ return (0, _validateNode.default)({
+ type: "IndexedAccessType",
+ objectType,
+ indexType
+ });
+ }
+ function optionalIndexedAccessType(objectType, indexType) {
+ return (0, _validateNode.default)({
+ type: "OptionalIndexedAccessType",
+ objectType,
+ indexType,
+ optional: null
+ });
+ }
+ function jsxAttribute(name, value = null) {
+ return (0, _validateNode.default)({
+ type: "JSXAttribute",
+ name,
+ value
+ });
+ }
+ function jsxClosingElement(name) {
+ return (0, _validateNode.default)({
+ type: "JSXClosingElement",
+ name
+ });
+ }
+ function jsxElement(openingElement, closingElement = null, children, selfClosing = null) {
+ return (0, _validateNode.default)({
+ type: "JSXElement",
+ openingElement,
+ closingElement,
+ children,
+ selfClosing
+ });
+ }
+ function jsxEmptyExpression() {
+ return {
+ type: "JSXEmptyExpression"
+ };
+ }
+ function jsxExpressionContainer(expression) {
+ return (0, _validateNode.default)({
+ type: "JSXExpressionContainer",
+ expression
+ });
+ }
+ function jsxSpreadChild(expression) {
+ return (0, _validateNode.default)({
+ type: "JSXSpreadChild",
+ expression
+ });
+ }
+ function jsxIdentifier(name) {
+ return (0, _validateNode.default)({
+ type: "JSXIdentifier",
+ name
+ });
+ }
+ function jsxMemberExpression(object, property) {
+ return (0, _validateNode.default)({
+ type: "JSXMemberExpression",
+ object,
+ property
+ });
+ }
+ function jsxNamespacedName(namespace, name) {
+ return (0, _validateNode.default)({
+ type: "JSXNamespacedName",
+ namespace,
+ name
+ });
+ }
+ function jsxOpeningElement(name, attributes, selfClosing = false) {
+ return (0, _validateNode.default)({
+ type: "JSXOpeningElement",
+ name,
+ attributes,
+ selfClosing
+ });
+ }
+ function jsxSpreadAttribute(argument) {
+ return (0, _validateNode.default)({
+ type: "JSXSpreadAttribute",
+ argument
+ });
+ }
+ function jsxText(value) {
+ return (0, _validateNode.default)({
+ type: "JSXText",
+ value
+ });
+ }
+ function jsxFragment(openingFragment, closingFragment, children) {
+ return (0, _validateNode.default)({
+ type: "JSXFragment",
+ openingFragment,
+ closingFragment,
+ children
+ });
+ }
+ function jsxOpeningFragment() {
+ return {
+ type: "JSXOpeningFragment"
+ };
+ }
+ function jsxClosingFragment() {
+ return {
+ type: "JSXClosingFragment"
+ };
+ }
+ function noop() {
+ return {
+ type: "Noop"
+ };
+ }
+ function placeholder(expectedNode, name) {
+ return (0, _validateNode.default)({
+ type: "Placeholder",
+ expectedNode,
+ name
+ });
+ }
+ function v8IntrinsicIdentifier(name) {
+ return (0, _validateNode.default)({
+ type: "V8IntrinsicIdentifier",
+ name
+ });
+ }
+ function argumentPlaceholder() {
+ return {
+ type: "ArgumentPlaceholder"
+ };
+ }
+ function bindExpression(object, callee) {
+ return (0, _validateNode.default)({
+ type: "BindExpression",
+ object,
+ callee
+ });
+ }
+ function importAttribute(key, value) {
+ return (0, _validateNode.default)({
+ type: "ImportAttribute",
+ key,
+ value
+ });
+ }
+ function decorator(expression) {
+ return (0, _validateNode.default)({
+ type: "Decorator",
+ expression
+ });
+ }
+ function doExpression(body, async = false) {
+ return (0, _validateNode.default)({
+ type: "DoExpression",
+ body,
+ async
+ });
+ }
+ function exportDefaultSpecifier(exported) {
+ return (0, _validateNode.default)({
+ type: "ExportDefaultSpecifier",
+ exported
+ });
+ }
+ function recordExpression(properties) {
+ return (0, _validateNode.default)({
+ type: "RecordExpression",
+ properties
+ });
+ }
+ function tupleExpression(elements = []) {
+ return (0, _validateNode.default)({
+ type: "TupleExpression",
+ elements
+ });
+ }
+ function decimalLiteral(value) {
+ return (0, _validateNode.default)({
+ type: "DecimalLiteral",
+ value
+ });
+ }
+ function moduleExpression(body) {
+ return (0, _validateNode.default)({
+ type: "ModuleExpression",
+ body
+ });
+ }
+ function topicReference() {
+ return {
+ type: "TopicReference"
+ };
+ }
+ function pipelineTopicExpression(expression) {
+ return (0, _validateNode.default)({
+ type: "PipelineTopicExpression",
+ expression
+ });
+ }
+ function pipelineBareFunction(callee) {
+ return (0, _validateNode.default)({
+ type: "PipelineBareFunction",
+ callee
+ });
+ }
+ function pipelinePrimaryTopicReference() {
+ return {
+ type: "PipelinePrimaryTopicReference"
+ };
+ }
+ function tsParameterProperty(parameter) {
+ return (0, _validateNode.default)({
+ type: "TSParameterProperty",
+ parameter
+ });
+ }
+ function tsDeclareFunction(id = null, typeParameters = null, params, returnType = null) {
+ return (0, _validateNode.default)({
+ type: "TSDeclareFunction",
+ id,
+ typeParameters,
+ params,
+ returnType
+ });
+ }
+ function tsDeclareMethod(decorators = null, key, typeParameters = null, params, returnType = null) {
+ return (0, _validateNode.default)({
+ type: "TSDeclareMethod",
+ decorators,
+ key,
+ typeParameters,
+ params,
+ returnType
+ });
+ }
+ function tsQualifiedName(left, right) {
+ return (0, _validateNode.default)({
+ type: "TSQualifiedName",
+ left,
+ right
+ });
+ }
+ function tsCallSignatureDeclaration(typeParameters = null, parameters, typeAnnotation = null) {
+ return (0, _validateNode.default)({
+ type: "TSCallSignatureDeclaration",
+ typeParameters,
+ parameters,
+ typeAnnotation
+ });
+ }
+ function tsConstructSignatureDeclaration(typeParameters = null, parameters, typeAnnotation = null) {
+ return (0, _validateNode.default)({
+ type: "TSConstructSignatureDeclaration",
+ typeParameters,
+ parameters,
+ typeAnnotation
+ });
+ }
+ function tsPropertySignature(key, typeAnnotation = null, initializer = null) {
+ return (0, _validateNode.default)({
+ type: "TSPropertySignature",
+ key,
+ typeAnnotation,
+ initializer,
+ kind: null
+ });
+ }
+ function tsMethodSignature(key, typeParameters = null, parameters, typeAnnotation = null) {
+ return (0, _validateNode.default)({
+ type: "TSMethodSignature",
+ key,
+ typeParameters,
+ parameters,
+ typeAnnotation,
+ kind: null
+ });
+ }
+ function tsIndexSignature(parameters, typeAnnotation = null) {
+ return (0, _validateNode.default)({
+ type: "TSIndexSignature",
+ parameters,
+ typeAnnotation
+ });
+ }
+ function tsAnyKeyword() {
+ return {
+ type: "TSAnyKeyword"
+ };
+ }
+ function tsBooleanKeyword() {
+ return {
+ type: "TSBooleanKeyword"
+ };
+ }
+ function tsBigIntKeyword() {
+ return {
+ type: "TSBigIntKeyword"
+ };
+ }
+ function tsIntrinsicKeyword() {
+ return {
+ type: "TSIntrinsicKeyword"
+ };
+ }
+ function tsNeverKeyword() {
+ return {
+ type: "TSNeverKeyword"
+ };
+ }
+ function tsNullKeyword() {
+ return {
+ type: "TSNullKeyword"
+ };
+ }
+ function tsNumberKeyword() {
+ return {
+ type: "TSNumberKeyword"
+ };
+ }
+ function tsObjectKeyword() {
+ return {
+ type: "TSObjectKeyword"
+ };
+ }
+ function tsStringKeyword() {
+ return {
+ type: "TSStringKeyword"
+ };
+ }
+ function tsSymbolKeyword() {
+ return {
+ type: "TSSymbolKeyword"
+ };
+ }
+ function tsUndefinedKeyword() {
+ return {
+ type: "TSUndefinedKeyword"
+ };
+ }
+ function tsUnknownKeyword() {
+ return {
+ type: "TSUnknownKeyword"
+ };
+ }
+ function tsVoidKeyword() {
+ return {
+ type: "TSVoidKeyword"
+ };
+ }
+ function tsThisType() {
+ return {
+ type: "TSThisType"
+ };
+ }
+ function tsFunctionType(typeParameters = null, parameters, typeAnnotation = null) {
+ return (0, _validateNode.default)({
+ type: "TSFunctionType",
+ typeParameters,
+ parameters,
+ typeAnnotation
+ });
+ }
+ function tsConstructorType(typeParameters = null, parameters, typeAnnotation = null) {
+ return (0, _validateNode.default)({
+ type: "TSConstructorType",
+ typeParameters,
+ parameters,
+ typeAnnotation
+ });
+ }
+ function tsTypeReference(typeName, typeParameters = null) {
+ return (0, _validateNode.default)({
+ type: "TSTypeReference",
+ typeName,
+ typeParameters
+ });
+ }
+ function tsTypePredicate(parameterName, typeAnnotation = null, asserts = null) {
+ return (0, _validateNode.default)({
+ type: "TSTypePredicate",
+ parameterName,
+ typeAnnotation,
+ asserts
+ });
+ }
+ function tsTypeQuery(exprName, typeParameters = null) {
+ return (0, _validateNode.default)({
+ type: "TSTypeQuery",
+ exprName,
+ typeParameters
+ });
+ }
+ function tsTypeLiteral(members) {
+ return (0, _validateNode.default)({
+ type: "TSTypeLiteral",
+ members
+ });
+ }
+ function tsArrayType(elementType) {
+ return (0, _validateNode.default)({
+ type: "TSArrayType",
+ elementType
+ });
+ }
+ function tsTupleType(elementTypes) {
+ return (0, _validateNode.default)({
+ type: "TSTupleType",
+ elementTypes
+ });
+ }
+ function tsOptionalType(typeAnnotation) {
+ return (0, _validateNode.default)({
+ type: "TSOptionalType",
+ typeAnnotation
+ });
+ }
+ function tsRestType(typeAnnotation) {
+ return (0, _validateNode.default)({
+ type: "TSRestType",
+ typeAnnotation
+ });
+ }
+ function tsNamedTupleMember(label, elementType, optional = false) {
+ return (0, _validateNode.default)({
+ type: "TSNamedTupleMember",
+ label,
+ elementType,
+ optional
+ });
+ }
+ function tsUnionType(types) {
+ return (0, _validateNode.default)({
+ type: "TSUnionType",
+ types
+ });
+ }
+ function tsIntersectionType(types) {
+ return (0, _validateNode.default)({
+ type: "TSIntersectionType",
+ types
+ });
+ }
+ function tsConditionalType(checkType, extendsType, trueType, falseType) {
+ return (0, _validateNode.default)({
+ type: "TSConditionalType",
+ checkType,
+ extendsType,
+ trueType,
+ falseType
+ });
+ }
+ function tsInferType(typeParameter) {
+ return (0, _validateNode.default)({
+ type: "TSInferType",
+ typeParameter
+ });
+ }
+ function tsParenthesizedType(typeAnnotation) {
+ return (0, _validateNode.default)({
+ type: "TSParenthesizedType",
+ typeAnnotation
+ });
+ }
+ function tsTypeOperator(typeAnnotation) {
+ return (0, _validateNode.default)({
+ type: "TSTypeOperator",
+ typeAnnotation,
+ operator: null
+ });
+ }
+ function tsIndexedAccessType(objectType, indexType) {
+ return (0, _validateNode.default)({
+ type: "TSIndexedAccessType",
+ objectType,
+ indexType
+ });
+ }
+ function tsMappedType(typeParameter, typeAnnotation = null, nameType = null) {
+ return (0, _validateNode.default)({
+ type: "TSMappedType",
+ typeParameter,
+ typeAnnotation,
+ nameType
+ });
+ }
+ function tsLiteralType(literal) {
+ return (0, _validateNode.default)({
+ type: "TSLiteralType",
+ literal
+ });
+ }
+ function tsExpressionWithTypeArguments(expression, typeParameters = null) {
+ return (0, _validateNode.default)({
+ type: "TSExpressionWithTypeArguments",
+ expression,
+ typeParameters
+ });
+ }
+ function tsInterfaceDeclaration(id, typeParameters = null, _extends = null, body) {
+ return (0, _validateNode.default)({
+ type: "TSInterfaceDeclaration",
+ id,
+ typeParameters,
+ extends: _extends,
+ body
+ });
+ }
+ function tsInterfaceBody(body) {
+ return (0, _validateNode.default)({
+ type: "TSInterfaceBody",
+ body
+ });
+ }
+ function tsTypeAliasDeclaration(id, typeParameters = null, typeAnnotation) {
+ return (0, _validateNode.default)({
+ type: "TSTypeAliasDeclaration",
+ id,
+ typeParameters,
+ typeAnnotation
+ });
+ }
+ function tsInstantiationExpression(expression, typeParameters = null) {
+ return (0, _validateNode.default)({
+ type: "TSInstantiationExpression",
+ expression,
+ typeParameters
+ });
+ }
+ function tsAsExpression(expression, typeAnnotation) {
+ return (0, _validateNode.default)({
+ type: "TSAsExpression",
+ expression,
+ typeAnnotation
+ });
+ }
+ function tsSatisfiesExpression(expression, typeAnnotation) {
+ return (0, _validateNode.default)({
+ type: "TSSatisfiesExpression",
+ expression,
+ typeAnnotation
+ });
+ }
+ function tsTypeAssertion(typeAnnotation, expression) {
+ return (0, _validateNode.default)({
+ type: "TSTypeAssertion",
+ typeAnnotation,
+ expression
+ });
+ }
+ function tsEnumDeclaration(id, members) {
+ return (0, _validateNode.default)({
+ type: "TSEnumDeclaration",
+ id,
+ members
+ });
+ }
+ function tsEnumMember(id, initializer = null) {
+ return (0, _validateNode.default)({
+ type: "TSEnumMember",
+ id,
+ initializer
+ });
+ }
+ function tsModuleDeclaration(id, body) {
+ return (0, _validateNode.default)({
+ type: "TSModuleDeclaration",
+ id,
+ body
+ });
+ }
+ function tsModuleBlock(body) {
+ return (0, _validateNode.default)({
+ type: "TSModuleBlock",
+ body
+ });
+ }
+ function tsImportType(argument, qualifier = null, typeParameters = null) {
+ return (0, _validateNode.default)({
+ type: "TSImportType",
+ argument,
+ qualifier,
+ typeParameters
+ });
+ }
+ function tsImportEqualsDeclaration(id, moduleReference) {
+ return (0, _validateNode.default)({
+ type: "TSImportEqualsDeclaration",
+ id,
+ moduleReference,
+ isExport: null
+ });
+ }
+ function tsExternalModuleReference(expression) {
+ return (0, _validateNode.default)({
+ type: "TSExternalModuleReference",
+ expression
+ });
+ }
+ function tsNonNullExpression(expression) {
+ return (0, _validateNode.default)({
+ type: "TSNonNullExpression",
+ expression
+ });
+ }
+ function tsExportAssignment(expression) {
+ return (0, _validateNode.default)({
+ type: "TSExportAssignment",
+ expression
+ });
+ }
+ function tsNamespaceExportDeclaration(id) {
+ return (0, _validateNode.default)({
+ type: "TSNamespaceExportDeclaration",
+ id
+ });
+ }
+ function tsTypeAnnotation(typeAnnotation) {
+ return (0, _validateNode.default)({
+ type: "TSTypeAnnotation",
+ typeAnnotation
+ });
+ }
+ function tsTypeParameterInstantiation(params) {
+ return (0, _validateNode.default)({
+ type: "TSTypeParameterInstantiation",
+ params
+ });
+ }
+ function tsTypeParameterDeclaration(params) {
+ return (0, _validateNode.default)({
+ type: "TSTypeParameterDeclaration",
+ params
+ });
+ }
+ function tsTypeParameter(constraint = null, _default = null, name) {
+ return (0, _validateNode.default)({
+ type: "TSTypeParameter",
+ constraint,
+ default: _default,
+ name
+ });
+ }
+ function NumberLiteral(value) {
+ (0, _deprecationWarning.default)("NumberLiteral", "NumericLiteral", "The node type ");
+ return numericLiteral(value);
+ }
+ function RegexLiteral(pattern, flags = "") {
+ (0, _deprecationWarning.default)("RegexLiteral", "RegExpLiteral", "The node type ");
+ return regExpLiteral(pattern, flags);
+ }
+ function RestProperty(argument) {
+ (0, _deprecationWarning.default)("RestProperty", "RestElement", "The node type ");
+ return restElement(argument);
+ }
+ function SpreadProperty(argument) {
+ (0, _deprecationWarning.default)("SpreadProperty", "SpreadElement", "The node type ");
+ return spreadElement(argument);
+ }
+
+
+ return generated$2;
+ }
+
+ var hasRequiredCleanJSXElementLiteralChild;
+
+ function requireCleanJSXElementLiteralChild () {
+ if (hasRequiredCleanJSXElementLiteralChild) return cleanJSXElementLiteralChild;
+ hasRequiredCleanJSXElementLiteralChild = 1;
+
+ Object.defineProperty(cleanJSXElementLiteralChild, "__esModule", {
+ value: true
+ });
+ cleanJSXElementLiteralChild.default = cleanJSXElementLiteralChild$1;
+ var _index = requireGenerated$2();
+ var _index2 = requireLib$2();
+ function cleanJSXElementLiteralChild$1(child, args) {
+ const lines = child.value.split(/\r\n|\n|\r/);
+ let lastNonEmptyLine = 0;
+ for (let i = 0; i < lines.length; i++) {
+ if (lines[i].match(/[^ \t]/)) {
+ lastNonEmptyLine = i;
+ }
+ }
+ let str = "";
+ for (let i = 0; i < lines.length; i++) {
+ const line = lines[i];
+ const isFirstLine = i === 0;
+ const isLastLine = i === lines.length - 1;
+ const isLastNonEmptyLine = i === lastNonEmptyLine;
+ let trimmedLine = line.replace(/\t/g, " ");
+ if (!isFirstLine) {
+ trimmedLine = trimmedLine.replace(/^[ ]+/, "");
+ }
+ if (!isLastLine) {
+ trimmedLine = trimmedLine.replace(/[ ]+$/, "");
+ }
+ if (trimmedLine) {
+ if (!isLastNonEmptyLine) {
+ trimmedLine += " ";
+ }
+ str += trimmedLine;
+ }
+ }
+ if (str) args.push((0, _index2.inherits)((0, _index.stringLiteral)(str), child));
+ }
+
+
+ return cleanJSXElementLiteralChild;
+ }
+
+ var hasRequiredBuildChildren;
+
+ function requireBuildChildren () {
+ if (hasRequiredBuildChildren) return buildChildren;
+ hasRequiredBuildChildren = 1;
+
+ Object.defineProperty(buildChildren, "__esModule", {
+ value: true
+ });
+ buildChildren.default = buildChildren$1;
+ var _index = requireGenerated$3();
+ var _cleanJSXElementLiteralChild = requireCleanJSXElementLiteralChild();
+ function buildChildren$1(node) {
+ const elements = [];
+ for (let i = 0; i < node.children.length; i++) {
+ let child = node.children[i];
+ if ((0, _index.isJSXText)(child)) {
+ (0, _cleanJSXElementLiteralChild.default)(child, elements);
+ continue;
+ }
+ if ((0, _index.isJSXExpressionContainer)(child)) child = child.expression;
+ if ((0, _index.isJSXEmptyExpression)(child)) continue;
+ elements.push(child);
+ }
+ return elements;
+ }
+
+
+ return buildChildren;
+ }
+
+ var assertNode = {};
+
+ var isNode$1 = {};
+
+ var hasRequiredIsNode;
+
+ function requireIsNode () {
+ if (hasRequiredIsNode) return isNode$1;
+ hasRequiredIsNode = 1;
+
+ Object.defineProperty(isNode$1, "__esModule", {
+ value: true
+ });
+ isNode$1.default = isNode;
+ var _index = requireDefinitions();
+ function isNode(node) {
+ return !!(node && _index.VISITOR_KEYS[node.type]);
+ }
+
+
+ return isNode$1;
+ }
+
+ var hasRequiredAssertNode;
+
+ function requireAssertNode () {
+ if (hasRequiredAssertNode) return assertNode;
+ hasRequiredAssertNode = 1;
+
+ Object.defineProperty(assertNode, "__esModule", {
+ value: true
+ });
+ assertNode.default = assertNode$1;
+ var _isNode = requireIsNode();
+ function assertNode$1(node) {
+ if (!(0, _isNode.default)(node)) {
+ var _node$type;
+ const type = (_node$type = node == null ? void 0 : node.type) != null ? _node$type : JSON.stringify(node);
+ throw new TypeError(`Not a valid node of type "${type}"`);
+ }
+ }
+
+
+ return assertNode;
+ }
+
+ var generated$1 = {};
+
+ var hasRequiredGenerated$1;
+
+ function requireGenerated$1 () {
+ if (hasRequiredGenerated$1) return generated$1;
+ hasRequiredGenerated$1 = 1;
+
+ Object.defineProperty(generated$1, "__esModule", {
+ value: true
+ });
+ generated$1.assertAccessor = assertAccessor;
+ generated$1.assertAnyTypeAnnotation = assertAnyTypeAnnotation;
+ generated$1.assertArgumentPlaceholder = assertArgumentPlaceholder;
+ generated$1.assertArrayExpression = assertArrayExpression;
+ generated$1.assertArrayPattern = assertArrayPattern;
+ generated$1.assertArrayTypeAnnotation = assertArrayTypeAnnotation;
+ generated$1.assertArrowFunctionExpression = assertArrowFunctionExpression;
+ generated$1.assertAssignmentExpression = assertAssignmentExpression;
+ generated$1.assertAssignmentPattern = assertAssignmentPattern;
+ generated$1.assertAwaitExpression = assertAwaitExpression;
+ generated$1.assertBigIntLiteral = assertBigIntLiteral;
+ generated$1.assertBinary = assertBinary;
+ generated$1.assertBinaryExpression = assertBinaryExpression;
+ generated$1.assertBindExpression = assertBindExpression;
+ generated$1.assertBlock = assertBlock;
+ generated$1.assertBlockParent = assertBlockParent;
+ generated$1.assertBlockStatement = assertBlockStatement;
+ generated$1.assertBooleanLiteral = assertBooleanLiteral;
+ generated$1.assertBooleanLiteralTypeAnnotation = assertBooleanLiteralTypeAnnotation;
+ generated$1.assertBooleanTypeAnnotation = assertBooleanTypeAnnotation;
+ generated$1.assertBreakStatement = assertBreakStatement;
+ generated$1.assertCallExpression = assertCallExpression;
+ generated$1.assertCatchClause = assertCatchClause;
+ generated$1.assertClass = assertClass;
+ generated$1.assertClassAccessorProperty = assertClassAccessorProperty;
+ generated$1.assertClassBody = assertClassBody;
+ generated$1.assertClassDeclaration = assertClassDeclaration;
+ generated$1.assertClassExpression = assertClassExpression;
+ generated$1.assertClassImplements = assertClassImplements;
+ generated$1.assertClassMethod = assertClassMethod;
+ generated$1.assertClassPrivateMethod = assertClassPrivateMethod;
+ generated$1.assertClassPrivateProperty = assertClassPrivateProperty;
+ generated$1.assertClassProperty = assertClassProperty;
+ generated$1.assertCompletionStatement = assertCompletionStatement;
+ generated$1.assertConditional = assertConditional;
+ generated$1.assertConditionalExpression = assertConditionalExpression;
+ generated$1.assertContinueStatement = assertContinueStatement;
+ generated$1.assertDebuggerStatement = assertDebuggerStatement;
+ generated$1.assertDecimalLiteral = assertDecimalLiteral;
+ generated$1.assertDeclaration = assertDeclaration;
+ generated$1.assertDeclareClass = assertDeclareClass;
+ generated$1.assertDeclareExportAllDeclaration = assertDeclareExportAllDeclaration;
+ generated$1.assertDeclareExportDeclaration = assertDeclareExportDeclaration;
+ generated$1.assertDeclareFunction = assertDeclareFunction;
+ generated$1.assertDeclareInterface = assertDeclareInterface;
+ generated$1.assertDeclareModule = assertDeclareModule;
+ generated$1.assertDeclareModuleExports = assertDeclareModuleExports;
+ generated$1.assertDeclareOpaqueType = assertDeclareOpaqueType;
+ generated$1.assertDeclareTypeAlias = assertDeclareTypeAlias;
+ generated$1.assertDeclareVariable = assertDeclareVariable;
+ generated$1.assertDeclaredPredicate = assertDeclaredPredicate;
+ generated$1.assertDecorator = assertDecorator;
+ generated$1.assertDirective = assertDirective;
+ generated$1.assertDirectiveLiteral = assertDirectiveLiteral;
+ generated$1.assertDoExpression = assertDoExpression;
+ generated$1.assertDoWhileStatement = assertDoWhileStatement;
+ generated$1.assertEmptyStatement = assertEmptyStatement;
+ generated$1.assertEmptyTypeAnnotation = assertEmptyTypeAnnotation;
+ generated$1.assertEnumBody = assertEnumBody;
+ generated$1.assertEnumBooleanBody = assertEnumBooleanBody;
+ generated$1.assertEnumBooleanMember = assertEnumBooleanMember;
+ generated$1.assertEnumDeclaration = assertEnumDeclaration;
+ generated$1.assertEnumDefaultedMember = assertEnumDefaultedMember;
+ generated$1.assertEnumMember = assertEnumMember;
+ generated$1.assertEnumNumberBody = assertEnumNumberBody;
+ generated$1.assertEnumNumberMember = assertEnumNumberMember;
+ generated$1.assertEnumStringBody = assertEnumStringBody;
+ generated$1.assertEnumStringMember = assertEnumStringMember;
+ generated$1.assertEnumSymbolBody = assertEnumSymbolBody;
+ generated$1.assertExistsTypeAnnotation = assertExistsTypeAnnotation;
+ generated$1.assertExportAllDeclaration = assertExportAllDeclaration;
+ generated$1.assertExportDeclaration = assertExportDeclaration;
+ generated$1.assertExportDefaultDeclaration = assertExportDefaultDeclaration;
+ generated$1.assertExportDefaultSpecifier = assertExportDefaultSpecifier;
+ generated$1.assertExportNamedDeclaration = assertExportNamedDeclaration;
+ generated$1.assertExportNamespaceSpecifier = assertExportNamespaceSpecifier;
+ generated$1.assertExportSpecifier = assertExportSpecifier;
+ generated$1.assertExpression = assertExpression;
+ generated$1.assertExpressionStatement = assertExpressionStatement;
+ generated$1.assertExpressionWrapper = assertExpressionWrapper;
+ generated$1.assertFile = assertFile;
+ generated$1.assertFlow = assertFlow;
+ generated$1.assertFlowBaseAnnotation = assertFlowBaseAnnotation;
+ generated$1.assertFlowDeclaration = assertFlowDeclaration;
+ generated$1.assertFlowPredicate = assertFlowPredicate;
+ generated$1.assertFlowType = assertFlowType;
+ generated$1.assertFor = assertFor;
+ generated$1.assertForInStatement = assertForInStatement;
+ generated$1.assertForOfStatement = assertForOfStatement;
+ generated$1.assertForStatement = assertForStatement;
+ generated$1.assertForXStatement = assertForXStatement;
+ generated$1.assertFunction = assertFunction;
+ generated$1.assertFunctionDeclaration = assertFunctionDeclaration;
+ generated$1.assertFunctionExpression = assertFunctionExpression;
+ generated$1.assertFunctionParent = assertFunctionParent;
+ generated$1.assertFunctionTypeAnnotation = assertFunctionTypeAnnotation;
+ generated$1.assertFunctionTypeParam = assertFunctionTypeParam;
+ generated$1.assertGenericTypeAnnotation = assertGenericTypeAnnotation;
+ generated$1.assertIdentifier = assertIdentifier;
+ generated$1.assertIfStatement = assertIfStatement;
+ generated$1.assertImmutable = assertImmutable;
+ generated$1.assertImport = assertImport;
+ generated$1.assertImportAttribute = assertImportAttribute;
+ generated$1.assertImportDeclaration = assertImportDeclaration;
+ generated$1.assertImportDefaultSpecifier = assertImportDefaultSpecifier;
+ generated$1.assertImportExpression = assertImportExpression;
+ generated$1.assertImportNamespaceSpecifier = assertImportNamespaceSpecifier;
+ generated$1.assertImportOrExportDeclaration = assertImportOrExportDeclaration;
+ generated$1.assertImportSpecifier = assertImportSpecifier;
+ generated$1.assertIndexedAccessType = assertIndexedAccessType;
+ generated$1.assertInferredPredicate = assertInferredPredicate;
+ generated$1.assertInterfaceDeclaration = assertInterfaceDeclaration;
+ generated$1.assertInterfaceExtends = assertInterfaceExtends;
+ generated$1.assertInterfaceTypeAnnotation = assertInterfaceTypeAnnotation;
+ generated$1.assertInterpreterDirective = assertInterpreterDirective;
+ generated$1.assertIntersectionTypeAnnotation = assertIntersectionTypeAnnotation;
+ generated$1.assertJSX = assertJSX;
+ generated$1.assertJSXAttribute = assertJSXAttribute;
+ generated$1.assertJSXClosingElement = assertJSXClosingElement;
+ generated$1.assertJSXClosingFragment = assertJSXClosingFragment;
+ generated$1.assertJSXElement = assertJSXElement;
+ generated$1.assertJSXEmptyExpression = assertJSXEmptyExpression;
+ generated$1.assertJSXExpressionContainer = assertJSXExpressionContainer;
+ generated$1.assertJSXFragment = assertJSXFragment;
+ generated$1.assertJSXIdentifier = assertJSXIdentifier;
+ generated$1.assertJSXMemberExpression = assertJSXMemberExpression;
+ generated$1.assertJSXNamespacedName = assertJSXNamespacedName;
+ generated$1.assertJSXOpeningElement = assertJSXOpeningElement;
+ generated$1.assertJSXOpeningFragment = assertJSXOpeningFragment;
+ generated$1.assertJSXSpreadAttribute = assertJSXSpreadAttribute;
+ generated$1.assertJSXSpreadChild = assertJSXSpreadChild;
+ generated$1.assertJSXText = assertJSXText;
+ generated$1.assertLVal = assertLVal;
+ generated$1.assertLabeledStatement = assertLabeledStatement;
+ generated$1.assertLiteral = assertLiteral;
+ generated$1.assertLogicalExpression = assertLogicalExpression;
+ generated$1.assertLoop = assertLoop;
+ generated$1.assertMemberExpression = assertMemberExpression;
+ generated$1.assertMetaProperty = assertMetaProperty;
+ generated$1.assertMethod = assertMethod;
+ generated$1.assertMiscellaneous = assertMiscellaneous;
+ generated$1.assertMixedTypeAnnotation = assertMixedTypeAnnotation;
+ generated$1.assertModuleDeclaration = assertModuleDeclaration;
+ generated$1.assertModuleExpression = assertModuleExpression;
+ generated$1.assertModuleSpecifier = assertModuleSpecifier;
+ generated$1.assertNewExpression = assertNewExpression;
+ generated$1.assertNoop = assertNoop;
+ generated$1.assertNullLiteral = assertNullLiteral;
+ generated$1.assertNullLiteralTypeAnnotation = assertNullLiteralTypeAnnotation;
+ generated$1.assertNullableTypeAnnotation = assertNullableTypeAnnotation;
+ generated$1.assertNumberLiteral = assertNumberLiteral;
+ generated$1.assertNumberLiteralTypeAnnotation = assertNumberLiteralTypeAnnotation;
+ generated$1.assertNumberTypeAnnotation = assertNumberTypeAnnotation;
+ generated$1.assertNumericLiteral = assertNumericLiteral;
+ generated$1.assertObjectExpression = assertObjectExpression;
+ generated$1.assertObjectMember = assertObjectMember;
+ generated$1.assertObjectMethod = assertObjectMethod;
+ generated$1.assertObjectPattern = assertObjectPattern;
+ generated$1.assertObjectProperty = assertObjectProperty;
+ generated$1.assertObjectTypeAnnotation = assertObjectTypeAnnotation;
+ generated$1.assertObjectTypeCallProperty = assertObjectTypeCallProperty;
+ generated$1.assertObjectTypeIndexer = assertObjectTypeIndexer;
+ generated$1.assertObjectTypeInternalSlot = assertObjectTypeInternalSlot;
+ generated$1.assertObjectTypeProperty = assertObjectTypeProperty;
+ generated$1.assertObjectTypeSpreadProperty = assertObjectTypeSpreadProperty;
+ generated$1.assertOpaqueType = assertOpaqueType;
+ generated$1.assertOptionalCallExpression = assertOptionalCallExpression;
+ generated$1.assertOptionalIndexedAccessType = assertOptionalIndexedAccessType;
+ generated$1.assertOptionalMemberExpression = assertOptionalMemberExpression;
+ generated$1.assertParenthesizedExpression = assertParenthesizedExpression;
+ generated$1.assertPattern = assertPattern;
+ generated$1.assertPatternLike = assertPatternLike;
+ generated$1.assertPipelineBareFunction = assertPipelineBareFunction;
+ generated$1.assertPipelinePrimaryTopicReference = assertPipelinePrimaryTopicReference;
+ generated$1.assertPipelineTopicExpression = assertPipelineTopicExpression;
+ generated$1.assertPlaceholder = assertPlaceholder;
+ generated$1.assertPrivate = assertPrivate;
+ generated$1.assertPrivateName = assertPrivateName;
+ generated$1.assertProgram = assertProgram;
+ generated$1.assertProperty = assertProperty;
+ generated$1.assertPureish = assertPureish;
+ generated$1.assertQualifiedTypeIdentifier = assertQualifiedTypeIdentifier;
+ generated$1.assertRecordExpression = assertRecordExpression;
+ generated$1.assertRegExpLiteral = assertRegExpLiteral;
+ generated$1.assertRegexLiteral = assertRegexLiteral;
+ generated$1.assertRestElement = assertRestElement;
+ generated$1.assertRestProperty = assertRestProperty;
+ generated$1.assertReturnStatement = assertReturnStatement;
+ generated$1.assertScopable = assertScopable;
+ generated$1.assertSequenceExpression = assertSequenceExpression;
+ generated$1.assertSpreadElement = assertSpreadElement;
+ generated$1.assertSpreadProperty = assertSpreadProperty;
+ generated$1.assertStandardized = assertStandardized;
+ generated$1.assertStatement = assertStatement;
+ generated$1.assertStaticBlock = assertStaticBlock;
+ generated$1.assertStringLiteral = assertStringLiteral;
+ generated$1.assertStringLiteralTypeAnnotation = assertStringLiteralTypeAnnotation;
+ generated$1.assertStringTypeAnnotation = assertStringTypeAnnotation;
+ generated$1.assertSuper = assertSuper;
+ generated$1.assertSwitchCase = assertSwitchCase;
+ generated$1.assertSwitchStatement = assertSwitchStatement;
+ generated$1.assertSymbolTypeAnnotation = assertSymbolTypeAnnotation;
+ generated$1.assertTSAnyKeyword = assertTSAnyKeyword;
+ generated$1.assertTSArrayType = assertTSArrayType;
+ generated$1.assertTSAsExpression = assertTSAsExpression;
+ generated$1.assertTSBaseType = assertTSBaseType;
+ generated$1.assertTSBigIntKeyword = assertTSBigIntKeyword;
+ generated$1.assertTSBooleanKeyword = assertTSBooleanKeyword;
+ generated$1.assertTSCallSignatureDeclaration = assertTSCallSignatureDeclaration;
+ generated$1.assertTSConditionalType = assertTSConditionalType;
+ generated$1.assertTSConstructSignatureDeclaration = assertTSConstructSignatureDeclaration;
+ generated$1.assertTSConstructorType = assertTSConstructorType;
+ generated$1.assertTSDeclareFunction = assertTSDeclareFunction;
+ generated$1.assertTSDeclareMethod = assertTSDeclareMethod;
+ generated$1.assertTSEntityName = assertTSEntityName;
+ generated$1.assertTSEnumDeclaration = assertTSEnumDeclaration;
+ generated$1.assertTSEnumMember = assertTSEnumMember;
+ generated$1.assertTSExportAssignment = assertTSExportAssignment;
+ generated$1.assertTSExpressionWithTypeArguments = assertTSExpressionWithTypeArguments;
+ generated$1.assertTSExternalModuleReference = assertTSExternalModuleReference;
+ generated$1.assertTSFunctionType = assertTSFunctionType;
+ generated$1.assertTSImportEqualsDeclaration = assertTSImportEqualsDeclaration;
+ generated$1.assertTSImportType = assertTSImportType;
+ generated$1.assertTSIndexSignature = assertTSIndexSignature;
+ generated$1.assertTSIndexedAccessType = assertTSIndexedAccessType;
+ generated$1.assertTSInferType = assertTSInferType;
+ generated$1.assertTSInstantiationExpression = assertTSInstantiationExpression;
+ generated$1.assertTSInterfaceBody = assertTSInterfaceBody;
+ generated$1.assertTSInterfaceDeclaration = assertTSInterfaceDeclaration;
+ generated$1.assertTSIntersectionType = assertTSIntersectionType;
+ generated$1.assertTSIntrinsicKeyword = assertTSIntrinsicKeyword;
+ generated$1.assertTSLiteralType = assertTSLiteralType;
+ generated$1.assertTSMappedType = assertTSMappedType;
+ generated$1.assertTSMethodSignature = assertTSMethodSignature;
+ generated$1.assertTSModuleBlock = assertTSModuleBlock;
+ generated$1.assertTSModuleDeclaration = assertTSModuleDeclaration;
+ generated$1.assertTSNamedTupleMember = assertTSNamedTupleMember;
+ generated$1.assertTSNamespaceExportDeclaration = assertTSNamespaceExportDeclaration;
+ generated$1.assertTSNeverKeyword = assertTSNeverKeyword;
+ generated$1.assertTSNonNullExpression = assertTSNonNullExpression;
+ generated$1.assertTSNullKeyword = assertTSNullKeyword;
+ generated$1.assertTSNumberKeyword = assertTSNumberKeyword;
+ generated$1.assertTSObjectKeyword = assertTSObjectKeyword;
+ generated$1.assertTSOptionalType = assertTSOptionalType;
+ generated$1.assertTSParameterProperty = assertTSParameterProperty;
+ generated$1.assertTSParenthesizedType = assertTSParenthesizedType;
+ generated$1.assertTSPropertySignature = assertTSPropertySignature;
+ generated$1.assertTSQualifiedName = assertTSQualifiedName;
+ generated$1.assertTSRestType = assertTSRestType;
+ generated$1.assertTSSatisfiesExpression = assertTSSatisfiesExpression;
+ generated$1.assertTSStringKeyword = assertTSStringKeyword;
+ generated$1.assertTSSymbolKeyword = assertTSSymbolKeyword;
+ generated$1.assertTSThisType = assertTSThisType;
+ generated$1.assertTSTupleType = assertTSTupleType;
+ generated$1.assertTSType = assertTSType;
+ generated$1.assertTSTypeAliasDeclaration = assertTSTypeAliasDeclaration;
+ generated$1.assertTSTypeAnnotation = assertTSTypeAnnotation;
+ generated$1.assertTSTypeAssertion = assertTSTypeAssertion;
+ generated$1.assertTSTypeElement = assertTSTypeElement;
+ generated$1.assertTSTypeLiteral = assertTSTypeLiteral;
+ generated$1.assertTSTypeOperator = assertTSTypeOperator;
+ generated$1.assertTSTypeParameter = assertTSTypeParameter;
+ generated$1.assertTSTypeParameterDeclaration = assertTSTypeParameterDeclaration;
+ generated$1.assertTSTypeParameterInstantiation = assertTSTypeParameterInstantiation;
+ generated$1.assertTSTypePredicate = assertTSTypePredicate;
+ generated$1.assertTSTypeQuery = assertTSTypeQuery;
+ generated$1.assertTSTypeReference = assertTSTypeReference;
+ generated$1.assertTSUndefinedKeyword = assertTSUndefinedKeyword;
+ generated$1.assertTSUnionType = assertTSUnionType;
+ generated$1.assertTSUnknownKeyword = assertTSUnknownKeyword;
+ generated$1.assertTSVoidKeyword = assertTSVoidKeyword;
+ generated$1.assertTaggedTemplateExpression = assertTaggedTemplateExpression;
+ generated$1.assertTemplateElement = assertTemplateElement;
+ generated$1.assertTemplateLiteral = assertTemplateLiteral;
+ generated$1.assertTerminatorless = assertTerminatorless;
+ generated$1.assertThisExpression = assertThisExpression;
+ generated$1.assertThisTypeAnnotation = assertThisTypeAnnotation;
+ generated$1.assertThrowStatement = assertThrowStatement;
+ generated$1.assertTopicReference = assertTopicReference;
+ generated$1.assertTryStatement = assertTryStatement;
+ generated$1.assertTupleExpression = assertTupleExpression;
+ generated$1.assertTupleTypeAnnotation = assertTupleTypeAnnotation;
+ generated$1.assertTypeAlias = assertTypeAlias;
+ generated$1.assertTypeAnnotation = assertTypeAnnotation;
+ generated$1.assertTypeCastExpression = assertTypeCastExpression;
+ generated$1.assertTypeParameter = assertTypeParameter;
+ generated$1.assertTypeParameterDeclaration = assertTypeParameterDeclaration;
+ generated$1.assertTypeParameterInstantiation = assertTypeParameterInstantiation;
+ generated$1.assertTypeScript = assertTypeScript;
+ generated$1.assertTypeofTypeAnnotation = assertTypeofTypeAnnotation;
+ generated$1.assertUnaryExpression = assertUnaryExpression;
+ generated$1.assertUnaryLike = assertUnaryLike;
+ generated$1.assertUnionTypeAnnotation = assertUnionTypeAnnotation;
+ generated$1.assertUpdateExpression = assertUpdateExpression;
+ generated$1.assertUserWhitespacable = assertUserWhitespacable;
+ generated$1.assertV8IntrinsicIdentifier = assertV8IntrinsicIdentifier;
+ generated$1.assertVariableDeclaration = assertVariableDeclaration;
+ generated$1.assertVariableDeclarator = assertVariableDeclarator;
+ generated$1.assertVariance = assertVariance;
+ generated$1.assertVoidTypeAnnotation = assertVoidTypeAnnotation;
+ generated$1.assertWhile = assertWhile;
+ generated$1.assertWhileStatement = assertWhileStatement;
+ generated$1.assertWithStatement = assertWithStatement;
+ generated$1.assertYieldExpression = assertYieldExpression;
+ var _is = requireIs();
+ var _deprecationWarning = requireDeprecationWarning();
+ function assert(type, node, opts) {
+ if (!(0, _is.default)(type, node, opts)) {
+ throw new Error(`Expected type "${type}" with option ${JSON.stringify(opts)}, ` + `but instead got "${node.type}".`);
+ }
+ }
+ function assertArrayExpression(node, opts) {
+ assert("ArrayExpression", node, opts);
+ }
+ function assertAssignmentExpression(node, opts) {
+ assert("AssignmentExpression", node, opts);
+ }
+ function assertBinaryExpression(node, opts) {
+ assert("BinaryExpression", node, opts);
+ }
+ function assertInterpreterDirective(node, opts) {
+ assert("InterpreterDirective", node, opts);
+ }
+ function assertDirective(node, opts) {
+ assert("Directive", node, opts);
+ }
+ function assertDirectiveLiteral(node, opts) {
+ assert("DirectiveLiteral", node, opts);
+ }
+ function assertBlockStatement(node, opts) {
+ assert("BlockStatement", node, opts);
+ }
+ function assertBreakStatement(node, opts) {
+ assert("BreakStatement", node, opts);
+ }
+ function assertCallExpression(node, opts) {
+ assert("CallExpression", node, opts);
+ }
+ function assertCatchClause(node, opts) {
+ assert("CatchClause", node, opts);
+ }
+ function assertConditionalExpression(node, opts) {
+ assert("ConditionalExpression", node, opts);
+ }
+ function assertContinueStatement(node, opts) {
+ assert("ContinueStatement", node, opts);
+ }
+ function assertDebuggerStatement(node, opts) {
+ assert("DebuggerStatement", node, opts);
+ }
+ function assertDoWhileStatement(node, opts) {
+ assert("DoWhileStatement", node, opts);
+ }
+ function assertEmptyStatement(node, opts) {
+ assert("EmptyStatement", node, opts);
+ }
+ function assertExpressionStatement(node, opts) {
+ assert("ExpressionStatement", node, opts);
+ }
+ function assertFile(node, opts) {
+ assert("File", node, opts);
+ }
+ function assertForInStatement(node, opts) {
+ assert("ForInStatement", node, opts);
+ }
+ function assertForStatement(node, opts) {
+ assert("ForStatement", node, opts);
+ }
+ function assertFunctionDeclaration(node, opts) {
+ assert("FunctionDeclaration", node, opts);
+ }
+ function assertFunctionExpression(node, opts) {
+ assert("FunctionExpression", node, opts);
+ }
+ function assertIdentifier(node, opts) {
+ assert("Identifier", node, opts);
+ }
+ function assertIfStatement(node, opts) {
+ assert("IfStatement", node, opts);
+ }
+ function assertLabeledStatement(node, opts) {
+ assert("LabeledStatement", node, opts);
+ }
+ function assertStringLiteral(node, opts) {
+ assert("StringLiteral", node, opts);
+ }
+ function assertNumericLiteral(node, opts) {
+ assert("NumericLiteral", node, opts);
+ }
+ function assertNullLiteral(node, opts) {
+ assert("NullLiteral", node, opts);
+ }
+ function assertBooleanLiteral(node, opts) {
+ assert("BooleanLiteral", node, opts);
+ }
+ function assertRegExpLiteral(node, opts) {
+ assert("RegExpLiteral", node, opts);
+ }
+ function assertLogicalExpression(node, opts) {
+ assert("LogicalExpression", node, opts);
+ }
+ function assertMemberExpression(node, opts) {
+ assert("MemberExpression", node, opts);
+ }
+ function assertNewExpression(node, opts) {
+ assert("NewExpression", node, opts);
+ }
+ function assertProgram(node, opts) {
+ assert("Program", node, opts);
+ }
+ function assertObjectExpression(node, opts) {
+ assert("ObjectExpression", node, opts);
+ }
+ function assertObjectMethod(node, opts) {
+ assert("ObjectMethod", node, opts);
+ }
+ function assertObjectProperty(node, opts) {
+ assert("ObjectProperty", node, opts);
+ }
+ function assertRestElement(node, opts) {
+ assert("RestElement", node, opts);
+ }
+ function assertReturnStatement(node, opts) {
+ assert("ReturnStatement", node, opts);
+ }
+ function assertSequenceExpression(node, opts) {
+ assert("SequenceExpression", node, opts);
+ }
+ function assertParenthesizedExpression(node, opts) {
+ assert("ParenthesizedExpression", node, opts);
+ }
+ function assertSwitchCase(node, opts) {
+ assert("SwitchCase", node, opts);
+ }
+ function assertSwitchStatement(node, opts) {
+ assert("SwitchStatement", node, opts);
+ }
+ function assertThisExpression(node, opts) {
+ assert("ThisExpression", node, opts);
+ }
+ function assertThrowStatement(node, opts) {
+ assert("ThrowStatement", node, opts);
+ }
+ function assertTryStatement(node, opts) {
+ assert("TryStatement", node, opts);
+ }
+ function assertUnaryExpression(node, opts) {
+ assert("UnaryExpression", node, opts);
+ }
+ function assertUpdateExpression(node, opts) {
+ assert("UpdateExpression", node, opts);
+ }
+ function assertVariableDeclaration(node, opts) {
+ assert("VariableDeclaration", node, opts);
+ }
+ function assertVariableDeclarator(node, opts) {
+ assert("VariableDeclarator", node, opts);
+ }
+ function assertWhileStatement(node, opts) {
+ assert("WhileStatement", node, opts);
+ }
+ function assertWithStatement(node, opts) {
+ assert("WithStatement", node, opts);
+ }
+ function assertAssignmentPattern(node, opts) {
+ assert("AssignmentPattern", node, opts);
+ }
+ function assertArrayPattern(node, opts) {
+ assert("ArrayPattern", node, opts);
+ }
+ function assertArrowFunctionExpression(node, opts) {
+ assert("ArrowFunctionExpression", node, opts);
+ }
+ function assertClassBody(node, opts) {
+ assert("ClassBody", node, opts);
+ }
+ function assertClassExpression(node, opts) {
+ assert("ClassExpression", node, opts);
+ }
+ function assertClassDeclaration(node, opts) {
+ assert("ClassDeclaration", node, opts);
+ }
+ function assertExportAllDeclaration(node, opts) {
+ assert("ExportAllDeclaration", node, opts);
+ }
+ function assertExportDefaultDeclaration(node, opts) {
+ assert("ExportDefaultDeclaration", node, opts);
+ }
+ function assertExportNamedDeclaration(node, opts) {
+ assert("ExportNamedDeclaration", node, opts);
+ }
+ function assertExportSpecifier(node, opts) {
+ assert("ExportSpecifier", node, opts);
+ }
+ function assertForOfStatement(node, opts) {
+ assert("ForOfStatement", node, opts);
+ }
+ function assertImportDeclaration(node, opts) {
+ assert("ImportDeclaration", node, opts);
+ }
+ function assertImportDefaultSpecifier(node, opts) {
+ assert("ImportDefaultSpecifier", node, opts);
+ }
+ function assertImportNamespaceSpecifier(node, opts) {
+ assert("ImportNamespaceSpecifier", node, opts);
+ }
+ function assertImportSpecifier(node, opts) {
+ assert("ImportSpecifier", node, opts);
+ }
+ function assertImportExpression(node, opts) {
+ assert("ImportExpression", node, opts);
+ }
+ function assertMetaProperty(node, opts) {
+ assert("MetaProperty", node, opts);
+ }
+ function assertClassMethod(node, opts) {
+ assert("ClassMethod", node, opts);
+ }
+ function assertObjectPattern(node, opts) {
+ assert("ObjectPattern", node, opts);
+ }
+ function assertSpreadElement(node, opts) {
+ assert("SpreadElement", node, opts);
+ }
+ function assertSuper(node, opts) {
+ assert("Super", node, opts);
+ }
+ function assertTaggedTemplateExpression(node, opts) {
+ assert("TaggedTemplateExpression", node, opts);
+ }
+ function assertTemplateElement(node, opts) {
+ assert("TemplateElement", node, opts);
+ }
+ function assertTemplateLiteral(node, opts) {
+ assert("TemplateLiteral", node, opts);
+ }
+ function assertYieldExpression(node, opts) {
+ assert("YieldExpression", node, opts);
+ }
+ function assertAwaitExpression(node, opts) {
+ assert("AwaitExpression", node, opts);
+ }
+ function assertImport(node, opts) {
+ assert("Import", node, opts);
+ }
+ function assertBigIntLiteral(node, opts) {
+ assert("BigIntLiteral", node, opts);
+ }
+ function assertExportNamespaceSpecifier(node, opts) {
+ assert("ExportNamespaceSpecifier", node, opts);
+ }
+ function assertOptionalMemberExpression(node, opts) {
+ assert("OptionalMemberExpression", node, opts);
+ }
+ function assertOptionalCallExpression(node, opts) {
+ assert("OptionalCallExpression", node, opts);
+ }
+ function assertClassProperty(node, opts) {
+ assert("ClassProperty", node, opts);
+ }
+ function assertClassAccessorProperty(node, opts) {
+ assert("ClassAccessorProperty", node, opts);
+ }
+ function assertClassPrivateProperty(node, opts) {
+ assert("ClassPrivateProperty", node, opts);
+ }
+ function assertClassPrivateMethod(node, opts) {
+ assert("ClassPrivateMethod", node, opts);
+ }
+ function assertPrivateName(node, opts) {
+ assert("PrivateName", node, opts);
+ }
+ function assertStaticBlock(node, opts) {
+ assert("StaticBlock", node, opts);
+ }
+ function assertAnyTypeAnnotation(node, opts) {
+ assert("AnyTypeAnnotation", node, opts);
+ }
+ function assertArrayTypeAnnotation(node, opts) {
+ assert("ArrayTypeAnnotation", node, opts);
+ }
+ function assertBooleanTypeAnnotation(node, opts) {
+ assert("BooleanTypeAnnotation", node, opts);
+ }
+ function assertBooleanLiteralTypeAnnotation(node, opts) {
+ assert("BooleanLiteralTypeAnnotation", node, opts);
+ }
+ function assertNullLiteralTypeAnnotation(node, opts) {
+ assert("NullLiteralTypeAnnotation", node, opts);
+ }
+ function assertClassImplements(node, opts) {
+ assert("ClassImplements", node, opts);
+ }
+ function assertDeclareClass(node, opts) {
+ assert("DeclareClass", node, opts);
+ }
+ function assertDeclareFunction(node, opts) {
+ assert("DeclareFunction", node, opts);
+ }
+ function assertDeclareInterface(node, opts) {
+ assert("DeclareInterface", node, opts);
+ }
+ function assertDeclareModule(node, opts) {
+ assert("DeclareModule", node, opts);
+ }
+ function assertDeclareModuleExports(node, opts) {
+ assert("DeclareModuleExports", node, opts);
+ }
+ function assertDeclareTypeAlias(node, opts) {
+ assert("DeclareTypeAlias", node, opts);
+ }
+ function assertDeclareOpaqueType(node, opts) {
+ assert("DeclareOpaqueType", node, opts);
+ }
+ function assertDeclareVariable(node, opts) {
+ assert("DeclareVariable", node, opts);
+ }
+ function assertDeclareExportDeclaration(node, opts) {
+ assert("DeclareExportDeclaration", node, opts);
+ }
+ function assertDeclareExportAllDeclaration(node, opts) {
+ assert("DeclareExportAllDeclaration", node, opts);
+ }
+ function assertDeclaredPredicate(node, opts) {
+ assert("DeclaredPredicate", node, opts);
+ }
+ function assertExistsTypeAnnotation(node, opts) {
+ assert("ExistsTypeAnnotation", node, opts);
+ }
+ function assertFunctionTypeAnnotation(node, opts) {
+ assert("FunctionTypeAnnotation", node, opts);
+ }
+ function assertFunctionTypeParam(node, opts) {
+ assert("FunctionTypeParam", node, opts);
+ }
+ function assertGenericTypeAnnotation(node, opts) {
+ assert("GenericTypeAnnotation", node, opts);
+ }
+ function assertInferredPredicate(node, opts) {
+ assert("InferredPredicate", node, opts);
+ }
+ function assertInterfaceExtends(node, opts) {
+ assert("InterfaceExtends", node, opts);
+ }
+ function assertInterfaceDeclaration(node, opts) {
+ assert("InterfaceDeclaration", node, opts);
+ }
+ function assertInterfaceTypeAnnotation(node, opts) {
+ assert("InterfaceTypeAnnotation", node, opts);
+ }
+ function assertIntersectionTypeAnnotation(node, opts) {
+ assert("IntersectionTypeAnnotation", node, opts);
+ }
+ function assertMixedTypeAnnotation(node, opts) {
+ assert("MixedTypeAnnotation", node, opts);
+ }
+ function assertEmptyTypeAnnotation(node, opts) {
+ assert("EmptyTypeAnnotation", node, opts);
+ }
+ function assertNullableTypeAnnotation(node, opts) {
+ assert("NullableTypeAnnotation", node, opts);
+ }
+ function assertNumberLiteralTypeAnnotation(node, opts) {
+ assert("NumberLiteralTypeAnnotation", node, opts);
+ }
+ function assertNumberTypeAnnotation(node, opts) {
+ assert("NumberTypeAnnotation", node, opts);
+ }
+ function assertObjectTypeAnnotation(node, opts) {
+ assert("ObjectTypeAnnotation", node, opts);
+ }
+ function assertObjectTypeInternalSlot(node, opts) {
+ assert("ObjectTypeInternalSlot", node, opts);
+ }
+ function assertObjectTypeCallProperty(node, opts) {
+ assert("ObjectTypeCallProperty", node, opts);
+ }
+ function assertObjectTypeIndexer(node, opts) {
+ assert("ObjectTypeIndexer", node, opts);
+ }
+ function assertObjectTypeProperty(node, opts) {
+ assert("ObjectTypeProperty", node, opts);
+ }
+ function assertObjectTypeSpreadProperty(node, opts) {
+ assert("ObjectTypeSpreadProperty", node, opts);
+ }
+ function assertOpaqueType(node, opts) {
+ assert("OpaqueType", node, opts);
+ }
+ function assertQualifiedTypeIdentifier(node, opts) {
+ assert("QualifiedTypeIdentifier", node, opts);
+ }
+ function assertStringLiteralTypeAnnotation(node, opts) {
+ assert("StringLiteralTypeAnnotation", node, opts);
+ }
+ function assertStringTypeAnnotation(node, opts) {
+ assert("StringTypeAnnotation", node, opts);
+ }
+ function assertSymbolTypeAnnotation(node, opts) {
+ assert("SymbolTypeAnnotation", node, opts);
+ }
+ function assertThisTypeAnnotation(node, opts) {
+ assert("ThisTypeAnnotation", node, opts);
+ }
+ function assertTupleTypeAnnotation(node, opts) {
+ assert("TupleTypeAnnotation", node, opts);
+ }
+ function assertTypeofTypeAnnotation(node, opts) {
+ assert("TypeofTypeAnnotation", node, opts);
+ }
+ function assertTypeAlias(node, opts) {
+ assert("TypeAlias", node, opts);
+ }
+ function assertTypeAnnotation(node, opts) {
+ assert("TypeAnnotation", node, opts);
+ }
+ function assertTypeCastExpression(node, opts) {
+ assert("TypeCastExpression", node, opts);
+ }
+ function assertTypeParameter(node, opts) {
+ assert("TypeParameter", node, opts);
+ }
+ function assertTypeParameterDeclaration(node, opts) {
+ assert("TypeParameterDeclaration", node, opts);
+ }
+ function assertTypeParameterInstantiation(node, opts) {
+ assert("TypeParameterInstantiation", node, opts);
+ }
+ function assertUnionTypeAnnotation(node, opts) {
+ assert("UnionTypeAnnotation", node, opts);
+ }
+ function assertVariance(node, opts) {
+ assert("Variance", node, opts);
+ }
+ function assertVoidTypeAnnotation(node, opts) {
+ assert("VoidTypeAnnotation", node, opts);
+ }
+ function assertEnumDeclaration(node, opts) {
+ assert("EnumDeclaration", node, opts);
+ }
+ function assertEnumBooleanBody(node, opts) {
+ assert("EnumBooleanBody", node, opts);
+ }
+ function assertEnumNumberBody(node, opts) {
+ assert("EnumNumberBody", node, opts);
+ }
+ function assertEnumStringBody(node, opts) {
+ assert("EnumStringBody", node, opts);
+ }
+ function assertEnumSymbolBody(node, opts) {
+ assert("EnumSymbolBody", node, opts);
+ }
+ function assertEnumBooleanMember(node, opts) {
+ assert("EnumBooleanMember", node, opts);
+ }
+ function assertEnumNumberMember(node, opts) {
+ assert("EnumNumberMember", node, opts);
+ }
+ function assertEnumStringMember(node, opts) {
+ assert("EnumStringMember", node, opts);
+ }
+ function assertEnumDefaultedMember(node, opts) {
+ assert("EnumDefaultedMember", node, opts);
+ }
+ function assertIndexedAccessType(node, opts) {
+ assert("IndexedAccessType", node, opts);
+ }
+ function assertOptionalIndexedAccessType(node, opts) {
+ assert("OptionalIndexedAccessType", node, opts);
+ }
+ function assertJSXAttribute(node, opts) {
+ assert("JSXAttribute", node, opts);
+ }
+ function assertJSXClosingElement(node, opts) {
+ assert("JSXClosingElement", node, opts);
+ }
+ function assertJSXElement(node, opts) {
+ assert("JSXElement", node, opts);
+ }
+ function assertJSXEmptyExpression(node, opts) {
+ assert("JSXEmptyExpression", node, opts);
+ }
+ function assertJSXExpressionContainer(node, opts) {
+ assert("JSXExpressionContainer", node, opts);
+ }
+ function assertJSXSpreadChild(node, opts) {
+ assert("JSXSpreadChild", node, opts);
+ }
+ function assertJSXIdentifier(node, opts) {
+ assert("JSXIdentifier", node, opts);
+ }
+ function assertJSXMemberExpression(node, opts) {
+ assert("JSXMemberExpression", node, opts);
+ }
+ function assertJSXNamespacedName(node, opts) {
+ assert("JSXNamespacedName", node, opts);
+ }
+ function assertJSXOpeningElement(node, opts) {
+ assert("JSXOpeningElement", node, opts);
+ }
+ function assertJSXSpreadAttribute(node, opts) {
+ assert("JSXSpreadAttribute", node, opts);
+ }
+ function assertJSXText(node, opts) {
+ assert("JSXText", node, opts);
+ }
+ function assertJSXFragment(node, opts) {
+ assert("JSXFragment", node, opts);
+ }
+ function assertJSXOpeningFragment(node, opts) {
+ assert("JSXOpeningFragment", node, opts);
+ }
+ function assertJSXClosingFragment(node, opts) {
+ assert("JSXClosingFragment", node, opts);
+ }
+ function assertNoop(node, opts) {
+ assert("Noop", node, opts);
+ }
+ function assertPlaceholder(node, opts) {
+ assert("Placeholder", node, opts);
+ }
+ function assertV8IntrinsicIdentifier(node, opts) {
+ assert("V8IntrinsicIdentifier", node, opts);
+ }
+ function assertArgumentPlaceholder(node, opts) {
+ assert("ArgumentPlaceholder", node, opts);
+ }
+ function assertBindExpression(node, opts) {
+ assert("BindExpression", node, opts);
+ }
+ function assertImportAttribute(node, opts) {
+ assert("ImportAttribute", node, opts);
+ }
+ function assertDecorator(node, opts) {
+ assert("Decorator", node, opts);
+ }
+ function assertDoExpression(node, opts) {
+ assert("DoExpression", node, opts);
+ }
+ function assertExportDefaultSpecifier(node, opts) {
+ assert("ExportDefaultSpecifier", node, opts);
+ }
+ function assertRecordExpression(node, opts) {
+ assert("RecordExpression", node, opts);
+ }
+ function assertTupleExpression(node, opts) {
+ assert("TupleExpression", node, opts);
+ }
+ function assertDecimalLiteral(node, opts) {
+ assert("DecimalLiteral", node, opts);
+ }
+ function assertModuleExpression(node, opts) {
+ assert("ModuleExpression", node, opts);
+ }
+ function assertTopicReference(node, opts) {
+ assert("TopicReference", node, opts);
+ }
+ function assertPipelineTopicExpression(node, opts) {
+ assert("PipelineTopicExpression", node, opts);
+ }
+ function assertPipelineBareFunction(node, opts) {
+ assert("PipelineBareFunction", node, opts);
+ }
+ function assertPipelinePrimaryTopicReference(node, opts) {
+ assert("PipelinePrimaryTopicReference", node, opts);
+ }
+ function assertTSParameterProperty(node, opts) {
+ assert("TSParameterProperty", node, opts);
+ }
+ function assertTSDeclareFunction(node, opts) {
+ assert("TSDeclareFunction", node, opts);
+ }
+ function assertTSDeclareMethod(node, opts) {
+ assert("TSDeclareMethod", node, opts);
+ }
+ function assertTSQualifiedName(node, opts) {
+ assert("TSQualifiedName", node, opts);
+ }
+ function assertTSCallSignatureDeclaration(node, opts) {
+ assert("TSCallSignatureDeclaration", node, opts);
+ }
+ function assertTSConstructSignatureDeclaration(node, opts) {
+ assert("TSConstructSignatureDeclaration", node, opts);
+ }
+ function assertTSPropertySignature(node, opts) {
+ assert("TSPropertySignature", node, opts);
+ }
+ function assertTSMethodSignature(node, opts) {
+ assert("TSMethodSignature", node, opts);
+ }
+ function assertTSIndexSignature(node, opts) {
+ assert("TSIndexSignature", node, opts);
+ }
+ function assertTSAnyKeyword(node, opts) {
+ assert("TSAnyKeyword", node, opts);
+ }
+ function assertTSBooleanKeyword(node, opts) {
+ assert("TSBooleanKeyword", node, opts);
+ }
+ function assertTSBigIntKeyword(node, opts) {
+ assert("TSBigIntKeyword", node, opts);
+ }
+ function assertTSIntrinsicKeyword(node, opts) {
+ assert("TSIntrinsicKeyword", node, opts);
+ }
+ function assertTSNeverKeyword(node, opts) {
+ assert("TSNeverKeyword", node, opts);
+ }
+ function assertTSNullKeyword(node, opts) {
+ assert("TSNullKeyword", node, opts);
+ }
+ function assertTSNumberKeyword(node, opts) {
+ assert("TSNumberKeyword", node, opts);
+ }
+ function assertTSObjectKeyword(node, opts) {
+ assert("TSObjectKeyword", node, opts);
+ }
+ function assertTSStringKeyword(node, opts) {
+ assert("TSStringKeyword", node, opts);
+ }
+ function assertTSSymbolKeyword(node, opts) {
+ assert("TSSymbolKeyword", node, opts);
+ }
+ function assertTSUndefinedKeyword(node, opts) {
+ assert("TSUndefinedKeyword", node, opts);
+ }
+ function assertTSUnknownKeyword(node, opts) {
+ assert("TSUnknownKeyword", node, opts);
+ }
+ function assertTSVoidKeyword(node, opts) {
+ assert("TSVoidKeyword", node, opts);
+ }
+ function assertTSThisType(node, opts) {
+ assert("TSThisType", node, opts);
+ }
+ function assertTSFunctionType(node, opts) {
+ assert("TSFunctionType", node, opts);
+ }
+ function assertTSConstructorType(node, opts) {
+ assert("TSConstructorType", node, opts);
+ }
+ function assertTSTypeReference(node, opts) {
+ assert("TSTypeReference", node, opts);
+ }
+ function assertTSTypePredicate(node, opts) {
+ assert("TSTypePredicate", node, opts);
+ }
+ function assertTSTypeQuery(node, opts) {
+ assert("TSTypeQuery", node, opts);
+ }
+ function assertTSTypeLiteral(node, opts) {
+ assert("TSTypeLiteral", node, opts);
+ }
+ function assertTSArrayType(node, opts) {
+ assert("TSArrayType", node, opts);
+ }
+ function assertTSTupleType(node, opts) {
+ assert("TSTupleType", node, opts);
+ }
+ function assertTSOptionalType(node, opts) {
+ assert("TSOptionalType", node, opts);
+ }
+ function assertTSRestType(node, opts) {
+ assert("TSRestType", node, opts);
+ }
+ function assertTSNamedTupleMember(node, opts) {
+ assert("TSNamedTupleMember", node, opts);
+ }
+ function assertTSUnionType(node, opts) {
+ assert("TSUnionType", node, opts);
+ }
+ function assertTSIntersectionType(node, opts) {
+ assert("TSIntersectionType", node, opts);
+ }
+ function assertTSConditionalType(node, opts) {
+ assert("TSConditionalType", node, opts);
+ }
+ function assertTSInferType(node, opts) {
+ assert("TSInferType", node, opts);
+ }
+ function assertTSParenthesizedType(node, opts) {
+ assert("TSParenthesizedType", node, opts);
+ }
+ function assertTSTypeOperator(node, opts) {
+ assert("TSTypeOperator", node, opts);
+ }
+ function assertTSIndexedAccessType(node, opts) {
+ assert("TSIndexedAccessType", node, opts);
+ }
+ function assertTSMappedType(node, opts) {
+ assert("TSMappedType", node, opts);
+ }
+ function assertTSLiteralType(node, opts) {
+ assert("TSLiteralType", node, opts);
+ }
+ function assertTSExpressionWithTypeArguments(node, opts) {
+ assert("TSExpressionWithTypeArguments", node, opts);
+ }
+ function assertTSInterfaceDeclaration(node, opts) {
+ assert("TSInterfaceDeclaration", node, opts);
+ }
+ function assertTSInterfaceBody(node, opts) {
+ assert("TSInterfaceBody", node, opts);
+ }
+ function assertTSTypeAliasDeclaration(node, opts) {
+ assert("TSTypeAliasDeclaration", node, opts);
+ }
+ function assertTSInstantiationExpression(node, opts) {
+ assert("TSInstantiationExpression", node, opts);
+ }
+ function assertTSAsExpression(node, opts) {
+ assert("TSAsExpression", node, opts);
+ }
+ function assertTSSatisfiesExpression(node, opts) {
+ assert("TSSatisfiesExpression", node, opts);
+ }
+ function assertTSTypeAssertion(node, opts) {
+ assert("TSTypeAssertion", node, opts);
+ }
+ function assertTSEnumDeclaration(node, opts) {
+ assert("TSEnumDeclaration", node, opts);
+ }
+ function assertTSEnumMember(node, opts) {
+ assert("TSEnumMember", node, opts);
+ }
+ function assertTSModuleDeclaration(node, opts) {
+ assert("TSModuleDeclaration", node, opts);
+ }
+ function assertTSModuleBlock(node, opts) {
+ assert("TSModuleBlock", node, opts);
+ }
+ function assertTSImportType(node, opts) {
+ assert("TSImportType", node, opts);
+ }
+ function assertTSImportEqualsDeclaration(node, opts) {
+ assert("TSImportEqualsDeclaration", node, opts);
+ }
+ function assertTSExternalModuleReference(node, opts) {
+ assert("TSExternalModuleReference", node, opts);
+ }
+ function assertTSNonNullExpression(node, opts) {
+ assert("TSNonNullExpression", node, opts);
+ }
+ function assertTSExportAssignment(node, opts) {
+ assert("TSExportAssignment", node, opts);
+ }
+ function assertTSNamespaceExportDeclaration(node, opts) {
+ assert("TSNamespaceExportDeclaration", node, opts);
+ }
+ function assertTSTypeAnnotation(node, opts) {
+ assert("TSTypeAnnotation", node, opts);
+ }
+ function assertTSTypeParameterInstantiation(node, opts) {
+ assert("TSTypeParameterInstantiation", node, opts);
+ }
+ function assertTSTypeParameterDeclaration(node, opts) {
+ assert("TSTypeParameterDeclaration", node, opts);
+ }
+ function assertTSTypeParameter(node, opts) {
+ assert("TSTypeParameter", node, opts);
+ }
+ function assertStandardized(node, opts) {
+ assert("Standardized", node, opts);
+ }
+ function assertExpression(node, opts) {
+ assert("Expression", node, opts);
+ }
+ function assertBinary(node, opts) {
+ assert("Binary", node, opts);
+ }
+ function assertScopable(node, opts) {
+ assert("Scopable", node, opts);
+ }
+ function assertBlockParent(node, opts) {
+ assert("BlockParent", node, opts);
+ }
+ function assertBlock(node, opts) {
+ assert("Block", node, opts);
+ }
+ function assertStatement(node, opts) {
+ assert("Statement", node, opts);
+ }
+ function assertTerminatorless(node, opts) {
+ assert("Terminatorless", node, opts);
+ }
+ function assertCompletionStatement(node, opts) {
+ assert("CompletionStatement", node, opts);
+ }
+ function assertConditional(node, opts) {
+ assert("Conditional", node, opts);
+ }
+ function assertLoop(node, opts) {
+ assert("Loop", node, opts);
+ }
+ function assertWhile(node, opts) {
+ assert("While", node, opts);
+ }
+ function assertExpressionWrapper(node, opts) {
+ assert("ExpressionWrapper", node, opts);
+ }
+ function assertFor(node, opts) {
+ assert("For", node, opts);
+ }
+ function assertForXStatement(node, opts) {
+ assert("ForXStatement", node, opts);
+ }
+ function assertFunction(node, opts) {
+ assert("Function", node, opts);
+ }
+ function assertFunctionParent(node, opts) {
+ assert("FunctionParent", node, opts);
+ }
+ function assertPureish(node, opts) {
+ assert("Pureish", node, opts);
+ }
+ function assertDeclaration(node, opts) {
+ assert("Declaration", node, opts);
+ }
+ function assertPatternLike(node, opts) {
+ assert("PatternLike", node, opts);
+ }
+ function assertLVal(node, opts) {
+ assert("LVal", node, opts);
+ }
+ function assertTSEntityName(node, opts) {
+ assert("TSEntityName", node, opts);
+ }
+ function assertLiteral(node, opts) {
+ assert("Literal", node, opts);
+ }
+ function assertImmutable(node, opts) {
+ assert("Immutable", node, opts);
+ }
+ function assertUserWhitespacable(node, opts) {
+ assert("UserWhitespacable", node, opts);
+ }
+ function assertMethod(node, opts) {
+ assert("Method", node, opts);
+ }
+ function assertObjectMember(node, opts) {
+ assert("ObjectMember", node, opts);
+ }
+ function assertProperty(node, opts) {
+ assert("Property", node, opts);
+ }
+ function assertUnaryLike(node, opts) {
+ assert("UnaryLike", node, opts);
+ }
+ function assertPattern(node, opts) {
+ assert("Pattern", node, opts);
+ }
+ function assertClass(node, opts) {
+ assert("Class", node, opts);
+ }
+ function assertImportOrExportDeclaration(node, opts) {
+ assert("ImportOrExportDeclaration", node, opts);
+ }
+ function assertExportDeclaration(node, opts) {
+ assert("ExportDeclaration", node, opts);
+ }
+ function assertModuleSpecifier(node, opts) {
+ assert("ModuleSpecifier", node, opts);
+ }
+ function assertAccessor(node, opts) {
+ assert("Accessor", node, opts);
+ }
+ function assertPrivate(node, opts) {
+ assert("Private", node, opts);
+ }
+ function assertFlow(node, opts) {
+ assert("Flow", node, opts);
+ }
+ function assertFlowType(node, opts) {
+ assert("FlowType", node, opts);
+ }
+ function assertFlowBaseAnnotation(node, opts) {
+ assert("FlowBaseAnnotation", node, opts);
+ }
+ function assertFlowDeclaration(node, opts) {
+ assert("FlowDeclaration", node, opts);
+ }
+ function assertFlowPredicate(node, opts) {
+ assert("FlowPredicate", node, opts);
+ }
+ function assertEnumBody(node, opts) {
+ assert("EnumBody", node, opts);
+ }
+ function assertEnumMember(node, opts) {
+ assert("EnumMember", node, opts);
+ }
+ function assertJSX(node, opts) {
+ assert("JSX", node, opts);
+ }
+ function assertMiscellaneous(node, opts) {
+ assert("Miscellaneous", node, opts);
+ }
+ function assertTypeScript(node, opts) {
+ assert("TypeScript", node, opts);
+ }
+ function assertTSTypeElement(node, opts) {
+ assert("TSTypeElement", node, opts);
+ }
+ function assertTSType(node, opts) {
+ assert("TSType", node, opts);
+ }
+ function assertTSBaseType(node, opts) {
+ assert("TSBaseType", node, opts);
+ }
+ function assertNumberLiteral(node, opts) {
+ (0, _deprecationWarning.default)("assertNumberLiteral", "assertNumericLiteral");
+ assert("NumberLiteral", node, opts);
+ }
+ function assertRegexLiteral(node, opts) {
+ (0, _deprecationWarning.default)("assertRegexLiteral", "assertRegExpLiteral");
+ assert("RegexLiteral", node, opts);
+ }
+ function assertRestProperty(node, opts) {
+ (0, _deprecationWarning.default)("assertRestProperty", "assertRestElement");
+ assert("RestProperty", node, opts);
+ }
+ function assertSpreadProperty(node, opts) {
+ (0, _deprecationWarning.default)("assertSpreadProperty", "assertSpreadElement");
+ assert("SpreadProperty", node, opts);
+ }
+ function assertModuleDeclaration(node, opts) {
+ (0, _deprecationWarning.default)("assertModuleDeclaration", "assertImportOrExportDeclaration");
+ assert("ModuleDeclaration", node, opts);
+ }
+
+
+ return generated$1;
+ }
+
+ var createTypeAnnotationBasedOnTypeof = {};
+
+ var hasRequiredCreateTypeAnnotationBasedOnTypeof;
+
+ function requireCreateTypeAnnotationBasedOnTypeof () {
+ if (hasRequiredCreateTypeAnnotationBasedOnTypeof) return createTypeAnnotationBasedOnTypeof;
+ hasRequiredCreateTypeAnnotationBasedOnTypeof = 1;
+
+ Object.defineProperty(createTypeAnnotationBasedOnTypeof, "__esModule", {
+ value: true
+ });
+ createTypeAnnotationBasedOnTypeof.default = void 0;
+ var _index = requireGenerated$2();
+ var _default = createTypeAnnotationBasedOnTypeof$1;
+ createTypeAnnotationBasedOnTypeof.default = _default;
+ function createTypeAnnotationBasedOnTypeof$1(type) {
+ switch (type) {
+ case "string":
+ return (0, _index.stringTypeAnnotation)();
+ case "number":
+ return (0, _index.numberTypeAnnotation)();
+ case "undefined":
+ return (0, _index.voidTypeAnnotation)();
+ case "boolean":
+ return (0, _index.booleanTypeAnnotation)();
+ case "function":
+ return (0, _index.genericTypeAnnotation)((0, _index.identifier)("Function"));
+ case "object":
+ return (0, _index.genericTypeAnnotation)((0, _index.identifier)("Object"));
+ case "symbol":
+ return (0, _index.genericTypeAnnotation)((0, _index.identifier)("Symbol"));
+ case "bigint":
+ return (0, _index.anyTypeAnnotation)();
+ }
+ throw new Error("Invalid typeof value: " + type);
+ }
+
+
+ return createTypeAnnotationBasedOnTypeof;
+ }
+
+ var createFlowUnionType = {};
+
+ var removeTypeDuplicates$1 = {};
+
+ var hasRequiredRemoveTypeDuplicates$1;
+
+ function requireRemoveTypeDuplicates$1 () {
+ if (hasRequiredRemoveTypeDuplicates$1) return removeTypeDuplicates$1;
+ hasRequiredRemoveTypeDuplicates$1 = 1;
+
+ Object.defineProperty(removeTypeDuplicates$1, "__esModule", {
+ value: true
+ });
+ removeTypeDuplicates$1.default = removeTypeDuplicates;
+ var _index = requireGenerated$3();
+ function getQualifiedName(node) {
+ return (0, _index.isIdentifier)(node) ? node.name : `${node.id.name}.${getQualifiedName(node.qualification)}`;
+ }
+ function removeTypeDuplicates(nodesIn) {
+ const nodes = Array.from(nodesIn);
+ const generics = new Map();
+ const bases = new Map();
+ const typeGroups = new Set();
+ const types = [];
+ for (let i = 0; i < nodes.length; i++) {
+ const node = nodes[i];
+ if (!node) continue;
+ if (types.indexOf(node) >= 0) {
+ continue;
+ }
+ if ((0, _index.isAnyTypeAnnotation)(node)) {
+ return [node];
+ }
+ if ((0, _index.isFlowBaseAnnotation)(node)) {
+ bases.set(node.type, node);
+ continue;
+ }
+ if ((0, _index.isUnionTypeAnnotation)(node)) {
+ if (!typeGroups.has(node.types)) {
+ nodes.push(...node.types);
+ typeGroups.add(node.types);
+ }
+ continue;
+ }
+ if ((0, _index.isGenericTypeAnnotation)(node)) {
+ const name = getQualifiedName(node.id);
+ if (generics.has(name)) {
+ let existing = generics.get(name);
+ if (existing.typeParameters) {
+ if (node.typeParameters) {
+ existing.typeParameters.params.push(...node.typeParameters.params);
+ existing.typeParameters.params = removeTypeDuplicates(existing.typeParameters.params);
+ }
+ } else {
+ existing = node.typeParameters;
+ }
+ } else {
+ generics.set(name, node);
+ }
+ continue;
+ }
+ types.push(node);
+ }
+ for (const [, baseType] of bases) {
+ types.push(baseType);
+ }
+ for (const [, genericName] of generics) {
+ types.push(genericName);
+ }
+ return types;
+ }
+
+
+ return removeTypeDuplicates$1;
+ }
+
+ var hasRequiredCreateFlowUnionType;
+
+ function requireCreateFlowUnionType () {
+ if (hasRequiredCreateFlowUnionType) return createFlowUnionType;
+ hasRequiredCreateFlowUnionType = 1;
+
+ Object.defineProperty(createFlowUnionType, "__esModule", {
+ value: true
+ });
+ createFlowUnionType.default = createFlowUnionType$1;
+ var _index = requireGenerated$2();
+ var _removeTypeDuplicates = requireRemoveTypeDuplicates$1();
+ function createFlowUnionType$1(types) {
+ const flattened = (0, _removeTypeDuplicates.default)(types);
+ if (flattened.length === 1) {
+ return flattened[0];
+ } else {
+ return (0, _index.unionTypeAnnotation)(flattened);
+ }
+ }
+
+
+ return createFlowUnionType;
+ }
+
+ var createTSUnionType = {};
+
+ var removeTypeDuplicates = {};
+
+ var hasRequiredRemoveTypeDuplicates;
+
+ function requireRemoveTypeDuplicates () {
+ if (hasRequiredRemoveTypeDuplicates) return removeTypeDuplicates;
+ hasRequiredRemoveTypeDuplicates = 1;
+
+ Object.defineProperty(removeTypeDuplicates, "__esModule", {
+ value: true
+ });
+ removeTypeDuplicates.default = removeTypeDuplicates$1;
+ var _index = requireGenerated$3();
+ function getQualifiedName(node) {
+ return (0, _index.isIdentifier)(node) ? node.name : `${node.right.name}.${getQualifiedName(node.left)}`;
+ }
+ function removeTypeDuplicates$1(nodesIn) {
+ const nodes = Array.from(nodesIn);
+ const generics = new Map();
+ const bases = new Map();
+ const typeGroups = new Set();
+ const types = [];
+ for (let i = 0; i < nodes.length; i++) {
+ const node = nodes[i];
+ if (!node) continue;
+ if (types.indexOf(node) >= 0) {
+ continue;
+ }
+ if ((0, _index.isTSAnyKeyword)(node)) {
+ return [node];
+ }
+ if ((0, _index.isTSBaseType)(node)) {
+ bases.set(node.type, node);
+ continue;
+ }
+ if ((0, _index.isTSUnionType)(node)) {
+ if (!typeGroups.has(node.types)) {
+ nodes.push(...node.types);
+ typeGroups.add(node.types);
+ }
+ continue;
+ }
+ if ((0, _index.isTSTypeReference)(node) && node.typeParameters) {
+ const name = getQualifiedName(node.typeName);
+ if (generics.has(name)) {
+ let existing = generics.get(name);
+ if (existing.typeParameters) {
+ if (node.typeParameters) {
+ existing.typeParameters.params.push(...node.typeParameters.params);
+ existing.typeParameters.params = removeTypeDuplicates$1(existing.typeParameters.params);
+ }
+ } else {
+ existing = node.typeParameters;
+ }
+ } else {
+ generics.set(name, node);
+ }
+ continue;
+ }
+ types.push(node);
+ }
+ for (const [, baseType] of bases) {
+ types.push(baseType);
+ }
+ for (const [, genericName] of generics) {
+ types.push(genericName);
+ }
+ return types;
+ }
+
+
+ return removeTypeDuplicates;
+ }
+
+ var hasRequiredCreateTSUnionType;
+
+ function requireCreateTSUnionType () {
+ if (hasRequiredCreateTSUnionType) return createTSUnionType;
+ hasRequiredCreateTSUnionType = 1;
+
+ Object.defineProperty(createTSUnionType, "__esModule", {
+ value: true
+ });
+ createTSUnionType.default = createTSUnionType$1;
+ var _index = requireGenerated$2();
+ var _removeTypeDuplicates = requireRemoveTypeDuplicates();
+ var _index2 = requireGenerated$3();
+ function createTSUnionType$1(typeAnnotations) {
+ const types = typeAnnotations.map(type => {
+ return (0, _index2.isTSTypeAnnotation)(type) ? type.typeAnnotation : type;
+ });
+ const flattened = (0, _removeTypeDuplicates.default)(types);
+ if (flattened.length === 1) {
+ return flattened[0];
+ } else {
+ return (0, _index.tsUnionType)(flattened);
+ }
+ }
+
+
+ return createTSUnionType;
+ }
+
+ var uppercase = {};
+
+ var hasRequiredUppercase;
+
+ function requireUppercase () {
+ if (hasRequiredUppercase) return uppercase;
+ hasRequiredUppercase = 1;
+ (function (exports) {
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ Object.defineProperty(exports, "AnyTypeAnnotation", {
+ enumerable: true,
+ get: function () {
+ return _index.anyTypeAnnotation;
+ }
+ });
+ Object.defineProperty(exports, "ArgumentPlaceholder", {
+ enumerable: true,
+ get: function () {
+ return _index.argumentPlaceholder;
+ }
+ });
+ Object.defineProperty(exports, "ArrayExpression", {
+ enumerable: true,
+ get: function () {
+ return _index.arrayExpression;
+ }
+ });
+ Object.defineProperty(exports, "ArrayPattern", {
+ enumerable: true,
+ get: function () {
+ return _index.arrayPattern;
+ }
+ });
+ Object.defineProperty(exports, "ArrayTypeAnnotation", {
+ enumerable: true,
+ get: function () {
+ return _index.arrayTypeAnnotation;
+ }
+ });
+ Object.defineProperty(exports, "ArrowFunctionExpression", {
+ enumerable: true,
+ get: function () {
+ return _index.arrowFunctionExpression;
+ }
+ });
+ Object.defineProperty(exports, "AssignmentExpression", {
+ enumerable: true,
+ get: function () {
+ return _index.assignmentExpression;
+ }
+ });
+ Object.defineProperty(exports, "AssignmentPattern", {
+ enumerable: true,
+ get: function () {
+ return _index.assignmentPattern;
+ }
+ });
+ Object.defineProperty(exports, "AwaitExpression", {
+ enumerable: true,
+ get: function () {
+ return _index.awaitExpression;
+ }
+ });
+ Object.defineProperty(exports, "BigIntLiteral", {
+ enumerable: true,
+ get: function () {
+ return _index.bigIntLiteral;
+ }
+ });
+ Object.defineProperty(exports, "BinaryExpression", {
+ enumerable: true,
+ get: function () {
+ return _index.binaryExpression;
+ }
+ });
+ Object.defineProperty(exports, "BindExpression", {
+ enumerable: true,
+ get: function () {
+ return _index.bindExpression;
+ }
+ });
+ Object.defineProperty(exports, "BlockStatement", {
+ enumerable: true,
+ get: function () {
+ return _index.blockStatement;
+ }
+ });
+ Object.defineProperty(exports, "BooleanLiteral", {
+ enumerable: true,
+ get: function () {
+ return _index.booleanLiteral;
+ }
+ });
+ Object.defineProperty(exports, "BooleanLiteralTypeAnnotation", {
+ enumerable: true,
+ get: function () {
+ return _index.booleanLiteralTypeAnnotation;
+ }
+ });
+ Object.defineProperty(exports, "BooleanTypeAnnotation", {
+ enumerable: true,
+ get: function () {
+ return _index.booleanTypeAnnotation;
+ }
+ });
+ Object.defineProperty(exports, "BreakStatement", {
+ enumerable: true,
+ get: function () {
+ return _index.breakStatement;
+ }
+ });
+ Object.defineProperty(exports, "CallExpression", {
+ enumerable: true,
+ get: function () {
+ return _index.callExpression;
+ }
+ });
+ Object.defineProperty(exports, "CatchClause", {
+ enumerable: true,
+ get: function () {
+ return _index.catchClause;
+ }
+ });
+ Object.defineProperty(exports, "ClassAccessorProperty", {
+ enumerable: true,
+ get: function () {
+ return _index.classAccessorProperty;
+ }
+ });
+ Object.defineProperty(exports, "ClassBody", {
+ enumerable: true,
+ get: function () {
+ return _index.classBody;
+ }
+ });
+ Object.defineProperty(exports, "ClassDeclaration", {
+ enumerable: true,
+ get: function () {
+ return _index.classDeclaration;
+ }
+ });
+ Object.defineProperty(exports, "ClassExpression", {
+ enumerable: true,
+ get: function () {
+ return _index.classExpression;
+ }
+ });
+ Object.defineProperty(exports, "ClassImplements", {
+ enumerable: true,
+ get: function () {
+ return _index.classImplements;
+ }
+ });
+ Object.defineProperty(exports, "ClassMethod", {
+ enumerable: true,
+ get: function () {
+ return _index.classMethod;
+ }
+ });
+ Object.defineProperty(exports, "ClassPrivateMethod", {
+ enumerable: true,
+ get: function () {
+ return _index.classPrivateMethod;
+ }
+ });
+ Object.defineProperty(exports, "ClassPrivateProperty", {
+ enumerable: true,
+ get: function () {
+ return _index.classPrivateProperty;
+ }
+ });
+ Object.defineProperty(exports, "ClassProperty", {
+ enumerable: true,
+ get: function () {
+ return _index.classProperty;
+ }
+ });
+ Object.defineProperty(exports, "ConditionalExpression", {
+ enumerable: true,
+ get: function () {
+ return _index.conditionalExpression;
+ }
+ });
+ Object.defineProperty(exports, "ContinueStatement", {
+ enumerable: true,
+ get: function () {
+ return _index.continueStatement;
+ }
+ });
+ Object.defineProperty(exports, "DebuggerStatement", {
+ enumerable: true,
+ get: function () {
+ return _index.debuggerStatement;
+ }
+ });
+ Object.defineProperty(exports, "DecimalLiteral", {
+ enumerable: true,
+ get: function () {
+ return _index.decimalLiteral;
+ }
+ });
+ Object.defineProperty(exports, "DeclareClass", {
+ enumerable: true,
+ get: function () {
+ return _index.declareClass;
+ }
+ });
+ Object.defineProperty(exports, "DeclareExportAllDeclaration", {
+ enumerable: true,
+ get: function () {
+ return _index.declareExportAllDeclaration;
+ }
+ });
+ Object.defineProperty(exports, "DeclareExportDeclaration", {
+ enumerable: true,
+ get: function () {
+ return _index.declareExportDeclaration;
+ }
+ });
+ Object.defineProperty(exports, "DeclareFunction", {
+ enumerable: true,
+ get: function () {
+ return _index.declareFunction;
+ }
+ });
+ Object.defineProperty(exports, "DeclareInterface", {
+ enumerable: true,
+ get: function () {
+ return _index.declareInterface;
+ }
+ });
+ Object.defineProperty(exports, "DeclareModule", {
+ enumerable: true,
+ get: function () {
+ return _index.declareModule;
+ }
+ });
+ Object.defineProperty(exports, "DeclareModuleExports", {
+ enumerable: true,
+ get: function () {
+ return _index.declareModuleExports;
+ }
+ });
+ Object.defineProperty(exports, "DeclareOpaqueType", {
+ enumerable: true,
+ get: function () {
+ return _index.declareOpaqueType;
+ }
+ });
+ Object.defineProperty(exports, "DeclareTypeAlias", {
+ enumerable: true,
+ get: function () {
+ return _index.declareTypeAlias;
+ }
+ });
+ Object.defineProperty(exports, "DeclareVariable", {
+ enumerable: true,
+ get: function () {
+ return _index.declareVariable;
+ }
+ });
+ Object.defineProperty(exports, "DeclaredPredicate", {
+ enumerable: true,
+ get: function () {
+ return _index.declaredPredicate;
+ }
+ });
+ Object.defineProperty(exports, "Decorator", {
+ enumerable: true,
+ get: function () {
+ return _index.decorator;
+ }
+ });
+ Object.defineProperty(exports, "Directive", {
+ enumerable: true,
+ get: function () {
+ return _index.directive;
+ }
+ });
+ Object.defineProperty(exports, "DirectiveLiteral", {
+ enumerable: true,
+ get: function () {
+ return _index.directiveLiteral;
+ }
+ });
+ Object.defineProperty(exports, "DoExpression", {
+ enumerable: true,
+ get: function () {
+ return _index.doExpression;
+ }
+ });
+ Object.defineProperty(exports, "DoWhileStatement", {
+ enumerable: true,
+ get: function () {
+ return _index.doWhileStatement;
+ }
+ });
+ Object.defineProperty(exports, "EmptyStatement", {
+ enumerable: true,
+ get: function () {
+ return _index.emptyStatement;
+ }
+ });
+ Object.defineProperty(exports, "EmptyTypeAnnotation", {
+ enumerable: true,
+ get: function () {
+ return _index.emptyTypeAnnotation;
+ }
+ });
+ Object.defineProperty(exports, "EnumBooleanBody", {
+ enumerable: true,
+ get: function () {
+ return _index.enumBooleanBody;
+ }
+ });
+ Object.defineProperty(exports, "EnumBooleanMember", {
+ enumerable: true,
+ get: function () {
+ return _index.enumBooleanMember;
+ }
+ });
+ Object.defineProperty(exports, "EnumDeclaration", {
+ enumerable: true,
+ get: function () {
+ return _index.enumDeclaration;
+ }
+ });
+ Object.defineProperty(exports, "EnumDefaultedMember", {
+ enumerable: true,
+ get: function () {
+ return _index.enumDefaultedMember;
+ }
+ });
+ Object.defineProperty(exports, "EnumNumberBody", {
+ enumerable: true,
+ get: function () {
+ return _index.enumNumberBody;
+ }
+ });
+ Object.defineProperty(exports, "EnumNumberMember", {
+ enumerable: true,
+ get: function () {
+ return _index.enumNumberMember;
+ }
+ });
+ Object.defineProperty(exports, "EnumStringBody", {
+ enumerable: true,
+ get: function () {
+ return _index.enumStringBody;
+ }
+ });
+ Object.defineProperty(exports, "EnumStringMember", {
+ enumerable: true,
+ get: function () {
+ return _index.enumStringMember;
+ }
+ });
+ Object.defineProperty(exports, "EnumSymbolBody", {
+ enumerable: true,
+ get: function () {
+ return _index.enumSymbolBody;
+ }
+ });
+ Object.defineProperty(exports, "ExistsTypeAnnotation", {
+ enumerable: true,
+ get: function () {
+ return _index.existsTypeAnnotation;
+ }
+ });
+ Object.defineProperty(exports, "ExportAllDeclaration", {
+ enumerable: true,
+ get: function () {
+ return _index.exportAllDeclaration;
+ }
+ });
+ Object.defineProperty(exports, "ExportDefaultDeclaration", {
+ enumerable: true,
+ get: function () {
+ return _index.exportDefaultDeclaration;
+ }
+ });
+ Object.defineProperty(exports, "ExportDefaultSpecifier", {
+ enumerable: true,
+ get: function () {
+ return _index.exportDefaultSpecifier;
+ }
+ });
+ Object.defineProperty(exports, "ExportNamedDeclaration", {
+ enumerable: true,
+ get: function () {
+ return _index.exportNamedDeclaration;
+ }
+ });
+ Object.defineProperty(exports, "ExportNamespaceSpecifier", {
+ enumerable: true,
+ get: function () {
+ return _index.exportNamespaceSpecifier;
+ }
+ });
+ Object.defineProperty(exports, "ExportSpecifier", {
+ enumerable: true,
+ get: function () {
+ return _index.exportSpecifier;
+ }
+ });
+ Object.defineProperty(exports, "ExpressionStatement", {
+ enumerable: true,
+ get: function () {
+ return _index.expressionStatement;
+ }
+ });
+ Object.defineProperty(exports, "File", {
+ enumerable: true,
+ get: function () {
+ return _index.file;
+ }
+ });
+ Object.defineProperty(exports, "ForInStatement", {
+ enumerable: true,
+ get: function () {
+ return _index.forInStatement;
+ }
+ });
+ Object.defineProperty(exports, "ForOfStatement", {
+ enumerable: true,
+ get: function () {
+ return _index.forOfStatement;
+ }
+ });
+ Object.defineProperty(exports, "ForStatement", {
+ enumerable: true,
+ get: function () {
+ return _index.forStatement;
+ }
+ });
+ Object.defineProperty(exports, "FunctionDeclaration", {
+ enumerable: true,
+ get: function () {
+ return _index.functionDeclaration;
+ }
+ });
+ Object.defineProperty(exports, "FunctionExpression", {
+ enumerable: true,
+ get: function () {
+ return _index.functionExpression;
+ }
+ });
+ Object.defineProperty(exports, "FunctionTypeAnnotation", {
+ enumerable: true,
+ get: function () {
+ return _index.functionTypeAnnotation;
+ }
+ });
+ Object.defineProperty(exports, "FunctionTypeParam", {
+ enumerable: true,
+ get: function () {
+ return _index.functionTypeParam;
+ }
+ });
+ Object.defineProperty(exports, "GenericTypeAnnotation", {
+ enumerable: true,
+ get: function () {
+ return _index.genericTypeAnnotation;
+ }
+ });
+ Object.defineProperty(exports, "Identifier", {
+ enumerable: true,
+ get: function () {
+ return _index.identifier;
+ }
+ });
+ Object.defineProperty(exports, "IfStatement", {
+ enumerable: true,
+ get: function () {
+ return _index.ifStatement;
+ }
+ });
+ Object.defineProperty(exports, "Import", {
+ enumerable: true,
+ get: function () {
+ return _index.import;
+ }
+ });
+ Object.defineProperty(exports, "ImportAttribute", {
+ enumerable: true,
+ get: function () {
+ return _index.importAttribute;
+ }
+ });
+ Object.defineProperty(exports, "ImportDeclaration", {
+ enumerable: true,
+ get: function () {
+ return _index.importDeclaration;
+ }
+ });
+ Object.defineProperty(exports, "ImportDefaultSpecifier", {
+ enumerable: true,
+ get: function () {
+ return _index.importDefaultSpecifier;
+ }
+ });
+ Object.defineProperty(exports, "ImportExpression", {
+ enumerable: true,
+ get: function () {
+ return _index.importExpression;
+ }
+ });
+ Object.defineProperty(exports, "ImportNamespaceSpecifier", {
+ enumerable: true,
+ get: function () {
+ return _index.importNamespaceSpecifier;
+ }
+ });
+ Object.defineProperty(exports, "ImportSpecifier", {
+ enumerable: true,
+ get: function () {
+ return _index.importSpecifier;
+ }
+ });
+ Object.defineProperty(exports, "IndexedAccessType", {
+ enumerable: true,
+ get: function () {
+ return _index.indexedAccessType;
+ }
+ });
+ Object.defineProperty(exports, "InferredPredicate", {
+ enumerable: true,
+ get: function () {
+ return _index.inferredPredicate;
+ }
+ });
+ Object.defineProperty(exports, "InterfaceDeclaration", {
+ enumerable: true,
+ get: function () {
+ return _index.interfaceDeclaration;
+ }
+ });
+ Object.defineProperty(exports, "InterfaceExtends", {
+ enumerable: true,
+ get: function () {
+ return _index.interfaceExtends;
+ }
+ });
+ Object.defineProperty(exports, "InterfaceTypeAnnotation", {
+ enumerable: true,
+ get: function () {
+ return _index.interfaceTypeAnnotation;
+ }
+ });
+ Object.defineProperty(exports, "InterpreterDirective", {
+ enumerable: true,
+ get: function () {
+ return _index.interpreterDirective;
+ }
+ });
+ Object.defineProperty(exports, "IntersectionTypeAnnotation", {
+ enumerable: true,
+ get: function () {
+ return _index.intersectionTypeAnnotation;
+ }
+ });
+ Object.defineProperty(exports, "JSXAttribute", {
+ enumerable: true,
+ get: function () {
+ return _index.jsxAttribute;
+ }
+ });
+ Object.defineProperty(exports, "JSXClosingElement", {
+ enumerable: true,
+ get: function () {
+ return _index.jsxClosingElement;
+ }
+ });
+ Object.defineProperty(exports, "JSXClosingFragment", {
+ enumerable: true,
+ get: function () {
+ return _index.jsxClosingFragment;
+ }
+ });
+ Object.defineProperty(exports, "JSXElement", {
+ enumerable: true,
+ get: function () {
+ return _index.jsxElement;
+ }
+ });
+ Object.defineProperty(exports, "JSXEmptyExpression", {
+ enumerable: true,
+ get: function () {
+ return _index.jsxEmptyExpression;
+ }
+ });
+ Object.defineProperty(exports, "JSXExpressionContainer", {
+ enumerable: true,
+ get: function () {
+ return _index.jsxExpressionContainer;
+ }
+ });
+ Object.defineProperty(exports, "JSXFragment", {
+ enumerable: true,
+ get: function () {
+ return _index.jsxFragment;
+ }
+ });
+ Object.defineProperty(exports, "JSXIdentifier", {
+ enumerable: true,
+ get: function () {
+ return _index.jsxIdentifier;
+ }
+ });
+ Object.defineProperty(exports, "JSXMemberExpression", {
+ enumerable: true,
+ get: function () {
+ return _index.jsxMemberExpression;
+ }
+ });
+ Object.defineProperty(exports, "JSXNamespacedName", {
+ enumerable: true,
+ get: function () {
+ return _index.jsxNamespacedName;
+ }
+ });
+ Object.defineProperty(exports, "JSXOpeningElement", {
+ enumerable: true,
+ get: function () {
+ return _index.jsxOpeningElement;
+ }
+ });
+ Object.defineProperty(exports, "JSXOpeningFragment", {
+ enumerable: true,
+ get: function () {
+ return _index.jsxOpeningFragment;
+ }
+ });
+ Object.defineProperty(exports, "JSXSpreadAttribute", {
+ enumerable: true,
+ get: function () {
+ return _index.jsxSpreadAttribute;
+ }
+ });
+ Object.defineProperty(exports, "JSXSpreadChild", {
+ enumerable: true,
+ get: function () {
+ return _index.jsxSpreadChild;
+ }
+ });
+ Object.defineProperty(exports, "JSXText", {
+ enumerable: true,
+ get: function () {
+ return _index.jsxText;
+ }
+ });
+ Object.defineProperty(exports, "LabeledStatement", {
+ enumerable: true,
+ get: function () {
+ return _index.labeledStatement;
+ }
+ });
+ Object.defineProperty(exports, "LogicalExpression", {
+ enumerable: true,
+ get: function () {
+ return _index.logicalExpression;
+ }
+ });
+ Object.defineProperty(exports, "MemberExpression", {
+ enumerable: true,
+ get: function () {
+ return _index.memberExpression;
+ }
+ });
+ Object.defineProperty(exports, "MetaProperty", {
+ enumerable: true,
+ get: function () {
+ return _index.metaProperty;
+ }
+ });
+ Object.defineProperty(exports, "MixedTypeAnnotation", {
+ enumerable: true,
+ get: function () {
+ return _index.mixedTypeAnnotation;
+ }
+ });
+ Object.defineProperty(exports, "ModuleExpression", {
+ enumerable: true,
+ get: function () {
+ return _index.moduleExpression;
+ }
+ });
+ Object.defineProperty(exports, "NewExpression", {
+ enumerable: true,
+ get: function () {
+ return _index.newExpression;
+ }
+ });
+ Object.defineProperty(exports, "Noop", {
+ enumerable: true,
+ get: function () {
+ return _index.noop;
+ }
+ });
+ Object.defineProperty(exports, "NullLiteral", {
+ enumerable: true,
+ get: function () {
+ return _index.nullLiteral;
+ }
+ });
+ Object.defineProperty(exports, "NullLiteralTypeAnnotation", {
+ enumerable: true,
+ get: function () {
+ return _index.nullLiteralTypeAnnotation;
+ }
+ });
+ Object.defineProperty(exports, "NullableTypeAnnotation", {
+ enumerable: true,
+ get: function () {
+ return _index.nullableTypeAnnotation;
+ }
+ });
+ Object.defineProperty(exports, "NumberLiteral", {
+ enumerable: true,
+ get: function () {
+ return _index.numberLiteral;
+ }
+ });
+ Object.defineProperty(exports, "NumberLiteralTypeAnnotation", {
+ enumerable: true,
+ get: function () {
+ return _index.numberLiteralTypeAnnotation;
+ }
+ });
+ Object.defineProperty(exports, "NumberTypeAnnotation", {
+ enumerable: true,
+ get: function () {
+ return _index.numberTypeAnnotation;
+ }
+ });
+ Object.defineProperty(exports, "NumericLiteral", {
+ enumerable: true,
+ get: function () {
+ return _index.numericLiteral;
+ }
+ });
+ Object.defineProperty(exports, "ObjectExpression", {
+ enumerable: true,
+ get: function () {
+ return _index.objectExpression;
+ }
+ });
+ Object.defineProperty(exports, "ObjectMethod", {
+ enumerable: true,
+ get: function () {
+ return _index.objectMethod;
+ }
+ });
+ Object.defineProperty(exports, "ObjectPattern", {
+ enumerable: true,
+ get: function () {
+ return _index.objectPattern;
+ }
+ });
+ Object.defineProperty(exports, "ObjectProperty", {
+ enumerable: true,
+ get: function () {
+ return _index.objectProperty;
+ }
+ });
+ Object.defineProperty(exports, "ObjectTypeAnnotation", {
+ enumerable: true,
+ get: function () {
+ return _index.objectTypeAnnotation;
+ }
+ });
+ Object.defineProperty(exports, "ObjectTypeCallProperty", {
+ enumerable: true,
+ get: function () {
+ return _index.objectTypeCallProperty;
+ }
+ });
+ Object.defineProperty(exports, "ObjectTypeIndexer", {
+ enumerable: true,
+ get: function () {
+ return _index.objectTypeIndexer;
+ }
+ });
+ Object.defineProperty(exports, "ObjectTypeInternalSlot", {
+ enumerable: true,
+ get: function () {
+ return _index.objectTypeInternalSlot;
+ }
+ });
+ Object.defineProperty(exports, "ObjectTypeProperty", {
+ enumerable: true,
+ get: function () {
+ return _index.objectTypeProperty;
+ }
+ });
+ Object.defineProperty(exports, "ObjectTypeSpreadProperty", {
+ enumerable: true,
+ get: function () {
+ return _index.objectTypeSpreadProperty;
+ }
+ });
+ Object.defineProperty(exports, "OpaqueType", {
+ enumerable: true,
+ get: function () {
+ return _index.opaqueType;
+ }
+ });
+ Object.defineProperty(exports, "OptionalCallExpression", {
+ enumerable: true,
+ get: function () {
+ return _index.optionalCallExpression;
+ }
+ });
+ Object.defineProperty(exports, "OptionalIndexedAccessType", {
+ enumerable: true,
+ get: function () {
+ return _index.optionalIndexedAccessType;
+ }
+ });
+ Object.defineProperty(exports, "OptionalMemberExpression", {
+ enumerable: true,
+ get: function () {
+ return _index.optionalMemberExpression;
+ }
+ });
+ Object.defineProperty(exports, "ParenthesizedExpression", {
+ enumerable: true,
+ get: function () {
+ return _index.parenthesizedExpression;
+ }
+ });
+ Object.defineProperty(exports, "PipelineBareFunction", {
+ enumerable: true,
+ get: function () {
+ return _index.pipelineBareFunction;
+ }
+ });
+ Object.defineProperty(exports, "PipelinePrimaryTopicReference", {
+ enumerable: true,
+ get: function () {
+ return _index.pipelinePrimaryTopicReference;
+ }
+ });
+ Object.defineProperty(exports, "PipelineTopicExpression", {
+ enumerable: true,
+ get: function () {
+ return _index.pipelineTopicExpression;
+ }
+ });
+ Object.defineProperty(exports, "Placeholder", {
+ enumerable: true,
+ get: function () {
+ return _index.placeholder;
+ }
+ });
+ Object.defineProperty(exports, "PrivateName", {
+ enumerable: true,
+ get: function () {
+ return _index.privateName;
+ }
+ });
+ Object.defineProperty(exports, "Program", {
+ enumerable: true,
+ get: function () {
+ return _index.program;
+ }
+ });
+ Object.defineProperty(exports, "QualifiedTypeIdentifier", {
+ enumerable: true,
+ get: function () {
+ return _index.qualifiedTypeIdentifier;
+ }
+ });
+ Object.defineProperty(exports, "RecordExpression", {
+ enumerable: true,
+ get: function () {
+ return _index.recordExpression;
+ }
+ });
+ Object.defineProperty(exports, "RegExpLiteral", {
+ enumerable: true,
+ get: function () {
+ return _index.regExpLiteral;
+ }
+ });
+ Object.defineProperty(exports, "RegexLiteral", {
+ enumerable: true,
+ get: function () {
+ return _index.regexLiteral;
+ }
+ });
+ Object.defineProperty(exports, "RestElement", {
+ enumerable: true,
+ get: function () {
+ return _index.restElement;
+ }
+ });
+ Object.defineProperty(exports, "RestProperty", {
+ enumerable: true,
+ get: function () {
+ return _index.restProperty;
+ }
+ });
+ Object.defineProperty(exports, "ReturnStatement", {
+ enumerable: true,
+ get: function () {
+ return _index.returnStatement;
+ }
+ });
+ Object.defineProperty(exports, "SequenceExpression", {
+ enumerable: true,
+ get: function () {
+ return _index.sequenceExpression;
+ }
+ });
+ Object.defineProperty(exports, "SpreadElement", {
+ enumerable: true,
+ get: function () {
+ return _index.spreadElement;
+ }
+ });
+ Object.defineProperty(exports, "SpreadProperty", {
+ enumerable: true,
+ get: function () {
+ return _index.spreadProperty;
+ }
+ });
+ Object.defineProperty(exports, "StaticBlock", {
+ enumerable: true,
+ get: function () {
+ return _index.staticBlock;
+ }
+ });
+ Object.defineProperty(exports, "StringLiteral", {
+ enumerable: true,
+ get: function () {
+ return _index.stringLiteral;
+ }
+ });
+ Object.defineProperty(exports, "StringLiteralTypeAnnotation", {
+ enumerable: true,
+ get: function () {
+ return _index.stringLiteralTypeAnnotation;
+ }
+ });
+ Object.defineProperty(exports, "StringTypeAnnotation", {
+ enumerable: true,
+ get: function () {
+ return _index.stringTypeAnnotation;
+ }
+ });
+ Object.defineProperty(exports, "Super", {
+ enumerable: true,
+ get: function () {
+ return _index.super;
+ }
+ });
+ Object.defineProperty(exports, "SwitchCase", {
+ enumerable: true,
+ get: function () {
+ return _index.switchCase;
+ }
+ });
+ Object.defineProperty(exports, "SwitchStatement", {
+ enumerable: true,
+ get: function () {
+ return _index.switchStatement;
+ }
+ });
+ Object.defineProperty(exports, "SymbolTypeAnnotation", {
+ enumerable: true,
+ get: function () {
+ return _index.symbolTypeAnnotation;
+ }
+ });
+ Object.defineProperty(exports, "TSAnyKeyword", {
+ enumerable: true,
+ get: function () {
+ return _index.tsAnyKeyword;
+ }
+ });
+ Object.defineProperty(exports, "TSArrayType", {
+ enumerable: true,
+ get: function () {
+ return _index.tsArrayType;
+ }
+ });
+ Object.defineProperty(exports, "TSAsExpression", {
+ enumerable: true,
+ get: function () {
+ return _index.tsAsExpression;
+ }
+ });
+ Object.defineProperty(exports, "TSBigIntKeyword", {
+ enumerable: true,
+ get: function () {
+ return _index.tsBigIntKeyword;
+ }
+ });
+ Object.defineProperty(exports, "TSBooleanKeyword", {
+ enumerable: true,
+ get: function () {
+ return _index.tsBooleanKeyword;
+ }
+ });
+ Object.defineProperty(exports, "TSCallSignatureDeclaration", {
+ enumerable: true,
+ get: function () {
+ return _index.tsCallSignatureDeclaration;
+ }
+ });
+ Object.defineProperty(exports, "TSConditionalType", {
+ enumerable: true,
+ get: function () {
+ return _index.tsConditionalType;
+ }
+ });
+ Object.defineProperty(exports, "TSConstructSignatureDeclaration", {
+ enumerable: true,
+ get: function () {
+ return _index.tsConstructSignatureDeclaration;
+ }
+ });
+ Object.defineProperty(exports, "TSConstructorType", {
+ enumerable: true,
+ get: function () {
+ return _index.tsConstructorType;
+ }
+ });
+ Object.defineProperty(exports, "TSDeclareFunction", {
+ enumerable: true,
+ get: function () {
+ return _index.tsDeclareFunction;
+ }
+ });
+ Object.defineProperty(exports, "TSDeclareMethod", {
+ enumerable: true,
+ get: function () {
+ return _index.tsDeclareMethod;
+ }
+ });
+ Object.defineProperty(exports, "TSEnumDeclaration", {
+ enumerable: true,
+ get: function () {
+ return _index.tsEnumDeclaration;
+ }
+ });
+ Object.defineProperty(exports, "TSEnumMember", {
+ enumerable: true,
+ get: function () {
+ return _index.tsEnumMember;
+ }
+ });
+ Object.defineProperty(exports, "TSExportAssignment", {
+ enumerable: true,
+ get: function () {
+ return _index.tsExportAssignment;
+ }
+ });
+ Object.defineProperty(exports, "TSExpressionWithTypeArguments", {
+ enumerable: true,
+ get: function () {
+ return _index.tsExpressionWithTypeArguments;
+ }
+ });
+ Object.defineProperty(exports, "TSExternalModuleReference", {
+ enumerable: true,
+ get: function () {
+ return _index.tsExternalModuleReference;
+ }
+ });
+ Object.defineProperty(exports, "TSFunctionType", {
+ enumerable: true,
+ get: function () {
+ return _index.tsFunctionType;
+ }
+ });
+ Object.defineProperty(exports, "TSImportEqualsDeclaration", {
+ enumerable: true,
+ get: function () {
+ return _index.tsImportEqualsDeclaration;
+ }
+ });
+ Object.defineProperty(exports, "TSImportType", {
+ enumerable: true,
+ get: function () {
+ return _index.tsImportType;
+ }
+ });
+ Object.defineProperty(exports, "TSIndexSignature", {
+ enumerable: true,
+ get: function () {
+ return _index.tsIndexSignature;
+ }
+ });
+ Object.defineProperty(exports, "TSIndexedAccessType", {
+ enumerable: true,
+ get: function () {
+ return _index.tsIndexedAccessType;
+ }
+ });
+ Object.defineProperty(exports, "TSInferType", {
+ enumerable: true,
+ get: function () {
+ return _index.tsInferType;
+ }
+ });
+ Object.defineProperty(exports, "TSInstantiationExpression", {
+ enumerable: true,
+ get: function () {
+ return _index.tsInstantiationExpression;
+ }
+ });
+ Object.defineProperty(exports, "TSInterfaceBody", {
+ enumerable: true,
+ get: function () {
+ return _index.tsInterfaceBody;
+ }
+ });
+ Object.defineProperty(exports, "TSInterfaceDeclaration", {
+ enumerable: true,
+ get: function () {
+ return _index.tsInterfaceDeclaration;
+ }
+ });
+ Object.defineProperty(exports, "TSIntersectionType", {
+ enumerable: true,
+ get: function () {
+ return _index.tsIntersectionType;
+ }
+ });
+ Object.defineProperty(exports, "TSIntrinsicKeyword", {
+ enumerable: true,
+ get: function () {
+ return _index.tsIntrinsicKeyword;
+ }
+ });
+ Object.defineProperty(exports, "TSLiteralType", {
+ enumerable: true,
+ get: function () {
+ return _index.tsLiteralType;
+ }
+ });
+ Object.defineProperty(exports, "TSMappedType", {
+ enumerable: true,
+ get: function () {
+ return _index.tsMappedType;
+ }
+ });
+ Object.defineProperty(exports, "TSMethodSignature", {
+ enumerable: true,
+ get: function () {
+ return _index.tsMethodSignature;
+ }
+ });
+ Object.defineProperty(exports, "TSModuleBlock", {
+ enumerable: true,
+ get: function () {
+ return _index.tsModuleBlock;
+ }
+ });
+ Object.defineProperty(exports, "TSModuleDeclaration", {
+ enumerable: true,
+ get: function () {
+ return _index.tsModuleDeclaration;
+ }
+ });
+ Object.defineProperty(exports, "TSNamedTupleMember", {
+ enumerable: true,
+ get: function () {
+ return _index.tsNamedTupleMember;
+ }
+ });
+ Object.defineProperty(exports, "TSNamespaceExportDeclaration", {
+ enumerable: true,
+ get: function () {
+ return _index.tsNamespaceExportDeclaration;
+ }
+ });
+ Object.defineProperty(exports, "TSNeverKeyword", {
+ enumerable: true,
+ get: function () {
+ return _index.tsNeverKeyword;
+ }
+ });
+ Object.defineProperty(exports, "TSNonNullExpression", {
+ enumerable: true,
+ get: function () {
+ return _index.tsNonNullExpression;
+ }
+ });
+ Object.defineProperty(exports, "TSNullKeyword", {
+ enumerable: true,
+ get: function () {
+ return _index.tsNullKeyword;
+ }
+ });
+ Object.defineProperty(exports, "TSNumberKeyword", {
+ enumerable: true,
+ get: function () {
+ return _index.tsNumberKeyword;
+ }
+ });
+ Object.defineProperty(exports, "TSObjectKeyword", {
+ enumerable: true,
+ get: function () {
+ return _index.tsObjectKeyword;
+ }
+ });
+ Object.defineProperty(exports, "TSOptionalType", {
+ enumerable: true,
+ get: function () {
+ return _index.tsOptionalType;
+ }
+ });
+ Object.defineProperty(exports, "TSParameterProperty", {
+ enumerable: true,
+ get: function () {
+ return _index.tsParameterProperty;
+ }
+ });
+ Object.defineProperty(exports, "TSParenthesizedType", {
+ enumerable: true,
+ get: function () {
+ return _index.tsParenthesizedType;
+ }
+ });
+ Object.defineProperty(exports, "TSPropertySignature", {
+ enumerable: true,
+ get: function () {
+ return _index.tsPropertySignature;
+ }
+ });
+ Object.defineProperty(exports, "TSQualifiedName", {
+ enumerable: true,
+ get: function () {
+ return _index.tsQualifiedName;
+ }
+ });
+ Object.defineProperty(exports, "TSRestType", {
+ enumerable: true,
+ get: function () {
+ return _index.tsRestType;
+ }
+ });
+ Object.defineProperty(exports, "TSSatisfiesExpression", {
+ enumerable: true,
+ get: function () {
+ return _index.tsSatisfiesExpression;
+ }
+ });
+ Object.defineProperty(exports, "TSStringKeyword", {
+ enumerable: true,
+ get: function () {
+ return _index.tsStringKeyword;
+ }
+ });
+ Object.defineProperty(exports, "TSSymbolKeyword", {
+ enumerable: true,
+ get: function () {
+ return _index.tsSymbolKeyword;
+ }
+ });
+ Object.defineProperty(exports, "TSThisType", {
+ enumerable: true,
+ get: function () {
+ return _index.tsThisType;
+ }
+ });
+ Object.defineProperty(exports, "TSTupleType", {
+ enumerable: true,
+ get: function () {
+ return _index.tsTupleType;
+ }
+ });
+ Object.defineProperty(exports, "TSTypeAliasDeclaration", {
+ enumerable: true,
+ get: function () {
+ return _index.tsTypeAliasDeclaration;
+ }
+ });
+ Object.defineProperty(exports, "TSTypeAnnotation", {
+ enumerable: true,
+ get: function () {
+ return _index.tsTypeAnnotation;
+ }
+ });
+ Object.defineProperty(exports, "TSTypeAssertion", {
+ enumerable: true,
+ get: function () {
+ return _index.tsTypeAssertion;
+ }
+ });
+ Object.defineProperty(exports, "TSTypeLiteral", {
+ enumerable: true,
+ get: function () {
+ return _index.tsTypeLiteral;
+ }
+ });
+ Object.defineProperty(exports, "TSTypeOperator", {
+ enumerable: true,
+ get: function () {
+ return _index.tsTypeOperator;
+ }
+ });
+ Object.defineProperty(exports, "TSTypeParameter", {
+ enumerable: true,
+ get: function () {
+ return _index.tsTypeParameter;
+ }
+ });
+ Object.defineProperty(exports, "TSTypeParameterDeclaration", {
+ enumerable: true,
+ get: function () {
+ return _index.tsTypeParameterDeclaration;
+ }
+ });
+ Object.defineProperty(exports, "TSTypeParameterInstantiation", {
+ enumerable: true,
+ get: function () {
+ return _index.tsTypeParameterInstantiation;
+ }
+ });
+ Object.defineProperty(exports, "TSTypePredicate", {
+ enumerable: true,
+ get: function () {
+ return _index.tsTypePredicate;
+ }
+ });
+ Object.defineProperty(exports, "TSTypeQuery", {
+ enumerable: true,
+ get: function () {
+ return _index.tsTypeQuery;
+ }
+ });
+ Object.defineProperty(exports, "TSTypeReference", {
+ enumerable: true,
+ get: function () {
+ return _index.tsTypeReference;
+ }
+ });
+ Object.defineProperty(exports, "TSUndefinedKeyword", {
+ enumerable: true,
+ get: function () {
+ return _index.tsUndefinedKeyword;
+ }
+ });
+ Object.defineProperty(exports, "TSUnionType", {
+ enumerable: true,
+ get: function () {
+ return _index.tsUnionType;
+ }
+ });
+ Object.defineProperty(exports, "TSUnknownKeyword", {
+ enumerable: true,
+ get: function () {
+ return _index.tsUnknownKeyword;
+ }
+ });
+ Object.defineProperty(exports, "TSVoidKeyword", {
+ enumerable: true,
+ get: function () {
+ return _index.tsVoidKeyword;
+ }
+ });
+ Object.defineProperty(exports, "TaggedTemplateExpression", {
+ enumerable: true,
+ get: function () {
+ return _index.taggedTemplateExpression;
+ }
+ });
+ Object.defineProperty(exports, "TemplateElement", {
+ enumerable: true,
+ get: function () {
+ return _index.templateElement;
+ }
+ });
+ Object.defineProperty(exports, "TemplateLiteral", {
+ enumerable: true,
+ get: function () {
+ return _index.templateLiteral;
+ }
+ });
+ Object.defineProperty(exports, "ThisExpression", {
+ enumerable: true,
+ get: function () {
+ return _index.thisExpression;
+ }
+ });
+ Object.defineProperty(exports, "ThisTypeAnnotation", {
+ enumerable: true,
+ get: function () {
+ return _index.thisTypeAnnotation;
+ }
+ });
+ Object.defineProperty(exports, "ThrowStatement", {
+ enumerable: true,
+ get: function () {
+ return _index.throwStatement;
+ }
+ });
+ Object.defineProperty(exports, "TopicReference", {
+ enumerable: true,
+ get: function () {
+ return _index.topicReference;
+ }
+ });
+ Object.defineProperty(exports, "TryStatement", {
+ enumerable: true,
+ get: function () {
+ return _index.tryStatement;
+ }
+ });
+ Object.defineProperty(exports, "TupleExpression", {
+ enumerable: true,
+ get: function () {
+ return _index.tupleExpression;
+ }
+ });
+ Object.defineProperty(exports, "TupleTypeAnnotation", {
+ enumerable: true,
+ get: function () {
+ return _index.tupleTypeAnnotation;
+ }
+ });
+ Object.defineProperty(exports, "TypeAlias", {
+ enumerable: true,
+ get: function () {
+ return _index.typeAlias;
+ }
+ });
+ Object.defineProperty(exports, "TypeAnnotation", {
+ enumerable: true,
+ get: function () {
+ return _index.typeAnnotation;
+ }
+ });
+ Object.defineProperty(exports, "TypeCastExpression", {
+ enumerable: true,
+ get: function () {
+ return _index.typeCastExpression;
+ }
+ });
+ Object.defineProperty(exports, "TypeParameter", {
+ enumerable: true,
+ get: function () {
+ return _index.typeParameter;
+ }
+ });
+ Object.defineProperty(exports, "TypeParameterDeclaration", {
+ enumerable: true,
+ get: function () {
+ return _index.typeParameterDeclaration;
+ }
+ });
+ Object.defineProperty(exports, "TypeParameterInstantiation", {
+ enumerable: true,
+ get: function () {
+ return _index.typeParameterInstantiation;
+ }
+ });
+ Object.defineProperty(exports, "TypeofTypeAnnotation", {
+ enumerable: true,
+ get: function () {
+ return _index.typeofTypeAnnotation;
+ }
+ });
+ Object.defineProperty(exports, "UnaryExpression", {
+ enumerable: true,
+ get: function () {
+ return _index.unaryExpression;
+ }
+ });
+ Object.defineProperty(exports, "UnionTypeAnnotation", {
+ enumerable: true,
+ get: function () {
+ return _index.unionTypeAnnotation;
+ }
+ });
+ Object.defineProperty(exports, "UpdateExpression", {
+ enumerable: true,
+ get: function () {
+ return _index.updateExpression;
+ }
+ });
+ Object.defineProperty(exports, "V8IntrinsicIdentifier", {
+ enumerable: true,
+ get: function () {
+ return _index.v8IntrinsicIdentifier;
+ }
+ });
+ Object.defineProperty(exports, "VariableDeclaration", {
+ enumerable: true,
+ get: function () {
+ return _index.variableDeclaration;
+ }
+ });
+ Object.defineProperty(exports, "VariableDeclarator", {
+ enumerable: true,
+ get: function () {
+ return _index.variableDeclarator;
+ }
+ });
+ Object.defineProperty(exports, "Variance", {
+ enumerable: true,
+ get: function () {
+ return _index.variance;
+ }
+ });
+ Object.defineProperty(exports, "VoidTypeAnnotation", {
+ enumerable: true,
+ get: function () {
+ return _index.voidTypeAnnotation;
+ }
+ });
+ Object.defineProperty(exports, "WhileStatement", {
+ enumerable: true,
+ get: function () {
+ return _index.whileStatement;
+ }
+ });
+ Object.defineProperty(exports, "WithStatement", {
+ enumerable: true,
+ get: function () {
+ return _index.withStatement;
+ }
+ });
+ Object.defineProperty(exports, "YieldExpression", {
+ enumerable: true,
+ get: function () {
+ return _index.yieldExpression;
+ }
+ });
+ var _index = requireGenerated$2();
+
+
+ } (uppercase));
+ return uppercase;
+ }
+
+ var productions = {};
+
+ var hasRequiredProductions;
+
+ function requireProductions () {
+ if (hasRequiredProductions) return productions;
+ hasRequiredProductions = 1;
+
+ Object.defineProperty(productions, "__esModule", {
+ value: true
+ });
+ productions.buildUndefinedNode = buildUndefinedNode;
+ var _index = requireGenerated$2();
+ function buildUndefinedNode() {
+ return (0, _index.unaryExpression)("void", (0, _index.numericLiteral)(0), true);
+ }
+
+
+ return productions;
+ }
+
+ var cloneNode = {};
+
+ var hasRequiredCloneNode;
+
+ function requireCloneNode () {
+ if (hasRequiredCloneNode) return cloneNode;
+ hasRequiredCloneNode = 1;
+
+ Object.defineProperty(cloneNode, "__esModule", {
+ value: true
+ });
+ cloneNode.default = cloneNode$1;
+ var _index = requireDefinitions();
+ var _index2 = requireGenerated$3();
+ const has = Function.call.bind(Object.prototype.hasOwnProperty);
+ function cloneIfNode(obj, deep, withoutLoc, commentsCache) {
+ if (obj && typeof obj.type === "string") {
+ return cloneNodeInternal(obj, deep, withoutLoc, commentsCache);
+ }
+ return obj;
+ }
+ function cloneIfNodeOrArray(obj, deep, withoutLoc, commentsCache) {
+ if (Array.isArray(obj)) {
+ return obj.map(node => cloneIfNode(node, deep, withoutLoc, commentsCache));
+ }
+ return cloneIfNode(obj, deep, withoutLoc, commentsCache);
+ }
+ function cloneNode$1(node, deep = true, withoutLoc = false) {
+ return cloneNodeInternal(node, deep, withoutLoc, new Map());
+ }
+ function cloneNodeInternal(node, deep = true, withoutLoc = false, commentsCache) {
+ if (!node) return node;
+ const {
+ type
+ } = node;
+ const newNode = {
+ type: node.type
+ };
+ if ((0, _index2.isIdentifier)(node)) {
+ newNode.name = node.name;
+ if (has(node, "optional") && typeof node.optional === "boolean") {
+ newNode.optional = node.optional;
+ }
+ if (has(node, "typeAnnotation")) {
+ newNode.typeAnnotation = deep ? cloneIfNodeOrArray(node.typeAnnotation, true, withoutLoc, commentsCache) : node.typeAnnotation;
+ }
+ } else if (!has(_index.NODE_FIELDS, type)) {
+ throw new Error(`Unknown node type: "${type}"`);
+ } else {
+ for (const field of Object.keys(_index.NODE_FIELDS[type])) {
+ if (has(node, field)) {
+ if (deep) {
+ newNode[field] = (0, _index2.isFile)(node) && field === "comments" ? maybeCloneComments(node.comments, deep, withoutLoc, commentsCache) : cloneIfNodeOrArray(node[field], true, withoutLoc, commentsCache);
+ } else {
+ newNode[field] = node[field];
+ }
+ }
+ }
+ }
+ if (has(node, "loc")) {
+ if (withoutLoc) {
+ newNode.loc = null;
+ } else {
+ newNode.loc = node.loc;
+ }
+ }
+ if (has(node, "leadingComments")) {
+ newNode.leadingComments = maybeCloneComments(node.leadingComments, deep, withoutLoc, commentsCache);
+ }
+ if (has(node, "innerComments")) {
+ newNode.innerComments = maybeCloneComments(node.innerComments, deep, withoutLoc, commentsCache);
+ }
+ if (has(node, "trailingComments")) {
+ newNode.trailingComments = maybeCloneComments(node.trailingComments, deep, withoutLoc, commentsCache);
+ }
+ if (has(node, "extra")) {
+ newNode.extra = Object.assign({}, node.extra);
+ }
+ return newNode;
+ }
+ function maybeCloneComments(comments, deep, withoutLoc, commentsCache) {
+ if (!comments || !deep) {
+ return comments;
+ }
+ return comments.map(comment => {
+ const cache = commentsCache.get(comment);
+ if (cache) return cache;
+ const {
+ type,
+ value,
+ loc
+ } = comment;
+ const ret = {
+ type,
+ value,
+ loc
+ };
+ if (withoutLoc) {
+ ret.loc = null;
+ }
+ commentsCache.set(comment, ret);
+ return ret;
+ });
+ }
+
+
+ return cloneNode;
+ }
+
+ var clone = {};
+
+ var hasRequiredClone;
+
+ function requireClone () {
+ if (hasRequiredClone) return clone;
+ hasRequiredClone = 1;
+
+ Object.defineProperty(clone, "__esModule", {
+ value: true
+ });
+ clone.default = clone$1;
+ var _cloneNode = requireCloneNode();
+ function clone$1(node) {
+ return (0, _cloneNode.default)(node, false);
+ }
+
+
+ return clone;
+ }
+
+ var cloneDeep = {};
+
+ var hasRequiredCloneDeep;
+
+ function requireCloneDeep () {
+ if (hasRequiredCloneDeep) return cloneDeep;
+ hasRequiredCloneDeep = 1;
+
+ Object.defineProperty(cloneDeep, "__esModule", {
+ value: true
+ });
+ cloneDeep.default = cloneDeep$1;
+ var _cloneNode = requireCloneNode();
+ function cloneDeep$1(node) {
+ return (0, _cloneNode.default)(node);
+ }
+
+
+ return cloneDeep;
+ }
+
+ var cloneDeepWithoutLoc = {};
+
+ var hasRequiredCloneDeepWithoutLoc;
+
+ function requireCloneDeepWithoutLoc () {
+ if (hasRequiredCloneDeepWithoutLoc) return cloneDeepWithoutLoc;
+ hasRequiredCloneDeepWithoutLoc = 1;
+
+ Object.defineProperty(cloneDeepWithoutLoc, "__esModule", {
+ value: true
+ });
+ cloneDeepWithoutLoc.default = cloneDeepWithoutLoc$1;
+ var _cloneNode = requireCloneNode();
+ function cloneDeepWithoutLoc$1(node) {
+ return (0, _cloneNode.default)(node, true, true);
+ }
+
+
+ return cloneDeepWithoutLoc;
+ }
+
+ var cloneWithoutLoc = {};
+
+ var hasRequiredCloneWithoutLoc;
+
+ function requireCloneWithoutLoc () {
+ if (hasRequiredCloneWithoutLoc) return cloneWithoutLoc;
+ hasRequiredCloneWithoutLoc = 1;
+
+ Object.defineProperty(cloneWithoutLoc, "__esModule", {
+ value: true
+ });
+ cloneWithoutLoc.default = cloneWithoutLoc$1;
+ var _cloneNode = requireCloneNode();
+ function cloneWithoutLoc$1(node) {
+ return (0, _cloneNode.default)(node, false, true);
+ }
+
+
+ return cloneWithoutLoc;
+ }
+
+ var addComment = {};
+
+ var addComments = {};
+
+ var hasRequiredAddComments;
+
+ function requireAddComments () {
+ if (hasRequiredAddComments) return addComments;
+ hasRequiredAddComments = 1;
+
+ Object.defineProperty(addComments, "__esModule", {
+ value: true
+ });
+ addComments.default = addComments$1;
+ function addComments$1(node, type, comments) {
+ if (!comments || !node) return node;
+ const key = `${type}Comments`;
+ if (node[key]) {
+ if (type === "leading") {
+ node[key] = comments.concat(node[key]);
+ } else {
+ node[key].push(...comments);
+ }
+ } else {
+ node[key] = comments;
+ }
+ return node;
+ }
+
+
+ return addComments;
+ }
+
+ var hasRequiredAddComment;
+
+ function requireAddComment () {
+ if (hasRequiredAddComment) return addComment;
+ hasRequiredAddComment = 1;
+
+ Object.defineProperty(addComment, "__esModule", {
+ value: true
+ });
+ addComment.default = addComment$1;
+ var _addComments = requireAddComments();
+ function addComment$1(node, type, content, line) {
+ return (0, _addComments.default)(node, type, [{
+ type: line ? "CommentLine" : "CommentBlock",
+ value: content
+ }]);
+ }
+
+
+ return addComment;
+ }
+
+ var inheritInnerComments = {};
+
+ var inherit = {};
+
+ var hasRequiredInherit;
+
+ function requireInherit () {
+ if (hasRequiredInherit) return inherit;
+ hasRequiredInherit = 1;
+
+ Object.defineProperty(inherit, "__esModule", {
+ value: true
+ });
+ inherit.default = inherit$1;
+ function inherit$1(key, child, parent) {
+ if (child && parent) {
+ child[key] = Array.from(new Set([].concat(child[key], parent[key]).filter(Boolean)));
+ }
+ }
+
+
+ return inherit;
+ }
+
+ var hasRequiredInheritInnerComments;
+
+ function requireInheritInnerComments () {
+ if (hasRequiredInheritInnerComments) return inheritInnerComments;
+ hasRequiredInheritInnerComments = 1;
+
+ Object.defineProperty(inheritInnerComments, "__esModule", {
+ value: true
+ });
+ inheritInnerComments.default = inheritInnerComments$1;
+ var _inherit = requireInherit();
+ function inheritInnerComments$1(child, parent) {
+ (0, _inherit.default)("innerComments", child, parent);
+ }
+
+
+ return inheritInnerComments;
+ }
+
+ var inheritLeadingComments = {};
+
+ var hasRequiredInheritLeadingComments;
+
+ function requireInheritLeadingComments () {
+ if (hasRequiredInheritLeadingComments) return inheritLeadingComments;
+ hasRequiredInheritLeadingComments = 1;
+
+ Object.defineProperty(inheritLeadingComments, "__esModule", {
+ value: true
+ });
+ inheritLeadingComments.default = inheritLeadingComments$1;
+ var _inherit = requireInherit();
+ function inheritLeadingComments$1(child, parent) {
+ (0, _inherit.default)("leadingComments", child, parent);
+ }
+
+
+ return inheritLeadingComments;
+ }
+
+ var inheritsComments = {};
+
+ var inheritTrailingComments = {};
+
+ var hasRequiredInheritTrailingComments;
+
+ function requireInheritTrailingComments () {
+ if (hasRequiredInheritTrailingComments) return inheritTrailingComments;
+ hasRequiredInheritTrailingComments = 1;
+
+ Object.defineProperty(inheritTrailingComments, "__esModule", {
+ value: true
+ });
+ inheritTrailingComments.default = inheritTrailingComments$1;
+ var _inherit = requireInherit();
+ function inheritTrailingComments$1(child, parent) {
+ (0, _inherit.default)("trailingComments", child, parent);
+ }
+
+
+ return inheritTrailingComments;
+ }
+
+ var hasRequiredInheritsComments;
+
+ function requireInheritsComments () {
+ if (hasRequiredInheritsComments) return inheritsComments;
+ hasRequiredInheritsComments = 1;
+
+ Object.defineProperty(inheritsComments, "__esModule", {
+ value: true
+ });
+ inheritsComments.default = inheritsComments$1;
+ var _inheritTrailingComments = requireInheritTrailingComments();
+ var _inheritLeadingComments = requireInheritLeadingComments();
+ var _inheritInnerComments = requireInheritInnerComments();
+ function inheritsComments$1(child, parent) {
+ (0, _inheritTrailingComments.default)(child, parent);
+ (0, _inheritLeadingComments.default)(child, parent);
+ (0, _inheritInnerComments.default)(child, parent);
+ return child;
+ }
+
+
+ return inheritsComments;
+ }
+
+ var removeComments = {};
+
+ var hasRequiredRemoveComments;
+
+ function requireRemoveComments () {
+ if (hasRequiredRemoveComments) return removeComments;
+ hasRequiredRemoveComments = 1;
+
+ Object.defineProperty(removeComments, "__esModule", {
+ value: true
+ });
+ removeComments.default = removeComments$1;
+ var _index = requireConstants();
+ function removeComments$1(node) {
+ _index.COMMENT_KEYS.forEach(key => {
+ node[key] = null;
+ });
+ return node;
+ }
+
+
+ return removeComments;
+ }
+
+ var generated = {};
+
+ var hasRequiredGenerated;
+
+ function requireGenerated () {
+ if (hasRequiredGenerated) return generated;
+ hasRequiredGenerated = 1;
+
+ Object.defineProperty(generated, "__esModule", {
+ value: true
+ });
+ generated.WHILE_TYPES = generated.USERWHITESPACABLE_TYPES = generated.UNARYLIKE_TYPES = generated.TYPESCRIPT_TYPES = generated.TSTYPE_TYPES = generated.TSTYPEELEMENT_TYPES = generated.TSENTITYNAME_TYPES = generated.TSBASETYPE_TYPES = generated.TERMINATORLESS_TYPES = generated.STATEMENT_TYPES = generated.STANDARDIZED_TYPES = generated.SCOPABLE_TYPES = generated.PUREISH_TYPES = generated.PROPERTY_TYPES = generated.PRIVATE_TYPES = generated.PATTERN_TYPES = generated.PATTERNLIKE_TYPES = generated.OBJECTMEMBER_TYPES = generated.MODULESPECIFIER_TYPES = generated.MODULEDECLARATION_TYPES = generated.MISCELLANEOUS_TYPES = generated.METHOD_TYPES = generated.LVAL_TYPES = generated.LOOP_TYPES = generated.LITERAL_TYPES = generated.JSX_TYPES = generated.IMPORTOREXPORTDECLARATION_TYPES = generated.IMMUTABLE_TYPES = generated.FUNCTION_TYPES = generated.FUNCTIONPARENT_TYPES = generated.FOR_TYPES = generated.FORXSTATEMENT_TYPES = generated.FLOW_TYPES = generated.FLOWTYPE_TYPES = generated.FLOWPREDICATE_TYPES = generated.FLOWDECLARATION_TYPES = generated.FLOWBASEANNOTATION_TYPES = generated.EXPRESSION_TYPES = generated.EXPRESSIONWRAPPER_TYPES = generated.EXPORTDECLARATION_TYPES = generated.ENUMMEMBER_TYPES = generated.ENUMBODY_TYPES = generated.DECLARATION_TYPES = generated.CONDITIONAL_TYPES = generated.COMPLETIONSTATEMENT_TYPES = generated.CLASS_TYPES = generated.BLOCK_TYPES = generated.BLOCKPARENT_TYPES = generated.BINARY_TYPES = generated.ACCESSOR_TYPES = void 0;
+ var _index = requireDefinitions();
+ const STANDARDIZED_TYPES = _index.FLIPPED_ALIAS_KEYS["Standardized"];
+ generated.STANDARDIZED_TYPES = STANDARDIZED_TYPES;
+ const EXPRESSION_TYPES = _index.FLIPPED_ALIAS_KEYS["Expression"];
+ generated.EXPRESSION_TYPES = EXPRESSION_TYPES;
+ const BINARY_TYPES = _index.FLIPPED_ALIAS_KEYS["Binary"];
+ generated.BINARY_TYPES = BINARY_TYPES;
+ const SCOPABLE_TYPES = _index.FLIPPED_ALIAS_KEYS["Scopable"];
+ generated.SCOPABLE_TYPES = SCOPABLE_TYPES;
+ const BLOCKPARENT_TYPES = _index.FLIPPED_ALIAS_KEYS["BlockParent"];
+ generated.BLOCKPARENT_TYPES = BLOCKPARENT_TYPES;
+ const BLOCK_TYPES = _index.FLIPPED_ALIAS_KEYS["Block"];
+ generated.BLOCK_TYPES = BLOCK_TYPES;
+ const STATEMENT_TYPES = _index.FLIPPED_ALIAS_KEYS["Statement"];
+ generated.STATEMENT_TYPES = STATEMENT_TYPES;
+ const TERMINATORLESS_TYPES = _index.FLIPPED_ALIAS_KEYS["Terminatorless"];
+ generated.TERMINATORLESS_TYPES = TERMINATORLESS_TYPES;
+ const COMPLETIONSTATEMENT_TYPES = _index.FLIPPED_ALIAS_KEYS["CompletionStatement"];
+ generated.COMPLETIONSTATEMENT_TYPES = COMPLETIONSTATEMENT_TYPES;
+ const CONDITIONAL_TYPES = _index.FLIPPED_ALIAS_KEYS["Conditional"];
+ generated.CONDITIONAL_TYPES = CONDITIONAL_TYPES;
+ const LOOP_TYPES = _index.FLIPPED_ALIAS_KEYS["Loop"];
+ generated.LOOP_TYPES = LOOP_TYPES;
+ const WHILE_TYPES = _index.FLIPPED_ALIAS_KEYS["While"];
+ generated.WHILE_TYPES = WHILE_TYPES;
+ const EXPRESSIONWRAPPER_TYPES = _index.FLIPPED_ALIAS_KEYS["ExpressionWrapper"];
+ generated.EXPRESSIONWRAPPER_TYPES = EXPRESSIONWRAPPER_TYPES;
+ const FOR_TYPES = _index.FLIPPED_ALIAS_KEYS["For"];
+ generated.FOR_TYPES = FOR_TYPES;
+ const FORXSTATEMENT_TYPES = _index.FLIPPED_ALIAS_KEYS["ForXStatement"];
+ generated.FORXSTATEMENT_TYPES = FORXSTATEMENT_TYPES;
+ const FUNCTION_TYPES = _index.FLIPPED_ALIAS_KEYS["Function"];
+ generated.FUNCTION_TYPES = FUNCTION_TYPES;
+ const FUNCTIONPARENT_TYPES = _index.FLIPPED_ALIAS_KEYS["FunctionParent"];
+ generated.FUNCTIONPARENT_TYPES = FUNCTIONPARENT_TYPES;
+ const PUREISH_TYPES = _index.FLIPPED_ALIAS_KEYS["Pureish"];
+ generated.PUREISH_TYPES = PUREISH_TYPES;
+ const DECLARATION_TYPES = _index.FLIPPED_ALIAS_KEYS["Declaration"];
+ generated.DECLARATION_TYPES = DECLARATION_TYPES;
+ const PATTERNLIKE_TYPES = _index.FLIPPED_ALIAS_KEYS["PatternLike"];
+ generated.PATTERNLIKE_TYPES = PATTERNLIKE_TYPES;
+ const LVAL_TYPES = _index.FLIPPED_ALIAS_KEYS["LVal"];
+ generated.LVAL_TYPES = LVAL_TYPES;
+ const TSENTITYNAME_TYPES = _index.FLIPPED_ALIAS_KEYS["TSEntityName"];
+ generated.TSENTITYNAME_TYPES = TSENTITYNAME_TYPES;
+ const LITERAL_TYPES = _index.FLIPPED_ALIAS_KEYS["Literal"];
+ generated.LITERAL_TYPES = LITERAL_TYPES;
+ const IMMUTABLE_TYPES = _index.FLIPPED_ALIAS_KEYS["Immutable"];
+ generated.IMMUTABLE_TYPES = IMMUTABLE_TYPES;
+ const USERWHITESPACABLE_TYPES = _index.FLIPPED_ALIAS_KEYS["UserWhitespacable"];
+ generated.USERWHITESPACABLE_TYPES = USERWHITESPACABLE_TYPES;
+ const METHOD_TYPES = _index.FLIPPED_ALIAS_KEYS["Method"];
+ generated.METHOD_TYPES = METHOD_TYPES;
+ const OBJECTMEMBER_TYPES = _index.FLIPPED_ALIAS_KEYS["ObjectMember"];
+ generated.OBJECTMEMBER_TYPES = OBJECTMEMBER_TYPES;
+ const PROPERTY_TYPES = _index.FLIPPED_ALIAS_KEYS["Property"];
+ generated.PROPERTY_TYPES = PROPERTY_TYPES;
+ const UNARYLIKE_TYPES = _index.FLIPPED_ALIAS_KEYS["UnaryLike"];
+ generated.UNARYLIKE_TYPES = UNARYLIKE_TYPES;
+ const PATTERN_TYPES = _index.FLIPPED_ALIAS_KEYS["Pattern"];
+ generated.PATTERN_TYPES = PATTERN_TYPES;
+ const CLASS_TYPES = _index.FLIPPED_ALIAS_KEYS["Class"];
+ generated.CLASS_TYPES = CLASS_TYPES;
+ const IMPORTOREXPORTDECLARATION_TYPES = _index.FLIPPED_ALIAS_KEYS["ImportOrExportDeclaration"];
+ generated.IMPORTOREXPORTDECLARATION_TYPES = IMPORTOREXPORTDECLARATION_TYPES;
+ const EXPORTDECLARATION_TYPES = _index.FLIPPED_ALIAS_KEYS["ExportDeclaration"];
+ generated.EXPORTDECLARATION_TYPES = EXPORTDECLARATION_TYPES;
+ const MODULESPECIFIER_TYPES = _index.FLIPPED_ALIAS_KEYS["ModuleSpecifier"];
+ generated.MODULESPECIFIER_TYPES = MODULESPECIFIER_TYPES;
+ const ACCESSOR_TYPES = _index.FLIPPED_ALIAS_KEYS["Accessor"];
+ generated.ACCESSOR_TYPES = ACCESSOR_TYPES;
+ const PRIVATE_TYPES = _index.FLIPPED_ALIAS_KEYS["Private"];
+ generated.PRIVATE_TYPES = PRIVATE_TYPES;
+ const FLOW_TYPES = _index.FLIPPED_ALIAS_KEYS["Flow"];
+ generated.FLOW_TYPES = FLOW_TYPES;
+ const FLOWTYPE_TYPES = _index.FLIPPED_ALIAS_KEYS["FlowType"];
+ generated.FLOWTYPE_TYPES = FLOWTYPE_TYPES;
+ const FLOWBASEANNOTATION_TYPES = _index.FLIPPED_ALIAS_KEYS["FlowBaseAnnotation"];
+ generated.FLOWBASEANNOTATION_TYPES = FLOWBASEANNOTATION_TYPES;
+ const FLOWDECLARATION_TYPES = _index.FLIPPED_ALIAS_KEYS["FlowDeclaration"];
+ generated.FLOWDECLARATION_TYPES = FLOWDECLARATION_TYPES;
+ const FLOWPREDICATE_TYPES = _index.FLIPPED_ALIAS_KEYS["FlowPredicate"];
+ generated.FLOWPREDICATE_TYPES = FLOWPREDICATE_TYPES;
+ const ENUMBODY_TYPES = _index.FLIPPED_ALIAS_KEYS["EnumBody"];
+ generated.ENUMBODY_TYPES = ENUMBODY_TYPES;
+ const ENUMMEMBER_TYPES = _index.FLIPPED_ALIAS_KEYS["EnumMember"];
+ generated.ENUMMEMBER_TYPES = ENUMMEMBER_TYPES;
+ const JSX_TYPES = _index.FLIPPED_ALIAS_KEYS["JSX"];
+ generated.JSX_TYPES = JSX_TYPES;
+ const MISCELLANEOUS_TYPES = _index.FLIPPED_ALIAS_KEYS["Miscellaneous"];
+ generated.MISCELLANEOUS_TYPES = MISCELLANEOUS_TYPES;
+ const TYPESCRIPT_TYPES = _index.FLIPPED_ALIAS_KEYS["TypeScript"];
+ generated.TYPESCRIPT_TYPES = TYPESCRIPT_TYPES;
+ const TSTYPEELEMENT_TYPES = _index.FLIPPED_ALIAS_KEYS["TSTypeElement"];
+ generated.TSTYPEELEMENT_TYPES = TSTYPEELEMENT_TYPES;
+ const TSTYPE_TYPES = _index.FLIPPED_ALIAS_KEYS["TSType"];
+ generated.TSTYPE_TYPES = TSTYPE_TYPES;
+ const TSBASETYPE_TYPES = _index.FLIPPED_ALIAS_KEYS["TSBaseType"];
+ generated.TSBASETYPE_TYPES = TSBASETYPE_TYPES;
+ const MODULEDECLARATION_TYPES = IMPORTOREXPORTDECLARATION_TYPES;
+ generated.MODULEDECLARATION_TYPES = MODULEDECLARATION_TYPES;
+
+
+ return generated;
+ }
+
+ var ensureBlock = {};
+
+ var toBlock = {};
+
+ var hasRequiredToBlock;
+
+ function requireToBlock () {
+ if (hasRequiredToBlock) return toBlock;
+ hasRequiredToBlock = 1;
+
+ Object.defineProperty(toBlock, "__esModule", {
+ value: true
+ });
+ toBlock.default = toBlock$1;
+ var _index = requireGenerated$3();
+ var _index2 = requireGenerated$2();
+ function toBlock$1(node, parent) {
+ if ((0, _index.isBlockStatement)(node)) {
+ return node;
+ }
+ let blockNodes = [];
+ if ((0, _index.isEmptyStatement)(node)) {
+ blockNodes = [];
+ } else {
+ if (!(0, _index.isStatement)(node)) {
+ if ((0, _index.isFunction)(parent)) {
+ node = (0, _index2.returnStatement)(node);
+ } else {
+ node = (0, _index2.expressionStatement)(node);
+ }
+ }
+ blockNodes = [node];
+ }
+ return (0, _index2.blockStatement)(blockNodes);
+ }
+
+
+ return toBlock;
+ }
+
+ var hasRequiredEnsureBlock;
+
+ function requireEnsureBlock () {
+ if (hasRequiredEnsureBlock) return ensureBlock;
+ hasRequiredEnsureBlock = 1;
+
+ Object.defineProperty(ensureBlock, "__esModule", {
+ value: true
+ });
+ ensureBlock.default = ensureBlock$1;
+ var _toBlock = requireToBlock();
+ function ensureBlock$1(node, key = "body") {
+ const result = (0, _toBlock.default)(node[key], node);
+ node[key] = result;
+ return result;
+ }
+
+
+ return ensureBlock;
+ }
+
+ var toBindingIdentifierName = {};
+
+ var toIdentifier = {};
+
+ var hasRequiredToIdentifier;
+
+ function requireToIdentifier () {
+ if (hasRequiredToIdentifier) return toIdentifier;
+ hasRequiredToIdentifier = 1;
+
+ Object.defineProperty(toIdentifier, "__esModule", {
+ value: true
+ });
+ toIdentifier.default = toIdentifier$1;
+ var _isValidIdentifier = requireIsValidIdentifier();
+ var _helperValidatorIdentifier = requireLib$4();
+ function toIdentifier$1(input) {
+ input = input + "";
+ let name = "";
+ for (const c of input) {
+ name += (0, _helperValidatorIdentifier.isIdentifierChar)(c.codePointAt(0)) ? c : "-";
+ }
+ name = name.replace(/^[-0-9]+/, "");
+ name = name.replace(/[-\s]+(.)?/g, function (match, c) {
+ return c ? c.toUpperCase() : "";
+ });
+ if (!(0, _isValidIdentifier.default)(name)) {
+ name = `_${name}`;
+ }
+ return name || "_";
+ }
+
+
+ return toIdentifier;
+ }
+
+ var hasRequiredToBindingIdentifierName;
+
+ function requireToBindingIdentifierName () {
+ if (hasRequiredToBindingIdentifierName) return toBindingIdentifierName;
+ hasRequiredToBindingIdentifierName = 1;
+
+ Object.defineProperty(toBindingIdentifierName, "__esModule", {
+ value: true
+ });
+ toBindingIdentifierName.default = toBindingIdentifierName$1;
+ var _toIdentifier = requireToIdentifier();
+ function toBindingIdentifierName$1(name) {
+ name = (0, _toIdentifier.default)(name);
+ if (name === "eval" || name === "arguments") name = "_" + name;
+ return name;
+ }
+
+
+ return toBindingIdentifierName;
+ }
+
+ var toComputedKey = {};
+
+ var hasRequiredToComputedKey;
+
+ function requireToComputedKey () {
+ if (hasRequiredToComputedKey) return toComputedKey;
+ hasRequiredToComputedKey = 1;
+
+ Object.defineProperty(toComputedKey, "__esModule", {
+ value: true
+ });
+ toComputedKey.default = toComputedKey$1;
+ var _index = requireGenerated$3();
+ var _index2 = requireGenerated$2();
+ function toComputedKey$1(node, key = node.key || node.property) {
+ if (!node.computed && (0, _index.isIdentifier)(key)) key = (0, _index2.stringLiteral)(key.name);
+ return key;
+ }
+
+
+ return toComputedKey;
+ }
+
+ var toExpression = {};
+
+ var hasRequiredToExpression;
+
+ function requireToExpression () {
+ if (hasRequiredToExpression) return toExpression;
+ hasRequiredToExpression = 1;
+
+ Object.defineProperty(toExpression, "__esModule", {
+ value: true
+ });
+ toExpression.default = void 0;
+ var _index = requireGenerated$3();
+ var _default = toExpression$1;
+ toExpression.default = _default;
+ function toExpression$1(node) {
+ if ((0, _index.isExpressionStatement)(node)) {
+ node = node.expression;
+ }
+ if ((0, _index.isExpression)(node)) {
+ return node;
+ }
+ if ((0, _index.isClass)(node)) {
+ node.type = "ClassExpression";
+ } else if ((0, _index.isFunction)(node)) {
+ node.type = "FunctionExpression";
+ }
+ if (!(0, _index.isExpression)(node)) {
+ throw new Error(`cannot turn ${node.type} to an expression`);
+ }
+ return node;
+ }
+
+
+ return toExpression;
+ }
+
+ var toKeyAlias = {};
+
+ var removePropertiesDeep = {};
+
+ var traverseFast = {};
+
+ var hasRequiredTraverseFast;
+
+ function requireTraverseFast () {
+ if (hasRequiredTraverseFast) return traverseFast;
+ hasRequiredTraverseFast = 1;
+
+ Object.defineProperty(traverseFast, "__esModule", {
+ value: true
+ });
+ traverseFast.default = traverseFast$1;
+ var _index = requireDefinitions();
+ function traverseFast$1(node, enter, opts) {
+ if (!node) return;
+ const keys = _index.VISITOR_KEYS[node.type];
+ if (!keys) return;
+ opts = opts || {};
+ enter(node, opts);
+ for (const key of keys) {
+ const subNode = node[key];
+ if (Array.isArray(subNode)) {
+ for (const node of subNode) {
+ traverseFast$1(node, enter, opts);
+ }
+ } else {
+ traverseFast$1(subNode, enter, opts);
+ }
+ }
+ }
+
+
+ return traverseFast;
+ }
+
+ var removeProperties = {};
+
+ var hasRequiredRemoveProperties;
+
+ function requireRemoveProperties () {
+ if (hasRequiredRemoveProperties) return removeProperties;
+ hasRequiredRemoveProperties = 1;
+
+ Object.defineProperty(removeProperties, "__esModule", {
+ value: true
+ });
+ removeProperties.default = removeProperties$1;
+ var _index = requireConstants();
+ const CLEAR_KEYS = ["tokens", "start", "end", "loc", "raw", "rawValue"];
+ const CLEAR_KEYS_PLUS_COMMENTS = [..._index.COMMENT_KEYS, "comments", ...CLEAR_KEYS];
+ function removeProperties$1(node, opts = {}) {
+ const map = opts.preserveComments ? CLEAR_KEYS : CLEAR_KEYS_PLUS_COMMENTS;
+ for (const key of map) {
+ if (node[key] != null) node[key] = undefined;
+ }
+ for (const key of Object.keys(node)) {
+ if (key[0] === "_" && node[key] != null) node[key] = undefined;
+ }
+ const symbols = Object.getOwnPropertySymbols(node);
+ for (const sym of symbols) {
+ node[sym] = null;
+ }
+ }
+
+
+ return removeProperties;
+ }
+
+ var hasRequiredRemovePropertiesDeep;
+
+ function requireRemovePropertiesDeep () {
+ if (hasRequiredRemovePropertiesDeep) return removePropertiesDeep;
+ hasRequiredRemovePropertiesDeep = 1;
+
+ Object.defineProperty(removePropertiesDeep, "__esModule", {
+ value: true
+ });
+ removePropertiesDeep.default = removePropertiesDeep$1;
+ var _traverseFast = requireTraverseFast();
+ var _removeProperties = requireRemoveProperties();
+ function removePropertiesDeep$1(tree, opts) {
+ (0, _traverseFast.default)(tree, _removeProperties.default, opts);
+ return tree;
+ }
+
+
+ return removePropertiesDeep;
+ }
+
+ var hasRequiredToKeyAlias;
+
+ function requireToKeyAlias () {
+ if (hasRequiredToKeyAlias) return toKeyAlias;
+ hasRequiredToKeyAlias = 1;
+
+ Object.defineProperty(toKeyAlias, "__esModule", {
+ value: true
+ });
+ toKeyAlias.default = toKeyAlias$1;
+ var _index = requireGenerated$3();
+ var _cloneNode = requireCloneNode();
+ var _removePropertiesDeep = requireRemovePropertiesDeep();
+ function toKeyAlias$1(node, key = node.key) {
+ let alias;
+ if (node.kind === "method") {
+ return toKeyAlias$1.increment() + "";
+ } else if ((0, _index.isIdentifier)(key)) {
+ alias = key.name;
+ } else if ((0, _index.isStringLiteral)(key)) {
+ alias = JSON.stringify(key.value);
+ } else {
+ alias = JSON.stringify((0, _removePropertiesDeep.default)((0, _cloneNode.default)(key)));
+ }
+ if (node.computed) {
+ alias = `[${alias}]`;
+ }
+ if (node.static) {
+ alias = `static:${alias}`;
+ }
+ return alias;
+ }
+ toKeyAlias$1.uid = 0;
+ toKeyAlias$1.increment = function () {
+ if (toKeyAlias$1.uid >= Number.MAX_SAFE_INTEGER) {
+ return toKeyAlias$1.uid = 0;
+ } else {
+ return toKeyAlias$1.uid++;
+ }
+ };
+
+
+ return toKeyAlias;
+ }
+
+ var toSequenceExpression = {};
+
+ var gatherSequenceExpressions = {};
+
+ var getBindingIdentifiers = {};
+
+ var hasRequiredGetBindingIdentifiers;
+
+ function requireGetBindingIdentifiers () {
+ if (hasRequiredGetBindingIdentifiers) return getBindingIdentifiers;
+ hasRequiredGetBindingIdentifiers = 1;
+
+ Object.defineProperty(getBindingIdentifiers, "__esModule", {
+ value: true
+ });
+ getBindingIdentifiers.default = getBindingIdentifiers$1;
+ var _index = requireGenerated$3();
+ function getBindingIdentifiers$1(node, duplicates, outerOnly) {
+ const search = [].concat(node);
+ const ids = Object.create(null);
+ while (search.length) {
+ const id = search.shift();
+ if (!id) continue;
+ const keys = getBindingIdentifiers$1.keys[id.type];
+ if ((0, _index.isIdentifier)(id)) {
+ if (duplicates) {
+ const _ids = ids[id.name] = ids[id.name] || [];
+ _ids.push(id);
+ } else {
+ ids[id.name] = id;
+ }
+ continue;
+ }
+ if ((0, _index.isExportDeclaration)(id) && !(0, _index.isExportAllDeclaration)(id)) {
+ if ((0, _index.isDeclaration)(id.declaration)) {
+ search.push(id.declaration);
+ }
+ continue;
+ }
+ if (outerOnly) {
+ if ((0, _index.isFunctionDeclaration)(id)) {
+ search.push(id.id);
+ continue;
+ }
+ if ((0, _index.isFunctionExpression)(id)) {
+ continue;
+ }
+ }
+ if (keys) {
+ for (let i = 0; i < keys.length; i++) {
+ const key = keys[i];
+ const nodes = id[key];
+ if (nodes) {
+ Array.isArray(nodes) ? search.push(...nodes) : search.push(nodes);
+ }
+ }
+ }
+ }
+ return ids;
+ }
+ getBindingIdentifiers$1.keys = {
+ DeclareClass: ["id"],
+ DeclareFunction: ["id"],
+ DeclareModule: ["id"],
+ DeclareVariable: ["id"],
+ DeclareInterface: ["id"],
+ DeclareTypeAlias: ["id"],
+ DeclareOpaqueType: ["id"],
+ InterfaceDeclaration: ["id"],
+ TypeAlias: ["id"],
+ OpaqueType: ["id"],
+ CatchClause: ["param"],
+ LabeledStatement: ["label"],
+ UnaryExpression: ["argument"],
+ AssignmentExpression: ["left"],
+ ImportSpecifier: ["local"],
+ ImportNamespaceSpecifier: ["local"],
+ ImportDefaultSpecifier: ["local"],
+ ImportDeclaration: ["specifiers"],
+ ExportSpecifier: ["exported"],
+ ExportNamespaceSpecifier: ["exported"],
+ ExportDefaultSpecifier: ["exported"],
+ FunctionDeclaration: ["id", "params"],
+ FunctionExpression: ["id", "params"],
+ ArrowFunctionExpression: ["params"],
+ ObjectMethod: ["params"],
+ ClassMethod: ["params"],
+ ClassPrivateMethod: ["params"],
+ ForInStatement: ["left"],
+ ForOfStatement: ["left"],
+ ClassDeclaration: ["id"],
+ ClassExpression: ["id"],
+ RestElement: ["argument"],
+ UpdateExpression: ["argument"],
+ ObjectProperty: ["value"],
+ AssignmentPattern: ["left"],
+ ArrayPattern: ["elements"],
+ ObjectPattern: ["properties"],
+ VariableDeclaration: ["declarations"],
+ VariableDeclarator: ["id"]
+ };
+
+
+ return getBindingIdentifiers;
+ }
+
+ var hasRequiredGatherSequenceExpressions;
+
+ function requireGatherSequenceExpressions () {
+ if (hasRequiredGatherSequenceExpressions) return gatherSequenceExpressions;
+ hasRequiredGatherSequenceExpressions = 1;
+
+ Object.defineProperty(gatherSequenceExpressions, "__esModule", {
+ value: true
+ });
+ gatherSequenceExpressions.default = gatherSequenceExpressions$1;
+ var _getBindingIdentifiers = requireGetBindingIdentifiers();
+ var _index = requireGenerated$3();
+ var _index2 = requireGenerated$2();
+ var _cloneNode = requireCloneNode();
+ function gatherSequenceExpressions$1(nodes, scope, declars) {
+ const exprs = [];
+ let ensureLastUndefined = true;
+ for (const node of nodes) {
+ if (!(0, _index.isEmptyStatement)(node)) {
+ ensureLastUndefined = false;
+ }
+ if ((0, _index.isExpression)(node)) {
+ exprs.push(node);
+ } else if ((0, _index.isExpressionStatement)(node)) {
+ exprs.push(node.expression);
+ } else if ((0, _index.isVariableDeclaration)(node)) {
+ if (node.kind !== "var") return;
+ for (const declar of node.declarations) {
+ const bindings = (0, _getBindingIdentifiers.default)(declar);
+ for (const key of Object.keys(bindings)) {
+ declars.push({
+ kind: node.kind,
+ id: (0, _cloneNode.default)(bindings[key])
+ });
+ }
+ if (declar.init) {
+ exprs.push((0, _index2.assignmentExpression)("=", declar.id, declar.init));
+ }
+ }
+ ensureLastUndefined = true;
+ } else if ((0, _index.isIfStatement)(node)) {
+ const consequent = node.consequent ? gatherSequenceExpressions$1([node.consequent], scope, declars) : scope.buildUndefinedNode();
+ const alternate = node.alternate ? gatherSequenceExpressions$1([node.alternate], scope, declars) : scope.buildUndefinedNode();
+ if (!consequent || !alternate) return;
+ exprs.push((0, _index2.conditionalExpression)(node.test, consequent, alternate));
+ } else if ((0, _index.isBlockStatement)(node)) {
+ const body = gatherSequenceExpressions$1(node.body, scope, declars);
+ if (!body) return;
+ exprs.push(body);
+ } else if ((0, _index.isEmptyStatement)(node)) {
+ if (nodes.indexOf(node) === 0) {
+ ensureLastUndefined = true;
+ }
+ } else {
+ return;
+ }
+ }
+ if (ensureLastUndefined) {
+ exprs.push(scope.buildUndefinedNode());
+ }
+ if (exprs.length === 1) {
+ return exprs[0];
+ } else {
+ return (0, _index2.sequenceExpression)(exprs);
+ }
+ }
+
+
+ return gatherSequenceExpressions;
+ }
+
+ var hasRequiredToSequenceExpression;
+
+ function requireToSequenceExpression () {
+ if (hasRequiredToSequenceExpression) return toSequenceExpression;
+ hasRequiredToSequenceExpression = 1;
+
+ Object.defineProperty(toSequenceExpression, "__esModule", {
+ value: true
+ });
+ toSequenceExpression.default = toSequenceExpression$1;
+ var _gatherSequenceExpressions = requireGatherSequenceExpressions();
+ function toSequenceExpression$1(nodes, scope) {
+ if (!(nodes != null && nodes.length)) return;
+ const declars = [];
+ const result = (0, _gatherSequenceExpressions.default)(nodes, scope, declars);
+ if (!result) return;
+ for (const declar of declars) {
+ scope.push(declar);
+ }
+ return result;
+ }
+
+
+ return toSequenceExpression;
+ }
+
+ var toStatement = {};
+
+ var hasRequiredToStatement;
+
+ function requireToStatement () {
+ if (hasRequiredToStatement) return toStatement;
+ hasRequiredToStatement = 1;
+
+ Object.defineProperty(toStatement, "__esModule", {
+ value: true
+ });
+ toStatement.default = void 0;
+ var _index = requireGenerated$3();
+ var _index2 = requireGenerated$2();
+ var _default = toStatement$1;
+ toStatement.default = _default;
+ function toStatement$1(node, ignore) {
+ if ((0, _index.isStatement)(node)) {
+ return node;
+ }
+ let mustHaveId = false;
+ let newType;
+ if ((0, _index.isClass)(node)) {
+ mustHaveId = true;
+ newType = "ClassDeclaration";
+ } else if ((0, _index.isFunction)(node)) {
+ mustHaveId = true;
+ newType = "FunctionDeclaration";
+ } else if ((0, _index.isAssignmentExpression)(node)) {
+ return (0, _index2.expressionStatement)(node);
+ }
+ if (mustHaveId && !node.id) {
+ newType = false;
+ }
+ if (!newType) {
+ if (ignore) {
+ return false;
+ } else {
+ throw new Error(`cannot turn ${node.type} to a statement`);
+ }
+ }
+ node.type = newType;
+ return node;
+ }
+
+
+ return toStatement;
+ }
+
+ var valueToNode = {};
+
+ var hasRequiredValueToNode;
+
+ function requireValueToNode () {
+ if (hasRequiredValueToNode) return valueToNode;
+ hasRequiredValueToNode = 1;
+
+ Object.defineProperty(valueToNode, "__esModule", {
+ value: true
+ });
+ valueToNode.default = void 0;
+ var _isValidIdentifier = requireIsValidIdentifier();
+ var _index = requireGenerated$2();
+ var _default = valueToNode$1;
+ valueToNode.default = _default;
+ const objectToString = Function.call.bind(Object.prototype.toString);
+ function isRegExp(value) {
+ return objectToString(value) === "[object RegExp]";
+ }
+ function isPlainObject(value) {
+ if (typeof value !== "object" || value === null || Object.prototype.toString.call(value) !== "[object Object]") {
+ return false;
+ }
+ const proto = Object.getPrototypeOf(value);
+ return proto === null || Object.getPrototypeOf(proto) === null;
+ }
+ function valueToNode$1(value) {
+ if (value === undefined) {
+ return (0, _index.identifier)("undefined");
+ }
+ if (value === true || value === false) {
+ return (0, _index.booleanLiteral)(value);
+ }
+ if (value === null) {
+ return (0, _index.nullLiteral)();
+ }
+ if (typeof value === "string") {
+ return (0, _index.stringLiteral)(value);
+ }
+ if (typeof value === "number") {
+ let result;
+ if (Number.isFinite(value)) {
+ result = (0, _index.numericLiteral)(Math.abs(value));
+ } else {
+ let numerator;
+ if (Number.isNaN(value)) {
+ numerator = (0, _index.numericLiteral)(0);
+ } else {
+ numerator = (0, _index.numericLiteral)(1);
+ }
+ result = (0, _index.binaryExpression)("/", numerator, (0, _index.numericLiteral)(0));
+ }
+ if (value < 0 || Object.is(value, -0)) {
+ result = (0, _index.unaryExpression)("-", result);
+ }
+ return result;
+ }
+ if (isRegExp(value)) {
+ const pattern = value.source;
+ const flags = value.toString().match(/\/([a-z]+|)$/)[1];
+ return (0, _index.regExpLiteral)(pattern, flags);
+ }
+ if (Array.isArray(value)) {
+ return (0, _index.arrayExpression)(value.map(valueToNode$1));
+ }
+ if (isPlainObject(value)) {
+ const props = [];
+ for (const key of Object.keys(value)) {
+ let nodeKey;
+ if ((0, _isValidIdentifier.default)(key)) {
+ nodeKey = (0, _index.identifier)(key);
+ } else {
+ nodeKey = (0, _index.stringLiteral)(key);
+ }
+ props.push((0, _index.objectProperty)(nodeKey, valueToNode$1(value[key])));
+ }
+ return (0, _index.objectExpression)(props);
+ }
+ throw new Error("don't know how to turn this value into a node");
+ }
+
+
+ return valueToNode;
+ }
+
+ var appendToMemberExpression = {};
+
+ var hasRequiredAppendToMemberExpression;
+
+ function requireAppendToMemberExpression () {
+ if (hasRequiredAppendToMemberExpression) return appendToMemberExpression;
+ hasRequiredAppendToMemberExpression = 1;
+
+ Object.defineProperty(appendToMemberExpression, "__esModule", {
+ value: true
+ });
+ appendToMemberExpression.default = appendToMemberExpression$1;
+ var _index = requireGenerated$2();
+ function appendToMemberExpression$1(member, append, computed = false) {
+ member.object = (0, _index.memberExpression)(member.object, member.property, member.computed);
+ member.property = append;
+ member.computed = !!computed;
+ return member;
+ }
+
+
+ return appendToMemberExpression;
+ }
+
+ var inherits = {};
+
+ var hasRequiredInherits;
+
+ function requireInherits () {
+ if (hasRequiredInherits) return inherits;
+ hasRequiredInherits = 1;
+
+ Object.defineProperty(inherits, "__esModule", {
+ value: true
+ });
+ inherits.default = inherits$1;
+ var _index = requireConstants();
+ var _inheritsComments = requireInheritsComments();
+ function inherits$1(child, parent) {
+ if (!child || !parent) return child;
+ for (const key of _index.INHERIT_KEYS.optional) {
+ if (child[key] == null) {
+ child[key] = parent[key];
+ }
+ }
+ for (const key of Object.keys(parent)) {
+ if (key[0] === "_" && key !== "__clone") {
+ child[key] = parent[key];
+ }
+ }
+ for (const key of _index.INHERIT_KEYS.force) {
+ child[key] = parent[key];
+ }
+ (0, _inheritsComments.default)(child, parent);
+ return child;
+ }
+
+
+ return inherits;
+ }
+
+ var prependToMemberExpression = {};
+
+ var hasRequiredPrependToMemberExpression;
+
+ function requirePrependToMemberExpression () {
+ if (hasRequiredPrependToMemberExpression) return prependToMemberExpression;
+ hasRequiredPrependToMemberExpression = 1;
+
+ Object.defineProperty(prependToMemberExpression, "__esModule", {
+ value: true
+ });
+ prependToMemberExpression.default = prependToMemberExpression$1;
+ var _index = requireGenerated$2();
+ var _index2 = requireLib$2();
+ function prependToMemberExpression$1(member, prepend) {
+ if ((0, _index2.isSuper)(member.object)) {
+ throw new Error("Cannot prepend node to super property access (`super.foo`).");
+ }
+ member.object = (0, _index.memberExpression)(prepend, member.object);
+ return member;
+ }
+
+
+ return prependToMemberExpression;
+ }
+
+ var getOuterBindingIdentifiers = {};
+
+ var hasRequiredGetOuterBindingIdentifiers;
+
+ function requireGetOuterBindingIdentifiers () {
+ if (hasRequiredGetOuterBindingIdentifiers) return getOuterBindingIdentifiers;
+ hasRequiredGetOuterBindingIdentifiers = 1;
+
+ Object.defineProperty(getOuterBindingIdentifiers, "__esModule", {
+ value: true
+ });
+ getOuterBindingIdentifiers.default = void 0;
+ var _getBindingIdentifiers = requireGetBindingIdentifiers();
+ var _default = getOuterBindingIdentifiers$1;
+ getOuterBindingIdentifiers.default = _default;
+ function getOuterBindingIdentifiers$1(node, duplicates) {
+ return (0, _getBindingIdentifiers.default)(node, duplicates, true);
+ }
+
+
+ return getOuterBindingIdentifiers;
+ }
+
+ var traverse = {};
+
+ var hasRequiredTraverse;
+
+ function requireTraverse () {
+ if (hasRequiredTraverse) return traverse;
+ hasRequiredTraverse = 1;
+
+ Object.defineProperty(traverse, "__esModule", {
+ value: true
+ });
+ traverse.default = traverse$1;
+ var _index = requireDefinitions();
+ function traverse$1(node, handlers, state) {
+ if (typeof handlers === "function") {
+ handlers = {
+ enter: handlers
+ };
+ }
+ const {
+ enter,
+ exit
+ } = handlers;
+ traverseSimpleImpl(node, enter, exit, state, []);
+ }
+ function traverseSimpleImpl(node, enter, exit, state, ancestors) {
+ const keys = _index.VISITOR_KEYS[node.type];
+ if (!keys) return;
+ if (enter) enter(node, ancestors, state);
+ for (const key of keys) {
+ const subNode = node[key];
+ if (Array.isArray(subNode)) {
+ for (let i = 0; i < subNode.length; i++) {
+ const child = subNode[i];
+ if (!child) continue;
+ ancestors.push({
+ node,
+ key,
+ index: i
+ });
+ traverseSimpleImpl(child, enter, exit, state, ancestors);
+ ancestors.pop();
+ }
+ } else if (subNode) {
+ ancestors.push({
+ node,
+ key
+ });
+ traverseSimpleImpl(subNode, enter, exit, state, ancestors);
+ ancestors.pop();
+ }
+ }
+ if (exit) exit(node, ancestors, state);
+ }
+
+
+ return traverse;
+ }
+
+ var isBinding = {};
+
+ var hasRequiredIsBinding;
+
+ function requireIsBinding () {
+ if (hasRequiredIsBinding) return isBinding;
+ hasRequiredIsBinding = 1;
+
+ Object.defineProperty(isBinding, "__esModule", {
+ value: true
+ });
+ isBinding.default = isBinding$1;
+ var _getBindingIdentifiers = requireGetBindingIdentifiers();
+ function isBinding$1(node, parent, grandparent) {
+ if (grandparent && node.type === "Identifier" && parent.type === "ObjectProperty" && grandparent.type === "ObjectExpression") {
+ return false;
+ }
+ const keys = _getBindingIdentifiers.default.keys[parent.type];
+ if (keys) {
+ for (let i = 0; i < keys.length; i++) {
+ const key = keys[i];
+ const val = parent[key];
+ if (Array.isArray(val)) {
+ if (val.indexOf(node) >= 0) return true;
+ } else {
+ if (val === node) return true;
+ }
+ }
+ }
+ return false;
+ }
+
+
+ return isBinding;
+ }
+
+ var isBlockScoped = {};
+
+ var isLet = {};
+
+ var hasRequiredIsLet;
+
+ function requireIsLet () {
+ if (hasRequiredIsLet) return isLet;
+ hasRequiredIsLet = 1;
+
+ Object.defineProperty(isLet, "__esModule", {
+ value: true
+ });
+ isLet.default = isLet$1;
+ var _index = requireGenerated$3();
+ var _index2 = requireConstants();
+ function isLet$1(node) {
+ return (0, _index.isVariableDeclaration)(node) && (node.kind !== "var" || node[_index2.BLOCK_SCOPED_SYMBOL]);
+ }
+
+
+ return isLet;
+ }
+
+ var hasRequiredIsBlockScoped;
+
+ function requireIsBlockScoped () {
+ if (hasRequiredIsBlockScoped) return isBlockScoped;
+ hasRequiredIsBlockScoped = 1;
+
+ Object.defineProperty(isBlockScoped, "__esModule", {
+ value: true
+ });
+ isBlockScoped.default = isBlockScoped$1;
+ var _index = requireGenerated$3();
+ var _isLet = requireIsLet();
+ function isBlockScoped$1(node) {
+ return (0, _index.isFunctionDeclaration)(node) || (0, _index.isClassDeclaration)(node) || (0, _isLet.default)(node);
+ }
+
+
+ return isBlockScoped;
+ }
+
+ var isImmutable = {};
+
+ var hasRequiredIsImmutable;
+
+ function requireIsImmutable () {
+ if (hasRequiredIsImmutable) return isImmutable;
+ hasRequiredIsImmutable = 1;
+
+ Object.defineProperty(isImmutable, "__esModule", {
+ value: true
+ });
+ isImmutable.default = isImmutable$1;
+ var _isType = requireIsType();
+ var _index = requireGenerated$3();
+ function isImmutable$1(node) {
+ if ((0, _isType.default)(node.type, "Immutable")) return true;
+ if ((0, _index.isIdentifier)(node)) {
+ if (node.name === "undefined") {
+ return true;
+ } else {
+ return false;
+ }
+ }
+ return false;
+ }
+
+
+ return isImmutable;
+ }
+
+ var isNodesEquivalent = {};
+
+ var hasRequiredIsNodesEquivalent;
+
+ function requireIsNodesEquivalent () {
+ if (hasRequiredIsNodesEquivalent) return isNodesEquivalent;
+ hasRequiredIsNodesEquivalent = 1;
+
+ Object.defineProperty(isNodesEquivalent, "__esModule", {
+ value: true
+ });
+ isNodesEquivalent.default = isNodesEquivalent$1;
+ var _index = requireDefinitions();
+ function isNodesEquivalent$1(a, b) {
+ if (typeof a !== "object" || typeof b !== "object" || a == null || b == null) {
+ return a === b;
+ }
+ if (a.type !== b.type) {
+ return false;
+ }
+ const fields = Object.keys(_index.NODE_FIELDS[a.type] || a.type);
+ const visitorKeys = _index.VISITOR_KEYS[a.type];
+ for (const field of fields) {
+ const val_a = a[field];
+ const val_b = b[field];
+ if (typeof val_a !== typeof val_b) {
+ return false;
+ }
+ if (val_a == null && val_b == null) {
+ continue;
+ } else if (val_a == null || val_b == null) {
+ return false;
+ }
+ if (Array.isArray(val_a)) {
+ if (!Array.isArray(val_b)) {
+ return false;
+ }
+ if (val_a.length !== val_b.length) {
+ return false;
+ }
+ for (let i = 0; i < val_a.length; i++) {
+ if (!isNodesEquivalent$1(val_a[i], val_b[i])) {
+ return false;
+ }
+ }
+ continue;
+ }
+ if (typeof val_a === "object" && !(visitorKeys != null && visitorKeys.includes(field))) {
+ for (const key of Object.keys(val_a)) {
+ if (val_a[key] !== val_b[key]) {
+ return false;
+ }
+ }
+ continue;
+ }
+ if (!isNodesEquivalent$1(val_a, val_b)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+
+ return isNodesEquivalent;
+ }
+
+ var isReferenced = {};
+
+ var hasRequiredIsReferenced;
+
+ function requireIsReferenced () {
+ if (hasRequiredIsReferenced) return isReferenced;
+ hasRequiredIsReferenced = 1;
+
+ Object.defineProperty(isReferenced, "__esModule", {
+ value: true
+ });
+ isReferenced.default = isReferenced$1;
+ function isReferenced$1(node, parent, grandparent) {
+ switch (parent.type) {
+ case "MemberExpression":
+ case "OptionalMemberExpression":
+ if (parent.property === node) {
+ return !!parent.computed;
+ }
+ return parent.object === node;
+ case "JSXMemberExpression":
+ return parent.object === node;
+ case "VariableDeclarator":
+ return parent.init === node;
+ case "ArrowFunctionExpression":
+ return parent.body === node;
+ case "PrivateName":
+ return false;
+ case "ClassMethod":
+ case "ClassPrivateMethod":
+ case "ObjectMethod":
+ if (parent.key === node) {
+ return !!parent.computed;
+ }
+ return false;
+ case "ObjectProperty":
+ if (parent.key === node) {
+ return !!parent.computed;
+ }
+ return !grandparent || grandparent.type !== "ObjectPattern";
+ case "ClassProperty":
+ case "ClassAccessorProperty":
+ if (parent.key === node) {
+ return !!parent.computed;
+ }
+ return true;
+ case "ClassPrivateProperty":
+ return parent.key !== node;
+ case "ClassDeclaration":
+ case "ClassExpression":
+ return parent.superClass === node;
+ case "AssignmentExpression":
+ return parent.right === node;
+ case "AssignmentPattern":
+ return parent.right === node;
+ case "LabeledStatement":
+ return false;
+ case "CatchClause":
+ return false;
+ case "RestElement":
+ return false;
+ case "BreakStatement":
+ case "ContinueStatement":
+ return false;
+ case "FunctionDeclaration":
+ case "FunctionExpression":
+ return false;
+ case "ExportNamespaceSpecifier":
+ case "ExportDefaultSpecifier":
+ return false;
+ case "ExportSpecifier":
+ if (grandparent != null && grandparent.source) {
+ return false;
+ }
+ return parent.local === node;
+ case "ImportDefaultSpecifier":
+ case "ImportNamespaceSpecifier":
+ case "ImportSpecifier":
+ return false;
+ case "ImportAttribute":
+ return false;
+ case "JSXAttribute":
+ return false;
+ case "ObjectPattern":
+ case "ArrayPattern":
+ return false;
+ case "MetaProperty":
+ return false;
+ case "ObjectTypeProperty":
+ return parent.key !== node;
+ case "TSEnumMember":
+ return parent.id !== node;
+ case "TSPropertySignature":
+ if (parent.key === node) {
+ return !!parent.computed;
+ }
+ return true;
+ }
+ return true;
+ }
+
+
+ return isReferenced;
+ }
+
+ var isScope = {};
+
+ var hasRequiredIsScope;
+
+ function requireIsScope () {
+ if (hasRequiredIsScope) return isScope;
+ hasRequiredIsScope = 1;
+
+ Object.defineProperty(isScope, "__esModule", {
+ value: true
+ });
+ isScope.default = isScope$1;
+ var _index = requireGenerated$3();
+ function isScope$1(node, parent) {
+ if ((0, _index.isBlockStatement)(node) && ((0, _index.isFunction)(parent) || (0, _index.isCatchClause)(parent))) {
+ return false;
+ }
+ if ((0, _index.isPattern)(node) && ((0, _index.isFunction)(parent) || (0, _index.isCatchClause)(parent))) {
+ return true;
+ }
+ return (0, _index.isScopable)(node);
+ }
+
+
+ return isScope;
+ }
+
+ var isSpecifierDefault = {};
+
+ var hasRequiredIsSpecifierDefault;
+
+ function requireIsSpecifierDefault () {
+ if (hasRequiredIsSpecifierDefault) return isSpecifierDefault;
+ hasRequiredIsSpecifierDefault = 1;
+
+ Object.defineProperty(isSpecifierDefault, "__esModule", {
+ value: true
+ });
+ isSpecifierDefault.default = isSpecifierDefault$1;
+ var _index = requireGenerated$3();
+ function isSpecifierDefault$1(specifier) {
+ return (0, _index.isImportDefaultSpecifier)(specifier) || (0, _index.isIdentifier)(specifier.imported || specifier.exported, {
+ name: "default"
+ });
+ }
+
+
+ return isSpecifierDefault;
+ }
+
+ var isValidES3Identifier = {};
+
+ var hasRequiredIsValidES3Identifier;
+
+ function requireIsValidES3Identifier () {
+ if (hasRequiredIsValidES3Identifier) return isValidES3Identifier;
+ hasRequiredIsValidES3Identifier = 1;
+
+ Object.defineProperty(isValidES3Identifier, "__esModule", {
+ value: true
+ });
+ isValidES3Identifier.default = isValidES3Identifier$1;
+ var _isValidIdentifier = requireIsValidIdentifier();
+ const RESERVED_WORDS_ES3_ONLY = new Set(["abstract", "boolean", "byte", "char", "double", "enum", "final", "float", "goto", "implements", "int", "interface", "long", "native", "package", "private", "protected", "public", "short", "static", "synchronized", "throws", "transient", "volatile"]);
+ function isValidES3Identifier$1(name) {
+ return (0, _isValidIdentifier.default)(name) && !RESERVED_WORDS_ES3_ONLY.has(name);
+ }
+
+
+ return isValidES3Identifier;
+ }
+
+ var isVar = {};
+
+ var hasRequiredIsVar;
+
+ function requireIsVar () {
+ if (hasRequiredIsVar) return isVar;
+ hasRequiredIsVar = 1;
+
+ Object.defineProperty(isVar, "__esModule", {
+ value: true
+ });
+ isVar.default = isVar$1;
+ var _index = requireGenerated$3();
+ var _index2 = requireConstants();
+ function isVar$1(node) {
+ return (0, _index.isVariableDeclaration)(node, {
+ kind: "var"
+ }) && !node[_index2.BLOCK_SCOPED_SYMBOL];
+ }
+
+
+ return isVar;
+ }
+
+ var hasRequiredLib$2;
+
+ function requireLib$2 () {
+ if (hasRequiredLib$2) return lib$4;
+ hasRequiredLib$2 = 1;
+ (function (exports) {
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ var _exportNames = {
+ react: true,
+ assertNode: true,
+ createTypeAnnotationBasedOnTypeof: true,
+ createUnionTypeAnnotation: true,
+ createFlowUnionType: true,
+ createTSUnionType: true,
+ cloneNode: true,
+ clone: true,
+ cloneDeep: true,
+ cloneDeepWithoutLoc: true,
+ cloneWithoutLoc: true,
+ addComment: true,
+ addComments: true,
+ inheritInnerComments: true,
+ inheritLeadingComments: true,
+ inheritsComments: true,
+ inheritTrailingComments: true,
+ removeComments: true,
+ ensureBlock: true,
+ toBindingIdentifierName: true,
+ toBlock: true,
+ toComputedKey: true,
+ toExpression: true,
+ toIdentifier: true,
+ toKeyAlias: true,
+ toSequenceExpression: true,
+ toStatement: true,
+ valueToNode: true,
+ appendToMemberExpression: true,
+ inherits: true,
+ prependToMemberExpression: true,
+ removeProperties: true,
+ removePropertiesDeep: true,
+ removeTypeDuplicates: true,
+ getBindingIdentifiers: true,
+ getOuterBindingIdentifiers: true,
+ traverse: true,
+ traverseFast: true,
+ shallowEqual: true,
+ is: true,
+ isBinding: true,
+ isBlockScoped: true,
+ isImmutable: true,
+ isLet: true,
+ isNode: true,
+ isNodesEquivalent: true,
+ isPlaceholderType: true,
+ isReferenced: true,
+ isScope: true,
+ isSpecifierDefault: true,
+ isType: true,
+ isValidES3Identifier: true,
+ isValidIdentifier: true,
+ isVar: true,
+ matchesPattern: true,
+ validate: true,
+ buildMatchMemberExpression: true,
+ __internal__deprecationWarning: true
+ };
+ Object.defineProperty(exports, "__internal__deprecationWarning", {
+ enumerable: true,
+ get: function () {
+ return _deprecationWarning.default;
+ }
+ });
+ Object.defineProperty(exports, "addComment", {
+ enumerable: true,
+ get: function () {
+ return _addComment.default;
+ }
+ });
+ Object.defineProperty(exports, "addComments", {
+ enumerable: true,
+ get: function () {
+ return _addComments.default;
+ }
+ });
+ Object.defineProperty(exports, "appendToMemberExpression", {
+ enumerable: true,
+ get: function () {
+ return _appendToMemberExpression.default;
+ }
+ });
+ Object.defineProperty(exports, "assertNode", {
+ enumerable: true,
+ get: function () {
+ return _assertNode.default;
+ }
+ });
+ Object.defineProperty(exports, "buildMatchMemberExpression", {
+ enumerable: true,
+ get: function () {
+ return _buildMatchMemberExpression.default;
+ }
+ });
+ Object.defineProperty(exports, "clone", {
+ enumerable: true,
+ get: function () {
+ return _clone.default;
+ }
+ });
+ Object.defineProperty(exports, "cloneDeep", {
+ enumerable: true,
+ get: function () {
+ return _cloneDeep.default;
+ }
+ });
+ Object.defineProperty(exports, "cloneDeepWithoutLoc", {
+ enumerable: true,
+ get: function () {
+ return _cloneDeepWithoutLoc.default;
+ }
+ });
+ Object.defineProperty(exports, "cloneNode", {
+ enumerable: true,
+ get: function () {
+ return _cloneNode.default;
+ }
+ });
+ Object.defineProperty(exports, "cloneWithoutLoc", {
+ enumerable: true,
+ get: function () {
+ return _cloneWithoutLoc.default;
+ }
+ });
+ Object.defineProperty(exports, "createFlowUnionType", {
+ enumerable: true,
+ get: function () {
+ return _createFlowUnionType.default;
+ }
+ });
+ Object.defineProperty(exports, "createTSUnionType", {
+ enumerable: true,
+ get: function () {
+ return _createTSUnionType.default;
+ }
+ });
+ Object.defineProperty(exports, "createTypeAnnotationBasedOnTypeof", {
+ enumerable: true,
+ get: function () {
+ return _createTypeAnnotationBasedOnTypeof.default;
+ }
+ });
+ Object.defineProperty(exports, "createUnionTypeAnnotation", {
+ enumerable: true,
+ get: function () {
+ return _createFlowUnionType.default;
+ }
+ });
+ Object.defineProperty(exports, "ensureBlock", {
+ enumerable: true,
+ get: function () {
+ return _ensureBlock.default;
+ }
+ });
+ Object.defineProperty(exports, "getBindingIdentifiers", {
+ enumerable: true,
+ get: function () {
+ return _getBindingIdentifiers.default;
+ }
+ });
+ Object.defineProperty(exports, "getOuterBindingIdentifiers", {
+ enumerable: true,
+ get: function () {
+ return _getOuterBindingIdentifiers.default;
+ }
+ });
+ Object.defineProperty(exports, "inheritInnerComments", {
+ enumerable: true,
+ get: function () {
+ return _inheritInnerComments.default;
+ }
+ });
+ Object.defineProperty(exports, "inheritLeadingComments", {
+ enumerable: true,
+ get: function () {
+ return _inheritLeadingComments.default;
+ }
+ });
+ Object.defineProperty(exports, "inheritTrailingComments", {
+ enumerable: true,
+ get: function () {
+ return _inheritTrailingComments.default;
+ }
+ });
+ Object.defineProperty(exports, "inherits", {
+ enumerable: true,
+ get: function () {
+ return _inherits.default;
+ }
+ });
+ Object.defineProperty(exports, "inheritsComments", {
+ enumerable: true,
+ get: function () {
+ return _inheritsComments.default;
+ }
+ });
+ Object.defineProperty(exports, "is", {
+ enumerable: true,
+ get: function () {
+ return _is.default;
+ }
+ });
+ Object.defineProperty(exports, "isBinding", {
+ enumerable: true,
+ get: function () {
+ return _isBinding.default;
+ }
+ });
+ Object.defineProperty(exports, "isBlockScoped", {
+ enumerable: true,
+ get: function () {
+ return _isBlockScoped.default;
+ }
+ });
+ Object.defineProperty(exports, "isImmutable", {
+ enumerable: true,
+ get: function () {
+ return _isImmutable.default;
+ }
+ });
+ Object.defineProperty(exports, "isLet", {
+ enumerable: true,
+ get: function () {
+ return _isLet.default;
+ }
+ });
+ Object.defineProperty(exports, "isNode", {
+ enumerable: true,
+ get: function () {
+ return _isNode.default;
+ }
+ });
+ Object.defineProperty(exports, "isNodesEquivalent", {
+ enumerable: true,
+ get: function () {
+ return _isNodesEquivalent.default;
+ }
+ });
+ Object.defineProperty(exports, "isPlaceholderType", {
+ enumerable: true,
+ get: function () {
+ return _isPlaceholderType.default;
+ }
+ });
+ Object.defineProperty(exports, "isReferenced", {
+ enumerable: true,
+ get: function () {
+ return _isReferenced.default;
+ }
+ });
+ Object.defineProperty(exports, "isScope", {
+ enumerable: true,
+ get: function () {
+ return _isScope.default;
+ }
+ });
+ Object.defineProperty(exports, "isSpecifierDefault", {
+ enumerable: true,
+ get: function () {
+ return _isSpecifierDefault.default;
+ }
+ });
+ Object.defineProperty(exports, "isType", {
+ enumerable: true,
+ get: function () {
+ return _isType.default;
+ }
+ });
+ Object.defineProperty(exports, "isValidES3Identifier", {
+ enumerable: true,
+ get: function () {
+ return _isValidES3Identifier.default;
+ }
+ });
+ Object.defineProperty(exports, "isValidIdentifier", {
+ enumerable: true,
+ get: function () {
+ return _isValidIdentifier.default;
+ }
+ });
+ Object.defineProperty(exports, "isVar", {
+ enumerable: true,
+ get: function () {
+ return _isVar.default;
+ }
+ });
+ Object.defineProperty(exports, "matchesPattern", {
+ enumerable: true,
+ get: function () {
+ return _matchesPattern.default;
+ }
+ });
+ Object.defineProperty(exports, "prependToMemberExpression", {
+ enumerable: true,
+ get: function () {
+ return _prependToMemberExpression.default;
+ }
+ });
+ exports.react = void 0;
+ Object.defineProperty(exports, "removeComments", {
+ enumerable: true,
+ get: function () {
+ return _removeComments.default;
+ }
+ });
+ Object.defineProperty(exports, "removeProperties", {
+ enumerable: true,
+ get: function () {
+ return _removeProperties.default;
+ }
+ });
+ Object.defineProperty(exports, "removePropertiesDeep", {
+ enumerable: true,
+ get: function () {
+ return _removePropertiesDeep.default;
+ }
+ });
+ Object.defineProperty(exports, "removeTypeDuplicates", {
+ enumerable: true,
+ get: function () {
+ return _removeTypeDuplicates.default;
+ }
+ });
+ Object.defineProperty(exports, "shallowEqual", {
+ enumerable: true,
+ get: function () {
+ return _shallowEqual.default;
+ }
+ });
+ Object.defineProperty(exports, "toBindingIdentifierName", {
+ enumerable: true,
+ get: function () {
+ return _toBindingIdentifierName.default;
+ }
+ });
+ Object.defineProperty(exports, "toBlock", {
+ enumerable: true,
+ get: function () {
+ return _toBlock.default;
+ }
+ });
+ Object.defineProperty(exports, "toComputedKey", {
+ enumerable: true,
+ get: function () {
+ return _toComputedKey.default;
+ }
+ });
+ Object.defineProperty(exports, "toExpression", {
+ enumerable: true,
+ get: function () {
+ return _toExpression.default;
+ }
+ });
+ Object.defineProperty(exports, "toIdentifier", {
+ enumerable: true,
+ get: function () {
+ return _toIdentifier.default;
+ }
+ });
+ Object.defineProperty(exports, "toKeyAlias", {
+ enumerable: true,
+ get: function () {
+ return _toKeyAlias.default;
+ }
+ });
+ Object.defineProperty(exports, "toSequenceExpression", {
+ enumerable: true,
+ get: function () {
+ return _toSequenceExpression.default;
+ }
+ });
+ Object.defineProperty(exports, "toStatement", {
+ enumerable: true,
+ get: function () {
+ return _toStatement.default;
+ }
+ });
+ Object.defineProperty(exports, "traverse", {
+ enumerable: true,
+ get: function () {
+ return _traverse.default;
+ }
+ });
+ Object.defineProperty(exports, "traverseFast", {
+ enumerable: true,
+ get: function () {
+ return _traverseFast.default;
+ }
+ });
+ Object.defineProperty(exports, "validate", {
+ enumerable: true,
+ get: function () {
+ return _validate.default;
+ }
+ });
+ Object.defineProperty(exports, "valueToNode", {
+ enumerable: true,
+ get: function () {
+ return _valueToNode.default;
+ }
+ });
+ var _isReactComponent = requireIsReactComponent();
+ var _isCompatTag = requireIsCompatTag();
+ var _buildChildren = requireBuildChildren();
+ var _assertNode = requireAssertNode();
+ var _index = requireGenerated$1();
+ Object.keys(_index).forEach(function (key) {
+ if (key === "default" || key === "__esModule") return;
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
+ if (key in exports && exports[key] === _index[key]) return;
+ Object.defineProperty(exports, key, {
+ enumerable: true,
+ get: function () {
+ return _index[key];
+ }
+ });
+ });
+ var _createTypeAnnotationBasedOnTypeof = requireCreateTypeAnnotationBasedOnTypeof();
+ var _createFlowUnionType = requireCreateFlowUnionType();
+ var _createTSUnionType = requireCreateTSUnionType();
+ var _index2 = requireGenerated$2();
+ Object.keys(_index2).forEach(function (key) {
+ if (key === "default" || key === "__esModule") return;
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
+ if (key in exports && exports[key] === _index2[key]) return;
+ Object.defineProperty(exports, key, {
+ enumerable: true,
+ get: function () {
+ return _index2[key];
+ }
+ });
+ });
+ var _uppercase = requireUppercase();
+ Object.keys(_uppercase).forEach(function (key) {
+ if (key === "default" || key === "__esModule") return;
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
+ if (key in exports && exports[key] === _uppercase[key]) return;
+ Object.defineProperty(exports, key, {
+ enumerable: true,
+ get: function () {
+ return _uppercase[key];
+ }
+ });
+ });
+ var _productions = requireProductions();
+ Object.keys(_productions).forEach(function (key) {
+ if (key === "default" || key === "__esModule") return;
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
+ if (key in exports && exports[key] === _productions[key]) return;
+ Object.defineProperty(exports, key, {
+ enumerable: true,
+ get: function () {
+ return _productions[key];
+ }
+ });
+ });
+ var _cloneNode = requireCloneNode();
+ var _clone = requireClone();
+ var _cloneDeep = requireCloneDeep();
+ var _cloneDeepWithoutLoc = requireCloneDeepWithoutLoc();
+ var _cloneWithoutLoc = requireCloneWithoutLoc();
+ var _addComment = requireAddComment();
+ var _addComments = requireAddComments();
+ var _inheritInnerComments = requireInheritInnerComments();
+ var _inheritLeadingComments = requireInheritLeadingComments();
+ var _inheritsComments = requireInheritsComments();
+ var _inheritTrailingComments = requireInheritTrailingComments();
+ var _removeComments = requireRemoveComments();
+ var _index3 = requireGenerated();
+ Object.keys(_index3).forEach(function (key) {
+ if (key === "default" || key === "__esModule") return;
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
+ if (key in exports && exports[key] === _index3[key]) return;
+ Object.defineProperty(exports, key, {
+ enumerable: true,
+ get: function () {
+ return _index3[key];
+ }
+ });
+ });
+ var _index4 = requireConstants();
+ Object.keys(_index4).forEach(function (key) {
+ if (key === "default" || key === "__esModule") return;
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
+ if (key in exports && exports[key] === _index4[key]) return;
+ Object.defineProperty(exports, key, {
+ enumerable: true,
+ get: function () {
+ return _index4[key];
+ }
+ });
+ });
+ var _ensureBlock = requireEnsureBlock();
+ var _toBindingIdentifierName = requireToBindingIdentifierName();
+ var _toBlock = requireToBlock();
+ var _toComputedKey = requireToComputedKey();
+ var _toExpression = requireToExpression();
+ var _toIdentifier = requireToIdentifier();
+ var _toKeyAlias = requireToKeyAlias();
+ var _toSequenceExpression = requireToSequenceExpression();
+ var _toStatement = requireToStatement();
+ var _valueToNode = requireValueToNode();
+ var _index5 = requireDefinitions();
+ Object.keys(_index5).forEach(function (key) {
+ if (key === "default" || key === "__esModule") return;
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
+ if (key in exports && exports[key] === _index5[key]) return;
+ Object.defineProperty(exports, key, {
+ enumerable: true,
+ get: function () {
+ return _index5[key];
+ }
+ });
+ });
+ var _appendToMemberExpression = requireAppendToMemberExpression();
+ var _inherits = requireInherits();
+ var _prependToMemberExpression = requirePrependToMemberExpression();
+ var _removeProperties = requireRemoveProperties();
+ var _removePropertiesDeep = requireRemovePropertiesDeep();
+ var _removeTypeDuplicates = requireRemoveTypeDuplicates$1();
+ var _getBindingIdentifiers = requireGetBindingIdentifiers();
+ var _getOuterBindingIdentifiers = requireGetOuterBindingIdentifiers();
+ var _traverse = requireTraverse();
+ Object.keys(_traverse).forEach(function (key) {
+ if (key === "default" || key === "__esModule") return;
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
+ if (key in exports && exports[key] === _traverse[key]) return;
+ Object.defineProperty(exports, key, {
+ enumerable: true,
+ get: function () {
+ return _traverse[key];
+ }
+ });
+ });
+ var _traverseFast = requireTraverseFast();
+ var _shallowEqual = requireShallowEqual();
+ var _is = requireIs();
+ var _isBinding = requireIsBinding();
+ var _isBlockScoped = requireIsBlockScoped();
+ var _isImmutable = requireIsImmutable();
+ var _isLet = requireIsLet();
+ var _isNode = requireIsNode();
+ var _isNodesEquivalent = requireIsNodesEquivalent();
+ var _isPlaceholderType = requireIsPlaceholderType();
+ var _isReferenced = requireIsReferenced();
+ var _isScope = requireIsScope();
+ var _isSpecifierDefault = requireIsSpecifierDefault();
+ var _isType = requireIsType();
+ var _isValidES3Identifier = requireIsValidES3Identifier();
+ var _isValidIdentifier = requireIsValidIdentifier();
+ var _isVar = requireIsVar();
+ var _matchesPattern = requireMatchesPattern();
+ var _validate = requireValidate();
+ var _buildMatchMemberExpression = requireBuildMatchMemberExpression();
+ var _index6 = requireGenerated$3();
+ Object.keys(_index6).forEach(function (key) {
+ if (key === "default" || key === "__esModule") return;
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
+ if (key in exports && exports[key] === _index6[key]) return;
+ Object.defineProperty(exports, key, {
+ enumerable: true,
+ get: function () {
+ return _index6[key];
+ }
+ });
+ });
+ var _deprecationWarning = requireDeprecationWarning();
+ const react = {
+ isReactComponent: _isReactComponent.default,
+ isCompatTag: _isCompatTag.default,
+ buildChildren: _buildChildren.default
+ };
+ exports.react = react;
+
+
+ } (lib$4));
+ return lib$4;
+ }
+
+ var libExports$2 = requireLib$2();
+
+ /* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+ function createSimplePath(ancestors) {
+ if (ancestors.length === 0) {
+ return null;
+ }
+
+ // Slice the array because babel-types traverse may continue mutating
+ // the ancestors array in later traversal logic.
+ return new SimplePath(ancestors.slice());
+ }
+
+ /**
+ * Mimics @babel/traverse's NodePath API in a simpler fashion that isn't as
+ * heavy, but still allows the ease of passing paths around to process nested
+ * AST structures.
+ */
+ class SimplePath {
+ _index;
+ _ancestors;
+ _ancestor;
+
+ _parentPath;
+
+ constructor(ancestors, index = ancestors.length - 1) {
+ if (index < 0 || index >= ancestors.length) {
+ console.error(ancestors);
+ throw new Error("Created invalid path");
+ }
+
+ this._ancestors = ancestors;
+ this._ancestor = ancestors[index];
+ this._index = index;
+ }
+
+ get parentPath() {
+ let path = this._parentPath;
+ if (path === undefined) {
+ if (this._index === 0) {
+ path = null;
+ } else {
+ path = new SimplePath(this._ancestors, this._index - 1);
+ }
+ this._parentPath = path;
+ }
+
+ return path;
+ }
+
+ get parent() {
+ return this._ancestor.node;
+ }
+
+ get node() {
+ const { node, key, index } = this._ancestor;
+
+ if (typeof index === "number") {
+ return node[key][index];
+ }
+
+ return node[key];
+ }
+
+ get key() {
+ return this._ancestor.key;
+ }
+
+ get type() {
+ return this.node.type;
+ }
+
+ get inList() {
+ return typeof this._ancestor.index === "number";
+ }
+
+ get containerIndex() {
+ const { index } = this._ancestor;
+
+ if (typeof index !== "number") {
+ throw new Error("Cannot get index of non-array node");
+ }
+
+ return index;
+ }
+
+ find(predicate) {
+ for (let path = this; path; path = path.parentPath) {
+ if (predicate(path)) {
+ return path;
+ }
+ }
+ return null;
+ }
+
+ findParent(predicate) {
+ if (!this.parentPath) {
+ throw new Error("Cannot use findParent on root path");
+ }
+
+ return this.parentPath.find(predicate);
+ }
+ }
+
+ var lib$1 = {};
+
+ var hasRequiredLib$1;
+
+ function requireLib$1 () {
+ if (hasRequiredLib$1) return lib$1;
+ hasRequiredLib$1 = 1;
+
+ Object.defineProperty(lib$1, '__esModule', {
+ value: true
+ });
+ function _objectWithoutPropertiesLoose(source, excluded) {
+ if (source == null) return {};
+ var target = {};
+ var sourceKeys = Object.keys(source);
+ var key, i;
+ for (i = 0; i < sourceKeys.length; i++) {
+ key = sourceKeys[i];
+ if (excluded.indexOf(key) >= 0) continue;
+ target[key] = source[key];
+ }
+ return target;
+ }
+ class Position {
+ constructor(line, col, index) {
+ this.line = void 0;
+ this.column = void 0;
+ this.index = void 0;
+ this.line = line;
+ this.column = col;
+ this.index = index;
+ }
+ }
+ class SourceLocation {
+ constructor(start, end) {
+ this.start = void 0;
+ this.end = void 0;
+ this.filename = void 0;
+ this.identifierName = void 0;
+ this.start = start;
+ this.end = end;
+ }
+ }
+ function createPositionWithColumnOffset(position, columnOffset) {
+ const {
+ line,
+ column,
+ index
+ } = position;
+ return new Position(line, column + columnOffset, index + columnOffset);
+ }
+ const code = "BABEL_PARSER_SOURCETYPE_MODULE_REQUIRED";
+ var ModuleErrors = {
+ ImportMetaOutsideModule: {
+ message: `import.meta may appear only with 'sourceType: "module"'`,
+ code
+ },
+ ImportOutsideModule: {
+ message: `'import' and 'export' may appear only with 'sourceType: "module"'`,
+ code
+ }
+ };
+ const NodeDescriptions = {
+ ArrayPattern: "array destructuring pattern",
+ AssignmentExpression: "assignment expression",
+ AssignmentPattern: "assignment expression",
+ ArrowFunctionExpression: "arrow function expression",
+ ConditionalExpression: "conditional expression",
+ CatchClause: "catch clause",
+ ForOfStatement: "for-of statement",
+ ForInStatement: "for-in statement",
+ ForStatement: "for-loop",
+ FormalParameters: "function parameter list",
+ Identifier: "identifier",
+ ImportSpecifier: "import specifier",
+ ImportDefaultSpecifier: "import default specifier",
+ ImportNamespaceSpecifier: "import namespace specifier",
+ ObjectPattern: "object destructuring pattern",
+ ParenthesizedExpression: "parenthesized expression",
+ RestElement: "rest element",
+ UpdateExpression: {
+ true: "prefix operation",
+ false: "postfix operation"
+ },
+ VariableDeclarator: "variable declaration",
+ YieldExpression: "yield expression"
+ };
+ const toNodeDescription = ({
+ type,
+ prefix
+ }) => type === "UpdateExpression" ? NodeDescriptions.UpdateExpression[String(prefix)] : NodeDescriptions[type];
+ var StandardErrors = {
+ AccessorIsGenerator: ({
+ kind
+ }) => `A ${kind}ter cannot be a generator.`,
+ ArgumentsInClass: "'arguments' is only allowed in functions and class methods.",
+ AsyncFunctionInSingleStatementContext: "Async functions can only be declared at the top level or inside a block.",
+ AwaitBindingIdentifier: "Can not use 'await' as identifier inside an async function.",
+ AwaitBindingIdentifierInStaticBlock: "Can not use 'await' as identifier inside a static block.",
+ AwaitExpressionFormalParameter: "'await' is not allowed in async function parameters.",
+ AwaitUsingNotInAsyncContext: "'await using' is only allowed within async functions and at the top levels of modules.",
+ AwaitNotInAsyncContext: "'await' is only allowed within async functions and at the top levels of modules.",
+ AwaitNotInAsyncFunction: "'await' is only allowed within async functions.",
+ BadGetterArity: "A 'get' accessor must not have any formal parameters.",
+ BadSetterArity: "A 'set' accessor must have exactly one formal parameter.",
+ BadSetterRestParameter: "A 'set' accessor function argument must not be a rest parameter.",
+ ConstructorClassField: "Classes may not have a field named 'constructor'.",
+ ConstructorClassPrivateField: "Classes may not have a private field named '#constructor'.",
+ ConstructorIsAccessor: "Class constructor may not be an accessor.",
+ ConstructorIsAsync: "Constructor can't be an async function.",
+ ConstructorIsGenerator: "Constructor can't be a generator.",
+ DeclarationMissingInitializer: ({
+ kind
+ }) => `Missing initializer in ${kind} declaration.`,
+ DecoratorArgumentsOutsideParentheses: "Decorator arguments must be moved inside parentheses: use '@(decorator(args))' instead of '@(decorator)(args)'.",
+ DecoratorBeforeExport: "Decorators must be placed *before* the 'export' keyword. Remove the 'decoratorsBeforeExport: true' option to use the 'export @decorator class {}' syntax.",
+ DecoratorsBeforeAfterExport: "Decorators can be placed *either* before or after the 'export' keyword, but not in both locations at the same time.",
+ DecoratorConstructor: "Decorators can't be used with a constructor. Did you mean '@dec class { ... }'?",
+ DecoratorExportClass: "Decorators must be placed *after* the 'export' keyword. Remove the 'decoratorsBeforeExport: false' option to use the '@decorator export class {}' syntax.",
+ DecoratorSemicolon: "Decorators must not be followed by a semicolon.",
+ DecoratorStaticBlock: "Decorators can't be used with a static block.",
+ DeferImportRequiresNamespace: 'Only `import defer * as x from "./module"` is valid.',
+ DeletePrivateField: "Deleting a private field is not allowed.",
+ DestructureNamedImport: "ES2015 named imports do not destructure. Use another statement for destructuring after the import.",
+ DuplicateConstructor: "Duplicate constructor in the same class.",
+ DuplicateDefaultExport: "Only one default export allowed per module.",
+ DuplicateExport: ({
+ exportName
+ }) => `\`${exportName}\` has already been exported. Exported identifiers must be unique.`,
+ DuplicateProto: "Redefinition of __proto__ property.",
+ DuplicateRegExpFlags: "Duplicate regular expression flag.",
+ DynamicImportPhaseRequiresImportExpressions: ({
+ phase
+ }) => `'import.${phase}(...)' can only be parsed when using the 'createImportExpressions' option.`,
+ ElementAfterRest: "Rest element must be last element.",
+ EscapedCharNotAnIdentifier: "Invalid Unicode escape.",
+ ExportBindingIsString: ({
+ localName,
+ exportName
+ }) => `A string literal cannot be used as an exported binding without \`from\`.\n- Did you mean \`export { '${localName}' as '${exportName}' } from 'some-module'\`?`,
+ ExportDefaultFromAsIdentifier: "'from' is not allowed as an identifier after 'export default'.",
+ ForInOfLoopInitializer: ({
+ type
+ }) => `'${type === "ForInStatement" ? "for-in" : "for-of"}' loop variable declaration may not have an initializer.`,
+ ForInUsing: "For-in loop may not start with 'using' declaration.",
+ ForOfAsync: "The left-hand side of a for-of loop may not be 'async'.",
+ ForOfLet: "The left-hand side of a for-of loop may not start with 'let'.",
+ GeneratorInSingleStatementContext: "Generators can only be declared at the top level or inside a block.",
+ IllegalBreakContinue: ({
+ type
+ }) => `Unsyntactic ${type === "BreakStatement" ? "break" : "continue"}.`,
+ IllegalLanguageModeDirective: "Illegal 'use strict' directive in function with non-simple parameter list.",
+ IllegalReturn: "'return' outside of function.",
+ ImportAttributesUseAssert: "The `assert` keyword in import attributes is deprecated and it has been replaced by the `with` keyword. You can enable the `deprecatedAssertSyntax: true` option in the import attributes plugin to suppress this error.",
+ ImportBindingIsString: ({
+ importName
+ }) => `A string literal cannot be used as an imported binding.\n- Did you mean \`import { "${importName}" as foo }\`?`,
+ ImportCallArgumentTrailingComma: "Trailing comma is disallowed inside import(...) arguments.",
+ ImportCallArity: ({
+ maxArgumentCount
+ }) => `\`import()\` requires exactly ${maxArgumentCount === 1 ? "one argument" : "one or two arguments"}.`,
+ ImportCallNotNewExpression: "Cannot use new with import(...).",
+ ImportCallSpreadArgument: "`...` is not allowed in `import()`.",
+ ImportJSONBindingNotDefault: "A JSON module can only be imported with `default`.",
+ ImportReflectionHasAssertion: "`import module x` cannot have assertions.",
+ ImportReflectionNotBinding: 'Only `import module x from "./module"` is valid.',
+ IncompatibleRegExpUVFlags: "The 'u' and 'v' regular expression flags cannot be enabled at the same time.",
+ InvalidBigIntLiteral: "Invalid BigIntLiteral.",
+ InvalidCodePoint: "Code point out of bounds.",
+ InvalidCoverInitializedName: "Invalid shorthand property initializer.",
+ InvalidDecimal: "Invalid decimal.",
+ InvalidDigit: ({
+ radix
+ }) => `Expected number in radix ${radix}.`,
+ InvalidEscapeSequence: "Bad character escape sequence.",
+ InvalidEscapeSequenceTemplate: "Invalid escape sequence in template.",
+ InvalidEscapedReservedWord: ({
+ reservedWord
+ }) => `Escape sequence in keyword ${reservedWord}.`,
+ InvalidIdentifier: ({
+ identifierName
+ }) => `Invalid identifier ${identifierName}.`,
+ InvalidLhs: ({
+ ancestor
+ }) => `Invalid left-hand side in ${toNodeDescription(ancestor)}.`,
+ InvalidLhsBinding: ({
+ ancestor
+ }) => `Binding invalid left-hand side in ${toNodeDescription(ancestor)}.`,
+ InvalidLhsOptionalChaining: ({
+ ancestor
+ }) => `Invalid optional chaining in the left-hand side of ${toNodeDescription(ancestor)}.`,
+ InvalidNumber: "Invalid number.",
+ InvalidOrMissingExponent: "Floating-point numbers require a valid exponent after the 'e'.",
+ InvalidOrUnexpectedToken: ({
+ unexpected
+ }) => `Unexpected character '${unexpected}'.`,
+ InvalidParenthesizedAssignment: "Invalid parenthesized assignment pattern.",
+ InvalidPrivateFieldResolution: ({
+ identifierName
+ }) => `Private name #${identifierName} is not defined.`,
+ InvalidPropertyBindingPattern: "Binding member expression.",
+ InvalidRecordProperty: "Only properties and spread elements are allowed in record definitions.",
+ InvalidRestAssignmentPattern: "Invalid rest operator's argument.",
+ LabelRedeclaration: ({
+ labelName
+ }) => `Label '${labelName}' is already declared.`,
+ LetInLexicalBinding: "'let' is disallowed as a lexically bound name.",
+ LineTerminatorBeforeArrow: "No line break is allowed before '=>'.",
+ MalformedRegExpFlags: "Invalid regular expression flag.",
+ MissingClassName: "A class name is required.",
+ MissingEqInAssignment: "Only '=' operator can be used for specifying default value.",
+ MissingSemicolon: "Missing semicolon.",
+ MissingPlugin: ({
+ missingPlugin
+ }) => `This experimental syntax requires enabling the parser plugin: ${missingPlugin.map(name => JSON.stringify(name)).join(", ")}.`,
+ MissingOneOfPlugins: ({
+ missingPlugin
+ }) => `This experimental syntax requires enabling one of the following parser plugin(s): ${missingPlugin.map(name => JSON.stringify(name)).join(", ")}.`,
+ MissingUnicodeEscape: "Expecting Unicode escape sequence \\uXXXX.",
+ MixingCoalesceWithLogical: "Nullish coalescing operator(??) requires parens when mixing with logical operators.",
+ ModuleAttributeDifferentFromType: "The only accepted module attribute is `type`.",
+ ModuleAttributeInvalidValue: "Only string literals are allowed as module attribute values.",
+ ModuleAttributesWithDuplicateKeys: ({
+ key
+ }) => `Duplicate key "${key}" is not allowed in module attributes.`,
+ ModuleExportNameHasLoneSurrogate: ({
+ surrogateCharCode
+ }) => `An export name cannot include a lone surrogate, found '\\u${surrogateCharCode.toString(16)}'.`,
+ ModuleExportUndefined: ({
+ localName
+ }) => `Export '${localName}' is not defined.`,
+ MultipleDefaultsInSwitch: "Multiple default clauses.",
+ NewlineAfterThrow: "Illegal newline after throw.",
+ NoCatchOrFinally: "Missing catch or finally clause.",
+ NumberIdentifier: "Identifier directly after number.",
+ NumericSeparatorInEscapeSequence: "Numeric separators are not allowed inside unicode escape sequences or hex escape sequences.",
+ ObsoleteAwaitStar: "'await*' has been removed from the async functions proposal. Use Promise.all() instead.",
+ OptionalChainingNoNew: "Constructors in/after an Optional Chain are not allowed.",
+ OptionalChainingNoTemplate: "Tagged Template Literals are not allowed in optionalChain.",
+ OverrideOnConstructor: "'override' modifier cannot appear on a constructor declaration.",
+ ParamDupe: "Argument name clash.",
+ PatternHasAccessor: "Object pattern can't contain getter or setter.",
+ PatternHasMethod: "Object pattern can't contain methods.",
+ PrivateInExpectedIn: ({
+ identifierName
+ }) => `Private names are only allowed in property accesses (\`obj.#${identifierName}\`) or in \`in\` expressions (\`#${identifierName} in obj\`).`,
+ PrivateNameRedeclaration: ({
+ identifierName
+ }) => `Duplicate private name #${identifierName}.`,
+ RecordExpressionBarIncorrectEndSyntaxType: "Record expressions ending with '|}' are only allowed when the 'syntaxType' option of the 'recordAndTuple' plugin is set to 'bar'.",
+ RecordExpressionBarIncorrectStartSyntaxType: "Record expressions starting with '{|' are only allowed when the 'syntaxType' option of the 'recordAndTuple' plugin is set to 'bar'.",
+ RecordExpressionHashIncorrectStartSyntaxType: "Record expressions starting with '#{' are only allowed when the 'syntaxType' option of the 'recordAndTuple' plugin is set to 'hash'.",
+ RecordNoProto: "'__proto__' is not allowed in Record expressions.",
+ RestTrailingComma: "Unexpected trailing comma after rest element.",
+ SloppyFunction: "In non-strict mode code, functions can only be declared at top level or inside a block.",
+ SloppyFunctionAnnexB: "In non-strict mode code, functions can only be declared at top level, inside a block, or as the body of an if statement.",
+ SourcePhaseImportRequiresDefault: 'Only `import source x from "./module"` is valid.',
+ StaticPrototype: "Classes may not have static property named prototype.",
+ SuperNotAllowed: "`super()` is only valid inside a class constructor of a subclass. Maybe a typo in the method name ('constructor') or not extending another class?",
+ SuperPrivateField: "Private fields can't be accessed on super.",
+ TrailingDecorator: "Decorators must be attached to a class element.",
+ TupleExpressionBarIncorrectEndSyntaxType: "Tuple expressions ending with '|]' are only allowed when the 'syntaxType' option of the 'recordAndTuple' plugin is set to 'bar'.",
+ TupleExpressionBarIncorrectStartSyntaxType: "Tuple expressions starting with '[|' are only allowed when the 'syntaxType' option of the 'recordAndTuple' plugin is set to 'bar'.",
+ TupleExpressionHashIncorrectStartSyntaxType: "Tuple expressions starting with '#[' are only allowed when the 'syntaxType' option of the 'recordAndTuple' plugin is set to 'hash'.",
+ UnexpectedArgumentPlaceholder: "Unexpected argument placeholder.",
+ UnexpectedAwaitAfterPipelineBody: 'Unexpected "await" after pipeline body; await must have parentheses in minimal proposal.',
+ UnexpectedDigitAfterHash: "Unexpected digit after hash token.",
+ UnexpectedImportExport: "'import' and 'export' may only appear at the top level.",
+ UnexpectedKeyword: ({
+ keyword
+ }) => `Unexpected keyword '${keyword}'.`,
+ UnexpectedLeadingDecorator: "Leading decorators must be attached to a class declaration.",
+ UnexpectedLexicalDeclaration: "Lexical declaration cannot appear in a single-statement context.",
+ UnexpectedNewTarget: "`new.target` can only be used in functions or class properties.",
+ UnexpectedNumericSeparator: "A numeric separator is only allowed between two digits.",
+ UnexpectedPrivateField: "Unexpected private name.",
+ UnexpectedReservedWord: ({
+ reservedWord
+ }) => `Unexpected reserved word '${reservedWord}'.`,
+ UnexpectedSuper: "'super' is only allowed in object methods and classes.",
+ UnexpectedToken: ({
+ expected,
+ unexpected
+ }) => `Unexpected token${unexpected ? ` '${unexpected}'.` : ""}${expected ? `, expected "${expected}"` : ""}`,
+ UnexpectedTokenUnaryExponentiation: "Illegal expression. Wrap left hand side or entire exponentiation in parentheses.",
+ UnexpectedUsingDeclaration: "Using declaration cannot appear in the top level when source type is `script`.",
+ UnsupportedBind: "Binding should be performed on object property.",
+ UnsupportedDecoratorExport: "A decorated export must export a class declaration.",
+ UnsupportedDefaultExport: "Only expressions, functions or classes are allowed as the `default` export.",
+ UnsupportedImport: "`import` can only be used in `import()` or `import.meta`.",
+ UnsupportedMetaProperty: ({
+ target,
+ onlyValidPropertyName
+ }) => `The only valid meta property for ${target} is ${target}.${onlyValidPropertyName}.`,
+ UnsupportedParameterDecorator: "Decorators cannot be used to decorate parameters.",
+ UnsupportedPropertyDecorator: "Decorators cannot be used to decorate object literal properties.",
+ UnsupportedSuper: "'super' can only be used with function calls (i.e. super()) or in property accesses (i.e. super.prop or super[prop]).",
+ UnterminatedComment: "Unterminated comment.",
+ UnterminatedRegExp: "Unterminated regular expression.",
+ UnterminatedString: "Unterminated string constant.",
+ UnterminatedTemplate: "Unterminated template.",
+ UsingDeclarationHasBindingPattern: "Using declaration cannot have destructuring patterns.",
+ VarRedeclaration: ({
+ identifierName
+ }) => `Identifier '${identifierName}' has already been declared.`,
+ YieldBindingIdentifier: "Can not use 'yield' as identifier inside a generator.",
+ YieldInParameter: "Yield expression is not allowed in formal parameters.",
+ ZeroDigitNumericSeparator: "Numeric separator can not be used after leading 0."
+ };
+ var StrictModeErrors = {
+ StrictDelete: "Deleting local variable in strict mode.",
+ StrictEvalArguments: ({
+ referenceName
+ }) => `Assigning to '${referenceName}' in strict mode.`,
+ StrictEvalArgumentsBinding: ({
+ bindingName
+ }) => `Binding '${bindingName}' in strict mode.`,
+ StrictFunction: "In strict mode code, functions can only be declared at top level or inside a block.",
+ StrictNumericEscape: "The only valid numeric escape in strict mode is '\\0'.",
+ StrictOctalLiteral: "Legacy octal literals are not allowed in strict mode.",
+ StrictWith: "'with' in strict mode."
+ };
+ const UnparenthesizedPipeBodyDescriptions = new Set(["ArrowFunctionExpression", "AssignmentExpression", "ConditionalExpression", "YieldExpression"]);
+ var PipelineOperatorErrors = {
+ PipeBodyIsTighter: "Unexpected yield after pipeline body; any yield expression acting as Hack-style pipe body must be parenthesized due to its loose operator precedence.",
+ PipeTopicRequiresHackPipes: 'Topic reference is used, but the pipelineOperator plugin was not passed a "proposal": "hack" or "smart" option.',
+ PipeTopicUnbound: "Topic reference is unbound; it must be inside a pipe body.",
+ PipeTopicUnconfiguredToken: ({
+ token
+ }) => `Invalid topic token ${token}. In order to use ${token} as a topic reference, the pipelineOperator plugin must be configured with { "proposal": "hack", "topicToken": "${token}" }.`,
+ PipeTopicUnused: "Hack-style pipe body does not contain a topic reference; Hack-style pipes must use topic at least once.",
+ PipeUnparenthesizedBody: ({
+ type
+ }) => `Hack-style pipe body cannot be an unparenthesized ${toNodeDescription({
+ type
+ })}; please wrap it in parentheses.`,
+ PipelineBodyNoArrow: 'Unexpected arrow "=>" after pipeline body; arrow function in pipeline body must be parenthesized.',
+ PipelineBodySequenceExpression: "Pipeline body may not be a comma-separated sequence expression.",
+ PipelineHeadSequenceExpression: "Pipeline head should not be a comma-separated sequence expression.",
+ PipelineTopicUnused: "Pipeline is in topic style but does not use topic reference.",
+ PrimaryTopicNotAllowed: "Topic reference was used in a lexical context without topic binding.",
+ PrimaryTopicRequiresSmartPipeline: 'Topic reference is used, but the pipelineOperator plugin was not passed a "proposal": "hack" or "smart" option.'
+ };
+ const _excluded$1 = ["toMessage"],
+ _excluded2$1 = ["message"];
+ function defineHidden(obj, key, value) {
+ Object.defineProperty(obj, key, {
+ enumerable: false,
+ configurable: true,
+ value
+ });
+ }
+ function toParseErrorConstructor(_ref) {
+ let {
+ toMessage
+ } = _ref,
+ properties = _objectWithoutPropertiesLoose(_ref, _excluded$1);
+ return function constructor({
+ loc,
+ details
+ }) {
+ const error = new SyntaxError();
+ Object.assign(error, properties, {
+ loc,
+ pos: loc.index
+ });
+ if ("missingPlugin" in details) {
+ Object.assign(error, {
+ missingPlugin: details.missingPlugin
+ });
+ }
+ defineHidden(error, "clone", function clone(overrides = {}) {
+ var _overrides$loc;
+ const {
+ line,
+ column,
+ index
+ } = (_overrides$loc = overrides.loc) != null ? _overrides$loc : loc;
+ return constructor({
+ loc: new Position(line, column, index),
+ details: Object.assign({}, details, overrides.details)
+ });
+ });
+ defineHidden(error, "details", details);
+ Object.defineProperty(error, "message", {
+ configurable: true,
+ get() {
+ const message = `${toMessage(details)} (${loc.line}:${loc.column})`;
+ this.message = message;
+ return message;
+ },
+ set(value) {
+ Object.defineProperty(this, "message", {
+ value,
+ writable: true
+ });
+ }
+ });
+ return error;
+ };
+ }
+ function ParseErrorEnum(argument, syntaxPlugin) {
+ if (Array.isArray(argument)) {
+ return parseErrorTemplates => ParseErrorEnum(parseErrorTemplates, argument[0]);
+ }
+ const ParseErrorConstructors = {};
+ for (const reasonCode of Object.keys(argument)) {
+ const template = argument[reasonCode];
+ const _ref2 = typeof template === "string" ? {
+ message: () => template
+ } : typeof template === "function" ? {
+ message: template
+ } : template,
+ {
+ message
+ } = _ref2,
+ rest = _objectWithoutPropertiesLoose(_ref2, _excluded2$1);
+ const toMessage = typeof message === "string" ? () => message : message;
+ ParseErrorConstructors[reasonCode] = toParseErrorConstructor(Object.assign({
+ code: "BABEL_PARSER_SYNTAX_ERROR",
+ reasonCode,
+ toMessage
+ }, syntaxPlugin ? {
+ syntaxPlugin
+ } : {}, rest));
+ }
+ return ParseErrorConstructors;
+ }
+ const Errors = Object.assign({}, ParseErrorEnum(ModuleErrors), ParseErrorEnum(StandardErrors), ParseErrorEnum(StrictModeErrors), ParseErrorEnum`pipelineOperator`(PipelineOperatorErrors));
+ const {
+ defineProperty
+ } = Object;
+ const toUnenumerable = (object, key) => defineProperty(object, key, {
+ enumerable: false,
+ value: object[key]
+ });
+ function toESTreeLocation(node) {
+ node.loc.start && toUnenumerable(node.loc.start, "index");
+ node.loc.end && toUnenumerable(node.loc.end, "index");
+ return node;
+ }
+ var estree = superClass => class ESTreeParserMixin extends superClass {
+ parse() {
+ const file = toESTreeLocation(super.parse());
+ if (this.options.tokens) {
+ file.tokens = file.tokens.map(toESTreeLocation);
+ }
+ return file;
+ }
+ parseRegExpLiteral({
+ pattern,
+ flags
+ }) {
+ let regex = null;
+ try {
+ regex = new RegExp(pattern, flags);
+ } catch (e) {}
+ const node = this.estreeParseLiteral(regex);
+ node.regex = {
+ pattern,
+ flags
+ };
+ return node;
+ }
+ parseBigIntLiteral(value) {
+ let bigInt;
+ try {
+ bigInt = BigInt(value);
+ } catch (_unused) {
+ bigInt = null;
+ }
+ const node = this.estreeParseLiteral(bigInt);
+ node.bigint = String(node.value || value);
+ return node;
+ }
+ parseDecimalLiteral(value) {
+ const decimal = null;
+ const node = this.estreeParseLiteral(decimal);
+ node.decimal = String(node.value || value);
+ return node;
+ }
+ estreeParseLiteral(value) {
+ return this.parseLiteral(value, "Literal");
+ }
+ parseStringLiteral(value) {
+ return this.estreeParseLiteral(value);
+ }
+ parseNumericLiteral(value) {
+ return this.estreeParseLiteral(value);
+ }
+ parseNullLiteral() {
+ return this.estreeParseLiteral(null);
+ }
+ parseBooleanLiteral(value) {
+ return this.estreeParseLiteral(value);
+ }
+ directiveToStmt(directive) {
+ const expression = directive.value;
+ delete directive.value;
+ expression.type = "Literal";
+ expression.raw = expression.extra.raw;
+ expression.value = expression.extra.expressionValue;
+ const stmt = directive;
+ stmt.type = "ExpressionStatement";
+ stmt.expression = expression;
+ stmt.directive = expression.extra.rawValue;
+ delete expression.extra;
+ return stmt;
+ }
+ initFunction(node, isAsync) {
+ super.initFunction(node, isAsync);
+ node.expression = false;
+ }
+ checkDeclaration(node) {
+ if (node != null && this.isObjectProperty(node)) {
+ this.checkDeclaration(node.value);
+ } else {
+ super.checkDeclaration(node);
+ }
+ }
+ getObjectOrClassMethodParams(method) {
+ return method.value.params;
+ }
+ isValidDirective(stmt) {
+ var _stmt$expression$extr;
+ return stmt.type === "ExpressionStatement" && stmt.expression.type === "Literal" && typeof stmt.expression.value === "string" && !((_stmt$expression$extr = stmt.expression.extra) != null && _stmt$expression$extr.parenthesized);
+ }
+ parseBlockBody(node, allowDirectives, topLevel, end, afterBlockParse) {
+ super.parseBlockBody(node, allowDirectives, topLevel, end, afterBlockParse);
+ const directiveStatements = node.directives.map(d => this.directiveToStmt(d));
+ node.body = directiveStatements.concat(node.body);
+ delete node.directives;
+ }
+ pushClassMethod(classBody, method, isGenerator, isAsync, isConstructor, allowsDirectSuper) {
+ this.parseMethod(method, isGenerator, isAsync, isConstructor, allowsDirectSuper, "ClassMethod", true);
+ if (method.typeParameters) {
+ method.value.typeParameters = method.typeParameters;
+ delete method.typeParameters;
+ }
+ classBody.body.push(method);
+ }
+ parsePrivateName() {
+ const node = super.parsePrivateName();
+ {
+ if (!this.getPluginOption("estree", "classFeatures")) {
+ return node;
+ }
+ }
+ return this.convertPrivateNameToPrivateIdentifier(node);
+ }
+ convertPrivateNameToPrivateIdentifier(node) {
+ const name = super.getPrivateNameSV(node);
+ node = node;
+ delete node.id;
+ node.name = name;
+ node.type = "PrivateIdentifier";
+ return node;
+ }
+ isPrivateName(node) {
+ {
+ if (!this.getPluginOption("estree", "classFeatures")) {
+ return super.isPrivateName(node);
+ }
+ }
+ return node.type === "PrivateIdentifier";
+ }
+ getPrivateNameSV(node) {
+ {
+ if (!this.getPluginOption("estree", "classFeatures")) {
+ return super.getPrivateNameSV(node);
+ }
+ }
+ return node.name;
+ }
+ parseLiteral(value, type) {
+ const node = super.parseLiteral(value, type);
+ node.raw = node.extra.raw;
+ delete node.extra;
+ return node;
+ }
+ parseFunctionBody(node, allowExpression, isMethod = false) {
+ super.parseFunctionBody(node, allowExpression, isMethod);
+ node.expression = node.body.type !== "BlockStatement";
+ }
+ parseMethod(node, isGenerator, isAsync, isConstructor, allowDirectSuper, type, inClassScope = false) {
+ let funcNode = this.startNode();
+ funcNode.kind = node.kind;
+ funcNode = super.parseMethod(funcNode, isGenerator, isAsync, isConstructor, allowDirectSuper, type, inClassScope);
+ funcNode.type = "FunctionExpression";
+ delete funcNode.kind;
+ node.value = funcNode;
+ if (type === "ClassPrivateMethod") {
+ node.computed = false;
+ }
+ return this.finishNode(node, "MethodDefinition");
+ }
+ parseClassProperty(...args) {
+ const propertyNode = super.parseClassProperty(...args);
+ {
+ if (!this.getPluginOption("estree", "classFeatures")) {
+ return propertyNode;
+ }
+ }
+ propertyNode.type = "PropertyDefinition";
+ return propertyNode;
+ }
+ parseClassPrivateProperty(...args) {
+ const propertyNode = super.parseClassPrivateProperty(...args);
+ {
+ if (!this.getPluginOption("estree", "classFeatures")) {
+ return propertyNode;
+ }
+ }
+ propertyNode.type = "PropertyDefinition";
+ propertyNode.computed = false;
+ return propertyNode;
+ }
+ parseObjectMethod(prop, isGenerator, isAsync, isPattern, isAccessor) {
+ const node = super.parseObjectMethod(prop, isGenerator, isAsync, isPattern, isAccessor);
+ if (node) {
+ node.type = "Property";
+ if (node.kind === "method") {
+ node.kind = "init";
+ }
+ node.shorthand = false;
+ }
+ return node;
+ }
+ parseObjectProperty(prop, startLoc, isPattern, refExpressionErrors) {
+ const node = super.parseObjectProperty(prop, startLoc, isPattern, refExpressionErrors);
+ if (node) {
+ node.kind = "init";
+ node.type = "Property";
+ }
+ return node;
+ }
+ isValidLVal(type, isUnparenthesizedInAssign, binding) {
+ return type === "Property" ? "value" : super.isValidLVal(type, isUnparenthesizedInAssign, binding);
+ }
+ isAssignable(node, isBinding) {
+ if (node != null && this.isObjectProperty(node)) {
+ return this.isAssignable(node.value, isBinding);
+ }
+ return super.isAssignable(node, isBinding);
+ }
+ toAssignable(node, isLHS = false) {
+ if (node != null && this.isObjectProperty(node)) {
+ const {
+ key,
+ value
+ } = node;
+ if (this.isPrivateName(key)) {
+ this.classScope.usePrivateName(this.getPrivateNameSV(key), key.loc.start);
+ }
+ this.toAssignable(value, isLHS);
+ } else {
+ super.toAssignable(node, isLHS);
+ }
+ }
+ toAssignableObjectExpressionProp(prop, isLast, isLHS) {
+ if (prop.kind === "get" || prop.kind === "set") {
+ this.raise(Errors.PatternHasAccessor, {
+ at: prop.key
+ });
+ } else if (prop.method) {
+ this.raise(Errors.PatternHasMethod, {
+ at: prop.key
+ });
+ } else {
+ super.toAssignableObjectExpressionProp(prop, isLast, isLHS);
+ }
+ }
+ finishCallExpression(unfinished, optional) {
+ const node = super.finishCallExpression(unfinished, optional);
+ if (node.callee.type === "Import") {
+ node.type = "ImportExpression";
+ node.source = node.arguments[0];
+ if (this.hasPlugin("importAttributes") || this.hasPlugin("importAssertions")) {
+ var _node$arguments$, _node$arguments$2;
+ node.options = (_node$arguments$ = node.arguments[1]) != null ? _node$arguments$ : null;
+ node.attributes = (_node$arguments$2 = node.arguments[1]) != null ? _node$arguments$2 : null;
+ }
+ delete node.arguments;
+ delete node.callee;
+ }
+ return node;
+ }
+ toReferencedArguments(node) {
+ if (node.type === "ImportExpression") {
+ return;
+ }
+ super.toReferencedArguments(node);
+ }
+ parseExport(unfinished, decorators) {
+ const exportStartLoc = this.state.lastTokStartLoc;
+ const node = super.parseExport(unfinished, decorators);
+ switch (node.type) {
+ case "ExportAllDeclaration":
+ node.exported = null;
+ break;
+ case "ExportNamedDeclaration":
+ if (node.specifiers.length === 1 && node.specifiers[0].type === "ExportNamespaceSpecifier") {
+ node.type = "ExportAllDeclaration";
+ node.exported = node.specifiers[0].exported;
+ delete node.specifiers;
+ }
+ case "ExportDefaultDeclaration":
+ {
+ var _declaration$decorato;
+ const {
+ declaration
+ } = node;
+ if ((declaration == null ? void 0 : declaration.type) === "ClassDeclaration" && ((_declaration$decorato = declaration.decorators) == null ? void 0 : _declaration$decorato.length) > 0 && declaration.start === node.start) {
+ this.resetStartLocation(node, exportStartLoc);
+ }
+ }
+ break;
+ }
+ return node;
+ }
+ parseSubscript(base, startLoc, noCalls, state) {
+ const node = super.parseSubscript(base, startLoc, noCalls, state);
+ if (state.optionalChainMember) {
+ if (node.type === "OptionalMemberExpression" || node.type === "OptionalCallExpression") {
+ node.type = node.type.substring(8);
+ }
+ if (state.stop) {
+ const chain = this.startNodeAtNode(node);
+ chain.expression = node;
+ return this.finishNode(chain, "ChainExpression");
+ }
+ } else if (node.type === "MemberExpression" || node.type === "CallExpression") {
+ node.optional = false;
+ }
+ return node;
+ }
+ isOptionalMemberExpression(node) {
+ if (node.type === "ChainExpression") {
+ return node.expression.type === "MemberExpression";
+ }
+ return super.isOptionalMemberExpression(node);
+ }
+ hasPropertyAsPrivateName(node) {
+ if (node.type === "ChainExpression") {
+ node = node.expression;
+ }
+ return super.hasPropertyAsPrivateName(node);
+ }
+ isObjectProperty(node) {
+ return node.type === "Property" && node.kind === "init" && !node.method;
+ }
+ isObjectMethod(node) {
+ return node.method || node.kind === "get" || node.kind === "set";
+ }
+ finishNodeAt(node, type, endLoc) {
+ return toESTreeLocation(super.finishNodeAt(node, type, endLoc));
+ }
+ resetStartLocation(node, startLoc) {
+ super.resetStartLocation(node, startLoc);
+ toESTreeLocation(node);
+ }
+ resetEndLocation(node, endLoc = this.state.lastTokEndLoc) {
+ super.resetEndLocation(node, endLoc);
+ toESTreeLocation(node);
+ }
+ };
+ class TokContext {
+ constructor(token, preserveSpace) {
+ this.token = void 0;
+ this.preserveSpace = void 0;
+ this.token = token;
+ this.preserveSpace = !!preserveSpace;
+ }
+ }
+ const types = {
+ brace: new TokContext("{"),
+ j_oTag: new TokContext("<tag"),
+ j_cTag: new TokContext("</tag"),
+ j_expr: new TokContext("<tag>...</tag>", true)
+ };
+ {
+ types.template = new TokContext("`", true);
+ }
+ const beforeExpr = true;
+ const startsExpr = true;
+ const isLoop = true;
+ const isAssign = true;
+ const prefix = true;
+ const postfix = true;
+ class ExportedTokenType {
+ constructor(label, conf = {}) {
+ this.label = void 0;
+ this.keyword = void 0;
+ this.beforeExpr = void 0;
+ this.startsExpr = void 0;
+ this.rightAssociative = void 0;
+ this.isLoop = void 0;
+ this.isAssign = void 0;
+ this.prefix = void 0;
+ this.postfix = void 0;
+ this.binop = void 0;
+ this.label = label;
+ this.keyword = conf.keyword;
+ this.beforeExpr = !!conf.beforeExpr;
+ this.startsExpr = !!conf.startsExpr;
+ this.rightAssociative = !!conf.rightAssociative;
+ this.isLoop = !!conf.isLoop;
+ this.isAssign = !!conf.isAssign;
+ this.prefix = !!conf.prefix;
+ this.postfix = !!conf.postfix;
+ this.binop = conf.binop != null ? conf.binop : null;
+ {
+ this.updateContext = null;
+ }
+ }
+ }
+ const keywords$1 = new Map();
+ function createKeyword(name, options = {}) {
+ options.keyword = name;
+ const token = createToken(name, options);
+ keywords$1.set(name, token);
+ return token;
+ }
+ function createBinop(name, binop) {
+ return createToken(name, {
+ beforeExpr,
+ binop
+ });
+ }
+ let tokenTypeCounter = -1;
+ const tokenTypes = [];
+ const tokenLabels = [];
+ const tokenBinops = [];
+ const tokenBeforeExprs = [];
+ const tokenStartsExprs = [];
+ const tokenPrefixes = [];
+ function createToken(name, options = {}) {
+ var _options$binop, _options$beforeExpr, _options$startsExpr, _options$prefix;
+ ++tokenTypeCounter;
+ tokenLabels.push(name);
+ tokenBinops.push((_options$binop = options.binop) != null ? _options$binop : -1);
+ tokenBeforeExprs.push((_options$beforeExpr = options.beforeExpr) != null ? _options$beforeExpr : false);
+ tokenStartsExprs.push((_options$startsExpr = options.startsExpr) != null ? _options$startsExpr : false);
+ tokenPrefixes.push((_options$prefix = options.prefix) != null ? _options$prefix : false);
+ tokenTypes.push(new ExportedTokenType(name, options));
+ return tokenTypeCounter;
+ }
+ function createKeywordLike(name, options = {}) {
+ var _options$binop2, _options$beforeExpr2, _options$startsExpr2, _options$prefix2;
+ ++tokenTypeCounter;
+ keywords$1.set(name, tokenTypeCounter);
+ tokenLabels.push(name);
+ tokenBinops.push((_options$binop2 = options.binop) != null ? _options$binop2 : -1);
+ tokenBeforeExprs.push((_options$beforeExpr2 = options.beforeExpr) != null ? _options$beforeExpr2 : false);
+ tokenStartsExprs.push((_options$startsExpr2 = options.startsExpr) != null ? _options$startsExpr2 : false);
+ tokenPrefixes.push((_options$prefix2 = options.prefix) != null ? _options$prefix2 : false);
+ tokenTypes.push(new ExportedTokenType("name", options));
+ return tokenTypeCounter;
+ }
+ const tt = {
+ bracketL: createToken("[", {
+ beforeExpr,
+ startsExpr
+ }),
+ bracketHashL: createToken("#[", {
+ beforeExpr,
+ startsExpr
+ }),
+ bracketBarL: createToken("[|", {
+ beforeExpr,
+ startsExpr
+ }),
+ bracketR: createToken("]"),
+ bracketBarR: createToken("|]"),
+ braceL: createToken("{", {
+ beforeExpr,
+ startsExpr
+ }),
+ braceBarL: createToken("{|", {
+ beforeExpr,
+ startsExpr
+ }),
+ braceHashL: createToken("#{", {
+ beforeExpr,
+ startsExpr
+ }),
+ braceR: createToken("}"),
+ braceBarR: createToken("|}"),
+ parenL: createToken("(", {
+ beforeExpr,
+ startsExpr
+ }),
+ parenR: createToken(")"),
+ comma: createToken(",", {
+ beforeExpr
+ }),
+ semi: createToken(";", {
+ beforeExpr
+ }),
+ colon: createToken(":", {
+ beforeExpr
+ }),
+ doubleColon: createToken("::", {
+ beforeExpr
+ }),
+ dot: createToken("."),
+ question: createToken("?", {
+ beforeExpr
+ }),
+ questionDot: createToken("?."),
+ arrow: createToken("=>", {
+ beforeExpr
+ }),
+ template: createToken("template"),
+ ellipsis: createToken("...", {
+ beforeExpr
+ }),
+ backQuote: createToken("`", {
+ startsExpr
+ }),
+ dollarBraceL: createToken("${", {
+ beforeExpr,
+ startsExpr
+ }),
+ templateTail: createToken("...`", {
+ startsExpr
+ }),
+ templateNonTail: createToken("...${", {
+ beforeExpr,
+ startsExpr
+ }),
+ at: createToken("@"),
+ hash: createToken("#", {
+ startsExpr
+ }),
+ interpreterDirective: createToken("#!..."),
+ eq: createToken("=", {
+ beforeExpr,
+ isAssign
+ }),
+ assign: createToken("_=", {
+ beforeExpr,
+ isAssign
+ }),
+ slashAssign: createToken("_=", {
+ beforeExpr,
+ isAssign
+ }),
+ xorAssign: createToken("_=", {
+ beforeExpr,
+ isAssign
+ }),
+ moduloAssign: createToken("_=", {
+ beforeExpr,
+ isAssign
+ }),
+ incDec: createToken("++/--", {
+ prefix,
+ postfix,
+ startsExpr
+ }),
+ bang: createToken("!", {
+ beforeExpr,
+ prefix,
+ startsExpr
+ }),
+ tilde: createToken("~", {
+ beforeExpr,
+ prefix,
+ startsExpr
+ }),
+ doubleCaret: createToken("^^", {
+ startsExpr
+ }),
+ doubleAt: createToken("@@", {
+ startsExpr
+ }),
+ pipeline: createBinop("|>", 0),
+ nullishCoalescing: createBinop("??", 1),
+ logicalOR: createBinop("||", 1),
+ logicalAND: createBinop("&&", 2),
+ bitwiseOR: createBinop("|", 3),
+ bitwiseXOR: createBinop("^", 4),
+ bitwiseAND: createBinop("&", 5),
+ equality: createBinop("==/!=/===/!==", 6),
+ lt: createBinop("</>/<=/>=", 7),
+ gt: createBinop("</>/<=/>=", 7),
+ relational: createBinop("</>/<=/>=", 7),
+ bitShift: createBinop("<</>>/>>>", 8),
+ bitShiftL: createBinop("<</>>/>>>", 8),
+ bitShiftR: createBinop("<</>>/>>>", 8),
+ plusMin: createToken("+/-", {
+ beforeExpr,
+ binop: 9,
+ prefix,
+ startsExpr
+ }),
+ modulo: createToken("%", {
+ binop: 10,
+ startsExpr
+ }),
+ star: createToken("*", {
+ binop: 10
+ }),
+ slash: createBinop("/", 10),
+ exponent: createToken("**", {
+ beforeExpr,
+ binop: 11,
+ rightAssociative: true
+ }),
+ _in: createKeyword("in", {
+ beforeExpr,
+ binop: 7
+ }),
+ _instanceof: createKeyword("instanceof", {
+ beforeExpr,
+ binop: 7
+ }),
+ _break: createKeyword("break"),
+ _case: createKeyword("case", {
+ beforeExpr
+ }),
+ _catch: createKeyword("catch"),
+ _continue: createKeyword("continue"),
+ _debugger: createKeyword("debugger"),
+ _default: createKeyword("default", {
+ beforeExpr
+ }),
+ _else: createKeyword("else", {
+ beforeExpr
+ }),
+ _finally: createKeyword("finally"),
+ _function: createKeyword("function", {
+ startsExpr
+ }),
+ _if: createKeyword("if"),
+ _return: createKeyword("return", {
+ beforeExpr
+ }),
+ _switch: createKeyword("switch"),
+ _throw: createKeyword("throw", {
+ beforeExpr,
+ prefix,
+ startsExpr
+ }),
+ _try: createKeyword("try"),
+ _var: createKeyword("var"),
+ _const: createKeyword("const"),
+ _with: createKeyword("with"),
+ _new: createKeyword("new", {
+ beforeExpr,
+ startsExpr
+ }),
+ _this: createKeyword("this", {
+ startsExpr
+ }),
+ _super: createKeyword("super", {
+ startsExpr
+ }),
+ _class: createKeyword("class", {
+ startsExpr
+ }),
+ _extends: createKeyword("extends", {
+ beforeExpr
+ }),
+ _export: createKeyword("export"),
+ _import: createKeyword("import", {
+ startsExpr
+ }),
+ _null: createKeyword("null", {
+ startsExpr
+ }),
+ _true: createKeyword("true", {
+ startsExpr
+ }),
+ _false: createKeyword("false", {
+ startsExpr
+ }),
+ _typeof: createKeyword("typeof", {
+ beforeExpr,
+ prefix,
+ startsExpr
+ }),
+ _void: createKeyword("void", {
+ beforeExpr,
+ prefix,
+ startsExpr
+ }),
+ _delete: createKeyword("delete", {
+ beforeExpr,
+ prefix,
+ startsExpr
+ }),
+ _do: createKeyword("do", {
+ isLoop,
+ beforeExpr
+ }),
+ _for: createKeyword("for", {
+ isLoop
+ }),
+ _while: createKeyword("while", {
+ isLoop
+ }),
+ _as: createKeywordLike("as", {
+ startsExpr
+ }),
+ _assert: createKeywordLike("assert", {
+ startsExpr
+ }),
+ _async: createKeywordLike("async", {
+ startsExpr
+ }),
+ _await: createKeywordLike("await", {
+ startsExpr
+ }),
+ _defer: createKeywordLike("defer", {
+ startsExpr
+ }),
+ _from: createKeywordLike("from", {
+ startsExpr
+ }),
+ _get: createKeywordLike("get", {
+ startsExpr
+ }),
+ _let: createKeywordLike("let", {
+ startsExpr
+ }),
+ _meta: createKeywordLike("meta", {
+ startsExpr
+ }),
+ _of: createKeywordLike("of", {
+ startsExpr
+ }),
+ _sent: createKeywordLike("sent", {
+ startsExpr
+ }),
+ _set: createKeywordLike("set", {
+ startsExpr
+ }),
+ _source: createKeywordLike("source", {
+ startsExpr
+ }),
+ _static: createKeywordLike("static", {
+ startsExpr
+ }),
+ _using: createKeywordLike("using", {
+ startsExpr
+ }),
+ _yield: createKeywordLike("yield", {
+ startsExpr
+ }),
+ _asserts: createKeywordLike("asserts", {
+ startsExpr
+ }),
+ _checks: createKeywordLike("checks", {
+ startsExpr
+ }),
+ _exports: createKeywordLike("exports", {
+ startsExpr
+ }),
+ _global: createKeywordLike("global", {
+ startsExpr
+ }),
+ _implements: createKeywordLike("implements", {
+ startsExpr
+ }),
+ _intrinsic: createKeywordLike("intrinsic", {
+ startsExpr
+ }),
+ _infer: createKeywordLike("infer", {
+ startsExpr
+ }),
+ _is: createKeywordLike("is", {
+ startsExpr
+ }),
+ _mixins: createKeywordLike("mixins", {
+ startsExpr
+ }),
+ _proto: createKeywordLike("proto", {
+ startsExpr
+ }),
+ _require: createKeywordLike("require", {
+ startsExpr
+ }),
+ _satisfies: createKeywordLike("satisfies", {
+ startsExpr
+ }),
+ _keyof: createKeywordLike("keyof", {
+ startsExpr
+ }),
+ _readonly: createKeywordLike("readonly", {
+ startsExpr
+ }),
+ _unique: createKeywordLike("unique", {
+ startsExpr
+ }),
+ _abstract: createKeywordLike("abstract", {
+ startsExpr
+ }),
+ _declare: createKeywordLike("declare", {
+ startsExpr
+ }),
+ _enum: createKeywordLike("enum", {
+ startsExpr
+ }),
+ _module: createKeywordLike("module", {
+ startsExpr
+ }),
+ _namespace: createKeywordLike("namespace", {
+ startsExpr
+ }),
+ _interface: createKeywordLike("interface", {
+ startsExpr
+ }),
+ _type: createKeywordLike("type", {
+ startsExpr
+ }),
+ _opaque: createKeywordLike("opaque", {
+ startsExpr
+ }),
+ name: createToken("name", {
+ startsExpr
+ }),
+ string: createToken("string", {
+ startsExpr
+ }),
+ num: createToken("num", {
+ startsExpr
+ }),
+ bigint: createToken("bigint", {
+ startsExpr
+ }),
+ decimal: createToken("decimal", {
+ startsExpr
+ }),
+ regexp: createToken("regexp", {
+ startsExpr
+ }),
+ privateName: createToken("#name", {
+ startsExpr
+ }),
+ eof: createToken("eof"),
+ jsxName: createToken("jsxName"),
+ jsxText: createToken("jsxText", {
+ beforeExpr: true
+ }),
+ jsxTagStart: createToken("jsxTagStart", {
+ startsExpr: true
+ }),
+ jsxTagEnd: createToken("jsxTagEnd"),
+ placeholder: createToken("%%", {
+ startsExpr: true
+ })
+ };
+ function tokenIsIdentifier(token) {
+ return token >= 93 && token <= 132;
+ }
+ function tokenKeywordOrIdentifierIsKeyword(token) {
+ return token <= 92;
+ }
+ function tokenIsKeywordOrIdentifier(token) {
+ return token >= 58 && token <= 132;
+ }
+ function tokenIsLiteralPropertyName(token) {
+ return token >= 58 && token <= 136;
+ }
+ function tokenComesBeforeExpression(token) {
+ return tokenBeforeExprs[token];
+ }
+ function tokenCanStartExpression(token) {
+ return tokenStartsExprs[token];
+ }
+ function tokenIsAssignment(token) {
+ return token >= 29 && token <= 33;
+ }
+ function tokenIsFlowInterfaceOrTypeOrOpaque(token) {
+ return token >= 129 && token <= 131;
+ }
+ function tokenIsLoop(token) {
+ return token >= 90 && token <= 92;
+ }
+ function tokenIsKeyword(token) {
+ return token >= 58 && token <= 92;
+ }
+ function tokenIsOperator(token) {
+ return token >= 39 && token <= 59;
+ }
+ function tokenIsPostfix(token) {
+ return token === 34;
+ }
+ function tokenIsPrefix(token) {
+ return tokenPrefixes[token];
+ }
+ function tokenIsTSTypeOperator(token) {
+ return token >= 121 && token <= 123;
+ }
+ function tokenIsTSDeclarationStart(token) {
+ return token >= 124 && token <= 130;
+ }
+ function tokenLabelName(token) {
+ return tokenLabels[token];
+ }
+ function tokenOperatorPrecedence(token) {
+ return tokenBinops[token];
+ }
+ function tokenIsRightAssociative(token) {
+ return token === 57;
+ }
+ function tokenIsTemplate(token) {
+ return token >= 24 && token <= 25;
+ }
+ function getExportedToken(token) {
+ return tokenTypes[token];
+ }
+ {
+ tokenTypes[8].updateContext = context => {
+ context.pop();
+ };
+ tokenTypes[5].updateContext = tokenTypes[7].updateContext = tokenTypes[23].updateContext = context => {
+ context.push(types.brace);
+ };
+ tokenTypes[22].updateContext = context => {
+ if (context[context.length - 1] === types.template) {
+ context.pop();
+ } else {
+ context.push(types.template);
+ }
+ };
+ tokenTypes[142].updateContext = context => {
+ context.push(types.j_expr, types.j_oTag);
+ };
+ }
+ let nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u0870-\u0887\u0889-\u088e\u08a0-\u08c9\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u09fc\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c5d\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cdd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u1711\u171f-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4c\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31bf\u31f0-\u31ff\u3400-\u4dbf\u4e00-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7ca\ua7d0\ua7d1\ua7d3\ua7d5-\ua7d9\ua7f2-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab69\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc";
+ let nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u0898-\u089f\u08ca-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3c\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0cf3\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ece\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u180f-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf-\u1ace\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1dff\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\u30fb\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f\uff65";
+ const nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]");
+ const nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]");
+ nonASCIIidentifierStartChars = nonASCIIidentifierChars = null;
+ const astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 68, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 349, 41, 7, 1, 79, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 159, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 264, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 4026, 582, 8634, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 689, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 43, 8, 8936, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 757, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4153, 7, 221, 3, 5761, 15, 7472, 16, 621, 2467, 541, 1507, 4938, 6, 4191];
+ const astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 370, 1, 81, 2, 71, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 3, 0, 158, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 193, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 84, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 406, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 330, 3, 10, 1, 2, 0, 49, 6, 4, 4, 14, 9, 5351, 0, 7, 14, 13835, 9, 87, 9, 39, 4, 60, 6, 26, 9, 1014, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4706, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 101, 0, 161, 6, 10, 9, 357, 0, 62, 13, 499, 13, 983, 6, 110, 6, 6, 9, 4759, 9, 787719, 239];
+ function isInAstralSet(code, set) {
+ let pos = 0x10000;
+ for (let i = 0, length = set.length; i < length; i += 2) {
+ pos += set[i];
+ if (pos > code) return false;
+ pos += set[i + 1];
+ if (pos >= code) return true;
+ }
+ return false;
+ }
+ function isIdentifierStart(code) {
+ if (code < 65) return code === 36;
+ if (code <= 90) return true;
+ if (code < 97) return code === 95;
+ if (code <= 122) return true;
+ if (code <= 0xffff) {
+ return code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code));
+ }
+ return isInAstralSet(code, astralIdentifierStartCodes);
+ }
+ function isIdentifierChar(code) {
+ if (code < 48) return code === 36;
+ if (code < 58) return true;
+ if (code < 65) return false;
+ if (code <= 90) return true;
+ if (code < 97) return code === 95;
+ if (code <= 122) return true;
+ if (code <= 0xffff) {
+ return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code));
+ }
+ return isInAstralSet(code, astralIdentifierStartCodes) || isInAstralSet(code, astralIdentifierCodes);
+ }
+ const reservedWords = {
+ keyword: ["break", "case", "catch", "continue", "debugger", "default", "do", "else", "finally", "for", "function", "if", "return", "switch", "throw", "try", "var", "const", "while", "with", "new", "this", "super", "class", "extends", "export", "import", "null", "true", "false", "in", "instanceof", "typeof", "void", "delete"],
+ strict: ["implements", "interface", "let", "package", "private", "protected", "public", "static", "yield"],
+ strictBind: ["eval", "arguments"]
+ };
+ const keywords = new Set(reservedWords.keyword);
+ const reservedWordsStrictSet = new Set(reservedWords.strict);
+ const reservedWordsStrictBindSet = new Set(reservedWords.strictBind);
+ function isReservedWord(word, inModule) {
+ return inModule && word === "await" || word === "enum";
+ }
+ function isStrictReservedWord(word, inModule) {
+ return isReservedWord(word, inModule) || reservedWordsStrictSet.has(word);
+ }
+ function isStrictBindOnlyReservedWord(word) {
+ return reservedWordsStrictBindSet.has(word);
+ }
+ function isStrictBindReservedWord(word, inModule) {
+ return isStrictReservedWord(word, inModule) || isStrictBindOnlyReservedWord(word);
+ }
+ function isKeyword(word) {
+ return keywords.has(word);
+ }
+ function isIteratorStart(current, next, next2) {
+ return current === 64 && next === 64 && isIdentifierStart(next2);
+ }
+ const reservedWordLikeSet = new Set(["break", "case", "catch", "continue", "debugger", "default", "do", "else", "finally", "for", "function", "if", "return", "switch", "throw", "try", "var", "const", "while", "with", "new", "this", "super", "class", "extends", "export", "import", "null", "true", "false", "in", "instanceof", "typeof", "void", "delete", "implements", "interface", "let", "package", "private", "protected", "public", "static", "yield", "eval", "arguments", "enum", "await"]);
+ function canBeReservedWord(word) {
+ return reservedWordLikeSet.has(word);
+ }
+ class Scope {
+ constructor(flags) {
+ this.var = new Set();
+ this.lexical = new Set();
+ this.functions = new Set();
+ this.flags = flags;
+ }
+ }
+ class ScopeHandler {
+ constructor(parser, inModule) {
+ this.parser = void 0;
+ this.scopeStack = [];
+ this.inModule = void 0;
+ this.undefinedExports = new Map();
+ this.parser = parser;
+ this.inModule = inModule;
+ }
+ get inTopLevel() {
+ return (this.currentScope().flags & 1) > 0;
+ }
+ get inFunction() {
+ return (this.currentVarScopeFlags() & 2) > 0;
+ }
+ get allowSuper() {
+ return (this.currentThisScopeFlags() & 16) > 0;
+ }
+ get allowDirectSuper() {
+ return (this.currentThisScopeFlags() & 32) > 0;
+ }
+ get inClass() {
+ return (this.currentThisScopeFlags() & 64) > 0;
+ }
+ get inClassAndNotInNonArrowFunction() {
+ const flags = this.currentThisScopeFlags();
+ return (flags & 64) > 0 && (flags & 2) === 0;
+ }
+ get inStaticBlock() {
+ for (let i = this.scopeStack.length - 1;; i--) {
+ const {
+ flags
+ } = this.scopeStack[i];
+ if (flags & 128) {
+ return true;
+ }
+ if (flags & (387 | 64)) {
+ return false;
+ }
+ }
+ }
+ get inNonArrowFunction() {
+ return (this.currentThisScopeFlags() & 2) > 0;
+ }
+ get treatFunctionsAsVar() {
+ return this.treatFunctionsAsVarInScope(this.currentScope());
+ }
+ createScope(flags) {
+ return new Scope(flags);
+ }
+ enter(flags) {
+ this.scopeStack.push(this.createScope(flags));
+ }
+ exit() {
+ const scope = this.scopeStack.pop();
+ return scope.flags;
+ }
+ treatFunctionsAsVarInScope(scope) {
+ return !!(scope.flags & (2 | 128) || !this.parser.inModule && scope.flags & 1);
+ }
+ declareName(name, bindingType, loc) {
+ let scope = this.currentScope();
+ if (bindingType & 8 || bindingType & 16) {
+ this.checkRedeclarationInScope(scope, name, bindingType, loc);
+ if (bindingType & 16) {
+ scope.functions.add(name);
+ } else {
+ scope.lexical.add(name);
+ }
+ if (bindingType & 8) {
+ this.maybeExportDefined(scope, name);
+ }
+ } else if (bindingType & 4) {
+ for (let i = this.scopeStack.length - 1; i >= 0; --i) {
+ scope = this.scopeStack[i];
+ this.checkRedeclarationInScope(scope, name, bindingType, loc);
+ scope.var.add(name);
+ this.maybeExportDefined(scope, name);
+ if (scope.flags & 387) break;
+ }
+ }
+ if (this.parser.inModule && scope.flags & 1) {
+ this.undefinedExports.delete(name);
+ }
+ }
+ maybeExportDefined(scope, name) {
+ if (this.parser.inModule && scope.flags & 1) {
+ this.undefinedExports.delete(name);
+ }
+ }
+ checkRedeclarationInScope(scope, name, bindingType, loc) {
+ if (this.isRedeclaredInScope(scope, name, bindingType)) {
+ this.parser.raise(Errors.VarRedeclaration, {
+ at: loc,
+ identifierName: name
+ });
+ }
+ }
+ isRedeclaredInScope(scope, name, bindingType) {
+ if (!(bindingType & 1)) return false;
+ if (bindingType & 8) {
+ return scope.lexical.has(name) || scope.functions.has(name) || scope.var.has(name);
+ }
+ if (bindingType & 16) {
+ return scope.lexical.has(name) || !this.treatFunctionsAsVarInScope(scope) && scope.var.has(name);
+ }
+ return scope.lexical.has(name) && !(scope.flags & 8 && scope.lexical.values().next().value === name) || !this.treatFunctionsAsVarInScope(scope) && scope.functions.has(name);
+ }
+ checkLocalExport(id) {
+ const {
+ name
+ } = id;
+ const topLevelScope = this.scopeStack[0];
+ if (!topLevelScope.lexical.has(name) && !topLevelScope.var.has(name) && !topLevelScope.functions.has(name)) {
+ this.undefinedExports.set(name, id.loc.start);
+ }
+ }
+ currentScope() {
+ return this.scopeStack[this.scopeStack.length - 1];
+ }
+ currentVarScopeFlags() {
+ for (let i = this.scopeStack.length - 1;; i--) {
+ const {
+ flags
+ } = this.scopeStack[i];
+ if (flags & 387) {
+ return flags;
+ }
+ }
+ }
+ currentThisScopeFlags() {
+ for (let i = this.scopeStack.length - 1;; i--) {
+ const {
+ flags
+ } = this.scopeStack[i];
+ if (flags & (387 | 64) && !(flags & 4)) {
+ return flags;
+ }
+ }
+ }
+ }
+ class FlowScope extends Scope {
+ constructor(...args) {
+ super(...args);
+ this.declareFunctions = new Set();
+ }
+ }
+ class FlowScopeHandler extends ScopeHandler {
+ createScope(flags) {
+ return new FlowScope(flags);
+ }
+ declareName(name, bindingType, loc) {
+ const scope = this.currentScope();
+ if (bindingType & 2048) {
+ this.checkRedeclarationInScope(scope, name, bindingType, loc);
+ this.maybeExportDefined(scope, name);
+ scope.declareFunctions.add(name);
+ return;
+ }
+ super.declareName(name, bindingType, loc);
+ }
+ isRedeclaredInScope(scope, name, bindingType) {
+ if (super.isRedeclaredInScope(scope, name, bindingType)) return true;
+ if (bindingType & 2048) {
+ return !scope.declareFunctions.has(name) && (scope.lexical.has(name) || scope.functions.has(name));
+ }
+ return false;
+ }
+ checkLocalExport(id) {
+ if (!this.scopeStack[0].declareFunctions.has(id.name)) {
+ super.checkLocalExport(id);
+ }
+ }
+ }
+ class BaseParser {
+ constructor() {
+ this.sawUnambiguousESM = false;
+ this.ambiguousScriptDifferentAst = false;
+ }
+ hasPlugin(pluginConfig) {
+ if (typeof pluginConfig === "string") {
+ return this.plugins.has(pluginConfig);
+ } else {
+ const [pluginName, pluginOptions] = pluginConfig;
+ if (!this.hasPlugin(pluginName)) {
+ return false;
+ }
+ const actualOptions = this.plugins.get(pluginName);
+ for (const key of Object.keys(pluginOptions)) {
+ if ((actualOptions == null ? void 0 : actualOptions[key]) !== pluginOptions[key]) {
+ return false;
+ }
+ }
+ return true;
+ }
+ }
+ getPluginOption(plugin, name) {
+ var _this$plugins$get;
+ return (_this$plugins$get = this.plugins.get(plugin)) == null ? void 0 : _this$plugins$get[name];
+ }
+ }
+ function setTrailingComments(node, comments) {
+ if (node.trailingComments === undefined) {
+ node.trailingComments = comments;
+ } else {
+ node.trailingComments.unshift(...comments);
+ }
+ }
+ function setLeadingComments(node, comments) {
+ if (node.leadingComments === undefined) {
+ node.leadingComments = comments;
+ } else {
+ node.leadingComments.unshift(...comments);
+ }
+ }
+ function setInnerComments(node, comments) {
+ if (node.innerComments === undefined) {
+ node.innerComments = comments;
+ } else {
+ node.innerComments.unshift(...comments);
+ }
+ }
+ function adjustInnerComments(node, elements, commentWS) {
+ let lastElement = null;
+ let i = elements.length;
+ while (lastElement === null && i > 0) {
+ lastElement = elements[--i];
+ }
+ if (lastElement === null || lastElement.start > commentWS.start) {
+ setInnerComments(node, commentWS.comments);
+ } else {
+ setTrailingComments(lastElement, commentWS.comments);
+ }
+ }
+ class CommentsParser extends BaseParser {
+ addComment(comment) {
+ if (this.filename) comment.loc.filename = this.filename;
+ this.state.comments.push(comment);
+ }
+ processComment(node) {
+ const {
+ commentStack
+ } = this.state;
+ const commentStackLength = commentStack.length;
+ if (commentStackLength === 0) return;
+ let i = commentStackLength - 1;
+ const lastCommentWS = commentStack[i];
+ if (lastCommentWS.start === node.end) {
+ lastCommentWS.leadingNode = node;
+ i--;
+ }
+ const {
+ start: nodeStart
+ } = node;
+ for (; i >= 0; i--) {
+ const commentWS = commentStack[i];
+ const commentEnd = commentWS.end;
+ if (commentEnd > nodeStart) {
+ commentWS.containingNode = node;
+ this.finalizeComment(commentWS);
+ commentStack.splice(i, 1);
+ } else {
+ if (commentEnd === nodeStart) {
+ commentWS.trailingNode = node;
+ }
+ break;
+ }
+ }
+ }
+ finalizeComment(commentWS) {
+ const {
+ comments
+ } = commentWS;
+ if (commentWS.leadingNode !== null || commentWS.trailingNode !== null) {
+ if (commentWS.leadingNode !== null) {
+ setTrailingComments(commentWS.leadingNode, comments);
+ }
+ if (commentWS.trailingNode !== null) {
+ setLeadingComments(commentWS.trailingNode, comments);
+ }
+ } else {
+ const {
+ containingNode: node,
+ start: commentStart
+ } = commentWS;
+ if (this.input.charCodeAt(commentStart - 1) === 44) {
+ switch (node.type) {
+ case "ObjectExpression":
+ case "ObjectPattern":
+ case "RecordExpression":
+ adjustInnerComments(node, node.properties, commentWS);
+ break;
+ case "CallExpression":
+ case "OptionalCallExpression":
+ adjustInnerComments(node, node.arguments, commentWS);
+ break;
+ case "FunctionDeclaration":
+ case "FunctionExpression":
+ case "ArrowFunctionExpression":
+ case "ObjectMethod":
+ case "ClassMethod":
+ case "ClassPrivateMethod":
+ adjustInnerComments(node, node.params, commentWS);
+ break;
+ case "ArrayExpression":
+ case "ArrayPattern":
+ case "TupleExpression":
+ adjustInnerComments(node, node.elements, commentWS);
+ break;
+ case "ExportNamedDeclaration":
+ case "ImportDeclaration":
+ adjustInnerComments(node, node.specifiers, commentWS);
+ break;
+ default:
+ {
+ setInnerComments(node, comments);
+ }
+ }
+ } else {
+ setInnerComments(node, comments);
+ }
+ }
+ }
+ finalizeRemainingComments() {
+ const {
+ commentStack
+ } = this.state;
+ for (let i = commentStack.length - 1; i >= 0; i--) {
+ this.finalizeComment(commentStack[i]);
+ }
+ this.state.commentStack = [];
+ }
+ resetPreviousNodeTrailingComments(node) {
+ const {
+ commentStack
+ } = this.state;
+ const {
+ length
+ } = commentStack;
+ if (length === 0) return;
+ const commentWS = commentStack[length - 1];
+ if (commentWS.leadingNode === node) {
+ commentWS.leadingNode = null;
+ }
+ }
+ resetPreviousIdentifierLeadingComments(node) {
+ const {
+ commentStack
+ } = this.state;
+ const {
+ length
+ } = commentStack;
+ if (length === 0) return;
+ if (commentStack[length - 1].trailingNode === node) {
+ commentStack[length - 1].trailingNode = null;
+ } else if (length >= 2 && commentStack[length - 2].trailingNode === node) {
+ commentStack[length - 2].trailingNode = null;
+ }
+ }
+ takeSurroundingComments(node, start, end) {
+ const {
+ commentStack
+ } = this.state;
+ const commentStackLength = commentStack.length;
+ if (commentStackLength === 0) return;
+ let i = commentStackLength - 1;
+ for (; i >= 0; i--) {
+ const commentWS = commentStack[i];
+ const commentEnd = commentWS.end;
+ const commentStart = commentWS.start;
+ if (commentStart === end) {
+ commentWS.leadingNode = node;
+ } else if (commentEnd === start) {
+ commentWS.trailingNode = node;
+ } else if (commentEnd < start) {
+ break;
+ }
+ }
+ }
+ }
+ const lineBreak = /\r\n?|[\n\u2028\u2029]/;
+ const lineBreakG = new RegExp(lineBreak.source, "g");
+ function isNewLine(code) {
+ switch (code) {
+ case 10:
+ case 13:
+ case 8232:
+ case 8233:
+ return true;
+ default:
+ return false;
+ }
+ }
+ const skipWhiteSpace = /(?:\s|\/\/.*|\/\*[^]*?\*\/)*/g;
+ const skipWhiteSpaceInLine = /(?:[^\S\n\r\u2028\u2029]|\/\/.*|\/\*.*?\*\/)*/g;
+ const skipWhiteSpaceToLineBreak = new RegExp("(?=(" + skipWhiteSpaceInLine.source + "))\\1" + /(?=[\n\r\u2028\u2029]|\/\*(?!.*?\*\/)|$)/.source, "y");
+ function isWhitespace(code) {
+ switch (code) {
+ case 0x0009:
+ case 0x000b:
+ case 0x000c:
+ case 32:
+ case 160:
+ case 5760:
+ case 0x2000:
+ case 0x2001:
+ case 0x2002:
+ case 0x2003:
+ case 0x2004:
+ case 0x2005:
+ case 0x2006:
+ case 0x2007:
+ case 0x2008:
+ case 0x2009:
+ case 0x200a:
+ case 0x202f:
+ case 0x205f:
+ case 0x3000:
+ case 0xfeff:
+ return true;
+ default:
+ return false;
+ }
+ }
+ class State {
+ constructor() {
+ this.strict = void 0;
+ this.curLine = void 0;
+ this.lineStart = void 0;
+ this.startLoc = void 0;
+ this.endLoc = void 0;
+ this.errors = [];
+ this.potentialArrowAt = -1;
+ this.noArrowAt = [];
+ this.noArrowParamsConversionAt = [];
+ this.maybeInArrowParameters = false;
+ this.inType = false;
+ this.noAnonFunctionType = false;
+ this.hasFlowComment = false;
+ this.isAmbientContext = false;
+ this.inAbstractClass = false;
+ this.inDisallowConditionalTypesContext = false;
+ this.topicContext = {
+ maxNumOfResolvableTopics: 0,
+ maxTopicIndex: null
+ };
+ this.soloAwait = false;
+ this.inFSharpPipelineDirectBody = false;
+ this.labels = [];
+ this.comments = [];
+ this.commentStack = [];
+ this.pos = 0;
+ this.type = 139;
+ this.value = null;
+ this.start = 0;
+ this.end = 0;
+ this.lastTokEndLoc = null;
+ this.lastTokStartLoc = null;
+ this.lastTokStart = 0;
+ this.context = [types.brace];
+ this.canStartJSXElement = true;
+ this.containsEsc = false;
+ this.firstInvalidTemplateEscapePos = null;
+ this.strictErrors = new Map();
+ this.tokensLength = 0;
+ }
+ init({
+ strictMode,
+ sourceType,
+ startLine,
+ startColumn
+ }) {
+ this.strict = strictMode === false ? false : strictMode === true ? true : sourceType === "module";
+ this.curLine = startLine;
+ this.lineStart = -startColumn;
+ this.startLoc = this.endLoc = new Position(startLine, startColumn, 0);
+ }
+ curPosition() {
+ return new Position(this.curLine, this.pos - this.lineStart, this.pos);
+ }
+ clone(skipArrays) {
+ const state = new State();
+ const keys = Object.keys(this);
+ for (let i = 0, length = keys.length; i < length; i++) {
+ const key = keys[i];
+ let val = this[key];
+ if (!skipArrays && Array.isArray(val)) {
+ val = val.slice();
+ }
+ state[key] = val;
+ }
+ return state;
+ }
+ }
+ var _isDigit = function isDigit(code) {
+ return code >= 48 && code <= 57;
+ };
+ const forbiddenNumericSeparatorSiblings = {
+ decBinOct: new Set([46, 66, 69, 79, 95, 98, 101, 111]),
+ hex: new Set([46, 88, 95, 120])
+ };
+ const isAllowedNumericSeparatorSibling = {
+ bin: ch => ch === 48 || ch === 49,
+ oct: ch => ch >= 48 && ch <= 55,
+ dec: ch => ch >= 48 && ch <= 57,
+ hex: ch => ch >= 48 && ch <= 57 || ch >= 65 && ch <= 70 || ch >= 97 && ch <= 102
+ };
+ function readStringContents(type, input, pos, lineStart, curLine, errors) {
+ const initialPos = pos;
+ const initialLineStart = lineStart;
+ const initialCurLine = curLine;
+ let out = "";
+ let firstInvalidLoc = null;
+ let chunkStart = pos;
+ const {
+ length
+ } = input;
+ for (;;) {
+ if (pos >= length) {
+ errors.unterminated(initialPos, initialLineStart, initialCurLine);
+ out += input.slice(chunkStart, pos);
+ break;
+ }
+ const ch = input.charCodeAt(pos);
+ if (isStringEnd(type, ch, input, pos)) {
+ out += input.slice(chunkStart, pos);
+ break;
+ }
+ if (ch === 92) {
+ out += input.slice(chunkStart, pos);
+ const res = readEscapedChar(input, pos, lineStart, curLine, type === "template", errors);
+ if (res.ch === null && !firstInvalidLoc) {
+ firstInvalidLoc = {
+ pos,
+ lineStart,
+ curLine
+ };
+ } else {
+ out += res.ch;
+ }
+ ({
+ pos,
+ lineStart,
+ curLine
+ } = res);
+ chunkStart = pos;
+ } else if (ch === 8232 || ch === 8233) {
+ ++pos;
+ ++curLine;
+ lineStart = pos;
+ } else if (ch === 10 || ch === 13) {
+ if (type === "template") {
+ out += input.slice(chunkStart, pos) + "\n";
+ ++pos;
+ if (ch === 13 && input.charCodeAt(pos) === 10) {
+ ++pos;
+ }
+ ++curLine;
+ chunkStart = lineStart = pos;
+ } else {
+ errors.unterminated(initialPos, initialLineStart, initialCurLine);
+ }
+ } else {
+ ++pos;
+ }
+ }
+ return {
+ pos,
+ str: out,
+ firstInvalidLoc,
+ lineStart,
+ curLine,
+ containsInvalid: !!firstInvalidLoc
+ };
+ }
+ function isStringEnd(type, ch, input, pos) {
+ if (type === "template") {
+ return ch === 96 || ch === 36 && input.charCodeAt(pos + 1) === 123;
+ }
+ return ch === (type === "double" ? 34 : 39);
+ }
+ function readEscapedChar(input, pos, lineStart, curLine, inTemplate, errors) {
+ const throwOnInvalid = !inTemplate;
+ pos++;
+ const res = ch => ({
+ pos,
+ ch,
+ lineStart,
+ curLine
+ });
+ const ch = input.charCodeAt(pos++);
+ switch (ch) {
+ case 110:
+ return res("\n");
+ case 114:
+ return res("\r");
+ case 120:
+ {
+ let code;
+ ({
+ code,
+ pos
+ } = readHexChar(input, pos, lineStart, curLine, 2, false, throwOnInvalid, errors));
+ return res(code === null ? null : String.fromCharCode(code));
+ }
+ case 117:
+ {
+ let code;
+ ({
+ code,
+ pos
+ } = readCodePoint(input, pos, lineStart, curLine, throwOnInvalid, errors));
+ return res(code === null ? null : String.fromCodePoint(code));
+ }
+ case 116:
+ return res("\t");
+ case 98:
+ return res("\b");
+ case 118:
+ return res("\u000b");
+ case 102:
+ return res("\f");
+ case 13:
+ if (input.charCodeAt(pos) === 10) {
+ ++pos;
+ }
+ case 10:
+ lineStart = pos;
+ ++curLine;
+ case 8232:
+ case 8233:
+ return res("");
+ case 56:
+ case 57:
+ if (inTemplate) {
+ return res(null);
+ } else {
+ errors.strictNumericEscape(pos - 1, lineStart, curLine);
+ }
+ default:
+ if (ch >= 48 && ch <= 55) {
+ const startPos = pos - 1;
+ const match = input.slice(startPos, pos + 2).match(/^[0-7]+/);
+ let octalStr = match[0];
+ let octal = parseInt(octalStr, 8);
+ if (octal > 255) {
+ octalStr = octalStr.slice(0, -1);
+ octal = parseInt(octalStr, 8);
+ }
+ pos += octalStr.length - 1;
+ const next = input.charCodeAt(pos);
+ if (octalStr !== "0" || next === 56 || next === 57) {
+ if (inTemplate) {
+ return res(null);
+ } else {
+ errors.strictNumericEscape(startPos, lineStart, curLine);
+ }
+ }
+ return res(String.fromCharCode(octal));
+ }
+ return res(String.fromCharCode(ch));
+ }
+ }
+ function readHexChar(input, pos, lineStart, curLine, len, forceLen, throwOnInvalid, errors) {
+ const initialPos = pos;
+ let n;
+ ({
+ n,
+ pos
+ } = readInt(input, pos, lineStart, curLine, 16, len, forceLen, false, errors, !throwOnInvalid));
+ if (n === null) {
+ if (throwOnInvalid) {
+ errors.invalidEscapeSequence(initialPos, lineStart, curLine);
+ } else {
+ pos = initialPos - 1;
+ }
+ }
+ return {
+ code: n,
+ pos
+ };
+ }
+ function readInt(input, pos, lineStart, curLine, radix, len, forceLen, allowNumSeparator, errors, bailOnError) {
+ const start = pos;
+ const forbiddenSiblings = radix === 16 ? forbiddenNumericSeparatorSiblings.hex : forbiddenNumericSeparatorSiblings.decBinOct;
+ const isAllowedSibling = radix === 16 ? isAllowedNumericSeparatorSibling.hex : radix === 10 ? isAllowedNumericSeparatorSibling.dec : radix === 8 ? isAllowedNumericSeparatorSibling.oct : isAllowedNumericSeparatorSibling.bin;
+ let invalid = false;
+ let total = 0;
+ for (let i = 0, e = len == null ? Infinity : len; i < e; ++i) {
+ const code = input.charCodeAt(pos);
+ let val;
+ if (code === 95 && allowNumSeparator !== "bail") {
+ const prev = input.charCodeAt(pos - 1);
+ const next = input.charCodeAt(pos + 1);
+ if (!allowNumSeparator) {
+ if (bailOnError) return {
+ n: null,
+ pos
+ };
+ errors.numericSeparatorInEscapeSequence(pos, lineStart, curLine);
+ } else if (Number.isNaN(next) || !isAllowedSibling(next) || forbiddenSiblings.has(prev) || forbiddenSiblings.has(next)) {
+ if (bailOnError) return {
+ n: null,
+ pos
+ };
+ errors.unexpectedNumericSeparator(pos, lineStart, curLine);
+ }
+ ++pos;
+ continue;
+ }
+ if (code >= 97) {
+ val = code - 97 + 10;
+ } else if (code >= 65) {
+ val = code - 65 + 10;
+ } else if (_isDigit(code)) {
+ val = code - 48;
+ } else {
+ val = Infinity;
+ }
+ if (val >= radix) {
+ if (val <= 9 && bailOnError) {
+ return {
+ n: null,
+ pos
+ };
+ } else if (val <= 9 && errors.invalidDigit(pos, lineStart, curLine, radix)) {
+ val = 0;
+ } else if (forceLen) {
+ val = 0;
+ invalid = true;
+ } else {
+ break;
+ }
+ }
+ ++pos;
+ total = total * radix + val;
+ }
+ if (pos === start || len != null && pos - start !== len || invalid) {
+ return {
+ n: null,
+ pos
+ };
+ }
+ return {
+ n: total,
+ pos
+ };
+ }
+ function readCodePoint(input, pos, lineStart, curLine, throwOnInvalid, errors) {
+ const ch = input.charCodeAt(pos);
+ let code;
+ if (ch === 123) {
+ ++pos;
+ ({
+ code,
+ pos
+ } = readHexChar(input, pos, lineStart, curLine, input.indexOf("}", pos) - pos, true, throwOnInvalid, errors));
+ ++pos;
+ if (code !== null && code > 0x10ffff) {
+ if (throwOnInvalid) {
+ errors.invalidCodePoint(pos, lineStart, curLine);
+ } else {
+ return {
+ code: null,
+ pos
+ };
+ }
+ }
+ } else {
+ ({
+ code,
+ pos
+ } = readHexChar(input, pos, lineStart, curLine, 4, false, throwOnInvalid, errors));
+ }
+ return {
+ code,
+ pos
+ };
+ }
+ const _excluded = ["at"],
+ _excluded2 = ["at"];
+ function buildPosition(pos, lineStart, curLine) {
+ return new Position(curLine, pos - lineStart, pos);
+ }
+ const VALID_REGEX_FLAGS = new Set([103, 109, 115, 105, 121, 117, 100, 118]);
+ class Token {
+ constructor(state) {
+ this.type = state.type;
+ this.value = state.value;
+ this.start = state.start;
+ this.end = state.end;
+ this.loc = new SourceLocation(state.startLoc, state.endLoc);
+ }
+ }
+ class Tokenizer extends CommentsParser {
+ constructor(options, input) {
+ super();
+ this.isLookahead = void 0;
+ this.tokens = [];
+ this.errorHandlers_readInt = {
+ invalidDigit: (pos, lineStart, curLine, radix) => {
+ if (!this.options.errorRecovery) return false;
+ this.raise(Errors.InvalidDigit, {
+ at: buildPosition(pos, lineStart, curLine),
+ radix
+ });
+ return true;
+ },
+ numericSeparatorInEscapeSequence: this.errorBuilder(Errors.NumericSeparatorInEscapeSequence),
+ unexpectedNumericSeparator: this.errorBuilder(Errors.UnexpectedNumericSeparator)
+ };
+ this.errorHandlers_readCodePoint = Object.assign({}, this.errorHandlers_readInt, {
+ invalidEscapeSequence: this.errorBuilder(Errors.InvalidEscapeSequence),
+ invalidCodePoint: this.errorBuilder(Errors.InvalidCodePoint)
+ });
+ this.errorHandlers_readStringContents_string = Object.assign({}, this.errorHandlers_readCodePoint, {
+ strictNumericEscape: (pos, lineStart, curLine) => {
+ this.recordStrictModeErrors(Errors.StrictNumericEscape, {
+ at: buildPosition(pos, lineStart, curLine)
+ });
+ },
+ unterminated: (pos, lineStart, curLine) => {
+ throw this.raise(Errors.UnterminatedString, {
+ at: buildPosition(pos - 1, lineStart, curLine)
+ });
+ }
+ });
+ this.errorHandlers_readStringContents_template = Object.assign({}, this.errorHandlers_readCodePoint, {
+ strictNumericEscape: this.errorBuilder(Errors.StrictNumericEscape),
+ unterminated: (pos, lineStart, curLine) => {
+ throw this.raise(Errors.UnterminatedTemplate, {
+ at: buildPosition(pos, lineStart, curLine)
+ });
+ }
+ });
+ this.state = new State();
+ this.state.init(options);
+ this.input = input;
+ this.length = input.length;
+ this.isLookahead = false;
+ }
+ pushToken(token) {
+ this.tokens.length = this.state.tokensLength;
+ this.tokens.push(token);
+ ++this.state.tokensLength;
+ }
+ next() {
+ this.checkKeywordEscapes();
+ if (this.options.tokens) {
+ this.pushToken(new Token(this.state));
+ }
+ this.state.lastTokStart = this.state.start;
+ this.state.lastTokEndLoc = this.state.endLoc;
+ this.state.lastTokStartLoc = this.state.startLoc;
+ this.nextToken();
+ }
+ eat(type) {
+ if (this.match(type)) {
+ this.next();
+ return true;
+ } else {
+ return false;
+ }
+ }
+ match(type) {
+ return this.state.type === type;
+ }
+ createLookaheadState(state) {
+ return {
+ pos: state.pos,
+ value: null,
+ type: state.type,
+ start: state.start,
+ end: state.end,
+ context: [this.curContext()],
+ inType: state.inType,
+ startLoc: state.startLoc,
+ lastTokEndLoc: state.lastTokEndLoc,
+ curLine: state.curLine,
+ lineStart: state.lineStart,
+ curPosition: state.curPosition
+ };
+ }
+ lookahead() {
+ const old = this.state;
+ this.state = this.createLookaheadState(old);
+ this.isLookahead = true;
+ this.nextToken();
+ this.isLookahead = false;
+ const curr = this.state;
+ this.state = old;
+ return curr;
+ }
+ nextTokenStart() {
+ return this.nextTokenStartSince(this.state.pos);
+ }
+ nextTokenStartSince(pos) {
+ skipWhiteSpace.lastIndex = pos;
+ return skipWhiteSpace.test(this.input) ? skipWhiteSpace.lastIndex : pos;
+ }
+ lookaheadCharCode() {
+ return this.input.charCodeAt(this.nextTokenStart());
+ }
+ nextTokenInLineStart() {
+ return this.nextTokenInLineStartSince(this.state.pos);
+ }
+ nextTokenInLineStartSince(pos) {
+ skipWhiteSpaceInLine.lastIndex = pos;
+ return skipWhiteSpaceInLine.test(this.input) ? skipWhiteSpaceInLine.lastIndex : pos;
+ }
+ lookaheadInLineCharCode() {
+ return this.input.charCodeAt(this.nextTokenInLineStart());
+ }
+ codePointAtPos(pos) {
+ let cp = this.input.charCodeAt(pos);
+ if ((cp & 0xfc00) === 0xd800 && ++pos < this.input.length) {
+ const trail = this.input.charCodeAt(pos);
+ if ((trail & 0xfc00) === 0xdc00) {
+ cp = 0x10000 + ((cp & 0x3ff) << 10) + (trail & 0x3ff);
+ }
+ }
+ return cp;
+ }
+ setStrict(strict) {
+ this.state.strict = strict;
+ if (strict) {
+ this.state.strictErrors.forEach(([toParseError, at]) => this.raise(toParseError, {
+ at
+ }));
+ this.state.strictErrors.clear();
+ }
+ }
+ curContext() {
+ return this.state.context[this.state.context.length - 1];
+ }
+ nextToken() {
+ this.skipSpace();
+ this.state.start = this.state.pos;
+ if (!this.isLookahead) this.state.startLoc = this.state.curPosition();
+ if (this.state.pos >= this.length) {
+ this.finishToken(139);
+ return;
+ }
+ this.getTokenFromCode(this.codePointAtPos(this.state.pos));
+ }
+ skipBlockComment(commentEnd) {
+ let startLoc;
+ if (!this.isLookahead) startLoc = this.state.curPosition();
+ const start = this.state.pos;
+ const end = this.input.indexOf(commentEnd, start + 2);
+ if (end === -1) {
+ throw this.raise(Errors.UnterminatedComment, {
+ at: this.state.curPosition()
+ });
+ }
+ this.state.pos = end + commentEnd.length;
+ lineBreakG.lastIndex = start + 2;
+ while (lineBreakG.test(this.input) && lineBreakG.lastIndex <= end) {
+ ++this.state.curLine;
+ this.state.lineStart = lineBreakG.lastIndex;
+ }
+ if (this.isLookahead) return;
+ const comment = {
+ type: "CommentBlock",
+ value: this.input.slice(start + 2, end),
+ start,
+ end: end + commentEnd.length,
+ loc: new SourceLocation(startLoc, this.state.curPosition())
+ };
+ if (this.options.tokens) this.pushToken(comment);
+ return comment;
+ }
+ skipLineComment(startSkip) {
+ const start = this.state.pos;
+ let startLoc;
+ if (!this.isLookahead) startLoc = this.state.curPosition();
+ let ch = this.input.charCodeAt(this.state.pos += startSkip);
+ if (this.state.pos < this.length) {
+ while (!isNewLine(ch) && ++this.state.pos < this.length) {
+ ch = this.input.charCodeAt(this.state.pos);
+ }
+ }
+ if (this.isLookahead) return;
+ const end = this.state.pos;
+ const value = this.input.slice(start + startSkip, end);
+ const comment = {
+ type: "CommentLine",
+ value,
+ start,
+ end,
+ loc: new SourceLocation(startLoc, this.state.curPosition())
+ };
+ if (this.options.tokens) this.pushToken(comment);
+ return comment;
+ }
+ skipSpace() {
+ const spaceStart = this.state.pos;
+ const comments = [];
+ loop: while (this.state.pos < this.length) {
+ const ch = this.input.charCodeAt(this.state.pos);
+ switch (ch) {
+ case 32:
+ case 160:
+ case 9:
+ ++this.state.pos;
+ break;
+ case 13:
+ if (this.input.charCodeAt(this.state.pos + 1) === 10) {
+ ++this.state.pos;
+ }
+ case 10:
+ case 8232:
+ case 8233:
+ ++this.state.pos;
+ ++this.state.curLine;
+ this.state.lineStart = this.state.pos;
+ break;
+ case 47:
+ switch (this.input.charCodeAt(this.state.pos + 1)) {
+ case 42:
+ {
+ const comment = this.skipBlockComment("*/");
+ if (comment !== undefined) {
+ this.addComment(comment);
+ if (this.options.attachComment) comments.push(comment);
+ }
+ break;
+ }
+ case 47:
+ {
+ const comment = this.skipLineComment(2);
+ if (comment !== undefined) {
+ this.addComment(comment);
+ if (this.options.attachComment) comments.push(comment);
+ }
+ break;
+ }
+ default:
+ break loop;
+ }
+ break;
+ default:
+ if (isWhitespace(ch)) {
+ ++this.state.pos;
+ } else if (ch === 45 && !this.inModule && this.options.annexB) {
+ const pos = this.state.pos;
+ if (this.input.charCodeAt(pos + 1) === 45 && this.input.charCodeAt(pos + 2) === 62 && (spaceStart === 0 || this.state.lineStart > spaceStart)) {
+ const comment = this.skipLineComment(3);
+ if (comment !== undefined) {
+ this.addComment(comment);
+ if (this.options.attachComment) comments.push(comment);
+ }
+ } else {
+ break loop;
+ }
+ } else if (ch === 60 && !this.inModule && this.options.annexB) {
+ const pos = this.state.pos;
+ if (this.input.charCodeAt(pos + 1) === 33 && this.input.charCodeAt(pos + 2) === 45 && this.input.charCodeAt(pos + 3) === 45) {
+ const comment = this.skipLineComment(4);
+ if (comment !== undefined) {
+ this.addComment(comment);
+ if (this.options.attachComment) comments.push(comment);
+ }
+ } else {
+ break loop;
+ }
+ } else {
+ break loop;
+ }
+ }
+ }
+ if (comments.length > 0) {
+ const end = this.state.pos;
+ const commentWhitespace = {
+ start: spaceStart,
+ end,
+ comments,
+ leadingNode: null,
+ trailingNode: null,
+ containingNode: null
+ };
+ this.state.commentStack.push(commentWhitespace);
+ }
+ }
+ finishToken(type, val) {
+ this.state.end = this.state.pos;
+ this.state.endLoc = this.state.curPosition();
+ const prevType = this.state.type;
+ this.state.type = type;
+ this.state.value = val;
+ if (!this.isLookahead) {
+ this.updateContext(prevType);
+ }
+ }
+ replaceToken(type) {
+ this.state.type = type;
+ this.updateContext();
+ }
+ readToken_numberSign() {
+ if (this.state.pos === 0 && this.readToken_interpreter()) {
+ return;
+ }
+ const nextPos = this.state.pos + 1;
+ const next = this.codePointAtPos(nextPos);
+ if (next >= 48 && next <= 57) {
+ throw this.raise(Errors.UnexpectedDigitAfterHash, {
+ at: this.state.curPosition()
+ });
+ }
+ if (next === 123 || next === 91 && this.hasPlugin("recordAndTuple")) {
+ this.expectPlugin("recordAndTuple");
+ if (this.getPluginOption("recordAndTuple", "syntaxType") === "bar") {
+ throw this.raise(next === 123 ? Errors.RecordExpressionHashIncorrectStartSyntaxType : Errors.TupleExpressionHashIncorrectStartSyntaxType, {
+ at: this.state.curPosition()
+ });
+ }
+ this.state.pos += 2;
+ if (next === 123) {
+ this.finishToken(7);
+ } else {
+ this.finishToken(1);
+ }
+ } else if (isIdentifierStart(next)) {
+ ++this.state.pos;
+ this.finishToken(138, this.readWord1(next));
+ } else if (next === 92) {
+ ++this.state.pos;
+ this.finishToken(138, this.readWord1());
+ } else {
+ this.finishOp(27, 1);
+ }
+ }
+ readToken_dot() {
+ const next = this.input.charCodeAt(this.state.pos + 1);
+ if (next >= 48 && next <= 57) {
+ this.readNumber(true);
+ return;
+ }
+ if (next === 46 && this.input.charCodeAt(this.state.pos + 2) === 46) {
+ this.state.pos += 3;
+ this.finishToken(21);
+ } else {
+ ++this.state.pos;
+ this.finishToken(16);
+ }
+ }
+ readToken_slash() {
+ const next = this.input.charCodeAt(this.state.pos + 1);
+ if (next === 61) {
+ this.finishOp(31, 2);
+ } else {
+ this.finishOp(56, 1);
+ }
+ }
+ readToken_interpreter() {
+ if (this.state.pos !== 0 || this.length < 2) return false;
+ let ch = this.input.charCodeAt(this.state.pos + 1);
+ if (ch !== 33) return false;
+ const start = this.state.pos;
+ this.state.pos += 1;
+ while (!isNewLine(ch) && ++this.state.pos < this.length) {
+ ch = this.input.charCodeAt(this.state.pos);
+ }
+ const value = this.input.slice(start + 2, this.state.pos);
+ this.finishToken(28, value);
+ return true;
+ }
+ readToken_mult_modulo(code) {
+ let type = code === 42 ? 55 : 54;
+ let width = 1;
+ let next = this.input.charCodeAt(this.state.pos + 1);
+ if (code === 42 && next === 42) {
+ width++;
+ next = this.input.charCodeAt(this.state.pos + 2);
+ type = 57;
+ }
+ if (next === 61 && !this.state.inType) {
+ width++;
+ type = code === 37 ? 33 : 30;
+ }
+ this.finishOp(type, width);
+ }
+ readToken_pipe_amp(code) {
+ const next = this.input.charCodeAt(this.state.pos + 1);
+ if (next === code) {
+ if (this.input.charCodeAt(this.state.pos + 2) === 61) {
+ this.finishOp(30, 3);
+ } else {
+ this.finishOp(code === 124 ? 41 : 42, 2);
+ }
+ return;
+ }
+ if (code === 124) {
+ if (next === 62) {
+ this.finishOp(39, 2);
+ return;
+ }
+ if (this.hasPlugin("recordAndTuple") && next === 125) {
+ if (this.getPluginOption("recordAndTuple", "syntaxType") !== "bar") {
+ throw this.raise(Errors.RecordExpressionBarIncorrectEndSyntaxType, {
+ at: this.state.curPosition()
+ });
+ }
+ this.state.pos += 2;
+ this.finishToken(9);
+ return;
+ }
+ if (this.hasPlugin("recordAndTuple") && next === 93) {
+ if (this.getPluginOption("recordAndTuple", "syntaxType") !== "bar") {
+ throw this.raise(Errors.TupleExpressionBarIncorrectEndSyntaxType, {
+ at: this.state.curPosition()
+ });
+ }
+ this.state.pos += 2;
+ this.finishToken(4);
+ return;
+ }
+ }
+ if (next === 61) {
+ this.finishOp(30, 2);
+ return;
+ }
+ this.finishOp(code === 124 ? 43 : 45, 1);
+ }
+ readToken_caret() {
+ const next = this.input.charCodeAt(this.state.pos + 1);
+ if (next === 61 && !this.state.inType) {
+ this.finishOp(32, 2);
+ } else if (next === 94 && this.hasPlugin(["pipelineOperator", {
+ proposal: "hack",
+ topicToken: "^^"
+ }])) {
+ this.finishOp(37, 2);
+ const lookaheadCh = this.input.codePointAt(this.state.pos);
+ if (lookaheadCh === 94) {
+ this.unexpected();
+ }
+ } else {
+ this.finishOp(44, 1);
+ }
+ }
+ readToken_atSign() {
+ const next = this.input.charCodeAt(this.state.pos + 1);
+ if (next === 64 && this.hasPlugin(["pipelineOperator", {
+ proposal: "hack",
+ topicToken: "@@"
+ }])) {
+ this.finishOp(38, 2);
+ } else {
+ this.finishOp(26, 1);
+ }
+ }
+ readToken_plus_min(code) {
+ const next = this.input.charCodeAt(this.state.pos + 1);
+ if (next === code) {
+ this.finishOp(34, 2);
+ return;
+ }
+ if (next === 61) {
+ this.finishOp(30, 2);
+ } else {
+ this.finishOp(53, 1);
+ }
+ }
+ readToken_lt() {
+ const {
+ pos
+ } = this.state;
+ const next = this.input.charCodeAt(pos + 1);
+ if (next === 60) {
+ if (this.input.charCodeAt(pos + 2) === 61) {
+ this.finishOp(30, 3);
+ return;
+ }
+ this.finishOp(51, 2);
+ return;
+ }
+ if (next === 61) {
+ this.finishOp(49, 2);
+ return;
+ }
+ this.finishOp(47, 1);
+ }
+ readToken_gt() {
+ const {
+ pos
+ } = this.state;
+ const next = this.input.charCodeAt(pos + 1);
+ if (next === 62) {
+ const size = this.input.charCodeAt(pos + 2) === 62 ? 3 : 2;
+ if (this.input.charCodeAt(pos + size) === 61) {
+ this.finishOp(30, size + 1);
+ return;
+ }
+ this.finishOp(52, size);
+ return;
+ }
+ if (next === 61) {
+ this.finishOp(49, 2);
+ return;
+ }
+ this.finishOp(48, 1);
+ }
+ readToken_eq_excl(code) {
+ const next = this.input.charCodeAt(this.state.pos + 1);
+ if (next === 61) {
+ this.finishOp(46, this.input.charCodeAt(this.state.pos + 2) === 61 ? 3 : 2);
+ return;
+ }
+ if (code === 61 && next === 62) {
+ this.state.pos += 2;
+ this.finishToken(19);
+ return;
+ }
+ this.finishOp(code === 61 ? 29 : 35, 1);
+ }
+ readToken_question() {
+ const next = this.input.charCodeAt(this.state.pos + 1);
+ const next2 = this.input.charCodeAt(this.state.pos + 2);
+ if (next === 63) {
+ if (next2 === 61) {
+ this.finishOp(30, 3);
+ } else {
+ this.finishOp(40, 2);
+ }
+ } else if (next === 46 && !(next2 >= 48 && next2 <= 57)) {
+ this.state.pos += 2;
+ this.finishToken(18);
+ } else {
+ ++this.state.pos;
+ this.finishToken(17);
+ }
+ }
+ getTokenFromCode(code) {
+ switch (code) {
+ case 46:
+ this.readToken_dot();
+ return;
+ case 40:
+ ++this.state.pos;
+ this.finishToken(10);
+ return;
+ case 41:
+ ++this.state.pos;
+ this.finishToken(11);
+ return;
+ case 59:
+ ++this.state.pos;
+ this.finishToken(13);
+ return;
+ case 44:
+ ++this.state.pos;
+ this.finishToken(12);
+ return;
+ case 91:
+ if (this.hasPlugin("recordAndTuple") && this.input.charCodeAt(this.state.pos + 1) === 124) {
+ if (this.getPluginOption("recordAndTuple", "syntaxType") !== "bar") {
+ throw this.raise(Errors.TupleExpressionBarIncorrectStartSyntaxType, {
+ at: this.state.curPosition()
+ });
+ }
+ this.state.pos += 2;
+ this.finishToken(2);
+ } else {
+ ++this.state.pos;
+ this.finishToken(0);
+ }
+ return;
+ case 93:
+ ++this.state.pos;
+ this.finishToken(3);
+ return;
+ case 123:
+ if (this.hasPlugin("recordAndTuple") && this.input.charCodeAt(this.state.pos + 1) === 124) {
+ if (this.getPluginOption("recordAndTuple", "syntaxType") !== "bar") {
+ throw this.raise(Errors.RecordExpressionBarIncorrectStartSyntaxType, {
+ at: this.state.curPosition()
+ });
+ }
+ this.state.pos += 2;
+ this.finishToken(6);
+ } else {
+ ++this.state.pos;
+ this.finishToken(5);
+ }
+ return;
+ case 125:
+ ++this.state.pos;
+ this.finishToken(8);
+ return;
+ case 58:
+ if (this.hasPlugin("functionBind") && this.input.charCodeAt(this.state.pos + 1) === 58) {
+ this.finishOp(15, 2);
+ } else {
+ ++this.state.pos;
+ this.finishToken(14);
+ }
+ return;
+ case 63:
+ this.readToken_question();
+ return;
+ case 96:
+ this.readTemplateToken();
+ return;
+ case 48:
+ {
+ const next = this.input.charCodeAt(this.state.pos + 1);
+ if (next === 120 || next === 88) {
+ this.readRadixNumber(16);
+ return;
+ }
+ if (next === 111 || next === 79) {
+ this.readRadixNumber(8);
+ return;
+ }
+ if (next === 98 || next === 66) {
+ this.readRadixNumber(2);
+ return;
+ }
+ }
+ case 49:
+ case 50:
+ case 51:
+ case 52:
+ case 53:
+ case 54:
+ case 55:
+ case 56:
+ case 57:
+ this.readNumber(false);
+ return;
+ case 34:
+ case 39:
+ this.readString(code);
+ return;
+ case 47:
+ this.readToken_slash();
+ return;
+ case 37:
+ case 42:
+ this.readToken_mult_modulo(code);
+ return;
+ case 124:
+ case 38:
+ this.readToken_pipe_amp(code);
+ return;
+ case 94:
+ this.readToken_caret();
+ return;
+ case 43:
+ case 45:
+ this.readToken_plus_min(code);
+ return;
+ case 60:
+ this.readToken_lt();
+ return;
+ case 62:
+ this.readToken_gt();
+ return;
+ case 61:
+ case 33:
+ this.readToken_eq_excl(code);
+ return;
+ case 126:
+ this.finishOp(36, 1);
+ return;
+ case 64:
+ this.readToken_atSign();
+ return;
+ case 35:
+ this.readToken_numberSign();
+ return;
+ case 92:
+ this.readWord();
+ return;
+ default:
+ if (isIdentifierStart(code)) {
+ this.readWord(code);
+ return;
+ }
+ }
+ throw this.raise(Errors.InvalidOrUnexpectedToken, {
+ at: this.state.curPosition(),
+ unexpected: String.fromCodePoint(code)
+ });
+ }
+ finishOp(type, size) {
+ const str = this.input.slice(this.state.pos, this.state.pos + size);
+ this.state.pos += size;
+ this.finishToken(type, str);
+ }
+ readRegexp() {
+ const startLoc = this.state.startLoc;
+ const start = this.state.start + 1;
+ let escaped, inClass;
+ let {
+ pos
+ } = this.state;
+ for (;; ++pos) {
+ if (pos >= this.length) {
+ throw this.raise(Errors.UnterminatedRegExp, {
+ at: createPositionWithColumnOffset(startLoc, 1)
+ });
+ }
+ const ch = this.input.charCodeAt(pos);
+ if (isNewLine(ch)) {
+ throw this.raise(Errors.UnterminatedRegExp, {
+ at: createPositionWithColumnOffset(startLoc, 1)
+ });
+ }
+ if (escaped) {
+ escaped = false;
+ } else {
+ if (ch === 91) {
+ inClass = true;
+ } else if (ch === 93 && inClass) {
+ inClass = false;
+ } else if (ch === 47 && !inClass) {
+ break;
+ }
+ escaped = ch === 92;
+ }
+ }
+ const content = this.input.slice(start, pos);
+ ++pos;
+ let mods = "";
+ const nextPos = () => createPositionWithColumnOffset(startLoc, pos + 2 - start);
+ while (pos < this.length) {
+ const cp = this.codePointAtPos(pos);
+ const char = String.fromCharCode(cp);
+ if (VALID_REGEX_FLAGS.has(cp)) {
+ if (cp === 118) {
+ if (mods.includes("u")) {
+ this.raise(Errors.IncompatibleRegExpUVFlags, {
+ at: nextPos()
+ });
+ }
+ } else if (cp === 117) {
+ if (mods.includes("v")) {
+ this.raise(Errors.IncompatibleRegExpUVFlags, {
+ at: nextPos()
+ });
+ }
+ }
+ if (mods.includes(char)) {
+ this.raise(Errors.DuplicateRegExpFlags, {
+ at: nextPos()
+ });
+ }
+ } else if (isIdentifierChar(cp) || cp === 92) {
+ this.raise(Errors.MalformedRegExpFlags, {
+ at: nextPos()
+ });
+ } else {
+ break;
+ }
+ ++pos;
+ mods += char;
+ }
+ this.state.pos = pos;
+ this.finishToken(137, {
+ pattern: content,
+ flags: mods
+ });
+ }
+ readInt(radix, len, forceLen = false, allowNumSeparator = true) {
+ const {
+ n,
+ pos
+ } = readInt(this.input, this.state.pos, this.state.lineStart, this.state.curLine, radix, len, forceLen, allowNumSeparator, this.errorHandlers_readInt, false);
+ this.state.pos = pos;
+ return n;
+ }
+ readRadixNumber(radix) {
+ const startLoc = this.state.curPosition();
+ let isBigInt = false;
+ this.state.pos += 2;
+ const val = this.readInt(radix);
+ if (val == null) {
+ this.raise(Errors.InvalidDigit, {
+ at: createPositionWithColumnOffset(startLoc, 2),
+ radix
+ });
+ }
+ const next = this.input.charCodeAt(this.state.pos);
+ if (next === 110) {
+ ++this.state.pos;
+ isBigInt = true;
+ } else if (next === 109) {
+ throw this.raise(Errors.InvalidDecimal, {
+ at: startLoc
+ });
+ }
+ if (isIdentifierStart(this.codePointAtPos(this.state.pos))) {
+ throw this.raise(Errors.NumberIdentifier, {
+ at: this.state.curPosition()
+ });
+ }
+ if (isBigInt) {
+ const str = this.input.slice(startLoc.index, this.state.pos).replace(/[_n]/g, "");
+ this.finishToken(135, str);
+ return;
+ }
+ this.finishToken(134, val);
+ }
+ readNumber(startsWithDot) {
+ const start = this.state.pos;
+ const startLoc = this.state.curPosition();
+ let isFloat = false;
+ let isBigInt = false;
+ let isDecimal = false;
+ let hasExponent = false;
+ let isOctal = false;
+ if (!startsWithDot && this.readInt(10) === null) {
+ this.raise(Errors.InvalidNumber, {
+ at: this.state.curPosition()
+ });
+ }
+ const hasLeadingZero = this.state.pos - start >= 2 && this.input.charCodeAt(start) === 48;
+ if (hasLeadingZero) {
+ const integer = this.input.slice(start, this.state.pos);
+ this.recordStrictModeErrors(Errors.StrictOctalLiteral, {
+ at: startLoc
+ });
+ if (!this.state.strict) {
+ const underscorePos = integer.indexOf("_");
+ if (underscorePos > 0) {
+ this.raise(Errors.ZeroDigitNumericSeparator, {
+ at: createPositionWithColumnOffset(startLoc, underscorePos)
+ });
+ }
+ }
+ isOctal = hasLeadingZero && !/[89]/.test(integer);
+ }
+ let next = this.input.charCodeAt(this.state.pos);
+ if (next === 46 && !isOctal) {
+ ++this.state.pos;
+ this.readInt(10);
+ isFloat = true;
+ next = this.input.charCodeAt(this.state.pos);
+ }
+ if ((next === 69 || next === 101) && !isOctal) {
+ next = this.input.charCodeAt(++this.state.pos);
+ if (next === 43 || next === 45) {
+ ++this.state.pos;
+ }
+ if (this.readInt(10) === null) {
+ this.raise(Errors.InvalidOrMissingExponent, {
+ at: startLoc
+ });
+ }
+ isFloat = true;
+ hasExponent = true;
+ next = this.input.charCodeAt(this.state.pos);
+ }
+ if (next === 110) {
+ if (isFloat || hasLeadingZero) {
+ this.raise(Errors.InvalidBigIntLiteral, {
+ at: startLoc
+ });
+ }
+ ++this.state.pos;
+ isBigInt = true;
+ }
+ if (next === 109) {
+ this.expectPlugin("decimal", this.state.curPosition());
+ if (hasExponent || hasLeadingZero) {
+ this.raise(Errors.InvalidDecimal, {
+ at: startLoc
+ });
+ }
+ ++this.state.pos;
+ isDecimal = true;
+ }
+ if (isIdentifierStart(this.codePointAtPos(this.state.pos))) {
+ throw this.raise(Errors.NumberIdentifier, {
+ at: this.state.curPosition()
+ });
+ }
+ const str = this.input.slice(start, this.state.pos).replace(/[_mn]/g, "");
+ if (isBigInt) {
+ this.finishToken(135, str);
+ return;
+ }
+ if (isDecimal) {
+ this.finishToken(136, str);
+ return;
+ }
+ const val = isOctal ? parseInt(str, 8) : parseFloat(str);
+ this.finishToken(134, val);
+ }
+ readCodePoint(throwOnInvalid) {
+ const {
+ code,
+ pos
+ } = readCodePoint(this.input, this.state.pos, this.state.lineStart, this.state.curLine, throwOnInvalid, this.errorHandlers_readCodePoint);
+ this.state.pos = pos;
+ return code;
+ }
+ readString(quote) {
+ const {
+ str,
+ pos,
+ curLine,
+ lineStart
+ } = readStringContents(quote === 34 ? "double" : "single", this.input, this.state.pos + 1, this.state.lineStart, this.state.curLine, this.errorHandlers_readStringContents_string);
+ this.state.pos = pos + 1;
+ this.state.lineStart = lineStart;
+ this.state.curLine = curLine;
+ this.finishToken(133, str);
+ }
+ readTemplateContinuation() {
+ if (!this.match(8)) {
+ this.unexpected(null, 8);
+ }
+ this.state.pos--;
+ this.readTemplateToken();
+ }
+ readTemplateToken() {
+ const opening = this.input[this.state.pos];
+ const {
+ str,
+ firstInvalidLoc,
+ pos,
+ curLine,
+ lineStart
+ } = readStringContents("template", this.input, this.state.pos + 1, this.state.lineStart, this.state.curLine, this.errorHandlers_readStringContents_template);
+ this.state.pos = pos + 1;
+ this.state.lineStart = lineStart;
+ this.state.curLine = curLine;
+ if (firstInvalidLoc) {
+ this.state.firstInvalidTemplateEscapePos = new Position(firstInvalidLoc.curLine, firstInvalidLoc.pos - firstInvalidLoc.lineStart, firstInvalidLoc.pos);
+ }
+ if (this.input.codePointAt(pos) === 96) {
+ this.finishToken(24, firstInvalidLoc ? null : opening + str + "`");
+ } else {
+ this.state.pos++;
+ this.finishToken(25, firstInvalidLoc ? null : opening + str + "${");
+ }
+ }
+ recordStrictModeErrors(toParseError, {
+ at
+ }) {
+ const index = at.index;
+ if (this.state.strict && !this.state.strictErrors.has(index)) {
+ this.raise(toParseError, {
+ at
+ });
+ } else {
+ this.state.strictErrors.set(index, [toParseError, at]);
+ }
+ }
+ readWord1(firstCode) {
+ this.state.containsEsc = false;
+ let word = "";
+ const start = this.state.pos;
+ let chunkStart = this.state.pos;
+ if (firstCode !== undefined) {
+ this.state.pos += firstCode <= 0xffff ? 1 : 2;
+ }
+ while (this.state.pos < this.length) {
+ const ch = this.codePointAtPos(this.state.pos);
+ if (isIdentifierChar(ch)) {
+ this.state.pos += ch <= 0xffff ? 1 : 2;
+ } else if (ch === 92) {
+ this.state.containsEsc = true;
+ word += this.input.slice(chunkStart, this.state.pos);
+ const escStart = this.state.curPosition();
+ const identifierCheck = this.state.pos === start ? isIdentifierStart : isIdentifierChar;
+ if (this.input.charCodeAt(++this.state.pos) !== 117) {
+ this.raise(Errors.MissingUnicodeEscape, {
+ at: this.state.curPosition()
+ });
+ chunkStart = this.state.pos - 1;
+ continue;
+ }
+ ++this.state.pos;
+ const esc = this.readCodePoint(true);
+ if (esc !== null) {
+ if (!identifierCheck(esc)) {
+ this.raise(Errors.EscapedCharNotAnIdentifier, {
+ at: escStart
+ });
+ }
+ word += String.fromCodePoint(esc);
+ }
+ chunkStart = this.state.pos;
+ } else {
+ break;
+ }
+ }
+ return word + this.input.slice(chunkStart, this.state.pos);
+ }
+ readWord(firstCode) {
+ const word = this.readWord1(firstCode);
+ const type = keywords$1.get(word);
+ if (type !== undefined) {
+ this.finishToken(type, tokenLabelName(type));
+ } else {
+ this.finishToken(132, word);
+ }
+ }
+ checkKeywordEscapes() {
+ const {
+ type
+ } = this.state;
+ if (tokenIsKeyword(type) && this.state.containsEsc) {
+ this.raise(Errors.InvalidEscapedReservedWord, {
+ at: this.state.startLoc,
+ reservedWord: tokenLabelName(type)
+ });
+ }
+ }
+ raise(toParseError, raiseProperties) {
+ const {
+ at
+ } = raiseProperties,
+ details = _objectWithoutPropertiesLoose(raiseProperties, _excluded);
+ const loc = at instanceof Position ? at : at.loc.start;
+ const error = toParseError({
+ loc,
+ details
+ });
+ if (!this.options.errorRecovery) throw error;
+ if (!this.isLookahead) this.state.errors.push(error);
+ return error;
+ }
+ raiseOverwrite(toParseError, raiseProperties) {
+ const {
+ at
+ } = raiseProperties,
+ details = _objectWithoutPropertiesLoose(raiseProperties, _excluded2);
+ const loc = at instanceof Position ? at : at.loc.start;
+ const pos = loc.index;
+ const errors = this.state.errors;
+ for (let i = errors.length - 1; i >= 0; i--) {
+ const error = errors[i];
+ if (error.loc.index === pos) {
+ return errors[i] = toParseError({
+ loc,
+ details
+ });
+ }
+ if (error.loc.index < pos) break;
+ }
+ return this.raise(toParseError, raiseProperties);
+ }
+ updateContext(prevType) {}
+ unexpected(loc, type) {
+ throw this.raise(Errors.UnexpectedToken, {
+ expected: type ? tokenLabelName(type) : null,
+ at: loc != null ? loc : this.state.startLoc
+ });
+ }
+ expectPlugin(pluginName, loc) {
+ if (this.hasPlugin(pluginName)) {
+ return true;
+ }
+ throw this.raise(Errors.MissingPlugin, {
+ at: loc != null ? loc : this.state.startLoc,
+ missingPlugin: [pluginName]
+ });
+ }
+ expectOnePlugin(pluginNames) {
+ if (!pluginNames.some(name => this.hasPlugin(name))) {
+ throw this.raise(Errors.MissingOneOfPlugins, {
+ at: this.state.startLoc,
+ missingPlugin: pluginNames
+ });
+ }
+ }
+ errorBuilder(error) {
+ return (pos, lineStart, curLine) => {
+ this.raise(error, {
+ at: buildPosition(pos, lineStart, curLine)
+ });
+ };
+ }
+ }
+ class ClassScope {
+ constructor() {
+ this.privateNames = new Set();
+ this.loneAccessors = new Map();
+ this.undefinedPrivateNames = new Map();
+ }
+ }
+ class ClassScopeHandler {
+ constructor(parser) {
+ this.parser = void 0;
+ this.stack = [];
+ this.undefinedPrivateNames = new Map();
+ this.parser = parser;
+ }
+ current() {
+ return this.stack[this.stack.length - 1];
+ }
+ enter() {
+ this.stack.push(new ClassScope());
+ }
+ exit() {
+ const oldClassScope = this.stack.pop();
+ const current = this.current();
+ for (const [name, loc] of Array.from(oldClassScope.undefinedPrivateNames)) {
+ if (current) {
+ if (!current.undefinedPrivateNames.has(name)) {
+ current.undefinedPrivateNames.set(name, loc);
+ }
+ } else {
+ this.parser.raise(Errors.InvalidPrivateFieldResolution, {
+ at: loc,
+ identifierName: name
+ });
+ }
+ }
+ }
+ declarePrivateName(name, elementType, loc) {
+ const {
+ privateNames,
+ loneAccessors,
+ undefinedPrivateNames
+ } = this.current();
+ let redefined = privateNames.has(name);
+ if (elementType & 3) {
+ const accessor = redefined && loneAccessors.get(name);
+ if (accessor) {
+ const oldStatic = accessor & 4;
+ const newStatic = elementType & 4;
+ const oldKind = accessor & 3;
+ const newKind = elementType & 3;
+ redefined = oldKind === newKind || oldStatic !== newStatic;
+ if (!redefined) loneAccessors.delete(name);
+ } else if (!redefined) {
+ loneAccessors.set(name, elementType);
+ }
+ }
+ if (redefined) {
+ this.parser.raise(Errors.PrivateNameRedeclaration, {
+ at: loc,
+ identifierName: name
+ });
+ }
+ privateNames.add(name);
+ undefinedPrivateNames.delete(name);
+ }
+ usePrivateName(name, loc) {
+ let classScope;
+ for (classScope of this.stack) {
+ if (classScope.privateNames.has(name)) return;
+ }
+ if (classScope) {
+ classScope.undefinedPrivateNames.set(name, loc);
+ } else {
+ this.parser.raise(Errors.InvalidPrivateFieldResolution, {
+ at: loc,
+ identifierName: name
+ });
+ }
+ }
+ }
+ class ExpressionScope {
+ constructor(type = 0) {
+ this.type = type;
+ }
+ canBeArrowParameterDeclaration() {
+ return this.type === 2 || this.type === 1;
+ }
+ isCertainlyParameterDeclaration() {
+ return this.type === 3;
+ }
+ }
+ class ArrowHeadParsingScope extends ExpressionScope {
+ constructor(type) {
+ super(type);
+ this.declarationErrors = new Map();
+ }
+ recordDeclarationError(ParsingErrorClass, {
+ at
+ }) {
+ const index = at.index;
+ this.declarationErrors.set(index, [ParsingErrorClass, at]);
+ }
+ clearDeclarationError(index) {
+ this.declarationErrors.delete(index);
+ }
+ iterateErrors(iterator) {
+ this.declarationErrors.forEach(iterator);
+ }
+ }
+ class ExpressionScopeHandler {
+ constructor(parser) {
+ this.parser = void 0;
+ this.stack = [new ExpressionScope()];
+ this.parser = parser;
+ }
+ enter(scope) {
+ this.stack.push(scope);
+ }
+ exit() {
+ this.stack.pop();
+ }
+ recordParameterInitializerError(toParseError, {
+ at: node
+ }) {
+ const origin = {
+ at: node.loc.start
+ };
+ const {
+ stack
+ } = this;
+ let i = stack.length - 1;
+ let scope = stack[i];
+ while (!scope.isCertainlyParameterDeclaration()) {
+ if (scope.canBeArrowParameterDeclaration()) {
+ scope.recordDeclarationError(toParseError, origin);
+ } else {
+ return;
+ }
+ scope = stack[--i];
+ }
+ this.parser.raise(toParseError, origin);
+ }
+ recordArrowParameterBindingError(error, {
+ at: node
+ }) {
+ const {
+ stack
+ } = this;
+ const scope = stack[stack.length - 1];
+ const origin = {
+ at: node.loc.start
+ };
+ if (scope.isCertainlyParameterDeclaration()) {
+ this.parser.raise(error, origin);
+ } else if (scope.canBeArrowParameterDeclaration()) {
+ scope.recordDeclarationError(error, origin);
+ } else {
+ return;
+ }
+ }
+ recordAsyncArrowParametersError({
+ at
+ }) {
+ const {
+ stack
+ } = this;
+ let i = stack.length - 1;
+ let scope = stack[i];
+ while (scope.canBeArrowParameterDeclaration()) {
+ if (scope.type === 2) {
+ scope.recordDeclarationError(Errors.AwaitBindingIdentifier, {
+ at
+ });
+ }
+ scope = stack[--i];
+ }
+ }
+ validateAsPattern() {
+ const {
+ stack
+ } = this;
+ const currentScope = stack[stack.length - 1];
+ if (!currentScope.canBeArrowParameterDeclaration()) return;
+ currentScope.iterateErrors(([toParseError, loc]) => {
+ this.parser.raise(toParseError, {
+ at: loc
+ });
+ let i = stack.length - 2;
+ let scope = stack[i];
+ while (scope.canBeArrowParameterDeclaration()) {
+ scope.clearDeclarationError(loc.index);
+ scope = stack[--i];
+ }
+ });
+ }
+ }
+ function newParameterDeclarationScope() {
+ return new ExpressionScope(3);
+ }
+ function newArrowHeadScope() {
+ return new ArrowHeadParsingScope(1);
+ }
+ function newAsyncArrowScope() {
+ return new ArrowHeadParsingScope(2);
+ }
+ function newExpressionScope() {
+ return new ExpressionScope();
+ }
+ const PARAM = 0b0000,
+ PARAM_YIELD = 0b0001,
+ PARAM_AWAIT = 0b0010,
+ PARAM_RETURN = 0b0100,
+ PARAM_IN = 0b1000;
+ class ProductionParameterHandler {
+ constructor() {
+ this.stacks = [];
+ }
+ enter(flags) {
+ this.stacks.push(flags);
+ }
+ exit() {
+ this.stacks.pop();
+ }
+ currentFlags() {
+ return this.stacks[this.stacks.length - 1];
+ }
+ get hasAwait() {
+ return (this.currentFlags() & PARAM_AWAIT) > 0;
+ }
+ get hasYield() {
+ return (this.currentFlags() & PARAM_YIELD) > 0;
+ }
+ get hasReturn() {
+ return (this.currentFlags() & PARAM_RETURN) > 0;
+ }
+ get hasIn() {
+ return (this.currentFlags() & PARAM_IN) > 0;
+ }
+ }
+ function functionFlags(isAsync, isGenerator) {
+ return (isAsync ? PARAM_AWAIT : 0) | (isGenerator ? PARAM_YIELD : 0);
+ }
+ class UtilParser extends Tokenizer {
+ addExtra(node, key, value, enumerable = true) {
+ if (!node) return;
+ const extra = node.extra = node.extra || {};
+ if (enumerable) {
+ extra[key] = value;
+ } else {
+ Object.defineProperty(extra, key, {
+ enumerable,
+ value
+ });
+ }
+ }
+ isContextual(token) {
+ return this.state.type === token && !this.state.containsEsc;
+ }
+ isUnparsedContextual(nameStart, name) {
+ const nameEnd = nameStart + name.length;
+ if (this.input.slice(nameStart, nameEnd) === name) {
+ const nextCh = this.input.charCodeAt(nameEnd);
+ return !(isIdentifierChar(nextCh) || (nextCh & 0xfc00) === 0xd800);
+ }
+ return false;
+ }
+ isLookaheadContextual(name) {
+ const next = this.nextTokenStart();
+ return this.isUnparsedContextual(next, name);
+ }
+ eatContextual(token) {
+ if (this.isContextual(token)) {
+ this.next();
+ return true;
+ }
+ return false;
+ }
+ expectContextual(token, toParseError) {
+ if (!this.eatContextual(token)) {
+ if (toParseError != null) {
+ throw this.raise(toParseError, {
+ at: this.state.startLoc
+ });
+ }
+ this.unexpected(null, token);
+ }
+ }
+ canInsertSemicolon() {
+ return this.match(139) || this.match(8) || this.hasPrecedingLineBreak();
+ }
+ hasPrecedingLineBreak() {
+ return lineBreak.test(this.input.slice(this.state.lastTokEndLoc.index, this.state.start));
+ }
+ hasFollowingLineBreak() {
+ skipWhiteSpaceToLineBreak.lastIndex = this.state.end;
+ return skipWhiteSpaceToLineBreak.test(this.input);
+ }
+ isLineTerminator() {
+ return this.eat(13) || this.canInsertSemicolon();
+ }
+ semicolon(allowAsi = true) {
+ if (allowAsi ? this.isLineTerminator() : this.eat(13)) return;
+ this.raise(Errors.MissingSemicolon, {
+ at: this.state.lastTokEndLoc
+ });
+ }
+ expect(type, loc) {
+ this.eat(type) || this.unexpected(loc, type);
+ }
+ tryParse(fn, oldState = this.state.clone()) {
+ const abortSignal = {
+ node: null
+ };
+ try {
+ const node = fn((node = null) => {
+ abortSignal.node = node;
+ throw abortSignal;
+ });
+ if (this.state.errors.length > oldState.errors.length) {
+ const failState = this.state;
+ this.state = oldState;
+ this.state.tokensLength = failState.tokensLength;
+ return {
+ node,
+ error: failState.errors[oldState.errors.length],
+ thrown: false,
+ aborted: false,
+ failState
+ };
+ }
+ return {
+ node,
+ error: null,
+ thrown: false,
+ aborted: false,
+ failState: null
+ };
+ } catch (error) {
+ const failState = this.state;
+ this.state = oldState;
+ if (error instanceof SyntaxError) {
+ return {
+ node: null,
+ error,
+ thrown: true,
+ aborted: false,
+ failState
+ };
+ }
+ if (error === abortSignal) {
+ return {
+ node: abortSignal.node,
+ error: null,
+ thrown: false,
+ aborted: true,
+ failState
+ };
+ }
+ throw error;
+ }
+ }
+ checkExpressionErrors(refExpressionErrors, andThrow) {
+ if (!refExpressionErrors) return false;
+ const {
+ shorthandAssignLoc,
+ doubleProtoLoc,
+ privateKeyLoc,
+ optionalParametersLoc
+ } = refExpressionErrors;
+ const hasErrors = !!shorthandAssignLoc || !!doubleProtoLoc || !!optionalParametersLoc || !!privateKeyLoc;
+ if (!andThrow) {
+ return hasErrors;
+ }
+ if (shorthandAssignLoc != null) {
+ this.raise(Errors.InvalidCoverInitializedName, {
+ at: shorthandAssignLoc
+ });
+ }
+ if (doubleProtoLoc != null) {
+ this.raise(Errors.DuplicateProto, {
+ at: doubleProtoLoc
+ });
+ }
+ if (privateKeyLoc != null) {
+ this.raise(Errors.UnexpectedPrivateField, {
+ at: privateKeyLoc
+ });
+ }
+ if (optionalParametersLoc != null) {
+ this.unexpected(optionalParametersLoc);
+ }
+ }
+ isLiteralPropertyName() {
+ return tokenIsLiteralPropertyName(this.state.type);
+ }
+ isPrivateName(node) {
+ return node.type === "PrivateName";
+ }
+ getPrivateNameSV(node) {
+ return node.id.name;
+ }
+ hasPropertyAsPrivateName(node) {
+ return (node.type === "MemberExpression" || node.type === "OptionalMemberExpression") && this.isPrivateName(node.property);
+ }
+ isObjectProperty(node) {
+ return node.type === "ObjectProperty";
+ }
+ isObjectMethod(node) {
+ return node.type === "ObjectMethod";
+ }
+ initializeScopes(inModule = this.options.sourceType === "module") {
+ const oldLabels = this.state.labels;
+ this.state.labels = [];
+ const oldExportedIdentifiers = this.exportedIdentifiers;
+ this.exportedIdentifiers = new Set();
+ const oldInModule = this.inModule;
+ this.inModule = inModule;
+ const oldScope = this.scope;
+ const ScopeHandler = this.getScopeHandler();
+ this.scope = new ScopeHandler(this, inModule);
+ const oldProdParam = this.prodParam;
+ this.prodParam = new ProductionParameterHandler();
+ const oldClassScope = this.classScope;
+ this.classScope = new ClassScopeHandler(this);
+ const oldExpressionScope = this.expressionScope;
+ this.expressionScope = new ExpressionScopeHandler(this);
+ return () => {
+ this.state.labels = oldLabels;
+ this.exportedIdentifiers = oldExportedIdentifiers;
+ this.inModule = oldInModule;
+ this.scope = oldScope;
+ this.prodParam = oldProdParam;
+ this.classScope = oldClassScope;
+ this.expressionScope = oldExpressionScope;
+ };
+ }
+ enterInitialScopes() {
+ let paramFlags = PARAM;
+ if (this.inModule) {
+ paramFlags |= PARAM_AWAIT;
+ }
+ this.scope.enter(1);
+ this.prodParam.enter(paramFlags);
+ }
+ checkDestructuringPrivate(refExpressionErrors) {
+ const {
+ privateKeyLoc
+ } = refExpressionErrors;
+ if (privateKeyLoc !== null) {
+ this.expectPlugin("destructuringPrivate", privateKeyLoc);
+ }
+ }
+ }
+ class ExpressionErrors {
+ constructor() {
+ this.shorthandAssignLoc = null;
+ this.doubleProtoLoc = null;
+ this.privateKeyLoc = null;
+ this.optionalParametersLoc = null;
+ }
+ }
+ class Node {
+ constructor(parser, pos, loc) {
+ this.type = "";
+ this.start = pos;
+ this.end = 0;
+ this.loc = new SourceLocation(loc);
+ if (parser != null && parser.options.ranges) this.range = [pos, 0];
+ if (parser != null && parser.filename) this.loc.filename = parser.filename;
+ }
+ }
+ const NodePrototype = Node.prototype;
+ {
+ NodePrototype.__clone = function () {
+ const newNode = new Node(undefined, this.start, this.loc.start);
+ const keys = Object.keys(this);
+ for (let i = 0, length = keys.length; i < length; i++) {
+ const key = keys[i];
+ if (key !== "leadingComments" && key !== "trailingComments" && key !== "innerComments") {
+ newNode[key] = this[key];
+ }
+ }
+ return newNode;
+ };
+ }
+ function clonePlaceholder(node) {
+ return cloneIdentifier(node);
+ }
+ function cloneIdentifier(node) {
+ const {
+ type,
+ start,
+ end,
+ loc,
+ range,
+ extra,
+ name
+ } = node;
+ const cloned = Object.create(NodePrototype);
+ cloned.type = type;
+ cloned.start = start;
+ cloned.end = end;
+ cloned.loc = loc;
+ cloned.range = range;
+ cloned.extra = extra;
+ cloned.name = name;
+ if (type === "Placeholder") {
+ cloned.expectedNode = node.expectedNode;
+ }
+ return cloned;
+ }
+ function cloneStringLiteral(node) {
+ const {
+ type,
+ start,
+ end,
+ loc,
+ range,
+ extra
+ } = node;
+ if (type === "Placeholder") {
+ return clonePlaceholder(node);
+ }
+ const cloned = Object.create(NodePrototype);
+ cloned.type = type;
+ cloned.start = start;
+ cloned.end = end;
+ cloned.loc = loc;
+ cloned.range = range;
+ if (node.raw !== undefined) {
+ cloned.raw = node.raw;
+ } else {
+ cloned.extra = extra;
+ }
+ cloned.value = node.value;
+ return cloned;
+ }
+ class NodeUtils extends UtilParser {
+ startNode() {
+ return new Node(this, this.state.start, this.state.startLoc);
+ }
+ startNodeAt(loc) {
+ return new Node(this, loc.index, loc);
+ }
+ startNodeAtNode(type) {
+ return this.startNodeAt(type.loc.start);
+ }
+ finishNode(node, type) {
+ return this.finishNodeAt(node, type, this.state.lastTokEndLoc);
+ }
+ finishNodeAt(node, type, endLoc) {
+ node.type = type;
+ node.end = endLoc.index;
+ node.loc.end = endLoc;
+ if (this.options.ranges) node.range[1] = endLoc.index;
+ if (this.options.attachComment) this.processComment(node);
+ return node;
+ }
+ resetStartLocation(node, startLoc) {
+ node.start = startLoc.index;
+ node.loc.start = startLoc;
+ if (this.options.ranges) node.range[0] = startLoc.index;
+ }
+ resetEndLocation(node, endLoc = this.state.lastTokEndLoc) {
+ node.end = endLoc.index;
+ node.loc.end = endLoc;
+ if (this.options.ranges) node.range[1] = endLoc.index;
+ }
+ resetStartLocationFromNode(node, locationNode) {
+ this.resetStartLocation(node, locationNode.loc.start);
+ }
+ }
+ const reservedTypes = new Set(["_", "any", "bool", "boolean", "empty", "extends", "false", "interface", "mixed", "null", "number", "static", "string", "true", "typeof", "void"]);
+ const FlowErrors = ParseErrorEnum`flow`({
+ AmbiguousConditionalArrow: "Ambiguous expression: wrap the arrow functions in parentheses to disambiguate.",
+ AmbiguousDeclareModuleKind: "Found both `declare module.exports` and `declare export` in the same module. Modules can only have 1 since they are either an ES module or they are a CommonJS module.",
+ AssignReservedType: ({
+ reservedType
+ }) => `Cannot overwrite reserved type ${reservedType}.`,
+ DeclareClassElement: "The `declare` modifier can only appear on class fields.",
+ DeclareClassFieldInitializer: "Initializers are not allowed in fields with the `declare` modifier.",
+ DuplicateDeclareModuleExports: "Duplicate `declare module.exports` statement.",
+ EnumBooleanMemberNotInitialized: ({
+ memberName,
+ enumName
+ }) => `Boolean enum members need to be initialized. Use either \`${memberName} = true,\` or \`${memberName} = false,\` in enum \`${enumName}\`.`,
+ EnumDuplicateMemberName: ({
+ memberName,
+ enumName
+ }) => `Enum member names need to be unique, but the name \`${memberName}\` has already been used before in enum \`${enumName}\`.`,
+ EnumInconsistentMemberValues: ({
+ enumName
+ }) => `Enum \`${enumName}\` has inconsistent member initializers. Either use no initializers, or consistently use literals (either booleans, numbers, or strings) for all member initializers.`,
+ EnumInvalidExplicitType: ({
+ invalidEnumType,
+ enumName
+ }) => `Enum type \`${invalidEnumType}\` is not valid. Use one of \`boolean\`, \`number\`, \`string\`, or \`symbol\` in enum \`${enumName}\`.`,
+ EnumInvalidExplicitTypeUnknownSupplied: ({
+ enumName
+ }) => `Supplied enum type is not valid. Use one of \`boolean\`, \`number\`, \`string\`, or \`symbol\` in enum \`${enumName}\`.`,
+ EnumInvalidMemberInitializerPrimaryType: ({
+ enumName,
+ memberName,
+ explicitType
+ }) => `Enum \`${enumName}\` has type \`${explicitType}\`, so the initializer of \`${memberName}\` needs to be a ${explicitType} literal.`,
+ EnumInvalidMemberInitializerSymbolType: ({
+ enumName,
+ memberName
+ }) => `Symbol enum members cannot be initialized. Use \`${memberName},\` in enum \`${enumName}\`.`,
+ EnumInvalidMemberInitializerUnknownType: ({
+ enumName,
+ memberName
+ }) => `The enum member initializer for \`${memberName}\` needs to be a literal (either a boolean, number, or string) in enum \`${enumName}\`.`,
+ EnumInvalidMemberName: ({
+ enumName,
+ memberName,
+ suggestion
+ }) => `Enum member names cannot start with lowercase 'a' through 'z'. Instead of using \`${memberName}\`, consider using \`${suggestion}\`, in enum \`${enumName}\`.`,
+ EnumNumberMemberNotInitialized: ({
+ enumName,
+ memberName
+ }) => `Number enum members need to be initialized, e.g. \`${memberName} = 1\` in enum \`${enumName}\`.`,
+ EnumStringMemberInconsistentlyInitialized: ({
+ enumName
+ }) => `String enum members need to consistently either all use initializers, or use no initializers, in enum \`${enumName}\`.`,
+ GetterMayNotHaveThisParam: "A getter cannot have a `this` parameter.",
+ ImportReflectionHasImportType: "An `import module` declaration can not use `type` or `typeof` keyword.",
+ ImportTypeShorthandOnlyInPureImport: "The `type` and `typeof` keywords on named imports can only be used on regular `import` statements. It cannot be used with `import type` or `import typeof` statements.",
+ InexactInsideExact: "Explicit inexact syntax cannot appear inside an explicit exact object type.",
+ InexactInsideNonObject: "Explicit inexact syntax cannot appear in class or interface definitions.",
+ InexactVariance: "Explicit inexact syntax cannot have variance.",
+ InvalidNonTypeImportInDeclareModule: "Imports within a `declare module` body must always be `import type` or `import typeof`.",
+ MissingTypeParamDefault: "Type parameter declaration needs a default, since a preceding type parameter declaration has a default.",
+ NestedDeclareModule: "`declare module` cannot be used inside another `declare module`.",
+ NestedFlowComment: "Cannot have a flow comment inside another flow comment.",
+ PatternIsOptional: Object.assign({
+ message: "A binding pattern parameter cannot be optional in an implementation signature."
+ }, {
+ reasonCode: "OptionalBindingPattern"
+ }),
+ SetterMayNotHaveThisParam: "A setter cannot have a `this` parameter.",
+ SpreadVariance: "Spread properties cannot have variance.",
+ ThisParamAnnotationRequired: "A type annotation is required for the `this` parameter.",
+ ThisParamBannedInConstructor: "Constructors cannot have a `this` parameter; constructors don't bind `this` like other functions.",
+ ThisParamMayNotBeOptional: "The `this` parameter cannot be optional.",
+ ThisParamMustBeFirst: "The `this` parameter must be the first function parameter.",
+ ThisParamNoDefault: "The `this` parameter may not have a default value.",
+ TypeBeforeInitializer: "Type annotations must come before default assignments, e.g. instead of `age = 25: number` use `age: number = 25`.",
+ TypeCastInPattern: "The type cast expression is expected to be wrapped with parenthesis.",
+ UnexpectedExplicitInexactInObject: "Explicit inexact syntax must appear at the end of an inexact object.",
+ UnexpectedReservedType: ({
+ reservedType
+ }) => `Unexpected reserved type ${reservedType}.`,
+ UnexpectedReservedUnderscore: "`_` is only allowed as a type argument to call or new.",
+ UnexpectedSpaceBetweenModuloChecks: "Spaces between `%` and `checks` are not allowed here.",
+ UnexpectedSpreadType: "Spread operator cannot appear in class or interface definitions.",
+ UnexpectedSubtractionOperand: 'Unexpected token, expected "number" or "bigint".',
+ UnexpectedTokenAfterTypeParameter: "Expected an arrow function after this type parameter declaration.",
+ UnexpectedTypeParameterBeforeAsyncArrowFunction: "Type parameters must come after the async keyword, e.g. instead of `<T> async () => {}`, use `async <T>() => {}`.",
+ UnsupportedDeclareExportKind: ({
+ unsupportedExportKind,
+ suggestion
+ }) => `\`declare export ${unsupportedExportKind}\` is not supported. Use \`${suggestion}\` instead.`,
+ UnsupportedStatementInDeclareModule: "Only declares and type imports are allowed inside declare module.",
+ UnterminatedFlowComment: "Unterminated flow-comment."
+ });
+ function isEsModuleType(bodyElement) {
+ return bodyElement.type === "DeclareExportAllDeclaration" || bodyElement.type === "DeclareExportDeclaration" && (!bodyElement.declaration || bodyElement.declaration.type !== "TypeAlias" && bodyElement.declaration.type !== "InterfaceDeclaration");
+ }
+ function hasTypeImportKind(node) {
+ return node.importKind === "type" || node.importKind === "typeof";
+ }
+ const exportSuggestions = {
+ const: "declare export var",
+ let: "declare export var",
+ type: "export type",
+ interface: "export interface"
+ };
+ function partition(list, test) {
+ const list1 = [];
+ const list2 = [];
+ for (let i = 0; i < list.length; i++) {
+ (test(list[i], i, list) ? list1 : list2).push(list[i]);
+ }
+ return [list1, list2];
+ }
+ const FLOW_PRAGMA_REGEX = /\*?\s*@((?:no)?flow)\b/;
+ var flow = superClass => class FlowParserMixin extends superClass {
+ constructor(...args) {
+ super(...args);
+ this.flowPragma = undefined;
+ }
+ getScopeHandler() {
+ return FlowScopeHandler;
+ }
+ shouldParseTypes() {
+ return this.getPluginOption("flow", "all") || this.flowPragma === "flow";
+ }
+ shouldParseEnums() {
+ return !!this.getPluginOption("flow", "enums");
+ }
+ finishToken(type, val) {
+ if (type !== 133 && type !== 13 && type !== 28) {
+ if (this.flowPragma === undefined) {
+ this.flowPragma = null;
+ }
+ }
+ super.finishToken(type, val);
+ }
+ addComment(comment) {
+ if (this.flowPragma === undefined) {
+ const matches = FLOW_PRAGMA_REGEX.exec(comment.value);
+ if (!matches) ;else if (matches[1] === "flow") {
+ this.flowPragma = "flow";
+ } else if (matches[1] === "noflow") {
+ this.flowPragma = "noflow";
+ } else {
+ throw new Error("Unexpected flow pragma");
+ }
+ }
+ super.addComment(comment);
+ }
+ flowParseTypeInitialiser(tok) {
+ const oldInType = this.state.inType;
+ this.state.inType = true;
+ this.expect(tok || 14);
+ const type = this.flowParseType();
+ this.state.inType = oldInType;
+ return type;
+ }
+ flowParsePredicate() {
+ const node = this.startNode();
+ const moduloLoc = this.state.startLoc;
+ this.next();
+ this.expectContextual(110);
+ if (this.state.lastTokStart > moduloLoc.index + 1) {
+ this.raise(FlowErrors.UnexpectedSpaceBetweenModuloChecks, {
+ at: moduloLoc
+ });
+ }
+ if (this.eat(10)) {
+ node.value = super.parseExpression();
+ this.expect(11);
+ return this.finishNode(node, "DeclaredPredicate");
+ } else {
+ return this.finishNode(node, "InferredPredicate");
+ }
+ }
+ flowParseTypeAndPredicateInitialiser() {
+ const oldInType = this.state.inType;
+ this.state.inType = true;
+ this.expect(14);
+ let type = null;
+ let predicate = null;
+ if (this.match(54)) {
+ this.state.inType = oldInType;
+ predicate = this.flowParsePredicate();
+ } else {
+ type = this.flowParseType();
+ this.state.inType = oldInType;
+ if (this.match(54)) {
+ predicate = this.flowParsePredicate();
+ }
+ }
+ return [type, predicate];
+ }
+ flowParseDeclareClass(node) {
+ this.next();
+ this.flowParseInterfaceish(node, true);
+ return this.finishNode(node, "DeclareClass");
+ }
+ flowParseDeclareFunction(node) {
+ this.next();
+ const id = node.id = this.parseIdentifier();
+ const typeNode = this.startNode();
+ const typeContainer = this.startNode();
+ if (this.match(47)) {
+ typeNode.typeParameters = this.flowParseTypeParameterDeclaration();
+ } else {
+ typeNode.typeParameters = null;
+ }
+ this.expect(10);
+ const tmp = this.flowParseFunctionTypeParams();
+ typeNode.params = tmp.params;
+ typeNode.rest = tmp.rest;
+ typeNode.this = tmp._this;
+ this.expect(11);
+ [typeNode.returnType, node.predicate] = this.flowParseTypeAndPredicateInitialiser();
+ typeContainer.typeAnnotation = this.finishNode(typeNode, "FunctionTypeAnnotation");
+ id.typeAnnotation = this.finishNode(typeContainer, "TypeAnnotation");
+ this.resetEndLocation(id);
+ this.semicolon();
+ this.scope.declareName(node.id.name, 2048, node.id.loc.start);
+ return this.finishNode(node, "DeclareFunction");
+ }
+ flowParseDeclare(node, insideModule) {
+ if (this.match(80)) {
+ return this.flowParseDeclareClass(node);
+ } else if (this.match(68)) {
+ return this.flowParseDeclareFunction(node);
+ } else if (this.match(74)) {
+ return this.flowParseDeclareVariable(node);
+ } else if (this.eatContextual(127)) {
+ if (this.match(16)) {
+ return this.flowParseDeclareModuleExports(node);
+ } else {
+ if (insideModule) {
+ this.raise(FlowErrors.NestedDeclareModule, {
+ at: this.state.lastTokStartLoc
+ });
+ }
+ return this.flowParseDeclareModule(node);
+ }
+ } else if (this.isContextual(130)) {
+ return this.flowParseDeclareTypeAlias(node);
+ } else if (this.isContextual(131)) {
+ return this.flowParseDeclareOpaqueType(node);
+ } else if (this.isContextual(129)) {
+ return this.flowParseDeclareInterface(node);
+ } else if (this.match(82)) {
+ return this.flowParseDeclareExportDeclaration(node, insideModule);
+ } else {
+ this.unexpected();
+ }
+ }
+ flowParseDeclareVariable(node) {
+ this.next();
+ node.id = this.flowParseTypeAnnotatableIdentifier(true);
+ this.scope.declareName(node.id.name, 5, node.id.loc.start);
+ this.semicolon();
+ return this.finishNode(node, "DeclareVariable");
+ }
+ flowParseDeclareModule(node) {
+ this.scope.enter(0);
+ if (this.match(133)) {
+ node.id = super.parseExprAtom();
+ } else {
+ node.id = this.parseIdentifier();
+ }
+ const bodyNode = node.body = this.startNode();
+ const body = bodyNode.body = [];
+ this.expect(5);
+ while (!this.match(8)) {
+ let bodyNode = this.startNode();
+ if (this.match(83)) {
+ this.next();
+ if (!this.isContextual(130) && !this.match(87)) {
+ this.raise(FlowErrors.InvalidNonTypeImportInDeclareModule, {
+ at: this.state.lastTokStartLoc
+ });
+ }
+ super.parseImport(bodyNode);
+ } else {
+ this.expectContextual(125, FlowErrors.UnsupportedStatementInDeclareModule);
+ bodyNode = this.flowParseDeclare(bodyNode, true);
+ }
+ body.push(bodyNode);
+ }
+ this.scope.exit();
+ this.expect(8);
+ this.finishNode(bodyNode, "BlockStatement");
+ let kind = null;
+ let hasModuleExport = false;
+ body.forEach(bodyElement => {
+ if (isEsModuleType(bodyElement)) {
+ if (kind === "CommonJS") {
+ this.raise(FlowErrors.AmbiguousDeclareModuleKind, {
+ at: bodyElement
+ });
+ }
+ kind = "ES";
+ } else if (bodyElement.type === "DeclareModuleExports") {
+ if (hasModuleExport) {
+ this.raise(FlowErrors.DuplicateDeclareModuleExports, {
+ at: bodyElement
+ });
+ }
+ if (kind === "ES") {
+ this.raise(FlowErrors.AmbiguousDeclareModuleKind, {
+ at: bodyElement
+ });
+ }
+ kind = "CommonJS";
+ hasModuleExport = true;
+ }
+ });
+ node.kind = kind || "CommonJS";
+ return this.finishNode(node, "DeclareModule");
+ }
+ flowParseDeclareExportDeclaration(node, insideModule) {
+ this.expect(82);
+ if (this.eat(65)) {
+ if (this.match(68) || this.match(80)) {
+ node.declaration = this.flowParseDeclare(this.startNode());
+ } else {
+ node.declaration = this.flowParseType();
+ this.semicolon();
+ }
+ node.default = true;
+ return this.finishNode(node, "DeclareExportDeclaration");
+ } else {
+ if (this.match(75) || this.isLet() || (this.isContextual(130) || this.isContextual(129)) && !insideModule) {
+ const label = this.state.value;
+ throw this.raise(FlowErrors.UnsupportedDeclareExportKind, {
+ at: this.state.startLoc,
+ unsupportedExportKind: label,
+ suggestion: exportSuggestions[label]
+ });
+ }
+ if (this.match(74) || this.match(68) || this.match(80) || this.isContextual(131)) {
+ node.declaration = this.flowParseDeclare(this.startNode());
+ node.default = false;
+ return this.finishNode(node, "DeclareExportDeclaration");
+ } else if (this.match(55) || this.match(5) || this.isContextual(129) || this.isContextual(130) || this.isContextual(131)) {
+ node = this.parseExport(node, null);
+ if (node.type === "ExportNamedDeclaration") {
+ node.type = "ExportDeclaration";
+ node.default = false;
+ delete node.exportKind;
+ }
+ node.type = "Declare" + node.type;
+ return node;
+ }
+ }
+ this.unexpected();
+ }
+ flowParseDeclareModuleExports(node) {
+ this.next();
+ this.expectContextual(111);
+ node.typeAnnotation = this.flowParseTypeAnnotation();
+ this.semicolon();
+ return this.finishNode(node, "DeclareModuleExports");
+ }
+ flowParseDeclareTypeAlias(node) {
+ this.next();
+ const finished = this.flowParseTypeAlias(node);
+ finished.type = "DeclareTypeAlias";
+ return finished;
+ }
+ flowParseDeclareOpaqueType(node) {
+ this.next();
+ const finished = this.flowParseOpaqueType(node, true);
+ finished.type = "DeclareOpaqueType";
+ return finished;
+ }
+ flowParseDeclareInterface(node) {
+ this.next();
+ this.flowParseInterfaceish(node, false);
+ return this.finishNode(node, "DeclareInterface");
+ }
+ flowParseInterfaceish(node, isClass) {
+ node.id = this.flowParseRestrictedIdentifier(!isClass, true);
+ this.scope.declareName(node.id.name, isClass ? 17 : 8201, node.id.loc.start);
+ if (this.match(47)) {
+ node.typeParameters = this.flowParseTypeParameterDeclaration();
+ } else {
+ node.typeParameters = null;
+ }
+ node.extends = [];
+ if (this.eat(81)) {
+ do {
+ node.extends.push(this.flowParseInterfaceExtends());
+ } while (!isClass && this.eat(12));
+ }
+ if (isClass) {
+ node.implements = [];
+ node.mixins = [];
+ if (this.eatContextual(117)) {
+ do {
+ node.mixins.push(this.flowParseInterfaceExtends());
+ } while (this.eat(12));
+ }
+ if (this.eatContextual(113)) {
+ do {
+ node.implements.push(this.flowParseInterfaceExtends());
+ } while (this.eat(12));
+ }
+ }
+ node.body = this.flowParseObjectType({
+ allowStatic: isClass,
+ allowExact: false,
+ allowSpread: false,
+ allowProto: isClass,
+ allowInexact: false
+ });
+ }
+ flowParseInterfaceExtends() {
+ const node = this.startNode();
+ node.id = this.flowParseQualifiedTypeIdentifier();
+ if (this.match(47)) {
+ node.typeParameters = this.flowParseTypeParameterInstantiation();
+ } else {
+ node.typeParameters = null;
+ }
+ return this.finishNode(node, "InterfaceExtends");
+ }
+ flowParseInterface(node) {
+ this.flowParseInterfaceish(node, false);
+ return this.finishNode(node, "InterfaceDeclaration");
+ }
+ checkNotUnderscore(word) {
+ if (word === "_") {
+ this.raise(FlowErrors.UnexpectedReservedUnderscore, {
+ at: this.state.startLoc
+ });
+ }
+ }
+ checkReservedType(word, startLoc, declaration) {
+ if (!reservedTypes.has(word)) return;
+ this.raise(declaration ? FlowErrors.AssignReservedType : FlowErrors.UnexpectedReservedType, {
+ at: startLoc,
+ reservedType: word
+ });
+ }
+ flowParseRestrictedIdentifier(liberal, declaration) {
+ this.checkReservedType(this.state.value, this.state.startLoc, declaration);
+ return this.parseIdentifier(liberal);
+ }
+ flowParseTypeAlias(node) {
+ node.id = this.flowParseRestrictedIdentifier(false, true);
+ this.scope.declareName(node.id.name, 8201, node.id.loc.start);
+ if (this.match(47)) {
+ node.typeParameters = this.flowParseTypeParameterDeclaration();
+ } else {
+ node.typeParameters = null;
+ }
+ node.right = this.flowParseTypeInitialiser(29);
+ this.semicolon();
+ return this.finishNode(node, "TypeAlias");
+ }
+ flowParseOpaqueType(node, declare) {
+ this.expectContextual(130);
+ node.id = this.flowParseRestrictedIdentifier(true, true);
+ this.scope.declareName(node.id.name, 8201, node.id.loc.start);
+ if (this.match(47)) {
+ node.typeParameters = this.flowParseTypeParameterDeclaration();
+ } else {
+ node.typeParameters = null;
+ }
+ node.supertype = null;
+ if (this.match(14)) {
+ node.supertype = this.flowParseTypeInitialiser(14);
+ }
+ node.impltype = null;
+ if (!declare) {
+ node.impltype = this.flowParseTypeInitialiser(29);
+ }
+ this.semicolon();
+ return this.finishNode(node, "OpaqueType");
+ }
+ flowParseTypeParameter(requireDefault = false) {
+ const nodeStartLoc = this.state.startLoc;
+ const node = this.startNode();
+ const variance = this.flowParseVariance();
+ const ident = this.flowParseTypeAnnotatableIdentifier();
+ node.name = ident.name;
+ node.variance = variance;
+ node.bound = ident.typeAnnotation;
+ if (this.match(29)) {
+ this.eat(29);
+ node.default = this.flowParseType();
+ } else {
+ if (requireDefault) {
+ this.raise(FlowErrors.MissingTypeParamDefault, {
+ at: nodeStartLoc
+ });
+ }
+ }
+ return this.finishNode(node, "TypeParameter");
+ }
+ flowParseTypeParameterDeclaration() {
+ const oldInType = this.state.inType;
+ const node = this.startNode();
+ node.params = [];
+ this.state.inType = true;
+ if (this.match(47) || this.match(142)) {
+ this.next();
+ } else {
+ this.unexpected();
+ }
+ let defaultRequired = false;
+ do {
+ const typeParameter = this.flowParseTypeParameter(defaultRequired);
+ node.params.push(typeParameter);
+ if (typeParameter.default) {
+ defaultRequired = true;
+ }
+ if (!this.match(48)) {
+ this.expect(12);
+ }
+ } while (!this.match(48));
+ this.expect(48);
+ this.state.inType = oldInType;
+ return this.finishNode(node, "TypeParameterDeclaration");
+ }
+ flowParseTypeParameterInstantiation() {
+ const node = this.startNode();
+ const oldInType = this.state.inType;
+ node.params = [];
+ this.state.inType = true;
+ this.expect(47);
+ const oldNoAnonFunctionType = this.state.noAnonFunctionType;
+ this.state.noAnonFunctionType = false;
+ while (!this.match(48)) {
+ node.params.push(this.flowParseType());
+ if (!this.match(48)) {
+ this.expect(12);
+ }
+ }
+ this.state.noAnonFunctionType = oldNoAnonFunctionType;
+ this.expect(48);
+ this.state.inType = oldInType;
+ return this.finishNode(node, "TypeParameterInstantiation");
+ }
+ flowParseTypeParameterInstantiationCallOrNew() {
+ const node = this.startNode();
+ const oldInType = this.state.inType;
+ node.params = [];
+ this.state.inType = true;
+ this.expect(47);
+ while (!this.match(48)) {
+ node.params.push(this.flowParseTypeOrImplicitInstantiation());
+ if (!this.match(48)) {
+ this.expect(12);
+ }
+ }
+ this.expect(48);
+ this.state.inType = oldInType;
+ return this.finishNode(node, "TypeParameterInstantiation");
+ }
+ flowParseInterfaceType() {
+ const node = this.startNode();
+ this.expectContextual(129);
+ node.extends = [];
+ if (this.eat(81)) {
+ do {
+ node.extends.push(this.flowParseInterfaceExtends());
+ } while (this.eat(12));
+ }
+ node.body = this.flowParseObjectType({
+ allowStatic: false,
+ allowExact: false,
+ allowSpread: false,
+ allowProto: false,
+ allowInexact: false
+ });
+ return this.finishNode(node, "InterfaceTypeAnnotation");
+ }
+ flowParseObjectPropertyKey() {
+ return this.match(134) || this.match(133) ? super.parseExprAtom() : this.parseIdentifier(true);
+ }
+ flowParseObjectTypeIndexer(node, isStatic, variance) {
+ node.static = isStatic;
+ if (this.lookahead().type === 14) {
+ node.id = this.flowParseObjectPropertyKey();
+ node.key = this.flowParseTypeInitialiser();
+ } else {
+ node.id = null;
+ node.key = this.flowParseType();
+ }
+ this.expect(3);
+ node.value = this.flowParseTypeInitialiser();
+ node.variance = variance;
+ return this.finishNode(node, "ObjectTypeIndexer");
+ }
+ flowParseObjectTypeInternalSlot(node, isStatic) {
+ node.static = isStatic;
+ node.id = this.flowParseObjectPropertyKey();
+ this.expect(3);
+ this.expect(3);
+ if (this.match(47) || this.match(10)) {
+ node.method = true;
+ node.optional = false;
+ node.value = this.flowParseObjectTypeMethodish(this.startNodeAt(node.loc.start));
+ } else {
+ node.method = false;
+ if (this.eat(17)) {
+ node.optional = true;
+ }
+ node.value = this.flowParseTypeInitialiser();
+ }
+ return this.finishNode(node, "ObjectTypeInternalSlot");
+ }
+ flowParseObjectTypeMethodish(node) {
+ node.params = [];
+ node.rest = null;
+ node.typeParameters = null;
+ node.this = null;
+ if (this.match(47)) {
+ node.typeParameters = this.flowParseTypeParameterDeclaration();
+ }
+ this.expect(10);
+ if (this.match(78)) {
+ node.this = this.flowParseFunctionTypeParam(true);
+ node.this.name = null;
+ if (!this.match(11)) {
+ this.expect(12);
+ }
+ }
+ while (!this.match(11) && !this.match(21)) {
+ node.params.push(this.flowParseFunctionTypeParam(false));
+ if (!this.match(11)) {
+ this.expect(12);
+ }
+ }
+ if (this.eat(21)) {
+ node.rest = this.flowParseFunctionTypeParam(false);
+ }
+ this.expect(11);
+ node.returnType = this.flowParseTypeInitialiser();
+ return this.finishNode(node, "FunctionTypeAnnotation");
+ }
+ flowParseObjectTypeCallProperty(node, isStatic) {
+ const valueNode = this.startNode();
+ node.static = isStatic;
+ node.value = this.flowParseObjectTypeMethodish(valueNode);
+ return this.finishNode(node, "ObjectTypeCallProperty");
+ }
+ flowParseObjectType({
+ allowStatic,
+ allowExact,
+ allowSpread,
+ allowProto,
+ allowInexact
+ }) {
+ const oldInType = this.state.inType;
+ this.state.inType = true;
+ const nodeStart = this.startNode();
+ nodeStart.callProperties = [];
+ nodeStart.properties = [];
+ nodeStart.indexers = [];
+ nodeStart.internalSlots = [];
+ let endDelim;
+ let exact;
+ let inexact = false;
+ if (allowExact && this.match(6)) {
+ this.expect(6);
+ endDelim = 9;
+ exact = true;
+ } else {
+ this.expect(5);
+ endDelim = 8;
+ exact = false;
+ }
+ nodeStart.exact = exact;
+ while (!this.match(endDelim)) {
+ let isStatic = false;
+ let protoStartLoc = null;
+ let inexactStartLoc = null;
+ const node = this.startNode();
+ if (allowProto && this.isContextual(118)) {
+ const lookahead = this.lookahead();
+ if (lookahead.type !== 14 && lookahead.type !== 17) {
+ this.next();
+ protoStartLoc = this.state.startLoc;
+ allowStatic = false;
+ }
+ }
+ if (allowStatic && this.isContextual(106)) {
+ const lookahead = this.lookahead();
+ if (lookahead.type !== 14 && lookahead.type !== 17) {
+ this.next();
+ isStatic = true;
+ }
+ }
+ const variance = this.flowParseVariance();
+ if (this.eat(0)) {
+ if (protoStartLoc != null) {
+ this.unexpected(protoStartLoc);
+ }
+ if (this.eat(0)) {
+ if (variance) {
+ this.unexpected(variance.loc.start);
+ }
+ nodeStart.internalSlots.push(this.flowParseObjectTypeInternalSlot(node, isStatic));
+ } else {
+ nodeStart.indexers.push(this.flowParseObjectTypeIndexer(node, isStatic, variance));
+ }
+ } else if (this.match(10) || this.match(47)) {
+ if (protoStartLoc != null) {
+ this.unexpected(protoStartLoc);
+ }
+ if (variance) {
+ this.unexpected(variance.loc.start);
+ }
+ nodeStart.callProperties.push(this.flowParseObjectTypeCallProperty(node, isStatic));
+ } else {
+ let kind = "init";
+ if (this.isContextual(99) || this.isContextual(104)) {
+ const lookahead = this.lookahead();
+ if (tokenIsLiteralPropertyName(lookahead.type)) {
+ kind = this.state.value;
+ this.next();
+ }
+ }
+ const propOrInexact = this.flowParseObjectTypeProperty(node, isStatic, protoStartLoc, variance, kind, allowSpread, allowInexact != null ? allowInexact : !exact);
+ if (propOrInexact === null) {
+ inexact = true;
+ inexactStartLoc = this.state.lastTokStartLoc;
+ } else {
+ nodeStart.properties.push(propOrInexact);
+ }
+ }
+ this.flowObjectTypeSemicolon();
+ if (inexactStartLoc && !this.match(8) && !this.match(9)) {
+ this.raise(FlowErrors.UnexpectedExplicitInexactInObject, {
+ at: inexactStartLoc
+ });
+ }
+ }
+ this.expect(endDelim);
+ if (allowSpread) {
+ nodeStart.inexact = inexact;
+ }
+ const out = this.finishNode(nodeStart, "ObjectTypeAnnotation");
+ this.state.inType = oldInType;
+ return out;
+ }
+ flowParseObjectTypeProperty(node, isStatic, protoStartLoc, variance, kind, allowSpread, allowInexact) {
+ if (this.eat(21)) {
+ const isInexactToken = this.match(12) || this.match(13) || this.match(8) || this.match(9);
+ if (isInexactToken) {
+ if (!allowSpread) {
+ this.raise(FlowErrors.InexactInsideNonObject, {
+ at: this.state.lastTokStartLoc
+ });
+ } else if (!allowInexact) {
+ this.raise(FlowErrors.InexactInsideExact, {
+ at: this.state.lastTokStartLoc
+ });
+ }
+ if (variance) {
+ this.raise(FlowErrors.InexactVariance, {
+ at: variance
+ });
+ }
+ return null;
+ }
+ if (!allowSpread) {
+ this.raise(FlowErrors.UnexpectedSpreadType, {
+ at: this.state.lastTokStartLoc
+ });
+ }
+ if (protoStartLoc != null) {
+ this.unexpected(protoStartLoc);
+ }
+ if (variance) {
+ this.raise(FlowErrors.SpreadVariance, {
+ at: variance
+ });
+ }
+ node.argument = this.flowParseType();
+ return this.finishNode(node, "ObjectTypeSpreadProperty");
+ } else {
+ node.key = this.flowParseObjectPropertyKey();
+ node.static = isStatic;
+ node.proto = protoStartLoc != null;
+ node.kind = kind;
+ let optional = false;
+ if (this.match(47) || this.match(10)) {
+ node.method = true;
+ if (protoStartLoc != null) {
+ this.unexpected(protoStartLoc);
+ }
+ if (variance) {
+ this.unexpected(variance.loc.start);
+ }
+ node.value = this.flowParseObjectTypeMethodish(this.startNodeAt(node.loc.start));
+ if (kind === "get" || kind === "set") {
+ this.flowCheckGetterSetterParams(node);
+ }
+ if (!allowSpread && node.key.name === "constructor" && node.value.this) {
+ this.raise(FlowErrors.ThisParamBannedInConstructor, {
+ at: node.value.this
+ });
+ }
+ } else {
+ if (kind !== "init") this.unexpected();
+ node.method = false;
+ if (this.eat(17)) {
+ optional = true;
+ }
+ node.value = this.flowParseTypeInitialiser();
+ node.variance = variance;
+ }
+ node.optional = optional;
+ return this.finishNode(node, "ObjectTypeProperty");
+ }
+ }
+ flowCheckGetterSetterParams(property) {
+ const paramCount = property.kind === "get" ? 0 : 1;
+ const length = property.value.params.length + (property.value.rest ? 1 : 0);
+ if (property.value.this) {
+ this.raise(property.kind === "get" ? FlowErrors.GetterMayNotHaveThisParam : FlowErrors.SetterMayNotHaveThisParam, {
+ at: property.value.this
+ });
+ }
+ if (length !== paramCount) {
+ this.raise(property.kind === "get" ? Errors.BadGetterArity : Errors.BadSetterArity, {
+ at: property
+ });
+ }
+ if (property.kind === "set" && property.value.rest) {
+ this.raise(Errors.BadSetterRestParameter, {
+ at: property
+ });
+ }
+ }
+ flowObjectTypeSemicolon() {
+ if (!this.eat(13) && !this.eat(12) && !this.match(8) && !this.match(9)) {
+ this.unexpected();
+ }
+ }
+ flowParseQualifiedTypeIdentifier(startLoc, id) {
+ var _startLoc;
+ (_startLoc = startLoc) != null ? _startLoc : startLoc = this.state.startLoc;
+ let node = id || this.flowParseRestrictedIdentifier(true);
+ while (this.eat(16)) {
+ const node2 = this.startNodeAt(startLoc);
+ node2.qualification = node;
+ node2.id = this.flowParseRestrictedIdentifier(true);
+ node = this.finishNode(node2, "QualifiedTypeIdentifier");
+ }
+ return node;
+ }
+ flowParseGenericType(startLoc, id) {
+ const node = this.startNodeAt(startLoc);
+ node.typeParameters = null;
+ node.id = this.flowParseQualifiedTypeIdentifier(startLoc, id);
+ if (this.match(47)) {
+ node.typeParameters = this.flowParseTypeParameterInstantiation();
+ }
+ return this.finishNode(node, "GenericTypeAnnotation");
+ }
+ flowParseTypeofType() {
+ const node = this.startNode();
+ this.expect(87);
+ node.argument = this.flowParsePrimaryType();
+ return this.finishNode(node, "TypeofTypeAnnotation");
+ }
+ flowParseTupleType() {
+ const node = this.startNode();
+ node.types = [];
+ this.expect(0);
+ while (this.state.pos < this.length && !this.match(3)) {
+ node.types.push(this.flowParseType());
+ if (this.match(3)) break;
+ this.expect(12);
+ }
+ this.expect(3);
+ return this.finishNode(node, "TupleTypeAnnotation");
+ }
+ flowParseFunctionTypeParam(first) {
+ let name = null;
+ let optional = false;
+ let typeAnnotation = null;
+ const node = this.startNode();
+ const lh = this.lookahead();
+ const isThis = this.state.type === 78;
+ if (lh.type === 14 || lh.type === 17) {
+ if (isThis && !first) {
+ this.raise(FlowErrors.ThisParamMustBeFirst, {
+ at: node
+ });
+ }
+ name = this.parseIdentifier(isThis);
+ if (this.eat(17)) {
+ optional = true;
+ if (isThis) {
+ this.raise(FlowErrors.ThisParamMayNotBeOptional, {
+ at: node
+ });
+ }
+ }
+ typeAnnotation = this.flowParseTypeInitialiser();
+ } else {
+ typeAnnotation = this.flowParseType();
+ }
+ node.name = name;
+ node.optional = optional;
+ node.typeAnnotation = typeAnnotation;
+ return this.finishNode(node, "FunctionTypeParam");
+ }
+ reinterpretTypeAsFunctionTypeParam(type) {
+ const node = this.startNodeAt(type.loc.start);
+ node.name = null;
+ node.optional = false;
+ node.typeAnnotation = type;
+ return this.finishNode(node, "FunctionTypeParam");
+ }
+ flowParseFunctionTypeParams(params = []) {
+ let rest = null;
+ let _this = null;
+ if (this.match(78)) {
+ _this = this.flowParseFunctionTypeParam(true);
+ _this.name = null;
+ if (!this.match(11)) {
+ this.expect(12);
+ }
+ }
+ while (!this.match(11) && !this.match(21)) {
+ params.push(this.flowParseFunctionTypeParam(false));
+ if (!this.match(11)) {
+ this.expect(12);
+ }
+ }
+ if (this.eat(21)) {
+ rest = this.flowParseFunctionTypeParam(false);
+ }
+ return {
+ params,
+ rest,
+ _this
+ };
+ }
+ flowIdentToTypeAnnotation(startLoc, node, id) {
+ switch (id.name) {
+ case "any":
+ return this.finishNode(node, "AnyTypeAnnotation");
+ case "bool":
+ case "boolean":
+ return this.finishNode(node, "BooleanTypeAnnotation");
+ case "mixed":
+ return this.finishNode(node, "MixedTypeAnnotation");
+ case "empty":
+ return this.finishNode(node, "EmptyTypeAnnotation");
+ case "number":
+ return this.finishNode(node, "NumberTypeAnnotation");
+ case "string":
+ return this.finishNode(node, "StringTypeAnnotation");
+ case "symbol":
+ return this.finishNode(node, "SymbolTypeAnnotation");
+ default:
+ this.checkNotUnderscore(id.name);
+ return this.flowParseGenericType(startLoc, id);
+ }
+ }
+ flowParsePrimaryType() {
+ const startLoc = this.state.startLoc;
+ const node = this.startNode();
+ let tmp;
+ let type;
+ let isGroupedType = false;
+ const oldNoAnonFunctionType = this.state.noAnonFunctionType;
+ switch (this.state.type) {
+ case 5:
+ return this.flowParseObjectType({
+ allowStatic: false,
+ allowExact: false,
+ allowSpread: true,
+ allowProto: false,
+ allowInexact: true
+ });
+ case 6:
+ return this.flowParseObjectType({
+ allowStatic: false,
+ allowExact: true,
+ allowSpread: true,
+ allowProto: false,
+ allowInexact: false
+ });
+ case 0:
+ this.state.noAnonFunctionType = false;
+ type = this.flowParseTupleType();
+ this.state.noAnonFunctionType = oldNoAnonFunctionType;
+ return type;
+ case 47:
+ node.typeParameters = this.flowParseTypeParameterDeclaration();
+ this.expect(10);
+ tmp = this.flowParseFunctionTypeParams();
+ node.params = tmp.params;
+ node.rest = tmp.rest;
+ node.this = tmp._this;
+ this.expect(11);
+ this.expect(19);
+ node.returnType = this.flowParseType();
+ return this.finishNode(node, "FunctionTypeAnnotation");
+ case 10:
+ this.next();
+ if (!this.match(11) && !this.match(21)) {
+ if (tokenIsIdentifier(this.state.type) || this.match(78)) {
+ const token = this.lookahead().type;
+ isGroupedType = token !== 17 && token !== 14;
+ } else {
+ isGroupedType = true;
+ }
+ }
+ if (isGroupedType) {
+ this.state.noAnonFunctionType = false;
+ type = this.flowParseType();
+ this.state.noAnonFunctionType = oldNoAnonFunctionType;
+ if (this.state.noAnonFunctionType || !(this.match(12) || this.match(11) && this.lookahead().type === 19)) {
+ this.expect(11);
+ return type;
+ } else {
+ this.eat(12);
+ }
+ }
+ if (type) {
+ tmp = this.flowParseFunctionTypeParams([this.reinterpretTypeAsFunctionTypeParam(type)]);
+ } else {
+ tmp = this.flowParseFunctionTypeParams();
+ }
+ node.params = tmp.params;
+ node.rest = tmp.rest;
+ node.this = tmp._this;
+ this.expect(11);
+ this.expect(19);
+ node.returnType = this.flowParseType();
+ node.typeParameters = null;
+ return this.finishNode(node, "FunctionTypeAnnotation");
+ case 133:
+ return this.parseLiteral(this.state.value, "StringLiteralTypeAnnotation");
+ case 85:
+ case 86:
+ node.value = this.match(85);
+ this.next();
+ return this.finishNode(node, "BooleanLiteralTypeAnnotation");
+ case 53:
+ if (this.state.value === "-") {
+ this.next();
+ if (this.match(134)) {
+ return this.parseLiteralAtNode(-this.state.value, "NumberLiteralTypeAnnotation", node);
+ }
+ if (this.match(135)) {
+ return this.parseLiteralAtNode(-this.state.value, "BigIntLiteralTypeAnnotation", node);
+ }
+ throw this.raise(FlowErrors.UnexpectedSubtractionOperand, {
+ at: this.state.startLoc
+ });
+ }
+ this.unexpected();
+ return;
+ case 134:
+ return this.parseLiteral(this.state.value, "NumberLiteralTypeAnnotation");
+ case 135:
+ return this.parseLiteral(this.state.value, "BigIntLiteralTypeAnnotation");
+ case 88:
+ this.next();
+ return this.finishNode(node, "VoidTypeAnnotation");
+ case 84:
+ this.next();
+ return this.finishNode(node, "NullLiteralTypeAnnotation");
+ case 78:
+ this.next();
+ return this.finishNode(node, "ThisTypeAnnotation");
+ case 55:
+ this.next();
+ return this.finishNode(node, "ExistsTypeAnnotation");
+ case 87:
+ return this.flowParseTypeofType();
+ default:
+ if (tokenIsKeyword(this.state.type)) {
+ const label = tokenLabelName(this.state.type);
+ this.next();
+ return super.createIdentifier(node, label);
+ } else if (tokenIsIdentifier(this.state.type)) {
+ if (this.isContextual(129)) {
+ return this.flowParseInterfaceType();
+ }
+ return this.flowIdentToTypeAnnotation(startLoc, node, this.parseIdentifier());
+ }
+ }
+ this.unexpected();
+ }
+ flowParsePostfixType() {
+ const startLoc = this.state.startLoc;
+ let type = this.flowParsePrimaryType();
+ let seenOptionalIndexedAccess = false;
+ while ((this.match(0) || this.match(18)) && !this.canInsertSemicolon()) {
+ const node = this.startNodeAt(startLoc);
+ const optional = this.eat(18);
+ seenOptionalIndexedAccess = seenOptionalIndexedAccess || optional;
+ this.expect(0);
+ if (!optional && this.match(3)) {
+ node.elementType = type;
+ this.next();
+ type = this.finishNode(node, "ArrayTypeAnnotation");
+ } else {
+ node.objectType = type;
+ node.indexType = this.flowParseType();
+ this.expect(3);
+ if (seenOptionalIndexedAccess) {
+ node.optional = optional;
+ type = this.finishNode(node, "OptionalIndexedAccessType");
+ } else {
+ type = this.finishNode(node, "IndexedAccessType");
+ }
+ }
+ }
+ return type;
+ }
+ flowParsePrefixType() {
+ const node = this.startNode();
+ if (this.eat(17)) {
+ node.typeAnnotation = this.flowParsePrefixType();
+ return this.finishNode(node, "NullableTypeAnnotation");
+ } else {
+ return this.flowParsePostfixType();
+ }
+ }
+ flowParseAnonFunctionWithoutParens() {
+ const param = this.flowParsePrefixType();
+ if (!this.state.noAnonFunctionType && this.eat(19)) {
+ const node = this.startNodeAt(param.loc.start);
+ node.params = [this.reinterpretTypeAsFunctionTypeParam(param)];
+ node.rest = null;
+ node.this = null;
+ node.returnType = this.flowParseType();
+ node.typeParameters = null;
+ return this.finishNode(node, "FunctionTypeAnnotation");
+ }
+ return param;
+ }
+ flowParseIntersectionType() {
+ const node = this.startNode();
+ this.eat(45);
+ const type = this.flowParseAnonFunctionWithoutParens();
+ node.types = [type];
+ while (this.eat(45)) {
+ node.types.push(this.flowParseAnonFunctionWithoutParens());
+ }
+ return node.types.length === 1 ? type : this.finishNode(node, "IntersectionTypeAnnotation");
+ }
+ flowParseUnionType() {
+ const node = this.startNode();
+ this.eat(43);
+ const type = this.flowParseIntersectionType();
+ node.types = [type];
+ while (this.eat(43)) {
+ node.types.push(this.flowParseIntersectionType());
+ }
+ return node.types.length === 1 ? type : this.finishNode(node, "UnionTypeAnnotation");
+ }
+ flowParseType() {
+ const oldInType = this.state.inType;
+ this.state.inType = true;
+ const type = this.flowParseUnionType();
+ this.state.inType = oldInType;
+ return type;
+ }
+ flowParseTypeOrImplicitInstantiation() {
+ if (this.state.type === 132 && this.state.value === "_") {
+ const startLoc = this.state.startLoc;
+ const node = this.parseIdentifier();
+ return this.flowParseGenericType(startLoc, node);
+ } else {
+ return this.flowParseType();
+ }
+ }
+ flowParseTypeAnnotation() {
+ const node = this.startNode();
+ node.typeAnnotation = this.flowParseTypeInitialiser();
+ return this.finishNode(node, "TypeAnnotation");
+ }
+ flowParseTypeAnnotatableIdentifier(allowPrimitiveOverride) {
+ const ident = allowPrimitiveOverride ? this.parseIdentifier() : this.flowParseRestrictedIdentifier();
+ if (this.match(14)) {
+ ident.typeAnnotation = this.flowParseTypeAnnotation();
+ this.resetEndLocation(ident);
+ }
+ return ident;
+ }
+ typeCastToParameter(node) {
+ node.expression.typeAnnotation = node.typeAnnotation;
+ this.resetEndLocation(node.expression, node.typeAnnotation.loc.end);
+ return node.expression;
+ }
+ flowParseVariance() {
+ let variance = null;
+ if (this.match(53)) {
+ variance = this.startNode();
+ if (this.state.value === "+") {
+ variance.kind = "plus";
+ } else {
+ variance.kind = "minus";
+ }
+ this.next();
+ return this.finishNode(variance, "Variance");
+ }
+ return variance;
+ }
+ parseFunctionBody(node, allowExpressionBody, isMethod = false) {
+ if (allowExpressionBody) {
+ this.forwardNoArrowParamsConversionAt(node, () => super.parseFunctionBody(node, true, isMethod));
+ return;
+ }
+ super.parseFunctionBody(node, false, isMethod);
+ }
+ parseFunctionBodyAndFinish(node, type, isMethod = false) {
+ if (this.match(14)) {
+ const typeNode = this.startNode();
+ [typeNode.typeAnnotation, node.predicate] = this.flowParseTypeAndPredicateInitialiser();
+ node.returnType = typeNode.typeAnnotation ? this.finishNode(typeNode, "TypeAnnotation") : null;
+ }
+ return super.parseFunctionBodyAndFinish(node, type, isMethod);
+ }
+ parseStatementLike(flags) {
+ if (this.state.strict && this.isContextual(129)) {
+ const lookahead = this.lookahead();
+ if (tokenIsKeywordOrIdentifier(lookahead.type)) {
+ const node = this.startNode();
+ this.next();
+ return this.flowParseInterface(node);
+ }
+ } else if (this.shouldParseEnums() && this.isContextual(126)) {
+ const node = this.startNode();
+ this.next();
+ return this.flowParseEnumDeclaration(node);
+ }
+ const stmt = super.parseStatementLike(flags);
+ if (this.flowPragma === undefined && !this.isValidDirective(stmt)) {
+ this.flowPragma = null;
+ }
+ return stmt;
+ }
+ parseExpressionStatement(node, expr, decorators) {
+ if (expr.type === "Identifier") {
+ if (expr.name === "declare") {
+ if (this.match(80) || tokenIsIdentifier(this.state.type) || this.match(68) || this.match(74) || this.match(82)) {
+ return this.flowParseDeclare(node);
+ }
+ } else if (tokenIsIdentifier(this.state.type)) {
+ if (expr.name === "interface") {
+ return this.flowParseInterface(node);
+ } else if (expr.name === "type") {
+ return this.flowParseTypeAlias(node);
+ } else if (expr.name === "opaque") {
+ return this.flowParseOpaqueType(node, false);
+ }
+ }
+ }
+ return super.parseExpressionStatement(node, expr, decorators);
+ }
+ shouldParseExportDeclaration() {
+ const {
+ type
+ } = this.state;
+ if (tokenIsFlowInterfaceOrTypeOrOpaque(type) || this.shouldParseEnums() && type === 126) {
+ return !this.state.containsEsc;
+ }
+ return super.shouldParseExportDeclaration();
+ }
+ isExportDefaultSpecifier() {
+ const {
+ type
+ } = this.state;
+ if (tokenIsFlowInterfaceOrTypeOrOpaque(type) || this.shouldParseEnums() && type === 126) {
+ return this.state.containsEsc;
+ }
+ return super.isExportDefaultSpecifier();
+ }
+ parseExportDefaultExpression() {
+ if (this.shouldParseEnums() && this.isContextual(126)) {
+ const node = this.startNode();
+ this.next();
+ return this.flowParseEnumDeclaration(node);
+ }
+ return super.parseExportDefaultExpression();
+ }
+ parseConditional(expr, startLoc, refExpressionErrors) {
+ if (!this.match(17)) return expr;
+ if (this.state.maybeInArrowParameters) {
+ const nextCh = this.lookaheadCharCode();
+ if (nextCh === 44 || nextCh === 61 || nextCh === 58 || nextCh === 41) {
+ this.setOptionalParametersError(refExpressionErrors);
+ return expr;
+ }
+ }
+ this.expect(17);
+ const state = this.state.clone();
+ const originalNoArrowAt = this.state.noArrowAt;
+ const node = this.startNodeAt(startLoc);
+ let {
+ consequent,
+ failed
+ } = this.tryParseConditionalConsequent();
+ let [valid, invalid] = this.getArrowLikeExpressions(consequent);
+ if (failed || invalid.length > 0) {
+ const noArrowAt = [...originalNoArrowAt];
+ if (invalid.length > 0) {
+ this.state = state;
+ this.state.noArrowAt = noArrowAt;
+ for (let i = 0; i < invalid.length; i++) {
+ noArrowAt.push(invalid[i].start);
+ }
+ ({
+ consequent,
+ failed
+ } = this.tryParseConditionalConsequent());
+ [valid, invalid] = this.getArrowLikeExpressions(consequent);
+ }
+ if (failed && valid.length > 1) {
+ this.raise(FlowErrors.AmbiguousConditionalArrow, {
+ at: state.startLoc
+ });
+ }
+ if (failed && valid.length === 1) {
+ this.state = state;
+ noArrowAt.push(valid[0].start);
+ this.state.noArrowAt = noArrowAt;
+ ({
+ consequent,
+ failed
+ } = this.tryParseConditionalConsequent());
+ }
+ }
+ this.getArrowLikeExpressions(consequent, true);
+ this.state.noArrowAt = originalNoArrowAt;
+ this.expect(14);
+ node.test = expr;
+ node.consequent = consequent;
+ node.alternate = this.forwardNoArrowParamsConversionAt(node, () => this.parseMaybeAssign(undefined, undefined));
+ return this.finishNode(node, "ConditionalExpression");
+ }
+ tryParseConditionalConsequent() {
+ this.state.noArrowParamsConversionAt.push(this.state.start);
+ const consequent = this.parseMaybeAssignAllowIn();
+ const failed = !this.match(14);
+ this.state.noArrowParamsConversionAt.pop();
+ return {
+ consequent,
+ failed
+ };
+ }
+ getArrowLikeExpressions(node, disallowInvalid) {
+ const stack = [node];
+ const arrows = [];
+ while (stack.length !== 0) {
+ const node = stack.pop();
+ if (node.type === "ArrowFunctionExpression") {
+ if (node.typeParameters || !node.returnType) {
+ this.finishArrowValidation(node);
+ } else {
+ arrows.push(node);
+ }
+ stack.push(node.body);
+ } else if (node.type === "ConditionalExpression") {
+ stack.push(node.consequent);
+ stack.push(node.alternate);
+ }
+ }
+ if (disallowInvalid) {
+ arrows.forEach(node => this.finishArrowValidation(node));
+ return [arrows, []];
+ }
+ return partition(arrows, node => node.params.every(param => this.isAssignable(param, true)));
+ }
+ finishArrowValidation(node) {
+ var _node$extra;
+ this.toAssignableList(node.params, (_node$extra = node.extra) == null ? void 0 : _node$extra.trailingCommaLoc, false);
+ this.scope.enter(2 | 4);
+ super.checkParams(node, false, true);
+ this.scope.exit();
+ }
+ forwardNoArrowParamsConversionAt(node, parse) {
+ let result;
+ if (this.state.noArrowParamsConversionAt.indexOf(node.start) !== -1) {
+ this.state.noArrowParamsConversionAt.push(this.state.start);
+ result = parse();
+ this.state.noArrowParamsConversionAt.pop();
+ } else {
+ result = parse();
+ }
+ return result;
+ }
+ parseParenItem(node, startLoc) {
+ node = super.parseParenItem(node, startLoc);
+ if (this.eat(17)) {
+ node.optional = true;
+ this.resetEndLocation(node);
+ }
+ if (this.match(14)) {
+ const typeCastNode = this.startNodeAt(startLoc);
+ typeCastNode.expression = node;
+ typeCastNode.typeAnnotation = this.flowParseTypeAnnotation();
+ return this.finishNode(typeCastNode, "TypeCastExpression");
+ }
+ return node;
+ }
+ assertModuleNodeAllowed(node) {
+ if (node.type === "ImportDeclaration" && (node.importKind === "type" || node.importKind === "typeof") || node.type === "ExportNamedDeclaration" && node.exportKind === "type" || node.type === "ExportAllDeclaration" && node.exportKind === "type") {
+ return;
+ }
+ super.assertModuleNodeAllowed(node);
+ }
+ parseExportDeclaration(node) {
+ if (this.isContextual(130)) {
+ node.exportKind = "type";
+ const declarationNode = this.startNode();
+ this.next();
+ if (this.match(5)) {
+ node.specifiers = this.parseExportSpecifiers(true);
+ super.parseExportFrom(node);
+ return null;
+ } else {
+ return this.flowParseTypeAlias(declarationNode);
+ }
+ } else if (this.isContextual(131)) {
+ node.exportKind = "type";
+ const declarationNode = this.startNode();
+ this.next();
+ return this.flowParseOpaqueType(declarationNode, false);
+ } else if (this.isContextual(129)) {
+ node.exportKind = "type";
+ const declarationNode = this.startNode();
+ this.next();
+ return this.flowParseInterface(declarationNode);
+ } else if (this.shouldParseEnums() && this.isContextual(126)) {
+ node.exportKind = "value";
+ const declarationNode = this.startNode();
+ this.next();
+ return this.flowParseEnumDeclaration(declarationNode);
+ } else {
+ return super.parseExportDeclaration(node);
+ }
+ }
+ eatExportStar(node) {
+ if (super.eatExportStar(node)) return true;
+ if (this.isContextual(130) && this.lookahead().type === 55) {
+ node.exportKind = "type";
+ this.next();
+ this.next();
+ return true;
+ }
+ return false;
+ }
+ maybeParseExportNamespaceSpecifier(node) {
+ const {
+ startLoc
+ } = this.state;
+ const hasNamespace = super.maybeParseExportNamespaceSpecifier(node);
+ if (hasNamespace && node.exportKind === "type") {
+ this.unexpected(startLoc);
+ }
+ return hasNamespace;
+ }
+ parseClassId(node, isStatement, optionalId) {
+ super.parseClassId(node, isStatement, optionalId);
+ if (this.match(47)) {
+ node.typeParameters = this.flowParseTypeParameterDeclaration();
+ }
+ }
+ parseClassMember(classBody, member, state) {
+ const {
+ startLoc
+ } = this.state;
+ if (this.isContextual(125)) {
+ if (super.parseClassMemberFromModifier(classBody, member)) {
+ return;
+ }
+ member.declare = true;
+ }
+ super.parseClassMember(classBody, member, state);
+ if (member.declare) {
+ if (member.type !== "ClassProperty" && member.type !== "ClassPrivateProperty" && member.type !== "PropertyDefinition") {
+ this.raise(FlowErrors.DeclareClassElement, {
+ at: startLoc
+ });
+ } else if (member.value) {
+ this.raise(FlowErrors.DeclareClassFieldInitializer, {
+ at: member.value
+ });
+ }
+ }
+ }
+ isIterator(word) {
+ return word === "iterator" || word === "asyncIterator";
+ }
+ readIterator() {
+ const word = super.readWord1();
+ const fullWord = "@@" + word;
+ if (!this.isIterator(word) || !this.state.inType) {
+ this.raise(Errors.InvalidIdentifier, {
+ at: this.state.curPosition(),
+ identifierName: fullWord
+ });
+ }
+ this.finishToken(132, fullWord);
+ }
+ getTokenFromCode(code) {
+ const next = this.input.charCodeAt(this.state.pos + 1);
+ if (code === 123 && next === 124) {
+ this.finishOp(6, 2);
+ } else if (this.state.inType && (code === 62 || code === 60)) {
+ this.finishOp(code === 62 ? 48 : 47, 1);
+ } else if (this.state.inType && code === 63) {
+ if (next === 46) {
+ this.finishOp(18, 2);
+ } else {
+ this.finishOp(17, 1);
+ }
+ } else if (isIteratorStart(code, next, this.input.charCodeAt(this.state.pos + 2))) {
+ this.state.pos += 2;
+ this.readIterator();
+ } else {
+ super.getTokenFromCode(code);
+ }
+ }
+ isAssignable(node, isBinding) {
+ if (node.type === "TypeCastExpression") {
+ return this.isAssignable(node.expression, isBinding);
+ } else {
+ return super.isAssignable(node, isBinding);
+ }
+ }
+ toAssignable(node, isLHS = false) {
+ if (!isLHS && node.type === "AssignmentExpression" && node.left.type === "TypeCastExpression") {
+ node.left = this.typeCastToParameter(node.left);
+ }
+ super.toAssignable(node, isLHS);
+ }
+ toAssignableList(exprList, trailingCommaLoc, isLHS) {
+ for (let i = 0; i < exprList.length; i++) {
+ const expr = exprList[i];
+ if ((expr == null ? void 0 : expr.type) === "TypeCastExpression") {
+ exprList[i] = this.typeCastToParameter(expr);
+ }
+ }
+ super.toAssignableList(exprList, trailingCommaLoc, isLHS);
+ }
+ toReferencedList(exprList, isParenthesizedExpr) {
+ for (let i = 0; i < exprList.length; i++) {
+ var _expr$extra;
+ const expr = exprList[i];
+ if (expr && expr.type === "TypeCastExpression" && !((_expr$extra = expr.extra) != null && _expr$extra.parenthesized) && (exprList.length > 1 || !isParenthesizedExpr)) {
+ this.raise(FlowErrors.TypeCastInPattern, {
+ at: expr.typeAnnotation
+ });
+ }
+ }
+ return exprList;
+ }
+ parseArrayLike(close, canBePattern, isTuple, refExpressionErrors) {
+ const node = super.parseArrayLike(close, canBePattern, isTuple, refExpressionErrors);
+ if (canBePattern && !this.state.maybeInArrowParameters) {
+ this.toReferencedList(node.elements);
+ }
+ return node;
+ }
+ isValidLVal(type, isParenthesized, binding) {
+ return type === "TypeCastExpression" || super.isValidLVal(type, isParenthesized, binding);
+ }
+ parseClassProperty(node) {
+ if (this.match(14)) {
+ node.typeAnnotation = this.flowParseTypeAnnotation();
+ }
+ return super.parseClassProperty(node);
+ }
+ parseClassPrivateProperty(node) {
+ if (this.match(14)) {
+ node.typeAnnotation = this.flowParseTypeAnnotation();
+ }
+ return super.parseClassPrivateProperty(node);
+ }
+ isClassMethod() {
+ return this.match(47) || super.isClassMethod();
+ }
+ isClassProperty() {
+ return this.match(14) || super.isClassProperty();
+ }
+ isNonstaticConstructor(method) {
+ return !this.match(14) && super.isNonstaticConstructor(method);
+ }
+ pushClassMethod(classBody, method, isGenerator, isAsync, isConstructor, allowsDirectSuper) {
+ if (method.variance) {
+ this.unexpected(method.variance.loc.start);
+ }
+ delete method.variance;
+ if (this.match(47)) {
+ method.typeParameters = this.flowParseTypeParameterDeclaration();
+ }
+ super.pushClassMethod(classBody, method, isGenerator, isAsync, isConstructor, allowsDirectSuper);
+ if (method.params && isConstructor) {
+ const params = method.params;
+ if (params.length > 0 && this.isThisParam(params[0])) {
+ this.raise(FlowErrors.ThisParamBannedInConstructor, {
+ at: method
+ });
+ }
+ } else if (method.type === "MethodDefinition" && isConstructor && method.value.params) {
+ const params = method.value.params;
+ if (params.length > 0 && this.isThisParam(params[0])) {
+ this.raise(FlowErrors.ThisParamBannedInConstructor, {
+ at: method
+ });
+ }
+ }
+ }
+ pushClassPrivateMethod(classBody, method, isGenerator, isAsync) {
+ if (method.variance) {
+ this.unexpected(method.variance.loc.start);
+ }
+ delete method.variance;
+ if (this.match(47)) {
+ method.typeParameters = this.flowParseTypeParameterDeclaration();
+ }
+ super.pushClassPrivateMethod(classBody, method, isGenerator, isAsync);
+ }
+ parseClassSuper(node) {
+ super.parseClassSuper(node);
+ if (node.superClass && this.match(47)) {
+ node.superTypeParameters = this.flowParseTypeParameterInstantiation();
+ }
+ if (this.isContextual(113)) {
+ this.next();
+ const implemented = node.implements = [];
+ do {
+ const node = this.startNode();
+ node.id = this.flowParseRestrictedIdentifier(true);
+ if (this.match(47)) {
+ node.typeParameters = this.flowParseTypeParameterInstantiation();
+ } else {
+ node.typeParameters = null;
+ }
+ implemented.push(this.finishNode(node, "ClassImplements"));
+ } while (this.eat(12));
+ }
+ }
+ checkGetterSetterParams(method) {
+ super.checkGetterSetterParams(method);
+ const params = this.getObjectOrClassMethodParams(method);
+ if (params.length > 0) {
+ const param = params[0];
+ if (this.isThisParam(param) && method.kind === "get") {
+ this.raise(FlowErrors.GetterMayNotHaveThisParam, {
+ at: param
+ });
+ } else if (this.isThisParam(param)) {
+ this.raise(FlowErrors.SetterMayNotHaveThisParam, {
+ at: param
+ });
+ }
+ }
+ }
+ parsePropertyNamePrefixOperator(node) {
+ node.variance = this.flowParseVariance();
+ }
+ parseObjPropValue(prop, startLoc, isGenerator, isAsync, isPattern, isAccessor, refExpressionErrors) {
+ if (prop.variance) {
+ this.unexpected(prop.variance.loc.start);
+ }
+ delete prop.variance;
+ let typeParameters;
+ if (this.match(47) && !isAccessor) {
+ typeParameters = this.flowParseTypeParameterDeclaration();
+ if (!this.match(10)) this.unexpected();
+ }
+ const result = super.parseObjPropValue(prop, startLoc, isGenerator, isAsync, isPattern, isAccessor, refExpressionErrors);
+ if (typeParameters) {
+ (result.value || result).typeParameters = typeParameters;
+ }
+ return result;
+ }
+ parseAssignableListItemTypes(param) {
+ if (this.eat(17)) {
+ if (param.type !== "Identifier") {
+ this.raise(FlowErrors.PatternIsOptional, {
+ at: param
+ });
+ }
+ if (this.isThisParam(param)) {
+ this.raise(FlowErrors.ThisParamMayNotBeOptional, {
+ at: param
+ });
+ }
+ param.optional = true;
+ }
+ if (this.match(14)) {
+ param.typeAnnotation = this.flowParseTypeAnnotation();
+ } else if (this.isThisParam(param)) {
+ this.raise(FlowErrors.ThisParamAnnotationRequired, {
+ at: param
+ });
+ }
+ if (this.match(29) && this.isThisParam(param)) {
+ this.raise(FlowErrors.ThisParamNoDefault, {
+ at: param
+ });
+ }
+ this.resetEndLocation(param);
+ return param;
+ }
+ parseMaybeDefault(startLoc, left) {
+ const node = super.parseMaybeDefault(startLoc, left);
+ if (node.type === "AssignmentPattern" && node.typeAnnotation && node.right.start < node.typeAnnotation.start) {
+ this.raise(FlowErrors.TypeBeforeInitializer, {
+ at: node.typeAnnotation
+ });
+ }
+ return node;
+ }
+ checkImportReflection(node) {
+ super.checkImportReflection(node);
+ if (node.module && node.importKind !== "value") {
+ this.raise(FlowErrors.ImportReflectionHasImportType, {
+ at: node.specifiers[0].loc.start
+ });
+ }
+ }
+ parseImportSpecifierLocal(node, specifier, type) {
+ specifier.local = hasTypeImportKind(node) ? this.flowParseRestrictedIdentifier(true, true) : this.parseIdentifier();
+ node.specifiers.push(this.finishImportSpecifier(specifier, type));
+ }
+ isPotentialImportPhase(isExport) {
+ if (super.isPotentialImportPhase(isExport)) return true;
+ if (this.isContextual(130)) {
+ if (!isExport) return true;
+ const ch = this.lookaheadCharCode();
+ return ch === 123 || ch === 42;
+ }
+ return !isExport && this.isContextual(87);
+ }
+ applyImportPhase(node, isExport, phase, loc) {
+ super.applyImportPhase(node, isExport, phase, loc);
+ if (isExport) {
+ if (!phase && this.match(65)) {
+ return;
+ }
+ node.exportKind = phase === "type" ? phase : "value";
+ } else {
+ if (phase === "type" && this.match(55)) this.unexpected();
+ node.importKind = phase === "type" || phase === "typeof" ? phase : "value";
+ }
+ }
+ parseImportSpecifier(specifier, importedIsString, isInTypeOnlyImport, isMaybeTypeOnly, bindingType) {
+ const firstIdent = specifier.imported;
+ let specifierTypeKind = null;
+ if (firstIdent.type === "Identifier") {
+ if (firstIdent.name === "type") {
+ specifierTypeKind = "type";
+ } else if (firstIdent.name === "typeof") {
+ specifierTypeKind = "typeof";
+ }
+ }
+ let isBinding = false;
+ if (this.isContextual(93) && !this.isLookaheadContextual("as")) {
+ const as_ident = this.parseIdentifier(true);
+ if (specifierTypeKind !== null && !tokenIsKeywordOrIdentifier(this.state.type)) {
+ specifier.imported = as_ident;
+ specifier.importKind = specifierTypeKind;
+ specifier.local = cloneIdentifier(as_ident);
+ } else {
+ specifier.imported = firstIdent;
+ specifier.importKind = null;
+ specifier.local = this.parseIdentifier();
+ }
+ } else {
+ if (specifierTypeKind !== null && tokenIsKeywordOrIdentifier(this.state.type)) {
+ specifier.imported = this.parseIdentifier(true);
+ specifier.importKind = specifierTypeKind;
+ } else {
+ if (importedIsString) {
+ throw this.raise(Errors.ImportBindingIsString, {
+ at: specifier,
+ importName: firstIdent.value
+ });
+ }
+ specifier.imported = firstIdent;
+ specifier.importKind = null;
+ }
+ if (this.eatContextual(93)) {
+ specifier.local = this.parseIdentifier();
+ } else {
+ isBinding = true;
+ specifier.local = cloneIdentifier(specifier.imported);
+ }
+ }
+ const specifierIsTypeImport = hasTypeImportKind(specifier);
+ if (isInTypeOnlyImport && specifierIsTypeImport) {
+ this.raise(FlowErrors.ImportTypeShorthandOnlyInPureImport, {
+ at: specifier
+ });
+ }
+ if (isInTypeOnlyImport || specifierIsTypeImport) {
+ this.checkReservedType(specifier.local.name, specifier.local.loc.start, true);
+ }
+ if (isBinding && !isInTypeOnlyImport && !specifierIsTypeImport) {
+ this.checkReservedWord(specifier.local.name, specifier.loc.start, true, true);
+ }
+ return this.finishImportSpecifier(specifier, "ImportSpecifier");
+ }
+ parseBindingAtom() {
+ switch (this.state.type) {
+ case 78:
+ return this.parseIdentifier(true);
+ default:
+ return super.parseBindingAtom();
+ }
+ }
+ parseFunctionParams(node, isConstructor) {
+ const kind = node.kind;
+ if (kind !== "get" && kind !== "set" && this.match(47)) {
+ node.typeParameters = this.flowParseTypeParameterDeclaration();
+ }
+ super.parseFunctionParams(node, isConstructor);
+ }
+ parseVarId(decl, kind) {
+ super.parseVarId(decl, kind);
+ if (this.match(14)) {
+ decl.id.typeAnnotation = this.flowParseTypeAnnotation();
+ this.resetEndLocation(decl.id);
+ }
+ }
+ parseAsyncArrowFromCallExpression(node, call) {
+ if (this.match(14)) {
+ const oldNoAnonFunctionType = this.state.noAnonFunctionType;
+ this.state.noAnonFunctionType = true;
+ node.returnType = this.flowParseTypeAnnotation();
+ this.state.noAnonFunctionType = oldNoAnonFunctionType;
+ }
+ return super.parseAsyncArrowFromCallExpression(node, call);
+ }
+ shouldParseAsyncArrow() {
+ return this.match(14) || super.shouldParseAsyncArrow();
+ }
+ parseMaybeAssign(refExpressionErrors, afterLeftParse) {
+ var _jsx;
+ let state = null;
+ let jsx;
+ if (this.hasPlugin("jsx") && (this.match(142) || this.match(47))) {
+ state = this.state.clone();
+ jsx = this.tryParse(() => super.parseMaybeAssign(refExpressionErrors, afterLeftParse), state);
+ if (!jsx.error) return jsx.node;
+ const {
+ context
+ } = this.state;
+ const currentContext = context[context.length - 1];
+ if (currentContext === types.j_oTag || currentContext === types.j_expr) {
+ context.pop();
+ }
+ }
+ if ((_jsx = jsx) != null && _jsx.error || this.match(47)) {
+ var _jsx2, _jsx3;
+ state = state || this.state.clone();
+ let typeParameters;
+ const arrow = this.tryParse(abort => {
+ var _arrowExpression$extr;
+ typeParameters = this.flowParseTypeParameterDeclaration();
+ const arrowExpression = this.forwardNoArrowParamsConversionAt(typeParameters, () => {
+ const result = super.parseMaybeAssign(refExpressionErrors, afterLeftParse);
+ this.resetStartLocationFromNode(result, typeParameters);
+ return result;
+ });
+ if ((_arrowExpression$extr = arrowExpression.extra) != null && _arrowExpression$extr.parenthesized) abort();
+ const expr = this.maybeUnwrapTypeCastExpression(arrowExpression);
+ if (expr.type !== "ArrowFunctionExpression") abort();
+ expr.typeParameters = typeParameters;
+ this.resetStartLocationFromNode(expr, typeParameters);
+ return arrowExpression;
+ }, state);
+ let arrowExpression = null;
+ if (arrow.node && this.maybeUnwrapTypeCastExpression(arrow.node).type === "ArrowFunctionExpression") {
+ if (!arrow.error && !arrow.aborted) {
+ if (arrow.node.async) {
+ this.raise(FlowErrors.UnexpectedTypeParameterBeforeAsyncArrowFunction, {
+ at: typeParameters
+ });
+ }
+ return arrow.node;
+ }
+ arrowExpression = arrow.node;
+ }
+ if ((_jsx2 = jsx) != null && _jsx2.node) {
+ this.state = jsx.failState;
+ return jsx.node;
+ }
+ if (arrowExpression) {
+ this.state = arrow.failState;
+ return arrowExpression;
+ }
+ if ((_jsx3 = jsx) != null && _jsx3.thrown) throw jsx.error;
+ if (arrow.thrown) throw arrow.error;
+ throw this.raise(FlowErrors.UnexpectedTokenAfterTypeParameter, {
+ at: typeParameters
+ });
+ }
+ return super.parseMaybeAssign(refExpressionErrors, afterLeftParse);
+ }
+ parseArrow(node) {
+ if (this.match(14)) {
+ const result = this.tryParse(() => {
+ const oldNoAnonFunctionType = this.state.noAnonFunctionType;
+ this.state.noAnonFunctionType = true;
+ const typeNode = this.startNode();
+ [typeNode.typeAnnotation, node.predicate] = this.flowParseTypeAndPredicateInitialiser();
+ this.state.noAnonFunctionType = oldNoAnonFunctionType;
+ if (this.canInsertSemicolon()) this.unexpected();
+ if (!this.match(19)) this.unexpected();
+ return typeNode;
+ });
+ if (result.thrown) return null;
+ if (result.error) this.state = result.failState;
+ node.returnType = result.node.typeAnnotation ? this.finishNode(result.node, "TypeAnnotation") : null;
+ }
+ return super.parseArrow(node);
+ }
+ shouldParseArrow(params) {
+ return this.match(14) || super.shouldParseArrow(params);
+ }
+ setArrowFunctionParameters(node, params) {
+ if (this.state.noArrowParamsConversionAt.indexOf(node.start) !== -1) {
+ node.params = params;
+ } else {
+ super.setArrowFunctionParameters(node, params);
+ }
+ }
+ checkParams(node, allowDuplicates, isArrowFunction, strictModeChanged = true) {
+ if (isArrowFunction && this.state.noArrowParamsConversionAt.indexOf(node.start) !== -1) {
+ return;
+ }
+ for (let i = 0; i < node.params.length; i++) {
+ if (this.isThisParam(node.params[i]) && i > 0) {
+ this.raise(FlowErrors.ThisParamMustBeFirst, {
+ at: node.params[i]
+ });
+ }
+ }
+ super.checkParams(node, allowDuplicates, isArrowFunction, strictModeChanged);
+ }
+ parseParenAndDistinguishExpression(canBeArrow) {
+ return super.parseParenAndDistinguishExpression(canBeArrow && this.state.noArrowAt.indexOf(this.state.start) === -1);
+ }
+ parseSubscripts(base, startLoc, noCalls) {
+ if (base.type === "Identifier" && base.name === "async" && this.state.noArrowAt.indexOf(startLoc.index) !== -1) {
+ this.next();
+ const node = this.startNodeAt(startLoc);
+ node.callee = base;
+ node.arguments = super.parseCallExpressionArguments(11, false);
+ base = this.finishNode(node, "CallExpression");
+ } else if (base.type === "Identifier" && base.name === "async" && this.match(47)) {
+ const state = this.state.clone();
+ const arrow = this.tryParse(abort => this.parseAsyncArrowWithTypeParameters(startLoc) || abort(), state);
+ if (!arrow.error && !arrow.aborted) return arrow.node;
+ const result = this.tryParse(() => super.parseSubscripts(base, startLoc, noCalls), state);
+ if (result.node && !result.error) return result.node;
+ if (arrow.node) {
+ this.state = arrow.failState;
+ return arrow.node;
+ }
+ if (result.node) {
+ this.state = result.failState;
+ return result.node;
+ }
+ throw arrow.error || result.error;
+ }
+ return super.parseSubscripts(base, startLoc, noCalls);
+ }
+ parseSubscript(base, startLoc, noCalls, subscriptState) {
+ if (this.match(18) && this.isLookaheadToken_lt()) {
+ subscriptState.optionalChainMember = true;
+ if (noCalls) {
+ subscriptState.stop = true;
+ return base;
+ }
+ this.next();
+ const node = this.startNodeAt(startLoc);
+ node.callee = base;
+ node.typeArguments = this.flowParseTypeParameterInstantiation();
+ this.expect(10);
+ node.arguments = this.parseCallExpressionArguments(11, false);
+ node.optional = true;
+ return this.finishCallExpression(node, true);
+ } else if (!noCalls && this.shouldParseTypes() && this.match(47)) {
+ const node = this.startNodeAt(startLoc);
+ node.callee = base;
+ const result = this.tryParse(() => {
+ node.typeArguments = this.flowParseTypeParameterInstantiationCallOrNew();
+ this.expect(10);
+ node.arguments = super.parseCallExpressionArguments(11, false);
+ if (subscriptState.optionalChainMember) {
+ node.optional = false;
+ }
+ return this.finishCallExpression(node, subscriptState.optionalChainMember);
+ });
+ if (result.node) {
+ if (result.error) this.state = result.failState;
+ return result.node;
+ }
+ }
+ return super.parseSubscript(base, startLoc, noCalls, subscriptState);
+ }
+ parseNewCallee(node) {
+ super.parseNewCallee(node);
+ let targs = null;
+ if (this.shouldParseTypes() && this.match(47)) {
+ targs = this.tryParse(() => this.flowParseTypeParameterInstantiationCallOrNew()).node;
+ }
+ node.typeArguments = targs;
+ }
+ parseAsyncArrowWithTypeParameters(startLoc) {
+ const node = this.startNodeAt(startLoc);
+ this.parseFunctionParams(node, false);
+ if (!this.parseArrow(node)) return;
+ return super.parseArrowExpression(node, undefined, true);
+ }
+ readToken_mult_modulo(code) {
+ const next = this.input.charCodeAt(this.state.pos + 1);
+ if (code === 42 && next === 47 && this.state.hasFlowComment) {
+ this.state.hasFlowComment = false;
+ this.state.pos += 2;
+ this.nextToken();
+ return;
+ }
+ super.readToken_mult_modulo(code);
+ }
+ readToken_pipe_amp(code) {
+ const next = this.input.charCodeAt(this.state.pos + 1);
+ if (code === 124 && next === 125) {
+ this.finishOp(9, 2);
+ return;
+ }
+ super.readToken_pipe_amp(code);
+ }
+ parseTopLevel(file, program) {
+ const fileNode = super.parseTopLevel(file, program);
+ if (this.state.hasFlowComment) {
+ this.raise(FlowErrors.UnterminatedFlowComment, {
+ at: this.state.curPosition()
+ });
+ }
+ return fileNode;
+ }
+ skipBlockComment() {
+ if (this.hasPlugin("flowComments") && this.skipFlowComment()) {
+ if (this.state.hasFlowComment) {
+ throw this.raise(FlowErrors.NestedFlowComment, {
+ at: this.state.startLoc
+ });
+ }
+ this.hasFlowCommentCompletion();
+ const commentSkip = this.skipFlowComment();
+ if (commentSkip) {
+ this.state.pos += commentSkip;
+ this.state.hasFlowComment = true;
+ }
+ return;
+ }
+ return super.skipBlockComment(this.state.hasFlowComment ? "*-/" : "*/");
+ }
+ skipFlowComment() {
+ const {
+ pos
+ } = this.state;
+ let shiftToFirstNonWhiteSpace = 2;
+ while ([32, 9].includes(this.input.charCodeAt(pos + shiftToFirstNonWhiteSpace))) {
+ shiftToFirstNonWhiteSpace++;
+ }
+ const ch2 = this.input.charCodeAt(shiftToFirstNonWhiteSpace + pos);
+ const ch3 = this.input.charCodeAt(shiftToFirstNonWhiteSpace + pos + 1);
+ if (ch2 === 58 && ch3 === 58) {
+ return shiftToFirstNonWhiteSpace + 2;
+ }
+ if (this.input.slice(shiftToFirstNonWhiteSpace + pos, shiftToFirstNonWhiteSpace + pos + 12) === "flow-include") {
+ return shiftToFirstNonWhiteSpace + 12;
+ }
+ if (ch2 === 58 && ch3 !== 58) {
+ return shiftToFirstNonWhiteSpace;
+ }
+ return false;
+ }
+ hasFlowCommentCompletion() {
+ const end = this.input.indexOf("*/", this.state.pos);
+ if (end === -1) {
+ throw this.raise(Errors.UnterminatedComment, {
+ at: this.state.curPosition()
+ });
+ }
+ }
+ flowEnumErrorBooleanMemberNotInitialized(loc, {
+ enumName,
+ memberName
+ }) {
+ this.raise(FlowErrors.EnumBooleanMemberNotInitialized, {
+ at: loc,
+ memberName,
+ enumName
+ });
+ }
+ flowEnumErrorInvalidMemberInitializer(loc, enumContext) {
+ return this.raise(!enumContext.explicitType ? FlowErrors.EnumInvalidMemberInitializerUnknownType : enumContext.explicitType === "symbol" ? FlowErrors.EnumInvalidMemberInitializerSymbolType : FlowErrors.EnumInvalidMemberInitializerPrimaryType, Object.assign({
+ at: loc
+ }, enumContext));
+ }
+ flowEnumErrorNumberMemberNotInitialized(loc, {
+ enumName,
+ memberName
+ }) {
+ this.raise(FlowErrors.EnumNumberMemberNotInitialized, {
+ at: loc,
+ enumName,
+ memberName
+ });
+ }
+ flowEnumErrorStringMemberInconsistentlyInitialized(node, {
+ enumName
+ }) {
+ this.raise(FlowErrors.EnumStringMemberInconsistentlyInitialized, {
+ at: node,
+ enumName
+ });
+ }
+ flowEnumMemberInit() {
+ const startLoc = this.state.startLoc;
+ const endOfInit = () => this.match(12) || this.match(8);
+ switch (this.state.type) {
+ case 134:
+ {
+ const literal = this.parseNumericLiteral(this.state.value);
+ if (endOfInit()) {
+ return {
+ type: "number",
+ loc: literal.loc.start,
+ value: literal
+ };
+ }
+ return {
+ type: "invalid",
+ loc: startLoc
+ };
+ }
+ case 133:
+ {
+ const literal = this.parseStringLiteral(this.state.value);
+ if (endOfInit()) {
+ return {
+ type: "string",
+ loc: literal.loc.start,
+ value: literal
+ };
+ }
+ return {
+ type: "invalid",
+ loc: startLoc
+ };
+ }
+ case 85:
+ case 86:
+ {
+ const literal = this.parseBooleanLiteral(this.match(85));
+ if (endOfInit()) {
+ return {
+ type: "boolean",
+ loc: literal.loc.start,
+ value: literal
+ };
+ }
+ return {
+ type: "invalid",
+ loc: startLoc
+ };
+ }
+ default:
+ return {
+ type: "invalid",
+ loc: startLoc
+ };
+ }
+ }
+ flowEnumMemberRaw() {
+ const loc = this.state.startLoc;
+ const id = this.parseIdentifier(true);
+ const init = this.eat(29) ? this.flowEnumMemberInit() : {
+ type: "none",
+ loc
+ };
+ return {
+ id,
+ init
+ };
+ }
+ flowEnumCheckExplicitTypeMismatch(loc, context, expectedType) {
+ const {
+ explicitType
+ } = context;
+ if (explicitType === null) {
+ return;
+ }
+ if (explicitType !== expectedType) {
+ this.flowEnumErrorInvalidMemberInitializer(loc, context);
+ }
+ }
+ flowEnumMembers({
+ enumName,
+ explicitType
+ }) {
+ const seenNames = new Set();
+ const members = {
+ booleanMembers: [],
+ numberMembers: [],
+ stringMembers: [],
+ defaultedMembers: []
+ };
+ let hasUnknownMembers = false;
+ while (!this.match(8)) {
+ if (this.eat(21)) {
+ hasUnknownMembers = true;
+ break;
+ }
+ const memberNode = this.startNode();
+ const {
+ id,
+ init
+ } = this.flowEnumMemberRaw();
+ const memberName = id.name;
+ if (memberName === "") {
+ continue;
+ }
+ if (/^[a-z]/.test(memberName)) {
+ this.raise(FlowErrors.EnumInvalidMemberName, {
+ at: id,
+ memberName,
+ suggestion: memberName[0].toUpperCase() + memberName.slice(1),
+ enumName
+ });
+ }
+ if (seenNames.has(memberName)) {
+ this.raise(FlowErrors.EnumDuplicateMemberName, {
+ at: id,
+ memberName,
+ enumName
+ });
+ }
+ seenNames.add(memberName);
+ const context = {
+ enumName,
+ explicitType,
+ memberName
+ };
+ memberNode.id = id;
+ switch (init.type) {
+ case "boolean":
+ {
+ this.flowEnumCheckExplicitTypeMismatch(init.loc, context, "boolean");
+ memberNode.init = init.value;
+ members.booleanMembers.push(this.finishNode(memberNode, "EnumBooleanMember"));
+ break;
+ }
+ case "number":
+ {
+ this.flowEnumCheckExplicitTypeMismatch(init.loc, context, "number");
+ memberNode.init = init.value;
+ members.numberMembers.push(this.finishNode(memberNode, "EnumNumberMember"));
+ break;
+ }
+ case "string":
+ {
+ this.flowEnumCheckExplicitTypeMismatch(init.loc, context, "string");
+ memberNode.init = init.value;
+ members.stringMembers.push(this.finishNode(memberNode, "EnumStringMember"));
+ break;
+ }
+ case "invalid":
+ {
+ throw this.flowEnumErrorInvalidMemberInitializer(init.loc, context);
+ }
+ case "none":
+ {
+ switch (explicitType) {
+ case "boolean":
+ this.flowEnumErrorBooleanMemberNotInitialized(init.loc, context);
+ break;
+ case "number":
+ this.flowEnumErrorNumberMemberNotInitialized(init.loc, context);
+ break;
+ default:
+ members.defaultedMembers.push(this.finishNode(memberNode, "EnumDefaultedMember"));
+ }
+ }
+ }
+ if (!this.match(8)) {
+ this.expect(12);
+ }
+ }
+ return {
+ members,
+ hasUnknownMembers
+ };
+ }
+ flowEnumStringMembers(initializedMembers, defaultedMembers, {
+ enumName
+ }) {
+ if (initializedMembers.length === 0) {
+ return defaultedMembers;
+ } else if (defaultedMembers.length === 0) {
+ return initializedMembers;
+ } else if (defaultedMembers.length > initializedMembers.length) {
+ for (const member of initializedMembers) {
+ this.flowEnumErrorStringMemberInconsistentlyInitialized(member, {
+ enumName
+ });
+ }
+ return defaultedMembers;
+ } else {
+ for (const member of defaultedMembers) {
+ this.flowEnumErrorStringMemberInconsistentlyInitialized(member, {
+ enumName
+ });
+ }
+ return initializedMembers;
+ }
+ }
+ flowEnumParseExplicitType({
+ enumName
+ }) {
+ if (!this.eatContextual(102)) return null;
+ if (!tokenIsIdentifier(this.state.type)) {
+ throw this.raise(FlowErrors.EnumInvalidExplicitTypeUnknownSupplied, {
+ at: this.state.startLoc,
+ enumName
+ });
+ }
+ const {
+ value
+ } = this.state;
+ this.next();
+ if (value !== "boolean" && value !== "number" && value !== "string" && value !== "symbol") {
+ this.raise(FlowErrors.EnumInvalidExplicitType, {
+ at: this.state.startLoc,
+ enumName,
+ invalidEnumType: value
+ });
+ }
+ return value;
+ }
+ flowEnumBody(node, id) {
+ const enumName = id.name;
+ const nameLoc = id.loc.start;
+ const explicitType = this.flowEnumParseExplicitType({
+ enumName
+ });
+ this.expect(5);
+ const {
+ members,
+ hasUnknownMembers
+ } = this.flowEnumMembers({
+ enumName,
+ explicitType
+ });
+ node.hasUnknownMembers = hasUnknownMembers;
+ switch (explicitType) {
+ case "boolean":
+ node.explicitType = true;
+ node.members = members.booleanMembers;
+ this.expect(8);
+ return this.finishNode(node, "EnumBooleanBody");
+ case "number":
+ node.explicitType = true;
+ node.members = members.numberMembers;
+ this.expect(8);
+ return this.finishNode(node, "EnumNumberBody");
+ case "string":
+ node.explicitType = true;
+ node.members = this.flowEnumStringMembers(members.stringMembers, members.defaultedMembers, {
+ enumName
+ });
+ this.expect(8);
+ return this.finishNode(node, "EnumStringBody");
+ case "symbol":
+ node.members = members.defaultedMembers;
+ this.expect(8);
+ return this.finishNode(node, "EnumSymbolBody");
+ default:
+ {
+ const empty = () => {
+ node.members = [];
+ this.expect(8);
+ return this.finishNode(node, "EnumStringBody");
+ };
+ node.explicitType = false;
+ const boolsLen = members.booleanMembers.length;
+ const numsLen = members.numberMembers.length;
+ const strsLen = members.stringMembers.length;
+ const defaultedLen = members.defaultedMembers.length;
+ if (!boolsLen && !numsLen && !strsLen && !defaultedLen) {
+ return empty();
+ } else if (!boolsLen && !numsLen) {
+ node.members = this.flowEnumStringMembers(members.stringMembers, members.defaultedMembers, {
+ enumName
+ });
+ this.expect(8);
+ return this.finishNode(node, "EnumStringBody");
+ } else if (!numsLen && !strsLen && boolsLen >= defaultedLen) {
+ for (const member of members.defaultedMembers) {
+ this.flowEnumErrorBooleanMemberNotInitialized(member.loc.start, {
+ enumName,
+ memberName: member.id.name
+ });
+ }
+ node.members = members.booleanMembers;
+ this.expect(8);
+ return this.finishNode(node, "EnumBooleanBody");
+ } else if (!boolsLen && !strsLen && numsLen >= defaultedLen) {
+ for (const member of members.defaultedMembers) {
+ this.flowEnumErrorNumberMemberNotInitialized(member.loc.start, {
+ enumName,
+ memberName: member.id.name
+ });
+ }
+ node.members = members.numberMembers;
+ this.expect(8);
+ return this.finishNode(node, "EnumNumberBody");
+ } else {
+ this.raise(FlowErrors.EnumInconsistentMemberValues, {
+ at: nameLoc,
+ enumName
+ });
+ return empty();
+ }
+ }
+ }
+ }
+ flowParseEnumDeclaration(node) {
+ const id = this.parseIdentifier();
+ node.id = id;
+ node.body = this.flowEnumBody(this.startNode(), id);
+ return this.finishNode(node, "EnumDeclaration");
+ }
+ isLookaheadToken_lt() {
+ const next = this.nextTokenStart();
+ if (this.input.charCodeAt(next) === 60) {
+ const afterNext = this.input.charCodeAt(next + 1);
+ return afterNext !== 60 && afterNext !== 61;
+ }
+ return false;
+ }
+ maybeUnwrapTypeCastExpression(node) {
+ return node.type === "TypeCastExpression" ? node.expression : node;
+ }
+ };
+ const entities = {
+ __proto__: null,
+ quot: "\u0022",
+ amp: "&",
+ apos: "\u0027",
+ lt: "<",
+ gt: ">",
+ nbsp: "\u00A0",
+ iexcl: "\u00A1",
+ cent: "\u00A2",
+ pound: "\u00A3",
+ curren: "\u00A4",
+ yen: "\u00A5",
+ brvbar: "\u00A6",
+ sect: "\u00A7",
+ uml: "\u00A8",
+ copy: "\u00A9",
+ ordf: "\u00AA",
+ laquo: "\u00AB",
+ not: "\u00AC",
+ shy: "\u00AD",
+ reg: "\u00AE",
+ macr: "\u00AF",
+ deg: "\u00B0",
+ plusmn: "\u00B1",
+ sup2: "\u00B2",
+ sup3: "\u00B3",
+ acute: "\u00B4",
+ micro: "\u00B5",
+ para: "\u00B6",
+ middot: "\u00B7",
+ cedil: "\u00B8",
+ sup1: "\u00B9",
+ ordm: "\u00BA",
+ raquo: "\u00BB",
+ frac14: "\u00BC",
+ frac12: "\u00BD",
+ frac34: "\u00BE",
+ iquest: "\u00BF",
+ Agrave: "\u00C0",
+ Aacute: "\u00C1",
+ Acirc: "\u00C2",
+ Atilde: "\u00C3",
+ Auml: "\u00C4",
+ Aring: "\u00C5",
+ AElig: "\u00C6",
+ Ccedil: "\u00C7",
+ Egrave: "\u00C8",
+ Eacute: "\u00C9",
+ Ecirc: "\u00CA",
+ Euml: "\u00CB",
+ Igrave: "\u00CC",
+ Iacute: "\u00CD",
+ Icirc: "\u00CE",
+ Iuml: "\u00CF",
+ ETH: "\u00D0",
+ Ntilde: "\u00D1",
+ Ograve: "\u00D2",
+ Oacute: "\u00D3",
+ Ocirc: "\u00D4",
+ Otilde: "\u00D5",
+ Ouml: "\u00D6",
+ times: "\u00D7",
+ Oslash: "\u00D8",
+ Ugrave: "\u00D9",
+ Uacute: "\u00DA",
+ Ucirc: "\u00DB",
+ Uuml: "\u00DC",
+ Yacute: "\u00DD",
+ THORN: "\u00DE",
+ szlig: "\u00DF",
+ agrave: "\u00E0",
+ aacute: "\u00E1",
+ acirc: "\u00E2",
+ atilde: "\u00E3",
+ auml: "\u00E4",
+ aring: "\u00E5",
+ aelig: "\u00E6",
+ ccedil: "\u00E7",
+ egrave: "\u00E8",
+ eacute: "\u00E9",
+ ecirc: "\u00EA",
+ euml: "\u00EB",
+ igrave: "\u00EC",
+ iacute: "\u00ED",
+ icirc: "\u00EE",
+ iuml: "\u00EF",
+ eth: "\u00F0",
+ ntilde: "\u00F1",
+ ograve: "\u00F2",
+ oacute: "\u00F3",
+ ocirc: "\u00F4",
+ otilde: "\u00F5",
+ ouml: "\u00F6",
+ divide: "\u00F7",
+ oslash: "\u00F8",
+ ugrave: "\u00F9",
+ uacute: "\u00FA",
+ ucirc: "\u00FB",
+ uuml: "\u00FC",
+ yacute: "\u00FD",
+ thorn: "\u00FE",
+ yuml: "\u00FF",
+ OElig: "\u0152",
+ oelig: "\u0153",
+ Scaron: "\u0160",
+ scaron: "\u0161",
+ Yuml: "\u0178",
+ fnof: "\u0192",
+ circ: "\u02C6",
+ tilde: "\u02DC",
+ Alpha: "\u0391",
+ Beta: "\u0392",
+ Gamma: "\u0393",
+ Delta: "\u0394",
+ Epsilon: "\u0395",
+ Zeta: "\u0396",
+ Eta: "\u0397",
+ Theta: "\u0398",
+ Iota: "\u0399",
+ Kappa: "\u039A",
+ Lambda: "\u039B",
+ Mu: "\u039C",
+ Nu: "\u039D",
+ Xi: "\u039E",
+ Omicron: "\u039F",
+ Pi: "\u03A0",
+ Rho: "\u03A1",
+ Sigma: "\u03A3",
+ Tau: "\u03A4",
+ Upsilon: "\u03A5",
+ Phi: "\u03A6",
+ Chi: "\u03A7",
+ Psi: "\u03A8",
+ Omega: "\u03A9",
+ alpha: "\u03B1",
+ beta: "\u03B2",
+ gamma: "\u03B3",
+ delta: "\u03B4",
+ epsilon: "\u03B5",
+ zeta: "\u03B6",
+ eta: "\u03B7",
+ theta: "\u03B8",
+ iota: "\u03B9",
+ kappa: "\u03BA",
+ lambda: "\u03BB",
+ mu: "\u03BC",
+ nu: "\u03BD",
+ xi: "\u03BE",
+ omicron: "\u03BF",
+ pi: "\u03C0",
+ rho: "\u03C1",
+ sigmaf: "\u03C2",
+ sigma: "\u03C3",
+ tau: "\u03C4",
+ upsilon: "\u03C5",
+ phi: "\u03C6",
+ chi: "\u03C7",
+ psi: "\u03C8",
+ omega: "\u03C9",
+ thetasym: "\u03D1",
+ upsih: "\u03D2",
+ piv: "\u03D6",
+ ensp: "\u2002",
+ emsp: "\u2003",
+ thinsp: "\u2009",
+ zwnj: "\u200C",
+ zwj: "\u200D",
+ lrm: "\u200E",
+ rlm: "\u200F",
+ ndash: "\u2013",
+ mdash: "\u2014",
+ lsquo: "\u2018",
+ rsquo: "\u2019",
+ sbquo: "\u201A",
+ ldquo: "\u201C",
+ rdquo: "\u201D",
+ bdquo: "\u201E",
+ dagger: "\u2020",
+ Dagger: "\u2021",
+ bull: "\u2022",
+ hellip: "\u2026",
+ permil: "\u2030",
+ prime: "\u2032",
+ Prime: "\u2033",
+ lsaquo: "\u2039",
+ rsaquo: "\u203A",
+ oline: "\u203E",
+ frasl: "\u2044",
+ euro: "\u20AC",
+ image: "\u2111",
+ weierp: "\u2118",
+ real: "\u211C",
+ trade: "\u2122",
+ alefsym: "\u2135",
+ larr: "\u2190",
+ uarr: "\u2191",
+ rarr: "\u2192",
+ darr: "\u2193",
+ harr: "\u2194",
+ crarr: "\u21B5",
+ lArr: "\u21D0",
+ uArr: "\u21D1",
+ rArr: "\u21D2",
+ dArr: "\u21D3",
+ hArr: "\u21D4",
+ forall: "\u2200",
+ part: "\u2202",
+ exist: "\u2203",
+ empty: "\u2205",
+ nabla: "\u2207",
+ isin: "\u2208",
+ notin: "\u2209",
+ ni: "\u220B",
+ prod: "\u220F",
+ sum: "\u2211",
+ minus: "\u2212",
+ lowast: "\u2217",
+ radic: "\u221A",
+ prop: "\u221D",
+ infin: "\u221E",
+ ang: "\u2220",
+ and: "\u2227",
+ or: "\u2228",
+ cap: "\u2229",
+ cup: "\u222A",
+ int: "\u222B",
+ there4: "\u2234",
+ sim: "\u223C",
+ cong: "\u2245",
+ asymp: "\u2248",
+ ne: "\u2260",
+ equiv: "\u2261",
+ le: "\u2264",
+ ge: "\u2265",
+ sub: "\u2282",
+ sup: "\u2283",
+ nsub: "\u2284",
+ sube: "\u2286",
+ supe: "\u2287",
+ oplus: "\u2295",
+ otimes: "\u2297",
+ perp: "\u22A5",
+ sdot: "\u22C5",
+ lceil: "\u2308",
+ rceil: "\u2309",
+ lfloor: "\u230A",
+ rfloor: "\u230B",
+ lang: "\u2329",
+ rang: "\u232A",
+ loz: "\u25CA",
+ spades: "\u2660",
+ clubs: "\u2663",
+ hearts: "\u2665",
+ diams: "\u2666"
+ };
+ const JsxErrors = ParseErrorEnum`jsx`({
+ AttributeIsEmpty: "JSX attributes must only be assigned a non-empty expression.",
+ MissingClosingTagElement: ({
+ openingTagName
+ }) => `Expected corresponding JSX closing tag for <${openingTagName}>.`,
+ MissingClosingTagFragment: "Expected corresponding JSX closing tag for <>.",
+ UnexpectedSequenceExpression: "Sequence expressions cannot be directly nested inside JSX. Did you mean to wrap it in parentheses (...)?",
+ UnexpectedToken: ({
+ unexpected,
+ HTMLEntity
+ }) => `Unexpected token \`${unexpected}\`. Did you mean \`${HTMLEntity}\` or \`{'${unexpected}'}\`?`,
+ UnsupportedJsxValue: "JSX value should be either an expression or a quoted JSX text.",
+ UnterminatedJsxContent: "Unterminated JSX contents.",
+ UnwrappedAdjacentJSXElements: "Adjacent JSX elements must be wrapped in an enclosing tag. Did you want a JSX fragment <>...</>?"
+ });
+ function isFragment(object) {
+ return object ? object.type === "JSXOpeningFragment" || object.type === "JSXClosingFragment" : false;
+ }
+ function getQualifiedJSXName(object) {
+ if (object.type === "JSXIdentifier") {
+ return object.name;
+ }
+ if (object.type === "JSXNamespacedName") {
+ return object.namespace.name + ":" + object.name.name;
+ }
+ if (object.type === "JSXMemberExpression") {
+ return getQualifiedJSXName(object.object) + "." + getQualifiedJSXName(object.property);
+ }
+ throw new Error("Node had unexpected type: " + object.type);
+ }
+ var jsx = superClass => class JSXParserMixin extends superClass {
+ jsxReadToken() {
+ let out = "";
+ let chunkStart = this.state.pos;
+ for (;;) {
+ if (this.state.pos >= this.length) {
+ throw this.raise(JsxErrors.UnterminatedJsxContent, {
+ at: this.state.startLoc
+ });
+ }
+ const ch = this.input.charCodeAt(this.state.pos);
+ switch (ch) {
+ case 60:
+ case 123:
+ if (this.state.pos === this.state.start) {
+ if (ch === 60 && this.state.canStartJSXElement) {
+ ++this.state.pos;
+ this.finishToken(142);
+ } else {
+ super.getTokenFromCode(ch);
+ }
+ return;
+ }
+ out += this.input.slice(chunkStart, this.state.pos);
+ this.finishToken(141, out);
+ return;
+ case 38:
+ out += this.input.slice(chunkStart, this.state.pos);
+ out += this.jsxReadEntity();
+ chunkStart = this.state.pos;
+ break;
+ case 62:
+ case 125:
+ default:
+ if (isNewLine(ch)) {
+ out += this.input.slice(chunkStart, this.state.pos);
+ out += this.jsxReadNewLine(true);
+ chunkStart = this.state.pos;
+ } else {
+ ++this.state.pos;
+ }
+ }
+ }
+ }
+ jsxReadNewLine(normalizeCRLF) {
+ const ch = this.input.charCodeAt(this.state.pos);
+ let out;
+ ++this.state.pos;
+ if (ch === 13 && this.input.charCodeAt(this.state.pos) === 10) {
+ ++this.state.pos;
+ out = normalizeCRLF ? "\n" : "\r\n";
+ } else {
+ out = String.fromCharCode(ch);
+ }
+ ++this.state.curLine;
+ this.state.lineStart = this.state.pos;
+ return out;
+ }
+ jsxReadString(quote) {
+ let out = "";
+ let chunkStart = ++this.state.pos;
+ for (;;) {
+ if (this.state.pos >= this.length) {
+ throw this.raise(Errors.UnterminatedString, {
+ at: this.state.startLoc
+ });
+ }
+ const ch = this.input.charCodeAt(this.state.pos);
+ if (ch === quote) break;
+ if (ch === 38) {
+ out += this.input.slice(chunkStart, this.state.pos);
+ out += this.jsxReadEntity();
+ chunkStart = this.state.pos;
+ } else if (isNewLine(ch)) {
+ out += this.input.slice(chunkStart, this.state.pos);
+ out += this.jsxReadNewLine(false);
+ chunkStart = this.state.pos;
+ } else {
+ ++this.state.pos;
+ }
+ }
+ out += this.input.slice(chunkStart, this.state.pos++);
+ this.finishToken(133, out);
+ }
+ jsxReadEntity() {
+ const startPos = ++this.state.pos;
+ if (this.codePointAtPos(this.state.pos) === 35) {
+ ++this.state.pos;
+ let radix = 10;
+ if (this.codePointAtPos(this.state.pos) === 120) {
+ radix = 16;
+ ++this.state.pos;
+ }
+ const codePoint = this.readInt(radix, undefined, false, "bail");
+ if (codePoint !== null && this.codePointAtPos(this.state.pos) === 59) {
+ ++this.state.pos;
+ return String.fromCodePoint(codePoint);
+ }
+ } else {
+ let count = 0;
+ let semi = false;
+ while (count++ < 10 && this.state.pos < this.length && !(semi = this.codePointAtPos(this.state.pos) == 59)) {
+ ++this.state.pos;
+ }
+ if (semi) {
+ const desc = this.input.slice(startPos, this.state.pos);
+ const entity = entities[desc];
+ ++this.state.pos;
+ if (entity) {
+ return entity;
+ }
+ }
+ }
+ this.state.pos = startPos;
+ return "&";
+ }
+ jsxReadWord() {
+ let ch;
+ const start = this.state.pos;
+ do {
+ ch = this.input.charCodeAt(++this.state.pos);
+ } while (isIdentifierChar(ch) || ch === 45);
+ this.finishToken(140, this.input.slice(start, this.state.pos));
+ }
+ jsxParseIdentifier() {
+ const node = this.startNode();
+ if (this.match(140)) {
+ node.name = this.state.value;
+ } else if (tokenIsKeyword(this.state.type)) {
+ node.name = tokenLabelName(this.state.type);
+ } else {
+ this.unexpected();
+ }
+ this.next();
+ return this.finishNode(node, "JSXIdentifier");
+ }
+ jsxParseNamespacedName() {
+ const startLoc = this.state.startLoc;
+ const name = this.jsxParseIdentifier();
+ if (!this.eat(14)) return name;
+ const node = this.startNodeAt(startLoc);
+ node.namespace = name;
+ node.name = this.jsxParseIdentifier();
+ return this.finishNode(node, "JSXNamespacedName");
+ }
+ jsxParseElementName() {
+ const startLoc = this.state.startLoc;
+ let node = this.jsxParseNamespacedName();
+ if (node.type === "JSXNamespacedName") {
+ return node;
+ }
+ while (this.eat(16)) {
+ const newNode = this.startNodeAt(startLoc);
+ newNode.object = node;
+ newNode.property = this.jsxParseIdentifier();
+ node = this.finishNode(newNode, "JSXMemberExpression");
+ }
+ return node;
+ }
+ jsxParseAttributeValue() {
+ let node;
+ switch (this.state.type) {
+ case 5:
+ node = this.startNode();
+ this.setContext(types.brace);
+ this.next();
+ node = this.jsxParseExpressionContainer(node, types.j_oTag);
+ if (node.expression.type === "JSXEmptyExpression") {
+ this.raise(JsxErrors.AttributeIsEmpty, {
+ at: node
+ });
+ }
+ return node;
+ case 142:
+ case 133:
+ return this.parseExprAtom();
+ default:
+ throw this.raise(JsxErrors.UnsupportedJsxValue, {
+ at: this.state.startLoc
+ });
+ }
+ }
+ jsxParseEmptyExpression() {
+ const node = this.startNodeAt(this.state.lastTokEndLoc);
+ return this.finishNodeAt(node, "JSXEmptyExpression", this.state.startLoc);
+ }
+ jsxParseSpreadChild(node) {
+ this.next();
+ node.expression = this.parseExpression();
+ this.setContext(types.j_expr);
+ this.state.canStartJSXElement = true;
+ this.expect(8);
+ return this.finishNode(node, "JSXSpreadChild");
+ }
+ jsxParseExpressionContainer(node, previousContext) {
+ if (this.match(8)) {
+ node.expression = this.jsxParseEmptyExpression();
+ } else {
+ const expression = this.parseExpression();
+ node.expression = expression;
+ }
+ this.setContext(previousContext);
+ this.state.canStartJSXElement = true;
+ this.expect(8);
+ return this.finishNode(node, "JSXExpressionContainer");
+ }
+ jsxParseAttribute() {
+ const node = this.startNode();
+ if (this.match(5)) {
+ this.setContext(types.brace);
+ this.next();
+ this.expect(21);
+ node.argument = this.parseMaybeAssignAllowIn();
+ this.setContext(types.j_oTag);
+ this.state.canStartJSXElement = true;
+ this.expect(8);
+ return this.finishNode(node, "JSXSpreadAttribute");
+ }
+ node.name = this.jsxParseNamespacedName();
+ node.value = this.eat(29) ? this.jsxParseAttributeValue() : null;
+ return this.finishNode(node, "JSXAttribute");
+ }
+ jsxParseOpeningElementAt(startLoc) {
+ const node = this.startNodeAt(startLoc);
+ if (this.eat(143)) {
+ return this.finishNode(node, "JSXOpeningFragment");
+ }
+ node.name = this.jsxParseElementName();
+ return this.jsxParseOpeningElementAfterName(node);
+ }
+ jsxParseOpeningElementAfterName(node) {
+ const attributes = [];
+ while (!this.match(56) && !this.match(143)) {
+ attributes.push(this.jsxParseAttribute());
+ }
+ node.attributes = attributes;
+ node.selfClosing = this.eat(56);
+ this.expect(143);
+ return this.finishNode(node, "JSXOpeningElement");
+ }
+ jsxParseClosingElementAt(startLoc) {
+ const node = this.startNodeAt(startLoc);
+ if (this.eat(143)) {
+ return this.finishNode(node, "JSXClosingFragment");
+ }
+ node.name = this.jsxParseElementName();
+ this.expect(143);
+ return this.finishNode(node, "JSXClosingElement");
+ }
+ jsxParseElementAt(startLoc) {
+ const node = this.startNodeAt(startLoc);
+ const children = [];
+ const openingElement = this.jsxParseOpeningElementAt(startLoc);
+ let closingElement = null;
+ if (!openingElement.selfClosing) {
+ contents: for (;;) {
+ switch (this.state.type) {
+ case 142:
+ startLoc = this.state.startLoc;
+ this.next();
+ if (this.eat(56)) {
+ closingElement = this.jsxParseClosingElementAt(startLoc);
+ break contents;
+ }
+ children.push(this.jsxParseElementAt(startLoc));
+ break;
+ case 141:
+ children.push(this.parseExprAtom());
+ break;
+ case 5:
+ {
+ const node = this.startNode();
+ this.setContext(types.brace);
+ this.next();
+ if (this.match(21)) {
+ children.push(this.jsxParseSpreadChild(node));
+ } else {
+ children.push(this.jsxParseExpressionContainer(node, types.j_expr));
+ }
+ break;
+ }
+ default:
+ this.unexpected();
+ }
+ }
+ if (isFragment(openingElement) && !isFragment(closingElement) && closingElement !== null) {
+ this.raise(JsxErrors.MissingClosingTagFragment, {
+ at: closingElement
+ });
+ } else if (!isFragment(openingElement) && isFragment(closingElement)) {
+ this.raise(JsxErrors.MissingClosingTagElement, {
+ at: closingElement,
+ openingTagName: getQualifiedJSXName(openingElement.name)
+ });
+ } else if (!isFragment(openingElement) && !isFragment(closingElement)) {
+ if (getQualifiedJSXName(closingElement.name) !== getQualifiedJSXName(openingElement.name)) {
+ this.raise(JsxErrors.MissingClosingTagElement, {
+ at: closingElement,
+ openingTagName: getQualifiedJSXName(openingElement.name)
+ });
+ }
+ }
+ }
+ if (isFragment(openingElement)) {
+ node.openingFragment = openingElement;
+ node.closingFragment = closingElement;
+ } else {
+ node.openingElement = openingElement;
+ node.closingElement = closingElement;
+ }
+ node.children = children;
+ if (this.match(47)) {
+ throw this.raise(JsxErrors.UnwrappedAdjacentJSXElements, {
+ at: this.state.startLoc
+ });
+ }
+ return isFragment(openingElement) ? this.finishNode(node, "JSXFragment") : this.finishNode(node, "JSXElement");
+ }
+ jsxParseElement() {
+ const startLoc = this.state.startLoc;
+ this.next();
+ return this.jsxParseElementAt(startLoc);
+ }
+ setContext(newContext) {
+ const {
+ context
+ } = this.state;
+ context[context.length - 1] = newContext;
+ }
+ parseExprAtom(refExpressionErrors) {
+ if (this.match(141)) {
+ return this.parseLiteral(this.state.value, "JSXText");
+ } else if (this.match(142)) {
+ return this.jsxParseElement();
+ } else if (this.match(47) && this.input.charCodeAt(this.state.pos) !== 33) {
+ this.replaceToken(142);
+ return this.jsxParseElement();
+ } else {
+ return super.parseExprAtom(refExpressionErrors);
+ }
+ }
+ skipSpace() {
+ const curContext = this.curContext();
+ if (!curContext.preserveSpace) super.skipSpace();
+ }
+ getTokenFromCode(code) {
+ const context = this.curContext();
+ if (context === types.j_expr) {
+ this.jsxReadToken();
+ return;
+ }
+ if (context === types.j_oTag || context === types.j_cTag) {
+ if (isIdentifierStart(code)) {
+ this.jsxReadWord();
+ return;
+ }
+ if (code === 62) {
+ ++this.state.pos;
+ this.finishToken(143);
+ return;
+ }
+ if ((code === 34 || code === 39) && context === types.j_oTag) {
+ this.jsxReadString(code);
+ return;
+ }
+ }
+ if (code === 60 && this.state.canStartJSXElement && this.input.charCodeAt(this.state.pos + 1) !== 33) {
+ ++this.state.pos;
+ this.finishToken(142);
+ return;
+ }
+ super.getTokenFromCode(code);
+ }
+ updateContext(prevType) {
+ const {
+ context,
+ type
+ } = this.state;
+ if (type === 56 && prevType === 142) {
+ context.splice(-2, 2, types.j_cTag);
+ this.state.canStartJSXElement = false;
+ } else if (type === 142) {
+ context.push(types.j_oTag);
+ } else if (type === 143) {
+ const out = context[context.length - 1];
+ if (out === types.j_oTag && prevType === 56 || out === types.j_cTag) {
+ context.pop();
+ this.state.canStartJSXElement = context[context.length - 1] === types.j_expr;
+ } else {
+ this.setContext(types.j_expr);
+ this.state.canStartJSXElement = true;
+ }
+ } else {
+ this.state.canStartJSXElement = tokenComesBeforeExpression(type);
+ }
+ }
+ };
+ class TypeScriptScope extends Scope {
+ constructor(...args) {
+ super(...args);
+ this.types = new Set();
+ this.enums = new Set();
+ this.constEnums = new Set();
+ this.classes = new Set();
+ this.exportOnlyBindings = new Set();
+ }
+ }
+ class TypeScriptScopeHandler extends ScopeHandler {
+ constructor(...args) {
+ super(...args);
+ this.importsStack = [];
+ }
+ createScope(flags) {
+ this.importsStack.push(new Set());
+ return new TypeScriptScope(flags);
+ }
+ enter(flags) {
+ if (flags == 256) {
+ this.importsStack.push(new Set());
+ }
+ super.enter(flags);
+ }
+ exit() {
+ const flags = super.exit();
+ if (flags == 256) {
+ this.importsStack.pop();
+ }
+ return flags;
+ }
+ hasImport(name, allowShadow) {
+ const len = this.importsStack.length;
+ if (this.importsStack[len - 1].has(name)) {
+ return true;
+ }
+ if (!allowShadow && len > 1) {
+ for (let i = 0; i < len - 1; i++) {
+ if (this.importsStack[i].has(name)) return true;
+ }
+ }
+ return false;
+ }
+ declareName(name, bindingType, loc) {
+ if (bindingType & 4096) {
+ if (this.hasImport(name, true)) {
+ this.parser.raise(Errors.VarRedeclaration, {
+ at: loc,
+ identifierName: name
+ });
+ }
+ this.importsStack[this.importsStack.length - 1].add(name);
+ return;
+ }
+ const scope = this.currentScope();
+ if (bindingType & 1024) {
+ this.maybeExportDefined(scope, name);
+ scope.exportOnlyBindings.add(name);
+ return;
+ }
+ super.declareName(name, bindingType, loc);
+ if (bindingType & 2) {
+ if (!(bindingType & 1)) {
+ this.checkRedeclarationInScope(scope, name, bindingType, loc);
+ this.maybeExportDefined(scope, name);
+ }
+ scope.types.add(name);
+ }
+ if (bindingType & 256) scope.enums.add(name);
+ if (bindingType & 512) {
+ scope.constEnums.add(name);
+ }
+ if (bindingType & 128) scope.classes.add(name);
+ }
+ isRedeclaredInScope(scope, name, bindingType) {
+ if (scope.enums.has(name)) {
+ if (bindingType & 256) {
+ const isConst = !!(bindingType & 512);
+ const wasConst = scope.constEnums.has(name);
+ return isConst !== wasConst;
+ }
+ return true;
+ }
+ if (bindingType & 128 && scope.classes.has(name)) {
+ if (scope.lexical.has(name)) {
+ return !!(bindingType & 1);
+ } else {
+ return false;
+ }
+ }
+ if (bindingType & 2 && scope.types.has(name)) {
+ return true;
+ }
+ return super.isRedeclaredInScope(scope, name, bindingType);
+ }
+ checkLocalExport(id) {
+ const {
+ name
+ } = id;
+ if (this.hasImport(name)) return;
+ const len = this.scopeStack.length;
+ for (let i = len - 1; i >= 0; i--) {
+ const scope = this.scopeStack[i];
+ if (scope.types.has(name) || scope.exportOnlyBindings.has(name)) return;
+ }
+ super.checkLocalExport(id);
+ }
+ }
+ const getOwn$1 = (object, key) => Object.hasOwnProperty.call(object, key) && object[key];
+ const unwrapParenthesizedExpression = node => {
+ return node.type === "ParenthesizedExpression" ? unwrapParenthesizedExpression(node.expression) : node;
+ };
+ class LValParser extends NodeUtils {
+ toAssignable(node, isLHS = false) {
+ var _node$extra, _node$extra3;
+ let parenthesized = undefined;
+ if (node.type === "ParenthesizedExpression" || (_node$extra = node.extra) != null && _node$extra.parenthesized) {
+ parenthesized = unwrapParenthesizedExpression(node);
+ if (isLHS) {
+ if (parenthesized.type === "Identifier") {
+ this.expressionScope.recordArrowParameterBindingError(Errors.InvalidParenthesizedAssignment, {
+ at: node
+ });
+ } else if (parenthesized.type !== "MemberExpression" && !this.isOptionalMemberExpression(parenthesized)) {
+ this.raise(Errors.InvalidParenthesizedAssignment, {
+ at: node
+ });
+ }
+ } else {
+ this.raise(Errors.InvalidParenthesizedAssignment, {
+ at: node
+ });
+ }
+ }
+ switch (node.type) {
+ case "Identifier":
+ case "ObjectPattern":
+ case "ArrayPattern":
+ case "AssignmentPattern":
+ case "RestElement":
+ break;
+ case "ObjectExpression":
+ node.type = "ObjectPattern";
+ for (let i = 0, length = node.properties.length, last = length - 1; i < length; i++) {
+ var _node$extra2;
+ const prop = node.properties[i];
+ const isLast = i === last;
+ this.toAssignableObjectExpressionProp(prop, isLast, isLHS);
+ if (isLast && prop.type === "RestElement" && (_node$extra2 = node.extra) != null && _node$extra2.trailingCommaLoc) {
+ this.raise(Errors.RestTrailingComma, {
+ at: node.extra.trailingCommaLoc
+ });
+ }
+ }
+ break;
+ case "ObjectProperty":
+ {
+ const {
+ key,
+ value
+ } = node;
+ if (this.isPrivateName(key)) {
+ this.classScope.usePrivateName(this.getPrivateNameSV(key), key.loc.start);
+ }
+ this.toAssignable(value, isLHS);
+ break;
+ }
+ case "SpreadElement":
+ {
+ throw new Error("Internal @babel/parser error (this is a bug, please report it)." + " SpreadElement should be converted by .toAssignable's caller.");
+ }
+ case "ArrayExpression":
+ node.type = "ArrayPattern";
+ this.toAssignableList(node.elements, (_node$extra3 = node.extra) == null ? void 0 : _node$extra3.trailingCommaLoc, isLHS);
+ break;
+ case "AssignmentExpression":
+ if (node.operator !== "=") {
+ this.raise(Errors.MissingEqInAssignment, {
+ at: node.left.loc.end
+ });
+ }
+ node.type = "AssignmentPattern";
+ delete node.operator;
+ this.toAssignable(node.left, isLHS);
+ break;
+ case "ParenthesizedExpression":
+ this.toAssignable(parenthesized, isLHS);
+ break;
+ }
+ }
+ toAssignableObjectExpressionProp(prop, isLast, isLHS) {
+ if (prop.type === "ObjectMethod") {
+ this.raise(prop.kind === "get" || prop.kind === "set" ? Errors.PatternHasAccessor : Errors.PatternHasMethod, {
+ at: prop.key
+ });
+ } else if (prop.type === "SpreadElement") {
+ prop.type = "RestElement";
+ const arg = prop.argument;
+ this.checkToRestConversion(arg, false);
+ this.toAssignable(arg, isLHS);
+ if (!isLast) {
+ this.raise(Errors.RestTrailingComma, {
+ at: prop
+ });
+ }
+ } else {
+ this.toAssignable(prop, isLHS);
+ }
+ }
+ toAssignableList(exprList, trailingCommaLoc, isLHS) {
+ const end = exprList.length - 1;
+ for (let i = 0; i <= end; i++) {
+ const elt = exprList[i];
+ if (!elt) continue;
+ if (elt.type === "SpreadElement") {
+ elt.type = "RestElement";
+ const arg = elt.argument;
+ this.checkToRestConversion(arg, true);
+ this.toAssignable(arg, isLHS);
+ } else {
+ this.toAssignable(elt, isLHS);
+ }
+ if (elt.type === "RestElement") {
+ if (i < end) {
+ this.raise(Errors.RestTrailingComma, {
+ at: elt
+ });
+ } else if (trailingCommaLoc) {
+ this.raise(Errors.RestTrailingComma, {
+ at: trailingCommaLoc
+ });
+ }
+ }
+ }
+ }
+ isAssignable(node, isBinding) {
+ switch (node.type) {
+ case "Identifier":
+ case "ObjectPattern":
+ case "ArrayPattern":
+ case "AssignmentPattern":
+ case "RestElement":
+ return true;
+ case "ObjectExpression":
+ {
+ const last = node.properties.length - 1;
+ return node.properties.every((prop, i) => {
+ return prop.type !== "ObjectMethod" && (i === last || prop.type !== "SpreadElement") && this.isAssignable(prop);
+ });
+ }
+ case "ObjectProperty":
+ return this.isAssignable(node.value);
+ case "SpreadElement":
+ return this.isAssignable(node.argument);
+ case "ArrayExpression":
+ return node.elements.every(element => element === null || this.isAssignable(element));
+ case "AssignmentExpression":
+ return node.operator === "=";
+ case "ParenthesizedExpression":
+ return this.isAssignable(node.expression);
+ case "MemberExpression":
+ case "OptionalMemberExpression":
+ return !isBinding;
+ default:
+ return false;
+ }
+ }
+ toReferencedList(exprList, isParenthesizedExpr) {
+ return exprList;
+ }
+ toReferencedListDeep(exprList, isParenthesizedExpr) {
+ this.toReferencedList(exprList, isParenthesizedExpr);
+ for (const expr of exprList) {
+ if ((expr == null ? void 0 : expr.type) === "ArrayExpression") {
+ this.toReferencedListDeep(expr.elements);
+ }
+ }
+ }
+ parseSpread(refExpressionErrors) {
+ const node = this.startNode();
+ this.next();
+ node.argument = this.parseMaybeAssignAllowIn(refExpressionErrors, undefined);
+ return this.finishNode(node, "SpreadElement");
+ }
+ parseRestBinding() {
+ const node = this.startNode();
+ this.next();
+ node.argument = this.parseBindingAtom();
+ return this.finishNode(node, "RestElement");
+ }
+ parseBindingAtom() {
+ switch (this.state.type) {
+ case 0:
+ {
+ const node = this.startNode();
+ this.next();
+ node.elements = this.parseBindingList(3, 93, 1);
+ return this.finishNode(node, "ArrayPattern");
+ }
+ case 5:
+ return this.parseObjectLike(8, true);
+ }
+ return this.parseIdentifier();
+ }
+ parseBindingList(close, closeCharCode, flags) {
+ const allowEmpty = flags & 1;
+ const elts = [];
+ let first = true;
+ while (!this.eat(close)) {
+ if (first) {
+ first = false;
+ } else {
+ this.expect(12);
+ }
+ if (allowEmpty && this.match(12)) {
+ elts.push(null);
+ } else if (this.eat(close)) {
+ break;
+ } else if (this.match(21)) {
+ elts.push(this.parseAssignableListItemTypes(this.parseRestBinding(), flags));
+ if (!this.checkCommaAfterRest(closeCharCode)) {
+ this.expect(close);
+ break;
+ }
+ } else {
+ const decorators = [];
+ if (this.match(26) && this.hasPlugin("decorators")) {
+ this.raise(Errors.UnsupportedParameterDecorator, {
+ at: this.state.startLoc
+ });
+ }
+ while (this.match(26)) {
+ decorators.push(this.parseDecorator());
+ }
+ elts.push(this.parseAssignableListItem(flags, decorators));
+ }
+ }
+ return elts;
+ }
+ parseBindingRestProperty(prop) {
+ this.next();
+ prop.argument = this.parseIdentifier();
+ this.checkCommaAfterRest(125);
+ return this.finishNode(prop, "RestElement");
+ }
+ parseBindingProperty() {
+ const prop = this.startNode();
+ const {
+ type,
+ startLoc
+ } = this.state;
+ if (type === 21) {
+ return this.parseBindingRestProperty(prop);
+ } else if (type === 138) {
+ this.expectPlugin("destructuringPrivate", startLoc);
+ this.classScope.usePrivateName(this.state.value, startLoc);
+ prop.key = this.parsePrivateName();
+ } else {
+ this.parsePropertyName(prop);
+ }
+ prop.method = false;
+ return this.parseObjPropValue(prop, startLoc, false, false, true, false);
+ }
+ parseAssignableListItem(flags, decorators) {
+ const left = this.parseMaybeDefault();
+ this.parseAssignableListItemTypes(left, flags);
+ const elt = this.parseMaybeDefault(left.loc.start, left);
+ if (decorators.length) {
+ left.decorators = decorators;
+ }
+ return elt;
+ }
+ parseAssignableListItemTypes(param, flags) {
+ return param;
+ }
+ parseMaybeDefault(startLoc, left) {
+ var _startLoc, _left;
+ (_startLoc = startLoc) != null ? _startLoc : startLoc = this.state.startLoc;
+ left = (_left = left) != null ? _left : this.parseBindingAtom();
+ if (!this.eat(29)) return left;
+ const node = this.startNodeAt(startLoc);
+ node.left = left;
+ node.right = this.parseMaybeAssignAllowIn();
+ return this.finishNode(node, "AssignmentPattern");
+ }
+ isValidLVal(type, isUnparenthesizedInAssign, binding) {
+ return getOwn$1({
+ AssignmentPattern: "left",
+ RestElement: "argument",
+ ObjectProperty: "value",
+ ParenthesizedExpression: "expression",
+ ArrayPattern: "elements",
+ ObjectPattern: "properties"
+ }, type);
+ }
+ isOptionalMemberExpression(expression) {
+ return expression.type === "OptionalMemberExpression";
+ }
+ checkLVal(expression, {
+ in: ancestor,
+ binding = 64,
+ checkClashes = false,
+ strictModeChanged = false,
+ hasParenthesizedAncestor = false
+ }) {
+ var _expression$extra;
+ const type = expression.type;
+ if (this.isObjectMethod(expression)) return;
+ const isOptionalMemberExpression = this.isOptionalMemberExpression(expression);
+ if (isOptionalMemberExpression || type === "MemberExpression") {
+ if (isOptionalMemberExpression) {
+ this.expectPlugin("optionalChainingAssign", expression.loc.start);
+ if (ancestor.type !== "AssignmentExpression") {
+ this.raise(Errors.InvalidLhsOptionalChaining, {
+ at: expression,
+ ancestor
+ });
+ }
+ }
+ if (binding !== 64) {
+ this.raise(Errors.InvalidPropertyBindingPattern, {
+ at: expression
+ });
+ }
+ return;
+ }
+ if (type === "Identifier") {
+ this.checkIdentifier(expression, binding, strictModeChanged);
+ const {
+ name
+ } = expression;
+ if (checkClashes) {
+ if (checkClashes.has(name)) {
+ this.raise(Errors.ParamDupe, {
+ at: expression
+ });
+ } else {
+ checkClashes.add(name);
+ }
+ }
+ return;
+ }
+ const validity = this.isValidLVal(type, !(hasParenthesizedAncestor || (_expression$extra = expression.extra) != null && _expression$extra.parenthesized) && ancestor.type === "AssignmentExpression", binding);
+ if (validity === true) return;
+ if (validity === false) {
+ const ParseErrorClass = binding === 64 ? Errors.InvalidLhs : Errors.InvalidLhsBinding;
+ this.raise(ParseErrorClass, {
+ at: expression,
+ ancestor
+ });
+ return;
+ }
+ const [key, isParenthesizedExpression] = Array.isArray(validity) ? validity : [validity, type === "ParenthesizedExpression"];
+ const nextAncestor = type === "ArrayPattern" || type === "ObjectPattern" ? {
+ type
+ } : ancestor;
+ for (const child of [].concat(expression[key])) {
+ if (child) {
+ this.checkLVal(child, {
+ in: nextAncestor,
+ binding,
+ checkClashes,
+ strictModeChanged,
+ hasParenthesizedAncestor: isParenthesizedExpression
+ });
+ }
+ }
+ }
+ checkIdentifier(at, bindingType, strictModeChanged = false) {
+ if (this.state.strict && (strictModeChanged ? isStrictBindReservedWord(at.name, this.inModule) : isStrictBindOnlyReservedWord(at.name))) {
+ if (bindingType === 64) {
+ this.raise(Errors.StrictEvalArguments, {
+ at,
+ referenceName: at.name
+ });
+ } else {
+ this.raise(Errors.StrictEvalArgumentsBinding, {
+ at,
+ bindingName: at.name
+ });
+ }
+ }
+ if (bindingType & 8192 && at.name === "let") {
+ this.raise(Errors.LetInLexicalBinding, {
+ at
+ });
+ }
+ if (!(bindingType & 64)) {
+ this.declareNameFromIdentifier(at, bindingType);
+ }
+ }
+ declareNameFromIdentifier(identifier, binding) {
+ this.scope.declareName(identifier.name, binding, identifier.loc.start);
+ }
+ checkToRestConversion(node, allowPattern) {
+ switch (node.type) {
+ case "ParenthesizedExpression":
+ this.checkToRestConversion(node.expression, allowPattern);
+ break;
+ case "Identifier":
+ case "MemberExpression":
+ break;
+ case "ArrayExpression":
+ case "ObjectExpression":
+ if (allowPattern) break;
+ default:
+ this.raise(Errors.InvalidRestAssignmentPattern, {
+ at: node
+ });
+ }
+ }
+ checkCommaAfterRest(close) {
+ if (!this.match(12)) {
+ return false;
+ }
+ this.raise(this.lookaheadCharCode() === close ? Errors.RestTrailingComma : Errors.ElementAfterRest, {
+ at: this.state.startLoc
+ });
+ return true;
+ }
+ }
+ const getOwn = (object, key) => Object.hasOwnProperty.call(object, key) && object[key];
+ function nonNull(x) {
+ if (x == null) {
+ throw new Error(`Unexpected ${x} value.`);
+ }
+ return x;
+ }
+ function assert(x) {
+ if (!x) {
+ throw new Error("Assert fail");
+ }
+ }
+ const TSErrors = ParseErrorEnum`typescript`({
+ AbstractMethodHasImplementation: ({
+ methodName
+ }) => `Method '${methodName}' cannot have an implementation because it is marked abstract.`,
+ AbstractPropertyHasInitializer: ({
+ propertyName
+ }) => `Property '${propertyName}' cannot have an initializer because it is marked abstract.`,
+ AccesorCannotDeclareThisParameter: "'get' and 'set' accessors cannot declare 'this' parameters.",
+ AccesorCannotHaveTypeParameters: "An accessor cannot have type parameters.",
+ AccessorCannotBeOptional: "An 'accessor' property cannot be declared optional.",
+ ClassMethodHasDeclare: "Class methods cannot have the 'declare' modifier.",
+ ClassMethodHasReadonly: "Class methods cannot have the 'readonly' modifier.",
+ ConstInitiailizerMustBeStringOrNumericLiteralOrLiteralEnumReference: "A 'const' initializer in an ambient context must be a string or numeric literal or literal enum reference.",
+ ConstructorHasTypeParameters: "Type parameters cannot appear on a constructor declaration.",
+ DeclareAccessor: ({
+ kind
+ }) => `'declare' is not allowed in ${kind}ters.`,
+ DeclareClassFieldHasInitializer: "Initializers are not allowed in ambient contexts.",
+ DeclareFunctionHasImplementation: "An implementation cannot be declared in ambient contexts.",
+ DuplicateAccessibilityModifier: ({
+ modifier
+ }) => `Accessibility modifier already seen.`,
+ DuplicateModifier: ({
+ modifier
+ }) => `Duplicate modifier: '${modifier}'.`,
+ EmptyHeritageClauseType: ({
+ token
+ }) => `'${token}' list cannot be empty.`,
+ EmptyTypeArguments: "Type argument list cannot be empty.",
+ EmptyTypeParameters: "Type parameter list cannot be empty.",
+ ExpectedAmbientAfterExportDeclare: "'export declare' must be followed by an ambient declaration.",
+ ImportAliasHasImportType: "An import alias can not use 'import type'.",
+ ImportReflectionHasImportType: "An `import module` declaration can not use `type` modifier",
+ IncompatibleModifiers: ({
+ modifiers
+ }) => `'${modifiers[0]}' modifier cannot be used with '${modifiers[1]}' modifier.`,
+ IndexSignatureHasAbstract: "Index signatures cannot have the 'abstract' modifier.",
+ IndexSignatureHasAccessibility: ({
+ modifier
+ }) => `Index signatures cannot have an accessibility modifier ('${modifier}').`,
+ IndexSignatureHasDeclare: "Index signatures cannot have the 'declare' modifier.",
+ IndexSignatureHasOverride: "'override' modifier cannot appear on an index signature.",
+ IndexSignatureHasStatic: "Index signatures cannot have the 'static' modifier.",
+ InitializerNotAllowedInAmbientContext: "Initializers are not allowed in ambient contexts.",
+ InvalidModifierOnTypeMember: ({
+ modifier
+ }) => `'${modifier}' modifier cannot appear on a type member.`,
+ InvalidModifierOnTypeParameter: ({
+ modifier
+ }) => `'${modifier}' modifier cannot appear on a type parameter.`,
+ InvalidModifierOnTypeParameterPositions: ({
+ modifier
+ }) => `'${modifier}' modifier can only appear on a type parameter of a class, interface or type alias.`,
+ InvalidModifiersOrder: ({
+ orderedModifiers
+ }) => `'${orderedModifiers[0]}' modifier must precede '${orderedModifiers[1]}' modifier.`,
+ InvalidPropertyAccessAfterInstantiationExpression: "Invalid property access after an instantiation expression. " + "You can either wrap the instantiation expression in parentheses, or delete the type arguments.",
+ InvalidTupleMemberLabel: "Tuple members must be labeled with a simple identifier.",
+ MissingInterfaceName: "'interface' declarations must be followed by an identifier.",
+ NonAbstractClassHasAbstractMethod: "Abstract methods can only appear within an abstract class.",
+ NonClassMethodPropertyHasAbstractModifer: "'abstract' modifier can only appear on a class, method, or property declaration.",
+ OptionalTypeBeforeRequired: "A required element cannot follow an optional element.",
+ OverrideNotInSubClass: "This member cannot have an 'override' modifier because its containing class does not extend another class.",
+ PatternIsOptional: "A binding pattern parameter cannot be optional in an implementation signature.",
+ PrivateElementHasAbstract: "Private elements cannot have the 'abstract' modifier.",
+ PrivateElementHasAccessibility: ({
+ modifier
+ }) => `Private elements cannot have an accessibility modifier ('${modifier}').`,
+ ReadonlyForMethodSignature: "'readonly' modifier can only appear on a property declaration or index signature.",
+ ReservedArrowTypeParam: "This syntax is reserved in files with the .mts or .cts extension. Add a trailing comma, as in `<T,>() => ...`.",
+ ReservedTypeAssertion: "This syntax is reserved in files with the .mts or .cts extension. Use an `as` expression instead.",
+ SetAccesorCannotHaveOptionalParameter: "A 'set' accessor cannot have an optional parameter.",
+ SetAccesorCannotHaveRestParameter: "A 'set' accessor cannot have rest parameter.",
+ SetAccesorCannotHaveReturnType: "A 'set' accessor cannot have a return type annotation.",
+ SingleTypeParameterWithoutTrailingComma: ({
+ typeParameterName
+ }) => `Single type parameter ${typeParameterName} should have a trailing comma. Example usage: <${typeParameterName},>.`,
+ StaticBlockCannotHaveModifier: "Static class blocks cannot have any modifier.",
+ TupleOptionalAfterType: "A labeled tuple optional element must be declared using a question mark after the name and before the colon (`name?: type`), rather than after the type (`name: type?`).",
+ TypeAnnotationAfterAssign: "Type annotations must come before default assignments, e.g. instead of `age = 25: number` use `age: number = 25`.",
+ TypeImportCannotSpecifyDefaultAndNamed: "A type-only import can specify a default import or named bindings, but not both.",
+ TypeModifierIsUsedInTypeExports: "The 'type' modifier cannot be used on a named export when 'export type' is used on its export statement.",
+ TypeModifierIsUsedInTypeImports: "The 'type' modifier cannot be used on a named import when 'import type' is used on its import statement.",
+ UnexpectedParameterModifier: "A parameter property is only allowed in a constructor implementation.",
+ UnexpectedReadonly: "'readonly' type modifier is only permitted on array and tuple literal types.",
+ UnexpectedTypeAnnotation: "Did not expect a type annotation here.",
+ UnexpectedTypeCastInParameter: "Unexpected type cast in parameter position.",
+ UnsupportedImportTypeArgument: "Argument in a type import must be a string literal.",
+ UnsupportedParameterPropertyKind: "A parameter property may not be declared using a binding pattern.",
+ UnsupportedSignatureParameterKind: ({
+ type
+ }) => `Name in a signature must be an Identifier, ObjectPattern or ArrayPattern, instead got ${type}.`
+ });
+ function keywordTypeFromName(value) {
+ switch (value) {
+ case "any":
+ return "TSAnyKeyword";
+ case "boolean":
+ return "TSBooleanKeyword";
+ case "bigint":
+ return "TSBigIntKeyword";
+ case "never":
+ return "TSNeverKeyword";
+ case "number":
+ return "TSNumberKeyword";
+ case "object":
+ return "TSObjectKeyword";
+ case "string":
+ return "TSStringKeyword";
+ case "symbol":
+ return "TSSymbolKeyword";
+ case "undefined":
+ return "TSUndefinedKeyword";
+ case "unknown":
+ return "TSUnknownKeyword";
+ default:
+ return undefined;
+ }
+ }
+ function tsIsAccessModifier(modifier) {
+ return modifier === "private" || modifier === "public" || modifier === "protected";
+ }
+ function tsIsVarianceAnnotations(modifier) {
+ return modifier === "in" || modifier === "out";
+ }
+ var typescript = superClass => class TypeScriptParserMixin extends superClass {
+ constructor(...args) {
+ super(...args);
+ this.tsParseInOutModifiers = this.tsParseModifiers.bind(this, {
+ allowedModifiers: ["in", "out"],
+ disallowedModifiers: ["const", "public", "private", "protected", "readonly", "declare", "abstract", "override"],
+ errorTemplate: TSErrors.InvalidModifierOnTypeParameter
+ });
+ this.tsParseConstModifier = this.tsParseModifiers.bind(this, {
+ allowedModifiers: ["const"],
+ disallowedModifiers: ["in", "out"],
+ errorTemplate: TSErrors.InvalidModifierOnTypeParameterPositions
+ });
+ this.tsParseInOutConstModifiers = this.tsParseModifiers.bind(this, {
+ allowedModifiers: ["in", "out", "const"],
+ disallowedModifiers: ["public", "private", "protected", "readonly", "declare", "abstract", "override"],
+ errorTemplate: TSErrors.InvalidModifierOnTypeParameter
+ });
+ }
+ getScopeHandler() {
+ return TypeScriptScopeHandler;
+ }
+ tsIsIdentifier() {
+ return tokenIsIdentifier(this.state.type);
+ }
+ tsTokenCanFollowModifier() {
+ return (this.match(0) || this.match(5) || this.match(55) || this.match(21) || this.match(138) || this.isLiteralPropertyName()) && !this.hasPrecedingLineBreak();
+ }
+ tsNextTokenCanFollowModifier() {
+ this.next();
+ return this.tsTokenCanFollowModifier();
+ }
+ tsParseModifier(allowedModifiers, stopOnStartOfClassStaticBlock) {
+ if (!tokenIsIdentifier(this.state.type) && this.state.type !== 58 && this.state.type !== 75) {
+ return undefined;
+ }
+ const modifier = this.state.value;
+ if (allowedModifiers.indexOf(modifier) !== -1) {
+ if (stopOnStartOfClassStaticBlock && this.tsIsStartOfStaticBlocks()) {
+ return undefined;
+ }
+ if (this.tsTryParse(this.tsNextTokenCanFollowModifier.bind(this))) {
+ return modifier;
+ }
+ }
+ return undefined;
+ }
+ tsParseModifiers({
+ allowedModifiers,
+ disallowedModifiers,
+ stopOnStartOfClassStaticBlock,
+ errorTemplate = TSErrors.InvalidModifierOnTypeMember
+ }, modified) {
+ const enforceOrder = (loc, modifier, before, after) => {
+ if (modifier === before && modified[after]) {
+ this.raise(TSErrors.InvalidModifiersOrder, {
+ at: loc,
+ orderedModifiers: [before, after]
+ });
+ }
+ };
+ const incompatible = (loc, modifier, mod1, mod2) => {
+ if (modified[mod1] && modifier === mod2 || modified[mod2] && modifier === mod1) {
+ this.raise(TSErrors.IncompatibleModifiers, {
+ at: loc,
+ modifiers: [mod1, mod2]
+ });
+ }
+ };
+ for (;;) {
+ const {
+ startLoc
+ } = this.state;
+ const modifier = this.tsParseModifier(allowedModifiers.concat(disallowedModifiers != null ? disallowedModifiers : []), stopOnStartOfClassStaticBlock);
+ if (!modifier) break;
+ if (tsIsAccessModifier(modifier)) {
+ if (modified.accessibility) {
+ this.raise(TSErrors.DuplicateAccessibilityModifier, {
+ at: startLoc,
+ modifier
+ });
+ } else {
+ enforceOrder(startLoc, modifier, modifier, "override");
+ enforceOrder(startLoc, modifier, modifier, "static");
+ enforceOrder(startLoc, modifier, modifier, "readonly");
+ modified.accessibility = modifier;
+ }
+ } else if (tsIsVarianceAnnotations(modifier)) {
+ if (modified[modifier]) {
+ this.raise(TSErrors.DuplicateModifier, {
+ at: startLoc,
+ modifier
+ });
+ }
+ modified[modifier] = true;
+ enforceOrder(startLoc, modifier, "in", "out");
+ } else {
+ if (Object.hasOwnProperty.call(modified, modifier)) {
+ this.raise(TSErrors.DuplicateModifier, {
+ at: startLoc,
+ modifier
+ });
+ } else {
+ enforceOrder(startLoc, modifier, "static", "readonly");
+ enforceOrder(startLoc, modifier, "static", "override");
+ enforceOrder(startLoc, modifier, "override", "readonly");
+ enforceOrder(startLoc, modifier, "abstract", "override");
+ incompatible(startLoc, modifier, "declare", "override");
+ incompatible(startLoc, modifier, "static", "abstract");
+ }
+ modified[modifier] = true;
+ }
+ if (disallowedModifiers != null && disallowedModifiers.includes(modifier)) {
+ this.raise(errorTemplate, {
+ at: startLoc,
+ modifier
+ });
+ }
+ }
+ }
+ tsIsListTerminator(kind) {
+ switch (kind) {
+ case "EnumMembers":
+ case "TypeMembers":
+ return this.match(8);
+ case "HeritageClauseElement":
+ return this.match(5);
+ case "TupleElementTypes":
+ return this.match(3);
+ case "TypeParametersOrArguments":
+ return this.match(48);
+ }
+ }
+ tsParseList(kind, parseElement) {
+ const result = [];
+ while (!this.tsIsListTerminator(kind)) {
+ result.push(parseElement());
+ }
+ return result;
+ }
+ tsParseDelimitedList(kind, parseElement, refTrailingCommaPos) {
+ return nonNull(this.tsParseDelimitedListWorker(kind, parseElement, true, refTrailingCommaPos));
+ }
+ tsParseDelimitedListWorker(kind, parseElement, expectSuccess, refTrailingCommaPos) {
+ const result = [];
+ let trailingCommaPos = -1;
+ for (;;) {
+ if (this.tsIsListTerminator(kind)) {
+ break;
+ }
+ trailingCommaPos = -1;
+ const element = parseElement();
+ if (element == null) {
+ return undefined;
+ }
+ result.push(element);
+ if (this.eat(12)) {
+ trailingCommaPos = this.state.lastTokStart;
+ continue;
+ }
+ if (this.tsIsListTerminator(kind)) {
+ break;
+ }
+ if (expectSuccess) {
+ this.expect(12);
+ }
+ return undefined;
+ }
+ if (refTrailingCommaPos) {
+ refTrailingCommaPos.value = trailingCommaPos;
+ }
+ return result;
+ }
+ tsParseBracketedList(kind, parseElement, bracket, skipFirstToken, refTrailingCommaPos) {
+ if (!skipFirstToken) {
+ if (bracket) {
+ this.expect(0);
+ } else {
+ this.expect(47);
+ }
+ }
+ const result = this.tsParseDelimitedList(kind, parseElement, refTrailingCommaPos);
+ if (bracket) {
+ this.expect(3);
+ } else {
+ this.expect(48);
+ }
+ return result;
+ }
+ tsParseImportType() {
+ const node = this.startNode();
+ this.expect(83);
+ this.expect(10);
+ if (!this.match(133)) {
+ this.raise(TSErrors.UnsupportedImportTypeArgument, {
+ at: this.state.startLoc
+ });
+ }
+ node.argument = super.parseExprAtom();
+ this.expect(11);
+ if (this.eat(16)) {
+ node.qualifier = this.tsParseEntityName();
+ }
+ if (this.match(47)) {
+ node.typeParameters = this.tsParseTypeArguments();
+ }
+ return this.finishNode(node, "TSImportType");
+ }
+ tsParseEntityName(allowReservedWords = true) {
+ let entity = this.parseIdentifier(allowReservedWords);
+ while (this.eat(16)) {
+ const node = this.startNodeAtNode(entity);
+ node.left = entity;
+ node.right = this.parseIdentifier(allowReservedWords);
+ entity = this.finishNode(node, "TSQualifiedName");
+ }
+ return entity;
+ }
+ tsParseTypeReference() {
+ const node = this.startNode();
+ node.typeName = this.tsParseEntityName();
+ if (!this.hasPrecedingLineBreak() && this.match(47)) {
+ node.typeParameters = this.tsParseTypeArguments();
+ }
+ return this.finishNode(node, "TSTypeReference");
+ }
+ tsParseThisTypePredicate(lhs) {
+ this.next();
+ const node = this.startNodeAtNode(lhs);
+ node.parameterName = lhs;
+ node.typeAnnotation = this.tsParseTypeAnnotation(false);
+ node.asserts = false;
+ return this.finishNode(node, "TSTypePredicate");
+ }
+ tsParseThisTypeNode() {
+ const node = this.startNode();
+ this.next();
+ return this.finishNode(node, "TSThisType");
+ }
+ tsParseTypeQuery() {
+ const node = this.startNode();
+ this.expect(87);
+ if (this.match(83)) {
+ node.exprName = this.tsParseImportType();
+ } else {
+ node.exprName = this.tsParseEntityName();
+ }
+ if (!this.hasPrecedingLineBreak() && this.match(47)) {
+ node.typeParameters = this.tsParseTypeArguments();
+ }
+ return this.finishNode(node, "TSTypeQuery");
+ }
+ tsParseTypeParameter(parseModifiers) {
+ const node = this.startNode();
+ parseModifiers(node);
+ node.name = this.tsParseTypeParameterName();
+ node.constraint = this.tsEatThenParseType(81);
+ node.default = this.tsEatThenParseType(29);
+ return this.finishNode(node, "TSTypeParameter");
+ }
+ tsTryParseTypeParameters(parseModifiers) {
+ if (this.match(47)) {
+ return this.tsParseTypeParameters(parseModifiers);
+ }
+ }
+ tsParseTypeParameters(parseModifiers) {
+ const node = this.startNode();
+ if (this.match(47) || this.match(142)) {
+ this.next();
+ } else {
+ this.unexpected();
+ }
+ const refTrailingCommaPos = {
+ value: -1
+ };
+ node.params = this.tsParseBracketedList("TypeParametersOrArguments", this.tsParseTypeParameter.bind(this, parseModifiers), false, true, refTrailingCommaPos);
+ if (node.params.length === 0) {
+ this.raise(TSErrors.EmptyTypeParameters, {
+ at: node
+ });
+ }
+ if (refTrailingCommaPos.value !== -1) {
+ this.addExtra(node, "trailingComma", refTrailingCommaPos.value);
+ }
+ return this.finishNode(node, "TSTypeParameterDeclaration");
+ }
+ tsFillSignature(returnToken, signature) {
+ const returnTokenRequired = returnToken === 19;
+ const paramsKey = "parameters";
+ const returnTypeKey = "typeAnnotation";
+ signature.typeParameters = this.tsTryParseTypeParameters(this.tsParseConstModifier);
+ this.expect(10);
+ signature[paramsKey] = this.tsParseBindingListForSignature();
+ if (returnTokenRequired) {
+ signature[returnTypeKey] = this.tsParseTypeOrTypePredicateAnnotation(returnToken);
+ } else if (this.match(returnToken)) {
+ signature[returnTypeKey] = this.tsParseTypeOrTypePredicateAnnotation(returnToken);
+ }
+ }
+ tsParseBindingListForSignature() {
+ const list = super.parseBindingList(11, 41, 2);
+ for (const pattern of list) {
+ const {
+ type
+ } = pattern;
+ if (type === "AssignmentPattern" || type === "TSParameterProperty") {
+ this.raise(TSErrors.UnsupportedSignatureParameterKind, {
+ at: pattern,
+ type
+ });
+ }
+ }
+ return list;
+ }
+ tsParseTypeMemberSemicolon() {
+ if (!this.eat(12) && !this.isLineTerminator()) {
+ this.expect(13);
+ }
+ }
+ tsParseSignatureMember(kind, node) {
+ this.tsFillSignature(14, node);
+ this.tsParseTypeMemberSemicolon();
+ return this.finishNode(node, kind);
+ }
+ tsIsUnambiguouslyIndexSignature() {
+ this.next();
+ if (tokenIsIdentifier(this.state.type)) {
+ this.next();
+ return this.match(14);
+ }
+ return false;
+ }
+ tsTryParseIndexSignature(node) {
+ if (!(this.match(0) && this.tsLookAhead(this.tsIsUnambiguouslyIndexSignature.bind(this)))) {
+ return;
+ }
+ this.expect(0);
+ const id = this.parseIdentifier();
+ id.typeAnnotation = this.tsParseTypeAnnotation();
+ this.resetEndLocation(id);
+ this.expect(3);
+ node.parameters = [id];
+ const type = this.tsTryParseTypeAnnotation();
+ if (type) node.typeAnnotation = type;
+ this.tsParseTypeMemberSemicolon();
+ return this.finishNode(node, "TSIndexSignature");
+ }
+ tsParsePropertyOrMethodSignature(node, readonly) {
+ if (this.eat(17)) node.optional = true;
+ const nodeAny = node;
+ if (this.match(10) || this.match(47)) {
+ if (readonly) {
+ this.raise(TSErrors.ReadonlyForMethodSignature, {
+ at: node
+ });
+ }
+ const method = nodeAny;
+ if (method.kind && this.match(47)) {
+ this.raise(TSErrors.AccesorCannotHaveTypeParameters, {
+ at: this.state.curPosition()
+ });
+ }
+ this.tsFillSignature(14, method);
+ this.tsParseTypeMemberSemicolon();
+ const paramsKey = "parameters";
+ const returnTypeKey = "typeAnnotation";
+ if (method.kind === "get") {
+ if (method[paramsKey].length > 0) {
+ this.raise(Errors.BadGetterArity, {
+ at: this.state.curPosition()
+ });
+ if (this.isThisParam(method[paramsKey][0])) {
+ this.raise(TSErrors.AccesorCannotDeclareThisParameter, {
+ at: this.state.curPosition()
+ });
+ }
+ }
+ } else if (method.kind === "set") {
+ if (method[paramsKey].length !== 1) {
+ this.raise(Errors.BadSetterArity, {
+ at: this.state.curPosition()
+ });
+ } else {
+ const firstParameter = method[paramsKey][0];
+ if (this.isThisParam(firstParameter)) {
+ this.raise(TSErrors.AccesorCannotDeclareThisParameter, {
+ at: this.state.curPosition()
+ });
+ }
+ if (firstParameter.type === "Identifier" && firstParameter.optional) {
+ this.raise(TSErrors.SetAccesorCannotHaveOptionalParameter, {
+ at: this.state.curPosition()
+ });
+ }
+ if (firstParameter.type === "RestElement") {
+ this.raise(TSErrors.SetAccesorCannotHaveRestParameter, {
+ at: this.state.curPosition()
+ });
+ }
+ }
+ if (method[returnTypeKey]) {
+ this.raise(TSErrors.SetAccesorCannotHaveReturnType, {
+ at: method[returnTypeKey]
+ });
+ }
+ } else {
+ method.kind = "method";
+ }
+ return this.finishNode(method, "TSMethodSignature");
+ } else {
+ const property = nodeAny;
+ if (readonly) property.readonly = true;
+ const type = this.tsTryParseTypeAnnotation();
+ if (type) property.typeAnnotation = type;
+ this.tsParseTypeMemberSemicolon();
+ return this.finishNode(property, "TSPropertySignature");
+ }
+ }
+ tsParseTypeMember() {
+ const node = this.startNode();
+ if (this.match(10) || this.match(47)) {
+ return this.tsParseSignatureMember("TSCallSignatureDeclaration", node);
+ }
+ if (this.match(77)) {
+ const id = this.startNode();
+ this.next();
+ if (this.match(10) || this.match(47)) {
+ return this.tsParseSignatureMember("TSConstructSignatureDeclaration", node);
+ } else {
+ node.key = this.createIdentifier(id, "new");
+ return this.tsParsePropertyOrMethodSignature(node, false);
+ }
+ }
+ this.tsParseModifiers({
+ allowedModifiers: ["readonly"],
+ disallowedModifiers: ["declare", "abstract", "private", "protected", "public", "static", "override"]
+ }, node);
+ const idx = this.tsTryParseIndexSignature(node);
+ if (idx) {
+ return idx;
+ }
+ super.parsePropertyName(node);
+ if (!node.computed && node.key.type === "Identifier" && (node.key.name === "get" || node.key.name === "set") && this.tsTokenCanFollowModifier()) {
+ node.kind = node.key.name;
+ super.parsePropertyName(node);
+ }
+ return this.tsParsePropertyOrMethodSignature(node, !!node.readonly);
+ }
+ tsParseTypeLiteral() {
+ const node = this.startNode();
+ node.members = this.tsParseObjectTypeMembers();
+ return this.finishNode(node, "TSTypeLiteral");
+ }
+ tsParseObjectTypeMembers() {
+ this.expect(5);
+ const members = this.tsParseList("TypeMembers", this.tsParseTypeMember.bind(this));
+ this.expect(8);
+ return members;
+ }
+ tsIsStartOfMappedType() {
+ this.next();
+ if (this.eat(53)) {
+ return this.isContextual(122);
+ }
+ if (this.isContextual(122)) {
+ this.next();
+ }
+ if (!this.match(0)) {
+ return false;
+ }
+ this.next();
+ if (!this.tsIsIdentifier()) {
+ return false;
+ }
+ this.next();
+ return this.match(58);
+ }
+ tsParseMappedTypeParameter() {
+ const node = this.startNode();
+ node.name = this.tsParseTypeParameterName();
+ node.constraint = this.tsExpectThenParseType(58);
+ return this.finishNode(node, "TSTypeParameter");
+ }
+ tsParseMappedType() {
+ const node = this.startNode();
+ this.expect(5);
+ if (this.match(53)) {
+ node.readonly = this.state.value;
+ this.next();
+ this.expectContextual(122);
+ } else if (this.eatContextual(122)) {
+ node.readonly = true;
+ }
+ this.expect(0);
+ node.typeParameter = this.tsParseMappedTypeParameter();
+ node.nameType = this.eatContextual(93) ? this.tsParseType() : null;
+ this.expect(3);
+ if (this.match(53)) {
+ node.optional = this.state.value;
+ this.next();
+ this.expect(17);
+ } else if (this.eat(17)) {
+ node.optional = true;
+ }
+ node.typeAnnotation = this.tsTryParseType();
+ this.semicolon();
+ this.expect(8);
+ return this.finishNode(node, "TSMappedType");
+ }
+ tsParseTupleType() {
+ const node = this.startNode();
+ node.elementTypes = this.tsParseBracketedList("TupleElementTypes", this.tsParseTupleElementType.bind(this), true, false);
+ let seenOptionalElement = false;
+ node.elementTypes.forEach(elementNode => {
+ const {
+ type
+ } = elementNode;
+ if (seenOptionalElement && type !== "TSRestType" && type !== "TSOptionalType" && !(type === "TSNamedTupleMember" && elementNode.optional)) {
+ this.raise(TSErrors.OptionalTypeBeforeRequired, {
+ at: elementNode
+ });
+ }
+ seenOptionalElement || (seenOptionalElement = type === "TSNamedTupleMember" && elementNode.optional || type === "TSOptionalType");
+ });
+ return this.finishNode(node, "TSTupleType");
+ }
+ tsParseTupleElementType() {
+ const {
+ startLoc
+ } = this.state;
+ const rest = this.eat(21);
+ let labeled;
+ let label;
+ let optional;
+ let type;
+ const isWord = tokenIsKeywordOrIdentifier(this.state.type);
+ const chAfterWord = isWord ? this.lookaheadCharCode() : null;
+ if (chAfterWord === 58) {
+ labeled = true;
+ optional = false;
+ label = this.parseIdentifier(true);
+ this.expect(14);
+ type = this.tsParseType();
+ } else if (chAfterWord === 63) {
+ optional = true;
+ const startLoc = this.state.startLoc;
+ const wordName = this.state.value;
+ const typeOrLabel = this.tsParseNonArrayType();
+ if (this.lookaheadCharCode() === 58) {
+ labeled = true;
+ label = this.createIdentifier(this.startNodeAt(startLoc), wordName);
+ this.expect(17);
+ this.expect(14);
+ type = this.tsParseType();
+ } else {
+ labeled = false;
+ type = typeOrLabel;
+ this.expect(17);
+ }
+ } else {
+ type = this.tsParseType();
+ optional = this.eat(17);
+ labeled = this.eat(14);
+ }
+ if (labeled) {
+ let labeledNode;
+ if (label) {
+ labeledNode = this.startNodeAtNode(label);
+ labeledNode.optional = optional;
+ labeledNode.label = label;
+ labeledNode.elementType = type;
+ if (this.eat(17)) {
+ labeledNode.optional = true;
+ this.raise(TSErrors.TupleOptionalAfterType, {
+ at: this.state.lastTokStartLoc
+ });
+ }
+ } else {
+ labeledNode = this.startNodeAtNode(type);
+ labeledNode.optional = optional;
+ this.raise(TSErrors.InvalidTupleMemberLabel, {
+ at: type
+ });
+ labeledNode.label = type;
+ labeledNode.elementType = this.tsParseType();
+ }
+ type = this.finishNode(labeledNode, "TSNamedTupleMember");
+ } else if (optional) {
+ const optionalTypeNode = this.startNodeAtNode(type);
+ optionalTypeNode.typeAnnotation = type;
+ type = this.finishNode(optionalTypeNode, "TSOptionalType");
+ }
+ if (rest) {
+ const restNode = this.startNodeAt(startLoc);
+ restNode.typeAnnotation = type;
+ type = this.finishNode(restNode, "TSRestType");
+ }
+ return type;
+ }
+ tsParseParenthesizedType() {
+ const node = this.startNode();
+ this.expect(10);
+ node.typeAnnotation = this.tsParseType();
+ this.expect(11);
+ return this.finishNode(node, "TSParenthesizedType");
+ }
+ tsParseFunctionOrConstructorType(type, abstract) {
+ const node = this.startNode();
+ if (type === "TSConstructorType") {
+ node.abstract = !!abstract;
+ if (abstract) this.next();
+ this.next();
+ }
+ this.tsInAllowConditionalTypesContext(() => this.tsFillSignature(19, node));
+ return this.finishNode(node, type);
+ }
+ tsParseLiteralTypeNode() {
+ const node = this.startNode();
+ switch (this.state.type) {
+ case 134:
+ case 135:
+ case 133:
+ case 85:
+ case 86:
+ node.literal = super.parseExprAtom();
+ break;
+ default:
+ this.unexpected();
+ }
+ return this.finishNode(node, "TSLiteralType");
+ }
+ tsParseTemplateLiteralType() {
+ const node = this.startNode();
+ node.literal = super.parseTemplate(false);
+ return this.finishNode(node, "TSLiteralType");
+ }
+ parseTemplateSubstitution() {
+ if (this.state.inType) return this.tsParseType();
+ return super.parseTemplateSubstitution();
+ }
+ tsParseThisTypeOrThisTypePredicate() {
+ const thisKeyword = this.tsParseThisTypeNode();
+ if (this.isContextual(116) && !this.hasPrecedingLineBreak()) {
+ return this.tsParseThisTypePredicate(thisKeyword);
+ } else {
+ return thisKeyword;
+ }
+ }
+ tsParseNonArrayType() {
+ switch (this.state.type) {
+ case 133:
+ case 134:
+ case 135:
+ case 85:
+ case 86:
+ return this.tsParseLiteralTypeNode();
+ case 53:
+ if (this.state.value === "-") {
+ const node = this.startNode();
+ const nextToken = this.lookahead();
+ if (nextToken.type !== 134 && nextToken.type !== 135) {
+ this.unexpected();
+ }
+ node.literal = this.parseMaybeUnary();
+ return this.finishNode(node, "TSLiteralType");
+ }
+ break;
+ case 78:
+ return this.tsParseThisTypeOrThisTypePredicate();
+ case 87:
+ return this.tsParseTypeQuery();
+ case 83:
+ return this.tsParseImportType();
+ case 5:
+ return this.tsLookAhead(this.tsIsStartOfMappedType.bind(this)) ? this.tsParseMappedType() : this.tsParseTypeLiteral();
+ case 0:
+ return this.tsParseTupleType();
+ case 10:
+ return this.tsParseParenthesizedType();
+ case 25:
+ case 24:
+ return this.tsParseTemplateLiteralType();
+ default:
+ {
+ const {
+ type
+ } = this.state;
+ if (tokenIsIdentifier(type) || type === 88 || type === 84) {
+ const nodeType = type === 88 ? "TSVoidKeyword" : type === 84 ? "TSNullKeyword" : keywordTypeFromName(this.state.value);
+ if (nodeType !== undefined && this.lookaheadCharCode() !== 46) {
+ const node = this.startNode();
+ this.next();
+ return this.finishNode(node, nodeType);
+ }
+ return this.tsParseTypeReference();
+ }
+ }
+ }
+ this.unexpected();
+ }
+ tsParseArrayTypeOrHigher() {
+ let type = this.tsParseNonArrayType();
+ while (!this.hasPrecedingLineBreak() && this.eat(0)) {
+ if (this.match(3)) {
+ const node = this.startNodeAtNode(type);
+ node.elementType = type;
+ this.expect(3);
+ type = this.finishNode(node, "TSArrayType");
+ } else {
+ const node = this.startNodeAtNode(type);
+ node.objectType = type;
+ node.indexType = this.tsParseType();
+ this.expect(3);
+ type = this.finishNode(node, "TSIndexedAccessType");
+ }
+ }
+ return type;
+ }
+ tsParseTypeOperator() {
+ const node = this.startNode();
+ const operator = this.state.value;
+ this.next();
+ node.operator = operator;
+ node.typeAnnotation = this.tsParseTypeOperatorOrHigher();
+ if (operator === "readonly") {
+ this.tsCheckTypeAnnotationForReadOnly(node);
+ }
+ return this.finishNode(node, "TSTypeOperator");
+ }
+ tsCheckTypeAnnotationForReadOnly(node) {
+ switch (node.typeAnnotation.type) {
+ case "TSTupleType":
+ case "TSArrayType":
+ return;
+ default:
+ this.raise(TSErrors.UnexpectedReadonly, {
+ at: node
+ });
+ }
+ }
+ tsParseInferType() {
+ const node = this.startNode();
+ this.expectContextual(115);
+ const typeParameter = this.startNode();
+ typeParameter.name = this.tsParseTypeParameterName();
+ typeParameter.constraint = this.tsTryParse(() => this.tsParseConstraintForInferType());
+ node.typeParameter = this.finishNode(typeParameter, "TSTypeParameter");
+ return this.finishNode(node, "TSInferType");
+ }
+ tsParseConstraintForInferType() {
+ if (this.eat(81)) {
+ const constraint = this.tsInDisallowConditionalTypesContext(() => this.tsParseType());
+ if (this.state.inDisallowConditionalTypesContext || !this.match(17)) {
+ return constraint;
+ }
+ }
+ }
+ tsParseTypeOperatorOrHigher() {
+ const isTypeOperator = tokenIsTSTypeOperator(this.state.type) && !this.state.containsEsc;
+ return isTypeOperator ? this.tsParseTypeOperator() : this.isContextual(115) ? this.tsParseInferType() : this.tsInAllowConditionalTypesContext(() => this.tsParseArrayTypeOrHigher());
+ }
+ tsParseUnionOrIntersectionType(kind, parseConstituentType, operator) {
+ const node = this.startNode();
+ const hasLeadingOperator = this.eat(operator);
+ const types = [];
+ do {
+ types.push(parseConstituentType());
+ } while (this.eat(operator));
+ if (types.length === 1 && !hasLeadingOperator) {
+ return types[0];
+ }
+ node.types = types;
+ return this.finishNode(node, kind);
+ }
+ tsParseIntersectionTypeOrHigher() {
+ return this.tsParseUnionOrIntersectionType("TSIntersectionType", this.tsParseTypeOperatorOrHigher.bind(this), 45);
+ }
+ tsParseUnionTypeOrHigher() {
+ return this.tsParseUnionOrIntersectionType("TSUnionType", this.tsParseIntersectionTypeOrHigher.bind(this), 43);
+ }
+ tsIsStartOfFunctionType() {
+ if (this.match(47)) {
+ return true;
+ }
+ return this.match(10) && this.tsLookAhead(this.tsIsUnambiguouslyStartOfFunctionType.bind(this));
+ }
+ tsSkipParameterStart() {
+ if (tokenIsIdentifier(this.state.type) || this.match(78)) {
+ this.next();
+ return true;
+ }
+ if (this.match(5)) {
+ const {
+ errors
+ } = this.state;
+ const previousErrorCount = errors.length;
+ try {
+ this.parseObjectLike(8, true);
+ return errors.length === previousErrorCount;
+ } catch (_unused) {
+ return false;
+ }
+ }
+ if (this.match(0)) {
+ this.next();
+ const {
+ errors
+ } = this.state;
+ const previousErrorCount = errors.length;
+ try {
+ super.parseBindingList(3, 93, 1);
+ return errors.length === previousErrorCount;
+ } catch (_unused2) {
+ return false;
+ }
+ }
+ return false;
+ }
+ tsIsUnambiguouslyStartOfFunctionType() {
+ this.next();
+ if (this.match(11) || this.match(21)) {
+ return true;
+ }
+ if (this.tsSkipParameterStart()) {
+ if (this.match(14) || this.match(12) || this.match(17) || this.match(29)) {
+ return true;
+ }
+ if (this.match(11)) {
+ this.next();
+ if (this.match(19)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+ tsParseTypeOrTypePredicateAnnotation(returnToken) {
+ return this.tsInType(() => {
+ const t = this.startNode();
+ this.expect(returnToken);
+ const node = this.startNode();
+ const asserts = !!this.tsTryParse(this.tsParseTypePredicateAsserts.bind(this));
+ if (asserts && this.match(78)) {
+ let thisTypePredicate = this.tsParseThisTypeOrThisTypePredicate();
+ if (thisTypePredicate.type === "TSThisType") {
+ node.parameterName = thisTypePredicate;
+ node.asserts = true;
+ node.typeAnnotation = null;
+ thisTypePredicate = this.finishNode(node, "TSTypePredicate");
+ } else {
+ this.resetStartLocationFromNode(thisTypePredicate, node);
+ thisTypePredicate.asserts = true;
+ }
+ t.typeAnnotation = thisTypePredicate;
+ return this.finishNode(t, "TSTypeAnnotation");
+ }
+ const typePredicateVariable = this.tsIsIdentifier() && this.tsTryParse(this.tsParseTypePredicatePrefix.bind(this));
+ if (!typePredicateVariable) {
+ if (!asserts) {
+ return this.tsParseTypeAnnotation(false, t);
+ }
+ node.parameterName = this.parseIdentifier();
+ node.asserts = asserts;
+ node.typeAnnotation = null;
+ t.typeAnnotation = this.finishNode(node, "TSTypePredicate");
+ return this.finishNode(t, "TSTypeAnnotation");
+ }
+ const type = this.tsParseTypeAnnotation(false);
+ node.parameterName = typePredicateVariable;
+ node.typeAnnotation = type;
+ node.asserts = asserts;
+ t.typeAnnotation = this.finishNode(node, "TSTypePredicate");
+ return this.finishNode(t, "TSTypeAnnotation");
+ });
+ }
+ tsTryParseTypeOrTypePredicateAnnotation() {
+ if (this.match(14)) {
+ return this.tsParseTypeOrTypePredicateAnnotation(14);
+ }
+ }
+ tsTryParseTypeAnnotation() {
+ if (this.match(14)) {
+ return this.tsParseTypeAnnotation();
+ }
+ }
+ tsTryParseType() {
+ return this.tsEatThenParseType(14);
+ }
+ tsParseTypePredicatePrefix() {
+ const id = this.parseIdentifier();
+ if (this.isContextual(116) && !this.hasPrecedingLineBreak()) {
+ this.next();
+ return id;
+ }
+ }
+ tsParseTypePredicateAsserts() {
+ if (this.state.type !== 109) {
+ return false;
+ }
+ const containsEsc = this.state.containsEsc;
+ this.next();
+ if (!tokenIsIdentifier(this.state.type) && !this.match(78)) {
+ return false;
+ }
+ if (containsEsc) {
+ this.raise(Errors.InvalidEscapedReservedWord, {
+ at: this.state.lastTokStartLoc,
+ reservedWord: "asserts"
+ });
+ }
+ return true;
+ }
+ tsParseTypeAnnotation(eatColon = true, t = this.startNode()) {
+ this.tsInType(() => {
+ if (eatColon) this.expect(14);
+ t.typeAnnotation = this.tsParseType();
+ });
+ return this.finishNode(t, "TSTypeAnnotation");
+ }
+ tsParseType() {
+ assert(this.state.inType);
+ const type = this.tsParseNonConditionalType();
+ if (this.state.inDisallowConditionalTypesContext || this.hasPrecedingLineBreak() || !this.eat(81)) {
+ return type;
+ }
+ const node = this.startNodeAtNode(type);
+ node.checkType = type;
+ node.extendsType = this.tsInDisallowConditionalTypesContext(() => this.tsParseNonConditionalType());
+ this.expect(17);
+ node.trueType = this.tsInAllowConditionalTypesContext(() => this.tsParseType());
+ this.expect(14);
+ node.falseType = this.tsInAllowConditionalTypesContext(() => this.tsParseType());
+ return this.finishNode(node, "TSConditionalType");
+ }
+ isAbstractConstructorSignature() {
+ return this.isContextual(124) && this.lookahead().type === 77;
+ }
+ tsParseNonConditionalType() {
+ if (this.tsIsStartOfFunctionType()) {
+ return this.tsParseFunctionOrConstructorType("TSFunctionType");
+ }
+ if (this.match(77)) {
+ return this.tsParseFunctionOrConstructorType("TSConstructorType");
+ } else if (this.isAbstractConstructorSignature()) {
+ return this.tsParseFunctionOrConstructorType("TSConstructorType", true);
+ }
+ return this.tsParseUnionTypeOrHigher();
+ }
+ tsParseTypeAssertion() {
+ if (this.getPluginOption("typescript", "disallowAmbiguousJSXLike")) {
+ this.raise(TSErrors.ReservedTypeAssertion, {
+ at: this.state.startLoc
+ });
+ }
+ const node = this.startNode();
+ node.typeAnnotation = this.tsInType(() => {
+ this.next();
+ return this.match(75) ? this.tsParseTypeReference() : this.tsParseType();
+ });
+ this.expect(48);
+ node.expression = this.parseMaybeUnary();
+ return this.finishNode(node, "TSTypeAssertion");
+ }
+ tsParseHeritageClause(token) {
+ const originalStartLoc = this.state.startLoc;
+ const delimitedList = this.tsParseDelimitedList("HeritageClauseElement", () => {
+ const node = this.startNode();
+ node.expression = this.tsParseEntityName();
+ if (this.match(47)) {
+ node.typeParameters = this.tsParseTypeArguments();
+ }
+ return this.finishNode(node, "TSExpressionWithTypeArguments");
+ });
+ if (!delimitedList.length) {
+ this.raise(TSErrors.EmptyHeritageClauseType, {
+ at: originalStartLoc,
+ token
+ });
+ }
+ return delimitedList;
+ }
+ tsParseInterfaceDeclaration(node, properties = {}) {
+ if (this.hasFollowingLineBreak()) return null;
+ this.expectContextual(129);
+ if (properties.declare) node.declare = true;
+ if (tokenIsIdentifier(this.state.type)) {
+ node.id = this.parseIdentifier();
+ this.checkIdentifier(node.id, 130);
+ } else {
+ node.id = null;
+ this.raise(TSErrors.MissingInterfaceName, {
+ at: this.state.startLoc
+ });
+ }
+ node.typeParameters = this.tsTryParseTypeParameters(this.tsParseInOutConstModifiers);
+ if (this.eat(81)) {
+ node.extends = this.tsParseHeritageClause("extends");
+ }
+ const body = this.startNode();
+ body.body = this.tsInType(this.tsParseObjectTypeMembers.bind(this));
+ node.body = this.finishNode(body, "TSInterfaceBody");
+ return this.finishNode(node, "TSInterfaceDeclaration");
+ }
+ tsParseTypeAliasDeclaration(node) {
+ node.id = this.parseIdentifier();
+ this.checkIdentifier(node.id, 2);
+ node.typeAnnotation = this.tsInType(() => {
+ node.typeParameters = this.tsTryParseTypeParameters(this.tsParseInOutModifiers);
+ this.expect(29);
+ if (this.isContextual(114) && this.lookahead().type !== 16) {
+ const node = this.startNode();
+ this.next();
+ return this.finishNode(node, "TSIntrinsicKeyword");
+ }
+ return this.tsParseType();
+ });
+ this.semicolon();
+ return this.finishNode(node, "TSTypeAliasDeclaration");
+ }
+ tsInNoContext(cb) {
+ const oldContext = this.state.context;
+ this.state.context = [oldContext[0]];
+ try {
+ return cb();
+ } finally {
+ this.state.context = oldContext;
+ }
+ }
+ tsInType(cb) {
+ const oldInType = this.state.inType;
+ this.state.inType = true;
+ try {
+ return cb();
+ } finally {
+ this.state.inType = oldInType;
+ }
+ }
+ tsInDisallowConditionalTypesContext(cb) {
+ const oldInDisallowConditionalTypesContext = this.state.inDisallowConditionalTypesContext;
+ this.state.inDisallowConditionalTypesContext = true;
+ try {
+ return cb();
+ } finally {
+ this.state.inDisallowConditionalTypesContext = oldInDisallowConditionalTypesContext;
+ }
+ }
+ tsInAllowConditionalTypesContext(cb) {
+ const oldInDisallowConditionalTypesContext = this.state.inDisallowConditionalTypesContext;
+ this.state.inDisallowConditionalTypesContext = false;
+ try {
+ return cb();
+ } finally {
+ this.state.inDisallowConditionalTypesContext = oldInDisallowConditionalTypesContext;
+ }
+ }
+ tsEatThenParseType(token) {
+ if (this.match(token)) {
+ return this.tsNextThenParseType();
+ }
+ }
+ tsExpectThenParseType(token) {
+ return this.tsInType(() => {
+ this.expect(token);
+ return this.tsParseType();
+ });
+ }
+ tsNextThenParseType() {
+ return this.tsInType(() => {
+ this.next();
+ return this.tsParseType();
+ });
+ }
+ tsParseEnumMember() {
+ const node = this.startNode();
+ node.id = this.match(133) ? super.parseStringLiteral(this.state.value) : this.parseIdentifier(true);
+ if (this.eat(29)) {
+ node.initializer = super.parseMaybeAssignAllowIn();
+ }
+ return this.finishNode(node, "TSEnumMember");
+ }
+ tsParseEnumDeclaration(node, properties = {}) {
+ if (properties.const) node.const = true;
+ if (properties.declare) node.declare = true;
+ this.expectContextual(126);
+ node.id = this.parseIdentifier();
+ this.checkIdentifier(node.id, node.const ? 8971 : 8459);
+ this.expect(5);
+ node.members = this.tsParseDelimitedList("EnumMembers", this.tsParseEnumMember.bind(this));
+ this.expect(8);
+ return this.finishNode(node, "TSEnumDeclaration");
+ }
+ tsParseModuleBlock() {
+ const node = this.startNode();
+ this.scope.enter(0);
+ this.expect(5);
+ super.parseBlockOrModuleBlockBody(node.body = [], undefined, true, 8);
+ this.scope.exit();
+ return this.finishNode(node, "TSModuleBlock");
+ }
+ tsParseModuleOrNamespaceDeclaration(node, nested = false) {
+ node.id = this.parseIdentifier();
+ if (!nested) {
+ this.checkIdentifier(node.id, 1024);
+ }
+ if (this.eat(16)) {
+ const inner = this.startNode();
+ this.tsParseModuleOrNamespaceDeclaration(inner, true);
+ node.body = inner;
+ } else {
+ this.scope.enter(256);
+ this.prodParam.enter(PARAM);
+ node.body = this.tsParseModuleBlock();
+ this.prodParam.exit();
+ this.scope.exit();
+ }
+ return this.finishNode(node, "TSModuleDeclaration");
+ }
+ tsParseAmbientExternalModuleDeclaration(node) {
+ if (this.isContextual(112)) {
+ node.global = true;
+ node.id = this.parseIdentifier();
+ } else if (this.match(133)) {
+ node.id = super.parseStringLiteral(this.state.value);
+ } else {
+ this.unexpected();
+ }
+ if (this.match(5)) {
+ this.scope.enter(256);
+ this.prodParam.enter(PARAM);
+ node.body = this.tsParseModuleBlock();
+ this.prodParam.exit();
+ this.scope.exit();
+ } else {
+ this.semicolon();
+ }
+ return this.finishNode(node, "TSModuleDeclaration");
+ }
+ tsParseImportEqualsDeclaration(node, maybeDefaultIdentifier, isExport) {
+ node.isExport = isExport || false;
+ node.id = maybeDefaultIdentifier || this.parseIdentifier();
+ this.checkIdentifier(node.id, 4096);
+ this.expect(29);
+ const moduleReference = this.tsParseModuleReference();
+ if (node.importKind === "type" && moduleReference.type !== "TSExternalModuleReference") {
+ this.raise(TSErrors.ImportAliasHasImportType, {
+ at: moduleReference
+ });
+ }
+ node.moduleReference = moduleReference;
+ this.semicolon();
+ return this.finishNode(node, "TSImportEqualsDeclaration");
+ }
+ tsIsExternalModuleReference() {
+ return this.isContextual(119) && this.lookaheadCharCode() === 40;
+ }
+ tsParseModuleReference() {
+ return this.tsIsExternalModuleReference() ? this.tsParseExternalModuleReference() : this.tsParseEntityName(false);
+ }
+ tsParseExternalModuleReference() {
+ const node = this.startNode();
+ this.expectContextual(119);
+ this.expect(10);
+ if (!this.match(133)) {
+ this.unexpected();
+ }
+ node.expression = super.parseExprAtom();
+ this.expect(11);
+ this.sawUnambiguousESM = true;
+ return this.finishNode(node, "TSExternalModuleReference");
+ }
+ tsLookAhead(f) {
+ const state = this.state.clone();
+ const res = f();
+ this.state = state;
+ return res;
+ }
+ tsTryParseAndCatch(f) {
+ const result = this.tryParse(abort => f() || abort());
+ if (result.aborted || !result.node) return;
+ if (result.error) this.state = result.failState;
+ return result.node;
+ }
+ tsTryParse(f) {
+ const state = this.state.clone();
+ const result = f();
+ if (result !== undefined && result !== false) {
+ return result;
+ }
+ this.state = state;
+ }
+ tsTryParseDeclare(nany) {
+ if (this.isLineTerminator()) {
+ return;
+ }
+ let startType = this.state.type;
+ let kind;
+ if (this.isContextual(100)) {
+ startType = 74;
+ kind = "let";
+ }
+ return this.tsInAmbientContext(() => {
+ switch (startType) {
+ case 68:
+ nany.declare = true;
+ return super.parseFunctionStatement(nany, false, false);
+ case 80:
+ nany.declare = true;
+ return this.parseClass(nany, true, false);
+ case 126:
+ return this.tsParseEnumDeclaration(nany, {
+ declare: true
+ });
+ case 112:
+ return this.tsParseAmbientExternalModuleDeclaration(nany);
+ case 75:
+ case 74:
+ if (!this.match(75) || !this.isLookaheadContextual("enum")) {
+ nany.declare = true;
+ return this.parseVarStatement(nany, kind || this.state.value, true);
+ }
+ this.expect(75);
+ return this.tsParseEnumDeclaration(nany, {
+ const: true,
+ declare: true
+ });
+ case 129:
+ {
+ const result = this.tsParseInterfaceDeclaration(nany, {
+ declare: true
+ });
+ if (result) return result;
+ }
+ default:
+ if (tokenIsIdentifier(startType)) {
+ return this.tsParseDeclaration(nany, this.state.value, true, null);
+ }
+ }
+ });
+ }
+ tsTryParseExportDeclaration() {
+ return this.tsParseDeclaration(this.startNode(), this.state.value, true, null);
+ }
+ tsParseExpressionStatement(node, expr, decorators) {
+ switch (expr.name) {
+ case "declare":
+ {
+ const declaration = this.tsTryParseDeclare(node);
+ if (declaration) {
+ declaration.declare = true;
+ }
+ return declaration;
+ }
+ case "global":
+ if (this.match(5)) {
+ this.scope.enter(256);
+ this.prodParam.enter(PARAM);
+ const mod = node;
+ mod.global = true;
+ mod.id = expr;
+ mod.body = this.tsParseModuleBlock();
+ this.scope.exit();
+ this.prodParam.exit();
+ return this.finishNode(mod, "TSModuleDeclaration");
+ }
+ break;
+ default:
+ return this.tsParseDeclaration(node, expr.name, false, decorators);
+ }
+ }
+ tsParseDeclaration(node, value, next, decorators) {
+ switch (value) {
+ case "abstract":
+ if (this.tsCheckLineTerminator(next) && (this.match(80) || tokenIsIdentifier(this.state.type))) {
+ return this.tsParseAbstractDeclaration(node, decorators);
+ }
+ break;
+ case "module":
+ if (this.tsCheckLineTerminator(next)) {
+ if (this.match(133)) {
+ return this.tsParseAmbientExternalModuleDeclaration(node);
+ } else if (tokenIsIdentifier(this.state.type)) {
+ return this.tsParseModuleOrNamespaceDeclaration(node);
+ }
+ }
+ break;
+ case "namespace":
+ if (this.tsCheckLineTerminator(next) && tokenIsIdentifier(this.state.type)) {
+ return this.tsParseModuleOrNamespaceDeclaration(node);
+ }
+ break;
+ case "type":
+ if (this.tsCheckLineTerminator(next) && tokenIsIdentifier(this.state.type)) {
+ return this.tsParseTypeAliasDeclaration(node);
+ }
+ break;
+ }
+ }
+ tsCheckLineTerminator(next) {
+ if (next) {
+ if (this.hasFollowingLineBreak()) return false;
+ this.next();
+ return true;
+ }
+ return !this.isLineTerminator();
+ }
+ tsTryParseGenericAsyncArrowFunction(startLoc) {
+ if (!this.match(47)) return;
+ const oldMaybeInArrowParameters = this.state.maybeInArrowParameters;
+ this.state.maybeInArrowParameters = true;
+ const res = this.tsTryParseAndCatch(() => {
+ const node = this.startNodeAt(startLoc);
+ node.typeParameters = this.tsParseTypeParameters(this.tsParseConstModifier);
+ super.parseFunctionParams(node);
+ node.returnType = this.tsTryParseTypeOrTypePredicateAnnotation();
+ this.expect(19);
+ return node;
+ });
+ this.state.maybeInArrowParameters = oldMaybeInArrowParameters;
+ if (!res) return;
+ return super.parseArrowExpression(res, null, true);
+ }
+ tsParseTypeArgumentsInExpression() {
+ if (this.reScan_lt() !== 47) return;
+ return this.tsParseTypeArguments();
+ }
+ tsParseTypeArguments() {
+ const node = this.startNode();
+ node.params = this.tsInType(() => this.tsInNoContext(() => {
+ this.expect(47);
+ return this.tsParseDelimitedList("TypeParametersOrArguments", this.tsParseType.bind(this));
+ }));
+ if (node.params.length === 0) {
+ this.raise(TSErrors.EmptyTypeArguments, {
+ at: node
+ });
+ } else if (!this.state.inType && this.curContext() === types.brace) {
+ this.reScan_lt_gt();
+ }
+ this.expect(48);
+ return this.finishNode(node, "TSTypeParameterInstantiation");
+ }
+ tsIsDeclarationStart() {
+ return tokenIsTSDeclarationStart(this.state.type);
+ }
+ isExportDefaultSpecifier() {
+ if (this.tsIsDeclarationStart()) return false;
+ return super.isExportDefaultSpecifier();
+ }
+ parseAssignableListItem(flags, decorators) {
+ const startLoc = this.state.startLoc;
+ const modified = {};
+ this.tsParseModifiers({
+ allowedModifiers: ["public", "private", "protected", "override", "readonly"]
+ }, modified);
+ const accessibility = modified.accessibility;
+ const override = modified.override;
+ const readonly = modified.readonly;
+ if (!(flags & 4) && (accessibility || readonly || override)) {
+ this.raise(TSErrors.UnexpectedParameterModifier, {
+ at: startLoc
+ });
+ }
+ const left = this.parseMaybeDefault();
+ this.parseAssignableListItemTypes(left, flags);
+ const elt = this.parseMaybeDefault(left.loc.start, left);
+ if (accessibility || readonly || override) {
+ const pp = this.startNodeAt(startLoc);
+ if (decorators.length) {
+ pp.decorators = decorators;
+ }
+ if (accessibility) pp.accessibility = accessibility;
+ if (readonly) pp.readonly = readonly;
+ if (override) pp.override = override;
+ if (elt.type !== "Identifier" && elt.type !== "AssignmentPattern") {
+ this.raise(TSErrors.UnsupportedParameterPropertyKind, {
+ at: pp
+ });
+ }
+ pp.parameter = elt;
+ return this.finishNode(pp, "TSParameterProperty");
+ }
+ if (decorators.length) {
+ left.decorators = decorators;
+ }
+ return elt;
+ }
+ isSimpleParameter(node) {
+ return node.type === "TSParameterProperty" && super.isSimpleParameter(node.parameter) || super.isSimpleParameter(node);
+ }
+ tsDisallowOptionalPattern(node) {
+ for (const param of node.params) {
+ if (param.type !== "Identifier" && param.optional && !this.state.isAmbientContext) {
+ this.raise(TSErrors.PatternIsOptional, {
+ at: param
+ });
+ }
+ }
+ }
+ setArrowFunctionParameters(node, params, trailingCommaLoc) {
+ super.setArrowFunctionParameters(node, params, trailingCommaLoc);
+ this.tsDisallowOptionalPattern(node);
+ }
+ parseFunctionBodyAndFinish(node, type, isMethod = false) {
+ if (this.match(14)) {
+ node.returnType = this.tsParseTypeOrTypePredicateAnnotation(14);
+ }
+ const bodilessType = type === "FunctionDeclaration" ? "TSDeclareFunction" : type === "ClassMethod" || type === "ClassPrivateMethod" ? "TSDeclareMethod" : undefined;
+ if (bodilessType && !this.match(5) && this.isLineTerminator()) {
+ return this.finishNode(node, bodilessType);
+ }
+ if (bodilessType === "TSDeclareFunction" && this.state.isAmbientContext) {
+ this.raise(TSErrors.DeclareFunctionHasImplementation, {
+ at: node
+ });
+ if (node.declare) {
+ return super.parseFunctionBodyAndFinish(node, bodilessType, isMethod);
+ }
+ }
+ this.tsDisallowOptionalPattern(node);
+ return super.parseFunctionBodyAndFinish(node, type, isMethod);
+ }
+ registerFunctionStatementId(node) {
+ if (!node.body && node.id) {
+ this.checkIdentifier(node.id, 1024);
+ } else {
+ super.registerFunctionStatementId(node);
+ }
+ }
+ tsCheckForInvalidTypeCasts(items) {
+ items.forEach(node => {
+ if ((node == null ? void 0 : node.type) === "TSTypeCastExpression") {
+ this.raise(TSErrors.UnexpectedTypeAnnotation, {
+ at: node.typeAnnotation
+ });
+ }
+ });
+ }
+ toReferencedList(exprList, isInParens) {
+ this.tsCheckForInvalidTypeCasts(exprList);
+ return exprList;
+ }
+ parseArrayLike(close, canBePattern, isTuple, refExpressionErrors) {
+ const node = super.parseArrayLike(close, canBePattern, isTuple, refExpressionErrors);
+ if (node.type === "ArrayExpression") {
+ this.tsCheckForInvalidTypeCasts(node.elements);
+ }
+ return node;
+ }
+ parseSubscript(base, startLoc, noCalls, state) {
+ if (!this.hasPrecedingLineBreak() && this.match(35)) {
+ this.state.canStartJSXElement = false;
+ this.next();
+ const nonNullExpression = this.startNodeAt(startLoc);
+ nonNullExpression.expression = base;
+ return this.finishNode(nonNullExpression, "TSNonNullExpression");
+ }
+ let isOptionalCall = false;
+ if (this.match(18) && this.lookaheadCharCode() === 60) {
+ if (noCalls) {
+ state.stop = true;
+ return base;
+ }
+ state.optionalChainMember = isOptionalCall = true;
+ this.next();
+ }
+ if (this.match(47) || this.match(51)) {
+ let missingParenErrorLoc;
+ const result = this.tsTryParseAndCatch(() => {
+ if (!noCalls && this.atPossibleAsyncArrow(base)) {
+ const asyncArrowFn = this.tsTryParseGenericAsyncArrowFunction(startLoc);
+ if (asyncArrowFn) {
+ return asyncArrowFn;
+ }
+ }
+ const typeArguments = this.tsParseTypeArgumentsInExpression();
+ if (!typeArguments) return;
+ if (isOptionalCall && !this.match(10)) {
+ missingParenErrorLoc = this.state.curPosition();
+ return;
+ }
+ if (tokenIsTemplate(this.state.type)) {
+ const result = super.parseTaggedTemplateExpression(base, startLoc, state);
+ result.typeParameters = typeArguments;
+ return result;
+ }
+ if (!noCalls && this.eat(10)) {
+ const node = this.startNodeAt(startLoc);
+ node.callee = base;
+ node.arguments = this.parseCallExpressionArguments(11, false);
+ this.tsCheckForInvalidTypeCasts(node.arguments);
+ node.typeParameters = typeArguments;
+ if (state.optionalChainMember) {
+ node.optional = isOptionalCall;
+ }
+ return this.finishCallExpression(node, state.optionalChainMember);
+ }
+ const tokenType = this.state.type;
+ if (tokenType === 48 || tokenType === 52 || tokenType !== 10 && tokenCanStartExpression(tokenType) && !this.hasPrecedingLineBreak()) {
+ return;
+ }
+ const node = this.startNodeAt(startLoc);
+ node.expression = base;
+ node.typeParameters = typeArguments;
+ return this.finishNode(node, "TSInstantiationExpression");
+ });
+ if (missingParenErrorLoc) {
+ this.unexpected(missingParenErrorLoc, 10);
+ }
+ if (result) {
+ if (result.type === "TSInstantiationExpression" && (this.match(16) || this.match(18) && this.lookaheadCharCode() !== 40)) {
+ this.raise(TSErrors.InvalidPropertyAccessAfterInstantiationExpression, {
+ at: this.state.startLoc
+ });
+ }
+ return result;
+ }
+ }
+ return super.parseSubscript(base, startLoc, noCalls, state);
+ }
+ parseNewCallee(node) {
+ var _callee$extra;
+ super.parseNewCallee(node);
+ const {
+ callee
+ } = node;
+ if (callee.type === "TSInstantiationExpression" && !((_callee$extra = callee.extra) != null && _callee$extra.parenthesized)) {
+ node.typeParameters = callee.typeParameters;
+ node.callee = callee.expression;
+ }
+ }
+ parseExprOp(left, leftStartLoc, minPrec) {
+ let isSatisfies;
+ if (tokenOperatorPrecedence(58) > minPrec && !this.hasPrecedingLineBreak() && (this.isContextual(93) || (isSatisfies = this.isContextual(120)))) {
+ const node = this.startNodeAt(leftStartLoc);
+ node.expression = left;
+ node.typeAnnotation = this.tsInType(() => {
+ this.next();
+ if (this.match(75)) {
+ if (isSatisfies) {
+ this.raise(Errors.UnexpectedKeyword, {
+ at: this.state.startLoc,
+ keyword: "const"
+ });
+ }
+ return this.tsParseTypeReference();
+ }
+ return this.tsParseType();
+ });
+ this.finishNode(node, isSatisfies ? "TSSatisfiesExpression" : "TSAsExpression");
+ this.reScan_lt_gt();
+ return this.parseExprOp(node, leftStartLoc, minPrec);
+ }
+ return super.parseExprOp(left, leftStartLoc, minPrec);
+ }
+ checkReservedWord(word, startLoc, checkKeywords, isBinding) {
+ if (!this.state.isAmbientContext) {
+ super.checkReservedWord(word, startLoc, checkKeywords, isBinding);
+ }
+ }
+ checkImportReflection(node) {
+ super.checkImportReflection(node);
+ if (node.module && node.importKind !== "value") {
+ this.raise(TSErrors.ImportReflectionHasImportType, {
+ at: node.specifiers[0].loc.start
+ });
+ }
+ }
+ checkDuplicateExports() {}
+ isPotentialImportPhase(isExport) {
+ if (super.isPotentialImportPhase(isExport)) return true;
+ if (this.isContextual(130)) {
+ const ch = this.lookaheadCharCode();
+ return isExport ? ch === 123 || ch === 42 : ch !== 61;
+ }
+ return !isExport && this.isContextual(87);
+ }
+ applyImportPhase(node, isExport, phase, loc) {
+ super.applyImportPhase(node, isExport, phase, loc);
+ if (isExport) {
+ node.exportKind = phase === "type" ? "type" : "value";
+ } else {
+ node.importKind = phase === "type" || phase === "typeof" ? phase : "value";
+ }
+ }
+ parseImport(node) {
+ if (this.match(133)) {
+ node.importKind = "value";
+ return super.parseImport(node);
+ }
+ let importNode;
+ if (tokenIsIdentifier(this.state.type) && this.lookaheadCharCode() === 61) {
+ node.importKind = "value";
+ return this.tsParseImportEqualsDeclaration(node);
+ } else if (this.isContextual(130)) {
+ const maybeDefaultIdentifier = this.parseMaybeImportPhase(node, false);
+ if (this.lookaheadCharCode() === 61) {
+ return this.tsParseImportEqualsDeclaration(node, maybeDefaultIdentifier);
+ } else {
+ importNode = super.parseImportSpecifiersAndAfter(node, maybeDefaultIdentifier);
+ }
+ } else {
+ importNode = super.parseImport(node);
+ }
+ if (importNode.importKind === "type" && importNode.specifiers.length > 1 && importNode.specifiers[0].type === "ImportDefaultSpecifier") {
+ this.raise(TSErrors.TypeImportCannotSpecifyDefaultAndNamed, {
+ at: importNode
+ });
+ }
+ return importNode;
+ }
+ parseExport(node, decorators) {
+ if (this.match(83)) {
+ this.next();
+ let maybeDefaultIdentifier = null;
+ if (this.isContextual(130) && this.isPotentialImportPhase(false)) {
+ maybeDefaultIdentifier = this.parseMaybeImportPhase(node, false);
+ } else {
+ node.importKind = "value";
+ }
+ return this.tsParseImportEqualsDeclaration(node, maybeDefaultIdentifier, true);
+ } else if (this.eat(29)) {
+ const assign = node;
+ assign.expression = super.parseExpression();
+ this.semicolon();
+ this.sawUnambiguousESM = true;
+ return this.finishNode(assign, "TSExportAssignment");
+ } else if (this.eatContextual(93)) {
+ const decl = node;
+ this.expectContextual(128);
+ decl.id = this.parseIdentifier();
+ this.semicolon();
+ return this.finishNode(decl, "TSNamespaceExportDeclaration");
+ } else {
+ return super.parseExport(node, decorators);
+ }
+ }
+ isAbstractClass() {
+ return this.isContextual(124) && this.lookahead().type === 80;
+ }
+ parseExportDefaultExpression() {
+ if (this.isAbstractClass()) {
+ const cls = this.startNode();
+ this.next();
+ cls.abstract = true;
+ return this.parseClass(cls, true, true);
+ }
+ if (this.match(129)) {
+ const result = this.tsParseInterfaceDeclaration(this.startNode());
+ if (result) return result;
+ }
+ return super.parseExportDefaultExpression();
+ }
+ parseVarStatement(node, kind, allowMissingInitializer = false) {
+ const {
+ isAmbientContext
+ } = this.state;
+ const declaration = super.parseVarStatement(node, kind, allowMissingInitializer || isAmbientContext);
+ if (!isAmbientContext) return declaration;
+ for (const {
+ id,
+ init
+ } of declaration.declarations) {
+ if (!init) continue;
+ if (kind !== "const" || !!id.typeAnnotation) {
+ this.raise(TSErrors.InitializerNotAllowedInAmbientContext, {
+ at: init
+ });
+ } else if (!isValidAmbientConstInitializer(init, this.hasPlugin("estree"))) {
+ this.raise(TSErrors.ConstInitiailizerMustBeStringOrNumericLiteralOrLiteralEnumReference, {
+ at: init
+ });
+ }
+ }
+ return declaration;
+ }
+ parseStatementContent(flags, decorators) {
+ if (this.match(75) && this.isLookaheadContextual("enum")) {
+ const node = this.startNode();
+ this.expect(75);
+ return this.tsParseEnumDeclaration(node, {
+ const: true
+ });
+ }
+ if (this.isContextual(126)) {
+ return this.tsParseEnumDeclaration(this.startNode());
+ }
+ if (this.isContextual(129)) {
+ const result = this.tsParseInterfaceDeclaration(this.startNode());
+ if (result) return result;
+ }
+ return super.parseStatementContent(flags, decorators);
+ }
+ parseAccessModifier() {
+ return this.tsParseModifier(["public", "protected", "private"]);
+ }
+ tsHasSomeModifiers(member, modifiers) {
+ return modifiers.some(modifier => {
+ if (tsIsAccessModifier(modifier)) {
+ return member.accessibility === modifier;
+ }
+ return !!member[modifier];
+ });
+ }
+ tsIsStartOfStaticBlocks() {
+ return this.isContextual(106) && this.lookaheadCharCode() === 123;
+ }
+ parseClassMember(classBody, member, state) {
+ const modifiers = ["declare", "private", "public", "protected", "override", "abstract", "readonly", "static"];
+ this.tsParseModifiers({
+ allowedModifiers: modifiers,
+ disallowedModifiers: ["in", "out"],
+ stopOnStartOfClassStaticBlock: true,
+ errorTemplate: TSErrors.InvalidModifierOnTypeParameterPositions
+ }, member);
+ const callParseClassMemberWithIsStatic = () => {
+ if (this.tsIsStartOfStaticBlocks()) {
+ this.next();
+ this.next();
+ if (this.tsHasSomeModifiers(member, modifiers)) {
+ this.raise(TSErrors.StaticBlockCannotHaveModifier, {
+ at: this.state.curPosition()
+ });
+ }
+ super.parseClassStaticBlock(classBody, member);
+ } else {
+ this.parseClassMemberWithIsStatic(classBody, member, state, !!member.static);
+ }
+ };
+ if (member.declare) {
+ this.tsInAmbientContext(callParseClassMemberWithIsStatic);
+ } else {
+ callParseClassMemberWithIsStatic();
+ }
+ }
+ parseClassMemberWithIsStatic(classBody, member, state, isStatic) {
+ const idx = this.tsTryParseIndexSignature(member);
+ if (idx) {
+ classBody.body.push(idx);
+ if (member.abstract) {
+ this.raise(TSErrors.IndexSignatureHasAbstract, {
+ at: member
+ });
+ }
+ if (member.accessibility) {
+ this.raise(TSErrors.IndexSignatureHasAccessibility, {
+ at: member,
+ modifier: member.accessibility
+ });
+ }
+ if (member.declare) {
+ this.raise(TSErrors.IndexSignatureHasDeclare, {
+ at: member
+ });
+ }
+ if (member.override) {
+ this.raise(TSErrors.IndexSignatureHasOverride, {
+ at: member
+ });
+ }
+ return;
+ }
+ if (!this.state.inAbstractClass && member.abstract) {
+ this.raise(TSErrors.NonAbstractClassHasAbstractMethod, {
+ at: member
+ });
+ }
+ if (member.override) {
+ if (!state.hadSuperClass) {
+ this.raise(TSErrors.OverrideNotInSubClass, {
+ at: member
+ });
+ }
+ }
+ super.parseClassMemberWithIsStatic(classBody, member, state, isStatic);
+ }
+ parsePostMemberNameModifiers(methodOrProp) {
+ const optional = this.eat(17);
+ if (optional) methodOrProp.optional = true;
+ if (methodOrProp.readonly && this.match(10)) {
+ this.raise(TSErrors.ClassMethodHasReadonly, {
+ at: methodOrProp
+ });
+ }
+ if (methodOrProp.declare && this.match(10)) {
+ this.raise(TSErrors.ClassMethodHasDeclare, {
+ at: methodOrProp
+ });
+ }
+ }
+ parseExpressionStatement(node, expr, decorators) {
+ const decl = expr.type === "Identifier" ? this.tsParseExpressionStatement(node, expr, decorators) : undefined;
+ return decl || super.parseExpressionStatement(node, expr, decorators);
+ }
+ shouldParseExportDeclaration() {
+ if (this.tsIsDeclarationStart()) return true;
+ return super.shouldParseExportDeclaration();
+ }
+ parseConditional(expr, startLoc, refExpressionErrors) {
+ if (!this.state.maybeInArrowParameters || !this.match(17)) {
+ return super.parseConditional(expr, startLoc, refExpressionErrors);
+ }
+ const result = this.tryParse(() => super.parseConditional(expr, startLoc));
+ if (!result.node) {
+ if (result.error) {
+ super.setOptionalParametersError(refExpressionErrors, result.error);
+ }
+ return expr;
+ }
+ if (result.error) this.state = result.failState;
+ return result.node;
+ }
+ parseParenItem(node, startLoc) {
+ node = super.parseParenItem(node, startLoc);
+ if (this.eat(17)) {
+ node.optional = true;
+ this.resetEndLocation(node);
+ }
+ if (this.match(14)) {
+ const typeCastNode = this.startNodeAt(startLoc);
+ typeCastNode.expression = node;
+ typeCastNode.typeAnnotation = this.tsParseTypeAnnotation();
+ return this.finishNode(typeCastNode, "TSTypeCastExpression");
+ }
+ return node;
+ }
+ parseExportDeclaration(node) {
+ if (!this.state.isAmbientContext && this.isContextual(125)) {
+ return this.tsInAmbientContext(() => this.parseExportDeclaration(node));
+ }
+ const startLoc = this.state.startLoc;
+ const isDeclare = this.eatContextual(125);
+ if (isDeclare && (this.isContextual(125) || !this.shouldParseExportDeclaration())) {
+ throw this.raise(TSErrors.ExpectedAmbientAfterExportDeclare, {
+ at: this.state.startLoc
+ });
+ }
+ const isIdentifier = tokenIsIdentifier(this.state.type);
+ const declaration = isIdentifier && this.tsTryParseExportDeclaration() || super.parseExportDeclaration(node);
+ if (!declaration) return null;
+ if (declaration.type === "TSInterfaceDeclaration" || declaration.type === "TSTypeAliasDeclaration" || isDeclare) {
+ node.exportKind = "type";
+ }
+ if (isDeclare) {
+ this.resetStartLocation(declaration, startLoc);
+ declaration.declare = true;
+ }
+ return declaration;
+ }
+ parseClassId(node, isStatement, optionalId, bindingType) {
+ if ((!isStatement || optionalId) && this.isContextual(113)) {
+ return;
+ }
+ super.parseClassId(node, isStatement, optionalId, node.declare ? 1024 : 8331);
+ const typeParameters = this.tsTryParseTypeParameters(this.tsParseInOutConstModifiers);
+ if (typeParameters) node.typeParameters = typeParameters;
+ }
+ parseClassPropertyAnnotation(node) {
+ if (!node.optional) {
+ if (this.eat(35)) {
+ node.definite = true;
+ } else if (this.eat(17)) {
+ node.optional = true;
+ }
+ }
+ const type = this.tsTryParseTypeAnnotation();
+ if (type) node.typeAnnotation = type;
+ }
+ parseClassProperty(node) {
+ this.parseClassPropertyAnnotation(node);
+ if (this.state.isAmbientContext && !(node.readonly && !node.typeAnnotation) && this.match(29)) {
+ this.raise(TSErrors.DeclareClassFieldHasInitializer, {
+ at: this.state.startLoc
+ });
+ }
+ if (node.abstract && this.match(29)) {
+ const {
+ key
+ } = node;
+ this.raise(TSErrors.AbstractPropertyHasInitializer, {
+ at: this.state.startLoc,
+ propertyName: key.type === "Identifier" && !node.computed ? key.name : `[${this.input.slice(key.start, key.end)}]`
+ });
+ }
+ return super.parseClassProperty(node);
+ }
+ parseClassPrivateProperty(node) {
+ if (node.abstract) {
+ this.raise(TSErrors.PrivateElementHasAbstract, {
+ at: node
+ });
+ }
+ if (node.accessibility) {
+ this.raise(TSErrors.PrivateElementHasAccessibility, {
+ at: node,
+ modifier: node.accessibility
+ });
+ }
+ this.parseClassPropertyAnnotation(node);
+ return super.parseClassPrivateProperty(node);
+ }
+ parseClassAccessorProperty(node) {
+ this.parseClassPropertyAnnotation(node);
+ if (node.optional) {
+ this.raise(TSErrors.AccessorCannotBeOptional, {
+ at: node
+ });
+ }
+ return super.parseClassAccessorProperty(node);
+ }
+ pushClassMethod(classBody, method, isGenerator, isAsync, isConstructor, allowsDirectSuper) {
+ const typeParameters = this.tsTryParseTypeParameters(this.tsParseConstModifier);
+ if (typeParameters && isConstructor) {
+ this.raise(TSErrors.ConstructorHasTypeParameters, {
+ at: typeParameters
+ });
+ }
+ const {
+ declare = false,
+ kind
+ } = method;
+ if (declare && (kind === "get" || kind === "set")) {
+ this.raise(TSErrors.DeclareAccessor, {
+ at: method,
+ kind
+ });
+ }
+ if (typeParameters) method.typeParameters = typeParameters;
+ super.pushClassMethod(classBody, method, isGenerator, isAsync, isConstructor, allowsDirectSuper);
+ }
+ pushClassPrivateMethod(classBody, method, isGenerator, isAsync) {
+ const typeParameters = this.tsTryParseTypeParameters(this.tsParseConstModifier);
+ if (typeParameters) method.typeParameters = typeParameters;
+ super.pushClassPrivateMethod(classBody, method, isGenerator, isAsync);
+ }
+ declareClassPrivateMethodInScope(node, kind) {
+ if (node.type === "TSDeclareMethod") return;
+ if (node.type === "MethodDefinition" && !node.value.body) return;
+ super.declareClassPrivateMethodInScope(node, kind);
+ }
+ parseClassSuper(node) {
+ super.parseClassSuper(node);
+ if (node.superClass && (this.match(47) || this.match(51))) {
+ node.superTypeParameters = this.tsParseTypeArgumentsInExpression();
+ }
+ if (this.eatContextual(113)) {
+ node.implements = this.tsParseHeritageClause("implements");
+ }
+ }
+ parseObjPropValue(prop, startLoc, isGenerator, isAsync, isPattern, isAccessor, refExpressionErrors) {
+ const typeParameters = this.tsTryParseTypeParameters(this.tsParseConstModifier);
+ if (typeParameters) prop.typeParameters = typeParameters;
+ return super.parseObjPropValue(prop, startLoc, isGenerator, isAsync, isPattern, isAccessor, refExpressionErrors);
+ }
+ parseFunctionParams(node, isConstructor) {
+ const typeParameters = this.tsTryParseTypeParameters(this.tsParseConstModifier);
+ if (typeParameters) node.typeParameters = typeParameters;
+ super.parseFunctionParams(node, isConstructor);
+ }
+ parseVarId(decl, kind) {
+ super.parseVarId(decl, kind);
+ if (decl.id.type === "Identifier" && !this.hasPrecedingLineBreak() && this.eat(35)) {
+ decl.definite = true;
+ }
+ const type = this.tsTryParseTypeAnnotation();
+ if (type) {
+ decl.id.typeAnnotation = type;
+ this.resetEndLocation(decl.id);
+ }
+ }
+ parseAsyncArrowFromCallExpression(node, call) {
+ if (this.match(14)) {
+ node.returnType = this.tsParseTypeAnnotation();
+ }
+ return super.parseAsyncArrowFromCallExpression(node, call);
+ }
+ parseMaybeAssign(refExpressionErrors, afterLeftParse) {
+ var _jsx, _jsx2, _typeCast, _jsx3, _typeCast2;
+ let state;
+ let jsx;
+ let typeCast;
+ if (this.hasPlugin("jsx") && (this.match(142) || this.match(47))) {
+ state = this.state.clone();
+ jsx = this.tryParse(() => super.parseMaybeAssign(refExpressionErrors, afterLeftParse), state);
+ if (!jsx.error) return jsx.node;
+ const {
+ context
+ } = this.state;
+ const currentContext = context[context.length - 1];
+ if (currentContext === types.j_oTag || currentContext === types.j_expr) {
+ context.pop();
+ }
+ }
+ if (!((_jsx = jsx) != null && _jsx.error) && !this.match(47)) {
+ return super.parseMaybeAssign(refExpressionErrors, afterLeftParse);
+ }
+ if (!state || state === this.state) state = this.state.clone();
+ let typeParameters;
+ const arrow = this.tryParse(abort => {
+ var _expr$extra, _typeParameters;
+ typeParameters = this.tsParseTypeParameters(this.tsParseConstModifier);
+ const expr = super.parseMaybeAssign(refExpressionErrors, afterLeftParse);
+ if (expr.type !== "ArrowFunctionExpression" || (_expr$extra = expr.extra) != null && _expr$extra.parenthesized) {
+ abort();
+ }
+ if (((_typeParameters = typeParameters) == null ? void 0 : _typeParameters.params.length) !== 0) {
+ this.resetStartLocationFromNode(expr, typeParameters);
+ }
+ expr.typeParameters = typeParameters;
+ return expr;
+ }, state);
+ if (!arrow.error && !arrow.aborted) {
+ if (typeParameters) this.reportReservedArrowTypeParam(typeParameters);
+ return arrow.node;
+ }
+ if (!jsx) {
+ assert(!this.hasPlugin("jsx"));
+ typeCast = this.tryParse(() => super.parseMaybeAssign(refExpressionErrors, afterLeftParse), state);
+ if (!typeCast.error) return typeCast.node;
+ }
+ if ((_jsx2 = jsx) != null && _jsx2.node) {
+ this.state = jsx.failState;
+ return jsx.node;
+ }
+ if (arrow.node) {
+ this.state = arrow.failState;
+ if (typeParameters) this.reportReservedArrowTypeParam(typeParameters);
+ return arrow.node;
+ }
+ if ((_typeCast = typeCast) != null && _typeCast.node) {
+ this.state = typeCast.failState;
+ return typeCast.node;
+ }
+ throw ((_jsx3 = jsx) == null ? void 0 : _jsx3.error) || arrow.error || ((_typeCast2 = typeCast) == null ? void 0 : _typeCast2.error);
+ }
+ reportReservedArrowTypeParam(node) {
+ var _node$extra;
+ if (node.params.length === 1 && !node.params[0].constraint && !((_node$extra = node.extra) != null && _node$extra.trailingComma) && this.getPluginOption("typescript", "disallowAmbiguousJSXLike")) {
+ this.raise(TSErrors.ReservedArrowTypeParam, {
+ at: node
+ });
+ }
+ }
+ parseMaybeUnary(refExpressionErrors, sawUnary) {
+ if (!this.hasPlugin("jsx") && this.match(47)) {
+ return this.tsParseTypeAssertion();
+ }
+ return super.parseMaybeUnary(refExpressionErrors, sawUnary);
+ }
+ parseArrow(node) {
+ if (this.match(14)) {
+ const result = this.tryParse(abort => {
+ const returnType = this.tsParseTypeOrTypePredicateAnnotation(14);
+ if (this.canInsertSemicolon() || !this.match(19)) abort();
+ return returnType;
+ });
+ if (result.aborted) return;
+ if (!result.thrown) {
+ if (result.error) this.state = result.failState;
+ node.returnType = result.node;
+ }
+ }
+ return super.parseArrow(node);
+ }
+ parseAssignableListItemTypes(param, flags) {
+ if (!(flags & 2)) return param;
+ if (this.eat(17)) {
+ param.optional = true;
+ }
+ const type = this.tsTryParseTypeAnnotation();
+ if (type) param.typeAnnotation = type;
+ this.resetEndLocation(param);
+ return param;
+ }
+ isAssignable(node, isBinding) {
+ switch (node.type) {
+ case "TSTypeCastExpression":
+ return this.isAssignable(node.expression, isBinding);
+ case "TSParameterProperty":
+ return true;
+ default:
+ return super.isAssignable(node, isBinding);
+ }
+ }
+ toAssignable(node, isLHS = false) {
+ switch (node.type) {
+ case "ParenthesizedExpression":
+ this.toAssignableParenthesizedExpression(node, isLHS);
+ break;
+ case "TSAsExpression":
+ case "TSSatisfiesExpression":
+ case "TSNonNullExpression":
+ case "TSTypeAssertion":
+ if (isLHS) {
+ this.expressionScope.recordArrowParameterBindingError(TSErrors.UnexpectedTypeCastInParameter, {
+ at: node
+ });
+ } else {
+ this.raise(TSErrors.UnexpectedTypeCastInParameter, {
+ at: node
+ });
+ }
+ this.toAssignable(node.expression, isLHS);
+ break;
+ case "AssignmentExpression":
+ if (!isLHS && node.left.type === "TSTypeCastExpression") {
+ node.left = this.typeCastToParameter(node.left);
+ }
+ default:
+ super.toAssignable(node, isLHS);
+ }
+ }
+ toAssignableParenthesizedExpression(node, isLHS) {
+ switch (node.expression.type) {
+ case "TSAsExpression":
+ case "TSSatisfiesExpression":
+ case "TSNonNullExpression":
+ case "TSTypeAssertion":
+ case "ParenthesizedExpression":
+ this.toAssignable(node.expression, isLHS);
+ break;
+ default:
+ super.toAssignable(node, isLHS);
+ }
+ }
+ checkToRestConversion(node, allowPattern) {
+ switch (node.type) {
+ case "TSAsExpression":
+ case "TSSatisfiesExpression":
+ case "TSTypeAssertion":
+ case "TSNonNullExpression":
+ this.checkToRestConversion(node.expression, false);
+ break;
+ default:
+ super.checkToRestConversion(node, allowPattern);
+ }
+ }
+ isValidLVal(type, isUnparenthesizedInAssign, binding) {
+ return getOwn({
+ TSTypeCastExpression: true,
+ TSParameterProperty: "parameter",
+ TSNonNullExpression: "expression",
+ TSAsExpression: (binding !== 64 || !isUnparenthesizedInAssign) && ["expression", true],
+ TSSatisfiesExpression: (binding !== 64 || !isUnparenthesizedInAssign) && ["expression", true],
+ TSTypeAssertion: (binding !== 64 || !isUnparenthesizedInAssign) && ["expression", true]
+ }, type) || super.isValidLVal(type, isUnparenthesizedInAssign, binding);
+ }
+ parseBindingAtom() {
+ if (this.state.type === 78) {
+ return this.parseIdentifier(true);
+ }
+ return super.parseBindingAtom();
+ }
+ parseMaybeDecoratorArguments(expr) {
+ if (this.match(47) || this.match(51)) {
+ const typeArguments = this.tsParseTypeArgumentsInExpression();
+ if (this.match(10)) {
+ const call = super.parseMaybeDecoratorArguments(expr);
+ call.typeParameters = typeArguments;
+ return call;
+ }
+ this.unexpected(null, 10);
+ }
+ return super.parseMaybeDecoratorArguments(expr);
+ }
+ checkCommaAfterRest(close) {
+ if (this.state.isAmbientContext && this.match(12) && this.lookaheadCharCode() === close) {
+ this.next();
+ return false;
+ }
+ return super.checkCommaAfterRest(close);
+ }
+ isClassMethod() {
+ return this.match(47) || super.isClassMethod();
+ }
+ isClassProperty() {
+ return this.match(35) || this.match(14) || super.isClassProperty();
+ }
+ parseMaybeDefault(startLoc, left) {
+ const node = super.parseMaybeDefault(startLoc, left);
+ if (node.type === "AssignmentPattern" && node.typeAnnotation && node.right.start < node.typeAnnotation.start) {
+ this.raise(TSErrors.TypeAnnotationAfterAssign, {
+ at: node.typeAnnotation
+ });
+ }
+ return node;
+ }
+ getTokenFromCode(code) {
+ if (this.state.inType) {
+ if (code === 62) {
+ this.finishOp(48, 1);
+ return;
+ }
+ if (code === 60) {
+ this.finishOp(47, 1);
+ return;
+ }
+ }
+ super.getTokenFromCode(code);
+ }
+ reScan_lt_gt() {
+ const {
+ type
+ } = this.state;
+ if (type === 47) {
+ this.state.pos -= 1;
+ this.readToken_lt();
+ } else if (type === 48) {
+ this.state.pos -= 1;
+ this.readToken_gt();
+ }
+ }
+ reScan_lt() {
+ const {
+ type
+ } = this.state;
+ if (type === 51) {
+ this.state.pos -= 2;
+ this.finishOp(47, 1);
+ return 47;
+ }
+ return type;
+ }
+ toAssignableList(exprList, trailingCommaLoc, isLHS) {
+ for (let i = 0; i < exprList.length; i++) {
+ const expr = exprList[i];
+ if ((expr == null ? void 0 : expr.type) === "TSTypeCastExpression") {
+ exprList[i] = this.typeCastToParameter(expr);
+ }
+ }
+ super.toAssignableList(exprList, trailingCommaLoc, isLHS);
+ }
+ typeCastToParameter(node) {
+ node.expression.typeAnnotation = node.typeAnnotation;
+ this.resetEndLocation(node.expression, node.typeAnnotation.loc.end);
+ return node.expression;
+ }
+ shouldParseArrow(params) {
+ if (this.match(14)) {
+ return params.every(expr => this.isAssignable(expr, true));
+ }
+ return super.shouldParseArrow(params);
+ }
+ shouldParseAsyncArrow() {
+ return this.match(14) || super.shouldParseAsyncArrow();
+ }
+ canHaveLeadingDecorator() {
+ return super.canHaveLeadingDecorator() || this.isAbstractClass();
+ }
+ jsxParseOpeningElementAfterName(node) {
+ if (this.match(47) || this.match(51)) {
+ const typeArguments = this.tsTryParseAndCatch(() => this.tsParseTypeArgumentsInExpression());
+ if (typeArguments) node.typeParameters = typeArguments;
+ }
+ return super.jsxParseOpeningElementAfterName(node);
+ }
+ getGetterSetterExpectedParamCount(method) {
+ const baseCount = super.getGetterSetterExpectedParamCount(method);
+ const params = this.getObjectOrClassMethodParams(method);
+ const firstParam = params[0];
+ const hasContextParam = firstParam && this.isThisParam(firstParam);
+ return hasContextParam ? baseCount + 1 : baseCount;
+ }
+ parseCatchClauseParam() {
+ const param = super.parseCatchClauseParam();
+ const type = this.tsTryParseTypeAnnotation();
+ if (type) {
+ param.typeAnnotation = type;
+ this.resetEndLocation(param);
+ }
+ return param;
+ }
+ tsInAmbientContext(cb) {
+ const oldIsAmbientContext = this.state.isAmbientContext;
+ this.state.isAmbientContext = true;
+ try {
+ return cb();
+ } finally {
+ this.state.isAmbientContext = oldIsAmbientContext;
+ }
+ }
+ parseClass(node, isStatement, optionalId) {
+ const oldInAbstractClass = this.state.inAbstractClass;
+ this.state.inAbstractClass = !!node.abstract;
+ try {
+ return super.parseClass(node, isStatement, optionalId);
+ } finally {
+ this.state.inAbstractClass = oldInAbstractClass;
+ }
+ }
+ tsParseAbstractDeclaration(node, decorators) {
+ if (this.match(80)) {
+ node.abstract = true;
+ return this.maybeTakeDecorators(decorators, this.parseClass(node, true, false));
+ } else if (this.isContextual(129)) {
+ if (!this.hasFollowingLineBreak()) {
+ node.abstract = true;
+ this.raise(TSErrors.NonClassMethodPropertyHasAbstractModifer, {
+ at: node
+ });
+ return this.tsParseInterfaceDeclaration(node);
+ }
+ } else {
+ this.unexpected(null, 80);
+ }
+ }
+ parseMethod(node, isGenerator, isAsync, isConstructor, allowDirectSuper, type, inClassScope) {
+ const method = super.parseMethod(node, isGenerator, isAsync, isConstructor, allowDirectSuper, type, inClassScope);
+ if (method.abstract) {
+ const hasBody = this.hasPlugin("estree") ? !!method.value.body : !!method.body;
+ if (hasBody) {
+ const {
+ key
+ } = method;
+ this.raise(TSErrors.AbstractMethodHasImplementation, {
+ at: method,
+ methodName: key.type === "Identifier" && !method.computed ? key.name : `[${this.input.slice(key.start, key.end)}]`
+ });
+ }
+ }
+ return method;
+ }
+ tsParseTypeParameterName() {
+ const typeName = this.parseIdentifier();
+ return typeName.name;
+ }
+ shouldParseAsAmbientContext() {
+ return !!this.getPluginOption("typescript", "dts");
+ }
+ parse() {
+ if (this.shouldParseAsAmbientContext()) {
+ this.state.isAmbientContext = true;
+ }
+ return super.parse();
+ }
+ getExpression() {
+ if (this.shouldParseAsAmbientContext()) {
+ this.state.isAmbientContext = true;
+ }
+ return super.getExpression();
+ }
+ parseExportSpecifier(node, isString, isInTypeExport, isMaybeTypeOnly) {
+ if (!isString && isMaybeTypeOnly) {
+ this.parseTypeOnlyImportExportSpecifier(node, false, isInTypeExport);
+ return this.finishNode(node, "ExportSpecifier");
+ }
+ node.exportKind = "value";
+ return super.parseExportSpecifier(node, isString, isInTypeExport, isMaybeTypeOnly);
+ }
+ parseImportSpecifier(specifier, importedIsString, isInTypeOnlyImport, isMaybeTypeOnly, bindingType) {
+ if (!importedIsString && isMaybeTypeOnly) {
+ this.parseTypeOnlyImportExportSpecifier(specifier, true, isInTypeOnlyImport);
+ return this.finishNode(specifier, "ImportSpecifier");
+ }
+ specifier.importKind = "value";
+ return super.parseImportSpecifier(specifier, importedIsString, isInTypeOnlyImport, isMaybeTypeOnly, isInTypeOnlyImport ? 4098 : 4096);
+ }
+ parseTypeOnlyImportExportSpecifier(node, isImport, isInTypeOnlyImportExport) {
+ const leftOfAsKey = isImport ? "imported" : "local";
+ const rightOfAsKey = isImport ? "local" : "exported";
+ let leftOfAs = node[leftOfAsKey];
+ let rightOfAs;
+ let hasTypeSpecifier = false;
+ let canParseAsKeyword = true;
+ const loc = leftOfAs.loc.start;
+ if (this.isContextual(93)) {
+ const firstAs = this.parseIdentifier();
+ if (this.isContextual(93)) {
+ const secondAs = this.parseIdentifier();
+ if (tokenIsKeywordOrIdentifier(this.state.type)) {
+ hasTypeSpecifier = true;
+ leftOfAs = firstAs;
+ rightOfAs = isImport ? this.parseIdentifier() : this.parseModuleExportName();
+ canParseAsKeyword = false;
+ } else {
+ rightOfAs = secondAs;
+ canParseAsKeyword = false;
+ }
+ } else if (tokenIsKeywordOrIdentifier(this.state.type)) {
+ canParseAsKeyword = false;
+ rightOfAs = isImport ? this.parseIdentifier() : this.parseModuleExportName();
+ } else {
+ hasTypeSpecifier = true;
+ leftOfAs = firstAs;
+ }
+ } else if (tokenIsKeywordOrIdentifier(this.state.type)) {
+ hasTypeSpecifier = true;
+ if (isImport) {
+ leftOfAs = this.parseIdentifier(true);
+ if (!this.isContextual(93)) {
+ this.checkReservedWord(leftOfAs.name, leftOfAs.loc.start, true, true);
+ }
+ } else {
+ leftOfAs = this.parseModuleExportName();
+ }
+ }
+ if (hasTypeSpecifier && isInTypeOnlyImportExport) {
+ this.raise(isImport ? TSErrors.TypeModifierIsUsedInTypeImports : TSErrors.TypeModifierIsUsedInTypeExports, {
+ at: loc
+ });
+ }
+ node[leftOfAsKey] = leftOfAs;
+ node[rightOfAsKey] = rightOfAs;
+ const kindKey = isImport ? "importKind" : "exportKind";
+ node[kindKey] = hasTypeSpecifier ? "type" : "value";
+ if (canParseAsKeyword && this.eatContextual(93)) {
+ node[rightOfAsKey] = isImport ? this.parseIdentifier() : this.parseModuleExportName();
+ }
+ if (!node[rightOfAsKey]) {
+ node[rightOfAsKey] = cloneIdentifier(node[leftOfAsKey]);
+ }
+ if (isImport) {
+ this.checkIdentifier(node[rightOfAsKey], hasTypeSpecifier ? 4098 : 4096);
+ }
+ }
+ };
+ function isPossiblyLiteralEnum(expression) {
+ if (expression.type !== "MemberExpression") return false;
+ const {
+ computed,
+ property
+ } = expression;
+ if (computed && property.type !== "StringLiteral" && (property.type !== "TemplateLiteral" || property.expressions.length > 0)) {
+ return false;
+ }
+ return isUncomputedMemberExpressionChain(expression.object);
+ }
+ function isValidAmbientConstInitializer(expression, estree) {
+ var _expression$extra;
+ const {
+ type
+ } = expression;
+ if ((_expression$extra = expression.extra) != null && _expression$extra.parenthesized) {
+ return false;
+ }
+ if (estree) {
+ if (type === "Literal") {
+ const {
+ value
+ } = expression;
+ if (typeof value === "string" || typeof value === "boolean") {
+ return true;
+ }
+ }
+ } else {
+ if (type === "StringLiteral" || type === "BooleanLiteral") {
+ return true;
+ }
+ }
+ if (isNumber(expression, estree) || isNegativeNumber(expression, estree)) {
+ return true;
+ }
+ if (type === "TemplateLiteral" && expression.expressions.length === 0) {
+ return true;
+ }
+ if (isPossiblyLiteralEnum(expression)) {
+ return true;
+ }
+ return false;
+ }
+ function isNumber(expression, estree) {
+ if (estree) {
+ return expression.type === "Literal" && (typeof expression.value === "number" || "bigint" in expression);
+ }
+ return expression.type === "NumericLiteral" || expression.type === "BigIntLiteral";
+ }
+ function isNegativeNumber(expression, estree) {
+ if (expression.type === "UnaryExpression") {
+ const {
+ operator,
+ argument
+ } = expression;
+ if (operator === "-" && isNumber(argument, estree)) {
+ return true;
+ }
+ }
+ return false;
+ }
+ function isUncomputedMemberExpressionChain(expression) {
+ if (expression.type === "Identifier") return true;
+ if (expression.type !== "MemberExpression" || expression.computed) {
+ return false;
+ }
+ return isUncomputedMemberExpressionChain(expression.object);
+ }
+ const PlaceholderErrors = ParseErrorEnum`placeholders`({
+ ClassNameIsRequired: "A class name is required.",
+ UnexpectedSpace: "Unexpected space in placeholder."
+ });
+ var placeholders = superClass => class PlaceholdersParserMixin extends superClass {
+ parsePlaceholder(expectedNode) {
+ if (this.match(144)) {
+ const node = this.startNode();
+ this.next();
+ this.assertNoSpace();
+ node.name = super.parseIdentifier(true);
+ this.assertNoSpace();
+ this.expect(144);
+ return this.finishPlaceholder(node, expectedNode);
+ }
+ }
+ finishPlaceholder(node, expectedNode) {
+ const isFinished = !!(node.expectedNode && node.type === "Placeholder");
+ node.expectedNode = expectedNode;
+ return isFinished ? node : this.finishNode(node, "Placeholder");
+ }
+ getTokenFromCode(code) {
+ if (code === 37 && this.input.charCodeAt(this.state.pos + 1) === 37) {
+ this.finishOp(144, 2);
+ } else {
+ super.getTokenFromCode(code);
+ }
+ }
+ parseExprAtom(refExpressionErrors) {
+ return this.parsePlaceholder("Expression") || super.parseExprAtom(refExpressionErrors);
+ }
+ parseIdentifier(liberal) {
+ return this.parsePlaceholder("Identifier") || super.parseIdentifier(liberal);
+ }
+ checkReservedWord(word, startLoc, checkKeywords, isBinding) {
+ if (word !== undefined) {
+ super.checkReservedWord(word, startLoc, checkKeywords, isBinding);
+ }
+ }
+ parseBindingAtom() {
+ return this.parsePlaceholder("Pattern") || super.parseBindingAtom();
+ }
+ isValidLVal(type, isParenthesized, binding) {
+ return type === "Placeholder" || super.isValidLVal(type, isParenthesized, binding);
+ }
+ toAssignable(node, isLHS) {
+ if (node && node.type === "Placeholder" && node.expectedNode === "Expression") {
+ node.expectedNode = "Pattern";
+ } else {
+ super.toAssignable(node, isLHS);
+ }
+ }
+ chStartsBindingIdentifier(ch, pos) {
+ if (super.chStartsBindingIdentifier(ch, pos)) {
+ return true;
+ }
+ const nextToken = this.lookahead();
+ if (nextToken.type === 144) {
+ return true;
+ }
+ return false;
+ }
+ verifyBreakContinue(node, isBreak) {
+ if (node.label && node.label.type === "Placeholder") return;
+ super.verifyBreakContinue(node, isBreak);
+ }
+ parseExpressionStatement(node, expr) {
+ var _expr$extra;
+ if (expr.type !== "Placeholder" || (_expr$extra = expr.extra) != null && _expr$extra.parenthesized) {
+ return super.parseExpressionStatement(node, expr);
+ }
+ if (this.match(14)) {
+ const stmt = node;
+ stmt.label = this.finishPlaceholder(expr, "Identifier");
+ this.next();
+ stmt.body = super.parseStatementOrSloppyAnnexBFunctionDeclaration();
+ return this.finishNode(stmt, "LabeledStatement");
+ }
+ this.semicolon();
+ node.name = expr.name;
+ return this.finishPlaceholder(node, "Statement");
+ }
+ parseBlock(allowDirectives, createNewLexicalScope, afterBlockParse) {
+ return this.parsePlaceholder("BlockStatement") || super.parseBlock(allowDirectives, createNewLexicalScope, afterBlockParse);
+ }
+ parseFunctionId(requireId) {
+ return this.parsePlaceholder("Identifier") || super.parseFunctionId(requireId);
+ }
+ parseClass(node, isStatement, optionalId) {
+ const type = isStatement ? "ClassDeclaration" : "ClassExpression";
+ this.next();
+ const oldStrict = this.state.strict;
+ const placeholder = this.parsePlaceholder("Identifier");
+ if (placeholder) {
+ if (this.match(81) || this.match(144) || this.match(5)) {
+ node.id = placeholder;
+ } else if (optionalId || !isStatement) {
+ node.id = null;
+ node.body = this.finishPlaceholder(placeholder, "ClassBody");
+ return this.finishNode(node, type);
+ } else {
+ throw this.raise(PlaceholderErrors.ClassNameIsRequired, {
+ at: this.state.startLoc
+ });
+ }
+ } else {
+ this.parseClassId(node, isStatement, optionalId);
+ }
+ super.parseClassSuper(node);
+ node.body = this.parsePlaceholder("ClassBody") || super.parseClassBody(!!node.superClass, oldStrict);
+ return this.finishNode(node, type);
+ }
+ parseExport(node, decorators) {
+ const placeholder = this.parsePlaceholder("Identifier");
+ if (!placeholder) return super.parseExport(node, decorators);
+ if (!this.isContextual(98) && !this.match(12)) {
+ node.specifiers = [];
+ node.source = null;
+ node.declaration = this.finishPlaceholder(placeholder, "Declaration");
+ return this.finishNode(node, "ExportNamedDeclaration");
+ }
+ this.expectPlugin("exportDefaultFrom");
+ const specifier = this.startNode();
+ specifier.exported = placeholder;
+ node.specifiers = [this.finishNode(specifier, "ExportDefaultSpecifier")];
+ return super.parseExport(node, decorators);
+ }
+ isExportDefaultSpecifier() {
+ if (this.match(65)) {
+ const next = this.nextTokenStart();
+ if (this.isUnparsedContextual(next, "from")) {
+ if (this.input.startsWith(tokenLabelName(144), this.nextTokenStartSince(next + 4))) {
+ return true;
+ }
+ }
+ }
+ return super.isExportDefaultSpecifier();
+ }
+ maybeParseExportDefaultSpecifier(node, maybeDefaultIdentifier) {
+ var _specifiers;
+ if ((_specifiers = node.specifiers) != null && _specifiers.length) {
+ return true;
+ }
+ return super.maybeParseExportDefaultSpecifier(node, maybeDefaultIdentifier);
+ }
+ checkExport(node) {
+ const {
+ specifiers
+ } = node;
+ if (specifiers != null && specifiers.length) {
+ node.specifiers = specifiers.filter(node => node.exported.type === "Placeholder");
+ }
+ super.checkExport(node);
+ node.specifiers = specifiers;
+ }
+ parseImport(node) {
+ const placeholder = this.parsePlaceholder("Identifier");
+ if (!placeholder) return super.parseImport(node);
+ node.specifiers = [];
+ if (!this.isContextual(98) && !this.match(12)) {
+ node.source = this.finishPlaceholder(placeholder, "StringLiteral");
+ this.semicolon();
+ return this.finishNode(node, "ImportDeclaration");
+ }
+ const specifier = this.startNodeAtNode(placeholder);
+ specifier.local = placeholder;
+ node.specifiers.push(this.finishNode(specifier, "ImportDefaultSpecifier"));
+ if (this.eat(12)) {
+ const hasStarImport = this.maybeParseStarImportSpecifier(node);
+ if (!hasStarImport) this.parseNamedImportSpecifiers(node);
+ }
+ this.expectContextual(98);
+ node.source = this.parseImportSource();
+ this.semicolon();
+ return this.finishNode(node, "ImportDeclaration");
+ }
+ parseImportSource() {
+ return this.parsePlaceholder("StringLiteral") || super.parseImportSource();
+ }
+ assertNoSpace() {
+ if (this.state.start > this.state.lastTokEndLoc.index) {
+ this.raise(PlaceholderErrors.UnexpectedSpace, {
+ at: this.state.lastTokEndLoc
+ });
+ }
+ }
+ };
+ var v8intrinsic = superClass => class V8IntrinsicMixin extends superClass {
+ parseV8Intrinsic() {
+ if (this.match(54)) {
+ const v8IntrinsicStartLoc = this.state.startLoc;
+ const node = this.startNode();
+ this.next();
+ if (tokenIsIdentifier(this.state.type)) {
+ const name = this.parseIdentifierName();
+ const identifier = this.createIdentifier(node, name);
+ identifier.type = "V8IntrinsicIdentifier";
+ if (this.match(10)) {
+ return identifier;
+ }
+ }
+ this.unexpected(v8IntrinsicStartLoc);
+ }
+ }
+ parseExprAtom(refExpressionErrors) {
+ return this.parseV8Intrinsic() || super.parseExprAtom(refExpressionErrors);
+ }
+ };
+ function hasPlugin(plugins, expectedConfig) {
+ const [expectedName, expectedOptions] = typeof expectedConfig === "string" ? [expectedConfig, {}] : expectedConfig;
+ const expectedKeys = Object.keys(expectedOptions);
+ const expectedOptionsIsEmpty = expectedKeys.length === 0;
+ return plugins.some(p => {
+ if (typeof p === "string") {
+ return expectedOptionsIsEmpty && p === expectedName;
+ } else {
+ const [pluginName, pluginOptions] = p;
+ if (pluginName !== expectedName) {
+ return false;
+ }
+ for (const key of expectedKeys) {
+ if (pluginOptions[key] !== expectedOptions[key]) {
+ return false;
+ }
+ }
+ return true;
+ }
+ });
+ }
+ function getPluginOption(plugins, name, option) {
+ const plugin = plugins.find(plugin => {
+ if (Array.isArray(plugin)) {
+ return plugin[0] === name;
+ } else {
+ return plugin === name;
+ }
+ });
+ if (plugin && Array.isArray(plugin) && plugin.length > 1) {
+ return plugin[1][option];
+ }
+ return null;
+ }
+ const PIPELINE_PROPOSALS = ["minimal", "fsharp", "hack", "smart"];
+ const TOPIC_TOKENS = ["^^", "@@", "^", "%", "#"];
+ const RECORD_AND_TUPLE_SYNTAX_TYPES = ["hash", "bar"];
+ function validatePlugins(plugins) {
+ if (hasPlugin(plugins, "decorators")) {
+ if (hasPlugin(plugins, "decorators-legacy")) {
+ throw new Error("Cannot use the decorators and decorators-legacy plugin together");
+ }
+ const decoratorsBeforeExport = getPluginOption(plugins, "decorators", "decoratorsBeforeExport");
+ if (decoratorsBeforeExport != null && typeof decoratorsBeforeExport !== "boolean") {
+ throw new Error("'decoratorsBeforeExport' must be a boolean, if specified.");
+ }
+ const allowCallParenthesized = getPluginOption(plugins, "decorators", "allowCallParenthesized");
+ if (allowCallParenthesized != null && typeof allowCallParenthesized !== "boolean") {
+ throw new Error("'allowCallParenthesized' must be a boolean.");
+ }
+ }
+ if (hasPlugin(plugins, "flow") && hasPlugin(plugins, "typescript")) {
+ throw new Error("Cannot combine flow and typescript plugins.");
+ }
+ if (hasPlugin(plugins, "placeholders") && hasPlugin(plugins, "v8intrinsic")) {
+ throw new Error("Cannot combine placeholders and v8intrinsic plugins.");
+ }
+ if (hasPlugin(plugins, "pipelineOperator")) {
+ const proposal = getPluginOption(plugins, "pipelineOperator", "proposal");
+ if (!PIPELINE_PROPOSALS.includes(proposal)) {
+ const proposalList = PIPELINE_PROPOSALS.map(p => `"${p}"`).join(", ");
+ throw new Error(`"pipelineOperator" requires "proposal" option whose value must be one of: ${proposalList}.`);
+ }
+ const tupleSyntaxIsHash = hasPlugin(plugins, ["recordAndTuple", {
+ syntaxType: "hash"
+ }]);
+ if (proposal === "hack") {
+ if (hasPlugin(plugins, "placeholders")) {
+ throw new Error("Cannot combine placeholders plugin and Hack-style pipes.");
+ }
+ if (hasPlugin(plugins, "v8intrinsic")) {
+ throw new Error("Cannot combine v8intrinsic plugin and Hack-style pipes.");
+ }
+ const topicToken = getPluginOption(plugins, "pipelineOperator", "topicToken");
+ if (!TOPIC_TOKENS.includes(topicToken)) {
+ const tokenList = TOPIC_TOKENS.map(t => `"${t}"`).join(", ");
+ throw new Error(`"pipelineOperator" in "proposal": "hack" mode also requires a "topicToken" option whose value must be one of: ${tokenList}.`);
+ }
+ if (topicToken === "#" && tupleSyntaxIsHash) {
+ throw new Error('Plugin conflict between `["pipelineOperator", { proposal: "hack", topicToken: "#" }]` and `["recordAndtuple", { syntaxType: "hash"}]`.');
+ }
+ } else if (proposal === "smart" && tupleSyntaxIsHash) {
+ throw new Error('Plugin conflict between `["pipelineOperator", { proposal: "smart" }]` and `["recordAndtuple", { syntaxType: "hash"}]`.');
+ }
+ }
+ if (hasPlugin(plugins, "moduleAttributes")) {
+ {
+ if (hasPlugin(plugins, "importAssertions") || hasPlugin(plugins, "importAttributes")) {
+ throw new Error("Cannot combine importAssertions, importAttributes and moduleAttributes plugins.");
+ }
+ const moduleAttributesVersionPluginOption = getPluginOption(plugins, "moduleAttributes", "version");
+ if (moduleAttributesVersionPluginOption !== "may-2020") {
+ throw new Error("The 'moduleAttributes' plugin requires a 'version' option," + " representing the last proposal update. Currently, the" + " only supported value is 'may-2020'.");
+ }
+ }
+ }
+ if (hasPlugin(plugins, "importAssertions") && hasPlugin(plugins, "importAttributes")) {
+ throw new Error("Cannot combine importAssertions and importAttributes plugins.");
+ }
+ if (hasPlugin(plugins, "recordAndTuple") && getPluginOption(plugins, "recordAndTuple", "syntaxType") != null && !RECORD_AND_TUPLE_SYNTAX_TYPES.includes(getPluginOption(plugins, "recordAndTuple", "syntaxType"))) {
+ throw new Error("The 'syntaxType' option of the 'recordAndTuple' plugin must be one of: " + RECORD_AND_TUPLE_SYNTAX_TYPES.map(p => `'${p}'`).join(", "));
+ }
+ if (hasPlugin(plugins, "asyncDoExpressions") && !hasPlugin(plugins, "doExpressions")) {
+ const error = new Error("'asyncDoExpressions' requires 'doExpressions', please add 'doExpressions' to parser plugins.");
+ error.missingPlugins = "doExpressions";
+ throw error;
+ }
+ if (hasPlugin(plugins, "optionalChainingAssign") && getPluginOption(plugins, "optionalChainingAssign", "version") !== "2023-07") {
+ throw new Error("The 'optionalChainingAssign' plugin requires a 'version' option," + " representing the last proposal update. Currently, the" + " only supported value is '2023-07'.");
+ }
+ }
+ const mixinPlugins = {
+ estree,
+ jsx,
+ flow,
+ typescript,
+ v8intrinsic,
+ placeholders
+ };
+ const mixinPluginNames = Object.keys(mixinPlugins);
+ const defaultOptions = {
+ sourceType: "script",
+ sourceFilename: undefined,
+ startColumn: 0,
+ startLine: 1,
+ allowAwaitOutsideFunction: false,
+ allowReturnOutsideFunction: false,
+ allowNewTargetOutsideFunction: false,
+ allowImportExportEverywhere: false,
+ allowSuperOutsideMethod: false,
+ allowUndeclaredExports: false,
+ plugins: [],
+ strictMode: null,
+ ranges: false,
+ tokens: false,
+ createImportExpressions: false,
+ createParenthesizedExpressions: false,
+ errorRecovery: false,
+ attachComment: true,
+ annexB: true
+ };
+ function getOptions(opts) {
+ if (opts == null) {
+ return Object.assign({}, defaultOptions);
+ }
+ if (opts.annexB != null && opts.annexB !== false) {
+ throw new Error("The `annexB` option can only be set to `false`.");
+ }
+ const options = {};
+ for (const key of Object.keys(defaultOptions)) {
+ var _opts$key;
+ options[key] = (_opts$key = opts[key]) != null ? _opts$key : defaultOptions[key];
+ }
+ return options;
+ }
+ class ExpressionParser extends LValParser {
+ checkProto(prop, isRecord, protoRef, refExpressionErrors) {
+ if (prop.type === "SpreadElement" || this.isObjectMethod(prop) || prop.computed || prop.shorthand) {
+ return;
+ }
+ const key = prop.key;
+ const name = key.type === "Identifier" ? key.name : key.value;
+ if (name === "__proto__") {
+ if (isRecord) {
+ this.raise(Errors.RecordNoProto, {
+ at: key
+ });
+ return;
+ }
+ if (protoRef.used) {
+ if (refExpressionErrors) {
+ if (refExpressionErrors.doubleProtoLoc === null) {
+ refExpressionErrors.doubleProtoLoc = key.loc.start;
+ }
+ } else {
+ this.raise(Errors.DuplicateProto, {
+ at: key
+ });
+ }
+ }
+ protoRef.used = true;
+ }
+ }
+ shouldExitDescending(expr, potentialArrowAt) {
+ return expr.type === "ArrowFunctionExpression" && expr.start === potentialArrowAt;
+ }
+ getExpression() {
+ this.enterInitialScopes();
+ this.nextToken();
+ const expr = this.parseExpression();
+ if (!this.match(139)) {
+ this.unexpected();
+ }
+ this.finalizeRemainingComments();
+ expr.comments = this.state.comments;
+ expr.errors = this.state.errors;
+ if (this.options.tokens) {
+ expr.tokens = this.tokens;
+ }
+ return expr;
+ }
+ parseExpression(disallowIn, refExpressionErrors) {
+ if (disallowIn) {
+ return this.disallowInAnd(() => this.parseExpressionBase(refExpressionErrors));
+ }
+ return this.allowInAnd(() => this.parseExpressionBase(refExpressionErrors));
+ }
+ parseExpressionBase(refExpressionErrors) {
+ const startLoc = this.state.startLoc;
+ const expr = this.parseMaybeAssign(refExpressionErrors);
+ if (this.match(12)) {
+ const node = this.startNodeAt(startLoc);
+ node.expressions = [expr];
+ while (this.eat(12)) {
+ node.expressions.push(this.parseMaybeAssign(refExpressionErrors));
+ }
+ this.toReferencedList(node.expressions);
+ return this.finishNode(node, "SequenceExpression");
+ }
+ return expr;
+ }
+ parseMaybeAssignDisallowIn(refExpressionErrors, afterLeftParse) {
+ return this.disallowInAnd(() => this.parseMaybeAssign(refExpressionErrors, afterLeftParse));
+ }
+ parseMaybeAssignAllowIn(refExpressionErrors, afterLeftParse) {
+ return this.allowInAnd(() => this.parseMaybeAssign(refExpressionErrors, afterLeftParse));
+ }
+ setOptionalParametersError(refExpressionErrors, resultError) {
+ var _resultError$loc;
+ refExpressionErrors.optionalParametersLoc = (_resultError$loc = resultError == null ? void 0 : resultError.loc) != null ? _resultError$loc : this.state.startLoc;
+ }
+ parseMaybeAssign(refExpressionErrors, afterLeftParse) {
+ const startLoc = this.state.startLoc;
+ if (this.isContextual(108)) {
+ if (this.prodParam.hasYield) {
+ let left = this.parseYield();
+ if (afterLeftParse) {
+ left = afterLeftParse.call(this, left, startLoc);
+ }
+ return left;
+ }
+ }
+ let ownExpressionErrors;
+ if (refExpressionErrors) {
+ ownExpressionErrors = false;
+ } else {
+ refExpressionErrors = new ExpressionErrors();
+ ownExpressionErrors = true;
+ }
+ const {
+ type
+ } = this.state;
+ if (type === 10 || tokenIsIdentifier(type)) {
+ this.state.potentialArrowAt = this.state.start;
+ }
+ let left = this.parseMaybeConditional(refExpressionErrors);
+ if (afterLeftParse) {
+ left = afterLeftParse.call(this, left, startLoc);
+ }
+ if (tokenIsAssignment(this.state.type)) {
+ const node = this.startNodeAt(startLoc);
+ const operator = this.state.value;
+ node.operator = operator;
+ if (this.match(29)) {
+ this.toAssignable(left, true);
+ node.left = left;
+ const startIndex = startLoc.index;
+ if (refExpressionErrors.doubleProtoLoc != null && refExpressionErrors.doubleProtoLoc.index >= startIndex) {
+ refExpressionErrors.doubleProtoLoc = null;
+ }
+ if (refExpressionErrors.shorthandAssignLoc != null && refExpressionErrors.shorthandAssignLoc.index >= startIndex) {
+ refExpressionErrors.shorthandAssignLoc = null;
+ }
+ if (refExpressionErrors.privateKeyLoc != null && refExpressionErrors.privateKeyLoc.index >= startIndex) {
+ this.checkDestructuringPrivate(refExpressionErrors);
+ refExpressionErrors.privateKeyLoc = null;
+ }
+ } else {
+ node.left = left;
+ }
+ this.next();
+ node.right = this.parseMaybeAssign();
+ this.checkLVal(left, {
+ in: this.finishNode(node, "AssignmentExpression")
+ });
+ return node;
+ } else if (ownExpressionErrors) {
+ this.checkExpressionErrors(refExpressionErrors, true);
+ }
+ return left;
+ }
+ parseMaybeConditional(refExpressionErrors) {
+ const startLoc = this.state.startLoc;
+ const potentialArrowAt = this.state.potentialArrowAt;
+ const expr = this.parseExprOps(refExpressionErrors);
+ if (this.shouldExitDescending(expr, potentialArrowAt)) {
+ return expr;
+ }
+ return this.parseConditional(expr, startLoc, refExpressionErrors);
+ }
+ parseConditional(expr, startLoc, refExpressionErrors) {
+ if (this.eat(17)) {
+ const node = this.startNodeAt(startLoc);
+ node.test = expr;
+ node.consequent = this.parseMaybeAssignAllowIn();
+ this.expect(14);
+ node.alternate = this.parseMaybeAssign();
+ return this.finishNode(node, "ConditionalExpression");
+ }
+ return expr;
+ }
+ parseMaybeUnaryOrPrivate(refExpressionErrors) {
+ return this.match(138) ? this.parsePrivateName() : this.parseMaybeUnary(refExpressionErrors);
+ }
+ parseExprOps(refExpressionErrors) {
+ const startLoc = this.state.startLoc;
+ const potentialArrowAt = this.state.potentialArrowAt;
+ const expr = this.parseMaybeUnaryOrPrivate(refExpressionErrors);
+ if (this.shouldExitDescending(expr, potentialArrowAt)) {
+ return expr;
+ }
+ return this.parseExprOp(expr, startLoc, -1);
+ }
+ parseExprOp(left, leftStartLoc, minPrec) {
+ if (this.isPrivateName(left)) {
+ const value = this.getPrivateNameSV(left);
+ if (minPrec >= tokenOperatorPrecedence(58) || !this.prodParam.hasIn || !this.match(58)) {
+ this.raise(Errors.PrivateInExpectedIn, {
+ at: left,
+ identifierName: value
+ });
+ }
+ this.classScope.usePrivateName(value, left.loc.start);
+ }
+ const op = this.state.type;
+ if (tokenIsOperator(op) && (this.prodParam.hasIn || !this.match(58))) {
+ let prec = tokenOperatorPrecedence(op);
+ if (prec > minPrec) {
+ if (op === 39) {
+ this.expectPlugin("pipelineOperator");
+ if (this.state.inFSharpPipelineDirectBody) {
+ return left;
+ }
+ this.checkPipelineAtInfixOperator(left, leftStartLoc);
+ }
+ const node = this.startNodeAt(leftStartLoc);
+ node.left = left;
+ node.operator = this.state.value;
+ const logical = op === 41 || op === 42;
+ const coalesce = op === 40;
+ if (coalesce) {
+ prec = tokenOperatorPrecedence(42);
+ }
+ this.next();
+ if (op === 39 && this.hasPlugin(["pipelineOperator", {
+ proposal: "minimal"
+ }])) {
+ if (this.state.type === 96 && this.prodParam.hasAwait) {
+ throw this.raise(Errors.UnexpectedAwaitAfterPipelineBody, {
+ at: this.state.startLoc
+ });
+ }
+ }
+ node.right = this.parseExprOpRightExpr(op, prec);
+ const finishedNode = this.finishNode(node, logical || coalesce ? "LogicalExpression" : "BinaryExpression");
+ const nextOp = this.state.type;
+ if (coalesce && (nextOp === 41 || nextOp === 42) || logical && nextOp === 40) {
+ throw this.raise(Errors.MixingCoalesceWithLogical, {
+ at: this.state.startLoc
+ });
+ }
+ return this.parseExprOp(finishedNode, leftStartLoc, minPrec);
+ }
+ }
+ return left;
+ }
+ parseExprOpRightExpr(op, prec) {
+ const startLoc = this.state.startLoc;
+ switch (op) {
+ case 39:
+ switch (this.getPluginOption("pipelineOperator", "proposal")) {
+ case "hack":
+ return this.withTopicBindingContext(() => {
+ return this.parseHackPipeBody();
+ });
+ case "smart":
+ return this.withTopicBindingContext(() => {
+ if (this.prodParam.hasYield && this.isContextual(108)) {
+ throw this.raise(Errors.PipeBodyIsTighter, {
+ at: this.state.startLoc
+ });
+ }
+ return this.parseSmartPipelineBodyInStyle(this.parseExprOpBaseRightExpr(op, prec), startLoc);
+ });
+ case "fsharp":
+ return this.withSoloAwaitPermittingContext(() => {
+ return this.parseFSharpPipelineBody(prec);
+ });
+ }
+ default:
+ return this.parseExprOpBaseRightExpr(op, prec);
+ }
+ }
+ parseExprOpBaseRightExpr(op, prec) {
+ const startLoc = this.state.startLoc;
+ return this.parseExprOp(this.parseMaybeUnaryOrPrivate(), startLoc, tokenIsRightAssociative(op) ? prec - 1 : prec);
+ }
+ parseHackPipeBody() {
+ var _body$extra;
+ const {
+ startLoc
+ } = this.state;
+ const body = this.parseMaybeAssign();
+ const requiredParentheses = UnparenthesizedPipeBodyDescriptions.has(body.type);
+ if (requiredParentheses && !((_body$extra = body.extra) != null && _body$extra.parenthesized)) {
+ this.raise(Errors.PipeUnparenthesizedBody, {
+ at: startLoc,
+ type: body.type
+ });
+ }
+ if (!this.topicReferenceWasUsedInCurrentContext()) {
+ this.raise(Errors.PipeTopicUnused, {
+ at: startLoc
+ });
+ }
+ return body;
+ }
+ checkExponentialAfterUnary(node) {
+ if (this.match(57)) {
+ this.raise(Errors.UnexpectedTokenUnaryExponentiation, {
+ at: node.argument
+ });
+ }
+ }
+ parseMaybeUnary(refExpressionErrors, sawUnary) {
+ const startLoc = this.state.startLoc;
+ const isAwait = this.isContextual(96);
+ if (isAwait && this.isAwaitAllowed()) {
+ this.next();
+ const expr = this.parseAwait(startLoc);
+ if (!sawUnary) this.checkExponentialAfterUnary(expr);
+ return expr;
+ }
+ const update = this.match(34);
+ const node = this.startNode();
+ if (tokenIsPrefix(this.state.type)) {
+ node.operator = this.state.value;
+ node.prefix = true;
+ if (this.match(72)) {
+ this.expectPlugin("throwExpressions");
+ }
+ const isDelete = this.match(89);
+ this.next();
+ node.argument = this.parseMaybeUnary(null, true);
+ this.checkExpressionErrors(refExpressionErrors, true);
+ if (this.state.strict && isDelete) {
+ const arg = node.argument;
+ if (arg.type === "Identifier") {
+ this.raise(Errors.StrictDelete, {
+ at: node
+ });
+ } else if (this.hasPropertyAsPrivateName(arg)) {
+ this.raise(Errors.DeletePrivateField, {
+ at: node
+ });
+ }
+ }
+ if (!update) {
+ if (!sawUnary) {
+ this.checkExponentialAfterUnary(node);
+ }
+ return this.finishNode(node, "UnaryExpression");
+ }
+ }
+ const expr = this.parseUpdate(node, update, refExpressionErrors);
+ if (isAwait) {
+ const {
+ type
+ } = this.state;
+ const startsExpr = this.hasPlugin("v8intrinsic") ? tokenCanStartExpression(type) : tokenCanStartExpression(type) && !this.match(54);
+ if (startsExpr && !this.isAmbiguousAwait()) {
+ this.raiseOverwrite(Errors.AwaitNotInAsyncContext, {
+ at: startLoc
+ });
+ return this.parseAwait(startLoc);
+ }
+ }
+ return expr;
+ }
+ parseUpdate(node, update, refExpressionErrors) {
+ if (update) {
+ const updateExpressionNode = node;
+ this.checkLVal(updateExpressionNode.argument, {
+ in: this.finishNode(updateExpressionNode, "UpdateExpression")
+ });
+ return node;
+ }
+ const startLoc = this.state.startLoc;
+ let expr = this.parseExprSubscripts(refExpressionErrors);
+ if (this.checkExpressionErrors(refExpressionErrors, false)) return expr;
+ while (tokenIsPostfix(this.state.type) && !this.canInsertSemicolon()) {
+ const node = this.startNodeAt(startLoc);
+ node.operator = this.state.value;
+ node.prefix = false;
+ node.argument = expr;
+ this.next();
+ this.checkLVal(expr, {
+ in: expr = this.finishNode(node, "UpdateExpression")
+ });
+ }
+ return expr;
+ }
+ parseExprSubscripts(refExpressionErrors) {
+ const startLoc = this.state.startLoc;
+ const potentialArrowAt = this.state.potentialArrowAt;
+ const expr = this.parseExprAtom(refExpressionErrors);
+ if (this.shouldExitDescending(expr, potentialArrowAt)) {
+ return expr;
+ }
+ return this.parseSubscripts(expr, startLoc);
+ }
+ parseSubscripts(base, startLoc, noCalls) {
+ const state = {
+ optionalChainMember: false,
+ maybeAsyncArrow: this.atPossibleAsyncArrow(base),
+ stop: false
+ };
+ do {
+ base = this.parseSubscript(base, startLoc, noCalls, state);
+ state.maybeAsyncArrow = false;
+ } while (!state.stop);
+ return base;
+ }
+ parseSubscript(base, startLoc, noCalls, state) {
+ const {
+ type
+ } = this.state;
+ if (!noCalls && type === 15) {
+ return this.parseBind(base, startLoc, noCalls, state);
+ } else if (tokenIsTemplate(type)) {
+ return this.parseTaggedTemplateExpression(base, startLoc, state);
+ }
+ let optional = false;
+ if (type === 18) {
+ if (noCalls) {
+ this.raise(Errors.OptionalChainingNoNew, {
+ at: this.state.startLoc
+ });
+ if (this.lookaheadCharCode() === 40) {
+ state.stop = true;
+ return base;
+ }
+ }
+ state.optionalChainMember = optional = true;
+ this.next();
+ }
+ if (!noCalls && this.match(10)) {
+ return this.parseCoverCallAndAsyncArrowHead(base, startLoc, state, optional);
+ } else {
+ const computed = this.eat(0);
+ if (computed || optional || this.eat(16)) {
+ return this.parseMember(base, startLoc, state, computed, optional);
+ } else {
+ state.stop = true;
+ return base;
+ }
+ }
+ }
+ parseMember(base, startLoc, state, computed, optional) {
+ const node = this.startNodeAt(startLoc);
+ node.object = base;
+ node.computed = computed;
+ if (computed) {
+ node.property = this.parseExpression();
+ this.expect(3);
+ } else if (this.match(138)) {
+ if (base.type === "Super") {
+ this.raise(Errors.SuperPrivateField, {
+ at: startLoc
+ });
+ }
+ this.classScope.usePrivateName(this.state.value, this.state.startLoc);
+ node.property = this.parsePrivateName();
+ } else {
+ node.property = this.parseIdentifier(true);
+ }
+ if (state.optionalChainMember) {
+ node.optional = optional;
+ return this.finishNode(node, "OptionalMemberExpression");
+ } else {
+ return this.finishNode(node, "MemberExpression");
+ }
+ }
+ parseBind(base, startLoc, noCalls, state) {
+ const node = this.startNodeAt(startLoc);
+ node.object = base;
+ this.next();
+ node.callee = this.parseNoCallExpr();
+ state.stop = true;
+ return this.parseSubscripts(this.finishNode(node, "BindExpression"), startLoc, noCalls);
+ }
+ parseCoverCallAndAsyncArrowHead(base, startLoc, state, optional) {
+ const oldMaybeInArrowParameters = this.state.maybeInArrowParameters;
+ let refExpressionErrors = null;
+ this.state.maybeInArrowParameters = true;
+ this.next();
+ const node = this.startNodeAt(startLoc);
+ node.callee = base;
+ const {
+ maybeAsyncArrow,
+ optionalChainMember
+ } = state;
+ if (maybeAsyncArrow) {
+ this.expressionScope.enter(newAsyncArrowScope());
+ refExpressionErrors = new ExpressionErrors();
+ }
+ if (optionalChainMember) {
+ node.optional = optional;
+ }
+ if (optional) {
+ node.arguments = this.parseCallExpressionArguments(11);
+ } else {
+ node.arguments = this.parseCallExpressionArguments(11, base.type === "Import", base.type !== "Super", node, refExpressionErrors);
+ }
+ let finishedNode = this.finishCallExpression(node, optionalChainMember);
+ if (maybeAsyncArrow && this.shouldParseAsyncArrow() && !optional) {
+ state.stop = true;
+ this.checkDestructuringPrivate(refExpressionErrors);
+ this.expressionScope.validateAsPattern();
+ this.expressionScope.exit();
+ finishedNode = this.parseAsyncArrowFromCallExpression(this.startNodeAt(startLoc), finishedNode);
+ } else {
+ if (maybeAsyncArrow) {
+ this.checkExpressionErrors(refExpressionErrors, true);
+ this.expressionScope.exit();
+ }
+ this.toReferencedArguments(finishedNode);
+ }
+ this.state.maybeInArrowParameters = oldMaybeInArrowParameters;
+ return finishedNode;
+ }
+ toReferencedArguments(node, isParenthesizedExpr) {
+ this.toReferencedListDeep(node.arguments, isParenthesizedExpr);
+ }
+ parseTaggedTemplateExpression(base, startLoc, state) {
+ const node = this.startNodeAt(startLoc);
+ node.tag = base;
+ node.quasi = this.parseTemplate(true);
+ if (state.optionalChainMember) {
+ this.raise(Errors.OptionalChainingNoTemplate, {
+ at: startLoc
+ });
+ }
+ return this.finishNode(node, "TaggedTemplateExpression");
+ }
+ atPossibleAsyncArrow(base) {
+ return base.type === "Identifier" && base.name === "async" && this.state.lastTokEndLoc.index === base.end && !this.canInsertSemicolon() && base.end - base.start === 5 && base.start === this.state.potentialArrowAt;
+ }
+ expectImportAttributesPlugin() {
+ if (!this.hasPlugin("importAssertions")) {
+ this.expectPlugin("importAttributes");
+ }
+ }
+ finishCallExpression(node, optional) {
+ if (node.callee.type === "Import") {
+ if (node.arguments.length === 2) {
+ {
+ if (!this.hasPlugin("moduleAttributes")) {
+ this.expectImportAttributesPlugin();
+ }
+ }
+ }
+ if (node.arguments.length === 0 || node.arguments.length > 2) {
+ this.raise(Errors.ImportCallArity, {
+ at: node,
+ maxArgumentCount: this.hasPlugin("importAttributes") || this.hasPlugin("importAssertions") || this.hasPlugin("moduleAttributes") ? 2 : 1
+ });
+ } else {
+ for (const arg of node.arguments) {
+ if (arg.type === "SpreadElement") {
+ this.raise(Errors.ImportCallSpreadArgument, {
+ at: arg
+ });
+ }
+ }
+ }
+ }
+ return this.finishNode(node, optional ? "OptionalCallExpression" : "CallExpression");
+ }
+ parseCallExpressionArguments(close, dynamicImport, allowPlaceholder, nodeForExtra, refExpressionErrors) {
+ const elts = [];
+ let first = true;
+ const oldInFSharpPipelineDirectBody = this.state.inFSharpPipelineDirectBody;
+ this.state.inFSharpPipelineDirectBody = false;
+ while (!this.eat(close)) {
+ if (first) {
+ first = false;
+ } else {
+ this.expect(12);
+ if (this.match(close)) {
+ if (dynamicImport && !this.hasPlugin("importAttributes") && !this.hasPlugin("importAssertions") && !this.hasPlugin("moduleAttributes")) {
+ this.raise(Errors.ImportCallArgumentTrailingComma, {
+ at: this.state.lastTokStartLoc
+ });
+ }
+ if (nodeForExtra) {
+ this.addTrailingCommaExtraToNode(nodeForExtra);
+ }
+ this.next();
+ break;
+ }
+ }
+ elts.push(this.parseExprListItem(false, refExpressionErrors, allowPlaceholder));
+ }
+ this.state.inFSharpPipelineDirectBody = oldInFSharpPipelineDirectBody;
+ return elts;
+ }
+ shouldParseAsyncArrow() {
+ return this.match(19) && !this.canInsertSemicolon();
+ }
+ parseAsyncArrowFromCallExpression(node, call) {
+ var _call$extra;
+ this.resetPreviousNodeTrailingComments(call);
+ this.expect(19);
+ this.parseArrowExpression(node, call.arguments, true, (_call$extra = call.extra) == null ? void 0 : _call$extra.trailingCommaLoc);
+ if (call.innerComments) {
+ setInnerComments(node, call.innerComments);
+ }
+ if (call.callee.trailingComments) {
+ setInnerComments(node, call.callee.trailingComments);
+ }
+ return node;
+ }
+ parseNoCallExpr() {
+ const startLoc = this.state.startLoc;
+ return this.parseSubscripts(this.parseExprAtom(), startLoc, true);
+ }
+ parseExprAtom(refExpressionErrors) {
+ let node;
+ let decorators = null;
+ const {
+ type
+ } = this.state;
+ switch (type) {
+ case 79:
+ return this.parseSuper();
+ case 83:
+ node = this.startNode();
+ this.next();
+ if (this.match(16)) {
+ return this.parseImportMetaProperty(node);
+ }
+ if (this.match(10)) {
+ if (this.options.createImportExpressions) {
+ return this.parseImportCall(node);
+ } else {
+ return this.finishNode(node, "Import");
+ }
+ } else {
+ this.raise(Errors.UnsupportedImport, {
+ at: this.state.lastTokStartLoc
+ });
+ return this.finishNode(node, "Import");
+ }
+ case 78:
+ node = this.startNode();
+ this.next();
+ return this.finishNode(node, "ThisExpression");
+ case 90:
+ {
+ return this.parseDo(this.startNode(), false);
+ }
+ case 56:
+ case 31:
+ {
+ this.readRegexp();
+ return this.parseRegExpLiteral(this.state.value);
+ }
+ case 134:
+ return this.parseNumericLiteral(this.state.value);
+ case 135:
+ return this.parseBigIntLiteral(this.state.value);
+ case 136:
+ return this.parseDecimalLiteral(this.state.value);
+ case 133:
+ return this.parseStringLiteral(this.state.value);
+ case 84:
+ return this.parseNullLiteral();
+ case 85:
+ return this.parseBooleanLiteral(true);
+ case 86:
+ return this.parseBooleanLiteral(false);
+ case 10:
+ {
+ const canBeArrow = this.state.potentialArrowAt === this.state.start;
+ return this.parseParenAndDistinguishExpression(canBeArrow);
+ }
+ case 2:
+ case 1:
+ {
+ return this.parseArrayLike(this.state.type === 2 ? 4 : 3, false, true);
+ }
+ case 0:
+ {
+ return this.parseArrayLike(3, true, false, refExpressionErrors);
+ }
+ case 6:
+ case 7:
+ {
+ return this.parseObjectLike(this.state.type === 6 ? 9 : 8, false, true);
+ }
+ case 5:
+ {
+ return this.parseObjectLike(8, false, false, refExpressionErrors);
+ }
+ case 68:
+ return this.parseFunctionOrFunctionSent();
+ case 26:
+ decorators = this.parseDecorators();
+ case 80:
+ return this.parseClass(this.maybeTakeDecorators(decorators, this.startNode()), false);
+ case 77:
+ return this.parseNewOrNewTarget();
+ case 25:
+ case 24:
+ return this.parseTemplate(false);
+ case 15:
+ {
+ node = this.startNode();
+ this.next();
+ node.object = null;
+ const callee = node.callee = this.parseNoCallExpr();
+ if (callee.type === "MemberExpression") {
+ return this.finishNode(node, "BindExpression");
+ } else {
+ throw this.raise(Errors.UnsupportedBind, {
+ at: callee
+ });
+ }
+ }
+ case 138:
+ {
+ this.raise(Errors.PrivateInExpectedIn, {
+ at: this.state.startLoc,
+ identifierName: this.state.value
+ });
+ return this.parsePrivateName();
+ }
+ case 33:
+ {
+ return this.parseTopicReferenceThenEqualsSign(54, "%");
+ }
+ case 32:
+ {
+ return this.parseTopicReferenceThenEqualsSign(44, "^");
+ }
+ case 37:
+ case 38:
+ {
+ return this.parseTopicReference("hack");
+ }
+ case 44:
+ case 54:
+ case 27:
+ {
+ const pipeProposal = this.getPluginOption("pipelineOperator", "proposal");
+ if (pipeProposal) {
+ return this.parseTopicReference(pipeProposal);
+ }
+ this.unexpected();
+ break;
+ }
+ case 47:
+ {
+ const lookaheadCh = this.input.codePointAt(this.nextTokenStart());
+ if (isIdentifierStart(lookaheadCh) || lookaheadCh === 62) {
+ this.expectOnePlugin(["jsx", "flow", "typescript"]);
+ } else {
+ this.unexpected();
+ }
+ break;
+ }
+ default:
+ if (tokenIsIdentifier(type)) {
+ if (this.isContextual(127) && this.lookaheadInLineCharCode() === 123) {
+ return this.parseModuleExpression();
+ }
+ const canBeArrow = this.state.potentialArrowAt === this.state.start;
+ const containsEsc = this.state.containsEsc;
+ const id = this.parseIdentifier();
+ if (!containsEsc && id.name === "async" && !this.canInsertSemicolon()) {
+ const {
+ type
+ } = this.state;
+ if (type === 68) {
+ this.resetPreviousNodeTrailingComments(id);
+ this.next();
+ return this.parseAsyncFunctionExpression(this.startNodeAtNode(id));
+ } else if (tokenIsIdentifier(type)) {
+ if (this.lookaheadCharCode() === 61) {
+ return this.parseAsyncArrowUnaryFunction(this.startNodeAtNode(id));
+ } else {
+ return id;
+ }
+ } else if (type === 90) {
+ this.resetPreviousNodeTrailingComments(id);
+ return this.parseDo(this.startNodeAtNode(id), true);
+ }
+ }
+ if (canBeArrow && this.match(19) && !this.canInsertSemicolon()) {
+ this.next();
+ return this.parseArrowExpression(this.startNodeAtNode(id), [id], false);
+ }
+ return id;
+ } else {
+ this.unexpected();
+ }
+ }
+ }
+ parseTopicReferenceThenEqualsSign(topicTokenType, topicTokenValue) {
+ const pipeProposal = this.getPluginOption("pipelineOperator", "proposal");
+ if (pipeProposal) {
+ this.state.type = topicTokenType;
+ this.state.value = topicTokenValue;
+ this.state.pos--;
+ this.state.end--;
+ this.state.endLoc = createPositionWithColumnOffset(this.state.endLoc, -1);
+ return this.parseTopicReference(pipeProposal);
+ } else {
+ this.unexpected();
+ }
+ }
+ parseTopicReference(pipeProposal) {
+ const node = this.startNode();
+ const startLoc = this.state.startLoc;
+ const tokenType = this.state.type;
+ this.next();
+ return this.finishTopicReference(node, startLoc, pipeProposal, tokenType);
+ }
+ finishTopicReference(node, startLoc, pipeProposal, tokenType) {
+ if (this.testTopicReferenceConfiguration(pipeProposal, startLoc, tokenType)) {
+ const nodeType = pipeProposal === "smart" ? "PipelinePrimaryTopicReference" : "TopicReference";
+ if (!this.topicReferenceIsAllowedInCurrentContext()) {
+ this.raise(pipeProposal === "smart" ? Errors.PrimaryTopicNotAllowed : Errors.PipeTopicUnbound, {
+ at: startLoc
+ });
+ }
+ this.registerTopicReference();
+ return this.finishNode(node, nodeType);
+ } else {
+ throw this.raise(Errors.PipeTopicUnconfiguredToken, {
+ at: startLoc,
+ token: tokenLabelName(tokenType)
+ });
+ }
+ }
+ testTopicReferenceConfiguration(pipeProposal, startLoc, tokenType) {
+ switch (pipeProposal) {
+ case "hack":
+ {
+ return this.hasPlugin(["pipelineOperator", {
+ topicToken: tokenLabelName(tokenType)
+ }]);
+ }
+ case "smart":
+ return tokenType === 27;
+ default:
+ throw this.raise(Errors.PipeTopicRequiresHackPipes, {
+ at: startLoc
+ });
+ }
+ }
+ parseAsyncArrowUnaryFunction(node) {
+ this.prodParam.enter(functionFlags(true, this.prodParam.hasYield));
+ const params = [this.parseIdentifier()];
+ this.prodParam.exit();
+ if (this.hasPrecedingLineBreak()) {
+ this.raise(Errors.LineTerminatorBeforeArrow, {
+ at: this.state.curPosition()
+ });
+ }
+ this.expect(19);
+ return this.parseArrowExpression(node, params, true);
+ }
+ parseDo(node, isAsync) {
+ this.expectPlugin("doExpressions");
+ if (isAsync) {
+ this.expectPlugin("asyncDoExpressions");
+ }
+ node.async = isAsync;
+ this.next();
+ const oldLabels = this.state.labels;
+ this.state.labels = [];
+ if (isAsync) {
+ this.prodParam.enter(PARAM_AWAIT);
+ node.body = this.parseBlock();
+ this.prodParam.exit();
+ } else {
+ node.body = this.parseBlock();
+ }
+ this.state.labels = oldLabels;
+ return this.finishNode(node, "DoExpression");
+ }
+ parseSuper() {
+ const node = this.startNode();
+ this.next();
+ if (this.match(10) && !this.scope.allowDirectSuper && !this.options.allowSuperOutsideMethod) {
+ this.raise(Errors.SuperNotAllowed, {
+ at: node
+ });
+ } else if (!this.scope.allowSuper && !this.options.allowSuperOutsideMethod) {
+ this.raise(Errors.UnexpectedSuper, {
+ at: node
+ });
+ }
+ if (!this.match(10) && !this.match(0) && !this.match(16)) {
+ this.raise(Errors.UnsupportedSuper, {
+ at: node
+ });
+ }
+ return this.finishNode(node, "Super");
+ }
+ parsePrivateName() {
+ const node = this.startNode();
+ const id = this.startNodeAt(createPositionWithColumnOffset(this.state.startLoc, 1));
+ const name = this.state.value;
+ this.next();
+ node.id = this.createIdentifier(id, name);
+ return this.finishNode(node, "PrivateName");
+ }
+ parseFunctionOrFunctionSent() {
+ const node = this.startNode();
+ this.next();
+ if (this.prodParam.hasYield && this.match(16)) {
+ const meta = this.createIdentifier(this.startNodeAtNode(node), "function");
+ this.next();
+ if (this.match(103)) {
+ this.expectPlugin("functionSent");
+ } else if (!this.hasPlugin("functionSent")) {
+ this.unexpected();
+ }
+ return this.parseMetaProperty(node, meta, "sent");
+ }
+ return this.parseFunction(node);
+ }
+ parseMetaProperty(node, meta, propertyName) {
+ node.meta = meta;
+ const containsEsc = this.state.containsEsc;
+ node.property = this.parseIdentifier(true);
+ if (node.property.name !== propertyName || containsEsc) {
+ this.raise(Errors.UnsupportedMetaProperty, {
+ at: node.property,
+ target: meta.name,
+ onlyValidPropertyName: propertyName
+ });
+ }
+ return this.finishNode(node, "MetaProperty");
+ }
+ parseImportMetaProperty(node) {
+ const id = this.createIdentifier(this.startNodeAtNode(node), "import");
+ this.next();
+ if (this.isContextual(101)) {
+ if (!this.inModule) {
+ this.raise(Errors.ImportMetaOutsideModule, {
+ at: id
+ });
+ }
+ this.sawUnambiguousESM = true;
+ } else if (this.isContextual(105) || this.isContextual(97)) {
+ const isSource = this.isContextual(105);
+ if (!isSource) this.unexpected();
+ this.expectPlugin(isSource ? "sourcePhaseImports" : "deferredImportEvaluation");
+ if (!this.options.createImportExpressions) {
+ throw this.raise(Errors.DynamicImportPhaseRequiresImportExpressions, {
+ at: this.state.startLoc,
+ phase: this.state.value
+ });
+ }
+ this.next();
+ node.phase = isSource ? "source" : "defer";
+ return this.parseImportCall(node);
+ }
+ return this.parseMetaProperty(node, id, "meta");
+ }
+ parseLiteralAtNode(value, type, node) {
+ this.addExtra(node, "rawValue", value);
+ this.addExtra(node, "raw", this.input.slice(node.start, this.state.end));
+ node.value = value;
+ this.next();
+ return this.finishNode(node, type);
+ }
+ parseLiteral(value, type) {
+ const node = this.startNode();
+ return this.parseLiteralAtNode(value, type, node);
+ }
+ parseStringLiteral(value) {
+ return this.parseLiteral(value, "StringLiteral");
+ }
+ parseNumericLiteral(value) {
+ return this.parseLiteral(value, "NumericLiteral");
+ }
+ parseBigIntLiteral(value) {
+ return this.parseLiteral(value, "BigIntLiteral");
+ }
+ parseDecimalLiteral(value) {
+ return this.parseLiteral(value, "DecimalLiteral");
+ }
+ parseRegExpLiteral(value) {
+ const node = this.parseLiteral(value.value, "RegExpLiteral");
+ node.pattern = value.pattern;
+ node.flags = value.flags;
+ return node;
+ }
+ parseBooleanLiteral(value) {
+ const node = this.startNode();
+ node.value = value;
+ this.next();
+ return this.finishNode(node, "BooleanLiteral");
+ }
+ parseNullLiteral() {
+ const node = this.startNode();
+ this.next();
+ return this.finishNode(node, "NullLiteral");
+ }
+ parseParenAndDistinguishExpression(canBeArrow) {
+ const startLoc = this.state.startLoc;
+ let val;
+ this.next();
+ this.expressionScope.enter(newArrowHeadScope());
+ const oldMaybeInArrowParameters = this.state.maybeInArrowParameters;
+ const oldInFSharpPipelineDirectBody = this.state.inFSharpPipelineDirectBody;
+ this.state.maybeInArrowParameters = true;
+ this.state.inFSharpPipelineDirectBody = false;
+ const innerStartLoc = this.state.startLoc;
+ const exprList = [];
+ const refExpressionErrors = new ExpressionErrors();
+ let first = true;
+ let spreadStartLoc;
+ let optionalCommaStartLoc;
+ while (!this.match(11)) {
+ if (first) {
+ first = false;
+ } else {
+ this.expect(12, refExpressionErrors.optionalParametersLoc === null ? null : refExpressionErrors.optionalParametersLoc);
+ if (this.match(11)) {
+ optionalCommaStartLoc = this.state.startLoc;
+ break;
+ }
+ }
+ if (this.match(21)) {
+ const spreadNodeStartLoc = this.state.startLoc;
+ spreadStartLoc = this.state.startLoc;
+ exprList.push(this.parseParenItem(this.parseRestBinding(), spreadNodeStartLoc));
+ if (!this.checkCommaAfterRest(41)) {
+ break;
+ }
+ } else {
+ exprList.push(this.parseMaybeAssignAllowIn(refExpressionErrors, this.parseParenItem));
+ }
+ }
+ const innerEndLoc = this.state.lastTokEndLoc;
+ this.expect(11);
+ this.state.maybeInArrowParameters = oldMaybeInArrowParameters;
+ this.state.inFSharpPipelineDirectBody = oldInFSharpPipelineDirectBody;
+ let arrowNode = this.startNodeAt(startLoc);
+ if (canBeArrow && this.shouldParseArrow(exprList) && (arrowNode = this.parseArrow(arrowNode))) {
+ this.checkDestructuringPrivate(refExpressionErrors);
+ this.expressionScope.validateAsPattern();
+ this.expressionScope.exit();
+ this.parseArrowExpression(arrowNode, exprList, false);
+ return arrowNode;
+ }
+ this.expressionScope.exit();
+ if (!exprList.length) {
+ this.unexpected(this.state.lastTokStartLoc);
+ }
+ if (optionalCommaStartLoc) this.unexpected(optionalCommaStartLoc);
+ if (spreadStartLoc) this.unexpected(spreadStartLoc);
+ this.checkExpressionErrors(refExpressionErrors, true);
+ this.toReferencedListDeep(exprList, true);
+ if (exprList.length > 1) {
+ val = this.startNodeAt(innerStartLoc);
+ val.expressions = exprList;
+ this.finishNode(val, "SequenceExpression");
+ this.resetEndLocation(val, innerEndLoc);
+ } else {
+ val = exprList[0];
+ }
+ return this.wrapParenthesis(startLoc, val);
+ }
+ wrapParenthesis(startLoc, expression) {
+ if (!this.options.createParenthesizedExpressions) {
+ this.addExtra(expression, "parenthesized", true);
+ this.addExtra(expression, "parenStart", startLoc.index);
+ this.takeSurroundingComments(expression, startLoc.index, this.state.lastTokEndLoc.index);
+ return expression;
+ }
+ const parenExpression = this.startNodeAt(startLoc);
+ parenExpression.expression = expression;
+ return this.finishNode(parenExpression, "ParenthesizedExpression");
+ }
+ shouldParseArrow(params) {
+ return !this.canInsertSemicolon();
+ }
+ parseArrow(node) {
+ if (this.eat(19)) {
+ return node;
+ }
+ }
+ parseParenItem(node, startLoc) {
+ return node;
+ }
+ parseNewOrNewTarget() {
+ const node = this.startNode();
+ this.next();
+ if (this.match(16)) {
+ const meta = this.createIdentifier(this.startNodeAtNode(node), "new");
+ this.next();
+ const metaProp = this.parseMetaProperty(node, meta, "target");
+ if (!this.scope.inNonArrowFunction && !this.scope.inClass && !this.options.allowNewTargetOutsideFunction) {
+ this.raise(Errors.UnexpectedNewTarget, {
+ at: metaProp
+ });
+ }
+ return metaProp;
+ }
+ return this.parseNew(node);
+ }
+ parseNew(node) {
+ this.parseNewCallee(node);
+ if (this.eat(10)) {
+ const args = this.parseExprList(11);
+ this.toReferencedList(args);
+ node.arguments = args;
+ } else {
+ node.arguments = [];
+ }
+ return this.finishNode(node, "NewExpression");
+ }
+ parseNewCallee(node) {
+ const isImport = this.match(83);
+ const callee = this.parseNoCallExpr();
+ node.callee = callee;
+ if (isImport && (callee.type === "Import" || callee.type === "ImportExpression")) {
+ this.raise(Errors.ImportCallNotNewExpression, {
+ at: callee
+ });
+ }
+ }
+ parseTemplateElement(isTagged) {
+ const {
+ start,
+ startLoc,
+ end,
+ value
+ } = this.state;
+ const elemStart = start + 1;
+ const elem = this.startNodeAt(createPositionWithColumnOffset(startLoc, 1));
+ if (value === null) {
+ if (!isTagged) {
+ this.raise(Errors.InvalidEscapeSequenceTemplate, {
+ at: createPositionWithColumnOffset(this.state.firstInvalidTemplateEscapePos, 1)
+ });
+ }
+ }
+ const isTail = this.match(24);
+ const endOffset = isTail ? -1 : -2;
+ const elemEnd = end + endOffset;
+ elem.value = {
+ raw: this.input.slice(elemStart, elemEnd).replace(/\r\n?/g, "\n"),
+ cooked: value === null ? null : value.slice(1, endOffset)
+ };
+ elem.tail = isTail;
+ this.next();
+ const finishedNode = this.finishNode(elem, "TemplateElement");
+ this.resetEndLocation(finishedNode, createPositionWithColumnOffset(this.state.lastTokEndLoc, endOffset));
+ return finishedNode;
+ }
+ parseTemplate(isTagged) {
+ const node = this.startNode();
+ node.expressions = [];
+ let curElt = this.parseTemplateElement(isTagged);
+ node.quasis = [curElt];
+ while (!curElt.tail) {
+ node.expressions.push(this.parseTemplateSubstitution());
+ this.readTemplateContinuation();
+ node.quasis.push(curElt = this.parseTemplateElement(isTagged));
+ }
+ return this.finishNode(node, "TemplateLiteral");
+ }
+ parseTemplateSubstitution() {
+ return this.parseExpression();
+ }
+ parseObjectLike(close, isPattern, isRecord, refExpressionErrors) {
+ if (isRecord) {
+ this.expectPlugin("recordAndTuple");
+ }
+ const oldInFSharpPipelineDirectBody = this.state.inFSharpPipelineDirectBody;
+ this.state.inFSharpPipelineDirectBody = false;
+ const propHash = Object.create(null);
+ let first = true;
+ const node = this.startNode();
+ node.properties = [];
+ this.next();
+ while (!this.match(close)) {
+ if (first) {
+ first = false;
+ } else {
+ this.expect(12);
+ if (this.match(close)) {
+ this.addTrailingCommaExtraToNode(node);
+ break;
+ }
+ }
+ let prop;
+ if (isPattern) {
+ prop = this.parseBindingProperty();
+ } else {
+ prop = this.parsePropertyDefinition(refExpressionErrors);
+ this.checkProto(prop, isRecord, propHash, refExpressionErrors);
+ }
+ if (isRecord && !this.isObjectProperty(prop) && prop.type !== "SpreadElement") {
+ this.raise(Errors.InvalidRecordProperty, {
+ at: prop
+ });
+ }
+ if (prop.shorthand) {
+ this.addExtra(prop, "shorthand", true);
+ }
+ node.properties.push(prop);
+ }
+ this.next();
+ this.state.inFSharpPipelineDirectBody = oldInFSharpPipelineDirectBody;
+ let type = "ObjectExpression";
+ if (isPattern) {
+ type = "ObjectPattern";
+ } else if (isRecord) {
+ type = "RecordExpression";
+ }
+ return this.finishNode(node, type);
+ }
+ addTrailingCommaExtraToNode(node) {
+ this.addExtra(node, "trailingComma", this.state.lastTokStart);
+ this.addExtra(node, "trailingCommaLoc", this.state.lastTokStartLoc, false);
+ }
+ maybeAsyncOrAccessorProp(prop) {
+ return !prop.computed && prop.key.type === "Identifier" && (this.isLiteralPropertyName() || this.match(0) || this.match(55));
+ }
+ parsePropertyDefinition(refExpressionErrors) {
+ let decorators = [];
+ if (this.match(26)) {
+ if (this.hasPlugin("decorators")) {
+ this.raise(Errors.UnsupportedPropertyDecorator, {
+ at: this.state.startLoc
+ });
+ }
+ while (this.match(26)) {
+ decorators.push(this.parseDecorator());
+ }
+ }
+ const prop = this.startNode();
+ let isAsync = false;
+ let isAccessor = false;
+ let startLoc;
+ if (this.match(21)) {
+ if (decorators.length) this.unexpected();
+ return this.parseSpread();
+ }
+ if (decorators.length) {
+ prop.decorators = decorators;
+ decorators = [];
+ }
+ prop.method = false;
+ if (refExpressionErrors) {
+ startLoc = this.state.startLoc;
+ }
+ let isGenerator = this.eat(55);
+ this.parsePropertyNamePrefixOperator(prop);
+ const containsEsc = this.state.containsEsc;
+ const key = this.parsePropertyName(prop, refExpressionErrors);
+ if (!isGenerator && !containsEsc && this.maybeAsyncOrAccessorProp(prop)) {
+ const keyName = key.name;
+ if (keyName === "async" && !this.hasPrecedingLineBreak()) {
+ isAsync = true;
+ this.resetPreviousNodeTrailingComments(key);
+ isGenerator = this.eat(55);
+ this.parsePropertyName(prop);
+ }
+ if (keyName === "get" || keyName === "set") {
+ isAccessor = true;
+ this.resetPreviousNodeTrailingComments(key);
+ prop.kind = keyName;
+ if (this.match(55)) {
+ isGenerator = true;
+ this.raise(Errors.AccessorIsGenerator, {
+ at: this.state.curPosition(),
+ kind: keyName
+ });
+ this.next();
+ }
+ this.parsePropertyName(prop);
+ }
+ }
+ return this.parseObjPropValue(prop, startLoc, isGenerator, isAsync, false, isAccessor, refExpressionErrors);
+ }
+ getGetterSetterExpectedParamCount(method) {
+ return method.kind === "get" ? 0 : 1;
+ }
+ getObjectOrClassMethodParams(method) {
+ return method.params;
+ }
+ checkGetterSetterParams(method) {
+ var _params;
+ const paramCount = this.getGetterSetterExpectedParamCount(method);
+ const params = this.getObjectOrClassMethodParams(method);
+ if (params.length !== paramCount) {
+ this.raise(method.kind === "get" ? Errors.BadGetterArity : Errors.BadSetterArity, {
+ at: method
+ });
+ }
+ if (method.kind === "set" && ((_params = params[params.length - 1]) == null ? void 0 : _params.type) === "RestElement") {
+ this.raise(Errors.BadSetterRestParameter, {
+ at: method
+ });
+ }
+ }
+ parseObjectMethod(prop, isGenerator, isAsync, isPattern, isAccessor) {
+ if (isAccessor) {
+ const finishedProp = this.parseMethod(prop, isGenerator, false, false, false, "ObjectMethod");
+ this.checkGetterSetterParams(finishedProp);
+ return finishedProp;
+ }
+ if (isAsync || isGenerator || this.match(10)) {
+ if (isPattern) this.unexpected();
+ prop.kind = "method";
+ prop.method = true;
+ return this.parseMethod(prop, isGenerator, isAsync, false, false, "ObjectMethod");
+ }
+ }
+ parseObjectProperty(prop, startLoc, isPattern, refExpressionErrors) {
+ prop.shorthand = false;
+ if (this.eat(14)) {
+ prop.value = isPattern ? this.parseMaybeDefault(this.state.startLoc) : this.parseMaybeAssignAllowIn(refExpressionErrors);
+ return this.finishNode(prop, "ObjectProperty");
+ }
+ if (!prop.computed && prop.key.type === "Identifier") {
+ this.checkReservedWord(prop.key.name, prop.key.loc.start, true, false);
+ if (isPattern) {
+ prop.value = this.parseMaybeDefault(startLoc, cloneIdentifier(prop.key));
+ } else if (this.match(29)) {
+ const shorthandAssignLoc = this.state.startLoc;
+ if (refExpressionErrors != null) {
+ if (refExpressionErrors.shorthandAssignLoc === null) {
+ refExpressionErrors.shorthandAssignLoc = shorthandAssignLoc;
+ }
+ } else {
+ this.raise(Errors.InvalidCoverInitializedName, {
+ at: shorthandAssignLoc
+ });
+ }
+ prop.value = this.parseMaybeDefault(startLoc, cloneIdentifier(prop.key));
+ } else {
+ prop.value = cloneIdentifier(prop.key);
+ }
+ prop.shorthand = true;
+ return this.finishNode(prop, "ObjectProperty");
+ }
+ }
+ parseObjPropValue(prop, startLoc, isGenerator, isAsync, isPattern, isAccessor, refExpressionErrors) {
+ const node = this.parseObjectMethod(prop, isGenerator, isAsync, isPattern, isAccessor) || this.parseObjectProperty(prop, startLoc, isPattern, refExpressionErrors);
+ if (!node) this.unexpected();
+ return node;
+ }
+ parsePropertyName(prop, refExpressionErrors) {
+ if (this.eat(0)) {
+ prop.computed = true;
+ prop.key = this.parseMaybeAssignAllowIn();
+ this.expect(3);
+ } else {
+ const {
+ type,
+ value
+ } = this.state;
+ let key;
+ if (tokenIsKeywordOrIdentifier(type)) {
+ key = this.parseIdentifier(true);
+ } else {
+ switch (type) {
+ case 134:
+ key = this.parseNumericLiteral(value);
+ break;
+ case 133:
+ key = this.parseStringLiteral(value);
+ break;
+ case 135:
+ key = this.parseBigIntLiteral(value);
+ break;
+ case 136:
+ key = this.parseDecimalLiteral(value);
+ break;
+ case 138:
+ {
+ const privateKeyLoc = this.state.startLoc;
+ if (refExpressionErrors != null) {
+ if (refExpressionErrors.privateKeyLoc === null) {
+ refExpressionErrors.privateKeyLoc = privateKeyLoc;
+ }
+ } else {
+ this.raise(Errors.UnexpectedPrivateField, {
+ at: privateKeyLoc
+ });
+ }
+ key = this.parsePrivateName();
+ break;
+ }
+ default:
+ this.unexpected();
+ }
+ }
+ prop.key = key;
+ if (type !== 138) {
+ prop.computed = false;
+ }
+ }
+ return prop.key;
+ }
+ initFunction(node, isAsync) {
+ node.id = null;
+ node.generator = false;
+ node.async = isAsync;
+ }
+ parseMethod(node, isGenerator, isAsync, isConstructor, allowDirectSuper, type, inClassScope = false) {
+ this.initFunction(node, isAsync);
+ node.generator = isGenerator;
+ this.scope.enter(2 | 16 | (inClassScope ? 64 : 0) | (allowDirectSuper ? 32 : 0));
+ this.prodParam.enter(functionFlags(isAsync, node.generator));
+ this.parseFunctionParams(node, isConstructor);
+ const finishedNode = this.parseFunctionBodyAndFinish(node, type, true);
+ this.prodParam.exit();
+ this.scope.exit();
+ return finishedNode;
+ }
+ parseArrayLike(close, canBePattern, isTuple, refExpressionErrors) {
+ if (isTuple) {
+ this.expectPlugin("recordAndTuple");
+ }
+ const oldInFSharpPipelineDirectBody = this.state.inFSharpPipelineDirectBody;
+ this.state.inFSharpPipelineDirectBody = false;
+ const node = this.startNode();
+ this.next();
+ node.elements = this.parseExprList(close, !isTuple, refExpressionErrors, node);
+ this.state.inFSharpPipelineDirectBody = oldInFSharpPipelineDirectBody;
+ return this.finishNode(node, isTuple ? "TupleExpression" : "ArrayExpression");
+ }
+ parseArrowExpression(node, params, isAsync, trailingCommaLoc) {
+ this.scope.enter(2 | 4);
+ let flags = functionFlags(isAsync, false);
+ if (!this.match(5) && this.prodParam.hasIn) {
+ flags |= PARAM_IN;
+ }
+ this.prodParam.enter(flags);
+ this.initFunction(node, isAsync);
+ const oldMaybeInArrowParameters = this.state.maybeInArrowParameters;
+ if (params) {
+ this.state.maybeInArrowParameters = true;
+ this.setArrowFunctionParameters(node, params, trailingCommaLoc);
+ }
+ this.state.maybeInArrowParameters = false;
+ this.parseFunctionBody(node, true);
+ this.prodParam.exit();
+ this.scope.exit();
+ this.state.maybeInArrowParameters = oldMaybeInArrowParameters;
+ return this.finishNode(node, "ArrowFunctionExpression");
+ }
+ setArrowFunctionParameters(node, params, trailingCommaLoc) {
+ this.toAssignableList(params, trailingCommaLoc, false);
+ node.params = params;
+ }
+ parseFunctionBodyAndFinish(node, type, isMethod = false) {
+ this.parseFunctionBody(node, false, isMethod);
+ return this.finishNode(node, type);
+ }
+ parseFunctionBody(node, allowExpression, isMethod = false) {
+ const isExpression = allowExpression && !this.match(5);
+ this.expressionScope.enter(newExpressionScope());
+ if (isExpression) {
+ node.body = this.parseMaybeAssign();
+ this.checkParams(node, false, allowExpression, false);
+ } else {
+ const oldStrict = this.state.strict;
+ const oldLabels = this.state.labels;
+ this.state.labels = [];
+ this.prodParam.enter(this.prodParam.currentFlags() | PARAM_RETURN);
+ node.body = this.parseBlock(true, false, hasStrictModeDirective => {
+ const nonSimple = !this.isSimpleParamList(node.params);
+ if (hasStrictModeDirective && nonSimple) {
+ this.raise(Errors.IllegalLanguageModeDirective, {
+ at: (node.kind === "method" || node.kind === "constructor") && !!node.key ? node.key.loc.end : node
+ });
+ }
+ const strictModeChanged = !oldStrict && this.state.strict;
+ this.checkParams(node, !this.state.strict && !allowExpression && !isMethod && !nonSimple, allowExpression, strictModeChanged);
+ if (this.state.strict && node.id) {
+ this.checkIdentifier(node.id, 65, strictModeChanged);
+ }
+ });
+ this.prodParam.exit();
+ this.state.labels = oldLabels;
+ }
+ this.expressionScope.exit();
+ }
+ isSimpleParameter(node) {
+ return node.type === "Identifier";
+ }
+ isSimpleParamList(params) {
+ for (let i = 0, len = params.length; i < len; i++) {
+ if (!this.isSimpleParameter(params[i])) return false;
+ }
+ return true;
+ }
+ checkParams(node, allowDuplicates, isArrowFunction, strictModeChanged = true) {
+ const checkClashes = !allowDuplicates && new Set();
+ const formalParameters = {
+ type: "FormalParameters"
+ };
+ for (const param of node.params) {
+ this.checkLVal(param, {
+ in: formalParameters,
+ binding: 5,
+ checkClashes,
+ strictModeChanged
+ });
+ }
+ }
+ parseExprList(close, allowEmpty, refExpressionErrors, nodeForExtra) {
+ const elts = [];
+ let first = true;
+ while (!this.eat(close)) {
+ if (first) {
+ first = false;
+ } else {
+ this.expect(12);
+ if (this.match(close)) {
+ if (nodeForExtra) {
+ this.addTrailingCommaExtraToNode(nodeForExtra);
+ }
+ this.next();
+ break;
+ }
+ }
+ elts.push(this.parseExprListItem(allowEmpty, refExpressionErrors));
+ }
+ return elts;
+ }
+ parseExprListItem(allowEmpty, refExpressionErrors, allowPlaceholder) {
+ let elt;
+ if (this.match(12)) {
+ if (!allowEmpty) {
+ this.raise(Errors.UnexpectedToken, {
+ at: this.state.curPosition(),
+ unexpected: ","
+ });
+ }
+ elt = null;
+ } else if (this.match(21)) {
+ const spreadNodeStartLoc = this.state.startLoc;
+ elt = this.parseParenItem(this.parseSpread(refExpressionErrors), spreadNodeStartLoc);
+ } else if (this.match(17)) {
+ this.expectPlugin("partialApplication");
+ if (!allowPlaceholder) {
+ this.raise(Errors.UnexpectedArgumentPlaceholder, {
+ at: this.state.startLoc
+ });
+ }
+ const node = this.startNode();
+ this.next();
+ elt = this.finishNode(node, "ArgumentPlaceholder");
+ } else {
+ elt = this.parseMaybeAssignAllowIn(refExpressionErrors, this.parseParenItem);
+ }
+ return elt;
+ }
+ parseIdentifier(liberal) {
+ const node = this.startNode();
+ const name = this.parseIdentifierName(liberal);
+ return this.createIdentifier(node, name);
+ }
+ createIdentifier(node, name) {
+ node.name = name;
+ node.loc.identifierName = name;
+ return this.finishNode(node, "Identifier");
+ }
+ parseIdentifierName(liberal) {
+ let name;
+ const {
+ startLoc,
+ type
+ } = this.state;
+ if (tokenIsKeywordOrIdentifier(type)) {
+ name = this.state.value;
+ } else {
+ this.unexpected();
+ }
+ const tokenIsKeyword = tokenKeywordOrIdentifierIsKeyword(type);
+ if (liberal) {
+ if (tokenIsKeyword) {
+ this.replaceToken(132);
+ }
+ } else {
+ this.checkReservedWord(name, startLoc, tokenIsKeyword, false);
+ }
+ this.next();
+ return name;
+ }
+ checkReservedWord(word, startLoc, checkKeywords, isBinding) {
+ if (word.length > 10) {
+ return;
+ }
+ if (!canBeReservedWord(word)) {
+ return;
+ }
+ if (checkKeywords && isKeyword(word)) {
+ this.raise(Errors.UnexpectedKeyword, {
+ at: startLoc,
+ keyword: word
+ });
+ return;
+ }
+ const reservedTest = !this.state.strict ? isReservedWord : isBinding ? isStrictBindReservedWord : isStrictReservedWord;
+ if (reservedTest(word, this.inModule)) {
+ this.raise(Errors.UnexpectedReservedWord, {
+ at: startLoc,
+ reservedWord: word
+ });
+ return;
+ } else if (word === "yield") {
+ if (this.prodParam.hasYield) {
+ this.raise(Errors.YieldBindingIdentifier, {
+ at: startLoc
+ });
+ return;
+ }
+ } else if (word === "await") {
+ if (this.prodParam.hasAwait) {
+ this.raise(Errors.AwaitBindingIdentifier, {
+ at: startLoc
+ });
+ return;
+ }
+ if (this.scope.inStaticBlock) {
+ this.raise(Errors.AwaitBindingIdentifierInStaticBlock, {
+ at: startLoc
+ });
+ return;
+ }
+ this.expressionScope.recordAsyncArrowParametersError({
+ at: startLoc
+ });
+ } else if (word === "arguments") {
+ if (this.scope.inClassAndNotInNonArrowFunction) {
+ this.raise(Errors.ArgumentsInClass, {
+ at: startLoc
+ });
+ return;
+ }
+ }
+ }
+ isAwaitAllowed() {
+ if (this.prodParam.hasAwait) return true;
+ if (this.options.allowAwaitOutsideFunction && !this.scope.inFunction) {
+ return true;
+ }
+ return false;
+ }
+ parseAwait(startLoc) {
+ const node = this.startNodeAt(startLoc);
+ this.expressionScope.recordParameterInitializerError(Errors.AwaitExpressionFormalParameter, {
+ at: node
+ });
+ if (this.eat(55)) {
+ this.raise(Errors.ObsoleteAwaitStar, {
+ at: node
+ });
+ }
+ if (!this.scope.inFunction && !this.options.allowAwaitOutsideFunction) {
+ if (this.isAmbiguousAwait()) {
+ this.ambiguousScriptDifferentAst = true;
+ } else {
+ this.sawUnambiguousESM = true;
+ }
+ }
+ if (!this.state.soloAwait) {
+ node.argument = this.parseMaybeUnary(null, true);
+ }
+ return this.finishNode(node, "AwaitExpression");
+ }
+ isAmbiguousAwait() {
+ if (this.hasPrecedingLineBreak()) return true;
+ const {
+ type
+ } = this.state;
+ return type === 53 || type === 10 || type === 0 || tokenIsTemplate(type) || type === 102 && !this.state.containsEsc || type === 137 || type === 56 || this.hasPlugin("v8intrinsic") && type === 54;
+ }
+ parseYield() {
+ const node = this.startNode();
+ this.expressionScope.recordParameterInitializerError(Errors.YieldInParameter, {
+ at: node
+ });
+ this.next();
+ let delegating = false;
+ let argument = null;
+ if (!this.hasPrecedingLineBreak()) {
+ delegating = this.eat(55);
+ switch (this.state.type) {
+ case 13:
+ case 139:
+ case 8:
+ case 11:
+ case 3:
+ case 9:
+ case 14:
+ case 12:
+ if (!delegating) break;
+ default:
+ argument = this.parseMaybeAssign();
+ }
+ }
+ node.delegate = delegating;
+ node.argument = argument;
+ return this.finishNode(node, "YieldExpression");
+ }
+ parseImportCall(node) {
+ this.next();
+ node.source = this.parseMaybeAssignAllowIn();
+ if (this.hasPlugin("importAttributes") || this.hasPlugin("importAssertions")) {
+ node.options = null;
+ }
+ if (this.eat(12)) {
+ this.expectImportAttributesPlugin();
+ if (!this.match(11)) {
+ node.options = this.parseMaybeAssignAllowIn();
+ this.eat(12);
+ }
+ }
+ this.expect(11);
+ return this.finishNode(node, "ImportExpression");
+ }
+ checkPipelineAtInfixOperator(left, leftStartLoc) {
+ if (this.hasPlugin(["pipelineOperator", {
+ proposal: "smart"
+ }])) {
+ if (left.type === "SequenceExpression") {
+ this.raise(Errors.PipelineHeadSequenceExpression, {
+ at: leftStartLoc
+ });
+ }
+ }
+ }
+ parseSmartPipelineBodyInStyle(childExpr, startLoc) {
+ if (this.isSimpleReference(childExpr)) {
+ const bodyNode = this.startNodeAt(startLoc);
+ bodyNode.callee = childExpr;
+ return this.finishNode(bodyNode, "PipelineBareFunction");
+ } else {
+ const bodyNode = this.startNodeAt(startLoc);
+ this.checkSmartPipeTopicBodyEarlyErrors(startLoc);
+ bodyNode.expression = childExpr;
+ return this.finishNode(bodyNode, "PipelineTopicExpression");
+ }
+ }
+ isSimpleReference(expression) {
+ switch (expression.type) {
+ case "MemberExpression":
+ return !expression.computed && this.isSimpleReference(expression.object);
+ case "Identifier":
+ return true;
+ default:
+ return false;
+ }
+ }
+ checkSmartPipeTopicBodyEarlyErrors(startLoc) {
+ if (this.match(19)) {
+ throw this.raise(Errors.PipelineBodyNoArrow, {
+ at: this.state.startLoc
+ });
+ }
+ if (!this.topicReferenceWasUsedInCurrentContext()) {
+ this.raise(Errors.PipelineTopicUnused, {
+ at: startLoc
+ });
+ }
+ }
+ withTopicBindingContext(callback) {
+ const outerContextTopicState = this.state.topicContext;
+ this.state.topicContext = {
+ maxNumOfResolvableTopics: 1,
+ maxTopicIndex: null
+ };
+ try {
+ return callback();
+ } finally {
+ this.state.topicContext = outerContextTopicState;
+ }
+ }
+ withSmartMixTopicForbiddingContext(callback) {
+ if (this.hasPlugin(["pipelineOperator", {
+ proposal: "smart"
+ }])) {
+ const outerContextTopicState = this.state.topicContext;
+ this.state.topicContext = {
+ maxNumOfResolvableTopics: 0,
+ maxTopicIndex: null
+ };
+ try {
+ return callback();
+ } finally {
+ this.state.topicContext = outerContextTopicState;
+ }
+ } else {
+ return callback();
+ }
+ }
+ withSoloAwaitPermittingContext(callback) {
+ const outerContextSoloAwaitState = this.state.soloAwait;
+ this.state.soloAwait = true;
+ try {
+ return callback();
+ } finally {
+ this.state.soloAwait = outerContextSoloAwaitState;
+ }
+ }
+ allowInAnd(callback) {
+ const flags = this.prodParam.currentFlags();
+ const prodParamToSet = PARAM_IN & ~flags;
+ if (prodParamToSet) {
+ this.prodParam.enter(flags | PARAM_IN);
+ try {
+ return callback();
+ } finally {
+ this.prodParam.exit();
+ }
+ }
+ return callback();
+ }
+ disallowInAnd(callback) {
+ const flags = this.prodParam.currentFlags();
+ const prodParamToClear = PARAM_IN & flags;
+ if (prodParamToClear) {
+ this.prodParam.enter(flags & ~PARAM_IN);
+ try {
+ return callback();
+ } finally {
+ this.prodParam.exit();
+ }
+ }
+ return callback();
+ }
+ registerTopicReference() {
+ this.state.topicContext.maxTopicIndex = 0;
+ }
+ topicReferenceIsAllowedInCurrentContext() {
+ return this.state.topicContext.maxNumOfResolvableTopics >= 1;
+ }
+ topicReferenceWasUsedInCurrentContext() {
+ return this.state.topicContext.maxTopicIndex != null && this.state.topicContext.maxTopicIndex >= 0;
+ }
+ parseFSharpPipelineBody(prec) {
+ const startLoc = this.state.startLoc;
+ this.state.potentialArrowAt = this.state.start;
+ const oldInFSharpPipelineDirectBody = this.state.inFSharpPipelineDirectBody;
+ this.state.inFSharpPipelineDirectBody = true;
+ const ret = this.parseExprOp(this.parseMaybeUnaryOrPrivate(), startLoc, prec);
+ this.state.inFSharpPipelineDirectBody = oldInFSharpPipelineDirectBody;
+ return ret;
+ }
+ parseModuleExpression() {
+ this.expectPlugin("moduleBlocks");
+ const node = this.startNode();
+ this.next();
+ if (!this.match(5)) {
+ this.unexpected(null, 5);
+ }
+ const program = this.startNodeAt(this.state.endLoc);
+ this.next();
+ const revertScopes = this.initializeScopes(true);
+ this.enterInitialScopes();
+ try {
+ node.body = this.parseProgram(program, 8, "module");
+ } finally {
+ revertScopes();
+ }
+ return this.finishNode(node, "ModuleExpression");
+ }
+ parsePropertyNamePrefixOperator(prop) {}
+ }
+ const loopLabel = {
+ kind: "loop"
+ },
+ switchLabel = {
+ kind: "switch"
+ };
+ const loneSurrogate = /[\uD800-\uDFFF]/u;
+ const keywordRelationalOperator = /in(?:stanceof)?/y;
+ function babel7CompatTokens(tokens, input) {
+ for (let i = 0; i < tokens.length; i++) {
+ const token = tokens[i];
+ const {
+ type
+ } = token;
+ if (typeof type === "number") {
+ {
+ if (type === 138) {
+ const {
+ loc,
+ start,
+ value,
+ end
+ } = token;
+ const hashEndPos = start + 1;
+ const hashEndLoc = createPositionWithColumnOffset(loc.start, 1);
+ tokens.splice(i, 1, new Token({
+ type: getExportedToken(27),
+ value: "#",
+ start: start,
+ end: hashEndPos,
+ startLoc: loc.start,
+ endLoc: hashEndLoc
+ }), new Token({
+ type: getExportedToken(132),
+ value: value,
+ start: hashEndPos,
+ end: end,
+ startLoc: hashEndLoc,
+ endLoc: loc.end
+ }));
+ i++;
+ continue;
+ }
+ if (tokenIsTemplate(type)) {
+ const {
+ loc,
+ start,
+ value,
+ end
+ } = token;
+ const backquoteEnd = start + 1;
+ const backquoteEndLoc = createPositionWithColumnOffset(loc.start, 1);
+ let startToken;
+ if (input.charCodeAt(start) === 96) {
+ startToken = new Token({
+ type: getExportedToken(22),
+ value: "`",
+ start: start,
+ end: backquoteEnd,
+ startLoc: loc.start,
+ endLoc: backquoteEndLoc
+ });
+ } else {
+ startToken = new Token({
+ type: getExportedToken(8),
+ value: "}",
+ start: start,
+ end: backquoteEnd,
+ startLoc: loc.start,
+ endLoc: backquoteEndLoc
+ });
+ }
+ let templateValue, templateElementEnd, templateElementEndLoc, endToken;
+ if (type === 24) {
+ templateElementEnd = end - 1;
+ templateElementEndLoc = createPositionWithColumnOffset(loc.end, -1);
+ templateValue = value === null ? null : value.slice(1, -1);
+ endToken = new Token({
+ type: getExportedToken(22),
+ value: "`",
+ start: templateElementEnd,
+ end: end,
+ startLoc: templateElementEndLoc,
+ endLoc: loc.end
+ });
+ } else {
+ templateElementEnd = end - 2;
+ templateElementEndLoc = createPositionWithColumnOffset(loc.end, -2);
+ templateValue = value === null ? null : value.slice(1, -2);
+ endToken = new Token({
+ type: getExportedToken(23),
+ value: "${",
+ start: templateElementEnd,
+ end: end,
+ startLoc: templateElementEndLoc,
+ endLoc: loc.end
+ });
+ }
+ tokens.splice(i, 1, startToken, new Token({
+ type: getExportedToken(20),
+ value: templateValue,
+ start: backquoteEnd,
+ end: templateElementEnd,
+ startLoc: backquoteEndLoc,
+ endLoc: templateElementEndLoc
+ }), endToken);
+ i += 2;
+ continue;
+ }
+ }
+ token.type = getExportedToken(type);
+ }
+ }
+ return tokens;
+ }
+ class StatementParser extends ExpressionParser {
+ parseTopLevel(file, program) {
+ file.program = this.parseProgram(program);
+ file.comments = this.state.comments;
+ if (this.options.tokens) {
+ file.tokens = babel7CompatTokens(this.tokens, this.input);
+ }
+ return this.finishNode(file, "File");
+ }
+ parseProgram(program, end = 139, sourceType = this.options.sourceType) {
+ program.sourceType = sourceType;
+ program.interpreter = this.parseInterpreterDirective();
+ this.parseBlockBody(program, true, true, end);
+ if (this.inModule && !this.options.allowUndeclaredExports && this.scope.undefinedExports.size > 0) {
+ for (const [localName, at] of Array.from(this.scope.undefinedExports)) {
+ this.raise(Errors.ModuleExportUndefined, {
+ at,
+ localName
+ });
+ }
+ }
+ let finishedProgram;
+ if (end === 139) {
+ finishedProgram = this.finishNode(program, "Program");
+ } else {
+ finishedProgram = this.finishNodeAt(program, "Program", createPositionWithColumnOffset(this.state.startLoc, -1));
+ }
+ return finishedProgram;
+ }
+ stmtToDirective(stmt) {
+ const directive = stmt;
+ directive.type = "Directive";
+ directive.value = directive.expression;
+ delete directive.expression;
+ const directiveLiteral = directive.value;
+ const expressionValue = directiveLiteral.value;
+ const raw = this.input.slice(directiveLiteral.start, directiveLiteral.end);
+ const val = directiveLiteral.value = raw.slice(1, -1);
+ this.addExtra(directiveLiteral, "raw", raw);
+ this.addExtra(directiveLiteral, "rawValue", val);
+ this.addExtra(directiveLiteral, "expressionValue", expressionValue);
+ directiveLiteral.type = "DirectiveLiteral";
+ return directive;
+ }
+ parseInterpreterDirective() {
+ if (!this.match(28)) {
+ return null;
+ }
+ const node = this.startNode();
+ node.value = this.state.value;
+ this.next();
+ return this.finishNode(node, "InterpreterDirective");
+ }
+ isLet() {
+ if (!this.isContextual(100)) {
+ return false;
+ }
+ return this.hasFollowingBindingAtom();
+ }
+ chStartsBindingIdentifier(ch, pos) {
+ if (isIdentifierStart(ch)) {
+ keywordRelationalOperator.lastIndex = pos;
+ if (keywordRelationalOperator.test(this.input)) {
+ const endCh = this.codePointAtPos(keywordRelationalOperator.lastIndex);
+ if (!isIdentifierChar(endCh) && endCh !== 92) {
+ return false;
+ }
+ }
+ return true;
+ } else if (ch === 92) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+ chStartsBindingPattern(ch) {
+ return ch === 91 || ch === 123;
+ }
+ hasFollowingBindingAtom() {
+ const next = this.nextTokenStart();
+ const nextCh = this.codePointAtPos(next);
+ return this.chStartsBindingPattern(nextCh) || this.chStartsBindingIdentifier(nextCh, next);
+ }
+ hasInLineFollowingBindingIdentifier() {
+ const next = this.nextTokenInLineStart();
+ const nextCh = this.codePointAtPos(next);
+ return this.chStartsBindingIdentifier(nextCh, next);
+ }
+ startsUsingForOf() {
+ const {
+ type,
+ containsEsc
+ } = this.lookahead();
+ if (type === 102 && !containsEsc) {
+ return false;
+ } else if (tokenIsIdentifier(type) && !this.hasFollowingLineBreak()) {
+ this.expectPlugin("explicitResourceManagement");
+ return true;
+ }
+ }
+ startsAwaitUsing() {
+ let next = this.nextTokenInLineStart();
+ if (this.isUnparsedContextual(next, "using")) {
+ next = this.nextTokenInLineStartSince(next + 5);
+ const nextCh = this.codePointAtPos(next);
+ if (this.chStartsBindingIdentifier(nextCh, next)) {
+ this.expectPlugin("explicitResourceManagement");
+ return true;
+ }
+ }
+ return false;
+ }
+ parseModuleItem() {
+ return this.parseStatementLike(1 | 2 | 4 | 8);
+ }
+ parseStatementListItem() {
+ return this.parseStatementLike(2 | 4 | (!this.options.annexB || this.state.strict ? 0 : 8));
+ }
+ parseStatementOrSloppyAnnexBFunctionDeclaration(allowLabeledFunction = false) {
+ let flags = 0;
+ if (this.options.annexB && !this.state.strict) {
+ flags |= 4;
+ if (allowLabeledFunction) {
+ flags |= 8;
+ }
+ }
+ return this.parseStatementLike(flags);
+ }
+ parseStatement() {
+ return this.parseStatementLike(0);
+ }
+ parseStatementLike(flags) {
+ let decorators = null;
+ if (this.match(26)) {
+ decorators = this.parseDecorators(true);
+ }
+ return this.parseStatementContent(flags, decorators);
+ }
+ parseStatementContent(flags, decorators) {
+ const starttype = this.state.type;
+ const node = this.startNode();
+ const allowDeclaration = !!(flags & 2);
+ const allowFunctionDeclaration = !!(flags & 4);
+ const topLevel = flags & 1;
+ switch (starttype) {
+ case 60:
+ return this.parseBreakContinueStatement(node, true);
+ case 63:
+ return this.parseBreakContinueStatement(node, false);
+ case 64:
+ return this.parseDebuggerStatement(node);
+ case 90:
+ return this.parseDoWhileStatement(node);
+ case 91:
+ return this.parseForStatement(node);
+ case 68:
+ if (this.lookaheadCharCode() === 46) break;
+ if (!allowFunctionDeclaration) {
+ this.raise(this.state.strict ? Errors.StrictFunction : this.options.annexB ? Errors.SloppyFunctionAnnexB : Errors.SloppyFunction, {
+ at: this.state.startLoc
+ });
+ }
+ return this.parseFunctionStatement(node, false, !allowDeclaration && allowFunctionDeclaration);
+ case 80:
+ if (!allowDeclaration) this.unexpected();
+ return this.parseClass(this.maybeTakeDecorators(decorators, node), true);
+ case 69:
+ return this.parseIfStatement(node);
+ case 70:
+ return this.parseReturnStatement(node);
+ case 71:
+ return this.parseSwitchStatement(node);
+ case 72:
+ return this.parseThrowStatement(node);
+ case 73:
+ return this.parseTryStatement(node);
+ case 96:
+ if (!this.state.containsEsc && this.startsAwaitUsing()) {
+ if (!this.isAwaitAllowed()) {
+ this.raise(Errors.AwaitUsingNotInAsyncContext, {
+ at: node
+ });
+ } else if (!allowDeclaration) {
+ this.raise(Errors.UnexpectedLexicalDeclaration, {
+ at: node
+ });
+ }
+ this.next();
+ return this.parseVarStatement(node, "await using");
+ }
+ break;
+ case 107:
+ if (this.state.containsEsc || !this.hasInLineFollowingBindingIdentifier()) {
+ break;
+ }
+ this.expectPlugin("explicitResourceManagement");
+ if (!this.scope.inModule && this.scope.inTopLevel) {
+ this.raise(Errors.UnexpectedUsingDeclaration, {
+ at: this.state.startLoc
+ });
+ } else if (!allowDeclaration) {
+ this.raise(Errors.UnexpectedLexicalDeclaration, {
+ at: this.state.startLoc
+ });
+ }
+ return this.parseVarStatement(node, "using");
+ case 100:
+ {
+ if (this.state.containsEsc) {
+ break;
+ }
+ const next = this.nextTokenStart();
+ const nextCh = this.codePointAtPos(next);
+ if (nextCh !== 91) {
+ if (!allowDeclaration && this.hasFollowingLineBreak()) break;
+ if (!this.chStartsBindingIdentifier(nextCh, next) && nextCh !== 123) {
+ break;
+ }
+ }
+ }
+ case 75:
+ {
+ if (!allowDeclaration) {
+ this.raise(Errors.UnexpectedLexicalDeclaration, {
+ at: this.state.startLoc
+ });
+ }
+ }
+ case 74:
+ {
+ const kind = this.state.value;
+ return this.parseVarStatement(node, kind);
+ }
+ case 92:
+ return this.parseWhileStatement(node);
+ case 76:
+ return this.parseWithStatement(node);
+ case 5:
+ return this.parseBlock();
+ case 13:
+ return this.parseEmptyStatement(node);
+ case 83:
+ {
+ const nextTokenCharCode = this.lookaheadCharCode();
+ if (nextTokenCharCode === 40 || nextTokenCharCode === 46) {
+ break;
+ }
+ }
+ case 82:
+ {
+ if (!this.options.allowImportExportEverywhere && !topLevel) {
+ this.raise(Errors.UnexpectedImportExport, {
+ at: this.state.startLoc
+ });
+ }
+ this.next();
+ let result;
+ if (starttype === 83) {
+ result = this.parseImport(node);
+ if (result.type === "ImportDeclaration" && (!result.importKind || result.importKind === "value")) {
+ this.sawUnambiguousESM = true;
+ }
+ } else {
+ result = this.parseExport(node, decorators);
+ if (result.type === "ExportNamedDeclaration" && (!result.exportKind || result.exportKind === "value") || result.type === "ExportAllDeclaration" && (!result.exportKind || result.exportKind === "value") || result.type === "ExportDefaultDeclaration") {
+ this.sawUnambiguousESM = true;
+ }
+ }
+ this.assertModuleNodeAllowed(result);
+ return result;
+ }
+ default:
+ {
+ if (this.isAsyncFunction()) {
+ if (!allowDeclaration) {
+ this.raise(Errors.AsyncFunctionInSingleStatementContext, {
+ at: this.state.startLoc
+ });
+ }
+ this.next();
+ return this.parseFunctionStatement(node, true, !allowDeclaration && allowFunctionDeclaration);
+ }
+ }
+ }
+ const maybeName = this.state.value;
+ const expr = this.parseExpression();
+ if (tokenIsIdentifier(starttype) && expr.type === "Identifier" && this.eat(14)) {
+ return this.parseLabeledStatement(node, maybeName, expr, flags);
+ } else {
+ return this.parseExpressionStatement(node, expr, decorators);
+ }
+ }
+ assertModuleNodeAllowed(node) {
+ if (!this.options.allowImportExportEverywhere && !this.inModule) {
+ this.raise(Errors.ImportOutsideModule, {
+ at: node
+ });
+ }
+ }
+ decoratorsEnabledBeforeExport() {
+ if (this.hasPlugin("decorators-legacy")) return true;
+ return this.hasPlugin("decorators") && this.getPluginOption("decorators", "decoratorsBeforeExport") !== false;
+ }
+ maybeTakeDecorators(maybeDecorators, classNode, exportNode) {
+ if (maybeDecorators) {
+ if (classNode.decorators && classNode.decorators.length > 0) {
+ if (typeof this.getPluginOption("decorators", "decoratorsBeforeExport") !== "boolean") {
+ this.raise(Errors.DecoratorsBeforeAfterExport, {
+ at: classNode.decorators[0]
+ });
+ }
+ classNode.decorators.unshift(...maybeDecorators);
+ } else {
+ classNode.decorators = maybeDecorators;
+ }
+ this.resetStartLocationFromNode(classNode, maybeDecorators[0]);
+ if (exportNode) this.resetStartLocationFromNode(exportNode, classNode);
+ }
+ return classNode;
+ }
+ canHaveLeadingDecorator() {
+ return this.match(80);
+ }
+ parseDecorators(allowExport) {
+ const decorators = [];
+ do {
+ decorators.push(this.parseDecorator());
+ } while (this.match(26));
+ if (this.match(82)) {
+ if (!allowExport) {
+ this.unexpected();
+ }
+ if (!this.decoratorsEnabledBeforeExport()) {
+ this.raise(Errors.DecoratorExportClass, {
+ at: this.state.startLoc
+ });
+ }
+ } else if (!this.canHaveLeadingDecorator()) {
+ throw this.raise(Errors.UnexpectedLeadingDecorator, {
+ at: this.state.startLoc
+ });
+ }
+ return decorators;
+ }
+ parseDecorator() {
+ this.expectOnePlugin(["decorators", "decorators-legacy"]);
+ const node = this.startNode();
+ this.next();
+ if (this.hasPlugin("decorators")) {
+ const startLoc = this.state.startLoc;
+ let expr;
+ if (this.match(10)) {
+ const startLoc = this.state.startLoc;
+ this.next();
+ expr = this.parseExpression();
+ this.expect(11);
+ expr = this.wrapParenthesis(startLoc, expr);
+ const paramsStartLoc = this.state.startLoc;
+ node.expression = this.parseMaybeDecoratorArguments(expr);
+ if (this.getPluginOption("decorators", "allowCallParenthesized") === false && node.expression !== expr) {
+ this.raise(Errors.DecoratorArgumentsOutsideParentheses, {
+ at: paramsStartLoc
+ });
+ }
+ } else {
+ expr = this.parseIdentifier(false);
+ while (this.eat(16)) {
+ const node = this.startNodeAt(startLoc);
+ node.object = expr;
+ if (this.match(138)) {
+ this.classScope.usePrivateName(this.state.value, this.state.startLoc);
+ node.property = this.parsePrivateName();
+ } else {
+ node.property = this.parseIdentifier(true);
+ }
+ node.computed = false;
+ expr = this.finishNode(node, "MemberExpression");
+ }
+ node.expression = this.parseMaybeDecoratorArguments(expr);
+ }
+ } else {
+ node.expression = this.parseExprSubscripts();
+ }
+ return this.finishNode(node, "Decorator");
+ }
+ parseMaybeDecoratorArguments(expr) {
+ if (this.eat(10)) {
+ const node = this.startNodeAtNode(expr);
+ node.callee = expr;
+ node.arguments = this.parseCallExpressionArguments(11, false);
+ this.toReferencedList(node.arguments);
+ return this.finishNode(node, "CallExpression");
+ }
+ return expr;
+ }
+ parseBreakContinueStatement(node, isBreak) {
+ this.next();
+ if (this.isLineTerminator()) {
+ node.label = null;
+ } else {
+ node.label = this.parseIdentifier();
+ this.semicolon();
+ }
+ this.verifyBreakContinue(node, isBreak);
+ return this.finishNode(node, isBreak ? "BreakStatement" : "ContinueStatement");
+ }
+ verifyBreakContinue(node, isBreak) {
+ let i;
+ for (i = 0; i < this.state.labels.length; ++i) {
+ const lab = this.state.labels[i];
+ if (node.label == null || lab.name === node.label.name) {
+ if (lab.kind != null && (isBreak || lab.kind === "loop")) break;
+ if (node.label && isBreak) break;
+ }
+ }
+ if (i === this.state.labels.length) {
+ const type = isBreak ? "BreakStatement" : "ContinueStatement";
+ this.raise(Errors.IllegalBreakContinue, {
+ at: node,
+ type
+ });
+ }
+ }
+ parseDebuggerStatement(node) {
+ this.next();
+ this.semicolon();
+ return this.finishNode(node, "DebuggerStatement");
+ }
+ parseHeaderExpression() {
+ this.expect(10);
+ const val = this.parseExpression();
+ this.expect(11);
+ return val;
+ }
+ parseDoWhileStatement(node) {
+ this.next();
+ this.state.labels.push(loopLabel);
+ node.body = this.withSmartMixTopicForbiddingContext(() => this.parseStatement());
+ this.state.labels.pop();
+ this.expect(92);
+ node.test = this.parseHeaderExpression();
+ this.eat(13);
+ return this.finishNode(node, "DoWhileStatement");
+ }
+ parseForStatement(node) {
+ this.next();
+ this.state.labels.push(loopLabel);
+ let awaitAt = null;
+ if (this.isAwaitAllowed() && this.eatContextual(96)) {
+ awaitAt = this.state.lastTokStartLoc;
+ }
+ this.scope.enter(0);
+ this.expect(10);
+ if (this.match(13)) {
+ if (awaitAt !== null) {
+ this.unexpected(awaitAt);
+ }
+ return this.parseFor(node, null);
+ }
+ const startsWithLet = this.isContextual(100);
+ {
+ const startsWithAwaitUsing = this.isContextual(96) && this.startsAwaitUsing();
+ const starsWithUsingDeclaration = startsWithAwaitUsing || this.isContextual(107) && this.startsUsingForOf();
+ const isLetOrUsing = startsWithLet && this.hasFollowingBindingAtom() || starsWithUsingDeclaration;
+ if (this.match(74) || this.match(75) || isLetOrUsing) {
+ const initNode = this.startNode();
+ let kind;
+ if (startsWithAwaitUsing) {
+ kind = "await using";
+ if (!this.isAwaitAllowed()) {
+ this.raise(Errors.AwaitUsingNotInAsyncContext, {
+ at: this.state.startLoc
+ });
+ }
+ this.next();
+ } else {
+ kind = this.state.value;
+ }
+ this.next();
+ this.parseVar(initNode, true, kind);
+ const init = this.finishNode(initNode, "VariableDeclaration");
+ const isForIn = this.match(58);
+ if (isForIn && starsWithUsingDeclaration) {
+ this.raise(Errors.ForInUsing, {
+ at: init
+ });
+ }
+ if ((isForIn || this.isContextual(102)) && init.declarations.length === 1) {
+ return this.parseForIn(node, init, awaitAt);
+ }
+ if (awaitAt !== null) {
+ this.unexpected(awaitAt);
+ }
+ return this.parseFor(node, init);
+ }
+ }
+ const startsWithAsync = this.isContextual(95);
+ const refExpressionErrors = new ExpressionErrors();
+ const init = this.parseExpression(true, refExpressionErrors);
+ const isForOf = this.isContextual(102);
+ if (isForOf) {
+ if (startsWithLet) {
+ this.raise(Errors.ForOfLet, {
+ at: init
+ });
+ }
+ if (awaitAt === null && startsWithAsync && init.type === "Identifier") {
+ this.raise(Errors.ForOfAsync, {
+ at: init
+ });
+ }
+ }
+ if (isForOf || this.match(58)) {
+ this.checkDestructuringPrivate(refExpressionErrors);
+ this.toAssignable(init, true);
+ const type = isForOf ? "ForOfStatement" : "ForInStatement";
+ this.checkLVal(init, {
+ in: {
+ type
+ }
+ });
+ return this.parseForIn(node, init, awaitAt);
+ } else {
+ this.checkExpressionErrors(refExpressionErrors, true);
+ }
+ if (awaitAt !== null) {
+ this.unexpected(awaitAt);
+ }
+ return this.parseFor(node, init);
+ }
+ parseFunctionStatement(node, isAsync, isHangingDeclaration) {
+ this.next();
+ return this.parseFunction(node, 1 | (isHangingDeclaration ? 2 : 0) | (isAsync ? 8 : 0));
+ }
+ parseIfStatement(node) {
+ this.next();
+ node.test = this.parseHeaderExpression();
+ node.consequent = this.parseStatementOrSloppyAnnexBFunctionDeclaration();
+ node.alternate = this.eat(66) ? this.parseStatementOrSloppyAnnexBFunctionDeclaration() : null;
+ return this.finishNode(node, "IfStatement");
+ }
+ parseReturnStatement(node) {
+ if (!this.prodParam.hasReturn && !this.options.allowReturnOutsideFunction) {
+ this.raise(Errors.IllegalReturn, {
+ at: this.state.startLoc
+ });
+ }
+ this.next();
+ if (this.isLineTerminator()) {
+ node.argument = null;
+ } else {
+ node.argument = this.parseExpression();
+ this.semicolon();
+ }
+ return this.finishNode(node, "ReturnStatement");
+ }
+ parseSwitchStatement(node) {
+ this.next();
+ node.discriminant = this.parseHeaderExpression();
+ const cases = node.cases = [];
+ this.expect(5);
+ this.state.labels.push(switchLabel);
+ this.scope.enter(0);
+ let cur;
+ for (let sawDefault; !this.match(8);) {
+ if (this.match(61) || this.match(65)) {
+ const isCase = this.match(61);
+ if (cur) this.finishNode(cur, "SwitchCase");
+ cases.push(cur = this.startNode());
+ cur.consequent = [];
+ this.next();
+ if (isCase) {
+ cur.test = this.parseExpression();
+ } else {
+ if (sawDefault) {
+ this.raise(Errors.MultipleDefaultsInSwitch, {
+ at: this.state.lastTokStartLoc
+ });
+ }
+ sawDefault = true;
+ cur.test = null;
+ }
+ this.expect(14);
+ } else {
+ if (cur) {
+ cur.consequent.push(this.parseStatementListItem());
+ } else {
+ this.unexpected();
+ }
+ }
+ }
+ this.scope.exit();
+ if (cur) this.finishNode(cur, "SwitchCase");
+ this.next();
+ this.state.labels.pop();
+ return this.finishNode(node, "SwitchStatement");
+ }
+ parseThrowStatement(node) {
+ this.next();
+ if (this.hasPrecedingLineBreak()) {
+ this.raise(Errors.NewlineAfterThrow, {
+ at: this.state.lastTokEndLoc
+ });
+ }
+ node.argument = this.parseExpression();
+ this.semicolon();
+ return this.finishNode(node, "ThrowStatement");
+ }
+ parseCatchClauseParam() {
+ const param = this.parseBindingAtom();
+ this.scope.enter(this.options.annexB && param.type === "Identifier" ? 8 : 0);
+ this.checkLVal(param, {
+ in: {
+ type: "CatchClause"
+ },
+ binding: 9
+ });
+ return param;
+ }
+ parseTryStatement(node) {
+ this.next();
+ node.block = this.parseBlock();
+ node.handler = null;
+ if (this.match(62)) {
+ const clause = this.startNode();
+ this.next();
+ if (this.match(10)) {
+ this.expect(10);
+ clause.param = this.parseCatchClauseParam();
+ this.expect(11);
+ } else {
+ clause.param = null;
+ this.scope.enter(0);
+ }
+ clause.body = this.withSmartMixTopicForbiddingContext(() => this.parseBlock(false, false));
+ this.scope.exit();
+ node.handler = this.finishNode(clause, "CatchClause");
+ }
+ node.finalizer = this.eat(67) ? this.parseBlock() : null;
+ if (!node.handler && !node.finalizer) {
+ this.raise(Errors.NoCatchOrFinally, {
+ at: node
+ });
+ }
+ return this.finishNode(node, "TryStatement");
+ }
+ parseVarStatement(node, kind, allowMissingInitializer = false) {
+ this.next();
+ this.parseVar(node, false, kind, allowMissingInitializer);
+ this.semicolon();
+ return this.finishNode(node, "VariableDeclaration");
+ }
+ parseWhileStatement(node) {
+ this.next();
+ node.test = this.parseHeaderExpression();
+ this.state.labels.push(loopLabel);
+ node.body = this.withSmartMixTopicForbiddingContext(() => this.parseStatement());
+ this.state.labels.pop();
+ return this.finishNode(node, "WhileStatement");
+ }
+ parseWithStatement(node) {
+ if (this.state.strict) {
+ this.raise(Errors.StrictWith, {
+ at: this.state.startLoc
+ });
+ }
+ this.next();
+ node.object = this.parseHeaderExpression();
+ node.body = this.withSmartMixTopicForbiddingContext(() => this.parseStatement());
+ return this.finishNode(node, "WithStatement");
+ }
+ parseEmptyStatement(node) {
+ this.next();
+ return this.finishNode(node, "EmptyStatement");
+ }
+ parseLabeledStatement(node, maybeName, expr, flags) {
+ for (const label of this.state.labels) {
+ if (label.name === maybeName) {
+ this.raise(Errors.LabelRedeclaration, {
+ at: expr,
+ labelName: maybeName
+ });
+ }
+ }
+ const kind = tokenIsLoop(this.state.type) ? "loop" : this.match(71) ? "switch" : null;
+ for (let i = this.state.labels.length - 1; i >= 0; i--) {
+ const label = this.state.labels[i];
+ if (label.statementStart === node.start) {
+ label.statementStart = this.state.start;
+ label.kind = kind;
+ } else {
+ break;
+ }
+ }
+ this.state.labels.push({
+ name: maybeName,
+ kind: kind,
+ statementStart: this.state.start
+ });
+ node.body = flags & 8 ? this.parseStatementOrSloppyAnnexBFunctionDeclaration(true) : this.parseStatement();
+ this.state.labels.pop();
+ node.label = expr;
+ return this.finishNode(node, "LabeledStatement");
+ }
+ parseExpressionStatement(node, expr, decorators) {
+ node.expression = expr;
+ this.semicolon();
+ return this.finishNode(node, "ExpressionStatement");
+ }
+ parseBlock(allowDirectives = false, createNewLexicalScope = true, afterBlockParse) {
+ const node = this.startNode();
+ if (allowDirectives) {
+ this.state.strictErrors.clear();
+ }
+ this.expect(5);
+ if (createNewLexicalScope) {
+ this.scope.enter(0);
+ }
+ this.parseBlockBody(node, allowDirectives, false, 8, afterBlockParse);
+ if (createNewLexicalScope) {
+ this.scope.exit();
+ }
+ return this.finishNode(node, "BlockStatement");
+ }
+ isValidDirective(stmt) {
+ return stmt.type === "ExpressionStatement" && stmt.expression.type === "StringLiteral" && !stmt.expression.extra.parenthesized;
+ }
+ parseBlockBody(node, allowDirectives, topLevel, end, afterBlockParse) {
+ const body = node.body = [];
+ const directives = node.directives = [];
+ this.parseBlockOrModuleBlockBody(body, allowDirectives ? directives : undefined, topLevel, end, afterBlockParse);
+ }
+ parseBlockOrModuleBlockBody(body, directives, topLevel, end, afterBlockParse) {
+ const oldStrict = this.state.strict;
+ let hasStrictModeDirective = false;
+ let parsedNonDirective = false;
+ while (!this.match(end)) {
+ const stmt = topLevel ? this.parseModuleItem() : this.parseStatementListItem();
+ if (directives && !parsedNonDirective) {
+ if (this.isValidDirective(stmt)) {
+ const directive = this.stmtToDirective(stmt);
+ directives.push(directive);
+ if (!hasStrictModeDirective && directive.value.value === "use strict") {
+ hasStrictModeDirective = true;
+ this.setStrict(true);
+ }
+ continue;
+ }
+ parsedNonDirective = true;
+ this.state.strictErrors.clear();
+ }
+ body.push(stmt);
+ }
+ afterBlockParse == null ? void 0 : afterBlockParse.call(this, hasStrictModeDirective);
+ if (!oldStrict) {
+ this.setStrict(false);
+ }
+ this.next();
+ }
+ parseFor(node, init) {
+ node.init = init;
+ this.semicolon(false);
+ node.test = this.match(13) ? null : this.parseExpression();
+ this.semicolon(false);
+ node.update = this.match(11) ? null : this.parseExpression();
+ this.expect(11);
+ node.body = this.withSmartMixTopicForbiddingContext(() => this.parseStatement());
+ this.scope.exit();
+ this.state.labels.pop();
+ return this.finishNode(node, "ForStatement");
+ }
+ parseForIn(node, init, awaitAt) {
+ const isForIn = this.match(58);
+ this.next();
+ if (isForIn) {
+ if (awaitAt !== null) this.unexpected(awaitAt);
+ } else {
+ node.await = awaitAt !== null;
+ }
+ if (init.type === "VariableDeclaration" && init.declarations[0].init != null && (!isForIn || !this.options.annexB || this.state.strict || init.kind !== "var" || init.declarations[0].id.type !== "Identifier")) {
+ this.raise(Errors.ForInOfLoopInitializer, {
+ at: init,
+ type: isForIn ? "ForInStatement" : "ForOfStatement"
+ });
+ }
+ if (init.type === "AssignmentPattern") {
+ this.raise(Errors.InvalidLhs, {
+ at: init,
+ ancestor: {
+ type: "ForStatement"
+ }
+ });
+ }
+ node.left = init;
+ node.right = isForIn ? this.parseExpression() : this.parseMaybeAssignAllowIn();
+ this.expect(11);
+ node.body = this.withSmartMixTopicForbiddingContext(() => this.parseStatement());
+ this.scope.exit();
+ this.state.labels.pop();
+ return this.finishNode(node, isForIn ? "ForInStatement" : "ForOfStatement");
+ }
+ parseVar(node, isFor, kind, allowMissingInitializer = false) {
+ const declarations = node.declarations = [];
+ node.kind = kind;
+ for (;;) {
+ const decl = this.startNode();
+ this.parseVarId(decl, kind);
+ decl.init = !this.eat(29) ? null : isFor ? this.parseMaybeAssignDisallowIn() : this.parseMaybeAssignAllowIn();
+ if (decl.init === null && !allowMissingInitializer) {
+ if (decl.id.type !== "Identifier" && !(isFor && (this.match(58) || this.isContextual(102)))) {
+ this.raise(Errors.DeclarationMissingInitializer, {
+ at: this.state.lastTokEndLoc,
+ kind: "destructuring"
+ });
+ } else if (kind === "const" && !(this.match(58) || this.isContextual(102))) {
+ this.raise(Errors.DeclarationMissingInitializer, {
+ at: this.state.lastTokEndLoc,
+ kind: "const"
+ });
+ }
+ }
+ declarations.push(this.finishNode(decl, "VariableDeclarator"));
+ if (!this.eat(12)) break;
+ }
+ return node;
+ }
+ parseVarId(decl, kind) {
+ const id = this.parseBindingAtom();
+ this.checkLVal(id, {
+ in: {
+ type: "VariableDeclarator"
+ },
+ binding: kind === "var" ? 5 : 8201
+ });
+ decl.id = id;
+ }
+ parseAsyncFunctionExpression(node) {
+ return this.parseFunction(node, 8);
+ }
+ parseFunction(node, flags = 0) {
+ const hangingDeclaration = flags & 2;
+ const isDeclaration = !!(flags & 1);
+ const requireId = isDeclaration && !(flags & 4);
+ const isAsync = !!(flags & 8);
+ this.initFunction(node, isAsync);
+ if (this.match(55)) {
+ if (hangingDeclaration) {
+ this.raise(Errors.GeneratorInSingleStatementContext, {
+ at: this.state.startLoc
+ });
+ }
+ this.next();
+ node.generator = true;
+ }
+ if (isDeclaration) {
+ node.id = this.parseFunctionId(requireId);
+ }
+ const oldMaybeInArrowParameters = this.state.maybeInArrowParameters;
+ this.state.maybeInArrowParameters = false;
+ this.scope.enter(2);
+ this.prodParam.enter(functionFlags(isAsync, node.generator));
+ if (!isDeclaration) {
+ node.id = this.parseFunctionId();
+ }
+ this.parseFunctionParams(node, false);
+ this.withSmartMixTopicForbiddingContext(() => {
+ this.parseFunctionBodyAndFinish(node, isDeclaration ? "FunctionDeclaration" : "FunctionExpression");
+ });
+ this.prodParam.exit();
+ this.scope.exit();
+ if (isDeclaration && !hangingDeclaration) {
+ this.registerFunctionStatementId(node);
+ }
+ this.state.maybeInArrowParameters = oldMaybeInArrowParameters;
+ return node;
+ }
+ parseFunctionId(requireId) {
+ return requireId || tokenIsIdentifier(this.state.type) ? this.parseIdentifier() : null;
+ }
+ parseFunctionParams(node, isConstructor) {
+ this.expect(10);
+ this.expressionScope.enter(newParameterDeclarationScope());
+ node.params = this.parseBindingList(11, 41, 2 | (isConstructor ? 4 : 0));
+ this.expressionScope.exit();
+ }
+ registerFunctionStatementId(node) {
+ if (!node.id) return;
+ this.scope.declareName(node.id.name, !this.options.annexB || this.state.strict || node.generator || node.async ? this.scope.treatFunctionsAsVar ? 5 : 8201 : 17, node.id.loc.start);
+ }
+ parseClass(node, isStatement, optionalId) {
+ this.next();
+ const oldStrict = this.state.strict;
+ this.state.strict = true;
+ this.parseClassId(node, isStatement, optionalId);
+ this.parseClassSuper(node);
+ node.body = this.parseClassBody(!!node.superClass, oldStrict);
+ return this.finishNode(node, isStatement ? "ClassDeclaration" : "ClassExpression");
+ }
+ isClassProperty() {
+ return this.match(29) || this.match(13) || this.match(8);
+ }
+ isClassMethod() {
+ return this.match(10);
+ }
+ isNonstaticConstructor(method) {
+ return !method.computed && !method.static && (method.key.name === "constructor" || method.key.value === "constructor");
+ }
+ parseClassBody(hadSuperClass, oldStrict) {
+ this.classScope.enter();
+ const state = {
+ hadConstructor: false,
+ hadSuperClass
+ };
+ let decorators = [];
+ const classBody = this.startNode();
+ classBody.body = [];
+ this.expect(5);
+ this.withSmartMixTopicForbiddingContext(() => {
+ while (!this.match(8)) {
+ if (this.eat(13)) {
+ if (decorators.length > 0) {
+ throw this.raise(Errors.DecoratorSemicolon, {
+ at: this.state.lastTokEndLoc
+ });
+ }
+ continue;
+ }
+ if (this.match(26)) {
+ decorators.push(this.parseDecorator());
+ continue;
+ }
+ const member = this.startNode();
+ if (decorators.length) {
+ member.decorators = decorators;
+ this.resetStartLocationFromNode(member, decorators[0]);
+ decorators = [];
+ }
+ this.parseClassMember(classBody, member, state);
+ if (member.kind === "constructor" && member.decorators && member.decorators.length > 0) {
+ this.raise(Errors.DecoratorConstructor, {
+ at: member
+ });
+ }
+ }
+ });
+ this.state.strict = oldStrict;
+ this.next();
+ if (decorators.length) {
+ throw this.raise(Errors.TrailingDecorator, {
+ at: this.state.startLoc
+ });
+ }
+ this.classScope.exit();
+ return this.finishNode(classBody, "ClassBody");
+ }
+ parseClassMemberFromModifier(classBody, member) {
+ const key = this.parseIdentifier(true);
+ if (this.isClassMethod()) {
+ const method = member;
+ method.kind = "method";
+ method.computed = false;
+ method.key = key;
+ method.static = false;
+ this.pushClassMethod(classBody, method, false, false, false, false);
+ return true;
+ } else if (this.isClassProperty()) {
+ const prop = member;
+ prop.computed = false;
+ prop.key = key;
+ prop.static = false;
+ classBody.body.push(this.parseClassProperty(prop));
+ return true;
+ }
+ this.resetPreviousNodeTrailingComments(key);
+ return false;
+ }
+ parseClassMember(classBody, member, state) {
+ const isStatic = this.isContextual(106);
+ if (isStatic) {
+ if (this.parseClassMemberFromModifier(classBody, member)) {
+ return;
+ }
+ if (this.eat(5)) {
+ this.parseClassStaticBlock(classBody, member);
+ return;
+ }
+ }
+ this.parseClassMemberWithIsStatic(classBody, member, state, isStatic);
+ }
+ parseClassMemberWithIsStatic(classBody, member, state, isStatic) {
+ const publicMethod = member;
+ const privateMethod = member;
+ const publicProp = member;
+ const privateProp = member;
+ const accessorProp = member;
+ const method = publicMethod;
+ const publicMember = publicMethod;
+ member.static = isStatic;
+ this.parsePropertyNamePrefixOperator(member);
+ if (this.eat(55)) {
+ method.kind = "method";
+ const isPrivateName = this.match(138);
+ this.parseClassElementName(method);
+ if (isPrivateName) {
+ this.pushClassPrivateMethod(classBody, privateMethod, true, false);
+ return;
+ }
+ if (this.isNonstaticConstructor(publicMethod)) {
+ this.raise(Errors.ConstructorIsGenerator, {
+ at: publicMethod.key
+ });
+ }
+ this.pushClassMethod(classBody, publicMethod, true, false, false, false);
+ return;
+ }
+ const isContextual = tokenIsIdentifier(this.state.type) && !this.state.containsEsc;
+ const isPrivate = this.match(138);
+ const key = this.parseClassElementName(member);
+ const maybeQuestionTokenStartLoc = this.state.startLoc;
+ this.parsePostMemberNameModifiers(publicMember);
+ if (this.isClassMethod()) {
+ method.kind = "method";
+ if (isPrivate) {
+ this.pushClassPrivateMethod(classBody, privateMethod, false, false);
+ return;
+ }
+ const isConstructor = this.isNonstaticConstructor(publicMethod);
+ let allowsDirectSuper = false;
+ if (isConstructor) {
+ publicMethod.kind = "constructor";
+ if (state.hadConstructor && !this.hasPlugin("typescript")) {
+ this.raise(Errors.DuplicateConstructor, {
+ at: key
+ });
+ }
+ if (isConstructor && this.hasPlugin("typescript") && member.override) {
+ this.raise(Errors.OverrideOnConstructor, {
+ at: key
+ });
+ }
+ state.hadConstructor = true;
+ allowsDirectSuper = state.hadSuperClass;
+ }
+ this.pushClassMethod(classBody, publicMethod, false, false, isConstructor, allowsDirectSuper);
+ } else if (this.isClassProperty()) {
+ if (isPrivate) {
+ this.pushClassPrivateProperty(classBody, privateProp);
+ } else {
+ this.pushClassProperty(classBody, publicProp);
+ }
+ } else if (isContextual && key.name === "async" && !this.isLineTerminator()) {
+ this.resetPreviousNodeTrailingComments(key);
+ const isGenerator = this.eat(55);
+ if (publicMember.optional) {
+ this.unexpected(maybeQuestionTokenStartLoc);
+ }
+ method.kind = "method";
+ const isPrivate = this.match(138);
+ this.parseClassElementName(method);
+ this.parsePostMemberNameModifiers(publicMember);
+ if (isPrivate) {
+ this.pushClassPrivateMethod(classBody, privateMethod, isGenerator, true);
+ } else {
+ if (this.isNonstaticConstructor(publicMethod)) {
+ this.raise(Errors.ConstructorIsAsync, {
+ at: publicMethod.key
+ });
+ }
+ this.pushClassMethod(classBody, publicMethod, isGenerator, true, false, false);
+ }
+ } else if (isContextual && (key.name === "get" || key.name === "set") && !(this.match(55) && this.isLineTerminator())) {
+ this.resetPreviousNodeTrailingComments(key);
+ method.kind = key.name;
+ const isPrivate = this.match(138);
+ this.parseClassElementName(publicMethod);
+ if (isPrivate) {
+ this.pushClassPrivateMethod(classBody, privateMethod, false, false);
+ } else {
+ if (this.isNonstaticConstructor(publicMethod)) {
+ this.raise(Errors.ConstructorIsAccessor, {
+ at: publicMethod.key
+ });
+ }
+ this.pushClassMethod(classBody, publicMethod, false, false, false, false);
+ }
+ this.checkGetterSetterParams(publicMethod);
+ } else if (isContextual && key.name === "accessor" && !this.isLineTerminator()) {
+ this.expectPlugin("decoratorAutoAccessors");
+ this.resetPreviousNodeTrailingComments(key);
+ const isPrivate = this.match(138);
+ this.parseClassElementName(publicProp);
+ this.pushClassAccessorProperty(classBody, accessorProp, isPrivate);
+ } else if (this.isLineTerminator()) {
+ if (isPrivate) {
+ this.pushClassPrivateProperty(classBody, privateProp);
+ } else {
+ this.pushClassProperty(classBody, publicProp);
+ }
+ } else {
+ this.unexpected();
+ }
+ }
+ parseClassElementName(member) {
+ const {
+ type,
+ value
+ } = this.state;
+ if ((type === 132 || type === 133) && member.static && value === "prototype") {
+ this.raise(Errors.StaticPrototype, {
+ at: this.state.startLoc
+ });
+ }
+ if (type === 138) {
+ if (value === "constructor") {
+ this.raise(Errors.ConstructorClassPrivateField, {
+ at: this.state.startLoc
+ });
+ }
+ const key = this.parsePrivateName();
+ member.key = key;
+ return key;
+ }
+ return this.parsePropertyName(member);
+ }
+ parseClassStaticBlock(classBody, member) {
+ var _member$decorators;
+ this.scope.enter(64 | 128 | 16);
+ const oldLabels = this.state.labels;
+ this.state.labels = [];
+ this.prodParam.enter(PARAM);
+ const body = member.body = [];
+ this.parseBlockOrModuleBlockBody(body, undefined, false, 8);
+ this.prodParam.exit();
+ this.scope.exit();
+ this.state.labels = oldLabels;
+ classBody.body.push(this.finishNode(member, "StaticBlock"));
+ if ((_member$decorators = member.decorators) != null && _member$decorators.length) {
+ this.raise(Errors.DecoratorStaticBlock, {
+ at: member
+ });
+ }
+ }
+ pushClassProperty(classBody, prop) {
+ if (!prop.computed && (prop.key.name === "constructor" || prop.key.value === "constructor")) {
+ this.raise(Errors.ConstructorClassField, {
+ at: prop.key
+ });
+ }
+ classBody.body.push(this.parseClassProperty(prop));
+ }
+ pushClassPrivateProperty(classBody, prop) {
+ const node = this.parseClassPrivateProperty(prop);
+ classBody.body.push(node);
+ this.classScope.declarePrivateName(this.getPrivateNameSV(node.key), 0, node.key.loc.start);
+ }
+ pushClassAccessorProperty(classBody, prop, isPrivate) {
+ if (!isPrivate && !prop.computed) {
+ const key = prop.key;
+ if (key.name === "constructor" || key.value === "constructor") {
+ this.raise(Errors.ConstructorClassField, {
+ at: key
+ });
+ }
+ }
+ const node = this.parseClassAccessorProperty(prop);
+ classBody.body.push(node);
+ if (isPrivate) {
+ this.classScope.declarePrivateName(this.getPrivateNameSV(node.key), 0, node.key.loc.start);
+ }
+ }
+ pushClassMethod(classBody, method, isGenerator, isAsync, isConstructor, allowsDirectSuper) {
+ classBody.body.push(this.parseMethod(method, isGenerator, isAsync, isConstructor, allowsDirectSuper, "ClassMethod", true));
+ }
+ pushClassPrivateMethod(classBody, method, isGenerator, isAsync) {
+ const node = this.parseMethod(method, isGenerator, isAsync, false, false, "ClassPrivateMethod", true);
+ classBody.body.push(node);
+ const kind = node.kind === "get" ? node.static ? 6 : 2 : node.kind === "set" ? node.static ? 5 : 1 : 0;
+ this.declareClassPrivateMethodInScope(node, kind);
+ }
+ declareClassPrivateMethodInScope(node, kind) {
+ this.classScope.declarePrivateName(this.getPrivateNameSV(node.key), kind, node.key.loc.start);
+ }
+ parsePostMemberNameModifiers(methodOrProp) {}
+ parseClassPrivateProperty(node) {
+ this.parseInitializer(node);
+ this.semicolon();
+ return this.finishNode(node, "ClassPrivateProperty");
+ }
+ parseClassProperty(node) {
+ this.parseInitializer(node);
+ this.semicolon();
+ return this.finishNode(node, "ClassProperty");
+ }
+ parseClassAccessorProperty(node) {
+ this.parseInitializer(node);
+ this.semicolon();
+ return this.finishNode(node, "ClassAccessorProperty");
+ }
+ parseInitializer(node) {
+ this.scope.enter(64 | 16);
+ this.expressionScope.enter(newExpressionScope());
+ this.prodParam.enter(PARAM);
+ node.value = this.eat(29) ? this.parseMaybeAssignAllowIn() : null;
+ this.expressionScope.exit();
+ this.prodParam.exit();
+ this.scope.exit();
+ }
+ parseClassId(node, isStatement, optionalId, bindingType = 8331) {
+ if (tokenIsIdentifier(this.state.type)) {
+ node.id = this.parseIdentifier();
+ if (isStatement) {
+ this.declareNameFromIdentifier(node.id, bindingType);
+ }
+ } else {
+ if (optionalId || !isStatement) {
+ node.id = null;
+ } else {
+ throw this.raise(Errors.MissingClassName, {
+ at: this.state.startLoc
+ });
+ }
+ }
+ }
+ parseClassSuper(node) {
+ node.superClass = this.eat(81) ? this.parseExprSubscripts() : null;
+ }
+ parseExport(node, decorators) {
+ const maybeDefaultIdentifier = this.parseMaybeImportPhase(node, true);
+ const hasDefault = this.maybeParseExportDefaultSpecifier(node, maybeDefaultIdentifier);
+ const parseAfterDefault = !hasDefault || this.eat(12);
+ const hasStar = parseAfterDefault && this.eatExportStar(node);
+ const hasNamespace = hasStar && this.maybeParseExportNamespaceSpecifier(node);
+ const parseAfterNamespace = parseAfterDefault && (!hasNamespace || this.eat(12));
+ const isFromRequired = hasDefault || hasStar;
+ if (hasStar && !hasNamespace) {
+ if (hasDefault) this.unexpected();
+ if (decorators) {
+ throw this.raise(Errors.UnsupportedDecoratorExport, {
+ at: node
+ });
+ }
+ this.parseExportFrom(node, true);
+ return this.finishNode(node, "ExportAllDeclaration");
+ }
+ const hasSpecifiers = this.maybeParseExportNamedSpecifiers(node);
+ if (hasDefault && parseAfterDefault && !hasStar && !hasSpecifiers) {
+ this.unexpected(null, 5);
+ }
+ if (hasNamespace && parseAfterNamespace) {
+ this.unexpected(null, 98);
+ }
+ let hasDeclaration;
+ if (isFromRequired || hasSpecifiers) {
+ hasDeclaration = false;
+ if (decorators) {
+ throw this.raise(Errors.UnsupportedDecoratorExport, {
+ at: node
+ });
+ }
+ this.parseExportFrom(node, isFromRequired);
+ } else {
+ hasDeclaration = this.maybeParseExportDeclaration(node);
+ }
+ if (isFromRequired || hasSpecifiers || hasDeclaration) {
+ var _node2$declaration;
+ const node2 = node;
+ this.checkExport(node2, true, false, !!node2.source);
+ if (((_node2$declaration = node2.declaration) == null ? void 0 : _node2$declaration.type) === "ClassDeclaration") {
+ this.maybeTakeDecorators(decorators, node2.declaration, node2);
+ } else if (decorators) {
+ throw this.raise(Errors.UnsupportedDecoratorExport, {
+ at: node
+ });
+ }
+ return this.finishNode(node2, "ExportNamedDeclaration");
+ }
+ if (this.eat(65)) {
+ const node2 = node;
+ const decl = this.parseExportDefaultExpression();
+ node2.declaration = decl;
+ if (decl.type === "ClassDeclaration") {
+ this.maybeTakeDecorators(decorators, decl, node2);
+ } else if (decorators) {
+ throw this.raise(Errors.UnsupportedDecoratorExport, {
+ at: node
+ });
+ }
+ this.checkExport(node2, true, true);
+ return this.finishNode(node2, "ExportDefaultDeclaration");
+ }
+ this.unexpected(null, 5);
+ }
+ eatExportStar(node) {
+ return this.eat(55);
+ }
+ maybeParseExportDefaultSpecifier(node, maybeDefaultIdentifier) {
+ if (maybeDefaultIdentifier || this.isExportDefaultSpecifier()) {
+ this.expectPlugin("exportDefaultFrom", maybeDefaultIdentifier == null ? void 0 : maybeDefaultIdentifier.loc.start);
+ const id = maybeDefaultIdentifier || this.parseIdentifier(true);
+ const specifier = this.startNodeAtNode(id);
+ specifier.exported = id;
+ node.specifiers = [this.finishNode(specifier, "ExportDefaultSpecifier")];
+ return true;
+ }
+ return false;
+ }
+ maybeParseExportNamespaceSpecifier(node) {
+ if (this.isContextual(93)) {
+ if (!node.specifiers) node.specifiers = [];
+ const specifier = this.startNodeAt(this.state.lastTokStartLoc);
+ this.next();
+ specifier.exported = this.parseModuleExportName();
+ node.specifiers.push(this.finishNode(specifier, "ExportNamespaceSpecifier"));
+ return true;
+ }
+ return false;
+ }
+ maybeParseExportNamedSpecifiers(node) {
+ if (this.match(5)) {
+ if (!node.specifiers) node.specifiers = [];
+ const isTypeExport = node.exportKind === "type";
+ node.specifiers.push(...this.parseExportSpecifiers(isTypeExport));
+ node.source = null;
+ node.declaration = null;
+ if (this.hasPlugin("importAssertions")) {
+ node.assertions = [];
+ }
+ return true;
+ }
+ return false;
+ }
+ maybeParseExportDeclaration(node) {
+ if (this.shouldParseExportDeclaration()) {
+ node.specifiers = [];
+ node.source = null;
+ if (this.hasPlugin("importAssertions")) {
+ node.assertions = [];
+ }
+ node.declaration = this.parseExportDeclaration(node);
+ return true;
+ }
+ return false;
+ }
+ isAsyncFunction() {
+ if (!this.isContextual(95)) return false;
+ const next = this.nextTokenInLineStart();
+ return this.isUnparsedContextual(next, "function");
+ }
+ parseExportDefaultExpression() {
+ const expr = this.startNode();
+ if (this.match(68)) {
+ this.next();
+ return this.parseFunction(expr, 1 | 4);
+ } else if (this.isAsyncFunction()) {
+ this.next();
+ this.next();
+ return this.parseFunction(expr, 1 | 4 | 8);
+ }
+ if (this.match(80)) {
+ return this.parseClass(expr, true, true);
+ }
+ if (this.match(26)) {
+ if (this.hasPlugin("decorators") && this.getPluginOption("decorators", "decoratorsBeforeExport") === true) {
+ this.raise(Errors.DecoratorBeforeExport, {
+ at: this.state.startLoc
+ });
+ }
+ return this.parseClass(this.maybeTakeDecorators(this.parseDecorators(false), this.startNode()), true, true);
+ }
+ if (this.match(75) || this.match(74) || this.isLet()) {
+ throw this.raise(Errors.UnsupportedDefaultExport, {
+ at: this.state.startLoc
+ });
+ }
+ const res = this.parseMaybeAssignAllowIn();
+ this.semicolon();
+ return res;
+ }
+ parseExportDeclaration(node) {
+ if (this.match(80)) {
+ const node = this.parseClass(this.startNode(), true, false);
+ return node;
+ }
+ return this.parseStatementListItem();
+ }
+ isExportDefaultSpecifier() {
+ const {
+ type
+ } = this.state;
+ if (tokenIsIdentifier(type)) {
+ if (type === 95 && !this.state.containsEsc || type === 100) {
+ return false;
+ }
+ if ((type === 130 || type === 129) && !this.state.containsEsc) {
+ const {
+ type: nextType
+ } = this.lookahead();
+ if (tokenIsIdentifier(nextType) && nextType !== 98 || nextType === 5) {
+ this.expectOnePlugin(["flow", "typescript"]);
+ return false;
+ }
+ }
+ } else if (!this.match(65)) {
+ return false;
+ }
+ const next = this.nextTokenStart();
+ const hasFrom = this.isUnparsedContextual(next, "from");
+ if (this.input.charCodeAt(next) === 44 || tokenIsIdentifier(this.state.type) && hasFrom) {
+ return true;
+ }
+ if (this.match(65) && hasFrom) {
+ const nextAfterFrom = this.input.charCodeAt(this.nextTokenStartSince(next + 4));
+ return nextAfterFrom === 34 || nextAfterFrom === 39;
+ }
+ return false;
+ }
+ parseExportFrom(node, expect) {
+ if (this.eatContextual(98)) {
+ node.source = this.parseImportSource();
+ this.checkExport(node);
+ this.maybeParseImportAttributes(node);
+ this.checkJSONModuleImport(node);
+ } else if (expect) {
+ this.unexpected();
+ }
+ this.semicolon();
+ }
+ shouldParseExportDeclaration() {
+ const {
+ type
+ } = this.state;
+ if (type === 26) {
+ this.expectOnePlugin(["decorators", "decorators-legacy"]);
+ if (this.hasPlugin("decorators")) {
+ if (this.getPluginOption("decorators", "decoratorsBeforeExport") === true) {
+ this.raise(Errors.DecoratorBeforeExport, {
+ at: this.state.startLoc
+ });
+ }
+ return true;
+ }
+ }
+ return type === 74 || type === 75 || type === 68 || type === 80 || this.isLet() || this.isAsyncFunction();
+ }
+ checkExport(node, checkNames, isDefault, isFrom) {
+ if (checkNames) {
+ var _node$specifiers;
+ if (isDefault) {
+ this.checkDuplicateExports(node, "default");
+ if (this.hasPlugin("exportDefaultFrom")) {
+ var _declaration$extra;
+ const declaration = node.declaration;
+ if (declaration.type === "Identifier" && declaration.name === "from" && declaration.end - declaration.start === 4 && !((_declaration$extra = declaration.extra) != null && _declaration$extra.parenthesized)) {
+ this.raise(Errors.ExportDefaultFromAsIdentifier, {
+ at: declaration
+ });
+ }
+ }
+ } else if ((_node$specifiers = node.specifiers) != null && _node$specifiers.length) {
+ for (const specifier of node.specifiers) {
+ const {
+ exported
+ } = specifier;
+ const exportName = exported.type === "Identifier" ? exported.name : exported.value;
+ this.checkDuplicateExports(specifier, exportName);
+ if (!isFrom && specifier.local) {
+ const {
+ local
+ } = specifier;
+ if (local.type !== "Identifier") {
+ this.raise(Errors.ExportBindingIsString, {
+ at: specifier,
+ localName: local.value,
+ exportName
+ });
+ } else {
+ this.checkReservedWord(local.name, local.loc.start, true, false);
+ this.scope.checkLocalExport(local);
+ }
+ }
+ }
+ } else if (node.declaration) {
+ if (node.declaration.type === "FunctionDeclaration" || node.declaration.type === "ClassDeclaration") {
+ const id = node.declaration.id;
+ if (!id) throw new Error("Assertion failure");
+ this.checkDuplicateExports(node, id.name);
+ } else if (node.declaration.type === "VariableDeclaration") {
+ for (const declaration of node.declaration.declarations) {
+ this.checkDeclaration(declaration.id);
+ }
+ }
+ }
+ }
+ }
+ checkDeclaration(node) {
+ if (node.type === "Identifier") {
+ this.checkDuplicateExports(node, node.name);
+ } else if (node.type === "ObjectPattern") {
+ for (const prop of node.properties) {
+ this.checkDeclaration(prop);
+ }
+ } else if (node.type === "ArrayPattern") {
+ for (const elem of node.elements) {
+ if (elem) {
+ this.checkDeclaration(elem);
+ }
+ }
+ } else if (node.type === "ObjectProperty") {
+ this.checkDeclaration(node.value);
+ } else if (node.type === "RestElement") {
+ this.checkDeclaration(node.argument);
+ } else if (node.type === "AssignmentPattern") {
+ this.checkDeclaration(node.left);
+ }
+ }
+ checkDuplicateExports(node, exportName) {
+ if (this.exportedIdentifiers.has(exportName)) {
+ if (exportName === "default") {
+ this.raise(Errors.DuplicateDefaultExport, {
+ at: node
+ });
+ } else {
+ this.raise(Errors.DuplicateExport, {
+ at: node,
+ exportName
+ });
+ }
+ }
+ this.exportedIdentifiers.add(exportName);
+ }
+ parseExportSpecifiers(isInTypeExport) {
+ const nodes = [];
+ let first = true;
+ this.expect(5);
+ while (!this.eat(8)) {
+ if (first) {
+ first = false;
+ } else {
+ this.expect(12);
+ if (this.eat(8)) break;
+ }
+ const isMaybeTypeOnly = this.isContextual(130);
+ const isString = this.match(133);
+ const node = this.startNode();
+ node.local = this.parseModuleExportName();
+ nodes.push(this.parseExportSpecifier(node, isString, isInTypeExport, isMaybeTypeOnly));
+ }
+ return nodes;
+ }
+ parseExportSpecifier(node, isString, isInTypeExport, isMaybeTypeOnly) {
+ if (this.eatContextual(93)) {
+ node.exported = this.parseModuleExportName();
+ } else if (isString) {
+ node.exported = cloneStringLiteral(node.local);
+ } else if (!node.exported) {
+ node.exported = cloneIdentifier(node.local);
+ }
+ return this.finishNode(node, "ExportSpecifier");
+ }
+ parseModuleExportName() {
+ if (this.match(133)) {
+ const result = this.parseStringLiteral(this.state.value);
+ const surrogate = result.value.match(loneSurrogate);
+ if (surrogate) {
+ this.raise(Errors.ModuleExportNameHasLoneSurrogate, {
+ at: result,
+ surrogateCharCode: surrogate[0].charCodeAt(0)
+ });
+ }
+ return result;
+ }
+ return this.parseIdentifier(true);
+ }
+ isJSONModuleImport(node) {
+ if (node.assertions != null) {
+ return node.assertions.some(({
+ key,
+ value
+ }) => {
+ return value.value === "json" && (key.type === "Identifier" ? key.name === "type" : key.value === "type");
+ });
+ }
+ return false;
+ }
+ checkImportReflection(node) {
+ const {
+ specifiers
+ } = node;
+ const singleBindingType = specifiers.length === 1 ? specifiers[0].type : null;
+ if (node.phase === "source") {
+ if (singleBindingType !== "ImportDefaultSpecifier") {
+ this.raise(Errors.SourcePhaseImportRequiresDefault, {
+ at: specifiers[0].loc.start
+ });
+ }
+ } else if (node.phase === "defer") {
+ if (singleBindingType !== "ImportNamespaceSpecifier") {
+ this.raise(Errors.DeferImportRequiresNamespace, {
+ at: specifiers[0].loc.start
+ });
+ }
+ } else if (node.module) {
+ var _node$assertions;
+ if (singleBindingType !== "ImportDefaultSpecifier") {
+ this.raise(Errors.ImportReflectionNotBinding, {
+ at: specifiers[0].loc.start
+ });
+ }
+ if (((_node$assertions = node.assertions) == null ? void 0 : _node$assertions.length) > 0) {
+ this.raise(Errors.ImportReflectionHasAssertion, {
+ at: node.specifiers[0].loc.start
+ });
+ }
+ }
+ }
+ checkJSONModuleImport(node) {
+ if (this.isJSONModuleImport(node) && node.type !== "ExportAllDeclaration") {
+ const {
+ specifiers
+ } = node;
+ if (specifiers != null) {
+ const nonDefaultNamedSpecifier = specifiers.find(specifier => {
+ let imported;
+ if (specifier.type === "ExportSpecifier") {
+ imported = specifier.local;
+ } else if (specifier.type === "ImportSpecifier") {
+ imported = specifier.imported;
+ }
+ if (imported !== undefined) {
+ return imported.type === "Identifier" ? imported.name !== "default" : imported.value !== "default";
+ }
+ });
+ if (nonDefaultNamedSpecifier !== undefined) {
+ this.raise(Errors.ImportJSONBindingNotDefault, {
+ at: nonDefaultNamedSpecifier.loc.start
+ });
+ }
+ }
+ }
+ }
+ isPotentialImportPhase(isExport) {
+ if (isExport) return false;
+ return this.isContextual(105) || this.isContextual(97) || this.isContextual(127);
+ }
+ applyImportPhase(node, isExport, phase, loc) {
+ if (isExport) {
+ return;
+ }
+ if (phase === "module") {
+ this.expectPlugin("importReflection", loc);
+ node.module = true;
+ } else if (this.hasPlugin("importReflection")) {
+ node.module = false;
+ }
+ if (phase === "source") {
+ this.expectPlugin("sourcePhaseImports", loc);
+ node.phase = "source";
+ } else if (phase === "defer") {
+ this.expectPlugin("deferredImportEvaluation", loc);
+ node.phase = "defer";
+ } else if (this.hasPlugin("sourcePhaseImports")) {
+ node.phase = null;
+ }
+ }
+ parseMaybeImportPhase(node, isExport) {
+ if (!this.isPotentialImportPhase(isExport)) {
+ this.applyImportPhase(node, isExport, null);
+ return null;
+ }
+ const phaseIdentifier = this.parseIdentifier(true);
+ const {
+ type
+ } = this.state;
+ const isImportPhase = tokenIsKeywordOrIdentifier(type) ? type !== 98 || this.lookaheadCharCode() === 102 : type !== 12;
+ if (isImportPhase) {
+ this.resetPreviousIdentifierLeadingComments(phaseIdentifier);
+ this.applyImportPhase(node, isExport, phaseIdentifier.name, phaseIdentifier.loc.start);
+ return null;
+ } else {
+ this.applyImportPhase(node, isExport, null);
+ return phaseIdentifier;
+ }
+ }
+ isPrecedingIdImportPhase(phase) {
+ const {
+ type
+ } = this.state;
+ return tokenIsIdentifier(type) ? type !== 98 || this.lookaheadCharCode() === 102 : type !== 12;
+ }
+ parseImport(node) {
+ if (this.match(133)) {
+ return this.parseImportSourceAndAttributes(node);
+ }
+ return this.parseImportSpecifiersAndAfter(node, this.parseMaybeImportPhase(node, false));
+ }
+ parseImportSpecifiersAndAfter(node, maybeDefaultIdentifier) {
+ node.specifiers = [];
+ const hasDefault = this.maybeParseDefaultImportSpecifier(node, maybeDefaultIdentifier);
+ const parseNext = !hasDefault || this.eat(12);
+ const hasStar = parseNext && this.maybeParseStarImportSpecifier(node);
+ if (parseNext && !hasStar) this.parseNamedImportSpecifiers(node);
+ this.expectContextual(98);
+ return this.parseImportSourceAndAttributes(node);
+ }
+ parseImportSourceAndAttributes(node) {
+ var _node$specifiers2;
+ (_node$specifiers2 = node.specifiers) != null ? _node$specifiers2 : node.specifiers = [];
+ node.source = this.parseImportSource();
+ this.maybeParseImportAttributes(node);
+ this.checkImportReflection(node);
+ this.checkJSONModuleImport(node);
+ this.semicolon();
+ return this.finishNode(node, "ImportDeclaration");
+ }
+ parseImportSource() {
+ if (!this.match(133)) this.unexpected();
+ return this.parseExprAtom();
+ }
+ parseImportSpecifierLocal(node, specifier, type) {
+ specifier.local = this.parseIdentifier();
+ node.specifiers.push(this.finishImportSpecifier(specifier, type));
+ }
+ finishImportSpecifier(specifier, type, bindingType = 8201) {
+ this.checkLVal(specifier.local, {
+ in: {
+ type
+ },
+ binding: bindingType
+ });
+ return this.finishNode(specifier, type);
+ }
+ parseImportAttributes() {
+ this.expect(5);
+ const attrs = [];
+ const attrNames = new Set();
+ do {
+ if (this.match(8)) {
+ break;
+ }
+ const node = this.startNode();
+ const keyName = this.state.value;
+ if (attrNames.has(keyName)) {
+ this.raise(Errors.ModuleAttributesWithDuplicateKeys, {
+ at: this.state.startLoc,
+ key: keyName
+ });
+ }
+ attrNames.add(keyName);
+ if (this.match(133)) {
+ node.key = this.parseStringLiteral(keyName);
+ } else {
+ node.key = this.parseIdentifier(true);
+ }
+ this.expect(14);
+ if (!this.match(133)) {
+ throw this.raise(Errors.ModuleAttributeInvalidValue, {
+ at: this.state.startLoc
+ });
+ }
+ node.value = this.parseStringLiteral(this.state.value);
+ attrs.push(this.finishNode(node, "ImportAttribute"));
+ } while (this.eat(12));
+ this.expect(8);
+ return attrs;
+ }
+ parseModuleAttributes() {
+ const attrs = [];
+ const attributes = new Set();
+ do {
+ const node = this.startNode();
+ node.key = this.parseIdentifier(true);
+ if (node.key.name !== "type") {
+ this.raise(Errors.ModuleAttributeDifferentFromType, {
+ at: node.key
+ });
+ }
+ if (attributes.has(node.key.name)) {
+ this.raise(Errors.ModuleAttributesWithDuplicateKeys, {
+ at: node.key,
+ key: node.key.name
+ });
+ }
+ attributes.add(node.key.name);
+ this.expect(14);
+ if (!this.match(133)) {
+ throw this.raise(Errors.ModuleAttributeInvalidValue, {
+ at: this.state.startLoc
+ });
+ }
+ node.value = this.parseStringLiteral(this.state.value);
+ attrs.push(this.finishNode(node, "ImportAttribute"));
+ } while (this.eat(12));
+ return attrs;
+ }
+ maybeParseImportAttributes(node) {
+ let attributes;
+ let useWith = false;
+ if (this.match(76)) {
+ if (this.hasPrecedingLineBreak() && this.lookaheadCharCode() === 40) {
+ return;
+ }
+ this.next();
+ {
+ if (this.hasPlugin("moduleAttributes")) {
+ attributes = this.parseModuleAttributes();
+ } else {
+ this.expectImportAttributesPlugin();
+ attributes = this.parseImportAttributes();
+ }
+ }
+ useWith = true;
+ } else if (this.isContextual(94) && !this.hasPrecedingLineBreak()) {
+ if (this.hasPlugin("importAttributes")) {
+ if (this.getPluginOption("importAttributes", "deprecatedAssertSyntax") !== true) {
+ this.raise(Errors.ImportAttributesUseAssert, {
+ at: this.state.startLoc
+ });
+ }
+ this.addExtra(node, "deprecatedAssertSyntax", true);
+ } else {
+ this.expectOnePlugin(["importAttributes", "importAssertions"]);
+ }
+ this.next();
+ attributes = this.parseImportAttributes();
+ } else if (this.hasPlugin("importAttributes") || this.hasPlugin("importAssertions")) {
+ attributes = [];
+ } else {
+ if (this.hasPlugin("moduleAttributes")) {
+ attributes = [];
+ } else return;
+ }
+ if (!useWith && this.hasPlugin("importAssertions")) {
+ node.assertions = attributes;
+ } else {
+ node.attributes = attributes;
+ }
+ }
+ maybeParseDefaultImportSpecifier(node, maybeDefaultIdentifier) {
+ if (maybeDefaultIdentifier) {
+ const specifier = this.startNodeAtNode(maybeDefaultIdentifier);
+ specifier.local = maybeDefaultIdentifier;
+ node.specifiers.push(this.finishImportSpecifier(specifier, "ImportDefaultSpecifier"));
+ return true;
+ } else if (tokenIsKeywordOrIdentifier(this.state.type)) {
+ this.parseImportSpecifierLocal(node, this.startNode(), "ImportDefaultSpecifier");
+ return true;
+ }
+ return false;
+ }
+ maybeParseStarImportSpecifier(node) {
+ if (this.match(55)) {
+ const specifier = this.startNode();
+ this.next();
+ this.expectContextual(93);
+ this.parseImportSpecifierLocal(node, specifier, "ImportNamespaceSpecifier");
+ return true;
+ }
+ return false;
+ }
+ parseNamedImportSpecifiers(node) {
+ let first = true;
+ this.expect(5);
+ while (!this.eat(8)) {
+ if (first) {
+ first = false;
+ } else {
+ if (this.eat(14)) {
+ throw this.raise(Errors.DestructureNamedImport, {
+ at: this.state.startLoc
+ });
+ }
+ this.expect(12);
+ if (this.eat(8)) break;
+ }
+ const specifier = this.startNode();
+ const importedIsString = this.match(133);
+ const isMaybeTypeOnly = this.isContextual(130);
+ specifier.imported = this.parseModuleExportName();
+ const importSpecifier = this.parseImportSpecifier(specifier, importedIsString, node.importKind === "type" || node.importKind === "typeof", isMaybeTypeOnly, undefined);
+ node.specifiers.push(importSpecifier);
+ }
+ }
+ parseImportSpecifier(specifier, importedIsString, isInTypeOnlyImport, isMaybeTypeOnly, bindingType) {
+ if (this.eatContextual(93)) {
+ specifier.local = this.parseIdentifier();
+ } else {
+ const {
+ imported
+ } = specifier;
+ if (importedIsString) {
+ throw this.raise(Errors.ImportBindingIsString, {
+ at: specifier,
+ importName: imported.value
+ });
+ }
+ this.checkReservedWord(imported.name, specifier.loc.start, true, true);
+ if (!specifier.local) {
+ specifier.local = cloneIdentifier(imported);
+ }
+ }
+ return this.finishImportSpecifier(specifier, "ImportSpecifier", bindingType);
+ }
+ isThisParam(param) {
+ return param.type === "Identifier" && param.name === "this";
+ }
+ }
+ class Parser extends StatementParser {
+ constructor(options, input) {
+ options = getOptions(options);
+ super(options, input);
+ this.options = options;
+ this.initializeScopes();
+ this.plugins = pluginsMap(this.options.plugins);
+ this.filename = options.sourceFilename;
+ }
+ getScopeHandler() {
+ return ScopeHandler;
+ }
+ parse() {
+ this.enterInitialScopes();
+ const file = this.startNode();
+ const program = this.startNode();
+ this.nextToken();
+ file.errors = null;
+ this.parseTopLevel(file, program);
+ file.errors = this.state.errors;
+ return file;
+ }
+ }
+ function pluginsMap(plugins) {
+ const pluginMap = new Map();
+ for (const plugin of plugins) {
+ const [name, options] = Array.isArray(plugin) ? plugin : [plugin, {}];
+ if (!pluginMap.has(name)) pluginMap.set(name, options || {});
+ }
+ return pluginMap;
+ }
+ function parse(input, options) {
+ var _options;
+ if (((_options = options) == null ? void 0 : _options.sourceType) === "unambiguous") {
+ options = Object.assign({}, options);
+ try {
+ options.sourceType = "module";
+ const parser = getParser(options, input);
+ const ast = parser.parse();
+ if (parser.sawUnambiguousESM) {
+ return ast;
+ }
+ if (parser.ambiguousScriptDifferentAst) {
+ try {
+ options.sourceType = "script";
+ return getParser(options, input).parse();
+ } catch (_unused) {}
+ } else {
+ ast.program.sourceType = "script";
+ }
+ return ast;
+ } catch (moduleError) {
+ try {
+ options.sourceType = "script";
+ return getParser(options, input).parse();
+ } catch (_unused2) {}
+ throw moduleError;
+ }
+ } else {
+ return getParser(options, input).parse();
+ }
+ }
+ function parseExpression(input, options) {
+ const parser = getParser(options, input);
+ if (parser.options.strictMode) {
+ parser.state.strict = true;
+ }
+ return parser.getExpression();
+ }
+ function generateExportedTokenTypes(internalTokenTypes) {
+ const tokenTypes = {};
+ for (const typeName of Object.keys(internalTokenTypes)) {
+ tokenTypes[typeName] = getExportedToken(internalTokenTypes[typeName]);
+ }
+ return tokenTypes;
+ }
+ const tokTypes = generateExportedTokenTypes(tt);
+ function getParser(options, input) {
+ let cls = Parser;
+ if (options != null && options.plugins) {
+ validatePlugins(options.plugins);
+ cls = getParserClass(options.plugins);
+ }
+ return new cls(options, input);
+ }
+ const parserClassCache = {};
+ function getParserClass(pluginsFromOptions) {
+ const pluginList = mixinPluginNames.filter(name => hasPlugin(pluginsFromOptions, name));
+ const key = pluginList.join("/");
+ let cls = parserClassCache[key];
+ if (!cls) {
+ cls = Parser;
+ for (const plugin of pluginList) {
+ cls = mixinPlugins[plugin](cls);
+ }
+ parserClassCache[key] = cls;
+ }
+ return cls;
+ }
+ lib$1.parse = parse;
+ lib$1.parseExpression = parseExpression;
+ lib$1.tokTypes = tokTypes;
+
+ return lib$1;
+ }
+
+ var libExports$1 = requireLib$1();
+
+ /**
+ * https://github.com/ryanjduffy/parse-script-tags
+ *
+ * Copyright (c) by Ryan Duff
+ * Licensed under the MIT License.
+ */
+
+ const alphanum = /[a-z0-9\-]/i;
+
+ function parseToken(str, start) {
+ let i = start;
+ while (i < str.length && alphanum.test(str.charAt(i++))) {
+ continue;
+ }
+
+ if (i !== start) {
+ return {
+ token: str.substring(start, i - 1),
+ index: i,
+ };
+ }
+
+ return null;
+ }
+
+ function parseAttributes(str, start) {
+ let i = start;
+ const attributes = {};
+ let attribute = null;
+
+ while (i < str.length) {
+ const c = str.charAt(i);
+
+ if (attribute === null && c == ">") {
+ break;
+ } else if (attribute === null && alphanum.test(c)) {
+ attribute = {
+ name: null,
+ value: true,
+ bool: true,
+ terminator: null,
+ };
+
+ const attributeNameNode = parseToken(str, i);
+ if (attributeNameNode) {
+ attribute.name = attributeNameNode.token;
+ i = attributeNameNode.index - 2;
+ }
+ } else if (attribute !== null) {
+ if (c === "=") {
+ // once we've started an attribute, look for = to indicate
+ // it's a non-boolean attribute
+ attribute.bool = false;
+ if (attribute.value === true) {
+ attribute.value = "";
+ }
+ } else if (
+ !attribute.bool &&
+ attribute.terminator === null &&
+ (c === '"' || c === "'")
+ ) {
+ // once we've determined it's non-boolean, look for a
+ // value terminator (", ')
+ attribute.terminator = c;
+ } else if (attribute.terminator) {
+ if (c === attribute.terminator) {
+ // if we had a terminator and found another, we've
+ // reach the end of the attribute
+ attributes[attribute.name] = attribute.value;
+ attribute = null;
+ } else {
+ // otherwise, append the character to the attribute value
+ attribute.value += c;
+
+ // check for an escaped terminator and push it as well
+ // to avoid terminating prematurely
+ if (c === "\\") {
+ const next = str.charAt(i + 1);
+ if (next === attribute.terminator) {
+ attribute.value += next;
+ i += 1;
+ }
+ }
+ }
+ } else if (!/\s/.test(c)) {
+ // if we've hit a non-space character and aren't processing a value,
+ // we're starting a new attribute so push the attribute and clear the
+ // local variable
+ attributes[attribute.name] = attribute.value;
+ attribute = null;
+
+ // move the cursor back to re-find the start of the attribute
+ i -= 1;
+ }
+ }
+
+ i++;
+ }
+
+ if (i !== start) {
+ return {
+ attributes,
+ index: i,
+ };
+ }
+
+ return null;
+ }
+
+ function parseFragment(str, start = 0) {
+ let tag = null;
+ let open = false;
+ let attributes = {};
+
+ let i = start;
+ while (i < str.length) {
+ const c = str.charAt(i++);
+
+ if (!open && !tag && c === "<") {
+ // Open Start Tag
+ open = true;
+
+ const tagNode = parseToken(str, i);
+ if (!tagNode) {
+ return null;
+ }
+
+ i = tagNode.index - 1;
+ tag = tagNode.token;
+ } else if (open && c === ">") {
+ // Close Start Tag
+ break;
+ } else if (open) {
+ // Attributes
+ const attributeNode = parseAttributes(str, i - 1);
+
+ if (attributeNode) {
+ i = attributeNode.index;
+ attributes = attributeNode.attributes || attributes;
+ }
+ }
+ }
+
+ if (tag) {
+ return {
+ tag,
+ attributes,
+ };
+ }
+
+ return null;
+ }
+
+ const startScript = /<script[^>]*>/im;
+ const endScript = /<\/script\s*>/im;
+ // https://stackoverflow.com/questions/5034781/js-regex-to-split-by-line#comment5633979_5035005
+ const newLines = /\r\n|[\n\v\f\r\x85\u2028\u2029]/;
+
+ function getType(tag) {
+ const fragment = parseFragment(tag);
+
+ if (fragment) {
+ const type = fragment.attributes.type;
+
+ return type ? type.toLowerCase() : null;
+ }
+
+ return null;
+ }
+
+ function getCandidateScriptLocations(source, index) {
+ const i = index || 0;
+ const str = source.substring(i);
+
+ const startMatch = startScript.exec(str);
+ if (startMatch) {
+ const startsAt = startMatch.index + startMatch[0].length;
+ const afterStart = str.substring(startsAt);
+ const endMatch = endScript.exec(afterStart);
+ if (endMatch) {
+ const locLength = endMatch.index;
+ const locIndex = i + startsAt;
+ const endIndex = locIndex + locLength + endMatch[0].length;
+
+ // extract the complete tag (incl start and end tags and content). if the
+ // type is invalid (= not JS), skip this tag and continue
+ const tag = source.substring(i + startMatch.index, endIndex);
+ const type = getType(tag);
+ if (
+ type &&
+ type !== "javascript" &&
+ type !== "text/javascript" &&
+ type !== "module"
+ ) {
+ return getCandidateScriptLocations(source, endIndex);
+ }
+
+ return [
+ adjustForLineAndColumn(source, {
+ index: locIndex,
+ length: locLength,
+ source: source.substring(locIndex, locIndex + locLength),
+ }),
+ ...getCandidateScriptLocations(source, endIndex),
+ ];
+ }
+ }
+
+ return [];
+ }
+
+ function parseScripts(locations, parser) {
+ return locations.map(parser);
+ }
+
+ function calcLineAndColumn(source, index) {
+ const lines = source.substring(0, index).split(newLines);
+ const line = lines.length;
+ const column = lines.pop().length + 1;
+
+ return {
+ column,
+ line,
+ };
+ }
+
+ function adjustForLineAndColumn(fullSource, location) {
+ const { column, line } = calcLineAndColumn(fullSource, location.index);
+ return Object.assign({}, location, {
+ line,
+ column,
+ // prepend whitespace for scripts that do not start on the first column
+ // NOTE: `column` is 1-based
+ source: " ".repeat(column - 1) + location.source,
+ });
+ }
+
+ function parseScriptTags$1(source, parser) {
+ const scripts = parseScripts(getCandidateScriptLocations(source), parser)
+ .filter(libExports$2.isFile)
+ .reduce(
+ (main, script) => {
+ return {
+ statements: main.statements.concat(script.program.body),
+ comments: main.comments.concat(script.comments),
+ tokens: main.tokens.concat(script.tokens),
+ };
+ },
+ {
+ statements: [],
+ comments: [],
+ tokens: [],
+ }
+ );
+
+ const program = libExports$2.program(scripts.statements);
+ const file = libExports$2.file(program, scripts.comments, scripts.tokens);
+
+ const end = calcLineAndColumn(source, source.length);
+ file.start = program.start = 0;
+ file.end = program.end = source.length;
+ file.loc = program.loc = {
+ start: {
+ line: 1,
+ column: 0,
+ },
+ end,
+ };
+
+ return file;
+ }
+
+ function parseScript$1({ source, line }) {
+ // remove empty or only whitespace scripts
+ if (source.length === 0 || /^\s+$/.test(source)) {
+ return null;
+ }
+
+ try {
+ return libExports$1.parse(source, {
+ sourceType: "script",
+ startLine: line,
+ });
+ } catch (e) {
+ return null;
+ }
+ }
+
+ function parseScriptTags(source, parser = parseScript$1) {
+ return parseScriptTags$1(source, parser);
+ }
+
+ /* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+ const cachedSources = new Map();
+
+ function setSource(source) {
+ cachedSources.set(source.id, source);
+ }
+
+ function getSource(sourceId) {
+ const source = cachedSources.get(sourceId);
+ if (!source) {
+ throw new Error(`Parser: source ${sourceId} was not provided.`);
+ }
+
+ return source;
+ }
+
+ function clearSources(sourceIds) {
+ for (const sourceId of sourceIds) {
+ cachedSources.delete(sourceId);
+ }
+ }
+
+ const ASTs = new Map();
+
+ function _parse(code, opts) {
+ return libExports$1.parse(code, {
+ ...opts,
+ tokens: true,
+ });
+ }
+
+ const sourceOptions = {
+ generated: {
+ sourceType: "unambiguous",
+ tokens: true,
+ plugins: [
+ "classStaticBlock",
+ "classPrivateProperties",
+ "classPrivateMethods",
+ "classProperties",
+ "objectRestSpread",
+ "optionalChaining",
+ "privateIn",
+ "nullishCoalescingOperator",
+ "regexpUnicodeSets",
+ ],
+ },
+ original: {
+ sourceType: "unambiguous",
+ tokens: true,
+ plugins: [
+ "jsx",
+ "flow",
+ "doExpressions",
+ "optionalChaining",
+ "nullishCoalescingOperator",
+ "decorators-legacy",
+ "objectRestSpread",
+ "classStaticBlock",
+ "classPrivateProperties",
+ "classPrivateMethods",
+ "classProperties",
+ "exportDefaultFrom",
+ "exportNamespaceFrom",
+ "asyncGenerators",
+ "functionBind",
+ "functionSent",
+ "dynamicImport",
+ "react-jsx",
+ "regexpUnicodeSets",
+ ],
+ },
+ };
+
+ function parse(text, opts) {
+ let ast = {};
+ if (!text) {
+ return ast;
+ }
+
+ try {
+ ast = _parse(text, opts);
+ } catch (error) {
+ console.error(error);
+ }
+
+ return ast;
+ }
+
+ // Custom parser for parse-script-tags that adapts its input structure to
+ // our parser's signature
+ function htmlParser({ source, line }) {
+ return parse(source, { startLine: line, ...sourceOptions.generated });
+ }
+
+ const VUE_COMPONENT_START = /^\s*</;
+ function vueParser({ source, line }) {
+ return parse(source, {
+ startLine: line,
+ ...sourceOptions.original,
+ });
+ }
+ function parseVueScript(code) {
+ if (typeof code !== "string") {
+ return {};
+ }
+
+ let ast;
+
+ // .vue files go through several passes, so while there is a
+ // single-file-component Vue template, there are also generally .vue files
+ // that are still just JS as well.
+ if (code.match(VUE_COMPONENT_START)) {
+ ast = parseScriptTags(code, vueParser);
+ if (libExports$2.isFile(ast)) {
+ // parseScriptTags is currently hard-coded to return scripts, but Vue
+ // always expects ESM syntax, so we just hard-code it.
+ ast.program.sourceType = "module";
+ }
+ } else {
+ ast = parse(code, sourceOptions.original);
+ }
+ return ast;
+ }
+
+ function parseConsoleScript(text, opts) {
+ try {
+ return _parse(text, {
+ plugins: [
+ "classStaticBlock",
+ "classPrivateProperties",
+ "classPrivateMethods",
+ "objectRestSpread",
+ "dynamicImport",
+ "nullishCoalescingOperator",
+ "optionalChaining",
+ "regexpUnicodeSets",
+ ],
+ ...opts,
+ allowAwaitOutsideFunction: true,
+ });
+ } catch (e) {
+ return null;
+ }
+ }
+
+ function parseScript(text, opts) {
+ return _parse(text, opts);
+ }
+
+ function getAst(sourceId) {
+ if (ASTs.has(sourceId)) {
+ return ASTs.get(sourceId);
+ }
+
+ const source = getSource(sourceId);
+
+ if (source.isWasm) {
+ return null;
+ }
+
+ let ast = {};
+ const { contentType } = source;
+ if (contentType == "text/html") {
+ ast = parseScriptTags(source.text, htmlParser) || {};
+ } else if (contentType && contentType === "text/vue") {
+ ast = parseVueScript(source.text) || {};
+ } else if (
+ contentType &&
+ contentType.match(/(javascript|jsx)/) &&
+ !contentType.match(/typescript-jsx/)
+ ) {
+ const type = source.id.includes("original") ? "original" : "generated";
+ const options = sourceOptions[type];
+ ast = parse(source.text, options);
+ } else if (contentType && contentType.match(/typescript/)) {
+ const options = {
+ ...sourceOptions.original,
+ plugins: [
+ ...sourceOptions.original.plugins.filter(
+ p =>
+ p !== "flow" &&
+ p !== "decorators" &&
+ p !== "decorators2" &&
+ (p !== "jsx" || contentType.match(/typescript-jsx/))
+ ),
+ "decorators-legacy",
+ "typescript",
+ ],
+ };
+ ast = parse(source.text, options);
+ }
+
+ ASTs.set(source.id, ast);
+ return ast;
+ }
+
+ function clearASTs(sourceIds) {
+ for (const sourceId of sourceIds) {
+ ASTs.delete(sourceId);
+ }
+ }
+
+ function traverseAst(sourceId, visitor, state) {
+ const ast = getAst(sourceId);
+ if (!ast || !Object.keys(ast).length) {
+ return null;
+ }
+
+ libExports$2.traverse(ast, visitor, state);
+ return ast;
+ }
+
+ function hasNode(rootNode, predicate) {
+ try {
+ libExports$2.traverse(rootNode, {
+ enter: (node, ancestors) => {
+ if (predicate(node, ancestors)) {
+ throw new Error("MATCH");
+ }
+ },
+ });
+ } catch (e) {
+ if (e.message === "MATCH") {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ function replaceNode$1(ancestors, node) {
+ const parent = ancestors[ancestors.length - 1];
+
+ if (typeof parent.index === "number") {
+ if (Array.isArray(node)) {
+ parent.node[parent.key].splice(parent.index, 1, ...node);
+ } else {
+ parent.node[parent.key][parent.index] = node;
+ }
+ } else {
+ parent.node[parent.key] = node;
+ }
+ }
+
+ var lib = {};
+
+ var sourceMap = {};
+
+ var genMapping_umd = {exports: {}};
+
+ var setArray_umd = {exports: {}};
+
+ var hasRequiredSetArray_umd;
+
+ function requireSetArray_umd () {
+ if (hasRequiredSetArray_umd) return setArray_umd.exports;
+ hasRequiredSetArray_umd = 1;
+ (function (module, exports) {
+ (function (global, factory) {
+ factory(exports) ;
+ })(commonjsGlobal, (function (exports) {
+ /**
+ * Gets the index associated with `key` in the backing array, if it is already present.
+ */
+ exports.get = void 0;
+ /**
+ * Puts `key` into the backing array, if it is not already present. Returns
+ * the index of the `key` in the backing array.
+ */
+ exports.put = void 0;
+ /**
+ * Pops the last added item out of the SetArray.
+ */
+ exports.pop = void 0;
+ /**
+ * SetArray acts like a `Set` (allowing only one occurrence of a string `key`), but provides the
+ * index of the `key` in the backing array.
+ *
+ * This is designed to allow synchronizing a second array with the contents of the backing array,
+ * like how in a sourcemap `sourcesContent[i]` is the source content associated with `source[i]`,
+ * and there are never duplicates.
+ */
+ class SetArray {
+ constructor() {
+ this._indexes = { __proto__: null };
+ this.array = [];
+ }
+ }
+ (() => {
+ exports.get = (strarr, key) => strarr._indexes[key];
+ exports.put = (strarr, key) => {
+ // The key may or may not be present. If it is present, it's a number.
+ const index = exports.get(strarr, key);
+ if (index !== undefined)
+ return index;
+ const { array, _indexes: indexes } = strarr;
+ return (indexes[key] = array.push(key) - 1);
+ };
+ exports.pop = (strarr) => {
+ const { array, _indexes: indexes } = strarr;
+ if (array.length === 0)
+ return;
+ const last = array.pop();
+ indexes[last] = undefined;
+ };
+ })();
+
+ exports.SetArray = SetArray;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+ }));
+
+ } (setArray_umd, setArray_umd.exports));
+ return setArray_umd.exports;
+ }
+
+ var lookup = [];
+ var revLookup = [];
+ var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array;
+ var inited = false;
+ function init () {
+ inited = true;
+ var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
+ for (var i = 0, len = code.length; i < len; ++i) {
+ lookup[i] = code[i];
+ revLookup[code.charCodeAt(i)] = i;
+ }
+
+ revLookup['-'.charCodeAt(0)] = 62;
+ revLookup['_'.charCodeAt(0)] = 63;
+ }
+
+ function toByteArray (b64) {
+ if (!inited) {
+ init();
+ }
+ var i, j, l, tmp, placeHolders, arr;
+ var len = b64.length;
+
+ if (len % 4 > 0) {
+ throw new Error('Invalid string. Length must be a multiple of 4')
+ }
+
+ // the number of equal signs (place holders)
+ // if there are two placeholders, than the two characters before it
+ // represent one byte
+ // if there is only one, then the three characters before it represent 2 bytes
+ // this is just a cheap hack to not do indexOf twice
+ placeHolders = b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0;
+
+ // base64 is 4/3 + up to two characters of the original data
+ arr = new Arr(len * 3 / 4 - placeHolders);
+
+ // if there are placeholders, only get up to the last complete 4 chars
+ l = placeHolders > 0 ? len - 4 : len;
+
+ var L = 0;
+
+ for (i = 0, j = 0; i < l; i += 4, j += 3) {
+ tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)];
+ arr[L++] = (tmp >> 16) & 0xFF;
+ arr[L++] = (tmp >> 8) & 0xFF;
+ arr[L++] = tmp & 0xFF;
+ }
+
+ if (placeHolders === 2) {
+ tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4);
+ arr[L++] = tmp & 0xFF;
+ } else if (placeHolders === 1) {
+ tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2);
+ arr[L++] = (tmp >> 8) & 0xFF;
+ arr[L++] = tmp & 0xFF;
+ }
+
+ return arr
+ }
+
+ function tripletToBase64 (num) {
+ return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F]
+ }
+
+ function encodeChunk (uint8, start, end) {
+ var tmp;
+ var output = [];
+ for (var i = start; i < end; i += 3) {
+ tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]);
+ output.push(tripletToBase64(tmp));
+ }
+ return output.join('')
+ }
+
+ function fromByteArray (uint8) {
+ if (!inited) {
+ init();
+ }
+ var tmp;
+ var len = uint8.length;
+ var extraBytes = len % 3; // if we have 1 byte left, pad 2 bytes
+ var output = '';
+ var parts = [];
+ var maxChunkLength = 16383; // must be multiple of 3
+
+ // go through the array every three bytes, we'll deal with trailing stuff later
+ for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
+ parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)));
+ }
+
+ // pad the end with zeros, but make sure to not forget the extra bytes
+ if (extraBytes === 1) {
+ tmp = uint8[len - 1];
+ output += lookup[tmp >> 2];
+ output += lookup[(tmp << 4) & 0x3F];
+ output += '==';
+ } else if (extraBytes === 2) {
+ tmp = (uint8[len - 2] << 8) + (uint8[len - 1]);
+ output += lookup[tmp >> 10];
+ output += lookup[(tmp >> 4) & 0x3F];
+ output += lookup[(tmp << 2) & 0x3F];
+ output += '=';
+ }
+
+ parts.push(output);
+
+ return parts.join('')
+ }
+
+ function read (buffer, offset, isLE, mLen, nBytes) {
+ var e, m;
+ var eLen = nBytes * 8 - mLen - 1;
+ var eMax = (1 << eLen) - 1;
+ var eBias = eMax >> 1;
+ var nBits = -7;
+ var i = isLE ? (nBytes - 1) : 0;
+ var d = isLE ? -1 : 1;
+ var s = buffer[offset + i];
+
+ i += d;
+
+ e = s & ((1 << (-nBits)) - 1);
+ s >>= (-nBits);
+ nBits += eLen;
+ for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}
+
+ m = e & ((1 << (-nBits)) - 1);
+ e >>= (-nBits);
+ nBits += mLen;
+ for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}
+
+ if (e === 0) {
+ e = 1 - eBias;
+ } else if (e === eMax) {
+ return m ? NaN : ((s ? -1 : 1) * Infinity)
+ } else {
+ m = m + Math.pow(2, mLen);
+ e = e - eBias;
+ }
+ return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
+ }
+
+ function write (buffer, value, offset, isLE, mLen, nBytes) {
+ var e, m, c;
+ var eLen = nBytes * 8 - mLen - 1;
+ var eMax = (1 << eLen) - 1;
+ var eBias = eMax >> 1;
+ var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0);
+ var i = isLE ? 0 : (nBytes - 1);
+ var d = isLE ? 1 : -1;
+ var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0;
+
+ value = Math.abs(value);
+
+ if (isNaN(value) || value === Infinity) {
+ m = isNaN(value) ? 1 : 0;
+ e = eMax;
+ } else {
+ e = Math.floor(Math.log(value) / Math.LN2);
+ if (value * (c = Math.pow(2, -e)) < 1) {
+ e--;
+ c *= 2;
+ }
+ if (e + eBias >= 1) {
+ value += rt / c;
+ } else {
+ value += rt * Math.pow(2, 1 - eBias);
+ }
+ if (value * c >= 2) {
+ e++;
+ c /= 2;
+ }
+
+ if (e + eBias >= eMax) {
+ m = 0;
+ e = eMax;
+ } else if (e + eBias >= 1) {
+ m = (value * c - 1) * Math.pow(2, mLen);
+ e = e + eBias;
+ } else {
+ m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);
+ e = 0;
+ }
+ }
+
+ for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
+
+ e = (e << mLen) | m;
+ eLen += mLen;
+ for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
+
+ buffer[offset + i - d] |= s * 128;
+ }
+
+ var toString = {}.toString;
+
+ var isArray = Array.isArray || function (arr) {
+ return toString.call(arr) == '[object Array]';
+ };
+
+ /*!
+ * The buffer module from node.js, for the browser.
+ *
+ * @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
+ * @license MIT
+ */
+
+ var INSPECT_MAX_BYTES = 50;
+
+ /**
+ * If `Buffer.TYPED_ARRAY_SUPPORT`:
+ * === true Use Uint8Array implementation (fastest)
+ * === false Use Object implementation (most compatible, even IE6)
+ *
+ * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
+ * Opera 11.6+, iOS 4.2+.
+ *
+ * Due to various browser bugs, sometimes the Object implementation will be used even
+ * when the browser supports typed arrays.
+ *
+ * Note:
+ *
+ * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,
+ * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.
+ *
+ * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.
+ *
+ * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of
+ * incorrect length in some situations.
+
+ * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they
+ * get the Object implementation, which is slower but behaves correctly.
+ */
+ Buffer.TYPED_ARRAY_SUPPORT = global$1.TYPED_ARRAY_SUPPORT !== undefined
+ ? global$1.TYPED_ARRAY_SUPPORT
+ : true;
+
+ /*
+ * Export kMaxLength after typed array support is determined.
+ */
+ kMaxLength();
+
+ function kMaxLength () {
+ return Buffer.TYPED_ARRAY_SUPPORT
+ ? 0x7fffffff
+ : 0x3fffffff
+ }
+
+ function createBuffer (that, length) {
+ if (kMaxLength() < length) {
+ throw new RangeError('Invalid typed array length')
+ }
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ // Return an augmented `Uint8Array` instance, for best performance
+ that = new Uint8Array(length);
+ that.__proto__ = Buffer.prototype;
+ } else {
+ // Fallback: Return an object instance of the Buffer class
+ if (that === null) {
+ that = new Buffer(length);
+ }
+ that.length = length;
+ }
+
+ return that
+ }
+
+ /**
+ * The Buffer constructor returns instances of `Uint8Array` that have their
+ * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of
+ * `Uint8Array`, so the returned instances will have all the node `Buffer` methods
+ * and the `Uint8Array` methods. Square bracket notation works as expected -- it
+ * returns a single octet.
+ *
+ * The `Uint8Array` prototype remains unmodified.
+ */
+
+ function Buffer (arg, encodingOrOffset, length) {
+ if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {
+ return new Buffer(arg, encodingOrOffset, length)
+ }
+
+ // Common case.
+ if (typeof arg === 'number') {
+ if (typeof encodingOrOffset === 'string') {
+ throw new Error(
+ 'If encoding is specified then the first argument must be a string'
+ )
+ }
+ return allocUnsafe(this, arg)
+ }
+ return from(this, arg, encodingOrOffset, length)
+ }
+
+ Buffer.poolSize = 8192; // not used by this implementation
+
+ // TODO: Legacy, not needed anymore. Remove in next major version.
+ Buffer._augment = function (arr) {
+ arr.__proto__ = Buffer.prototype;
+ return arr
+ };
+
+ function from (that, value, encodingOrOffset, length) {
+ if (typeof value === 'number') {
+ throw new TypeError('"value" argument must not be a number')
+ }
+
+ if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {
+ return fromArrayBuffer(that, value, encodingOrOffset, length)
+ }
+
+ if (typeof value === 'string') {
+ return fromString(that, value, encodingOrOffset)
+ }
+
+ return fromObject(that, value)
+ }
+
+ /**
+ * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError
+ * if value is a number.
+ * Buffer.from(str[, encoding])
+ * Buffer.from(array)
+ * Buffer.from(buffer)
+ * Buffer.from(arrayBuffer[, byteOffset[, length]])
+ **/
+ Buffer.from = function (value, encodingOrOffset, length) {
+ return from(null, value, encodingOrOffset, length)
+ };
+
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ Buffer.prototype.__proto__ = Uint8Array.prototype;
+ Buffer.__proto__ = Uint8Array;
+ }
+
+ function assertSize (size) {
+ if (typeof size !== 'number') {
+ throw new TypeError('"size" argument must be a number')
+ } else if (size < 0) {
+ throw new RangeError('"size" argument must not be negative')
+ }
+ }
+
+ function alloc (that, size, fill, encoding) {
+ assertSize(size);
+ if (size <= 0) {
+ return createBuffer(that, size)
+ }
+ if (fill !== undefined) {
+ // Only pay attention to encoding if it's a string. This
+ // prevents accidentally sending in a number that would
+ // be interpretted as a start offset.
+ return typeof encoding === 'string'
+ ? createBuffer(that, size).fill(fill, encoding)
+ : createBuffer(that, size).fill(fill)
+ }
+ return createBuffer(that, size)
+ }
+
+ /**
+ * Creates a new filled Buffer instance.
+ * alloc(size[, fill[, encoding]])
+ **/
+ Buffer.alloc = function (size, fill, encoding) {
+ return alloc(null, size, fill, encoding)
+ };
+
+ function allocUnsafe (that, size) {
+ assertSize(size);
+ that = createBuffer(that, size < 0 ? 0 : checked(size) | 0);
+ if (!Buffer.TYPED_ARRAY_SUPPORT) {
+ for (var i = 0; i < size; ++i) {
+ that[i] = 0;
+ }
+ }
+ return that
+ }
+
+ /**
+ * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
+ * */
+ Buffer.allocUnsafe = function (size) {
+ return allocUnsafe(null, size)
+ };
+ /**
+ * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
+ */
+ Buffer.allocUnsafeSlow = function (size) {
+ return allocUnsafe(null, size)
+ };
+
+ function fromString (that, string, encoding) {
+ if (typeof encoding !== 'string' || encoding === '') {
+ encoding = 'utf8';
+ }
+
+ if (!Buffer.isEncoding(encoding)) {
+ throw new TypeError('"encoding" must be a valid string encoding')
+ }
+
+ var length = byteLength(string, encoding) | 0;
+ that = createBuffer(that, length);
+
+ var actual = that.write(string, encoding);
+
+ if (actual !== length) {
+ // Writing a hex string, for example, that contains invalid characters will
+ // cause everything after the first invalid character to be ignored. (e.g.
+ // 'abxxcd' will be treated as 'ab')
+ that = that.slice(0, actual);
+ }
+
+ return that
+ }
+
+ function fromArrayLike (that, array) {
+ var length = array.length < 0 ? 0 : checked(array.length) | 0;
+ that = createBuffer(that, length);
+ for (var i = 0; i < length; i += 1) {
+ that[i] = array[i] & 255;
+ }
+ return that
+ }
+
+ function fromArrayBuffer (that, array, byteOffset, length) {
+ array.byteLength; // this throws if `array` is not a valid ArrayBuffer
+
+ if (byteOffset < 0 || array.byteLength < byteOffset) {
+ throw new RangeError('\'offset\' is out of bounds')
+ }
+
+ if (array.byteLength < byteOffset + (length || 0)) {
+ throw new RangeError('\'length\' is out of bounds')
+ }
+
+ if (byteOffset === undefined && length === undefined) {
+ array = new Uint8Array(array);
+ } else if (length === undefined) {
+ array = new Uint8Array(array, byteOffset);
+ } else {
+ array = new Uint8Array(array, byteOffset, length);
+ }
+
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ // Return an augmented `Uint8Array` instance, for best performance
+ that = array;
+ that.__proto__ = Buffer.prototype;
+ } else {
+ // Fallback: Return an object instance of the Buffer class
+ that = fromArrayLike(that, array);
+ }
+ return that
+ }
+
+ function fromObject (that, obj) {
+ if (internalIsBuffer(obj)) {
+ var len = checked(obj.length) | 0;
+ that = createBuffer(that, len);
+
+ if (that.length === 0) {
+ return that
+ }
+
+ obj.copy(that, 0, 0, len);
+ return that
+ }
+
+ if (obj) {
+ if ((typeof ArrayBuffer !== 'undefined' &&
+ obj.buffer instanceof ArrayBuffer) || 'length' in obj) {
+ if (typeof obj.length !== 'number' || isnan(obj.length)) {
+ return createBuffer(that, 0)
+ }
+ return fromArrayLike(that, obj)
+ }
+
+ if (obj.type === 'Buffer' && isArray(obj.data)) {
+ return fromArrayLike(that, obj.data)
+ }
+ }
+
+ throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')
+ }
+
+ function checked (length) {
+ // Note: cannot use `length < kMaxLength()` here because that fails when
+ // length is NaN (which is otherwise coerced to zero.)
+ if (length >= kMaxLength()) {
+ throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
+ 'size: 0x' + kMaxLength().toString(16) + ' bytes')
+ }
+ return length | 0
+ }
+ Buffer.isBuffer = isBuffer;
+ function internalIsBuffer (b) {
+ return !!(b != null && b._isBuffer)
+ }
+
+ Buffer.compare = function compare (a, b) {
+ if (!internalIsBuffer(a) || !internalIsBuffer(b)) {
+ throw new TypeError('Arguments must be Buffers')
+ }
+
+ if (a === b) return 0
+
+ var x = a.length;
+ var y = b.length;
+
+ for (var i = 0, len = Math.min(x, y); i < len; ++i) {
+ if (a[i] !== b[i]) {
+ x = a[i];
+ y = b[i];
+ break
+ }
+ }
+
+ if (x < y) return -1
+ if (y < x) return 1
+ return 0
+ };
+
+ Buffer.isEncoding = function isEncoding (encoding) {
+ switch (String(encoding).toLowerCase()) {
+ case 'hex':
+ case 'utf8':
+ case 'utf-8':
+ case 'ascii':
+ case 'latin1':
+ case 'binary':
+ case 'base64':
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return true
+ default:
+ return false
+ }
+ };
+
+ Buffer.concat = function concat (list, length) {
+ if (!isArray(list)) {
+ throw new TypeError('"list" argument must be an Array of Buffers')
+ }
+
+ if (list.length === 0) {
+ return Buffer.alloc(0)
+ }
+
+ var i;
+ if (length === undefined) {
+ length = 0;
+ for (i = 0; i < list.length; ++i) {
+ length += list[i].length;
+ }
+ }
+
+ var buffer = Buffer.allocUnsafe(length);
+ var pos = 0;
+ for (i = 0; i < list.length; ++i) {
+ var buf = list[i];
+ if (!internalIsBuffer(buf)) {
+ throw new TypeError('"list" argument must be an Array of Buffers')
+ }
+ buf.copy(buffer, pos);
+ pos += buf.length;
+ }
+ return buffer
+ };
+
+ function byteLength (string, encoding) {
+ if (internalIsBuffer(string)) {
+ return string.length
+ }
+ if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&
+ (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {
+ return string.byteLength
+ }
+ if (typeof string !== 'string') {
+ string = '' + string;
+ }
+
+ var len = string.length;
+ if (len === 0) return 0
+
+ // Use a for loop to avoid recursion
+ var loweredCase = false;
+ for (;;) {
+ switch (encoding) {
+ case 'ascii':
+ case 'latin1':
+ case 'binary':
+ return len
+ case 'utf8':
+ case 'utf-8':
+ case undefined:
+ return utf8ToBytes(string).length
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return len * 2
+ case 'hex':
+ return len >>> 1
+ case 'base64':
+ return base64ToBytes(string).length
+ default:
+ if (loweredCase) return utf8ToBytes(string).length // assume utf8
+ encoding = ('' + encoding).toLowerCase();
+ loweredCase = true;
+ }
+ }
+ }
+ Buffer.byteLength = byteLength;
+
+ function slowToString (encoding, start, end) {
+ var loweredCase = false;
+
+ // No need to verify that "this.length <= MAX_UINT32" since it's a read-only
+ // property of a typed array.
+
+ // This behaves neither like String nor Uint8Array in that we set start/end
+ // to their upper/lower bounds if the value passed is out of range.
+ // undefined is handled specially as per ECMA-262 6th Edition,
+ // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.
+ if (start === undefined || start < 0) {
+ start = 0;
+ }
+ // Return early if start > this.length. Done here to prevent potential uint32
+ // coercion fail below.
+ if (start > this.length) {
+ return ''
+ }
+
+ if (end === undefined || end > this.length) {
+ end = this.length;
+ }
+
+ if (end <= 0) {
+ return ''
+ }
+
+ // Force coersion to uint32. This will also coerce falsey/NaN values to 0.
+ end >>>= 0;
+ start >>>= 0;
+
+ if (end <= start) {
+ return ''
+ }
+
+ if (!encoding) encoding = 'utf8';
+
+ while (true) {
+ switch (encoding) {
+ case 'hex':
+ return hexSlice(this, start, end)
+
+ case 'utf8':
+ case 'utf-8':
+ return utf8Slice(this, start, end)
+
+ case 'ascii':
+ return asciiSlice(this, start, end)
+
+ case 'latin1':
+ case 'binary':
+ return latin1Slice(this, start, end)
+
+ case 'base64':
+ return base64Slice(this, start, end)
+
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return utf16leSlice(this, start, end)
+
+ default:
+ if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
+ encoding = (encoding + '').toLowerCase();
+ loweredCase = true;
+ }
+ }
+ }
+
+ // The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect
+ // Buffer instances.
+ Buffer.prototype._isBuffer = true;
+
+ function swap (b, n, m) {
+ var i = b[n];
+ b[n] = b[m];
+ b[m] = i;
+ }
+
+ Buffer.prototype.swap16 = function swap16 () {
+ var len = this.length;
+ if (len % 2 !== 0) {
+ throw new RangeError('Buffer size must be a multiple of 16-bits')
+ }
+ for (var i = 0; i < len; i += 2) {
+ swap(this, i, i + 1);
+ }
+ return this
+ };
+
+ Buffer.prototype.swap32 = function swap32 () {
+ var len = this.length;
+ if (len % 4 !== 0) {
+ throw new RangeError('Buffer size must be a multiple of 32-bits')
+ }
+ for (var i = 0; i < len; i += 4) {
+ swap(this, i, i + 3);
+ swap(this, i + 1, i + 2);
+ }
+ return this
+ };
+
+ Buffer.prototype.swap64 = function swap64 () {
+ var len = this.length;
+ if (len % 8 !== 0) {
+ throw new RangeError('Buffer size must be a multiple of 64-bits')
+ }
+ for (var i = 0; i < len; i += 8) {
+ swap(this, i, i + 7);
+ swap(this, i + 1, i + 6);
+ swap(this, i + 2, i + 5);
+ swap(this, i + 3, i + 4);
+ }
+ return this
+ };
+
+ Buffer.prototype.toString = function toString () {
+ var length = this.length | 0;
+ if (length === 0) return ''
+ if (arguments.length === 0) return utf8Slice(this, 0, length)
+ return slowToString.apply(this, arguments)
+ };
+
+ Buffer.prototype.equals = function equals (b) {
+ if (!internalIsBuffer(b)) throw new TypeError('Argument must be a Buffer')
+ if (this === b) return true
+ return Buffer.compare(this, b) === 0
+ };
+
+ Buffer.prototype.inspect = function inspect () {
+ var str = '';
+ var max = INSPECT_MAX_BYTES;
+ if (this.length > 0) {
+ str = this.toString('hex', 0, max).match(/.{2}/g).join(' ');
+ if (this.length > max) str += ' ... ';
+ }
+ return '<Buffer ' + str + '>'
+ };
+
+ Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {
+ if (!internalIsBuffer(target)) {
+ throw new TypeError('Argument must be a Buffer')
+ }
+
+ if (start === undefined) {
+ start = 0;
+ }
+ if (end === undefined) {
+ end = target ? target.length : 0;
+ }
+ if (thisStart === undefined) {
+ thisStart = 0;
+ }
+ if (thisEnd === undefined) {
+ thisEnd = this.length;
+ }
+
+ if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
+ throw new RangeError('out of range index')
+ }
+
+ if (thisStart >= thisEnd && start >= end) {
+ return 0
+ }
+ if (thisStart >= thisEnd) {
+ return -1
+ }
+ if (start >= end) {
+ return 1
+ }
+
+ start >>>= 0;
+ end >>>= 0;
+ thisStart >>>= 0;
+ thisEnd >>>= 0;
+
+ if (this === target) return 0
+
+ var x = thisEnd - thisStart;
+ var y = end - start;
+ var len = Math.min(x, y);
+
+ var thisCopy = this.slice(thisStart, thisEnd);
+ var targetCopy = target.slice(start, end);
+
+ for (var i = 0; i < len; ++i) {
+ if (thisCopy[i] !== targetCopy[i]) {
+ x = thisCopy[i];
+ y = targetCopy[i];
+ break
+ }
+ }
+
+ if (x < y) return -1
+ if (y < x) return 1
+ return 0
+ };
+
+ // Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,
+ // OR the last index of `val` in `buffer` at offset <= `byteOffset`.
+ //
+ // Arguments:
+ // - buffer - a Buffer to search
+ // - val - a string, Buffer, or number
+ // - byteOffset - an index into `buffer`; will be clamped to an int32
+ // - encoding - an optional encoding, relevant is val is a string
+ // - dir - true for indexOf, false for lastIndexOf
+ function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
+ // Empty buffer means no match
+ if (buffer.length === 0) return -1
+
+ // Normalize byteOffset
+ if (typeof byteOffset === 'string') {
+ encoding = byteOffset;
+ byteOffset = 0;
+ } else if (byteOffset > 0x7fffffff) {
+ byteOffset = 0x7fffffff;
+ } else if (byteOffset < -0x80000000) {
+ byteOffset = -0x80000000;
+ }
+ byteOffset = +byteOffset; // Coerce to Number.
+ if (isNaN(byteOffset)) {
+ // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
+ byteOffset = dir ? 0 : (buffer.length - 1);
+ }
+
+ // Normalize byteOffset: negative offsets start from the end of the buffer
+ if (byteOffset < 0) byteOffset = buffer.length + byteOffset;
+ if (byteOffset >= buffer.length) {
+ if (dir) return -1
+ else byteOffset = buffer.length - 1;
+ } else if (byteOffset < 0) {
+ if (dir) byteOffset = 0;
+ else return -1
+ }
+
+ // Normalize val
+ if (typeof val === 'string') {
+ val = Buffer.from(val, encoding);
+ }
+
+ // Finally, search either indexOf (if dir is true) or lastIndexOf
+ if (internalIsBuffer(val)) {
+ // Special case: looking for empty string/buffer always fails
+ if (val.length === 0) {
+ return -1
+ }
+ return arrayIndexOf(buffer, val, byteOffset, encoding, dir)
+ } else if (typeof val === 'number') {
+ val = val & 0xFF; // Search for a byte value [0-255]
+ if (Buffer.TYPED_ARRAY_SUPPORT &&
+ typeof Uint8Array.prototype.indexOf === 'function') {
+ if (dir) {
+ return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)
+ } else {
+ return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)
+ }
+ }
+ return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)
+ }
+
+ throw new TypeError('val must be string, number or Buffer')
+ }
+
+ function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
+ var indexSize = 1;
+ var arrLength = arr.length;
+ var valLength = val.length;
+
+ if (encoding !== undefined) {
+ encoding = String(encoding).toLowerCase();
+ if (encoding === 'ucs2' || encoding === 'ucs-2' ||
+ encoding === 'utf16le' || encoding === 'utf-16le') {
+ if (arr.length < 2 || val.length < 2) {
+ return -1
+ }
+ indexSize = 2;
+ arrLength /= 2;
+ valLength /= 2;
+ byteOffset /= 2;
+ }
+ }
+
+ function read (buf, i) {
+ if (indexSize === 1) {
+ return buf[i]
+ } else {
+ return buf.readUInt16BE(i * indexSize)
+ }
+ }
+
+ var i;
+ if (dir) {
+ var foundIndex = -1;
+ for (i = byteOffset; i < arrLength; i++) {
+ if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
+ if (foundIndex === -1) foundIndex = i;
+ if (i - foundIndex + 1 === valLength) return foundIndex * indexSize
+ } else {
+ if (foundIndex !== -1) i -= i - foundIndex;
+ foundIndex = -1;
+ }
+ }
+ } else {
+ if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength;
+ for (i = byteOffset; i >= 0; i--) {
+ var found = true;
+ for (var j = 0; j < valLength; j++) {
+ if (read(arr, i + j) !== read(val, j)) {
+ found = false;
+ break
+ }
+ }
+ if (found) return i
+ }
+ }
+
+ return -1
+ }
+
+ Buffer.prototype.includes = function includes (val, byteOffset, encoding) {
+ return this.indexOf(val, byteOffset, encoding) !== -1
+ };
+
+ Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {
+ return bidirectionalIndexOf(this, val, byteOffset, encoding, true)
+ };
+
+ Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {
+ return bidirectionalIndexOf(this, val, byteOffset, encoding, false)
+ };
+
+ function hexWrite (buf, string, offset, length) {
+ offset = Number(offset) || 0;
+ var remaining = buf.length - offset;
+ if (!length) {
+ length = remaining;
+ } else {
+ length = Number(length);
+ if (length > remaining) {
+ length = remaining;
+ }
+ }
+
+ // must be an even number of digits
+ var strLen = string.length;
+ if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')
+
+ if (length > strLen / 2) {
+ length = strLen / 2;
+ }
+ for (var i = 0; i < length; ++i) {
+ var parsed = parseInt(string.substr(i * 2, 2), 16);
+ if (isNaN(parsed)) return i
+ buf[offset + i] = parsed;
+ }
+ return i
+ }
+
+ function utf8Write (buf, string, offset, length) {
+ return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
+ }
+
+ function asciiWrite (buf, string, offset, length) {
+ return blitBuffer(asciiToBytes(string), buf, offset, length)
+ }
+
+ function latin1Write (buf, string, offset, length) {
+ return asciiWrite(buf, string, offset, length)
+ }
+
+ function base64Write (buf, string, offset, length) {
+ return blitBuffer(base64ToBytes(string), buf, offset, length)
+ }
+
+ function ucs2Write (buf, string, offset, length) {
+ return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
+ }
+
+ Buffer.prototype.write = function write (string, offset, length, encoding) {
+ // Buffer#write(string)
+ if (offset === undefined) {
+ encoding = 'utf8';
+ length = this.length;
+ offset = 0;
+ // Buffer#write(string, encoding)
+ } else if (length === undefined && typeof offset === 'string') {
+ encoding = offset;
+ length = this.length;
+ offset = 0;
+ // Buffer#write(string, offset[, length][, encoding])
+ } else if (isFinite(offset)) {
+ offset = offset | 0;
+ if (isFinite(length)) {
+ length = length | 0;
+ if (encoding === undefined) encoding = 'utf8';
+ } else {
+ encoding = length;
+ length = undefined;
+ }
+ // legacy write(string, encoding, offset, length) - remove in v0.13
+ } else {
+ throw new Error(
+ 'Buffer.write(string, encoding, offset[, length]) is no longer supported'
+ )
+ }
+
+ var remaining = this.length - offset;
+ if (length === undefined || length > remaining) length = remaining;
+
+ if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
+ throw new RangeError('Attempt to write outside buffer bounds')
+ }
+
+ if (!encoding) encoding = 'utf8';
+
+ var loweredCase = false;
+ for (;;) {
+ switch (encoding) {
+ case 'hex':
+ return hexWrite(this, string, offset, length)
+
+ case 'utf8':
+ case 'utf-8':
+ return utf8Write(this, string, offset, length)
+
+ case 'ascii':
+ return asciiWrite(this, string, offset, length)
+
+ case 'latin1':
+ case 'binary':
+ return latin1Write(this, string, offset, length)
+
+ case 'base64':
+ // Warning: maxLength not taken into account in base64Write
+ return base64Write(this, string, offset, length)
+
+ case 'ucs2':
+ case 'ucs-2':
+ case 'utf16le':
+ case 'utf-16le':
+ return ucs2Write(this, string, offset, length)
+
+ default:
+ if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
+ encoding = ('' + encoding).toLowerCase();
+ loweredCase = true;
+ }
+ }
+ };
+
+ Buffer.prototype.toJSON = function toJSON () {
+ return {
+ type: 'Buffer',
+ data: Array.prototype.slice.call(this._arr || this, 0)
+ }
+ };
+
+ function base64Slice (buf, start, end) {
+ if (start === 0 && end === buf.length) {
+ return fromByteArray(buf)
+ } else {
+ return fromByteArray(buf.slice(start, end))
+ }
+ }
+
+ function utf8Slice (buf, start, end) {
+ end = Math.min(buf.length, end);
+ var res = [];
+
+ var i = start;
+ while (i < end) {
+ var firstByte = buf[i];
+ var codePoint = null;
+ var bytesPerSequence = (firstByte > 0xEF) ? 4
+ : (firstByte > 0xDF) ? 3
+ : (firstByte > 0xBF) ? 2
+ : 1;
+
+ if (i + bytesPerSequence <= end) {
+ var secondByte, thirdByte, fourthByte, tempCodePoint;
+
+ switch (bytesPerSequence) {
+ case 1:
+ if (firstByte < 0x80) {
+ codePoint = firstByte;
+ }
+ break
+ case 2:
+ secondByte = buf[i + 1];
+ if ((secondByte & 0xC0) === 0x80) {
+ tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F);
+ if (tempCodePoint > 0x7F) {
+ codePoint = tempCodePoint;
+ }
+ }
+ break
+ case 3:
+ secondByte = buf[i + 1];
+ thirdByte = buf[i + 2];
+ if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
+ tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F);
+ if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
+ codePoint = tempCodePoint;
+ }
+ }
+ break
+ case 4:
+ secondByte = buf[i + 1];
+ thirdByte = buf[i + 2];
+ fourthByte = buf[i + 3];
+ if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
+ tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F);
+ if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
+ codePoint = tempCodePoint;
+ }
+ }
+ }
+ }
+
+ if (codePoint === null) {
+ // we did not generate a valid codePoint so insert a
+ // replacement char (U+FFFD) and advance only 1 byte
+ codePoint = 0xFFFD;
+ bytesPerSequence = 1;
+ } else if (codePoint > 0xFFFF) {
+ // encode to utf16 (surrogate pair dance)
+ codePoint -= 0x10000;
+ res.push(codePoint >>> 10 & 0x3FF | 0xD800);
+ codePoint = 0xDC00 | codePoint & 0x3FF;
+ }
+
+ res.push(codePoint);
+ i += bytesPerSequence;
+ }
+
+ return decodeCodePointsArray(res)
+ }
+
+ // Based on http://stackoverflow.com/a/22747272/680742, the browser with
+ // the lowest limit is Chrome, with 0x10000 args.
+ // We go 1 magnitude less, for safety
+ var MAX_ARGUMENTS_LENGTH = 0x1000;
+
+ function decodeCodePointsArray (codePoints) {
+ var len = codePoints.length;
+ if (len <= MAX_ARGUMENTS_LENGTH) {
+ return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
+ }
+
+ // Decode in chunks to avoid "call stack size exceeded".
+ var res = '';
+ var i = 0;
+ while (i < len) {
+ res += String.fromCharCode.apply(
+ String,
+ codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
+ );
+ }
+ return res
+ }
+
+ function asciiSlice (buf, start, end) {
+ var ret = '';
+ end = Math.min(buf.length, end);
+
+ for (var i = start; i < end; ++i) {
+ ret += String.fromCharCode(buf[i] & 0x7F);
+ }
+ return ret
+ }
+
+ function latin1Slice (buf, start, end) {
+ var ret = '';
+ end = Math.min(buf.length, end);
+
+ for (var i = start; i < end; ++i) {
+ ret += String.fromCharCode(buf[i]);
+ }
+ return ret
+ }
+
+ function hexSlice (buf, start, end) {
+ var len = buf.length;
+
+ if (!start || start < 0) start = 0;
+ if (!end || end < 0 || end > len) end = len;
+
+ var out = '';
+ for (var i = start; i < end; ++i) {
+ out += toHex(buf[i]);
+ }
+ return out
+ }
+
+ function utf16leSlice (buf, start, end) {
+ var bytes = buf.slice(start, end);
+ var res = '';
+ for (var i = 0; i < bytes.length; i += 2) {
+ res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256);
+ }
+ return res
+ }
+
+ Buffer.prototype.slice = function slice (start, end) {
+ var len = this.length;
+ start = ~~start;
+ end = end === undefined ? len : ~~end;
+
+ if (start < 0) {
+ start += len;
+ if (start < 0) start = 0;
+ } else if (start > len) {
+ start = len;
+ }
+
+ if (end < 0) {
+ end += len;
+ if (end < 0) end = 0;
+ } else if (end > len) {
+ end = len;
+ }
+
+ if (end < start) end = start;
+
+ var newBuf;
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ newBuf = this.subarray(start, end);
+ newBuf.__proto__ = Buffer.prototype;
+ } else {
+ var sliceLen = end - start;
+ newBuf = new Buffer(sliceLen, undefined);
+ for (var i = 0; i < sliceLen; ++i) {
+ newBuf[i] = this[i + start];
+ }
+ }
+
+ return newBuf
+ };
+
+ /*
+ * Need to make sure that buffer isn't trying to write out of bounds.
+ */
+ function checkOffset (offset, ext, length) {
+ if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
+ if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
+ }
+
+ Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
+ offset = offset | 0;
+ byteLength = byteLength | 0;
+ if (!noAssert) checkOffset(offset, byteLength, this.length);
+
+ var val = this[offset];
+ var mul = 1;
+ var i = 0;
+ while (++i < byteLength && (mul *= 0x100)) {
+ val += this[offset + i] * mul;
+ }
+
+ return val
+ };
+
+ Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
+ offset = offset | 0;
+ byteLength = byteLength | 0;
+ if (!noAssert) {
+ checkOffset(offset, byteLength, this.length);
+ }
+
+ var val = this[offset + --byteLength];
+ var mul = 1;
+ while (byteLength > 0 && (mul *= 0x100)) {
+ val += this[offset + --byteLength] * mul;
+ }
+
+ return val
+ };
+
+ Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 1, this.length);
+ return this[offset]
+ };
+
+ Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 2, this.length);
+ return this[offset] | (this[offset + 1] << 8)
+ };
+
+ Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 2, this.length);
+ return (this[offset] << 8) | this[offset + 1]
+ };
+
+ Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 4, this.length);
+
+ return ((this[offset]) |
+ (this[offset + 1] << 8) |
+ (this[offset + 2] << 16)) +
+ (this[offset + 3] * 0x1000000)
+ };
+
+ Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 4, this.length);
+
+ return (this[offset] * 0x1000000) +
+ ((this[offset + 1] << 16) |
+ (this[offset + 2] << 8) |
+ this[offset + 3])
+ };
+
+ Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
+ offset = offset | 0;
+ byteLength = byteLength | 0;
+ if (!noAssert) checkOffset(offset, byteLength, this.length);
+
+ var val = this[offset];
+ var mul = 1;
+ var i = 0;
+ while (++i < byteLength && (mul *= 0x100)) {
+ val += this[offset + i] * mul;
+ }
+ mul *= 0x80;
+
+ if (val >= mul) val -= Math.pow(2, 8 * byteLength);
+
+ return val
+ };
+
+ Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
+ offset = offset | 0;
+ byteLength = byteLength | 0;
+ if (!noAssert) checkOffset(offset, byteLength, this.length);
+
+ var i = byteLength;
+ var mul = 1;
+ var val = this[offset + --i];
+ while (i > 0 && (mul *= 0x100)) {
+ val += this[offset + --i] * mul;
+ }
+ mul *= 0x80;
+
+ if (val >= mul) val -= Math.pow(2, 8 * byteLength);
+
+ return val
+ };
+
+ Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 1, this.length);
+ if (!(this[offset] & 0x80)) return (this[offset])
+ return ((0xff - this[offset] + 1) * -1)
+ };
+
+ Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 2, this.length);
+ var val = this[offset] | (this[offset + 1] << 8);
+ return (val & 0x8000) ? val | 0xFFFF0000 : val
+ };
+
+ Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 2, this.length);
+ var val = this[offset + 1] | (this[offset] << 8);
+ return (val & 0x8000) ? val | 0xFFFF0000 : val
+ };
+
+ Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 4, this.length);
+
+ return (this[offset]) |
+ (this[offset + 1] << 8) |
+ (this[offset + 2] << 16) |
+ (this[offset + 3] << 24)
+ };
+
+ Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 4, this.length);
+
+ return (this[offset] << 24) |
+ (this[offset + 1] << 16) |
+ (this[offset + 2] << 8) |
+ (this[offset + 3])
+ };
+
+ Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 4, this.length);
+ return read(this, offset, true, 23, 4)
+ };
+
+ Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 4, this.length);
+ return read(this, offset, false, 23, 4)
+ };
+
+ Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 8, this.length);
+ return read(this, offset, true, 52, 8)
+ };
+
+ Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
+ if (!noAssert) checkOffset(offset, 8, this.length);
+ return read(this, offset, false, 52, 8)
+ };
+
+ function checkInt (buf, value, offset, ext, max, min) {
+ if (!internalIsBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance')
+ if (value > max || value < min) throw new RangeError('"value" argument is out of bounds')
+ if (offset + ext > buf.length) throw new RangeError('Index out of range')
+ }
+
+ Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ byteLength = byteLength | 0;
+ if (!noAssert) {
+ var maxBytes = Math.pow(2, 8 * byteLength) - 1;
+ checkInt(this, value, offset, byteLength, maxBytes, 0);
+ }
+
+ var mul = 1;
+ var i = 0;
+ this[offset] = value & 0xFF;
+ while (++i < byteLength && (mul *= 0x100)) {
+ this[offset + i] = (value / mul) & 0xFF;
+ }
+
+ return offset + byteLength
+ };
+
+ Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ byteLength = byteLength | 0;
+ if (!noAssert) {
+ var maxBytes = Math.pow(2, 8 * byteLength) - 1;
+ checkInt(this, value, offset, byteLength, maxBytes, 0);
+ }
+
+ var i = byteLength - 1;
+ var mul = 1;
+ this[offset + i] = value & 0xFF;
+ while (--i >= 0 && (mul *= 0x100)) {
+ this[offset + i] = (value / mul) & 0xFF;
+ }
+
+ return offset + byteLength
+ };
+
+ Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0);
+ if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value);
+ this[offset] = (value & 0xff);
+ return offset + 1
+ };
+
+ function objectWriteUInt16 (buf, value, offset, littleEndian) {
+ if (value < 0) value = 0xffff + value + 1;
+ for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {
+ buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>
+ (littleEndian ? i : 1 - i) * 8;
+ }
+ }
+
+ Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0);
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = (value & 0xff);
+ this[offset + 1] = (value >>> 8);
+ } else {
+ objectWriteUInt16(this, value, offset, true);
+ }
+ return offset + 2
+ };
+
+ Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0);
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = (value >>> 8);
+ this[offset + 1] = (value & 0xff);
+ } else {
+ objectWriteUInt16(this, value, offset, false);
+ }
+ return offset + 2
+ };
+
+ function objectWriteUInt32 (buf, value, offset, littleEndian) {
+ if (value < 0) value = 0xffffffff + value + 1;
+ for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {
+ buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff;
+ }
+ }
+
+ Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0);
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset + 3] = (value >>> 24);
+ this[offset + 2] = (value >>> 16);
+ this[offset + 1] = (value >>> 8);
+ this[offset] = (value & 0xff);
+ } else {
+ objectWriteUInt32(this, value, offset, true);
+ }
+ return offset + 4
+ };
+
+ Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0);
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = (value >>> 24);
+ this[offset + 1] = (value >>> 16);
+ this[offset + 2] = (value >>> 8);
+ this[offset + 3] = (value & 0xff);
+ } else {
+ objectWriteUInt32(this, value, offset, false);
+ }
+ return offset + 4
+ };
+
+ Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) {
+ var limit = Math.pow(2, 8 * byteLength - 1);
+
+ checkInt(this, value, offset, byteLength, limit - 1, -limit);
+ }
+
+ var i = 0;
+ var mul = 1;
+ var sub = 0;
+ this[offset] = value & 0xFF;
+ while (++i < byteLength && (mul *= 0x100)) {
+ if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
+ sub = 1;
+ }
+ this[offset + i] = ((value / mul) >> 0) - sub & 0xFF;
+ }
+
+ return offset + byteLength
+ };
+
+ Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) {
+ var limit = Math.pow(2, 8 * byteLength - 1);
+
+ checkInt(this, value, offset, byteLength, limit - 1, -limit);
+ }
+
+ var i = byteLength - 1;
+ var mul = 1;
+ var sub = 0;
+ this[offset + i] = value & 0xFF;
+ while (--i >= 0 && (mul *= 0x100)) {
+ if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
+ sub = 1;
+ }
+ this[offset + i] = ((value / mul) >> 0) - sub & 0xFF;
+ }
+
+ return offset + byteLength
+ };
+
+ Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80);
+ if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value);
+ if (value < 0) value = 0xff + value + 1;
+ this[offset] = (value & 0xff);
+ return offset + 1
+ };
+
+ Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000);
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = (value & 0xff);
+ this[offset + 1] = (value >>> 8);
+ } else {
+ objectWriteUInt16(this, value, offset, true);
+ }
+ return offset + 2
+ };
+
+ Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000);
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = (value >>> 8);
+ this[offset + 1] = (value & 0xff);
+ } else {
+ objectWriteUInt16(this, value, offset, false);
+ }
+ return offset + 2
+ };
+
+ Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000);
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = (value & 0xff);
+ this[offset + 1] = (value >>> 8);
+ this[offset + 2] = (value >>> 16);
+ this[offset + 3] = (value >>> 24);
+ } else {
+ objectWriteUInt32(this, value, offset, true);
+ }
+ return offset + 4
+ };
+
+ Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
+ value = +value;
+ offset = offset | 0;
+ if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000);
+ if (value < 0) value = 0xffffffff + value + 1;
+ if (Buffer.TYPED_ARRAY_SUPPORT) {
+ this[offset] = (value >>> 24);
+ this[offset + 1] = (value >>> 16);
+ this[offset + 2] = (value >>> 8);
+ this[offset + 3] = (value & 0xff);
+ } else {
+ objectWriteUInt32(this, value, offset, false);
+ }
+ return offset + 4
+ };
+
+ function checkIEEE754 (buf, value, offset, ext, max, min) {
+ if (offset + ext > buf.length) throw new RangeError('Index out of range')
+ if (offset < 0) throw new RangeError('Index out of range')
+ }
+
+ function writeFloat (buf, value, offset, littleEndian, noAssert) {
+ if (!noAssert) {
+ checkIEEE754(buf, value, offset, 4);
+ }
+ write(buf, value, offset, littleEndian, 23, 4);
+ return offset + 4
+ }
+
+ Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
+ return writeFloat(this, value, offset, true, noAssert)
+ };
+
+ Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
+ return writeFloat(this, value, offset, false, noAssert)
+ };
+
+ function writeDouble (buf, value, offset, littleEndian, noAssert) {
+ if (!noAssert) {
+ checkIEEE754(buf, value, offset, 8);
+ }
+ write(buf, value, offset, littleEndian, 52, 8);
+ return offset + 8
+ }
+
+ Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
+ return writeDouble(this, value, offset, true, noAssert)
+ };
+
+ Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
+ return writeDouble(this, value, offset, false, noAssert)
+ };
+
+ // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
+ Buffer.prototype.copy = function copy (target, targetStart, start, end) {
+ if (!start) start = 0;
+ if (!end && end !== 0) end = this.length;
+ if (targetStart >= target.length) targetStart = target.length;
+ if (!targetStart) targetStart = 0;
+ if (end > 0 && end < start) end = start;
+
+ // Copy 0 bytes; we're done
+ if (end === start) return 0
+ if (target.length === 0 || this.length === 0) return 0
+
+ // Fatal error conditions
+ if (targetStart < 0) {
+ throw new RangeError('targetStart out of bounds')
+ }
+ if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')
+ if (end < 0) throw new RangeError('sourceEnd out of bounds')
+
+ // Are we oob?
+ if (end > this.length) end = this.length;
+ if (target.length - targetStart < end - start) {
+ end = target.length - targetStart + start;
+ }
+
+ var len = end - start;
+ var i;
+
+ if (this === target && start < targetStart && targetStart < end) {
+ // descending copy from end
+ for (i = len - 1; i >= 0; --i) {
+ target[i + targetStart] = this[i + start];
+ }
+ } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
+ // ascending copy from start
+ for (i = 0; i < len; ++i) {
+ target[i + targetStart] = this[i + start];
+ }
+ } else {
+ Uint8Array.prototype.set.call(
+ target,
+ this.subarray(start, start + len),
+ targetStart
+ );
+ }
+
+ return len
+ };
+
+ // Usage:
+ // buffer.fill(number[, offset[, end]])
+ // buffer.fill(buffer[, offset[, end]])
+ // buffer.fill(string[, offset[, end]][, encoding])
+ Buffer.prototype.fill = function fill (val, start, end, encoding) {
+ // Handle string cases:
+ if (typeof val === 'string') {
+ if (typeof start === 'string') {
+ encoding = start;
+ start = 0;
+ end = this.length;
+ } else if (typeof end === 'string') {
+ encoding = end;
+ end = this.length;
+ }
+ if (val.length === 1) {
+ var code = val.charCodeAt(0);
+ if (code < 256) {
+ val = code;
+ }
+ }
+ if (encoding !== undefined && typeof encoding !== 'string') {
+ throw new TypeError('encoding must be a string')
+ }
+ if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
+ throw new TypeError('Unknown encoding: ' + encoding)
+ }
+ } else if (typeof val === 'number') {
+ val = val & 255;
+ }
+
+ // Invalid ranges are not set to a default, so can range check early.
+ if (start < 0 || this.length < start || this.length < end) {
+ throw new RangeError('Out of range index')
+ }
+
+ if (end <= start) {
+ return this
+ }
+
+ start = start >>> 0;
+ end = end === undefined ? this.length : end >>> 0;
+
+ if (!val) val = 0;
+
+ var i;
+ if (typeof val === 'number') {
+ for (i = start; i < end; ++i) {
+ this[i] = val;
+ }
+ } else {
+ var bytes = internalIsBuffer(val)
+ ? val
+ : utf8ToBytes(new Buffer(val, encoding).toString());
+ var len = bytes.length;
+ for (i = 0; i < end - start; ++i) {
+ this[i + start] = bytes[i % len];
+ }
+ }
+
+ return this
+ };
+
+ // HELPER FUNCTIONS
+ // ================
+
+ var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g;
+
+ function base64clean (str) {
+ // Node strips out invalid characters like \n and \t from the string, base64-js does not
+ str = stringtrim(str).replace(INVALID_BASE64_RE, '');
+ // Node converts strings with length < 2 to ''
+ if (str.length < 2) return ''
+ // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
+ while (str.length % 4 !== 0) {
+ str = str + '=';
+ }
+ return str
+ }
+
+ function stringtrim (str) {
+ if (str.trim) return str.trim()
+ return str.replace(/^\s+|\s+$/g, '')
+ }
+
+ function toHex (n) {
+ if (n < 16) return '0' + n.toString(16)
+ return n.toString(16)
+ }
+
+ function utf8ToBytes (string, units) {
+ units = units || Infinity;
+ var codePoint;
+ var length = string.length;
+ var leadSurrogate = null;
+ var bytes = [];
+
+ for (var i = 0; i < length; ++i) {
+ codePoint = string.charCodeAt(i);
+
+ // is surrogate component
+ if (codePoint > 0xD7FF && codePoint < 0xE000) {
+ // last char was a lead
+ if (!leadSurrogate) {
+ // no lead yet
+ if (codePoint > 0xDBFF) {
+ // unexpected trail
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);
+ continue
+ } else if (i + 1 === length) {
+ // unpaired lead
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);
+ continue
+ }
+
+ // valid lead
+ leadSurrogate = codePoint;
+
+ continue
+ }
+
+ // 2 leads in a row
+ if (codePoint < 0xDC00) {
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);
+ leadSurrogate = codePoint;
+ continue
+ }
+
+ // valid surrogate pair
+ codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000;
+ } else if (leadSurrogate) {
+ // valid bmp char, but last char was a lead
+ if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);
+ }
+
+ leadSurrogate = null;
+
+ // encode utf8
+ if (codePoint < 0x80) {
+ if ((units -= 1) < 0) break
+ bytes.push(codePoint);
+ } else if (codePoint < 0x800) {
+ if ((units -= 2) < 0) break
+ bytes.push(
+ codePoint >> 0x6 | 0xC0,
+ codePoint & 0x3F | 0x80
+ );
+ } else if (codePoint < 0x10000) {
+ if ((units -= 3) < 0) break
+ bytes.push(
+ codePoint >> 0xC | 0xE0,
+ codePoint >> 0x6 & 0x3F | 0x80,
+ codePoint & 0x3F | 0x80
+ );
+ } else if (codePoint < 0x110000) {
+ if ((units -= 4) < 0) break
+ bytes.push(
+ codePoint >> 0x12 | 0xF0,
+ codePoint >> 0xC & 0x3F | 0x80,
+ codePoint >> 0x6 & 0x3F | 0x80,
+ codePoint & 0x3F | 0x80
+ );
+ } else {
+ throw new Error('Invalid code point')
+ }
+ }
+
+ return bytes
+ }
+
+ function asciiToBytes (str) {
+ var byteArray = [];
+ for (var i = 0; i < str.length; ++i) {
+ // Node's code seems to be doing this and not & 0x7F..
+ byteArray.push(str.charCodeAt(i) & 0xFF);
+ }
+ return byteArray
+ }
+
+ function utf16leToBytes (str, units) {
+ var c, hi, lo;
+ var byteArray = [];
+ for (var i = 0; i < str.length; ++i) {
+ if ((units -= 2) < 0) break
+
+ c = str.charCodeAt(i);
+ hi = c >> 8;
+ lo = c % 256;
+ byteArray.push(lo);
+ byteArray.push(hi);
+ }
+
+ return byteArray
+ }
+
+
+ function base64ToBytes (str) {
+ return toByteArray(base64clean(str))
+ }
+
+ function blitBuffer (src, dst, offset, length) {
+ for (var i = 0; i < length; ++i) {
+ if ((i + offset >= dst.length) || (i >= src.length)) break
+ dst[i + offset] = src[i];
+ }
+ return i
+ }
+
+ function isnan (val) {
+ return val !== val // eslint-disable-line no-self-compare
+ }
+
+
+ // the following is from is-buffer, also by Feross Aboukhadijeh and with same lisence
+ // The _isBuffer check is for Safari 5-7 support, because it's missing
+ // Object.prototype.constructor. Remove this eventually
+ function isBuffer(obj) {
+ return obj != null && (!!obj._isBuffer || isFastBuffer(obj) || isSlowBuffer(obj))
+ }
+
+ function isFastBuffer (obj) {
+ return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)
+ }
+
+ // For Node v0.10 support. Remove this eventually.
+ function isSlowBuffer (obj) {
+ return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isFastBuffer(obj.slice(0, 0))
+ }
+
+ var sourcemapCodec_umd = {exports: {}};
+
+ var hasRequiredSourcemapCodec_umd;
+
+ function requireSourcemapCodec_umd () {
+ if (hasRequiredSourcemapCodec_umd) return sourcemapCodec_umd.exports;
+ hasRequiredSourcemapCodec_umd = 1;
+ (function (module, exports) {
+ (function (global, factory) {
+ factory(exports) ;
+ })(commonjsGlobal, (function (exports) {
+ const comma = ','.charCodeAt(0);
+ const semicolon = ';'.charCodeAt(0);
+ const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
+ const intToChar = new Uint8Array(64); // 64 possible chars.
+ const charToInt = new Uint8Array(128); // z is 122 in ASCII
+ for (let i = 0; i < chars.length; i++) {
+ const c = chars.charCodeAt(i);
+ intToChar[i] = c;
+ charToInt[c] = i;
+ }
+ // Provide a fallback for older environments.
+ const td = typeof TextDecoder !== 'undefined'
+ ? /* #__PURE__ */ new TextDecoder()
+ : typeof Buffer !== 'undefined'
+ ? {
+ decode(buf) {
+ const out = Buffer.from(buf.buffer, buf.byteOffset, buf.byteLength);
+ return out.toString();
+ },
+ }
+ : {
+ decode(buf) {
+ let out = '';
+ for (let i = 0; i < buf.length; i++) {
+ out += String.fromCharCode(buf[i]);
+ }
+ return out;
+ },
+ };
+ function decode(mappings) {
+ const state = new Int32Array(5);
+ const decoded = [];
+ let index = 0;
+ do {
+ const semi = indexOf(mappings, index);
+ const line = [];
+ let sorted = true;
+ let lastCol = 0;
+ state[0] = 0;
+ for (let i = index; i < semi; i++) {
+ let seg;
+ i = decodeInteger(mappings, i, state, 0); // genColumn
+ const col = state[0];
+ if (col < lastCol)
+ sorted = false;
+ lastCol = col;
+ if (hasMoreVlq(mappings, i, semi)) {
+ i = decodeInteger(mappings, i, state, 1); // sourcesIndex
+ i = decodeInteger(mappings, i, state, 2); // sourceLine
+ i = decodeInteger(mappings, i, state, 3); // sourceColumn
+ if (hasMoreVlq(mappings, i, semi)) {
+ i = decodeInteger(mappings, i, state, 4); // namesIndex
+ seg = [col, state[1], state[2], state[3], state[4]];
+ }
+ else {
+ seg = [col, state[1], state[2], state[3]];
+ }
+ }
+ else {
+ seg = [col];
+ }
+ line.push(seg);
+ }
+ if (!sorted)
+ sort(line);
+ decoded.push(line);
+ index = semi + 1;
+ } while (index <= mappings.length);
+ return decoded;
+ }
+ function indexOf(mappings, index) {
+ const idx = mappings.indexOf(';', index);
+ return idx === -1 ? mappings.length : idx;
+ }
+ function decodeInteger(mappings, pos, state, j) {
+ let value = 0;
+ let shift = 0;
+ let integer = 0;
+ do {
+ const c = mappings.charCodeAt(pos++);
+ integer = charToInt[c];
+ value |= (integer & 31) << shift;
+ shift += 5;
+ } while (integer & 32);
+ const shouldNegate = value & 1;
+ value >>>= 1;
+ if (shouldNegate) {
+ value = -0x80000000 | -value;
+ }
+ state[j] += value;
+ return pos;
+ }
+ function hasMoreVlq(mappings, i, length) {
+ if (i >= length)
+ return false;
+ return mappings.charCodeAt(i) !== comma;
+ }
+ function sort(line) {
+ line.sort(sortComparator);
+ }
+ function sortComparator(a, b) {
+ return a[0] - b[0];
+ }
+ function encode(decoded) {
+ const state = new Int32Array(5);
+ const bufLength = 1024 * 16;
+ const subLength = bufLength - 36;
+ const buf = new Uint8Array(bufLength);
+ const sub = buf.subarray(0, subLength);
+ let pos = 0;
+ let out = '';
+ for (let i = 0; i < decoded.length; i++) {
+ const line = decoded[i];
+ if (i > 0) {
+ if (pos === bufLength) {
+ out += td.decode(buf);
+ pos = 0;
+ }
+ buf[pos++] = semicolon;
+ }
+ if (line.length === 0)
+ continue;
+ state[0] = 0;
+ for (let j = 0; j < line.length; j++) {
+ const segment = line[j];
+ // We can push up to 5 ints, each int can take at most 7 chars, and we
+ // may push a comma.
+ if (pos > subLength) {
+ out += td.decode(sub);
+ buf.copyWithin(0, subLength, pos);
+ pos -= subLength;
+ }
+ if (j > 0)
+ buf[pos++] = comma;
+ pos = encodeInteger(buf, pos, state, segment, 0); // genColumn
+ if (segment.length === 1)
+ continue;
+ pos = encodeInteger(buf, pos, state, segment, 1); // sourcesIndex
+ pos = encodeInteger(buf, pos, state, segment, 2); // sourceLine
+ pos = encodeInteger(buf, pos, state, segment, 3); // sourceColumn
+ if (segment.length === 4)
+ continue;
+ pos = encodeInteger(buf, pos, state, segment, 4); // namesIndex
+ }
+ }
+ return out + td.decode(buf.subarray(0, pos));
+ }
+ function encodeInteger(buf, pos, state, segment, j) {
+ const next = segment[j];
+ let num = next - state[j];
+ state[j] = next;
+ num = num < 0 ? (-num << 1) | 1 : num << 1;
+ do {
+ let clamped = num & 0b011111;
+ num >>>= 5;
+ if (num > 0)
+ clamped |= 0b100000;
+ buf[pos++] = intToChar[clamped];
+ } while (num > 0);
+ return pos;
+ }
+
+ exports.decode = decode;
+ exports.encode = encode;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+ }));
+
+ } (sourcemapCodec_umd, sourcemapCodec_umd.exports));
+ return sourcemapCodec_umd.exports;
+ }
+
+ var traceMapping_umd = {exports: {}};
+
+ var resolveUri_umd = {exports: {}};
+
+ var hasRequiredResolveUri_umd;
+
+ function requireResolveUri_umd () {
+ if (hasRequiredResolveUri_umd) return resolveUri_umd.exports;
+ hasRequiredResolveUri_umd = 1;
+ (function (module, exports) {
+ (function (global, factory) {
+ module.exports = factory() ;
+ })(commonjsGlobal, (function () {
+ // Matches the scheme of a URL, eg "http://"
+ const schemeRegex = /^[\w+.-]+:\/\//;
+ /**
+ * Matches the parts of a URL:
+ * 1. Scheme, including ":", guaranteed.
+ * 2. User/password, including "@", optional.
+ * 3. Host, guaranteed.
+ * 4. Port, including ":", optional.
+ * 5. Path, including "/", optional.
+ * 6. Query, including "?", optional.
+ * 7. Hash, including "#", optional.
+ */
+ const urlRegex = /^([\w+.-]+:)\/\/([^@/#?]*@)?([^:/#?]*)(:\d+)?(\/[^#?]*)?(\?[^#]*)?(#.*)?/;
+ /**
+ * File URLs are weird. They dont' need the regular `//` in the scheme, they may or may not start
+ * with a leading `/`, they can have a domain (but only if they don't start with a Windows drive).
+ *
+ * 1. Host, optional.
+ * 2. Path, which may include "/", guaranteed.
+ * 3. Query, including "?", optional.
+ * 4. Hash, including "#", optional.
+ */
+ const fileRegex = /^file:(?:\/\/((?![a-z]:)[^/#?]*)?)?(\/?[^#?]*)(\?[^#]*)?(#.*)?/i;
+ var UrlType;
+ (function (UrlType) {
+ UrlType[UrlType["Empty"] = 1] = "Empty";
+ UrlType[UrlType["Hash"] = 2] = "Hash";
+ UrlType[UrlType["Query"] = 3] = "Query";
+ UrlType[UrlType["RelativePath"] = 4] = "RelativePath";
+ UrlType[UrlType["AbsolutePath"] = 5] = "AbsolutePath";
+ UrlType[UrlType["SchemeRelative"] = 6] = "SchemeRelative";
+ UrlType[UrlType["Absolute"] = 7] = "Absolute";
+ })(UrlType || (UrlType = {}));
+ function isAbsoluteUrl(input) {
+ return schemeRegex.test(input);
+ }
+ function isSchemeRelativeUrl(input) {
+ return input.startsWith('//');
+ }
+ function isAbsolutePath(input) {
+ return input.startsWith('/');
+ }
+ function isFileUrl(input) {
+ return input.startsWith('file:');
+ }
+ function isRelative(input) {
+ return /^[.?#]/.test(input);
+ }
+ function parseAbsoluteUrl(input) {
+ const match = urlRegex.exec(input);
+ return makeUrl(match[1], match[2] || '', match[3], match[4] || '', match[5] || '/', match[6] || '', match[7] || '');
+ }
+ function parseFileUrl(input) {
+ const match = fileRegex.exec(input);
+ const path = match[2];
+ return makeUrl('file:', '', match[1] || '', '', isAbsolutePath(path) ? path : '/' + path, match[3] || '', match[4] || '');
+ }
+ function makeUrl(scheme, user, host, port, path, query, hash) {
+ return {
+ scheme,
+ user,
+ host,
+ port,
+ path,
+ query,
+ hash,
+ type: UrlType.Absolute,
+ };
+ }
+ function parseUrl(input) {
+ if (isSchemeRelativeUrl(input)) {
+ const url = parseAbsoluteUrl('http:' + input);
+ url.scheme = '';
+ url.type = UrlType.SchemeRelative;
+ return url;
+ }
+ if (isAbsolutePath(input)) {
+ const url = parseAbsoluteUrl('http://foo.com' + input);
+ url.scheme = '';
+ url.host = '';
+ url.type = UrlType.AbsolutePath;
+ return url;
+ }
+ if (isFileUrl(input))
+ return parseFileUrl(input);
+ if (isAbsoluteUrl(input))
+ return parseAbsoluteUrl(input);
+ const url = parseAbsoluteUrl('http://foo.com/' + input);
+ url.scheme = '';
+ url.host = '';
+ url.type = input
+ ? input.startsWith('?')
+ ? UrlType.Query
+ : input.startsWith('#')
+ ? UrlType.Hash
+ : UrlType.RelativePath
+ : UrlType.Empty;
+ return url;
+ }
+ function stripPathFilename(path) {
+ // If a path ends with a parent directory "..", then it's a relative path with excess parent
+ // paths. It's not a file, so we can't strip it.
+ if (path.endsWith('/..'))
+ return path;
+ const index = path.lastIndexOf('/');
+ return path.slice(0, index + 1);
+ }
+ function mergePaths(url, base) {
+ normalizePath(base, base.type);
+ // If the path is just a "/", then it was an empty path to begin with (remember, we're a relative
+ // path).
+ if (url.path === '/') {
+ url.path = base.path;
+ }
+ else {
+ // Resolution happens relative to the base path's directory, not the file.
+ url.path = stripPathFilename(base.path) + url.path;
+ }
+ }
+ /**
+ * The path can have empty directories "//", unneeded parents "foo/..", or current directory
+ * "foo/.". We need to normalize to a standard representation.
+ */
+ function normalizePath(url, type) {
+ const rel = type <= UrlType.RelativePath;
+ const pieces = url.path.split('/');
+ // We need to preserve the first piece always, so that we output a leading slash. The item at
+ // pieces[0] is an empty string.
+ let pointer = 1;
+ // Positive is the number of real directories we've output, used for popping a parent directory.
+ // Eg, "foo/bar/.." will have a positive 2, and we can decrement to be left with just "foo".
+ let positive = 0;
+ // We need to keep a trailing slash if we encounter an empty directory (eg, splitting "foo/" will
+ // generate `["foo", ""]` pieces). And, if we pop a parent directory. But once we encounter a
+ // real directory, we won't need to append, unless the other conditions happen again.
+ let addTrailingSlash = false;
+ for (let i = 1; i < pieces.length; i++) {
+ const piece = pieces[i];
+ // An empty directory, could be a trailing slash, or just a double "//" in the path.
+ if (!piece) {
+ addTrailingSlash = true;
+ continue;
+ }
+ // If we encounter a real directory, then we don't need to append anymore.
+ addTrailingSlash = false;
+ // A current directory, which we can always drop.
+ if (piece === '.')
+ continue;
+ // A parent directory, we need to see if there are any real directories we can pop. Else, we
+ // have an excess of parents, and we'll need to keep the "..".
+ if (piece === '..') {
+ if (positive) {
+ addTrailingSlash = true;
+ positive--;
+ pointer--;
+ }
+ else if (rel) {
+ // If we're in a relativePath, then we need to keep the excess parents. Else, in an absolute
+ // URL, protocol relative URL, or an absolute path, we don't need to keep excess.
+ pieces[pointer++] = piece;
+ }
+ continue;
+ }
+ // We've encountered a real directory. Move it to the next insertion pointer, which accounts for
+ // any popped or dropped directories.
+ pieces[pointer++] = piece;
+ positive++;
+ }
+ let path = '';
+ for (let i = 1; i < pointer; i++) {
+ path += '/' + pieces[i];
+ }
+ if (!path || (addTrailingSlash && !path.endsWith('/..'))) {
+ path += '/';
+ }
+ url.path = path;
+ }
+ /**
+ * Attempts to resolve `input` URL/path relative to `base`.
+ */
+ function resolve(input, base) {
+ if (!input && !base)
+ return '';
+ const url = parseUrl(input);
+ let inputType = url.type;
+ if (base && inputType !== UrlType.Absolute) {
+ const baseUrl = parseUrl(base);
+ const baseType = baseUrl.type;
+ switch (inputType) {
+ case UrlType.Empty:
+ url.hash = baseUrl.hash;
+ // fall through
+ case UrlType.Hash:
+ url.query = baseUrl.query;
+ // fall through
+ case UrlType.Query:
+ case UrlType.RelativePath:
+ mergePaths(url, baseUrl);
+ // fall through
+ case UrlType.AbsolutePath:
+ // The host, user, and port are joined, you can't copy one without the others.
+ url.user = baseUrl.user;
+ url.host = baseUrl.host;
+ url.port = baseUrl.port;
+ // fall through
+ case UrlType.SchemeRelative:
+ // The input doesn't have a schema at least, so we need to copy at least that over.
+ url.scheme = baseUrl.scheme;
+ }
+ if (baseType > inputType)
+ inputType = baseType;
+ }
+ normalizePath(url, inputType);
+ const queryHash = url.query + url.hash;
+ switch (inputType) {
+ // This is impossible, because of the empty checks at the start of the function.
+ // case UrlType.Empty:
+ case UrlType.Hash:
+ case UrlType.Query:
+ return queryHash;
+ case UrlType.RelativePath: {
+ // The first char is always a "/", and we need it to be relative.
+ const path = url.path.slice(1);
+ if (!path)
+ return queryHash || '.';
+ if (isRelative(base || input) && !isRelative(path)) {
+ // If base started with a leading ".", or there is no base and input started with a ".",
+ // then we need to ensure that the relative path starts with a ".". We don't know if
+ // relative starts with a "..", though, so check before prepending.
+ return './' + path + queryHash;
+ }
+ return path + queryHash;
+ }
+ case UrlType.AbsolutePath:
+ return url.path + queryHash;
+ default:
+ return url.scheme + '//' + url.user + url.host + url.port + url.path + queryHash;
+ }
+ }
+
+ return resolve;
+
+ }));
+
+ } (resolveUri_umd));
+ return resolveUri_umd.exports;
+ }
+
+ var hasRequiredTraceMapping_umd;
+
+ function requireTraceMapping_umd () {
+ if (hasRequiredTraceMapping_umd) return traceMapping_umd.exports;
+ hasRequiredTraceMapping_umd = 1;
+ (function (module, exports) {
+ (function (global, factory) {
+ factory(exports, requireSourcemapCodec_umd(), requireResolveUri_umd()) ;
+ })(commonjsGlobal, (function (exports, sourcemapCodec, resolveUri) {
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
+
+ var resolveUri__default = /*#__PURE__*/_interopDefaultLegacy(resolveUri);
+
+ function resolve(input, base) {
+ // The base is always treated as a directory, if it's not empty.
+ // https://github.com/mozilla/source-map/blob/8cb3ee57/lib/util.js#L327
+ // https://github.com/chromium/chromium/blob/da4adbb3/third_party/blink/renderer/devtools/front_end/sdk/SourceMap.js#L400-L401
+ if (base && !base.endsWith('/'))
+ base += '/';
+ return resolveUri__default["default"](input, base);
+ }
+
+ /**
+ * Removes everything after the last "/", but leaves the slash.
+ */
+ function stripFilename(path) {
+ if (!path)
+ return '';
+ const index = path.lastIndexOf('/');
+ return path.slice(0, index + 1);
+ }
+
+ const COLUMN = 0;
+ const SOURCES_INDEX = 1;
+ const SOURCE_LINE = 2;
+ const SOURCE_COLUMN = 3;
+ const NAMES_INDEX = 4;
+ const REV_GENERATED_LINE = 1;
+ const REV_GENERATED_COLUMN = 2;
+
+ function maybeSort(mappings, owned) {
+ const unsortedIndex = nextUnsortedSegmentLine(mappings, 0);
+ if (unsortedIndex === mappings.length)
+ return mappings;
+ // If we own the array (meaning we parsed it from JSON), then we're free to directly mutate it. If
+ // not, we do not want to modify the consumer's input array.
+ if (!owned)
+ mappings = mappings.slice();
+ for (let i = unsortedIndex; i < mappings.length; i = nextUnsortedSegmentLine(mappings, i + 1)) {
+ mappings[i] = sortSegments(mappings[i], owned);
+ }
+ return mappings;
+ }
+ function nextUnsortedSegmentLine(mappings, start) {
+ for (let i = start; i < mappings.length; i++) {
+ if (!isSorted(mappings[i]))
+ return i;
+ }
+ return mappings.length;
+ }
+ function isSorted(line) {
+ for (let j = 1; j < line.length; j++) {
+ if (line[j][COLUMN] < line[j - 1][COLUMN]) {
+ return false;
+ }
+ }
+ return true;
+ }
+ function sortSegments(line, owned) {
+ if (!owned)
+ line = line.slice();
+ return line.sort(sortComparator);
+ }
+ function sortComparator(a, b) {
+ return a[COLUMN] - b[COLUMN];
+ }
+
+ let found = false;
+ /**
+ * A binary search implementation that returns the index if a match is found.
+ * If no match is found, then the left-index (the index associated with the item that comes just
+ * before the desired index) is returned. To maintain proper sort order, a splice would happen at
+ * the next index:
+ *
+ * ```js
+ * const array = [1, 3];
+ * const needle = 2;
+ * const index = binarySearch(array, needle, (item, needle) => item - needle);
+ *
+ * assert.equal(index, 0);
+ * array.splice(index + 1, 0, needle);
+ * assert.deepEqual(array, [1, 2, 3]);
+ * ```
+ */
+ function binarySearch(haystack, needle, low, high) {
+ while (low <= high) {
+ const mid = low + ((high - low) >> 1);
+ const cmp = haystack[mid][COLUMN] - needle;
+ if (cmp === 0) {
+ found = true;
+ return mid;
+ }
+ if (cmp < 0) {
+ low = mid + 1;
+ }
+ else {
+ high = mid - 1;
+ }
+ }
+ found = false;
+ return low - 1;
+ }
+ function upperBound(haystack, needle, index) {
+ for (let i = index + 1; i < haystack.length; index = i++) {
+ if (haystack[i][COLUMN] !== needle)
+ break;
+ }
+ return index;
+ }
+ function lowerBound(haystack, needle, index) {
+ for (let i = index - 1; i >= 0; index = i--) {
+ if (haystack[i][COLUMN] !== needle)
+ break;
+ }
+ return index;
+ }
+ function memoizedState() {
+ return {
+ lastKey: -1,
+ lastNeedle: -1,
+ lastIndex: -1,
+ };
+ }
+ /**
+ * This overly complicated beast is just to record the last tested line/column and the resulting
+ * index, allowing us to skip a few tests if mappings are monotonically increasing.
+ */
+ function memoizedBinarySearch(haystack, needle, state, key) {
+ const { lastKey, lastNeedle, lastIndex } = state;
+ let low = 0;
+ let high = haystack.length - 1;
+ if (key === lastKey) {
+ if (needle === lastNeedle) {
+ found = lastIndex !== -1 && haystack[lastIndex][COLUMN] === needle;
+ return lastIndex;
+ }
+ if (needle >= lastNeedle) {
+ // lastIndex may be -1 if the previous needle was not found.
+ low = lastIndex === -1 ? 0 : lastIndex;
+ }
+ else {
+ high = lastIndex;
+ }
+ }
+ state.lastKey = key;
+ state.lastNeedle = needle;
+ return (state.lastIndex = binarySearch(haystack, needle, low, high));
+ }
+
+ // Rebuilds the original source files, with mappings that are ordered by source line/column instead
+ // of generated line/column.
+ function buildBySources(decoded, memos) {
+ const sources = memos.map(buildNullArray);
+ for (let i = 0; i < decoded.length; i++) {
+ const line = decoded[i];
+ for (let j = 0; j < line.length; j++) {
+ const seg = line[j];
+ if (seg.length === 1)
+ continue;
+ const sourceIndex = seg[SOURCES_INDEX];
+ const sourceLine = seg[SOURCE_LINE];
+ const sourceColumn = seg[SOURCE_COLUMN];
+ const originalSource = sources[sourceIndex];
+ const originalLine = (originalSource[sourceLine] || (originalSource[sourceLine] = []));
+ const memo = memos[sourceIndex];
+ // The binary search either found a match, or it found the left-index just before where the
+ // segment should go. Either way, we want to insert after that. And there may be multiple
+ // generated segments associated with an original location, so there may need to move several
+ // indexes before we find where we need to insert.
+ const index = upperBound(originalLine, sourceColumn, memoizedBinarySearch(originalLine, sourceColumn, memo, sourceLine));
+ insert(originalLine, (memo.lastIndex = index + 1), [sourceColumn, i, seg[COLUMN]]);
+ }
+ }
+ return sources;
+ }
+ function insert(array, index, value) {
+ for (let i = array.length; i > index; i--) {
+ array[i] = array[i - 1];
+ }
+ array[index] = value;
+ }
+ // Null arrays allow us to use ordered index keys without actually allocating contiguous memory like
+ // a real array. We use a null-prototype object to avoid prototype pollution and deoptimizations.
+ // Numeric properties on objects are magically sorted in ascending order by the engine regardless of
+ // the insertion order. So, by setting any numeric keys, even out of order, we'll get ascending
+ // order when iterating with for-in.
+ function buildNullArray() {
+ return { __proto__: null };
+ }
+
+ const AnyMap = function (map, mapUrl) {
+ const parsed = typeof map === 'string' ? JSON.parse(map) : map;
+ if (!('sections' in parsed))
+ return new TraceMap(parsed, mapUrl);
+ const mappings = [];
+ const sources = [];
+ const sourcesContent = [];
+ const names = [];
+ recurse(parsed, mapUrl, mappings, sources, sourcesContent, names, 0, 0, Infinity, Infinity);
+ const joined = {
+ version: 3,
+ file: parsed.file,
+ names,
+ sources,
+ sourcesContent,
+ mappings,
+ };
+ return exports.presortedDecodedMap(joined);
+ };
+ function recurse(input, mapUrl, mappings, sources, sourcesContent, names, lineOffset, columnOffset, stopLine, stopColumn) {
+ const { sections } = input;
+ for (let i = 0; i < sections.length; i++) {
+ const { map, offset } = sections[i];
+ let sl = stopLine;
+ let sc = stopColumn;
+ if (i + 1 < sections.length) {
+ const nextOffset = sections[i + 1].offset;
+ sl = Math.min(stopLine, lineOffset + nextOffset.line);
+ if (sl === stopLine) {
+ sc = Math.min(stopColumn, columnOffset + nextOffset.column);
+ }
+ else if (sl < stopLine) {
+ sc = columnOffset + nextOffset.column;
+ }
+ }
+ addSection(map, mapUrl, mappings, sources, sourcesContent, names, lineOffset + offset.line, columnOffset + offset.column, sl, sc);
+ }
+ }
+ function addSection(input, mapUrl, mappings, sources, sourcesContent, names, lineOffset, columnOffset, stopLine, stopColumn) {
+ if ('sections' in input)
+ return recurse(...arguments);
+ const map = new TraceMap(input, mapUrl);
+ const sourcesOffset = sources.length;
+ const namesOffset = names.length;
+ const decoded = exports.decodedMappings(map);
+ const { resolvedSources, sourcesContent: contents } = map;
+ append(sources, resolvedSources);
+ append(names, map.names);
+ if (contents)
+ append(sourcesContent, contents);
+ else
+ for (let i = 0; i < resolvedSources.length; i++)
+ sourcesContent.push(null);
+ for (let i = 0; i < decoded.length; i++) {
+ const lineI = lineOffset + i;
+ // We can only add so many lines before we step into the range that the next section's map
+ // controls. When we get to the last line, then we'll start checking the segments to see if
+ // they've crossed into the column range. But it may not have any columns that overstep, so we
+ // still need to check that we don't overstep lines, too.
+ if (lineI > stopLine)
+ return;
+ // The out line may already exist in mappings (if we're continuing the line started by a
+ // previous section). Or, we may have jumped ahead several lines to start this section.
+ const out = getLine(mappings, lineI);
+ // On the 0th loop, the section's column offset shifts us forward. On all other lines (since the
+ // map can be multiple lines), it doesn't.
+ const cOffset = i === 0 ? columnOffset : 0;
+ const line = decoded[i];
+ for (let j = 0; j < line.length; j++) {
+ const seg = line[j];
+ const column = cOffset + seg[COLUMN];
+ // If this segment steps into the column range that the next section's map controls, we need
+ // to stop early.
+ if (lineI === stopLine && column >= stopColumn)
+ return;
+ if (seg.length === 1) {
+ out.push([column]);
+ continue;
+ }
+ const sourcesIndex = sourcesOffset + seg[SOURCES_INDEX];
+ const sourceLine = seg[SOURCE_LINE];
+ const sourceColumn = seg[SOURCE_COLUMN];
+ out.push(seg.length === 4
+ ? [column, sourcesIndex, sourceLine, sourceColumn]
+ : [column, sourcesIndex, sourceLine, sourceColumn, namesOffset + seg[NAMES_INDEX]]);
+ }
+ }
+ }
+ function append(arr, other) {
+ for (let i = 0; i < other.length; i++)
+ arr.push(other[i]);
+ }
+ function getLine(arr, index) {
+ for (let i = arr.length; i <= index; i++)
+ arr[i] = [];
+ return arr[index];
+ }
+
+ const LINE_GTR_ZERO = '`line` must be greater than 0 (lines start at line 1)';
+ const COL_GTR_EQ_ZERO = '`column` must be greater than or equal to 0 (columns start at column 0)';
+ const LEAST_UPPER_BOUND = -1;
+ const GREATEST_LOWER_BOUND = 1;
+ /**
+ * Returns the encoded (VLQ string) form of the SourceMap's mappings field.
+ */
+ exports.encodedMappings = void 0;
+ /**
+ * Returns the decoded (array of lines of segments) form of the SourceMap's mappings field.
+ */
+ exports.decodedMappings = void 0;
+ /**
+ * A low-level API to find the segment associated with a generated line/column (think, from a
+ * stack trace). Line and column here are 0-based, unlike `originalPositionFor`.
+ */
+ exports.traceSegment = void 0;
+ /**
+ * A higher-level API to find the source/line/column associated with a generated line/column
+ * (think, from a stack trace). Line is 1-based, but column is 0-based, due to legacy behavior in
+ * `source-map` library.
+ */
+ exports.originalPositionFor = void 0;
+ /**
+ * Finds the generated line/column position of the provided source/line/column source position.
+ */
+ exports.generatedPositionFor = void 0;
+ /**
+ * Finds all generated line/column positions of the provided source/line/column source position.
+ */
+ exports.allGeneratedPositionsFor = void 0;
+ /**
+ * Iterates each mapping in generated position order.
+ */
+ exports.eachMapping = void 0;
+ /**
+ * Retrieves the source content for a particular source, if its found. Returns null if not.
+ */
+ exports.sourceContentFor = void 0;
+ /**
+ * A helper that skips sorting of the input map's mappings array, which can be expensive for larger
+ * maps.
+ */
+ exports.presortedDecodedMap = void 0;
+ /**
+ * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects
+ * a sourcemap, or to JSON.stringify.
+ */
+ exports.decodedMap = void 0;
+ /**
+ * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects
+ * a sourcemap, or to JSON.stringify.
+ */
+ exports.encodedMap = void 0;
+ class TraceMap {
+ constructor(map, mapUrl) {
+ const isString = typeof map === 'string';
+ if (!isString && map._decodedMemo)
+ return map;
+ const parsed = (isString ? JSON.parse(map) : map);
+ const { version, file, names, sourceRoot, sources, sourcesContent } = parsed;
+ this.version = version;
+ this.file = file;
+ this.names = names || [];
+ this.sourceRoot = sourceRoot;
+ this.sources = sources;
+ this.sourcesContent = sourcesContent;
+ const from = resolve(sourceRoot || '', stripFilename(mapUrl));
+ this.resolvedSources = sources.map((s) => resolve(s || '', from));
+ const { mappings } = parsed;
+ if (typeof mappings === 'string') {
+ this._encoded = mappings;
+ this._decoded = undefined;
+ }
+ else {
+ this._encoded = undefined;
+ this._decoded = maybeSort(mappings, isString);
+ }
+ this._decodedMemo = memoizedState();
+ this._bySources = undefined;
+ this._bySourceMemos = undefined;
+ }
+ }
+ (() => {
+ exports.encodedMappings = (map) => {
+ var _a;
+ return ((_a = map._encoded) !== null && _a !== void 0 ? _a : (map._encoded = sourcemapCodec.encode(map._decoded)));
+ };
+ exports.decodedMappings = (map) => {
+ return (map._decoded || (map._decoded = sourcemapCodec.decode(map._encoded)));
+ };
+ exports.traceSegment = (map, line, column) => {
+ const decoded = exports.decodedMappings(map);
+ // It's common for parent source maps to have pointers to lines that have no
+ // mapping (like a "//# sourceMappingURL=") at the end of the child file.
+ if (line >= decoded.length)
+ return null;
+ const segments = decoded[line];
+ const index = traceSegmentInternal(segments, map._decodedMemo, line, column, GREATEST_LOWER_BOUND);
+ return index === -1 ? null : segments[index];
+ };
+ exports.originalPositionFor = (map, { line, column, bias }) => {
+ line--;
+ if (line < 0)
+ throw new Error(LINE_GTR_ZERO);
+ if (column < 0)
+ throw new Error(COL_GTR_EQ_ZERO);
+ const decoded = exports.decodedMappings(map);
+ // It's common for parent source maps to have pointers to lines that have no
+ // mapping (like a "//# sourceMappingURL=") at the end of the child file.
+ if (line >= decoded.length)
+ return OMapping(null, null, null, null);
+ const segments = decoded[line];
+ const index = traceSegmentInternal(segments, map._decodedMemo, line, column, bias || GREATEST_LOWER_BOUND);
+ if (index === -1)
+ return OMapping(null, null, null, null);
+ const segment = segments[index];
+ if (segment.length === 1)
+ return OMapping(null, null, null, null);
+ const { names, resolvedSources } = map;
+ return OMapping(resolvedSources[segment[SOURCES_INDEX]], segment[SOURCE_LINE] + 1, segment[SOURCE_COLUMN], segment.length === 5 ? names[segment[NAMES_INDEX]] : null);
+ };
+ exports.allGeneratedPositionsFor = (map, { source, line, column, bias }) => {
+ // SourceMapConsumer uses LEAST_UPPER_BOUND for some reason, so we follow suit.
+ return generatedPosition(map, source, line, column, bias || LEAST_UPPER_BOUND, true);
+ };
+ exports.generatedPositionFor = (map, { source, line, column, bias }) => {
+ return generatedPosition(map, source, line, column, bias || GREATEST_LOWER_BOUND, false);
+ };
+ exports.eachMapping = (map, cb) => {
+ const decoded = exports.decodedMappings(map);
+ const { names, resolvedSources } = map;
+ for (let i = 0; i < decoded.length; i++) {
+ const line = decoded[i];
+ for (let j = 0; j < line.length; j++) {
+ const seg = line[j];
+ const generatedLine = i + 1;
+ const generatedColumn = seg[0];
+ let source = null;
+ let originalLine = null;
+ let originalColumn = null;
+ let name = null;
+ if (seg.length !== 1) {
+ source = resolvedSources[seg[1]];
+ originalLine = seg[2] + 1;
+ originalColumn = seg[3];
+ }
+ if (seg.length === 5)
+ name = names[seg[4]];
+ cb({
+ generatedLine,
+ generatedColumn,
+ source,
+ originalLine,
+ originalColumn,
+ name,
+ });
+ }
+ }
+ };
+ exports.sourceContentFor = (map, source) => {
+ const { sources, resolvedSources, sourcesContent } = map;
+ if (sourcesContent == null)
+ return null;
+ let index = sources.indexOf(source);
+ if (index === -1)
+ index = resolvedSources.indexOf(source);
+ return index === -1 ? null : sourcesContent[index];
+ };
+ exports.presortedDecodedMap = (map, mapUrl) => {
+ const tracer = new TraceMap(clone(map, []), mapUrl);
+ tracer._decoded = map.mappings;
+ return tracer;
+ };
+ exports.decodedMap = (map) => {
+ return clone(map, exports.decodedMappings(map));
+ };
+ exports.encodedMap = (map) => {
+ return clone(map, exports.encodedMappings(map));
+ };
+ function generatedPosition(map, source, line, column, bias, all) {
+ line--;
+ if (line < 0)
+ throw new Error(LINE_GTR_ZERO);
+ if (column < 0)
+ throw new Error(COL_GTR_EQ_ZERO);
+ const { sources, resolvedSources } = map;
+ let sourceIndex = sources.indexOf(source);
+ if (sourceIndex === -1)
+ sourceIndex = resolvedSources.indexOf(source);
+ if (sourceIndex === -1)
+ return all ? [] : GMapping(null, null);
+ const generated = (map._bySources || (map._bySources = buildBySources(exports.decodedMappings(map), (map._bySourceMemos = sources.map(memoizedState)))));
+ const segments = generated[sourceIndex][line];
+ if (segments == null)
+ return all ? [] : GMapping(null, null);
+ const memo = map._bySourceMemos[sourceIndex];
+ if (all)
+ return sliceGeneratedPositions(segments, memo, line, column, bias);
+ const index = traceSegmentInternal(segments, memo, line, column, bias);
+ if (index === -1)
+ return GMapping(null, null);
+ const segment = segments[index];
+ return GMapping(segment[REV_GENERATED_LINE] + 1, segment[REV_GENERATED_COLUMN]);
+ }
+ })();
+ function clone(map, mappings) {
+ return {
+ version: map.version,
+ file: map.file,
+ names: map.names,
+ sourceRoot: map.sourceRoot,
+ sources: map.sources,
+ sourcesContent: map.sourcesContent,
+ mappings,
+ };
+ }
+ function OMapping(source, line, column, name) {
+ return { source, line, column, name };
+ }
+ function GMapping(line, column) {
+ return { line, column };
+ }
+ function traceSegmentInternal(segments, memo, line, column, bias) {
+ let index = memoizedBinarySearch(segments, column, memo, line);
+ if (found) {
+ index = (bias === LEAST_UPPER_BOUND ? upperBound : lowerBound)(segments, column, index);
+ }
+ else if (bias === LEAST_UPPER_BOUND)
+ index++;
+ if (index === -1 || index === segments.length)
+ return -1;
+ return index;
+ }
+ function sliceGeneratedPositions(segments, memo, line, column, bias) {
+ let min = traceSegmentInternal(segments, memo, line, column, GREATEST_LOWER_BOUND);
+ // We ignored the bias when tracing the segment so that we're guarnateed to find the first (in
+ // insertion order) segment that matched. Even if we did respect the bias when tracing, we would
+ // still need to call `lowerBound()` to find the first segment, which is slower than just looking
+ // for the GREATEST_LOWER_BOUND to begin with. The only difference that matters for us is when the
+ // binary search didn't match, in which case GREATEST_LOWER_BOUND just needs to increment to
+ // match LEAST_UPPER_BOUND.
+ if (!found && bias === LEAST_UPPER_BOUND)
+ min++;
+ if (min === -1 || min === segments.length)
+ return [];
+ // We may have found the segment that started at an earlier column. If this is the case, then we
+ // need to slice all generated segments that match _that_ column, because all such segments span
+ // to our desired column.
+ const matchedColumn = found ? column : segments[min][COLUMN];
+ // The binary search is not guaranteed to find the lower bound when a match wasn't found.
+ if (!found)
+ min = lowerBound(segments, matchedColumn, min);
+ const max = upperBound(segments, matchedColumn, min);
+ const result = [];
+ for (; min <= max; min++) {
+ const segment = segments[min];
+ result.push(GMapping(segment[REV_GENERATED_LINE] + 1, segment[REV_GENERATED_COLUMN]));
+ }
+ return result;
+ }
+
+ exports.AnyMap = AnyMap;
+ exports.GREATEST_LOWER_BOUND = GREATEST_LOWER_BOUND;
+ exports.LEAST_UPPER_BOUND = LEAST_UPPER_BOUND;
+ exports.TraceMap = TraceMap;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+ }));
+
+ } (traceMapping_umd, traceMapping_umd.exports));
+ return traceMapping_umd.exports;
+ }
+
+ var hasRequiredGenMapping_umd;
+
+ function requireGenMapping_umd () {
+ if (hasRequiredGenMapping_umd) return genMapping_umd.exports;
+ hasRequiredGenMapping_umd = 1;
+ (function (module, exports) {
+ (function (global, factory) {
+ factory(exports, requireSetArray_umd(), requireSourcemapCodec_umd(), requireTraceMapping_umd()) ;
+ })(commonjsGlobal, (function (exports, setArray, sourcemapCodec, traceMapping) {
+ const COLUMN = 0;
+ const SOURCES_INDEX = 1;
+ const SOURCE_LINE = 2;
+ const SOURCE_COLUMN = 3;
+ const NAMES_INDEX = 4;
+
+ const NO_NAME = -1;
+ /**
+ * A low-level API to associate a generated position with an original source position. Line and
+ * column here are 0-based, unlike `addMapping`.
+ */
+ exports.addSegment = void 0;
+ /**
+ * A high-level API to associate a generated position with an original source position. Line is
+ * 1-based, but column is 0-based, due to legacy behavior in `source-map` library.
+ */
+ exports.addMapping = void 0;
+ /**
+ * Same as `addSegment`, but will only add the segment if it generates useful information in the
+ * resulting map. This only works correctly if segments are added **in order**, meaning you should
+ * not add a segment with a lower generated line/column than one that came before.
+ */
+ exports.maybeAddSegment = void 0;
+ /**
+ * Same as `addMapping`, but will only add the mapping if it generates useful information in the
+ * resulting map. This only works correctly if mappings are added **in order**, meaning you should
+ * not add a mapping with a lower generated line/column than one that came before.
+ */
+ exports.maybeAddMapping = void 0;
+ /**
+ * Adds/removes the content of the source file to the source map.
+ */
+ exports.setSourceContent = void 0;
+ /**
+ * Returns a sourcemap object (with decoded mappings) suitable for passing to a library that expects
+ * a sourcemap, or to JSON.stringify.
+ */
+ exports.toDecodedMap = void 0;
+ /**
+ * Returns a sourcemap object (with encoded mappings) suitable for passing to a library that expects
+ * a sourcemap, or to JSON.stringify.
+ */
+ exports.toEncodedMap = void 0;
+ /**
+ * Constructs a new GenMapping, using the already present mappings of the input.
+ */
+ exports.fromMap = void 0;
+ /**
+ * Returns an array of high-level mapping objects for every recorded segment, which could then be
+ * passed to the `source-map` library.
+ */
+ exports.allMappings = void 0;
+ // This split declaration is only so that terser can elminiate the static initialization block.
+ let addSegmentInternal;
+ /**
+ * Provides the state to generate a sourcemap.
+ */
+ class GenMapping {
+ constructor({ file, sourceRoot } = {}) {
+ this._names = new setArray.SetArray();
+ this._sources = new setArray.SetArray();
+ this._sourcesContent = [];
+ this._mappings = [];
+ this.file = file;
+ this.sourceRoot = sourceRoot;
+ }
+ }
+ (() => {
+ exports.addSegment = (map, genLine, genColumn, source, sourceLine, sourceColumn, name, content) => {
+ return addSegmentInternal(false, map, genLine, genColumn, source, sourceLine, sourceColumn, name, content);
+ };
+ exports.maybeAddSegment = (map, genLine, genColumn, source, sourceLine, sourceColumn, name, content) => {
+ return addSegmentInternal(true, map, genLine, genColumn, source, sourceLine, sourceColumn, name, content);
+ };
+ exports.addMapping = (map, mapping) => {
+ return addMappingInternal(false, map, mapping);
+ };
+ exports.maybeAddMapping = (map, mapping) => {
+ return addMappingInternal(true, map, mapping);
+ };
+ exports.setSourceContent = (map, source, content) => {
+ const { _sources: sources, _sourcesContent: sourcesContent } = map;
+ sourcesContent[setArray.put(sources, source)] = content;
+ };
+ exports.toDecodedMap = (map) => {
+ const { file, sourceRoot, _mappings: mappings, _sources: sources, _sourcesContent: sourcesContent, _names: names, } = map;
+ removeEmptyFinalLines(mappings);
+ return {
+ version: 3,
+ file: file || undefined,
+ names: names.array,
+ sourceRoot: sourceRoot || undefined,
+ sources: sources.array,
+ sourcesContent,
+ mappings,
+ };
+ };
+ exports.toEncodedMap = (map) => {
+ const decoded = exports.toDecodedMap(map);
+ return Object.assign(Object.assign({}, decoded), { mappings: sourcemapCodec.encode(decoded.mappings) });
+ };
+ exports.allMappings = (map) => {
+ const out = [];
+ const { _mappings: mappings, _sources: sources, _names: names } = map;
+ for (let i = 0; i < mappings.length; i++) {
+ const line = mappings[i];
+ for (let j = 0; j < line.length; j++) {
+ const seg = line[j];
+ const generated = { line: i + 1, column: seg[COLUMN] };
+ let source = undefined;
+ let original = undefined;
+ let name = undefined;
+ if (seg.length !== 1) {
+ source = sources.array[seg[SOURCES_INDEX]];
+ original = { line: seg[SOURCE_LINE] + 1, column: seg[SOURCE_COLUMN] };
+ if (seg.length === 5)
+ name = names.array[seg[NAMES_INDEX]];
+ }
+ out.push({ generated, source, original, name });
+ }
+ }
+ return out;
+ };
+ exports.fromMap = (input) => {
+ const map = new traceMapping.TraceMap(input);
+ const gen = new GenMapping({ file: map.file, sourceRoot: map.sourceRoot });
+ putAll(gen._names, map.names);
+ putAll(gen._sources, map.sources);
+ gen._sourcesContent = map.sourcesContent || map.sources.map(() => null);
+ gen._mappings = traceMapping.decodedMappings(map);
+ return gen;
+ };
+ // Internal helpers
+ addSegmentInternal = (skipable, map, genLine, genColumn, source, sourceLine, sourceColumn, name, content) => {
+ const { _mappings: mappings, _sources: sources, _sourcesContent: sourcesContent, _names: names, } = map;
+ const line = getLine(mappings, genLine);
+ const index = getColumnIndex(line, genColumn);
+ if (!source) {
+ if (skipable && skipSourceless(line, index))
+ return;
+ return insert(line, index, [genColumn]);
+ }
+ const sourcesIndex = setArray.put(sources, source);
+ const namesIndex = name ? setArray.put(names, name) : NO_NAME;
+ if (sourcesIndex === sourcesContent.length)
+ sourcesContent[sourcesIndex] = content !== null && content !== void 0 ? content : null;
+ if (skipable && skipSource(line, index, sourcesIndex, sourceLine, sourceColumn, namesIndex)) {
+ return;
+ }
+ return insert(line, index, name
+ ? [genColumn, sourcesIndex, sourceLine, sourceColumn, namesIndex]
+ : [genColumn, sourcesIndex, sourceLine, sourceColumn]);
+ };
+ })();
+ function getLine(mappings, index) {
+ for (let i = mappings.length; i <= index; i++) {
+ mappings[i] = [];
+ }
+ return mappings[index];
+ }
+ function getColumnIndex(line, genColumn) {
+ let index = line.length;
+ for (let i = index - 1; i >= 0; index = i--) {
+ const current = line[i];
+ if (genColumn >= current[COLUMN])
+ break;
+ }
+ return index;
+ }
+ function insert(array, index, value) {
+ for (let i = array.length; i > index; i--) {
+ array[i] = array[i - 1];
+ }
+ array[index] = value;
+ }
+ function removeEmptyFinalLines(mappings) {
+ const { length } = mappings;
+ let len = length;
+ for (let i = len - 1; i >= 0; len = i, i--) {
+ if (mappings[i].length > 0)
+ break;
+ }
+ if (len < length)
+ mappings.length = len;
+ }
+ function putAll(strarr, array) {
+ for (let i = 0; i < array.length; i++)
+ setArray.put(strarr, array[i]);
+ }
+ function skipSourceless(line, index) {
+ // The start of a line is already sourceless, so adding a sourceless segment to the beginning
+ // doesn't generate any useful information.
+ if (index === 0)
+ return true;
+ const prev = line[index - 1];
+ // If the previous segment is also sourceless, then adding another sourceless segment doesn't
+ // genrate any new information. Else, this segment will end the source/named segment and point to
+ // a sourceless position, which is useful.
+ return prev.length === 1;
+ }
+ function skipSource(line, index, sourcesIndex, sourceLine, sourceColumn, namesIndex) {
+ // A source/named segment at the start of a line gives position at that genColumn
+ if (index === 0)
+ return false;
+ const prev = line[index - 1];
+ // If the previous segment is sourceless, then we're transitioning to a source.
+ if (prev.length === 1)
+ return false;
+ // If the previous segment maps to the exact same source position, then this segment doesn't
+ // provide any new position information.
+ return (sourcesIndex === prev[SOURCES_INDEX] &&
+ sourceLine === prev[SOURCE_LINE] &&
+ sourceColumn === prev[SOURCE_COLUMN] &&
+ namesIndex === (prev.length === 5 ? prev[NAMES_INDEX] : NO_NAME));
+ }
+ function addMappingInternal(skipable, map, mapping) {
+ const { generated, source, original, name, content } = mapping;
+ if (!source) {
+ return addSegmentInternal(skipable, map, generated.line - 1, generated.column, null, null, null, null, null);
+ }
+ const s = source;
+ return addSegmentInternal(skipable, map, generated.line - 1, generated.column, s, original.line - 1, original.column, name, content);
+ }
+
+ exports.GenMapping = GenMapping;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+ }));
+
+ } (genMapping_umd, genMapping_umd.exports));
+ return genMapping_umd.exports;
+ }
+
+ var hasRequiredSourceMap;
+
+ function requireSourceMap () {
+ if (hasRequiredSourceMap) return sourceMap;
+ hasRequiredSourceMap = 1;
+
+ Object.defineProperty(sourceMap, "__esModule", {
+ value: true
+ });
+ sourceMap.default = void 0;
+ var _genMapping = requireGenMapping_umd();
+ var _traceMapping = requireTraceMapping_umd();
+ class SourceMap {
+ constructor(opts, code) {
+ var _opts$sourceFileName;
+ this._map = void 0;
+ this._rawMappings = void 0;
+ this._sourceFileName = void 0;
+ this._lastGenLine = 0;
+ this._lastSourceLine = 0;
+ this._lastSourceColumn = 0;
+ this._inputMap = void 0;
+ const map = this._map = new _genMapping.GenMapping({
+ sourceRoot: opts.sourceRoot
+ });
+ this._sourceFileName = (_opts$sourceFileName = opts.sourceFileName) == null ? void 0 : _opts$sourceFileName.replace(/\\/g, "/");
+ this._rawMappings = undefined;
+ if (opts.inputSourceMap) {
+ this._inputMap = new _traceMapping.TraceMap(opts.inputSourceMap);
+ const resolvedSources = this._inputMap.resolvedSources;
+ if (resolvedSources.length) {
+ for (let i = 0; i < resolvedSources.length; i++) {
+ var _this$_inputMap$sourc;
+ (0, _genMapping.setSourceContent)(map, resolvedSources[i], (_this$_inputMap$sourc = this._inputMap.sourcesContent) == null ? void 0 : _this$_inputMap$sourc[i]);
+ }
+ }
+ }
+ if (typeof code === "string" && !opts.inputSourceMap) {
+ (0, _genMapping.setSourceContent)(map, this._sourceFileName, code);
+ } else if (typeof code === "object") {
+ for (const sourceFileName of Object.keys(code)) {
+ (0, _genMapping.setSourceContent)(map, sourceFileName.replace(/\\/g, "/"), code[sourceFileName]);
+ }
+ }
+ }
+ get() {
+ return (0, _genMapping.toEncodedMap)(this._map);
+ }
+ getDecoded() {
+ return (0, _genMapping.toDecodedMap)(this._map);
+ }
+ getRawMappings() {
+ return this._rawMappings || (this._rawMappings = (0, _genMapping.allMappings)(this._map));
+ }
+ mark(generated, line, column, identifierName, identifierNamePos, filename) {
+ var _originalMapping;
+ this._rawMappings = undefined;
+ let originalMapping;
+ if (line != null) {
+ if (this._inputMap) {
+ originalMapping = (0, _traceMapping.originalPositionFor)(this._inputMap, {
+ line,
+ column
+ });
+ if (!originalMapping.name && identifierNamePos) {
+ const originalIdentifierMapping = (0, _traceMapping.originalPositionFor)(this._inputMap, identifierNamePos);
+ if (originalIdentifierMapping.name) {
+ identifierName = originalIdentifierMapping.name;
+ }
+ }
+ } else {
+ originalMapping = {
+ source: (filename == null ? void 0 : filename.replace(/\\/g, "/")) || this._sourceFileName,
+ line: line,
+ column: column
+ };
+ }
+ }
+ (0, _genMapping.maybeAddMapping)(this._map, {
+ name: identifierName,
+ generated,
+ source: (_originalMapping = originalMapping) == null ? void 0 : _originalMapping.source,
+ original: originalMapping
+ });
+ }
+ }
+ sourceMap.default = SourceMap;
+
+
+ return sourceMap;
+ }
+
+ var printer = {};
+
+ var buffer = {};
+
+ var hasRequiredBuffer;
+
+ function requireBuffer () {
+ if (hasRequiredBuffer) return buffer;
+ hasRequiredBuffer = 1;
+
+ Object.defineProperty(buffer, "__esModule", {
+ value: true
+ });
+ buffer.default = void 0;
+ class Buffer {
+ constructor(map) {
+ this._map = null;
+ this._buf = "";
+ this._str = "";
+ this._appendCount = 0;
+ this._last = 0;
+ this._queue = [];
+ this._queueCursor = 0;
+ this._canMarkIdName = true;
+ this._position = {
+ line: 1,
+ column: 0
+ };
+ this._sourcePosition = {
+ identifierName: undefined,
+ identifierNamePos: undefined,
+ line: undefined,
+ column: undefined,
+ filename: undefined
+ };
+ this._map = map;
+ this._allocQueue();
+ }
+ _allocQueue() {
+ const queue = this._queue;
+ for (let i = 0; i < 16; i++) {
+ queue.push({
+ char: 0,
+ repeat: 1,
+ line: undefined,
+ column: undefined,
+ identifierName: undefined,
+ identifierNamePos: undefined,
+ filename: ""
+ });
+ }
+ }
+ _pushQueue(char, repeat, line, column, filename) {
+ const cursor = this._queueCursor;
+ if (cursor === this._queue.length) {
+ this._allocQueue();
+ }
+ const item = this._queue[cursor];
+ item.char = char;
+ item.repeat = repeat;
+ item.line = line;
+ item.column = column;
+ item.filename = filename;
+ this._queueCursor++;
+ }
+ _popQueue() {
+ if (this._queueCursor === 0) {
+ throw new Error("Cannot pop from empty queue");
+ }
+ return this._queue[--this._queueCursor];
+ }
+ get() {
+ this._flush();
+ const map = this._map;
+ const result = {
+ code: (this._buf + this._str).trimRight(),
+ decodedMap: map == null ? void 0 : map.getDecoded(),
+ get __mergedMap() {
+ return this.map;
+ },
+ get map() {
+ const resultMap = map ? map.get() : null;
+ result.map = resultMap;
+ return resultMap;
+ },
+ set map(value) {
+ Object.defineProperty(result, "map", {
+ value,
+ writable: true
+ });
+ },
+ get rawMappings() {
+ const mappings = map == null ? void 0 : map.getRawMappings();
+ result.rawMappings = mappings;
+ return mappings;
+ },
+ set rawMappings(value) {
+ Object.defineProperty(result, "rawMappings", {
+ value,
+ writable: true
+ });
+ }
+ };
+ return result;
+ }
+ append(str, maybeNewline) {
+ this._flush();
+ this._append(str, this._sourcePosition, maybeNewline);
+ }
+ appendChar(char) {
+ this._flush();
+ this._appendChar(char, 1, this._sourcePosition);
+ }
+ queue(char) {
+ if (char === 10) {
+ while (this._queueCursor !== 0) {
+ const char = this._queue[this._queueCursor - 1].char;
+ if (char !== 32 && char !== 9) {
+ break;
+ }
+ this._queueCursor--;
+ }
+ }
+ const sourcePosition = this._sourcePosition;
+ this._pushQueue(char, 1, sourcePosition.line, sourcePosition.column, sourcePosition.filename);
+ }
+ queueIndentation(char, repeat) {
+ this._pushQueue(char, repeat, undefined, undefined, undefined);
+ }
+ _flush() {
+ const queueCursor = this._queueCursor;
+ const queue = this._queue;
+ for (let i = 0; i < queueCursor; i++) {
+ const item = queue[i];
+ this._appendChar(item.char, item.repeat, item);
+ }
+ this._queueCursor = 0;
+ }
+ _appendChar(char, repeat, sourcePos) {
+ this._last = char;
+ this._str += repeat > 1 ? String.fromCharCode(char).repeat(repeat) : String.fromCharCode(char);
+ if (char !== 10) {
+ this._mark(sourcePos.line, sourcePos.column, sourcePos.identifierName, sourcePos.identifierNamePos, sourcePos.filename);
+ this._position.column += repeat;
+ } else {
+ this._position.line++;
+ this._position.column = 0;
+ }
+ if (this._canMarkIdName) {
+ sourcePos.identifierName = undefined;
+ sourcePos.identifierNamePos = undefined;
+ }
+ }
+ _append(str, sourcePos, maybeNewline) {
+ const len = str.length;
+ const position = this._position;
+ this._last = str.charCodeAt(len - 1);
+ if (++this._appendCount > 4096) {
+ +this._str;
+ this._buf += this._str;
+ this._str = str;
+ this._appendCount = 0;
+ } else {
+ this._str += str;
+ }
+ if (!maybeNewline && !this._map) {
+ position.column += len;
+ return;
+ }
+ const {
+ column,
+ identifierName,
+ identifierNamePos,
+ filename
+ } = sourcePos;
+ let line = sourcePos.line;
+ if ((identifierName != null || identifierNamePos != null) && this._canMarkIdName) {
+ sourcePos.identifierName = undefined;
+ sourcePos.identifierNamePos = undefined;
+ }
+ let i = str.indexOf("\n");
+ let last = 0;
+ if (i !== 0) {
+ this._mark(line, column, identifierName, identifierNamePos, filename);
+ }
+ while (i !== -1) {
+ position.line++;
+ position.column = 0;
+ last = i + 1;
+ if (last < len && line !== undefined) {
+ this._mark(++line, 0, null, null, filename);
+ }
+ i = str.indexOf("\n", last);
+ }
+ position.column += len - last;
+ }
+ _mark(line, column, identifierName, identifierNamePos, filename) {
+ var _this$_map;
+ (_this$_map = this._map) == null ? void 0 : _this$_map.mark(this._position, line, column, identifierName, identifierNamePos, filename);
+ }
+ removeTrailingNewline() {
+ const queueCursor = this._queueCursor;
+ if (queueCursor !== 0 && this._queue[queueCursor - 1].char === 10) {
+ this._queueCursor--;
+ }
+ }
+ removeLastSemicolon() {
+ const queueCursor = this._queueCursor;
+ if (queueCursor !== 0 && this._queue[queueCursor - 1].char === 59) {
+ this._queueCursor--;
+ }
+ }
+ getLastChar() {
+ const queueCursor = this._queueCursor;
+ return queueCursor !== 0 ? this._queue[queueCursor - 1].char : this._last;
+ }
+ getNewlineCount() {
+ const queueCursor = this._queueCursor;
+ let count = 0;
+ if (queueCursor === 0) return this._last === 10 ? 1 : 0;
+ for (let i = queueCursor - 1; i >= 0; i--) {
+ if (this._queue[i].char !== 10) {
+ break;
+ }
+ count++;
+ }
+ return count === queueCursor && this._last === 10 ? count + 1 : count;
+ }
+ endsWithCharAndNewline() {
+ const queue = this._queue;
+ const queueCursor = this._queueCursor;
+ if (queueCursor !== 0) {
+ const lastCp = queue[queueCursor - 1].char;
+ if (lastCp !== 10) return;
+ if (queueCursor > 1) {
+ return queue[queueCursor - 2].char;
+ } else {
+ return this._last;
+ }
+ }
+ }
+ hasContent() {
+ return this._queueCursor !== 0 || !!this._last;
+ }
+ exactSource(loc, cb) {
+ if (!this._map) {
+ cb();
+ return;
+ }
+ this.source("start", loc);
+ const identifierName = loc.identifierName;
+ const sourcePos = this._sourcePosition;
+ if (identifierName) {
+ this._canMarkIdName = false;
+ sourcePos.identifierName = identifierName;
+ }
+ cb();
+ if (identifierName) {
+ this._canMarkIdName = true;
+ sourcePos.identifierName = undefined;
+ sourcePos.identifierNamePos = undefined;
+ }
+ this.source("end", loc);
+ }
+ source(prop, loc) {
+ if (!this._map) return;
+ this._normalizePosition(prop, loc, 0);
+ }
+ sourceWithOffset(prop, loc, columnOffset) {
+ if (!this._map) return;
+ this._normalizePosition(prop, loc, columnOffset);
+ }
+ withSource(prop, loc, cb) {
+ if (this._map) {
+ this.source(prop, loc);
+ }
+ cb();
+ }
+ _normalizePosition(prop, loc, columnOffset) {
+ const pos = loc[prop];
+ const target = this._sourcePosition;
+ if (pos) {
+ target.line = pos.line;
+ target.column = Math.max(pos.column + columnOffset, 0);
+ target.filename = loc.filename;
+ }
+ }
+ getCurrentColumn() {
+ const queue = this._queue;
+ const queueCursor = this._queueCursor;
+ let lastIndex = -1;
+ let len = 0;
+ for (let i = 0; i < queueCursor; i++) {
+ const item = queue[i];
+ if (item.char === 10) {
+ lastIndex = len;
+ }
+ len += item.repeat;
+ }
+ return lastIndex === -1 ? this._position.column + len : len - 1 - lastIndex;
+ }
+ getCurrentLine() {
+ let count = 0;
+ const queue = this._queue;
+ for (let i = 0; i < this._queueCursor; i++) {
+ if (queue[i].char === 10) {
+ count++;
+ }
+ }
+ return this._position.line + count;
+ }
+ }
+ buffer.default = Buffer;
+
+
+ return buffer;
+ }
+
+ var node = {};
+
+ var whitespace = {};
+
+ var hasRequiredWhitespace;
+
+ function requireWhitespace () {
+ if (hasRequiredWhitespace) return whitespace;
+ hasRequiredWhitespace = 1;
+
+ Object.defineProperty(whitespace, "__esModule", {
+ value: true
+ });
+ whitespace.nodes = void 0;
+ var _t = requireLib$2();
+ const {
+ FLIPPED_ALIAS_KEYS,
+ isArrayExpression,
+ isAssignmentExpression,
+ isBinary,
+ isBlockStatement,
+ isCallExpression,
+ isFunction,
+ isIdentifier,
+ isLiteral,
+ isMemberExpression,
+ isObjectExpression,
+ isOptionalCallExpression,
+ isOptionalMemberExpression,
+ isStringLiteral
+ } = _t;
+ function crawlInternal(node, state) {
+ if (!node) return state;
+ if (isMemberExpression(node) || isOptionalMemberExpression(node)) {
+ crawlInternal(node.object, state);
+ if (node.computed) crawlInternal(node.property, state);
+ } else if (isBinary(node) || isAssignmentExpression(node)) {
+ crawlInternal(node.left, state);
+ crawlInternal(node.right, state);
+ } else if (isCallExpression(node) || isOptionalCallExpression(node)) {
+ state.hasCall = true;
+ crawlInternal(node.callee, state);
+ } else if (isFunction(node)) {
+ state.hasFunction = true;
+ } else if (isIdentifier(node)) {
+ state.hasHelper = state.hasHelper || node.callee && isHelper(node.callee);
+ }
+ return state;
+ }
+ function crawl(node) {
+ return crawlInternal(node, {
+ hasCall: false,
+ hasFunction: false,
+ hasHelper: false
+ });
+ }
+ function isHelper(node) {
+ if (!node) return false;
+ if (isMemberExpression(node)) {
+ return isHelper(node.object) || isHelper(node.property);
+ } else if (isIdentifier(node)) {
+ return node.name === "require" || node.name.charCodeAt(0) === 95;
+ } else if (isCallExpression(node)) {
+ return isHelper(node.callee);
+ } else if (isBinary(node) || isAssignmentExpression(node)) {
+ return isIdentifier(node.left) && isHelper(node.left) || isHelper(node.right);
+ } else {
+ return false;
+ }
+ }
+ function isType(node) {
+ return isLiteral(node) || isObjectExpression(node) || isArrayExpression(node) || isIdentifier(node) || isMemberExpression(node);
+ }
+ const nodes = {
+ AssignmentExpression(node) {
+ const state = crawl(node.right);
+ if (state.hasCall && state.hasHelper || state.hasFunction) {
+ return state.hasFunction ? 1 | 2 : 2;
+ }
+ },
+ SwitchCase(node, parent) {
+ return (!!node.consequent.length || parent.cases[0] === node ? 1 : 0) | (!node.consequent.length && parent.cases[parent.cases.length - 1] === node ? 2 : 0);
+ },
+ LogicalExpression(node) {
+ if (isFunction(node.left) || isFunction(node.right)) {
+ return 2;
+ }
+ },
+ Literal(node) {
+ if (isStringLiteral(node) && node.value === "use strict") {
+ return 2;
+ }
+ },
+ CallExpression(node) {
+ if (isFunction(node.callee) || isHelper(node)) {
+ return 1 | 2;
+ }
+ },
+ OptionalCallExpression(node) {
+ if (isFunction(node.callee)) {
+ return 1 | 2;
+ }
+ },
+ VariableDeclaration(node) {
+ for (let i = 0; i < node.declarations.length; i++) {
+ const declar = node.declarations[i];
+ let enabled = isHelper(declar.id) && !isType(declar.init);
+ if (!enabled && declar.init) {
+ const state = crawl(declar.init);
+ enabled = isHelper(declar.init) && state.hasCall || state.hasFunction;
+ }
+ if (enabled) {
+ return 1 | 2;
+ }
+ }
+ },
+ IfStatement(node) {
+ if (isBlockStatement(node.consequent)) {
+ return 1 | 2;
+ }
+ }
+ };
+ whitespace.nodes = nodes;
+ nodes.ObjectProperty = nodes.ObjectTypeProperty = nodes.ObjectMethod = function (node, parent) {
+ if (parent.properties[0] === node) {
+ return 1;
+ }
+ };
+ nodes.ObjectTypeCallProperty = function (node, parent) {
+ var _parent$properties;
+ if (parent.callProperties[0] === node && !((_parent$properties = parent.properties) != null && _parent$properties.length)) {
+ return 1;
+ }
+ };
+ nodes.ObjectTypeIndexer = function (node, parent) {
+ var _parent$properties2, _parent$callPropertie;
+ if (parent.indexers[0] === node && !((_parent$properties2 = parent.properties) != null && _parent$properties2.length) && !((_parent$callPropertie = parent.callProperties) != null && _parent$callPropertie.length)) {
+ return 1;
+ }
+ };
+ nodes.ObjectTypeInternalSlot = function (node, parent) {
+ var _parent$properties3, _parent$callPropertie2, _parent$indexers;
+ if (parent.internalSlots[0] === node && !((_parent$properties3 = parent.properties) != null && _parent$properties3.length) && !((_parent$callPropertie2 = parent.callProperties) != null && _parent$callPropertie2.length) && !((_parent$indexers = parent.indexers) != null && _parent$indexers.length)) {
+ return 1;
+ }
+ };
+ [["Function", true], ["Class", true], ["Loop", true], ["LabeledStatement", true], ["SwitchStatement", true], ["TryStatement", true]].forEach(function ([type, amounts]) {
+ [type].concat(FLIPPED_ALIAS_KEYS[type] || []).forEach(function (type) {
+ const ret = amounts ? 1 | 2 : 0;
+ nodes[type] = () => ret;
+ });
+ });
+
+
+ return whitespace;
+ }
+
+ var parentheses = {};
+
+ var hasRequiredParentheses;
+
+ function requireParentheses () {
+ if (hasRequiredParentheses) return parentheses;
+ hasRequiredParentheses = 1;
+
+ Object.defineProperty(parentheses, "__esModule", {
+ value: true
+ });
+ parentheses.ArrowFunctionExpression = ArrowFunctionExpression;
+ parentheses.AssignmentExpression = AssignmentExpression;
+ parentheses.Binary = Binary;
+ parentheses.BinaryExpression = BinaryExpression;
+ parentheses.ClassExpression = ClassExpression;
+ parentheses.ConditionalExpression = ConditionalExpression;
+ parentheses.DoExpression = DoExpression;
+ parentheses.FunctionExpression = FunctionExpression;
+ parentheses.FunctionTypeAnnotation = FunctionTypeAnnotation;
+ parentheses.Identifier = Identifier;
+ parentheses.LogicalExpression = LogicalExpression;
+ parentheses.NullableTypeAnnotation = NullableTypeAnnotation;
+ parentheses.ObjectExpression = ObjectExpression;
+ parentheses.OptionalIndexedAccessType = OptionalIndexedAccessType;
+ parentheses.OptionalCallExpression = parentheses.OptionalMemberExpression = OptionalMemberExpression;
+ parentheses.SequenceExpression = SequenceExpression;
+ parentheses.TSTypeAssertion = parentheses.TSSatisfiesExpression = parentheses.TSAsExpression = TSAsExpression;
+ parentheses.TSInferType = TSInferType;
+ parentheses.TSInstantiationExpression = TSInstantiationExpression;
+ parentheses.TSIntersectionType = parentheses.TSUnionType = TSUnionType;
+ parentheses.UnaryLike = UnaryLike;
+ parentheses.IntersectionTypeAnnotation = parentheses.UnionTypeAnnotation = UnionTypeAnnotation;
+ parentheses.UpdateExpression = UpdateExpression;
+ parentheses.AwaitExpression = parentheses.YieldExpression = YieldExpression;
+ var _t = requireLib$2();
+ const {
+ isArrayTypeAnnotation,
+ isArrowFunctionExpression,
+ isAssignmentExpression,
+ isAwaitExpression,
+ isBinary,
+ isBinaryExpression,
+ isUpdateExpression,
+ isCallExpression,
+ isClass,
+ isClassExpression,
+ isConditional,
+ isConditionalExpression,
+ isExportDeclaration,
+ isExportDefaultDeclaration,
+ isExpressionStatement,
+ isFor,
+ isForInStatement,
+ isForOfStatement,
+ isForStatement,
+ isFunctionExpression,
+ isIfStatement,
+ isIndexedAccessType,
+ isIntersectionTypeAnnotation,
+ isLogicalExpression,
+ isMemberExpression,
+ isNewExpression,
+ isNullableTypeAnnotation,
+ isObjectPattern,
+ isOptionalCallExpression,
+ isOptionalMemberExpression,
+ isReturnStatement,
+ isSequenceExpression,
+ isSwitchStatement,
+ isTSArrayType,
+ isTSAsExpression,
+ isTSInstantiationExpression,
+ isTSIntersectionType,
+ isTSNonNullExpression,
+ isTSOptionalType,
+ isTSRestType,
+ isTSTypeAssertion,
+ isTSUnionType,
+ isTaggedTemplateExpression,
+ isThrowStatement,
+ isTypeAnnotation,
+ isUnaryLike,
+ isUnionTypeAnnotation,
+ isVariableDeclarator,
+ isWhileStatement,
+ isYieldExpression,
+ isTSSatisfiesExpression
+ } = _t;
+ const PRECEDENCE = {
+ "||": 0,
+ "??": 0,
+ "|>": 0,
+ "&&": 1,
+ "|": 2,
+ "^": 3,
+ "&": 4,
+ "==": 5,
+ "===": 5,
+ "!=": 5,
+ "!==": 5,
+ "<": 6,
+ ">": 6,
+ "<=": 6,
+ ">=": 6,
+ in: 6,
+ instanceof: 6,
+ ">>": 7,
+ "<<": 7,
+ ">>>": 7,
+ "+": 8,
+ "-": 8,
+ "*": 9,
+ "/": 9,
+ "%": 9,
+ "**": 10
+ };
+ function isTSTypeExpression(node) {
+ return isTSAsExpression(node) || isTSSatisfiesExpression(node) || isTSTypeAssertion(node);
+ }
+ const isClassExtendsClause = (node, parent) => isClass(parent, {
+ superClass: node
+ });
+ const hasPostfixPart = (node, parent) => (isMemberExpression(parent) || isOptionalMemberExpression(parent)) && parent.object === node || (isCallExpression(parent) || isOptionalCallExpression(parent) || isNewExpression(parent)) && parent.callee === node || isTaggedTemplateExpression(parent) && parent.tag === node || isTSNonNullExpression(parent);
+ function NullableTypeAnnotation(node, parent) {
+ return isArrayTypeAnnotation(parent);
+ }
+ function FunctionTypeAnnotation(node, parent, printStack) {
+ if (printStack.length < 3) return;
+ return isUnionTypeAnnotation(parent) || isIntersectionTypeAnnotation(parent) || isArrayTypeAnnotation(parent) || isTypeAnnotation(parent) && isArrowFunctionExpression(printStack[printStack.length - 3]);
+ }
+ function UpdateExpression(node, parent) {
+ return hasPostfixPart(node, parent) || isClassExtendsClause(node, parent);
+ }
+ function ObjectExpression(node, parent, printStack) {
+ return isFirstInContext(printStack, 1 | 2);
+ }
+ function DoExpression(node, parent, printStack) {
+ return !node.async && isFirstInContext(printStack, 1);
+ }
+ function Binary(node, parent) {
+ if (node.operator === "**" && isBinaryExpression(parent, {
+ operator: "**"
+ })) {
+ return parent.left === node;
+ }
+ if (isClassExtendsClause(node, parent)) {
+ return true;
+ }
+ if (hasPostfixPart(node, parent) || isUnaryLike(parent) || isAwaitExpression(parent)) {
+ return true;
+ }
+ if (isBinary(parent)) {
+ const parentOp = parent.operator;
+ const parentPos = PRECEDENCE[parentOp];
+ const nodeOp = node.operator;
+ const nodePos = PRECEDENCE[nodeOp];
+ if (parentPos === nodePos && parent.right === node && !isLogicalExpression(parent) || parentPos > nodePos) {
+ return true;
+ }
+ }
+ }
+ function UnionTypeAnnotation(node, parent) {
+ return isArrayTypeAnnotation(parent) || isNullableTypeAnnotation(parent) || isIntersectionTypeAnnotation(parent) || isUnionTypeAnnotation(parent);
+ }
+ function OptionalIndexedAccessType(node, parent) {
+ return isIndexedAccessType(parent, {
+ objectType: node
+ });
+ }
+ function TSAsExpression() {
+ return true;
+ }
+ function TSUnionType(node, parent) {
+ return isTSArrayType(parent) || isTSOptionalType(parent) || isTSIntersectionType(parent) || isTSUnionType(parent) || isTSRestType(parent);
+ }
+ function TSInferType(node, parent) {
+ return isTSArrayType(parent) || isTSOptionalType(parent);
+ }
+ function TSInstantiationExpression(node, parent) {
+ return (isCallExpression(parent) || isOptionalCallExpression(parent) || isNewExpression(parent) || isTSInstantiationExpression(parent)) && !!parent.typeParameters;
+ }
+ function BinaryExpression(node, parent) {
+ return node.operator === "in" && (isVariableDeclarator(parent) || isFor(parent));
+ }
+ function SequenceExpression(node, parent) {
+ if (isForStatement(parent) || isThrowStatement(parent) || isReturnStatement(parent) || isIfStatement(parent) && parent.test === node || isWhileStatement(parent) && parent.test === node || isForInStatement(parent) && parent.right === node || isSwitchStatement(parent) && parent.discriminant === node || isExpressionStatement(parent) && parent.expression === node) {
+ return false;
+ }
+ return true;
+ }
+ function YieldExpression(node, parent) {
+ return isBinary(parent) || isUnaryLike(parent) || hasPostfixPart(node, parent) || isAwaitExpression(parent) && isYieldExpression(node) || isConditionalExpression(parent) && node === parent.test || isClassExtendsClause(node, parent);
+ }
+ function ClassExpression(node, parent, printStack) {
+ return isFirstInContext(printStack, 1 | 4);
+ }
+ function UnaryLike(node, parent) {
+ return hasPostfixPart(node, parent) || isBinaryExpression(parent, {
+ operator: "**",
+ left: node
+ }) || isClassExtendsClause(node, parent);
+ }
+ function FunctionExpression(node, parent, printStack) {
+ return isFirstInContext(printStack, 1 | 4);
+ }
+ function ArrowFunctionExpression(node, parent) {
+ return isExportDeclaration(parent) || ConditionalExpression(node, parent);
+ }
+ function ConditionalExpression(node, parent) {
+ if (isUnaryLike(parent) || isBinary(parent) || isConditionalExpression(parent, {
+ test: node
+ }) || isAwaitExpression(parent) || isTSTypeExpression(parent)) {
+ return true;
+ }
+ return UnaryLike(node, parent);
+ }
+ function OptionalMemberExpression(node, parent) {
+ return isCallExpression(parent, {
+ callee: node
+ }) || isMemberExpression(parent, {
+ object: node
+ });
+ }
+ function AssignmentExpression(node, parent) {
+ if (isObjectPattern(node.left)) {
+ return true;
+ } else {
+ return ConditionalExpression(node, parent);
+ }
+ }
+ function LogicalExpression(node, parent) {
+ if (isTSTypeExpression(parent)) return true;
+ switch (node.operator) {
+ case "||":
+ if (!isLogicalExpression(parent)) return false;
+ return parent.operator === "??" || parent.operator === "&&";
+ case "&&":
+ return isLogicalExpression(parent, {
+ operator: "??"
+ });
+ case "??":
+ return isLogicalExpression(parent) && parent.operator !== "??";
+ }
+ }
+ function Identifier(node, parent, printStack) {
+ var _node$extra;
+ if ((_node$extra = node.extra) != null && _node$extra.parenthesized && isAssignmentExpression(parent, {
+ left: node
+ }) && (isFunctionExpression(parent.right) || isClassExpression(parent.right)) && parent.right.id == null) {
+ return true;
+ }
+ if (node.name === "let") {
+ const isFollowedByBracket = isMemberExpression(parent, {
+ object: node,
+ computed: true
+ }) || isOptionalMemberExpression(parent, {
+ object: node,
+ computed: true,
+ optional: false
+ });
+ return isFirstInContext(printStack, isFollowedByBracket ? 1 | 8 | 16 | 32 : 32);
+ }
+ return node.name === "async" && isForOfStatement(parent) && node === parent.left;
+ }
+ function isFirstInContext(printStack, checkParam) {
+ const expressionStatement = checkParam & 1;
+ const arrowBody = checkParam & 2;
+ const exportDefault = checkParam & 4;
+ const forHead = checkParam & 8;
+ const forInHead = checkParam & 16;
+ const forOfHead = checkParam & 32;
+ let i = printStack.length - 1;
+ if (i <= 0) return;
+ let node = printStack[i];
+ i--;
+ let parent = printStack[i];
+ while (i >= 0) {
+ if (expressionStatement && isExpressionStatement(parent, {
+ expression: node
+ }) || exportDefault && isExportDefaultDeclaration(parent, {
+ declaration: node
+ }) || arrowBody && isArrowFunctionExpression(parent, {
+ body: node
+ }) || forHead && isForStatement(parent, {
+ init: node
+ }) || forInHead && isForInStatement(parent, {
+ left: node
+ }) || forOfHead && isForOfStatement(parent, {
+ left: node
+ })) {
+ return true;
+ }
+ if (i > 0 && (hasPostfixPart(node, parent) && !isNewExpression(parent) || isSequenceExpression(parent) && parent.expressions[0] === node || isUpdateExpression(parent) && !parent.prefix || isConditional(parent, {
+ test: node
+ }) || isBinary(parent, {
+ left: node
+ }) || isAssignmentExpression(parent, {
+ left: node
+ }))) {
+ node = parent;
+ i--;
+ parent = printStack[i];
+ } else {
+ return false;
+ }
+ }
+ return false;
+ }
+
+
+ return parentheses;
+ }
+
+ var hasRequiredNode;
+
+ function requireNode () {
+ if (hasRequiredNode) return node;
+ hasRequiredNode = 1;
+
+ Object.defineProperty(node, "__esModule", {
+ value: true
+ });
+ node.needsParens = needsParens;
+ node.needsWhitespace = needsWhitespace;
+ node.needsWhitespaceAfter = needsWhitespaceAfter;
+ node.needsWhitespaceBefore = needsWhitespaceBefore;
+ var whitespace = requireWhitespace();
+ var parens = requireParentheses();
+ var _t = requireLib$2();
+ const {
+ FLIPPED_ALIAS_KEYS,
+ isCallExpression,
+ isExpressionStatement,
+ isMemberExpression,
+ isNewExpression
+ } = _t;
+ function expandAliases(obj) {
+ const newObj = {};
+ function add(type, func) {
+ const fn = newObj[type];
+ newObj[type] = fn ? function (node, parent, stack) {
+ const result = fn(node, parent, stack);
+ return result == null ? func(node, parent, stack) : result;
+ } : func;
+ }
+ for (const type of Object.keys(obj)) {
+ const aliases = FLIPPED_ALIAS_KEYS[type];
+ if (aliases) {
+ for (const alias of aliases) {
+ add(alias, obj[type]);
+ }
+ } else {
+ add(type, obj[type]);
+ }
+ }
+ return newObj;
+ }
+ const expandedParens = expandAliases(parens);
+ const expandedWhitespaceNodes = expandAliases(whitespace.nodes);
+ function find(obj, node, parent, printStack) {
+ const fn = obj[node.type];
+ return fn ? fn(node, parent, printStack) : null;
+ }
+ function isOrHasCallExpression(node) {
+ if (isCallExpression(node)) {
+ return true;
+ }
+ return isMemberExpression(node) && isOrHasCallExpression(node.object);
+ }
+ function needsWhitespace(node, parent, type) {
+ if (!node) return false;
+ if (isExpressionStatement(node)) {
+ node = node.expression;
+ }
+ const flag = find(expandedWhitespaceNodes, node, parent);
+ if (typeof flag === "number") {
+ return (flag & type) !== 0;
+ }
+ return false;
+ }
+ function needsWhitespaceBefore(node, parent) {
+ return needsWhitespace(node, parent, 1);
+ }
+ function needsWhitespaceAfter(node, parent) {
+ return needsWhitespace(node, parent, 2);
+ }
+ function needsParens(node, parent, printStack) {
+ if (!parent) return false;
+ if (isNewExpression(parent) && parent.callee === node) {
+ if (isOrHasCallExpression(node)) return true;
+ }
+ return find(expandedParens, node, parent, printStack);
+ }
+
+
+ return node;
+ }
+
+ var generators = {};
+
+ var templateLiterals = {};
+
+ var hasRequiredTemplateLiterals;
+
+ function requireTemplateLiterals () {
+ if (hasRequiredTemplateLiterals) return templateLiterals;
+ hasRequiredTemplateLiterals = 1;
+
+ Object.defineProperty(templateLiterals, "__esModule", {
+ value: true
+ });
+ templateLiterals.TaggedTemplateExpression = TaggedTemplateExpression;
+ templateLiterals.TemplateElement = TemplateElement;
+ templateLiterals.TemplateLiteral = TemplateLiteral;
+ function TaggedTemplateExpression(node) {
+ this.print(node.tag, node);
+ this.print(node.typeParameters, node);
+ this.print(node.quasi, node);
+ }
+ function TemplateElement(node, parent) {
+ const isFirst = parent.quasis[0] === node;
+ const isLast = parent.quasis[parent.quasis.length - 1] === node;
+ const value = (isFirst ? "`" : "}") + node.value.raw + (isLast ? "`" : "${");
+ this.token(value, true);
+ }
+ function TemplateLiteral(node) {
+ const quasis = node.quasis;
+ for (let i = 0; i < quasis.length; i++) {
+ this.print(quasis[i], node);
+ if (i + 1 < quasis.length) {
+ this.print(node.expressions[i], node);
+ }
+ }
+ }
+
+
+ return templateLiterals;
+ }
+
+ var expressions = {};
+
+ var hasRequiredExpressions;
+
+ function requireExpressions () {
+ if (hasRequiredExpressions) return expressions;
+ hasRequiredExpressions = 1;
+
+ Object.defineProperty(expressions, "__esModule", {
+ value: true
+ });
+ expressions.LogicalExpression = expressions.BinaryExpression = expressions.AssignmentExpression = AssignmentExpression;
+ expressions.AssignmentPattern = AssignmentPattern;
+ expressions.AwaitExpression = AwaitExpression;
+ expressions.BindExpression = BindExpression;
+ expressions.CallExpression = CallExpression;
+ expressions.ConditionalExpression = ConditionalExpression;
+ expressions.Decorator = Decorator;
+ expressions.DoExpression = DoExpression;
+ expressions.EmptyStatement = EmptyStatement;
+ expressions.ExpressionStatement = ExpressionStatement;
+ expressions.Import = Import;
+ expressions.MemberExpression = MemberExpression;
+ expressions.MetaProperty = MetaProperty;
+ expressions.ModuleExpression = ModuleExpression;
+ expressions.NewExpression = NewExpression;
+ expressions.OptionalCallExpression = OptionalCallExpression;
+ expressions.OptionalMemberExpression = OptionalMemberExpression;
+ expressions.ParenthesizedExpression = ParenthesizedExpression;
+ expressions.PrivateName = PrivateName;
+ expressions.SequenceExpression = SequenceExpression;
+ expressions.Super = Super;
+ expressions.ThisExpression = ThisExpression;
+ expressions.UnaryExpression = UnaryExpression;
+ expressions.UpdateExpression = UpdateExpression;
+ expressions.V8IntrinsicIdentifier = V8IntrinsicIdentifier;
+ expressions.YieldExpression = YieldExpression;
+ expressions._shouldPrintDecoratorsBeforeExport = _shouldPrintDecoratorsBeforeExport;
+ var _t = requireLib$2();
+ var n = requireNode();
+ const {
+ isCallExpression,
+ isLiteral,
+ isMemberExpression,
+ isNewExpression
+ } = _t;
+ function UnaryExpression(node) {
+ const {
+ operator
+ } = node;
+ if (operator === "void" || operator === "delete" || operator === "typeof" || operator === "throw") {
+ this.word(operator);
+ this.space();
+ } else {
+ this.token(operator);
+ }
+ this.print(node.argument, node);
+ }
+ function DoExpression(node) {
+ if (node.async) {
+ this.word("async", true);
+ this.space();
+ }
+ this.word("do");
+ this.space();
+ this.print(node.body, node);
+ }
+ function ParenthesizedExpression(node) {
+ this.tokenChar(40);
+ this.print(node.expression, node);
+ this.rightParens(node);
+ }
+ function UpdateExpression(node) {
+ if (node.prefix) {
+ this.token(node.operator);
+ this.print(node.argument, node);
+ } else {
+ this.printTerminatorless(node.argument, node, true);
+ this.token(node.operator);
+ }
+ }
+ function ConditionalExpression(node) {
+ this.print(node.test, node);
+ this.space();
+ this.tokenChar(63);
+ this.space();
+ this.print(node.consequent, node);
+ this.space();
+ this.tokenChar(58);
+ this.space();
+ this.print(node.alternate, node);
+ }
+ function NewExpression(node, parent) {
+ this.word("new");
+ this.space();
+ this.print(node.callee, node);
+ if (this.format.minified && node.arguments.length === 0 && !node.optional && !isCallExpression(parent, {
+ callee: node
+ }) && !isMemberExpression(parent) && !isNewExpression(parent)) {
+ return;
+ }
+ this.print(node.typeArguments, node);
+ this.print(node.typeParameters, node);
+ if (node.optional) {
+ this.token("?.");
+ }
+ this.tokenChar(40);
+ this.printList(node.arguments, node);
+ this.rightParens(node);
+ }
+ function SequenceExpression(node) {
+ this.printList(node.expressions, node);
+ }
+ function ThisExpression() {
+ this.word("this");
+ }
+ function Super() {
+ this.word("super");
+ }
+ function isDecoratorMemberExpression(node) {
+ switch (node.type) {
+ case "Identifier":
+ return true;
+ case "MemberExpression":
+ return !node.computed && node.property.type === "Identifier" && isDecoratorMemberExpression(node.object);
+ default:
+ return false;
+ }
+ }
+ function shouldParenthesizeDecoratorExpression(node) {
+ if (node.type === "ParenthesizedExpression") {
+ return false;
+ }
+ return !isDecoratorMemberExpression(node.type === "CallExpression" ? node.callee : node);
+ }
+ function _shouldPrintDecoratorsBeforeExport(node) {
+ if (typeof this.format.decoratorsBeforeExport === "boolean") {
+ return this.format.decoratorsBeforeExport;
+ }
+ return typeof node.start === "number" && node.start === node.declaration.start;
+ }
+ function Decorator(node) {
+ this.tokenChar(64);
+ const {
+ expression
+ } = node;
+ if (shouldParenthesizeDecoratorExpression(expression)) {
+ this.tokenChar(40);
+ this.print(expression, node);
+ this.tokenChar(41);
+ } else {
+ this.print(expression, node);
+ }
+ this.newline();
+ }
+ function OptionalMemberExpression(node) {
+ let {
+ computed
+ } = node;
+ const {
+ optional,
+ property
+ } = node;
+ this.print(node.object, node);
+ if (!computed && isMemberExpression(property)) {
+ throw new TypeError("Got a MemberExpression for MemberExpression property");
+ }
+ if (isLiteral(property) && typeof property.value === "number") {
+ computed = true;
+ }
+ if (optional) {
+ this.token("?.");
+ }
+ if (computed) {
+ this.tokenChar(91);
+ this.print(property, node);
+ this.tokenChar(93);
+ } else {
+ if (!optional) {
+ this.tokenChar(46);
+ }
+ this.print(property, node);
+ }
+ }
+ function OptionalCallExpression(node) {
+ this.print(node.callee, node);
+ this.print(node.typeParameters, node);
+ if (node.optional) {
+ this.token("?.");
+ }
+ this.print(node.typeArguments, node);
+ this.tokenChar(40);
+ this.printList(node.arguments, node);
+ this.rightParens(node);
+ }
+ function CallExpression(node) {
+ this.print(node.callee, node);
+ this.print(node.typeArguments, node);
+ this.print(node.typeParameters, node);
+ this.tokenChar(40);
+ this.printList(node.arguments, node);
+ this.rightParens(node);
+ }
+ function Import() {
+ this.word("import");
+ }
+ function AwaitExpression(node) {
+ this.word("await");
+ if (node.argument) {
+ this.space();
+ this.printTerminatorless(node.argument, node, false);
+ }
+ }
+ function YieldExpression(node) {
+ this.word("yield", true);
+ if (node.delegate) {
+ this.tokenChar(42);
+ if (node.argument) {
+ this.space();
+ this.print(node.argument, node);
+ }
+ } else {
+ if (node.argument) {
+ this.space();
+ this.printTerminatorless(node.argument, node, false);
+ }
+ }
+ }
+ function EmptyStatement() {
+ this.semicolon(true);
+ }
+ function ExpressionStatement(node) {
+ this.print(node.expression, node);
+ this.semicolon();
+ }
+ function AssignmentPattern(node) {
+ this.print(node.left, node);
+ if (node.left.optional) this.tokenChar(63);
+ this.print(node.left.typeAnnotation, node);
+ this.space();
+ this.tokenChar(61);
+ this.space();
+ this.print(node.right, node);
+ }
+ function AssignmentExpression(node, parent) {
+ const parens = this.inForStatementInitCounter && node.operator === "in" && !n.needsParens(node, parent);
+ if (parens) {
+ this.tokenChar(40);
+ }
+ this.print(node.left, node);
+ this.space();
+ if (node.operator === "in" || node.operator === "instanceof") {
+ this.word(node.operator);
+ } else {
+ this.token(node.operator);
+ }
+ this.space();
+ this.print(node.right, node);
+ if (parens) {
+ this.tokenChar(41);
+ }
+ }
+ function BindExpression(node) {
+ this.print(node.object, node);
+ this.token("::");
+ this.print(node.callee, node);
+ }
+ function MemberExpression(node) {
+ this.print(node.object, node);
+ if (!node.computed && isMemberExpression(node.property)) {
+ throw new TypeError("Got a MemberExpression for MemberExpression property");
+ }
+ let computed = node.computed;
+ if (isLiteral(node.property) && typeof node.property.value === "number") {
+ computed = true;
+ }
+ if (computed) {
+ this.tokenChar(91);
+ this.print(node.property, node);
+ this.tokenChar(93);
+ } else {
+ this.tokenChar(46);
+ this.print(node.property, node);
+ }
+ }
+ function MetaProperty(node) {
+ this.print(node.meta, node);
+ this.tokenChar(46);
+ this.print(node.property, node);
+ }
+ function PrivateName(node) {
+ this.tokenChar(35);
+ this.print(node.id, node);
+ }
+ function V8IntrinsicIdentifier(node) {
+ this.tokenChar(37);
+ this.word(node.name);
+ }
+ function ModuleExpression(node) {
+ this.word("module", true);
+ this.space();
+ this.tokenChar(123);
+ this.indent();
+ const {
+ body
+ } = node;
+ if (body.body.length || body.directives.length) {
+ this.newline();
+ }
+ this.print(body, node);
+ this.dedent();
+ this.rightBrace(node);
+ }
+
+
+ return expressions;
+ }
+
+ var statements = {};
+
+ var hasRequiredStatements;
+
+ function requireStatements () {
+ if (hasRequiredStatements) return statements;
+ hasRequiredStatements = 1;
+
+ Object.defineProperty(statements, "__esModule", {
+ value: true
+ });
+ statements.BreakStatement = BreakStatement;
+ statements.CatchClause = CatchClause;
+ statements.ContinueStatement = ContinueStatement;
+ statements.DebuggerStatement = DebuggerStatement;
+ statements.DoWhileStatement = DoWhileStatement;
+ statements.ForOfStatement = statements.ForInStatement = void 0;
+ statements.ForStatement = ForStatement;
+ statements.IfStatement = IfStatement;
+ statements.LabeledStatement = LabeledStatement;
+ statements.ReturnStatement = ReturnStatement;
+ statements.SwitchCase = SwitchCase;
+ statements.SwitchStatement = SwitchStatement;
+ statements.ThrowStatement = ThrowStatement;
+ statements.TryStatement = TryStatement;
+ statements.VariableDeclaration = VariableDeclaration;
+ statements.VariableDeclarator = VariableDeclarator;
+ statements.WhileStatement = WhileStatement;
+ statements.WithStatement = WithStatement;
+ var _t = requireLib$2();
+ const {
+ isFor,
+ isForStatement,
+ isIfStatement,
+ isStatement
+ } = _t;
+ function WithStatement(node) {
+ this.word("with");
+ this.space();
+ this.tokenChar(40);
+ this.print(node.object, node);
+ this.tokenChar(41);
+ this.printBlock(node);
+ }
+ function IfStatement(node) {
+ this.word("if");
+ this.space();
+ this.tokenChar(40);
+ this.print(node.test, node);
+ this.tokenChar(41);
+ this.space();
+ const needsBlock = node.alternate && isIfStatement(getLastStatement(node.consequent));
+ if (needsBlock) {
+ this.tokenChar(123);
+ this.newline();
+ this.indent();
+ }
+ this.printAndIndentOnComments(node.consequent, node);
+ if (needsBlock) {
+ this.dedent();
+ this.newline();
+ this.tokenChar(125);
+ }
+ if (node.alternate) {
+ if (this.endsWith(125)) this.space();
+ this.word("else");
+ this.space();
+ this.printAndIndentOnComments(node.alternate, node);
+ }
+ }
+ function getLastStatement(statement) {
+ const {
+ body
+ } = statement;
+ if (isStatement(body) === false) {
+ return statement;
+ }
+ return getLastStatement(body);
+ }
+ function ForStatement(node) {
+ this.word("for");
+ this.space();
+ this.tokenChar(40);
+ this.inForStatementInitCounter++;
+ this.print(node.init, node);
+ this.inForStatementInitCounter--;
+ this.tokenChar(59);
+ if (node.test) {
+ this.space();
+ this.print(node.test, node);
+ }
+ this.tokenChar(59);
+ if (node.update) {
+ this.space();
+ this.print(node.update, node);
+ }
+ this.tokenChar(41);
+ this.printBlock(node);
+ }
+ function WhileStatement(node) {
+ this.word("while");
+ this.space();
+ this.tokenChar(40);
+ this.print(node.test, node);
+ this.tokenChar(41);
+ this.printBlock(node);
+ }
+ function ForXStatement(node) {
+ this.word("for");
+ this.space();
+ const isForOf = node.type === "ForOfStatement";
+ if (isForOf && node.await) {
+ this.word("await");
+ this.space();
+ }
+ this.noIndentInnerCommentsHere();
+ this.tokenChar(40);
+ this.print(node.left, node);
+ this.space();
+ this.word(isForOf ? "of" : "in");
+ this.space();
+ this.print(node.right, node);
+ this.tokenChar(41);
+ this.printBlock(node);
+ }
+ const ForInStatement = ForXStatement;
+ statements.ForInStatement = ForInStatement;
+ const ForOfStatement = ForXStatement;
+ statements.ForOfStatement = ForOfStatement;
+ function DoWhileStatement(node) {
+ this.word("do");
+ this.space();
+ this.print(node.body, node);
+ this.space();
+ this.word("while");
+ this.space();
+ this.tokenChar(40);
+ this.print(node.test, node);
+ this.tokenChar(41);
+ this.semicolon();
+ }
+ function printStatementAfterKeyword(printer, node, parent, isLabel) {
+ if (node) {
+ printer.space();
+ printer.printTerminatorless(node, parent, isLabel);
+ }
+ printer.semicolon();
+ }
+ function BreakStatement(node) {
+ this.word("break");
+ printStatementAfterKeyword(this, node.label, node, true);
+ }
+ function ContinueStatement(node) {
+ this.word("continue");
+ printStatementAfterKeyword(this, node.label, node, true);
+ }
+ function ReturnStatement(node) {
+ this.word("return");
+ printStatementAfterKeyword(this, node.argument, node, false);
+ }
+ function ThrowStatement(node) {
+ this.word("throw");
+ printStatementAfterKeyword(this, node.argument, node, false);
+ }
+ function LabeledStatement(node) {
+ this.print(node.label, node);
+ this.tokenChar(58);
+ this.space();
+ this.print(node.body, node);
+ }
+ function TryStatement(node) {
+ this.word("try");
+ this.space();
+ this.print(node.block, node);
+ this.space();
+ if (node.handlers) {
+ this.print(node.handlers[0], node);
+ } else {
+ this.print(node.handler, node);
+ }
+ if (node.finalizer) {
+ this.space();
+ this.word("finally");
+ this.space();
+ this.print(node.finalizer, node);
+ }
+ }
+ function CatchClause(node) {
+ this.word("catch");
+ this.space();
+ if (node.param) {
+ this.tokenChar(40);
+ this.print(node.param, node);
+ this.print(node.param.typeAnnotation, node);
+ this.tokenChar(41);
+ this.space();
+ }
+ this.print(node.body, node);
+ }
+ function SwitchStatement(node) {
+ this.word("switch");
+ this.space();
+ this.tokenChar(40);
+ this.print(node.discriminant, node);
+ this.tokenChar(41);
+ this.space();
+ this.tokenChar(123);
+ this.printSequence(node.cases, node, {
+ indent: true,
+ addNewlines(leading, cas) {
+ if (!leading && node.cases[node.cases.length - 1] === cas) return -1;
+ }
+ });
+ this.rightBrace(node);
+ }
+ function SwitchCase(node) {
+ if (node.test) {
+ this.word("case");
+ this.space();
+ this.print(node.test, node);
+ this.tokenChar(58);
+ } else {
+ this.word("default");
+ this.tokenChar(58);
+ }
+ if (node.consequent.length) {
+ this.newline();
+ this.printSequence(node.consequent, node, {
+ indent: true
+ });
+ }
+ }
+ function DebuggerStatement() {
+ this.word("debugger");
+ this.semicolon();
+ }
+ function VariableDeclaration(node, parent) {
+ if (node.declare) {
+ this.word("declare");
+ this.space();
+ }
+ const {
+ kind
+ } = node;
+ this.word(kind, kind === "using" || kind === "await using");
+ this.space();
+ let hasInits = false;
+ if (!isFor(parent)) {
+ for (const declar of node.declarations) {
+ if (declar.init) {
+ hasInits = true;
+ }
+ }
+ }
+ this.printList(node.declarations, node, {
+ separator: hasInits ? function () {
+ this.tokenChar(44);
+ this.newline();
+ } : undefined,
+ indent: node.declarations.length > 1 ? true : false
+ });
+ if (isFor(parent)) {
+ if (isForStatement(parent)) {
+ if (parent.init === node) return;
+ } else {
+ if (parent.left === node) return;
+ }
+ }
+ this.semicolon();
+ }
+ function VariableDeclarator(node) {
+ this.print(node.id, node);
+ if (node.definite) this.tokenChar(33);
+ this.print(node.id.typeAnnotation, node);
+ if (node.init) {
+ this.space();
+ this.tokenChar(61);
+ this.space();
+ this.print(node.init, node);
+ }
+ }
+
+
+ return statements;
+ }
+
+ var classes = {};
+
+ var hasRequiredClasses;
+
+ function requireClasses () {
+ if (hasRequiredClasses) return classes;
+ hasRequiredClasses = 1;
+
+ Object.defineProperty(classes, "__esModule", {
+ value: true
+ });
+ classes.ClassAccessorProperty = ClassAccessorProperty;
+ classes.ClassBody = ClassBody;
+ classes.ClassExpression = classes.ClassDeclaration = ClassDeclaration;
+ classes.ClassMethod = ClassMethod;
+ classes.ClassPrivateMethod = ClassPrivateMethod;
+ classes.ClassPrivateProperty = ClassPrivateProperty;
+ classes.ClassProperty = ClassProperty;
+ classes.StaticBlock = StaticBlock;
+ classes._classMethodHead = _classMethodHead;
+ var _t = requireLib$2();
+ const {
+ isExportDefaultDeclaration,
+ isExportNamedDeclaration
+ } = _t;
+ function ClassDeclaration(node, parent) {
+ const inExport = isExportDefaultDeclaration(parent) || isExportNamedDeclaration(parent);
+ if (!inExport || !this._shouldPrintDecoratorsBeforeExport(parent)) {
+ this.printJoin(node.decorators, node);
+ }
+ if (node.declare) {
+ this.word("declare");
+ this.space();
+ }
+ if (node.abstract) {
+ this.word("abstract");
+ this.space();
+ }
+ this.word("class");
+ if (node.id) {
+ this.space();
+ this.print(node.id, node);
+ }
+ this.print(node.typeParameters, node);
+ if (node.superClass) {
+ this.space();
+ this.word("extends");
+ this.space();
+ this.print(node.superClass, node);
+ this.print(node.superTypeParameters, node);
+ }
+ if (node.implements) {
+ this.space();
+ this.word("implements");
+ this.space();
+ this.printList(node.implements, node);
+ }
+ this.space();
+ this.print(node.body, node);
+ }
+ function ClassBody(node) {
+ this.tokenChar(123);
+ if (node.body.length === 0) {
+ this.tokenChar(125);
+ } else {
+ this.newline();
+ this.printSequence(node.body, node, {
+ indent: true
+ });
+ if (!this.endsWith(10)) this.newline();
+ this.rightBrace(node);
+ }
+ }
+ function ClassProperty(node) {
+ var _node$key$loc;
+ this.printJoin(node.decorators, node);
+ const endLine = (_node$key$loc = node.key.loc) == null || (_node$key$loc = _node$key$loc.end) == null ? void 0 : _node$key$loc.line;
+ if (endLine) this.catchUp(endLine);
+ this.tsPrintClassMemberModifiers(node);
+ if (node.computed) {
+ this.tokenChar(91);
+ this.print(node.key, node);
+ this.tokenChar(93);
+ } else {
+ this._variance(node);
+ this.print(node.key, node);
+ }
+ if (node.optional) {
+ this.tokenChar(63);
+ }
+ if (node.definite) {
+ this.tokenChar(33);
+ }
+ this.print(node.typeAnnotation, node);
+ if (node.value) {
+ this.space();
+ this.tokenChar(61);
+ this.space();
+ this.print(node.value, node);
+ }
+ this.semicolon();
+ }
+ function ClassAccessorProperty(node) {
+ var _node$key$loc2;
+ this.printJoin(node.decorators, node);
+ const endLine = (_node$key$loc2 = node.key.loc) == null || (_node$key$loc2 = _node$key$loc2.end) == null ? void 0 : _node$key$loc2.line;
+ if (endLine) this.catchUp(endLine);
+ this.tsPrintClassMemberModifiers(node);
+ this.word("accessor", true);
+ this.space();
+ if (node.computed) {
+ this.tokenChar(91);
+ this.print(node.key, node);
+ this.tokenChar(93);
+ } else {
+ this._variance(node);
+ this.print(node.key, node);
+ }
+ if (node.optional) {
+ this.tokenChar(63);
+ }
+ if (node.definite) {
+ this.tokenChar(33);
+ }
+ this.print(node.typeAnnotation, node);
+ if (node.value) {
+ this.space();
+ this.tokenChar(61);
+ this.space();
+ this.print(node.value, node);
+ }
+ this.semicolon();
+ }
+ function ClassPrivateProperty(node) {
+ this.printJoin(node.decorators, node);
+ if (node.static) {
+ this.word("static");
+ this.space();
+ }
+ this.print(node.key, node);
+ this.print(node.typeAnnotation, node);
+ if (node.value) {
+ this.space();
+ this.tokenChar(61);
+ this.space();
+ this.print(node.value, node);
+ }
+ this.semicolon();
+ }
+ function ClassMethod(node) {
+ this._classMethodHead(node);
+ this.space();
+ this.print(node.body, node);
+ }
+ function ClassPrivateMethod(node) {
+ this._classMethodHead(node);
+ this.space();
+ this.print(node.body, node);
+ }
+ function _classMethodHead(node) {
+ var _node$key$loc3;
+ this.printJoin(node.decorators, node);
+ const endLine = (_node$key$loc3 = node.key.loc) == null || (_node$key$loc3 = _node$key$loc3.end) == null ? void 0 : _node$key$loc3.line;
+ if (endLine) this.catchUp(endLine);
+ this.tsPrintClassMemberModifiers(node);
+ this._methodHead(node);
+ }
+ function StaticBlock(node) {
+ this.word("static");
+ this.space();
+ this.tokenChar(123);
+ if (node.body.length === 0) {
+ this.tokenChar(125);
+ } else {
+ this.newline();
+ this.printSequence(node.body, node, {
+ indent: true
+ });
+ this.rightBrace(node);
+ }
+ }
+
+
+ return classes;
+ }
+
+ var methods = {};
+
+ var hasRequiredMethods;
+
+ function requireMethods () {
+ if (hasRequiredMethods) return methods;
+ hasRequiredMethods = 1;
+
+ Object.defineProperty(methods, "__esModule", {
+ value: true
+ });
+ methods.ArrowFunctionExpression = ArrowFunctionExpression;
+ methods.FunctionDeclaration = methods.FunctionExpression = FunctionExpression;
+ methods._functionHead = _functionHead;
+ methods._methodHead = _methodHead;
+ methods._param = _param;
+ methods._parameters = _parameters;
+ methods._params = _params;
+ methods._predicate = _predicate;
+ var _t = requireLib$2();
+ const {
+ isIdentifier
+ } = _t;
+ function _params(node, idNode, parentNode) {
+ this.print(node.typeParameters, node);
+ const nameInfo = _getFuncIdName.call(this, idNode, parentNode);
+ if (nameInfo) {
+ this.sourceIdentifierName(nameInfo.name, nameInfo.pos);
+ }
+ this.tokenChar(40);
+ this._parameters(node.params, node);
+ this.tokenChar(41);
+ const noLineTerminator = node.type === "ArrowFunctionExpression";
+ this.print(node.returnType, node, noLineTerminator);
+ this._noLineTerminator = noLineTerminator;
+ }
+ function _parameters(parameters, parent) {
+ const paramLength = parameters.length;
+ for (let i = 0; i < paramLength; i++) {
+ this._param(parameters[i], parent);
+ if (i < parameters.length - 1) {
+ this.tokenChar(44);
+ this.space();
+ }
+ }
+ }
+ function _param(parameter, parent) {
+ this.printJoin(parameter.decorators, parameter);
+ this.print(parameter, parent);
+ if (parameter.optional) {
+ this.tokenChar(63);
+ }
+ this.print(parameter.typeAnnotation, parameter);
+ }
+ function _methodHead(node) {
+ const kind = node.kind;
+ const key = node.key;
+ if (kind === "get" || kind === "set") {
+ this.word(kind);
+ this.space();
+ }
+ if (node.async) {
+ this.word("async", true);
+ this.space();
+ }
+ if (kind === "method" || kind === "init") {
+ if (node.generator) {
+ this.tokenChar(42);
+ }
+ }
+ if (node.computed) {
+ this.tokenChar(91);
+ this.print(key, node);
+ this.tokenChar(93);
+ } else {
+ this.print(key, node);
+ }
+ if (node.optional) {
+ this.tokenChar(63);
+ }
+ this._params(node, node.computed && node.key.type !== "StringLiteral" ? undefined : node.key, undefined);
+ }
+ function _predicate(node, noLineTerminatorAfter) {
+ if (node.predicate) {
+ if (!node.returnType) {
+ this.tokenChar(58);
+ }
+ this.space();
+ this.print(node.predicate, node, noLineTerminatorAfter);
+ }
+ }
+ function _functionHead(node, parent) {
+ if (node.async) {
+ this.word("async");
+ this._endsWithInnerRaw = false;
+ this.space();
+ }
+ this.word("function");
+ if (node.generator) {
+ this._endsWithInnerRaw = false;
+ this.tokenChar(42);
+ }
+ this.space();
+ if (node.id) {
+ this.print(node.id, node);
+ }
+ this._params(node, node.id, parent);
+ if (node.type !== "TSDeclareFunction") {
+ this._predicate(node);
+ }
+ }
+ function FunctionExpression(node, parent) {
+ this._functionHead(node, parent);
+ this.space();
+ this.print(node.body, node);
+ }
+ function ArrowFunctionExpression(node, parent) {
+ if (node.async) {
+ this.word("async", true);
+ this.space();
+ }
+ let firstParam;
+ if (!this.format.retainLines && node.params.length === 1 && isIdentifier(firstParam = node.params[0]) && !hasTypesOrComments(node, firstParam)) {
+ this.print(firstParam, node, true);
+ } else {
+ this._params(node, undefined, parent);
+ }
+ this._predicate(node, true);
+ this.space();
+ this.printInnerComments();
+ this.token("=>");
+ this.space();
+ this.print(node.body, node);
+ }
+ function hasTypesOrComments(node, param) {
+ var _param$leadingComment, _param$trailingCommen;
+ return !!(node.typeParameters || node.returnType || node.predicate || param.typeAnnotation || param.optional || (_param$leadingComment = param.leadingComments) != null && _param$leadingComment.length || (_param$trailingCommen = param.trailingComments) != null && _param$trailingCommen.length);
+ }
+ function _getFuncIdName(idNode, parent) {
+ let id = idNode;
+ if (!id && parent) {
+ const parentType = parent.type;
+ if (parentType === "VariableDeclarator") {
+ id = parent.id;
+ } else if (parentType === "AssignmentExpression" || parentType === "AssignmentPattern") {
+ id = parent.left;
+ } else if (parentType === "ObjectProperty" || parentType === "ClassProperty") {
+ if (!parent.computed || parent.key.type === "StringLiteral") {
+ id = parent.key;
+ }
+ } else if (parentType === "ClassPrivateProperty" || parentType === "ClassAccessorProperty") {
+ id = parent.key;
+ }
+ }
+ if (!id) return;
+ let nameInfo;
+ if (id.type === "Identifier") {
+ var _id$loc, _id$loc2;
+ nameInfo = {
+ pos: (_id$loc = id.loc) == null ? void 0 : _id$loc.start,
+ name: ((_id$loc2 = id.loc) == null ? void 0 : _id$loc2.identifierName) || id.name
+ };
+ } else if (id.type === "PrivateName") {
+ var _id$loc3;
+ nameInfo = {
+ pos: (_id$loc3 = id.loc) == null ? void 0 : _id$loc3.start,
+ name: "#" + id.id.name
+ };
+ } else if (id.type === "StringLiteral") {
+ var _id$loc4;
+ nameInfo = {
+ pos: (_id$loc4 = id.loc) == null ? void 0 : _id$loc4.start,
+ name: id.value
+ };
+ }
+ return nameInfo;
+ }
+
+
+ return methods;
+ }
+
+ var modules = {};
+
+ var hasRequiredModules;
+
+ function requireModules () {
+ if (hasRequiredModules) return modules;
+ hasRequiredModules = 1;
+
+ Object.defineProperty(modules, "__esModule", {
+ value: true
+ });
+ modules.ExportAllDeclaration = ExportAllDeclaration;
+ modules.ExportDefaultDeclaration = ExportDefaultDeclaration;
+ modules.ExportDefaultSpecifier = ExportDefaultSpecifier;
+ modules.ExportNamedDeclaration = ExportNamedDeclaration;
+ modules.ExportNamespaceSpecifier = ExportNamespaceSpecifier;
+ modules.ExportSpecifier = ExportSpecifier;
+ modules.ImportAttribute = ImportAttribute;
+ modules.ImportDeclaration = ImportDeclaration;
+ modules.ImportDefaultSpecifier = ImportDefaultSpecifier;
+ modules.ImportExpression = ImportExpression;
+ modules.ImportNamespaceSpecifier = ImportNamespaceSpecifier;
+ modules.ImportSpecifier = ImportSpecifier;
+ modules._printAttributes = _printAttributes;
+ var _t = requireLib$2();
+ const {
+ isClassDeclaration,
+ isExportDefaultSpecifier,
+ isExportNamespaceSpecifier,
+ isImportDefaultSpecifier,
+ isImportNamespaceSpecifier,
+ isStatement
+ } = _t;
+ function ImportSpecifier(node) {
+ if (node.importKind === "type" || node.importKind === "typeof") {
+ this.word(node.importKind);
+ this.space();
+ }
+ this.print(node.imported, node);
+ if (node.local && node.local.name !== node.imported.name) {
+ this.space();
+ this.word("as");
+ this.space();
+ this.print(node.local, node);
+ }
+ }
+ function ImportDefaultSpecifier(node) {
+ this.print(node.local, node);
+ }
+ function ExportDefaultSpecifier(node) {
+ this.print(node.exported, node);
+ }
+ function ExportSpecifier(node) {
+ if (node.exportKind === "type") {
+ this.word("type");
+ this.space();
+ }
+ this.print(node.local, node);
+ if (node.exported && node.local.name !== node.exported.name) {
+ this.space();
+ this.word("as");
+ this.space();
+ this.print(node.exported, node);
+ }
+ }
+ function ExportNamespaceSpecifier(node) {
+ this.tokenChar(42);
+ this.space();
+ this.word("as");
+ this.space();
+ this.print(node.exported, node);
+ }
+ let warningShown = false;
+ function _printAttributes(node) {
+ const {
+ importAttributesKeyword
+ } = this.format;
+ const {
+ attributes,
+ assertions
+ } = node;
+ if (attributes && !importAttributesKeyword && !warningShown) {
+ warningShown = true;
+ console.warn(`\
+You are using import attributes, without specifying the desired output syntax.
+Please specify the "importAttributesKeyword" generator option, whose value can be one of:
+ - "with" : \`import { a } from "b" with { type: "json" };\`
+ - "assert" : \`import { a } from "b" assert { type: "json" };\`
+ - "with-legacy" : \`import { a } from "b" with type: "json";\`
+`);
+ }
+ const useAssertKeyword = importAttributesKeyword === "assert" || !importAttributesKeyword && assertions;
+ this.word(useAssertKeyword ? "assert" : "with");
+ this.space();
+ if (!useAssertKeyword && importAttributesKeyword !== "with") {
+ this.printList(attributes || assertions, node);
+ return;
+ }
+ this.tokenChar(123);
+ this.space();
+ this.printList(attributes || assertions, node);
+ this.space();
+ this.tokenChar(125);
+ }
+ function ExportAllDeclaration(node) {
+ var _node$attributes, _node$assertions;
+ this.word("export");
+ this.space();
+ if (node.exportKind === "type") {
+ this.word("type");
+ this.space();
+ }
+ this.tokenChar(42);
+ this.space();
+ this.word("from");
+ this.space();
+ if ((_node$attributes = node.attributes) != null && _node$attributes.length || (_node$assertions = node.assertions) != null && _node$assertions.length) {
+ this.print(node.source, node, true);
+ this.space();
+ this._printAttributes(node);
+ } else {
+ this.print(node.source, node);
+ }
+ this.semicolon();
+ }
+ function maybePrintDecoratorsBeforeExport(printer, node) {
+ if (isClassDeclaration(node.declaration) && printer._shouldPrintDecoratorsBeforeExport(node)) {
+ printer.printJoin(node.declaration.decorators, node);
+ }
+ }
+ function ExportNamedDeclaration(node) {
+ maybePrintDecoratorsBeforeExport(this, node);
+ this.word("export");
+ this.space();
+ if (node.declaration) {
+ const declar = node.declaration;
+ this.print(declar, node);
+ if (!isStatement(declar)) this.semicolon();
+ } else {
+ if (node.exportKind === "type") {
+ this.word("type");
+ this.space();
+ }
+ const specifiers = node.specifiers.slice(0);
+ let hasSpecial = false;
+ for (;;) {
+ const first = specifiers[0];
+ if (isExportDefaultSpecifier(first) || isExportNamespaceSpecifier(first)) {
+ hasSpecial = true;
+ this.print(specifiers.shift(), node);
+ if (specifiers.length) {
+ this.tokenChar(44);
+ this.space();
+ }
+ } else {
+ break;
+ }
+ }
+ if (specifiers.length || !specifiers.length && !hasSpecial) {
+ this.tokenChar(123);
+ if (specifiers.length) {
+ this.space();
+ this.printList(specifiers, node);
+ this.space();
+ }
+ this.tokenChar(125);
+ }
+ if (node.source) {
+ var _node$attributes2, _node$assertions2;
+ this.space();
+ this.word("from");
+ this.space();
+ if ((_node$attributes2 = node.attributes) != null && _node$attributes2.length || (_node$assertions2 = node.assertions) != null && _node$assertions2.length) {
+ this.print(node.source, node, true);
+ this.space();
+ this._printAttributes(node);
+ } else {
+ this.print(node.source, node);
+ }
+ }
+ this.semicolon();
+ }
+ }
+ function ExportDefaultDeclaration(node) {
+ maybePrintDecoratorsBeforeExport(this, node);
+ this.word("export");
+ this.noIndentInnerCommentsHere();
+ this.space();
+ this.word("default");
+ this.space();
+ const declar = node.declaration;
+ this.print(declar, node);
+ if (!isStatement(declar)) this.semicolon();
+ }
+ function ImportDeclaration(node) {
+ var _node$attributes3, _node$assertions3;
+ this.word("import");
+ this.space();
+ const isTypeKind = node.importKind === "type" || node.importKind === "typeof";
+ if (isTypeKind) {
+ this.noIndentInnerCommentsHere();
+ this.word(node.importKind);
+ this.space();
+ } else if (node.module) {
+ this.noIndentInnerCommentsHere();
+ this.word("module");
+ this.space();
+ } else if (node.phase) {
+ this.noIndentInnerCommentsHere();
+ this.word(node.phase);
+ this.space();
+ }
+ const specifiers = node.specifiers.slice(0);
+ const hasSpecifiers = !!specifiers.length;
+ while (hasSpecifiers) {
+ const first = specifiers[0];
+ if (isImportDefaultSpecifier(first) || isImportNamespaceSpecifier(first)) {
+ this.print(specifiers.shift(), node);
+ if (specifiers.length) {
+ this.tokenChar(44);
+ this.space();
+ }
+ } else {
+ break;
+ }
+ }
+ if (specifiers.length) {
+ this.tokenChar(123);
+ this.space();
+ this.printList(specifiers, node);
+ this.space();
+ this.tokenChar(125);
+ } else if (isTypeKind && !hasSpecifiers) {
+ this.tokenChar(123);
+ this.tokenChar(125);
+ }
+ if (hasSpecifiers || isTypeKind) {
+ this.space();
+ this.word("from");
+ this.space();
+ }
+ if ((_node$attributes3 = node.attributes) != null && _node$attributes3.length || (_node$assertions3 = node.assertions) != null && _node$assertions3.length) {
+ this.print(node.source, node, true);
+ this.space();
+ this._printAttributes(node);
+ } else {
+ this.print(node.source, node);
+ }
+ this.semicolon();
+ }
+ function ImportAttribute(node) {
+ this.print(node.key);
+ this.tokenChar(58);
+ this.space();
+ this.print(node.value);
+ }
+ function ImportNamespaceSpecifier(node) {
+ this.tokenChar(42);
+ this.space();
+ this.word("as");
+ this.space();
+ this.print(node.local, node);
+ }
+ function ImportExpression(node) {
+ this.word("import");
+ if (node.phase) {
+ this.tokenChar(46);
+ this.word(node.phase);
+ }
+ this.tokenChar(40);
+ this.print(node.source, node);
+ if (node.options != null) {
+ this.tokenChar(44);
+ this.space();
+ this.print(node.options, node);
+ }
+ this.tokenChar(41);
+ }
+
+
+ return modules;
+ }
+
+ var types = {};
+
+ var jsesc_1;
+ var hasRequiredJsesc;
+
+ function requireJsesc () {
+ if (hasRequiredJsesc) return jsesc_1;
+ hasRequiredJsesc = 1;
+
+ const object = {};
+ const hasOwnProperty = object.hasOwnProperty;
+ const forOwn = (object, callback) => {
+ for (const key in object) {
+ if (hasOwnProperty.call(object, key)) {
+ callback(key, object[key]);
+ }
+ }
+ };
+
+ const extend = (destination, source) => {
+ if (!source) {
+ return destination;
+ }
+ forOwn(source, (key, value) => {
+ destination[key] = value;
+ });
+ return destination;
+ };
+
+ const forEach = (array, callback) => {
+ const length = array.length;
+ let index = -1;
+ while (++index < length) {
+ callback(array[index]);
+ }
+ };
+
+ const toString = object.toString;
+ const isArray = Array.isArray;
+ const isBuffer = Buffer.isBuffer;
+ const isObject = (value) => {
+ // This is a very simple check, but it’s good enough for what we need.
+ return toString.call(value) == '[object Object]';
+ };
+ const isString = (value) => {
+ return typeof value == 'string' ||
+ toString.call(value) == '[object String]';
+ };
+ const isNumber = (value) => {
+ return typeof value == 'number' ||
+ toString.call(value) == '[object Number]';
+ };
+ const isFunction = (value) => {
+ return typeof value == 'function';
+ };
+ const isMap = (value) => {
+ return toString.call(value) == '[object Map]';
+ };
+ const isSet = (value) => {
+ return toString.call(value) == '[object Set]';
+ };
+
+ /*--------------------------------------------------------------------------*/
+
+ // https://mathiasbynens.be/notes/javascript-escapes#single
+ const singleEscapes = {
+ '"': '\\"',
+ '\'': '\\\'',
+ '\\': '\\\\',
+ '\b': '\\b',
+ '\f': '\\f',
+ '\n': '\\n',
+ '\r': '\\r',
+ '\t': '\\t'
+ // `\v` is omitted intentionally, because in IE < 9, '\v' == 'v'.
+ // '\v': '\\x0B'
+ };
+ const regexSingleEscape = /["'\\\b\f\n\r\t]/;
+
+ const regexDigit = /[0-9]/;
+ const regexWhitelist = /[ !#-&\(-\[\]-_a-~]/;
+
+ const jsesc = (argument, options) => {
+ const increaseIndentation = () => {
+ oldIndent = indent;
+ ++options.indentLevel;
+ indent = options.indent.repeat(options.indentLevel);
+ };
+ // Handle options
+ const defaults = {
+ 'escapeEverything': false,
+ 'minimal': false,
+ 'isScriptContext': false,
+ 'quotes': 'single',
+ 'wrap': false,
+ 'es6': false,
+ 'json': false,
+ 'compact': true,
+ 'lowercaseHex': false,
+ 'numbers': 'decimal',
+ 'indent': '\t',
+ 'indentLevel': 0,
+ '__inline1__': false,
+ '__inline2__': false
+ };
+ const json = options && options.json;
+ if (json) {
+ defaults.quotes = 'double';
+ defaults.wrap = true;
+ }
+ options = extend(defaults, options);
+ if (
+ options.quotes != 'single' &&
+ options.quotes != 'double' &&
+ options.quotes != 'backtick'
+ ) {
+ options.quotes = 'single';
+ }
+ const quote = options.quotes == 'double' ?
+ '"' :
+ (options.quotes == 'backtick' ?
+ '`' :
+ '\''
+ );
+ const compact = options.compact;
+ const lowercaseHex = options.lowercaseHex;
+ let indent = options.indent.repeat(options.indentLevel);
+ let oldIndent = '';
+ const inline1 = options.__inline1__;
+ const inline2 = options.__inline2__;
+ const newLine = compact ? '' : '\n';
+ let result;
+ let isEmpty = true;
+ const useBinNumbers = options.numbers == 'binary';
+ const useOctNumbers = options.numbers == 'octal';
+ const useDecNumbers = options.numbers == 'decimal';
+ const useHexNumbers = options.numbers == 'hexadecimal';
+
+ if (json && argument && isFunction(argument.toJSON)) {
+ argument = argument.toJSON();
+ }
+
+ if (!isString(argument)) {
+ if (isMap(argument)) {
+ if (argument.size == 0) {
+ return 'new Map()';
+ }
+ if (!compact) {
+ options.__inline1__ = true;
+ options.__inline2__ = false;
+ }
+ return 'new Map(' + jsesc(Array.from(argument), options) + ')';
+ }
+ if (isSet(argument)) {
+ if (argument.size == 0) {
+ return 'new Set()';
+ }
+ return 'new Set(' + jsesc(Array.from(argument), options) + ')';
+ }
+ if (isBuffer(argument)) {
+ if (argument.length == 0) {
+ return 'Buffer.from([])';
+ }
+ return 'Buffer.from(' + jsesc(Array.from(argument), options) + ')';
+ }
+ if (isArray(argument)) {
+ result = [];
+ options.wrap = true;
+ if (inline1) {
+ options.__inline1__ = false;
+ options.__inline2__ = true;
+ }
+ if (!inline2) {
+ increaseIndentation();
+ }
+ forEach(argument, (value) => {
+ isEmpty = false;
+ if (inline2) {
+ options.__inline2__ = false;
+ }
+ result.push(
+ (compact || inline2 ? '' : indent) +
+ jsesc(value, options)
+ );
+ });
+ if (isEmpty) {
+ return '[]';
+ }
+ if (inline2) {
+ return '[' + result.join(', ') + ']';
+ }
+ return '[' + newLine + result.join(',' + newLine) + newLine +
+ (compact ? '' : oldIndent) + ']';
+ } else if (isNumber(argument)) {
+ if (json) {
+ // Some number values (e.g. `Infinity`) cannot be represented in JSON.
+ return JSON.stringify(argument);
+ }
+ if (useDecNumbers) {
+ return String(argument);
+ }
+ if (useHexNumbers) {
+ let hexadecimal = argument.toString(16);
+ if (!lowercaseHex) {
+ hexadecimal = hexadecimal.toUpperCase();
+ }
+ return '0x' + hexadecimal;
+ }
+ if (useBinNumbers) {
+ return '0b' + argument.toString(2);
+ }
+ if (useOctNumbers) {
+ return '0o' + argument.toString(8);
+ }
+ } else if (!isObject(argument)) {
+ if (json) {
+ // For some values (e.g. `undefined`, `function` objects),
+ // `JSON.stringify(value)` returns `undefined` (which isn’t valid
+ // JSON) instead of `'null'`.
+ return JSON.stringify(argument) || 'null';
+ }
+ return String(argument);
+ } else { // it’s an object
+ result = [];
+ options.wrap = true;
+ increaseIndentation();
+ forOwn(argument, (key, value) => {
+ isEmpty = false;
+ result.push(
+ (compact ? '' : indent) +
+ jsesc(key, options) + ':' +
+ (compact ? '' : ' ') +
+ jsesc(value, options)
+ );
+ });
+ if (isEmpty) {
+ return '{}';
+ }
+ return '{' + newLine + result.join(',' + newLine) + newLine +
+ (compact ? '' : oldIndent) + '}';
+ }
+ }
+
+ const string = argument;
+ // Loop over each code unit in the string and escape it
+ let index = -1;
+ const length = string.length;
+ result = '';
+ while (++index < length) {
+ const character = string.charAt(index);
+ if (options.es6) {
+ const first = string.charCodeAt(index);
+ if ( // check if it’s the start of a surrogate pair
+ first >= 0xD800 && first <= 0xDBFF && // high surrogate
+ length > index + 1 // there is a next code unit
+ ) {
+ const second = string.charCodeAt(index + 1);
+ if (second >= 0xDC00 && second <= 0xDFFF) { // low surrogate
+ // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
+ const codePoint = (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;
+ let hexadecimal = codePoint.toString(16);
+ if (!lowercaseHex) {
+ hexadecimal = hexadecimal.toUpperCase();
+ }
+ result += '\\u{' + hexadecimal + '}';
+ ++index;
+ continue;
+ }
+ }
+ }
+ if (!options.escapeEverything) {
+ if (regexWhitelist.test(character)) {
+ // It’s a printable ASCII character that is not `"`, `'` or `\`,
+ // so don’t escape it.
+ result += character;
+ continue;
+ }
+ if (character == '"') {
+ result += quote == character ? '\\"' : character;
+ continue;
+ }
+ if (character == '`') {
+ result += quote == character ? '\\`' : character;
+ continue;
+ }
+ if (character == '\'') {
+ result += quote == character ? '\\\'' : character;
+ continue;
+ }
+ }
+ if (
+ character == '\0' &&
+ !json &&
+ !regexDigit.test(string.charAt(index + 1))
+ ) {
+ result += '\\0';
+ continue;
+ }
+ if (regexSingleEscape.test(character)) {
+ // no need for a `hasOwnProperty` check here
+ result += singleEscapes[character];
+ continue;
+ }
+ const charCode = character.charCodeAt(0);
+ if (options.minimal && charCode != 0x2028 && charCode != 0x2029) {
+ result += character;
+ continue;
+ }
+ let hexadecimal = charCode.toString(16);
+ if (!lowercaseHex) {
+ hexadecimal = hexadecimal.toUpperCase();
+ }
+ const longhand = hexadecimal.length > 2 || json;
+ const escaped = '\\' + (longhand ? 'u' : 'x') +
+ ('0000' + hexadecimal).slice(longhand ? -4 : -2);
+ result += escaped;
+ continue;
+ }
+ if (options.wrap) {
+ result = quote + result + quote;
+ }
+ if (quote == '`') {
+ result = result.replace(/\$\{/g, '\\\$\{');
+ }
+ if (options.isScriptContext) {
+ // https://mathiasbynens.be/notes/etago
+ return result
+ .replace(/<\/(script|style)/gi, '<\\/$1')
+ .replace(/<!--/g, json ? '\\u003C!--' : '\\x3C!--');
+ }
+ return result;
+ };
+
+ jsesc.version = '2.5.2';
+
+ jsesc_1 = jsesc;
+ return jsesc_1;
+ }
+
+ var hasRequiredTypes;
+
+ function requireTypes () {
+ if (hasRequiredTypes) return types;
+ hasRequiredTypes = 1;
+
+ Object.defineProperty(types, "__esModule", {
+ value: true
+ });
+ types.ArgumentPlaceholder = ArgumentPlaceholder;
+ types.ArrayPattern = types.ArrayExpression = ArrayExpression;
+ types.BigIntLiteral = BigIntLiteral;
+ types.BooleanLiteral = BooleanLiteral;
+ types.DecimalLiteral = DecimalLiteral;
+ types.Identifier = Identifier;
+ types.NullLiteral = NullLiteral;
+ types.NumericLiteral = NumericLiteral;
+ types.ObjectPattern = types.ObjectExpression = ObjectExpression;
+ types.ObjectMethod = ObjectMethod;
+ types.ObjectProperty = ObjectProperty;
+ types.PipelineBareFunction = PipelineBareFunction;
+ types.PipelinePrimaryTopicReference = PipelinePrimaryTopicReference;
+ types.PipelineTopicExpression = PipelineTopicExpression;
+ types.RecordExpression = RecordExpression;
+ types.RegExpLiteral = RegExpLiteral;
+ types.SpreadElement = types.RestElement = RestElement;
+ types.StringLiteral = StringLiteral;
+ types.TopicReference = TopicReference;
+ types.TupleExpression = TupleExpression;
+ var _t = requireLib$2();
+ var _jsesc = requireJsesc();
+ const {
+ isAssignmentPattern,
+ isIdentifier
+ } = _t;
+ function Identifier(node) {
+ var _node$loc;
+ this.sourceIdentifierName(((_node$loc = node.loc) == null ? void 0 : _node$loc.identifierName) || node.name);
+ this.word(node.name);
+ }
+ function ArgumentPlaceholder() {
+ this.tokenChar(63);
+ }
+ function RestElement(node) {
+ this.token("...");
+ this.print(node.argument, node);
+ }
+ function ObjectExpression(node) {
+ const props = node.properties;
+ this.tokenChar(123);
+ if (props.length) {
+ this.space();
+ this.printList(props, node, {
+ indent: true,
+ statement: true
+ });
+ this.space();
+ }
+ this.sourceWithOffset("end", node.loc, -1);
+ this.tokenChar(125);
+ }
+ function ObjectMethod(node) {
+ this.printJoin(node.decorators, node);
+ this._methodHead(node);
+ this.space();
+ this.print(node.body, node);
+ }
+ function ObjectProperty(node) {
+ this.printJoin(node.decorators, node);
+ if (node.computed) {
+ this.tokenChar(91);
+ this.print(node.key, node);
+ this.tokenChar(93);
+ } else {
+ if (isAssignmentPattern(node.value) && isIdentifier(node.key) && node.key.name === node.value.left.name) {
+ this.print(node.value, node);
+ return;
+ }
+ this.print(node.key, node);
+ if (node.shorthand && isIdentifier(node.key) && isIdentifier(node.value) && node.key.name === node.value.name) {
+ return;
+ }
+ }
+ this.tokenChar(58);
+ this.space();
+ this.print(node.value, node);
+ }
+ function ArrayExpression(node) {
+ const elems = node.elements;
+ const len = elems.length;
+ this.tokenChar(91);
+ for (let i = 0; i < elems.length; i++) {
+ const elem = elems[i];
+ if (elem) {
+ if (i > 0) this.space();
+ this.print(elem, node);
+ if (i < len - 1) this.tokenChar(44);
+ } else {
+ this.tokenChar(44);
+ }
+ }
+ this.tokenChar(93);
+ }
+ function RecordExpression(node) {
+ const props = node.properties;
+ let startToken;
+ let endToken;
+ if (this.format.recordAndTupleSyntaxType === "bar") {
+ startToken = "{|";
+ endToken = "|}";
+ } else if (this.format.recordAndTupleSyntaxType !== "hash" && this.format.recordAndTupleSyntaxType != null) {
+ throw new Error(`The "recordAndTupleSyntaxType" generator option must be "bar" or "hash" (${JSON.stringify(this.format.recordAndTupleSyntaxType)} received).`);
+ } else {
+ startToken = "#{";
+ endToken = "}";
+ }
+ this.token(startToken);
+ if (props.length) {
+ this.space();
+ this.printList(props, node, {
+ indent: true,
+ statement: true
+ });
+ this.space();
+ }
+ this.token(endToken);
+ }
+ function TupleExpression(node) {
+ const elems = node.elements;
+ const len = elems.length;
+ let startToken;
+ let endToken;
+ if (this.format.recordAndTupleSyntaxType === "bar") {
+ startToken = "[|";
+ endToken = "|]";
+ } else if (this.format.recordAndTupleSyntaxType === "hash") {
+ startToken = "#[";
+ endToken = "]";
+ } else {
+ throw new Error(`${this.format.recordAndTupleSyntaxType} is not a valid recordAndTuple syntax type`);
+ }
+ this.token(startToken);
+ for (let i = 0; i < elems.length; i++) {
+ const elem = elems[i];
+ if (elem) {
+ if (i > 0) this.space();
+ this.print(elem, node);
+ if (i < len - 1) this.tokenChar(44);
+ }
+ }
+ this.token(endToken);
+ }
+ function RegExpLiteral(node) {
+ this.word(`/${node.pattern}/${node.flags}`);
+ }
+ function BooleanLiteral(node) {
+ this.word(node.value ? "true" : "false");
+ }
+ function NullLiteral() {
+ this.word("null");
+ }
+ function NumericLiteral(node) {
+ const raw = this.getPossibleRaw(node);
+ const opts = this.format.jsescOption;
+ const value = node.value + "";
+ if (opts.numbers) {
+ this.number(_jsesc(node.value, opts));
+ } else if (raw == null) {
+ this.number(value);
+ } else if (this.format.minified) {
+ this.number(raw.length < value.length ? raw : value);
+ } else {
+ this.number(raw);
+ }
+ }
+ function StringLiteral(node) {
+ const raw = this.getPossibleRaw(node);
+ if (!this.format.minified && raw !== undefined) {
+ this.token(raw);
+ return;
+ }
+ const val = _jsesc(node.value, this.format.jsescOption);
+ this.token(val);
+ }
+ function BigIntLiteral(node) {
+ const raw = this.getPossibleRaw(node);
+ if (!this.format.minified && raw !== undefined) {
+ this.word(raw);
+ return;
+ }
+ this.word(node.value + "n");
+ }
+ function DecimalLiteral(node) {
+ const raw = this.getPossibleRaw(node);
+ if (!this.format.minified && raw !== undefined) {
+ this.word(raw);
+ return;
+ }
+ this.word(node.value + "m");
+ }
+ const validTopicTokenSet = new Set(["^^", "@@", "^", "%", "#"]);
+ function TopicReference() {
+ const {
+ topicToken
+ } = this.format;
+ if (validTopicTokenSet.has(topicToken)) {
+ this.token(topicToken);
+ } else {
+ const givenTopicTokenJSON = JSON.stringify(topicToken);
+ const validTopics = Array.from(validTopicTokenSet, v => JSON.stringify(v));
+ throw new Error(`The "topicToken" generator option must be one of ` + `${validTopics.join(", ")} (${givenTopicTokenJSON} received instead).`);
+ }
+ }
+ function PipelineTopicExpression(node) {
+ this.print(node.expression, node);
+ }
+ function PipelineBareFunction(node) {
+ this.print(node.callee, node);
+ }
+ function PipelinePrimaryTopicReference() {
+ this.tokenChar(35);
+ }
+
+
+ return types;
+ }
+
+ var flow = {};
+
+ var hasRequiredFlow;
+
+ function requireFlow () {
+ if (hasRequiredFlow) return flow;
+ hasRequiredFlow = 1;
+ (function (exports) {
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.AnyTypeAnnotation = AnyTypeAnnotation;
+ exports.ArrayTypeAnnotation = ArrayTypeAnnotation;
+ exports.BooleanLiteralTypeAnnotation = BooleanLiteralTypeAnnotation;
+ exports.BooleanTypeAnnotation = BooleanTypeAnnotation;
+ exports.DeclareClass = DeclareClass;
+ exports.DeclareExportAllDeclaration = DeclareExportAllDeclaration;
+ exports.DeclareExportDeclaration = DeclareExportDeclaration;
+ exports.DeclareFunction = DeclareFunction;
+ exports.DeclareInterface = DeclareInterface;
+ exports.DeclareModule = DeclareModule;
+ exports.DeclareModuleExports = DeclareModuleExports;
+ exports.DeclareOpaqueType = DeclareOpaqueType;
+ exports.DeclareTypeAlias = DeclareTypeAlias;
+ exports.DeclareVariable = DeclareVariable;
+ exports.DeclaredPredicate = DeclaredPredicate;
+ exports.EmptyTypeAnnotation = EmptyTypeAnnotation;
+ exports.EnumBooleanBody = EnumBooleanBody;
+ exports.EnumBooleanMember = EnumBooleanMember;
+ exports.EnumDeclaration = EnumDeclaration;
+ exports.EnumDefaultedMember = EnumDefaultedMember;
+ exports.EnumNumberBody = EnumNumberBody;
+ exports.EnumNumberMember = EnumNumberMember;
+ exports.EnumStringBody = EnumStringBody;
+ exports.EnumStringMember = EnumStringMember;
+ exports.EnumSymbolBody = EnumSymbolBody;
+ exports.ExistsTypeAnnotation = ExistsTypeAnnotation;
+ exports.FunctionTypeAnnotation = FunctionTypeAnnotation;
+ exports.FunctionTypeParam = FunctionTypeParam;
+ exports.IndexedAccessType = IndexedAccessType;
+ exports.InferredPredicate = InferredPredicate;
+ exports.InterfaceDeclaration = InterfaceDeclaration;
+ exports.GenericTypeAnnotation = exports.ClassImplements = exports.InterfaceExtends = InterfaceExtends;
+ exports.InterfaceTypeAnnotation = InterfaceTypeAnnotation;
+ exports.IntersectionTypeAnnotation = IntersectionTypeAnnotation;
+ exports.MixedTypeAnnotation = MixedTypeAnnotation;
+ exports.NullLiteralTypeAnnotation = NullLiteralTypeAnnotation;
+ exports.NullableTypeAnnotation = NullableTypeAnnotation;
+ Object.defineProperty(exports, "NumberLiteralTypeAnnotation", {
+ enumerable: true,
+ get: function () {
+ return _types2.NumericLiteral;
+ }
+ });
+ exports.NumberTypeAnnotation = NumberTypeAnnotation;
+ exports.ObjectTypeAnnotation = ObjectTypeAnnotation;
+ exports.ObjectTypeCallProperty = ObjectTypeCallProperty;
+ exports.ObjectTypeIndexer = ObjectTypeIndexer;
+ exports.ObjectTypeInternalSlot = ObjectTypeInternalSlot;
+ exports.ObjectTypeProperty = ObjectTypeProperty;
+ exports.ObjectTypeSpreadProperty = ObjectTypeSpreadProperty;
+ exports.OpaqueType = OpaqueType;
+ exports.OptionalIndexedAccessType = OptionalIndexedAccessType;
+ exports.QualifiedTypeIdentifier = QualifiedTypeIdentifier;
+ Object.defineProperty(exports, "StringLiteralTypeAnnotation", {
+ enumerable: true,
+ get: function () {
+ return _types2.StringLiteral;
+ }
+ });
+ exports.StringTypeAnnotation = StringTypeAnnotation;
+ exports.SymbolTypeAnnotation = SymbolTypeAnnotation;
+ exports.ThisTypeAnnotation = ThisTypeAnnotation;
+ exports.TupleTypeAnnotation = TupleTypeAnnotation;
+ exports.TypeAlias = TypeAlias;
+ exports.TypeAnnotation = TypeAnnotation;
+ exports.TypeCastExpression = TypeCastExpression;
+ exports.TypeParameter = TypeParameter;
+ exports.TypeParameterDeclaration = exports.TypeParameterInstantiation = TypeParameterInstantiation;
+ exports.TypeofTypeAnnotation = TypeofTypeAnnotation;
+ exports.UnionTypeAnnotation = UnionTypeAnnotation;
+ exports.Variance = Variance;
+ exports.VoidTypeAnnotation = VoidTypeAnnotation;
+ exports._interfaceish = _interfaceish;
+ exports._variance = _variance;
+ var _t = requireLib$2();
+ var _modules = requireModules();
+ var _types2 = requireTypes();
+ const {
+ isDeclareExportDeclaration,
+ isStatement
+ } = _t;
+ function AnyTypeAnnotation() {
+ this.word("any");
+ }
+ function ArrayTypeAnnotation(node) {
+ this.print(node.elementType, node, true);
+ this.tokenChar(91);
+ this.tokenChar(93);
+ }
+ function BooleanTypeAnnotation() {
+ this.word("boolean");
+ }
+ function BooleanLiteralTypeAnnotation(node) {
+ this.word(node.value ? "true" : "false");
+ }
+ function NullLiteralTypeAnnotation() {
+ this.word("null");
+ }
+ function DeclareClass(node, parent) {
+ if (!isDeclareExportDeclaration(parent)) {
+ this.word("declare");
+ this.space();
+ }
+ this.word("class");
+ this.space();
+ this._interfaceish(node);
+ }
+ function DeclareFunction(node, parent) {
+ if (!isDeclareExportDeclaration(parent)) {
+ this.word("declare");
+ this.space();
+ }
+ this.word("function");
+ this.space();
+ this.print(node.id, node);
+ this.print(node.id.typeAnnotation.typeAnnotation, node);
+ if (node.predicate) {
+ this.space();
+ this.print(node.predicate, node);
+ }
+ this.semicolon();
+ }
+ function InferredPredicate() {
+ this.tokenChar(37);
+ this.word("checks");
+ }
+ function DeclaredPredicate(node) {
+ this.tokenChar(37);
+ this.word("checks");
+ this.tokenChar(40);
+ this.print(node.value, node);
+ this.tokenChar(41);
+ }
+ function DeclareInterface(node) {
+ this.word("declare");
+ this.space();
+ this.InterfaceDeclaration(node);
+ }
+ function DeclareModule(node) {
+ this.word("declare");
+ this.space();
+ this.word("module");
+ this.space();
+ this.print(node.id, node);
+ this.space();
+ this.print(node.body, node);
+ }
+ function DeclareModuleExports(node) {
+ this.word("declare");
+ this.space();
+ this.word("module");
+ this.tokenChar(46);
+ this.word("exports");
+ this.print(node.typeAnnotation, node);
+ }
+ function DeclareTypeAlias(node) {
+ this.word("declare");
+ this.space();
+ this.TypeAlias(node);
+ }
+ function DeclareOpaqueType(node, parent) {
+ if (!isDeclareExportDeclaration(parent)) {
+ this.word("declare");
+ this.space();
+ }
+ this.OpaqueType(node);
+ }
+ function DeclareVariable(node, parent) {
+ if (!isDeclareExportDeclaration(parent)) {
+ this.word("declare");
+ this.space();
+ }
+ this.word("var");
+ this.space();
+ this.print(node.id, node);
+ this.print(node.id.typeAnnotation, node);
+ this.semicolon();
+ }
+ function DeclareExportDeclaration(node) {
+ this.word("declare");
+ this.space();
+ this.word("export");
+ this.space();
+ if (node.default) {
+ this.word("default");
+ this.space();
+ }
+ FlowExportDeclaration.call(this, node);
+ }
+ function DeclareExportAllDeclaration(node) {
+ this.word("declare");
+ this.space();
+ _modules.ExportAllDeclaration.call(this, node);
+ }
+ function EnumDeclaration(node) {
+ const {
+ id,
+ body
+ } = node;
+ this.word("enum");
+ this.space();
+ this.print(id, node);
+ this.print(body, node);
+ }
+ function enumExplicitType(context, name, hasExplicitType) {
+ if (hasExplicitType) {
+ context.space();
+ context.word("of");
+ context.space();
+ context.word(name);
+ }
+ context.space();
+ }
+ function enumBody(context, node) {
+ const {
+ members
+ } = node;
+ context.token("{");
+ context.indent();
+ context.newline();
+ for (const member of members) {
+ context.print(member, node);
+ context.newline();
+ }
+ if (node.hasUnknownMembers) {
+ context.token("...");
+ context.newline();
+ }
+ context.dedent();
+ context.token("}");
+ }
+ function EnumBooleanBody(node) {
+ const {
+ explicitType
+ } = node;
+ enumExplicitType(this, "boolean", explicitType);
+ enumBody(this, node);
+ }
+ function EnumNumberBody(node) {
+ const {
+ explicitType
+ } = node;
+ enumExplicitType(this, "number", explicitType);
+ enumBody(this, node);
+ }
+ function EnumStringBody(node) {
+ const {
+ explicitType
+ } = node;
+ enumExplicitType(this, "string", explicitType);
+ enumBody(this, node);
+ }
+ function EnumSymbolBody(node) {
+ enumExplicitType(this, "symbol", true);
+ enumBody(this, node);
+ }
+ function EnumDefaultedMember(node) {
+ const {
+ id
+ } = node;
+ this.print(id, node);
+ this.tokenChar(44);
+ }
+ function enumInitializedMember(context, node) {
+ const {
+ id,
+ init
+ } = node;
+ context.print(id, node);
+ context.space();
+ context.token("=");
+ context.space();
+ context.print(init, node);
+ context.token(",");
+ }
+ function EnumBooleanMember(node) {
+ enumInitializedMember(this, node);
+ }
+ function EnumNumberMember(node) {
+ enumInitializedMember(this, node);
+ }
+ function EnumStringMember(node) {
+ enumInitializedMember(this, node);
+ }
+ function FlowExportDeclaration(node) {
+ if (node.declaration) {
+ const declar = node.declaration;
+ this.print(declar, node);
+ if (!isStatement(declar)) this.semicolon();
+ } else {
+ this.tokenChar(123);
+ if (node.specifiers.length) {
+ this.space();
+ this.printList(node.specifiers, node);
+ this.space();
+ }
+ this.tokenChar(125);
+ if (node.source) {
+ this.space();
+ this.word("from");
+ this.space();
+ this.print(node.source, node);
+ }
+ this.semicolon();
+ }
+ }
+ function ExistsTypeAnnotation() {
+ this.tokenChar(42);
+ }
+ function FunctionTypeAnnotation(node, parent) {
+ this.print(node.typeParameters, node);
+ this.tokenChar(40);
+ if (node.this) {
+ this.word("this");
+ this.tokenChar(58);
+ this.space();
+ this.print(node.this.typeAnnotation, node);
+ if (node.params.length || node.rest) {
+ this.tokenChar(44);
+ this.space();
+ }
+ }
+ this.printList(node.params, node);
+ if (node.rest) {
+ if (node.params.length) {
+ this.tokenChar(44);
+ this.space();
+ }
+ this.token("...");
+ this.print(node.rest, node);
+ }
+ this.tokenChar(41);
+ const type = parent == null ? void 0 : parent.type;
+ if (type != null && (type === "ObjectTypeCallProperty" || type === "ObjectTypeInternalSlot" || type === "DeclareFunction" || type === "ObjectTypeProperty" && parent.method)) {
+ this.tokenChar(58);
+ } else {
+ this.space();
+ this.token("=>");
+ }
+ this.space();
+ this.print(node.returnType, node);
+ }
+ function FunctionTypeParam(node) {
+ this.print(node.name, node);
+ if (node.optional) this.tokenChar(63);
+ if (node.name) {
+ this.tokenChar(58);
+ this.space();
+ }
+ this.print(node.typeAnnotation, node);
+ }
+ function InterfaceExtends(node) {
+ this.print(node.id, node);
+ this.print(node.typeParameters, node, true);
+ }
+ function _interfaceish(node) {
+ var _node$extends;
+ this.print(node.id, node);
+ this.print(node.typeParameters, node);
+ if ((_node$extends = node.extends) != null && _node$extends.length) {
+ this.space();
+ this.word("extends");
+ this.space();
+ this.printList(node.extends, node);
+ }
+ if (node.type === "DeclareClass") {
+ var _node$mixins, _node$implements;
+ if ((_node$mixins = node.mixins) != null && _node$mixins.length) {
+ this.space();
+ this.word("mixins");
+ this.space();
+ this.printList(node.mixins, node);
+ }
+ if ((_node$implements = node.implements) != null && _node$implements.length) {
+ this.space();
+ this.word("implements");
+ this.space();
+ this.printList(node.implements, node);
+ }
+ }
+ this.space();
+ this.print(node.body, node);
+ }
+ function _variance(node) {
+ var _node$variance;
+ const kind = (_node$variance = node.variance) == null ? void 0 : _node$variance.kind;
+ if (kind != null) {
+ if (kind === "plus") {
+ this.tokenChar(43);
+ } else if (kind === "minus") {
+ this.tokenChar(45);
+ }
+ }
+ }
+ function InterfaceDeclaration(node) {
+ this.word("interface");
+ this.space();
+ this._interfaceish(node);
+ }
+ function andSeparator() {
+ this.space();
+ this.tokenChar(38);
+ this.space();
+ }
+ function InterfaceTypeAnnotation(node) {
+ var _node$extends2;
+ this.word("interface");
+ if ((_node$extends2 = node.extends) != null && _node$extends2.length) {
+ this.space();
+ this.word("extends");
+ this.space();
+ this.printList(node.extends, node);
+ }
+ this.space();
+ this.print(node.body, node);
+ }
+ function IntersectionTypeAnnotation(node) {
+ this.printJoin(node.types, node, {
+ separator: andSeparator
+ });
+ }
+ function MixedTypeAnnotation() {
+ this.word("mixed");
+ }
+ function EmptyTypeAnnotation() {
+ this.word("empty");
+ }
+ function NullableTypeAnnotation(node) {
+ this.tokenChar(63);
+ this.print(node.typeAnnotation, node);
+ }
+ function NumberTypeAnnotation() {
+ this.word("number");
+ }
+ function StringTypeAnnotation() {
+ this.word("string");
+ }
+ function ThisTypeAnnotation() {
+ this.word("this");
+ }
+ function TupleTypeAnnotation(node) {
+ this.tokenChar(91);
+ this.printList(node.types, node);
+ this.tokenChar(93);
+ }
+ function TypeofTypeAnnotation(node) {
+ this.word("typeof");
+ this.space();
+ this.print(node.argument, node);
+ }
+ function TypeAlias(node) {
+ this.word("type");
+ this.space();
+ this.print(node.id, node);
+ this.print(node.typeParameters, node);
+ this.space();
+ this.tokenChar(61);
+ this.space();
+ this.print(node.right, node);
+ this.semicolon();
+ }
+ function TypeAnnotation(node) {
+ this.tokenChar(58);
+ this.space();
+ if (node.optional) this.tokenChar(63);
+ this.print(node.typeAnnotation, node);
+ }
+ function TypeParameterInstantiation(node) {
+ this.tokenChar(60);
+ this.printList(node.params, node, {});
+ this.tokenChar(62);
+ }
+ function TypeParameter(node) {
+ this._variance(node);
+ this.word(node.name);
+ if (node.bound) {
+ this.print(node.bound, node);
+ }
+ if (node.default) {
+ this.space();
+ this.tokenChar(61);
+ this.space();
+ this.print(node.default, node);
+ }
+ }
+ function OpaqueType(node) {
+ this.word("opaque");
+ this.space();
+ this.word("type");
+ this.space();
+ this.print(node.id, node);
+ this.print(node.typeParameters, node);
+ if (node.supertype) {
+ this.tokenChar(58);
+ this.space();
+ this.print(node.supertype, node);
+ }
+ if (node.impltype) {
+ this.space();
+ this.tokenChar(61);
+ this.space();
+ this.print(node.impltype, node);
+ }
+ this.semicolon();
+ }
+ function ObjectTypeAnnotation(node) {
+ if (node.exact) {
+ this.token("{|");
+ } else {
+ this.tokenChar(123);
+ }
+ const props = [...node.properties, ...(node.callProperties || []), ...(node.indexers || []), ...(node.internalSlots || [])];
+ if (props.length) {
+ this.newline();
+ this.space();
+ this.printJoin(props, node, {
+ addNewlines(leading) {
+ if (leading && !props[0]) return 1;
+ },
+ indent: true,
+ statement: true,
+ iterator: () => {
+ if (props.length !== 1 || node.inexact) {
+ this.tokenChar(44);
+ this.space();
+ }
+ }
+ });
+ this.space();
+ }
+ if (node.inexact) {
+ this.indent();
+ this.token("...");
+ if (props.length) {
+ this.newline();
+ }
+ this.dedent();
+ }
+ if (node.exact) {
+ this.token("|}");
+ } else {
+ this.tokenChar(125);
+ }
+ }
+ function ObjectTypeInternalSlot(node) {
+ if (node.static) {
+ this.word("static");
+ this.space();
+ }
+ this.tokenChar(91);
+ this.tokenChar(91);
+ this.print(node.id, node);
+ this.tokenChar(93);
+ this.tokenChar(93);
+ if (node.optional) this.tokenChar(63);
+ if (!node.method) {
+ this.tokenChar(58);
+ this.space();
+ }
+ this.print(node.value, node);
+ }
+ function ObjectTypeCallProperty(node) {
+ if (node.static) {
+ this.word("static");
+ this.space();
+ }
+ this.print(node.value, node);
+ }
+ function ObjectTypeIndexer(node) {
+ if (node.static) {
+ this.word("static");
+ this.space();
+ }
+ this._variance(node);
+ this.tokenChar(91);
+ if (node.id) {
+ this.print(node.id, node);
+ this.tokenChar(58);
+ this.space();
+ }
+ this.print(node.key, node);
+ this.tokenChar(93);
+ this.tokenChar(58);
+ this.space();
+ this.print(node.value, node);
+ }
+ function ObjectTypeProperty(node) {
+ if (node.proto) {
+ this.word("proto");
+ this.space();
+ }
+ if (node.static) {
+ this.word("static");
+ this.space();
+ }
+ if (node.kind === "get" || node.kind === "set") {
+ this.word(node.kind);
+ this.space();
+ }
+ this._variance(node);
+ this.print(node.key, node);
+ if (node.optional) this.tokenChar(63);
+ if (!node.method) {
+ this.tokenChar(58);
+ this.space();
+ }
+ this.print(node.value, node);
+ }
+ function ObjectTypeSpreadProperty(node) {
+ this.token("...");
+ this.print(node.argument, node);
+ }
+ function QualifiedTypeIdentifier(node) {
+ this.print(node.qualification, node);
+ this.tokenChar(46);
+ this.print(node.id, node);
+ }
+ function SymbolTypeAnnotation() {
+ this.word("symbol");
+ }
+ function orSeparator() {
+ this.space();
+ this.tokenChar(124);
+ this.space();
+ }
+ function UnionTypeAnnotation(node) {
+ this.printJoin(node.types, node, {
+ separator: orSeparator
+ });
+ }
+ function TypeCastExpression(node) {
+ this.tokenChar(40);
+ this.print(node.expression, node);
+ this.print(node.typeAnnotation, node);
+ this.tokenChar(41);
+ }
+ function Variance(node) {
+ if (node.kind === "plus") {
+ this.tokenChar(43);
+ } else {
+ this.tokenChar(45);
+ }
+ }
+ function VoidTypeAnnotation() {
+ this.word("void");
+ }
+ function IndexedAccessType(node) {
+ this.print(node.objectType, node, true);
+ this.tokenChar(91);
+ this.print(node.indexType, node);
+ this.tokenChar(93);
+ }
+ function OptionalIndexedAccessType(node) {
+ this.print(node.objectType, node);
+ if (node.optional) {
+ this.token("?.");
+ }
+ this.tokenChar(91);
+ this.print(node.indexType, node);
+ this.tokenChar(93);
+ }
+
+
+ } (flow));
+ return flow;
+ }
+
+ var base = {};
+
+ var hasRequiredBase;
+
+ function requireBase () {
+ if (hasRequiredBase) return base;
+ hasRequiredBase = 1;
+
+ Object.defineProperty(base, "__esModule", {
+ value: true
+ });
+ base.BlockStatement = BlockStatement;
+ base.Directive = Directive;
+ base.DirectiveLiteral = DirectiveLiteral;
+ base.File = File;
+ base.InterpreterDirective = InterpreterDirective;
+ base.Placeholder = Placeholder;
+ base.Program = Program;
+ function File(node) {
+ if (node.program) {
+ this.print(node.program.interpreter, node);
+ }
+ this.print(node.program, node);
+ }
+ function Program(node) {
+ var _node$directives;
+ this.noIndentInnerCommentsHere();
+ this.printInnerComments();
+ const directivesLen = (_node$directives = node.directives) == null ? void 0 : _node$directives.length;
+ if (directivesLen) {
+ var _node$directives$trai;
+ const newline = node.body.length ? 2 : 1;
+ this.printSequence(node.directives, node, {
+ trailingCommentsLineOffset: newline
+ });
+ if (!((_node$directives$trai = node.directives[directivesLen - 1].trailingComments) != null && _node$directives$trai.length)) {
+ this.newline(newline);
+ }
+ }
+ this.printSequence(node.body, node);
+ }
+ function BlockStatement(node) {
+ var _node$directives2;
+ this.tokenChar(123);
+ const directivesLen = (_node$directives2 = node.directives) == null ? void 0 : _node$directives2.length;
+ if (directivesLen) {
+ var _node$directives$trai2;
+ const newline = node.body.length ? 2 : 1;
+ this.printSequence(node.directives, node, {
+ indent: true,
+ trailingCommentsLineOffset: newline
+ });
+ if (!((_node$directives$trai2 = node.directives[directivesLen - 1].trailingComments) != null && _node$directives$trai2.length)) {
+ this.newline(newline);
+ }
+ }
+ this.printSequence(node.body, node, {
+ indent: true
+ });
+ this.rightBrace(node);
+ }
+ function Directive(node) {
+ this.print(node.value, node);
+ this.semicolon();
+ }
+ const unescapedSingleQuoteRE = /(?:^|[^\\])(?:\\\\)*'/;
+ const unescapedDoubleQuoteRE = /(?:^|[^\\])(?:\\\\)*"/;
+ function DirectiveLiteral(node) {
+ const raw = this.getPossibleRaw(node);
+ if (!this.format.minified && raw !== undefined) {
+ this.token(raw);
+ return;
+ }
+ const {
+ value
+ } = node;
+ if (!unescapedDoubleQuoteRE.test(value)) {
+ this.token(`"${value}"`);
+ } else if (!unescapedSingleQuoteRE.test(value)) {
+ this.token(`'${value}'`);
+ } else {
+ throw new Error("Malformed AST: it is not possible to print a directive containing" + " both unescaped single and double quotes.");
+ }
+ }
+ function InterpreterDirective(node) {
+ this.token(`#!${node.value}`);
+ this.newline(1, true);
+ }
+ function Placeholder(node) {
+ this.token("%%");
+ this.print(node.name);
+ this.token("%%");
+ if (node.expectedNode === "Statement") {
+ this.semicolon();
+ }
+ }
+
+
+ return base;
+ }
+
+ var jsx = {};
+
+ var hasRequiredJsx;
+
+ function requireJsx () {
+ if (hasRequiredJsx) return jsx;
+ hasRequiredJsx = 1;
+
+ Object.defineProperty(jsx, "__esModule", {
+ value: true
+ });
+ jsx.JSXAttribute = JSXAttribute;
+ jsx.JSXClosingElement = JSXClosingElement;
+ jsx.JSXClosingFragment = JSXClosingFragment;
+ jsx.JSXElement = JSXElement;
+ jsx.JSXEmptyExpression = JSXEmptyExpression;
+ jsx.JSXExpressionContainer = JSXExpressionContainer;
+ jsx.JSXFragment = JSXFragment;
+ jsx.JSXIdentifier = JSXIdentifier;
+ jsx.JSXMemberExpression = JSXMemberExpression;
+ jsx.JSXNamespacedName = JSXNamespacedName;
+ jsx.JSXOpeningElement = JSXOpeningElement;
+ jsx.JSXOpeningFragment = JSXOpeningFragment;
+ jsx.JSXSpreadAttribute = JSXSpreadAttribute;
+ jsx.JSXSpreadChild = JSXSpreadChild;
+ jsx.JSXText = JSXText;
+ function JSXAttribute(node) {
+ this.print(node.name, node);
+ if (node.value) {
+ this.tokenChar(61);
+ this.print(node.value, node);
+ }
+ }
+ function JSXIdentifier(node) {
+ this.word(node.name);
+ }
+ function JSXNamespacedName(node) {
+ this.print(node.namespace, node);
+ this.tokenChar(58);
+ this.print(node.name, node);
+ }
+ function JSXMemberExpression(node) {
+ this.print(node.object, node);
+ this.tokenChar(46);
+ this.print(node.property, node);
+ }
+ function JSXSpreadAttribute(node) {
+ this.tokenChar(123);
+ this.token("...");
+ this.print(node.argument, node);
+ this.tokenChar(125);
+ }
+ function JSXExpressionContainer(node) {
+ this.tokenChar(123);
+ this.print(node.expression, node);
+ this.tokenChar(125);
+ }
+ function JSXSpreadChild(node) {
+ this.tokenChar(123);
+ this.token("...");
+ this.print(node.expression, node);
+ this.tokenChar(125);
+ }
+ function JSXText(node) {
+ const raw = this.getPossibleRaw(node);
+ if (raw !== undefined) {
+ this.token(raw, true);
+ } else {
+ this.token(node.value, true);
+ }
+ }
+ function JSXElement(node) {
+ const open = node.openingElement;
+ this.print(open, node);
+ if (open.selfClosing) return;
+ this.indent();
+ for (const child of node.children) {
+ this.print(child, node);
+ }
+ this.dedent();
+ this.print(node.closingElement, node);
+ }
+ function spaceSeparator() {
+ this.space();
+ }
+ function JSXOpeningElement(node) {
+ this.tokenChar(60);
+ this.print(node.name, node);
+ this.print(node.typeParameters, node);
+ if (node.attributes.length > 0) {
+ this.space();
+ this.printJoin(node.attributes, node, {
+ separator: spaceSeparator
+ });
+ }
+ if (node.selfClosing) {
+ this.space();
+ this.token("/>");
+ } else {
+ this.tokenChar(62);
+ }
+ }
+ function JSXClosingElement(node) {
+ this.token("</");
+ this.print(node.name, node);
+ this.tokenChar(62);
+ }
+ function JSXEmptyExpression() {
+ this.printInnerComments();
+ }
+ function JSXFragment(node) {
+ this.print(node.openingFragment, node);
+ this.indent();
+ for (const child of node.children) {
+ this.print(child, node);
+ }
+ this.dedent();
+ this.print(node.closingFragment, node);
+ }
+ function JSXOpeningFragment() {
+ this.tokenChar(60);
+ this.tokenChar(62);
+ }
+ function JSXClosingFragment() {
+ this.token("</");
+ this.tokenChar(62);
+ }
+
+
+ return jsx;
+ }
+
+ var typescript = {};
+
+ var hasRequiredTypescript;
+
+ function requireTypescript () {
+ if (hasRequiredTypescript) return typescript;
+ hasRequiredTypescript = 1;
+
+ Object.defineProperty(typescript, "__esModule", {
+ value: true
+ });
+ typescript.TSAnyKeyword = TSAnyKeyword;
+ typescript.TSArrayType = TSArrayType;
+ typescript.TSSatisfiesExpression = typescript.TSAsExpression = TSTypeExpression;
+ typescript.TSBigIntKeyword = TSBigIntKeyword;
+ typescript.TSBooleanKeyword = TSBooleanKeyword;
+ typescript.TSCallSignatureDeclaration = TSCallSignatureDeclaration;
+ typescript.TSConditionalType = TSConditionalType;
+ typescript.TSConstructSignatureDeclaration = TSConstructSignatureDeclaration;
+ typescript.TSConstructorType = TSConstructorType;
+ typescript.TSDeclareFunction = TSDeclareFunction;
+ typescript.TSDeclareMethod = TSDeclareMethod;
+ typescript.TSEnumDeclaration = TSEnumDeclaration;
+ typescript.TSEnumMember = TSEnumMember;
+ typescript.TSExportAssignment = TSExportAssignment;
+ typescript.TSExpressionWithTypeArguments = TSExpressionWithTypeArguments;
+ typescript.TSExternalModuleReference = TSExternalModuleReference;
+ typescript.TSFunctionType = TSFunctionType;
+ typescript.TSImportEqualsDeclaration = TSImportEqualsDeclaration;
+ typescript.TSImportType = TSImportType;
+ typescript.TSIndexSignature = TSIndexSignature;
+ typescript.TSIndexedAccessType = TSIndexedAccessType;
+ typescript.TSInferType = TSInferType;
+ typescript.TSInstantiationExpression = TSInstantiationExpression;
+ typescript.TSInterfaceBody = TSInterfaceBody;
+ typescript.TSInterfaceDeclaration = TSInterfaceDeclaration;
+ typescript.TSIntersectionType = TSIntersectionType;
+ typescript.TSIntrinsicKeyword = TSIntrinsicKeyword;
+ typescript.TSLiteralType = TSLiteralType;
+ typescript.TSMappedType = TSMappedType;
+ typescript.TSMethodSignature = TSMethodSignature;
+ typescript.TSModuleBlock = TSModuleBlock;
+ typescript.TSModuleDeclaration = TSModuleDeclaration;
+ typescript.TSNamedTupleMember = TSNamedTupleMember;
+ typescript.TSNamespaceExportDeclaration = TSNamespaceExportDeclaration;
+ typescript.TSNeverKeyword = TSNeverKeyword;
+ typescript.TSNonNullExpression = TSNonNullExpression;
+ typescript.TSNullKeyword = TSNullKeyword;
+ typescript.TSNumberKeyword = TSNumberKeyword;
+ typescript.TSObjectKeyword = TSObjectKeyword;
+ typescript.TSOptionalType = TSOptionalType;
+ typescript.TSParameterProperty = TSParameterProperty;
+ typescript.TSParenthesizedType = TSParenthesizedType;
+ typescript.TSPropertySignature = TSPropertySignature;
+ typescript.TSQualifiedName = TSQualifiedName;
+ typescript.TSRestType = TSRestType;
+ typescript.TSStringKeyword = TSStringKeyword;
+ typescript.TSSymbolKeyword = TSSymbolKeyword;
+ typescript.TSThisType = TSThisType;
+ typescript.TSTupleType = TSTupleType;
+ typescript.TSTypeAliasDeclaration = TSTypeAliasDeclaration;
+ typescript.TSTypeAnnotation = TSTypeAnnotation;
+ typescript.TSTypeAssertion = TSTypeAssertion;
+ typescript.TSTypeLiteral = TSTypeLiteral;
+ typescript.TSTypeOperator = TSTypeOperator;
+ typescript.TSTypeParameter = TSTypeParameter;
+ typescript.TSTypeParameterDeclaration = typescript.TSTypeParameterInstantiation = TSTypeParameterInstantiation;
+ typescript.TSTypePredicate = TSTypePredicate;
+ typescript.TSTypeQuery = TSTypeQuery;
+ typescript.TSTypeReference = TSTypeReference;
+ typescript.TSUndefinedKeyword = TSUndefinedKeyword;
+ typescript.TSUnionType = TSUnionType;
+ typescript.TSUnknownKeyword = TSUnknownKeyword;
+ typescript.TSVoidKeyword = TSVoidKeyword;
+ typescript.tsPrintClassMemberModifiers = tsPrintClassMemberModifiers;
+ typescript.tsPrintFunctionOrConstructorType = tsPrintFunctionOrConstructorType;
+ typescript.tsPrintPropertyOrMethodName = tsPrintPropertyOrMethodName;
+ typescript.tsPrintSignatureDeclarationBase = tsPrintSignatureDeclarationBase;
+ typescript.tsPrintTypeLiteralOrInterfaceBody = tsPrintTypeLiteralOrInterfaceBody;
+ function TSTypeAnnotation(node) {
+ this.tokenChar(58);
+ this.space();
+ if (node.optional) this.tokenChar(63);
+ this.print(node.typeAnnotation, node);
+ }
+ function TSTypeParameterInstantiation(node, parent) {
+ this.tokenChar(60);
+ this.printList(node.params, node, {});
+ if (parent.type === "ArrowFunctionExpression" && node.params.length === 1) {
+ this.tokenChar(44);
+ }
+ this.tokenChar(62);
+ }
+ function TSTypeParameter(node) {
+ if (node.in) {
+ this.word("in");
+ this.space();
+ }
+ if (node.out) {
+ this.word("out");
+ this.space();
+ }
+ this.word(node.name);
+ if (node.constraint) {
+ this.space();
+ this.word("extends");
+ this.space();
+ this.print(node.constraint, node);
+ }
+ if (node.default) {
+ this.space();
+ this.tokenChar(61);
+ this.space();
+ this.print(node.default, node);
+ }
+ }
+ function TSParameterProperty(node) {
+ if (node.accessibility) {
+ this.word(node.accessibility);
+ this.space();
+ }
+ if (node.readonly) {
+ this.word("readonly");
+ this.space();
+ }
+ this._param(node.parameter);
+ }
+ function TSDeclareFunction(node, parent) {
+ if (node.declare) {
+ this.word("declare");
+ this.space();
+ }
+ this._functionHead(node, parent);
+ this.tokenChar(59);
+ }
+ function TSDeclareMethod(node) {
+ this._classMethodHead(node);
+ this.tokenChar(59);
+ }
+ function TSQualifiedName(node) {
+ this.print(node.left, node);
+ this.tokenChar(46);
+ this.print(node.right, node);
+ }
+ function TSCallSignatureDeclaration(node) {
+ this.tsPrintSignatureDeclarationBase(node);
+ this.tokenChar(59);
+ }
+ function TSConstructSignatureDeclaration(node) {
+ this.word("new");
+ this.space();
+ this.tsPrintSignatureDeclarationBase(node);
+ this.tokenChar(59);
+ }
+ function TSPropertySignature(node) {
+ const {
+ readonly,
+ initializer
+ } = node;
+ if (readonly) {
+ this.word("readonly");
+ this.space();
+ }
+ this.tsPrintPropertyOrMethodName(node);
+ this.print(node.typeAnnotation, node);
+ if (initializer) {
+ this.space();
+ this.tokenChar(61);
+ this.space();
+ this.print(initializer, node);
+ }
+ this.tokenChar(59);
+ }
+ function tsPrintPropertyOrMethodName(node) {
+ if (node.computed) {
+ this.tokenChar(91);
+ }
+ this.print(node.key, node);
+ if (node.computed) {
+ this.tokenChar(93);
+ }
+ if (node.optional) {
+ this.tokenChar(63);
+ }
+ }
+ function TSMethodSignature(node) {
+ const {
+ kind
+ } = node;
+ if (kind === "set" || kind === "get") {
+ this.word(kind);
+ this.space();
+ }
+ this.tsPrintPropertyOrMethodName(node);
+ this.tsPrintSignatureDeclarationBase(node);
+ this.tokenChar(59);
+ }
+ function TSIndexSignature(node) {
+ const {
+ readonly,
+ static: isStatic
+ } = node;
+ if (isStatic) {
+ this.word("static");
+ this.space();
+ }
+ if (readonly) {
+ this.word("readonly");
+ this.space();
+ }
+ this.tokenChar(91);
+ this._parameters(node.parameters, node);
+ this.tokenChar(93);
+ this.print(node.typeAnnotation, node);
+ this.tokenChar(59);
+ }
+ function TSAnyKeyword() {
+ this.word("any");
+ }
+ function TSBigIntKeyword() {
+ this.word("bigint");
+ }
+ function TSUnknownKeyword() {
+ this.word("unknown");
+ }
+ function TSNumberKeyword() {
+ this.word("number");
+ }
+ function TSObjectKeyword() {
+ this.word("object");
+ }
+ function TSBooleanKeyword() {
+ this.word("boolean");
+ }
+ function TSStringKeyword() {
+ this.word("string");
+ }
+ function TSSymbolKeyword() {
+ this.word("symbol");
+ }
+ function TSVoidKeyword() {
+ this.word("void");
+ }
+ function TSUndefinedKeyword() {
+ this.word("undefined");
+ }
+ function TSNullKeyword() {
+ this.word("null");
+ }
+ function TSNeverKeyword() {
+ this.word("never");
+ }
+ function TSIntrinsicKeyword() {
+ this.word("intrinsic");
+ }
+ function TSThisType() {
+ this.word("this");
+ }
+ function TSFunctionType(node) {
+ this.tsPrintFunctionOrConstructorType(node);
+ }
+ function TSConstructorType(node) {
+ if (node.abstract) {
+ this.word("abstract");
+ this.space();
+ }
+ this.word("new");
+ this.space();
+ this.tsPrintFunctionOrConstructorType(node);
+ }
+ function tsPrintFunctionOrConstructorType(node) {
+ const {
+ typeParameters
+ } = node;
+ const parameters = node.parameters;
+ this.print(typeParameters, node);
+ this.tokenChar(40);
+ this._parameters(parameters, node);
+ this.tokenChar(41);
+ this.space();
+ this.token("=>");
+ this.space();
+ const returnType = node.typeAnnotation;
+ this.print(returnType.typeAnnotation, node);
+ }
+ function TSTypeReference(node) {
+ this.print(node.typeName, node, true);
+ this.print(node.typeParameters, node, true);
+ }
+ function TSTypePredicate(node) {
+ if (node.asserts) {
+ this.word("asserts");
+ this.space();
+ }
+ this.print(node.parameterName);
+ if (node.typeAnnotation) {
+ this.space();
+ this.word("is");
+ this.space();
+ this.print(node.typeAnnotation.typeAnnotation);
+ }
+ }
+ function TSTypeQuery(node) {
+ this.word("typeof");
+ this.space();
+ this.print(node.exprName);
+ if (node.typeParameters) {
+ this.print(node.typeParameters, node);
+ }
+ }
+ function TSTypeLiteral(node) {
+ this.tsPrintTypeLiteralOrInterfaceBody(node.members, node);
+ }
+ function tsPrintTypeLiteralOrInterfaceBody(members, node) {
+ tsPrintBraced(this, members, node);
+ }
+ function tsPrintBraced(printer, members, node) {
+ printer.token("{");
+ if (members.length) {
+ printer.indent();
+ printer.newline();
+ for (const member of members) {
+ printer.print(member, node);
+ printer.newline();
+ }
+ printer.dedent();
+ }
+ printer.rightBrace(node);
+ }
+ function TSArrayType(node) {
+ this.print(node.elementType, node, true);
+ this.token("[]");
+ }
+ function TSTupleType(node) {
+ this.tokenChar(91);
+ this.printList(node.elementTypes, node);
+ this.tokenChar(93);
+ }
+ function TSOptionalType(node) {
+ this.print(node.typeAnnotation, node);
+ this.tokenChar(63);
+ }
+ function TSRestType(node) {
+ this.token("...");
+ this.print(node.typeAnnotation, node);
+ }
+ function TSNamedTupleMember(node) {
+ this.print(node.label, node);
+ if (node.optional) this.tokenChar(63);
+ this.tokenChar(58);
+ this.space();
+ this.print(node.elementType, node);
+ }
+ function TSUnionType(node) {
+ tsPrintUnionOrIntersectionType(this, node, "|");
+ }
+ function TSIntersectionType(node) {
+ tsPrintUnionOrIntersectionType(this, node, "&");
+ }
+ function tsPrintUnionOrIntersectionType(printer, node, sep) {
+ printer.printJoin(node.types, node, {
+ separator() {
+ this.space();
+ this.token(sep);
+ this.space();
+ }
+ });
+ }
+ function TSConditionalType(node) {
+ this.print(node.checkType);
+ this.space();
+ this.word("extends");
+ this.space();
+ this.print(node.extendsType);
+ this.space();
+ this.tokenChar(63);
+ this.space();
+ this.print(node.trueType);
+ this.space();
+ this.tokenChar(58);
+ this.space();
+ this.print(node.falseType);
+ }
+ function TSInferType(node) {
+ this.token("infer");
+ this.space();
+ this.print(node.typeParameter);
+ }
+ function TSParenthesizedType(node) {
+ this.tokenChar(40);
+ this.print(node.typeAnnotation, node);
+ this.tokenChar(41);
+ }
+ function TSTypeOperator(node) {
+ this.word(node.operator);
+ this.space();
+ this.print(node.typeAnnotation, node);
+ }
+ function TSIndexedAccessType(node) {
+ this.print(node.objectType, node, true);
+ this.tokenChar(91);
+ this.print(node.indexType, node);
+ this.tokenChar(93);
+ }
+ function TSMappedType(node) {
+ const {
+ nameType,
+ optional,
+ readonly,
+ typeParameter
+ } = node;
+ this.tokenChar(123);
+ this.space();
+ if (readonly) {
+ tokenIfPlusMinus(this, readonly);
+ this.word("readonly");
+ this.space();
+ }
+ this.tokenChar(91);
+ this.word(typeParameter.name);
+ this.space();
+ this.word("in");
+ this.space();
+ this.print(typeParameter.constraint, typeParameter);
+ if (nameType) {
+ this.space();
+ this.word("as");
+ this.space();
+ this.print(nameType, node);
+ }
+ this.tokenChar(93);
+ if (optional) {
+ tokenIfPlusMinus(this, optional);
+ this.tokenChar(63);
+ }
+ this.tokenChar(58);
+ this.space();
+ this.print(node.typeAnnotation, node);
+ this.space();
+ this.tokenChar(125);
+ }
+ function tokenIfPlusMinus(self, tok) {
+ if (tok !== true) {
+ self.token(tok);
+ }
+ }
+ function TSLiteralType(node) {
+ this.print(node.literal, node);
+ }
+ function TSExpressionWithTypeArguments(node) {
+ this.print(node.expression, node);
+ this.print(node.typeParameters, node);
+ }
+ function TSInterfaceDeclaration(node) {
+ const {
+ declare,
+ id,
+ typeParameters,
+ extends: extendz,
+ body
+ } = node;
+ if (declare) {
+ this.word("declare");
+ this.space();
+ }
+ this.word("interface");
+ this.space();
+ this.print(id, node);
+ this.print(typeParameters, node);
+ if (extendz != null && extendz.length) {
+ this.space();
+ this.word("extends");
+ this.space();
+ this.printList(extendz, node);
+ }
+ this.space();
+ this.print(body, node);
+ }
+ function TSInterfaceBody(node) {
+ this.tsPrintTypeLiteralOrInterfaceBody(node.body, node);
+ }
+ function TSTypeAliasDeclaration(node) {
+ const {
+ declare,
+ id,
+ typeParameters,
+ typeAnnotation
+ } = node;
+ if (declare) {
+ this.word("declare");
+ this.space();
+ }
+ this.word("type");
+ this.space();
+ this.print(id, node);
+ this.print(typeParameters, node);
+ this.space();
+ this.tokenChar(61);
+ this.space();
+ this.print(typeAnnotation, node);
+ this.tokenChar(59);
+ }
+ function TSTypeExpression(node) {
+ var _expression$trailingC;
+ const {
+ type,
+ expression,
+ typeAnnotation
+ } = node;
+ const forceParens = !!((_expression$trailingC = expression.trailingComments) != null && _expression$trailingC.length);
+ this.print(expression, node, true, undefined, forceParens);
+ this.space();
+ this.word(type === "TSAsExpression" ? "as" : "satisfies");
+ this.space();
+ this.print(typeAnnotation, node);
+ }
+ function TSTypeAssertion(node) {
+ const {
+ typeAnnotation,
+ expression
+ } = node;
+ this.tokenChar(60);
+ this.print(typeAnnotation, node);
+ this.tokenChar(62);
+ this.space();
+ this.print(expression, node);
+ }
+ function TSInstantiationExpression(node) {
+ this.print(node.expression, node);
+ this.print(node.typeParameters, node);
+ }
+ function TSEnumDeclaration(node) {
+ const {
+ declare,
+ const: isConst,
+ id,
+ members
+ } = node;
+ if (declare) {
+ this.word("declare");
+ this.space();
+ }
+ if (isConst) {
+ this.word("const");
+ this.space();
+ }
+ this.word("enum");
+ this.space();
+ this.print(id, node);
+ this.space();
+ tsPrintBraced(this, members, node);
+ }
+ function TSEnumMember(node) {
+ const {
+ id,
+ initializer
+ } = node;
+ this.print(id, node);
+ if (initializer) {
+ this.space();
+ this.tokenChar(61);
+ this.space();
+ this.print(initializer, node);
+ }
+ this.tokenChar(44);
+ }
+ function TSModuleDeclaration(node) {
+ const {
+ declare,
+ id
+ } = node;
+ if (declare) {
+ this.word("declare");
+ this.space();
+ }
+ if (!node.global) {
+ this.word(id.type === "Identifier" ? "namespace" : "module");
+ this.space();
+ }
+ this.print(id, node);
+ if (!node.body) {
+ this.tokenChar(59);
+ return;
+ }
+ let body = node.body;
+ while (body.type === "TSModuleDeclaration") {
+ this.tokenChar(46);
+ this.print(body.id, body);
+ body = body.body;
+ }
+ this.space();
+ this.print(body, node);
+ }
+ function TSModuleBlock(node) {
+ tsPrintBraced(this, node.body, node);
+ }
+ function TSImportType(node) {
+ const {
+ argument,
+ qualifier,
+ typeParameters
+ } = node;
+ this.word("import");
+ this.tokenChar(40);
+ this.print(argument, node);
+ this.tokenChar(41);
+ if (qualifier) {
+ this.tokenChar(46);
+ this.print(qualifier, node);
+ }
+ if (typeParameters) {
+ this.print(typeParameters, node);
+ }
+ }
+ function TSImportEqualsDeclaration(node) {
+ const {
+ isExport,
+ id,
+ moduleReference
+ } = node;
+ if (isExport) {
+ this.word("export");
+ this.space();
+ }
+ this.word("import");
+ this.space();
+ this.print(id, node);
+ this.space();
+ this.tokenChar(61);
+ this.space();
+ this.print(moduleReference, node);
+ this.tokenChar(59);
+ }
+ function TSExternalModuleReference(node) {
+ this.token("require(");
+ this.print(node.expression, node);
+ this.tokenChar(41);
+ }
+ function TSNonNullExpression(node) {
+ this.print(node.expression, node);
+ this.tokenChar(33);
+ }
+ function TSExportAssignment(node) {
+ this.word("export");
+ this.space();
+ this.tokenChar(61);
+ this.space();
+ this.print(node.expression, node);
+ this.tokenChar(59);
+ }
+ function TSNamespaceExportDeclaration(node) {
+ this.word("export");
+ this.space();
+ this.word("as");
+ this.space();
+ this.word("namespace");
+ this.space();
+ this.print(node.id, node);
+ }
+ function tsPrintSignatureDeclarationBase(node) {
+ const {
+ typeParameters
+ } = node;
+ const parameters = node.parameters;
+ this.print(typeParameters, node);
+ this.tokenChar(40);
+ this._parameters(parameters, node);
+ this.tokenChar(41);
+ const returnType = node.typeAnnotation;
+ this.print(returnType, node);
+ }
+ function tsPrintClassMemberModifiers(node) {
+ const isField = node.type === "ClassAccessorProperty" || node.type === "ClassProperty";
+ if (isField && node.declare) {
+ this.word("declare");
+ this.space();
+ }
+ if (node.accessibility) {
+ this.word(node.accessibility);
+ this.space();
+ }
+ if (node.static) {
+ this.word("static");
+ this.space();
+ }
+ if (node.override) {
+ this.word("override");
+ this.space();
+ }
+ if (node.abstract) {
+ this.word("abstract");
+ this.space();
+ }
+ if (isField && node.readonly) {
+ this.word("readonly");
+ this.space();
+ }
+ }
+
+
+ return typescript;
+ }
+
+ var hasRequiredGenerators;
+
+ function requireGenerators () {
+ if (hasRequiredGenerators) return generators;
+ hasRequiredGenerators = 1;
+ (function (exports) {
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ var _templateLiterals = requireTemplateLiterals();
+ Object.keys(_templateLiterals).forEach(function (key) {
+ if (key === "default" || key === "__esModule") return;
+ if (key in exports && exports[key] === _templateLiterals[key]) return;
+ Object.defineProperty(exports, key, {
+ enumerable: true,
+ get: function () {
+ return _templateLiterals[key];
+ }
+ });
+ });
+ var _expressions = requireExpressions();
+ Object.keys(_expressions).forEach(function (key) {
+ if (key === "default" || key === "__esModule") return;
+ if (key in exports && exports[key] === _expressions[key]) return;
+ Object.defineProperty(exports, key, {
+ enumerable: true,
+ get: function () {
+ return _expressions[key];
+ }
+ });
+ });
+ var _statements = requireStatements();
+ Object.keys(_statements).forEach(function (key) {
+ if (key === "default" || key === "__esModule") return;
+ if (key in exports && exports[key] === _statements[key]) return;
+ Object.defineProperty(exports, key, {
+ enumerable: true,
+ get: function () {
+ return _statements[key];
+ }
+ });
+ });
+ var _classes = requireClasses();
+ Object.keys(_classes).forEach(function (key) {
+ if (key === "default" || key === "__esModule") return;
+ if (key in exports && exports[key] === _classes[key]) return;
+ Object.defineProperty(exports, key, {
+ enumerable: true,
+ get: function () {
+ return _classes[key];
+ }
+ });
+ });
+ var _methods = requireMethods();
+ Object.keys(_methods).forEach(function (key) {
+ if (key === "default" || key === "__esModule") return;
+ if (key in exports && exports[key] === _methods[key]) return;
+ Object.defineProperty(exports, key, {
+ enumerable: true,
+ get: function () {
+ return _methods[key];
+ }
+ });
+ });
+ var _modules = requireModules();
+ Object.keys(_modules).forEach(function (key) {
+ if (key === "default" || key === "__esModule") return;
+ if (key in exports && exports[key] === _modules[key]) return;
+ Object.defineProperty(exports, key, {
+ enumerable: true,
+ get: function () {
+ return _modules[key];
+ }
+ });
+ });
+ var _types = requireTypes();
+ Object.keys(_types).forEach(function (key) {
+ if (key === "default" || key === "__esModule") return;
+ if (key in exports && exports[key] === _types[key]) return;
+ Object.defineProperty(exports, key, {
+ enumerable: true,
+ get: function () {
+ return _types[key];
+ }
+ });
+ });
+ var _flow = requireFlow();
+ Object.keys(_flow).forEach(function (key) {
+ if (key === "default" || key === "__esModule") return;
+ if (key in exports && exports[key] === _flow[key]) return;
+ Object.defineProperty(exports, key, {
+ enumerable: true,
+ get: function () {
+ return _flow[key];
+ }
+ });
+ });
+ var _base = requireBase();
+ Object.keys(_base).forEach(function (key) {
+ if (key === "default" || key === "__esModule") return;
+ if (key in exports && exports[key] === _base[key]) return;
+ Object.defineProperty(exports, key, {
+ enumerable: true,
+ get: function () {
+ return _base[key];
+ }
+ });
+ });
+ var _jsx = requireJsx();
+ Object.keys(_jsx).forEach(function (key) {
+ if (key === "default" || key === "__esModule") return;
+ if (key in exports && exports[key] === _jsx[key]) return;
+ Object.defineProperty(exports, key, {
+ enumerable: true,
+ get: function () {
+ return _jsx[key];
+ }
+ });
+ });
+ var _typescript = requireTypescript();
+ Object.keys(_typescript).forEach(function (key) {
+ if (key === "default" || key === "__esModule") return;
+ if (key in exports && exports[key] === _typescript[key]) return;
+ Object.defineProperty(exports, key, {
+ enumerable: true,
+ get: function () {
+ return _typescript[key];
+ }
+ });
+ });
+
+
+ } (generators));
+ return generators;
+ }
+
+ var hasRequiredPrinter;
+
+ function requirePrinter () {
+ if (hasRequiredPrinter) return printer;
+ hasRequiredPrinter = 1;
+
+ Object.defineProperty(printer, "__esModule", {
+ value: true
+ });
+ printer.default = void 0;
+ var _buffer = requireBuffer();
+ var n = requireNode();
+ var _t = requireLib$2();
+ var generatorFunctions = requireGenerators();
+ const {
+ isFunction,
+ isStatement,
+ isClassBody,
+ isTSInterfaceBody,
+ isTSEnumDeclaration
+ } = _t;
+ const SCIENTIFIC_NOTATION = /e/i;
+ const ZERO_DECIMAL_INTEGER = /\.0+$/;
+ const NON_DECIMAL_LITERAL = /^0[box]/;
+ const PURE_ANNOTATION_RE = /^\s*[@#]__PURE__\s*$/;
+ const HAS_NEWLINE = /[\n\r\u2028\u2029]/;
+ const HAS_BlOCK_COMMENT_END = /\*\//;
+ const {
+ needsParens
+ } = n;
+ class Printer {
+ constructor(format, map) {
+ this.inForStatementInitCounter = 0;
+ this._printStack = [];
+ this._indent = 0;
+ this._indentChar = 0;
+ this._indentRepeat = 0;
+ this._insideAux = false;
+ this._parenPushNewlineState = null;
+ this._noLineTerminator = false;
+ this._printAuxAfterOnNextUserNode = false;
+ this._printedComments = new Set();
+ this._endsWithInteger = false;
+ this._endsWithWord = false;
+ this._lastCommentLine = 0;
+ this._endsWithInnerRaw = false;
+ this._indentInnerComments = true;
+ this.format = format;
+ this._buf = new _buffer.default(map);
+ this._indentChar = format.indent.style.charCodeAt(0);
+ this._indentRepeat = format.indent.style.length;
+ this._inputMap = map == null ? void 0 : map._inputMap;
+ }
+ generate(ast) {
+ this.print(ast);
+ this._maybeAddAuxComment();
+ return this._buf.get();
+ }
+ indent() {
+ if (this.format.compact || this.format.concise) return;
+ this._indent++;
+ }
+ dedent() {
+ if (this.format.compact || this.format.concise) return;
+ this._indent--;
+ }
+ semicolon(force = false) {
+ this._maybeAddAuxComment();
+ if (force) {
+ this._appendChar(59);
+ } else {
+ this._queue(59);
+ }
+ this._noLineTerminator = false;
+ }
+ rightBrace(node) {
+ if (this.format.minified) {
+ this._buf.removeLastSemicolon();
+ }
+ this.sourceWithOffset("end", node.loc, -1);
+ this.tokenChar(125);
+ }
+ rightParens(node) {
+ this.sourceWithOffset("end", node.loc, -1);
+ this.tokenChar(41);
+ }
+ space(force = false) {
+ if (this.format.compact) return;
+ if (force) {
+ this._space();
+ } else if (this._buf.hasContent()) {
+ const lastCp = this.getLastChar();
+ if (lastCp !== 32 && lastCp !== 10) {
+ this._space();
+ }
+ }
+ }
+ word(str, noLineTerminatorAfter = false) {
+ this._maybePrintInnerComments();
+ if (this._endsWithWord || str.charCodeAt(0) === 47 && this.endsWith(47)) {
+ this._space();
+ }
+ this._maybeAddAuxComment();
+ this._append(str, false);
+ this._endsWithWord = true;
+ this._noLineTerminator = noLineTerminatorAfter;
+ }
+ number(str) {
+ this.word(str);
+ this._endsWithInteger = Number.isInteger(+str) && !NON_DECIMAL_LITERAL.test(str) && !SCIENTIFIC_NOTATION.test(str) && !ZERO_DECIMAL_INTEGER.test(str) && str.charCodeAt(str.length - 1) !== 46;
+ }
+ token(str, maybeNewline = false) {
+ this._maybePrintInnerComments();
+ const lastChar = this.getLastChar();
+ const strFirst = str.charCodeAt(0);
+ if (lastChar === 33 && (str === "--" || strFirst === 61) || strFirst === 43 && lastChar === 43 || strFirst === 45 && lastChar === 45 || strFirst === 46 && this._endsWithInteger) {
+ this._space();
+ }
+ this._maybeAddAuxComment();
+ this._append(str, maybeNewline);
+ this._noLineTerminator = false;
+ }
+ tokenChar(char) {
+ this._maybePrintInnerComments();
+ const lastChar = this.getLastChar();
+ if (char === 43 && lastChar === 43 || char === 45 && lastChar === 45 || char === 46 && this._endsWithInteger) {
+ this._space();
+ }
+ this._maybeAddAuxComment();
+ this._appendChar(char);
+ this._noLineTerminator = false;
+ }
+ newline(i = 1, force) {
+ if (i <= 0) return;
+ if (!force) {
+ if (this.format.retainLines || this.format.compact) return;
+ if (this.format.concise) {
+ this.space();
+ return;
+ }
+ }
+ if (i > 2) i = 2;
+ i -= this._buf.getNewlineCount();
+ for (let j = 0; j < i; j++) {
+ this._newline();
+ }
+ return;
+ }
+ endsWith(char) {
+ return this.getLastChar() === char;
+ }
+ getLastChar() {
+ return this._buf.getLastChar();
+ }
+ endsWithCharAndNewline() {
+ return this._buf.endsWithCharAndNewline();
+ }
+ removeTrailingNewline() {
+ this._buf.removeTrailingNewline();
+ }
+ exactSource(loc, cb) {
+ if (!loc) {
+ cb();
+ return;
+ }
+ this._catchUp("start", loc);
+ this._buf.exactSource(loc, cb);
+ }
+ source(prop, loc) {
+ if (!loc) return;
+ this._catchUp(prop, loc);
+ this._buf.source(prop, loc);
+ }
+ sourceWithOffset(prop, loc, columnOffset) {
+ if (!loc) return;
+ this._catchUp(prop, loc);
+ this._buf.sourceWithOffset(prop, loc, columnOffset);
+ }
+ withSource(prop, loc, cb) {
+ if (!loc) {
+ cb();
+ return;
+ }
+ this._catchUp(prop, loc);
+ this._buf.withSource(prop, loc, cb);
+ }
+ sourceIdentifierName(identifierName, pos) {
+ if (!this._buf._canMarkIdName) return;
+ const sourcePosition = this._buf._sourcePosition;
+ sourcePosition.identifierNamePos = pos;
+ sourcePosition.identifierName = identifierName;
+ }
+ _space() {
+ this._queue(32);
+ }
+ _newline() {
+ this._queue(10);
+ }
+ _append(str, maybeNewline) {
+ this._maybeAddParen(str);
+ this._maybeIndent(str.charCodeAt(0));
+ this._buf.append(str, maybeNewline);
+ this._endsWithWord = false;
+ this._endsWithInteger = false;
+ }
+ _appendChar(char) {
+ this._maybeAddParenChar(char);
+ this._maybeIndent(char);
+ this._buf.appendChar(char);
+ this._endsWithWord = false;
+ this._endsWithInteger = false;
+ }
+ _queue(char) {
+ this._maybeAddParenChar(char);
+ this._maybeIndent(char);
+ this._buf.queue(char);
+ this._endsWithWord = false;
+ this._endsWithInteger = false;
+ }
+ _maybeIndent(firstChar) {
+ if (this._indent && firstChar !== 10 && this.endsWith(10)) {
+ this._buf.queueIndentation(this._indentChar, this._getIndent());
+ }
+ }
+ _shouldIndent(firstChar) {
+ if (this._indent && firstChar !== 10 && this.endsWith(10)) {
+ return true;
+ }
+ }
+ _maybeAddParenChar(char) {
+ const parenPushNewlineState = this._parenPushNewlineState;
+ if (!parenPushNewlineState) return;
+ if (char === 32) {
+ return;
+ }
+ if (char !== 10) {
+ this._parenPushNewlineState = null;
+ return;
+ }
+ this.tokenChar(40);
+ this.indent();
+ parenPushNewlineState.printed = true;
+ }
+ _maybeAddParen(str) {
+ const parenPushNewlineState = this._parenPushNewlineState;
+ if (!parenPushNewlineState) return;
+ const len = str.length;
+ let i;
+ for (i = 0; i < len && str.charCodeAt(i) === 32; i++) continue;
+ if (i === len) {
+ return;
+ }
+ const cha = str.charCodeAt(i);
+ if (cha !== 10) {
+ if (cha !== 47 || i + 1 === len) {
+ this._parenPushNewlineState = null;
+ return;
+ }
+ const chaPost = str.charCodeAt(i + 1);
+ if (chaPost === 42) {
+ if (PURE_ANNOTATION_RE.test(str.slice(i + 2, len - 2))) {
+ return;
+ }
+ } else if (chaPost !== 47) {
+ this._parenPushNewlineState = null;
+ return;
+ }
+ }
+ this.tokenChar(40);
+ this.indent();
+ parenPushNewlineState.printed = true;
+ }
+ catchUp(line) {
+ if (!this.format.retainLines) return;
+ const count = line - this._buf.getCurrentLine();
+ for (let i = 0; i < count; i++) {
+ this._newline();
+ }
+ }
+ _catchUp(prop, loc) {
+ var _loc$prop;
+ if (!this.format.retainLines) return;
+ const line = loc == null || (_loc$prop = loc[prop]) == null ? void 0 : _loc$prop.line;
+ if (line != null) {
+ const count = line - this._buf.getCurrentLine();
+ for (let i = 0; i < count; i++) {
+ this._newline();
+ }
+ }
+ }
+ _getIndent() {
+ return this._indentRepeat * this._indent;
+ }
+ printTerminatorless(node, parent, isLabel) {
+ if (isLabel) {
+ this._noLineTerminator = true;
+ this.print(node, parent);
+ } else {
+ const terminatorState = {
+ printed: false
+ };
+ this._parenPushNewlineState = terminatorState;
+ this.print(node, parent);
+ if (terminatorState.printed) {
+ this.dedent();
+ this.newline();
+ this.tokenChar(41);
+ }
+ }
+ }
+ print(node, parent, noLineTerminatorAfter, trailingCommentsLineOffset, forceParens) {
+ var _node$extra;
+ if (!node) return;
+ this._endsWithInnerRaw = false;
+ const nodeType = node.type;
+ const format = this.format;
+ const oldConcise = format.concise;
+ if (node._compact) {
+ format.concise = true;
+ }
+ const printMethod = this[nodeType];
+ if (printMethod === undefined) {
+ throw new ReferenceError(`unknown node of type ${JSON.stringify(nodeType)} with constructor ${JSON.stringify(node.constructor.name)}`);
+ }
+ this._printStack.push(node);
+ const oldInAux = this._insideAux;
+ this._insideAux = node.loc == undefined;
+ this._maybeAddAuxComment(this._insideAux && !oldInAux);
+ const shouldPrintParens = forceParens || format.retainFunctionParens && nodeType === "FunctionExpression" && ((_node$extra = node.extra) == null ? void 0 : _node$extra.parenthesized) || needsParens(node, parent, this._printStack);
+ if (shouldPrintParens) {
+ this.tokenChar(40);
+ this._endsWithInnerRaw = false;
+ }
+ this._lastCommentLine = 0;
+ this._printLeadingComments(node, parent);
+ const loc = nodeType === "Program" || nodeType === "File" ? null : node.loc;
+ this.exactSource(loc, printMethod.bind(this, node, parent));
+ if (shouldPrintParens) {
+ this._printTrailingComments(node, parent);
+ this.tokenChar(41);
+ this._noLineTerminator = noLineTerminatorAfter;
+ } else if (noLineTerminatorAfter && !this._noLineTerminator) {
+ this._noLineTerminator = true;
+ this._printTrailingComments(node, parent);
+ } else {
+ this._printTrailingComments(node, parent, trailingCommentsLineOffset);
+ }
+ this._printStack.pop();
+ format.concise = oldConcise;
+ this._insideAux = oldInAux;
+ this._endsWithInnerRaw = false;
+ }
+ _maybeAddAuxComment(enteredPositionlessNode) {
+ if (enteredPositionlessNode) this._printAuxBeforeComment();
+ if (!this._insideAux) this._printAuxAfterComment();
+ }
+ _printAuxBeforeComment() {
+ if (this._printAuxAfterOnNextUserNode) return;
+ this._printAuxAfterOnNextUserNode = true;
+ const comment = this.format.auxiliaryCommentBefore;
+ if (comment) {
+ this._printComment({
+ type: "CommentBlock",
+ value: comment
+ }, 0);
+ }
+ }
+ _printAuxAfterComment() {
+ if (!this._printAuxAfterOnNextUserNode) return;
+ this._printAuxAfterOnNextUserNode = false;
+ const comment = this.format.auxiliaryCommentAfter;
+ if (comment) {
+ this._printComment({
+ type: "CommentBlock",
+ value: comment
+ }, 0);
+ }
+ }
+ getPossibleRaw(node) {
+ const extra = node.extra;
+ if ((extra == null ? void 0 : extra.raw) != null && extra.rawValue != null && node.value === extra.rawValue) {
+ return extra.raw;
+ }
+ }
+ printJoin(nodes, parent, opts = {}) {
+ if (!(nodes != null && nodes.length)) return;
+ let {
+ indent
+ } = opts;
+ if (indent == null && this.format.retainLines) {
+ var _nodes$0$loc;
+ const startLine = (_nodes$0$loc = nodes[0].loc) == null ? void 0 : _nodes$0$loc.start.line;
+ if (startLine != null && startLine !== this._buf.getCurrentLine()) {
+ indent = true;
+ }
+ }
+ if (indent) this.indent();
+ const newlineOpts = {
+ addNewlines: opts.addNewlines,
+ nextNodeStartLine: 0
+ };
+ const separator = opts.separator ? opts.separator.bind(this) : null;
+ const len = nodes.length;
+ for (let i = 0; i < len; i++) {
+ const node = nodes[i];
+ if (!node) continue;
+ if (opts.statement) this._printNewline(i === 0, newlineOpts);
+ this.print(node, parent, undefined, opts.trailingCommentsLineOffset || 0);
+ opts.iterator == null ? void 0 : opts.iterator(node, i);
+ if (i < len - 1) separator == null ? void 0 : separator();
+ if (opts.statement) {
+ if (i + 1 === len) {
+ this.newline(1);
+ } else {
+ var _nextNode$loc;
+ const nextNode = nodes[i + 1];
+ newlineOpts.nextNodeStartLine = ((_nextNode$loc = nextNode.loc) == null ? void 0 : _nextNode$loc.start.line) || 0;
+ this._printNewline(true, newlineOpts);
+ }
+ }
+ }
+ if (indent) this.dedent();
+ }
+ printAndIndentOnComments(node, parent) {
+ const indent = node.leadingComments && node.leadingComments.length > 0;
+ if (indent) this.indent();
+ this.print(node, parent);
+ if (indent) this.dedent();
+ }
+ printBlock(parent) {
+ const node = parent.body;
+ if (node.type !== "EmptyStatement") {
+ this.space();
+ }
+ this.print(node, parent);
+ }
+ _printTrailingComments(node, parent, lineOffset) {
+ const {
+ innerComments,
+ trailingComments
+ } = node;
+ if (innerComments != null && innerComments.length) {
+ this._printComments(2, innerComments, node, parent, lineOffset);
+ }
+ if (trailingComments != null && trailingComments.length) {
+ this._printComments(2, trailingComments, node, parent, lineOffset);
+ }
+ }
+ _printLeadingComments(node, parent) {
+ const comments = node.leadingComments;
+ if (!(comments != null && comments.length)) return;
+ this._printComments(0, comments, node, parent);
+ }
+ _maybePrintInnerComments() {
+ if (this._endsWithInnerRaw) this.printInnerComments();
+ this._endsWithInnerRaw = true;
+ this._indentInnerComments = true;
+ }
+ printInnerComments() {
+ const node = this._printStack[this._printStack.length - 1];
+ const comments = node.innerComments;
+ if (!(comments != null && comments.length)) return;
+ const hasSpace = this.endsWith(32);
+ const indent = this._indentInnerComments;
+ const printedCommentsCount = this._printedComments.size;
+ if (indent) this.indent();
+ this._printComments(1, comments, node);
+ if (hasSpace && printedCommentsCount !== this._printedComments.size) {
+ this.space();
+ }
+ if (indent) this.dedent();
+ }
+ noIndentInnerCommentsHere() {
+ this._indentInnerComments = false;
+ }
+ printSequence(nodes, parent, opts = {}) {
+ var _opts$indent;
+ opts.statement = true;
+ (_opts$indent = opts.indent) != null ? _opts$indent : opts.indent = false;
+ this.printJoin(nodes, parent, opts);
+ }
+ printList(items, parent, opts = {}) {
+ if (opts.separator == null) {
+ opts.separator = commaSeparator;
+ }
+ this.printJoin(items, parent, opts);
+ }
+ _printNewline(newLine, opts) {
+ const format = this.format;
+ if (format.retainLines || format.compact) return;
+ if (format.concise) {
+ this.space();
+ return;
+ }
+ if (!newLine) {
+ return;
+ }
+ const startLine = opts.nextNodeStartLine;
+ const lastCommentLine = this._lastCommentLine;
+ if (startLine > 0 && lastCommentLine > 0) {
+ const offset = startLine - lastCommentLine;
+ if (offset >= 0) {
+ this.newline(offset || 1);
+ return;
+ }
+ }
+ if (this._buf.hasContent()) {
+ this.newline(1);
+ }
+ }
+ _shouldPrintComment(comment) {
+ if (comment.ignore) return 0;
+ if (this._printedComments.has(comment)) return 0;
+ if (this._noLineTerminator && (HAS_NEWLINE.test(comment.value) || HAS_BlOCK_COMMENT_END.test(comment.value))) {
+ return 2;
+ }
+ this._printedComments.add(comment);
+ if (!this.format.shouldPrintComment(comment.value)) {
+ return 0;
+ }
+ return 1;
+ }
+ _printComment(comment, skipNewLines) {
+ const noLineTerminator = this._noLineTerminator;
+ const isBlockComment = comment.type === "CommentBlock";
+ const printNewLines = isBlockComment && skipNewLines !== 1 && !this._noLineTerminator;
+ if (printNewLines && this._buf.hasContent() && skipNewLines !== 2) {
+ this.newline(1);
+ }
+ const lastCharCode = this.getLastChar();
+ if (lastCharCode !== 91 && lastCharCode !== 123) {
+ this.space();
+ }
+ let val;
+ if (isBlockComment) {
+ val = `/*${comment.value}*/`;
+ if (this.format.indent.adjustMultilineComment) {
+ var _comment$loc;
+ const offset = (_comment$loc = comment.loc) == null ? void 0 : _comment$loc.start.column;
+ if (offset) {
+ const newlineRegex = new RegExp("\\n\\s{1," + offset + "}", "g");
+ val = val.replace(newlineRegex, "\n");
+ }
+ let indentSize = this.format.retainLines ? 0 : this._buf.getCurrentColumn();
+ if (this._shouldIndent(47) || this.format.retainLines) {
+ indentSize += this._getIndent();
+ }
+ val = val.replace(/\n(?!$)/g, `\n${" ".repeat(indentSize)}`);
+ }
+ } else if (!noLineTerminator) {
+ val = `//${comment.value}`;
+ } else {
+ val = `/*${comment.value}*/`;
+ }
+ if (this.endsWith(47)) this._space();
+ this.source("start", comment.loc);
+ this._append(val, isBlockComment);
+ if (!isBlockComment && !noLineTerminator) {
+ this.newline(1, true);
+ }
+ if (printNewLines && skipNewLines !== 3) {
+ this.newline(1);
+ }
+ }
+ _printComments(type, comments, node, parent, lineOffset = 0) {
+ const nodeLoc = node.loc;
+ const len = comments.length;
+ let hasLoc = !!nodeLoc;
+ const nodeStartLine = hasLoc ? nodeLoc.start.line : 0;
+ const nodeEndLine = hasLoc ? nodeLoc.end.line : 0;
+ let lastLine = 0;
+ let leadingCommentNewline = 0;
+ const maybeNewline = this._noLineTerminator ? function () {} : this.newline.bind(this);
+ for (let i = 0; i < len; i++) {
+ const comment = comments[i];
+ const shouldPrint = this._shouldPrintComment(comment);
+ if (shouldPrint === 2) {
+ hasLoc = false;
+ break;
+ }
+ if (hasLoc && comment.loc && shouldPrint === 1) {
+ const commentStartLine = comment.loc.start.line;
+ const commentEndLine = comment.loc.end.line;
+ if (type === 0) {
+ let offset = 0;
+ if (i === 0) {
+ if (this._buf.hasContent() && (comment.type === "CommentLine" || commentStartLine != commentEndLine)) {
+ offset = leadingCommentNewline = 1;
+ }
+ } else {
+ offset = commentStartLine - lastLine;
+ }
+ lastLine = commentEndLine;
+ maybeNewline(offset);
+ this._printComment(comment, 1);
+ if (i + 1 === len) {
+ maybeNewline(Math.max(nodeStartLine - lastLine, leadingCommentNewline));
+ lastLine = nodeStartLine;
+ }
+ } else if (type === 1) {
+ const offset = commentStartLine - (i === 0 ? nodeStartLine : lastLine);
+ lastLine = commentEndLine;
+ maybeNewline(offset);
+ this._printComment(comment, 1);
+ if (i + 1 === len) {
+ maybeNewline(Math.min(1, nodeEndLine - lastLine));
+ lastLine = nodeEndLine;
+ }
+ } else {
+ const offset = commentStartLine - (i === 0 ? nodeEndLine - lineOffset : lastLine);
+ lastLine = commentEndLine;
+ maybeNewline(offset);
+ this._printComment(comment, 1);
+ }
+ } else {
+ hasLoc = false;
+ if (shouldPrint !== 1) {
+ continue;
+ }
+ if (len === 1) {
+ const singleLine = comment.loc ? comment.loc.start.line === comment.loc.end.line : !HAS_NEWLINE.test(comment.value);
+ const shouldSkipNewline = singleLine && !isStatement(node) && !isClassBody(parent) && !isTSInterfaceBody(parent) && !isTSEnumDeclaration(parent);
+ if (type === 0) {
+ this._printComment(comment, shouldSkipNewline && node.type !== "ObjectExpression" || singleLine && isFunction(parent, {
+ body: node
+ }) ? 1 : 0);
+ } else if (shouldSkipNewline && type === 2) {
+ this._printComment(comment, 1);
+ } else {
+ this._printComment(comment, 0);
+ }
+ } else if (type === 1 && !(node.type === "ObjectExpression" && node.properties.length > 1) && node.type !== "ClassBody" && node.type !== "TSInterfaceBody") {
+ this._printComment(comment, i === 0 ? 2 : i === len - 1 ? 3 : 0);
+ } else {
+ this._printComment(comment, 0);
+ }
+ }
+ }
+ if (type === 2 && hasLoc && lastLine) {
+ this._lastCommentLine = lastLine;
+ }
+ }
+ }
+ Object.assign(Printer.prototype, generatorFunctions);
+ {
+ Printer.prototype.Noop = function Noop() {};
+ }
+ var _default = Printer;
+ printer.default = _default;
+ function commaSeparator() {
+ this.tokenChar(44);
+ this.space();
+ }
+
+
+ return printer;
+ }
+
+ var hasRequiredLib;
+
+ function requireLib () {
+ if (hasRequiredLib) return lib;
+ hasRequiredLib = 1;
+
+ Object.defineProperty(lib, "__esModule", {
+ value: true
+ });
+ lib.CodeGenerator = void 0;
+ lib.default = generate;
+ var _sourceMap = requireSourceMap();
+ var _printer = requirePrinter();
+ class Generator extends _printer.default {
+ constructor(ast, opts = {}, code) {
+ const format = normalizeOptions(code, opts);
+ const map = opts.sourceMaps ? new _sourceMap.default(opts, code) : null;
+ super(format, map);
+ this.ast = void 0;
+ this.ast = ast;
+ }
+ generate() {
+ return super.generate(this.ast);
+ }
+ }
+ function normalizeOptions(code, opts) {
+ var _opts$recordAndTupleS;
+ const format = {
+ auxiliaryCommentBefore: opts.auxiliaryCommentBefore,
+ auxiliaryCommentAfter: opts.auxiliaryCommentAfter,
+ shouldPrintComment: opts.shouldPrintComment,
+ retainLines: opts.retainLines,
+ retainFunctionParens: opts.retainFunctionParens,
+ comments: opts.comments == null || opts.comments,
+ compact: opts.compact,
+ minified: opts.minified,
+ concise: opts.concise,
+ indent: {
+ adjustMultilineComment: true,
+ style: " "
+ },
+ jsescOption: Object.assign({
+ quotes: "double",
+ wrap: true,
+ minimal: false
+ }, opts.jsescOption),
+ recordAndTupleSyntaxType: (_opts$recordAndTupleS = opts.recordAndTupleSyntaxType) != null ? _opts$recordAndTupleS : "hash",
+ topicToken: opts.topicToken,
+ importAttributesKeyword: opts.importAttributesKeyword
+ };
+ {
+ format.decoratorsBeforeExport = opts.decoratorsBeforeExport;
+ format.jsescOption.json = opts.jsonCompatibleStrings;
+ }
+ if (format.minified) {
+ format.compact = true;
+ format.shouldPrintComment = format.shouldPrintComment || (() => format.comments);
+ } else {
+ format.shouldPrintComment = format.shouldPrintComment || (value => format.comments || value.includes("@license") || value.includes("@preserve"));
+ }
+ if (format.compact === "auto") {
+ format.compact = typeof code === "string" && code.length > 500000;
+ if (format.compact) {
+ console.error("[BABEL] Note: The code generator has deoptimised the styling of " + `${opts.filename} as it exceeds the max of ${"500KB"}.`);
+ }
+ }
+ if (format.compact) {
+ format.indent.adjustMultilineComment = false;
+ }
+ const {
+ auxiliaryCommentBefore,
+ auxiliaryCommentAfter,
+ shouldPrintComment
+ } = format;
+ if (auxiliaryCommentBefore && !shouldPrintComment(auxiliaryCommentBefore)) {
+ format.auxiliaryCommentBefore = undefined;
+ }
+ if (auxiliaryCommentAfter && !shouldPrintComment(auxiliaryCommentAfter)) {
+ format.auxiliaryCommentAfter = undefined;
+ }
+ return format;
+ }
+ class CodeGenerator {
+ constructor(ast, opts, code) {
+ this._generator = void 0;
+ this._generator = new Generator(ast, opts, code);
+ }
+ generate() {
+ return this._generator.generate();
+ }
+ }
+ lib.CodeGenerator = CodeGenerator;
+ function generate(ast, opts, code) {
+ const gen = new Generator(ast, opts, code);
+ return gen.generate();
+ }
+
+
+ return lib;
+ }
+
+ var libExports = requireLib();
+ var generate = /*@__PURE__*/getDefaultExportFromCjs(libExports);
+
+ function isFunction(node) {
+ return (
+ libExports$2.isFunction(node) ||
+ libExports$2.isArrowFunctionExpression(node) ||
+ libExports$2.isObjectMethod(node) ||
+ libExports$2.isClassMethod(node)
+ );
+ }
+
+ function isObjectShorthand(parent) {
+ if (!libExports$2.isObjectProperty(parent)) {
+ return false;
+ }
+
+ if (parent.value && parent.value.left) {
+ return (
+ parent.value.type === "AssignmentPattern" &&
+ parent.value.left.type === "Identifier"
+ );
+ }
+
+ return (
+ parent.value &&
+ parent.key.start == parent.value.start &&
+ parent.key.loc.identifierName === parent.value.loc.identifierName
+ );
+ }
+
+ function getObjectExpressionValue(node) {
+ const { value } = node;
+
+ if (libExports$2.isIdentifier(value)) {
+ return value.name;
+ }
+
+ if (libExports$2.isCallExpression(value) || libExports$2.isFunctionExpression(value)) {
+ return "";
+ }
+ const code = generate(value).code;
+
+ const shouldWrap = libExports$2.isObjectExpression(value);
+ return shouldWrap ? `(${code})` : code;
+ }
+
+ function getCode(node) {
+ return generate(node).code;
+ }
+
+ function getComments(ast) {
+ if (!ast || !ast.comments) {
+ return [];
+ }
+ return ast.comments.map(comment => ({
+ name: comment.location,
+ location: comment.loc,
+ }));
+ }
+
+ function isComputedExpression(expression) {
+ return /^\[/m.test(expression);
+ }
+
+ /**
+ * Add the identifiers for a given object pattern.
+ *
+ * @param {Array.<Object>} identifiers
+ * the current list of identifiers where to push the new identifiers
+ * related to this path.
+ * @param {Set<String>} identifiersKeys
+ * List of currently registered identifier location key.
+ * @param {Object} pattern
+ */
+ function addPatternIdentifiers(identifiers, identifiersKeys, pattern) {
+ let items;
+ if (libExports$2.isObjectPattern(pattern)) {
+ items = pattern.properties.map(({ value }) => value);
+ }
+
+ if (libExports$2.isArrayPattern(pattern)) {
+ items = pattern.elements;
+ }
+
+ if (items) {
+ addIdentifiers(identifiers, identifiersKeys, items);
+ }
+ }
+
+ function addIdentifiers(identifiers, identifiersKeys, items) {
+ for (const item of items) {
+ if (libExports$2.isObjectPattern(item) || libExports$2.isArrayPattern(item)) {
+ addPatternIdentifiers(identifiers, identifiersKeys, item);
+ } else if (libExports$2.isIdentifier(item)) {
+ if (!identifiersKeys.has(nodeLocationKey(item.loc))) {
+ identifiers.push({
+ name: item.name,
+ expression: item.name,
+ location: item.loc,
+ });
+ }
+ }
+ }
+ }
+
+ // Top Level checks the number of "body" nodes in the ancestor chain
+ // if the node is top-level, then it shoul only have one body.
+ function isTopLevel(ancestors) {
+ return ancestors.filter(ancestor => ancestor.key == "body").length == 1;
+ }
+
+ function nodeLocationKey({ start, end }) {
+ return `${start.line}:${start.column}:${end.line}:${end.column}`;
+ }
+
+ function getFunctionParameterNames(path) {
+ if (path.node.params != null) {
+ return path.node.params.map(param => {
+ if (param.type !== "AssignmentPattern") {
+ return param.name;
+ }
+
+ // Parameter with default value
+ if (
+ param.left.type === "Identifier" &&
+ param.right.type === "Identifier"
+ ) {
+ return `${param.left.name} = ${param.right.name}`;
+ } else if (
+ param.left.type === "Identifier" &&
+ param.right.type === "StringLiteral"
+ ) {
+ return `${param.left.name} = ${param.right.value}`;
+ } else if (
+ param.left.type === "Identifier" &&
+ param.right.type === "ObjectExpression"
+ ) {
+ return `${param.left.name} = {}`;
+ } else if (
+ param.left.type === "Identifier" &&
+ param.right.type === "ArrayExpression"
+ ) {
+ return `${param.left.name} = []`;
+ } else if (
+ param.left.type === "Identifier" &&
+ param.right.type === "NullLiteral"
+ ) {
+ return `${param.left.name} = null`;
+ }
+
+ return null;
+ });
+ }
+ return [];
+ }
+
+ // the function class is inferred from a call like
+ // createClass or extend
+ function fromCallExpression(callExpression) {
+ const allowlist = ["extend", "createClass"];
+ const { callee } = callExpression.node;
+ if (!callee) {
+ return null;
+ }
+
+ const name = libExports$2.isMemberExpression(callee)
+ ? callee.property.name
+ : callee.name;
+
+ if (!allowlist.includes(name)) {
+ return null;
+ }
+
+ const variable = callExpression.findParent(p =>
+ libExports$2.isVariableDeclarator(p.node)
+ );
+ if (variable) {
+ return variable.node.id.name;
+ }
+
+ const assignment = callExpression.findParent(p =>
+ libExports$2.isAssignmentExpression(p.node)
+ );
+
+ if (!assignment) {
+ return null;
+ }
+
+ const { left } = assignment.node;
+
+ if (left.name) {
+ return name;
+ }
+
+ if (libExports$2.isMemberExpression(left)) {
+ return left.property.name;
+ }
+
+ return null;
+ }
+
+ // the function class is inferred from a prototype assignment
+ // e.g. TodoClass.prototype.render = function() {}
+ function fromPrototype(assignment) {
+ const { left } = assignment.node;
+ if (!left) {
+ return null;
+ }
+
+ if (
+ libExports$2.isMemberExpression(left) &&
+ left.object &&
+ libExports$2.isMemberExpression(left.object) &&
+ left.object.property.identifier === "prototype"
+ ) {
+ return left.object.object.name;
+ }
+
+ return null;
+ }
+
+ // infer class finds an appropriate class for functions
+ // that are defined inside of a class like thing.
+ // e.g. `class Foo`, `TodoClass.prototype.foo`,
+ // `Todo = createClass({ foo: () => {}})`
+ function inferClassName(path) {
+ const classDeclaration = path.findParent(p => libExports$2.isClassDeclaration(p.node));
+ if (classDeclaration) {
+ return classDeclaration.node.id.name;
+ }
+
+ const callExpression = path.findParent(p => libExports$2.isCallExpression(p.node));
+ if (callExpression) {
+ return fromCallExpression(callExpression);
+ }
+
+ const assignment = path.findParent(p => libExports$2.isAssignmentExpression(p.node));
+ if (assignment) {
+ return fromPrototype(assignment);
+ }
+
+ return null;
+ }
+
+ // Perform ES6's anonymous function name inference for all
+ // locations where static analysis is possible.
+ // eslint-disable-next-line complexity
+ function getFunctionName(node, parent) {
+ if (libExports$2.isIdentifier(node.id)) {
+ return node.id.name;
+ }
+
+ if (
+ libExports$2.isObjectMethod(node, { computed: false }) ||
+ libExports$2.isClassMethod(node, { computed: false }) ||
+ libExports$2.isClassPrivateMethod(node)
+ ) {
+ const { key } = node;
+
+ if (libExports$2.isIdentifier(key)) {
+ return key.name;
+ }
+ if (libExports$2.isStringLiteral(key)) {
+ return key.value;
+ }
+ if (libExports$2.isNumericLiteral(key)) {
+ return `${key.value}`;
+ }
+
+ if (libExports$2.isPrivateName(key)) {
+ return `#${key.id.name}`;
+ }
+ }
+
+ if (
+ libExports$2.isObjectProperty(parent, { computed: false, value: node }) ||
+ // TODO: Babylon 6 doesn't support computed class props. It is included
+ // here so that it is most flexible. Once Babylon 7 is used, this
+ // can change to use computed: false like ObjectProperty.
+ (libExports$2.isClassProperty(parent, { value: node }) && !parent.computed) ||
+ (libExports$2.isClassPrivateProperty(parent, { value: node }) && !parent.computed)
+ ) {
+ const { key } = parent;
+
+ if (libExports$2.isIdentifier(key)) {
+ return key.name;
+ }
+ if (libExports$2.isStringLiteral(key)) {
+ return key.value;
+ }
+ if (libExports$2.isNumericLiteral(key)) {
+ return `${key.value}`;
+ }
+
+ if (libExports$2.isPrivateName(key)) {
+ return `#${key.id.name}`;
+ }
+ }
+
+ if (libExports$2.isAssignmentExpression(parent, { operator: "=", right: node })) {
+ if (libExports$2.isIdentifier(parent.left)) {
+ return parent.left.name;
+ }
+
+ // This case is not supported in standard ES6 name inference, but it
+ // is included here since it is still a helpful case during debugging.
+ if (libExports$2.isMemberExpression(parent.left, { computed: false })) {
+ return parent.left.property.name;
+ }
+ }
+
+ if (
+ libExports$2.isAssignmentPattern(parent, { right: node }) &&
+ libExports$2.isIdentifier(parent.left)
+ ) {
+ return parent.left.name;
+ }
+
+ if (
+ libExports$2.isVariableDeclarator(parent, { init: node }) &&
+ libExports$2.isIdentifier(parent.id)
+ ) {
+ return parent.id.name;
+ }
+
+ if (
+ libExports$2.isExportDefaultDeclaration(parent, { declaration: node }) &&
+ libExports$2.isFunctionDeclaration(node)
+ ) {
+ return "default";
+ }
+
+ return "anonymous";
+ }
+
+ function getFramework(symbols) {
+ if (isReactComponent(symbols)) {
+ return "React";
+ }
+ if (isAngularComponent(symbols)) {
+ return "Angular";
+ }
+ if (isVueComponent(symbols)) {
+ return "Vue";
+ }
+
+ return null;
+ }
+
+ function isReactComponent({ importsReact, classes, identifiers }) {
+ return (
+ importsReact ||
+ extendsReactComponent(classes) ||
+ isReact(identifiers) ||
+ isRedux(identifiers)
+ );
+ }
+
+ function extendsReactComponent(classes) {
+ return classes.some(
+ classObj =>
+ libExports$2.isIdentifier(classObj.parent, { name: "Component" }) ||
+ libExports$2.isIdentifier(classObj.parent, { name: "PureComponent" }) ||
+ (libExports$2.isMemberExpression(classObj.parent, { computed: false }) &&
+ libExports$2.isIdentifier(classObj.parent, { name: "Component" }))
+ );
+ }
+
+ function isAngularComponent({ memberExpressions }) {
+ return memberExpressions.some(
+ item =>
+ item.expression == "angular.controller" ||
+ item.expression == "angular.module"
+ );
+ }
+
+ function isVueComponent({ identifiers }) {
+ return identifiers.some(identifier => identifier.name == "Vue");
+ }
+
+ /* This identifies the react lib file */
+ function isReact(identifiers) {
+ return identifiers.some(identifier => identifier.name == "isReactComponent");
+ }
+
+ /* This identifies the redux lib file */
+ function isRedux(identifiers) {
+ return identifiers.some(identifier => identifier.name == "Redux");
+ }
+
+ const symbolDeclarations = new Map();
+
+ function extractFunctionSymbol(path, state, symbols) {
+ const name = getFunctionName(path.node, path.parent);
+
+ if (!state.fnCounts[name]) {
+ state.fnCounts[name] = 0;
+ }
+ const index = state.fnCounts[name]++;
+ symbols.functions.push({
+ name,
+ klass: inferClassName(path),
+ location: path.node.loc,
+ parameterNames: getFunctionParameterNames(path),
+ identifier: path.node.id,
+ // indicates the occurence of the function in a file
+ // e.g { name: foo, ... index: 4 } is the 4th foo function
+ // in the file
+ index,
+ });
+ }
+
+ function extractSymbol(path, symbols, state) {
+ if (isFunction(path)) {
+ extractFunctionSymbol(path, state, symbols);
+ }
+
+ if (libExports$2.isJSXElement(path)) {
+ symbols.hasJsx = true;
+ }
+
+ if (libExports$2.isGenericTypeAnnotation(path)) {
+ symbols.hasTypes = true;
+ }
+
+ if (libExports$2.isClassDeclaration(path)) {
+ symbols.classes.push(getClassDeclarationSymbol(path.node));
+ }
+
+ if (!symbols.importsReact) {
+ if (libExports$2.isImportDeclaration(path)) {
+ symbols.importsReact = isReactImport(path.node);
+ } else if (libExports$2.isCallExpression(path)) {
+ symbols.importsReact = isReactRequire(path.node);
+ }
+ }
+
+ if (libExports$2.isMemberExpression(path) || libExports$2.isOptionalMemberExpression(path)) {
+ symbols.memberExpressions.push(getMemberExpressionSymbol(path));
+ }
+
+ if (
+ (libExports$2.isStringLiteral(path) || libExports$2.isNumericLiteral(path)) &&
+ libExports$2.isMemberExpression(path.parentPath)
+ ) {
+ // We only need literals that are part of computed memeber expressions
+ const { start, end } = path.node.loc;
+ symbols.literals.push({
+ location: { start, end },
+ get expression() {
+ delete this.expression;
+ this.expression = getSnippet(path.parentPath);
+ return this.expression;
+ },
+ });
+ }
+
+ getIdentifierSymbols(symbols.identifiers, symbols.identifiersKeys, path);
+ }
+
+ function extractSymbols(sourceId) {
+ const symbols = {
+ functions: [],
+ memberExpressions: [],
+ comments: [],
+ identifiers: [],
+ // This holds a set of unique identifier location key (string)
+ // It helps registering only the first identifier when there is duplicated ones for the same location.
+ identifiersKeys: new Set(),
+ classes: [],
+ literals: [],
+ hasJsx: false,
+ hasTypes: false,
+ framework: undefined,
+ importsReact: false,
+ };
+
+ const state = {
+ fnCounts: Object.create(null),
+ };
+
+ const ast = traverseAst(sourceId, {
+ enter(node, ancestors) {
+ try {
+ const path = createSimplePath(ancestors);
+ if (path) {
+ extractSymbol(path, symbols, state);
+ }
+ } catch (e) {
+ console.error(e);
+ }
+ },
+ });
+
+ // comments are extracted separately from the AST
+ symbols.comments = getComments(ast);
+ symbols.framework = getFramework(symbols);
+
+ return symbols;
+ }
+
+ function extendSnippet(name, expression, path, prevPath) {
+ const computed = path?.node.computed;
+ const optional = path?.node.optional;
+ const prevComputed = prevPath?.node.computed;
+ const prevArray = libExports$2.isArrayExpression(prevPath);
+ const array = libExports$2.isArrayExpression(path);
+ const value = path?.node.property?.extra?.raw || "";
+
+ if (expression === "") {
+ if (computed) {
+ return name === undefined ? `[${value}]` : `[${name}]`;
+ }
+ return name;
+ }
+
+ if (computed || array) {
+ if (prevComputed || prevArray) {
+ return `[${name}]${expression}`;
+ }
+ return `[${name === undefined ? value : name}].${expression}`;
+ }
+
+ if (prevComputed || prevArray) {
+ return `${name}${expression}`;
+ }
+
+ if (isComputedExpression(expression) && name !== undefined) {
+ return `${name}${expression}`;
+ }
+
+ if (optional) {
+ return `${name}?.${expression}`;
+ }
+
+ return `${name}.${expression}`;
+ }
+
+ function getMemberSnippet(node, expression = "", optional = false) {
+ if (libExports$2.isMemberExpression(node) || libExports$2.isOptionalMemberExpression(node)) {
+ const name = libExports$2.isPrivateName(node.property)
+ ? `#${node.property.id.name}`
+ : node.property.name;
+ const snippet = getMemberSnippet(
+ node.object,
+ extendSnippet(name, expression, { node }),
+ node.optional
+ );
+ return snippet;
+ }
+
+ if (libExports$2.isCallExpression(node)) {
+ return "";
+ }
+
+ if (libExports$2.isThisExpression(node)) {
+ return `this.${expression}`;
+ }
+
+ if (libExports$2.isIdentifier(node)) {
+ if (isComputedExpression(expression)) {
+ return `${node.name}${expression}`;
+ }
+ if (optional) {
+ return `${node.name}?.${expression}`;
+ }
+ return `${node.name}.${expression}`;
+ }
+
+ return expression;
+ }
+
+ function getObjectSnippet(path, prevPath, expression = "") {
+ if (!path) {
+ return expression;
+ }
+
+ const { name } = path.node.key;
+
+ const extendedExpression = extendSnippet(name, expression, path, prevPath);
+
+ const nextPrevPath = path;
+ const nextPath = path.parentPath && path.parentPath.parentPath;
+
+ return getSnippet(nextPath, nextPrevPath, extendedExpression);
+ }
+
+ function getArraySnippet(path, prevPath, expression) {
+ if (!prevPath.parentPath) {
+ throw new Error("Assertion failure - path should exist");
+ }
+
+ const index = `${prevPath.parentPath.containerIndex}`;
+ const extendedExpression = extendSnippet(index, expression, path, prevPath);
+
+ const nextPrevPath = path;
+ const nextPath = path.parentPath && path.parentPath.parentPath;
+
+ return getSnippet(nextPath, nextPrevPath, extendedExpression);
+ }
+
+ function getSnippet(path, prevPath, expression = "") {
+ if (!path) {
+ return expression;
+ }
+
+ if (libExports$2.isVariableDeclaration(path)) {
+ const node = path.node.declarations[0];
+ const { name } = node.id;
+ return extendSnippet(name, expression, path, prevPath);
+ }
+
+ if (libExports$2.isVariableDeclarator(path)) {
+ const node = path.node.id;
+ if (libExports$2.isObjectPattern(node)) {
+ return expression;
+ }
+
+ const prop = extendSnippet(node.name, expression, path, prevPath);
+ return prop;
+ }
+
+ if (libExports$2.isAssignmentExpression(path)) {
+ const node = path.node.left;
+ const name = libExports$2.isMemberExpression(node)
+ ? getMemberSnippet(node)
+ : node.name;
+
+ const prop = extendSnippet(name, expression, path, prevPath);
+ return prop;
+ }
+
+ if (isFunction(path)) {
+ return expression;
+ }
+
+ if (libExports$2.isIdentifier(path)) {
+ return `${path.node.name}.${expression}`;
+ }
+
+ if (libExports$2.isObjectProperty(path)) {
+ return getObjectSnippet(path, prevPath, expression);
+ }
+
+ if (libExports$2.isObjectExpression(path)) {
+ const parentPath = prevPath?.parentPath;
+ return getObjectSnippet(parentPath, prevPath, expression);
+ }
+
+ if (libExports$2.isMemberExpression(path) || libExports$2.isOptionalMemberExpression(path)) {
+ return getMemberSnippet(path.node, expression);
+ }
+
+ if (libExports$2.isArrayExpression(path)) {
+ if (!prevPath) {
+ throw new Error("Assertion failure - path should exist");
+ }
+
+ return getArraySnippet(path, prevPath, expression);
+ }
+
+ return "";
+ }
+
+ function clearSymbols(sourceIds) {
+ for (const sourceId of sourceIds) {
+ symbolDeclarations.delete(sourceId);
+ }
+ }
+
+ function getInternalSymbols(sourceId) {
+ if (symbolDeclarations.has(sourceId)) {
+ const symbols = symbolDeclarations.get(sourceId);
+ if (symbols) {
+ return symbols;
+ }
+ }
+
+ const symbols = extractSymbols(sourceId);
+
+ symbolDeclarations.set(sourceId, symbols);
+ return symbols;
+ }
+
+ function getFunctionSymbols(sourceId, maxResults) {
+ const symbols = getInternalSymbols(sourceId);
+ if (!symbols) {
+ return [];
+ }
+ let { functions } = symbols;
+ // Avoid transferring more symbols than necessary
+ if (maxResults && functions.length > maxResults) {
+ functions = functions.slice(0, maxResults);
+ }
+ // The Outline & the Quick open panels do not need anonymous functions
+ return functions.filter(fn => fn.name !== "anonymous");
+ }
+
+ function getClassSymbols(sourceId) {
+ const symbols = getInternalSymbols(sourceId);
+ if (!symbols) {
+ return [];
+ }
+
+ return symbols.classes;
+ }
+
+ function containsPosition$1(a, b) {
+ const bColumn = b.column || 0;
+ const startsBefore =
+ a.start.line < b.line ||
+ (a.start.line === b.line && a.start.column <= bColumn);
+ const endsAfter =
+ a.end.line > b.line || (a.end.line === b.line && a.end.column >= bColumn);
+
+ return startsBefore && endsAfter;
+ }
+
+ function getClosestFunctionName(location) {
+ const symbols = getInternalSymbols(location.source.id);
+ if (!symbols || !symbols.functions) {
+ return "";
+ }
+
+ const closestFunction = symbols.functions.reduce((found, currNode) => {
+ if (
+ currNode.name === "anonymous" ||
+ !containsPosition$1(currNode.location, {
+ line: location.line,
+ column: location.column || 0,
+ })
+ ) {
+ return found;
+ }
+
+ if (!found) {
+ return currNode;
+ }
+
+ if (found.location.start.line > currNode.location.start.line) {
+ return found;
+ }
+ if (
+ found.location.start.line === currNode.location.start.line &&
+ found.location.start.column > currNode.location.start.column
+ ) {
+ return found;
+ }
+
+ return currNode;
+ }, null);
+
+ if (!closestFunction) {
+ return "";
+ }
+ return closestFunction.name;
+ }
+
+ // This is only called from the main thread and we return a subset of attributes
+ function getSymbols(sourceId) {
+ const symbols = getInternalSymbols(sourceId);
+ return {
+ // This is used in the main thread by:
+ // * The `getFunctionSymbols` function which is used by the Outline, QuickOpen panels.
+ // * The `getClosestFunctionName` function used in the mapping of frame function names.
+ // * The `findOutOfScopeLocations` function use to determine in scope lines.
+ // functions: symbols.functions,
+
+ // The three following attributes are only used by `findBestMatchExpression` within the worker thread
+ // `memberExpressions`, `literals`
+ // This one is also used within the worker for framework computation
+ // `identifiers`
+ //
+ // These three memberExpressions, literals and identifiers attributes are arrays containing objects whose attributes are:
+ // * name: string
+ // * location: object {start: number, end: number}
+ // * expression: string
+ // * computed: boolean (only for memberExpressions)
+ //
+ // `findBestMatchExpression` uses `location`, `computed` and `expression` (not name).
+ // `expression` isn't used from the worker thread implementation of `findBestMatchExpression`.
+ // The main thread only uses `expression` and `location`.
+ // framework computation uses only:
+ // * `name` for identifiers
+ // * `expression` for memberExpression
+
+ // This is used within the worker for framework computation,
+ // and in the `getClassSymbols` function
+ // `classes`
+
+ // The two following are only used by the main thread for computing CodeMirror "mode"
+ hasJsx: symbols.hasJsx,
+ hasTypes: symbols.hasTypes,
+
+ // This is used in the main thread only to compute the source icon
+ framework: symbols.framework,
+
+ // This is only used by `findOutOfScopeLocations`:
+ // `comments`
+ };
+ }
+
+ function getMemberExpressionSymbol(path) {
+ const { start, end } = path.node.property.loc;
+ return {
+ location: { start, end },
+ get expression() {
+ delete this.expression;
+ this.expression = getSnippet(path);
+ return this.expression;
+ },
+ computed: path.node.computed,
+ };
+ }
+
+ function isReactImport(node) {
+ return (
+ node.source.value == "react" &&
+ node.specifiers?.some(specifier => specifier.local?.name == "React")
+ );
+ }
+
+ function isReactRequire(node) {
+ const { callee } = node;
+ const name = libExports$2.isMemberExpression(callee)
+ ? callee.property.name
+ : callee.loc.identifierName;
+ return name == "require" && node.arguments.some(arg => arg.value == "react");
+ }
+
+ function getClassParentName(superClass) {
+ return libExports$2.isMemberExpression(superClass)
+ ? getCode(superClass)
+ : superClass.name;
+ }
+
+ function getClassParentSymbol(superClass) {
+ if (!superClass) {
+ return null;
+ }
+ return {
+ name: getClassParentName(superClass),
+ location: superClass.loc,
+ };
+ }
+
+ function getClassDeclarationSymbol(node) {
+ const { loc, superClass } = node;
+ return {
+ name: node.id.name,
+ parent: getClassParentSymbol(superClass),
+ location: loc,
+ };
+ }
+
+ /**
+ * Get a list of identifiers that are part of the given path.
+ *
+ * @param {Array.<Object>} identifiers
+ * the current list of identifiers where to push the new identifiers
+ * related to this path.
+ * @param {Set<String>} identifiersKeys
+ * List of currently registered identifier location key.
+ * @param {Object} path
+ */
+ function getIdentifierSymbols(identifiers, identifiersKeys, path) {
+ if (libExports$2.isStringLiteral(path) && libExports$2.isProperty(path.parentPath)) {
+ if (!identifiersKeys.has(nodeLocationKey(path.node.loc))) {
+ identifiers.push({
+ name: path.node.value,
+ get expression() {
+ delete this.expression;
+ this.expression = getObjectExpressionValue(path.parent);
+ return this.expression;
+ },
+ location: path.node.loc,
+ });
+ }
+ return;
+ }
+
+ if (libExports$2.isIdentifier(path) && !libExports$2.isGenericTypeAnnotation(path.parent)) {
+ // We want to include function params, but exclude the function name
+ if (libExports$2.isClassMethod(path.parent) && !path.inList) {
+ return;
+ }
+
+ if (libExports$2.isProperty(path.parentPath) && !isObjectShorthand(path.parent)) {
+ if (!identifiersKeys.has(nodeLocationKey(path.node.loc))) {
+ identifiers.push({
+ name: path.node.name,
+ get expression() {
+ delete this.expression;
+ this.expression = getObjectExpressionValue(path.parent);
+ return this.expression;
+ },
+ location: path.node.loc,
+ });
+ }
+ return;
+ }
+
+ let { start, end } = path.node.loc;
+ if (path.node.typeAnnotation) {
+ const { column } = path.node.typeAnnotation.loc.start;
+ end = { ...end, column };
+ }
+
+ if (!identifiersKeys.has(nodeLocationKey({ start, end }))) {
+ identifiers.push({
+ name: path.node.name,
+ expression: path.node.name,
+ location: { start, end },
+ });
+ }
+ }
+
+ if (libExports$2.isThisExpression(path.node)) {
+ if (!identifiersKeys.has(nodeLocationKey(path.node.loc))) {
+ identifiers.push({
+ name: "this",
+ location: path.node.loc,
+ expression: "this",
+ });
+ }
+ }
+
+ if (libExports$2.isVariableDeclarator(path)) {
+ const nodeId = path.node.id;
+
+ addPatternIdentifiers(identifiers, identifiersKeys, nodeId);
+ }
+ }
+
+ /**
+ * "implicit"
+ * Variables added automaticly like "this" and "arguments"
+ *
+ * "var"
+ * Variables declared with "var" or non-block function declarations
+ *
+ * "let"
+ * Variables declared with "let".
+ *
+ * "const"
+ * Variables declared with "const", or added as const
+ * bindings like inner function expressions and inner class names.
+ *
+ * "import"
+ * Imported binding names exposed from other modules.
+ *
+ * "global"
+ * Variables that reference undeclared global values.
+ */
+
+ // Location information about the expression immediartely surrounding a
+ // given binding reference.
+
+ function isGeneratedId(id) {
+ return !/\/originalSource/.test(id);
+ }
+
+ function parseSourceScopes(sourceId) {
+ const ast = getAst(sourceId);
+ if (!ast || !Object.keys(ast).length) {
+ return null;
+ }
+
+ return buildScopeList(ast, sourceId);
+ }
+
+ function buildScopeList(ast, sourceId) {
+ const { global, lexical } = createGlobalScope(ast, sourceId);
+
+ const state = {
+ // The id for the source that scope list is generated for
+ sourceId,
+
+ // A map of any free variables(variables which are used within the current scope but not
+ // declared within the scope). This changes when a new scope is created.
+ freeVariables: new Map(),
+
+ // A stack of all the free variables created across all the scopes that have
+ // been created.
+ freeVariableStack: [],
+
+ inType: null,
+
+ // The current scope, a new scope is potentially created on a visit to each node
+ // depending in the criteria. Initially set to the lexical global scope which is the
+ // child to the global scope.
+ scope: lexical,
+
+ // A stack of all the existing scopes, this is mainly used retrieve the parent scope
+ // (which is the last scope push onto the stack) on exiting a visited node.
+ scopeStack: [],
+
+ declarationBindingIds: new Set(),
+ };
+ libExports$2.traverse(ast, scopeCollectionVisitor, state);
+
+ for (const [key, freeVariables] of state.freeVariables) {
+ let binding = global.bindings[key];
+ if (!binding) {
+ binding = {
+ type: "global",
+ refs: [],
+ };
+ global.bindings[key] = binding;
+ }
+
+ binding.refs = freeVariables.concat(binding.refs);
+ }
+
+ // TODO: This should probably check for ".mjs" extension on the
+ // original file, and should also be skipped if the the generated
+ // code is an ES6 module rather than a script.
+ if (
+ isGeneratedId(sourceId) ||
+ (ast.program.sourceType === "script" && !looksLikeCommonJS(global))
+ ) {
+ stripModuleScope(global);
+ }
+
+ return toParsedScopes([global]) || [];
+ }
+
+ function toParsedScopes(children, sourceId) {
+ if (!children || children.length === 0) {
+ return undefined;
+ }
+ return children.map(scope => ({
+ // Removing unneed information from TempScope such as parent reference.
+ // We also need to convert BabelLocation to the Location type.
+ start: scope.loc.start,
+ end: scope.loc.end,
+ type:
+ scope.type === "module" || scope.type === "function-body"
+ ? "block"
+ : scope.type,
+ scopeKind: "",
+ displayName: scope.displayName,
+ bindings: scope.bindings,
+ children: toParsedScopes(scope.children),
+ }));
+ }
+
+ /**
+ * Create a new scope object and link the scope to it parent.
+ *
+ * @param {String} type - scope type
+ * @param {String} displayName - The scope display name
+ * @param {Object} parent - The parent object scope
+ * @param {Object} loc - The start and end postions (line/columns) of the scope
+ * @returns {Object} The newly created scope
+ */
+ function createTempScope(type, displayName, parent, loc) {
+ const scope = {
+ type,
+ displayName,
+ parent,
+
+ // A list of all the child scopes
+ children: [],
+ loc,
+
+ // All the bindings defined in this scope
+ // bindings = [binding, ...]
+ // binding = { type: "", refs: []}
+ bindings: Object.create(null),
+ };
+
+ if (parent) {
+ parent.children.push(scope);
+ }
+ return scope;
+ }
+
+ // Sets a new current scope and creates a new map to store the free variables
+ // that may exist in this scope.
+ function pushTempScope(state, type, displayName, loc) {
+ const scope = createTempScope(type, displayName, state.scope, loc);
+
+ state.scope = scope;
+
+ state.freeVariableStack.push(state.freeVariables);
+ state.freeVariables = new Map();
+ return scope;
+ }
+
+ function isNode(node, type) {
+ return node ? node.type === type : false;
+ }
+
+ // Walks up the scope tree to the top most variable scope
+ function getVarScope(scope) {
+ let s = scope;
+ while (s.type !== "function" && s.type !== "module") {
+ if (!s.parent) {
+ return s;
+ }
+ s = s.parent;
+ }
+ return s;
+ }
+
+ function fromBabelLocation(location, sourceId) {
+ return {
+ sourceId,
+ line: location.line,
+ column: location.column,
+ };
+ }
+
+ function parseDeclarator(
+ declaratorId,
+ targetScope,
+ type,
+ locationType,
+ declaration,
+ state
+ ) {
+ if (isNode(declaratorId, "Identifier")) {
+ let existing = targetScope.bindings[declaratorId.name];
+ if (!existing) {
+ existing = {
+ type,
+ refs: [],
+ };
+ targetScope.bindings[declaratorId.name] = existing;
+ }
+ state.declarationBindingIds.add(declaratorId);
+ existing.refs.push({
+ type: locationType,
+ start: fromBabelLocation(declaratorId.loc.start, state.sourceId),
+ end: fromBabelLocation(declaratorId.loc.end, state.sourceId),
+ declaration: {
+ start: fromBabelLocation(declaration.loc.start, state.sourceId),
+ end: fromBabelLocation(declaration.loc.end, state.sourceId),
+ },
+ });
+ } else if (isNode(declaratorId, "ObjectPattern")) {
+ declaratorId.properties.forEach(prop => {
+ parseDeclarator(
+ prop.value,
+ targetScope,
+ type,
+ locationType,
+ declaration,
+ state
+ );
+ });
+ } else if (isNode(declaratorId, "ArrayPattern")) {
+ declaratorId.elements.forEach(item => {
+ parseDeclarator(
+ item,
+ targetScope,
+ type,
+ locationType,
+ declaration,
+ state
+ );
+ });
+ } else if (isNode(declaratorId, "AssignmentPattern")) {
+ parseDeclarator(
+ declaratorId.left,
+ targetScope,
+ type,
+ locationType,
+ declaration,
+ state
+ );
+ } else if (isNode(declaratorId, "RestElement")) {
+ parseDeclarator(
+ declaratorId.argument,
+ targetScope,
+ type,
+ locationType,
+ declaration,
+ state
+ );
+ } else if (libExports$2.isTSParameterProperty(declaratorId)) {
+ parseDeclarator(
+ declaratorId.parameter,
+ targetScope,
+ type,
+ locationType,
+ declaration,
+ state
+ );
+ }
+ }
+
+ function isLetOrConst(node) {
+ return node.kind === "let" || node.kind === "const";
+ }
+
+ function hasLexicalDeclaration(node, parent) {
+ const nodes = [];
+ if (libExports$2.isSwitchStatement(node)) {
+ for (const caseNode of node.cases) {
+ nodes.push(...caseNode.consequent);
+ }
+ } else {
+ nodes.push(...node.body);
+ }
+
+ const isFunctionBody = libExports$2.isFunction(parent, { body: node });
+
+ return nodes.some(
+ child =>
+ isLexicalVariable(child) ||
+ libExports$2.isClassDeclaration(child) ||
+ (!isFunctionBody && libExports$2.isFunctionDeclaration(child))
+ );
+ }
+ function isLexicalVariable(node) {
+ return isNode(node, "VariableDeclaration") && isLetOrConst(node);
+ }
+
+ // Creates the global scopes for this source, the overall global scope
+ // and a lexical global scope.
+ function createGlobalScope(ast, sourceId) {
+ const global = createTempScope("object", "Global", null, {
+ start: fromBabelLocation(ast.loc.start, sourceId),
+ end: fromBabelLocation(ast.loc.end, sourceId),
+ });
+
+ const lexical = createTempScope("block", "Lexical Global", global, {
+ start: fromBabelLocation(ast.loc.start, sourceId),
+ end: fromBabelLocation(ast.loc.end, sourceId),
+ });
+
+ return { global, lexical };
+ }
+
+ const scopeCollectionVisitor = {
+ // eslint-disable-next-line complexity
+ enter(node, ancestors, state) {
+ state.scopeStack.push(state.scope);
+
+ const parentNode =
+ ancestors.length === 0 ? null : ancestors[ancestors.length - 1].node;
+
+ if (state.inType) {
+ return;
+ }
+
+ if (libExports$2.isProgram(node)) {
+ const scope = pushTempScope(state, "module", "Module", {
+ start: fromBabelLocation(node.loc.start, state.sourceId),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ });
+ scope.bindings.this = {
+ type: "implicit",
+ refs: [],
+ };
+ } else if (libExports$2.isFunction(node)) {
+ let { scope } = state;
+
+ if (libExports$2.isFunctionExpression(node) && isNode(node.id, "Identifier")) {
+ scope = pushTempScope(state, "block", "Function Expression", {
+ start: fromBabelLocation(node.loc.start, state.sourceId),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ });
+ state.declarationBindingIds.add(node.id);
+ scope.bindings[node.id.name] = {
+ type: "const",
+ refs: [
+ {
+ type: "fn-expr",
+ start: fromBabelLocation(node.id.loc.start, state.sourceId),
+ end: fromBabelLocation(node.id.loc.end, state.sourceId),
+ declaration: {
+ start: fromBabelLocation(node.loc.start, state.sourceId),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ },
+ },
+ ],
+ };
+ }
+
+ if (libExports$2.isFunctionDeclaration(node) && isNode(node.id, "Identifier")) {
+ // This ignores Annex B function declaration hoisting, which
+ // is probably a fine assumption.
+ state.declarationBindingIds.add(node.id);
+ const refs = [
+ {
+ type: "fn-decl",
+ start: fromBabelLocation(node.id.loc.start, state.sourceId),
+ end: fromBabelLocation(node.id.loc.end, state.sourceId),
+ declaration: {
+ start: fromBabelLocation(node.loc.start, state.sourceId),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ },
+ },
+ ];
+
+ if (scope.type === "block") {
+ scope.bindings[node.id.name] = {
+ type: "let",
+ refs,
+ };
+ } else {
+ // Add the binding to the ancestor scope
+ getVarScope(scope).bindings[node.id.name] = {
+ type: "var",
+ refs,
+ };
+ }
+ }
+
+ scope = pushTempScope(
+ state,
+ "function",
+ getFunctionName(node, parentNode),
+ {
+ // Being at the start of a function doesn't count as
+ // being inside of it.
+ start: fromBabelLocation(
+ node.params[0] ? node.params[0].loc.start : node.loc.start,
+ state.sourceId
+ ),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ }
+ );
+
+ node.params.forEach(param =>
+ parseDeclarator(param, scope, "var", "fn-param", node, state)
+ );
+
+ if (!libExports$2.isArrowFunctionExpression(node)) {
+ scope.bindings.this = {
+ type: "implicit",
+ refs: [],
+ };
+ scope.bindings.arguments = {
+ type: "implicit",
+ refs: [],
+ };
+ }
+
+ if (
+ libExports$2.isBlockStatement(node.body) &&
+ hasLexicalDeclaration(node.body, node)
+ ) {
+ scope = pushTempScope(state, "function-body", "Function Body", {
+ start: fromBabelLocation(node.body.loc.start, state.sourceId),
+ end: fromBabelLocation(node.body.loc.end, state.sourceId),
+ });
+ }
+ } else if (libExports$2.isClass(node)) {
+ if (libExports$2.isIdentifier(node.id)) {
+ // For decorated classes, the AST considers the first the decorator
+ // to be the start of the class. For the purposes of mapping class
+ // declarations however, we really want to look for the "class Foo"
+ // piece. To achieve that, we estimate the location of the declaration
+ // instead.
+ let declStart = node.loc.start;
+ if (node.decorators && node.decorators.length) {
+ // Estimate the location of the "class" keyword since it
+ // is unlikely to be a different line than the class name.
+ declStart = {
+ line: node.id.loc.start.line,
+ column: node.id.loc.start.column - "class ".length,
+ };
+ }
+
+ const declaration = {
+ start: fromBabelLocation(declStart, state.sourceId),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ };
+
+ if (libExports$2.isClassDeclaration(node)) {
+ state.declarationBindingIds.add(node.id);
+ state.scope.bindings[node.id.name] = {
+ type: "let",
+ refs: [
+ {
+ type: "class-decl",
+ start: fromBabelLocation(node.id.loc.start, state.sourceId),
+ end: fromBabelLocation(node.id.loc.end, state.sourceId),
+ declaration,
+ },
+ ],
+ };
+ }
+
+ const scope = pushTempScope(state, "block", "Class", {
+ start: fromBabelLocation(node.loc.start, state.sourceId),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ });
+
+ state.declarationBindingIds.add(node.id);
+ scope.bindings[node.id.name] = {
+ type: "const",
+ refs: [
+ {
+ type: "class-inner",
+ start: fromBabelLocation(node.id.loc.start, state.sourceId),
+ end: fromBabelLocation(node.id.loc.end, state.sourceId),
+ declaration,
+ },
+ ],
+ };
+ }
+ } else if (libExports$2.isForXStatement(node) || libExports$2.isForStatement(node)) {
+ const init = node.init || node.left;
+ if (isNode(init, "VariableDeclaration") && isLetOrConst(init)) {
+ // Debugger will create new lexical environment for the for.
+ pushTempScope(state, "block", "For", {
+ // Being at the start of a for loop doesn't count as
+ // being inside it.
+ start: fromBabelLocation(init.loc.start, state.sourceId),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ });
+ }
+ } else if (libExports$2.isCatchClause(node)) {
+ const scope = pushTempScope(state, "block", "Catch", {
+ start: fromBabelLocation(node.loc.start, state.sourceId),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ });
+ parseDeclarator(node.param, scope, "var", "catch", node, state);
+ } else if (
+ libExports$2.isBlockStatement(node) &&
+ // Function body's are handled in the function logic above.
+ !libExports$2.isFunction(parentNode) &&
+ hasLexicalDeclaration(node, parentNode)
+ ) {
+ // Debugger will create new lexical environment for the block.
+ pushTempScope(state, "block", "Block", {
+ start: fromBabelLocation(node.loc.start, state.sourceId),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ });
+ } else if (
+ libExports$2.isVariableDeclaration(node) &&
+ (node.kind === "var" ||
+ // Lexical declarations in for statements are handled above.
+ !libExports$2.isForStatement(parentNode, { init: node }) ||
+ !libExports$2.isForXStatement(parentNode, { left: node }))
+ ) {
+ // Finds right lexical environment
+ const hoistAt = !isLetOrConst(node)
+ ? getVarScope(state.scope)
+ : state.scope;
+ node.declarations.forEach(declarator => {
+ parseDeclarator(
+ declarator.id,
+ hoistAt,
+ node.kind,
+ node.kind,
+ node,
+ state
+ );
+ });
+ } else if (
+ libExports$2.isImportDeclaration(node) &&
+ (!node.importKind || node.importKind === "value")
+ ) {
+ node.specifiers.forEach(spec => {
+ if (spec.importKind && spec.importKind !== "value") {
+ return;
+ }
+
+ if (libExports$2.isImportNamespaceSpecifier(spec)) {
+ state.declarationBindingIds.add(spec.local);
+
+ state.scope.bindings[spec.local.name] = {
+ // Imported namespaces aren't live import bindings, they are
+ // just normal const bindings.
+ type: "const",
+ refs: [
+ {
+ type: "import-ns-decl",
+ start: fromBabelLocation(spec.local.loc.start, state.sourceId),
+ end: fromBabelLocation(spec.local.loc.end, state.sourceId),
+ declaration: {
+ start: fromBabelLocation(node.loc.start, state.sourceId),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ },
+ },
+ ],
+ };
+ } else {
+ state.declarationBindingIds.add(spec.local);
+
+ state.scope.bindings[spec.local.name] = {
+ type: "import",
+ refs: [
+ {
+ type: "import-decl",
+ start: fromBabelLocation(spec.local.loc.start, state.sourceId),
+ end: fromBabelLocation(spec.local.loc.end, state.sourceId),
+ importName: libExports$2.isImportDefaultSpecifier(spec)
+ ? "default"
+ : spec.imported.name,
+ declaration: {
+ start: fromBabelLocation(node.loc.start, state.sourceId),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ },
+ },
+ ],
+ };
+ }
+ });
+ } else if (libExports$2.isTSEnumDeclaration(node)) {
+ state.declarationBindingIds.add(node.id);
+ state.scope.bindings[node.id.name] = {
+ type: "const",
+ refs: [
+ {
+ type: "ts-enum-decl",
+ start: fromBabelLocation(node.id.loc.start, state.sourceId),
+ end: fromBabelLocation(node.id.loc.end, state.sourceId),
+ declaration: {
+ start: fromBabelLocation(node.loc.start, state.sourceId),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ },
+ },
+ ],
+ };
+ } else if (libExports$2.isTSModuleDeclaration(node)) {
+ state.declarationBindingIds.add(node.id);
+ state.scope.bindings[node.id.name] = {
+ type: "const",
+ refs: [
+ {
+ type: "ts-namespace-decl",
+ start: fromBabelLocation(node.id.loc.start, state.sourceId),
+ end: fromBabelLocation(node.id.loc.end, state.sourceId),
+ declaration: {
+ start: fromBabelLocation(node.loc.start, state.sourceId),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ },
+ },
+ ],
+ };
+ } else if (libExports$2.isTSModuleBlock(node)) {
+ pushTempScope(state, "block", "TypeScript Namespace", {
+ start: fromBabelLocation(node.loc.start, state.sourceId),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ });
+ } else if (
+ libExports$2.isIdentifier(node) &&
+ libExports$2.isReferenced(node, parentNode) &&
+ // Babel doesn't cover this in 'isReferenced' yet, but it should
+ // eventually.
+ !libExports$2.isTSEnumMember(parentNode, { id: node }) &&
+ !libExports$2.isTSModuleDeclaration(parentNode, { id: node }) &&
+ // isReferenced above fails to see `var { foo } = ...` as a non-reference
+ // because the direct parent is not enough to know that the pattern is
+ // used within a variable declaration.
+ !state.declarationBindingIds.has(node)
+ ) {
+ let freeVariables = state.freeVariables.get(node.name);
+ if (!freeVariables) {
+ freeVariables = [];
+ state.freeVariables.set(node.name, freeVariables);
+ }
+
+ freeVariables.push({
+ type: "ref",
+ start: fromBabelLocation(node.loc.start, state.sourceId),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ meta: buildMetaBindings(state.sourceId, node, ancestors),
+ });
+ } else if (isOpeningJSXIdentifier(node, ancestors)) {
+ let freeVariables = state.freeVariables.get(node.name);
+ if (!freeVariables) {
+ freeVariables = [];
+ state.freeVariables.set(node.name, freeVariables);
+ }
+
+ freeVariables.push({
+ type: "ref",
+ start: fromBabelLocation(node.loc.start, state.sourceId),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ meta: buildMetaBindings(state.sourceId, node, ancestors),
+ });
+ } else if (libExports$2.isThisExpression(node)) {
+ let freeVariables = state.freeVariables.get("this");
+ if (!freeVariables) {
+ freeVariables = [];
+ state.freeVariables.set("this", freeVariables);
+ }
+
+ freeVariables.push({
+ type: "ref",
+ start: fromBabelLocation(node.loc.start, state.sourceId),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ meta: buildMetaBindings(state.sourceId, node, ancestors),
+ });
+ } else if (libExports$2.isClassProperty(parentNode, { value: node })) {
+ const scope = pushTempScope(state, "function", "Class Field", {
+ start: fromBabelLocation(node.loc.start, state.sourceId),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ });
+ scope.bindings.this = {
+ type: "implicit",
+ refs: [],
+ };
+ scope.bindings.arguments = {
+ type: "implicit",
+ refs: [],
+ };
+ } else if (
+ libExports$2.isSwitchStatement(node) &&
+ hasLexicalDeclaration(node, parentNode)
+ ) {
+ pushTempScope(state, "block", "Switch", {
+ start: fromBabelLocation(node.loc.start, state.sourceId),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ });
+ }
+
+ if (
+ // In general Flow expressions are deleted, so they can't contain
+ // runtime bindings, but typecasts are the one exception there.
+ (libExports$2.isFlow(node) && !libExports$2.isTypeCastExpression(node)) ||
+ // In general TS items are deleted, but TS has a few wrapper node
+ // types that can contain general JS expressions.
+ (node.type.startsWith("TS") &&
+ !libExports$2.isTSTypeAssertion(node) &&
+ !libExports$2.isTSAsExpression(node) &&
+ !libExports$2.isTSNonNullExpression(node) &&
+ !libExports$2.isTSModuleDeclaration(node) &&
+ !libExports$2.isTSModuleBlock(node) &&
+ !libExports$2.isTSParameterProperty(node) &&
+ !libExports$2.isTSExportAssignment(node))
+ ) {
+ // Flag this node as a root "type" node. All items inside of this
+ // will be skipped entirely.
+ state.inType = node;
+ }
+ },
+ exit(node, ancestors, state) {
+ const currentScope = state.scope;
+ const parentScope = state.scopeStack.pop();
+ if (!parentScope) {
+ throw new Error("Assertion failure - unsynchronized pop");
+ }
+ state.scope = parentScope;
+
+ // It is possible, as in the case of function expressions, that a single
+ // node has added multiple scopes, so we need to traverse upward here
+ // rather than jumping stright to 'parentScope'.
+ for (
+ let scope = currentScope;
+ scope && scope !== parentScope;
+ scope = scope.parent
+ ) {
+ const { freeVariables } = state;
+ state.freeVariables = state.freeVariableStack.pop();
+ const parentFreeVariables = state.freeVariables;
+
+ // Match up any free variables that match this scope's bindings and
+ // merge then into the refs.
+ for (const key of Object.keys(scope.bindings)) {
+ const binding = scope.bindings[key];
+
+ const freeVars = freeVariables.get(key);
+ if (freeVars) {
+ binding.refs.push(...freeVars);
+ freeVariables.delete(key);
+ }
+ }
+
+ // Move any undeclared references in this scope into the parent for
+ // processing in higher scopes.
+ for (const [key, value] of freeVariables) {
+ let refs = parentFreeVariables.get(key);
+ if (!refs) {
+ refs = [];
+ parentFreeVariables.set(key, refs);
+ }
+
+ refs.push(...value);
+ }
+ }
+
+ if (state.inType === node) {
+ state.inType = null;
+ }
+ },
+ };
+
+ function isOpeningJSXIdentifier(node, ancestors) {
+ if (!libExports$2.isJSXIdentifier(node)) {
+ return false;
+ }
+
+ for (let i = ancestors.length - 1; i >= 0; i--) {
+ const { node: parent, key } = ancestors[i];
+
+ if (libExports$2.isJSXOpeningElement(parent) && key === "name") {
+ return true;
+ } else if (!libExports$2.isJSXMemberExpression(parent) || key !== "object") {
+ break;
+ }
+ }
+
+ return false;
+ }
+
+ function buildMetaBindings(
+ sourceId,
+ node,
+ ancestors,
+ parentIndex = ancestors.length - 1
+ ) {
+ if (parentIndex <= 1) {
+ return null;
+ }
+ const parent = ancestors[parentIndex].node;
+ const grandparent = ancestors[parentIndex - 1].node;
+
+ // Consider "0, foo" to be equivalent to "foo".
+ if (
+ libExports$2.isSequenceExpression(parent) &&
+ parent.expressions.length === 2 &&
+ libExports$2.isNumericLiteral(parent.expressions[0]) &&
+ parent.expressions[1] === node
+ ) {
+ let { start, end } = parent.loc;
+
+ if (libExports$2.isCallExpression(grandparent, { callee: parent })) {
+ // Attempt to expand the range around parentheses, e.g.
+ // (0, foo.bar)()
+ start = grandparent.loc.start;
+ end = Object.assign({}, end);
+ end.column += 1;
+ }
+
+ return {
+ type: "inherit",
+ start: fromBabelLocation(start, sourceId),
+ end: fromBabelLocation(end, sourceId),
+ parent: buildMetaBindings(sourceId, parent, ancestors, parentIndex - 1),
+ };
+ }
+
+ // Consider "Object(foo)", and "__webpack_require__.i(foo)" to be
+ // equivalent to "foo" since they are essentially identity functions.
+ if (
+ libExports$2.isCallExpression(parent) &&
+ (libExports$2.isIdentifier(parent.callee, { name: "Object" }) ||
+ (libExports$2.isMemberExpression(parent.callee, { computed: false }) &&
+ libExports$2.isIdentifier(parent.callee.object, { name: "__webpack_require__" }) &&
+ libExports$2.isIdentifier(parent.callee.property, { name: "i" }))) &&
+ parent.arguments.length === 1 &&
+ parent.arguments[0] === node
+ ) {
+ return {
+ type: "inherit",
+ start: fromBabelLocation(parent.loc.start, sourceId),
+ end: fromBabelLocation(parent.loc.end, sourceId),
+ parent: buildMetaBindings(sourceId, parent, ancestors, parentIndex - 1),
+ };
+ }
+
+ if (libExports$2.isMemberExpression(parent, { object: node })) {
+ if (parent.computed) {
+ if (libExports$2.isStringLiteral(parent.property)) {
+ return {
+ type: "member",
+ start: fromBabelLocation(parent.loc.start, sourceId),
+ end: fromBabelLocation(parent.loc.end, sourceId),
+ property: parent.property.value,
+ parent: buildMetaBindings(
+ sourceId,
+ parent,
+ ancestors,
+ parentIndex - 1
+ ),
+ };
+ }
+ } else {
+ return {
+ type: "member",
+ start: fromBabelLocation(parent.loc.start, sourceId),
+ end: fromBabelLocation(parent.loc.end, sourceId),
+ property: parent.property.name,
+ parent: buildMetaBindings(sourceId, parent, ancestors, parentIndex - 1),
+ };
+ }
+ }
+ if (
+ libExports$2.isCallExpression(parent, { callee: node }) &&
+ !parent.arguments.length
+ ) {
+ return {
+ type: "call",
+ start: fromBabelLocation(parent.loc.start, sourceId),
+ end: fromBabelLocation(parent.loc.end, sourceId),
+ parent: buildMetaBindings(sourceId, parent, ancestors, parentIndex - 1),
+ };
+ }
+
+ return null;
+ }
+
+ function looksLikeCommonJS(rootScope) {
+ const hasRefs = name =>
+ rootScope.bindings[name] && !!rootScope.bindings[name].refs.length;
+
+ return (
+ hasRefs("__dirname") ||
+ hasRefs("__filename") ||
+ hasRefs("require") ||
+ hasRefs("exports") ||
+ hasRefs("module")
+ );
+ }
+
+ function stripModuleScope(rootScope) {
+ const rootLexicalScope = rootScope.children[0];
+ const moduleScope = rootLexicalScope.children[0];
+ if (moduleScope.type !== "module") {
+ throw new Error("Assertion failure - should be module");
+ }
+
+ Object.keys(moduleScope.bindings).forEach(name => {
+ const binding = moduleScope.bindings[name];
+ if (binding.type === "let" || binding.type === "const") {
+ rootLexicalScope.bindings[name] = binding;
+ } else {
+ rootScope.bindings[name] = binding;
+ }
+ });
+ rootLexicalScope.children = moduleScope.children;
+ rootLexicalScope.children.forEach(child => {
+ child.parent = rootLexicalScope;
+ });
+ }
+
+ const parsedScopesCache = new Map();
+
+ function getScopes(location) {
+ const sourceId = location.source.id;
+ let parsedScopes = parsedScopesCache.get(sourceId);
+ if (!parsedScopes) {
+ parsedScopes = parseSourceScopes(sourceId);
+ parsedScopesCache.set(sourceId, parsedScopes);
+ }
+ return parsedScopes ? findScopes(parsedScopes, location) : [];
+ }
+
+ function clearScopes(sourceIds) {
+ for (const sourceId of sourceIds) {
+ parsedScopesCache.delete(sourceId);
+ }
+ }
+
+ /**
+ * Searches all scopes and their bindings at the specific location.
+ */
+ function findScopes(scopes, location) {
+ // Find inner most in the tree structure.
+ let searchInScopes = scopes;
+ const found = [];
+ while (searchInScopes) {
+ const foundOne = searchInScopes.some(s => {
+ if (
+ compareLocations(s.start, location) <= 0 &&
+ compareLocations(location, s.end) < 0
+ ) {
+ // Found the next scope, trying to search recusevly in its children.
+ found.unshift(s);
+ searchInScopes = s.children;
+ return true;
+ }
+ return false;
+ });
+ if (!foundOne) {
+ break;
+ }
+ }
+ return found.map(i => ({
+ type: i.type,
+ scopeKind: i.scopeKind,
+ displayName: i.displayName,
+ start: i.start,
+ end: i.end,
+ bindings: i.bindings,
+ }));
+ }
+
+ function compareLocations(a, b) {
+ // According to type of Location.column can be undefined, if will not be the
+ // case here, ignoring flow error.
+ return a.line == b.line ? a.column - b.column : a.line - b.line;
+ }
+
+ /* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+ function startsBefore(a, b) {
+ let before = a.start.line < b.line;
+ if (a.start.line === b.line) {
+ before =
+ a.start.column >= 0 && b.column >= 0 ? a.start.column <= b.column : true;
+ }
+ return before;
+ }
+
+ function endsAfter(a, b) {
+ let after = a.end.line > b.line;
+ if (a.end.line === b.line) {
+ after =
+ a.end.column >= 0 && b.column >= 0 ? a.end.column >= b.column : true;
+ }
+ return after;
+ }
+
+ function containsPosition(a, b) {
+ return startsBefore(a, b) && endsAfter(a, b);
+ }
+
+ function containsLocation(a, b) {
+ return containsPosition(a, b.start) && containsPosition(a, b.end);
+ }
+
+ function findSymbols(source) {
+ const { functions, comments } = getInternalSymbols(source);
+ return { functions, comments };
+ }
+
+ /**
+ * Returns the location for a given function path. If the path represents a
+ * function declaration, the location will begin after the function identifier
+ * but before the function parameters.
+ */
+
+ function getLocation(func) {
+ const location = { ...func.location };
+
+ // if the function has an identifier, start the block after it so the
+ // identifier is included in the "scope" of its parent
+ const identifierEnd = func?.identifier?.loc?.end;
+ if (identifierEnd) {
+ location.start = identifierEnd;
+ }
+
+ return location;
+ }
+
+ /**
+ * Find the nearest location containing the input position and
+ * return inner locations under that nearest location
+ *
+ * @param {Array<Object>} locations Notice! The locations MUST be sorted by `sortByStart`
+ * so that we can do linear time complexity operation.
+ * @returns {Array<Object>}
+ */
+ function getInnerLocations(locations, position) {
+ // First, let's find the nearest position-enclosing function location,
+ // which is to find the last location enclosing the position.
+ let parentIndex;
+ for (let i = locations.length - 1; i >= 0; i--) {
+ const loc = locations[i];
+ if (containsPosition(loc, position)) {
+ parentIndex = i;
+ break;
+ }
+ }
+
+ if (parentIndex == undefined) {
+ return [];
+ }
+ const parentLoc = locations[parentIndex];
+
+ // Then, from the nearest location, loop locations again and put locations into
+ // the innerLocations array until we get to a location not enclosed by the nearest location.
+ const innerLocations = [];
+ for (let i = parentIndex + 1; i < locations.length; i++) {
+ const loc = locations[i];
+ if (!containsLocation(parentLoc, loc)) {
+ break;
+ }
+
+ innerLocations.push(loc);
+ }
+
+ return innerLocations;
+ }
+
+ /**
+ * Return an new locations array which excludes
+ * items that are completely enclosed by another location in the input locations
+ *
+ * @param locations Notice! The locations MUST be sorted by `sortByStart`
+ * so that we can do linear time complexity operation.
+ */
+ function removeOverlaps(locations) {
+ if (!locations.length) {
+ return [];
+ }
+ const firstParent = locations[0];
+ return locations.reduce(deduplicateNode, [firstParent]);
+ }
+
+ function deduplicateNode(nodes, location) {
+ const parent = nodes[nodes.length - 1];
+ if (!containsLocation(parent, location)) {
+ nodes.push(location);
+ }
+ return nodes;
+ }
+
+ /**
+ * Sorts an array of locations by start position
+ */
+ function sortByStart(a, b) {
+ if (a.start.line < b.start.line) {
+ return -1;
+ } else if (a.start.line === b.start.line) {
+ return a.start.column - b.start.column;
+ }
+
+ return 1;
+ }
+
+ /**
+ * Returns an array of locations that are considered out of scope for the given
+ * location.
+ */
+ function findOutOfScopeLocations(location) {
+ const { functions, comments } = findSymbols(location.source.id);
+ const commentLocations = comments.map(c => c.location);
+ const locations = functions
+ .map(getLocation)
+ .concat(commentLocations)
+ .sort(sortByStart);
+
+ const innerLocations = getInnerLocations(locations, location);
+ const outerLocations = locations.filter(loc => {
+ if (innerLocations.includes(loc)) {
+ return false;
+ }
+
+ return !containsPosition(loc, location);
+ });
+ return removeOverlaps(outerLocations);
+ }
+
+ function findBestMatchExpression(sourceId, tokenPos) {
+ const symbols = getInternalSymbols(sourceId);
+ if (!symbols) {
+ return null;
+ }
+
+ const { line, column } = tokenPos;
+ const { memberExpressions, identifiers, literals } = symbols;
+
+ function matchExpression(expression) {
+ const { location } = expression;
+ const { start, end } = location;
+ return start.line == line && start.column <= column && end.column >= column;
+ }
+ function matchMemberExpression(expression) {
+ // For member expressions we ignore "computed" member expressions `foo[bar]`,
+ // to only match the one that looks like: `foo.bar`.
+ return !expression.computed && matchExpression(expression);
+ }
+ // Avoid duplicating these arrays and be careful about performance as they can be large
+ //
+ // Process member expressions first as they can be including identifiers which
+ // are subset of the member expression.
+ // Ex: `foo.bar` is a member expression made of `foo` and `bar` identifiers.
+ return (
+ memberExpressions.find(matchMemberExpression) ||
+ literals.find(matchExpression) ||
+ identifiers.find(matchExpression)
+ );
+ }
+
+ // NOTE: this will only work if we are replacing an original identifier
+ function replaceNode(ancestors, node) {
+ const ancestor = ancestors[ancestors.length - 1];
+
+ if (typeof ancestor.index === "number") {
+ ancestor.node[ancestor.key][ancestor.index] = node;
+ } else {
+ ancestor.node[ancestor.key] = node;
+ }
+ }
+
+ function getFirstExpression(ast) {
+ const statements = ast.program.body;
+ if (!statements.length) {
+ return null;
+ }
+
+ return statements[0].expression;
+ }
+
+ function locationKey(start) {
+ return `${start.line}:${start.column}`;
+ }
+
+ function mapOriginalExpression(expression, ast, mappings) {
+ const scopes = buildScopeList(ast, "");
+ let shouldUpdate = false;
+
+ const nodes = new Map();
+ const replacements = new Map();
+
+ // The ref-only global bindings are the ones that are accessed, but not
+ // declared anywhere in the parsed code, meaning they are either global,
+ // or declared somewhere in a scope outside the parsed code, so we
+ // rewrite all of those specifically to avoid rewritting declarations that
+ // shadow outer mappings.
+ for (const name of Object.keys(scopes[0].bindings)) {
+ const { refs } = scopes[0].bindings[name];
+ const mapping = mappings[name];
+
+ if (
+ !refs.every(ref => ref.type === "ref") ||
+ !mapping ||
+ mapping === name
+ ) {
+ continue;
+ }
+
+ let node = nodes.get(name);
+ if (!node) {
+ node = getFirstExpression(parseScript(mapping));
+ nodes.set(name, node);
+ }
+
+ for (const ref of refs) {
+ let { line, column } = ref.start;
+
+ // This shouldn't happen, just keeping Flow happy.
+ if (typeof column !== "number") {
+ column = 0;
+ }
+
+ replacements.set(locationKey({ line, column }), node);
+ }
+ }
+
+ if (replacements.size === 0) {
+ // Avoid the extra code generation work and also avoid potentially
+ // reformatting the user's code unnecessarily.
+ return expression;
+ }
+
+ libExports$2.traverse(ast, (node, ancestors) => {
+ if (!libExports$2.isIdentifier(node) && !libExports$2.isThisExpression(node)) {
+ return;
+ }
+
+ const ancestor = ancestors[ancestors.length - 1];
+ // Shorthand properties can have a key and value with `node.loc.start` value
+ // and we only want to replace the value.
+ if (libExports$2.isObjectProperty(ancestor.node) && ancestor.key !== "value") {
+ return;
+ }
+
+ const replacement = replacements.get(locationKey(node.loc.start));
+ if (replacement) {
+ replaceNode(ancestors, libExports$2.cloneNode(replacement));
+ shouldUpdate = true;
+ }
+ });
+
+ if (shouldUpdate) {
+ return generate(ast).code;
+ }
+
+ return expression;
+ }
+
+ function getAssignmentTarget(node, bindings) {
+ if (libExports$2.isObjectPattern(node)) {
+ for (const property of node.properties) {
+ if (libExports$2.isRestElement(property)) {
+ property.argument = getAssignmentTarget(property.argument, bindings);
+ } else {
+ property.value = getAssignmentTarget(property.value, bindings);
+ }
+ }
+
+ return node;
+ }
+
+ if (libExports$2.isArrayPattern(node)) {
+ for (const [i, element] of node.elements.entries()) {
+ node.elements[i] = getAssignmentTarget(element, bindings);
+ }
+
+ return node;
+ }
+
+ if (libExports$2.isAssignmentPattern(node)) {
+ node.left = getAssignmentTarget(node.left, bindings);
+
+ return node;
+ }
+
+ if (libExports$2.isRestElement(node)) {
+ node.argument = getAssignmentTarget(node.argument, bindings);
+
+ return node;
+ }
+
+ if (libExports$2.isIdentifier(node)) {
+ return bindings.includes(node.name)
+ ? node
+ : libExports$2.memberExpression(libExports$2.identifier("self"), node);
+ }
+
+ return node;
+ }
+
+ // translates new bindings `var a = 3` into `self.a = 3`
+ // and existing bindings `var a = 3` into `a = 3` for re-assignments
+ function globalizeDeclaration(node, bindings) {
+ return node.declarations.map(declaration =>
+ libExports$2.expressionStatement(
+ libExports$2.assignmentExpression(
+ "=",
+ getAssignmentTarget(declaration.id, bindings),
+ declaration.init || libExports$2.unaryExpression("void", libExports$2.numericLiteral(0))
+ )
+ )
+ );
+ }
+
+ // translates new bindings `a = 3` into `self.a = 3`
+ // and keeps assignments the same for existing bindings.
+ function globalizeAssignment(node, bindings) {
+ return libExports$2.assignmentExpression(
+ node.operator,
+ getAssignmentTarget(node.left, bindings),
+ node.right
+ );
+ }
+
+ function mapExpressionBindings(expression, ast, bindings = []) {
+ let isMapped = false;
+ let shouldUpdate = true;
+
+ libExports$2.traverse(ast, (node, ancestors) => {
+ const parent = ancestors[ancestors.length - 1];
+
+ if (libExports$2.isWithStatement(node)) {
+ shouldUpdate = false;
+ return;
+ }
+
+ if (!isTopLevel(ancestors)) {
+ return;
+ }
+
+ if (libExports$2.isAssignmentExpression(node)) {
+ if (libExports$2.isIdentifier(node.left) || libExports$2.isPattern(node.left)) {
+ const newNode = globalizeAssignment(node, bindings);
+ isMapped = true;
+ replaceNode$1(ancestors, newNode);
+ return;
+ }
+
+ return;
+ }
+
+ if (!libExports$2.isVariableDeclaration(node)) {
+ return;
+ }
+
+ if (!libExports$2.isForStatement(parent.node)) {
+ const newNodes = globalizeDeclaration(node, bindings);
+ isMapped = true;
+ replaceNode$1(ancestors, newNodes);
+ }
+ });
+
+ if (!shouldUpdate || !isMapped) {
+ return expression;
+ }
+
+ return generate(ast).code;
+ }
+
+ function hasTopLevelAwait(ast) {
+ const hasAwait = hasNode(
+ ast,
+ (node, ancestors, b) => libExports$2.isAwaitExpression(node) && isTopLevel(ancestors)
+ );
+
+ return hasAwait;
+ }
+
+ // translates new bindings `var a = 3` into `a = 3`.
+ function translateDeclarationIntoAssignment(node) {
+ return node.declarations.reduce((acc, declaration) => {
+ // Don't translate declaration without initial assignment (e.g. `var a;`)
+ if (!declaration.init) {
+ return acc;
+ }
+ acc.push(
+ libExports$2.expressionStatement(
+ libExports$2.assignmentExpression("=", declaration.id, declaration.init)
+ )
+ );
+ return acc;
+ }, []);
+ }
+
+ /**
+ * Given an AST, modify it to return the last evaluated statement's expression value if possible.
+ * This is to preserve existing console behavior of displaying the last executed expression value.
+ */
+ function addReturnNode(ast) {
+ const statements = ast.program.body;
+ const lastStatement = statements.pop();
+
+ // if the last expression is an awaitExpression, strip the `await` part and directly
+ // return the argument to avoid calling the argument's `then` function twice when the
+ // mapped expression gets evaluated (See Bug 1771428)
+ if (libExports$2.isAwaitExpression(lastStatement.expression)) {
+ lastStatement.expression = lastStatement.expression.argument;
+ }
+
+ // NOTE: For more complicated cases such as an if/for statement, the last evaluated
+ // expression value probably can not be displayed, unless doing hacky workarounds such
+ // as returning the `eval` of the final statement (won't always work due to CSP issues?)
+ // or SpiderMonkey support (See Bug 1839588) at which point this entire module can be removed.
+ statements.push(
+ libExports$2.isExpressionStatement(lastStatement)
+ ? libExports$2.returnStatement(lastStatement.expression)
+ : lastStatement
+ );
+ return statements;
+ }
+
+ function getDeclarations(node) {
+ const { kind, declarations } = node;
+ const declaratorNodes = declarations.reduce((acc, d) => {
+ const declarators = getVariableDeclarators(d.id);
+ return acc.concat(declarators);
+ }, []);
+
+ // We can't declare const variables outside of the async iife because we
+ // wouldn't be able to re-assign them. As a workaround, we transform them
+ // to `let` which should be good enough for those case.
+ return libExports$2.variableDeclaration(
+ kind === "const" ? "let" : kind,
+ declaratorNodes
+ );
+ }
+
+ function getVariableDeclarators(node) {
+ if (libExports$2.isIdentifier(node)) {
+ return libExports$2.variableDeclarator(libExports$2.identifier(node.name));
+ }
+
+ if (libExports$2.isObjectProperty(node)) {
+ return getVariableDeclarators(node.value);
+ }
+ if (libExports$2.isRestElement(node)) {
+ return getVariableDeclarators(node.argument);
+ }
+
+ if (libExports$2.isAssignmentPattern(node)) {
+ return getVariableDeclarators(node.left);
+ }
+
+ if (libExports$2.isArrayPattern(node)) {
+ return node.elements.reduce(
+ (acc, element) => acc.concat(getVariableDeclarators(element)),
+ []
+ );
+ }
+ if (libExports$2.isObjectPattern(node)) {
+ return node.properties.reduce(
+ (acc, property) => acc.concat(getVariableDeclarators(property)),
+ []
+ );
+ }
+ return [];
+ }
+
+ /**
+ * Given an AST and an array of variableDeclaration nodes, return a new AST with
+ * all the declarations at the top of the AST.
+ */
+ function addTopDeclarationNodes(ast, declarationNodes) {
+ const statements = [];
+ declarationNodes.forEach(declarationNode => {
+ statements.push(getDeclarations(declarationNode));
+ });
+ statements.push(ast);
+ return libExports$2.program(statements);
+ }
+
+ /**
+ * Given an AST, return an object of the following shape:
+ * - newAst: {AST} the AST where variable declarations were transformed into
+ * variable assignments
+ * - declarations: {Array<Node>} An array of all the declaration nodes needed
+ * outside of the async iife.
+ */
+ function translateDeclarationsIntoAssignment(ast) {
+ const declarations = [];
+ libExports$2.traverse(ast, (node, ancestors) => {
+ const parent = ancestors[ancestors.length - 1];
+
+ if (
+ libExports$2.isWithStatement(node) ||
+ !isTopLevel(ancestors) ||
+ libExports$2.isAssignmentExpression(node) ||
+ !libExports$2.isVariableDeclaration(node) ||
+ libExports$2.isForStatement(parent.node) ||
+ libExports$2.isForXStatement(parent.node) ||
+ !Array.isArray(node.declarations) ||
+ node.declarations.length === 0
+ ) {
+ return;
+ }
+
+ const newNodes = translateDeclarationIntoAssignment(node);
+ replaceNode$1(ancestors, newNodes);
+ declarations.push(node);
+ });
+
+ return {
+ newAst: ast,
+ declarations,
+ };
+ }
+
+ /**
+ * Given an AST, wrap its body in an async iife, transform variable declarations
+ * in assignments and move the variable declarations outside of the async iife.
+ * Example: With the AST for the following expression: `let a = await 123`, the
+ * function will return:
+ * let a;
+ * (async => {
+ * return a = await 123;
+ * })();
+ */
+ function wrapExpressionFromAst(ast) {
+ // Transform let and var declarations into assignments, and get back an array
+ // of variable declarations.
+ let { newAst, declarations } = translateDeclarationsIntoAssignment(ast);
+ const body = addReturnNode(newAst);
+
+ // Create the async iife.
+ newAst = libExports$2.expressionStatement(
+ libExports$2.callExpression(
+ libExports$2.arrowFunctionExpression([], libExports$2.blockStatement(body), true),
+ []
+ )
+ );
+
+ // Now let's put all the variable declarations at the top of the async iife.
+ newAst = addTopDeclarationNodes(newAst, declarations);
+
+ return generate(newAst).code;
+ }
+
+ function mapTopLevelAwait(expression, ast) {
+ if (!ast) {
+ // If there's no ast this means the expression is malformed. And if the
+ // expression contains the await keyword, we still want to wrap it in an
+ // async iife in order to get a meaningful message (without this, the
+ // engine will throw an Error stating that await keywords are only valid
+ // in async functions and generators).
+ if (expression.includes("await ")) {
+ return `(async () => { ${expression} })();`;
+ }
+
+ return expression;
+ }
+
+ if (!hasTopLevelAwait(ast)) {
+ return expression;
+ }
+
+ return wrapExpressionFromAst(ast);
+ }
+
+ function mapExpression(
+ expression,
+ mappings,
+ bindings,
+ shouldMapBindings = true,
+ shouldMapAwait = true
+ ) {
+ const mapped = {
+ await: false,
+ bindings: false,
+ originalExpression: false,
+ };
+
+ const ast = parseConsoleScript(expression);
+ try {
+ if (mappings && ast) {
+ const beforeOriginalExpression = expression;
+ expression = mapOriginalExpression(expression, ast, mappings);
+ mapped.originalExpression = beforeOriginalExpression !== expression;
+ }
+
+ if (shouldMapBindings && ast) {
+ const beforeBindings = expression;
+ expression = mapExpressionBindings(expression, ast, bindings);
+ mapped.bindings = beforeBindings !== expression;
+ }
+
+ if (shouldMapAwait) {
+ const beforeAwait = expression;
+ expression = mapTopLevelAwait(expression, ast);
+ mapped.await = beforeAwait !== expression;
+ }
+ } catch (e) {
+ console.warn(`Error when mapping ${expression} expression:`, e);
+ }
+
+ return {
+ expression,
+ mapped,
+ };
+ }
+
+ var workerUtils = {exports: {}};
+
+ var hasRequiredWorkerUtils;
+
+ function requireWorkerUtils () {
+ if (hasRequiredWorkerUtils) return workerUtils.exports;
+ hasRequiredWorkerUtils = 1;
+ (function (module) {
+
+ class WorkerDispatcher {
+ #msgId = 1;
+ #worker = null;
+ // Map of message ids -> promise resolution functions, for dispatching worker responses
+ #pendingCalls = new Map();
+ #url = "";
+
+ constructor(url) {
+ this.#url = url;
+ }
+
+ start() {
+ // When running in debugger jest test, we don't have access to ChromeWorker
+ if (typeof ChromeWorker == "function") {
+ this.#worker = new ChromeWorker(this.#url);
+ } else {
+ this.#worker = new Worker(this.#url);
+ }
+ this.#worker.onerror = err => {
+ console.error(`Error in worker ${this.#url}`, err.message);
+ };
+ this.#worker.addEventListener("message", this.#onMessage);
+ }
+
+ stop() {
+ if (!this.#worker) {
+ return;
+ }
+
+ this.#worker.removeEventListener("message", this.#onMessage);
+ this.#worker.terminate();
+ this.#worker = null;
+ this.#pendingCalls.clear();
+ }
+
+ task(method, { queue = false } = {}) {
+ const calls = [];
+ const push = args => {
+ return new Promise((resolve, reject) => {
+ if (queue && calls.length === 0) {
+ Promise.resolve().then(flush);
+ }
+
+ calls.push({ args, resolve, reject });
+
+ if (!queue) {
+ flush();
+ }
+ });
+ };
+
+ const flush = () => {
+ const items = calls.slice();
+ calls.length = 0;
+
+ if (!this.#worker) {
+ this.start();
+ }
+
+ const id = this.#msgId++;
+ this.#worker.postMessage({
+ id,
+ method,
+ calls: items.map(item => item.args),
+ });
+
+ this.#pendingCalls.set(id, items);
+ };
+
+ return (...args) => push(args);
+ }
+
+ invoke(method, ...args) {
+ return this.task(method)(...args);
+ }
+
+ #onMessage = ({ data: result }) => {
+ const items = this.#pendingCalls.get(result.id);
+ this.#pendingCalls.delete(result.id);
+ if (!items) {
+ return;
+ }
+
+ if (!this.#worker) {
+ return;
+ }
+
+ result.results.forEach((resultData, i) => {
+ const { resolve, reject } = items[i];
+
+ if (resultData.error) {
+ const err = new Error(resultData.message);
+ err.metadata = resultData.metadata;
+ reject(err);
+ } else {
+ resolve(resultData.response);
+ }
+ });
+ };
+ }
+
+ function workerHandler(publicInterface) {
+ return function (msg) {
+ const { id, method, calls } = msg.data;
+
+ Promise.all(
+ calls.map(args => {
+ try {
+ const response = publicInterface[method].apply(undefined, args);
+ if (response instanceof Promise) {
+ return response.then(
+ val => ({ response: val }),
+ err => asErrorMessage(err)
+ );
+ }
+ return { response };
+ } catch (error) {
+ return asErrorMessage(error);
+ }
+ })
+ ).then(results => {
+ globalThis.postMessage({ id, results });
+ });
+ };
+ }
+
+ function asErrorMessage(error) {
+ if (typeof error === "object" && error && "message" in error) {
+ // Error can't be sent via postMessage, so be sure to convert to
+ // string.
+ return {
+ error: true,
+ message: error.message,
+ metadata: error.metadata,
+ };
+ }
+
+ return {
+ error: true,
+ message: error == null ? error : error.toString(),
+ metadata: undefined,
+ };
+ }
+
+ // Might be loaded within a worker thread where `module` isn't available.
+ {
+ module.exports = {
+ WorkerDispatcher,
+ workerHandler,
+ };
+ }
+ } (workerUtils));
+ return workerUtils.exports;
+ }
+
+ var workerUtilsExports = requireWorkerUtils();
+
+ function clearAllHelpersForSources(sourceIds) {
+ clearASTs(sourceIds);
+ clearScopes(sourceIds);
+ clearSources(sourceIds);
+ clearSymbols(sourceIds);
+ }
+
+ self.onmessage = workerUtilsExports.workerHandler({
+ findOutOfScopeLocations,
+ findBestMatchExpression,
+ getSymbols,
+ getFunctionSymbols,
+ getClassSymbols,
+ getClosestFunctionName,
+ getScopes,
+ clearSources: clearAllHelpersForSources,
+ mapExpression,
+ setSource,
+ });
+
+}));
diff --git a/devtools/client/debugger/dist/pretty-print-worker.js b/devtools/client/debugger/dist/pretty-print-worker.js
new file mode 100644
index 0000000000..3336c32a1b
--- /dev/null
+++ b/devtools/client/debugger/dist/pretty-print-worker.js
@@ -0,0 +1,10624 @@
+(function (factory) {
+ typeof define === 'function' && define.amd ? define(factory) :
+ factory();
+})((function () { 'use strict';
+
+ (function() {
+ const env = {"NODE_ENV":"production"};
+ try {
+ if (process) {
+ process.env = Object.assign({}, process.env);
+ Object.assign(process.env, env);
+ return;
+ }
+ } catch (e) {} // avoid ReferenceError: process is not defined
+ globalThis.process = { env:env };
+ })();
+
+ var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
+
+ function getAugmentedNamespace(n) {
+ if (n.__esModule) return n;
+ var f = n.default;
+ if (typeof f == "function") {
+ var a = function a () {
+ if (this instanceof a) {
+ var args = [null];
+ args.push.apply(args, arguments);
+ var Ctor = Function.bind.apply(f, args);
+ return new Ctor();
+ }
+ return f.apply(this, arguments);
+ };
+ a.prototype = f.prototype;
+ } else a = {};
+ Object.defineProperty(a, '__esModule', {value: true});
+ Object.keys(n).forEach(function (k) {
+ var d = Object.getOwnPropertyDescriptor(n, k);
+ Object.defineProperty(a, k, d.get ? d : {
+ enumerable: true,
+ get: function () {
+ return n[k];
+ }
+ });
+ });
+ return a;
+ }
+
+ var sourceMap$1 = {};
+
+ var sourceMapGenerator = {};
+
+ var base64Vlq = {};
+
+ var base64 = {};
+
+ var hasRequiredBase64;
+
+ function requireBase64 () {
+ if (hasRequiredBase64) return base64;
+ hasRequiredBase64 = 1;
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ const intToCharMap = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("");
+
+ /**
+ * Encode an integer in the range of 0 to 63 to a single base 64 digit.
+ */
+ base64.encode = function(number) {
+ if (0 <= number && number < intToCharMap.length) {
+ return intToCharMap[number];
+ }
+ throw new TypeError("Must be between 0 and 63: " + number);
+ };
+ return base64;
+ }
+
+ var hasRequiredBase64Vlq;
+
+ function requireBase64Vlq () {
+ if (hasRequiredBase64Vlq) return base64Vlq;
+ hasRequiredBase64Vlq = 1;
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ *
+ * Based on the Base 64 VLQ implementation in Closure Compiler:
+ * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java
+ *
+ * Copyright 2011 The Closure Compiler Authors. All rights reserved.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+ const base64 = requireBase64();
+
+ // A single base 64 digit can contain 6 bits of data. For the base 64 variable
+ // length quantities we use in the source map spec, the first bit is the sign,
+ // the next four bits are the actual value, and the 6th bit is the
+ // continuation bit. The continuation bit tells us whether there are more
+ // digits in this value following this digit.
+ //
+ // Continuation
+ // | Sign
+ // | |
+ // V V
+ // 101011
+
+ const VLQ_BASE_SHIFT = 5;
+
+ // binary: 100000
+ const VLQ_BASE = 1 << VLQ_BASE_SHIFT;
+
+ // binary: 011111
+ const VLQ_BASE_MASK = VLQ_BASE - 1;
+
+ // binary: 100000
+ const VLQ_CONTINUATION_BIT = VLQ_BASE;
+
+ /**
+ * Converts from a two-complement value to a value where the sign bit is
+ * placed in the least significant bit. For example, as decimals:
+ * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary)
+ * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary)
+ */
+ function toVLQSigned(aValue) {
+ return aValue < 0
+ ? ((-aValue) << 1) + 1
+ : (aValue << 1) + 0;
+ }
+
+ /**
+ * Returns the base 64 VLQ encoded value.
+ */
+ base64Vlq.encode = function base64VLQ_encode(aValue) {
+ let encoded = "";
+ let digit;
+
+ let vlq = toVLQSigned(aValue);
+
+ do {
+ digit = vlq & VLQ_BASE_MASK;
+ vlq >>>= VLQ_BASE_SHIFT;
+ if (vlq > 0) {
+ // There are still more digits in this value, so we must make sure the
+ // continuation bit is marked.
+ digit |= VLQ_CONTINUATION_BIT;
+ }
+ encoded += base64.encode(digit);
+ } while (vlq > 0);
+
+ return encoded;
+ };
+ return base64Vlq;
+ }
+
+ var util = {};
+
+ var hasRequiredUtil;
+
+ function requireUtil () {
+ if (hasRequiredUtil) return util;
+ hasRequiredUtil = 1;
+ (function (exports) {
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ /**
+ * This is a helper function for getting values from parameter/options
+ * objects.
+ *
+ * @param args The object we are extracting values from
+ * @param name The name of the property we are getting.
+ * @param defaultValue An optional value to return if the property is missing
+ * from the object. If this is not specified and the property is missing, an
+ * error will be thrown.
+ */
+ function getArg(aArgs, aName, aDefaultValue) {
+ if (aName in aArgs) {
+ return aArgs[aName];
+ } else if (arguments.length === 3) {
+ return aDefaultValue;
+ }
+ throw new Error('"' + aName + '" is a required argument.');
+
+ }
+ exports.getArg = getArg;
+
+ const urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/;
+ const dataUrlRegexp = /^data:.+\,.+$/;
+
+ function urlParse(aUrl) {
+ const match = aUrl.match(urlRegexp);
+ if (!match) {
+ return null;
+ }
+ return {
+ scheme: match[1],
+ auth: match[2],
+ host: match[3],
+ port: match[4],
+ path: match[5]
+ };
+ }
+ exports.urlParse = urlParse;
+
+ function urlGenerate(aParsedUrl) {
+ let url = "";
+ if (aParsedUrl.scheme) {
+ url += aParsedUrl.scheme + ":";
+ }
+ url += "//";
+ if (aParsedUrl.auth) {
+ url += aParsedUrl.auth + "@";
+ }
+ if (aParsedUrl.host) {
+ url += aParsedUrl.host;
+ }
+ if (aParsedUrl.port) {
+ url += ":" + aParsedUrl.port;
+ }
+ if (aParsedUrl.path) {
+ url += aParsedUrl.path;
+ }
+ return url;
+ }
+ exports.urlGenerate = urlGenerate;
+
+ const MAX_CACHED_INPUTS = 32;
+
+ /**
+ * Takes some function `f(input) -> result` and returns a memoized version of
+ * `f`.
+ *
+ * We keep at most `MAX_CACHED_INPUTS` memoized results of `f` alive. The
+ * memoization is a dumb-simple, linear least-recently-used cache.
+ */
+ function lruMemoize(f) {
+ const cache = [];
+
+ return function(input) {
+ for (let i = 0; i < cache.length; i++) {
+ if (cache[i].input === input) {
+ const temp = cache[0];
+ cache[0] = cache[i];
+ cache[i] = temp;
+ return cache[0].result;
+ }
+ }
+
+ const result = f(input);
+
+ cache.unshift({
+ input,
+ result,
+ });
+
+ if (cache.length > MAX_CACHED_INPUTS) {
+ cache.pop();
+ }
+
+ return result;
+ };
+ }
+
+ /**
+ * Normalizes a path, or the path portion of a URL:
+ *
+ * - Replaces consecutive slashes with one slash.
+ * - Removes unnecessary '.' parts.
+ * - Removes unnecessary '<dir>/..' parts.
+ *
+ * Based on code in the Node.js 'path' core module.
+ *
+ * @param aPath The path or url to normalize.
+ */
+ const normalize = lruMemoize(function normalize(aPath) {
+ let path = aPath;
+ const url = urlParse(aPath);
+ if (url) {
+ if (!url.path) {
+ return aPath;
+ }
+ path = url.path;
+ }
+ const isAbsolute = exports.isAbsolute(path);
+
+ // Split the path into parts between `/` characters. This is much faster than
+ // using `.split(/\/+/g)`.
+ const parts = [];
+ let start = 0;
+ let i = 0;
+ while (true) {
+ start = i;
+ i = path.indexOf("/", start);
+ if (i === -1) {
+ parts.push(path.slice(start));
+ break;
+ } else {
+ parts.push(path.slice(start, i));
+ while (i < path.length && path[i] === "/") {
+ i++;
+ }
+ }
+ }
+
+ let up = 0;
+ for (i = parts.length - 1; i >= 0; i--) {
+ const part = parts[i];
+ if (part === ".") {
+ parts.splice(i, 1);
+ } else if (part === "..") {
+ up++;
+ } else if (up > 0) {
+ if (part === "") {
+ // The first part is blank if the path is absolute. Trying to go
+ // above the root is a no-op. Therefore we can remove all '..' parts
+ // directly after the root.
+ parts.splice(i + 1, up);
+ up = 0;
+ } else {
+ parts.splice(i, 2);
+ up--;
+ }
+ }
+ }
+ path = parts.join("/");
+
+ if (path === "") {
+ path = isAbsolute ? "/" : ".";
+ }
+
+ if (url) {
+ url.path = path;
+ return urlGenerate(url);
+ }
+ return path;
+ });
+ exports.normalize = normalize;
+
+ /**
+ * Joins two paths/URLs.
+ *
+ * @param aRoot The root path or URL.
+ * @param aPath The path or URL to be joined with the root.
+ *
+ * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a
+ * scheme-relative URL: Then the scheme of aRoot, if any, is prepended
+ * first.
+ * - Otherwise aPath is a path. If aRoot is a URL, then its path portion
+ * is updated with the result and aRoot is returned. Otherwise the result
+ * is returned.
+ * - If aPath is absolute, the result is aPath.
+ * - Otherwise the two paths are joined with a slash.
+ * - Joining for example 'http://' and 'www.example.com' is also supported.
+ */
+ function join(aRoot, aPath) {
+ if (aRoot === "") {
+ aRoot = ".";
+ }
+ if (aPath === "") {
+ aPath = ".";
+ }
+ const aPathUrl = urlParse(aPath);
+ const aRootUrl = urlParse(aRoot);
+ if (aRootUrl) {
+ aRoot = aRootUrl.path || "/";
+ }
+
+ // `join(foo, '//www.example.org')`
+ if (aPathUrl && !aPathUrl.scheme) {
+ if (aRootUrl) {
+ aPathUrl.scheme = aRootUrl.scheme;
+ }
+ return urlGenerate(aPathUrl);
+ }
+
+ if (aPathUrl || aPath.match(dataUrlRegexp)) {
+ return aPath;
+ }
+
+ // `join('http://', 'www.example.com')`
+ if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {
+ aRootUrl.host = aPath;
+ return urlGenerate(aRootUrl);
+ }
+
+ const joined = aPath.charAt(0) === "/"
+ ? aPath
+ : normalize(aRoot.replace(/\/+$/, "") + "/" + aPath);
+
+ if (aRootUrl) {
+ aRootUrl.path = joined;
+ return urlGenerate(aRootUrl);
+ }
+ return joined;
+ }
+ exports.join = join;
+
+ exports.isAbsolute = function(aPath) {
+ return aPath.charAt(0) === "/" || urlRegexp.test(aPath);
+ };
+
+ /**
+ * Make a path relative to a URL or another path.
+ *
+ * @param aRoot The root path or URL.
+ * @param aPath The path or URL to be made relative to aRoot.
+ */
+ function relative(aRoot, aPath) {
+ if (aRoot === "") {
+ aRoot = ".";
+ }
+
+ aRoot = aRoot.replace(/\/$/, "");
+
+ // It is possible for the path to be above the root. In this case, simply
+ // checking whether the root is a prefix of the path won't work. Instead, we
+ // need to remove components from the root one by one, until either we find
+ // a prefix that fits, or we run out of components to remove.
+ let level = 0;
+ while (aPath.indexOf(aRoot + "/") !== 0) {
+ const index = aRoot.lastIndexOf("/");
+ if (index < 0) {
+ return aPath;
+ }
+
+ // If the only part of the root that is left is the scheme (i.e. http://,
+ // file:///, etc.), one or more slashes (/), or simply nothing at all, we
+ // have exhausted all components, so the path is not relative to the root.
+ aRoot = aRoot.slice(0, index);
+ if (aRoot.match(/^([^\/]+:\/)?\/*$/)) {
+ return aPath;
+ }
+
+ ++level;
+ }
+
+ // Make sure we add a "../" for each component we removed from the root.
+ return Array(level + 1).join("../") + aPath.substr(aRoot.length + 1);
+ }
+ exports.relative = relative;
+
+ const supportsNullProto = (function() {
+ const obj = Object.create(null);
+ return !("__proto__" in obj);
+ }());
+
+ function identity(s) {
+ return s;
+ }
+
+ /**
+ * Because behavior goes wacky when you set `__proto__` on objects, we
+ * have to prefix all the strings in our set with an arbitrary character.
+ *
+ * See https://github.com/mozilla/source-map/pull/31 and
+ * https://github.com/mozilla/source-map/issues/30
+ *
+ * @param String aStr
+ */
+ function toSetString(aStr) {
+ if (isProtoString(aStr)) {
+ return "$" + aStr;
+ }
+
+ return aStr;
+ }
+ exports.toSetString = supportsNullProto ? identity : toSetString;
+
+ function fromSetString(aStr) {
+ if (isProtoString(aStr)) {
+ return aStr.slice(1);
+ }
+
+ return aStr;
+ }
+ exports.fromSetString = supportsNullProto ? identity : fromSetString;
+
+ function isProtoString(s) {
+ if (!s) {
+ return false;
+ }
+
+ const length = s.length;
+
+ if (length < 9 /* "__proto__".length */) {
+ return false;
+ }
+
+ /* eslint-disable no-multi-spaces */
+ if (s.charCodeAt(length - 1) !== 95 /* '_' */ ||
+ s.charCodeAt(length - 2) !== 95 /* '_' */ ||
+ s.charCodeAt(length - 3) !== 111 /* 'o' */ ||
+ s.charCodeAt(length - 4) !== 116 /* 't' */ ||
+ s.charCodeAt(length - 5) !== 111 /* 'o' */ ||
+ s.charCodeAt(length - 6) !== 114 /* 'r' */ ||
+ s.charCodeAt(length - 7) !== 112 /* 'p' */ ||
+ s.charCodeAt(length - 8) !== 95 /* '_' */ ||
+ s.charCodeAt(length - 9) !== 95 /* '_' */) {
+ return false;
+ }
+ /* eslint-enable no-multi-spaces */
+
+ for (let i = length - 10; i >= 0; i--) {
+ if (s.charCodeAt(i) !== 36 /* '$' */) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Comparator between two mappings where the original positions are compared.
+ *
+ * Optionally pass in `true` as `onlyCompareGenerated` to consider two
+ * mappings with the same original source/line/column, but different generated
+ * line and column the same. Useful when searching for a mapping with a
+ * stubbed out mapping.
+ */
+ function compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {
+ let cmp = strcmp(mappingA.source, mappingB.source);
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalLine - mappingB.originalLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalColumn - mappingB.originalColumn;
+ if (cmp !== 0 || onlyCompareOriginal) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ return strcmp(mappingA.name, mappingB.name);
+ }
+ exports.compareByOriginalPositions = compareByOriginalPositions;
+
+ /**
+ * Comparator between two mappings with deflated source and name indices where
+ * the generated positions are compared.
+ *
+ * Optionally pass in `true` as `onlyCompareGenerated` to consider two
+ * mappings with the same generated line and column, but different
+ * source/name/original line and column the same. Useful when searching for a
+ * mapping with a stubbed out mapping.
+ */
+ function compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {
+ let cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp !== 0 || onlyCompareGenerated) {
+ return cmp;
+ }
+
+ cmp = strcmp(mappingA.source, mappingB.source);
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalLine - mappingB.originalLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalColumn - mappingB.originalColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ return strcmp(mappingA.name, mappingB.name);
+ }
+ exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;
+
+ function strcmp(aStr1, aStr2) {
+ if (aStr1 === aStr2) {
+ return 0;
+ }
+
+ if (aStr1 === null) {
+ return 1; // aStr2 !== null
+ }
+
+ if (aStr2 === null) {
+ return -1; // aStr1 !== null
+ }
+
+ if (aStr1 > aStr2) {
+ return 1;
+ }
+
+ return -1;
+ }
+
+ /**
+ * Comparator between two mappings with inflated source and name strings where
+ * the generated positions are compared.
+ */
+ function compareByGeneratedPositionsInflated(mappingA, mappingB) {
+ let cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = strcmp(mappingA.source, mappingB.source);
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalLine - mappingB.originalLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalColumn - mappingB.originalColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ return strcmp(mappingA.name, mappingB.name);
+ }
+ exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;
+
+ /**
+ * Strip any JSON XSSI avoidance prefix from the string (as documented
+ * in the source maps specification), and then parse the string as
+ * JSON.
+ */
+ function parseSourceMapInput(str) {
+ return JSON.parse(str.replace(/^\)]}'[^\n]*\n/, ""));
+ }
+ exports.parseSourceMapInput = parseSourceMapInput;
+
+ /**
+ * Compute the URL of a source given the the source root, the source's
+ * URL, and the source map's URL.
+ */
+ function computeSourceURL(sourceRoot, sourceURL, sourceMapURL) {
+ sourceURL = sourceURL || "";
+
+ if (sourceRoot) {
+ // This follows what Chrome does.
+ if (sourceRoot[sourceRoot.length - 1] !== "/" && sourceURL[0] !== "/") {
+ sourceRoot += "/";
+ }
+ // The spec says:
+ // Line 4: An optional source root, useful for relocating source
+ // files on a server or removing repeated values in the
+ // “sources” entry. This value is prepended to the individual
+ // entries in the “source” field.
+ sourceURL = sourceRoot + sourceURL;
+ }
+
+ // Historically, SourceMapConsumer did not take the sourceMapURL as
+ // a parameter. This mode is still somewhat supported, which is why
+ // this code block is conditional. However, it's preferable to pass
+ // the source map URL to SourceMapConsumer, so that this function
+ // can implement the source URL resolution algorithm as outlined in
+ // the spec. This block is basically the equivalent of:
+ // new URL(sourceURL, sourceMapURL).toString()
+ // ... except it avoids using URL, which wasn't available in the
+ // older releases of node still supported by this library.
+ //
+ // The spec says:
+ // If the sources are not absolute URLs after prepending of the
+ // “sourceRoot”, the sources are resolved relative to the
+ // SourceMap (like resolving script src in a html document).
+ if (sourceMapURL) {
+ const parsed = urlParse(sourceMapURL);
+ if (!parsed) {
+ throw new Error("sourceMapURL could not be parsed");
+ }
+ if (parsed.path) {
+ // Strip the last path component, but keep the "/".
+ const index = parsed.path.lastIndexOf("/");
+ if (index >= 0) {
+ parsed.path = parsed.path.substring(0, index + 1);
+ }
+ }
+ sourceURL = join(urlGenerate(parsed), sourceURL);
+ }
+
+ return normalize(sourceURL);
+ }
+ exports.computeSourceURL = computeSourceURL;
+ } (util));
+ return util;
+ }
+
+ var arraySet = {};
+
+ var hasRequiredArraySet;
+
+ function requireArraySet () {
+ if (hasRequiredArraySet) return arraySet;
+ hasRequiredArraySet = 1;
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ /**
+ * A data structure which is a combination of an array and a set. Adding a new
+ * member is O(1), testing for membership is O(1), and finding the index of an
+ * element is O(1). Removing elements from the set is not supported. Only
+ * strings are supported for membership.
+ */
+ class ArraySet {
+ constructor() {
+ this._array = [];
+ this._set = new Map();
+ }
+
+ /**
+ * Static method for creating ArraySet instances from an existing array.
+ */
+ static fromArray(aArray, aAllowDuplicates) {
+ const set = new ArraySet();
+ for (let i = 0, len = aArray.length; i < len; i++) {
+ set.add(aArray[i], aAllowDuplicates);
+ }
+ return set;
+ }
+
+ /**
+ * Return how many unique items are in this ArraySet. If duplicates have been
+ * added, than those do not count towards the size.
+ *
+ * @returns Number
+ */
+ size() {
+ return this._set.size;
+ }
+
+ /**
+ * Add the given string to this set.
+ *
+ * @param String aStr
+ */
+ add(aStr, aAllowDuplicates) {
+ const isDuplicate = this.has(aStr);
+ const idx = this._array.length;
+ if (!isDuplicate || aAllowDuplicates) {
+ this._array.push(aStr);
+ }
+ if (!isDuplicate) {
+ this._set.set(aStr, idx);
+ }
+ }
+
+ /**
+ * Is the given string a member of this set?
+ *
+ * @param String aStr
+ */
+ has(aStr) {
+ return this._set.has(aStr);
+ }
+
+ /**
+ * What is the index of the given string in the array?
+ *
+ * @param String aStr
+ */
+ indexOf(aStr) {
+ const idx = this._set.get(aStr);
+ if (idx >= 0) {
+ return idx;
+ }
+ throw new Error('"' + aStr + '" is not in the set.');
+ }
+
+ /**
+ * What is the element at the given index?
+ *
+ * @param Number aIdx
+ */
+ at(aIdx) {
+ if (aIdx >= 0 && aIdx < this._array.length) {
+ return this._array[aIdx];
+ }
+ throw new Error("No element indexed by " + aIdx);
+ }
+
+ /**
+ * Returns the array representation of this set (which has the proper indices
+ * indicated by indexOf). Note that this is a copy of the internal array used
+ * for storing the members so that no one can mess with internal state.
+ */
+ toArray() {
+ return this._array.slice();
+ }
+ }
+ arraySet.ArraySet = ArraySet;
+ return arraySet;
+ }
+
+ var mappingList = {};
+
+ var hasRequiredMappingList;
+
+ function requireMappingList () {
+ if (hasRequiredMappingList) return mappingList;
+ hasRequiredMappingList = 1;
+ /*
+ * Copyright 2014 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ const util = requireUtil();
+
+ /**
+ * Determine whether mappingB is after mappingA with respect to generated
+ * position.
+ */
+ function generatedPositionAfter(mappingA, mappingB) {
+ // Optimized for most common case
+ const lineA = mappingA.generatedLine;
+ const lineB = mappingB.generatedLine;
+ const columnA = mappingA.generatedColumn;
+ const columnB = mappingB.generatedColumn;
+ return lineB > lineA || lineB == lineA && columnB >= columnA ||
+ util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;
+ }
+
+ /**
+ * A data structure to provide a sorted view of accumulated mappings in a
+ * performance conscious manner. It trades a negligible overhead in general
+ * case for a large speedup in case of mappings being added in order.
+ */
+ class MappingList {
+ constructor() {
+ this._array = [];
+ this._sorted = true;
+ // Serves as infimum
+ this._last = {generatedLine: -1, generatedColumn: 0};
+ }
+
+ /**
+ * Iterate through internal items. This method takes the same arguments that
+ * `Array.prototype.forEach` takes.
+ *
+ * NOTE: The order of the mappings is NOT guaranteed.
+ */
+ unsortedForEach(aCallback, aThisArg) {
+ this._array.forEach(aCallback, aThisArg);
+ }
+
+ /**
+ * Add the given source mapping.
+ *
+ * @param Object aMapping
+ */
+ add(aMapping) {
+ if (generatedPositionAfter(this._last, aMapping)) {
+ this._last = aMapping;
+ this._array.push(aMapping);
+ } else {
+ this._sorted = false;
+ this._array.push(aMapping);
+ }
+ }
+
+ /**
+ * Returns the flat, sorted array of mappings. The mappings are sorted by
+ * generated position.
+ *
+ * WARNING: This method returns internal data without copying, for
+ * performance. The return value must NOT be mutated, and should be treated as
+ * an immutable borrow. If you want to take ownership, you must make your own
+ * copy.
+ */
+ toArray() {
+ if (!this._sorted) {
+ this._array.sort(util.compareByGeneratedPositionsInflated);
+ this._sorted = true;
+ }
+ return this._array;
+ }
+ }
+
+ mappingList.MappingList = MappingList;
+ return mappingList;
+ }
+
+ var hasRequiredSourceMapGenerator;
+
+ function requireSourceMapGenerator () {
+ if (hasRequiredSourceMapGenerator) return sourceMapGenerator;
+ hasRequiredSourceMapGenerator = 1;
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ const base64VLQ = requireBase64Vlq();
+ const util = requireUtil();
+ const ArraySet = requireArraySet().ArraySet;
+ const MappingList = requireMappingList().MappingList;
+
+ /**
+ * An instance of the SourceMapGenerator represents a source map which is
+ * being built incrementally. You may pass an object with the following
+ * properties:
+ *
+ * - file: The filename of the generated source.
+ * - sourceRoot: A root for all relative URLs in this source map.
+ */
+ class SourceMapGenerator {
+ constructor(aArgs) {
+ if (!aArgs) {
+ aArgs = {};
+ }
+ this._file = util.getArg(aArgs, "file", null);
+ this._sourceRoot = util.getArg(aArgs, "sourceRoot", null);
+ this._skipValidation = util.getArg(aArgs, "skipValidation", false);
+ this._sources = new ArraySet();
+ this._names = new ArraySet();
+ this._mappings = new MappingList();
+ this._sourcesContents = null;
+ }
+
+ /**
+ * Creates a new SourceMapGenerator based on a SourceMapConsumer
+ *
+ * @param aSourceMapConsumer The SourceMap.
+ */
+ static fromSourceMap(aSourceMapConsumer) {
+ const sourceRoot = aSourceMapConsumer.sourceRoot;
+ const generator = new SourceMapGenerator({
+ file: aSourceMapConsumer.file,
+ sourceRoot
+ });
+ aSourceMapConsumer.eachMapping(function(mapping) {
+ const newMapping = {
+ generated: {
+ line: mapping.generatedLine,
+ column: mapping.generatedColumn
+ }
+ };
+
+ if (mapping.source != null) {
+ newMapping.source = mapping.source;
+ if (sourceRoot != null) {
+ newMapping.source = util.relative(sourceRoot, newMapping.source);
+ }
+
+ newMapping.original = {
+ line: mapping.originalLine,
+ column: mapping.originalColumn
+ };
+
+ if (mapping.name != null) {
+ newMapping.name = mapping.name;
+ }
+ }
+
+ generator.addMapping(newMapping);
+ });
+ aSourceMapConsumer.sources.forEach(function(sourceFile) {
+ let sourceRelative = sourceFile;
+ if (sourceRoot !== null) {
+ sourceRelative = util.relative(sourceRoot, sourceFile);
+ }
+
+ if (!generator._sources.has(sourceRelative)) {
+ generator._sources.add(sourceRelative);
+ }
+
+ const content = aSourceMapConsumer.sourceContentFor(sourceFile);
+ if (content != null) {
+ generator.setSourceContent(sourceFile, content);
+ }
+ });
+ return generator;
+ }
+
+ /**
+ * Add a single mapping from original source line and column to the generated
+ * source's line and column for this source map being created. The mapping
+ * object should have the following properties:
+ *
+ * - generated: An object with the generated line and column positions.
+ * - original: An object with the original line and column positions.
+ * - source: The original source file (relative to the sourceRoot).
+ * - name: An optional original token name for this mapping.
+ */
+ addMapping(aArgs) {
+ const generated = util.getArg(aArgs, "generated");
+ const original = util.getArg(aArgs, "original", null);
+ let source = util.getArg(aArgs, "source", null);
+ let name = util.getArg(aArgs, "name", null);
+
+ if (!this._skipValidation) {
+ this._validateMapping(generated, original, source, name);
+ }
+
+ if (source != null) {
+ source = String(source);
+ if (!this._sources.has(source)) {
+ this._sources.add(source);
+ }
+ }
+
+ if (name != null) {
+ name = String(name);
+ if (!this._names.has(name)) {
+ this._names.add(name);
+ }
+ }
+
+ this._mappings.add({
+ generatedLine: generated.line,
+ generatedColumn: generated.column,
+ originalLine: original != null && original.line,
+ originalColumn: original != null && original.column,
+ source,
+ name
+ });
+ }
+
+ /**
+ * Set the source content for a source file.
+ */
+ setSourceContent(aSourceFile, aSourceContent) {
+ let source = aSourceFile;
+ if (this._sourceRoot != null) {
+ source = util.relative(this._sourceRoot, source);
+ }
+
+ if (aSourceContent != null) {
+ // Add the source content to the _sourcesContents map.
+ // Create a new _sourcesContents map if the property is null.
+ if (!this._sourcesContents) {
+ this._sourcesContents = Object.create(null);
+ }
+ this._sourcesContents[util.toSetString(source)] = aSourceContent;
+ } else if (this._sourcesContents) {
+ // Remove the source file from the _sourcesContents map.
+ // If the _sourcesContents map is empty, set the property to null.
+ delete this._sourcesContents[util.toSetString(source)];
+ if (Object.keys(this._sourcesContents).length === 0) {
+ this._sourcesContents = null;
+ }
+ }
+ }
+
+ /**
+ * Applies the mappings of a sub-source-map for a specific source file to the
+ * source map being generated. Each mapping to the supplied source file is
+ * rewritten using the supplied source map. Note: The resolution for the
+ * resulting mappings is the minimium of this map and the supplied map.
+ *
+ * @param aSourceMapConsumer The source map to be applied.
+ * @param aSourceFile Optional. The filename of the source file.
+ * If omitted, SourceMapConsumer's file property will be used.
+ * @param aSourceMapPath Optional. The dirname of the path to the source map
+ * to be applied. If relative, it is relative to the SourceMapConsumer.
+ * This parameter is needed when the two source maps aren't in the same
+ * directory, and the source map to be applied contains relative source
+ * paths. If so, those relative source paths need to be rewritten
+ * relative to the SourceMapGenerator.
+ */
+ applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {
+ let sourceFile = aSourceFile;
+ // If aSourceFile is omitted, we will use the file property of the SourceMap
+ if (aSourceFile == null) {
+ if (aSourceMapConsumer.file == null) {
+ throw new Error(
+ "SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, " +
+ 'or the source map\'s "file" property. Both were omitted.'
+ );
+ }
+ sourceFile = aSourceMapConsumer.file;
+ }
+ const sourceRoot = this._sourceRoot;
+ // Make "sourceFile" relative if an absolute Url is passed.
+ if (sourceRoot != null) {
+ sourceFile = util.relative(sourceRoot, sourceFile);
+ }
+ // Applying the SourceMap can add and remove items from the sources and
+ // the names array.
+ const newSources = this._mappings.toArray().length > 0
+ ? new ArraySet()
+ : this._sources;
+ const newNames = new ArraySet();
+
+ // Find mappings for the "sourceFile"
+ this._mappings.unsortedForEach(function(mapping) {
+ if (mapping.source === sourceFile && mapping.originalLine != null) {
+ // Check if it can be mapped by the source map, then update the mapping.
+ const original = aSourceMapConsumer.originalPositionFor({
+ line: mapping.originalLine,
+ column: mapping.originalColumn
+ });
+ if (original.source != null) {
+ // Copy mapping
+ mapping.source = original.source;
+ if (aSourceMapPath != null) {
+ mapping.source = util.join(aSourceMapPath, mapping.source);
+ }
+ if (sourceRoot != null) {
+ mapping.source = util.relative(sourceRoot, mapping.source);
+ }
+ mapping.originalLine = original.line;
+ mapping.originalColumn = original.column;
+ if (original.name != null) {
+ mapping.name = original.name;
+ }
+ }
+ }
+
+ const source = mapping.source;
+ if (source != null && !newSources.has(source)) {
+ newSources.add(source);
+ }
+
+ const name = mapping.name;
+ if (name != null && !newNames.has(name)) {
+ newNames.add(name);
+ }
+
+ }, this);
+ this._sources = newSources;
+ this._names = newNames;
+
+ // Copy sourcesContents of applied map.
+ aSourceMapConsumer.sources.forEach(function(srcFile) {
+ const content = aSourceMapConsumer.sourceContentFor(srcFile);
+ if (content != null) {
+ if (aSourceMapPath != null) {
+ srcFile = util.join(aSourceMapPath, srcFile);
+ }
+ if (sourceRoot != null) {
+ srcFile = util.relative(sourceRoot, srcFile);
+ }
+ this.setSourceContent(srcFile, content);
+ }
+ }, this);
+ }
+
+ /**
+ * A mapping can have one of the three levels of data:
+ *
+ * 1. Just the generated position.
+ * 2. The Generated position, original position, and original source.
+ * 3. Generated and original position, original source, as well as a name
+ * token.
+ *
+ * To maintain consistency, we validate that any new mapping being added falls
+ * in to one of these categories.
+ */
+ _validateMapping(aGenerated, aOriginal, aSource, aName) {
+ // When aOriginal is truthy but has empty values for .line and .column,
+ // it is most likely a programmer error. In this case we throw a very
+ // specific error message to try to guide them the right way.
+ // For example: https://github.com/Polymer/polymer-bundler/pull/519
+ if (aOriginal && typeof aOriginal.line !== "number" && typeof aOriginal.column !== "number") {
+ throw new Error(
+ "original.line and original.column are not numbers -- you probably meant to omit " +
+ "the original mapping entirely and only map the generated position. If so, pass " +
+ "null for the original mapping instead of an object with empty or null values."
+ );
+ }
+
+ if (aGenerated && "line" in aGenerated && "column" in aGenerated
+ && aGenerated.line > 0 && aGenerated.column >= 0
+ && !aOriginal && !aSource && !aName) ; else if (aGenerated && "line" in aGenerated && "column" in aGenerated
+ && aOriginal && "line" in aOriginal && "column" in aOriginal
+ && aGenerated.line > 0 && aGenerated.column >= 0
+ && aOriginal.line > 0 && aOriginal.column >= 0
+ && aSource) ; else {
+ throw new Error("Invalid mapping: " + JSON.stringify({
+ generated: aGenerated,
+ source: aSource,
+ original: aOriginal,
+ name: aName
+ }));
+ }
+ }
+
+ /**
+ * Serialize the accumulated mappings in to the stream of base 64 VLQs
+ * specified by the source map format.
+ */
+ _serializeMappings() {
+ let previousGeneratedColumn = 0;
+ let previousGeneratedLine = 1;
+ let previousOriginalColumn = 0;
+ let previousOriginalLine = 0;
+ let previousName = 0;
+ let previousSource = 0;
+ let result = "";
+ let next;
+ let mapping;
+ let nameIdx;
+ let sourceIdx;
+
+ const mappings = this._mappings.toArray();
+ for (let i = 0, len = mappings.length; i < len; i++) {
+ mapping = mappings[i];
+ next = "";
+
+ if (mapping.generatedLine !== previousGeneratedLine) {
+ previousGeneratedColumn = 0;
+ while (mapping.generatedLine !== previousGeneratedLine) {
+ next += ";";
+ previousGeneratedLine++;
+ }
+ } else if (i > 0) {
+ if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {
+ continue;
+ }
+ next += ",";
+ }
+
+ next += base64VLQ.encode(mapping.generatedColumn
+ - previousGeneratedColumn);
+ previousGeneratedColumn = mapping.generatedColumn;
+
+ if (mapping.source != null) {
+ sourceIdx = this._sources.indexOf(mapping.source);
+ next += base64VLQ.encode(sourceIdx - previousSource);
+ previousSource = sourceIdx;
+
+ // lines are stored 0-based in SourceMap spec version 3
+ next += base64VLQ.encode(mapping.originalLine - 1
+ - previousOriginalLine);
+ previousOriginalLine = mapping.originalLine - 1;
+
+ next += base64VLQ.encode(mapping.originalColumn
+ - previousOriginalColumn);
+ previousOriginalColumn = mapping.originalColumn;
+
+ if (mapping.name != null) {
+ nameIdx = this._names.indexOf(mapping.name);
+ next += base64VLQ.encode(nameIdx - previousName);
+ previousName = nameIdx;
+ }
+ }
+
+ result += next;
+ }
+
+ return result;
+ }
+
+ _generateSourcesContent(aSources, aSourceRoot) {
+ return aSources.map(function(source) {
+ if (!this._sourcesContents) {
+ return null;
+ }
+ if (aSourceRoot != null) {
+ source = util.relative(aSourceRoot, source);
+ }
+ const key = util.toSetString(source);
+ return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)
+ ? this._sourcesContents[key]
+ : null;
+ }, this);
+ }
+
+ /**
+ * Externalize the source map.
+ */
+ toJSON() {
+ const map = {
+ version: this._version,
+ sources: this._sources.toArray(),
+ names: this._names.toArray(),
+ mappings: this._serializeMappings()
+ };
+ if (this._file != null) {
+ map.file = this._file;
+ }
+ if (this._sourceRoot != null) {
+ map.sourceRoot = this._sourceRoot;
+ }
+ if (this._sourcesContents) {
+ map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);
+ }
+
+ return map;
+ }
+
+ /**
+ * Render the source map being generated to a string.
+ */
+ toString() {
+ return JSON.stringify(this.toJSON());
+ }
+ }
+
+ SourceMapGenerator.prototype._version = 3;
+ sourceMapGenerator.SourceMapGenerator = SourceMapGenerator;
+ return sourceMapGenerator;
+ }
+
+ var sourceMapConsumer = {};
+
+ var binarySearch = {};
+
+ var hasRequiredBinarySearch;
+
+ function requireBinarySearch () {
+ if (hasRequiredBinarySearch) return binarySearch;
+ hasRequiredBinarySearch = 1;
+ (function (exports) {
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ exports.GREATEST_LOWER_BOUND = 1;
+ exports.LEAST_UPPER_BOUND = 2;
+
+ /**
+ * Recursive implementation of binary search.
+ *
+ * @param aLow Indices here and lower do not contain the needle.
+ * @param aHigh Indices here and higher do not contain the needle.
+ * @param aNeedle The element being searched for.
+ * @param aHaystack The non-empty array being searched.
+ * @param aCompare Function which takes two elements and returns -1, 0, or 1.
+ * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
+ * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ */
+ function recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {
+ // This function terminates when one of the following is true:
+ //
+ // 1. We find the exact element we are looking for.
+ //
+ // 2. We did not find the exact element, but we can return the index of
+ // the next-closest element.
+ //
+ // 3. We did not find the exact element, and there is no next-closest
+ // element than the one we are searching for, so we return -1.
+ const mid = Math.floor((aHigh - aLow) / 2) + aLow;
+ const cmp = aCompare(aNeedle, aHaystack[mid], true);
+ if (cmp === 0) {
+ // Found the element we are looking for.
+ return mid;
+ } else if (cmp > 0) {
+ // Our needle is greater than aHaystack[mid].
+ if (aHigh - mid > 1) {
+ // The element is in the upper half.
+ return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);
+ }
+
+ // The exact needle element was not found in this haystack. Determine if
+ // we are in termination case (3) or (2) and return the appropriate thing.
+ if (aBias == exports.LEAST_UPPER_BOUND) {
+ return aHigh < aHaystack.length ? aHigh : -1;
+ }
+ return mid;
+ }
+
+ // Our needle is less than aHaystack[mid].
+ if (mid - aLow > 1) {
+ // The element is in the lower half.
+ return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);
+ }
+
+ // we are in termination case (3) or (2) and return the appropriate thing.
+ if (aBias == exports.LEAST_UPPER_BOUND) {
+ return mid;
+ }
+ return aLow < 0 ? -1 : aLow;
+ }
+
+ /**
+ * This is an implementation of binary search which will always try and return
+ * the index of the closest element if there is no exact hit. This is because
+ * mappings between original and generated line/col pairs are single points,
+ * and there is an implicit region between each of them, so a miss just means
+ * that you aren't on the very start of a region.
+ *
+ * @param aNeedle The element you are looking for.
+ * @param aHaystack The array that is being searched.
+ * @param aCompare A function which takes the needle and an element in the
+ * array and returns -1, 0, or 1 depending on whether the needle is less
+ * than, equal to, or greater than the element, respectively.
+ * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
+ * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.
+ */
+ exports.search = function search(aNeedle, aHaystack, aCompare, aBias) {
+ if (aHaystack.length === 0) {
+ return -1;
+ }
+
+ let index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,
+ aCompare, aBias || exports.GREATEST_LOWER_BOUND);
+ if (index < 0) {
+ return -1;
+ }
+
+ // We have found either the exact element, or the next-closest element than
+ // the one we are searching for. However, there may be more than one such
+ // element. Make sure we always return the smallest of these.
+ while (index - 1 >= 0) {
+ if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {
+ break;
+ }
+ --index;
+ }
+
+ return index;
+ };
+ } (binarySearch));
+ return binarySearch;
+ }
+
+ var readWasm = {exports: {}};
+
+ var empty = {};
+
+ var empty$1 = /*#__PURE__*/Object.freeze({
+ __proto__: null,
+ default: empty
+ });
+
+ var require$$0 = /*@__PURE__*/getAugmentedNamespace(empty$1);
+
+ // Copyright Joyent, Inc. and other Node contributors.
+ //
+ // 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.
+
+ // resolves . and .. elements in a path array with directory names there
+ // must be no slashes, empty elements, or device names (c:\) in the array
+ // (so also no leading and trailing slashes - it does not distinguish
+ // relative and absolute paths)
+ function normalizeArray(parts, allowAboveRoot) {
+ // if the path tries to go above the root, `up` ends up > 0
+ var up = 0;
+ for (var i = parts.length - 1; i >= 0; i--) {
+ var last = parts[i];
+ if (last === '.') {
+ parts.splice(i, 1);
+ } else if (last === '..') {
+ parts.splice(i, 1);
+ up++;
+ } else if (up) {
+ parts.splice(i, 1);
+ up--;
+ }
+ }
+
+ // if the path is allowed to go above the root, restore leading ..s
+ if (allowAboveRoot) {
+ for (; up--; up) {
+ parts.unshift('..');
+ }
+ }
+
+ return parts;
+ }
+
+ // Split a filename into [root, dir, basename, ext], unix version
+ // 'root' is just a slash, or nothing.
+ var splitPathRe =
+ /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
+ var splitPath = function(filename) {
+ return splitPathRe.exec(filename).slice(1);
+ };
+
+ // path.resolve([from ...], to)
+ // posix version
+ function resolve() {
+ var resolvedPath = '',
+ resolvedAbsolute = false;
+
+ for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
+ var path = (i >= 0) ? arguments[i] : '/';
+
+ // Skip empty and invalid entries
+ if (typeof path !== 'string') {
+ throw new TypeError('Arguments to path.resolve must be strings');
+ } else if (!path) {
+ continue;
+ }
+
+ resolvedPath = path + '/' + resolvedPath;
+ resolvedAbsolute = path.charAt(0) === '/';
+ }
+
+ // At this point the path should be resolved to a full absolute path, but
+ // handle relative paths to be safe (might happen when process.cwd() fails)
+
+ // Normalize the path
+ resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {
+ return !!p;
+ }), !resolvedAbsolute).join('/');
+
+ return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
+ }
+ // path.normalize(path)
+ // posix version
+ function normalize(path) {
+ var isPathAbsolute = isAbsolute(path),
+ trailingSlash = substr(path, -1) === '/';
+
+ // Normalize the path
+ path = normalizeArray(filter(path.split('/'), function(p) {
+ return !!p;
+ }), !isPathAbsolute).join('/');
+
+ if (!path && !isPathAbsolute) {
+ path = '.';
+ }
+ if (path && trailingSlash) {
+ path += '/';
+ }
+
+ return (isPathAbsolute ? '/' : '') + path;
+ }
+ // posix version
+ function isAbsolute(path) {
+ return path.charAt(0) === '/';
+ }
+
+ // posix version
+ function join() {
+ var paths = Array.prototype.slice.call(arguments, 0);
+ return normalize(filter(paths, function(p, index) {
+ if (typeof p !== 'string') {
+ throw new TypeError('Arguments to path.join must be strings');
+ }
+ return p;
+ }).join('/'));
+ }
+
+
+ // path.relative(from, to)
+ // posix version
+ function relative(from, to) {
+ from = resolve(from).substr(1);
+ to = resolve(to).substr(1);
+
+ function trim(arr) {
+ var start = 0;
+ for (; start < arr.length; start++) {
+ if (arr[start] !== '') break;
+ }
+
+ var end = arr.length - 1;
+ for (; end >= 0; end--) {
+ if (arr[end] !== '') break;
+ }
+
+ if (start > end) return [];
+ return arr.slice(start, end - start + 1);
+ }
+
+ var fromParts = trim(from.split('/'));
+ var toParts = trim(to.split('/'));
+
+ var length = Math.min(fromParts.length, toParts.length);
+ var samePartsLength = length;
+ for (var i = 0; i < length; i++) {
+ if (fromParts[i] !== toParts[i]) {
+ samePartsLength = i;
+ break;
+ }
+ }
+
+ var outputParts = [];
+ for (var i = samePartsLength; i < fromParts.length; i++) {
+ outputParts.push('..');
+ }
+
+ outputParts = outputParts.concat(toParts.slice(samePartsLength));
+
+ return outputParts.join('/');
+ }
+
+ var sep = '/';
+ var delimiter = ':';
+
+ function dirname(path) {
+ var result = splitPath(path),
+ root = result[0],
+ dir = result[1];
+
+ if (!root && !dir) {
+ // No dirname whatsoever
+ return '.';
+ }
+
+ if (dir) {
+ // It has a dirname, strip trailing slash
+ dir = dir.substr(0, dir.length - 1);
+ }
+
+ return root + dir;
+ }
+
+ function basename(path, ext) {
+ var f = splitPath(path)[2];
+ // TODO: make this comparison case-insensitive on windows?
+ if (ext && f.substr(-1 * ext.length) === ext) {
+ f = f.substr(0, f.length - ext.length);
+ }
+ return f;
+ }
+
+
+ function extname(path) {
+ return splitPath(path)[3];
+ }
+ var path = {
+ extname: extname,
+ basename: basename,
+ dirname: dirname,
+ sep: sep,
+ delimiter: delimiter,
+ relative: relative,
+ join: join,
+ isAbsolute: isAbsolute,
+ normalize: normalize,
+ resolve: resolve
+ };
+ function filter (xs, f) {
+ if (xs.filter) return xs.filter(f);
+ var res = [];
+ for (var i = 0; i < xs.length; i++) {
+ if (f(xs[i], i, xs)) res.push(xs[i]);
+ }
+ return res;
+ }
+
+ // String.prototype.substr - negative index don't work in IE8
+ var substr = 'ab'.substr(-1) === 'b' ?
+ function (str, start, len) { return str.substr(start, len) } :
+ function (str, start, len) {
+ if (start < 0) start = str.length + start;
+ return str.substr(start, len);
+ }
+ ;
+
+ var path$1 = /*#__PURE__*/Object.freeze({
+ __proto__: null,
+ basename: basename,
+ default: path,
+ delimiter: delimiter,
+ dirname: dirname,
+ extname: extname,
+ isAbsolute: isAbsolute,
+ join: join,
+ normalize: normalize,
+ relative: relative,
+ resolve: resolve,
+ sep: sep
+ });
+
+ var require$$1 = /*@__PURE__*/getAugmentedNamespace(path$1);
+
+ var hasRequiredReadWasm;
+
+ function requireReadWasm () {
+ if (hasRequiredReadWasm) return readWasm.exports;
+ hasRequiredReadWasm = 1;
+ const isBrowserEnvironment = (function() {
+ // eslint-disable-next-line no-undef
+ return (typeof window !== "undefined") && (this === window);
+ }).call();
+
+ if (isBrowserEnvironment) {
+ // Web version of reading a wasm file into an array buffer.
+
+ let mappingsWasm = null;
+
+ readWasm.exports = function readWasm() {
+ if (typeof mappingsWasm === "string") {
+ return fetch(mappingsWasm)
+ .then(response => response.arrayBuffer());
+ }
+ if (mappingsWasm instanceof ArrayBuffer) {
+ return Promise.resolve(mappingsWasm);
+ }
+ throw new Error("You must provide the string URL or ArrayBuffer contents " +
+ "of lib/mappings.wasm by calling " +
+ "SourceMapConsumer.initialize({ 'lib/mappings.wasm': ... }) " +
+ "before using SourceMapConsumer");
+ };
+
+ readWasm.exports.initialize = input => mappingsWasm = input;
+ } else {
+ // Node version of reading a wasm file into an array buffer.
+ const fs = require$$0;
+ const path = require$$1;
+
+ readWasm.exports = function readWasm() {
+ return new Promise((resolve, reject) => {
+ const wasmPath = path.join(__dirname, "mappings.wasm");
+ fs.readFile(wasmPath, null, (error, data) => {
+ if (error) {
+ reject(error);
+ return;
+ }
+
+ resolve(data.buffer);
+ });
+ });
+ };
+
+ readWasm.exports.initialize = _ => {
+ console.debug("SourceMapConsumer.initialize is a no-op when running in node.js");
+ };
+ }
+ return readWasm.exports;
+ }
+
+ var wasm;
+ var hasRequiredWasm;
+
+ function requireWasm () {
+ if (hasRequiredWasm) return wasm;
+ hasRequiredWasm = 1;
+ const readWasm = requireReadWasm();
+
+ /**
+ * Provide the JIT with a nice shape / hidden class.
+ */
+ function Mapping() {
+ this.generatedLine = 0;
+ this.generatedColumn = 0;
+ this.lastGeneratedColumn = null;
+ this.source = null;
+ this.originalLine = null;
+ this.originalColumn = null;
+ this.name = null;
+ }
+
+ let cachedWasm = null;
+
+ wasm = function wasm() {
+ if (cachedWasm) {
+ return cachedWasm;
+ }
+
+ const callbackStack = [];
+
+ cachedWasm = readWasm().then(buffer => {
+ return WebAssembly.instantiate(buffer, {
+ env: {
+ mapping_callback(
+ generatedLine,
+ generatedColumn,
+
+ hasLastGeneratedColumn,
+ lastGeneratedColumn,
+
+ hasOriginal,
+ source,
+ originalLine,
+ originalColumn,
+
+ hasName,
+ name
+ ) {
+ const mapping = new Mapping();
+ // JS uses 1-based line numbers, wasm uses 0-based.
+ mapping.generatedLine = generatedLine + 1;
+ mapping.generatedColumn = generatedColumn;
+
+ if (hasLastGeneratedColumn) {
+ // JS uses inclusive last generated column, wasm uses exclusive.
+ mapping.lastGeneratedColumn = lastGeneratedColumn - 1;
+ }
+
+ if (hasOriginal) {
+ mapping.source = source;
+ // JS uses 1-based line numbers, wasm uses 0-based.
+ mapping.originalLine = originalLine + 1;
+ mapping.originalColumn = originalColumn;
+
+ if (hasName) {
+ mapping.name = name;
+ }
+ }
+
+ callbackStack[callbackStack.length - 1](mapping);
+ },
+
+ start_all_generated_locations_for() { console.time("all_generated_locations_for"); },
+ end_all_generated_locations_for() { console.timeEnd("all_generated_locations_for"); },
+
+ start_compute_column_spans() { console.time("compute_column_spans"); },
+ end_compute_column_spans() { console.timeEnd("compute_column_spans"); },
+
+ start_generated_location_for() { console.time("generated_location_for"); },
+ end_generated_location_for() { console.timeEnd("generated_location_for"); },
+
+ start_original_location_for() { console.time("original_location_for"); },
+ end_original_location_for() { console.timeEnd("original_location_for"); },
+
+ start_parse_mappings() { console.time("parse_mappings"); },
+ end_parse_mappings() { console.timeEnd("parse_mappings"); },
+
+ start_sort_by_generated_location() { console.time("sort_by_generated_location"); },
+ end_sort_by_generated_location() { console.timeEnd("sort_by_generated_location"); },
+
+ start_sort_by_original_location() { console.time("sort_by_original_location"); },
+ end_sort_by_original_location() { console.timeEnd("sort_by_original_location"); },
+ }
+ });
+ }).then(Wasm => {
+ return {
+ exports: Wasm.instance.exports,
+ withMappingCallback: (mappingCallback, f) => {
+ callbackStack.push(mappingCallback);
+ try {
+ f();
+ } finally {
+ callbackStack.pop();
+ }
+ }
+ };
+ }).then(null, e => {
+ cachedWasm = null;
+ throw e;
+ });
+
+ return cachedWasm;
+ };
+ return wasm;
+ }
+
+ var hasRequiredSourceMapConsumer;
+
+ function requireSourceMapConsumer () {
+ if (hasRequiredSourceMapConsumer) return sourceMapConsumer;
+ hasRequiredSourceMapConsumer = 1;
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ const util = requireUtil();
+ const binarySearch = requireBinarySearch();
+ const ArraySet = requireArraySet().ArraySet;
+ requireBase64Vlq(); // eslint-disable-line no-unused-vars
+ const readWasm = requireReadWasm();
+ const wasm = requireWasm();
+
+ const INTERNAL = Symbol("smcInternal");
+
+ class SourceMapConsumer {
+ constructor(aSourceMap, aSourceMapURL) {
+ // If the constructor was called by super(), just return Promise<this>.
+ // Yes, this is a hack to retain the pre-existing API of the base-class
+ // constructor also being an async factory function.
+ if (aSourceMap == INTERNAL) {
+ return Promise.resolve(this);
+ }
+
+ return _factory(aSourceMap, aSourceMapURL);
+ }
+
+ static initialize(opts) {
+ readWasm.initialize(opts["lib/mappings.wasm"]);
+ }
+
+ static fromSourceMap(aSourceMap, aSourceMapURL) {
+ return _factoryBSM(aSourceMap, aSourceMapURL);
+ }
+
+ /**
+ * Construct a new `SourceMapConsumer` from `rawSourceMap` and `sourceMapUrl`
+ * (see the `SourceMapConsumer` constructor for details. Then, invoke the `async
+ * function f(SourceMapConsumer) -> T` with the newly constructed consumer, wait
+ * for `f` to complete, call `destroy` on the consumer, and return `f`'s return
+ * value.
+ *
+ * You must not use the consumer after `f` completes!
+ *
+ * By using `with`, you do not have to remember to manually call `destroy` on
+ * the consumer, since it will be called automatically once `f` completes.
+ *
+ * ```js
+ * const xSquared = await SourceMapConsumer.with(
+ * myRawSourceMap,
+ * null,
+ * async function (consumer) {
+ * // Use `consumer` inside here and don't worry about remembering
+ * // to call `destroy`.
+ *
+ * const x = await whatever(consumer);
+ * return x * x;
+ * }
+ * );
+ *
+ * // You may not use that `consumer` anymore out here; it has
+ * // been destroyed. But you can use `xSquared`.
+ * console.log(xSquared);
+ * ```
+ */
+ static async with(rawSourceMap, sourceMapUrl, f) {
+ const consumer = await new SourceMapConsumer(rawSourceMap, sourceMapUrl);
+ try {
+ return await f(consumer);
+ } finally {
+ consumer.destroy();
+ }
+ }
+
+ /**
+ * Parse the mappings in a string in to a data structure which we can easily
+ * query (the ordered arrays in the `this.__generatedMappings` and
+ * `this.__originalMappings` properties).
+ */
+ _parseMappings(aStr, aSourceRoot) {
+ throw new Error("Subclasses must implement _parseMappings");
+ }
+
+ /**
+ * Iterate over each mapping between an original source/line/column and a
+ * generated line/column in this source map.
+ *
+ * @param Function aCallback
+ * The function that is called with each mapping.
+ * @param Object aContext
+ * Optional. If specified, this object will be the value of `this` every
+ * time that `aCallback` is called.
+ * @param aOrder
+ * Either `SourceMapConsumer.GENERATED_ORDER` or
+ * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to
+ * iterate over the mappings sorted by the generated file's line/column
+ * order or the original's source/line/column order, respectively. Defaults to
+ * `SourceMapConsumer.GENERATED_ORDER`.
+ */
+ eachMapping(aCallback, aContext, aOrder) {
+ throw new Error("Subclasses must implement eachMapping");
+ }
+
+ /**
+ * Returns all generated line and column information for the original source,
+ * line, and column provided. If no column is provided, returns all mappings
+ * corresponding to a either the line we are searching for or the next
+ * closest line that has any mappings. Otherwise, returns all mappings
+ * corresponding to the given line and either the column we are searching for
+ * or the next closest column that has any offsets.
+ *
+ * The only argument is an object with the following properties:
+ *
+ * - source: The filename of the original source.
+ * - line: The line number in the original source. The line number is 1-based.
+ * - column: Optional. the column number in the original source.
+ * The column number is 0-based.
+ *
+ * and an array of objects is returned, each with the following properties:
+ *
+ * - line: The line number in the generated source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the generated source, or null.
+ * The column number is 0-based.
+ */
+ allGeneratedPositionsFor(aArgs) {
+ throw new Error("Subclasses must implement allGeneratedPositionsFor");
+ }
+
+ destroy() {
+ throw new Error("Subclasses must implement destroy");
+ }
+ }
+
+ /**
+ * The version of the source mapping spec that we are consuming.
+ */
+ SourceMapConsumer.prototype._version = 3;
+ SourceMapConsumer.GENERATED_ORDER = 1;
+ SourceMapConsumer.ORIGINAL_ORDER = 2;
+
+ SourceMapConsumer.GREATEST_LOWER_BOUND = 1;
+ SourceMapConsumer.LEAST_UPPER_BOUND = 2;
+
+ sourceMapConsumer.SourceMapConsumer = SourceMapConsumer;
+
+ /**
+ * A BasicSourceMapConsumer instance represents a parsed source map which we can
+ * query for information about the original file positions by giving it a file
+ * position in the generated source.
+ *
+ * The first parameter is the raw source map (either as a JSON string, or
+ * already parsed to an object). According to the spec, source maps have the
+ * following attributes:
+ *
+ * - version: Which version of the source map spec this map is following.
+ * - sources: An array of URLs to the original source files.
+ * - names: An array of identifiers which can be referenced by individual mappings.
+ * - sourceRoot: Optional. The URL root from which all sources are relative.
+ * - sourcesContent: Optional. An array of contents of the original source files.
+ * - mappings: A string of base64 VLQs which contain the actual mappings.
+ * - file: Optional. The generated file this source map is associated with.
+ *
+ * Here is an example source map, taken from the source map spec[0]:
+ *
+ * {
+ * version : 3,
+ * file: "out.js",
+ * sourceRoot : "",
+ * sources: ["foo.js", "bar.js"],
+ * names: ["src", "maps", "are", "fun"],
+ * mappings: "AA,AB;;ABCDE;"
+ * }
+ *
+ * The second parameter, if given, is a string whose value is the URL
+ * at which the source map was found. This URL is used to compute the
+ * sources array.
+ *
+ * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#
+ */
+ class BasicSourceMapConsumer extends SourceMapConsumer {
+ constructor(aSourceMap, aSourceMapURL) {
+ return super(INTERNAL).then(that => {
+ let sourceMap = aSourceMap;
+ if (typeof aSourceMap === "string") {
+ sourceMap = util.parseSourceMapInput(aSourceMap);
+ }
+
+ const version = util.getArg(sourceMap, "version");
+ let sources = util.getArg(sourceMap, "sources");
+ // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which
+ // requires the array) to play nice here.
+ const names = util.getArg(sourceMap, "names", []);
+ let sourceRoot = util.getArg(sourceMap, "sourceRoot", null);
+ const sourcesContent = util.getArg(sourceMap, "sourcesContent", null);
+ const mappings = util.getArg(sourceMap, "mappings");
+ const file = util.getArg(sourceMap, "file", null);
+
+ // Once again, Sass deviates from the spec and supplies the version as a
+ // string rather than a number, so we use loose equality checking here.
+ if (version != that._version) {
+ throw new Error("Unsupported version: " + version);
+ }
+
+ if (sourceRoot) {
+ sourceRoot = util.normalize(sourceRoot);
+ }
+
+ sources = sources
+ .map(String)
+ // Some source maps produce relative source paths like "./foo.js" instead of
+ // "foo.js". Normalize these first so that future comparisons will succeed.
+ // See bugzil.la/1090768.
+ .map(util.normalize)
+ // Always ensure that absolute sources are internally stored relative to
+ // the source root, if the source root is absolute. Not doing this would
+ // be particularly problematic when the source root is a prefix of the
+ // source (valid, but why??). See github issue #199 and bugzil.la/1188982.
+ .map(function(source) {
+ return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)
+ ? util.relative(sourceRoot, source)
+ : source;
+ });
+
+ // Pass `true` below to allow duplicate names and sources. While source maps
+ // are intended to be compressed and deduplicated, the TypeScript compiler
+ // sometimes generates source maps with duplicates in them. See Github issue
+ // #72 and bugzil.la/889492.
+ that._names = ArraySet.fromArray(names.map(String), true);
+ that._sources = ArraySet.fromArray(sources, true);
+
+ that._absoluteSources = that._sources.toArray().map(function(s) {
+ return util.computeSourceURL(sourceRoot, s, aSourceMapURL);
+ });
+
+ that.sourceRoot = sourceRoot;
+ that.sourcesContent = sourcesContent;
+ that._mappings = mappings;
+ that._sourceMapURL = aSourceMapURL;
+ that.file = file;
+
+ that._computedColumnSpans = false;
+ that._mappingsPtr = 0;
+ that._wasm = null;
+
+ return wasm().then(w => {
+ that._wasm = w;
+ return that;
+ });
+ });
+ }
+
+ /**
+ * Utility function to find the index of a source. Returns -1 if not
+ * found.
+ */
+ _findSourceIndex(aSource) {
+ let relativeSource = aSource;
+ if (this.sourceRoot != null) {
+ relativeSource = util.relative(this.sourceRoot, relativeSource);
+ }
+
+ if (this._sources.has(relativeSource)) {
+ return this._sources.indexOf(relativeSource);
+ }
+
+ // Maybe aSource is an absolute URL as returned by |sources|. In
+ // this case we can't simply undo the transform.
+ for (let i = 0; i < this._absoluteSources.length; ++i) {
+ if (this._absoluteSources[i] == aSource) {
+ return i;
+ }
+ }
+
+ return -1;
+ }
+
+ /**
+ * Create a BasicSourceMapConsumer from a SourceMapGenerator.
+ *
+ * @param SourceMapGenerator aSourceMap
+ * The source map that will be consumed.
+ * @param String aSourceMapURL
+ * The URL at which the source map can be found (optional)
+ * @returns BasicSourceMapConsumer
+ */
+ static fromSourceMap(aSourceMap, aSourceMapURL) {
+ return new BasicSourceMapConsumer(aSourceMap.toString());
+ }
+
+ get sources() {
+ return this._absoluteSources.slice();
+ }
+
+ _getMappingsPtr() {
+ if (this._mappingsPtr === 0) {
+ this._parseMappings(this._mappings, this.sourceRoot);
+ }
+
+ return this._mappingsPtr;
+ }
+
+ /**
+ * Parse the mappings in a string in to a data structure which we can easily
+ * query (the ordered arrays in the `this.__generatedMappings` and
+ * `this.__originalMappings` properties).
+ */
+ _parseMappings(aStr, aSourceRoot) {
+ const size = aStr.length;
+
+ const mappingsBufPtr = this._wasm.exports.allocate_mappings(size);
+ const mappingsBuf = new Uint8Array(this._wasm.exports.memory.buffer, mappingsBufPtr, size);
+ for (let i = 0; i < size; i++) {
+ mappingsBuf[i] = aStr.charCodeAt(i);
+ }
+
+ const mappingsPtr = this._wasm.exports.parse_mappings(mappingsBufPtr);
+
+ if (!mappingsPtr) {
+ const error = this._wasm.exports.get_last_error();
+ let msg = `Error parsing mappings (code ${error}): `;
+
+ // XXX: keep these error codes in sync with `fitzgen/source-map-mappings`.
+ switch (error) {
+ case 1:
+ msg += "the mappings contained a negative line, column, source index, or name index";
+ break;
+ case 2:
+ msg += "the mappings contained a number larger than 2**32";
+ break;
+ case 3:
+ msg += "reached EOF while in the middle of parsing a VLQ";
+ break;
+ case 4:
+ msg += "invalid base 64 character while parsing a VLQ";
+ break;
+ default:
+ msg += "unknown error code";
+ break;
+ }
+
+ throw new Error(msg);
+ }
+
+ this._mappingsPtr = mappingsPtr;
+ }
+
+ eachMapping(aCallback, aContext, aOrder) {
+ const context = aContext || null;
+ const order = aOrder || SourceMapConsumer.GENERATED_ORDER;
+ const sourceRoot = this.sourceRoot;
+
+ this._wasm.withMappingCallback(
+ mapping => {
+ if (mapping.source !== null) {
+ mapping.source = this._sources.at(mapping.source);
+ mapping.source = util.computeSourceURL(sourceRoot, mapping.source, this._sourceMapURL);
+
+ if (mapping.name !== null) {
+ mapping.name = this._names.at(mapping.name);
+ }
+ }
+
+ aCallback.call(context, mapping);
+ },
+ () => {
+ switch (order) {
+ case SourceMapConsumer.GENERATED_ORDER:
+ this._wasm.exports.by_generated_location(this._getMappingsPtr());
+ break;
+ case SourceMapConsumer.ORIGINAL_ORDER:
+ this._wasm.exports.by_original_location(this._getMappingsPtr());
+ break;
+ default:
+ throw new Error("Unknown order of iteration.");
+ }
+ }
+ );
+ }
+
+ allGeneratedPositionsFor(aArgs) {
+ let source = util.getArg(aArgs, "source");
+ const originalLine = util.getArg(aArgs, "line");
+ const originalColumn = aArgs.column || 0;
+
+ source = this._findSourceIndex(source);
+ if (source < 0) {
+ return [];
+ }
+
+ if (originalLine < 1) {
+ throw new Error("Line numbers must be >= 1");
+ }
+
+ if (originalColumn < 0) {
+ throw new Error("Column numbers must be >= 0");
+ }
+
+ const mappings = [];
+
+ this._wasm.withMappingCallback(
+ m => {
+ let lastColumn = m.lastGeneratedColumn;
+ if (this._computedColumnSpans && lastColumn === null) {
+ lastColumn = Infinity;
+ }
+ mappings.push({
+ line: m.generatedLine,
+ column: m.generatedColumn,
+ lastColumn,
+ });
+ }, () => {
+ this._wasm.exports.all_generated_locations_for(
+ this._getMappingsPtr(),
+ source,
+ originalLine - 1,
+ "column" in aArgs,
+ originalColumn
+ );
+ }
+ );
+
+ return mappings;
+ }
+
+ destroy() {
+ if (this._mappingsPtr !== 0) {
+ this._wasm.exports.free_mappings(this._mappingsPtr);
+ this._mappingsPtr = 0;
+ }
+ }
+
+ /**
+ * Compute the last column for each generated mapping. The last column is
+ * inclusive.
+ */
+ computeColumnSpans() {
+ if (this._computedColumnSpans) {
+ return;
+ }
+
+ this._wasm.exports.compute_column_spans(this._getMappingsPtr());
+ this._computedColumnSpans = true;
+ }
+
+ /**
+ * Returns the original source, line, and column information for the generated
+ * source's line and column positions provided. The only argument is an object
+ * with the following properties:
+ *
+ * - line: The line number in the generated source. The line number
+ * is 1-based.
+ * - column: The column number in the generated source. The column
+ * number is 0-based.
+ * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
+ * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - source: The original source file, or null.
+ * - line: The line number in the original source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the original source, or null. The
+ * column number is 0-based.
+ * - name: The original identifier, or null.
+ */
+ originalPositionFor(aArgs) {
+ const needle = {
+ generatedLine: util.getArg(aArgs, "line"),
+ generatedColumn: util.getArg(aArgs, "column")
+ };
+
+ if (needle.generatedLine < 1) {
+ throw new Error("Line numbers must be >= 1");
+ }
+
+ if (needle.generatedColumn < 0) {
+ throw new Error("Column numbers must be >= 0");
+ }
+
+ let bias = util.getArg(aArgs, "bias", SourceMapConsumer.GREATEST_LOWER_BOUND);
+ if (bias == null) {
+ bias = SourceMapConsumer.GREATEST_LOWER_BOUND;
+ }
+
+ let mapping;
+ this._wasm.withMappingCallback(m => mapping = m, () => {
+ this._wasm.exports.original_location_for(
+ this._getMappingsPtr(),
+ needle.generatedLine - 1,
+ needle.generatedColumn,
+ bias
+ );
+ });
+
+ if (mapping) {
+ if (mapping.generatedLine === needle.generatedLine) {
+ let source = util.getArg(mapping, "source", null);
+ if (source !== null) {
+ source = this._sources.at(source);
+ source = util.computeSourceURL(this.sourceRoot, source, this._sourceMapURL);
+ }
+
+ let name = util.getArg(mapping, "name", null);
+ if (name !== null) {
+ name = this._names.at(name);
+ }
+
+ return {
+ source,
+ line: util.getArg(mapping, "originalLine", null),
+ column: util.getArg(mapping, "originalColumn", null),
+ name
+ };
+ }
+ }
+
+ return {
+ source: null,
+ line: null,
+ column: null,
+ name: null
+ };
+ }
+
+ /**
+ * Return true if we have the source content for every source in the source
+ * map, false otherwise.
+ */
+ hasContentsOfAllSources() {
+ if (!this.sourcesContent) {
+ return false;
+ }
+ return this.sourcesContent.length >= this._sources.size() &&
+ !this.sourcesContent.some(function(sc) { return sc == null; });
+ }
+
+ /**
+ * Returns the original source content. The only argument is the url of the
+ * original source file. Returns null if no original source content is
+ * available.
+ */
+ sourceContentFor(aSource, nullOnMissing) {
+ if (!this.sourcesContent) {
+ return null;
+ }
+
+ const index = this._findSourceIndex(aSource);
+ if (index >= 0) {
+ return this.sourcesContent[index];
+ }
+
+ let relativeSource = aSource;
+ if (this.sourceRoot != null) {
+ relativeSource = util.relative(this.sourceRoot, relativeSource);
+ }
+
+ let url;
+ if (this.sourceRoot != null
+ && (url = util.urlParse(this.sourceRoot))) {
+ // XXX: file:// URIs and absolute paths lead to unexpected behavior for
+ // many users. We can help them out when they expect file:// URIs to
+ // behave like it would if they were running a local HTTP server. See
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.
+ const fileUriAbsPath = relativeSource.replace(/^file:\/\//, "");
+ if (url.scheme == "file"
+ && this._sources.has(fileUriAbsPath)) {
+ return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)];
+ }
+
+ if ((!url.path || url.path == "/")
+ && this._sources.has("/" + relativeSource)) {
+ return this.sourcesContent[this._sources.indexOf("/" + relativeSource)];
+ }
+ }
+
+ // This function is used recursively from
+ // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we
+ // don't want to throw if we can't find the source - we just want to
+ // return null, so we provide a flag to exit gracefully.
+ if (nullOnMissing) {
+ return null;
+ }
+
+ throw new Error('"' + relativeSource + '" is not in the SourceMap.');
+ }
+
+ /**
+ * Returns the generated line and column information for the original source,
+ * line, and column positions provided. The only argument is an object with
+ * the following properties:
+ *
+ * - source: The filename of the original source.
+ * - line: The line number in the original source. The line number
+ * is 1-based.
+ * - column: The column number in the original source. The column
+ * number is 0-based.
+ * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
+ * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - line: The line number in the generated source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the generated source, or null.
+ * The column number is 0-based.
+ */
+ generatedPositionFor(aArgs) {
+ let source = util.getArg(aArgs, "source");
+ source = this._findSourceIndex(source);
+ if (source < 0) {
+ return {
+ line: null,
+ column: null,
+ lastColumn: null
+ };
+ }
+
+ const needle = {
+ source,
+ originalLine: util.getArg(aArgs, "line"),
+ originalColumn: util.getArg(aArgs, "column")
+ };
+
+ if (needle.originalLine < 1) {
+ throw new Error("Line numbers must be >= 1");
+ }
+
+ if (needle.originalColumn < 0) {
+ throw new Error("Column numbers must be >= 0");
+ }
+
+ let bias = util.getArg(aArgs, "bias", SourceMapConsumer.GREATEST_LOWER_BOUND);
+ if (bias == null) {
+ bias = SourceMapConsumer.GREATEST_LOWER_BOUND;
+ }
+
+ let mapping;
+ this._wasm.withMappingCallback(m => mapping = m, () => {
+ this._wasm.exports.generated_location_for(
+ this._getMappingsPtr(),
+ needle.source,
+ needle.originalLine - 1,
+ needle.originalColumn,
+ bias
+ );
+ });
+
+ if (mapping) {
+ if (mapping.source === needle.source) {
+ let lastColumn = mapping.lastGeneratedColumn;
+ if (this._computedColumnSpans && lastColumn === null) {
+ lastColumn = Infinity;
+ }
+ return {
+ line: util.getArg(mapping, "generatedLine", null),
+ column: util.getArg(mapping, "generatedColumn", null),
+ lastColumn,
+ };
+ }
+ }
+
+ return {
+ line: null,
+ column: null,
+ lastColumn: null
+ };
+ }
+ }
+
+ BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;
+ sourceMapConsumer.BasicSourceMapConsumer = BasicSourceMapConsumer;
+
+ /**
+ * An IndexedSourceMapConsumer instance represents a parsed source map which
+ * we can query for information. It differs from BasicSourceMapConsumer in
+ * that it takes "indexed" source maps (i.e. ones with a "sections" field) as
+ * input.
+ *
+ * The first parameter is a raw source map (either as a JSON string, or already
+ * parsed to an object). According to the spec for indexed source maps, they
+ * have the following attributes:
+ *
+ * - version: Which version of the source map spec this map is following.
+ * - file: Optional. The generated file this source map is associated with.
+ * - sections: A list of section definitions.
+ *
+ * Each value under the "sections" field has two fields:
+ * - offset: The offset into the original specified at which this section
+ * begins to apply, defined as an object with a "line" and "column"
+ * field.
+ * - map: A source map definition. This source map could also be indexed,
+ * but doesn't have to be.
+ *
+ * Instead of the "map" field, it's also possible to have a "url" field
+ * specifying a URL to retrieve a source map from, but that's currently
+ * unsupported.
+ *
+ * Here's an example source map, taken from the source map spec[0], but
+ * modified to omit a section which uses the "url" field.
+ *
+ * {
+ * version : 3,
+ * file: "app.js",
+ * sections: [{
+ * offset: {line:100, column:10},
+ * map: {
+ * version : 3,
+ * file: "section.js",
+ * sources: ["foo.js", "bar.js"],
+ * names: ["src", "maps", "are", "fun"],
+ * mappings: "AAAA,E;;ABCDE;"
+ * }
+ * }],
+ * }
+ *
+ * The second parameter, if given, is a string whose value is the URL
+ * at which the source map was found. This URL is used to compute the
+ * sources array.
+ *
+ * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt
+ */
+ class IndexedSourceMapConsumer extends SourceMapConsumer {
+ constructor(aSourceMap, aSourceMapURL) {
+ return super(INTERNAL).then(that => {
+ let sourceMap = aSourceMap;
+ if (typeof aSourceMap === "string") {
+ sourceMap = util.parseSourceMapInput(aSourceMap);
+ }
+
+ const version = util.getArg(sourceMap, "version");
+ const sections = util.getArg(sourceMap, "sections");
+
+ if (version != that._version) {
+ throw new Error("Unsupported version: " + version);
+ }
+
+ that._sources = new ArraySet();
+ that._names = new ArraySet();
+ that.__generatedMappings = null;
+ that.__originalMappings = null;
+ that.__generatedMappingsUnsorted = null;
+ that.__originalMappingsUnsorted = null;
+
+ let lastOffset = {
+ line: -1,
+ column: 0
+ };
+ return Promise.all(sections.map(s => {
+ if (s.url) {
+ // The url field will require support for asynchronicity.
+ // See https://github.com/mozilla/source-map/issues/16
+ throw new Error("Support for url field in sections not implemented.");
+ }
+ const offset = util.getArg(s, "offset");
+ const offsetLine = util.getArg(offset, "line");
+ const offsetColumn = util.getArg(offset, "column");
+
+ if (offsetLine < lastOffset.line ||
+ (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {
+ throw new Error("Section offsets must be ordered and non-overlapping.");
+ }
+ lastOffset = offset;
+
+ const cons = new SourceMapConsumer(util.getArg(s, "map"), aSourceMapURL);
+ return cons.then(consumer => {
+ return {
+ generatedOffset: {
+ // The offset fields are 0-based, but we use 1-based indices when
+ // encoding/decoding from VLQ.
+ generatedLine: offsetLine + 1,
+ generatedColumn: offsetColumn + 1
+ },
+ consumer
+ };
+ });
+ })).then(s => {
+ that._sections = s;
+ return that;
+ });
+ });
+ }
+
+ // `__generatedMappings` and `__originalMappings` are arrays that hold the
+ // parsed mapping coordinates from the source map's "mappings" attribute. They
+ // are lazily instantiated, accessed via the `_generatedMappings` and
+ // `_originalMappings` getters respectively, and we only parse the mappings
+ // and create these arrays once queried for a source location. We jump through
+ // these hoops because there can be many thousands of mappings, and parsing
+ // them is expensive, so we only want to do it if we must.
+ //
+ // Each object in the arrays is of the form:
+ //
+ // {
+ // generatedLine: The line number in the generated code,
+ // generatedColumn: The column number in the generated code,
+ // source: The path to the original source file that generated this
+ // chunk of code,
+ // originalLine: The line number in the original source that
+ // corresponds to this chunk of generated code,
+ // originalColumn: The column number in the original source that
+ // corresponds to this chunk of generated code,
+ // name: The name of the original symbol which generated this chunk of
+ // code.
+ // }
+ //
+ // All properties except for `generatedLine` and `generatedColumn` can be
+ // `null`.
+ //
+ // `_generatedMappings` is ordered by the generated positions.
+ //
+ // `_originalMappings` is ordered by the original positions.
+ get _generatedMappings() {
+ if (!this.__generatedMappings) {
+ this._sortGeneratedMappings();
+ }
+
+ return this.__generatedMappings;
+ }
+
+ get _originalMappings() {
+ if (!this.__originalMappings) {
+ this._sortOriginalMappings();
+ }
+
+ return this.__originalMappings;
+ }
+
+ get _generatedMappingsUnsorted() {
+ if (!this.__generatedMappingsUnsorted) {
+ this._parseMappings(this._mappings, this.sourceRoot);
+ }
+
+ return this.__generatedMappingsUnsorted;
+ }
+
+ get _originalMappingsUnsorted() {
+ if (!this.__originalMappingsUnsorted) {
+ this._parseMappings(this._mappings, this.sourceRoot);
+ }
+
+ return this.__originalMappingsUnsorted;
+ }
+
+ _sortGeneratedMappings() {
+ const mappings = this._generatedMappingsUnsorted;
+ mappings.sort(util.compareByGeneratedPositionsDeflated);
+ this.__generatedMappings = mappings;
+ }
+
+ _sortOriginalMappings() {
+ const mappings = this._originalMappingsUnsorted;
+ mappings.sort(util.compareByOriginalPositions);
+ this.__originalMappings = mappings;
+ }
+
+ /**
+ * The list of original sources.
+ */
+ get sources() {
+ const sources = [];
+ for (let i = 0; i < this._sections.length; i++) {
+ for (let j = 0; j < this._sections[i].consumer.sources.length; j++) {
+ sources.push(this._sections[i].consumer.sources[j]);
+ }
+ }
+ return sources;
+ }
+
+ /**
+ * Returns the original source, line, and column information for the generated
+ * source's line and column positions provided. The only argument is an object
+ * with the following properties:
+ *
+ * - line: The line number in the generated source. The line number
+ * is 1-based.
+ * - column: The column number in the generated source. The column
+ * number is 0-based.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - source: The original source file, or null.
+ * - line: The line number in the original source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the original source, or null. The
+ * column number is 0-based.
+ * - name: The original identifier, or null.
+ */
+ originalPositionFor(aArgs) {
+ const needle = {
+ generatedLine: util.getArg(aArgs, "line"),
+ generatedColumn: util.getArg(aArgs, "column")
+ };
+
+ // Find the section containing the generated position we're trying to map
+ // to an original position.
+ const sectionIndex = binarySearch.search(needle, this._sections,
+ function(aNeedle, section) {
+ const cmp = aNeedle.generatedLine - section.generatedOffset.generatedLine;
+ if (cmp) {
+ return cmp;
+ }
+
+ return (aNeedle.generatedColumn -
+ section.generatedOffset.generatedColumn);
+ });
+ const section = this._sections[sectionIndex];
+
+ if (!section) {
+ return {
+ source: null,
+ line: null,
+ column: null,
+ name: null
+ };
+ }
+
+ return section.consumer.originalPositionFor({
+ line: needle.generatedLine -
+ (section.generatedOffset.generatedLine - 1),
+ column: needle.generatedColumn -
+ (section.generatedOffset.generatedLine === needle.generatedLine
+ ? section.generatedOffset.generatedColumn - 1
+ : 0),
+ bias: aArgs.bias
+ });
+ }
+
+ /**
+ * Return true if we have the source content for every source in the source
+ * map, false otherwise.
+ */
+ hasContentsOfAllSources() {
+ return this._sections.every(function(s) {
+ return s.consumer.hasContentsOfAllSources();
+ });
+ }
+
+ /**
+ * Returns the original source content. The only argument is the url of the
+ * original source file. Returns null if no original source content is
+ * available.
+ */
+ sourceContentFor(aSource, nullOnMissing) {
+ for (let i = 0; i < this._sections.length; i++) {
+ const section = this._sections[i];
+
+ const content = section.consumer.sourceContentFor(aSource, true);
+ if (content) {
+ return content;
+ }
+ }
+ if (nullOnMissing) {
+ return null;
+ }
+ throw new Error('"' + aSource + '" is not in the SourceMap.');
+ }
+
+ /**
+ * Returns the generated line and column information for the original source,
+ * line, and column positions provided. The only argument is an object with
+ * the following properties:
+ *
+ * - source: The filename of the original source.
+ * - line: The line number in the original source. The line number
+ * is 1-based.
+ * - column: The column number in the original source. The column
+ * number is 0-based.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - line: The line number in the generated source, or null. The
+ * line number is 1-based.
+ * - column: The column number in the generated source, or null.
+ * The column number is 0-based.
+ */
+ generatedPositionFor(aArgs) {
+ for (let i = 0; i < this._sections.length; i++) {
+ const section = this._sections[i];
+
+ // Only consider this section if the requested source is in the list of
+ // sources of the consumer.
+ if (section.consumer._findSourceIndex(util.getArg(aArgs, "source")) === -1) {
+ continue;
+ }
+ const generatedPosition = section.consumer.generatedPositionFor(aArgs);
+ if (generatedPosition) {
+ const ret = {
+ line: generatedPosition.line +
+ (section.generatedOffset.generatedLine - 1),
+ column: generatedPosition.column +
+ (section.generatedOffset.generatedLine === generatedPosition.line
+ ? section.generatedOffset.generatedColumn - 1
+ : 0)
+ };
+ return ret;
+ }
+ }
+
+ return {
+ line: null,
+ column: null
+ };
+ }
+
+ /**
+ * Parse the mappings in a string in to a data structure which we can easily
+ * query (the ordered arrays in the `this.__generatedMappings` and
+ * `this.__originalMappings` properties).
+ */
+ _parseMappings(aStr, aSourceRoot) {
+ const generatedMappings = this.__generatedMappingsUnsorted = [];
+ const originalMappings = this.__originalMappingsUnsorted = [];
+ for (let i = 0; i < this._sections.length; i++) {
+ const section = this._sections[i];
+
+ const sectionMappings = [];
+ section.consumer.eachMapping(m => sectionMappings.push(m));
+
+ for (let j = 0; j < sectionMappings.length; j++) {
+ const mapping = sectionMappings[j];
+
+ // TODO: test if null is correct here. The original code used
+ // `source`, which would actually have gotten used as null because
+ // var's get hoisted.
+ // See: https://github.com/mozilla/source-map/issues/333
+ let source = util.computeSourceURL(section.consumer.sourceRoot, null, this._sourceMapURL);
+ this._sources.add(source);
+ source = this._sources.indexOf(source);
+
+ let name = null;
+ if (mapping.name) {
+ this._names.add(mapping.name);
+ name = this._names.indexOf(mapping.name);
+ }
+
+ // The mappings coming from the consumer for the section have
+ // generated positions relative to the start of the section, so we
+ // need to offset them to be relative to the start of the concatenated
+ // generated file.
+ const adjustedMapping = {
+ source,
+ generatedLine: mapping.generatedLine +
+ (section.generatedOffset.generatedLine - 1),
+ generatedColumn: mapping.generatedColumn +
+ (section.generatedOffset.generatedLine === mapping.generatedLine
+ ? section.generatedOffset.generatedColumn - 1
+ : 0),
+ originalLine: mapping.originalLine,
+ originalColumn: mapping.originalColumn,
+ name
+ };
+
+ generatedMappings.push(adjustedMapping);
+ if (typeof adjustedMapping.originalLine === "number") {
+ originalMappings.push(adjustedMapping);
+ }
+ }
+ }
+ }
+
+ eachMapping(aCallback, aContext, aOrder) {
+ const context = aContext || null;
+ const order = aOrder || SourceMapConsumer.GENERATED_ORDER;
+
+ let mappings;
+ switch (order) {
+ case SourceMapConsumer.GENERATED_ORDER:
+ mappings = this._generatedMappings;
+ break;
+ case SourceMapConsumer.ORIGINAL_ORDER:
+ mappings = this._originalMappings;
+ break;
+ default:
+ throw new Error("Unknown order of iteration.");
+ }
+
+ const sourceRoot = this.sourceRoot;
+ mappings.map(function(mapping) {
+ let source = null;
+ if (mapping.source !== null) {
+ source = this._sources.at(mapping.source);
+ source = util.computeSourceURL(sourceRoot, source, this._sourceMapURL);
+ }
+ return {
+ source,
+ generatedLine: mapping.generatedLine,
+ generatedColumn: mapping.generatedColumn,
+ originalLine: mapping.originalLine,
+ originalColumn: mapping.originalColumn,
+ name: mapping.name === null ? null : this._names.at(mapping.name)
+ };
+ }, this).forEach(aCallback, context);
+ }
+
+ /**
+ * Find the mapping that best matches the hypothetical "needle" mapping that
+ * we are searching for in the given "haystack" of mappings.
+ */
+ _findMapping(aNeedle, aMappings, aLineName,
+ aColumnName, aComparator, aBias) {
+ // To return the position we are searching for, we must first find the
+ // mapping for the given position and then return the opposite position it
+ // points to. Because the mappings are sorted, we can use binary search to
+ // find the best mapping.
+
+ if (aNeedle[aLineName] <= 0) {
+ throw new TypeError("Line must be greater than or equal to 1, got "
+ + aNeedle[aLineName]);
+ }
+ if (aNeedle[aColumnName] < 0) {
+ throw new TypeError("Column must be greater than or equal to 0, got "
+ + aNeedle[aColumnName]);
+ }
+
+ return binarySearch.search(aNeedle, aMappings, aComparator, aBias);
+ }
+
+ allGeneratedPositionsFor(aArgs) {
+ const line = util.getArg(aArgs, "line");
+
+ // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping
+ // returns the index of the closest mapping less than the needle. By
+ // setting needle.originalColumn to 0, we thus find the last mapping for
+ // the given line, provided such a mapping exists.
+ const needle = {
+ source: util.getArg(aArgs, "source"),
+ originalLine: line,
+ originalColumn: util.getArg(aArgs, "column", 0)
+ };
+
+ needle.source = this._findSourceIndex(needle.source);
+ if (needle.source < 0) {
+ return [];
+ }
+
+ if (needle.originalLine < 1) {
+ throw new Error("Line numbers must be >= 1");
+ }
+
+ if (needle.originalColumn < 0) {
+ throw new Error("Column numbers must be >= 0");
+ }
+
+ const mappings = [];
+
+ let index = this._findMapping(needle,
+ this._originalMappings,
+ "originalLine",
+ "originalColumn",
+ util.compareByOriginalPositions,
+ binarySearch.LEAST_UPPER_BOUND);
+ if (index >= 0) {
+ let mapping = this._originalMappings[index];
+
+ if (aArgs.column === undefined) {
+ const originalLine = mapping.originalLine;
+
+ // Iterate until either we run out of mappings, or we run into
+ // a mapping for a different line than the one we found. Since
+ // mappings are sorted, this is guaranteed to find all mappings for
+ // the line we found.
+ while (mapping && mapping.originalLine === originalLine) {
+ let lastColumn = mapping.lastGeneratedColumn;
+ if (this._computedColumnSpans && lastColumn === null) {
+ lastColumn = Infinity;
+ }
+ mappings.push({
+ line: util.getArg(mapping, "generatedLine", null),
+ column: util.getArg(mapping, "generatedColumn", null),
+ lastColumn,
+ });
+
+ mapping = this._originalMappings[++index];
+ }
+ } else {
+ const originalColumn = mapping.originalColumn;
+
+ // Iterate until either we run out of mappings, or we run into
+ // a mapping for a different line than the one we were searching for.
+ // Since mappings are sorted, this is guaranteed to find all mappings for
+ // the line we are searching for.
+ while (mapping &&
+ mapping.originalLine === line &&
+ mapping.originalColumn == originalColumn) {
+ let lastColumn = mapping.lastGeneratedColumn;
+ if (this._computedColumnSpans && lastColumn === null) {
+ lastColumn = Infinity;
+ }
+ mappings.push({
+ line: util.getArg(mapping, "generatedLine", null),
+ column: util.getArg(mapping, "generatedColumn", null),
+ lastColumn,
+ });
+
+ mapping = this._originalMappings[++index];
+ }
+ }
+ }
+
+ return mappings;
+ }
+
+ destroy() {
+ for (let i = 0; i < this._sections.length; i++) {
+ this._sections[i].consumer.destroy();
+ }
+ }
+ }
+ sourceMapConsumer.IndexedSourceMapConsumer = IndexedSourceMapConsumer;
+
+ /*
+ * Cheat to get around inter-twingled classes. `factory()` can be at the end
+ * where it has access to non-hoisted classes, but it gets hoisted itself.
+ */
+ function _factory(aSourceMap, aSourceMapURL) {
+ let sourceMap = aSourceMap;
+ if (typeof aSourceMap === "string") {
+ sourceMap = util.parseSourceMapInput(aSourceMap);
+ }
+
+ const consumer = sourceMap.sections != null
+ ? new IndexedSourceMapConsumer(sourceMap, aSourceMapURL)
+ : new BasicSourceMapConsumer(sourceMap, aSourceMapURL);
+ return Promise.resolve(consumer);
+ }
+
+ function _factoryBSM(aSourceMap, aSourceMapURL) {
+ return BasicSourceMapConsumer.fromSourceMap(aSourceMap, aSourceMapURL);
+ }
+ return sourceMapConsumer;
+ }
+
+ var sourceNode = {};
+
+ var hasRequiredSourceNode;
+
+ function requireSourceNode () {
+ if (hasRequiredSourceNode) return sourceNode;
+ hasRequiredSourceNode = 1;
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ const SourceMapGenerator = requireSourceMapGenerator().SourceMapGenerator;
+ const util = requireUtil();
+
+ // Matches a Windows-style `\r\n` newline or a `\n` newline used by all other
+ // operating systems these days (capturing the result).
+ const REGEX_NEWLINE = /(\r?\n)/;
+
+ // Newline character code for charCodeAt() comparisons
+ const NEWLINE_CODE = 10;
+
+ // Private symbol for identifying `SourceNode`s when multiple versions of
+ // the source-map library are loaded. This MUST NOT CHANGE across
+ // versions!
+ const isSourceNode = "$$$isSourceNode$$$";
+
+ /**
+ * SourceNodes provide a way to abstract over interpolating/concatenating
+ * snippets of generated JavaScript source code while maintaining the line and
+ * column information associated with the original source code.
+ *
+ * @param aLine The original line number.
+ * @param aColumn The original column number.
+ * @param aSource The original source's filename.
+ * @param aChunks Optional. An array of strings which are snippets of
+ * generated JS, or other SourceNodes.
+ * @param aName The original identifier.
+ */
+ class SourceNode {
+ constructor(aLine, aColumn, aSource, aChunks, aName) {
+ this.children = [];
+ this.sourceContents = {};
+ this.line = aLine == null ? null : aLine;
+ this.column = aColumn == null ? null : aColumn;
+ this.source = aSource == null ? null : aSource;
+ this.name = aName == null ? null : aName;
+ this[isSourceNode] = true;
+ if (aChunks != null) this.add(aChunks);
+ }
+
+ /**
+ * Creates a SourceNode from generated code and a SourceMapConsumer.
+ *
+ * @param aGeneratedCode The generated code
+ * @param aSourceMapConsumer The SourceMap for the generated code
+ * @param aRelativePath Optional. The path that relative sources in the
+ * SourceMapConsumer should be relative to.
+ */
+ static fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {
+ // The SourceNode we want to fill with the generated code
+ // and the SourceMap
+ const node = new SourceNode();
+
+ // All even indices of this array are one line of the generated code,
+ // while all odd indices are the newlines between two adjacent lines
+ // (since `REGEX_NEWLINE` captures its match).
+ // Processed fragments are accessed by calling `shiftNextLine`.
+ const remainingLines = aGeneratedCode.split(REGEX_NEWLINE);
+ let remainingLinesIndex = 0;
+ const shiftNextLine = function() {
+ const lineContents = getNextLine();
+ // The last line of a file might not have a newline.
+ const newLine = getNextLine() || "";
+ return lineContents + newLine;
+
+ function getNextLine() {
+ return remainingLinesIndex < remainingLines.length ?
+ remainingLines[remainingLinesIndex++] : undefined;
+ }
+ };
+
+ // We need to remember the position of "remainingLines"
+ let lastGeneratedLine = 1, lastGeneratedColumn = 0;
+
+ // The generate SourceNodes we need a code range.
+ // To extract it current and last mapping is used.
+ // Here we store the last mapping.
+ let lastMapping = null;
+ let nextLine;
+
+ aSourceMapConsumer.eachMapping(function(mapping) {
+ if (lastMapping !== null) {
+ // We add the code from "lastMapping" to "mapping":
+ // First check if there is a new line in between.
+ if (lastGeneratedLine < mapping.generatedLine) {
+ // Associate first line with "lastMapping"
+ addMappingWithCode(lastMapping, shiftNextLine());
+ lastGeneratedLine++;
+ lastGeneratedColumn = 0;
+ // The remaining code is added without mapping
+ } else {
+ // There is no new line in between.
+ // Associate the code between "lastGeneratedColumn" and
+ // "mapping.generatedColumn" with "lastMapping"
+ nextLine = remainingLines[remainingLinesIndex] || "";
+ const code = nextLine.substr(0, mapping.generatedColumn -
+ lastGeneratedColumn);
+ remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn -
+ lastGeneratedColumn);
+ lastGeneratedColumn = mapping.generatedColumn;
+ addMappingWithCode(lastMapping, code);
+ // No more remaining code, continue
+ lastMapping = mapping;
+ return;
+ }
+ }
+ // We add the generated code until the first mapping
+ // to the SourceNode without any mapping.
+ // Each line is added as separate string.
+ while (lastGeneratedLine < mapping.generatedLine) {
+ node.add(shiftNextLine());
+ lastGeneratedLine++;
+ }
+ if (lastGeneratedColumn < mapping.generatedColumn) {
+ nextLine = remainingLines[remainingLinesIndex] || "";
+ node.add(nextLine.substr(0, mapping.generatedColumn));
+ remainingLines[remainingLinesIndex] = nextLine.substr(mapping.generatedColumn);
+ lastGeneratedColumn = mapping.generatedColumn;
+ }
+ lastMapping = mapping;
+ }, this);
+ // We have processed all mappings.
+ if (remainingLinesIndex < remainingLines.length) {
+ if (lastMapping) {
+ // Associate the remaining code in the current line with "lastMapping"
+ addMappingWithCode(lastMapping, shiftNextLine());
+ }
+ // and add the remaining lines without any mapping
+ node.add(remainingLines.splice(remainingLinesIndex).join(""));
+ }
+
+ // Copy sourcesContent into SourceNode
+ aSourceMapConsumer.sources.forEach(function(sourceFile) {
+ const content = aSourceMapConsumer.sourceContentFor(sourceFile);
+ if (content != null) {
+ if (aRelativePath != null) {
+ sourceFile = util.join(aRelativePath, sourceFile);
+ }
+ node.setSourceContent(sourceFile, content);
+ }
+ });
+
+ return node;
+
+ function addMappingWithCode(mapping, code) {
+ if (mapping === null || mapping.source === undefined) {
+ node.add(code);
+ } else {
+ const source = aRelativePath
+ ? util.join(aRelativePath, mapping.source)
+ : mapping.source;
+ node.add(new SourceNode(mapping.originalLine,
+ mapping.originalColumn,
+ source,
+ code,
+ mapping.name));
+ }
+ }
+ }
+
+ /**
+ * Add a chunk of generated JS to this source node.
+ *
+ * @param aChunk A string snippet of generated JS code, another instance of
+ * SourceNode, or an array where each member is one of those things.
+ */
+ add(aChunk) {
+ if (Array.isArray(aChunk)) {
+ aChunk.forEach(function(chunk) {
+ this.add(chunk);
+ }, this);
+ } else if (aChunk[isSourceNode] || typeof aChunk === "string") {
+ if (aChunk) {
+ this.children.push(aChunk);
+ }
+ } else {
+ throw new TypeError(
+ "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
+ );
+ }
+ return this;
+ }
+
+ /**
+ * Add a chunk of generated JS to the beginning of this source node.
+ *
+ * @param aChunk A string snippet of generated JS code, another instance of
+ * SourceNode, or an array where each member is one of those things.
+ */
+ prepend(aChunk) {
+ if (Array.isArray(aChunk)) {
+ for (let i = aChunk.length - 1; i >= 0; i--) {
+ this.prepend(aChunk[i]);
+ }
+ } else if (aChunk[isSourceNode] || typeof aChunk === "string") {
+ this.children.unshift(aChunk);
+ } else {
+ throw new TypeError(
+ "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " + aChunk
+ );
+ }
+ return this;
+ }
+
+ /**
+ * Walk over the tree of JS snippets in this node and its children. The
+ * walking function is called once for each snippet of JS and is passed that
+ * snippet and the its original associated source's line/column location.
+ *
+ * @param aFn The traversal function.
+ */
+ walk(aFn) {
+ let chunk;
+ for (let i = 0, len = this.children.length; i < len; i++) {
+ chunk = this.children[i];
+ if (chunk[isSourceNode]) {
+ chunk.walk(aFn);
+ } else if (chunk !== "") {
+ aFn(chunk, { source: this.source,
+ line: this.line,
+ column: this.column,
+ name: this.name });
+ }
+ }
+ }
+
+ /**
+ * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between
+ * each of `this.children`.
+ *
+ * @param aSep The separator.
+ */
+ join(aSep) {
+ let newChildren;
+ let i;
+ const len = this.children.length;
+ if (len > 0) {
+ newChildren = [];
+ for (i = 0; i < len - 1; i++) {
+ newChildren.push(this.children[i]);
+ newChildren.push(aSep);
+ }
+ newChildren.push(this.children[i]);
+ this.children = newChildren;
+ }
+ return this;
+ }
+
+ /**
+ * Call String.prototype.replace on the very right-most source snippet. Useful
+ * for trimming whitespace from the end of a source node, etc.
+ *
+ * @param aPattern The pattern to replace.
+ * @param aReplacement The thing to replace the pattern with.
+ */
+ replaceRight(aPattern, aReplacement) {
+ const lastChild = this.children[this.children.length - 1];
+ if (lastChild[isSourceNode]) {
+ lastChild.replaceRight(aPattern, aReplacement);
+ } else if (typeof lastChild === "string") {
+ this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);
+ } else {
+ this.children.push("".replace(aPattern, aReplacement));
+ }
+ return this;
+ }
+
+ /**
+ * Set the source content for a source file. This will be added to the SourceMapGenerator
+ * in the sourcesContent field.
+ *
+ * @param aSourceFile The filename of the source file
+ * @param aSourceContent The content of the source file
+ */
+ setSourceContent(aSourceFile, aSourceContent) {
+ this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;
+ }
+
+ /**
+ * Walk over the tree of SourceNodes. The walking function is called for each
+ * source file content and is passed the filename and source content.
+ *
+ * @param aFn The traversal function.
+ */
+ walkSourceContents(aFn) {
+ for (let i = 0, len = this.children.length; i < len; i++) {
+ if (this.children[i][isSourceNode]) {
+ this.children[i].walkSourceContents(aFn);
+ }
+ }
+
+ const sources = Object.keys(this.sourceContents);
+ for (let i = 0, len = sources.length; i < len; i++) {
+ aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);
+ }
+ }
+
+ /**
+ * Return the string representation of this source node. Walks over the tree
+ * and concatenates all the various snippets together to one string.
+ */
+ toString() {
+ let str = "";
+ this.walk(function(chunk) {
+ str += chunk;
+ });
+ return str;
+ }
+
+ /**
+ * Returns the string representation of this source node along with a source
+ * map.
+ */
+ toStringWithSourceMap(aArgs) {
+ const generated = {
+ code: "",
+ line: 1,
+ column: 0
+ };
+ const map = new SourceMapGenerator(aArgs);
+ let sourceMappingActive = false;
+ let lastOriginalSource = null;
+ let lastOriginalLine = null;
+ let lastOriginalColumn = null;
+ let lastOriginalName = null;
+ this.walk(function(chunk, original) {
+ generated.code += chunk;
+ if (original.source !== null
+ && original.line !== null
+ && original.column !== null) {
+ if (lastOriginalSource !== original.source
+ || lastOriginalLine !== original.line
+ || lastOriginalColumn !== original.column
+ || lastOriginalName !== original.name) {
+ map.addMapping({
+ source: original.source,
+ original: {
+ line: original.line,
+ column: original.column
+ },
+ generated: {
+ line: generated.line,
+ column: generated.column
+ },
+ name: original.name
+ });
+ }
+ lastOriginalSource = original.source;
+ lastOriginalLine = original.line;
+ lastOriginalColumn = original.column;
+ lastOriginalName = original.name;
+ sourceMappingActive = true;
+ } else if (sourceMappingActive) {
+ map.addMapping({
+ generated: {
+ line: generated.line,
+ column: generated.column
+ }
+ });
+ lastOriginalSource = null;
+ sourceMappingActive = false;
+ }
+ for (let idx = 0, length = chunk.length; idx < length; idx++) {
+ if (chunk.charCodeAt(idx) === NEWLINE_CODE) {
+ generated.line++;
+ generated.column = 0;
+ // Mappings end at eol
+ if (idx + 1 === length) {
+ lastOriginalSource = null;
+ sourceMappingActive = false;
+ } else if (sourceMappingActive) {
+ map.addMapping({
+ source: original.source,
+ original: {
+ line: original.line,
+ column: original.column
+ },
+ generated: {
+ line: generated.line,
+ column: generated.column
+ },
+ name: original.name
+ });
+ }
+ } else {
+ generated.column++;
+ }
+ }
+ });
+ this.walkSourceContents(function(sourceFile, sourceContent) {
+ map.setSourceContent(sourceFile, sourceContent);
+ });
+
+ return { code: generated.code, map };
+ }
+ }
+
+ sourceNode.SourceNode = SourceNode;
+ return sourceNode;
+ }
+
+ var hasRequiredSourceMap;
+
+ function requireSourceMap () {
+ if (hasRequiredSourceMap) return sourceMap$1;
+ hasRequiredSourceMap = 1;
+ sourceMap$1.SourceMapGenerator = requireSourceMapGenerator().SourceMapGenerator;
+ sourceMap$1.SourceMapConsumer = requireSourceMapConsumer().SourceMapConsumer;
+ sourceMap$1.SourceNode = requireSourceNode().SourceNode;
+ return sourceMap$1;
+ }
+
+ var workerUtils = {exports: {}};
+
+ var hasRequiredWorkerUtils;
+
+ function requireWorkerUtils () {
+ if (hasRequiredWorkerUtils) return workerUtils.exports;
+ hasRequiredWorkerUtils = 1;
+ (function (module) {
+
+ class WorkerDispatcher {
+ #msgId = 1;
+ #worker = null;
+ // Map of message ids -> promise resolution functions, for dispatching worker responses
+ #pendingCalls = new Map();
+ #url = "";
+
+ constructor(url) {
+ this.#url = url;
+ }
+
+ start() {
+ // When running in debugger jest test, we don't have access to ChromeWorker
+ if (typeof ChromeWorker == "function") {
+ this.#worker = new ChromeWorker(this.#url);
+ } else {
+ this.#worker = new Worker(this.#url);
+ }
+ this.#worker.onerror = err => {
+ console.error(`Error in worker ${this.#url}`, err.message);
+ };
+ this.#worker.addEventListener("message", this.#onMessage);
+ }
+
+ stop() {
+ if (!this.#worker) {
+ return;
+ }
+
+ this.#worker.removeEventListener("message", this.#onMessage);
+ this.#worker.terminate();
+ this.#worker = null;
+ this.#pendingCalls.clear();
+ }
+
+ task(method, { queue = false } = {}) {
+ const calls = [];
+ const push = args => {
+ return new Promise((resolve, reject) => {
+ if (queue && calls.length === 0) {
+ Promise.resolve().then(flush);
+ }
+
+ calls.push({ args, resolve, reject });
+
+ if (!queue) {
+ flush();
+ }
+ });
+ };
+
+ const flush = () => {
+ const items = calls.slice();
+ calls.length = 0;
+
+ if (!this.#worker) {
+ this.start();
+ }
+
+ const id = this.#msgId++;
+ this.#worker.postMessage({
+ id,
+ method,
+ calls: items.map(item => item.args),
+ });
+
+ this.#pendingCalls.set(id, items);
+ };
+
+ return (...args) => push(args);
+ }
+
+ invoke(method, ...args) {
+ return this.task(method)(...args);
+ }
+
+ #onMessage = ({ data: result }) => {
+ const items = this.#pendingCalls.get(result.id);
+ this.#pendingCalls.delete(result.id);
+ if (!items) {
+ return;
+ }
+
+ if (!this.#worker) {
+ return;
+ }
+
+ result.results.forEach((resultData, i) => {
+ const { resolve, reject } = items[i];
+
+ if (resultData.error) {
+ const err = new Error(resultData.message);
+ err.metadata = resultData.metadata;
+ reject(err);
+ } else {
+ resolve(resultData.response);
+ }
+ });
+ };
+ }
+
+ function workerHandler(publicInterface) {
+ return function (msg) {
+ const { id, method, calls } = msg.data;
+
+ Promise.all(
+ calls.map(args => {
+ try {
+ const response = publicInterface[method].apply(undefined, args);
+ if (response instanceof Promise) {
+ return response.then(
+ val => ({ response: val }),
+ err => asErrorMessage(err)
+ );
+ }
+ return { response };
+ } catch (error) {
+ return asErrorMessage(error);
+ }
+ })
+ ).then(results => {
+ globalThis.postMessage({ id, results });
+ });
+ };
+ }
+
+ function asErrorMessage(error) {
+ if (typeof error === "object" && error && "message" in error) {
+ // Error can't be sent via postMessage, so be sure to convert to
+ // string.
+ return {
+ error: true,
+ message: error.message,
+ metadata: error.metadata,
+ };
+ }
+
+ return {
+ error: true,
+ message: error == null ? error : error.toString(),
+ metadata: undefined,
+ };
+ }
+
+ // Might be loaded within a worker thread where `module` isn't available.
+ {
+ module.exports = {
+ WorkerDispatcher,
+ workerHandler,
+ };
+ }
+ } (workerUtils));
+ return workerUtils.exports;
+ }
+
+ var workerUtilsExports = requireWorkerUtils();
+
+ var acorn$1 = {exports: {}};
+
+ var hasRequiredAcorn;
+
+ function requireAcorn () {
+ if (hasRequiredAcorn) return acorn$1.exports;
+ hasRequiredAcorn = 1;
+ (function (module, exports) {
+ (function (global, factory) {
+ factory(exports) ;
+ })(commonjsGlobal, (function (exports) {
+ // This file was generated. Do not modify manually!
+ var astralIdentifierCodes = [509, 0, 227, 0, 150, 4, 294, 9, 1368, 2, 2, 1, 6, 3, 41, 2, 5, 0, 166, 1, 574, 3, 9, 9, 370, 1, 81, 2, 71, 10, 50, 3, 123, 2, 54, 14, 32, 10, 3, 1, 11, 3, 46, 10, 8, 0, 46, 9, 7, 2, 37, 13, 2, 9, 6, 1, 45, 0, 13, 2, 49, 13, 9, 3, 2, 11, 83, 11, 7, 0, 3, 0, 158, 11, 6, 9, 7, 3, 56, 1, 2, 6, 3, 1, 3, 2, 10, 0, 11, 1, 3, 6, 4, 4, 193, 17, 10, 9, 5, 0, 82, 19, 13, 9, 214, 6, 3, 8, 28, 1, 83, 16, 16, 9, 82, 12, 9, 9, 84, 14, 5, 9, 243, 14, 166, 9, 71, 5, 2, 1, 3, 3, 2, 0, 2, 1, 13, 9, 120, 6, 3, 6, 4, 0, 29, 9, 41, 6, 2, 3, 9, 0, 10, 10, 47, 15, 406, 7, 2, 7, 17, 9, 57, 21, 2, 13, 123, 5, 4, 0, 2, 1, 2, 6, 2, 0, 9, 9, 49, 4, 2, 1, 2, 4, 9, 9, 330, 3, 10, 1, 2, 0, 49, 6, 4, 4, 14, 9, 5351, 0, 7, 14, 13835, 9, 87, 9, 39, 4, 60, 6, 26, 9, 1014, 0, 2, 54, 8, 3, 82, 0, 12, 1, 19628, 1, 4706, 45, 3, 22, 543, 4, 4, 5, 9, 7, 3, 6, 31, 3, 149, 2, 1418, 49, 513, 54, 5, 49, 9, 0, 15, 0, 23, 4, 2, 14, 1361, 6, 2, 16, 3, 6, 2, 1, 2, 4, 101, 0, 161, 6, 10, 9, 357, 0, 62, 13, 499, 13, 983, 6, 110, 6, 6, 9, 4759, 9, 787719, 239];
+
+ // This file was generated. Do not modify manually!
+ var astralIdentifierStartCodes = [0, 11, 2, 25, 2, 18, 2, 1, 2, 14, 3, 13, 35, 122, 70, 52, 268, 28, 4, 48, 48, 31, 14, 29, 6, 37, 11, 29, 3, 35, 5, 7, 2, 4, 43, 157, 19, 35, 5, 35, 5, 39, 9, 51, 13, 10, 2, 14, 2, 6, 2, 1, 2, 10, 2, 14, 2, 6, 2, 1, 68, 310, 10, 21, 11, 7, 25, 5, 2, 41, 2, 8, 70, 5, 3, 0, 2, 43, 2, 1, 4, 0, 3, 22, 11, 22, 10, 30, 66, 18, 2, 1, 11, 21, 11, 25, 71, 55, 7, 1, 65, 0, 16, 3, 2, 2, 2, 28, 43, 28, 4, 28, 36, 7, 2, 27, 28, 53, 11, 21, 11, 18, 14, 17, 111, 72, 56, 50, 14, 50, 14, 35, 349, 41, 7, 1, 79, 28, 11, 0, 9, 21, 43, 17, 47, 20, 28, 22, 13, 52, 58, 1, 3, 0, 14, 44, 33, 24, 27, 35, 30, 0, 3, 0, 9, 34, 4, 0, 13, 47, 15, 3, 22, 0, 2, 0, 36, 17, 2, 24, 20, 1, 64, 6, 2, 0, 2, 3, 2, 14, 2, 9, 8, 46, 39, 7, 3, 1, 3, 21, 2, 6, 2, 1, 2, 4, 4, 0, 19, 0, 13, 4, 159, 52, 19, 3, 21, 2, 31, 47, 21, 1, 2, 0, 185, 46, 42, 3, 37, 47, 21, 0, 60, 42, 14, 0, 72, 26, 38, 6, 186, 43, 117, 63, 32, 7, 3, 0, 3, 7, 2, 1, 2, 23, 16, 0, 2, 0, 95, 7, 3, 38, 17, 0, 2, 0, 29, 0, 11, 39, 8, 0, 22, 0, 12, 45, 20, 0, 19, 72, 264, 8, 2, 36, 18, 0, 50, 29, 113, 6, 2, 1, 2, 37, 22, 0, 26, 5, 2, 1, 2, 31, 15, 0, 328, 18, 16, 0, 2, 12, 2, 33, 125, 0, 80, 921, 103, 110, 18, 195, 2637, 96, 16, 1071, 18, 5, 4026, 582, 8634, 568, 8, 30, 18, 78, 18, 29, 19, 47, 17, 3, 32, 20, 6, 18, 689, 63, 129, 74, 6, 0, 67, 12, 65, 1, 2, 0, 29, 6135, 9, 1237, 43, 8, 8936, 3, 2, 6, 2, 1, 2, 290, 16, 0, 30, 2, 3, 0, 15, 3, 9, 395, 2309, 106, 6, 12, 4, 8, 8, 9, 5991, 84, 2, 70, 2, 1, 3, 0, 3, 1, 3, 3, 2, 11, 2, 0, 2, 6, 2, 64, 2, 3, 3, 7, 2, 6, 2, 27, 2, 3, 2, 4, 2, 0, 4, 6, 2, 339, 3, 24, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 30, 2, 24, 2, 7, 1845, 30, 7, 5, 262, 61, 147, 44, 11, 6, 17, 0, 322, 29, 19, 43, 485, 27, 757, 6, 2, 3, 2, 1, 2, 14, 2, 196, 60, 67, 8, 0, 1205, 3, 2, 26, 2, 1, 2, 0, 3, 0, 2, 9, 2, 3, 2, 0, 2, 0, 7, 0, 5, 0, 2, 0, 2, 0, 2, 2, 2, 1, 2, 0, 3, 0, 2, 0, 2, 0, 2, 0, 2, 0, 2, 1, 2, 0, 3, 3, 2, 6, 2, 3, 2, 3, 2, 0, 2, 9, 2, 16, 6, 2, 2, 4, 2, 16, 4421, 42719, 33, 4153, 7, 221, 3, 5761, 15, 7472, 3104, 541, 1507, 4938, 6, 4191];
+
+ // This file was generated. Do not modify manually!
+ var nonASCIIidentifierChars = "\u200c\u200d\xb7\u0300-\u036f\u0387\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u0669\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u06f0-\u06f9\u0711\u0730-\u074a\u07a6-\u07b0\u07c0-\u07c9\u07eb-\u07f3\u07fd\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u0898-\u089f\u08ca-\u08e1\u08e3-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u09e6-\u09ef\u09fe\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0ae6-\u0aef\u0afa-\u0aff\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b55-\u0b57\u0b62\u0b63\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c00-\u0c04\u0c3c\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c66-\u0c6f\u0c81-\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0ce6-\u0cef\u0cf3\u0d00-\u0d03\u0d3b\u0d3c\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d66-\u0d6f\u0d81-\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0de6-\u0def\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0e50-\u0e59\u0eb1\u0eb4-\u0ebc\u0ec8-\u0ece\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1040-\u1049\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u1369-\u1371\u1712-\u1715\u1732-\u1734\u1752\u1753\u1772\u1773\u17b4-\u17d3\u17dd\u17e0-\u17e9\u180b-\u180d\u180f-\u1819\u18a9\u1920-\u192b\u1930-\u193b\u1946-\u194f\u19d0-\u19da\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1ab0-\u1abd\u1abf-\u1ace\u1b00-\u1b04\u1b34-\u1b44\u1b50-\u1b59\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1bad\u1bb0-\u1bb9\u1be6-\u1bf3\u1c24-\u1c37\u1c40-\u1c49\u1c50-\u1c59\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf4\u1cf7-\u1cf9\u1dc0-\u1dff\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua620-\ua629\ua66f\ua674-\ua67d\ua69e\ua69f\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua82c\ua880\ua881\ua8b4-\ua8c5\ua8d0-\ua8d9\ua8e0-\ua8f1\ua8ff-\ua909\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\ua9d0-\ua9d9\ua9e5\ua9f0-\ua9f9\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa50-\uaa59\uaa7b-\uaa7d\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uaaeb-\uaaef\uaaf5\uaaf6\uabe3-\uabea\uabec\uabed\uabf0-\uabf9\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f";
+
+ // This file was generated. Do not modify manually!
+ var nonASCIIidentifierStartChars = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u037f\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u052f\u0531-\u0556\u0559\u0560-\u0588\u05d0-\u05ea\u05ef-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0860-\u086a\u0870-\u0887\u0889-\u088e\u08a0-\u08c9\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u09fc\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0af9\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c39\u0c3d\u0c58-\u0c5a\u0c5d\u0c60\u0c61\u0c80\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cdd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d04-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d54-\u0d56\u0d5f-\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e86-\u0e8a\u0e8c-\u0ea3\u0ea5\u0ea7-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f5\u13f8-\u13fd\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f8\u1700-\u1711\u171f-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1878\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191e\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19b0-\u19c9\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4c\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1c80-\u1c88\u1c90-\u1cba\u1cbd-\u1cbf\u1ce9-\u1cec\u1cee-\u1cf3\u1cf5\u1cf6\u1cfa\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2118-\u211d\u2124\u2126\u2128\u212a-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309b-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312f\u3131-\u318e\u31a0-\u31bf\u31f0-\u31ff\u3400-\u4dbf\u4e00-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua69d\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua7ca\ua7d0\ua7d1\ua7d3\ua7d5-\ua7d9\ua7f2-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua8fd\ua8fe\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\ua9e0-\ua9e4\ua9e6-\ua9ef\ua9fa-\ua9fe\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa7e-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uab30-\uab5a\uab5c-\uab69\uab70-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc";
+
+ // These are a run-length and offset encoded representation of the
+
+ // Reserved word lists for various dialects of the language
+
+ var reservedWords = {
+ 3: "abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile",
+ 5: "class enum extends super const export import",
+ 6: "enum",
+ strict: "implements interface let package private protected public static yield",
+ strictBind: "eval arguments"
+ };
+
+ // And the keywords
+
+ var ecma5AndLessKeywords = "break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this";
+
+ var keywords$1 = {
+ 5: ecma5AndLessKeywords,
+ "5module": ecma5AndLessKeywords + " export import",
+ 6: ecma5AndLessKeywords + " const class extends export import super"
+ };
+
+ var keywordRelationalOperator = /^in(stanceof)?$/;
+
+ // ## Character categories
+
+ var nonASCIIidentifierStart = new RegExp("[" + nonASCIIidentifierStartChars + "]");
+ var nonASCIIidentifier = new RegExp("[" + nonASCIIidentifierStartChars + nonASCIIidentifierChars + "]");
+
+ // This has a complexity linear to the value of the code. The
+ // assumption is that looking up astral identifier characters is
+ // rare.
+ function isInAstralSet(code, set) {
+ var pos = 0x10000;
+ for (var i = 0; i < set.length; i += 2) {
+ pos += set[i];
+ if (pos > code) { return false }
+ pos += set[i + 1];
+ if (pos >= code) { return true }
+ }
+ return false
+ }
+
+ // Test whether a given character code starts an identifier.
+
+ function isIdentifierStart(code, astral) {
+ if (code < 65) { return code === 36 }
+ if (code < 91) { return true }
+ if (code < 97) { return code === 95 }
+ if (code < 123) { return true }
+ if (code <= 0xffff) { return code >= 0xaa && nonASCIIidentifierStart.test(String.fromCharCode(code)) }
+ if (astral === false) { return false }
+ return isInAstralSet(code, astralIdentifierStartCodes)
+ }
+
+ // Test whether a given character is part of an identifier.
+
+ function isIdentifierChar(code, astral) {
+ if (code < 48) { return code === 36 }
+ if (code < 58) { return true }
+ if (code < 65) { return false }
+ if (code < 91) { return true }
+ if (code < 97) { return code === 95 }
+ if (code < 123) { return true }
+ if (code <= 0xffff) { return code >= 0xaa && nonASCIIidentifier.test(String.fromCharCode(code)) }
+ if (astral === false) { return false }
+ return isInAstralSet(code, astralIdentifierStartCodes) || isInAstralSet(code, astralIdentifierCodes)
+ }
+
+ // ## Token types
+
+ // The assignment of fine-grained, information-carrying type objects
+ // allows the tokenizer to store the information it has about a
+ // token in a way that is very cheap for the parser to look up.
+
+ // All token type variables start with an underscore, to make them
+ // easy to recognize.
+
+ // The `beforeExpr` property is used to disambiguate between regular
+ // expressions and divisions. It is set on all token types that can
+ // be followed by an expression (thus, a slash after them would be a
+ // regular expression).
+ //
+ // The `startsExpr` property is used to check if the token ends a
+ // `yield` expression. It is set on all token types that either can
+ // directly start an expression (like a quotation mark) or can
+ // continue an expression (like the body of a string).
+ //
+ // `isLoop` marks a keyword as starting a loop, which is important
+ // to know when parsing a label, in order to allow or disallow
+ // continue jumps to that label.
+
+ var TokenType = function TokenType(label, conf) {
+ if ( conf === void 0 ) conf = {};
+
+ this.label = label;
+ this.keyword = conf.keyword;
+ this.beforeExpr = !!conf.beforeExpr;
+ this.startsExpr = !!conf.startsExpr;
+ this.isLoop = !!conf.isLoop;
+ this.isAssign = !!conf.isAssign;
+ this.prefix = !!conf.prefix;
+ this.postfix = !!conf.postfix;
+ this.binop = conf.binop || null;
+ this.updateContext = null;
+ };
+
+ function binop(name, prec) {
+ return new TokenType(name, {beforeExpr: true, binop: prec})
+ }
+ var beforeExpr = {beforeExpr: true}, startsExpr = {startsExpr: true};
+
+ // Map keyword names to token types.
+
+ var keywords = {};
+
+ // Succinct definitions of keyword token types
+ function kw(name, options) {
+ if ( options === void 0 ) options = {};
+
+ options.keyword = name;
+ return keywords[name] = new TokenType(name, options)
+ }
+
+ var types$1 = {
+ num: new TokenType("num", startsExpr),
+ regexp: new TokenType("regexp", startsExpr),
+ string: new TokenType("string", startsExpr),
+ name: new TokenType("name", startsExpr),
+ privateId: new TokenType("privateId", startsExpr),
+ eof: new TokenType("eof"),
+
+ // Punctuation token types.
+ bracketL: new TokenType("[", {beforeExpr: true, startsExpr: true}),
+ bracketR: new TokenType("]"),
+ braceL: new TokenType("{", {beforeExpr: true, startsExpr: true}),
+ braceR: new TokenType("}"),
+ parenL: new TokenType("(", {beforeExpr: true, startsExpr: true}),
+ parenR: new TokenType(")"),
+ comma: new TokenType(",", beforeExpr),
+ semi: new TokenType(";", beforeExpr),
+ colon: new TokenType(":", beforeExpr),
+ dot: new TokenType("."),
+ question: new TokenType("?", beforeExpr),
+ questionDot: new TokenType("?."),
+ arrow: new TokenType("=>", beforeExpr),
+ template: new TokenType("template"),
+ invalidTemplate: new TokenType("invalidTemplate"),
+ ellipsis: new TokenType("...", beforeExpr),
+ backQuote: new TokenType("`", startsExpr),
+ dollarBraceL: new TokenType("${", {beforeExpr: true, startsExpr: true}),
+
+ // Operators. These carry several kinds of properties to help the
+ // parser use them properly (the presence of these properties is
+ // what categorizes them as operators).
+ //
+ // `binop`, when present, specifies that this operator is a binary
+ // operator, and will refer to its precedence.
+ //
+ // `prefix` and `postfix` mark the operator as a prefix or postfix
+ // unary operator.
+ //
+ // `isAssign` marks all of `=`, `+=`, `-=` etcetera, which act as
+ // binary operators with a very low precedence, that should result
+ // in AssignmentExpression nodes.
+
+ eq: new TokenType("=", {beforeExpr: true, isAssign: true}),
+ assign: new TokenType("_=", {beforeExpr: true, isAssign: true}),
+ incDec: new TokenType("++/--", {prefix: true, postfix: true, startsExpr: true}),
+ prefix: new TokenType("!/~", {beforeExpr: true, prefix: true, startsExpr: true}),
+ logicalOR: binop("||", 1),
+ logicalAND: binop("&&", 2),
+ bitwiseOR: binop("|", 3),
+ bitwiseXOR: binop("^", 4),
+ bitwiseAND: binop("&", 5),
+ equality: binop("==/!=/===/!==", 6),
+ relational: binop("</>/<=/>=", 7),
+ bitShift: binop("<</>>/>>>", 8),
+ plusMin: new TokenType("+/-", {beforeExpr: true, binop: 9, prefix: true, startsExpr: true}),
+ modulo: binop("%", 10),
+ star: binop("*", 10),
+ slash: binop("/", 10),
+ starstar: new TokenType("**", {beforeExpr: true}),
+ coalesce: binop("??", 1),
+
+ // Keyword token types.
+ _break: kw("break"),
+ _case: kw("case", beforeExpr),
+ _catch: kw("catch"),
+ _continue: kw("continue"),
+ _debugger: kw("debugger"),
+ _default: kw("default", beforeExpr),
+ _do: kw("do", {isLoop: true, beforeExpr: true}),
+ _else: kw("else", beforeExpr),
+ _finally: kw("finally"),
+ _for: kw("for", {isLoop: true}),
+ _function: kw("function", startsExpr),
+ _if: kw("if"),
+ _return: kw("return", beforeExpr),
+ _switch: kw("switch"),
+ _throw: kw("throw", beforeExpr),
+ _try: kw("try"),
+ _var: kw("var"),
+ _const: kw("const"),
+ _while: kw("while", {isLoop: true}),
+ _with: kw("with"),
+ _new: kw("new", {beforeExpr: true, startsExpr: true}),
+ _this: kw("this", startsExpr),
+ _super: kw("super", startsExpr),
+ _class: kw("class", startsExpr),
+ _extends: kw("extends", beforeExpr),
+ _export: kw("export"),
+ _import: kw("import", startsExpr),
+ _null: kw("null", startsExpr),
+ _true: kw("true", startsExpr),
+ _false: kw("false", startsExpr),
+ _in: kw("in", {beforeExpr: true, binop: 7}),
+ _instanceof: kw("instanceof", {beforeExpr: true, binop: 7}),
+ _typeof: kw("typeof", {beforeExpr: true, prefix: true, startsExpr: true}),
+ _void: kw("void", {beforeExpr: true, prefix: true, startsExpr: true}),
+ _delete: kw("delete", {beforeExpr: true, prefix: true, startsExpr: true})
+ };
+
+ // Matches a whole line break (where CRLF is considered a single
+ // line break). Used to count lines.
+
+ var lineBreak = /\r\n?|\n|\u2028|\u2029/;
+ var lineBreakG = new RegExp(lineBreak.source, "g");
+
+ function isNewLine(code) {
+ return code === 10 || code === 13 || code === 0x2028 || code === 0x2029
+ }
+
+ function nextLineBreak(code, from, end) {
+ if ( end === void 0 ) end = code.length;
+
+ for (var i = from; i < end; i++) {
+ var next = code.charCodeAt(i);
+ if (isNewLine(next))
+ { return i < end - 1 && next === 13 && code.charCodeAt(i + 1) === 10 ? i + 2 : i + 1 }
+ }
+ return -1
+ }
+
+ var nonASCIIwhitespace = /[\u1680\u2000-\u200a\u202f\u205f\u3000\ufeff]/;
+
+ var skipWhiteSpace = /(?:\s|\/\/.*|\/\*[^]*?\*\/)*/g;
+
+ var ref = Object.prototype;
+ var hasOwnProperty = ref.hasOwnProperty;
+ var toString = ref.toString;
+
+ var hasOwn = Object.hasOwn || (function (obj, propName) { return (
+ hasOwnProperty.call(obj, propName)
+ ); });
+
+ var isArray = Array.isArray || (function (obj) { return (
+ toString.call(obj) === "[object Array]"
+ ); });
+
+ function wordsRegexp(words) {
+ return new RegExp("^(?:" + words.replace(/ /g, "|") + ")$")
+ }
+
+ function codePointToString(code) {
+ // UTF-16 Decoding
+ if (code <= 0xFFFF) { return String.fromCharCode(code) }
+ code -= 0x10000;
+ return String.fromCharCode((code >> 10) + 0xD800, (code & 1023) + 0xDC00)
+ }
+
+ var loneSurrogate = /(?:[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF])/;
+
+ // These are used when `options.locations` is on, for the
+ // `startLoc` and `endLoc` properties.
+
+ var Position = function Position(line, col) {
+ this.line = line;
+ this.column = col;
+ };
+
+ Position.prototype.offset = function offset (n) {
+ return new Position(this.line, this.column + n)
+ };
+
+ var SourceLocation = function SourceLocation(p, start, end) {
+ this.start = start;
+ this.end = end;
+ if (p.sourceFile !== null) { this.source = p.sourceFile; }
+ };
+
+ // The `getLineInfo` function is mostly useful when the
+ // `locations` option is off (for performance reasons) and you
+ // want to find the line/column position for a given character
+ // offset. `input` should be the code string that the offset refers
+ // into.
+
+ function getLineInfo(input, offset) {
+ for (var line = 1, cur = 0;;) {
+ var nextBreak = nextLineBreak(input, cur, offset);
+ if (nextBreak < 0) { return new Position(line, offset - cur) }
+ ++line;
+ cur = nextBreak;
+ }
+ }
+
+ // A second argument must be given to configure the parser process.
+ // These options are recognized (only `ecmaVersion` is required):
+
+ var defaultOptions = {
+ // `ecmaVersion` indicates the ECMAScript version to parse. Must be
+ // either 3, 5, 6 (or 2015), 7 (2016), 8 (2017), 9 (2018), 10
+ // (2019), 11 (2020), 12 (2021), 13 (2022), 14 (2023), or `"latest"`
+ // (the latest version the library supports). This influences
+ // support for strict mode, the set of reserved words, and support
+ // for new syntax features.
+ ecmaVersion: null,
+ // `sourceType` indicates the mode the code should be parsed in.
+ // Can be either `"script"` or `"module"`. This influences global
+ // strict mode and parsing of `import` and `export` declarations.
+ sourceType: "script",
+ // `onInsertedSemicolon` can be a callback that will be called
+ // when a semicolon is automatically inserted. It will be passed
+ // the position of the comma as an offset, and if `locations` is
+ // enabled, it is given the location as a `{line, column}` object
+ // as second argument.
+ onInsertedSemicolon: null,
+ // `onTrailingComma` is similar to `onInsertedSemicolon`, but for
+ // trailing commas.
+ onTrailingComma: null,
+ // By default, reserved words are only enforced if ecmaVersion >= 5.
+ // Set `allowReserved` to a boolean value to explicitly turn this on
+ // an off. When this option has the value "never", reserved words
+ // and keywords can also not be used as property names.
+ allowReserved: null,
+ // When enabled, a return at the top level is not considered an
+ // error.
+ allowReturnOutsideFunction: false,
+ // When enabled, import/export statements are not constrained to
+ // appearing at the top of the program, and an import.meta expression
+ // in a script isn't considered an error.
+ allowImportExportEverywhere: false,
+ // By default, await identifiers are allowed to appear at the top-level scope only if ecmaVersion >= 2022.
+ // When enabled, await identifiers are allowed to appear at the top-level scope,
+ // but they are still not allowed in non-async functions.
+ allowAwaitOutsideFunction: null,
+ // When enabled, super identifiers are not constrained to
+ // appearing in methods and do not raise an error when they appear elsewhere.
+ allowSuperOutsideMethod: null,
+ // When enabled, hashbang directive in the beginning of file is
+ // allowed and treated as a line comment. Enabled by default when
+ // `ecmaVersion` >= 2023.
+ allowHashBang: false,
+ // When `locations` is on, `loc` properties holding objects with
+ // `start` and `end` properties in `{line, column}` form (with
+ // line being 1-based and column 0-based) will be attached to the
+ // nodes.
+ locations: false,
+ // A function can be passed as `onToken` option, which will
+ // cause Acorn to call that function with object in the same
+ // format as tokens returned from `tokenizer().getToken()`. Note
+ // that you are not allowed to call the parser from the
+ // callback—that will corrupt its internal state.
+ onToken: null,
+ // A function can be passed as `onComment` option, which will
+ // cause Acorn to call that function with `(block, text, start,
+ // end)` parameters whenever a comment is skipped. `block` is a
+ // boolean indicating whether this is a block (`/* */`) comment,
+ // `text` is the content of the comment, and `start` and `end` are
+ // character offsets that denote the start and end of the comment.
+ // When the `locations` option is on, two more parameters are
+ // passed, the full `{line, column}` locations of the start and
+ // end of the comments. Note that you are not allowed to call the
+ // parser from the callback—that will corrupt its internal state.
+ onComment: null,
+ // Nodes have their start and end characters offsets recorded in
+ // `start` and `end` properties (directly on the node, rather than
+ // the `loc` object, which holds line/column data. To also add a
+ // [semi-standardized][range] `range` property holding a `[start,
+ // end]` array with the same numbers, set the `ranges` option to
+ // `true`.
+ //
+ // [range]: https://bugzilla.mozilla.org/show_bug.cgi?id=745678
+ ranges: false,
+ // It is possible to parse multiple files into a single AST by
+ // passing the tree produced by parsing the first file as
+ // `program` option in subsequent parses. This will add the
+ // toplevel forms of the parsed file to the `Program` (top) node
+ // of an existing parse tree.
+ program: null,
+ // When `locations` is on, you can pass this to record the source
+ // file in every node's `loc` object.
+ sourceFile: null,
+ // This value, if given, is stored in every node, whether
+ // `locations` is on or off.
+ directSourceFile: null,
+ // When enabled, parenthesized expressions are represented by
+ // (non-standard) ParenthesizedExpression nodes
+ preserveParens: false
+ };
+
+ // Interpret and default an options object
+
+ var warnedAboutEcmaVersion = false;
+
+ function getOptions(opts) {
+ var options = {};
+
+ for (var opt in defaultOptions)
+ { options[opt] = opts && hasOwn(opts, opt) ? opts[opt] : defaultOptions[opt]; }
+
+ if (options.ecmaVersion === "latest") {
+ options.ecmaVersion = 1e8;
+ } else if (options.ecmaVersion == null) {
+ if (!warnedAboutEcmaVersion && typeof console === "object" && console.warn) {
+ warnedAboutEcmaVersion = true;
+ console.warn("Since Acorn 8.0.0, options.ecmaVersion is required.\nDefaulting to 2020, but this will stop working in the future.");
+ }
+ options.ecmaVersion = 11;
+ } else if (options.ecmaVersion >= 2015) {
+ options.ecmaVersion -= 2009;
+ }
+
+ if (options.allowReserved == null)
+ { options.allowReserved = options.ecmaVersion < 5; }
+
+ if (!opts || opts.allowHashBang == null)
+ { options.allowHashBang = options.ecmaVersion >= 14; }
+
+ if (isArray(options.onToken)) {
+ var tokens = options.onToken;
+ options.onToken = function (token) { return tokens.push(token); };
+ }
+ if (isArray(options.onComment))
+ { options.onComment = pushComment(options, options.onComment); }
+
+ return options
+ }
+
+ function pushComment(options, array) {
+ return function(block, text, start, end, startLoc, endLoc) {
+ var comment = {
+ type: block ? "Block" : "Line",
+ value: text,
+ start: start,
+ end: end
+ };
+ if (options.locations)
+ { comment.loc = new SourceLocation(this, startLoc, endLoc); }
+ if (options.ranges)
+ { comment.range = [start, end]; }
+ array.push(comment);
+ }
+ }
+
+ // Each scope gets a bitset that may contain these flags
+ var
+ SCOPE_TOP = 1,
+ SCOPE_FUNCTION = 2,
+ SCOPE_ASYNC = 4,
+ SCOPE_GENERATOR = 8,
+ SCOPE_ARROW = 16,
+ SCOPE_SIMPLE_CATCH = 32,
+ SCOPE_SUPER = 64,
+ SCOPE_DIRECT_SUPER = 128,
+ SCOPE_CLASS_STATIC_BLOCK = 256,
+ SCOPE_VAR = SCOPE_TOP | SCOPE_FUNCTION | SCOPE_CLASS_STATIC_BLOCK;
+
+ function functionFlags(async, generator) {
+ return SCOPE_FUNCTION | (async ? SCOPE_ASYNC : 0) | (generator ? SCOPE_GENERATOR : 0)
+ }
+
+ // Used in checkLVal* and declareName to determine the type of a binding
+ var
+ BIND_NONE = 0, // Not a binding
+ BIND_VAR = 1, // Var-style binding
+ BIND_LEXICAL = 2, // Let- or const-style binding
+ BIND_FUNCTION = 3, // Function declaration
+ BIND_SIMPLE_CATCH = 4, // Simple (identifier pattern) catch binding
+ BIND_OUTSIDE = 5; // Special case for function names as bound inside the function
+
+ var Parser = function Parser(options, input, startPos) {
+ this.options = options = getOptions(options);
+ this.sourceFile = options.sourceFile;
+ this.keywords = wordsRegexp(keywords$1[options.ecmaVersion >= 6 ? 6 : options.sourceType === "module" ? "5module" : 5]);
+ var reserved = "";
+ if (options.allowReserved !== true) {
+ reserved = reservedWords[options.ecmaVersion >= 6 ? 6 : options.ecmaVersion === 5 ? 5 : 3];
+ if (options.sourceType === "module") { reserved += " await"; }
+ }
+ this.reservedWords = wordsRegexp(reserved);
+ var reservedStrict = (reserved ? reserved + " " : "") + reservedWords.strict;
+ this.reservedWordsStrict = wordsRegexp(reservedStrict);
+ this.reservedWordsStrictBind = wordsRegexp(reservedStrict + " " + reservedWords.strictBind);
+ this.input = String(input);
+
+ // Used to signal to callers of `readWord1` whether the word
+ // contained any escape sequences. This is needed because words with
+ // escape sequences must not be interpreted as keywords.
+ this.containsEsc = false;
+
+ // Set up token state
+
+ // The current position of the tokenizer in the input.
+ if (startPos) {
+ this.pos = startPos;
+ this.lineStart = this.input.lastIndexOf("\n", startPos - 1) + 1;
+ this.curLine = this.input.slice(0, this.lineStart).split(lineBreak).length;
+ } else {
+ this.pos = this.lineStart = 0;
+ this.curLine = 1;
+ }
+
+ // Properties of the current token:
+ // Its type
+ this.type = types$1.eof;
+ // For tokens that include more information than their type, the value
+ this.value = null;
+ // Its start and end offset
+ this.start = this.end = this.pos;
+ // And, if locations are used, the {line, column} object
+ // corresponding to those offsets
+ this.startLoc = this.endLoc = this.curPosition();
+
+ // Position information for the previous token
+ this.lastTokEndLoc = this.lastTokStartLoc = null;
+ this.lastTokStart = this.lastTokEnd = this.pos;
+
+ // The context stack is used to superficially track syntactic
+ // context to predict whether a regular expression is allowed in a
+ // given position.
+ this.context = this.initialContext();
+ this.exprAllowed = true;
+
+ // Figure out if it's a module code.
+ this.inModule = options.sourceType === "module";
+ this.strict = this.inModule || this.strictDirective(this.pos);
+
+ // Used to signify the start of a potential arrow function
+ this.potentialArrowAt = -1;
+ this.potentialArrowInForAwait = false;
+
+ // Positions to delayed-check that yield/await does not exist in default parameters.
+ this.yieldPos = this.awaitPos = this.awaitIdentPos = 0;
+ // Labels in scope.
+ this.labels = [];
+ // Thus-far undefined exports.
+ this.undefinedExports = Object.create(null);
+
+ // If enabled, skip leading hashbang line.
+ if (this.pos === 0 && options.allowHashBang && this.input.slice(0, 2) === "#!")
+ { this.skipLineComment(2); }
+
+ // Scope tracking for duplicate variable names (see scope.js)
+ this.scopeStack = [];
+ this.enterScope(SCOPE_TOP);
+
+ // For RegExp validation
+ this.regexpState = null;
+
+ // The stack of private names.
+ // Each element has two properties: 'declared' and 'used'.
+ // When it exited from the outermost class definition, all used private names must be declared.
+ this.privateNameStack = [];
+ };
+
+ var prototypeAccessors = { inFunction: { configurable: true },inGenerator: { configurable: true },inAsync: { configurable: true },canAwait: { configurable: true },allowSuper: { configurable: true },allowDirectSuper: { configurable: true },treatFunctionsAsVar: { configurable: true },allowNewDotTarget: { configurable: true },inClassStaticBlock: { configurable: true } };
+
+ Parser.prototype.parse = function parse () {
+ var node = this.options.program || this.startNode();
+ this.nextToken();
+ return this.parseTopLevel(node)
+ };
+
+ prototypeAccessors.inFunction.get = function () { return (this.currentVarScope().flags & SCOPE_FUNCTION) > 0 };
+
+ prototypeAccessors.inGenerator.get = function () { return (this.currentVarScope().flags & SCOPE_GENERATOR) > 0 && !this.currentVarScope().inClassFieldInit };
+
+ prototypeAccessors.inAsync.get = function () { return (this.currentVarScope().flags & SCOPE_ASYNC) > 0 && !this.currentVarScope().inClassFieldInit };
+
+ prototypeAccessors.canAwait.get = function () {
+ for (var i = this.scopeStack.length - 1; i >= 0; i--) {
+ var scope = this.scopeStack[i];
+ if (scope.inClassFieldInit || scope.flags & SCOPE_CLASS_STATIC_BLOCK) { return false }
+ if (scope.flags & SCOPE_FUNCTION) { return (scope.flags & SCOPE_ASYNC) > 0 }
+ }
+ return (this.inModule && this.options.ecmaVersion >= 13) || this.options.allowAwaitOutsideFunction
+ };
+
+ prototypeAccessors.allowSuper.get = function () {
+ var ref = this.currentThisScope();
+ var flags = ref.flags;
+ var inClassFieldInit = ref.inClassFieldInit;
+ return (flags & SCOPE_SUPER) > 0 || inClassFieldInit || this.options.allowSuperOutsideMethod
+ };
+
+ prototypeAccessors.allowDirectSuper.get = function () { return (this.currentThisScope().flags & SCOPE_DIRECT_SUPER) > 0 };
+
+ prototypeAccessors.treatFunctionsAsVar.get = function () { return this.treatFunctionsAsVarInScope(this.currentScope()) };
+
+ prototypeAccessors.allowNewDotTarget.get = function () {
+ var ref = this.currentThisScope();
+ var flags = ref.flags;
+ var inClassFieldInit = ref.inClassFieldInit;
+ return (flags & (SCOPE_FUNCTION | SCOPE_CLASS_STATIC_BLOCK)) > 0 || inClassFieldInit
+ };
+
+ prototypeAccessors.inClassStaticBlock.get = function () {
+ return (this.currentVarScope().flags & SCOPE_CLASS_STATIC_BLOCK) > 0
+ };
+
+ Parser.extend = function extend () {
+ var plugins = [], len = arguments.length;
+ while ( len-- ) plugins[ len ] = arguments[ len ];
+
+ var cls = this;
+ for (var i = 0; i < plugins.length; i++) { cls = plugins[i](cls); }
+ return cls
+ };
+
+ Parser.parse = function parse (input, options) {
+ return new this(options, input).parse()
+ };
+
+ Parser.parseExpressionAt = function parseExpressionAt (input, pos, options) {
+ var parser = new this(options, input, pos);
+ parser.nextToken();
+ return parser.parseExpression()
+ };
+
+ Parser.tokenizer = function tokenizer (input, options) {
+ return new this(options, input)
+ };
+
+ Object.defineProperties( Parser.prototype, prototypeAccessors );
+
+ var pp$9 = Parser.prototype;
+
+ // ## Parser utilities
+
+ var literal = /^(?:'((?:\\.|[^'\\])*?)'|"((?:\\.|[^"\\])*?)")/;
+ pp$9.strictDirective = function(start) {
+ if (this.options.ecmaVersion < 5) { return false }
+ for (;;) {
+ // Try to find string literal.
+ skipWhiteSpace.lastIndex = start;
+ start += skipWhiteSpace.exec(this.input)[0].length;
+ var match = literal.exec(this.input.slice(start));
+ if (!match) { return false }
+ if ((match[1] || match[2]) === "use strict") {
+ skipWhiteSpace.lastIndex = start + match[0].length;
+ var spaceAfter = skipWhiteSpace.exec(this.input), end = spaceAfter.index + spaceAfter[0].length;
+ var next = this.input.charAt(end);
+ return next === ";" || next === "}" ||
+ (lineBreak.test(spaceAfter[0]) &&
+ !(/[(`.[+\-/*%<>=,?^&]/.test(next) || next === "!" && this.input.charAt(end + 1) === "="))
+ }
+ start += match[0].length;
+
+ // Skip semicolon, if any.
+ skipWhiteSpace.lastIndex = start;
+ start += skipWhiteSpace.exec(this.input)[0].length;
+ if (this.input[start] === ";")
+ { start++; }
+ }
+ };
+
+ // Predicate that tests whether the next token is of the given
+ // type, and if yes, consumes it as a side effect.
+
+ pp$9.eat = function(type) {
+ if (this.type === type) {
+ this.next();
+ return true
+ } else {
+ return false
+ }
+ };
+
+ // Tests whether parsed token is a contextual keyword.
+
+ pp$9.isContextual = function(name) {
+ return this.type === types$1.name && this.value === name && !this.containsEsc
+ };
+
+ // Consumes contextual keyword if possible.
+
+ pp$9.eatContextual = function(name) {
+ if (!this.isContextual(name)) { return false }
+ this.next();
+ return true
+ };
+
+ // Asserts that following token is given contextual keyword.
+
+ pp$9.expectContextual = function(name) {
+ if (!this.eatContextual(name)) { this.unexpected(); }
+ };
+
+ // Test whether a semicolon can be inserted at the current position.
+
+ pp$9.canInsertSemicolon = function() {
+ return this.type === types$1.eof ||
+ this.type === types$1.braceR ||
+ lineBreak.test(this.input.slice(this.lastTokEnd, this.start))
+ };
+
+ pp$9.insertSemicolon = function() {
+ if (this.canInsertSemicolon()) {
+ if (this.options.onInsertedSemicolon)
+ { this.options.onInsertedSemicolon(this.lastTokEnd, this.lastTokEndLoc); }
+ return true
+ }
+ };
+
+ // Consume a semicolon, or, failing that, see if we are allowed to
+ // pretend that there is a semicolon at this position.
+
+ pp$9.semicolon = function() {
+ if (!this.eat(types$1.semi) && !this.insertSemicolon()) { this.unexpected(); }
+ };
+
+ pp$9.afterTrailingComma = function(tokType, notNext) {
+ if (this.type === tokType) {
+ if (this.options.onTrailingComma)
+ { this.options.onTrailingComma(this.lastTokStart, this.lastTokStartLoc); }
+ if (!notNext)
+ { this.next(); }
+ return true
+ }
+ };
+
+ // Expect a token of a given type. If found, consume it, otherwise,
+ // raise an unexpected token error.
+
+ pp$9.expect = function(type) {
+ this.eat(type) || this.unexpected();
+ };
+
+ // Raise an unexpected token error.
+
+ pp$9.unexpected = function(pos) {
+ this.raise(pos != null ? pos : this.start, "Unexpected token");
+ };
+
+ var DestructuringErrors = function DestructuringErrors() {
+ this.shorthandAssign =
+ this.trailingComma =
+ this.parenthesizedAssign =
+ this.parenthesizedBind =
+ this.doubleProto =
+ -1;
+ };
+
+ pp$9.checkPatternErrors = function(refDestructuringErrors, isAssign) {
+ if (!refDestructuringErrors) { return }
+ if (refDestructuringErrors.trailingComma > -1)
+ { this.raiseRecoverable(refDestructuringErrors.trailingComma, "Comma is not permitted after the rest element"); }
+ var parens = isAssign ? refDestructuringErrors.parenthesizedAssign : refDestructuringErrors.parenthesizedBind;
+ if (parens > -1) { this.raiseRecoverable(parens, isAssign ? "Assigning to rvalue" : "Parenthesized pattern"); }
+ };
+
+ pp$9.checkExpressionErrors = function(refDestructuringErrors, andThrow) {
+ if (!refDestructuringErrors) { return false }
+ var shorthandAssign = refDestructuringErrors.shorthandAssign;
+ var doubleProto = refDestructuringErrors.doubleProto;
+ if (!andThrow) { return shorthandAssign >= 0 || doubleProto >= 0 }
+ if (shorthandAssign >= 0)
+ { this.raise(shorthandAssign, "Shorthand property assignments are valid only in destructuring patterns"); }
+ if (doubleProto >= 0)
+ { this.raiseRecoverable(doubleProto, "Redefinition of __proto__ property"); }
+ };
+
+ pp$9.checkYieldAwaitInDefaultParams = function() {
+ if (this.yieldPos && (!this.awaitPos || this.yieldPos < this.awaitPos))
+ { this.raise(this.yieldPos, "Yield expression cannot be a default value"); }
+ if (this.awaitPos)
+ { this.raise(this.awaitPos, "Await expression cannot be a default value"); }
+ };
+
+ pp$9.isSimpleAssignTarget = function(expr) {
+ if (expr.type === "ParenthesizedExpression")
+ { return this.isSimpleAssignTarget(expr.expression) }
+ return expr.type === "Identifier" || expr.type === "MemberExpression"
+ };
+
+ var pp$8 = Parser.prototype;
+
+ // ### Statement parsing
+
+ // Parse a program. Initializes the parser, reads any number of
+ // statements, and wraps them in a Program node. Optionally takes a
+ // `program` argument. If present, the statements will be appended
+ // to its body instead of creating a new node.
+
+ pp$8.parseTopLevel = function(node) {
+ var exports = Object.create(null);
+ if (!node.body) { node.body = []; }
+ while (this.type !== types$1.eof) {
+ var stmt = this.parseStatement(null, true, exports);
+ node.body.push(stmt);
+ }
+ if (this.inModule)
+ { for (var i = 0, list = Object.keys(this.undefinedExports); i < list.length; i += 1)
+ {
+ var name = list[i];
+
+ this.raiseRecoverable(this.undefinedExports[name].start, ("Export '" + name + "' is not defined"));
+ } }
+ this.adaptDirectivePrologue(node.body);
+ this.next();
+ node.sourceType = this.options.sourceType;
+ return this.finishNode(node, "Program")
+ };
+
+ var loopLabel = {kind: "loop"}, switchLabel = {kind: "switch"};
+
+ pp$8.isLet = function(context) {
+ if (this.options.ecmaVersion < 6 || !this.isContextual("let")) { return false }
+ skipWhiteSpace.lastIndex = this.pos;
+ var skip = skipWhiteSpace.exec(this.input);
+ var next = this.pos + skip[0].length, nextCh = this.input.charCodeAt(next);
+ // For ambiguous cases, determine if a LexicalDeclaration (or only a
+ // Statement) is allowed here. If context is not empty then only a Statement
+ // is allowed. However, `let [` is an explicit negative lookahead for
+ // ExpressionStatement, so special-case it first.
+ if (nextCh === 91 || nextCh === 92) { return true } // '[', '/'
+ if (context) { return false }
+
+ if (nextCh === 123 || nextCh > 0xd7ff && nextCh < 0xdc00) { return true } // '{', astral
+ if (isIdentifierStart(nextCh, true)) {
+ var pos = next + 1;
+ while (isIdentifierChar(nextCh = this.input.charCodeAt(pos), true)) { ++pos; }
+ if (nextCh === 92 || nextCh > 0xd7ff && nextCh < 0xdc00) { return true }
+ var ident = this.input.slice(next, pos);
+ if (!keywordRelationalOperator.test(ident)) { return true }
+ }
+ return false
+ };
+
+ // check 'async [no LineTerminator here] function'
+ // - 'async /*foo*/ function' is OK.
+ // - 'async /*\n*/ function' is invalid.
+ pp$8.isAsyncFunction = function() {
+ if (this.options.ecmaVersion < 8 || !this.isContextual("async"))
+ { return false }
+
+ skipWhiteSpace.lastIndex = this.pos;
+ var skip = skipWhiteSpace.exec(this.input);
+ var next = this.pos + skip[0].length, after;
+ return !lineBreak.test(this.input.slice(this.pos, next)) &&
+ this.input.slice(next, next + 8) === "function" &&
+ (next + 8 === this.input.length ||
+ !(isIdentifierChar(after = this.input.charCodeAt(next + 8)) || after > 0xd7ff && after < 0xdc00))
+ };
+
+ // Parse a single statement.
+ //
+ // If expecting a statement and finding a slash operator, parse a
+ // regular expression literal. This is to handle cases like
+ // `if (foo) /blah/.exec(foo)`, where looking at the previous token
+ // does not help.
+
+ pp$8.parseStatement = function(context, topLevel, exports) {
+ var starttype = this.type, node = this.startNode(), kind;
+
+ if (this.isLet(context)) {
+ starttype = types$1._var;
+ kind = "let";
+ }
+
+ // Most types of statements are recognized by the keyword they
+ // start with. Many are trivial to parse, some require a bit of
+ // complexity.
+
+ switch (starttype) {
+ case types$1._break: case types$1._continue: return this.parseBreakContinueStatement(node, starttype.keyword)
+ case types$1._debugger: return this.parseDebuggerStatement(node)
+ case types$1._do: return this.parseDoStatement(node)
+ case types$1._for: return this.parseForStatement(node)
+ case types$1._function:
+ // Function as sole body of either an if statement or a labeled statement
+ // works, but not when it is part of a labeled statement that is the sole
+ // body of an if statement.
+ if ((context && (this.strict || context !== "if" && context !== "label")) && this.options.ecmaVersion >= 6) { this.unexpected(); }
+ return this.parseFunctionStatement(node, false, !context)
+ case types$1._class:
+ if (context) { this.unexpected(); }
+ return this.parseClass(node, true)
+ case types$1._if: return this.parseIfStatement(node)
+ case types$1._return: return this.parseReturnStatement(node)
+ case types$1._switch: return this.parseSwitchStatement(node)
+ case types$1._throw: return this.parseThrowStatement(node)
+ case types$1._try: return this.parseTryStatement(node)
+ case types$1._const: case types$1._var:
+ kind = kind || this.value;
+ if (context && kind !== "var") { this.unexpected(); }
+ return this.parseVarStatement(node, kind)
+ case types$1._while: return this.parseWhileStatement(node)
+ case types$1._with: return this.parseWithStatement(node)
+ case types$1.braceL: return this.parseBlock(true, node)
+ case types$1.semi: return this.parseEmptyStatement(node)
+ case types$1._export:
+ case types$1._import:
+ if (this.options.ecmaVersion > 10 && starttype === types$1._import) {
+ skipWhiteSpace.lastIndex = this.pos;
+ var skip = skipWhiteSpace.exec(this.input);
+ var next = this.pos + skip[0].length, nextCh = this.input.charCodeAt(next);
+ if (nextCh === 40 || nextCh === 46) // '(' or '.'
+ { return this.parseExpressionStatement(node, this.parseExpression()) }
+ }
+
+ if (!this.options.allowImportExportEverywhere) {
+ if (!topLevel)
+ { this.raise(this.start, "'import' and 'export' may only appear at the top level"); }
+ if (!this.inModule)
+ { this.raise(this.start, "'import' and 'export' may appear only with 'sourceType: module'"); }
+ }
+ return starttype === types$1._import ? this.parseImport(node) : this.parseExport(node, exports)
+
+ // If the statement does not start with a statement keyword or a
+ // brace, it's an ExpressionStatement or LabeledStatement. We
+ // simply start parsing an expression, and afterwards, if the
+ // next token is a colon and the expression was a simple
+ // Identifier node, we switch to interpreting it as a label.
+ default:
+ if (this.isAsyncFunction()) {
+ if (context) { this.unexpected(); }
+ this.next();
+ return this.parseFunctionStatement(node, true, !context)
+ }
+
+ var maybeName = this.value, expr = this.parseExpression();
+ if (starttype === types$1.name && expr.type === "Identifier" && this.eat(types$1.colon))
+ { return this.parseLabeledStatement(node, maybeName, expr, context) }
+ else { return this.parseExpressionStatement(node, expr) }
+ }
+ };
+
+ pp$8.parseBreakContinueStatement = function(node, keyword) {
+ var isBreak = keyword === "break";
+ this.next();
+ if (this.eat(types$1.semi) || this.insertSemicolon()) { node.label = null; }
+ else if (this.type !== types$1.name) { this.unexpected(); }
+ else {
+ node.label = this.parseIdent();
+ this.semicolon();
+ }
+
+ // Verify that there is an actual destination to break or
+ // continue to.
+ var i = 0;
+ for (; i < this.labels.length; ++i) {
+ var lab = this.labels[i];
+ if (node.label == null || lab.name === node.label.name) {
+ if (lab.kind != null && (isBreak || lab.kind === "loop")) { break }
+ if (node.label && isBreak) { break }
+ }
+ }
+ if (i === this.labels.length) { this.raise(node.start, "Unsyntactic " + keyword); }
+ return this.finishNode(node, isBreak ? "BreakStatement" : "ContinueStatement")
+ };
+
+ pp$8.parseDebuggerStatement = function(node) {
+ this.next();
+ this.semicolon();
+ return this.finishNode(node, "DebuggerStatement")
+ };
+
+ pp$8.parseDoStatement = function(node) {
+ this.next();
+ this.labels.push(loopLabel);
+ node.body = this.parseStatement("do");
+ this.labels.pop();
+ this.expect(types$1._while);
+ node.test = this.parseParenExpression();
+ if (this.options.ecmaVersion >= 6)
+ { this.eat(types$1.semi); }
+ else
+ { this.semicolon(); }
+ return this.finishNode(node, "DoWhileStatement")
+ };
+
+ // Disambiguating between a `for` and a `for`/`in` or `for`/`of`
+ // loop is non-trivial. Basically, we have to parse the init `var`
+ // statement or expression, disallowing the `in` operator (see
+ // the second parameter to `parseExpression`), and then check
+ // whether the next token is `in` or `of`. When there is no init
+ // part (semicolon immediately after the opening parenthesis), it
+ // is a regular `for` loop.
+
+ pp$8.parseForStatement = function(node) {
+ this.next();
+ var awaitAt = (this.options.ecmaVersion >= 9 && this.canAwait && this.eatContextual("await")) ? this.lastTokStart : -1;
+ this.labels.push(loopLabel);
+ this.enterScope(0);
+ this.expect(types$1.parenL);
+ if (this.type === types$1.semi) {
+ if (awaitAt > -1) { this.unexpected(awaitAt); }
+ return this.parseFor(node, null)
+ }
+ var isLet = this.isLet();
+ if (this.type === types$1._var || this.type === types$1._const || isLet) {
+ var init$1 = this.startNode(), kind = isLet ? "let" : this.value;
+ this.next();
+ this.parseVar(init$1, true, kind);
+ this.finishNode(init$1, "VariableDeclaration");
+ if ((this.type === types$1._in || (this.options.ecmaVersion >= 6 && this.isContextual("of"))) && init$1.declarations.length === 1) {
+ if (this.options.ecmaVersion >= 9) {
+ if (this.type === types$1._in) {
+ if (awaitAt > -1) { this.unexpected(awaitAt); }
+ } else { node.await = awaitAt > -1; }
+ }
+ return this.parseForIn(node, init$1)
+ }
+ if (awaitAt > -1) { this.unexpected(awaitAt); }
+ return this.parseFor(node, init$1)
+ }
+ var startsWithLet = this.isContextual("let"), isForOf = false;
+ var refDestructuringErrors = new DestructuringErrors;
+ var init = this.parseExpression(awaitAt > -1 ? "await" : true, refDestructuringErrors);
+ if (this.type === types$1._in || (isForOf = this.options.ecmaVersion >= 6 && this.isContextual("of"))) {
+ if (this.options.ecmaVersion >= 9) {
+ if (this.type === types$1._in) {
+ if (awaitAt > -1) { this.unexpected(awaitAt); }
+ } else { node.await = awaitAt > -1; }
+ }
+ if (startsWithLet && isForOf) { this.raise(init.start, "The left-hand side of a for-of loop may not start with 'let'."); }
+ this.toAssignable(init, false, refDestructuringErrors);
+ this.checkLValPattern(init);
+ return this.parseForIn(node, init)
+ } else {
+ this.checkExpressionErrors(refDestructuringErrors, true);
+ }
+ if (awaitAt > -1) { this.unexpected(awaitAt); }
+ return this.parseFor(node, init)
+ };
+
+ pp$8.parseFunctionStatement = function(node, isAsync, declarationPosition) {
+ this.next();
+ return this.parseFunction(node, FUNC_STATEMENT | (declarationPosition ? 0 : FUNC_HANGING_STATEMENT), false, isAsync)
+ };
+
+ pp$8.parseIfStatement = function(node) {
+ this.next();
+ node.test = this.parseParenExpression();
+ // allow function declarations in branches, but only in non-strict mode
+ node.consequent = this.parseStatement("if");
+ node.alternate = this.eat(types$1._else) ? this.parseStatement("if") : null;
+ return this.finishNode(node, "IfStatement")
+ };
+
+ pp$8.parseReturnStatement = function(node) {
+ if (!this.inFunction && !this.options.allowReturnOutsideFunction)
+ { this.raise(this.start, "'return' outside of function"); }
+ this.next();
+
+ // In `return` (and `break`/`continue`), the keywords with
+ // optional arguments, we eagerly look for a semicolon or the
+ // possibility to insert one.
+
+ if (this.eat(types$1.semi) || this.insertSemicolon()) { node.argument = null; }
+ else { node.argument = this.parseExpression(); this.semicolon(); }
+ return this.finishNode(node, "ReturnStatement")
+ };
+
+ pp$8.parseSwitchStatement = function(node) {
+ this.next();
+ node.discriminant = this.parseParenExpression();
+ node.cases = [];
+ this.expect(types$1.braceL);
+ this.labels.push(switchLabel);
+ this.enterScope(0);
+
+ // Statements under must be grouped (by label) in SwitchCase
+ // nodes. `cur` is used to keep the node that we are currently
+ // adding statements to.
+
+ var cur;
+ for (var sawDefault = false; this.type !== types$1.braceR;) {
+ if (this.type === types$1._case || this.type === types$1._default) {
+ var isCase = this.type === types$1._case;
+ if (cur) { this.finishNode(cur, "SwitchCase"); }
+ node.cases.push(cur = this.startNode());
+ cur.consequent = [];
+ this.next();
+ if (isCase) {
+ cur.test = this.parseExpression();
+ } else {
+ if (sawDefault) { this.raiseRecoverable(this.lastTokStart, "Multiple default clauses"); }
+ sawDefault = true;
+ cur.test = null;
+ }
+ this.expect(types$1.colon);
+ } else {
+ if (!cur) { this.unexpected(); }
+ cur.consequent.push(this.parseStatement(null));
+ }
+ }
+ this.exitScope();
+ if (cur) { this.finishNode(cur, "SwitchCase"); }
+ this.next(); // Closing brace
+ this.labels.pop();
+ return this.finishNode(node, "SwitchStatement")
+ };
+
+ pp$8.parseThrowStatement = function(node) {
+ this.next();
+ if (lineBreak.test(this.input.slice(this.lastTokEnd, this.start)))
+ { this.raise(this.lastTokEnd, "Illegal newline after throw"); }
+ node.argument = this.parseExpression();
+ this.semicolon();
+ return this.finishNode(node, "ThrowStatement")
+ };
+
+ // Reused empty array added for node fields that are always empty.
+
+ var empty$1 = [];
+
+ pp$8.parseTryStatement = function(node) {
+ this.next();
+ node.block = this.parseBlock();
+ node.handler = null;
+ if (this.type === types$1._catch) {
+ var clause = this.startNode();
+ this.next();
+ if (this.eat(types$1.parenL)) {
+ clause.param = this.parseBindingAtom();
+ var simple = clause.param.type === "Identifier";
+ this.enterScope(simple ? SCOPE_SIMPLE_CATCH : 0);
+ this.checkLValPattern(clause.param, simple ? BIND_SIMPLE_CATCH : BIND_LEXICAL);
+ this.expect(types$1.parenR);
+ } else {
+ if (this.options.ecmaVersion < 10) { this.unexpected(); }
+ clause.param = null;
+ this.enterScope(0);
+ }
+ clause.body = this.parseBlock(false);
+ this.exitScope();
+ node.handler = this.finishNode(clause, "CatchClause");
+ }
+ node.finalizer = this.eat(types$1._finally) ? this.parseBlock() : null;
+ if (!node.handler && !node.finalizer)
+ { this.raise(node.start, "Missing catch or finally clause"); }
+ return this.finishNode(node, "TryStatement")
+ };
+
+ pp$8.parseVarStatement = function(node, kind) {
+ this.next();
+ this.parseVar(node, false, kind);
+ this.semicolon();
+ return this.finishNode(node, "VariableDeclaration")
+ };
+
+ pp$8.parseWhileStatement = function(node) {
+ this.next();
+ node.test = this.parseParenExpression();
+ this.labels.push(loopLabel);
+ node.body = this.parseStatement("while");
+ this.labels.pop();
+ return this.finishNode(node, "WhileStatement")
+ };
+
+ pp$8.parseWithStatement = function(node) {
+ if (this.strict) { this.raise(this.start, "'with' in strict mode"); }
+ this.next();
+ node.object = this.parseParenExpression();
+ node.body = this.parseStatement("with");
+ return this.finishNode(node, "WithStatement")
+ };
+
+ pp$8.parseEmptyStatement = function(node) {
+ this.next();
+ return this.finishNode(node, "EmptyStatement")
+ };
+
+ pp$8.parseLabeledStatement = function(node, maybeName, expr, context) {
+ for (var i$1 = 0, list = this.labels; i$1 < list.length; i$1 += 1)
+ {
+ var label = list[i$1];
+
+ if (label.name === maybeName)
+ { this.raise(expr.start, "Label '" + maybeName + "' is already declared");
+ } }
+ var kind = this.type.isLoop ? "loop" : this.type === types$1._switch ? "switch" : null;
+ for (var i = this.labels.length - 1; i >= 0; i--) {
+ var label$1 = this.labels[i];
+ if (label$1.statementStart === node.start) {
+ // Update information about previous labels on this node
+ label$1.statementStart = this.start;
+ label$1.kind = kind;
+ } else { break }
+ }
+ this.labels.push({name: maybeName, kind: kind, statementStart: this.start});
+ node.body = this.parseStatement(context ? context.indexOf("label") === -1 ? context + "label" : context : "label");
+ this.labels.pop();
+ node.label = expr;
+ return this.finishNode(node, "LabeledStatement")
+ };
+
+ pp$8.parseExpressionStatement = function(node, expr) {
+ node.expression = expr;
+ this.semicolon();
+ return this.finishNode(node, "ExpressionStatement")
+ };
+
+ // Parse a semicolon-enclosed block of statements, handling `"use
+ // strict"` declarations when `allowStrict` is true (used for
+ // function bodies).
+
+ pp$8.parseBlock = function(createNewLexicalScope, node, exitStrict) {
+ if ( createNewLexicalScope === void 0 ) createNewLexicalScope = true;
+ if ( node === void 0 ) node = this.startNode();
+
+ node.body = [];
+ this.expect(types$1.braceL);
+ if (createNewLexicalScope) { this.enterScope(0); }
+ while (this.type !== types$1.braceR) {
+ var stmt = this.parseStatement(null);
+ node.body.push(stmt);
+ }
+ if (exitStrict) { this.strict = false; }
+ this.next();
+ if (createNewLexicalScope) { this.exitScope(); }
+ return this.finishNode(node, "BlockStatement")
+ };
+
+ // Parse a regular `for` loop. The disambiguation code in
+ // `parseStatement` will already have parsed the init statement or
+ // expression.
+
+ pp$8.parseFor = function(node, init) {
+ node.init = init;
+ this.expect(types$1.semi);
+ node.test = this.type === types$1.semi ? null : this.parseExpression();
+ this.expect(types$1.semi);
+ node.update = this.type === types$1.parenR ? null : this.parseExpression();
+ this.expect(types$1.parenR);
+ node.body = this.parseStatement("for");
+ this.exitScope();
+ this.labels.pop();
+ return this.finishNode(node, "ForStatement")
+ };
+
+ // Parse a `for`/`in` and `for`/`of` loop, which are almost
+ // same from parser's perspective.
+
+ pp$8.parseForIn = function(node, init) {
+ var isForIn = this.type === types$1._in;
+ this.next();
+
+ if (
+ init.type === "VariableDeclaration" &&
+ init.declarations[0].init != null &&
+ (
+ !isForIn ||
+ this.options.ecmaVersion < 8 ||
+ this.strict ||
+ init.kind !== "var" ||
+ init.declarations[0].id.type !== "Identifier"
+ )
+ ) {
+ this.raise(
+ init.start,
+ ((isForIn ? "for-in" : "for-of") + " loop variable declaration may not have an initializer")
+ );
+ }
+ node.left = init;
+ node.right = isForIn ? this.parseExpression() : this.parseMaybeAssign();
+ this.expect(types$1.parenR);
+ node.body = this.parseStatement("for");
+ this.exitScope();
+ this.labels.pop();
+ return this.finishNode(node, isForIn ? "ForInStatement" : "ForOfStatement")
+ };
+
+ // Parse a list of variable declarations.
+
+ pp$8.parseVar = function(node, isFor, kind) {
+ node.declarations = [];
+ node.kind = kind;
+ for (;;) {
+ var decl = this.startNode();
+ this.parseVarId(decl, kind);
+ if (this.eat(types$1.eq)) {
+ decl.init = this.parseMaybeAssign(isFor);
+ } else if (kind === "const" && !(this.type === types$1._in || (this.options.ecmaVersion >= 6 && this.isContextual("of")))) {
+ this.unexpected();
+ } else if (decl.id.type !== "Identifier" && !(isFor && (this.type === types$1._in || this.isContextual("of")))) {
+ this.raise(this.lastTokEnd, "Complex binding patterns require an initialization value");
+ } else {
+ decl.init = null;
+ }
+ node.declarations.push(this.finishNode(decl, "VariableDeclarator"));
+ if (!this.eat(types$1.comma)) { break }
+ }
+ return node
+ };
+
+ pp$8.parseVarId = function(decl, kind) {
+ decl.id = this.parseBindingAtom();
+ this.checkLValPattern(decl.id, kind === "var" ? BIND_VAR : BIND_LEXICAL, false);
+ };
+
+ var FUNC_STATEMENT = 1, FUNC_HANGING_STATEMENT = 2, FUNC_NULLABLE_ID = 4;
+
+ // Parse a function declaration or literal (depending on the
+ // `statement & FUNC_STATEMENT`).
+
+ // Remove `allowExpressionBody` for 7.0.0, as it is only called with false
+ pp$8.parseFunction = function(node, statement, allowExpressionBody, isAsync, forInit) {
+ this.initFunction(node);
+ if (this.options.ecmaVersion >= 9 || this.options.ecmaVersion >= 6 && !isAsync) {
+ if (this.type === types$1.star && (statement & FUNC_HANGING_STATEMENT))
+ { this.unexpected(); }
+ node.generator = this.eat(types$1.star);
+ }
+ if (this.options.ecmaVersion >= 8)
+ { node.async = !!isAsync; }
+
+ if (statement & FUNC_STATEMENT) {
+ node.id = (statement & FUNC_NULLABLE_ID) && this.type !== types$1.name ? null : this.parseIdent();
+ if (node.id && !(statement & FUNC_HANGING_STATEMENT))
+ // If it is a regular function declaration in sloppy mode, then it is
+ // subject to Annex B semantics (BIND_FUNCTION). Otherwise, the binding
+ // mode depends on properties of the current scope (see
+ // treatFunctionsAsVar).
+ { this.checkLValSimple(node.id, (this.strict || node.generator || node.async) ? this.treatFunctionsAsVar ? BIND_VAR : BIND_LEXICAL : BIND_FUNCTION); }
+ }
+
+ var oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos;
+ this.yieldPos = 0;
+ this.awaitPos = 0;
+ this.awaitIdentPos = 0;
+ this.enterScope(functionFlags(node.async, node.generator));
+
+ if (!(statement & FUNC_STATEMENT))
+ { node.id = this.type === types$1.name ? this.parseIdent() : null; }
+
+ this.parseFunctionParams(node);
+ this.parseFunctionBody(node, allowExpressionBody, false, forInit);
+
+ this.yieldPos = oldYieldPos;
+ this.awaitPos = oldAwaitPos;
+ this.awaitIdentPos = oldAwaitIdentPos;
+ return this.finishNode(node, (statement & FUNC_STATEMENT) ? "FunctionDeclaration" : "FunctionExpression")
+ };
+
+ pp$8.parseFunctionParams = function(node) {
+ this.expect(types$1.parenL);
+ node.params = this.parseBindingList(types$1.parenR, false, this.options.ecmaVersion >= 8);
+ this.checkYieldAwaitInDefaultParams();
+ };
+
+ // Parse a class declaration or literal (depending on the
+ // `isStatement` parameter).
+
+ pp$8.parseClass = function(node, isStatement) {
+ this.next();
+
+ // ecma-262 14.6 Class Definitions
+ // A class definition is always strict mode code.
+ var oldStrict = this.strict;
+ this.strict = true;
+
+ this.parseClassId(node, isStatement);
+ this.parseClassSuper(node);
+ var privateNameMap = this.enterClassBody();
+ var classBody = this.startNode();
+ var hadConstructor = false;
+ classBody.body = [];
+ this.expect(types$1.braceL);
+ while (this.type !== types$1.braceR) {
+ var element = this.parseClassElement(node.superClass !== null);
+ if (element) {
+ classBody.body.push(element);
+ if (element.type === "MethodDefinition" && element.kind === "constructor") {
+ if (hadConstructor) { this.raise(element.start, "Duplicate constructor in the same class"); }
+ hadConstructor = true;
+ } else if (element.key && element.key.type === "PrivateIdentifier" && isPrivateNameConflicted(privateNameMap, element)) {
+ this.raiseRecoverable(element.key.start, ("Identifier '#" + (element.key.name) + "' has already been declared"));
+ }
+ }
+ }
+ this.strict = oldStrict;
+ this.next();
+ node.body = this.finishNode(classBody, "ClassBody");
+ this.exitClassBody();
+ return this.finishNode(node, isStatement ? "ClassDeclaration" : "ClassExpression")
+ };
+
+ pp$8.parseClassElement = function(constructorAllowsSuper) {
+ if (this.eat(types$1.semi)) { return null }
+
+ var ecmaVersion = this.options.ecmaVersion;
+ var node = this.startNode();
+ var keyName = "";
+ var isGenerator = false;
+ var isAsync = false;
+ var kind = "method";
+ var isStatic = false;
+
+ if (this.eatContextual("static")) {
+ // Parse static init block
+ if (ecmaVersion >= 13 && this.eat(types$1.braceL)) {
+ this.parseClassStaticBlock(node);
+ return node
+ }
+ if (this.isClassElementNameStart() || this.type === types$1.star) {
+ isStatic = true;
+ } else {
+ keyName = "static";
+ }
+ }
+ node.static = isStatic;
+ if (!keyName && ecmaVersion >= 8 && this.eatContextual("async")) {
+ if ((this.isClassElementNameStart() || this.type === types$1.star) && !this.canInsertSemicolon()) {
+ isAsync = true;
+ } else {
+ keyName = "async";
+ }
+ }
+ if (!keyName && (ecmaVersion >= 9 || !isAsync) && this.eat(types$1.star)) {
+ isGenerator = true;
+ }
+ if (!keyName && !isAsync && !isGenerator) {
+ var lastValue = this.value;
+ if (this.eatContextual("get") || this.eatContextual("set")) {
+ if (this.isClassElementNameStart()) {
+ kind = lastValue;
+ } else {
+ keyName = lastValue;
+ }
+ }
+ }
+
+ // Parse element name
+ if (keyName) {
+ // 'async', 'get', 'set', or 'static' were not a keyword contextually.
+ // The last token is any of those. Make it the element name.
+ node.computed = false;
+ node.key = this.startNodeAt(this.lastTokStart, this.lastTokStartLoc);
+ node.key.name = keyName;
+ this.finishNode(node.key, "Identifier");
+ } else {
+ this.parseClassElementName(node);
+ }
+
+ // Parse element value
+ if (ecmaVersion < 13 || this.type === types$1.parenL || kind !== "method" || isGenerator || isAsync) {
+ var isConstructor = !node.static && checkKeyName(node, "constructor");
+ var allowsDirectSuper = isConstructor && constructorAllowsSuper;
+ // Couldn't move this check into the 'parseClassMethod' method for backward compatibility.
+ if (isConstructor && kind !== "method") { this.raise(node.key.start, "Constructor can't have get/set modifier"); }
+ node.kind = isConstructor ? "constructor" : kind;
+ this.parseClassMethod(node, isGenerator, isAsync, allowsDirectSuper);
+ } else {
+ this.parseClassField(node);
+ }
+
+ return node
+ };
+
+ pp$8.isClassElementNameStart = function() {
+ return (
+ this.type === types$1.name ||
+ this.type === types$1.privateId ||
+ this.type === types$1.num ||
+ this.type === types$1.string ||
+ this.type === types$1.bracketL ||
+ this.type.keyword
+ )
+ };
+
+ pp$8.parseClassElementName = function(element) {
+ if (this.type === types$1.privateId) {
+ if (this.value === "constructor") {
+ this.raise(this.start, "Classes can't have an element named '#constructor'");
+ }
+ element.computed = false;
+ element.key = this.parsePrivateIdent();
+ } else {
+ this.parsePropertyName(element);
+ }
+ };
+
+ pp$8.parseClassMethod = function(method, isGenerator, isAsync, allowsDirectSuper) {
+ // Check key and flags
+ var key = method.key;
+ if (method.kind === "constructor") {
+ if (isGenerator) { this.raise(key.start, "Constructor can't be a generator"); }
+ if (isAsync) { this.raise(key.start, "Constructor can't be an async method"); }
+ } else if (method.static && checkKeyName(method, "prototype")) {
+ this.raise(key.start, "Classes may not have a static property named prototype");
+ }
+
+ // Parse value
+ var value = method.value = this.parseMethod(isGenerator, isAsync, allowsDirectSuper);
+
+ // Check value
+ if (method.kind === "get" && value.params.length !== 0)
+ { this.raiseRecoverable(value.start, "getter should have no params"); }
+ if (method.kind === "set" && value.params.length !== 1)
+ { this.raiseRecoverable(value.start, "setter should have exactly one param"); }
+ if (method.kind === "set" && value.params[0].type === "RestElement")
+ { this.raiseRecoverable(value.params[0].start, "Setter cannot use rest params"); }
+
+ return this.finishNode(method, "MethodDefinition")
+ };
+
+ pp$8.parseClassField = function(field) {
+ if (checkKeyName(field, "constructor")) {
+ this.raise(field.key.start, "Classes can't have a field named 'constructor'");
+ } else if (field.static && checkKeyName(field, "prototype")) {
+ this.raise(field.key.start, "Classes can't have a static field named 'prototype'");
+ }
+
+ if (this.eat(types$1.eq)) {
+ // To raise SyntaxError if 'arguments' exists in the initializer.
+ var scope = this.currentThisScope();
+ var inClassFieldInit = scope.inClassFieldInit;
+ scope.inClassFieldInit = true;
+ field.value = this.parseMaybeAssign();
+ scope.inClassFieldInit = inClassFieldInit;
+ } else {
+ field.value = null;
+ }
+ this.semicolon();
+
+ return this.finishNode(field, "PropertyDefinition")
+ };
+
+ pp$8.parseClassStaticBlock = function(node) {
+ node.body = [];
+
+ var oldLabels = this.labels;
+ this.labels = [];
+ this.enterScope(SCOPE_CLASS_STATIC_BLOCK | SCOPE_SUPER);
+ while (this.type !== types$1.braceR) {
+ var stmt = this.parseStatement(null);
+ node.body.push(stmt);
+ }
+ this.next();
+ this.exitScope();
+ this.labels = oldLabels;
+
+ return this.finishNode(node, "StaticBlock")
+ };
+
+ pp$8.parseClassId = function(node, isStatement) {
+ if (this.type === types$1.name) {
+ node.id = this.parseIdent();
+ if (isStatement)
+ { this.checkLValSimple(node.id, BIND_LEXICAL, false); }
+ } else {
+ if (isStatement === true)
+ { this.unexpected(); }
+ node.id = null;
+ }
+ };
+
+ pp$8.parseClassSuper = function(node) {
+ node.superClass = this.eat(types$1._extends) ? this.parseExprSubscripts(null, false) : null;
+ };
+
+ pp$8.enterClassBody = function() {
+ var element = {declared: Object.create(null), used: []};
+ this.privateNameStack.push(element);
+ return element.declared
+ };
+
+ pp$8.exitClassBody = function() {
+ var ref = this.privateNameStack.pop();
+ var declared = ref.declared;
+ var used = ref.used;
+ var len = this.privateNameStack.length;
+ var parent = len === 0 ? null : this.privateNameStack[len - 1];
+ for (var i = 0; i < used.length; ++i) {
+ var id = used[i];
+ if (!hasOwn(declared, id.name)) {
+ if (parent) {
+ parent.used.push(id);
+ } else {
+ this.raiseRecoverable(id.start, ("Private field '#" + (id.name) + "' must be declared in an enclosing class"));
+ }
+ }
+ }
+ };
+
+ function isPrivateNameConflicted(privateNameMap, element) {
+ var name = element.key.name;
+ var curr = privateNameMap[name];
+
+ var next = "true";
+ if (element.type === "MethodDefinition" && (element.kind === "get" || element.kind === "set")) {
+ next = (element.static ? "s" : "i") + element.kind;
+ }
+
+ // `class { get #a(){}; static set #a(_){} }` is also conflict.
+ if (
+ curr === "iget" && next === "iset" ||
+ curr === "iset" && next === "iget" ||
+ curr === "sget" && next === "sset" ||
+ curr === "sset" && next === "sget"
+ ) {
+ privateNameMap[name] = "true";
+ return false
+ } else if (!curr) {
+ privateNameMap[name] = next;
+ return false
+ } else {
+ return true
+ }
+ }
+
+ function checkKeyName(node, name) {
+ var computed = node.computed;
+ var key = node.key;
+ return !computed && (
+ key.type === "Identifier" && key.name === name ||
+ key.type === "Literal" && key.value === name
+ )
+ }
+
+ // Parses module export declaration.
+
+ pp$8.parseExport = function(node, exports) {
+ this.next();
+ // export * from '...'
+ if (this.eat(types$1.star)) {
+ if (this.options.ecmaVersion >= 11) {
+ if (this.eatContextual("as")) {
+ node.exported = this.parseModuleExportName();
+ this.checkExport(exports, node.exported, this.lastTokStart);
+ } else {
+ node.exported = null;
+ }
+ }
+ this.expectContextual("from");
+ if (this.type !== types$1.string) { this.unexpected(); }
+ node.source = this.parseExprAtom();
+ this.semicolon();
+ return this.finishNode(node, "ExportAllDeclaration")
+ }
+ if (this.eat(types$1._default)) { // export default ...
+ this.checkExport(exports, "default", this.lastTokStart);
+ var isAsync;
+ if (this.type === types$1._function || (isAsync = this.isAsyncFunction())) {
+ var fNode = this.startNode();
+ this.next();
+ if (isAsync) { this.next(); }
+ node.declaration = this.parseFunction(fNode, FUNC_STATEMENT | FUNC_NULLABLE_ID, false, isAsync);
+ } else if (this.type === types$1._class) {
+ var cNode = this.startNode();
+ node.declaration = this.parseClass(cNode, "nullableID");
+ } else {
+ node.declaration = this.parseMaybeAssign();
+ this.semicolon();
+ }
+ return this.finishNode(node, "ExportDefaultDeclaration")
+ }
+ // export var|const|let|function|class ...
+ if (this.shouldParseExportStatement()) {
+ node.declaration = this.parseStatement(null);
+ if (node.declaration.type === "VariableDeclaration")
+ { this.checkVariableExport(exports, node.declaration.declarations); }
+ else
+ { this.checkExport(exports, node.declaration.id, node.declaration.id.start); }
+ node.specifiers = [];
+ node.source = null;
+ } else { // export { x, y as z } [from '...']
+ node.declaration = null;
+ node.specifiers = this.parseExportSpecifiers(exports);
+ if (this.eatContextual("from")) {
+ if (this.type !== types$1.string) { this.unexpected(); }
+ node.source = this.parseExprAtom();
+ } else {
+ for (var i = 0, list = node.specifiers; i < list.length; i += 1) {
+ // check for keywords used as local names
+ var spec = list[i];
+
+ this.checkUnreserved(spec.local);
+ // check if export is defined
+ this.checkLocalExport(spec.local);
+
+ if (spec.local.type === "Literal") {
+ this.raise(spec.local.start, "A string literal cannot be used as an exported binding without `from`.");
+ }
+ }
+
+ node.source = null;
+ }
+ this.semicolon();
+ }
+ return this.finishNode(node, "ExportNamedDeclaration")
+ };
+
+ pp$8.checkExport = function(exports, name, pos) {
+ if (!exports) { return }
+ if (typeof name !== "string")
+ { name = name.type === "Identifier" ? name.name : name.value; }
+ if (hasOwn(exports, name))
+ { this.raiseRecoverable(pos, "Duplicate export '" + name + "'"); }
+ exports[name] = true;
+ };
+
+ pp$8.checkPatternExport = function(exports, pat) {
+ var type = pat.type;
+ if (type === "Identifier")
+ { this.checkExport(exports, pat, pat.start); }
+ else if (type === "ObjectPattern")
+ { for (var i = 0, list = pat.properties; i < list.length; i += 1)
+ {
+ var prop = list[i];
+
+ this.checkPatternExport(exports, prop);
+ } }
+ else if (type === "ArrayPattern")
+ { for (var i$1 = 0, list$1 = pat.elements; i$1 < list$1.length; i$1 += 1) {
+ var elt = list$1[i$1];
+
+ if (elt) { this.checkPatternExport(exports, elt); }
+ } }
+ else if (type === "Property")
+ { this.checkPatternExport(exports, pat.value); }
+ else if (type === "AssignmentPattern")
+ { this.checkPatternExport(exports, pat.left); }
+ else if (type === "RestElement")
+ { this.checkPatternExport(exports, pat.argument); }
+ else if (type === "ParenthesizedExpression")
+ { this.checkPatternExport(exports, pat.expression); }
+ };
+
+ pp$8.checkVariableExport = function(exports, decls) {
+ if (!exports) { return }
+ for (var i = 0, list = decls; i < list.length; i += 1)
+ {
+ var decl = list[i];
+
+ this.checkPatternExport(exports, decl.id);
+ }
+ };
+
+ pp$8.shouldParseExportStatement = function() {
+ return this.type.keyword === "var" ||
+ this.type.keyword === "const" ||
+ this.type.keyword === "class" ||
+ this.type.keyword === "function" ||
+ this.isLet() ||
+ this.isAsyncFunction()
+ };
+
+ // Parses a comma-separated list of module exports.
+
+ pp$8.parseExportSpecifiers = function(exports) {
+ var nodes = [], first = true;
+ // export { x, y as z } [from '...']
+ this.expect(types$1.braceL);
+ while (!this.eat(types$1.braceR)) {
+ if (!first) {
+ this.expect(types$1.comma);
+ if (this.afterTrailingComma(types$1.braceR)) { break }
+ } else { first = false; }
+
+ var node = this.startNode();
+ node.local = this.parseModuleExportName();
+ node.exported = this.eatContextual("as") ? this.parseModuleExportName() : node.local;
+ this.checkExport(
+ exports,
+ node.exported,
+ node.exported.start
+ );
+ nodes.push(this.finishNode(node, "ExportSpecifier"));
+ }
+ return nodes
+ };
+
+ // Parses import declaration.
+
+ pp$8.parseImport = function(node) {
+ this.next();
+ // import '...'
+ if (this.type === types$1.string) {
+ node.specifiers = empty$1;
+ node.source = this.parseExprAtom();
+ } else {
+ node.specifiers = this.parseImportSpecifiers();
+ this.expectContextual("from");
+ node.source = this.type === types$1.string ? this.parseExprAtom() : this.unexpected();
+ }
+ this.semicolon();
+ return this.finishNode(node, "ImportDeclaration")
+ };
+
+ // Parses a comma-separated list of module imports.
+
+ pp$8.parseImportSpecifiers = function() {
+ var nodes = [], first = true;
+ if (this.type === types$1.name) {
+ // import defaultObj, { x, y as z } from '...'
+ var node = this.startNode();
+ node.local = this.parseIdent();
+ this.checkLValSimple(node.local, BIND_LEXICAL);
+ nodes.push(this.finishNode(node, "ImportDefaultSpecifier"));
+ if (!this.eat(types$1.comma)) { return nodes }
+ }
+ if (this.type === types$1.star) {
+ var node$1 = this.startNode();
+ this.next();
+ this.expectContextual("as");
+ node$1.local = this.parseIdent();
+ this.checkLValSimple(node$1.local, BIND_LEXICAL);
+ nodes.push(this.finishNode(node$1, "ImportNamespaceSpecifier"));
+ return nodes
+ }
+ this.expect(types$1.braceL);
+ while (!this.eat(types$1.braceR)) {
+ if (!first) {
+ this.expect(types$1.comma);
+ if (this.afterTrailingComma(types$1.braceR)) { break }
+ } else { first = false; }
+
+ var node$2 = this.startNode();
+ node$2.imported = this.parseModuleExportName();
+ if (this.eatContextual("as")) {
+ node$2.local = this.parseIdent();
+ } else {
+ this.checkUnreserved(node$2.imported);
+ node$2.local = node$2.imported;
+ }
+ this.checkLValSimple(node$2.local, BIND_LEXICAL);
+ nodes.push(this.finishNode(node$2, "ImportSpecifier"));
+ }
+ return nodes
+ };
+
+ pp$8.parseModuleExportName = function() {
+ if (this.options.ecmaVersion >= 13 && this.type === types$1.string) {
+ var stringLiteral = this.parseLiteral(this.value);
+ if (loneSurrogate.test(stringLiteral.value)) {
+ this.raise(stringLiteral.start, "An export name cannot include a lone surrogate.");
+ }
+ return stringLiteral
+ }
+ return this.parseIdent(true)
+ };
+
+ // Set `ExpressionStatement#directive` property for directive prologues.
+ pp$8.adaptDirectivePrologue = function(statements) {
+ for (var i = 0; i < statements.length && this.isDirectiveCandidate(statements[i]); ++i) {
+ statements[i].directive = statements[i].expression.raw.slice(1, -1);
+ }
+ };
+ pp$8.isDirectiveCandidate = function(statement) {
+ return (
+ this.options.ecmaVersion >= 5 &&
+ statement.type === "ExpressionStatement" &&
+ statement.expression.type === "Literal" &&
+ typeof statement.expression.value === "string" &&
+ // Reject parenthesized strings.
+ (this.input[statement.start] === "\"" || this.input[statement.start] === "'")
+ )
+ };
+
+ var pp$7 = Parser.prototype;
+
+ // Convert existing expression atom to assignable pattern
+ // if possible.
+
+ pp$7.toAssignable = function(node, isBinding, refDestructuringErrors) {
+ if (this.options.ecmaVersion >= 6 && node) {
+ switch (node.type) {
+ case "Identifier":
+ if (this.inAsync && node.name === "await")
+ { this.raise(node.start, "Cannot use 'await' as identifier inside an async function"); }
+ break
+
+ case "ObjectPattern":
+ case "ArrayPattern":
+ case "AssignmentPattern":
+ case "RestElement":
+ break
+
+ case "ObjectExpression":
+ node.type = "ObjectPattern";
+ if (refDestructuringErrors) { this.checkPatternErrors(refDestructuringErrors, true); }
+ for (var i = 0, list = node.properties; i < list.length; i += 1) {
+ var prop = list[i];
+
+ this.toAssignable(prop, isBinding);
+ // Early error:
+ // AssignmentRestProperty[Yield, Await] :
+ // `...` DestructuringAssignmentTarget[Yield, Await]
+ //
+ // It is a Syntax Error if |DestructuringAssignmentTarget| is an |ArrayLiteral| or an |ObjectLiteral|.
+ if (
+ prop.type === "RestElement" &&
+ (prop.argument.type === "ArrayPattern" || prop.argument.type === "ObjectPattern")
+ ) {
+ this.raise(prop.argument.start, "Unexpected token");
+ }
+ }
+ break
+
+ case "Property":
+ // AssignmentProperty has type === "Property"
+ if (node.kind !== "init") { this.raise(node.key.start, "Object pattern can't contain getter or setter"); }
+ this.toAssignable(node.value, isBinding);
+ break
+
+ case "ArrayExpression":
+ node.type = "ArrayPattern";
+ if (refDestructuringErrors) { this.checkPatternErrors(refDestructuringErrors, true); }
+ this.toAssignableList(node.elements, isBinding);
+ break
+
+ case "SpreadElement":
+ node.type = "RestElement";
+ this.toAssignable(node.argument, isBinding);
+ if (node.argument.type === "AssignmentPattern")
+ { this.raise(node.argument.start, "Rest elements cannot have a default value"); }
+ break
+
+ case "AssignmentExpression":
+ if (node.operator !== "=") { this.raise(node.left.end, "Only '=' operator can be used for specifying default value."); }
+ node.type = "AssignmentPattern";
+ delete node.operator;
+ this.toAssignable(node.left, isBinding);
+ break
+
+ case "ParenthesizedExpression":
+ this.toAssignable(node.expression, isBinding, refDestructuringErrors);
+ break
+
+ case "ChainExpression":
+ this.raiseRecoverable(node.start, "Optional chaining cannot appear in left-hand side");
+ break
+
+ case "MemberExpression":
+ if (!isBinding) { break }
+
+ default:
+ this.raise(node.start, "Assigning to rvalue");
+ }
+ } else if (refDestructuringErrors) { this.checkPatternErrors(refDestructuringErrors, true); }
+ return node
+ };
+
+ // Convert list of expression atoms to binding list.
+
+ pp$7.toAssignableList = function(exprList, isBinding) {
+ var end = exprList.length;
+ for (var i = 0; i < end; i++) {
+ var elt = exprList[i];
+ if (elt) { this.toAssignable(elt, isBinding); }
+ }
+ if (end) {
+ var last = exprList[end - 1];
+ if (this.options.ecmaVersion === 6 && isBinding && last && last.type === "RestElement" && last.argument.type !== "Identifier")
+ { this.unexpected(last.argument.start); }
+ }
+ return exprList
+ };
+
+ // Parses spread element.
+
+ pp$7.parseSpread = function(refDestructuringErrors) {
+ var node = this.startNode();
+ this.next();
+ node.argument = this.parseMaybeAssign(false, refDestructuringErrors);
+ return this.finishNode(node, "SpreadElement")
+ };
+
+ pp$7.parseRestBinding = function() {
+ var node = this.startNode();
+ this.next();
+
+ // RestElement inside of a function parameter must be an identifier
+ if (this.options.ecmaVersion === 6 && this.type !== types$1.name)
+ { this.unexpected(); }
+
+ node.argument = this.parseBindingAtom();
+
+ return this.finishNode(node, "RestElement")
+ };
+
+ // Parses lvalue (assignable) atom.
+
+ pp$7.parseBindingAtom = function() {
+ if (this.options.ecmaVersion >= 6) {
+ switch (this.type) {
+ case types$1.bracketL:
+ var node = this.startNode();
+ this.next();
+ node.elements = this.parseBindingList(types$1.bracketR, true, true);
+ return this.finishNode(node, "ArrayPattern")
+
+ case types$1.braceL:
+ return this.parseObj(true)
+ }
+ }
+ return this.parseIdent()
+ };
+
+ pp$7.parseBindingList = function(close, allowEmpty, allowTrailingComma) {
+ var elts = [], first = true;
+ while (!this.eat(close)) {
+ if (first) { first = false; }
+ else { this.expect(types$1.comma); }
+ if (allowEmpty && this.type === types$1.comma) {
+ elts.push(null);
+ } else if (allowTrailingComma && this.afterTrailingComma(close)) {
+ break
+ } else if (this.type === types$1.ellipsis) {
+ var rest = this.parseRestBinding();
+ this.parseBindingListItem(rest);
+ elts.push(rest);
+ if (this.type === types$1.comma) { this.raise(this.start, "Comma is not permitted after the rest element"); }
+ this.expect(close);
+ break
+ } else {
+ var elem = this.parseMaybeDefault(this.start, this.startLoc);
+ this.parseBindingListItem(elem);
+ elts.push(elem);
+ }
+ }
+ return elts
+ };
+
+ pp$7.parseBindingListItem = function(param) {
+ return param
+ };
+
+ // Parses assignment pattern around given atom if possible.
+
+ pp$7.parseMaybeDefault = function(startPos, startLoc, left) {
+ left = left || this.parseBindingAtom();
+ if (this.options.ecmaVersion < 6 || !this.eat(types$1.eq)) { return left }
+ var node = this.startNodeAt(startPos, startLoc);
+ node.left = left;
+ node.right = this.parseMaybeAssign();
+ return this.finishNode(node, "AssignmentPattern")
+ };
+
+ // The following three functions all verify that a node is an lvalue —
+ // something that can be bound, or assigned to. In order to do so, they perform
+ // a variety of checks:
+ //
+ // - Check that none of the bound/assigned-to identifiers are reserved words.
+ // - Record name declarations for bindings in the appropriate scope.
+ // - Check duplicate argument names, if checkClashes is set.
+ //
+ // If a complex binding pattern is encountered (e.g., object and array
+ // destructuring), the entire pattern is recursively checked.
+ //
+ // There are three versions of checkLVal*() appropriate for different
+ // circumstances:
+ //
+ // - checkLValSimple() shall be used if the syntactic construct supports
+ // nothing other than identifiers and member expressions. Parenthesized
+ // expressions are also correctly handled. This is generally appropriate for
+ // constructs for which the spec says
+ //
+ // > It is a Syntax Error if AssignmentTargetType of [the production] is not
+ // > simple.
+ //
+ // It is also appropriate for checking if an identifier is valid and not
+ // defined elsewhere, like import declarations or function/class identifiers.
+ //
+ // Examples where this is used include:
+ // a += …;
+ // import a from '…';
+ // where a is the node to be checked.
+ //
+ // - checkLValPattern() shall be used if the syntactic construct supports
+ // anything checkLValSimple() supports, as well as object and array
+ // destructuring patterns. This is generally appropriate for constructs for
+ // which the spec says
+ //
+ // > It is a Syntax Error if [the production] is neither an ObjectLiteral nor
+ // > an ArrayLiteral and AssignmentTargetType of [the production] is not
+ // > simple.
+ //
+ // Examples where this is used include:
+ // (a = …);
+ // const a = …;
+ // try { … } catch (a) { … }
+ // where a is the node to be checked.
+ //
+ // - checkLValInnerPattern() shall be used if the syntactic construct supports
+ // anything checkLValPattern() supports, as well as default assignment
+ // patterns, rest elements, and other constructs that may appear within an
+ // object or array destructuring pattern.
+ //
+ // As a special case, function parameters also use checkLValInnerPattern(),
+ // as they also support defaults and rest constructs.
+ //
+ // These functions deliberately support both assignment and binding constructs,
+ // as the logic for both is exceedingly similar. If the node is the target of
+ // an assignment, then bindingType should be set to BIND_NONE. Otherwise, it
+ // should be set to the appropriate BIND_* constant, like BIND_VAR or
+ // BIND_LEXICAL.
+ //
+ // If the function is called with a non-BIND_NONE bindingType, then
+ // additionally a checkClashes object may be specified to allow checking for
+ // duplicate argument names. checkClashes is ignored if the provided construct
+ // is an assignment (i.e., bindingType is BIND_NONE).
+
+ pp$7.checkLValSimple = function(expr, bindingType, checkClashes) {
+ if ( bindingType === void 0 ) bindingType = BIND_NONE;
+
+ var isBind = bindingType !== BIND_NONE;
+
+ switch (expr.type) {
+ case "Identifier":
+ if (this.strict && this.reservedWordsStrictBind.test(expr.name))
+ { this.raiseRecoverable(expr.start, (isBind ? "Binding " : "Assigning to ") + expr.name + " in strict mode"); }
+ if (isBind) {
+ if (bindingType === BIND_LEXICAL && expr.name === "let")
+ { this.raiseRecoverable(expr.start, "let is disallowed as a lexically bound name"); }
+ if (checkClashes) {
+ if (hasOwn(checkClashes, expr.name))
+ { this.raiseRecoverable(expr.start, "Argument name clash"); }
+ checkClashes[expr.name] = true;
+ }
+ if (bindingType !== BIND_OUTSIDE) { this.declareName(expr.name, bindingType, expr.start); }
+ }
+ break
+
+ case "ChainExpression":
+ this.raiseRecoverable(expr.start, "Optional chaining cannot appear in left-hand side");
+ break
+
+ case "MemberExpression":
+ if (isBind) { this.raiseRecoverable(expr.start, "Binding member expression"); }
+ break
+
+ case "ParenthesizedExpression":
+ if (isBind) { this.raiseRecoverable(expr.start, "Binding parenthesized expression"); }
+ return this.checkLValSimple(expr.expression, bindingType, checkClashes)
+
+ default:
+ this.raise(expr.start, (isBind ? "Binding" : "Assigning to") + " rvalue");
+ }
+ };
+
+ pp$7.checkLValPattern = function(expr, bindingType, checkClashes) {
+ if ( bindingType === void 0 ) bindingType = BIND_NONE;
+
+ switch (expr.type) {
+ case "ObjectPattern":
+ for (var i = 0, list = expr.properties; i < list.length; i += 1) {
+ var prop = list[i];
+
+ this.checkLValInnerPattern(prop, bindingType, checkClashes);
+ }
+ break
+
+ case "ArrayPattern":
+ for (var i$1 = 0, list$1 = expr.elements; i$1 < list$1.length; i$1 += 1) {
+ var elem = list$1[i$1];
+
+ if (elem) { this.checkLValInnerPattern(elem, bindingType, checkClashes); }
+ }
+ break
+
+ default:
+ this.checkLValSimple(expr, bindingType, checkClashes);
+ }
+ };
+
+ pp$7.checkLValInnerPattern = function(expr, bindingType, checkClashes) {
+ if ( bindingType === void 0 ) bindingType = BIND_NONE;
+
+ switch (expr.type) {
+ case "Property":
+ // AssignmentProperty has type === "Property"
+ this.checkLValInnerPattern(expr.value, bindingType, checkClashes);
+ break
+
+ case "AssignmentPattern":
+ this.checkLValPattern(expr.left, bindingType, checkClashes);
+ break
+
+ case "RestElement":
+ this.checkLValPattern(expr.argument, bindingType, checkClashes);
+ break
+
+ default:
+ this.checkLValPattern(expr, bindingType, checkClashes);
+ }
+ };
+
+ // The algorithm used to determine whether a regexp can appear at a
+
+ var TokContext = function TokContext(token, isExpr, preserveSpace, override, generator) {
+ this.token = token;
+ this.isExpr = !!isExpr;
+ this.preserveSpace = !!preserveSpace;
+ this.override = override;
+ this.generator = !!generator;
+ };
+
+ var types = {
+ b_stat: new TokContext("{", false),
+ b_expr: new TokContext("{", true),
+ b_tmpl: new TokContext("${", false),
+ p_stat: new TokContext("(", false),
+ p_expr: new TokContext("(", true),
+ q_tmpl: new TokContext("`", true, true, function (p) { return p.tryReadTemplateToken(); }),
+ f_stat: new TokContext("function", false),
+ f_expr: new TokContext("function", true),
+ f_expr_gen: new TokContext("function", true, false, null, true),
+ f_gen: new TokContext("function", false, false, null, true)
+ };
+
+ var pp$6 = Parser.prototype;
+
+ pp$6.initialContext = function() {
+ return [types.b_stat]
+ };
+
+ pp$6.curContext = function() {
+ return this.context[this.context.length - 1]
+ };
+
+ pp$6.braceIsBlock = function(prevType) {
+ var parent = this.curContext();
+ if (parent === types.f_expr || parent === types.f_stat)
+ { return true }
+ if (prevType === types$1.colon && (parent === types.b_stat || parent === types.b_expr))
+ { return !parent.isExpr }
+
+ // The check for `tt.name && exprAllowed` detects whether we are
+ // after a `yield` or `of` construct. See the `updateContext` for
+ // `tt.name`.
+ if (prevType === types$1._return || prevType === types$1.name && this.exprAllowed)
+ { return lineBreak.test(this.input.slice(this.lastTokEnd, this.start)) }
+ if (prevType === types$1._else || prevType === types$1.semi || prevType === types$1.eof || prevType === types$1.parenR || prevType === types$1.arrow)
+ { return true }
+ if (prevType === types$1.braceL)
+ { return parent === types.b_stat }
+ if (prevType === types$1._var || prevType === types$1._const || prevType === types$1.name)
+ { return false }
+ return !this.exprAllowed
+ };
+
+ pp$6.inGeneratorContext = function() {
+ for (var i = this.context.length - 1; i >= 1; i--) {
+ var context = this.context[i];
+ if (context.token === "function")
+ { return context.generator }
+ }
+ return false
+ };
+
+ pp$6.updateContext = function(prevType) {
+ var update, type = this.type;
+ if (type.keyword && prevType === types$1.dot)
+ { this.exprAllowed = false; }
+ else if (update = type.updateContext)
+ { update.call(this, prevType); }
+ else
+ { this.exprAllowed = type.beforeExpr; }
+ };
+
+ // Used to handle egde cases when token context could not be inferred correctly during tokenization phase
+
+ pp$6.overrideContext = function(tokenCtx) {
+ if (this.curContext() !== tokenCtx) {
+ this.context[this.context.length - 1] = tokenCtx;
+ }
+ };
+
+ // Token-specific context update code
+
+ types$1.parenR.updateContext = types$1.braceR.updateContext = function() {
+ if (this.context.length === 1) {
+ this.exprAllowed = true;
+ return
+ }
+ var out = this.context.pop();
+ if (out === types.b_stat && this.curContext().token === "function") {
+ out = this.context.pop();
+ }
+ this.exprAllowed = !out.isExpr;
+ };
+
+ types$1.braceL.updateContext = function(prevType) {
+ this.context.push(this.braceIsBlock(prevType) ? types.b_stat : types.b_expr);
+ this.exprAllowed = true;
+ };
+
+ types$1.dollarBraceL.updateContext = function() {
+ this.context.push(types.b_tmpl);
+ this.exprAllowed = true;
+ };
+
+ types$1.parenL.updateContext = function(prevType) {
+ var statementParens = prevType === types$1._if || prevType === types$1._for || prevType === types$1._with || prevType === types$1._while;
+ this.context.push(statementParens ? types.p_stat : types.p_expr);
+ this.exprAllowed = true;
+ };
+
+ types$1.incDec.updateContext = function() {
+ // tokExprAllowed stays unchanged
+ };
+
+ types$1._function.updateContext = types$1._class.updateContext = function(prevType) {
+ if (prevType.beforeExpr && prevType !== types$1._else &&
+ !(prevType === types$1.semi && this.curContext() !== types.p_stat) &&
+ !(prevType === types$1._return && lineBreak.test(this.input.slice(this.lastTokEnd, this.start))) &&
+ !((prevType === types$1.colon || prevType === types$1.braceL) && this.curContext() === types.b_stat))
+ { this.context.push(types.f_expr); }
+ else
+ { this.context.push(types.f_stat); }
+ this.exprAllowed = false;
+ };
+
+ types$1.backQuote.updateContext = function() {
+ if (this.curContext() === types.q_tmpl)
+ { this.context.pop(); }
+ else
+ { this.context.push(types.q_tmpl); }
+ this.exprAllowed = false;
+ };
+
+ types$1.star.updateContext = function(prevType) {
+ if (prevType === types$1._function) {
+ var index = this.context.length - 1;
+ if (this.context[index] === types.f_expr)
+ { this.context[index] = types.f_expr_gen; }
+ else
+ { this.context[index] = types.f_gen; }
+ }
+ this.exprAllowed = true;
+ };
+
+ types$1.name.updateContext = function(prevType) {
+ var allowed = false;
+ if (this.options.ecmaVersion >= 6 && prevType !== types$1.dot) {
+ if (this.value === "of" && !this.exprAllowed ||
+ this.value === "yield" && this.inGeneratorContext())
+ { allowed = true; }
+ }
+ this.exprAllowed = allowed;
+ };
+
+ // A recursive descent parser operates by defining functions for all
+
+ var pp$5 = Parser.prototype;
+
+ // Check if property name clashes with already added.
+ // Object/class getters and setters are not allowed to clash —
+ // either with each other or with an init property — and in
+ // strict mode, init properties are also not allowed to be repeated.
+
+ pp$5.checkPropClash = function(prop, propHash, refDestructuringErrors) {
+ if (this.options.ecmaVersion >= 9 && prop.type === "SpreadElement")
+ { return }
+ if (this.options.ecmaVersion >= 6 && (prop.computed || prop.method || prop.shorthand))
+ { return }
+ var key = prop.key;
+ var name;
+ switch (key.type) {
+ case "Identifier": name = key.name; break
+ case "Literal": name = String(key.value); break
+ default: return
+ }
+ var kind = prop.kind;
+ if (this.options.ecmaVersion >= 6) {
+ if (name === "__proto__" && kind === "init") {
+ if (propHash.proto) {
+ if (refDestructuringErrors) {
+ if (refDestructuringErrors.doubleProto < 0) {
+ refDestructuringErrors.doubleProto = key.start;
+ }
+ } else {
+ this.raiseRecoverable(key.start, "Redefinition of __proto__ property");
+ }
+ }
+ propHash.proto = true;
+ }
+ return
+ }
+ name = "$" + name;
+ var other = propHash[name];
+ if (other) {
+ var redefinition;
+ if (kind === "init") {
+ redefinition = this.strict && other.init || other.get || other.set;
+ } else {
+ redefinition = other.init || other[kind];
+ }
+ if (redefinition)
+ { this.raiseRecoverable(key.start, "Redefinition of property"); }
+ } else {
+ other = propHash[name] = {
+ init: false,
+ get: false,
+ set: false
+ };
+ }
+ other[kind] = true;
+ };
+
+ // ### Expression parsing
+
+ // These nest, from the most general expression type at the top to
+ // 'atomic', nondivisible expression types at the bottom. Most of
+ // the functions will simply let the function(s) below them parse,
+ // and, *if* the syntactic construct they handle is present, wrap
+ // the AST node that the inner parser gave them in another node.
+
+ // Parse a full expression. The optional arguments are used to
+ // forbid the `in` operator (in for loops initalization expressions)
+ // and provide reference for storing '=' operator inside shorthand
+ // property assignment in contexts where both object expression
+ // and object pattern might appear (so it's possible to raise
+ // delayed syntax error at correct position).
+
+ pp$5.parseExpression = function(forInit, refDestructuringErrors) {
+ var startPos = this.start, startLoc = this.startLoc;
+ var expr = this.parseMaybeAssign(forInit, refDestructuringErrors);
+ if (this.type === types$1.comma) {
+ var node = this.startNodeAt(startPos, startLoc);
+ node.expressions = [expr];
+ while (this.eat(types$1.comma)) { node.expressions.push(this.parseMaybeAssign(forInit, refDestructuringErrors)); }
+ return this.finishNode(node, "SequenceExpression")
+ }
+ return expr
+ };
+
+ // Parse an assignment expression. This includes applications of
+ // operators like `+=`.
+
+ pp$5.parseMaybeAssign = function(forInit, refDestructuringErrors, afterLeftParse) {
+ if (this.isContextual("yield")) {
+ if (this.inGenerator) { return this.parseYield(forInit) }
+ // The tokenizer will assume an expression is allowed after
+ // `yield`, but this isn't that kind of yield
+ else { this.exprAllowed = false; }
+ }
+
+ var ownDestructuringErrors = false, oldParenAssign = -1, oldTrailingComma = -1, oldDoubleProto = -1;
+ if (refDestructuringErrors) {
+ oldParenAssign = refDestructuringErrors.parenthesizedAssign;
+ oldTrailingComma = refDestructuringErrors.trailingComma;
+ oldDoubleProto = refDestructuringErrors.doubleProto;
+ refDestructuringErrors.parenthesizedAssign = refDestructuringErrors.trailingComma = -1;
+ } else {
+ refDestructuringErrors = new DestructuringErrors;
+ ownDestructuringErrors = true;
+ }
+
+ var startPos = this.start, startLoc = this.startLoc;
+ if (this.type === types$1.parenL || this.type === types$1.name) {
+ this.potentialArrowAt = this.start;
+ this.potentialArrowInForAwait = forInit === "await";
+ }
+ var left = this.parseMaybeConditional(forInit, refDestructuringErrors);
+ if (afterLeftParse) { left = afterLeftParse.call(this, left, startPos, startLoc); }
+ if (this.type.isAssign) {
+ var node = this.startNodeAt(startPos, startLoc);
+ node.operator = this.value;
+ if (this.type === types$1.eq)
+ { left = this.toAssignable(left, false, refDestructuringErrors); }
+ if (!ownDestructuringErrors) {
+ refDestructuringErrors.parenthesizedAssign = refDestructuringErrors.trailingComma = refDestructuringErrors.doubleProto = -1;
+ }
+ if (refDestructuringErrors.shorthandAssign >= left.start)
+ { refDestructuringErrors.shorthandAssign = -1; } // reset because shorthand default was used correctly
+ if (this.type === types$1.eq)
+ { this.checkLValPattern(left); }
+ else
+ { this.checkLValSimple(left); }
+ node.left = left;
+ this.next();
+ node.right = this.parseMaybeAssign(forInit);
+ if (oldDoubleProto > -1) { refDestructuringErrors.doubleProto = oldDoubleProto; }
+ return this.finishNode(node, "AssignmentExpression")
+ } else {
+ if (ownDestructuringErrors) { this.checkExpressionErrors(refDestructuringErrors, true); }
+ }
+ if (oldParenAssign > -1) { refDestructuringErrors.parenthesizedAssign = oldParenAssign; }
+ if (oldTrailingComma > -1) { refDestructuringErrors.trailingComma = oldTrailingComma; }
+ return left
+ };
+
+ // Parse a ternary conditional (`?:`) operator.
+
+ pp$5.parseMaybeConditional = function(forInit, refDestructuringErrors) {
+ var startPos = this.start, startLoc = this.startLoc;
+ var expr = this.parseExprOps(forInit, refDestructuringErrors);
+ if (this.checkExpressionErrors(refDestructuringErrors)) { return expr }
+ if (this.eat(types$1.question)) {
+ var node = this.startNodeAt(startPos, startLoc);
+ node.test = expr;
+ node.consequent = this.parseMaybeAssign();
+ this.expect(types$1.colon);
+ node.alternate = this.parseMaybeAssign(forInit);
+ return this.finishNode(node, "ConditionalExpression")
+ }
+ return expr
+ };
+
+ // Start the precedence parser.
+
+ pp$5.parseExprOps = function(forInit, refDestructuringErrors) {
+ var startPos = this.start, startLoc = this.startLoc;
+ var expr = this.parseMaybeUnary(refDestructuringErrors, false, false, forInit);
+ if (this.checkExpressionErrors(refDestructuringErrors)) { return expr }
+ return expr.start === startPos && expr.type === "ArrowFunctionExpression" ? expr : this.parseExprOp(expr, startPos, startLoc, -1, forInit)
+ };
+
+ // Parse binary operators with the operator precedence parsing
+ // algorithm. `left` is the left-hand side of the operator.
+ // `minPrec` provides context that allows the function to stop and
+ // defer further parser to one of its callers when it encounters an
+ // operator that has a lower precedence than the set it is parsing.
+
+ pp$5.parseExprOp = function(left, leftStartPos, leftStartLoc, minPrec, forInit) {
+ var prec = this.type.binop;
+ if (prec != null && (!forInit || this.type !== types$1._in)) {
+ if (prec > minPrec) {
+ var logical = this.type === types$1.logicalOR || this.type === types$1.logicalAND;
+ var coalesce = this.type === types$1.coalesce;
+ if (coalesce) {
+ // Handle the precedence of `tt.coalesce` as equal to the range of logical expressions.
+ // In other words, `node.right` shouldn't contain logical expressions in order to check the mixed error.
+ prec = types$1.logicalAND.binop;
+ }
+ var op = this.value;
+ this.next();
+ var startPos = this.start, startLoc = this.startLoc;
+ var right = this.parseExprOp(this.parseMaybeUnary(null, false, false, forInit), startPos, startLoc, prec, forInit);
+ var node = this.buildBinary(leftStartPos, leftStartLoc, left, right, op, logical || coalesce);
+ if ((logical && this.type === types$1.coalesce) || (coalesce && (this.type === types$1.logicalOR || this.type === types$1.logicalAND))) {
+ this.raiseRecoverable(this.start, "Logical expressions and coalesce expressions cannot be mixed. Wrap either by parentheses");
+ }
+ return this.parseExprOp(node, leftStartPos, leftStartLoc, minPrec, forInit)
+ }
+ }
+ return left
+ };
+
+ pp$5.buildBinary = function(startPos, startLoc, left, right, op, logical) {
+ if (right.type === "PrivateIdentifier") { this.raise(right.start, "Private identifier can only be left side of binary expression"); }
+ var node = this.startNodeAt(startPos, startLoc);
+ node.left = left;
+ node.operator = op;
+ node.right = right;
+ return this.finishNode(node, logical ? "LogicalExpression" : "BinaryExpression")
+ };
+
+ // Parse unary operators, both prefix and postfix.
+
+ pp$5.parseMaybeUnary = function(refDestructuringErrors, sawUnary, incDec, forInit) {
+ var startPos = this.start, startLoc = this.startLoc, expr;
+ if (this.isContextual("await") && this.canAwait) {
+ expr = this.parseAwait(forInit);
+ sawUnary = true;
+ } else if (this.type.prefix) {
+ var node = this.startNode(), update = this.type === types$1.incDec;
+ node.operator = this.value;
+ node.prefix = true;
+ this.next();
+ node.argument = this.parseMaybeUnary(null, true, update, forInit);
+ this.checkExpressionErrors(refDestructuringErrors, true);
+ if (update) { this.checkLValSimple(node.argument); }
+ else if (this.strict && node.operator === "delete" &&
+ node.argument.type === "Identifier")
+ { this.raiseRecoverable(node.start, "Deleting local variable in strict mode"); }
+ else if (node.operator === "delete" && isPrivateFieldAccess(node.argument))
+ { this.raiseRecoverable(node.start, "Private fields can not be deleted"); }
+ else { sawUnary = true; }
+ expr = this.finishNode(node, update ? "UpdateExpression" : "UnaryExpression");
+ } else if (!sawUnary && this.type === types$1.privateId) {
+ if (forInit || this.privateNameStack.length === 0) { this.unexpected(); }
+ expr = this.parsePrivateIdent();
+ // only could be private fields in 'in', such as #x in obj
+ if (this.type !== types$1._in) { this.unexpected(); }
+ } else {
+ expr = this.parseExprSubscripts(refDestructuringErrors, forInit);
+ if (this.checkExpressionErrors(refDestructuringErrors)) { return expr }
+ while (this.type.postfix && !this.canInsertSemicolon()) {
+ var node$1 = this.startNodeAt(startPos, startLoc);
+ node$1.operator = this.value;
+ node$1.prefix = false;
+ node$1.argument = expr;
+ this.checkLValSimple(expr);
+ this.next();
+ expr = this.finishNode(node$1, "UpdateExpression");
+ }
+ }
+
+ if (!incDec && this.eat(types$1.starstar)) {
+ if (sawUnary)
+ { this.unexpected(this.lastTokStart); }
+ else
+ { return this.buildBinary(startPos, startLoc, expr, this.parseMaybeUnary(null, false, false, forInit), "**", false) }
+ } else {
+ return expr
+ }
+ };
+
+ function isPrivateFieldAccess(node) {
+ return (
+ node.type === "MemberExpression" && node.property.type === "PrivateIdentifier" ||
+ node.type === "ChainExpression" && isPrivateFieldAccess(node.expression)
+ )
+ }
+
+ // Parse call, dot, and `[]`-subscript expressions.
+
+ pp$5.parseExprSubscripts = function(refDestructuringErrors, forInit) {
+ var startPos = this.start, startLoc = this.startLoc;
+ var expr = this.parseExprAtom(refDestructuringErrors, forInit);
+ if (expr.type === "ArrowFunctionExpression" && this.input.slice(this.lastTokStart, this.lastTokEnd) !== ")")
+ { return expr }
+ var result = this.parseSubscripts(expr, startPos, startLoc, false, forInit);
+ if (refDestructuringErrors && result.type === "MemberExpression") {
+ if (refDestructuringErrors.parenthesizedAssign >= result.start) { refDestructuringErrors.parenthesizedAssign = -1; }
+ if (refDestructuringErrors.parenthesizedBind >= result.start) { refDestructuringErrors.parenthesizedBind = -1; }
+ if (refDestructuringErrors.trailingComma >= result.start) { refDestructuringErrors.trailingComma = -1; }
+ }
+ return result
+ };
+
+ pp$5.parseSubscripts = function(base, startPos, startLoc, noCalls, forInit) {
+ var maybeAsyncArrow = this.options.ecmaVersion >= 8 && base.type === "Identifier" && base.name === "async" &&
+ this.lastTokEnd === base.end && !this.canInsertSemicolon() && base.end - base.start === 5 &&
+ this.potentialArrowAt === base.start;
+ var optionalChained = false;
+
+ while (true) {
+ var element = this.parseSubscript(base, startPos, startLoc, noCalls, maybeAsyncArrow, optionalChained, forInit);
+
+ if (element.optional) { optionalChained = true; }
+ if (element === base || element.type === "ArrowFunctionExpression") {
+ if (optionalChained) {
+ var chainNode = this.startNodeAt(startPos, startLoc);
+ chainNode.expression = element;
+ element = this.finishNode(chainNode, "ChainExpression");
+ }
+ return element
+ }
+
+ base = element;
+ }
+ };
+
+ pp$5.parseSubscript = function(base, startPos, startLoc, noCalls, maybeAsyncArrow, optionalChained, forInit) {
+ var optionalSupported = this.options.ecmaVersion >= 11;
+ var optional = optionalSupported && this.eat(types$1.questionDot);
+ if (noCalls && optional) { this.raise(this.lastTokStart, "Optional chaining cannot appear in the callee of new expressions"); }
+
+ var computed = this.eat(types$1.bracketL);
+ if (computed || (optional && this.type !== types$1.parenL && this.type !== types$1.backQuote) || this.eat(types$1.dot)) {
+ var node = this.startNodeAt(startPos, startLoc);
+ node.object = base;
+ if (computed) {
+ node.property = this.parseExpression();
+ this.expect(types$1.bracketR);
+ } else if (this.type === types$1.privateId && base.type !== "Super") {
+ node.property = this.parsePrivateIdent();
+ } else {
+ node.property = this.parseIdent(this.options.allowReserved !== "never");
+ }
+ node.computed = !!computed;
+ if (optionalSupported) {
+ node.optional = optional;
+ }
+ base = this.finishNode(node, "MemberExpression");
+ } else if (!noCalls && this.eat(types$1.parenL)) {
+ var refDestructuringErrors = new DestructuringErrors, oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos;
+ this.yieldPos = 0;
+ this.awaitPos = 0;
+ this.awaitIdentPos = 0;
+ var exprList = this.parseExprList(types$1.parenR, this.options.ecmaVersion >= 8, false, refDestructuringErrors);
+ if (maybeAsyncArrow && !optional && !this.canInsertSemicolon() && this.eat(types$1.arrow)) {
+ this.checkPatternErrors(refDestructuringErrors, false);
+ this.checkYieldAwaitInDefaultParams();
+ if (this.awaitIdentPos > 0)
+ { this.raise(this.awaitIdentPos, "Cannot use 'await' as identifier inside an async function"); }
+ this.yieldPos = oldYieldPos;
+ this.awaitPos = oldAwaitPos;
+ this.awaitIdentPos = oldAwaitIdentPos;
+ return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), exprList, true, forInit)
+ }
+ this.checkExpressionErrors(refDestructuringErrors, true);
+ this.yieldPos = oldYieldPos || this.yieldPos;
+ this.awaitPos = oldAwaitPos || this.awaitPos;
+ this.awaitIdentPos = oldAwaitIdentPos || this.awaitIdentPos;
+ var node$1 = this.startNodeAt(startPos, startLoc);
+ node$1.callee = base;
+ node$1.arguments = exprList;
+ if (optionalSupported) {
+ node$1.optional = optional;
+ }
+ base = this.finishNode(node$1, "CallExpression");
+ } else if (this.type === types$1.backQuote) {
+ if (optional || optionalChained) {
+ this.raise(this.start, "Optional chaining cannot appear in the tag of tagged template expressions");
+ }
+ var node$2 = this.startNodeAt(startPos, startLoc);
+ node$2.tag = base;
+ node$2.quasi = this.parseTemplate({isTagged: true});
+ base = this.finishNode(node$2, "TaggedTemplateExpression");
+ }
+ return base
+ };
+
+ // Parse an atomic expression — either a single token that is an
+ // expression, an expression started by a keyword like `function` or
+ // `new`, or an expression wrapped in punctuation like `()`, `[]`,
+ // or `{}`.
+
+ pp$5.parseExprAtom = function(refDestructuringErrors, forInit) {
+ // If a division operator appears in an expression position, the
+ // tokenizer got confused, and we force it to read a regexp instead.
+ if (this.type === types$1.slash) { this.readRegexp(); }
+
+ var node, canBeArrow = this.potentialArrowAt === this.start;
+ switch (this.type) {
+ case types$1._super:
+ if (!this.allowSuper)
+ { this.raise(this.start, "'super' keyword outside a method"); }
+ node = this.startNode();
+ this.next();
+ if (this.type === types$1.parenL && !this.allowDirectSuper)
+ { this.raise(node.start, "super() call outside constructor of a subclass"); }
+ // The `super` keyword can appear at below:
+ // SuperProperty:
+ // super [ Expression ]
+ // super . IdentifierName
+ // SuperCall:
+ // super ( Arguments )
+ if (this.type !== types$1.dot && this.type !== types$1.bracketL && this.type !== types$1.parenL)
+ { this.unexpected(); }
+ return this.finishNode(node, "Super")
+
+ case types$1._this:
+ node = this.startNode();
+ this.next();
+ return this.finishNode(node, "ThisExpression")
+
+ case types$1.name:
+ var startPos = this.start, startLoc = this.startLoc, containsEsc = this.containsEsc;
+ var id = this.parseIdent(false);
+ if (this.options.ecmaVersion >= 8 && !containsEsc && id.name === "async" && !this.canInsertSemicolon() && this.eat(types$1._function)) {
+ this.overrideContext(types.f_expr);
+ return this.parseFunction(this.startNodeAt(startPos, startLoc), 0, false, true, forInit)
+ }
+ if (canBeArrow && !this.canInsertSemicolon()) {
+ if (this.eat(types$1.arrow))
+ { return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), [id], false, forInit) }
+ if (this.options.ecmaVersion >= 8 && id.name === "async" && this.type === types$1.name && !containsEsc &&
+ (!this.potentialArrowInForAwait || this.value !== "of" || this.containsEsc)) {
+ id = this.parseIdent(false);
+ if (this.canInsertSemicolon() || !this.eat(types$1.arrow))
+ { this.unexpected(); }
+ return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), [id], true, forInit)
+ }
+ }
+ return id
+
+ case types$1.regexp:
+ var value = this.value;
+ node = this.parseLiteral(value.value);
+ node.regex = {pattern: value.pattern, flags: value.flags};
+ return node
+
+ case types$1.num: case types$1.string:
+ return this.parseLiteral(this.value)
+
+ case types$1._null: case types$1._true: case types$1._false:
+ node = this.startNode();
+ node.value = this.type === types$1._null ? null : this.type === types$1._true;
+ node.raw = this.type.keyword;
+ this.next();
+ return this.finishNode(node, "Literal")
+
+ case types$1.parenL:
+ var start = this.start, expr = this.parseParenAndDistinguishExpression(canBeArrow, forInit);
+ if (refDestructuringErrors) {
+ if (refDestructuringErrors.parenthesizedAssign < 0 && !this.isSimpleAssignTarget(expr))
+ { refDestructuringErrors.parenthesizedAssign = start; }
+ if (refDestructuringErrors.parenthesizedBind < 0)
+ { refDestructuringErrors.parenthesizedBind = start; }
+ }
+ return expr
+
+ case types$1.bracketL:
+ node = this.startNode();
+ this.next();
+ node.elements = this.parseExprList(types$1.bracketR, true, true, refDestructuringErrors);
+ return this.finishNode(node, "ArrayExpression")
+
+ case types$1.braceL:
+ this.overrideContext(types.b_expr);
+ return this.parseObj(false, refDestructuringErrors)
+
+ case types$1._function:
+ node = this.startNode();
+ this.next();
+ return this.parseFunction(node, 0)
+
+ case types$1._class:
+ return this.parseClass(this.startNode(), false)
+
+ case types$1._new:
+ return this.parseNew()
+
+ case types$1.backQuote:
+ return this.parseTemplate()
+
+ case types$1._import:
+ if (this.options.ecmaVersion >= 11) {
+ return this.parseExprImport()
+ } else {
+ return this.unexpected()
+ }
+
+ default:
+ this.unexpected();
+ }
+ };
+
+ pp$5.parseExprImport = function() {
+ var node = this.startNode();
+
+ // Consume `import` as an identifier for `import.meta`.
+ // Because `this.parseIdent(true)` doesn't check escape sequences, it needs the check of `this.containsEsc`.
+ if (this.containsEsc) { this.raiseRecoverable(this.start, "Escape sequence in keyword import"); }
+ var meta = this.parseIdent(true);
+
+ switch (this.type) {
+ case types$1.parenL:
+ return this.parseDynamicImport(node)
+ case types$1.dot:
+ node.meta = meta;
+ return this.parseImportMeta(node)
+ default:
+ this.unexpected();
+ }
+ };
+
+ pp$5.parseDynamicImport = function(node) {
+ this.next(); // skip `(`
+
+ // Parse node.source.
+ node.source = this.parseMaybeAssign();
+
+ // Verify ending.
+ if (!this.eat(types$1.parenR)) {
+ var errorPos = this.start;
+ if (this.eat(types$1.comma) && this.eat(types$1.parenR)) {
+ this.raiseRecoverable(errorPos, "Trailing comma is not allowed in import()");
+ } else {
+ this.unexpected(errorPos);
+ }
+ }
+
+ return this.finishNode(node, "ImportExpression")
+ };
+
+ pp$5.parseImportMeta = function(node) {
+ this.next(); // skip `.`
+
+ var containsEsc = this.containsEsc;
+ node.property = this.parseIdent(true);
+
+ if (node.property.name !== "meta")
+ { this.raiseRecoverable(node.property.start, "The only valid meta property for import is 'import.meta'"); }
+ if (containsEsc)
+ { this.raiseRecoverable(node.start, "'import.meta' must not contain escaped characters"); }
+ if (this.options.sourceType !== "module" && !this.options.allowImportExportEverywhere)
+ { this.raiseRecoverable(node.start, "Cannot use 'import.meta' outside a module"); }
+
+ return this.finishNode(node, "MetaProperty")
+ };
+
+ pp$5.parseLiteral = function(value) {
+ var node = this.startNode();
+ node.value = value;
+ node.raw = this.input.slice(this.start, this.end);
+ if (node.raw.charCodeAt(node.raw.length - 1) === 110) { node.bigint = node.raw.slice(0, -1).replace(/_/g, ""); }
+ this.next();
+ return this.finishNode(node, "Literal")
+ };
+
+ pp$5.parseParenExpression = function() {
+ this.expect(types$1.parenL);
+ var val = this.parseExpression();
+ this.expect(types$1.parenR);
+ return val
+ };
+
+ pp$5.parseParenAndDistinguishExpression = function(canBeArrow, forInit) {
+ var startPos = this.start, startLoc = this.startLoc, val, allowTrailingComma = this.options.ecmaVersion >= 8;
+ if (this.options.ecmaVersion >= 6) {
+ this.next();
+
+ var innerStartPos = this.start, innerStartLoc = this.startLoc;
+ var exprList = [], first = true, lastIsComma = false;
+ var refDestructuringErrors = new DestructuringErrors, oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, spreadStart;
+ this.yieldPos = 0;
+ this.awaitPos = 0;
+ // Do not save awaitIdentPos to allow checking awaits nested in parameters
+ while (this.type !== types$1.parenR) {
+ first ? first = false : this.expect(types$1.comma);
+ if (allowTrailingComma && this.afterTrailingComma(types$1.parenR, true)) {
+ lastIsComma = true;
+ break
+ } else if (this.type === types$1.ellipsis) {
+ spreadStart = this.start;
+ exprList.push(this.parseParenItem(this.parseRestBinding()));
+ if (this.type === types$1.comma) { this.raise(this.start, "Comma is not permitted after the rest element"); }
+ break
+ } else {
+ exprList.push(this.parseMaybeAssign(false, refDestructuringErrors, this.parseParenItem));
+ }
+ }
+ var innerEndPos = this.lastTokEnd, innerEndLoc = this.lastTokEndLoc;
+ this.expect(types$1.parenR);
+
+ if (canBeArrow && !this.canInsertSemicolon() && this.eat(types$1.arrow)) {
+ this.checkPatternErrors(refDestructuringErrors, false);
+ this.checkYieldAwaitInDefaultParams();
+ this.yieldPos = oldYieldPos;
+ this.awaitPos = oldAwaitPos;
+ return this.parseParenArrowList(startPos, startLoc, exprList, forInit)
+ }
+
+ if (!exprList.length || lastIsComma) { this.unexpected(this.lastTokStart); }
+ if (spreadStart) { this.unexpected(spreadStart); }
+ this.checkExpressionErrors(refDestructuringErrors, true);
+ this.yieldPos = oldYieldPos || this.yieldPos;
+ this.awaitPos = oldAwaitPos || this.awaitPos;
+
+ if (exprList.length > 1) {
+ val = this.startNodeAt(innerStartPos, innerStartLoc);
+ val.expressions = exprList;
+ this.finishNodeAt(val, "SequenceExpression", innerEndPos, innerEndLoc);
+ } else {
+ val = exprList[0];
+ }
+ } else {
+ val = this.parseParenExpression();
+ }
+
+ if (this.options.preserveParens) {
+ var par = this.startNodeAt(startPos, startLoc);
+ par.expression = val;
+ return this.finishNode(par, "ParenthesizedExpression")
+ } else {
+ return val
+ }
+ };
+
+ pp$5.parseParenItem = function(item) {
+ return item
+ };
+
+ pp$5.parseParenArrowList = function(startPos, startLoc, exprList, forInit) {
+ return this.parseArrowExpression(this.startNodeAt(startPos, startLoc), exprList, false, forInit)
+ };
+
+ // New's precedence is slightly tricky. It must allow its argument to
+ // be a `[]` or dot subscript expression, but not a call — at least,
+ // not without wrapping it in parentheses. Thus, it uses the noCalls
+ // argument to parseSubscripts to prevent it from consuming the
+ // argument list.
+
+ var empty = [];
+
+ pp$5.parseNew = function() {
+ if (this.containsEsc) { this.raiseRecoverable(this.start, "Escape sequence in keyword new"); }
+ var node = this.startNode();
+ var meta = this.parseIdent(true);
+ if (this.options.ecmaVersion >= 6 && this.eat(types$1.dot)) {
+ node.meta = meta;
+ var containsEsc = this.containsEsc;
+ node.property = this.parseIdent(true);
+ if (node.property.name !== "target")
+ { this.raiseRecoverable(node.property.start, "The only valid meta property for new is 'new.target'"); }
+ if (containsEsc)
+ { this.raiseRecoverable(node.start, "'new.target' must not contain escaped characters"); }
+ if (!this.allowNewDotTarget)
+ { this.raiseRecoverable(node.start, "'new.target' can only be used in functions and class static block"); }
+ return this.finishNode(node, "MetaProperty")
+ }
+ var startPos = this.start, startLoc = this.startLoc, isImport = this.type === types$1._import;
+ node.callee = this.parseSubscripts(this.parseExprAtom(), startPos, startLoc, true, false);
+ if (isImport && node.callee.type === "ImportExpression") {
+ this.raise(startPos, "Cannot use new with import()");
+ }
+ if (this.eat(types$1.parenL)) { node.arguments = this.parseExprList(types$1.parenR, this.options.ecmaVersion >= 8, false); }
+ else { node.arguments = empty; }
+ return this.finishNode(node, "NewExpression")
+ };
+
+ // Parse template expression.
+
+ pp$5.parseTemplateElement = function(ref) {
+ var isTagged = ref.isTagged;
+
+ var elem = this.startNode();
+ if (this.type === types$1.invalidTemplate) {
+ if (!isTagged) {
+ this.raiseRecoverable(this.start, "Bad escape sequence in untagged template literal");
+ }
+ elem.value = {
+ raw: this.value,
+ cooked: null
+ };
+ } else {
+ elem.value = {
+ raw: this.input.slice(this.start, this.end).replace(/\r\n?/g, "\n"),
+ cooked: this.value
+ };
+ }
+ this.next();
+ elem.tail = this.type === types$1.backQuote;
+ return this.finishNode(elem, "TemplateElement")
+ };
+
+ pp$5.parseTemplate = function(ref) {
+ if ( ref === void 0 ) ref = {};
+ var isTagged = ref.isTagged; if ( isTagged === void 0 ) isTagged = false;
+
+ var node = this.startNode();
+ this.next();
+ node.expressions = [];
+ var curElt = this.parseTemplateElement({isTagged: isTagged});
+ node.quasis = [curElt];
+ while (!curElt.tail) {
+ if (this.type === types$1.eof) { this.raise(this.pos, "Unterminated template literal"); }
+ this.expect(types$1.dollarBraceL);
+ node.expressions.push(this.parseExpression());
+ this.expect(types$1.braceR);
+ node.quasis.push(curElt = this.parseTemplateElement({isTagged: isTagged}));
+ }
+ this.next();
+ return this.finishNode(node, "TemplateLiteral")
+ };
+
+ pp$5.isAsyncProp = function(prop) {
+ return !prop.computed && prop.key.type === "Identifier" && prop.key.name === "async" &&
+ (this.type === types$1.name || this.type === types$1.num || this.type === types$1.string || this.type === types$1.bracketL || this.type.keyword || (this.options.ecmaVersion >= 9 && this.type === types$1.star)) &&
+ !lineBreak.test(this.input.slice(this.lastTokEnd, this.start))
+ };
+
+ // Parse an object literal or binding pattern.
+
+ pp$5.parseObj = function(isPattern, refDestructuringErrors) {
+ var node = this.startNode(), first = true, propHash = {};
+ node.properties = [];
+ this.next();
+ while (!this.eat(types$1.braceR)) {
+ if (!first) {
+ this.expect(types$1.comma);
+ if (this.options.ecmaVersion >= 5 && this.afterTrailingComma(types$1.braceR)) { break }
+ } else { first = false; }
+
+ var prop = this.parseProperty(isPattern, refDestructuringErrors);
+ if (!isPattern) { this.checkPropClash(prop, propHash, refDestructuringErrors); }
+ node.properties.push(prop);
+ }
+ return this.finishNode(node, isPattern ? "ObjectPattern" : "ObjectExpression")
+ };
+
+ pp$5.parseProperty = function(isPattern, refDestructuringErrors) {
+ var prop = this.startNode(), isGenerator, isAsync, startPos, startLoc;
+ if (this.options.ecmaVersion >= 9 && this.eat(types$1.ellipsis)) {
+ if (isPattern) {
+ prop.argument = this.parseIdent(false);
+ if (this.type === types$1.comma) {
+ this.raise(this.start, "Comma is not permitted after the rest element");
+ }
+ return this.finishNode(prop, "RestElement")
+ }
+ // Parse argument.
+ prop.argument = this.parseMaybeAssign(false, refDestructuringErrors);
+ // To disallow trailing comma via `this.toAssignable()`.
+ if (this.type === types$1.comma && refDestructuringErrors && refDestructuringErrors.trailingComma < 0) {
+ refDestructuringErrors.trailingComma = this.start;
+ }
+ // Finish
+ return this.finishNode(prop, "SpreadElement")
+ }
+ if (this.options.ecmaVersion >= 6) {
+ prop.method = false;
+ prop.shorthand = false;
+ if (isPattern || refDestructuringErrors) {
+ startPos = this.start;
+ startLoc = this.startLoc;
+ }
+ if (!isPattern)
+ { isGenerator = this.eat(types$1.star); }
+ }
+ var containsEsc = this.containsEsc;
+ this.parsePropertyName(prop);
+ if (!isPattern && !containsEsc && this.options.ecmaVersion >= 8 && !isGenerator && this.isAsyncProp(prop)) {
+ isAsync = true;
+ isGenerator = this.options.ecmaVersion >= 9 && this.eat(types$1.star);
+ this.parsePropertyName(prop);
+ } else {
+ isAsync = false;
+ }
+ this.parsePropertyValue(prop, isPattern, isGenerator, isAsync, startPos, startLoc, refDestructuringErrors, containsEsc);
+ return this.finishNode(prop, "Property")
+ };
+
+ pp$5.parsePropertyValue = function(prop, isPattern, isGenerator, isAsync, startPos, startLoc, refDestructuringErrors, containsEsc) {
+ if ((isGenerator || isAsync) && this.type === types$1.colon)
+ { this.unexpected(); }
+
+ if (this.eat(types$1.colon)) {
+ prop.value = isPattern ? this.parseMaybeDefault(this.start, this.startLoc) : this.parseMaybeAssign(false, refDestructuringErrors);
+ prop.kind = "init";
+ } else if (this.options.ecmaVersion >= 6 && this.type === types$1.parenL) {
+ if (isPattern) { this.unexpected(); }
+ prop.kind = "init";
+ prop.method = true;
+ prop.value = this.parseMethod(isGenerator, isAsync);
+ } else if (!isPattern && !containsEsc &&
+ this.options.ecmaVersion >= 5 && !prop.computed && prop.key.type === "Identifier" &&
+ (prop.key.name === "get" || prop.key.name === "set") &&
+ (this.type !== types$1.comma && this.type !== types$1.braceR && this.type !== types$1.eq)) {
+ if (isGenerator || isAsync) { this.unexpected(); }
+ prop.kind = prop.key.name;
+ this.parsePropertyName(prop);
+ prop.value = this.parseMethod(false);
+ var paramCount = prop.kind === "get" ? 0 : 1;
+ if (prop.value.params.length !== paramCount) {
+ var start = prop.value.start;
+ if (prop.kind === "get")
+ { this.raiseRecoverable(start, "getter should have no params"); }
+ else
+ { this.raiseRecoverable(start, "setter should have exactly one param"); }
+ } else {
+ if (prop.kind === "set" && prop.value.params[0].type === "RestElement")
+ { this.raiseRecoverable(prop.value.params[0].start, "Setter cannot use rest params"); }
+ }
+ } else if (this.options.ecmaVersion >= 6 && !prop.computed && prop.key.type === "Identifier") {
+ if (isGenerator || isAsync) { this.unexpected(); }
+ this.checkUnreserved(prop.key);
+ if (prop.key.name === "await" && !this.awaitIdentPos)
+ { this.awaitIdentPos = startPos; }
+ prop.kind = "init";
+ if (isPattern) {
+ prop.value = this.parseMaybeDefault(startPos, startLoc, this.copyNode(prop.key));
+ } else if (this.type === types$1.eq && refDestructuringErrors) {
+ if (refDestructuringErrors.shorthandAssign < 0)
+ { refDestructuringErrors.shorthandAssign = this.start; }
+ prop.value = this.parseMaybeDefault(startPos, startLoc, this.copyNode(prop.key));
+ } else {
+ prop.value = this.copyNode(prop.key);
+ }
+ prop.shorthand = true;
+ } else { this.unexpected(); }
+ };
+
+ pp$5.parsePropertyName = function(prop) {
+ if (this.options.ecmaVersion >= 6) {
+ if (this.eat(types$1.bracketL)) {
+ prop.computed = true;
+ prop.key = this.parseMaybeAssign();
+ this.expect(types$1.bracketR);
+ return prop.key
+ } else {
+ prop.computed = false;
+ }
+ }
+ return prop.key = this.type === types$1.num || this.type === types$1.string ? this.parseExprAtom() : this.parseIdent(this.options.allowReserved !== "never")
+ };
+
+ // Initialize empty function node.
+
+ pp$5.initFunction = function(node) {
+ node.id = null;
+ if (this.options.ecmaVersion >= 6) { node.generator = node.expression = false; }
+ if (this.options.ecmaVersion >= 8) { node.async = false; }
+ };
+
+ // Parse object or class method.
+
+ pp$5.parseMethod = function(isGenerator, isAsync, allowDirectSuper) {
+ var node = this.startNode(), oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos;
+
+ this.initFunction(node);
+ if (this.options.ecmaVersion >= 6)
+ { node.generator = isGenerator; }
+ if (this.options.ecmaVersion >= 8)
+ { node.async = !!isAsync; }
+
+ this.yieldPos = 0;
+ this.awaitPos = 0;
+ this.awaitIdentPos = 0;
+ this.enterScope(functionFlags(isAsync, node.generator) | SCOPE_SUPER | (allowDirectSuper ? SCOPE_DIRECT_SUPER : 0));
+
+ this.expect(types$1.parenL);
+ node.params = this.parseBindingList(types$1.parenR, false, this.options.ecmaVersion >= 8);
+ this.checkYieldAwaitInDefaultParams();
+ this.parseFunctionBody(node, false, true, false);
+
+ this.yieldPos = oldYieldPos;
+ this.awaitPos = oldAwaitPos;
+ this.awaitIdentPos = oldAwaitIdentPos;
+ return this.finishNode(node, "FunctionExpression")
+ };
+
+ // Parse arrow function expression with given parameters.
+
+ pp$5.parseArrowExpression = function(node, params, isAsync, forInit) {
+ var oldYieldPos = this.yieldPos, oldAwaitPos = this.awaitPos, oldAwaitIdentPos = this.awaitIdentPos;
+
+ this.enterScope(functionFlags(isAsync, false) | SCOPE_ARROW);
+ this.initFunction(node);
+ if (this.options.ecmaVersion >= 8) { node.async = !!isAsync; }
+
+ this.yieldPos = 0;
+ this.awaitPos = 0;
+ this.awaitIdentPos = 0;
+
+ node.params = this.toAssignableList(params, true);
+ this.parseFunctionBody(node, true, false, forInit);
+
+ this.yieldPos = oldYieldPos;
+ this.awaitPos = oldAwaitPos;
+ this.awaitIdentPos = oldAwaitIdentPos;
+ return this.finishNode(node, "ArrowFunctionExpression")
+ };
+
+ // Parse function body and check parameters.
+
+ pp$5.parseFunctionBody = function(node, isArrowFunction, isMethod, forInit) {
+ var isExpression = isArrowFunction && this.type !== types$1.braceL;
+ var oldStrict = this.strict, useStrict = false;
+
+ if (isExpression) {
+ node.body = this.parseMaybeAssign(forInit);
+ node.expression = true;
+ this.checkParams(node, false);
+ } else {
+ var nonSimple = this.options.ecmaVersion >= 7 && !this.isSimpleParamList(node.params);
+ if (!oldStrict || nonSimple) {
+ useStrict = this.strictDirective(this.end);
+ // If this is a strict mode function, verify that argument names
+ // are not repeated, and it does not try to bind the words `eval`
+ // or `arguments`.
+ if (useStrict && nonSimple)
+ { this.raiseRecoverable(node.start, "Illegal 'use strict' directive in function with non-simple parameter list"); }
+ }
+ // Start a new scope with regard to labels and the `inFunction`
+ // flag (restore them to their old value afterwards).
+ var oldLabels = this.labels;
+ this.labels = [];
+ if (useStrict) { this.strict = true; }
+
+ // Add the params to varDeclaredNames to ensure that an error is thrown
+ // if a let/const declaration in the function clashes with one of the params.
+ this.checkParams(node, !oldStrict && !useStrict && !isArrowFunction && !isMethod && this.isSimpleParamList(node.params));
+ // Ensure the function name isn't a forbidden identifier in strict mode, e.g. 'eval'
+ if (this.strict && node.id) { this.checkLValSimple(node.id, BIND_OUTSIDE); }
+ node.body = this.parseBlock(false, undefined, useStrict && !oldStrict);
+ node.expression = false;
+ this.adaptDirectivePrologue(node.body.body);
+ this.labels = oldLabels;
+ }
+ this.exitScope();
+ };
+
+ pp$5.isSimpleParamList = function(params) {
+ for (var i = 0, list = params; i < list.length; i += 1)
+ {
+ var param = list[i];
+
+ if (param.type !== "Identifier") { return false
+ } }
+ return true
+ };
+
+ // Checks function params for various disallowed patterns such as using "eval"
+ // or "arguments" and duplicate parameters.
+
+ pp$5.checkParams = function(node, allowDuplicates) {
+ var nameHash = Object.create(null);
+ for (var i = 0, list = node.params; i < list.length; i += 1)
+ {
+ var param = list[i];
+
+ this.checkLValInnerPattern(param, BIND_VAR, allowDuplicates ? null : nameHash);
+ }
+ };
+
+ // Parses a comma-separated list of expressions, and returns them as
+ // an array. `close` is the token type that ends the list, and
+ // `allowEmpty` can be turned on to allow subsequent commas with
+ // nothing in between them to be parsed as `null` (which is needed
+ // for array literals).
+
+ pp$5.parseExprList = function(close, allowTrailingComma, allowEmpty, refDestructuringErrors) {
+ var elts = [], first = true;
+ while (!this.eat(close)) {
+ if (!first) {
+ this.expect(types$1.comma);
+ if (allowTrailingComma && this.afterTrailingComma(close)) { break }
+ } else { first = false; }
+
+ var elt = (void 0);
+ if (allowEmpty && this.type === types$1.comma)
+ { elt = null; }
+ else if (this.type === types$1.ellipsis) {
+ elt = this.parseSpread(refDestructuringErrors);
+ if (refDestructuringErrors && this.type === types$1.comma && refDestructuringErrors.trailingComma < 0)
+ { refDestructuringErrors.trailingComma = this.start; }
+ } else {
+ elt = this.parseMaybeAssign(false, refDestructuringErrors);
+ }
+ elts.push(elt);
+ }
+ return elts
+ };
+
+ pp$5.checkUnreserved = function(ref) {
+ var start = ref.start;
+ var end = ref.end;
+ var name = ref.name;
+
+ if (this.inGenerator && name === "yield")
+ { this.raiseRecoverable(start, "Cannot use 'yield' as identifier inside a generator"); }
+ if (this.inAsync && name === "await")
+ { this.raiseRecoverable(start, "Cannot use 'await' as identifier inside an async function"); }
+ if (this.currentThisScope().inClassFieldInit && name === "arguments")
+ { this.raiseRecoverable(start, "Cannot use 'arguments' in class field initializer"); }
+ if (this.inClassStaticBlock && (name === "arguments" || name === "await"))
+ { this.raise(start, ("Cannot use " + name + " in class static initialization block")); }
+ if (this.keywords.test(name))
+ { this.raise(start, ("Unexpected keyword '" + name + "'")); }
+ if (this.options.ecmaVersion < 6 &&
+ this.input.slice(start, end).indexOf("\\") !== -1) { return }
+ var re = this.strict ? this.reservedWordsStrict : this.reservedWords;
+ if (re.test(name)) {
+ if (!this.inAsync && name === "await")
+ { this.raiseRecoverable(start, "Cannot use keyword 'await' outside an async function"); }
+ this.raiseRecoverable(start, ("The keyword '" + name + "' is reserved"));
+ }
+ };
+
+ // Parse the next token as an identifier. If `liberal` is true (used
+ // when parsing properties), it will also convert keywords into
+ // identifiers.
+
+ pp$5.parseIdent = function(liberal) {
+ var node = this.startNode();
+ if (this.type === types$1.name) {
+ node.name = this.value;
+ } else if (this.type.keyword) {
+ node.name = this.type.keyword;
+
+ // To fix https://github.com/acornjs/acorn/issues/575
+ // `class` and `function` keywords push new context into this.context.
+ // But there is no chance to pop the context if the keyword is consumed as an identifier such as a property name.
+ // If the previous token is a dot, this does not apply because the context-managing code already ignored the keyword
+ if ((node.name === "class" || node.name === "function") &&
+ (this.lastTokEnd !== this.lastTokStart + 1 || this.input.charCodeAt(this.lastTokStart) !== 46)) {
+ this.context.pop();
+ }
+ } else {
+ this.unexpected();
+ }
+ this.next(!!liberal);
+ this.finishNode(node, "Identifier");
+ if (!liberal) {
+ this.checkUnreserved(node);
+ if (node.name === "await" && !this.awaitIdentPos)
+ { this.awaitIdentPos = node.start; }
+ }
+ return node
+ };
+
+ pp$5.parsePrivateIdent = function() {
+ var node = this.startNode();
+ if (this.type === types$1.privateId) {
+ node.name = this.value;
+ } else {
+ this.unexpected();
+ }
+ this.next();
+ this.finishNode(node, "PrivateIdentifier");
+
+ // For validating existence
+ if (this.privateNameStack.length === 0) {
+ this.raise(node.start, ("Private field '#" + (node.name) + "' must be declared in an enclosing class"));
+ } else {
+ this.privateNameStack[this.privateNameStack.length - 1].used.push(node);
+ }
+
+ return node
+ };
+
+ // Parses yield expression inside generator.
+
+ pp$5.parseYield = function(forInit) {
+ if (!this.yieldPos) { this.yieldPos = this.start; }
+
+ var node = this.startNode();
+ this.next();
+ if (this.type === types$1.semi || this.canInsertSemicolon() || (this.type !== types$1.star && !this.type.startsExpr)) {
+ node.delegate = false;
+ node.argument = null;
+ } else {
+ node.delegate = this.eat(types$1.star);
+ node.argument = this.parseMaybeAssign(forInit);
+ }
+ return this.finishNode(node, "YieldExpression")
+ };
+
+ pp$5.parseAwait = function(forInit) {
+ if (!this.awaitPos) { this.awaitPos = this.start; }
+
+ var node = this.startNode();
+ this.next();
+ node.argument = this.parseMaybeUnary(null, true, false, forInit);
+ return this.finishNode(node, "AwaitExpression")
+ };
+
+ var pp$4 = Parser.prototype;
+
+ // This function is used to raise exceptions on parse errors. It
+ // takes an offset integer (into the current `input`) to indicate
+ // the location of the error, attaches the position to the end
+ // of the error message, and then raises a `SyntaxError` with that
+ // message.
+
+ pp$4.raise = function(pos, message) {
+ var loc = getLineInfo(this.input, pos);
+ message += " (" + loc.line + ":" + loc.column + ")";
+ var err = new SyntaxError(message);
+ err.pos = pos; err.loc = loc; err.raisedAt = this.pos;
+ throw err
+ };
+
+ pp$4.raiseRecoverable = pp$4.raise;
+
+ pp$4.curPosition = function() {
+ if (this.options.locations) {
+ return new Position(this.curLine, this.pos - this.lineStart)
+ }
+ };
+
+ var pp$3 = Parser.prototype;
+
+ var Scope = function Scope(flags) {
+ this.flags = flags;
+ // A list of var-declared names in the current lexical scope
+ this.var = [];
+ // A list of lexically-declared names in the current lexical scope
+ this.lexical = [];
+ // A list of lexically-declared FunctionDeclaration names in the current lexical scope
+ this.functions = [];
+ // A switch to disallow the identifier reference 'arguments'
+ this.inClassFieldInit = false;
+ };
+
+ // The functions in this module keep track of declared variables in the current scope in order to detect duplicate variable names.
+
+ pp$3.enterScope = function(flags) {
+ this.scopeStack.push(new Scope(flags));
+ };
+
+ pp$3.exitScope = function() {
+ this.scopeStack.pop();
+ };
+
+ // The spec says:
+ // > At the top level of a function, or script, function declarations are
+ // > treated like var declarations rather than like lexical declarations.
+ pp$3.treatFunctionsAsVarInScope = function(scope) {
+ return (scope.flags & SCOPE_FUNCTION) || !this.inModule && (scope.flags & SCOPE_TOP)
+ };
+
+ pp$3.declareName = function(name, bindingType, pos) {
+ var redeclared = false;
+ if (bindingType === BIND_LEXICAL) {
+ var scope = this.currentScope();
+ redeclared = scope.lexical.indexOf(name) > -1 || scope.functions.indexOf(name) > -1 || scope.var.indexOf(name) > -1;
+ scope.lexical.push(name);
+ if (this.inModule && (scope.flags & SCOPE_TOP))
+ { delete this.undefinedExports[name]; }
+ } else if (bindingType === BIND_SIMPLE_CATCH) {
+ var scope$1 = this.currentScope();
+ scope$1.lexical.push(name);
+ } else if (bindingType === BIND_FUNCTION) {
+ var scope$2 = this.currentScope();
+ if (this.treatFunctionsAsVar)
+ { redeclared = scope$2.lexical.indexOf(name) > -1; }
+ else
+ { redeclared = scope$2.lexical.indexOf(name) > -1 || scope$2.var.indexOf(name) > -1; }
+ scope$2.functions.push(name);
+ } else {
+ for (var i = this.scopeStack.length - 1; i >= 0; --i) {
+ var scope$3 = this.scopeStack[i];
+ if (scope$3.lexical.indexOf(name) > -1 && !((scope$3.flags & SCOPE_SIMPLE_CATCH) && scope$3.lexical[0] === name) ||
+ !this.treatFunctionsAsVarInScope(scope$3) && scope$3.functions.indexOf(name) > -1) {
+ redeclared = true;
+ break
+ }
+ scope$3.var.push(name);
+ if (this.inModule && (scope$3.flags & SCOPE_TOP))
+ { delete this.undefinedExports[name]; }
+ if (scope$3.flags & SCOPE_VAR) { break }
+ }
+ }
+ if (redeclared) { this.raiseRecoverable(pos, ("Identifier '" + name + "' has already been declared")); }
+ };
+
+ pp$3.checkLocalExport = function(id) {
+ // scope.functions must be empty as Module code is always strict.
+ if (this.scopeStack[0].lexical.indexOf(id.name) === -1 &&
+ this.scopeStack[0].var.indexOf(id.name) === -1) {
+ this.undefinedExports[id.name] = id;
+ }
+ };
+
+ pp$3.currentScope = function() {
+ return this.scopeStack[this.scopeStack.length - 1]
+ };
+
+ pp$3.currentVarScope = function() {
+ for (var i = this.scopeStack.length - 1;; i--) {
+ var scope = this.scopeStack[i];
+ if (scope.flags & SCOPE_VAR) { return scope }
+ }
+ };
+
+ // Could be useful for `this`, `new.target`, `super()`, `super.property`, and `super[property]`.
+ pp$3.currentThisScope = function() {
+ for (var i = this.scopeStack.length - 1;; i--) {
+ var scope = this.scopeStack[i];
+ if (scope.flags & SCOPE_VAR && !(scope.flags & SCOPE_ARROW)) { return scope }
+ }
+ };
+
+ var Node = function Node(parser, pos, loc) {
+ this.type = "";
+ this.start = pos;
+ this.end = 0;
+ if (parser.options.locations)
+ { this.loc = new SourceLocation(parser, loc); }
+ if (parser.options.directSourceFile)
+ { this.sourceFile = parser.options.directSourceFile; }
+ if (parser.options.ranges)
+ { this.range = [pos, 0]; }
+ };
+
+ // Start an AST node, attaching a start offset.
+
+ var pp$2 = Parser.prototype;
+
+ pp$2.startNode = function() {
+ return new Node(this, this.start, this.startLoc)
+ };
+
+ pp$2.startNodeAt = function(pos, loc) {
+ return new Node(this, pos, loc)
+ };
+
+ // Finish an AST node, adding `type` and `end` properties.
+
+ function finishNodeAt(node, type, pos, loc) {
+ node.type = type;
+ node.end = pos;
+ if (this.options.locations)
+ { node.loc.end = loc; }
+ if (this.options.ranges)
+ { node.range[1] = pos; }
+ return node
+ }
+
+ pp$2.finishNode = function(node, type) {
+ return finishNodeAt.call(this, node, type, this.lastTokEnd, this.lastTokEndLoc)
+ };
+
+ // Finish node at given position
+
+ pp$2.finishNodeAt = function(node, type, pos, loc) {
+ return finishNodeAt.call(this, node, type, pos, loc)
+ };
+
+ pp$2.copyNode = function(node) {
+ var newNode = new Node(this, node.start, this.startLoc);
+ for (var prop in node) { newNode[prop] = node[prop]; }
+ return newNode
+ };
+
+ // This file contains Unicode properties extracted from the ECMAScript specification.
+ // The lists are extracted like so:
+ // $$('#table-binary-unicode-properties > figure > table > tbody > tr > td:nth-child(1) code').map(el => el.innerText)
+
+ // #table-binary-unicode-properties
+ var ecma9BinaryProperties = "ASCII ASCII_Hex_Digit AHex Alphabetic Alpha Any Assigned Bidi_Control Bidi_C Bidi_Mirrored Bidi_M Case_Ignorable CI Cased Changes_When_Casefolded CWCF Changes_When_Casemapped CWCM Changes_When_Lowercased CWL Changes_When_NFKC_Casefolded CWKCF Changes_When_Titlecased CWT Changes_When_Uppercased CWU Dash Default_Ignorable_Code_Point DI Deprecated Dep Diacritic Dia Emoji Emoji_Component Emoji_Modifier Emoji_Modifier_Base Emoji_Presentation Extender Ext Grapheme_Base Gr_Base Grapheme_Extend Gr_Ext Hex_Digit Hex IDS_Binary_Operator IDSB IDS_Trinary_Operator IDST ID_Continue IDC ID_Start IDS Ideographic Ideo Join_Control Join_C Logical_Order_Exception LOE Lowercase Lower Math Noncharacter_Code_Point NChar Pattern_Syntax Pat_Syn Pattern_White_Space Pat_WS Quotation_Mark QMark Radical Regional_Indicator RI Sentence_Terminal STerm Soft_Dotted SD Terminal_Punctuation Term Unified_Ideograph UIdeo Uppercase Upper Variation_Selector VS White_Space space XID_Continue XIDC XID_Start XIDS";
+ var ecma10BinaryProperties = ecma9BinaryProperties + " Extended_Pictographic";
+ var ecma11BinaryProperties = ecma10BinaryProperties;
+ var ecma12BinaryProperties = ecma11BinaryProperties + " EBase EComp EMod EPres ExtPict";
+ var ecma13BinaryProperties = ecma12BinaryProperties;
+ var ecma14BinaryProperties = ecma13BinaryProperties;
+
+ var unicodeBinaryProperties = {
+ 9: ecma9BinaryProperties,
+ 10: ecma10BinaryProperties,
+ 11: ecma11BinaryProperties,
+ 12: ecma12BinaryProperties,
+ 13: ecma13BinaryProperties,
+ 14: ecma14BinaryProperties
+ };
+
+ // #table-unicode-general-category-values
+ var unicodeGeneralCategoryValues = "Cased_Letter LC Close_Punctuation Pe Connector_Punctuation Pc Control Cc cntrl Currency_Symbol Sc Dash_Punctuation Pd Decimal_Number Nd digit Enclosing_Mark Me Final_Punctuation Pf Format Cf Initial_Punctuation Pi Letter L Letter_Number Nl Line_Separator Zl Lowercase_Letter Ll Mark M Combining_Mark Math_Symbol Sm Modifier_Letter Lm Modifier_Symbol Sk Nonspacing_Mark Mn Number N Open_Punctuation Ps Other C Other_Letter Lo Other_Number No Other_Punctuation Po Other_Symbol So Paragraph_Separator Zp Private_Use Co Punctuation P punct Separator Z Space_Separator Zs Spacing_Mark Mc Surrogate Cs Symbol S Titlecase_Letter Lt Unassigned Cn Uppercase_Letter Lu";
+
+ // #table-unicode-script-values
+ var ecma9ScriptValues = "Adlam Adlm Ahom Anatolian_Hieroglyphs Hluw Arabic Arab Armenian Armn Avestan Avst Balinese Bali Bamum Bamu Bassa_Vah Bass Batak Batk Bengali Beng Bhaiksuki Bhks Bopomofo Bopo Brahmi Brah Braille Brai Buginese Bugi Buhid Buhd Canadian_Aboriginal Cans Carian Cari Caucasian_Albanian Aghb Chakma Cakm Cham Cham Cherokee Cher Common Zyyy Coptic Copt Qaac Cuneiform Xsux Cypriot Cprt Cyrillic Cyrl Deseret Dsrt Devanagari Deva Duployan Dupl Egyptian_Hieroglyphs Egyp Elbasan Elba Ethiopic Ethi Georgian Geor Glagolitic Glag Gothic Goth Grantha Gran Greek Grek Gujarati Gujr Gurmukhi Guru Han Hani Hangul Hang Hanunoo Hano Hatran Hatr Hebrew Hebr Hiragana Hira Imperial_Aramaic Armi Inherited Zinh Qaai Inscriptional_Pahlavi Phli Inscriptional_Parthian Prti Javanese Java Kaithi Kthi Kannada Knda Katakana Kana Kayah_Li Kali Kharoshthi Khar Khmer Khmr Khojki Khoj Khudawadi Sind Lao Laoo Latin Latn Lepcha Lepc Limbu Limb Linear_A Lina Linear_B Linb Lisu Lisu Lycian Lyci Lydian Lydi Mahajani Mahj Malayalam Mlym Mandaic Mand Manichaean Mani Marchen Marc Masaram_Gondi Gonm Meetei_Mayek Mtei Mende_Kikakui Mend Meroitic_Cursive Merc Meroitic_Hieroglyphs Mero Miao Plrd Modi Mongolian Mong Mro Mroo Multani Mult Myanmar Mymr Nabataean Nbat New_Tai_Lue Talu Newa Newa Nko Nkoo Nushu Nshu Ogham Ogam Ol_Chiki Olck Old_Hungarian Hung Old_Italic Ital Old_North_Arabian Narb Old_Permic Perm Old_Persian Xpeo Old_South_Arabian Sarb Old_Turkic Orkh Oriya Orya Osage Osge Osmanya Osma Pahawh_Hmong Hmng Palmyrene Palm Pau_Cin_Hau Pauc Phags_Pa Phag Phoenician Phnx Psalter_Pahlavi Phlp Rejang Rjng Runic Runr Samaritan Samr Saurashtra Saur Sharada Shrd Shavian Shaw Siddham Sidd SignWriting Sgnw Sinhala Sinh Sora_Sompeng Sora Soyombo Soyo Sundanese Sund Syloti_Nagri Sylo Syriac Syrc Tagalog Tglg Tagbanwa Tagb Tai_Le Tale Tai_Tham Lana Tai_Viet Tavt Takri Takr Tamil Taml Tangut Tang Telugu Telu Thaana Thaa Thai Thai Tibetan Tibt Tifinagh Tfng Tirhuta Tirh Ugaritic Ugar Vai Vaii Warang_Citi Wara Yi Yiii Zanabazar_Square Zanb";
+ var ecma10ScriptValues = ecma9ScriptValues + " Dogra Dogr Gunjala_Gondi Gong Hanifi_Rohingya Rohg Makasar Maka Medefaidrin Medf Old_Sogdian Sogo Sogdian Sogd";
+ var ecma11ScriptValues = ecma10ScriptValues + " Elymaic Elym Nandinagari Nand Nyiakeng_Puachue_Hmong Hmnp Wancho Wcho";
+ var ecma12ScriptValues = ecma11ScriptValues + " Chorasmian Chrs Diak Dives_Akuru Khitan_Small_Script Kits Yezi Yezidi";
+ var ecma13ScriptValues = ecma12ScriptValues + " Cypro_Minoan Cpmn Old_Uyghur Ougr Tangsa Tnsa Toto Vithkuqi Vith";
+ var ecma14ScriptValues = ecma13ScriptValues + " Kawi Nag_Mundari Nagm";
+
+ var unicodeScriptValues = {
+ 9: ecma9ScriptValues,
+ 10: ecma10ScriptValues,
+ 11: ecma11ScriptValues,
+ 12: ecma12ScriptValues,
+ 13: ecma13ScriptValues,
+ 14: ecma14ScriptValues
+ };
+
+ var data = {};
+ function buildUnicodeData(ecmaVersion) {
+ var d = data[ecmaVersion] = {
+ binary: wordsRegexp(unicodeBinaryProperties[ecmaVersion] + " " + unicodeGeneralCategoryValues),
+ nonBinary: {
+ General_Category: wordsRegexp(unicodeGeneralCategoryValues),
+ Script: wordsRegexp(unicodeScriptValues[ecmaVersion])
+ }
+ };
+ d.nonBinary.Script_Extensions = d.nonBinary.Script;
+
+ d.nonBinary.gc = d.nonBinary.General_Category;
+ d.nonBinary.sc = d.nonBinary.Script;
+ d.nonBinary.scx = d.nonBinary.Script_Extensions;
+ }
+
+ for (var i = 0, list = [9, 10, 11, 12, 13, 14]; i < list.length; i += 1) {
+ var ecmaVersion = list[i];
+
+ buildUnicodeData(ecmaVersion);
+ }
+
+ var pp$1 = Parser.prototype;
+
+ var RegExpValidationState = function RegExpValidationState(parser) {
+ this.parser = parser;
+ this.validFlags = "gim" + (parser.options.ecmaVersion >= 6 ? "uy" : "") + (parser.options.ecmaVersion >= 9 ? "s" : "") + (parser.options.ecmaVersion >= 13 ? "d" : "");
+ this.unicodeProperties = data[parser.options.ecmaVersion >= 14 ? 14 : parser.options.ecmaVersion];
+ this.source = "";
+ this.flags = "";
+ this.start = 0;
+ this.switchU = false;
+ this.switchN = false;
+ this.pos = 0;
+ this.lastIntValue = 0;
+ this.lastStringValue = "";
+ this.lastAssertionIsQuantifiable = false;
+ this.numCapturingParens = 0;
+ this.maxBackReference = 0;
+ this.groupNames = [];
+ this.backReferenceNames = [];
+ };
+
+ RegExpValidationState.prototype.reset = function reset (start, pattern, flags) {
+ var unicode = flags.indexOf("u") !== -1;
+ this.start = start | 0;
+ this.source = pattern + "";
+ this.flags = flags;
+ this.switchU = unicode && this.parser.options.ecmaVersion >= 6;
+ this.switchN = unicode && this.parser.options.ecmaVersion >= 9;
+ };
+
+ RegExpValidationState.prototype.raise = function raise (message) {
+ this.parser.raiseRecoverable(this.start, ("Invalid regular expression: /" + (this.source) + "/: " + message));
+ };
+
+ // If u flag is given, this returns the code point at the index (it combines a surrogate pair).
+ // Otherwise, this returns the code unit of the index (can be a part of a surrogate pair).
+ RegExpValidationState.prototype.at = function at (i, forceU) {
+ if ( forceU === void 0 ) forceU = false;
+
+ var s = this.source;
+ var l = s.length;
+ if (i >= l) {
+ return -1
+ }
+ var c = s.charCodeAt(i);
+ if (!(forceU || this.switchU) || c <= 0xD7FF || c >= 0xE000 || i + 1 >= l) {
+ return c
+ }
+ var next = s.charCodeAt(i + 1);
+ return next >= 0xDC00 && next <= 0xDFFF ? (c << 10) + next - 0x35FDC00 : c
+ };
+
+ RegExpValidationState.prototype.nextIndex = function nextIndex (i, forceU) {
+ if ( forceU === void 0 ) forceU = false;
+
+ var s = this.source;
+ var l = s.length;
+ if (i >= l) {
+ return l
+ }
+ var c = s.charCodeAt(i), next;
+ if (!(forceU || this.switchU) || c <= 0xD7FF || c >= 0xE000 || i + 1 >= l ||
+ (next = s.charCodeAt(i + 1)) < 0xDC00 || next > 0xDFFF) {
+ return i + 1
+ }
+ return i + 2
+ };
+
+ RegExpValidationState.prototype.current = function current (forceU) {
+ if ( forceU === void 0 ) forceU = false;
+
+ return this.at(this.pos, forceU)
+ };
+
+ RegExpValidationState.prototype.lookahead = function lookahead (forceU) {
+ if ( forceU === void 0 ) forceU = false;
+
+ return this.at(this.nextIndex(this.pos, forceU), forceU)
+ };
+
+ RegExpValidationState.prototype.advance = function advance (forceU) {
+ if ( forceU === void 0 ) forceU = false;
+
+ this.pos = this.nextIndex(this.pos, forceU);
+ };
+
+ RegExpValidationState.prototype.eat = function eat (ch, forceU) {
+ if ( forceU === void 0 ) forceU = false;
+
+ if (this.current(forceU) === ch) {
+ this.advance(forceU);
+ return true
+ }
+ return false
+ };
+
+ /**
+ * Validate the flags part of a given RegExpLiteral.
+ *
+ * @param {RegExpValidationState} state The state to validate RegExp.
+ * @returns {void}
+ */
+ pp$1.validateRegExpFlags = function(state) {
+ var validFlags = state.validFlags;
+ var flags = state.flags;
+
+ for (var i = 0; i < flags.length; i++) {
+ var flag = flags.charAt(i);
+ if (validFlags.indexOf(flag) === -1) {
+ this.raise(state.start, "Invalid regular expression flag");
+ }
+ if (flags.indexOf(flag, i + 1) > -1) {
+ this.raise(state.start, "Duplicate regular expression flag");
+ }
+ }
+ };
+
+ /**
+ * Validate the pattern part of a given RegExpLiteral.
+ *
+ * @param {RegExpValidationState} state The state to validate RegExp.
+ * @returns {void}
+ */
+ pp$1.validateRegExpPattern = function(state) {
+ this.regexp_pattern(state);
+
+ // The goal symbol for the parse is |Pattern[~U, ~N]|. If the result of
+ // parsing contains a |GroupName|, reparse with the goal symbol
+ // |Pattern[~U, +N]| and use this result instead. Throw a *SyntaxError*
+ // exception if _P_ did not conform to the grammar, if any elements of _P_
+ // were not matched by the parse, or if any Early Error conditions exist.
+ if (!state.switchN && this.options.ecmaVersion >= 9 && state.groupNames.length > 0) {
+ state.switchN = true;
+ this.regexp_pattern(state);
+ }
+ };
+
+ // https://www.ecma-international.org/ecma-262/8.0/#prod-Pattern
+ pp$1.regexp_pattern = function(state) {
+ state.pos = 0;
+ state.lastIntValue = 0;
+ state.lastStringValue = "";
+ state.lastAssertionIsQuantifiable = false;
+ state.numCapturingParens = 0;
+ state.maxBackReference = 0;
+ state.groupNames.length = 0;
+ state.backReferenceNames.length = 0;
+
+ this.regexp_disjunction(state);
+
+ if (state.pos !== state.source.length) {
+ // Make the same messages as V8.
+ if (state.eat(0x29 /* ) */)) {
+ state.raise("Unmatched ')'");
+ }
+ if (state.eat(0x5D /* ] */) || state.eat(0x7D /* } */)) {
+ state.raise("Lone quantifier brackets");
+ }
+ }
+ if (state.maxBackReference > state.numCapturingParens) {
+ state.raise("Invalid escape");
+ }
+ for (var i = 0, list = state.backReferenceNames; i < list.length; i += 1) {
+ var name = list[i];
+
+ if (state.groupNames.indexOf(name) === -1) {
+ state.raise("Invalid named capture referenced");
+ }
+ }
+ };
+
+ // https://www.ecma-international.org/ecma-262/8.0/#prod-Disjunction
+ pp$1.regexp_disjunction = function(state) {
+ this.regexp_alternative(state);
+ while (state.eat(0x7C /* | */)) {
+ this.regexp_alternative(state);
+ }
+
+ // Make the same message as V8.
+ if (this.regexp_eatQuantifier(state, true)) {
+ state.raise("Nothing to repeat");
+ }
+ if (state.eat(0x7B /* { */)) {
+ state.raise("Lone quantifier brackets");
+ }
+ };
+
+ // https://www.ecma-international.org/ecma-262/8.0/#prod-Alternative
+ pp$1.regexp_alternative = function(state) {
+ while (state.pos < state.source.length && this.regexp_eatTerm(state))
+ { }
+ };
+
+ // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-Term
+ pp$1.regexp_eatTerm = function(state) {
+ if (this.regexp_eatAssertion(state)) {
+ // Handle `QuantifiableAssertion Quantifier` alternative.
+ // `state.lastAssertionIsQuantifiable` is true if the last eaten Assertion
+ // is a QuantifiableAssertion.
+ if (state.lastAssertionIsQuantifiable && this.regexp_eatQuantifier(state)) {
+ // Make the same message as V8.
+ if (state.switchU) {
+ state.raise("Invalid quantifier");
+ }
+ }
+ return true
+ }
+
+ if (state.switchU ? this.regexp_eatAtom(state) : this.regexp_eatExtendedAtom(state)) {
+ this.regexp_eatQuantifier(state);
+ return true
+ }
+
+ return false
+ };
+
+ // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-Assertion
+ pp$1.regexp_eatAssertion = function(state) {
+ var start = state.pos;
+ state.lastAssertionIsQuantifiable = false;
+
+ // ^, $
+ if (state.eat(0x5E /* ^ */) || state.eat(0x24 /* $ */)) {
+ return true
+ }
+
+ // \b \B
+ if (state.eat(0x5C /* \ */)) {
+ if (state.eat(0x42 /* B */) || state.eat(0x62 /* b */)) {
+ return true
+ }
+ state.pos = start;
+ }
+
+ // Lookahead / Lookbehind
+ if (state.eat(0x28 /* ( */) && state.eat(0x3F /* ? */)) {
+ var lookbehind = false;
+ if (this.options.ecmaVersion >= 9) {
+ lookbehind = state.eat(0x3C /* < */);
+ }
+ if (state.eat(0x3D /* = */) || state.eat(0x21 /* ! */)) {
+ this.regexp_disjunction(state);
+ if (!state.eat(0x29 /* ) */)) {
+ state.raise("Unterminated group");
+ }
+ state.lastAssertionIsQuantifiable = !lookbehind;
+ return true
+ }
+ }
+
+ state.pos = start;
+ return false
+ };
+
+ // https://www.ecma-international.org/ecma-262/8.0/#prod-Quantifier
+ pp$1.regexp_eatQuantifier = function(state, noError) {
+ if ( noError === void 0 ) noError = false;
+
+ if (this.regexp_eatQuantifierPrefix(state, noError)) {
+ state.eat(0x3F /* ? */);
+ return true
+ }
+ return false
+ };
+
+ // https://www.ecma-international.org/ecma-262/8.0/#prod-QuantifierPrefix
+ pp$1.regexp_eatQuantifierPrefix = function(state, noError) {
+ return (
+ state.eat(0x2A /* * */) ||
+ state.eat(0x2B /* + */) ||
+ state.eat(0x3F /* ? */) ||
+ this.regexp_eatBracedQuantifier(state, noError)
+ )
+ };
+ pp$1.regexp_eatBracedQuantifier = function(state, noError) {
+ var start = state.pos;
+ if (state.eat(0x7B /* { */)) {
+ var min = 0, max = -1;
+ if (this.regexp_eatDecimalDigits(state)) {
+ min = state.lastIntValue;
+ if (state.eat(0x2C /* , */) && this.regexp_eatDecimalDigits(state)) {
+ max = state.lastIntValue;
+ }
+ if (state.eat(0x7D /* } */)) {
+ // SyntaxError in https://www.ecma-international.org/ecma-262/8.0/#sec-term
+ if (max !== -1 && max < min && !noError) {
+ state.raise("numbers out of order in {} quantifier");
+ }
+ return true
+ }
+ }
+ if (state.switchU && !noError) {
+ state.raise("Incomplete quantifier");
+ }
+ state.pos = start;
+ }
+ return false
+ };
+
+ // https://www.ecma-international.org/ecma-262/8.0/#prod-Atom
+ pp$1.regexp_eatAtom = function(state) {
+ return (
+ this.regexp_eatPatternCharacters(state) ||
+ state.eat(0x2E /* . */) ||
+ this.regexp_eatReverseSolidusAtomEscape(state) ||
+ this.regexp_eatCharacterClass(state) ||
+ this.regexp_eatUncapturingGroup(state) ||
+ this.regexp_eatCapturingGroup(state)
+ )
+ };
+ pp$1.regexp_eatReverseSolidusAtomEscape = function(state) {
+ var start = state.pos;
+ if (state.eat(0x5C /* \ */)) {
+ if (this.regexp_eatAtomEscape(state)) {
+ return true
+ }
+ state.pos = start;
+ }
+ return false
+ };
+ pp$1.regexp_eatUncapturingGroup = function(state) {
+ var start = state.pos;
+ if (state.eat(0x28 /* ( */)) {
+ if (state.eat(0x3F /* ? */) && state.eat(0x3A /* : */)) {
+ this.regexp_disjunction(state);
+ if (state.eat(0x29 /* ) */)) {
+ return true
+ }
+ state.raise("Unterminated group");
+ }
+ state.pos = start;
+ }
+ return false
+ };
+ pp$1.regexp_eatCapturingGroup = function(state) {
+ if (state.eat(0x28 /* ( */)) {
+ if (this.options.ecmaVersion >= 9) {
+ this.regexp_groupSpecifier(state);
+ } else if (state.current() === 0x3F /* ? */) {
+ state.raise("Invalid group");
+ }
+ this.regexp_disjunction(state);
+ if (state.eat(0x29 /* ) */)) {
+ state.numCapturingParens += 1;
+ return true
+ }
+ state.raise("Unterminated group");
+ }
+ return false
+ };
+
+ // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ExtendedAtom
+ pp$1.regexp_eatExtendedAtom = function(state) {
+ return (
+ state.eat(0x2E /* . */) ||
+ this.regexp_eatReverseSolidusAtomEscape(state) ||
+ this.regexp_eatCharacterClass(state) ||
+ this.regexp_eatUncapturingGroup(state) ||
+ this.regexp_eatCapturingGroup(state) ||
+ this.regexp_eatInvalidBracedQuantifier(state) ||
+ this.regexp_eatExtendedPatternCharacter(state)
+ )
+ };
+
+ // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-InvalidBracedQuantifier
+ pp$1.regexp_eatInvalidBracedQuantifier = function(state) {
+ if (this.regexp_eatBracedQuantifier(state, true)) {
+ state.raise("Nothing to repeat");
+ }
+ return false
+ };
+
+ // https://www.ecma-international.org/ecma-262/8.0/#prod-SyntaxCharacter
+ pp$1.regexp_eatSyntaxCharacter = function(state) {
+ var ch = state.current();
+ if (isSyntaxCharacter(ch)) {
+ state.lastIntValue = ch;
+ state.advance();
+ return true
+ }
+ return false
+ };
+ function isSyntaxCharacter(ch) {
+ return (
+ ch === 0x24 /* $ */ ||
+ ch >= 0x28 /* ( */ && ch <= 0x2B /* + */ ||
+ ch === 0x2E /* . */ ||
+ ch === 0x3F /* ? */ ||
+ ch >= 0x5B /* [ */ && ch <= 0x5E /* ^ */ ||
+ ch >= 0x7B /* { */ && ch <= 0x7D /* } */
+ )
+ }
+
+ // https://www.ecma-international.org/ecma-262/8.0/#prod-PatternCharacter
+ // But eat eager.
+ pp$1.regexp_eatPatternCharacters = function(state) {
+ var start = state.pos;
+ var ch = 0;
+ while ((ch = state.current()) !== -1 && !isSyntaxCharacter(ch)) {
+ state.advance();
+ }
+ return state.pos !== start
+ };
+
+ // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ExtendedPatternCharacter
+ pp$1.regexp_eatExtendedPatternCharacter = function(state) {
+ var ch = state.current();
+ if (
+ ch !== -1 &&
+ ch !== 0x24 /* $ */ &&
+ !(ch >= 0x28 /* ( */ && ch <= 0x2B /* + */) &&
+ ch !== 0x2E /* . */ &&
+ ch !== 0x3F /* ? */ &&
+ ch !== 0x5B /* [ */ &&
+ ch !== 0x5E /* ^ */ &&
+ ch !== 0x7C /* | */
+ ) {
+ state.advance();
+ return true
+ }
+ return false
+ };
+
+ // GroupSpecifier ::
+ // [empty]
+ // `?` GroupName
+ pp$1.regexp_groupSpecifier = function(state) {
+ if (state.eat(0x3F /* ? */)) {
+ if (this.regexp_eatGroupName(state)) {
+ if (state.groupNames.indexOf(state.lastStringValue) !== -1) {
+ state.raise("Duplicate capture group name");
+ }
+ state.groupNames.push(state.lastStringValue);
+ return
+ }
+ state.raise("Invalid group");
+ }
+ };
+
+ // GroupName ::
+ // `<` RegExpIdentifierName `>`
+ // Note: this updates `state.lastStringValue` property with the eaten name.
+ pp$1.regexp_eatGroupName = function(state) {
+ state.lastStringValue = "";
+ if (state.eat(0x3C /* < */)) {
+ if (this.regexp_eatRegExpIdentifierName(state) && state.eat(0x3E /* > */)) {
+ return true
+ }
+ state.raise("Invalid capture group name");
+ }
+ return false
+ };
+
+ // RegExpIdentifierName ::
+ // RegExpIdentifierStart
+ // RegExpIdentifierName RegExpIdentifierPart
+ // Note: this updates `state.lastStringValue` property with the eaten name.
+ pp$1.regexp_eatRegExpIdentifierName = function(state) {
+ state.lastStringValue = "";
+ if (this.regexp_eatRegExpIdentifierStart(state)) {
+ state.lastStringValue += codePointToString(state.lastIntValue);
+ while (this.regexp_eatRegExpIdentifierPart(state)) {
+ state.lastStringValue += codePointToString(state.lastIntValue);
+ }
+ return true
+ }
+ return false
+ };
+
+ // RegExpIdentifierStart ::
+ // UnicodeIDStart
+ // `$`
+ // `_`
+ // `\` RegExpUnicodeEscapeSequence[+U]
+ pp$1.regexp_eatRegExpIdentifierStart = function(state) {
+ var start = state.pos;
+ var forceU = this.options.ecmaVersion >= 11;
+ var ch = state.current(forceU);
+ state.advance(forceU);
+
+ if (ch === 0x5C /* \ */ && this.regexp_eatRegExpUnicodeEscapeSequence(state, forceU)) {
+ ch = state.lastIntValue;
+ }
+ if (isRegExpIdentifierStart(ch)) {
+ state.lastIntValue = ch;
+ return true
+ }
+
+ state.pos = start;
+ return false
+ };
+ function isRegExpIdentifierStart(ch) {
+ return isIdentifierStart(ch, true) || ch === 0x24 /* $ */ || ch === 0x5F /* _ */
+ }
+
+ // RegExpIdentifierPart ::
+ // UnicodeIDContinue
+ // `$`
+ // `_`
+ // `\` RegExpUnicodeEscapeSequence[+U]
+ // <ZWNJ>
+ // <ZWJ>
+ pp$1.regexp_eatRegExpIdentifierPart = function(state) {
+ var start = state.pos;
+ var forceU = this.options.ecmaVersion >= 11;
+ var ch = state.current(forceU);
+ state.advance(forceU);
+
+ if (ch === 0x5C /* \ */ && this.regexp_eatRegExpUnicodeEscapeSequence(state, forceU)) {
+ ch = state.lastIntValue;
+ }
+ if (isRegExpIdentifierPart(ch)) {
+ state.lastIntValue = ch;
+ return true
+ }
+
+ state.pos = start;
+ return false
+ };
+ function isRegExpIdentifierPart(ch) {
+ return isIdentifierChar(ch, true) || ch === 0x24 /* $ */ || ch === 0x5F /* _ */ || ch === 0x200C /* <ZWNJ> */ || ch === 0x200D /* <ZWJ> */
+ }
+
+ // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-AtomEscape
+ pp$1.regexp_eatAtomEscape = function(state) {
+ if (
+ this.regexp_eatBackReference(state) ||
+ this.regexp_eatCharacterClassEscape(state) ||
+ this.regexp_eatCharacterEscape(state) ||
+ (state.switchN && this.regexp_eatKGroupName(state))
+ ) {
+ return true
+ }
+ if (state.switchU) {
+ // Make the same message as V8.
+ if (state.current() === 0x63 /* c */) {
+ state.raise("Invalid unicode escape");
+ }
+ state.raise("Invalid escape");
+ }
+ return false
+ };
+ pp$1.regexp_eatBackReference = function(state) {
+ var start = state.pos;
+ if (this.regexp_eatDecimalEscape(state)) {
+ var n = state.lastIntValue;
+ if (state.switchU) {
+ // For SyntaxError in https://www.ecma-international.org/ecma-262/8.0/#sec-atomescape
+ if (n > state.maxBackReference) {
+ state.maxBackReference = n;
+ }
+ return true
+ }
+ if (n <= state.numCapturingParens) {
+ return true
+ }
+ state.pos = start;
+ }
+ return false
+ };
+ pp$1.regexp_eatKGroupName = function(state) {
+ if (state.eat(0x6B /* k */)) {
+ if (this.regexp_eatGroupName(state)) {
+ state.backReferenceNames.push(state.lastStringValue);
+ return true
+ }
+ state.raise("Invalid named reference");
+ }
+ return false
+ };
+
+ // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-CharacterEscape
+ pp$1.regexp_eatCharacterEscape = function(state) {
+ return (
+ this.regexp_eatControlEscape(state) ||
+ this.regexp_eatCControlLetter(state) ||
+ this.regexp_eatZero(state) ||
+ this.regexp_eatHexEscapeSequence(state) ||
+ this.regexp_eatRegExpUnicodeEscapeSequence(state, false) ||
+ (!state.switchU && this.regexp_eatLegacyOctalEscapeSequence(state)) ||
+ this.regexp_eatIdentityEscape(state)
+ )
+ };
+ pp$1.regexp_eatCControlLetter = function(state) {
+ var start = state.pos;
+ if (state.eat(0x63 /* c */)) {
+ if (this.regexp_eatControlLetter(state)) {
+ return true
+ }
+ state.pos = start;
+ }
+ return false
+ };
+ pp$1.regexp_eatZero = function(state) {
+ if (state.current() === 0x30 /* 0 */ && !isDecimalDigit(state.lookahead())) {
+ state.lastIntValue = 0;
+ state.advance();
+ return true
+ }
+ return false
+ };
+
+ // https://www.ecma-international.org/ecma-262/8.0/#prod-ControlEscape
+ pp$1.regexp_eatControlEscape = function(state) {
+ var ch = state.current();
+ if (ch === 0x74 /* t */) {
+ state.lastIntValue = 0x09; /* \t */
+ state.advance();
+ return true
+ }
+ if (ch === 0x6E /* n */) {
+ state.lastIntValue = 0x0A; /* \n */
+ state.advance();
+ return true
+ }
+ if (ch === 0x76 /* v */) {
+ state.lastIntValue = 0x0B; /* \v */
+ state.advance();
+ return true
+ }
+ if (ch === 0x66 /* f */) {
+ state.lastIntValue = 0x0C; /* \f */
+ state.advance();
+ return true
+ }
+ if (ch === 0x72 /* r */) {
+ state.lastIntValue = 0x0D; /* \r */
+ state.advance();
+ return true
+ }
+ return false
+ };
+
+ // https://www.ecma-international.org/ecma-262/8.0/#prod-ControlLetter
+ pp$1.regexp_eatControlLetter = function(state) {
+ var ch = state.current();
+ if (isControlLetter(ch)) {
+ state.lastIntValue = ch % 0x20;
+ state.advance();
+ return true
+ }
+ return false
+ };
+ function isControlLetter(ch) {
+ return (
+ (ch >= 0x41 /* A */ && ch <= 0x5A /* Z */) ||
+ (ch >= 0x61 /* a */ && ch <= 0x7A /* z */)
+ )
+ }
+
+ // https://www.ecma-international.org/ecma-262/8.0/#prod-RegExpUnicodeEscapeSequence
+ pp$1.regexp_eatRegExpUnicodeEscapeSequence = function(state, forceU) {
+ if ( forceU === void 0 ) forceU = false;
+
+ var start = state.pos;
+ var switchU = forceU || state.switchU;
+
+ if (state.eat(0x75 /* u */)) {
+ if (this.regexp_eatFixedHexDigits(state, 4)) {
+ var lead = state.lastIntValue;
+ if (switchU && lead >= 0xD800 && lead <= 0xDBFF) {
+ var leadSurrogateEnd = state.pos;
+ if (state.eat(0x5C /* \ */) && state.eat(0x75 /* u */) && this.regexp_eatFixedHexDigits(state, 4)) {
+ var trail = state.lastIntValue;
+ if (trail >= 0xDC00 && trail <= 0xDFFF) {
+ state.lastIntValue = (lead - 0xD800) * 0x400 + (trail - 0xDC00) + 0x10000;
+ return true
+ }
+ }
+ state.pos = leadSurrogateEnd;
+ state.lastIntValue = lead;
+ }
+ return true
+ }
+ if (
+ switchU &&
+ state.eat(0x7B /* { */) &&
+ this.regexp_eatHexDigits(state) &&
+ state.eat(0x7D /* } */) &&
+ isValidUnicode(state.lastIntValue)
+ ) {
+ return true
+ }
+ if (switchU) {
+ state.raise("Invalid unicode escape");
+ }
+ state.pos = start;
+ }
+
+ return false
+ };
+ function isValidUnicode(ch) {
+ return ch >= 0 && ch <= 0x10FFFF
+ }
+
+ // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-IdentityEscape
+ pp$1.regexp_eatIdentityEscape = function(state) {
+ if (state.switchU) {
+ if (this.regexp_eatSyntaxCharacter(state)) {
+ return true
+ }
+ if (state.eat(0x2F /* / */)) {
+ state.lastIntValue = 0x2F; /* / */
+ return true
+ }
+ return false
+ }
+
+ var ch = state.current();
+ if (ch !== 0x63 /* c */ && (!state.switchN || ch !== 0x6B /* k */)) {
+ state.lastIntValue = ch;
+ state.advance();
+ return true
+ }
+
+ return false
+ };
+
+ // https://www.ecma-international.org/ecma-262/8.0/#prod-DecimalEscape
+ pp$1.regexp_eatDecimalEscape = function(state) {
+ state.lastIntValue = 0;
+ var ch = state.current();
+ if (ch >= 0x31 /* 1 */ && ch <= 0x39 /* 9 */) {
+ do {
+ state.lastIntValue = 10 * state.lastIntValue + (ch - 0x30 /* 0 */);
+ state.advance();
+ } while ((ch = state.current()) >= 0x30 /* 0 */ && ch <= 0x39 /* 9 */)
+ return true
+ }
+ return false
+ };
+
+ // https://www.ecma-international.org/ecma-262/8.0/#prod-CharacterClassEscape
+ pp$1.regexp_eatCharacterClassEscape = function(state) {
+ var ch = state.current();
+
+ if (isCharacterClassEscape(ch)) {
+ state.lastIntValue = -1;
+ state.advance();
+ return true
+ }
+
+ if (
+ state.switchU &&
+ this.options.ecmaVersion >= 9 &&
+ (ch === 0x50 /* P */ || ch === 0x70 /* p */)
+ ) {
+ state.lastIntValue = -1;
+ state.advance();
+ if (
+ state.eat(0x7B /* { */) &&
+ this.regexp_eatUnicodePropertyValueExpression(state) &&
+ state.eat(0x7D /* } */)
+ ) {
+ return true
+ }
+ state.raise("Invalid property name");
+ }
+
+ return false
+ };
+ function isCharacterClassEscape(ch) {
+ return (
+ ch === 0x64 /* d */ ||
+ ch === 0x44 /* D */ ||
+ ch === 0x73 /* s */ ||
+ ch === 0x53 /* S */ ||
+ ch === 0x77 /* w */ ||
+ ch === 0x57 /* W */
+ )
+ }
+
+ // UnicodePropertyValueExpression ::
+ // UnicodePropertyName `=` UnicodePropertyValue
+ // LoneUnicodePropertyNameOrValue
+ pp$1.regexp_eatUnicodePropertyValueExpression = function(state) {
+ var start = state.pos;
+
+ // UnicodePropertyName `=` UnicodePropertyValue
+ if (this.regexp_eatUnicodePropertyName(state) && state.eat(0x3D /* = */)) {
+ var name = state.lastStringValue;
+ if (this.regexp_eatUnicodePropertyValue(state)) {
+ var value = state.lastStringValue;
+ this.regexp_validateUnicodePropertyNameAndValue(state, name, value);
+ return true
+ }
+ }
+ state.pos = start;
+
+ // LoneUnicodePropertyNameOrValue
+ if (this.regexp_eatLoneUnicodePropertyNameOrValue(state)) {
+ var nameOrValue = state.lastStringValue;
+ this.regexp_validateUnicodePropertyNameOrValue(state, nameOrValue);
+ return true
+ }
+ return false
+ };
+ pp$1.regexp_validateUnicodePropertyNameAndValue = function(state, name, value) {
+ if (!hasOwn(state.unicodeProperties.nonBinary, name))
+ { state.raise("Invalid property name"); }
+ if (!state.unicodeProperties.nonBinary[name].test(value))
+ { state.raise("Invalid property value"); }
+ };
+ pp$1.regexp_validateUnicodePropertyNameOrValue = function(state, nameOrValue) {
+ if (!state.unicodeProperties.binary.test(nameOrValue))
+ { state.raise("Invalid property name"); }
+ };
+
+ // UnicodePropertyName ::
+ // UnicodePropertyNameCharacters
+ pp$1.regexp_eatUnicodePropertyName = function(state) {
+ var ch = 0;
+ state.lastStringValue = "";
+ while (isUnicodePropertyNameCharacter(ch = state.current())) {
+ state.lastStringValue += codePointToString(ch);
+ state.advance();
+ }
+ return state.lastStringValue !== ""
+ };
+ function isUnicodePropertyNameCharacter(ch) {
+ return isControlLetter(ch) || ch === 0x5F /* _ */
+ }
+
+ // UnicodePropertyValue ::
+ // UnicodePropertyValueCharacters
+ pp$1.regexp_eatUnicodePropertyValue = function(state) {
+ var ch = 0;
+ state.lastStringValue = "";
+ while (isUnicodePropertyValueCharacter(ch = state.current())) {
+ state.lastStringValue += codePointToString(ch);
+ state.advance();
+ }
+ return state.lastStringValue !== ""
+ };
+ function isUnicodePropertyValueCharacter(ch) {
+ return isUnicodePropertyNameCharacter(ch) || isDecimalDigit(ch)
+ }
+
+ // LoneUnicodePropertyNameOrValue ::
+ // UnicodePropertyValueCharacters
+ pp$1.regexp_eatLoneUnicodePropertyNameOrValue = function(state) {
+ return this.regexp_eatUnicodePropertyValue(state)
+ };
+
+ // https://www.ecma-international.org/ecma-262/8.0/#prod-CharacterClass
+ pp$1.regexp_eatCharacterClass = function(state) {
+ if (state.eat(0x5B /* [ */)) {
+ state.eat(0x5E /* ^ */);
+ this.regexp_classRanges(state);
+ if (state.eat(0x5D /* ] */)) {
+ return true
+ }
+ // Unreachable since it threw "unterminated regular expression" error before.
+ state.raise("Unterminated character class");
+ }
+ return false
+ };
+
+ // https://www.ecma-international.org/ecma-262/8.0/#prod-ClassRanges
+ // https://www.ecma-international.org/ecma-262/8.0/#prod-NonemptyClassRanges
+ // https://www.ecma-international.org/ecma-262/8.0/#prod-NonemptyClassRangesNoDash
+ pp$1.regexp_classRanges = function(state) {
+ while (this.regexp_eatClassAtom(state)) {
+ var left = state.lastIntValue;
+ if (state.eat(0x2D /* - */) && this.regexp_eatClassAtom(state)) {
+ var right = state.lastIntValue;
+ if (state.switchU && (left === -1 || right === -1)) {
+ state.raise("Invalid character class");
+ }
+ if (left !== -1 && right !== -1 && left > right) {
+ state.raise("Range out of order in character class");
+ }
+ }
+ }
+ };
+
+ // https://www.ecma-international.org/ecma-262/8.0/#prod-ClassAtom
+ // https://www.ecma-international.org/ecma-262/8.0/#prod-ClassAtomNoDash
+ pp$1.regexp_eatClassAtom = function(state) {
+ var start = state.pos;
+
+ if (state.eat(0x5C /* \ */)) {
+ if (this.regexp_eatClassEscape(state)) {
+ return true
+ }
+ if (state.switchU) {
+ // Make the same message as V8.
+ var ch$1 = state.current();
+ if (ch$1 === 0x63 /* c */ || isOctalDigit(ch$1)) {
+ state.raise("Invalid class escape");
+ }
+ state.raise("Invalid escape");
+ }
+ state.pos = start;
+ }
+
+ var ch = state.current();
+ if (ch !== 0x5D /* ] */) {
+ state.lastIntValue = ch;
+ state.advance();
+ return true
+ }
+
+ return false
+ };
+
+ // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ClassEscape
+ pp$1.regexp_eatClassEscape = function(state) {
+ var start = state.pos;
+
+ if (state.eat(0x62 /* b */)) {
+ state.lastIntValue = 0x08; /* <BS> */
+ return true
+ }
+
+ if (state.switchU && state.eat(0x2D /* - */)) {
+ state.lastIntValue = 0x2D; /* - */
+ return true
+ }
+
+ if (!state.switchU && state.eat(0x63 /* c */)) {
+ if (this.regexp_eatClassControlLetter(state)) {
+ return true
+ }
+ state.pos = start;
+ }
+
+ return (
+ this.regexp_eatCharacterClassEscape(state) ||
+ this.regexp_eatCharacterEscape(state)
+ )
+ };
+
+ // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-ClassControlLetter
+ pp$1.regexp_eatClassControlLetter = function(state) {
+ var ch = state.current();
+ if (isDecimalDigit(ch) || ch === 0x5F /* _ */) {
+ state.lastIntValue = ch % 0x20;
+ state.advance();
+ return true
+ }
+ return false
+ };
+
+ // https://www.ecma-international.org/ecma-262/8.0/#prod-HexEscapeSequence
+ pp$1.regexp_eatHexEscapeSequence = function(state) {
+ var start = state.pos;
+ if (state.eat(0x78 /* x */)) {
+ if (this.regexp_eatFixedHexDigits(state, 2)) {
+ return true
+ }
+ if (state.switchU) {
+ state.raise("Invalid escape");
+ }
+ state.pos = start;
+ }
+ return false
+ };
+
+ // https://www.ecma-international.org/ecma-262/8.0/#prod-DecimalDigits
+ pp$1.regexp_eatDecimalDigits = function(state) {
+ var start = state.pos;
+ var ch = 0;
+ state.lastIntValue = 0;
+ while (isDecimalDigit(ch = state.current())) {
+ state.lastIntValue = 10 * state.lastIntValue + (ch - 0x30 /* 0 */);
+ state.advance();
+ }
+ return state.pos !== start
+ };
+ function isDecimalDigit(ch) {
+ return ch >= 0x30 /* 0 */ && ch <= 0x39 /* 9 */
+ }
+
+ // https://www.ecma-international.org/ecma-262/8.0/#prod-HexDigits
+ pp$1.regexp_eatHexDigits = function(state) {
+ var start = state.pos;
+ var ch = 0;
+ state.lastIntValue = 0;
+ while (isHexDigit(ch = state.current())) {
+ state.lastIntValue = 16 * state.lastIntValue + hexToInt(ch);
+ state.advance();
+ }
+ return state.pos !== start
+ };
+ function isHexDigit(ch) {
+ return (
+ (ch >= 0x30 /* 0 */ && ch <= 0x39 /* 9 */) ||
+ (ch >= 0x41 /* A */ && ch <= 0x46 /* F */) ||
+ (ch >= 0x61 /* a */ && ch <= 0x66 /* f */)
+ )
+ }
+ function hexToInt(ch) {
+ if (ch >= 0x41 /* A */ && ch <= 0x46 /* F */) {
+ return 10 + (ch - 0x41 /* A */)
+ }
+ if (ch >= 0x61 /* a */ && ch <= 0x66 /* f */) {
+ return 10 + (ch - 0x61 /* a */)
+ }
+ return ch - 0x30 /* 0 */
+ }
+
+ // https://www.ecma-international.org/ecma-262/8.0/#prod-annexB-LegacyOctalEscapeSequence
+ // Allows only 0-377(octal) i.e. 0-255(decimal).
+ pp$1.regexp_eatLegacyOctalEscapeSequence = function(state) {
+ if (this.regexp_eatOctalDigit(state)) {
+ var n1 = state.lastIntValue;
+ if (this.regexp_eatOctalDigit(state)) {
+ var n2 = state.lastIntValue;
+ if (n1 <= 3 && this.regexp_eatOctalDigit(state)) {
+ state.lastIntValue = n1 * 64 + n2 * 8 + state.lastIntValue;
+ } else {
+ state.lastIntValue = n1 * 8 + n2;
+ }
+ } else {
+ state.lastIntValue = n1;
+ }
+ return true
+ }
+ return false
+ };
+
+ // https://www.ecma-international.org/ecma-262/8.0/#prod-OctalDigit
+ pp$1.regexp_eatOctalDigit = function(state) {
+ var ch = state.current();
+ if (isOctalDigit(ch)) {
+ state.lastIntValue = ch - 0x30; /* 0 */
+ state.advance();
+ return true
+ }
+ state.lastIntValue = 0;
+ return false
+ };
+ function isOctalDigit(ch) {
+ return ch >= 0x30 /* 0 */ && ch <= 0x37 /* 7 */
+ }
+
+ // https://www.ecma-international.org/ecma-262/8.0/#prod-Hex4Digits
+ // https://www.ecma-international.org/ecma-262/8.0/#prod-HexDigit
+ // And HexDigit HexDigit in https://www.ecma-international.org/ecma-262/8.0/#prod-HexEscapeSequence
+ pp$1.regexp_eatFixedHexDigits = function(state, length) {
+ var start = state.pos;
+ state.lastIntValue = 0;
+ for (var i = 0; i < length; ++i) {
+ var ch = state.current();
+ if (!isHexDigit(ch)) {
+ state.pos = start;
+ return false
+ }
+ state.lastIntValue = 16 * state.lastIntValue + hexToInt(ch);
+ state.advance();
+ }
+ return true
+ };
+
+ // Object type used to represent tokens. Note that normally, tokens
+ // simply exist as properties on the parser object. This is only
+ // used for the onToken callback and the external tokenizer.
+
+ var Token = function Token(p) {
+ this.type = p.type;
+ this.value = p.value;
+ this.start = p.start;
+ this.end = p.end;
+ if (p.options.locations)
+ { this.loc = new SourceLocation(p, p.startLoc, p.endLoc); }
+ if (p.options.ranges)
+ { this.range = [p.start, p.end]; }
+ };
+
+ // ## Tokenizer
+
+ var pp = Parser.prototype;
+
+ // Move to the next token
+
+ pp.next = function(ignoreEscapeSequenceInKeyword) {
+ if (!ignoreEscapeSequenceInKeyword && this.type.keyword && this.containsEsc)
+ { this.raiseRecoverable(this.start, "Escape sequence in keyword " + this.type.keyword); }
+ if (this.options.onToken)
+ { this.options.onToken(new Token(this)); }
+
+ this.lastTokEnd = this.end;
+ this.lastTokStart = this.start;
+ this.lastTokEndLoc = this.endLoc;
+ this.lastTokStartLoc = this.startLoc;
+ this.nextToken();
+ };
+
+ pp.getToken = function() {
+ this.next();
+ return new Token(this)
+ };
+
+ // If we're in an ES6 environment, make parsers iterable
+ if (typeof Symbol !== "undefined")
+ { pp[Symbol.iterator] = function() {
+ var this$1$1 = this;
+
+ return {
+ next: function () {
+ var token = this$1$1.getToken();
+ return {
+ done: token.type === types$1.eof,
+ value: token
+ }
+ }
+ }
+ }; }
+
+ // Toggle strict mode. Re-reads the next number or string to please
+ // pedantic tests (`"use strict"; 010;` should fail).
+
+ // Read a single token, updating the parser object's token-related
+ // properties.
+
+ pp.nextToken = function() {
+ var curContext = this.curContext();
+ if (!curContext || !curContext.preserveSpace) { this.skipSpace(); }
+
+ this.start = this.pos;
+ if (this.options.locations) { this.startLoc = this.curPosition(); }
+ if (this.pos >= this.input.length) { return this.finishToken(types$1.eof) }
+
+ if (curContext.override) { return curContext.override(this) }
+ else { this.readToken(this.fullCharCodeAtPos()); }
+ };
+
+ pp.readToken = function(code) {
+ // Identifier or keyword. '\uXXXX' sequences are allowed in
+ // identifiers, so '\' also dispatches to that.
+ if (isIdentifierStart(code, this.options.ecmaVersion >= 6) || code === 92 /* '\' */)
+ { return this.readWord() }
+
+ return this.getTokenFromCode(code)
+ };
+
+ pp.fullCharCodeAtPos = function() {
+ var code = this.input.charCodeAt(this.pos);
+ if (code <= 0xd7ff || code >= 0xdc00) { return code }
+ var next = this.input.charCodeAt(this.pos + 1);
+ return next <= 0xdbff || next >= 0xe000 ? code : (code << 10) + next - 0x35fdc00
+ };
+
+ pp.skipBlockComment = function() {
+ var startLoc = this.options.onComment && this.curPosition();
+ var start = this.pos, end = this.input.indexOf("*/", this.pos += 2);
+ if (end === -1) { this.raise(this.pos - 2, "Unterminated comment"); }
+ this.pos = end + 2;
+ if (this.options.locations) {
+ for (var nextBreak = (void 0), pos = start; (nextBreak = nextLineBreak(this.input, pos, this.pos)) > -1;) {
+ ++this.curLine;
+ pos = this.lineStart = nextBreak;
+ }
+ }
+ if (this.options.onComment)
+ { this.options.onComment(true, this.input.slice(start + 2, end), start, this.pos,
+ startLoc, this.curPosition()); }
+ };
+
+ pp.skipLineComment = function(startSkip) {
+ var start = this.pos;
+ var startLoc = this.options.onComment && this.curPosition();
+ var ch = this.input.charCodeAt(this.pos += startSkip);
+ while (this.pos < this.input.length && !isNewLine(ch)) {
+ ch = this.input.charCodeAt(++this.pos);
+ }
+ if (this.options.onComment)
+ { this.options.onComment(false, this.input.slice(start + startSkip, this.pos), start, this.pos,
+ startLoc, this.curPosition()); }
+ };
+
+ // Called at the start of the parse and after every token. Skips
+ // whitespace and comments, and.
+
+ pp.skipSpace = function() {
+ loop: while (this.pos < this.input.length) {
+ var ch = this.input.charCodeAt(this.pos);
+ switch (ch) {
+ case 32: case 160: // ' '
+ ++this.pos;
+ break
+ case 13:
+ if (this.input.charCodeAt(this.pos + 1) === 10) {
+ ++this.pos;
+ }
+ case 10: case 8232: case 8233:
+ ++this.pos;
+ if (this.options.locations) {
+ ++this.curLine;
+ this.lineStart = this.pos;
+ }
+ break
+ case 47: // '/'
+ switch (this.input.charCodeAt(this.pos + 1)) {
+ case 42: // '*'
+ this.skipBlockComment();
+ break
+ case 47:
+ this.skipLineComment(2);
+ break
+ default:
+ break loop
+ }
+ break
+ default:
+ if (ch > 8 && ch < 14 || ch >= 5760 && nonASCIIwhitespace.test(String.fromCharCode(ch))) {
+ ++this.pos;
+ } else {
+ break loop
+ }
+ }
+ }
+ };
+
+ // Called at the end of every token. Sets `end`, `val`, and
+ // maintains `context` and `exprAllowed`, and skips the space after
+ // the token, so that the next one's `start` will point at the
+ // right position.
+
+ pp.finishToken = function(type, val) {
+ this.end = this.pos;
+ if (this.options.locations) { this.endLoc = this.curPosition(); }
+ var prevType = this.type;
+ this.type = type;
+ this.value = val;
+
+ this.updateContext(prevType);
+ };
+
+ // ### Token reading
+
+ // This is the function that is called to fetch the next token. It
+ // is somewhat obscure, because it works in character codes rather
+ // than characters, and because operator parsing has been inlined
+ // into it.
+ //
+ // All in the name of speed.
+ //
+ pp.readToken_dot = function() {
+ var next = this.input.charCodeAt(this.pos + 1);
+ if (next >= 48 && next <= 57) { return this.readNumber(true) }
+ var next2 = this.input.charCodeAt(this.pos + 2);
+ if (this.options.ecmaVersion >= 6 && next === 46 && next2 === 46) { // 46 = dot '.'
+ this.pos += 3;
+ return this.finishToken(types$1.ellipsis)
+ } else {
+ ++this.pos;
+ return this.finishToken(types$1.dot)
+ }
+ };
+
+ pp.readToken_slash = function() { // '/'
+ var next = this.input.charCodeAt(this.pos + 1);
+ if (this.exprAllowed) { ++this.pos; return this.readRegexp() }
+ if (next === 61) { return this.finishOp(types$1.assign, 2) }
+ return this.finishOp(types$1.slash, 1)
+ };
+
+ pp.readToken_mult_modulo_exp = function(code) { // '%*'
+ var next = this.input.charCodeAt(this.pos + 1);
+ var size = 1;
+ var tokentype = code === 42 ? types$1.star : types$1.modulo;
+
+ // exponentiation operator ** and **=
+ if (this.options.ecmaVersion >= 7 && code === 42 && next === 42) {
+ ++size;
+ tokentype = types$1.starstar;
+ next = this.input.charCodeAt(this.pos + 2);
+ }
+
+ if (next === 61) { return this.finishOp(types$1.assign, size + 1) }
+ return this.finishOp(tokentype, size)
+ };
+
+ pp.readToken_pipe_amp = function(code) { // '|&'
+ var next = this.input.charCodeAt(this.pos + 1);
+ if (next === code) {
+ if (this.options.ecmaVersion >= 12) {
+ var next2 = this.input.charCodeAt(this.pos + 2);
+ if (next2 === 61) { return this.finishOp(types$1.assign, 3) }
+ }
+ return this.finishOp(code === 124 ? types$1.logicalOR : types$1.logicalAND, 2)
+ }
+ if (next === 61) { return this.finishOp(types$1.assign, 2) }
+ return this.finishOp(code === 124 ? types$1.bitwiseOR : types$1.bitwiseAND, 1)
+ };
+
+ pp.readToken_caret = function() { // '^'
+ var next = this.input.charCodeAt(this.pos + 1);
+ if (next === 61) { return this.finishOp(types$1.assign, 2) }
+ return this.finishOp(types$1.bitwiseXOR, 1)
+ };
+
+ pp.readToken_plus_min = function(code) { // '+-'
+ var next = this.input.charCodeAt(this.pos + 1);
+ if (next === code) {
+ if (next === 45 && !this.inModule && this.input.charCodeAt(this.pos + 2) === 62 &&
+ (this.lastTokEnd === 0 || lineBreak.test(this.input.slice(this.lastTokEnd, this.pos)))) {
+ // A `-->` line comment
+ this.skipLineComment(3);
+ this.skipSpace();
+ return this.nextToken()
+ }
+ return this.finishOp(types$1.incDec, 2)
+ }
+ if (next === 61) { return this.finishOp(types$1.assign, 2) }
+ return this.finishOp(types$1.plusMin, 1)
+ };
+
+ pp.readToken_lt_gt = function(code) { // '<>'
+ var next = this.input.charCodeAt(this.pos + 1);
+ var size = 1;
+ if (next === code) {
+ size = code === 62 && this.input.charCodeAt(this.pos + 2) === 62 ? 3 : 2;
+ if (this.input.charCodeAt(this.pos + size) === 61) { return this.finishOp(types$1.assign, size + 1) }
+ return this.finishOp(types$1.bitShift, size)
+ }
+ if (next === 33 && code === 60 && !this.inModule && this.input.charCodeAt(this.pos + 2) === 45 &&
+ this.input.charCodeAt(this.pos + 3) === 45) {
+ // `<!--`, an XML-style comment that should be interpreted as a line comment
+ this.skipLineComment(4);
+ this.skipSpace();
+ return this.nextToken()
+ }
+ if (next === 61) { size = 2; }
+ return this.finishOp(types$1.relational, size)
+ };
+
+ pp.readToken_eq_excl = function(code) { // '=!'
+ var next = this.input.charCodeAt(this.pos + 1);
+ if (next === 61) { return this.finishOp(types$1.equality, this.input.charCodeAt(this.pos + 2) === 61 ? 3 : 2) }
+ if (code === 61 && next === 62 && this.options.ecmaVersion >= 6) { // '=>'
+ this.pos += 2;
+ return this.finishToken(types$1.arrow)
+ }
+ return this.finishOp(code === 61 ? types$1.eq : types$1.prefix, 1)
+ };
+
+ pp.readToken_question = function() { // '?'
+ var ecmaVersion = this.options.ecmaVersion;
+ if (ecmaVersion >= 11) {
+ var next = this.input.charCodeAt(this.pos + 1);
+ if (next === 46) {
+ var next2 = this.input.charCodeAt(this.pos + 2);
+ if (next2 < 48 || next2 > 57) { return this.finishOp(types$1.questionDot, 2) }
+ }
+ if (next === 63) {
+ if (ecmaVersion >= 12) {
+ var next2$1 = this.input.charCodeAt(this.pos + 2);
+ if (next2$1 === 61) { return this.finishOp(types$1.assign, 3) }
+ }
+ return this.finishOp(types$1.coalesce, 2)
+ }
+ }
+ return this.finishOp(types$1.question, 1)
+ };
+
+ pp.readToken_numberSign = function() { // '#'
+ var ecmaVersion = this.options.ecmaVersion;
+ var code = 35; // '#'
+ if (ecmaVersion >= 13) {
+ ++this.pos;
+ code = this.fullCharCodeAtPos();
+ if (isIdentifierStart(code, true) || code === 92 /* '\' */) {
+ return this.finishToken(types$1.privateId, this.readWord1())
+ }
+ }
+
+ this.raise(this.pos, "Unexpected character '" + codePointToString(code) + "'");
+ };
+
+ pp.getTokenFromCode = function(code) {
+ switch (code) {
+ // The interpretation of a dot depends on whether it is followed
+ // by a digit or another two dots.
+ case 46: // '.'
+ return this.readToken_dot()
+
+ // Punctuation tokens.
+ case 40: ++this.pos; return this.finishToken(types$1.parenL)
+ case 41: ++this.pos; return this.finishToken(types$1.parenR)
+ case 59: ++this.pos; return this.finishToken(types$1.semi)
+ case 44: ++this.pos; return this.finishToken(types$1.comma)
+ case 91: ++this.pos; return this.finishToken(types$1.bracketL)
+ case 93: ++this.pos; return this.finishToken(types$1.bracketR)
+ case 123: ++this.pos; return this.finishToken(types$1.braceL)
+ case 125: ++this.pos; return this.finishToken(types$1.braceR)
+ case 58: ++this.pos; return this.finishToken(types$1.colon)
+
+ case 96: // '`'
+ if (this.options.ecmaVersion < 6) { break }
+ ++this.pos;
+ return this.finishToken(types$1.backQuote)
+
+ case 48: // '0'
+ var next = this.input.charCodeAt(this.pos + 1);
+ if (next === 120 || next === 88) { return this.readRadixNumber(16) } // '0x', '0X' - hex number
+ if (this.options.ecmaVersion >= 6) {
+ if (next === 111 || next === 79) { return this.readRadixNumber(8) } // '0o', '0O' - octal number
+ if (next === 98 || next === 66) { return this.readRadixNumber(2) } // '0b', '0B' - binary number
+ }
+
+ // Anything else beginning with a digit is an integer, octal
+ // number, or float.
+ case 49: case 50: case 51: case 52: case 53: case 54: case 55: case 56: case 57: // 1-9
+ return this.readNumber(false)
+
+ // Quotes produce strings.
+ case 34: case 39: // '"', "'"
+ return this.readString(code)
+
+ // Operators are parsed inline in tiny state machines. '=' (61) is
+ // often referred to. `finishOp` simply skips the amount of
+ // characters it is given as second argument, and returns a token
+ // of the type given by its first argument.
+ case 47: // '/'
+ return this.readToken_slash()
+
+ case 37: case 42: // '%*'
+ return this.readToken_mult_modulo_exp(code)
+
+ case 124: case 38: // '|&'
+ return this.readToken_pipe_amp(code)
+
+ case 94: // '^'
+ return this.readToken_caret()
+
+ case 43: case 45: // '+-'
+ return this.readToken_plus_min(code)
+
+ case 60: case 62: // '<>'
+ return this.readToken_lt_gt(code)
+
+ case 61: case 33: // '=!'
+ return this.readToken_eq_excl(code)
+
+ case 63: // '?'
+ return this.readToken_question()
+
+ case 126: // '~'
+ return this.finishOp(types$1.prefix, 1)
+
+ case 35: // '#'
+ return this.readToken_numberSign()
+ }
+
+ this.raise(this.pos, "Unexpected character '" + codePointToString(code) + "'");
+ };
+
+ pp.finishOp = function(type, size) {
+ var str = this.input.slice(this.pos, this.pos + size);
+ this.pos += size;
+ return this.finishToken(type, str)
+ };
+
+ pp.readRegexp = function() {
+ var escaped, inClass, start = this.pos;
+ for (;;) {
+ if (this.pos >= this.input.length) { this.raise(start, "Unterminated regular expression"); }
+ var ch = this.input.charAt(this.pos);
+ if (lineBreak.test(ch)) { this.raise(start, "Unterminated regular expression"); }
+ if (!escaped) {
+ if (ch === "[") { inClass = true; }
+ else if (ch === "]" && inClass) { inClass = false; }
+ else if (ch === "/" && !inClass) { break }
+ escaped = ch === "\\";
+ } else { escaped = false; }
+ ++this.pos;
+ }
+ var pattern = this.input.slice(start, this.pos);
+ ++this.pos;
+ var flagsStart = this.pos;
+ var flags = this.readWord1();
+ if (this.containsEsc) { this.unexpected(flagsStart); }
+
+ // Validate pattern
+ var state = this.regexpState || (this.regexpState = new RegExpValidationState(this));
+ state.reset(start, pattern, flags);
+ this.validateRegExpFlags(state);
+ this.validateRegExpPattern(state);
+
+ // Create Literal#value property value.
+ var value = null;
+ try {
+ value = new RegExp(pattern, flags);
+ } catch (e) {
+ // ESTree requires null if it failed to instantiate RegExp object.
+ // https://github.com/estree/estree/blob/a27003adf4fd7bfad44de9cef372a2eacd527b1c/es5.md#regexpliteral
+ }
+
+ return this.finishToken(types$1.regexp, {pattern: pattern, flags: flags, value: value})
+ };
+
+ // Read an integer in the given radix. Return null if zero digits
+ // were read, the integer value otherwise. When `len` is given, this
+ // will return `null` unless the integer has exactly `len` digits.
+
+ pp.readInt = function(radix, len, maybeLegacyOctalNumericLiteral) {
+ // `len` is used for character escape sequences. In that case, disallow separators.
+ var allowSeparators = this.options.ecmaVersion >= 12 && len === undefined;
+
+ // `maybeLegacyOctalNumericLiteral` is true if it doesn't have prefix (0x,0o,0b)
+ // and isn't fraction part nor exponent part. In that case, if the first digit
+ // is zero then disallow separators.
+ var isLegacyOctalNumericLiteral = maybeLegacyOctalNumericLiteral && this.input.charCodeAt(this.pos) === 48;
+
+ var start = this.pos, total = 0, lastCode = 0;
+ for (var i = 0, e = len == null ? Infinity : len; i < e; ++i, ++this.pos) {
+ var code = this.input.charCodeAt(this.pos), val = (void 0);
+
+ if (allowSeparators && code === 95) {
+ if (isLegacyOctalNumericLiteral) { this.raiseRecoverable(this.pos, "Numeric separator is not allowed in legacy octal numeric literals"); }
+ if (lastCode === 95) { this.raiseRecoverable(this.pos, "Numeric separator must be exactly one underscore"); }
+ if (i === 0) { this.raiseRecoverable(this.pos, "Numeric separator is not allowed at the first of digits"); }
+ lastCode = code;
+ continue
+ }
+
+ if (code >= 97) { val = code - 97 + 10; } // a
+ else if (code >= 65) { val = code - 65 + 10; } // A
+ else if (code >= 48 && code <= 57) { val = code - 48; } // 0-9
+ else { val = Infinity; }
+ if (val >= radix) { break }
+ lastCode = code;
+ total = total * radix + val;
+ }
+
+ if (allowSeparators && lastCode === 95) { this.raiseRecoverable(this.pos - 1, "Numeric separator is not allowed at the last of digits"); }
+ if (this.pos === start || len != null && this.pos - start !== len) { return null }
+
+ return total
+ };
+
+ function stringToNumber(str, isLegacyOctalNumericLiteral) {
+ if (isLegacyOctalNumericLiteral) {
+ return parseInt(str, 8)
+ }
+
+ // `parseFloat(value)` stops parsing at the first numeric separator then returns a wrong value.
+ return parseFloat(str.replace(/_/g, ""))
+ }
+
+ function stringToBigInt(str) {
+ if (typeof BigInt !== "function") {
+ return null
+ }
+
+ // `BigInt(value)` throws syntax error if the string contains numeric separators.
+ return BigInt(str.replace(/_/g, ""))
+ }
+
+ pp.readRadixNumber = function(radix) {
+ var start = this.pos;
+ this.pos += 2; // 0x
+ var val = this.readInt(radix);
+ if (val == null) { this.raise(this.start + 2, "Expected number in radix " + radix); }
+ if (this.options.ecmaVersion >= 11 && this.input.charCodeAt(this.pos) === 110) {
+ val = stringToBigInt(this.input.slice(start, this.pos));
+ ++this.pos;
+ } else if (isIdentifierStart(this.fullCharCodeAtPos())) { this.raise(this.pos, "Identifier directly after number"); }
+ return this.finishToken(types$1.num, val)
+ };
+
+ // Read an integer, octal integer, or floating-point number.
+
+ pp.readNumber = function(startsWithDot) {
+ var start = this.pos;
+ if (!startsWithDot && this.readInt(10, undefined, true) === null) { this.raise(start, "Invalid number"); }
+ var octal = this.pos - start >= 2 && this.input.charCodeAt(start) === 48;
+ if (octal && this.strict) { this.raise(start, "Invalid number"); }
+ var next = this.input.charCodeAt(this.pos);
+ if (!octal && !startsWithDot && this.options.ecmaVersion >= 11 && next === 110) {
+ var val$1 = stringToBigInt(this.input.slice(start, this.pos));
+ ++this.pos;
+ if (isIdentifierStart(this.fullCharCodeAtPos())) { this.raise(this.pos, "Identifier directly after number"); }
+ return this.finishToken(types$1.num, val$1)
+ }
+ if (octal && /[89]/.test(this.input.slice(start, this.pos))) { octal = false; }
+ if (next === 46 && !octal) { // '.'
+ ++this.pos;
+ this.readInt(10);
+ next = this.input.charCodeAt(this.pos);
+ }
+ if ((next === 69 || next === 101) && !octal) { // 'eE'
+ next = this.input.charCodeAt(++this.pos);
+ if (next === 43 || next === 45) { ++this.pos; } // '+-'
+ if (this.readInt(10) === null) { this.raise(start, "Invalid number"); }
+ }
+ if (isIdentifierStart(this.fullCharCodeAtPos())) { this.raise(this.pos, "Identifier directly after number"); }
+
+ var val = stringToNumber(this.input.slice(start, this.pos), octal);
+ return this.finishToken(types$1.num, val)
+ };
+
+ // Read a string value, interpreting backslash-escapes.
+
+ pp.readCodePoint = function() {
+ var ch = this.input.charCodeAt(this.pos), code;
+
+ if (ch === 123) { // '{'
+ if (this.options.ecmaVersion < 6) { this.unexpected(); }
+ var codePos = ++this.pos;
+ code = this.readHexChar(this.input.indexOf("}", this.pos) - this.pos);
+ ++this.pos;
+ if (code > 0x10FFFF) { this.invalidStringToken(codePos, "Code point out of bounds"); }
+ } else {
+ code = this.readHexChar(4);
+ }
+ return code
+ };
+
+ pp.readString = function(quote) {
+ var out = "", chunkStart = ++this.pos;
+ for (;;) {
+ if (this.pos >= this.input.length) { this.raise(this.start, "Unterminated string constant"); }
+ var ch = this.input.charCodeAt(this.pos);
+ if (ch === quote) { break }
+ if (ch === 92) { // '\'
+ out += this.input.slice(chunkStart, this.pos);
+ out += this.readEscapedChar(false);
+ chunkStart = this.pos;
+ } else if (ch === 0x2028 || ch === 0x2029) {
+ if (this.options.ecmaVersion < 10) { this.raise(this.start, "Unterminated string constant"); }
+ ++this.pos;
+ if (this.options.locations) {
+ this.curLine++;
+ this.lineStart = this.pos;
+ }
+ } else {
+ if (isNewLine(ch)) { this.raise(this.start, "Unterminated string constant"); }
+ ++this.pos;
+ }
+ }
+ out += this.input.slice(chunkStart, this.pos++);
+ return this.finishToken(types$1.string, out)
+ };
+
+ // Reads template string tokens.
+
+ var INVALID_TEMPLATE_ESCAPE_ERROR = {};
+
+ pp.tryReadTemplateToken = function() {
+ this.inTemplateElement = true;
+ try {
+ this.readTmplToken();
+ } catch (err) {
+ if (err === INVALID_TEMPLATE_ESCAPE_ERROR) {
+ this.readInvalidTemplateToken();
+ } else {
+ throw err
+ }
+ }
+
+ this.inTemplateElement = false;
+ };
+
+ pp.invalidStringToken = function(position, message) {
+ if (this.inTemplateElement && this.options.ecmaVersion >= 9) {
+ throw INVALID_TEMPLATE_ESCAPE_ERROR
+ } else {
+ this.raise(position, message);
+ }
+ };
+
+ pp.readTmplToken = function() {
+ var out = "", chunkStart = this.pos;
+ for (;;) {
+ if (this.pos >= this.input.length) { this.raise(this.start, "Unterminated template"); }
+ var ch = this.input.charCodeAt(this.pos);
+ if (ch === 96 || ch === 36 && this.input.charCodeAt(this.pos + 1) === 123) { // '`', '${'
+ if (this.pos === this.start && (this.type === types$1.template || this.type === types$1.invalidTemplate)) {
+ if (ch === 36) {
+ this.pos += 2;
+ return this.finishToken(types$1.dollarBraceL)
+ } else {
+ ++this.pos;
+ return this.finishToken(types$1.backQuote)
+ }
+ }
+ out += this.input.slice(chunkStart, this.pos);
+ return this.finishToken(types$1.template, out)
+ }
+ if (ch === 92) { // '\'
+ out += this.input.slice(chunkStart, this.pos);
+ out += this.readEscapedChar(true);
+ chunkStart = this.pos;
+ } else if (isNewLine(ch)) {
+ out += this.input.slice(chunkStart, this.pos);
+ ++this.pos;
+ switch (ch) {
+ case 13:
+ if (this.input.charCodeAt(this.pos) === 10) { ++this.pos; }
+ case 10:
+ out += "\n";
+ break
+ default:
+ out += String.fromCharCode(ch);
+ break
+ }
+ if (this.options.locations) {
+ ++this.curLine;
+ this.lineStart = this.pos;
+ }
+ chunkStart = this.pos;
+ } else {
+ ++this.pos;
+ }
+ }
+ };
+
+ // Reads a template token to search for the end, without validating any escape sequences
+ pp.readInvalidTemplateToken = function() {
+ for (; this.pos < this.input.length; this.pos++) {
+ switch (this.input[this.pos]) {
+ case "\\":
+ ++this.pos;
+ break
+
+ case "$":
+ if (this.input[this.pos + 1] !== "{") {
+ break
+ }
+
+ // falls through
+ case "`":
+ return this.finishToken(types$1.invalidTemplate, this.input.slice(this.start, this.pos))
+
+ // no default
+ }
+ }
+ this.raise(this.start, "Unterminated template");
+ };
+
+ // Used to read escaped characters
+
+ pp.readEscapedChar = function(inTemplate) {
+ var ch = this.input.charCodeAt(++this.pos);
+ ++this.pos;
+ switch (ch) {
+ case 110: return "\n" // 'n' -> '\n'
+ case 114: return "\r" // 'r' -> '\r'
+ case 120: return String.fromCharCode(this.readHexChar(2)) // 'x'
+ case 117: return codePointToString(this.readCodePoint()) // 'u'
+ case 116: return "\t" // 't' -> '\t'
+ case 98: return "\b" // 'b' -> '\b'
+ case 118: return "\u000b" // 'v' -> '\u000b'
+ case 102: return "\f" // 'f' -> '\f'
+ case 13: if (this.input.charCodeAt(this.pos) === 10) { ++this.pos; } // '\r\n'
+ case 10: // ' \n'
+ if (this.options.locations) { this.lineStart = this.pos; ++this.curLine; }
+ return ""
+ case 56:
+ case 57:
+ if (this.strict) {
+ this.invalidStringToken(
+ this.pos - 1,
+ "Invalid escape sequence"
+ );
+ }
+ if (inTemplate) {
+ var codePos = this.pos - 1;
+
+ this.invalidStringToken(
+ codePos,
+ "Invalid escape sequence in template string"
+ );
+ }
+ default:
+ if (ch >= 48 && ch <= 55) {
+ var octalStr = this.input.substr(this.pos - 1, 3).match(/^[0-7]+/)[0];
+ var octal = parseInt(octalStr, 8);
+ if (octal > 255) {
+ octalStr = octalStr.slice(0, -1);
+ octal = parseInt(octalStr, 8);
+ }
+ this.pos += octalStr.length - 1;
+ ch = this.input.charCodeAt(this.pos);
+ if ((octalStr !== "0" || ch === 56 || ch === 57) && (this.strict || inTemplate)) {
+ this.invalidStringToken(
+ this.pos - 1 - octalStr.length,
+ inTemplate
+ ? "Octal literal in template string"
+ : "Octal literal in strict mode"
+ );
+ }
+ return String.fromCharCode(octal)
+ }
+ if (isNewLine(ch)) {
+ // Unicode new line characters after \ get removed from output in both
+ // template literals and strings
+ return ""
+ }
+ return String.fromCharCode(ch)
+ }
+ };
+
+ // Used to read character escape sequences ('\x', '\u', '\U').
+
+ pp.readHexChar = function(len) {
+ var codePos = this.pos;
+ var n = this.readInt(16, len);
+ if (n === null) { this.invalidStringToken(codePos, "Bad character escape sequence"); }
+ return n
+ };
+
+ // Read an identifier, and return it as a string. Sets `this.containsEsc`
+ // to whether the word contained a '\u' escape.
+ //
+ // Incrementally adds only escaped chars, adding other chunks as-is
+ // as a micro-optimization.
+
+ pp.readWord1 = function() {
+ this.containsEsc = false;
+ var word = "", first = true, chunkStart = this.pos;
+ var astral = this.options.ecmaVersion >= 6;
+ while (this.pos < this.input.length) {
+ var ch = this.fullCharCodeAtPos();
+ if (isIdentifierChar(ch, astral)) {
+ this.pos += ch <= 0xffff ? 1 : 2;
+ } else if (ch === 92) { // "\"
+ this.containsEsc = true;
+ word += this.input.slice(chunkStart, this.pos);
+ var escStart = this.pos;
+ if (this.input.charCodeAt(++this.pos) !== 117) // "u"
+ { this.invalidStringToken(this.pos, "Expecting Unicode escape sequence \\uXXXX"); }
+ ++this.pos;
+ var esc = this.readCodePoint();
+ if (!(first ? isIdentifierStart : isIdentifierChar)(esc, astral))
+ { this.invalidStringToken(escStart, "Invalid Unicode escape"); }
+ word += codePointToString(esc);
+ chunkStart = this.pos;
+ } else {
+ break
+ }
+ first = false;
+ }
+ return word + this.input.slice(chunkStart, this.pos)
+ };
+
+ // Read an identifier or keyword token. Will check for reserved
+ // words when necessary.
+
+ pp.readWord = function() {
+ var word = this.readWord1();
+ var type = types$1.name;
+ if (this.keywords.test(word)) {
+ type = keywords[word];
+ }
+ return this.finishToken(type, word)
+ };
+
+ // Acorn is a tiny, fast JavaScript parser written in JavaScript.
+
+ var version = "8.8.2";
+
+ Parser.acorn = {
+ Parser: Parser,
+ version: version,
+ defaultOptions: defaultOptions,
+ Position: Position,
+ SourceLocation: SourceLocation,
+ getLineInfo: getLineInfo,
+ Node: Node,
+ TokenType: TokenType,
+ tokTypes: types$1,
+ keywordTypes: keywords,
+ TokContext: TokContext,
+ tokContexts: types,
+ isIdentifierChar: isIdentifierChar,
+ isIdentifierStart: isIdentifierStart,
+ Token: Token,
+ isNewLine: isNewLine,
+ lineBreak: lineBreak,
+ lineBreakG: lineBreakG,
+ nonASCIIwhitespace: nonASCIIwhitespace
+ };
+
+ // The main exported interface (under `self.acorn` when in the
+ // browser) is a `parse` function that takes a code string and
+ // returns an abstract syntax tree as specified by [Mozilla parser
+ // API][api].
+ //
+ // [api]: https://developer.mozilla.org/en-US/docs/SpiderMonkey/Parser_API
+
+ function parse(input, options) {
+ return Parser.parse(input, options)
+ }
+
+ // This function tries to parse a single expression at a given
+ // offset in a string. Useful for parsing mixed-language formats
+ // that embed JavaScript expressions.
+
+ function parseExpressionAt(input, pos, options) {
+ return Parser.parseExpressionAt(input, pos, options)
+ }
+
+ // Acorn is organized as a tokenizer and a recursive-descent parser.
+ // The `tokenizer` export provides an interface to the tokenizer.
+
+ function tokenizer(input, options) {
+ return Parser.tokenizer(input, options)
+ }
+
+ exports.Node = Node;
+ exports.Parser = Parser;
+ exports.Position = Position;
+ exports.SourceLocation = SourceLocation;
+ exports.TokContext = TokContext;
+ exports.Token = Token;
+ exports.TokenType = TokenType;
+ exports.defaultOptions = defaultOptions;
+ exports.getLineInfo = getLineInfo;
+ exports.isIdentifierChar = isIdentifierChar;
+ exports.isIdentifierStart = isIdentifierStart;
+ exports.isNewLine = isNewLine;
+ exports.keywordTypes = keywords;
+ exports.lineBreak = lineBreak;
+ exports.lineBreakG = lineBreakG;
+ exports.nonASCIIwhitespace = nonASCIIwhitespace;
+ exports.parse = parse;
+ exports.parseExpressionAt = parseExpressionAt;
+ exports.tokContexts = types;
+ exports.tokTypes = types$1;
+ exports.tokenizer = tokenizer;
+ exports.version = version;
+
+ }));
+ } (acorn$1, acorn$1.exports));
+ return acorn$1.exports;
+ }
+
+ /* eslint-disable complexity */
+
+ var acorn = requireAcorn();
+ var sourceMap = requireSourceMap();
+ const NEWLINE_CODE = 10;
+
+ function prettyFast(input, options) {
+ return new PrettyFast(options).getPrettifiedCodeAndSourceMap(input);
+ }
+
+ // If any of these tokens are seen before a "[" token, we know that "[" token
+ // is the start of an array literal, rather than a property access.
+ //
+ // The only exception is "}", which would need to be disambiguated by
+ // parsing. The majority of the time, an open bracket following a closing
+ // curly is going to be an array literal, so we brush the complication under
+ // the rug, and handle the ambiguity by always assuming that it will be an
+ // array literal.
+ const PRE_ARRAY_LITERAL_TOKENS = new Set([
+ "typeof",
+ "void",
+ "delete",
+ "case",
+ "do",
+ "=",
+ "in",
+ "of",
+ "...",
+ "{",
+ "*",
+ "/",
+ "%",
+ "else",
+ ";",
+ "++",
+ "--",
+ "+",
+ "-",
+ "~",
+ "!",
+ ":",
+ "?",
+ ">>",
+ ">>>",
+ "<<",
+ "||",
+ "&&",
+ "<",
+ ">",
+ "<=",
+ ">=",
+ "instanceof",
+ "&",
+ "^",
+ "|",
+ "==",
+ "!=",
+ "===",
+ "!==",
+ ",",
+ "}",
+ ]);
+
+ // If any of these tokens are seen before a "{" token, we know that "{" token
+ // is the start of an object literal, rather than the start of a block.
+ const PRE_OBJECT_LITERAL_TOKENS = new Set([
+ "typeof",
+ "void",
+ "delete",
+ "=",
+ "in",
+ "of",
+ "...",
+ "*",
+ "/",
+ "%",
+ "++",
+ "--",
+ "+",
+ "-",
+ "~",
+ "!",
+ ">>",
+ ">>>",
+ "<<",
+ "<",
+ ">",
+ "<=",
+ ">=",
+ "instanceof",
+ "&",
+ "^",
+ "|",
+ "==",
+ "!=",
+ "===",
+ "!==",
+ ]);
+
+ class PrettyFast {
+ /**
+ * @param {Object} options: Provides configurability of the pretty printing.
+ * @param {String} options.url: The URL string of the ugly JS code.
+ * @param {String} options.indent: The string to indent code by.
+ * @param {SourceMapGenerator} options.sourceMapGenerator: An optional sourceMapGenerator
+ * the mappings will be added to.
+ * @param {Boolean} options.prefixWithNewLine: When true, the pretty printed code will start
+ * with a line break
+ * @param {Integer} options.originalStartLine: The line the passed script starts at (1-based).
+ * This is used for inline scripts where we need to account for the lines
+ * before the script tag
+ * @param {Integer} options.originalStartColumn: The column the passed script starts at (1-based).
+ * This is used for inline scripts where we need to account for the position
+ * of the script tag within the line.
+ * @param {Integer} options.generatedStartLine: The line where the pretty printed script
+ * will start at (1-based). This is used for pretty printing HTML file,
+ * where we might have handle previous inline scripts that impact the
+ * position of this script.
+ */
+ constructor(options = {}) {
+ // The level of indents deep we are.
+ this.#indentLevel = 0;
+ this.#indentChar = options.indent;
+
+ // We will handle mappings between ugly and pretty printed code in this SourceMapGenerator.
+ this.#sourceMapGenerator =
+ options.sourceMapGenerator ||
+ new sourceMap.SourceMapGenerator({
+ file: options.url,
+ });
+
+ this.#file = options.url;
+ this.#hasOriginalStartLine = "originalStartLine" in options;
+ this.#hasOriginalStartColumn = "originalStartColumn" in options;
+ this.#hasGeneratedStartLine = "generatedStartLine" in options;
+ this.#originalStartLine = options.originalStartLine;
+ this.#originalStartColumn = options.originalStartColumn;
+ this.#generatedStartLine = options.generatedStartLine;
+ this.#prefixWithNewLine = options.prefixWithNewLine;
+ }
+
+ /* options */
+ #indentChar;
+ #indentLevel;
+ #file;
+ #hasOriginalStartLine;
+ #hasOriginalStartColumn;
+ #hasGeneratedStartLine;
+ #originalStartLine;
+ #originalStartColumn;
+ #prefixWithNewLine;
+ #generatedStartLine;
+ #sourceMapGenerator;
+
+ /* internals */
+
+ // Whether or not we added a newline on after we added the previous token.
+ #addedNewline = false;
+ // Whether or not we added a space after we added the previous token.
+ #addedSpace = false;
+ #currentCode = "";
+ #currentLine = 1;
+ #currentColumn = 0;
+ // The tokens parsed by acorn.
+ #tokenQueue;
+ // The index of the current token in this.#tokenQueue.
+ #currentTokenIndex;
+ // The previous token we added to the pretty printed code.
+ #previousToken;
+ // Stack of token types/keywords that can affect whether we want to add a
+ // newline or a space. We can make that decision based on what token type is
+ // on the top of the stack. For example, a comma in a parameter list should
+ // be followed by a space, while a comma in an object literal should be
+ // followed by a newline.
+ //
+ // Strings that go on the stack:
+ //
+ // - "{"
+ // - "{\n"
+ // - "("
+ // - "(\n"
+ // - "["
+ // - "[\n"
+ // - "do"
+ // - "?"
+ // - "switch"
+ // - "case"
+ // - "default"
+ //
+ // The difference between "[" and "[\n" (as well as "{" and "{\n", and "(" and "(\n")
+ // is that "\n" is used when we are treating (curly) brackets/parens as line delimiters
+ // and should increment and decrement the indent level when we find them.
+ // "[" can represent either a property access (e.g. `x["hi"]`), or an empty array literal
+ // "{" only represents an empty object literals
+ // "(" can represent lots of different things (wrapping expression, if/loop condition, function call, …)
+ #stack = [];
+
+ /**
+ * @param {String} input: The ugly JS code we want to pretty print.
+ * @returns {Object}
+ * An object with the following properties:
+ * - code: The pretty printed code string.
+ * - map: A SourceMapGenerator instance.
+ */
+ getPrettifiedCodeAndSourceMap(input) {
+ // Add the initial new line if needed
+ if (this.#prefixWithNewLine) {
+ this.#write("\n");
+ }
+
+ // Pass through acorn's tokenizer and append tokens and comments into a
+ // single queue to process. For example, the source file:
+ //
+ // foo
+ // // a
+ // // b
+ // bar
+ //
+ // After this process, tokenQueue has the following token stream:
+ //
+ // [ foo, '// a', '// b', bar]
+ this.#tokenQueue = this.#getTokens(input);
+
+ for (let i = 0, len = this.#tokenQueue.length; i < len; i++) {
+ this.#currentTokenIndex = i;
+ const token = this.#tokenQueue[i];
+ const nextToken = this.#tokenQueue[i + 1];
+ this.#handleToken(token, nextToken);
+
+ // Acorn's tokenizer re-uses tokens, so we have to copy the previous token on
+ // every iteration. We follow acorn's lead here, and reuse the previousToken
+ // object the same way that acorn reuses the token object. This allows us
+ // to avoid allocations and minimize GC pauses.
+ if (!this.#previousToken) {
+ this.#previousToken = { loc: { start: {}, end: {} } };
+ }
+ this.#previousToken.start = token.start;
+ this.#previousToken.end = token.end;
+ this.#previousToken.loc.start.line = token.loc.start.line;
+ this.#previousToken.loc.start.column = token.loc.start.column;
+ this.#previousToken.loc.end.line = token.loc.end.line;
+ this.#previousToken.loc.end.column = token.loc.end.column;
+ this.#previousToken.type = token.type;
+ this.#previousToken.value = token.value;
+ }
+
+ return { code: this.#currentCode, map: this.#sourceMapGenerator };
+ }
+
+ /**
+ * Write a pretty printed string to the prettified string and for tokens, add their
+ * mapping to the SourceMapGenerator.
+ *
+ * @param String str
+ * The string to be added to the result.
+ * @param Number line
+ * The line number the string came from in the ugly source.
+ * @param Number column
+ * The column number the string came from in the ugly source.
+ * @param Boolean isToken
+ * Set to true when writing tokens, so we can differentiate them from the
+ * whitespace we add.
+ */
+ #write(str, line, column, isToken) {
+ this.#currentCode += str;
+ if (isToken) {
+ this.#sourceMapGenerator.addMapping({
+ source: this.#file,
+ // We need to swap original and generated locations, as the prettified text should
+ // be seen by the sourcemap service as the "original" one.
+ generated: {
+ // originalStartLine is 1-based, and here we just want to offset by a number of
+ // lines, so we need to decrement it
+ line: this.#hasOriginalStartLine
+ ? line + (this.#originalStartLine - 1)
+ : line,
+ // We only need to adjust the column number if we're looking at the first line, to
+ // account for the html text before the opening <script> tag.
+ column:
+ line == 1 && this.#hasOriginalStartColumn
+ ? column + this.#originalStartColumn
+ : column,
+ },
+ original: {
+ // generatedStartLine is 1-based, and here we just want to offset by a number of
+ // lines, so we need to decrement it.
+ line: this.#hasGeneratedStartLine
+ ? this.#currentLine + (this.#generatedStartLine - 1)
+ : this.#currentLine,
+ column: this.#currentColumn,
+ },
+ name: null,
+ });
+ }
+
+ for (let idx = 0, length = str.length; idx < length; idx++) {
+ if (str.charCodeAt(idx) === NEWLINE_CODE) {
+ this.#currentLine++;
+ this.#currentColumn = 0;
+ } else {
+ this.#currentColumn++;
+ }
+ }
+ }
+
+ /**
+ * Add the given token to the pretty printed results.
+ *
+ * @param Object token
+ * The token to add.
+ */
+ #writeToken(token) {
+ if (token.type.label == "string") {
+ this.#write(
+ `'${sanitize(token.value)}'`,
+ token.loc.start.line,
+ token.loc.start.column,
+ true
+ );
+ } else if (token.type.label == "regexp") {
+ this.#write(
+ String(token.value.value),
+ token.loc.start.line,
+ token.loc.start.column,
+ true
+ );
+ } else {
+ let value;
+ if (token.value != null) {
+ value = token.value;
+ if (token.type.label === "privateId") {
+ value = `#${value}`;
+ }
+ } else {
+ value = token.type.label;
+ }
+ this.#write(
+ String(value),
+ token.loc.start.line,
+ token.loc.start.column,
+ true
+ );
+ }
+ }
+
+ /**
+ * Returns the tokens computed with acorn.
+ *
+ * @param String input
+ * The JS code we want the tokens of.
+ * @returns Array<Object>
+ */
+ #getTokens(input) {
+ const tokens = [];
+
+ const res = acorn.tokenizer(input, {
+ locations: true,
+ ecmaVersion: "latest",
+ onComment(block, text, start, end, startLoc, endLoc) {
+ tokens.push({
+ type: {},
+ comment: true,
+ block,
+ text,
+ loc: { start: startLoc, end: endLoc },
+ });
+ },
+ });
+
+ for (;;) {
+ const token = res.getToken();
+ tokens.push(token);
+ if (token.type.label == "eof") {
+ break;
+ }
+ }
+
+ return tokens;
+ }
+
+ /**
+ * Add the required whitespace before this token, whether that is a single
+ * space, newline, and/or the indent on fresh lines.
+ *
+ * @param Object token
+ * The token we are currently handling.
+ * @param {Object|undefined} nextToken
+ * The next token, might not exist if we're on the last token
+ */
+ #handleToken(token, nextToken) {
+ if (token.comment) {
+ let commentIndentLevel = this.#indentLevel;
+ if (this.#previousToken?.loc?.end?.line == token.loc.start.line) {
+ commentIndentLevel = 0;
+ this.#write(" ");
+ }
+ this.#addComment(
+ commentIndentLevel,
+ token.block,
+ token.text,
+ token.loc.start.line,
+ nextToken
+ );
+ return;
+ }
+
+ // Shorthand for token.type.keyword, so we don't have to repeatedly access
+ // properties.
+ const ttk = token.type.keyword;
+
+ if (ttk && this.#previousToken?.type?.label == ".") {
+ token.type = acorn.tokTypes.name;
+ }
+
+ // Shorthand for token.type.label, so we don't have to repeatedly access
+ // properties.
+ const ttl = token.type.label;
+
+ if (ttl == "eof") {
+ if (!this.#addedNewline) {
+ this.#write("\n");
+ }
+ return;
+ }
+
+ if (belongsOnStack(token)) {
+ let stackEntry;
+
+ if (isArrayLiteral(token, this.#previousToken)) {
+ // Don't add new lines for empty array literals
+ stackEntry = nextToken?.type?.label === "]" ? "[" : "[\n";
+ } else if (isObjectLiteral(token, this.#previousToken)) {
+ // Don't add new lines for empty object literals
+ stackEntry = nextToken?.type?.label === "}" ? "{" : "{\n";
+ } else if (
+ isRoundBracketStartingLongParenthesis(
+ token,
+ this.#tokenQueue,
+ this.#currentTokenIndex
+ )
+ ) {
+ stackEntry = "(\n";
+ } else if (ttl == "{") {
+ // We need to add a line break for "{" which are not empty object literals
+ stackEntry = "{\n";
+ } else {
+ stackEntry = ttl || ttk;
+ }
+
+ this.#stack.push(stackEntry);
+ }
+
+ this.#maybeDecrementIndent(token);
+ this.#prependWhiteSpace(token);
+ this.#writeToken(token);
+ this.#addedSpace = false;
+
+ // If the next token is going to be a comment starting on the same line,
+ // then no need to add a new line here
+ if (
+ !nextToken ||
+ !nextToken.comment ||
+ token.loc.end.line != nextToken.loc.start.line
+ ) {
+ this.#maybeAppendNewline(token);
+ }
+
+ this.#maybePopStack(token);
+ this.#maybeIncrementIndent(token);
+ }
+
+ /**
+ * Returns true if the given token should cause us to pop the stack.
+ */
+ #maybePopStack(token) {
+ const ttl = token.type.label;
+ const ttk = token.type.keyword;
+ const top = this.#stack.at(-1);
+
+ if (
+ ttl == "]" ||
+ ttl == ")" ||
+ ttl == "}" ||
+ (ttl == ":" && (top == "case" || top == "default" || top == "?")) ||
+ (ttk == "while" && top == "do")
+ ) {
+ this.#stack.pop();
+ if (ttl == "}" && this.#stack.at(-1) == "switch") {
+ this.#stack.pop();
+ }
+ }
+ }
+
+ #maybeIncrementIndent(token) {
+ if (
+ // Don't increment indent for empty object literals
+ (token.type.label == "{" && this.#stack.at(-1) === "{\n") ||
+ // Don't increment indent for empty array literals
+ (token.type.label == "[" && this.#stack.at(-1) === "[\n") ||
+ token.type.keyword == "switch" ||
+ (token.type.label == "(" && this.#stack.at(-1) === "(\n")
+ ) {
+ this.#indentLevel++;
+ }
+ }
+
+ #shouldDecrementIndent(token) {
+ const top = this.#stack.at(-1);
+ const ttl = token.type.label;
+ return (
+ (ttl == "}" && top == "{\n") ||
+ (ttl == "]" && top == "[\n") ||
+ (ttl == ")" && top == "(\n")
+ );
+ }
+
+ #maybeDecrementIndent(token) {
+ if (!this.#shouldDecrementIndent(token)) {
+ return;
+ }
+
+ const ttl = token.type.label;
+ this.#indentLevel--;
+ if (ttl == "}" && this.#stack.at(-2) == "switch") {
+ this.#indentLevel--;
+ }
+ }
+
+ /**
+ * Add a comment to the pretty printed code.
+ *
+ * @param Number indentLevel
+ * The number of indents deep we are (might be different from this.#indentLevel).
+ * @param Boolean block
+ * True if the comment is a multiline block style comment.
+ * @param String text
+ * The text of the comment.
+ * @param Number line
+ * The line number to comment appeared on.
+ * @param Object nextToken
+ * The next token if any.
+ */
+ #addComment(indentLevel, block, text, line, nextToken) {
+ const indentString = this.#indentChar.repeat(indentLevel);
+ const needNewLineAfter =
+ !block || !(nextToken && nextToken.loc.start.line == line);
+
+ if (block) {
+ const commentLinesText = text
+ .split(new RegExp(`/\n${indentString}/`, "g"))
+ .join(`\n${indentString}`);
+
+ this.#write(
+ `${indentString}/*${commentLinesText}*/${needNewLineAfter ? "\n" : " "}`
+ );
+ } else {
+ this.#write(`${indentString}//${text}\n`);
+ }
+
+ this.#addedNewline = needNewLineAfter;
+ this.#addedSpace = !needNewLineAfter;
+ }
+
+ /**
+ * Add the required whitespace before this token, whether that is a single
+ * space, newline, and/or the indent on fresh lines.
+ *
+ * @param Object token
+ * The token we are about to add to the pretty printed code.
+ */
+ #prependWhiteSpace(token) {
+ const ttk = token.type.keyword;
+ const ttl = token.type.label;
+ let newlineAdded = this.#addedNewline;
+ let spaceAdded = this.#addedSpace;
+ const ltt = this.#previousToken?.type?.label;
+
+ // Handle whitespace and newlines after "}" here instead of in
+ // `isLineDelimiter` because it is only a line delimiter some of the
+ // time. For example, we don't want to put "else if" on a new line after
+ // the first if's block.
+ if (this.#previousToken && ltt == "}") {
+ if (
+ (ttk == "while" && this.#stack.at(-1) == "do") ||
+ needsSpaceBeforeClosingCurlyBracket(ttk)
+ ) {
+ this.#write(" ");
+ spaceAdded = true;
+ } else if (needsLineBreakBeforeClosingCurlyBracket(ttl)) {
+ this.#write("\n");
+ newlineAdded = true;
+ }
+ }
+
+ if (
+ (ttl == ":" && this.#stack.at(-1) == "?") ||
+ (ttl == "}" && this.#stack.at(-1) == "${")
+ ) {
+ this.#write(" ");
+ spaceAdded = true;
+ }
+
+ if (this.#previousToken && ltt != "}" && ltt != "." && ttk == "else") {
+ this.#write(" ");
+ spaceAdded = true;
+ }
+
+ const ensureNewline = () => {
+ if (!newlineAdded) {
+ this.#write("\n");
+ newlineAdded = true;
+ }
+ };
+
+ if (isASI(token, this.#previousToken)) {
+ ensureNewline();
+ }
+
+ if (this.#shouldDecrementIndent(token)) {
+ ensureNewline();
+ }
+
+ if (newlineAdded) {
+ let indentLevel = this.#indentLevel;
+ if (ttk == "case" || ttk == "default") {
+ indentLevel--;
+ }
+ this.#write(this.#indentChar.repeat(indentLevel));
+ } else if (!spaceAdded && needsSpaceAfter(token, this.#previousToken)) {
+ this.#write(" ");
+ spaceAdded = true;
+ }
+ }
+
+ /**
+ * Append the necessary whitespace to the result after we have added the given
+ * token.
+ *
+ * @param Object token
+ * The token that was just added to the result.
+ */
+ #maybeAppendNewline(token) {
+ if (!isLineDelimiter(token, this.#stack)) {
+ this.#addedNewline = false;
+ return;
+ }
+
+ this.#write("\n");
+ this.#addedNewline = true;
+ }
+ }
+
+ /**
+ * Determines if we think that the given token starts an array literal.
+ *
+ * @param Object token
+ * The token we want to determine if it is an array literal.
+ * @param Object previousToken
+ * The previous token we added to the pretty printed results.
+ *
+ * @returns Boolean
+ * True if we believe it is an array literal, false otherwise.
+ */
+ function isArrayLiteral(token, previousToken) {
+ if (token.type.label != "[") {
+ return false;
+ }
+ if (!previousToken) {
+ return true;
+ }
+ if (previousToken.type.isAssign) {
+ return true;
+ }
+
+ return PRE_ARRAY_LITERAL_TOKENS.has(
+ previousToken.type.keyword ||
+ // Some tokens ('of', 'yield', …) have a `token.type.keyword` of 'name' and their
+ // actual value in `token.value`
+ (previousToken.type.label == "name"
+ ? previousToken.value
+ : previousToken.type.label)
+ );
+ }
+
+ /**
+ * Determines if we think that the given token starts an object literal.
+ *
+ * @param Object token
+ * The token we want to determine if it is an object literal.
+ * @param Object previousToken
+ * The previous token we added to the pretty printed results.
+ *
+ * @returns Boolean
+ * True if we believe it is an object literal, false otherwise.
+ */
+ function isObjectLiteral(token, previousToken) {
+ if (token.type.label != "{") {
+ return false;
+ }
+ if (!previousToken) {
+ return false;
+ }
+ if (previousToken.type.isAssign) {
+ return true;
+ }
+ return PRE_OBJECT_LITERAL_TOKENS.has(
+ previousToken.type.keyword || previousToken.type.label
+ );
+ }
+
+ /**
+ * Determines if we think that the given token starts a long parenthesis
+ *
+ * @param {Object} token
+ * The token we want to determine if it is the beginning of a long paren.
+ * @param {Array<Object>} tokenQueue
+ * The whole list of tokens parsed by acorn
+ * @param {Integer} currentTokenIndex
+ * The index of `token` in `tokenQueue`
+ * @returns
+ */
+ function isRoundBracketStartingLongParenthesis(
+ token,
+ tokenQueue,
+ currentTokenIndex
+ ) {
+ if (token.type.label !== "(") {
+ return false;
+ }
+
+ // If we're just wrapping an object, we'll have a new line right after
+ if (tokenQueue[currentTokenIndex + 1].type.label == "{") {
+ return false;
+ }
+
+ // We're going to iterate through the following tokens until :
+ // - we find the closing parent
+ // - or we reached the maximum character we think should be in parenthesis
+ const longParentContentLength = 60;
+
+ // Keep track of other parens so we know when we get the closing one for `token`
+ let parenCount = 0;
+ let parenContentLength = 0;
+ for (let i = currentTokenIndex + 1, len = tokenQueue.length; i < len; i++) {
+ const currToken = tokenQueue[i];
+ const ttl = currToken.type.label;
+
+ if (ttl == "(") {
+ parenCount++;
+ } else if (ttl == ")") {
+ if (parenCount == 0) {
+ // Matching closing paren, if we got here, we didn't reach the length limit,
+ // as we return when parenContentLength is greater than the limit.
+ return false;
+ }
+ parenCount--;
+ }
+
+ // Aside block comments, all tokens start and end location are on the same line, so
+ // we can use `start` and `end` to deduce the token length.
+ const tokenLength = currToken.comment
+ ? currToken.text.length
+ : currToken.end - currToken.start;
+ parenContentLength += tokenLength;
+
+ // If we didn't find the matching closing paren yet and the characters from the
+ // tokens we evaluated so far are longer than the limit, so consider the token
+ // a long paren.
+ if (parenContentLength > longParentContentLength) {
+ return true;
+ }
+ }
+
+ // if we get to here, we didn't found a closing paren, which shouldn't happen
+ // (scripts with syntax error are not displayed in the debugger), but just to
+ // be safe, return false.
+ return false;
+ }
+
+ // If any of these tokens are followed by a token on a new line, we know that
+ // ASI cannot happen.
+ const PREVENT_ASI_AFTER_TOKENS = new Set([
+ // Binary operators
+ "*",
+ "/",
+ "%",
+ "+",
+ "-",
+ "<<",
+ ">>",
+ ">>>",
+ "<",
+ ">",
+ "<=",
+ ">=",
+ "instanceof",
+ "in",
+ "==",
+ "!=",
+ "===",
+ "!==",
+ "&",
+ "^",
+ "|",
+ "&&",
+ "||",
+ ",",
+ ".",
+ "=",
+ "*=",
+ "/=",
+ "%=",
+ "+=",
+ "-=",
+ "<<=",
+ ">>=",
+ ">>>=",
+ "&=",
+ "^=",
+ "|=",
+ // Unary operators
+ "delete",
+ "void",
+ "typeof",
+ "~",
+ "!",
+ "new",
+ // Function calls and grouped expressions
+ "(",
+ ]);
+
+ // If any of these tokens are on a line after the token before it, we know
+ // that ASI cannot happen.
+ const PREVENT_ASI_BEFORE_TOKENS = new Set([
+ // Binary operators
+ "*",
+ "/",
+ "%",
+ "<<",
+ ">>",
+ ">>>",
+ "<",
+ ">",
+ "<=",
+ ">=",
+ "instanceof",
+ "in",
+ "==",
+ "!=",
+ "===",
+ "!==",
+ "&",
+ "^",
+ "|",
+ "&&",
+ "||",
+ ",",
+ ".",
+ "=",
+ "*=",
+ "/=",
+ "%=",
+ "+=",
+ "-=",
+ "<<=",
+ ">>=",
+ ">>>=",
+ "&=",
+ "^=",
+ "|=",
+ // Function calls
+ "(",
+ ]);
+
+ /**
+ * Determine if a token can look like an identifier. More precisely,
+ * this determines if the token may end or start with a character from
+ * [A-Za-z0-9_].
+ *
+ * @param Object token
+ * The token we are looking at.
+ *
+ * @returns Boolean
+ * True if identifier-like.
+ */
+ function isIdentifierLike(token) {
+ const ttl = token.type.label;
+ return (
+ ttl == "name" || ttl == "num" || ttl == "privateId" || !!token.type.keyword
+ );
+ }
+
+ /**
+ * Determines if Automatic Semicolon Insertion (ASI) occurs between these
+ * tokens.
+ *
+ * @param Object token
+ * The current token.
+ * @param Object previousToken
+ * The previous token we added to the pretty printed results.
+ *
+ * @returns Boolean
+ * True if we believe ASI occurs.
+ */
+ function isASI(token, previousToken) {
+ if (!previousToken) {
+ return false;
+ }
+ if (token.loc.start.line === previousToken.loc.start.line) {
+ return false;
+ }
+ if (
+ previousToken.type.keyword == "return" ||
+ previousToken.type.keyword == "yield" ||
+ (previousToken.type.label == "name" && previousToken.value == "yield")
+ ) {
+ return true;
+ }
+ if (
+ PREVENT_ASI_AFTER_TOKENS.has(
+ previousToken.type.label || previousToken.type.keyword
+ )
+ ) {
+ return false;
+ }
+ if (PREVENT_ASI_BEFORE_TOKENS.has(token.type.label || token.type.keyword)) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Determine if we should add a newline after the given token.
+ *
+ * @param Object token
+ * The token we are looking at.
+ * @param Array stack
+ * The stack of open parens/curlies/brackets/etc.
+ *
+ * @returns Boolean
+ * True if we should add a newline.
+ */
+ function isLineDelimiter(token, stack) {
+ const ttl = token.type.label;
+ const top = stack.at(-1);
+ return (
+ (ttl == ";" && top != "(") ||
+ // Don't add a new line for empty object literals
+ (ttl == "{" && top == "{\n") ||
+ // Don't add a new line for empty array literals
+ (ttl == "[" && top == "[\n") ||
+ ((ttl == "," || ttl == "||" || ttl == "&&") && top != "(") ||
+ (ttl == ":" && (top == "case" || top == "default")) ||
+ (ttl == "(" && top == "(\n")
+ );
+ }
+
+ /**
+ * Determines if we need to add a space after the token we are about to add.
+ *
+ * @param Object token
+ * The token we are about to add to the pretty printed code.
+ * @param Object [previousToken]
+ * Optional previous token added to the pretty printed code.
+ */
+ function needsSpaceAfter(token, previousToken) {
+ if (previousToken && needsSpaceBetweenTokens(token, previousToken)) {
+ return true;
+ }
+
+ if (token.type.isAssign) {
+ return true;
+ }
+ if (token.type.binop != null && previousToken) {
+ return true;
+ }
+ if (token.type.label == "?") {
+ return true;
+ }
+ if (token.type.label == "=>") {
+ return true;
+ }
+
+ return false;
+ }
+
+ function needsSpaceBeforePreviousToken(previousToken) {
+ if (previousToken.type.isLoop) {
+ return true;
+ }
+ if (previousToken.type.isAssign) {
+ return true;
+ }
+ if (previousToken.type.binop != null) {
+ return true;
+ }
+ if (previousToken.value == "of") {
+ return true;
+ }
+
+ const previousTokenTypeLabel = previousToken.type.label;
+ if (previousTokenTypeLabel == "?") {
+ return true;
+ }
+ if (previousTokenTypeLabel == ":") {
+ return true;
+ }
+ if (previousTokenTypeLabel == ",") {
+ return true;
+ }
+ if (previousTokenTypeLabel == ";") {
+ return true;
+ }
+ if (previousTokenTypeLabel == "${") {
+ return true;
+ }
+ if (previousTokenTypeLabel == "=>") {
+ return true;
+ }
+ return false;
+ }
+
+ function isBreakContinueOrReturnStatement(previousTokenKeyword) {
+ return (
+ previousTokenKeyword == "break" ||
+ previousTokenKeyword == "continue" ||
+ previousTokenKeyword == "return"
+ );
+ }
+
+ function needsSpaceBeforePreviousTokenKeywordAfterNotDot(previousTokenKeyword) {
+ return (
+ previousTokenKeyword != "debugger" &&
+ previousTokenKeyword != "null" &&
+ previousTokenKeyword != "true" &&
+ previousTokenKeyword != "false" &&
+ previousTokenKeyword != "this" &&
+ previousTokenKeyword != "default"
+ );
+ }
+
+ function needsSpaceBeforeClosingParen(tokenTypeLabel) {
+ return (
+ tokenTypeLabel != ")" &&
+ tokenTypeLabel != "]" &&
+ tokenTypeLabel != ";" &&
+ tokenTypeLabel != "," &&
+ tokenTypeLabel != "."
+ );
+ }
+
+ /**
+ * Determines if we need to add a space between the previous token we added and
+ * the token we are about to add.
+ *
+ * @param Object token
+ * The token we are about to add to the pretty printed code.
+ * @param Object previousToken
+ * The previous token added to the pretty printed code.
+ */
+ function needsSpaceBetweenTokens(token, previousToken) {
+ if (needsSpaceBeforePreviousToken(previousToken)) {
+ return true;
+ }
+
+ const ltt = previousToken.type.label;
+ if (ltt == "num" && token.type.label == ".") {
+ return true;
+ }
+
+ const ltk = previousToken.type.keyword;
+ const ttl = token.type.label;
+ if (ltk != null && ttl != ".") {
+ if (isBreakContinueOrReturnStatement(ltk)) {
+ return ttl != ";";
+ }
+ if (needsSpaceBeforePreviousTokenKeywordAfterNotDot(ltk)) {
+ return true;
+ }
+ }
+
+ if (ltt == ")" && needsSpaceBeforeClosingParen(ttl)) {
+ return true;
+ }
+
+ if (isIdentifierLike(token) && isIdentifierLike(previousToken)) {
+ // We must emit a space to avoid merging the tokens.
+ return true;
+ }
+
+ if (token.type.label == "{" && previousToken.type.label == "name") {
+ return true;
+ }
+
+ return false;
+ }
+
+ function needsSpaceBeforeClosingCurlyBracket(tokenTypeKeyword) {
+ return (
+ tokenTypeKeyword == "else" ||
+ tokenTypeKeyword == "catch" ||
+ tokenTypeKeyword == "finally"
+ );
+ }
+
+ function needsLineBreakBeforeClosingCurlyBracket(tokenTypeLabel) {
+ return (
+ tokenTypeLabel != "(" &&
+ tokenTypeLabel != ";" &&
+ tokenTypeLabel != "," &&
+ tokenTypeLabel != ")" &&
+ tokenTypeLabel != "." &&
+ tokenTypeLabel != "template" &&
+ tokenTypeLabel != "`"
+ );
+ }
+
+ const escapeCharacters = {
+ // Backslash
+ "\\": "\\\\",
+ // Newlines
+ "\n": "\\n",
+ // Carriage return
+ "\r": "\\r",
+ // Tab
+ "\t": "\\t",
+ // Vertical tab
+ "\v": "\\v",
+ // Form feed
+ "\f": "\\f",
+ // Null character
+ "\0": "\\x00",
+ // Line separator
+ "\u2028": "\\u2028",
+ // Paragraph separator
+ "\u2029": "\\u2029",
+ // Single quotes
+ "'": "\\'",
+ };
+
+ // eslint-disable-next-line prefer-template
+ const regExpString = "(" + Object.values(escapeCharacters).join("|") + ")";
+ const escapeCharactersRegExp = new RegExp(regExpString, "g");
+
+ function sanitizerReplaceFunc(_, c) {
+ return escapeCharacters[c];
+ }
+
+ /**
+ * Make sure that we output the escaped character combination inside string
+ * literals instead of various problematic characters.
+ */
+ function sanitize(str) {
+ return str.replace(escapeCharactersRegExp, sanitizerReplaceFunc);
+ }
+
+ /**
+ * Returns true if the given token type belongs on the stack.
+ */
+ function belongsOnStack(token) {
+ const ttl = token.type.label;
+ const ttk = token.type.keyword;
+ return (
+ ttl == "{" ||
+ ttl == "(" ||
+ ttl == "[" ||
+ ttl == "?" ||
+ ttl == "${" ||
+ ttk == "do" ||
+ ttk == "switch" ||
+ ttk == "case" ||
+ ttk == "default"
+ );
+ }
+
+ var { SourceMapGenerator } = requireSourceMap();
+
+ const sourceMapGeneratorByTaskId = new Map();
+
+ function prettyPrint({ url, indent, sourceText }) {
+ const { code, map: sourceMapGenerator } = prettyFast(sourceText, {
+ url,
+ indent,
+ });
+
+ return {
+ code,
+ sourceMap: sourceMapGenerator.toJSON(),
+ };
+ }
+
+ function prettyPrintInlineScript({
+ taskId,
+ url,
+ indent,
+ sourceText,
+ originalStartLine,
+ originalStartColumn,
+ generatedStartLine,
+ }) {
+ let taskSourceMapGenerator;
+ if (!sourceMapGeneratorByTaskId.has(taskId)) {
+ taskSourceMapGenerator = new SourceMapGenerator({ file: url });
+ sourceMapGeneratorByTaskId.set(taskId, taskSourceMapGenerator);
+ } else {
+ taskSourceMapGenerator = sourceMapGeneratorByTaskId.get(taskId);
+ }
+
+ const { code } = prettyFast(sourceText, {
+ url,
+ indent,
+ sourceMapGenerator: taskSourceMapGenerator,
+ /*
+ * By default prettyPrint will trim the text, and we'd have the pretty text displayed
+ * just after the script tag, e.g.:
+ *
+ * ```
+ * <script>if (true) {
+ * something()
+ * }
+ * </script>
+ * ```
+ *
+ * We want the text to start on a new line, so prepend a line break, so we get
+ * something like:
+ *
+ * ```
+ * <script>
+ * if (true) {
+ * something()
+ * }
+ * </script>
+ * ```
+ */
+ prefixWithNewLine: true,
+ originalStartLine,
+ originalStartColumn,
+ generatedStartLine,
+ });
+
+ // When a taskId was passed, we only return the pretty printed text.
+ // The source map should be retrieved with getSourceMapForTask.
+ return code;
+ }
+
+ /**
+ * Get the source map for a pretty-print task
+ *
+ * @param {Integer} taskId: The taskId that was used to call prettyPrint
+ * @returns {Object} A source map object
+ */
+ function getSourceMapForTask(taskId) {
+ if (!sourceMapGeneratorByTaskId.has(taskId)) {
+ return null;
+ }
+
+ const taskSourceMapGenerator = sourceMapGeneratorByTaskId.get(taskId);
+ sourceMapGeneratorByTaskId.delete(taskId);
+ return taskSourceMapGenerator.toJSON();
+ }
+
+ self.onmessage = workerUtilsExports.workerHandler({
+ prettyPrint,
+ prettyPrintInlineScript,
+ getSourceMapForTask,
+ });
+
+}));
diff --git a/devtools/client/debugger/dist/search-worker.js b/devtools/client/debugger/dist/search-worker.js
new file mode 100644
index 0000000000..727f001ea3
--- /dev/null
+++ b/devtools/client/debugger/dist/search-worker.js
@@ -0,0 +1,402 @@
+(function (factory) {
+ typeof define === 'function' && define.amd ? define(factory) :
+ factory();
+})((function () { 'use strict';
+
+ (function() {
+ const env = {"NODE_ENV":"production"};
+ try {
+ if (process) {
+ process.env = Object.assign({}, process.env);
+ Object.assign(process.env, env);
+ return;
+ }
+ } catch (e) {} // avoid ReferenceError: process is not defined
+ globalThis.process = { env:env };
+ })();
+
+ /* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+ function isNode() {
+ try {
+ return process.release.name == "node";
+ } catch (e) {
+ return false;
+ }
+ }
+
+ function isNodeTest() {
+ return isNode() && process.env.NODE_ENV != "production";
+ }
+
+ let assert;
+ // TODO: try to enable these assertions on mochitest by also enabling it on:
+ // import flags from "devtools/shared/flags";
+ // if (flags.testing)
+ // Unfortunately it throws a lot on mochitests...
+
+ if (isNodeTest()) {
+ assert = function (condition, message) {
+ if (!condition) {
+ throw new Error(`Assertion failure: ${message}`);
+ }
+ };
+ } else {
+ assert = function () {};
+ }
+ var assert$1 = assert;
+
+ /* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+ function escapeRegExp(str) {
+ const reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
+ return str.replace(reRegExpChar, "\\$&");
+ }
+
+ /**
+ * Ignore doing outline matches for less than 3 whitespaces
+ *
+ * @memberof utils/source-search
+ * @static
+ */
+ function ignoreWhiteSpace(str) {
+ return /^\s{0,2}$/.test(str) ? "(?!\\s*.*)" : str;
+ }
+
+ function wholeMatch(query, wholeWord) {
+ if (query === "" || !wholeWord) {
+ return query;
+ }
+
+ return `\\b${query}\\b`;
+ }
+
+ function buildFlags(caseSensitive, isGlobal) {
+ if (caseSensitive && isGlobal) {
+ return "g";
+ }
+
+ if (!caseSensitive && isGlobal) {
+ return "gi";
+ }
+
+ if (!caseSensitive && !isGlobal) {
+ return "i";
+ }
+
+ return null;
+ }
+
+ function buildQuery(
+ originalQuery,
+ modifiers,
+ { isGlobal = false, ignoreSpaces = false }
+ ) {
+ const { caseSensitive, regexMatch, wholeWord } = modifiers;
+
+ if (originalQuery === "") {
+ return new RegExp(originalQuery);
+ }
+
+ // Remove the backslashes at the end of the query as it
+ // breaks the RegExp
+ let query = originalQuery.replace(/\\$/, "");
+
+ // If we don't want to do a regexMatch, we need to escape all regex related characters
+ // so they would actually match.
+ if (!regexMatch) {
+ query = escapeRegExp(query);
+ }
+
+ // ignoreWhiteSpace might return a negative lookbehind, and in such case, we want it
+ // to be consumed as a RegExp part by the callsite, so this needs to be called after
+ // the regexp is escaped.
+ if (ignoreSpaces) {
+ query = ignoreWhiteSpace(query);
+ }
+
+ query = wholeMatch(query, wholeWord);
+ const flags = buildFlags(caseSensitive, isGlobal);
+
+ if (flags) {
+ return new RegExp(query, flags);
+ }
+
+ return new RegExp(query);
+ }
+
+ function getMatches(query, text, options) {
+ if (!query || !text || !options) {
+ return [];
+ }
+ const regexQuery = buildQuery(query, options, {
+ isGlobal: true,
+ });
+ const matchedLocations = [];
+ const lines = text.split("\n");
+ for (let i = 0; i < lines.length; i++) {
+ let singleMatch;
+ const line = lines[i];
+ while ((singleMatch = regexQuery.exec(line)) !== null) {
+ // Flow doesn't understand the test above.
+ if (!singleMatch) {
+ throw new Error("no singleMatch");
+ }
+
+ matchedLocations.push({
+ line: i,
+ ch: singleMatch.index,
+ match: singleMatch[0],
+ });
+
+ // When the match is an empty string the regexQuery.lastIndex will not
+ // change resulting in an infinite loop so we need to check for this and
+ // increment it manually in that case. See issue #7023
+ if (singleMatch[0] === "") {
+ assert$1(
+ !regexQuery.unicode,
+ "lastIndex++ can cause issues in unicode mode"
+ );
+ regexQuery.lastIndex++;
+ }
+ }
+ }
+ return matchedLocations;
+ }
+
+ function findSourceMatches(content, queryText, options) {
+ if (queryText == "") {
+ return [];
+ }
+
+ const text = content.value;
+ const lines = text.split("\n");
+
+ return getMatches(queryText, text, options).map(({ line, ch, match }) => {
+ const { value, matchIndex } = truncateLine(lines[line], ch);
+ return {
+ line: line + 1,
+ column: ch,
+
+ matchIndex,
+ match,
+ value,
+ };
+ });
+ }
+
+ // This is used to find start of a word, so that cropped string look nice
+ const startRegex = /([ !@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?])/g;
+ // Similarly, find
+ const endRegex = new RegExp(
+ [
+ "([ !@#$%^&*()_+-=[]{};':\"\\|,.<>/?])",
+ '[^ !@#$%^&*()_+-=[]{};\':"\\|,.<>/?]*$"/',
+ ].join("")
+ );
+ // For texts over 100 characters this truncates the text (for display)
+ // around the context of the matched text.
+ function truncateLine(text, column) {
+ if (text.length < 100) {
+ return {
+ matchIndex: column,
+ value: text,
+ };
+ }
+
+ // Initially take 40 chars left to the match
+ const offset = Math.max(column - 40, 0);
+ // 400 characters should be enough to figure out the context of the match
+ const truncStr = text.slice(offset, column + 400);
+ let start = truncStr.search(startRegex);
+ let end = truncStr.search(endRegex);
+
+ if (start > column) {
+ // No word separator found before the match, so we take all characters
+ // before the match
+ start = -1;
+ }
+ if (end < column) {
+ end = truncStr.length;
+ }
+ const value = truncStr.slice(start + 1, end);
+
+ return {
+ matchIndex: column - start - offset - 1,
+ value,
+ };
+ }
+
+ var workerUtils = {exports: {}};
+
+ var hasRequiredWorkerUtils;
+
+ function requireWorkerUtils () {
+ if (hasRequiredWorkerUtils) return workerUtils.exports;
+ hasRequiredWorkerUtils = 1;
+ (function (module) {
+
+ class WorkerDispatcher {
+ #msgId = 1;
+ #worker = null;
+ // Map of message ids -> promise resolution functions, for dispatching worker responses
+ #pendingCalls = new Map();
+ #url = "";
+
+ constructor(url) {
+ this.#url = url;
+ }
+
+ start() {
+ // When running in debugger jest test, we don't have access to ChromeWorker
+ if (typeof ChromeWorker == "function") {
+ this.#worker = new ChromeWorker(this.#url);
+ } else {
+ this.#worker = new Worker(this.#url);
+ }
+ this.#worker.onerror = err => {
+ console.error(`Error in worker ${this.#url}`, err.message);
+ };
+ this.#worker.addEventListener("message", this.#onMessage);
+ }
+
+ stop() {
+ if (!this.#worker) {
+ return;
+ }
+
+ this.#worker.removeEventListener("message", this.#onMessage);
+ this.#worker.terminate();
+ this.#worker = null;
+ this.#pendingCalls.clear();
+ }
+
+ task(method, { queue = false } = {}) {
+ const calls = [];
+ const push = args => {
+ return new Promise((resolve, reject) => {
+ if (queue && calls.length === 0) {
+ Promise.resolve().then(flush);
+ }
+
+ calls.push({ args, resolve, reject });
+
+ if (!queue) {
+ flush();
+ }
+ });
+ };
+
+ const flush = () => {
+ const items = calls.slice();
+ calls.length = 0;
+
+ if (!this.#worker) {
+ this.start();
+ }
+
+ const id = this.#msgId++;
+ this.#worker.postMessage({
+ id,
+ method,
+ calls: items.map(item => item.args),
+ });
+
+ this.#pendingCalls.set(id, items);
+ };
+
+ return (...args) => push(args);
+ }
+
+ invoke(method, ...args) {
+ return this.task(method)(...args);
+ }
+
+ #onMessage = ({ data: result }) => {
+ const items = this.#pendingCalls.get(result.id);
+ this.#pendingCalls.delete(result.id);
+ if (!items) {
+ return;
+ }
+
+ if (!this.#worker) {
+ return;
+ }
+
+ result.results.forEach((resultData, i) => {
+ const { resolve, reject } = items[i];
+
+ if (resultData.error) {
+ const err = new Error(resultData.message);
+ err.metadata = resultData.metadata;
+ reject(err);
+ } else {
+ resolve(resultData.response);
+ }
+ });
+ };
+ }
+
+ function workerHandler(publicInterface) {
+ return function (msg) {
+ const { id, method, calls } = msg.data;
+
+ Promise.all(
+ calls.map(args => {
+ try {
+ const response = publicInterface[method].apply(undefined, args);
+ if (response instanceof Promise) {
+ return response.then(
+ val => ({ response: val }),
+ err => asErrorMessage(err)
+ );
+ }
+ return { response };
+ } catch (error) {
+ return asErrorMessage(error);
+ }
+ })
+ ).then(results => {
+ globalThis.postMessage({ id, results });
+ });
+ };
+ }
+
+ function asErrorMessage(error) {
+ if (typeof error === "object" && error && "message" in error) {
+ // Error can't be sent via postMessage, so be sure to convert to
+ // string.
+ return {
+ error: true,
+ message: error.message,
+ metadata: error.metadata,
+ };
+ }
+
+ return {
+ error: true,
+ message: error == null ? error : error.toString(),
+ metadata: undefined,
+ };
+ }
+
+ // Might be loaded within a worker thread where `module` isn't available.
+ {
+ module.exports = {
+ WorkerDispatcher,
+ workerHandler,
+ };
+ }
+ } (workerUtils));
+ return workerUtils.exports;
+ }
+
+ var workerUtilsExports = requireWorkerUtils();
+
+ self.onmessage = workerUtilsExports.workerHandler({ getMatches, findSourceMatches });
+
+}));
diff --git a/devtools/client/debugger/images/arrow-down.svg b/devtools/client/debugger/images/arrow-down.svg
new file mode 100644
index 0000000000..3b180d1158
--- /dev/null
+++ b/devtools/client/debugger/images/arrow-down.svg
@@ -0,0 +1,6 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12" width="12" height="12">
+ <path d="M6.354 8.354a.5.5 0 0 1-.708 0l-4.5-4.5a.5.5 0 1 1 .708-.708L6 7.293l4.146-4.147a.5.5 0 0 1 .708.708l-4.5 4.5z"/>
+</svg>
diff --git a/devtools/client/debugger/images/arrow-up.svg b/devtools/client/debugger/images/arrow-up.svg
new file mode 100644
index 0000000000..7fa57c6616
--- /dev/null
+++ b/devtools/client/debugger/images/arrow-up.svg
@@ -0,0 +1,6 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12" width="12" height="12">
+ <path d="M5.646 2.647a.5.5 0 0 1 .708 0l4.5 4.5a.5.5 0 0 1-.708.708L6 3.708 1.854 7.855a.5.5 0 1 1-.708-.708l4.5-4.5z"/>
+</svg>
diff --git a/devtools/client/debugger/images/arrow.svg b/devtools/client/debugger/images/arrow.svg
new file mode 100644
index 0000000000..7c723f6985
--- /dev/null
+++ b/devtools/client/debugger/images/arrow.svg
@@ -0,0 +1,6 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 10 10" width="10" height="10">
+ <path fill="context-fill black" d="M5 8c-.25 0-.35-.1-.65-.4l-3.1-3.35C.75 3.7 1.1 3 1.75 3h6.5c.65 0 1 .7.5 1.25L5.65 7.6c-.3.3-.4.4-.65.4z"/>
+</svg>
diff --git a/devtools/client/debugger/images/blackBox.svg b/devtools/client/debugger/images/blackBox.svg
new file mode 100644
index 0000000000..ab4c0401ec
--- /dev/null
+++ b/devtools/client/debugger/images/blackBox.svg
@@ -0,0 +1,9 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M12.9806 2.31229C12.4406 1.52012 11.531 1 10.5 1H5.5C3.84315 1 1.5 3 1.5 5V12C1.5 12.518 1.63128 13.0053 1.86238 13.4305L1.14645 14.1464C0.951185 14.3417 0.951185 14.6583 1.14645 14.8536C1.34171 15.0488 1.65829 15.0488 1.85355 14.8536L14.8536 1.85355C15.0488 1.65829 15.0488 1.34171 14.8536 1.14645C14.6583 0.951184 14.3417 0.951184 14.1464 1.14645L12.9806 2.31229ZM2.61707 12.6758C2.54129 12.4647 2.5 12.2372 2.5 12V6H5C5.39782 6 5.77936 5.84196 6.06066 5.56066C6.34196 5.27936 6.5 4.89782 6.5 4.5V2H10.5C11.2561 2 11.9143 2.4196 12.2542 3.03866L8.29289 7H6C5.86739 7 5.74021 7.05268 5.64645 7.14645C5.55268 7.24021 5.5 7.36739 5.5 7.5C5.5 7.63261 5.55268 7.75979 5.64645 7.85355C5.74021 7.94732 5.86739 8 6 8H7.29289L6.29289 9H4C3.86739 9 3.74021 9.05268 3.64645 9.14645C3.55268 9.24021 3.5 9.36739 3.5 9.5C3.5 9.63261 3.55268 9.75979 3.64645 9.85355C3.74021 9.94732 3.86739 10 4 10H5.29289L2.61707 12.6758ZM5.5 2V4.5C5.5 4.78 5.28 5 5 5H2.5C2.5 3.89543 4.39543 2 5.5 2Z"/>
+ <path d="M3.56333 14.8509L4.41595 13.9983C4.44382 13.9994 4.47184 14 4.5 14H10.5C11.6046 14 12.5 13.1046 12.5 12V5.91421L13.5 4.91421V12C13.5 13.6569 12.1569 15 10.5 15H4.5C4.17291 15 3.85805 14.9477 3.56333 14.8509Z"/>
+ <path d="M9.41421 9H11C11.28 9 11.5 9.22 11.5 9.5C11.5 9.63261 11.4473 9.75979 11.3536 9.85355C11.2598 9.94732 11.1326 10 11 10H8.41421L9.41421 9Z"/>
+ <path d="M6.41421 12L7.41421 11H11C11.28 11 11.5 11.22 11.5 11.5C11.5 11.6326 11.4473 11.7598 11.3536 11.8536C11.2598 11.9473 11.1326 12 11 12H6.41421Z"/>
+</svg>
diff --git a/devtools/client/debugger/images/breadcrumbs-divider.svg b/devtools/client/debugger/images/breadcrumbs-divider.svg
new file mode 100644
index 0000000000..f41aa7fa0a
--- /dev/null
+++ b/devtools/client/debugger/images/breadcrumbs-divider.svg
@@ -0,0 +1,18 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" width="5" height="7">
+ <defs>
+ <linearGradient id="b">
+ <stop offset="0" stop-color="#9a9aba"/>
+ <stop offset="1" stop-color="#a6a6c2"/>
+ </linearGradient>
+ <linearGradient id="a">
+ <stop offset="0" stop-color="#8e8eb2"/>
+ <stop offset="1" stop-color="#9a9aba"/>
+ </linearGradient>
+ <linearGradient x1="3.616" y1="3.893" x2="1.285" y2="-.757" id="d" href="#a" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1 0 0 .8684 0 1046.257)"/>
+ <linearGradient x1="2.232" y1="4.162" x2=".629" y2=".966" id="c" href="#b" gradientUnits="userSpaceOnUse" gradientTransform="matrix(1 0 0 .8684 0 1046.257)"/>
+ </defs>
+ <path d="M.2 1045.562l4.6 3.3-4.6 3.3 2-3.3z" fill="url(#c)" stroke="url(#d)" stroke-width=".4" stroke-linejoin="round" transform="translate(0 -1045.362)"/>
+</svg> \ No newline at end of file
diff --git a/devtools/client/debugger/images/breakpoint.svg b/devtools/client/debugger/images/breakpoint.svg
new file mode 100644
index 0000000000..95a6ef519c
--- /dev/null
+++ b/devtools/client/debugger/images/breakpoint.svg
@@ -0,0 +1,6 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60 15" width="60" height="15" stroke="currentColor">
+ <path d="M53.07.5H1.5c-.54 0-1 .46-1 1v12c0 .54.46 1 1 1h51.57c.58 0 1.15-.26 1.53-.7l4.7-6.3-4.7-6.3c-.38-.44-.95-.7-1.53-.7z"/>
+</svg>
diff --git a/devtools/client/debugger/images/case-match.svg b/devtools/client/debugger/images/case-match.svg
new file mode 100644
index 0000000000..5457bfb5dd
--- /dev/null
+++ b/devtools/client/debugger/images/case-match.svg
@@ -0,0 +1,6 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 16" stroke="none" fillrule="evenodd" fill="context-fill">
+ <path d="M10.919,13 L9.463,13 C9.29966585,13 9.16550052,12.9591671 9.0605,12.8775 C8.95549947,12.7958329 8.8796669,12.6943339 8.833,12.573 L8.077,10.508 L3.884,10.508 L3.128,12.573 C3.09066648,12.6803339 3.01716722,12.7783329 2.9075,12.867 C2.79783279,12.9556671 2.66366746,13 2.505,13 L1.042,13 L5.018,2.878 L6.943,2.878 L10.919,13 Z M4.367,9.178 L7.594,9.178 L6.362,5.811 C6.30599972,5.66166592 6.24416701,5.48550102 6.1765,5.2825 C6.108833,5.07949898 6.04233366,4.85900119 5.977,4.621 C5.91166634,4.85900119 5.84750032,5.08066564 5.7845,5.286 C5.72149969,5.49133436 5.65966697,5.67099923 5.599,5.825 L4.367,9.178 Z M18.892,13 L18.115,13 C17.9516658,13 17.8233338,12.9755002 17.73,12.9265 C17.6366662,12.8774998 17.5666669,12.7783341 17.52,12.629 L17.366,12.118 C17.1839991,12.2813341 17.0055009,12.4248327 16.8305,12.5485 C16.6554991,12.6721673 16.4746676,12.7759996 16.288,12.86 C16.1013324,12.9440004 15.903001,13.0069998 15.693,13.049 C15.4829989,13.0910002 15.2496679,13.112 14.993,13.112 C14.6896651,13.112 14.4096679,13.0711671 14.153,12.9895 C13.896332,12.9078329 13.6758342,12.7853342 13.4915,12.622 C13.3071657,12.4586658 13.1636672,12.2556679 13.061,12.013 C12.9583328,11.7703321 12.907,11.4880016 12.907,11.166 C12.907,10.895332 12.9781659,10.628168 13.1205,10.3645 C13.262834,10.100832 13.499665,9.8628344 13.831,9.6505 C14.162335,9.43816561 14.6033306,9.2620007 15.154,9.122 C15.7046694,8.9819993 16.3883292,8.90266676 17.205,8.884 L17.205,8.464 C17.205,7.98333093 17.103501,7.62750116 16.9005,7.3965 C16.697499,7.16549885 16.4023352,7.05 16.015,7.05 C15.7349986,7.05 15.5016676,7.08266634 15.315,7.148 C15.1283324,7.21333366 14.9661673,7.28683292 14.8285,7.3685 C14.6908326,7.45016707 14.5636672,7.52366634 14.447,7.589 C14.3303327,7.65433366 14.2020007,7.687 14.062,7.687 C13.9453327,7.687 13.8450004,7.65666697 13.761,7.596 C13.6769996,7.53533303 13.6093336,7.46066711 13.558,7.372 L13.243,6.819 C14.0690041,6.06299622 15.0653275,5.685 16.232,5.685 C16.6520021,5.685 17.0264983,5.75383264 17.3555,5.8915 C17.6845016,6.02916736 17.9633322,6.22049877 18.192,6.4655 C18.4206678,6.71050122 18.5944994,7.00333163 18.7135,7.344 C18.8325006,7.68466837 18.892,8.05799797 18.892,8.464 L18.892,13 Z M15.532,11.922 C15.7093342,11.922 15.8726659,11.9056668 16.022,11.873 C16.1713341,11.8403332 16.3124993,11.7913337 16.4455,11.726 C16.5785006,11.6606663 16.7068327,11.5801671 16.8305,11.4845 C16.9541673,11.3888329 17.0789993,11.2756673 17.205,11.145 L17.205,9.934 C16.7009975,9.95733345 16.279835,10.0004997 15.9415,10.0635 C15.603165,10.1265003 15.3313343,10.2069995 15.126,10.305 C14.9206656,10.4030005 14.7748337,10.5173327 14.6885,10.648 C14.6021662,10.7786673 14.559,10.9209992 14.559,11.075 C14.559,11.3783349 14.6488324,11.5953327 14.8285,11.726 C15.0081675,11.8566673 15.2426652,11.922 15.532,11.922 L15.532,11.922 Z"></path>
+</svg>
diff --git a/devtools/client/debugger/images/column-marker.svg b/devtools/client/debugger/images/column-marker.svg
new file mode 100644
index 0000000000..6b58715a59
--- /dev/null
+++ b/devtools/client/debugger/images/column-marker.svg
@@ -0,0 +1,6 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 11 13" width="11" height="13">
+ <path d="M5.07.5H1.5c-.54 0-1 .46-1 1v10c0 .54.46 1 1 1h3.57c.58 0 1.15-.26 1.53-.7l3.7-5.3-3.7-5.3C6.22.76 5.65.5 5.07.5z"/>
+</svg>
diff --git a/devtools/client/debugger/images/command-chevron.svg b/devtools/client/debugger/images/command-chevron.svg
new file mode 100644
index 0000000000..8ed0338bcf
--- /dev/null
+++ b/devtools/client/debugger/images/command-chevron.svg
@@ -0,0 +1,6 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+ <path d="M2.293 2.293a1 1 0 0 1 1.414 0l5 5a1 1 0 0 1 0 1.414l-5 5a1 1 0 0 1-1.414-1.414L6.586 8 2.293 3.707a1 1 0 0 1 0-1.414zM8.293 2.293a1 1 0 0 1 1.414 0l5 5a1 1 0 0 1 0 1.414l-5 5a1 1 0 0 1-1.414-1.414L12.586 8 8.293 3.707a1 1 0 0 1 0-1.414z"/>
+</svg>
diff --git a/devtools/client/debugger/images/disable-pausing.svg b/devtools/client/debugger/images/disable-pausing.svg
new file mode 100644
index 0000000000..b073ec5f44
--- /dev/null
+++ b/devtools/client/debugger/images/disable-pausing.svg
@@ -0,0 +1,15 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none"
+ xmlns="http://www.w3.org/2000/svg">
+ <g clip-path="url(#clip0)">
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M8.41753 2.35H2.5C1.83696 2.35 1.20107 2.61339 0.732233 3.08223C0.263392 3.55107 0 4.18696 0 4.85V9.85C0 10.513 0.263392 11.1489 0.732233 11.6178C0.807612 11.6931 0.88731 11.7632 0.970743 11.8277L2.2054 10.2563C2.08021 10.1663 2 10.0191 2 9.85V4.85C2 4.71739 2.05268 4.59021 2.14645 4.49644C2.24021 4.40268 2.36739 4.35 2.5 4.35H6.8461L8.41753 2.35ZM7.21882 10.35H10.05L13.65 7.35L11.188 5.29832L12.4207 3.72947L15.74 6.68C15.9058 6.86375 15.9976 7.10248 15.9976 7.35C15.9976 7.59752 15.9058 7.83625 15.74 8.02L11.24 12.02C11.1465 12.1236 11.0324 12.2065 10.9049 12.2633C10.7775 12.3201 10.6395 12.3497 10.5 12.35H5.64739L7.21882 10.35Z" fill="black"/>
+ <line x1="2.0815" y1="13.5959" x2="11.8459" y2="1.1685" stroke="black" stroke-width="2" stroke-linecap="round"/>
+ </g>
+ <defs>
+ <clipPath id="clip0">
+ <rect width="16" height="16" fill="white"/>
+ </clipPath>
+ </defs>
+</svg>
diff --git a/devtools/client/debugger/images/enable-pausing.svg b/devtools/client/debugger/images/enable-pausing.svg
new file mode 100644
index 0000000000..54d7c3676d
--- /dev/null
+++ b/devtools/client/debugger/images/enable-pausing.svg
@@ -0,0 +1,15 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none"
+ xmlns="http://www.w3.org/2000/svg">
+ <g clip-path="url(#clip0)">
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M8.41753 2.35H2.5C1.83696 2.35 1.20107 2.61339 0.732233 3.08223C0.263392 3.55107 0 4.18696 0 4.85V9.85C0 10.513 0.263392 11.1489 0.732233 11.6178C0.807612 11.6931 0.88731 11.7632 0.970743 11.8277L8.41753 2.35ZM5.64739 12.35H10.5C10.6395 12.3497 10.7775 12.3201 10.9049 12.2633C11.0324 12.2065 11.1465 12.1236 11.24 12.02L15.74 8.02C15.9058 7.83625 15.9976 7.59752 15.9976 7.35C15.9976 7.10248 15.9058 6.86375 15.74 6.68L12.4207 3.72947L5.64739 12.35Z" fill="black"/>
+ <line x1="2.0815" y1="13.5959" x2="11.8459" y2="1.1685" stroke="black" stroke-width="2" stroke-linecap="round"/>
+ </g>
+ <defs>
+ <clipPath id="clip0">
+ <rect width="16" height="16" fill="white"/>
+ </clipPath>
+ </defs>
+</svg>
diff --git a/devtools/client/debugger/images/file-small.svg b/devtools/client/debugger/images/file-small.svg
new file mode 100644
index 0000000000..ece2cc97de
--- /dev/null
+++ b/devtools/client/debugger/images/file-small.svg
@@ -0,0 +1,6 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12" width="12" height="12">
+ <path d="M1 1a1 1 0 0 1 1-1h5.74a1 1 0 0 1 .82.42l2.25 3.16a1 1 0 0 1 .19.58V11a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V1zm6.74 0H2v10h8V4.16L7.74 1zM7 4V1h1v3h2v1H8a1 1 0 0 1-1-1z"/>
+</svg>
diff --git a/devtools/client/debugger/images/folder.svg b/devtools/client/debugger/images/folder.svg
new file mode 100644
index 0000000000..a65b345bcc
--- /dev/null
+++ b/devtools/client/debugger/images/folder.svg
@@ -0,0 +1,6 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+ <path d="M1 3a1 1 0 0 1 1-1h5a1 1 0 0 1 1 1v1h6a1 1 0 0 1 1 1v8a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V3zm6 0H2v1h5V3zM2 5v8h12V5H2z"/>
+</svg>
diff --git a/devtools/client/debugger/images/globe-small.svg b/devtools/client/debugger/images/globe-small.svg
new file mode 100644
index 0000000000..2c66eaa3ba
--- /dev/null
+++ b/devtools/client/debugger/images/globe-small.svg
@@ -0,0 +1,7 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12" width="12" height="12" fill="context-fill">
+ <path d="M6 1a5 5 0 1 0 0 10A5 5 0 0 0 6 1zM0 6a6 6 0 1 1 12 0A6 6 0 0 1 0 6zM1 4h10v1H1V4zM1 7h10v1H1V7z"/>
+ <path fill-rule="evenodd" d="M7.23 9.8C7.69 8.88 8 7.54 8 6s-.31-2.88-.77-3.8C6.73 1.23 6.25 1 6 1s-.74.23-1.23 1.2A8.74 8.74 0 0 0 4 6c0 1.54.31 2.88.77 3.8.5.97.98 1.2 1.23 1.2s.74-.23 1.23-1.2zM6 12c1.66 0 3-2.69 3-6S7.66 0 6 0 3 2.69 3 6s1.34 6 3 6z"/>
+</svg>
diff --git a/devtools/client/debugger/images/globe.svg b/devtools/client/debugger/images/globe.svg
new file mode 100644
index 0000000000..6d03745a52
--- /dev/null
+++ b/devtools/client/debugger/images/globe.svg
@@ -0,0 +1,9 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+ <path d="M2 5h12v1H2V5zM2 10h12v1H2v-1zM11.02 12.69C10.42 13.89 9.42 15 8 15c-1.41 0-2.42-1.12-3.02-2.31A10.72 10.72 0 0 1 4 8c0-1.78.36-3.44.98-4.69C5.58 2.11 6.58 1 8 1c1.41 0 2.42 1.12 3.02 2.31.62 1.25.98 2.91.98 4.69 0 1.78-.36 3.44-.98 4.69zM8 14c1.66 0 3-2.69 3-6S9.66 2 8 2 5 4.69 5 8s1.34 6 3 6zM16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zm-8 6A6 6 0 1 0 8 2a6 6 0 0 0 0 12z"/>
+</svg>
diff --git a/devtools/client/debugger/images/help.svg b/devtools/client/debugger/images/help.svg
new file mode 100644
index 0000000000..58c2274df4
--- /dev/null
+++ b/devtools/client/debugger/images/help.svg
@@ -0,0 +1,7 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" v="2">
+ <path fill="context-fill" d="M13.15 17a1.15 1.15 0 1 1-2.3 0 1.15 1.15 0 0 1 2.3 0zM10.5 9.5c0-.764.616-1.5 1.5-1.5s1.5.736 1.5 1.5c0 .311-.144.635-.408.974-.199.254-.386.43-.57.6-.077.072-.153.143-.23.219a1.676 1.676 0 0 1-.048.045c-.13.117-.466.42-.698.757C11.22 12.569 11 13.18 11 14a1 1 0 1 0 2 0c0-.431.106-.645.194-.772.051-.074.114-.144.197-.225.04-.039.08-.075.129-.12l.003-.002.009-.008c.05-.045.114-.104.175-.166l.086-.08a8.13 8.13 0 0 0 .876-.924c.4-.512.831-1.264.831-2.203C15.5 7.764 14.116 6 12 6S8.5 7.764 8.5 9.5a1 1 0 1 0 2 0z"></path>
+ <path fill="context-fill" fill-rule="evenodd" clip-rule="evenodd" d="M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2 2 6.477 2 12s4.477 10 10 10zm0-2a8 8 0 1 0 0-16 8 8 0 0 0 0 16z"></path>
+</svg>
diff --git a/devtools/client/debugger/images/home.svg b/devtools/client/debugger/images/home.svg
new file mode 100644
index 0000000000..275108f218
--- /dev/null
+++ b/devtools/client/debugger/images/home.svg
@@ -0,0 +1,6 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
+ <path d="M15.7 7.3l-7-7c-.4-.4-1-.4-1.4 0l-7 7c-.4.4-.4 1 0 1.4.4.4 1 .4 1.4 0l.3-.3V13c0 1.7 1.3 3 3 3h6c1.7 0 3-1.3 3-3V8.4l.3.3c.2.2.4.3.7.3.3 0 .5-.1.7-.3.4-.4.4-1 0-1.4zM8 11.5c0-.3.2-.5.5-.5s.5.2.5.5-.2.5-.5.5-.5-.2-.5-.5zm4 1.5c0 .6-.4 1-1 1h-1V9c0-.6-.4-1-1-1H7c-.6 0-1 .4-1 1v5H5c-.6 0-1-.4-1-1V6.4l4-4 4 4V13z"></path>
+</svg>
diff --git a/devtools/client/debugger/images/loader.svg b/devtools/client/debugger/images/loader.svg
new file mode 100644
index 0000000000..67589cb3d5
--- /dev/null
+++ b/devtools/client/debugger/images/loader.svg
@@ -0,0 +1,7 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16" fill="context-fill">
+ <path opacity=".2" d="M8 2a6 6 0 1 0 0 12A6 6 0 0 0 8 2zm0 10.67a4.67 4.67 0 1 1 0-9.34 4.67 4.67 0 0 1 0 9.34z"/>
+ <path d="M10.33 3.96L11 2.8C10.1 2.3 9.1 2 8 2v1.33c.85 0 1.65.23 2.33.63z"/>
+</svg>
diff --git a/devtools/client/debugger/images/markup-breakpoint.svg b/devtools/client/debugger/images/markup-breakpoint.svg
new file mode 100644
index 0000000000..b736c4e78c
--- /dev/null
+++ b/devtools/client/debugger/images/markup-breakpoint.svg
@@ -0,0 +1,7 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12" width="12" height="12">
+ <path d="M6 1H0v10h6l4-5-4-5z" fill="context-fill" />
+ <path d="M0 .5h6.25L10.5 6l-4.25 5.5H0" fill="none" stroke="context-stroke" stroke-width="1" />
+</svg> \ No newline at end of file
diff --git a/devtools/client/debugger/images/next-circle.svg b/devtools/client/debugger/images/next-circle.svg
new file mode 100644
index 0000000000..91fb6ddb6b
--- /dev/null
+++ b/devtools/client/debugger/images/next-circle.svg
@@ -0,0 +1,9 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+
+
+<svg viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" fill="#0274E8">
+ <path d="M8,0 C3.581722,-2.705415e-16 5.41083001e-16,3.581722 0,8 C-5.41083001e-16,12.418278 3.581722,16 8,16 C12.418278,16 16,12.418278 16,8 C16,5.87826808 15.1571453,3.84343678 13.6568542,2.34314575 C12.1565632,0.842854723 10.1217319,1.2991861e-16 8,0 Z M8,15 C4.13400675,15 1,11.8659932 1,8 C1,4.13400675 4.13400675,1 8,1 C11.8659932,1 15,4.13400675 15,8 C15,9.85651543 14.2625021,11.6369928 12.9497475,12.9497475 C11.6369928,14.2625021 9.85651543,15 8,15 Z" id="Shape"></path>
+ <path d="M11.5,4 C11.2238576,4 11,4.22385763 11,4.5 L11,7.5 C10.9257751,7.36047643 10.8195383,7.24053164 10.69,7.15 L5.57,3.63 C5.2714387,3.432438 4.89004177,3.40955419 4.57,3.57 C4.22912746,3.732229 4.00866545,4.0725914 4,4.45 L4,11.55 C4.00294215,11.9207587 4.21077995,12.2594573 4.54,12.43 C4.68034771,12.5091766 4.83885991,12.5505276 5,12.55 C5.20390805,12.5495172 5.4027955,12.4867107 5.57,12.37 L10.69,8.82 C10.8195383,8.72946836 10.9257751,8.60952357 11,8.47 L11,11.47 C11,11.7461424 11.2238576,11.97 11.5,11.97 C11.7761424,11.97 12,11.7461424 12,11.47 L12,4.47 C11.9841101,4.20563806 11.7648386,3.99952289 11.5,4 Z M5,11.55 L5,4.45 L10.12,8 L5,11.55 Z" id="Shape"></path>
+</svg>
diff --git a/devtools/client/debugger/images/next.svg b/devtools/client/debugger/images/next.svg
new file mode 100644
index 0000000000..c4c19bf4a1
--- /dev/null
+++ b/devtools/client/debugger/images/next.svg
@@ -0,0 +1,8 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg version="1.1" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
+<path d="M12.4,2.1c-0.3,0-0.5,0.2-0.5,0.5v4.8c0,0-0.1-0.1-0.1-0.1l-7.4-5C3.8,1.8,3,2.2,3,3v10c0,0.8,0.8,1.3,1.4,0.8l7.4-5
+ c0.1,0,0.1-0.1,0.1-0.1v4.8c0,0.3,0.2,0.5,0.5,0.5s0.5-0.2,0.5-0.5v-11C12.9,2.3,12.7,2.1,12.4,2.1z M3.9,13V3l7.4,5L3.9,13z"/>
+</svg>
diff --git a/devtools/client/debugger/images/pane-collapse.svg b/devtools/client/debugger/images/pane-collapse.svg
new file mode 100644
index 0000000000..6f6623346e
--- /dev/null
+++ b/devtools/client/debugger/images/pane-collapse.svg
@@ -0,0 +1,7 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+ <path d="M4 3H2v10h2V3zm7 7V6L8 8l3 2z" fill-opacity=".3"/>
+ <path d="M11.47 10.88A1 1 0 0 0 12 10V6a1 1 0 0 0-1.55-.83l-3 2a1 1 0 0 0 0 1.66l3 2c.3.2.7.23 1.02.05zM8 8l3-2v4L8 8zM2 2h12c.6 0 1 .4 1 1v10c0 .6-.4 1-1 1H2c-.6 0-1-.4-1-1V3c0-.6.4-1 1-1zm12 11V3H5v10h9zM2 13h2V3H2v10z"/>
+</svg>
diff --git a/devtools/client/debugger/images/pane-expand.svg b/devtools/client/debugger/images/pane-expand.svg
new file mode 100644
index 0000000000..6498f09b1b
--- /dev/null
+++ b/devtools/client/debugger/images/pane-expand.svg
@@ -0,0 +1,7 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+ <path d="M4 3H2v10h2V3zM8 6v4l3-2-3-2z" fill-opacity=".3"/>
+ <path d="M7.53 10.88A1 1 0 0 1 7 10V6a1 1 0 0 1 1.55-.83l3 2a1 1 0 0 1 0 1.66l-3 2a1 1 0 0 1-1.02.05zM11 8L8 6v4l3-2zM2 2h12c.6 0 1 .4 1 1v10c0 .6-.4 1-1 1H2c-.6 0-1-.4-1-1V3c0-.6.4-1 1-1zm12 11V3H5v10h9zM2 13h2V3H2v10z"/>
+</svg>
diff --git a/devtools/client/debugger/images/pause.svg b/devtools/client/debugger/images/pause.svg
new file mode 100644
index 0000000000..69ebe2d962
--- /dev/null
+++ b/devtools/client/debugger/images/pause.svg
@@ -0,0 +1,8 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg version="1.1" xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
+ <path d="M5,13.5C5,13.8,4.7,14,4.5,14C4.2,14,4,13.8,4,13.5V2.6c0-0.3,0.2-0.5,0.5-0.5C4.7,2.1,5,2.3,5,2.6V13.5z"/>
+ <path d="M11.9,13.5c0,0.3-0.2,0.5-0.5,0.5s-0.5-0.2-0.5-0.5V2.6c0-0.3,0.2-0.5,0.5-0.5s0.5,0.2,0.5,0.5V13.5z"/>
+</svg>
diff --git a/devtools/client/debugger/images/plus.svg b/devtools/client/debugger/images/plus.svg
new file mode 100644
index 0000000000..14ca4837e2
--- /dev/null
+++ b/devtools/client/debugger/images/plus.svg
@@ -0,0 +1,6 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+ <path d="M8.5 8.5V14a.5.5 0 1 1-1 0V8.5H2a.5.5 0 0 1 0-1h5.5V2a.5.5 0 0 1 1 0v5.5H14a.5.5 0 1 1 0 1H8.5z"/>
+</svg>
diff --git a/devtools/client/debugger/images/prettyPrint.svg b/devtools/client/debugger/images/prettyPrint.svg
new file mode 100644
index 0000000000..2c5a60f046
--- /dev/null
+++ b/devtools/client/debugger/images/prettyPrint.svg
@@ -0,0 +1,6 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" fill="context-fill">
+ <path fill-rule="evenodd" clip-rule="evenodd" d="M4.36968 15.003H3.89191C3.3109 15.003 2.89285 14.7972 2.63676 14.3844C2.38067 13.9703 2.25211 13.2061 2.25211 12.0879V11.3224C2.25211 10.3257 2.15393 9.63235 1.95655 9.24224C1.75815 8.8508 1.44032 8.65441 1 8.65441V7.35317C1.44032 7.35317 1.75916 7.15812 1.95655 6.76534C2.15393 6.37524 2.25313 5.68187 2.25313 4.68656V3.9117C2.25313 2.79883 2.38067 2.03599 2.63676 1.62451C2.89285 1.21036 3.3109 1.00462 3.89191 1.00462H4.36968V2.05068H4.18849C3.81397 2.05068 3.55282 2.15756 3.40503 2.37132C3.25826 2.58374 3.18437 3.09275 3.18437 3.89567V4.40735C3.18437 5.50819 3.0872 6.32046 2.89386 6.84283C2.70053 7.36386 2.37156 7.74996 1.90796 7.99978C2.37156 8.25496 2.70053 8.64372 2.89386 9.16609C3.0872 9.68712 3.18437 10.4994 3.18437 11.6016V12.1119C3.18437 12.9162 3.25826 13.4238 3.40503 13.6376C3.55282 13.8514 3.81397 13.9569 4.18849 13.9569H4.37069L4.36968 15.003ZM15 8.65441C14.5647 8.65441 14.2469 8.8508 14.0465 9.24224C13.8471 9.63235 13.7469 10.3257 13.7469 11.3224V12.0879C13.7469 13.2061 13.6203 13.9716 13.3663 14.3844C13.1122 14.7972 12.6942 15.003 12.1142 15.003H11.6303V13.9569H11.8176C12.1921 13.9569 12.4533 13.85 12.601 13.6363C12.7478 13.4238 12.8217 12.9162 12.8217 12.1133V11.6016C12.8217 10.4994 12.9189 9.68712 13.1122 9.16609C13.3055 8.64506 13.6345 8.25496 14.0981 7.99978C13.6345 7.74996 13.3055 7.36386 13.1122 6.84283C12.9189 6.32046 12.8217 5.50819 12.8217 4.40735V3.89567C12.8217 3.09141 12.7478 2.58374 12.601 2.36998C12.4533 2.15756 12.1921 2.05068 11.8176 2.05068H11.6303V1.00462H12.1142C12.6942 1.00462 13.1122 1.21169 13.3663 1.62451C13.6193 2.03599 13.7469 2.80017 13.7469 3.9117V4.68656C13.7469 5.58568 13.8359 6.255 14.0131 6.69454C14.1912 7.13407 14.5192 7.35317 15 7.35317V8.65441Z"/>
+</svg>
diff --git a/devtools/client/debugger/images/regex-match.svg b/devtools/client/debugger/images/regex-match.svg
new file mode 100644
index 0000000000..029a9e270e
--- /dev/null
+++ b/devtools/client/debugger/images/regex-match.svg
@@ -0,0 +1,9 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 16" stroke="none" fillrule="evenodd" fill="context-fill">
+ <rect x="3" y="10" width="3" height="3" rx="1"></rect>
+ <rect x="12" y="3" width="2" height="9" rx="1"></rect>
+ <rect transform="translate(13.000000, 7.500000) rotate(60.000000) translate(-13.000000, -7.500000) " x="12" y="3" width="2" height="9" rx="1"></rect>
+ <rect transform="translate(13.000000, 7.500000) rotate(-60.000000) translate(-13.000000, -7.500000) " x="12" y="3" width="2" height="9" rx="1"></rect>
+</svg>
diff --git a/devtools/client/debugger/images/reload.svg b/devtools/client/debugger/images/reload.svg
new file mode 100644
index 0000000000..7942ec30a3
--- /dev/null
+++ b/devtools/client/debugger/images/reload.svg
@@ -0,0 +1,7 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg" fill="context-fill">
+ <path d="M13.917 7C13.44 4.162 10.973 2 8 2 4.686 2 2 4.686 2 8s2.686 6 6 6c2.22 0 4.16-1.207 5.197-3H12c-.912 1.214-2.364 2-4 2-2.76 0-5-2.24-5-5s2.24-5 5-5c2.42 0 4.437 1.718 4.9 4h1.017z"/>
+ <path d="M14 1L8 7h6V1zm-1 1L9 6h4V2z" fill-rule="evenodd"/>
+</svg>
diff --git a/devtools/client/debugger/images/search.svg b/devtools/client/debugger/images/search.svg
new file mode 100644
index 0000000000..0d11ff1fe7
--- /dev/null
+++ b/devtools/client/debugger/images/search.svg
@@ -0,0 +1,6 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+ <path d="M14.293 15.707a1.01 1.01 0 0 0 1.402-.012 1.01 1.01 0 0 0 .012-1.402L10.89 9.476a6 6 0 1 0-1.414 1.414l4.817 4.817zM8.828 8.828a4 4 0 1 1-5.656-5.656 4 4 0 0 1 5.656 5.656z"/>
+</svg>
diff --git a/devtools/client/debugger/images/sourcemap.svg b/devtools/client/debugger/images/sourcemap.svg
new file mode 100644
index 0000000000..a760dc6edc
--- /dev/null
+++ b/devtools/client/debugger/images/sourcemap.svg
@@ -0,0 +1,6 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
+ <path fill="context-fill" fill-rule="evenodd" clip-rule="evenodd" d="M8.17949 1.03333C8.06395 0.988891 7.93604 0.988891 7.82051 1.03333L1.32051 3.53333C1.12741 3.60759 1 3.79311 1 4V12C1 12.2069 1.12741 12.3924 1.32051 12.4667L7.82051 14.9667C7.93604 15.0111 8.06395 15.0111 8.17949 14.9667L14.6795 12.4667C14.8726 12.3924 15 12.2069 15 12V4C15 3.79311 14.8726 3.60759 14.6795 3.53333L8.17949 1.03333ZM8.5 13.772V6.8434L14 4.72801V11.6566L8.5 13.772ZM8 5.96429L13.1072 4L11.25 3.28571L6.14284 5.25L8 5.96429ZM8 2.03571L9.85716 2.75L4.75 4.71429L2.89284 4L8 2.03571Z"/>
+</svg> \ No newline at end of file
diff --git a/devtools/client/debugger/images/sources/aframe.svg b/devtools/client/debugger/images/sources/aframe.svg
new file mode 100644
index 0000000000..b903d3eab9
--- /dev/null
+++ b/devtools/client/debugger/images/sources/aframe.svg
@@ -0,0 +1,6 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+ <path d="M5.01 2.36L1.5 14h2.86l.58-2.5h3.41l.6 2.5h2.92L10.5 9.5H5.4l1.23-5.14v-2H5.01zM5.74 2.88l1.7 2.65 2.65-1.7-1.7-2.66-2.65 1.7zM10 10.34l2.95-2.35-2.35-2.95-2.95 2.35L10 10.34zM14.5 1.4L10.82.56 10 4.25l3.68.82.82-3.68z" fill="#EF2D5E"/>
+</svg>
diff --git a/devtools/client/debugger/images/sources/angular.svg b/devtools/client/debugger/images/sources/angular.svg
new file mode 100644
index 0000000000..7e26c391d6
--- /dev/null
+++ b/devtools/client/debugger/images/sources/angular.svg
@@ -0,0 +1,8 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+ <path d="M.97 3.07L7.9.6l7.12 2.43-1.15 9.18-5.97 3.3-5.88-3.26L.97 3.07z" fill="#E23237"/>
+ <path d="M15.03 3.03L7.91.6v14.91l5.97-3.3 1.15-9.18z" fill="#B52E31"/>
+ <path d="M7.92 2.34l-4.33 9.62 1.62-.03.87-2.17h3.88l.95 2.2 1.54.03-4.53-9.65zm0 3.08L9.4 8.48H6.64l1.29-3.06z" fill="#fff"/>
+</svg>
diff --git a/devtools/client/debugger/images/sources/babel.svg b/devtools/client/debugger/images/sources/babel.svg
new file mode 100644
index 0000000000..7a64bfb93e
--- /dev/null
+++ b/devtools/client/debugger/images/sources/babel.svg
@@ -0,0 +1,6 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+ <path d="M8.71 2.45c-.68.17-1.36.37-2.02.65-.05.03-.15.02-.17.06-.18.19-.5.3-.69.46a1.5 1.5 0 0 1-.28.17c-.06.02-.33.16-.33.23 0 .06.37 0 .37.04l-.27.24c-.24.2-.51.46-.8.57-.06.02-.27.33-.55.33-.08 0-.08 0-.08.27v.26c.12 0 .35.16.43.13.19-.1.34-.3.5-.44.16-.12.2-.04.34 0 .04 0 .1-.01.2-.08.34-.22.83-.65 1.24-.76.07 0 .2-.1.24.03.02.08-.16.6-.34 1-.37.8-.67 1.64-1.03 2.44l-1.04 2.27c-.24.53-1.06 2.17-1.19 2.4-.16.28-.31.57-.48.85-.04.07 0 .5.04.57.13.16.4-.18.53-.05.12.1-.3.65-.33.82-.02.1.06.1.16-.03.2-.25.2-.25.12-.05-.13.28-.16.42-.11.42.1 0 .56-.61.8-1.04.1-.17.13-.2.3-.22.26-.1.55-.16.8-.27.6-.23 1.19-.51 1.81-.65 1.02-.46 1.71-.88 2.58-1.5.44-.32.87-.6 1.28-.95.77-.65 1.2-1.34 1.25-2.02a.58.58 0 0 0-.07-.35c-.1-.2-.22-.37-.36-.54-.1-.1-.38-.35-.38-.47 0-.28 1.24-1.03 1.36-1.14.15-.13.31-.3.36-.35.19-.28.33-.83.36-1.38.01-.35-.14-.6-.27-.88-.2-.34-.51-.6-.88-.76a3.5 3.5 0 0 0-1.21-.4c-.2-.03-.43 0-.63-.05-.44-.1-1.18.08-1.56.17zm1.3 1.38c.15 0 .93-.12.93-.03 0 .03.4.08.5.35.04.1.12.1.1 0-.03-.14.02-.17.15-.1.13.1.14.1.07.29-.07.2-.22.34-.22.2 0-.05-.1-.1-.1-.02-.04.28-.2.46-.37.68-.35.46-.9.9-1.4 1.2-.38.28-.82.38-1.26.56l-.92.39c-.07.02-.07 0-.04-.07.11-.3.21-.86.41-1.08.03-.03.15-.3.28-.57l.65-1.46c.05-.13.12-.24.14-.24.06 0 .23-.1.3-.1.22-.07.5.02.79 0h-.01zm.25 4.7a3.2 3.2 0 0 1-.32.76c-.24.35-.69.6-1.03.87-.52.4-1.08.82-1.68 1.1-.47.33-.99.53-1.5.78l-.39.18c-.05 0-.39.13-.38.1l.8-1.6c.44-.88.81-1.6.83-1.61.1-.08.33-.07.46-.1.82-.16 1.52-.61 2.18-.65.3-.01.79.08 1.03.17z"/>
+</svg>
diff --git a/devtools/client/debugger/images/sources/backbone.svg b/devtools/client/debugger/images/sources/backbone.svg
new file mode 100644
index 0000000000..0dab163ecb
--- /dev/null
+++ b/devtools/client/debugger/images/sources/backbone.svg
@@ -0,0 +1,6 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+ <path d="M8 4.64L3 1.79V14.2l5-2.85 5 2.85V1.8L8 4.64zM5.5 8L8 6.58 10.5 8 8 9.42 5.5 8zm-.85-3.48l1.79 1.01-1.79 1.02V4.52zm0 4.93l1.65.94-1.65.94V9.45zm6.7 1.88l-1.65-.94 1.65-.94v1.88zm-1.79-5.8l1.78-1.01v2.03L9.56 5.53z"/>
+</svg>
diff --git a/devtools/client/debugger/images/sources/choo.svg b/devtools/client/debugger/images/sources/choo.svg
new file mode 100644
index 0000000000..efeae2ed99
--- /dev/null
+++ b/devtools/client/debugger/images/sources/choo.svg
@@ -0,0 +1,14 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="16" height="16">
+ <path d="M190.47 376V203.3H81.27c-27.13 0-50.14 26-58.23 62.04-9.87 1.3-17.62 13.54-17.62 28.46 0 14.91 7.75 27.15 17.62 28.45 7.3 32.51 26.74 56.84 50.39 61.3v68.67h395.95V376h-278.9z" fill="#132028"/>
+ <path d="M490.71 427.98a56.02 56.02 0 0 1-110.04 14.83 56.04 56.04 0 0 1-110.05-14.83 56.02 56.02 0 0 1 110.05-14.84 56.04 56.04 0 0 1 110.04 14.84zM161.24 203.3l29.75-113.85H94.23l29.75 113.85h-13.67C76.45 203.3 49 243.82 49 293.8c0 49.97 27.46 90.49 61.32 90.49h183.96V203.3H161.24zm1.08 217.12a31.8 31.8 0 0 0-29.28 19.4 31.8 31.8 0 1 0 0 24.76 31.8 31.8 0 1 0 29.28-44.16z" fill="#575A5B"/>
+ <path d="M200.78 384.29h-16.03c-20.1 0-36.4-40.52-36.4-90.5 0-49.97 16.3-90.48 36.4-90.48h16.03c-20.1 0-36.4 40.51-36.4 90.49 0 49.97 16.3 90.49 36.4 90.49zm-78.54-90.5c0-49.97 16.3-90.48 36.4-90.48H142.6c-20.1 0-36.4 40.51-36.4 90.49 0 49.97 16.3 90.49 36.4 90.49h16.03c-20.1 0-36.4-40.52-36.4-90.5z" fill="#FFB636"/>
+ <path d="M489.35 384.29H294.27V85.76h195.08V384.3zm-415.14-.19h-7.99c-2.44 0-4.7 1.48-6.03 3.94l-43.64 80.6c-3.11 5.75.32 13.36 6.04 13.36H75.4c4.03 0 7.27-3.97 7.2-8.8l-1.2-80.6c-.07-4.72-3.27-8.5-7.2-8.5z" fill="#FF473E"/>
+ <path d="M497.28 66.4H286.34c-5.92 0-10.72 4.8-10.72 10.72v1.62c0 5.92 4.8 10.72 10.72 10.72h210.94c5.92 0 10.72-4.8 10.72-10.72v-1.62c0-5.92-4.8-10.72-10.72-10.72z" fill="#EF2020"/>
+ <path d="M371.47 257.52H330.5a7.2 7.2 0 0 1-7.2-7.2v-126.3a7.2 7.2 0 0 1 7.2-7.2h40.96a7.2 7.2 0 0 1 7.2 7.2v126.3a7.2 7.2 0 0 1-7.2 7.2zm89-7.2v-126.3a7.2 7.2 0 0 0-7.2-7.2h-40.95a7.2 7.2 0 0 0-7.2 7.2v126.3a7.2 7.2 0 0 0 7.2 7.2h40.95a7.2 7.2 0 0 0 7.2-7.2z" fill="#76DFFF"/>
+ <path d="M489.35 339.59H294.27V303h195.08v36.59zM111.17 52L94.21 89.46h96.75L174 52h-62.83zm215.47 362.95a13.02 13.02 0 1 0 0 26.05 13.02 13.02 0 0 0 0-26.05zm108.05 0a13.02 13.02 0 1 0 0 26.05 13.02 13.02 0 0 0 0-26.05zm-330.94 29.88a7.39 7.39 0 1 0 0 14.77 7.39 7.39 0 0 0 0-14.77zm58.57 0a7.39 7.39 0 1 0 0 14.77 7.39 7.39 0 0 0 0-14.77z" fill="#132028"/>
+ <path d="M196.7 444.2h-92.95a8.9 8.9 0 1 1 0-17.77h90.45l36.76-22.53c1.4-.86 3-1.31 4.65-1.31h223.93a8.9 8.9 0 1 1 0 17.78H238.11l-36.76 22.53c-1.4.86-3 1.3-4.64 1.3z" fill="#FFB636"/>
+ <path d="M69.85 393.08a10.5 10.5 0 0 1-.03-21l413.93-1h.02a10.5 10.5 0 0 1 .03 21l-413.93 1h-.02z" fill="#ADB7BC"/>
+</svg>
diff --git a/devtools/client/debugger/images/sources/coffeescript.svg b/devtools/client/debugger/images/sources/coffeescript.svg
new file mode 100644
index 0000000000..4db88c2d0d
--- /dev/null
+++ b/devtools/client/debugger/images/sources/coffeescript.svg
@@ -0,0 +1,6 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16" fill="context-fill">
+ <path d="M6.46 4.08c1.33-.12 1.7-.97 3.26-1.12.76-.07 1.25.1 1.3.35.04.25-.34.42-.8.46-.64.07-.91-.17-.96-.39-.46.05-.54.25-.52.4.05.27.63.53 1.6.44 1.12-.09 1.48-.52 1.39-.96-.12-.57-.97-1.05-2.5-.91-1.97.18-1.96 1.08-3.28 1.2-.55.04-.86-.09-.91-.3-.04-.22.22-.32.54-.34.3-.03.65.02.82.1.13-.06.17-.12.15-.2-.05-.2-.46-.3-.97-.25-.99.1-.99.54-.95.73.12.54.88.88 1.83.79zm6.65 2.24c-1.22.29-2.79.47-4.68.47-1.92 0-3.48-.2-4.71-.47-1.1-.28-1.68-.59-1.89-.9.1.71.29 1.4.53 2.06-.28.17-.54.4-.77.69A2.66 2.66 0 0 0 1 9.97c.04.63.34 1.14.83 1.54a2 2 0 0 0 1.68.4c.24-.04.52-.18.75-.25-.5 0-.94-.17-1.37-.5-.47-.35-.8-.84-.86-1.42-.12-.54 0-1.05.3-1.5.07-.09.14-.15.22-.22.17.43.37.84.59 1.24.47.71.94 1.34 1.4 2 .21.4.35.8.44 1.19.3.43.75.74 1.3.9a6.2 6.2 0 0 0 2.09.33h.07c.72 0 1.47-.12 2.16-.35.51-.17.95-.45 1.26-.9h.04c.08-.35.2-.78.4-1.17.46-.68.94-1.3 1.4-2.02A12.22 12.22 0 0 0 15 5.43c-.24.34-.83.66-1.89.9zm-9.4-.98c1.24.3 2.8.46 4.69.46 1.92 0 3.45-.17 4.68-.46 1.3-.31 1.92-.72 1.92-1.1 0-.28-.28-.54-.8-.74.12.08.2.2.2.34 0 .4-.58.71-1.76.97-1.1.24-2.5.41-4.2.41-1.65 0-3.12-.17-4.18-.4-1.13-.28-1.73-.59-1.73-.97 0-.17.08-.3.3-.47-.71.29-1.09.51-1.09.87.04.4.67.8 1.98 1.09z"></path>
+</svg>
diff --git a/devtools/client/debugger/images/sources/dojo.svg b/devtools/client/debugger/images/sources/dojo.svg
new file mode 100644
index 0000000000..277866813a
--- /dev/null
+++ b/devtools/client/debugger/images/sources/dojo.svg
@@ -0,0 +1,4 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><defs><style>.cls-1{isolation:isolate;}.cls-17,.cls-2,.cls-25{fill:none;}.cls-17,.cls-2{stroke-miterlimit:10;}.cls-2{stroke-width:0.75px;stroke:url(#linear-gradient);}.cls-3{fill:url(#linear-gradient-2);}.cls-4{fill:#f15a24;}.cls-5{fill:#ed1c24;}.cls-6{fill:#c1272d;}.cls-7{fill:url(#linear-gradient-3);}.cls-8{fill:url(#linear-gradient-4);}.cls-9{fill:url(#linear-gradient-5);}.cls-10{fill:url(#linear-gradient-6);}.cls-11{opacity:0.49;fill:url(#linear-gradient-7);}.cls-12{fill:url(#linear-gradient-8);}.cls-13{fill:#2db5f9;}.cls-13,.cls-14{mix-blend-mode:screen;}.cls-14{fill:#5fd2ff;}.cls-15{fill:#219058;}.cls-16{fill:url(#linear-gradient-9);}.cls-17{stroke:#fff;stroke-width:1.87px;}.cls-18{fill:#f7b852;}.cls-19{fill:#ff8431;}.cls-20{fill:#fffb69;}.cls-21{fill:#44c688;}.cls-22{fill:#29b36e;}.cls-23{fill:#6fd191;}.cls-24{fill:#c83ad7;}.cls-26{fill:#fba9ff;}.cls-27{fill:#ff737d;}.cls-28{fill:#fdc666;}</style><linearGradient id="linear-gradient" x1="67.45" y1="154.72" x2="67.29" y2="155.43" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ff1d25" stop-opacity="0.5"/><stop offset="0.06" stop-color="#ff1d25" stop-opacity="0.54"/><stop offset="0.37" stop-color="#ff1d25" stop-opacity="0.74"/><stop offset="0.64" stop-color="#ff1d25" stop-opacity="0.88"/><stop offset="0.86" stop-color="#ff1d25" stop-opacity="0.97"/><stop offset="1" stop-color="#ff1d25"/></linearGradient><linearGradient id="linear-gradient-2" x1="73.09" y1="170.74" x2="73.09" y2="153.5" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#ffdd42"/><stop offset="1" stop-color="#fb784b"/></linearGradient><linearGradient id="linear-gradient-3" x1="201.52" y1="95.13" x2="207.88" y2="89.89" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#5bcb99"/><stop offset="1" stop-color="#85a8e8"/></linearGradient><linearGradient id="linear-gradient-4" x1="81.17" y1="158.3" x2="279.32" y2="55.49" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#34e28b"/><stop offset="1"/></linearGradient><linearGradient id="linear-gradient-5" x1="117.57" y1="178.22" x2="133.15" y2="178.22" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#c297ff"/><stop offset="1" stop-color="#ae31bb"/></linearGradient><linearGradient id="linear-gradient-6" x1="54.05" y1="253.29" x2="251.08" y2="99.63" gradientUnits="userSpaceOnUse"><stop offset="0"/><stop offset="1" stop-color="#d23de2"/></linearGradient><linearGradient id="linear-gradient-7" x1="199.8" y1="86.45" x2="191.83" y2="113.37" gradientUnits="userSpaceOnUse"><stop offset="0"/><stop offset="1" stop-opacity="0"/></linearGradient><linearGradient id="linear-gradient-8" x1="126.87" y1="190.63" x2="182.9" y2="204.2" gradientUnits="userSpaceOnUse"><stop offset="0" stop-color="#2db5f9"/><stop offset="1" stop-color="#092432"/></linearGradient><linearGradient id="linear-gradient-9" x1="83.08" y1="49.55" x2="46.06" y2="151.24" gradientUnits="userSpaceOnUse"><stop offset="0"/><stop offset="0.21" stop-color="#48080a"/><stop offset="0.42" stop-color="#891014"/><stop offset="0.61" stop-color="#bc151b"/><stop offset="0.78" stop-color="#e01a21"/><stop offset="0.91" stop-color="#f71c24"/><stop offset="1" stop-color="#ff1d25"/></linearGradient></defs><title>dojo_square</title><g class="cls-1"><g id="Layer_1" data-name="Layer 1"><line class="cls-2" x1="67.37" y1="155.08" x2="67.37" y2="155.08"/><path class="cls-3" d="M42.28,150.4l.52.82A58,58,0,0,0,52,161.49a45.23,45.23,0,0,0,28.74,10.25c.65,0,1.31,0,2,0a67.32,67.32,0,0,0,21.13-5.26,67.38,67.38,0,0,1-9.09.83,36.92,36.92,0,0,1-27.44-12.17A66.82,66.82,0,0,1,42.28,150.4Z"/><path class="cls-4" d="M80.79,80.88a45.4,45.4,0,0,1,38.89,21.94A37,37,0,0,0,84.43,94.7c8.29,4,19.66,7.08,35.28,8.15,0,0-.77-14.87-19.8-22.64-26.57-10.84-30.33-8.69-37.06-19.9a30.09,30.09,0,0,0,6,22.15A45.45,45.45,0,0,1,80.79,80.88Z"/><path class="cls-5" d="M99.92,80.21c-9.1-3.71-15.52-5.9-20.3-7.62A33.4,33.4,0,0,0,84.54,81a45.42,45.42,0,0,1,35.13,21.78,36.87,36.87,0,0,0-20.54-9.34,109,109,0,0,0,20,9.32l.59,0S118.94,88,99.92,80.21Z"/><path class="cls-6" d="M119.69,102.85h.1c.29-1.62,2.07-14.46-12.4-25.7C85.78,60.37,81.56,58.82,80.53,49.94a27.8,27.8,0,0,0-.91,22.65c4.78,1.72,11.21,3.91,20.3,7.62,19,7.77,19.8,22.64,19.8,22.64Z"/><path class="cls-7" d="M185.28,88.22a33.64,33.64,0,0,1,22.08,8.23,29.8,29.8,0,0,1,19,8S208.22,78,176.19,89a41.72,41.72,0,0,0-8.2,4A33.64,33.64,0,0,1,185.28,88.22Z"/><path class="cls-8" d="M185.28,88.22A33.62,33.62,0,0,0,168,93l.93-.56c-25.88,15.24-57.6,62.06-101.56,62.65h0a36.92,36.92,0,0,0,27.44,12.17,67.38,67.38,0,0,0,9.09-.83c28.6-11.79,56.09-40,68.55-53.64,11.56-12.67,24.22-17,34.91-16.34A33.64,33.64,0,0,0,185.28,88.22Z"/><path class="cls-9" d="M118.48,179a20.94,20.94,0,0,0-.92,5.86,22.25,22.25,0,0,0,1,6.74,16.56,16.56,0,0,1,5.5-14.74c0-.17.09-.34.14-.51a20.37,20.37,0,0,1,8.91-11.47l-.08,0a37.84,37.84,0,0,0-4,1.53A20.87,20.87,0,0,0,118.48,179Z"/><path class="cls-10" d="M234.26,129.11a42.41,42.41,0,0,0-7.94-24.76,29.82,29.82,0,0,0-19-7.9A33.69,33.69,0,0,1,219.06,122c0,11.34-4.12,24.3-17.45,31.28-19.42,10.16-49.21,5.33-68.54,11.6l.08,0a20.37,20.37,0,0,0-8.91,11.47c-.05.17-.09.34-.14.51h0c5.67-5,16.84-8.54,38.63-5.73,15.56,2,27.93,2.55,38.54-.5a41.2,41.2,0,0,0,25.23-17h0A42.41,42.41,0,0,0,234.26,129.11Z"/><path class="cls-11" d="M234.26,129.11a42.41,42.41,0,0,0-7.94-24.76,29.82,29.82,0,0,0-19-7.9A33.69,33.69,0,0,1,219.06,122c0,11.34-4.12,24.3-17.45,31.28-19.42,10.16-49.21,5.33-68.54,11.6l.08,0a20.37,20.37,0,0,0-8.91,11.47c-.05.17-.09.34-.14.51h0c5.67-5,16.84-8.54,38.63-5.73,15.56,2,27.93,2.55,38.54-.5a41.2,41.2,0,0,0,25.23-17h0A42.41,42.41,0,0,0,234.26,129.11Z"/><path class="cls-12" d="M137.8,201.88a20.44,20.44,0,0,1-13.68-25.12h0l0,.08a16.56,16.56,0,0,0-5.5,14.73,20.94,20.94,0,0,0,33.63,9.38A20.37,20.37,0,0,1,137.8,201.88Z"/><path class="cls-13" d="M144.91,200.4c2.12-6.17,9-15.7,16.33-11.34,0,0,6,3.36,7.23-6.11,0,0,4.49,22.28-17.1,21.53,0,0,4.86-3.55,4.81-7.2A24.73,24.73,0,0,1,144.91,200.4Z"/><path class="cls-14" d="M153.52,186.75c2.14-1.09,4.16-2.18,8.08-.44,3,1.35,6.88-3.94,3.56-8.66,0,0,.21,4.88-3.72,4.84A8.81,8.81,0,0,0,153.52,186.75Z"/><path class="cls-15" d="M175.21,115.88c-5.17,7-12.75,12.95-13.64,14.39s1.5,6.11,5,6.45.82-1.36.52-3,1.06,1,5.27.42-1.53-2.2-1.14-4.33,4.74-6.17,6.47-10.25,4.7,0,3.18,3.18c-.6,1.26,4.81-3.54,2.08-7.21S178.22,111.77,175.21,115.88Z"/><path class="cls-15" d="M160.47,131.28c-.76.73-3,2.37-3,2.37s2.19,3.05,5,3c0,0,.61-.29-.27-1.18S160.27,131.82,160.47,131.28Z"/><path class="cls-16" d="M84.43,94.7c-7.35-3.56-12.27-7.88-15.54-12.24A45.42,45.42,0,0,0,42.28,150.4a66.82,66.82,0,0,0,25.09,4.67h0A37,37,0,0,1,84.43,94.7Z"/><line class="cls-17" x1="67.37" y1="155.08" x2="67.37" y2="155.08"/><path class="cls-18" d="M84.52,81c2,2.91,7.81,7.94,14.63,12.44a36.87,36.87,0,0,1,20.52,9.33A45.42,45.42,0,0,0,84.52,81Z"/><path class="cls-19" d="M84.52,81c-1.23-.1-2.48-.16-3.74-.16a45.45,45.45,0,0,0-11.89,1.58c3.27,4.36,8.19,8.67,15.54,12.24a36.72,36.72,0,0,1,14.72-1.22C92.33,89,86.54,83.95,84.52,81Z"/><path class="cls-20" d="M109.73,91.38a33.29,33.29,0,0,0-12.21-7.29C100.46,89.66,103,91.38,109.73,91.38Z"/><path class="cls-6" d="M96.89,67.66a63.16,63.16,0,0,1,6.54,4.58c.52.39-.93-3.55-2.62-4.3A7.5,7.5,0,0,0,96.89,67.66Z"/><path class="cls-6" d="M105,73.37a70.75,70.75,0,0,1,6.5,4.64c.53.38-.9-3.56-2.57-4.33A7.5,7.5,0,0,0,105,73.37Z"/><path class="cls-6" d="M112.55,79a19.59,19.59,0,0,1,3.52,4.39c.26.38.07-2.58-.92-3.42A5.28,5.28,0,0,0,112.55,79Z"/><path class="cls-21" d="M77.55,151c-.2-.65,2.35-1.48,3-1.51a11.91,11.91,0,0,1,3.57,1.19,16.34,16.34,0,0,1-4.89,1A4.46,4.46,0,0,1,77.55,151Z"/><path class="cls-21" d="M86.73,148.78c-.22-.51,1.75-1.38,2.29-1.46a9.58,9.58,0,0,1,3,.65,13.15,13.15,0,0,1-3.83,1.23A3.59,3.59,0,0,1,86.73,148.78Z"/><path class="cls-21" d="M94.41,146c-.22-.4,1.32-1.29,1.76-1.41a7.92,7.92,0,0,1,2.48.27,10.87,10.87,0,0,1-3,1.35A3,3,0,0,1,94.41,146Z"/><path class="cls-21" d="M100.52,143.19c-.23-.35,1.11-1.27,1.5-1.41a7.25,7.25,0,0,1,2.29.07,10,10,0,0,1-2.67,1.45A2.72,2.72,0,0,1,100.52,143.19Z"/><path class="cls-21" d="M106.23,140.07c-.22-.29.9-1.16,1.24-1.3a6.31,6.31,0,0,1,2,0,8.66,8.66,0,0,1-2.25,1.39A2.36,2.36,0,0,1,106.23,140.07Z"/><path class="cls-21" d="M68.34,151.69c-.11-.73,2.73-1.16,3.46-1.09a12.76,12.76,0,0,1,3.57,1.86,17.51,17.51,0,0,1-5.35.26A4.78,4.78,0,0,1,68.34,151.69Z"/><path class="cls-6" d="M70.08,65.82c2,2.27,6.68,3.74,6.68,3.74A19,19,0,0,1,75.83,62c0-.18-5.75-.09-6.73-4.81C68.91,56.23,68.1,63.55,70.08,65.82Z"/><path class="cls-4" d="M50.54,174.68a5.49,5.49,0,0,1,2.24-3.88l.19-.11a14,14,0,0,0-1.43-.25c-6.85-1-8.59,3.06-8.95,7.64,0,.26,0,.53,0,.78a8.31,8.31,0,0,1,7.89-4.2Z"/><path class="cls-4" d="M58.88,173.19c-6.81-4.13-10.63-4.43-12.15,7.14,0,0,7.17-5.67,10.55-1.92,3.68,4.07,8.68.32,6.05-2.06A18.77,18.77,0,0,0,58.88,173.19Z"/><path class="cls-4" d="M56.06,174.53c-3.86,2.57-3.86,8.62-3.86,8.62s7-3.81,6.5-6.19A2.93,2.93,0,0,0,56.06,174.53Z"/><path class="cls-4" d="M24,127a5.49,5.49,0,0,1,4.43-.68l.2.08a14,14,0,0,0-.7-1.27c-3.49-6-7.76-4.79-11.56-2.21-.22.15-.43.31-.63.47a8.31,8.31,0,0,1,8.21,3.53Z"/><path class="cls-4" d="M31.29,134.08c-2.48-9.82-4.47-13.62-14-6.83,0,0,8.13-2.34,9.06,9.22.44,5.47,5.69,6.57,5.63,3A18.77,18.77,0,0,0,31.29,134.08Z"/><path class="cls-4" d="M27.83,128.82c-4.52-1.07-8.94,3.06-8.94,3.06s6.94-.24,7.78,4C27.14,138.23,27.83,128.82,27.83,128.82Z"/><path class="cls-22" d="M172.45,112.79a55.39,55.39,0,0,1,15.49-12.5c5.64-3,13.66-4.84,18.5-4.61l1.85,1.59-1-.08a37.75,37.75,0,0,0-19,3.76A55,55,0,0,0,172.45,112.79Z"/><path class="cls-23" d="M207.12,95.74a34.5,34.5,0,0,1,10.45,2.68,27.42,27.42,0,0,1,8.81,6,27.05,27.05,0,0,0-9.09-5.29,43.65,43.65,0,0,0-9-1.84l-1.84-1.59Z"/><path class="cls-24" d="M124.52,175.47a27.43,27.43,0,0,1,3.11-1.9,25.35,25.35,0,0,1,2.31-1c.78-.34,1.58-.58,2.38-.84a45.63,45.63,0,0,1,9.84-1.81,95.67,95.67,0,0,1,19.84.78,194.33,194.33,0,0,0,19.66,1.89,66.25,66.25,0,0,0,19.6-1.93,66.44,66.44,0,0,1-19.6,2.3,194.82,194.82,0,0,1-19.75-1.52,94.77,94.77,0,0,0-19.65-.41,44.43,44.43,0,0,0-9.55,1.94c-.76.27-1.53.52-2.27.85a24,24,0,0,0-2.18,1,21.38,21.38,0,0,0-3.93,2.7l-.53.47A18.42,18.42,0,0,1,124.52,175.47Z"/><line class="cls-25" x1="124.09" y1="176.84" x2="124.09" y2="176.84"/><path class="cls-6" d="M85.66,97.64c-6.36,1.4-5.37,6.45-5.37,6.45s2-2.43,13.09-3.74A52.36,52.36,0,0,1,85.66,97.64Z"/><path class="cls-26" d="M118.59,191.58a16.4,16.4,0,0,1-.08-4.24,18.64,18.64,0,0,1,.91-4.18,18.86,18.86,0,0,1,1.87-3.9,19.81,19.81,0,0,1,2.78-3.38l.46-.42s-.63,2-.7,2.51a19.27,19.27,0,0,0-1.61,1.93,17.84,17.84,0,0,0-3.33,7.5A16.22,16.22,0,0,0,118.59,191.58Z"/><path class="cls-27" d="M65.89,155.08c-3.61-4-6.65-10.29-7.95-16.2a36.79,36.79,0,0,1-.82-9.49l.14-2.38.33-2.36a23,23,0,0,1,.47-2.33,19.65,19.65,0,0,1,.6-2.3,35.6,35.6,0,0,1,3.83-8.64,39.45,39.45,0,0,1,2.68-3.89l1.53-1.8c.51-.6,1.1-1.13,1.64-1.69a37.2,37.2,0,0,1,7.47-5.68,39.82,39.82,0,0,1,8.62-3.62A39.67,39.67,0,0,0,76,98.56a36.78,36.78,0,0,0-7.22,5.83c-.52.57-1.08,1.11-1.56,1.71l-1.45,1.81a38.67,38.67,0,0,0-2.51,3.89,34.62,34.62,0,0,0-3.48,8.52,18.77,18.77,0,0,0-.52,2.24,21.9,21.9,0,0,0-.38,2.27l-.25,2.28-.06,2.3a35.25,35.25,0,0,0,1.06,9.07,36.17,36.17,0,0,0,8.62,15.83l.66.71S66.44,155.12,65.89,155.08Z"/><path class="cls-28" d="M103.89,166.42A47.14,47.14,0,0,1,94,167.55,37.09,37.09,0,0,1,84,165.91,46.7,46.7,0,0,1,74.71,162a34.57,34.57,0,0,1-8.12-6.17l-.69-.74s2.38,0,3-.06a33.57,33.57,0,0,0,6.72,5.5,45.26,45.26,0,0,0,8.82,4.27A36.2,36.2,0,0,0,94,166.91,47.78,47.78,0,0,0,103.89,166.42Z"/></g></g></svg>
diff --git a/devtools/client/debugger/images/sources/ember.svg b/devtools/client/debugger/images/sources/ember.svg
new file mode 100644
index 0000000000..3b9ba80edf
--- /dev/null
+++ b/devtools/client/debugger/images/sources/ember.svg
@@ -0,0 +1,4 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="2500" height="2393" viewBox="0.1 31.4 256 244.5" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet"><path fill="#FFF" d="M57.9 219.3l.6-1.5.1-.2c.5-1.2 1-2.5 1.5-3.7.6-1.6 1.2-3.3 1.8-4.9.4-.9.7-1.8 1-2.8.8-2.2 1.9-5.1 3.2-7.9.8-1.7 1.4-2.9 2.1-4 .8-1.3 1.6-2.5 2.5-3.7l.7-1 1.1-.7c.1-.1.3-.2.5-.3.5-.3 1.1-.5 1.5-.7.7-.3 1.6-.6 2.6-.9 1.4-.4 3-.8 4.9-1.2 2.8-.6 5.8-1.2 9.6-1.8 5.7-.9 11.8-1.7 19.1-2.5 12.9-1.4 25.8-2.4 38.2-3 6.6-.3 11.6-.4 16.3-.4h3c3.1.1 6.7.2 10 .7 1.2.2 2.3.4 3.1.7.3.1.6.2.7.3l1 .4.8.7.9.9c1.1 1.1 2.3 2.4 3.5 3.9 3.8 4.8 7.2 10.6 10.2 17.2 2.9 6.4 4.7 12.1 5.8 17.7l1.5 7.9h-18.4l-1.1-5.3c-1.2-5.6-16.3-20.4-23.8-23.3-.8-.3-4-1.2-13.9-1.2-20.4 0-49.2 3.6-53.3 4.5-4.9 2.3-12.4 11.9-16.7 21.5l-1.8 3.9"/><path fill="#BA8449" d="M182.9 190.1c-.9-1.2-1.9-2.3-3-3.3l-.7-.7s-.1 0-.2-.1c-.5-.2-1.2-.3-1.9-.4-2.9-.4-6-.5-9.1-.6-6.3-.1-12.6.1-18.9.4-12.6.6-25.3 1.6-37.8 3-6.3.7-12.6 1.5-18.8 2.5-3.1.5-6.2 1-9.2 1.7-1.5.3-3 .7-4.4 1.1-.7.2-1.4.4-2 .7-.3.1-.6.2-.7.4 0 0-.1 0-.1.1-.7 1-1.4 2-2.1 3.1-.7 1.1-1.2 2.3-1.8 3.5-1.1 2.4-2.1 4.9-3 7.4s-1.9 5.1-2.8 7.7c-.5 1.3-1 2.6-1.6 3.9-.2.6-.5 1.2-.8 1.8h8.5c4.6-10.3 13.3-22.1 20.5-25 2-.8 34.2-4.8 55.5-4.8 7.9 0 13.3.6 16.3 1.7 8.7 3.4 26.1 19.5 27.9 28.2h4.9c-1-5.5-3-10.9-5.3-16.1-2.6-6-5.7-11.5-9.4-16.2"/><path fill="#FFF" d="M179.1 185.9z"/><path fill="#BA8449" d="M179.1 185.9z"/><path fill="#FFF" d="M192.1 228.6l-1-5.4c-.9-4.5-2.4-9.3-4.8-14.6-2.6-5.6-5.4-10.5-8.6-14.4-.6-.8-1.2-1.5-1.8-2.1-2.5-.4-5.4-.4-8-.5h-2.8c-4.5 0-9.3.1-15.7.4-12.2.6-24.7 1.6-37.4 3-7.1.8-13 1.6-18.4 2.4-3.5.5-6.3 1.1-8.8 1.6-1.6.4-2.8.7-3.9 1-.2 0-.3.1-.4.1-.2.4-.5.7-.7 1.1-.5.8-.9 1.7-1.6 2.9-1.1 2.3-2 4.7-2.8 6.8-.4.9-.7 1.8-1 2.7-.6 1.7-1.2 3.4-1.9 5.1-.5 1.3-1.1 2.6-1.6 4l-.1.2c-.2.6-.5 1.2-.7 1.7l-1.8 4H56.6l-1.7-.8-.2-.1c-4-2.3-4-5.7-3.9-7.1v-.3l.2-.9.3-1.1c.2-.7.4-1.5.6-2.2.4-1.5.9-2.9 1.4-4.3.9-2.6 2-5.4 3.3-8.4 1.4-3.1 2.7-5.8 4.2-8.3.7-1.3 1.5-2.6 2.5-4.1.9-1.4 1.9-2.8 2.9-4.1.9-1.1 1.7-1.8 2.3-2.2h.1c.6-.5 1.2-.8 1.5-.9.9-.5 1.6-.8 2.1-1 1.2-.5 2.3-.8 3.2-1.1 2-.6 3.9-1 5.3-1.3 2.9-.6 6-1.2 9.9-1.8 5.8-.9 11.9-1.6 19.4-2.4 13-1.3 26-2.3 38.6-2.8 6-.2 10.7-.4 15-.4h4.6c3.2.1 6.8.2 10.7.8h.1c.9.2 2.3.4 3.9.9h.1c.4.2 1 .4 1.7.7.5.3.9.5 1.2.7l.5.4.4.3.4.4 1.1 1.1c1.3 1.3 2.5 2.7 3.8 4.4 4 5.2 7.5 11.2 10.7 18.3 1.5 3.3 2.8 6.6 3.8 9.8 1.1 3.5 1.9 6.8 2.5 10l1.2 7.7h-18.2v.1z"/><path fill="#FFF" d="M64.3 228.6l4.4-9.5c3.7-7.9 12.6-22.4 22.5-26.5l.2-.1c3.3-1.2 36.7-5.1 57.1-5.1 11.4 0 15.7 1.1 17.9 2 10.3 4 28.2 20.9 30.6 30.9l2 8.2H64.3z"/><path fill="#FFF" d="M185.4 228.6l-1.2-5.1c-1.1-4.7-15.2-18.8-22.5-21.7-.7-.3-3.6-1.1-13.2-1.1-19.6 0-48 3.5-52.6 4.4-3.8 1.9-10.7 10-15.2 19.6l-1.8 3.8H62.3l4.2-9.3c4.9-11 14.6-24.6 24.1-28.4 3.7-1.5 37.5-5.3 58-5.3 8.9 0 14.9.7 18.6 2.1 10.3 4 29.6 21.4 32 33l1.6 8h-15.4z"/><path fill="#FFF" d="M193.1 228.6l-1.9-1.8c-7.2-6.7-9.2-20.6-7-26.3 1.5-3.8 4.7-5.1 7.1-5.1.7 0 1.3.1 1.9.3 1.3-.1 4.3-2.6 5.2-4 1.4-2.6 4.1-4.2 7.4-4.2 4.9 0 12.9 3.9 15.5 7.6 1.5 2.1 1.9 4.6 1.1 6.8-.1.2-.2.6-.4 1.1-2.7 8.1-6.2 18-9 22.6l-1.9 3.1-18-.1z"/><path fill="#FFF" d="M192.5 228.6l6.2-10.1c3-4.9 5.1-8.9 6.5-12-3.5 2.5-8.4 4-15.7 4.4l-.2-.2-.1.7c-4.3 0-7.8-3.5-8-7.8-.1-2.1.7-4.2 2.1-5.8 1.4-1.6 3.4-2.5 5.5-2.6 7.2-.3 8.1-2 9.4-4.5 1.8-3.4 5.7-5.4 10.8-5.4 1.3 0 2.6.1 3.8.4 6.3 1.4 10.4 6.2 10.7 12.4.3 6.3-3.2 15.5-10.2 27.3l-1.9 3.2h-18.9z"/><path fill="#FFF" d="M218.8 208.9c-8.1 0-16.9-5.3-21.4-10.5-4.1-4.7-4.5-8.9-4.1-11.6.5-3.3 3.2-6.6 8.1-6.6.9 0 1.8.1 2.6.2.8-3.6 2.7-11.1 10.4-11.1h1.1c3.7.4 6.5 2.7 7.6 6.2 1.2-.6 2.6-1.1 4.2-1.1 2.4 0 4.7 1 6.4 2.8 2.7 2.9 3.3 6.9 1.6 10.7 1.8 1.1 3.2 2.8 3.8 5 .8 2.8.3 5.8-1.5 8.2-3.5 4.9-11.6 7.2-18 7.4-.4.4-.6.4-.8.4M210.8 44.2c-7.3 4.6-15.3 15.1-25.1 29.5-1.5 2.3-4 3.5-6.8 3.5-3.6 0-8.2-2.2-13.5-6.5-8.4-6.8-8.6-10.6-8.7-12.1-.2-4 2.8-7.4 7-7.8 8.1-.7 14.8-5.6 21.3-10.3 6.5-4.7 12.5-9 19.7-9 1.4 0 2.9.2 4.3.5"/><path fill="#FFF8EE" d="M164.3 57.5c19.6-1.8 31.1-22.1 43-19-8 5-15.9 15-27 31.4-2.7 3.9-21.4-11.9-16-12.4"/><path fill="#FFF" d="M37.3 48.2c4.9-4.5 11.5-6.8 19.6-6.8 7 0 15.3 1.7 24.6 5.1 2.5.9 5.8 1.1 8.3 1.1h3.7c2.3 0 7.2 0 9.3 4.5.7 1.7 1.6 5.2-1.1 9.3-3.3 5.1-12 10.5-20.4 10.5h-.4c-4.5-.1-8.7-2.5-13.6-5.2-6.1-3.4-13-7.3-21.2-7.3-1.1 0-2.3.1-3.4.2M188.1 96.7c-3.6 0-10.4-1.5-14.7-11.7-2.4-5.4-3.2-11.5-3.2-14.9 0-7 3.7-8.9 6-9.4 1.6-1.6 4.6-5.7 6.8-8.8 9.1-12.4 15.7-20.5 23.4-20.5 1.3 0 2.5.2 3.7.7 10.3 4.1 15.3 12.8 13.6 23.8-1.2 8.1-6.3 17.7-13.8 26.5-3.5 4.1-12.6 13.7-20.7 14.3h-1.1"/><path fill="#FFF" d="M69.9 100.5c-.9 0-1.8 0-2.6-.2-12.8-2.1-28.8-15-34.8-28.3-4.1-9.1-2.3-15.3 0-18.9 3.7-5.9 9.2-9 16-9 8.2 0 16.4 4.5 23.6 8.4 2.8 1.5 6.8 3.7 8.5 4.1.6-.2 1.2-.3 1.9-.3 2.6 0 5 1.4 6.4 3.8 3.3 5.8 1.3 21.4-3.9 30.4-3.6 6.6-9 10-15.1 10z"/><path fill="#FFF" d="M114.5 212.1c-30 0-59.7-14.7-69.6-25.4-10.3-11.1-14-23.7-11.2-37.5 2.4-11.3 8.7-21.4 14.2-30.4 3.8-6.2 7.4-12 8.4-16.2 12.2-53.9 42.8-60.8 68.1-60.8 1.6 0 3.3 0 5.2.1 53.9 1.6 59.3 27.6 62.5 43.2.6 2.9 1.2 5.6 1.9 7.4 18.1 44.4 21.1 71 10 89-10.9 17.7-34.8 26.4-82.4 30.3-2.3.2-4.7.3-7.1.3z"/><path fill="#FFF" d="M113.4 212.2c-30.6 0-58.9-15.2-68.4-25.5-10.3-11.1-14-23.7-11.2-37.5 2.4-11.3 8.7-21.4 14.2-30.4 3.8-6.2 7.4-12 8.4-16.2 12.2-53.9 42.8-60.8 68.1-60.8 1.6 0 3.3 0 5.2.1 53.9 1.6 59.3 27.6 62.5 43.2.6 2.9 1.2 5.6 1.9 7.4 17.8 43.7 20.7 70.1 9.8 88.1-12.5 20.7-41.9 27.4-82.1 31.2-2.8.3-5.6.4-8.4.4"/><path fill="#FFF" d="M191.3 174.6c.4-.9.8-1.9 1.2-2.8 4.1-9.8 7.2-18.4 2.3-23.9-5.8-6.4-30.3-18-52.1-28.2-41.7-19.7-67.5-32.4-71.2-45-.9-3.2-.5-6.5 1.2-9.3C79.9 54.1 100 42 127.5 42h.8c25.9.2 44.7 7.7 56 22.1 9.6 12.2 11.7 26.5 13.3 36.9.5 3.5 1.2 8 1.9 9.2 19.6 33.7 10.6 58.6 3.5 70.3l-11.7-5.9z"/><path fill="#FFF" d="M170.8 135.8c-10.1 0-27-2.5-32.8-8.1-4.6-4.4-6.3-11.7-8.1-18.8-.7-3-1.9-7.8-3-10h-.1c-.4 1.1-.9 2.5-1.3 3.6-2.7 7.6-6.5 18.1-14.4 23.8-3.4 2.5-15.7 4.7-25.2 4.7s-16.7-2-21.5-6.1c-6.9-5.8-12.1-16.5-15.6-31.8-.2-.1-.3-.2-.5-.3-1.6-1.1-3.7-2.4-4.8-4.7-1.8-3.6-1.1-10 .8-13.4 1.4-2.5 3.8-4.1 6.4-4.3h.9c1.4 0 2.8.2 4.4.5s3.5.6 5.1.6h.9c9.5-1.4 18.4-2 26.5-2 19.7 0 30.1 4 34 5.6.3.1.6.2.8.3 1.1.3 3.2.7 5.4.7.8 0 1.6 0 2.3-.2 8.9-1.4 17.4-2 25.2-2 20.8 0 31.8 4.7 36.6 6.8.4.2.8.4 1.1.4h.4c1.3 0 3.2-.4 4.8-.7 1.2-.3 2.4-.5 3.5-.7h.9c3.1 0 5.9 1.8 7.6 4.8 1.9 3.5 3.2 10.8.5 15-1.8 2.8-4.7 4.1-7.1 5.2-.3.1-.7.3-1 .5-.8 1.4-2.2 4.2-3.4 6.5-3.5 6.8-7.4 14.6-11 18.8-3.2 3.6-9.2 5.3-18.3 5.3"/><defs><path id="a" d="M42.5 75H212v59.2H42.5z"/></defs><clipPath id="b"><use href="#a" overflow="visible"/></clipPath><g opacity=".3" clip-path="url(#b)"><path fill="#FFF" d="M166.778 134.181c-8 0-19.3-1.2-27.4-6.9-4.6-3.3-6.7-9.9-9.6-20.5-.8-3-2-7.2-2.9-9.3-.5 1.2-1.1 2.8-1.6 4.1-3 8.1-7.1 19.1-14.6 23.7-3.9 2.4-16 4.6-25.4 4.6-10.1 0-17.4-2.3-21.6-6.7-10.7-11.2-12.8-21.9-14.1-28.2-.2-.9-.4-2.1-.6-2.8-6.3-3.3-6.7-8.2-6.6-10.3.3-3.9 3.3-6.8 7-6.8 2.5 0 4.1 1.2 5.3 2 .1.1.2.2.4.2.1 0 .4.1.5.2 1.6.5 6.3 1.8 7.3 7.9.2 1.1 1.8 7.5 4.4 14.2 4.1 10.7 7 12.5 7.3 12.6 3.4 1.2 7.4 1.8 11.9 1.8 7.4 0 13.6-1.6 16.1-2.4 1.5-2.3 4.5-8.3 6.6-12.4 6.3-12.5 7.4-14.4 10.1-15.8 1.5-.8 3.3-1.2 5.6-1.2 3 0 7.3.7 9.3 1.6 4.6 2 7 8 12.4 23.5 1 2.8 2.2 6.4 3 8.2 4 1.9 13.1 3.2 22.6 3.2 2.7 0 4.7-.1 6-.2.9-1.9 2.2-4.6 3.3-6.9 7.6-16.2 8.8-18.1 10.7-19.6 3.3-2.5 9.1-4.2 12.4-4.2 4.4 0 6.8 2.9 7.4 5.7 1.1 5.8-4.6 8-6.5 8.7-.5.2-1.2.5-1.7.7-.7 1.2-2 3.8-3 5.9-8.2 16-10.9 20.4-14 22.3-3.8 2.1-13 3.1-20 3.1"/></g><defs><path id="c" d="M45 70.7h33.4v16.2H45z"/></defs><clipPath id="d"><use href="#c" overflow="visible"/></clipPath><g opacity=".3" clip-path="url(#d)"><path fill="#FFF" d="M61.388 86.816c-1.2 0-3.5-.2-8.1-1.7-1.2-.4-2.3-.8-3-1.1-1.5-.6-5.4-2.1-5.4-6.7v-6.7h6.6c.9 0 1.5.2 2 .3 1.4.2 5.9.5 7.4.6l.9.1c1.2 0 4.9-.5 6.5-.7 2-.3 2.6-.4 3.4-.4h5.7l.9 5.6c.4 2.8-1.1 6.3-4.8 7.4-.2.1-.9.3-1.5.5-3.5 1.3-7 2.5-10 2.6-.2.2-.4.2-.6.2"/></g><defs><path id="e" d="M181 79.3h25.4v17.2H181z"/></defs><clipPath id="f"><use href="#e" overflow="visible"/></clipPath><g opacity=".3" clip-path="url(#f)"><path fill="#FFF" d="M193.488 96.41c-2.2 0-4.4-.9-7.4-3-2.9-2-5.1-4-5.1-7.5v-6.7h6.5c.9 0 1.8.2 2.7.6.7.3 3.4 1.2 4.6 1.5.4 0 1.2-.2 2.8-.5.8-.2 1.3-.2 2-.2h5.7l.9 5.6c.4 2.7-.8 6.1-4.5 7.4l-1.2.6c-1.8.9-3.9 1.9-6 2.3-.2-.1-.6-.1-1-.1"/></g><path fill="#FFF" d="M171.7 243.3h-24.6V222h24.6v21.3z"/><path fill="#BA8449" d="M182.9 190.1c-.9-1.2-1.9-2.3-3-3.3l-.7-.7s-.1 0-.2-.1c-.5-.2-1.2-.3-1.9-.4-2.9-.4-6-.5-9.1-.6-6.3-.1-12.6.1-18.9.4-12.6.6-25.3 1.6-37.8 3-6.3.7-12.6 1.5-18.8 2.5-3.1.5-6.2 1-9.2 1.7-1.5.3-3 .7-4.4 1.1-.7.2-1.4.4-2 .7-.3.1-.6.2-.7.4 0 0-.1 0-.1.1-.7 1-1.4 2-2.1 3.1-.7 1.1-1.2 2.3-1.8 3.5-1.1 2.4-2.1 4.9-3 7.4s-1.9 5.1-2.8 7.7c-.5 1.3-1 2.6-1.6 3.9-.2.6-.5 1.2-.8 1.8h8.5c4.6-10.3 13.3-22.1 20.5-25 2-.8 34.2-4.8 55.5-4.8 7.9 0 13.3.6 16.3 1.7 8.7 3.4 26.1 19.5 27.9 28.2h4.9c-1-5.5-3-10.9-5.3-16.1-2.6-6-5.7-11.5-9.4-16.2M179.1 185.9z"/><path fill="#895B2E" d="M179.1 185.9zm17.8 17.9c-2.7-6-5.8-11.7-9.9-16.9-1-1.3-2.1-2.6-3.3-3.8l-.9-.9-.2-.2-.1-.1-.2-.2c-.2-.1-.4-.2-.5-.3-.3-.2-.6-.3-.9-.4-1.1-.4-1.9-.5-2.8-.7-3.4-.5-6.6-.6-9.8-.7-6.5-.1-12.8 0-19.2.3-12.8.5-25.5 1.5-38.2 2.8-6.3.7-12.7 1.4-19.1 2.4-3.2.5-6.3 1-9.5 1.7-1.6.4-3.2.7-4.8 1.2-.8.2-1.6.5-2.5.9-.4.2-.9.4-1.4.7-.2.2-.5.3-.8.5-.3.2-.6.5-1 1-.9 1.1-1.8 2.4-2.6 3.6-.8 1.2-1.6 2.5-2.3 3.8-1.4 2.5-2.7 5.1-3.9 7.7-1.1 2.6-2.2 5.2-3.1 7.9-.5 1.3-.9 2.6-1.2 4-.2.7-.4 1.3-.6 2l-.3 1-.1.5c0 .1.2.2.6.5H64.2c.3-.6.5-1.2.8-1.8.5-1.3 1.1-2.6 1.6-3.8 1-2.6 1.9-5.1 2.8-7.7.9-2.5 1.9-5.1 3-7.4.6-1.2 1.2-2.3 1.8-3.5.7-1.1 1.3-2.1 2.1-3.1 0 0 .1 0 .1-.1.2-.1.5-.2.7-.4.6-.2 1.3-.5 2-.7 1.4-.4 2.9-.8 4.4-1.1 3-.7 6.1-1.2 9.2-1.7 6.2-1 12.5-1.8 18.8-2.5 12.6-1.4 25.2-2.4 37.8-3 6.3-.3 12.6-.5 18.9-.4 3.1.1 6.3.2 9.1.6.7.1 1.4.3 1.9.4.1 0 .2 0 .2.1l.7.7c1.1 1.1 2 2.2 3 3.3 3.7 4.7 6.8 10.2 9.4 15.8 2.3 5.2 4.3 10.6 5.3 16.1h5c-.5-3.1-1.3-6.1-2.2-9-1.2-3.1-2.4-6.1-3.7-9.1"/><path fill="#FFF8EE" d="M164.1 195.7c-2.6-1-7.9-1.6-15.5-1.6-21.4 0-53 4-54.7 4.7-6.5 2.6-14.6 13.6-19.1 23.2h115.9c-1.9-7.5-18-22.9-26.6-26.3"/><path fill="#E5D0AE" d="M164.8 193.8c-2.9-1.1-8.4-1.7-16.3-1.7-21.3 0-53.5 4-55.5 4.8-7.3 3-15.9 14.7-20.5 25h2.2c4.5-9.5 12.6-20.5 19.1-23.2 1.7-.7 33.3-4.7 54.7-4.7 7.6 0 12.9.5 15.5 1.6 8.6 3.3 24.7 18.8 26.6 26.3h2c-1.7-8.6-19.1-24.7-27.8-28.1"/><path fill="#BA8449" d="M204.4 194.7c-1.2 2.5-7.5 8.9-12.8 7.4-2.8-.8-2.3 14 4.1 19.9h11.6c3.2-5.1 8.2-20.7 8.8-22.3.7-1.9-10.5-7.5-11.7-5"/><path fill="#895B2E" d="M216.7 198.4c-.2-3.2-2.1-5.5-5.5-6.3-2.7-.6-6.3-.1-7.2 1.6-1.8 3.4-4 7.5-14.9 8.1-.7 0-1.3.7-1.3 1.4s.7 1.3 1.4 1.3c11.4-.5 14.7-4.9 17.1-9.4.5-.4 3.2-.9 5.4 0 1.6.7 2.3 1.8 2.4 3.5.3 6.2-6.2 17.7-9.7 23.5h3.1c3.9-6.8 9.5-17.3 9.2-23.7"/><defs><path id="g" d="M193.5 196.5H217v27.3h-23.5z"/></defs><clipPath id="h"><use href="#g" overflow="visible"/></clipPath><g opacity=".15" clip-path="url(#h)"><path fill="#E3AB5E" d="M194.235 222.3c7.1-1.7 13.4-8.8 13.9-18.9.1-1.9-3.8-5.5-3.8-6.5s11.9.2 12.5 3c.5 2.8-7.4 19.7-10.1 22.5-2.6 2.7-16.7.9-12.5-.1"/></g><path fill="#FCD4C3" d="M199.8 187.8c-.9 6.2 11.2 14.7 19.4 14.5 6.8-.2 14.5-3.4 13.4-7.2-1.1-3.9-7.7.7-8.3-2-.5-2.6 7.7-7.5 4.4-11.1-3.1-3.3-6.7 5.2-10.3 4-3.6-1.2.7-9.5-3.8-10-5.3-.5-3.3 11.3-7.3 11.5-2.8.3-7.2-1.7-7.5.3"/><path fill="none" stroke="#F8A38F" stroke-width="2" stroke-miterlimit="10" d="M199.8 187.8c-.9 6.2 11.2 14.7 19.4 14.5 6.8-.2 14.5-3.4 13.4-7.2-1.1-3.9-7.7.7-8.3-2-.5-2.6 7.7-7.5 4.4-11.1-3.1-3.3-6.7 5.2-10.3 4-3.6-1.2.7-9.5-3.8-10-5.3-.5-3.3 11.3-7.3 11.5-2.8.3-7.2-1.7-7.5.3z"/><defs><path id="i" d="M203.2 182.8h7.8v6.4h-7.8z"/></defs><clipPath id="j"><use href="#i" overflow="visible"/></clipPath><g opacity=".5" clip-path="url(#j)"><path fill="#FCD4C3" d="M203.238 187.742c1.3 1 6 2.3 6.7.6.8-1.7 1.4-5.1.9-5.6-.4 1.6-.9 4.6-2.6 5.3-1.3.5-4.1-.1-5-.3"/></g><defs><path id="k" d="M215.9 181.2h7.7v7.2h-7.7z"/></defs><clipPath id="l"><use href="#k" overflow="visible"/></clipPath><g opacity=".5" clip-path="url(#l)"><path fill="#FCD4C3" d="M216.159 181.142c-.2 1.1-1.1 6.3 1.6 7 2.3.6 4-.8 5.8-3.7-1 .9-3.5 3.1-5.4 2.3-1.9-.9-2.1-2.9-2-5.6"/></g><defs><path id="m" d="M204.5 193h15.8v8.6h-15.8z"/></defs><clipPath id="n"><use href="#m" overflow="visible"/></clipPath><g opacity=".25" clip-path="url(#n)"><path fill="#FCD4C3" d="M204.576 195.158c13.6-6.7 16.4 4.2 15.7 6.4-5.4.9-14.9-4.7-15.7-6.4"/></g><defs><path id="o" d="M223 190.9h5.7v5H223z"/></defs><clipPath id="p"><use href="#o" overflow="visible"/></clipPath><g opacity=".5" clip-path="url(#p)"><path fill="#FCD4C3" d="M224.351 190.896c-2.3 2.6-1.2 4.7.3 5 1.9.4 4.4-1.6 4-1.6-.5 0-4.2 1.2-4.9-.6-.5-1.4.3-2.2.6-2.8"/></g><defs><path id="q" d="M66.1 182.6H195v36.5H66.1z"/></defs><clipPath id="r"><use href="#q" overflow="visible"/></clipPath><g opacity=".15" clip-path="url(#r)"><path fill="#E3AB5E" d="M69.034 208.266c43.7 25.1 130.4-.4 125.8-8.6-6.1-10.9-8.5-17.7-21.9-17.1-13.3.7-98.9 7.5-102.4 10.1-3.4 2.7-7.2 12.3-1.5 15.6"/></g><path fill="#FFF8EE" d="M164.3 57.5c19.6-1.8 31.1-22.1 43-19-8 5-15.9 15-27 31.4-2.7 3.9-21.4-11.9-16-12.4"/><path fill="none" stroke="#E5D0AE" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M164.3 57.5c19.6-1.8 31.1-22.1 43-19-8 5-15.9 15-27 31.4-2.7 3.9-21.4-11.9-16-12.4z"/><path fill="#BA8449" d="M41.8 53.1c8.8-8.2 24.7-5 37.5-.4 7.3 2.6 16.8.5 17.4 2 1.6 3.5-7.9 10.7-15.7 10.5-7.7-.1-20.6-14.6-39.2-12.1"/><path fill="none" stroke="#895B2E" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="M41.8 53.1c8.8-8.2 24.7-5 37.5-.4 7.3 2.6 16.8.5 17.4 2 1.6 3.5-7.9 10.7-15.7 10.5-7.7-.1-20.6-14.6-39.2-12.1z"/><path fill="#FCD4C3" d="M177.7 67.2c4.5 1.3 21.6-32.2 29.9-28.9 26.4 10.5-8 50.9-18.9 51.8-11 .8-13.5-23.7-11-22.9"/><path fill="none" stroke="#F8A38F" stroke-width="2" stroke-miterlimit="10" d="M177.7 67.2c4.5 1.3 21.6-32.2 29.9-28.9 26.4 10.5-8 50.9-18.9 51.8-11 .8-13.5-23.7-11-22.9z"/><path fill="#FCD4C3" d="M82.3 63.2c-7.3 3.2-33.2-23.9-44.1-6.5C31 68.2 52.8 91.4 68.4 93.9s17.7-32.4 13.9-30.7"/><path fill="none" stroke="#F8A38F" stroke-width="2" stroke-miterlimit="10" d="M82.3 63.2c-7.3 3.2-33.2-23.9-44.1-6.5C31 68.2 52.8 91.4 68.4 93.9s17.7-32.4 13.9-30.7z"/><defs><path id="s" d="M180.5 44.8h18v44.6h-18z"/></defs><clipPath id="t"><use href="#s" overflow="visible"/></clipPath><g clip-path="url(#t)"><path fill="#FCD4C3" d="M198.067 44.8c-1.4 4.6-13.2 16.5-11.6 26.7.6 3.8 4.6 15 6.3 14.6s6-3.1 5.6-2.5c-.4.6-6 4.7-8.1 5.8-2.1-1.1-11-21.8-9.7-22.9 3.9-3.5 15.8-21.5 17.5-21.7"/></g><defs><path id="u" d="M38.6 51.5h44.2v31.6H38.6z"/></defs><clipPath id="v"><use href="#u" overflow="visible"/></clipPath><g clip-path="url(#v)"><path fill="#FCD4C3" d="M38.533 57.4c8-4.9 22.6-2.8 31.1 5.5 3 3 3.9 13-2.9 19.8-2.7 2.7 16-9.6 16.1-13.2 0-3.6-1.2-4.6-4-5.6-10.3-3.8-21.1-12.6-30.5-12.4-6.1.1-8.9 4.3-9.8 5.9"/></g><defs><path id="w" d="M181.1 42.2h26.2v44.2h-26.2z"/></defs><clipPath id="x"><use href="#w" overflow="visible"/></clipPath><g opacity=".25" clip-path="url(#x)"><path fill="#FCD4C3" d="M201.3 42.175c18.2 10-11.1 25.2-8.9 44.1-3.8-.4-13.2-18.7-10.9-20.3 3.2-2.2 16.7-24.6 19.8-23.8"/></g><path fill="#E5D0AE" d="M60.9 103.6c.3-1.3.5-2.7.5-4 .1-1.4.2-2.8.5-4.1.1-.7.3-1.4.6-2 .3-.6.5-1.3.7-1.9.5-1.3 1-2.6 1.6-3.8 2.3-5.1 4.9-9.9 8.1-14.4 3.2-4.5 6.7-8.7 10.7-12.3 4-3.7 8.7-6.7 13.7-8.7 5-2.1 10.4-3.4 15.8-4 5.4-.7 10.8-.8 16.2-.7 5.4.1 10.8.4 16.2 1.1 5.4.7 10.8 1.9 16 3.8 2.6 1 5.1 2.1 7.5 3.5 2.4 1.4 4.7 3.1 6.8 5.1 2.1 1.9 3.9 4.2 5.4 6.6 1.5 2.4 2.6 5 3.6 7.7.9 2.6 1.6 5.3 2.2 8s1 5.3 1.6 7.8c.3 1.2.7 2.4 1.1 3.6.5 1.2 1 2.5 1.4 3.8.9 2.5 1.9 5.1 2.8 7.6 3.5 10.2 6.6 20.6 8.5 31.2.9 5.3 1.6 10.7 1.7 16.1.1 5.4-.4 10.8-1.9 16-.4 1.3-.8 2.6-1.3 3.8-.5 1.2-1.2 2.4-1.6 3.7-.2.7-.4 1.3-.7 1.9-.3.6-.7 1.2-1.1 1.8-.7 1.1-1.6 2.3-2.5 3.3-3.5 4.2-8 7.6-12.8 10.2s-10 4.6-15.2 6.1c-5.3 1.5-10.5 2.7-15.9 3.7s-10.7 1.7-16 2.4l-8.1.9-4 .4c-1.3.1-2.7.2-4.1.3-11 .6-22-1-32.5-3.9-5.3-1.5-10.4-3.3-15.4-5.5s-9.9-4.7-14.5-7.7c-2.3-1.5-4.6-3.2-6.7-5.1-.5-.5-1.1-1-1.6-1.5s-.9-1.1-1.4-1.6c-.9-1.1-1.8-2.2-2.6-3.3-3.1-4.6-5.6-10-6.4-15.6-.9-5.7-.1-11.5 1.5-16.8 1.6-5.4 4.1-10.3 6.7-15.1 2.7-4.7 5.6-9.3 8.4-13.8 1.4-2.3 2.7-4.6 3.9-6.9 1.1-3 2.1-5.3 2.6-7.7zm4 .9c-.7 2.8-1.9 5.4-3.2 7.9s-2.7 4.8-4.1 7.1c-2.8 4.6-5.7 9.1-8.2 13.7s-4.8 9.4-6.2 14.3c-1.4 4.9-2 10-1.2 15 .8 4.9 2.9 9.6 5.9 13.7.7 1 1.6 2 2.4 3 .4.5.9 1 1.3 1.4.4.5.9.9 1.3 1.3 1.8 1.7 3.9 3.2 6.1 4.7 4.4 2.8 9 5.3 13.9 7.4 4.8 2.1 9.8 3.9 14.9 5.3s10.2 2.5 15.4 3.2c5.2.7 10.4.9 15.6.7l3.9-.3 4-.4c2.6-.2 5.3-.5 8-.8 5.3-.5 10.6-1.2 15.8-2.1 5.3-.9 10.4-1.9 15.5-3.3s10.1-3 14.9-5.1c4.7-2.2 9.3-4.9 13-8.6.9-.9 1.8-1.9 2.6-2.9.4-.5.8-1.1 1.2-1.6.4-.5.9-1 1.3-1.6.9-1.1 1.3-2.3 1.9-3.5.5-1.2.9-2.5 1.2-3.8 1.3-5.2 1.6-10.6 1.3-15.9-.4-5.3-1.3-10.6-2.6-15.8-2.5-10.4-6.2-20.4-10.1-30.3-1-2.5-2-5-3-7.4l-1.6-3.7c-.5-1.3-1-2.7-1.4-4-.7-2.7-1.2-5.3-1.8-7.9-.5-2.6-1.2-5.1-2-7.5-1.7-4.9-4.2-9.3-7.9-12.8-3.6-3.5-8.1-6.2-12.9-8.2-4.8-2-10-3.3-15.2-4.2-5.2-.9-10.5-1.4-15.8-1.7-5.3-.2-10.7-.3-16 .3-5.3.6-10.5 1.7-15.4 3.8-4.9 2-9.4 4.9-13.2 8.5-3.9 3.6-7 8-9.3 12.6-2.4 4.7-4.1 9.7-5.6 14.7-.4 1.2-.7 2.5-1 3.8-.2.6-.3 1.3-.5 1.9-.1.3-.1.7-.2 1-.1.3-.2.6-.4.9-.5 1.2-1.1 2.4-1.7 3.6-.2 1.1-.6 2.3-.9 3.6z"/><path fill="#FFF8EE" d="M62.9 104.1c-4.2 18.6-40.9 48-13 78.1 9.5 10.2 40.3 25.9 71.2 23 80.4-7.6 100.7-27 66.8-110.2-5.5-13.5.7-44.7-58.4-46.5-24.8-.7-54.6 2.7-66.6 55.6"/><path fill="#E5BFA1" d="M76.8 67.7c2.6-4 6-7.3 9.8-10C90.4 55 94.7 53 99 51.4c8.8-3.2 18-4.4 27.2-4.7 9.2-.2 18.5.5 27.5 2.8 4.5 1.2 8.9 2.8 13.1 5.1s8.1 5.1 11.4 8.6c3.3 3.5 6 7.4 8.1 11.7 2.1 4.3 3.6 8.8 4.7 13.3 1.1 4.6 1.8 9.1 2.4 13.6.3 2.3.6 4.5 1.1 6.6.2 1.1.5 2.1.8 2.9l.3.6.1.1.1.1.2.4.9 1.5c4.4 8.1 7.7 17 8.9 26.3.6 4.6.7 9.3.2 14-.5 4.6-1.7 9.2-3.5 13.5-.9 2.1-1.9 4.2-3.1 6.3l-.9 1.5c-.3.5-.6.9-1 1.5-.1.1-.1.2-.2.3-.3-.2.4.7-1.6 0-.5-.9-.2-.7-.3-.9 0-.3.1-.4.1-.6l.3-.9.5-1.6c1.4-4.3 2.6-8.6 3.1-13.1.2-2.2.3-4.4 0-6.7-.3-2.2-.9-4.3-2-6.1-.3-.5-.6-.9-1-1.3s-.7-.8-1.1-1.2c-.8-.8-1.6-1.5-2.5-2.2-1.8-1.4-3.7-2.5-5.7-3.5-4.1-1.8-8.6-2.5-13-2.3-4.5.2-8.9 1.1-13.2 2.3-2.2.6-4.3 1.3-6.5 2-1.1.4-2.2.7-3.3 1-.6.2-1.1.3-1.8.4-.6.1-1.1.2-1.7.2-4.6.5-9.1.8-13.8.7-4.6-.1-9.2-.6-13.8-1.6-4.5-1-9-2.5-13.2-4.4-4.2-2-8.2-4.4-11.8-7.4-3.6-3-6.8-6.4-9.6-10.1-5.6-7.5-9.3-16.2-11.1-25.3-.9-4.6-1.3-9.2-1.1-13.9.1-2.3.4-4.7.9-7 .6-1.8 1.4-4.1 2.7-6.2zm2 1.3c-1.1 1.8-1.8 3.8-2.3 6-.5 2.1-.7 4.3-.9 6.5-.2 4.4.3 8.9 1.2 13.2 1.9 8.7 5.6 17 11 24 2.7 3.5 5.8 6.7 9.2 9.5 3.4 2.8 7.2 5.2 11.2 7.1 4 1.9 8.2 3.3 12.6 4.3 4.3 1 8.8 1.6 13.2 1.7 4.5.2 8.9 0 13.4-.5l1.7-.2c.5-.1 1-.2 1.6-.3 1.1-.3 2.1-.6 3.2-.9 2.2-.6 4.4-1.3 6.6-1.8 4.4-1.1 9-1.9 13.7-1.9 4.6 0 9.3.8 13.5 2.8 2.1 1 4.1 2.2 5.9 3.6.9.7 1.8 1.5 2.6 2.3l1.2 1.2c.4.4.8.9 1.1 1.4 1.3 2 2 4.3 2.3 6.7s.3 4.7.1 7c-.4 4.6-1.4 9.1-2.7 13.5l-.5 1.6-.2.8c0 .1-.1.3 0 .3-.1-.1.2.2-.2-.7-1.9-.7-1.2.2-1.4-.1.2-.4.5-.9.8-1.4.3-.5.5-1 .8-1.5 1-2 1.9-4 2.7-6.1 3-8.3 3.6-17.4 2.1-26.1-.7-4.4-2-8.6-3.6-12.7s-3.5-8.1-5.7-12l-.8-1.4-.2-.4-.1-.2-.1-.2c-.2-.3-.3-.6-.4-.9-.5-1.2-.8-2.5-1.1-3.6-.5-2.3-.9-4.6-1.2-6.8-.7-4.5-1.3-8.9-2.4-13.2-1-4.3-2.4-8.5-4.3-12.4-1.9-3.9-4.2-7.5-7.2-10.7-5.8-6.3-13.8-10.5-22.3-13s-17.5-3.3-26.5-3.3c-8.9 0-17.9 1.1-26.3 3.9-4.2 1.4-8.2 3.3-11.9 5.8-3.8 2.4-7 5.4-9.4 9.1z"/><path fill="#895B2E" d="M75.6 67.2c1.5-2.4 3.3-4.3 5.1-6.1 1.9-1.8 3.9-3.3 6-4.7 4.2-2.8 8.7-5 13.4-6.7 9.4-3.3 19.3-4.6 29.1-4.4 9.7.3 19.5 1.5 28.9 4.9 4.7 1.7 9.2 3.9 13.3 6.9 4.1 2.9 7.7 6.5 10.7 10.6 2.9 4.1 5.1 8.6 6.8 13.3 1.6 4.7 2.7 9.5 3.5 14.2.4 2.4.7 4.7 1.1 7.1.4 2.3.7 4.7 1.1 6.8.2 1.1.5 2.1.9 2.9l.1.2.1.2.2.4.4.8.9 1.6c1.1 2.1 2.2 4.3 3.2 6.5 1.9 4.4 3.5 9.1 4.6 13.9 1.1 4.7 1.6 9.6 1.6 14.5-.1 9.8-2.8 19.5-7.9 27.8-.4.6-1.2.9-1.8.5-.6-.4-.8-1.1-.6-1.6 1.4-3.6 2.9-7 4-10.5 1.2-3.5 2-7.1 2-10.6s-.9-6.9-3-9.6c-.1-.2-.3-.4-.4-.5l-.2-.2-.2-.3-.9-.9c-.6-.6-1.3-1.2-2-1.7-1.4-1.1-3-2.1-4.5-3.1-6.3-3.9-13-7.3-19.8-10.7-6.8-3.3-13.7-6.5-20.5-9.6-13.8-6.3-27.6-12.6-41.2-19.4-6.8-3.5-13.5-7-20.1-11.2-3.5-2.5-6.7-4.7-9.8-7.5-1.5-1.4-3-3-4.2-5.2-.6-1.1-1.1-2.4-1.2-4 0-.8 0-1.6.2-2.4.1-.4.2-.8.4-1.2.1-.3.4-.9.5-1h.2zm5.6 3.4c-.2.3-.1.2-.2.3 0 .1 0 .1-.1.2v.4c0 .3.2.8.4 1.4.6 1.2 1.7 2.5 2.9 3.6 2.5 2.4 5.4 4.6 8.5 6.6 6.1 4.1 12.7 7.7 19.4 11.3 13.3 7 27 13.5 40.6 20.1 6.8 3.3 13.6 6.7 20.4 10.1 6.8 3.5 13.5 7 20 11.3 1.6 1.1 3.2 2.2 4.7 3.5.8.6 1.5 1.3 2.3 2 .4.4.7.7 1.1 1.2l.2.3.3.3c.2.2.3.4.5.6 1.2 1.7 2.1 3.6 2.7 5.6s.7 4.1.7 6.1c-.1 4-1.2 7.9-2.5 11.6-1.3 3.7-2.9 7.1-4.4 10.6l-2.4-1.2c4.7-8 6.9-17.2 6.8-26.4-.2-9.2-2.6-18.3-6.5-26.7-1-2.1-2-4.2-3.2-6.2l-1.8-3.2c-.7-1.3-1-2.6-1.3-3.8-.6-2.5-1-4.8-1.4-7.2s-.8-4.7-1.2-6.9c-.9-4.6-2-9-3.6-13.3-1.6-4.2-3.7-8.3-6.3-11.8-2.6-3.6-5.9-6.7-9.5-9.2-3.7-2.5-7.7-4.5-12-5.9-8.6-2.9-17.8-3.9-27-4-4.6 0-9.1.2-13.6 1-4.5.7-8.9 1.8-13.1 3.3s-8.3 3.4-12 5.8c-1.9 1.2-3.6 2.5-5.2 4s-3.1 3-4.2 4.6z"/><path fill="#BA8449" d="M77.8 68.3c-11 17 2.1 82.3 71.2 73.5 7.3-.9 31.6-13.9 48 4.3 8.9 10-3.1 35.3 0 30 3.5-5.8 16.9-28.2-3.2-62.7-6.4-11.1 4.2-64.4-65-65.1-26.5-.1-43.7 8.7-51 20"/><defs><path id="y" d="M61.7 64.6H179v111.9H61.7z"/></defs><clipPath id="z"><use href="#y" overflow="visible"/></clipPath><g opacity=".15" clip-path="url(#z)"><path fill="#E3AB5E" d="M75.968 72.433c19.9-12.8 80.1-11.9 99.3 18.8 12.8 20.4-10.6 70.8-19.3 77.2-8.6 6.4-20.6 12-52.2 4.4-26.8-6.4 13.5-31.3-17.9-34.9-28.7-3.3-31.6-51.5-9.9-65.5"/></g><defs><path id="A" d="M118.5 119.2h13.1v5.5h-13.1z"/></defs><clipPath id="B"><use href="#A" overflow="visible"/></clipPath><g opacity=".25" clip-path="url(#B)"><path fill="#E3AB5E" d="M131.6 121.966c0 1.5-2.9 2.8-6.5 2.8s-6.5-1.2-6.5-2.8c0-1.5 2.9-2.8 6.5-2.8 3.6.1 6.5 1.3 6.5 2.8"/></g><path fill="#F8A38F" d="M120.1 113.8c1.5-1 9.5-.7 10.5.4 1 1 3.2 5.2.7 7-.9.6-.9-1.9-2.9-1.5-2.4.5-1.1 3.6-3 3.6-2.9-.1-.1-3.4-2.6-3.8-1.9-.4-2.3 1.5-3.2 1.3-2.9-.6-1.6-5.6.5-7"/><defs><path id="C" d="M117.9 113.2h14.5v9.9h-14.5z"/></defs><clipPath id="D"><use href="#C" overflow="visible"/></clipPath><g clip-path="url(#D)"><path fill="#F8A38F" d="M124.42 113.205c-1.9 0-3.7.2-4.3.6-2.1 1.4-3.4 6.4-.6 6.9h.1c.7 0 1.1-1.4 2.6-1.4h.5c2.5.4-.2 3.8 2.6 3.8 1.8 0 .5-3 3-3.5h.4c1.4 0 1.6 1.6 2.2 1.6.1 0 .2 0 .3-.1 2.6-1.8.4-6-.7-7-.5-.5-3.4-.9-6.1-.9m0 .7c3 0 5.3.4 5.7.7.6.6 1.8 2.8 1.6 4.4-.1.6-.3 1.1-.7 1.4 0-.1-.1-.1-.2-.2-.4-.5-1-1.3-2.1-1.3-.2 0-.4 0-.5.1-1.7.4-2 1.7-2.3 2.6-.2.9-.3.9-.6.9-.8 0-.8-.2-.8-1.1 0-.9 0-2.3-1.8-2.6h-.6c-1.1 0-1.8.7-2.3 1.1-.1.1-.3.3-.4.3-.4-.1-.8-.3-1-1.1-.3-1.4.7-3.8 1.8-4.6.6-.4 2-.6 4.2-.6"/></g><defs><path id="E" d="M74.1 124.9H187V189H74.1z"/></defs><clipPath id="F"><use href="#E" overflow="visible"/></clipPath><g opacity=".25" clip-path="url(#F)"><path fill="#F7E8D0" d="M186.799 140.05c3 19.2-21 43.3-53.3 48.3-32.3 4.9-56.1-23.9-59.1-43.2-3-19.2 16.8-11.9 49.1-16.8s60.3-7.5 63.3 11.7"/></g><defs><path id="G" d="M80 125.9h93.6v47.5H80z"/></defs><clipPath id="H"><use href="#G" overflow="visible"/></clipPath><g opacity=".5" clip-path="url(#H)"><path fill="#D8CAB2" d="M102.515 169.277c-.9-1.4-1.4-3.1-1.9-4.7l-1.5-4.8c-1-3.2-2.1-6.4-3.6-9.4s-3.4-5.8-5.8-7.9c-2.4-2.1-5.3-3.5-8.4-4.1-1.1-.4-1.6-1.5-1.2-2.5.4-1 1.4-1.5 2.3-1.3 7.2 1.7 14.7 2.5 22.1 2.6s15-.3 22.5-1.2c7.5-.9 14.9-2.2 22.2-3.9 7.3-1.7 14.6-3.7 21.7-6.1 1.1-.4 2.2.2 2.5 1.2.3.8 0 1.6-.6 2.1-.2.2-.6.5-.9.8-.3.3-.6.7-.9 1-.6.7-1.2 1.5-1.8 2.3-1.2 1.6-2.3 3.2-3.3 4.9-2.2 3.3-4.2 6.7-6.1 10.2-1.9 3.5-3.8 7-5.5 10.5-.9 1.8-1.7 3.6-2.4 5.4-.4.9-.7 1.8-1.1 2.8-.2.5-.3.9-.4 1.4v.2c0 .1 0 .1-.1.2 0 .1-.1.2-.2.2-.1.1-.2.2-.4.3-.2.2-.5.3-.7.4-1.9.8-3.9 1.2-5.8 1.6-1.9.4-3.9.7-5.9.9-4 .5-7.9.9-11.9 1-4 .2-8 .2-11.9-.2-2-.2-4-.5-5.9-1-1-.3-1.9-.6-2.8-1.1-.9-.4-1.7-1-2.3-1.8m.1-.1c.5.8 1.4 1.4 2.3 1.8.9.4 1.8.7 2.8 1 1.9.5 3.9.8 5.9.9 4 .3 7.9.3 11.9.1 4-.2 7.9-.7 11.8-1.2 1.9-.3 3.9-.6 5.8-1.1s3.9-.9 5.6-1.7c.2-.1.4-.2.6-.4.2-.1.3-.2.3-.3.1-.5.2-1 .4-1.5.3-1 .6-1.9.9-2.9.7-1.9 1.4-3.7 2.2-5.6 1.6-3.7 3.2-7.3 4.9-10.9 1.7-3.6 3.5-7.2 5.4-10.7.9-1.8 1.9-3.5 3-5.3.5-.9 1.1-1.8 1.7-2.6.3-.4.6-.9.9-1.3.4-.4.7-.9 1.2-1.3l1.9 3.4c-7.3 2.5-14.6 4.5-22.1 6.2-7.5 1.7-15 3.1-22.6 4-7.6.9-15.3 1.4-23 1.2s-15.4-1.1-23-2.9l1.1-4c3.3 2 6.3 3.9 8.6 6.6 2.3 2.7 3.9 5.8 5.2 9 1.2 3.2 2.2 6.5 3 9.7.4 1.6.9 3.3 1.3 4.9.6 1.9 1.1 3.5 2 4.9"/></g><defs><path id="I" d="M81 126.9h91.6v46.5H81z"/></defs><clipPath id="J"><use href="#I" overflow="visible"/></clipPath><g opacity=".5" clip-path="url(#J)"><path fill="#D8CAB2" d="M102.532 169.288c-.9-1.4-1.4-3-1.9-4.6-.5-1.6-.9-3.2-1.4-4.8-1-3.2-2-6.4-3.5-9.5-1.4-3-3.3-5.8-5.6-8-2.4-2.3-5.3-3.9-8.4-4.6v-.1c-.5-.2-.8-.8-.6-1.3.2-.5.7-.8 1.2-.7 7.3 1.7 14.8 2.5 22.4 2.6s15.1-.3 22.6-1.2c7.5-.9 14.9-2.3 22.3-3.9 7.4-1.7 14.7-3.7 21.8-6.1.5-.2 1.1.1 1.3.6.1.4 0 .8-.3 1.1-.6.5-1.3 1.3-1.9 2-.6.7-1.2 1.6-1.8 2.3-1.1 1.6-2.2 3.3-3.2 5-2.1 3.3-4.1 6.8-6 10.3-1.9 3.5-3.7 7-5.3 10.6l-2.4 5.4c-.4.9-.7 1.8-1 2.8-.2.5-.3.9-.4 1.4-.1.4-.4.5-.6.7-.2.2-.5.3-.7.4-1.9.8-3.9 1.2-5.8 1.6-1.9.4-3.9.7-5.9 1-3.9.5-7.9.9-11.9 1.1-4 .2-8 .2-11.9-.2-2-.2-4-.5-5.9-1-1-.3-1.9-.6-2.8-1-1-.5-1.9-1.1-2.4-1.9m0-.1c.5.8 1.4 1.4 2.3 1.9.9.4 1.8.7 2.8 1 1.9.5 3.9.8 5.9.9 4 .4 7.9.3 11.9.1 4-.2 7.9-.6 11.9-1.2 1.9-.3 3.9-.6 5.9-1.1 1.9-.4 3.9-.9 5.6-1.7.2-.1.4-.2.6-.4.2-.1.4-.3.4-.4.1-.5.2-1 .4-1.5.3-1 .6-1.9 1-2.8.7-1.9 1.5-3.7 2.3-5.5 1.6-3.7 3.3-7.2 5.1-10.8 1.8-3.6 3.6-7.1 5.6-10.6 1-1.8 2-3.5 3.1-5.1.5-.9 1.1-1.7 1.7-2.5.6-.8 1.2-1.6 2.1-2.4l1 1.8c-7.2 2.5-14.6 4.5-22 6.2s-14.9 3-22.5 4c-7.6.9-15.2 1.4-22.9 1.2-7.6-.2-15.3-1-22.8-2.7l.5-1.9c3.3 1.3 6.3 3.3 8.6 5.9 2.3 2.6 4 5.6 5.3 8.7 1.3 3.1 2.3 6.3 3.2 9.6.4 1.6.9 3.2 1.4 4.9.2 1.4.7 3 1.6 4.4"/></g><path fill="#333" d="M102.6 169.2c5.1 8 46.8 2.5 47.5-.7 1.8-8.1 16.8-36.7 21.6-40.7-8.6 3-53.3 17.3-89.6 8.6 16.3 5.5 16.5 26.6 20.5 32.8"/><g><defs><path id="K" d="M82 127.9h89.6v45.4H82z"/></defs><clipPath id="L"><use href="#K" overflow="visible"/></clipPath><g clip-path="url(#L)"><path fill="#333" d="M171.55 127.95c-6.7 2.3-34.9 11.4-64.1 11.4-8.6 0-17.2-.8-25.5-2.7 16.4 5.3 16.6 26.5 20.6 32.7 1.9 3 9.2 4.1 17.5 4.1 13.4 0 29.5-2.8 30-4.8 1.8-8.2 16.7-36.8 21.5-40.7m-5.6 3.9c-6.5 9.8-15.9 28.7-17.8 35.8-2.5 1.4-15.4 3.8-28.1 3.8-10.2 0-14.8-1.7-15.8-3.2-1-1.5-1.8-4.3-2.6-7.5-1.7-6.1-4.1-14.5-9.8-20.3 5 .6 10.2.9 15.7.9 23.8-.1 47.1-6.1 58.4-9.5"/></g></g><path fill="#FCD4C3" d="M119.7 173.4c-8.6 0-14.2-1.2-16.4-3.6-.2-.2-.2-1.4.8-3.7 2.4-5.5 9.8-14.9 22.6-15.7.9 0 1.7-.1 2.5-.1 15 0 24 7.6 24 8.9-.2.4-.4 1-.7 1.8-.8 1.9-2 4.9-3.1 8.1-1.3 1.3-16.3 4.3-29.7 4.3"/><path fill="#F8A38F" d="M129.2 149.8c-.9 0-1.7 0-2.6.1-17.5 1.1-25.6 18.4-23.8 20.5 2.6 2.8 9.3 3.8 16.9 3.8 13.5 0 29.8-3.1 30.3-4.6 1.5-4.5 3.2-8.2 3.9-10 .6-1.8-9.5-9.9-24.7-9.8m0 1.3c13.4 0 22.4 6.4 23.3 8.3-.2.4-.4.9-.6 1.5-.8 1.9-2 4.7-3.1 7.9-2.1 1.2-16.1 3.9-29.1 3.9-8.1 0-13.7-1.2-15.8-3.3-.1-.7.6-3.5 3.1-7 2.2-3.2 8.6-10.7 19.7-11.3h2.5"/><g><defs><path id="M" d="M103.1 149.4h50.2v20.7h-50.2z"/></defs><clipPath id="N"><use href="#M" overflow="visible"/></clipPath><g clip-path="url(#N)"><path fill="#FCD4C3" d="M103.084 169.317c-1.2 5.4 31.9-21.1 49.7-8.4 3.7-4.9-16-13.2-27.5-11.3-9.7 1.7-19.7 7.9-22.2 19.7"/></g></g><path fill="#FFF7E3" d="M109.8 140.8c1.7 3 4.8 17.6 6.1 17.9s9.5 2.6 10.6 2.1c1.2-.5 1.1-3.3 2.3-2.5 1 .7 1.5 2 2.5 1.5 1.8-.9 7.1-4.2 8-5.6.8-1.5.7-9.8 0-16.4-3.4 1.6-23.5 3.7-29.5 3"/><g><defs><path id="O" d="M109.8 137.9h30.1v23.2h-30.1z"/></defs><clipPath id="P"><use href="#O" overflow="visible"/></clipPath><g clip-path="url(#P)"><path fill="#FFDC99" d="M139.35 137.85c-3 1.3-18.7 3.1-26.6 3.1-1.2 0-2.1 0-2.9-.1 1.7 3 4.8 17.6 6.1 17.9 1.2.3 8 2.2 10.1 2.2.2 0 .4 0 .5-.1 1-.4 1.1-2.6 1.9-2.6.1 0 .3 0 .4.2.9.5 1.3 1.6 2.1 1.6.1 0 .3 0 .4-.1 1.8-.9 7.1-4.2 8-5.6.9-1.5.7-9.8 0-16.5m-.5.9c.6 6.8.6 14 0 15.2-.7 1.2-5.5 4.3-7.7 5.4h-.1c-.2 0-.5-.3-.7-.6-.3-.3-.6-.6-1-.9-.3-.2-.5-.3-.8-.3-.9 0-1.2.9-1.5 1.6-.2.4-.4 1-.7 1.1h-.3c-1.7 0-6.8-1.4-8.9-1.9-.4-.1-.7-.2-.9-.2-.6-.7-1.9-5.4-2.9-8.8-.9-3.1-1.7-6-2.4-7.7h1.9c7.5 0 21.5-1.6 26-2.9"/></g></g><g><defs><path id="Q" d="M109.9 137.5h29.7v10.3h-29.7z"/></defs><clipPath id="R"><use href="#Q" overflow="visible"/></clipPath><g clip-path="url(#R)"><path fill="#EADCBE" d="M112.151 147.85c-.5-5.4 24.4-7.2 27.5-6.7 0-1.3-.2-2.1-.2-3.6-4.1 2.1-26.5 4.3-29.5 3.4.3.6 1.4 3.6 2.2 6.9"/></g></g><g><defs><path id="S" d="M124 143.8h5.5v14.7H124z"/></defs><clipPath id="T"><use href="#S" overflow="visible"/></clipPath><g clip-path="url(#T)"><path fill="#FFDC99" d="M124.558 143.768c.5 1.2 1 2.3 1.4 3.5l1.2 3.6 1.1 3.6 1.1 3.6-1.7.5-.8-3.7-.9-3.7-.9-3.6c-.4-1.2-.7-2.4-1.1-3.5l.6-.3z"/></g></g><g><defs><path id="U" d="M39.1 51.5h39.4v35.7H39.1z"/></defs><clipPath id="V"><use href="#U" overflow="visible"/></clipPath><g opacity=".4" clip-path="url(#V)"><path fill="#FCD4C3" d="M40.384 59.116c13.2 3.4 11.1 26.2 18.9 28 7.9 1.8 18.2-18.8 19.2-23.3-15.2-6.5-22.3-14.1-33.2-11.9-3.6.7-8.6 6.2-4.9 7.2"/></g></g><g><defs><path id="W" d="M59.9 88.7h133.7v42.5H59.9z"/></defs><clipPath id="X"><use href="#W" overflow="visible"/></clipPath><g opacity=".5" clip-path="url(#X)"><path fill="#E3AB5E" d="M76.967 125.833c16.6 1.3 30.3 2 35.2-3.1s6.7-27.7 14.7-27.1c6.8.5 9.1 29.9 13.5 30.7 4.4.9 35.5 9.4 43.3 1.4 7.7-8 11.3-13 9.5-17.8-1.8-4.8-47.3-20.3-56.6-21.2-9.3-.9-72.1 7-73.7 10.9-1.6 4-3.3 3.4-3 7.6.6 8.1.5 17.3 17.1 18.6"/></g></g><path fill="#333" d="M123.5 92.4c1.2 0 5.9-.4 7 .5 6 4.7 5.8 24 12.1 30 5.6 5.4 36.2 9.3 41.5 3.2 5.3-6.1 13.1-24.7 14.9-26.1 1.8-1.3 5.8-2.3 7-4.2 1.2-1.8.2-10-2.6-9.6-2.8.4-8.1 2.1-11.4 1.2-3.3-1-19.4-11.1-59.9-5-3.9.6-7.8 0-10.5-.7S103.7 72.2 63 78c-4 .6-9.6-1.2-11.6-1-2 .2-2.6 6.5-1.8 8.1s5 3 5.5 5 4.2 21.6 13.8 29.7c10.2 8.6 36.2 2.6 38.5 1 10.3-7.3 12.6-28.4 16.1-28.4"/><g><defs><path id="Y" d="M49.1 76.1h157.3v53.1H49.1z"/></defs><clipPath id="Z"><use href="#Y" overflow="visible"/></clipPath><g clip-path="url(#Z)"><path fill="#1A1A1A" d="M88.438 76.123c-7.1 0-15.6.5-25.6 2-.6.1-1.2.1-1.8.1-3.5 0-7.6-1.1-9.5-1.1h-.3c-2 .2-2.6 6.5-1.8 8.1.8 1.7 5 3 5.5 5s4.2 21.6 13.8 29.7c4 3.4 10.6 4.5 17.2 4.5 10 0 19.9-2.5 21.3-3.5 10.4-7.4 12.8-28.5 16.3-28.5.5 0 1.8-.1 3-.1 1.6 0 3.3.1 3.9.5 6 4.7 5.8 24 12.1 30 3.6 3.4 17.4 6.3 28.2 6.3 6.1 0 11.3-.9 13.2-3.1 5.3-6.1 13.1-24.7 14.9-26.1 1.8-1.4 5.8-2.3 7-4.2 1.1-1.8.2-9.6-2.5-9.6h-.2c-2.2.3-6 1.4-9.1 1.4-.8 0-1.6-.1-2.3-.3-2.6-.8-12.7-6.9-35.7-6.9-6.9 0-14.9.5-24.2 1.9-1.1.2-2.3.2-3.3.2-2.7 0-5.2-.4-7.1-.9-2-.2-11.2-5.4-33-5.4m0 2c18.1 0 27.4 3.6 30.8 5 .7.3 1.2.5 1.7.6 1.8.4 4.5 1 7.6 1 1.2 0 2.5-.1 3.6-.3 8.5-1.3 16.5-1.9 23.9-1.9 19 0 28.9 4.2 33.2 6.1.9.4 1.5.6 2 .8.9.3 1.8.4 2.9.4 2.2 0 4.6-.5 6.6-.9.9-.2 1.8-.4 2.5-.5.9 1 1.5 5.4 1 6.6-.4.6-2.1 1.4-3.3 1.9-1.2.5-2.3 1-3.1 1.6-1.1.8-2.2 2.9-5.4 9.3-3.1 6.1-6.9 13.7-9.8 17-1 1.2-4.6 2.4-11.8 2.4-10.5 0-23.9-2.8-26.9-5.7-2.8-2.6-4.2-8.7-5.6-14.6-1.6-6.6-3.1-12.8-6.6-15.6-.9-.7-2.3-1-5.1-1h-3.1c-2.8 0-4 3.3-6.1 9.3-2.3 6.6-5.6 15.5-11.3 19.6-1.3.8-10.7 3.2-20.2 3.2-7.3 0-12.8-1.4-15.9-4-3.8-3.2-9.1-10.7-12.9-27.8-.1-.4-.2-.7-.2-.9-.5-1.9-2.3-3-3.8-4-.6-.4-1.6-1.1-1.8-1.4-.4-.9 0-4.2.6-5.3.7 0 1.7.2 2.8.4 1.9.3 4.3.7 6.5.7.7 0 1.5 0 2.1-.2 8.9-1.1 17.4-1.8 25.1-1.8"/></g></g><g><defs><path id="aa" d="M64.4 83.4h50.5v34.2H64.4z"/></defs><clipPath id="ab"><use href="#aa" overflow="visible"/></clipPath><g opacity=".5" clip-path="url(#ab)"><path fill="none" stroke="#333" stroke-width="4" stroke-miterlimit="10" d="M66.2 90.45c-.9 1.2-1.5 18.9 6 23.7 4.9 3.2 25.7 2.5 29.9.2 6.5-3.7 12.9-20.5 11.1-22.9-3-4-24.6-9.3-40.8-5.1-2 .4-5.1 2.6-6.2 4.1z"/></g></g><path fill="#FFF" d="M66.2 90.4c-.9 1.2-1.5 18.9 6 23.7 4.9 3.2 25.7 2.5 29.9.2 6.5-3.7 12.9-20.5 11.1-22.9-3-4-24.6-9.3-40.8-5.1-2 .5-5.1 2.6-6.2 4.1"/><g><defs><path id="ac" d="M139.8 88.1h50.1v35h-50.1z"/></defs><clipPath id="ad"><use href="#ac" overflow="visible"/></clipPath><g opacity=".5" clip-path="url(#ad)"><path fill="none" stroke="#333" stroke-width="4" stroke-miterlimit="10" d="M188.394 98.163c.8 1.3-1 18.9-9 22.8-5.3 2.5-25.8-.9-29.6-3.7-6-4.5-10.2-22-8.1-24.2 3.5-3.6 25.6-6 41.1.2 1.9.7 4.7 3.3 5.6 4.9z"/></g></g><path fill="#FFF" d="M188.4 98.2c.8 1.3-1 18.9-9 22.8-5.3 2.5-25.8-.9-29.6-3.7-6-4.5-10.2-22-8.1-24.2 3.5-3.6 25.6-6 41.1.2 1.9.7 4.6 3.2 5.6 4.9"/><path d="M89.9 101.2c-.5 3.9-2.5 6.8-4.4 6.5-1.9-.3-2.9-3.6-2.4-7.5s2.5-6.8 4.4-6.5c1.9.3 2.9 3.6 2.4 7.5M169.6 105.6c.4 3.9-.8 7.2-2.6 7.4-1.9.2-3.7-2.8-4.1-6.7-.4-3.9.8-7.2 2.6-7.4 1.8-.1 3.6 2.9 4.1 6.7"/><g><defs><path id="ae" d="M49.1 81.6h156.3v46H49.1z"/></defs><clipPath id="af"><use href="#ae" overflow="visible"/></clipPath><g opacity=".3" clip-path="url(#af)"><path fill="#333" d="M51.475 82.75c2.3 1.5 4.4.6 4.9 3.6s7.4 29 16 32c14.1 4.9 31.9.1 34.3-1.4 2.4-1.5 13.7-26.8 15.6-27.8 1.9-1 7.9.1 9.2.7 3.9 1.7 11.1 29.1 13 30.5 8.7 6.1 36.6 5.6 37.9 4 1.4-1.7 11.8-25.6 13.7-27 2.7-2.1 9-3.5 9.2-2.6.2.9-5.1 1.8-6.7 3.7-1.6 2-12.1 24.9-15.4 26.9-3.3 2-27.7 5.3-40.1-3.4-5.9-4.2-8.2-29.1-12.9-30.5-3-.9-5.3-.8-7.5-.2-2.9 1.9-7 23.1-15.7 28.4-3.5 2.1-30.6 7.4-38.7-1.1-15.1-15.8-10.5-29.9-15.4-31.9-3.3-1.4-4-3.2-4-4.4.3-1.3 1.4-.3 2.6.5"/></g></g><g><defs><path id="ag" d="M51.6 77.2h20.2v3H51.6z"/></defs><clipPath id="ah"><use href="#ag" overflow="visible"/></clipPath><g opacity=".3" clip-path="url(#ah)"><path fill="#333" d="M51.75 77.45c-1.6-.6 6.8 2.9 9.9 2.7 3.1-.2 8.3-2.4 10-2.9 1.5-.5-7.8 1.2-10.1 1.1s-8.9-.6-9.8-.9"/></g></g><g><defs><path id="ai" d="M116.6 82.1h21.7v5.3h-21.7z"/></defs><clipPath id="aj"><use href="#ai" overflow="visible"/></clipPath><g opacity=".3" clip-path="url(#aj)"><path fill="#333" d="M116.6 82.15c2.9 1.3 4.2 4.6 7 4.9s6.2.8 7.8-.1c1.6-.9 5.6-3 6.7-3.2 1.2-.2-8.7 1.3-12.4 1-3.7-.4-8-2.5-9.1-2.6"/></g></g><g><defs><path id="ak" d="M187.4 86h12.3v3.9h-12.3z"/></defs><clipPath id="al"><use href="#ak" overflow="visible"/></clipPath><g opacity=".3" clip-path="url(#al)"><path fill="#333" d="M187.575 85.975c-1.2-.5 4.4 4 6.1 3.8 1.7-.2 4.7-2.1 6-2.6 1-.4-4 1-5.5.7-1.5-.1-5.4-1.4-6.6-1.9"/></g></g><g><defs><path id="am" d="M62.3 82.8h28.9v28.6H62.3z"/></defs><clipPath id="an"><use href="#am" overflow="visible"/></clipPath><g opacity=".3" clip-path="url(#an)"><path fill="#333" d="M63.05 87.825c7.4-7.3 25-4.8 28.2-4.2-21.1 1.5-21.5 3.1-25.2 6.8-.5 2.9-1.2 12.5 2.1 20.9-3.7-2-7.6-21-5.1-23.5"/></g></g><g><defs><path id="ao" d="M165.1 87.8h27.8v30.5h-27.8z"/></defs><clipPath id="ap"><use href="#ao" overflow="visible"/></clipPath><g opacity=".3" clip-path="url(#ap)"><path fill="#333" d="M192.46 95.698c-6.4-8.2-24.1-8.1-27.4-7.8 20.7 4.3 20.9 5.9 24.1 10.1.2 2.9-.4 12.5-4.7 20.4 3.8-1.6 10.1-20 8-22.7"/></g></g><g><defs><path id="aq" d="M65.8 84.8h47.8v27.5H65.8z"/></defs><clipPath id="ar"><use href="#aq" overflow="visible"/></clipPath><g clip-path="url(#ar)"><path fill="#D0DDDC" d="M66.412 102.575c.7-8.6 1.5-15.6 18.6-16.1 13.7-.4 24.6 2.8 26.1 6.1 1 2.1.2 11.3-6.6 19.7 4.4-3.9 11.4-19.4 8.4-21.3-11.1-7.1-33.2-7.3-41.4-4.4-1.5.5-3.9 2.2-5.5 4-.3 2.2-.3 10.8.4 12"/></g></g><g><defs><path id="as" d="M66.8 103H102v13.9H66.8z"/></defs><clipPath id="at"><use href="#as" overflow="visible"/></clipPath><g clip-path="url(#at)"><path fill="#D0DDDC" d="M66.884 103.2c2.6 16.8 33.3 11.7 35.1 11-.1.9-16.1 5.4-29.5.2-5.4-2-5.8-13.1-5.6-11.2"/></g></g><g><defs><path id="au" d="M141.2 89.5h47.7V115h-47.7z"/></defs><clipPath id="av"><use href="#au" overflow="visible"/></clipPath><g clip-path="url(#av)"><path fill="#D0DDDC" d="M186.957 110.087c.4-8.7.4-15.6-16.4-18.2-13.5-2.1-24.7-.3-26.7 2.8-1.2 1.9-1.6 11.2 4.2 20.4-3.9-4.5-9-20.6-5.7-22.2 11.9-5.7 33.9-3.2 41.6.7 1.4.7 3.7 2.6 5 4.7-.1 2.1-1.1 10.7-2 11.8"/></g></g><g><defs><path id="aw" d="M150.2 110.4h36.3v11.7h-36.3z"/></defs><clipPath id="ax"><use href="#aw" overflow="visible"/></clipPath><g clip-path="url(#ax)"><path fill="#D0DDDC" d="M186.383 110.613c-4.6 16.3-34.5 7.5-36.2 6.6 0 .9 15.3 7.3 29.3 3.9 5.6-1.4 7.5-12.4 6.9-10.5"/></g></g><g><defs><path id="ay" d="M87.3 95.2h2v2h-2z"/></defs><clipPath id="az"><use href="#ay" overflow="visible"/></clipPath><g opacity=".25" clip-path="url(#az)"><path fill="#FFF" d="M89.375 96.2c0-.5-.4-1-1-1s-1 .4-1 1 .4 1 1 1 1-.4 1-1"/></g></g><g><defs><path id="aA" d="M166.3 99.9h2v2h-2z"/></defs><clipPath id="aB"><use href="#aA" overflow="visible"/></clipPath><g opacity=".25" clip-path="url(#aB)"><path fill="#FFF" d="M168.375 100.9c0-.5-.4-1-1-1-.5 0-1 .4-1 1s.4 1 1 1c.5 0 1-.5 1-1"/></g></g><g><defs><path id="aC" d="M52 79.1h64.8v9.5H52z"/></defs><clipPath id="aD"><use href="#aC" overflow="visible"/></clipPath><g opacity=".1" clip-path="url(#aD)"><path fill="#D0DDDC" d="M52.025 81.675c2.4 2.7 3.9 3 7.1 2.6 31.1-4 48.3-3.9 56.8 4 1.8 1.7.8-5.1-2.6-6-26.2-6.9-45.2-.7-49.2-.2-4.1.6-7-.3-12.1-.4"/></g></g><g><defs><path id="aE" d="M137.7 82.3h47.9v9.2h-47.9z"/></defs><clipPath id="aF"><use href="#aE" overflow="visible"/></clipPath><g opacity=".1" clip-path="url(#aF)"><path fill="#D0DDDC" d="M138.025 85.675c-.7.7-.4 7.9 3 5.2 9.8-7.8 30.3-6 44.6-1.2-2.3-4.5-19-7.6-28.4-7.5-4.5.2-17.3 1.5-19.2 3.5"/></g></g><path fill="#D0DDDC" d="M197.2 91.4c0 .3-1.6.5-3.5.5s-3.5-.2-3.5-.5 1.6-.5 3.5-.5c2 0 3.5.3 3.5.5M62.4 82.8c0 .3-1.6.3-3.5 0s-3.4-.8-3.3-1.1 1.6-.3 3.5 0c1.9.2 3.4.7 3.3 1.1"/><g><path fill="#FFF" d="M256.04 243.036c-.6-6.1-5.1-8.8-9.2-8.8-1.9 0-3.4.5-4 .8l-.8.4-.7.5c-1 .7-2.7 1.8-4.2 2.3-.1-1.2 0-2.8.2-4.2v-.2c1.1-10.7-1.1-17-6.7-18.6-.9-.3-1.9-.4-2.9-.4-3.4 0-6.4 1.6-8.3 3-1.6-2.1-4.4-3.2-7.8-3.2-5.1 0-9.2 2.4-10.7 6.2-.2.4-.4 1-.6 1.8-3-6.6-9.1-9.1-14.8-9.1-5.4 0-10.6 2.1-12.5 3.6-.1.1-.2.1-.3.2-5.1 3.6-9.1 8.2-11.9 13.7-1.4-4.7-4.4-9.2-9.7-12.5l-.1-.1c-.2-.1-.3-.2-.4-.2 5.3-9.3 9.9-21.7 7.1-33.5-3-12.6-10.4-14.4-14.5-14.4-1.7 0-3.5.3-5.3.9h-.2c-7.8 3.1-11.2 7.7-12 8.8-.8 1.2-9.3 14.2-11.4 33.2-.2 2.1-.5 4.3-.7 6.5-1.2-1.7-3.2-3.3-6.3-4.2-1-.3-2-.4-3-.4-4.3 0-7.8 2.6-9.7 4.4-1.6-2.4-4.2-3.9-7.1-4h-.7c-4.6 0-8.2 2-10.9 4.3-1.7-3-4.9-4.9-8.6-4.9h-1.5c-5.1 0-9.1 2.4-10.7 6.4-.1.3-.3.7-.4 1.2-4-5-9.1-7.3-16-7.3h-.7c-4.3.1-14.9 1.9-21.5 16.6-1 2.3-1.8 4.6-2.4 6.8-1.4-.7-2.8-.8-3.7-.8-3.4 0-6 1.9-7.2 3.8-1 1.5-4.2 6.7-2.6 11.9.9 2.8 2.8 4.9 5.6 6 2.5 1 5.6 1.9 7.9 2.6 1.4 3.3 4 7 8.6 10.5 3.2 2.5 7.4 3.7 12.2 3.7 8.2 0 16.1-3.5 16.9-3.9l.3-.2.1-.1c1.6 1.6 3.6 2.8 6.2 3.3.8.2 1.8.3 3 .3 4.4 0 7.5-2.3 10.4-6.5 2.3 3.7 6.6 5.7 11.6 5.7.3 0 .5.2.9.2 2.6 0 6-.9 8.7-5.4 2.3 4.1 6.5 6.5 11.5 6.5 4.4 0 8.3-1.8 9-2.2l.2-.1c1.5-.8 2.7-1.5 3.7-2 3.3 1.8 8.3 3.7 14.5 3.7 1.1 0 2.1 0 3.2-.2h.6c13-2.6 21.5-5.7 26.6-8.1 3.5 4 9.2 7.8 17.2 8.4.9.1 1.8.1 2.7.1 6.6 0 11.9-1.9 15.8-3.9 1.2 1.3 2.8 2.5 4.8 3.3 1.2.5 2.5.7 3.7.7 8.1 0 11.9-9.6 12.9-12.9l1.9-5.2c1.7 1.8 3.9 3.3 6.7 4.1 1.5.4 3.2.7 4.8.7 8.9 0 17.5-6.3 18.8-7.4 2.3-2.3 4.9-6.5 4.4-12.2"/></g><g><path fill="#E24B31" d="M174.35 245.713s-1.1-4 3.1-11.6 7.4-3.5 7.4-3.5 3.6 3.9-.5 9.7c-4.1 5.8-10 5.4-10 5.4m-32.1 5.5c-4.8 12.5-16.4 7.4-16.4 7.4s-1.3-4.5 2.5-17 12.6-7.6 12.6-7.6 6.1 4.7 1.3 17.2m-8.7-52.5s7.2-18.9 9-9.7c1.8 9.2-15.2 36.5-15.2 36.5.2-6.1 6.2-26.8 6.2-26.8m-103.5 47c.3-12.1 8.2-17.4 11-14.8 2.8 2.6 1.8 8.4-3.5 11.9-5.1 3.6-7.5 2.9-7.5 2.9m219.3-2c-.4-4.1-4.1-2.6-4.1-2.6s-5.9 4.6-11.1 4.1c-5.2-.5-3.5-12.1-3.5-12.1s1.1-10.7-1.9-11.6c-3.1-.9-6.8 2.8-6.8 2.8s-4.7 5.2-6.9 11.8l-.6.2s.7-11.6-.1-14.3c-.6-1.3-6.2-1.2-7.1 1.1-.9 2.3-5.4 18.6-5.7 25.5 0 0-8.8 7.4-16.4 8.7-7.7 1.2-9.5-3.6-9.5-3.6s20.8-5.8 20.1-22.4c-.7-16.6-16.8-10.5-18.6-9.1-1.8 1.3-11.1 7-13.9 22.6-.1.5-.3 2.9-.3 2.9s-8.1 5.4-12.5 6.8c0 0 12.5-21.1-2.8-30.7-6.9-4.2-12.5 4.6-12.5 4.6s20.7-23 16.1-42.5c-2.2-9.3-6.8-10.3-11.1-8.8-6.5 2.6-8.9 6.3-8.9 6.3s-8.4 12.1-10.3 30.2-4.8 39.8-4.8 39.8-4 3.9-7.6 4.1c-3.7.2-2-10.9-2-10.9s2.8-16.9 2.6-19.8-.4-4.4-3.8-5.4c-3.3-1-7 3.3-7 3.3s-9.7 14.7-10.5 16.9l-.5.9-.5-.6s6.8-20 .3-20.3c-6.5-.3-10.8 7.1-10.8 7.1s-7.4 12.5-7.7 13.9l-.5-.6s3.1-14.5 2.5-18.1c-.6-3.6-4-2.8-4-2.8s-4.3-.5-5.4 2.3c-1.1 2.8-5.2 21-5.7 26.8 0 0-10.7 7.7-17.7 7.7-7 .1-6.3-4.5-6.3-4.5s25.8-8.8 18.8-26.3c-3.2-4.5-6.8-5.9-12-5.8-5.2.1-11.3 3.3-15.5 12.6-2 4.5-2.8 8.7-2.8 11.9 0 0-4.8.9-7.3-1.1s-3.9 0-3.9 0-4.3 6.1-.1 7.7c4.2 1.6 10.6 3.2 10.6 3.2.6 2.6 2.3 7 7.4 10.8 7.6 5.8 22.3-.9 22.3-.9l6-3.6s.2 5.4 4.6 6.2c4.4.8 6.2-.1 13.9-18.6 4.5-9.5 4.8-9 4.8-9l.5-.1s-3.5 18.1-2.1 23 7.1 4.4 7.1 4.4 3.2 1.1 5.7-7.9c2.6-9 7.4-18.4 7.4-18.4h.6s-2.1 18.1 1.1 24c3.3 5.9 11.7 1.8 11.7 1.8s5.9-3.1 6.8-4c0 0 7 5.9 16.9 4.8 22.1-4.4 30-10.3 30-10.3s3.8 9.6 15.6 10.5c13.5 1 20.8-7.5 20.8-7.5s-.1 5.5 4.6 7.4c4.7 1.9 7.9-8.3 7.9-8.3l7.9-21.1h.7s.4 13.5 8.2 15.7c7.8 2.2 17.9-5.6 17.9-5.6s2.2-1.1 1.7-5.2"/></g></svg>
diff --git a/devtools/client/debugger/images/sources/express.svg b/devtools/client/debugger/images/sources/express.svg
new file mode 100644
index 0000000000..e49ceb275f
--- /dev/null
+++ b/devtools/client/debugger/images/sources/express.svg
@@ -0,0 +1,7 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+ <path fill-rule="evenodd" d="M2.33 8.67H7.9v-.11c.02-.47-.03-.92-.14-1.36a3.4 3.4 0 0 0-.53-1.16A2.76 2.76 0 0 0 4.87 4.9a2.8 2.8 0 0 0-2.1.95c-.29.31-.51.7-.68 1.13a5.53 5.53 0 0 0-.08 2.93c.12.44.3.83.54 1.16.24.33.56.58.94.77.39.18.85.26 1.38.25.78 0 1.45-.22 2-.67.54-.45.86-1.08.95-1.88l.02-.13h-.5v.1c-.12.71-.4 1.23-.83 1.58-.43.35-.99.52-1.67.52-.46 0-.84-.08-1.15-.23a2.07 2.07 0 0 1-.76-.64c-.2-.27-.35-.6-.44-.96a5.2 5.2 0 0 1-.16-1.1zm5.08-.5a3.8 3.8 0 0 0-.16-1c-.11-.35-.27-.66-.48-.93-.21-.26-.47-.47-.78-.62a2.46 2.46 0 0 0-1.1-.23 2.3 2.3 0 0 0-1.76.77 3 3 0 0 0-.55.92c-.13.33-.2.7-.24 1.1H7.4z"/>
+ <path d="M13.32 5.06h.6L11.4 8.39l2.76 3.56h-.62L11.1 8.77l-2.45 3.18h-.6l2.74-3.56-2.5-3.33h.62L11.1 8l2.23-2.94z"/>
+</svg>
diff --git a/devtools/client/debugger/images/sources/extension.svg b/devtools/client/debugger/images/sources/extension.svg
new file mode 100644
index 0000000000..90ceb53835
--- /dev/null
+++ b/devtools/client/debugger/images/sources/extension.svg
@@ -0,0 +1,6 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
+ <path d="M14.1 7.32c-.81 0-.84.84-1.46.84a.64.64 0 0 1-.63-.63v-2.7a.83.83 0 0 0-.83-.84H8.47a.64.64 0 0 1-.63-.63c0-.62.84-.65.84-1.46C8.68 1.18 7.92.65 7 .65c-.92 0-1.67.53-1.67 1.25 0 .81.83.84.83 1.46a.64.64 0 0 1-.62.63H2.83a.83.83 0 0 0-.83.83V6.7a.64.64 0 0 0 .63.62c.62 0 .65-.83 1.46-.83.72 0 1.25.75 1.25 1.67 0 .92-.53 1.67-1.25 1.67-.81 0-.84-.84-1.46-.84a.64.64 0 0 0-.63.63v3.55a.83.83 0 0 0 .83.83h2.72a.64.64 0 0 0 .62-.63c0-.62-.83-.65-.83-1.46 0-.72.75-1.25 1.67-1.25.91 0 1.67.53 1.67 1.25 0 .81-.84.84-.84 1.46a.64.64 0 0 0 .63.63h2.7a.83.83 0 0 0 .84-.83v-2.72a.64.64 0 0 1 .63-.62c.62 0 .65.83 1.46.83.72 0 1.25-.75 1.25-1.67 0-.91-.53-1.67-1.25-1.67z"/>
+</svg>
diff --git a/devtools/client/debugger/images/sources/immutable.svg b/devtools/client/debugger/images/sources/immutable.svg
new file mode 100644
index 0000000000..6dd7c5047a
--- /dev/null
+++ b/devtools/client/debugger/images/sources/immutable.svg
@@ -0,0 +1,6 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+ <path d="M1.06 3.32C1.03 3.35 1 5.5 1 8.06v4.68h3.22V3.26H2.68c-.86 0-1.59.02-1.62.06zM2.75 8c0 3.1-.02 3.55-.14 3.55-.12 0-.14-.46-.14-3.55 0-3.1.02-3.55.14-3.55.12 0 .14.46.14 3.55zM5.2 3.31c-.03.04-.06 2.18-.06 4.75v4.68h3.04l.02-1.66.03-1.67.91 1.34c.5.74.94 1.35.98 1.35.03 0 .47-.6.97-1.36l.92-1.36.02 1.68.02 1.68H15V3.26h-2.44l-1.2 1.8c-.65.98-1.21 1.78-1.24 1.78-.03 0-.6-.8-1.24-1.77L7.67 3.3l-1.2-.02c-.65-.01-1.22 0-1.26.03zM8.5 6.76c.85 1.27 1.58 2.3 1.62 2.3a34 34 0 0 0 1.63-2.3c1.03-1.53 1.61-2.3 1.72-2.3.15 0 .16.22.16 3.54 0 3.1-.02 3.55-.14 3.55-.12 0-.14-.43-.14-3.23 0-1.78-.03-3.22-.07-3.22-.04 0-.76 1-1.59 2.2a34.1 34.1 0 0 1-1.57 2.22c-.04 0-.75-1-1.58-2.21-.82-1.2-1.52-2.2-1.56-2.21-.05 0-.08 1.44-.08 3.22 0 2.8-.01 3.23-.13 3.23-.12 0-.14-.46-.14-3.55 0-3.32 0-3.55.16-3.55.1.01.69.8 1.7 2.3z"/>
+</svg>
diff --git a/devtools/client/debugger/images/sources/javascript.svg b/devtools/client/debugger/images/sources/javascript.svg
new file mode 100644
index 0000000000..7afb624598
--- /dev/null
+++ b/devtools/client/debugger/images/sources/javascript.svg
@@ -0,0 +1,6 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16" fill="context-fill">
+ <path d="M5 3.55h1.98v5.66c0 2.51-1.2 3.39-3.12 3.39-.47 0-1.07-.08-1.46-.21l.22-1.61c.28.1.64.16 1.02.16.84 0 1.36-.38 1.36-1.74V3.55zm3.7 6.87c.54.28 1.36.54 2.22.54.9 0 1.4-.37 1.4-.95 0-.54-.43-.87-1.49-1.24C9.37 8.24 8.4 7.44 8.4 6.15c0-1.5 1.27-2.65 3.33-2.65 1 0 1.73.21 2.26.46l-.45 1.58a4.13 4.13 0 0 0-1.83-.42c-.87 0-1.28.42-1.28.86 0 .56.49.81 1.63 1.26 1.56.57 2.28 1.37 2.28 2.63 0 1.48-1.13 2.73-3.55 2.73-1 0-1.99-.28-2.49-.55l.4-1.63z"/>
+</svg>
diff --git a/devtools/client/debugger/images/sources/jquery.svg b/devtools/client/debugger/images/sources/jquery.svg
new file mode 100644
index 0000000000..57d81efa1e
--- /dev/null
+++ b/devtools/client/debugger/images/sources/jquery.svg
@@ -0,0 +1,6 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+ <path d="M8.15 11.8a5.64 5.64 0 0 1-1.5-.58 7.27 7.27 0 0 1-2.52-2.17C2.92 7.39 2.48 5.1 3.45 3.23L2.6 4.32c-1.1 1.58-.96 3.65-.12 5.33a6.92 6.92 0 0 0 3 3.08 7.07 7.07 0 0 0 1.36.55c.08.03.16.06.24.07 5.33.98 6.88-3.2 6.88-3.2-1.3 1.7-3.6 2.14-5.8 1.64zM6.23 7.46a5.15 5.15 0 0 0 2.95 2.05c4.12.68 5.07-2.49 5.07-2.49-.86 1.24-2.52 1.83-4.29 1.37a5.4 5.4 0 0 1-1.9-.96 4.97 4.97 0 0 1-1.69-2.4c-.3-.98-.24-2.08.3-2.98L6 2.98a3.83 3.83 0 0 0-.13 3.9c.1.2.22.4.35.59zm4.34-1.42l.3.1c2.27.43 2.89-1.18 3.05-1.41-.54.78-1.45.96-2.56.7a3.1 3.1 0 0 1-1.15-.57c-1-.75-1.62-2.2-.97-3.37l-.35.48A2.4 2.4 0 0 0 8.7 4.3a3.26 3.26 0 0 0 1.87 1.75z"/>
+</svg>
diff --git a/devtools/client/debugger/images/sources/lodash.svg b/devtools/client/debugger/images/sources/lodash.svg
new file mode 100644
index 0000000000..bf8022cd6d
--- /dev/null
+++ b/devtools/client/debugger/images/sources/lodash.svg
@@ -0,0 +1,7 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+ <path d="M2 2.65h1.12v7.42h4.42V11H2V2.65zm9.03 2.01a2.76 2.76 0 0 0-2.64 1.82 3.6 3.6 0 0 0 .72 3.84c.96.8 2.42.86 3.5.3a2.63 2.63 0 0 0 1.33-2.02c.13-.87.06-1.81-.36-2.6a2.8 2.8 0 0 0-2.44-1.33l-.11-.02v.01zm.1.89c.84 0 1.6.64 1.73 1.46.26.93.1 2.07-.66 2.73-.71.58-1.86.5-2.44-.22-.71-.76-.71-1.93-.35-2.85.26-.66.93-1.13 1.65-1.12h.09-.02z"/>
+ <path opacity=".6" d="M2 12.17h12v1.27H2v-1.27z"/>
+</svg>
diff --git a/devtools/client/debugger/images/sources/marko.svg b/devtools/client/debugger/images/sources/marko.svg
new file mode 100644
index 0000000000..79defc2f5c
--- /dev/null
+++ b/devtools/client/debugger/images/sources/marko.svg
@@ -0,0 +1,64 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="256px" height="140px" viewBox="0 0 256 140" version="1.1" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid">
+ <defs>
+ <linearGradient x1="49.9109718%" y1="99.9084071%" x2="49.9109718%" y2="-0.0902654867%" id="linearGradient-1">
+ <stop stop-color="#8AC23E" offset="0%"></stop>
+ <stop stop-color="#8AC23E" stop-opacity="0" offset="100%"></stop>
+ </linearGradient>
+ <linearGradient x1="49.9835165%" y1="0.0637125664%" x2="49.9835165%" y2="100.062389%" id="linearGradient-2">
+ <stop stop-color="#698932" offset="0%"></stop>
+ <stop stop-color="#698932" stop-opacity="0" offset="100%"></stop>
+ </linearGradient>
+ <linearGradient x1="50.0595611%" y1="0.0637125664%" x2="50.0595611%" y2="100.062389%" id="linearGradient-3">
+ <stop stop-color="#FFED01" offset="0%"></stop>
+ <stop stop-color="#FFED01" stop-opacity="0" offset="100%"></stop>
+ </linearGradient>
+ <linearGradient x1="50.0170846%" y1="0.0637125664%" x2="50.0170846%" y2="100.092699%" id="linearGradient-4">
+ <stop stop-color="#E02A89" offset="0%"></stop>
+ <stop stop-color="#E02A89" stop-opacity="0" offset="100%"></stop>
+ </linearGradient>
+ <linearGradient x1="49.9631661%" y1="-0.0915929204%" x2="49.9631661%" y2="99.9070796%" id="linearGradient-5">
+ <stop stop-color="#7F1E4F" offset="0%"></stop>
+ <stop stop-color="#7F1E4F" stop-opacity="0" offset="100%"></stop>
+ </linearGradient>
+ <linearGradient x1="49.9652038%" y1="-0.0915929204%" x2="49.9652038%" y2="99.9070796%" id="linearGradient-6">
+ <stop stop-color="#E95506" offset="0%"></stop>
+ <stop stop-color="#E95506" stop-opacity="0" offset="100%"></stop>
+ </linearGradient>
+ <linearGradient x1="49.9766458%" y1="99.9084071%" x2="49.9766458%" y2="-0.0265486726%" id="linearGradient-7">
+ <stop stop-color="#88D0F1" offset="0%"></stop>
+ <stop stop-color="#88D0F1" stop-opacity="0" offset="100%"></stop>
+ </linearGradient>
+ <linearGradient x1="50.0205329%" y1="0.0637125664%" x2="50.0205329%" y2="99.9986726%" id="linearGradient-8">
+ <stop stop-color="#00828B" offset="0%"></stop>
+ <stop stop-color="#00828B" stop-opacity="0" offset="83.25%"></stop>
+ </linearGradient>
+ <linearGradient x1="50.078022%" y1="99.9752212%" x2="50.078022%" y2="0.0705752212%" id="linearGradient-9">
+ <stop stop-color="#2073BA" offset="0%"></stop>
+ <stop stop-color="#2073BA" stop-opacity="0" offset="100%"></stop>
+ </linearGradient>
+ <linearGradient x1="50.0177116%" y1="0.0637125664%" x2="50.0177116%" y2="99.9986726%" id="linearGradient-10">
+ <stop stop-color="#8ED0E1" offset="0%"></stop>
+ <stop stop-color="#88D0F1" stop-opacity="0" offset="100%"></stop>
+ </linearGradient>
+ </defs>
+ <g>
+ <path d="M128.1,0 L164.2,0 C150.9,21.8 136.2,45.8 121.5,69.7 L85.4,69.7 C100.1,45.8 114.8,21.8 128.1,0 Z" fill="#8DC220"></path>
+ <path d="M42.7,0 L78.8,0 C71.7,11.6 64.5,23.3 57.4,34.9 C50.3,46.5 43.2,58.1 36.1,69.7 C43.2,81.3 50.3,93 57.4,104.6 C64.5,116.2 71.6,127.8 78.8,139.4 L42.7,139.4 C35.6,127.8 28.4,116.2 21.3,104.6 C14.2,93.1 7.1,81.4 0,69.8 C7.1,58.2 14.2,46.6 21.3,35 C28.4,23.3 35.6,11.7 42.7,0 Z" fill="#44BFEF"></path>
+ <path d="M42.7,0 L42.7,0 C57.4,24 72.1,48 85.4,69.7 L121.5,69.7 C108.2,48 93.5,24 78.8,0 L78.8,0 L42.7,0 Z" fill="#00AC71"></path>
+ <path d="M164.2,0 L128.1,0 C135.2,11.6 142.3,23.3 149.5,34.9 C156.6,46.5 163.7,58.1 170.9,69.7 C163.8,81.3 156.6,93 149.5,104.6 C142.4,116.2 135.3,127.8 128.1,139.4 L164.2,139.4 C171.3,127.8 178.4,116.2 185.6,104.6 C192.7,93 199.8,81.4 207,69.7 C199.8,58.1 192.7,46.5 185.6,34.9 C178.5,23.3 171.3,11.7 164.2,0 Z" fill="#F9BC00"></path>
+ <path d="M149.3,24.6 L113.2,24.6 C108.6,32.1 104,39.7 99.4,47.2 C94.8,54.7 90.2,62.3 85.5,69.8 L121.6,69.8 C126.2,62.3 130.9,54.7 135.5,47.2 C140,39.6 144.6,32.1 149.3,24.6 Z" fill="url(#linearGradient-1)"></path>
+ <path d="M100.5,45.2 L136.6,45.2 C141.2,37.7 145.8,30.1 150.4,22.6 C155,15.1 159.6,7.5 164.2,0 L128.1,0 C123.5,7.5 118.9,15.1 114.3,22.6 C109.7,30.2 105.1,37.7 100.5,45.2 Z" fill="url(#linearGradient-2)"></path>
+ <path d="M191.9,45.2 L155.8,45.2 C151.2,37.7 146.5,30.1 141.9,22.6 C137.3,15.1 132.7,7.5 128.1,0 L164.2,0 C168.8,7.5 173.4,15.1 178,22.6 C182.7,30.2 187.3,37.7 191.9,45.2 Z" fill="url(#linearGradient-3)"></path>
+ <path d="M213.2,0 L177.1,0 C184.2,11.7 191.3,23.3 198.4,34.9 C205.5,46.5 212.7,58.1 219.8,69.7 C212.7,81.3 205.5,93 198.4,104.6 C191.3,116.2 184.2,127.8 177,139.4 L213.1,139.4 C220.2,127.8 227.3,116.2 234.5,104.6 C241.6,93 248.7,81.4 255.9,69.7 C248.8,58.1 241.7,46.5 234.5,34.9 C227.5,23.3 220.3,11.7 213.2,0 Z" fill="#DF1B1C"></path>
+ <path d="M240.9,45.2 L204.8,45.2 C200.1,37.7 195.5,30.1 190.9,22.6 C186.3,15.1 181.7,7.5 177.1,0 L213.2,0 C217.8,7.5 222.4,15.1 227,22.6 C231.6,30.2 236.3,37.7 240.9,45.2 Z" fill="url(#linearGradient-4)"></path>
+ <path d="M192.2,115 L228.3,115 C232.9,107.5 237.5,100 242.1,92.4 C246.7,84.9 251.3,77.3 256,69.8 L219.8,69.8 C215.2,77.3 210.6,84.9 206,92.4 C201.4,99.9 196.8,107.4 192.2,115 Z" fill="url(#linearGradient-5)"></path>
+ <path d="M143.2,115 L179.3,115 C183.9,107.5 188.5,99.9 193.1,92.4 C197.7,84.9 202.3,77.3 207,69.8 L170.9,69.8 C166.3,77.3 161.7,84.9 157.1,92.4 C152.4,99.9 147.8,107.4 143.2,115 Z" fill="url(#linearGradient-6)"></path>
+ <path d="M63.8,24.6 L27.7,24.6 C23.1,32.1 18.5,39.7 13.9,47.2 C9.2,54.7 4.6,62.3 0,69.8 L36.1,69.8 C40.7,62.3 45.3,54.8 49.9,47.2 C54.5,39.7 59.1,32.1 63.8,24.6 Z" fill="url(#linearGradient-7)"></path>
+ <path d="M15,45.2 L51.1,45.2 C55.7,37.7 60.3,30.1 64.9,22.6 C69.6,15.1 74.2,7.5 78.8,0 L42.7,0 C38.1,7.5 33.5,15 28.9,22.6 C24.3,30.1 19.7,37.7 15,45.2 Z" fill="url(#linearGradient-8)"></path>
+ <path d="M15,94.3 L51.1,94.3 C55.7,101.8 60.3,109.4 64.9,116.9 C69.5,124.4 74.1,132 78.7,139.5 L42.6,139.5 C38,132 33.3,124.5 28.7,116.9 C24.2,109.4 19.6,101.9 15,94.3 Z" fill="url(#linearGradient-9)"></path>
+ <path d="M106.5,45.2 L70.4,45.2 C65.8,37.7 61.2,30.1 56.6,22.6 C51.9,15.1 47.3,7.5 42.7,0 L78.8,0 C83.4,7.5 88,15 92.6,22.6 C97.3,30.1 101.9,37.7 106.5,45.2 Z" fill="url(#linearGradient-10)"></path>
+ </g>
+</svg>
diff --git a/devtools/client/debugger/images/sources/mobx.svg b/devtools/client/debugger/images/sources/mobx.svg
new file mode 100644
index 0000000000..dacdf0cdc0
--- /dev/null
+++ b/devtools/client/debugger/images/sources/mobx.svg
@@ -0,0 +1,7 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+ <path fill="#E05D17" d="M1 1h14v14H1z"/>
+ <path d="M4.9 12h-2v-.64h1.23V4.18H2.9v-.64h2V12zM10.1 5.84c-.24.85-.5 1.66-.82 2.44-.31.79-.61 1.49-.9 2.1h-.75c-.3-.61-.6-1.31-.9-2.1a22.5 22.5 0 0 1-.82-2.44h.89a18.18 18.18 0 0 0 .56 1.87 34.01 34.01 0 0 0 .66 1.72 17.98 17.98 0 0 0 .65-1.72 26.87 26.87 0 0 0 .57-1.87h.86zM11.1 3.54h2v.64h-1.23v7.18h1.23V12h-2V3.54z" fill="#fff"/>
+</svg>
diff --git a/devtools/client/debugger/images/sources/nextjs.svg b/devtools/client/debugger/images/sources/nextjs.svg
new file mode 100644
index 0000000000..19d3a5ec3c
--- /dev/null
+++ b/devtools/client/debugger/images/sources/nextjs.svg
@@ -0,0 +1,17 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg viewBox="0 0 512 512" version="1.1" xmlns="http://www.w3.org/2000/svg" style="background: #FFFFFF;">
+ <title>Zeit - Black on white logo</title>
+ <defs>
+ <linearGradient x1="114.720775%" y1="181.283245%" x2="39.5399306%" y2="100%" id="linearGradient-1">
+ <stop stop-color="#FFFFFF" offset="0%"></stop>
+ <stop stop-color="#000000" offset="100%"></stop>
+ </linearGradient>
+ </defs>
+ <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g id="Black-on-white" fill="url(#linearGradient-1)">
+ <polygon id="Triangle-3-Copy" points="254 156 367 356 141 356"></polygon>
+ </g>
+ </g>
+</svg>
diff --git a/devtools/client/debugger/images/sources/node.svg b/devtools/client/debugger/images/sources/node.svg
new file mode 100644
index 0000000000..3ecdca040f
--- /dev/null
+++ b/devtools/client/debugger/images/sources/node.svg
@@ -0,0 +1,6 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+ <path fill="#83CD29" d="M14.42 3.6L8.65.27c-.36-.2-.85-.2-1.2 0L1.62 3.6c-.37.22-.63.62-.63 1.06v6.69c0 .43.26.84.64 1.06l1.53.87c.75.35.94.35 1.28.35 1.09 0 1.65-.66 1.65-1.8v-6.6c0-.1.07-.24-.04-.24h-.73c-.09 0-.28.14-.28.23v6.6c0 .51-.47 1-1.33.59l-1.58-.92a.18.18 0 0 1-.1-.16V4.66c0-.07.07-.13.12-.16l5.8-3.33a.22.22 0 0 1 .19 0l5.74 3.33c.05.04.05.1.05.16v6.68c0 .07.01.13-.04.16l-5.77 3.33a.19.19 0 0 1-.16 0l-1.49-.88c-.03-.02-.1-.04-.14-.01-.4.23-.48.27-.87.4-.08.03-.23.08.06.25l1.93 1.14c.18.1.4.16.61.16.22 0 .42-.05.61-.16l5.76-3.34c.37-.22.56-.62.56-1.06V4.66c-.01-.44-.2-.83-.58-1.05zm-4.57 6.68c-1.54 0-1.87-.42-1.98-1.19-.02-.07-.08-.18-.17-.18h-.75c-.1 0-.17.12-.17.2 0 .98.54 2.17 3.07 2.17 1.83 0 2.89-.72 2.89-1.97s-.85-1.58-2.62-1.82c-1.8-.24-1.99-.35-1.99-.77 0-.35.16-.81 1.49-.81 1.19 0 1.62.26 1.8 1.06.01.08.09.13.17.13h.75c.05 0 .09-.01.13-.05.02-.04.05-.08.04-.13-.12-1.38-1.04-2.02-2.9-2.02-1.64 0-2.63.7-2.63 1.87 0 1.26.99 1.62 2.57 1.77 1.9.2 2.05.46 2.05.83-.01.64-.53.91-1.75.91z"/>
+</svg>
diff --git a/devtools/client/debugger/images/sources/nuxtjs.svg b/devtools/client/debugger/images/sources/nuxtjs.svg
new file mode 100644
index 0000000000..bf9172a87d
--- /dev/null
+++ b/devtools/client/debugger/images/sources/nuxtjs.svg
@@ -0,0 +1,4 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 1000"><style>.st0{display:none}.st1{display:inline}.st2{fill:#222}.st3{fill:#41b883}.st4{fill:#328170}.st5{fill:#35495e}</style><g id="express" class="st0"><g class="st1"><path class="st2" d="M24.5 870.5v-376H494v-22H24.5v-343h499.1v-22H2.5v785H528v-22H24.5z"/><path class="st2" d="M951.3 327.4L756.7 583.6 566.5 327.4h-28.6l205.6 272.7-225.4 292.4h26.4l212.2-276 213.3 276h27.5L771 600l206.7-272.6h-26.4z"/></g></g><g id="nuxt"><path class="st3" d="M317.9 852H3.7l408.1-704 408.1 704H507.7"/><path class="st4" d="M779.8 852h216.5l-354-608.5-351 608.5h216.5"/><path class="st5" d="M651.2 852h159.5L549.9 403.8 291.3 852h159.5"/></g></svg>
diff --git a/devtools/client/debugger/images/sources/preact.svg b/devtools/client/debugger/images/sources/preact.svg
new file mode 100644
index 0000000000..d860af54b6
--- /dev/null
+++ b/devtools/client/debugger/images/sources/preact.svg
@@ -0,0 +1,11 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="256px" height="296px" viewBox="0 0 256 296" version="1.1" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid">
+ <g>
+ <polygon fill="#673AB8" points="128 0 256 73.8999491 256 221.699847 128 295.599796 0 221.699847 0 73.8999491"></polygon>
+ <path d="M34.8647584,220.478469 C51.8814262,242.25881 105.959701,225.662965 157.014868,185.774297 C208.070035,145.885628 237.255632,97.428608 220.238964,75.6482664 C203.222296,53.8679249 149.144022,70.4637701 98.0888543,110.352439 C47.0336869,150.241107 17.8480906,198.698127 34.8647584,220.478469 Z M42.1343351,214.798853 C36.4908625,207.575537 38.9565723,193.395881 49.7081913,175.544904 C61.0297348,156.747677 80.2490923,135.997367 103.76847,117.622015 C127.287848,99.2466634 152.071368,85.6181573 173.049166,79.1803727 C192.970945,73.066665 207.325915,74.1045667 212.969387,81.3278822 C218.61286,88.5511977 216.14715,102.730854 205.395531,120.581832 C194.073987,139.379058 174.85463,160.129368 151.335252,178.50472 C127.815874,196.880072 103.032354,210.508578 82.054556,216.946362 C62.1327769,223.06007 47.7778077,222.022168 42.1343351,214.798853 Z" fill="#FFFFFF"></path>
+ <path d="M220.238964,220.478469 C237.255632,198.698127 208.070035,150.241107 157.014868,110.352439 C105.959701,70.4637701 51.8814262,53.8679249 34.8647584,75.6482664 C17.8480906,97.428608 47.0336869,145.885628 98.0888543,185.774297 C149.144022,225.662965 203.222296,242.25881 220.238964,220.478469 Z M212.969387,214.798853 C207.325915,222.022168 192.970945,223.06007 173.049166,216.946362 C152.071368,210.508578 127.287848,196.880072 103.76847,178.50472 C80.2490923,160.129368 61.0297348,139.379058 49.7081913,120.581832 C38.9565723,102.730854 36.4908625,88.5511977 42.1343351,81.3278822 C47.7778077,74.1045667 62.1327769,73.066665 82.054556,79.1803727 C103.032354,85.6181573 127.815874,99.2466634 151.335252,117.622015 C174.85463,135.997367 194.073987,156.747677 205.395531,175.544904 C216.14715,193.395881 218.61286,207.575537 212.969387,214.798853 Z" fill="#FFFFFF"></path>
+ <path d="M127.551861,167.666971 C138.378632,167.666971 147.155465,158.890139 147.155465,148.063368 C147.155465,137.236596 138.378632,128.459764 127.551861,128.459764 C116.72509,128.459764 107.948257,137.236596 107.948257,148.063368 C107.948257,158.890139 116.72509,167.666971 127.551861,167.666971 L127.551861,167.666971 Z" fill="#FFFFFF"></path>
+ </g>
+</svg>
diff --git a/devtools/client/debugger/images/sources/pug.svg b/devtools/client/debugger/images/sources/pug.svg
new file mode 100644
index 0000000000..0f8eb42b64
--- /dev/null
+++ b/devtools/client/debugger/images/sources/pug.svg
@@ -0,0 +1,118 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px"
+ viewBox="0 0 128 128" style="enable-background:new 0 0 128 128;" xml:space="preserve">
+<style type="text/css">
+ .st0{fill:#C1272D;}
+ .st1{fill:#EFCCA3;}
+ .st2{fill:#ED1C24;}
+ .st3{fill:#CCAC8D;}
+ .st4{fill:#FFFFFF;}
+ .st5{fill:#FF931E;}
+ .st6{fill:#FFB81E;}
+ .st7{fill:#56332B;}
+ .st8{fill:#442823;}
+ .st9{fill:#7F4A41;}
+ .st10{fill:#331712;}
+ .st11{fill:#FFCC66;}
+ .st12{fill:#CCCCCC;}
+ .st13{fill:#B3B3B3;}
+ .st14{fill:#989898;}
+ .st15{fill:#323232;}
+ .st16{fill:#1E1E1E;}
+ .st17{fill:#4C4C4C;}
+ .st18{fill:#E6E6E6;}
+ .st19{fill:#606060;}
+</style>
+<g>
+ <path class="st1" d="M107.4,50.9c-0.2-4.4,0.4-8.3-1.6-11.6c-4.8-8.2-16.8-13-40.8-13V27c0,0-0.5,0-0.5,0c0,0,0.5,0,0.5,0v-0.7
+ c-24,0-36.6,4.8-41.4,13.1c-1.9,3.4-1.7,7.2-2,11.6c-0.2,3.5-1.8,7.2-1.1,11.2c0.8,5.2,1.1,10.4,1.9,15.2c0.6,3.9,6,7.2,6.5,10.9
+ c1.4,10.2,12,14.9,36,14.9v0.8h-0.6h0.1H65v-0.8c24,0,34.2-4.7,35.5-14.9c0.5-3.8,5.5-7,6.1-10.9c0.8-4.8,1.1-10,1.9-15.2
+ C109.2,58.2,107.6,54.4,107.4,50.9z"/>
+ <path class="st3" d="M64.6,54.5c4.3,0.1,7.3,2.8,10.1,5.3c3.3,2.9,8.9,4.9,11.2,7.4c2.3,2.5,5.3,5,6.4,8.9
+ c1.1,3.9,1.4,8.9,1.4,10.2c0,1.3,0.7,1,2.7,0c4.7-2.3,9.9-8.5,9.9-8.5c-0.6,3.9-5.7,7.4-6.2,11.1C98.9,99.1,89,104,64.5,104h-0.1h0
+ H65"/>
+ <path class="st3" d="M80.4,46.7c0.9,3.1,4.1,13.6-2.1,10.1c0,0,2.6,1.5,4.2,7.2c1.7,5.7,5.8,6.4,5.8,6.4s6.7,1.3,11.7-3
+ c4.2-3.6,4.9-10,3.1-14.9c-1.8-4.8-5-6.3-9.7-7.3C88.7,44.1,79.3,43.2,80.4,46.7z"/>
+ <g>
+ <circle cx="92.3" cy="58.1" r="8.8"/>
+ <circle class="st4" cx="90" cy="54.2" r="2.3"/>
+ </g>
+ <path class="st1" d="M78.9,57.7c0,0,7.9,5.4,12.2,10.7c4.3,5.3,4.2,6.3,4.2,6.3l-3.1,1.4c0,0-4.4-8.3-9.8-11.4
+ c-5.5-3.1-6.1-5.7-6.1-5.7L78.9,57.7z"/>
+ <path class="st3" d="M64.9,54.5c-4.3,0.1-7.5,2.8-10.4,5.3c-3.3,2.9-9.1,4.9-11.4,7.4c-2.3,2.5-5.4,5-6.5,8.9
+ c-1.1,3.9-1.5,8.9-1.5,10.2c0,1.3,0.2,1.4-2.7,0c-4.7-2.2-9.9-8.5-9.9-8.5c0.6,3.9,5.7,7.4,6.2,11.1C30.1,99.1,40,104,64.5,104h0.1
+ h0H65"/>
+ <path class="st7" d="M88.1,71.4C83.3,65.5,75.6,60,64.9,60h-0.1h0c-10.7,0-18.4,5.5-23.2,11.4c-5,6.1-4.6,8.5-4.6,14.3
+ c0,21,7.4,15,12.3,17.6c5,2.5,10.2,1.7,15.5,1.7h0h0.1c5.4,0,10.5,0.7,15.5-1.8c4.9-2.5,12.3,3.7,12.3-17.3
+ C92.8,80.1,93.1,77.5,88.1,71.4z"/>
+ <path class="st8" d="M64.4,65.2c0,0-0.7,9.7-2.1,11.6l2.6-0.6L64.4,65.2z"/>
+ <path class="st8" d="M65.1,65.2c0,0,0.7,9.7,2.1,11.6l-2.6-0.6L65.1,65.2z"/>
+ <path class="st7" d="M56.7,62.9c-1-2.3,2.6-6,8.3-6.1c5.7,0,9.3,3.7,8.3,6.1c-1,2.4-4.6,3.1-8.3,3.2C61.4,66,57.7,65.3,56.7,62.9z"
+ />
+ <path d="M65,65.2c0-0.4,3.4-0.5,5.2-1.7c0,0-3.7,1.2-4.5,0.7c-0.8-0.4-1-1.6-1-1.6s-0.3,1.2-0.9,1.6c-0.7,0.4-4.9-0.7-4.9-0.7
+ s5.6,1.4,5.6,1.7c0,0.3-0.1,1.3-0.1,2c0,2.5,0,8.7,0.4,9.2c0.6,0.9,0.4-6.7,0.4-9.2C65.1,66.4,65.1,65.6,65,65.2z"/>
+ <path class="st9" d="M65.2,78.6c1.7,0,4.7,1.2,7.4,3.1c-2.6-2.9-5.7-4.9-7.4-4.9c-1.8,0-5.6,2.2-8.3,5.4
+ C59.7,80,63.3,78.6,65.2,78.6z"/>
+ <path class="st8" d="M64.5,96.3c-3.8,0-7.5-1.2-10.9-2.1c-0.7-0.2-1.4,0.3-2.1,0.1c-6.3-2-11.4-5.4-14.5-9.7c0,0.3,0,0.7,0,1
+ c0,21,7.4,15.1,12.3,17.6c5,2.5,10.2,1.7,15.5,1.7h0h0.1c5.4,0,10.5,0.7,15.5-1.8c4.9-2.5,12.3,3.6,12.3-17.4c0-0.8,0-1.6,0.1-2.3
+ c-2.9,4.7-8.2,8.4-14.8,10.6c-0.6,0.2-2-0.3-2.6-0.2C71.8,95,68.6,96.3,64.5,96.3z"/>
+ <path class="st8" d="M55,85c0,0-2.5,7.5-0.8,10.8l-2.3-1C51.9,94.8,53.6,87.2,55,85z"/>
+ <path class="st8" d="M74.8,85c0,0,2.5,7.5,0.8,10.8l2.3-1C77.9,94.8,76.1,87.2,74.8,85z"/>
+ <path class="st3" d="M48.6,46.7c-0.9,3.1-4.1,13.6,2.1,10.1c0,0-2.6,1.5-4.2,7.2s-5.8,6.4-5.8,6.4s-6.7,1.3-11.7-3
+ c-4.2-3.6-4.9-10-3.1-14.9s5-6.3,9.7-7.3C40.3,44.1,49.6,43.2,48.6,46.7z"/>
+ <path d="M64.9,76.8c2.7,0,11.1,5.8,11.2,12.9c0-0.1,0-0.2,0-0.4c0-7.4-6.8-13.3-11.2-13.3c-4.4,0-11.2,6-11.2,13.3
+ c0,0.1,0,0.2,0,0.4C53.8,82.6,62.2,76.8,64.9,76.8z"/>
+ <g>
+
+ <ellipse transform="matrix(0.9683 -0.2497 0.2497 0.9683 -13.2339 18.6065)" class="st10" cx="66.7" cy="61.5" rx="0.8" ry="1.5"/>
+
+ <ellipse transform="matrix(0.9551 0.2963 -0.2963 0.9551 21.0115 -15.7209)" class="st10" cx="62.4" cy="61.5" rx="0.8" ry="1.5"/>
+ </g>
+ <g>
+ <circle cx="37.2" cy="58.1" r="8.8"/>
+ <circle class="st4" cx="39.5" cy="54.2" r="2.3"/>
+ </g>
+ <g>
+ <path class="st9" d="M67.5,58.2c0-0.1-2.3,1-2.9,1.1c-0.6-0.1-2.9-1.2-2.9-1.1c0,0,1.9,0,2.9,0C65.6,58.2,67.5,58.2,67.5,58.2z"/>
+ </g>
+ <path class="st1" d="M50,57.7c0,0-7.9,5.4-12.2,10.7c-4.3,5.3-4.2,6.3-4.2,6.3l3.1,1.4c0,0,4.4-8.3,9.8-11.4s6.1-5.7,6.1-5.7
+ L50,57.7z"/>
+ <path class="st3" d="M32.7,41.7c0,0-2.7,7.4-8.7,10.5C24,52.2,33.4,51.1,32.7,41.7z"/>
+ <path class="st3" d="M95.8,41.7c0,0,2.7,7.4,8.7,10.5C104.5,52.2,95.1,51.1,95.8,41.7z"/>
+ <path class="st3" d="M78.7,55.5c0,0-5.9-6.2-13.8-6.4l0,0c-0.1,0,0.2,0,0.1,0c-0.1,0,0.1,0,0.1,0v0c-8,0.2-13.8,6.4-13.8,6.4
+ c6.9-4.8,12.8-4.7,13.8-4.7v0c0,0,0,0,0,0c0,0,0,0,0,0v0C65,50.8,71.8,50.7,78.7,55.5z"/>
+ <path class="st3" d="M71.8,42.5c0,0-3-4.2-7-4.3l0,0c0,0,0.1,0,0.1,0c0,0,0.1,0,0.1,0v0c-3,0.1-6.9,4.3-6.9,4.3
+ c3.4-3.3,6.9-3.2,6.9-3.2v0c0,0,0,0,0,0c0,0,0,0,0,0v0C65,39.3,68.3,39.2,71.8,42.5z"/>
+ <path class="st3" d="M37.2,73.2c0,0-4.7,2.3-8.1,0.9l0,0c0,0-0.1,0-0.1,0c0,0,0,0,0,0v0c-3-1.7-4.5-6.8-4.5-6.8
+ S27.5,76.3,37.2,73.2z"/>
+ <path class="st3" d="M92,73.2c0,0,4.7,2.3,8.1,0.9l0,0c0,0,0,0,0,0c0,0,0,0,0,0v0c4-1.7,4.6-6.8,4.6-6.8S101.7,76.3,92,73.2z"/>
+ <g>
+ <path class="st3" d="M42.6,41.2c2.6-0.5,6.9-0.6,10.3,0.5c4.3,1.5,0.8,7,1.7,7.3c0.9,0.3,2.1-3.8,10.1-3.4c8.1,0.4,9,4,10.1,3.4
+ s-1.1-10,11-7.8c0,0-12.7-3.4-12.1,5.8c0,0-7.3-5.6-17.5-0.6C56.3,46.4,58.9,37.8,42.6,41.2z"/>
+ </g>
+ <path class="st3" d="M86.9,41.2c0.2,0,0.3,0.1,0.4,0.1C87.4,41.3,87.2,41.2,86.9,41.2z"/>
+ <path class="st3" d="M86.9,41.2C86.9,41.2,86.9,41.2,86.9,41.2C86.9,41.2,86.9,41.2,86.9,41.2z"/>
+ <path class="st3" d="M39.1,28.9c0,0-10.8,13.6-12.4,18.8c-1.6,5.3-2.8,27-4.2,30.1l-5-21.4l9.2-22.3L39.1,28.9z"/>
+ <path class="st3" d="M89.9,28.9c0,0,10.8,13.6,12.4,18.8c1.6,5.3,2.8,27,4.2,30.1l5-21.4l-9.2-22.3L89.9,28.9z"/>
+ <path class="st7" d="M89.4,28.9c0,0,11.6,9.7,15,20.9c3.4,11.2,2,24.8,4.6,26.5c3.7,2.4,7.9-11.9,9.3-13.4c2.2-2.4,9.5-8.5,10-9.6
+ c0.5-1.1-14.8-17.8-21.5-21.1C98.7,28.4,88.7,28.1,89.4,28.9z"/>
+ <path class="st8" d="M99.3,34.9c0,0,13.7,17.5,13.5,39.3l5.5-11.2C118.2,63,113.4,48.7,99.3,34.9z"/>
+ <path class="st7" d="M39.1,28.9c0,0-11.6,9.7-15,20.9s-2,24.8-4.6,26.5c-3.7,2.4-7.9-11.9-9.3-13.4c-2.2-2.4-9.5-8.5-10-9.6
+ c-0.5-1.1,14.8-17.8,21.5-21.1C29.8,28.4,39.8,28.1,39.1,28.9z"/>
+ <path class="st8" d="M29.2,34.9c0,0-13.7,17.5-13.5,39.3L10.3,63C10.3,63,15.1,48.7,29.2,34.9z"/>
+ <path class="st3" d="M21.8,74.6c0,0,1,5.4,2.6,7.1s0.5-1.3,0.5-1.3s-1.7-0.9-1.4-7.8S21.8,74.6,21.8,74.6z"/>
+ <path class="st3" d="M107.1,74.6c0,0-1,5.4-2.6,7.1s-0.5-1.3-0.5-1.3s1.7-0.9,1.4-7.8S107.1,74.6,107.1,74.6z"/>
+ <g>
+ <circle class="st8" cx="54.5" cy="70.5" r="0.8"/>
+ <circle class="st8" cx="49.9" cy="75.3" r="0.8"/>
+ <circle class="st8" cx="48.4" cy="70.5" r="0.8"/>
+ </g>
+ <g>
+ <circle class="st8" cx="74" cy="70.5" r="0.8"/>
+ <circle class="st8" cx="78.6" cy="75.3" r="0.8"/>
+ <circle class="st8" cx="80.1" cy="70.5" r="0.8"/>
+ </g>
+</g>
+</svg>
diff --git a/devtools/client/debugger/images/sources/react.svg b/devtools/client/debugger/images/sources/react.svg
new file mode 100644
index 0000000000..5dc19e92e1
--- /dev/null
+++ b/devtools/client/debugger/images/sources/react.svg
@@ -0,0 +1,6 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16" fill="context-fill">
+ <path d="M8 9.2a1.2 1.2 0 1 0 0-2.4 1.2 1.2 0 0 0 0 2.4zM.68 8C.68 8.93 2 9.49 2.7 9.76c1.34.5 3.2.83 5.29.83 2.08 0 3.95-.32 5.3-.83.7-.27 2.02-.83 2.02-1.76S14 6.51 13.3 6.24A15.4 15.4 0 0 0 8 5.41c-2.08 0-3.95.32-5.3.83C2 6.51.69 7.07.69 8zm1.8-2.37C3.9 5.08 5.85 4.75 8 4.75c2.14 0 4.1.33 5.53.88 1 .38 2.45 1.1 2.45 2.37 0 1.26-1.45 2-2.45 2.37-1.43.55-3.39.88-5.53.88s-4.1-.33-5.53-.88C1.47 10 .02 9.27.02 8c0-1.26 1.45-2 2.45-2.37zM4.34 1.66c-.81.47-.63 1.9-.5 2.63.22 1.42.87 3.2 1.92 5a15.4 15.4 0 0 0 3.36 4.17c.59.48 1.73 1.35 2.54.88.81-.47.63-1.89.5-2.63a15.4 15.4 0 0 0-1.92-5 15.4 15.4 0 0 0-3.36-4.17c-.59-.48-1.73-1.35-2.54-.88zm2.95.36c1.2.97 2.45 2.5 3.53 4.35a16.05 16.05 0 0 1 2 5.23c.17 1.06.26 2.68-.83 3.31-1.1.63-2.45-.26-3.28-.93a16.05 16.05 0 0 1-3.53-4.35 16.05 16.05 0 0 1-2-5.23c-.17-1.06-.26-2.68.83-3.31 1.1-.63 2.45.26 3.28.93zM11.66 1.66c-.8-.47-1.95.4-2.54.88A15.4 15.4 0 0 0 5.76 6.7a15.4 15.4 0 0 0-1.93 5c-.12.75-.3 2.17.5 2.64.82.47 1.96-.4 2.55-.88a15.4 15.4 0 0 0 3.36-4.16 15.4 15.4 0 0 0 1.93-5c.12-.75.3-2.17-.5-2.64zm1.16 2.74a16.05 16.05 0 0 1-2 5.23 16.05 16.05 0 0 1-3.53 4.35c-.83.67-2.19 1.56-3.28.93-1.1-.63-1-2.25-.83-3.3.24-1.52.93-3.38 2-5.24a16.05 16.05 0 0 1 3.53-4.35c.83-.67 2.19-1.56 3.28-.93 1.1.63 1 2.25.83 3.3z"/>
+</svg>
diff --git a/devtools/client/debugger/images/sources/redux.svg b/devtools/client/debugger/images/sources/redux.svg
new file mode 100644
index 0000000000..0ae6f5f888
--- /dev/null
+++ b/devtools/client/debugger/images/sources/redux.svg
@@ -0,0 +1,6 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+ <path d="M10.7 10.28a1 1 0 0 0-.1-2h-.04a1 1 0 0 0-.68 1.7 6.37 6.37 0 0 1-2.92 2.8c-.94.5-1.92.67-2.9.55-.8-.1-1.43-.46-1.82-1.05a2.62 2.62 0 0 1-.14-2.76 4.2 4.2 0 0 1 1.2-1.43 9.61 9.61 0 0 1-.22-.9C.49 9.04.76 11.58 1.54 12.77c.6.89 1.78 1.44 3.1 1.44.36 0 .72-.04 1.07-.13 2.28-.44 4.01-1.8 4.99-3.8zM13.84 8.07A7.23 7.23 0 0 0 8.2 5.61h-.29a.98.98 0 0 0-.87-.53H7a1 1 0 0 0 .04 2h.03a1 1 0 0 0 .88-.61h.32c1.35 0 2.63.4 3.8 1.16.88.59 1.52 1.35 1.88 2.28.3.75.29 1.48-.03 2.1a2.62 2.62 0 0 1-2.45 1.46c-.7 0-1.39-.21-1.74-.37-.2.17-.55.46-.8.64a5.5 5.5 0 0 0 2.3.55c1.7 0 2.97-.94 3.45-1.89.52-1.03.48-2.81-.85-4.33zM4.79 10.58a1 1 0 0 0 1 .97h.03a1 1 0 0 0-.04-2h-.03c-.04 0-.1 0-.13.02A6.53 6.53 0 0 1 4.7 5.6c.07-1.06.42-2 1.05-2.76a3.09 3.09 0 0 1 2.19-1c1.89-.03 2.69 2.32 2.74 3.27.23.05.63.17.9.26C11.35 2.5 9.57 1 7.86 1 6.27 1 4.79 2.16 4.2 3.87a7.29 7.29 0 0 0 .71 6.2.8.8 0 0 0-.12.51z"/>
+</svg>
diff --git a/devtools/client/debugger/images/sources/rxjs.svg b/devtools/client/debugger/images/sources/rxjs.svg
new file mode 100644
index 0000000000..944abc43eb
--- /dev/null
+++ b/devtools/client/debugger/images/sources/rxjs.svg
@@ -0,0 +1,33 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+ <path d="M1.73 9.9C1 6.05 2.93 2.3 7.33 1.82a2.01 2.01 0 0 0-1.82-.58c-.67.22-.65.66-1.42 1.22-.76.44-1.14.1-1.7.56-.55.44-.16 1.47-.4 1.67-.23.4-.94.76-1.07 1.26-.11.65.29 1.1.27 1.66.05.46-.46.72-.38 1.1.21.6.63.98.83 1.14.05.04.1.12.09.07z" fill="#FF0090"/>
+ <path d="M9.58 4.55a.3.3 0 1 1 0-.58.3.3 0 0 1 0 .58zM1.9 10.33c-.7-3.36 1.46-6.17 5.65-4.79 2.46 1.44 5.56 1.35 5.7.42.34-1.12-1.57-3.42-4.43-4.02C3.15.84.09 6.97 1.9 10.34z" fill="url(#paint0_radial)"/>
+ <path d="M11.2 10.7a3.1 3.1 0 0 0 2.38-.7 6.2 6.2 0 0 1-4.12 2.04c.77.65 1.5.94 2.21.82-1.96.54-3.61-.06-5.61-2.05-.1.54.46 1.37 1.04 1.9-3.39-1.46-3.69-6.04.45-7.17C3.26 3.48.84 7.48 2.03 10.76a7.53 7.53 0 0 0 7.67 4.05 6.4 6.4 0 0 0 5.14-4.05A5.69 5.69 0 0 1 12.29 12c1.92-.96 2.95-2.6 2.66-4.82-.4.95-.92 1.67-1.58 2.17 1.4-2.17 1.16-3.3.13-4.53.73 2.03-.22 4.29-2.3 5.89z" fill="url(#paint1_radial)"/>
+ <path d="M10.22 13.04c-.15-.02.33.2-.6-.05-.91-.24-1.85-.47-3.56-2.18-.1.54.46 1.37 1.04 1.9 1.58 1.1.5.6 2.91 1.42.2-.38.2-.72.2-1.09z" fill="url(#paint2_linear)"/>
+ <path d="M7.16 4.4l.29-.45c.1-.17.25-.48.25-.48s-1.6-.52-2-.59c-1.23.32-1.23.84-.55 1.62.08.1 2-.1 2-.1z" fill="url(#paint3_linear)"/>
+ <defs>
+ <radialGradient id="paint0_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(10.7025 0 0 7.65602 10.76 5.04)">
+ <stop stop-color="#F80090"/>
+ <stop offset="1" stop-color="#4D008E"/>
+ </radialGradient>
+ <radialGradient id="paint1_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(10.8482 0 0 8.20619 10.85 5.27)">
+ <stop stop-color="#57008E"/>
+ <stop offset=".29" stop-color="#5C008E"/>
+ <stop offset="1" stop-color="#F80090"/>
+ </radialGradient>
+ <linearGradient id="paint2_linear" x1="6.8" y1="10.81" x2="8.72" y2="14.03" gradientUnits="userSpaceOnUse">
+ <stop stop-color="#F70090"/>
+ <stop offset=".67" stop-color="#E50090"/>
+ <stop offset=".83" stop-color="#D6008F" stop-opacity=".2"/>
+ <stop offset="1" stop-color="#C10090" stop-opacity="0"/>
+ </linearGradient>
+ <linearGradient id="paint3_linear" x1="6.65" y1="4.06" x2="6.37" y2="3.53" gradientUnits="userSpaceOnUse">
+ <stop stop-color="#B2008F" stop-opacity=".15"/>
+ <stop offset=".4" stop-color="#F70090" stop-opacity=".4"/>
+ <stop offset=".65" stop-color="#F60090" stop-opacity=".89"/>
+ <stop offset="1" stop-color="#FF0090"/>
+ </linearGradient>
+ </defs>
+</svg>
diff --git a/devtools/client/debugger/images/sources/sencha-extjs.svg b/devtools/client/debugger/images/sources/sencha-extjs.svg
new file mode 100644
index 0000000000..2742ec9744
--- /dev/null
+++ b/devtools/client/debugger/images/sources/sencha-extjs.svg
@@ -0,0 +1,13 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+ <defs>
+ <linearGradient id="paint0_linear" x1="10.92" y1="12.45" x2="5.34" y2="4.65" gradientUnits="userSpaceOnUse">
+ <stop stop-color="#006E00"/>
+ <stop offset=".55" stop-color="#0C0"/>
+ <stop offset="1" stop-color="#EEFF2A"/>
+ </linearGradient>
+ </defs>
+ <path d="M6.55.9c-4.2.53-4.49 5.76-1.85 7.92 2.63 2.16 6.07 4.05 4.67 6.27 4.07-.44 4.42-4.58 2.52-6.67-1.9-2.08-7.6-4.54-5.34-7.51z" fill="url(#paint0_linear)" stroke="navy" stroke-width=".3" stroke-linecap="round"/>
+</svg>
diff --git a/devtools/client/debugger/images/sources/typescript.svg b/devtools/client/debugger/images/sources/typescript.svg
new file mode 100644
index 0000000000..31548fa2dc
--- /dev/null
+++ b/devtools/client/debugger/images/sources/typescript.svg
@@ -0,0 +1,6 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16" fill="context-fill">
+ <path fill-rule="evenodd" d="M15 1H1v14h14V1zm-2.14 5.6a1.89 1.89 0 0 0-.95-.54 3.84 3.84 0 0 0-1.15-.03c-.83.16-1.4.68-1.56 1.44-.04.32-.03.65.03.97a2 2 0 0 0 .41.76c.31.33.65.54 1.43.88.68.3.92.44 1.05.6.17.26.13.63-.09.85-.33.3-.99.33-1.47.07a2.31 2.31 0 0 1-.67-.68l-.4.21c-.25.13-.51.27-.74.44-.02.03.26.43.4.58.41.43.95.71 1.54.8.38.06.77.06 1.16.02.84-.14 1.43-.57 1.68-1.2a2.2 2.2 0 0 0-.18-1.85c-.29-.44-.75-.75-1.84-1.22-.6-.25-.78-.38-.88-.59a.56.56 0 0 1-.07-.28c0-.4.3-.64.76-.6a.86.86 0 0 1 .71.42c.07.1.12.16.14.15.4-.25 1.05-.69 1.05-.71a2.5 2.5 0 0 0-.36-.49zm-6.48.72h1.97l-.01-1.25H5.69l-2.67.01A10.66 10.66 0 0 0 3 7.31h1.98v5.62h1.4V7.32z"/>
+</svg>
diff --git a/devtools/client/debugger/images/sources/underscore.svg b/devtools/client/debugger/images/sources/underscore.svg
new file mode 100644
index 0000000000..a7b9d06e06
--- /dev/null
+++ b/devtools/client/debugger/images/sources/underscore.svg
@@ -0,0 +1,8 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
+ <rect fill="#002f42" width="16" x="0" y="28" height="4" />
+ <rect fill="#0072b1" width="16" x="16" y="28" height="4" />
+</svg>
diff --git a/devtools/client/debugger/images/sources/vuejs.svg b/devtools/client/debugger/images/sources/vuejs.svg
new file mode 100644
index 0000000000..717ce87bb9
--- /dev/null
+++ b/devtools/client/debugger/images/sources/vuejs.svg
@@ -0,0 +1,7 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+ <path d="M9.73 2L8 5 6.27 2H.5L8 14.99 15.5 2H9.73z" fill="#41B883"/>
+ <path d="M9.73 2L8 5 6.27 2H3.5L8 9.8 12.5 2H9.73z" fill="#34495E"/>
+</svg>
diff --git a/devtools/client/debugger/images/sources/webpack.svg b/devtools/client/debugger/images/sources/webpack.svg
new file mode 100644
index 0000000000..2461a6f118
--- /dev/null
+++ b/devtools/client/debugger/images/sources/webpack.svg
@@ -0,0 +1,8 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+ <path d="M8 .08l7 3.96v7.92l-7 3.96-7-3.96V4.04L8 .08z" fill="#fff"/>
+ <path d="M13.75 11.69L8.23 14.8v-2.43l3.44-1.9 2.08 1.2zm.38-.35V4.82L12.1 5.98v4.2l2.02 1.16zm-11.9.35l5.52 3.12v-2.43l-3.44-1.9-2.08 1.2zm-.38-.35V4.82l2.02 1.16v4.2l-2.02 1.16zm.24-6.95l5.66-3.2v2.35l-3.63 2-.03.01-2-1.16zm11.8 0L8.23 1.2v2.35l3.63 2 .02.01L13.9 4.4z" fill="#8ED6FB"/>
+ <path d="M7.75 11.82l-3.4-1.86v-3.7l3.4 1.96v3.6zm.48 0l3.4-1.86v-3.7l-3.4 1.96v3.6zM4.58 5.84l3.4-1.88 3.42 1.88L7.99 7.8l-3.4-1.96z" fill="#1C78C0"/>
+</svg>
diff --git a/devtools/client/debugger/images/stepIn.svg b/devtools/client/debugger/images/stepIn.svg
new file mode 100644
index 0000000000..eff11c0c91
--- /dev/null
+++ b/devtools/client/debugger/images/stepIn.svg
@@ -0,0 +1,8 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
+ <g fill-rule="evenodd">
+ <path d="M1.5 14.042h4.095a.5.5 0 0 0 0-1H1.5a.5.5 0 1 0 0 1zM7.983 2a.5.5 0 0 1 .517.5v7.483l3.136-3.326a.5.5 0 1 1 .728.686l-4 4.243a.499.499 0 0 1-.73-.004L3.635 7.343a.5.5 0 0 1 .728-.686L7.5 9.983V3H1.536C1.24 3 1 2.776 1 2.5s.24-.5.536-.5h6.447zM10.5 14.042h4.095a.5.5 0 0 0 0-1H10.5a.5.5 0 1 0 0 1z"/>
+ </g>
+</svg>
diff --git a/devtools/client/debugger/images/stepOut.svg b/devtools/client/debugger/images/stepOut.svg
new file mode 100644
index 0000000000..4e54571412
--- /dev/null
+++ b/devtools/client/debugger/images/stepOut.svg
@@ -0,0 +1,8 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
+ <g fill-rule="evenodd">
+ <path d="M5 13.5H1a.5.5 0 1 0 0 1h4a.5.5 0 1 0 0-1zM12 13.5H8a.5.5 0 1 0 0 1h4a.5.5 0 1 0 0-1zM6.11 5.012A.427.427 0 0 1 6.21 5h7.083L9.646 1.354a.5.5 0 1 1 .708-.708l4.5 4.5a.498.498 0 0 1 0 .708l-4.5 4.5a.5.5 0 0 1-.708-.708L13.293 6H6.5v5.5a.5.5 0 1 1-1 0v-6a.5.5 0 0 1 .61-.488z"/>
+ </g>
+</svg>
diff --git a/devtools/client/debugger/images/tab.svg b/devtools/client/debugger/images/tab.svg
new file mode 100644
index 0000000000..8362ca71d1
--- /dev/null
+++ b/devtools/client/debugger/images/tab.svg
@@ -0,0 +1,6 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16">
+ <path d="M15 11h-1V5c0-1.09-.91-2-2-2H4c-1.09 0-2 .91-2 2v6H1c-.54 0-1 .46-1 1s.46 1 1 1h14c.54 0 1-.46 1-1s-.46-1-1-1z"/>
+</svg>
diff --git a/devtools/client/debugger/images/trace.svg b/devtools/client/debugger/images/trace.svg
new file mode 100644
index 0000000000..172f7b6c30
--- /dev/null
+++ b/devtools/client/debugger/images/trace.svg
@@ -0,0 +1,6 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
+<path fill="context-fill" fill-rule="evenodd" clip-rule="evenodd" d="M7.99873 15C11.8647 15 14.9987 11.866 14.9987 8C14.9987 4.13401 11.8647 1 7.99873 1C4.13273 1 0.998726 4.13401 0.998726 8C0.998726 11.866 4.13273 15 7.99873 15ZM7.99872 1.75C8.41294 1.75 8.74872 2.08579 8.74872 2.5V8.5C8.74872 8.72784 8.64516 8.94332 8.46725 9.08565L5.96725 11.0857C5.6438 11.3444 5.17183 11.292 4.91307 10.9685C4.65432 10.6451 4.70676 10.1731 5.0302 9.91435L7.24872 8.13953V2.5C7.24872 2.08579 7.58451 1.75 7.99872 1.75ZM5.49873 2.75C5.91294 2.75 6.24873 3.08579 6.24873 3.5V7C6.24873 7.22784 6.14516 7.44332 5.96725 7.58565L3.46725 9.58565C3.1438 9.84441 2.67183 9.79197 2.41307 9.46852C2.15432 9.14507 2.20676 8.67311 2.5302 8.41435L4.74873 6.63953V3.5C4.74873 3.08579 5.08451 2.75 5.49873 2.75ZM11.25 9C11.25 8.58579 10.9142 8.25 10.5 8.25C10.0858 8.25 9.75 8.58579 9.75 9V12C9.75 12.4142 10.0858 12.75 10.5 12.75C10.9142 12.75 11.25 12.4142 11.25 12V9ZM8.74872 11.5C8.74873 11.0858 8.41294 10.75 7.99873 10.75C7.58451 10.75 7.24873 11.0858 7.24872 11.5V13C7.24872 13.4142 7.58451 13.75 7.99872 13.75C8.41294 13.75 8.74872 13.4142 8.74872 13V11.5ZM11.2487 3.5C11.2487 3.08579 10.9129 2.75 10.4987 2.75C10.0845 2.75 9.74873 3.08579 9.74873 3.5V6C9.74873 6.22784 9.8523 6.44332 10.0302 6.58565L12.2487 8.36047V10C12.2487 10.4142 12.5845 10.75 12.9987 10.75C13.4129 10.75 13.7487 10.4142 13.7487 10V8C13.7487 7.77216 13.6452 7.55668 13.4672 7.41435L11.2487 5.63953V3.5Z"/>
+</svg>
diff --git a/devtools/client/debugger/images/webconsole-logpoint.svg b/devtools/client/debugger/images/webconsole-logpoint.svg
new file mode 100644
index 0000000000..8ea068cc99
--- /dev/null
+++ b/devtools/client/debugger/images/webconsole-logpoint.svg
@@ -0,0 +1,6 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 12 12" width="12" height="12">
+ <path fill="context-fill" fill-opacity=".2" stroke="context-stroke" stroke-linejoin="round" d="M.5 9V3c0-.83.67-1.5 1.5-1.5h5.05a.5.5 0 0 1 .38.17L11.33 6l-3.9 4.33a.5.5 0 0 1-.38.17H2A1.5 1.5 0 0 1 .5 9z"/>
+</svg>
diff --git a/devtools/client/debugger/images/whole-word-match.svg b/devtools/client/debugger/images/whole-word-match.svg
new file mode 100644
index 0000000000..ca636f13fc
--- /dev/null
+++ b/devtools/client/debugger/images/whole-word-match.svg
@@ -0,0 +1,13 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" stroke="none" fillrule="evenodd" fill="context-fill">
+ <rect opacity="0.6" x="1" y="3" width="2" height="6"></rect>
+ <rect opacity="0.6" x="17" y="3" width="2" height="6"></rect>
+ <rect x="6" y="3" width="2" height="6"></rect>
+ <rect x="12" y="3" width="2" height="6"></rect>
+ <rect x="9" y="3" width="2" height="6"></rect>
+ <path d="M4.5,13 L15.5,13 L16,13 L16,12 L15.5,12 L4.5,12 L4,12 L4,13 L4.5,13 L4.5,13 Z"></path>
+ <path d="M4,10.5 L4,12.5 L4,13 L5,13 L5,12.5 L5,10.5 L5,10 L4,10 L4,10.5 L4,10.5 Z"></path>
+ <path d="M15,10.5 L15,12.5 L15,13 L16,13 L16,12.5 L16,10.5 L16,10 L15,10 L15,10.5 L15,10.5 Z"></path>
+</svg>
diff --git a/devtools/client/debugger/images/window.svg b/devtools/client/debugger/images/window.svg
new file mode 100644
index 0000000000..d24efd1ca8
--- /dev/null
+++ b/devtools/client/debugger/images/window.svg
@@ -0,0 +1,6 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="context-fill">
+ <path d="M1 3a1 1 0 011-1h12a1 1 0 011 1v10a1 1 0 01-1 1H2a1 1 0 01-1-1V3zm13 0H2v2h12V3zm0 3H2v7h12V6z"/>
+</svg>
diff --git a/devtools/client/debugger/images/worker.svg b/devtools/client/debugger/images/worker.svg
new file mode 100644
index 0000000000..652fbc9c10
--- /dev/null
+++ b/devtools/client/debugger/images/worker.svg
@@ -0,0 +1,7 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" width="16" height="16" fill="context-fill">
+ <path d="M1.293 6.078a1 1 0 000 1.415L2 8.2a1 1 0 001.414 0l1.414-1.414 6.364 6.364a.5.5 0 10.707-.708L5.536 6.078 6.95 4.664a1 1 0 000-1.414l-.707-.707a1 1 0 00-1.415 0L1.293 6.078z"/>
+ <path d="M13.208 3.497a.6.6 0 00-.849 0l-.106.107-1.06-1.061a1 1 0 00-1.415 0l-.707.707a1 1 0 000 1.414l1.414 1.414-6.364 6.364a.5.5 0 10.707.707l6.364-6.363L12.607 8.2c.282.283 2.192.636 2.475.353.282-.283-.071-2.192-.354-2.475l-1.06-1.06.105-.106a.6.6 0 000-.849l-.565-.566z"/>
+</svg>
diff --git a/devtools/client/debugger/index.html b/devtools/client/debugger/index.html
new file mode 100644
index 0000000000..0a7ef58d8e
--- /dev/null
+++ b/devtools/client/debugger/index.html
@@ -0,0 +1,73 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!DOCTYPE html>
+<html dir="">
+ <head>
+ <link
+ rel="stylesheet"
+ type="text/css"
+ href="chrome://devtools/content/shared/sourceeditor/codemirror/lib/codemirror.css"
+ />
+ <link
+ rel="stylesheet"
+ type="text/css"
+ href="chrome://devtools/content/shared/sourceeditor/codemirror/addon/dialog/dialog.css"
+ />
+ <link
+ rel="stylesheet"
+ type="text/css"
+ href="chrome://devtools/content/shared/sourceeditor/codemirror/mozilla.css"
+ />
+ <!-- Needed for the ObjectInspector -->
+ <link
+ rel="stylesheet"
+ type="text/css"
+ href="chrome://devtools/content/shared/components/reps/reps.css"
+ />
+ <!-- Needed for the ObjectInspector and the Source Tree -->
+ <link
+ rel="stylesheet"
+ type="text/css"
+ href="chrome://devtools/content/shared/components/Tree.css"
+ />
+ <link
+ rel="stylesheet"
+ type="text/css"
+ href="chrome://devtools/content/shared/components/object-inspector/components/ObjectInspector.css"
+ />
+ <link
+ rel="stylesheet"
+ type="text/css"
+ href="chrome://devtools/content/debugger/src/debugger.css"
+ />
+ <link
+ rel="stylesheet"
+ type="text/css"
+ href="chrome://devtools/content/shared/components/tabs/Tabs.css"
+ />
+ </head>
+
+ <body>
+ <div id="mount" class="theme-body"></div>
+ <script
+ src="chrome://devtools/content/shared/theme-switching.js"
+ ></script>
+ <script>
+ try {
+ const { BrowserLoader } = ChromeUtils.import(
+ "resource://devtools/shared/loader/browser-loader.js"
+ );
+ const { require } = BrowserLoader({
+ baseURI: "resource://devtools/client/debugger",
+ window
+ });
+ Debugger = require("devtools/client/debugger/src/main");
+ } catch (e) {
+ dump("Exception happened while loading the debugger:\n");
+ dump(e + "\n");
+ dump(e.stack + "\n");
+ }
+ </script>
+ </body>
+</html>
diff --git a/devtools/client/debugger/jest-test.config.js b/devtools/client/debugger/jest-test.config.js
new file mode 100644
index 0000000000..ed1b49f424
--- /dev/null
+++ b/devtools/client/debugger/jest-test.config.js
@@ -0,0 +1,26 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+const sharedJestConfig = require(`${__dirname}/../shared/test-helpers/shared-jest.config`);
+
+module.exports = {
+ testEnvironment: "jsdom",
+ testPathIgnorePatterns: [
+ "/node_modules/",
+ "/helpers/",
+ "/fixtures/",
+ "src/test/mochitest/examples/",
+ "package.json",
+ ],
+ modulePathIgnorePatterns: ["test/mochitest"],
+ setupFilesAfterEnv: ["<rootDir>/src/test/tests-setup.js"],
+ setupFiles: ["<rootDir>/src/test/shim.js", "jest-localstorage-mock"],
+ snapshotSerializers: ["enzyme-to-json/serializer"],
+ moduleNameMapper: {
+ ...sharedJestConfig.moduleNameMapper,
+ "react-dom-factories": "<rootDir>/../shared/vendor/react-dom-factories.js",
+ },
+};
diff --git a/devtools/client/debugger/jest.config.js b/devtools/client/debugger/jest.config.js
new file mode 100644
index 0000000000..ac3be16189
--- /dev/null
+++ b/devtools/client/debugger/jest.config.js
@@ -0,0 +1,13 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+const { resolve } = require("path");
+const rootDir = resolve(__dirname);
+module.exports = {
+ rootDir,
+ reporters: ["default"],
+ projects: ["<rootDir>/jest-test.config.js"],
+};
diff --git a/devtools/client/debugger/moz.build b/devtools/client/debugger/moz.build
new file mode 100644
index 0000000000..1804a1d6bc
--- /dev/null
+++ b/devtools/client/debugger/moz.build
@@ -0,0 +1,25 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DIRS += [
+ "dist",
+ "src",
+]
+
+include("../shared/build/node-templates.mozbuild")
+
+XPCSHELL_TESTS_MANIFESTS += ["test/xpcshell/xpcshell.toml"]
+
+BROWSER_CHROME_MANIFESTS += [
+ "test/mochitest/browser_aj.toml",
+ "test/mochitest/browser_kz.toml",
+]
+
+DevToolsModules(
+ "panel.js",
+)
+
+with Files("**"):
+ BUG_COMPONENT = ("DevTools", "Debugger")
diff --git a/devtools/client/debugger/package.json b/devtools/client/debugger/package.json
new file mode 100644
index 0000000000..4c3417af35
--- /dev/null
+++ b/devtools/client/debugger/package.json
@@ -0,0 +1,102 @@
+{
+ "name": "debugger",
+ "version": "0.6.0",
+ "license": "MPL-2.0",
+ "repository": {
+ "url": "git://github.com/firefox-devtools/debugger.git",
+ "type": "git"
+ },
+ "bugs": {
+ "url": "https://github.com/firefox-devtools/debugger/issues"
+ },
+ "homepage": "https://github.com/firefox-devtools/debugger#readme",
+ "engineStrict": true,
+ "scripts": {
+ "license-check": "devtools-license-check",
+ "links": "ls -l node_modules/ | grep ^l || echo 'no linked packages'",
+ "test": "TZ=Africa/Nairobi jest",
+ "test-ci": "TZ=Africa/Nairobi jest --json",
+ "test:watch": "jest --watch",
+ "test:coverage": "yarn test --coverage",
+ "test:all": "yarn test",
+ "watch": "node bin/watch"
+ },
+ "dependencies": {
+ "acorn": "~8.8.2",
+ "react": "16.8.6",
+ "react-dom": "16.8.6",
+ "react-redux": "^5.0.7",
+ "reselect": "4.1.5",
+ "source-map": "0.7.4",
+ "wasmparser": "^3.1.1"
+ },
+ "private": true,
+ "workspaces": [
+ "packages/*"
+ ],
+ "files": [
+ "src",
+ "assets"
+ ],
+ "greenkeeper": {
+ "ignore": [
+ "react",
+ "react-dom",
+ "react-redux",
+ "redux",
+ "codemirror"
+ ]
+ },
+ "main": "src/main.js",
+ "author": "Jason Laster <jlaster@mozilla.com>",
+ "devDependencies": {
+ "@babel/types": "^7.23.0",
+ "babel-plugin-dynamic-import-node": "^2.3.3",
+ "@babel/core": "^7.23.2",
+ "@babel/parser": "^7.23.0",
+ "@babel/plugin-proposal-class-properties": "^7.18.6",
+ "@babel/plugin-proposal-class-static-block": "^7.21.0",
+ "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6",
+ "@babel/plugin-proposal-optional-chaining": "^7.21.0",
+ "@babel/plugin-proposal-private-methods": "^7.18.6",
+ "@babel/plugin-proposal-private-property-in-object": "^7.21.11",
+ "@babel/plugin-proposal-unicode-sets-regex": "^7.18.6",
+ "@babel/plugin-transform-class-properties": "^7.22.5",
+ "@babel/plugin-transform-class-static-block": "^7.22.11",
+ "@babel/plugin-transform-modules-commonjs": "^7.23.0",
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11",
+ "@babel/plugin-transform-optional-chaining": "^7.23.0",
+ "@babel/plugin-transform-private-methods": "^7.22.5",
+ "@babel/plugin-transform-private-property-in-object": "^7.22.11",
+ "@babel/plugin-transform-unicode-sets-regex": "^7.22.5",
+ "@babel/preset-env": "^7.15.6",
+ "@babel/preset-react": "7.14.5",
+ "@babel/register": "^7.15.3",
+ "@rollup/plugin-commonjs": "^24.0.1",
+ "@rollup/plugin-node-resolve": "^15.0.1",
+ "babel-jest": "^23.0.0",
+ "babel-loader": "^8.2.5",
+ "babel-plugin-module-resolver": "^4.1.0",
+ "babel-plugin-transform-amd-to-commonjs": "1.4.0",
+ "enzyme": "^3.10.0",
+ "enzyme-adapter-react-16": "^1.14.0",
+ "enzyme-to-json": "3.3.5",
+ "jest": "^27.2.1",
+ "jest-environment-jsdom": "^27.2.0",
+ "jest-in-case": "^1.0.2",
+ "jest-junit": "^6.0.0",
+ "jest-localstorage-mock": "^2.4.17",
+ "jest-serializer-babel-ast": "^0.0.5",
+ "redux": "^4.0.5",
+ "redux-mock-store": "^1.5.4",
+ "rollup": "3.20.2",
+ "rollup-plugin-inject-process-env": "^1.3.1",
+ "rollup-plugin-node-polyfills": "^0.2.1",
+ "workerjs": "github:jasonLaster/workerjs#1944c8b753cc9e84b6ed0cb2fbcaa25600706446"
+ },
+ "resolutions": {
+ "//": "Fix workerjs babel core dependency until we figure out a good solution",
+ "workerjs/@babel/core": "^7.23.2",
+ "workerjs/@babel/register": "^7.15.3"
+ }
+}
diff --git a/devtools/client/debugger/panel.js b/devtools/client/debugger/panel.js
new file mode 100644
index 0000000000..6368fbe8ac
--- /dev/null
+++ b/devtools/client/debugger/panel.js
@@ -0,0 +1,376 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+const {
+ MultiLocalizationHelper,
+} = require("resource://devtools/shared/l10n.js");
+const {
+ FluentL10n,
+} = require("resource://devtools/client/shared/fluent-l10n/fluent-l10n.js");
+
+loader.lazyRequireGetter(
+ this,
+ "openContentLink",
+ "resource://devtools/client/shared/link.js",
+ true
+);
+loader.lazyRequireGetter(
+ this,
+ "features",
+ "resource://devtools/client/debugger/src/utils/prefs.js",
+ true
+);
+loader.lazyRequireGetter(
+ this,
+ "getOriginalLocation",
+ "resource://devtools/client/debugger/src/utils/source-maps.js",
+ true
+);
+loader.lazyRequireGetter(
+ this,
+ "createLocation",
+ "resource://devtools/client/debugger/src/utils/location.js",
+ true
+);
+loader.lazyRequireGetter(
+ this,
+ "registerStoreObserver",
+ "resource://devtools/client/shared/redux/subscriber.js",
+ true
+);
+loader.lazyRequireGetter(
+ this,
+ "getMappedExpression",
+ "resource://devtools/client/debugger/src/actions/expressions.js",
+ true
+);
+
+const DBG_STRINGS_URI = [
+ "devtools/client/locales/debugger.properties",
+ // These are used in the AppErrorBoundary component
+ "devtools/client/locales/startup.properties",
+ "devtools/client/locales/components.properties",
+ // Used by SourceMapLoader
+ "devtools/client/locales/toolbox.properties",
+];
+const L10N = new MultiLocalizationHelper(...DBG_STRINGS_URI);
+
+async function getNodeFront(gripOrFront, toolbox) {
+ // Given a NodeFront
+ if ("actorID" in gripOrFront) {
+ return new Promise(resolve => resolve(gripOrFront));
+ }
+
+ const inspectorFront = await toolbox.target.getFront("inspector");
+ return inspectorFront.getNodeFrontFromNodeGrip(gripOrFront);
+}
+
+class DebuggerPanel {
+ constructor(iframeWindow, toolbox, commands) {
+ this.panelWin = iframeWindow;
+ this.panelWin.L10N = L10N;
+
+ this.toolbox = toolbox;
+ this.commands = commands;
+ }
+
+ async open() {
+ // whypaused-* strings are in devtools/shared as they're used in the PausedDebuggerOverlay as well
+ const fluentL10n = new FluentL10n();
+ await fluentL10n.init(["devtools/shared/debugger-paused-reasons.ftl"]);
+
+ const { actions, store, selectors, client } =
+ await this.panelWin.Debugger.bootstrap({
+ commands: this.commands,
+ fluentBundles: fluentL10n.getBundles(),
+ resourceCommand: this.toolbox.resourceCommand,
+ workers: {
+ sourceMapLoader: this.toolbox.sourceMapLoader,
+ parserWorker: this.toolbox.parserWorker,
+ },
+ panel: this,
+ });
+
+ this._actions = actions;
+ this._store = store;
+ this._selectors = selectors;
+ this._client = client;
+
+ registerStoreObserver(this._store, this._onDebuggerStateChange.bind(this));
+
+ return this;
+ }
+
+ async _onDebuggerStateChange(state, oldState) {
+ const { getCurrentThread } = this._selectors;
+ const currentThreadActorID = getCurrentThread(state);
+
+ if (
+ currentThreadActorID &&
+ currentThreadActorID !== getCurrentThread(oldState)
+ ) {
+ const threadFront =
+ this.commands.client.getFrontByID(currentThreadActorID);
+ this.toolbox.selectTarget(threadFront?.targetFront.actorID);
+ }
+
+ this.toolbox.emit(
+ "show-original-variable-mapping-warnings",
+ this.shouldShowOriginalVariableMappingWarnings()
+ );
+ }
+
+ shouldShowOriginalVariableMappingWarnings() {
+ const { getSelectedSource, isMapScopesEnabled } = this._selectors;
+ if (!this.isPaused() || isMapScopesEnabled(this._getState())) {
+ return false;
+ }
+ const selectedSource = getSelectedSource(this._getState());
+ return selectedSource?.isOriginal && !selectedSource?.isPrettyPrinted;
+ }
+
+ getVarsForTests() {
+ return {
+ store: this._store,
+ selectors: this._selectors,
+ actions: this._actions,
+ client: this._client,
+ };
+ }
+
+ _getState() {
+ return this._store.getState();
+ }
+
+ getToolboxStore() {
+ return this.toolbox.store;
+ }
+
+ openLink(url) {
+ openContentLink(url);
+ }
+
+ async openConsoleAndEvaluate(input) {
+ const { hud } = await this.toolbox.selectTool("webconsole");
+ hud.ui.wrapper.dispatchEvaluateExpression(input);
+ }
+
+ async openInspector() {
+ this.toolbox.selectTool("inspector");
+ }
+
+ async openElementInInspector(gripOrFront) {
+ const onSelectInspector = this.toolbox.selectTool("inspector");
+ const onGripNodeToFront = getNodeFront(gripOrFront, this.toolbox);
+
+ const [front, inspector] = await Promise.all([
+ onGripNodeToFront,
+ onSelectInspector,
+ ]);
+
+ const onInspectorUpdated = inspector.once("inspector-updated");
+ const onNodeFrontSet = this.toolbox.selection.setNodeFront(front, {
+ reason: "debugger",
+ });
+
+ return Promise.all([onNodeFrontSet, onInspectorUpdated]);
+ }
+
+ highlightDomElement(gripOrFront) {
+ if (!this._highlight) {
+ const { highlight, unhighlight } = this.toolbox.getHighlighter();
+ this._highlight = highlight;
+ this._unhighlight = unhighlight;
+ }
+
+ return this._highlight(gripOrFront);
+ }
+
+ unHighlightDomElement() {
+ if (!this._unhighlight) {
+ return Promise.resolve();
+ }
+
+ return this._unhighlight();
+ }
+
+ /**
+ * Return the Frame Actor ID of the currently selected frame,
+ * or null if the debugger isn't paused.
+ */
+ getSelectedFrameActorID() {
+ const thread = this._selectors.getCurrentThread(this._getState());
+ const selectedFrame = this._selectors.getSelectedFrame(
+ this._getState(),
+ thread
+ );
+ if (selectedFrame) {
+ return selectedFrame.id;
+ }
+ return null;
+ }
+
+ getMappedExpression(expression) {
+ const thread = this._selectors.getCurrentThread(this._getState());
+ return getMappedExpression(expression, thread, {
+ getState: this._store.getState,
+ parserWorker: this.toolbox.parserWorker,
+ });
+ }
+
+ /**
+ * Return the source-mapped variables for the current scope.
+ * @returns {{[String]: String} | null} A dictionary mapping original variable names to generated
+ * variable names if map scopes is enabled, otherwise null.
+ */
+ getMappedVariables() {
+ if (!this._selectors.isMapScopesEnabled(this._getState())) {
+ return null;
+ }
+ const thread = this._selectors.getCurrentThread(this._getState());
+ return this._selectors.getSelectedScopeMappings(this._getState(), thread);
+ }
+
+ isPaused() {
+ const thread = this._selectors.getCurrentThread(this._getState());
+ return this._selectors.getIsPaused(this._getState(), thread);
+ }
+
+ selectSourceURL(url, line, column) {
+ return this._actions.selectSourceURL(url, { line, column });
+ }
+
+ /**
+ * This is called when some other panels wants to open a given source
+ * in the debugger at a precise line/column.
+ *
+ * @param {String} generatedURL
+ * @param {Number} generatedLine
+ * @param {Number} generatedColumn
+ * @param {String} sourceActorId (optional)
+ * If the callsite knows about a particular sourceActorId,
+ * or if the source doesn't have a URL, you have to pass a sourceActorId.
+ * @param {String} reason
+ * A telemetry identifier to record when opening the debugger.
+ * This help differentiate why we opened the debugger.
+ *
+ * @return {Boolean}
+ * Returns true if the location is known by the debugger
+ * and the debugger opens it.
+ */
+ async openSourceInDebugger({
+ generatedURL,
+ generatedLine,
+ generatedColumn,
+ sourceActorId,
+ reason,
+ }) {
+ const generatedSource = sourceActorId
+ ? this._selectors.getSourceByActorId(this._getState(), sourceActorId)
+ : this._selectors.getSourceByURL(this._getState(), generatedURL);
+ // We won't try opening source in the debugger when we can't find the related source actor in the reducer,
+ // or, when it doesn't have any related source actor registered.
+ if (
+ !generatedSource ||
+ // Note: We're not entirely sure when this can happen,
+ // so we may want to revisit that at some point.
+ !this._selectors.getSourceActorsForSource(
+ this._getState(),
+ generatedSource.id
+ ).length
+ ) {
+ return false;
+ }
+
+ const generatedLocation = createLocation({
+ source: generatedSource,
+ line: generatedLine,
+ column: generatedColumn,
+ });
+
+ // Note that getOriginalLocation can easily return generatedLocation
+ // if the location can't be mapped to any original source.
+ // So that we may open either regular source or original sources here.
+ const originalLocation = await getOriginalLocation(generatedLocation, {
+ // Reproduce a minimal thunkArgs for getOriginalLocation.
+ sourceMapLoader: this.toolbox.sourceMapLoader,
+ getState: this._store.getState,
+ });
+
+ // view-source module only forced the load of debugger in the background.
+ // Now that we know we want to show a source, force displaying it in foreground.
+ //
+ // Note that browser_markup_view-source.js doesn't wait for the debugger
+ // to be fully loaded with the source and requires the debugger to be loaded late.
+ // But we might try to load display it early to improve user perception.
+ await this.toolbox.selectTool("jsdebugger", reason);
+
+ await this._actions.selectSpecificLocation(originalLocation);
+
+ // XXX: should this be moved to selectSpecificLocation??
+ if (this._selectors.hasLogpoint(this._getState(), originalLocation)) {
+ this._actions.openConditionalPanel(originalLocation, true);
+ }
+
+ return true;
+ }
+
+ async selectServiceWorker(workerDescriptorFront) {
+ // The descriptor used by the application panel isn't fetching the worker target,
+ // but the debugger will fetch it via the watcher actor and TargetCommand.
+ // So try to match the descriptor with its related target.
+ const targets = this.commands.targetCommand.getAllTargets([
+ this.commands.targetCommand.TYPES.SERVICE_WORKER,
+ ]);
+ const workerTarget = targets.find(
+ target => target.id == workerDescriptorFront.id
+ );
+
+ const threadFront = await workerTarget.getFront("thread");
+ const threadActorID = threadFront?.actorID;
+ const isThreadAvailable = this._selectors
+ .getThreads(this._getState())
+ .find(x => x.actor === threadActorID);
+
+ if (!features.windowlessServiceWorkers) {
+ console.error(
+ "Selecting a worker needs the pref debugger.features.windowless-service-workers set to true"
+ );
+ return;
+ }
+
+ if (!isThreadAvailable) {
+ console.error(`Worker ${threadActorID} is not available for debugging`);
+ return;
+ }
+
+ // select worker's thread
+ this.selectThread(threadActorID);
+
+ // select worker's source
+ const source = this._selectors.getSourceByURL(
+ this._getState(),
+ workerDescriptorFront._url
+ );
+ const sourceActor = this._selectors.getFirstSourceActorForGeneratedSource(
+ this._getState(),
+ source.id,
+ threadActorID
+ );
+ await this._actions.selectSource(source, sourceActor);
+ }
+
+ selectThread(threadActorID) {
+ this._actions.selectThread(threadActorID);
+ }
+
+ destroy() {
+ this.panelWin.Debugger.destroy();
+ this.emit("destroyed");
+ }
+}
+
+exports.DebuggerPanel = DebuggerPanel;
diff --git a/devtools/client/debugger/src/.eslintignore b/devtools/client/debugger/src/.eslintignore
new file mode 100644
index 0000000000..32aadf77f5
--- /dev/null
+++ b/devtools/client/debugger/src/.eslintignore
@@ -0,0 +1,5 @@
+test/examples/**
+test/integration/**
+test/unit-sources/**
+**/fixtures/**
+test/mochitest/**
diff --git a/devtools/client/debugger/src/.eslintrc.js b/devtools/client/debugger/src/.eslintrc.js
new file mode 100644
index 0000000000..b71126767c
--- /dev/null
+++ b/devtools/client/debugger/src/.eslintrc.js
@@ -0,0 +1,363 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+module.exports = {
+ plugins: ["react", "mozilla", "import", "file-header"],
+ globals: {
+ atob: true,
+ btoa: true,
+ Cc: true,
+ Ci: true,
+ Components: true,
+ console: true,
+ Cr: true,
+ Cu: true,
+ devtools: true,
+ dump: true,
+ EventEmitter: true,
+ isWorker: true,
+ loader: true,
+ Services: true,
+ Task: true,
+ XPCOMUtils: true,
+ _Iterator: true,
+ __dirname: true,
+ process: true,
+ global: true,
+ L10N: true,
+ },
+ extends: ["prettier", "plugin:jest/recommended"],
+ parserOptions: {
+ ecmaVersion: "latest",
+ sourceType: "module",
+ ecmaFeatures: { jsx: true },
+ },
+ env: {
+ es6: true,
+ browser: true,
+ commonjs: true,
+ jest: true,
+ },
+ rules: {
+ // These are the rules that have been configured so far to match the
+ // devtools coding style.
+
+ // Rules from the mozilla plugin
+ "mozilla/mark-test-function-used": "error",
+ "mozilla/no-aArgs": "error",
+ // See bug 1224289.
+ "mozilla/reject-importGlobalProperties": "error",
+ "mozilla/var-only-at-top-level": "error",
+
+ // Rules from the React plugin
+ "react/jsx-uses-react": "error",
+ "react/jsx-uses-vars": "error",
+ "react/no-danger": "error",
+ "react/no-did-mount-set-state": "error",
+ "react/no-did-update-set-state": "error",
+ "react/no-direct-mutation-state": "error",
+ "react/no-unknown-property": "error",
+ "react/prop-types": "off",
+ "react/sort-comp": [
+ "error",
+ {
+ order: ["propTypes", "everything-else", "render"],
+ },
+ ],
+
+ // Check for import errors.
+ "import/no-duplicates": "error",
+ "import/named": "error",
+ "import/export": "error",
+
+ // Incompatible with jest-in-case cases. See related GitHub issue
+ // https://github.com/jest-community/eslint-plugin-jest/issues/534
+ "jest/no-standalone-expect": "off",
+
+ // Disallow flow control that escapes from "finally".
+ "no-unsafe-finally": "error",
+
+ // Disallow using variables outside the blocks they are defined (especially
+ // since only let and const are used, see "no-var").
+ "block-scoped-var": 2,
+ // Require camel case names
+ camelcase: ["error", { properties: "never" }],
+ // Warn about cyclomatic complexity in functions.
+ complexity: ["error", { max: 22 }],
+ // Don't warn for inconsistent naming when capturing this (not so important
+ // with auto-binding fat arrow functions).
+ "consistent-this": 0,
+ // Don't require a default case in switch statements. Avoid being forced to
+ // add a bogus default when you know all possible cases are handled.
+ "default-case": 0,
+ // Encourage the use of dot notation whenever possible.
+ "dot-notation": 2,
+ // Allow using == instead of ===, in the interest of landing something since
+ // the devtools codebase is split on convention here.
+ eqeqeq: 0,
+ // Don't require function expressions to have a name.
+ // This makes the code more verbose and hard to read. Our engine already
+ // does a fantastic job assigning a name to the function, which includes
+ // the enclosing function name, and worst case you have a line number that
+ // you can just look up.
+ "func-names": 0,
+ // Allow use of function declarations and expressions.
+ "func-style": 0,
+ // Deprecated, will be removed in 1.0.
+ "global-strict": 0,
+ // Only useful in a node environment.
+ "handle-callback-err": 0,
+ // Don't enforce the maximum depth that blocks can be nested. The complexity
+ // rule is a better rule to check this.
+ "max-depth": 0,
+ // Maximum depth callbacks can be nested.
+ "max-nested-callbacks": [2, 4],
+ // Don't limit the number of parameters that can be used in a function.
+ "max-params": 0,
+ // Don't limit the maximum number of statement allowed in a function. We
+ // already have the complexity rule that's a better measurement.
+ "max-statements": 0,
+ // Require a capital letter for constructors, only check if all new
+ // operators are followed by a capital letter. Don't warn when capitalized
+ // functions are used without the new operator.
+ "new-cap": [2, { capIsNew: false }],
+ // Disallow use of the Array constructor.
+ "no-array-constructor": 2,
+ // Allow use of bitwise operators.
+ "no-bitwise": 0,
+ // Disallow use of arguments.caller or arguments.callee.
+ "no-caller": 2,
+ // Disallow the catch clause parameter name being the same as a variable in
+ // the outer scope, to avoid confusion.
+ "no-catch-shadow": 2,
+ // Disallow assignment in conditional expressions.
+ "no-cond-assign": 2,
+ // Allow using the console API.
+ "no-console": 0,
+ // Allow using constant expressions in conditions like while (true)
+ "no-constant-condition": 0,
+ // Allow use of the continue statement.
+ "no-continue": 0,
+ // Disallow control characters in regular expressions.
+ "no-control-regex": 2,
+ // Disallow use of debugger.
+ "no-debugger": 2,
+ // Disallow deletion of variables (deleting properties is fine).
+ "no-delete-var": 2,
+ // Allow division operators explicitly at beginning of regular expression.
+ "no-div-regex": 0,
+ // Disallow duplicate arguments in functions.
+ "no-dupe-args": 2,
+ // Disallow a duplicate case label.
+ "no-duplicate-case": 2,
+ // Disallow else after a return in an if. The else around the second return
+ // here is useless:
+ // if (something) { return false; } else { return true; }
+ "no-else-return": 2,
+ // Disallow empty statements. This will report an error for:
+ // try { something(); } catch (e) {}
+ // but will not report it for:
+ // try { something(); } catch (e) { /* Silencing the error because ...*/ }
+ // which is a valid use case.
+ "no-empty": 2,
+ // Disallow the use of empty character classes in regular expressions.
+ "no-empty-character-class": 2,
+ // Disallow use of labels for anything other then loops and switches.
+ "no-labels": 2,
+ // Disallow use of eval(). We have other APIs to evaluate code in content.
+ "no-eval": 2,
+ // Disallow assigning to the exception in a catch block.
+ "no-ex-assign": 2,
+ // Disallow adding to native types
+ "no-extend-native": 2,
+ // Disallow unnecessary function binding.
+ "no-extra-bind": 2,
+ // Disallow double-negation boolean casts in a boolean context.
+ "no-extra-boolean-cast": 2,
+ // Deprecated, will be removed in 1.0.
+ "no-extra-strict": 0,
+ // Disallow comments inline after code.
+ "no-inline-comments": 2,
+ // Disallow if as the only statement in an else block.
+ "no-lonely-if": 2,
+ // Allow mixing regular variable and require declarations (not a node env).
+ "no-mixed-requires": 0,
+ // Disallow use of multiline strings (use template strings instead).
+ "no-multi-str": 2,
+ "prefer-template": "error",
+ "prefer-const": [
+ "error",
+ {
+ destructuring: "all",
+ ignoreReadBeforeAssign: false,
+ },
+ ],
+ // Disallow reassignments of native objects.
+ "no-native-reassign": 2,
+ // Disallow nested ternary expressions, they make the code hard to read.
+ "no-nested-ternary": 2,
+ // Allow use of new operator with the require function.
+ "no-new-require": 0,
+ // Disallow use of octal literals.
+ "no-octal": 2,
+ // Allow reassignment of function parameters.
+ "no-param-reassign": 0,
+ // Allow string concatenation with __dirname and __filename (not a node env).
+ "no-path-concat": 0,
+ // Allow use of unary operators, ++ and --.
+ "no-plusplus": 0,
+ // Allow using process.env (not a node environment).
+ "no-process-env": 0,
+ // Allow using process.exit (not a node environment).
+ "no-process-exit": 0,
+ // Disallow usage of __proto__ property.
+ "no-proto": 2,
+ // Disallow declaring the same variable more than once (we use let anyway).
+ "no-redeclare": 2,
+ // Disallow multiple spaces in a regular expression literal.
+ "no-regex-spaces": 2,
+ // Don't restrict usage of specified node modules (not a node environment).
+ "no-restricted-modules": 0,
+ // Disallow use of assignment in return statement. It is preferable for a
+ // single line of code to have only one easily predictable effect.
+ "no-return-assign": 2,
+ // Allow use of javascript: urls.
+ "no-script-url": 0,
+ // Disallow comparisons where both sides are exactly the same.
+ "no-self-compare": 2,
+ // Disallow use of comma operator.
+ "no-sequences": 2,
+ // Warn about declaration of variables already declared in the outer scope.
+ // This isn't an error because it sometimes is useful to use the same name
+ // in a small helper function rather than having to come up with another
+ // random name.
+ // Still, making this a warning can help people avoid being confused.
+ "no-shadow": 2,
+ // Disallow sparse arrays, eg. let arr = [,,2].
+ // Array destructuring is fine though:
+ // for (let [, breakpointPromise] of aPromises)
+ "no-sparse-arrays": 2,
+ // Allow use of synchronous methods (not a node environment).
+ "no-sync": 0,
+ // Allow the use of ternary operators.
+ "no-ternary": 0,
+ // Disallow throwing literals (eg. throw "error" instead of
+ // throw new Error("error")).
+ "no-throw-literal": 2,
+ // Disallow use of undeclared variables unless mentioned in a /*global */
+ // block. Note that globals from head.js are automatically imported in tests
+ // by the import-headjs-globals rule form the mozilla eslint plugin.
+ "no-undef": 2,
+ // Allow dangling underscores in identifiers (for privates).
+ "no-underscore-dangle": 0,
+ // Allow use of undefined variable.
+ "no-undefined": 0,
+ // Disallow the use of Boolean literals in conditional expressions.
+ "no-unneeded-ternary": 2,
+ // Disallow unreachable statements after a return, throw, continue, or break
+ // statement.
+ "no-unreachable": 2,
+ // Disallow global and local variables that arent used, but allow unused function arguments.
+ "no-unused-vars": [2, { vars: "all", args: "none" }],
+ // Allow using variables before they are defined.
+ "no-use-before-define": 0,
+ // We use var-only-at-top-level instead of no-var as we allow top level
+ // vars.
+ "no-var": 0,
+ // Allow using TODO/FIXME comments.
+ "no-warning-comments": 0,
+ // Dont require method and property shorthand syntax for object literals.
+ // We use this in the code a lot, but not consistently, and this seems more
+ // like something to check at code review time.
+ "object-shorthand": 0,
+ // Allow more than one variable declaration per function.
+ "one-var": 0,
+ // Require use of the second argument for parseInt().
+ radix: 2,
+ // Dont require to sort variables within the same declaration block.
+ // Anyway, one-var is disabled.
+ "sort-vars": 0,
+ // Require "use strict" to be defined globally in the script.
+ strict: [2, "global"],
+ // Disallow comparisons with the value NaN.
+ "use-isnan": 2,
+ // Ensure that the results of typeof are compared against a valid string.
+ "valid-typeof": 2,
+ // Allow vars to be declared anywhere in the scope.
+ "vars-on-top": 0,
+ // Disallow Yoda conditions (where literal value comes first).
+ yoda: 2,
+
+ // And these are the rules that haven't been discussed so far, and that are
+ // disabled for now until we introduce them, one at a time.
+
+ // Require for-in loops to have an if statement.
+ "guard-for-in": 0,
+ // allow/disallow an empty newline after var statement
+ "newline-after-var": 0,
+ // disallow the use of alert, confirm, and prompt
+ "no-alert": 0,
+ // disallow comparisons to null without a type-checking operator
+ "no-eq-null": 0,
+ // disallow overwriting functions written as function declarations
+ "no-func-assign": 0,
+ // disallow use of eval()-like methods
+ "no-implied-eval": 0,
+ // disallow function or variable declarations in nested blocks
+ "no-inner-declarations": 0,
+ // disallow invalid regular expression strings in the RegExp constructor
+ "no-invalid-regexp": 0,
+ // disallow irregular whitespace outside of strings and comments
+ "no-irregular-whitespace": 0,
+ // disallow labels that share a name with a variable
+ "no-label-var": 0,
+ // disallow unnecessary nested blocks
+ "no-lone-blocks": 0,
+ // disallow creation of functions within loops
+ "no-loop-func": 0,
+ // disallow negation of the left operand of an in expression
+ "no-negated-in-lhs": 0,
+ // disallow use of new operator when not part of the assignment or
+ // comparison
+ "no-new": 0,
+ // disallow use of new operator for Function object
+ "no-new-func": 0,
+ // disallow use of the Object constructor
+ "no-new-object": 0,
+ // disallows creating new instances of String,Number, and Boolean
+ "no-new-wrappers": 0,
+ // disallow the use of object properties of the global object (Math and
+ // JSON) as functions
+ "no-obj-calls": 0,
+ // disallow use of octal escape sequences in string literals, such as
+ // var foo = "Copyright \251";
+ "no-octal-escape": 0,
+ // disallow use of undefined when initializing variables
+ "no-undef-init": 0,
+ // disallow usage of expressions in statement position
+ "no-unused-expressions": 0,
+ // disallow use of void operator
+ "no-void": 0,
+ // require assignment operator shorthand where possible or prohibit it
+ // entirely
+ "operator-assignment": 0,
+
+ "file-header/file-header": [
+ "error",
+ [
+ "This Source Code Form is subject to the terms of the Mozilla Public",
+ "License, v. 2.0. If a copy of the MPL was not distributed with this",
+ "file, You can obtain one at <http://mozilla.org/MPL/2.0/>.",
+ ],
+ "block",
+ ["-\\*-(.*)-\\*-", "eslint(.*)", "vim(.*)"],
+ ],
+ },
+ settings: {
+ jest: {
+ // Keep in sync with "jest" version from debugger's package.json
+ version: 27,
+ },
+ },
+};
diff --git a/devtools/client/debugger/src/actions/README.md b/devtools/client/debugger/src/actions/README.md
new file mode 100644
index 0000000000..d919247838
--- /dev/null
+++ b/devtools/client/debugger/src/actions/README.md
@@ -0,0 +1,26 @@
+## Actions
+
+### Best Practices
+
+#### Scheduling Async Actions
+
+There are several use-cases with async actions that involve scheduling:
+
+* we do one action and cancel subsequent actions
+* we do one action and subsequent calls wait on the initial call
+* we start an action and show a loading state
+
+If you want to wait on subsequent calls you need to store action promises.
+[ex][req]
+
+If you just want to cancel subsequent calls, you can keep track of a pending
+state in the store. [ex][state]
+
+The advantage of adding the pending state to the store is that we can use that
+in the UI:
+
+* disable/hide the pretty print button
+* show a progress ui
+
+[req]: https://github.com/firefox-devtools/debugger/blob/master/src/actions/sources/loadSourceText.js
+[state]: https://github.com/firefox-devtools/debugger/blob/master/src/reducers/sources.js
diff --git a/devtools/client/debugger/src/actions/ast/index.js b/devtools/client/debugger/src/actions/ast/index.js
new file mode 100644
index 0000000000..ec2c1ae84c
--- /dev/null
+++ b/devtools/client/debugger/src/actions/ast/index.js
@@ -0,0 +1,5 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+export { setInScopeLines } from "./setInScopeLines";
diff --git a/devtools/client/debugger/src/actions/ast/moz.build b/devtools/client/debugger/src/actions/ast/moz.build
new file mode 100644
index 0000000000..5b0152d2ad
--- /dev/null
+++ b/devtools/client/debugger/src/actions/ast/moz.build
@@ -0,0 +1,11 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DIRS += []
+
+CompiledModules(
+ "index.js",
+ "setInScopeLines.js",
+)
diff --git a/devtools/client/debugger/src/actions/ast/setInScopeLines.js b/devtools/client/debugger/src/actions/ast/setInScopeLines.js
new file mode 100644
index 0000000000..72bd33b59f
--- /dev/null
+++ b/devtools/client/debugger/src/actions/ast/setInScopeLines.js
@@ -0,0 +1,98 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import {
+ hasInScopeLines,
+ getSourceTextContent,
+ getVisibleSelectedFrame,
+} from "../../selectors/index";
+
+import { getSourceLineCount } from "../../utils/source";
+
+import { isFulfilled } from "../../utils/async-value";
+
+function getOutOfScopeLines(outOfScopeLocations) {
+ if (!outOfScopeLocations) {
+ return null;
+ }
+
+ const uniqueLines = new Set();
+ for (const location of outOfScopeLocations) {
+ for (let i = location.start.line; i < location.end.line; i++) {
+ uniqueLines.add(i);
+ }
+ }
+
+ return uniqueLines;
+}
+
+async function getInScopeLines(
+ location,
+ sourceTextContent,
+ { dispatch, getState, parserWorker }
+) {
+ let locations = null;
+ if (location.line && parserWorker.isLocationSupported(location)) {
+ locations = await parserWorker.findOutOfScopeLocations(location);
+ }
+
+ const linesOutOfScope = getOutOfScopeLines(locations);
+ const sourceNumLines =
+ !sourceTextContent || !isFulfilled(sourceTextContent)
+ ? 0
+ : getSourceLineCount(sourceTextContent.value);
+
+ const noLinesOutOfScope =
+ linesOutOfScope == null || linesOutOfScope.size == 0;
+
+ // This operation can be very costly for large files so we sacrifice a bit of readability
+ // for performance sake.
+ // We initialize an array with a fixed size and we'll directly assign value for lines
+ // that are not out of scope. This is much faster than having an empty array and pushing
+ // into it.
+ const sourceLines = new Array(sourceNumLines);
+ for (let i = 0; i < sourceNumLines; i++) {
+ const line = i + 1;
+ if (noLinesOutOfScope || !linesOutOfScope.has(line)) {
+ sourceLines[i] = line;
+ }
+ }
+
+ // Finally we need to remove any undefined values, i.e. the ones that were matching
+ // out of scope lines.
+ return sourceLines.filter(i => i != undefined);
+}
+
+export function setInScopeLines() {
+ return async thunkArgs => {
+ const { getState, dispatch } = thunkArgs;
+ const visibleFrame = getVisibleSelectedFrame(getState());
+
+ if (!visibleFrame) {
+ return;
+ }
+
+ const { location } = visibleFrame;
+ const sourceTextContent = getSourceTextContent(getState(), location);
+
+ // Ignore if in scope lines have already be computed, or if the selected location
+ // doesn't have its content already fully fetched.
+ // The ParserWorker will only have the source text content once the source text content is fulfilled.
+ if (
+ hasInScopeLines(getState(), location) ||
+ !sourceTextContent ||
+ !isFulfilled(sourceTextContent)
+ ) {
+ return;
+ }
+
+ const lines = await getInScopeLines(location, sourceTextContent, thunkArgs);
+
+ dispatch({
+ type: "IN_SCOPE_LINES",
+ location,
+ lines,
+ });
+ };
+}
diff --git a/devtools/client/debugger/src/actions/breakpoints/breakpointPositions.js b/devtools/client/debugger/src/actions/breakpoints/breakpointPositions.js
new file mode 100644
index 0000000000..3729fd2741
--- /dev/null
+++ b/devtools/client/debugger/src/actions/breakpoints/breakpointPositions.js
@@ -0,0 +1,331 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { originalToGeneratedId } from "devtools/client/shared/source-map-loader/index";
+
+import {
+ getSource,
+ getSourceFromId,
+ getBreakpointPositionsForSource,
+ getSourceActorsForSource,
+} from "../../selectors/index";
+
+import { makeBreakpointId } from "../../utils/breakpoint/index";
+import { memoizeableAction } from "../../utils/memoizableAction";
+import { fulfilled } from "../../utils/async-value";
+import {
+ sourceMapToDebuggerLocation,
+ createLocation,
+} from "../../utils/location";
+import { validateSource } from "../../utils/context";
+
+/**
+ * Helper function which consumes breakpoints positions sent by the server
+ * and map them to location objects.
+ * During this process, the SourceMapLoader will be queried to map the positions from generated to original locations.
+ *
+ * @param {Object} breakpointPositions
+ * The positions to map related to the generated source:
+ * {
+ * 1: [ 2, 6 ], // Line 1 is breakable on column 2 and 6
+ * 2: [ 2 ], // Line 2 is only breakable on column 2
+ * }
+ * @param {Object} generatedSource
+ * @param {Object} location
+ * The current location we are computing breakable positions.
+ * @param {Object} thunk arguments
+ * @return {Object}
+ * The mapped breakable locations in the original source:
+ * {
+ * 1: [ { source, line: 1, column: 2} , { source, line: 1, column 6 } ], // Line 1 is not mapped as location are same as breakpointPositions.
+ * 10: [ { source, line: 10, column: 28 } ], // Line 2 is mapped and locations and line key refers to the original source positions.
+ * }
+ */
+async function mapToLocations(
+ breakpointPositions,
+ generatedSource,
+ mappedLocation,
+ { getState, sourceMapLoader }
+) {
+ // Map breakable positions from generated to original locations.
+ let mappedBreakpointPositions = await sourceMapLoader.getOriginalLocations(
+ breakpointPositions,
+ generatedSource.id
+ );
+ // The Source Map Loader will return null when there is no source map for that generated source.
+ // Consider the map as unrelated to source map and process the source actor positions as-is.
+ if (!mappedBreakpointPositions) {
+ mappedBreakpointPositions = breakpointPositions;
+ }
+
+ const positions = {};
+
+ // Ensure that we have an entry for the line fetched
+ if (typeof mappedLocation.line === "number") {
+ positions[mappedLocation.line] = [];
+ }
+
+ const handledBreakpointIds = new Set();
+ const isOriginal = mappedLocation.source.isOriginal;
+ const originalSourceId = mappedLocation.source.id;
+
+ for (let line in mappedBreakpointPositions) {
+ // createLocation expects a number and not a string.
+ line = parseInt(line, 10);
+ for (const columnOrSourceMapLocation of mappedBreakpointPositions[line]) {
+ let location, generatedLocation;
+
+ // When processing a source unrelated to source map, `mappedBreakpointPositions` will be equal to `breakpointPositions`.
+ // and columnOrSourceMapLocation will always be a number.
+ // But it will also be a number if we process a source mapped file and SourceMapLoader didn't find any valid mapping
+ // for the current position (line and column).
+ // When this happen to be a number it means it isn't mapped and columnOrSourceMapLocation refers to the column index.
+ if (typeof columnOrSourceMapLocation == "number") {
+ // If columnOrSourceMapLocation is a number, it means that this location doesn't mapped to an original source.
+ // So if we are currently computation positions for an original source, we can skip this breakable positions.
+ if (isOriginal) {
+ continue;
+ }
+ location = generatedLocation = createLocation({
+ line,
+ column: columnOrSourceMapLocation,
+ source: generatedSource,
+ });
+ } else {
+ // Otherwise, for sources which are mapped. `columnOrSourceMapLocation` will be a SourceMapLoader location object.
+ // This location object will refer to the location where the current column (columnOrSourceMapLocation.generatedColumn)
+ // mapped in the original file.
+
+ // When computing positions for an original source, ignore the location if that mapped to another original source.
+ if (
+ isOriginal &&
+ columnOrSourceMapLocation.sourceId != originalSourceId
+ ) {
+ continue;
+ }
+
+ location = sourceMapToDebuggerLocation(
+ getState(),
+ columnOrSourceMapLocation
+ );
+
+ // Merge positions that refer to duplicated positions.
+ // Some sourcemaped positions might refer to the exact same source/line/column triple.
+ const breakpointId = makeBreakpointId(location);
+ if (handledBreakpointIds.has(breakpointId)) {
+ continue;
+ }
+ handledBreakpointIds.add(breakpointId);
+
+ generatedLocation = createLocation({
+ line,
+ column: columnOrSourceMapLocation.generatedColumn,
+ source: generatedSource,
+ });
+ }
+
+ // The positions stored in redux will be keyed by original source's line (if we are
+ // computing the original source positions), or the generated source line.
+ // Note that when we compute the bundle positions, location may refer to the original source,
+ // but we still want to use the generated location as key.
+ const keyLocation = isOriginal ? location : generatedLocation;
+ const keyLine = keyLocation.line;
+ if (!positions[keyLine]) {
+ positions[keyLine] = [];
+ }
+ positions[keyLine].push({ location, generatedLocation });
+ }
+ }
+
+ return positions;
+}
+
+async function _setBreakpointPositions(location, thunkArgs) {
+ const { client, dispatch, getState, sourceMapLoader } = thunkArgs;
+ const results = {};
+ let generatedSource = location.source;
+ if (location.source.isOriginal) {
+ const ranges = await sourceMapLoader.getGeneratedRangesForOriginal(
+ location.source.id,
+ true
+ );
+ const generatedSourceId = originalToGeneratedId(location.source.id);
+ generatedSource = getSourceFromId(getState(), generatedSourceId);
+
+ // Note: While looping here may not look ideal, in the vast majority of
+ // cases, the number of ranges here should be very small, and is quite
+ // likely to only be a single range.
+ for (const range of ranges) {
+ // Wrap infinite end positions to the next line to keep things simple
+ // and because we know we don't care about the end-line whitespace
+ // in this case.
+ if (range.end.column === Infinity) {
+ range.end = {
+ line: range.end.line + 1,
+ column: 0,
+ };
+ }
+
+ // Retrieve the positions for all the source actors for the related generated source.
+ // There might be many if it is loaded many times.
+ // We limit the retrieval of positions within the given range, so that we don't
+ // retrieve the whole bundle positions.
+ const allActorsPositions = await Promise.all(
+ getSourceActorsForSource(getState(), generatedSourceId).map(actor =>
+ client.getSourceActorBreakpointPositions(actor, range)
+ )
+ );
+
+ // `allActorsPositions` looks like this:
+ // [
+ // { // Positions for the first source actor
+ // 1: [ 2, 6 ], // Line 1 is breakable on column 2 and 6
+ // 2: [ 2 ], // Line 2 is only breakable on column 2
+ // },
+ // {...} // Positions for another source actor
+ // ]
+ for (const actorPositions of allActorsPositions) {
+ for (const rangeLine in actorPositions) {
+ const columns = actorPositions[rangeLine];
+
+ // Merge all actors's breakable columns and avoid duplication of columns reported as breakable
+ const existing = results[rangeLine];
+ if (existing) {
+ for (const column of columns) {
+ if (!existing.includes(column)) {
+ existing.push(column);
+ }
+ }
+ } else {
+ results[rangeLine] = columns;
+ }
+ }
+ }
+ }
+ } else {
+ const { line } = location;
+ if (typeof line !== "number") {
+ throw new Error("Line is required for generated sources");
+ }
+
+ // We only retrieve the positions for the given requested line, that, for each source actor.
+ // There might be many source actor, if it is loaded many times.
+ // Or if this is an html page, with many inline scripts.
+ const allActorsBreakableColumns = await Promise.all(
+ getSourceActorsForSource(getState(), location.source.id).map(
+ async actor => {
+ const positions = await client.getSourceActorBreakpointPositions(
+ actor,
+ {
+ // Only retrieve positions for the given line
+ start: { line, column: 0 },
+ end: { line: line + 1, column: 0 },
+ }
+ );
+ return positions[line] || [];
+ }
+ )
+ );
+
+ for (const columns of allActorsBreakableColumns) {
+ // Merge all actors's breakable columns and avoid duplication of columns reported as breakable
+ const existing = results[line];
+ if (existing) {
+ for (const column of columns) {
+ if (!existing.includes(column)) {
+ existing.push(column);
+ }
+ }
+ } else {
+ results[line] = columns;
+ }
+ }
+ }
+
+ const positions = await mapToLocations(
+ results,
+ generatedSource,
+ location,
+ thunkArgs
+ );
+ // `mapToLocations` may compute for a little while asynchronously,
+ // ensure that the location is still valid before continuing.
+ validateSource(getState(), location.source);
+
+ dispatch({
+ type: "ADD_BREAKPOINT_POSITIONS",
+ source: location.source,
+ positions,
+ });
+}
+
+function generatedSourceActorKey(state, source) {
+ const generatedSource = getSource(
+ state,
+ source.isOriginal ? originalToGeneratedId(source.id) : source.id
+ );
+ const actors = generatedSource
+ ? getSourceActorsForSource(state, generatedSource.id).map(
+ ({ actor }) => actor
+ )
+ : [];
+ return [source.id, ...actors].join(":");
+}
+
+/**
+ * This method will force retrieving the breakable positions for a given source, on a given line.
+ * If this data has already been computed, it will returned the cached data.
+ *
+ * For original sources, this will query the SourceMap worker.
+ * For generated sources, this will query the DevTools server and the related source actors.
+ *
+ * @param Object options
+ * Dictionary object with many arguments:
+ * @param String options.sourceId
+ * The source we want to fetch breakable positions
+ * @param Number options.line
+ * The line we want to know which columns are breakable.
+ * (note that this seems to be optional for original sources)
+ * @return Array<Object>
+ * The list of all breakable positions, each object of this array will be like this:
+ * {
+ * line: Number
+ * column: Number
+ * source: Source object
+ * }
+ */
+export const setBreakpointPositions = memoizeableAction(
+ "setBreakpointPositions",
+ {
+ getValue: (location, { getState }) => {
+ const positions = getBreakpointPositionsForSource(
+ getState(),
+ location.source.id
+ );
+ if (!positions) {
+ return null;
+ }
+
+ if (
+ !location.source.isOriginal &&
+ location.line &&
+ !positions[location.line]
+ ) {
+ // We always return the full position dataset, but if a given line is
+ // not available, we treat the whole set as loading.
+ return null;
+ }
+
+ return fulfilled(positions);
+ },
+ createKey(location, { getState }) {
+ const key = generatedSourceActorKey(getState(), location.source);
+ return !location.source.isOriginal && location.line
+ ? `${key}-${location.line}`
+ : key;
+ },
+ action: async (location, thunkArgs) =>
+ _setBreakpointPositions(location, thunkArgs),
+ }
+);
diff --git a/devtools/client/debugger/src/actions/breakpoints/index.js b/devtools/client/debugger/src/actions/breakpoints/index.js
new file mode 100644
index 0000000000..2125ec9ec7
--- /dev/null
+++ b/devtools/client/debugger/src/actions/breakpoints/index.js
@@ -0,0 +1,395 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Redux actions for breakpoints
+ * @module actions/breakpoints
+ */
+
+import { PROMISE } from "../utils/middleware/promise";
+import { asyncStore } from "../../utils/prefs";
+import { createLocation } from "../../utils/location";
+import {
+ getBreakpointsList,
+ getXHRBreakpoints,
+ getSelectedSource,
+ getBreakpointAtLocation,
+ getBreakpointsForSource,
+ getBreakpointsAtLine,
+} from "../../selectors/index";
+import { createXHRBreakpoint } from "../../utils/breakpoint/index";
+import {
+ addBreakpoint,
+ removeBreakpoint,
+ enableBreakpoint,
+ disableBreakpoint,
+} from "./modify";
+import { getOriginalLocation } from "../../utils/source-maps";
+
+export * from "./breakpointPositions";
+export * from "./modify";
+export * from "./syncBreakpoint";
+
+export function addHiddenBreakpoint(location) {
+ return ({ dispatch }) => {
+ return dispatch(addBreakpoint(location, { hidden: true }));
+ };
+}
+
+/**
+ * Disable all breakpoints in a source
+ *
+ * @memberof actions/breakpoints
+ * @static
+ */
+export function disableBreakpointsInSource(source) {
+ return async ({ dispatch, getState, client }) => {
+ const breakpoints = getBreakpointsForSource(getState(), source);
+ for (const breakpoint of breakpoints) {
+ if (!breakpoint.disabled) {
+ dispatch(disableBreakpoint(breakpoint));
+ }
+ }
+ };
+}
+
+/**
+ * Enable all breakpoints in a source
+ *
+ * @memberof actions/breakpoints
+ * @static
+ */
+export function enableBreakpointsInSource(source) {
+ return async ({ dispatch, getState, client }) => {
+ const breakpoints = getBreakpointsForSource(getState(), source);
+ for (const breakpoint of breakpoints) {
+ if (breakpoint.disabled) {
+ dispatch(enableBreakpoint(breakpoint));
+ }
+ }
+ };
+}
+
+/**
+ * Toggle All Breakpoints
+ *
+ * @memberof actions/breakpoints
+ * @static
+ */
+export function toggleAllBreakpoints(shouldDisableBreakpoints) {
+ return async ({ dispatch, getState, client }) => {
+ const breakpoints = getBreakpointsList(getState());
+
+ for (const breakpoint of breakpoints) {
+ if (shouldDisableBreakpoints) {
+ dispatch(disableBreakpoint(breakpoint));
+ } else {
+ dispatch(enableBreakpoint(breakpoint));
+ }
+ }
+ };
+}
+
+/**
+ * Toggle Breakpoints
+ *
+ * @memberof actions/breakpoints
+ * @static
+ */
+export function toggleBreakpoints(shouldDisableBreakpoints, breakpoints) {
+ return async ({ dispatch }) => {
+ const promises = breakpoints.map(breakpoint =>
+ shouldDisableBreakpoints
+ ? dispatch(disableBreakpoint(breakpoint))
+ : dispatch(enableBreakpoint(breakpoint))
+ );
+
+ await Promise.all(promises);
+ };
+}
+
+export function toggleBreakpointsAtLine(shouldDisableBreakpoints, line) {
+ return async ({ dispatch, getState }) => {
+ const breakpoints = getBreakpointsAtLine(getState(), line);
+ return dispatch(toggleBreakpoints(shouldDisableBreakpoints, breakpoints));
+ };
+}
+
+/**
+ * Removes all breakpoints
+ *
+ * @memberof actions/breakpoints
+ * @static
+ */
+export function removeAllBreakpoints() {
+ return async ({ dispatch, getState }) => {
+ const breakpointList = getBreakpointsList(getState());
+ await Promise.all(breakpointList.map(bp => dispatch(removeBreakpoint(bp))));
+ dispatch({ type: "CLEAR_BREAKPOINTS" });
+ };
+}
+
+/**
+ * Removes breakpoints
+ *
+ * @memberof actions/breakpoints
+ * @static
+ */
+export function removeBreakpoints(breakpoints) {
+ return async ({ dispatch }) => {
+ return Promise.all(breakpoints.map(bp => dispatch(removeBreakpoint(bp))));
+ };
+}
+
+/**
+ * Removes all breakpoints in a source
+ *
+ * @memberof actions/breakpoints
+ * @static
+ */
+export function removeBreakpointsInSource(source) {
+ return async ({ dispatch, getState, client }) => {
+ const breakpoints = getBreakpointsForSource(getState(), source);
+ for (const breakpoint of breakpoints) {
+ dispatch(removeBreakpoint(breakpoint));
+ }
+ };
+}
+
+/**
+ * Update the original location information of breakpoints.
+
+/*
+ * Update breakpoints for a source that just got pretty printed.
+ * This method maps the breakpoints currently set only against the
+ * non-pretty-printed (generated) source to the related pretty-printed
+ * (original) source by querying the SourceMap service.
+ *
+ * @param {String} source - the generated source
+ */
+export function updateBreakpointsForNewPrettyPrintedSource(source) {
+ return async thunkArgs => {
+ const { dispatch, getState } = thunkArgs;
+ if (source.isOriginal) {
+ console.error("Can't update breakpoints on original sources");
+ return;
+ }
+ const breakpoints = getBreakpointsForSource(getState(), source);
+ // Remap the breakpoints with the original location information from
+ // the pretty-printed source.
+ const newBreakpoints = await Promise.all(
+ breakpoints.map(async breakpoint => {
+ const location = await getOriginalLocation(
+ breakpoint.generatedLocation,
+ thunkArgs
+ );
+ return { ...breakpoint, location };
+ })
+ );
+
+ // Normally old breakpoints will be clobbered if we re-add them, but when
+ // remapping we have changed the source maps and the old breakpoints will
+ // have different locations than the new ones. Manually remove the
+ // old breakpoints before adding the new ones.
+ for (const bp of breakpoints) {
+ dispatch(removeBreakpoint(bp));
+ }
+
+ for (const bp of newBreakpoints) {
+ await dispatch(addBreakpoint(bp.location, bp.options, bp.disabled));
+ }
+ };
+}
+
+export function toggleBreakpointAtLine(line) {
+ return ({ dispatch, getState }) => {
+ const state = getState();
+ const selectedSource = getSelectedSource(state);
+
+ if (!selectedSource) {
+ return null;
+ }
+
+ const bp = getBreakpointAtLocation(state, { line, column: undefined });
+ if (bp) {
+ return dispatch(removeBreakpoint(bp));
+ }
+ return dispatch(
+ addBreakpoint(
+ createLocation({
+ source: selectedSource,
+ line,
+ })
+ )
+ );
+ };
+}
+
+export function addBreakpointAtLine(line, shouldLog = false, disabled = false) {
+ return ({ dispatch, getState }) => {
+ const state = getState();
+ const source = getSelectedSource(state);
+
+ if (!source) {
+ return null;
+ }
+ const breakpointLocation = createLocation({
+ source,
+ column: undefined,
+ line,
+ });
+
+ const options = {};
+ if (shouldLog) {
+ options.logValue = "displayName";
+ }
+
+ return dispatch(addBreakpoint(breakpointLocation, options, disabled));
+ };
+}
+
+export function removeBreakpointsAtLine(source, line) {
+ return ({ dispatch, getState }) => {
+ const breakpointsAtLine = getBreakpointsForSource(getState(), source, line);
+ return dispatch(removeBreakpoints(breakpointsAtLine));
+ };
+}
+
+export function disableBreakpointsAtLine(source, line) {
+ return ({ dispatch, getState }) => {
+ const breakpointsAtLine = getBreakpointsForSource(getState(), source, line);
+ return dispatch(toggleBreakpoints(true, breakpointsAtLine));
+ };
+}
+
+export function enableBreakpointsAtLine(source, line) {
+ return ({ dispatch, getState }) => {
+ const breakpointsAtLine = getBreakpointsForSource(getState(), source, line);
+ return dispatch(toggleBreakpoints(false, breakpointsAtLine));
+ };
+}
+
+export function toggleDisabledBreakpoint(breakpoint) {
+ return ({ dispatch, getState }) => {
+ if (!breakpoint.disabled) {
+ return dispatch(disableBreakpoint(breakpoint));
+ }
+ return dispatch(enableBreakpoint(breakpoint));
+ };
+}
+
+export function enableXHRBreakpoint(index, bp) {
+ return ({ dispatch, getState, client }) => {
+ const xhrBreakpoints = getXHRBreakpoints(getState());
+ const breakpoint = bp || xhrBreakpoints[index];
+ const enabledBreakpoint = {
+ ...breakpoint,
+ disabled: false,
+ };
+
+ return dispatch({
+ type: "ENABLE_XHR_BREAKPOINT",
+ breakpoint: enabledBreakpoint,
+ index,
+ [PROMISE]: client.setXHRBreakpoint(breakpoint.path, breakpoint.method),
+ });
+ };
+}
+
+export function disableXHRBreakpoint(index, bp) {
+ return ({ dispatch, getState, client }) => {
+ const xhrBreakpoints = getXHRBreakpoints(getState());
+ const breakpoint = bp || xhrBreakpoints[index];
+ const disabledBreakpoint = {
+ ...breakpoint,
+ disabled: true,
+ };
+
+ return dispatch({
+ type: "DISABLE_XHR_BREAKPOINT",
+ breakpoint: disabledBreakpoint,
+ index,
+ [PROMISE]: client.removeXHRBreakpoint(breakpoint.path, breakpoint.method),
+ });
+ };
+}
+
+export function updateXHRBreakpoint(index, path, method) {
+ return ({ dispatch, getState, client }) => {
+ const xhrBreakpoints = getXHRBreakpoints(getState());
+ const breakpoint = xhrBreakpoints[index];
+
+ const updatedBreakpoint = {
+ ...breakpoint,
+ path,
+ method,
+ text: L10N.getFormatStr("xhrBreakpoints.item.label", path),
+ };
+
+ return dispatch({
+ type: "UPDATE_XHR_BREAKPOINT",
+ breakpoint: updatedBreakpoint,
+ index,
+ [PROMISE]: Promise.all([
+ client.removeXHRBreakpoint(breakpoint.path, breakpoint.method),
+ client.setXHRBreakpoint(path, method),
+ ]),
+ });
+ };
+}
+export function togglePauseOnAny() {
+ return ({ dispatch, getState }) => {
+ const xhrBreakpoints = getXHRBreakpoints(getState());
+ const index = xhrBreakpoints.findIndex(({ path }) => path.length === 0);
+ if (index < 0) {
+ return dispatch(setXHRBreakpoint("", "ANY"));
+ }
+
+ const bp = xhrBreakpoints[index];
+ if (bp.disabled) {
+ return dispatch(enableXHRBreakpoint(index, bp));
+ }
+
+ return dispatch(disableXHRBreakpoint(index, bp));
+ };
+}
+
+export function setXHRBreakpoint(path, method) {
+ return ({ dispatch, getState, client }) => {
+ const breakpoint = createXHRBreakpoint(path, method);
+
+ return dispatch({
+ type: "SET_XHR_BREAKPOINT",
+ breakpoint,
+ [PROMISE]: client.setXHRBreakpoint(path, method),
+ });
+ };
+}
+
+export function removeAllXHRBreakpoints() {
+ return async ({ dispatch, getState, client }) => {
+ const xhrBreakpoints = getXHRBreakpoints(getState());
+ const promises = xhrBreakpoints.map(breakpoint =>
+ client.removeXHRBreakpoint(breakpoint.path, breakpoint.method)
+ );
+ await dispatch({
+ type: "CLEAR_XHR_BREAKPOINTS",
+ [PROMISE]: Promise.all(promises),
+ });
+ asyncStore.xhrBreakpoints = [];
+ };
+}
+
+export function removeXHRBreakpoint(index) {
+ return ({ dispatch, getState, client }) => {
+ const xhrBreakpoints = getXHRBreakpoints(getState());
+ const breakpoint = xhrBreakpoints[index];
+ return dispatch({
+ type: "REMOVE_XHR_BREAKPOINT",
+ breakpoint,
+ index,
+ [PROMISE]: client.removeXHRBreakpoint(breakpoint.path, breakpoint.method),
+ });
+ };
+}
diff --git a/devtools/client/debugger/src/actions/breakpoints/modify.js b/devtools/client/debugger/src/actions/breakpoints/modify.js
new file mode 100644
index 0000000000..b083baf7ea
--- /dev/null
+++ b/devtools/client/debugger/src/actions/breakpoints/modify.js
@@ -0,0 +1,368 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { createBreakpoint } from "../../client/firefox/create";
+import {
+ makeBreakpointServerLocation,
+ makeBreakpointId,
+} from "../../utils/breakpoint/index";
+import {
+ getBreakpoint,
+ getBreakpointPositionsForLocation,
+ getFirstBreakpointPosition,
+ getSettledSourceTextContent,
+ getBreakpointsList,
+ getPendingBreakpointList,
+ isMapScopesEnabled,
+ getBlackBoxRanges,
+ isSourceMapIgnoreListEnabled,
+ isSourceOnSourceMapIgnoreList,
+} from "../../selectors/index";
+
+import { setBreakpointPositions } from "./breakpointPositions";
+import { setSkipPausing } from "../pause/skipPausing";
+
+import { PROMISE } from "../utils/middleware/promise";
+import { recordEvent } from "../../utils/telemetry";
+import { comparePosition } from "../../utils/location";
+import { getTextAtPosition, isLineBlackboxed } from "../../utils/source";
+import { getMappedScopesForLocation } from "../pause/mapScopes";
+import { validateBreakpoint } from "../../utils/context";
+
+// This file has the primitive operations used to modify individual breakpoints
+// and keep them in sync with the breakpoints installed on server threads. These
+// are collected here to make it easier to preserve the following invariant:
+//
+// Breakpoints are included in reducer state if they are disabled or requests
+// have been dispatched to set them in all server threads.
+//
+// To maintain this property, updates to the reducer and installed breakpoints
+// must happen with no intervening await. Using await allows other operations to
+// modify the breakpoint state in the interim and potentially cause breakpoint
+// state to go out of sync.
+//
+// The reducer is optimistically updated when users set or remove a breakpoint,
+// but it might take a little while before the breakpoints have been set or
+// removed in each thread. Once all outstanding requests sent to a thread have
+// been processed, the reducer and server threads will be in sync.
+//
+// There is another exception to the above invariant when first connecting to
+// the server: breakpoints have been installed on all generated locations in the
+// pending breakpoints, but no breakpoints have been added to the reducer. When
+// a matching source appears, either the server breakpoint will be removed or a
+// breakpoint will be added to the reducer, to restore the above invariant.
+// See syncBreakpoint.js for more.
+
+async function clientSetBreakpoint(client, { getState, dispatch }, breakpoint) {
+ const breakpointServerLocation = makeBreakpointServerLocation(
+ getState(),
+ breakpoint.generatedLocation
+ );
+ const shouldMapBreakpointExpressions =
+ isMapScopesEnabled(getState()) &&
+ breakpoint.location.source.isOriginal &&
+ (breakpoint.options.logValue || breakpoint.options.condition);
+
+ if (shouldMapBreakpointExpressions) {
+ breakpoint = await dispatch(updateBreakpointSourceMapping(breakpoint));
+ }
+ return client.setBreakpoint(breakpointServerLocation, breakpoint.options);
+}
+
+function clientRemoveBreakpoint(client, state, generatedLocation) {
+ const breakpointServerLocation = makeBreakpointServerLocation(
+ state,
+ generatedLocation
+ );
+ return client.removeBreakpoint(breakpointServerLocation);
+}
+
+export function enableBreakpoint(initialBreakpoint) {
+ return thunkArgs => {
+ const { dispatch, getState, client } = thunkArgs;
+ const state = getState();
+ const breakpoint = getBreakpoint(state, initialBreakpoint.location);
+ const blackboxedRanges = getBlackBoxRanges(state);
+ const isSourceOnIgnoreList =
+ isSourceMapIgnoreListEnabled(state) &&
+ isSourceOnSourceMapIgnoreList(state, breakpoint.location.source);
+ if (
+ !breakpoint ||
+ !breakpoint.disabled ||
+ isLineBlackboxed(
+ blackboxedRanges[breakpoint.location.source.url],
+ breakpoint.location.line,
+ isSourceOnIgnoreList
+ )
+ ) {
+ return null;
+ }
+
+ dispatch(setSkipPausing(false));
+ return dispatch({
+ type: "SET_BREAKPOINT",
+ breakpoint: createBreakpoint({ ...breakpoint, disabled: false }),
+ [PROMISE]: clientSetBreakpoint(client, thunkArgs, breakpoint),
+ });
+ };
+}
+
+export function addBreakpoint(
+ initialLocation,
+ options = {},
+ disabled,
+ shouldCancel = () => false
+) {
+ return async thunkArgs => {
+ const { dispatch, getState, client } = thunkArgs;
+ recordEvent("add_breakpoint");
+
+ await dispatch(setBreakpointPositions(initialLocation));
+
+ const position = initialLocation.column
+ ? getBreakpointPositionsForLocation(getState(), initialLocation)
+ : getFirstBreakpointPosition(getState(), initialLocation);
+
+ // No position is found if the `initialLocation` is on a non-breakable line or
+ // the line no longer exists.
+ if (!position) {
+ return null;
+ }
+
+ const { location, generatedLocation } = position;
+
+ if (!location.source || !generatedLocation.source) {
+ return null;
+ }
+
+ const originalContent = getSettledSourceTextContent(getState(), location);
+ const originalText = getTextAtPosition(
+ location.source.id,
+ originalContent,
+ location
+ );
+
+ const content = getSettledSourceTextContent(getState(), generatedLocation);
+ const text = getTextAtPosition(
+ generatedLocation.source.id,
+ content,
+ generatedLocation
+ );
+
+ const id = makeBreakpointId(location);
+ const breakpoint = createBreakpoint({
+ id,
+ disabled,
+ options,
+ location,
+ generatedLocation,
+ text,
+ originalText,
+ });
+
+ if (shouldCancel()) {
+ return null;
+ }
+
+ dispatch(setSkipPausing(false));
+ return dispatch({
+ type: "SET_BREAKPOINT",
+ breakpoint,
+ // If we just clobbered an enabled breakpoint with a disabled one, we need
+ // to remove any installed breakpoint in the server.
+ [PROMISE]: disabled
+ ? clientRemoveBreakpoint(client, getState(), generatedLocation)
+ : clientSetBreakpoint(client, thunkArgs, breakpoint),
+ });
+ };
+}
+
+/**
+ * Remove a single breakpoint
+ *
+ * @memberof actions/breakpoints
+ * @static
+ */
+export function removeBreakpoint(initialBreakpoint) {
+ return ({ dispatch, getState, client }) => {
+ recordEvent("remove_breakpoint");
+
+ const breakpoint = getBreakpoint(getState(), initialBreakpoint.location);
+ if (!breakpoint) {
+ return null;
+ }
+
+ dispatch(setSkipPausing(false));
+ return dispatch({
+ type: "REMOVE_BREAKPOINT",
+ breakpoint,
+ // If the breakpoint is disabled then it is not installed in the server.
+ [PROMISE]: breakpoint.disabled
+ ? Promise.resolve()
+ : clientRemoveBreakpoint(
+ client,
+ getState(),
+ breakpoint.generatedLocation
+ ),
+ });
+ };
+}
+
+/**
+ * Remove all installed, pending, and client breakpoints associated with a
+ * target generated location.
+ *
+ * @param {Object} target
+ * Location object where to remove breakpoints.
+ */
+export function removeBreakpointAtGeneratedLocation(target) {
+ return ({ dispatch, getState, client }) => {
+ // remove breakpoint from the server
+ const onBreakpointRemoved = clientRemoveBreakpoint(
+ client,
+ getState(),
+ target
+ );
+ // Remove any breakpoints matching the generated location.
+ const breakpoints = getBreakpointsList(getState());
+ for (const breakpoint of breakpoints) {
+ const { generatedLocation } = breakpoint;
+ if (
+ generatedLocation.source.id == target.source.id &&
+ comparePosition(generatedLocation, target)
+ ) {
+ dispatch({
+ type: "REMOVE_BREAKPOINT",
+ breakpoint,
+ [PROMISE]: onBreakpointRemoved,
+ });
+ }
+ }
+
+ // Remove any remaining pending breakpoints matching the generated location.
+ const pending = getPendingBreakpointList(getState());
+ for (const pendingBreakpoint of pending) {
+ const { generatedLocation } = pendingBreakpoint;
+ if (
+ generatedLocation.sourceUrl == target.source.url &&
+ comparePosition(generatedLocation, target)
+ ) {
+ dispatch({
+ type: "REMOVE_PENDING_BREAKPOINT",
+ pendingBreakpoint,
+ });
+ }
+ }
+ return onBreakpointRemoved;
+ };
+}
+
+/**
+ * Disable a single breakpoint
+ *
+ * @memberof actions/breakpoints
+ * @static
+ */
+export function disableBreakpoint(initialBreakpoint) {
+ return ({ dispatch, getState, client }) => {
+ const breakpoint = getBreakpoint(getState(), initialBreakpoint.location);
+ if (!breakpoint || breakpoint.disabled) {
+ return null;
+ }
+
+ dispatch(setSkipPausing(false));
+ return dispatch({
+ type: "SET_BREAKPOINT",
+ breakpoint: createBreakpoint({ ...breakpoint, disabled: true }),
+ [PROMISE]: clientRemoveBreakpoint(
+ client,
+ getState(),
+ breakpoint.generatedLocation
+ ),
+ });
+ };
+}
+
+/**
+ * Update the options of a breakpoint.
+ *
+ * @throws {Error} "not implemented"
+ * @memberof actions/breakpoints
+ * @static
+ * @param {SourceLocation} location
+ * @see DebuggerController.Breakpoints.addBreakpoint
+ * @param {Object} options
+ * Any options to set on the breakpoint
+ */
+export function setBreakpointOptions(location, options = {}) {
+ return thunkArgs => {
+ const { dispatch, getState, client } = thunkArgs;
+ let breakpoint = getBreakpoint(getState(), location);
+ if (!breakpoint) {
+ return dispatch(addBreakpoint(location, options));
+ }
+
+ // Note: setting a breakpoint's options implicitly enables it.
+ breakpoint = createBreakpoint({ ...breakpoint, disabled: false, options });
+
+ return dispatch({
+ type: "SET_BREAKPOINT",
+ breakpoint,
+ [PROMISE]: clientSetBreakpoint(client, thunkArgs, breakpoint),
+ });
+ };
+}
+
+async function updateExpression(parserWorker, mappings, originalExpression) {
+ const mapped = await parserWorker.mapExpression(
+ originalExpression,
+ mappings,
+ [],
+ false,
+ false
+ );
+ if (!mapped) {
+ return originalExpression;
+ }
+ if (!originalExpression.trimEnd().endsWith(";")) {
+ return mapped.expression.replace(/;$/, "");
+ }
+ return mapped.expression;
+}
+
+function updateBreakpointSourceMapping(breakpoint) {
+ return async ({ getState, dispatch, parserWorker }) => {
+ const options = { ...breakpoint.options };
+
+ const mappedScopes = await dispatch(
+ getMappedScopesForLocation(breakpoint.location)
+ );
+ if (!mappedScopes) {
+ return breakpoint;
+ }
+ const { mappings } = mappedScopes;
+
+ if (options.condition) {
+ options.condition = await updateExpression(
+ parserWorker,
+ mappings,
+ options.condition
+ );
+ }
+ if (options.logValue) {
+ options.logValue = await updateExpression(
+ parserWorker,
+ mappings,
+ options.logValue
+ );
+ }
+
+ // As we waited for lots of asynchronous operations,
+ // verify that the breakpoint is still valid before
+ // trying to set/update it on the server.
+ validateBreakpoint(getState(), breakpoint);
+
+ return { ...breakpoint, options };
+ };
+}
diff --git a/devtools/client/debugger/src/actions/breakpoints/moz.build b/devtools/client/debugger/src/actions/breakpoints/moz.build
new file mode 100644
index 0000000000..65910c4ef2
--- /dev/null
+++ b/devtools/client/debugger/src/actions/breakpoints/moz.build
@@ -0,0 +1,13 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DIRS += []
+
+CompiledModules(
+ "breakpointPositions.js",
+ "index.js",
+ "modify.js",
+ "syncBreakpoint.js",
+)
diff --git a/devtools/client/debugger/src/actions/breakpoints/syncBreakpoint.js b/devtools/client/debugger/src/actions/breakpoints/syncBreakpoint.js
new file mode 100644
index 0000000000..b24912de58
--- /dev/null
+++ b/devtools/client/debugger/src/actions/breakpoints/syncBreakpoint.js
@@ -0,0 +1,126 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { setBreakpointPositions } from "./breakpointPositions";
+import {
+ findPosition,
+ makeBreakpointServerLocation,
+} from "../../utils/breakpoint/index";
+
+import { comparePosition, createLocation } from "../../utils/location";
+
+import { originalToGeneratedId } from "devtools/client/shared/source-map-loader/index";
+import { getSource } from "../../selectors/index";
+import { addBreakpoint, removeBreakpointAtGeneratedLocation } from "./modify";
+
+async function findBreakpointPosition({ getState, dispatch }, location) {
+ const positions = await dispatch(setBreakpointPositions(location));
+
+ const position = findPosition(positions, location);
+ return position;
+}
+
+// Breakpoint syncing occurs when a source is found that matches either the
+// original or generated URL of a pending breakpoint. A new breakpoint is
+// constructed that might have a different original and/or generated location,
+// if the original source has changed since the pending breakpoint was created.
+// There are a couple subtle aspects to syncing:
+//
+// - We handle both the original and generated source because there is no
+// guarantee that seeing the generated source means we will also see the
+// original source. When connecting, a breakpoint will be installed in the
+// client for the generated location in the pending breakpoint, and we need
+// to make sure that either a breakpoint is added to the reducer or that this
+// client breakpoint is deleted.
+//
+// - If we see both the original and generated sources and the source mapping
+// has changed, we need to make sure that only a single breakpoint is added
+// to the reducer for the new location corresponding to the original location
+// in the pending breakpoint.
+export function syncPendingBreakpoint(source, pendingBreakpoint) {
+ return async thunkArgs => {
+ const { getState, client, dispatch } = thunkArgs;
+
+ const generatedSourceId = source.isOriginal
+ ? originalToGeneratedId(source.id)
+ : source.id;
+
+ const generatedSource = getSource(getState(), generatedSourceId);
+
+ if (!source || !generatedSource) {
+ return null;
+ }
+
+ // /!\ Pending breakpoint locations come only with sourceUrl, line and column attributes.
+ // We have to map it to a specific source object and avoid trying to query its non-existent 'source' attribute.
+ const { location, generatedLocation } = pendingBreakpoint;
+ const isPendingBreakpointWithSourceMap =
+ location.sourceUrl != generatedLocation.sourceUrl;
+ const sourceGeneratedLocation = createLocation({
+ ...generatedLocation,
+ source: generatedSource,
+ });
+
+ if (source == generatedSource && isPendingBreakpointWithSourceMap) {
+ // We are handling the generated source and the pending breakpoint has a
+ // source mapping. Supply a cancellation callback that will abort the
+ // breakpoint if the original source was synced to a different location,
+ // in which case the client breakpoint has been removed.
+ const breakpointServerLocation = makeBreakpointServerLocation(
+ getState(),
+ sourceGeneratedLocation
+ );
+ return dispatch(
+ addBreakpoint(
+ sourceGeneratedLocation,
+ pendingBreakpoint.options,
+ pendingBreakpoint.disabled,
+ () => !client.hasBreakpoint(breakpointServerLocation)
+ )
+ );
+ }
+
+ const originalLocation = createLocation({
+ ...location,
+ source,
+ });
+
+ const newPosition = await findBreakpointPosition(
+ thunkArgs,
+ originalLocation
+ );
+
+ const newGeneratedLocation = newPosition?.generatedLocation;
+ if (!newGeneratedLocation) {
+ // We couldn't find a new mapping for the breakpoint. If there is a source
+ // mapping, remove any breakpoints for the generated location, as if the
+ // breakpoint moved. If the old generated location still maps to an
+ // original location then we don't want to add a breakpoint for it.
+ if (isPendingBreakpointWithSourceMap) {
+ dispatch(removeBreakpointAtGeneratedLocation(sourceGeneratedLocation));
+ }
+ return null;
+ }
+
+ const isSameLocation = comparePosition(
+ generatedLocation,
+ newGeneratedLocation
+ );
+
+ // If the new generated location has changed from that in the pending
+ // breakpoint, remove any breakpoint associated with the old generated
+ // location.
+ if (!isSameLocation) {
+ dispatch(removeBreakpointAtGeneratedLocation(sourceGeneratedLocation));
+ }
+
+ return dispatch(
+ addBreakpoint(
+ newGeneratedLocation,
+ pendingBreakpoint.options,
+ pendingBreakpoint.disabled
+ )
+ );
+ };
+}
diff --git a/devtools/client/debugger/src/actions/breakpoints/tests/__snapshots__/breakpoints.spec.js.snap b/devtools/client/debugger/src/actions/breakpoints/tests/__snapshots__/breakpoints.spec.js.snap
new file mode 100644
index 0000000000..e6abad25d5
--- /dev/null
+++ b/devtools/client/debugger/src/actions/breakpoints/tests/__snapshots__/breakpoints.spec.js.snap
@@ -0,0 +1,165 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`breakpoints should add a breakpoint 1`] = `
+Array [
+ Object {
+ "breakpoints": Array [
+ Object {
+ "disabled": false,
+ "generatedLocation": Object {
+ "column": 1,
+ "line": 2,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "a",
+ "group": "localhost:8000",
+ "path": "/examples/a",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "a",
+ "isExtension": false,
+ "isHTML": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "url": "http://localhost:8000/examples/a",
+ },
+ "sourceActor": null,
+ "sourceActorId": undefined,
+ },
+ "id": "a:2:1",
+ "location": Object {
+ "column": 1,
+ "line": 2,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "a",
+ "group": "localhost:8000",
+ "path": "/examples/a",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "a",
+ "isExtension": false,
+ "isHTML": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "url": "http://localhost:8000/examples/a",
+ },
+ "sourceActor": null,
+ "sourceActorId": undefined,
+ },
+ "options": Object {},
+ "originalText": "return a",
+ "text": "return a",
+ "thread": undefined,
+ },
+ ],
+ "filename": "a",
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "a",
+ "group": "localhost:8000",
+ "path": "/examples/a",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "a",
+ "isExtension": false,
+ "isHTML": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "url": "http://localhost:8000/examples/a",
+ },
+ },
+]
+`;
+
+exports[`breakpoints should not show a breakpoint that does not have text 1`] = `Array []`;
+
+exports[`breakpoints should show a disabled breakpoint that does not have text 1`] = `
+Array [
+ Object {
+ "breakpoints": Array [
+ Object {
+ "disabled": true,
+ "generatedLocation": Object {
+ "column": 1,
+ "line": 5,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "a",
+ "group": "localhost:8000",
+ "path": "/examples/a",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "a",
+ "isExtension": false,
+ "isHTML": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "url": "http://localhost:8000/examples/a",
+ },
+ "sourceActor": null,
+ "sourceActorId": undefined,
+ },
+ "id": "a:5:1",
+ "location": Object {
+ "column": 1,
+ "line": 5,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "a",
+ "group": "localhost:8000",
+ "path": "/examples/a",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "a",
+ "isExtension": false,
+ "isHTML": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "url": "http://localhost:8000/examples/a",
+ },
+ "sourceActor": null,
+ "sourceActorId": undefined,
+ },
+ "options": Object {},
+ "originalText": "",
+ "text": "",
+ "thread": undefined,
+ },
+ ],
+ "filename": "a",
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "a",
+ "group": "localhost:8000",
+ "path": "/examples/a",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "a",
+ "isExtension": false,
+ "isHTML": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "url": "http://localhost:8000/examples/a",
+ },
+ },
+]
+`;
diff --git a/devtools/client/debugger/src/actions/breakpoints/tests/breakpoints.spec.js b/devtools/client/debugger/src/actions/breakpoints/tests/breakpoints.spec.js
new file mode 100644
index 0000000000..8096379429
--- /dev/null
+++ b/devtools/client/debugger/src/actions/breakpoints/tests/breakpoints.spec.js
@@ -0,0 +1,476 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import {
+ createStore,
+ selectors,
+ actions,
+ makeSource,
+ getTelemetryEvents,
+} from "../../../utils/test-head";
+
+import { mockCommandClient } from "../../tests/helpers/mockCommandClient";
+import { createLocation } from "../../../utils/location";
+
+jest.mock("../../../utils/prefs", () => ({
+ prefs: {
+ expressions: [],
+ },
+ asyncStore: {
+ pendingBreakpoints: {},
+ },
+ features: {
+ inlinePreview: true,
+ },
+}));
+
+function mockClient(positionsResponse = {}) {
+ return {
+ ...mockCommandClient,
+ setSkipPausing: jest.fn(),
+ getSourceActorBreakpointPositions: async () => positionsResponse,
+ getSourceActorBreakableLines: async () => [],
+ };
+}
+
+describe("breakpoints", () => {
+ it("should add a breakpoint", async () => {
+ const { dispatch, getState } = createStore(mockClient({ 2: [1] }));
+ const source = await dispatch(actions.newGeneratedSource(makeSource("a")));
+ source.url = "http://localhost:8000/examples/a";
+ const loc1 = createLocation({
+ source,
+ line: 2,
+ column: 1,
+ });
+ await dispatch(
+ actions.selectLocation(
+ createLocation({
+ source,
+ line: 1,
+ column: 1,
+ })
+ )
+ );
+
+ await dispatch(actions.addBreakpoint(loc1));
+
+ expect(selectors.getBreakpointCount(getState())).toEqual(1);
+ const bp = selectors.getBreakpoint(getState(), loc1);
+ expect(bp && bp.location).toEqual(loc1);
+ expect(getTelemetryEvents("add_breakpoint")).toHaveLength(1);
+
+ const bpSources = selectors.getBreakpointSources(getState());
+ expect(bpSources).toMatchSnapshot();
+ });
+
+ it("should not show a breakpoint that does not have text", async () => {
+ const { dispatch, getState } = createStore(mockClient({ 5: [1] }));
+ const source = await dispatch(actions.newGeneratedSource(makeSource("a")));
+ source.url = "http://localhost:8000/examples/a";
+ const loc1 = createLocation({
+ source,
+ line: 5,
+ column: 1,
+ });
+ await dispatch(
+ actions.selectLocation(
+ createLocation({
+ source,
+ line: 1,
+ column: 1,
+ })
+ )
+ );
+
+ await dispatch(actions.addBreakpoint(loc1));
+
+ expect(selectors.getBreakpointCount(getState())).toEqual(1);
+ const bp = selectors.getBreakpoint(getState(), loc1);
+ expect(bp && bp.location).toEqual(loc1);
+ expect(selectors.getBreakpointSources(getState())).toMatchSnapshot();
+ });
+
+ it("should show a disabled breakpoint that does not have text", async () => {
+ const { dispatch, getState } = createStore(mockClient({ 5: [1] }));
+ const source = await dispatch(actions.newGeneratedSource(makeSource("a")));
+ source.url = "http://localhost:8000/examples/a";
+ const loc1 = createLocation({
+ source,
+ line: 5,
+ column: 1,
+ });
+ await dispatch(
+ actions.selectLocation(
+ createLocation({
+ source,
+ line: 1,
+ column: 1,
+ })
+ )
+ );
+
+ await dispatch(actions.addBreakpoint(loc1));
+ const breakpoint = selectors.getBreakpoint(getState(), loc1);
+ if (!breakpoint) {
+ throw new Error("no breakpoint");
+ }
+
+ await dispatch(actions.disableBreakpoint(breakpoint));
+
+ expect(selectors.getBreakpointCount(getState())).toEqual(1);
+ const bp = selectors.getBreakpoint(getState(), loc1);
+ expect(bp && bp.location).toEqual(loc1);
+ expect(selectors.getBreakpointSources(getState())).toMatchSnapshot();
+ });
+
+ it("should not re-add a breakpoint", async () => {
+ const { dispatch, getState } = createStore(mockClient({ 5: [1] }));
+ const source = await dispatch(actions.newGeneratedSource(makeSource("a")));
+ source.url = "http://localhost:8000/examples/a";
+ const loc1 = createLocation({
+ source,
+ line: 5,
+ column: 1,
+ });
+ await dispatch(
+ actions.selectLocation(
+ createLocation({
+ source,
+ line: 1,
+ column: 1,
+ })
+ )
+ );
+
+ await dispatch(actions.addBreakpoint(loc1));
+ expect(selectors.getBreakpointCount(getState())).toEqual(1);
+ const bp = selectors.getBreakpoint(getState(), loc1);
+ expect(bp && bp.location).toEqual(loc1);
+
+ await dispatch(actions.addBreakpoint(loc1));
+ expect(selectors.getBreakpointCount(getState())).toEqual(1);
+ });
+
+ it("should remove a breakpoint", async () => {
+ const { dispatch, getState } = createStore(mockClient({ 5: [1], 6: [2] }));
+
+ const aSource = await dispatch(actions.newGeneratedSource(makeSource("a")));
+ aSource.url = "http://localhost:8000/examples/a";
+
+ const bSource = await dispatch(actions.newGeneratedSource(makeSource("b")));
+ bSource.url = "http://localhost:8000/examples/b";
+
+ const loc1 = createLocation({
+ source: aSource,
+ line: 5,
+ column: 1,
+ });
+
+ const loc2 = createLocation({
+ source: bSource,
+ line: 6,
+ column: 2,
+ });
+ const bSourceActor = selectors.getFirstSourceActorForGeneratedSource(
+ getState(),
+ bSource.id
+ );
+
+ await dispatch(actions.loadGeneratedSourceText(bSourceActor));
+
+ await dispatch(
+ actions.selectLocation(
+ createLocation({
+ source: aSource,
+ line: 1,
+ column: 1,
+ })
+ )
+ );
+
+ await dispatch(actions.addBreakpoint(loc1));
+ await dispatch(actions.addBreakpoint(loc2));
+
+ const bp = selectors.getBreakpoint(getState(), loc1);
+ if (!bp) {
+ throw new Error("no bp");
+ }
+ await dispatch(actions.removeBreakpoint(bp));
+
+ expect(selectors.getBreakpointCount(getState())).toEqual(1);
+ });
+
+ it("should disable a breakpoint", async () => {
+ const { dispatch, getState } = createStore(mockClient({ 5: [1], 6: [2] }));
+
+ const aSource = await dispatch(actions.newGeneratedSource(makeSource("a")));
+ aSource.url = "http://localhost:8000/examples/a";
+ const aSourceActor = selectors.getFirstSourceActorForGeneratedSource(
+ getState(),
+ aSource.id
+ );
+ await dispatch(actions.loadGeneratedSourceText(aSourceActor));
+
+ const bSource = await dispatch(actions.newGeneratedSource(makeSource("b")));
+ bSource.url = "http://localhost:8000/examples/b";
+ const bSourceActor = selectors.getFirstSourceActorForGeneratedSource(
+ getState(),
+ bSource.id
+ );
+ await dispatch(actions.loadGeneratedSourceText(bSourceActor));
+
+ const loc1 = createLocation({
+ source: aSource,
+ line: 5,
+ column: 1,
+ });
+
+ const loc2 = createLocation({
+ source: bSource,
+ line: 6,
+ column: 2,
+ });
+ await dispatch(actions.addBreakpoint(loc1));
+ await dispatch(actions.addBreakpoint(loc2));
+
+ const breakpoint = selectors.getBreakpoint(getState(), loc1);
+ if (!breakpoint) {
+ throw new Error("no breakpoint");
+ }
+
+ await dispatch(actions.disableBreakpoint(breakpoint));
+
+ const bp = selectors.getBreakpoint(getState(), loc1);
+ expect(bp && bp.disabled).toBe(true);
+ });
+
+ it("should enable breakpoint", async () => {
+ const { dispatch, getState } = createStore(mockClient({ 5: [1], 6: [2] }));
+
+ const aSource = await dispatch(actions.newGeneratedSource(makeSource("a")));
+ aSource.url = "http://localhost:8000/examples/a";
+ const loc = createLocation({
+ source: aSource,
+ line: 5,
+ column: 1,
+ });
+ const aSourceActor = selectors.getFirstSourceActorForGeneratedSource(
+ getState(),
+ aSource.id
+ );
+ await dispatch(actions.loadGeneratedSourceText(aSourceActor));
+
+ await dispatch(actions.addBreakpoint(loc));
+ let bp = selectors.getBreakpoint(getState(), loc);
+ if (!bp) {
+ throw new Error("no breakpoint");
+ }
+
+ await dispatch(actions.disableBreakpoint(bp));
+
+ bp = selectors.getBreakpoint(getState(), loc);
+ if (!bp) {
+ throw new Error("no breakpoint");
+ }
+
+ expect(bp && bp.disabled).toBe(true);
+
+ await dispatch(actions.enableBreakpoint(bp));
+
+ bp = selectors.getBreakpoint(getState(), loc);
+ expect(bp && !bp.disabled).toBe(true);
+ });
+
+ it("should toggle all the breakpoints", async () => {
+ const { dispatch, getState } = createStore(mockClient({ 5: [1], 6: [2] }));
+
+ const aSource = await dispatch(actions.newGeneratedSource(makeSource("a")));
+ aSource.url = "http://localhost:8000/examples/a";
+ const aSourceActor = selectors.getFirstSourceActorForGeneratedSource(
+ getState(),
+ aSource.id
+ );
+ await dispatch(actions.loadGeneratedSourceText(aSourceActor));
+
+ const bSource = await dispatch(actions.newGeneratedSource(makeSource("b")));
+ bSource.url = "http://localhost:8000/examples/b";
+ const bSourceActor = selectors.getFirstSourceActorForGeneratedSource(
+ getState(),
+ bSource.id
+ );
+ await dispatch(actions.loadGeneratedSourceText(bSourceActor));
+
+ const loc1 = createLocation({
+ source: aSource,
+ line: 5,
+ column: 1,
+ });
+
+ const loc2 = createLocation({
+ source: bSource,
+ line: 6,
+ column: 2,
+ });
+
+ await dispatch(actions.addBreakpoint(loc1));
+ await dispatch(actions.addBreakpoint(loc2));
+
+ await dispatch(actions.toggleAllBreakpoints(true));
+
+ let bp1 = selectors.getBreakpoint(getState(), loc1);
+ let bp2 = selectors.getBreakpoint(getState(), loc2);
+
+ expect(bp1 && bp1.disabled).toBe(true);
+ expect(bp2 && bp2.disabled).toBe(true);
+
+ await dispatch(actions.toggleAllBreakpoints(false));
+
+ bp1 = selectors.getBreakpoint(getState(), loc1);
+ bp2 = selectors.getBreakpoint(getState(), loc2);
+ expect(bp1 && bp1.disabled).toBe(false);
+ expect(bp2 && bp2.disabled).toBe(false);
+ });
+
+ it("should toggle a breakpoint at a location", async () => {
+ const { dispatch, getState } = createStore(mockClient({ 5: [1] }));
+
+ const source = await dispatch(
+ actions.newGeneratedSource(makeSource("foo1"))
+ );
+ const loc = createLocation({ source, line: 5, column: 1 });
+ const getBp = () => selectors.getBreakpoint(getState(), loc);
+ await dispatch(actions.selectLocation(loc));
+
+ await dispatch(actions.toggleBreakpointAtLine(5));
+ const bp = getBp();
+ expect(bp && !bp.disabled).toBe(true);
+
+ await dispatch(actions.toggleBreakpointAtLine(5));
+ expect(getBp()).toBe(undefined);
+ });
+
+ it("should disable/enable a breakpoint at a location", async () => {
+ const { dispatch, getState } = createStore(mockClient({ 5: [1] }));
+
+ const source = await dispatch(
+ actions.newGeneratedSource(makeSource("foo1"))
+ );
+ const location = createLocation({ source, line: 5, column: 1 });
+ const getBp = () => selectors.getBreakpoint(getState(), location);
+ await dispatch(actions.selectLocation(createLocation({ source, line: 1 })));
+
+ await dispatch(actions.toggleBreakpointAtLine(5));
+ let bp = getBp();
+ expect(bp && !bp.disabled).toBe(true);
+ bp = getBp();
+ if (!bp) {
+ throw new Error("no bp");
+ }
+ await dispatch(actions.toggleDisabledBreakpoint(bp));
+ bp = getBp();
+ expect(bp && bp.disabled).toBe(true);
+ });
+
+ it("should set the breakpoint condition", async () => {
+ const { dispatch, getState } = createStore(mockClient({ 5: [1] }));
+
+ const source = await dispatch(actions.newGeneratedSource(makeSource("a")));
+ source.url = "http://localhost:8000/examples/a";
+ const loc = createLocation({
+ source,
+ line: 5,
+ column: 1,
+ });
+ const sourceActor = selectors.getFirstSourceActorForGeneratedSource(
+ getState(),
+ source.id
+ );
+ await dispatch(actions.loadGeneratedSourceText(sourceActor));
+
+ await dispatch(actions.addBreakpoint(loc));
+
+ let bp = selectors.getBreakpoint(getState(), loc);
+ expect(bp && bp.options.condition).toBe(undefined);
+
+ await dispatch(
+ actions.setBreakpointOptions(loc, {
+ condition: "const foo = 0",
+ getTextForLine: () => {},
+ })
+ );
+
+ bp = selectors.getBreakpoint(getState(), loc);
+ expect(bp && bp.options.condition).toBe("const foo = 0");
+ });
+
+ it("should set the condition and enable a breakpoint", async () => {
+ const { dispatch, getState } = createStore(mockClient({ 5: [1] }));
+
+ const source = await dispatch(actions.newGeneratedSource(makeSource("a")));
+ source.url = "http://localhost:8000/examples/a";
+ const loc = createLocation({
+ source,
+ line: 5,
+ column: 1,
+ });
+ const sourceActor = selectors.getFirstSourceActorForGeneratedSource(
+ getState(),
+ source.id
+ );
+ await dispatch(actions.loadGeneratedSourceText(sourceActor));
+
+ await dispatch(actions.addBreakpoint(loc));
+ let bp = selectors.getBreakpoint(getState(), loc);
+ if (!bp) {
+ throw new Error("no breakpoint");
+ }
+
+ await dispatch(actions.disableBreakpoint(bp));
+
+ bp = selectors.getBreakpoint(getState(), loc);
+ expect(bp && bp.options.condition).toBe(undefined);
+
+ await dispatch(
+ actions.setBreakpointOptions(loc, {
+ condition: "const foo = 0",
+ getTextForLine: () => {},
+ })
+ );
+ const newBreakpoint = selectors.getBreakpoint(getState(), loc);
+ expect(newBreakpoint && !newBreakpoint.disabled).toBe(true);
+ expect(newBreakpoint && newBreakpoint.options.condition).toBe(
+ "const foo = 0"
+ );
+ });
+
+ it("should remove the pretty-printed breakpoint that was added", async () => {
+ const { dispatch, getState } = createStore(mockClient({ 1: [0] }));
+
+ const source = await dispatch(
+ actions.newGeneratedSource(makeSource("a.js"))
+ );
+ source.url = "http://localhost:8000/examples/a";
+ const loc = createLocation({
+ source,
+ line: 1,
+ column: 0,
+ });
+ const sourceActor = selectors.getFirstSourceActorForGeneratedSource(
+ getState(),
+ source.id
+ );
+ await dispatch(actions.loadGeneratedSourceText(sourceActor));
+
+ await dispatch(actions.addBreakpoint(loc));
+ await dispatch(actions.prettyPrintAndSelectSource("a.js"));
+
+ const breakpoint = selectors.getBreakpointsList(getState())[0];
+
+ await dispatch(actions.removeBreakpoint(breakpoint));
+
+ const breakpointList = selectors.getPendingBreakpointList(getState());
+ expect(breakpointList.length).toBe(0);
+ });
+});
diff --git a/devtools/client/debugger/src/actions/context-menus/breakpoint-heading.js b/devtools/client/debugger/src/actions/context-menus/breakpoint-heading.js
new file mode 100644
index 0000000000..bded531cfe
--- /dev/null
+++ b/devtools/client/debugger/src/actions/context-menus/breakpoint-heading.js
@@ -0,0 +1,78 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { buildMenu, showMenu } from "../../context-menu/menu";
+
+import { getBreakpointsForSource } from "../../selectors/index";
+
+import {
+ disableBreakpointsInSource,
+ enableBreakpointsInSource,
+ removeBreakpointsInSource,
+} from "../../actions/breakpoints/index";
+
+export function showBreakpointHeadingContextMenu(event, source) {
+ return async ({ dispatch, getState }) => {
+ const state = getState();
+ const breakpointsForSource = getBreakpointsForSource(state, source);
+
+ const enableInSourceLabel = L10N.getStr(
+ "breakpointHeadingsMenuItem.enableInSource.label"
+ );
+ const disableInSourceLabel = L10N.getStr(
+ "breakpointHeadingsMenuItem.disableInSource.label"
+ );
+ const removeInSourceLabel = L10N.getStr(
+ "breakpointHeadingsMenuItem.removeInSource.label"
+ );
+ const enableInSourceKey = L10N.getStr(
+ "breakpointHeadingsMenuItem.enableInSource.accesskey"
+ );
+ const disableInSourceKey = L10N.getStr(
+ "breakpointHeadingsMenuItem.disableInSource.accesskey"
+ );
+ const removeInSourceKey = L10N.getStr(
+ "breakpointHeadingsMenuItem.removeInSource.accesskey"
+ );
+
+ const disableInSourceItem = {
+ id: "node-menu-disable-in-source",
+ label: disableInSourceLabel,
+ accesskey: disableInSourceKey,
+ disabled: false,
+ click: () => dispatch(disableBreakpointsInSource(source)),
+ };
+
+ const enableInSourceItem = {
+ id: "node-menu-enable-in-source",
+ label: enableInSourceLabel,
+ accesskey: enableInSourceKey,
+ disabled: false,
+ click: () => dispatch(enableBreakpointsInSource(source)),
+ };
+
+ const removeInSourceItem = {
+ id: "node-menu-enable-in-source",
+ label: removeInSourceLabel,
+ accesskey: removeInSourceKey,
+ disabled: false,
+ click: () => dispatch(removeBreakpointsInSource(source)),
+ };
+
+ const hideDisableInSourceItem = breakpointsForSource.every(
+ breakpoint => breakpoint.disabled
+ );
+ const hideEnableInSourceItem = breakpointsForSource.every(
+ breakpoint => !breakpoint.disabled
+ );
+
+ const items = [
+ { item: disableInSourceItem, hidden: () => hideDisableInSourceItem },
+ { item: enableInSourceItem, hidden: () => hideEnableInSourceItem },
+ { item: removeInSourceItem, hidden: () => false },
+ ];
+
+ showMenu(event, buildMenu(items));
+ };
+}
diff --git a/devtools/client/debugger/src/actions/context-menus/breakpoint.js b/devtools/client/debugger/src/actions/context-menus/breakpoint.js
new file mode 100644
index 0000000000..d70254130c
--- /dev/null
+++ b/devtools/client/debugger/src/actions/context-menus/breakpoint.js
@@ -0,0 +1,396 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { buildMenu, showMenu } from "../../context-menu/menu";
+import { getSelectedLocation } from "../../utils/selected-location";
+import { isLineBlackboxed } from "../../utils/source";
+import { features } from "../../utils/prefs";
+import { formatKeyShortcut } from "../../utils/text";
+
+import {
+ getBreakpointsList,
+ getSelectedSource,
+ getBlackBoxRanges,
+ isSourceMapIgnoreListEnabled,
+ isSourceOnSourceMapIgnoreList,
+} from "../../selectors/index";
+
+import {
+ removeBreakpoint,
+ setBreakpointOptions,
+} from "../../actions/breakpoints/modify";
+import {
+ removeBreakpoints,
+ removeAllBreakpoints,
+ toggleBreakpoints,
+ toggleAllBreakpoints,
+ toggleDisabledBreakpoint,
+} from "../../actions/breakpoints/index";
+import { selectSpecificLocation } from "../../actions/sources/select";
+import { openConditionalPanel } from "../../actions/ui";
+
+export function showBreakpointContextMenu(event, breakpoint, source) {
+ return async ({ dispatch, getState }) => {
+ const state = getState();
+ const breakpoints = getBreakpointsList(state);
+ const blackboxedRanges = getBlackBoxRanges(state);
+ const blackboxedRangesForSource = blackboxedRanges[source.url];
+ const checkSourceOnIgnoreList = _source =>
+ isSourceMapIgnoreListEnabled(state) &&
+ isSourceOnSourceMapIgnoreList(state, _source);
+ const selectedSource = getSelectedSource(state);
+
+ const deleteSelfLabel = L10N.getStr("breakpointMenuItem.deleteSelf2.label");
+ const deleteAllLabel = L10N.getStr("breakpointMenuItem.deleteAll2.label");
+ const deleteOthersLabel = L10N.getStr(
+ "breakpointMenuItem.deleteOthers2.label"
+ );
+ const enableSelfLabel = L10N.getStr("breakpointMenuItem.enableSelf2.label");
+ const enableAllLabel = L10N.getStr("breakpointMenuItem.enableAll2.label");
+ const enableOthersLabel = L10N.getStr(
+ "breakpointMenuItem.enableOthers2.label"
+ );
+ const disableSelfLabel = L10N.getStr(
+ "breakpointMenuItem.disableSelf2.label"
+ );
+ const disableAllLabel = L10N.getStr("breakpointMenuItem.disableAll2.label");
+ const disableOthersLabel = L10N.getStr(
+ "breakpointMenuItem.disableOthers2.label"
+ );
+ const enableDbgStatementLabel = L10N.getStr(
+ "breakpointMenuItem.enabledbg.label"
+ );
+ const disableDbgStatementLabel = L10N.getStr(
+ "breakpointMenuItem.disabledbg.label"
+ );
+ const removeConditionLabel = L10N.getStr(
+ "breakpointMenuItem.removeCondition2.label"
+ );
+ const addConditionLabel = L10N.getStr(
+ "breakpointMenuItem.addCondition2.label"
+ );
+ const editConditionLabel = L10N.getStr(
+ "breakpointMenuItem.editCondition2.label"
+ );
+
+ const deleteSelfKey = L10N.getStr(
+ "breakpointMenuItem.deleteSelf2.accesskey"
+ );
+ const deleteAllKey = L10N.getStr("breakpointMenuItem.deleteAll2.accesskey");
+ const deleteOthersKey = L10N.getStr(
+ "breakpointMenuItem.deleteOthers2.accesskey"
+ );
+ const enableSelfKey = L10N.getStr(
+ "breakpointMenuItem.enableSelf2.accesskey"
+ );
+ const enableAllKey = L10N.getStr("breakpointMenuItem.enableAll2.accesskey");
+ const enableOthersKey = L10N.getStr(
+ "breakpointMenuItem.enableOthers2.accesskey"
+ );
+ const disableSelfKey = L10N.getStr(
+ "breakpointMenuItem.disableSelf2.accesskey"
+ );
+ const disableAllKey = L10N.getStr(
+ "breakpointMenuItem.disableAll2.accesskey"
+ );
+ const disableOthersKey = L10N.getStr(
+ "breakpointMenuItem.disableOthers2.accesskey"
+ );
+ const removeConditionKey = L10N.getStr(
+ "breakpointMenuItem.removeCondition2.accesskey"
+ );
+ const editConditionKey = L10N.getStr(
+ "breakpointMenuItem.editCondition2.accesskey"
+ );
+ const addConditionKey = L10N.getStr(
+ "breakpointMenuItem.addCondition2.accesskey"
+ );
+
+ const selectedLocation = getSelectedLocation(breakpoint, selectedSource);
+ const otherBreakpoints = breakpoints.filter(b => b.id !== breakpoint.id);
+ const enabledBreakpoints = breakpoints.filter(b => !b.disabled);
+ const disabledBreakpoints = breakpoints.filter(b => b.disabled);
+ const otherEnabledBreakpoints = breakpoints.filter(
+ b => !b.disabled && b.id !== breakpoint.id
+ );
+ const otherDisabledBreakpoints = breakpoints.filter(
+ b => b.disabled && b.id !== breakpoint.id
+ );
+
+ const deleteSelfItem = {
+ id: "node-menu-delete-self",
+ label: deleteSelfLabel,
+ accesskey: deleteSelfKey,
+ disabled: false,
+ click: () => {
+ dispatch(removeBreakpoint(breakpoint));
+ },
+ };
+
+ const deleteAllItem = {
+ id: "node-menu-delete-all",
+ label: deleteAllLabel,
+ accesskey: deleteAllKey,
+ disabled: false,
+ click: () => dispatch(removeAllBreakpoints()),
+ };
+
+ const deleteOthersItem = {
+ id: "node-menu-delete-other",
+ label: deleteOthersLabel,
+ accesskey: deleteOthersKey,
+ disabled: false,
+ click: () => dispatch(removeBreakpoints(otherBreakpoints)),
+ };
+
+ const enableSelfItem = {
+ id: "node-menu-enable-self",
+ label: enableSelfLabel,
+ accesskey: enableSelfKey,
+ disabled: isLineBlackboxed(
+ blackboxedRangesForSource,
+ breakpoint.location.line,
+ checkSourceOnIgnoreList(breakpoint.location.source)
+ ),
+ click: () => {
+ dispatch(toggleDisabledBreakpoint(breakpoint));
+ },
+ };
+
+ const enableAllItem = {
+ id: "node-menu-enable-all",
+ label: enableAllLabel,
+ accesskey: enableAllKey,
+ disabled: isLineBlackboxed(
+ blackboxedRangesForSource,
+ breakpoint.location.line,
+ checkSourceOnIgnoreList(breakpoint.location.source)
+ ),
+ click: () => dispatch(toggleAllBreakpoints(false)),
+ };
+
+ const enableOthersItem = {
+ id: "node-menu-enable-others",
+ label: enableOthersLabel,
+ accesskey: enableOthersKey,
+ disabled: isLineBlackboxed(
+ blackboxedRangesForSource,
+ breakpoint.location.line,
+ checkSourceOnIgnoreList(breakpoint.location.source)
+ ),
+ click: () => dispatch(toggleBreakpoints(false, otherDisabledBreakpoints)),
+ };
+
+ const disableSelfItem = {
+ id: "node-menu-disable-self",
+ label: disableSelfLabel,
+ accesskey: disableSelfKey,
+ disabled: false,
+ click: () => {
+ dispatch(toggleDisabledBreakpoint(breakpoint));
+ },
+ };
+
+ const disableAllItem = {
+ id: "node-menu-disable-all",
+ label: disableAllLabel,
+ accesskey: disableAllKey,
+ disabled: false,
+ click: () => dispatch(toggleAllBreakpoints(true)),
+ };
+
+ const disableOthersItem = {
+ id: "node-menu-disable-others",
+ label: disableOthersLabel,
+ accesskey: disableOthersKey,
+ click: () => dispatch(toggleBreakpoints(true, otherEnabledBreakpoints)),
+ };
+
+ const enableDbgStatementItem = {
+ id: "node-menu-enable-dbgStatement",
+ label: enableDbgStatementLabel,
+ disabled: false,
+ click: () =>
+ dispatch(
+ setBreakpointOptions(selectedLocation, {
+ ...breakpoint.options,
+ condition: null,
+ })
+ ),
+ };
+
+ const disableDbgStatementItem = {
+ id: "node-menu-disable-dbgStatement",
+ label: disableDbgStatementLabel,
+ disabled: false,
+ click: () =>
+ dispatch(
+ setBreakpointOptions(selectedLocation, {
+ ...breakpoint.options,
+ condition: "false",
+ })
+ ),
+ };
+
+ const removeConditionItem = {
+ id: "node-menu-remove-condition",
+ label: removeConditionLabel,
+ accesskey: removeConditionKey,
+ disabled: false,
+ click: () =>
+ dispatch(
+ setBreakpointOptions(selectedLocation, {
+ ...breakpoint.options,
+ condition: null,
+ })
+ ),
+ };
+
+ const addConditionItem = {
+ id: "node-menu-add-condition",
+ label: addConditionLabel,
+ accesskey: addConditionKey,
+ click: async () => {
+ await dispatch(selectSpecificLocation(selectedLocation));
+ await dispatch(openConditionalPanel(selectedLocation));
+ },
+ accelerator: formatKeyShortcut(
+ L10N.getStr("toggleCondPanel.breakpoint.key")
+ ),
+ };
+
+ const editConditionItem = {
+ id: "node-menu-edit-condition",
+ label: editConditionLabel,
+ accesskey: editConditionKey,
+ click: async () => {
+ await dispatch(selectSpecificLocation(selectedLocation));
+ await dispatch(openConditionalPanel(selectedLocation));
+ },
+ accelerator: formatKeyShortcut(
+ L10N.getStr("toggleCondPanel.breakpoint.key")
+ ),
+ };
+
+ const addLogPointItem = {
+ id: "node-menu-add-log-point",
+ label: L10N.getStr("editor.addLogPoint"),
+ accesskey: L10N.getStr("editor.addLogPoint.accesskey"),
+ disabled: false,
+ click: async () => {
+ await dispatch(selectSpecificLocation(selectedLocation));
+ await dispatch(openConditionalPanel(selectedLocation, true));
+ },
+ accelerator: formatKeyShortcut(
+ L10N.getStr("toggleCondPanel.logPoint.key")
+ ),
+ };
+
+ const editLogPointItem = {
+ id: "node-menu-edit-log-point",
+ label: L10N.getStr("editor.editLogPoint"),
+ accesskey: L10N.getStr("editor.editLogPoint.accesskey"),
+ disabled: false,
+ click: async () => {
+ await dispatch(selectSpecificLocation(selectedLocation));
+ await dispatch(openConditionalPanel(selectedLocation, true));
+ },
+ accelerator: formatKeyShortcut(
+ L10N.getStr("toggleCondPanel.logPoint.key")
+ ),
+ };
+
+ const removeLogPointItem = {
+ id: "node-menu-remove-log",
+ label: L10N.getStr("editor.removeLogPoint.label"),
+ accesskey: L10N.getStr("editor.removeLogPoint.accesskey"),
+ disabled: false,
+ click: () =>
+ dispatch(
+ setBreakpointOptions(selectedLocation, {
+ ...breakpoint.options,
+ logValue: null,
+ })
+ ),
+ };
+
+ const logPointItem = breakpoint.options.logValue
+ ? editLogPointItem
+ : addLogPointItem;
+
+ const hideEnableSelfItem = !breakpoint.disabled;
+ const hideEnableAllItem = disabledBreakpoints.length === 0;
+ const hideEnableOthersItem = otherDisabledBreakpoints.length === 0;
+ const hideDisableAllItem = enabledBreakpoints.length === 0;
+ const hideDisableOthersItem = otherEnabledBreakpoints.length === 0;
+ const hideDisableSelfItem = breakpoint.disabled;
+ const hideEnableDbgStatementItem =
+ !breakpoint.originalText.startsWith("debugger") ||
+ (breakpoint.originalText.startsWith("debugger") &&
+ breakpoint.options.condition !== "false");
+ const hideDisableDbgStatementItem =
+ !breakpoint.originalText.startsWith("debugger") ||
+ (breakpoint.originalText.startsWith("debugger") &&
+ breakpoint.options.condition === "false");
+ const items = [
+ { item: enableSelfItem, hidden: () => hideEnableSelfItem },
+ { item: enableAllItem, hidden: () => hideEnableAllItem },
+ { item: enableOthersItem, hidden: () => hideEnableOthersItem },
+ {
+ item: { type: "separator" },
+ hidden: () =>
+ hideEnableSelfItem && hideEnableAllItem && hideEnableOthersItem,
+ },
+ { item: deleteSelfItem },
+ { item: deleteAllItem },
+ { item: deleteOthersItem, hidden: () => breakpoints.length === 1 },
+ {
+ item: { type: "separator" },
+ hidden: () =>
+ hideDisableSelfItem && hideDisableAllItem && hideDisableOthersItem,
+ },
+
+ { item: disableSelfItem, hidden: () => hideDisableSelfItem },
+ { item: disableAllItem, hidden: () => hideDisableAllItem },
+ { item: disableOthersItem, hidden: () => hideDisableOthersItem },
+ {
+ item: { type: "separator" },
+ },
+ {
+ item: enableDbgStatementItem,
+ hidden: () => hideEnableDbgStatementItem,
+ },
+ {
+ item: disableDbgStatementItem,
+ hidden: () => hideDisableDbgStatementItem,
+ },
+ {
+ item: { type: "separator" },
+ hidden: () => hideDisableDbgStatementItem && hideEnableDbgStatementItem,
+ },
+ {
+ item: addConditionItem,
+ hidden: () => breakpoint.options.condition,
+ },
+ {
+ item: editConditionItem,
+ hidden: () => !breakpoint.options.condition,
+ },
+ {
+ item: removeConditionItem,
+ hidden: () => !breakpoint.options.condition,
+ },
+ {
+ item: logPointItem,
+ hidden: () => !features.logPoints,
+ },
+ {
+ item: removeLogPointItem,
+ hidden: () => !features.logPoints || !breakpoint.options.logValue,
+ },
+ ];
+
+ showMenu(event, buildMenu(items));
+ };
+}
diff --git a/devtools/client/debugger/src/actions/context-menus/editor-breakpoint.js b/devtools/client/debugger/src/actions/context-menus/editor-breakpoint.js
new file mode 100644
index 0000000000..39ec2f1589
--- /dev/null
+++ b/devtools/client/debugger/src/actions/context-menus/editor-breakpoint.js
@@ -0,0 +1,273 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { showMenu } from "../../context-menu/menu";
+import { getSelectedLocation } from "../../utils/selected-location";
+import { features } from "../../utils/prefs";
+import { formatKeyShortcut } from "../../utils/text";
+import { isLineBlackboxed } from "../../utils/source";
+
+import {
+ getSelectedSource,
+ getBlackBoxRanges,
+ isSourceMapIgnoreListEnabled,
+ isSourceOnSourceMapIgnoreList,
+} from "../../selectors/index";
+import {
+ addBreakpoint,
+ removeBreakpoint,
+ setBreakpointOptions,
+} from "../../actions/breakpoints/modify";
+import {
+ enableBreakpointsAtLine,
+ disableBreakpointsAtLine,
+ toggleDisabledBreakpoint,
+ removeBreakpointsAtLine,
+} from "../../actions/breakpoints/index";
+import { openConditionalPanel } from "../../actions/ui";
+
+export function showEditorEditBreakpointContextMenu(event, breakpoint) {
+ return async ({ dispatch, getState }) => {
+ const state = getState();
+ const selectedSource = getSelectedSource(state);
+ const selectedLocation = getSelectedLocation(breakpoint, selectedSource);
+ const blackboxedRanges = getBlackBoxRanges(state);
+ const blackboxedRangesForSelectedSource =
+ blackboxedRanges[selectedSource.url];
+ const isSelectedSourceOnIgnoreList =
+ selectedSource &&
+ isSourceMapIgnoreListEnabled(state) &&
+ isSourceOnSourceMapIgnoreList(state, selectedSource);
+
+ const items = [
+ removeBreakpointItem(breakpoint, dispatch),
+ toggleDisabledBreakpointItem(
+ breakpoint,
+ blackboxedRangesForSelectedSource,
+ isSelectedSourceOnIgnoreList,
+ dispatch
+ ),
+ ];
+
+ if (breakpoint.originalText.startsWith("debugger")) {
+ items.push(
+ { type: "separator" },
+ toggleDbgStatementItem(selectedLocation, breakpoint, dispatch)
+ );
+ }
+
+ items.push(
+ { type: "separator" },
+ removeBreakpointsOnLineItem(selectedLocation, dispatch),
+ breakpoint.disabled
+ ? enableBreakpointsOnLineItem(
+ selectedLocation,
+ blackboxedRangesForSelectedSource,
+ isSelectedSourceOnIgnoreList,
+ dispatch
+ )
+ : disableBreakpointsOnLineItem(selectedLocation, dispatch),
+ { type: "separator" }
+ );
+
+ items.push(
+ conditionalBreakpointItem(breakpoint, selectedLocation, dispatch)
+ );
+ items.push(logPointItem(breakpoint, selectedLocation, dispatch));
+
+ showMenu(event, items);
+ };
+}
+
+export function showEditorCreateBreakpointContextMenu(
+ event,
+ location,
+ lineText
+) {
+ return async ({ dispatch, getState }) => {
+ const items = createBreakpointItems(location, lineText, dispatch);
+
+ showMenu(event, items);
+ };
+}
+
+export function createBreakpointItems(location, lineText, dispatch) {
+ const items = [
+ addBreakpointItem(location, dispatch),
+ addConditionalBreakpointItem(location, dispatch),
+ ];
+
+ if (features.logPoints) {
+ items.push(addLogPointItem(location, dispatch));
+ }
+
+ if (lineText && lineText.startsWith("debugger")) {
+ items.push(toggleDbgStatementItem(location, null, dispatch));
+ }
+ return items;
+}
+
+const addBreakpointItem = (location, dispatch) => ({
+ id: "node-menu-add-breakpoint",
+ label: L10N.getStr("editor.addBreakpoint"),
+ accesskey: L10N.getStr("shortcuts.toggleBreakpoint.accesskey"),
+ disabled: false,
+ click: () => dispatch(addBreakpoint(location)),
+ accelerator: formatKeyShortcut(L10N.getStr("toggleBreakpoint.key")),
+});
+
+const removeBreakpointItem = (breakpoint, dispatch) => ({
+ id: "node-menu-remove-breakpoint",
+ label: L10N.getStr("editor.removeBreakpoint"),
+ accesskey: L10N.getStr("shortcuts.toggleBreakpoint.accesskey"),
+ disabled: false,
+ click: () => dispatch(removeBreakpoint(breakpoint)),
+ accelerator: formatKeyShortcut(L10N.getStr("toggleBreakpoint.key")),
+});
+
+const addConditionalBreakpointItem = (location, dispatch) => ({
+ id: "node-menu-add-conditional-breakpoint",
+ label: L10N.getStr("editor.addConditionBreakpoint"),
+ accelerator: formatKeyShortcut(L10N.getStr("toggleCondPanel.breakpoint.key")),
+ accesskey: L10N.getStr("editor.addConditionBreakpoint.accesskey"),
+ disabled: false,
+ click: () => dispatch(openConditionalPanel(location)),
+});
+
+const editConditionalBreakpointItem = (location, dispatch) => ({
+ id: "node-menu-edit-conditional-breakpoint",
+ label: L10N.getStr("editor.editConditionBreakpoint"),
+ accelerator: formatKeyShortcut(L10N.getStr("toggleCondPanel.breakpoint.key")),
+ accesskey: L10N.getStr("editor.addConditionBreakpoint.accesskey"),
+ disabled: false,
+ click: () => dispatch(openConditionalPanel(location)),
+});
+
+const conditionalBreakpointItem = (breakpoint, location, dispatch) => {
+ const {
+ options: { condition },
+ } = breakpoint;
+ return condition
+ ? editConditionalBreakpointItem(location, dispatch)
+ : addConditionalBreakpointItem(location, dispatch);
+};
+
+const addLogPointItem = (location, dispatch) => ({
+ id: "node-menu-add-log-point",
+ label: L10N.getStr("editor.addLogPoint"),
+ accesskey: L10N.getStr("editor.addLogPoint.accesskey"),
+ disabled: false,
+ click: () => dispatch(openConditionalPanel(location, true)),
+ accelerator: formatKeyShortcut(L10N.getStr("toggleCondPanel.logPoint.key")),
+});
+
+const editLogPointItem = (location, dispatch) => ({
+ id: "node-menu-edit-log-point",
+ label: L10N.getStr("editor.editLogPoint"),
+ accesskey: L10N.getStr("editor.editLogPoint.accesskey"),
+ disabled: false,
+ click: () => dispatch(openConditionalPanel(location, true)),
+ accelerator: formatKeyShortcut(L10N.getStr("toggleCondPanel.logPoint.key")),
+});
+
+const logPointItem = (breakpoint, location, dispatch) => {
+ const {
+ options: { logValue },
+ } = breakpoint;
+ return logValue
+ ? editLogPointItem(location, dispatch)
+ : addLogPointItem(location, dispatch);
+};
+
+const toggleDisabledBreakpointItem = (
+ breakpoint,
+ blackboxedRangesForSelectedSource,
+ isSelectedSourceOnIgnoreList,
+ dispatch
+) => {
+ return {
+ accesskey: L10N.getStr("editor.disableBreakpoint.accesskey"),
+ disabled: isLineBlackboxed(
+ blackboxedRangesForSelectedSource,
+ breakpoint.location.line,
+ isSelectedSourceOnIgnoreList
+ ),
+ click: () => dispatch(toggleDisabledBreakpoint(breakpoint)),
+ ...(breakpoint.disabled
+ ? {
+ id: "node-menu-enable-breakpoint",
+ label: L10N.getStr("editor.enableBreakpoint"),
+ }
+ : {
+ id: "node-menu-disable-breakpoint",
+ label: L10N.getStr("editor.disableBreakpoint"),
+ }),
+ };
+};
+
+const toggleDbgStatementItem = (location, breakpoint, dispatch) => {
+ if (breakpoint && breakpoint.options.condition === "false") {
+ return {
+ disabled: false,
+ id: "node-menu-enable-dbgStatement",
+ label: L10N.getStr("breakpointMenuItem.enabledbg.label"),
+ click: () =>
+ dispatch(
+ setBreakpointOptions(location, {
+ ...breakpoint.options,
+ condition: null,
+ })
+ ),
+ };
+ }
+
+ return {
+ disabled: false,
+ id: "node-menu-disable-dbgStatement",
+ label: L10N.getStr("breakpointMenuItem.disabledbg.label"),
+ click: () =>
+ dispatch(
+ setBreakpointOptions(location, {
+ condition: "false",
+ })
+ ),
+ };
+};
+
+// ToDo: Only enable if there are more than one breakpoints on a line?
+const removeBreakpointsOnLineItem = (location, dispatch) => ({
+ id: "node-menu-remove-breakpoints-on-line",
+ label: L10N.getStr("breakpointMenuItem.removeAllAtLine.label"),
+ accesskey: L10N.getStr("breakpointMenuItem.removeAllAtLine.accesskey"),
+ disabled: false,
+ click: () =>
+ dispatch(removeBreakpointsAtLine(location.source, location.line)),
+});
+
+const enableBreakpointsOnLineItem = (
+ location,
+ blackboxedRangesForSelectedSource,
+ isSelectedSourceOnIgnoreList,
+ dispatch
+) => ({
+ id: "node-menu-remove-breakpoints-on-line",
+ label: L10N.getStr("breakpointMenuItem.enableAllAtLine.label"),
+ accesskey: L10N.getStr("breakpointMenuItem.enableAllAtLine.accesskey"),
+ disabled: isLineBlackboxed(
+ blackboxedRangesForSelectedSource,
+ location.line,
+ isSelectedSourceOnIgnoreList
+ ),
+ click: () =>
+ dispatch(enableBreakpointsAtLine(location.source, location.line)),
+});
+
+const disableBreakpointsOnLineItem = (location, dispatch) => ({
+ id: "node-menu-remove-breakpoints-on-line",
+ label: L10N.getStr("breakpointMenuItem.disableAllAtLine.label"),
+ accesskey: L10N.getStr("breakpointMenuItem.disableAllAtLine.accesskey"),
+ disabled: false,
+ click: () =>
+ dispatch(disableBreakpointsAtLine(location.source, location.line)),
+});
diff --git a/devtools/client/debugger/src/actions/context-menus/editor.js b/devtools/client/debugger/src/actions/context-menus/editor.js
new file mode 100644
index 0000000000..1125790a9b
--- /dev/null
+++ b/devtools/client/debugger/src/actions/context-menus/editor.js
@@ -0,0 +1,436 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { showMenu } from "../../context-menu/menu";
+
+import { copyToTheClipboard } from "../../utils/clipboard";
+import {
+ isPretty,
+ getRawSourceURL,
+ getFilename,
+ shouldBlackbox,
+ findBlackBoxRange,
+} from "../../utils/source";
+import { toSourceLine } from "../../utils/editor/index";
+import { downloadFile } from "../../utils/utils";
+import { features } from "../../utils/prefs";
+import { isFulfilled } from "../../utils/async-value";
+
+import { createBreakpointItems } from "./editor-breakpoint";
+
+import {
+ getPrettySource,
+ getIsCurrentThreadPaused,
+ isSourceWithMap,
+ getBlackBoxRanges,
+ isSourceOnSourceMapIgnoreList,
+ isSourceMapIgnoreListEnabled,
+ getEditorWrapping,
+} from "../../selectors/index";
+
+import { continueToHere } from "../../actions/pause/continueToHere";
+import { jumpToMappedLocation } from "../../actions/sources/select";
+import {
+ showSource,
+ toggleInlinePreview,
+ toggleEditorWrapping,
+} from "../../actions/ui";
+import { toggleBlackBox } from "../../actions/sources/blackbox";
+import { addExpression } from "../../actions/expressions";
+import { evaluateInConsole } from "../../actions/toolbox";
+
+export function showEditorContextMenu(event, editor, location) {
+ return async ({ dispatch, getState }) => {
+ const { source } = location;
+ const state = getState();
+ const blackboxedRanges = getBlackBoxRanges(state);
+ const isPaused = getIsCurrentThreadPaused(state);
+ const hasMappedLocation =
+ (source.isOriginal ||
+ isSourceWithMap(state, source.id) ||
+ isPretty(source)) &&
+ !getPrettySource(state, source.id);
+ const isSourceOnIgnoreList =
+ isSourceMapIgnoreListEnabled(state) &&
+ isSourceOnSourceMapIgnoreList(state, source);
+ const editorWrappingEnabled = getEditorWrapping(state);
+
+ showMenu(
+ event,
+ editorMenuItems({
+ blackboxedRanges,
+ hasMappedLocation,
+ location,
+ isPaused,
+ editorWrappingEnabled,
+ selectionText: editor.codeMirror.getSelection().trim(),
+ isTextSelected: editor.codeMirror.somethingSelected(),
+ editor,
+ isSourceOnIgnoreList,
+ dispatch,
+ })
+ );
+ };
+}
+
+export function showEditorGutterContextMenu(event, editor, location, lineText) {
+ return async ({ dispatch, getState }) => {
+ const { source } = location;
+ const state = getState();
+ const blackboxedRanges = getBlackBoxRanges(state);
+ const isPaused = getIsCurrentThreadPaused(state);
+ const isSourceOnIgnoreList =
+ isSourceMapIgnoreListEnabled(state) &&
+ isSourceOnSourceMapIgnoreList(state, source);
+
+ showMenu(event, [
+ ...createBreakpointItems(location, lineText, dispatch),
+ { type: "separator" },
+ continueToHereItem(location, isPaused, dispatch),
+ { type: "separator" },
+ blackBoxLineMenuItem(
+ source,
+ editor,
+ blackboxedRanges,
+ isSourceOnIgnoreList,
+ location.line,
+ dispatch
+ ),
+ ]);
+ };
+}
+
+// Menu Items
+const continueToHereItem = (location, isPaused, dispatch) => ({
+ accesskey: L10N.getStr("editor.continueToHere.accesskey"),
+ disabled: !isPaused,
+ click: () => dispatch(continueToHere(location)),
+ id: "node-menu-continue-to-here",
+ label: L10N.getStr("editor.continueToHere.label"),
+});
+
+const copyToClipboardItem = selectionText => ({
+ id: "node-menu-copy-to-clipboard",
+ label: L10N.getStr("copyToClipboard.label"),
+ accesskey: L10N.getStr("copyToClipboard.accesskey"),
+ disabled: selectionText.length === 0,
+ click: () => copyToTheClipboard(selectionText),
+});
+
+const copySourceItem = selectedContent => ({
+ id: "node-menu-copy-source",
+ label: L10N.getStr("copySource.label"),
+ accesskey: L10N.getStr("copySource.accesskey"),
+ disabled: false,
+ click: () =>
+ selectedContent.type === "text" &&
+ copyToTheClipboard(selectedContent.value),
+});
+
+const copySourceUri2Item = selectedSource => ({
+ id: "node-menu-copy-source-url",
+ label: L10N.getStr("copySourceUri2"),
+ accesskey: L10N.getStr("copySourceUri2.accesskey"),
+ disabled: !selectedSource.url,
+ click: () => copyToTheClipboard(getRawSourceURL(selectedSource.url)),
+});
+
+const jumpToMappedLocationItem = (location, hasMappedLocation, dispatch) => ({
+ id: "node-menu-jump",
+ label: L10N.getFormatStr(
+ "editor.jumpToMappedLocation1",
+ location.source.isOriginal
+ ? L10N.getStr("generated")
+ : L10N.getStr("original")
+ ),
+ accesskey: L10N.getStr("editor.jumpToMappedLocation1.accesskey"),
+ disabled: !hasMappedLocation,
+ click: () => dispatch(jumpToMappedLocation(location)),
+});
+
+const showSourceMenuItem = (selectedSource, dispatch) => ({
+ id: "node-menu-show-source",
+ label: L10N.getStr("sourceTabs.revealInTree"),
+ accesskey: L10N.getStr("sourceTabs.revealInTree.accesskey"),
+ disabled: !selectedSource.url,
+ click: () => dispatch(showSource(selectedSource.id)),
+});
+
+const blackBoxMenuItem = (
+ selectedSource,
+ blackboxedRanges,
+ isSourceOnIgnoreList,
+ dispatch
+) => {
+ const isBlackBoxed = !!blackboxedRanges[selectedSource.url];
+ return {
+ id: "node-menu-blackbox",
+ label: isBlackBoxed
+ ? L10N.getStr("ignoreContextItem.unignore")
+ : L10N.getStr("ignoreContextItem.ignore"),
+ accesskey: isBlackBoxed
+ ? L10N.getStr("ignoreContextItem.unignore.accesskey")
+ : L10N.getStr("ignoreContextItem.ignore.accesskey"),
+ disabled: isSourceOnIgnoreList || !shouldBlackbox(selectedSource),
+ click: () => dispatch(toggleBlackBox(selectedSource)),
+ };
+};
+
+const blackBoxLineMenuItem = (
+ selectedSource,
+ editor,
+ blackboxedRanges,
+ isSourceOnIgnoreList,
+ // the clickedLine is passed when the context menu
+ // is opened from the gutter, it is not available when the
+ // the context menu is opened from the editor.
+ clickedLine = null,
+ dispatch
+) => {
+ const { codeMirror } = editor;
+ const from = codeMirror.getCursor("from");
+ const to = codeMirror.getCursor("to");
+
+ const startLine = clickedLine ?? toSourceLine(selectedSource.id, from.line);
+ const endLine = clickedLine ?? toSourceLine(selectedSource.id, to.line);
+
+ const blackboxRange = findBlackBoxRange(selectedSource, blackboxedRanges, {
+ start: startLine,
+ end: endLine,
+ });
+
+ const selectedLineIsBlackBoxed = !!blackboxRange;
+
+ const isSingleLine = selectedLineIsBlackBoxed
+ ? blackboxRange.start.line == blackboxRange.end.line
+ : startLine == endLine;
+
+ const isSourceFullyBlackboxed =
+ blackboxedRanges[selectedSource.url] &&
+ !blackboxedRanges[selectedSource.url].length;
+
+ // The ignore/unignore line context menu item should be disabled when
+ // 1) The source is on the sourcemap ignore list
+ // 2) The whole source is blackboxed or
+ // 3) Multiple lines are blackboxed or
+ // 4) Multiple lines are selected in the editor
+ const shouldDisable =
+ isSourceOnIgnoreList || isSourceFullyBlackboxed || !isSingleLine;
+
+ return {
+ id: "node-menu-blackbox-line",
+ label: !selectedLineIsBlackBoxed
+ ? L10N.getStr("ignoreContextItem.ignoreLine")
+ : L10N.getStr("ignoreContextItem.unignoreLine"),
+ accesskey: !selectedLineIsBlackBoxed
+ ? L10N.getStr("ignoreContextItem.ignoreLine.accesskey")
+ : L10N.getStr("ignoreContextItem.unignoreLine.accesskey"),
+ disabled: shouldDisable,
+ click: () => {
+ const selectionRange = {
+ start: {
+ line: startLine,
+ column: clickedLine == null ? from.ch : 0,
+ },
+ end: {
+ line: endLine,
+ column: clickedLine == null ? to.ch : 0,
+ },
+ };
+
+ dispatch(
+ toggleBlackBox(
+ selectedSource,
+ !selectedLineIsBlackBoxed,
+ selectedLineIsBlackBoxed ? [blackboxRange] : [selectionRange]
+ )
+ );
+ },
+ };
+};
+
+const blackBoxLinesMenuItem = (
+ selectedSource,
+ editor,
+ blackboxedRanges,
+ isSourceOnIgnoreList,
+ clickedLine = null,
+ dispatch
+) => {
+ const { codeMirror } = editor;
+ const from = codeMirror.getCursor("from");
+ const to = codeMirror.getCursor("to");
+
+ const startLine = toSourceLine(selectedSource.id, from.line);
+ const endLine = toSourceLine(selectedSource.id, to.line);
+
+ const blackboxRange = findBlackBoxRange(selectedSource, blackboxedRanges, {
+ start: startLine,
+ end: endLine,
+ });
+
+ const selectedLinesAreBlackBoxed = !!blackboxRange;
+
+ return {
+ id: "node-menu-blackbox-lines",
+ label: !selectedLinesAreBlackBoxed
+ ? L10N.getStr("ignoreContextItem.ignoreLines")
+ : L10N.getStr("ignoreContextItem.unignoreLines"),
+ accesskey: !selectedLinesAreBlackBoxed
+ ? L10N.getStr("ignoreContextItem.ignoreLines.accesskey")
+ : L10N.getStr("ignoreContextItem.unignoreLines.accesskey"),
+ disabled: isSourceOnIgnoreList,
+ click: () => {
+ const selectionRange = {
+ start: {
+ line: startLine,
+ column: from.ch,
+ },
+ end: {
+ line: endLine,
+ column: to.ch,
+ },
+ };
+
+ dispatch(
+ toggleBlackBox(
+ selectedSource,
+ !selectedLinesAreBlackBoxed,
+ selectedLinesAreBlackBoxed ? [blackboxRange] : [selectionRange]
+ )
+ );
+ },
+ };
+};
+
+const watchExpressionItem = (selectedSource, selectionText, dispatch) => ({
+ id: "node-menu-add-watch-expression",
+ label: L10N.getStr("expressions.label"),
+ accesskey: L10N.getStr("expressions.accesskey"),
+ click: () => dispatch(addExpression(selectionText)),
+});
+
+const evaluateInConsoleItem = (selectedSource, selectionText, dispatch) => ({
+ id: "node-menu-evaluate-in-console",
+ label: L10N.getStr("evaluateInConsole.label"),
+ click: () => dispatch(evaluateInConsole(selectionText)),
+});
+
+const downloadFileItem = (selectedSource, selectedContent) => ({
+ id: "node-menu-download-file",
+ label: L10N.getStr("downloadFile.label"),
+ accesskey: L10N.getStr("downloadFile.accesskey"),
+ click: () => downloadFile(selectedContent, getFilename(selectedSource)),
+});
+
+const inlinePreviewItem = dispatch => ({
+ id: "node-menu-inline-preview",
+ label: features.inlinePreview
+ ? L10N.getStr("inlinePreview.hide.label")
+ : L10N.getStr("inlinePreview.show.label"),
+ click: () => dispatch(toggleInlinePreview(!features.inlinePreview)),
+});
+
+const editorWrappingItem = (editorWrappingEnabled, dispatch) => ({
+ id: "node-menu-editor-wrapping",
+ label: editorWrappingEnabled
+ ? L10N.getStr("editorWrapping.hide.label")
+ : L10N.getStr("editorWrapping.show.label"),
+ click: () => dispatch(toggleEditorWrapping(!editorWrappingEnabled)),
+});
+
+function editorMenuItems({
+ blackboxedRanges,
+ location,
+ selectionText,
+ hasMappedLocation,
+ isTextSelected,
+ isPaused,
+ editorWrappingEnabled,
+ editor,
+ isSourceOnIgnoreList,
+ dispatch,
+}) {
+ const items = [];
+
+ const { source } = location;
+
+ const content =
+ source.content && isFulfilled(source.content) ? source.content.value : null;
+
+ items.push(
+ jumpToMappedLocationItem(location, hasMappedLocation, dispatch),
+ continueToHereItem(location, isPaused, dispatch),
+ { type: "separator" },
+ copyToClipboardItem(selectionText),
+ ...(!source.isWasm
+ ? [
+ ...(content ? [copySourceItem(content)] : []),
+ copySourceUri2Item(source),
+ ]
+ : []),
+ ...(content ? [downloadFileItem(source, content)] : []),
+ { type: "separator" },
+ showSourceMenuItem(source, dispatch),
+ { type: "separator" },
+ blackBoxMenuItem(source, blackboxedRanges, isSourceOnIgnoreList, dispatch)
+ );
+
+ const startLine = toSourceLine(
+ source.id,
+ editor.codeMirror.getCursor("from").line
+ );
+ const endLine = toSourceLine(
+ source.id,
+ editor.codeMirror.getCursor("to").line
+ );
+
+ // Find any blackbox ranges that exist for the selected lines
+ const blackboxRange = findBlackBoxRange(source, blackboxedRanges, {
+ start: startLine,
+ end: endLine,
+ });
+
+ const isMultiLineSelection = blackboxRange
+ ? blackboxRange.start.line !== blackboxRange.end.line
+ : startLine !== endLine;
+
+ // When the range is defined and is an empty array,
+ // the whole source is blackboxed
+ const theWholeSourceIsBlackBoxed =
+ blackboxedRanges[source.url] && !blackboxedRanges[source.url].length;
+
+ if (!theWholeSourceIsBlackBoxed) {
+ const blackBoxSourceLinesMenuItem = isMultiLineSelection
+ ? blackBoxLinesMenuItem
+ : blackBoxLineMenuItem;
+
+ items.push(
+ blackBoxSourceLinesMenuItem(
+ source,
+ editor,
+ blackboxedRanges,
+ isSourceOnIgnoreList,
+ null,
+ dispatch
+ )
+ );
+ }
+
+ if (isTextSelected) {
+ items.push(
+ { type: "separator" },
+ watchExpressionItem(source, selectionText, dispatch),
+ evaluateInConsoleItem(source, selectionText, dispatch)
+ );
+ }
+
+ items.push(
+ { type: "separator" },
+ inlinePreviewItem(dispatch),
+ editorWrappingItem(editorWrappingEnabled, dispatch)
+ );
+
+ return items;
+}
diff --git a/devtools/client/debugger/src/actions/context-menus/frame.js b/devtools/client/debugger/src/actions/context-menus/frame.js
new file mode 100644
index 0000000000..1d287b1028
--- /dev/null
+++ b/devtools/client/debugger/src/actions/context-menus/frame.js
@@ -0,0 +1,97 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { showMenu } from "../../context-menu/menu";
+import { copyToTheClipboard } from "../../utils/clipboard";
+import {
+ getShouldSelectOriginalLocation,
+ getCurrentThreadFrames,
+ getFrameworkGroupingState,
+} from "../../selectors/index";
+import { toggleFrameworkGrouping } from "../../actions/ui";
+import { restart, toggleBlackBox } from "../../actions/pause/index";
+import { formatCopyName } from "../../utils/pause/frames/index";
+
+function formatMenuElement(labelString, click, disabled = false) {
+ const label = L10N.getStr(labelString);
+ const accesskey = L10N.getStr(`${labelString}.accesskey`);
+ const id = `node-menu-${labelString}`;
+ return {
+ id,
+ label,
+ accesskey,
+ disabled,
+ click,
+ };
+}
+
+function isValidRestartFrame(frame, callbacks) {
+ // Any frame state than 'on-stack' is either dismissed by the server
+ // or can potentially cause unexpected errors.
+ // Global frame has frame.callee equal to null and can't be restarted.
+ return frame.type === "call" && frame.state === "on-stack";
+}
+
+function copyStackTrace() {
+ return async ({ dispatch, getState }) => {
+ const frames = getCurrentThreadFrames(getState());
+ const shouldDisplayOriginalLocation = getShouldSelectOriginalLocation(
+ getState()
+ );
+
+ const framesToCopy = frames
+ .map(frame => formatCopyName(frame, L10N, shouldDisplayOriginalLocation))
+ .join("\n");
+ copyToTheClipboard(framesToCopy);
+ };
+}
+
+export function showFrameContextMenu(event, frame, hideRestart = false) {
+ return async ({ dispatch, getState }) => {
+ const items = [];
+
+ // Hides 'Restart Frame' item for call stack groups context menu,
+ // otherwise can be misleading for the user which frame gets restarted.
+ if (!hideRestart && isValidRestartFrame(frame)) {
+ items.push(
+ formatMenuElement("restartFrame", () => dispatch(restart(frame)))
+ );
+ }
+
+ const toggleFrameWorkL10nLabel = getFrameworkGroupingState(getState())
+ ? "framework.disableGrouping"
+ : "framework.enableGrouping";
+ items.push(
+ formatMenuElement(toggleFrameWorkL10nLabel, () =>
+ dispatch(
+ toggleFrameworkGrouping(!getFrameworkGroupingState(getState()))
+ )
+ )
+ );
+
+ const { source } = frame;
+ if (frame.source) {
+ items.push(
+ formatMenuElement("copySourceUri2", () =>
+ copyToTheClipboard(source.url)
+ )
+ );
+
+ const toggleBlackBoxL10nLabel = source.isBlackBoxed
+ ? "ignoreContextItem.unignore"
+ : "ignoreContextItem.ignore";
+ items.push(
+ formatMenuElement(toggleBlackBoxL10nLabel, () =>
+ dispatch(toggleBlackBox(source))
+ )
+ );
+ }
+
+ items.push(
+ formatMenuElement("copyStackTrace", () => dispatch(copyStackTrace()))
+ );
+
+ showMenu(event, items);
+ };
+}
diff --git a/devtools/client/debugger/src/actions/context-menus/index.js b/devtools/client/debugger/src/actions/context-menus/index.js
new file mode 100644
index 0000000000..c988d94ccc
--- /dev/null
+++ b/devtools/client/debugger/src/actions/context-menus/index.js
@@ -0,0 +1,12 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+export * from "./breakpoint";
+export * from "./breakpoint-heading";
+export * from "./frame";
+export * from "./editor";
+export * from "./editor-breakpoint";
+export * from "./outline";
+export * from "./source-tree-item";
+export * from "./tab";
diff --git a/devtools/client/debugger/src/actions/context-menus/moz.build b/devtools/client/debugger/src/actions/context-menus/moz.build
new file mode 100644
index 0000000000..776cb436f9
--- /dev/null
+++ b/devtools/client/debugger/src/actions/context-menus/moz.build
@@ -0,0 +1,16 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+CompiledModules(
+ "breakpoint.js",
+ "breakpoint-heading.js",
+ "frame.js",
+ "editor.js",
+ "editor-breakpoint.js",
+ "index.js",
+ "outline.js",
+ "source-tree-item.js",
+ "tab.js",
+)
diff --git a/devtools/client/debugger/src/actions/context-menus/outline.js b/devtools/client/debugger/src/actions/context-menus/outline.js
new file mode 100644
index 0000000000..4ba0fe8f6f
--- /dev/null
+++ b/devtools/client/debugger/src/actions/context-menus/outline.js
@@ -0,0 +1,54 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { showMenu } from "../../context-menu/menu";
+import { copyToTheClipboard } from "../../utils/clipboard";
+import { findFunctionText } from "../../utils/function";
+
+import { flashLineRange } from "../../actions/ui";
+
+import {
+ getSelectedSource,
+ getSelectedSourceTextContent,
+} from "../../selectors/index";
+
+export function showOutlineContextMenu(event, func, symbols) {
+ return async ({ dispatch, getState }) => {
+ const state = getState();
+
+ const selectedSource = getSelectedSource(state);
+ if (!selectedSource) {
+ return;
+ }
+ const selectedSourceTextContent = getSelectedSourceTextContent(state);
+
+ const sourceLine = func.location.start.line;
+ const functionText = findFunctionText(
+ sourceLine,
+ selectedSource,
+ selectedSourceTextContent,
+ symbols
+ );
+
+ const copyFunctionItem = {
+ id: "node-menu-copy-function",
+ label: L10N.getStr("copyFunction.label"),
+ accesskey: L10N.getStr("copyFunction.accesskey"),
+ disabled: !functionText,
+ click: () => {
+ dispatch(
+ flashLineRange({
+ start: sourceLine,
+ end: func.location.end.line,
+ sourceId: selectedSource.id,
+ })
+ );
+ return copyToTheClipboard(functionText);
+ },
+ };
+
+ const items = [copyFunctionItem];
+ showMenu(event, items);
+ };
+}
diff --git a/devtools/client/debugger/src/actions/context-menus/source-tree-item.js b/devtools/client/debugger/src/actions/context-menus/source-tree-item.js
new file mode 100644
index 0000000000..1b7bc37dc3
--- /dev/null
+++ b/devtools/client/debugger/src/actions/context-menus/source-tree-item.js
@@ -0,0 +1,281 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { showMenu } from "../../context-menu/menu";
+
+import {
+ isSourceOverridden,
+ isSourceMapIgnoreListEnabled,
+ isSourceOnSourceMapIgnoreList,
+ getProjectDirectoryRoot,
+ getSourcesTreeSources,
+ getBlackBoxRanges,
+} from "../../selectors/index";
+
+import { setOverrideSource, removeOverrideSource } from "../sources/index";
+import { loadSourceText } from "../sources/loadSourceText";
+import { toggleBlackBox, blackBoxSources } from "../sources/blackbox";
+import {
+ setProjectDirectoryRoot,
+ clearProjectDirectoryRoot,
+} from "../sources-tree";
+
+import { shouldBlackbox } from "../../utils/source";
+import { copyToTheClipboard } from "../../utils/clipboard";
+import { saveAsLocalFile } from "../../utils/utils";
+
+/**
+ * Show the context menu of SourceTreeItem.
+ *
+ * @param {object} event
+ * The context-menu DOM event.
+ * @param {object} item
+ * Source Tree Item object.
+ */
+export function showSourceTreeItemContextMenu(
+ event,
+ item,
+ depth,
+ setExpanded,
+ itemName
+) {
+ return async ({ dispatch, getState }) => {
+ const copySourceUri2Label = L10N.getStr("copySourceUri2");
+ const copySourceUri2Key = L10N.getStr("copySourceUri2.accesskey");
+ const setDirectoryRootLabel = L10N.getStr("setDirectoryRoot.label");
+ const setDirectoryRootKey = L10N.getStr("setDirectoryRoot.accesskey");
+ const removeDirectoryRootLabel = L10N.getStr("removeDirectoryRoot.label");
+
+ const menuOptions = [];
+
+ const state = getState();
+ const isOverridden = isSourceOverridden(state, item.source);
+ const isSourceOnIgnoreList =
+ isSourceMapIgnoreListEnabled(state) &&
+ isSourceOnSourceMapIgnoreList(state, item.source);
+ const projectRoot = getProjectDirectoryRoot(state);
+
+ if (item.type == "source") {
+ const { source } = item;
+ const copySourceUri2 = {
+ id: "node-menu-copy-source",
+ label: copySourceUri2Label,
+ accesskey: copySourceUri2Key,
+ disabled: false,
+ click: () => copyToTheClipboard(source.url),
+ };
+
+ const ignoreStr = item.isBlackBoxed ? "unignore" : "ignore";
+ const blackBoxMenuItem = {
+ id: "node-menu-blackbox",
+ label: L10N.getStr(`ignoreContextItem.${ignoreStr}`),
+ accesskey: L10N.getStr(`ignoreContextItem.${ignoreStr}.accesskey`),
+ disabled: isSourceOnIgnoreList || !shouldBlackbox(source),
+ click: () => dispatch(toggleBlackBox(source)),
+ };
+ const downloadFileItem = {
+ id: "node-menu-download-file",
+ label: L10N.getStr("downloadFile.label"),
+ accesskey: L10N.getStr("downloadFile.accesskey"),
+ disabled: false,
+ click: () => saveLocalFile(dispatch, source),
+ };
+
+ const overrideStr = !isOverridden ? "override" : "removeOverride";
+ const overridesItem = {
+ id: "node-menu-overrides",
+ label: L10N.getStr(`overridesContextItem.${overrideStr}`),
+ accesskey: L10N.getStr(`overridesContextItem.${overrideStr}.accesskey`),
+ disabled: !!source.isHTML,
+ click: () => handleLocalOverride(dispatch, source, isOverridden),
+ };
+
+ menuOptions.push(
+ copySourceUri2,
+ blackBoxMenuItem,
+ downloadFileItem,
+ overridesItem
+ );
+ }
+
+ // All other types other than source are folder-like
+ if (item.type != "source") {
+ addCollapseExpandAllOptions(menuOptions, item, setExpanded);
+
+ if (projectRoot == item.uniquePath) {
+ menuOptions.push({
+ id: "node-remove-directory-root",
+ label: removeDirectoryRootLabel,
+ disabled: false,
+ click: () => dispatch(clearProjectDirectoryRoot()),
+ });
+ } else {
+ menuOptions.push({
+ id: "node-set-directory-root",
+ label: setDirectoryRootLabel,
+ accesskey: setDirectoryRootKey,
+ disabled: false,
+ click: () =>
+ dispatch(setProjectDirectoryRoot(item.uniquePath, itemName)),
+ });
+ }
+
+ addBlackboxAllOption(dispatch, state, menuOptions, item, depth);
+ }
+
+ showMenu(event, menuOptions);
+ };
+}
+
+async function saveLocalFile(dispatch, source) {
+ if (!source) {
+ return null;
+ }
+
+ const data = await dispatch(loadSourceText(source));
+ if (!data) {
+ return null;
+ }
+ return saveAsLocalFile(data.value, source.displayURL.filename);
+}
+
+async function handleLocalOverride(dispatch, source, isOverridden) {
+ if (!isOverridden) {
+ const localPath = await saveLocalFile(dispatch, source);
+ if (localPath) {
+ dispatch(setOverrideSource(source, localPath));
+ }
+ } else {
+ dispatch(removeOverrideSource(source));
+ }
+}
+
+function addBlackboxAllOption(dispatch, state, menuOptions, item, depth) {
+ const {
+ sourcesInside,
+ sourcesOutside,
+ allInsideBlackBoxed,
+ allOutsideBlackBoxed,
+ } = getBlackBoxSourcesGroups(state, item);
+ const projectRoot = getProjectDirectoryRoot(state);
+
+ let blackBoxInsideMenuItemLabel;
+ let blackBoxOutsideMenuItemLabel;
+ if (depth === 0 || (depth === 1 && projectRoot === "")) {
+ blackBoxInsideMenuItemLabel = allInsideBlackBoxed
+ ? L10N.getStr("unignoreAllInGroup.label")
+ : L10N.getStr("ignoreAllInGroup.label");
+ if (sourcesOutside.length) {
+ blackBoxOutsideMenuItemLabel = allOutsideBlackBoxed
+ ? L10N.getStr("unignoreAllOutsideGroup.label")
+ : L10N.getStr("ignoreAllOutsideGroup.label");
+ }
+ } else {
+ blackBoxInsideMenuItemLabel = allInsideBlackBoxed
+ ? L10N.getStr("unignoreAllInDir.label")
+ : L10N.getStr("ignoreAllInDir.label");
+ if (sourcesOutside.length) {
+ blackBoxOutsideMenuItemLabel = allOutsideBlackBoxed
+ ? L10N.getStr("unignoreAllOutsideDir.label")
+ : L10N.getStr("ignoreAllOutsideDir.label");
+ }
+ }
+
+ const blackBoxInsideMenuItem = {
+ id: allInsideBlackBoxed
+ ? "node-unblackbox-all-inside"
+ : "node-blackbox-all-inside",
+ label: blackBoxInsideMenuItemLabel,
+ disabled: false,
+ click: () => dispatch(blackBoxSources(sourcesInside, !allInsideBlackBoxed)),
+ };
+
+ if (sourcesOutside.length) {
+ menuOptions.push({
+ id: "node-blackbox-all",
+ label: L10N.getStr("ignoreAll.label"),
+ submenu: [
+ blackBoxInsideMenuItem,
+ {
+ id: allOutsideBlackBoxed
+ ? "node-unblackbox-all-outside"
+ : "node-blackbox-all-outside",
+ label: blackBoxOutsideMenuItemLabel,
+ disabled: false,
+ click: () =>
+ dispatch(blackBoxSources(sourcesOutside, !allOutsideBlackBoxed)),
+ },
+ ],
+ });
+ } else {
+ menuOptions.push(blackBoxInsideMenuItem);
+ }
+}
+
+function addCollapseExpandAllOptions(menuOptions, item, setExpanded) {
+ menuOptions.push({
+ id: "node-menu-collapse-all",
+ label: L10N.getStr("collapseAll.label"),
+ disabled: false,
+ click: () => setExpanded(item, false, true),
+ });
+
+ menuOptions.push({
+ id: "node-menu-expand-all",
+ label: L10N.getStr("expandAll.label"),
+ disabled: false,
+ click: () => setExpanded(item, true, true),
+ });
+}
+
+/**
+ * Computes 4 lists:
+ * - `sourcesInside`: the list of all Source Items that are
+ * children of the current item (can be thread/group/directory).
+ * This include any nested level of children.
+ * - `sourcesOutside`: all other Source Items.
+ * i.e. all sources that are in any other folder of any group/thread.
+ * - `allInsideBlackBoxed`, all sources of `sourcesInside` which are currently
+ * blackboxed.
+ * - `allOutsideBlackBoxed`, all sources of `sourcesOutside` which are currently
+ * blackboxed.
+ */
+function getBlackBoxSourcesGroups(state, item) {
+ const allSources = [];
+ function collectAllSources(list, _item) {
+ if (_item.children) {
+ _item.children.forEach(i => collectAllSources(list, i));
+ }
+ if (_item.type == "source") {
+ list.push(_item.source);
+ }
+ }
+
+ const rootItems = getSourcesTreeSources(state);
+ const blackBoxRanges = getBlackBoxRanges(state);
+
+ for (const rootItem of rootItems) {
+ collectAllSources(allSources, rootItem);
+ }
+
+ const sourcesInside = [];
+ collectAllSources(sourcesInside, item);
+
+ const sourcesOutside = allSources.filter(
+ source => !sourcesInside.includes(source)
+ );
+ const allInsideBlackBoxed = sourcesInside.every(
+ source => blackBoxRanges[source.url]
+ );
+ const allOutsideBlackBoxed = sourcesOutside.every(
+ source => blackBoxRanges[source.url]
+ );
+
+ return {
+ sourcesInside,
+ sourcesOutside,
+ allInsideBlackBoxed,
+ allOutsideBlackBoxed,
+ };
+}
diff --git a/devtools/client/debugger/src/actions/context-menus/tab.js b/devtools/client/debugger/src/actions/context-menus/tab.js
new file mode 100644
index 0000000000..193396a746
--- /dev/null
+++ b/devtools/client/debugger/src/actions/context-menus/tab.js
@@ -0,0 +1,128 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { showMenu, buildMenu } from "../../context-menu/menu";
+import { getTabMenuItems } from "../../utils/tabs";
+
+import {
+ getSelectedLocation,
+ getSourcesForTabs,
+ isSourceBlackBoxed,
+ isSourceMapIgnoreListEnabled,
+ isSourceOnSourceMapIgnoreList,
+} from "../../selectors/index";
+
+import { toggleBlackBox } from "../sources/blackbox";
+import { prettyPrintAndSelectSource } from "../sources/prettyPrint";
+import { copyToClipboard, showSource } from "../ui";
+import { closeTab, closeTabs } from "../tabs";
+
+import { getRawSourceURL, isPretty, shouldBlackbox } from "../../utils/source";
+import { copyToTheClipboard } from "../../utils/clipboard";
+
+/**
+ * Show the context menu of Tab.
+ *
+ * @param {object} event
+ * The context-menu DOM event.
+ * @param {object} source
+ * Source object of the related Tab.
+ */
+export function showTabContextMenu(event, source) {
+ return async ({ dispatch, getState }) => {
+ const state = getState();
+ const selectedLocation = getSelectedLocation(state);
+
+ const isBlackBoxed = isSourceBlackBoxed(state, source);
+ const isSourceOnIgnoreList =
+ isSourceMapIgnoreListEnabled(state) &&
+ isSourceOnSourceMapIgnoreList(state, source);
+ const tabsSources = getSourcesForTabs(state);
+
+ const otherTabsSources = tabsSources.filter(s => s !== source);
+ const tabIndex = tabsSources.findIndex(s => s === source);
+ const followingTabsSources = tabsSources.slice(tabIndex + 1);
+
+ const tabMenuItems = getTabMenuItems();
+ const items = [
+ {
+ item: {
+ ...tabMenuItems.closeTab,
+ click: () => dispatch(closeTab(source)),
+ },
+ },
+ {
+ item: {
+ ...tabMenuItems.closeOtherTabs,
+ disabled: otherTabsSources.length === 0,
+ click: () => dispatch(closeTabs(otherTabsSources)),
+ },
+ },
+ {
+ item: {
+ ...tabMenuItems.closeTabsToEnd,
+ disabled: followingTabsSources.length === 0,
+ click: () => {
+ dispatch(closeTabs(followingTabsSources));
+ },
+ },
+ },
+ {
+ item: {
+ ...tabMenuItems.closeAllTabs,
+ click: () => dispatch(closeTabs(tabsSources)),
+ },
+ },
+ { item: { type: "separator" } },
+ {
+ item: {
+ ...tabMenuItems.copySource,
+ // Only enable when this is the selected source as this requires the source to be loaded,
+ // which may not be the case if the tab wasn't ever selected.
+ //
+ // Note that when opening the debugger, you may have tabs opened from a previous session,
+ // but no selected location.
+ disabled: selectedLocation?.source.id !== source.id,
+ click: () => {
+ dispatch(copyToClipboard(selectedLocation));
+ },
+ },
+ },
+ {
+ item: {
+ ...tabMenuItems.copySourceUri2,
+ disabled: !source.url,
+ click: () => copyToTheClipboard(getRawSourceURL(source.url)),
+ },
+ },
+ {
+ item: {
+ ...tabMenuItems.showSource,
+ // Source Tree only shows sources with URL
+ disabled: !source.url,
+ click: () => dispatch(showSource(source.id)),
+ },
+ },
+ {
+ item: {
+ ...tabMenuItems.toggleBlackBox,
+ label: isBlackBoxed
+ ? L10N.getStr("ignoreContextItem.unignore")
+ : L10N.getStr("ignoreContextItem.ignore"),
+ disabled: isSourceOnIgnoreList || !shouldBlackbox(source),
+ click: () => dispatch(toggleBlackBox(source)),
+ },
+ },
+ {
+ item: {
+ ...tabMenuItems.prettyPrint,
+ disabled: isPretty(source),
+ click: () => dispatch(prettyPrintAndSelectSource(source)),
+ },
+ },
+ ];
+
+ showMenu(event, buildMenu(items));
+ };
+}
diff --git a/devtools/client/debugger/src/actions/event-listeners.js b/devtools/client/debugger/src/actions/event-listeners.js
new file mode 100644
index 0000000000..6eca5d7e9c
--- /dev/null
+++ b/devtools/client/debugger/src/actions/event-listeners.js
@@ -0,0 +1,77 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import {
+ getActiveEventListeners,
+ getEventListenerExpanded,
+ shouldLogEventBreakpoints,
+} from "../selectors/index";
+
+async function updateBreakpoints(dispatch, client, newEvents) {
+ await client.setEventListenerBreakpoints(newEvents);
+ dispatch({ type: "UPDATE_EVENT_LISTENERS", active: newEvents });
+}
+
+async function updateExpanded(dispatch, newExpanded) {
+ dispatch({
+ type: "UPDATE_EVENT_LISTENER_EXPANDED",
+ expanded: newExpanded,
+ });
+}
+
+export function addEventListenerBreakpoints(eventsToAdd) {
+ return async ({ dispatch, client, getState }) => {
+ const activeListenerBreakpoints = await getActiveEventListeners(getState());
+
+ const newEvents = [
+ ...new Set([...eventsToAdd, ...activeListenerBreakpoints]),
+ ];
+ await updateBreakpoints(dispatch, client, newEvents);
+ };
+}
+
+export function removeEventListenerBreakpoints(eventsToRemove) {
+ return async ({ dispatch, client, getState }) => {
+ const activeListenerBreakpoints = await getActiveEventListeners(getState());
+
+ const newEvents = activeListenerBreakpoints.filter(
+ event => !eventsToRemove.includes(event)
+ );
+
+ await updateBreakpoints(dispatch, client, newEvents);
+ };
+}
+
+export function toggleEventLogging() {
+ return async ({ dispatch, getState, client }) => {
+ const logEventBreakpoints = !shouldLogEventBreakpoints(getState());
+ await client.toggleEventLogging(logEventBreakpoints);
+ dispatch({ type: "TOGGLE_EVENT_LISTENERS", logEventBreakpoints });
+ };
+}
+
+export function addEventListenerExpanded(category) {
+ return async ({ dispatch, getState }) => {
+ const expanded = await getEventListenerExpanded(getState());
+ const newExpanded = [...new Set([...expanded, category])];
+ await updateExpanded(dispatch, newExpanded);
+ };
+}
+
+export function removeEventListenerExpanded(category) {
+ return async ({ dispatch, getState }) => {
+ const expanded = await getEventListenerExpanded(getState());
+
+ const newExpanded = expanded.filter(expand => expand != category);
+
+ updateExpanded(dispatch, newExpanded);
+ };
+}
+
+export function getEventListenerBreakpointTypes() {
+ return async ({ dispatch, client }) => {
+ const categories = await client.getEventListenerBreakpointTypes();
+ dispatch({ type: "RECEIVE_EVENT_LISTENER_TYPES", categories });
+ };
+}
diff --git a/devtools/client/debugger/src/actions/exceptions.js b/devtools/client/debugger/src/actions/exceptions.js
new file mode 100644
index 0000000000..f1746ec2bb
--- /dev/null
+++ b/devtools/client/debugger/src/actions/exceptions.js
@@ -0,0 +1,30 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+export function addExceptionFromResources(resources) {
+ return async function ({ dispatch }) {
+ for (const resource of resources) {
+ const { pageError } = resource;
+ if (!pageError.error) {
+ continue;
+ }
+ const { columnNumber, lineNumber, sourceId, errorMessage } = pageError;
+ const stacktrace = pageError.stacktrace || [];
+
+ const exception = {
+ columnNumber,
+ lineNumber,
+ sourceActorId: sourceId,
+ errorMessage,
+ stacktrace,
+ threadActorId: resource.targetFront.targetForm.threadActor,
+ };
+
+ dispatch({
+ type: "ADD_EXCEPTION",
+ exception,
+ });
+ }
+ };
+}
diff --git a/devtools/client/debugger/src/actions/expressions.js b/devtools/client/debugger/src/actions/expressions.js
new file mode 100644
index 0000000000..8ccb6013ba
--- /dev/null
+++ b/devtools/client/debugger/src/actions/expressions.js
@@ -0,0 +1,210 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import {
+ getExpression,
+ getExpressions,
+ getSelectedSource,
+ getSelectedScopeMappings,
+ getSelectedFrameBindings,
+ getIsPaused,
+ getSelectedFrame,
+ getCurrentThread,
+ isMapScopesEnabled,
+} from "../selectors/index";
+import { PROMISE } from "./utils/middleware/promise";
+import { wrapExpression } from "../utils/expressions";
+import { features } from "../utils/prefs";
+
+/**
+ * Add expression for debugger to watch
+ *
+ * @param {string} input
+ */
+export function addExpression(input) {
+ return async ({ dispatch, getState, parserWorker }) => {
+ if (!input) {
+ return null;
+ }
+
+ // If the expression already exists, only update its evaluation
+ let expression = getExpression(getState(), input);
+ if (!expression) {
+ // This will only display the expression input,
+ // evaluateExpression will update its value.
+ dispatch({ type: "ADD_EXPRESSION", input });
+
+ expression = getExpression(getState(), input);
+ // When there is an expression error, we won't store the expression
+ if (!expression) {
+ return null;
+ }
+ }
+
+ return dispatch(evaluateExpression(expression));
+ };
+}
+
+export function autocomplete(input, cursor) {
+ return async ({ dispatch, getState, client }) => {
+ if (!input) {
+ return;
+ }
+ const thread = getCurrentThread(getState());
+ const selectedFrame = getSelectedFrame(getState(), thread);
+ const result = await client.autocomplete(input, cursor, selectedFrame?.id);
+ // Pass both selectedFrame and thread in case selectedFrame is null
+ dispatch({ type: "AUTOCOMPLETE", selectedFrame, thread, input, result });
+ };
+}
+
+export function clearAutocomplete() {
+ return { type: "CLEAR_AUTOCOMPLETE" };
+}
+
+export function updateExpression(input, expression) {
+ return async ({ getState, dispatch, parserWorker }) => {
+ if (!input) {
+ return;
+ }
+
+ dispatch({
+ type: "UPDATE_EXPRESSION",
+ expression,
+ input,
+ });
+
+ await dispatch(evaluateExpressionsForCurrentContext());
+ };
+}
+
+/**
+ *
+ * @param {object} expression
+ * @param {string} expression.input
+ */
+export function deleteExpression(expression) {
+ return {
+ type: "DELETE_EXPRESSION",
+ input: expression.input,
+ };
+}
+
+export function evaluateExpressionsForCurrentContext() {
+ return async ({ getState, dispatch }) => {
+ const thread = getCurrentThread(getState());
+ const selectedFrame = getSelectedFrame(getState(), thread);
+ await dispatch(evaluateExpressions(selectedFrame));
+ };
+}
+
+/**
+ * Update all the expressions by querying the server for updated values.
+ *
+ * @param {object} selectedFrame
+ * If defined, will evaluate the expression against this given frame,
+ * otherwise it will use the global scope of the thread.
+ */
+export function evaluateExpressions(selectedFrame) {
+ return async function ({ dispatch, getState, client }) {
+ const expressions = getExpressions(getState());
+ const inputs = expressions.map(({ input }) => input);
+ // Fallback to global scope of the current thread when selectedFrame is null
+ const thread = selectedFrame?.thread || getCurrentThread(getState());
+ const results = await client.evaluateExpressions(inputs, {
+ // We will only have a specific frame when passing a Selected frame context.
+ frameId: selectedFrame?.id,
+ threadId: thread,
+ });
+ // Pass both selectedFrame and thread in case selectedFrame is null
+ dispatch({
+ type: "EVALUATE_EXPRESSIONS",
+
+ selectedFrame,
+ // As `selectedFrame` can be null, pass `thread` to help
+ // the reducer know what is the related thread of this action.
+ thread,
+
+ inputs,
+ results,
+ });
+ };
+}
+
+function evaluateExpression(expression) {
+ return async function (thunkArgs) {
+ let { input } = expression;
+ if (!input) {
+ console.warn("Expressions should not be empty");
+ return null;
+ }
+
+ const { dispatch, getState, client } = thunkArgs;
+ const thread = getCurrentThread(getState());
+ const selectedFrame = getSelectedFrame(getState(), thread);
+
+ const selectedSource = getSelectedSource(getState());
+ // Only map when we are paused and if the currently selected source is original,
+ // and the paused location is also original.
+ if (
+ selectedFrame &&
+ selectedSource &&
+ selectedFrame.location.source.isOriginal &&
+ selectedSource.isOriginal
+ ) {
+ const mapResult = await getMappedExpression(
+ input,
+ selectedFrame.thread,
+ thunkArgs
+ );
+ if (mapResult) {
+ input = mapResult.expression;
+ }
+ }
+
+ // Pass both selectedFrame and thread in case selectedFrame is null
+ return dispatch({
+ type: "EVALUATE_EXPRESSION",
+ selectedFrame,
+ // When we aren't passing a frame, we have to pass a thread to the pause reducer
+ thread: selectedFrame ? null : thread,
+ input: expression.input,
+ [PROMISE]: client.evaluate(wrapExpression(input), {
+ // When evaluating against the global scope (when not paused)
+ // frameId will be null here.
+ frameId: selectedFrame?.id,
+ }),
+ });
+ };
+}
+
+/**
+ * Gets information about original variable names from the source map
+ * and replaces all possible generated names.
+ */
+export function getMappedExpression(expression, thread, thunkArgs) {
+ const { getState, parserWorker } = thunkArgs;
+ const mappings = getSelectedScopeMappings(getState(), thread);
+ const bindings = getSelectedFrameBindings(getState(), thread);
+
+ // We bail early if we do not need to map the expression. This is important
+ // because mapping an expression can be slow if the parserWorker
+ // worker is busy doing other work.
+ //
+ // 1. there are no mappings - we do not need to map original expressions
+ // 2. does not contain `await` - we do not need to map top level awaits
+ // 3. does not contain `=` - we do not need to map assignments
+ const shouldMapScopes = isMapScopesEnabled(getState()) && mappings;
+ if (!shouldMapScopes && !expression.match(/(await|=)/)) {
+ return null;
+ }
+
+ return parserWorker.mapExpression(
+ expression,
+ mappings,
+ bindings || [],
+ features.mapExpressionBindings && getIsPaused(getState(), thread),
+ features.mapAwaitExpression
+ );
+}
diff --git a/devtools/client/debugger/src/actions/file-search.js b/devtools/client/debugger/src/actions/file-search.js
new file mode 100644
index 0000000000..cc5794d7ab
--- /dev/null
+++ b/devtools/client/debugger/src/actions/file-search.js
@@ -0,0 +1,51 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { searchSourceForHighlight } from "../utils/editor/index";
+
+import {
+ getSelectedSourceTextContent,
+ getSearchOptions,
+} from "../selectors/index";
+
+import { closeActiveSearch, clearHighlightLineRange } from "./ui";
+
+export function doSearchForHighlight(query, editor, line, ch) {
+ return async ({ getState, dispatch }) => {
+ const sourceTextContent = getSelectedSourceTextContent(getState());
+ if (!sourceTextContent) {
+ return;
+ }
+
+ dispatch(searchContentsForHighlight(query, editor, line, ch));
+ };
+}
+
+// Expose an action to the React component, so that it can call the searchWorker.
+export function querySearchWorker(query, text, modifiers) {
+ return ({ searchWorker }) => {
+ return searchWorker.getMatches(query, text, modifiers);
+ };
+}
+
+export function searchContentsForHighlight(query, editor, line, ch) {
+ return async ({ getState, dispatch }) => {
+ const modifiers = getSearchOptions(getState(), "file-search");
+ const sourceTextContent = getSelectedSourceTextContent(getState());
+
+ if (!query || !editor || !sourceTextContent || !modifiers) {
+ return;
+ }
+
+ const ctx = { ed: editor, cm: editor.codeMirror };
+ searchSourceForHighlight(ctx, false, query, true, modifiers, line, ch);
+ };
+}
+
+export function closeFileSearch() {
+ return ({ dispatch }) => {
+ dispatch(closeActiveSearch());
+ dispatch(clearHighlightLineRange());
+ };
+}
diff --git a/devtools/client/debugger/src/actions/index.js b/devtools/client/debugger/src/actions/index.js
new file mode 100644
index 0000000000..cc568f9681
--- /dev/null
+++ b/devtools/client/debugger/src/actions/index.js
@@ -0,0 +1,50 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import * as ast from "./ast/index";
+import * as breakpoints from "./breakpoints/index";
+import * as exceptions from "./exceptions";
+import * as expressions from "./expressions";
+import * as eventListeners from "./event-listeners";
+import * as pause from "./pause/index";
+import * as navigation from "./navigation";
+import * as ui from "./ui";
+import * as fileSearch from "./file-search";
+import * as projectTextSearch from "./project-text-search";
+import * as quickOpen from "./quick-open";
+import * as sourcesTree from "./sources-tree";
+import * as sources from "./sources/index";
+import * as sourcesActors from "./source-actors";
+import * as tabs from "./tabs";
+import * as threads from "./threads";
+import * as toolbox from "./toolbox";
+import * as preview from "./preview";
+import * as tracing from "./tracing";
+import * as contextMenu from "./context-menus/index";
+
+import { objectInspector } from "devtools/client/shared/components/reps/index";
+
+export default {
+ ...ast,
+ ...navigation,
+ ...breakpoints,
+ ...exceptions,
+ ...expressions,
+ ...eventListeners,
+ ...sources,
+ ...sourcesActors,
+ ...tabs,
+ ...pause,
+ ...ui,
+ ...fileSearch,
+ ...objectInspector.actions,
+ ...projectTextSearch,
+ ...quickOpen,
+ ...sourcesTree,
+ ...threads,
+ ...toolbox,
+ ...preview,
+ ...tracing,
+ ...contextMenu,
+};
diff --git a/devtools/client/debugger/src/actions/moz.build b/devtools/client/debugger/src/actions/moz.build
new file mode 100644
index 0000000000..72b1fac04c
--- /dev/null
+++ b/devtools/client/debugger/src/actions/moz.build
@@ -0,0 +1,32 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DIRS += [
+ "ast",
+ "breakpoints",
+ "context-menus",
+ "pause",
+ "sources",
+ "utils",
+]
+
+CompiledModules(
+ "event-listeners.js",
+ "exceptions.js",
+ "expressions.js",
+ "file-search.js",
+ "index.js",
+ "navigation.js",
+ "preview.js",
+ "project-text-search.js",
+ "quick-open.js",
+ "source-actors.js",
+ "sources-tree.js",
+ "tabs.js",
+ "toolbox.js",
+ "tracing.js",
+ "threads.js",
+ "ui.js",
+)
diff --git a/devtools/client/debugger/src/actions/navigation.js b/devtools/client/debugger/src/actions/navigation.js
new file mode 100644
index 0000000000..1b437837c2
--- /dev/null
+++ b/devtools/client/debugger/src/actions/navigation.js
@@ -0,0 +1,57 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import sourceQueue from "../utils/source-queue";
+
+import { clearWasmStates } from "../utils/wasm";
+import { getMainThread } from "../selectors/index";
+import { evaluateExpressionsForCurrentContext } from "../actions/expressions";
+
+/**
+ * Redux actions for the navigation state
+ * @module actions/navigation
+ */
+
+/**
+ * @memberof actions/navigation
+ * @static
+ */
+export function willNavigate(event) {
+ return async function ({
+ dispatch,
+ getState,
+ client,
+ sourceMapLoader,
+ parserWorker,
+ }) {
+ sourceQueue.clear();
+ sourceMapLoader.clearSourceMaps();
+ clearWasmStates();
+ const thread = getMainThread(getState());
+
+ dispatch({
+ type: "NAVIGATE",
+ mainThread: { ...thread, url: event.url },
+ });
+ };
+}
+
+/**
+ * @memberof actions/navigation
+ * @static
+ */
+export function navigated() {
+ return async function ({ getState, dispatch, panel }) {
+ try {
+ // Update the watched expressions once the page is fully loaded
+ await dispatch(evaluateExpressionsForCurrentContext());
+ } catch (e) {
+ // This may throw if we resume during the page load.
+ // browser_dbg-debugger-buttons.js highlights this, especially on MacOS or when ran many times
+ console.error("Failed to update expression on navigation", e);
+ }
+
+ panel.emit("reloaded");
+ };
+}
diff --git a/devtools/client/debugger/src/actions/pause/breakOnNext.js b/devtools/client/debugger/src/actions/pause/breakOnNext.js
new file mode 100644
index 0000000000..13f9f5f79c
--- /dev/null
+++ b/devtools/client/debugger/src/actions/pause/breakOnNext.js
@@ -0,0 +1,20 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { getCurrentThread } from "../../selectors/index";
+/**
+ * Debugger breakOnNext command.
+ * It's different from the comand action because we also want to
+ * highlight the pause icon.
+ *
+ * @memberof actions/pause
+ * @static
+ */
+export function breakOnNext() {
+ return async ({ dispatch, getState, client }) => {
+ const thread = getCurrentThread(getState());
+ await client.breakOnNext(thread);
+ return dispatch({ type: "BREAK_ON_NEXT", thread });
+ };
+}
diff --git a/devtools/client/debugger/src/actions/pause/commands.js b/devtools/client/debugger/src/actions/pause/commands.js
new file mode 100644
index 0000000000..0bb371bf6e
--- /dev/null
+++ b/devtools/client/debugger/src/actions/pause/commands.js
@@ -0,0 +1,147 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import {
+ getSelectedFrame,
+ getCurrentThread,
+ getIsCurrentThreadPaused,
+ getIsPaused,
+} from "../../selectors/index";
+import { PROMISE } from "../utils/middleware/promise";
+import { evaluateExpressions } from "../expressions";
+import { selectLocation } from "../sources/index";
+import { fetchScopes } from "./fetchScopes";
+import { fetchFrames } from "./fetchFrames";
+import { recordEvent } from "../../utils/telemetry";
+import { validateFrame } from "../../utils/context";
+
+export function selectThread(thread) {
+ return async ({ dispatch, getState, client }) => {
+ if (getCurrentThread(getState()) === thread) {
+ return;
+ }
+ dispatch({ type: "SELECT_THREAD", thread });
+
+ const selectedFrame = getSelectedFrame(getState(), thread);
+
+ const serverRequests = [];
+ // Update the watched expressions as we may never have evaluated them against this thread
+ // Note that selectedFrame may be null if the thread isn't paused.
+ serverRequests.push(dispatch(evaluateExpressions(selectedFrame)));
+
+ // If we were paused on the newly selected thread, ensure:
+ // - select the source where we are paused,
+ // - fetching the paused stackframes,
+ // - fetching the paused scope, so that variable preview are working on the selected source.
+ // (frames and scopes is supposed to be fetched on pause,
+ // but if two threads pause concurrently, it might be cancelled)
+ if (selectedFrame) {
+ serverRequests.push(dispatch(selectLocation(selectedFrame.location)));
+ serverRequests.push(dispatch(fetchFrames(thread)));
+
+ serverRequests.push(dispatch(fetchScopes(selectedFrame)));
+ }
+
+ await Promise.all(serverRequests);
+ };
+}
+
+/**
+ * Debugger commands like stepOver, stepIn, stepOut, resume
+ *
+ * @param string type
+ */
+export function command(type) {
+ return async ({ dispatch, getState, client }) => {
+ if (!type) {
+ return null;
+ }
+ // For now, all commands are by default against the currently selected thread
+ const thread = getCurrentThread(getState());
+
+ const frame = getSelectedFrame(getState(), thread);
+
+ return dispatch({
+ type: "COMMAND",
+ command: type,
+ thread,
+ [PROMISE]: client[type](thread, frame?.id),
+ });
+ };
+}
+
+/**
+ * StepIn
+ *
+ * @returns {Function} {@link command}
+ */
+export function stepIn() {
+ return ({ dispatch, getState }) => {
+ if (!getIsCurrentThreadPaused(getState())) {
+ return null;
+ }
+ return dispatch(command("stepIn"));
+ };
+}
+
+/**
+ * stepOver
+ *
+ * @returns {Function} {@link command}
+ */
+export function stepOver() {
+ return ({ dispatch, getState }) => {
+ if (!getIsCurrentThreadPaused(getState())) {
+ return null;
+ }
+ return dispatch(command("stepOver"));
+ };
+}
+
+/**
+ * stepOut
+ *
+ * @returns {Function} {@link command}
+ */
+export function stepOut() {
+ return ({ dispatch, getState }) => {
+ if (!getIsCurrentThreadPaused(getState())) {
+ return null;
+ }
+ return dispatch(command("stepOut"));
+ };
+}
+
+/**
+ * resume
+ *
+ * @returns {Function} {@link command}
+ */
+export function resume() {
+ return ({ dispatch, getState }) => {
+ if (!getIsCurrentThreadPaused(getState())) {
+ return null;
+ }
+ recordEvent("continue");
+ return dispatch(command("resume"));
+ };
+}
+
+/**
+ * restart frame
+ */
+export function restart(frame) {
+ return async ({ dispatch, getState, client }) => {
+ if (!getIsPaused(getState(), frame.thread)) {
+ return null;
+ }
+ validateFrame(getState(), frame);
+ return dispatch({
+ type: "COMMAND",
+ command: "restart",
+ thread: frame.thread,
+ [PROMISE]: client.restart(frame.thread, frame.id),
+ });
+ };
+}
diff --git a/devtools/client/debugger/src/actions/pause/continueToHere.js b/devtools/client/debugger/src/actions/pause/continueToHere.js
new file mode 100644
index 0000000000..046ad4d69a
--- /dev/null
+++ b/devtools/client/debugger/src/actions/pause/continueToHere.js
@@ -0,0 +1,63 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import {
+ getSelectedSource,
+ getSelectedFrame,
+ getClosestBreakpointPosition,
+ getBreakpoint,
+ getCurrentThread,
+} from "../../selectors/index";
+import { createLocation } from "../../utils/location";
+import { addHiddenBreakpoint } from "../breakpoints/index";
+import { setBreakpointPositions } from "../breakpoints/breakpointPositions";
+
+import { resume } from "./commands";
+
+export function continueToHere(location) {
+ return async function ({ dispatch, getState }) {
+ const { line, column } = location;
+ const thread = getCurrentThread(getState());
+ const selectedSource = getSelectedSource(getState());
+ const selectedFrame = getSelectedFrame(getState(), thread);
+
+ if (!selectedFrame || !selectedSource) {
+ return;
+ }
+
+ const debugLine = selectedFrame.location.line;
+ // If the user selects a line to continue to,
+ // it must be different than the currently paused line.
+ if (!column && debugLine == line) {
+ return;
+ }
+
+ await dispatch(setBreakpointPositions(location));
+ const position = getClosestBreakpointPosition(getState(), location);
+
+ // If the user selects a location in the editor,
+ // there must be a place we can pause on that line.
+ if (column && !position) {
+ return;
+ }
+
+ const pauseLocation = column && position ? position.location : location;
+
+ // Set a hidden breakpoint if we do not already have a breakpoint
+ // at the closest position
+ if (!getBreakpoint(getState(), pauseLocation)) {
+ await dispatch(
+ addHiddenBreakpoint(
+ createLocation({
+ source: selectedSource,
+ line: pauseLocation.line,
+ column: pauseLocation.column,
+ })
+ )
+ );
+ }
+
+ dispatch(resume());
+ };
+}
diff --git a/devtools/client/debugger/src/actions/pause/expandScopes.js b/devtools/client/debugger/src/actions/pause/expandScopes.js
new file mode 100644
index 0000000000..af95f16fea
--- /dev/null
+++ b/devtools/client/debugger/src/actions/pause/expandScopes.js
@@ -0,0 +1,16 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { getScopeItemPath } from "../../utils/pause/scopes";
+
+export function setExpandedScope(selectedFrame, item, expanded) {
+ return function ({ dispatch, getState }) {
+ return dispatch({
+ type: "SET_EXPANDED_SCOPE",
+ selectedFrame,
+ path: getScopeItemPath(item),
+ expanded,
+ });
+ };
+}
diff --git a/devtools/client/debugger/src/actions/pause/fetchFrames.js b/devtools/client/debugger/src/actions/pause/fetchFrames.js
new file mode 100644
index 0000000000..8db22a852e
--- /dev/null
+++ b/devtools/client/debugger/src/actions/pause/fetchFrames.js
@@ -0,0 +1,22 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { getIsPaused } from "../../selectors/index";
+
+export function fetchFrames(thread) {
+ return async function ({ dispatch, client, getState }) {
+ let frames;
+ try {
+ frames = await client.getFrames(thread);
+ } catch (e) {
+ // getFrames will fail if the thread has resumed. In this case the thread
+ // should no longer be valid and the frames we would have fetched would be
+ // discarded anyways.
+ if (getIsPaused(getState(), thread)) {
+ throw e;
+ }
+ }
+ dispatch({ type: "FETCHED_FRAMES", thread, frames });
+ };
+}
diff --git a/devtools/client/debugger/src/actions/pause/fetchScopes.js b/devtools/client/debugger/src/actions/pause/fetchScopes.js
new file mode 100644
index 0000000000..1de472d1ed
--- /dev/null
+++ b/devtools/client/debugger/src/actions/pause/fetchScopes.js
@@ -0,0 +1,37 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import {
+ getGeneratedFrameScope,
+ getOriginalFrameScope,
+} from "../../selectors/index";
+import { mapScopes } from "./mapScopes";
+import { generateInlinePreview } from "./inlinePreview";
+import { PROMISE } from "../utils/middleware/promise";
+
+export function fetchScopes(selectedFrame) {
+ return async function ({ dispatch, getState, client }) {
+ // See if we already fetched the scopes.
+ // We may have pause on multiple thread and re-select a paused thread
+ // for which we already fetched the scopes.
+ // Ignore pending scopes as the previous action may have been cancelled
+ // by context assertions.
+ let scopes = getGeneratedFrameScope(getState(), selectedFrame);
+ if (!scopes?.scope) {
+ scopes = dispatch({
+ type: "ADD_SCOPES",
+ selectedFrame,
+ [PROMISE]: client.getFrameScopes(selectedFrame),
+ });
+
+ scopes.then(() => {
+ dispatch(generateInlinePreview(selectedFrame));
+ });
+ }
+
+ if (!getOriginalFrameScope(getState(), selectedFrame)) {
+ await dispatch(mapScopes(selectedFrame, scopes));
+ }
+ };
+}
diff --git a/devtools/client/debugger/src/actions/pause/index.js b/devtools/client/debugger/src/actions/pause/index.js
new file mode 100644
index 0000000000..6ead921921
--- /dev/null
+++ b/devtools/client/debugger/src/actions/pause/index.js
@@ -0,0 +1,32 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Redux actions for the pause state
+ * @module actions/pause
+ */
+
+export {
+ selectThread,
+ stepIn,
+ stepOver,
+ stepOut,
+ resume,
+ restart,
+} from "./commands";
+export { fetchFrames } from "./fetchFrames";
+export { fetchScopes } from "./fetchScopes";
+export { paused } from "./paused";
+export { resumed } from "./resumed";
+export { continueToHere } from "./continueToHere";
+export { breakOnNext } from "./breakOnNext";
+export { resetBreakpointsPaneState } from "./resetBreakpointsPaneState";
+export { mapFrames } from "./mapFrames";
+export { pauseOnDebuggerStatement } from "./pauseOnDebuggerStatement";
+export { pauseOnExceptions } from "./pauseOnExceptions";
+export { selectFrame } from "./selectFrame";
+export { toggleSkipPausing, setSkipPausing } from "./skipPausing";
+export { toggleMapScopes } from "./mapScopes";
+export { setExpandedScope } from "./expandScopes";
+export { generateInlinePreview } from "./inlinePreview";
diff --git a/devtools/client/debugger/src/actions/pause/inlinePreview.js b/devtools/client/debugger/src/actions/pause/inlinePreview.js
new file mode 100644
index 0000000000..4f32ff6292
--- /dev/null
+++ b/devtools/client/debugger/src/actions/pause/inlinePreview.js
@@ -0,0 +1,239 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import {
+ getOriginalFrameScope,
+ getGeneratedFrameScope,
+ getInlinePreviews,
+ getSelectedLocation,
+} from "../../selectors/index";
+import { features } from "../../utils/prefs";
+import { validateSelectedFrame } from "../../utils/context";
+
+// We need to display all variables in the current functional scope so
+// include all data for block scopes until the first functional scope
+function getLocalScopeLevels(originalAstScopes) {
+ let levels = 0;
+ while (
+ originalAstScopes[levels] &&
+ originalAstScopes[levels].type === "block"
+ ) {
+ levels++;
+ }
+ return levels;
+}
+
+export function generateInlinePreview(selectedFrame) {
+ return async function ({ dispatch, getState, parserWorker, client }) {
+ if (!features.inlinePreview) {
+ return null;
+ }
+
+ // Avoid regenerating inline previews when we already have preview data
+ if (getInlinePreviews(getState(), selectedFrame.thread, selectedFrame.id)) {
+ return null;
+ }
+
+ const originalFrameScopes = getOriginalFrameScope(
+ getState(),
+ selectedFrame
+ );
+
+ const generatedFrameScopes = getGeneratedFrameScope(
+ getState(),
+ selectedFrame
+ );
+
+ let scopes = originalFrameScopes?.scope || generatedFrameScopes?.scope;
+
+ if (!scopes || !scopes.bindings) {
+ return null;
+ }
+
+ // It's important to use selectedLocation, because we don't know
+ // if we'll be viewing the original or generated frame location
+ const selectedLocation = getSelectedLocation(getState());
+ if (!selectedLocation) {
+ return null;
+ }
+
+ if (!parserWorker.isLocationSupported(selectedLocation)) {
+ return null;
+ }
+
+ const originalAstScopes = await parserWorker.getScopes(selectedLocation);
+ validateSelectedFrame(getState(), selectedFrame);
+
+ if (!originalAstScopes) {
+ return null;
+ }
+
+ const allPreviews = [];
+ const pausedOnLine = selectedLocation.line;
+ const levels = getLocalScopeLevels(originalAstScopes);
+
+ for (
+ let curLevel = 0;
+ curLevel <= levels && scopes && scopes.bindings;
+ curLevel++
+ ) {
+ const bindings = { ...scopes.bindings.variables };
+ scopes.bindings.arguments.forEach(argument => {
+ Object.keys(argument).forEach(key => {
+ bindings[key] = argument[key];
+ });
+ });
+
+ const previewBindings = Object.keys(bindings).map(async name => {
+ // We want to show values of properties of objects only and not
+ // function calls on other data types like someArr.forEach etc..
+ let properties = null;
+ const objectGrip = bindings[name].value;
+ if (objectGrip.actor && objectGrip.class === "Object") {
+ properties = await client.loadObjectProperties(
+ {
+ name,
+ path: name,
+ contents: { value: objectGrip },
+ },
+ selectedFrame.thread
+ );
+ }
+
+ const previewsFromBindings = getBindingValues(
+ originalAstScopes,
+ pausedOnLine,
+ name,
+ bindings[name].value,
+ curLevel,
+ properties
+ );
+
+ allPreviews.push(...previewsFromBindings);
+ });
+ await Promise.all(previewBindings);
+
+ scopes = scopes.parent;
+ }
+
+ // Sort previews by line and column so they're displayed in the right order in the editor
+ allPreviews.sort((previewA, previewB) => {
+ if (previewA.line < previewB.line) {
+ return -1;
+ }
+ if (previewA.line > previewB.line) {
+ return 1;
+ }
+ // If we have the same line number
+ return previewA.column < previewB.column ? -1 : 1;
+ });
+
+ const previews = {};
+ for (const preview of allPreviews) {
+ const { line } = preview;
+ if (!previews[line]) {
+ previews[line] = [];
+ }
+ previews[line].push(preview);
+ }
+
+ return dispatch({
+ type: "ADD_INLINE_PREVIEW",
+ selectedFrame,
+ previews,
+ });
+ };
+}
+
+function getBindingValues(
+ originalAstScopes,
+ pausedOnLine,
+ name,
+ value,
+ curLevel,
+ properties
+) {
+ const previews = [];
+
+ const binding = originalAstScopes[curLevel]?.bindings[name];
+ if (!binding) {
+ return previews;
+ }
+
+ // Show a variable only once ( an object and it's child property are
+ // counted as different )
+ const identifiers = new Set();
+
+ // We start from end as we want to show values besides variable
+ // located nearest to the breakpoint
+ for (let i = binding.refs.length - 1; i >= 0; i--) {
+ const ref = binding.refs[i];
+ // Subtracting 1 from line as codemirror lines are 0 indexed
+ const line = ref.start.line - 1;
+ const column = ref.start.column;
+ // We don't want to render inline preview below the paused line
+ if (line >= pausedOnLine - 1) {
+ continue;
+ }
+
+ const { displayName, displayValue } = getExpressionNameAndValue(
+ name,
+ value,
+ ref,
+ properties
+ );
+
+ // Variable with same name exists, display value of current or
+ // closest to the current scope's variable
+ if (identifiers.has(displayName)) {
+ continue;
+ }
+ identifiers.add(displayName);
+
+ previews.push({
+ line,
+ column,
+ name: displayName,
+ value: displayValue,
+ });
+ }
+ return previews;
+}
+
+function getExpressionNameAndValue(
+ name,
+ value,
+ // TODO: Add data type to ref
+ ref,
+ properties
+) {
+ let displayName = name;
+ let displayValue = value;
+
+ // Only variables of type Object will have properties
+ if (properties) {
+ let { meta } = ref;
+ // Presence of meta property means expression contains child property
+ // reference eg: objName.propName
+ while (meta) {
+ // Initially properties will be an array, after that it will be an object
+ if (displayValue === value) {
+ const property = properties.find(prop => prop.name === meta.property);
+ displayValue = property?.contents.value;
+ displayName += `.${meta.property}`;
+ } else if (displayValue?.preview?.ownProperties) {
+ const { ownProperties } = displayValue.preview;
+ Object.keys(ownProperties).forEach(prop => {
+ if (prop === meta.property) {
+ displayValue = ownProperties[prop].value;
+ displayName += `.${meta.property}`;
+ }
+ });
+ }
+ meta = meta.parent;
+ }
+ }
+
+ return { displayName, displayValue };
+}
diff --git a/devtools/client/debugger/src/actions/pause/mapFrames.js b/devtools/client/debugger/src/actions/pause/mapFrames.js
new file mode 100644
index 0000000000..9ce7052db1
--- /dev/null
+++ b/devtools/client/debugger/src/actions/pause/mapFrames.js
@@ -0,0 +1,161 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import {
+ getFrames,
+ getBlackBoxRanges,
+ getSelectedFrame,
+} from "../../selectors/index";
+
+import { isFrameBlackBoxed } from "../../utils/source";
+
+import assert from "../../utils/assert";
+import { getOriginalLocation } from "../../utils/source-maps";
+import {
+ debuggerToSourceMapLocation,
+ sourceMapToDebuggerLocation,
+} from "../../utils/location";
+import { annotateFramesWithLibrary } from "../../utils/pause/frames/annotateFrames";
+import { createWasmOriginalFrame } from "../../client/firefox/create";
+
+import { getOriginalFunctionDisplayName } from "../sources/index";
+
+function getSelectedFrameId(state, thread, frames) {
+ let selectedFrame = getSelectedFrame(state, thread);
+ const blackboxedRanges = getBlackBoxRanges(state);
+
+ if (selectedFrame && !isFrameBlackBoxed(selectedFrame, blackboxedRanges)) {
+ return selectedFrame.id;
+ }
+
+ selectedFrame = frames.find(frame => {
+ return !isFrameBlackBoxed(frame, blackboxedRanges);
+ });
+ return selectedFrame?.id;
+}
+
+async function updateFrameLocationAndDisplayName(frame, thunkArgs) {
+ // Ignore WASM original sources
+ if (frame.isOriginal) {
+ return frame;
+ }
+
+ const location = await getOriginalLocation(frame.location, thunkArgs, {
+ waitForSource: true,
+ });
+ // Avoid instantiating new frame objects if the frame location isn't mapped
+ if (location == frame.location) {
+ return frame;
+ }
+
+ // As we now know that this frame relates to an original source...
+ // Fetch the symbols for it and compute the frame's originalDisplayName.
+ const originalDisplayName = await thunkArgs.dispatch(
+ getOriginalFunctionDisplayName(location)
+ );
+
+ // As we modify frame object, fork it to force causing re-renders
+ return {
+ ...frame,
+ location,
+ generatedLocation: frame.generatedLocation || frame.location,
+ originalDisplayName,
+ };
+}
+
+function isWasmOriginalSourceFrame(frame) {
+ if (!frame.location.source.isOriginal) {
+ return false;
+ }
+
+ return Boolean(frame.generatedLocation?.source.isWasm);
+}
+
+/**
+ * Wasm Source Maps can come with an non-standard "xScopes" attribute
+ * which allows mapping the scope of a given location.
+ */
+async function expandWasmFrames(frames, { getState, sourceMapLoader }) {
+ const result = [];
+ for (let i = 0; i < frames.length; ++i) {
+ const frame = frames[i];
+ if (frame.isOriginal || !isWasmOriginalSourceFrame(frame)) {
+ result.push(frame);
+ continue;
+ }
+ const originalFrames = await sourceMapLoader.getOriginalStackFrames(
+ debuggerToSourceMapLocation(frame.generatedLocation)
+ );
+ if (!originalFrames) {
+ result.push(frame);
+ continue;
+ }
+
+ assert(!!originalFrames.length, "Expected at least one original frame");
+ // First entry has no specific location -- use one from the generated frame.
+ originalFrames[0].location = frame.location;
+
+ originalFrames.forEach((originalFrame, j) => {
+ if (!originalFrame.location) {
+ return;
+ }
+
+ // Keep outer most frame with true actor ID, and generate unique
+ // one for the nested frames.
+ const id = j == 0 ? frame.id : `${frame.id}-originalFrame${j}`;
+ const originalFrameLocation = sourceMapToDebuggerLocation(
+ getState(),
+ originalFrame.location
+ );
+ result.push(
+ createWasmOriginalFrame(frame, id, originalFrame, originalFrameLocation)
+ );
+ });
+ }
+ return result;
+}
+
+/**
+ * Map call stack frame locations and display names to originals.
+ * e.g.
+ * 1. When the debuggee pauses
+ * 2. When a source is pretty printed
+ * 3. When symbols are loaded
+ * @memberof actions/pause
+ * @static
+ */
+export function mapFrames(thread) {
+ return async function (thunkArgs) {
+ const { dispatch, getState } = thunkArgs;
+ const frames = getFrames(getState(), thread);
+ if (!frames || !frames.length) {
+ return;
+ }
+
+ // Update frame's location/generatedLocation/originalDisplayNames in case it relates to an original source
+ let mappedFrames = await Promise.all(
+ frames.map(frame => updateFrameLocationAndDisplayName(frame, thunkArgs))
+ );
+
+ mappedFrames = await expandWasmFrames(mappedFrames, thunkArgs);
+
+ // Add the "library" attribute on all frame objects (if relevant)
+ annotateFramesWithLibrary(mappedFrames);
+
+ // After having mapped the frames, we should update the selected frame
+ // just in case the selected frame is now set on a blackboxed original source
+ const selectedFrameId = getSelectedFrameId(
+ getState(),
+ thread,
+ mappedFrames
+ );
+
+ dispatch({
+ type: "MAP_FRAMES",
+ thread,
+ frames: mappedFrames,
+ selectedFrameId,
+ });
+ };
+}
diff --git a/devtools/client/debugger/src/actions/pause/mapScopes.js b/devtools/client/debugger/src/actions/pause/mapScopes.js
new file mode 100644
index 0000000000..8cb096c0a8
--- /dev/null
+++ b/devtools/client/debugger/src/actions/pause/mapScopes.js
@@ -0,0 +1,201 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import {
+ getSettledSourceTextContent,
+ isMapScopesEnabled,
+ getSelectedFrame,
+ getGeneratedFrameScope,
+ getOriginalFrameScope,
+ getFirstSourceActorForGeneratedSource,
+ getCurrentThread,
+} from "../../selectors/index";
+import {
+ loadOriginalSourceText,
+ loadGeneratedSourceText,
+} from "../sources/loadSourceText";
+import { validateSelectedFrame } from "../../utils/context";
+import { PROMISE } from "../utils/middleware/promise";
+
+import { log } from "../../utils/log";
+
+import { buildMappedScopes } from "../../utils/pause/mapScopes/index";
+import { isFulfilled } from "../../utils/async-value";
+
+import { getMappedLocation } from "../../utils/source-maps";
+
+const expressionRegex = /\bfp\(\)/g;
+
+export async function buildOriginalScopes(
+ selectedFrame,
+ client,
+ generatedScopes
+) {
+ if (!selectedFrame.originalVariables) {
+ throw new TypeError("(frame.originalVariables: XScopeVariables)");
+ }
+ const originalVariables = selectedFrame.originalVariables;
+ const frameBase = originalVariables.frameBase || "";
+
+ const inputs = [];
+ for (let i = 0; i < originalVariables.vars.length; i++) {
+ const { expr } = originalVariables.vars[i];
+ const expression = expr
+ ? expr.replace(expressionRegex, frameBase)
+ : "void 0";
+
+ inputs[i] = expression;
+ }
+
+ const results = await client.evaluateExpressions(inputs, {
+ frameId: selectedFrame.id,
+ });
+
+ const variables = {};
+ for (let i = 0; i < originalVariables.vars.length; i++) {
+ const { name } = originalVariables.vars[i];
+ variables[name] = { value: results[i].result };
+ }
+
+ const bindings = {
+ arguments: [],
+ variables,
+ };
+
+ const { actor } = await generatedScopes;
+ const scope = {
+ type: "function",
+ scopeKind: "",
+ actor,
+ bindings,
+ parent: null,
+ function: null,
+ block: null,
+ };
+ return {
+ mappings: {},
+ scope,
+ };
+}
+
+export function toggleMapScopes() {
+ return async function ({ dispatch, getState }) {
+ if (isMapScopesEnabled(getState())) {
+ dispatch({ type: "TOGGLE_MAP_SCOPES", mapScopes: false });
+ return;
+ }
+
+ dispatch({ type: "TOGGLE_MAP_SCOPES", mapScopes: true });
+
+ // Ignore the call if there is no selected frame (we are not paused?)
+ const state = getState();
+ const selectedFrame = getSelectedFrame(state, getCurrentThread(state));
+ if (!selectedFrame) {
+ return;
+ }
+
+ if (getOriginalFrameScope(getState(), selectedFrame)) {
+ return;
+ }
+
+ // Also ignore the call if we didn't fetch the scopes for the selected frame
+ const scopes = getGeneratedFrameScope(getState(), selectedFrame);
+ if (!scopes) {
+ return;
+ }
+
+ dispatch(mapScopes(selectedFrame, Promise.resolve(scopes.scope)));
+ };
+}
+
+export function mapScopes(selectedFrame, scopes) {
+ return async function (thunkArgs) {
+ const { getState, dispatch, client } = thunkArgs;
+
+ await dispatch({
+ type: "MAP_SCOPES",
+ selectedFrame,
+ [PROMISE]: (async function () {
+ if (selectedFrame.isOriginal && selectedFrame.originalVariables) {
+ return buildOriginalScopes(selectedFrame, client, scopes);
+ }
+
+ // getMappedScopes is only specific to the sources where we map the variables
+ // in scope and so only need a thread context. Assert that we are on the same thread
+ // before retrieving a thread context.
+ validateSelectedFrame(getState(), selectedFrame);
+
+ return dispatch(getMappedScopes(scopes, selectedFrame));
+ })(),
+ });
+ };
+}
+
+/**
+ * Get scopes mapped for a precise location.
+ *
+ * @param {Promise} scopes
+ * Can be null. Result of Commands.js's client.getFrameScopes
+ * @param {Objects locations
+ * Frame object, or custom object with 'location' and 'generatedLocation' attributes.
+ */
+export function getMappedScopes(scopes, locations) {
+ return async function (thunkArgs) {
+ const { getState, dispatch } = thunkArgs;
+ const generatedSource = locations.generatedLocation.source;
+ const source = locations.location.source;
+
+ if (
+ !isMapScopesEnabled(getState()) ||
+ !source ||
+ !generatedSource ||
+ generatedSource.isWasm ||
+ source.isPrettyPrinted ||
+ !source.isOriginal
+ ) {
+ return null;
+ }
+
+ // Load source text for the original source
+ await dispatch(loadOriginalSourceText(source));
+
+ const generatedSourceActor = getFirstSourceActorForGeneratedSource(
+ getState(),
+ generatedSource.id
+ );
+
+ // Also load source text for its corresponding generated source
+ await dispatch(loadGeneratedSourceText(generatedSourceActor));
+
+ try {
+ const content =
+ // load original source text content
+ getSettledSourceTextContent(getState(), locations.location);
+
+ return await buildMappedScopes(
+ source,
+ content && isFulfilled(content)
+ ? content.value
+ : { type: "text", value: "", contentType: undefined },
+ locations,
+ await scopes,
+ thunkArgs
+ );
+ } catch (e) {
+ log(e);
+ return null;
+ }
+ };
+}
+
+/**
+ * Used to map variables used within conditional and log breakpoints.
+ */
+export function getMappedScopesForLocation(location) {
+ return async function (thunkArgs) {
+ const { dispatch } = thunkArgs;
+ const mappedLocation = await getMappedLocation(location, thunkArgs);
+ return dispatch(getMappedScopes(null, mappedLocation));
+ };
+}
diff --git a/devtools/client/debugger/src/actions/pause/moz.build b/devtools/client/debugger/src/actions/pause/moz.build
new file mode 100644
index 0000000000..e8f65996ed
--- /dev/null
+++ b/devtools/client/debugger/src/actions/pause/moz.build
@@ -0,0 +1,26 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DIRS += []
+
+CompiledModules(
+ "breakOnNext.js",
+ "commands.js",
+ "continueToHere.js",
+ "expandScopes.js",
+ "fetchFrames.js",
+ "fetchScopes.js",
+ "index.js",
+ "inlinePreview.js",
+ "mapFrames.js",
+ "mapScopes.js",
+ "paused.js",
+ "pauseOnDebuggerStatement.js",
+ "pauseOnExceptions.js",
+ "resetBreakpointsPaneState.js",
+ "resumed.js",
+ "selectFrame.js",
+ "skipPausing.js",
+)
diff --git a/devtools/client/debugger/src/actions/pause/pauseOnDebuggerStatement.js b/devtools/client/debugger/src/actions/pause/pauseOnDebuggerStatement.js
new file mode 100644
index 0000000000..7b2b1d70cb
--- /dev/null
+++ b/devtools/client/debugger/src/actions/pause/pauseOnDebuggerStatement.js
@@ -0,0 +1,17 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { PROMISE } from "../utils/middleware/promise";
+
+export function pauseOnDebuggerStatement(shouldPauseOnDebuggerStatement) {
+ return ({ dispatch, getState, client }) => {
+ return dispatch({
+ type: "PAUSE_ON_DEBUGGER_STATEMENT",
+ shouldPauseOnDebuggerStatement,
+ [PROMISE]: client.pauseOnDebuggerStatement(
+ shouldPauseOnDebuggerStatement
+ ),
+ });
+ };
+}
diff --git a/devtools/client/debugger/src/actions/pause/pauseOnExceptions.js b/devtools/client/debugger/src/actions/pause/pauseOnExceptions.js
new file mode 100644
index 0000000000..e7c04ded61
--- /dev/null
+++ b/devtools/client/debugger/src/actions/pause/pauseOnExceptions.js
@@ -0,0 +1,34 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { PROMISE } from "../utils/middleware/promise";
+import { recordEvent } from "../../utils/telemetry";
+
+/**
+ *
+ * @memberof actions/pause
+ * @static
+ */
+export function pauseOnExceptions(
+ shouldPauseOnExceptions,
+ shouldPauseOnCaughtExceptions
+) {
+ return ({ dispatch, getState, client }) => {
+ recordEvent("pause_on_exceptions", {
+ exceptions: shouldPauseOnExceptions,
+ // There's no "n" in the key below (#1463117)
+ ["caught_exceptio"]: shouldPauseOnCaughtExceptions,
+ });
+
+ return dispatch({
+ type: "PAUSE_ON_EXCEPTIONS",
+ shouldPauseOnExceptions,
+ shouldPauseOnCaughtExceptions,
+ [PROMISE]: client.pauseOnExceptions(
+ shouldPauseOnExceptions,
+ shouldPauseOnCaughtExceptions
+ ),
+ });
+ };
+}
diff --git a/devtools/client/debugger/src/actions/pause/paused.js b/devtools/client/debugger/src/actions/pause/paused.js
new file mode 100644
index 0000000000..a7a631c28c
--- /dev/null
+++ b/devtools/client/debugger/src/actions/pause/paused.js
@@ -0,0 +1,69 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import {
+ getHiddenBreakpoint,
+ isEvaluatingExpression,
+ getSelectedFrame,
+} from "../../selectors/index";
+
+import { mapFrames, fetchFrames } from "./index";
+import { removeBreakpoint } from "../breakpoints/index";
+import { evaluateExpressions } from "../expressions";
+import { selectLocation } from "../sources/index";
+import { validateSelectedFrame } from "../../utils/context";
+
+import { fetchScopes } from "./fetchScopes";
+
+/**
+ * Debugger has just paused
+ *
+ * @param {object} pauseInfo
+ * See `createPause` method.
+ */
+export function paused(pauseInfo) {
+ return async function ({ dispatch, getState }) {
+ const { thread, frame, why } = pauseInfo;
+
+ dispatch({ type: "PAUSED", thread, why, topFrame: frame });
+
+ // When we use "continue to here" feature we register an "hidden" breakpoint
+ // that should be removed on the next paused, even if we didn't hit it and
+ // paused for any other reason.
+ const hiddenBreakpoint = getHiddenBreakpoint(getState());
+ if (hiddenBreakpoint) {
+ dispatch(removeBreakpoint(hiddenBreakpoint));
+ }
+
+ // The THREAD_STATE's "paused" resource only passes the top level stack frame,
+ // we dispatch the PAUSED action with it so that we can right away
+ // display it and update the UI to be paused.
+ // But we then fetch all the other frames:
+ await dispatch(fetchFrames(thread));
+ // And map them to original source locations.
+ // Note that this will wait for all related original sources to be loaded in the reducers.
+ // So this step may pause for a little while.
+ await dispatch(mapFrames(thread));
+
+ // If we paused on a particular frame, automatically select the related source
+ // and highlight the paused line
+ const selectedFrame = getSelectedFrame(getState(), thread);
+ if (selectedFrame) {
+ await dispatch(selectLocation(selectedFrame.location));
+ // We might have resumed while opening the location.
+ // Prevent further computation if this happens.
+ validateSelectedFrame(getState(), selectedFrame);
+
+ // Fetch the previews for variables visible in the currently selected paused stackframe
+ await dispatch(fetchScopes(selectedFrame));
+
+ // Run after fetching scoping data so that it may make use of the sourcemap
+ // expression mappings for local variables.
+ const atException = why.type == "exception";
+ if (!atException || !isEvaluatingExpression(getState(), thread)) {
+ await dispatch(evaluateExpressions(selectedFrame));
+ }
+ }
+ };
+}
diff --git a/devtools/client/debugger/src/actions/pause/resetBreakpointsPaneState.js b/devtools/client/debugger/src/actions/pause/resetBreakpointsPaneState.js
new file mode 100644
index 0000000000..a602c58896
--- /dev/null
+++ b/devtools/client/debugger/src/actions/pause/resetBreakpointsPaneState.js
@@ -0,0 +1,18 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Action for the breakpoints panel while paused.
+ *
+ * @memberof actions/pause
+ * @static
+ */
+export function resetBreakpointsPaneState(thread) {
+ return async ({ dispatch }) => {
+ dispatch({
+ type: "RESET_BREAKPOINTS_PANE_STATE",
+ thread,
+ });
+ };
+}
diff --git a/devtools/client/debugger/src/actions/pause/resumed.js b/devtools/client/debugger/src/actions/pause/resumed.js
new file mode 100644
index 0000000000..47d55f84ca
--- /dev/null
+++ b/devtools/client/debugger/src/actions/pause/resumed.js
@@ -0,0 +1,31 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import {
+ isStepping,
+ getPauseReason,
+ getSelectedFrame,
+} from "../../selectors/index";
+import { evaluateExpressions } from "../expressions";
+import { inDebuggerEval } from "../../utils/pause/index";
+
+/**
+ * Debugger has just resumed.
+ */
+export function resumed(thread) {
+ return async ({ dispatch, client, getState }) => {
+ const why = getPauseReason(getState(), thread);
+ const wasPausedInEval = inDebuggerEval(why);
+ const wasStepping = isStepping(getState(), thread);
+
+ dispatch({ type: "RESUME", thread, wasStepping });
+
+ // Avoid updating expression if we are stepping and would re-pause right after,
+ // the expression will be updated on next pause.
+ if (!wasStepping && !wasPausedInEval) {
+ const selectedFrame = getSelectedFrame(getState(), thread);
+ await dispatch(evaluateExpressions(selectedFrame));
+ }
+ };
+}
diff --git a/devtools/client/debugger/src/actions/pause/selectFrame.js b/devtools/client/debugger/src/actions/pause/selectFrame.js
new file mode 100644
index 0000000000..49ebacffe5
--- /dev/null
+++ b/devtools/client/debugger/src/actions/pause/selectFrame.js
@@ -0,0 +1,37 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { selectLocation } from "../sources/index";
+import { evaluateExpressions } from "../expressions";
+import { fetchScopes } from "./fetchScopes";
+import { validateSelectedFrame } from "../../utils/context";
+
+/**
+ * @memberof actions/pause
+ * @static
+ */
+export function selectFrame(frame) {
+ return async ({ dispatch, getState }) => {
+ // Frames that aren't on-stack do not support evalling and may not
+ // have live inspectable scopes, so we do not allow selecting them.
+ if (frame.state !== "on-stack") {
+ dispatch(selectLocation(frame.location));
+ return;
+ }
+
+ dispatch({
+ type: "SELECT_FRAME",
+ frame,
+ });
+
+ // It's important that we wait for selectLocation to finish because
+ // we rely on the source being loaded and symbols fetched below.
+ await dispatch(selectLocation(frame.location));
+ validateSelectedFrame(getState(), frame);
+
+ await dispatch(evaluateExpressions(frame));
+
+ await dispatch(fetchScopes(frame));
+ };
+}
diff --git a/devtools/client/debugger/src/actions/pause/skipPausing.js b/devtools/client/debugger/src/actions/pause/skipPausing.js
new file mode 100644
index 0000000000..a9f1550dc1
--- /dev/null
+++ b/devtools/client/debugger/src/actions/pause/skipPausing.js
@@ -0,0 +1,33 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { getSkipPausing } from "../../selectors/index";
+
+/**
+ * @memberof actions/pause
+ * @static
+ */
+export function toggleSkipPausing() {
+ return async ({ dispatch, client, getState }) => {
+ const skipPausing = !getSkipPausing(getState());
+ await client.setSkipPausing(skipPausing);
+ dispatch({ type: "TOGGLE_SKIP_PAUSING", skipPausing });
+ };
+}
+
+/**
+ * @memberof actions/pause
+ * @static
+ */
+export function setSkipPausing(skipPausing) {
+ return async ({ dispatch, client, getState }) => {
+ const currentlySkipping = getSkipPausing(getState());
+ if (currentlySkipping === skipPausing) {
+ return;
+ }
+
+ await client.setSkipPausing(skipPausing);
+ dispatch({ type: "TOGGLE_SKIP_PAUSING", skipPausing });
+ };
+}
diff --git a/devtools/client/debugger/src/actions/pause/tests/__snapshots__/pauseOnExceptions.spec.js.snap b/devtools/client/debugger/src/actions/pause/tests/__snapshots__/pauseOnExceptions.spec.js.snap
new file mode 100644
index 0000000000..55b8d3e724
--- /dev/null
+++ b/devtools/client/debugger/src/actions/pause/tests/__snapshots__/pauseOnExceptions.spec.js.snap
@@ -0,0 +1,10 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`pauseOnExceptions should track telemetry for pauseOnException changes 1`] = `
+Array [
+ Object {
+ "caught_exceptio": false,
+ "exceptions": true,
+ },
+]
+`;
diff --git a/devtools/client/debugger/src/actions/pause/tests/pause.spec.js b/devtools/client/debugger/src/actions/pause/tests/pause.spec.js
new file mode 100644
index 0000000000..f8bd87375a
--- /dev/null
+++ b/devtools/client/debugger/src/actions/pause/tests/pause.spec.js
@@ -0,0 +1,290 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import {
+ actions,
+ selectors,
+ createStore,
+ createSourceObject,
+ makeSource,
+ makeOriginalSource,
+ makeFrame,
+} from "../../../utils/test-head";
+
+import { makeWhyNormal } from "../../../utils/test-mockup";
+import { createLocation } from "../../../utils/location";
+
+const mockCommandClient = {
+ stepIn: () => new Promise(),
+ stepOver: () => new Promise(_resolve => _resolve),
+ evaluate: async () => {},
+ evaluateExpressions: async () => [],
+ resume: async () => {},
+ getFrameScopes: async frame => frame.scope,
+ getFrames: async () => [],
+ setBreakpoint: () => new Promise(_resolve => {}),
+ sourceContents: ({ source }) => {
+ return new Promise((resolve, reject) => {
+ switch (source) {
+ case "foo1":
+ return resolve({
+ source: "function foo1() {\n return 5;\n}",
+ contentType: "text/javascript",
+ });
+ case "await":
+ return resolve({
+ source: "async function aWait() {\n await foo(); return 5;\n}",
+ contentType: "text/javascript",
+ });
+
+ case "foo":
+ return resolve({
+ source: "function foo() {\n return -5;\n}",
+ contentType: "text/javascript",
+ });
+ case "foo-original":
+ return resolve({
+ source: "\n\nfunction fooOriginal() {\n return -5;\n}",
+ contentType: "text/javascript",
+ });
+ case "foo-wasm":
+ return resolve({
+ source: { binary: new ArrayBuffer(0) },
+ contentType: "application/wasm",
+ });
+ case "foo-wasm/originalSource":
+ return resolve({
+ source: "fn fooBar() {}\nfn barZoo() { fooBar() }",
+ contentType: "text/rust",
+ });
+ }
+
+ return resolve();
+ });
+ },
+ getSourceActorBreakpointPositions: async () => ({}),
+ getSourceActorBreakableLines: async () => [],
+ actorID: "threadActorID",
+};
+
+const mockFrameId = "1";
+
+function createPauseInfo(
+ frameLocation = createLocation({
+ source: createSourceObject("foo1"),
+ line: 2,
+ }),
+ frameOpts = {}
+) {
+ const frames = [
+ makeFrame(
+ { id: mockFrameId, sourceId: frameLocation.source.id },
+ {
+ location: frameLocation,
+ generatedLocation: frameLocation,
+ ...frameOpts,
+ }
+ ),
+ ];
+ return {
+ thread: "FakeThread",
+ frame: frames[0],
+ frames,
+ loadedObjects: [],
+ why: makeWhyNormal(),
+ };
+}
+
+function debuggerToSourceMapLocation(l) {
+ return {
+ sourceId: l.source.id,
+ line: l.line,
+ column: l.column,
+ };
+}
+
+describe("pause", () => {
+ describe("stepping", () => {
+ it("should only step when paused", async () => {
+ const client = { stepIn: jest.fn() };
+ const { dispatch } = createStore(client);
+
+ dispatch(actions.stepIn());
+ expect(client.stepIn.mock.calls).toHaveLength(0);
+ });
+
+ it("getting frame scopes with bindings", async () => {
+ const client = { ...mockCommandClient };
+ const store = createStore(client, {});
+ const { dispatch, getState } = store;
+
+ const source = await dispatch(
+ actions.newGeneratedSource(makeSource("foo"))
+ );
+ const generatedLocation = createLocation({
+ source,
+ line: 1,
+ column: 0,
+ sourceActor: selectors.getFirstSourceActorForGeneratedSource(
+ getState(),
+ source.id
+ ),
+ });
+ const mockPauseInfo = createPauseInfo(generatedLocation, {
+ scope: {
+ bindings: {
+ variables: { b: { value: {} } },
+ arguments: [{ a: { value: {} } }],
+ },
+ },
+ });
+
+ const { frames } = mockPauseInfo;
+ client.getFrames = async () => frames;
+ await dispatch(actions.newOriginalSources([makeOriginalSource(source)]));
+
+ await dispatch(actions.paused(mockPauseInfo));
+ expect(selectors.getFrames(getState(), "FakeThread")).toEqual([
+ {
+ id: mockFrameId,
+ generatedLocation,
+ location: generatedLocation,
+ library: null,
+ scope: {
+ bindings: {
+ arguments: [{ a: { value: {} } }],
+ variables: { b: { value: {} } },
+ },
+ },
+ thread: "FakeThread",
+ },
+ ]);
+
+ expect(selectors.getFrameScopes(getState(), "FakeThread")).toEqual({
+ generated: {
+ 1: {
+ pending: false,
+ scope: {
+ bindings: {
+ arguments: [{ a: { value: {} } }],
+ variables: { b: { value: {} } },
+ },
+ },
+ },
+ },
+ mappings: { 1: undefined },
+ original: { 1: { pending: false, scope: undefined } },
+ });
+
+ expect(
+ selectors.getSelectedFrameBindings(getState(), "FakeThread")
+ ).toEqual(["b", "a"]);
+ });
+
+ it("maps frame to original frames", async () => {
+ const sourceMapLoaderMock = {
+ getOriginalStackFrames: loc => Promise.resolve(originStackFrames),
+ getOriginalLocation: () =>
+ Promise.resolve(debuggerToSourceMapLocation(originalLocation)),
+ getOriginalLocations: async items =>
+ items.map(debuggerToSourceMapLocation),
+ getOriginalSourceText: async () => ({
+ text: "fn fooBar() {}\nfn barZoo() { fooBar() }",
+ contentType: "text/rust",
+ }),
+ getGeneratedRangesForOriginal: async () => [],
+ };
+
+ const client = { ...mockCommandClient };
+ const store = createStore(client, {}, sourceMapLoaderMock);
+ const { dispatch, getState } = store;
+
+ const generatedSource = await dispatch(
+ actions.newGeneratedSource(
+ makeSource("foo-wasm", { introductionType: "wasm" })
+ )
+ );
+
+ const generatedLocation = createLocation({
+ source: generatedSource,
+ line: 1,
+ column: 0,
+ sourceActor: selectors.getFirstSourceActorForGeneratedSource(
+ getState(),
+ generatedSource.id
+ ),
+ });
+ const mockPauseInfo = createPauseInfo(generatedLocation);
+ const { frames } = mockPauseInfo;
+ client.getFrames = async () => frames;
+
+ const [originalSource] = await dispatch(
+ actions.newOriginalSources([makeOriginalSource(generatedSource)])
+ );
+
+ const originalLocation = createLocation({
+ source: originalSource,
+ line: 1,
+ column: 1,
+ });
+ const originalLocation2 = createLocation({
+ source: originalSource,
+ line: 2,
+ column: 14,
+ sourceActor: selectors.getFirstSourceActorForGeneratedSource(
+ getState(),
+ originalSource.id
+ ),
+ });
+
+ const originStackFrames = [
+ {
+ displayName: "fooBar",
+ thread: "FakeThread",
+ },
+ {
+ displayName: "barZoo",
+ location: originalLocation2,
+ thread: "FakeThread",
+ },
+ ];
+
+ await dispatch(actions.paused(mockPauseInfo));
+ expect(selectors.getFrames(getState(), "FakeThread")).toEqual([
+ {
+ asyncCause: undefined,
+ displayName: "fooBar",
+ generatedLocation,
+ id: "1",
+ index: undefined,
+ isOriginal: true,
+ library: null,
+ location: originalLocation,
+ originalDisplayName: "fooBar",
+ originalVariables: undefined,
+ state: undefined,
+ this: undefined,
+ thread: "FakeThread",
+ type: undefined,
+ },
+ {
+ asyncCause: undefined,
+ displayName: "barZoo",
+ generatedLocation,
+ id: "1-originalFrame1",
+ index: undefined,
+ isOriginal: true,
+ library: null,
+ location: originalLocation2,
+ originalDisplayName: "barZoo",
+ originalVariables: undefined,
+ state: undefined,
+ this: undefined,
+ thread: "FakeThread",
+ type: undefined,
+ },
+ ]);
+ });
+ });
+});
diff --git a/devtools/client/debugger/src/actions/pause/tests/pauseOnExceptions.spec.js b/devtools/client/debugger/src/actions/pause/tests/pauseOnExceptions.spec.js
new file mode 100644
index 0000000000..bc8d000697
--- /dev/null
+++ b/devtools/client/debugger/src/actions/pause/tests/pauseOnExceptions.spec.js
@@ -0,0 +1,24 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import {
+ actions,
+ createStore,
+ getTelemetryEvents,
+} from "../../../utils/test-head";
+
+import {
+ getShouldPauseOnExceptions,
+ getShouldPauseOnCaughtExceptions,
+} from "../../../selectors/pause";
+
+describe("pauseOnExceptions", () => {
+ it("should track telemetry for pauseOnException changes", async () => {
+ const { dispatch, getState } = createStore({ pauseOnExceptions: () => {} });
+ dispatch(actions.pauseOnExceptions(true, false));
+ expect(getTelemetryEvents("pause_on_exceptions")).toMatchSnapshot();
+ expect(getShouldPauseOnExceptions(getState())).toBe(true);
+ expect(getShouldPauseOnCaughtExceptions(getState())).toBe(false);
+ });
+});
diff --git a/devtools/client/debugger/src/actions/pause/tests/skipPausing.spec.js b/devtools/client/debugger/src/actions/pause/tests/skipPausing.spec.js
new file mode 100644
index 0000000000..83006c3089
--- /dev/null
+++ b/devtools/client/debugger/src/actions/pause/tests/skipPausing.spec.js
@@ -0,0 +1,18 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { actions, selectors, createStore } from "../../../utils/test-head";
+
+describe("sources - pretty print", () => {
+ it("returns a pretty source for a minified file", async () => {
+ const client = { setSkipPausing: jest.fn() };
+ const { dispatch, getState } = createStore(client);
+
+ await dispatch(actions.toggleSkipPausing());
+ expect(selectors.getSkipPausing(getState())).toBe(true);
+
+ await dispatch(actions.toggleSkipPausing());
+ expect(selectors.getSkipPausing(getState())).toBe(false);
+ });
+});
diff --git a/devtools/client/debugger/src/actions/preview.js b/devtools/client/debugger/src/actions/preview.js
new file mode 100644
index 0000000000..c3bc8dbffd
--- /dev/null
+++ b/devtools/client/debugger/src/actions/preview.js
@@ -0,0 +1,159 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { isConsole } from "../utils/preview";
+import { getGrip, getFront } from "../utils/evaluation-result";
+import { getExpressionFromCoords } from "../utils/editor/get-expression";
+
+import {
+ isLineInScope,
+ isSelectedFrameVisible,
+ getSelectedSource,
+ getSelectedLocation,
+ getSelectedFrame,
+ getCurrentThread,
+ getSelectedException,
+} from "../selectors/index";
+
+import { getMappedExpression } from "./expressions";
+
+async function findExpressionMatch(state, parserWorker, codeMirror, tokenPos) {
+ const location = getSelectedLocation(state);
+ if (!location) {
+ return null;
+ }
+
+ // Fallback on expression from codemirror cursor if parser worker misses symbols
+ // or is unable to find a match.
+ const match = await parserWorker.findBestMatchExpression(
+ location.source.id,
+ tokenPos
+ );
+ if (match) {
+ return match;
+ }
+ return getExpressionFromCoords(codeMirror, tokenPos);
+}
+
+export function getPreview(target, tokenPos, codeMirror) {
+ return async thunkArgs => {
+ const { getState, client, parserWorker } = thunkArgs;
+ if (
+ !isSelectedFrameVisible(getState()) ||
+ !isLineInScope(getState(), tokenPos.line)
+ ) {
+ return null;
+ }
+
+ const source = getSelectedSource(getState());
+ if (!source) {
+ return null;
+ }
+ const thread = getCurrentThread(getState());
+ const selectedFrame = getSelectedFrame(getState(), thread);
+ if (!selectedFrame) {
+ return null;
+ }
+
+ const match = await findExpressionMatch(
+ getState(),
+ parserWorker,
+ codeMirror,
+ tokenPos
+ );
+ if (!match) {
+ return null;
+ }
+
+ let { expression, location } = match;
+
+ if (isConsole(expression)) {
+ return null;
+ }
+
+ if (location && source.isOriginal) {
+ const mapResult = await getMappedExpression(
+ expression,
+ thread,
+ thunkArgs
+ );
+ if (mapResult) {
+ expression = mapResult.expression;
+ }
+ }
+
+ const { result } = await client.evaluate(expression, {
+ frameId: selectedFrame.id,
+ });
+
+ const resultGrip = getGrip(result);
+
+ // Error case occurs for a token that follows an errored evaluation
+ // https://github.com/firefox-devtools/debugger/pull/8056
+ // Accommodating for null allows us to show preview for falsy values
+ // line "", false, null, Nan, and more
+ if (resultGrip === null) {
+ return null;
+ }
+
+ // Handle cases where the result is invisible to the debugger
+ // and not possible to preview. Bug 1548256
+ if (
+ resultGrip &&
+ resultGrip.class &&
+ typeof resultGrip.class === "string" &&
+ resultGrip.class.includes("InvisibleToDebugger")
+ ) {
+ return null;
+ }
+
+ const root = {
+ path: expression,
+ contents: {
+ value: resultGrip,
+ front: getFront(result),
+ },
+ };
+
+ return {
+ target,
+ tokenPos,
+ cursorPos: target.getBoundingClientRect(),
+ expression,
+ root,
+ resultGrip,
+ };
+ };
+}
+
+export function getExceptionPreview(target, tokenPos, codeMirror) {
+ return async ({ dispatch, getState, parserWorker }) => {
+ const match = await findExpressionMatch(
+ getState(),
+ parserWorker,
+ codeMirror,
+ tokenPos
+ );
+ if (!match) {
+ return null;
+ }
+
+ const tokenColumnStart = match.location.start.column + 1;
+ const exception = getSelectedException(
+ getState(),
+ tokenPos.line,
+ tokenColumnStart
+ );
+ if (!exception) {
+ return null;
+ }
+
+ return {
+ target,
+ tokenPos,
+ cursorPos: target.getBoundingClientRect(),
+ exception,
+ };
+ };
+}
diff --git a/devtools/client/debugger/src/actions/project-text-search.js b/devtools/client/debugger/src/actions/project-text-search.js
new file mode 100644
index 0000000000..70a74d560c
--- /dev/null
+++ b/devtools/client/debugger/src/actions/project-text-search.js
@@ -0,0 +1,142 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Redux actions for the search state
+ * @module actions/search
+ */
+
+import { isFulfilled } from "../utils/async-value";
+import {
+ getFirstSourceActorForGeneratedSource,
+ getSourceList,
+ getSettledSourceTextContent,
+ isSourceBlackBoxed,
+ getSearchOptions,
+} from "../selectors/index";
+import { createLocation } from "../utils/location";
+import { matchesGlobPatterns } from "../utils/source";
+import { loadSourceText } from "./sources/loadSourceText";
+import { searchKeys } from "../constants";
+
+export function searchSources(query, onUpdatedResults, signal) {
+ return async ({ dispatch, getState, searchWorker }) => {
+ dispatch({
+ type: "SET_PROJECT_SEARCH_QUERY",
+ query,
+ });
+
+ const searchOptions = getSearchOptions(
+ getState(),
+ searchKeys.PROJECT_SEARCH
+ );
+ const validSources = getSourceList(getState()).filter(
+ source =>
+ !isSourceBlackBoxed(getState(), source) &&
+ !matchesGlobPatterns(source, searchOptions.excludePatterns)
+ );
+ // Sort original entries first so that search results are more useful.
+ // Deprioritize third-party scripts, so their results show last.
+ validSources.sort((a, b) => {
+ function isThirdParty(source) {
+ return (
+ source?.url &&
+ (source.url.includes("node_modules") ||
+ source.url.includes("bower_components"))
+ );
+ }
+
+ if (a.isOriginal && !isThirdParty(a)) {
+ return -1;
+ }
+
+ if (b.isOriginal && !isThirdParty(b)) {
+ return 1;
+ }
+
+ if (!isThirdParty(a) && isThirdParty(b)) {
+ return -1;
+ }
+ if (isThirdParty(a) && !isThirdParty(b)) {
+ return 1;
+ }
+ return 0;
+ });
+ const results = [];
+ for (const source of validSources) {
+ const sourceActor = getFirstSourceActorForGeneratedSource(
+ getState(),
+ source.id
+ );
+ await dispatch(loadSourceText(source, sourceActor));
+
+ // This is the only asynchronous call in this method.
+ // We may have stopped the search by closing the search panel or changing the query.
+ // Avoid any further unecessary computation when the React Component tells us the query was cancelled.
+ if (signal.aborted) {
+ return;
+ }
+
+ const result = await searchSource(source, sourceActor, query, {
+ getState,
+ searchWorker,
+ });
+ if (signal.aborted) {
+ return;
+ }
+
+ if (result) {
+ results.push(result);
+ onUpdatedResults(results, false, signal);
+ }
+ }
+ onUpdatedResults(results, true, signal);
+ };
+}
+
+export async function searchSource(
+ source,
+ sourceActor,
+ query,
+ { getState, searchWorker }
+) {
+ const state = getState();
+ const location = createLocation({
+ source,
+ sourceActor,
+ });
+
+ const content = getSettledSourceTextContent(state, location);
+ let matches = [];
+
+ if (content && isFulfilled(content) && content.value.type === "text") {
+ const options = getSearchOptions(state, searchKeys.PROJECT_SEARCH);
+ matches = await searchWorker.findSourceMatches(
+ content.value,
+ query,
+ options
+ );
+ }
+ if (!matches.length) {
+ return null;
+ }
+ return {
+ type: "RESULT",
+ location,
+ // `matches` are generated by project-search worker's `findSourceMatches` method
+ matches: matches.map(m => ({
+ type: "MATCH",
+ location: createLocation({
+ ...location,
+ // `matches` only contain line and column
+ // `location` will already refer to the right source/sourceActor
+ line: m.line,
+ column: m.column,
+ }),
+ matchIndex: m.matchIndex,
+ match: m.match,
+ value: m.value,
+ })),
+ };
+}
diff --git a/devtools/client/debugger/src/actions/quick-open.js b/devtools/client/debugger/src/actions/quick-open.js
new file mode 100644
index 0000000000..e5f5352292
--- /dev/null
+++ b/devtools/client/debugger/src/actions/quick-open.js
@@ -0,0 +1,21 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+export function setQuickOpenQuery(query) {
+ return {
+ type: "SET_QUICK_OPEN_QUERY",
+ query,
+ };
+}
+
+export function openQuickOpen(query) {
+ if (query != null) {
+ return { type: "OPEN_QUICK_OPEN", query };
+ }
+ return { type: "OPEN_QUICK_OPEN" };
+}
+
+export function closeQuickOpen() {
+ return { type: "CLOSE_QUICK_OPEN" };
+}
diff --git a/devtools/client/debugger/src/actions/source-actors.js b/devtools/client/debugger/src/actions/source-actors.js
new file mode 100644
index 0000000000..9782e493b3
--- /dev/null
+++ b/devtools/client/debugger/src/actions/source-actors.js
@@ -0,0 +1,12 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+export function insertSourceActors(sourceActors) {
+ return function ({ dispatch }) {
+ dispatch({
+ type: "INSERT_SOURCE_ACTORS",
+ sourceActors,
+ });
+ };
+}
diff --git a/devtools/client/debugger/src/actions/sources-tree.js b/devtools/client/debugger/src/actions/sources-tree.js
new file mode 100644
index 0000000000..9d54c08ac9
--- /dev/null
+++ b/devtools/client/debugger/src/actions/sources-tree.js
@@ -0,0 +1,43 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { getMainThread } from "../selectors/index";
+
+export function setExpandedState(expanded) {
+ return { type: "SET_EXPANDED_STATE", expanded };
+}
+
+export function focusItem(item) {
+ return { type: "SET_FOCUSED_SOURCE_ITEM", item };
+}
+
+export function setProjectDirectoryRoot(newRootItemUniquePath, newName) {
+ return ({ dispatch, getState }) => {
+ // If the new project root is against the top level thread,
+ // replace its thread ID with "top-level", so that later,
+ // getDirectoryForUniquePath could match the project root,
+ // even after a page reload where the new top level thread actor ID
+ // will be different.
+ const mainThread = getMainThread(getState());
+ if (mainThread && newRootItemUniquePath.startsWith(mainThread.actor)) {
+ newRootItemUniquePath = newRootItemUniquePath.replace(
+ mainThread.actor,
+ "top-level"
+ );
+ }
+ dispatch({
+ type: "SET_PROJECT_DIRECTORY_ROOT",
+ uniquePath: newRootItemUniquePath,
+ name: newName,
+ });
+ };
+}
+
+export function clearProjectDirectoryRoot() {
+ return {
+ type: "SET_PROJECT_DIRECTORY_ROOT",
+ uniquePath: "",
+ name: "",
+ };
+}
diff --git a/devtools/client/debugger/src/actions/sources/blackbox.js b/devtools/client/debugger/src/actions/sources/blackbox.js
new file mode 100644
index 0000000000..3cf4df2a70
--- /dev/null
+++ b/devtools/client/debugger/src/actions/sources/blackbox.js
@@ -0,0 +1,211 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Redux actions for the sources state
+ * @module actions/sources
+ */
+
+import { originalToGeneratedId } from "devtools/client/shared/source-map-loader/index";
+import { recordEvent } from "../../utils/telemetry";
+import { toggleBreakpoints } from "../breakpoints/index";
+import {
+ getSourceActorsForSource,
+ isSourceBlackBoxed,
+ getBlackBoxRanges,
+ getBreakpointsForSource,
+} from "../../selectors/index";
+
+export async function blackboxSourceActorsForSource(
+ thunkArgs,
+ source,
+ shouldBlackBox,
+ ranges = []
+) {
+ const { getState, client, sourceMapLoader } = thunkArgs;
+ let sourceId = source.id;
+ // If the source is the original, then get the source id of its generated file
+ // and the range for where the original is represented in the generated file
+ // (which might be a bundle including other files).
+ if (source.isOriginal) {
+ sourceId = originalToGeneratedId(source.id);
+ const range = await sourceMapLoader.getFileGeneratedRange(source.id);
+ ranges = [];
+ if (range) {
+ ranges.push(range);
+ // TODO bug 1752108: Investigate blackboxing lines in original files,
+ // there is likely to be issues as the whole genrated file
+ // representing the original file will always be blackboxed.
+ console.warn(
+ "The might be unxpected issues when ignoring lines in an original file. " +
+ "The whole original source is being blackboxed."
+ );
+ } else {
+ throw new Error(
+ `Unable to retrieve generated ranges for original source ${source.url}`
+ );
+ }
+ }
+
+ for (const actor of getSourceActorsForSource(getState(), sourceId)) {
+ await client.blackBox(actor, shouldBlackBox, ranges);
+ }
+}
+
+/**
+ * Toggle blackboxing for the whole source or for specific lines in a source
+ *
+ * @param {Object} source - The source to be blackboxed/unblackboxed.
+ * @param {Boolean} [shouldBlackBox] - Specifies if the source should be blackboxed (true
+ * or unblackboxed (false). When this is not provided
+ * option is decided based on the blackboxed state
+ * of the source.
+ * @param {Array} [ranges] - List of line/column offsets to blackbox, these
+ * are provided only when blackboxing lines.
+ * The range structure:
+ * const range = {
+ * start: { line: 1, column: 5 },
+ * end: { line: 3, column: 4 },
+ * }
+ */
+export function toggleBlackBox(source, shouldBlackBox, ranges = []) {
+ return async thunkArgs => {
+ const { dispatch, getState } = thunkArgs;
+
+ shouldBlackBox =
+ typeof shouldBlackBox == "boolean"
+ ? shouldBlackBox
+ : !isSourceBlackBoxed(getState(), source);
+
+ await blackboxSourceActorsForSource(
+ thunkArgs,
+ source,
+ shouldBlackBox,
+ ranges
+ );
+
+ if (shouldBlackBox) {
+ recordEvent("blackbox");
+ // If ranges is an empty array, it would mean we are blackboxing the whole
+ // source. To do that lets reset the content to an empty array.
+ if (!ranges.length) {
+ dispatch({ type: "BLACKBOX_WHOLE_SOURCES", sources: [source] });
+ await toggleBreakpointsInBlackboxedSources({
+ thunkArgs,
+ shouldDisable: true,
+ sources: [source],
+ });
+ } else {
+ const currentRanges = getBlackBoxRanges(getState())[source.url] || [];
+ ranges = ranges.filter(newRange => {
+ // To avoid adding duplicate ranges make sure
+ // no range already exists with same start and end lines.
+ const duplicate = currentRanges.findIndex(
+ r =>
+ r.start.line == newRange.start.line &&
+ r.end.line == newRange.end.line
+ );
+ return duplicate == -1;
+ });
+ dispatch({ type: "BLACKBOX_SOURCE_RANGES", source, ranges });
+ await toggleBreakpointsInRangesForBlackboxedSource({
+ thunkArgs,
+ shouldDisable: true,
+ source,
+ ranges,
+ });
+ }
+ } else {
+ // if there are no ranges to blackbox, then we are unblackboxing
+ // the whole source
+ // eslint-disable-next-line no-lonely-if
+ if (!ranges.length) {
+ dispatch({ type: "UNBLACKBOX_WHOLE_SOURCES", sources: [source] });
+ toggleBreakpointsInBlackboxedSources({
+ thunkArgs,
+ shouldDisable: false,
+ sources: [source],
+ });
+ } else {
+ dispatch({ type: "UNBLACKBOX_SOURCE_RANGES", source, ranges });
+ const blackboxRanges = getBlackBoxRanges(getState());
+ if (!blackboxRanges[source.url].length) {
+ dispatch({ type: "UNBLACKBOX_WHOLE_SOURCES", sources: [source] });
+ }
+ await toggleBreakpointsInRangesForBlackboxedSource({
+ thunkArgs,
+ shouldDisable: false,
+ source,
+ ranges,
+ });
+ }
+ }
+ };
+}
+
+async function toggleBreakpointsInRangesForBlackboxedSource({
+ thunkArgs,
+ shouldDisable,
+ source,
+ ranges,
+}) {
+ const { dispatch, getState } = thunkArgs;
+ for (const range of ranges) {
+ const breakpoints = getBreakpointsForSource(getState(), source, range);
+ await dispatch(toggleBreakpoints(shouldDisable, breakpoints));
+ }
+}
+
+async function toggleBreakpointsInBlackboxedSources({
+ thunkArgs,
+ shouldDisable,
+ sources,
+}) {
+ const { dispatch, getState } = thunkArgs;
+ for (const source of sources) {
+ const breakpoints = getBreakpointsForSource(getState(), source);
+ await dispatch(toggleBreakpoints(shouldDisable, breakpoints));
+ }
+}
+
+/*
+ * Blackboxes a group of sources together
+ *
+ * @param {Array} sourcesToBlackBox - The list of sources to blackbox
+ * @param {Boolean} shouldBlackbox - Specifies if the sources should blackboxed (true)
+ * or unblackboxed (false).
+ */
+export function blackBoxSources(sourcesToBlackBox, shouldBlackBox) {
+ return async thunkArgs => {
+ const { dispatch, getState } = thunkArgs;
+
+ const sources = sourcesToBlackBox.filter(
+ source => isSourceBlackBoxed(getState(), source) !== shouldBlackBox
+ );
+
+ if (!sources.length) {
+ return;
+ }
+
+ for (const source of sources) {
+ await blackboxSourceActorsForSource(thunkArgs, source, shouldBlackBox);
+ }
+
+ if (shouldBlackBox) {
+ recordEvent("blackbox");
+ }
+
+ dispatch({
+ type: shouldBlackBox
+ ? "BLACKBOX_WHOLE_SOURCES"
+ : "UNBLACKBOX_WHOLE_SOURCES",
+ sources,
+ });
+ await toggleBreakpointsInBlackboxedSources({
+ thunkArgs,
+ shouldDisable: shouldBlackBox,
+ sources,
+ });
+ };
+}
diff --git a/devtools/client/debugger/src/actions/sources/breakableLines.js b/devtools/client/debugger/src/actions/sources/breakableLines.js
new file mode 100644
index 0000000000..98d0b49a37
--- /dev/null
+++ b/devtools/client/debugger/src/actions/sources/breakableLines.js
@@ -0,0 +1,68 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import {
+ getBreakableLines,
+ getSourceActorBreakableLines,
+} from "../../selectors/index";
+import { setBreakpointPositions } from "../breakpoints/breakpointPositions";
+
+function calculateBreakableLines(positions) {
+ const lines = [];
+ for (const line in positions) {
+ if (positions[line].length) {
+ lines.push(Number(line));
+ }
+ }
+
+ return lines;
+}
+
+/**
+ * Ensure that breakable lines for a given source are fetched.
+ *
+ * @param Object location
+ */
+export function setBreakableLines(location) {
+ return async ({ getState, dispatch, client }) => {
+ let breakableLines;
+ if (location.source.isOriginal) {
+ const positions = await dispatch(setBreakpointPositions(location));
+ breakableLines = calculateBreakableLines(positions);
+
+ const existingBreakableLines = getBreakableLines(
+ getState(),
+ location.source.id
+ );
+ if (existingBreakableLines) {
+ breakableLines = [
+ ...new Set([...existingBreakableLines, ...breakableLines]),
+ ];
+ }
+
+ dispatch({
+ type: "SET_ORIGINAL_BREAKABLE_LINES",
+ source: location.source,
+ breakableLines,
+ });
+ } else {
+ // Ignore re-fetching the breakable lines for source actor we already fetched
+ breakableLines = getSourceActorBreakableLines(
+ getState(),
+ location.sourceActor.id
+ );
+ if (breakableLines) {
+ return;
+ }
+ breakableLines = await client.getSourceActorBreakableLines(
+ location.sourceActor
+ );
+ dispatch({
+ type: "SET_SOURCE_ACTOR_BREAKABLE_LINES",
+ sourceActor: location.sourceActor,
+ breakableLines,
+ });
+ }
+ };
+}
diff --git a/devtools/client/debugger/src/actions/sources/index.js b/devtools/client/debugger/src/actions/sources/index.js
new file mode 100644
index 0000000000..9e2041dd31
--- /dev/null
+++ b/devtools/client/debugger/src/actions/sources/index.js
@@ -0,0 +1,40 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+export * from "./blackbox";
+export * from "./breakableLines";
+export * from "./loadSourceText";
+export * from "./newSources";
+export * from "./prettyPrint";
+export * from "./select";
+export * from "./symbols";
+
+export function setOverrideSource(source, path) {
+ return ({ client, dispatch }) => {
+ if (!source || !source.url) {
+ return;
+ }
+ const { url } = source;
+ client.setOverride(url, path);
+ dispatch({
+ type: "SET_OVERRIDE",
+ url,
+ path,
+ });
+ };
+}
+
+export function removeOverrideSource(source) {
+ return ({ client, dispatch }) => {
+ if (!source || !source.url) {
+ return;
+ }
+ const { url } = source;
+ client.removeOverride(url);
+ dispatch({
+ type: "REMOVE_OVERRIDE",
+ url,
+ });
+ };
+}
diff --git a/devtools/client/debugger/src/actions/sources/loadSourceText.js b/devtools/client/debugger/src/actions/sources/loadSourceText.js
new file mode 100644
index 0000000000..d3bbd53871
--- /dev/null
+++ b/devtools/client/debugger/src/actions/sources/loadSourceText.js
@@ -0,0 +1,252 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { PROMISE } from "../utils/middleware/promise";
+import {
+ getSourceTextContent,
+ getSettledSourceTextContent,
+ getGeneratedSource,
+ getSourcesEpoch,
+ getBreakpointsForSource,
+ getSourceActorsForSource,
+ getFirstSourceActorForGeneratedSource,
+} from "../../selectors/index";
+import { addBreakpoint } from "../breakpoints/index";
+
+import { prettyPrintSourceTextContent } from "./prettyPrint";
+import { isFulfilled, fulfilled } from "../../utils/async-value";
+
+import { isPretty } from "../../utils/source";
+import { createLocation } from "../../utils/location";
+import { memoizeableAction } from "../../utils/memoizableAction";
+
+async function loadGeneratedSource(sourceActor, { client }) {
+ // If no source actor can be found then the text for the
+ // source cannot be loaded.
+ if (!sourceActor) {
+ throw new Error("Source actor is null or not defined");
+ }
+
+ let response;
+ try {
+ response = await client.sourceContents(sourceActor);
+ } catch (e) {
+ throw new Error(`sourceContents failed: ${e}`);
+ }
+
+ return {
+ text: response.source,
+ contentType: response.contentType || "text/javascript",
+ };
+}
+
+async function loadOriginalSource(
+ source,
+ { getState, client, sourceMapLoader, prettyPrintWorker }
+) {
+ if (isPretty(source)) {
+ const generatedSource = getGeneratedSource(getState(), source);
+ if (!generatedSource) {
+ throw new Error("Unable to find minified original.");
+ }
+
+ const content = getSettledSourceTextContent(
+ getState(),
+ createLocation({
+ source: generatedSource,
+ })
+ );
+
+ return prettyPrintSourceTextContent(
+ sourceMapLoader,
+ prettyPrintWorker,
+ generatedSource,
+ content,
+ getSourceActorsForSource(getState(), generatedSource.id)
+ );
+ }
+
+ const result = await sourceMapLoader.getOriginalSourceText(source.id);
+ if (!result) {
+ // The way we currently try to load and select a pending
+ // selected location, it is possible that we will try to fetch the
+ // original source text right after the source map has been cleared
+ // after a navigation event.
+ throw new Error("Original source text unavailable");
+ }
+ return result;
+}
+
+async function loadGeneratedSourceTextPromise(sourceActor, thunkArgs) {
+ const { dispatch, getState } = thunkArgs;
+ const epoch = getSourcesEpoch(getState());
+
+ await dispatch({
+ type: "LOAD_GENERATED_SOURCE_TEXT",
+ sourceActor,
+ epoch,
+ [PROMISE]: loadGeneratedSource(sourceActor, thunkArgs),
+ });
+
+ await onSourceTextContentAvailable(
+ sourceActor.sourceObject,
+ sourceActor,
+ thunkArgs
+ );
+}
+
+async function loadOriginalSourceTextPromise(source, thunkArgs) {
+ const { dispatch, getState } = thunkArgs;
+ const epoch = getSourcesEpoch(getState());
+ await dispatch({
+ type: "LOAD_ORIGINAL_SOURCE_TEXT",
+ source,
+ epoch,
+ [PROMISE]: loadOriginalSource(source, thunkArgs),
+ });
+
+ await onSourceTextContentAvailable(source, null, thunkArgs);
+}
+
+/**
+ * Function called everytime a new original or generated source gets its text content
+ * fetched from the server and registered in the reducer.
+ *
+ * @param {Object} source
+ * @param {Object} sourceActor (optional)
+ * If this is a generated source, we expect a precise source actor.
+ * @param {Object} thunkArgs
+ */
+async function onSourceTextContentAvailable(
+ source,
+ sourceActor,
+ { dispatch, getState, parserWorker }
+) {
+ const location = createLocation({
+ source,
+ sourceActor,
+ });
+ const content = getSettledSourceTextContent(getState(), location);
+ if (!content) {
+ return;
+ }
+
+ if (parserWorker.isLocationSupported(location)) {
+ parserWorker.setSource(
+ source.id,
+ isFulfilled(content)
+ ? content.value
+ : { type: "text", value: "", contentType: undefined }
+ );
+ }
+
+ // Update the text in any breakpoints for this source by re-adding them.
+ const breakpoints = getBreakpointsForSource(getState(), source);
+ for (const breakpoint of breakpoints) {
+ await dispatch(
+ addBreakpoint(
+ breakpoint.location,
+ breakpoint.options,
+ breakpoint.disabled
+ )
+ );
+ }
+}
+
+/**
+ * Loads the source text for the generated source based of the source actor
+ * @param {Object} sourceActor
+ * There can be more than one source actor per source
+ * so the source actor needs to be specified. This is
+ * required for generated sources but will be null for
+ * original/pretty printed sources.
+ */
+export const loadGeneratedSourceText = memoizeableAction(
+ "loadGeneratedSourceText",
+ {
+ getValue: (sourceActor, { getState }) => {
+ if (!sourceActor) {
+ return null;
+ }
+
+ const sourceTextContent = getSourceTextContent(
+ getState(),
+ createLocation({
+ source: sourceActor.sourceObject,
+ sourceActor,
+ })
+ );
+
+ if (!sourceTextContent || sourceTextContent.state === "pending") {
+ return sourceTextContent;
+ }
+
+ // This currently swallows source-load-failure since we return fulfilled
+ // here when content.state === "rejected". In an ideal world we should
+ // propagate that error upward.
+ return fulfilled(sourceTextContent);
+ },
+ createKey: (sourceActor, { getState }) => {
+ const epoch = getSourcesEpoch(getState());
+ return `${epoch}:${sourceActor.actor}`;
+ },
+ action: (sourceActor, thunkArgs) =>
+ loadGeneratedSourceTextPromise(sourceActor, thunkArgs),
+ }
+);
+
+/**
+ * Loads the source text for an original source and source actor
+ * @param {Object} source
+ * The original source to load the source text
+ */
+export const loadOriginalSourceText = memoizeableAction(
+ "loadOriginalSourceText",
+ {
+ getValue: (source, { getState }) => {
+ if (!source) {
+ return null;
+ }
+
+ const sourceTextContent = getSourceTextContent(
+ getState(),
+ createLocation({
+ source,
+ })
+ );
+ if (!sourceTextContent || sourceTextContent.state === "pending") {
+ return sourceTextContent;
+ }
+
+ // This currently swallows source-load-failure since we return fulfilled
+ // here when content.state === "rejected". In an ideal world we should
+ // propagate that error upward.
+ return fulfilled(sourceTextContent);
+ },
+ createKey: (source, { getState }) => {
+ const epoch = getSourcesEpoch(getState());
+ return `${epoch}:${source.id}`;
+ },
+ action: (source, thunkArgs) =>
+ loadOriginalSourceTextPromise(source, thunkArgs),
+ }
+);
+
+export function loadSourceText(source, sourceActor) {
+ return async ({ dispatch, getState }) => {
+ if (!source) {
+ return null;
+ }
+ if (source.isOriginal) {
+ return dispatch(loadOriginalSourceText(source));
+ }
+ if (!sourceActor) {
+ sourceActor = getFirstSourceActorForGeneratedSource(
+ getState(),
+ source.id
+ );
+ }
+ return dispatch(loadGeneratedSourceText(sourceActor));
+ };
+}
diff --git a/devtools/client/debugger/src/actions/sources/moz.build b/devtools/client/debugger/src/actions/sources/moz.build
new file mode 100644
index 0000000000..9972e9f09b
--- /dev/null
+++ b/devtools/client/debugger/src/actions/sources/moz.build
@@ -0,0 +1,17 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DIRS += []
+
+CompiledModules(
+ "blackbox.js",
+ "breakableLines.js",
+ "index.js",
+ "loadSourceText.js",
+ "newSources.js",
+ "prettyPrint.js",
+ "select.js",
+ "symbols.js",
+)
diff --git a/devtools/client/debugger/src/actions/sources/newSources.js b/devtools/client/debugger/src/actions/sources/newSources.js
new file mode 100644
index 0000000000..4d9c2cd5f7
--- /dev/null
+++ b/devtools/client/debugger/src/actions/sources/newSources.js
@@ -0,0 +1,382 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Redux actions for the sources state
+ * @module actions/sources
+ */
+import { insertSourceActors } from "../../actions/source-actors";
+import {
+ makeSourceId,
+ createGeneratedSource,
+ createSourceMapOriginalSource,
+ createSourceActor,
+} from "../../client/firefox/create";
+import { toggleBlackBox } from "./blackbox";
+import { syncPendingBreakpoint } from "../breakpoints/index";
+import { loadSourceText } from "./loadSourceText";
+import { prettyPrintAndSelectSource } from "./prettyPrint";
+import { toggleSourceMapIgnoreList } from "../ui";
+import { selectLocation, setBreakableLines } from "../sources/index";
+
+import { getRawSourceURL, isPrettyURL } from "../../utils/source";
+import { createLocation } from "../../utils/location";
+import {
+ getBlackBoxRanges,
+ getSource,
+ getSourceFromId,
+ hasSourceActor,
+ getSourceByActorId,
+ getPendingSelectedLocation,
+ getPendingBreakpointsForSource,
+} from "../../selectors/index";
+
+import { prefs } from "../../utils/prefs";
+import sourceQueue from "../../utils/source-queue";
+import { validateSourceActor, ContextError } from "../../utils/context";
+
+function loadSourceMaps(sources) {
+ return async function ({ dispatch }) {
+ try {
+ const sourceList = await Promise.all(
+ sources.map(async sourceActor => {
+ const originalSourcesInfo = await dispatch(
+ loadSourceMap(sourceActor)
+ );
+ originalSourcesInfo.forEach(
+ sourcesInfo => (sourcesInfo.sourceActor = sourceActor)
+ );
+ sourceQueue.queueOriginalSources(originalSourcesInfo);
+ return originalSourcesInfo;
+ })
+ );
+
+ await sourceQueue.flush();
+ return sourceList.flat();
+ } catch (error) {
+ if (!(error instanceof ContextError)) {
+ throw error;
+ }
+ }
+ return [];
+ };
+}
+
+/**
+ * @memberof actions/sources
+ * @static
+ */
+function loadSourceMap(sourceActor) {
+ return async function ({ dispatch, getState, sourceMapLoader, panel }) {
+ if (!prefs.clientSourceMapsEnabled || !sourceActor.sourceMapURL) {
+ return [];
+ }
+
+ let sources, ignoreListUrls, resolvedSourceMapURL, exception;
+ try {
+ // Ignore sourceMapURL on scripts that are part of HTML files, since
+ // we currently treat sourcemaps as Source-wide, not SourceActor-specific.
+ const source = getSourceByActorId(getState(), sourceActor.id);
+ if (source) {
+ ({ sources, ignoreListUrls, resolvedSourceMapURL, exception } =
+ await sourceMapLoader.loadSourceMap({
+ // Using source ID here is historical and eventually we'll want to
+ // switch to all of this being per-source-actor.
+ id: source.id,
+ url: sourceActor.url || "",
+ sourceMapBaseURL: sourceActor.sourceMapBaseURL || "",
+ sourceMapURL: sourceActor.sourceMapURL || "",
+ isWasm: sourceActor.introductionType === "wasm",
+ }));
+ }
+ } catch (e) {
+ exception = `Internal error: ${e.message}`;
+ }
+
+ if (resolvedSourceMapURL) {
+ dispatch({
+ type: "RESOLVED_SOURCEMAP_URL",
+ sourceActor,
+ resolvedSourceMapURL,
+ });
+ }
+
+ if (ignoreListUrls?.length) {
+ dispatch({
+ type: "ADD_SOURCEMAP_IGNORE_LIST_SOURCES",
+ ignoreListUrls,
+ });
+ }
+
+ if (exception) {
+ // Catch all errors and log them to the Web Console for users to see.
+ const message = L10N.getFormatStr(
+ "toolbox.sourceMapFailure",
+ exception,
+ sourceActor.url,
+ sourceActor.sourceMapURL
+ );
+ panel.toolbox.commands.targetCommand.targetFront.logWarningInPage(
+ message,
+ "source map",
+ resolvedSourceMapURL
+ );
+
+ dispatch({
+ type: "SOURCE_MAP_ERROR",
+ sourceActor,
+ errorMessage: exception,
+ });
+
+ // If this source doesn't have a sourcemap or there are no original files
+ // existing, enable it for pretty printing
+ dispatch({
+ type: "CLEAR_SOURCE_ACTOR_MAP_URL",
+ sourceActor,
+ });
+ return [];
+ }
+
+ // Before dispatching this action, ensure that the related sourceActor is still registered
+ validateSourceActor(getState(), sourceActor);
+ return sources;
+ };
+}
+
+// If a request has been made to show this source, go ahead and
+// select it.
+function checkSelectedSource(sourceId) {
+ return async ({ dispatch, getState }) => {
+ const state = getState();
+ const pendingLocation = getPendingSelectedLocation(state);
+
+ if (!pendingLocation || !pendingLocation.url) {
+ return;
+ }
+
+ const source = getSource(state, sourceId);
+
+ if (!source || !source.url) {
+ return;
+ }
+
+ const pendingUrl = pendingLocation.url;
+ const rawPendingUrl = getRawSourceURL(pendingUrl);
+
+ if (rawPendingUrl === source.url) {
+ if (isPrettyURL(pendingUrl)) {
+ const prettySource = await dispatch(prettyPrintAndSelectSource(source));
+ dispatch(checkPendingBreakpoints(prettySource, null));
+ return;
+ }
+
+ await dispatch(
+ selectLocation(
+ createLocation({
+ source,
+ line:
+ typeof pendingLocation.line === "number"
+ ? pendingLocation.line
+ : 0,
+ column: pendingLocation.column,
+ })
+ )
+ );
+ }
+ };
+}
+
+function checkPendingBreakpoints(source, sourceActor) {
+ return async ({ dispatch, getState }) => {
+ const pendingBreakpoints = getPendingBreakpointsForSource(
+ getState(),
+ source
+ );
+
+ if (pendingBreakpoints.length === 0) {
+ return;
+ }
+
+ // load the source text if there is a pending breakpoint for it
+ await dispatch(loadSourceText(source, sourceActor));
+ await dispatch(setBreakableLines(createLocation({ source, sourceActor })));
+
+ await Promise.all(
+ pendingBreakpoints.map(pendingBp => {
+ return dispatch(syncPendingBreakpoint(source, pendingBp));
+ })
+ );
+ };
+}
+
+function restoreBlackBoxedSources(sources) {
+ return async ({ dispatch, getState }) => {
+ const currentRanges = getBlackBoxRanges(getState());
+
+ if (!Object.keys(currentRanges).length) {
+ return;
+ }
+
+ for (const source of sources) {
+ const ranges = currentRanges[source.url];
+ if (ranges) {
+ // If the ranges is an empty then the whole source was blackboxed.
+ await dispatch(toggleBlackBox(source, true, ranges));
+ }
+ }
+
+ if (prefs.sourceMapIgnoreListEnabled) {
+ await dispatch(toggleSourceMapIgnoreList(true));
+ }
+ };
+}
+
+export function newOriginalSources(originalSourcesInfo) {
+ return async ({ dispatch, getState }) => {
+ const state = getState();
+ const seen = new Set();
+
+ const actors = [];
+ const actorsSources = {};
+
+ for (const { id, url, sourceActor } of originalSourcesInfo) {
+ if (seen.has(id) || getSource(state, id)) {
+ continue;
+ }
+ seen.add(id);
+
+ if (!actorsSources[sourceActor.actor]) {
+ actors.push(sourceActor);
+ actorsSources[sourceActor.actor] = [];
+ }
+
+ actorsSources[sourceActor.actor].push(
+ createSourceMapOriginalSource(id, url)
+ );
+ }
+
+ // Add the original sources per the generated source actors that
+ // they are primarily from.
+ actors.forEach(sourceActor => {
+ dispatch({
+ type: "ADD_ORIGINAL_SOURCES",
+ originalSources: actorsSources[sourceActor.actor],
+ generatedSourceActor: sourceActor,
+ });
+ });
+
+ // Accumulate the sources back into one list
+ const actorsSourcesValues = Object.values(actorsSources);
+ let sources = [];
+ if (actorsSourcesValues.length) {
+ sources = actorsSourcesValues.reduce((acc, sourceList) =>
+ acc.concat(sourceList)
+ );
+ }
+
+ await dispatch(checkNewSources(sources));
+
+ for (const source of sources) {
+ dispatch(checkPendingBreakpoints(source, null));
+ }
+
+ return sources;
+ };
+}
+
+// Wrapper around newGeneratedSources, only used by tests
+export function newGeneratedSource(sourceInfo) {
+ return async ({ dispatch }) => {
+ const sources = await dispatch(newGeneratedSources([sourceInfo]));
+ return sources[0];
+ };
+}
+
+export function newGeneratedSources(sourceResources) {
+ return async ({ dispatch, getState, client }) => {
+ if (!sourceResources.length) {
+ return [];
+ }
+
+ const resultIds = [];
+ const newSourcesObj = {};
+ const newSourceActors = [];
+
+ for (const sourceResource of sourceResources) {
+ // By the time we process the sources, the related target
+ // might already have been destroyed. It means that the sources
+ // are also about to be destroyed, so ignore them.
+ // (This is covered by browser_toolbox_backward_forward_navigation.js)
+ if (sourceResource.targetFront.isDestroyed()) {
+ continue;
+ }
+ const id = makeSourceId(sourceResource);
+
+ if (!getSource(getState(), id) && !newSourcesObj[id]) {
+ newSourcesObj[id] = createGeneratedSource(sourceResource);
+ }
+
+ const actorId = sourceResource.actor;
+
+ // We are sometimes notified about a new source multiple times if we
+ // request a new source list and also get a source event from the server.
+ if (!hasSourceActor(getState(), actorId)) {
+ newSourceActors.push(
+ createSourceActor(
+ sourceResource,
+ getSource(getState(), id) || newSourcesObj[id]
+ )
+ );
+ }
+
+ resultIds.push(id);
+ }
+
+ const newSources = Object.values(newSourcesObj);
+
+ dispatch({ type: "ADD_SOURCES", sources: newSources });
+ dispatch(insertSourceActors(newSourceActors));
+
+ await dispatch(checkNewSources(newSources));
+
+ (async () => {
+ await dispatch(loadSourceMaps(newSourceActors));
+
+ // We would like to sync breakpoints after we are done
+ // loading source maps as sometimes generated and original
+ // files share the same paths.
+ for (const sourceActor of newSourceActors) {
+ // For HTML pages, we fetch all new incoming inline script,
+ // which will be related to one dedicated source actor.
+ // Whereas, for regular sources, if we have many source actors,
+ // this is for the same URL. And code expecting to have breakable lines
+ // will request breakable lines for that particular source actor.
+ if (sourceActor.sourceObject.isHTML) {
+ await dispatch(
+ setBreakableLines(
+ createLocation({ source: sourceActor.sourceObject, sourceActor })
+ )
+ );
+ }
+ dispatch(
+ checkPendingBreakpoints(sourceActor.sourceObject, sourceActor)
+ );
+ }
+ })();
+
+ return resultIds.map(id => getSourceFromId(getState(), id));
+ };
+}
+
+function checkNewSources(sources) {
+ return async ({ dispatch, getState }) => {
+ for (const source of sources) {
+ dispatch(checkSelectedSource(source.id));
+ }
+
+ await dispatch(restoreBlackBoxedSources(sources));
+
+ return sources;
+ };
+}
diff --git a/devtools/client/debugger/src/actions/sources/prettyPrint.js b/devtools/client/debugger/src/actions/sources/prettyPrint.js
new file mode 100644
index 0000000000..6a12a34240
--- /dev/null
+++ b/devtools/client/debugger/src/actions/sources/prettyPrint.js
@@ -0,0 +1,358 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { generatedToOriginalId } from "devtools/client/shared/source-map-loader/index";
+
+import assert from "../../utils/assert";
+import { recordEvent } from "../../utils/telemetry";
+import { updateBreakpointsForNewPrettyPrintedSource } from "../breakpoints/index";
+
+import { getPrettySourceURL, isJavaScript } from "../../utils/source";
+import { isFulfilled, fulfilled } from "../../utils/async-value";
+import { getOriginalLocation } from "../../utils/source-maps";
+import { prefs } from "../../utils/prefs";
+import {
+ loadGeneratedSourceText,
+ loadOriginalSourceText,
+} from "./loadSourceText";
+import { mapFrames } from "../pause/index";
+import { selectSpecificLocation } from "../sources/index";
+import { createPrettyPrintOriginalSource } from "../../client/firefox/create";
+
+import {
+ getFirstSourceActorForGeneratedSource,
+ getSourceFromId,
+ getSelectedLocation,
+} from "../../selectors/index";
+
+import { selectSource } from "./select";
+import { memoizeableAction } from "../../utils/memoizableAction";
+
+import DevToolsUtils from "devtools/shared/DevToolsUtils";
+
+const LINE_BREAK_REGEX = /\r\n?|\n|\u2028|\u2029/g;
+function matchAllLineBreaks(str) {
+ return Array.from(str.matchAll(LINE_BREAK_REGEX));
+}
+
+function getPrettyOriginalSourceURL(generatedSource) {
+ return getPrettySourceURL(generatedSource.url || generatedSource.id);
+}
+
+export async function prettyPrintSourceTextContent(
+ sourceMapLoader,
+ prettyPrintWorker,
+ generatedSource,
+ content,
+ actors
+) {
+ if (!content || !isFulfilled(content)) {
+ throw new Error("Cannot pretty-print a file that has not loaded");
+ }
+
+ const contentValue = content.value;
+ if (
+ (!isJavaScript(generatedSource, contentValue) && !generatedSource.isHTML) ||
+ contentValue.type !== "text"
+ ) {
+ throw new Error(
+ `Can't prettify ${contentValue.contentType} files, only HTML and Javascript.`
+ );
+ }
+
+ const url = getPrettyOriginalSourceURL(generatedSource);
+
+ let prettyPrintWorkerResult;
+ if (generatedSource.isHTML) {
+ prettyPrintWorkerResult = await prettyPrintHtmlFile({
+ prettyPrintWorker,
+ generatedSource,
+ content,
+ actors,
+ });
+ } else {
+ prettyPrintWorkerResult = await prettyPrintWorker.prettyPrint({
+ sourceText: contentValue.value,
+ indent: " ".repeat(prefs.indentSize),
+ url,
+ });
+ }
+
+ // The source map URL service used by other devtools listens to changes to
+ // sources based on their actor IDs, so apply the sourceMap there too.
+ const generatedSourceIds = [
+ generatedSource.id,
+ ...actors.map(item => item.actor),
+ ];
+ await sourceMapLoader.setSourceMapForGeneratedSources(
+ generatedSourceIds,
+ prettyPrintWorkerResult.sourceMap
+ );
+
+ return {
+ text: prettyPrintWorkerResult.code,
+ contentType: contentValue.contentType,
+ };
+}
+
+/**
+ * Pretty print inline script inside an HTML file
+ *
+ * @param {Object} options
+ * @param {PrettyPrintDispatcher} options.prettyPrintWorker: The prettyPrint worker
+ * @param {Object} options.generatedSource: The HTML source we want to pretty print
+ * @param {Object} options.content
+ * @param {Array} options.actors: An array of the HTML file inline script sources data
+ *
+ * @returns Promise<Object> A promise that resolves with an object of the following shape:
+ * - {String} code: The prettified HTML text
+ * - {Object} sourceMap: The sourceMap object
+ */
+async function prettyPrintHtmlFile({
+ prettyPrintWorker,
+ generatedSource,
+ content,
+ actors,
+}) {
+ const url = getPrettyOriginalSourceURL(generatedSource);
+ const contentValue = content.value;
+ const htmlFileText = contentValue.value;
+ const prettyPrintWorkerResult = { code: htmlFileText };
+
+ const allLineBreaks = matchAllLineBreaks(htmlFileText);
+ let lineCountDelta = 0;
+
+ // Sort inline script actors so they are in the same order as in the html document.
+ actors.sort((a, b) => {
+ if (a.sourceStartLine === b.sourceStartLine) {
+ return a.sourceStartColumn > b.sourceStartColumn;
+ }
+ return a.sourceStartLine > b.sourceStartLine;
+ });
+
+ const prettyPrintTaskId = generatedSource.id;
+
+ // We don't want to replace part of the HTML document in the loop since it would require
+ // to account for modified lines for each iteration.
+ // Instead, we'll put each sections to replace in this array, where elements will be
+ // objects of the following shape:
+ // {Integer} startIndex: The start index in htmlFileText of the section we want to replace
+ // {Integer} endIndex: The end index in htmlFileText of the section we want to replace
+ // {String} prettyText: The pretty text we'll replace the original section with
+ // Once we iterated over all the inline scripts, we'll do the replacements (on the html
+ // file text) in reverse order, so we don't need have to care about the modified lines
+ // for each iteration.
+ const replacements = [];
+
+ const seenLocations = new Set();
+
+ for (const sourceInfo of actors) {
+ // We can get duplicate source actors representing the same inline script which will
+ // cause trouble in the pretty printing here. This should be fixed on the server (see
+ // Bug 1824979), but in the meantime let's not handle the same location twice so the
+ // pretty printing is not impacted.
+ const location = `${sourceInfo.sourceStartLine}:${sourceInfo.sourceStartColumn}`;
+ if (!sourceInfo.sourceLength || seenLocations.has(location)) {
+ continue;
+ }
+ seenLocations.add(location);
+ // Here we want to get the index of the last line break before the script tag.
+ // In allLineBreaks, this would be the item at (script tag line - 1)
+ // Since sourceInfo.sourceStartLine is 1-based, we need to get the item at (sourceStartLine - 2)
+ const indexAfterPreviousLineBreakInHtml =
+ sourceInfo.sourceStartLine > 1
+ ? allLineBreaks[sourceInfo.sourceStartLine - 2].index + 1
+ : 0;
+ const startIndex =
+ indexAfterPreviousLineBreakInHtml + sourceInfo.sourceStartColumn;
+ const endIndex = startIndex + sourceInfo.sourceLength;
+ const scriptText = htmlFileText.substring(startIndex, endIndex);
+ DevToolsUtils.assert(
+ scriptText.length == sourceInfo.sourceLength,
+ "script text has expected length"
+ );
+
+ // Here we're going to pretty print each inline script content.
+ // Since we want to have a sourceMap that we'll apply to the whole HTML file,
+ // we'll only collect the sourceMap once we handled all inline scripts.
+ // `taskId` allows us to signal to the worker that all those calls are part of the
+ // same bigger file, and we'll use it later to get the sourceMap.
+ const prettyText = await prettyPrintWorker.prettyPrintInlineScript({
+ taskId: prettyPrintTaskId,
+ sourceText: scriptText,
+ indent: " ".repeat(prefs.indentSize),
+ url,
+ originalStartLine: sourceInfo.sourceStartLine,
+ originalStartColumn: sourceInfo.sourceStartColumn,
+ // The generated line will be impacted by the previous inline scripts that were
+ // pretty printed, which is why we offset with lineCountDelta
+ generatedStartLine: sourceInfo.sourceStartLine + lineCountDelta,
+ generatedStartColumn: sourceInfo.sourceStartColumn,
+ lineCountDelta,
+ });
+
+ // We need to keep track of the line added/removed in order to properly offset
+ // the mapping of the pretty-print text
+ lineCountDelta +=
+ matchAllLineBreaks(prettyText).length -
+ matchAllLineBreaks(scriptText).length;
+
+ replacements.push({
+ startIndex,
+ endIndex,
+ prettyText,
+ });
+ }
+
+ // `getSourceMap` allow us to collect the computed source map resulting of the calls
+ // to `prettyPrint` with the same taskId.
+ prettyPrintWorkerResult.sourceMap = await prettyPrintWorker.getSourceMap(
+ prettyPrintTaskId
+ );
+
+ // Sort replacement in reverse order so we can replace code in the HTML file more easily
+ replacements.sort((a, b) => a.startIndex < b.startIndex);
+ for (const { startIndex, endIndex, prettyText } of replacements) {
+ prettyPrintWorkerResult.code =
+ prettyPrintWorkerResult.code.substring(0, startIndex) +
+ prettyText +
+ prettyPrintWorkerResult.code.substring(endIndex);
+ }
+
+ return prettyPrintWorkerResult;
+}
+
+function createPrettySource(source, sourceActor) {
+ return async ({ dispatch, sourceMapLoader, getState }) => {
+ const url = getPrettyOriginalSourceURL(source);
+ const id = generatedToOriginalId(source.id, url);
+ const prettySource = createPrettyPrintOriginalSource(id, url);
+
+ dispatch({
+ type: "ADD_ORIGINAL_SOURCES",
+ originalSources: [prettySource],
+ generatedSourceActor: sourceActor,
+ });
+ return prettySource;
+ };
+}
+
+function selectPrettyLocation(prettySource) {
+ return async thunkArgs => {
+ const { dispatch, getState } = thunkArgs;
+ let location = getSelectedLocation(getState());
+
+ // If we were selecting a particular line in the minified/generated source,
+ // try to select the matching line in the prettified/original source.
+ if (
+ location &&
+ location.line >= 1 &&
+ getPrettySourceURL(location.source.url) == prettySource.url
+ ) {
+ // Note that it requires to have called `prettyPrintSourceTextContent` and `sourceMapLoader.setSourceMapForGeneratedSources`
+ // to be functional and so to be called after `loadOriginalSourceText` completed.
+ location = await getOriginalLocation(location, thunkArgs);
+
+ // If the precise line/column correctly mapped to the pretty printed source, select that precise location.
+ // Otherwise fallback to selectSource in order to select the first line instead of the current line within the bundle.
+ if (location.source == prettySource) {
+ return dispatch(selectSpecificLocation(location));
+ }
+ }
+
+ return dispatch(selectSource(prettySource));
+ };
+}
+
+/**
+ * Toggle the pretty printing of a source's text.
+ * Nothing will happen for non-javascript files.
+ *
+ * @param Object source
+ * The source object for the minified/generated source.
+ * @returns Promise
+ * A promise that resolves to the Pretty print/original source object.
+ */
+export async function prettyPrintSource(source, thunkArgs) {
+ const { dispatch, getState } = thunkArgs;
+ recordEvent("pretty_print");
+
+ assert(
+ !source.isOriginal,
+ "Pretty-printing only allowed on generated sources"
+ );
+
+ const sourceActor = getFirstSourceActorForGeneratedSource(
+ getState(),
+ source.id
+ );
+
+ await dispatch(loadGeneratedSourceText(sourceActor));
+
+ const newPrettySource = await dispatch(
+ createPrettySource(source, sourceActor)
+ );
+
+ // Force loading the pretty source/original text.
+ // This will end up calling prettyPrintSourceTextContent() of this module, and
+ // more importantly, will populate the sourceMapLoader, which is used by selectPrettyLocation.
+ await dispatch(loadOriginalSourceText(newPrettySource));
+
+ // Update frames to the new pretty/original source (in case we were paused).
+ // Map the frames before selecting the pretty source in order to avoid
+ // having bundle/generated source for frames (we may compute scope things for the bundle).
+ await dispatch(mapFrames(sourceActor.thread));
+
+ // Update breakpoints locations to the new pretty/original source
+ await dispatch(updateBreakpointsForNewPrettyPrintedSource(source));
+
+ // A mutated flag, only meant to be used within this module
+ // to know when we are done loading the pretty printed source.
+ // This is important for the callsite in `selectLocation`
+ // in order to ensure all action are completed and especially `mapFrames`.
+ // Otherwise we may use generated frames there.
+ newPrettySource._loaded = true;
+
+ return newPrettySource;
+}
+
+// Use memoization in order to allow calling this actions many times
+// while ensuring creating the pretty source only once.
+const memoizedPrettyPrintSource = memoizeableAction("setSymbols", {
+ getValue: (source, { getState }) => {
+ // Lookup for an already existing pretty source
+ const url = getPrettyOriginalSourceURL(source);
+ const id = generatedToOriginalId(source.id, url);
+ const s = getSourceFromId(getState(), id);
+ // Avoid returning it if doTogglePrettyPrint isn't completed.
+ if (!s || !s._loaded) {
+ return undefined;
+ }
+ return fulfilled(s);
+ },
+ createKey: source => source.id,
+ action: (source, thunkArgs) => prettyPrintSource(source, thunkArgs),
+});
+
+export function prettyPrintAndSelectSource(source) {
+ return async ({ dispatch, sourceMapLoader, getState }) => {
+ const prettySource = await dispatch(memoizedPrettyPrintSource(source));
+
+ // Select the pretty/original source based on the location we may
+ // have had against the minified/generated source.
+ // This uses source map to map locations.
+ // Also note that selecting a location force many things:
+ // * opening tabs
+ // * fetching symbols/inline scope
+ // * fetching breakable lines
+ //
+ // This isn't part of memoizedTogglePrettyPrint/doTogglePrettyPrint
+ // because if the source is already pretty printed, the memoization
+ // would avoid trying to update to the mapped location based
+ // on current location on the minified source.
+ await dispatch(selectPrettyLocation(prettySource));
+
+ return prettySource;
+ };
+}
diff --git a/devtools/client/debugger/src/actions/sources/select.js b/devtools/client/debugger/src/actions/sources/select.js
new file mode 100644
index 0000000000..63200a398a
--- /dev/null
+++ b/devtools/client/debugger/src/actions/sources/select.js
@@ -0,0 +1,368 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Redux actions for the sources state
+ * @module actions/sources
+ */
+
+import { setSymbols } from "./symbols";
+import { setInScopeLines } from "../ast/index";
+import { prettyPrintAndSelectSource } from "./prettyPrint";
+import { addTab, closeTab } from "../tabs";
+import { loadSourceText } from "./loadSourceText";
+import { setBreakableLines } from "./breakableLines";
+
+import { prefs } from "../../utils/prefs";
+import { isMinified } from "../../utils/source";
+import { createLocation } from "../../utils/location";
+import {
+ getRelatedMapLocation,
+ getOriginalLocation,
+} from "../../utils/source-maps";
+
+import {
+ getSource,
+ getFirstSourceActorForGeneratedSource,
+ getSourceByURL,
+ getPrettySource,
+ getSelectedLocation,
+ getShouldSelectOriginalLocation,
+ canPrettyPrintSource,
+ getSourceTextContent,
+ tabExists,
+ hasSource,
+ hasSourceActor,
+ hasPrettyTab,
+ isSourceActorWithSourceMap,
+} from "../../selectors/index";
+
+// This is only used by jest tests (and within this module)
+export const setSelectedLocation = (
+ location,
+ shouldSelectOriginalLocation,
+ shouldHighlightSelectedLocation
+) => ({
+ type: "SET_SELECTED_LOCATION",
+ location,
+ shouldSelectOriginalLocation,
+ shouldHighlightSelectedLocation,
+});
+
+// This is only used by jest tests (and within this module)
+export const setPendingSelectedLocation = (url, options) => ({
+ type: "SET_PENDING_SELECTED_LOCATION",
+ url,
+ line: options?.line,
+ column: options?.column,
+});
+
+// This is only used by jest tests (and within this module)
+export const clearSelectedLocation = () => ({
+ type: "CLEAR_SELECTED_LOCATION",
+});
+
+/**
+ * Deterministically select a source that has a given URL. This will
+ * work regardless of the connection status or if the source exists
+ * yet.
+ *
+ * This exists mostly for external things to interact with the
+ * debugger.
+ */
+export function selectSourceURL(url, options) {
+ return async ({ dispatch, getState }) => {
+ const source = getSourceByURL(getState(), url);
+ if (!source) {
+ return dispatch(setPendingSelectedLocation(url, options));
+ }
+
+ const location = createLocation({ ...options, source });
+ return dispatch(selectLocation(location));
+ };
+}
+
+/**
+ * Wrapper around selectLocation, which creates the location object for us.
+ * Note that it ignores the currently selected source and will select
+ * the precise generated/original source passed as argument.
+ *
+ * @param {String} source
+ * The precise source to select.
+ * @param {String} sourceActor
+ * The specific source actor of the source to
+ * select the source text. This is optional.
+ */
+export function selectSource(source, sourceActor) {
+ return async ({ dispatch }) => {
+ // `createLocation` requires a source object, but we may use selectSource to close the last tab,
+ // where source will be null and the location will be an empty object.
+ const location = source ? createLocation({ source, sourceActor }) : {};
+
+ return dispatch(selectSpecificLocation(location));
+ };
+}
+
+/**
+ * Select a new location.
+ * This will automatically select the source in the source tree (if visible)
+ * and open the source (a new tab and the source editor)
+ * as well as highlight a precise line in the editor.
+ *
+ * Note that by default, this may map your passed location to the original
+ * or generated location based on the selected source state. (see keepContext)
+ *
+ * @param {Object} location
+ * @param {Object} options
+ * @param {boolean} options.keepContext
+ * If false, this will ignore the currently selected source
+ * and select the generated or original location, even if we
+ * were currently selecting the other source type.
+ * @param {boolean} options.highlight
+ * True by default. To be set to false in order to preveng highlighting the selected location in the editor.
+ * We will only show the location, but do not put a special background on the line.
+ */
+export function selectLocation(
+ location,
+ { keepContext = true, highlight = true } = {}
+) {
+ return async thunkArgs => {
+ const { dispatch, getState, client } = thunkArgs;
+
+ if (!client) {
+ // No connection, do nothing. This happens when the debugger is
+ // shut down too fast and it tries to display a default source.
+ return;
+ }
+
+ let source = location.source;
+
+ if (!source) {
+ // If there is no source we deselect the current selected source
+ dispatch(clearSelectedLocation());
+ return;
+ }
+
+ // Preserve the current source map context (original / generated)
+ // when navigating to a new location.
+ // i.e. if keepContext isn't manually overriden to false,
+ // we will convert the source we want to select to either
+ // original/generated in order to match the currently selected one.
+ // If the currently selected source is original, we will
+ // automatically map `location` to refer to the original source,
+ // even if that used to refer only to the generated source.
+ let shouldSelectOriginalLocation = getShouldSelectOriginalLocation(
+ getState()
+ );
+ if (keepContext) {
+ // Pretty print source may not be registered yet and getRelatedMapLocation may not return it.
+ // Wait for the pretty print source to be fully processed.
+ if (
+ !location.source.isOriginal &&
+ shouldSelectOriginalLocation &&
+ hasPrettyTab(getState(), location.source)
+ ) {
+ // Note that prettyPrintAndSelectSource has already been called a bit before when this generated source has been added
+ // but it is a slow operation and is most likely not resolved yet.
+ // prettyPrintAndSelectSource uses memoization to avoid doing the operation more than once, while waiting from both callsites.
+ await dispatch(prettyPrintAndSelectSource(location.source));
+ }
+ if (shouldSelectOriginalLocation != location.source.isOriginal) {
+ // getRelatedMapLocation will convert to the related generated/original location.
+ // i.e if the original location is passed, the related generated location will be returned and vice versa.
+ location = await getRelatedMapLocation(location, thunkArgs);
+ // Note that getRelatedMapLocation may return the exact same location.
+ // For example, if the source-map is half broken, it may return a generated location
+ // while we were selecting original locations. So we may be seeing bundles intermittently
+ // when stepping through broken source maps. And we will see original sources when stepping
+ // through functional original sources.
+
+ source = location.source;
+ }
+ } else {
+ shouldSelectOriginalLocation = location.source.isOriginal;
+ }
+
+ let sourceActor = location.sourceActor;
+ if (!sourceActor) {
+ sourceActor = getFirstSourceActorForGeneratedSource(
+ getState(),
+ source.id
+ );
+ location = createLocation({ ...location, sourceActor });
+ }
+
+ if (!tabExists(getState(), source.id)) {
+ dispatch(addTab(source, sourceActor));
+ }
+
+ dispatch(
+ setSelectedLocation(location, shouldSelectOriginalLocation, highlight)
+ );
+
+ await dispatch(loadSourceText(source, sourceActor));
+
+ // Stop the async work if we started selecting another location
+ if (getSelectedLocation(getState()) != location) {
+ return;
+ }
+
+ await dispatch(setBreakableLines(location));
+
+ // Stop the async work if we started selecting another location
+ if (getSelectedLocation(getState()) != location) {
+ return;
+ }
+
+ const loadedSource = getSource(getState(), source.id);
+
+ if (!loadedSource) {
+ // If there was a navigation while we were loading the loadedSource
+ return;
+ }
+
+ const sourceTextContent = getSourceTextContent(getState(), location);
+
+ if (
+ keepContext &&
+ prefs.autoPrettyPrint &&
+ !getPrettySource(getState(), loadedSource.id) &&
+ canPrettyPrintSource(getState(), location) &&
+ isMinified(source, sourceTextContent)
+ ) {
+ await dispatch(prettyPrintAndSelectSource(loadedSource));
+ dispatch(closeTab(loadedSource));
+ }
+
+ await dispatch(setSymbols(location));
+
+ // Stop the async work if we started selecting another location
+ if (getSelectedLocation(getState()) != location) {
+ return;
+ }
+
+ // /!\ we don't historicaly wait for this async action
+ dispatch(setInScopeLines());
+
+ // When we select a generated source which has a sourcemap,
+ // asynchronously fetch the related original location in order to display
+ // the mapped location in the editor's footer.
+ if (
+ !location.source.isOriginal &&
+ isSourceActorWithSourceMap(getState(), sourceActor.id)
+ ) {
+ let originalLocation = await getOriginalLocation(location, thunkArgs, {
+ looseSearch: true,
+ });
+ // We pass a null original location when the location doesn't map
+ // in order to know when we are done processing the source map.
+ // * `getOriginalLocation` would return the exact same location if it doesn't map
+ // * `getOriginalLocation` may also return a distinct location object,
+ // but refering to the same `source` object (which is the bundle) when it doesn't
+ // map to any known original location.
+ if (originalLocation.source === location.source) {
+ originalLocation = null;
+ }
+ dispatch({
+ type: "SET_ORIGINAL_SELECTED_LOCATION",
+ location,
+ originalLocation,
+ });
+ }
+ };
+}
+
+/**
+ * Select a location while ignoring the currently selected source.
+ * This will select the generated location even if the currently
+ * select source is an original source. And the other way around.
+ *
+ * @param {Object} location
+ * The location to select, object which includes enough
+ * information to specify a precise source, line and column.
+ */
+export function selectSpecificLocation(location) {
+ return selectLocation(location, { keepContext: false });
+}
+
+/**
+ * Similar to `selectSpecificLocation`, but if the precise Source object
+ * is missing, this will fallback to select any source having the same URL.
+ * In this fallback scenario, sources without a URL will be ignored.
+ *
+ * This is typically used when trying to select a source (e.g. in project search result)
+ * after reload, because the source objects are new on each new page load, but source
+ * with the same URL may still exist.
+ *
+ * @param {Object} location
+ * The location to select.
+ * @return {function}
+ * The action will return true if a matching source was found.
+ */
+export function selectSpecificLocationOrSameUrl(location) {
+ return async ({ dispatch, getState }) => {
+ // If this particular source no longer exists, open any matching URL.
+ // This will typically happen on reload.
+ if (!hasSource(getState(), location.source.id)) {
+ // Some sources, like evaled script won't have a URL attribute
+ // and can't be re-selected if we don't find the exact same source object.
+ if (!location.source.url) {
+ return false;
+ }
+ const source = getSourceByURL(getState(), location.source.url);
+ if (!source) {
+ return false;
+ }
+ // Also reset the sourceActor, as it won't match the same source.
+ const sourceActor = getFirstSourceActorForGeneratedSource(
+ getState(),
+ location.source.id
+ );
+ location = createLocation({ ...location, source, sourceActor });
+ } else if (!hasSourceActor(getState(), location.sourceActor.id)) {
+ // If the specific source actor no longer exists, match any still available.
+ const sourceActor = getFirstSourceActorForGeneratedSource(
+ getState(),
+ location.source.id
+ );
+ location = createLocation({ ...location, sourceActor });
+ }
+ await dispatch(selectSpecificLocation(location));
+ return true;
+ };
+}
+
+/**
+ * Select the "mapped location".
+ *
+ * If the passed location is on a generated source, select the
+ * related location in the original source.
+ * If the passed location is on an original source, select the
+ * related location in the generated source.
+ */
+export function jumpToMappedLocation(location) {
+ return async function (thunkArgs) {
+ const { client, dispatch } = thunkArgs;
+ if (!client) {
+ return null;
+ }
+
+ // Map to either an original or a generated source location
+ const pairedLocation = await getRelatedMapLocation(location, thunkArgs);
+
+ return dispatch(selectSpecificLocation(pairedLocation));
+ };
+}
+
+// This is only used by tests
+export function jumpToMappedSelectedLocation() {
+ return async function ({ dispatch, getState }) {
+ const location = getSelectedLocation(getState());
+ if (!location) {
+ return;
+ }
+
+ await dispatch(jumpToMappedLocation(location));
+ };
+}
diff --git a/devtools/client/debugger/src/actions/sources/symbols.js b/devtools/client/debugger/src/actions/sources/symbols.js
new file mode 100644
index 0000000000..c7b9132c32
--- /dev/null
+++ b/devtools/client/debugger/src/actions/sources/symbols.js
@@ -0,0 +1,62 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { getSymbols } from "../../selectors/index";
+
+import { PROMISE } from "../utils/middleware/promise";
+import { loadSourceText } from "./loadSourceText";
+
+import { memoizeableAction } from "../../utils/memoizableAction";
+import { fulfilled } from "../../utils/async-value";
+
+async function doSetSymbols(location, { dispatch, getState, parserWorker }) {
+ await dispatch(loadSourceText(location.source, location.sourceActor));
+
+ await dispatch({
+ type: "SET_SYMBOLS",
+ location,
+ [PROMISE]: parserWorker.getSymbols(location.source.id),
+ });
+}
+
+export const setSymbols = memoizeableAction("setSymbols", {
+ getValue: (location, { getState, parserWorker }) => {
+ if (!parserWorker.isLocationSupported(location)) {
+ return fulfilled(null);
+ }
+
+ const symbols = getSymbols(getState(), location);
+ if (!symbols) {
+ return null;
+ }
+
+ return fulfilled(symbols);
+ },
+ createKey: location => location.source.id,
+ action: (location, thunkArgs) => doSetSymbols(location, thunkArgs),
+});
+
+export function getOriginalFunctionDisplayName(location) {
+ return async ({ parserWorker, dispatch }) => {
+ // Make sure the source for the symbols exist in the parser worker.
+ await dispatch(loadSourceText(location.source, location.sourceActor));
+ return parserWorker.getClosestFunctionName(location);
+ };
+}
+
+export function getFunctionSymbols(location, maxResults) {
+ return async ({ parserWorker, dispatch }) => {
+ // Make sure the source for the symbols exist in the parser worker.
+ await dispatch(loadSourceText(location.source, location.sourceActor));
+ return parserWorker.getFunctionSymbols(location.source.id, maxResults);
+ };
+}
+
+export function getClassSymbols(location) {
+ return async ({ parserWorker, dispatch }) => {
+ // See comment in getFunctionSymbols
+ await dispatch(loadSourceText(location.source, location.sourceActor));
+ return parserWorker.getClassSymbols(location.source.id);
+ };
+}
diff --git a/devtools/client/debugger/src/actions/sources/tests/blackbox.spec.js b/devtools/client/debugger/src/actions/sources/tests/blackbox.spec.js
new file mode 100644
index 0000000000..9a7c69ee32
--- /dev/null
+++ b/devtools/client/debugger/src/actions/sources/tests/blackbox.spec.js
@@ -0,0 +1,247 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import {
+ actions,
+ selectors,
+ createStore,
+ makeSource,
+} from "../../../utils/test-head";
+
+import { initialSourceBlackBoxState } from "../../../reducers/source-blackbox";
+
+describe("blackbox", () => {
+ it("should blackbox and unblackbox a source based on the current state of the source", async () => {
+ const store = createStore({
+ blackBox: async () => true,
+ getSourceActorBreakableLines: async () => [],
+ });
+ const { dispatch, getState } = store;
+
+ const fooSource = await dispatch(
+ actions.newGeneratedSource(makeSource("foo"))
+ );
+ await dispatch(actions.toggleBlackBox(fooSource));
+
+ expect(selectors.isSourceBlackBoxed(getState(), fooSource)).toEqual(true);
+
+ let blackboxRanges = selectors.getBlackBoxRanges(getState());
+ expect(blackboxRanges[fooSource.url]).toEqual([]);
+
+ await dispatch(actions.toggleBlackBox(fooSource));
+
+ expect(selectors.isSourceBlackBoxed(getState(), fooSource)).toEqual(false);
+
+ blackboxRanges = selectors.getBlackBoxRanges(getState());
+ expect(blackboxRanges[fooSource.url]).toEqual(undefined);
+ });
+
+ it("should blackbox and unblackbox a source when explicilty specified", async () => {
+ const store = createStore({
+ blackBox: async () => true,
+ getSourceActorBreakableLines: async () => [],
+ });
+ const { dispatch, getState } = store;
+
+ const fooSource = await dispatch(
+ actions.newGeneratedSource(makeSource("foo"))
+ );
+
+ // check the state before trying to blackbox
+ expect(selectors.isSourceBlackBoxed(getState(), fooSource)).toEqual(false);
+
+ let blackboxRanges = selectors.getBlackBoxRanges(getState());
+ expect(blackboxRanges[fooSource.url]).toEqual(undefined);
+
+ // should blackbox the whole source
+ await dispatch(actions.toggleBlackBox(fooSource, true, []));
+
+ expect(selectors.isSourceBlackBoxed(getState(), fooSource)).toEqual(true);
+
+ blackboxRanges = selectors.getBlackBoxRanges(getState());
+ expect(blackboxRanges[fooSource.url]).toEqual([]);
+
+ // should unblackbox the whole source
+ await dispatch(actions.toggleBlackBox(fooSource, false, []));
+
+ expect(selectors.isSourceBlackBoxed(getState(), fooSource)).toEqual(false);
+
+ blackboxRanges = selectors.getBlackBoxRanges(getState());
+ expect(blackboxRanges[fooSource.url]).toEqual(undefined);
+ });
+
+ it("should blackbox and unblackbox lines in a source", async () => {
+ const store = createStore({
+ blackBox: async () => true,
+ getSourceActorBreakableLines: async () => [],
+ });
+ const { dispatch, getState } = store;
+
+ const fooSource = await dispatch(
+ actions.newGeneratedSource(makeSource("foo"))
+ );
+
+ const range1 = {
+ start: { line: 10, column: 3 },
+ end: { line: 15, column: 4 },
+ };
+
+ const range2 = {
+ start: { line: 5, column: 3 },
+ end: { line: 7, column: 6 },
+ };
+
+ await dispatch(actions.toggleBlackBox(fooSource, true, [range1]));
+
+ expect(selectors.isSourceBlackBoxed(getState(), fooSource)).toEqual(true);
+
+ let blackboxRanges = selectors.getBlackBoxRanges(getState());
+ expect(blackboxRanges[fooSource.url]).toEqual([range1]);
+
+ // add new blackbox lines in the second range
+ await dispatch(actions.toggleBlackBox(fooSource, true, [range2]));
+
+ expect(selectors.isSourceBlackBoxed(getState(), fooSource)).toEqual(true);
+
+ blackboxRanges = selectors.getBlackBoxRanges(getState());
+ // ranges are stored asc order
+ expect(blackboxRanges[fooSource.url]).toEqual([range2, range1]);
+
+ // un-blackbox lines in the first range
+ await dispatch(actions.toggleBlackBox(fooSource, false, [range1]));
+
+ expect(selectors.isSourceBlackBoxed(getState(), fooSource)).toEqual(true);
+
+ blackboxRanges = selectors.getBlackBoxRanges(getState());
+ expect(blackboxRanges[fooSource.url]).toEqual([range2]);
+
+ // un-blackbox lines in the second range
+ await dispatch(actions.toggleBlackBox(fooSource, false, [range2]));
+
+ expect(selectors.isSourceBlackBoxed(getState(), fooSource)).toEqual(false);
+
+ blackboxRanges = selectors.getBlackBoxRanges(getState());
+ expect(blackboxRanges[fooSource.url]).toEqual(undefined);
+ });
+
+ it("should undo blackboxed lines when whole source unblackboxed", async () => {
+ const store = createStore({
+ blackBox: async () => true,
+ getSourceActorBreakableLines: async () => [],
+ });
+ const { dispatch, getState } = store;
+
+ const fooSource = await dispatch(
+ actions.newGeneratedSource(makeSource("foo"))
+ );
+
+ const range1 = {
+ start: { line: 1, column: 5 },
+ end: { line: 3, column: 4 },
+ };
+
+ const range2 = {
+ start: { line: 5, column: 3 },
+ end: { line: 7, column: 6 },
+ };
+
+ await dispatch(actions.toggleBlackBox(fooSource, true, [range1, range2]));
+
+ expect(selectors.isSourceBlackBoxed(getState(), fooSource)).toEqual(true);
+
+ let blackboxRanges = selectors.getBlackBoxRanges(getState());
+ // The ranges are ordered in based on the lines & cols in ascending
+ expect(blackboxRanges[fooSource.url]).toEqual([range2, range1]);
+
+ // un-blackbox the whole source
+ await dispatch(actions.toggleBlackBox(fooSource));
+
+ expect(selectors.isSourceBlackBoxed(getState(), fooSource)).toEqual(false);
+
+ blackboxRanges = selectors.getBlackBoxRanges(getState());
+ expect(blackboxRanges[fooSource.url]).toEqual(undefined);
+ });
+
+ it("should restore the blackboxed state correctly debugger load", async () => {
+ const mockAsyncStoreBlackBoxedRanges = {
+ "http://localhost:8000/examples/foo": [
+ {
+ start: { line: 1, column: 5 },
+ end: { line: 3, column: 4 },
+ },
+ ],
+ };
+
+ function loadInitialState() {
+ const blackboxedRanges = mockAsyncStoreBlackBoxedRanges;
+ return {
+ sourceBlackBox: initialSourceBlackBoxState({ blackboxedRanges }),
+ };
+ }
+ const store = createStore(
+ {
+ blackBox: async () => true,
+ getSourceActorBreakableLines: async () => [],
+ },
+ loadInitialState()
+ );
+ const { dispatch, getState } = store;
+
+ const fooSource = await dispatch(
+ actions.newGeneratedSource(makeSource("foo"))
+ );
+
+ expect(selectors.isSourceBlackBoxed(getState(), fooSource)).toEqual(true);
+
+ const blackboxRanges = selectors.getBlackBoxRanges(getState());
+ const mockFooSourceRange = mockAsyncStoreBlackBoxedRanges[fooSource.url];
+ expect(blackboxRanges[fooSource.url]).toEqual(mockFooSourceRange);
+ });
+
+ it("should unblackbox lines after blackboxed state has been restored", async () => {
+ const mockAsyncStoreBlackBoxedRanges = {
+ "http://localhost:8000/examples/foo": [
+ {
+ start: { line: 1, column: 5 },
+ end: { line: 3, column: 4 },
+ },
+ ],
+ };
+
+ function loadInitialState() {
+ const blackboxedRanges = mockAsyncStoreBlackBoxedRanges;
+ return {
+ sourceBlackBox: initialSourceBlackBoxState({ blackboxedRanges }),
+ };
+ }
+ const store = createStore(
+ {
+ blackBox: async () => true,
+ getSourceActorBreakableLines: async () => [],
+ },
+ loadInitialState()
+ );
+ const { dispatch, getState } = store;
+
+ const fooSource = await dispatch(
+ actions.newGeneratedSource(makeSource("foo"))
+ );
+
+ expect(selectors.isSourceBlackBoxed(getState(), fooSource)).toEqual(true);
+
+ let blackboxRanges = selectors.getBlackBoxRanges(getState());
+ const mockFooSourceRange = mockAsyncStoreBlackBoxedRanges[fooSource.url];
+ expect(blackboxRanges[fooSource.url]).toEqual(mockFooSourceRange);
+
+ //unblackbox the blackboxed line
+ await dispatch(
+ actions.toggleBlackBox(fooSource, false, mockFooSourceRange)
+ );
+
+ expect(selectors.isSourceBlackBoxed(getState(), fooSource)).toEqual(false);
+
+ blackboxRanges = selectors.getBlackBoxRanges(getState());
+ expect(blackboxRanges[fooSource.url]).toEqual(undefined);
+ });
+});
diff --git a/devtools/client/debugger/src/actions/sources/tests/loadSource.spec.js b/devtools/client/debugger/src/actions/sources/tests/loadSource.spec.js
new file mode 100644
index 0000000000..8de08eb8a8
--- /dev/null
+++ b/devtools/client/debugger/src/actions/sources/tests/loadSource.spec.js
@@ -0,0 +1,216 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import {
+ actions,
+ selectors,
+ watchForState,
+ createStore,
+ makeSource,
+} from "../../../utils/test-head";
+import { mockCommandClient } from "../../tests/helpers/mockCommandClient";
+import { isFulfilled, isRejected } from "../../../utils/async-value";
+import { createLocation } from "../../../utils/location";
+
+describe("loadGeneratedSourceText", () => {
+ it("should load source text", async () => {
+ const store = createStore(mockCommandClient);
+ const { dispatch, getState } = store;
+
+ const foo1Source = await dispatch(
+ actions.newGeneratedSource(makeSource("foo1"))
+ );
+ const foo1SourceActor = selectors.getFirstSourceActorForGeneratedSource(
+ getState(),
+ foo1Source.id
+ );
+ await dispatch(actions.loadGeneratedSourceText(foo1SourceActor));
+
+ const foo1Content = selectors.getSettledSourceTextContent(
+ getState(),
+ createLocation({
+ source: foo1Source,
+ sourceActor: foo1SourceActor,
+ })
+ );
+
+ expect(
+ foo1Content &&
+ isFulfilled(foo1Content) &&
+ foo1Content.value.type === "text"
+ ? foo1Content.value.value.indexOf("return foo1")
+ : -1
+ ).not.toBe(-1);
+
+ const foo2Source = await dispatch(
+ actions.newGeneratedSource(makeSource("foo2"))
+ );
+ const foo2SourceActor = selectors.getFirstSourceActorForGeneratedSource(
+ getState(),
+ foo2Source.id
+ );
+
+ await dispatch(actions.loadGeneratedSourceText(foo2SourceActor));
+
+ const foo2Content = selectors.getSettledSourceTextContent(
+ getState(),
+ createLocation({
+ source: foo2Source,
+ sourceActor: foo2SourceActor,
+ })
+ );
+
+ expect(
+ foo2Content &&
+ isFulfilled(foo2Content) &&
+ foo2Content.value.type === "text"
+ ? foo2Content.value.value.indexOf("return foo2")
+ : -1
+ ).not.toBe(-1);
+ });
+
+ it("loads two sources w/ one request", async () => {
+ let resolve;
+ let count = 0;
+ const { dispatch, getState } = createStore({
+ sourceContents: () =>
+ new Promise(r => {
+ count++;
+ resolve = r;
+ }),
+ getSourceActorBreakpointPositions: async () => ({}),
+ getSourceActorBreakableLines: async () => [],
+ });
+ const id = "foo";
+
+ const source = await dispatch(actions.newGeneratedSource(makeSource(id)));
+ const sourceActor = selectors.getFirstSourceActorForGeneratedSource(
+ getState(),
+ source.id
+ );
+
+ dispatch(actions.loadGeneratedSourceText(sourceActor));
+
+ const loading = dispatch(actions.loadGeneratedSourceText(sourceActor));
+
+ if (!resolve) {
+ throw new Error("no resolve");
+ }
+ resolve({ source: "yay", contentType: "text/javascript" });
+ await loading;
+ expect(count).toEqual(1);
+
+ const content = selectors.getSettledSourceTextContent(
+ getState(),
+ createLocation({
+ source,
+ sourceActor,
+ })
+ );
+ expect(
+ content &&
+ isFulfilled(content) &&
+ content.value.type === "text" &&
+ content.value.value
+ ).toEqual("yay");
+ });
+
+ it("doesn't re-load loaded sources", async () => {
+ let resolve;
+ let count = 0;
+ const { dispatch, getState } = createStore({
+ sourceContents: () =>
+ new Promise(r => {
+ count++;
+ resolve = r;
+ }),
+ getSourceActorBreakpointPositions: async () => ({}),
+ getSourceActorBreakableLines: async () => [],
+ });
+ const id = "foo";
+
+ const source = await dispatch(actions.newGeneratedSource(makeSource(id)));
+ const sourceActor = selectors.getFirstSourceActorForGeneratedSource(
+ getState(),
+ source.id
+ );
+ const loading = dispatch(actions.loadGeneratedSourceText(sourceActor));
+
+ if (!resolve) {
+ throw new Error("no resolve");
+ }
+ resolve({ source: "yay", contentType: "text/javascript" });
+ await loading;
+
+ await dispatch(actions.loadGeneratedSourceText(sourceActor));
+ expect(count).toEqual(1);
+
+ const content = selectors.getSettledSourceTextContent(
+ getState(),
+ createLocation({
+ source,
+ sourceActor,
+ })
+ );
+ expect(
+ content &&
+ isFulfilled(content) &&
+ content.value.type === "text" &&
+ content.value.value
+ ).toEqual("yay");
+ });
+
+ it("should indicate a loading source", async () => {
+ const store = createStore(mockCommandClient);
+ const { dispatch, getState } = store;
+
+ const source = await dispatch(
+ actions.newGeneratedSource(makeSource("foo2"))
+ );
+
+ const sourceActor = selectors.getFirstSourceActorForGeneratedSource(
+ getState(),
+ source.id
+ );
+
+ const wasLoading = watchForState(store, state => {
+ return !selectors.getSettledSourceTextContent(
+ state,
+ createLocation({
+ source,
+ sourceActor,
+ })
+ );
+ });
+ await dispatch(actions.loadGeneratedSourceText(sourceActor));
+
+ expect(wasLoading()).toBe(true);
+ });
+
+ it("should indicate an errored source text", async () => {
+ const { dispatch, getState } = createStore(mockCommandClient);
+
+ const source = await dispatch(
+ actions.newGeneratedSource(makeSource("bad-id"))
+ );
+ const sourceActor = selectors.getFirstSourceActorForGeneratedSource(
+ getState(),
+ source.id
+ );
+ await dispatch(actions.loadGeneratedSourceText(sourceActor));
+
+ const content = selectors.getSettledSourceTextContent(
+ getState(),
+ createLocation({
+ source,
+ sourceActor,
+ })
+ );
+ expect(
+ content && isRejected(content) && typeof content.value === "string"
+ ? content.value.indexOf("sourceContents failed")
+ : -1
+ ).not.toBe(-1);
+ });
+});
diff --git a/devtools/client/debugger/src/actions/sources/tests/newSources.spec.js b/devtools/client/debugger/src/actions/sources/tests/newSources.spec.js
new file mode 100644
index 0000000000..cef9eca31e
--- /dev/null
+++ b/devtools/client/debugger/src/actions/sources/tests/newSources.spec.js
@@ -0,0 +1,103 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import {
+ actions,
+ selectors,
+ createStore,
+ makeSource,
+ makeSourceURL,
+ makeOriginalSource,
+} from "../../../utils/test-head";
+const { getSource, getSourceCount, getSelectedSource } = selectors;
+
+import { mockCommandClient } from "../../tests/helpers/mockCommandClient";
+
+describe("sources - new sources", () => {
+ it("should add sources to state", async () => {
+ const { dispatch, getState } = createStore(mockCommandClient);
+ await dispatch(actions.newGeneratedSource(makeSource("base.js")));
+ await dispatch(actions.newGeneratedSource(makeSource("jquery.js")));
+
+ expect(getSourceCount(getState())).toEqual(2);
+ const base = getSource(getState(), "base.js");
+ const jquery = getSource(getState(), "jquery.js");
+ expect(base && base.id).toEqual("base.js");
+ expect(jquery && jquery.id).toEqual("jquery.js");
+ });
+
+ it("should not add multiple identical generated sources", async () => {
+ const { dispatch, getState } = createStore(mockCommandClient);
+
+ const generated = await dispatch(
+ actions.newGeneratedSource(makeSource("base.js"))
+ );
+
+ await dispatch(actions.newOriginalSources([makeOriginalSource(generated)]));
+ await dispatch(actions.newOriginalSources([makeOriginalSource(generated)]));
+
+ expect(getSourceCount(getState())).toEqual(2);
+ });
+
+ it("should not add multiple identical original sources", async () => {
+ const { dispatch, getState } = createStore(mockCommandClient);
+
+ await dispatch(actions.newGeneratedSource(makeSource("base.js")));
+ await dispatch(actions.newGeneratedSource(makeSource("base.js")));
+
+ expect(getSourceCount(getState())).toEqual(1);
+ });
+
+ it("should automatically select a pending source", async () => {
+ const { dispatch, getState } = createStore(mockCommandClient);
+ const baseSourceURL = makeSourceURL("base.js");
+ await dispatch(actions.selectSourceURL(baseSourceURL));
+
+ expect(getSelectedSource(getState())).toBe(undefined);
+ const baseSource = await dispatch(
+ actions.newGeneratedSource(makeSource("base.js"))
+ );
+
+ const selected = getSelectedSource(getState());
+ expect(selected && selected.url).toBe(baseSource.url);
+ });
+
+ // eslint-disable-next-line
+ it("should not attempt to fetch original sources if it's missing a source map url", async () => {
+ const loadSourceMap = jest.fn();
+ const { dispatch } = createStore(
+ mockCommandClient,
+ {},
+ {
+ loadSourceMap,
+ getOriginalLocations: async items => items,
+ getOriginalLocation: location => location,
+ }
+ );
+
+ await dispatch(actions.newGeneratedSource(makeSource("base.js")));
+ expect(loadSourceMap).not.toHaveBeenCalled();
+ });
+
+ // eslint-disable-next-line
+ it("should process new sources immediately, without waiting for source maps to be fetched first", async () => {
+ const { dispatch, getState } = createStore(
+ mockCommandClient,
+ {},
+ {
+ loadSourceMap: async () => new Promise(_ => {}),
+ getOriginalLocations: async items => items,
+ getOriginalLocation: location => location,
+ }
+ );
+ await dispatch(
+ actions.newGeneratedSource(
+ makeSource("base.js", { sourceMapURL: "base.js.map" })
+ )
+ );
+ expect(getSourceCount(getState())).toEqual(1);
+ const base = getSource(getState(), "base.js");
+ expect(base && base.id).toEqual("base.js");
+ });
+});
diff --git a/devtools/client/debugger/src/actions/sources/tests/select.spec.js b/devtools/client/debugger/src/actions/sources/tests/select.spec.js
new file mode 100644
index 0000000000..5f4feba6c0
--- /dev/null
+++ b/devtools/client/debugger/src/actions/sources/tests/select.spec.js
@@ -0,0 +1,195 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import {
+ actions,
+ selectors,
+ createStore,
+ createSourceObject,
+ makeSource,
+ makeSourceURL,
+ waitForState,
+ makeOriginalSource,
+} from "../../../utils/test-head";
+import {
+ getSourceCount,
+ getSelectedSource,
+ getSourceTabs,
+ getSelectedLocation,
+ getSymbols,
+} from "../../../selectors/";
+import { createLocation } from "../../../utils/location";
+
+import { mockCommandClient } from "../../tests/helpers/mockCommandClient";
+
+process.on("unhandledRejection", (reason, p) => {});
+
+function initialLocation(sourceId) {
+ return createLocation({ source: createSourceObject(sourceId), line: 1 });
+}
+
+describe("sources", () => {
+ it("should open a tab for the source", async () => {
+ const { dispatch, getState } = createStore(mockCommandClient);
+ await dispatch(actions.newGeneratedSource(makeSource("foo.js")));
+ await dispatch(actions.selectLocation(initialLocation("foo.js")));
+
+ const tabs = getSourceTabs(getState());
+ expect(tabs).toHaveLength(1);
+ expect(tabs[0].url).toEqual("http://localhost:8000/examples/foo.js");
+ });
+
+ it("should keep the selected source when other tab closed", async () => {
+ const { dispatch, getState } = createStore(mockCommandClient);
+
+ await dispatch(actions.newGeneratedSource(makeSource("foo.js")));
+ await dispatch(actions.newGeneratedSource(makeSource("bar.js")));
+ const bazSource = await dispatch(
+ actions.newGeneratedSource(makeSource("baz.js"))
+ );
+
+ // 3rd tab
+ await dispatch(actions.selectLocation(initialLocation("foo.js")));
+
+ // 2nd tab
+ await dispatch(actions.selectLocation(initialLocation("bar.js")));
+
+ // 1st tab
+ await dispatch(actions.selectLocation(initialLocation("baz.js")));
+
+ // 3rd tab is reselected
+ await dispatch(actions.selectLocation(initialLocation("foo.js")));
+ await dispatch(actions.closeTab(bazSource));
+
+ const selected = getSelectedSource(getState());
+ expect(selected && selected.id).toBe("foo.js");
+ expect(getSourceTabs(getState())).toHaveLength(2);
+ });
+
+ it("should not select new sources that lack a URL", async () => {
+ const { dispatch, getState } = createStore(mockCommandClient);
+
+ await dispatch(
+ actions.newGeneratedSource({
+ ...makeSource("foo"),
+ url: "",
+ })
+ );
+
+ expect(getSourceCount(getState())).toEqual(1);
+ const selectedLocation = getSelectedLocation(getState());
+ expect(selectedLocation).toEqual(undefined);
+ });
+
+ it("sets and clears selected location correctly", async () => {
+ const { dispatch, getState } = createStore(mockCommandClient);
+ const source = await dispatch(
+ actions.newGeneratedSource(makeSource("testSource"))
+ );
+ const location = createLocation({ source });
+
+ // set value
+ dispatch(actions.setSelectedLocation(location));
+ expect(getSelectedLocation(getState())).toEqual({
+ ...location,
+ });
+
+ // clear value
+ dispatch(actions.clearSelectedLocation());
+ expect(getSelectedLocation(getState())).toEqual(null);
+ });
+
+ it("sets and clears pending selected location correctly", () => {
+ const { dispatch, getState } = createStore(mockCommandClient);
+ const url = "testURL";
+ const options = { line: "testLine", column: "testColumn" };
+
+ // set value
+ dispatch(actions.setPendingSelectedLocation(url, options));
+ const setResult = getState().sources.pendingSelectedLocation;
+ expect(setResult).toEqual({
+ url,
+ line: options.line,
+ column: options.column,
+ });
+
+ // clear value
+ dispatch(actions.clearSelectedLocation());
+ const clearResult = getState().sources.pendingSelectedLocation;
+ expect(clearResult).toEqual({ url: "" });
+ });
+
+ it("should keep the generated the viewing context", async () => {
+ const store = createStore(mockCommandClient);
+ const { dispatch, getState } = store;
+ const baseSource = await dispatch(
+ actions.newGeneratedSource(makeSource("base.js"))
+ );
+ const sourceActor = selectors.getFirstSourceActorForGeneratedSource(
+ getState(),
+ baseSource.id
+ );
+
+ const location = createLocation({
+ source: baseSource,
+ line: 1,
+ sourceActor,
+ });
+ await dispatch(actions.selectLocation(location));
+
+ const selected = getSelectedSource(getState());
+ expect(selected && selected.id).toBe(baseSource.id);
+ await waitForState(store, state => getSymbols(state, location));
+ });
+
+ it("should change the original the viewing context", async () => {
+ const { dispatch, getState } = createStore(
+ mockCommandClient,
+ {},
+ {
+ getOriginalLocation: async location => ({ ...location, line: 12 }),
+ getOriginalLocations: async items => items,
+ getGeneratedRangesForOriginal: async () => [],
+ getOriginalSourceText: async () => ({ text: "" }),
+ }
+ );
+
+ const baseGenSource = await dispatch(
+ actions.newGeneratedSource(makeSource("base.js"))
+ );
+
+ const baseSources = await dispatch(
+ actions.newOriginalSources([makeOriginalSource(baseGenSource)])
+ );
+ await dispatch(actions.selectSource(baseSources[0]));
+
+ await dispatch(
+ actions.selectSpecificLocation(
+ createLocation({
+ source: baseSources[0],
+ line: 1,
+ })
+ )
+ );
+
+ const selected = getSelectedLocation(getState());
+ expect(selected && selected.line).toBe(1);
+ });
+
+ describe("selectSourceURL", () => {
+ it("should automatically select a pending source", async () => {
+ const { dispatch, getState } = createStore(mockCommandClient);
+ const baseSourceURL = makeSourceURL("base.js");
+ await dispatch(actions.selectSourceURL(baseSourceURL));
+
+ expect(getSelectedSource(getState())).toBe(undefined);
+ const baseSource = await dispatch(
+ actions.newGeneratedSource(makeSource("base.js"))
+ );
+
+ const selected = getSelectedSource(getState());
+ expect(selected && selected.url).toBe(baseSource.url);
+ });
+ });
+});
diff --git a/devtools/client/debugger/src/actions/tabs.js b/devtools/client/debugger/src/actions/tabs.js
new file mode 100644
index 0000000000..c397b30919
--- /dev/null
+++ b/devtools/client/debugger/src/actions/tabs.js
@@ -0,0 +1,104 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Redux actions for the editor tabs
+ */
+
+import { removeDocument } from "../utils/editor/index";
+import { selectSource } from "./sources/index";
+
+import { getSelectedLocation, getSourcesForTabs } from "../selectors/index";
+
+export function addTab(source, sourceActor) {
+ return {
+ type: "ADD_TAB",
+ source,
+ sourceActor,
+ };
+}
+
+export function moveTab(url, tabIndex) {
+ return {
+ type: "MOVE_TAB",
+ url,
+ tabIndex,
+ };
+}
+
+export function moveTabBySourceId(sourceId, tabIndex) {
+ return {
+ type: "MOVE_TAB_BY_SOURCE_ID",
+ sourceId,
+ tabIndex,
+ };
+}
+
+export function closeTab(source) {
+ return closeTabs([source]);
+}
+
+export function closeTabs(sources) {
+ return ({ dispatch, getState }) => {
+ if (!sources.length) {
+ return;
+ }
+
+ for (const source of sources) {
+ removeDocument(source.id);
+ }
+
+ // If we are removing the tabs for the selected location,
+ // we need to select another source
+ const newSourceToSelect = getNewSourceToSelect(getState(), sources);
+
+ dispatch({ type: "CLOSE_TABS", sources });
+
+ dispatch(selectSource(newSourceToSelect));
+ };
+}
+
+/**
+ * Compute the potential new source to select while closing tabs for a given set of sources.
+ *
+ * @param {Object} state
+ * Redux state object.
+ * @param {Array<Source>} closedTabsSources
+ * Ordered list of source object for which tabs should be closed.
+ * Should be a consecutive list of source matching the order of tabs reducer.
+ */
+function getNewSourceToSelect(state, closedTabsSources) {
+ const selectedLocation = getSelectedLocation(state);
+ // Do not try to select any source if none was selected before
+ if (!selectedLocation) {
+ return null;
+ }
+ // Keep selecting the same source if we aren't removing the currently selected source
+ if (!closedTabsSources.includes(selectedLocation.source)) {
+ return selectedLocation.source;
+ }
+ const tabsSources = getSourcesForTabs(state);
+ // Assume that `sources` is a consecutive list of tab's sources
+ // ordered in the same way as `tabsSources`.
+ const lastRemovedTabSource = closedTabsSources.at(-1);
+ const lastRemovedTabIndex = tabsSources.indexOf(lastRemovedTabSource);
+ if (lastRemovedTabIndex == -1) {
+ // This is unexpected, do not try to select any source.
+ return null;
+ }
+ // If there is some tabs after the last removed tab, select the first one.
+ if (lastRemovedTabIndex + 1 < tabsSources.length) {
+ return tabsSources[lastRemovedTabIndex + 1];
+ }
+
+ // If there is some tabs before the first removed tab, select the last one.
+ const firstRemovedTabIndex =
+ lastRemovedTabIndex - (closedTabsSources.length - 1);
+ if (firstRemovedTabIndex > 0) {
+ return tabsSources[firstRemovedTabIndex - 1];
+ }
+
+ // It looks like we removed all the tabs
+ return null;
+}
diff --git a/devtools/client/debugger/src/actions/tests/__snapshots__/expressions.spec.js.snap b/devtools/client/debugger/src/actions/tests/__snapshots__/expressions.spec.js.snap
new file mode 100644
index 0000000000..f27eb26f50
--- /dev/null
+++ b/devtools/client/debugger/src/actions/tests/__snapshots__/expressions.spec.js.snap
@@ -0,0 +1,11 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`expressions should get the autocomplete matches for the input 1`] = `
+Array [
+ "toLocaleString",
+ "toSource",
+ "toString",
+ "toolbar",
+ "top",
+]
+`;
diff --git a/devtools/client/debugger/src/actions/tests/__snapshots__/pending-breakpoints.spec.js.snap b/devtools/client/debugger/src/actions/tests/__snapshots__/pending-breakpoints.spec.js.snap
new file mode 100644
index 0000000000..4119cbc875
--- /dev/null
+++ b/devtools/client/debugger/src/actions/tests/__snapshots__/pending-breakpoints.spec.js.snap
@@ -0,0 +1,30 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`initializing when pending breakpoints exist in prefs syncs pending breakpoints 1`] = `
+Object {
+ "http://localhost:8000/examples/bar.js:5:2": Object {
+ "astLocation": Object {
+ "index": 0,
+ "name": undefined,
+ "offset": Object {
+ "line": 5,
+ },
+ },
+ "disabled": false,
+ "generatedLocation": Object {
+ "column": 2,
+ "line": 5,
+ "sourceUrl": "http://localhost:8000/examples/bar.js",
+ },
+ "location": Object {
+ "column": 2,
+ "line": 5,
+ "sourceUrl": "http://localhost:8000/examples/bar.js",
+ },
+ "options": Object {
+ "condition": null,
+ "hidden": false,
+ },
+ },
+}
+`;
diff --git a/devtools/client/debugger/src/actions/tests/expressions.spec.js b/devtools/client/debugger/src/actions/tests/expressions.spec.js
new file mode 100644
index 0000000000..c69276fa40
--- /dev/null
+++ b/devtools/client/debugger/src/actions/tests/expressions.spec.js
@@ -0,0 +1,136 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { actions, selectors, createStore } from "../../utils/test-head";
+
+const mockThreadFront = {
+ evaluate: (script, { frameId }) =>
+ new Promise((resolve, reject) => {
+ if (!frameId) {
+ resolve("bla");
+ } else {
+ resolve("boo");
+ }
+ }),
+ evaluateExpressions: (inputs, { frameId }) =>
+ Promise.all(
+ inputs.map(
+ input =>
+ new Promise((resolve, reject) => {
+ if (!frameId) {
+ resolve("bla");
+ } else {
+ resolve("boo");
+ }
+ })
+ )
+ ),
+ getFrameScopes: async () => {},
+ getFrames: async () => [],
+ sourceContents: () => ({ source: "", contentType: "text/javascript" }),
+ getSourceActorBreakpointPositions: async () => ({}),
+ getSourceActorBreakableLines: async () => [],
+ autocomplete: () => {
+ return new Promise(resolve => {
+ resolve({
+ from: "foo",
+ matches: ["toLocaleString", "toSource", "toString", "toolbar", "top"],
+ matchProp: "to",
+ });
+ });
+ },
+};
+
+describe("expressions", () => {
+ it("should add an expression", async () => {
+ const { dispatch, getState } = createStore(mockThreadFront);
+
+ await dispatch(actions.addExpression("foo"));
+ expect(selectors.getExpressions(getState())).toHaveLength(1);
+ });
+
+ it("should not add empty expressions", () => {
+ const { dispatch, getState } = createStore(mockThreadFront);
+
+ dispatch(actions.addExpression(undefined));
+ dispatch(actions.addExpression(""));
+ expect(selectors.getExpressions(getState())).toHaveLength(0);
+ });
+
+ it("should add invalid expressions", async () => {
+ const { dispatch, getState } = createStore(mockThreadFront);
+ await dispatch(actions.addExpression("foo#"));
+ const state = getState();
+ expect(selectors.getExpressions(state)).toHaveLength(1);
+ });
+
+ it("should update an expression", async () => {
+ const { dispatch, getState } = createStore(mockThreadFront);
+
+ await dispatch(actions.addExpression("foo"));
+ const expression = selectors.getExpression(getState(), "foo");
+ if (!expression) {
+ throw new Error("expression must exist");
+ }
+
+ await dispatch(actions.updateExpression("bar", expression));
+ const bar = selectors.getExpression(getState(), "bar");
+
+ expect(bar && bar.input).toBe("bar");
+ });
+
+ it("should not update an expression w/ invalid code", async () => {
+ const { dispatch, getState } = createStore(mockThreadFront);
+
+ await dispatch(actions.addExpression("foo"));
+ const expression = selectors.getExpression(getState(), "foo");
+ if (!expression) {
+ throw new Error("expression must exist");
+ }
+ await dispatch(actions.updateExpression("#bar", expression));
+ expect(selectors.getExpression(getState(), "bar")).toBeUndefined();
+ });
+
+ it("should delete an expression", async () => {
+ const { dispatch, getState } = createStore(mockThreadFront);
+
+ await dispatch(actions.addExpression("foo"));
+ await dispatch(actions.addExpression("bar"));
+ expect(selectors.getExpressions(getState())).toHaveLength(2);
+
+ const expression = selectors.getExpression(getState(), "foo");
+
+ if (!expression) {
+ throw new Error("expression must exist");
+ }
+
+ const bar = selectors.getExpression(getState(), "bar");
+ dispatch(actions.deleteExpression(expression));
+ expect(selectors.getExpressions(getState())).toHaveLength(1);
+ expect(bar && bar.input).toBe("bar");
+ });
+
+ it("should evaluate expressions global scope", async () => {
+ const { dispatch, getState } = createStore(mockThreadFront);
+ await dispatch(actions.addExpression("foo"));
+ await dispatch(actions.addExpression("bar"));
+
+ let foo = selectors.getExpression(getState(), "foo");
+ let bar = selectors.getExpression(getState(), "bar");
+ expect(foo && foo.value).toBe("bla");
+ expect(bar && bar.value).toBe("bla");
+
+ await dispatch(actions.evaluateExpressions(null));
+ foo = selectors.getExpression(getState(), "foo");
+ bar = selectors.getExpression(getState(), "bar");
+ expect(foo && foo.value).toBe("bla");
+ expect(bar && bar.value).toBe("bla");
+ });
+
+ it("should get the autocomplete matches for the input", async () => {
+ const { dispatch, getState } = createStore(mockThreadFront);
+ await dispatch(actions.autocomplete("to", 2));
+ expect(selectors.getAutocompleteMatchset(getState())).toMatchSnapshot();
+ });
+});
diff --git a/devtools/client/debugger/src/actions/tests/helpers/breakpoints.js b/devtools/client/debugger/src/actions/tests/helpers/breakpoints.js
new file mode 100644
index 0000000000..84eb83e23f
--- /dev/null
+++ b/devtools/client/debugger/src/actions/tests/helpers/breakpoints.js
@@ -0,0 +1,65 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { createLocation } from "../../../utils/location";
+
+export function mockPendingBreakpoint(overrides = {}) {
+ const { sourceUrl, line, column, condition, disabled, hidden } = overrides;
+ return {
+ location: {
+ sourceUrl: sourceUrl || "http://localhost:8000/examples/bar.js",
+ line: line || 5,
+ column: column || 1,
+ },
+ generatedLocation: {
+ sourceUrl: sourceUrl || "http://localhost:8000/examples/bar.js",
+ line: line || 5,
+ column: column || 1,
+ },
+ astLocation: {
+ name: undefined,
+ offset: {
+ line: line || 5,
+ },
+ index: 0,
+ },
+ options: {
+ condition: condition || null,
+ hidden: hidden || false,
+ },
+ disabled: disabled || false,
+ };
+}
+
+export function generateBreakpoint(filename, line = 5, column = 0) {
+ return {
+ id: "breakpoint",
+ originalText: "",
+ text: "",
+ location: createLocation({
+ source: {
+ url: `http://localhost:8000/examples/${filename}`,
+ id: filename,
+ },
+ sourceId: filename,
+ line,
+ column,
+ }),
+ generatedLocation: createLocation({
+ source: {
+ url: `http://localhost:8000/examples/${filename}`,
+ id: filename,
+ },
+ sourceId: filename,
+ line,
+ column,
+ }),
+ astLocation: undefined,
+ options: {
+ condition: "",
+ hidden: false,
+ },
+ disabled: false,
+ };
+}
diff --git a/devtools/client/debugger/src/actions/tests/helpers/mockCommandClient.js b/devtools/client/debugger/src/actions/tests/helpers/mockCommandClient.js
new file mode 100644
index 0000000000..38dd55c274
--- /dev/null
+++ b/devtools/client/debugger/src/actions/tests/helpers/mockCommandClient.js
@@ -0,0 +1,49 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+export function createSource(name, code) {
+ name = name.replace(/\..*$/, "");
+ return {
+ source: code || `function ${name}() {\n return ${name} \n}`,
+ contentType: "text/javascript",
+ };
+}
+
+const sources = [
+ "a",
+ "b",
+ "foo",
+ "bar",
+ "foo1",
+ "foo2",
+ "a.js",
+ "baz.js",
+ "foobar.js",
+ "barfoo.js",
+ "foo.js",
+ "bar.js",
+ "base.js",
+ "bazz.js",
+ "jquery.js",
+];
+
+export const mockCommandClient = {
+ sourceContents: function ({ source }) {
+ return new Promise((resolve, reject) => {
+ if (sources.includes(source)) {
+ resolve(createSource(source));
+ }
+
+ reject(`unknown source: ${source}`);
+ });
+ },
+ setBreakpoint: async () => {},
+ removeBreakpoint: _id => Promise.resolve(),
+ threadFront: async () => {},
+ getFrameScopes: async () => {},
+ getFrames: async () => [],
+ evaluateExpressions: async () => {},
+ getSourceActorBreakpointPositions: async () => ({}),
+ getSourceActorBreakableLines: async () => [],
+};
diff --git a/devtools/client/debugger/src/actions/tests/helpers/readFixture.js b/devtools/client/debugger/src/actions/tests/helpers/readFixture.js
new file mode 100644
index 0000000000..6c23641226
--- /dev/null
+++ b/devtools/client/debugger/src/actions/tests/helpers/readFixture.js
@@ -0,0 +1,14 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import fs from "fs";
+import path from "path";
+
+export default function readFixture(name) {
+ const text = fs.readFileSync(
+ path.join(__dirname, `../fixtures/${name}`),
+ "utf8"
+ );
+ return text;
+}
diff --git a/devtools/client/debugger/src/actions/tests/pending-breakpoints.spec.js b/devtools/client/debugger/src/actions/tests/pending-breakpoints.spec.js
new file mode 100644
index 0000000000..c51ad7e6e5
--- /dev/null
+++ b/devtools/client/debugger/src/actions/tests/pending-breakpoints.spec.js
@@ -0,0 +1,251 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// TODO: we would like to mock this in the local tests
+import {
+ generateBreakpoint,
+ mockPendingBreakpoint,
+} from "./helpers/breakpoints.js";
+
+import { mockCommandClient } from "./helpers/mockCommandClient";
+import { asyncStore } from "../../utils/prefs";
+
+function loadInitialState(opts = {}) {
+ const mockedPendingBreakpoint = mockPendingBreakpoint({ ...opts, column: 2 });
+ const l = mockedPendingBreakpoint.location;
+ const id = `${l.sourceUrl}:${l.line}:${l.column}`;
+ asyncStore.pendingBreakpoints = { [id]: mockedPendingBreakpoint };
+
+ return { pendingBreakpoints: asyncStore.pendingBreakpoints };
+}
+
+jest.mock("../../utils/prefs", () => ({
+ prefs: {
+ clientSourceMapsEnabled: true,
+ expressions: [],
+ },
+ asyncStore: {
+ pendingBreakpoints: {},
+ },
+ clear: jest.fn(),
+ features: {
+ inlinePreview: true,
+ },
+}));
+
+import {
+ createStore,
+ selectors,
+ actions,
+ makeSource,
+ waitForState,
+} from "../../utils/test-head";
+
+import sourceMapLoader from "devtools/client/shared/source-map-loader/index";
+
+function mockClient(bpPos = {}) {
+ return {
+ ...mockCommandClient,
+ setSkipPausing: jest.fn(),
+ getSourceActorBreakpointPositions: async () => bpPos,
+ getSourceActorBreakableLines: async () => [],
+ };
+}
+
+function mockSourceMaps() {
+ return {
+ ...sourceMapLoader,
+ getOriginalSourceText: async id => ({
+ id,
+ text: "",
+ contentType: "text/javascript",
+ }),
+ getGeneratedRangesForOriginal: async () => [
+ { start: { line: 0, column: 0 }, end: { line: 10, column: 10 } },
+ ],
+ getOriginalLocations: async items => items,
+ };
+}
+
+describe("when adding breakpoints", () => {
+ it("a corresponding pending breakpoint should be added", async () => {
+ const { dispatch, getState } = createStore(
+ mockClient({ 5: [1] }),
+ loadInitialState(),
+ mockSourceMaps()
+ );
+
+ const source = await dispatch(
+ actions.newGeneratedSource(makeSource("foo.js"))
+ );
+ const sourceActor = selectors.getFirstSourceActorForGeneratedSource(
+ getState(),
+ source.id
+ );
+
+ await dispatch(actions.loadGeneratedSourceText(sourceActor));
+
+ const bp = generateBreakpoint("foo.js", 5, 1);
+
+ await dispatch(actions.addBreakpoint(bp.location));
+
+ expect(selectors.getPendingBreakpointList(getState())).toHaveLength(2);
+ });
+});
+
+describe("initializing when pending breakpoints exist in prefs", () => {
+ it("syncs pending breakpoints", async () => {
+ const { getState } = createStore(
+ mockClient({ 5: [0] }),
+ loadInitialState(),
+ mockSourceMaps()
+ );
+ const bps = selectors.getPendingBreakpoints(getState());
+ expect(bps).toMatchSnapshot();
+ });
+
+ it("re-adding breakpoints update existing pending breakpoints", async () => {
+ const { dispatch, getState } = createStore(
+ mockClient({ 5: [1, 2] }),
+ loadInitialState(),
+ mockSourceMaps()
+ );
+ const bar = generateBreakpoint("bar.js", 5, 1);
+
+ const source = await dispatch(
+ actions.newGeneratedSource(makeSource("bar.js"))
+ );
+ const sourceActor = selectors.getFirstSourceActorForGeneratedSource(
+ getState(),
+ source.id
+ );
+
+ await dispatch(actions.loadGeneratedSourceText(sourceActor));
+ await dispatch(actions.addBreakpoint(bar.location));
+
+ const bps = selectors.getPendingBreakpointList(getState());
+ expect(bps).toHaveLength(2);
+ });
+
+ it("adding bps doesn't remove existing pending breakpoints", async () => {
+ const { dispatch, getState } = createStore(
+ mockClient({ 5: [0] }),
+ loadInitialState(),
+ mockSourceMaps()
+ );
+ const bp = generateBreakpoint("foo.js");
+
+ const source = await dispatch(
+ actions.newGeneratedSource(makeSource("foo.js"))
+ );
+ const sourceActor = selectors.getFirstSourceActorForGeneratedSource(
+ getState(),
+ source.id
+ );
+
+ await dispatch(actions.loadGeneratedSourceText(sourceActor));
+
+ await dispatch(actions.addBreakpoint(bp.location));
+
+ const bps = selectors.getPendingBreakpointList(getState());
+ expect(bps).toHaveLength(2);
+ });
+});
+
+describe("initializing with disabled pending breakpoints in prefs", () => {
+ it("syncs breakpoints with pending breakpoints", async () => {
+ const store = createStore(
+ mockClient({ 5: [2] }),
+ loadInitialState({ disabled: true }),
+ mockSourceMaps()
+ );
+
+ const { getState, dispatch } = store;
+
+ const source = await dispatch(
+ actions.newGeneratedSource(makeSource("bar.js"))
+ );
+ const sourceActor = selectors.getFirstSourceActorForGeneratedSource(
+ getState(),
+ source.id
+ );
+
+ await dispatch(actions.loadGeneratedSourceText(sourceActor));
+
+ await waitForState(store, state => {
+ const bps = selectors.getBreakpointsForSource(state, source);
+ return bps && !!Object.values(bps).length;
+ });
+
+ const bp = selectors.getBreakpointsList(getState()).find(({ location }) => {
+ return (
+ location.line == 5 &&
+ location.column == 2 &&
+ location.source.id == source.id
+ );
+ });
+
+ if (!bp) {
+ throw new Error("no bp");
+ }
+ expect(bp.location.source.id).toEqual(source.id);
+ expect(bp.disabled).toEqual(true);
+ });
+});
+
+describe("adding sources", () => {
+ it("corresponding breakpoints are added for a single source", async () => {
+ const store = createStore(
+ mockClient({ 5: [2] }),
+ loadInitialState({ disabled: true }),
+ mockSourceMaps()
+ );
+ const { getState, dispatch } = store;
+
+ expect(selectors.getBreakpointCount(getState())).toEqual(0);
+
+ const source = await dispatch(
+ actions.newGeneratedSource(makeSource("bar.js"))
+ );
+ const sourceActor = selectors.getFirstSourceActorForGeneratedSource(
+ getState(),
+ source.id
+ );
+
+ await dispatch(actions.loadGeneratedSourceText(sourceActor));
+
+ await waitForState(store, state => selectors.getBreakpointCount(state) > 0);
+
+ expect(selectors.getBreakpointCount(getState())).toEqual(1);
+ });
+
+ it("add corresponding breakpoints for multiple sources", async () => {
+ const store = createStore(
+ mockClient({ 5: [2] }),
+ loadInitialState({ disabled: true }),
+ mockSourceMaps()
+ );
+ const { getState, dispatch } = store;
+
+ expect(selectors.getBreakpointCount(getState())).toEqual(0);
+
+ const [source1, source2] = await dispatch(
+ actions.newGeneratedSources([makeSource("bar.js"), makeSource("foo.js")])
+ );
+ const sourceActor1 = selectors.getFirstSourceActorForGeneratedSource(
+ getState(),
+ source1.id
+ );
+ const sourceActor2 = selectors.getFirstSourceActorForGeneratedSource(
+ getState(),
+ source2.id
+ );
+
+ await dispatch(actions.loadGeneratedSourceText(sourceActor1));
+ await dispatch(actions.loadGeneratedSourceText(sourceActor2));
+
+ await waitForState(store, state => selectors.getBreakpointCount(state) > 0);
+ expect(selectors.getBreakpointCount(getState())).toEqual(1);
+ });
+});
diff --git a/devtools/client/debugger/src/actions/tests/ui.spec.js b/devtools/client/debugger/src/actions/tests/ui.spec.js
new file mode 100644
index 0000000000..712fac4996
--- /dev/null
+++ b/devtools/client/debugger/src/actions/tests/ui.spec.js
@@ -0,0 +1,88 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import {
+ createStore,
+ selectors,
+ actions,
+ makeSource,
+} from "../../utils/test-head";
+import { createLocation } from "../../utils/location";
+import { mockCommandClient } from "./helpers/mockCommandClient";
+
+const {
+ getActiveSearch,
+ getFrameworkGroupingState,
+ getPaneCollapse,
+ getHighlightedLineRangeForSelectedSource,
+} = selectors;
+
+describe("ui", () => {
+ it("should toggle the visible state of file search", () => {
+ const { dispatch, getState } = createStore();
+ expect(getActiveSearch(getState())).toBe(null);
+ dispatch(actions.setActiveSearch("file"));
+ expect(getActiveSearch(getState())).toBe("file");
+ });
+
+ it("should close file search", () => {
+ const { dispatch, getState } = createStore();
+ expect(getActiveSearch(getState())).toBe(null);
+ dispatch(actions.setActiveSearch("file"));
+ dispatch(actions.closeActiveSearch());
+ expect(getActiveSearch(getState())).toBe(null);
+ });
+
+ it("should toggle the collapse state of a pane", () => {
+ const { dispatch, getState } = createStore();
+ expect(getPaneCollapse(getState(), "start")).toBe(false);
+ dispatch(actions.togglePaneCollapse("start", true));
+ expect(getPaneCollapse(getState(), "start")).toBe(true);
+ });
+
+ it("should toggle the collapsed state of frameworks in the callstack", () => {
+ const { dispatch, getState } = createStore();
+ const currentState = getFrameworkGroupingState(getState());
+ dispatch(actions.toggleFrameworkGrouping(!currentState));
+ expect(getFrameworkGroupingState(getState())).toBe(!currentState);
+ });
+
+ it("should highlight lines", async () => {
+ const { dispatch, getState } = createStore(mockCommandClient);
+ const base = await dispatch(
+ actions.newGeneratedSource(makeSource("base.js"))
+ );
+ const sourceActor = selectors.getFirstSourceActorForGeneratedSource(
+ getState(),
+ base.id
+ );
+ //await dispatch(actions.selectSource(base, sourceActor));
+ const location = createLocation({
+ source: base,
+ line: 1,
+ sourceActor,
+ });
+ await dispatch(actions.selectLocation(location));
+
+ const range = { start: 3, end: 5, sourceId: base.id };
+ dispatch(actions.highlightLineRange(range));
+ expect(getHighlightedLineRangeForSelectedSource(getState())).toEqual(range);
+ });
+
+ it("should clear highlight lines", async () => {
+ const { dispatch, getState } = createStore(mockCommandClient);
+ const base = await dispatch(
+ actions.newGeneratedSource(makeSource("base.js"))
+ );
+ const sourceActor = selectors.getFirstSourceActorForGeneratedSource(
+ getState(),
+ base.id
+ );
+ await dispatch(actions.selectSource(base, sourceActor));
+ const range = { start: 3, end: 5, sourceId: "2" };
+ dispatch(actions.highlightLineRange(range));
+ dispatch(actions.clearHighlightLineRange());
+ expect(getHighlightedLineRangeForSelectedSource(getState())).toEqual(null);
+ });
+});
diff --git a/devtools/client/debugger/src/actions/threads.js b/devtools/client/debugger/src/actions/threads.js
new file mode 100644
index 0000000000..82132a144c
--- /dev/null
+++ b/devtools/client/debugger/src/actions/threads.js
@@ -0,0 +1,58 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { createThread } from "../client/firefox/create";
+import { getSourcesToRemoveForThread } from "../selectors/index";
+import { clearDocumentsForSources } from "../utils/editor/source-documents";
+
+export function addTarget(targetFront) {
+ return { type: "INSERT_THREAD", newThread: createThread(targetFront) };
+}
+
+export function removeTarget(targetFront) {
+ return ({ getState, dispatch, parserWorker }) => {
+ const threadActorID = targetFront.targetForm.threadActor;
+
+ // Just before emitting the REMOVE_THREAD action,
+ // synchronously compute the list of source and source actor objects
+ // which should be removed as that one target get removed.
+ //
+ // The list of source objects isn't trivial to compute as these objects
+ // are shared across targets/threads.
+ const { actors, sources } = getSourcesToRemoveForThread(
+ getState(),
+ threadActorID
+ );
+
+ // CodeMirror documents aren't stored in redux reducer,
+ // so we need this manual function call in order to ensure clearing them.
+ clearDocumentsForSources(sources);
+
+ // Notify the reducers that a target/thread is being removed
+ // and that all related resources should be cleared.
+ // This action receives the list of related source actors and source objects
+ // related to that to-be-removed target.
+ // This will be fired on navigation for all existing targets.
+ // That except the top target, when pausing on unload, where the top target may still hold longer.
+ // Also except for service worker targets, which may be kept alive.
+ dispatch({
+ type: "REMOVE_THREAD",
+ threadActorID,
+ actors,
+ sources,
+ });
+
+ parserWorker.clearSources(sources.map(source => source.id));
+ };
+}
+
+export function toggleJavaScriptEnabled(enabled) {
+ return async ({ dispatch, client }) => {
+ await client.toggleJavaScriptEnabled(enabled);
+ dispatch({
+ type: "TOGGLE_JAVASCRIPT_ENABLED",
+ value: enabled,
+ });
+ };
+}
diff --git a/devtools/client/debugger/src/actions/toolbox.js b/devtools/client/debugger/src/actions/toolbox.js
new file mode 100644
index 0000000000..a343c92863
--- /dev/null
+++ b/devtools/client/debugger/src/actions/toolbox.js
@@ -0,0 +1,43 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * @memberof actions/toolbox
+ * @static
+ */
+export function openLink(url) {
+ return async function ({ panel }) {
+ return panel.openLink(url);
+ };
+}
+
+export function evaluateInConsole(inputString) {
+ return async ({ panel }) => {
+ return panel.openConsoleAndEvaluate(inputString);
+ };
+}
+
+export function openElementInInspectorCommand(grip) {
+ return async ({ panel }) => {
+ return panel.openElementInInspector(grip);
+ };
+}
+
+export function openInspector(grip) {
+ return async ({ panel }) => {
+ return panel.openInspector();
+ };
+}
+
+export function highlightDomElement(grip) {
+ return async ({ panel }) => {
+ return panel.highlightDomElement(grip);
+ };
+}
+
+export function unHighlightDomElement(grip) {
+ return async ({ panel }) => {
+ return panel.unHighlightDomElement(grip);
+ };
+}
diff --git a/devtools/client/debugger/src/actions/tracing.js b/devtools/client/debugger/src/actions/tracing.js
new file mode 100644
index 0000000000..1a90dcfa0a
--- /dev/null
+++ b/devtools/client/debugger/src/actions/tracing.js
@@ -0,0 +1,44 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import {
+ getIsJavascriptTracingEnabled,
+ getJavascriptTracingLogMethod,
+} from "../selectors/index";
+import { PROMISE } from "./utils/middleware/promise";
+
+/**
+ * Toggle ON/OFF Javascript tracing for all targets.
+ */
+export function toggleTracing() {
+ return async ({ dispatch, getState, client, panel }) => {
+ // For now, the UI can only toggle all the targets all at once.
+ const isTracingEnabled = getIsJavascriptTracingEnabled(getState());
+ const logMethod = getJavascriptTracingLogMethod(getState());
+
+ // Automatically open the split console when enabling tracing to the console
+ if (!isTracingEnabled && logMethod == "console") {
+ await panel.toolbox.openSplitConsole({ focusConsoleInput: false });
+ }
+
+ return dispatch({
+ type: "TOGGLE_TRACING",
+ [PROMISE]: client.toggleTracing(),
+ enabled: !isTracingEnabled,
+ });
+ };
+}
+
+/**
+ * Called when tracing is toggled ON/OFF on a particular thread.
+ */
+export function tracingToggled(thread, enabled) {
+ return ({ dispatch }) => {
+ dispatch({
+ type: "TRACING_TOGGLED",
+ thread,
+ enabled,
+ });
+ };
+}
diff --git a/devtools/client/debugger/src/actions/ui.js b/devtools/client/debugger/src/actions/ui.js
new file mode 100644
index 0000000000..2424c658b8
--- /dev/null
+++ b/devtools/client/debugger/src/actions/ui.js
@@ -0,0 +1,282 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import {
+ getActiveSearch,
+ getPaneCollapse,
+ getQuickOpenEnabled,
+ getSource,
+ getSourceTextContent,
+ getIgnoreListSourceUrls,
+ getSourceByURL,
+ getBreakpointsForSource,
+} from "../selectors/index";
+import { selectSource } from "../actions/sources/select";
+import {
+ getEditor,
+ getLocationsInViewport,
+ updateDocuments,
+} from "../utils/editor/index";
+import { blackboxSourceActorsForSource } from "./sources/blackbox";
+import { toggleBreakpoints } from "./breakpoints/index";
+import { copyToTheClipboard } from "../utils/clipboard";
+import { isFulfilled } from "../utils/async-value";
+import { primaryPaneTabs } from "../constants";
+
+export function setPrimaryPaneTab(tabName) {
+ return { type: "SET_PRIMARY_PANE_TAB", tabName };
+}
+
+export function closeActiveSearch() {
+ return {
+ type: "TOGGLE_ACTIVE_SEARCH",
+ value: null,
+ };
+}
+
+export function setActiveSearch(activeSearch) {
+ return ({ dispatch, getState }) => {
+ const activeSearchState = getActiveSearch(getState());
+ if (activeSearchState === activeSearch) {
+ return;
+ }
+
+ if (getQuickOpenEnabled(getState())) {
+ dispatch({ type: "CLOSE_QUICK_OPEN" });
+ }
+
+ // Open start panel if it was collapsed so the project search UI is visible
+ if (
+ activeSearch === primaryPaneTabs.PROJECT_SEARCH &&
+ getPaneCollapse(getState(), "start")
+ ) {
+ dispatch({
+ type: "TOGGLE_PANE",
+ position: "start",
+ paneCollapsed: false,
+ });
+ }
+
+ dispatch({
+ type: "TOGGLE_ACTIVE_SEARCH",
+ value: activeSearch,
+ });
+ };
+}
+
+export function toggleFrameworkGrouping(toggleValue) {
+ return ({ dispatch, getState }) => {
+ dispatch({
+ type: "TOGGLE_FRAMEWORK_GROUPING",
+ value: toggleValue,
+ });
+ };
+}
+
+export function toggleInlinePreview(toggleValue) {
+ return ({ dispatch, getState }) => {
+ dispatch({
+ type: "TOGGLE_INLINE_PREVIEW",
+ value: toggleValue,
+ });
+ };
+}
+
+export function toggleEditorWrapping(toggleValue) {
+ return ({ dispatch, getState }) => {
+ updateDocuments(doc => doc.cm.setOption("lineWrapping", toggleValue));
+
+ dispatch({
+ type: "TOGGLE_EDITOR_WRAPPING",
+ value: toggleValue,
+ });
+ };
+}
+
+export function toggleSourceMapsEnabled(toggleValue) {
+ return ({ dispatch, getState }) => {
+ dispatch({
+ type: "TOGGLE_SOURCE_MAPS_ENABLED",
+ value: toggleValue,
+ });
+ };
+}
+
+export function showSource(sourceId) {
+ return ({ dispatch, getState }) => {
+ const source = getSource(getState(), sourceId);
+ if (!source) {
+ return;
+ }
+
+ if (getPaneCollapse(getState(), "start")) {
+ dispatch({
+ type: "TOGGLE_PANE",
+ position: "start",
+ paneCollapsed: false,
+ });
+ }
+
+ dispatch(setPrimaryPaneTab("sources"));
+
+ dispatch(selectSource(source));
+ };
+}
+
+export function togglePaneCollapse(position, paneCollapsed) {
+ return ({ dispatch, getState }) => {
+ const prevPaneCollapse = getPaneCollapse(getState(), position);
+ if (prevPaneCollapse === paneCollapsed) {
+ return;
+ }
+
+ // Set active search to null when closing start panel if project search was active
+ if (
+ position === "start" &&
+ paneCollapsed &&
+ getActiveSearch(getState()) === primaryPaneTabs.PROJECT_SEARCH
+ ) {
+ dispatch(closeActiveSearch());
+ }
+
+ dispatch({
+ type: "TOGGLE_PANE",
+ position,
+ paneCollapsed,
+ });
+ };
+}
+
+/**
+ * Highlight one or many lines in CodeMirror for a given source.
+ *
+ * @param {Object} location
+ * @param {String} location.sourceId
+ * The precise source to highlight.
+ * @param {Number} location.start
+ * The 1-based index of first line to highlight.
+ * @param {Number} location.end
+ * The 1-based index of last line to highlight.
+ */
+export function highlightLineRange(location) {
+ return {
+ type: "HIGHLIGHT_LINES",
+ location,
+ };
+}
+
+export function flashLineRange(location) {
+ return ({ dispatch }) => {
+ dispatch(highlightLineRange(location));
+ setTimeout(() => dispatch(clearHighlightLineRange()), 200);
+ };
+}
+
+export function clearHighlightLineRange() {
+ return {
+ type: "CLEAR_HIGHLIGHT_LINES",
+ };
+}
+
+export function openConditionalPanel(location, log = false) {
+ if (!location) {
+ return null;
+ }
+
+ return {
+ type: "OPEN_CONDITIONAL_PANEL",
+ location,
+ log,
+ };
+}
+
+export function closeConditionalPanel() {
+ return {
+ type: "CLOSE_CONDITIONAL_PANEL",
+ };
+}
+
+export function updateViewport() {
+ return {
+ type: "SET_VIEWPORT",
+ viewport: getLocationsInViewport(getEditor()),
+ };
+}
+
+export function updateCursorPosition(cursorPosition) {
+ return { type: "SET_CURSOR_POSITION", cursorPosition };
+}
+
+export function setOrientation(orientation) {
+ return { type: "SET_ORIENTATION", orientation };
+}
+
+export function setSearchOptions(searchKey, searchOptions) {
+ return { type: "SET_SEARCH_OPTIONS", searchKey, searchOptions };
+}
+
+export function copyToClipboard(location) {
+ return ({ dispatch, getState }) => {
+ const content = getSourceTextContent(getState(), location);
+ if (content && isFulfilled(content) && content.value.type === "text") {
+ copyToTheClipboard(content.value.value);
+ }
+ };
+}
+
+export function setJavascriptTracingLogMethod(value) {
+ return {
+ type: "SET_JAVASCRIPT_TRACING_LOG_METHOD",
+ value,
+ };
+}
+
+export function toggleJavascriptTracingValues() {
+ return {
+ type: "TOGGLE_JAVASCRIPT_TRACING_VALUES",
+ };
+}
+
+export function toggleJavascriptTracingOnNextInteraction() {
+ return {
+ type: "TOGGLE_JAVASCRIPT_TRACING_ON_NEXT_INTERACTION",
+ };
+}
+
+export function toggleJavascriptTracingFunctionReturn() {
+ return {
+ type: "TOGGLE_JAVASCRIPT_TRACING_FUNCTION_RETURN",
+ };
+}
+
+export function toggleJavascriptTracingOnNextLoad() {
+ return {
+ type: "TOGGLE_JAVASCRIPT_TRACING_ON_NEXT_LOAD",
+ };
+}
+
+export function setHideOrShowIgnoredSources(shouldHide) {
+ return ({ dispatch, getState }) => {
+ dispatch({ type: "HIDE_IGNORED_SOURCES", shouldHide });
+ };
+}
+
+export function toggleSourceMapIgnoreList(shouldEnable) {
+ return async thunkArgs => {
+ const { dispatch, getState } = thunkArgs;
+ const ignoreListSourceUrls = getIgnoreListSourceUrls(getState());
+ // Blackbox the source actors on the server
+ for (const url of ignoreListSourceUrls) {
+ const source = getSourceByURL(getState(), url);
+ await blackboxSourceActorsForSource(thunkArgs, source, shouldEnable);
+ // Disable breakpoints in sources on the ignore list
+ const breakpoints = getBreakpointsForSource(getState(), source);
+ await dispatch(toggleBreakpoints(shouldEnable, breakpoints));
+ }
+ await dispatch({
+ type: "ENABLE_SOURCEMAP_IGNORELIST",
+ shouldEnable,
+ });
+ };
+}
diff --git a/devtools/client/debugger/src/actions/utils/create-store.js b/devtools/client/debugger/src/actions/utils/create-store.js
new file mode 100644
index 0000000000..5de4fa74d0
--- /dev/null
+++ b/devtools/client/debugger/src/actions/utils/create-store.js
@@ -0,0 +1,75 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/* global window */
+
+/**
+ * Redux store utils
+ * @module utils/create-store
+ */
+
+import {
+ createStore,
+ applyMiddleware,
+} from "devtools/client/shared/vendor/redux";
+import { waitUntilService } from "./middleware/wait-service";
+import { log } from "./middleware/log";
+import { promise } from "./middleware/promise";
+import { thunk } from "./middleware/thunk";
+import { timing } from "./middleware/timing";
+import { context } from "./middleware/context";
+
+/**
+ * @memberof utils/create-store
+ * @static
+ */
+
+/**
+ * This creates a dispatcher with all the standard middleware in place
+ * that all code requires. It can also be optionally configured in
+ * various ways, such as logging and recording.
+ *
+ * @param {object} opts:
+ * - log: log all dispatched actions to console
+ * - history: an array to store every action in. Should only be
+ * used in tests.
+ * - middleware: array of middleware to be included in the redux store
+ * @memberof utils/create-store
+ * @static
+ */
+const configureStore = (opts = {}) => {
+ const middleware = [
+ thunk(opts.makeThunkArgs),
+ context,
+ promise,
+
+ // Order is important: services must go last as they always
+ // operate on "already transformed" actions. Actions going through
+ // them shouldn't have any special fields like promises, they
+ // should just be normal JSON objects.
+ waitUntilService,
+ ];
+
+ if (opts.middleware) {
+ opts.middleware.forEach(fn => middleware.push(fn));
+ }
+
+ if (opts.log) {
+ middleware.push(log);
+ }
+
+ if (opts.timing) {
+ middleware.push(timing);
+ }
+
+ // Hook in the redux devtools browser extension if it exists
+ const devtoolsExt =
+ typeof window === "object" && window.devToolsExtension
+ ? window.devToolsExtension()
+ : f => f;
+
+ return applyMiddleware(...middleware)(devtoolsExt(createStore));
+};
+
+export default configureStore;
diff --git a/devtools/client/debugger/src/actions/utils/middleware/context.js b/devtools/client/debugger/src/actions/utils/middleware/context.js
new file mode 100644
index 0000000000..00711a8c3f
--- /dev/null
+++ b/devtools/client/debugger/src/actions/utils/middleware/context.js
@@ -0,0 +1,90 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import {
+ validateNavigateContext,
+ validateContext,
+ validateSelectedFrame,
+ validateBreakpoint,
+ validateSource,
+ validateSourceActor,
+ validateThreadFrames,
+ validateFrame,
+} from "../../../utils/context";
+
+function validateActionContext(getState, action) {
+ if (action.type == "COMMAND" && action.status == "done") {
+ // The thread will have resumed execution since the action was initiated,
+ // so just make sure we haven't navigated.
+ validateNavigateContext(getState(), action.cx);
+ return;
+ }
+
+ // Validate using all available information in the context.
+ validateContext(getState(), action.cx);
+}
+
+// Middleware which looks for actions that have a cx property and ignores
+// them if the context is no longer valid.
+function context({ dispatch, getState }) {
+ return next => action => {
+ if ("cx" in action) {
+ validateActionContext(getState, action);
+ }
+
+ // Validate actions specific to a Source object.
+ // This will throw if the source has been removed,
+ // i.e. when the source has been removed from all the threads where it existed.
+ if ("source" in action) {
+ validateSource(getState(), action.source);
+ }
+
+ // Validate actions specific to a Source Actor object.
+ // This will throw if the source actor has been removed,
+ // i.e. when the source actor's thread has been removed.
+ if ("sourceActor" in action) {
+ validateSourceActor(getState(), action.sourceActor);
+ }
+
+ // Similar to sourceActor assertion, but with a distinct attribute name
+ if ("generatedSourceActor" in action) {
+ validateSourceActor(getState(), action.generatedSourceActor);
+ }
+
+ // Validate actions specific to a given breakpoint.
+ // This will throw if the breakpoint's location is obsolete.
+ // i.e. when the related source has been removed.
+ if ("breakpoint" in action) {
+ validateBreakpoint(getState(), action.breakpoint);
+ }
+
+ // Validate actions specific to the currently selected paused frame.
+ // It will throw if we resumed or moved to another frame in the call stack.
+ //
+ // Ignore falsy selectedFrame as sometimes it can be null
+ // for expression actions.
+ if (action.selectedFrame) {
+ validateSelectedFrame(getState(), action.selectedFrame);
+ }
+
+ // Validate actions specific to a given pause location.
+ // This will throw if we resumed or paused in another location.
+ // Compared to selected frame, this would not throw if we moved to another frame in the call stack.
+ if ("thread" in action && "frames" in action) {
+ validateThreadFrames(getState(), action.thread, action.frames);
+ }
+
+ // Validate actions specific to a given frame while being paused.
+ // This will throw if we resumed or paused in another location.
+ // But compared to selected frame, this would not throw if we moved to another frame in the call stack.
+ // This ends up being similar to "pause location" case, but with different arguments.
+ if ("frame" in action) {
+ validateFrame(getState(), action.frame);
+ }
+
+ return next(action);
+ };
+}
+
+export { context };
diff --git a/devtools/client/debugger/src/actions/utils/middleware/log.js b/devtools/client/debugger/src/actions/utils/middleware/log.js
new file mode 100644
index 0000000000..b9592ce22c
--- /dev/null
+++ b/devtools/client/debugger/src/actions/utils/middleware/log.js
@@ -0,0 +1,111 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import flags from "devtools/shared/flags";
+import { prefs } from "../../../utils/prefs";
+
+const ignoreList = [
+ "ADD_BREAKPOINT_POSITIONS",
+ "SET_SYMBOLS",
+ "OUT_OF_SCOPE_LOCATIONS",
+ "MAP_SCOPES",
+ "MAP_FRAMES",
+ "ADD_SCOPES",
+ "IN_SCOPE_LINES",
+ "REMOVE_BREAKPOINT",
+ "NODE_PROPERTIES_LOADED",
+ "SET_FOCUSED_SOURCE_ITEM",
+ "NODE_EXPAND",
+ "IN_SCOPE_LINES",
+ "SET_PREVIEW",
+];
+
+function cloneAction(action) {
+ action = action || {};
+ action = { ...action };
+
+ // ADD_TAB, ...
+ if (action.source?.text) {
+ const source = { ...action.source, text: "" };
+ action.source = source;
+ }
+
+ if (action.sources) {
+ const sources = action.sources.slice(0, 20).map(source => {
+ const url = !source.url || source.url.includes("data:") ? "" : source.url;
+ return { ...source, url };
+ });
+ action.sources = sources;
+ }
+
+ // LOAD_SOURCE_TEXT
+ if (action.text) {
+ action.text = "";
+ }
+
+ if (action.value?.text) {
+ const value = { ...action.value, text: "" };
+ action.value = value;
+ }
+
+ return action;
+}
+
+function formatPause(pause) {
+ return {
+ ...pause,
+ pauseInfo: { why: pause.why },
+ scopes: [],
+ loadedObjects: [],
+ };
+}
+
+function serializeAction(action) {
+ try {
+ action = cloneAction(action);
+ if (ignoreList.includes(action.type)) {
+ action = {};
+ }
+
+ if (action.type === "PAUSED") {
+ action = formatPause(action);
+ }
+
+ const serializer = function (key, value) {
+ // Serialize Object/LongString fronts
+ if (value?.getGrip) {
+ return value.getGrip();
+ }
+ return value;
+ };
+
+ // dump(`> ${action.type}...\n ${JSON.stringify(action, serializer)}\n`);
+ return JSON.stringify(action, serializer);
+ } catch (e) {
+ console.error(e);
+ return "";
+ }
+}
+
+/**
+ * A middleware that logs all actions coming through the system
+ * to the console.
+ */
+export function log({ dispatch, getState }) {
+ return next => action => {
+ const asyncMsg = !action.status ? "" : `[${action.status}]`;
+
+ if (prefs.logActions) {
+ if (flags.testing) {
+ dump(
+ `[ACTION] ${action.type} ${asyncMsg} - ${serializeAction(action)}\n`
+ );
+ } else {
+ console.log(action, asyncMsg);
+ }
+ }
+
+ next(action);
+ };
+}
diff --git a/devtools/client/debugger/src/actions/utils/middleware/moz.build b/devtools/client/debugger/src/actions/utils/middleware/moz.build
new file mode 100644
index 0000000000..f46a0bb725
--- /dev/null
+++ b/devtools/client/debugger/src/actions/utils/middleware/moz.build
@@ -0,0 +1,15 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DIRS += []
+
+CompiledModules(
+ "context.js",
+ "log.js",
+ "promise.js",
+ "thunk.js",
+ "timing.js",
+ "wait-service.js",
+)
diff --git a/devtools/client/debugger/src/actions/utils/middleware/promise.js b/devtools/client/debugger/src/actions/utils/middleware/promise.js
new file mode 100644
index 0000000000..52054a1fcc
--- /dev/null
+++ b/devtools/client/debugger/src/actions/utils/middleware/promise.js
@@ -0,0 +1,61 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { executeSoon } from "../../../utils/DevToolsUtils";
+
+import { pending, rejected, fulfilled } from "../../../utils/async-value";
+export function asyncActionAsValue(action) {
+ if (action.status === "start") {
+ return pending();
+ }
+ if (action.status === "error") {
+ return rejected(action.error);
+ }
+ return fulfilled(action.value);
+}
+
+let seqIdVal = 1;
+
+function seqIdGen() {
+ return seqIdVal++;
+}
+
+function promiseMiddleware({ dispatch, getState }) {
+ return next => action => {
+ if (!(PROMISE in action)) {
+ return next(action);
+ }
+
+ const seqId = seqIdGen().toString();
+ const { [PROMISE]: promiseInst, ...originalActionProperties } = action;
+
+ // Create a new action that doesn't have the promise field and has
+ // the `seqId` field that represents the sequence id
+ action = { ...originalActionProperties, seqId };
+
+ dispatch({ ...action, status: "start" });
+
+ // Return the promise so action creators can still compose if they
+ // want to.
+ return Promise.resolve(promiseInst)
+ .finally(() => new Promise(resolve => executeSoon(resolve)))
+ .then(
+ value => {
+ dispatch({ ...action, status: "done", value: value });
+ return value;
+ },
+ error => {
+ dispatch({
+ ...action,
+ status: "error",
+ error: error.message || error,
+ });
+ return Promise.reject(error);
+ }
+ );
+ };
+}
+
+export const PROMISE = "@@dispatch/promise";
+export { promiseMiddleware as promise };
diff --git a/devtools/client/debugger/src/actions/utils/middleware/thunk.js b/devtools/client/debugger/src/actions/utils/middleware/thunk.js
new file mode 100644
index 0000000000..fba17d516c
--- /dev/null
+++ b/devtools/client/debugger/src/actions/utils/middleware/thunk.js
@@ -0,0 +1,22 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * A middleware that allows thunks (functions) to be dispatched. If
+ * it's a thunk, it is called with an argument that contains
+ * `dispatch`, `getState`, and any additional args passed in via the
+ * middleware constructure. This allows the action to create multiple
+ * actions (most likely asynchronously).
+ */
+export function thunk(makeArgs) {
+ return ({ dispatch, getState }) => {
+ const args = { dispatch, getState };
+
+ return next => action => {
+ return typeof action === "function"
+ ? action(makeArgs ? makeArgs(args, getState()) : args)
+ : next(action);
+ };
+ };
+}
diff --git a/devtools/client/debugger/src/actions/utils/middleware/timing.js b/devtools/client/debugger/src/actions/utils/middleware/timing.js
new file mode 100644
index 0000000000..d0bfa05977
--- /dev/null
+++ b/devtools/client/debugger/src/actions/utils/middleware/timing.js
@@ -0,0 +1,26 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Redux middleware that sets performance markers for all actions such that they
+ * will appear in performance tooling under the User Timing API
+ */
+
+const mark = window.performance?.mark
+ ? window.performance.mark.bind(window.performance)
+ : a => {};
+
+const measure = window.performance?.measure
+ ? window.performance.measure.bind(window.performance)
+ : (a, b, c) => {};
+
+export function timing(store) {
+ return next => action => {
+ mark(`${action.type}_start`);
+ const result = next(action);
+ mark(`${action.type}_end`);
+ measure(`${action.type}`, `${action.type}_start`, `${action.type}_end`);
+ return result;
+ };
+}
diff --git a/devtools/client/debugger/src/actions/utils/middleware/wait-service.js b/devtools/client/debugger/src/actions/utils/middleware/wait-service.js
new file mode 100644
index 0000000000..337df7e336
--- /dev/null
+++ b/devtools/client/debugger/src/actions/utils/middleware/wait-service.js
@@ -0,0 +1,62 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * A middleware which acts like a service, because it is stateful
+ * and "long-running" in the background. It provides the ability
+ * for actions to install a function to be run once when a specific
+ * condition is met by an action coming through the system. Think of
+ * it as a thunk that blocks until the condition is met. Example:
+ *
+ * ```js
+ * const services = { WAIT_UNTIL: require('wait-service').NAME };
+ *
+ * { type: services.WAIT_UNTIL,
+ * predicate: action => action.type === "ADD_ITEM",
+ * run: (dispatch, getState, action) => {
+ * // Do anything here. You only need to accept the arguments
+ * // if you need them. `action` is the action that satisfied
+ * // the predicate.
+ * }
+ * }
+ * ```
+ */
+export const NAME = "@@service/waitUntil";
+
+export function waitUntilService({ dispatch, getState }) {
+ let pending = [];
+
+ function checkPending(action) {
+ const readyRequests = [];
+ const stillPending = [];
+
+ // Find the pending requests whose predicates are satisfied with
+ // this action. Wait to run the requests until after we update the
+ // pending queue because the request handler may synchronously
+ // dispatch again and run this service (that use case is
+ // completely valid).
+ for (const request of pending) {
+ if (request.predicate(action)) {
+ readyRequests.push(request);
+ } else {
+ stillPending.push(request);
+ }
+ }
+
+ pending = stillPending;
+ for (const request of readyRequests) {
+ request.run(dispatch, getState, action);
+ }
+ }
+
+ return next => action => {
+ if (action.type === NAME) {
+ pending.push(action);
+ return null;
+ }
+ const result = next(action);
+ checkPending(action);
+ return result;
+ };
+}
diff --git a/devtools/client/debugger/src/actions/utils/moz.build b/devtools/client/debugger/src/actions/utils/moz.build
new file mode 100644
index 0000000000..08a43a218c
--- /dev/null
+++ b/devtools/client/debugger/src/actions/utils/moz.build
@@ -0,0 +1,12 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DIRS += [
+ "middleware",
+]
+
+CompiledModules(
+ "create-store.js",
+)
diff --git a/devtools/client/debugger/src/client/README.md b/devtools/client/debugger/src/client/README.md
new file mode 100644
index 0000000000..4681a4e15e
--- /dev/null
+++ b/devtools/client/debugger/src/client/README.md
@@ -0,0 +1,47 @@
+# DevTools Client
+
+The DevTools client is responsible for managing the communication between the
+client application and JS server.
+
+- When the server sends a notification to the client, the client receives an
+ "event" and notifies the application via redux actions.
+- When the application, wants to send a command to the server, it invokes
+ "commands" in the client.
+
+The Debugger supports a Firefox and a Chrome client, which lets it attach and
+debug Firefox, Chrome, and Node contexts. The clients are defined in
+`src/client` and have an `onConnect` function, and a `commands` and `events`
+module.
+
+Both clients implement client adapters for translating commands and events into
+JSON packets. The chrome client debugger adapter is defined in
+[chrome-remote-interface][chrome-remote-interface]. The Firefox client is maintained in
+[devtools-client.js][devtools-client.js].
+
+## Firefox
+
+### Remote Debugger Protocol
+
+The [Remote Debugger Protocol][protocol] specifies the client / server API.
+
+### Interrupt
+
+When the client wants to add a breakpoint, it avoids race conditions by doing
+temporary pauses called interrupts.
+
+We want to do these interrupts transparently, so we've decided that the client
+should not notify the application that the thread has been paused or resumed.
+
+[protocol]: https://searchfox.org/mozilla-central/source/devtools/docs/backend/protocol.md
+[devtools-client.js]: https://searchfox.org/mozilla-central/source/devtools/client/devtools-client.js
+
+## Chrome
+
+### Chrome Debugger Protocol
+
+The chrome debugger protocol is available [here][devtools-protocol-viewer]. And
+is maintained in the devtools-protocol [repo][devtools-protocol-gh].
+
+[chrome-remote-interface]: https://github.com/cyrus-and/chrome-remote-interface
+[devtools-protocol-viewer]: https://chromedevtools.github.io/devtools-protocol/
+[devtools-protocol-gh]: https://github.com/ChromeDevTools/devtools-protocol
diff --git a/devtools/client/debugger/src/client/firefox.js b/devtools/client/debugger/src/client/firefox.js
new file mode 100644
index 0000000000..6b76d6d175
--- /dev/null
+++ b/devtools/client/debugger/src/client/firefox.js
@@ -0,0 +1,206 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { setupCommands, clientCommands } from "./firefox/commands";
+import { setupCreate, createPause } from "./firefox/create";
+import { features } from "../utils/prefs";
+
+import { recordEvent } from "../utils/telemetry";
+import sourceQueue from "../utils/source-queue";
+
+let actions;
+let commands;
+let targetCommand;
+let resourceCommand;
+
+export async function onConnect(_commands, _resourceCommand, _actions, store) {
+ actions = _actions;
+ commands = _commands;
+ targetCommand = _commands.targetCommand;
+ resourceCommand = _resourceCommand;
+
+ setupCommands(commands);
+ setupCreate({ store });
+
+ sourceQueue.initialize(actions);
+
+ const { descriptorFront } = commands;
+
+ // For tab, browser and webextension toolboxes, we want to enable watching for
+ // worker targets as soon as the debugger is opened.
+ // And also for service workers, if the related experimental feature is enabled
+ if (
+ descriptorFront.isTabDescriptor ||
+ descriptorFront.isWebExtensionDescriptor ||
+ descriptorFront.isBrowserProcessDescriptor
+ ) {
+ targetCommand.listenForWorkers = true;
+ if (descriptorFront.isLocalTab && features.windowlessServiceWorkers) {
+ targetCommand.listenForServiceWorkers = true;
+ }
+ await targetCommand.startListening();
+ }
+
+ const options = {
+ // `pauseWorkersUntilAttach` is one option set when the debugger panel is opened rather that from the toolbox.
+ // The reason is to support early breakpoints in workers, which will force the workers to pause
+ // and later on (when TargetMixin.attachThread is called) resume worker execution, after passing the breakpoints.
+ // We only observe workers when the debugger panel is opened (see the few lines before and listenForWorkers = true).
+ // So if we were passing `pauseWorkersUntilAttach=true` from the toolbox code, workers would freeze as we would not watch
+ // for their targets and not resume them.
+ pauseWorkersUntilAttach: true,
+
+ // Bug 1719615 - Immediately turn on WASM debugging when the debugger opens.
+ // We avoid enabling that as soon as DevTools open as WASM generates different kind of machine code
+ // with debugging instruction which significantly increase the memory usage.
+ observeWasm: true,
+ };
+ await commands.threadConfigurationCommand.updateConfiguration(options);
+
+ await targetCommand.watchTargets({
+ types: targetCommand.ALL_TYPES,
+ onAvailable: onTargetAvailable,
+ onDestroyed: onTargetDestroyed,
+ });
+
+ // Use independant listeners for SOURCE and THREAD_STATE in order to ease
+ // doing batching and notify about a set of SOURCE's in one redux action.
+ await resourceCommand.watchResources([resourceCommand.TYPES.SOURCE], {
+ onAvailable: onSourceAvailable,
+ });
+ await resourceCommand.watchResources([resourceCommand.TYPES.THREAD_STATE], {
+ onAvailable: onThreadStateAvailable,
+ });
+ await resourceCommand.watchResources([resourceCommand.TYPES.JSTRACER_STATE], {
+ onAvailable: onTracingStateAvailable,
+ });
+
+ await resourceCommand.watchResources([resourceCommand.TYPES.ERROR_MESSAGE], {
+ onAvailable: actions.addExceptionFromResources,
+ });
+ await resourceCommand.watchResources([resourceCommand.TYPES.DOCUMENT_EVENT], {
+ onAvailable: onDocumentEventAvailable,
+ // we only care about future events for DOCUMENT_EVENT
+ ignoreExistingResources: true,
+ });
+}
+
+export function onDisconnect() {
+ targetCommand.unwatchTargets({
+ types: targetCommand.ALL_TYPES,
+ onAvailable: onTargetAvailable,
+ onDestroyed: onTargetDestroyed,
+ });
+ resourceCommand.unwatchResources([resourceCommand.TYPES.SOURCE], {
+ onAvailable: onSourceAvailable,
+ });
+ resourceCommand.unwatchResources([resourceCommand.TYPES.THREAD_STATE], {
+ onAvailable: onThreadStateAvailable,
+ });
+ resourceCommand.unwatchResources([resourceCommand.TYPES.JSTRACER_STATE], {
+ onAvailable: onTracingStateAvailable,
+ });
+ resourceCommand.unwatchResources([resourceCommand.TYPES.ERROR_MESSAGE], {
+ onAvailable: actions.addExceptionFromResources,
+ });
+ resourceCommand.unwatchResources([resourceCommand.TYPES.DOCUMENT_EVENT], {
+ onAvailable: onDocumentEventAvailable,
+ });
+ sourceQueue.clear();
+}
+
+async function onTargetAvailable({ targetFront, isTargetSwitching }) {
+ const isBrowserToolbox = commands.descriptorFront.isBrowserProcessDescriptor;
+ const isNonTopLevelFrameTarget =
+ !targetFront.isTopLevel &&
+ targetFront.targetType === targetCommand.TYPES.FRAME;
+
+ if (isBrowserToolbox && isNonTopLevelFrameTarget) {
+ // In the BrowserToolbox, non-top-level frame targets are already
+ // debugged via content-process targets.
+ // Do not attach the thread here, as it was already done by the
+ // corresponding content-process target.
+ return;
+ }
+
+ if (!targetFront.isTopLevel) {
+ await actions.addTarget(targetFront);
+ return;
+ }
+
+ // At this point, we expect the target and its thread to be attached.
+ const { threadFront } = targetFront;
+ if (!threadFront) {
+ console.error("The thread for", targetFront, "isn't attached.");
+ return;
+ }
+
+ // Retrieve possible event listener breakpoints
+ actions.getEventListenerBreakpointTypes().catch(e => console.error(e));
+
+ // Initialize the event breakpoints on the thread up front so that
+ // they are active once attached.
+ actions.addEventListenerBreakpoints([]).catch(e => console.error(e));
+
+ await actions.addTarget(targetFront);
+}
+
+function onTargetDestroyed({ targetFront }) {
+ actions.removeTarget(targetFront);
+}
+
+async function onSourceAvailable(sources) {
+ await actions.newGeneratedSources(sources);
+}
+
+async function onThreadStateAvailable(resources) {
+ for (const resource of resources) {
+ if (resource.targetFront.isDestroyed()) {
+ continue;
+ }
+ const threadFront = await resource.targetFront.getFront("thread");
+ if (resource.state == "paused") {
+ const pause = await createPause(threadFront.actorID, resource);
+ await actions.paused(pause);
+ recordEvent("pause", { reason: resource.why.type });
+ } else if (resource.state == "resumed") {
+ await actions.resumed(threadFront.actorID);
+ }
+ }
+}
+
+async function onTracingStateAvailable(resources) {
+ for (const resource of resources) {
+ if (resource.targetFront.isDestroyed()) {
+ continue;
+ }
+ const threadFront = await resource.targetFront.getFront("thread");
+ await actions.tracingToggled(threadFront.actor, resource.enabled);
+ }
+}
+
+function onDocumentEventAvailable(events) {
+ for (const event of events) {
+ // Only consider top level document, and ignore remote iframes top document
+ if (!event.targetFront.isTopLevel) continue;
+ // The browser toolbox debugger doesn't support the iframe dropdown.
+ // you will always see all the sources of all targets of your debugging context.
+ //
+ // But still allow it to clear the debugger when reloading the addon, or when
+ // switching between fallback document and other addon document.
+ if (
+ event.isFrameSwitching &&
+ !commands.descriptorFront.isWebExtensionDescriptor
+ ) {
+ continue;
+ }
+ if (event.name == "will-navigate") {
+ actions.willNavigate({ url: event.newURI });
+ } else if (event.name == "dom-complete") {
+ actions.navigated();
+ }
+ }
+}
+
+export { clientCommands };
diff --git a/devtools/client/debugger/src/client/firefox/commands.js b/devtools/client/debugger/src/client/firefox/commands.js
new file mode 100644
index 0000000000..5ef3ba27d0
--- /dev/null
+++ b/devtools/client/debugger/src/client/firefox/commands.js
@@ -0,0 +1,515 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { createFrame } from "./create";
+import { makeBreakpointServerLocationId } from "../../utils/breakpoint/index";
+
+import Reps from "devtools/client/shared/components/reps/index";
+
+let commands;
+let breakpoints;
+
+// The maximal number of stackframes to retrieve when pausing
+const CALL_STACK_PAGE_SIZE = 1000;
+
+function setupCommands(innerCommands) {
+ commands = innerCommands;
+ breakpoints = {};
+}
+
+function currentTarget() {
+ return commands.targetCommand.targetFront;
+}
+
+function currentThreadFront() {
+ return currentTarget().threadFront;
+}
+
+/**
+ * Create an object front for the passed grip
+ *
+ * @param {Object} grip
+ * @param {Object} frame: An optional frame that will manage the created object front.
+ * if not passed, the current thread front will manage the object.
+ * @returns {ObjectFront}
+ */
+function createObjectFront(grip, frame) {
+ if (!grip.actor) {
+ throw new Error("Actor is missing");
+ }
+ const threadFront = frame?.thread
+ ? lookupThreadFront(frame.thread)
+ : currentThreadFront();
+ const frameFront = frame ? threadFront.getActorByID(frame.id) : null;
+ return commands.client.createObjectFront(grip, threadFront, frameFront);
+}
+
+async function loadObjectProperties(root, threadActorID) {
+ const { utils } = Reps.objectInspector;
+ const properties = await utils.loadProperties.loadItemProperties(
+ root,
+ commands.client,
+ undefined,
+ threadActorID
+ );
+ return utils.node.getChildren({
+ item: root,
+ loadedProperties: new Map([[root.path, properties]]),
+ });
+}
+
+function releaseActor(actor) {
+ if (!actor) {
+ return Promise.resolve();
+ }
+ const objFront = commands.client.getFrontByID(actor);
+
+ if (!objFront) {
+ return Promise.resolve();
+ }
+
+ return objFront.release().catch(() => {});
+}
+
+function lookupTarget(thread) {
+ if (thread == currentThreadFront().actor) {
+ return currentTarget();
+ }
+
+ const targets = commands.targetCommand.getAllTargets(
+ commands.targetCommand.ALL_TYPES
+ );
+ return targets.find(target => target.targetForm.threadActor == thread);
+}
+
+function lookupThreadFront(thread) {
+ const target = lookupTarget(thread);
+ return target.threadFront;
+}
+
+function listThreadFronts() {
+ const targets = commands.targetCommand.getAllTargets(
+ commands.targetCommand.ALL_TYPES
+ );
+ return targets.map(target => target.threadFront).filter(front => !!front);
+}
+
+function forEachThread(iteratee) {
+ // We have to be careful here to atomically initiate the operation on every
+ // thread, with no intervening await. Otherwise, other code could run and
+ // trigger additional thread operations. Requests on server threads will
+ // resolve in FIFO order, and this could result in client and server state
+ // going out of sync.
+
+ const promises = listThreadFronts().map(
+ // If a thread shuts down while sending the message then it will
+ // throw. Ignore these exceptions.
+ t => iteratee(t).catch(e => console.log(e))
+ );
+
+ return Promise.all(promises);
+}
+
+async function toggleTracing() {
+ return commands.tracerCommand.toggle();
+}
+
+function resume(thread, frameId) {
+ return lookupThreadFront(thread).resume();
+}
+
+function stepIn(thread, frameId) {
+ return lookupThreadFront(thread).stepIn(frameId);
+}
+
+function stepOver(thread, frameId) {
+ return lookupThreadFront(thread).stepOver(frameId);
+}
+
+function stepOut(thread, frameId) {
+ return lookupThreadFront(thread).stepOut(frameId);
+}
+
+function restart(thread, frameId) {
+ return lookupThreadFront(thread).restart(frameId);
+}
+
+function breakOnNext(thread) {
+ return lookupThreadFront(thread).breakOnNext();
+}
+
+async function sourceContents({ actor, thread }) {
+ const sourceThreadFront = lookupThreadFront(thread);
+ const sourceFront = sourceThreadFront.source({ actor });
+ const { source, contentType } = await sourceFront.source();
+ return { source, contentType };
+}
+
+async function setXHRBreakpoint(path, method) {
+ const hasWatcherSupport = commands.targetCommand.hasTargetWatcherSupport();
+ if (!hasWatcherSupport) {
+ // Without watcher support, forward setXHRBreakpoint to all threads.
+ await forEachThread(thread => thread.setXHRBreakpoint(path, method));
+ return;
+ }
+ const breakpointsFront =
+ await commands.targetCommand.watcherFront.getBreakpointListActor();
+ await breakpointsFront.setXHRBreakpoint(path, method);
+}
+
+async function removeXHRBreakpoint(path, method) {
+ const hasWatcherSupport = commands.targetCommand.hasTargetWatcherSupport();
+ if (!hasWatcherSupport) {
+ // Without watcher support, forward removeXHRBreakpoint to all threads.
+ await forEachThread(thread => thread.removeXHRBreakpoint(path, method));
+ return;
+ }
+ const breakpointsFront =
+ await commands.targetCommand.watcherFront.getBreakpointListActor();
+ await breakpointsFront.removeXHRBreakpoint(path, method);
+}
+
+export function toggleJavaScriptEnabled(enabled) {
+ return commands.targetConfigurationCommand.updateConfiguration({
+ javascriptEnabled: enabled,
+ });
+}
+
+async function addWatchpoint(object, property, label, watchpointType) {
+ if (!currentTarget().getTrait("watchpoints")) {
+ return;
+ }
+ const objectFront = createObjectFront(object);
+ await objectFront.addWatchpoint(property, label, watchpointType);
+}
+
+async function removeWatchpoint(object, property) {
+ if (!currentTarget().getTrait("watchpoints")) {
+ return;
+ }
+ const objectFront = createObjectFront(object);
+ await objectFront.removeWatchpoint(property);
+}
+
+function hasBreakpoint(location) {
+ return !!breakpoints[makeBreakpointServerLocationId(location)];
+}
+
+function getServerBreakpointsList() {
+ return Object.values(breakpoints);
+}
+
+async function setBreakpoint(location, options) {
+ const breakpoint = breakpoints[makeBreakpointServerLocationId(location)];
+ if (
+ breakpoint &&
+ JSON.stringify(breakpoint.options) == JSON.stringify(options)
+ ) {
+ return null;
+ }
+ breakpoints[makeBreakpointServerLocationId(location)] = { location, options };
+
+ // Map frontend options to a more restricted subset of what
+ // the server supports. For example frontend uses `hidden` attribute
+ // which isn't meant to be passed to the server.
+ // (note that protocol.js specification isn't enough to filter attributes,
+ // all primitive attributes will be passed as-is)
+ const serverOptions = {
+ condition: options.condition,
+ logValue: options.logValue,
+ };
+ const hasWatcherSupport = commands.targetCommand.hasTargetWatcherSupport();
+ if (!hasWatcherSupport) {
+ // Without watcher support, unconditionally forward setBreakpoint to all threads.
+ return forEachThread(async thread =>
+ thread.setBreakpoint(location, serverOptions)
+ );
+ }
+ const breakpointsFront =
+ await commands.targetCommand.watcherFront.getBreakpointListActor();
+ await breakpointsFront.setBreakpoint(location, serverOptions);
+
+ // Call setBreakpoint for threads linked to targets
+ // not managed by the watcher.
+ return forEachThread(async thread => {
+ if (
+ !commands.targetCommand.hasTargetWatcherSupport(
+ thread.targetFront.targetType
+ )
+ ) {
+ return thread.setBreakpoint(location, serverOptions);
+ }
+
+ return Promise.resolve();
+ });
+}
+
+async function removeBreakpoint(location) {
+ delete breakpoints[makeBreakpointServerLocationId(location)];
+
+ const hasWatcherSupport = commands.targetCommand.hasTargetWatcherSupport();
+ if (!hasWatcherSupport) {
+ // Without watcher support, unconditionally forward removeBreakpoint to all threads.
+ return forEachThread(async thread => thread.removeBreakpoint(location));
+ }
+ const breakpointsFront =
+ await commands.targetCommand.watcherFront.getBreakpointListActor();
+ await breakpointsFront.removeBreakpoint(location);
+
+ // Call removeBreakpoint for threads linked to targets
+ // not managed by the watcher.
+ return forEachThread(async thread => {
+ if (
+ !commands.targetCommand.hasTargetWatcherSupport(
+ thread.targetFront.targetType
+ )
+ ) {
+ return thread.removeBreakpoint(location);
+ }
+
+ return Promise.resolve();
+ });
+}
+
+async function evaluateExpressions(scripts, options) {
+ return Promise.all(scripts.map(script => evaluate(script, options)));
+}
+
+async function evaluate(script, { frameId, threadId } = {}) {
+ if (!currentTarget() || !script) {
+ return { result: null };
+ }
+
+ const selectedTargetFront = threadId ? lookupTarget(threadId) : null;
+
+ return commands.scriptCommand.execute(script, {
+ frameActor: frameId,
+ selectedTargetFront,
+ disableBreaks: true,
+ });
+}
+
+async function autocomplete(input, cursor, frameId) {
+ if (!currentTarget() || !input) {
+ return {};
+ }
+ const consoleFront = await currentTarget().getFront("console");
+ if (!consoleFront) {
+ return {};
+ }
+
+ return new Promise(resolve => {
+ consoleFront.autocomplete(
+ input,
+ cursor,
+ result => resolve(result),
+ frameId
+ );
+ });
+}
+
+function getProperties(thread, grip) {
+ const objClient = lookupThreadFront(thread).pauseGrip(grip);
+
+ return objClient.getPrototypeAndProperties().then(resp => {
+ const { ownProperties, safeGetterValues } = resp;
+ for (const name in safeGetterValues) {
+ const { enumerable, writable, getterValue } = safeGetterValues[name];
+ ownProperties[name] = { enumerable, writable, value: getterValue };
+ }
+ return resp;
+ });
+}
+
+async function getFrames(thread) {
+ const threadFront = lookupThreadFront(thread);
+ const response = await threadFront.getFrames(0, CALL_STACK_PAGE_SIZE);
+
+ return Promise.all(
+ response.frames.map((frame, i) => createFrame(thread, frame, i))
+ );
+}
+
+async function getFrameScopes(frame) {
+ const frameFront = lookupThreadFront(frame.thread).getActorByID(frame.id);
+ return frameFront.getEnvironment();
+}
+
+async function pauseOnDebuggerStatement(shouldPauseOnDebuggerStatement) {
+ await commands.threadConfigurationCommand.updateConfiguration({
+ shouldPauseOnDebuggerStatement,
+ });
+}
+
+async function pauseOnExceptions(
+ shouldPauseOnExceptions,
+ shouldPauseOnCaughtExceptions
+) {
+ await commands.threadConfigurationCommand.updateConfiguration({
+ pauseOnExceptions: shouldPauseOnExceptions,
+ ignoreCaughtExceptions: !shouldPauseOnCaughtExceptions,
+ });
+}
+
+async function blackBox(sourceActor, shouldBlackBox, ranges) {
+ const hasWatcherSupport = commands.targetCommand.hasTargetWatcherSupport();
+ if (hasWatcherSupport) {
+ const blackboxingFront =
+ await commands.targetCommand.watcherFront.getBlackboxingActor();
+ if (shouldBlackBox) {
+ await blackboxingFront.blackbox(sourceActor.url, ranges);
+ } else {
+ await blackboxingFront.unblackbox(sourceActor.url, ranges);
+ }
+ } else {
+ const sourceFront = currentThreadFront().source({
+ actor: sourceActor.actor,
+ });
+ // If there are no ranges, the whole source is being blackboxed
+ if (!ranges.length) {
+ await toggleBlackBoxSourceFront(sourceFront, shouldBlackBox);
+ return;
+ }
+ // Blackbox the specific ranges
+ for (const range of ranges) {
+ await toggleBlackBoxSourceFront(sourceFront, shouldBlackBox, range);
+ }
+ }
+}
+
+async function toggleBlackBoxSourceFront(sourceFront, shouldBlackBox, range) {
+ if (shouldBlackBox) {
+ await sourceFront.blackBox(range);
+ } else {
+ await sourceFront.unblackBox(range);
+ }
+}
+
+async function setSkipPausing(shouldSkip) {
+ await commands.threadConfigurationCommand.updateConfiguration({
+ skipBreakpoints: shouldSkip,
+ });
+}
+
+async function setEventListenerBreakpoints(ids) {
+ const hasWatcherSupport = commands.targetCommand.hasTargetWatcherSupport();
+ if (!hasWatcherSupport) {
+ await forEachThread(thread => thread.setActiveEventBreakpoints(ids));
+ return;
+ }
+ const breakpointListFront =
+ await commands.targetCommand.watcherFront.getBreakpointListActor();
+ await breakpointListFront.setActiveEventBreakpoints(ids);
+}
+
+async function getEventListenerBreakpointTypes() {
+ return currentThreadFront().getAvailableEventBreakpoints();
+}
+
+function pauseGrip(thread, func) {
+ return lookupThreadFront(thread).pauseGrip(func);
+}
+
+async function toggleEventLogging(logEventBreakpoints) {
+ await commands.threadConfigurationCommand.updateConfiguration({
+ logEventBreakpoints,
+ });
+}
+
+function getMainThread() {
+ return currentThreadFront().actor;
+}
+
+async function getSourceActorBreakpointPositions({ thread, actor }, range) {
+ const sourceThreadFront = lookupThreadFront(thread);
+ const sourceFront = sourceThreadFront.source({ actor });
+ return sourceFront.getBreakpointPositionsCompressed(range);
+}
+
+async function getSourceActorBreakableLines({ thread, actor }) {
+ let actorLines = [];
+ try {
+ const sourceThreadFront = lookupThreadFront(thread);
+ const sourceFront = sourceThreadFront.source({ actor });
+ actorLines = await sourceFront.getBreakableLines();
+ } catch (e) {
+ // Exceptions could be due to the target thread being shut down.
+ console.warn(`getSourceActorBreakableLines failed: ${e}`);
+ }
+
+ return actorLines;
+}
+
+function getFrontByID(actorID) {
+ return commands.client.getFrontByID(actorID);
+}
+
+function fetchAncestorFramePositions(index) {
+ currentThreadFront().fetchAncestorFramePositions(index);
+}
+
+async function setOverride(url, path) {
+ const hasWatcherSupport = commands.targetCommand.hasTargetWatcherSupport();
+ if (hasWatcherSupport) {
+ const networkFront =
+ await commands.targetCommand.watcherFront.getNetworkParentActor();
+ return networkFront.override(url, path);
+ }
+ return null;
+}
+
+async function removeOverride(url) {
+ const hasWatcherSupport = commands.targetCommand.hasTargetWatcherSupport();
+ if (hasWatcherSupport) {
+ const networkFront =
+ await commands.targetCommand.watcherFront.getNetworkParentActor();
+ networkFront.removeOverride(url);
+ }
+}
+
+const clientCommands = {
+ autocomplete,
+ blackBox,
+ createObjectFront,
+ loadObjectProperties,
+ releaseActor,
+ pauseGrip,
+ toggleTracing,
+ resume,
+ stepIn,
+ stepOut,
+ stepOver,
+ restart,
+ breakOnNext,
+ sourceContents,
+ getSourceActorBreakpointPositions,
+ getSourceActorBreakableLines,
+ hasBreakpoint,
+ getServerBreakpointsList,
+ setBreakpoint,
+ setXHRBreakpoint,
+ removeXHRBreakpoint,
+ addWatchpoint,
+ removeWatchpoint,
+ removeBreakpoint,
+ evaluate,
+ evaluateExpressions,
+ getProperties,
+ getFrameScopes,
+ getFrames,
+ pauseOnDebuggerStatement,
+ pauseOnExceptions,
+ toggleEventLogging,
+ getMainThread,
+ setSkipPausing,
+ setEventListenerBreakpoints,
+ getEventListenerBreakpointTypes,
+ getFrontByID,
+ fetchAncestorFramePositions,
+ toggleJavaScriptEnabled,
+ setOverride,
+ removeOverride,
+};
+
+export { setupCommands, clientCommands };
diff --git a/devtools/client/debugger/src/client/firefox/create.js b/devtools/client/debugger/src/client/firefox/create.js
new file mode 100644
index 0000000000..9c610a08dd
--- /dev/null
+++ b/devtools/client/debugger/src/client/firefox/create.js
@@ -0,0 +1,431 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// This module converts Firefox specific types to the generic types
+
+import {
+ hasSource,
+ hasSourceActor,
+ getSourceActor,
+ getSourceCount,
+} from "../../selectors/index";
+import { features } from "../../utils/prefs";
+import { isUrlExtension } from "../../utils/source";
+import { createLocation } from "../../utils/location";
+import { getDisplayURL } from "../../utils/sources-tree/getURL";
+
+let store;
+
+/**
+ * This function is to be called first before any other
+ * and allow having access to any instances of classes that are
+ * useful for this module
+ *
+ * @param {Object} dependencies
+ * @param {Object} dependencies.store
+ * The redux store object of the debugger frontend.
+ */
+export function setupCreate(dependencies) {
+ store = dependencies.store;
+}
+
+export async function createFrame(thread, frame, index = 0) {
+ // Because of throttling, the source related to the top frame may be available a bit late.
+ const sourceActor = await waitForSourceActorToBeRegisteredInStore(
+ frame.where.actor
+ );
+
+ const location = createLocation({
+ source: sourceActor.sourceObject,
+ sourceActor,
+ line: frame.where.line,
+ column: frame.where.column,
+ });
+
+ return {
+ id: frame.actorID,
+ thread,
+ displayName: frame.displayName,
+ location,
+ generatedLocation: location,
+ this: frame.this,
+ index,
+ asyncCause: frame.asyncCause,
+ state: frame.state,
+ type: frame.type,
+ };
+}
+
+/**
+ * Create an original frame object. Similar to the frame objects generated by createFrame.
+ * But with additional information related to SourceMap processing.
+ * For example, location and generatedLocation will be different.
+ *
+ * @param {Function} getState
+ * @param {Object} frame
+ * The frame for the generated location, i.e. WASM binary code.
+ * @param {String} id
+ * The new ID to use for the new frame object.
+ * @param {Object} originalFrame
+ * An object crafted by the SourceMap Worker with additional information
+ * about the original source code. i.e. the Rust, C++, whatever original source code.
+ * See XScope.search() for definition of this object.
+ */
+export function createWasmOriginalFrame(
+ generatedFrame,
+ id,
+ originalFrame,
+ originalFrameLocation
+) {
+ return {
+ id,
+ thread: generatedFrame.thread,
+ displayName: originalFrame.displayName,
+ location: originalFrameLocation,
+ generatedLocation: generatedFrame.generatedLocation,
+ this: generatedFrame.this,
+ index: generatedFrame.index,
+ asyncCause: generatedFrame.asyncCause,
+ state: generatedFrame.state,
+ type: generatedFrame.type,
+
+ // All additional fields only available for WASM original frames
+ isOriginal: true,
+ originalDisplayName: originalFrame.displayName,
+ originalVariables: originalFrame.variables,
+ };
+}
+
+/**
+ * This method wait for the given source actor to be registered in Redux store.
+ *
+ * @param {String} sourceActorId
+ * Actor ID of the source to be waiting for.
+ */
+async function waitForSourceActorToBeRegisteredInStore(sourceActorId) {
+ if (!hasSourceActor(store.getState(), sourceActorId)) {
+ await new Promise(resolve => {
+ const unsubscribe = store.subscribe(check);
+ let currentSize = null;
+ function check() {
+ const previousSize = currentSize;
+ currentSize = store.getState().sourceActors.mutableSourceActors.size;
+ // For perf reason, avoid any extra computation if sources did not change
+ if (previousSize == currentSize) {
+ return;
+ }
+ if (hasSourceActor(store.getState(), sourceActorId)) {
+ unsubscribe();
+ resolve();
+ }
+ }
+ });
+ }
+ return getSourceActor(store.getState(), sourceActorId);
+}
+
+/**
+ * This method wait for the given source to be registered in Redux store.
+ *
+ * @param {String} sourceId
+ * The id of the source to be waiting for.
+ */
+export async function waitForSourceToBeRegisteredInStore(sourceId) {
+ return new Promise(resolve => {
+ if (hasSource(store.getState(), sourceId)) {
+ resolve();
+ return;
+ }
+ const unsubscribe = store.subscribe(check);
+ let currentSize = null;
+ function check() {
+ const previousSize = currentSize;
+ currentSize = getSourceCount(store.getState());
+ // For perf reason, avoid any extra computation if sources did not change
+ if (previousSize == currentSize) {
+ return;
+ }
+ if (hasSource(store.getState(), sourceId)) {
+ unsubscribe();
+ resolve();
+ }
+ }
+ });
+}
+
+// Compute the reducer's source ID for a given source front/resource.
+//
+// We have four kind of "sources":
+// * "sources" in sources.js reducer, which map to 1 or many:
+// * "source actors" in source-actors.js reducer, which map 1 for 1 with:
+// * "SOURCE" resources coming from ResourceCommand API
+// * SourceFront, which are retrieved via `ThreadFront.source(sourceResource)`
+//
+// Note that SOURCE resources are actually the "form" of the SourceActor,
+// with the addition of `resourceType` and `targetFront` attributes.
+//
+// Unfortunately, the debugger frontend interacts with these 4 type of objects.
+// The last three actually try to represent the exact same thing.
+//
+// Here this method received a SOURCE resource (the 3rd bullet point)
+export function makeSourceId(sourceResource) {
+ // Allows Jest to use custom, simplier IDs
+ if ("mockedJestID" in sourceResource) {
+ return sourceResource.mockedJestID;
+ }
+ // By default, within a given target, all sources will be grouped by URL.
+ // You will be having a unique Source object in sources.js reducer,
+ // while you might have many Source Actor objects in source-actors.js reducer.
+ //
+ // There is two distinct usecases here:
+ // * HTML pages, which will have one source object which represents the whole HTML page
+ // and it will relate to many source actors. One for each inline <script> tag.
+ // Each script tag's source actor will actually return the whole content of the html page
+ // and not only this one script tag content.
+ // * Scripts with the same URL injected many times.
+ // For example, two <script src=""> with the same location
+ // Or by using eval("...// # SourceURL=")
+ // All the scripts will be grouped under a unique Source object, while having dedicated
+ // Source Actor objects.
+ // An important point this time is that each actor may have a different source text content.
+ // For now, the debugger arbitrarily picks the first source actor's text content and never
+ // updates it. (See bug 1751063)
+ if (sourceResource.url) {
+ return `source-url-${sourceResource.url}`;
+ }
+
+ // Otherwise, we are processing a source without URL.
+ // This is typically evals, console evaluations, setTimeout/setInterval strings,
+ // DOM event handler strings (i.e. `<div onclick="foo">`), ...
+ // The main way to interact with them is to use a debugger statement from them,
+ // or have other panels ask the debugger to open them (like DOM event handlers from the inspector).
+ // We can register transient breakpoints against them (i.e. they will only apply to the current source actor instance)
+ return `source-actor-${sourceResource.actor}`;
+}
+
+/**
+ * Create the source object for a generated source that is stored in sources.js reducer.
+ * These generated sources relate to JS code which run in the
+ * debugged runtime (as oppose to original sources
+ * which are only available in debugger's environment).
+ *
+ * @param {SOURCE} sourceResource
+ * SOURCE resource coming from the ResourceCommand API.
+ * This represents the `SourceActor` from the server codebase.
+ */
+export function createGeneratedSource(sourceResource) {
+ return createSourceObject({
+ id: makeSourceId(sourceResource),
+ url: sourceResource.url,
+ extensionName: sourceResource.extensionName,
+ isWasm: !!features.wasm && sourceResource.introductionType === "wasm",
+ isExtension:
+ (sourceResource.url && isUrlExtension(sourceResource.url)) || false,
+ isHTML: !!sourceResource.isInlineSource,
+ });
+}
+
+/**
+ * Create the source object that is stored in sources.js reducer.
+ *
+ * This is an internal helper to this module to ensure all sources have the same shape.
+ * Do not use it outside of this module!
+ */
+function createSourceObject({
+ id,
+ url,
+ extensionName = null,
+ isWasm = false,
+ isExtension = false,
+ isPrettyPrinted = false,
+ isOriginal = false,
+ isHTML = false,
+}) {
+ return {
+ // The ID, computed by:
+ // * `makeSourceId` for generated,
+ // * `generatedToOriginalId` for both source map and pretty printed original,
+ id,
+
+ // Absolute URL for the source. This may be a fake URL for pretty printed sources
+ url,
+
+ // A (slightly tweaked) URL object to represent the source URL.
+ // The URL object is augmented of a "group" attribute and some other standard attributes
+ // are modified from their typical value. See getDisplayURL implementation.
+ displayURL: getDisplayURL(url, extensionName),
+
+ // Only set for generated sources that are WebExtension sources.
+ // This is especially useful to display the extension name for content scripts
+ // that executes against the page we are debugging.
+ extensionName,
+
+ // Will be true if the source URL starts with moz-extension://,
+ // which most likely means the source is a content script.
+ // (Note that when debugging an add-on all generated sources will most likely have this flag set to true)
+ isExtension,
+
+ // True if WASM is enabled *and* the generated source is a WASM source
+ isWasm,
+
+ // True if this source is an HTML and relates to many sources actors,
+ // one for each of its inline <script>
+ isHTML,
+
+ // True, if this is an original pretty printed source
+ isPrettyPrinted,
+
+ // True for source map original files, as well as pretty printed sources
+ isOriginal,
+ };
+}
+
+/**
+ * Create the source object for a source mapped original source that is stored in sources.js reducer.
+ * These original sources referred to by source maps.
+ * This isn't code that runs in the runtime, so it isn't associated with anything
+ * on the server side. It is associated with a generated source for the related bundle file
+ * which itself relates to an actual code that runs in the runtime.
+ *
+ * @param {String} id
+ * The ID of the source, computed by source map codebase.
+ * @param {String} url
+ * The URL of the original source file.
+ */
+export function createSourceMapOriginalSource(id, url) {
+ return createSourceObject({
+ id,
+ url,
+ isOriginal: true,
+ });
+}
+
+/**
+ * Create the source object for a pretty printed original source that is stored in sources.js reducer.
+ * These original pretty printed sources aren't code that run in the runtime,
+ * so it isn't associated with anything on the server side.
+ * It is associated with a generated source for the non-pretty-printed file
+ * which itself relates to an actual code that runs in the runtime.
+ *
+ * @param {String} id
+ * The ID of the source, computed by pretty print.
+ * @param {String} url
+ * The URL of the pretty-printed source file.
+ * This URL doesn't work. It is the URL of the non-pretty-printed file with ":formated" suffix.
+ */
+export function createPrettyPrintOriginalSource(id, url) {
+ return createSourceObject({
+ id,
+ url,
+ isOriginal: true,
+ isPrettyPrinted: true,
+ });
+}
+
+/**
+ * Create the "source actor" object that is stored in source-actor.js reducer.
+ * This will represent server's source actor in the reducer universe.
+ *
+ * @param {SOURCE} sourceResource
+ * SOURCE resource coming from the ResourceCommand API.
+ * This represents the `SourceActor` from the server codebase.
+ * @param {Object} sourceObject
+ * Source object stored in redux, i.e. created via createSourceObject.
+ */
+export function createSourceActor(sourceResource, sourceObject) {
+ const actorId = sourceResource.actor;
+
+ return {
+ id: actorId,
+ actor: actorId,
+ // As sourceResource is only SourceActor's form and not the SourceFront,
+ // we have to go through the target to retrieve the related ThreadActor's ID.
+ thread: sourceResource.targetFront.getCachedFront("thread").actorID,
+ // `source` is the reducer source ID
+ source: makeSourceId(sourceResource),
+ sourceObject,
+ sourceMapBaseURL: sourceResource.sourceMapBaseURL,
+ sourceMapURL: sourceResource.sourceMapURL,
+ url: sourceResource.url,
+ introductionType: sourceResource.introductionType,
+ sourceStartLine: sourceResource.sourceStartLine,
+ sourceStartColumn: sourceResource.sourceStartColumn,
+ sourceLength: sourceResource.sourceLength,
+ };
+}
+
+/**
+ * Create a pause info object passed to paused action from
+ * the THREAD_STATE "paused" resource.
+ */
+export async function createPause(threadActorID, pausedThreadState) {
+ const frame = await createFrame(threadActorID, pausedThreadState.frame);
+ return {
+ thread: threadActorID,
+ frame,
+ why: pausedThreadState.why,
+ };
+}
+
+export function createThread(targetFront) {
+ const name = targetFront.isTopLevel
+ ? L10N.getStr("mainThread")
+ : targetFront.name;
+
+ return {
+ actor: targetFront.targetForm.threadActor,
+ url: targetFront.url,
+ isTopLevel: targetFront.isTopLevel,
+ targetType: targetFront.targetType,
+ name,
+ serviceWorkerStatus: targetFront.debuggerServiceWorkerStatus,
+ isWebExtension: targetFront.isWebExtension,
+ processID: targetFront.processID,
+ };
+}
+
+/**
+ * Defines the shape of a breakpoint
+ */
+export function createBreakpoint({
+ id,
+ thread,
+ disabled = false,
+ options = {},
+ location,
+ generatedLocation,
+ text,
+ originalText,
+}) {
+ return {
+ // The unique identifier (string) for the breakpoint, for details on its format and creation See `makeBreakpointId`
+ id,
+
+ // The thread actor id (string) which the source this breakpoint is created in belongs to
+ thread,
+
+ // This (boolean) specifies if the breakpoint is disabled or not
+ disabled,
+
+ // This (object) stores extra information about the breakpoint, which defines the type of the breakpoint (i.e conditional breakpoints, log points)
+ // {
+ // condition: <Boolean>,
+ // logValue: <String>,
+ // hidden: <Boolean>
+ // }
+ options,
+
+ // The location (object) information for the original source, for details on its format and structure See `createLocation`
+ location,
+
+ // The location (object) information for the generated source, for details on its format and structure See `createLocation`
+ generatedLocation,
+
+ // The text (string) on the line which the brekpoint is set in the generated source
+ text,
+
+ // The text (string) on the line which the breakpoint is set in the original source
+ originalText,
+ };
+}
diff --git a/devtools/client/debugger/src/client/firefox/moz.build b/devtools/client/debugger/src/client/firefox/moz.build
new file mode 100644
index 0000000000..9406133e17
--- /dev/null
+++ b/devtools/client/debugger/src/client/firefox/moz.build
@@ -0,0 +1,11 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DIRS += []
+
+CompiledModules(
+ "commands.js",
+ "create.js",
+)
diff --git a/devtools/client/debugger/src/client/moz.build b/devtools/client/debugger/src/client/moz.build
new file mode 100644
index 0000000000..cbaaa3a2a0
--- /dev/null
+++ b/devtools/client/debugger/src/client/moz.build
@@ -0,0 +1,12 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DIRS += [
+ "firefox",
+]
+
+CompiledModules(
+ "firefox.js",
+)
diff --git a/devtools/client/debugger/src/components/App.css b/devtools/client/debugger/src/components/App.css
new file mode 100644
index 0000000000..796bf84574
--- /dev/null
+++ b/devtools/client/debugger/src/components/App.css
@@ -0,0 +1,151 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+* {
+ box-sizing: border-box;
+}
+
+html,
+body {
+ height: 100%;
+ width: 100%;
+ margin: 0;
+ padding: 0;
+}
+
+#mount {
+ height: 100%;
+}
+
+button {
+ background: transparent;
+ border: none;
+ font-family: inherit;
+ font-size: inherit;
+}
+
+button:hover {
+ background-color: var(--theme-toolbar-background-hover);
+}
+
+.theme-dark button:hover {
+ background-color: var(--theme-toolbar-hover);
+}
+
+.debugger {
+ display: flex;
+ flex: 1;
+ height: 100%;
+}
+
+.debugger .tree-indent {
+ width: 16px;
+ margin-inline-start: 0;
+ border-inline-start: 0;
+}
+
+.editor-pane {
+ display: flex;
+ position: relative;
+ flex: 1;
+ background-color: var(--theme-body-background);
+ height: 100%;
+ overflow: hidden;
+}
+
+.editor-container {
+ width: 100%;
+ display: grid;
+ grid-template-areas:
+ "editor-header"
+ "editor "
+ "notification "
+ "editor-footer";
+ grid-template-rows:
+ var(--editor-header-height)
+ 1fr
+ auto
+ var(--editor-footer-height);
+ max-height: 100%;
+ overflow-y: auto;
+}
+
+.editor-notification-footer {
+ background: var(--theme-warning-background);
+ border-top: 1px solid var(--theme-warning-border);
+ color: var(--theme-warning-color);
+ padding: 0.5em;
+ gap: 8px;
+ grid-area: notification;
+ display: flex;
+}
+
+/* Utils */
+.absolute-center {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+}
+
+.d-flex {
+ display: flex;
+}
+
+.align-items-center {
+ align-items: center;
+}
+
+.rounded-circle {
+ border-radius: 50%;
+}
+
+.text-white {
+ color: white;
+}
+
+.text-center {
+ text-align: center;
+}
+
+.min-width-0 {
+ min-width: 0;
+}
+
+/*
+ Prevents horizontal scrollbar from displaying when
+ right pane collapsed (#7505)
+*/
+.split-box > .splitter:last-child {
+ display: none;
+}
+
+/**
+ * In RTL layouts, the Debugger UI overlays the splitters. See Bug 1731233.
+ * Note: we need to the `.debugger` prefix here to beat the specificity of the
+ * general rule defined in SlitBox.css for `.split-box.vert > .splitter`.
+ */
+.debugger .split-box.vert > .splitter {
+ border-left-width: var(--devtools-splitter-inline-start-width);
+ border-right-width: var(--devtools-splitter-inline-end-width);
+
+ margin-left: calc(-1 * var(--devtools-splitter-inline-start-width) - 1px);
+ margin-right: calc(-1 * var(--devtools-splitter-inline-end-width));
+}
+
+::-webkit-scrollbar {
+ width: 8px;
+ height: 8px;
+ background: transparent;
+}
+
+::-webkit-scrollbar-track {
+ border-radius: 8px;
+ background: transparent;
+}
+
+::-webkit-scrollbar-thumb {
+ border-radius: 8px;
+ background: rgba(113, 113, 113, 0.5);
+}
diff --git a/devtools/client/debugger/src/components/App.js b/devtools/client/debugger/src/components/App.js
new file mode 100644
index 0000000000..40911e5167
--- /dev/null
+++ b/devtools/client/debugger/src/components/App.js
@@ -0,0 +1,396 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React, { Component } from "devtools/client/shared/vendor/react";
+import {
+ div,
+ main,
+ span,
+} from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+import { connect } from "devtools/client/shared/vendor/react-redux";
+import { prefs } from "../utils/prefs";
+import { primaryPaneTabs } from "../constants";
+import actions from "../actions/index";
+import AccessibleImage from "./shared/AccessibleImage";
+
+import {
+ getSelectedLocation,
+ getPaneCollapse,
+ getActiveSearch,
+ getQuickOpenEnabled,
+ getOrientation,
+ getIsCurrentThreadPaused,
+ isMapScopesEnabled,
+ getSourceMapErrorForSourceActor,
+} from "../selectors/index";
+const KeyShortcuts = require("resource://devtools/client/shared/key-shortcuts.js");
+
+const SplitBox = require("resource://devtools/client/shared/components/splitter/SplitBox.js");
+const AppErrorBoundary = require("resource://devtools/client/shared/components/AppErrorBoundary.js");
+
+const shortcuts = new KeyShortcuts({ window });
+
+const horizontalLayoutBreakpoint = window.matchMedia("(min-width: 800px)");
+const verticalLayoutBreakpoint = window.matchMedia(
+ "(min-width: 10px) and (max-width: 799px)"
+);
+
+import { ShortcutsModal } from "./ShortcutsModal";
+import PrimaryPanes from "./PrimaryPanes/index";
+import Editor from "./Editor/index";
+import SecondaryPanes from "./SecondaryPanes/index";
+import WelcomeBox from "./WelcomeBox";
+import EditorTabs from "./Editor/Tabs";
+import EditorFooter from "./Editor/Footer";
+import QuickOpenModal from "./QuickOpenModal";
+
+class App extends Component {
+ constructor(props) {
+ super(props);
+ this.state = {
+ shortcutsModalEnabled: false,
+ startPanelSize: 0,
+ endPanelSize: 0,
+ };
+ }
+
+ static get propTypes() {
+ return {
+ activeSearch: PropTypes.oneOf(["file", "project"]),
+ closeActiveSearch: PropTypes.func.isRequired,
+ closeQuickOpen: PropTypes.func.isRequired,
+ endPanelCollapsed: PropTypes.bool.isRequired,
+ fluentBundles: PropTypes.array.isRequired,
+ openQuickOpen: PropTypes.func.isRequired,
+ orientation: PropTypes.oneOf(["horizontal", "vertical"]).isRequired,
+ quickOpenEnabled: PropTypes.bool.isRequired,
+ selectedLocation: PropTypes.object,
+ setActiveSearch: PropTypes.func.isRequired,
+ setOrientation: PropTypes.func.isRequired,
+ setPrimaryPaneTab: PropTypes.func.isRequired,
+ startPanelCollapsed: PropTypes.bool.isRequired,
+ toolboxDoc: PropTypes.object.isRequired,
+ showOriginalVariableMappingWarning: PropTypes.bool,
+ };
+ }
+
+ getChildContext() {
+ return {
+ fluentBundles: this.props.fluentBundles,
+ toolboxDoc: this.props.toolboxDoc,
+ shortcuts,
+ l10n: L10N,
+ };
+ }
+
+ componentDidMount() {
+ horizontalLayoutBreakpoint.addListener(this.onLayoutChange);
+ verticalLayoutBreakpoint.addListener(this.onLayoutChange);
+ this.setOrientation();
+
+ shortcuts.on(L10N.getStr("symbolSearch.search.key2"), e =>
+ this.toggleQuickOpenModal(e, "@")
+ );
+
+ [
+ L10N.getStr("sources.search.key2"),
+ L10N.getStr("sources.search.alt.key"),
+ ].forEach(key => shortcuts.on(key, this.toggleQuickOpenModal));
+
+ shortcuts.on(L10N.getStr("gotoLineModal.key3"), e =>
+ this.toggleQuickOpenModal(e, ":")
+ );
+
+ shortcuts.on(
+ L10N.getStr("projectTextSearch.key"),
+ this.jumpToProjectSearch
+ );
+
+ shortcuts.on("Escape", this.onEscape);
+ shortcuts.on("CmdOrCtrl+/", this.onCommandSlash);
+ }
+
+ componentWillUnmount() {
+ horizontalLayoutBreakpoint.removeListener(this.onLayoutChange);
+ verticalLayoutBreakpoint.removeListener(this.onLayoutChange);
+ shortcuts.off(
+ L10N.getStr("symbolSearch.search.key2"),
+ this.toggleQuickOpenModal
+ );
+
+ [
+ L10N.getStr("sources.search.key2"),
+ L10N.getStr("sources.search.alt.key"),
+ ].forEach(key => shortcuts.off(key, this.toggleQuickOpenModal));
+
+ shortcuts.off(L10N.getStr("gotoLineModal.key3"), this.toggleQuickOpenModal);
+
+ shortcuts.off(
+ L10N.getStr("projectTextSearch.key"),
+ this.jumpToProjectSearch
+ );
+
+ shortcuts.off("Escape", this.onEscape);
+ shortcuts.off("CmdOrCtrl+/", this.onCommandSlash);
+ }
+
+ jumpToProjectSearch = e => {
+ e.preventDefault();
+ this.props.setPrimaryPaneTab(primaryPaneTabs.PROJECT_SEARCH);
+ this.props.setActiveSearch(primaryPaneTabs.PROJECT_SEARCH);
+ };
+
+ onEscape = e => {
+ const {
+ activeSearch,
+ closeActiveSearch,
+ closeQuickOpen,
+ quickOpenEnabled,
+ } = this.props;
+ const { shortcutsModalEnabled } = this.state;
+
+ if (activeSearch) {
+ e.preventDefault();
+ closeActiveSearch();
+ }
+
+ if (quickOpenEnabled) {
+ e.preventDefault();
+ closeQuickOpen();
+ }
+
+ if (shortcutsModalEnabled) {
+ e.preventDefault();
+ this.toggleShortcutsModal();
+ }
+ };
+
+ onCommandSlash = () => {
+ this.toggleShortcutsModal();
+ };
+
+ isHorizontal() {
+ return this.props.orientation === "horizontal";
+ }
+
+ toggleQuickOpenModal = (e, query) => {
+ const { quickOpenEnabled, openQuickOpen, closeQuickOpen } = this.props;
+
+ e.preventDefault();
+ e.stopPropagation();
+
+ if (quickOpenEnabled === true) {
+ closeQuickOpen();
+ return;
+ }
+
+ if (query != null) {
+ openQuickOpen(query);
+ return;
+ }
+ openQuickOpen();
+ };
+
+ onLayoutChange = () => {
+ this.setOrientation();
+ };
+
+ setOrientation() {
+ // If the orientation does not match (if it is not visible) it will
+ // not setOrientation, or if it is the same as before, calling
+ // setOrientation will not cause a rerender.
+ if (horizontalLayoutBreakpoint.matches) {
+ this.props.setOrientation("horizontal");
+ } else if (verticalLayoutBreakpoint.matches) {
+ this.props.setOrientation("vertical");
+ }
+ }
+
+ renderEditorNotificationBar() {
+ if (this.props.sourceMapError) {
+ return div(
+ { className: "editor-notification-footer", "aria-role": "status" },
+ span(
+ { className: "info icon" },
+ React.createElement(AccessibleImage, { className: "sourcemap" })
+ ),
+ `Source Map Error: ${this.props.sourceMapError}`
+ );
+ }
+ if (this.props.showOriginalVariableMappingWarning) {
+ return div(
+ { className: "editor-notification-footer", "aria-role": "status" },
+ span(
+ { className: "info icon" },
+ React.createElement(AccessibleImage, { className: "sourcemap" })
+ ),
+ L10N.getFormatStr(
+ "editorNotificationFooter.noOriginalScopes",
+ L10N.getStr("scopes.showOriginalScopes")
+ )
+ );
+ }
+ return null;
+ }
+
+ renderEditorPane = () => {
+ const { startPanelCollapsed, endPanelCollapsed } = this.props;
+ const { endPanelSize, startPanelSize } = this.state;
+ const horizontal = this.isHorizontal();
+ return main(
+ {
+ className: "editor-pane",
+ },
+ div(
+ {
+ className: "editor-container",
+ },
+ React.createElement(EditorTabs, {
+ startPanelCollapsed: startPanelCollapsed,
+ endPanelCollapsed: endPanelCollapsed,
+ horizontal: horizontal,
+ }),
+ React.createElement(Editor, {
+ startPanelSize: startPanelSize,
+ endPanelSize: endPanelSize,
+ }),
+ !this.props.selectedLocation
+ ? React.createElement(WelcomeBox, {
+ horizontal,
+ toggleShortcutsModal: () => this.toggleShortcutsModal(),
+ })
+ : null,
+ this.renderEditorNotificationBar(),
+ React.createElement(EditorFooter, {
+ horizontal,
+ })
+ )
+ );
+ };
+
+ toggleShortcutsModal() {
+ this.setState(prevState => ({
+ shortcutsModalEnabled: !prevState.shortcutsModalEnabled,
+ }));
+ }
+
+ // Important so that the tabs chevron updates appropriately when
+ // the user resizes the left or right columns
+ triggerEditorPaneResize() {
+ const editorPane = window.document.querySelector(".editor-pane");
+ if (editorPane) {
+ editorPane.dispatchEvent(new Event("resizeend"));
+ }
+ }
+
+ renderLayout = () => {
+ const { startPanelCollapsed, endPanelCollapsed } = this.props;
+ const horizontal = this.isHorizontal();
+ return React.createElement(SplitBox, {
+ style: {
+ width: "100vw",
+ },
+ initialSize: prefs.endPanelSize,
+ minSize: 30,
+ maxSize: "70%",
+ splitterSize: 1,
+ vert: horizontal,
+ onResizeEnd: num => {
+ prefs.endPanelSize = num;
+ this.triggerEditorPaneResize();
+ },
+ startPanel: React.createElement(SplitBox, {
+ style: {
+ width: "100vw",
+ },
+ initialSize: prefs.startPanelSize,
+ minSize: 30,
+ maxSize: "85%",
+ splitterSize: 1,
+ onResizeEnd: num => {
+ prefs.startPanelSize = num;
+ this.triggerEditorPaneResize();
+ },
+ startPanelCollapsed: startPanelCollapsed,
+ startPanel: React.createElement(PrimaryPanes, {
+ horizontal,
+ }),
+ endPanel: this.renderEditorPane(),
+ }),
+ endPanelControl: true,
+ endPanel: React.createElement(SecondaryPanes, {
+ horizontal,
+ }),
+ endPanelCollapsed: endPanelCollapsed,
+ });
+ };
+
+ render() {
+ const { quickOpenEnabled } = this.props;
+ return div(
+ {
+ className: "debugger",
+ },
+ React.createElement(
+ AppErrorBoundary,
+ {
+ componentName: "Debugger",
+ panel: L10N.getStr("ToolboxDebugger.label"),
+ },
+ this.renderLayout(),
+ quickOpenEnabled === true &&
+ React.createElement(QuickOpenModal, {
+ shortcutsModalEnabled: this.state.shortcutsModalEnabled,
+ toggleShortcutsModal: () => this.toggleShortcutsModal(),
+ }),
+ React.createElement(ShortcutsModal, {
+ enabled: this.state.shortcutsModalEnabled,
+ handleClose: () => this.toggleShortcutsModal(),
+ })
+ )
+ );
+ }
+}
+
+App.childContextTypes = {
+ toolboxDoc: PropTypes.object,
+ shortcuts: PropTypes.object,
+ l10n: PropTypes.object,
+ fluentBundles: PropTypes.array,
+};
+
+const mapStateToProps = state => {
+ const selectedLocation = getSelectedLocation(state);
+ const mapScopeEnabled = isMapScopesEnabled(state);
+ const isPaused = getIsCurrentThreadPaused(state);
+
+ const showOriginalVariableMappingWarning =
+ isPaused &&
+ selectedLocation?.source.isOriginal &&
+ !selectedLocation?.source.isPrettyPrinted &&
+ !mapScopeEnabled;
+
+ return {
+ showOriginalVariableMappingWarning,
+ selectedLocation,
+ startPanelCollapsed: getPaneCollapse(state, "start"),
+ endPanelCollapsed: getPaneCollapse(state, "end"),
+ activeSearch: getActiveSearch(state),
+ quickOpenEnabled: getQuickOpenEnabled(state),
+ orientation: getOrientation(state),
+ sourceMapError: selectedLocation?.sourceActor
+ ? getSourceMapErrorForSourceActor(state, selectedLocation.sourceActor.id)
+ : null,
+ };
+};
+
+export default connect(mapStateToProps, {
+ setActiveSearch: actions.setActiveSearch,
+ closeActiveSearch: actions.closeActiveSearch,
+ openQuickOpen: actions.openQuickOpen,
+ closeQuickOpen: actions.closeQuickOpen,
+ setOrientation: actions.setOrientation,
+ setPrimaryPaneTab: actions.setPrimaryPaneTab,
+})(App);
diff --git a/devtools/client/debugger/src/components/Editor/BlackboxLines.js b/devtools/client/debugger/src/components/Editor/BlackboxLines.js
new file mode 100644
index 0000000000..1281bc635a
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/BlackboxLines.js
@@ -0,0 +1,139 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+import { Component } from "devtools/client/shared/vendor/react";
+import { toEditorLine, fromEditorLine } from "../../utils/editor/index";
+import { isLineBlackboxed } from "../../utils/source";
+import { isWasm } from "../../utils/wasm";
+
+// This renders blackbox line highlighting in the editor
+class BlackboxLines extends Component {
+ static get propTypes() {
+ return {
+ editor: PropTypes.object.isRequired,
+ selectedSource: PropTypes.object.isRequired,
+ blackboxedRangesForSelectedSource: PropTypes.array,
+ isSourceOnIgnoreList: PropTypes.bool,
+ };
+ }
+
+ componentDidMount() {
+ const { selectedSource, blackboxedRangesForSelectedSource, editor } =
+ this.props;
+
+ if (this.props.isSourceOnIgnoreList) {
+ this.setAllBlackboxLines(editor);
+ return;
+ }
+
+ // When `blackboxedRangesForSelectedSource` is defined and the array is empty,
+ // the whole source was blackboxed.
+ if (!blackboxedRangesForSelectedSource.length) {
+ this.setAllBlackboxLines(editor);
+ } else {
+ editor.codeMirror.operation(() => {
+ blackboxedRangesForSelectedSource.forEach(range => {
+ const start = toEditorLine(selectedSource.id, range.start.line);
+ // CodeMirror.eachLine doesn't include `end` line offset, so bump by one
+ const end = toEditorLine(selectedSource.id, range.end.line) + 1;
+ editor.codeMirror.eachLine(start, end, lineHandle => {
+ this.setBlackboxLine(editor, lineHandle);
+ });
+ });
+ });
+ }
+ }
+
+ componentDidUpdate() {
+ const {
+ selectedSource,
+ blackboxedRangesForSelectedSource,
+ editor,
+ isSourceOnIgnoreList,
+ } = this.props;
+
+ if (this.props.isSourceOnIgnoreList) {
+ this.setAllBlackboxLines(editor);
+ return;
+ }
+
+ // when unblackboxed
+ if (!blackboxedRangesForSelectedSource) {
+ this.clearAllBlackboxLines(editor);
+ return;
+ }
+
+ // When the whole source is blackboxed
+ if (!blackboxedRangesForSelectedSource.length) {
+ this.setAllBlackboxLines(editor);
+ return;
+ }
+
+ const sourceIsWasm = isWasm(selectedSource.id);
+
+ // TODO: Possible perf improvement. Instead of going
+ // over all the lines each time get diffs of what has
+ // changed and update those.
+ editor.codeMirror.operation(() => {
+ editor.codeMirror.eachLine(lineHandle => {
+ const line = fromEditorLine(
+ selectedSource.id,
+ editor.codeMirror.getLineNumber(lineHandle),
+ sourceIsWasm
+ );
+
+ if (
+ isLineBlackboxed(
+ blackboxedRangesForSelectedSource,
+ line,
+ isSourceOnIgnoreList
+ )
+ ) {
+ this.setBlackboxLine(editor, lineHandle);
+ } else {
+ this.clearBlackboxLine(editor, lineHandle);
+ }
+ });
+ });
+ }
+
+ componentWillUnmount() {
+ // Lets make sure we remove everything relating to
+ // blackboxing lines when this component is unmounted.
+ this.clearAllBlackboxLines(this.props.editor);
+ }
+
+ clearAllBlackboxLines(editor) {
+ editor.codeMirror.operation(() => {
+ editor.codeMirror.eachLine(lineHandle => {
+ this.clearBlackboxLine(editor, lineHandle);
+ });
+ });
+ }
+
+ setAllBlackboxLines(editor) {
+ //TODO:We might be able to handle the whole source
+ // than adding the blackboxing line by line
+ editor.codeMirror.operation(() => {
+ editor.codeMirror.eachLine(lineHandle => {
+ this.setBlackboxLine(editor, lineHandle);
+ });
+ });
+ }
+
+ clearBlackboxLine(editor, lineHandle) {
+ editor.codeMirror.removeLineClass(lineHandle, "wrap", "blackboxed-line");
+ }
+
+ setBlackboxLine(editor, lineHandle) {
+ editor.codeMirror.addLineClass(lineHandle, "wrap", "blackboxed-line");
+ }
+
+ render() {
+ return null;
+ }
+}
+
+export default BlackboxLines;
diff --git a/devtools/client/debugger/src/components/Editor/Breakpoint.js b/devtools/client/debugger/src/components/Editor/Breakpoint.js
new file mode 100644
index 0000000000..4559a20289
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/Breakpoint.js
@@ -0,0 +1,157 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { PureComponent } from "devtools/client/shared/vendor/react";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+
+import { getDocument, toEditorLine } from "../../utils/editor/index";
+import { getSelectedLocation } from "../../utils/selected-location";
+import { features } from "../../utils/prefs";
+const classnames = require("resource://devtools/client/shared/classnames.js");
+
+const breakpointSvg = document.createElement("div");
+breakpointSvg.innerHTML =
+ '<svg viewBox="0 0 60 15" width="60" height="15"><path d="M53.07.5H1.5c-.54 0-1 .46-1 1v12c0 .54.46 1 1 1h51.57c.58 0 1.15-.26 1.53-.7l4.7-6.3-4.7-6.3c-.38-.44-.95-.7-1.53-.7z"/></svg>';
+
+class Breakpoint extends PureComponent {
+ static get propTypes() {
+ return {
+ breakpoint: PropTypes.object.isRequired,
+ editor: PropTypes.object.isRequired,
+ selectedSource: PropTypes.object,
+ };
+ }
+
+ componentDidMount() {
+ this.addBreakpoint(this.props);
+ }
+
+ componentDidUpdate(prevProps) {
+ this.removeBreakpoint(prevProps);
+ this.addBreakpoint(this.props);
+ }
+
+ componentWillUnmount() {
+ this.removeBreakpoint(this.props);
+ }
+
+ makeMarker() {
+ const { breakpoint } = this.props;
+ const bp = breakpointSvg.cloneNode(true);
+
+ bp.className = classnames("editor new-breakpoint", {
+ "breakpoint-disabled": breakpoint.disabled,
+ "folding-enabled": features.codeFolding,
+ });
+ bp.onmousedown = this.onClick;
+ bp.oncontextmenu = this.onContextMenu;
+
+ return bp;
+ }
+
+ onClick = event => {
+ const {
+ continueToHere,
+ toggleBreakpointsAtLine,
+ removeBreakpointsAtLine,
+ breakpoint,
+ selectedSource,
+ } = this.props;
+
+ // ignore right clicks
+ if ((event.ctrlKey && event.button === 0) || event.button === 2) {
+ return;
+ }
+
+ event.stopPropagation();
+ event.preventDefault();
+
+ const selectedLocation = getSelectedLocation(breakpoint, selectedSource);
+ if (event.metaKey) {
+ continueToHere(selectedLocation);
+ return;
+ }
+
+ if (event.shiftKey) {
+ toggleBreakpointsAtLine(!breakpoint.disabled, selectedLocation.line);
+ return;
+ }
+
+ removeBreakpointsAtLine(selectedLocation.source, selectedLocation.line);
+ };
+
+ onContextMenu = event => {
+ event.stopPropagation();
+ event.preventDefault();
+
+ this.props.showEditorEditBreakpointContextMenu(
+ event,
+ this.props.breakpoint
+ );
+ };
+
+ addBreakpoint(props) {
+ const { breakpoint, editor, selectedSource } = props;
+ // Hidden Breakpoints are never rendered on the client
+ if (breakpoint.options.hidden) {
+ return;
+ }
+
+ if (!selectedSource) {
+ return;
+ }
+
+ const doc = getDocument(selectedSource.id);
+ if (!doc) {
+ return;
+ }
+
+ const selectedLocation = getSelectedLocation(breakpoint, selectedSource);
+ const line = toEditorLine(selectedSource.id, selectedLocation.line);
+
+ doc.setGutterMarker(line, "breakpoints", this.makeMarker());
+
+ editor.codeMirror.addLineClass(line, "wrap", "new-breakpoint");
+ editor.codeMirror.removeLineClass(line, "wrap", "breakpoint-disabled");
+ editor.codeMirror.removeLineClass(line, "wrap", "has-condition");
+ editor.codeMirror.removeLineClass(line, "wrap", "has-log");
+
+ if (breakpoint.disabled) {
+ editor.codeMirror.addLineClass(line, "wrap", "breakpoint-disabled");
+ }
+
+ if (breakpoint.options.logValue) {
+ editor.codeMirror.addLineClass(line, "wrap", "has-log");
+ } else if (breakpoint.options.condition) {
+ editor.codeMirror.addLineClass(line, "wrap", "has-condition");
+ }
+ }
+
+ removeBreakpoint(props) {
+ const { selectedSource, breakpoint } = props;
+ if (!selectedSource) {
+ return;
+ }
+
+ const doc = getDocument(selectedSource.id);
+ if (!doc) {
+ return;
+ }
+
+ const selectedLocation = getSelectedLocation(breakpoint, selectedSource);
+ const line = toEditorLine(selectedSource.id, selectedLocation.line);
+
+ doc.setGutterMarker(line, "breakpoints", null);
+ doc.removeLineClass(line, "wrap", "new-breakpoint");
+ doc.removeLineClass(line, "wrap", "breakpoint-disabled");
+ doc.removeLineClass(line, "wrap", "has-condition");
+ doc.removeLineClass(line, "wrap", "has-log");
+ }
+
+ render() {
+ return null;
+ }
+}
+
+export default Breakpoint;
diff --git a/devtools/client/debugger/src/components/Editor/Breakpoints.css b/devtools/client/debugger/src/components/Editor/Breakpoints.css
new file mode 100644
index 0000000000..1269f73f82
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/Breakpoints.css
@@ -0,0 +1,153 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+.theme-light {
+ --gutter-hover-background-color: #dde1e4;
+ --breakpoint-fill: var(--blue-50);
+ --breakpoint-stroke: var(--blue-60);
+}
+
+.theme-dark {
+ --gutter-hover-background-color: #414141;
+ --breakpoint-fill: var(--blue-55);
+ --breakpoint-stroke: var(--blue-40);
+}
+
+.theme-light,
+.theme-dark {
+ --logpoint-fill: var(--theme-graphs-purple);
+ --logpoint-stroke: var(--purple-60);
+ --breakpoint-condition-fill: var(--theme-graphs-yellow);
+ --breakpoint-condition-stroke: var(--theme-graphs-orange);
+ --breakpoint-skipped-opacity: 0.15;
+ --breakpoint-inactive-opacity: 0.3;
+ --breakpoint-disabled-opacity: 0.6;
+}
+
+/* Standard gutter breakpoints */
+.editor-wrapper .breakpoints {
+ position: absolute;
+ top: 0;
+ left: 0;
+}
+
+.new-breakpoint .CodeMirror-linenumber {
+ pointer-events: none;
+}
+
+.editor-wrapper :not(.empty-line, .new-breakpoint)
+ > .CodeMirror-gutter-wrapper
+ > .CodeMirror-linenumber:hover::after {
+ content: "";
+ position: absolute;
+ /* paint below the number */
+ z-index: -1;
+ top: 0;
+ left: 0;
+ right: -4px;
+ bottom: 0;
+ height: 15px;
+ background-color: var(--gutter-hover-background-color);
+ mask: url(chrome://devtools/content/debugger/images/breakpoint.svg)
+ no-repeat;
+ mask-size: auto 15px;
+ mask-position: right;
+}
+
+.editor.new-breakpoint svg {
+ fill: var(--breakpoint-fill);
+ stroke: var(--breakpoint-stroke);
+ width: 60px;
+ height: 15px;
+ position: absolute;
+ top: 0px;
+ right: -4px;
+}
+
+.editor .breakpoint {
+ position: absolute;
+ right: -2px;
+}
+
+.editor.new-breakpoint.folding-enabled svg {
+ right: -16px;
+}
+
+.new-breakpoint.has-condition .CodeMirror-gutter-wrapper svg {
+ fill: var(--breakpoint-condition-fill);
+ stroke: var(--breakpoint-condition-stroke);
+}
+
+.new-breakpoint.has-log .CodeMirror-gutter-wrapper svg {
+ fill: var(--logpoint-fill);
+ stroke: var(--logpoint-stroke);
+}
+
+.editor.new-breakpoint.breakpoint-disabled svg,
+.blackboxed-line .editor.new-breakpoint svg {
+ fill-opacity: var(--breakpoint-disabled-opacity);
+ stroke-opacity: var(--breakpoint-disabled-opacity);
+}
+
+.editor-wrapper.skip-pausing .editor.new-breakpoint svg {
+ fill-opacity: var(--breakpoint-skipped-opacity);
+}
+
+/* Columnn breakpoints */
+.column-breakpoint {
+ display: inline;
+ padding-inline-start: 1px;
+ padding-inline-end: 1px;
+}
+
+.column-breakpoint:hover {
+ background-color: transparent;
+}
+
+.column-breakpoint svg {
+ display: inline-block;
+ cursor: pointer;
+ height: 13px;
+ width: 11px;
+ vertical-align: top;
+ fill: var(--breakpoint-fill);
+ stroke: var(--breakpoint-stroke);
+ fill-opacity: var(--breakpoint-inactive-opacity);
+ stroke-opacity: var(--breakpoint-inactive-opacity);
+}
+
+.column-breakpoint.active svg {
+ fill: var(--breakpoint-fill);
+ stroke: var(--breakpoint-stroke);
+ fill-opacity: 1;
+ stroke-opacity: 1;
+}
+
+.column-breakpoint.disabled svg {
+ fill-opacity: var(--breakpoint-disabled-opacity);
+ stroke-opacity: var(--breakpoint-disabled-opacity);
+}
+
+.column-breakpoint.has-log.disabled svg {
+ fill-opacity: 0.5;
+ stroke-opacity: 0.5;
+}
+
+.column-breakpoint.has-condition svg {
+ fill: var(--breakpoint-condition-fill);
+ stroke: var(--breakpoint-condition-stroke);
+}
+
+.column-breakpoint.has-log svg {
+ fill: var(--logpoint-fill);
+ stroke: var(--logpoint-stroke);
+}
+
+.editor-wrapper.skip-pausing .column-breakpoint svg {
+ fill-opacity: var(--breakpoint-skipped-opacity);
+}
+
+.img.column-marker {
+ background-image: url(chrome://devtools/content/debugger/images/column-marker.svg);
+}
diff --git a/devtools/client/debugger/src/components/Editor/Breakpoints.js b/devtools/client/debugger/src/components/Editor/Breakpoints.js
new file mode 100644
index 0000000000..6d1d088f11
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/Breakpoints.js
@@ -0,0 +1,78 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+import React, { Component } from "devtools/client/shared/vendor/react";
+import { div } from "devtools/client/shared/vendor/react-dom-factories";
+import Breakpoint from "./Breakpoint";
+
+import {
+ getSelectedSource,
+ getFirstVisibleBreakpoints,
+} from "../../selectors/index";
+import { makeBreakpointId } from "../../utils/breakpoint/index";
+import { connect } from "devtools/client/shared/vendor/react-redux";
+import actions from "../../actions/index";
+
+class Breakpoints extends Component {
+ static get propTypes() {
+ return {
+ breakpoints: PropTypes.array,
+ editor: PropTypes.object,
+ selectedSource: PropTypes.object,
+ removeBreakpointsAtLine: PropTypes.func,
+ toggleBreakpointsAtLine: PropTypes.func,
+ continueToHere: PropTypes.func,
+ showEditorEditBreakpointContextMenu: PropTypes.func,
+ };
+ }
+ render() {
+ const {
+ breakpoints,
+ selectedSource,
+ editor,
+ showEditorEditBreakpointContextMenu,
+ continueToHere,
+ toggleBreakpointsAtLine,
+ removeBreakpointsAtLine,
+ } = this.props;
+
+ if (!selectedSource || !breakpoints) {
+ return null;
+ }
+ return div(
+ null,
+ breakpoints.map(breakpoint => {
+ return React.createElement(Breakpoint, {
+ key: makeBreakpointId(breakpoint.location),
+ breakpoint,
+ selectedSource,
+ showEditorEditBreakpointContextMenu,
+ continueToHere,
+ toggleBreakpointsAtLine,
+ removeBreakpointsAtLine,
+ editor,
+ });
+ })
+ );
+ }
+}
+
+const mapStateToProps = state => {
+ const selectedSource = getSelectedSource(state);
+ return {
+ // Retrieves only the first breakpoint per line so that the
+ // breakpoint marker represents only the first breakpoint
+ breakpoints: getFirstVisibleBreakpoints(state),
+ selectedSource,
+ };
+};
+
+export default connect(mapStateToProps, {
+ showEditorEditBreakpointContextMenu:
+ actions.showEditorEditBreakpointContextMenu,
+ continueToHere: actions.continueToHere,
+ toggleBreakpointsAtLine: actions.toggleBreakpointsAtLine,
+ removeBreakpointsAtLine: actions.removeBreakpointsAtLine,
+})(Breakpoints);
diff --git a/devtools/client/debugger/src/components/Editor/ColumnBreakpoint.js b/devtools/client/debugger/src/components/Editor/ColumnBreakpoint.js
new file mode 100644
index 0000000000..867f3af4b7
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/ColumnBreakpoint.js
@@ -0,0 +1,128 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { PureComponent } from "devtools/client/shared/vendor/react";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+
+import { getDocument } from "../../utils/editor/index";
+const classnames = require("resource://devtools/client/shared/classnames.js");
+
+// eslint-disable-next-line max-len
+
+const breakpointButton = document.createElement("button");
+breakpointButton.innerHTML =
+ '<svg viewBox="0 0 11 13" width="11" height="13"><path d="M5.07.5H1.5c-.54 0-1 .46-1 1v10c0 .54.46 1 1 1h3.57c.58 0 1.15-.26 1.53-.7l3.7-5.3-3.7-5.3C6.22.76 5.65.5 5.07.5z"/></svg>';
+
+function makeBookmark({ breakpoint }, { onClick, onContextMenu }) {
+ const bp = breakpointButton.cloneNode(true);
+
+ const isActive = breakpoint && !breakpoint.disabled;
+ const isDisabled = breakpoint?.disabled;
+ const condition = breakpoint?.options.condition;
+ const logValue = breakpoint?.options.logValue;
+
+ bp.className = classnames("column-breakpoint", {
+ "has-condition": condition,
+ "has-log": logValue,
+ active: isActive,
+ disabled: isDisabled,
+ });
+
+ bp.setAttribute("title", logValue || condition || "");
+ bp.onclick = onClick;
+ bp.oncontextmenu = onContextMenu;
+
+ return bp;
+}
+
+export default class ColumnBreakpoint extends PureComponent {
+ bookmark;
+
+ static get propTypes() {
+ return {
+ columnBreakpoint: PropTypes.object.isRequired,
+ source: PropTypes.object.isRequired,
+ };
+ }
+
+ addColumnBreakpoint = nextProps => {
+ const { columnBreakpoint, source } = nextProps || this.props;
+
+ const sourceId = source.id;
+ const doc = getDocument(sourceId);
+ if (!doc) {
+ return;
+ }
+
+ const { line, column } = columnBreakpoint.location;
+ const widget = makeBookmark(columnBreakpoint, {
+ onClick: this.onClick,
+ onContextMenu: this.onContextMenu,
+ });
+
+ this.bookmark = doc.setBookmark({ line: line - 1, ch: column }, { widget });
+ };
+
+ clearColumnBreakpoint = () => {
+ if (this.bookmark) {
+ this.bookmark.clear();
+ this.bookmark = null;
+ }
+ };
+
+ onClick = event => {
+ event.stopPropagation();
+ event.preventDefault();
+ const {
+ columnBreakpoint,
+ toggleDisabledBreakpoint,
+ removeBreakpoint,
+ addBreakpoint,
+ } = this.props;
+
+ // disable column breakpoint on shift-click.
+ if (event.shiftKey) {
+ toggleDisabledBreakpoint(columnBreakpoint.breakpoint);
+ return;
+ }
+
+ if (columnBreakpoint.breakpoint) {
+ removeBreakpoint(columnBreakpoint.breakpoint);
+ } else {
+ addBreakpoint(columnBreakpoint.location);
+ }
+ };
+
+ onContextMenu = event => {
+ event.stopPropagation();
+ event.preventDefault();
+
+ const {
+ columnBreakpoint: { breakpoint, location },
+ } = this.props;
+
+ if (breakpoint) {
+ this.props.showEditorEditBreakpointContextMenu(event, breakpoint);
+ } else {
+ this.props.showEditorCreateBreakpointContextMenu(event, location);
+ }
+ };
+
+ componentDidMount() {
+ this.addColumnBreakpoint();
+ }
+
+ componentWillUnmount() {
+ this.clearColumnBreakpoint();
+ }
+
+ componentDidUpdate() {
+ this.clearColumnBreakpoint();
+ this.addColumnBreakpoint();
+ }
+
+ render() {
+ return null;
+ }
+}
diff --git a/devtools/client/debugger/src/components/Editor/ColumnBreakpoints.js b/devtools/client/debugger/src/components/Editor/ColumnBreakpoints.js
new file mode 100644
index 0000000000..33ccfad325
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/ColumnBreakpoints.js
@@ -0,0 +1,94 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React, { Component } from "devtools/client/shared/vendor/react";
+import { div } from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+
+import ColumnBreakpoint from "./ColumnBreakpoint";
+
+import {
+ getSelectedSource,
+ visibleColumnBreakpoints,
+ isSourceBlackBoxed,
+} from "../../selectors/index";
+import actions from "../../actions/index";
+import { connect } from "devtools/client/shared/vendor/react-redux";
+import { makeBreakpointId } from "../../utils/breakpoint/index";
+
+// eslint-disable-next-line max-len
+
+class ColumnBreakpoints extends Component {
+ static get propTypes() {
+ return {
+ columnBreakpoints: PropTypes.array.isRequired,
+ editor: PropTypes.object.isRequired,
+ selectedSource: PropTypes.object,
+ addBreakpoint: PropTypes.func,
+ removeBreakpoint: PropTypes.func,
+ toggleDisabledBreakpoint: PropTypes.func,
+ showEditorCreateBreakpointContextMenu: PropTypes.func,
+ showEditorEditBreakpointContextMenu: PropTypes.func,
+ };
+ }
+
+ render() {
+ const {
+ editor,
+ columnBreakpoints,
+ selectedSource,
+ showEditorCreateBreakpointContextMenu,
+ showEditorEditBreakpointContextMenu,
+ toggleDisabledBreakpoint,
+ removeBreakpoint,
+ addBreakpoint,
+ } = this.props;
+
+ if (!selectedSource || columnBreakpoints.length === 0) {
+ return null;
+ }
+
+ let breakpoints;
+ editor.codeMirror.operation(() => {
+ breakpoints = columnBreakpoints.map(columnBreakpoint =>
+ React.createElement(ColumnBreakpoint, {
+ key: makeBreakpointId(columnBreakpoint.location),
+ columnBreakpoint,
+ editor,
+ source: selectedSource,
+ showEditorCreateBreakpointContextMenu,
+ showEditorEditBreakpointContextMenu,
+ toggleDisabledBreakpoint,
+ removeBreakpoint,
+ addBreakpoint,
+ })
+ );
+ });
+ return div(null, breakpoints);
+ }
+}
+
+const mapStateToProps = state => {
+ // Avoid rendering this component is there is no selected source,
+ // or if the selected source is blackboxed.
+ // Also avoid computing visible column breakpoint when this happens.
+ const selectedSource = getSelectedSource(state);
+ if (!selectedSource || isSourceBlackBoxed(state, selectedSource)) {
+ return {};
+ }
+ return {
+ selectedSource,
+ columnBreakpoints: visibleColumnBreakpoints(state),
+ };
+};
+
+export default connect(mapStateToProps, {
+ showEditorCreateBreakpointContextMenu:
+ actions.showEditorCreateBreakpointContextMenu,
+ showEditorEditBreakpointContextMenu:
+ actions.showEditorEditBreakpointContextMenu,
+ toggleDisabledBreakpoint: actions.toggleDisabledBreakpoint,
+ removeBreakpoint: actions.removeBreakpoint,
+ addBreakpoint: actions.addBreakpoint,
+})(ColumnBreakpoints);
diff --git a/devtools/client/debugger/src/components/Editor/ConditionalPanel.css b/devtools/client/debugger/src/components/Editor/ConditionalPanel.css
new file mode 100644
index 0000000000..4ce8dbcd8c
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/ConditionalPanel.css
@@ -0,0 +1,39 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+.conditional-breakpoint-panel {
+ cursor: initial;
+ margin: 1em 0;
+ position: relative;
+ display: flex;
+ align-items: center;
+ background: var(--theme-toolbar-background);
+ border-top: 1px solid var(--theme-splitter-color);
+ border-bottom: 1px solid var(--theme-splitter-color);
+}
+
+.conditional-breakpoint-panel .prompt {
+ font-size: 1.8em;
+ color: var(--theme-graphs-orange);
+ padding-left: 3px;
+ padding-right: 3px;
+ padding-bottom: 3px;
+ text-align: right;
+ width: 30px;
+ align-self: baseline;
+ margin-top: 3px;
+}
+
+.conditional-breakpoint-panel.log-point .prompt {
+ color: var(--purple-60);
+}
+
+.conditional-breakpoint-panel .CodeMirror {
+ margin: 6px 10px;
+}
+
+.conditional-breakpoint-panel .CodeMirror pre.CodeMirror-placeholder {
+ /* Match the color of the placeholder text to existing inputs in the Debugger */
+ color: var(--theme-text-color-alt);
+}
diff --git a/devtools/client/debugger/src/components/Editor/ConditionalPanel.js b/devtools/client/debugger/src/components/Editor/ConditionalPanel.js
new file mode 100644
index 0000000000..8ff84c287a
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/ConditionalPanel.js
@@ -0,0 +1,280 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { PureComponent } from "devtools/client/shared/vendor/react";
+import {
+ div,
+ textarea,
+} from "devtools/client/shared/vendor/react-dom-factories";
+import ReactDOM from "devtools/client/shared/vendor/react-dom";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+import { connect } from "devtools/client/shared/vendor/react-redux";
+import { toEditorLine } from "../../utils/editor/index";
+import { prefs } from "../../utils/prefs";
+import actions from "../../actions/index";
+
+import {
+ getClosestBreakpoint,
+ getConditionalPanelLocation,
+ getLogPointStatus,
+} from "../../selectors/index";
+
+const classnames = require("resource://devtools/client/shared/classnames.js");
+
+function addNewLine(doc) {
+ const cursor = doc.getCursor();
+ const pos = { line: cursor.line, ch: cursor.ch };
+ doc.replaceRange("\n", pos);
+}
+
+export class ConditionalPanel extends PureComponent {
+ cbPanel;
+ input;
+ codeMirror;
+ panelNode;
+ scrollParent;
+
+ constructor() {
+ super();
+ this.cbPanel = null;
+ }
+
+ static get propTypes() {
+ return {
+ breakpoint: PropTypes.object,
+ closeConditionalPanel: PropTypes.func.isRequired,
+ editor: PropTypes.object.isRequired,
+ location: PropTypes.any.isRequired,
+ log: PropTypes.bool.isRequired,
+ openConditionalPanel: PropTypes.func.isRequired,
+ setBreakpointOptions: PropTypes.func.isRequired,
+ };
+ }
+
+ keepFocusOnInput() {
+ if (this.input) {
+ this.input.focus();
+ }
+ }
+
+ saveAndClose = () => {
+ if (this.input) {
+ this.setBreakpoint(this.input.value.trim());
+ }
+
+ this.props.closeConditionalPanel();
+ };
+
+ onKey = e => {
+ if (e.key === "Enter") {
+ if (this.codeMirror && e.altKey) {
+ addNewLine(this.codeMirror.doc);
+ } else {
+ this.saveAndClose();
+ }
+ } else if (e.key === "Escape") {
+ this.props.closeConditionalPanel();
+ }
+ };
+
+ setBreakpoint(value) {
+ const { log, breakpoint } = this.props;
+ // If breakpoint is `pending`, props will not contain a breakpoint.
+ // If source is a URL without location, breakpoint will contain no generatedLocation.
+ const location =
+ breakpoint && breakpoint.generatedLocation
+ ? breakpoint.generatedLocation
+ : this.props.location;
+ const options = breakpoint ? breakpoint.options : {};
+ const type = log ? "logValue" : "condition";
+ return this.props.setBreakpointOptions(location, {
+ ...options,
+ [type]: value,
+ });
+ }
+
+ clearConditionalPanel() {
+ if (this.cbPanel) {
+ this.cbPanel.clear();
+ this.cbPanel = null;
+ }
+ if (this.scrollParent) {
+ this.scrollParent.removeEventListener("scroll", this.repositionOnScroll);
+ }
+ }
+
+ repositionOnScroll = () => {
+ if (this.panelNode && this.scrollParent) {
+ const { scrollLeft } = this.scrollParent;
+ this.panelNode.style.transform = `translateX(${scrollLeft}px)`;
+ }
+ };
+
+ // FIXME: https://bugzilla.mozilla.org/show_bug.cgi?id=1774507
+ UNSAFE_componentWillMount() {
+ return this.renderToWidget(this.props);
+ }
+
+ // FIXME: https://bugzilla.mozilla.org/show_bug.cgi?id=1774507
+ UNSAFE_componentWillUpdate() {
+ return this.clearConditionalPanel();
+ }
+
+ componentDidUpdate(prevProps) {
+ this.keepFocusOnInput();
+ }
+
+ componentWillUnmount() {
+ // This is called if CodeMirror is re-initializing itself before the
+ // user closes the conditional panel. Clear the widget, and re-render it
+ // as soon as this component gets remounted
+ return this.clearConditionalPanel();
+ }
+
+ renderToWidget(props) {
+ if (this.cbPanel) {
+ this.clearConditionalPanel();
+ }
+ const { location, editor } = props;
+
+ const editorLine = toEditorLine(location.source.id, location.line || 0);
+ this.cbPanel = editor.codeMirror.addLineWidget(
+ editorLine,
+ this.renderConditionalPanel(props),
+ {
+ coverGutter: true,
+ noHScroll: true,
+ }
+ );
+
+ if (this.input) {
+ let parent = this.input.parentNode;
+ while (parent) {
+ if (
+ parent instanceof HTMLElement &&
+ parent.classList.contains("CodeMirror-scroll")
+ ) {
+ this.scrollParent = parent;
+ break;
+ }
+ parent = parent.parentNode;
+ }
+
+ if (this.scrollParent) {
+ this.scrollParent.addEventListener("scroll", this.repositionOnScroll);
+ this.repositionOnScroll();
+ }
+ }
+ }
+
+ createEditor = input => {
+ const { log, editor, closeConditionalPanel } = this.props;
+ const codeMirror = editor.CodeMirror.fromTextArea(input, {
+ mode: "javascript",
+ theme: "mozilla",
+ placeholder: L10N.getStr(
+ log
+ ? "editor.conditionalPanel.logPoint.placeholder2"
+ : "editor.conditionalPanel.placeholder2"
+ ),
+ cursorBlinkRate: prefs.cursorBlinkRate,
+ });
+
+ codeMirror.on("keydown", (cm, e) => {
+ if (e.key === "Enter") {
+ e.codemirrorIgnore = true;
+ }
+ });
+
+ codeMirror.on("blur", (cm, e) => {
+ if (
+ e?.relatedTarget &&
+ e.relatedTarget.closest(".conditional-breakpoint-panel")
+ ) {
+ return;
+ }
+
+ closeConditionalPanel();
+ });
+
+ const codeMirrorWrapper = codeMirror.getWrapperElement();
+
+ codeMirrorWrapper.addEventListener("keydown", e => {
+ codeMirror.save();
+ this.onKey(e);
+ });
+
+ this.input = input;
+ this.codeMirror = codeMirror;
+ codeMirror.focus();
+ codeMirror.setCursor(codeMirror.lineCount(), 0);
+ };
+
+ getDefaultValue() {
+ const { breakpoint, log } = this.props;
+ const options = breakpoint?.options || {};
+ return log ? options.logValue : options.condition;
+ }
+
+ renderConditionalPanel(props) {
+ const { log } = props;
+ const defaultValue = this.getDefaultValue();
+
+ const panel = document.createElement("div");
+ ReactDOM.render(
+ div(
+ {
+ className: classnames("conditional-breakpoint-panel", {
+ "log-point": log,
+ }),
+ onClick: () => this.keepFocusOnInput(),
+ ref: node => (this.panelNode = node),
+ },
+ div(
+ {
+ className: "prompt",
+ },
+ "»"
+ ),
+ textarea({
+ defaultValue,
+ ref: input => this.createEditor(input),
+ })
+ ),
+ panel
+ );
+ return panel;
+ }
+
+ render() {
+ return null;
+ }
+}
+
+const mapStateToProps = state => {
+ const location = getConditionalPanelLocation(state);
+
+ if (!location) {
+ throw new Error("Conditional panel location needed.");
+ }
+
+ const breakpoint = getClosestBreakpoint(state, location);
+
+ return {
+ breakpoint,
+ location,
+ log: getLogPointStatus(state),
+ };
+};
+
+const { setBreakpointOptions, openConditionalPanel, closeConditionalPanel } =
+ actions;
+
+const mapDispatchToProps = {
+ setBreakpointOptions,
+ openConditionalPanel,
+ closeConditionalPanel,
+};
+
+export default connect(mapStateToProps, mapDispatchToProps)(ConditionalPanel);
diff --git a/devtools/client/debugger/src/components/Editor/DebugLine.js b/devtools/client/debugger/src/components/Editor/DebugLine.js
new file mode 100644
index 0000000000..1b8e59ba64
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/DebugLine.js
@@ -0,0 +1,137 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { PureComponent } from "devtools/client/shared/vendor/react";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+import {
+ toEditorPosition,
+ getDocument,
+ hasDocument,
+ startOperation,
+ endOperation,
+ getTokenEnd,
+} from "../../utils/editor/index";
+import { isException } from "../../utils/pause/index";
+import { getIndentation } from "../../utils/indentation";
+import { connect } from "devtools/client/shared/vendor/react-redux";
+import {
+ getVisibleSelectedFrame,
+ getPauseReason,
+ getSourceTextContent,
+ getCurrentThread,
+} from "../../selectors/index";
+
+export class DebugLine extends PureComponent {
+ debugExpression;
+
+ static get propTypes() {
+ return {
+ location: PropTypes.object,
+ why: PropTypes.object,
+ };
+ }
+
+ componentDidMount() {
+ const { why, location } = this.props;
+ this.setDebugLine(why, location);
+ }
+
+ componentWillUnmount() {
+ const { why, location } = this.props;
+ this.clearDebugLine(why, location);
+ }
+
+ componentDidUpdate(prevProps) {
+ const { why, location } = this.props;
+
+ startOperation();
+ this.clearDebugLine(prevProps.why, prevProps.location);
+ this.setDebugLine(why, location);
+ endOperation();
+ }
+
+ setDebugLine(why, location) {
+ if (!location) {
+ return;
+ }
+ const doc = getDocument(location.source.id);
+
+ let { line, column } = toEditorPosition(location);
+ let { markTextClass, lineClass } = this.getTextClasses(why);
+ doc.addLineClass(line, "wrap", lineClass);
+
+ const lineText = doc.getLine(line);
+ column = Math.max(column, getIndentation(lineText));
+
+ // If component updates because user clicks on
+ // another source tab, codeMirror will be null.
+ const columnEnd = doc.cm ? getTokenEnd(doc.cm, line, column) : null;
+
+ if (columnEnd === null) {
+ markTextClass += " to-line-end";
+ }
+
+ this.debugExpression = doc.markText(
+ { ch: column, line },
+ { ch: columnEnd, line },
+ { className: markTextClass }
+ );
+ }
+
+ clearDebugLine(why, location) {
+ // Avoid clearing the line if we didn't set a debug line before,
+ // or, if the document is no longer available
+ if (!location || !hasDocument(location.source.id)) {
+ return;
+ }
+
+ if (this.debugExpression) {
+ this.debugExpression.clear();
+ }
+
+ const { line } = toEditorPosition(location);
+ const doc = getDocument(location.source.id);
+ const { lineClass } = this.getTextClasses(why);
+ doc.removeLineClass(line, "wrap", lineClass);
+ }
+
+ getTextClasses(why) {
+ if (why && isException(why)) {
+ return {
+ markTextClass: "debug-expression-error",
+ lineClass: "new-debug-line-error",
+ };
+ }
+
+ return { markTextClass: "debug-expression", lineClass: "new-debug-line" };
+ }
+
+ render() {
+ return null;
+ }
+}
+
+function isDocumentReady(location, sourceTextContent) {
+ return location && sourceTextContent && hasDocument(location.source.id);
+}
+
+const mapStateToProps = state => {
+ // Avoid unecessary intermediate updates when there is no location
+ // or the source text content isn't yet fully loaded
+ const frame = getVisibleSelectedFrame(state);
+ const location = frame?.location;
+ if (!location) {
+ return {};
+ }
+ const sourceTextContent = getSourceTextContent(state, location);
+ if (!isDocumentReady(location, sourceTextContent)) {
+ return {};
+ }
+ return {
+ location,
+ why: getPauseReason(state, getCurrentThread(state)),
+ };
+};
+
+export default connect(mapStateToProps)(DebugLine);
diff --git a/devtools/client/debugger/src/components/Editor/Editor.css b/devtools/client/debugger/src/components/Editor/Editor.css
new file mode 100644
index 0000000000..0c48da019e
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/Editor.css
@@ -0,0 +1,216 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+.editor-wrapper {
+ --debug-line-border: rgb(145, 188, 219);
+ --debug-expression-background: rgba(202, 227, 255, 0.5);
+ --debug-line-error-border: rgb(255, 0, 0);
+ --debug-expression-error-background: rgba(231, 116, 113, 0.3);
+ --line-exception-background: hsl(344, 73%, 97%);
+ --highlight-line-duration: 5000ms;
+}
+
+.theme-dark .editor-wrapper {
+ --debug-expression-background: rgba(202, 227, 255, 0.3);
+ --debug-line-border: #7786a2;
+ --line-exception-background: hsl(345, 23%, 24%);
+}
+
+.editor-wrapper .CodeMirror-linewidget {
+ margin-right: -7px;
+}
+
+.editor-wrapper {
+ min-width: 0 !important;
+}
+
+.CodeMirror.cm-s-mozilla,
+.CodeMirror-scroll,
+.CodeMirror-sizer {
+ overflow-anchor: none;
+}
+
+/* Prevents inline preview from shifting source height (#1576163) */
+.CodeMirror-linewidget {
+ padding: 0;
+ display: flow-root;
+}
+
+/**
+ * There's a known codemirror flex issue with chrome that this addresses.
+ * BUG https://github.com/firefox-devtools/debugger/issues/63
+ */
+.editor-wrapper {
+ width: calc(100% - 1px);
+ overflow-y: auto;
+ grid-area: editor;
+}
+
+html[dir="rtl"] .editor-mount {
+ direction: ltr;
+}
+
+.function-search {
+ max-height: 300px;
+ overflow: hidden;
+}
+
+.function-search .results {
+ height: auto;
+}
+
+.editor.hit-marker {
+ height: 15px;
+}
+
+.editor-wrapper .highlight-lines {
+ background: var(--theme-selection-background-hover);
+}
+
+.CodeMirror {
+ width: 100%;
+ height: 100%;
+}
+
+.editor-wrapper .editor-mount {
+ width: 100%;
+ background-color: var(--theme-body-background);
+ font-size: var(--theme-code-font-size);
+ line-height: var(--theme-code-line-height);
+}
+
+/* set the linenumber white when there is a breakpoint */
+.editor-wrapper:not(.skip-pausing)
+ .new-breakpoint
+ .CodeMirror-gutter-wrapper
+ .CodeMirror-linenumber {
+ color: white;
+}
+
+/* move the breakpoint below the other gutter elements */
+.new-breakpoint .CodeMirror-gutter-elt:nth-child(2) {
+ z-index: 0;
+}
+
+.theme-dark .editor-wrapper .CodeMirror-line .cm-comment {
+ color: var(--theme-comment);
+}
+
+.debug-expression {
+ background-color: var(--debug-expression-background);
+ border-style: solid;
+ border-color: var(--debug-expression-background);
+ border-width: 1px 0px 1px 0px;
+ position: relative;
+}
+
+.debug-expression::before {
+ content: "";
+ line-height: 1px;
+ border-top: 1px solid var(--blue-50);
+ background: transparent;
+ position: absolute;
+ top: -2px;
+ left: 0px;
+ width: 100%;
+ }
+
+.debug-expression::after {
+ content: "";
+ line-height: 1px;
+ border-bottom: 1px solid var(--blue-50);
+ position: absolute;
+ bottom: -2px;
+ left: 0px;
+ width: 100%;
+ }
+
+.to-line-end ~ .CodeMirror-widget {
+ background-color: var(--debug-expression-background);
+}
+
+.debug-expression-error {
+ background-color: var(--debug-expression-error-background);
+}
+
+.new-debug-line > .CodeMirror-line {
+ background-color: transparent !important;
+ outline: var(--debug-line-border) solid 1px;
+}
+
+/* Don't display the highlight color since the debug line
+ is already highlighted */
+.new-debug-line .CodeMirror-activeline-background {
+ display: none;
+}
+
+.new-debug-line-error > .CodeMirror-line {
+ background-color: var(--debug-expression-error-background) !important;
+ outline: var(--debug-line-error-border) solid 1px;
+}
+
+/* Don't display the highlight color since the debug line
+ is already highlighted */
+.new-debug-line-error .CodeMirror-activeline-background {
+ display: none;
+}
+.highlight-line .CodeMirror-line {
+ animation-name: fade-highlight-out;
+ animation-duration: var(--highlight-line-duration);
+ animation-timing-function: ease-out;
+ animation-fill-mode: forwards;
+}
+
+@keyframes fade-highlight-out {
+ 0%, 30% {
+ /* We want to use a color with some transparency so text selection is visible through it */
+ background-color: var(--theme-contrast-background-alpha);
+ }
+ 100% {
+ background-color: transparent;
+ }
+}
+
+.visible {
+ visibility: visible;
+}
+
+/* Code folding */
+.editor-wrapper .CodeMirror-foldgutter-open {
+ color: var(--grey-40);
+}
+
+.editor-wrapper .CodeMirror-foldgutter-open,
+.editor-wrapper .CodeMirror-foldgutter-folded {
+ fill: var(--grey-40);
+}
+
+.editor-wrapper .CodeMirror-foldgutter-open::before,
+.editor-wrapper .CodeMirror-foldgutter-open::after {
+ border-top: none;
+}
+
+.editor-wrapper .CodeMirror-foldgutter-folded::before,
+.editor-wrapper .CodeMirror-foldgutter-folded::after {
+ border-left: none;
+}
+
+.editor-wrapper .CodeMirror-foldgutter .CodeMirror-guttermarker-subtle {
+ visibility: visible;
+}
+
+.editor-wrapper .CodeMirror-foldgutter .CodeMirror-linenumber {
+ text-align: left;
+ padding: 0 0 0 2px;
+}
+
+/* Exception line */
+.line-exception {
+ background-color: var(--line-exception-background);
+}
+
+.mark-text-exception {
+ text-decoration: var(--red-50) wavy underline;
+ text-decoration-skip-ink: none;
+}
diff --git a/devtools/client/debugger/src/components/Editor/EmptyLines.js b/devtools/client/debugger/src/components/Editor/EmptyLines.js
new file mode 100644
index 0000000000..31513408a8
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/EmptyLines.js
@@ -0,0 +1,91 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { connect } from "devtools/client/shared/vendor/react-redux";
+import { Component } from "devtools/client/shared/vendor/react";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+import {
+ getSelectedSource,
+ getSelectedBreakableLines,
+} from "../../selectors/index";
+import { fromEditorLine } from "../../utils/editor/index";
+import { isWasm } from "../../utils/wasm";
+
+class EmptyLines extends Component {
+ static get propTypes() {
+ return {
+ breakableLines: PropTypes.object.isRequired,
+ editor: PropTypes.object.isRequired,
+ selectedSource: PropTypes.object.isRequired,
+ };
+ }
+
+ componentDidMount() {
+ this.disableEmptyLines();
+ }
+
+ componentDidUpdate() {
+ this.disableEmptyLines();
+ }
+
+ componentWillUnmount() {
+ const { editor } = this.props;
+
+ editor.codeMirror.operation(() => {
+ editor.codeMirror.eachLine(lineHandle => {
+ editor.codeMirror.removeLineClass(lineHandle, "wrap", "empty-line");
+ });
+ });
+ }
+
+ shouldComponentUpdate(nextProps) {
+ const { breakableLines, selectedSource } = this.props;
+ return (
+ // Breakable lines are something that evolves over time,
+ // but we either have them loaded or not. So only compare the size
+ // as sometimes we always get a blank new empty Set instance.
+ breakableLines.size != nextProps.breakableLines.size ||
+ selectedSource.id != nextProps.selectedSource.id
+ );
+ }
+
+ disableEmptyLines() {
+ const { breakableLines, selectedSource, editor } = this.props;
+
+ const { codeMirror } = editor;
+ const isSourceWasm = isWasm(selectedSource.id);
+
+ codeMirror.operation(() => {
+ const lineCount = codeMirror.lineCount();
+ for (let i = 0; i < lineCount; i++) {
+ const line = fromEditorLine(selectedSource.id, i, isSourceWasm);
+
+ if (breakableLines.has(line)) {
+ codeMirror.removeLineClass(i, "wrap", "empty-line");
+ } else {
+ codeMirror.addLineClass(i, "wrap", "empty-line");
+ }
+ }
+ });
+ }
+
+ render() {
+ return null;
+ }
+}
+
+const mapStateToProps = state => {
+ const selectedSource = getSelectedSource(state);
+ if (!selectedSource) {
+ throw new Error("no selectedSource");
+ }
+ const breakableLines = getSelectedBreakableLines(state);
+
+ return {
+ selectedSource,
+ breakableLines,
+ };
+};
+
+export default connect(mapStateToProps)(EmptyLines);
diff --git a/devtools/client/debugger/src/components/Editor/Exception.js b/devtools/client/debugger/src/components/Editor/Exception.js
new file mode 100644
index 0000000000..b76923e597
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/Exception.js
@@ -0,0 +1,102 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { PureComponent } from "devtools/client/shared/vendor/react";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+
+import {
+ toEditorPosition,
+ getTokenEnd,
+ hasDocument,
+} from "../../utils/editor/index";
+
+import { getIndentation } from "../../utils/indentation";
+import { createLocation } from "../../utils/location";
+
+export default class Exception extends PureComponent {
+ exceptionLine;
+ markText;
+
+ static get propTypes() {
+ return {
+ exception: PropTypes.object.isRequired,
+ doc: PropTypes.object.isRequired,
+ selectedSource: PropTypes.string.isRequired,
+ };
+ }
+
+ componentDidMount() {
+ this.addEditorExceptionLine();
+ }
+
+ componentDidUpdate() {
+ this.clearEditorExceptionLine();
+ this.addEditorExceptionLine();
+ }
+
+ componentWillUnmount() {
+ this.clearEditorExceptionLine();
+ }
+
+ setEditorExceptionLine(doc, line, column, lineText) {
+ doc.addLineClass(line, "wrap", "line-exception");
+
+ column = Math.max(column, getIndentation(lineText));
+ const columnEnd = doc.cm ? getTokenEnd(doc.cm, line, column) : null;
+
+ const markText = doc.markText(
+ { ch: column, line },
+ { ch: columnEnd, line },
+ { className: "mark-text-exception" }
+ );
+
+ this.exceptionLine = line;
+ this.markText = markText;
+ }
+
+ addEditorExceptionLine() {
+ const { exception, doc, selectedSource } = this.props;
+ const { columnNumber, lineNumber } = exception;
+
+ if (!hasDocument(selectedSource.id)) {
+ return;
+ }
+
+ const location = createLocation({
+ source: selectedSource,
+ line: lineNumber,
+ // Exceptions are reported with column being 1-based
+ // while the frontend uses 0-based column.
+ column: columnNumber - 1,
+ });
+
+ const { line, column } = toEditorPosition(location);
+ const lineText = doc.getLine(line);
+
+ this.setEditorExceptionLine(doc, line, column, lineText);
+ }
+
+ clearEditorExceptionLine() {
+ if (this.markText) {
+ const { selectedSource } = this.props;
+
+ this.markText.clear();
+
+ if (hasDocument(selectedSource.id)) {
+ this.props.doc.removeLineClass(
+ this.exceptionLine,
+ "wrap",
+ "line-exception"
+ );
+ }
+ this.exceptionLine = null;
+ this.markText = null;
+ }
+ }
+
+ // This component is only used as a "proxy" to manipulate the editor.
+ render() {
+ return null;
+ }
+}
diff --git a/devtools/client/debugger/src/components/Editor/Exceptions.js b/devtools/client/debugger/src/components/Editor/Exceptions.js
new file mode 100644
index 0000000000..2fb183f135
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/Exceptions.js
@@ -0,0 +1,66 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React, { Component } from "devtools/client/shared/vendor/react";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+import { connect } from "devtools/client/shared/vendor/react-redux";
+
+import Exception from "./Exception";
+
+import {
+ getSelectedSource,
+ getSelectedSourceExceptions,
+} from "../../selectors/index";
+import { getDocument } from "../../utils/editor/index";
+
+class Exceptions extends Component {
+ static get propTypes() {
+ return {
+ exceptions: PropTypes.array,
+ selectedSource: PropTypes.object,
+ };
+ }
+
+ render() {
+ const { exceptions, selectedSource } = this.props;
+
+ if (!selectedSource || !exceptions.length) {
+ return null;
+ }
+
+ const doc = getDocument(selectedSource.id);
+ return React.createElement(
+ React.Fragment,
+ null,
+ exceptions.map(exception =>
+ React.createElement(Exception, {
+ exception,
+ doc,
+ key: `${exception.sourceActorId}:${exception.lineNumber}`,
+ selectedSource,
+ })
+ )
+ );
+ }
+}
+
+export default connect(state => {
+ const selectedSource = getSelectedSource(state);
+
+ // Avoid calling getSelectedSourceExceptions when there is no source selected.
+ if (!selectedSource) {
+ return {};
+ }
+
+ // Avoid causing any update until we start having exceptions
+ const exceptions = getSelectedSourceExceptions(state);
+ if (!exceptions.length) {
+ return {};
+ }
+
+ return {
+ exceptions: getSelectedSourceExceptions(state),
+ selectedSource,
+ };
+})(Exceptions);
diff --git a/devtools/client/debugger/src/components/Editor/Footer.css b/devtools/client/debugger/src/components/Editor/Footer.css
new file mode 100644
index 0000000000..4a3272879b
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/Footer.css
@@ -0,0 +1,85 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+.source-footer {
+ background: var(--theme-body-background);
+ border-top: 1px solid var(--theme-splitter-color);
+ grid-area: editor-footer;
+ display: flex;
+ opacity: 1;
+ width: calc(100% - 1px);
+ user-select: none;
+ height: var(--editor-footer-height);
+ box-sizing: border-box;
+}
+
+.source-footer button {
+ outline-offset: -2px;
+}
+
+.source-footer-start {
+ display: flex;
+ align-items: center;
+ justify-self: start;
+}
+
+.source-footer-end {
+ display: flex;
+ margin-left: auto;
+}
+
+.source-footer .commands * {
+ user-select: none;
+}
+
+.source-footer .commands {
+ display: flex;
+}
+
+.source-footer .commands .action {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ transition: opacity 200ms;
+ border: none;
+ background: transparent;
+ padding: 4px 6px;
+}
+
+.source-footer .commands button.action:hover {
+ background: var(--theme-toolbar-background-hover);
+}
+
+:root.theme-dark .source-footer .commands .action {
+ fill: var(--theme-body-color);
+}
+
+:root.theme-dark .source-footer .commands .action:hover {
+ fill: var(--theme-selection-color);
+}
+
+.source-footer .blackboxed .img.blackBox {
+ background-color: #806414;
+}
+
+.source-footer .commands button.prettyPrint:disabled {
+ opacity: 0.6;
+}
+
+.source-footer .mapped-source,
+.source-footer .cursor-position {
+ color: var(--theme-body-color);
+ padding-right: 2.5px;
+}
+
+.source-footer .mapped-source {
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.source-footer .cursor-position {
+ padding: 5px;
+ white-space: nowrap;
+}
diff --git a/devtools/client/debugger/src/components/Editor/Footer.js b/devtools/client/debugger/src/components/Editor/Footer.js
new file mode 100644
index 0000000000..c4ff02caf4
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/Footer.js
@@ -0,0 +1,288 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React, { PureComponent } from "devtools/client/shared/vendor/react";
+import {
+ div,
+ button,
+ span,
+} from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+import { connect } from "devtools/client/shared/vendor/react-redux";
+import actions from "../../actions/index";
+import {
+ getSelectedSource,
+ getSelectedLocation,
+ getSelectedSourceTextContent,
+ getPrettySource,
+ getPaneCollapse,
+ isSourceBlackBoxed,
+ canPrettyPrintSource,
+ getPrettyPrintMessage,
+ isSourceOnSourceMapIgnoreList,
+ isSourceMapIgnoreListEnabled,
+ getSelectedMappedSource,
+} from "../../selectors/index";
+
+import { isPretty, getFilename, shouldBlackbox } from "../../utils/source";
+
+import { PaneToggleButton } from "../shared/Button/index";
+import AccessibleImage from "../shared/AccessibleImage";
+
+const classnames = require("resource://devtools/client/shared/classnames.js");
+
+class SourceFooter extends PureComponent {
+ static get propTypes() {
+ return {
+ canPrettyPrint: PropTypes.bool.isRequired,
+ prettyPrintMessage: PropTypes.string.isRequired,
+ endPanelCollapsed: PropTypes.bool.isRequired,
+ horizontal: PropTypes.bool.isRequired,
+ jumpToMappedLocation: PropTypes.func.isRequired,
+ mappedSource: PropTypes.object,
+ selectedSource: PropTypes.object,
+ selectedLocation: PropTypes.object,
+ isSelectedSourceBlackBoxed: PropTypes.bool.isRequired,
+ sourceLoaded: PropTypes.bool.isRequired,
+ toggleBlackBox: PropTypes.func.isRequired,
+ togglePaneCollapse: PropTypes.func.isRequired,
+ prettyPrintAndSelectSource: PropTypes.func.isRequired,
+ isSourceOnIgnoreList: PropTypes.bool.isRequired,
+ };
+ }
+
+ prettyPrintButton() {
+ const {
+ selectedSource,
+ canPrettyPrint,
+ prettyPrintMessage,
+ prettyPrintAndSelectSource,
+ sourceLoaded,
+ } = this.props;
+
+ if (!selectedSource) {
+ return null;
+ }
+
+ if (!sourceLoaded && selectedSource.isPrettyPrinted) {
+ return div(
+ {
+ className: "action",
+ key: "pretty-loader",
+ },
+ React.createElement(AccessibleImage, {
+ className: "loader spin",
+ })
+ );
+ }
+
+ const type = "prettyPrint";
+ return button(
+ {
+ onClick: () => {
+ if (!canPrettyPrint) {
+ return;
+ }
+ prettyPrintAndSelectSource(selectedSource);
+ },
+ className: classnames("action", type, {
+ active: sourceLoaded && canPrettyPrint,
+ pretty: isPretty(selectedSource),
+ }),
+ key: type,
+ title: prettyPrintMessage,
+ "aria-label": prettyPrintMessage,
+ disabled: !canPrettyPrint,
+ },
+ React.createElement(AccessibleImage, {
+ className: type,
+ })
+ );
+ }
+
+ blackBoxButton() {
+ const {
+ selectedSource,
+ isSelectedSourceBlackBoxed,
+ toggleBlackBox,
+ sourceLoaded,
+ isSourceOnIgnoreList,
+ } = this.props;
+
+ if (!selectedSource || !shouldBlackbox(selectedSource)) {
+ return null;
+ }
+
+ let tooltip = isSelectedSourceBlackBoxed
+ ? L10N.getStr("sourceFooter.unignore")
+ : L10N.getStr("sourceFooter.ignore");
+
+ if (isSourceOnIgnoreList) {
+ tooltip = L10N.getStr("sourceFooter.ignoreList");
+ }
+
+ const type = "black-box";
+ return button(
+ {
+ onClick: () => toggleBlackBox(selectedSource),
+ className: classnames("action", type, {
+ active: sourceLoaded,
+ blackboxed: isSelectedSourceBlackBoxed || isSourceOnIgnoreList,
+ }),
+ key: type,
+ title: tooltip,
+ "aria-label": tooltip,
+ disabled: isSourceOnIgnoreList,
+ },
+ React.createElement(AccessibleImage, {
+ className: "blackBox",
+ })
+ );
+ }
+
+ renderToggleButton() {
+ if (this.props.horizontal) {
+ return null;
+ }
+ return React.createElement(PaneToggleButton, {
+ key: "toggle",
+ collapsed: this.props.endPanelCollapsed,
+ horizontal: this.props.horizontal,
+ handleClick: this.props.togglePaneCollapse,
+ position: "end",
+ });
+ }
+
+ renderCommands() {
+ const commands = [this.blackBoxButton(), this.prettyPrintButton()].filter(
+ Boolean
+ );
+
+ return commands.length
+ ? div(
+ {
+ className: "commands",
+ },
+ commands
+ )
+ : null;
+ }
+
+ renderSourceSummary() {
+ const { mappedSource, jumpToMappedLocation, selectedLocation } = this.props;
+
+ if (!mappedSource) {
+ return null;
+ }
+
+ const tooltip = L10N.getFormatStr(
+ mappedSource.isOriginal
+ ? "sourceFooter.mappedOriginalSource.tooltip"
+ : "sourceFooter.mappedGeneratedSource.tooltip",
+ mappedSource.url
+ );
+ const filename = getFilename(mappedSource);
+ const label = L10N.getFormatStr(
+ mappedSource.isOriginal
+ ? "sourceFooter.mappedOriginalSource.title"
+ : "sourceFooter.mappedGeneratedSource.title",
+ filename
+ );
+ return button(
+ {
+ className: "mapped-source",
+ onClick: () => jumpToMappedLocation(selectedLocation),
+ title: tooltip,
+ },
+ span(null, label)
+ );
+ }
+
+ renderCursorPosition() {
+ // When we open a new source, there is no particular location selected and the line will be set to zero or falsy
+ if (!this.props.selectedLocation || !this.props.selectedLocation.line) {
+ return null;
+ }
+
+ // Note that line is 1-based while column is 0-based.
+ const { line, column } = this.props.selectedLocation;
+
+ const text = L10N.getFormatStr(
+ "sourceFooter.currentCursorPosition",
+ line,
+ column + 1
+ );
+ const title = L10N.getFormatStr(
+ "sourceFooter.currentCursorPosition.tooltip",
+ line,
+ column + 1
+ );
+ return div(
+ {
+ className: "cursor-position",
+ title,
+ },
+ text
+ );
+ }
+
+ render() {
+ return div(
+ {
+ className: "source-footer",
+ },
+ div(
+ {
+ className: "source-footer-start",
+ },
+ this.renderCommands()
+ ),
+ div(
+ {
+ className: "source-footer-end",
+ },
+ this.renderSourceSummary(),
+ this.renderCursorPosition(),
+ this.renderToggleButton()
+ )
+ );
+ }
+}
+
+const mapStateToProps = state => {
+ const selectedSource = getSelectedSource(state);
+ const selectedLocation = getSelectedLocation(state);
+ const sourceTextContent = getSelectedSourceTextContent(state);
+
+ return {
+ selectedSource,
+ selectedLocation,
+ isSelectedSourceBlackBoxed: selectedSource
+ ? isSourceBlackBoxed(state, selectedSource)
+ : null,
+ isSourceOnIgnoreList:
+ isSourceMapIgnoreListEnabled(state) &&
+ isSourceOnSourceMapIgnoreList(state, selectedSource),
+ sourceLoaded: !!sourceTextContent,
+ mappedSource: getSelectedMappedSource(state),
+ prettySource: getPrettySource(
+ state,
+ selectedSource ? selectedSource.id : null
+ ),
+ endPanelCollapsed: getPaneCollapse(state, "end"),
+ canPrettyPrint: selectedLocation
+ ? canPrettyPrintSource(state, selectedLocation)
+ : false,
+ prettyPrintMessage: selectedLocation
+ ? getPrettyPrintMessage(state, selectedLocation)
+ : null,
+ };
+};
+
+export default connect(mapStateToProps, {
+ prettyPrintAndSelectSource: actions.prettyPrintAndSelectSource,
+ toggleBlackBox: actions.toggleBlackBox,
+ jumpToMappedLocation: actions.jumpToMappedLocation,
+ togglePaneCollapse: actions.togglePaneCollapse,
+})(SourceFooter);
diff --git a/devtools/client/debugger/src/components/Editor/HighlightLine.js b/devtools/client/debugger/src/components/Editor/HighlightLine.js
new file mode 100644
index 0000000000..8639128905
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/HighlightLine.js
@@ -0,0 +1,194 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { Component } from "devtools/client/shared/vendor/react";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+import {
+ toEditorLine,
+ endOperation,
+ startOperation,
+} from "../../utils/editor/index";
+import { getDocument, hasDocument } from "../../utils/editor/source-documents";
+
+import { connect } from "devtools/client/shared/vendor/react-redux";
+import {
+ getVisibleSelectedFrame,
+ getSelectedLocation,
+ getSelectedSourceTextContent,
+ getPauseCommand,
+ getCurrentThread,
+ getShouldHighlightSelectedLocation,
+} from "../../selectors/index";
+
+function isDebugLine(selectedFrame, selectedLocation) {
+ if (!selectedFrame) {
+ return false;
+ }
+
+ return (
+ selectedFrame.location.source.id == selectedLocation.source.id &&
+ selectedFrame.location.line == selectedLocation.line
+ );
+}
+
+function isDocumentReady(selectedLocation, selectedSourceTextContent) {
+ return (
+ selectedLocation &&
+ selectedSourceTextContent &&
+ hasDocument(selectedLocation.source.id)
+ );
+}
+
+export class HighlightLine extends Component {
+ isStepping = false;
+ previousEditorLine = null;
+
+ static get propTypes() {
+ return {
+ pauseCommand: PropTypes.oneOf([
+ "expression",
+ "resume",
+ "stepOver",
+ "stepIn",
+ "stepOut",
+ ]),
+ selectedFrame: PropTypes.object,
+ selectedLocation: PropTypes.object.isRequired,
+ selectedSourceTextContent: PropTypes.object.isRequired,
+ };
+ }
+
+ shouldComponentUpdate(nextProps) {
+ const { selectedLocation, selectedSourceTextContent } = nextProps;
+ return this.shouldSetHighlightLine(
+ selectedLocation,
+ selectedSourceTextContent
+ );
+ }
+
+ componentDidUpdate(prevProps) {
+ this.completeHighlightLine(prevProps);
+ }
+
+ componentDidMount() {
+ this.completeHighlightLine(null);
+ }
+
+ shouldSetHighlightLine(selectedLocation, selectedSourceTextContent) {
+ const { line } = selectedLocation;
+ const editorLine = toEditorLine(selectedLocation.source.id, line);
+
+ if (!isDocumentReady(selectedLocation, selectedSourceTextContent)) {
+ return false;
+ }
+
+ if (this.isStepping && editorLine === this.previousEditorLine) {
+ return false;
+ }
+
+ return true;
+ }
+
+ completeHighlightLine(prevProps) {
+ const {
+ pauseCommand,
+ selectedLocation,
+ selectedFrame,
+ selectedSourceTextContent,
+ shouldHighlightSelectedLocation,
+ } = this.props;
+ if (pauseCommand) {
+ this.isStepping = true;
+ }
+
+ startOperation();
+ if (prevProps) {
+ this.clearHighlightLine(
+ prevProps.selectedLocation,
+ prevProps.selectedSourceTextContent
+ );
+ }
+ if (shouldHighlightSelectedLocation) {
+ this.setHighlightLine(
+ selectedLocation,
+ selectedFrame,
+ selectedSourceTextContent
+ );
+ }
+ endOperation();
+ }
+
+ setHighlightLine(selectedLocation, selectedFrame, selectedSourceTextContent) {
+ const { line } = selectedLocation;
+ if (
+ !this.shouldSetHighlightLine(selectedLocation, selectedSourceTextContent)
+ ) {
+ return;
+ }
+
+ this.isStepping = false;
+ const sourceId = selectedLocation.source.id;
+ const editorLine = toEditorLine(sourceId, line);
+ this.previousEditorLine = editorLine;
+
+ if (!line || isDebugLine(selectedFrame, selectedLocation)) {
+ return;
+ }
+
+ const doc = getDocument(sourceId);
+ doc.addLineClass(editorLine, "wrap", "highlight-line");
+ this.resetHighlightLine(doc, editorLine);
+ }
+
+ resetHighlightLine(doc, editorLine) {
+ const editorWrapper = document.querySelector(".editor-wrapper");
+
+ if (editorWrapper === null) {
+ return;
+ }
+
+ const duration = parseInt(
+ getComputedStyle(editorWrapper).getPropertyValue(
+ "--highlight-line-duration"
+ ),
+ 10
+ );
+
+ setTimeout(
+ () => doc && doc.removeLineClass(editorLine, "wrap", "highlight-line"),
+ duration
+ );
+ }
+
+ clearHighlightLine(selectedLocation, selectedSourceTextContent) {
+ if (!isDocumentReady(selectedLocation, selectedSourceTextContent)) {
+ return;
+ }
+
+ const { line } = selectedLocation;
+ const sourceId = selectedLocation.source.id;
+ const editorLine = toEditorLine(sourceId, line);
+ const doc = getDocument(sourceId);
+ doc.removeLineClass(editorLine, "wrap", "highlight-line");
+ }
+
+ render() {
+ return null;
+ }
+}
+
+export default connect(state => {
+ const selectedLocation = getSelectedLocation(state);
+
+ if (!selectedLocation) {
+ throw new Error("must have selected location");
+ }
+ return {
+ pauseCommand: getPauseCommand(state, getCurrentThread(state)),
+ shouldHighlightSelectedLocation: getShouldHighlightSelectedLocation(state),
+ selectedFrame: getVisibleSelectedFrame(state),
+ selectedLocation,
+ selectedSourceTextContent: getSelectedSourceTextContent(state),
+ };
+})(HighlightLine);
diff --git a/devtools/client/debugger/src/components/Editor/HighlightLines.js b/devtools/client/debugger/src/components/Editor/HighlightLines.js
new file mode 100644
index 0000000000..e34a86aba9
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/HighlightLines.js
@@ -0,0 +1,74 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { Component } from "devtools/client/shared/vendor/react";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+
+class HighlightLines extends Component {
+ static get propTypes() {
+ return {
+ editor: PropTypes.object.isRequired,
+ range: PropTypes.object.isRequired,
+ };
+ }
+
+ componentDidMount() {
+ this.highlightLineRange();
+ }
+
+ // FIXME: https://bugzilla.mozilla.org/show_bug.cgi?id=1774507
+ UNSAFE_componentWillUpdate() {
+ this.clearHighlightRange();
+ }
+
+ componentDidUpdate() {
+ this.highlightLineRange();
+ }
+
+ componentWillUnmount() {
+ this.clearHighlightRange();
+ }
+
+ clearHighlightRange() {
+ const { range, editor } = this.props;
+
+ const { codeMirror } = editor;
+
+ if (!range || !codeMirror) {
+ return;
+ }
+
+ const { start, end } = range;
+ codeMirror.operation(() => {
+ for (let line = start - 1; line < end; line++) {
+ codeMirror.removeLineClass(line, "wrap", "highlight-lines");
+ }
+ });
+ }
+
+ highlightLineRange = () => {
+ const { range, editor } = this.props;
+
+ const { codeMirror } = editor;
+
+ if (!range || !codeMirror) {
+ return;
+ }
+
+ const { start, end } = range;
+
+ codeMirror.operation(() => {
+ editor.alignLine(start);
+ for (let line = start - 1; line < end; line++) {
+ codeMirror.addLineClass(line, "wrap", "highlight-lines");
+ }
+ });
+ };
+
+ render() {
+ return null;
+ }
+}
+
+export default HighlightLines;
diff --git a/devtools/client/debugger/src/components/Editor/InlinePreview.css b/devtools/client/debugger/src/components/Editor/InlinePreview.css
new file mode 100644
index 0000000000..13f1b5e23c
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/InlinePreview.css
@@ -0,0 +1,29 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+.inline-preview {
+ display: inline-block;
+ margin-inline-start: 8px;
+ user-select: none;
+}
+
+.inline-preview-outer {
+ background-color: var(--theme-inline-preview-background);
+ border: 1px solid var(--theme-inline-preview-border-color);
+ border-radius: 3px;
+ font-size: 10px;
+ margin-right: 5px;
+ white-space: nowrap;
+}
+
+.inline-preview-label {
+ padding: 0px 2px 0px 4px;
+ border-radius: 2px 0 0 2px;
+ color: var(--theme-inline-preview-label-color);
+ background-color: var(--theme-inline-preview-label-background);
+}
+
+.inline-preview-value {
+ padding: 2px 6px;
+}
diff --git a/devtools/client/debugger/src/components/Editor/InlinePreview.js b/devtools/client/debugger/src/components/Editor/InlinePreview.js
new file mode 100644
index 0000000000..552143dcf2
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/InlinePreview.js
@@ -0,0 +1,74 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React, { PureComponent } from "devtools/client/shared/vendor/react";
+import { span } from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+import Reps from "devtools/client/shared/components/reps/index";
+
+const {
+ REPS: {
+ Rep,
+ ElementNode: { supportsObject: isElement },
+ },
+ MODE,
+} = Reps;
+
+// Renders single variable preview inside a codemirror line widget
+class InlinePreview extends PureComponent {
+ static get propTypes() {
+ return {
+ highlightDomElement: PropTypes.func.isRequired,
+ openElementInInspector: PropTypes.func.isRequired,
+ unHighlightDomElement: PropTypes.func.isRequired,
+ value: PropTypes.any,
+ variable: PropTypes.string.isRequired,
+ };
+ }
+
+ showInScopes(variable) {
+ // TODO: focus on variable value in the scopes sidepanel
+ // we will need more info from parent comp
+ }
+
+ render() {
+ const {
+ value,
+ variable,
+ openElementInInspector,
+ highlightDomElement,
+ unHighlightDomElement,
+ } = this.props;
+
+ const mode = isElement(value) ? MODE.TINY : MODE.SHORT;
+ return span(
+ {
+ className: "inline-preview-outer",
+ onClick: () => this.showInScopes(variable),
+ },
+ span(
+ {
+ className: "inline-preview-label",
+ },
+ variable,
+ ":"
+ ),
+ span(
+ {
+ className: "inline-preview-value",
+ },
+ React.createElement(Rep, {
+ object: value,
+ mode,
+ onDOMNodeClick: grip => openElementInInspector(grip),
+ onInspectIconClick: grip => openElementInInspector(grip),
+ onDOMNodeMouseOver: grip => highlightDomElement(grip),
+ onDOMNodeMouseOut: grip => unHighlightDomElement(grip),
+ })
+ )
+ );
+ }
+}
+
+export default InlinePreview;
diff --git a/devtools/client/debugger/src/components/Editor/InlinePreviewRow.js b/devtools/client/debugger/src/components/Editor/InlinePreviewRow.js
new file mode 100644
index 0000000000..bc54fc5b4d
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/InlinePreviewRow.js
@@ -0,0 +1,103 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React, { PureComponent } from "devtools/client/shared/vendor/react";
+import ReactDOM from "devtools/client/shared/vendor/react-dom";
+
+import actions from "../../actions/index";
+import assert from "../../utils/assert";
+import { connect } from "devtools/client/shared/vendor/react-redux";
+import InlinePreview from "./InlinePreview";
+
+// Handles rendering for each line ( row )
+// * Renders single widget for each line in codemirror
+// * Renders InlinePreview for each preview inside the widget
+class InlinePreviewRow extends PureComponent {
+ bookmark;
+ widgetNode;
+
+ componentDidMount() {
+ this.updatePreviewWidget(this.props, null);
+ }
+
+ componentDidUpdate(prevProps) {
+ this.updatePreviewWidget(this.props, prevProps);
+ }
+
+ componentWillUnmount() {
+ this.updatePreviewWidget(null, this.props);
+ }
+
+ updatePreviewWidget(props, prevProps) {
+ if (
+ this.bookmark &&
+ prevProps &&
+ (!props ||
+ prevProps.editor !== props.editor ||
+ prevProps.line !== props.line)
+ ) {
+ this.bookmark.clear();
+ this.bookmark = null;
+ this.widgetNode = null;
+ }
+
+ if (!props) {
+ assert(!this.bookmark, "Inline Preview widget shouldn't be present.");
+ return;
+ }
+
+ const {
+ editor,
+ line,
+ previews,
+ openElementInInspector,
+ highlightDomElement,
+ unHighlightDomElement,
+ } = props;
+
+ if (!this.bookmark) {
+ this.widgetNode = document.createElement("div");
+ this.widgetNode.classList.add("inline-preview");
+ }
+
+ ReactDOM.render(
+ React.createElement(
+ React.Fragment,
+ null,
+ previews.map(preview =>
+ React.createElement(InlinePreview, {
+ line: line,
+ key: `${line}-${preview.name}`,
+ variable: preview.name,
+ value: preview.value,
+ openElementInInspector: openElementInInspector,
+ highlightDomElement: highlightDomElement,
+ unHighlightDomElement: unHighlightDomElement,
+ })
+ )
+ ),
+ this.widgetNode,
+ () => {
+ // Only set the codeMirror bookmark once React rendered the element into this.widgetNode
+ this.bookmark = editor.codeMirror.setBookmark(
+ {
+ line,
+ ch: Infinity,
+ },
+ this.widgetNode
+ );
+ }
+ );
+ }
+
+ render() {
+ return null;
+ }
+}
+
+export default connect(() => ({}), {
+ openElementInInspector: actions.openElementInInspectorCommand,
+ highlightDomElement: actions.highlightDomElement,
+ unHighlightDomElement: actions.unHighlightDomElement,
+})(InlinePreviewRow);
diff --git a/devtools/client/debugger/src/components/Editor/InlinePreviews.js b/devtools/client/debugger/src/components/Editor/InlinePreviews.js
new file mode 100644
index 0000000000..18616ae3ed
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/InlinePreviews.js
@@ -0,0 +1,80 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React, { Component } from "devtools/client/shared/vendor/react";
+import { div } from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+import InlinePreviewRow from "./InlinePreviewRow";
+import { connect } from "devtools/client/shared/vendor/react-redux";
+import {
+ getSelectedFrame,
+ getCurrentThread,
+ getInlinePreviews,
+} from "../../selectors/index";
+
+function hasPreviews(previews) {
+ return !!previews && !!Object.keys(previews).length;
+}
+
+class InlinePreviews extends Component {
+ static get propTypes() {
+ return {
+ editor: PropTypes.object.isRequired,
+ previews: PropTypes.object,
+ selectedFrame: PropTypes.object.isRequired,
+ selectedSource: PropTypes.object.isRequired,
+ };
+ }
+
+ shouldComponentUpdate({ previews }) {
+ return hasPreviews(previews);
+ }
+
+ render() {
+ const { editor, selectedFrame, selectedSource, previews } = this.props;
+
+ // Render only if currently open file is the one where debugger is paused
+ if (
+ !selectedFrame ||
+ selectedFrame.location.source.id !== selectedSource.id ||
+ !hasPreviews(previews)
+ ) {
+ return null;
+ }
+ const previewsObj = previews;
+
+ let inlinePreviewRows;
+ editor.codeMirror.operation(() => {
+ inlinePreviewRows = Object.keys(previewsObj).map(line => {
+ const lineNum = parseInt(line, 10);
+ return React.createElement(InlinePreviewRow, {
+ editor: editor,
+ key: line,
+ line: lineNum,
+ previews: previewsObj[line],
+ });
+ });
+ });
+ return div(null, inlinePreviewRows);
+ }
+}
+
+const mapStateToProps = state => {
+ const thread = getCurrentThread(state);
+ const selectedFrame = getSelectedFrame(state, thread);
+
+ if (!selectedFrame) {
+ return {
+ selectedFrame: null,
+ previews: null,
+ };
+ }
+
+ return {
+ selectedFrame,
+ previews: getInlinePreviews(state, thread, selectedFrame.id),
+ };
+};
+
+export default connect(mapStateToProps)(InlinePreviews);
diff --git a/devtools/client/debugger/src/components/Editor/Preview.css b/devtools/client/debugger/src/components/Editor/Preview.css
new file mode 100644
index 0000000000..7e3d788c68
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/Preview.css
@@ -0,0 +1,111 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+.popover .preview {
+ background: var(--theme-body-background);
+ width: 350px;
+ border: 1px solid var(--theme-splitter-color);
+ padding: 10px;
+ height: auto;
+ min-height: inherit;
+ max-height: 200px;
+ overflow: auto;
+ box-shadow: 1px 2px 3px var(--popup-shadow-color);
+}
+
+.theme-dark .popover .preview {
+ box-shadow: 1px 2px 3px var(--popup-shadow-color);
+}
+
+.popover .preview .header {
+ width: 100%;
+ line-height: 20px;
+ border-bottom: 1px solid #cccccc;
+ display: flex;
+ flex-direction: column;
+}
+
+.popover .preview .header .link {
+ align-self: flex-end;
+ color: var(--theme-link-color);
+ text-decoration: underline;
+}
+
+.selection,
+.debug-expression.selection {
+ background-color: var(--theme-highlight-yellow);
+}
+
+.theme-dark .selection,
+.theme-dark .debug-expression.selection {
+ background-color: #743884;
+}
+
+.theme-dark .cm-s-mozilla .selection,
+.theme-dark .cm-s-mozilla .debug-expression.selection {
+ color: #e7ebee;
+}
+
+.popover .preview .function-signature {
+ padding-top: 10px;
+}
+
+.theme-dark .popover .preview {
+ border-color: var(--theme-body-color);
+}
+
+.tooltip {
+ position: fixed;
+ z-index: 100;
+}
+
+.tooltip .preview {
+ background: var(--theme-toolbar-background);
+ max-width: inherit;
+ border: 1px solid var(--theme-splitter-color);
+ box-shadow: 1px 2px 4px 1px var(--theme-toolbar-background-alt);
+ padding: 5px;
+ height: auto;
+ min-height: inherit;
+ max-height: 200px;
+ overflow: auto;
+}
+
+.theme-dark .tooltip .preview {
+ border-color: var(--theme-body-color);
+}
+
+.tooltip .gap {
+ height: 4px;
+ padding-top: 4px;
+}
+
+.add-to-expression-bar {
+ border: 1px solid var(--theme-splitter-color);
+ border-top: none;
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+ font-size: 14px;
+ line-height: 30px;
+ background: var(--theme-toolbar-background);
+ color: var(--theme-text-color-inactive);
+ padding: 0 4px;
+}
+
+.add-to-expression-bar .prompt {
+ width: 1em;
+}
+
+.add-to-expression-bar .expression-to-save-label {
+ width: calc(100% - 4em);
+}
+
+.add-to-expression-bar .expression-to-save-button {
+ font-size: 14px;
+ color: var(--theme-comment);
+}
diff --git a/devtools/client/debugger/src/components/Editor/Preview/ExceptionPopup.js b/devtools/client/debugger/src/components/Editor/Preview/ExceptionPopup.js
new file mode 100644
index 0000000000..0789b82694
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/Preview/ExceptionPopup.js
@@ -0,0 +1,142 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React, { Component } from "devtools/client/shared/vendor/react";
+import { div, span } from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+import { connect } from "devtools/client/shared/vendor/react-redux";
+
+import Reps from "devtools/client/shared/components/reps/index";
+const {
+ REPS: { StringRep },
+} = Reps;
+
+import actions from "../../../actions/index";
+
+import AccessibleImage from "../../shared/AccessibleImage";
+const classnames = require("resource://devtools/client/shared/classnames.js");
+const ANONYMOUS_FN_NAME = "<anonymous>";
+
+// The exception popup works in two modes:
+// a. when the stacktrace is closed the exception popup
+// gets closed when the mouse leaves the popup.
+// b. when the stacktrace is opened the exception popup
+// gets closed only by clicking outside the popup.
+class ExceptionPopup extends Component {
+ constructor(props) {
+ super(props);
+ this.state = {
+ isStacktraceExpanded: true,
+ };
+ }
+
+ static get propTypes() {
+ return {
+ mouseout: PropTypes.func.isRequired,
+ selectSourceURL: PropTypes.func.isRequired,
+ exception: PropTypes.object.isRequired,
+ };
+ }
+
+ onExceptionMessageClick() {
+ const isStacktraceExpanded = this.state.isStacktraceExpanded;
+ this.setState({ isStacktraceExpanded: !isStacktraceExpanded });
+ }
+
+ buildStackFrame(frame) {
+ const { filename, lineNumber } = frame;
+ const functionName = frame.functionName || ANONYMOUS_FN_NAME;
+ return div(
+ {
+ className: "frame",
+ onClick: () =>
+ this.props.selectSourceURL(filename, {
+ line: lineNumber,
+ }),
+ },
+ span(
+ {
+ className: "title",
+ },
+ functionName
+ ),
+ span(
+ {
+ className: "location",
+ },
+ span(
+ {
+ className: "filename",
+ },
+ filename
+ ),
+ ":",
+ span(
+ {
+ className: "line",
+ },
+ lineNumber
+ )
+ )
+ );
+ }
+
+ renderStacktrace(stacktrace) {
+ const isStacktraceExpanded = this.state.isStacktraceExpanded;
+
+ if (stacktrace.length && isStacktraceExpanded) {
+ return div(
+ {
+ className: "exception-stacktrace",
+ },
+ stacktrace.map(frame => this.buildStackFrame(frame))
+ );
+ }
+ return null;
+ }
+
+ renderArrowIcon(stacktrace) {
+ if (stacktrace.length) {
+ return React.createElement(AccessibleImage, {
+ className: classnames("arrow", {
+ expanded: this.state.isStacktraceExpanded,
+ }),
+ });
+ }
+ return null;
+ }
+
+ render() {
+ const {
+ exception: { stacktrace, errorMessage },
+ mouseout,
+ } = this.props;
+ return div(
+ {
+ className: "preview-popup exception-popup",
+ dir: "ltr",
+ onMouseLeave: () => mouseout(true, this.state.isStacktraceExpanded),
+ },
+ div(
+ {
+ className: "exception-message",
+ onClick: () => this.onExceptionMessageClick(),
+ },
+ this.renderArrowIcon(stacktrace),
+ StringRep.rep({
+ object: errorMessage,
+ useQuotes: false,
+ className: "exception-text",
+ })
+ ),
+ this.renderStacktrace(stacktrace)
+ );
+ }
+}
+
+const mapDispatchToProps = {
+ selectSourceURL: actions.selectSourceURL,
+};
+
+export default connect(null, mapDispatchToProps)(ExceptionPopup);
diff --git a/devtools/client/debugger/src/components/Editor/Preview/Popup.css b/devtools/client/debugger/src/components/Editor/Preview/Popup.css
new file mode 100644
index 0000000000..745d272fbb
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/Preview/Popup.css
@@ -0,0 +1,174 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+.preview-popup {
+ border: 1px solid var(--theme-splitter-color);
+ height: auto;
+ overflow: auto;
+ background: var(--theme-body-background);
+ box-shadow: 1px 1px 3px var(--popup-shadow-color);
+}
+
+.popover .preview-popup {
+ padding: 5px 10px;
+ max-width: 450px;
+ min-width: 200px;
+}
+
+.tooltip .preview-popup {
+ max-width: inherit;
+ padding: 5px;
+ min-height: inherit;
+ max-height: 200px;
+}
+
+.preview-popup .tree {
+ /* Setting a fixed line height to avoid issues in custom formatters changing
+ * the line height like the CLJS DevTools */
+ line-height: 15px;
+}
+
+.gap svg {
+ pointer-events: none;
+}
+
+.gap polygon {
+ pointer-events: auto;
+}
+
+.popover .preview-popup .object-node {
+ padding-inline-start: 0px;
+}
+
+.preview-token:hover {
+ cursor: default;
+}
+
+.preview-token,
+.debug-expression.preview-token {
+ background-color: var(--theme-highlight-yellow);
+}
+
+.theme-dark .preview-token,
+.theme-dark .debug-expression.preview-token {
+ background-color: #743884;
+}
+
+.theme-dark .cm-s-mozilla .preview-token,
+.theme-dark .cm-s-mozilla .debug-expression.preview-token {
+ color: #e7ebee;
+}
+
+.theme-dark .popover .preview-popup {
+ border-color: var(--theme-body-color);
+}
+
+.tooltip {
+ position: fixed;
+ z-index: 100;
+}
+
+
+
+.theme-dark .tooltip .preview-popup {
+ border-color: var(--theme-body-color);
+}
+
+.tooltip .gap {
+ height: 4px;
+ padding-top: 0px;
+}
+
+.add-to-expression-bar {
+ border: 1px solid var(--theme-splitter-color);
+ border-top: none;
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+ font-size: 14px;
+ line-height: 30px;
+ background: var(--theme-toolbar-background);
+ color: var(--theme-text-color-inactive);
+ padding: 0 4px;
+}
+
+.add-to-expression-bar .prompt {
+ width: 1em;
+}
+
+.add-to-expression-bar .expression-to-save-label {
+ width: calc(100% - 4em);
+}
+
+.add-to-expression-bar .expression-to-save-button {
+ font-size: 14px;
+ color: var(--theme-comment);
+}
+
+/* Exception popup */
+.exception-popup .exception-text {
+ color: var(--red-70);
+}
+
+.theme-dark .exception-popup .exception-text {
+ color: var(--red-20);
+}
+
+.exception-popup .exception-message {
+ display: flex;
+ align-items: center;
+}
+
+.exception-message .arrow {
+ margin-inline-end: 4px;
+}
+
+.exception-popup .exception-stacktrace {
+ display: grid;
+ grid-template-columns: auto 1fr;
+ grid-column-gap: 8px;
+ padding-inline: 20px 3px;
+ line-height: var(--theme-code-line-height);
+}
+
+.exception-stacktrace .frame {
+ display: contents;
+ cursor: pointer;
+}
+
+.exception-stacktrace .title {
+ grid-column: 1/2;
+ color: var(--grey-90);
+}
+
+.theme-dark .exception-stacktrace .title {
+ color: white;
+}
+
+.exception-stacktrace .location {
+ grid-column: -1/-2;
+ color: var(--theme-highlight-purple);
+ direction: rtl;
+ text-align: end;
+ white-space: nowrap;
+ /* Force the location to be on one line and crop at start if wider then max-width */
+ overflow: hidden;
+ text-overflow: ellipsis;
+ max-width: 350px;
+}
+
+.theme-dark .exception-stacktrace .location {
+ color: var(--blue-40);
+}
+
+.exception-stacktrace .line {
+ color: var(--theme-highlight-blue);
+}
+
+.theme-dark .exception-stacktrace .line {
+ color: hsl(210, 40%, 60%);
+}
diff --git a/devtools/client/debugger/src/components/Editor/Preview/Popup.js b/devtools/client/debugger/src/components/Editor/Preview/Popup.js
new file mode 100644
index 0000000000..a010358dc1
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/Preview/Popup.js
@@ -0,0 +1,277 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React, { Component } from "devtools/client/shared/vendor/react";
+import { div } from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+import { connect } from "devtools/client/shared/vendor/react-redux";
+
+import Reps from "devtools/client/shared/components/reps/index";
+const {
+ REPS: { Grip },
+ MODE,
+ objectInspector,
+} = Reps;
+
+const { ObjectInspector, utils } = objectInspector;
+
+const {
+ node: { nodeIsPrimitive },
+} = utils;
+
+import ExceptionPopup from "./ExceptionPopup";
+
+import actions from "../../../actions/index";
+import Popover from "../../shared/Popover";
+
+export class Popup extends Component {
+ constructor(props) {
+ super(props);
+ }
+
+ static get propTypes() {
+ return {
+ clearPreview: PropTypes.func.isRequired,
+ editorRef: PropTypes.object.isRequired,
+ highlightDomElement: PropTypes.func.isRequired,
+ openElementInInspector: PropTypes.func.isRequired,
+ openLink: PropTypes.func.isRequired,
+ preview: PropTypes.object.isRequired,
+ selectSourceURL: PropTypes.func.isRequired,
+ unHighlightDomElement: PropTypes.func.isRequired,
+ };
+ }
+
+ componentDidMount() {
+ this.addHighlightToToken(this.props.preview.target);
+ }
+
+ componentWillUnmount() {
+ this.removeHighlightFromToken(this.props.preview.target);
+ }
+
+ componentDidUpdate(prevProps) {
+ const { target } = this.props.preview;
+ if (prevProps.target == target) {
+ return;
+ }
+
+ this.removeHighlightFromToken(prevProps.preview.target);
+ this.addHighlightToToken(target);
+ }
+
+ addHighlightToToken(target) {
+ if (!target) {
+ return;
+ }
+
+ target.classList.add("preview-token");
+ addHighlightToTargetSiblings(target, this.props);
+ }
+
+ removeHighlightFromToken(target) {
+ if (!target) {
+ return;
+ }
+
+ target.classList.remove("preview-token");
+ removeHighlightForTargetSiblings(target);
+ }
+
+ calculateMaxHeight = () => {
+ const { editorRef } = this.props;
+ if (!editorRef) {
+ return "auto";
+ }
+
+ const { height, top } = editorRef.getBoundingClientRect();
+ const maxHeight = height + top;
+ if (maxHeight < 250) {
+ return maxHeight;
+ }
+
+ return 250;
+ };
+
+ createElement(element) {
+ return document.createElement(element);
+ }
+
+ renderExceptionPreview(exception) {
+ return React.createElement(ExceptionPopup, {
+ exception: exception,
+ clearPreview: this.props.clearPreview,
+ });
+ }
+
+ renderPreview() {
+ const {
+ preview: { root, exception, resultGrip },
+ } = this.props;
+
+ const usesCustomFormatter =
+ root?.contents?.value?.useCustomFormatter ?? false;
+
+ if (exception) {
+ return this.renderExceptionPreview(exception);
+ }
+
+ return div(
+ {
+ className: "preview-popup",
+ style: {
+ maxHeight: this.calculateMaxHeight(),
+ },
+ },
+ React.createElement(ObjectInspector, {
+ roots: [root],
+ autoExpandDepth: 1,
+ autoReleaseObjectActors: false,
+ mode: usesCustomFormatter ? MODE.LONG : MODE.SHORT,
+ disableWrap: true,
+ displayRootNodeAsHeader: true,
+ focusable: false,
+ openLink: this.props.openLink,
+ defaultRep: Grip,
+ createElement: this.createElement,
+ onDOMNodeClick: grip => this.props.openElementInInspector(grip),
+ onInspectIconClick: grip => this.props.openElementInInspector(grip),
+ onDOMNodeMouseOver: grip => this.props.highlightDomElement(grip),
+ onDOMNodeMouseOut: grip => this.props.unHighlightDomElement(grip),
+ mayUseCustomFormatter: true,
+ onViewSourceInDebugger: () => {
+ return (
+ resultGrip.location &&
+ this.props.selectSourceURL(resultGrip.location.url, {
+ line: resultGrip.location.line,
+ column: resultGrip.location.column,
+ })
+ );
+ },
+ })
+ );
+ }
+
+ getPreviewType() {
+ const {
+ preview: { root, exception },
+ } = this.props;
+ if (exception || nodeIsPrimitive(root)) {
+ return "tooltip";
+ }
+
+ return "popover";
+ }
+
+ render() {
+ const {
+ preview: { cursorPos, resultGrip, exception },
+ editorRef,
+ } = this.props;
+
+ if (
+ !exception &&
+ (typeof resultGrip == "undefined" || resultGrip?.optimizedOut)
+ ) {
+ return null;
+ }
+
+ const type = this.getPreviewType();
+ return React.createElement(
+ Popover,
+ {
+ targetPosition: cursorPos,
+ type: type,
+ editorRef: editorRef,
+ target: this.props.preview.target,
+ mouseout: this.props.clearPreview,
+ },
+ this.renderPreview()
+ );
+ }
+}
+
+export function addHighlightToTargetSiblings(target, props) {
+ // This function searches for related tokens that should also be highlighted when previewed.
+ // Here is the process:
+ // It conducts a search on the target's next siblings and then another search for the previous siblings.
+ // If a sibling is not an element node (nodeType === 1), the highlight is not added and the search is short-circuited.
+ // If the element sibling is the same token type as the target, and is also found in the preview expression, the highlight class is added.
+
+ const tokenType = target.classList.item(0);
+ const previewExpression = props.preview.expression;
+
+ if (
+ tokenType &&
+ previewExpression &&
+ target.innerHTML !== previewExpression
+ ) {
+ let nextSibling = target.nextSibling;
+ let nextElementSibling = target.nextElementSibling;
+
+ // Note: Declaring previous/next ELEMENT siblings as well because
+ // properties like innerHTML can't be checked on nextSibling
+ // without creating a flow error even if the node is an element type.
+ while (
+ nextSibling &&
+ nextElementSibling &&
+ nextSibling.nodeType === 1 &&
+ nextElementSibling.className.includes(tokenType) &&
+ previewExpression.includes(nextElementSibling.innerHTML)
+ ) {
+ // All checks passed, add highlight and continue the search.
+ nextElementSibling.classList.add("preview-token");
+
+ nextSibling = nextSibling.nextSibling;
+ nextElementSibling = nextElementSibling.nextElementSibling;
+ }
+
+ let previousSibling = target.previousSibling;
+ let previousElementSibling = target.previousElementSibling;
+
+ while (
+ previousSibling &&
+ previousElementSibling &&
+ previousSibling.nodeType === 1 &&
+ previousElementSibling.className.includes(tokenType) &&
+ previewExpression.includes(previousElementSibling.innerHTML)
+ ) {
+ // All checks passed, add highlight and continue the search.
+ previousElementSibling.classList.add("preview-token");
+
+ previousSibling = previousSibling.previousSibling;
+ previousElementSibling = previousElementSibling.previousElementSibling;
+ }
+ }
+}
+
+export function removeHighlightForTargetSiblings(target) {
+ // Look at target's previous and next token siblings.
+ // If they also have the highlight class 'preview-token',
+ // remove that class.
+ let nextSibling = target.nextElementSibling;
+ while (nextSibling && nextSibling.className.includes("preview-token")) {
+ nextSibling.classList.remove("preview-token");
+ nextSibling = nextSibling.nextElementSibling;
+ }
+ let previousSibling = target.previousElementSibling;
+ while (
+ previousSibling &&
+ previousSibling.className.includes("preview-token")
+ ) {
+ previousSibling.classList.remove("preview-token");
+ previousSibling = previousSibling.previousElementSibling;
+ }
+}
+
+const mapDispatchToProps = {
+ addExpression: actions.addExpression,
+ selectSourceURL: actions.selectSourceURL,
+ openLink: actions.openLink,
+ openElementInInspector: actions.openElementInInspectorCommand,
+ highlightDomElement: actions.highlightDomElement,
+ unHighlightDomElement: actions.unHighlightDomElement,
+};
+
+export default connect(null, mapDispatchToProps)(Popup);
diff --git a/devtools/client/debugger/src/components/Editor/Preview/index.js b/devtools/client/debugger/src/components/Editor/Preview/index.js
new file mode 100644
index 0000000000..218d33007f
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/Preview/index.js
@@ -0,0 +1,128 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+import React, { PureComponent } from "devtools/client/shared/vendor/react";
+import { connect } from "devtools/client/shared/vendor/react-redux";
+
+import Popup from "./Popup";
+
+import { getIsCurrentThreadPaused } from "../../../selectors/index";
+import actions from "../../../actions/index";
+
+const EXCEPTION_MARKER = "mark-text-exception";
+
+class Preview extends PureComponent {
+ target = null;
+ constructor(props) {
+ super(props);
+ this.state = { selecting: false };
+ }
+
+ static get propTypes() {
+ return {
+ editor: PropTypes.object.isRequired,
+ editorRef: PropTypes.object.isRequired,
+ isPaused: PropTypes.bool.isRequired,
+ getExceptionPreview: PropTypes.func.isRequired,
+ getPreview: PropTypes.func,
+ };
+ }
+
+ componentDidMount() {
+ this.updateListeners();
+ }
+
+ componentWillUnmount() {
+ const { codeMirror } = this.props.editor;
+ const codeMirrorWrapper = codeMirror.getWrapperElement();
+
+ codeMirror.off("tokenenter", this.onTokenEnter);
+ codeMirror.off("scroll", this.onScroll);
+ codeMirrorWrapper.removeEventListener("mouseup", this.onMouseUp);
+ codeMirrorWrapper.removeEventListener("mousedown", this.onMouseDown);
+ }
+
+ updateListeners(prevProps) {
+ const { codeMirror } = this.props.editor;
+ const codeMirrorWrapper = codeMirror.getWrapperElement();
+ codeMirror.on("tokenenter", this.onTokenEnter);
+ codeMirror.on("scroll", this.onScroll);
+ codeMirrorWrapper.addEventListener("mouseup", this.onMouseUp);
+ codeMirrorWrapper.addEventListener("mousedown", this.onMouseDown);
+ }
+
+ // Note that these events are emitted by utils/editor/tokens.js
+ onTokenEnter = async ({ target, tokenPos }) => {
+ // Use a temporary object to uniquely identify the asynchronous processing of this user event
+ // and bail out if we started hovering another token.
+ const tokenId = {};
+ this.currentTokenId = tokenId;
+
+ const { editor, getPreview, getExceptionPreview } = this.props;
+ const isTargetException = target.classList.contains(EXCEPTION_MARKER);
+
+ let preview;
+ if (isTargetException) {
+ preview = await getExceptionPreview(target, tokenPos, editor.codeMirror);
+ }
+
+ if (!preview && this.props.isPaused && !this.state.selecting) {
+ preview = await getPreview(target, tokenPos, editor.codeMirror);
+ }
+
+ // Prevent modifying state and showing this preview if we started hovering another token
+ if (!preview || this.currentTokenId !== tokenId) {
+ return;
+ }
+ this.setState({ preview });
+ };
+
+ onMouseUp = () => {
+ if (this.props.isPaused) {
+ this.setState({ selecting: false });
+ }
+ };
+
+ onMouseDown = () => {
+ if (this.props.isPaused) {
+ this.setState({ selecting: true });
+ }
+ };
+
+ onScroll = () => {
+ if (this.props.isPaused) {
+ this.clearPreview();
+ }
+ };
+
+ clearPreview = () => {
+ this.setState({ preview: null });
+ };
+
+ render() {
+ const { preview } = this.state;
+ if (!preview || this.state.selecting) {
+ return null;
+ }
+ return React.createElement(Popup, {
+ preview: preview,
+ editor: this.props.editor,
+ editorRef: this.props.editorRef,
+ clearPreview: this.clearPreview,
+ });
+ }
+}
+
+const mapStateToProps = state => {
+ return {
+ isPaused: getIsCurrentThreadPaused(state),
+ };
+};
+
+export default connect(mapStateToProps, {
+ addExpression: actions.addExpression,
+ getPreview: actions.getPreview,
+ getExceptionPreview: actions.getExceptionPreview,
+})(Preview);
diff --git a/devtools/client/debugger/src/components/Editor/Preview/moz.build b/devtools/client/debugger/src/components/Editor/Preview/moz.build
new file mode 100644
index 0000000000..362faadc42
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/Preview/moz.build
@@ -0,0 +1,12 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DIRS += []
+
+CompiledModules(
+ "ExceptionPopup.js",
+ "index.js",
+ "Popup.js",
+)
diff --git a/devtools/client/debugger/src/components/Editor/Preview/tests/Popup.spec.js b/devtools/client/debugger/src/components/Editor/Preview/tests/Popup.spec.js
new file mode 100644
index 0000000000..e504c9f12c
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/Preview/tests/Popup.spec.js
@@ -0,0 +1,99 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import {
+ addHighlightToTargetSiblings,
+ removeHighlightForTargetSiblings,
+} from "../Popup";
+
+describe("addHighlightToTargetSiblings", () => {
+ it("should add preview highlight class to related target siblings", async () => {
+ const div = document.createElement("div");
+ const divChildren = ["a", "divided", "token"];
+ divChildren.forEach(function (span) {
+ const child = document.createElement("span");
+ const text = document.createTextNode(span);
+ child.appendChild(text);
+ child.classList.add("cm-property");
+ div.appendChild(child);
+ });
+
+ const target = div.children[1];
+ const props = {
+ preview: {
+ expression: "adividedtoken",
+ },
+ };
+
+ addHighlightToTargetSiblings(target, props);
+
+ const previous = target.previousElementSibling;
+ expect(previous.className.includes("preview-token")).toEqual(true);
+
+ const next = target.nextElementSibling;
+ expect(next.className.includes("preview-token")).toEqual(true);
+ });
+
+ it("should not add preview highlight class to target's related siblings after non-element nodes", () => {
+ const div = document.createElement("div");
+
+ const elementBeforePeriod = document.createElement("span");
+ elementBeforePeriod.innerHTML = "object";
+ elementBeforePeriod.classList.add("cm-property");
+ div.appendChild(elementBeforePeriod);
+
+ const period = document.createTextNode(".");
+ div.appendChild(period);
+
+ const target = document.createElement("span");
+ target.innerHTML = "property";
+ target.classList.add("cm-property");
+ div.appendChild(target);
+
+ const anotherPeriod = document.createTextNode(".");
+ div.appendChild(anotherPeriod);
+
+ const elementAfterPeriod = document.createElement("span");
+ elementAfterPeriod.innerHTML = "anotherProperty";
+ elementAfterPeriod.classList.add("cm-property");
+ div.appendChild(elementAfterPeriod);
+
+ const props = {
+ preview: {
+ expression: "object.property.anotherproperty",
+ },
+ };
+ addHighlightToTargetSiblings(target, props);
+
+ expect(elementBeforePeriod.className.includes("preview-token")).toEqual(
+ false
+ );
+ expect(elementAfterPeriod.className.includes("preview-token")).toEqual(
+ false
+ );
+ });
+});
+
+describe("removeHighlightForTargetSiblings", () => {
+ it("should remove preview highlight class from target's related siblings", async () => {
+ const div = document.createElement("div");
+ const divChildren = ["a", "divided", "token"];
+ divChildren.forEach(function (span) {
+ const child = document.createElement("span");
+ const text = document.createTextNode(span);
+ child.appendChild(text);
+ child.classList.add("preview-token");
+ div.appendChild(child);
+ });
+ const target = div.children[1];
+
+ removeHighlightForTargetSiblings(target);
+
+ const previous = target.previousElementSibling;
+ expect(previous.className.includes("preview-token")).toEqual(false);
+
+ const next = target.nextElementSibling;
+ expect(next.className.includes("preview-token")).toEqual(false);
+ });
+});
diff --git a/devtools/client/debugger/src/components/Editor/SearchInFileBar.css b/devtools/client/debugger/src/components/Editor/SearchInFileBar.css
new file mode 100644
index 0000000000..fe90b2a960
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/SearchInFileBar.css
@@ -0,0 +1,32 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+.search-bar {
+ position: relative;
+ display: flex;
+ border-top: 1px solid var(--theme-splitter-color);
+ height: var(--editor-searchbar-height);
+ transition: outline 150ms ease-out;
+}
+
+/* Display an outline on the container when the child input is focused. If another element
+ is focused (e.g. a button), we only want the outline on that element */
+.search-bar:focus-within:has(input:focus-visible) {
+ outline: var(--theme-focus-outline);
+ outline-offset: -2px;
+}
+
+.search-bar .search-outline {
+ flex-grow: 1;
+ border-width: 0;
+}
+
+/* The outline is set on .search-bar already */
+.search-bar input:focus-visible {
+ outline: none;
+}
+
+.search-bar .result-list {
+ max-height: 230px;
+}
diff --git a/devtools/client/debugger/src/components/Editor/SearchInFileBar.js b/devtools/client/debugger/src/components/Editor/SearchInFileBar.js
new file mode 100644
index 0000000000..a3491a3fef
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/SearchInFileBar.js
@@ -0,0 +1,368 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+import React, { Component } from "devtools/client/shared/vendor/react";
+import { div } from "devtools/client/shared/vendor/react-dom-factories";
+import { connect } from "devtools/client/shared/vendor/react-redux";
+import actions from "../../actions/index";
+import {
+ getActiveSearch,
+ getSelectedSource,
+ getSelectedSourceTextContent,
+ getSearchOptions,
+} from "../../selectors/index";
+
+import { searchKeys } from "../../constants";
+import { scrollList } from "../../utils/result-list";
+
+import SearchInput from "../shared/SearchInput";
+
+const { PluralForm } = require("resource://devtools/shared/plural-form.js");
+const { debounce } = require("resource://devtools/shared/debounce.js");
+import { renderWasmText } from "../../utils/wasm";
+import {
+ clearSearch,
+ find,
+ findNext,
+ findPrev,
+ removeOverlay,
+} from "../../utils/editor/index";
+import { isFulfilled } from "../../utils/async-value";
+
+function getSearchShortcut() {
+ return L10N.getStr("sourceSearch.search.key2");
+}
+
+class SearchInFileBar extends Component {
+ constructor(props) {
+ super(props);
+ this.state = {
+ query: "",
+ selectedResultIndex: 0,
+ results: {
+ matches: [],
+ matchIndex: -1,
+ count: 0,
+ index: -1,
+ },
+ inputFocused: false,
+ };
+ }
+
+ static get propTypes() {
+ return {
+ closeFileSearch: PropTypes.func.isRequired,
+ editor: PropTypes.object,
+ modifiers: PropTypes.object.isRequired,
+ searchInFileEnabled: PropTypes.bool.isRequired,
+ selectedSourceTextContent: PropTypes.bool.isRequired,
+ selectedSource: PropTypes.object.isRequired,
+ setActiveSearch: PropTypes.func.isRequired,
+ querySearchWorker: PropTypes.func.isRequired,
+ };
+ }
+
+ componentWillUnmount() {
+ const { shortcuts } = this.context;
+
+ shortcuts.off(getSearchShortcut(), this.toggleSearch);
+ shortcuts.off("Escape", this.onEscape);
+
+ this.doSearch.cancel();
+ }
+
+ // FIXME: https://bugzilla.mozilla.org/show_bug.cgi?id=1774507
+ UNSAFE_componentWillReceiveProps(nextProps) {
+ const { query } = this.state;
+ // If a new source is selected update the file search results
+ if (
+ this.props.selectedSource &&
+ nextProps.selectedSource !== this.props.selectedSource &&
+ this.props.searchInFileEnabled &&
+ query
+ ) {
+ this.doSearch(query, false);
+ }
+ }
+
+ componentDidMount() {
+ // overwrite this.doSearch with debounced version to
+ // reduce frequency of queries
+ this.doSearch = debounce(this.doSearch, 100);
+ const { shortcuts } = this.context;
+
+ shortcuts.on(getSearchShortcut(), this.toggleSearch);
+ shortcuts.on("Escape", this.onEscape);
+ }
+
+ componentDidUpdate(prevProps, prevState) {
+ if (this.refs.resultList && this.refs.resultList.refs) {
+ scrollList(this.refs.resultList.refs, this.state.selectedResultIndex);
+ }
+ }
+
+ onEscape = e => {
+ this.closeSearch(e);
+ };
+
+ clearSearch = () => {
+ const { editor: ed } = this.props;
+ if (ed) {
+ const ctx = { ed, cm: ed.codeMirror };
+ removeOverlay(ctx, this.state.query);
+ }
+ };
+
+ closeSearch = e => {
+ const { closeFileSearch, editor, searchInFileEnabled } = this.props;
+ this.clearSearch();
+ if (editor && searchInFileEnabled) {
+ closeFileSearch();
+ e.stopPropagation();
+ e.preventDefault();
+ }
+ this.setState({ inputFocused: false });
+ };
+
+ toggleSearch = e => {
+ e.stopPropagation();
+ e.preventDefault();
+ const { editor, searchInFileEnabled, setActiveSearch } = this.props;
+
+ // Set inputFocused to false, so that search query is highlighted whenever search shortcut is used, even if the input already has focus.
+ this.setState({ inputFocused: false });
+
+ if (!searchInFileEnabled) {
+ setActiveSearch("file");
+ }
+
+ if (searchInFileEnabled && editor) {
+ const query = editor.codeMirror.getSelection() || this.state.query;
+
+ if (query !== "") {
+ this.setState({ query, inputFocused: true });
+ this.doSearch(query);
+ } else {
+ this.setState({ query: "", inputFocused: true });
+ }
+ }
+ };
+
+ doSearch = async (query, focusFirstResult = true) => {
+ const { editor, modifiers, selectedSourceTextContent } = this.props;
+ if (
+ !editor ||
+ !selectedSourceTextContent ||
+ !isFulfilled(selectedSourceTextContent) ||
+ !modifiers
+ ) {
+ return;
+ }
+ const selectedContent = selectedSourceTextContent.value;
+
+ const ctx = { ed: editor, cm: editor.codeMirror };
+
+ if (!query) {
+ clearSearch(ctx.cm, query);
+ return;
+ }
+
+ let text;
+ if (selectedContent.type === "wasm") {
+ text = renderWasmText(this.props.selectedSource.id, selectedContent).join(
+ "\n"
+ );
+ } else {
+ text = selectedContent.value;
+ }
+
+ const matches = await this.props.querySearchWorker(query, text, modifiers);
+
+ const res = find(ctx, query, true, modifiers, focusFirstResult);
+ if (!res) {
+ return;
+ }
+
+ const { ch, line } = res;
+
+ const matchIndex = matches.findIndex(
+ elm => elm.line === line && elm.ch === ch
+ );
+ this.setState({
+ results: {
+ matches,
+ matchIndex,
+ count: matches.length,
+ index: ch,
+ },
+ });
+ };
+
+ traverseResults = (e, reverse = false) => {
+ e.stopPropagation();
+ e.preventDefault();
+ const { editor } = this.props;
+
+ if (!editor) {
+ return;
+ }
+
+ const ctx = { ed: editor, cm: editor.codeMirror };
+
+ const { modifiers } = this.props;
+ const { query } = this.state;
+ const { matches } = this.state.results;
+
+ if (query === "" && !this.props.searchInFileEnabled) {
+ this.props.setActiveSearch("file");
+ }
+
+ if (modifiers) {
+ const findArgs = [ctx, query, true, modifiers];
+ const results = reverse ? findPrev(...findArgs) : findNext(...findArgs);
+
+ if (!results) {
+ return;
+ }
+ const { ch, line } = results;
+ const matchIndex = matches.findIndex(
+ elm => elm.line === line && elm.ch === ch
+ );
+ this.setState({
+ results: {
+ matches,
+ matchIndex,
+ count: matches.length,
+ index: ch,
+ },
+ });
+ }
+ };
+
+ // Handlers
+
+ onChange = e => {
+ this.setState({ query: e.target.value });
+
+ return this.doSearch(e.target.value);
+ };
+
+ onFocus = e => {
+ this.setState({ inputFocused: true });
+ };
+
+ onBlur = e => {
+ this.setState({ inputFocused: false });
+ };
+
+ onKeyDown = e => {
+ if (e.key !== "Enter" && e.key !== "F3") {
+ return;
+ }
+
+ this.traverseResults(e, e.shiftKey);
+ e.preventDefault();
+ this.doSearch(e.target.value);
+ };
+
+ onHistoryScroll = query => {
+ this.setState({ query });
+ this.doSearch(query);
+ };
+
+ // Renderers
+ buildSummaryMsg() {
+ const {
+ query,
+ results: { matchIndex, count, index },
+ } = this.state;
+
+ if (query.trim() == "") {
+ return "";
+ }
+
+ if (count == 0) {
+ return L10N.getStr("editor.noResultsFound");
+ }
+
+ if (index == -1) {
+ const resultsSummaryString = L10N.getStr("sourceSearch.resultsSummary1");
+ return PluralForm.get(count, resultsSummaryString).replace("#1", count);
+ }
+
+ const searchResultsString = L10N.getStr("editor.searchResults1");
+ return PluralForm.get(count, searchResultsString)
+ .replace("#1", count)
+ .replace("%d", matchIndex + 1);
+ }
+
+ shouldShowErrorEmoji() {
+ const {
+ query,
+ results: { count },
+ } = this.state;
+ return !!query && !count;
+ }
+
+ render() {
+ const { searchInFileEnabled } = this.props;
+ const {
+ results: { count },
+ } = this.state;
+
+ if (!searchInFileEnabled) {
+ return div(null);
+ }
+ return div(
+ {
+ className: "search-bar",
+ },
+ React.createElement(SearchInput, {
+ query: this.state.query,
+ count: count,
+ placeholder: L10N.getStr("sourceSearch.search.placeholder2"),
+ summaryMsg: this.buildSummaryMsg(),
+ isLoading: false,
+ onChange: this.onChange,
+ onFocus: this.onFocus,
+ onBlur: this.onBlur,
+ showErrorEmoji: this.shouldShowErrorEmoji(),
+ onKeyDown: this.onKeyDown,
+ onHistoryScroll: this.onHistoryScroll,
+ handleNext: e => this.traverseResults(e, false),
+ handlePrev: e => this.traverseResults(e, true),
+ shouldFocus: this.state.inputFocused,
+ showClose: true,
+ showExcludePatterns: false,
+ handleClose: this.closeSearch,
+ showSearchModifiers: true,
+ searchKey: searchKeys.FILE_SEARCH,
+ onToggleSearchModifier: () => this.doSearch(this.state.query),
+ })
+ );
+ }
+}
+
+SearchInFileBar.contextTypes = {
+ shortcuts: PropTypes.object,
+};
+
+const mapStateToProps = (state, p) => {
+ const selectedSource = getSelectedSource(state);
+
+ return {
+ searchInFileEnabled: getActiveSearch(state) === "file",
+ selectedSource,
+ selectedSourceTextContent: getSelectedSourceTextContent(state),
+ modifiers: getSearchOptions(state, "file-search"),
+ };
+};
+
+export default connect(mapStateToProps, {
+ setFileSearchQuery: actions.setFileSearchQuery,
+ setActiveSearch: actions.setActiveSearch,
+ closeFileSearch: actions.closeFileSearch,
+ querySearchWorker: actions.querySearchWorker,
+})(SearchInFileBar);
diff --git a/devtools/client/debugger/src/components/Editor/Tab.js b/devtools/client/debugger/src/components/Editor/Tab.js
new file mode 100644
index 0000000000..ba5e1c1934
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/Tab.js
@@ -0,0 +1,148 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React, { PureComponent } from "devtools/client/shared/vendor/react";
+import { div, span } from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+import { connect } from "devtools/client/shared/vendor/react-redux";
+
+import SourceIcon from "../shared/SourceIcon";
+import { CloseButton } from "../shared/Button/index";
+
+import actions from "../../actions/index";
+
+import {
+ getDisplayPath,
+ getFileURL,
+ getSourceQueryString,
+ getTruncatedFileName,
+ isPretty,
+} from "../../utils/source";
+import { createLocation } from "../../utils/location";
+
+import {
+ getSelectedLocation,
+ getSourcesForTabs,
+ isSourceBlackBoxed,
+} from "../../selectors/index";
+
+const classnames = require("resource://devtools/client/shared/classnames.js");
+
+class Tab extends PureComponent {
+ static get propTypes() {
+ return {
+ closeTab: PropTypes.func.isRequired,
+ onDragEnd: PropTypes.func.isRequired,
+ onDragOver: PropTypes.func.isRequired,
+ onDragStart: PropTypes.func.isRequired,
+ selectSource: PropTypes.func.isRequired,
+ source: PropTypes.object.isRequired,
+ sourceActor: PropTypes.object.isRequired,
+ tabSources: PropTypes.array.isRequired,
+ isBlackBoxed: PropTypes.bool.isRequired,
+ };
+ }
+
+ onContextMenu = event => {
+ event.preventDefault();
+ this.props.showTabContextMenu(event, this.props.source);
+ };
+
+ isSourceSearchEnabled() {
+ return this.props.activeSearch === "source";
+ }
+
+ render() {
+ const {
+ selectSource,
+ closeTab,
+ source,
+ sourceActor,
+ tabSources,
+ onDragOver,
+ onDragStart,
+ onDragEnd,
+ index,
+ isActive,
+ } = this.props;
+ const sourceId = source.id;
+ const isPrettyCode = isPretty(source);
+
+ function onClickClose(e) {
+ e.stopPropagation();
+ closeTab(source);
+ }
+
+ function handleTabClick(e) {
+ e.preventDefault();
+ e.stopPropagation();
+ return selectSource(source, sourceActor);
+ }
+
+ const className = classnames("source-tab", {
+ active: isActive,
+ pretty: isPrettyCode,
+ blackboxed: this.props.isBlackBoxed,
+ });
+
+ const path = getDisplayPath(source, tabSources);
+ const query = getSourceQueryString(source);
+ return div(
+ {
+ draggable: true,
+ onDragOver: onDragOver,
+ onDragStart: onDragStart,
+ onDragEnd: onDragEnd,
+ className: className,
+ "data-index": index,
+ "data-source-id": sourceId,
+ onClick: handleTabClick,
+ // Accommodate middle click to close tab
+ onMouseUp: e => e.button === 1 && closeTab(source),
+ onContextMenu: this.onContextMenu,
+ title: getFileURL(source, false),
+ },
+ React.createElement(SourceIcon, {
+ location: createLocation({
+ source,
+ sourceActor,
+ }),
+ forTab: true,
+ modifier: icon => (["file", "javascript"].includes(icon) ? null : icon),
+ }),
+ div(
+ {
+ className: "filename",
+ },
+ getTruncatedFileName(source, query),
+ path && span(null, `../${path}/..`)
+ ),
+ React.createElement(CloseButton, {
+ handleClick: onClickClose,
+ tooltip: L10N.getStr("sourceTabs.closeTabButtonTooltip"),
+ })
+ );
+ }
+}
+
+const mapStateToProps = (state, { source }) => {
+ return {
+ tabSources: getSourcesForTabs(state),
+ isBlackBoxed: isSourceBlackBoxed(state, source),
+ isActive: source.id === getSelectedLocation(state)?.source.id,
+ };
+};
+
+export default connect(
+ mapStateToProps,
+ {
+ selectSource: actions.selectSource,
+ closeTab: actions.closeTab,
+ showTabContextMenu: actions.showTabContextMenu,
+ },
+ null,
+ {
+ withRef: true,
+ }
+)(Tab);
diff --git a/devtools/client/debugger/src/components/Editor/Tabs.css b/devtools/client/debugger/src/components/Editor/Tabs.css
new file mode 100644
index 0000000000..ab70876d5e
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/Tabs.css
@@ -0,0 +1,127 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+.source-header {
+ grid-area: editor-header;
+ display: flex;
+ width: 100%;
+ height: var(--editor-header-height);
+ border-bottom: 1px solid var(--theme-splitter-color);
+ background-color: var(--theme-toolbar-background);
+}
+
+.source-header * {
+ user-select: none;
+}
+
+.source-header .command-bar {
+ flex: initial;
+ flex-shrink: 0;
+ border-bottom: 0;
+ border-inline-start: 1px solid var(--theme-splitter-color);
+}
+
+.source-tabs {
+ flex: auto;
+ align-self: flex-start;
+ /* Reserve space for the overflow button (even if not visible) */
+ padding-inline-end: 28px;
+ /* Make sure that overflowing tabs don't show through other elements (see Bug 1855458) */
+ max-height: 100%;
+ overflow: hidden;
+}
+
+.source-tab {
+ display: inline-flex;
+ align-items: center;
+ position: relative;
+ min-width: 40px;
+ max-width: 100%;
+ overflow: hidden;
+ padding: 4px 10px;
+ cursor: default;
+ height: calc(var(--editor-header-height) - 1px);
+ font-size: 12px;
+ background-color: transparent;
+ vertical-align: bottom;
+}
+
+.source-tab::before {
+ content: "";
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 2px;
+ background-color: var(--tab-line-color, transparent);
+ transition: transform 250ms var(--animation-curve),
+ opacity 250ms var(--animation-curve);
+ opacity: 0;
+ transform: scaleX(0);
+}
+
+.source-tab.active {
+ --tab-line-color: var(--tab-line-selected-color);
+ color: var(--theme-toolbar-selected-color);
+ border-bottom-color: transparent;
+}
+
+.source-tab:not(.active):hover {
+ --tab-line-color: var(--tab-line-hover-color);
+ background-color: var(--theme-toolbar-hover);
+}
+
+.source-tab:hover::before,
+.source-tab.active::before {
+ opacity: 1;
+ transform: scaleX(1);
+}
+
+.source-tab .img:is(.prettyPrint,.blackBox) {
+ mask-size: 14px;
+}
+
+.source-tab .img.prettyPrint {
+ background-color: currentColor;
+}
+
+.source-tab .img.source-icon.blackBox {
+ background-color: #806414;
+}
+
+.source-tab .filename {
+ display: block;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ padding-inline-end: 4px;
+}
+
+.source-tab .filename span {
+ opacity: 0.7;
+ padding-inline-start: 4px;
+}
+
+.source-tab .close-btn {
+ visibility: hidden;
+ margin-inline-end: -6px;
+}
+
+.source-tab.active .close-btn {
+ color: inherit;
+}
+
+.source-tab.active .close-btn,
+.source-tab:hover .close-btn {
+ visibility: visible;
+}
+
+.source-tab.active .source-icon {
+ background-color: currentColor;
+}
+
+.source-tab .close-btn:hover {
+ color: var(--theme-selection-color);
+ background-color: var(--theme-selection-background);
+}
diff --git a/devtools/client/debugger/src/components/Editor/Tabs.js b/devtools/client/debugger/src/components/Editor/Tabs.js
new file mode 100644
index 0000000000..3577a4909c
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/Tabs.js
@@ -0,0 +1,320 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React, { PureComponent } from "devtools/client/shared/vendor/react";
+import {
+ div,
+ ul,
+ li,
+ span,
+} from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+import { connect } from "devtools/client/shared/vendor/react-redux";
+
+import {
+ getSourceTabs,
+ getSelectedSource,
+ getSourcesForTabs,
+ getIsPaused,
+ getCurrentThread,
+ getBlackBoxRanges,
+} from "../../selectors/index";
+import { isVisible } from "../../utils/ui";
+
+import { getHiddenTabs } from "../../utils/tabs";
+import { getFilename, isPretty, getFileURL } from "../../utils/source";
+import actions from "../../actions/index";
+
+import Tab from "./Tab";
+import { PaneToggleButton } from "../shared/Button/index";
+import Dropdown from "../shared/Dropdown";
+import AccessibleImage from "../shared/AccessibleImage";
+import CommandBar from "../SecondaryPanes/CommandBar";
+
+const { debounce } = require("resource://devtools/shared/debounce.js");
+
+function haveTabSourcesChanged(tabSources, prevTabSources) {
+ if (tabSources.length !== prevTabSources.length) {
+ return true;
+ }
+
+ for (let i = 0; i < tabSources.length; ++i) {
+ if (tabSources[i].id !== prevTabSources[i].id) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+class Tabs extends PureComponent {
+ constructor(props) {
+ super(props);
+ this.state = {
+ dropdownShown: false,
+ hiddenTabs: [],
+ };
+
+ this.onResize = debounce(() => {
+ this.updateHiddenTabs();
+ });
+ }
+
+ static get propTypes() {
+ return {
+ endPanelCollapsed: PropTypes.bool.isRequired,
+ horizontal: PropTypes.bool.isRequired,
+ isPaused: PropTypes.bool.isRequired,
+ moveTab: PropTypes.func.isRequired,
+ moveTabBySourceId: PropTypes.func.isRequired,
+ selectSource: PropTypes.func.isRequired,
+ selectedSource: PropTypes.object,
+ blackBoxRanges: PropTypes.object.isRequired,
+ startPanelCollapsed: PropTypes.bool.isRequired,
+ tabSources: PropTypes.array.isRequired,
+ tabs: PropTypes.array.isRequired,
+ togglePaneCollapse: PropTypes.func.isRequired,
+ };
+ }
+
+ componentDidUpdate(prevProps) {
+ if (
+ this.props.selectedSource !== prevProps.selectedSource ||
+ haveTabSourcesChanged(this.props.tabSources, prevProps.tabSources)
+ ) {
+ this.updateHiddenTabs();
+ }
+ }
+
+ componentDidMount() {
+ window.requestIdleCallback(this.updateHiddenTabs);
+ window.addEventListener("resize", this.onResize);
+ window.document
+ .querySelector(".editor-pane")
+ .addEventListener("resizeend", this.onResize);
+ }
+
+ componentWillUnmount() {
+ window.removeEventListener("resize", this.onResize);
+ window.document
+ .querySelector(".editor-pane")
+ .removeEventListener("resizeend", this.onResize);
+ }
+
+ /*
+ * Updates the hiddenSourceTabs state, by
+ * finding the source tabs which are wrapped and are not on the top row.
+ */
+ updateHiddenTabs = () => {
+ if (!this.refs.sourceTabs) {
+ return;
+ }
+ const { selectedSource, tabSources, moveTab } = this.props;
+ const sourceTabEls = this.refs.sourceTabs.children;
+ const hiddenTabs = getHiddenTabs(tabSources, sourceTabEls);
+
+ if (
+ selectedSource &&
+ isVisible() &&
+ hiddenTabs.find(tab => tab.id == selectedSource.id)
+ ) {
+ moveTab(selectedSource.url, 0);
+ return;
+ }
+
+ this.setState({ hiddenTabs });
+ };
+
+ toggleSourcesDropdown() {
+ this.setState(prevState => ({
+ dropdownShown: !prevState.dropdownShown,
+ }));
+ }
+
+ getIconClass(source) {
+ if (isPretty(source)) {
+ return "prettyPrint";
+ }
+ if (this.props.blackBoxRanges[source.url]) {
+ return "blackBox";
+ }
+ return "file";
+ }
+
+ renderDropdownSource = source => {
+ const { selectSource } = this.props;
+ const filename = getFilename(source);
+
+ const onClick = () => selectSource(source);
+ return li(
+ {
+ key: source.id,
+ onClick: onClick,
+ title: getFileURL(source, false),
+ },
+ React.createElement(AccessibleImage, {
+ className: `dropdown-icon ${this.getIconClass(source)}`,
+ }),
+ span(
+ {
+ className: "dropdown-label",
+ },
+ filename
+ )
+ );
+ };
+
+ // Note that these three listener will be called from Tab component
+ // so that e.target will be Tab's DOM (and not Tabs one).
+ onTabDragStart = e => {
+ this.draggedSourceId = e.target.dataset.sourceId;
+ this.draggedSourceIndex = e.target.dataset.index;
+ };
+
+ onTabDragEnd = () => {
+ this.draggedSourceId = null;
+ this.draggedSourceIndex = -1;
+ };
+
+ onTabDragOver = e => {
+ e.preventDefault();
+
+ const hoveredTabIndex = e.target.dataset.index;
+ const { moveTabBySourceId } = this.props;
+
+ if (hoveredTabIndex === this.draggedSourceIndex) {
+ return;
+ }
+
+ const tabDOMRect = e.target.getBoundingClientRect();
+ const { pageX: mouseCursorX } = e;
+ if (
+ /* Case: the mouse cursor moves into the left half of any target tab */
+ mouseCursorX - tabDOMRect.left <
+ tabDOMRect.width / 2
+ ) {
+ // The current tab goes to the left of the target tab
+ const targetTab =
+ hoveredTabIndex > this.draggedSourceIndex
+ ? hoveredTabIndex - 1
+ : hoveredTabIndex;
+ moveTabBySourceId(this.draggedSourceId, targetTab);
+ this.draggedSourceIndex = targetTab;
+ } else if (
+ /* Case: the mouse cursor moves into the right half of any target tab */
+ mouseCursorX - tabDOMRect.left >=
+ tabDOMRect.width / 2
+ ) {
+ // The current tab goes to the right of the target tab
+ const targetTab =
+ hoveredTabIndex < this.draggedSourceIndex
+ ? hoveredTabIndex + 1
+ : hoveredTabIndex;
+ moveTabBySourceId(this.draggedSourceId, targetTab);
+ this.draggedSourceIndex = targetTab;
+ }
+ };
+
+ renderTabs() {
+ const { tabs } = this.props;
+ if (!tabs) {
+ return null;
+ }
+ return div(
+ {
+ className: "source-tabs",
+ ref: "sourceTabs",
+ },
+ tabs.map(({ source, sourceActor }, index) => {
+ return React.createElement(Tab, {
+ onDragStart: this.onTabDragStart,
+ onDragOver: this.onTabDragOver,
+ onDragEnd: this.onTabDragEnd,
+ key: source.id + sourceActor?.id,
+ index,
+ source,
+ sourceActor,
+ });
+ })
+ );
+ }
+
+ renderDropdown() {
+ const { hiddenTabs } = this.state;
+ if (!hiddenTabs || !hiddenTabs.length) {
+ return null;
+ }
+ const panel = ul(null, hiddenTabs.map(this.renderDropdownSource));
+ const icon = React.createElement(AccessibleImage, {
+ className: "more-tabs",
+ });
+ return React.createElement(Dropdown, {
+ panel,
+ icon,
+ });
+ }
+
+ renderCommandBar() {
+ const { horizontal, endPanelCollapsed, isPaused } = this.props;
+ if (!endPanelCollapsed || !isPaused) {
+ return null;
+ }
+ return React.createElement(CommandBar, {
+ horizontal,
+ });
+ }
+
+ renderStartPanelToggleButton() {
+ return React.createElement(PaneToggleButton, {
+ position: "start",
+ collapsed: this.props.startPanelCollapsed,
+ handleClick: this.props.togglePaneCollapse,
+ });
+ }
+
+ renderEndPanelToggleButton() {
+ const { horizontal, endPanelCollapsed, togglePaneCollapse } = this.props;
+ if (!horizontal) {
+ return null;
+ }
+ return React.createElement(PaneToggleButton, {
+ position: "end",
+ collapsed: endPanelCollapsed,
+ handleClick: togglePaneCollapse,
+ horizontal,
+ });
+ }
+
+ render() {
+ return div(
+ {
+ className: "source-header",
+ },
+ this.renderStartPanelToggleButton(),
+ this.renderTabs(),
+ this.renderDropdown(),
+ this.renderEndPanelToggleButton(),
+ this.renderCommandBar()
+ );
+ }
+}
+
+const mapStateToProps = state => {
+ return {
+ selectedSource: getSelectedSource(state),
+ tabSources: getSourcesForTabs(state),
+ tabs: getSourceTabs(state),
+ blackBoxRanges: getBlackBoxRanges(state),
+ isPaused: getIsPaused(state, getCurrentThread(state)),
+ };
+};
+
+export default connect(mapStateToProps, {
+ selectSource: actions.selectSource,
+ moveTab: actions.moveTab,
+ moveTabBySourceId: actions.moveTabBySourceId,
+ closeTab: actions.closeTab,
+ togglePaneCollapse: actions.togglePaneCollapse,
+ showSource: actions.showSource,
+})(Tabs);
diff --git a/devtools/client/debugger/src/components/Editor/index.js b/devtools/client/debugger/src/components/Editor/index.js
new file mode 100644
index 0000000000..c659de77d2
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/index.js
@@ -0,0 +1,795 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+import React, { PureComponent } from "devtools/client/shared/vendor/react";
+import { div } from "devtools/client/shared/vendor/react-dom-factories";
+import { bindActionCreators } from "devtools/client/shared/vendor/redux";
+import ReactDOM from "devtools/client/shared/vendor/react-dom";
+import { connect } from "devtools/client/shared/vendor/react-redux";
+
+import { getLineText, isLineBlackboxed } from "./../../utils/source";
+import { createLocation } from "./../../utils/location";
+import { getIndentation } from "../../utils/indentation";
+
+import {
+ getActiveSearch,
+ getSelectedLocation,
+ getSelectedSource,
+ getSelectedSourceTextContent,
+ getSelectedBreakableLines,
+ getConditionalPanelLocation,
+ getSymbols,
+ getIsCurrentThreadPaused,
+ getSkipPausing,
+ getInlinePreview,
+ getBlackBoxRanges,
+ isSourceBlackBoxed,
+ getHighlightedLineRangeForSelectedSource,
+ isSourceMapIgnoreListEnabled,
+ isSourceOnSourceMapIgnoreList,
+ isMapScopesEnabled,
+} from "../../selectors/index";
+
+// Redux actions
+import actions from "../../actions/index";
+
+import SearchInFileBar from "./SearchInFileBar";
+import HighlightLines from "./HighlightLines";
+import Preview from "./Preview/index";
+import Breakpoints from "./Breakpoints";
+import ColumnBreakpoints from "./ColumnBreakpoints";
+import DebugLine from "./DebugLine";
+import HighlightLine from "./HighlightLine";
+import EmptyLines from "./EmptyLines";
+import ConditionalPanel from "./ConditionalPanel";
+import InlinePreviews from "./InlinePreviews";
+import Exceptions from "./Exceptions";
+import BlackboxLines from "./BlackboxLines";
+
+import {
+ showSourceText,
+ showLoading,
+ showErrorMessage,
+ getEditor,
+ clearEditor,
+ getCursorLine,
+ getCursorColumn,
+ lineAtHeight,
+ toSourceLine,
+ getDocument,
+ scrollToPosition,
+ toEditorPosition,
+ getSourceLocationFromMouseEvent,
+ hasDocument,
+ onMouseOver,
+ startOperation,
+ endOperation,
+} from "../../utils/editor/index";
+
+import { resizeToggleButton, resizeBreakpointGutter } from "../../utils/ui";
+
+const { debounce } = require("resource://devtools/shared/debounce.js");
+const classnames = require("resource://devtools/client/shared/classnames.js");
+
+const { appinfo } = Services;
+const isMacOS = appinfo.OS === "Darwin";
+
+function isSecondary(ev) {
+ return isMacOS && ev.ctrlKey && ev.button === 0;
+}
+
+function isCmd(ev) {
+ return isMacOS ? ev.metaKey : ev.ctrlKey;
+}
+
+const cssVars = {
+ searchbarHeight: "var(--editor-searchbar-height)",
+};
+
+class Editor extends PureComponent {
+ static get propTypes() {
+ return {
+ selectedSource: PropTypes.object,
+ selectedSourceTextContent: PropTypes.object,
+ selectedSourceIsBlackBoxed: PropTypes.bool,
+ closeTab: PropTypes.func.isRequired,
+ toggleBreakpointAtLine: PropTypes.func.isRequired,
+ conditionalPanelLocation: PropTypes.object,
+ closeConditionalPanel: PropTypes.func.isRequired,
+ openConditionalPanel: PropTypes.func.isRequired,
+ updateViewport: PropTypes.func.isRequired,
+ isPaused: PropTypes.bool.isRequired,
+ addBreakpointAtLine: PropTypes.func.isRequired,
+ continueToHere: PropTypes.func.isRequired,
+ updateCursorPosition: PropTypes.func.isRequired,
+ jumpToMappedLocation: PropTypes.func.isRequired,
+ selectedLocation: PropTypes.object,
+ symbols: PropTypes.object,
+ startPanelSize: PropTypes.number.isRequired,
+ endPanelSize: PropTypes.number.isRequired,
+ searchInFileEnabled: PropTypes.bool.isRequired,
+ inlinePreviewEnabled: PropTypes.bool.isRequired,
+ skipPausing: PropTypes.bool.isRequired,
+ blackboxedRanges: PropTypes.object.isRequired,
+ breakableLines: PropTypes.object.isRequired,
+ highlightedLineRange: PropTypes.object,
+ isSourceOnIgnoreList: PropTypes.bool,
+ mapScopesEnabled: PropTypes.bool,
+ };
+ }
+
+ $editorWrapper;
+ constructor(props) {
+ super(props);
+
+ this.state = {
+ editor: null,
+ };
+ }
+
+ // FIXME: https://bugzilla.mozilla.org/show_bug.cgi?id=1774507
+ UNSAFE_componentWillReceiveProps(nextProps) {
+ let { editor } = this.state;
+
+ if (!editor && nextProps.selectedSource) {
+ editor = this.setupEditor();
+ }
+
+ const shouldUpdateText =
+ nextProps.selectedSource !== this.props.selectedSource ||
+ nextProps.selectedSourceTextContent?.value !==
+ this.props.selectedSourceTextContent?.value ||
+ nextProps.symbols !== this.props.symbols;
+
+ const shouldUpdateSize =
+ nextProps.startPanelSize !== this.props.startPanelSize ||
+ nextProps.endPanelSize !== this.props.endPanelSize;
+
+ const shouldScroll =
+ nextProps.selectedLocation &&
+ this.shouldScrollToLocation(nextProps, editor);
+
+ if (shouldUpdateText || shouldUpdateSize || shouldScroll) {
+ startOperation();
+ if (shouldUpdateText) {
+ this.setText(nextProps, editor);
+ }
+ if (shouldUpdateSize) {
+ editor.codeMirror.setSize();
+ }
+ if (shouldScroll) {
+ this.scrollToLocation(nextProps, editor);
+ }
+ endOperation();
+ }
+
+ if (this.props.selectedSource != nextProps.selectedSource) {
+ this.props.updateViewport();
+ resizeBreakpointGutter(editor.codeMirror);
+ resizeToggleButton(editor.codeMirror);
+ }
+ }
+
+ setupEditor() {
+ const editor = getEditor();
+
+ // disables the default search shortcuts
+ editor._initShortcuts = () => {};
+
+ const node = ReactDOM.findDOMNode(this);
+ if (node instanceof HTMLElement) {
+ editor.appendToLocalElement(node.querySelector(".editor-mount"));
+ }
+
+ const { codeMirror } = editor;
+
+ this.abortController = new window.AbortController();
+
+ // CodeMirror refreshes its internal state on window resize, but we need to also
+ // refresh it when the side panels are resized.
+ // We could have a ResizeObserver instead, but we wouldn't be able to differentiate
+ // between window resize and side panel resize and as a result, might refresh
+ // codeMirror twice, which is wasteful.
+ window.document
+ .querySelector(".editor-pane")
+ .addEventListener("resizeend", () => codeMirror.refresh(), {
+ signal: this.abortController.signal,
+ });
+
+ codeMirror.on("gutterClick", this.onGutterClick);
+ codeMirror.on("cursorActivity", this.onCursorChange);
+
+ const codeMirrorWrapper = codeMirror.getWrapperElement();
+ // Set code editor wrapper to be focusable
+ codeMirrorWrapper.tabIndex = 0;
+ codeMirrorWrapper.addEventListener("keydown", e => this.onKeyDown(e));
+ codeMirrorWrapper.addEventListener("click", e => this.onClick(e));
+ codeMirrorWrapper.addEventListener("mouseover", onMouseOver(codeMirror));
+
+ const toggleFoldMarkerVisibility = e => {
+ if (node instanceof HTMLElement) {
+ node
+ .querySelectorAll(".CodeMirror-guttermarker-subtle")
+ .forEach(elem => {
+ elem.classList.toggle("visible");
+ });
+ }
+ };
+
+ const codeMirrorGutter = codeMirror.getGutterElement();
+ codeMirrorGutter.addEventListener("mouseleave", toggleFoldMarkerVisibility);
+ codeMirrorGutter.addEventListener("mouseenter", toggleFoldMarkerVisibility);
+ codeMirrorWrapper.addEventListener("contextmenu", event =>
+ this.openMenu(event)
+ );
+
+ codeMirror.on("scroll", this.onEditorScroll);
+ this.onEditorScroll();
+ this.setState({ editor });
+ return editor;
+ }
+
+ componentDidMount() {
+ const { shortcuts } = this.context;
+
+ shortcuts.on(L10N.getStr("toggleBreakpoint.key"), this.onToggleBreakpoint);
+ shortcuts.on(
+ L10N.getStr("toggleCondPanel.breakpoint.key"),
+ this.onToggleConditionalPanel
+ );
+ shortcuts.on(
+ L10N.getStr("toggleCondPanel.logPoint.key"),
+ this.onToggleConditionalPanel
+ );
+ shortcuts.on(
+ L10N.getStr("sourceTabs.closeTab.key"),
+ this.onCloseShortcutPress
+ );
+ shortcuts.on("Esc", this.onEscape);
+ }
+
+ onCloseShortcutPress = e => {
+ const { selectedSource } = this.props;
+ if (selectedSource) {
+ e.preventDefault();
+ e.stopPropagation();
+ this.props.closeTab(selectedSource, "shortcut");
+ }
+ };
+
+ componentWillUnmount() {
+ const { editor } = this.state;
+ if (editor) {
+ editor.destroy();
+ editor.codeMirror.off("scroll", this.onEditorScroll);
+ this.setState({ editor: null });
+ }
+
+ const { shortcuts } = this.context;
+ shortcuts.off(L10N.getStr("sourceTabs.closeTab.key"));
+ shortcuts.off(L10N.getStr("toggleBreakpoint.key"));
+ shortcuts.off(L10N.getStr("toggleCondPanel.breakpoint.key"));
+ shortcuts.off(L10N.getStr("toggleCondPanel.logPoint.key"));
+
+ if (this.abortController) {
+ this.abortController.abort();
+ this.abortController = null;
+ }
+ }
+
+ getCurrentLine() {
+ const { codeMirror } = this.state.editor;
+ const { selectedSource } = this.props;
+ if (!selectedSource) {
+ return null;
+ }
+
+ const line = getCursorLine(codeMirror);
+ return toSourceLine(selectedSource.id, line);
+ }
+
+ onToggleBreakpoint = e => {
+ e.preventDefault();
+ e.stopPropagation();
+
+ const line = this.getCurrentLine();
+ if (typeof line !== "number") {
+ return;
+ }
+
+ this.props.toggleBreakpointAtLine(line);
+ };
+
+ onToggleConditionalPanel = e => {
+ e.stopPropagation();
+ e.preventDefault();
+
+ const {
+ conditionalPanelLocation,
+ closeConditionalPanel,
+ openConditionalPanel,
+ selectedSource,
+ } = this.props;
+
+ const line = this.getCurrentLine();
+
+ const { codeMirror } = this.state.editor;
+ // add one to column for correct position in editor.
+ const column = getCursorColumn(codeMirror) + 1;
+
+ if (conditionalPanelLocation) {
+ return closeConditionalPanel();
+ }
+
+ if (!selectedSource || typeof line !== "number") {
+ return null;
+ }
+
+ return openConditionalPanel(
+ createLocation({
+ line,
+ column,
+ source: selectedSource,
+ }),
+ false
+ );
+ };
+
+ onEditorScroll = debounce(this.props.updateViewport, 75);
+
+ onKeyDown(e) {
+ const { codeMirror } = this.state.editor;
+ const { key, target } = e;
+ const codeWrapper = codeMirror.getWrapperElement();
+ const textArea = codeWrapper.querySelector("textArea");
+
+ if (key === "Escape" && target == textArea) {
+ e.stopPropagation();
+ e.preventDefault();
+ codeWrapper.focus();
+ } else if (key === "Enter" && target == codeWrapper) {
+ e.preventDefault();
+ // Focus into editor's text area
+ textArea.focus();
+ }
+ }
+
+ /*
+ * The default Esc command is overridden in the CodeMirror keymap to allow
+ * the Esc keypress event to be catched by the toolbox and trigger the
+ * split console. Restore it here, but preventDefault if and only if there
+ * is a multiselection.
+ */
+ onEscape = e => {
+ if (!this.state.editor) {
+ return;
+ }
+
+ const { codeMirror } = this.state.editor;
+ if (codeMirror.listSelections().length > 1) {
+ codeMirror.execCommand("singleSelection");
+ e.preventDefault();
+ }
+ };
+
+ openMenu(event) {
+ event.stopPropagation();
+ event.preventDefault();
+
+ const {
+ selectedSource,
+ selectedSourceTextContent,
+ conditionalPanelLocation,
+ closeConditionalPanel,
+ } = this.props;
+
+ const { editor } = this.state;
+
+ if (!selectedSource || !editor) {
+ return;
+ }
+
+ // only allow one conditionalPanel location.
+ if (conditionalPanelLocation) {
+ closeConditionalPanel();
+ }
+
+ const target = event.target;
+ const { id: sourceId } = selectedSource;
+ const line = lineAtHeight(editor, sourceId, event);
+
+ if (typeof line != "number") {
+ return;
+ }
+
+ if (target.classList.contains("CodeMirror-linenumber")) {
+ const location = createLocation({
+ line,
+ column: undefined,
+ source: selectedSource,
+ });
+
+ const lineText = getLineText(
+ sourceId,
+ selectedSourceTextContent,
+ line
+ ).trim();
+
+ this.props.showEditorGutterContextMenu(event, editor, location, lineText);
+ return;
+ }
+
+ if (target.getAttribute("id") === "columnmarker") {
+ return;
+ }
+
+ const location = getSourceLocationFromMouseEvent(
+ editor,
+ selectedSource,
+ event
+ );
+
+ this.props.showEditorContextMenu(event, editor, location);
+ }
+
+ /**
+ * CodeMirror event handler, called whenever the cursor moves
+ * for user-driven or programatic reasons.
+ */
+ onCursorChange = event => {
+ const { line, ch } = event.doc.getCursor();
+ this.props.selectLocation(
+ createLocation({
+ source: this.props.selectedSource,
+ // CodeMirror cursor location is all 0-based.
+ // Whereast in DevTools frontend and backend,
+ // only colunm is 0-based, the line is 1 based.
+ line: line + 1,
+ column: ch,
+ }),
+ {
+ // Reset the context, so that we don't switch to original
+ // while moving the cursor within a bundle
+ keepContext: false,
+
+ // Avoid highlighting the selected line
+ highlight: false,
+ }
+ );
+ };
+
+ onGutterClick = (cm, line, gutter, ev) => {
+ const {
+ selectedSource,
+ conditionalPanelLocation,
+ closeConditionalPanel,
+ addBreakpointAtLine,
+ continueToHere,
+ breakableLines,
+ blackboxedRanges,
+ isSourceOnIgnoreList,
+ } = this.props;
+
+ // ignore right clicks in the gutter
+ if (isSecondary(ev) || ev.button === 2 || !selectedSource) {
+ return;
+ }
+
+ if (conditionalPanelLocation) {
+ closeConditionalPanel();
+ return;
+ }
+
+ if (gutter === "CodeMirror-foldgutter") {
+ return;
+ }
+
+ const sourceLine = toSourceLine(selectedSource.id, line);
+ if (typeof sourceLine !== "number") {
+ return;
+ }
+
+ // ignore clicks on a non-breakable line
+ if (!breakableLines.has(sourceLine)) {
+ return;
+ }
+
+ if (isCmd(ev)) {
+ continueToHere(
+ createLocation({
+ line: sourceLine,
+ column: undefined,
+ source: selectedSource,
+ })
+ );
+ return;
+ }
+
+ addBreakpointAtLine(
+ sourceLine,
+ ev.altKey,
+ ev.shiftKey ||
+ isLineBlackboxed(
+ blackboxedRanges[selectedSource.url],
+ sourceLine,
+ isSourceOnIgnoreList
+ )
+ );
+ };
+
+ onGutterContextMenu = event => {
+ this.openMenu(event);
+ };
+
+ onClick(e) {
+ const { selectedSource, updateCursorPosition, jumpToMappedLocation } =
+ this.props;
+
+ if (selectedSource) {
+ const sourceLocation = getSourceLocationFromMouseEvent(
+ this.state.editor,
+ selectedSource,
+ e
+ );
+
+ if (e.metaKey && e.altKey) {
+ jumpToMappedLocation(sourceLocation);
+ }
+
+ updateCursorPosition(sourceLocation);
+ }
+ }
+
+ shouldScrollToLocation(nextProps, editor) {
+ if (
+ !nextProps.selectedLocation?.line ||
+ !nextProps.selectedSourceTextContent
+ ) {
+ return false;
+ }
+
+ const { selectedLocation, selectedSourceTextContent } = this.props;
+ const contentChanged =
+ !selectedSourceTextContent?.value &&
+ nextProps.selectedSourceTextContent?.value;
+ const locationChanged = selectedLocation !== nextProps.selectedLocation;
+ const symbolsChanged = nextProps.symbols != this.props.symbols;
+
+ return contentChanged || locationChanged || symbolsChanged;
+ }
+
+ scrollToLocation(nextProps, editor) {
+ const { selectedLocation, selectedSource } = nextProps;
+
+ let { line, column } = toEditorPosition(selectedLocation);
+
+ if (selectedSource && hasDocument(selectedSource.id)) {
+ const doc = getDocument(selectedSource.id);
+ const lineText = doc.getLine(line);
+ column = Math.max(column, getIndentation(lineText));
+ }
+
+ scrollToPosition(editor.codeMirror, line, column);
+ }
+
+ setText(props, editor) {
+ const { selectedSource, selectedSourceTextContent, symbols } = props;
+
+ if (!editor) {
+ return;
+ }
+
+ // check if we previously had a selected source
+ if (!selectedSource) {
+ this.clearEditor();
+ return;
+ }
+
+ if (!selectedSourceTextContent?.value) {
+ showLoading(editor);
+ return;
+ }
+
+ if (selectedSourceTextContent.state === "rejected") {
+ let { value } = selectedSourceTextContent;
+ if (typeof value !== "string") {
+ value = "Unexpected source error";
+ }
+
+ this.showErrorMessage(value);
+ return;
+ }
+
+ showSourceText(editor, selectedSource, selectedSourceTextContent, symbols);
+ }
+
+ clearEditor() {
+ const { editor } = this.state;
+ if (!editor) {
+ return;
+ }
+
+ clearEditor(editor);
+ }
+
+ showErrorMessage(msg) {
+ const { editor } = this.state;
+ if (!editor) {
+ return;
+ }
+
+ showErrorMessage(editor, msg);
+ }
+
+ getInlineEditorStyles() {
+ const { searchInFileEnabled } = this.props;
+
+ if (searchInFileEnabled) {
+ return {
+ height: `calc(100% - ${cssVars.searchbarHeight})`,
+ };
+ }
+
+ return {
+ height: "100%",
+ };
+ }
+
+ renderItems() {
+ const {
+ selectedSource,
+ conditionalPanelLocation,
+ isPaused,
+ inlinePreviewEnabled,
+ highlightedLineRange,
+ blackboxedRanges,
+ isSourceOnIgnoreList,
+ selectedSourceIsBlackBoxed,
+ mapScopesEnabled,
+ } = this.props;
+ const { editor } = this.state;
+
+ if (!selectedSource || !editor || !getDocument(selectedSource.id)) {
+ return null;
+ }
+ return div(
+ null,
+ React.createElement(DebugLine, null),
+ React.createElement(HighlightLine, null),
+ React.createElement(EmptyLines, {
+ editor,
+ }),
+ React.createElement(Breakpoints, {
+ editor,
+ }),
+ isPaused &&
+ selectedSource.isOriginal &&
+ !selectedSource.isPrettyPrinted &&
+ !mapScopesEnabled
+ ? null
+ : React.createElement(Preview, {
+ editor,
+ editorRef: this.$editorWrapper,
+ }),
+ highlightedLineRange
+ ? React.createElement(HighlightLines, {
+ editor,
+ range: highlightedLineRange,
+ })
+ : null,
+ isSourceOnIgnoreList || selectedSourceIsBlackBoxed
+ ? React.createElement(BlackboxLines, {
+ editor,
+ selectedSource,
+ isSourceOnIgnoreList,
+ blackboxedRangesForSelectedSource:
+ blackboxedRanges[selectedSource.url],
+ })
+ : null,
+ React.createElement(Exceptions, null),
+ conditionalPanelLocation
+ ? React.createElement(ConditionalPanel, {
+ editor,
+ })
+ : null,
+ React.createElement(ColumnBreakpoints, {
+ editor,
+ }),
+ isPaused &&
+ inlinePreviewEnabled &&
+ (!selectedSource.isOriginal ||
+ (selectedSource.isOriginal && selectedSource.isPrettyPrinted) ||
+ (selectedSource.isOriginal && mapScopesEnabled))
+ ? React.createElement(InlinePreviews, {
+ editor,
+ selectedSource,
+ })
+ : null
+ );
+ }
+
+ renderSearchInFileBar() {
+ if (!this.props.selectedSource) {
+ return null;
+ }
+ return React.createElement(SearchInFileBar, {
+ editor: this.state.editor,
+ });
+ }
+
+ render() {
+ const { selectedSourceIsBlackBoxed, skipPausing } = this.props;
+ return div(
+ {
+ className: classnames("editor-wrapper", {
+ blackboxed: selectedSourceIsBlackBoxed,
+ "skip-pausing": skipPausing,
+ }),
+ ref: c => (this.$editorWrapper = c),
+ },
+ div({
+ className: "editor-mount devtools-monospace",
+ style: this.getInlineEditorStyles(),
+ }),
+ this.renderSearchInFileBar(),
+ this.renderItems()
+ );
+ }
+}
+
+Editor.contextTypes = {
+ shortcuts: PropTypes.object,
+};
+
+const mapStateToProps = state => {
+ const selectedSource = getSelectedSource(state);
+ const selectedLocation = getSelectedLocation(state);
+
+ return {
+ selectedLocation,
+ selectedSource,
+ selectedSourceTextContent: getSelectedSourceTextContent(state),
+ selectedSourceIsBlackBoxed: selectedSource
+ ? isSourceBlackBoxed(state, selectedSource)
+ : null,
+ isSourceOnIgnoreList:
+ isSourceMapIgnoreListEnabled(state) &&
+ isSourceOnSourceMapIgnoreList(state, selectedSource),
+ searchInFileEnabled: getActiveSearch(state) === "file",
+ conditionalPanelLocation: getConditionalPanelLocation(state),
+ symbols: getSymbols(state, selectedLocation),
+ isPaused: getIsCurrentThreadPaused(state),
+ skipPausing: getSkipPausing(state),
+ inlinePreviewEnabled: getInlinePreview(state),
+ blackboxedRanges: getBlackBoxRanges(state),
+ breakableLines: getSelectedBreakableLines(state),
+ highlightedLineRange: getHighlightedLineRangeForSelectedSource(state),
+ mapScopesEnabled: selectedSource?.isOriginal
+ ? isMapScopesEnabled(state)
+ : null,
+ };
+};
+
+const mapDispatchToProps = dispatch => ({
+ ...bindActionCreators(
+ {
+ openConditionalPanel: actions.openConditionalPanel,
+ closeConditionalPanel: actions.closeConditionalPanel,
+ continueToHere: actions.continueToHere,
+ toggleBreakpointAtLine: actions.toggleBreakpointAtLine,
+ addBreakpointAtLine: actions.addBreakpointAtLine,
+ jumpToMappedLocation: actions.jumpToMappedLocation,
+ updateViewport: actions.updateViewport,
+ updateCursorPosition: actions.updateCursorPosition,
+ closeTab: actions.closeTab,
+ showEditorContextMenu: actions.showEditorContextMenu,
+ showEditorGutterContextMenu: actions.showEditorGutterContextMenu,
+ selectLocation: actions.selectLocation,
+ },
+ dispatch
+ ),
+});
+
+export default connect(mapStateToProps, mapDispatchToProps)(Editor);
diff --git a/devtools/client/debugger/src/components/Editor/moz.build b/devtools/client/debugger/src/components/Editor/moz.build
new file mode 100644
index 0000000000..909e57d4eb
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/moz.build
@@ -0,0 +1,31 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DIRS += [
+ "Preview",
+]
+
+CompiledModules(
+ "BlackboxLines.js",
+ "Breakpoint.js",
+ "Breakpoints.js",
+ "ColumnBreakpoint.js",
+ "ColumnBreakpoints.js",
+ "ConditionalPanel.js",
+ "DebugLine.js",
+ "EmptyLines.js",
+ "Exception.js",
+ "Exceptions.js",
+ "Footer.js",
+ "HighlightLine.js",
+ "HighlightLines.js",
+ "index.js",
+ "InlinePreview.js",
+ "InlinePreviewRow.js",
+ "InlinePreviews.js",
+ "SearchInFileBar.js",
+ "Tab.js",
+ "Tabs.js",
+)
diff --git a/devtools/client/debugger/src/components/Editor/tests/Breakpoints.spec.js b/devtools/client/debugger/src/components/Editor/tests/Breakpoints.spec.js
new file mode 100644
index 0000000000..41024081ca
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/tests/Breakpoints.spec.js
@@ -0,0 +1,53 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React from "devtools/client/shared/vendor/react";
+import { shallow } from "enzyme";
+import Breakpoints from "../Breakpoints";
+
+const BreakpointsComponent = Breakpoints.WrappedComponent;
+
+function generateDefaults(overrides) {
+ const sourceId = "server1.conn1.child1/source1";
+ const matchingBreakpoints = [{ location: { source: { id: sourceId } } }];
+
+ return {
+ selectedSource: { sourceId, get: () => false },
+ editor: {
+ codeMirror: {
+ setGutterMarker: jest.fn(),
+ },
+ },
+ blackboxedRanges: {},
+ breakpointActions: {},
+ editorActions: {},
+ breakpoints: matchingBreakpoints,
+ ...overrides,
+ };
+}
+
+function render(overrides = {}) {
+ const props = generateDefaults(overrides);
+ const component = shallow(React.createElement(BreakpointsComponent, props));
+ return { component, props };
+}
+
+describe("Breakpoints Component", () => {
+ it("should render breakpoints without columns", async () => {
+ const sourceId = "server1.conn1.child1/source1";
+ const breakpoints = [{ location: { source: { id: sourceId } } }];
+
+ const { component, props } = render({ breakpoints });
+ expect(component.find("Breakpoint")).toHaveLength(props.breakpoints.length);
+ });
+
+ it("should render breakpoints with columns", async () => {
+ const sourceId = "server1.conn1.child1/source1";
+ const breakpoints = [{ location: { column: 2, source: { id: sourceId } } }];
+
+ const { component, props } = render({ breakpoints });
+ expect(component.find("Breakpoint")).toHaveLength(props.breakpoints.length);
+ expect(component).toMatchSnapshot();
+ });
+});
diff --git a/devtools/client/debugger/src/components/Editor/tests/ConditionalPanel.spec.js b/devtools/client/debugger/src/components/Editor/tests/ConditionalPanel.spec.js
new file mode 100644
index 0000000000..f0adb096c4
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/tests/ConditionalPanel.spec.js
@@ -0,0 +1,77 @@
+/* eslint max-nested-callbacks: ["error", 7] */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React from "devtools/client/shared/vendor/react";
+import { mount } from "enzyme";
+import { ConditionalPanel } from "../ConditionalPanel";
+import * as mocks from "../../../utils/test-mockup";
+
+const source = mocks.makeMockSource();
+
+function generateDefaults(overrides, log, line, column, condition, logValue) {
+ const breakpoint = mocks.makeMockBreakpoint(source, line, column);
+ breakpoint.options.condition = condition;
+ breakpoint.options.logValue = logValue;
+
+ return {
+ editor: {
+ CodeMirror: {
+ fromTextArea: jest.fn(() => {
+ return {
+ on: jest.fn(),
+ getWrapperElement: jest.fn(() => {
+ return {
+ addEventListener: jest.fn(),
+ };
+ }),
+ focus: jest.fn(),
+ setCursor: jest.fn(),
+ lineCount: jest.fn(),
+ };
+ }),
+ },
+ codeMirror: {
+ addLineWidget: jest.fn(),
+ },
+ },
+ location: breakpoint.location,
+ source,
+ breakpoint,
+ log,
+ getDefaultValue: jest.fn(),
+ openConditionalPanel: jest.fn(),
+ closeConditionalPanel: jest.fn(),
+ ...overrides,
+ };
+}
+
+function render(log, line, column, condition, logValue, overrides = {}) {
+ const defaults = generateDefaults(
+ overrides,
+ log,
+ line,
+ column,
+ condition,
+ logValue
+ );
+ const props = { ...defaults, ...overrides };
+ const wrapper = mount(React.createElement(ConditionalPanel, props));
+ return { wrapper, props };
+}
+
+describe("ConditionalPanel", () => {
+ it("should render at location of selected breakpoint", () => {
+ const { wrapper } = render(false, 2, 2);
+ expect(wrapper).toMatchSnapshot();
+ });
+ it("should render with condition at selected breakpoint location", () => {
+ const { wrapper } = render(false, 3, 3, "I'm a condition", "not a log");
+ expect(wrapper).toMatchSnapshot();
+ });
+ it("should render with logpoint at selected breakpoint location", () => {
+ const { wrapper } = render(true, 4, 4, "not a condition", "I'm a log");
+ expect(wrapper).toMatchSnapshot();
+ });
+});
diff --git a/devtools/client/debugger/src/components/Editor/tests/DebugLine.spec.js b/devtools/client/debugger/src/components/Editor/tests/DebugLine.spec.js
new file mode 100644
index 0000000000..767dde9e6d
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/tests/DebugLine.spec.js
@@ -0,0 +1,88 @@
+/* eslint max-nested-callbacks: ["error", 7] */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React from "devtools/client/shared/vendor/react";
+import { shallow } from "enzyme";
+
+import DebugLine from "../DebugLine";
+
+import { setDocument } from "../../../utils/editor";
+
+function createMockDocument(clear) {
+ const doc = {
+ addLineClass: jest.fn(),
+ removeLineClass: jest.fn(),
+ markText: jest.fn(() => ({ clear })),
+ getLine: line => "",
+ };
+
+ return doc;
+}
+
+function generateDefaults(editor, overrides) {
+ return {
+ editor,
+ pauseInfo: {
+ why: { type: "breakpoint" },
+ },
+ frame: null,
+ sourceTextContent: null,
+ ...overrides,
+ };
+}
+
+function createLocation(line) {
+ return {
+ source: {
+ id: "foo",
+ },
+ sourceId: "foo",
+ line,
+ column: 2,
+ };
+}
+
+function render(overrides = {}) {
+ const clear = jest.fn();
+ const editor = { codeMirror: {} };
+ const props = generateDefaults(editor, overrides);
+
+ const doc = createMockDocument(clear);
+ setDocument("foo", doc);
+
+ const component = shallow(
+ React.createElement(DebugLine.WrappedComponent, props),
+ {
+ lifecycleExperimental: true,
+ }
+ );
+ return { component, props, clear, editor, doc };
+}
+
+describe("DebugLine Component", () => {
+ describe("pausing at the first location", () => {
+ describe("when there is no selected frame", () => {
+ it("should not set the debug line", () => {
+ const { component, props, doc } = render({ frame: null });
+ const line = 2;
+ const location = createLocation(line);
+
+ component.setProps({ ...props, location });
+ expect(doc.removeLineClass).not.toHaveBeenCalled();
+ });
+ });
+
+ describe("when there is a different source", () => {
+ it("should not set the debug line", async () => {
+ const { component, doc } = render();
+ const newSelectedFrame = { location: { sourceId: "bar" } };
+ expect(doc.removeLineClass).not.toHaveBeenCalled();
+
+ component.setProps({ frame: newSelectedFrame });
+ expect(doc.removeLineClass).not.toHaveBeenCalled();
+ });
+ });
+ });
+});
diff --git a/devtools/client/debugger/src/components/Editor/tests/Footer.spec.js b/devtools/client/debugger/src/components/Editor/tests/Footer.spec.js
new file mode 100644
index 0000000000..c132a28aa3
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/tests/Footer.spec.js
@@ -0,0 +1,70 @@
+/* eslint max-nested-callbacks: ["error", 7] */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React from "devtools/client/shared/vendor/react";
+import { shallow } from "enzyme";
+
+import SourceFooter from "../Footer";
+import { createSourceObject } from "../../../utils/test-head";
+import { setDocument } from "../../../utils/editor";
+
+function createMockDocument(clear, position) {
+ const doc = {
+ getCursor: jest.fn(() => position),
+ };
+ return doc;
+}
+
+function generateDefaults(overrides) {
+ return {
+ editor: {
+ codeMirror: {
+ doc: {},
+ cursorActivity: jest.fn(),
+ on: jest.fn(),
+ },
+ },
+ endPanelCollapsed: false,
+ selectedSource: {
+ ...createSourceObject("foo"),
+ content: null,
+ },
+ ...overrides,
+ };
+}
+
+function render(overrides = {}, position = { line: 0, column: 0 }) {
+ const clear = jest.fn();
+ const props = generateDefaults(overrides);
+
+ const doc = createMockDocument(clear, position);
+ setDocument(props.selectedSource.id, doc);
+
+ const component = shallow(
+ React.createElement(SourceFooter.WrappedComponent, props),
+ {
+ lifecycleExperimental: true,
+ }
+ );
+ return { component, props, clear, doc };
+}
+
+describe("SourceFooter Component", () => {
+ describe("default case", () => {
+ it("should render", () => {
+ const { component } = render();
+ expect(component).toMatchSnapshot();
+ });
+ });
+
+ describe("move cursor", () => {
+ it("should render new cursor position", () => {
+ const { component } = render();
+ component.setState({ cursorPosition: { line: 5, column: 10 } });
+
+ expect(component).toMatchSnapshot();
+ });
+ });
+});
diff --git a/devtools/client/debugger/src/components/Editor/tests/__snapshots__/Breakpoints.spec.js.snap b/devtools/client/debugger/src/components/Editor/tests/__snapshots__/Breakpoints.spec.js.snap
new file mode 100644
index 0000000000..a2e47aae58
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/tests/__snapshots__/Breakpoints.spec.js.snap
@@ -0,0 +1,32 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`Breakpoints Component should render breakpoints with columns 1`] = `
+<div>
+ <Breakpoint
+ breakpoint={
+ Object {
+ "location": Object {
+ "column": 2,
+ "source": Object {
+ "id": "server1.conn1.child1/source1",
+ },
+ },
+ }
+ }
+ editor={
+ Object {
+ "codeMirror": Object {
+ "setGutterMarker": [MockFunction],
+ },
+ }
+ }
+ key="server1.conn1.child1/source1:undefined:2"
+ selectedSource={
+ Object {
+ "get": [Function],
+ "sourceId": "server1.conn1.child1/source1",
+ }
+ }
+ />
+</div>
+`;
diff --git a/devtools/client/debugger/src/components/Editor/tests/__snapshots__/ConditionalPanel.spec.js.snap b/devtools/client/debugger/src/components/Editor/tests/__snapshots__/ConditionalPanel.spec.js.snap
new file mode 100644
index 0000000000..58e86f5009
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/tests/__snapshots__/ConditionalPanel.spec.js.snap
@@ -0,0 +1,747 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`ConditionalPanel should render at location of selected breakpoint 1`] = `
+<ConditionalPanel
+ breakpoint={
+ Object {
+ "disabled": false,
+ "generatedLocation": Object {
+ "column": 2,
+ "line": 2,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ },
+ "id": "breakpoint",
+ "location": Object {
+ "column": 2,
+ "line": 2,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ },
+ "options": Object {
+ "condition": undefined,
+ "logValue": undefined,
+ },
+ "originalText": "text",
+ "text": "text",
+ }
+ }
+ closeConditionalPanel={[MockFunction]}
+ editor={
+ Object {
+ "CodeMirror": Object {
+ "fromTextArea": [MockFunction] {
+ "calls": Array [
+ Array [
+ <textarea />,
+ Object {
+ "cursorBlinkRate": 530,
+ "mode": "javascript",
+ "placeholder": "Breakpoint condition, e.g. items.length > 0",
+ "theme": "mozilla",
+ },
+ ],
+ ],
+ "results": Array [
+ Object {
+ "type": "return",
+ "value": Object {
+ "focus": [MockFunction] {
+ "calls": Array [
+ Array [],
+ ],
+ "results": Array [
+ Object {
+ "type": "return",
+ "value": undefined,
+ },
+ ],
+ },
+ "getWrapperElement": [MockFunction] {
+ "calls": Array [
+ Array [],
+ ],
+ "results": Array [
+ Object {
+ "type": "return",
+ "value": Object {
+ "addEventListener": [MockFunction] {
+ "calls": Array [
+ Array [
+ "keydown",
+ [Function],
+ ],
+ ],
+ "results": Array [
+ Object {
+ "type": "return",
+ "value": undefined,
+ },
+ ],
+ },
+ },
+ },
+ ],
+ },
+ "lineCount": [MockFunction] {
+ "calls": Array [
+ Array [],
+ ],
+ "results": Array [
+ Object {
+ "type": "return",
+ "value": undefined,
+ },
+ ],
+ },
+ "on": [MockFunction] {
+ "calls": Array [
+ Array [
+ "keydown",
+ [Function],
+ ],
+ Array [
+ "blur",
+ [Function],
+ ],
+ ],
+ "results": Array [
+ Object {
+ "type": "return",
+ "value": undefined,
+ },
+ Object {
+ "type": "return",
+ "value": undefined,
+ },
+ ],
+ },
+ "setCursor": [MockFunction] {
+ "calls": Array [
+ Array [
+ undefined,
+ 0,
+ ],
+ ],
+ "results": Array [
+ Object {
+ "type": "return",
+ "value": undefined,
+ },
+ ],
+ },
+ },
+ },
+ ],
+ },
+ },
+ "codeMirror": Object {
+ "addLineWidget": [MockFunction] {
+ "calls": Array [
+ Array [
+ 1,
+ <div>
+ <div
+ class="conditional-breakpoint-panel"
+ >
+ <div
+ class="prompt"
+ >
+ »
+ </div>
+ <textarea />
+ </div>
+ </div>,
+ Object {
+ "coverGutter": true,
+ "noHScroll": true,
+ },
+ ],
+ ],
+ "results": Array [
+ Object {
+ "type": "return",
+ "value": undefined,
+ },
+ ],
+ },
+ },
+ }
+ }
+ getDefaultValue={[MockFunction]}
+ location={
+ Object {
+ "column": 2,
+ "line": 2,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ }
+ }
+ log={false}
+ openConditionalPanel={[MockFunction]}
+ source={
+ Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ }
+ }
+/>
+`;
+
+exports[`ConditionalPanel should render with condition at selected breakpoint location 1`] = `
+<ConditionalPanel
+ breakpoint={
+ Object {
+ "disabled": false,
+ "generatedLocation": Object {
+ "column": 3,
+ "line": 3,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ },
+ "id": "breakpoint",
+ "location": Object {
+ "column": 3,
+ "line": 3,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ },
+ "options": Object {
+ "condition": "I'm a condition",
+ "logValue": "not a log",
+ },
+ "originalText": "text",
+ "text": "text",
+ }
+ }
+ closeConditionalPanel={[MockFunction]}
+ editor={
+ Object {
+ "CodeMirror": Object {
+ "fromTextArea": [MockFunction] {
+ "calls": Array [
+ Array [
+ <textarea>
+ I'm a condition
+ </textarea>,
+ Object {
+ "cursorBlinkRate": 530,
+ "mode": "javascript",
+ "placeholder": "Breakpoint condition, e.g. items.length > 0",
+ "theme": "mozilla",
+ },
+ ],
+ ],
+ "results": Array [
+ Object {
+ "type": "return",
+ "value": Object {
+ "focus": [MockFunction] {
+ "calls": Array [
+ Array [],
+ ],
+ "results": Array [
+ Object {
+ "type": "return",
+ "value": undefined,
+ },
+ ],
+ },
+ "getWrapperElement": [MockFunction] {
+ "calls": Array [
+ Array [],
+ ],
+ "results": Array [
+ Object {
+ "type": "return",
+ "value": Object {
+ "addEventListener": [MockFunction] {
+ "calls": Array [
+ Array [
+ "keydown",
+ [Function],
+ ],
+ ],
+ "results": Array [
+ Object {
+ "type": "return",
+ "value": undefined,
+ },
+ ],
+ },
+ },
+ },
+ ],
+ },
+ "lineCount": [MockFunction] {
+ "calls": Array [
+ Array [],
+ ],
+ "results": Array [
+ Object {
+ "type": "return",
+ "value": undefined,
+ },
+ ],
+ },
+ "on": [MockFunction] {
+ "calls": Array [
+ Array [
+ "keydown",
+ [Function],
+ ],
+ Array [
+ "blur",
+ [Function],
+ ],
+ ],
+ "results": Array [
+ Object {
+ "type": "return",
+ "value": undefined,
+ },
+ Object {
+ "type": "return",
+ "value": undefined,
+ },
+ ],
+ },
+ "setCursor": [MockFunction] {
+ "calls": Array [
+ Array [
+ undefined,
+ 0,
+ ],
+ ],
+ "results": Array [
+ Object {
+ "type": "return",
+ "value": undefined,
+ },
+ ],
+ },
+ },
+ },
+ ],
+ },
+ },
+ "codeMirror": Object {
+ "addLineWidget": [MockFunction] {
+ "calls": Array [
+ Array [
+ 2,
+ <div>
+ <div
+ class="conditional-breakpoint-panel"
+ >
+ <div
+ class="prompt"
+ >
+ »
+ </div>
+ <textarea>
+ I'm a condition
+ </textarea>
+ </div>
+ </div>,
+ Object {
+ "coverGutter": true,
+ "noHScroll": true,
+ },
+ ],
+ ],
+ "results": Array [
+ Object {
+ "type": "return",
+ "value": undefined,
+ },
+ ],
+ },
+ },
+ }
+ }
+ getDefaultValue={[MockFunction]}
+ location={
+ Object {
+ "column": 3,
+ "line": 3,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ }
+ }
+ log={false}
+ openConditionalPanel={[MockFunction]}
+ source={
+ Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ }
+ }
+/>
+`;
+
+exports[`ConditionalPanel should render with logpoint at selected breakpoint location 1`] = `
+<ConditionalPanel
+ breakpoint={
+ Object {
+ "disabled": false,
+ "generatedLocation": Object {
+ "column": 4,
+ "line": 4,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ },
+ "id": "breakpoint",
+ "location": Object {
+ "column": 4,
+ "line": 4,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ },
+ "options": Object {
+ "condition": "not a condition",
+ "logValue": "I'm a log",
+ },
+ "originalText": "text",
+ "text": "text",
+ }
+ }
+ closeConditionalPanel={[MockFunction]}
+ editor={
+ Object {
+ "CodeMirror": Object {
+ "fromTextArea": [MockFunction] {
+ "calls": Array [
+ Array [
+ <textarea>
+ I'm a log
+ </textarea>,
+ Object {
+ "cursorBlinkRate": 530,
+ "mode": "javascript",
+ "placeholder": "Log message, e.g. displayName",
+ "theme": "mozilla",
+ },
+ ],
+ ],
+ "results": Array [
+ Object {
+ "type": "return",
+ "value": Object {
+ "focus": [MockFunction] {
+ "calls": Array [
+ Array [],
+ ],
+ "results": Array [
+ Object {
+ "type": "return",
+ "value": undefined,
+ },
+ ],
+ },
+ "getWrapperElement": [MockFunction] {
+ "calls": Array [
+ Array [],
+ ],
+ "results": Array [
+ Object {
+ "type": "return",
+ "value": Object {
+ "addEventListener": [MockFunction] {
+ "calls": Array [
+ Array [
+ "keydown",
+ [Function],
+ ],
+ ],
+ "results": Array [
+ Object {
+ "type": "return",
+ "value": undefined,
+ },
+ ],
+ },
+ },
+ },
+ ],
+ },
+ "lineCount": [MockFunction] {
+ "calls": Array [
+ Array [],
+ ],
+ "results": Array [
+ Object {
+ "type": "return",
+ "value": undefined,
+ },
+ ],
+ },
+ "on": [MockFunction] {
+ "calls": Array [
+ Array [
+ "keydown",
+ [Function],
+ ],
+ Array [
+ "blur",
+ [Function],
+ ],
+ ],
+ "results": Array [
+ Object {
+ "type": "return",
+ "value": undefined,
+ },
+ Object {
+ "type": "return",
+ "value": undefined,
+ },
+ ],
+ },
+ "setCursor": [MockFunction] {
+ "calls": Array [
+ Array [
+ undefined,
+ 0,
+ ],
+ ],
+ "results": Array [
+ Object {
+ "type": "return",
+ "value": undefined,
+ },
+ ],
+ },
+ },
+ },
+ ],
+ },
+ },
+ "codeMirror": Object {
+ "addLineWidget": [MockFunction] {
+ "calls": Array [
+ Array [
+ 3,
+ <div>
+ <div
+ class="conditional-breakpoint-panel log-point"
+ >
+ <div
+ class="prompt"
+ >
+ »
+ </div>
+ <textarea>
+ I'm a log
+ </textarea>
+ </div>
+ </div>,
+ Object {
+ "coverGutter": true,
+ "noHScroll": true,
+ },
+ ],
+ ],
+ "results": Array [
+ Object {
+ "type": "return",
+ "value": undefined,
+ },
+ ],
+ },
+ },
+ }
+ }
+ getDefaultValue={[MockFunction]}
+ location={
+ Object {
+ "column": 4,
+ "line": 4,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ }
+ }
+ log={true}
+ openConditionalPanel={[MockFunction]}
+ source={
+ Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ }
+ }
+/>
+`;
diff --git a/devtools/client/debugger/src/components/Editor/tests/__snapshots__/Footer.spec.js.snap b/devtools/client/debugger/src/components/Editor/tests/__snapshots__/Footer.spec.js.snap
new file mode 100644
index 0000000000..a453b034ff
--- /dev/null
+++ b/devtools/client/debugger/src/components/Editor/tests/__snapshots__/Footer.spec.js.snap
@@ -0,0 +1,93 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`SourceFooter Component default case should render 1`] = `
+<div
+ className="source-footer"
+>
+ <div
+ className="source-footer-start"
+ >
+ <div
+ className="commands"
+ >
+ <button
+ aria-label="Ignore source"
+ className="action black-box"
+ key="black-box"
+ onClick={[Function]}
+ title="Ignore source"
+ >
+ <AccessibleImage
+ className="blackBox"
+ />
+ </button>
+ <button
+ className="action prettyPrint"
+ disabled={true}
+ key="prettyPrint"
+ onClick={[Function]}
+ >
+ <AccessibleImage
+ className="prettyPrint"
+ />
+ </button>
+ </div>
+ </div>
+ <div
+ className="source-footer-end"
+ >
+ <PaneToggleButton
+ collapsed={false}
+ horizontal={false}
+ key="toggle"
+ position="end"
+ />
+ </div>
+</div>
+`;
+
+exports[`SourceFooter Component move cursor should render new cursor position 1`] = `
+<div
+ className="source-footer"
+>
+ <div
+ className="source-footer-start"
+ >
+ <div
+ className="commands"
+ >
+ <button
+ aria-label="Ignore source"
+ className="action black-box"
+ key="black-box"
+ onClick={[Function]}
+ title="Ignore source"
+ >
+ <AccessibleImage
+ className="blackBox"
+ />
+ </button>
+ <button
+ className="action prettyPrint"
+ disabled={true}
+ key="prettyPrint"
+ onClick={[Function]}
+ >
+ <AccessibleImage
+ className="prettyPrint"
+ />
+ </button>
+ </div>
+ </div>
+ <div
+ className="source-footer-end"
+ >
+ <PaneToggleButton
+ collapsed={false}
+ horizontal={false}
+ key="toggle"
+ position="end"
+ />
+ </div>
+</div>
+`;
diff --git a/devtools/client/debugger/src/components/PrimaryPanes/Outline.css b/devtools/client/debugger/src/components/PrimaryPanes/Outline.css
new file mode 100644
index 0000000000..6eb890f2d8
--- /dev/null
+++ b/devtools/client/debugger/src/components/PrimaryPanes/Outline.css
@@ -0,0 +1,158 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+
+.sources-panel .outline {
+ display: flex;
+ height: 100%;
+}
+
+.source-outline-panel {
+ flex: 1;
+ overflow: auto;
+}
+
+.outline {
+ overflow-y: hidden;
+}
+
+.outline > div {
+ width: 100%;
+ position: relative;
+}
+
+.outline-pane-info {
+ padding: 0.5em;
+ width: 100%;
+ font-style: italic;
+ text-align: center;
+ user-select: none;
+ font-size: 12px;
+ overflow: hidden;
+}
+
+.outline-list {
+ margin: 0;
+ padding: 4px 0;
+ position: absolute;
+ top: 25px;
+ bottom: 25px;
+ left: 0;
+ right: 0;
+ list-style-type: none;
+ overflow: auto;
+}
+
+.outline-list__class-list {
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+
+.outline-list__class-list > .outline-list__element {
+ padding-inline-start: 2rem;
+}
+
+.outline-list__class-list .function-signature .function-name {
+ color: var(--theme-highlight-green);
+}
+
+.outline-list .function-signature .paren {
+ color: inherit;
+}
+
+.outline-list__class h2 {
+ font-weight: normal;
+ font-size: 1em;
+ padding: 3px 0;
+ padding-inline-start: 10px;
+ color: var(--blue-55);
+ margin: 0;
+}
+
+.outline-list__class:not(:first-child) h2 {
+ margin-top: 12px;
+}
+
+.outline-list h2:hover {
+ background: var(--theme-toolbar-background-hover);
+}
+
+.theme-dark .outline-list h2 {
+ color: var(--theme-highlight-blue);
+}
+
+.outline-list h2 .keyword {
+ color: var(--theme-highlight-red);
+}
+
+.outline-list__class h2.focused {
+ background: var(--theme-selection-background);
+}
+
+.outline-list__class h2.focused,
+.outline-list__class h2.focused .keyword {
+ color: var(--theme-selection-color);
+}
+
+.outline-list__element {
+ padding: 3px 10px 3px 10px;
+ cursor: default;
+ white-space: nowrap;
+}
+
+.outline-list > .outline-list__element {
+ padding-inline-start: 1rem;
+}
+
+.outline-list__element-icon {
+ padding-inline-end: 0.4rem;
+}
+
+.outline-list__element:hover {
+ background: var(--theme-toolbar-background-hover);
+}
+
+.outline-list__element.focused {
+ background: var(--theme-selection-background);
+}
+
+.outline-list__element.focused .outline-list__element-icon,
+.outline-list__element.focused .function-signature * {
+ color: var(--theme-selection-color);
+}
+
+.outline-footer {
+ display: flex;
+ box-sizing: border-box;
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ height: 25px;
+ background: var(--theme-body-background);
+ border-top: 1px solid var(--theme-splitter-color);
+ opacity: 1;
+ z-index: 1;
+ user-select: none;
+}
+
+.outline-footer button {
+ color: var(--theme-body-color);
+
+ /* Since the buttons are on the bottom left edge, we need to adjust the outline so
+ it's not off-screen */
+ outline-offset: -2px;
+
+ &.active {
+ background: var(--theme-selection-background);
+ color: var(--theme-selection-color);
+
+ &:focus-visible {
+ /* When the button is active, it has a similar background color than the outline color
+ so we put the focus box-shadow inside the element to make the focus indicator visible */
+ box-shadow: inset var(--theme-outline-box-shadow);
+ }
+ }
+}
diff --git a/devtools/client/debugger/src/components/PrimaryPanes/Outline.js b/devtools/client/debugger/src/components/PrimaryPanes/Outline.js
new file mode 100644
index 0000000000..79ebf7a38e
--- /dev/null
+++ b/devtools/client/debugger/src/components/PrimaryPanes/Outline.js
@@ -0,0 +1,388 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React, { Component } from "devtools/client/shared/vendor/react";
+import {
+ div,
+ ul,
+ li,
+ span,
+ h2,
+ button,
+} from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+import { connect } from "devtools/client/shared/vendor/react-redux";
+
+import { containsPosition, positionAfter } from "../../utils/ast";
+import { createLocation } from "../../utils/location";
+
+import actions from "../../actions/index";
+import {
+ getSelectedLocation,
+ getCursorPosition,
+ getSelectedSourceTextContent,
+} from "../../selectors/index";
+
+import OutlineFilter from "./OutlineFilter";
+import PreviewFunction from "../shared/PreviewFunction";
+
+import { isFulfilled } from "../../utils/async-value";
+
+const classnames = require("resource://devtools/client/shared/classnames.js");
+const {
+ score: fuzzaldrinScore,
+} = require("resource://devtools/client/shared/vendor/fuzzaldrin-plus.js");
+
+// Set higher to make the fuzzaldrin filter more specific
+const FUZZALDRIN_FILTER_THRESHOLD = 15000;
+
+/**
+ * Check whether the name argument matches the fuzzy filter argument
+ */
+const filterOutlineItem = (name, filter) => {
+ if (!filter) {
+ return true;
+ }
+
+ if (filter.length === 1) {
+ // when filter is a single char just check if it starts with the char
+ return filter.toLowerCase() === name.toLowerCase()[0];
+ }
+ return fuzzaldrinScore(name, filter) > FUZZALDRIN_FILTER_THRESHOLD;
+};
+
+// Checks if an element is visible inside its parent element
+function isVisible(element, parent) {
+ const parentRect = parent.getBoundingClientRect();
+ const elementRect = element.getBoundingClientRect();
+
+ const parentTop = parentRect.top;
+ const parentBottom = parentRect.bottom;
+ const elTop = elementRect.top;
+ const elBottom = elementRect.bottom;
+
+ return parentTop < elTop && parentBottom > elBottom;
+}
+
+export class Outline extends Component {
+ constructor(props) {
+ super(props);
+ this.focusedElRef = null;
+ this.state = { filter: "", focusedItem: null, symbols: null };
+ }
+
+ static get propTypes() {
+ return {
+ alphabetizeOutline: PropTypes.bool.isRequired,
+ cursorPosition: PropTypes.object,
+ flashLineRange: PropTypes.func.isRequired,
+ onAlphabetizeClick: PropTypes.func.isRequired,
+ selectLocation: PropTypes.func.isRequired,
+ selectedLocation: PropTypes.object.isRequired,
+ getFunctionSymbols: PropTypes.func.isRequired,
+ getClassSymbols: PropTypes.func.isRequired,
+ canFetchSymbols: PropTypes.bool,
+ };
+ }
+
+ componentDidMount() {
+ if (!this.props.canFetchSymbols) {
+ return;
+ }
+ this.getClassAndFunctionSymbols();
+ }
+
+ componentDidUpdate(prevProps) {
+ const { cursorPosition, selectedLocation, canFetchSymbols } = this.props;
+ if (cursorPosition && cursorPosition !== prevProps.cursorPosition) {
+ this.setFocus(cursorPosition);
+ }
+
+ if (
+ this.focusedElRef &&
+ !isVisible(this.focusedElRef, this.refs.outlineList)
+ ) {
+ this.focusedElRef.scrollIntoView({ block: "center" });
+ }
+
+ // Lets make sure the source text has been loaded and is different
+ if (canFetchSymbols && prevProps.selectedLocation !== selectedLocation) {
+ this.getClassAndFunctionSymbols();
+ }
+ }
+
+ async getClassAndFunctionSymbols() {
+ const { selectedLocation, getFunctionSymbols, getClassSymbols } =
+ this.props;
+
+ const functions = await getFunctionSymbols(selectedLocation);
+ const classes = await getClassSymbols(selectedLocation);
+
+ this.setState({ symbols: { functions, classes } });
+ }
+
+ async setFocus(cursorPosition) {
+ const { symbols } = this.state;
+
+ let classes = [];
+ let functions = [];
+
+ if (symbols) {
+ ({ classes, functions } = symbols);
+ }
+
+ // Find items that enclose the selected location
+ const enclosedItems = [...classes, ...functions].filter(
+ ({ name, location }) => containsPosition(location, cursorPosition)
+ );
+
+ if (!enclosedItems.length) {
+ this.setState({ focusedItem: null });
+ return;
+ }
+
+ // Find the closest item to the selected location to focus
+ const closestItem = enclosedItems.reduce((item, closest) =>
+ positionAfter(item.location, closest.location) ? item : closest
+ );
+
+ this.setState({ focusedItem: closestItem });
+ }
+
+ selectItem(selectedItem) {
+ const { selectedLocation, selectLocation } = this.props;
+ if (!selectedLocation || !selectedItem) {
+ return;
+ }
+
+ selectLocation(
+ createLocation({
+ source: selectedLocation.source,
+ line: selectedItem.location.start.line,
+ column: selectedItem.location.start.column,
+ })
+ );
+
+ this.setState({ focusedItem: selectedItem });
+ }
+
+ onContextMenu(event, func) {
+ event.stopPropagation();
+ event.preventDefault();
+
+ const { symbols } = this.state;
+ this.props.showOutlineContextMenu(event, func, symbols);
+ }
+
+ updateFilter = filter => {
+ this.setState({ filter: filter.trim() });
+ };
+
+ renderPlaceholder() {
+ const placeholderMessage = this.props.selectedLocation
+ ? L10N.getStr("outline.noFunctions")
+ : L10N.getStr("outline.noFileSelected");
+ return div(
+ {
+ className: "outline-pane-info",
+ },
+ placeholderMessage
+ );
+ }
+
+ renderLoading() {
+ return div(
+ {
+ className: "outline-pane-info",
+ },
+ L10N.getStr("loadingText")
+ );
+ }
+
+ renderFunction(func) {
+ const { focusedItem } = this.state;
+ const { name, location, parameterNames } = func;
+ const isFocused = focusedItem === func;
+ return li(
+ {
+ key: `${name}:${location.start.line}:${location.start.column}`,
+ className: classnames("outline-list__element", {
+ focused: isFocused,
+ }),
+ ref: el => {
+ if (isFocused) {
+ this.focusedElRef = el;
+ }
+ },
+ onClick: () => this.selectItem(func),
+ onContextMenu: e => this.onContextMenu(e, func),
+ },
+ span(
+ {
+ className: "outline-list__element-icon",
+ },
+ "λ"
+ ),
+ React.createElement(PreviewFunction, {
+ func: {
+ name,
+ parameterNames,
+ },
+ })
+ );
+ }
+
+ renderClassHeader(klass) {
+ return div(
+ null,
+ span(
+ {
+ className: "keyword",
+ },
+ "class"
+ ),
+ " ",
+ klass
+ );
+ }
+
+ renderClassFunctions(klass, functions) {
+ const { symbols } = this.state;
+
+ if (!symbols || klass == null || !functions.length) {
+ return null;
+ }
+
+ const { focusedItem } = this.state;
+ const classFunc = functions.find(func => func.name === klass);
+ const classFunctions = functions.filter(func => func.klass === klass);
+ const classInfo = symbols.classes.find(c => c.name === klass);
+
+ const item = classFunc || classInfo;
+ const isFocused = focusedItem === item;
+
+ return li(
+ {
+ className: "outline-list__class",
+ ref: el => {
+ if (isFocused) {
+ this.focusedElRef = el;
+ }
+ },
+ key: klass,
+ },
+ h2(
+ {
+ className: classnames({
+ focused: isFocused,
+ }),
+ onClick: () => this.selectItem(item),
+ },
+ classFunc
+ ? this.renderFunction(classFunc)
+ : this.renderClassHeader(klass)
+ ),
+ ul(
+ {
+ className: "outline-list__class-list",
+ },
+ classFunctions.map(func => this.renderFunction(func))
+ )
+ );
+ }
+
+ renderFunctions(functions) {
+ const { filter } = this.state;
+ let classes = [...new Set(functions.map(({ klass }) => klass))];
+ const namedFunctions = functions.filter(
+ ({ name, klass }) =>
+ filterOutlineItem(name, filter) && !klass && !classes.includes(name)
+ );
+ const classFunctions = functions.filter(
+ ({ name, klass }) => filterOutlineItem(name, filter) && !!klass
+ );
+
+ if (this.props.alphabetizeOutline) {
+ const sortByName = (a, b) => (a.name < b.name ? -1 : 1);
+ namedFunctions.sort(sortByName);
+ classes = classes.sort();
+ classFunctions.sort(sortByName);
+ }
+ return ul(
+ {
+ ref: "outlineList",
+ className: "outline-list devtools-monospace",
+ dir: "ltr",
+ },
+ namedFunctions.map(func => this.renderFunction(func)),
+ classes.map(klass => this.renderClassFunctions(klass, classFunctions))
+ );
+ }
+
+ renderFooter() {
+ return div(
+ {
+ className: "outline-footer",
+ },
+ button(
+ {
+ onClick: this.props.onAlphabetizeClick,
+ className: this.props.alphabetizeOutline ? "active" : "",
+ },
+ L10N.getStr("outline.sortLabel")
+ )
+ );
+ }
+
+ render() {
+ const { selectedLocation } = this.props;
+ const { filter, symbols } = this.state;
+
+ if (!selectedLocation) {
+ return this.renderPlaceholder();
+ }
+
+ if (!symbols) {
+ return this.renderLoading();
+ }
+
+ const { functions } = symbols;
+
+ if (functions.length === 0) {
+ return this.renderPlaceholder();
+ }
+
+ return div(
+ {
+ className: "outline",
+ },
+ div(
+ null,
+ React.createElement(OutlineFilter, {
+ filter: filter,
+ updateFilter: this.updateFilter,
+ }),
+ this.renderFunctions(functions),
+ this.renderFooter()
+ )
+ );
+ }
+}
+
+const mapStateToProps = state => {
+ const selectedSourceTextContent = getSelectedSourceTextContent(state);
+ return {
+ selectedLocation: getSelectedLocation(state),
+ canFetchSymbols:
+ selectedSourceTextContent && isFulfilled(selectedSourceTextContent),
+ cursorPosition: getCursorPosition(state),
+ };
+};
+
+export default connect(mapStateToProps, {
+ selectLocation: actions.selectLocation,
+ showOutlineContextMenu: actions.showOutlineContextMenu,
+ getFunctionSymbols: actions.getFunctionSymbols,
+ getClassSymbols: actions.getClassSymbols,
+})(Outline);
diff --git a/devtools/client/debugger/src/components/PrimaryPanes/OutlineFilter.css b/devtools/client/debugger/src/components/PrimaryPanes/OutlineFilter.css
new file mode 100644
index 0000000000..787e527490
--- /dev/null
+++ b/devtools/client/debugger/src/components/PrimaryPanes/OutlineFilter.css
@@ -0,0 +1,23 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+.outline-filter {
+ border: 1px solid var(--theme-splitter-color);
+ border-top: 0px;
+}
+
+.outline-filter-input {
+ height: 24px;
+ width: 100%;
+ background-color: var(--theme-sidebar-background);
+ color: var(--theme-body-color);
+ font-size: inherit;
+ user-select: text;
+ outline-offset: -2px;
+}
+
+.outline-filter-input::placeholder {
+ color: var(--theme-text-color-alt);
+ opacity: 1;
+}
diff --git a/devtools/client/debugger/src/components/PrimaryPanes/OutlineFilter.js b/devtools/client/debugger/src/components/PrimaryPanes/OutlineFilter.js
new file mode 100644
index 0000000000..12f6fed2b7
--- /dev/null
+++ b/devtools/client/debugger/src/components/PrimaryPanes/OutlineFilter.js
@@ -0,0 +1,68 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { Component } from "devtools/client/shared/vendor/react";
+import {
+ form,
+ div,
+ input,
+} from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+const classnames = require("resource://devtools/client/shared/classnames.js");
+
+export default class OutlineFilter extends Component {
+ state = { focused: false };
+
+ static get propTypes() {
+ return {
+ filter: PropTypes.string.isRequired,
+ updateFilter: PropTypes.func.isRequired,
+ };
+ }
+
+ setFocus = shouldFocus => {
+ this.setState({ focused: shouldFocus });
+ };
+
+ onChange = e => {
+ this.props.updateFilter(e.target.value);
+ };
+
+ onKeyDown = e => {
+ if (e.key === "Escape" && this.props.filter !== "") {
+ // use preventDefault to override toggling the split-console which is
+ // also bound to the ESC key
+ e.preventDefault();
+ this.props.updateFilter("");
+ } else if (e.key === "Enter") {
+ // We must prevent the form submission from taking any action
+ // https://github.com/firefox-devtools/debugger/pull/7308
+ e.preventDefault();
+ }
+ };
+
+ render() {
+ const { focused } = this.state;
+ return div(
+ {
+ className: "outline-filter",
+ },
+ form(
+ null,
+ input({
+ className: classnames("outline-filter-input devtools-filterinput", {
+ focused,
+ }),
+ onFocus: () => this.setFocus(true),
+ onBlur: () => this.setFocus(false),
+ placeholder: L10N.getStr("outline.placeholder"),
+ value: this.props.filter,
+ type: "text",
+ onChange: this.onChange,
+ onKeyDown: this.onKeyDown,
+ })
+ )
+ );
+ }
+}
diff --git a/devtools/client/debugger/src/components/PrimaryPanes/ProjectSearch.css b/devtools/client/debugger/src/components/PrimaryPanes/ProjectSearch.css
new file mode 100644
index 0000000000..eb11149a79
--- /dev/null
+++ b/devtools/client/debugger/src/components/PrimaryPanes/ProjectSearch.css
@@ -0,0 +1,227 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+.search-container {
+ position: absolute;
+ top: var(--editor-header-height);
+ left: 0;
+ width: calc(100% - 1px);
+ height: calc(100% - var(--editor-header-height));
+ display: flex;
+ flex-direction: column;
+ z-index: 20;
+ overflow-y: hidden;
+
+ /* Using the same colors as the Netmonitor's --table-selection-background-hover */
+ --search-result-background-hover: rgba(209, 232, 255, 0.8);
+}
+
+.theme-dark .search-container {
+ --search-result-background-hover: rgba(53, 59, 72, 1);
+}
+
+.project-text-search {
+ flex-grow: 1;
+ display: flex;
+ flex-direction: column;
+ overflow-y: hidden;
+ height: 100%;
+}
+
+.project-text-search .result {
+ display: contents;
+ cursor: default;
+ line-height: 16px;
+ font-size: 11px;
+ font-family: var(--monospace-font-family);
+}
+
+.project-text-search .result:hover > * {
+ background-color: var(--search-result-background-hover);
+}
+
+.project-text-search .result .line-number {
+ grid-column: 1;
+ padding-block: 1px;
+ padding-inline-start: 4px;
+ padding-inline-end: 6px;
+ text-align: end;
+ color: var(--theme-text-color-alt);
+}
+
+.unavailable-source {
+ white-space: pre;
+
+ .tooltip-panel {
+ padding: 1em;
+ }
+}
+
+.project-text-search .result .line-value {
+ grid-column: 2;
+ padding-block: 1px;
+ padding-inline-end: 4px;
+ text-overflow: ellipsis;
+ overflow-x: hidden;
+ outline-offset: -2px;
+}
+
+.project-text-search .result .query-match {
+ border-bottom: 1px solid var(--theme-contrast-border);
+ color: var(--theme-contrast-color);
+ background-color: var(--theme-contrast-background);
+}
+
+.project-text-search .result.focused .query-match {
+ border-bottom: none;
+ color: var(--theme-selection-background);
+ background-color: var(--theme-selection-color);
+}
+
+.project-text-search .tree-indent {
+ display: none;
+}
+
+.project-search-results-toolbar {
+ display: grid;
+ grid-template-columns: 1fr auto;
+ background-color: var(--theme-accordion-header-background);
+ border-bottom: 1px solid var(--theme-splitter-color);
+ padding: 2px 8px;
+ align-items: center;
+ gap: 4px;
+}
+
+
+.project-text-search .refresh-btn {
+ background-color: transparent;
+ padding: 2px;
+ display: grid;
+ --size: 16px;
+ --highlight-size: 5px;
+ --remain-size: calc(var(--size) - var(--highlight-size));
+ width: var(--size);
+ aspect-ratio: 1;
+ box-sizing: content-box;
+ grid-template-rows: var(--highlight-size) var(--remain-size);
+ grid-template-columns: var(--remain-size) var(--highlight-size);
+
+ &.devtools-button:focus-visible {
+ outline: var(--theme-focus-outline);
+ }
+
+ &.highlight::after {
+ content: "";
+ display: block;
+ grid-row: 1 / 2;
+ grid-column: 2 / 3;
+ height: 5px;
+ width: 5px;
+ background-color: var(--blue-40);
+ border-radius: 100%;
+ outline: 1px solid var(--theme-sidebar-background);
+ z-index: 1;
+ }
+
+ .img {
+ grid-row: 1 / -1;
+ grid-column: 1 / -1;
+ transition: rotate 0.2s;
+ width: 14px; height: 14px;
+
+ .highlight & {
+ rotate: 0.75turn;
+ }
+ }
+}
+
+.project-text-search .no-result-msg {
+ color: var(--theme-text-color-inactive);
+ font-size: 24px;
+ padding: 4px 15px;
+ max-width: 100%;
+ overflow-wrap: break-word;
+ hyphens: auto;
+}
+
+.project-text-search .file-result {
+ grid-column: 1/3;
+ display: flex;
+ align-items: center;
+ width: 100%;
+ min-height: 24px;
+ padding: 2px 4px;
+ font-weight: bold;
+ font-size: 12px;
+ line-height: 16px;
+ cursor: default;
+}
+
+.project-text-search .file-result .img {
+ margin-inline: 2px;
+}
+
+.project-text-search .file-result .img.file {
+ margin-inline-end: 4px;
+}
+
+.project-text-search .file-path {
+ flex: 0 1 auto;
+ padding-inline-end: 4px;
+ display: block;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.project-text-search .file-path:empty {
+ display: none;
+}
+
+.project-text-search .search-field {
+ display: flex;
+ align-self: stretch;
+ flex-grow: 1;
+ width: 100%;
+ border-bottom: none;
+}
+
+.project-text-search .tree {
+ overflow-x: hidden;
+ overflow-y: auto;
+ height: 100%;
+ display: grid;
+ min-width: 100%;
+ white-space: nowrap;
+ user-select: none;
+ align-content: start;
+ /* Align the second column to the search input's text value */
+ grid-template-columns: minmax(40px, auto) 1fr;
+ padding-top: 4px;
+}
+
+/* Fake padding-bottom using a pseudo-element because Gecko doesn't render the
+ padding-bottom in a scroll container */
+.project-text-search .tree::after {
+ content: "";
+ display: block;
+ height: 4px;
+}
+
+.project-text-search .tree .tree-node {
+ display: contents;
+}
+
+/* Focus values */
+
+.project-text-search .file-result.focused,
+.project-text-search .result.focused .line-value,
+.project-text-search .result.focused .line-number {
+ color: var(--theme-selection-color);
+ background-color: var(--theme-selection-background);
+}
+
+.project-text-search .file-result.focused .img {
+ background-color: currentColor;
+}
diff --git a/devtools/client/debugger/src/components/PrimaryPanes/ProjectSearch.js b/devtools/client/debugger/src/components/PrimaryPanes/ProjectSearch.js
new file mode 100644
index 0000000000..68b08aed2b
--- /dev/null
+++ b/devtools/client/debugger/src/components/PrimaryPanes/ProjectSearch.js
@@ -0,0 +1,480 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React, { Component } from "devtools/client/shared/vendor/react";
+import {
+ button,
+ div,
+ span,
+} from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+import { connect } from "devtools/client/shared/vendor/react-redux";
+import actions from "../../actions/index";
+
+import { getEditor } from "../../utils/editor/index";
+import { searchKeys } from "../../constants";
+
+import { getRelativePath } from "../../utils/sources-tree/utils";
+import { getFormattedSourceId } from "../../utils/source";
+import {
+ getProjectSearchQuery,
+ getNavigateCounter,
+} from "../../selectors/index";
+
+import SearchInput from "../shared/SearchInput";
+import AccessibleImage from "../shared/AccessibleImage";
+
+const { PluralForm } = require("resource://devtools/shared/plural-form.js");
+const classnames = require("resource://devtools/client/shared/classnames.js");
+const Tree = require("resource://devtools/client/shared/components/Tree.js");
+const { debounce } = require("resource://devtools/shared/debounce.js");
+const { throttle } = require("resource://devtools/shared/throttle.js");
+
+const {
+ HTMLTooltip,
+} = require("resource://devtools/client/shared/widgets/tooltip/HTMLTooltip.js");
+
+export const statusType = {
+ initial: "INITIAL",
+ fetching: "FETCHING",
+ cancelled: "CANCELLED",
+ done: "DONE",
+ error: "ERROR",
+};
+
+function getFilePath(item, index) {
+ return item.type === "RESULT"
+ ? `${item.location.source.id}-${index || "$"}`
+ : `${item.location.source.id}-${item.location.line}-${
+ item.location.column
+ }-${index || "$"}`;
+}
+
+export class ProjectSearch extends Component {
+ constructor(props) {
+ super(props);
+
+ this.state = {
+ // We may restore a previous state when changing tabs in the primary panes,
+ // or when restoring primary panes from collapse.
+ query: this.props.query || "",
+
+ inputFocused: false,
+ focusedItem: null,
+ expanded: new Set(),
+ results: [],
+ navigateCounter: null,
+ status: statusType.done,
+ };
+ // Use throttle for updating results in order to prevent delaying showing result until the end of the search
+ this.onUpdatedResults = throttle(this.onUpdatedResults.bind(this), 100);
+ // Use debounce for input processing in order to wait for the end of user input edition before triggerring the search
+ this.doSearch = debounce(this.doSearch.bind(this), 100);
+ this.doSearch();
+ }
+
+ static get propTypes() {
+ return {
+ doSearchForHighlight: PropTypes.func.isRequired,
+ query: PropTypes.string.isRequired,
+ results: PropTypes.array.isRequired,
+ searchSources: PropTypes.func.isRequired,
+ selectSpecificLocationOrSameUrl: PropTypes.func.isRequired,
+ status: PropTypes.oneOf([
+ "INITIAL",
+ "FETCHING",
+ "CANCELED",
+ "DONE",
+ "ERROR",
+ ]).isRequired,
+ modifiers: PropTypes.object,
+ toggleProjectSearchModifier: PropTypes.func,
+ };
+ }
+
+ async doSearch() {
+ // Cancel any previous async ongoing search
+ if (this.searchAbortController) {
+ this.searchAbortController.abort();
+ }
+
+ if (!this.state.query) {
+ this.setState({ status: statusType.done });
+ return;
+ }
+
+ this.setState({
+ status: statusType.fetching,
+ results: [],
+ navigateCounter: this.props.navigateCounter,
+ });
+
+ // Setup an AbortController whose main goal is to be able to cancel the asynchronous
+ // operation done by the `searchSources` action.
+ // This allows allows the React Component to receive partial updates
+ // to render results as they are available.
+ this.searchAbortController = new AbortController();
+
+ await this.props.searchSources(
+ this.state.query,
+ this.onUpdatedResults,
+ this.searchAbortController.signal
+ );
+ }
+
+ onUpdatedResults(results, done, signal) {
+ // debounce may delay the execution after this search has been cancelled
+ if (signal.aborted) {
+ return;
+ }
+
+ this.setState({
+ results,
+ status: done ? statusType.done : statusType.fetching,
+ });
+ }
+
+ selectMatchItem = async matchItem => {
+ const foundMatchingSource =
+ await this.props.selectSpecificLocationOrSameUrl(matchItem.location);
+ // When we reload, or if the source's target has been destroyed,
+ // we may no longer have the source available in the reducer.
+ // In such case `selectSpecificLocationOrSameUrl` will return false.
+ if (!foundMatchingSource) {
+ // When going over results via the key arrows and Enter, we may display many tooltips at once.
+ if (this.tooltip) {
+ this.tooltip.hide();
+ }
+ // Go down to line-number otherwise HTMLTooltip's call to getBoundingClientRect would return (0, 0) position for the tooltip
+ const element = document.querySelector(
+ ".project-text-search .tree-node.focused .result .line-number"
+ );
+ const tooltip = new HTMLTooltip(element.ownerDocument, {
+ className: "unavailable-source",
+ type: "arrow",
+ });
+ tooltip.panel.textContent = L10N.getStr(
+ "projectTextSearch.sourceNoLongerAvailable"
+ );
+ tooltip.setContentSize({ height: "auto" });
+ tooltip.show(element);
+ this.tooltip = tooltip;
+ return;
+ }
+ this.props.doSearchForHighlight(
+ this.state.query,
+ getEditor(),
+ matchItem.location.line,
+ matchItem.location.column
+ );
+ };
+
+ highlightMatches = lineMatch => {
+ const { value, matchIndex, match } = lineMatch;
+ const len = match.length;
+ return span(
+ {
+ className: "line-value",
+ },
+ span(
+ {
+ className: "line-match",
+ key: 0,
+ },
+ value.slice(0, matchIndex)
+ ),
+ span(
+ {
+ className: "query-match",
+ key: 1,
+ },
+ value.substr(matchIndex, len)
+ ),
+ span(
+ {
+ className: "line-match",
+ key: 2,
+ },
+ value.slice(matchIndex + len, value.length)
+ )
+ );
+ };
+
+ getResultCount = () =>
+ this.state.results.reduce((count, file) => count + file.matches.length, 0);
+
+ onKeyDown = e => {
+ if (e.key === "Escape") {
+ return;
+ }
+
+ e.stopPropagation();
+
+ this.setState({ focusedItem: null });
+ this.doSearch();
+ };
+
+ onHistoryScroll = query => {
+ this.setState({ query });
+ this.doSearch();
+ };
+
+ // This can be called by Tree when manually selecting node via arrow keys and Enter.
+ onActivate = item => {
+ if (item && item.type === "MATCH") {
+ this.selectMatchItem(item);
+ }
+ };
+
+ onFocus = item => {
+ if (this.state.focusedItem !== item) {
+ this.setState({
+ focusedItem: item,
+ });
+ }
+ };
+
+ inputOnChange = e => {
+ const inputValue = e.target.value;
+ this.setState({ query: inputValue });
+ this.doSearch();
+ };
+
+ renderFile = (file, focused, expanded) => {
+ const matchesLength = file.matches.length;
+ const matches = ` (${matchesLength} match${matchesLength > 1 ? "es" : ""})`;
+ return div(
+ {
+ className: classnames("file-result", {
+ focused,
+ }),
+ key: file.location.source.id,
+ },
+ React.createElement(AccessibleImage, {
+ className: classnames("arrow", {
+ expanded,
+ }),
+ }),
+ React.createElement(AccessibleImage, {
+ className: "file",
+ }),
+ span(
+ {
+ className: "file-path",
+ },
+ file.location.source.url
+ ? getRelativePath(file.location.source.url)
+ : getFormattedSourceId(file.location.source.id)
+ ),
+ span(
+ {
+ className: "matches-summary",
+ },
+ matches
+ )
+ );
+ };
+
+ renderMatch = (match, focused) => {
+ return div(
+ {
+ className: classnames("result", {
+ focused,
+ }),
+ onClick: () => this.selectMatchItem(match),
+ },
+ span(
+ {
+ className: "line-number",
+ key: match.location.line,
+ },
+ match.location.line
+ ),
+ this.highlightMatches(match)
+ );
+ };
+
+ renderItem = (item, depth, focused, _, expanded) => {
+ if (item.type === "RESULT") {
+ return this.renderFile(item, focused, expanded);
+ }
+ return this.renderMatch(item, focused);
+ };
+
+ renderRefreshButton() {
+ if (!this.state.query) {
+ return null;
+ }
+
+ // Highlight the refresh button when the current search results
+ // are based on the previous document. doSearch will save the "navigate counter"
+ // into state, while props will report the current "navigate counter".
+ // The "navigate counter" is incremented each time we navigate to a new page.
+ const highlight =
+ this.state.navigateCounter != null &&
+ this.state.navigateCounter != this.props.navigateCounter;
+ return button(
+ {
+ className: classnames("refresh-btn devtools-button", {
+ highlight,
+ }),
+ title: highlight
+ ? L10N.getStr("projectTextSearch.refreshButtonTooltipOnNavigation")
+ : L10N.getStr("projectTextSearch.refreshButtonTooltip"),
+ onClick: this.doSearch,
+ },
+ React.createElement(AccessibleImage, {
+ className: "refresh",
+ })
+ );
+ }
+
+ renderResultsToolbar() {
+ if (!this.state.query) {
+ return null;
+ }
+ return div(
+ { className: "project-search-results-toolbar" },
+ span({ className: "results-count" }, this.renderSummary()),
+ this.renderRefreshButton()
+ );
+ }
+
+ renderResults() {
+ const { status, results } = this.state;
+ if (!this.state.query) {
+ return null;
+ }
+ if (results.length) {
+ return React.createElement(Tree, {
+ getRoots: () => results,
+ getChildren: file => file.matches || [],
+ autoExpandAll: true,
+ autoExpandDepth: 1,
+ autoExpandNodeChildrenLimit: 100,
+ getParent: item => null,
+ getPath: getFilePath,
+ renderItem: this.renderItem,
+ focused: this.state.focusedItem,
+ onFocus: this.onFocus,
+ onActivate: this.onActivate,
+ isExpanded: item => {
+ return this.state.expanded.has(item);
+ },
+ onExpand: item => {
+ const { expanded } = this.state;
+ expanded.add(item);
+ this.setState({
+ expanded,
+ });
+ },
+ onCollapse: item => {
+ const { expanded } = this.state;
+ expanded.delete(item);
+ this.setState({
+ expanded,
+ });
+ },
+ getKey: getFilePath,
+ });
+ }
+ const msg =
+ status === statusType.fetching
+ ? L10N.getStr("loadingText")
+ : L10N.getStr("projectTextSearch.noResults");
+ return div(
+ {
+ className: "no-result-msg absolute-center",
+ },
+ msg
+ );
+ }
+
+ renderSummary = () => {
+ if (this.state.query === "") {
+ return "";
+ }
+ const resultsSummaryString = L10N.getStr("sourceSearch.resultsSummary2");
+ const count = this.getResultCount();
+ if (count === 0) {
+ return "";
+ }
+ return PluralForm.get(count, resultsSummaryString).replace("#1", count);
+ };
+
+ shouldShowErrorEmoji() {
+ return !this.getResultCount() && this.state.status === statusType.done;
+ }
+
+ renderInput() {
+ const { status } = this.state;
+ return React.createElement(SearchInput, {
+ query: this.state.query,
+ count: this.getResultCount(),
+ placeholder: L10N.getStr("projectTextSearch.placeholder"),
+ size: "small",
+ showErrorEmoji: this.shouldShowErrorEmoji(),
+ isLoading: status === statusType.fetching,
+ onChange: this.inputOnChange,
+ onFocus: () =>
+ this.setState({
+ inputFocused: true,
+ }),
+ onBlur: () =>
+ this.setState({
+ inputFocused: false,
+ }),
+ onKeyDown: this.onKeyDown,
+ onHistoryScroll: this.onHistoryScroll,
+ showClose: false,
+ showExcludePatterns: true,
+ excludePatternsLabel: L10N.getStr(
+ "projectTextSearch.excludePatterns.label"
+ ),
+ excludePatternsPlaceholder: L10N.getStr(
+ "projectTextSearch.excludePatterns.placeholder"
+ ),
+ ref: "searchInput",
+ showSearchModifiers: true,
+ searchKey: searchKeys.PROJECT_SEARCH,
+ onToggleSearchModifier: this.doSearch,
+ });
+ }
+
+ render() {
+ return div(
+ {
+ className: "search-container",
+ },
+ div(
+ {
+ className: "project-text-search",
+ },
+ div(
+ {
+ className: "header",
+ },
+ this.renderInput()
+ ),
+ this.renderResultsToolbar(),
+ this.renderResults()
+ )
+ );
+ }
+}
+
+ProjectSearch.contextTypes = {
+ shortcuts: PropTypes.object,
+};
+
+const mapStateToProps = state => ({
+ query: getProjectSearchQuery(state),
+ navigateCounter: getNavigateCounter(state),
+});
+
+export default connect(mapStateToProps, {
+ searchSources: actions.searchSources,
+ selectSpecificLocationOrSameUrl: actions.selectSpecificLocationOrSameUrl,
+ doSearchForHighlight: actions.doSearchForHighlight,
+})(ProjectSearch);
diff --git a/devtools/client/debugger/src/components/PrimaryPanes/Sources.css b/devtools/client/debugger/src/components/PrimaryPanes/Sources.css
new file mode 100644
index 0000000000..68c28655be
--- /dev/null
+++ b/devtools/client/debugger/src/components/PrimaryPanes/Sources.css
@@ -0,0 +1,244 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+.sources-panel {
+ background-color: var(--theme-sidebar-background);
+ display: flex;
+ flex: 1;
+ flex-direction: column;
+ overflow: hidden;
+ position: relative;
+
+ & * {
+ user-select: none;
+ }
+
+ /* Tabs header */
+ & .tabs-navigation {
+ height: var(--editor-header-height) !important;
+
+ & .tabs-menu {
+ /* override margin set by the Tabs component */
+ margin: 0 !important;
+ }
+
+ & .tab {
+ flex: 1;
+ overflow: hidden;
+ display: inline-flex;
+ align-items: center;
+ }
+
+ & [role="tab"] {
+ padding: 4px 8px;
+ flex: 1;
+ }
+ }
+}
+
+
+
+/***********************/
+/* Souces Panel layout */
+/***********************/
+
+.sources-list {
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ overflow: hidden;
+}
+
+.sources-list .sources-clear-root-container {
+ grid-area: custom-root;
+}
+
+.sources-list :is(.tree, .no-sources-message) {
+ grid-area: sources-tree-or-empty-message;
+}
+
+/****************/
+/* Custom root */
+/****************/
+
+.sources-clear-root {
+ padding: 4px 8px;
+ width: 100%;
+ text-align: start;
+ white-space: nowrap;
+ color: inherit;
+ display: flex;
+ border-bottom: 1px solid var(--theme-splitter-color);
+}
+
+.sources-clear-root .home {
+ background-color: var(--theme-icon-dimmed-color);
+}
+
+.sources-clear-root .breadcrumb {
+ width: 5px;
+ margin: 0 2px 0 6px;
+ vertical-align: bottom;
+ background: var(--theme-text-color-alt);
+}
+
+.sources-clear-root-label {
+ margin-left: 5px;
+ line-height: 16px;
+}
+
+/*****************/
+/* Sources tree */
+/*****************/
+
+.sources-list .tree {
+ flex-grow: 1;
+ padding: 4px 0;
+ user-select: none;
+
+ white-space: nowrap;
+ overflow: auto;
+ min-width: 100%;
+
+ display: grid;
+ grid-template-columns: 1fr;
+ align-content: start;
+
+ line-height: 1.4em;
+}
+
+.sources-list .tree .node {
+ display: flex;
+ align-items: center;
+ width: 100%;
+ padding-block: 8px;
+ padding-inline: 6px 8px;
+}
+
+.sources-list .tree .tree-node:not(.focused):hover {
+ background: var(--theme-toolbar-background-hover);
+}
+
+.sources-list .tree button {
+ display: block;
+}
+
+.sources-list .tree .node {
+ padding: 2px 3px;
+ position: relative;
+}
+
+.sources-list .tree .node.focused {
+ color: var(--theme-selection-color);
+ background-color: var(--theme-selection-background);
+}
+
+html:not([dir="rtl"]) .sources-list .tree .node > div {
+ margin-left: 10px;
+}
+
+html[dir="rtl"] .sources-list .tree .node > div {
+ margin-right: 10px;
+}
+
+.sources-list .tree-node button {
+ position: fixed;
+}
+
+.sources-list .img {
+ margin-inline-end: 4px;
+}
+
+.sources-list .tree .focused .img {
+ --icon-color: #ffffff;
+ background-color: var(--icon-color);
+ fill: var(--icon-color);
+}
+
+/* Use the same width as .img.arrow */
+.sources-list .tree .img.no-arrow {
+ width: 10px;
+ visibility: hidden;
+}
+
+.sources-list .tree .label .suffix {
+ font-style: italic;
+ font-size: 0.9em;
+ color: var(--theme-comment);
+}
+
+.sources-list .tree .focused .label .suffix {
+ color: inherit;
+}
+
+.theme-dark .source-list .node.focused {
+ background-color: var(--theme-tab-toolbar-background);
+}
+
+.sources-list .tree .blackboxed {
+ color: #806414;
+}
+
+.sources-list .img.blackBox {
+ mask-size: 13px;
+ background-color: #806414;
+}
+
+.sources-list .tree .label {
+ display: inline-block;
+ line-height: 16px;
+}
+
+.source-list-footer {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ gap: 5px;
+ justify-content: center;
+ text-align: center;
+ min-height: var(--editor-footer-height);
+ flex-shrink: 0;
+ border-block-start: 1px solid var(--theme-warning-border);
+ user-select: none;
+ padding: 3px 10px;
+ color: var(--theme-warning-color);
+ background-color: var(--theme-warning-background);
+}
+
+.source-list-footer .devtools-togglebutton {
+ background-color: var(--theme-toolbar-hover);
+}
+
+.source-list-footer .devtools-togglebutton:hover {
+ background-color: var(--theme-toolbar-hover);
+ cursor: pointer;
+}
+
+
+/* Removes start margin when a custom root is used */
+.sources-list-custom-root
+ .tree
+ > .tree-node[data-expandable="false"][aria-level="0"] {
+ padding-inline-start: 4px;
+}
+
+.sources-list .tree-node[data-expandable="false"] .tree-indent:last-of-type {
+ margin-inline-end: 0;
+}
+
+
+/*****************/
+/* No Sources */
+/*****************/
+
+.no-sources-message {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ font-style: italic;
+ text-align: center;
+ padding: 0.5em;
+ font-size: 12px;
+ user-select: none;
+}
diff --git a/devtools/client/debugger/src/components/PrimaryPanes/SourcesTree.js b/devtools/client/debugger/src/components/PrimaryPanes/SourcesTree.js
new file mode 100644
index 0000000000..286e673706
--- /dev/null
+++ b/devtools/client/debugger/src/components/PrimaryPanes/SourcesTree.js
@@ -0,0 +1,352 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Dependencies
+import React, {
+ Component,
+ Fragment,
+} from "devtools/client/shared/vendor/react";
+import {
+ div,
+ button,
+ span,
+ footer,
+} from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+import { connect } from "devtools/client/shared/vendor/react-redux";
+
+// Selectors
+import {
+ getMainThreadHost,
+ getExpandedState,
+ getProjectDirectoryRoot,
+ getProjectDirectoryRootName,
+ getSourcesTreeSources,
+ getFocusedSourceItem,
+ getHideIgnoredSources,
+} from "../../selectors/index";
+
+// Actions
+import actions from "../../actions/index";
+
+// Components
+import SourcesTreeItem from "./SourcesTreeItem";
+import AccessibleImage from "../shared/AccessibleImage";
+
+const classnames = require("resource://devtools/client/shared/classnames.js");
+const Tree = require("resource://devtools/client/shared/components/Tree.js");
+
+function shouldAutoExpand(item, mainThreadHost) {
+ // There is only one case where we want to force auto expand,
+ // when we are on the group of the page's domain.
+ return item.type == "group" && item.groupName === mainThreadHost;
+}
+
+class SourcesTree extends Component {
+ constructor(props) {
+ super(props);
+
+ this.state = {};
+ }
+
+ static get propTypes() {
+ return {
+ mainThreadHost: PropTypes.string.isRequired,
+ expanded: PropTypes.object.isRequired,
+ focusItem: PropTypes.func.isRequired,
+ focused: PropTypes.object,
+ projectRoot: PropTypes.string.isRequired,
+ selectSource: PropTypes.func.isRequired,
+ setExpandedState: PropTypes.func.isRequired,
+ rootItems: PropTypes.object.isRequired,
+ clearProjectDirectoryRoot: PropTypes.func.isRequired,
+ projectRootName: PropTypes.string.isRequired,
+ setHideOrShowIgnoredSources: PropTypes.func.isRequired,
+ hideIgnoredSources: PropTypes.bool.isRequired,
+ };
+ }
+
+ selectSourceItem = item => {
+ this.props.selectSource(item.source, item.sourceActor);
+ };
+
+ onFocus = item => {
+ this.props.focusItem(item);
+ };
+
+ onActivate = item => {
+ if (item.type == "source") {
+ this.selectSourceItem(item);
+ }
+ };
+
+ onExpand = (item, shouldIncludeChildren) => {
+ this.setExpanded(item, true, shouldIncludeChildren);
+ };
+
+ onCollapse = (item, shouldIncludeChildren) => {
+ this.setExpanded(item, false, shouldIncludeChildren);
+ };
+
+ setExpanded = (item, isExpanded, shouldIncludeChildren) => {
+ // Note that setExpandedState relies on us to clone this Set
+ // which is going to be store as-is in the reducer.
+ const expanded = new Set(this.props.expanded);
+
+ let changed = false;
+ const expandItem = i => {
+ const key = this.getKey(i);
+ if (isExpanded) {
+ changed |= !expanded.has(key);
+ expanded.add(key);
+ } else {
+ changed |= expanded.has(key);
+ expanded.delete(key);
+ }
+ };
+ expandItem(item);
+
+ if (shouldIncludeChildren) {
+ let parents = [item];
+ while (parents.length) {
+ const children = [];
+ for (const parent of parents) {
+ for (const child of this.getChildren(parent)) {
+ expandItem(child);
+ children.push(child);
+ }
+ }
+ parents = children;
+ }
+ }
+ if (changed) {
+ this.props.setExpandedState(expanded);
+ }
+ };
+
+ isEmpty() {
+ return !this.getRoots().length;
+ }
+
+ renderEmptyElement(message) {
+ return div(
+ {
+ key: "empty",
+ className: "no-sources-message",
+ },
+ message
+ );
+ }
+
+ getRoots = () => {
+ return this.props.rootItems;
+ };
+
+ getKey = item => {
+ // As this is used as React key in Tree component,
+ // we need to update the key when switching to a new project root
+ // otherwise these items won't be updated and will have a buggy padding start.
+ const { projectRoot } = this.props;
+ if (projectRoot) {
+ return projectRoot + item.uniquePath;
+ }
+ return item.uniquePath;
+ };
+
+ getChildren = item => {
+ // This is the precial magic that coalesce "empty" folders,
+ // i.e folders which have only one sub-folder as children.
+ function skipEmptyDirectories(directory) {
+ if (directory.type != "directory") {
+ return directory;
+ }
+ if (
+ directory.children.length == 1 &&
+ directory.children[0].type == "directory"
+ ) {
+ return skipEmptyDirectories(directory.children[0]);
+ }
+ return directory;
+ }
+ if (item.type == "thread") {
+ return item.children;
+ } else if (item.type == "group" || item.type == "directory") {
+ return item.children.map(skipEmptyDirectories);
+ }
+ return [];
+ };
+
+ getParent = item => {
+ if (item.type == "thread") {
+ return null;
+ }
+ const { rootItems } = this.props;
+ // This is the second magic which skip empty folders
+ // (See getChildren comment)
+ function skipEmptyDirectories(directory) {
+ if (
+ directory.type == "group" ||
+ directory.type == "thread" ||
+ rootItems.includes(directory)
+ ) {
+ return directory;
+ }
+ if (
+ directory.children.length == 1 &&
+ directory.children[0].type == "directory"
+ ) {
+ return skipEmptyDirectories(directory.parent);
+ }
+ return directory;
+ }
+ return skipEmptyDirectories(item.parent);
+ };
+
+ renderProjectRootHeader() {
+ const { projectRootName } = this.props;
+
+ if (!projectRootName) {
+ return null;
+ }
+ return div(
+ {
+ key: "root",
+ className: "sources-clear-root-container",
+ },
+ button(
+ {
+ className: "sources-clear-root",
+ onClick: () => this.props.clearProjectDirectoryRoot(),
+ title: L10N.getStr("removeDirectoryRoot.label"),
+ },
+ React.createElement(AccessibleImage, {
+ className: "home",
+ }),
+ React.createElement(AccessibleImage, {
+ className: "breadcrumb",
+ }),
+ span(
+ {
+ className: "sources-clear-root-label",
+ },
+ projectRootName
+ )
+ )
+ );
+ }
+
+ renderItem = (item, depth, focused, _, expanded) => {
+ const { mainThreadHost } = this.props;
+ return React.createElement(SourcesTreeItem, {
+ item,
+ depth,
+ focused,
+ autoExpand: shouldAutoExpand(item, mainThreadHost),
+ expanded,
+ focusItem: this.onFocus,
+ selectSourceItem: this.selectSourceItem,
+ setExpanded: this.setExpanded,
+ getParent: this.getParent,
+ });
+ };
+
+ renderTree() {
+ const { expanded, focused } = this.props;
+
+ const treeProps = {
+ autoExpandAll: false,
+ autoExpandDepth: 1,
+ expanded,
+ focused,
+ getChildren: this.getChildren,
+ getParent: this.getParent,
+ getKey: this.getKey,
+ getRoots: this.getRoots,
+ onCollapse: this.onCollapse,
+ onExpand: this.onExpand,
+ onFocus: this.onFocus,
+ isExpanded: item => {
+ return this.props.expanded.has(this.getKey(item));
+ },
+ onActivate: this.onActivate,
+ renderItem: this.renderItem,
+ preventBlur: true,
+ };
+ return React.createElement(Tree, treeProps);
+ }
+
+ renderPane(child) {
+ const { projectRoot } = this.props;
+ return div(
+ {
+ key: "pane",
+ className: classnames("sources-pane", {
+ "sources-list-custom-root": !!projectRoot,
+ }),
+ },
+ child
+ );
+ }
+
+ renderFooter() {
+ if (this.props.hideIgnoredSources) {
+ return footer(
+ {
+ className: "source-list-footer",
+ },
+ L10N.getStr("ignoredSourcesHidden"),
+ button(
+ {
+ className: "devtools-togglebutton",
+ onClick: () => this.props.setHideOrShowIgnoredSources(false),
+ title: L10N.getStr("showIgnoredSources.tooltip.label"),
+ },
+ L10N.getStr("showIgnoredSources")
+ )
+ );
+ }
+ return null;
+ }
+
+ render() {
+ const { projectRoot } = this.props;
+ return div(
+ {
+ key: "pane",
+ className: classnames("sources-list", {
+ "sources-list-custom-root": !!projectRoot,
+ }),
+ },
+ this.isEmpty()
+ ? this.renderEmptyElement(L10N.getStr("noSourcesText"))
+ : React.createElement(
+ Fragment,
+ null,
+ this.renderProjectRootHeader(),
+ this.renderTree(),
+ this.renderFooter()
+ )
+ );
+ }
+}
+
+const mapStateToProps = state => {
+ return {
+ mainThreadHost: getMainThreadHost(state),
+ expanded: getExpandedState(state),
+ focused: getFocusedSourceItem(state),
+ projectRoot: getProjectDirectoryRoot(state),
+ rootItems: getSourcesTreeSources(state),
+ projectRootName: getProjectDirectoryRootName(state),
+ hideIgnoredSources: getHideIgnoredSources(state),
+ };
+};
+
+export default connect(mapStateToProps, {
+ selectSource: actions.selectSource,
+ setExpandedState: actions.setExpandedState,
+ focusItem: actions.focusItem,
+ clearProjectDirectoryRoot: actions.clearProjectDirectoryRoot,
+ setHideOrShowIgnoredSources: actions.setHideOrShowIgnoredSources,
+})(SourcesTree);
diff --git a/devtools/client/debugger/src/components/PrimaryPanes/SourcesTreeItem.js b/devtools/client/debugger/src/components/PrimaryPanes/SourcesTreeItem.js
new file mode 100644
index 0000000000..fd5ceca46d
--- /dev/null
+++ b/devtools/client/debugger/src/components/PrimaryPanes/SourcesTreeItem.js
@@ -0,0 +1,249 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React, { Component } from "devtools/client/shared/vendor/react";
+import { div, span } from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+import { connect } from "devtools/client/shared/vendor/react-redux";
+
+import SourceIcon from "../shared/SourceIcon";
+import AccessibleImage from "../shared/AccessibleImage";
+
+import {
+ getGeneratedSourceByURL,
+ isSourceOverridden,
+ getHideIgnoredSources,
+} from "../../selectors/index";
+import actions from "../../actions/index";
+
+import { sourceTypes } from "../../utils/source";
+import { createLocation } from "../../utils/location";
+import { safeDecodeItemName } from "../../utils/sources-tree/utils";
+
+const classnames = require("resource://devtools/client/shared/classnames.js");
+
+class SourceTreeItem extends Component {
+ static get propTypes() {
+ return {
+ autoExpand: PropTypes.bool.isRequired,
+ depth: PropTypes.bool.isRequired,
+ expanded: PropTypes.bool.isRequired,
+ focusItem: PropTypes.func.isRequired,
+ focused: PropTypes.bool.isRequired,
+ hasMatchingGeneratedSource: PropTypes.bool.isRequired,
+ item: PropTypes.object.isRequired,
+ selectSourceItem: PropTypes.func.isRequired,
+ setExpanded: PropTypes.func.isRequired,
+ getParent: PropTypes.func.isRequired,
+ isOverridden: PropTypes.bool,
+ hideIgnoredSources: PropTypes.bool,
+ };
+ }
+
+ componentDidMount() {
+ const { autoExpand, item } = this.props;
+ if (autoExpand) {
+ this.props.setExpanded(item, true, false);
+ }
+ }
+
+ onClick = e => {
+ const { item, focusItem, selectSourceItem } = this.props;
+
+ focusItem(item);
+ if (item.type == "source") {
+ selectSourceItem(item);
+ }
+ };
+
+ onContextMenu = event => {
+ event.stopPropagation();
+ event.preventDefault();
+ this.props.showSourceTreeItemContextMenu(
+ event,
+ this.props.item,
+ this.props.depth,
+ this.props.setExpanded,
+ this.renderItemName()
+ );
+ };
+
+ renderItemArrow() {
+ const { item, expanded } = this.props;
+ return item.type != "source"
+ ? React.createElement(AccessibleImage, {
+ className: classnames("arrow", {
+ expanded,
+ }),
+ })
+ : span({
+ className: "img no-arrow",
+ });
+ }
+
+ renderIcon(item) {
+ if (item.type == "thread") {
+ const icon = item.thread.targetType.includes("worker")
+ ? "worker"
+ : "window";
+ return React.createElement(AccessibleImage, {
+ className: classnames(icon),
+ });
+ }
+ if (item.type == "group") {
+ if (item.groupName === "Webpack") {
+ return React.createElement(AccessibleImage, {
+ className: "webpack",
+ });
+ } else if (item.groupName === "Angular") {
+ return React.createElement(AccessibleImage, {
+ className: "angular",
+ });
+ }
+ // Check if the group relates to an extension.
+ // This happens when a webextension injects a content script.
+ if (item.isForExtensionSource) {
+ return React.createElement(AccessibleImage, {
+ className: "extension",
+ });
+ }
+ return React.createElement(AccessibleImage, {
+ className: "globe-small",
+ });
+ }
+ if (item.type == "directory") {
+ return React.createElement(AccessibleImage, {
+ className: "folder",
+ });
+ }
+ if (item.type == "source") {
+ const { source, sourceActor } = item;
+ return React.createElement(SourceIcon, {
+ location: createLocation({
+ source,
+ sourceActor,
+ }),
+ modifier: icon => {
+ // In the SourceTree, extension files should use the file-extension based icon,
+ // whereas we use the extension icon in other Components (eg. source tabs and breakpoints pane).
+ if (icon === "extension") {
+ return sourceTypes[source.displayURL.fileExtension] || "javascript";
+ }
+ return icon + (this.props.isOverridden ? " override" : "");
+ },
+ });
+ }
+ return null;
+ }
+ renderItemName() {
+ const { item } = this.props;
+
+ if (item.type == "thread") {
+ const { thread } = item;
+ return (
+ thread.name +
+ (thread.serviceWorkerStatus ? ` (${thread.serviceWorkerStatus})` : "")
+ );
+ }
+ if (item.type == "group") {
+ return safeDecodeItemName(item.groupName);
+ }
+ if (item.type == "directory") {
+ const parentItem = this.props.getParent(item);
+ return safeDecodeItemName(
+ item.path.replace(parentItem.path, "").replace(/^\//, "")
+ );
+ }
+ if (item.type == "source") {
+ const { displayURL } = item.source;
+ const name =
+ displayURL.filename + (displayURL.search ? displayURL.search : "");
+ return safeDecodeItemName(name);
+ }
+
+ return null;
+ }
+
+ renderItemTooltip() {
+ const { item } = this.props;
+
+ if (item.type == "thread") {
+ return item.thread.name;
+ }
+ if (item.type == "group") {
+ return item.groupName;
+ }
+ if (item.type == "directory") {
+ return item.path;
+ }
+ if (item.type == "source") {
+ return item.source.url;
+ }
+
+ return null;
+ }
+
+ render() {
+ const { item, focused, hasMatchingGeneratedSource, hideIgnoredSources } =
+ this.props;
+
+ if (hideIgnoredSources && item.isBlackBoxed) {
+ return null;
+ }
+ const suffix = hasMatchingGeneratedSource
+ ? span(
+ {
+ className: "suffix",
+ },
+ L10N.getStr("sourceFooter.mappedSuffix")
+ )
+ : null;
+ return div(
+ {
+ className: classnames("node", {
+ focused,
+ blackboxed: item.type == "source" && item.isBlackBoxed,
+ }),
+ key: item.path,
+ onClick: this.onClick,
+ onContextMenu: this.onContextMenu,
+ title: this.renderItemTooltip(),
+ },
+ this.renderItemArrow(),
+ this.renderIcon(item),
+ span(
+ {
+ className: "label",
+ },
+ this.renderItemName(),
+ suffix
+ )
+ );
+ }
+}
+
+function getHasMatchingGeneratedSource(state, source) {
+ if (!source || !source.isOriginal) {
+ return false;
+ }
+
+ return !!getGeneratedSourceByURL(state, source.url);
+}
+
+const mapStateToProps = (state, props) => {
+ const { item } = props;
+ if (item.type == "source") {
+ const { source } = item;
+ return {
+ hasMatchingGeneratedSource: getHasMatchingGeneratedSource(state, source),
+ isOverridden: isSourceOverridden(state, source),
+ hideIgnoredSources: getHideIgnoredSources(state),
+ };
+ }
+ return {};
+};
+
+export default connect(mapStateToProps, {
+ showSourceTreeItemContextMenu: actions.showSourceTreeItemContextMenu,
+})(SourceTreeItem);
diff --git a/devtools/client/debugger/src/components/PrimaryPanes/index.js b/devtools/client/debugger/src/components/PrimaryPanes/index.js
new file mode 100644
index 0000000000..a8f6bc9a33
--- /dev/null
+++ b/devtools/client/debugger/src/components/PrimaryPanes/index.js
@@ -0,0 +1,133 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React, { Component } from "devtools/client/shared/vendor/react";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+
+import actions from "../../actions/index";
+import { getSelectedPrimaryPaneTab } from "../../selectors/index";
+import { prefs } from "../../utils/prefs";
+import { connect } from "devtools/client/shared/vendor/react-redux";
+import { primaryPaneTabs } from "../../constants";
+
+import Outline from "./Outline";
+import SourcesTree from "./SourcesTree";
+import ProjectSearch from "./ProjectSearch";
+
+const {
+ TabPanel,
+ Tabs,
+} = require("resource://devtools/client/shared/components/tabs/Tabs.js");
+
+const tabs = [
+ primaryPaneTabs.SOURCES,
+ primaryPaneTabs.OUTLINE,
+ primaryPaneTabs.PROJECT_SEARCH,
+];
+
+class PrimaryPanes extends Component {
+ constructor(props) {
+ super(props);
+
+ this.state = {
+ alphabetizeOutline: prefs.alphabetizeOutline,
+ };
+ }
+
+ static get propTypes() {
+ return {
+ projectRootName: PropTypes.string.isRequired,
+ selectedTab: PropTypes.oneOf(tabs).isRequired,
+ setPrimaryPaneTab: PropTypes.func.isRequired,
+ setActiveSearch: PropTypes.func.isRequired,
+ closeActiveSearch: PropTypes.func.isRequired,
+ };
+ }
+
+ onAlphabetizeClick = () => {
+ const alphabetizeOutline = !prefs.alphabetizeOutline;
+ prefs.alphabetizeOutline = alphabetizeOutline;
+ this.setState({ alphabetizeOutline });
+ };
+
+ onActivateTab = index => {
+ const tab = tabs.at(index);
+ this.props.setPrimaryPaneTab(tab);
+ if (tab == primaryPaneTabs.PROJECT_SEARCH) {
+ this.props.setActiveSearch(tab);
+ } else {
+ this.props.closeActiveSearch();
+ }
+ };
+
+ render() {
+ const { selectedTab } = this.props;
+ return React.createElement(
+ "aside",
+ {
+ className: "tab-panel sources-panel",
+ },
+ React.createElement(
+ Tabs,
+ {
+ activeTab: tabs.indexOf(selectedTab),
+ onAfterChange: this.onActivateTab,
+ },
+ React.createElement(
+ TabPanel,
+ {
+ id: "sources-tab",
+ key: `sources-tab${
+ selectedTab === primaryPaneTabs.SOURCES ? "-selected" : ""
+ }`,
+ className: "tab sources-tab",
+ title: L10N.getStr("sources.header"),
+ },
+ React.createElement(SourcesTree, null)
+ ),
+ React.createElement(
+ TabPanel,
+ {
+ id: "outline-tab",
+ key: `outline-tab${
+ selectedTab === primaryPaneTabs.OUTLINE ? "-selected" : ""
+ }`,
+ className: "tab outline-tab",
+ title: L10N.getStr("outline.header"),
+ },
+ React.createElement(Outline, {
+ alphabetizeOutline: this.state.alphabetizeOutline,
+ onAlphabetizeClick: this.onAlphabetizeClick,
+ })
+ ),
+ React.createElement(
+ TabPanel,
+ {
+ id: "search-tab",
+ key: `search-tab${
+ selectedTab === primaryPaneTabs.PROJECT_SEARCH ? "-selected" : ""
+ }`,
+ className: "tab search-tab",
+ title: L10N.getStr("search.header"),
+ },
+ React.createElement(ProjectSearch, null)
+ )
+ )
+ );
+ }
+}
+
+const mapStateToProps = state => {
+ return {
+ selectedTab: getSelectedPrimaryPaneTab(state),
+ };
+};
+
+const connector = connect(mapStateToProps, {
+ setPrimaryPaneTab: actions.setPrimaryPaneTab,
+ setActiveSearch: actions.setActiveSearch,
+ closeActiveSearch: actions.closeActiveSearch,
+});
+
+export default connector(PrimaryPanes);
diff --git a/devtools/client/debugger/src/components/PrimaryPanes/moz.build b/devtools/client/debugger/src/components/PrimaryPanes/moz.build
new file mode 100644
index 0000000000..fc73b7bee7
--- /dev/null
+++ b/devtools/client/debugger/src/components/PrimaryPanes/moz.build
@@ -0,0 +1,15 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DIRS += []
+
+CompiledModules(
+ "index.js",
+ "Outline.js",
+ "OutlineFilter.js",
+ "ProjectSearch.js",
+ "SourcesTree.js",
+ "SourcesTreeItem.js",
+)
diff --git a/devtools/client/debugger/src/components/QuickOpenModal.css b/devtools/client/debugger/src/components/QuickOpenModal.css
new file mode 100644
index 0000000000..5a2627b99f
--- /dev/null
+++ b/devtools/client/debugger/src/components/QuickOpenModal.css
@@ -0,0 +1,28 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+.result-item .title .highlight {
+ font-weight: bold;
+ background-color: transparent;
+}
+
+.selected .highlight {
+ color: white;
+}
+
+.result-item .subtitle .highlight {
+ color: var(--grey-90);
+ font-weight: 500;
+ background-color: transparent;
+}
+
+.theme-dark .result-item .title .highlight,
+.theme-dark .result-item .subtitle .highlight {
+ color: white;
+}
+
+.loading-indicator {
+ padding: 5px 0 5px 0;
+ text-align: center;
+}
diff --git a/devtools/client/debugger/src/components/QuickOpenModal.js b/devtools/client/debugger/src/components/QuickOpenModal.js
new file mode 100644
index 0000000000..aa3d4f73b6
--- /dev/null
+++ b/devtools/client/debugger/src/components/QuickOpenModal.js
@@ -0,0 +1,508 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React, { Component } from "devtools/client/shared/vendor/react";
+import { div } from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+import { connect } from "devtools/client/shared/vendor/react-redux";
+import { basename } from "../utils/path";
+import { createLocation } from "../utils/location";
+
+const fuzzyAldrin = require("resource://devtools/client/shared/vendor/fuzzaldrin-plus.js");
+const { throttle } = require("resource://devtools/shared/throttle.js");
+
+import actions from "../actions/index";
+import {
+ getDisplayedSourcesList,
+ getQuickOpenQuery,
+ getQuickOpenType,
+ getSelectedLocation,
+ getSettledSourceTextContent,
+ getSourceTabs,
+ getBlackBoxRanges,
+ getProjectDirectoryRoot,
+} from "../selectors/index";
+import { memoizeLast } from "../utils/memoizeLast";
+import { searchKeys } from "../constants";
+import {
+ formatSymbol,
+ parseLineColumn,
+ formatShortcutResults,
+ formatSourceForList,
+} from "../utils/quick-open";
+import Modal from "./shared/Modal";
+import SearchInput from "./shared/SearchInput";
+import ResultList from "./shared/ResultList";
+
+const maxResults = 100;
+
+const SIZE_BIG = { size: "big" };
+const SIZE_DEFAULT = {};
+
+function filter(values, query, key = "value") {
+ const preparedQuery = fuzzyAldrin.prepareQuery(query);
+
+ return fuzzyAldrin.filter(values, query, {
+ key,
+ maxResults,
+ preparedQuery,
+ });
+}
+
+export class QuickOpenModal extends Component {
+ // Put it on the class so it can be retrieved in tests
+ static UPDATE_RESULTS_THROTTLE = 100;
+
+ constructor(props) {
+ super(props);
+ this.state = { results: null, selectedIndex: 0 };
+ }
+
+ static get propTypes() {
+ return {
+ closeQuickOpen: PropTypes.func.isRequired,
+ displayedSources: PropTypes.array.isRequired,
+ blackBoxRanges: PropTypes.object.isRequired,
+ highlightLineRange: PropTypes.func.isRequired,
+ clearHighlightLineRange: PropTypes.func.isRequired,
+ query: PropTypes.string.isRequired,
+ searchType: PropTypes.oneOf([
+ "functions",
+ "goto",
+ "gotoSource",
+ "other",
+ "shortcuts",
+ "sources",
+ "variables",
+ ]).isRequired,
+ selectSpecificLocation: PropTypes.func.isRequired,
+ selectedContentLoaded: PropTypes.bool,
+ selectedLocation: PropTypes.object,
+ setQuickOpenQuery: PropTypes.func.isRequired,
+ openedTabUrls: PropTypes.array.isRequired,
+ toggleShortcutsModal: PropTypes.func.isRequired,
+ projectDirectoryRoot: PropTypes.string,
+ getFunctionSymbols: PropTypes.func.isRequired,
+ };
+ }
+
+ setResults(results) {
+ if (results) {
+ results = results.slice(0, maxResults);
+ }
+ this.setState({ results });
+ }
+
+ componentDidMount() {
+ const { query, shortcutsModalEnabled, toggleShortcutsModal } = this.props;
+
+ this.updateResults(query);
+
+ if (shortcutsModalEnabled) {
+ toggleShortcutsModal();
+ }
+ }
+
+ componentDidUpdate(prevProps) {
+ const queryChanged = prevProps.query !== this.props.query;
+
+ if (queryChanged) {
+ this.updateResults(this.props.query);
+ }
+ }
+
+ closeModal = () => {
+ this.props.closeQuickOpen();
+ };
+
+ dropGoto = query => {
+ const index = query.indexOf(":");
+ return index !== -1 ? query.slice(0, index) : query;
+ };
+
+ formatSources = memoizeLast(
+ (displayedSources, openedTabUrls, blackBoxRanges, projectDirectoryRoot) => {
+ // Note that we should format all displayed sources,
+ // the actual filtering will only be done late from `searchSources()`
+ return displayedSources.map(source => {
+ const isBlackBoxed = !!blackBoxRanges[source.url];
+ const hasTabOpened = openedTabUrls.includes(source.url);
+ return formatSourceForList(
+ source,
+ hasTabOpened,
+ isBlackBoxed,
+ projectDirectoryRoot
+ );
+ });
+ }
+ );
+
+ searchSources = query => {
+ const {
+ displayedSources,
+ openedTabUrls,
+ blackBoxRanges,
+ projectDirectoryRoot,
+ } = this.props;
+
+ const sources = this.formatSources(
+ displayedSources,
+ openedTabUrls,
+ blackBoxRanges,
+ projectDirectoryRoot
+ );
+ const results =
+ query == "" ? sources : filter(sources, this.dropGoto(query));
+ return this.setResults(results);
+ };
+
+ searchSymbols = async query => {
+ const { getFunctionSymbols, selectedLocation } = this.props;
+ if (!selectedLocation) {
+ return this.setResults([]);
+ }
+ let results = await getFunctionSymbols(selectedLocation, maxResults);
+
+ if (query === "@" || query === "#") {
+ results = results.map(formatSymbol);
+ return this.setResults(results);
+ }
+ results = filter(results, query.slice(1), "name");
+ results = results.map(formatSymbol);
+ return this.setResults(results);
+ };
+
+ searchShortcuts = query => {
+ const results = formatShortcutResults();
+ if (query == "?") {
+ this.setResults(results);
+ } else {
+ this.setResults(filter(results, query.slice(1)));
+ }
+ };
+
+ /**
+ * This method is called when we just opened the modal and the query input is empty
+ */
+ showTopSources = () => {
+ const { openedTabUrls, blackBoxRanges, projectDirectoryRoot } = this.props;
+ let { displayedSources } = this.props;
+
+ // If there is some tabs opened, only show tab's sources.
+ // Otherwise, we display all visible sources (per SourceTree definition),
+ // setResults will restrict the number of results to a maximum limit.
+ if (openedTabUrls.length) {
+ displayedSources = displayedSources.filter(
+ source => !!source.url && openedTabUrls.includes(source.url)
+ );
+ }
+
+ this.setResults(
+ this.formatSources(
+ displayedSources,
+ openedTabUrls,
+ blackBoxRanges,
+ projectDirectoryRoot
+ )
+ );
+ };
+
+ updateResults = throttle(query => {
+ if (this.isGotoQuery()) {
+ return;
+ }
+
+ if (query == "" && !this.isShortcutQuery()) {
+ this.showTopSources();
+ return;
+ }
+
+ if (this.isSymbolSearch()) {
+ this.searchSymbols(query);
+ return;
+ }
+
+ if (this.isShortcutQuery()) {
+ this.searchShortcuts(query);
+ return;
+ }
+
+ this.searchSources(query);
+ }, QuickOpenModal.UPDATE_RESULTS_THROTTLE);
+
+ setModifier = item => {
+ if (["@", "#", ":"].includes(item.id)) {
+ this.props.setQuickOpenQuery(item.id);
+ }
+ };
+
+ selectResultItem = (e, item) => {
+ if (item == null) {
+ return;
+ }
+
+ if (this.isShortcutQuery()) {
+ this.setModifier(item);
+ return;
+ }
+
+ if (this.isGotoSourceQuery()) {
+ const location = parseLineColumn(this.props.query);
+ this.gotoLocation({ ...location, source: item.source });
+ return;
+ }
+
+ if (this.isSymbolSearch()) {
+ this.gotoLocation({
+ line:
+ item.location && item.location.start ? item.location.start.line : 0,
+ });
+ return;
+ }
+
+ this.gotoLocation({ source: item.source, line: 0 });
+ };
+
+ onSelectResultItem = item => {
+ const { selectedLocation, highlightLineRange, clearHighlightLineRange } =
+ this.props;
+ if (
+ selectedLocation == null ||
+ !this.isSymbolSearch() ||
+ !this.isFunctionQuery()
+ ) {
+ return;
+ }
+
+ if (item.location) {
+ highlightLineRange({
+ start: item.location.start.line,
+ end: item.location.end.line,
+ sourceId: selectedLocation.source.id,
+ });
+ } else {
+ clearHighlightLineRange();
+ }
+ };
+
+ traverseResults = e => {
+ const direction = e.key === "ArrowUp" ? -1 : 1;
+ const { selectedIndex, results } = this.state;
+ const resultCount = this.getResultCount();
+ const index = selectedIndex + direction;
+ const nextIndex = (index + resultCount) % resultCount || 0;
+
+ this.setState({ selectedIndex: nextIndex });
+
+ if (results != null) {
+ this.onSelectResultItem(results[nextIndex]);
+ }
+ };
+
+ gotoLocation = location => {
+ const { selectSpecificLocation, selectedLocation } = this.props;
+
+ if (location != null) {
+ selectSpecificLocation(
+ createLocation({
+ source: location.source || selectedLocation?.source,
+ line: location.line,
+ column: location.column,
+ })
+ );
+ this.closeModal();
+ }
+ };
+
+ onChange = e => {
+ const { selectedLocation, selectedContentLoaded, setQuickOpenQuery } =
+ this.props;
+ setQuickOpenQuery(e.target.value);
+ const noSource = !selectedLocation || !selectedContentLoaded;
+ if ((noSource && this.isSymbolSearch()) || this.isGotoQuery()) {
+ return;
+ }
+
+ // Wait for the next tick so that reducer updates are complete.
+ const targetValue = e.target.value;
+ setTimeout(() => this.updateResults(targetValue), 0);
+ };
+
+ onKeyDown = e => {
+ const { query } = this.props;
+ const { results, selectedIndex } = this.state;
+ const isGoToQuery = this.isGotoQuery();
+
+ if (!results && !isGoToQuery) {
+ return;
+ }
+
+ if (e.key === "Enter") {
+ if (isGoToQuery) {
+ const location = parseLineColumn(query);
+ this.gotoLocation(location);
+ return;
+ }
+
+ if (results) {
+ this.selectResultItem(e, results[selectedIndex]);
+ return;
+ }
+ }
+
+ if (e.key === "Tab") {
+ this.closeModal();
+ return;
+ }
+
+ if (["ArrowUp", "ArrowDown"].includes(e.key)) {
+ e.preventDefault();
+ this.traverseResults(e);
+ }
+ };
+
+ getResultCount = () => {
+ const { results } = this.state;
+ return results && results.length ? results.length : 0;
+ };
+
+ // Query helpers
+ isFunctionQuery = () => this.props.searchType === "functions";
+ isSymbolSearch = () => this.isFunctionQuery();
+ isGotoQuery = () => this.props.searchType === "goto";
+ isGotoSourceQuery = () => this.props.searchType === "gotoSource";
+ isShortcutQuery = () => this.props.searchType === "shortcuts";
+ isSourcesQuery = () => this.props.searchType === "sources";
+ isSourceSearch = () => this.isSourcesQuery() || this.isGotoSourceQuery();
+
+ /* eslint-disable react/no-danger */
+ renderHighlight(candidateString, query, name) {
+ const options = {
+ wrap: {
+ tagOpen: '<mark class="highlight">',
+ tagClose: "</mark>",
+ },
+ };
+ const html = fuzzyAldrin.wrap(candidateString, query, options);
+ return div({
+ dangerouslySetInnerHTML: {
+ __html: html,
+ },
+ });
+ }
+
+ highlightMatching = (query, results) => {
+ let newQuery = query;
+ if (newQuery === "") {
+ return results;
+ }
+ newQuery = query.replace(/[@:#?]/gi, " ");
+
+ return results.map(result => {
+ if (typeof result.title == "string") {
+ return {
+ ...result,
+ title: this.renderHighlight(
+ result.title,
+ basename(newQuery),
+ "title"
+ ),
+ };
+ }
+ return result;
+ });
+ };
+
+ shouldShowErrorEmoji() {
+ const { query } = this.props;
+ if (this.isGotoQuery()) {
+ return !/^:\d*$/.test(query);
+ }
+ return !!query && !this.getResultCount();
+ }
+
+ getSummaryMessage() {
+ let summaryMsg = "";
+ if (this.isGotoQuery()) {
+ summaryMsg = L10N.getStr("shortcuts.gotoLine");
+ } else if (this.isFunctionQuery() && !this.state.results) {
+ summaryMsg = L10N.getStr("loadingText");
+ }
+ return summaryMsg;
+ }
+
+ render() {
+ const { query } = this.props;
+ const { selectedIndex, results } = this.state;
+
+ const items = this.highlightMatching(query, results || []);
+ const expanded = !!items && !!items.length;
+ return React.createElement(
+ Modal,
+ {
+ handleClose: this.closeModal,
+ },
+ React.createElement(SearchInput, {
+ query: query,
+ hasPrefix: true,
+ count: this.getResultCount(),
+ placeholder: L10N.getStr("sourceSearch.search2"),
+ summaryMsg: this.getSummaryMessage(),
+ showErrorEmoji: this.shouldShowErrorEmoji(),
+ isLoading: false,
+ onChange: this.onChange,
+ onKeyDown: this.onKeyDown,
+ handleClose: this.closeModal,
+ expanded: expanded,
+ showClose: false,
+ searchKey: searchKeys.QUICKOPEN_SEARCH,
+ showExcludePatterns: false,
+ showSearchModifiers: false,
+ selectedItemId:
+ expanded && items[selectedIndex] ? items[selectedIndex].id : "",
+ ...(this.isSourceSearch() ? SIZE_BIG : SIZE_DEFAULT),
+ }),
+ results &&
+ React.createElement(ResultList, {
+ key: "results",
+ items: items,
+ selected: selectedIndex,
+ selectItem: this.selectResultItem,
+ ref: "resultList",
+ expanded: expanded,
+ ...(this.isSourceSearch() ? SIZE_BIG : SIZE_DEFAULT),
+ })
+ );
+ }
+}
+
+/* istanbul ignore next: ignoring testing of redux connection stuff */
+function mapStateToProps(state) {
+ const selectedLocation = getSelectedLocation(state);
+ const displayedSources = getDisplayedSourcesList(state);
+ const tabs = getSourceTabs(state);
+ const openedTabUrls = [...new Set(tabs.map(tab => tab.url))];
+
+ return {
+ displayedSources,
+ blackBoxRanges: getBlackBoxRanges(state),
+ projectDirectoryRoot: getProjectDirectoryRoot(state),
+ selectedLocation,
+ selectedContentLoaded: selectedLocation
+ ? !!getSettledSourceTextContent(state, selectedLocation)
+ : undefined,
+ query: getQuickOpenQuery(state),
+ searchType: getQuickOpenType(state),
+ openedTabUrls,
+ };
+}
+
+export default connect(mapStateToProps, {
+ selectSpecificLocation: actions.selectSpecificLocation,
+ setQuickOpenQuery: actions.setQuickOpenQuery,
+ highlightLineRange: actions.highlightLineRange,
+ clearHighlightLineRange: actions.clearHighlightLineRange,
+ closeQuickOpen: actions.closeQuickOpen,
+ getFunctionSymbols: actions.getFunctionSymbols,
+})(QuickOpenModal);
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/Breakpoint.js b/devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/Breakpoint.js
new file mode 100644
index 0000000000..c55088e411
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/Breakpoint.js
@@ -0,0 +1,235 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React, { PureComponent } from "devtools/client/shared/vendor/react";
+import {
+ div,
+ input,
+ span,
+} from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+import { connect } from "devtools/client/shared/vendor/react-redux";
+import { createSelector } from "devtools/client/shared/vendor/reselect";
+import actions from "../../../actions/index";
+
+import { CloseButton } from "../../shared/Button/index";
+
+import {
+ getSelectedText,
+ makeBreakpointId,
+} from "../../../utils/breakpoint/index";
+import { getSelectedLocation } from "../../../utils/selected-location";
+import { isLineBlackboxed } from "../../../utils/source";
+
+import {
+ getSelectedFrame,
+ getSelectedSource,
+ getCurrentThread,
+ isSourceMapIgnoreListEnabled,
+ isSourceOnSourceMapIgnoreList,
+ getBlackBoxRanges,
+} from "../../../selectors/index";
+
+const classnames = require("resource://devtools/client/shared/classnames.js");
+
+class Breakpoint extends PureComponent {
+ static get propTypes() {
+ return {
+ breakpoint: PropTypes.object.isRequired,
+ disableBreakpoint: PropTypes.func.isRequired,
+ editor: PropTypes.object.isRequired,
+ enableBreakpoint: PropTypes.func.isRequired,
+ frame: PropTypes.object,
+ openConditionalPanel: PropTypes.func.isRequired,
+ removeBreakpoint: PropTypes.func.isRequired,
+ selectSpecificLocation: PropTypes.func.isRequired,
+ selectedSource: PropTypes.object,
+ source: PropTypes.object.isRequired,
+ blackboxedRangesForSource: PropTypes.array.isRequired,
+ checkSourceOnIgnoreList: PropTypes.func.isRequired,
+ isBreakpointLineBlackboxed: PropTypes.bool,
+ showBreakpointContextMenu: PropTypes.func.isRequired,
+ };
+ }
+
+ onContextMenu = event => {
+ event.preventDefault();
+
+ this.props.showBreakpointContextMenu(
+ event,
+ this.props.breakpoint,
+ this.props.source
+ );
+ };
+
+ get selectedLocation() {
+ const { breakpoint, selectedSource } = this.props;
+ return getSelectedLocation(breakpoint, selectedSource);
+ }
+
+ stopClicks = event => event.stopPropagation();
+
+ onDoubleClick = () => {
+ const { breakpoint, openConditionalPanel } = this.props;
+ if (breakpoint.options.condition) {
+ openConditionalPanel(this.selectedLocation);
+ } else if (breakpoint.options.logValue) {
+ openConditionalPanel(this.selectedLocation, true);
+ }
+ };
+
+ selectBreakpoint = event => {
+ event.preventDefault();
+ const { selectSpecificLocation } = this.props;
+ selectSpecificLocation(this.selectedLocation);
+ };
+
+ removeBreakpoint = event => {
+ const { removeBreakpoint, breakpoint } = this.props;
+ event.stopPropagation();
+ removeBreakpoint(breakpoint);
+ };
+
+ handleBreakpointCheckbox = () => {
+ const { breakpoint, enableBreakpoint, disableBreakpoint } = this.props;
+ if (breakpoint.disabled) {
+ enableBreakpoint(breakpoint);
+ } else {
+ disableBreakpoint(breakpoint);
+ }
+ };
+
+ isCurrentlyPausedAtBreakpoint() {
+ const { frame } = this.props;
+ if (!frame) {
+ return false;
+ }
+
+ const bpId = makeBreakpointId(this.selectedLocation);
+ const frameId = makeBreakpointId(frame.selectedLocation);
+ return bpId == frameId;
+ }
+
+ getBreakpointLocation() {
+ const { source } = this.props;
+ const { column, line } = this.selectedLocation;
+
+ const isWasm = source?.isWasm;
+ // column is 0-based everywhere, but we want to display 1-based to the user.
+ const columnVal = column ? `:${column + 1}` : "";
+ const bpLocation = isWasm
+ ? `0x${line.toString(16).toUpperCase()}`
+ : `${line}${columnVal}`;
+
+ return bpLocation;
+ }
+
+ getBreakpointText() {
+ const { breakpoint, selectedSource } = this.props;
+ const { condition, logValue } = breakpoint.options;
+ return logValue || condition || getSelectedText(breakpoint, selectedSource);
+ }
+
+ highlightText(text = "", editor) {
+ const node = document.createElement("div");
+ editor.CodeMirror.runMode(text, "application/javascript", node);
+ return { __html: node.innerHTML };
+ }
+
+ render() {
+ const { breakpoint, editor, isBreakpointLineBlackboxed } = this.props;
+ const text = this.getBreakpointText();
+ const labelId = `${breakpoint.id}-label`;
+ return div(
+ {
+ className: classnames({
+ breakpoint,
+ paused: this.isCurrentlyPausedAtBreakpoint(),
+ disabled: breakpoint.disabled,
+ "is-conditional": !!breakpoint.options.condition,
+ "is-log": !!breakpoint.options.logValue,
+ }),
+ onClick: this.selectBreakpoint,
+ onDoubleClick: this.onDoubleClick,
+ onContextMenu: this.onContextMenu,
+ },
+ input({
+ id: breakpoint.id,
+ type: "checkbox",
+ className: "breakpoint-checkbox",
+ checked: !breakpoint.disabled,
+ disabled: isBreakpointLineBlackboxed,
+ onChange: this.handleBreakpointCheckbox,
+ onClick: this.stopClicks,
+ "aria-labelledby": labelId,
+ }),
+ span(
+ {
+ id: labelId,
+ className: "breakpoint-label cm-s-mozilla devtools-monospace",
+ onClick: this.selectBreakpoint,
+ title: text,
+ },
+ span({
+ dangerouslySetInnerHTML: this.highlightText(text, editor),
+ })
+ ),
+ div(
+ {
+ className: "breakpoint-line-close",
+ },
+ div(
+ {
+ className: "breakpoint-line devtools-monospace",
+ },
+ this.getBreakpointLocation()
+ ),
+ React.createElement(CloseButton, {
+ handleClick: this.removeBreakpoint,
+ tooltip: L10N.getStr("breakpoints.removeBreakpointTooltip"),
+ })
+ )
+ );
+ }
+}
+
+const getFormattedFrame = createSelector(
+ getSelectedSource,
+ getSelectedFrame,
+ (selectedSource, frame) => {
+ if (!frame) {
+ return null;
+ }
+
+ return {
+ ...frame,
+ selectedLocation: getSelectedLocation(frame, selectedSource),
+ };
+ }
+);
+
+const mapStateToProps = (state, props) => {
+ const blackboxedRangesForSource = getBlackBoxRanges(state)[props.source.url];
+ const isSourceOnIgnoreList =
+ isSourceMapIgnoreListEnabled(state) &&
+ isSourceOnSourceMapIgnoreList(state, props.source);
+ return {
+ selectedSource: getSelectedSource(state),
+ isBreakpointLineBlackboxed: isLineBlackboxed(
+ blackboxedRangesForSource,
+ props.breakpoint.location.line,
+ isSourceOnIgnoreList
+ ),
+ frame: getFormattedFrame(state, getCurrentThread(state)),
+ };
+};
+
+export default connect(mapStateToProps, {
+ enableBreakpoint: actions.enableBreakpoint,
+ removeBreakpoint: actions.removeBreakpoint,
+ disableBreakpoint: actions.disableBreakpoint,
+ selectSpecificLocation: actions.selectSpecificLocation,
+ openConditionalPanel: actions.openConditionalPanel,
+ showBreakpointContextMenu: actions.showBreakpointContextMenu,
+})(Breakpoint);
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/BreakpointHeading.js b/devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/BreakpointHeading.js
new file mode 100644
index 0000000000..78cc530cff
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/BreakpointHeading.js
@@ -0,0 +1,84 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React, { PureComponent } from "devtools/client/shared/vendor/react";
+import { div, span } from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+
+import { connect } from "devtools/client/shared/vendor/react-redux";
+import actions from "../../../actions/index";
+
+import {
+ getTruncatedFileName,
+ getDisplayPath,
+ getSourceQueryString,
+ getFileURL,
+} from "../../../utils/source";
+import { createLocation } from "../../../utils/location";
+import { getFirstSourceActorForGeneratedSource } from "../../../selectors/index";
+
+import SourceIcon from "../../shared/SourceIcon";
+
+class BreakpointHeading extends PureComponent {
+ static get propTypes() {
+ return {
+ sources: PropTypes.array.isRequired,
+ source: PropTypes.object.isRequired,
+ firstSourceActor: PropTypes.object,
+ selectSource: PropTypes.func.isRequired,
+ showBreakpointHeadingContextMenu: PropTypes.func.isRequired,
+ };
+ }
+ onContextMenu = event => {
+ event.preventDefault();
+
+ this.props.showBreakpointHeadingContextMenu(event, this.props.source);
+ };
+
+ render() {
+ const { sources, source, selectSource } = this.props;
+
+ const path = getDisplayPath(source, sources);
+ const query = getSourceQueryString(source);
+ return div(
+ {
+ className: "breakpoint-heading",
+ title: getFileURL(source, false),
+ onClick: () => selectSource(source),
+ onContextMenu: this.onContextMenu,
+ },
+ React.createElement(
+ SourceIcon,
+ // Breakpoints are displayed per source and may relate to many source actors.
+ // Arbitrarily pick the first source actor to compute the matching source icon
+ // The source actor is used to pick one specific source text content and guess
+ // the related framework icon.
+ {
+ location: createLocation({
+ source,
+ sourceActor: this.props.firstSourceActor,
+ }),
+ modifier: icon =>
+ ["file", "javascript"].includes(icon) ? null : icon,
+ }
+ ),
+ div(
+ {
+ className: "filename",
+ },
+ getTruncatedFileName(source, query),
+ path && span(null, `../${path}/..`)
+ )
+ );
+ }
+}
+
+const mapStateToProps = (state, { source }) => ({
+ firstSourceActor: getFirstSourceActorForGeneratedSource(state, source.id),
+});
+
+export default connect(mapStateToProps, {
+ selectSource: actions.selectSource,
+ showBreakpointHeadingContextMenu: actions.showBreakpointHeadingContextMenu,
+})(BreakpointHeading);
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/Breakpoints.css b/devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/Breakpoints.css
new file mode 100644
index 0000000000..c05dd0b53f
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/Breakpoints.css
@@ -0,0 +1,235 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+.breakpoints-pane > ._content {
+ overflow-x: auto;
+}
+
+.breakpoints-options *,
+.breakpoints-list * {
+ user-select: none;
+}
+
+.breakpoints-list {
+ padding: 4px 0;
+}
+
+.breakpoints-list .breakpoint-heading {
+ text-overflow: ellipsis;
+ width: 100%;
+ font-size: 12px;
+ line-height: 16px;
+}
+
+.breakpoint-heading:not(:first-child) {
+ margin-top: 2px;
+}
+
+.breakpoints-list .breakpoint-heading .filename {
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.breakpoints-list .breakpoint-heading .filename span {
+ opacity: 0.7;
+ padding-left: 4px;
+}
+
+.breakpoints-list .breakpoint-heading,
+.breakpoints-list .breakpoint {
+ color: var(--theme-text-color-strong);
+ position: relative;
+ cursor: pointer;
+}
+
+.breakpoints-list .breakpoint-heading,
+.breakpoints-list .breakpoint,
+.breakpoints-options > * {
+ display: flex;
+ align-items: center;
+ overflow: hidden;
+ padding-top: 2px;
+ padding-bottom: 2px;
+ padding-inline-start: 16px;
+ padding-inline-end: 12px;
+}
+
+.breakpoints-exceptions-caught {
+ padding-bottom: 3px;
+ padding-top: 3px;
+ padding-inline-start: 36px;
+}
+
+.breakpoints-options {
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+
+.xhr-breakpoints-pane .breakpoints-options {
+ border-bottom: 1px solid var(--theme-splitter-color);
+}
+
+.breakpoints-options:not(.empty) {
+ border-bottom: 1px solid var(--theme-splitter-color);
+}
+
+.breakpoints-options input {
+ padding-inline-start: 2px;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ margin-inline-start: 0;
+ margin-inline-end: 2px;
+ vertical-align: text-bottom;
+}
+
+.breakpoint-exceptions-label {
+ line-height: 14px;
+ padding-inline-end: 8px;
+ cursor: default;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.breakpoints-list .breakpoint,
+.breakpoints-list .breakpoint-heading,
+.breakpoints-options {
+ border-inline-start: 4px solid transparent
+}
+
+html .breakpoints-list .breakpoint.is-conditional {
+ border-inline-start-color: var(--theme-graphs-yellow);
+}
+
+html .breakpoints-list .breakpoint.is-log {
+ border-inline-start-color: var(--theme-graphs-purple);
+}
+
+html .breakpoints-list .breakpoint.paused {
+ background-color: var(--theme-toolbar-background-alt);
+ border-color: var(--breakpoint-active-color);
+}
+
+.breakpoints-list .breakpoint:hover {
+ background-color: var(--search-overlays-semitransparent);
+}
+
+.breakpoint-line-close {
+ margin-inline-start: 4px;
+}
+
+.breakpoints-list .breakpoint .breakpoint-line {
+ font-size: 11px;
+ color: var(--theme-comment);
+ min-width: 16px;
+ text-align: end;
+ padding-top: 1px;
+ padding-bottom: 1px;
+}
+
+.breakpoints-list .breakpoint:hover .breakpoint-line,
+.breakpoints-list .breakpoint-line-close:focus-within .breakpoint-line {
+ color: transparent;
+}
+
+.breakpoints-list .breakpoint.paused:hover {
+ border-color: var(--breakpoint-active-color-hover);
+}
+
+.breakpoints-list .breakpoint-label {
+ display: inline-block;
+ cursor: pointer;
+ flex-grow: 1;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ font-size: 11px;
+}
+
+.breakpoints-list .breakpoint-label span,
+.breakpoint-line-close {
+ display: inline;
+ line-height: 14px;
+}
+
+.breakpoint-checkbox {
+ margin-inline-start: 0px;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ vertical-align: text-bottom;
+}
+
+.breakpoint-label .location {
+ width: 100%;
+ display: inline-block;
+ overflow-x: hidden;
+ text-overflow: ellipsis;
+ padding: 1px 0;
+ vertical-align: bottom;
+}
+
+.breakpoints-list .pause-indicator {
+ flex: 0 1 content;
+ order: 3;
+}
+
+.breakpoint .close-btn {
+ position: absolute;
+ /* hide button outside of row until hovered or focused */
+ top: -100px;
+}
+
+[dir="ltr"] .breakpoint .close-btn {
+ right: 12px;
+}
+
+[dir="rtl"] .breakpoint .close-btn {
+ left: 12px;
+}
+
+/* Reveal the remove button on hover/focus */
+.breakpoint:hover .close-btn,
+.breakpoint .close-btn:focus {
+ top: calc(50% - 8px);
+}
+
+/* Hide the line number when revealing the remove button (since they're overlayed) */
+.breakpoint-line-close:focus-within .breakpoint-line,
+.breakpoint:hover .breakpoint-line {
+ visibility: hidden;
+}
+
+.CodeMirror.cm-s-mozilla-breakpoint {
+ cursor: pointer;
+}
+
+.CodeMirror.cm-s-mozilla-breakpoint .CodeMirror-lines {
+ padding: 0;
+}
+
+.CodeMirror.cm-s-mozilla-breakpoint .CodeMirror-sizer {
+ min-width: initial !important;
+}
+
+.breakpoints-list .breakpoint .CodeMirror.cm-s-mozilla-breakpoint {
+ transition: opacity 0.15s linear;
+}
+
+.breakpoints-list .breakpoint.disabled .CodeMirror.cm-s-mozilla-breakpoint {
+ opacity: 0.5;
+}
+
+.CodeMirror.cm-s-mozilla-breakpoint .CodeMirror-line span[role="presentation"] {
+ max-width: 100%;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ display: inline-block;
+}
+
+.CodeMirror.cm-s-mozilla-breakpoint .CodeMirror-code,
+.CodeMirror.cm-s-mozilla-breakpoint .CodeMirror-scroll {
+ pointer-events: none;
+}
+
+.CodeMirror.cm-s-mozilla-breakpoint {
+ padding-top: 1px;
+}
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/ExceptionOption.js b/devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/ExceptionOption.js
new file mode 100644
index 0000000000..31ff3f44a3
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/ExceptionOption.js
@@ -0,0 +1,40 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+import {
+ div,
+ input,
+ label,
+} from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+
+export default function ExceptionOption({
+ className,
+ isChecked = false,
+ label: inputLabel,
+ onChange,
+}) {
+ return label(
+ {
+ className,
+ },
+ input({
+ type: "checkbox",
+ checked: isChecked,
+ onChange: onChange,
+ }),
+ div(
+ {
+ className: "breakpoint-exceptions-label",
+ },
+ inputLabel
+ )
+ );
+}
+
+ExceptionOption.propTypes = {
+ className: PropTypes.string.isRequired,
+ isChecked: PropTypes.bool.isRequired,
+ label: PropTypes.string.isRequired,
+ onChange: PropTypes.func.isRequired,
+};
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/index.js b/devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/index.js
new file mode 100644
index 0000000000..0f5d6f7ae3
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/index.js
@@ -0,0 +1,172 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React, { Component } from "devtools/client/shared/vendor/react";
+import { div } from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+import { connect } from "devtools/client/shared/vendor/react-redux";
+
+import ExceptionOption from "./ExceptionOption";
+
+import Breakpoint from "./Breakpoint";
+import BreakpointHeading from "./BreakpointHeading";
+
+import actions from "../../../actions/index";
+import { getSelectedLocation } from "../../../utils/selected-location";
+import { createHeadlessEditor } from "../../../utils/editor/create-editor";
+
+import { makeBreakpointId } from "../../../utils/breakpoint/index";
+
+import {
+ getSelectedSource,
+ getBreakpointSources,
+ getShouldPauseOnDebuggerStatement,
+ getShouldPauseOnExceptions,
+ getShouldPauseOnCaughtExceptions,
+} from "../../../selectors/index";
+
+const classnames = require("resource://devtools/client/shared/classnames.js");
+
+class Breakpoints extends Component {
+ static get propTypes() {
+ return {
+ breakpointSources: PropTypes.array.isRequired,
+ pauseOnExceptions: PropTypes.func.isRequired,
+ selectedSource: PropTypes.object,
+ shouldPauseOnDebuggerStatement: PropTypes.bool.isRequired,
+ shouldPauseOnCaughtExceptions: PropTypes.bool.isRequired,
+ shouldPauseOnExceptions: PropTypes.bool.isRequired,
+ };
+ }
+
+ componentWillUnmount() {
+ this.removeEditor();
+ }
+
+ getEditor() {
+ if (!this.headlessEditor) {
+ this.headlessEditor = createHeadlessEditor();
+ }
+ return this.headlessEditor;
+ }
+
+ removeEditor() {
+ if (!this.headlessEditor) {
+ return;
+ }
+ this.headlessEditor.destroy();
+ this.headlessEditor = null;
+ }
+
+ togglePauseOnDebuggerStatement = () => {
+ this.props.pauseOnDebuggerStatement(
+ !this.props.shouldPauseOnDebuggerStatement
+ );
+ };
+
+ togglePauseOnException = () => {
+ this.props.pauseOnExceptions(!this.props.shouldPauseOnExceptions, false);
+ };
+
+ togglePauseOnCaughtException = () => {
+ this.props.pauseOnExceptions(
+ true,
+ !this.props.shouldPauseOnCaughtExceptions
+ );
+ };
+
+ renderExceptionsOptions() {
+ const {
+ breakpointSources,
+ shouldPauseOnDebuggerStatement,
+ shouldPauseOnExceptions,
+ shouldPauseOnCaughtExceptions,
+ } = this.props;
+
+ const isEmpty = !breakpointSources.length;
+ return div(
+ {
+ className: classnames("breakpoints-options", {
+ empty: isEmpty,
+ }),
+ },
+ React.createElement(ExceptionOption, {
+ className: "breakpoints-debugger-statement",
+ label: L10N.getStr("pauseOnDebuggerStatement"),
+ isChecked: shouldPauseOnDebuggerStatement,
+ onChange: this.togglePauseOnDebuggerStatement,
+ }),
+ React.createElement(ExceptionOption, {
+ className: "breakpoints-exceptions",
+ label: L10N.getStr("pauseOnExceptionsItem2"),
+ isChecked: shouldPauseOnExceptions,
+ onChange: this.togglePauseOnException,
+ }),
+ shouldPauseOnExceptions &&
+ React.createElement(ExceptionOption, {
+ className: "breakpoints-exceptions-caught",
+ label: L10N.getStr("pauseOnCaughtExceptionsItem"),
+ isChecked: shouldPauseOnCaughtExceptions,
+ onChange: this.togglePauseOnCaughtException,
+ })
+ );
+ }
+
+ renderBreakpoints() {
+ const { breakpointSources, selectedSource } = this.props;
+ if (!breakpointSources.length) {
+ return null;
+ }
+
+ const editor = this.getEditor();
+ const sources = breakpointSources.map(({ source }) => source);
+ return div(
+ {
+ className: "pane breakpoints-list",
+ },
+ breakpointSources.map(({ source, breakpoints }) => {
+ return [
+ React.createElement(BreakpointHeading, {
+ key: source.id,
+ source,
+ sources,
+ }),
+ breakpoints.map(breakpoint =>
+ React.createElement(Breakpoint, {
+ breakpoint,
+ source,
+ editor,
+ key: makeBreakpointId(
+ getSelectedLocation(breakpoint, selectedSource)
+ ),
+ })
+ ),
+ ];
+ })
+ );
+ }
+
+ render() {
+ return div(
+ {
+ className: "pane",
+ },
+ this.renderExceptionsOptions(),
+ this.renderBreakpoints()
+ );
+ }
+}
+
+const mapStateToProps = state => ({
+ breakpointSources: getBreakpointSources(state),
+ selectedSource: getSelectedSource(state),
+ shouldPauseOnDebuggerStatement: getShouldPauseOnDebuggerStatement(state),
+ shouldPauseOnExceptions: getShouldPauseOnExceptions(state),
+ shouldPauseOnCaughtExceptions: getShouldPauseOnCaughtExceptions(state),
+});
+
+export default connect(mapStateToProps, {
+ pauseOnDebuggerStatement: actions.pauseOnDebuggerStatement,
+ pauseOnExceptions: actions.pauseOnExceptions,
+})(Breakpoints);
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/moz.build b/devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/moz.build
new file mode 100644
index 0000000000..85716d122c
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/moz.build
@@ -0,0 +1,13 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DIRS += []
+
+CompiledModules(
+ "Breakpoint.js",
+ "BreakpointHeading.js",
+ "ExceptionOption.js",
+ "index.js",
+)
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/tests/ExceptionOption.spec.js b/devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/tests/ExceptionOption.spec.js
new file mode 100644
index 0000000000..51f0b1e948
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/tests/ExceptionOption.spec.js
@@ -0,0 +1,22 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React from "devtools/client/shared/vendor/react";
+import { shallow } from "enzyme";
+
+import ExceptionOption from "../ExceptionOption";
+
+describe("ExceptionOption renders", () => {
+ it("with values", () => {
+ const component = shallow(
+ React.createElement(ExceptionOption, {
+ label: "testLabel",
+ isChecked: true,
+ onChange: () => null,
+ className: "testClassName",
+ })
+ );
+ expect(component).toMatchSnapshot();
+ });
+});
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/tests/__snapshots__/ExceptionOption.spec.js.snap b/devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/tests/__snapshots__/ExceptionOption.spec.js.snap
new file mode 100644
index 0000000000..3ed80783b6
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/Breakpoints/tests/__snapshots__/ExceptionOption.spec.js.snap
@@ -0,0 +1,18 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`ExceptionOption renders with values 1`] = `
+<label
+ className="testClassName"
+>
+ <input
+ checked={true}
+ onChange={[Function]}
+ type="checkbox"
+ />
+ <div
+ className="breakpoint-exceptions-label"
+ >
+ testLabel
+ </div>
+</label>
+`;
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/CommandBar.css b/devtools/client/debugger/src/components/SecondaryPanes/CommandBar.css
new file mode 100644
index 0000000000..68bd0bfcdd
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/CommandBar.css
@@ -0,0 +1,33 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+.command-bar {
+ flex: 0 0 29px;
+ border-bottom: 1px solid var(--theme-splitter-color);
+ display: flex;
+ overflow: hidden;
+ z-index: 1;
+ background-color: var(--theme-toolbar-background);
+}
+
+html[dir="rtl"] .command-bar {
+ border-right: 1px solid var(--theme-splitter-color);
+}
+
+.command-bar .filler {
+ flex-grow: 1;
+}
+
+.command-bar .step-position {
+ color: var(--theme-text-color-inactive);
+ padding-top: 8px;
+ margin-inline-end: 4px;
+}
+
+.command-bar .divider {
+ width: 1px;
+ background: var(--theme-splitter-color);
+ height: 10px;
+ margin: 11px 6px 0 6px;
+}
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/CommandBar.js b/devtools/client/debugger/src/components/SecondaryPanes/CommandBar.js
new file mode 100644
index 0000000000..deae156a40
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/CommandBar.js
@@ -0,0 +1,502 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React, { Component } from "devtools/client/shared/vendor/react";
+import { div, button } from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+
+import { connect } from "devtools/client/shared/vendor/react-redux";
+import { features, prefs } from "../../utils/prefs";
+import {
+ getIsWaitingOnBreak,
+ getSkipPausing,
+ getCurrentThread,
+ isTopFrameSelected,
+ getIsCurrentThreadPaused,
+ getIsJavascriptTracingEnabled,
+ getIsThreadCurrentlyTracing,
+ getJavascriptTracingLogMethod,
+ getJavascriptTracingValues,
+ getJavascriptTracingOnNextInteraction,
+ getJavascriptTracingOnNextLoad,
+ getJavascriptTracingFunctionReturn,
+} from "../../selectors/index";
+import { formatKeyShortcut } from "../../utils/text";
+import actions from "../../actions/index";
+import { debugBtn } from "../shared/Button/CommandBarButton";
+import AccessibleImage from "../shared/AccessibleImage";
+import { showMenu } from "../../context-menu/menu";
+
+const classnames = require("resource://devtools/client/shared/classnames.js");
+const MenuButton = require("resource://devtools/client/shared/components/menu/MenuButton.js");
+const MenuItem = require("resource://devtools/client/shared/components/menu/MenuItem.js");
+const MenuList = require("resource://devtools/client/shared/components/menu/MenuList.js");
+
+const isMacOS = Services.appinfo.OS === "Darwin";
+
+// NOTE: the "resume" command will call either the resume or breakOnNext action
+// depending on whether or not the debugger is paused or running
+const COMMANDS = ["resume", "stepOver", "stepIn", "stepOut"];
+
+const KEYS = {
+ WINNT: {
+ resume: "F8",
+ stepOver: "F10",
+ stepIn: "F11",
+ stepOut: "Shift+F11",
+ trace: "Ctrl+Shift+5",
+ },
+ Darwin: {
+ resume: "Cmd+\\",
+ stepOver: "Cmd+'",
+ stepIn: "Cmd+;",
+ stepOut: "Cmd+Shift+:",
+ stepOutDisplay: "Cmd+Shift+;",
+ trace: "Ctrl+Shift+5",
+ },
+ Linux: {
+ resume: "F8",
+ stepOver: "F10",
+ stepIn: "F11",
+ stepOut: "Shift+F11",
+ trace: "Ctrl+Shift+5",
+ },
+};
+
+const LOG_METHODS = {
+ CONSOLE: "console",
+ STDOUT: "stdout",
+};
+
+function getKey(action) {
+ return getKeyForOS(Services.appinfo.OS, action);
+}
+
+function getKeyForOS(os, action) {
+ const osActions = KEYS[os] || KEYS.Linux;
+ return osActions[action];
+}
+
+function formatKey(action) {
+ const key = getKey(`${action}Display`) || getKey(action);
+
+ // On MacOS, we bind both Windows and MacOS/Darwin key shortcuts
+ // Display them both, but only when they are different
+ if (isMacOS) {
+ const winKey =
+ getKeyForOS("WINNT", `${action}Display`) || getKeyForOS("WINNT", action);
+ if (key != winKey) {
+ return formatKeyShortcut([key, winKey].join(" "));
+ }
+ }
+ return formatKeyShortcut(key);
+}
+
+class CommandBar extends Component {
+ constructor() {
+ super();
+
+ this.state = {};
+ }
+ static get propTypes() {
+ return {
+ breakOnNext: PropTypes.func.isRequired,
+ horizontal: PropTypes.bool.isRequired,
+ isPaused: PropTypes.bool.isRequired,
+ isTracingEnabled: PropTypes.bool.isRequired,
+ isWaitingOnBreak: PropTypes.bool.isRequired,
+ javascriptEnabled: PropTypes.bool.isRequired,
+ trace: PropTypes.func.isRequired,
+ resume: PropTypes.func.isRequired,
+ skipPausing: PropTypes.bool.isRequired,
+ stepIn: PropTypes.func.isRequired,
+ stepOut: PropTypes.func.isRequired,
+ stepOver: PropTypes.func.isRequired,
+ toggleEditorWrapping: PropTypes.func.isRequired,
+ toggleInlinePreview: PropTypes.func.isRequired,
+ toggleJavaScriptEnabled: PropTypes.func.isRequired,
+ toggleSkipPausing: PropTypes.any.isRequired,
+ toggleSourceMapsEnabled: PropTypes.func.isRequired,
+ topFrameSelected: PropTypes.bool.isRequired,
+ toggleTracing: PropTypes.func.isRequired,
+ logMethod: PropTypes.string.isRequired,
+ logValues: PropTypes.bool.isRequired,
+ traceOnNextInteraction: PropTypes.bool.isRequired,
+ setJavascriptTracingLogMethod: PropTypes.func.isRequired,
+ setHideOrShowIgnoredSources: PropTypes.func.isRequired,
+ toggleSourceMapIgnoreList: PropTypes.func.isRequired,
+ };
+ }
+
+ componentWillUnmount() {
+ const { shortcuts } = this.context;
+
+ COMMANDS.forEach(action => shortcuts.off(getKey(action)));
+
+ if (isMacOS) {
+ COMMANDS.forEach(action => shortcuts.off(getKeyForOS("WINNT", action)));
+ }
+ }
+
+ componentDidMount() {
+ const { shortcuts } = this.context;
+
+ COMMANDS.forEach(action =>
+ shortcuts.on(getKey(action), e => this.handleEvent(e, action))
+ );
+
+ if (isMacOS) {
+ // The Mac supports both the Windows Function keys
+ // as well as the Mac non-Function keys
+ COMMANDS.forEach(action =>
+ shortcuts.on(getKeyForOS("WINNT", action), e =>
+ this.handleEvent(e, action)
+ )
+ );
+ }
+ }
+
+ handleEvent(e, action) {
+ e.preventDefault();
+ e.stopPropagation();
+ if (action === "resume") {
+ this.props.isPaused ? this.props.resume() : this.props.breakOnNext();
+ } else {
+ this.props[action]();
+ }
+ }
+
+ renderStepButtons() {
+ const { isPaused, topFrameSelected } = this.props;
+ const className = isPaused ? "active" : "disabled";
+ const isDisabled = !isPaused;
+
+ return [
+ this.renderPauseButton(),
+ debugBtn(
+ () => this.props.stepOver(),
+ "stepOver",
+ className,
+ L10N.getFormatStr("stepOverTooltip", formatKey("stepOver")),
+ isDisabled
+ ),
+ debugBtn(
+ () => this.props.stepIn(),
+ "stepIn",
+ className,
+ L10N.getFormatStr("stepInTooltip", formatKey("stepIn")),
+ isDisabled || !topFrameSelected
+ ),
+ debugBtn(
+ () => this.props.stepOut(),
+ "stepOut",
+ className,
+ L10N.getFormatStr("stepOutTooltip", formatKey("stepOut")),
+ isDisabled
+ ),
+ ];
+ }
+
+ resume() {
+ this.props.resume();
+ }
+
+ renderTraceButton() {
+ if (!features.javascriptTracing) {
+ return null;
+ }
+
+ // The button is highlighted in blue as soon as the user requested to start the trace
+ const isActive = this.props.isTracingEnabled;
+ // But it will only be active once the tracer actually started.
+ // This may come later when using "on next user interaction" feature.
+ const isPending = isActive && !this.props.isTracingActive;
+
+ let className = "";
+ if (isPending) {
+ className = "pending";
+ } else if (isActive) {
+ className = "active";
+ }
+ // Display a button which:
+ // - on left click, would toggle on/off javascript tracing
+ // - on right click, would display a context menu to configure the tracer settings
+ return button({
+ className: `devtools-button command-bar-button debugger-trace-menu-button ${className}`,
+ title: this.props.isTracingEnabled
+ ? L10N.getFormatStr("stopTraceButtonTooltip2", formatKey("trace"))
+ : L10N.getFormatStr(
+ "startTraceButtonTooltip2",
+ formatKey("trace"),
+ this.props.logMethod
+ ),
+ onClick: event => {
+ this.props.toggleTracing();
+ },
+ onContextMenu: event => {
+ event.preventDefault();
+ event.stopPropagation();
+
+ // Avoid showing the menu to avoid having to support changing tracing config "live"
+ if (this.props.isTracingEnabled) {
+ return;
+ }
+ const items = [
+ {
+ id: "debugger-trace-menu-item-console",
+ label: L10N.getStr("traceInWebConsole"),
+ checked: this.props.logMethod == LOG_METHODS.CONSOLE,
+ type: "radio",
+ click: () => {
+ this.props.setJavascriptTracingLogMethod(LOG_METHODS.CONSOLE);
+ },
+ },
+ {
+ id: "debugger-trace-menu-item-stdout",
+ label: L10N.getStr("traceInStdout"),
+ type: "radio",
+ checked: this.props.logMethod == LOG_METHODS.STDOUT,
+ click: () => {
+ this.props.setJavascriptTracingLogMethod(LOG_METHODS.STDOUT);
+ },
+ },
+ { type: "separator" },
+ {
+ id: "debugger-trace-menu-item-next-interaction",
+ label: L10N.getStr("traceOnNextInteraction"),
+ type: "checkbox",
+ checked: this.props.traceOnNextInteraction,
+ click: () => {
+ this.props.toggleJavascriptTracingOnNextInteraction();
+ },
+ },
+ {
+ id: "debugger-trace-menu-item-next-load",
+ label: L10N.getStr("traceOnNextLoad"),
+ type: "checkbox",
+ checked: this.props.traceOnNextLoad,
+ click: () => {
+ this.props.toggleJavascriptTracingOnNextLoad();
+ },
+ },
+ { type: "separator" },
+ {
+ id: "debugger-trace-menu-item-log-values",
+ label: L10N.getStr("traceValues"),
+ type: "checkbox",
+ checked: this.props.logValues,
+ click: () => {
+ this.props.toggleJavascriptTracingValues();
+ },
+ },
+ {
+ id: "debugger-trace-menu-item-function-return",
+ label: L10N.getStr("traceFunctionReturn"),
+ type: "checkbox",
+ checked: this.props.traceFunctionReturn,
+ click: () => {
+ this.props.toggleJavascriptTracingFunctionReturn();
+ },
+ },
+ ];
+ showMenu(event, items);
+ },
+ });
+ }
+ renderPauseButton() {
+ const { breakOnNext, isWaitingOnBreak } = this.props;
+
+ if (this.props.isPaused) {
+ return debugBtn(
+ () => this.resume(),
+ "resume",
+ "active",
+ L10N.getFormatStr("resumeButtonTooltip", formatKey("resume"))
+ );
+ }
+
+ if (isWaitingOnBreak) {
+ return debugBtn(
+ null,
+ "pause",
+ "disabled",
+ L10N.getStr("pausePendingButtonTooltip"),
+ true
+ );
+ }
+
+ return debugBtn(
+ () => breakOnNext(),
+ "pause",
+ "active",
+ L10N.getFormatStr("pauseButtonTooltip", formatKey("resume"))
+ );
+ }
+
+ renderSkipPausingButton() {
+ const { skipPausing, toggleSkipPausing } = this.props;
+ return button(
+ {
+ className: classnames(
+ "command-bar-button",
+ "command-bar-skip-pausing",
+ {
+ active: skipPausing,
+ }
+ ),
+ title: skipPausing
+ ? L10N.getStr("undoSkipPausingTooltip.label")
+ : L10N.getStr("skipPausingTooltip.label"),
+ onClick: toggleSkipPausing,
+ },
+ React.createElement(AccessibleImage, {
+ className: skipPausing ? "enable-pausing" : "disable-pausing",
+ })
+ );
+ }
+
+ renderSettingsButton() {
+ const { toolboxDoc } = this.context;
+ return React.createElement(
+ MenuButton,
+ {
+ menuId: "debugger-settings-menu-button",
+ toolboxDoc: toolboxDoc,
+ className:
+ "devtools-button command-bar-button debugger-settings-menu-button",
+ title: L10N.getStr("settings.button.label"),
+ },
+ () => this.renderSettingsMenuItems()
+ );
+ }
+
+ renderSettingsMenuItems() {
+ return React.createElement(
+ MenuList,
+ {
+ id: "debugger-settings-menu-list",
+ },
+ React.createElement(MenuItem, {
+ key: "debugger-settings-menu-item-disable-javascript",
+ className: "menu-item debugger-settings-menu-item-disable-javascript",
+ checked: !this.props.javascriptEnabled,
+ label: L10N.getStr("settings.disableJavaScript.label"),
+ tooltip: L10N.getStr("settings.disableJavaScript.tooltip"),
+ onClick: () => {
+ this.props.toggleJavaScriptEnabled(!this.props.javascriptEnabled);
+ },
+ }),
+ React.createElement(MenuItem, {
+ key: "debugger-settings-menu-item-disable-inline-previews",
+ checked: features.inlinePreview,
+ label: L10N.getStr("inlinePreview.toggle.label"),
+ tooltip: L10N.getStr("inlinePreview.toggle.tooltip"),
+ onClick: () => this.props.toggleInlinePreview(!features.inlinePreview),
+ }),
+ React.createElement(MenuItem, {
+ key: "debugger-settings-menu-item-disable-wrap-lines",
+ checked: prefs.editorWrapping,
+ label: L10N.getStr("editorWrapping.toggle.label"),
+ tooltip: L10N.getStr("editorWrapping.toggle.tooltip"),
+ onClick: () => this.props.toggleEditorWrapping(!prefs.editorWrapping),
+ }),
+ React.createElement(MenuItem, {
+ key: "debugger-settings-menu-item-disable-sourcemaps",
+ checked: prefs.clientSourceMapsEnabled,
+ label: L10N.getStr("settings.toggleSourceMaps.label"),
+ tooltip: L10N.getStr("settings.toggleSourceMaps.tooltip"),
+ onClick: () =>
+ this.props.toggleSourceMapsEnabled(!prefs.clientSourceMapsEnabled),
+ }),
+ React.createElement(MenuItem, {
+ key: "debugger-settings-menu-item-hide-ignored-sources",
+ className: "menu-item debugger-settings-menu-item-hide-ignored-sources",
+ checked: prefs.hideIgnoredSources,
+ label: L10N.getStr("settings.hideIgnoredSources.label"),
+ tooltip: L10N.getStr("settings.hideIgnoredSources.tooltip"),
+ onClick: () =>
+ this.props.setHideOrShowIgnoredSources(!prefs.hideIgnoredSources),
+ }),
+ React.createElement(MenuItem, {
+ key: "debugger-settings-menu-item-enable-sourcemap-ignore-list",
+ className:
+ "menu-item debugger-settings-menu-item-enable-sourcemap-ignore-list",
+ checked: prefs.sourceMapIgnoreListEnabled,
+ label: L10N.getStr("settings.enableSourceMapIgnoreList.label"),
+ tooltip: L10N.getStr("settings.enableSourceMapIgnoreList.tooltip"),
+ onClick: () =>
+ this.props.toggleSourceMapIgnoreList(
+ !prefs.sourceMapIgnoreListEnabled
+ ),
+ })
+ );
+ }
+
+ render() {
+ return div(
+ {
+ className: classnames("command-bar", {
+ vertical: !this.props.horizontal,
+ }),
+ },
+ this.renderStepButtons(),
+ div({
+ className: "filler",
+ }),
+ this.renderTraceButton(),
+ this.renderSkipPausingButton(),
+ div({
+ className: "devtools-separator",
+ }),
+ this.renderSettingsButton()
+ );
+ }
+}
+
+CommandBar.contextTypes = {
+ shortcuts: PropTypes.object,
+ toolboxDoc: PropTypes.object,
+};
+
+const mapStateToProps = state => ({
+ isWaitingOnBreak: getIsWaitingOnBreak(state, getCurrentThread(state)),
+ skipPausing: getSkipPausing(state),
+ topFrameSelected: isTopFrameSelected(state, getCurrentThread(state)),
+ javascriptEnabled: state.ui.javascriptEnabled,
+ isPaused: getIsCurrentThreadPaused(state),
+ isTracingEnabled: getIsJavascriptTracingEnabled(
+ state,
+ getCurrentThread(state)
+ ),
+ isTracingActive: getIsThreadCurrentlyTracing(state, getCurrentThread(state)),
+ logMethod: getJavascriptTracingLogMethod(state),
+ logValues: getJavascriptTracingValues(state),
+ traceOnNextInteraction: getJavascriptTracingOnNextInteraction(state),
+ traceOnNextLoad: getJavascriptTracingOnNextLoad(state),
+ traceFunctionReturn: getJavascriptTracingFunctionReturn(state),
+});
+
+export default connect(mapStateToProps, {
+ toggleTracing: actions.toggleTracing,
+ setJavascriptTracingLogMethod: actions.setJavascriptTracingLogMethod,
+ toggleJavascriptTracingValues: actions.toggleJavascriptTracingValues,
+ toggleJavascriptTracingOnNextInteraction:
+ actions.toggleJavascriptTracingOnNextInteraction,
+ toggleJavascriptTracingOnNextLoad: actions.toggleJavascriptTracingOnNextLoad,
+ toggleJavascriptTracingFunctionReturn:
+ actions.toggleJavascriptTracingFunctionReturn,
+ resume: actions.resume,
+ stepIn: actions.stepIn,
+ stepOut: actions.stepOut,
+ stepOver: actions.stepOver,
+ breakOnNext: actions.breakOnNext,
+ pauseOnExceptions: actions.pauseOnExceptions,
+ toggleSkipPausing: actions.toggleSkipPausing,
+ toggleInlinePreview: actions.toggleInlinePreview,
+ toggleEditorWrapping: actions.toggleEditorWrapping,
+ toggleSourceMapsEnabled: actions.toggleSourceMapsEnabled,
+ toggleJavaScriptEnabled: actions.toggleJavaScriptEnabled,
+ setHideOrShowIgnoredSources: actions.setHideOrShowIgnoredSources,
+ toggleSourceMapIgnoreList: actions.toggleSourceMapIgnoreList,
+})(CommandBar);
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/DOMMutationBreakpoints.css b/devtools/client/debugger/src/components/SecondaryPanes/DOMMutationBreakpoints.css
new file mode 100644
index 0000000000..b525783984
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/DOMMutationBreakpoints.css
@@ -0,0 +1,76 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+ .dom-mutation-empty {
+ padding: 6px 20px;
+ text-align: center;
+ font-style: italic;
+ color: var(--theme-body-color);
+ white-space: normal;
+ }
+
+ .dom-mutation-empty a {
+ text-decoration: underline;
+ color: var(--theme-toolbar-selected-color);
+ cursor: pointer;
+ }
+
+.dom-mutation-list * {
+ user-select: none;
+}
+
+.dom-mutation-list {
+ padding: 4px 0;
+ list-style-type: none;
+}
+
+.dom-mutation-list li {
+ position: relative;
+
+ display: flex;
+ align-items: start;
+ overflow: hidden;
+ padding-top: 2px;
+ padding-bottom: 2px;
+ padding-inline-start: 20px;
+ padding-inline-end: 12px;
+}
+
+.dom-mutation-list input {
+ margin: 2px 3px;
+
+ padding-inline-start: 2px;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ margin-inline-start: 0;
+ margin-inline-end: 2px;
+ vertical-align: text-bottom;
+}
+
+.dom-mutation-info {
+ flex-grow: 1;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ margin-inline-end: 20px;
+}
+
+.dom-mutation-list .close-btn {
+ position: absolute;
+ /* hide button outside of row until hovered or focused */
+ top: -100px;
+}
+
+/* Reveal the remove button on hover/focus */
+.dom-mutation-list li:hover .close-btn,
+.dom-mutation-list li .close-btn:focus {
+ top: calc(50% - 8px);
+}
+
+[dir="ltr"] .dom-mutation-list .close-btn {
+ right: 12px;
+}
+
+[dir="rtl"] .dom-mutation-list .close-btn {
+ left: 12px;
+}
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/DOMMutationBreakpoints.js b/devtools/client/debugger/src/components/SecondaryPanes/DOMMutationBreakpoints.js
new file mode 100644
index 0000000000..642ba21505
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/DOMMutationBreakpoints.js
@@ -0,0 +1,189 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React, { Component } from "devtools/client/shared/vendor/react";
+import {
+ div,
+ input,
+ li,
+ ul,
+} from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+
+import Reps from "devtools/client/shared/components/reps/index";
+const {
+ REPS: { Rep },
+ MODE,
+} = Reps;
+import { translateNodeFrontToGrip } from "devtools/client/inspector/shared/utils";
+
+import {
+ deleteDOMMutationBreakpoint,
+ toggleDOMMutationBreakpointState,
+} from "devtools/client/framework/actions/index";
+
+import actions from "../../actions/index";
+import { connect } from "devtools/client/shared/vendor/react-redux";
+
+import { CloseButton } from "../shared/Button/index";
+
+const localizationTerms = {
+ subtree: L10N.getStr("domMutationTypes.subtree"),
+ attribute: L10N.getStr("domMutationTypes.attribute"),
+ removal: L10N.getStr("domMutationTypes.removal"),
+};
+
+class DOMMutationBreakpointsContents extends Component {
+ static get propTypes() {
+ return {
+ breakpoints: PropTypes.array.isRequired,
+ deleteBreakpoint: PropTypes.func.isRequired,
+ highlightDomElement: PropTypes.func.isRequired,
+ openElementInInspector: PropTypes.func.isRequired,
+ openInspector: PropTypes.func.isRequired,
+ setSkipPausing: PropTypes.func.isRequired,
+ toggleBreakpoint: PropTypes.func.isRequired,
+ unHighlightDomElement: PropTypes.func.isRequired,
+ };
+ }
+
+ handleBreakpoint(breakpointId, shouldEnable) {
+ const { toggleBreakpoint, setSkipPausing } = this.props;
+
+ // The user has enabled a mutation breakpoint so we should no
+ // longer skip pausing
+ if (shouldEnable) {
+ setSkipPausing(false);
+ }
+ toggleBreakpoint(breakpointId, shouldEnable);
+ }
+
+ renderItem(breakpoint) {
+ const {
+ openElementInInspector,
+ highlightDomElement,
+ unHighlightDomElement,
+ deleteBreakpoint,
+ } = this.props;
+ const { enabled, id: breakpointId, nodeFront, mutationType } = breakpoint;
+
+ return li(
+ {
+ key: breakpoint.id,
+ },
+ input({
+ type: "checkbox",
+ checked: enabled,
+ onChange: () => this.handleBreakpoint(breakpointId, !enabled),
+ }),
+ div(
+ {
+ className: "dom-mutation-info",
+ },
+ div(
+ {
+ className: "dom-mutation-label",
+ },
+ Rep({
+ object: translateNodeFrontToGrip(nodeFront),
+ mode: MODE.TINY,
+ onDOMNodeClick: () => openElementInInspector(nodeFront),
+ onInspectIconClick: () => openElementInInspector(nodeFront),
+ onDOMNodeMouseOver: () => highlightDomElement(nodeFront),
+ onDOMNodeMouseOut: () => unHighlightDomElement(),
+ })
+ ),
+ div(
+ {
+ className: "dom-mutation-type",
+ },
+ localizationTerms[mutationType] || mutationType
+ )
+ ),
+ React.createElement(CloseButton, {
+ handleClick: () => deleteBreakpoint(nodeFront, mutationType),
+ })
+ );
+ }
+
+ /* eslint-disable react/no-danger */
+ renderEmpty() {
+ const { openInspector } = this.props;
+ const text = L10N.getFormatStr(
+ "noDomMutationBreakpoints",
+ `<a>${L10N.getStr("inspectorTool")}</a>`
+ );
+ return div(
+ {
+ className: "dom-mutation-empty",
+ },
+ div({
+ onClick: () => openInspector(),
+ dangerouslySetInnerHTML: {
+ __html: text,
+ },
+ })
+ );
+ }
+
+ render() {
+ const { breakpoints } = this.props;
+
+ if (breakpoints.length === 0) {
+ return this.renderEmpty();
+ }
+ return ul(
+ {
+ className: "dom-mutation-list",
+ },
+ breakpoints.map(breakpoint => this.renderItem(breakpoint))
+ );
+ }
+}
+
+const mapStateToProps = state => ({
+ breakpoints: state.domMutationBreakpoints.breakpoints,
+});
+
+const DOMMutationBreakpointsPanel = connect(
+ mapStateToProps,
+ {
+ deleteBreakpoint: deleteDOMMutationBreakpoint,
+ toggleBreakpoint: toggleDOMMutationBreakpointState,
+ },
+ undefined,
+ { storeKey: "toolbox-store" }
+)(DOMMutationBreakpointsContents);
+
+class DomMutationBreakpoints extends Component {
+ static get propTypes() {
+ return {
+ highlightDomElement: PropTypes.func.isRequired,
+ openElementInInspector: PropTypes.func.isRequired,
+ openInspector: PropTypes.func.isRequired,
+ setSkipPausing: PropTypes.func.isRequired,
+ unHighlightDomElement: PropTypes.func.isRequired,
+ };
+ }
+
+ render() {
+ return React.createElement(DOMMutationBreakpointsPanel, {
+ openElementInInspector: this.props.openElementInInspector,
+ highlightDomElement: this.props.highlightDomElement,
+ unHighlightDomElement: this.props.unHighlightDomElement,
+ setSkipPausing: this.props.setSkipPausing,
+ openInspector: this.props.openInspector,
+ });
+ }
+}
+
+export default connect(undefined, {
+ // the debugger-specific action bound to the debugger store
+ // since there is no `storeKey`
+ openElementInInspector: actions.openElementInInspectorCommand,
+ highlightDomElement: actions.highlightDomElement,
+ unHighlightDomElement: actions.unHighlightDomElement,
+ setSkipPausing: actions.setSkipPausing,
+ openInspector: actions.openInspector,
+})(DomMutationBreakpoints);
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/EventListeners.css b/devtools/client/debugger/src/components/SecondaryPanes/EventListeners.css
new file mode 100644
index 0000000000..eadc3a917b
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/EventListeners.css
@@ -0,0 +1,155 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+.event-listeners-content {
+ padding-block: 4px;
+}
+
+.event-listeners-content ul {
+ padding: 0;
+ list-style-type: none;
+}
+
+.event-listeners-content button:hover,
+.event-listeners-content button:focus {
+ background: none;
+}
+
+.event-listener-group {
+ user-select: none;
+}
+
+.event-listener-header {
+ display: flex;
+ align-items: center;
+}
+
+.event-listener-expand {
+ border: none;
+ background: none;
+ padding: 4px 5px;
+ line-height: 12px;
+ outline-offset: -2px;
+}
+
+.event-listener-expand:hover {
+ background: transparent;
+}
+
+.event-listener-group input[type="checkbox"] {
+ margin: 0;
+ margin-inline-end: 4px;
+}
+
+.event-listener-label {
+ display: flex;
+ align-items: center;
+ padding-inline-end: 10px;
+}
+
+.event-listener-category {
+ padding: 3px 0;
+ line-height: 14px;
+}
+
+.event-listeners-content .arrow {
+ margin-inline-end: 0;
+}
+
+.event-listeners-content .arrow.expanded {
+ transform: rotate(0deg);
+}
+
+.event-listeners-content .arrow.expanded:dir(rtl) {
+ transform: rotate(90deg);
+}
+
+.event-listeners-list {
+ border-block-start: 1px;
+ padding-inline: 18px 20px;
+}
+
+.event-listener-event {
+ display: flex;
+ align-items: center;
+}
+
+.event-listeners-list .event-listener-event {
+ margin-inline-start: 40px;
+}
+
+.event-search-results-list .event-listener-event {
+ padding-inline: 20px;
+}
+
+.event-listener-name {
+ line-height: 14px;
+ padding: 3px 0;
+}
+
+.event-listener-event input {
+ margin-inline: 0 4px;
+ margin-block: 0;
+}
+
+.event-search-container {
+ display: flex;
+ border: 1px solid transparent;
+ border-block-end: 1px solid var(--theme-splitter-color);
+}
+
+.event-search-form {
+ display: flex;
+ flex-grow: 1;
+}
+
+.event-search-input {
+ flex-grow: 1;
+ margin: 0;
+ font-size: inherit;
+ background-color: var(--theme-sidebar-background);
+ border: 0;
+ height: 24px;
+ color: var(--theme-body-color);
+ background-image: url("chrome://devtools/skin/images/filter-small.svg");
+ background-position-x: 4px;
+ background-position-y: 50%;
+ background-repeat: no-repeat;
+ background-size: 12px;
+ -moz-context-properties: fill;
+ fill: var(--theme-icon-dimmed-color);
+ text-align: match-parent;
+ outline-offset: -1px;
+}
+
+:root:dir(ltr) .event-search-input {
+ /* Be explicit about left/right direction to prevent the text/placeholder
+ * from overlapping the background image when the user changes the text
+ * direction manually (e.g. via Ctrl+Shift). */
+ padding-left: 19px;
+ padding-right: 12px;
+}
+
+:root:dir(rtl) .event-search-input {
+ background-position-x: right 4px;
+ padding-right: 19px;
+ padding-left: 12px;
+}
+
+.category-label {
+ color: var(--theme-comment);
+}
+
+.event-search-input::placeholder {
+ color: var(--theme-text-color-alt);
+ opacity: 1;
+}
+
+.event-search-container:focus-within {
+ border: 1px solid var(--theme-highlight-blue);
+}
+
+.devtools-searchinput-clear {
+ margin-inline-end: 8px;
+}
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/EventListeners.js b/devtools/client/debugger/src/components/SecondaryPanes/EventListeners.js
new file mode 100644
index 0000000000..ce7eabf89d
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/EventListeners.js
@@ -0,0 +1,339 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React, { Component } from "devtools/client/shared/vendor/react";
+import {
+ div,
+ input,
+ li,
+ ul,
+ span,
+ button,
+ form,
+ label,
+} from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+
+import { connect } from "devtools/client/shared/vendor/react-redux";
+import actions from "../../actions/index";
+import {
+ getActiveEventListeners,
+ getEventListenerBreakpointTypes,
+ getEventListenerExpanded,
+} from "../../selectors/index";
+
+import AccessibleImage from "../shared/AccessibleImage";
+
+const classnames = require("resource://devtools/client/shared/classnames.js");
+
+class EventListeners extends Component {
+ state = {
+ searchText: "",
+ focused: false,
+ };
+
+ static get propTypes() {
+ return {
+ activeEventListeners: PropTypes.array.isRequired,
+ addEventListenerExpanded: PropTypes.func.isRequired,
+ addEventListeners: PropTypes.func.isRequired,
+ categories: PropTypes.array.isRequired,
+ expandedCategories: PropTypes.array.isRequired,
+ removeEventListenerExpanded: PropTypes.func.isRequired,
+ removeEventListeners: PropTypes.func.isRequired,
+ };
+ }
+
+ hasMatch(eventOrCategoryName, searchText) {
+ const lowercaseEventOrCategoryName = eventOrCategoryName.toLowerCase();
+ const lowercaseSearchText = searchText.toLowerCase();
+
+ return lowercaseEventOrCategoryName.includes(lowercaseSearchText);
+ }
+
+ getSearchResults() {
+ const { searchText } = this.state;
+ const { categories } = this.props;
+ const searchResults = categories.reduce((results, cat, index) => {
+ const category = categories[index];
+
+ if (this.hasMatch(category.name, searchText)) {
+ results[category.name] = category.events;
+ } else {
+ results[category.name] = category.events.filter(event =>
+ this.hasMatch(event.name, searchText)
+ );
+ }
+
+ return results;
+ }, {});
+
+ return searchResults;
+ }
+
+ onCategoryToggle(category) {
+ const {
+ expandedCategories,
+ removeEventListenerExpanded,
+ addEventListenerExpanded,
+ } = this.props;
+
+ if (expandedCategories.includes(category)) {
+ removeEventListenerExpanded(category);
+ } else {
+ addEventListenerExpanded(category);
+ }
+ }
+
+ onCategoryClick(category, isChecked) {
+ const { addEventListeners, removeEventListeners } = this.props;
+ const eventsIds = category.events.map(event => event.id);
+
+ if (isChecked) {
+ addEventListeners(eventsIds);
+ } else {
+ removeEventListeners(eventsIds);
+ }
+ }
+
+ onEventTypeClick(eventId, isChecked) {
+ const { addEventListeners, removeEventListeners } = this.props;
+ if (isChecked) {
+ addEventListeners([eventId]);
+ } else {
+ removeEventListeners([eventId]);
+ }
+ }
+
+ onInputChange = event => {
+ this.setState({ searchText: event.currentTarget.value });
+ };
+
+ onKeyDown = event => {
+ if (event.key === "Escape") {
+ this.setState({ searchText: "" });
+ }
+ };
+
+ onFocus = event => {
+ this.setState({ focused: true });
+ };
+
+ onBlur = event => {
+ this.setState({ focused: false });
+ };
+
+ renderSearchInput() {
+ const { focused, searchText } = this.state;
+ const placeholder = L10N.getStr("eventListenersHeader1.placeholder");
+ return form(
+ {
+ className: "event-search-form",
+ onSubmit: e => e.preventDefault(),
+ },
+ input({
+ className: classnames("event-search-input", {
+ focused,
+ }),
+ placeholder: placeholder,
+ value: searchText,
+ onChange: this.onInputChange,
+ onKeyDown: this.onKeyDown,
+ onFocus: this.onFocus,
+ onBlur: this.onBlur,
+ })
+ );
+ }
+
+ renderClearSearchButton() {
+ const { searchText } = this.state;
+
+ if (!searchText) {
+ return null;
+ }
+ return button({
+ onClick: () =>
+ this.setState({
+ searchText: "",
+ }),
+ className: "devtools-searchinput-clear",
+ });
+ }
+
+ renderCategoriesList() {
+ const { categories } = this.props;
+ return ul(
+ {
+ className: "event-listeners-list",
+ },
+ categories.map((category, index) => {
+ return li(
+ {
+ className: "event-listener-group",
+ key: index,
+ },
+ this.renderCategoryHeading(category),
+ this.renderCategoryListing(category)
+ );
+ })
+ );
+ }
+
+ renderSearchResultsList() {
+ const searchResults = this.getSearchResults();
+ return ul(
+ {
+ className: "event-search-results-list",
+ },
+ Object.keys(searchResults).map(category => {
+ return searchResults[category].map(event => {
+ return this.renderListenerEvent(event, category);
+ });
+ })
+ );
+ }
+
+ renderCategoryHeading(category) {
+ const { activeEventListeners, expandedCategories } = this.props;
+ const { events } = category;
+
+ const expanded = expandedCategories.includes(category.name);
+ const checked = events.every(({ id }) => activeEventListeners.includes(id));
+ const indeterminate =
+ !checked && events.some(({ id }) => activeEventListeners.includes(id));
+
+ return div(
+ {
+ className: "event-listener-header",
+ },
+ button(
+ {
+ className: "event-listener-expand",
+ onClick: () => this.onCategoryToggle(category.name),
+ },
+ React.createElement(AccessibleImage, {
+ className: classnames("arrow", {
+ expanded,
+ }),
+ })
+ ),
+ label(
+ {
+ className: "event-listener-label",
+ },
+ input({
+ type: "checkbox",
+ value: category.name,
+ onChange: e => {
+ this.onCategoryClick(
+ category,
+ // Clicking an indeterminate checkbox should always have the
+ // effect of disabling any selected items.
+ indeterminate ? false : e.target.checked
+ );
+ },
+ checked: checked,
+ ref: el => el && (el.indeterminate = indeterminate),
+ }),
+ span(
+ {
+ className: "event-listener-category",
+ },
+ category.name
+ )
+ )
+ );
+ }
+
+ renderCategoryListing(category) {
+ const { expandedCategories } = this.props;
+
+ const expanded = expandedCategories.includes(category.name);
+ if (!expanded) {
+ return null;
+ }
+ return ul(
+ null,
+ category.events.map(event => {
+ return this.renderListenerEvent(event, category.name);
+ })
+ );
+ }
+
+ renderCategory(category) {
+ return span(
+ {
+ className: "category-label",
+ },
+ category,
+ " \u25B8 "
+ );
+ }
+
+ renderListenerEvent(event, category) {
+ const { activeEventListeners } = this.props;
+ const { searchText } = this.state;
+ return li(
+ {
+ className: "event-listener-event",
+ key: event.id,
+ },
+ label(
+ {
+ className: "event-listener-label",
+ },
+ input({
+ type: "checkbox",
+ value: event.id,
+ onChange: e => this.onEventTypeClick(event.id, e.target.checked),
+ checked: activeEventListeners.includes(event.id),
+ }),
+ span(
+ {
+ className: "event-listener-name",
+ },
+ searchText ? this.renderCategory(category) : null,
+ event.name
+ )
+ )
+ );
+ }
+
+ render() {
+ const { searchText } = this.state;
+ return div(
+ {
+ className: "event-listeners",
+ },
+ div(
+ {
+ className: "event-search-container",
+ },
+ this.renderSearchInput(),
+ this.renderClearSearchButton()
+ ),
+ div(
+ {
+ className: "event-listeners-content",
+ },
+ searchText
+ ? this.renderSearchResultsList()
+ : this.renderCategoriesList()
+ )
+ );
+ }
+}
+
+const mapStateToProps = state => ({
+ activeEventListeners: getActiveEventListeners(state),
+ categories: getEventListenerBreakpointTypes(state),
+ expandedCategories: getEventListenerExpanded(state),
+});
+
+export default connect(mapStateToProps, {
+ addEventListeners: actions.addEventListenerBreakpoints,
+ removeEventListeners: actions.removeEventListenerBreakpoints,
+ addEventListenerExpanded: actions.addEventListenerExpanded,
+ removeEventListenerExpanded: actions.removeEventListenerExpanded,
+})(EventListeners);
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Expressions.css b/devtools/client/debugger/src/components/SecondaryPanes/Expressions.css
new file mode 100644
index 0000000000..5dcf2622b5
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/Expressions.css
@@ -0,0 +1,171 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+.expression-input-form {
+ width: 100%;
+}
+
+.input-expression {
+ width: 100%;
+ margin: 0;
+ font-size: inherit;
+ border: 1px;
+ background-color: var(--theme-sidebar-background);
+ height: 24px;
+ padding-inline-start: 19px;
+ padding-inline-end: 12px;
+ color: var(--theme-body-color);
+ outline: 0;
+}
+
+@keyframes shake {
+ 0%,
+ 100% {
+ transform: translateX(0);
+ }
+ 20%,
+ 60% {
+ transform: translateX(-10px);
+ }
+ 40%,
+ 80% {
+ transform: translateX(10px);
+ }
+}
+
+.input-expression::placeholder {
+ color: var(--theme-text-color-alt);
+ opacity: 1;
+}
+
+.input-expression:focus {
+ cursor: text;
+}
+
+.expressions-list .expression-input-container {
+ height: var(--expression-item-height);
+}
+
+.expressions-list .input-expression {
+ /* Prevent vertical bounce when editing an existing Watch Expression */
+ height: 100%;
+}
+
+.expressions-list {
+ /* TODO: add normalize */
+ margin: 0;
+ padding: 4px 0px;
+ overflow-x: auto;
+}
+
+.expression-input-container {
+ display: flex;
+ border: 1px solid transparent;
+}
+
+.expression-input-container.focused {
+ border: 1px solid var(--theme-highlight-blue);
+}
+
+:root.theme-dark .expression-input-container.focused {
+ border: 1px solid var(--blue-50);
+}
+
+.expression-container {
+ padding-top: 3px;
+ padding-bottom: 3px;
+ padding-inline-start: 20px;
+ padding-inline-end: 12px;
+ width: 100%;
+ color: var(--theme-body-color);
+ background-color: var(--theme-body-background);
+ display: block;
+ position: relative;
+ overflow: hidden;
+}
+
+.expression-container > .tree {
+ width: 100%;
+ overflow: hidden;
+}
+
+.expression-container .tree .tree-node[aria-level="1"] {
+ padding-top: 0px;
+ /* keep line-height at 14px to prevent row from shifting upon expansion */
+ line-height: 14px;
+}
+
+.expression-container .tree-node[aria-level="1"] .object-label {
+ font-family: var(--monospace-font-family);
+}
+
+:root.theme-light .expression-container:hover {
+ background-color: var(--search-overlays-semitransparent);
+}
+
+:root.theme-dark .expression-container:hover {
+ background-color: var(--search-overlays-semitransparent);
+}
+
+.tree .tree-node:not(.focused):hover {
+ background-color: transparent;
+}
+
+.expression-container__close-btn {
+ position: absolute;
+ /* hiding button outside of row until hovered or focused */
+ top: -100px;
+}
+
+.expression-container:hover .expression-container__close-btn,
+.expression-container:focus-within .expression-container__close-btn,
+.expression-container__close-btn:focus-within {
+ top: 0;
+}
+
+.expression-content .object-node {
+ padding-inline-start: 0px;
+ cursor: default;
+}
+
+.expressions-list .tree.object-inspector .node.object-node {
+ max-width: calc(100% - 20px);
+ min-width: 0;
+ text-overflow: ellipsis;
+ overflow: hidden;
+}
+
+.expression-container__close-btn {
+ max-height: 16px;
+ padding-inline-start: 4px;
+}
+
+[dir="ltr"] .expression-container__close-btn {
+ right: 0;
+}
+
+[dir="rtl"] .expression-container__close-btn {
+ left: 0;
+}
+
+.expression-content {
+ display: flex;
+ align-items: center;
+ flex-grow: 1;
+ position: relative;
+}
+
+.expression-content .tree {
+ overflow: hidden;
+ flex-grow: 1;
+ line-height: 15px;
+}
+
+.expression-content .tree-node[data-expandable="false"][aria-level="1"] {
+ padding-inline-start: 0px;
+}
+
+.input-expression:not(:placeholder-shown) {
+ font-family: var(--monospace-font-family);
+}
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Expressions.js b/devtools/client/debugger/src/components/SecondaryPanes/Expressions.js
new file mode 100644
index 0000000000..be05c7327c
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/Expressions.js
@@ -0,0 +1,486 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React, { Component } from "devtools/client/shared/vendor/react";
+import {
+ div,
+ input,
+ li,
+ ul,
+ form,
+ datalist,
+ option,
+ span,
+} from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+import { connect } from "devtools/client/shared/vendor/react-redux";
+import { features } from "../../utils/prefs";
+import AccessibleImage from "../shared/AccessibleImage";
+
+import { objectInspector } from "devtools/client/shared/components/reps/index";
+
+import actions from "../../actions/index";
+import {
+ getExpressions,
+ getAutocompleteMatchset,
+ getSelectedSource,
+ isMapScopesEnabled,
+ getIsCurrentThreadPaused,
+ getSelectedFrame,
+ getOriginalFrameScope,
+ getCurrentThread,
+} from "../../selectors/index";
+import { getExpressionResultGripAndFront } from "../../utils/expressions";
+
+import { CloseButton } from "../shared/Button/index";
+
+const { debounce } = require("resource://devtools/shared/debounce.js");
+const classnames = require("resource://devtools/client/shared/classnames.js");
+
+const { ObjectInspector } = objectInspector;
+
+class Expressions extends Component {
+ constructor(props) {
+ super(props);
+
+ this.state = {
+ editing: false,
+ editIndex: -1,
+ inputValue: "",
+ focused: false,
+ };
+ }
+
+ static get propTypes() {
+ return {
+ addExpression: PropTypes.func.isRequired,
+ autocomplete: PropTypes.func.isRequired,
+ autocompleteMatches: PropTypes.array,
+ clearAutocomplete: PropTypes.func.isRequired,
+ deleteExpression: PropTypes.func.isRequired,
+ expressions: PropTypes.array.isRequired,
+ highlightDomElement: PropTypes.func.isRequired,
+ onExpressionAdded: PropTypes.func.isRequired,
+ openElementInInspector: PropTypes.func.isRequired,
+ openLink: PropTypes.any.isRequired,
+ showInput: PropTypes.bool.isRequired,
+ unHighlightDomElement: PropTypes.func.isRequired,
+ updateExpression: PropTypes.func.isRequired,
+ isOriginalVariableMappingDisabled: PropTypes.bool,
+ isLoadingOriginalVariables: PropTypes.bool,
+ };
+ }
+
+ componentDidMount() {
+ const { showInput } = this.props;
+
+ // Ensures that the input is focused when the "+"
+ // is clicked while the panel is collapsed
+ if (showInput && this._input) {
+ this._input.focus();
+ }
+ }
+
+ clear = () => {
+ this.setState(() => ({
+ editing: false,
+ editIndex: -1,
+ inputValue: "",
+ focused: false,
+ }));
+ };
+
+ // FIXME: https://bugzilla.mozilla.org/show_bug.cgi?id=1774507
+ UNSAFE_componentWillReceiveProps(nextProps) {
+ if (this.state.editing) {
+ this.clear();
+ }
+
+ // Ensures that the add watch expression input
+ // is no longer visible when the new watch expression is rendered
+ if (this.props.expressions.length < nextProps.expressions.length) {
+ this.hideInput();
+ }
+ }
+
+ shouldComponentUpdate(nextProps, nextState) {
+ const { editing, inputValue, focused } = this.state;
+ const {
+ expressions,
+ showInput,
+ autocompleteMatches,
+ isLoadingOriginalVariables,
+ isOriginalVariableMappingDisabled,
+ } = this.props;
+
+ return (
+ autocompleteMatches !== nextProps.autocompleteMatches ||
+ expressions !== nextProps.expressions ||
+ isLoadingOriginalVariables !== nextProps.isLoadingOriginalVariables ||
+ isOriginalVariableMappingDisabled !==
+ nextProps.isOriginalVariableMappingDisabled ||
+ editing !== nextState.editing ||
+ inputValue !== nextState.inputValue ||
+ nextProps.showInput !== showInput ||
+ focused !== nextState.focused
+ );
+ }
+
+ componentDidUpdate(prevProps, prevState) {
+ const _input = this._input;
+
+ if (!_input) {
+ return;
+ }
+
+ if (!prevState.editing && this.state.editing) {
+ _input.setSelectionRange(0, _input.value.length);
+ _input.focus();
+ } else if (this.props.showInput && !this.state.focused) {
+ _input.focus();
+ }
+ }
+
+ editExpression(expression, index) {
+ this.setState({
+ inputValue: expression.input,
+ editing: true,
+ editIndex: index,
+ });
+ }
+
+ deleteExpression(e, expression) {
+ e.stopPropagation();
+ const { deleteExpression } = this.props;
+ deleteExpression(expression);
+ }
+
+ handleChange = e => {
+ const { target } = e;
+ if (features.autocompleteExpression) {
+ this.findAutocompleteMatches(target.value, target.selectionStart);
+ }
+ this.setState({ inputValue: target.value });
+ };
+
+ findAutocompleteMatches = debounce((value, selectionStart) => {
+ const { autocomplete } = this.props;
+ autocomplete(value, selectionStart);
+ }, 250);
+
+ handleKeyDown = e => {
+ if (e.key === "Escape") {
+ this.clear();
+ }
+ };
+
+ hideInput = () => {
+ this.setState({ focused: false });
+ this.props.onExpressionAdded();
+ };
+
+ createElement = element => {
+ return document.createElement(element);
+ };
+
+ onFocus = () => {
+ this.setState({ focused: true });
+ };
+
+ onBlur() {
+ this.clear();
+ this.hideInput();
+ }
+
+ handleExistingSubmit = async (e, expression) => {
+ e.preventDefault();
+ e.stopPropagation();
+
+ this.props.updateExpression(this.state.inputValue, expression);
+ };
+
+ handleNewSubmit = async e => {
+ e.preventDefault();
+ e.stopPropagation();
+
+ await this.props.addExpression(this.state.inputValue);
+ this.setState({
+ editing: false,
+ editIndex: -1,
+ inputValue: "",
+ });
+
+ this.props.clearAutocomplete();
+ };
+
+ renderExpressionsNotification() {
+ const { isOriginalVariableMappingDisabled, isLoadingOriginalVariables } =
+ this.props;
+
+ if (isOriginalVariableMappingDisabled) {
+ return div(
+ {
+ className: "pane-info no-original-scopes-info",
+ "aria-role": "status",
+ },
+ span(
+ { className: "info icon" },
+ React.createElement(AccessibleImage, { className: "sourcemap" })
+ ),
+ span(
+ { className: "message" },
+ L10N.getStr("expressions.noOriginalScopes")
+ )
+ );
+ }
+
+ if (isLoadingOriginalVariables) {
+ return div(
+ { className: "pane-info" },
+ span(
+ { className: "info icon" },
+ React.createElement(AccessibleImage, { className: "loader" })
+ ),
+ span(
+ { className: "message" },
+ L10N.getStr("scopes.loadingOriginalScopes")
+ )
+ );
+ }
+ return null;
+ }
+
+ renderExpression = (expression, index) => {
+ const {
+ openLink,
+ openElementInInspector,
+ highlightDomElement,
+ unHighlightDomElement,
+ } = this.props;
+
+ const { editing, editIndex } = this.state;
+ const { input: _input, updating } = expression;
+ const isEditingExpr = editing && editIndex === index;
+ if (isEditingExpr) {
+ return this.renderExpressionEditInput(expression);
+ }
+
+ if (updating) {
+ return null;
+ }
+
+ const { expressionResultGrip, expressionResultFront } =
+ getExpressionResultGripAndFront(expression);
+
+ const root = {
+ name: expression.input,
+ path: _input,
+ contents: {
+ value: expressionResultGrip,
+ front: expressionResultFront,
+ },
+ };
+
+ return li(
+ {
+ className: "expression-container",
+ key: _input,
+ title: expression.input,
+ },
+ div(
+ {
+ className: "expression-content",
+ },
+ React.createElement(ObjectInspector, {
+ roots: [root],
+ autoExpandDepth: 0,
+ disableWrap: true,
+ openLink: openLink,
+ createElement: this.createElement,
+ onDoubleClick: (items, { depth }) => {
+ if (depth === 0) {
+ this.editExpression(expression, index);
+ }
+ },
+ onDOMNodeClick: grip => openElementInInspector(grip),
+ onInspectIconClick: grip => openElementInInspector(grip),
+ onDOMNodeMouseOver: grip => highlightDomElement(grip),
+ onDOMNodeMouseOut: grip => unHighlightDomElement(grip),
+ shouldRenderTooltip: true,
+ mayUseCustomFormatter: true,
+ }),
+ div(
+ {
+ className: "expression-container__close-btn",
+ },
+ React.createElement(CloseButton, {
+ handleClick: e => this.deleteExpression(e, expression),
+ tooltip: L10N.getStr("expressions.remove.tooltip"),
+ })
+ )
+ )
+ );
+ };
+
+ renderExpressions() {
+ const { expressions, showInput } = this.props;
+ return React.createElement(
+ React.Fragment,
+ null,
+ ul(
+ {
+ className: "pane expressions-list",
+ },
+ expressions.map(this.renderExpression)
+ ),
+ showInput && this.renderNewExpressionInput()
+ );
+ }
+
+ renderAutoCompleteMatches() {
+ if (!features.autocompleteExpression) {
+ return null;
+ }
+ const { autocompleteMatches } = this.props;
+ if (autocompleteMatches) {
+ return datalist(
+ {
+ id: "autocomplete-matches",
+ },
+ autocompleteMatches.map((match, index) => {
+ return option({
+ key: index,
+ value: match,
+ });
+ })
+ );
+ }
+ return datalist({
+ id: "autocomplete-matches",
+ });
+ }
+
+ renderNewExpressionInput() {
+ const { editing, inputValue, focused } = this.state;
+ return form(
+ {
+ className: classnames(
+ "expression-input-container expression-input-form",
+ { focused }
+ ),
+ onSubmit: this.handleNewSubmit,
+ },
+ input({
+ className: "input-expression",
+ type: "text",
+ placeholder: L10N.getStr("expressions.placeholder"),
+ onChange: this.handleChange,
+ onBlur: this.hideInput,
+ onKeyDown: this.handleKeyDown,
+ onFocus: this.onFocus,
+ value: !editing ? inputValue : "",
+ ref: c => (this._input = c),
+ ...(features.autocompleteExpression && {
+ list: "autocomplete-matches",
+ }),
+ }),
+ this.renderAutoCompleteMatches(),
+ input({
+ type: "submit",
+ style: {
+ display: "none",
+ },
+ })
+ );
+ }
+
+ renderExpressionEditInput(expression) {
+ const { inputValue, editing, focused } = this.state;
+ return form(
+ {
+ key: expression.input,
+ className: classnames(
+ "expression-input-container expression-input-form",
+ {
+ focused,
+ }
+ ),
+ onSubmit: e => this.handleExistingSubmit(e, expression),
+ },
+ input({
+ className: "input-expression",
+ type: "text",
+ onChange: this.handleChange,
+ onBlur: this.clear,
+ onKeyDown: this.handleKeyDown,
+ onFocus: this.onFocus,
+ value: editing ? inputValue : expression.input,
+ ref: c => (this._input = c),
+ ...(features.autocompleteExpression && {
+ list: "autocomplete-matches",
+ }),
+ }),
+ this.renderAutoCompleteMatches(),
+ input({
+ type: "submit",
+ style: {
+ display: "none",
+ },
+ })
+ );
+ }
+
+ render() {
+ const { expressions } = this.props;
+
+ return div(
+ { className: "pane" },
+ this.renderExpressionsNotification(),
+ expressions.length === 0
+ ? this.renderNewExpressionInput()
+ : this.renderExpressions()
+ );
+ }
+}
+
+const mapStateToProps = state => {
+ const selectedFrame = getSelectedFrame(state, getCurrentThread(state));
+ const selectedSource = getSelectedSource(state);
+ const isPaused = getIsCurrentThreadPaused(state);
+ const mapScopesEnabled = isMapScopesEnabled(state);
+ const expressions = getExpressions(state);
+
+ const selectedSourceIsNonPrettyPrintedOriginal =
+ selectedSource?.isOriginal && !selectedSource?.isPrettyPrinted;
+
+ let isOriginalVariableMappingDisabled, isLoadingOriginalVariables;
+
+ if (selectedSourceIsNonPrettyPrintedOriginal) {
+ isOriginalVariableMappingDisabled = isPaused && !mapScopesEnabled;
+ isLoadingOriginalVariables =
+ isPaused &&
+ mapScopesEnabled &&
+ !expressions.length &&
+ !getOriginalFrameScope(state, selectedFrame)?.scope;
+ }
+
+ return {
+ isOriginalVariableMappingDisabled,
+ isLoadingOriginalVariables,
+ autocompleteMatches: getAutocompleteMatchset(state),
+ expressions,
+ };
+};
+
+export default connect(mapStateToProps, {
+ autocomplete: actions.autocomplete,
+ clearAutocomplete: actions.clearAutocomplete,
+ addExpression: actions.addExpression,
+ updateExpression: actions.updateExpression,
+ deleteExpression: actions.deleteExpression,
+ openLink: actions.openLink,
+ openElementInInspector: actions.openElementInInspectorCommand,
+ highlightDomElement: actions.highlightDomElement,
+ unHighlightDomElement: actions.unHighlightDomElement,
+})(Expressions);
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Frames/Frame.js b/devtools/client/debugger/src/components/SecondaryPanes/Frames/Frame.js
new file mode 100644
index 0000000000..0c81d8afb4
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/Frames/Frame.js
@@ -0,0 +1,232 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React, { Component, memo } from "devtools/client/shared/vendor/react";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+
+import AccessibleImage from "../../shared/AccessibleImage";
+import { formatDisplayName } from "../../../utils/pause/frames/index";
+import { getFilename, getFileURL } from "../../../utils/source";
+import FrameIndent from "./FrameIndent";
+const classnames = require("resource://devtools/client/shared/classnames.js");
+
+function FrameTitle({ frame, options = {}, l10n }) {
+ const displayName = formatDisplayName(frame, options, l10n);
+ return React.createElement(
+ "span",
+ {
+ className: "title",
+ },
+ displayName
+ );
+}
+
+FrameTitle.propTypes = {
+ frame: PropTypes.object.isRequired,
+ options: PropTypes.object.isRequired,
+ l10n: PropTypes.object.isRequired,
+ showFrameContextMenu: PropTypes.func.isRequired,
+};
+
+function getFrameLocation(frame, shouldDisplayOriginalLocation) {
+ if (shouldDisplayOriginalLocation) {
+ return frame.location;
+ }
+ return frame.generatedLocation || frame.location;
+}
+const FrameLocation = memo(
+ ({ frame, displayFullUrl = false, shouldDisplayOriginalLocation }) => {
+ if (frame.library) {
+ return React.createElement(
+ "span",
+ {
+ className: "location",
+ },
+ frame.library,
+ React.createElement(AccessibleImage, {
+ className: `annotation-logo ${frame.library.toLowerCase()}`,
+ })
+ );
+ }
+ const location = getFrameLocation(frame, shouldDisplayOriginalLocation);
+ const filename = displayFullUrl
+ ? getFileURL(location.source, false)
+ : getFilename(location.source);
+ return React.createElement(
+ "span",
+ {
+ className: "location",
+ title: location.source.url,
+ },
+ React.createElement(
+ "span",
+ {
+ className: "filename",
+ },
+ filename
+ ),
+ ":",
+ React.createElement(
+ "span",
+ {
+ className: "line",
+ },
+ location.line
+ )
+ );
+ }
+);
+FrameLocation.displayName = "FrameLocation";
+
+FrameLocation.propTypes = {
+ frame: PropTypes.object.isRequired,
+ displayFullUrl: PropTypes.bool.isRequired,
+};
+
+export default class FrameComponent extends Component {
+ static defaultProps = {
+ hideLocation: false,
+ shouldMapDisplayName: true,
+ disableContextMenu: false,
+ };
+
+ static get propTypes() {
+ return {
+ disableContextMenu: PropTypes.bool.isRequired,
+ displayFullUrl: PropTypes.bool.isRequired,
+ frame: PropTypes.object.isRequired,
+ getFrameTitle: PropTypes.func,
+ hideLocation: PropTypes.bool.isRequired,
+ isInGroup: PropTypes.bool,
+ panel: PropTypes.oneOf(["debugger", "webconsole"]).isRequired,
+ selectFrame: PropTypes.func.isRequired,
+ selectedFrame: PropTypes.object,
+ shouldMapDisplayName: PropTypes.bool.isRequired,
+ shouldDisplayOriginalLocation: PropTypes.bool.isRequired,
+ showFrameContextMenu: PropTypes.func.isRequired,
+ };
+ }
+
+ get isSelectable() {
+ return this.props.panel == "webconsole";
+ }
+
+ get isDebugger() {
+ return this.props.panel == "debugger";
+ }
+
+ onContextMenu(event) {
+ event.stopPropagation();
+ event.preventDefault();
+
+ const { frame } = this.props;
+ this.props.showFrameContextMenu(event, frame);
+ }
+
+ onMouseDown(e, frame, selectedFrame) {
+ if (e.button !== 0) {
+ return;
+ }
+
+ this.props.selectFrame(frame);
+ }
+
+ onKeyUp(event, frame, selectedFrame) {
+ if (event.key != "Enter") {
+ return;
+ }
+
+ this.props.selectFrame(frame);
+ }
+
+ render() {
+ const {
+ frame,
+ selectedFrame,
+ hideLocation,
+ shouldMapDisplayName,
+ displayFullUrl,
+ getFrameTitle,
+ disableContextMenu,
+ shouldDisplayOriginalLocation,
+ isInGroup,
+ } = this.props;
+ const { l10n } = this.context;
+
+ const className = classnames("frame", {
+ selected: selectedFrame && selectedFrame.id === frame.id,
+ });
+
+ const location = getFrameLocation(frame, shouldDisplayOriginalLocation);
+ const title = getFrameTitle
+ ? getFrameTitle(`${getFileURL(location.source, false)}:${location.line}`)
+ : undefined;
+ return React.createElement(
+ "div",
+ {
+ role: "listitem",
+ key: frame.id,
+ className: className,
+ onMouseDown: e => this.onMouseDown(e, frame, selectedFrame),
+ onKeyUp: e => this.onKeyUp(e, frame, selectedFrame),
+ onContextMenu: disableContextMenu ? null : e => this.onContextMenu(e),
+ tabIndex: 0,
+ title: title,
+ },
+ frame.asyncCause &&
+ React.createElement(
+ "span",
+ {
+ className: "location-async-cause",
+ },
+ this.isSelectable && React.createElement(FrameIndent, null),
+ this.isDebugger
+ ? React.createElement(
+ "span",
+ {
+ className: "async-label",
+ },
+ frame.asyncCause
+ )
+ : l10n.getFormatStr("stacktrace.asyncStack", frame.asyncCause),
+ this.isSelectable &&
+ React.createElement("br", {
+ className: "clipboard-only",
+ })
+ ),
+ this.isSelectable &&
+ React.createElement(FrameIndent, {
+ indentLevel: isInGroup ? 2 : 1,
+ }),
+ React.createElement(FrameTitle, {
+ frame,
+ options: {
+ shouldMapDisplayName,
+ },
+ l10n,
+ }),
+ !hideLocation &&
+ React.createElement(
+ "span",
+ {
+ className: "clipboard-only",
+ },
+ " "
+ ),
+ !hideLocation &&
+ React.createElement(FrameLocation, {
+ frame,
+ displayFullUrl,
+ shouldDisplayOriginalLocation,
+ }),
+ this.isSelectable &&
+ React.createElement("br", {
+ className: "clipboard-only",
+ })
+ );
+ }
+}
+
+FrameComponent.displayName = "Frame";
+FrameComponent.contextTypes = { l10n: PropTypes.object };
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Frames/FrameIndent.js b/devtools/client/debugger/src/components/SecondaryPanes/Frames/FrameIndent.js
new file mode 100644
index 0000000000..7eee92ffd1
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/Frames/FrameIndent.js
@@ -0,0 +1,18 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React from "devtools/client/shared/vendor/react";
+
+export default function FrameIndent({ indentLevel = 1 } = {}) {
+ // \xA0 represents the non breakable space &nbsp;
+ const indentWidth = 4 * indentLevel;
+ const nonBreakableSpaces = "\xA0".repeat(indentWidth);
+ return React.createElement(
+ "span",
+ {
+ className: "frame-indent clipboard-only",
+ },
+ nonBreakableSpaces
+ );
+}
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Frames/Frames.css b/devtools/client/debugger/src/components/SecondaryPanes/Frames/Frames.css
new file mode 100644
index 0000000000..5f57f97e51
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/Frames/Frames.css
@@ -0,0 +1,185 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+.frames [role="list"] {
+ list-style: none;
+ margin: 0;
+ padding: 4px 0;
+}
+
+.frames [role="list"] [role="listitem"] {
+ padding-bottom: 2px;
+ overflow: hidden;
+ display: flex;
+ justify-content: space-between;
+ column-gap: 0.5em;
+ flex-direction: row;
+ align-items: center;
+ margin: 0;
+ max-width: 100%;
+ flex-wrap: wrap;
+}
+
+.frames [role="list"] [role="listitem"] * {
+ user-select: none;
+}
+
+.frames .badge {
+ flex-shrink: 0;
+ margin-inline-end: 10px;
+}
+
+.frames .location {
+ font-weight: normal;
+ margin: 0;
+ flex-grow: 1;
+ max-width: 100%;
+ overflow: hidden;
+ white-space: nowrap;
+ /* Trick to get the ellipsis at the start of the string */
+ text-overflow: ellipsis;
+ direction: rtl;
+}
+
+.call-stack-pane:dir(ltr) .frames .location {
+ padding-right: 10px;
+ text-align: right;
+}
+
+.call-stack-pane:dir(rtl) .frames .location {
+ padding-left: 10px;
+ text-align: left;
+}
+
+.call-stack-pane .location-async-cause {
+ color: var(--theme-comment);
+}
+
+.theme-light .frames .location {
+ color: var(--theme-comment);
+}
+
+:root.theme-dark .frames .location {
+ color: var(--theme-body-color);
+ opacity: 0.6;
+}
+
+.frames .title {
+ text-overflow: ellipsis;
+ overflow: hidden;
+ padding-inline-start: 10px;
+}
+
+.frames-group .title {
+ padding-inline-start: 40px;
+}
+
+.frames [role="list"] [role="listitem"]:hover,
+.frames [role="list"] [role="listitem"]:focus {
+ background-color: var(--theme-toolbar-background-alt);
+}
+
+.frames [role="list"] [role="listitem"]:hover .location-async-cause,
+.frames [role="list"] [role="listitem"]:focus .location-async-cause,
+.frames [role="list"] [role="listitem"]:hover .async-label,
+.frames [role="list"] [role="listitem"]:focus .async-label {
+ background-color: var(--theme-body-background);
+}
+
+.theme-dark .frames [role="list"] [role="listitem"]:focus,
+.theme-dark .frames [role="list"] [role="listitem"]:focus .async-label,
+.theme-dark .frames [role="list"] [role="listitem"]:focus .async-label {
+ background-color: var(--theme-tab-toolbar-background);
+}
+
+.frames [role="list"] [role="listitem"].selected,
+.frames [role="list"] [role="listitem"].selected .async-label {
+ background-color: var(--theme-selection-background);
+ color: white;
+}
+
+.frames [role="list"] [role="listitem"].selected i.annotation-logo svg path {
+ fill: white;
+}
+
+:root.theme-light .frames [role="list"] [role="listitem"].selected .location,
+:root.theme-dark .frames [role="list"] [role="listitem"].selected .location {
+ color: white;
+}
+
+.frames .show-more-container {
+ display: flex;
+ min-height: 24px;
+ padding: 4px 0;
+}
+
+.frames .show-more {
+ text-align: center;
+ padding: 8px 0px;
+ margin: 7px 10px 7px 7px;
+ border: 1px solid var(--theme-splitter-color);
+ background-color: var(--theme-tab-toolbar-background);
+ width: 100%;
+ font-size: inherit;
+ color: inherit;
+}
+
+.frames .show-more:hover {
+ background-color: var(--theme-toolbar-background-hover);
+}
+
+.frames .img.annotation-logo {
+ margin-inline-end: 4px;
+ background-color: currentColor;
+}
+
+/*
+ * We also show the library icon in locations, which are forced to RTL.
+ */
+.frames .location .img.annotation-logo {
+ margin-inline-start: 4px;
+}
+
+/* Some elements are added to the DOM only to be printed into the clipboard
+ when the user copy some elements. We don't want those elements to mess with
+ the layout so we put them outside of the screen
+*/
+.frames .clipboard-only {
+ position: absolute;
+ left: -9999px;
+}
+
+.call-stack-pane [role="listitem"] .location-async-cause {
+ height: 20px;
+ line-height: 20px;
+ color: var(--theme-icon-dimmed-color);
+ display: block;
+ z-index: 4;
+ position: relative;
+ padding-inline-start: 17px;
+ width: 100%;
+ pointer-events: none;
+}
+
+.frames-group .location-async-cause {
+ padding-inline-start: 47px;
+}
+
+.call-stack-pane [role="listitem"] .location-async-cause::after {
+ content: " ";
+ position: absolute;
+ left: 0;
+ z-index: -1;
+ height: 30px;
+ top: 50%;
+ width: 100%;
+ border-top: 1px solid var(--theme-tab-toolbar-background);;
+}
+
+.call-stack-pane .async-label {
+ z-index: 1;
+ background-color: var(--theme-sidebar-background);
+ padding: 0 3px;
+ display: inline-block;
+}
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Frames/Group.css b/devtools/client/debugger/src/components/SecondaryPanes/Frames/Group.css
new file mode 100644
index 0000000000..14dbea9954
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/Frames/Group.css
@@ -0,0 +1,38 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+.frames-group .group,
+.frames-group .group .location {
+ font-weight: 500;
+ cursor: default;
+ /*
+ * direction:rtl is set in Frames.css to overflow the location text from the
+ * start. Here we need to reset it in order to display the framework icon
+ * after the framework name.
+ */
+ direction: ltr;
+}
+
+.frames-group.expanded .group,
+.frames-group.expanded .group .location {
+ color: var(--theme-highlight-blue);
+}
+
+.frames-group .frames-list {
+ border-top: 1px solid var(--theme-splitter-color);
+ border-bottom: 1px solid var(--theme-splitter-color);
+}
+
+.frames-group.expanded .badge {
+ color: var(--theme-highlight-blue);
+}
+
+.frames-group .img.arrow {
+ margin-inline-start: -1px;
+ margin-inline-end: 4px;
+}
+
+.frames-group .group-description {
+ padding-inline-start: 6px;
+}
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Frames/Group.js b/devtools/client/debugger/src/components/SecondaryPanes/Frames/Group.js
new file mode 100644
index 0000000000..ab9f7073a7
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/Frames/Group.js
@@ -0,0 +1,191 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React, { Component } from "devtools/client/shared/vendor/react";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+
+import { getLibraryFromUrl } from "../../../utils/pause/frames/index";
+
+import AccessibleImage from "../../shared/AccessibleImage";
+import FrameComponent from "./Frame";
+import Badge from "../../shared/Badge";
+import FrameIndent from "./FrameIndent";
+
+const classnames = require("resource://devtools/client/shared/classnames.js");
+
+function FrameLocation({ frame, expanded }) {
+ const library = frame.library || getLibraryFromUrl(frame);
+ if (!library) {
+ return null;
+ }
+ const arrowClassName = classnames("arrow", {
+ expanded,
+ });
+ return React.createElement(
+ "span",
+ {
+ className: "group-description",
+ },
+ React.createElement(AccessibleImage, {
+ className: arrowClassName,
+ }),
+ React.createElement(AccessibleImage, {
+ className: `annotation-logo ${library.toLowerCase()}`,
+ }),
+ React.createElement(
+ "span",
+ {
+ className: "group-description-name",
+ },
+ library
+ )
+ );
+}
+
+FrameLocation.propTypes = {
+ expanded: PropTypes.any.isRequired,
+ frame: PropTypes.object.isRequired,
+};
+
+FrameLocation.displayName = "FrameLocation";
+
+export default class Group extends Component {
+ constructor(...args) {
+ super(...args);
+ this.state = { expanded: false };
+ }
+
+ static get propTypes() {
+ return {
+ disableContextMenu: PropTypes.bool.isRequired,
+ displayFullUrl: PropTypes.bool.isRequired,
+ getFrameTitle: PropTypes.func,
+ group: PropTypes.array.isRequired,
+ panel: PropTypes.oneOf(["debugger", "webconsole"]).isRequired,
+ selectFrame: PropTypes.func.isRequired,
+ selectLocation: PropTypes.func,
+ selectedFrame: PropTypes.object,
+ showFrameContextMenu: PropTypes.func.isRequired,
+ };
+ }
+
+ get isSelectable() {
+ return this.props.panel == "webconsole";
+ }
+
+ onContextMenu(event) {
+ const { group } = this.props;
+ const frame = group[0];
+ this.props.showFrameContextMenu(event, frame, true);
+ }
+
+ toggleFrames = event => {
+ event.stopPropagation();
+ this.setState(prevState => ({ expanded: !prevState.expanded }));
+ };
+
+ renderFrames() {
+ const {
+ group,
+ selectFrame,
+ selectLocation,
+ selectedFrame,
+ displayFullUrl,
+ getFrameTitle,
+ disableContextMenu,
+ panel,
+ showFrameContextMenu,
+ } = this.props;
+
+ const { expanded } = this.state;
+ if (!expanded) {
+ return null;
+ }
+
+ return React.createElement(
+ "div",
+ {
+ className: "frames-list",
+ },
+ group.map(frame =>
+ React.createElement(FrameComponent, {
+ frame: frame,
+ showFrameContextMenu: showFrameContextMenu,
+ hideLocation: true,
+ key: frame.id,
+ selectedFrame: selectedFrame,
+ selectFrame: selectFrame,
+ selectLocation: selectLocation,
+ shouldMapDisplayName: false,
+ displayFullUrl: displayFullUrl,
+ getFrameTitle: getFrameTitle,
+ disableContextMenu: disableContextMenu,
+ panel: panel,
+ isInGroup: true,
+ })
+ )
+ );
+ }
+
+ renderDescription() {
+ const { l10n } = this.context;
+ const { group } = this.props;
+ const { expanded } = this.state;
+
+ const frame = group[0];
+ const l10NEntry = expanded
+ ? "callStack.group.collapseTooltip"
+ : "callStack.group.expandTooltip";
+ const title = l10n.getFormatStr(l10NEntry, frame.library);
+
+ return React.createElement(
+ "div",
+ {
+ role: "listitem",
+ key: frame.id,
+ className: "group",
+ onClick: this.toggleFrames,
+ tabIndex: 0,
+ title,
+ },
+ this.isSelectable && React.createElement(FrameIndent, null),
+ React.createElement(FrameLocation, {
+ frame,
+ expanded,
+ }),
+ this.isSelectable &&
+ React.createElement(
+ "span",
+ {
+ className: "clipboard-only",
+ },
+ " "
+ ),
+ React.createElement(Badge, { badgeText: this.props.group.length }),
+ this.isSelectable &&
+ React.createElement("br", {
+ className: "clipboard-only",
+ })
+ );
+ }
+
+ render() {
+ const { expanded } = this.state;
+ const { disableContextMenu } = this.props;
+ return React.createElement(
+ "div",
+ {
+ className: classnames("frames-group", {
+ expanded,
+ }),
+ onContextMenu: disableContextMenu ? null : e => this.onContextMenu(e),
+ },
+ this.renderDescription(),
+ this.renderFrames()
+ );
+ }
+}
+
+Group.displayName = "Group";
+Group.contextTypes = { l10n: PropTypes.object };
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Frames/index.js b/devtools/client/debugger/src/components/SecondaryPanes/Frames/index.js
new file mode 100644
index 0000000000..d83b413a01
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/Frames/index.js
@@ -0,0 +1,220 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React, { Component } from "devtools/client/shared/vendor/react";
+import { connect } from "devtools/client/shared/vendor/react-redux";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+
+import FrameComponent from "./Frame";
+import Group from "./Group";
+
+import actions from "../../../actions/index";
+import { collapseFrames } from "../../../utils/pause/frames/index";
+
+import {
+ getFrameworkGroupingState,
+ getSelectedFrame,
+ getCurrentThreadFrames,
+ getCurrentThread,
+ getShouldSelectOriginalLocation,
+} from "../../../selectors/index";
+
+const NUM_FRAMES_SHOWN = 7;
+
+class Frames extends Component {
+ constructor(props) {
+ super(props);
+
+ this.state = {
+ showAllFrames: !!props.disableFrameTruncate,
+ };
+ }
+
+ static get propTypes() {
+ return {
+ disableContextMenu: PropTypes.bool.isRequired,
+ disableFrameTruncate: PropTypes.bool.isRequired,
+ displayFullUrl: PropTypes.bool.isRequired,
+ frames: PropTypes.array.isRequired,
+ frameworkGroupingOn: PropTypes.bool.isRequired,
+ getFrameTitle: PropTypes.func,
+ panel: PropTypes.oneOf(["debugger", "webconsole"]).isRequired,
+ selectFrame: PropTypes.func.isRequired,
+ selectLocation: PropTypes.func,
+ selectedFrame: PropTypes.object,
+ showFrameContextMenu: PropTypes.func,
+ shouldDisplayOriginalLocation: PropTypes.bool,
+ };
+ }
+
+ shouldComponentUpdate(nextProps, nextState) {
+ const {
+ frames,
+ selectedFrame,
+ frameworkGroupingOn,
+ shouldDisplayOriginalLocation,
+ } = this.props;
+ const { showAllFrames } = this.state;
+ return (
+ frames !== nextProps.frames ||
+ selectedFrame !== nextProps.selectedFrame ||
+ showAllFrames !== nextState.showAllFrames ||
+ frameworkGroupingOn !== nextProps.frameworkGroupingOn ||
+ shouldDisplayOriginalLocation !== nextProps.shouldDisplayOriginalLocation
+ );
+ }
+
+ toggleFramesDisplay = () => {
+ this.setState(prevState => ({
+ showAllFrames: !prevState.showAllFrames,
+ }));
+ };
+
+ collapseFrames(frames) {
+ const { frameworkGroupingOn } = this.props;
+ if (!frameworkGroupingOn) {
+ return frames;
+ }
+
+ return collapseFrames(frames);
+ }
+
+ truncateFrames(frames) {
+ const numFramesToShow = this.state.showAllFrames
+ ? frames.length
+ : NUM_FRAMES_SHOWN;
+
+ return frames.slice(0, numFramesToShow);
+ }
+
+ renderFrames(frames) {
+ const {
+ selectFrame,
+ selectLocation,
+ selectedFrame,
+ displayFullUrl,
+ getFrameTitle,
+ disableContextMenu,
+ panel,
+ shouldDisplayOriginalLocation,
+ showFrameContextMenu,
+ } = this.props;
+
+ const framesOrGroups = this.truncateFrames(this.collapseFrames(frames));
+
+ // We're not using a <ul> because it adds new lines before and after when
+ // the user copies the trace. Needed for the console which has several
+ // places where we don't want to have those new lines.
+ return React.createElement(
+ "div",
+ {
+ role: "list",
+ },
+ framesOrGroups.map(frameOrGroup =>
+ frameOrGroup.id
+ ? React.createElement(FrameComponent, {
+ frame: frameOrGroup,
+ showFrameContextMenu: showFrameContextMenu,
+ selectFrame: selectFrame,
+ selectLocation: selectLocation,
+ selectedFrame: selectedFrame,
+ shouldDisplayOriginalLocation: shouldDisplayOriginalLocation,
+ key: String(frameOrGroup.id),
+ displayFullUrl: displayFullUrl,
+ getFrameTitle: getFrameTitle,
+ disableContextMenu: disableContextMenu,
+ panel: panel,
+ })
+ : React.createElement(Group, {
+ group: frameOrGroup,
+ showFrameContextMenu: showFrameContextMenu,
+ selectFrame: selectFrame,
+ selectLocation: selectLocation,
+ selectedFrame: selectedFrame,
+ key: frameOrGroup[0].id,
+ displayFullUrl: displayFullUrl,
+ getFrameTitle: getFrameTitle,
+ disableContextMenu: disableContextMenu,
+ panel: panel,
+ })
+ )
+ );
+ }
+
+ renderToggleButton(frames) {
+ const { l10n } = this.context;
+ const buttonMessage = this.state.showAllFrames
+ ? l10n.getStr("callStack.collapse")
+ : l10n.getStr("callStack.expand");
+
+ frames = this.collapseFrames(frames);
+ if (frames.length <= NUM_FRAMES_SHOWN) {
+ return null;
+ }
+ return React.createElement(
+ "div",
+ {
+ className: "show-more-container",
+ },
+ React.createElement(
+ "button",
+ {
+ className: "show-more",
+ onClick: this.toggleFramesDisplay,
+ },
+ buttonMessage
+ )
+ );
+ }
+
+ render() {
+ const { frames, disableFrameTruncate } = this.props;
+
+ if (!frames) {
+ return React.createElement(
+ "div",
+ {
+ className: "pane frames",
+ },
+ React.createElement(
+ "div",
+ {
+ className: "pane-info empty",
+ },
+ L10N.getStr("callStack.notPaused")
+ )
+ );
+ }
+ return React.createElement(
+ "div",
+ {
+ className: "pane frames",
+ },
+ this.renderFrames(frames),
+ disableFrameTruncate ? null : this.renderToggleButton(frames)
+ );
+ }
+}
+
+Frames.contextTypes = { l10n: PropTypes.object };
+
+const mapStateToProps = state => ({
+ frames: getCurrentThreadFrames(state),
+ frameworkGroupingOn: getFrameworkGroupingState(state),
+ selectedFrame: getSelectedFrame(state, getCurrentThread(state)),
+ shouldDisplayOriginalLocation: getShouldSelectOriginalLocation(state),
+ disableFrameTruncate: false,
+ disableContextMenu: false,
+ displayFullUrl: false,
+});
+
+export default connect(mapStateToProps, {
+ selectFrame: actions.selectFrame,
+ selectLocation: actions.selectLocation,
+ showFrameContextMenu: actions.showFrameContextMenu,
+})(Frames);
+
+// Export the non-connected component in order to use it outside of the debugger
+// panel (e.g. console, netmonitor, …).
+export { Frames };
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Frames/moz.build b/devtools/client/debugger/src/components/SecondaryPanes/Frames/moz.build
new file mode 100644
index 0000000000..54c188ed98
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/Frames/moz.build
@@ -0,0 +1,13 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DIRS += []
+
+CompiledModules(
+ "Frame.js",
+ "FrameIndent.js",
+ "Group.js",
+ "index.js",
+)
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Frames/tests/Frame.spec.js b/devtools/client/debugger/src/components/SecondaryPanes/Frames/tests/Frame.spec.js
new file mode 100644
index 0000000000..e0dfc58a98
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/Frames/tests/Frame.spec.js
@@ -0,0 +1,110 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React from "devtools/client/shared/vendor/react";
+import { shallow, mount } from "enzyme";
+import Frame from "../Frame.js";
+import { makeMockFrame, makeMockSource } from "../../../../utils/test-mockup";
+
+function frameProperties(frame, selectedFrame, overrides = {}) {
+ return {
+ frame,
+ selectedFrame,
+ copyStackTrace: jest.fn(),
+ contextTypes: {},
+ selectFrame: jest.fn(),
+ selectLocation: jest.fn(),
+ toggleBlackBox: jest.fn(),
+ displayFullUrl: false,
+ frameworkGroupingOn: false,
+ panel: "webconsole",
+ toggleFrameworkGrouping: null,
+ restart: jest.fn(),
+ ...overrides,
+ };
+}
+
+function render(frameToSelect = {}, overrides = {}, propsOverrides = {}) {
+ const source = makeMockSource("foo-view.js");
+ const defaultFrame = makeMockFrame("1", source, undefined, 10, "renderFoo");
+
+ const frame = { ...defaultFrame, ...overrides };
+ const selectedFrame = { ...frame, ...frameToSelect };
+
+ const props = frameProperties(frame, selectedFrame, propsOverrides);
+ const component = shallow(React.createElement(Frame, props));
+ return { component, props };
+}
+
+describe("Frame", () => {
+ it("user frame", () => {
+ const { component } = render();
+ expect(component).toMatchSnapshot();
+ });
+
+ it("user frame (not selected)", () => {
+ const { component } = render({ id: "2" });
+ expect(component).toMatchSnapshot();
+ });
+
+ it("library frame", () => {
+ const source = makeMockSource("backbone.js");
+ const backboneFrame = {
+ ...makeMockFrame("3", source, undefined, 12, "updateEvents"),
+ library: "backbone",
+ };
+
+ const { component } = render({ id: "3" }, backboneFrame);
+ expect(component).toMatchSnapshot();
+ });
+
+ it("filename only", () => {
+ const source = makeMockSource(
+ "https://firefox.com/assets/src/js/foo-view.js"
+ );
+ const frame = makeMockFrame("1", source, undefined, 10, "renderFoo");
+
+ const props = frameProperties(frame, null);
+ const component = mount(React.createElement(Frame, props));
+ expect(component.text()).toBe("    renderFoo foo-view.js:10");
+ });
+
+ it("full URL", () => {
+ const url = `https://${"a".repeat(100)}.com/assets/src/js/foo-view.js`;
+ const source = makeMockSource(url);
+ const frame = makeMockFrame("1", source, undefined, 10, "renderFoo");
+
+ const props = frameProperties(frame, null, { displayFullUrl: true });
+ const component = mount(React.createElement(Frame, props));
+ expect(component.text()).toBe(`    renderFoo ${url}:10`);
+ });
+
+ it("renders asyncCause", () => {
+ const url = `https://example.com/async.js`;
+ const source = makeMockSource(url);
+ const frame = makeMockFrame("1", source, undefined, 10, "timeoutFn");
+ frame.asyncCause = "setTimeout handler";
+
+ const props = frameProperties(frame);
+ const component = mount(React.createElement(Frame, props), {
+ context: { l10n: L10N },
+ });
+ expect(component.find(".location-async-cause").text()).toBe(
+ `    (Async: setTimeout handler)`
+ );
+ });
+
+ it("getFrameTitle", () => {
+ const url = `https://${"a".repeat(100)}.com/assets/src/js/foo-view.js`;
+ const source = makeMockSource(url);
+ const frame = makeMockFrame("1", source, undefined, 10, "renderFoo");
+
+ const props = frameProperties(frame, null, {
+ getFrameTitle: x => `Jump to ${x}`,
+ });
+ const component = shallow(React.createElement(Frame, props));
+ expect(component.prop("title")).toBe(`Jump to ${url}:10`);
+ expect(component).toMatchSnapshot();
+ });
+});
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Frames/tests/Frames.spec.js b/devtools/client/debugger/src/components/SecondaryPanes/Frames/tests/Frames.spec.js
new file mode 100644
index 0000000000..240e455f75
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/Frames/tests/Frames.spec.js
@@ -0,0 +1,270 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React from "devtools/client/shared/vendor/react";
+import { mount, shallow } from "enzyme";
+import Frames from "../index.js";
+
+function render(overrides = {}) {
+ const defaultProps = {
+ frames: null,
+ selectedFrame: null,
+ frameworkGroupingOn: false,
+ toggleFrameworkGrouping: jest.fn(),
+ contextTypes: {},
+ selectFrame: jest.fn(),
+ toggleBlackBox: jest.fn(),
+ };
+
+ const props = { ...defaultProps, ...overrides };
+ const component = shallow(
+ React.createElement(Frames.WrappedComponent, props),
+ {
+ context: {
+ l10n: L10N,
+ },
+ }
+ );
+
+ return component;
+}
+
+describe("Frames", () => {
+ describe("Supports different number of frames", () => {
+ it("empty frames", () => {
+ const component = render();
+ expect(component).toMatchSnapshot();
+ expect(component.find(".show-more").exists()).toBeFalsy();
+ });
+
+ it("one frame", () => {
+ const frames = [{ id: 1 }];
+ const selectedFrame = frames[0];
+ const component = render({ frames, selectedFrame });
+
+ expect(component.find(".show-more").exists()).toBeFalsy();
+ expect(component).toMatchSnapshot();
+ });
+
+ it("toggling the show more button", () => {
+ const frames = [
+ { id: 1 },
+ { id: 2 },
+ { id: 3 },
+ { id: 4 },
+ { id: 5 },
+ { id: 6 },
+ { id: 7 },
+ { id: 8 },
+ { id: 9 },
+ { id: 10 },
+ ];
+
+ const selectedFrame = frames[0];
+ const component = render({ selectedFrame, frames });
+
+ const getToggleBtn = () => component.find(".show-more");
+ const getFrames = () => component.find("Frame");
+
+ expect(getToggleBtn().text()).toEqual("Expand rows");
+ expect(getFrames()).toHaveLength(7);
+
+ getToggleBtn().simulate("click");
+ expect(getToggleBtn().text()).toEqual("Collapse rows");
+ expect(getFrames()).toHaveLength(10);
+ expect(component).toMatchSnapshot();
+ });
+
+ it("disable frame truncation", () => {
+ const framesNumber = 20;
+ const frames = Array.from({ length: framesNumber }, (_, i) => ({
+ id: i + 1,
+ }));
+
+ const component = render({
+ frames,
+ disableFrameTruncate: true,
+ });
+
+ const getToggleBtn = () => component.find(".show-more");
+ const getFrames = () => component.find("Frame");
+
+ expect(getToggleBtn().exists()).toBeFalsy();
+ expect(getFrames()).toHaveLength(framesNumber);
+
+ expect(component).toMatchSnapshot();
+ });
+
+ it("shows the full URL", () => {
+ const frames = [
+ {
+ id: 1,
+ displayName: "renderFoo",
+ location: {
+ source: {
+ url: "http://myfile.com/mahscripts.js",
+ },
+ line: 55,
+ },
+ },
+ ];
+
+ const component = mount(
+ <Frames.WrappedComponent
+ frames={frames}
+ disableFrameTruncate={true}
+ displayFullUrl={true}
+ />
+ );
+ expect(component.text()).toBe(
+ "renderFoo http://myfile.com/mahscripts.js:55"
+ );
+ });
+
+ it("passes the getFrameTitle prop to the Frame component", () => {
+ const frames = [
+ {
+ id: 1,
+ displayName: "renderFoo",
+ location: {
+ source: {
+ url: "http://myfile.com/mahscripts.js",
+ },
+ line: 55,
+ },
+ },
+ ];
+ const getFrameTitle = () => {};
+ const component = render({ frames, getFrameTitle });
+
+ expect(component.find("Frame").prop("getFrameTitle")).toBe(getFrameTitle);
+ expect(component).toMatchSnapshot();
+ });
+
+ it("passes the getFrameTitle prop to the Group component", () => {
+ const frames = [
+ {
+ id: 1,
+ displayName: "renderFoo",
+ location: {
+ source: {
+ url: "http://myfile.com/mahscripts.js",
+ },
+ line: 55,
+ },
+ },
+ {
+ id: 2,
+ library: "back",
+ displayName: "a",
+ location: {
+ source: {
+ url: "http://myfile.com/back.js",
+ },
+ line: 55,
+ },
+ },
+ {
+ id: 3,
+ library: "back",
+ displayName: "b",
+ location: {
+ source: {
+ url: "http://myfile.com/back.js",
+ },
+ line: 55,
+ },
+ },
+ ];
+ const getFrameTitle = () => {};
+ const component = render({
+ frames,
+ getFrameTitle,
+ frameworkGroupingOn: true,
+ });
+
+ expect(component.find("Group").prop("getFrameTitle")).toBe(getFrameTitle);
+ });
+ });
+
+ describe("Library Frames", () => {
+ it("toggling framework frames", () => {
+ const frames = [
+ { id: 1, location: { source: {} } },
+ { id: 2, library: "back", location: { source: {} } },
+ { id: 3, library: "back", location: { source: {} } },
+ { id: 8, location: { source: {} } },
+ ];
+
+ const selectedFrame = frames[0];
+ const frameworkGroupingOn = false;
+ const component = render({ frames, frameworkGroupingOn, selectedFrame });
+
+ expect(component.find("Frame")).toHaveLength(4);
+ expect(component).toMatchSnapshot();
+
+ component.setProps({ frameworkGroupingOn: true });
+
+ expect(component.find("Frame")).toHaveLength(2);
+ expect(component).toMatchSnapshot();
+ });
+
+ it("groups all the Webpack-related frames", () => {
+ const frames = [
+ { id: "1-appFrame", location: { source: {} } },
+ {
+ id: "2-webpackBootstrapFrame",
+ location: {
+ source: {
+ url: "webpack:///webpack/bootstrap 01d88449ca6e9335a66f",
+ },
+ },
+ },
+ {
+ id: "3-webpackBundleFrame",
+ location: { source: { url: "https://foo.com/bundle.js" } },
+ },
+ {
+ id: "4-webpackBootstrapFrame",
+ location: {
+ source: {
+ url: "webpack:///webpack/bootstrap 01d88449ca6e9335a66f",
+ },
+ },
+ },
+ {
+ id: "5-webpackBundleFrame",
+ location: { source: { url: "https://foo.com/bundle.js" } },
+ },
+ ];
+ const selectedFrame = frames[0];
+ const frameworkGroupingOn = true;
+ const component = render({ frames, frameworkGroupingOn, selectedFrame });
+
+ expect(component).toMatchSnapshot();
+ });
+
+ it("selectable framework frames", () => {
+ const frames = [
+ { id: 1, location: { source: {} } },
+ { id: 2, library: "back", location: { source: {} } },
+ { id: 3, library: "back", location: { source: {} } },
+ { id: 8, location: { source: {} } },
+ ];
+
+ const selectedFrame = frames[0];
+
+ const component = render({
+ frames,
+ frameworkGroupingOn: false,
+ selectedFrame,
+ selectable: true,
+ });
+ expect(component).toMatchSnapshot();
+
+ component.setProps({ frameworkGroupingOn: true });
+ expect(component).toMatchSnapshot();
+ });
+ });
+});
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Frames/tests/Group.spec.js b/devtools/client/debugger/src/components/SecondaryPanes/Frames/tests/Group.spec.js
new file mode 100644
index 0000000000..8d08fa0aed
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/Frames/tests/Group.spec.js
@@ -0,0 +1,93 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React from "devtools/client/shared/vendor/react";
+import { shallow } from "enzyme";
+import Group from "../Group.js";
+import { makeMockFrame, makeMockSource } from "../../../../utils/test-mockup";
+
+function render(overrides = {}) {
+ const frame = { ...makeMockFrame(), displayName: "foo", library: "Back" };
+ const defaultProps = {
+ group: [frame],
+ selectedFrame: frame,
+ frameworkGroupingOn: true,
+ toggleFrameworkGrouping: jest.fn(),
+ selectFrame: jest.fn(),
+ selectLocation: jest.fn(),
+ copyStackTrace: jest.fn(),
+ toggleBlackBox: jest.fn(),
+ disableContextMenu: false,
+ displayFullUrl: false,
+ panel: "webconsole",
+ restart: jest.fn(),
+ };
+
+ const props = { ...defaultProps, ...overrides };
+ const component = shallow(React.createElement(Group, props), {
+ context: { l10n: L10N },
+ });
+ return { component, props };
+}
+
+describe("Group", () => {
+ it("displays a group", () => {
+ const { component } = render();
+ expect(component).toMatchSnapshot();
+ });
+
+ it("passes the getFrameTitle prop to the Frame components", () => {
+ const mahscripts = makeMockSource("http://myfile.com/mahscripts.js");
+ const back = makeMockSource("http://myfile.com/back.js");
+ const group = [
+ {
+ ...makeMockFrame("1", mahscripts, undefined, 55, "renderFoo"),
+ library: "Back",
+ },
+ {
+ ...makeMockFrame("2", back, undefined, 55, "a"),
+ library: "Back",
+ },
+ {
+ ...makeMockFrame("3", back, undefined, 55, "b"),
+ library: "Back",
+ },
+ ];
+ const getFrameTitle = () => {};
+ const { component } = render({ group, getFrameTitle });
+
+ component.setState({ expanded: true });
+
+ const frameComponents = component.find("Frame");
+ expect(frameComponents).toHaveLength(3);
+ frameComponents.forEach(node => {
+ expect(node.prop("getFrameTitle")).toBe(getFrameTitle);
+ });
+ expect(component).toMatchSnapshot();
+ });
+
+ it("renders group with anonymous functions", () => {
+ const mahscripts = makeMockSource("http://myfile.com/mahscripts.js");
+ const back = makeMockSource("http://myfile.com/back.js");
+ const group = [
+ {
+ ...makeMockFrame("1", mahscripts, undefined, 55),
+ library: "Back",
+ },
+ {
+ ...makeMockFrame("2", back, undefined, 55),
+ library: "Back",
+ },
+ {
+ ...makeMockFrame("3", back, undefined, 55),
+ library: "Back",
+ },
+ ];
+
+ const { component } = render({ group });
+ expect(component).toMatchSnapshot();
+ component.setState({ expanded: true });
+ expect(component).toMatchSnapshot();
+ });
+});
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Frames/tests/__snapshots__/Frame.spec.js.snap b/devtools/client/debugger/src/components/SecondaryPanes/Frames/tests/__snapshots__/Frame.spec.js.snap
new file mode 100644
index 0000000000..90a5b1f906
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/Frames/tests/__snapshots__/Frame.spec.js.snap
@@ -0,0 +1,1172 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`Frame getFrameTitle 1`] = `
+<div
+ className="frame"
+ key="1"
+ onContextMenu={[Function]}
+ onKeyUp={[Function]}
+ onMouseDown={[Function]}
+ role="listitem"
+ tabIndex={0}
+ title="Jump to https://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com/assets/src/js/foo-view.js:10"
+>
+ <FrameIndent
+ indentLevel={1}
+ />
+ <FrameTitle
+ frame={
+ Object {
+ "asyncCause": null,
+ "displayName": "renderFoo",
+ "generatedLocation": Object {
+ "column": undefined,
+ "line": 10,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "foo-view.js",
+ "group": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com",
+ "path": "/assets/src/js/foo-view.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "https://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com/assets/src/js/foo-view.js",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "foo-view.js",
+ "group": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com",
+ "path": "/assets/src/js/foo-view.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "https://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com/assets/src/js/foo-view.js",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "id": "1",
+ "index": 0,
+ "location": Object {
+ "column": undefined,
+ "line": 10,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "foo-view.js",
+ "group": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com",
+ "path": "/assets/src/js/foo-view.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "https://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com/assets/src/js/foo-view.js",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "foo-view.js",
+ "group": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com",
+ "path": "/assets/src/js/foo-view.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "https://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com/assets/src/js/foo-view.js",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "scope": Object {
+ "actor": "scope-actor",
+ "bindings": Object {
+ "arguments": Array [],
+ "variables": Object {},
+ },
+ "function": null,
+ "object": null,
+ "parent": null,
+ "scopeKind": "",
+ "type": "block",
+ },
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "foo-view.js",
+ "group": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com",
+ "path": "/assets/src/js/foo-view.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "https://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com/assets/src/js/foo-view.js",
+ },
+ "state": "on-stack",
+ "this": Object {},
+ "thread": "FakeThread",
+ "type": "call",
+ }
+ }
+ options={
+ Object {
+ "shouldMapDisplayName": true,
+ }
+ }
+ />
+ <span
+ className="clipboard-only"
+ >
+
+ </span>
+ <FrameLocation
+ displayFullUrl={false}
+ frame={
+ Object {
+ "asyncCause": null,
+ "displayName": "renderFoo",
+ "generatedLocation": Object {
+ "column": undefined,
+ "line": 10,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "foo-view.js",
+ "group": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com",
+ "path": "/assets/src/js/foo-view.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "https://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com/assets/src/js/foo-view.js",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "foo-view.js",
+ "group": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com",
+ "path": "/assets/src/js/foo-view.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "https://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com/assets/src/js/foo-view.js",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "id": "1",
+ "index": 0,
+ "location": Object {
+ "column": undefined,
+ "line": 10,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "foo-view.js",
+ "group": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com",
+ "path": "/assets/src/js/foo-view.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "https://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com/assets/src/js/foo-view.js",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "foo-view.js",
+ "group": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com",
+ "path": "/assets/src/js/foo-view.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "https://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com/assets/src/js/foo-view.js",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "scope": Object {
+ "actor": "scope-actor",
+ "bindings": Object {
+ "arguments": Array [],
+ "variables": Object {},
+ },
+ "function": null,
+ "object": null,
+ "parent": null,
+ "scopeKind": "",
+ "type": "block",
+ },
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "foo-view.js",
+ "group": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com",
+ "path": "/assets/src/js/foo-view.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "https://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com/assets/src/js/foo-view.js",
+ },
+ "state": "on-stack",
+ "this": Object {},
+ "thread": "FakeThread",
+ "type": "call",
+ }
+ }
+ />
+ <br
+ className="clipboard-only"
+ />
+</div>
+`;
+
+exports[`Frame library frame 1`] = `
+<div
+ className="frame selected"
+ key="3"
+ onContextMenu={[Function]}
+ onKeyUp={[Function]}
+ onMouseDown={[Function]}
+ role="listitem"
+ tabIndex={0}
+>
+ <FrameIndent
+ indentLevel={1}
+ />
+ <FrameTitle
+ frame={
+ Object {
+ "asyncCause": null,
+ "displayName": "updateEvents",
+ "generatedLocation": Object {
+ "column": undefined,
+ "line": 12,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "backbone.js",
+ "group": "",
+ "path": "backbone.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "backbone.js",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "backbone.js",
+ "group": "",
+ "path": "backbone.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "backbone.js",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "id": "3",
+ "index": 0,
+ "library": "backbone",
+ "location": Object {
+ "column": undefined,
+ "line": 12,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "backbone.js",
+ "group": "",
+ "path": "backbone.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "backbone.js",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "backbone.js",
+ "group": "",
+ "path": "backbone.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "backbone.js",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "scope": Object {
+ "actor": "scope-actor",
+ "bindings": Object {
+ "arguments": Array [],
+ "variables": Object {},
+ },
+ "function": null,
+ "object": null,
+ "parent": null,
+ "scopeKind": "",
+ "type": "block",
+ },
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "backbone.js",
+ "group": "",
+ "path": "backbone.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "backbone.js",
+ },
+ "state": "on-stack",
+ "this": Object {},
+ "thread": "FakeThread",
+ "type": "call",
+ }
+ }
+ options={
+ Object {
+ "shouldMapDisplayName": true,
+ }
+ }
+ />
+ <span
+ className="clipboard-only"
+ >
+
+ </span>
+ <FrameLocation
+ displayFullUrl={false}
+ frame={
+ Object {
+ "asyncCause": null,
+ "displayName": "updateEvents",
+ "generatedLocation": Object {
+ "column": undefined,
+ "line": 12,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "backbone.js",
+ "group": "",
+ "path": "backbone.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "backbone.js",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "backbone.js",
+ "group": "",
+ "path": "backbone.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "backbone.js",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "id": "3",
+ "index": 0,
+ "library": "backbone",
+ "location": Object {
+ "column": undefined,
+ "line": 12,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "backbone.js",
+ "group": "",
+ "path": "backbone.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "backbone.js",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "backbone.js",
+ "group": "",
+ "path": "backbone.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "backbone.js",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "scope": Object {
+ "actor": "scope-actor",
+ "bindings": Object {
+ "arguments": Array [],
+ "variables": Object {},
+ },
+ "function": null,
+ "object": null,
+ "parent": null,
+ "scopeKind": "",
+ "type": "block",
+ },
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "backbone.js",
+ "group": "",
+ "path": "backbone.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "backbone.js",
+ },
+ "state": "on-stack",
+ "this": Object {},
+ "thread": "FakeThread",
+ "type": "call",
+ }
+ }
+ />
+ <br
+ className="clipboard-only"
+ />
+</div>
+`;
+
+exports[`Frame user frame (not selected) 1`] = `
+<div
+ className="frame"
+ key="1"
+ onContextMenu={[Function]}
+ onKeyUp={[Function]}
+ onMouseDown={[Function]}
+ role="listitem"
+ tabIndex={0}
+>
+ <FrameIndent
+ indentLevel={1}
+ />
+ <FrameTitle
+ frame={
+ Object {
+ "asyncCause": null,
+ "displayName": "renderFoo",
+ "generatedLocation": Object {
+ "column": undefined,
+ "line": 10,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "foo-view.js",
+ "group": "",
+ "path": "foo-view.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "foo-view.js",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "foo-view.js",
+ "group": "",
+ "path": "foo-view.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "foo-view.js",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "id": "1",
+ "index": 0,
+ "location": Object {
+ "column": undefined,
+ "line": 10,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "foo-view.js",
+ "group": "",
+ "path": "foo-view.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "foo-view.js",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "foo-view.js",
+ "group": "",
+ "path": "foo-view.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "foo-view.js",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "scope": Object {
+ "actor": "scope-actor",
+ "bindings": Object {
+ "arguments": Array [],
+ "variables": Object {},
+ },
+ "function": null,
+ "object": null,
+ "parent": null,
+ "scopeKind": "",
+ "type": "block",
+ },
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "foo-view.js",
+ "group": "",
+ "path": "foo-view.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "foo-view.js",
+ },
+ "state": "on-stack",
+ "this": Object {},
+ "thread": "FakeThread",
+ "type": "call",
+ }
+ }
+ options={
+ Object {
+ "shouldMapDisplayName": true,
+ }
+ }
+ />
+ <span
+ className="clipboard-only"
+ >
+
+ </span>
+ <FrameLocation
+ displayFullUrl={false}
+ frame={
+ Object {
+ "asyncCause": null,
+ "displayName": "renderFoo",
+ "generatedLocation": Object {
+ "column": undefined,
+ "line": 10,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "foo-view.js",
+ "group": "",
+ "path": "foo-view.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "foo-view.js",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "foo-view.js",
+ "group": "",
+ "path": "foo-view.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "foo-view.js",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "id": "1",
+ "index": 0,
+ "location": Object {
+ "column": undefined,
+ "line": 10,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "foo-view.js",
+ "group": "",
+ "path": "foo-view.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "foo-view.js",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "foo-view.js",
+ "group": "",
+ "path": "foo-view.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "foo-view.js",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "scope": Object {
+ "actor": "scope-actor",
+ "bindings": Object {
+ "arguments": Array [],
+ "variables": Object {},
+ },
+ "function": null,
+ "object": null,
+ "parent": null,
+ "scopeKind": "",
+ "type": "block",
+ },
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "foo-view.js",
+ "group": "",
+ "path": "foo-view.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "foo-view.js",
+ },
+ "state": "on-stack",
+ "this": Object {},
+ "thread": "FakeThread",
+ "type": "call",
+ }
+ }
+ />
+ <br
+ className="clipboard-only"
+ />
+</div>
+`;
+
+exports[`Frame user frame 1`] = `
+<div
+ className="frame selected"
+ key="1"
+ onContextMenu={[Function]}
+ onKeyUp={[Function]}
+ onMouseDown={[Function]}
+ role="listitem"
+ tabIndex={0}
+>
+ <FrameIndent
+ indentLevel={1}
+ />
+ <FrameTitle
+ frame={
+ Object {
+ "asyncCause": null,
+ "displayName": "renderFoo",
+ "generatedLocation": Object {
+ "column": undefined,
+ "line": 10,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "foo-view.js",
+ "group": "",
+ "path": "foo-view.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "foo-view.js",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "foo-view.js",
+ "group": "",
+ "path": "foo-view.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "foo-view.js",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "id": "1",
+ "index": 0,
+ "location": Object {
+ "column": undefined,
+ "line": 10,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "foo-view.js",
+ "group": "",
+ "path": "foo-view.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "foo-view.js",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "foo-view.js",
+ "group": "",
+ "path": "foo-view.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "foo-view.js",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "scope": Object {
+ "actor": "scope-actor",
+ "bindings": Object {
+ "arguments": Array [],
+ "variables": Object {},
+ },
+ "function": null,
+ "object": null,
+ "parent": null,
+ "scopeKind": "",
+ "type": "block",
+ },
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "foo-view.js",
+ "group": "",
+ "path": "foo-view.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "foo-view.js",
+ },
+ "state": "on-stack",
+ "this": Object {},
+ "thread": "FakeThread",
+ "type": "call",
+ }
+ }
+ options={
+ Object {
+ "shouldMapDisplayName": true,
+ }
+ }
+ />
+ <span
+ className="clipboard-only"
+ >
+
+ </span>
+ <FrameLocation
+ displayFullUrl={false}
+ frame={
+ Object {
+ "asyncCause": null,
+ "displayName": "renderFoo",
+ "generatedLocation": Object {
+ "column": undefined,
+ "line": 10,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "foo-view.js",
+ "group": "",
+ "path": "foo-view.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "foo-view.js",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "foo-view.js",
+ "group": "",
+ "path": "foo-view.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "foo-view.js",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "id": "1",
+ "index": 0,
+ "location": Object {
+ "column": undefined,
+ "line": 10,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "foo-view.js",
+ "group": "",
+ "path": "foo-view.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "foo-view.js",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "foo-view.js",
+ "group": "",
+ "path": "foo-view.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "foo-view.js",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "scope": Object {
+ "actor": "scope-actor",
+ "bindings": Object {
+ "arguments": Array [],
+ "variables": Object {},
+ },
+ "function": null,
+ "object": null,
+ "parent": null,
+ "scopeKind": "",
+ "type": "block",
+ },
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "foo-view.js",
+ "group": "",
+ "path": "foo-view.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "foo-view.js",
+ },
+ "state": "on-stack",
+ "this": Object {},
+ "thread": "FakeThread",
+ "type": "call",
+ }
+ }
+ />
+ <br
+ className="clipboard-only"
+ />
+</div>
+`;
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Frames/tests/__snapshots__/Frames.spec.js.snap b/devtools/client/debugger/src/components/SecondaryPanes/Frames/tests/__snapshots__/Frames.spec.js.snap
new file mode 100644
index 0000000000..d1068b1aa0
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/Frames/tests/__snapshots__/Frames.spec.js.snap
@@ -0,0 +1,1001 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`Frames Library Frames groups all the Webpack-related frames 1`] = `
+<div
+ className="pane frames"
+>
+ <div
+ role="list"
+ >
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": "1-appFrame",
+ "location": Object {
+ "source": Object {},
+ },
+ }
+ }
+ hideLocation={false}
+ key="1-appFrame"
+ selectFrame={[MockFunction]}
+ selectedFrame={
+ Object {
+ "id": "1-appFrame",
+ "location": Object {
+ "source": Object {},
+ },
+ }
+ }
+ shouldMapDisplayName={true}
+ />
+ <Group
+ group={
+ Array [
+ Object {
+ "id": "2-webpackBootstrapFrame",
+ "location": Object {
+ "source": Object {
+ "url": "webpack:///webpack/bootstrap 01d88449ca6e9335a66f",
+ },
+ },
+ },
+ Object {
+ "id": "3-webpackBundleFrame",
+ "location": Object {
+ "source": Object {
+ "url": "https://foo.com/bundle.js",
+ },
+ },
+ },
+ Object {
+ "id": "4-webpackBootstrapFrame",
+ "location": Object {
+ "source": Object {
+ "url": "webpack:///webpack/bootstrap 01d88449ca6e9335a66f",
+ },
+ },
+ },
+ Object {
+ "id": "5-webpackBundleFrame",
+ "location": Object {
+ "source": Object {
+ "url": "https://foo.com/bundle.js",
+ },
+ },
+ },
+ ]
+ }
+ key="2-webpackBootstrapFrame"
+ selectFrame={[MockFunction]}
+ selectedFrame={
+ Object {
+ "id": "1-appFrame",
+ "location": Object {
+ "source": Object {},
+ },
+ }
+ }
+ />
+ </div>
+</div>
+`;
+
+exports[`Frames Library Frames selectable framework frames 1`] = `
+<div
+ className="pane frames"
+>
+ <div
+ role="list"
+ >
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 1,
+ "location": Object {
+ "source": Object {},
+ },
+ }
+ }
+ hideLocation={false}
+ key="1"
+ selectFrame={[MockFunction]}
+ selectedFrame={
+ Object {
+ "id": 1,
+ "location": Object {
+ "source": Object {},
+ },
+ }
+ }
+ shouldMapDisplayName={true}
+ />
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 2,
+ "library": "back",
+ "location": Object {
+ "source": Object {},
+ },
+ }
+ }
+ hideLocation={false}
+ key="2"
+ selectFrame={[MockFunction]}
+ selectedFrame={
+ Object {
+ "id": 1,
+ "location": Object {
+ "source": Object {},
+ },
+ }
+ }
+ shouldMapDisplayName={true}
+ />
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 3,
+ "library": "back",
+ "location": Object {
+ "source": Object {},
+ },
+ }
+ }
+ hideLocation={false}
+ key="3"
+ selectFrame={[MockFunction]}
+ selectedFrame={
+ Object {
+ "id": 1,
+ "location": Object {
+ "source": Object {},
+ },
+ }
+ }
+ shouldMapDisplayName={true}
+ />
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 8,
+ "location": Object {
+ "source": Object {},
+ },
+ }
+ }
+ hideLocation={false}
+ key="8"
+ selectFrame={[MockFunction]}
+ selectedFrame={
+ Object {
+ "id": 1,
+ "location": Object {
+ "source": Object {},
+ },
+ }
+ }
+ shouldMapDisplayName={true}
+ />
+ </div>
+</div>
+`;
+
+exports[`Frames Library Frames selectable framework frames 2`] = `
+<div
+ className="pane frames"
+>
+ <div
+ role="list"
+ >
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 1,
+ "location": Object {
+ "source": Object {},
+ },
+ }
+ }
+ hideLocation={false}
+ key="1"
+ selectFrame={[MockFunction]}
+ selectedFrame={
+ Object {
+ "id": 1,
+ "location": Object {
+ "source": Object {},
+ },
+ }
+ }
+ shouldMapDisplayName={true}
+ />
+ <Group
+ group={
+ Array [
+ Object {
+ "id": 2,
+ "library": "back",
+ "location": Object {
+ "source": Object {},
+ },
+ },
+ Object {
+ "id": 3,
+ "library": "back",
+ "location": Object {
+ "source": Object {},
+ },
+ },
+ ]
+ }
+ key="2"
+ selectFrame={[MockFunction]}
+ selectedFrame={
+ Object {
+ "id": 1,
+ "location": Object {
+ "source": Object {},
+ },
+ }
+ }
+ />
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 8,
+ "location": Object {
+ "source": Object {},
+ },
+ }
+ }
+ hideLocation={false}
+ key="8"
+ selectFrame={[MockFunction]}
+ selectedFrame={
+ Object {
+ "id": 1,
+ "location": Object {
+ "source": Object {},
+ },
+ }
+ }
+ shouldMapDisplayName={true}
+ />
+ </div>
+</div>
+`;
+
+exports[`Frames Library Frames toggling framework frames 1`] = `
+<div
+ className="pane frames"
+>
+ <div
+ role="list"
+ >
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 1,
+ "location": Object {
+ "source": Object {},
+ },
+ }
+ }
+ hideLocation={false}
+ key="1"
+ selectFrame={[MockFunction]}
+ selectedFrame={
+ Object {
+ "id": 1,
+ "location": Object {
+ "source": Object {},
+ },
+ }
+ }
+ shouldMapDisplayName={true}
+ />
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 2,
+ "library": "back",
+ "location": Object {
+ "source": Object {},
+ },
+ }
+ }
+ hideLocation={false}
+ key="2"
+ selectFrame={[MockFunction]}
+ selectedFrame={
+ Object {
+ "id": 1,
+ "location": Object {
+ "source": Object {},
+ },
+ }
+ }
+ shouldMapDisplayName={true}
+ />
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 3,
+ "library": "back",
+ "location": Object {
+ "source": Object {},
+ },
+ }
+ }
+ hideLocation={false}
+ key="3"
+ selectFrame={[MockFunction]}
+ selectedFrame={
+ Object {
+ "id": 1,
+ "location": Object {
+ "source": Object {},
+ },
+ }
+ }
+ shouldMapDisplayName={true}
+ />
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 8,
+ "location": Object {
+ "source": Object {},
+ },
+ }
+ }
+ hideLocation={false}
+ key="8"
+ selectFrame={[MockFunction]}
+ selectedFrame={
+ Object {
+ "id": 1,
+ "location": Object {
+ "source": Object {},
+ },
+ }
+ }
+ shouldMapDisplayName={true}
+ />
+ </div>
+</div>
+`;
+
+exports[`Frames Library Frames toggling framework frames 2`] = `
+<div
+ className="pane frames"
+>
+ <div
+ role="list"
+ >
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 1,
+ "location": Object {
+ "source": Object {},
+ },
+ }
+ }
+ hideLocation={false}
+ key="1"
+ selectFrame={[MockFunction]}
+ selectedFrame={
+ Object {
+ "id": 1,
+ "location": Object {
+ "source": Object {},
+ },
+ }
+ }
+ shouldMapDisplayName={true}
+ />
+ <Group
+ group={
+ Array [
+ Object {
+ "id": 2,
+ "library": "back",
+ "location": Object {
+ "source": Object {},
+ },
+ },
+ Object {
+ "id": 3,
+ "library": "back",
+ "location": Object {
+ "source": Object {},
+ },
+ },
+ ]
+ }
+ key="2"
+ selectFrame={[MockFunction]}
+ selectedFrame={
+ Object {
+ "id": 1,
+ "location": Object {
+ "source": Object {},
+ },
+ }
+ }
+ />
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 8,
+ "location": Object {
+ "source": Object {},
+ },
+ }
+ }
+ hideLocation={false}
+ key="8"
+ selectFrame={[MockFunction]}
+ selectedFrame={
+ Object {
+ "id": 1,
+ "location": Object {
+ "source": Object {},
+ },
+ }
+ }
+ shouldMapDisplayName={true}
+ />
+ </div>
+</div>
+`;
+
+exports[`Frames Supports different number of frames disable frame truncation 1`] = `
+<div
+ className="pane frames"
+>
+ <div
+ role="list"
+ >
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 1,
+ }
+ }
+ hideLocation={false}
+ key="1"
+ selectFrame={[MockFunction]}
+ selectedFrame={null}
+ shouldMapDisplayName={true}
+ />
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 2,
+ }
+ }
+ hideLocation={false}
+ key="2"
+ selectFrame={[MockFunction]}
+ selectedFrame={null}
+ shouldMapDisplayName={true}
+ />
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 3,
+ }
+ }
+ hideLocation={false}
+ key="3"
+ selectFrame={[MockFunction]}
+ selectedFrame={null}
+ shouldMapDisplayName={true}
+ />
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 4,
+ }
+ }
+ hideLocation={false}
+ key="4"
+ selectFrame={[MockFunction]}
+ selectedFrame={null}
+ shouldMapDisplayName={true}
+ />
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 5,
+ }
+ }
+ hideLocation={false}
+ key="5"
+ selectFrame={[MockFunction]}
+ selectedFrame={null}
+ shouldMapDisplayName={true}
+ />
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 6,
+ }
+ }
+ hideLocation={false}
+ key="6"
+ selectFrame={[MockFunction]}
+ selectedFrame={null}
+ shouldMapDisplayName={true}
+ />
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 7,
+ }
+ }
+ hideLocation={false}
+ key="7"
+ selectFrame={[MockFunction]}
+ selectedFrame={null}
+ shouldMapDisplayName={true}
+ />
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 8,
+ }
+ }
+ hideLocation={false}
+ key="8"
+ selectFrame={[MockFunction]}
+ selectedFrame={null}
+ shouldMapDisplayName={true}
+ />
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 9,
+ }
+ }
+ hideLocation={false}
+ key="9"
+ selectFrame={[MockFunction]}
+ selectedFrame={null}
+ shouldMapDisplayName={true}
+ />
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 10,
+ }
+ }
+ hideLocation={false}
+ key="10"
+ selectFrame={[MockFunction]}
+ selectedFrame={null}
+ shouldMapDisplayName={true}
+ />
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 11,
+ }
+ }
+ hideLocation={false}
+ key="11"
+ selectFrame={[MockFunction]}
+ selectedFrame={null}
+ shouldMapDisplayName={true}
+ />
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 12,
+ }
+ }
+ hideLocation={false}
+ key="12"
+ selectFrame={[MockFunction]}
+ selectedFrame={null}
+ shouldMapDisplayName={true}
+ />
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 13,
+ }
+ }
+ hideLocation={false}
+ key="13"
+ selectFrame={[MockFunction]}
+ selectedFrame={null}
+ shouldMapDisplayName={true}
+ />
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 14,
+ }
+ }
+ hideLocation={false}
+ key="14"
+ selectFrame={[MockFunction]}
+ selectedFrame={null}
+ shouldMapDisplayName={true}
+ />
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 15,
+ }
+ }
+ hideLocation={false}
+ key="15"
+ selectFrame={[MockFunction]}
+ selectedFrame={null}
+ shouldMapDisplayName={true}
+ />
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 16,
+ }
+ }
+ hideLocation={false}
+ key="16"
+ selectFrame={[MockFunction]}
+ selectedFrame={null}
+ shouldMapDisplayName={true}
+ />
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 17,
+ }
+ }
+ hideLocation={false}
+ key="17"
+ selectFrame={[MockFunction]}
+ selectedFrame={null}
+ shouldMapDisplayName={true}
+ />
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 18,
+ }
+ }
+ hideLocation={false}
+ key="18"
+ selectFrame={[MockFunction]}
+ selectedFrame={null}
+ shouldMapDisplayName={true}
+ />
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 19,
+ }
+ }
+ hideLocation={false}
+ key="19"
+ selectFrame={[MockFunction]}
+ selectedFrame={null}
+ shouldMapDisplayName={true}
+ />
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 20,
+ }
+ }
+ hideLocation={false}
+ key="20"
+ selectFrame={[MockFunction]}
+ selectedFrame={null}
+ shouldMapDisplayName={true}
+ />
+ </div>
+</div>
+`;
+
+exports[`Frames Supports different number of frames empty frames 1`] = `
+<div
+ className="pane frames"
+>
+ <div
+ className="pane-info empty"
+ >
+ Not paused
+ </div>
+</div>
+`;
+
+exports[`Frames Supports different number of frames one frame 1`] = `
+<div
+ className="pane frames"
+>
+ <div
+ role="list"
+ >
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 1,
+ }
+ }
+ hideLocation={false}
+ key="1"
+ selectFrame={[MockFunction]}
+ selectedFrame={
+ Object {
+ "id": 1,
+ }
+ }
+ shouldMapDisplayName={true}
+ />
+ </div>
+</div>
+`;
+
+exports[`Frames Supports different number of frames passes the getFrameTitle prop to the Frame component 1`] = `
+<div
+ className="pane frames"
+>
+ <div
+ role="list"
+ >
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "displayName": "renderFoo",
+ "id": 1,
+ "location": Object {
+ "line": 55,
+ "source": Object {
+ "url": "http://myfile.com/mahscripts.js",
+ },
+ },
+ }
+ }
+ getFrameTitle={[Function]}
+ hideLocation={false}
+ key="1"
+ selectFrame={[MockFunction]}
+ selectedFrame={null}
+ shouldMapDisplayName={true}
+ />
+ </div>
+</div>
+`;
+
+exports[`Frames Supports different number of frames toggling the show more button 1`] = `
+<div
+ className="pane frames"
+>
+ <div
+ role="list"
+ >
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 1,
+ }
+ }
+ hideLocation={false}
+ key="1"
+ selectFrame={[MockFunction]}
+ selectedFrame={
+ Object {
+ "id": 1,
+ }
+ }
+ shouldMapDisplayName={true}
+ />
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 2,
+ }
+ }
+ hideLocation={false}
+ key="2"
+ selectFrame={[MockFunction]}
+ selectedFrame={
+ Object {
+ "id": 1,
+ }
+ }
+ shouldMapDisplayName={true}
+ />
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 3,
+ }
+ }
+ hideLocation={false}
+ key="3"
+ selectFrame={[MockFunction]}
+ selectedFrame={
+ Object {
+ "id": 1,
+ }
+ }
+ shouldMapDisplayName={true}
+ />
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 4,
+ }
+ }
+ hideLocation={false}
+ key="4"
+ selectFrame={[MockFunction]}
+ selectedFrame={
+ Object {
+ "id": 1,
+ }
+ }
+ shouldMapDisplayName={true}
+ />
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 5,
+ }
+ }
+ hideLocation={false}
+ key="5"
+ selectFrame={[MockFunction]}
+ selectedFrame={
+ Object {
+ "id": 1,
+ }
+ }
+ shouldMapDisplayName={true}
+ />
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 6,
+ }
+ }
+ hideLocation={false}
+ key="6"
+ selectFrame={[MockFunction]}
+ selectedFrame={
+ Object {
+ "id": 1,
+ }
+ }
+ shouldMapDisplayName={true}
+ />
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 7,
+ }
+ }
+ hideLocation={false}
+ key="7"
+ selectFrame={[MockFunction]}
+ selectedFrame={
+ Object {
+ "id": 1,
+ }
+ }
+ shouldMapDisplayName={true}
+ />
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 8,
+ }
+ }
+ hideLocation={false}
+ key="8"
+ selectFrame={[MockFunction]}
+ selectedFrame={
+ Object {
+ "id": 1,
+ }
+ }
+ shouldMapDisplayName={true}
+ />
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 9,
+ }
+ }
+ hideLocation={false}
+ key="9"
+ selectFrame={[MockFunction]}
+ selectedFrame={
+ Object {
+ "id": 1,
+ }
+ }
+ shouldMapDisplayName={true}
+ />
+ <Frame
+ disableContextMenu={false}
+ frame={
+ Object {
+ "id": 10,
+ }
+ }
+ hideLocation={false}
+ key="10"
+ selectFrame={[MockFunction]}
+ selectedFrame={
+ Object {
+ "id": 1,
+ }
+ }
+ shouldMapDisplayName={true}
+ />
+ </div>
+ <div
+ className="show-more-container"
+ >
+ <button
+ className="show-more"
+ onClick={[Function]}
+ >
+ Collapse rows
+ </button>
+ </div>
+</div>
+`;
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Frames/tests/__snapshots__/Group.spec.js.snap b/devtools/client/debugger/src/components/SecondaryPanes/Frames/tests/__snapshots__/Group.spec.js.snap
new file mode 100644
index 0000000000..97c4c2ad1a
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/Frames/tests/__snapshots__/Group.spec.js.snap
@@ -0,0 +1,2286 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`Group displays a group 1`] = `
+<div
+ className="frames-group"
+ onContextMenu={[Function]}
+>
+ <div
+ className="group"
+ key="frame"
+ onClick={[Function]}
+ role="listitem"
+ tabIndex={0}
+ title="Show Back frames"
+ >
+ <FrameIndent />
+ <FrameLocation
+ expanded={false}
+ frame={
+ Object {
+ "asyncCause": null,
+ "displayName": "foo",
+ "generatedLocation": Object {
+ "column": undefined,
+ "line": 4,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "id": "frame",
+ "index": 0,
+ "library": "Back",
+ "location": Object {
+ "column": undefined,
+ "line": 4,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "scope": Object {
+ "actor": "scope-actor",
+ "bindings": Object {
+ "arguments": Array [],
+ "variables": Object {},
+ },
+ "function": null,
+ "object": null,
+ "parent": null,
+ "scopeKind": "",
+ "type": "block",
+ },
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ "state": "on-stack",
+ "this": Object {},
+ "thread": "FakeThread",
+ "type": "call",
+ }
+ }
+ />
+ <span
+ className="clipboard-only"
+ >
+
+ </span>
+ <Badge
+ badgeText={1}
+ />
+ <br
+ className="clipboard-only"
+ />
+ </div>
+</div>
+`;
+
+exports[`Group passes the getFrameTitle prop to the Frame components 1`] = `
+<div
+ className="frames-group expanded"
+ onContextMenu={[Function]}
+>
+ <div
+ className="group"
+ key="1"
+ onClick={[Function]}
+ role="listitem"
+ tabIndex={0}
+ title="Collapse Back frames"
+ >
+ <FrameIndent />
+ <FrameLocation
+ expanded={true}
+ frame={
+ Object {
+ "asyncCause": null,
+ "displayName": "renderFoo",
+ "generatedLocation": Object {
+ "column": undefined,
+ "line": 55,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "mahscripts.js",
+ "group": "myfile.com",
+ "path": "/mahscripts.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/mahscripts.js",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "mahscripts.js",
+ "group": "myfile.com",
+ "path": "/mahscripts.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/mahscripts.js",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "id": "1",
+ "index": 0,
+ "library": "Back",
+ "location": Object {
+ "column": undefined,
+ "line": 55,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "mahscripts.js",
+ "group": "myfile.com",
+ "path": "/mahscripts.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/mahscripts.js",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "mahscripts.js",
+ "group": "myfile.com",
+ "path": "/mahscripts.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/mahscripts.js",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "scope": Object {
+ "actor": "scope-actor",
+ "bindings": Object {
+ "arguments": Array [],
+ "variables": Object {},
+ },
+ "function": null,
+ "object": null,
+ "parent": null,
+ "scopeKind": "",
+ "type": "block",
+ },
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "mahscripts.js",
+ "group": "myfile.com",
+ "path": "/mahscripts.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/mahscripts.js",
+ },
+ "state": "on-stack",
+ "this": Object {},
+ "thread": "FakeThread",
+ "type": "call",
+ }
+ }
+ />
+ <span
+ className="clipboard-only"
+ >
+
+ </span>
+ <Badge
+ badgeText={3}
+ />
+ <br
+ className="clipboard-only"
+ />
+ </div>
+ <div
+ className="frames-list"
+ >
+ <Frame
+ disableContextMenu={false}
+ displayFullUrl={false}
+ frame={
+ Object {
+ "asyncCause": null,
+ "displayName": "renderFoo",
+ "generatedLocation": Object {
+ "column": undefined,
+ "line": 55,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "mahscripts.js",
+ "group": "myfile.com",
+ "path": "/mahscripts.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/mahscripts.js",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "mahscripts.js",
+ "group": "myfile.com",
+ "path": "/mahscripts.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/mahscripts.js",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "id": "1",
+ "index": 0,
+ "library": "Back",
+ "location": Object {
+ "column": undefined,
+ "line": 55,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "mahscripts.js",
+ "group": "myfile.com",
+ "path": "/mahscripts.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/mahscripts.js",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "mahscripts.js",
+ "group": "myfile.com",
+ "path": "/mahscripts.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/mahscripts.js",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "scope": Object {
+ "actor": "scope-actor",
+ "bindings": Object {
+ "arguments": Array [],
+ "variables": Object {},
+ },
+ "function": null,
+ "object": null,
+ "parent": null,
+ "scopeKind": "",
+ "type": "block",
+ },
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "mahscripts.js",
+ "group": "myfile.com",
+ "path": "/mahscripts.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/mahscripts.js",
+ },
+ "state": "on-stack",
+ "this": Object {},
+ "thread": "FakeThread",
+ "type": "call",
+ }
+ }
+ getFrameTitle={[Function]}
+ hideLocation={true}
+ isInGroup={true}
+ key="1"
+ panel="webconsole"
+ selectFrame={[MockFunction]}
+ selectLocation={[MockFunction]}
+ selectedFrame={
+ Object {
+ "asyncCause": null,
+ "displayName": "foo",
+ "generatedLocation": Object {
+ "column": undefined,
+ "line": 4,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "id": "frame",
+ "index": 0,
+ "library": "Back",
+ "location": Object {
+ "column": undefined,
+ "line": 4,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "scope": Object {
+ "actor": "scope-actor",
+ "bindings": Object {
+ "arguments": Array [],
+ "variables": Object {},
+ },
+ "function": null,
+ "object": null,
+ "parent": null,
+ "scopeKind": "",
+ "type": "block",
+ },
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ "state": "on-stack",
+ "this": Object {},
+ "thread": "FakeThread",
+ "type": "call",
+ }
+ }
+ shouldMapDisplayName={false}
+ />
+ <Frame
+ disableContextMenu={false}
+ displayFullUrl={false}
+ frame={
+ Object {
+ "asyncCause": null,
+ "displayName": "a",
+ "generatedLocation": Object {
+ "column": undefined,
+ "line": 55,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "back.js",
+ "group": "myfile.com",
+ "path": "/back.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/back.js",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "back.js",
+ "group": "myfile.com",
+ "path": "/back.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/back.js",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "id": "2",
+ "index": 0,
+ "library": "Back",
+ "location": Object {
+ "column": undefined,
+ "line": 55,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "back.js",
+ "group": "myfile.com",
+ "path": "/back.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/back.js",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "back.js",
+ "group": "myfile.com",
+ "path": "/back.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/back.js",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "scope": Object {
+ "actor": "scope-actor",
+ "bindings": Object {
+ "arguments": Array [],
+ "variables": Object {},
+ },
+ "function": null,
+ "object": null,
+ "parent": null,
+ "scopeKind": "",
+ "type": "block",
+ },
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "back.js",
+ "group": "myfile.com",
+ "path": "/back.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/back.js",
+ },
+ "state": "on-stack",
+ "this": Object {},
+ "thread": "FakeThread",
+ "type": "call",
+ }
+ }
+ getFrameTitle={[Function]}
+ hideLocation={true}
+ isInGroup={true}
+ key="2"
+ panel="webconsole"
+ selectFrame={[MockFunction]}
+ selectLocation={[MockFunction]}
+ selectedFrame={
+ Object {
+ "asyncCause": null,
+ "displayName": "foo",
+ "generatedLocation": Object {
+ "column": undefined,
+ "line": 4,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "id": "frame",
+ "index": 0,
+ "library": "Back",
+ "location": Object {
+ "column": undefined,
+ "line": 4,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "scope": Object {
+ "actor": "scope-actor",
+ "bindings": Object {
+ "arguments": Array [],
+ "variables": Object {},
+ },
+ "function": null,
+ "object": null,
+ "parent": null,
+ "scopeKind": "",
+ "type": "block",
+ },
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ "state": "on-stack",
+ "this": Object {},
+ "thread": "FakeThread",
+ "type": "call",
+ }
+ }
+ shouldMapDisplayName={false}
+ />
+ <Frame
+ disableContextMenu={false}
+ displayFullUrl={false}
+ frame={
+ Object {
+ "asyncCause": null,
+ "displayName": "b",
+ "generatedLocation": Object {
+ "column": undefined,
+ "line": 55,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "back.js",
+ "group": "myfile.com",
+ "path": "/back.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/back.js",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "back.js",
+ "group": "myfile.com",
+ "path": "/back.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/back.js",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "id": "3",
+ "index": 0,
+ "library": "Back",
+ "location": Object {
+ "column": undefined,
+ "line": 55,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "back.js",
+ "group": "myfile.com",
+ "path": "/back.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/back.js",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "back.js",
+ "group": "myfile.com",
+ "path": "/back.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/back.js",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "scope": Object {
+ "actor": "scope-actor",
+ "bindings": Object {
+ "arguments": Array [],
+ "variables": Object {},
+ },
+ "function": null,
+ "object": null,
+ "parent": null,
+ "scopeKind": "",
+ "type": "block",
+ },
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "back.js",
+ "group": "myfile.com",
+ "path": "/back.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/back.js",
+ },
+ "state": "on-stack",
+ "this": Object {},
+ "thread": "FakeThread",
+ "type": "call",
+ }
+ }
+ getFrameTitle={[Function]}
+ hideLocation={true}
+ isInGroup={true}
+ key="3"
+ panel="webconsole"
+ selectFrame={[MockFunction]}
+ selectLocation={[MockFunction]}
+ selectedFrame={
+ Object {
+ "asyncCause": null,
+ "displayName": "foo",
+ "generatedLocation": Object {
+ "column": undefined,
+ "line": 4,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "id": "frame",
+ "index": 0,
+ "library": "Back",
+ "location": Object {
+ "column": undefined,
+ "line": 4,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "scope": Object {
+ "actor": "scope-actor",
+ "bindings": Object {
+ "arguments": Array [],
+ "variables": Object {},
+ },
+ "function": null,
+ "object": null,
+ "parent": null,
+ "scopeKind": "",
+ "type": "block",
+ },
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ "state": "on-stack",
+ "this": Object {},
+ "thread": "FakeThread",
+ "type": "call",
+ }
+ }
+ shouldMapDisplayName={false}
+ />
+ </div>
+</div>
+`;
+
+exports[`Group renders group with anonymous functions 1`] = `
+<div
+ className="frames-group"
+ onContextMenu={[Function]}
+>
+ <div
+ className="group"
+ key="1"
+ onClick={[Function]}
+ role="listitem"
+ tabIndex={0}
+ title="Show Back frames"
+ >
+ <FrameIndent />
+ <FrameLocation
+ expanded={false}
+ frame={
+ Object {
+ "asyncCause": null,
+ "displayName": "display-1",
+ "generatedLocation": Object {
+ "column": undefined,
+ "line": 55,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "mahscripts.js",
+ "group": "myfile.com",
+ "path": "/mahscripts.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/mahscripts.js",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "mahscripts.js",
+ "group": "myfile.com",
+ "path": "/mahscripts.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/mahscripts.js",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "id": "1",
+ "index": 0,
+ "library": "Back",
+ "location": Object {
+ "column": undefined,
+ "line": 55,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "mahscripts.js",
+ "group": "myfile.com",
+ "path": "/mahscripts.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/mahscripts.js",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "mahscripts.js",
+ "group": "myfile.com",
+ "path": "/mahscripts.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/mahscripts.js",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "scope": Object {
+ "actor": "scope-actor",
+ "bindings": Object {
+ "arguments": Array [],
+ "variables": Object {},
+ },
+ "function": null,
+ "object": null,
+ "parent": null,
+ "scopeKind": "",
+ "type": "block",
+ },
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "mahscripts.js",
+ "group": "myfile.com",
+ "path": "/mahscripts.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/mahscripts.js",
+ },
+ "state": "on-stack",
+ "this": Object {},
+ "thread": "FakeThread",
+ "type": "call",
+ }
+ }
+ />
+ <span
+ className="clipboard-only"
+ >
+
+ </span>
+ <Badge
+ badgeText={3}
+ />
+ <br
+ className="clipboard-only"
+ />
+ </div>
+</div>
+`;
+
+exports[`Group renders group with anonymous functions 2`] = `
+<div
+ className="frames-group expanded"
+ onContextMenu={[Function]}
+>
+ <div
+ className="group"
+ key="1"
+ onClick={[Function]}
+ role="listitem"
+ tabIndex={0}
+ title="Collapse Back frames"
+ >
+ <FrameIndent />
+ <FrameLocation
+ expanded={true}
+ frame={
+ Object {
+ "asyncCause": null,
+ "displayName": "display-1",
+ "generatedLocation": Object {
+ "column": undefined,
+ "line": 55,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "mahscripts.js",
+ "group": "myfile.com",
+ "path": "/mahscripts.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/mahscripts.js",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "mahscripts.js",
+ "group": "myfile.com",
+ "path": "/mahscripts.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/mahscripts.js",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "id": "1",
+ "index": 0,
+ "library": "Back",
+ "location": Object {
+ "column": undefined,
+ "line": 55,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "mahscripts.js",
+ "group": "myfile.com",
+ "path": "/mahscripts.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/mahscripts.js",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "mahscripts.js",
+ "group": "myfile.com",
+ "path": "/mahscripts.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/mahscripts.js",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "scope": Object {
+ "actor": "scope-actor",
+ "bindings": Object {
+ "arguments": Array [],
+ "variables": Object {},
+ },
+ "function": null,
+ "object": null,
+ "parent": null,
+ "scopeKind": "",
+ "type": "block",
+ },
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "mahscripts.js",
+ "group": "myfile.com",
+ "path": "/mahscripts.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/mahscripts.js",
+ },
+ "state": "on-stack",
+ "this": Object {},
+ "thread": "FakeThread",
+ "type": "call",
+ }
+ }
+ />
+ <span
+ className="clipboard-only"
+ >
+
+ </span>
+ <Badge
+ badgeText={3}
+ />
+ <br
+ className="clipboard-only"
+ />
+ </div>
+ <div
+ className="frames-list"
+ >
+ <Frame
+ disableContextMenu={false}
+ displayFullUrl={false}
+ frame={
+ Object {
+ "asyncCause": null,
+ "displayName": "display-1",
+ "generatedLocation": Object {
+ "column": undefined,
+ "line": 55,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "mahscripts.js",
+ "group": "myfile.com",
+ "path": "/mahscripts.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/mahscripts.js",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "mahscripts.js",
+ "group": "myfile.com",
+ "path": "/mahscripts.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/mahscripts.js",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "id": "1",
+ "index": 0,
+ "library": "Back",
+ "location": Object {
+ "column": undefined,
+ "line": 55,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "mahscripts.js",
+ "group": "myfile.com",
+ "path": "/mahscripts.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/mahscripts.js",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "mahscripts.js",
+ "group": "myfile.com",
+ "path": "/mahscripts.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/mahscripts.js",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "scope": Object {
+ "actor": "scope-actor",
+ "bindings": Object {
+ "arguments": Array [],
+ "variables": Object {},
+ },
+ "function": null,
+ "object": null,
+ "parent": null,
+ "scopeKind": "",
+ "type": "block",
+ },
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "mahscripts.js",
+ "group": "myfile.com",
+ "path": "/mahscripts.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/mahscripts.js",
+ },
+ "state": "on-stack",
+ "this": Object {},
+ "thread": "FakeThread",
+ "type": "call",
+ }
+ }
+ hideLocation={true}
+ isInGroup={true}
+ key="1"
+ panel="webconsole"
+ selectFrame={[MockFunction]}
+ selectLocation={[MockFunction]}
+ selectedFrame={
+ Object {
+ "asyncCause": null,
+ "displayName": "foo",
+ "generatedLocation": Object {
+ "column": undefined,
+ "line": 4,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "id": "frame",
+ "index": 0,
+ "library": "Back",
+ "location": Object {
+ "column": undefined,
+ "line": 4,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "scope": Object {
+ "actor": "scope-actor",
+ "bindings": Object {
+ "arguments": Array [],
+ "variables": Object {},
+ },
+ "function": null,
+ "object": null,
+ "parent": null,
+ "scopeKind": "",
+ "type": "block",
+ },
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ "state": "on-stack",
+ "this": Object {},
+ "thread": "FakeThread",
+ "type": "call",
+ }
+ }
+ shouldMapDisplayName={false}
+ />
+ <Frame
+ disableContextMenu={false}
+ displayFullUrl={false}
+ frame={
+ Object {
+ "asyncCause": null,
+ "displayName": "display-2",
+ "generatedLocation": Object {
+ "column": undefined,
+ "line": 55,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "back.js",
+ "group": "myfile.com",
+ "path": "/back.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/back.js",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "back.js",
+ "group": "myfile.com",
+ "path": "/back.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/back.js",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "id": "2",
+ "index": 0,
+ "library": "Back",
+ "location": Object {
+ "column": undefined,
+ "line": 55,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "back.js",
+ "group": "myfile.com",
+ "path": "/back.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/back.js",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "back.js",
+ "group": "myfile.com",
+ "path": "/back.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/back.js",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "scope": Object {
+ "actor": "scope-actor",
+ "bindings": Object {
+ "arguments": Array [],
+ "variables": Object {},
+ },
+ "function": null,
+ "object": null,
+ "parent": null,
+ "scopeKind": "",
+ "type": "block",
+ },
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "back.js",
+ "group": "myfile.com",
+ "path": "/back.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/back.js",
+ },
+ "state": "on-stack",
+ "this": Object {},
+ "thread": "FakeThread",
+ "type": "call",
+ }
+ }
+ hideLocation={true}
+ isInGroup={true}
+ key="2"
+ panel="webconsole"
+ selectFrame={[MockFunction]}
+ selectLocation={[MockFunction]}
+ selectedFrame={
+ Object {
+ "asyncCause": null,
+ "displayName": "foo",
+ "generatedLocation": Object {
+ "column": undefined,
+ "line": 4,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "id": "frame",
+ "index": 0,
+ "library": "Back",
+ "location": Object {
+ "column": undefined,
+ "line": 4,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "scope": Object {
+ "actor": "scope-actor",
+ "bindings": Object {
+ "arguments": Array [],
+ "variables": Object {},
+ },
+ "function": null,
+ "object": null,
+ "parent": null,
+ "scopeKind": "",
+ "type": "block",
+ },
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ "state": "on-stack",
+ "this": Object {},
+ "thread": "FakeThread",
+ "type": "call",
+ }
+ }
+ shouldMapDisplayName={false}
+ />
+ <Frame
+ disableContextMenu={false}
+ displayFullUrl={false}
+ frame={
+ Object {
+ "asyncCause": null,
+ "displayName": "display-3",
+ "generatedLocation": Object {
+ "column": undefined,
+ "line": 55,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "back.js",
+ "group": "myfile.com",
+ "path": "/back.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/back.js",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "back.js",
+ "group": "myfile.com",
+ "path": "/back.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/back.js",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "id": "3",
+ "index": 0,
+ "library": "Back",
+ "location": Object {
+ "column": undefined,
+ "line": 55,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "back.js",
+ "group": "myfile.com",
+ "path": "/back.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/back.js",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "back.js",
+ "group": "myfile.com",
+ "path": "/back.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/back.js",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "scope": Object {
+ "actor": "scope-actor",
+ "bindings": Object {
+ "arguments": Array [],
+ "variables": Object {},
+ },
+ "function": null,
+ "object": null,
+ "parent": null,
+ "scopeKind": "",
+ "type": "block",
+ },
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "js",
+ "filename": "back.js",
+ "group": "myfile.com",
+ "path": "/back.js",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "http://myfile.com/back.js",
+ },
+ "state": "on-stack",
+ "this": Object {},
+ "thread": "FakeThread",
+ "type": "call",
+ }
+ }
+ hideLocation={true}
+ isInGroup={true}
+ key="3"
+ panel="webconsole"
+ selectFrame={[MockFunction]}
+ selectLocation={[MockFunction]}
+ selectedFrame={
+ Object {
+ "asyncCause": null,
+ "displayName": "foo",
+ "generatedLocation": Object {
+ "column": undefined,
+ "line": 4,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "id": "frame",
+ "index": 0,
+ "library": "Back",
+ "location": Object {
+ "column": undefined,
+ "line": 4,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ "sourceActor": Object {
+ "actor": "source-actor",
+ "id": "source-actor",
+ "source": "source",
+ "sourceObject": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ },
+ "sourceActorId": "source-actor",
+ },
+ "scope": Object {
+ "actor": "scope-actor",
+ "bindings": Object {
+ "arguments": Array [],
+ "variables": Object {},
+ },
+ "function": null,
+ "object": null,
+ "parent": null,
+ "scopeKind": "",
+ "type": "block",
+ },
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "source",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ "state": "on-stack",
+ "this": Object {},
+ "thread": "FakeThread",
+ "type": "call",
+ }
+ }
+ shouldMapDisplayName={false}
+ />
+ </div>
+</div>
+`;
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Scopes.css b/devtools/client/debugger/src/components/SecondaryPanes/Scopes.css
new file mode 100644
index 0000000000..07ebd44048
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/Scopes.css
@@ -0,0 +1,100 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+.secondary-panes .map-scopes-header {
+ padding-inline-end: 3px;
+}
+
+.secondary-panes .header-buttons .img.shortcuts {
+ width: 14px;
+ height: 14px;
+ /* Better vertical centering of the icon */
+ margin-top: -2px;
+}
+
+.scopes-content .node.object-node {
+ padding-inline-start: 7px;
+}
+
+.scopes-content .toggle-map-scopes a.mdn {
+ padding-inline-start: 3px;
+}
+
+.scopes-content .toggle-map-scopes .img.shortcuts {
+ background: var(--theme-comment);
+}
+
+.scopes-content .object-node.default-property {
+ opacity: 0.6;
+}
+
+.scopes-content .object-node {
+ padding-inline-start: 20px;
+}
+
+html[dir="rtl"] .scopes-content .object-node {
+ padding-right: 4px;
+}
+
+.scopes-content .object-label {
+ color: var(--theme-highlight-blue);
+}
+
+.objectBox-object,
+.objectBox-text,
+.objectBox-table,
+.objectLink-textNode,
+.objectLink-event,
+.objectLink-eventLog,
+.objectLink-regexp,
+.objectLink-object,
+.objectLink-Date,
+.theme-dark .objectBox-object,
+.theme-light .objectBox-object {
+ white-space: nowrap;
+}
+
+.scopes-pane ._content {
+ overflow: auto;
+}
+
+.scopes-list {
+ padding: 4px 0px;
+}
+
+.scopes-list .function-signature {
+ display: inline-block;
+}
+
+.scopes-list .scope-type-toggle {
+ text-align: center;
+ padding-top: 10px;
+ padding-bottom: 10px;
+}
+
+.scopes-list .scope-type-toggle button {
+ /* Override color so that the link doesn't turn purple */
+ color: var(--theme-body-color);
+ font-size: inherit;
+ text-decoration: underline;
+ cursor: pointer;
+}
+
+.scopes-list .scope-type-toggle button:hover {
+ background: transparent;
+}
+
+.scopes-list .tree.object-inspector .node.object-node {
+ display: flex;
+ align-items: center;
+}
+
+.scopes-list .tree.object-inspector .tree-node button.arrow,
+.scopes-list button.invoke-getter {
+ margin-top: 2px;
+}
+
+.scopes-list .tree {
+ line-height: 15px;
+}
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Scopes.js b/devtools/client/debugger/src/components/SecondaryPanes/Scopes.js
new file mode 100644
index 0000000000..135decd254
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/Scopes.js
@@ -0,0 +1,413 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React, { PureComponent } from "devtools/client/shared/vendor/react";
+import {
+ div,
+ button,
+ span,
+} from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+import AccessibleImage from "../shared/AccessibleImage";
+import { showMenu } from "../../context-menu/menu";
+import { connect } from "devtools/client/shared/vendor/react-redux";
+import actions from "../../actions/index";
+
+import {
+ getSelectedFrame,
+ getCurrentThread,
+ getSelectedSource,
+ getGeneratedFrameScope,
+ getOriginalFrameScope,
+ getPauseReason,
+ isMapScopesEnabled,
+ getLastExpandedScopes,
+ getIsCurrentThreadPaused,
+} from "../../selectors/index";
+import {
+ getScopesItemsForSelectedFrame,
+ getScopeItemPath,
+} from "../../utils/pause/scopes";
+import { clientCommands } from "../../client/firefox";
+
+import { objectInspector } from "devtools/client/shared/components/reps/index";
+const { ObjectInspector } = objectInspector;
+
+class Scopes extends PureComponent {
+ constructor(props) {
+ const { why, selectedFrame, originalFrameScopes, generatedFrameScopes } =
+ props;
+
+ super(props);
+
+ this.state = {
+ originalScopes: getScopesItemsForSelectedFrame(
+ why,
+ selectedFrame,
+ originalFrameScopes
+ ),
+ generatedScopes: getScopesItemsForSelectedFrame(
+ why,
+ selectedFrame,
+ generatedFrameScopes
+ ),
+ };
+ }
+
+ static get propTypes() {
+ return {
+ addWatchpoint: PropTypes.func.isRequired,
+ expandedScopes: PropTypes.array.isRequired,
+ generatedFrameScopes: PropTypes.object,
+ highlightDomElement: PropTypes.func.isRequired,
+ isLoading: PropTypes.bool.isRequired,
+ isPaused: PropTypes.bool.isRequired,
+ mapScopesEnabled: PropTypes.bool.isRequired,
+ openElementInInspector: PropTypes.func.isRequired,
+ openLink: PropTypes.func.isRequired,
+ originalFrameScopes: PropTypes.object,
+ removeWatchpoint: PropTypes.func.isRequired,
+ setExpandedScope: PropTypes.func.isRequired,
+ unHighlightDomElement: PropTypes.func.isRequired,
+ why: PropTypes.object.isRequired,
+ selectedFrame: PropTypes.object,
+ toggleMapScopes: PropTypes.func.isRequired,
+ selectedSource: PropTypes.object.isRequired,
+ };
+ }
+
+ // FIXME: https://bugzilla.mozilla.org/show_bug.cgi?id=1774507
+ UNSAFE_componentWillReceiveProps(nextProps) {
+ const {
+ selectedFrame,
+ originalFrameScopes,
+ generatedFrameScopes,
+ isPaused,
+ selectedSource,
+ } = this.props;
+ const isPausedChanged = isPaused !== nextProps.isPaused;
+ const selectedFrameChanged = selectedFrame !== nextProps.selectedFrame;
+ const originalFrameScopesChanged =
+ originalFrameScopes !== nextProps.originalFrameScopes;
+ const generatedFrameScopesChanged =
+ generatedFrameScopes !== nextProps.generatedFrameScopes;
+ const selectedSourceChanged = selectedSource !== nextProps.selectedSource;
+
+ if (
+ isPausedChanged ||
+ selectedFrameChanged ||
+ originalFrameScopesChanged ||
+ generatedFrameScopesChanged ||
+ selectedSourceChanged
+ ) {
+ this.setState({
+ originalScopes: getScopesItemsForSelectedFrame(
+ nextProps.why,
+ nextProps.selectedFrame,
+ nextProps.originalFrameScopes
+ ),
+ generatedScopes: getScopesItemsForSelectedFrame(
+ nextProps.why,
+ nextProps.selectedFrame,
+ nextProps.generatedFrameScopes
+ ),
+ });
+ }
+ }
+
+ onContextMenu = (event, item) => {
+ const { addWatchpoint, removeWatchpoint } = this.props;
+
+ if (!item.parent || !item.contents.configurable) {
+ return;
+ }
+
+ if (!item.contents || item.contents.watchpoint) {
+ const removeWatchpointLabel = L10N.getStr("watchpoints.removeWatchpoint");
+
+ const removeWatchpointItem = {
+ id: "node-menu-remove-watchpoint",
+ label: removeWatchpointLabel,
+ disabled: false,
+ click: () => removeWatchpoint(item),
+ };
+
+ const menuItems = [removeWatchpointItem];
+ showMenu(event, menuItems);
+ return;
+ }
+
+ const addSetWatchpointLabel = L10N.getStr("watchpoints.setWatchpoint");
+ const addGetWatchpointLabel = L10N.getStr("watchpoints.getWatchpoint");
+ const addGetOrSetWatchpointLabel = L10N.getStr(
+ "watchpoints.getOrSetWatchpoint"
+ );
+ const watchpointsSubmenuLabel = L10N.getStr("watchpoints.submenu");
+
+ const addSetWatchpointItem = {
+ id: "node-menu-add-set-watchpoint",
+ label: addSetWatchpointLabel,
+ disabled: false,
+ click: () => addWatchpoint(item, "set"),
+ };
+
+ const addGetWatchpointItem = {
+ id: "node-menu-add-get-watchpoint",
+ label: addGetWatchpointLabel,
+ disabled: false,
+ click: () => addWatchpoint(item, "get"),
+ };
+
+ const addGetOrSetWatchpointItem = {
+ id: "node-menu-add-get-watchpoint",
+ label: addGetOrSetWatchpointLabel,
+ disabled: false,
+ click: () => addWatchpoint(item, "getorset"),
+ };
+
+ const watchpointsSubmenuItem = {
+ id: "node-menu-watchpoints",
+ label: watchpointsSubmenuLabel,
+ disabled: false,
+ click: () => addWatchpoint(item, "set"),
+ submenu: [
+ addSetWatchpointItem,
+ addGetWatchpointItem,
+ addGetOrSetWatchpointItem,
+ ],
+ };
+
+ const menuItems = [watchpointsSubmenuItem];
+ showMenu(event, menuItems);
+ };
+
+ renderWatchpointButton = item => {
+ const { removeWatchpoint } = this.props;
+
+ if (
+ !item ||
+ !item.contents ||
+ !item.contents.watchpoint ||
+ typeof L10N === "undefined"
+ ) {
+ return null;
+ }
+
+ const { watchpoint } = item.contents;
+ return button({
+ className: `remove-watchpoint-${watchpoint}`,
+ title: L10N.getStr("watchpoints.removeWatchpointTooltip"),
+ onClick: e => {
+ e.stopPropagation();
+ removeWatchpoint(item);
+ },
+ });
+ };
+
+ renderScopesList() {
+ const {
+ isLoading,
+ openLink,
+ openElementInInspector,
+ highlightDomElement,
+ unHighlightDomElement,
+ mapScopesEnabled,
+ selectedFrame,
+ setExpandedScope,
+ expandedScopes,
+ selectedSource,
+ } = this.props;
+
+ if (!selectedSource) {
+ return div(
+ { className: "pane scopes-list" },
+ div({ className: "pane-info" }, L10N.getStr("scopes.notAvailable"))
+ );
+ }
+
+ const { originalScopes, generatedScopes } = this.state;
+ let scopes = null;
+
+ if (
+ selectedSource.isOriginal &&
+ !selectedSource.isPrettyPrinted &&
+ !selectedFrame.generatedLocation?.source.isWasm
+ ) {
+ if (!mapScopesEnabled) {
+ return div(
+ { className: "pane scopes-list" },
+ div(
+ {
+ className: "pane-info no-original-scopes-info",
+ "aria-role": "status",
+ },
+ span(
+ { className: "info icon" },
+ React.createElement(AccessibleImage, { className: "sourcemap" })
+ ),
+ L10N.getFormatStr(
+ "scopes.noOriginalScopes",
+ L10N.getStr("scopes.showOriginalScopes")
+ )
+ )
+ );
+ }
+ if (isLoading) {
+ return div(
+ {
+ className: "pane scopes-list",
+ },
+ div(
+ { className: "pane-info" },
+ span(
+ { className: "info icon" },
+ React.createElement(AccessibleImage, { className: "loader" })
+ ),
+ L10N.getStr("scopes.loadingOriginalScopes")
+ )
+ );
+ }
+ scopes = originalScopes;
+ } else {
+ if (isLoading) {
+ return div(
+ {
+ className: "pane scopes-list",
+ },
+ div(
+ { className: "pane-info" },
+ span(
+ { className: "info icon" },
+ React.createElement(AccessibleImage, { className: "loader" })
+ ),
+ L10N.getStr("loadingText")
+ )
+ );
+ }
+ scopes = generatedScopes;
+ }
+
+ function initiallyExpanded(item) {
+ return expandedScopes.some(path => path == getScopeItemPath(item));
+ }
+
+ if (scopes && !!scopes.length) {
+ return div(
+ {
+ className: "pane scopes-list",
+ },
+ React.createElement(ObjectInspector, {
+ roots: scopes,
+ autoExpandAll: false,
+ autoExpandDepth: 1,
+ client: clientCommands,
+ createElement: tagName => document.createElement(tagName),
+ disableWrap: true,
+ dimTopLevelWindow: true,
+ frame: selectedFrame,
+ mayUseCustomFormatter: true,
+ openLink: openLink,
+ onDOMNodeClick: grip => openElementInInspector(grip),
+ onInspectIconClick: grip => openElementInInspector(grip),
+ onDOMNodeMouseOver: grip => highlightDomElement(grip),
+ onDOMNodeMouseOut: grip => unHighlightDomElement(grip),
+ onContextMenu: this.onContextMenu,
+ setExpanded: (path, expand) =>
+ setExpandedScope(selectedFrame, path, expand),
+ initiallyExpanded: initiallyExpanded,
+ renderItemActions: this.renderWatchpointButton,
+ shouldRenderTooltip: true,
+ })
+ );
+ }
+
+ return div(
+ {
+ className: "pane scopes-list",
+ },
+ div(
+ {
+ className: "pane-info",
+ },
+ L10N.getStr("scopes.notAvailable")
+ )
+ );
+ }
+
+ render() {
+ return div(
+ {
+ className: "scopes-content",
+ },
+ this.renderScopesList()
+ );
+ }
+}
+
+const mapStateToProps = state => {
+ // This component doesn't need any prop when we are not paused
+ const selectedFrame = getSelectedFrame(state, getCurrentThread(state));
+ if (!selectedFrame) {
+ return {};
+ }
+ const why = getPauseReason(state, selectedFrame.thread);
+ const expandedScopes = getLastExpandedScopes(state, selectedFrame.thread);
+ const isPaused = getIsCurrentThreadPaused(state);
+ const selectedSource = getSelectedSource(state);
+
+ let originalFrameScopes;
+ let generatedFrameScopes;
+ let isLoading;
+ let mapScopesEnabled;
+
+ if (
+ selectedSource?.isOriginal &&
+ !selectedSource?.isPrettyPrinted &&
+ !selectedFrame.generatedLocation?.source.isWasm
+ ) {
+ const { scope, pending: originalPending } = getOriginalFrameScope(
+ state,
+ selectedFrame
+ ) || {
+ scope: null,
+ pending: false,
+ };
+ originalFrameScopes = scope;
+ isLoading = originalPending;
+ mapScopesEnabled = isMapScopesEnabled(state);
+ } else {
+ const { scope, pending: generatedPending } = getGeneratedFrameScope(
+ state,
+ selectedFrame
+ ) || {
+ scope: null,
+ pending: false,
+ };
+ generatedFrameScopes = scope;
+ isLoading = generatedPending;
+ }
+
+ return {
+ originalFrameScopes,
+ generatedFrameScopes,
+ mapScopesEnabled,
+ selectedFrame,
+ isLoading,
+ why,
+ expandedScopes,
+ isPaused,
+ selectedSource,
+ };
+};
+
+export default connect(mapStateToProps, {
+ openLink: actions.openLink,
+ openElementInInspector: actions.openElementInInspectorCommand,
+ highlightDomElement: actions.highlightDomElement,
+ unHighlightDomElement: actions.unHighlightDomElement,
+ setExpandedScope: actions.setExpandedScope,
+ addWatchpoint: actions.addWatchpoint,
+ removeWatchpoint: actions.removeWatchpoint,
+ toggleMapScopes: actions.toggleMapScopes,
+})(Scopes);
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/SecondaryPanes.css b/devtools/client/debugger/src/components/SecondaryPanes/SecondaryPanes.css
new file mode 100644
index 0000000000..6432e9fe75
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/SecondaryPanes.css
@@ -0,0 +1,98 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+.secondary-panes {
+ overflow-x: hidden;
+ overflow-y: auto;
+ display: flex;
+ flex-direction: column;
+ flex: 1;
+ white-space: nowrap;
+ background-color: var(--theme-sidebar-background);
+ --breakpoint-expression-right-clear-space: 36px;
+ --paused-background-color: hsl(54, 100%, 92%);
+ --paused-color: var(--theme-body-color);
+
+ .theme-dark & {
+ --paused-background-color: hsl(42, 37%, 19%);
+ --paused-color: hsl(43, 94%, 81%);
+ }
+}
+
+.secondary-panes .controlled > div {
+ max-width: 100%;
+}
+
+/*
+ We apply overflow to the container with the commandbar.
+ This allows the commandbar to remain fixed when scrolling
+ until the content completely ends. Not just the height of
+ the wrapper.
+ Ref: https://github.com/firefox-devtools/debugger/issues/3426
+*/
+
+.secondary-panes-wrapper {
+ height: 100%;
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+}
+
+.secondary-panes .accordion {
+ flex: 1 0 auto;
+ margin-bottom: 0;
+}
+
+.secondary-panes-wrapper .accordion li:last-child ._content {
+ border-bottom: 0;
+}
+
+.pane {
+ color: var(--theme-body-color);
+}
+
+.pane .pane-info {
+ text-align: start;
+ padding: 0.5em;
+ gap: 8px;
+ display: flex;
+ white-space: normal;
+}
+
+.pane .pane-info.no-original-scopes-info {
+ background-color: var(--theme-warning-background);
+ color: var(--theme-warning-color);
+}
+
+.secondary-panes .breakpoints-buttons {
+ display: flex;
+}
+
+.dropdown {
+ width: 20em;
+ overflow: auto;
+}
+
+.secondary-panes input[type="checkbox"] {
+ margin: 0;
+ margin-inline-end: 4px;
+ vertical-align: text-top;
+}
+
+.secondary-panes-wrapper .command-bar.bottom {
+ background-color: var(--theme-body-background);
+}
+
+/**
+ * Skip Pausing style
+ * Add a gray background and lower content opacity
+ */
+.skip-pausing .xhr-breakpoints-pane ._content,
+.skip-pausing .breakpoints-pane ._content,
+.skip-pausing .event-listeners-pane ._content,
+.skip-pausing .dom-mutations-pane ._content {
+ background-color: var(--skip-pausing-background-color);
+ opacity: var(--skip-pausing-opacity);
+ color: var(--skip-pausing-color);
+}
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Thread.js b/devtools/client/debugger/src/components/SecondaryPanes/Thread.js
new file mode 100644
index 0000000000..bfa73f1346
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/Thread.js
@@ -0,0 +1,81 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React, { Component } from "devtools/client/shared/vendor/react";
+import { div, span } from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+import { connect } from "devtools/client/shared/vendor/react-redux";
+
+import actions from "../../actions/index";
+import { getCurrentThread, getIsPaused } from "../../selectors/index";
+import AccessibleImage from "../shared/AccessibleImage";
+
+const classnames = require("resource://devtools/client/shared/classnames.js");
+
+export class Thread extends Component {
+ static get propTypes() {
+ return {
+ currentThread: PropTypes.string.isRequired,
+ isPaused: PropTypes.bool.isRequired,
+ selectThread: PropTypes.func.isRequired,
+ thread: PropTypes.object.isRequired,
+ };
+ }
+
+ onSelectThread = () => {
+ this.props.selectThread(this.props.thread.actor);
+ };
+
+ render() {
+ const { currentThread, isPaused, thread } = this.props;
+
+ const isWorker = thread.targetType.includes("worker");
+ let label = thread.name;
+ if (thread.serviceWorkerStatus) {
+ label += ` (${thread.serviceWorkerStatus})`;
+ }
+ return div(
+ {
+ className: classnames("thread", {
+ selected: thread.actor == currentThread,
+ paused: isPaused,
+ }),
+ key: thread.actor,
+ onClick: this.onSelectThread,
+ },
+ div(
+ {
+ className: "icon",
+ },
+ React.createElement(AccessibleImage, {
+ className: isWorker ? "worker" : "window",
+ })
+ ),
+ div(
+ {
+ className: "label",
+ },
+ label
+ ),
+ isPaused
+ ? span(
+ {
+ className: "pause-badge",
+ role: "status",
+ },
+ L10N.getStr("pausedThread")
+ )
+ : null
+ );
+ }
+}
+
+const mapStateToProps = (state, props) => ({
+ currentThread: getCurrentThread(state),
+ isPaused: getIsPaused(state, props.thread.actor),
+});
+
+export default connect(mapStateToProps, {
+ selectThread: actions.selectThread,
+})(Thread);
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Threads.css b/devtools/client/debugger/src/components/SecondaryPanes/Threads.css
new file mode 100644
index 0000000000..603aa3ad8a
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/Threads.css
@@ -0,0 +1,64 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+.threads-list {
+ padding: 4px 0;
+}
+
+.threads-list * {
+ user-select: none;
+}
+
+.threads-list > .thread {
+ font-size: inherit;
+ color: var(--theme-text-color-strong);
+ padding: 2px 6px;
+ padding-inline-start: 20px;
+ line-height: 16px;
+ position: relative;
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ &:hover {
+ background-color: var(--search-overlays-semitransparent);
+ }
+
+ &.selected {
+ background: var(--theme-selection-background);
+ color: var(--theme-selection-color);
+
+ & .img {
+ background-color: currentColor;
+ }
+ }
+
+ &.paused:not(.selected) {
+ background-color: var(--paused-background-color);
+ color: var(--paused-color);
+ }
+}
+
+.threads-list .icon {
+ flex: none;
+}
+
+.threads-list .img {
+ display: block;
+}
+
+.threads-list .label {
+ display: inline-block;
+ flex-grow: 1;
+ flex-shrink: 1;
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+}
+
+.threads-list .pause-badge {
+ flex: none;
+ font-weight: bold;
+}
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/Threads.js b/devtools/client/debugger/src/components/SecondaryPanes/Threads.js
new file mode 100644
index 0000000000..2d21a1dcc5
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/Threads.js
@@ -0,0 +1,40 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React, { Component } from "devtools/client/shared/vendor/react";
+import { div } from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+import { connect } from "devtools/client/shared/vendor/react-redux";
+
+import { getAllThreads } from "../../selectors/index";
+import Thread from "./Thread";
+
+export class Threads extends Component {
+ static get propTypes() {
+ return {
+ threads: PropTypes.array.isRequired,
+ };
+ }
+
+ render() {
+ const { threads } = this.props;
+ return div(
+ {
+ className: "pane threads-list",
+ },
+ threads.map(thread =>
+ React.createElement(Thread, {
+ thread: thread,
+ key: thread.actor,
+ })
+ )
+ );
+ }
+}
+
+const mapStateToProps = state => ({
+ threads: getAllThreads(state),
+});
+
+export default connect(mapStateToProps)(Threads);
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/WhyPaused.css b/devtools/client/debugger/src/components/SecondaryPanes/WhyPaused.css
new file mode 100644
index 0000000000..6fa5bc42d7
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/WhyPaused.css
@@ -0,0 +1,53 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+.why-paused {
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ border-bottom: 1px solid var(--theme-splitter-color);
+ background-color: var(--paused-background-color);
+ color: var(--paused-color);
+ font-size: 12px;
+ cursor: default;
+ min-height: 44px;
+ padding: 6px;
+ white-space: normal;
+ font-weight: bold;
+}
+
+.why-paused > div {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+}
+
+.why-paused .info.icon {
+ align-self: center;
+ padding-right: 4px;
+ margin-inline-start: 14px;
+ margin-inline-end: 3px;
+}
+
+.why-paused .pause.reason {
+ display: flex;
+ flex-direction: column;
+ padding-right: 4px;
+}
+
+.why-paused .message {
+ font-style: italic;
+ font-weight: 100;
+}
+
+.why-paused .mutationNode {
+ font-weight: normal;
+}
+
+.why-paused .message.warning {
+ color: var(--theme-graphs-full-red);
+ font-family: var(--monospace-font-family);
+ font-size: 10px;
+ font-style: normal;
+}
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/WhyPaused.js b/devtools/client/debugger/src/components/SecondaryPanes/WhyPaused.js
new file mode 100644
index 0000000000..fabd75a7ce
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/WhyPaused.js
@@ -0,0 +1,218 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+const {
+ LocalizationProvider,
+ Localized,
+} = require("resource://devtools/client/shared/vendor/fluent-react.js");
+
+import React, { PureComponent } from "devtools/client/shared/vendor/react";
+import { div, span } from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+import { connect } from "devtools/client/shared/vendor/react-redux";
+import AccessibleImage from "../shared/AccessibleImage";
+import actions from "../../actions/index";
+
+import Reps from "devtools/client/shared/components/reps/index";
+const {
+ REPS: { Rep },
+ MODE,
+} = Reps;
+
+import { getPauseReason } from "../../utils/pause/index";
+import {
+ getCurrentThread,
+ getPaneCollapse,
+ getPauseReason as getWhy,
+} from "../../selectors/index";
+
+class WhyPaused extends PureComponent {
+ constructor(props) {
+ super(props);
+ this.state = { hideWhyPaused: "" };
+ }
+
+ static get propTypes() {
+ return {
+ delay: PropTypes.number.isRequired,
+ endPanelCollapsed: PropTypes.bool.isRequired,
+ highlightDomElement: PropTypes.func.isRequired,
+ openElementInInspector: PropTypes.func.isRequired,
+ unHighlightDomElement: PropTypes.func.isRequired,
+ why: PropTypes.object,
+ };
+ }
+
+ componentDidUpdate() {
+ const { delay } = this.props;
+
+ if (delay) {
+ setTimeout(() => {
+ this.setState({ hideWhyPaused: "" });
+ }, delay);
+ } else {
+ this.setState({ hideWhyPaused: "pane why-paused" });
+ }
+ }
+
+ renderExceptionSummary(exception) {
+ if (typeof exception === "string") {
+ return exception;
+ }
+
+ const { preview } = exception;
+ if (!preview || !preview.name || !preview.message) {
+ return null;
+ }
+
+ return `${preview.name}: ${preview.message}`;
+ }
+
+ renderMessage(why) {
+ const { type, exception, message } = why;
+
+ if (type == "exception" && exception) {
+ // Our types for 'Why' are too general because 'type' can be 'string'.
+ // $FlowFixMe - We should have a proper discriminating union of reasons.
+ const summary = this.renderExceptionSummary(exception);
+ return div(
+ {
+ className: "message warning",
+ },
+ summary
+ );
+ }
+
+ if (type === "mutationBreakpoint" && why.nodeGrip) {
+ const { nodeGrip, ancestorGrip, action } = why;
+ const {
+ openElementInInspector,
+ highlightDomElement,
+ unHighlightDomElement,
+ } = this.props;
+
+ const targetRep = Rep({
+ object: nodeGrip,
+ mode: MODE.TINY,
+ onDOMNodeClick: () => openElementInInspector(nodeGrip),
+ onInspectIconClick: () => openElementInInspector(nodeGrip),
+ onDOMNodeMouseOver: () => highlightDomElement(nodeGrip),
+ onDOMNodeMouseOut: () => unHighlightDomElement(),
+ });
+
+ const ancestorRep = ancestorGrip
+ ? Rep({
+ object: ancestorGrip,
+ mode: MODE.TINY,
+ onDOMNodeClick: () => openElementInInspector(ancestorGrip),
+ onInspectIconClick: () => openElementInInspector(ancestorGrip),
+ onDOMNodeMouseOver: () => highlightDomElement(ancestorGrip),
+ onDOMNodeMouseOut: () => unHighlightDomElement(),
+ })
+ : null;
+ return div(
+ null,
+ div(
+ {
+ className: "message",
+ },
+ why.message
+ ),
+ div(
+ {
+ className: "mutationNode",
+ },
+ ancestorRep,
+ ancestorGrip
+ ? span(
+ {
+ className: "why-paused-ancestor",
+ },
+ React.createElement(Localized, {
+ id:
+ action === "remove"
+ ? "whypaused-mutation-breakpoint-removed"
+ : "whypaused-mutation-breakpoint-added",
+ }),
+ targetRep
+ )
+ : targetRep
+ )
+ );
+ }
+
+ if (typeof message == "string") {
+ return div(
+ {
+ className: "message",
+ },
+ message
+ );
+ }
+
+ return null;
+ }
+
+ render() {
+ const { endPanelCollapsed, why } = this.props;
+ const { fluentBundles } = this.context;
+ const reason = getPauseReason(why);
+
+ if (!why || !reason || endPanelCollapsed) {
+ return div({
+ className: this.state.hideWhyPaused,
+ });
+ }
+ return (
+ // We're rendering the LocalizationProvider component from here and not in an upper
+ // component because it does set a new context, overriding the context that we set
+ // in the first place in <App>, which breaks some components.
+ // This should be fixed in Bug 1743155.
+ React.createElement(
+ LocalizationProvider,
+ {
+ bundles: fluentBundles || [],
+ },
+ div(
+ {
+ className: "pane why-paused",
+ },
+ div(
+ null,
+ div(
+ {
+ className: "info icon",
+ },
+ React.createElement(AccessibleImage, {
+ className: "info",
+ })
+ ),
+ div(
+ {
+ className: "pause reason",
+ },
+ React.createElement(Localized, {
+ id: reason,
+ }),
+ this.renderMessage(why)
+ )
+ )
+ )
+ )
+ );
+ }
+}
+
+WhyPaused.contextTypes = { fluentBundles: PropTypes.array };
+
+const mapStateToProps = state => ({
+ endPanelCollapsed: getPaneCollapse(state, "end"),
+ why: getWhy(state, getCurrentThread(state)),
+});
+
+export default connect(mapStateToProps, {
+ openElementInInspector: actions.openElementInInspectorCommand,
+ highlightDomElement: actions.highlightDomElement,
+ unHighlightDomElement: actions.unHighlightDomElement,
+})(WhyPaused);
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/XHRBreakpoints.css b/devtools/client/debugger/src/components/SecondaryPanes/XHRBreakpoints.css
new file mode 100644
index 0000000000..50b6240337
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/XHRBreakpoints.css
@@ -0,0 +1,108 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+.xhr-breakpoints-pane ._content {
+ overflow-x: auto;
+}
+
+.xhr-input-container {
+ display: flex;
+}
+
+.xhr-input-form {
+ display: flex;
+ gap: 8px;
+ flex-wrap: wrap;
+ width: 100%;
+ /* helps to display a nice outline on focused elements */
+ padding-block: 2px;
+ padding-inline-start: 20px;
+ padding-inline-end: 12px;
+ /* Stop select height from increasing as input height increases */
+ align-items: center;
+}
+
+.xhr-checkbox {
+ margin-inline-start: 0;
+ margin-inline-end: 4px;
+}
+
+.xhr-input-url {
+ border: 1px;
+ flex: 1 1 100px;
+ min-width: min(100%, 100px);
+ height: 24px;
+ background-color: var(--theme-sidebar-background);
+ font-size: inherit;
+ color: var(--theme-body-color);
+}
+
+.xhr-input-url::placeholder {
+ color: var(--theme-text-color-alt);
+ opacity: 1;
+}
+
+.expressions-list .xhr-input-url {
+ /* Prevent vertical bounce when editing an existing XHR Breakpoint */
+ height: 100%;
+}
+
+.xhr-input-method {
+ flex: 0 1 100px;
+ min-width: min(100%, 100px);
+}
+
+.xhr-container {
+ border-left: 4px solid transparent;
+ width: 100%;
+ color: var(--theme-body-color);
+ padding-inline-start: 16px;
+ padding-inline-end: 6px;
+ display: flex;
+ align-items: center;
+ position: relative;
+ height: var(--expression-item-height);
+}
+
+:root.theme-light .xhr-container:hover {
+ background-color: var(--search-overlays-semitransparent);
+}
+
+:root.theme-dark .xhr-container:hover {
+ background-color: var(--search-overlays-semitransparent);
+}
+
+.xhr-label-method {
+ line-height: 14px;
+ display: inline-block;
+ margin-inline-end: 2px;
+}
+
+.xhr-input-container:not(.focused) .xhr-input-method {
+ display: none;
+}
+
+.xhr-label-url {
+ max-width: calc(100% - var(--breakpoint-expression-right-clear-space));
+ color: var(--theme-comment);
+ display: inline-block;
+ cursor: text;
+ flex-grow: 1;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ padding: 0px 2px 0px 2px;
+ line-height: 14px;
+}
+
+.xhr-container label {
+ flex-grow: 1;
+ display: flex;
+ align-items: center;
+ max-width: 100%;
+}
+
+.xhr-container__close-btn {
+ display: flex;
+ padding: 2px;
+}
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/XHRBreakpoints.js b/devtools/client/debugger/src/components/SecondaryPanes/XHRBreakpoints.js
new file mode 100644
index 0000000000..9774255dcd
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/XHRBreakpoints.js
@@ -0,0 +1,383 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React, { Component } from "devtools/client/shared/vendor/react";
+import {
+ div,
+ form,
+ input,
+ li,
+ label,
+ ul,
+ option,
+ select,
+} from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+import { connect } from "devtools/client/shared/vendor/react-redux";
+import actions from "../../actions/index";
+
+import { CloseButton } from "../shared/Button/index";
+
+import { getXHRBreakpoints, shouldPauseOnAnyXHR } from "../../selectors/index";
+import ExceptionOption from "./Breakpoints/ExceptionOption";
+
+const classnames = require("resource://devtools/client/shared/classnames.js");
+
+// At present, the "Pause on any URL" checkbox creates an xhrBreakpoint
+// of "ANY" with no path, so we can remove that before creating the list
+function getExplicitXHRBreakpoints(xhrBreakpoints) {
+ return xhrBreakpoints.filter(bp => bp.path !== "");
+}
+
+const xhrMethods = [
+ "ANY",
+ "GET",
+ "POST",
+ "PUT",
+ "HEAD",
+ "DELETE",
+ "PATCH",
+ "OPTIONS",
+];
+
+class XHRBreakpoints extends Component {
+ constructor(props) {
+ super(props);
+
+ this.state = {
+ editing: false,
+ inputValue: "",
+ inputMethod: "ANY",
+ focused: false,
+ editIndex: -1,
+ clickedOnFormElement: false,
+ };
+ }
+
+ static get propTypes() {
+ return {
+ disableXHRBreakpoint: PropTypes.func.isRequired,
+ enableXHRBreakpoint: PropTypes.func.isRequired,
+ onXHRAdded: PropTypes.func.isRequired,
+ removeXHRBreakpoint: PropTypes.func.isRequired,
+ setXHRBreakpoint: PropTypes.func.isRequired,
+ shouldPauseOnAny: PropTypes.bool.isRequired,
+ showInput: PropTypes.bool.isRequired,
+ togglePauseOnAny: PropTypes.func.isRequired,
+ updateXHRBreakpoint: PropTypes.func.isRequired,
+ xhrBreakpoints: PropTypes.array.isRequired,
+ };
+ }
+
+ componentDidMount() {
+ const { showInput } = this.props;
+
+ // Ensures that the input is focused when the "+"
+ // is clicked while the panel is collapsed
+ if (this._input && showInput) {
+ this._input.focus();
+ }
+ }
+
+ componentDidUpdate(prevProps, prevState) {
+ const _input = this._input;
+
+ if (!_input) {
+ return;
+ }
+
+ if (!prevState.editing && this.state.editing) {
+ _input.setSelectionRange(0, _input.value.length);
+ _input.focus();
+ } else if (this.props.showInput && !this.state.focused) {
+ _input.focus();
+ }
+ }
+
+ handleNewSubmit = e => {
+ e.preventDefault();
+ e.stopPropagation();
+
+ const setXHRBreakpoint = function () {
+ this.props.setXHRBreakpoint(
+ this.state.inputValue,
+ this.state.inputMethod
+ );
+ this.hideInput();
+ };
+
+ // force update inputMethod in state for mochitest purposes
+ // before setting XHR breakpoint
+ this.setState(
+ { inputMethod: e.target.children[1].value },
+ setXHRBreakpoint
+ );
+ };
+
+ handleExistingSubmit = e => {
+ e.preventDefault();
+ e.stopPropagation();
+
+ const { editIndex, inputValue, inputMethod } = this.state;
+ const { xhrBreakpoints } = this.props;
+ const { path, method } = xhrBreakpoints[editIndex];
+
+ if (path !== inputValue || method != inputMethod) {
+ this.props.updateXHRBreakpoint(editIndex, inputValue, inputMethod);
+ }
+
+ this.hideInput();
+ };
+
+ handleChange = e => {
+ this.setState({ inputValue: e.target.value });
+ };
+
+ handleMethodChange = e => {
+ this.setState({
+ focused: true,
+ editing: true,
+ inputMethod: e.target.value,
+ });
+ };
+
+ hideInput = () => {
+ if (this.state.clickedOnFormElement) {
+ this.setState({
+ focused: true,
+ clickedOnFormElement: false,
+ });
+ } else {
+ this.setState({
+ focused: false,
+ editing: false,
+ editIndex: -1,
+ inputValue: "",
+ inputMethod: "ANY",
+ });
+ this.props.onXHRAdded();
+ }
+ };
+
+ onFocus = () => {
+ this.setState({ focused: true, editing: true });
+ };
+
+ onMouseDown = e => {
+ this.setState({ editing: false, clickedOnFormElement: true });
+ };
+
+ handleTab = e => {
+ if (e.key !== "Tab") {
+ return;
+ }
+
+ if (e.currentTarget.nodeName === "INPUT") {
+ this.setState({
+ clickedOnFormElement: true,
+ editing: false,
+ });
+ } else if (e.currentTarget.nodeName === "SELECT" && !e.shiftKey) {
+ // The user has tabbed off the select and we should
+ // cancel the edit
+ this.hideInput();
+ }
+ };
+
+ editExpression = index => {
+ const { xhrBreakpoints } = this.props;
+ const { path, method } = xhrBreakpoints[index];
+ this.setState({
+ inputValue: path,
+ inputMethod: method,
+ editing: true,
+ editIndex: index,
+ });
+ };
+
+ renderXHRInput(onSubmit) {
+ const { focused, inputValue } = this.state;
+ const placeholder = L10N.getStr("xhrBreakpoints.placeholder");
+ return form(
+ {
+ key: "xhr-input-container",
+ className: classnames("xhr-input-container xhr-input-form", {
+ focused,
+ }),
+ onSubmit: onSubmit,
+ },
+ input({
+ className: "xhr-input-url",
+ type: "text",
+ placeholder: placeholder,
+ onChange: this.handleChange,
+ onBlur: this.hideInput,
+ onFocus: this.onFocus,
+ value: inputValue,
+ onKeyDown: this.handleTab,
+ ref: c => (this._input = c),
+ }),
+ this.renderMethodSelectElement(),
+ input({
+ type: "submit",
+ style: {
+ display: "none",
+ },
+ })
+ );
+ }
+
+ handleCheckbox = index => {
+ const { xhrBreakpoints, enableXHRBreakpoint, disableXHRBreakpoint } =
+ this.props;
+ const breakpoint = xhrBreakpoints[index];
+ if (breakpoint.disabled) {
+ enableXHRBreakpoint(index);
+ } else {
+ disableXHRBreakpoint(index);
+ }
+ };
+
+ renderBreakpoint = breakpoint => {
+ const { path, disabled, method } = breakpoint;
+ const { editIndex } = this.state;
+ const { removeXHRBreakpoint, xhrBreakpoints } = this.props;
+
+ // The "pause on any" checkbox
+ if (!path) {
+ return null;
+ }
+
+ // Finds the xhrbreakpoint so as to not make assumptions about position
+ const index = xhrBreakpoints.findIndex(
+ bp => bp.path === path && bp.method === method
+ );
+
+ if (index === editIndex) {
+ return this.renderXHRInput(this.handleExistingSubmit);
+ }
+ return li(
+ {
+ className: "xhr-container",
+ key: `${path}-${method}`,
+ title: path,
+ onDoubleClick: (items, options) => this.editExpression(index),
+ },
+ label(
+ null,
+ React.createElement("input", {
+ type: "checkbox",
+ className: "xhr-checkbox",
+ checked: !disabled,
+ onChange: () => this.handleCheckbox(index),
+ onClick: ev => ev.stopPropagation(),
+ }),
+ div(
+ {
+ className: "xhr-label-method",
+ },
+ method
+ ),
+ div(
+ {
+ className: "xhr-label-url",
+ },
+ path
+ ),
+ div(
+ {
+ className: "xhr-container__close-btn",
+ },
+ React.createElement(CloseButton, {
+ handleClick: e => removeXHRBreakpoint(index),
+ })
+ )
+ )
+ );
+ };
+
+ renderBreakpoints = explicitXhrBreakpoints => {
+ const { showInput } = this.props;
+ return React.createElement(
+ React.Fragment,
+ null,
+ ul(
+ {
+ className: "pane expressions-list",
+ },
+ explicitXhrBreakpoints.map(this.renderBreakpoint)
+ ),
+ showInput && this.renderXHRInput(this.handleNewSubmit)
+ );
+ };
+
+ renderCheckbox = explicitXhrBreakpoints => {
+ const { shouldPauseOnAny, togglePauseOnAny } = this.props;
+ return div(
+ {
+ className: classnames("breakpoints-options", {
+ empty: explicitXhrBreakpoints.length === 0,
+ }),
+ },
+ React.createElement(ExceptionOption, {
+ className: "breakpoints-exceptions",
+ label: L10N.getStr("pauseOnAnyXHR"),
+ isChecked: shouldPauseOnAny,
+ onChange: () => togglePauseOnAny(),
+ })
+ );
+ };
+ renderMethodOption = method => {
+ return option(
+ {
+ key: method,
+ value: method,
+ // e.stopPropagation() required here since otherwise Firefox triggers 2x
+ // onMouseDown events on <select> upon clicking on an <option>
+ onMouseDown: e => e.stopPropagation(),
+ },
+ method
+ );
+ };
+
+ renderMethodSelectElement = () => {
+ return select(
+ {
+ value: this.state.inputMethod,
+ className: "xhr-input-method",
+ onChange: this.handleMethodChange,
+ onMouseDown: this.onMouseDown,
+ onKeyDown: this.handleTab,
+ },
+ xhrMethods.map(this.renderMethodOption)
+ );
+ };
+
+ render() {
+ const { xhrBreakpoints } = this.props;
+ const explicitXhrBreakpoints = getExplicitXHRBreakpoints(xhrBreakpoints);
+ return React.createElement(
+ React.Fragment,
+ null,
+ this.renderCheckbox(explicitXhrBreakpoints),
+ explicitXhrBreakpoints.length === 0
+ ? this.renderXHRInput(this.handleNewSubmit)
+ : this.renderBreakpoints(explicitXhrBreakpoints)
+ );
+ }
+}
+
+const mapStateToProps = state => ({
+ xhrBreakpoints: getXHRBreakpoints(state),
+ shouldPauseOnAny: shouldPauseOnAnyXHR(state),
+});
+
+export default connect(mapStateToProps, {
+ setXHRBreakpoint: actions.setXHRBreakpoint,
+ removeXHRBreakpoint: actions.removeXHRBreakpoint,
+ enableXHRBreakpoint: actions.enableXHRBreakpoint,
+ disableXHRBreakpoint: actions.disableXHRBreakpoint,
+ updateXHRBreakpoint: actions.updateXHRBreakpoint,
+ togglePauseOnAny: actions.togglePauseOnAny,
+})(XHRBreakpoints);
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/index.js b/devtools/client/debugger/src/components/SecondaryPanes/index.js
new file mode 100644
index 0000000000..20830afc12
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/index.js
@@ -0,0 +1,548 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+const SplitBox = require("resource://devtools/client/shared/components/splitter/SplitBox.js");
+
+import React, { Component } from "devtools/client/shared/vendor/react";
+import {
+ div,
+ input,
+ label,
+ button,
+ a,
+} from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+import { connect } from "devtools/client/shared/vendor/react-redux";
+
+import actions from "../../actions/index";
+import {
+ getTopFrame,
+ getExpressions,
+ getPauseCommand,
+ isMapScopesEnabled,
+ getSelectedFrame,
+ getSelectedSource,
+ getThreads,
+ getCurrentThread,
+ getPauseReason,
+ getShouldBreakpointsPaneOpenOnPause,
+ getSkipPausing,
+ shouldLogEventBreakpoints,
+} from "../../selectors/index";
+
+import AccessibleImage from "../shared/AccessibleImage";
+import { prefs } from "../../utils/prefs";
+
+import Breakpoints from "./Breakpoints/index";
+import Expressions from "./Expressions";
+import Frames from "./Frames/index";
+import Threads from "./Threads";
+import Accordion from "../shared/Accordion";
+import CommandBar from "./CommandBar";
+import XHRBreakpoints from "./XHRBreakpoints";
+import EventListeners from "./EventListeners";
+import DOMMutationBreakpoints from "./DOMMutationBreakpoints";
+import WhyPaused from "./WhyPaused";
+
+import Scopes from "./Scopes";
+
+const classnames = require("resource://devtools/client/shared/classnames.js");
+
+function debugBtn(onClick, type, className, tooltip) {
+ return button(
+ {
+ onClick: onClick,
+ className: `${type} ${className}`,
+ key: type,
+ title: tooltip,
+ },
+ React.createElement(AccessibleImage, {
+ className: type,
+ title: tooltip,
+ "aria-label": tooltip,
+ })
+ );
+}
+
+const mdnLink =
+ "https://firefox-source-docs.mozilla.org/devtools-user/debugger/using_the_debugger_map_scopes_feature/";
+
+class SecondaryPanes extends Component {
+ constructor(props) {
+ super(props);
+
+ this.state = {
+ showExpressionsInput: false,
+ showXHRInput: false,
+ };
+ }
+
+ static get propTypes() {
+ return {
+ evaluateExpressionsForCurrentContext: PropTypes.func.isRequired,
+ expressions: PropTypes.array.isRequired,
+ hasFrames: PropTypes.bool.isRequired,
+ horizontal: PropTypes.bool.isRequired,
+ logEventBreakpoints: PropTypes.bool.isRequired,
+ mapScopesEnabled: PropTypes.bool.isRequired,
+ pauseReason: PropTypes.string.isRequired,
+ shouldBreakpointsPaneOpenOnPause: PropTypes.bool.isRequired,
+ thread: PropTypes.string.isRequired,
+ renderWhyPauseDelay: PropTypes.number.isRequired,
+ selectedFrame: PropTypes.object,
+ skipPausing: PropTypes.bool.isRequired,
+ source: PropTypes.object,
+ toggleEventLogging: PropTypes.func.isRequired,
+ resetBreakpointsPaneState: PropTypes.func.isRequired,
+ toggleMapScopes: PropTypes.func.isRequired,
+ threads: PropTypes.array.isRequired,
+ removeAllBreakpoints: PropTypes.func.isRequired,
+ removeAllXHRBreakpoints: PropTypes.func.isRequired,
+ };
+ }
+
+ onExpressionAdded = () => {
+ this.setState({ showExpressionsInput: false });
+ };
+
+ onXHRAdded = () => {
+ this.setState({ showXHRInput: false });
+ };
+
+ watchExpressionHeaderButtons() {
+ const { expressions } = this.props;
+ const buttons = [];
+
+ if (expressions.length) {
+ buttons.push(
+ debugBtn(
+ () => {
+ this.props.evaluateExpressionsForCurrentContext();
+ },
+ "refresh",
+ "active",
+ L10N.getStr("watchExpressions.refreshButton")
+ )
+ );
+ }
+ buttons.push(
+ debugBtn(
+ () => {
+ if (!prefs.expressionsVisible) {
+ this.onWatchExpressionPaneToggle(true);
+ }
+ this.setState({ showExpressionsInput: true });
+ },
+ "plus",
+ "active",
+ L10N.getStr("expressions.placeholder")
+ )
+ );
+ return buttons;
+ }
+
+ xhrBreakpointsHeaderButtons() {
+ return [
+ debugBtn(
+ () => {
+ if (!prefs.xhrBreakpointsVisible) {
+ this.onXHRPaneToggle(true);
+ }
+ this.setState({ showXHRInput: true });
+ },
+ "plus",
+ "active",
+ L10N.getStr("xhrBreakpoints.label")
+ ),
+
+ debugBtn(
+ () => {
+ this.props.removeAllXHRBreakpoints();
+ },
+ "removeAll",
+ "active",
+ L10N.getStr("xhrBreakpoints.removeAll.tooltip")
+ ),
+ ];
+ }
+
+ breakpointsHeaderButtons() {
+ return [
+ debugBtn(
+ () => {
+ this.props.removeAllBreakpoints();
+ },
+ "removeAll",
+ "active",
+ L10N.getStr("breakpointMenuItem.deleteAll")
+ ),
+ ];
+ }
+
+ getScopeItem() {
+ return {
+ header: L10N.getStr("scopes.header"),
+ className: "scopes-pane",
+ component: React.createElement(Scopes, null),
+ opened: prefs.scopesVisible,
+ buttons: this.getScopesButtons(),
+ onToggle: opened => {
+ prefs.scopesVisible = opened;
+ },
+ };
+ }
+
+ getScopesButtons() {
+ const { selectedFrame, mapScopesEnabled, source } = this.props;
+
+ if (!selectedFrame || !source?.isOriginal || source?.isPrettyPrinted) {
+ return null;
+ }
+
+ return [
+ div(
+ {
+ key: "scopes-buttons",
+ },
+ label(
+ {
+ className: "map-scopes-header",
+ title: L10N.getStr("scopes.showOriginalScopesTooltip"),
+ onClick: e => e.stopPropagation(),
+ },
+ input({
+ type: "checkbox",
+ checked: mapScopesEnabled ? "checked" : "",
+ onChange: e => this.props.toggleMapScopes(),
+ }),
+ L10N.getStr("scopes.showOriginalScopes")
+ ),
+ a(
+ {
+ className: "mdn",
+ target: "_blank",
+ href: mdnLink,
+ onClick: e => e.stopPropagation(),
+ title: L10N.getStr("scopes.showOriginalScopesHelpTooltip"),
+ },
+ React.createElement(AccessibleImage, {
+ className: "shortcuts",
+ })
+ )
+ ),
+ ];
+ }
+
+ getEventButtons() {
+ const { logEventBreakpoints } = this.props;
+ return [
+ div(
+ {
+ key: "events-buttons",
+ },
+ label(
+ {
+ className: "events-header",
+ title: L10N.getStr("eventlisteners.log.label"),
+ },
+ input({
+ type: "checkbox",
+ checked: logEventBreakpoints ? "checked" : "",
+ onChange: e => this.props.toggleEventLogging(),
+ }),
+ L10N.getStr("eventlisteners.log")
+ )
+ ),
+ ];
+ }
+
+ onWatchExpressionPaneToggle(opened) {
+ prefs.expressionsVisible = opened;
+ }
+
+ getWatchItem() {
+ return {
+ header: L10N.getStr("watchExpressions.header"),
+ id: "watch-expressions-pane",
+ className: "watch-expressions-pane",
+ buttons: this.watchExpressionHeaderButtons(),
+ component: React.createElement(Expressions, {
+ showInput: this.state.showExpressionsInput,
+ onExpressionAdded: this.onExpressionAdded,
+ }),
+ opened: prefs.expressionsVisible,
+ onToggle: this.onWatchExpressionPaneToggle,
+ };
+ }
+
+ onXHRPaneToggle(opened) {
+ prefs.xhrBreakpointsVisible = opened;
+ }
+
+ getXHRItem() {
+ const { pauseReason } = this.props;
+
+ return {
+ header: L10N.getStr("xhrBreakpoints.header"),
+ id: "xhr-breakpoints-pane",
+ className: "xhr-breakpoints-pane",
+ buttons: this.xhrBreakpointsHeaderButtons(),
+ component: React.createElement(XHRBreakpoints, {
+ showInput: this.state.showXHRInput,
+ onXHRAdded: this.onXHRAdded,
+ }),
+ opened: prefs.xhrBreakpointsVisible || pauseReason === "XHR",
+ onToggle: this.onXHRPaneToggle,
+ };
+ }
+
+ getCallStackItem() {
+ return {
+ header: L10N.getStr("callStack.header"),
+ id: "call-stack-pane",
+ className: "call-stack-pane",
+ component: React.createElement(Frames, {
+ panel: "debugger",
+ }),
+ opened: prefs.callStackVisible,
+ onToggle: opened => {
+ prefs.callStackVisible = opened;
+ },
+ };
+ }
+
+ getThreadsItem() {
+ return {
+ header: L10N.getStr("threadsHeader"),
+ id: "threads-pane",
+ className: "threads-pane",
+ component: React.createElement(Threads, null),
+ opened: prefs.threadsVisible,
+ onToggle: opened => {
+ prefs.threadsVisible = opened;
+ },
+ };
+ }
+
+ getBreakpointsItem() {
+ const { pauseReason, shouldBreakpointsPaneOpenOnPause, thread } =
+ this.props;
+
+ return {
+ header: L10N.getStr("breakpoints.header"),
+ id: "breakpoints-pane",
+ className: "breakpoints-pane",
+ buttons: this.breakpointsHeaderButtons(),
+ component: React.createElement(Breakpoints),
+ opened:
+ prefs.breakpointsVisible ||
+ (pauseReason === "breakpoint" && shouldBreakpointsPaneOpenOnPause),
+ onToggle: opened => {
+ prefs.breakpointsVisible = opened;
+ // one-shot flag used to force open the Breakpoints Pane only
+ // when hitting a breakpoint, but not when selecting frames etc...
+ if (shouldBreakpointsPaneOpenOnPause) {
+ this.props.resetBreakpointsPaneState(thread);
+ }
+ },
+ };
+ }
+
+ getEventListenersItem() {
+ const { pauseReason } = this.props;
+
+ return {
+ header: L10N.getStr("eventListenersHeader1"),
+ id: "event-listeners-pane",
+ className: "event-listeners-pane",
+ buttons: this.getEventButtons(),
+ component: React.createElement(EventListeners, null),
+ opened: prefs.eventListenersVisible || pauseReason === "eventBreakpoint",
+ onToggle: opened => {
+ prefs.eventListenersVisible = opened;
+ },
+ };
+ }
+
+ getDOMMutationsItem() {
+ const { pauseReason } = this.props;
+
+ return {
+ header: L10N.getStr("domMutationHeader"),
+ id: "dom-mutations-pane",
+ className: "dom-mutations-pane",
+ buttons: [],
+ component: React.createElement(DOMMutationBreakpoints, null),
+ opened:
+ prefs.domMutationBreakpointsVisible ||
+ pauseReason === "mutationBreakpoint",
+ onToggle: opened => {
+ prefs.domMutationBreakpointsVisible = opened;
+ },
+ };
+ }
+
+ getStartItems() {
+ const items = [];
+ const { horizontal, hasFrames } = this.props;
+
+ if (horizontal) {
+ if (this.props.threads.length) {
+ items.push(this.getThreadsItem());
+ }
+
+ items.push(this.getWatchItem());
+ }
+
+ items.push(this.getBreakpointsItem());
+
+ if (hasFrames) {
+ items.push(this.getCallStackItem());
+ if (horizontal) {
+ items.push(this.getScopeItem());
+ }
+ }
+
+ items.push(this.getXHRItem());
+
+ items.push(this.getEventListenersItem());
+
+ items.push(this.getDOMMutationsItem());
+
+ return items;
+ }
+
+ getEndItems() {
+ if (this.props.horizontal) {
+ return [];
+ }
+
+ const items = [];
+ if (this.props.threads.length) {
+ items.push(this.getThreadsItem());
+ }
+
+ items.push(this.getWatchItem());
+
+ if (this.props.hasFrames) {
+ items.push(this.getScopeItem());
+ }
+
+ return items;
+ }
+
+ getItems() {
+ return [...this.getStartItems(), ...this.getEndItems()];
+ }
+
+ renderHorizontalLayout() {
+ const { renderWhyPauseDelay } = this.props;
+ return div(
+ null,
+ React.createElement(WhyPaused, {
+ delay: renderWhyPauseDelay,
+ }),
+ React.createElement(Accordion, {
+ items: this.getItems(),
+ })
+ );
+ }
+
+ renderVerticalLayout() {
+ return React.createElement(SplitBox, {
+ initialSize: "300px",
+ minSize: 10,
+ maxSize: "50%",
+ splitterSize: 1,
+ startPanel: div(
+ {
+ style: {
+ width: "inherit",
+ },
+ },
+ React.createElement(WhyPaused, {
+ delay: this.props.renderWhyPauseDelay,
+ }),
+ React.createElement(Accordion, {
+ items: this.getStartItems(),
+ })
+ ),
+ endPanel: React.createElement(Accordion, {
+ items: this.getEndItems(),
+ }),
+ });
+ }
+
+ render() {
+ const { skipPausing } = this.props;
+ return div(
+ {
+ className: "secondary-panes-wrapper",
+ },
+ React.createElement(CommandBar, {
+ horizontal: this.props.horizontal,
+ }),
+ React.createElement(
+ "div",
+ {
+ className: classnames(
+ "secondary-panes",
+ skipPausing && "skip-pausing"
+ ),
+ },
+ this.props.horizontal
+ ? this.renderHorizontalLayout()
+ : this.renderVerticalLayout()
+ )
+ );
+ }
+}
+
+// Checks if user is in debugging mode and adds a delay preventing
+// excessive vertical 'jumpiness'
+function getRenderWhyPauseDelay(state, thread) {
+ const inPauseCommand = !!getPauseCommand(state, thread);
+
+ if (!inPauseCommand) {
+ return 100;
+ }
+
+ return 0;
+}
+
+const mapStateToProps = state => {
+ const thread = getCurrentThread(state);
+ const selectedFrame = getSelectedFrame(state, thread);
+ const pauseReason = getPauseReason(state, thread);
+ const shouldBreakpointsPaneOpenOnPause = getShouldBreakpointsPaneOpenOnPause(
+ state,
+ thread
+ );
+
+ return {
+ expressions: getExpressions(state),
+ hasFrames: !!getTopFrame(state, thread),
+ renderWhyPauseDelay: getRenderWhyPauseDelay(state, thread),
+ selectedFrame,
+ mapScopesEnabled: isMapScopesEnabled(state),
+ threads: getThreads(state),
+ skipPausing: getSkipPausing(state),
+ logEventBreakpoints: shouldLogEventBreakpoints(state),
+ source: getSelectedSource(state),
+ pauseReason: pauseReason?.type ?? "",
+ shouldBreakpointsPaneOpenOnPause,
+ thread,
+ };
+};
+
+export default connect(mapStateToProps, {
+ evaluateExpressionsForCurrentContext:
+ actions.evaluateExpressionsForCurrentContext,
+ toggleMapScopes: actions.toggleMapScopes,
+ breakOnNext: actions.breakOnNext,
+ toggleEventLogging: actions.toggleEventLogging,
+ removeAllBreakpoints: actions.removeAllBreakpoints,
+ removeAllXHRBreakpoints: actions.removeAllXHRBreakpoints,
+ resetBreakpointsPaneState: actions.resetBreakpointsPaneState,
+})(SecondaryPanes);
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/moz.build b/devtools/client/debugger/src/components/SecondaryPanes/moz.build
new file mode 100644
index 0000000000..33cfa2e316
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/moz.build
@@ -0,0 +1,22 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DIRS += [
+ "Breakpoints",
+ "Frames",
+]
+
+CompiledModules(
+ "CommandBar.js",
+ "DOMMutationBreakpoints.js",
+ "EventListeners.js",
+ "Expressions.js",
+ "index.js",
+ "Scopes.js",
+ "Thread.js",
+ "Threads.js",
+ "WhyPaused.js",
+ "XHRBreakpoints.js",
+)
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/tests/CommandBar.spec.js b/devtools/client/debugger/src/components/SecondaryPanes/tests/CommandBar.spec.js
new file mode 100644
index 0000000000..b82997eb9a
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/tests/CommandBar.spec.js
@@ -0,0 +1,78 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React from "devtools/client/shared/vendor/react";
+import { shallow } from "enzyme";
+import CommandBar from "../CommandBar";
+
+describe("CommandBar", () => {
+ it("f8 key command calls props.breakOnNext when not in paused state", () => {
+ const props = {
+ breakOnNext: jest.fn(),
+ resume: jest.fn(),
+ isPaused: false,
+ };
+ const mockEvent = {
+ preventDefault: jest.fn(),
+ stopPropagation: jest.fn(),
+ };
+
+ // The "on" spy will see all the keyboard listeners being registered by
+ // the shortcuts.on function
+ const context = { shortcuts: { on: jest.fn() } };
+
+ shallow(React.createElement(CommandBar.WrappedComponent, props), {
+ context,
+ });
+
+ // get the keyboard event listeners recorded from the "on" spy.
+ // this will be an array where each item is itself a two item array
+ // containing the key code and the corresponding handler for that key code
+ const keyEventHandlers = context.shortcuts.on.mock.calls;
+
+ // simulate pressing the F8 key by calling the F8 handlers
+ keyEventHandlers
+ .filter(i => i[0] === "F8")
+ .forEach(([_, handler]) => {
+ handler(mockEvent);
+ });
+
+ expect(props.breakOnNext).toHaveBeenCalled();
+ expect(props.resume).not.toHaveBeenCalled();
+ });
+
+ it("f8 key command calls props.resume when in paused state", () => {
+ const props = {
+ breakOnNext: jest.fn(),
+ resume: jest.fn(),
+ isPaused: true,
+ };
+ const mockEvent = {
+ preventDefault: jest.fn(),
+ stopPropagation: jest.fn(),
+ };
+
+ // The "on" spy will see all the keyboard listeners being registered by
+ // the shortcuts.on function
+ const context = { shortcuts: { on: jest.fn() } };
+
+ shallow(React.createElement(CommandBar.WrappedComponent, props), {
+ context,
+ });
+
+ // get the keyboard event listeners recorded from the "on" spy.
+ // this will be an array where each item is itself a two item array
+ // containing the key code and the corresponding handler for that key code
+ const keyEventHandlers = context.shortcuts.on.mock.calls;
+
+ // simulate pressing the F8 key by calling the F8 handlers
+ keyEventHandlers
+ .filter(i => i[0] === "F8")
+ .forEach(([_, handler]) => {
+ handler(mockEvent);
+ });
+ expect(props.resume).toHaveBeenCalled();
+ expect(props.breakOnNext).not.toHaveBeenCalled();
+ });
+});
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/tests/EventListeners.spec.js b/devtools/client/debugger/src/components/SecondaryPanes/tests/EventListeners.spec.js
new file mode 100644
index 0000000000..58d7776e5a
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/tests/EventListeners.spec.js
@@ -0,0 +1,136 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React from "devtools/client/shared/vendor/react";
+import { shallow } from "enzyme";
+import EventListeners from "../EventListeners";
+
+function getCategories() {
+ return [
+ {
+ name: "Category 1",
+ events: [
+ { name: "Subcategory 1", id: "category1.subcategory1" },
+ { name: "Subcategory 2", id: "category1.subcategory2" },
+ ],
+ },
+ {
+ name: "Category 2",
+ events: [
+ { name: "Subcategory 3", id: "category2.subcategory1" },
+ { name: "Subcategory 4", id: "category2.subcategory2" },
+ ],
+ },
+ ];
+}
+
+function generateDefaults(overrides = {}) {
+ const defaults = {
+ activeEventListeners: [],
+ expandedCategories: [],
+ categories: [],
+ };
+
+ return { ...defaults, ...overrides };
+}
+
+function render(overrides = {}) {
+ const props = generateDefaults(overrides);
+ const component = shallow(
+ React.createElement(EventListeners.WrappedComponent, props)
+ );
+ return { component, props };
+}
+
+describe("EventListeners", () => {
+ it("should render", async () => {
+ const { component } = render();
+ expect(component).toMatchSnapshot();
+ });
+
+ it("should render categories appropriately", async () => {
+ const props = {
+ ...generateDefaults(),
+ categories: getCategories(),
+ };
+ const { component } = render(props);
+ expect(component).toMatchSnapshot();
+ });
+
+ it("should render expanded categories appropriately", async () => {
+ const props = {
+ ...generateDefaults(),
+ categories: getCategories(),
+ expandedCategories: ["Category 2"],
+ };
+ const { component } = render(props);
+ expect(component).toMatchSnapshot();
+ });
+
+ it("should render checked subcategories appropriately", async () => {
+ const props = {
+ ...generateDefaults(),
+ categories: getCategories(),
+ activeEventListeners: ["category1.subcategory2"],
+ expandedCategories: ["Category 1"],
+ };
+ const { component } = render(props);
+ expect(component).toMatchSnapshot();
+ });
+
+ it("should filter the event listeners based on the event name", async () => {
+ const props = {
+ ...generateDefaults(),
+ categories: getCategories(),
+ };
+ const { component } = render(props);
+ component.find(".event-search-input").simulate("focus");
+
+ const searchInput = component.find(".event-search-input");
+ // Simulate a search query of "Subcategory 3" to display just one event which
+ // will be the Subcategory 3 event
+ searchInput.simulate("change", {
+ currentTarget: { value: "Subcategory 3" },
+ });
+
+ const displayedEvents = component.find(".event-listener-event");
+ expect(displayedEvents).toHaveLength(1);
+ });
+
+ it("should filter the event listeners based on the category name", async () => {
+ const props = {
+ ...generateDefaults(),
+ categories: getCategories(),
+ };
+ const { component } = render(props);
+ component.find(".event-search-input").simulate("focus");
+
+ const searchInput = component.find(".event-search-input");
+ // Simulate a search query of "Category 1" to display two events which will be
+ // the Subcategory 1 event and the Subcategory 2 event
+ searchInput.simulate("change", { currentTarget: { value: "Category 1" } });
+
+ const displayedEvents = component.find(".event-listener-event");
+ expect(displayedEvents).toHaveLength(2);
+ });
+
+ it("should be case insensitive when filtering events and categories", async () => {
+ const props = {
+ ...generateDefaults(),
+ categories: getCategories(),
+ };
+ const { component } = render(props);
+ component.find(".event-search-input").simulate("focus");
+
+ const searchInput = component.find(".event-search-input");
+ // Simulate a search query of "Subcategory 3" to display just one event which
+ // will be the Subcategory 3 event
+ searchInput.simulate("change", {
+ currentTarget: { value: "sUbCaTeGoRy 3" },
+ });
+
+ const displayedEvents = component.find(".event-listener-event");
+ expect(displayedEvents).toHaveLength(1);
+ });
+});
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/tests/Expressions.spec.js b/devtools/client/debugger/src/components/SecondaryPanes/tests/Expressions.spec.js
new file mode 100644
index 0000000000..685c636f05
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/tests/Expressions.spec.js
@@ -0,0 +1,77 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React from "devtools/client/shared/vendor/react";
+import { shallow } from "enzyme";
+import Expressions from "../Expressions";
+
+function generateDefaults(overrides) {
+ return {
+ evaluateExpressions: async () => {},
+ expressions: [
+ {
+ input: "expression1",
+ value: {
+ result: {
+ value: "foo",
+ class: "",
+ },
+ },
+ },
+ {
+ input: "expression2",
+ value: {
+ result: {
+ value: "bar",
+ class: "",
+ },
+ },
+ },
+ ],
+ ...overrides,
+ };
+}
+
+function render(overrides = {}) {
+ const props = generateDefaults(overrides);
+ const component = shallow(
+ React.createElement(Expressions.WrappedComponent, props)
+ );
+ return { component, props };
+}
+
+describe("Expressions", () => {
+ it("should render", async () => {
+ const { component } = render();
+ expect(component).toMatchSnapshot();
+ });
+
+ it("should always have unique keys", async () => {
+ const overrides = {
+ expressions: [
+ {
+ input: "expression1",
+ value: {
+ result: {
+ value: undefined,
+ class: "",
+ },
+ },
+ },
+ {
+ input: "expression2",
+ value: {
+ result: {
+ value: undefined,
+ class: "",
+ },
+ },
+ },
+ ],
+ };
+
+ const { component } = render(overrides);
+ expect(component).toMatchSnapshot();
+ });
+});
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/tests/XHRBreakpoints.spec.js b/devtools/client/debugger/src/components/SecondaryPanes/tests/XHRBreakpoints.spec.js
new file mode 100644
index 0000000000..532c95e4ad
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/tests/XHRBreakpoints.spec.js
@@ -0,0 +1,341 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React from "devtools/client/shared/vendor/react";
+import { mount } from "enzyme";
+import XHRBreakpoints from "../XHRBreakpoints";
+
+const xhrMethods = [
+ "ANY",
+ "GET",
+ "POST",
+ "PUT",
+ "HEAD",
+ "DELETE",
+ "PATCH",
+ "OPTIONS",
+];
+
+// default state includes xhrBreakpoints[0] which is the checkbox that
+// enables breaking on any url during an XMLHTTPRequest
+function generateDefaultState(propsOverride) {
+ return {
+ xhrBreakpoints: [
+ {
+ path: "",
+ method: "ANY",
+ disabled: false,
+ loading: false,
+ text: 'URL contains ""',
+ },
+ ],
+ enableXHRBreakpoint: () => {},
+ disableXHRBreakpoint: () => {},
+ updateXHRBreakpoint: () => {},
+ removeXHRBreakpoint: () => {},
+ setXHRBreakpoint: () => {},
+ togglePauseOnAny: () => {},
+ showInput: false,
+ shouldPauseOnAny: false,
+ onXHRAdded: () => {},
+ ...propsOverride,
+ };
+}
+
+function renderXHRBreakpointsComponent(propsOverride) {
+ const props = generateDefaultState(propsOverride);
+ const xhrBreakpointsComponent = mount(
+ React.createElement(XHRBreakpoints.WrappedComponent, props)
+ );
+ return xhrBreakpointsComponent;
+}
+
+describe("XHR Breakpoints", function () {
+ it("should render with 0 expressions passed from props", function () {
+ const xhrBreakpointsComponent = renderXHRBreakpointsComponent();
+ expect(xhrBreakpointsComponent).toMatchSnapshot();
+ });
+
+ it("should render with 8 expressions passed from props", function () {
+ const allXHRBreakpointMethods = {
+ xhrBreakpoints: [
+ {
+ path: "",
+ method: "ANY",
+ disabled: false,
+ loading: false,
+ text: 'URL contains ""',
+ },
+ {
+ path: "this is any",
+ method: "ANY",
+ disabled: false,
+ loading: false,
+ text: 'URL contains "this is any"',
+ },
+ {
+ path: "this is get",
+ method: "GET",
+ disabled: false,
+ loading: false,
+ text: 'URL contains "this is get"',
+ },
+ {
+ path: "this is post",
+ method: "POST",
+ disabled: false,
+ loading: false,
+ text: 'URL contains "this is post"',
+ },
+ {
+ path: "this is put",
+ method: "PUT",
+ disabled: false,
+ loading: false,
+ text: 'URL contains "this is put"',
+ },
+ {
+ path: "this is head",
+ method: "HEAD",
+ disabled: false,
+ loading: false,
+ text: 'URL contains "this is head"',
+ },
+ {
+ path: "this is delete",
+ method: "DELETE",
+ disabled: false,
+ loading: false,
+ text: 'URL contains "this is delete"',
+ },
+ {
+ path: "this is patch",
+ method: "PATCH",
+ disabled: false,
+ loading: false,
+ text: 'URL contains "this is patch"',
+ },
+ {
+ path: "this is options",
+ method: "OPTIONS",
+ disabled: false,
+ loading: false,
+ text: 'URL contains "this is options"',
+ },
+ ],
+ };
+
+ const xhrBreakpointsComponent = renderXHRBreakpointsComponent(
+ allXHRBreakpointMethods
+ );
+ expect(xhrBreakpointsComponent).toMatchSnapshot();
+ });
+
+ it("should display xhr-input-method on click", function () {
+ const xhrBreakpointsComponent = renderXHRBreakpointsComponent();
+ xhrBreakpointsComponent.find(".xhr-input-url").simulate("focus");
+
+ const xhrInputContainer = xhrBreakpointsComponent.find(
+ ".xhr-input-container"
+ );
+ expect(xhrInputContainer.hasClass("focused")).toBeTruthy();
+ });
+
+ it("should have focused and editing default to false", function () {
+ const xhrBreakpointsComponent = renderXHRBreakpointsComponent();
+ expect(xhrBreakpointsComponent.state("focused")).toBe(false);
+ expect(xhrBreakpointsComponent.state("editing")).toBe(false);
+ });
+
+ it("should have state {..focused: true, editing: true} on focus", function () {
+ const xhrBreakpointsComponent = renderXHRBreakpointsComponent();
+ xhrBreakpointsComponent.find(".xhr-input-url").simulate("focus");
+ expect(xhrBreakpointsComponent.state("focused")).toBe(true);
+ expect(xhrBreakpointsComponent.state("editing")).toBe(true);
+ });
+
+ // shifting focus from .xhr-input to any other element apart from
+ // .xhr-input-method should unrender .xhr-input-method
+ it("shifting focus should unrender XHR methods", function () {
+ const propsOverride = {
+ onXHRAdded: jest.fn,
+ togglePauseOnAny: jest.fn,
+ };
+ const xhrBreakpointsComponent =
+ renderXHRBreakpointsComponent(propsOverride);
+ xhrBreakpointsComponent.find(".xhr-input-url").simulate("focus");
+ let xhrInputContainer = xhrBreakpointsComponent.find(
+ ".xhr-input-container"
+ );
+ expect(xhrInputContainer.hasClass("focused")).toBeTruthy();
+
+ xhrBreakpointsComponent.find(".breakpoints-options").simulate("mousedown");
+ expect(xhrBreakpointsComponent.state("focused")).toBe(true);
+ expect(xhrBreakpointsComponent.state("editing")).toBe(true);
+ expect(xhrBreakpointsComponent.state("clickedOnFormElement")).toBe(false);
+
+ xhrBreakpointsComponent.find(".xhr-input-url").simulate("blur");
+ expect(xhrBreakpointsComponent.state("focused")).toBe(false);
+ expect(xhrBreakpointsComponent.state("editing")).toBe(false);
+ expect(xhrBreakpointsComponent.state("clickedOnFormElement")).toBe(false);
+
+ xhrBreakpointsComponent.find(".breakpoints-options").simulate("click");
+
+ xhrInputContainer = xhrBreakpointsComponent.find(".xhr-input-container");
+ expect(xhrInputContainer.hasClass("focused")).not.toBeTruthy();
+ });
+
+ // shifting focus from .xhr-input to .xhr-input-method
+ // should not unrender .xhr-input-method
+ it("shifting focus to XHR methods should not unrender", function () {
+ const xhrBreakpointsComponent = renderXHRBreakpointsComponent();
+ xhrBreakpointsComponent.find(".xhr-input-url").simulate("focus");
+
+ xhrBreakpointsComponent.find(".xhr-input-method").simulate("mousedown");
+ expect(xhrBreakpointsComponent.state("focused")).toBe(true);
+ expect(xhrBreakpointsComponent.state("editing")).toBe(false);
+ expect(xhrBreakpointsComponent.state("clickedOnFormElement")).toBe(true);
+
+ xhrBreakpointsComponent.find(".xhr-input-url").simulate("blur");
+ expect(xhrBreakpointsComponent.state("focused")).toBe(true);
+ expect(xhrBreakpointsComponent.state("editing")).toBe(false);
+ expect(xhrBreakpointsComponent.state("clickedOnFormElement")).toBe(false);
+
+ xhrBreakpointsComponent.find(".xhr-input-method").simulate("click");
+ const xhrInputContainer = xhrBreakpointsComponent.find(
+ ".xhr-input-container"
+ );
+ expect(xhrInputContainer.hasClass("focused")).toBeTruthy();
+ });
+
+ it("should have all 8 methods available as options", function () {
+ const xhrBreakpointsComponent = renderXHRBreakpointsComponent();
+ xhrBreakpointsComponent.find(".xhr-input-url").simulate("focus");
+
+ const xhrInputMethod = xhrBreakpointsComponent.find(".xhr-input-method");
+ expect(xhrInputMethod.children()).toHaveLength(8);
+
+ const actualXHRMethods = [];
+ const expectedXHRMethods = xhrMethods;
+
+ // fill the actualXHRMethods array with actual methods displayed in DOM
+ for (let i = 0; i < xhrInputMethod.children().length; i++) {
+ actualXHRMethods.push(xhrInputMethod.childAt(i).key());
+ }
+
+ // check each expected XHR Method to see if they match the actual methods
+ expectedXHRMethods.forEach((expectedMethod, i) => {
+ function compareMethods(actualMethod) {
+ return expectedMethod === actualMethod;
+ }
+ expect(actualXHRMethods.find(compareMethods)).toBeTruthy();
+ });
+ });
+
+ it("should return focus to input box after selecting a method", function () {
+ const xhrBreakpointsComponent = renderXHRBreakpointsComponent();
+
+ // focus starts off at .xhr-input
+ xhrBreakpointsComponent.find(".xhr-input-url").simulate("focus");
+
+ // click on method options and select GET
+ const methodEvent = { target: { value: "GET" } };
+ xhrBreakpointsComponent.find(".xhr-input-method").simulate("mousedown");
+ expect(xhrBreakpointsComponent.state("inputMethod")).toBe("ANY");
+ expect(xhrBreakpointsComponent.state("editing")).toBe(false);
+ xhrBreakpointsComponent
+ .find(".xhr-input-method")
+ .simulate("change", methodEvent);
+
+ // if state.editing changes from false to true, infer that
+ // this._input.focus() is called, which shifts focus back to input box
+ expect(xhrBreakpointsComponent.state("inputMethod")).toBe("GET");
+ expect(xhrBreakpointsComponent.state("editing")).toBe(true);
+ });
+
+ it("should submit the URL and method when adding a breakpoint", function () {
+ const setXHRBreakpointCallback = jest.fn();
+ const propsOverride = {
+ setXHRBreakpoint: setXHRBreakpointCallback,
+ onXHRAdded: jest.fn(),
+ };
+ const mockEvent = {
+ preventDefault: jest.fn(),
+ stopPropagation: jest.fn(),
+ };
+ const availableXHRMethods = xhrMethods;
+ expect(!!availableXHRMethods.length).toBeTruthy();
+
+ // check each of the available methods to see whether
+ // adding them as a method to a new breakpoint works as expected
+ availableXHRMethods.forEach(function (method) {
+ const xhrBreakpointsComponent =
+ renderXHRBreakpointsComponent(propsOverride);
+ xhrBreakpointsComponent.find(".xhr-input-url").simulate("focus");
+ const urlValue = `${method.toLowerCase()}URLValue`;
+
+ // simulate DOM event adding urlValue to .xhr-input
+ const xhrInput = xhrBreakpointsComponent.find(".xhr-input-url");
+ xhrInput.simulate("change", { target: { value: urlValue } });
+
+ // simulate DOM event adding the input method to .xhr-input-method
+ const xhrInputMethod = xhrBreakpointsComponent.find(".xhr-input-method");
+ xhrInputMethod.simulate("change", { target: { value: method } });
+
+ xhrBreakpointsComponent.find("form").simulate("submit", mockEvent);
+ expect(setXHRBreakpointCallback).toHaveBeenCalledWith(urlValue, method);
+ });
+ });
+
+ it("should submit the URL and method when editing a breakpoint", function () {
+ const setXHRBreakpointCallback = jest.fn();
+ const mockEvent = {
+ preventDefault: jest.fn(),
+ stopPropagation: jest.fn(),
+ };
+ const propsOverride = {
+ updateXHRBreakpoint: setXHRBreakpointCallback,
+ onXHRAdded: jest.fn(),
+ xhrBreakpoints: [
+ {
+ path: "",
+ method: "ANY",
+ disabled: false,
+ loading: false,
+ text: 'URL contains ""',
+ },
+ {
+ path: "this is GET",
+ method: "GET",
+ disabled: false,
+ loading: false,
+ text: 'URL contains "this is get"',
+ },
+ ],
+ };
+ const xhrBreakpointsComponent =
+ renderXHRBreakpointsComponent(propsOverride);
+
+ // load xhrBreakpoints pane with one existing xhrBreakpoint
+ const existingXHRbreakpoint =
+ xhrBreakpointsComponent.find(".xhr-container");
+ expect(existingXHRbreakpoint).toHaveLength(1);
+
+ // double click on existing breakpoint
+ existingXHRbreakpoint.simulate("doubleclick");
+ const xhrInput = xhrBreakpointsComponent.find(".xhr-input-url");
+ xhrInput.simulate("focus");
+
+ // change inputs and submit form
+ const xhrInputMethod = xhrBreakpointsComponent.find(".xhr-input-method");
+ xhrInput.simulate("change", { target: { value: "POSTURLValue" } });
+ xhrInputMethod.simulate("change", { target: { value: "POST" } });
+ xhrBreakpointsComponent.find("form").simulate("submit", mockEvent);
+ expect(setXHRBreakpointCallback).toHaveBeenCalledWith(
+ 1,
+ "POSTURLValue",
+ "POST"
+ );
+ });
+});
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/tests/__snapshots__/EventListeners.spec.js.snap b/devtools/client/debugger/src/components/SecondaryPanes/tests/__snapshots__/EventListeners.spec.js.snap
new file mode 100644
index 0000000000..cc2ddf09f6
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/tests/__snapshots__/EventListeners.spec.js.snap
@@ -0,0 +1,408 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`EventListeners should render 1`] = `
+<div
+ className="event-listeners"
+>
+ <div
+ className="event-search-container"
+ >
+ <form
+ className="event-search-form"
+ onSubmit={[Function]}
+ >
+ <input
+ className="event-search-input"
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Filter by event type"
+ value=""
+ />
+ </form>
+ </div>
+ <div
+ className="event-listeners-content"
+ >
+ <ul
+ className="event-listeners-list"
+ />
+ </div>
+</div>
+`;
+
+exports[`EventListeners should render categories appropriately 1`] = `
+<div
+ className="event-listeners"
+>
+ <div
+ className="event-search-container"
+ >
+ <form
+ className="event-search-form"
+ onSubmit={[Function]}
+ >
+ <input
+ className="event-search-input"
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Filter by event type"
+ value=""
+ />
+ </form>
+ </div>
+ <div
+ className="event-listeners-content"
+ >
+ <ul
+ className="event-listeners-list"
+ >
+ <li
+ className="event-listener-group"
+ key="0"
+ >
+ <div
+ className="event-listener-header"
+ >
+ <button
+ className="event-listener-expand"
+ onClick={[Function]}
+ >
+ <AccessibleImage
+ className="arrow"
+ />
+ </button>
+ <label
+ className="event-listener-label"
+ >
+ <input
+ checked={false}
+ onChange={[Function]}
+ type="checkbox"
+ value="Category 1"
+ />
+ <span
+ className="event-listener-category"
+ >
+ Category 1
+ </span>
+ </label>
+ </div>
+ </li>
+ <li
+ className="event-listener-group"
+ key="1"
+ >
+ <div
+ className="event-listener-header"
+ >
+ <button
+ className="event-listener-expand"
+ onClick={[Function]}
+ >
+ <AccessibleImage
+ className="arrow"
+ />
+ </button>
+ <label
+ className="event-listener-label"
+ >
+ <input
+ checked={false}
+ onChange={[Function]}
+ type="checkbox"
+ value="Category 2"
+ />
+ <span
+ className="event-listener-category"
+ >
+ Category 2
+ </span>
+ </label>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div>
+`;
+
+exports[`EventListeners should render checked subcategories appropriately 1`] = `
+<div
+ className="event-listeners"
+>
+ <div
+ className="event-search-container"
+ >
+ <form
+ className="event-search-form"
+ onSubmit={[Function]}
+ >
+ <input
+ className="event-search-input"
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Filter by event type"
+ value=""
+ />
+ </form>
+ </div>
+ <div
+ className="event-listeners-content"
+ >
+ <ul
+ className="event-listeners-list"
+ >
+ <li
+ className="event-listener-group"
+ key="0"
+ >
+ <div
+ className="event-listener-header"
+ >
+ <button
+ className="event-listener-expand"
+ onClick={[Function]}
+ >
+ <AccessibleImage
+ className="arrow expanded"
+ />
+ </button>
+ <label
+ className="event-listener-label"
+ >
+ <input
+ checked={false}
+ onChange={[Function]}
+ type="checkbox"
+ value="Category 1"
+ />
+ <span
+ className="event-listener-category"
+ >
+ Category 1
+ </span>
+ </label>
+ </div>
+ <ul>
+ <li
+ className="event-listener-event"
+ key="category1.subcategory1"
+ >
+ <label
+ className="event-listener-label"
+ >
+ <input
+ checked={false}
+ onChange={[Function]}
+ type="checkbox"
+ value="category1.subcategory1"
+ />
+ <span
+ className="event-listener-name"
+ >
+ Subcategory 1
+ </span>
+ </label>
+ </li>
+ <li
+ className="event-listener-event"
+ key="category1.subcategory2"
+ >
+ <label
+ className="event-listener-label"
+ >
+ <input
+ checked={true}
+ onChange={[Function]}
+ type="checkbox"
+ value="category1.subcategory2"
+ />
+ <span
+ className="event-listener-name"
+ >
+ Subcategory 2
+ </span>
+ </label>
+ </li>
+ </ul>
+ </li>
+ <li
+ className="event-listener-group"
+ key="1"
+ >
+ <div
+ className="event-listener-header"
+ >
+ <button
+ className="event-listener-expand"
+ onClick={[Function]}
+ >
+ <AccessibleImage
+ className="arrow"
+ />
+ </button>
+ <label
+ className="event-listener-label"
+ >
+ <input
+ checked={false}
+ onChange={[Function]}
+ type="checkbox"
+ value="Category 2"
+ />
+ <span
+ className="event-listener-category"
+ >
+ Category 2
+ </span>
+ </label>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div>
+`;
+
+exports[`EventListeners should render expanded categories appropriately 1`] = `
+<div
+ className="event-listeners"
+>
+ <div
+ className="event-search-container"
+ >
+ <form
+ className="event-search-form"
+ onSubmit={[Function]}
+ >
+ <input
+ className="event-search-input"
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Filter by event type"
+ value=""
+ />
+ </form>
+ </div>
+ <div
+ className="event-listeners-content"
+ >
+ <ul
+ className="event-listeners-list"
+ >
+ <li
+ className="event-listener-group"
+ key="0"
+ >
+ <div
+ className="event-listener-header"
+ >
+ <button
+ className="event-listener-expand"
+ onClick={[Function]}
+ >
+ <AccessibleImage
+ className="arrow"
+ />
+ </button>
+ <label
+ className="event-listener-label"
+ >
+ <input
+ checked={false}
+ onChange={[Function]}
+ type="checkbox"
+ value="Category 1"
+ />
+ <span
+ className="event-listener-category"
+ >
+ Category 1
+ </span>
+ </label>
+ </div>
+ </li>
+ <li
+ className="event-listener-group"
+ key="1"
+ >
+ <div
+ className="event-listener-header"
+ >
+ <button
+ className="event-listener-expand"
+ onClick={[Function]}
+ >
+ <AccessibleImage
+ className="arrow expanded"
+ />
+ </button>
+ <label
+ className="event-listener-label"
+ >
+ <input
+ checked={false}
+ onChange={[Function]}
+ type="checkbox"
+ value="Category 2"
+ />
+ <span
+ className="event-listener-category"
+ >
+ Category 2
+ </span>
+ </label>
+ </div>
+ <ul>
+ <li
+ className="event-listener-event"
+ key="category2.subcategory1"
+ >
+ <label
+ className="event-listener-label"
+ >
+ <input
+ checked={false}
+ onChange={[Function]}
+ type="checkbox"
+ value="category2.subcategory1"
+ />
+ <span
+ className="event-listener-name"
+ >
+ Subcategory 3
+ </span>
+ </label>
+ </li>
+ <li
+ className="event-listener-event"
+ key="category2.subcategory2"
+ >
+ <label
+ className="event-listener-label"
+ >
+ <input
+ checked={false}
+ onChange={[Function]}
+ type="checkbox"
+ value="category2.subcategory2"
+ />
+ <span
+ className="event-listener-name"
+ >
+ Subcategory 4
+ </span>
+ </label>
+ </li>
+ </ul>
+ </li>
+ </ul>
+ </div>
+</div>
+`;
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/tests/__snapshots__/Expressions.spec.js.snap b/devtools/client/debugger/src/components/SecondaryPanes/tests/__snapshots__/Expressions.spec.js.snap
new file mode 100644
index 0000000000..6ecf6c2c2e
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/tests/__snapshots__/Expressions.spec.js.snap
@@ -0,0 +1,203 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`Expressions should always have unique keys 1`] = `
+<div
+ className="pane"
+>
+ <ul
+ className="pane expressions-list"
+ >
+ <li
+ className="expression-container"
+ key="expression1"
+ title="expression1"
+ >
+ <div
+ className="expression-content"
+ >
+ <Component
+ autoExpandDepth={0}
+ createElement={[Function]}
+ disableWrap={true}
+ mayUseCustomFormatter={true}
+ onDOMNodeClick={[Function]}
+ onDOMNodeMouseOut={[Function]}
+ onDOMNodeMouseOver={[Function]}
+ onDoubleClick={[Function]}
+ onInspectIconClick={[Function]}
+ roots={
+ Array [
+ Object {
+ "contents": Object {
+ "front": null,
+ "value": Object {
+ "class": "",
+ "value": undefined,
+ },
+ },
+ "name": "expression1",
+ "path": "expression1",
+ },
+ ]
+ }
+ shouldRenderTooltip={true}
+ />
+ <div
+ className="expression-container__close-btn"
+ >
+ <CloseButton
+ handleClick={[Function]}
+ tooltip="Remove watch expression"
+ />
+ </div>
+ </div>
+ </li>
+ <li
+ className="expression-container"
+ key="expression2"
+ title="expression2"
+ >
+ <div
+ className="expression-content"
+ >
+ <Component
+ autoExpandDepth={0}
+ createElement={[Function]}
+ disableWrap={true}
+ mayUseCustomFormatter={true}
+ onDOMNodeClick={[Function]}
+ onDOMNodeMouseOut={[Function]}
+ onDOMNodeMouseOver={[Function]}
+ onDoubleClick={[Function]}
+ onInspectIconClick={[Function]}
+ roots={
+ Array [
+ Object {
+ "contents": Object {
+ "front": null,
+ "value": Object {
+ "class": "",
+ "value": undefined,
+ },
+ },
+ "name": "expression2",
+ "path": "expression2",
+ },
+ ]
+ }
+ shouldRenderTooltip={true}
+ />
+ <div
+ className="expression-container__close-btn"
+ >
+ <CloseButton
+ handleClick={[Function]}
+ tooltip="Remove watch expression"
+ />
+ </div>
+ </div>
+ </li>
+ </ul>
+</div>
+`;
+
+exports[`Expressions should render 1`] = `
+<div
+ className="pane"
+>
+ <ul
+ className="pane expressions-list"
+ >
+ <li
+ className="expression-container"
+ key="expression1"
+ title="expression1"
+ >
+ <div
+ className="expression-content"
+ >
+ <Component
+ autoExpandDepth={0}
+ createElement={[Function]}
+ disableWrap={true}
+ mayUseCustomFormatter={true}
+ onDOMNodeClick={[Function]}
+ onDOMNodeMouseOut={[Function]}
+ onDOMNodeMouseOver={[Function]}
+ onDoubleClick={[Function]}
+ onInspectIconClick={[Function]}
+ roots={
+ Array [
+ Object {
+ "contents": Object {
+ "front": null,
+ "value": Object {
+ "class": "",
+ "value": "foo",
+ },
+ },
+ "name": "expression1",
+ "path": "expression1",
+ },
+ ]
+ }
+ shouldRenderTooltip={true}
+ />
+ <div
+ className="expression-container__close-btn"
+ >
+ <CloseButton
+ handleClick={[Function]}
+ tooltip="Remove watch expression"
+ />
+ </div>
+ </div>
+ </li>
+ <li
+ className="expression-container"
+ key="expression2"
+ title="expression2"
+ >
+ <div
+ className="expression-content"
+ >
+ <Component
+ autoExpandDepth={0}
+ createElement={[Function]}
+ disableWrap={true}
+ mayUseCustomFormatter={true}
+ onDOMNodeClick={[Function]}
+ onDOMNodeMouseOut={[Function]}
+ onDOMNodeMouseOver={[Function]}
+ onDoubleClick={[Function]}
+ onInspectIconClick={[Function]}
+ roots={
+ Array [
+ Object {
+ "contents": Object {
+ "front": null,
+ "value": Object {
+ "class": "",
+ "value": "bar",
+ },
+ },
+ "name": "expression2",
+ "path": "expression2",
+ },
+ ]
+ }
+ shouldRenderTooltip={true}
+ />
+ <div
+ className="expression-container__close-btn"
+ >
+ <CloseButton
+ handleClick={[Function]}
+ tooltip="Remove watch expression"
+ />
+ </div>
+ </div>
+ </li>
+ </ul>
+</div>
+`;
diff --git a/devtools/client/debugger/src/components/SecondaryPanes/tests/__snapshots__/XHRBreakpoints.spec.js.snap b/devtools/client/debugger/src/components/SecondaryPanes/tests/__snapshots__/XHRBreakpoints.spec.js.snap
new file mode 100644
index 0000000000..e7c4527621
--- /dev/null
+++ b/devtools/client/debugger/src/components/SecondaryPanes/tests/__snapshots__/XHRBreakpoints.spec.js.snap
@@ -0,0 +1,619 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`XHR Breakpoints should render with 0 expressions passed from props 1`] = `
+<XHRBreakpoints
+ disableXHRBreakpoint={[Function]}
+ enableXHRBreakpoint={[Function]}
+ onXHRAdded={[Function]}
+ removeXHRBreakpoint={[Function]}
+ setXHRBreakpoint={[Function]}
+ shouldPauseOnAny={false}
+ showInput={false}
+ togglePauseOnAny={[Function]}
+ updateXHRBreakpoint={[Function]}
+ xhrBreakpoints={
+ Array [
+ Object {
+ "disabled": false,
+ "loading": false,
+ "method": "ANY",
+ "path": "",
+ "text": "URL contains \\"\\"",
+ },
+ ]
+ }
+>
+ <div
+ className="breakpoints-options empty"
+ >
+ <ExceptionOption
+ className="breakpoints-exceptions"
+ isChecked={false}
+ label="Pause on any URL"
+ onChange={[Function]}
+ >
+ <label
+ className="breakpoints-exceptions"
+ >
+ <input
+ checked={false}
+ onChange={[Function]}
+ type="checkbox"
+ />
+ <div
+ className="breakpoint-exceptions-label"
+ >
+ Pause on any URL
+ </div>
+ </label>
+ </ExceptionOption>
+ </div>
+ <form
+ className="xhr-input-container xhr-input-form"
+ key="xhr-input-container"
+ onSubmit={[Function]}
+ >
+ <input
+ className="xhr-input-url"
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Break when URL contains"
+ type="text"
+ value=""
+ />
+ <select
+ className="xhr-input-method"
+ onChange={[Function]}
+ onKeyDown={[Function]}
+ onMouseDown={[Function]}
+ value="ANY"
+ >
+ <option
+ key="ANY"
+ onMouseDown={[Function]}
+ value="ANY"
+ >
+ ANY
+ </option>
+ <option
+ key="GET"
+ onMouseDown={[Function]}
+ value="GET"
+ >
+ GET
+ </option>
+ <option
+ key="POST"
+ onMouseDown={[Function]}
+ value="POST"
+ >
+ POST
+ </option>
+ <option
+ key="PUT"
+ onMouseDown={[Function]}
+ value="PUT"
+ >
+ PUT
+ </option>
+ <option
+ key="HEAD"
+ onMouseDown={[Function]}
+ value="HEAD"
+ >
+ HEAD
+ </option>
+ <option
+ key="DELETE"
+ onMouseDown={[Function]}
+ value="DELETE"
+ >
+ DELETE
+ </option>
+ <option
+ key="PATCH"
+ onMouseDown={[Function]}
+ value="PATCH"
+ >
+ PATCH
+ </option>
+ <option
+ key="OPTIONS"
+ onMouseDown={[Function]}
+ value="OPTIONS"
+ >
+ OPTIONS
+ </option>
+ </select>
+ <input
+ style={
+ Object {
+ "display": "none",
+ }
+ }
+ type="submit"
+ />
+ </form>
+</XHRBreakpoints>
+`;
+
+exports[`XHR Breakpoints should render with 8 expressions passed from props 1`] = `
+<XHRBreakpoints
+ disableXHRBreakpoint={[Function]}
+ enableXHRBreakpoint={[Function]}
+ onXHRAdded={[Function]}
+ removeXHRBreakpoint={[Function]}
+ setXHRBreakpoint={[Function]}
+ shouldPauseOnAny={false}
+ showInput={false}
+ togglePauseOnAny={[Function]}
+ updateXHRBreakpoint={[Function]}
+ xhrBreakpoints={
+ Array [
+ Object {
+ "disabled": false,
+ "loading": false,
+ "method": "ANY",
+ "path": "",
+ "text": "URL contains \\"\\"",
+ },
+ Object {
+ "disabled": false,
+ "loading": false,
+ "method": "ANY",
+ "path": "this is any",
+ "text": "URL contains \\"this is any\\"",
+ },
+ Object {
+ "disabled": false,
+ "loading": false,
+ "method": "GET",
+ "path": "this is get",
+ "text": "URL contains \\"this is get\\"",
+ },
+ Object {
+ "disabled": false,
+ "loading": false,
+ "method": "POST",
+ "path": "this is post",
+ "text": "URL contains \\"this is post\\"",
+ },
+ Object {
+ "disabled": false,
+ "loading": false,
+ "method": "PUT",
+ "path": "this is put",
+ "text": "URL contains \\"this is put\\"",
+ },
+ Object {
+ "disabled": false,
+ "loading": false,
+ "method": "HEAD",
+ "path": "this is head",
+ "text": "URL contains \\"this is head\\"",
+ },
+ Object {
+ "disabled": false,
+ "loading": false,
+ "method": "DELETE",
+ "path": "this is delete",
+ "text": "URL contains \\"this is delete\\"",
+ },
+ Object {
+ "disabled": false,
+ "loading": false,
+ "method": "PATCH",
+ "path": "this is patch",
+ "text": "URL contains \\"this is patch\\"",
+ },
+ Object {
+ "disabled": false,
+ "loading": false,
+ "method": "OPTIONS",
+ "path": "this is options",
+ "text": "URL contains \\"this is options\\"",
+ },
+ ]
+ }
+>
+ <div
+ className="breakpoints-options"
+ >
+ <ExceptionOption
+ className="breakpoints-exceptions"
+ isChecked={false}
+ label="Pause on any URL"
+ onChange={[Function]}
+ >
+ <label
+ className="breakpoints-exceptions"
+ >
+ <input
+ checked={false}
+ onChange={[Function]}
+ type="checkbox"
+ />
+ <div
+ className="breakpoint-exceptions-label"
+ >
+ Pause on any URL
+ </div>
+ </label>
+ </ExceptionOption>
+ </div>
+ <ul
+ className="pane expressions-list"
+ >
+ <li
+ className="xhr-container"
+ key="this is any-ANY"
+ onDoubleClick={[Function]}
+ title="this is any"
+ >
+ <label>
+ <input
+ checked={true}
+ className="xhr-checkbox"
+ onChange={[Function]}
+ onClick={[Function]}
+ type="checkbox"
+ />
+ <div
+ className="xhr-label-method"
+ >
+ ANY
+ </div>
+ <div
+ className="xhr-label-url"
+ >
+ this is any
+ </div>
+ <div
+ className="xhr-container__close-btn"
+ >
+ <CloseButton
+ handleClick={[Function]}
+ >
+ <button
+ className="close-btn"
+ onClick={[Function]}
+ >
+ <AccessibleImage
+ className="close"
+ >
+ <span
+ className="img close"
+ />
+ </AccessibleImage>
+ </button>
+ </CloseButton>
+ </div>
+ </label>
+ </li>
+ <li
+ className="xhr-container"
+ key="this is get-GET"
+ onDoubleClick={[Function]}
+ title="this is get"
+ >
+ <label>
+ <input
+ checked={true}
+ className="xhr-checkbox"
+ onChange={[Function]}
+ onClick={[Function]}
+ type="checkbox"
+ />
+ <div
+ className="xhr-label-method"
+ >
+ GET
+ </div>
+ <div
+ className="xhr-label-url"
+ >
+ this is get
+ </div>
+ <div
+ className="xhr-container__close-btn"
+ >
+ <CloseButton
+ handleClick={[Function]}
+ >
+ <button
+ className="close-btn"
+ onClick={[Function]}
+ >
+ <AccessibleImage
+ className="close"
+ >
+ <span
+ className="img close"
+ />
+ </AccessibleImage>
+ </button>
+ </CloseButton>
+ </div>
+ </label>
+ </li>
+ <li
+ className="xhr-container"
+ key="this is post-POST"
+ onDoubleClick={[Function]}
+ title="this is post"
+ >
+ <label>
+ <input
+ checked={true}
+ className="xhr-checkbox"
+ onChange={[Function]}
+ onClick={[Function]}
+ type="checkbox"
+ />
+ <div
+ className="xhr-label-method"
+ >
+ POST
+ </div>
+ <div
+ className="xhr-label-url"
+ >
+ this is post
+ </div>
+ <div
+ className="xhr-container__close-btn"
+ >
+ <CloseButton
+ handleClick={[Function]}
+ >
+ <button
+ className="close-btn"
+ onClick={[Function]}
+ >
+ <AccessibleImage
+ className="close"
+ >
+ <span
+ className="img close"
+ />
+ </AccessibleImage>
+ </button>
+ </CloseButton>
+ </div>
+ </label>
+ </li>
+ <li
+ className="xhr-container"
+ key="this is put-PUT"
+ onDoubleClick={[Function]}
+ title="this is put"
+ >
+ <label>
+ <input
+ checked={true}
+ className="xhr-checkbox"
+ onChange={[Function]}
+ onClick={[Function]}
+ type="checkbox"
+ />
+ <div
+ className="xhr-label-method"
+ >
+ PUT
+ </div>
+ <div
+ className="xhr-label-url"
+ >
+ this is put
+ </div>
+ <div
+ className="xhr-container__close-btn"
+ >
+ <CloseButton
+ handleClick={[Function]}
+ >
+ <button
+ className="close-btn"
+ onClick={[Function]}
+ >
+ <AccessibleImage
+ className="close"
+ >
+ <span
+ className="img close"
+ />
+ </AccessibleImage>
+ </button>
+ </CloseButton>
+ </div>
+ </label>
+ </li>
+ <li
+ className="xhr-container"
+ key="this is head-HEAD"
+ onDoubleClick={[Function]}
+ title="this is head"
+ >
+ <label>
+ <input
+ checked={true}
+ className="xhr-checkbox"
+ onChange={[Function]}
+ onClick={[Function]}
+ type="checkbox"
+ />
+ <div
+ className="xhr-label-method"
+ >
+ HEAD
+ </div>
+ <div
+ className="xhr-label-url"
+ >
+ this is head
+ </div>
+ <div
+ className="xhr-container__close-btn"
+ >
+ <CloseButton
+ handleClick={[Function]}
+ >
+ <button
+ className="close-btn"
+ onClick={[Function]}
+ >
+ <AccessibleImage
+ className="close"
+ >
+ <span
+ className="img close"
+ />
+ </AccessibleImage>
+ </button>
+ </CloseButton>
+ </div>
+ </label>
+ </li>
+ <li
+ className="xhr-container"
+ key="this is delete-DELETE"
+ onDoubleClick={[Function]}
+ title="this is delete"
+ >
+ <label>
+ <input
+ checked={true}
+ className="xhr-checkbox"
+ onChange={[Function]}
+ onClick={[Function]}
+ type="checkbox"
+ />
+ <div
+ className="xhr-label-method"
+ >
+ DELETE
+ </div>
+ <div
+ className="xhr-label-url"
+ >
+ this is delete
+ </div>
+ <div
+ className="xhr-container__close-btn"
+ >
+ <CloseButton
+ handleClick={[Function]}
+ >
+ <button
+ className="close-btn"
+ onClick={[Function]}
+ >
+ <AccessibleImage
+ className="close"
+ >
+ <span
+ className="img close"
+ />
+ </AccessibleImage>
+ </button>
+ </CloseButton>
+ </div>
+ </label>
+ </li>
+ <li
+ className="xhr-container"
+ key="this is patch-PATCH"
+ onDoubleClick={[Function]}
+ title="this is patch"
+ >
+ <label>
+ <input
+ checked={true}
+ className="xhr-checkbox"
+ onChange={[Function]}
+ onClick={[Function]}
+ type="checkbox"
+ />
+ <div
+ className="xhr-label-method"
+ >
+ PATCH
+ </div>
+ <div
+ className="xhr-label-url"
+ >
+ this is patch
+ </div>
+ <div
+ className="xhr-container__close-btn"
+ >
+ <CloseButton
+ handleClick={[Function]}
+ >
+ <button
+ className="close-btn"
+ onClick={[Function]}
+ >
+ <AccessibleImage
+ className="close"
+ >
+ <span
+ className="img close"
+ />
+ </AccessibleImage>
+ </button>
+ </CloseButton>
+ </div>
+ </label>
+ </li>
+ <li
+ className="xhr-container"
+ key="this is options-OPTIONS"
+ onDoubleClick={[Function]}
+ title="this is options"
+ >
+ <label>
+ <input
+ checked={true}
+ className="xhr-checkbox"
+ onChange={[Function]}
+ onClick={[Function]}
+ type="checkbox"
+ />
+ <div
+ className="xhr-label-method"
+ >
+ OPTIONS
+ </div>
+ <div
+ className="xhr-label-url"
+ >
+ this is options
+ </div>
+ <div
+ className="xhr-container__close-btn"
+ >
+ <CloseButton
+ handleClick={[Function]}
+ >
+ <button
+ className="close-btn"
+ onClick={[Function]}
+ >
+ <AccessibleImage
+ className="close"
+ >
+ <span
+ className="img close"
+ />
+ </AccessibleImage>
+ </button>
+ </CloseButton>
+ </div>
+ </label>
+ </li>
+ </ul>
+</XHRBreakpoints>
+`;
diff --git a/devtools/client/debugger/src/components/ShortcutsModal.css b/devtools/client/debugger/src/components/ShortcutsModal.css
new file mode 100644
index 0000000000..84024f9677
--- /dev/null
+++ b/devtools/client/debugger/src/components/ShortcutsModal.css
@@ -0,0 +1,47 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+.shortcuts-content {
+ padding: 15px;
+ column-width: 250px;
+ cursor: default;
+ user-select: none;
+}
+
+.shortcuts-content h2 {
+ margin-top: 2px;
+ margin-bottom: 2px;
+ color: var(--theme-text-color-strong);
+}
+
+.shortcuts-section {
+ display: inline-block;
+ margin: 5px;
+ margin-bottom: 15px;
+ width: 250px;
+}
+
+.shortcuts-list {
+ list-style: none;
+ margin: 0px;
+ padding: 0px;
+ overflow: auto;
+ width: calc(100% - 1px); /* 1px fixes the hidden right border */
+}
+
+.shortcuts-list li {
+ font-size: 12px;
+ color: var(--theme-body-color);
+ padding-top: 5px;
+ display: flex;
+ justify-content: space-between;
+ border: 1px solid transparent;
+ white-space: pre;
+}
+
+@media (max-width: 640px) {
+ .shortcuts-section {
+ width: 100%;
+ }
+}
diff --git a/devtools/client/debugger/src/components/ShortcutsModal.js b/devtools/client/debugger/src/components/ShortcutsModal.js
new file mode 100644
index 0000000000..2e72c1b50f
--- /dev/null
+++ b/devtools/client/debugger/src/components/ShortcutsModal.js
@@ -0,0 +1,155 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React, { Component } from "devtools/client/shared/vendor/react";
+import {
+ div,
+ ul,
+ h2,
+ span,
+ li,
+} from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+import Modal from "./shared/Modal";
+import { formatKeyShortcut } from "../utils/text";
+const classnames = require("resource://devtools/client/shared/classnames.js");
+
+const isMacOS = Services.appinfo.OS === "Darwin";
+
+export class ShortcutsModal extends Component {
+ static get propTypes() {
+ return {
+ enabled: PropTypes.bool.isRequired,
+ handleClose: PropTypes.func.isRequired,
+ };
+ }
+
+ renderPrettyCombos(combo) {
+ return combo
+ .split(" ")
+ .map(c =>
+ span(
+ {
+ key: c,
+ className: "keystroke",
+ },
+ c
+ )
+ )
+ .reduce((prev, curr) => [prev, " + ", curr]);
+ }
+
+ renderShorcutItem(title, combo) {
+ return li(
+ null,
+ span(null, title),
+ span(null, this.renderPrettyCombos(combo))
+ );
+ }
+
+ renderEditorShortcuts() {
+ return ul(
+ {
+ className: "shortcuts-list",
+ },
+ this.renderShorcutItem(
+ L10N.getStr("shortcuts.toggleBreakpoint"),
+ formatKeyShortcut(L10N.getStr("toggleBreakpoint.key"))
+ ),
+ this.renderShorcutItem(
+ L10N.getStr("shortcuts.toggleCondPanel.breakpoint"),
+ formatKeyShortcut(L10N.getStr("toggleCondPanel.breakpoint.key"))
+ ),
+ this.renderShorcutItem(
+ L10N.getStr("shortcuts.toggleCondPanel.logPoint"),
+ formatKeyShortcut(L10N.getStr("toggleCondPanel.logPoint.key"))
+ )
+ );
+ }
+
+ renderSteppingShortcuts() {
+ return ul(
+ {
+ className: "shortcuts-list",
+ },
+ this.renderShorcutItem(L10N.getStr("shortcuts.pauseOrResume"), "F8"),
+ this.renderShorcutItem(L10N.getStr("shortcuts.stepOver"), "F10"),
+ this.renderShorcutItem(L10N.getStr("shortcuts.stepIn"), "F11"),
+ this.renderShorcutItem(
+ L10N.getStr("shortcuts.stepOut"),
+ formatKeyShortcut(L10N.getStr("stepOut.key"))
+ )
+ );
+ }
+
+ renderSearchShortcuts() {
+ return ul(
+ {
+ className: "shortcuts-list",
+ },
+ this.renderShorcutItem(
+ L10N.getStr("shortcuts.fileSearch2"),
+ formatKeyShortcut(L10N.getStr("sources.search.key2"))
+ ),
+ this.renderShorcutItem(
+ L10N.getStr("shortcuts.projectSearch2"),
+ formatKeyShortcut(L10N.getStr("projectTextSearch.key"))
+ ),
+ this.renderShorcutItem(
+ L10N.getStr("shortcuts.functionSearch2"),
+ formatKeyShortcut(L10N.getStr("functionSearch.key"))
+ ),
+ this.renderShorcutItem(
+ L10N.getStr("shortcuts.gotoLine"),
+ formatKeyShortcut(L10N.getStr("gotoLineModal.key3"))
+ )
+ );
+ }
+
+ renderShortcutsContent() {
+ return div(
+ {
+ className: classnames("shortcuts-content", isMacOS ? "mac" : ""),
+ },
+ div(
+ {
+ className: "shortcuts-section",
+ },
+ h2(null, L10N.getStr("shortcuts.header.editor")),
+ this.renderEditorShortcuts()
+ ),
+ div(
+ {
+ className: "shortcuts-section",
+ },
+ h2(null, L10N.getStr("shortcuts.header.stepping")),
+ this.renderSteppingShortcuts()
+ ),
+ div(
+ {
+ className: "shortcuts-section",
+ },
+ h2(null, L10N.getStr("shortcuts.header.search")),
+ this.renderSearchShortcuts()
+ )
+ );
+ }
+
+ render() {
+ const { enabled } = this.props;
+
+ if (!enabled) {
+ return null;
+ }
+
+ return React.createElement(
+ Modal,
+ {
+ additionalClass: "shortcuts-modal",
+ handleClose: this.props.handleClose,
+ },
+ this.renderShortcutsContent()
+ );
+ }
+}
diff --git a/devtools/client/debugger/src/components/WelcomeBox.css b/devtools/client/debugger/src/components/WelcomeBox.css
new file mode 100644
index 0000000000..a0932625ae
--- /dev/null
+++ b/devtools/client/debugger/src/components/WelcomeBox.css
@@ -0,0 +1,83 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+.welcomebox {
+ position: absolute;
+ top: var(--editor-header-height);
+ left: 0;
+ bottom: var(--editor-footer-height);
+ width: calc(100% - 1px);
+ padding: 10vh 0;
+ background-color: var(--theme-toolbar-background);
+ overflow: hidden;
+ font-weight: 300;
+ z-index: 10;
+ user-select: none;
+}
+
+.theme-dark .welcomebox {
+ background-color: var(--theme-body-background);
+}
+
+.alignlabel {
+ display: flex;
+ white-space: nowrap;
+ font-size: 1.25em;
+}
+
+.shortcutKey,
+.shortcutLabel {
+ flex: 1;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ cursor: pointer;
+}
+
+.welcomebox__searchSources:hover,
+.welcomebox__searchProject:hover,
+.welcomebox__allShortcuts:hover {
+ color: var(--theme-body-color);
+}
+
+.shortcutKey {
+ direction: ltr;
+ text-align: right;
+ padding-right: 10px;
+ font-family: var(--monospace-font-family);
+ font-size: 14px;
+ line-height: 18px;
+ color: var(--theme-body-color);
+}
+
+.shortcutKey:dir(rtl) {
+ text-align: left;
+}
+
+:root[platform="mac"] .welcomebox .shortcutKey {
+ font-family: system-ui, -apple-system, sans-serif;
+ font-weight: 500;
+}
+
+.shortcutLabel {
+ text-align: start;
+ padding-left: 10px;
+ font-size: 14px;
+ line-height: 18px;
+}
+
+.shortcutFunction {
+ margin: 0 auto;
+ color: var(--theme-comment);
+ display: table;
+}
+
+.shortcutFunction p {
+ display: table-row;
+}
+
+.shortcutFunction .shortcutKey,
+.shortcutFunction .shortcutLabel {
+ padding: 10px 5px;
+ display: table-cell;
+}
diff --git a/devtools/client/debugger/src/components/WelcomeBox.js b/devtools/client/debugger/src/components/WelcomeBox.js
new file mode 100644
index 0000000000..cdb1d6c23e
--- /dev/null
+++ b/devtools/client/debugger/src/components/WelcomeBox.js
@@ -0,0 +1,137 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { Component } from "devtools/client/shared/vendor/react";
+import {
+ div,
+ p,
+ span,
+} from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+
+import { connect } from "devtools/client/shared/vendor/react-redux";
+import { primaryPaneTabs } from "../constants";
+
+import actions from "../actions/index";
+import { getPaneCollapse } from "../selectors/index";
+import { formatKeyShortcut } from "../utils/text";
+
+export class WelcomeBox extends Component {
+ static get propTypes() {
+ return {
+ openQuickOpen: PropTypes.func.isRequired,
+ setActiveSearch: PropTypes.func.isRequired,
+ toggleShortcutsModal: PropTypes.func.isRequired,
+ setPrimaryPaneTab: PropTypes.func.isRequired,
+ };
+ }
+
+ render() {
+ const searchSourcesShortcut = formatKeyShortcut(
+ L10N.getStr("sources.search.key2")
+ );
+
+ const searchProjectShortcut = formatKeyShortcut(
+ L10N.getStr("projectTextSearch.key")
+ );
+
+ const allShortcutsShortcut = formatKeyShortcut(
+ L10N.getStr("allShortcut.key")
+ );
+
+ const allShortcutsLabel = L10N.getStr("welcome.allShortcuts");
+ const searchSourcesLabel = L10N.getStr("welcome.search2").substring(2);
+ const searchProjectLabel = L10N.getStr("welcome.findInFiles2").substring(2);
+
+ return div(
+ {
+ className: "welcomebox",
+ },
+ div(
+ {
+ className: "alignlabel",
+ },
+ div(
+ {
+ className: "shortcutFunction",
+ },
+ p(
+ {
+ className: "welcomebox__searchSources",
+ role: "button",
+ tabIndex: "0",
+ onClick: () => this.props.openQuickOpen(),
+ },
+ span(
+ {
+ className: "shortcutKey",
+ },
+ searchSourcesShortcut
+ ),
+ span(
+ {
+ className: "shortcutLabel",
+ },
+ searchSourcesLabel
+ )
+ ),
+ p(
+ {
+ className: "welcomebox__searchProject",
+ role: "button",
+ tabIndex: "0",
+ onClick: () => {
+ this.props.setActiveSearch(primaryPaneTabs.PROJECT_SEARCH);
+ this.props.setPrimaryPaneTab(primaryPaneTabs.PROJECT_SEARCH);
+ },
+ },
+ span(
+ {
+ className: "shortcutKey",
+ },
+ searchProjectShortcut
+ ),
+ span(
+ {
+ className: "shortcutLabel",
+ },
+ searchProjectLabel
+ )
+ ),
+ p(
+ {
+ className: "welcomebox__allShortcuts",
+ role: "button",
+ tabIndex: "0",
+ onClick: () => this.props.toggleShortcutsModal(),
+ },
+ span(
+ {
+ className: "shortcutKey",
+ },
+ allShortcutsShortcut
+ ),
+ span(
+ {
+ className: "shortcutLabel",
+ },
+ allShortcutsLabel
+ )
+ )
+ )
+ )
+ );
+ }
+}
+
+const mapStateToProps = state => ({
+ endPanelCollapsed: getPaneCollapse(state, "end"),
+});
+
+export default connect(mapStateToProps, {
+ togglePaneCollapse: actions.togglePaneCollapse,
+ setActiveSearch: actions.setActiveSearch,
+ openQuickOpen: actions.openQuickOpen,
+ setPrimaryPaneTab: actions.setPrimaryPaneTab,
+})(WelcomeBox);
diff --git a/devtools/client/debugger/src/components/moz.build b/devtools/client/debugger/src/components/moz.build
new file mode 100644
index 0000000000..6cd81e653b
--- /dev/null
+++ b/devtools/client/debugger/src/components/moz.build
@@ -0,0 +1,18 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DIRS += [
+ "Editor",
+ "PrimaryPanes",
+ "SecondaryPanes",
+ "shared",
+]
+
+CompiledModules(
+ "App.js",
+ "QuickOpenModal.js",
+ "ShortcutsModal.js",
+ "WelcomeBox.js",
+)
diff --git a/devtools/client/debugger/src/components/shared/AccessibleImage.css b/devtools/client/debugger/src/components/shared/AccessibleImage.css
new file mode 100644
index 0000000000..4ba5f1326a
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/AccessibleImage.css
@@ -0,0 +1,201 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+.img {
+ display: inline-block;
+ width: 16px;
+ height: 16px;
+ vertical-align: middle;
+ /* use background-color for the icon color, and mask-image for its shape */
+ background-color: var(--theme-icon-color);
+ mask-size: contain;
+ mask-repeat: no-repeat;
+ mask-position: center;
+ /* multicolor icons use background-image */
+ background-position: center;
+ background-repeat: no-repeat;
+ background-size: contain;
+ /* do not let images shrink when used as flex children */
+ flex-shrink: 0;
+}
+
+/* Expand arrow icon */
+.img.arrow {
+ width: 10px;
+ height: 10px;
+ mask-image: url(chrome://devtools/content/debugger/images/arrow.svg);
+ /* we may override the width/height in specific contexts to make the
+ clickable area bigger, but we should always keep the mask size 10x10 */
+ mask-size: 10px 10px;
+ background-color: var(--theme-icon-dimmed-color);
+ transform: rotate(-90deg);
+ transition: transform 180ms var(--animation-curve);
+}
+
+.img.arrow:dir(rtl) {
+ transform: rotate(90deg);
+}
+
+.img.arrow.expanded {
+ /* icon should always point to the bottom (default) when expanded,
+ regardless of the text direction */
+ transform: none !important;
+}
+
+.img.arrow-down {
+ mask-image: url(chrome://devtools/content/debugger/images/arrow-down.svg);
+}
+
+.img.arrow-up {
+ mask-image: url(chrome://devtools/content/debugger/images/arrow-up.svg);
+}
+
+.img.blackBox {
+ mask-image: url(chrome://devtools/content/debugger/images/blackBox.svg);
+}
+
+.img.breadcrumb {
+ mask-image: url(chrome://devtools/content/debugger/images/breadcrumbs-divider.svg);
+}
+
+.img.close {
+ mask-image: url(chrome://devtools/skin/images/close.svg);
+}
+
+.img.disable-pausing {
+ mask-image: url(chrome://devtools/content/debugger/images/disable-pausing.svg);
+}
+
+.img.enable-pausing {
+ mask-image: url(chrome://devtools/content/debugger/images/enable-pausing.svg);
+ background-color: var(--theme-icon-checked-color);
+}
+
+.img.globe {
+ mask-image: url(chrome://devtools/content/debugger/images/globe.svg);
+}
+
+.img.globe-small {
+ mask-image: url(chrome://devtools/content/debugger/images/globe-small.svg);
+ mask-size: 12px 12px;
+}
+
+.img.window {
+ mask-image: url(chrome://devtools/content/debugger/images/window.svg);
+}
+
+.img.file {
+ mask-image: url(chrome://devtools/content/debugger/images/file-small.svg);
+ mask-size: 12px 12px;
+}
+
+.img.folder {
+ mask-image: url(chrome://devtools/content/debugger/images/folder.svg);
+}
+
+.img.home {
+ mask-image: url(chrome://devtools/content/debugger/images/home.svg);
+}
+
+.img.info {
+ mask-image: url(chrome://devtools/skin/images/info.svg);
+}
+
+.img.loader {
+ background-image: url(chrome://devtools/content/debugger/images/loader.svg);
+ -moz-context-properties: fill;
+ fill: var(--theme-icon-color);
+ background-color: unset;
+}
+
+.img.more-tabs {
+ mask-image: url(chrome://devtools/content/debugger/images/command-chevron.svg);
+}
+
+html[dir="rtl"] .img.more-tabs {
+ transform: scaleX(-1);
+}
+
+.img.sourcemap {
+ background-image: url(chrome://devtools/content/debugger/images/sourcemap.svg);
+ -moz-context-properties: fill;
+ fill: var(--theme-icon-warning-color);
+ background-color: unset;
+}
+
+.img.next {
+ mask-image: url(chrome://devtools/content/debugger/images/next.svg);
+}
+
+.img.next-circle {
+ mask-image: url(chrome://devtools/content/debugger/images/next-circle.svg);
+}
+
+.img.pane-collapse {
+ mask-image: url(chrome://devtools/content/debugger/images/pane-collapse.svg);
+}
+
+.img.pane-expand {
+ mask-image: url(chrome://devtools/content/debugger/images/pane-expand.svg);
+}
+
+.img.pause {
+ mask-image: url(chrome://devtools/content/debugger/images/pause.svg);
+}
+
+.img.plus {
+ mask-image: url(chrome://devtools/skin/images/add.svg);
+}
+
+.img.prettyPrint {
+ background-image: url(chrome://devtools/content/debugger/images/prettyPrint.svg);
+ background-size: 14px 14px;
+ background-color: transparent !important;
+ fill: var(--theme-icon-color);
+ -moz-context-properties: fill;
+}
+
+.img.removeAll {
+ mask-image: url(chrome://devtools/skin/images/clear.svg)
+}
+
+.img.refresh {
+ mask-image: url(chrome://devtools/skin/images/reload.svg);
+}
+
+.img.resume {
+ mask-image: url(resource://devtools-shared-images/resume.svg);
+}
+
+.img.search {
+ mask-image: url(chrome://devtools/content/debugger/images/search.svg);
+}
+
+.img.shortcuts {
+ mask-image: url(chrome://devtools/content/debugger/images/help.svg);
+}
+
+.img.spin {
+ animation: spin 0.5s linear infinite;
+}
+
+.img.stepIn {
+ mask-image: url(chrome://devtools/content/debugger/images/stepIn.svg);
+}
+
+.img.stepOut {
+ mask-image: url(chrome://devtools/content/debugger/images/stepOut.svg);
+}
+
+.img.stepOver {
+ mask-image: url(resource://devtools-shared-images/stepOver.svg);
+}
+
+.img.tab {
+ mask-image: url(chrome://devtools/content/debugger/images/tab.svg);
+}
+
+.img.worker {
+ mask-image: url(chrome://devtools/content/debugger/images/worker.svg);
+}
diff --git a/devtools/client/debugger/src/components/shared/AccessibleImage.js b/devtools/client/debugger/src/components/shared/AccessibleImage.js
new file mode 100644
index 0000000000..e3a59573ea
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/AccessibleImage.js
@@ -0,0 +1,21 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React from "devtools/client/shared/vendor/react";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+
+const classnames = require("resource://devtools/client/shared/classnames.js");
+
+const AccessibleImage = props => {
+ return React.createElement("span", {
+ ...props,
+ className: classnames("img", props.className),
+ });
+};
+
+AccessibleImage.propTypes = {
+ className: PropTypes.string.isRequired,
+};
+
+export default AccessibleImage;
diff --git a/devtools/client/debugger/src/components/shared/Accordion.css b/devtools/client/debugger/src/components/shared/Accordion.css
new file mode 100644
index 0000000000..d970527014
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/Accordion.css
@@ -0,0 +1,107 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+.accordion {
+ background-color: var(--theme-sidebar-background);
+ width: 100%;
+ list-style-type: none;
+ padding: 0px;
+ margin-top: 0px;
+}
+
+.accordion ._header {
+ background-color: var(--theme-accordion-header-background);
+ border-bottom: 1px solid var(--theme-splitter-color);
+ display: flex;
+ column-gap: 8px;
+ font-size: 12px;
+ line-height: calc(16 / 12);
+ padding: 4px 6px;
+ width: 100%;
+ align-items: center;
+ margin: 0px;
+ font-weight: normal;
+ cursor: default;
+ user-select: none;
+}
+
+.accordion ._header:hover {
+ background-color: var(--theme-accordion-header-hover);
+}
+
+
+.accordion ._header .header-label {
+ flex-grow: 1;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ color: var(--theme-toolbar-color);
+ background: transparent;
+ padding: 0;
+
+ /* align expand arrow and button text */
+ display: flex;
+ align-items: center;
+ gap: 4px;
+
+ &:hover {
+ background: transparent;
+ }
+
+ /* The expand arrow needs to be displayed inside the button to be accessible */
+ &::before {
+ content: "";
+ display: inline-block;
+ width: 10px;
+ height: 10px;
+ background-image: url(chrome://devtools/content/debugger/images/arrow.svg);
+ background-size: contain;
+ -moz-context-properties: fill;
+ fill: var(--theme-icon-dimmed-color);
+ rotate: -90deg;
+ transition: rotate 180ms var(--animation-curve);
+
+ &:dir(rtl) {
+ rotate: 90deg;
+ }
+ }
+
+ &[aria-expanded="true"]::before {
+ /* icon should always point to the bottom (default) when expanded,
+ regardless of the text direction */
+ rotate: 0deg !important;
+ }
+}
+
+.accordion ._header .header-buttons {
+ display: flex;
+ margin-inline-start: auto;
+}
+
+.accordion ._header .header-buttons button {
+ color: var(--theme-body-color);
+ border: none;
+ background: none;
+ padding: 0;
+ margin: 0 2px;
+ width: 16px;
+ height: 16px;
+}
+
+.accordion ._header .header-buttons button::-moz-focus-inner {
+ border: none;
+}
+
+.accordion ._header .header-buttons button .img {
+ display: block;
+}
+
+.accordion ._content {
+ border-bottom: 1px solid var(--theme-splitter-color);
+ font-size: var(--theme-body-font-size);
+}
+
+.accordion div:last-child ._content {
+ border-bottom: none;
+}
diff --git a/devtools/client/debugger/src/components/shared/Accordion.js b/devtools/client/debugger/src/components/shared/Accordion.js
new file mode 100644
index 0000000000..3b5d5ae516
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/Accordion.js
@@ -0,0 +1,89 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { cloneElement, Component } from "devtools/client/shared/vendor/react";
+import {
+ aside,
+ button,
+ div,
+ h2,
+} from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+
+class Accordion extends Component {
+ static get propTypes() {
+ return {
+ items: PropTypes.array.isRequired,
+ };
+ }
+
+ handleHeaderClick(i) {
+ const item = this.props.items[i];
+ const opened = !item.opened;
+ item.opened = opened;
+
+ if (item.onToggle) {
+ item.onToggle(opened);
+ }
+
+ // We force an update because otherwise the accordion
+ // would not re-render
+ this.forceUpdate();
+ }
+
+ renderContainer = (item, i) => {
+ const { opened } = item;
+ const contentElementId = `${item.id}-content`;
+
+ return aside(
+ {
+ className: item.className,
+ key: item.id,
+ "aria-labelledby": item.id,
+ role: item.role,
+ },
+ h2(
+ {
+ className: "_header",
+ },
+ button(
+ {
+ id: item.id,
+ className: "header-label",
+ "aria-expanded": `${opened ? "true" : "false"}`,
+ "aria-controls": opened ? contentElementId : undefined,
+ onClick: () => this.handleHeaderClick(i),
+ },
+ item.header
+ ),
+ item.buttons
+ ? div(
+ {
+ className: "header-buttons",
+ },
+ item.buttons
+ )
+ : null
+ ),
+ opened &&
+ div(
+ {
+ className: "_content",
+ id: contentElementId,
+ },
+ cloneElement(item.component, item.componentProps || {})
+ )
+ );
+ };
+ render() {
+ return div(
+ {
+ className: "accordion",
+ },
+ this.props.items.map(this.renderContainer)
+ );
+ }
+}
+
+export default Accordion;
diff --git a/devtools/client/debugger/src/components/shared/Badge.css b/devtools/client/debugger/src/components/shared/Badge.css
new file mode 100644
index 0000000000..f52d32edf4
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/Badge.css
@@ -0,0 +1,16 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+.badge {
+ --size: 17px;
+ --radius: calc(var(--size) / 2);
+ height: var(--size);
+ min-width: var(--size);
+ line-height: var(--size);
+ background: var(--theme-toolbar-background-hover);
+ color: var(--theme-body-color);
+ border-radius: var(--radius);
+ padding: 0 4px;
+ font-size: 0.9em;
+}
diff --git a/devtools/client/debugger/src/components/shared/Badge.js b/devtools/client/debugger/src/components/shared/Badge.js
new file mode 100644
index 0000000000..72571c0f58
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/Badge.js
@@ -0,0 +1,30 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React from "devtools/client/shared/vendor/react";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+
+class Badge extends React.Component {
+ constructor(props) {
+ super(props);
+ }
+
+ static get propTypes() {
+ return {
+ badgeText: PropTypes.node.isRequired,
+ };
+ }
+
+ render() {
+ return React.createElement(
+ "span",
+ {
+ className: "badge text-white text-center",
+ },
+ this.props.badgeText
+ );
+ }
+}
+
+export default Badge;
diff --git a/devtools/client/debugger/src/components/shared/BracketArrow.css b/devtools/client/debugger/src/components/shared/BracketArrow.css
new file mode 100644
index 0000000000..afca888371
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/BracketArrow.css
@@ -0,0 +1,64 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+.bracket-arrow {
+ position: absolute;
+ pointer-events: none;
+}
+
+.bracket-arrow::before,
+.bracket-arrow::after {
+ content: "";
+ height: 0;
+ width: 0;
+ position: absolute;
+ border: 7px solid transparent;
+}
+
+.bracket-arrow.up::before {
+ border-bottom-color: var(--theme-splitter-color);
+ top: -1px;
+}
+
+.theme-dark .bracket-arrow.up::before {
+ border-bottom-color: var(--theme-body-color);
+}
+
+.bracket-arrow.up::after {
+ border-bottom-color: var(--theme-body-background);
+ top: 0px;
+}
+
+.bracket-arrow.down::before {
+ border-bottom-color: transparent;
+ border-top-color: var(--theme-splitter-color);
+ top: 0px;
+}
+
+.theme-dark .bracket-arrow.down::before {
+ border-top-color: var(--theme-body-color);
+}
+
+.bracket-arrow.down::after {
+ border-bottom-color: transparent;
+ border-top-color: var(--theme-body-background);
+ top: -1px;
+}
+
+.bracket-arrow.left::before {
+ border-left-color: transparent;
+ border-right-color: var(--theme-splitter-color);
+ top: 0px;
+}
+
+.theme-dark .bracket-arrow.left::before {
+ border-right-color: var(--theme-body-color);
+}
+
+.bracket-arrow.left::after {
+ border-left-color: transparent;
+ border-right-color: var(--theme-body-background);
+ top: 0px;
+ left: 1px;
+}
diff --git a/devtools/client/debugger/src/components/shared/BracketArrow.js b/devtools/client/debugger/src/components/shared/BracketArrow.js
new file mode 100644
index 0000000000..40e2cda6c4
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/BracketArrow.js
@@ -0,0 +1,28 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { div } from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+
+const classnames = require("resource://devtools/client/shared/classnames.js");
+
+const BracketArrow = ({ orientation, left, top, bottom }) => {
+ return div({
+ className: classnames("bracket-arrow", orientation || "up"),
+ style: {
+ left,
+ top,
+ bottom,
+ },
+ });
+};
+
+BracketArrow.propTypes = {
+ bottom: PropTypes.number,
+ left: PropTypes.number,
+ orientation: PropTypes.string.isRequired,
+ top: PropTypes.number,
+};
+
+export default BracketArrow;
diff --git a/devtools/client/debugger/src/components/shared/Button/CloseButton.js b/devtools/client/debugger/src/components/shared/Button/CloseButton.js
new file mode 100644
index 0000000000..a8f66de60d
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/Button/CloseButton.js
@@ -0,0 +1,30 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React from "devtools/client/shared/vendor/react";
+import { button } from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+
+import AccessibleImage from "../AccessibleImage";
+
+function CloseButton({ handleClick, buttonClass, tooltip }) {
+ return button(
+ {
+ className: buttonClass ? `close-btn ${buttonClass}` : "close-btn",
+ onClick: handleClick,
+ title: tooltip,
+ },
+ React.createElement(AccessibleImage, {
+ className: "close",
+ })
+ );
+}
+
+CloseButton.propTypes = {
+ buttonClass: PropTypes.string,
+ handleClick: PropTypes.func.isRequired,
+ tooltip: PropTypes.string,
+};
+
+export default CloseButton;
diff --git a/devtools/client/debugger/src/components/shared/Button/CommandBarButton.js b/devtools/client/debugger/src/components/shared/Button/CommandBarButton.js
new file mode 100644
index 0000000000..4b0b52e186
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/Button/CommandBarButton.js
@@ -0,0 +1,55 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React from "devtools/client/shared/vendor/react";
+import { button } from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+
+import AccessibleImage from "../AccessibleImage";
+
+const classnames = require("resource://devtools/client/shared/classnames.js");
+
+export function debugBtn(
+ onClick,
+ type,
+ className,
+ tooltip,
+ disabled = false,
+ ariaPressed = false
+) {
+ return React.createElement(
+ CommandBarButton,
+ {
+ className: classnames(type, className),
+ disabled: disabled,
+ key: type,
+ onClick: onClick,
+ pressed: ariaPressed,
+ title: tooltip,
+ },
+ React.createElement(AccessibleImage, {
+ className: type,
+ })
+ );
+}
+const CommandBarButton = props => {
+ const { children, className, pressed = false, ...rest } = props;
+
+ return button(
+ {
+ "aria-pressed": pressed,
+ className: classnames("command-bar-button", className),
+ ...rest,
+ },
+ children
+ );
+};
+
+CommandBarButton.propTypes = {
+ children: PropTypes.node.isRequired,
+ className: PropTypes.string.isRequired,
+ pressed: PropTypes.bool,
+};
+
+export default CommandBarButton;
diff --git a/devtools/client/debugger/src/components/shared/Button/PaneToggleButton.js b/devtools/client/debugger/src/components/shared/Button/PaneToggleButton.js
new file mode 100644
index 0000000000..ad003552ad
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/Button/PaneToggleButton.js
@@ -0,0 +1,58 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React, { PureComponent } from "devtools/client/shared/vendor/react";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+import AccessibleImage from "../AccessibleImage";
+import { CommandBarButton } from "./index";
+
+const classnames = require("resource://devtools/client/shared/classnames.js");
+
+class PaneToggleButton extends PureComponent {
+ static defaultProps = {
+ horizontal: false,
+ position: "start",
+ };
+
+ static get propTypes() {
+ return {
+ collapsed: PropTypes.bool.isRequired,
+ handleClick: PropTypes.func.isRequired,
+ horizontal: PropTypes.bool.isRequired,
+ position: PropTypes.oneOf(["start", "end"]).isRequired,
+ };
+ }
+
+ label(position, collapsed) {
+ switch (position) {
+ case "start":
+ return L10N.getStr(collapsed ? "expandSources" : "collapseSources");
+ case "end":
+ return L10N.getStr(
+ collapsed ? "expandBreakpoints" : "collapseBreakpoints"
+ );
+ }
+ return null;
+ }
+
+ render() {
+ const { position, collapsed, horizontal, handleClick } = this.props;
+ return React.createElement(
+ CommandBarButton,
+ {
+ className: classnames("toggle-button", position, {
+ collapsed,
+ vertical: !horizontal,
+ }),
+ onClick: () => handleClick(position, !collapsed),
+ title: this.label(position, collapsed),
+ },
+ React.createElement(AccessibleImage, {
+ className: collapsed ? "pane-expand" : "pane-collapse",
+ })
+ );
+ }
+}
+
+export default PaneToggleButton;
diff --git a/devtools/client/debugger/src/components/shared/Button/index.js b/devtools/client/debugger/src/components/shared/Button/index.js
new file mode 100644
index 0000000000..df7976ba90
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/Button/index.js
@@ -0,0 +1,9 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import CloseButton from "./CloseButton";
+import CommandBarButton, { debugBtn } from "./CommandBarButton";
+import PaneToggleButton from "./PaneToggleButton";
+
+export { CloseButton, CommandBarButton, debugBtn, PaneToggleButton };
diff --git a/devtools/client/debugger/src/components/shared/Button/moz.build b/devtools/client/debugger/src/components/shared/Button/moz.build
new file mode 100644
index 0000000000..c6e652d5dc
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/Button/moz.build
@@ -0,0 +1,15 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DIRS += [
+ "styles",
+]
+
+CompiledModules(
+ "CloseButton.js",
+ "CommandBarButton.js",
+ "index.js",
+ "PaneToggleButton.js",
+)
diff --git a/devtools/client/debugger/src/components/shared/Button/styles/CloseButton.css b/devtools/client/debugger/src/components/shared/Button/styles/CloseButton.css
new file mode 100644
index 0000000000..c2d8df6d38
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/Button/styles/CloseButton.css
@@ -0,0 +1,35 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+.close-btn {
+ width: 16px;
+ height: 16px;
+ border: 1px solid transparent;
+ border-radius: 2px;
+ padding: 1px;
+ color: var(--theme-icon-color);
+}
+
+.close-btn:hover {
+ color: var(--theme-selection-color);
+ background-color: var(--theme-selection-background);
+}
+
+.close-btn .img {
+ display: block;
+ width: 12px;
+ height: 12px;
+ /* inherit the button's text color for the icon's color */
+ background-color: currentColor;
+}
+
+.close-btn.big {
+ width: 20px;
+ height: 20px;
+}
+
+.close-btn.big .img {
+ width: 16px;
+ height: 16px;
+}
diff --git a/devtools/client/debugger/src/components/shared/Button/styles/CommandBarButton.css b/devtools/client/debugger/src/components/shared/Button/styles/CommandBarButton.css
new file mode 100644
index 0000000000..12e53e6fc5
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/Button/styles/CommandBarButton.css
@@ -0,0 +1,73 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+.command-bar-button {
+ appearance: none;
+ background: transparent;
+ border: none;
+ display: inline-block;
+ text-align: center;
+ position: relative;
+ padding: 0px 5px;
+ fill: currentColor;
+ min-width: 30px;
+ /* Adjust outline so it's not clipped */
+ outline-offset: -3px;
+}
+
+.command-bar-button:disabled {
+ opacity: 0.6;
+ cursor: default;
+}
+
+.command-bar-button:not(.disabled):hover,
+.devtools-button.debugger-settings-menu-button:empty:enabled:not([aria-expanded="true"]):hover {
+ background: var(--theme-toolbar-background-hover);
+}
+
+.theme-dark .command-bar-button:not(.disabled):hover,
+.devtools-button.debugger-settings-menu-button:empty:enabled:not([aria-expanded="true"]):hover {
+ background: var(--theme-toolbar-hover);
+}
+
+:root.theme-dark .command-bar-button {
+ color: var(--theme-body-color);
+}
+
+.command-bar-button > * {
+ width: 16px;
+ height: 16px;
+ display: inline-block;
+ vertical-align: middle;
+}
+
+/**
+ * Settings icon and menu
+ */
+.devtools-button.debugger-settings-menu-button {
+ border-radius: 0;
+ margin: 0;
+ padding: 0;
+}
+
+.devtools-button.debugger-settings-menu-button::before {
+ background-image: url("chrome://devtools/skin/images/settings.svg");
+}
+
+.devtools-button.debugger-trace-menu-button::before {
+ background-image: url(chrome://devtools/content/debugger/images/trace.svg);
+}
+.devtools-button.debugger-trace-menu-button:is(.active, .pending)::before {
+ fill: var(--theme-icon-checked-color);
+}
+.devtools-button.debugger-trace-menu-button.pending::after
+{
+ content: url("chrome://global/skin/icons/badge-blue.svg");
+ width: 14px;
+ height: 14px;
+ display: block;
+ position: absolute;
+ bottom: -2px;
+ right: 0;
+}
diff --git a/devtools/client/debugger/src/components/shared/Button/styles/PaneToggleButton.css b/devtools/client/debugger/src/components/shared/Button/styles/PaneToggleButton.css
new file mode 100644
index 0000000000..d8a2495408
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/Button/styles/PaneToggleButton.css
@@ -0,0 +1,29 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+.toggle-button {
+ padding: 4px 6px;
+}
+
+.toggle-button .img {
+ vertical-align: middle;
+}
+
+.toggle-button.end {
+ margin-inline-end: 0px;
+ margin-inline-start: auto;
+}
+
+.toggle-button.start {
+ margin-inline-start: 0px;
+}
+
+html[dir="rtl"] .toggle-button.start .img,
+html[dir="ltr"] .toggle-button.end:not(.vertical) .img {
+ transform: scaleX(-1);
+}
+
+.toggle-button.end.vertical .img {
+ transform: rotate(-90deg);
+}
diff --git a/devtools/client/debugger/src/components/shared/Button/styles/moz.build b/devtools/client/debugger/src/components/shared/Button/styles/moz.build
new file mode 100644
index 0000000000..7d80140dbe
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/Button/styles/moz.build
@@ -0,0 +1,8 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DIRS += []
+
+CompiledModules()
diff --git a/devtools/client/debugger/src/components/shared/Button/tests/CloseButton.spec.js b/devtools/client/debugger/src/components/shared/Button/tests/CloseButton.spec.js
new file mode 100644
index 0000000000..5e448881d9
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/Button/tests/CloseButton.spec.js
@@ -0,0 +1,31 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React from "devtools/client/shared/vendor/react";
+import { shallow } from "enzyme";
+import { CloseButton } from "../";
+
+describe("CloseButton", () => {
+ it("renders with tooltip", () => {
+ const tooltip = "testTooltip";
+ const wrapper = shallow(
+ React.createElement(CloseButton, {
+ tooltip: tooltip,
+ handleClick: () => {},
+ })
+ );
+ expect(wrapper).toMatchSnapshot();
+ });
+
+ it("handles click event", () => {
+ const handleClickSpy = jest.fn();
+ const wrapper = shallow(
+ React.createElement(CloseButton, {
+ handleClick: handleClickSpy,
+ })
+ );
+ wrapper.simulate("click");
+ expect(handleClickSpy).toHaveBeenCalled();
+ });
+});
diff --git a/devtools/client/debugger/src/components/shared/Button/tests/CommandBarButton.spec.js b/devtools/client/debugger/src/components/shared/Button/tests/CommandBarButton.spec.js
new file mode 100644
index 0000000000..41537cf8e4
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/Button/tests/CommandBarButton.spec.js
@@ -0,0 +1,44 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React from "devtools/client/shared/vendor/react";
+import { shallow } from "enzyme";
+import { CommandBarButton, debugBtn } from "../";
+
+describe("CommandBarButton", () => {
+ it("renders", () => {
+ const wrapper = shallow(
+ React.createElement(CommandBarButton, {
+ children: [],
+ className: "",
+ })
+ );
+ expect(wrapper).toMatchSnapshot();
+ });
+
+ it("renders children", () => {
+ const children = [1, 2, 3, 4];
+ const wrapper = shallow(
+ React.createElement(CommandBarButton, {
+ children: children,
+ className: "",
+ })
+ );
+ expect(wrapper.find("button").children()).toHaveLength(4);
+ });
+});
+
+describe("debugBtn", () => {
+ it("renders", () => {
+ const wrapper = shallow(debugBtn());
+ expect(wrapper).toMatchSnapshot();
+ });
+
+ it("handles onClick", () => {
+ const onClickSpy = jest.fn();
+ const wrapper = shallow(debugBtn(onClickSpy));
+ wrapper.simulate("click");
+ expect(onClickSpy).toHaveBeenCalled();
+ });
+});
diff --git a/devtools/client/debugger/src/components/shared/Button/tests/PaneToggleButton.spec.js b/devtools/client/debugger/src/components/shared/Button/tests/PaneToggleButton.spec.js
new file mode 100644
index 0000000000..89b548379d
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/Button/tests/PaneToggleButton.spec.js
@@ -0,0 +1,51 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React from "devtools/client/shared/vendor/react";
+import { shallow } from "enzyme";
+import { PaneToggleButton } from "../";
+
+describe("PaneToggleButton", () => {
+ const handleClickSpy = jest.fn();
+ const wrapper = shallow(
+ React.createElement(PaneToggleButton, {
+ handleClick: handleClickSpy,
+ collapsed: false,
+ position: "start",
+ })
+ );
+
+ it("renders default", () => {
+ expect(wrapper.hasClass("vertical")).toBe(true);
+ expect(wrapper).toMatchSnapshot();
+ });
+
+ it("toggles horizontal class", () => {
+ wrapper.setProps({ horizontal: true });
+ expect(wrapper.hasClass("vertical")).toBe(false);
+ });
+
+ it("toggles collapsed class", () => {
+ wrapper.setProps({ collapsed: true });
+ expect(wrapper.hasClass("collapsed")).toBe(true);
+ });
+
+ it("toggles start position", () => {
+ wrapper.setProps({ position: "start" });
+ expect(wrapper.hasClass("start")).toBe(true);
+ });
+
+ it("toggles end position", () => {
+ wrapper.setProps({ position: "end" });
+ expect(wrapper.hasClass("end")).toBe(true);
+ });
+
+ it("handleClick is called", () => {
+ const position = "end";
+ const collapsed = false;
+ wrapper.setProps({ position, collapsed });
+ wrapper.simulate("click");
+ expect(handleClickSpy).toHaveBeenCalledWith(position, true);
+ });
+});
diff --git a/devtools/client/debugger/src/components/shared/Button/tests/__snapshots__/CloseButton.spec.js.snap b/devtools/client/debugger/src/components/shared/Button/tests/__snapshots__/CloseButton.spec.js.snap
new file mode 100644
index 0000000000..d0a0cb9967
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/Button/tests/__snapshots__/CloseButton.spec.js.snap
@@ -0,0 +1,13 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CloseButton renders with tooltip 1`] = `
+<button
+ className="close-btn"
+ onClick={[Function]}
+ title="testTooltip"
+>
+ <AccessibleImage
+ className="close"
+ />
+</button>
+`;
diff --git a/devtools/client/debugger/src/components/shared/Button/tests/__snapshots__/CommandBarButton.spec.js.snap b/devtools/client/debugger/src/components/shared/Button/tests/__snapshots__/CommandBarButton.spec.js.snap
new file mode 100644
index 0000000000..cebcb5892c
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/Button/tests/__snapshots__/CommandBarButton.spec.js.snap
@@ -0,0 +1,18 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`CommandBarButton renders 1`] = `
+<button
+ aria-pressed={false}
+ className="command-bar-button"
+/>
+`;
+
+exports[`debugBtn renders 1`] = `
+<button
+ aria-pressed={false}
+ className="command-bar-button"
+ disabled={false}
+>
+ <AccessibleImage />
+</button>
+`;
diff --git a/devtools/client/debugger/src/components/shared/Button/tests/__snapshots__/PaneToggleButton.spec.js.snap b/devtools/client/debugger/src/components/shared/Button/tests/__snapshots__/PaneToggleButton.spec.js.snap
new file mode 100644
index 0000000000..86067066a6
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/Button/tests/__snapshots__/PaneToggleButton.spec.js.snap
@@ -0,0 +1,13 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`PaneToggleButton renders default 1`] = `
+<CommandBarButton
+ className="toggle-button start vertical"
+ onClick={[Function]}
+ title="Collapse Sources and Outline panes"
+>
+ <AccessibleImage
+ className="pane-collapse"
+ />
+</CommandBarButton>
+`;
diff --git a/devtools/client/debugger/src/components/shared/Dropdown.css b/devtools/client/debugger/src/components/shared/Dropdown.css
new file mode 100644
index 0000000000..bb9295b296
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/Dropdown.css
@@ -0,0 +1,97 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+.dropdown {
+ background: var(--theme-body-background);
+ border: 1px solid var(--theme-splitter-color);
+ border-radius: 4px;
+ box-shadow: 0 4px 4px 0 var(--search-overlays-semitransparent);
+ max-height: 300px;
+ position: absolute;
+ top: 24px;
+ width: 150px;
+ z-index: 1000;
+ overflow: auto;
+}
+
+[dir="ltr"] .dropdown {
+ right: 2px;
+}
+
+[dir="rtl"] .dropdown {
+ left: 2px;
+}
+
+.dropdown-block {
+ position: relative;
+ align-self: center;
+ height: 100%;
+}
+
+/* cover the reserved space at the end of .source-tabs */
+.source-tabs + .dropdown-block {
+ margin-inline-start: -28px;
+}
+
+.dropdown-button {
+ color: var(--theme-comment);
+ background: none;
+ border: none;
+ padding: 4px 6px;
+ font-weight: 100;
+ font-size: 14px;
+ height: 100%;
+ width: 28px;
+ outline-offset: -2px;
+}
+
+.dropdown-button .img {
+ display: block;
+}
+
+.dropdown ul {
+ margin: 0;
+ padding: 4px 0;
+ list-style: none;
+}
+
+.dropdown li {
+ display: flex;
+ align-items: center;
+ padding: 6px 8px;
+ font-size: 12px;
+ line-height: calc(16 / 12);
+ transition: all 0.25s ease;
+}
+
+.dropdown li:hover {
+ background-color: var(--search-overlays-semitransparent);
+}
+
+.dropdown-icon {
+ margin-inline-end: 4px;
+ mask-size: 13px 13px;
+}
+
+.dropdown-label {
+ display: block;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.dropdown-icon.prettyPrint,
+.dropdown-icon.blackBox {
+ background-color: var(--theme-highlight-blue);
+}
+
+.dropdown-mask {
+ position: fixed;
+ width: 100%;
+ height: 100%;
+ background: transparent;
+ z-index: 999;
+ left: 0;
+ top: 0;
+}
diff --git a/devtools/client/debugger/src/components/shared/Dropdown.js b/devtools/client/debugger/src/components/shared/Dropdown.js
new file mode 100644
index 0000000000..a47eef9534
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/Dropdown.js
@@ -0,0 +1,74 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { Component } from "devtools/client/shared/vendor/react";
+import { button, div } from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+
+export class Dropdown extends Component {
+ constructor(props) {
+ super(props);
+ this.state = {
+ dropdownShown: false,
+ };
+ }
+
+ static get propTypes() {
+ return {
+ icon: PropTypes.node.isRequired,
+ panel: PropTypes.node.isRequired,
+ };
+ }
+
+ toggleDropdown = e => {
+ this.setState(prevState => ({
+ dropdownShown: !prevState.dropdownShown,
+ }));
+ };
+
+ renderPanel() {
+ return div(
+ {
+ className: "dropdown",
+ onClick: this.toggleDropdown,
+ style: {
+ display: this.state.dropdownShown ? "block" : "none",
+ },
+ },
+ this.props.panel
+ );
+ }
+
+ renderButton() {
+ return button(
+ {
+ className: "dropdown-button",
+ onClick: this.toggleDropdown,
+ },
+ this.props.icon
+ );
+ }
+
+ renderMask() {
+ return div({
+ className: "dropdown-mask",
+ onClick: this.toggleDropdown,
+ style: {
+ display: this.state.dropdownShown ? "block" : "none",
+ },
+ });
+ }
+ render() {
+ return div(
+ {
+ className: "dropdown-block",
+ },
+ this.renderPanel(),
+ this.renderButton(),
+ this.renderMask()
+ );
+ }
+}
+
+export default Dropdown;
diff --git a/devtools/client/debugger/src/components/shared/Modal.css b/devtools/client/debugger/src/components/shared/Modal.css
new file mode 100644
index 0000000000..2c8f429285
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/Modal.css
@@ -0,0 +1,47 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+.modal-wrapper {
+ position: fixed;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ width: 100%;
+ height: 100%;
+ top: 0;
+ left: 0;
+ z-index: 100;
+}
+
+.modal {
+ display: flex;
+ flex-direction: column;
+ /* Place the modal below the sources tab strip */
+ margin-block-start: var(--editor-header-height);
+ width: 80%;
+ max-height: 80vh;
+ overflow-y: auto;
+ background-color: var(--theme-toolbar-background);
+ box-shadow: 1px 1px 6px 1px var(--popup-shadow-color);
+
+ @media not (prefers-reduced-motion) {
+ animation: 150ms cubic-bezier(0.07, 0.95, 0, 1) slidein forwards;
+ }
+}
+
+@keyframes slidein {
+ from {
+ transform: translateY(-101%);
+ }
+ to {
+ transform: translateY(0);
+ }
+}
+
+/* This rule is active when the screen is not narrow */
+@media (min-width: 580px) {
+ .modal {
+ width: 50%;
+ }
+}
diff --git a/devtools/client/debugger/src/components/shared/Modal.js b/devtools/client/debugger/src/components/shared/Modal.js
new file mode 100644
index 0000000000..c14732f302
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/Modal.js
@@ -0,0 +1,45 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+import React from "devtools/client/shared/vendor/react";
+import { div } from "devtools/client/shared/vendor/react-dom-factories";
+const classnames = require("resource://devtools/client/shared/classnames.js");
+
+class Modal extends React.Component {
+ static get propTypes() {
+ return {
+ additionalClass: PropTypes.string,
+ children: PropTypes.node.isRequired,
+ handleClose: PropTypes.func.isRequired,
+ };
+ }
+
+ onClick = e => {
+ e.stopPropagation();
+ };
+
+ render() {
+ const { additionalClass, children, handleClose } = this.props;
+ return div(
+ {
+ className: "modal-wrapper",
+ onClick: handleClose,
+ },
+ div(
+ {
+ className: classnames("modal", additionalClass),
+ onClick: this.onClick,
+ },
+ children
+ )
+ );
+ }
+}
+
+Modal.contextTypes = {
+ shortcuts: PropTypes.object,
+};
+
+export default Modal;
diff --git a/devtools/client/debugger/src/components/shared/Popover.css b/devtools/client/debugger/src/components/shared/Popover.css
new file mode 100644
index 0000000000..5da8ea4b63
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/Popover.css
@@ -0,0 +1,32 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+.popover {
+ position: fixed;
+ z-index: 100;
+ --gap-size: 10px;
+ --left-offset: -55px;
+}
+
+.popover.orientation-right {
+ display: flex;
+ flex-direction: row;
+}
+
+.popover.orientation-right .gap {
+ width: var(--gap-size);
+}
+
+.popover:not(.orientation-right) .gap {
+ height: var(--gap-size);
+ margin-left: var(--left-offset);
+}
+
+.popover:not(.orientation-right) .preview-popup {
+ margin-left: var(--left-offset);
+}
+
+.popover .add-to-expression-bar {
+ margin-left: var(--left-offset);
+}
diff --git a/devtools/client/debugger/src/components/shared/Popover.js b/devtools/client/debugger/src/components/shared/Popover.js
new file mode 100644
index 0000000000..8748e36418
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/Popover.js
@@ -0,0 +1,324 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React, { Component } from "devtools/client/shared/vendor/react";
+import { div } from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+import BracketArrow from "./BracketArrow";
+import SmartGap from "./SmartGap";
+
+const classnames = require("resource://devtools/client/shared/classnames.js");
+
+class Popover extends Component {
+ state = {
+ coords: {
+ left: 0,
+ top: 0,
+ orientation: "down",
+ targetMid: { x: 0, y: 0 },
+ },
+ };
+ firstRender = true;
+
+ static defaultProps = {
+ type: "popover",
+ };
+
+ static get propTypes() {
+ return {
+ children: PropTypes.node.isRequired,
+ editorRef: PropTypes.object.isRequired,
+ mouseout: PropTypes.func.isRequired,
+ target: PropTypes.object.isRequired,
+ targetPosition: PropTypes.object.isRequired,
+ type: PropTypes.string.isRequired,
+ };
+ }
+
+ componentDidMount() {
+ const { type } = this.props;
+ this.gapHeight = this.$gap.getBoundingClientRect().height;
+ const coords =
+ type == "popover" ? this.getPopoverCoords() : this.getTooltipCoords();
+
+ if (coords) {
+ this.setState({ coords });
+ }
+
+ this.firstRender = false;
+ this.startTimer();
+ }
+
+ componentDidUpdate(prevProps) {
+ // We have to update `coords` when the Popover type changes
+ if (
+ prevProps.type != this.props.type ||
+ prevProps.target !== this.props.target
+ ) {
+ const coords =
+ this.props.type == "popover"
+ ? this.getPopoverCoords()
+ : this.getTooltipCoords();
+
+ if (coords) {
+ this.setState({ coords });
+ }
+ }
+ }
+
+ componentWillUnmount() {
+ if (this.timerId) {
+ clearTimeout(this.timerId);
+ }
+ }
+
+ startTimer() {
+ this.timerId = setTimeout(this.onTimeout, 0);
+ }
+
+ onTimeout = () => {
+ const isHoveredOnGap = this.$gap && this.$gap.matches(":hover");
+ const isHoveredOnPopover = this.$popover && this.$popover.matches(":hover");
+ const isHoveredOnTooltip = this.$tooltip && this.$tooltip.matches(":hover");
+ const isHoveredOnTarget = this.props.target.matches(":hover");
+
+ if (isHoveredOnGap) {
+ if (!this.wasOnGap) {
+ this.wasOnGap = true;
+ this.timerId = setTimeout(this.onTimeout, 200);
+ return;
+ }
+ this.props.mouseout();
+ return;
+ }
+
+ // Don't clear the current preview if mouse is hovered on
+ // the current preview's token (target) or the popup element
+ if (isHoveredOnPopover || isHoveredOnTooltip || isHoveredOnTarget) {
+ this.wasOnGap = false;
+ this.timerId = setTimeout(this.onTimeout, 0);
+ return;
+ }
+
+ this.props.mouseout();
+ };
+
+ calculateLeft(target, editor, popover, orientation) {
+ const estimatedLeft = target.left;
+ const estimatedRight = estimatedLeft + popover.width;
+ const isOverflowingRight = estimatedRight > editor.right;
+ if (orientation === "right") {
+ return target.left + target.width;
+ }
+ if (isOverflowingRight) {
+ const adjustedLeft = editor.right - popover.width - 8;
+ return adjustedLeft;
+ }
+ return estimatedLeft;
+ }
+
+ calculateTopForRightOrientation = (target, editor, popover) => {
+ if (popover.height <= editor.height) {
+ const rightOrientationTop = target.top - popover.height / 2;
+ if (rightOrientationTop < editor.top) {
+ return editor.top - target.height;
+ }
+ const rightOrientationBottom = rightOrientationTop + popover.height;
+ if (rightOrientationBottom > editor.bottom) {
+ return editor.bottom + target.height - popover.height + this.gapHeight;
+ }
+ return rightOrientationTop;
+ }
+ return editor.top - target.height;
+ };
+
+ calculateOrientation(target, editor, popover) {
+ const estimatedBottom = target.bottom + popover.height;
+ if (editor.bottom > estimatedBottom) {
+ return "down";
+ }
+ const upOrientationTop = target.top - popover.height;
+ if (upOrientationTop > editor.top) {
+ return "up";
+ }
+
+ return "right";
+ }
+
+ calculateTop = (target, editor, popover, orientation) => {
+ if (orientation === "down") {
+ return target.bottom;
+ }
+ if (orientation === "up") {
+ return target.top - popover.height;
+ }
+
+ return this.calculateTopForRightOrientation(target, editor, popover);
+ };
+
+ getPopoverCoords() {
+ if (!this.$popover || !this.props.editorRef) {
+ return null;
+ }
+
+ const popover = this.$popover;
+ const editor = this.props.editorRef;
+ const popoverRect = popover.getBoundingClientRect();
+ const editorRect = editor.getBoundingClientRect();
+ const targetRect = this.props.targetPosition;
+ const orientation = this.calculateOrientation(
+ targetRect,
+ editorRect,
+ popoverRect
+ );
+ const top = this.calculateTop(
+ targetRect,
+ editorRect,
+ popoverRect,
+ orientation
+ );
+ const popoverLeft = this.calculateLeft(
+ targetRect,
+ editorRect,
+ popoverRect,
+ orientation
+ );
+ let targetMid;
+ if (orientation === "right") {
+ targetMid = {
+ x: -14,
+ y: targetRect.top - top - 2,
+ };
+ } else {
+ targetMid = {
+ x: targetRect.left - popoverLeft + targetRect.width / 2 - 8,
+ y: 0,
+ };
+ }
+
+ return {
+ left: popoverLeft,
+ top,
+ orientation,
+ targetMid,
+ };
+ }
+
+ getTooltipCoords() {
+ if (!this.$tooltip || !this.props.editorRef) {
+ return null;
+ }
+ const tooltip = this.$tooltip;
+ const editor = this.props.editorRef;
+ const tooltipRect = tooltip.getBoundingClientRect();
+ const editorRect = editor.getBoundingClientRect();
+ const targetRect = this.props.targetPosition;
+ const left = this.calculateLeft(targetRect, editorRect, tooltipRect);
+ const enoughRoomForTooltipAbove =
+ targetRect.top - editorRect.top > tooltipRect.height;
+ const top = enoughRoomForTooltipAbove
+ ? targetRect.top - tooltipRect.height
+ : targetRect.bottom;
+
+ return {
+ left,
+ top,
+ orientation: enoughRoomForTooltipAbove ? "up" : "down",
+ targetMid: { x: 0, y: 0 },
+ };
+ }
+
+ getChildren() {
+ const { children } = this.props;
+ const { coords } = this.state;
+ const gap = this.getGap();
+
+ return coords.orientation === "up" ? [children, gap] : [gap, children];
+ }
+
+ getGap() {
+ if (this.firstRender) {
+ return div({
+ className: "gap",
+ key: "gap",
+ ref: a => (this.$gap = a),
+ });
+ }
+
+ return div(
+ {
+ className: "gap",
+ key: "gap",
+ ref: a => (this.$gap = a),
+ },
+ React.createElement(SmartGap, {
+ token: this.props.target,
+ preview: this.$tooltip || this.$popover,
+ type: this.props.type,
+ gapHeight: this.gapHeight,
+ coords: this.state.coords,
+ offset: this.$gap.getBoundingClientRect().left,
+ })
+ );
+ }
+
+ getPopoverArrow(orientation, left, top) {
+ let arrowProps = {};
+
+ if (orientation === "up") {
+ arrowProps = { orientation: "down", bottom: 10, left };
+ } else if (orientation === "down") {
+ arrowProps = { orientation: "up", top: -2, left };
+ } else {
+ arrowProps = { orientation: "left", top, left: -4 };
+ }
+ return React.createElement(BracketArrow, arrowProps);
+ }
+
+ renderPopover() {
+ const { top, left, orientation, targetMid } = this.state.coords;
+ const arrow = this.getPopoverArrow(orientation, targetMid.x, targetMid.y);
+ return div(
+ {
+ className: classnames("popover", `orientation-${orientation}`, {
+ up: orientation === "up",
+ }),
+ style: {
+ top,
+ left,
+ },
+ ref: c => (this.$popover = c),
+ },
+ arrow,
+ this.getChildren()
+ );
+ }
+
+ renderTooltip() {
+ const { top, left, orientation } = this.state.coords;
+ return div(
+ {
+ className: `tooltip orientation-${orientation}`,
+ style: {
+ top,
+ left,
+ },
+ ref: c => (this.$tooltip = c),
+ },
+ this.getChildren()
+ );
+ }
+
+ render() {
+ const { type } = this.props;
+
+ if (type === "tooltip") {
+ return this.renderTooltip();
+ }
+
+ return this.renderPopover();
+ }
+}
+
+export default Popover;
diff --git a/devtools/client/debugger/src/components/shared/PreviewFunction.css b/devtools/client/debugger/src/components/shared/PreviewFunction.css
new file mode 100644
index 0000000000..bff9ce25a2
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/PreviewFunction.css
@@ -0,0 +1,23 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+.function-signature {
+ align-self: center;
+}
+
+.function-signature .function-name {
+ color: var(--theme-highlight-blue);
+}
+
+.function-signature .param {
+ color: var(--theme-highlight-red);
+}
+
+.function-signature .paren {
+ color: var(--object-color);
+}
+
+.function-signature .comma {
+ color: var(--object-color);
+}
diff --git a/devtools/client/debugger/src/components/shared/PreviewFunction.js b/devtools/client/debugger/src/components/shared/PreviewFunction.js
new file mode 100644
index 0000000000..1a6d164cdf
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/PreviewFunction.js
@@ -0,0 +1,108 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { Component } from "devtools/client/shared/vendor/react";
+import {
+ span,
+ button,
+} from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+
+import { formatDisplayName } from "../../utils/pause/frames/index";
+
+const IGNORED_SOURCE_URLS = ["debugger eval code"];
+
+export default class PreviewFunction extends Component {
+ static get propTypes() {
+ return {
+ func: PropTypes.object.isRequired,
+ };
+ }
+
+ renderFunctionName(func) {
+ const { l10n } = this.context;
+ const name = formatDisplayName(func, undefined, l10n);
+ return span(
+ {
+ className: "function-name",
+ },
+ name
+ );
+ }
+
+ renderParams(func) {
+ const { parameterNames = [] } = func;
+
+ return parameterNames
+ .filter(Boolean)
+ .map((param, i, arr) => {
+ const elements = [
+ span(
+ {
+ className: "param",
+ key: param,
+ },
+ param
+ ),
+ ];
+ // if this isn't the last param, add a comma
+ if (i !== arr.length - 1) {
+ elements.push(
+ span(
+ {
+ className: "delimiter",
+ key: i,
+ },
+ ", "
+ )
+ );
+ }
+ return elements;
+ })
+ .flat();
+ }
+
+ jumpToDefinitionButton(func) {
+ const { location } = func;
+
+ if (!location?.url || IGNORED_SOURCE_URLS.includes(location.url)) {
+ return null;
+ }
+
+ const lastIndex = location.url.lastIndexOf("/");
+ return button({
+ className: "jump-definition",
+ draggable: "false",
+ title: `${location.url.slice(lastIndex + 1)}:${location.line}`,
+ });
+ }
+
+ render() {
+ const { func } = this.props;
+ return span(
+ {
+ className: "function-signature",
+ },
+ this.renderFunctionName(func),
+ span(
+ {
+ className: "paren",
+ },
+ "("
+ ),
+ this.renderParams(func),
+ span(
+ {
+ className: "paren",
+ },
+ ")"
+ ),
+ this.jumpToDefinitionButton(func)
+ );
+ }
+}
+
+PreviewFunction.contextTypes = {
+ l10n: PropTypes.object,
+};
diff --git a/devtools/client/debugger/src/components/shared/ResultList.css b/devtools/client/debugger/src/components/shared/ResultList.css
new file mode 100644
index 0000000000..037c3497d3
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/ResultList.css
@@ -0,0 +1,131 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+.result-list {
+ list-style: none;
+ margin: 0px;
+ padding: 0px;
+ overflow: auto;
+ width: 100%;
+ background: var(--theme-body-background);
+}
+
+.result-list * {
+ user-select: none;
+}
+
+.result-list li {
+ color: var(--theme-body-color);
+ padding: 4px 8px;
+ display: flex;
+}
+
+.result-list.big li {
+ flex-direction: row;
+ align-items: center;
+ padding: 6px 8px;
+ font-size: 12px;
+ line-height: 16px;
+}
+
+.result-list.small li {
+ justify-content: space-between;
+}
+
+.result-list li:hover {
+ background: var(--theme-tab-toolbar-background);
+}
+
+.theme-dark .result-list li:hover {
+ background: var(--grey-70);
+}
+
+.result-list li.selected {
+ background: var(--theme-accordion-header-background);
+}
+
+.result-list.small li.selected {
+ background-color: var(--theme-selection-background);
+ color: white;
+}
+
+.result-list li .result-item-icon {
+ background-color: var(--theme-icon-dimmed-color);
+}
+
+.result-list li .icon {
+ align-self: center;
+ margin-inline-end: 14px;
+ margin-inline-start: 4px;
+}
+
+.result-list .result-item-icon {
+ display: block;
+}
+
+.result-list .selected .result-item-icon {
+ background-color: var(--theme-selection-color);
+}
+
+.result-list li .title {
+ word-break: break-all;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+
+ /** https://searchfox.org/mozilla-central/source/devtools/client/themes/variables.css **/
+ color: var(--grey-90);
+}
+
+.theme-dark .result-list li .title {
+ /** https://searchfox.org/mozilla-central/source/devtools/client/themes/variables.css **/
+ color: var(--grey-30);
+}
+
+.result-list li.selected .title {
+ color: white;
+}
+
+.result-list.big li.selected {
+ background-color: var(--theme-selection-background);
+ color: white;
+}
+
+.result-list.big li.selected .subtitle {
+ color: white;
+}
+
+.result-list.big li.selected .subtitle .highlight {
+ color: white;
+ font-weight: bold;
+}
+
+.result-list.big li .subtitle {
+ word-break: break-all;
+ /** https://searchfox.org/mozilla-central/source/devtools/client/themes/variables.css **/
+ color: var(--grey-40);
+ margin-left: 15px;
+ text-overflow: ellipsis;
+ overflow: hidden;
+ white-space: nowrap;
+}
+
+.theme-dark .result-list.big li.selected .subtitle {
+ color: white;
+}
+
+.theme-dark .result-list.big li .subtitle {
+ color: var(--theme-text-color-inactive);
+}
+
+.search-bar .result-list li.selected .subtitle {
+ color: white;
+}
+
+.search-bar .result-list {
+ border-bottom: 1px solid var(--theme-splitter-color);
+}
+
+.theme-dark .result-list {
+ background-color: var(--theme-body-background);
+}
diff --git a/devtools/client/debugger/src/components/shared/ResultList.js b/devtools/client/debugger/src/components/shared/ResultList.js
new file mode 100644
index 0000000000..6b29de51f4
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/ResultList.js
@@ -0,0 +1,102 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React, { Component } from "devtools/client/shared/vendor/react";
+import { li, div, ul } from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+
+import AccessibleImage from "./AccessibleImage";
+
+const classnames = require("resource://devtools/client/shared/classnames.js");
+
+import { scrollList } from "../../utils/result-list";
+
+export default class ResultList extends Component {
+ static defaultProps = {
+ size: "small",
+ role: "listbox",
+ };
+
+ static get propTypes() {
+ return {
+ items: PropTypes.array.isRequired,
+ role: PropTypes.oneOf(["listbox"]),
+ selectItem: PropTypes.func.isRequired,
+ selected: PropTypes.number.isRequired,
+ size: PropTypes.oneOf(["big", "small"]),
+ };
+ }
+
+ constructor(props) {
+ super(props);
+ this.ref = React.createRef();
+ }
+
+ componentDidUpdate() {
+ if (this.ref.current.childNodes) {
+ scrollList(this.ref.current.childNodes, this.props.selected);
+ }
+ }
+
+ renderListItem = (item, index) => {
+ if (item.value === "/" && item.title === "") {
+ item.title = "(index)";
+ }
+
+ const { selectItem, selected } = this.props;
+ const props = {
+ onClick: event => selectItem(event, item, index),
+ key: `${item.id}${item.value}${index}`,
+ title: item.value,
+ "aria-labelledby": `${item.id}-title`,
+ "aria-describedby": `${item.id}-subtitle`,
+ role: "option",
+ className: classnames("result-item", {
+ selected: index === selected,
+ }),
+ };
+
+ return li(
+ props,
+ item.icon &&
+ div(
+ {
+ className: "icon",
+ },
+ React.createElement(AccessibleImage, {
+ className: item.icon,
+ })
+ ),
+ div(
+ {
+ id: `${item.id}-title`,
+ className: "title",
+ },
+ item.title
+ ),
+ item.subtitle != item.title
+ ? div(
+ {
+ id: `${item.id}-subtitle`,
+ className: "subtitle",
+ },
+ item.subtitle
+ )
+ : null
+ );
+ };
+ render() {
+ const { size, items, role } = this.props;
+ return ul(
+ {
+ ref: this.ref,
+ className: classnames("result-list", size),
+ id: "result-list",
+ role: role,
+ "aria-live": "polite",
+ },
+ items.map(this.renderListItem)
+ );
+ }
+}
diff --git a/devtools/client/debugger/src/components/shared/SearchInput.css b/devtools/client/debugger/src/components/shared/SearchInput.css
new file mode 100644
index 0000000000..4a5ee85ed3
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/SearchInput.css
@@ -0,0 +1,223 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+.search-outline {
+ border: 1px solid var(--theme-toolbar-background);
+ border-bottom: 1px solid var(--theme-splitter-color);
+ transition: border-color 200ms ease-in-out;
+ display: flex;
+ flex-direction: column;
+}
+
+.search-field {
+ position: relative;
+ display: flex;
+ align-items: center;
+ flex-shrink: 0;
+ min-height: 24px;
+ width: 100%;
+}
+
+.search-field .img.search {
+ --icon-mask-size: 12px;
+ --icon-inset-inline-start: 6px;
+ position: absolute;
+ z-index: 1;
+ top: calc(50% - 8px);
+ mask-size: var(--icon-mask-size);
+ background-color: var(--theme-icon-dimmed-color);
+ pointer-events: none;
+}
+
+.search-field.big .img.search {
+ --icon-mask-size: 16px;
+ --icon-inset-inline-start: 12px;
+}
+
+[dir="ltr"] .search-field .img.search {
+ left: var(--icon-inset-inline-start);
+}
+
+[dir="rtl"] .search-field .img.search {
+ right: var(--icon-inset-inline-start);
+}
+
+.search-field .img.loader {
+ width: 24px;
+ height: 24px;
+ margin-inline-end: 4px;
+}
+
+.search-field input {
+ align-self: stretch;
+ flex-grow: 1;
+ height: 24px;
+ width: 40px;
+ border: none;
+ padding: 4px;
+ padding-inline-start: 28px;
+ line-height: 16px;
+ font-family: inherit;
+ font-size: inherit;
+ color: var(--theme-body-color);
+ background-color: transparent;
+ outline-offset: -1px;
+
+ &:focus-visible {
+ /* Don't show the box-shadow focus indicator, only keep the outline, otherwise the
+ shadow overlap the first item in the result list */
+ box-shadow: none;
+ }
+}
+
+.exclude-patterns-field {
+ position: relative;
+ display: flex;
+ align-items: flex-start;
+ flex-direction: column;
+ flex-shrink: 0;
+ min-height: 24px;
+ width: 100%;
+ border-top: 1px solid var(--theme-splitter-color);
+ margin-top: 1px;
+ outline-offset: -1px;
+}
+
+.exclude-patterns-field label {
+ padding-inline-start: 8px;
+ padding-top: 5px;
+ padding-bottom: 3px;
+ align-self: stretch;
+ background-color: var(--theme-accordion-header-background);
+ font-size: 12px;
+}
+
+.exclude-patterns-field input {
+ align-self: stretch;
+ height: 24px;
+ border: none;
+ padding-top: 14px;
+ padding-bottom: 14px;
+ padding-inline-start: 10px;
+ line-height: 16px;
+ font-family: inherit;
+ font-size: inherit;
+ color: var(--theme-body-color);
+ background-color: transparent;
+ border-top: 1px solid var(--theme-splitter-color);
+ min-height: 24px;
+ outline-offset: -1px;
+}
+
+.exclude-patterns-field input::placeholder {
+ color: var(--theme-text-color-alt);
+ opacity: 1;
+}
+
+.search-field.big input {
+ height: 40px;
+ padding-top: 10px;
+ padding-bottom: 10px;
+ padding-inline-start: 40px;
+ font-size: 14px;
+ line-height: 20px;
+}
+
+.search-field input::placeholder {
+ color: var(--theme-text-color-alt);
+ opacity: 1;
+}
+
+.search-field-summary {
+ align-self: center;
+ padding: 2px 4px;
+ white-space: nowrap;
+ text-align: center;
+ user-select: none;
+ color: var(--theme-text-color-alt);
+ /* Avoid layout jumps when we increment the result count quickly. With tabular
+ numbers, layout will only jump between 9 and 10, 99 and 100, etc. */
+ font-variant-numeric: tabular-nums;
+}
+
+.search-field.big .search-field-summary {
+ margin-inline-end: 4px;
+}
+
+.search-field .search-nav-buttons {
+ display: flex;
+ user-select: none;
+}
+
+.search-field .search-nav-buttons .nav-btn {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ height: 100%;
+ padding: 4px;
+ background: transparent;
+ outline-offset: -2px;
+}
+
+.search-field .search-nav-buttons .nav-btn:hover {
+ background-color: var(--theme-toolbar-background-hover);
+}
+
+.search-field .close-btn {
+ margin-inline-end: 4px;
+}
+
+.search-field.big .close-btn {
+ margin-inline-end: 8px;
+}
+
+.search-field .close-btn::-moz-focus-inner {
+ border: none;
+}
+
+.search-buttons-bar .pipe-divider {
+ flex: none;
+ align-self: stretch;
+ width: 1px;
+ vertical-align: middle;
+ margin: 4px;
+ background-color: var(--theme-splitter-color);
+}
+
+.search-buttons-bar * {
+ user-select: none;
+}
+
+.search-buttons-bar {
+ display: flex;
+ flex-shrink: 0;
+ justify-content: flex-end;
+ align-items: center;
+ padding: 0;
+}
+
+.search-buttons-bar .search-type-toggles {
+ display: flex;
+ align-items: center;
+ max-width: 68%;
+}
+
+.search-buttons-bar .search-type-name {
+ margin: 0 4px;
+ border: none;
+ background: transparent;
+ color: var(--theme-comment);
+}
+
+.search-buttons-bar .search-type-toggles .search-type-btn.active {
+ color: var(--theme-selection-background);
+}
+
+.theme-dark .search-buttons-bar .search-type-toggles .search-type-btn.active {
+ color: white;
+}
+
+.search-buttons-bar .close-btn {
+ margin-inline-end: 3px;
+}
diff --git a/devtools/client/debugger/src/components/shared/SearchInput.js b/devtools/client/debugger/src/components/shared/SearchInput.js
new file mode 100644
index 0000000000..18f6ffbebb
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/SearchInput.js
@@ -0,0 +1,362 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React, { Component } from "devtools/client/shared/vendor/react";
+import {
+ button,
+ div,
+ label,
+ input,
+ span,
+} from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+import { connect } from "devtools/client/shared/vendor/react-redux";
+import { CloseButton } from "./Button/index";
+
+import AccessibleImage from "./AccessibleImage";
+import actions from "../../actions/index";
+import { getSearchOptions } from "../../selectors/index";
+
+const classnames = require("resource://devtools/client/shared/classnames.js");
+const SearchModifiers = require("resource://devtools/client/shared/components/SearchModifiers.js");
+
+const arrowBtn = (onClick, type, className, tooltip) => {
+ const props = {
+ className,
+ key: type,
+ onClick,
+ title: tooltip,
+ type,
+ };
+ return button(
+ props,
+ React.createElement(AccessibleImage, {
+ className: type,
+ })
+ );
+};
+
+export class SearchInput extends Component {
+ static defaultProps = {
+ expanded: false,
+ hasPrefix: false,
+ selectedItemId: "",
+ size: "",
+ showClose: true,
+ };
+
+ constructor(props) {
+ super(props);
+ this.state = {
+ history: [],
+ excludePatterns: props.searchOptions.excludePatterns,
+ };
+ }
+
+ static get propTypes() {
+ return {
+ count: PropTypes.number.isRequired,
+ expanded: PropTypes.bool.isRequired,
+ handleClose: PropTypes.func,
+ handleNext: PropTypes.func,
+ handlePrev: PropTypes.func,
+ hasPrefix: PropTypes.bool.isRequired,
+ isLoading: PropTypes.bool.isRequired,
+ onBlur: PropTypes.func,
+ onChange: PropTypes.func,
+ onFocus: PropTypes.func,
+ onHistoryScroll: PropTypes.func,
+ onKeyDown: PropTypes.func,
+ onKeyUp: PropTypes.func,
+ placeholder: PropTypes.string,
+ query: PropTypes.string,
+ selectedItemId: PropTypes.string,
+ shouldFocus: PropTypes.bool,
+ showClose: PropTypes.bool.isRequired,
+ showExcludePatterns: PropTypes.bool.isRequired,
+ excludePatternsLabel: PropTypes.string,
+ excludePatternsPlaceholder: PropTypes.string,
+ showErrorEmoji: PropTypes.bool.isRequired,
+ size: PropTypes.string,
+ summaryMsg: PropTypes.string,
+ searchKey: PropTypes.string.isRequired,
+ searchOptions: PropTypes.object,
+ setSearchOptions: PropTypes.func,
+ showSearchModifiers: PropTypes.bool.isRequired,
+ onToggleSearchModifier: PropTypes.func,
+ };
+ }
+
+ componentDidMount() {
+ this.setFocus();
+ }
+
+ componentDidUpdate(prevProps) {
+ if (this.props.shouldFocus && !prevProps.shouldFocus) {
+ this.setFocus();
+ }
+ }
+
+ setFocus() {
+ if (this.$input) {
+ const _input = this.$input;
+ _input.focus();
+
+ if (!_input.value) {
+ return;
+ }
+
+ // omit prefix @:# from being selected
+ const selectStartPos = this.props.hasPrefix ? 1 : 0;
+ _input.setSelectionRange(selectStartPos, _input.value.length + 1);
+ }
+ }
+
+ renderArrowButtons() {
+ const { handleNext, handlePrev } = this.props;
+
+ return [
+ arrowBtn(
+ handlePrev,
+ "arrow-up",
+ classnames("nav-btn", "prev"),
+ L10N.getFormatStr("editor.searchResults.prevResult")
+ ),
+ arrowBtn(
+ handleNext,
+ "arrow-down",
+ classnames("nav-btn", "next"),
+ L10N.getFormatStr("editor.searchResults.nextResult")
+ ),
+ ];
+ }
+
+ onFocus = e => {
+ const { onFocus } = this.props;
+
+ if (onFocus) {
+ onFocus(e);
+ }
+ };
+
+ onBlur = e => {
+ const { onBlur } = this.props;
+
+ if (onBlur) {
+ onBlur(e);
+ }
+ };
+
+ onKeyDown = e => {
+ const { onHistoryScroll, onKeyDown } = this.props;
+ if (!onHistoryScroll) {
+ onKeyDown(e);
+ return;
+ }
+
+ const inputValue = e.target.value;
+ const { history } = this.state;
+ const currentHistoryIndex = history.indexOf(inputValue);
+
+ if (e.key === "Enter") {
+ this.saveEnteredTerm(inputValue);
+ onKeyDown(e);
+ return;
+ }
+
+ if (e.key === "ArrowUp") {
+ const previous =
+ currentHistoryIndex > -1 ? currentHistoryIndex - 1 : history.length - 1;
+ const previousInHistory = history[previous];
+ if (previousInHistory) {
+ e.preventDefault();
+ onHistoryScroll(previousInHistory);
+ }
+ return;
+ }
+
+ if (e.key === "ArrowDown") {
+ const next = currentHistoryIndex + 1;
+ const nextInHistory = history[next];
+ if (nextInHistory) {
+ onHistoryScroll(nextInHistory);
+ }
+ }
+ };
+
+ onExcludeKeyDown = e => {
+ if (e.key === "Enter") {
+ this.props.setSearchOptions(this.props.searchKey, {
+ excludePatterns: this.state.excludePatterns,
+ });
+ this.props.onKeyDown(e);
+ }
+ };
+
+ saveEnteredTerm(query) {
+ const { history } = this.state;
+ const previousIndex = history.indexOf(query);
+ if (previousIndex !== -1) {
+ history.splice(previousIndex, 1);
+ }
+ history.push(query);
+ this.setState({ history });
+ }
+
+ renderSummaryMsg() {
+ const { summaryMsg } = this.props;
+
+ if (!summaryMsg) {
+ return null;
+ }
+ return div(
+ {
+ className: "search-field-summary",
+ },
+ summaryMsg
+ );
+ }
+
+ renderSpinner() {
+ const { isLoading } = this.props;
+ if (!isLoading) {
+ return null;
+ }
+ return React.createElement(AccessibleImage, {
+ className: "loader spin",
+ });
+ }
+
+ renderNav() {
+ const { count, handleNext, handlePrev } = this.props;
+ if ((!handleNext && !handlePrev) || !count || count == 1) {
+ return null;
+ }
+ return div(
+ {
+ className: "search-nav-buttons",
+ },
+ this.renderArrowButtons()
+ );
+ }
+
+ renderSearchModifiers() {
+ if (!this.props.showSearchModifiers) {
+ return null;
+ }
+ return React.createElement(SearchModifiers, {
+ modifiers: this.props.searchOptions,
+ onToggleSearchModifier: updatedOptions => {
+ this.props.setSearchOptions(this.props.searchKey, updatedOptions);
+ this.props.onToggleSearchModifier();
+ },
+ });
+ }
+
+ renderExcludePatterns() {
+ if (!this.props.showExcludePatterns) {
+ return null;
+ }
+ return div(
+ {
+ className: classnames("exclude-patterns-field", this.props.size),
+ },
+ label(null, this.props.excludePatternsLabel),
+ input({
+ placeholder: this.props.excludePatternsPlaceholder,
+ value: this.state.excludePatterns,
+ onKeyDown: this.onExcludeKeyDown,
+ onChange: e =>
+ this.setState({
+ excludePatterns: e.target.value,
+ }),
+ })
+ );
+ }
+
+ renderClose() {
+ if (!this.props.showClose) {
+ return null;
+ }
+ return React.createElement(
+ React.Fragment,
+ null,
+ span({
+ className: "pipe-divider",
+ }),
+ React.createElement(CloseButton, {
+ handleClick: this.props.handleClose,
+ buttonClass: this.props.size,
+ })
+ );
+ }
+
+ render() {
+ const {
+ expanded,
+ onChange,
+ onKeyUp,
+ placeholder,
+ query,
+ selectedItemId,
+ showErrorEmoji,
+ size,
+ } = this.props;
+
+ const inputProps = {
+ className: classnames({
+ empty: showErrorEmoji,
+ }),
+ onChange,
+ onKeyDown: e => this.onKeyDown(e),
+ onKeyUp,
+ onFocus: e => this.onFocus(e),
+ onBlur: e => this.onBlur(e),
+ "aria-autocomplete": "list",
+ "aria-controls": "result-list",
+ "aria-activedescendant":
+ expanded && selectedItemId ? `${selectedItemId}-title` : "",
+ placeholder,
+ value: query,
+ spellCheck: false,
+ ref: c => (this.$input = c),
+ };
+ return div(
+ {
+ className: "search-outline",
+ },
+ div(
+ {
+ className: classnames("search-field", size),
+ role: "combobox",
+ "aria-haspopup": "listbox",
+ "aria-owns": "result-list",
+ "aria-expanded": expanded,
+ },
+ React.createElement(AccessibleImage, {
+ className: "search",
+ }),
+ input(inputProps),
+ this.renderSpinner(),
+ this.renderSummaryMsg(),
+ this.renderNav(),
+ div(
+ {
+ className: "search-buttons-bar",
+ },
+ this.renderSearchModifiers(),
+ this.renderClose()
+ )
+ ),
+ this.renderExcludePatterns()
+ );
+ }
+}
+const mapStateToProps = (state, props) => ({
+ searchOptions: getSearchOptions(state, props.searchKey),
+});
+
+export default connect(mapStateToProps, {
+ setSearchOptions: actions.setSearchOptions,
+})(SearchInput);
diff --git a/devtools/client/debugger/src/components/shared/SmartGap.js b/devtools/client/debugger/src/components/shared/SmartGap.js
new file mode 100644
index 0000000000..d76d018987
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/SmartGap.js
@@ -0,0 +1,170 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import {
+ svg,
+ polygon,
+} from "devtools/client/shared/vendor/react-dom-factories";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+
+function shorten(coordinates) {
+ // In cases where the token is wider than the preview, the smartGap
+ // gets distorted. This shortens the coordinate array so that the smartGap
+ // is only touching 2 corners of the token (instead of all 4 corners)
+ coordinates.splice(0, 2);
+ coordinates.splice(4, 2);
+ return coordinates;
+}
+
+function getSmartGapCoordinates(
+ preview,
+ token,
+ offset,
+ orientation,
+ gapHeight,
+ coords
+) {
+ if (orientation === "up") {
+ const coordinates = [
+ token.left - coords.left + offset,
+ token.top + token.height - (coords.top + preview.height) + gapHeight,
+ 0,
+ 0,
+ preview.width + offset,
+ 0,
+ token.left + token.width - coords.left + offset,
+ token.top + token.height - (coords.top + preview.height) + gapHeight,
+ token.left + token.width - coords.left + offset,
+ token.top - (coords.top + preview.height) + gapHeight,
+ token.left - coords.left + offset,
+ token.top - (coords.top + preview.height) + gapHeight,
+ ];
+ return preview.width > token.width ? coordinates : shorten(coordinates);
+ }
+ if (orientation === "down") {
+ const coordinates = [
+ token.left + token.width - (coords.left + preview.top) + offset,
+ 0,
+ preview.width + offset,
+ coords.top - token.top + gapHeight,
+ 0,
+ coords.top - token.top + gapHeight,
+ token.left - (coords.left + preview.top) + offset,
+ 0,
+ token.left - (coords.left + preview.top) + offset,
+ token.height,
+ token.left + token.width - (coords.left + preview.top) + offset,
+ token.height,
+ ];
+ return preview.width > token.width ? coordinates : shorten(coordinates);
+ }
+ return [
+ 0,
+ token.top - coords.top,
+ gapHeight + token.width,
+ 0,
+ gapHeight + token.width,
+ preview.height - gapHeight,
+ 0,
+ token.top + token.height - coords.top,
+ token.width,
+ token.top + token.height - coords.top,
+ token.width,
+ token.top - coords.top,
+ ];
+}
+
+function getSmartGapDimensions(
+ previewRect,
+ tokenRect,
+ offset,
+ orientation,
+ gapHeight,
+ coords
+) {
+ if (orientation === "up") {
+ return {
+ height:
+ tokenRect.top +
+ tokenRect.height -
+ coords.top -
+ previewRect.height +
+ gapHeight,
+ width: Math.max(previewRect.width, tokenRect.width) + offset,
+ };
+ }
+ if (orientation === "down") {
+ return {
+ height: coords.top - tokenRect.top + gapHeight,
+ width: Math.max(previewRect.width, tokenRect.width) + offset,
+ };
+ }
+ return {
+ height: previewRect.height - gapHeight,
+ width: coords.left - tokenRect.left + gapHeight,
+ };
+}
+
+export default function SmartGap({
+ token,
+ preview,
+ type,
+ gapHeight,
+ coords,
+ offset,
+}) {
+ const tokenRect = token.getBoundingClientRect();
+ const previewRect = preview.getBoundingClientRect();
+ const { orientation } = coords;
+ let optionalMarginLeft, optionalMarginTop;
+
+ if (orientation === "down") {
+ optionalMarginTop = -tokenRect.height;
+ } else if (orientation === "right") {
+ optionalMarginLeft = -tokenRect.width;
+ }
+
+ const { height, width } = getSmartGapDimensions(
+ previewRect,
+ tokenRect,
+ -offset,
+ orientation,
+ gapHeight,
+ coords
+ );
+ const coordinates = getSmartGapCoordinates(
+ previewRect,
+ tokenRect,
+ -offset,
+ orientation,
+ gapHeight,
+ coords
+ );
+ return svg(
+ {
+ version: "1.1",
+ xmlns: "http://www.w3.org/2000/svg",
+ style: {
+ height,
+ width,
+ position: "absolute",
+ marginLeft: optionalMarginLeft,
+ marginTop: optionalMarginTop,
+ },
+ },
+ polygon({
+ points: coordinates,
+ fill: "transparent",
+ })
+ );
+}
+
+SmartGap.propTypes = {
+ coords: PropTypes.object.isRequired,
+ gapHeight: PropTypes.number.isRequired,
+ offset: PropTypes.number.isRequired,
+ preview: PropTypes.object.isRequired,
+ token: PropTypes.object.isRequired,
+ type: PropTypes.oneOf(["popover", "tooltip"]).isRequired,
+};
diff --git a/devtools/client/debugger/src/components/shared/SourceIcon.css b/devtools/client/debugger/src/components/shared/SourceIcon.css
new file mode 100644
index 0000000000..0b9bf3e79e
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/SourceIcon.css
@@ -0,0 +1,176 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Variant of AccessibleImage used in sources list and tabs.
+ * Define the different source type / framework / library icons here.
+ */
+
+.source-icon {
+ margin-inline-end: 4px;
+}
+
+/* Icons for frameworks and libs */
+
+.img.aframe {
+ background-image: url(chrome://devtools/content/debugger/images/sources/aframe.svg);
+ background-color: transparent !important;
+}
+
+.img.angular {
+ background-image: url(chrome://devtools/content/debugger/images/sources/angular.svg);
+ background-color: transparent !important;
+}
+
+.img.babel {
+ mask-image: url(chrome://devtools/content/debugger/images/sources/babel.svg);
+}
+
+.img.backbone {
+ mask-image: url(chrome://devtools/content/debugger/images/sources/backbone.svg);
+}
+
+.img.choo {
+ background-image: url(chrome://devtools/content/debugger/images/sources/choo.svg);
+ background-color: transparent !important;
+}
+
+.img.coffeescript {
+ background-image: url(chrome://devtools/content/debugger/images/sources/coffeescript.svg);
+ background-color: transparent !important;
+ fill: var(--theme-icon-color);
+ -moz-context-properties: fill;
+}
+
+.img.dojo {
+ background-image: url(chrome://devtools/content/debugger/images/sources/dojo.svg);
+ background-color: transparent !important;
+}
+
+.img.ember {
+ background-image: url(chrome://devtools/content/debugger/images/sources/ember.svg);
+ background-color: transparent !important;
+}
+
+.img.express {
+ mask-image: url(chrome://devtools/content/debugger/images/sources/express.svg);
+}
+
+.img.extension {
+ mask-image: url(chrome://devtools/content/debugger/images/sources/extension.svg);
+}
+
+.img.immutable {
+ mask-image: url(chrome://devtools/content/debugger/images/sources/immutable.svg);
+}
+
+.img.javascript {
+ background-image: url(chrome://devtools/content/debugger/images/sources/javascript.svg);
+ background-size: 14px 14px;
+ background-color: transparent !important;
+ fill: var(--theme-icon-color);
+ -moz-context-properties: fill;
+}
+
+.img.override::after {
+ content: "";
+ display: block;
+ height: 5px;
+ width: 5px;
+ background-color: var(--purple-30);
+ border-radius: 100%;
+ outline: 1px solid var(--theme-sidebar-background);
+ translate: 12px 10px;
+}
+
+.node.focused .img.override::after {
+ outline-color: var(--theme-selection-background);
+}
+
+.img.jquery {
+ mask-image: url(chrome://devtools/content/debugger/images/sources/jquery.svg);
+}
+
+.img.lodash {
+ mask-image: url(chrome://devtools/content/debugger/images/sources/lodash.svg);
+}
+
+.img.marko {
+ background-image: url(chrome://devtools/content/debugger/images/sources/marko.svg);
+ background-color: transparent !important;
+}
+
+.img.mobx {
+ background-image: url(chrome://devtools/content/debugger/images/sources/mobx.svg);
+ background-color: transparent !important;
+}
+
+.img.nextjs {
+ background-image: url(chrome://devtools/content/debugger/images/sources/nextjs.svg);
+ background-color: transparent !important;
+}
+
+.img.node {
+ background-image: url(chrome://devtools/content/debugger/images/sources/node.svg);
+ background-color: transparent !important;
+}
+
+.img.nuxtjs {
+ background-image: url(chrome://devtools/content/debugger/images/sources/nuxtjs.svg);
+ background-color: transparent !important;
+}
+
+.img.preact {
+ background-image: url(chrome://devtools/content/debugger/images/sources/preact.svg);
+ background-color: transparent !important;
+}
+
+.img.pug {
+ background-image: url(chrome://devtools/content/debugger/images/sources/pug.svg);
+ background-color: transparent !important;
+}
+
+.img.react {
+ background-image: url(chrome://devtools/content/debugger/images/sources/react.svg);
+ background-color: transparent !important;
+ fill: var(--theme-highlight-bluegrey);
+ -moz-context-properties: fill;
+}
+
+.img.redux {
+ mask-image: url(chrome://devtools/content/debugger/images/sources/redux.svg);
+}
+
+.img.rxjs {
+ background-image: url(chrome://devtools/content/debugger/images/sources/rxjs.svg);
+ background-color: transparent !important;
+}
+
+.img.sencha-extjs {
+ background-image: url(chrome://devtools/content/debugger/images/sources/sencha-extjs.svg);
+ background-color: transparent !important;
+}
+
+.img.typescript {
+ background-image: url(chrome://devtools/content/debugger/images/sources/typescript.svg);
+ background-color: transparent !important;
+ fill: var(--theme-icon-color);
+ -moz-context-properties: fill;
+}
+
+.img.underscore {
+ mask-image: url(chrome://devtools/content/debugger/images/sources/underscore.svg);
+}
+
+/* We use both 'Vue' and 'VueJS' when identifying frameworks */
+.img.vue,
+.img.vuejs {
+ background-image: url(chrome://devtools/content/debugger/images/sources/vuejs.svg);
+ background-color: transparent !important;
+}
+
+.img.webpack {
+ background-image: url(chrome://devtools/content/debugger/images/sources/webpack.svg);
+ background-color: transparent !important;
+}
diff --git a/devtools/client/debugger/src/components/shared/SourceIcon.js b/devtools/client/debugger/src/components/shared/SourceIcon.js
new file mode 100644
index 0000000000..b2a7486bd6
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/SourceIcon.js
@@ -0,0 +1,71 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React, { PureComponent } from "devtools/client/shared/vendor/react";
+import PropTypes from "devtools/client/shared/vendor/react-prop-types";
+
+import { connect } from "devtools/client/shared/vendor/react-redux";
+
+import AccessibleImage from "./AccessibleImage";
+
+import { getSourceClassnames } from "../../utils/source";
+import {
+ getSymbols,
+ isSourceBlackBoxed,
+ hasPrettyTab,
+} from "../../selectors/index";
+
+class SourceIcon extends PureComponent {
+ static get propTypes() {
+ return {
+ modifier: PropTypes.func.isRequired,
+ location: PropTypes.object.isRequired,
+ iconClass: PropTypes.string,
+ forTab: PropTypes.bool,
+ };
+ }
+
+ render() {
+ const { modifier } = this.props;
+ let { iconClass } = this.props;
+
+ if (modifier) {
+ const modified = modifier(iconClass);
+ if (!modified) {
+ return null;
+ }
+ iconClass = modified;
+ }
+ return React.createElement(AccessibleImage, {
+ className: `source-icon ${iconClass}`,
+ });
+ }
+}
+
+export default connect((state, props) => {
+ const { forTab, location } = props;
+ // BreakpointHeading sometimes spawn locations without source actor for generated sources
+ // which disallows fetching symbols. In such race condition return the default icon.
+ // (this reproduces when running browser_dbg-breakpoints-popup.js)
+ if (!location.source.isOriginal && !location.sourceActor) {
+ return "file";
+ }
+ const symbols = getSymbols(state, location);
+ const isBlackBoxed = isSourceBlackBoxed(state, location.source);
+ // For the tab icon, we don't want to show the pretty icon for the non-pretty tab
+ const hasMatchingPrettyTab = !forTab && hasPrettyTab(state, location.source);
+
+ // This is the key function that will compute the icon type,
+ // In addition to the "modifier" implemented by each callsite.
+ const iconClass = getSourceClassnames(
+ location.source,
+ symbols,
+ isBlackBoxed,
+ hasMatchingPrettyTab
+ );
+
+ return {
+ iconClass,
+ };
+})(SourceIcon);
diff --git a/devtools/client/debugger/src/components/shared/menu.css b/devtools/client/debugger/src/components/shared/menu.css
new file mode 100644
index 0000000000..37dfbc2e8f
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/menu.css
@@ -0,0 +1,55 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+menupopup {
+ position: fixed;
+ z-index: 10000;
+ border: 1px solid #cccccc;
+ padding: 5px 0;
+ background: #f2f2f2;
+ border-radius: 5px;
+ color: #585858;
+ box-shadow: 0 0 4px 0 rgba(190, 190, 190, 0.8);
+ min-width: 130px;
+}
+
+menuitem {
+ display: block;
+ padding: 0 20px;
+ line-height: 20px;
+ font-weight: 500;
+ font-size: 13px;
+ user-select: none;
+}
+
+menuitem:hover {
+ background: #3780fb;
+ color: white;
+}
+
+menuitem[disabled="true"] {
+ color: #cccccc;
+}
+
+menuitem[disabled="true"]:hover {
+ background-color: transparent;
+ cursor: default;
+}
+
+menuseparator {
+ border-bottom: 1px solid #cacdd3;
+ width: 100%;
+ height: 5px;
+ display: block;
+ margin-bottom: 5px;
+}
+
+#contextmenu-mask.show {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ z-index: 999;
+}
diff --git a/devtools/client/debugger/src/components/shared/moz.build b/devtools/client/debugger/src/components/shared/moz.build
new file mode 100644
index 0000000000..b30ea0ab4f
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/moz.build
@@ -0,0 +1,23 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DIRS += [
+ "Button",
+]
+
+CompiledModules(
+ "AccessibleImage.js",
+ "Accordion.js",
+ "Badge.js",
+ "BracketArrow.js",
+ "Dropdown.js",
+ "Modal.js",
+ "Popover.js",
+ "PreviewFunction.js",
+ "ResultList.js",
+ "SearchInput.js",
+ "SourceIcon.js",
+ "SmartGap.js",
+)
diff --git a/devtools/client/debugger/src/components/shared/tests/Accordion.spec.js b/devtools/client/debugger/src/components/shared/tests/Accordion.spec.js
new file mode 100644
index 0000000000..cbe5ab12bf
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/tests/Accordion.spec.js
@@ -0,0 +1,47 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React from "devtools/client/shared/vendor/react";
+import { shallow } from "enzyme";
+
+import Accordion from "../Accordion";
+
+describe("Accordion", () => {
+ const testItems = [
+ {
+ header: "Test Accordion Item 1",
+ id: "accordion-item-1",
+ className: "accordion-item-1",
+ component: React.createElement("div", null),
+ opened: false,
+ onToggle: jest.fn(),
+ },
+ {
+ header: "Test Accordion Item 2",
+ id: "accordion-item-2",
+ className: "accordion-item-2",
+ component: React.createElement("div", null),
+ buttons: React.createElement("button", null),
+ opened: false,
+ onToggle: jest.fn(),
+ },
+ {
+ header: "Test Accordion Item 3",
+ id: "accordion-item-3",
+ className: "accordion-item-3",
+ component: React.createElement("div", null),
+ opened: true,
+ onToggle: jest.fn(),
+ },
+ ];
+ const wrapper = shallow(
+ React.createElement(Accordion, {
+ items: testItems,
+ })
+ );
+ it("basic render", () => expect(wrapper).toMatchSnapshot());
+ wrapper.find(".accordion-item-1 button").simulate("click");
+ it("handleClick and onToggle", () =>
+ expect(testItems[0].onToggle).toHaveBeenCalledWith(true));
+});
diff --git a/devtools/client/debugger/src/components/shared/tests/Badge.spec.js b/devtools/client/debugger/src/components/shared/tests/Badge.spec.js
new file mode 100644
index 0000000000..a19b35a7c2
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/tests/Badge.spec.js
@@ -0,0 +1,19 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React from "devtools/client/shared/vendor/react";
+import { shallow } from "enzyme";
+
+import Badge from "../Badge";
+
+describe("Badge", () => {
+ it("render", () =>
+ expect(
+ shallow(
+ React.createElement(Badge, {
+ badgeText: 3,
+ })
+ )
+ ).toMatchSnapshot());
+});
diff --git a/devtools/client/debugger/src/components/shared/tests/BracketArrow.spec.js b/devtools/client/debugger/src/components/shared/tests/BracketArrow.spec.js
new file mode 100644
index 0000000000..4ce9a5b5ce
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/tests/BracketArrow.spec.js
@@ -0,0 +1,24 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React from "devtools/client/shared/vendor/react";
+import { shallow } from "enzyme";
+
+import BracketArrow from "../BracketArrow";
+
+describe("BracketArrow", () => {
+ const wrapper = shallow(
+ React.createElement(BracketArrow, {
+ orientation: "down",
+ left: 10,
+ top: 20,
+ bottom: 50,
+ })
+ );
+ it("render", () => expect(wrapper).toMatchSnapshot());
+ it("render up", () => {
+ wrapper.setProps({ orientation: null });
+ expect(wrapper).toMatchSnapshot();
+ });
+});
diff --git a/devtools/client/debugger/src/components/shared/tests/Dropdown.spec.js b/devtools/client/debugger/src/components/shared/tests/Dropdown.spec.js
new file mode 100644
index 0000000000..9b001ba9e5
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/tests/Dropdown.spec.js
@@ -0,0 +1,21 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React from "devtools/client/shared/vendor/react";
+import { shallow } from "enzyme";
+
+import Dropdown from "../Dropdown";
+
+describe("Dropdown", () => {
+ const wrapper = shallow(
+ React.createElement(Dropdown, {
+ panel: React.createElement("div", null),
+ icon: "✅",
+ })
+ );
+ it("render", () => expect(wrapper).toMatchSnapshot());
+ wrapper.find(".dropdown").simulate("click");
+ it("handle toggleDropdown", () =>
+ expect(wrapper.state().dropdownShown).toEqual(true));
+});
diff --git a/devtools/client/debugger/src/components/shared/tests/Modal.spec.js b/devtools/client/debugger/src/components/shared/tests/Modal.spec.js
new file mode 100644
index 0000000000..58c38502e7
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/tests/Modal.spec.js
@@ -0,0 +1,56 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React from "devtools/client/shared/vendor/react";
+import { shallow } from "enzyme";
+
+import Modal from "../Modal";
+
+describe("Modal", () => {
+ it("renders", () => {
+ const wrapper = shallow(
+ React.createElement(Modal, {
+ handleClose: () => {},
+ })
+ );
+ expect(wrapper).toMatchSnapshot();
+ });
+
+ it("handles close modal click", () => {
+ const handleCloseSpy = jest.fn();
+ const wrapper = shallow(
+ React.createElement(Modal, {
+ handleClose: handleCloseSpy,
+ })
+ );
+ wrapper.find(".modal-wrapper").simulate("click");
+ expect(handleCloseSpy).toHaveBeenCalled();
+ });
+
+ it("renders children", () => {
+ const wrapper = shallow(
+ React.createElement(
+ Modal,
+ {
+ handleClose: () => {},
+ },
+ React.createElement("div", {
+ className: "aChild",
+ })
+ )
+ );
+ expect(wrapper.find(".aChild")).toHaveLength(1);
+ });
+
+ it("passes additionalClass to child div class", () => {
+ const additionalClass = "testAddon";
+ const wrapper = shallow(
+ React.createElement(Modal, {
+ additionalClass,
+ handleClose: () => {},
+ })
+ );
+ expect(wrapper.find(`.modal-wrapper .${additionalClass}`)).toHaveLength(1);
+ });
+});
diff --git a/devtools/client/debugger/src/components/shared/tests/Popover.spec.js b/devtools/client/debugger/src/components/shared/tests/Popover.spec.js
new file mode 100644
index 0000000000..7150f4afe8
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/tests/Popover.spec.js
@@ -0,0 +1,212 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React from "devtools/client/shared/vendor/react";
+import { mount } from "enzyme";
+
+import Popover from "../Popover";
+
+describe("Popover", () => {
+ const onMouseLeave = jest.fn();
+ const onKeyDown = jest.fn();
+ const editorRef = {
+ getBoundingClientRect() {
+ return {
+ x: 0,
+ y: 0,
+ width: 100,
+ height: 100,
+ top: 250,
+ right: 0,
+ bottom: 0,
+ left: 20,
+ };
+ },
+ };
+
+ const targetRef = {
+ getBoundingClientRect() {
+ return {
+ x: 0,
+ y: 0,
+ width: 100,
+ height: 100,
+ top: 250,
+ right: 0,
+ bottom: 0,
+ left: 20,
+ };
+ },
+ };
+ const targetPosition = {
+ x: 100,
+ y: 200,
+ width: 300,
+ height: 300,
+ top: 50,
+ right: 0,
+ bottom: 0,
+ left: 200,
+ };
+ const popover = mount(
+ React.createElement(
+ Popover,
+ {
+ onMouseLeave: onMouseLeave,
+ onKeyDown: onKeyDown,
+ editorRef: editorRef,
+ targetPosition: targetPosition,
+ mouseout: () => {},
+ target: targetRef,
+ },
+ React.createElement("h1", null, "Poppy!")
+ )
+ );
+
+ const tooltip = mount(
+ React.createElement(
+ Popover,
+ {
+ type: "tooltip",
+ onMouseLeave: onMouseLeave,
+ onKeyDown: onKeyDown,
+ editorRef: editorRef,
+ targetPosition: targetPosition,
+ mouseout: () => {},
+ target: targetRef,
+ },
+ React.createElement("h1", null, "Toolie!")
+ )
+ );
+
+ beforeEach(() => {
+ onMouseLeave.mockClear();
+ onKeyDown.mockClear();
+ });
+
+ it("render", () => expect(popover).toMatchSnapshot());
+
+ it("render (tooltip)", () => expect(tooltip).toMatchSnapshot());
+
+ it("mount popover", () => {
+ const mountedPopover = mount(
+ React.createElement(
+ Popover,
+ {
+ onMouseLeave: onMouseLeave,
+ onKeyDown: onKeyDown,
+ editorRef: editorRef,
+ targetPosition: targetPosition,
+ mouseout: () => {},
+ target: targetRef,
+ },
+ React.createElement("h1", null, "Poppy!")
+ )
+ );
+ expect(mountedPopover).toMatchSnapshot();
+ });
+
+ it("mount tooltip", () => {
+ const mountedTooltip = mount(
+ React.createElement(
+ Popover,
+ {
+ type: "tooltip",
+ onMouseLeave: onMouseLeave,
+ onKeyDown: onKeyDown,
+ editorRef: editorRef,
+ targetPosition: targetPosition,
+ mouseout: () => {},
+ target: targetRef,
+ },
+ React.createElement("h1", null, "Toolie!")
+ )
+ );
+ expect(mountedTooltip).toMatchSnapshot();
+ });
+
+ it("tooltip normally displays above the target", () => {
+ const editor = {
+ getBoundingClientRect() {
+ return {
+ width: 500,
+ height: 500,
+ top: 0,
+ bottom: 500,
+ left: 0,
+ right: 500,
+ };
+ },
+ };
+ const target = {
+ width: 30,
+ height: 10,
+ top: 100,
+ bottom: 110,
+ left: 20,
+ right: 50,
+ };
+
+ const mountedTooltip = mount(
+ React.createElement(
+ Popover,
+ {
+ type: "tooltip",
+ onMouseLeave: onMouseLeave,
+ onKeyDown: onKeyDown,
+ editorRef: editor,
+ targetPosition: target,
+ mouseout: () => {},
+ target: targetRef,
+ },
+ React.createElement("h1", null, "Toolie!")
+ )
+ );
+
+ const toolTipTop = parseInt(mountedTooltip.getDOMNode().style.top, 10);
+ expect(toolTipTop).toBeLessThanOrEqual(target.top);
+ });
+
+ it("tooltop won't display above the target when insufficient space", () => {
+ const editor = {
+ getBoundingClientRect() {
+ return {
+ width: 100,
+ height: 100,
+ top: 0,
+ bottom: 100,
+ left: 0,
+ right: 100,
+ };
+ },
+ };
+ const target = {
+ width: 30,
+ height: 10,
+ top: 0,
+ bottom: 10,
+ left: 20,
+ right: 50,
+ };
+
+ const mountedTooltip = mount(
+ React.createElement(
+ Popover,
+ {
+ type: "tooltip",
+ onMouseLeave: onMouseLeave,
+ onKeyDown: onKeyDown,
+ editorRef: editor,
+ targetPosition: target,
+ mouseout: () => {},
+ target: targetRef,
+ },
+ React.createElement("h1", null, "Toolie!")
+ )
+ );
+
+ const toolTipTop = parseInt(mountedTooltip.getDOMNode().style.top, 10);
+ expect(toolTipTop).toBeGreaterThanOrEqual(target.bottom);
+ });
+});
diff --git a/devtools/client/debugger/src/components/shared/tests/PreviewFunction.spec.js b/devtools/client/debugger/src/components/shared/tests/PreviewFunction.spec.js
new file mode 100644
index 0000000000..62f635acc1
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/tests/PreviewFunction.spec.js
@@ -0,0 +1,130 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React from "devtools/client/shared/vendor/react";
+import { shallow } from "enzyme";
+import PreviewFunction from "../PreviewFunction";
+
+function render(props) {
+ return shallow(React.createElement(PreviewFunction, props), {
+ context: {
+ l10n: L10N,
+ },
+ });
+}
+
+describe("PreviewFunction", () => {
+ it("should return a span", () => {
+ const item = { name: "" };
+ const returnedSpan = render({ func: item });
+ expect(returnedSpan).toMatchSnapshot();
+ expect(returnedSpan.name()).toEqual("span");
+ });
+
+ it('should return a span with a class of "function-signature"', () => {
+ const item = { name: "" };
+ const returnedSpan = render({ func: item });
+ expect(returnedSpan.hasClass("function-signature")).toBe(true);
+ });
+
+ it("should return a span with 3 children", () => {
+ const item = { name: "" };
+ const returnedSpan = render({ func: item });
+ expect(returnedSpan.children()).toHaveLength(3);
+ });
+
+ describe("function name", () => {
+ it("should be a span", () => {
+ const item = { name: "" };
+ const returnedSpan = render({ func: item });
+ expect(returnedSpan.children().first().name()).toEqual("span");
+ });
+
+ it('should have a "function-name" class', () => {
+ const item = { name: "" };
+ const returnedSpan = render({ func: item });
+ expect(returnedSpan.children().first().hasClass("function-name")).toBe(
+ true
+ );
+ });
+
+ it("should be be set to userDisplayName if defined", () => {
+ const item = {
+ name: "",
+ displayName: "chuck",
+ };
+ const returnedSpan = render({ func: item });
+ expect(returnedSpan.children().first().first().text()).toEqual("chuck");
+ });
+
+ it('should use displayName if defined & no "userDisplayName" exist', () => {
+ const item = {
+ displayName: "norris",
+ name: "last",
+ };
+ const returnedSpan = render({ func: item });
+ expect(returnedSpan.children().first().first().text()).toEqual("norris");
+ });
+
+ it('should use to name if no "userDisplayName"/"displayName" exist', () => {
+ const item = {
+ name: "last",
+ };
+ const returnedSpan = render({ func: item });
+ expect(returnedSpan.children().first().first().text()).toEqual("last");
+ });
+ });
+
+ describe("render parentheses", () => {
+ let leftParen;
+ let rightParen;
+
+ beforeAll(() => {
+ const item = { name: "" };
+ const returnedSpan = render({ func: item });
+ const children = returnedSpan.children();
+ leftParen = returnedSpan.childAt(1);
+ rightParen = returnedSpan.childAt(children.length - 1);
+ });
+
+ it("should be spans", () => {
+ expect(leftParen.name()).toEqual("span");
+ expect(rightParen.name()).toEqual("span");
+ });
+
+ it("should create a left paren", () => {
+ expect(leftParen.text()).toEqual("(");
+ });
+
+ it("should create a right paren", () => {
+ expect(rightParen.text()).toEqual(")");
+ });
+ });
+
+ describe("render parameters", () => {
+ let returnedSpan;
+ let children;
+
+ beforeAll(() => {
+ const item = {
+ name: "",
+ parameterNames: ["one", "two", "three"],
+ };
+ returnedSpan = render({ func: item });
+ children = returnedSpan.children();
+ });
+
+ it("should render spans according to the dynamic params given", () => {
+ expect(children).toHaveLength(8);
+ });
+
+ it("should render the parameters names", () => {
+ expect(returnedSpan.childAt(2).text()).toEqual("one");
+ });
+
+ it("should render the parameters commas", () => {
+ expect(returnedSpan.childAt(3).text()).toEqual(", ");
+ });
+ });
+});
diff --git a/devtools/client/debugger/src/components/shared/tests/ResultList.spec.js b/devtools/client/debugger/src/components/shared/tests/ResultList.spec.js
new file mode 100644
index 0000000000..4cdc85fb23
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/tests/ResultList.spec.js
@@ -0,0 +1,48 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React from "devtools/client/shared/vendor/react";
+import { shallow } from "enzyme";
+import ResultList from "../ResultList";
+
+const selectItem = jest.fn();
+const selectedIndex = 1;
+const payload = {
+ items: [
+ {
+ id: 0,
+ subtitle: "subtitle",
+ title: "title",
+ value: "value",
+ },
+ {
+ id: 1,
+ subtitle: "subtitle 1",
+ title: "title 1",
+ value: "value 1",
+ },
+ ],
+ selected: selectedIndex,
+ selectItem,
+};
+
+describe("Result list", () => {
+ it("should call onClick function", () => {
+ const wrapper = shallow(React.createElement(ResultList, payload));
+ wrapper.childAt(selectedIndex).simulate("click");
+ expect(selectItem).toHaveBeenCalled();
+ });
+
+ it("should render the component", () => {
+ const wrapper = shallow(React.createElement(ResultList, payload));
+ expect(wrapper).toMatchSnapshot();
+ });
+
+ it("selected index should have 'selected class'", () => {
+ const wrapper = shallow(React.createElement(ResultList, payload));
+ const childHasClass = wrapper.childAt(selectedIndex).hasClass("selected");
+
+ expect(childHasClass).toEqual(true);
+ });
+});
diff --git a/devtools/client/debugger/src/components/shared/tests/SearchInput.spec.js b/devtools/client/debugger/src/components/shared/tests/SearchInput.spec.js
new file mode 100644
index 0000000000..c4c3990771
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/tests/SearchInput.spec.js
@@ -0,0 +1,126 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React from "devtools/client/shared/vendor/react";
+import { shallow } from "enzyme";
+import configureStore from "redux-mock-store";
+
+import SearchInput from "../SearchInput";
+
+describe("SearchInput", () => {
+ // !! wrapper is defined outside test scope
+ // so it will keep values between tests
+ const mockStore = configureStore([]);
+ const store = mockStore({
+ ui: { mutableSearchOptions: { "foo-search": {} } },
+ });
+ const wrapper = shallow(
+ React.createElement(SearchInput, {
+ store: store,
+ query: "",
+ count: 5,
+ placeholder: "A placeholder",
+ summaryMsg: "So many results",
+ showErrorEmoji: false,
+ isLoading: false,
+ onChange: () => {},
+ onKeyDown: () => {},
+ searchKey: "foo-search",
+ showSearchModifiers: false,
+ showExcludePatterns: false,
+ showClose: true,
+ handleClose: jest.fn(),
+ setSearchOptions: jest.fn(),
+ })
+ ).dive();
+
+ it("renders", () => expect(wrapper).toMatchSnapshot());
+
+ it("shows nav buttons", () => {
+ wrapper.setProps({
+ handleNext: jest.fn(),
+ handlePrev: jest.fn(),
+ });
+ expect(wrapper).toMatchSnapshot();
+ });
+
+ it("shows svg error emoji", () => {
+ wrapper.setProps({ showErrorEmoji: true });
+ expect(wrapper).toMatchSnapshot();
+ });
+
+ it("shows svg magnifying glass", () => {
+ wrapper.setProps({ showErrorEmoji: false });
+ expect(wrapper).toMatchSnapshot();
+ });
+
+ describe("with optional onHistoryScroll", () => {
+ const searches = ["foo", "bar", "baz"];
+ const createSearch = term => ({
+ target: { value: term },
+ key: "Enter",
+ });
+
+ const scrollUp = currentTerm => ({
+ key: "ArrowUp",
+ target: { value: currentTerm },
+ preventDefault: jest.fn(),
+ });
+ const scrollDown = currentTerm => ({
+ key: "ArrowDown",
+ target: { value: currentTerm },
+ preventDefault: jest.fn(),
+ });
+
+ it("stores entered history in state", () => {
+ wrapper.setProps({
+ onHistoryScroll: jest.fn(),
+ onKeyDown: jest.fn(),
+ });
+ wrapper.find("input").simulate("keyDown", createSearch(searches[0]));
+ expect(wrapper.state().history[0]).toEqual(searches[0]);
+ });
+
+ it("stores scroll history in state", () => {
+ const onHistoryScroll = jest.fn();
+ wrapper.setProps({
+ onHistoryScroll,
+ onKeyDown: jest.fn(),
+ });
+ wrapper.find("input").simulate("keyDown", createSearch(searches[0]));
+ wrapper.find("input").simulate("keyDown", createSearch(searches[1]));
+ expect(wrapper.state().history[0]).toEqual(searches[0]);
+ expect(wrapper.state().history[1]).toEqual(searches[1]);
+ });
+
+ it("scrolls up stored history on arrow up", () => {
+ const onHistoryScroll = jest.fn();
+ wrapper.setProps({
+ onHistoryScroll,
+ onKeyDown: jest.fn(),
+ });
+ wrapper.find("input").simulate("keyDown", createSearch(searches[0]));
+ wrapper.find("input").simulate("keyDown", createSearch(searches[1]));
+ wrapper.find("input").simulate("keyDown", scrollUp(searches[1]));
+ expect(wrapper.state().history[0]).toEqual(searches[0]);
+ expect(wrapper.state().history[1]).toEqual(searches[1]);
+ expect(onHistoryScroll).toHaveBeenCalledWith(searches[0]);
+ });
+
+ it("scrolls down stored history on arrow down", () => {
+ const onHistoryScroll = jest.fn();
+ wrapper.setProps({
+ onHistoryScroll,
+ onKeyDown: jest.fn(),
+ });
+ wrapper.find("input").simulate("keyDown", createSearch(searches[0]));
+ wrapper.find("input").simulate("keyDown", createSearch(searches[1]));
+ wrapper.find("input").simulate("keyDown", createSearch(searches[2]));
+ wrapper.find("input").simulate("keyDown", scrollUp(searches[2]));
+ wrapper.find("input").simulate("keyDown", scrollUp(searches[1]));
+ wrapper.find("input").simulate("keyDown", scrollDown(searches[0]));
+ expect(onHistoryScroll.mock.calls[2][0]).toBe(searches[1]);
+ });
+ });
+});
diff --git a/devtools/client/debugger/src/components/shared/tests/__snapshots__/Accordion.spec.js.snap b/devtools/client/debugger/src/components/shared/tests/__snapshots__/Accordion.spec.js.snap
new file mode 100644
index 0000000000..abd8f10f51
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/tests/__snapshots__/Accordion.spec.js.snap
@@ -0,0 +1,81 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`Accordion basic render 1`] = `
+<div
+ className="accordion"
+>
+ <aside
+ aria-labelledby="accordion-item-1"
+ className="accordion-item-1"
+ key="accordion-item-1"
+ >
+ <h2
+ className="_header"
+ >
+ <button
+ aria-controls="accordion-item-1-content"
+ aria-expanded="true"
+ className="header-label"
+ id="accordion-item-1"
+ onClick={[Function]}
+ >
+ Test Accordion Item 1
+ </button>
+ </h2>
+ <div
+ className="_content"
+ id="accordion-item-1-content"
+ >
+ <div />
+ </div>
+ </aside>
+ <aside
+ aria-labelledby="accordion-item-2"
+ className="accordion-item-2"
+ key="accordion-item-2"
+ >
+ <h2
+ className="_header"
+ >
+ <button
+ aria-expanded="false"
+ className="header-label"
+ id="accordion-item-2"
+ onClick={[Function]}
+ >
+ Test Accordion Item 2
+ </button>
+ <div
+ className="header-buttons"
+ >
+ <button />
+ </div>
+ </h2>
+ </aside>
+ <aside
+ aria-labelledby="accordion-item-3"
+ className="accordion-item-3"
+ key="accordion-item-3"
+ >
+ <h2
+ className="_header"
+ >
+ <button
+ aria-controls="accordion-item-3-content"
+ aria-expanded="true"
+ className="header-label"
+ id="accordion-item-3"
+ onClick={[Function]}
+ >
+ Test Accordion Item 3
+ </button>
+ </h2>
+ <div
+ className="_content"
+ id="accordion-item-3-content"
+ >
+ <div />
+ </div>
+ </aside>
+</div>
+`;
diff --git a/devtools/client/debugger/src/components/shared/tests/__snapshots__/Badge.spec.js.snap b/devtools/client/debugger/src/components/shared/tests/__snapshots__/Badge.spec.js.snap
new file mode 100644
index 0000000000..cbeeeaa3f2
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/tests/__snapshots__/Badge.spec.js.snap
@@ -0,0 +1,9 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`Badge render 1`] = `
+<span
+ className="badge text-white text-center"
+>
+ 3
+</span>
+`;
diff --git a/devtools/client/debugger/src/components/shared/tests/__snapshots__/BracketArrow.spec.js.snap b/devtools/client/debugger/src/components/shared/tests/__snapshots__/BracketArrow.spec.js.snap
new file mode 100644
index 0000000000..5078cebc9e
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/tests/__snapshots__/BracketArrow.spec.js.snap
@@ -0,0 +1,27 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`BracketArrow render 1`] = `
+<div
+ className="bracket-arrow down"
+ style={
+ Object {
+ "bottom": 50,
+ "left": 10,
+ "top": 20,
+ }
+ }
+/>
+`;
+
+exports[`BracketArrow render up 1`] = `
+<div
+ className="bracket-arrow up"
+ style={
+ Object {
+ "bottom": 50,
+ "left": 10,
+ "top": 20,
+ }
+ }
+/>
+`;
diff --git a/devtools/client/debugger/src/components/shared/tests/__snapshots__/Dropdown.spec.js.snap b/devtools/client/debugger/src/components/shared/tests/__snapshots__/Dropdown.spec.js.snap
new file mode 100644
index 0000000000..fd60784327
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/tests/__snapshots__/Dropdown.spec.js.snap
@@ -0,0 +1,34 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`Dropdown render 1`] = `
+<div
+ className="dropdown-block"
+>
+ <div
+ className="dropdown"
+ onClick={[Function]}
+ style={
+ Object {
+ "display": "block",
+ }
+ }
+ >
+ <div />
+ </div>
+ <button
+ className="dropdown-button"
+ onClick={[Function]}
+ >
+ ✅
+ </button>
+ <div
+ className="dropdown-mask"
+ onClick={[Function]}
+ style={
+ Object {
+ "display": "block",
+ }
+ }
+ />
+</div>
+`;
diff --git a/devtools/client/debugger/src/components/shared/tests/__snapshots__/Modal.spec.js.snap b/devtools/client/debugger/src/components/shared/tests/__snapshots__/Modal.spec.js.snap
new file mode 100644
index 0000000000..c8534c4032
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/tests/__snapshots__/Modal.spec.js.snap
@@ -0,0 +1,13 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`Modal renders 1`] = `
+<div
+ className="modal-wrapper"
+ onClick={[Function]}
+>
+ <div
+ className="modal"
+ onClick={[Function]}
+ />
+</div>
+`;
diff --git a/devtools/client/debugger/src/components/shared/tests/__snapshots__/Popover.spec.js.snap b/devtools/client/debugger/src/components/shared/tests/__snapshots__/Popover.spec.js.snap
new file mode 100644
index 0000000000..1c3589a6f8
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/tests/__snapshots__/Popover.spec.js.snap
@@ -0,0 +1,549 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`Popover mount popover 1`] = `
+<Popover
+ editorRef={
+ Object {
+ "getBoundingClientRect": [Function],
+ }
+ }
+ mouseout={[Function]}
+ onKeyDown={[MockFunction]}
+ onMouseLeave={[MockFunction]}
+ target={
+ Object {
+ "getBoundingClientRect": [Function],
+ }
+ }
+ targetPosition={
+ Object {
+ "bottom": 0,
+ "height": 300,
+ "left": 200,
+ "right": 0,
+ "top": 50,
+ "width": 300,
+ "x": 100,
+ "y": 200,
+ }
+ }
+ type="popover"
+>
+ <div
+ className="popover orientation-right"
+ style={
+ Object {
+ "left": 500,
+ "top": -50,
+ }
+ }
+ >
+ <BracketArrow
+ left={-4}
+ orientation="left"
+ top={98}
+ >
+ <div
+ className="bracket-arrow left"
+ style={
+ Object {
+ "bottom": undefined,
+ "left": -4,
+ "top": 98,
+ }
+ }
+ />
+ </BracketArrow>
+ <div
+ className="gap"
+ key="gap"
+ >
+ <SmartGap
+ coords={
+ Object {
+ "left": 500,
+ "orientation": "right",
+ "targetMid": Object {
+ "x": -14,
+ "y": 98,
+ },
+ "top": -50,
+ }
+ }
+ gapHeight={0}
+ offset={0}
+ preview={
+ <div
+ class="popover orientation-right"
+ style="top: -50px; left: 500px;"
+ >
+ <div
+ class="bracket-arrow left"
+ style="left: -4px; top: 98px;"
+ />
+ <div
+ class="gap"
+ >
+ <svg
+ style="height: 0px; width: 480px; position: absolute; margin-left: -100px;"
+ version="1.1"
+ xmlns="http://www.w3.org/2000/svg"
+ >
+ <polygon
+ fill="transparent"
+ points="0,300,100,0,100,0,0,400,100,400,100,300"
+ />
+ </svg>
+ </div>
+ <h1>
+ Poppy!
+ </h1>
+ </div>
+ }
+ token={
+ Object {
+ "getBoundingClientRect": [Function],
+ }
+ }
+ type="popover"
+ >
+ <svg
+ style={
+ Object {
+ "height": 0,
+ "marginLeft": -100,
+ "marginTop": undefined,
+ "position": "absolute",
+ "width": 480,
+ }
+ }
+ version="1.1"
+ xmlns="http://www.w3.org/2000/svg"
+ >
+ <polygon
+ fill="transparent"
+ points={
+ Array [
+ 0,
+ 300,
+ 100,
+ 0,
+ 100,
+ 0,
+ 0,
+ 400,
+ 100,
+ 400,
+ 100,
+ 300,
+ ]
+ }
+ />
+ </svg>
+ </SmartGap>
+ </div>
+ <h1>
+ Poppy!
+ </h1>
+ </div>
+</Popover>
+`;
+
+exports[`Popover mount tooltip 1`] = `
+<Popover
+ editorRef={
+ Object {
+ "getBoundingClientRect": [Function],
+ }
+ }
+ mouseout={[Function]}
+ onKeyDown={[MockFunction]}
+ onMouseLeave={[MockFunction]}
+ target={
+ Object {
+ "getBoundingClientRect": [Function],
+ }
+ }
+ targetPosition={
+ Object {
+ "bottom": 0,
+ "height": 300,
+ "left": 200,
+ "right": 0,
+ "top": 50,
+ "width": 300,
+ "x": 100,
+ "y": 200,
+ }
+ }
+ type="tooltip"
+>
+ <div
+ className="tooltip orientation-down"
+ style={
+ Object {
+ "left": -8,
+ "top": 0,
+ }
+ }
+ >
+ <div
+ className="gap"
+ key="gap"
+ >
+ <SmartGap
+ coords={
+ Object {
+ "left": -8,
+ "orientation": "down",
+ "targetMid": Object {
+ "x": 0,
+ "y": 0,
+ },
+ "top": 0,
+ }
+ }
+ gapHeight={0}
+ offset={0}
+ preview={
+ <div
+ class="tooltip orientation-down"
+ style="top: 0px; left: -8px;"
+ >
+ <div
+ class="gap"
+ >
+ <svg
+ style="height: -250px; width: 100px; position: absolute; margin-top: -100px;"
+ version="1.1"
+ xmlns="http://www.w3.org/2000/svg"
+ >
+ <polygon
+ fill="transparent"
+ points="0,-250,0,-250,28,100,128,100"
+ />
+ </svg>
+ </div>
+ <h1>
+ Toolie!
+ </h1>
+ </div>
+ }
+ token={
+ Object {
+ "getBoundingClientRect": [Function],
+ }
+ }
+ type="tooltip"
+ >
+ <svg
+ style={
+ Object {
+ "height": -250,
+ "marginLeft": undefined,
+ "marginTop": -100,
+ "position": "absolute",
+ "width": 100,
+ }
+ }
+ version="1.1"
+ xmlns="http://www.w3.org/2000/svg"
+ >
+ <polygon
+ fill="transparent"
+ points={
+ Array [
+ 0,
+ -250,
+ 0,
+ -250,
+ 28,
+ 100,
+ 128,
+ 100,
+ ]
+ }
+ />
+ </svg>
+ </SmartGap>
+ </div>
+ <h1>
+ Toolie!
+ </h1>
+ </div>
+</Popover>
+`;
+
+exports[`Popover render (tooltip) 1`] = `
+<Popover
+ editorRef={
+ Object {
+ "getBoundingClientRect": [Function],
+ }
+ }
+ mouseout={[Function]}
+ onKeyDown={[MockFunction]}
+ onMouseLeave={[MockFunction]}
+ target={
+ Object {
+ "getBoundingClientRect": [Function],
+ }
+ }
+ targetPosition={
+ Object {
+ "bottom": 0,
+ "height": 300,
+ "left": 200,
+ "right": 0,
+ "top": 50,
+ "width": 300,
+ "x": 100,
+ "y": 200,
+ }
+ }
+ type="tooltip"
+>
+ <div
+ className="tooltip orientation-down"
+ style={
+ Object {
+ "left": -8,
+ "top": 0,
+ }
+ }
+ >
+ <div
+ className="gap"
+ key="gap"
+ >
+ <SmartGap
+ coords={
+ Object {
+ "left": -8,
+ "orientation": "down",
+ "targetMid": Object {
+ "x": 0,
+ "y": 0,
+ },
+ "top": 0,
+ }
+ }
+ gapHeight={0}
+ offset={0}
+ preview={
+ <div
+ class="tooltip orientation-down"
+ style="top: 0px; left: -8px;"
+ >
+ <div
+ class="gap"
+ >
+ <svg
+ style="height: -250px; width: 100px; position: absolute; margin-top: -100px;"
+ version="1.1"
+ xmlns="http://www.w3.org/2000/svg"
+ >
+ <polygon
+ fill="transparent"
+ points="0,-250,0,-250,28,100,128,100"
+ />
+ </svg>
+ </div>
+ <h1>
+ Toolie!
+ </h1>
+ </div>
+ }
+ token={
+ Object {
+ "getBoundingClientRect": [Function],
+ }
+ }
+ type="tooltip"
+ >
+ <svg
+ style={
+ Object {
+ "height": -250,
+ "marginLeft": undefined,
+ "marginTop": -100,
+ "position": "absolute",
+ "width": 100,
+ }
+ }
+ version="1.1"
+ xmlns="http://www.w3.org/2000/svg"
+ >
+ <polygon
+ fill="transparent"
+ points={
+ Array [
+ 0,
+ -250,
+ 0,
+ -250,
+ 28,
+ 100,
+ 128,
+ 100,
+ ]
+ }
+ />
+ </svg>
+ </SmartGap>
+ </div>
+ <h1>
+ Toolie!
+ </h1>
+ </div>
+</Popover>
+`;
+
+exports[`Popover render 1`] = `
+<Popover
+ editorRef={
+ Object {
+ "getBoundingClientRect": [Function],
+ }
+ }
+ mouseout={[Function]}
+ onKeyDown={[MockFunction]}
+ onMouseLeave={[MockFunction]}
+ target={
+ Object {
+ "getBoundingClientRect": [Function],
+ }
+ }
+ targetPosition={
+ Object {
+ "bottom": 0,
+ "height": 300,
+ "left": 200,
+ "right": 0,
+ "top": 50,
+ "width": 300,
+ "x": 100,
+ "y": 200,
+ }
+ }
+ type="popover"
+>
+ <div
+ className="popover orientation-right"
+ style={
+ Object {
+ "left": 500,
+ "top": -50,
+ }
+ }
+ >
+ <BracketArrow
+ left={-4}
+ orientation="left"
+ top={98}
+ >
+ <div
+ className="bracket-arrow left"
+ style={
+ Object {
+ "bottom": undefined,
+ "left": -4,
+ "top": 98,
+ }
+ }
+ />
+ </BracketArrow>
+ <div
+ className="gap"
+ key="gap"
+ >
+ <SmartGap
+ coords={
+ Object {
+ "left": 500,
+ "orientation": "right",
+ "targetMid": Object {
+ "x": -14,
+ "y": 98,
+ },
+ "top": -50,
+ }
+ }
+ gapHeight={0}
+ offset={0}
+ preview={
+ <div
+ class="popover orientation-right"
+ style="top: -50px; left: 500px;"
+ >
+ <div
+ class="bracket-arrow left"
+ style="left: -4px; top: 98px;"
+ />
+ <div
+ class="gap"
+ >
+ <svg
+ style="height: 0px; width: 480px; position: absolute; margin-left: -100px;"
+ version="1.1"
+ xmlns="http://www.w3.org/2000/svg"
+ >
+ <polygon
+ fill="transparent"
+ points="0,300,100,0,100,0,0,400,100,400,100,300"
+ />
+ </svg>
+ </div>
+ <h1>
+ Poppy!
+ </h1>
+ </div>
+ }
+ token={
+ Object {
+ "getBoundingClientRect": [Function],
+ }
+ }
+ type="popover"
+ >
+ <svg
+ style={
+ Object {
+ "height": 0,
+ "marginLeft": -100,
+ "marginTop": undefined,
+ "position": "absolute",
+ "width": 480,
+ }
+ }
+ version="1.1"
+ xmlns="http://www.w3.org/2000/svg"
+ >
+ <polygon
+ fill="transparent"
+ points={
+ Array [
+ 0,
+ 300,
+ 100,
+ 0,
+ 100,
+ 0,
+ 0,
+ 400,
+ 100,
+ 400,
+ 100,
+ 300,
+ ]
+ }
+ />
+ </svg>
+ </SmartGap>
+ </div>
+ <h1>
+ Poppy!
+ </h1>
+ </div>
+</Popover>
+`;
diff --git a/devtools/client/debugger/src/components/shared/tests/__snapshots__/PreviewFunction.spec.js.snap b/devtools/client/debugger/src/components/shared/tests/__snapshots__/PreviewFunction.spec.js.snap
new file mode 100644
index 0000000000..e766bd45aa
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/tests/__snapshots__/PreviewFunction.spec.js.snap
@@ -0,0 +1,23 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`PreviewFunction should return a span 1`] = `
+<span
+ className="function-signature"
+>
+ <span
+ className="function-name"
+ >
+ &lt;anonymous&gt;
+ </span>
+ <span
+ className="paren"
+ >
+ (
+ </span>
+ <span
+ className="paren"
+ >
+ )
+ </span>
+</span>
+`;
diff --git a/devtools/client/debugger/src/components/shared/tests/__snapshots__/ResultList.spec.js.snap b/devtools/client/debugger/src/components/shared/tests/__snapshots__/ResultList.spec.js.snap
new file mode 100644
index 0000000000..d3d8b27575
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/tests/__snapshots__/ResultList.spec.js.snap
@@ -0,0 +1,55 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`Result list should render the component 1`] = `
+<ul
+ aria-live="polite"
+ className="result-list small"
+ id="result-list"
+ role="listbox"
+>
+ <li
+ aria-describedby="0-subtitle"
+ aria-labelledby="0-title"
+ className="result-item"
+ key="0value0"
+ onClick={[Function]}
+ role="option"
+ title="value"
+ >
+ <div
+ className="title"
+ id="0-title"
+ >
+ title
+ </div>
+ <div
+ className="subtitle"
+ id="0-subtitle"
+ >
+ subtitle
+ </div>
+ </li>
+ <li
+ aria-describedby="1-subtitle"
+ aria-labelledby="1-title"
+ className="result-item selected"
+ key="1value 11"
+ onClick={[Function]}
+ role="option"
+ title="value 1"
+ >
+ <div
+ className="title"
+ id="1-title"
+ >
+ title 1
+ </div>
+ <div
+ className="subtitle"
+ id="1-subtitle"
+ >
+ subtitle 1
+ </div>
+ </li>
+</ul>
+`;
diff --git a/devtools/client/debugger/src/components/shared/tests/__snapshots__/SearchInput.spec.js.snap b/devtools/client/debugger/src/components/shared/tests/__snapshots__/SearchInput.spec.js.snap
new file mode 100644
index 0000000000..c56a13dc3b
--- /dev/null
+++ b/devtools/client/debugger/src/components/shared/tests/__snapshots__/SearchInput.spec.js.snap
@@ -0,0 +1,267 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`SearchInput renders 1`] = `
+<div
+ className="search-outline"
+>
+ <div
+ aria-expanded={false}
+ aria-haspopup="listbox"
+ aria-owns="result-list"
+ className="search-field"
+ role="combobox"
+ >
+ <AccessibleImage
+ className="search"
+ />
+ <input
+ aria-activedescendant=""
+ aria-autocomplete="list"
+ aria-controls="result-list"
+ className=""
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="A placeholder"
+ spellCheck={false}
+ value=""
+ />
+ <div
+ className="search-field-summary"
+ >
+ So many results
+ </div>
+ <div
+ className="search-buttons-bar"
+ >
+ <span
+ className="pipe-divider"
+ />
+ <CloseButton
+ buttonClass=""
+ handleClick={[MockFunction]}
+ />
+ </div>
+ </div>
+</div>
+`;
+
+exports[`SearchInput shows nav buttons 1`] = `
+<div
+ className="search-outline"
+>
+ <div
+ aria-expanded={false}
+ aria-haspopup="listbox"
+ aria-owns="result-list"
+ className="search-field"
+ role="combobox"
+ >
+ <AccessibleImage
+ className="search"
+ />
+ <input
+ aria-activedescendant=""
+ aria-autocomplete="list"
+ aria-controls="result-list"
+ className=""
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="A placeholder"
+ spellCheck={false}
+ value=""
+ />
+ <div
+ className="search-field-summary"
+ >
+ So many results
+ </div>
+ <div
+ className="search-nav-buttons"
+ >
+ <button
+ className="nav-btn prev"
+ key="arrow-up"
+ onClick={[MockFunction]}
+ title="Previous result"
+ type="arrow-up"
+ >
+ <AccessibleImage
+ className="arrow-up"
+ />
+ </button>
+ <button
+ className="nav-btn next"
+ key="arrow-down"
+ onClick={[MockFunction]}
+ title="Next result"
+ type="arrow-down"
+ >
+ <AccessibleImage
+ className="arrow-down"
+ />
+ </button>
+ </div>
+ <div
+ className="search-buttons-bar"
+ >
+ <span
+ className="pipe-divider"
+ />
+ <CloseButton
+ buttonClass=""
+ handleClick={[MockFunction]}
+ />
+ </div>
+ </div>
+</div>
+`;
+
+exports[`SearchInput shows svg error emoji 1`] = `
+<div
+ className="search-outline"
+>
+ <div
+ aria-expanded={false}
+ aria-haspopup="listbox"
+ aria-owns="result-list"
+ className="search-field"
+ role="combobox"
+ >
+ <AccessibleImage
+ className="search"
+ />
+ <input
+ aria-activedescendant=""
+ aria-autocomplete="list"
+ aria-controls="result-list"
+ className="empty"
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="A placeholder"
+ spellCheck={false}
+ value=""
+ />
+ <div
+ className="search-field-summary"
+ >
+ So many results
+ </div>
+ <div
+ className="search-nav-buttons"
+ >
+ <button
+ className="nav-btn prev"
+ key="arrow-up"
+ onClick={[MockFunction]}
+ title="Previous result"
+ type="arrow-up"
+ >
+ <AccessibleImage
+ className="arrow-up"
+ />
+ </button>
+ <button
+ className="nav-btn next"
+ key="arrow-down"
+ onClick={[MockFunction]}
+ title="Next result"
+ type="arrow-down"
+ >
+ <AccessibleImage
+ className="arrow-down"
+ />
+ </button>
+ </div>
+ <div
+ className="search-buttons-bar"
+ >
+ <span
+ className="pipe-divider"
+ />
+ <CloseButton
+ buttonClass=""
+ handleClick={[MockFunction]}
+ />
+ </div>
+ </div>
+</div>
+`;
+
+exports[`SearchInput shows svg magnifying glass 1`] = `
+<div
+ className="search-outline"
+>
+ <div
+ aria-expanded={false}
+ aria-haspopup="listbox"
+ aria-owns="result-list"
+ className="search-field"
+ role="combobox"
+ >
+ <AccessibleImage
+ className="search"
+ />
+ <input
+ aria-activedescendant=""
+ aria-autocomplete="list"
+ aria-controls="result-list"
+ className=""
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="A placeholder"
+ spellCheck={false}
+ value=""
+ />
+ <div
+ className="search-field-summary"
+ >
+ So many results
+ </div>
+ <div
+ className="search-nav-buttons"
+ >
+ <button
+ className="nav-btn prev"
+ key="arrow-up"
+ onClick={[MockFunction]}
+ title="Previous result"
+ type="arrow-up"
+ >
+ <AccessibleImage
+ className="arrow-up"
+ />
+ </button>
+ <button
+ className="nav-btn next"
+ key="arrow-down"
+ onClick={[MockFunction]}
+ title="Next result"
+ type="arrow-down"
+ >
+ <AccessibleImage
+ className="arrow-down"
+ />
+ </button>
+ </div>
+ <div
+ className="search-buttons-bar"
+ >
+ <span
+ className="pipe-divider"
+ />
+ <CloseButton
+ buttonClass=""
+ handleClick={[MockFunction]}
+ />
+ </div>
+ </div>
+</div>
+`;
diff --git a/devtools/client/debugger/src/components/test/QuickOpenModal.spec.js b/devtools/client/debugger/src/components/test/QuickOpenModal.spec.js
new file mode 100644
index 0000000000..74bc7c75bc
--- /dev/null
+++ b/devtools/client/debugger/src/components/test/QuickOpenModal.spec.js
@@ -0,0 +1,803 @@
+/* eslint max-nested-callbacks: ["error", 4] */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React from "devtools/client/shared/vendor/react";
+import { Provider } from "devtools/client/shared/vendor/react-redux";
+import configureStore from "redux-mock-store";
+import { shallow, mount } from "enzyme";
+import { getDisplayURL } from "../../utils/sources-tree/getURL";
+import { searchKeys } from "../../constants";
+
+// it's important to mock the module before importing the QuickOpenModal
+jest.mock("devtools/client/shared/vendor/fuzzaldrin-plus.js", () => {
+ return {
+ filter: jest.fn(() => []),
+ prepareQuery: jest.fn(() => {}),
+ wrap: jest.fn(() => {}),
+ };
+});
+import { QuickOpenModal } from "../QuickOpenModal";
+const { filter } = require("devtools/client/shared/vendor/fuzzaldrin-plus.js");
+
+function generateModal(propOverrides, renderType = "shallow") {
+ const mockStore = configureStore([]);
+ const store = mockStore({
+ ui: {
+ mutableSearchOptions: {
+ [searchKeys.QUICKOPEN_SEARCH]: {
+ regexMatch: false,
+ wholeWord: false,
+ caseSensitive: false,
+ excludePatterns: "",
+ },
+ },
+ },
+ });
+ const props = {
+ enabled: false,
+ query: "",
+ searchType: "sources",
+ displayedSources: [],
+ blackBoxRanges: {},
+ openedTabUrls: [],
+ selectedLocation: { source: { id: "foo" } },
+ selectSpecificLocation: jest.fn(),
+ setQuickOpenQuery: jest.fn(),
+ highlightLineRange: jest.fn(),
+ clearHighlightLineRange: jest.fn(),
+ closeQuickOpen: jest.fn(),
+ getFunctionSymbols: jest.fn(() => []),
+ shortcutsModalEnabled: false,
+ toggleShortcutsModal: jest.fn(),
+ isOriginal: false,
+ thread: "FakeThread",
+ ...propOverrides,
+ };
+ return {
+ wrapper:
+ renderType === "shallow"
+ ? shallow(
+ <Provider store={store}>
+ <QuickOpenModal {...props} />
+ </Provider>
+ ).dive()
+ : mount(
+ <Provider store={store}>
+ <QuickOpenModal {...props} />
+ </Provider>
+ ),
+ props,
+ };
+}
+
+async function waitForUpdateResultsThrottle() {
+ await new Promise(res =>
+ setTimeout(res, QuickOpenModal.UPDATE_RESULTS_THROTTLE)
+ );
+}
+
+describe("QuickOpenModal", () => {
+ beforeEach(() => {
+ filter.mockClear();
+ });
+ test("Doesn't render when disabled", () => {
+ const { wrapper } = generateModal();
+ expect(wrapper).toMatchSnapshot();
+ });
+
+ test("Renders when enabled", () => {
+ const { wrapper } = generateModal({ enabled: true });
+ expect(wrapper).toMatchSnapshot();
+ });
+
+ test("Basic render with mount", () => {
+ const { wrapper } = generateModal({ enabled: true }, "mount");
+ expect(wrapper).toMatchSnapshot();
+ });
+
+ test("Basic render with mount & searchType = functions", () => {
+ const { wrapper } = generateModal(
+ {
+ enabled: true,
+ query: "@",
+ searchType: "functions",
+ },
+ "mount"
+ );
+ expect(wrapper).toMatchSnapshot();
+ });
+
+ test("toggles shortcut modal if enabled", () => {
+ const { props } = generateModal(
+ {
+ enabled: true,
+ query: "test",
+ shortcutsModalEnabled: true,
+ toggleShortcutsModal: jest.fn(),
+ },
+ "shallow"
+ );
+ expect(props.toggleShortcutsModal).toHaveBeenCalled();
+ });
+
+ test("shows top sources", () => {
+ const { wrapper } = generateModal(
+ {
+ enabled: true,
+ query: "",
+ displayedSources: [
+ {
+ url: "mozilla.com",
+ displayURL: getDisplayURL("mozilla.com"),
+ },
+ ],
+ openedTabUrls: ["mozilla.com"],
+ },
+ "shallow"
+ );
+ expect(wrapper.state("results")).toEqual([
+ {
+ id: undefined,
+ icon: "tab result-item-icon",
+ subtitle: "mozilla.com",
+ title: "mozilla.com",
+ url: "mozilla.com",
+ value: "mozilla.com",
+ source: {
+ url: "mozilla.com",
+ displayURL: getDisplayURL("mozilla.com"),
+ },
+ },
+ ]);
+ });
+
+ describe("shows loading", () => {
+ it("loads with function type search", () => {
+ const { wrapper } = generateModal(
+ {
+ enabled: true,
+ query: "",
+ searchType: "functions",
+ },
+ "shallow"
+ );
+ expect(wrapper).toMatchSnapshot();
+ });
+ });
+
+ test("Basic render with mount & searchType = variables", () => {
+ const { wrapper } = generateModal(
+ {
+ enabled: true,
+ query: "#",
+ searchType: "variables",
+ },
+ "mount"
+ );
+ expect(wrapper).toMatchSnapshot();
+ });
+
+ test("Basic render with mount & searchType = shortcuts", () => {
+ const { wrapper } = generateModal(
+ {
+ enabled: true,
+ query: "?",
+ searchType: "shortcuts",
+ },
+ "mount"
+ );
+ expect(wrapper.find("ResultList")).toHaveLength(1);
+ expect(wrapper.find("li")).toHaveLength(3);
+ });
+
+ test("updateResults on enable", () => {
+ const { wrapper } = generateModal({}, "mount");
+ expect(wrapper).toMatchSnapshot();
+ wrapper.setProps({ enabled: true });
+ expect(wrapper).toMatchSnapshot();
+ });
+
+ test("basic source search", async () => {
+ const { wrapper } = generateModal(
+ {
+ enabled: true,
+ },
+ "mount"
+ );
+ wrapper.find("input").simulate("change", { target: { value: "somefil" } });
+ await waitForUpdateResultsThrottle();
+ expect(filter).toHaveBeenCalledWith([], "somefil", {
+ key: "value",
+ maxResults: 100,
+ });
+ });
+
+ test("basic gotoSource search", async () => {
+ const { wrapper } = generateModal(
+ {
+ enabled: true,
+ searchType: "gotoSource",
+ },
+ "mount"
+ );
+ wrapper
+ .find("input")
+ .simulate("change", { target: { value: "somefil:33" } });
+
+ await waitForUpdateResultsThrottle();
+
+ expect(filter).toHaveBeenCalledWith([], "somefil", {
+ key: "value",
+ maxResults: 100,
+ });
+ });
+
+ describe("empty symbol search", () => {
+ it("basic symbol search", async () => {
+ const { wrapper } = generateModal(
+ {
+ enabled: true,
+ searchType: "functions",
+ // symbol searching relies on a source being selected.
+ // So we dummy out the source and the API.
+ selectedLocation: { source: { id: "foo", text: "yo" } },
+ selectedContentLoaded: true,
+ },
+ "mount"
+ );
+
+ wrapper
+ .find("input")
+ .simulate("change", { target: { value: "@someFunc" } });
+ await waitForUpdateResultsThrottle();
+ expect(filter).toHaveBeenCalledWith([], "someFunc", {
+ key: "name",
+ maxResults: 100,
+ preparedQuery: undefined,
+ });
+ });
+
+ it("does not do symbol search if no selected source", () => {
+ const { wrapper } = generateModal(
+ {
+ enabled: true,
+ searchType: "functions",
+
+ // symbol searching relies on a source being selected.
+ // So we dummy out the source and the API.
+ selectedLocation: null,
+ selectedContentLoaded: false,
+ },
+ "mount"
+ );
+ wrapper
+ .find("input")
+ .simulate("change", { target: { value: "@someFunc" } });
+ expect(filter).not.toHaveBeenCalled();
+ });
+ });
+
+ test("Simple goto search query = :abc & searchType = goto", () => {
+ const { wrapper } = generateModal(
+ {
+ enabled: true,
+ query: ":abc",
+ searchType: "goto",
+ },
+ "mount"
+ );
+ expect(wrapper.childAt(0)).toMatchSnapshot();
+ expect(wrapper.childAt(0).state().results).toEqual(null);
+ });
+
+ describe("onEnter", () => {
+ it("on Enter go to location", () => {
+ const { wrapper, props } = generateModal(
+ {
+ enabled: true,
+ query: ":34:12",
+ searchType: "goto",
+ selectedLocation: { source: { id: "foo" } },
+ },
+ "shallow"
+ );
+ const event = {
+ key: "Enter",
+ };
+ wrapper.find("Connect(SearchInput)").simulate("keydown", event);
+ expect(props.selectSpecificLocation).toHaveBeenCalledWith({
+ column: 11,
+ line: 34,
+ source: {
+ id: "foo",
+ },
+ sourceActorId: undefined,
+ sourceActor: null,
+ });
+ });
+
+ it("on Enter go to location with sourceId", () => {
+ const sourceId = "source_id";
+ const { wrapper, props } = generateModal(
+ {
+ enabled: true,
+ query: ":34:12",
+ searchType: "goto",
+ selectedLocation: { source: { id: sourceId } },
+ selectedContentLoaded: true,
+ },
+ "shallow"
+ );
+ const event = {
+ key: "Enter",
+ };
+ wrapper.find("Connect(SearchInput)").simulate("keydown", event);
+ expect(props.selectSpecificLocation).toHaveBeenCalledWith({
+ column: 11,
+ line: 34,
+ source: {
+ id: sourceId,
+ },
+ sourceActorId: undefined,
+ sourceActor: null,
+ });
+ });
+
+ it("on Enter with no location, does no action", () => {
+ const { wrapper, props } = generateModal(
+ {
+ enabled: true,
+ query: ":",
+ searchType: "goto",
+ },
+ "shallow"
+ );
+ const event = {
+ key: "Enter",
+ };
+ wrapper.find("Connect(SearchInput)").simulate("keydown", event);
+ expect(props.setQuickOpenQuery).not.toHaveBeenCalled();
+ expect(props.selectSpecificLocation).not.toHaveBeenCalled();
+ expect(props.highlightLineRange).not.toHaveBeenCalled();
+ });
+
+ it("on Enter with empty results, handle no item", () => {
+ const { wrapper, props } = generateModal(
+ {
+ enabled: true,
+ query: "",
+ searchType: "shortcuts",
+ },
+ "shallow"
+ );
+ wrapper.setState(() => ({
+ results: [],
+ selectedIndex: 0,
+ }));
+ const event = {
+ key: "Enter",
+ };
+ wrapper.find("Connect(SearchInput)").simulate("keydown", event);
+ expect(props.setQuickOpenQuery).not.toHaveBeenCalled();
+ expect(props.selectSpecificLocation).not.toHaveBeenCalled();
+ expect(props.highlightLineRange).not.toHaveBeenCalled();
+ });
+
+ it("on Enter with results, handle symbol shortcut", () => {
+ const symbols = [":", "#", "@"];
+ for (const symbol of symbols) {
+ const { wrapper, props } = generateModal(
+ {
+ enabled: true,
+ query: "",
+ searchType: "shortcuts",
+ },
+ "shallow"
+ );
+ wrapper.setState(() => ({
+ results: [{ id: symbol }],
+ selectedIndex: 0,
+ }));
+ const event = {
+ key: "Enter",
+ };
+ wrapper.find("Connect(SearchInput)").simulate("keydown", event);
+ expect(props.setQuickOpenQuery).toHaveBeenCalledWith(symbol);
+ }
+ });
+
+ it("on Enter, returns the result with the selected index", () => {
+ const { wrapper, props } = generateModal(
+ {
+ enabled: true,
+ query: "@test",
+ searchType: "shortcuts",
+ },
+ "shallow"
+ );
+ wrapper.setState(() => ({
+ results: [{ id: "@" }, { id: ":" }, { id: "#" }],
+ selectedIndex: 1,
+ }));
+ const event = {
+ key: "Enter",
+ };
+ wrapper.find("Connect(SearchInput)").simulate("keydown", event);
+ expect(props.setQuickOpenQuery).toHaveBeenCalledWith(":");
+ });
+
+ it("on Enter with results, handle result item", () => {
+ const id = "test_id";
+ const { wrapper, props } = generateModal(
+ {
+ enabled: true,
+ query: "@test",
+ searchType: "other",
+ selectedLocation: { source: { id } },
+ },
+ "shallow"
+ );
+ wrapper.setState(() => ({
+ results: [{}, { id }],
+ selectedIndex: 1,
+ }));
+ const event = {
+ key: "Enter",
+ };
+ wrapper.find("Connect(SearchInput)").simulate("keydown", event);
+ expect(props.selectSpecificLocation).toHaveBeenCalledWith({
+ column: undefined,
+ line: 0,
+ source: { id },
+ sourceActorId: undefined,
+ sourceActor: null,
+ });
+ expect(props.setQuickOpenQuery).not.toHaveBeenCalled();
+ });
+
+ it("on Enter with results, handle functions result item", () => {
+ const id = "test_id";
+ const { wrapper, props } = generateModal(
+ {
+ enabled: true,
+ query: "@test",
+ searchType: "functions",
+ selectedLocation: { source: { id } },
+ },
+ "shallow"
+ );
+ wrapper.setState(() => ({
+ results: [{}, { id }],
+ selectedIndex: 1,
+ }));
+ const event = {
+ key: "Enter",
+ };
+ wrapper.find("Connect(SearchInput)").simulate("keydown", event);
+ expect(props.selectSpecificLocation).toHaveBeenCalledWith({
+ column: undefined,
+ line: 0,
+ source: { id },
+ sourceActorId: undefined,
+ sourceActor: null,
+ });
+ expect(props.setQuickOpenQuery).not.toHaveBeenCalled();
+ });
+
+ it("on Enter with results, handle gotoSource search", () => {
+ const id = "test_id";
+ const { wrapper, props } = generateModal(
+ {
+ enabled: true,
+ query: ":3:4",
+ searchType: "gotoSource",
+ selectedLocation: { source: { id } },
+ },
+ "shallow"
+ );
+ wrapper.setState(() => ({
+ results: [{}, { id }],
+ selectedIndex: 1,
+ }));
+ const event = {
+ key: "Enter",
+ };
+ wrapper.find("Connect(SearchInput)").simulate("keydown", event);
+ expect(props.selectSpecificLocation).toHaveBeenCalledWith({
+ column: 3,
+ line: 3,
+ source: { id },
+ sourceActorId: undefined,
+ sourceActor: null,
+ });
+ expect(props.setQuickOpenQuery).not.toHaveBeenCalled();
+ });
+
+ it("on Enter with results, handle shortcuts search", () => {
+ const { wrapper, props } = generateModal(
+ {
+ enabled: true,
+ query: "@",
+ searchType: "shortcuts",
+ },
+ "shallow"
+ );
+ const id = "#";
+ wrapper.setState(() => ({
+ results: [{}, { id }],
+ selectedIndex: 1,
+ }));
+ const event = {
+ key: "Enter",
+ };
+ wrapper.find("Connect(SearchInput)").simulate("keydown", event);
+ expect(props.selectSpecificLocation).not.toHaveBeenCalled();
+ expect(props.setQuickOpenQuery).toHaveBeenCalledWith(id);
+ });
+ });
+
+ describe("onKeyDown", () => {
+ it("does nothing if search type is not goto", () => {
+ const { wrapper, props } = generateModal(
+ {
+ enabled: true,
+ query: "test",
+ searchType: "other",
+ },
+ "shallow"
+ );
+ wrapper.find("Connect(SearchInput)").simulate("keydown", {});
+ expect(props.selectSpecificLocation).not.toHaveBeenCalled();
+ expect(props.setQuickOpenQuery).not.toHaveBeenCalled();
+ });
+
+ it("on Tab, close modal", () => {
+ const { wrapper, props } = generateModal(
+ {
+ enabled: true,
+ query: ":34:12",
+ searchType: "goto",
+ },
+ "shallow"
+ );
+ const event = {
+ key: "Tab",
+ };
+ wrapper.find("Connect(SearchInput)").simulate("keydown", event);
+ expect(props.closeQuickOpen).toHaveBeenCalled();
+ expect(props.selectSpecificLocation).not.toHaveBeenCalled();
+ });
+ });
+
+ describe("with arrow keys", () => {
+ it("on ArrowUp, traverse results up with functions", () => {
+ const sourceId = "sourceId";
+ const { wrapper, props } = generateModal(
+ {
+ enabled: true,
+ query: "test",
+ searchType: "functions",
+ selectedLocation: { source: { id: sourceId } },
+ selectedContentLoaded: true,
+ },
+ "shallow"
+ );
+ const event = {
+ preventDefault: jest.fn(),
+ key: "ArrowUp",
+ };
+ const location = {
+ sourceId: "sourceId",
+ start: {
+ line: 1,
+ },
+ end: {
+ line: 3,
+ },
+ };
+
+ wrapper.setState(() => ({
+ results: [{ id: "0", location }, { id: "1" }, { id: "2" }],
+ selectedIndex: 1,
+ }));
+ wrapper.find("Connect(SearchInput)").simulate("keydown", event);
+ expect(event.preventDefault).toHaveBeenCalled();
+ expect(wrapper.state().selectedIndex).toEqual(0);
+ expect(props.highlightLineRange).toHaveBeenCalledWith({
+ sourceId: "sourceId",
+ end: 3,
+ start: 1,
+ });
+ });
+
+ it("on ArrowDown, traverse down with no results", () => {
+ const { wrapper, props } = generateModal(
+ {
+ enabled: true,
+ query: "test",
+ searchType: "goto",
+ },
+ "shallow"
+ );
+ const event = {
+ preventDefault: jest.fn(),
+ key: "ArrowDown",
+ };
+ wrapper.setState(() => ({
+ results: null,
+ selectedIndex: 1,
+ }));
+ wrapper.find("Connect(SearchInput)").simulate("keydown", event);
+ expect(event.preventDefault).toHaveBeenCalled();
+ expect(wrapper.state().selectedIndex).toEqual(0);
+ expect(props.selectSpecificLocation).not.toHaveBeenCalledWith();
+ expect(props.highlightLineRange).not.toHaveBeenCalled();
+ });
+
+ it("on ArrowUp, traverse results up to function with no location", () => {
+ const sourceId = "sourceId";
+ const { wrapper, props } = generateModal(
+ {
+ enabled: true,
+ query: "test",
+ searchType: "functions",
+ selectedLocation: { source: { id: sourceId } },
+ selectedContentLoaded: true,
+ },
+ "shallow"
+ );
+ const event = {
+ preventDefault: jest.fn(),
+ key: "ArrowUp",
+ };
+ wrapper.setState(() => ({
+ results: [{ id: "0", location: null }, { id: "1" }, { id: "2" }],
+ selectedIndex: 1,
+ }));
+ wrapper.find("Connect(SearchInput)").simulate("keydown", event);
+ expect(event.preventDefault).toHaveBeenCalled();
+ expect(wrapper.state().selectedIndex).toEqual(0);
+ expect(props.highlightLineRange).not.toHaveBeenCalled();
+ expect(props.clearHighlightLineRange).toHaveBeenCalled();
+ });
+
+ it(
+ "on ArrowDown, traverse down results, without " +
+ "taking action if no selectedSource",
+ () => {
+ const { wrapper, props } = generateModal(
+ {
+ enabled: true,
+ query: "test",
+ searchType: "variables",
+ selectedLocation: null,
+ selectedContentLoaded: true,
+ },
+ "shallow"
+ );
+ const event = {
+ preventDefault: jest.fn(),
+ key: "ArrowDown",
+ };
+ const location = {
+ sourceId: "sourceId",
+ start: {
+ line: 7,
+ },
+ };
+ wrapper.setState(() => ({
+ results: [{ id: "0", location }, { id: "1" }, { id: "2" }],
+ selectedIndex: 1,
+ }));
+ wrapper.find("Connect(SearchInput)").simulate("keydown", event);
+ expect(event.preventDefault).toHaveBeenCalled();
+ expect(wrapper.state().selectedIndex).toEqual(2);
+ expect(props.selectSpecificLocation).not.toHaveBeenCalled();
+ expect(props.highlightLineRange).not.toHaveBeenCalled();
+ }
+ );
+
+ it(
+ "on ArrowUp, traverse up results, without taking action if " +
+ "the query is not for variables or functions",
+ () => {
+ const sourceId = "sourceId";
+ const { wrapper, props } = generateModal(
+ {
+ enabled: true,
+ query: "test",
+ searchType: "other",
+ selectedLocation: { source: { id: sourceId } },
+ selectedContentLoaded: true,
+ },
+ "shallow"
+ );
+ const event = {
+ preventDefault: jest.fn(),
+ key: "ArrowUp",
+ };
+ const location = {
+ sourceId: "sourceId",
+ start: {
+ line: 7,
+ },
+ };
+ wrapper.setState(() => ({
+ results: [{ id: "0", location }, { id: "1" }, { id: "2" }],
+ selectedIndex: 1,
+ }));
+ wrapper.find("Connect(SearchInput)").simulate("keydown", event);
+ expect(event.preventDefault).toHaveBeenCalled();
+ expect(wrapper.state().selectedIndex).toEqual(0);
+ expect(props.selectSpecificLocation).not.toHaveBeenCalled();
+ expect(props.highlightLineRange).not.toHaveBeenCalled();
+ }
+ );
+ });
+
+ describe("showErrorEmoji", () => {
+ it("true when no count + query", () => {
+ const { wrapper } = generateModal(
+ {
+ enabled: true,
+ query: "test",
+ searchType: "other",
+ },
+ "mount"
+ );
+ expect(wrapper).toMatchSnapshot();
+ });
+
+ it("false when count + query", () => {
+ const { wrapper } = generateModal(
+ {
+ enabled: true,
+ query: "dasdasdas",
+ },
+ "mount"
+ );
+ wrapper.setState(() => ({
+ results: [1, 2],
+ }));
+ expect(wrapper).toMatchSnapshot();
+ });
+
+ it("false when no query", () => {
+ const { wrapper } = generateModal(
+ {
+ enabled: true,
+ query: "",
+ searchType: "other",
+ },
+ "mount"
+ );
+ expect(wrapper).toMatchSnapshot();
+ });
+
+ it("false when goto numeric ':2222'", () => {
+ const { wrapper } = generateModal(
+ {
+ enabled: true,
+ query: ":2222",
+ searchType: "goto",
+ },
+ "mount"
+ );
+ expect(wrapper).toMatchSnapshot();
+ });
+
+ it("true when goto not numeric ':22k22'", () => {
+ const { wrapper } = generateModal(
+ {
+ enabled: true,
+ query: ":22k22",
+ searchType: "goto",
+ },
+ "mount"
+ );
+ expect(wrapper).toMatchSnapshot();
+ });
+ });
+});
diff --git a/devtools/client/debugger/src/components/test/WelcomeBox.spec.js b/devtools/client/debugger/src/components/test/WelcomeBox.spec.js
new file mode 100644
index 0000000000..5599c416fe
--- /dev/null
+++ b/devtools/client/debugger/src/components/test/WelcomeBox.spec.js
@@ -0,0 +1,58 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React from "devtools/client/shared/vendor/react";
+import { shallow } from "enzyme";
+
+import { WelcomeBox } from "../WelcomeBox";
+
+function render(overrides = {}) {
+ const props = {
+ horizontal: false,
+ togglePaneCollapse: jest.fn(),
+ endPanelCollapsed: false,
+ setActiveSearch: jest.fn(),
+ openQuickOpen: jest.fn(),
+ toggleShortcutsModal: jest.fn(),
+ setPrimaryPaneTab: jest.fn(),
+ ...overrides,
+ };
+ const component = shallow(React.createElement(WelcomeBox, props));
+ return { component, props };
+}
+
+describe("WelomeBox", () => {
+ it("renders with default values", () => {
+ const { component } = render();
+ expect(component).toMatchSnapshot();
+ });
+
+ it("doesn't render toggle button in horizontal mode", () => {
+ const { component } = render({
+ horizontal: true,
+ });
+ expect(component.find("PaneToggleButton")).toHaveLength(0);
+ });
+
+ it("calls correct function on searchSources click", () => {
+ const { component, props } = render();
+
+ component.find(".welcomebox__searchSources").simulate("click");
+ expect(props.openQuickOpen).toHaveBeenCalled();
+ });
+
+ it("calls correct function on searchProject click", () => {
+ const { component, props } = render();
+
+ component.find(".welcomebox__searchProject").simulate("click");
+ expect(props.setActiveSearch).toHaveBeenCalled();
+ });
+
+ it("calls correct function on allShotcuts click", () => {
+ const { component, props } = render();
+
+ component.find(".welcomebox__allShortcuts").simulate("click");
+ expect(props.toggleShortcutsModal).toHaveBeenCalled();
+ });
+});
diff --git a/devtools/client/debugger/src/components/test/WhyPaused.spec.js b/devtools/client/debugger/src/components/test/WhyPaused.spec.js
new file mode 100644
index 0000000000..5466976dfb
--- /dev/null
+++ b/devtools/client/debugger/src/components/test/WhyPaused.spec.js
@@ -0,0 +1,61 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React from "devtools/client/shared/vendor/react";
+import { shallow } from "enzyme";
+import WhyPaused from "../SecondaryPanes/WhyPaused.js";
+
+function render(why, delay) {
+ const props = { why, delay };
+ const component = shallow(
+ React.createElement(WhyPaused.WrappedComponent, props)
+ );
+
+ return { component, props };
+}
+
+describe("WhyPaused", () => {
+ it("should pause reason with message", () => {
+ const why = {
+ type: "breakpoint",
+ message: "bla is hit",
+ };
+ const { component } = render(why);
+ expect(component).toMatchSnapshot();
+ });
+
+ it("should show pause reason with exception details", () => {
+ const why = {
+ type: "exception",
+ exception: {
+ class: "ReferenceError",
+ isError: true,
+ preview: {
+ name: "ReferenceError",
+ message: "o is not defined",
+ },
+ },
+ };
+
+ const { component } = render(why);
+ expect(component).toMatchSnapshot();
+ });
+
+ it("should show pause reason with exception string", () => {
+ const why = {
+ type: "exception",
+ exception: "Not Available",
+ };
+
+ const { component } = render(why);
+ expect(component).toMatchSnapshot();
+ });
+
+ it("should show an empty div when there is no pause reason", () => {
+ const why = undefined;
+
+ const { component } = render(why);
+ expect(component).toMatchSnapshot();
+ });
+});
diff --git a/devtools/client/debugger/src/components/test/__snapshots__/QuickOpenModal.spec.js.snap b/devtools/client/debugger/src/components/test/__snapshots__/QuickOpenModal.spec.js.snap
new file mode 100644
index 0000000000..d58d2d58a0
--- /dev/null
+++ b/devtools/client/debugger/src/components/test/__snapshots__/QuickOpenModal.spec.js.snap
@@ -0,0 +1,1777 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`QuickOpenModal Basic render with mount & searchType = functions 1`] = `
+<Provider
+ store={
+ Object {
+ "clearActions": [Function],
+ "dispatch": [Function],
+ "getActions": [Function],
+ "getState": [Function],
+ "replaceReducer": [Function],
+ "subscribe": [Function],
+ }
+ }
+>
+ <QuickOpenModal
+ blackBoxRanges={Object {}}
+ clearHighlightLineRange={[MockFunction]}
+ closeQuickOpen={[MockFunction]}
+ displayedSources={Array []}
+ enabled={true}
+ getFunctionSymbols={
+ [MockFunction] {
+ "calls": Array [
+ Array [
+ Object {
+ "source": Object {
+ "id": "foo",
+ },
+ },
+ 100,
+ ],
+ ],
+ "results": Array [
+ Object {
+ "type": "return",
+ "value": Array [],
+ },
+ ],
+ }
+ }
+ highlightLineRange={[MockFunction]}
+ isOriginal={false}
+ openedTabUrls={Array []}
+ query="@"
+ searchType="functions"
+ selectSpecificLocation={[MockFunction]}
+ selectedLocation={
+ Object {
+ "source": Object {
+ "id": "foo",
+ },
+ }
+ }
+ setQuickOpenQuery={[MockFunction]}
+ shortcutsModalEnabled={false}
+ thread="FakeThread"
+ toggleShortcutsModal={[MockFunction]}
+ >
+ <Modal
+ handleClose={[Function]}
+ >
+ <div
+ className="modal-wrapper"
+ onClick={[Function]}
+ >
+ <div
+ className="modal"
+ onClick={[Function]}
+ >
+ <Connect(SearchInput)
+ count={0}
+ expanded={false}
+ handleClose={[Function]}
+ hasPrefix={true}
+ isLoading={false}
+ onChange={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Go to file…"
+ query="@"
+ searchKey="quickopen-search"
+ selectedItemId=""
+ showClose={false}
+ showErrorEmoji={true}
+ showExcludePatterns={false}
+ showSearchModifiers={false}
+ summaryMsg="Loading…"
+ >
+ <SearchInput
+ count={0}
+ expanded={false}
+ handleClose={[Function]}
+ hasPrefix={true}
+ isLoading={false}
+ onChange={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Go to file…"
+ query="@"
+ searchKey="quickopen-search"
+ searchOptions={
+ Object {
+ "caseSensitive": false,
+ "excludePatterns": "",
+ "regexMatch": false,
+ "wholeWord": false,
+ }
+ }
+ selectedItemId=""
+ setSearchOptions={[Function]}
+ showClose={false}
+ showErrorEmoji={true}
+ showExcludePatterns={false}
+ showSearchModifiers={false}
+ size=""
+ summaryMsg="Loading…"
+ >
+ <div
+ className="search-outline"
+ >
+ <div
+ aria-expanded={false}
+ aria-haspopup="listbox"
+ aria-owns="result-list"
+ className="search-field"
+ role="combobox"
+ >
+ <AccessibleImage
+ className="search"
+ >
+ <span
+ className="img search"
+ />
+ </AccessibleImage>
+ <input
+ aria-activedescendant=""
+ aria-autocomplete="list"
+ aria-controls="result-list"
+ className="empty"
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Go to file…"
+ spellCheck={false}
+ value="@"
+ />
+ <div
+ className="search-field-summary"
+ >
+ Loading…
+ </div>
+ <div
+ className="search-buttons-bar"
+ />
+ </div>
+ </div>
+ </SearchInput>
+ </Connect(SearchInput)>
+ </div>
+ </div>
+ </Modal>
+ </QuickOpenModal>
+</Provider>
+`;
+
+exports[`QuickOpenModal Basic render with mount & searchType = variables 1`] = `
+<Provider
+ store={
+ Object {
+ "clearActions": [Function],
+ "dispatch": [Function],
+ "getActions": [Function],
+ "getState": [Function],
+ "replaceReducer": [Function],
+ "subscribe": [Function],
+ }
+ }
+>
+ <QuickOpenModal
+ blackBoxRanges={Object {}}
+ clearHighlightLineRange={[MockFunction]}
+ closeQuickOpen={[MockFunction]}
+ displayedSources={Array []}
+ enabled={true}
+ getFunctionSymbols={[MockFunction]}
+ highlightLineRange={[MockFunction]}
+ isOriginal={false}
+ openedTabUrls={Array []}
+ query="#"
+ searchType="variables"
+ selectSpecificLocation={[MockFunction]}
+ selectedLocation={
+ Object {
+ "source": Object {
+ "id": "foo",
+ },
+ }
+ }
+ setQuickOpenQuery={[MockFunction]}
+ shortcutsModalEnabled={false}
+ thread="FakeThread"
+ toggleShortcutsModal={[MockFunction]}
+ >
+ <Modal
+ handleClose={[Function]}
+ >
+ <div
+ className="modal-wrapper"
+ onClick={[Function]}
+ >
+ <div
+ className="modal"
+ onClick={[Function]}
+ >
+ <Connect(SearchInput)
+ count={0}
+ expanded={false}
+ handleClose={[Function]}
+ hasPrefix={true}
+ isLoading={false}
+ onChange={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Go to file…"
+ query="#"
+ searchKey="quickopen-search"
+ selectedItemId=""
+ showClose={false}
+ showErrorEmoji={true}
+ showExcludePatterns={false}
+ showSearchModifiers={false}
+ summaryMsg=""
+ >
+ <SearchInput
+ count={0}
+ expanded={false}
+ handleClose={[Function]}
+ hasPrefix={true}
+ isLoading={false}
+ onChange={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Go to file…"
+ query="#"
+ searchKey="quickopen-search"
+ searchOptions={
+ Object {
+ "caseSensitive": false,
+ "excludePatterns": "",
+ "regexMatch": false,
+ "wholeWord": false,
+ }
+ }
+ selectedItemId=""
+ setSearchOptions={[Function]}
+ showClose={false}
+ showErrorEmoji={true}
+ showExcludePatterns={false}
+ showSearchModifiers={false}
+ size=""
+ summaryMsg=""
+ >
+ <div
+ className="search-outline"
+ >
+ <div
+ aria-expanded={false}
+ aria-haspopup="listbox"
+ aria-owns="result-list"
+ className="search-field"
+ role="combobox"
+ >
+ <AccessibleImage
+ className="search"
+ >
+ <span
+ className="img search"
+ />
+ </AccessibleImage>
+ <input
+ aria-activedescendant=""
+ aria-autocomplete="list"
+ aria-controls="result-list"
+ className="empty"
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Go to file…"
+ spellCheck={false}
+ value="#"
+ />
+ <div
+ className="search-buttons-bar"
+ />
+ </div>
+ </div>
+ </SearchInput>
+ </Connect(SearchInput)>
+ <ResultList
+ expanded={false}
+ items={Array []}
+ key="results"
+ role="listbox"
+ selectItem={[Function]}
+ selected={0}
+ size="small"
+ >
+ <ul
+ aria-live="polite"
+ className="result-list small"
+ id="result-list"
+ role="listbox"
+ />
+ </ResultList>
+ </div>
+ </div>
+ </Modal>
+ </QuickOpenModal>
+</Provider>
+`;
+
+exports[`QuickOpenModal Basic render with mount 1`] = `
+<Provider
+ store={
+ Object {
+ "clearActions": [Function],
+ "dispatch": [Function],
+ "getActions": [Function],
+ "getState": [Function],
+ "replaceReducer": [Function],
+ "subscribe": [Function],
+ }
+ }
+>
+ <QuickOpenModal
+ blackBoxRanges={Object {}}
+ clearHighlightLineRange={[MockFunction]}
+ closeQuickOpen={[MockFunction]}
+ displayedSources={Array []}
+ enabled={true}
+ getFunctionSymbols={[MockFunction]}
+ highlightLineRange={[MockFunction]}
+ isOriginal={false}
+ openedTabUrls={Array []}
+ query=""
+ searchType="sources"
+ selectSpecificLocation={[MockFunction]}
+ selectedLocation={
+ Object {
+ "source": Object {
+ "id": "foo",
+ },
+ }
+ }
+ setQuickOpenQuery={[MockFunction]}
+ shortcutsModalEnabled={false}
+ thread="FakeThread"
+ toggleShortcutsModal={[MockFunction]}
+ >
+ <Modal
+ handleClose={[Function]}
+ >
+ <div
+ className="modal-wrapper"
+ onClick={[Function]}
+ >
+ <div
+ className="modal"
+ onClick={[Function]}
+ >
+ <Connect(SearchInput)
+ count={0}
+ expanded={false}
+ handleClose={[Function]}
+ hasPrefix={true}
+ isLoading={false}
+ onChange={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Go to file…"
+ query=""
+ searchKey="quickopen-search"
+ selectedItemId=""
+ showClose={false}
+ showErrorEmoji={false}
+ showExcludePatterns={false}
+ showSearchModifiers={false}
+ size="big"
+ summaryMsg=""
+ >
+ <SearchInput
+ count={0}
+ expanded={false}
+ handleClose={[Function]}
+ hasPrefix={true}
+ isLoading={false}
+ onChange={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Go to file…"
+ query=""
+ searchKey="quickopen-search"
+ searchOptions={
+ Object {
+ "caseSensitive": false,
+ "excludePatterns": "",
+ "regexMatch": false,
+ "wholeWord": false,
+ }
+ }
+ selectedItemId=""
+ setSearchOptions={[Function]}
+ showClose={false}
+ showErrorEmoji={false}
+ showExcludePatterns={false}
+ showSearchModifiers={false}
+ size="big"
+ summaryMsg=""
+ >
+ <div
+ className="search-outline"
+ >
+ <div
+ aria-expanded={false}
+ aria-haspopup="listbox"
+ aria-owns="result-list"
+ className="search-field big"
+ role="combobox"
+ >
+ <AccessibleImage
+ className="search"
+ >
+ <span
+ className="img search"
+ />
+ </AccessibleImage>
+ <input
+ aria-activedescendant=""
+ aria-autocomplete="list"
+ aria-controls="result-list"
+ className=""
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Go to file…"
+ spellCheck={false}
+ value=""
+ />
+ <div
+ className="search-buttons-bar"
+ />
+ </div>
+ </div>
+ </SearchInput>
+ </Connect(SearchInput)>
+ <ResultList
+ expanded={false}
+ items={Array []}
+ key="results"
+ role="listbox"
+ selectItem={[Function]}
+ selected={0}
+ size="big"
+ >
+ <ul
+ aria-live="polite"
+ className="result-list big"
+ id="result-list"
+ role="listbox"
+ />
+ </ResultList>
+ </div>
+ </div>
+ </Modal>
+ </QuickOpenModal>
+</Provider>
+`;
+
+exports[`QuickOpenModal Doesn't render when disabled 1`] = `
+<Modal
+ handleClose={[Function]}
+>
+ <Connect(SearchInput)
+ count={0}
+ expanded={false}
+ handleClose={[Function]}
+ hasPrefix={true}
+ isLoading={false}
+ onChange={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Go to file…"
+ query=""
+ searchKey="quickopen-search"
+ selectedItemId=""
+ showClose={false}
+ showErrorEmoji={false}
+ showExcludePatterns={false}
+ showSearchModifiers={false}
+ size="big"
+ summaryMsg=""
+ />
+ <ResultList
+ expanded={false}
+ items={Array []}
+ key="results"
+ role="listbox"
+ selectItem={[Function]}
+ selected={0}
+ size="big"
+ />
+</Modal>
+`;
+
+exports[`QuickOpenModal Renders when enabled 1`] = `
+<Modal
+ handleClose={[Function]}
+>
+ <Connect(SearchInput)
+ count={0}
+ expanded={false}
+ handleClose={[Function]}
+ hasPrefix={true}
+ isLoading={false}
+ onChange={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Go to file…"
+ query=""
+ searchKey="quickopen-search"
+ selectedItemId=""
+ showClose={false}
+ showErrorEmoji={false}
+ showExcludePatterns={false}
+ showSearchModifiers={false}
+ size="big"
+ summaryMsg=""
+ />
+ <ResultList
+ expanded={false}
+ items={Array []}
+ key="results"
+ role="listbox"
+ selectItem={[Function]}
+ selected={0}
+ size="big"
+ />
+</Modal>
+`;
+
+exports[`QuickOpenModal Simple goto search query = :abc & searchType = goto 1`] = `
+<QuickOpenModal
+ blackBoxRanges={Object {}}
+ clearHighlightLineRange={[MockFunction]}
+ closeQuickOpen={[MockFunction]}
+ displayedSources={Array []}
+ enabled={true}
+ getFunctionSymbols={[MockFunction]}
+ highlightLineRange={[MockFunction]}
+ isOriginal={false}
+ openedTabUrls={Array []}
+ query=":abc"
+ searchType="goto"
+ selectSpecificLocation={[MockFunction]}
+ selectedLocation={
+ Object {
+ "source": Object {
+ "id": "foo",
+ },
+ }
+ }
+ setQuickOpenQuery={[MockFunction]}
+ shortcutsModalEnabled={false}
+ thread="FakeThread"
+ toggleShortcutsModal={[MockFunction]}
+>
+ <Modal
+ handleClose={[Function]}
+ >
+ <div
+ className="modal-wrapper"
+ onClick={[Function]}
+ >
+ <div
+ className="modal"
+ onClick={[Function]}
+ >
+ <Connect(SearchInput)
+ count={0}
+ expanded={false}
+ handleClose={[Function]}
+ hasPrefix={true}
+ isLoading={false}
+ onChange={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Go to file…"
+ query=":abc"
+ searchKey="quickopen-search"
+ selectedItemId=""
+ showClose={false}
+ showErrorEmoji={true}
+ showExcludePatterns={false}
+ showSearchModifiers={false}
+ summaryMsg="Go to line"
+ >
+ <SearchInput
+ count={0}
+ expanded={false}
+ handleClose={[Function]}
+ hasPrefix={true}
+ isLoading={false}
+ onChange={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Go to file…"
+ query=":abc"
+ searchKey="quickopen-search"
+ searchOptions={
+ Object {
+ "caseSensitive": false,
+ "excludePatterns": "",
+ "regexMatch": false,
+ "wholeWord": false,
+ }
+ }
+ selectedItemId=""
+ setSearchOptions={[Function]}
+ showClose={false}
+ showErrorEmoji={true}
+ showExcludePatterns={false}
+ showSearchModifiers={false}
+ size=""
+ summaryMsg="Go to line"
+ >
+ <div
+ className="search-outline"
+ >
+ <div
+ aria-expanded={false}
+ aria-haspopup="listbox"
+ aria-owns="result-list"
+ className="search-field"
+ role="combobox"
+ >
+ <AccessibleImage
+ className="search"
+ >
+ <span
+ className="img search"
+ />
+ </AccessibleImage>
+ <input
+ aria-activedescendant=""
+ aria-autocomplete="list"
+ aria-controls="result-list"
+ className="empty"
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Go to file…"
+ spellCheck={false}
+ value=":abc"
+ />
+ <div
+ className="search-field-summary"
+ >
+ Go to line
+ </div>
+ <div
+ className="search-buttons-bar"
+ />
+ </div>
+ </div>
+ </SearchInput>
+ </Connect(SearchInput)>
+ </div>
+ </div>
+ </Modal>
+</QuickOpenModal>
+`;
+
+exports[`QuickOpenModal showErrorEmoji false when count + query 1`] = `
+<Provider
+ store={
+ Object {
+ "clearActions": [Function],
+ "dispatch": [Function],
+ "getActions": [Function],
+ "getState": [Function],
+ "replaceReducer": [Function],
+ "subscribe": [Function],
+ }
+ }
+>
+ <QuickOpenModal
+ blackBoxRanges={Object {}}
+ clearHighlightLineRange={[MockFunction]}
+ closeQuickOpen={[MockFunction]}
+ displayedSources={Array []}
+ enabled={true}
+ getFunctionSymbols={[MockFunction]}
+ highlightLineRange={[MockFunction]}
+ isOriginal={false}
+ openedTabUrls={Array []}
+ query="dasdasdas"
+ searchType="sources"
+ selectSpecificLocation={[MockFunction]}
+ selectedLocation={
+ Object {
+ "source": Object {
+ "id": "foo",
+ },
+ }
+ }
+ setQuickOpenQuery={[MockFunction]}
+ shortcutsModalEnabled={false}
+ thread="FakeThread"
+ toggleShortcutsModal={[MockFunction]}
+ >
+ <Modal
+ handleClose={[Function]}
+ >
+ <div
+ className="modal-wrapper"
+ onClick={[Function]}
+ >
+ <div
+ className="modal"
+ onClick={[Function]}
+ >
+ <Connect(SearchInput)
+ count={0}
+ expanded={false}
+ handleClose={[Function]}
+ hasPrefix={true}
+ isLoading={false}
+ onChange={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Go to file…"
+ query="dasdasdas"
+ searchKey="quickopen-search"
+ selectedItemId=""
+ showClose={false}
+ showErrorEmoji={true}
+ showExcludePatterns={false}
+ showSearchModifiers={false}
+ size="big"
+ summaryMsg=""
+ >
+ <SearchInput
+ count={0}
+ expanded={false}
+ handleClose={[Function]}
+ hasPrefix={true}
+ isLoading={false}
+ onChange={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Go to file…"
+ query="dasdasdas"
+ searchKey="quickopen-search"
+ searchOptions={
+ Object {
+ "caseSensitive": false,
+ "excludePatterns": "",
+ "regexMatch": false,
+ "wholeWord": false,
+ }
+ }
+ selectedItemId=""
+ setSearchOptions={[Function]}
+ showClose={false}
+ showErrorEmoji={true}
+ showExcludePatterns={false}
+ showSearchModifiers={false}
+ size="big"
+ summaryMsg=""
+ >
+ <div
+ className="search-outline"
+ >
+ <div
+ aria-expanded={false}
+ aria-haspopup="listbox"
+ aria-owns="result-list"
+ className="search-field big"
+ role="combobox"
+ >
+ <AccessibleImage
+ className="search"
+ >
+ <span
+ className="img search"
+ />
+ </AccessibleImage>
+ <input
+ aria-activedescendant=""
+ aria-autocomplete="list"
+ aria-controls="result-list"
+ className="empty"
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Go to file…"
+ spellCheck={false}
+ value="dasdasdas"
+ />
+ <div
+ className="search-buttons-bar"
+ />
+ </div>
+ </div>
+ </SearchInput>
+ </Connect(SearchInput)>
+ <ResultList
+ expanded={false}
+ items={Array []}
+ key="results"
+ role="listbox"
+ selectItem={[Function]}
+ selected={0}
+ size="big"
+ >
+ <ul
+ aria-live="polite"
+ className="result-list big"
+ id="result-list"
+ role="listbox"
+ />
+ </ResultList>
+ </div>
+ </div>
+ </Modal>
+ </QuickOpenModal>
+</Provider>
+`;
+
+exports[`QuickOpenModal showErrorEmoji false when goto numeric ':2222' 1`] = `
+<Provider
+ store={
+ Object {
+ "clearActions": [Function],
+ "dispatch": [Function],
+ "getActions": [Function],
+ "getState": [Function],
+ "replaceReducer": [Function],
+ "subscribe": [Function],
+ }
+ }
+>
+ <QuickOpenModal
+ blackBoxRanges={Object {}}
+ clearHighlightLineRange={[MockFunction]}
+ closeQuickOpen={[MockFunction]}
+ displayedSources={Array []}
+ enabled={true}
+ getFunctionSymbols={[MockFunction]}
+ highlightLineRange={[MockFunction]}
+ isOriginal={false}
+ openedTabUrls={Array []}
+ query=":2222"
+ searchType="goto"
+ selectSpecificLocation={[MockFunction]}
+ selectedLocation={
+ Object {
+ "source": Object {
+ "id": "foo",
+ },
+ }
+ }
+ setQuickOpenQuery={[MockFunction]}
+ shortcutsModalEnabled={false}
+ thread="FakeThread"
+ toggleShortcutsModal={[MockFunction]}
+ >
+ <Modal
+ handleClose={[Function]}
+ >
+ <div
+ className="modal-wrapper"
+ onClick={[Function]}
+ >
+ <div
+ className="modal"
+ onClick={[Function]}
+ >
+ <Connect(SearchInput)
+ count={0}
+ expanded={false}
+ handleClose={[Function]}
+ hasPrefix={true}
+ isLoading={false}
+ onChange={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Go to file…"
+ query=":2222"
+ searchKey="quickopen-search"
+ selectedItemId=""
+ showClose={false}
+ showErrorEmoji={false}
+ showExcludePatterns={false}
+ showSearchModifiers={false}
+ summaryMsg="Go to line"
+ >
+ <SearchInput
+ count={0}
+ expanded={false}
+ handleClose={[Function]}
+ hasPrefix={true}
+ isLoading={false}
+ onChange={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Go to file…"
+ query=":2222"
+ searchKey="quickopen-search"
+ searchOptions={
+ Object {
+ "caseSensitive": false,
+ "excludePatterns": "",
+ "regexMatch": false,
+ "wholeWord": false,
+ }
+ }
+ selectedItemId=""
+ setSearchOptions={[Function]}
+ showClose={false}
+ showErrorEmoji={false}
+ showExcludePatterns={false}
+ showSearchModifiers={false}
+ size=""
+ summaryMsg="Go to line"
+ >
+ <div
+ className="search-outline"
+ >
+ <div
+ aria-expanded={false}
+ aria-haspopup="listbox"
+ aria-owns="result-list"
+ className="search-field"
+ role="combobox"
+ >
+ <AccessibleImage
+ className="search"
+ >
+ <span
+ className="img search"
+ />
+ </AccessibleImage>
+ <input
+ aria-activedescendant=""
+ aria-autocomplete="list"
+ aria-controls="result-list"
+ className=""
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Go to file…"
+ spellCheck={false}
+ value=":2222"
+ />
+ <div
+ className="search-field-summary"
+ >
+ Go to line
+ </div>
+ <div
+ className="search-buttons-bar"
+ />
+ </div>
+ </div>
+ </SearchInput>
+ </Connect(SearchInput)>
+ </div>
+ </div>
+ </Modal>
+ </QuickOpenModal>
+</Provider>
+`;
+
+exports[`QuickOpenModal showErrorEmoji false when no query 1`] = `
+<Provider
+ store={
+ Object {
+ "clearActions": [Function],
+ "dispatch": [Function],
+ "getActions": [Function],
+ "getState": [Function],
+ "replaceReducer": [Function],
+ "subscribe": [Function],
+ }
+ }
+>
+ <QuickOpenModal
+ blackBoxRanges={Object {}}
+ clearHighlightLineRange={[MockFunction]}
+ closeQuickOpen={[MockFunction]}
+ displayedSources={Array []}
+ enabled={true}
+ getFunctionSymbols={[MockFunction]}
+ highlightLineRange={[MockFunction]}
+ isOriginal={false}
+ openedTabUrls={Array []}
+ query=""
+ searchType="other"
+ selectSpecificLocation={[MockFunction]}
+ selectedLocation={
+ Object {
+ "source": Object {
+ "id": "foo",
+ },
+ }
+ }
+ setQuickOpenQuery={[MockFunction]}
+ shortcutsModalEnabled={false}
+ thread="FakeThread"
+ toggleShortcutsModal={[MockFunction]}
+ >
+ <Modal
+ handleClose={[Function]}
+ >
+ <div
+ className="modal-wrapper"
+ onClick={[Function]}
+ >
+ <div
+ className="modal"
+ onClick={[Function]}
+ >
+ <Connect(SearchInput)
+ count={0}
+ expanded={false}
+ handleClose={[Function]}
+ hasPrefix={true}
+ isLoading={false}
+ onChange={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Go to file…"
+ query=""
+ searchKey="quickopen-search"
+ selectedItemId=""
+ showClose={false}
+ showErrorEmoji={false}
+ showExcludePatterns={false}
+ showSearchModifiers={false}
+ summaryMsg=""
+ >
+ <SearchInput
+ count={0}
+ expanded={false}
+ handleClose={[Function]}
+ hasPrefix={true}
+ isLoading={false}
+ onChange={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Go to file…"
+ query=""
+ searchKey="quickopen-search"
+ searchOptions={
+ Object {
+ "caseSensitive": false,
+ "excludePatterns": "",
+ "regexMatch": false,
+ "wholeWord": false,
+ }
+ }
+ selectedItemId=""
+ setSearchOptions={[Function]}
+ showClose={false}
+ showErrorEmoji={false}
+ showExcludePatterns={false}
+ showSearchModifiers={false}
+ size=""
+ summaryMsg=""
+ >
+ <div
+ className="search-outline"
+ >
+ <div
+ aria-expanded={false}
+ aria-haspopup="listbox"
+ aria-owns="result-list"
+ className="search-field"
+ role="combobox"
+ >
+ <AccessibleImage
+ className="search"
+ >
+ <span
+ className="img search"
+ />
+ </AccessibleImage>
+ <input
+ aria-activedescendant=""
+ aria-autocomplete="list"
+ aria-controls="result-list"
+ className=""
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Go to file…"
+ spellCheck={false}
+ value=""
+ />
+ <div
+ className="search-buttons-bar"
+ />
+ </div>
+ </div>
+ </SearchInput>
+ </Connect(SearchInput)>
+ <ResultList
+ expanded={false}
+ items={Array []}
+ key="results"
+ role="listbox"
+ selectItem={[Function]}
+ selected={0}
+ size="small"
+ >
+ <ul
+ aria-live="polite"
+ className="result-list small"
+ id="result-list"
+ role="listbox"
+ />
+ </ResultList>
+ </div>
+ </div>
+ </Modal>
+ </QuickOpenModal>
+</Provider>
+`;
+
+exports[`QuickOpenModal showErrorEmoji true when goto not numeric ':22k22' 1`] = `
+<Provider
+ store={
+ Object {
+ "clearActions": [Function],
+ "dispatch": [Function],
+ "getActions": [Function],
+ "getState": [Function],
+ "replaceReducer": [Function],
+ "subscribe": [Function],
+ }
+ }
+>
+ <QuickOpenModal
+ blackBoxRanges={Object {}}
+ clearHighlightLineRange={[MockFunction]}
+ closeQuickOpen={[MockFunction]}
+ displayedSources={Array []}
+ enabled={true}
+ getFunctionSymbols={[MockFunction]}
+ highlightLineRange={[MockFunction]}
+ isOriginal={false}
+ openedTabUrls={Array []}
+ query=":22k22"
+ searchType="goto"
+ selectSpecificLocation={[MockFunction]}
+ selectedLocation={
+ Object {
+ "source": Object {
+ "id": "foo",
+ },
+ }
+ }
+ setQuickOpenQuery={[MockFunction]}
+ shortcutsModalEnabled={false}
+ thread="FakeThread"
+ toggleShortcutsModal={[MockFunction]}
+ >
+ <Modal
+ handleClose={[Function]}
+ >
+ <div
+ className="modal-wrapper"
+ onClick={[Function]}
+ >
+ <div
+ className="modal"
+ onClick={[Function]}
+ >
+ <Connect(SearchInput)
+ count={0}
+ expanded={false}
+ handleClose={[Function]}
+ hasPrefix={true}
+ isLoading={false}
+ onChange={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Go to file…"
+ query=":22k22"
+ searchKey="quickopen-search"
+ selectedItemId=""
+ showClose={false}
+ showErrorEmoji={true}
+ showExcludePatterns={false}
+ showSearchModifiers={false}
+ summaryMsg="Go to line"
+ >
+ <SearchInput
+ count={0}
+ expanded={false}
+ handleClose={[Function]}
+ hasPrefix={true}
+ isLoading={false}
+ onChange={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Go to file…"
+ query=":22k22"
+ searchKey="quickopen-search"
+ searchOptions={
+ Object {
+ "caseSensitive": false,
+ "excludePatterns": "",
+ "regexMatch": false,
+ "wholeWord": false,
+ }
+ }
+ selectedItemId=""
+ setSearchOptions={[Function]}
+ showClose={false}
+ showErrorEmoji={true}
+ showExcludePatterns={false}
+ showSearchModifiers={false}
+ size=""
+ summaryMsg="Go to line"
+ >
+ <div
+ className="search-outline"
+ >
+ <div
+ aria-expanded={false}
+ aria-haspopup="listbox"
+ aria-owns="result-list"
+ className="search-field"
+ role="combobox"
+ >
+ <AccessibleImage
+ className="search"
+ >
+ <span
+ className="img search"
+ />
+ </AccessibleImage>
+ <input
+ aria-activedescendant=""
+ aria-autocomplete="list"
+ aria-controls="result-list"
+ className="empty"
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Go to file…"
+ spellCheck={false}
+ value=":22k22"
+ />
+ <div
+ className="search-field-summary"
+ >
+ Go to line
+ </div>
+ <div
+ className="search-buttons-bar"
+ />
+ </div>
+ </div>
+ </SearchInput>
+ </Connect(SearchInput)>
+ </div>
+ </div>
+ </Modal>
+ </QuickOpenModal>
+</Provider>
+`;
+
+exports[`QuickOpenModal showErrorEmoji true when no count + query 1`] = `
+<Provider
+ store={
+ Object {
+ "clearActions": [Function],
+ "dispatch": [Function],
+ "getActions": [Function],
+ "getState": [Function],
+ "replaceReducer": [Function],
+ "subscribe": [Function],
+ }
+ }
+>
+ <QuickOpenModal
+ blackBoxRanges={Object {}}
+ clearHighlightLineRange={[MockFunction]}
+ closeQuickOpen={[MockFunction]}
+ displayedSources={Array []}
+ enabled={true}
+ getFunctionSymbols={[MockFunction]}
+ highlightLineRange={[MockFunction]}
+ isOriginal={false}
+ openedTabUrls={Array []}
+ query="test"
+ searchType="other"
+ selectSpecificLocation={[MockFunction]}
+ selectedLocation={
+ Object {
+ "source": Object {
+ "id": "foo",
+ },
+ }
+ }
+ setQuickOpenQuery={[MockFunction]}
+ shortcutsModalEnabled={false}
+ thread="FakeThread"
+ toggleShortcutsModal={[MockFunction]}
+ >
+ <Modal
+ handleClose={[Function]}
+ >
+ <div
+ className="modal-wrapper"
+ onClick={[Function]}
+ >
+ <div
+ className="modal"
+ onClick={[Function]}
+ >
+ <Connect(SearchInput)
+ count={0}
+ expanded={false}
+ handleClose={[Function]}
+ hasPrefix={true}
+ isLoading={false}
+ onChange={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Go to file…"
+ query="test"
+ searchKey="quickopen-search"
+ selectedItemId=""
+ showClose={false}
+ showErrorEmoji={true}
+ showExcludePatterns={false}
+ showSearchModifiers={false}
+ summaryMsg=""
+ >
+ <SearchInput
+ count={0}
+ expanded={false}
+ handleClose={[Function]}
+ hasPrefix={true}
+ isLoading={false}
+ onChange={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Go to file…"
+ query="test"
+ searchKey="quickopen-search"
+ searchOptions={
+ Object {
+ "caseSensitive": false,
+ "excludePatterns": "",
+ "regexMatch": false,
+ "wholeWord": false,
+ }
+ }
+ selectedItemId=""
+ setSearchOptions={[Function]}
+ showClose={false}
+ showErrorEmoji={true}
+ showExcludePatterns={false}
+ showSearchModifiers={false}
+ size=""
+ summaryMsg=""
+ >
+ <div
+ className="search-outline"
+ >
+ <div
+ aria-expanded={false}
+ aria-haspopup="listbox"
+ aria-owns="result-list"
+ className="search-field"
+ role="combobox"
+ >
+ <AccessibleImage
+ className="search"
+ >
+ <span
+ className="img search"
+ />
+ </AccessibleImage>
+ <input
+ aria-activedescendant=""
+ aria-autocomplete="list"
+ aria-controls="result-list"
+ className="empty"
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Go to file…"
+ spellCheck={false}
+ value="test"
+ />
+ <div
+ className="search-buttons-bar"
+ />
+ </div>
+ </div>
+ </SearchInput>
+ </Connect(SearchInput)>
+ <ResultList
+ expanded={false}
+ items={Array []}
+ key="results"
+ role="listbox"
+ selectItem={[Function]}
+ selected={0}
+ size="small"
+ >
+ <ul
+ aria-live="polite"
+ className="result-list small"
+ id="result-list"
+ role="listbox"
+ />
+ </ResultList>
+ </div>
+ </div>
+ </Modal>
+ </QuickOpenModal>
+</Provider>
+`;
+
+exports[`QuickOpenModal shows loading loads with function type search 1`] = `
+<Modal
+ handleClose={[Function]}
+>
+ <Connect(SearchInput)
+ count={0}
+ expanded={false}
+ handleClose={[Function]}
+ hasPrefix={true}
+ isLoading={false}
+ onChange={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Go to file…"
+ query=""
+ searchKey="quickopen-search"
+ selectedItemId=""
+ showClose={false}
+ showErrorEmoji={false}
+ showExcludePatterns={false}
+ showSearchModifiers={false}
+ summaryMsg=""
+ />
+ <ResultList
+ expanded={false}
+ items={Array []}
+ key="results"
+ role="listbox"
+ selectItem={[Function]}
+ selected={0}
+ size="small"
+ />
+</Modal>
+`;
+
+exports[`QuickOpenModal updateResults on enable 1`] = `
+<Provider
+ store={
+ Object {
+ "clearActions": [Function],
+ "dispatch": [Function],
+ "getActions": [Function],
+ "getState": [Function],
+ "replaceReducer": [Function],
+ "subscribe": [Function],
+ }
+ }
+>
+ <QuickOpenModal
+ blackBoxRanges={Object {}}
+ clearHighlightLineRange={[MockFunction]}
+ closeQuickOpen={[MockFunction]}
+ displayedSources={Array []}
+ enabled={false}
+ getFunctionSymbols={[MockFunction]}
+ highlightLineRange={[MockFunction]}
+ isOriginal={false}
+ openedTabUrls={Array []}
+ query=""
+ searchType="sources"
+ selectSpecificLocation={[MockFunction]}
+ selectedLocation={
+ Object {
+ "source": Object {
+ "id": "foo",
+ },
+ }
+ }
+ setQuickOpenQuery={[MockFunction]}
+ shortcutsModalEnabled={false}
+ thread="FakeThread"
+ toggleShortcutsModal={[MockFunction]}
+ >
+ <Modal
+ handleClose={[Function]}
+ >
+ <div
+ className="modal-wrapper"
+ onClick={[Function]}
+ >
+ <div
+ className="modal"
+ onClick={[Function]}
+ >
+ <Connect(SearchInput)
+ count={0}
+ expanded={false}
+ handleClose={[Function]}
+ hasPrefix={true}
+ isLoading={false}
+ onChange={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Go to file…"
+ query=""
+ searchKey="quickopen-search"
+ selectedItemId=""
+ showClose={false}
+ showErrorEmoji={false}
+ showExcludePatterns={false}
+ showSearchModifiers={false}
+ size="big"
+ summaryMsg=""
+ >
+ <SearchInput
+ count={0}
+ expanded={false}
+ handleClose={[Function]}
+ hasPrefix={true}
+ isLoading={false}
+ onChange={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Go to file…"
+ query=""
+ searchKey="quickopen-search"
+ searchOptions={
+ Object {
+ "caseSensitive": false,
+ "excludePatterns": "",
+ "regexMatch": false,
+ "wholeWord": false,
+ }
+ }
+ selectedItemId=""
+ setSearchOptions={[Function]}
+ showClose={false}
+ showErrorEmoji={false}
+ showExcludePatterns={false}
+ showSearchModifiers={false}
+ size="big"
+ summaryMsg=""
+ >
+ <div
+ className="search-outline"
+ >
+ <div
+ aria-expanded={false}
+ aria-haspopup="listbox"
+ aria-owns="result-list"
+ className="search-field big"
+ role="combobox"
+ >
+ <AccessibleImage
+ className="search"
+ >
+ <span
+ className="img search"
+ />
+ </AccessibleImage>
+ <input
+ aria-activedescendant=""
+ aria-autocomplete="list"
+ aria-controls="result-list"
+ className=""
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Go to file…"
+ spellCheck={false}
+ value=""
+ />
+ <div
+ className="search-buttons-bar"
+ />
+ </div>
+ </div>
+ </SearchInput>
+ </Connect(SearchInput)>
+ <ResultList
+ expanded={false}
+ items={Array []}
+ key="results"
+ role="listbox"
+ selectItem={[Function]}
+ selected={0}
+ size="big"
+ >
+ <ul
+ aria-live="polite"
+ className="result-list big"
+ id="result-list"
+ role="listbox"
+ />
+ </ResultList>
+ </div>
+ </div>
+ </Modal>
+ </QuickOpenModal>
+</Provider>
+`;
+
+exports[`QuickOpenModal updateResults on enable 2`] = `
+<Provider
+ enabled={true}
+ store={
+ Object {
+ "clearActions": [Function],
+ "dispatch": [Function],
+ "getActions": [Function],
+ "getState": [Function],
+ "replaceReducer": [Function],
+ "subscribe": [Function],
+ }
+ }
+>
+ <QuickOpenModal
+ blackBoxRanges={Object {}}
+ clearHighlightLineRange={[MockFunction]}
+ closeQuickOpen={[MockFunction]}
+ displayedSources={Array []}
+ enabled={false}
+ getFunctionSymbols={[MockFunction]}
+ highlightLineRange={[MockFunction]}
+ isOriginal={false}
+ openedTabUrls={Array []}
+ query=""
+ searchType="sources"
+ selectSpecificLocation={[MockFunction]}
+ selectedLocation={
+ Object {
+ "source": Object {
+ "id": "foo",
+ },
+ }
+ }
+ setQuickOpenQuery={[MockFunction]}
+ shortcutsModalEnabled={false}
+ thread="FakeThread"
+ toggleShortcutsModal={[MockFunction]}
+ >
+ <Modal
+ handleClose={[Function]}
+ >
+ <div
+ className="modal-wrapper"
+ onClick={[Function]}
+ >
+ <div
+ className="modal"
+ onClick={[Function]}
+ >
+ <Connect(SearchInput)
+ count={0}
+ expanded={false}
+ handleClose={[Function]}
+ hasPrefix={true}
+ isLoading={false}
+ onChange={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Go to file…"
+ query=""
+ searchKey="quickopen-search"
+ selectedItemId=""
+ showClose={false}
+ showErrorEmoji={false}
+ showExcludePatterns={false}
+ showSearchModifiers={false}
+ size="big"
+ summaryMsg=""
+ >
+ <SearchInput
+ count={0}
+ expanded={false}
+ handleClose={[Function]}
+ hasPrefix={true}
+ isLoading={false}
+ onChange={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Go to file…"
+ query=""
+ searchKey="quickopen-search"
+ searchOptions={
+ Object {
+ "caseSensitive": false,
+ "excludePatterns": "",
+ "regexMatch": false,
+ "wholeWord": false,
+ }
+ }
+ selectedItemId=""
+ setSearchOptions={[Function]}
+ showClose={false}
+ showErrorEmoji={false}
+ showExcludePatterns={false}
+ showSearchModifiers={false}
+ size="big"
+ summaryMsg=""
+ >
+ <div
+ className="search-outline"
+ >
+ <div
+ aria-expanded={false}
+ aria-haspopup="listbox"
+ aria-owns="result-list"
+ className="search-field big"
+ role="combobox"
+ >
+ <AccessibleImage
+ className="search"
+ >
+ <span
+ className="img search"
+ />
+ </AccessibleImage>
+ <input
+ aria-activedescendant=""
+ aria-autocomplete="list"
+ aria-controls="result-list"
+ className=""
+ onBlur={[Function]}
+ onChange={[Function]}
+ onFocus={[Function]}
+ onKeyDown={[Function]}
+ placeholder="Go to file…"
+ spellCheck={false}
+ value=""
+ />
+ <div
+ className="search-buttons-bar"
+ />
+ </div>
+ </div>
+ </SearchInput>
+ </Connect(SearchInput)>
+ <ResultList
+ expanded={false}
+ items={Array []}
+ key="results"
+ role="listbox"
+ selectItem={[Function]}
+ selected={0}
+ size="big"
+ >
+ <ul
+ aria-live="polite"
+ className="result-list big"
+ id="result-list"
+ role="listbox"
+ />
+ </ResultList>
+ </div>
+ </div>
+ </Modal>
+ </QuickOpenModal>
+</Provider>
+`;
diff --git a/devtools/client/debugger/src/components/test/__snapshots__/WelcomeBox.spec.js.snap b/devtools/client/debugger/src/components/test/__snapshots__/WelcomeBox.spec.js.snap
new file mode 100644
index 0000000000..9828e88ef4
--- /dev/null
+++ b/devtools/client/debugger/src/components/test/__snapshots__/WelcomeBox.spec.js.snap
@@ -0,0 +1,67 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`WelomeBox renders with default values 1`] = `
+<div
+ className="welcomebox"
+>
+ <div
+ className="alignlabel"
+ >
+ <div
+ className="shortcutFunction"
+ >
+ <p
+ className="welcomebox__searchSources"
+ onClick={[Function]}
+ role="button"
+ tabIndex="0"
+ >
+ <span
+ className="shortcutKey"
+ >
+ Ctrl+P
+ </span>
+ <span
+ className="shortcutLabel"
+ >
+ Go to file
+ </span>
+ </p>
+ <p
+ className="welcomebox__searchProject"
+ onClick={[Function]}
+ role="button"
+ tabIndex="0"
+ >
+ <span
+ className="shortcutKey"
+ >
+ Ctrl+Shift+F
+ </span>
+ <span
+ className="shortcutLabel"
+ >
+ Find in files
+ </span>
+ </p>
+ <p
+ className="welcomebox__allShortcuts"
+ onClick={[Function]}
+ role="button"
+ tabIndex="0"
+ >
+ <span
+ className="shortcutKey"
+ >
+ Ctrl+/
+ </span>
+ <span
+ className="shortcutLabel"
+ >
+ Show all shortcuts
+ </span>
+ </p>
+ </div>
+ </div>
+</div>
+`;
diff --git a/devtools/client/debugger/src/components/test/__snapshots__/WhyPaused.spec.js.snap b/devtools/client/debugger/src/components/test/__snapshots__/WhyPaused.spec.js.snap
new file mode 100644
index 0000000000..0762a0b69d
--- /dev/null
+++ b/devtools/client/debugger/src/components/test/__snapshots__/WhyPaused.spec.js.snap
@@ -0,0 +1,103 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`WhyPaused should pause reason with message 1`] = `
+<LocalizationProvider
+ bundles={Array []}
+>
+ <div
+ className="pane why-paused"
+ >
+ <div>
+ <div
+ className="info icon"
+ >
+ <AccessibleImage
+ className="info"
+ />
+ </div>
+ <div
+ className="pause reason"
+ >
+ <Localized
+ id="whypaused-breakpoint"
+ />
+ <div
+ className="message"
+ >
+ bla is hit
+ </div>
+ </div>
+ </div>
+ </div>
+</LocalizationProvider>
+`;
+
+exports[`WhyPaused should show an empty div when there is no pause reason 1`] = `
+<div
+ className=""
+/>
+`;
+
+exports[`WhyPaused should show pause reason with exception details 1`] = `
+<LocalizationProvider
+ bundles={Array []}
+>
+ <div
+ className="pane why-paused"
+ >
+ <div>
+ <div
+ className="info icon"
+ >
+ <AccessibleImage
+ className="info"
+ />
+ </div>
+ <div
+ className="pause reason"
+ >
+ <Localized
+ id="whypaused-exception"
+ />
+ <div
+ className="message warning"
+ >
+ ReferenceError: o is not defined
+ </div>
+ </div>
+ </div>
+ </div>
+</LocalizationProvider>
+`;
+
+exports[`WhyPaused should show pause reason with exception string 1`] = `
+<LocalizationProvider
+ bundles={Array []}
+>
+ <div
+ className="pane why-paused"
+ >
+ <div>
+ <div
+ className="info icon"
+ >
+ <AccessibleImage
+ className="info"
+ />
+ </div>
+ <div
+ className="pause reason"
+ >
+ <Localized
+ id="whypaused-exception"
+ />
+ <div
+ className="message warning"
+ >
+ Not Available
+ </div>
+ </div>
+ </div>
+ </div>
+</LocalizationProvider>
+`;
diff --git a/devtools/client/debugger/src/components/variables.css b/devtools/client/debugger/src/components/variables.css
new file mode 100644
index 0000000000..628c590714
--- /dev/null
+++ b/devtools/client/debugger/src/components/variables.css
@@ -0,0 +1,45 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+:root {
+ /* header height is 28px + 1px for its border */
+ --editor-header-height: 29px;
+ /* footer height is 24px + 1px for its border */
+ --editor-footer-height: 25px;
+ /* searchbar height is 24px + 1px for its top border */
+ --editor-searchbar-height: 25px;
+ /* Remove once https://bugzilla.mozilla.org/show_bug.cgi?id=1520440 lands */
+ --theme-code-line-height: calc(15 / 11);
+ /* Background and text colors and opacity for skipped breakpoint panes */
+ --skip-pausing-background-color: var(--theme-toolbar-hover);
+ --skip-pausing-opacity: 0.6;
+ --skip-pausing-color: var(--theme-body-color);
+}
+
+:root.theme-light,
+:root .theme-light {
+ --search-overlays-semitransparent: rgba(221, 225, 228, 0.66);
+ --popup-shadow-color: #d0d0d0;
+ --theme-inline-preview-background: rgba(192, 105, 255, 0.05);
+ --theme-inline-preview-border-color: #ebd1ff;
+ --theme-inline-preview-label-color: #6300a6;
+ --theme-inline-preview-label-background: rgb(244, 230, 255);
+}
+
+:root.theme-dark,
+:root .theme-dark {
+ --search-overlays-semitransparent: rgba(42, 46, 56, 0.66);
+ --popup-shadow-color: #5c667b;
+ --theme-inline-preview-background: rgba(192, 105, 255, 0.05);
+ --theme-inline-preview-border-color: #47326c;
+ --theme-inline-preview-label-color: #dfccff;
+ --theme-inline-preview-label-background: #3f2e5f;
+}
+
+/* Animations */
+
+@keyframes spin {
+ from { transform: rotate(0deg); }
+ to { transform: rotate(360deg); }
+}
diff --git a/devtools/client/debugger/src/constants.js b/devtools/client/debugger/src/constants.js
new file mode 100644
index 0000000000..67b6ca5362
--- /dev/null
+++ b/devtools/client/debugger/src/constants.js
@@ -0,0 +1,15 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+export const searchKeys = {
+ PROJECT_SEARCH: "project-search",
+ FILE_SEARCH: "file-search",
+ QUICKOPEN_SEARCH: "quickopen-search",
+};
+
+export const primaryPaneTabs = {
+ SOURCES: "sources",
+ OUTLINE: "outline",
+ PROJECT_SEARCH: "project",
+};
diff --git a/devtools/client/debugger/src/context-menu/menu.js b/devtools/client/debugger/src/context-menu/menu.js
new file mode 100644
index 0000000000..3478c9071c
--- /dev/null
+++ b/devtools/client/debugger/src/context-menu/menu.js
@@ -0,0 +1,43 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+const Menu = require("resource://devtools/client/framework/menu.js");
+const MenuItem = require("resource://devtools/client/framework/menu-item.js");
+
+export function showMenu(evt, items) {
+ if (items.length === 0) {
+ return;
+ }
+
+ const menu = new Menu();
+ items
+ .filter(item => item.visible === undefined || item.visible === true)
+ .forEach(item => {
+ const menuItem = new MenuItem(item);
+ menuItem.submenu = createSubMenu(item.submenu);
+ menu.append(menuItem);
+ });
+
+ menu.popup(evt.screenX, evt.screenY, window.parent.document);
+}
+
+function createSubMenu(subItems) {
+ if (subItems) {
+ const subMenu = new Menu();
+ subItems.forEach(subItem => {
+ subMenu.append(new MenuItem(subItem));
+ });
+ return subMenu;
+ }
+ return null;
+}
+
+export function buildMenu(items) {
+ return items
+ .map(itm => {
+ const hide = typeof itm.hidden === "function" ? itm.hidden() : itm.hidden;
+ return hide ? null : itm.item;
+ })
+ .filter(itm => itm !== null);
+}
diff --git a/devtools/client/debugger/src/context-menu/moz.build b/devtools/client/debugger/src/context-menu/moz.build
new file mode 100644
index 0000000000..48089353f1
--- /dev/null
+++ b/devtools/client/debugger/src/context-menu/moz.build
@@ -0,0 +1,8 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+CompiledModules(
+ "menu.js",
+)
diff --git a/devtools/client/debugger/src/debugger.css b/devtools/client/debugger/src/debugger.css
new file mode 100644
index 0000000000..0e7f80d694
--- /dev/null
+++ b/devtools/client/debugger/src/debugger.css
@@ -0,0 +1,57 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/* Shared imports */
+@import url("chrome://devtools/content/shared/components/AppErrorBoundary.css");
+@import url("chrome://devtools/content/shared/components/SearchModifiers.css");
+
+/* Devtools imports */
+@import url("chrome://devtools/content/debugger/src/components/variables.css");
+@import url("chrome://devtools/content/debugger/src/components/App.css");
+@import url("chrome://devtools/content/debugger/src/components/shared/AccessibleImage.css");
+@import url("chrome://devtools/content/debugger/src/components/shared/Accordion.css");
+@import url("chrome://devtools/content/debugger/src/components/shared/Badge.css");
+@import url("chrome://devtools/content/debugger/src/components/shared/BracketArrow.css");
+@import url("chrome://devtools/content/debugger/src/components/shared/Button/styles/CloseButton.css");
+@import url("chrome://devtools/content/debugger/src/components/shared/Button/styles/CommandBarButton.css");
+@import url("chrome://devtools/content/debugger/src/components/shared/Button/styles/PaneToggleButton.css");
+@import url("chrome://devtools/content/debugger/src/components/shared/Dropdown.css");
+@import url("chrome://devtools/content/debugger/src/components/shared/menu.css");
+@import url("chrome://devtools/content/debugger/src/components/shared/Modal.css");
+@import url("chrome://devtools/content/debugger/src/components/shared/Popover.css");
+@import url("chrome://devtools/content/debugger/src/components/shared/PreviewFunction.css");
+@import url("chrome://devtools/content/debugger/src/components/shared/ResultList.css");
+@import url("chrome://devtools/content/debugger/src/components/shared/SearchInput.css");
+@import url("chrome://devtools/content/debugger/src/components/shared/SourceIcon.css");
+@import url("chrome://devtools/content/debugger/src/components/Editor/Breakpoints.css");
+@import url("chrome://devtools/content/debugger/src/components/Editor/ConditionalPanel.css");
+@import url("chrome://devtools/content/debugger/src/components/Editor/Editor.css");
+@import url("chrome://devtools/content/debugger/src/components/Editor/Footer.css");
+@import url("chrome://devtools/content/debugger/src/components/Editor/InlinePreview.css");
+@import url("chrome://devtools/content/debugger/src/components/Editor/Preview.css");
+@import url("chrome://devtools/content/debugger/src/components/Editor/Preview/Popup.css");
+@import url("chrome://devtools/content/debugger/src/components/Editor/SearchInFileBar.css");
+@import url("chrome://devtools/content/debugger/src/components/Editor/Tabs.css");
+@import url("chrome://devtools/content/debugger/src/components/PrimaryPanes/Outline.css");
+@import url("chrome://devtools/content/debugger/src/components/PrimaryPanes/OutlineFilter.css");
+@import url("chrome://devtools/content/debugger/src/components/PrimaryPanes/ProjectSearch.css");
+@import url("chrome://devtools/content/debugger/src/components/PrimaryPanes/Sources.css");
+@import url("chrome://devtools/content/debugger/src/components/QuickOpenModal.css");
+@import url("chrome://devtools/content/debugger/src/components/SecondaryPanes/Breakpoints/Breakpoints.css");
+@import url("chrome://devtools/content/debugger/src/components/SecondaryPanes/CommandBar.css");
+@import url("chrome://devtools/content/debugger/src/components/SecondaryPanes/EventListeners.css");
+@import url("chrome://devtools/content/debugger/src/components/SecondaryPanes/DOMMutationBreakpoints.css");
+@import url("chrome://devtools/content/debugger/src/components/SecondaryPanes/Expressions.css");
+@import url("chrome://devtools/content/debugger/src/components/SecondaryPanes/Frames/Frames.css");
+@import url("chrome://devtools/content/debugger/src/components/SecondaryPanes/Frames/Group.css");
+@import url("chrome://devtools/content/debugger/src/components/SecondaryPanes/Scopes.css");
+@import url("chrome://devtools/content/debugger/src/components/SecondaryPanes/SecondaryPanes.css");
+@import url("chrome://devtools/content/debugger/src/components/SecondaryPanes/WhyPaused.css");
+@import url("chrome://devtools/content/debugger/src/components/SecondaryPanes/Threads.css");
+@import url("chrome://devtools/content/debugger/src/components/SecondaryPanes/XHRBreakpoints.css");
+@import url("chrome://devtools/content/debugger/src/components/ShortcutsModal.css");
+@import url("chrome://devtools/content/debugger/src/components/WelcomeBox.css");
+@import url("chrome://devtools/content/debugger/src/utils/editor/source-editor.css");
+
+@import url("chrome://devtools/content/shared/components/splitter/SplitBox.css");
diff --git a/devtools/client/debugger/src/main.js b/devtools/client/debugger/src/main.js
new file mode 100644
index 0000000000..83a6c1e6fc
--- /dev/null
+++ b/devtools/client/debugger/src/main.js
@@ -0,0 +1,149 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import * as firefox from "./client/firefox";
+
+import { asyncStore, verifyPrefSchema, prefs } from "./utils/prefs";
+import { setupHelper } from "./utils/dbg";
+import { setToolboxTelemetry } from "./utils/telemetry";
+
+import {
+ bootstrapApp,
+ bootstrapStore,
+ bootstrapWorkers,
+ unmountRoot,
+ teardownWorkers,
+} from "./utils/bootstrap";
+
+import { initialBreakpointsState } from "./reducers/breakpoints";
+import { initialSourcesState } from "./reducers/sources";
+import { initialUIState } from "./reducers/ui";
+import { initialSourceBlackBoxState } from "./reducers/source-blackbox";
+
+const {
+ sanitizeBreakpoints,
+} = require("resource://devtools/client/shared/thread-utils.js");
+
+async function syncBreakpoints() {
+ const breakpoints = await asyncStore.pendingBreakpoints;
+ const breakpointValues = Object.values(sanitizeBreakpoints(breakpoints));
+ return Promise.all(
+ breakpointValues.map(({ disabled, options, generatedLocation }) => {
+ if (disabled) {
+ return Promise.resolve();
+ }
+ // Set the breakpoint on the server using the generated location as generated
+ // sources are known on server, not original sources.
+ return firefox.clientCommands.setBreakpoint(generatedLocation, options);
+ })
+ );
+}
+
+async function syncXHRBreakpoints() {
+ const breakpoints = await asyncStore.xhrBreakpoints;
+ return Promise.all(
+ breakpoints.map(({ path, method, disabled }) => {
+ if (!disabled) {
+ firefox.clientCommands.setXHRBreakpoint(path, method);
+ }
+ })
+ );
+}
+
+function setPauseOnDebuggerStatement() {
+ const { pauseOnDebuggerStatement } = prefs;
+ return firefox.clientCommands.pauseOnDebuggerStatement(
+ pauseOnDebuggerStatement
+ );
+}
+
+function setPauseOnExceptions() {
+ const { pauseOnExceptions, pauseOnCaughtException } = prefs;
+ return firefox.clientCommands.pauseOnExceptions(
+ pauseOnExceptions,
+ pauseOnCaughtException
+ );
+}
+
+async function loadInitialState(commands, toolbox) {
+ const pendingBreakpoints = sanitizeBreakpoints(
+ await asyncStore.pendingBreakpoints
+ );
+ const tabs = { tabs: await asyncStore.tabs };
+ const xhrBreakpoints = await asyncStore.xhrBreakpoints;
+ const blackboxedRanges = await asyncStore.blackboxedRanges;
+ const eventListenerBreakpoints = await asyncStore.eventListenerBreakpoints;
+ const breakpoints = initialBreakpointsState(xhrBreakpoints);
+ const sourceBlackBox = initialSourceBlackBoxState({ blackboxedRanges });
+ const sources = initialSourcesState();
+ const ui = initialUIState();
+
+ return {
+ pendingBreakpoints,
+ tabs,
+ breakpoints,
+ eventListenerBreakpoints,
+ sources,
+ sourceBlackBox,
+ ui,
+ };
+}
+
+export async function bootstrap({
+ commands,
+ fluentBundles,
+ resourceCommand,
+ workers: panelWorkers,
+ panel,
+}) {
+ verifyPrefSchema();
+
+ // Set telemetry at the very beginning as some actions fired from this function might
+ // record events.
+ setToolboxTelemetry(panel.toolbox.telemetry);
+
+ const initialState = await loadInitialState(commands, panel.toolbox);
+ const workers = bootstrapWorkers(panelWorkers);
+
+ const { store, actions, selectors } = bootstrapStore(
+ firefox.clientCommands,
+ workers,
+ panel,
+ initialState
+ );
+
+ const connected = firefox.onConnect(
+ commands,
+ resourceCommand,
+ actions,
+ store
+ );
+
+ await syncBreakpoints();
+ await syncXHRBreakpoints();
+ await setPauseOnDebuggerStatement();
+ await setPauseOnExceptions();
+
+ setupHelper({
+ store,
+ actions,
+ selectors,
+ workers,
+ targetCommand: commands.targetCommand,
+ client: firefox.clientCommands,
+ });
+
+ bootstrapApp(store, panel.getToolboxStore(), {
+ fluentBundles,
+ toolboxDoc: panel.panelWin.parent.document,
+ });
+ await connected;
+ return { store, actions, selectors, client: firefox.clientCommands };
+}
+
+export async function destroy() {
+ firefox.onDisconnect();
+ unmountRoot();
+ teardownWorkers();
+}
diff --git a/devtools/client/debugger/src/moz.build b/devtools/client/debugger/src/moz.build
new file mode 100644
index 0000000000..44336626f2
--- /dev/null
+++ b/devtools/client/debugger/src/moz.build
@@ -0,0 +1,20 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DIRS += [
+ "actions",
+ "client",
+ "components",
+ "context-menu",
+ "reducers",
+ "selectors",
+ "utils",
+ "workers",
+]
+
+CompiledModules(
+ "constants.js",
+ "main.js",
+)
diff --git a/devtools/client/debugger/src/reducers/ast.js b/devtools/client/debugger/src/reducers/ast.js
new file mode 100644
index 0000000000..22ae3e3d23
--- /dev/null
+++ b/devtools/client/debugger/src/reducers/ast.js
@@ -0,0 +1,92 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Ast reducer
+ * @module reducers/ast
+ */
+
+import { makeBreakpointId } from "../utils/breakpoint/index";
+
+export function initialASTState() {
+ return {
+ // We are using mutable objects as we never return the dictionary as-is from the selectors
+ // but only their values.
+ // Note that all these dictionaries are storing objects as values
+ // which all will have a threadActorId attribute.
+
+ // We have two maps, a first one for original sources.
+ // This is keyed by source id.
+ mutableOriginalSourcesSymbols: {},
+
+ // And another one, for generated sources.
+ // This is keyed by source actor id.
+ mutableSourceActorSymbols: {},
+
+ mutableInScopeLines: {},
+ };
+}
+
+function update(state = initialASTState(), action) {
+ switch (action.type) {
+ case "SET_SYMBOLS": {
+ const { location } = action;
+ if (action.status === "start") {
+ return state;
+ }
+
+ const entry = {
+ value: action.value,
+ threadActorId: location.sourceActor?.thread,
+ };
+ if (location.source.isOriginal) {
+ state.mutableOriginalSourcesSymbols[location.source.id] = entry;
+ } else {
+ if (!location.sourceActor) {
+ throw new Error(
+ "Expects a location with a source actor when adding symbols for non-original sources"
+ );
+ }
+ state.mutableSourceActorSymbols[location.sourceActor.id] = entry;
+ }
+ return {
+ ...state,
+ };
+ }
+
+ case "IN_SCOPE_LINES": {
+ state.mutableInScopeLines[makeBreakpointId(action.location)] = {
+ lines: action.lines,
+ threadActorId: action.location.sourceActor?.thread,
+ };
+ return {
+ ...state,
+ };
+ }
+
+ case "RESUME": {
+ return { ...state, mutableInScopeLines: {} };
+ }
+
+ case "REMOVE_THREAD": {
+ function clearDict(dict, threadId) {
+ for (const key in dict) {
+ if (dict[key].threadActorId == threadId) {
+ delete dict[key];
+ }
+ }
+ }
+ clearDict(state.mutableSourceActorSymbols, action.threadActorID);
+ clearDict(state.mutableOriginalSourcesSymbols, action.threadActorID);
+ clearDict(state.mutableInScopeLines, action.threadActorID);
+ return { ...state };
+ }
+
+ default: {
+ return state;
+ }
+ }
+}
+
+export default update;
diff --git a/devtools/client/debugger/src/reducers/breakpoints.js b/devtools/client/debugger/src/reducers/breakpoints.js
new file mode 100644
index 0000000000..2a35cda9ef
--- /dev/null
+++ b/devtools/client/debugger/src/reducers/breakpoints.js
@@ -0,0 +1,149 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Breakpoints reducer
+ * @module reducers/breakpoints
+ */
+
+import { makeBreakpointId } from "../utils/breakpoint/index";
+
+export function initialBreakpointsState(xhrBreakpoints = []) {
+ return {
+ breakpoints: {},
+ xhrBreakpoints,
+ };
+}
+
+function update(state = initialBreakpointsState(), action) {
+ switch (action.type) {
+ case "SET_BREAKPOINT": {
+ if (action.status === "start") {
+ return setBreakpoint(state, action);
+ }
+ return state;
+ }
+
+ case "REMOVE_BREAKPOINT": {
+ if (action.status === "start") {
+ return removeBreakpoint(state, action);
+ }
+ return state;
+ }
+
+ case "CLEAR_BREAKPOINTS": {
+ return { ...state, breakpoints: {} };
+ }
+
+ case "REMOVE_THREAD": {
+ return removeBreakpointsForSources(state, action.sources);
+ }
+
+ case "SET_XHR_BREAKPOINT": {
+ return addXHRBreakpoint(state, action);
+ }
+
+ case "REMOVE_XHR_BREAKPOINT": {
+ return removeXHRBreakpoint(state, action);
+ }
+
+ case "UPDATE_XHR_BREAKPOINT": {
+ return updateXHRBreakpoint(state, action);
+ }
+
+ case "ENABLE_XHR_BREAKPOINT": {
+ return updateXHRBreakpoint(state, action);
+ }
+
+ case "DISABLE_XHR_BREAKPOINT": {
+ return updateXHRBreakpoint(state, action);
+ }
+ case "CLEAR_XHR_BREAKPOINTS": {
+ if (action.status == "start") {
+ return state;
+ }
+ return { ...state, xhrBreakpoints: [] };
+ }
+ }
+
+ return state;
+}
+
+function addXHRBreakpoint(state, action) {
+ const { xhrBreakpoints } = state;
+ const { breakpoint } = action;
+ const { path, method } = breakpoint;
+
+ const existingBreakpointIndex = state.xhrBreakpoints.findIndex(
+ bp => bp.path === path && bp.method === method
+ );
+
+ if (existingBreakpointIndex === -1) {
+ return {
+ ...state,
+ xhrBreakpoints: [...xhrBreakpoints, breakpoint],
+ };
+ } else if (xhrBreakpoints[existingBreakpointIndex] !== breakpoint) {
+ const newXhrBreakpoints = [...xhrBreakpoints];
+ newXhrBreakpoints[existingBreakpointIndex] = breakpoint;
+ return {
+ ...state,
+ xhrBreakpoints: newXhrBreakpoints,
+ };
+ }
+
+ return state;
+}
+
+function removeXHRBreakpoint(state, action) {
+ const { breakpoint } = action;
+ const { xhrBreakpoints } = state;
+
+ if (action.status === "start") {
+ return state;
+ }
+
+ return {
+ ...state,
+ xhrBreakpoints: xhrBreakpoints.filter(
+ bp => bp.path !== breakpoint.path || bp.method !== breakpoint.method
+ ),
+ };
+}
+
+function updateXHRBreakpoint(state, action) {
+ const { breakpoint, index } = action;
+ const { xhrBreakpoints } = state;
+ const newXhrBreakpoints = [...xhrBreakpoints];
+ newXhrBreakpoints[index] = breakpoint;
+ return {
+ ...state,
+ xhrBreakpoints: newXhrBreakpoints,
+ };
+}
+
+function setBreakpoint(state, { breakpoint }) {
+ const id = makeBreakpointId(breakpoint.location);
+ const breakpoints = { ...state.breakpoints, [id]: breakpoint };
+ return { ...state, breakpoints };
+}
+
+function removeBreakpoint(state, { breakpoint }) {
+ const id = makeBreakpointId(breakpoint.location);
+ const breakpoints = { ...state.breakpoints };
+ delete breakpoints[id];
+ return { ...state, breakpoints };
+}
+
+function removeBreakpointsForSources(state, sources) {
+ const remainingBreakpoints = {};
+ for (const [id, breakpoint] of Object.entries(state.breakpoints)) {
+ if (!sources.includes(breakpoint.location.source)) {
+ remainingBreakpoints[id] = breakpoint;
+ }
+ }
+ return { ...state, breakpoints: remainingBreakpoints };
+}
+
+export default update;
diff --git a/devtools/client/debugger/src/reducers/event-listeners.js b/devtools/client/debugger/src/reducers/event-listeners.js
new file mode 100644
index 0000000000..d0418b9ece
--- /dev/null
+++ b/devtools/client/debugger/src/reducers/event-listeners.js
@@ -0,0 +1,38 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { prefs } from "../utils/prefs";
+
+export function initialEventListenerState() {
+ return {
+ active: [],
+ categories: [],
+ expanded: [],
+ logEventBreakpoints: prefs.logEventBreakpoints,
+ };
+}
+
+function update(state = initialEventListenerState(), action) {
+ switch (action.type) {
+ case "UPDATE_EVENT_LISTENERS":
+ return { ...state, active: action.active };
+
+ case "RECEIVE_EVENT_LISTENER_TYPES":
+ return { ...state, categories: action.categories };
+
+ case "UPDATE_EVENT_LISTENER_EXPANDED":
+ return { ...state, expanded: action.expanded };
+
+ case "TOGGLE_EVENT_LISTENERS": {
+ const { logEventBreakpoints } = action;
+ prefs.logEventBreakpoints = logEventBreakpoints;
+ return { ...state, logEventBreakpoints };
+ }
+
+ default:
+ return state;
+ }
+}
+
+export default update;
diff --git a/devtools/client/debugger/src/reducers/exceptions.js b/devtools/client/debugger/src/reducers/exceptions.js
new file mode 100644
index 0000000000..a4a26de5df
--- /dev/null
+++ b/devtools/client/debugger/src/reducers/exceptions.js
@@ -0,0 +1,78 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Exceptions reducer
+ * @module reducers/exceptionss
+ */
+
+export function initialExceptionsState() {
+ return {
+ // Store exception objects created by actions/exceptions.js's addExceptionFromResources()
+ // This is keyed by source actor id, and values are arrays of exception objects.
+ mutableExceptionsMap: new Map(),
+ };
+}
+
+function update(state = initialExceptionsState(), action) {
+ switch (action.type) {
+ case "ADD_EXCEPTION":
+ return updateExceptions(state, action);
+ case "REMOVE_THREAD": {
+ return removeExceptionsFromThread(state, action);
+ }
+ }
+ return state;
+}
+
+function updateExceptions(state, action) {
+ const { mutableExceptionsMap } = state;
+ const { exception } = action;
+ const { sourceActorId } = exception;
+
+ let exceptions = mutableExceptionsMap.get(sourceActorId);
+ if (!exceptions) {
+ exceptions = [];
+ mutableExceptionsMap.set(sourceActorId, exceptions);
+ } else if (
+ exceptions.some(({ lineNumber, columnNumber }) => {
+ return (
+ lineNumber == exception.lineNumber &&
+ columnNumber == exception.columnNumber
+ );
+ })
+ ) {
+ // Avoid adding duplicated exceptions for the same line/column
+ return state;
+ }
+
+ // As these arrays are only used by getSelectedSourceExceptions selector method,
+ // which coalesce multiple arrays and always return new array instance,
+ // it isn't important to clone these array in case of modification.
+ exceptions.push(exception);
+
+ return {
+ ...state,
+ };
+}
+
+function removeExceptionsFromThread(state, action) {
+ const { mutableExceptionsMap } = state;
+ const { threadActorID } = action;
+ const sizeBefore = mutableExceptionsMap.size;
+ for (const [sourceActorId, exceptions] of mutableExceptionsMap) {
+ // All exceptions relates to the same source actor, and so, the same thread actor.
+ if (exceptions[0].threadActorId == threadActorID) {
+ mutableExceptionsMap.delete(sourceActorId);
+ }
+ }
+ if (sizeBefore != mutableExceptionsMap.size) {
+ return {
+ ...state,
+ };
+ }
+ return state;
+}
+
+export default update;
diff --git a/devtools/client/debugger/src/reducers/expressions.js b/devtools/client/debugger/src/reducers/expressions.js
new file mode 100644
index 0000000000..9af13523e4
--- /dev/null
+++ b/devtools/client/debugger/src/reducers/expressions.js
@@ -0,0 +1,124 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Expressions reducer
+ * @module reducers/expressions
+ */
+
+import { prefs } from "../utils/prefs";
+
+export const initialExpressionState = () => ({
+ expressions: restoreExpressions(),
+ autocompleteMatches: {},
+ currentAutocompleteInput: null,
+});
+
+function update(state = initialExpressionState(), action) {
+ switch (action.type) {
+ case "ADD_EXPRESSION":
+ return appendExpressionToList(state, {
+ input: action.input,
+ value: null,
+ updating: true,
+ });
+
+ case "UPDATE_EXPRESSION":
+ const key = action.expression.input;
+ return updateExpressionInList(state, key, {
+ input: action.input,
+ value: null,
+ updating: true,
+ });
+
+ case "EVALUATE_EXPRESSION":
+ return updateExpressionInList(state, action.input, {
+ input: action.input,
+ value: action.value,
+ updating: false,
+ });
+
+ case "EVALUATE_EXPRESSIONS":
+ const { inputs, results } = action;
+
+ return inputs.reduce(
+ (_state, input, index) =>
+ updateExpressionInList(_state, input, {
+ input,
+ value: results[index],
+ updating: false,
+ }),
+ state
+ );
+
+ case "DELETE_EXPRESSION":
+ return deleteExpression(state, action.input);
+
+ case "AUTOCOMPLETE":
+ const { matchProp, matches } = action.result;
+
+ return {
+ ...state,
+ currentAutocompleteInput: matchProp,
+ autocompleteMatches: {
+ ...state.autocompleteMatches,
+ [matchProp]: matches,
+ },
+ };
+
+ case "CLEAR_AUTOCOMPLETE":
+ return {
+ ...state,
+ autocompleteMatches: {},
+ currentAutocompleteInput: "",
+ };
+ }
+
+ return state;
+}
+
+function restoreExpressions() {
+ const exprs = prefs.expressions;
+ if (!exprs.length) {
+ return [];
+ }
+
+ return exprs;
+}
+
+function storeExpressions({ expressions }) {
+ // Return the expressions without the `value` property
+ prefs.expressions = expressions.map(({ input, updating }) => ({
+ input,
+ updating,
+ }));
+}
+
+function appendExpressionToList(state, value) {
+ const newState = { ...state, expressions: [...state.expressions, value] };
+
+ storeExpressions(newState);
+ return newState;
+}
+
+function updateExpressionInList(state, key, value) {
+ const list = [...state.expressions];
+ const index = list.findIndex(e => e.input == key);
+ list[index] = value;
+
+ const newState = { ...state, expressions: list };
+ storeExpressions(newState);
+ return newState;
+}
+
+function deleteExpression(state, input) {
+ const list = [...state.expressions];
+ const index = list.findIndex(e => e.input == input);
+ list.splice(index, 1);
+ const newState = { ...state, expressions: list };
+ storeExpressions(newState);
+ return newState;
+}
+
+export default update;
diff --git a/devtools/client/debugger/src/reducers/index.js b/devtools/client/debugger/src/reducers/index.js
new file mode 100644
index 0000000000..b254a5b176
--- /dev/null
+++ b/devtools/client/debugger/src/reducers/index.js
@@ -0,0 +1,76 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Reducer index
+ * @module reducers/index
+ */
+
+import expressions, { initialExpressionState } from "./expressions";
+import sourceActors, { initialSourceActorsState } from "./source-actors";
+import sources, { initialSourcesState } from "./sources";
+import sourceBlackBox, { initialSourceBlackBoxState } from "./source-blackbox";
+import sourcesContent, { initialSourcesContentState } from "./sources-content";
+import tabs, { initialTabState } from "./tabs";
+import breakpoints, { initialBreakpointsState } from "./breakpoints";
+import pendingBreakpoints from "./pending-breakpoints";
+import pause, { initialPauseState } from "./pause";
+import ui, { initialUIState } from "./ui";
+import ast, { initialASTState } from "./ast";
+import quickOpen, { initialQuickOpenState } from "./quick-open";
+import sourcesTree, { initialSourcesTreeState } from "./sources-tree";
+import threads, { initialThreadsState } from "./threads";
+import eventListenerBreakpoints, {
+ initialEventListenerState,
+} from "./event-listeners";
+import exceptions, { initialExceptionsState } from "./exceptions";
+
+import { objectInspector } from "devtools/client/shared/components/reps/index";
+
+/**
+ * Note that this is only used by jest tests.
+ *
+ * Production is using loadInitialState() in main.js
+ */
+export function initialState() {
+ return {
+ sources: initialSourcesState(),
+ sourcesContent: initialSourcesContentState(),
+ expressions: initialExpressionState(),
+ sourceActors: initialSourceActorsState(),
+ sourceBlackBox: initialSourceBlackBoxState(),
+ tabs: initialTabState(),
+ breakpoints: initialBreakpointsState(),
+ pendingBreakpoints: {},
+ pause: initialPauseState(),
+ ui: initialUIState(),
+ ast: initialASTState(),
+ quickOpen: initialQuickOpenState(),
+ sourcesTree: initialSourcesTreeState(),
+ threads: initialThreadsState(),
+ objectInspector: objectInspector.reducer.initialOIState(),
+ eventListenerBreakpoints: initialEventListenerState(),
+ exceptions: initialExceptionsState(),
+ };
+}
+
+export default {
+ expressions,
+ sourceActors,
+ sourceBlackBox,
+ sourcesContent,
+ sources,
+ tabs,
+ breakpoints,
+ pendingBreakpoints,
+ pause,
+ ui,
+ ast,
+ quickOpen,
+ sourcesTree,
+ threads,
+ objectInspector: objectInspector.reducer.default,
+ eventListenerBreakpoints,
+ exceptions,
+};
diff --git a/devtools/client/debugger/src/reducers/moz.build b/devtools/client/debugger/src/reducers/moz.build
new file mode 100644
index 0000000000..4e2d2a1045
--- /dev/null
+++ b/devtools/client/debugger/src/reducers/moz.build
@@ -0,0 +1,26 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DIRS += []
+
+CompiledModules(
+ "ast.js",
+ "breakpoints.js",
+ "event-listeners.js",
+ "exceptions.js",
+ "expressions.js",
+ "index.js",
+ "pause.js",
+ "pending-breakpoints.js",
+ "quick-open.js",
+ "source-actors.js",
+ "source-blackbox.js",
+ "sources.js",
+ "sources-content.js",
+ "sources-tree.js",
+ "tabs.js",
+ "threads.js",
+ "ui.js",
+)
diff --git a/devtools/client/debugger/src/reducers/pause.js b/devtools/client/debugger/src/reducers/pause.js
new file mode 100644
index 0000000000..8cb5eefe98
--- /dev/null
+++ b/devtools/client/debugger/src/reducers/pause.js
@@ -0,0 +1,427 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/* eslint complexity: ["error", 36]*/
+
+/**
+ * Pause reducer
+ * @module reducers/pause
+ */
+
+import { prefs } from "../utils/prefs";
+
+// Pause state associated with an individual thread.
+
+// Pause state describing all threads.
+
+export function initialPauseState(thread = "UnknownThread") {
+ return {
+ cx: {
+ navigateCounter: 0,
+ },
+ // This `threadcx` is the `cx` variable we pass around in components and actions.
+ // This is pulled via getThreadContext().
+ // This stores information about the currently selected thread and its paused state.
+ threadcx: {
+ navigateCounter: 0,
+ thread,
+ pauseCounter: 0,
+ },
+ threads: {},
+ skipPausing: prefs.skipPausing,
+ mapScopes: prefs.mapScopes,
+ shouldPauseOnDebuggerStatement: prefs.pauseOnDebuggerStatement,
+ shouldPauseOnExceptions: prefs.pauseOnExceptions,
+ shouldPauseOnCaughtExceptions: prefs.pauseOnCaughtExceptions,
+ };
+}
+
+const resumedPauseState = {
+ isPaused: false,
+ frames: null,
+ framesLoading: false,
+ frameScopes: {
+ generated: {},
+ original: {},
+ mappings: {},
+ },
+ selectedFrameId: null,
+ why: null,
+ inlinePreview: {},
+};
+
+const createInitialPauseState = () => ({
+ ...resumedPauseState,
+ isWaitingOnBreak: false,
+ command: null,
+ previousLocation: null,
+ expandedScopes: new Set(),
+ lastExpandedScopes: [],
+});
+
+export function getThreadPauseState(state, thread) {
+ // Thread state is lazily initialized so that we don't have to keep track of
+ // the current set of worker threads.
+ return state.threads[thread] || createInitialPauseState();
+}
+
+function update(state = initialPauseState(), action) {
+ // All the actions updating pause state must pass an object which designate
+ // the related thread.
+ const getActionThread = () => {
+ const thread =
+ action.thread || action.selectedFrame?.thread || action.frame?.thread;
+ if (!thread) {
+ throw new Error(`Missing thread in action ${action.type}`);
+ }
+ return thread;
+ };
+
+ // `threadState` and `updateThreadState` help easily get and update
+ // the pause state for a given thread.
+ const threadState = () => {
+ return getThreadPauseState(state, getActionThread());
+ };
+ const updateThreadState = newThreadState => {
+ return {
+ ...state,
+ threads: {
+ ...state.threads,
+ [getActionThread()]: { ...threadState(), ...newThreadState },
+ },
+ };
+ };
+
+ switch (action.type) {
+ case "SELECT_THREAD": {
+ // Ignore the action if the related thread doesn't exist.
+ if (!state.threads[action.thread]) {
+ console.warn(
+ `Trying to select a destroyed or non-existent thread '${action.thread}'`
+ );
+ return state;
+ }
+
+ return {
+ ...state,
+ threadcx: {
+ ...state.threadcx,
+ thread: action.thread,
+ pauseCounter: state.threadcx.pauseCounter + 1,
+ },
+ };
+ }
+
+ case "INSERT_THREAD": {
+ // When navigating to a new location,
+ // we receive NAVIGATE early, which clear things
+ // then we have REMOVE_THREAD of the previous thread.
+ // INSERT_THREAD will be the very first event with the new thread actor ID.
+ // Automatically select the new top level thread.
+ if (action.newThread.isTopLevel) {
+ return {
+ ...state,
+ threadcx: {
+ ...state.threadcx,
+ thread: action.newThread.actor,
+ pauseCounter: state.threadcx.pauseCounter + 1,
+ },
+ threads: {
+ ...state.threads,
+ [action.newThread.actor]: createInitialPauseState(),
+ },
+ };
+ }
+
+ return {
+ ...state,
+ threads: {
+ ...state.threads,
+ [action.newThread.actor]: createInitialPauseState(),
+ },
+ };
+ }
+
+ case "REMOVE_THREAD": {
+ if (
+ action.threadActorID in state.threads ||
+ action.threadActorID == state.threadcx.thread
+ ) {
+ // Remove the thread from the cached list
+ const threads = { ...state.threads };
+ delete threads[action.threadActorID];
+ let threadcx = state.threadcx;
+
+ // And also switch to another thread if this was the currently selected one.
+ // As we don't store thread objects in this reducer, and only store thread actor IDs,
+ // we can't try to find the top level thread. So we pick the first available thread,
+ // and hope that's the top level one.
+ if (state.threadcx.thread == action.threadActorID) {
+ threadcx = {
+ ...threadcx,
+ thread: Object.keys(threads)[0],
+ pauseCounter: threadcx.pauseCounter + 1,
+ };
+ }
+ return {
+ ...state,
+ threadcx,
+ threads,
+ };
+ }
+ break;
+ }
+
+ case "PAUSED": {
+ const { thread, topFrame, why } = action;
+ state = {
+ ...state,
+ threadcx: {
+ ...state.threadcx,
+ pauseCounter: state.threadcx.pauseCounter + 1,
+ thread,
+ },
+ };
+
+ return updateThreadState({
+ isWaitingOnBreak: false,
+ selectedFrameId: topFrame.id,
+ isPaused: true,
+ // On pause, we only receive the top frame, all subsequent ones
+ // will be asynchronously populated via `fetchFrames` action
+ frames: [topFrame],
+ framesLoading: true,
+ frameScopes: { ...resumedPauseState.frameScopes },
+ why,
+ shouldBreakpointsPaneOpenOnPause: why.type === "breakpoint",
+ });
+ }
+
+ case "FETCHED_FRAMES": {
+ const { frames } = action;
+
+ // We typically receive a PAUSED action before this one,
+ // with only the first frame. Here, we avoid replacing it
+ // with a copy of it in order to avoid triggerring selectors
+ // uncessarily
+ // (note that in jest, action's frames might be empty)
+ // (and if we resume in between PAUSED and FETCHED_FRAMES
+ // threadState().frames might be null)
+ if (threadState().frames) {
+ const previousFirstFrame = threadState().frames[0];
+ if (previousFirstFrame.id == frames[0]?.id) {
+ frames.splice(0, 1, previousFirstFrame);
+ }
+ }
+ return updateThreadState({ frames, framesLoading: false });
+ }
+
+ case "MAP_FRAMES": {
+ const { selectedFrameId, frames } = action;
+ return updateThreadState({ frames, selectedFrameId });
+ }
+
+ case "ADD_SCOPES": {
+ const { status, value } = action;
+ const selectedFrameId = action.selectedFrame.id;
+
+ const generated = {
+ ...threadState().frameScopes.generated,
+ [selectedFrameId]: {
+ pending: status !== "done",
+ scope: value,
+ },
+ };
+
+ return updateThreadState({
+ frameScopes: {
+ ...threadState().frameScopes,
+ generated,
+ },
+ });
+ }
+
+ case "MAP_SCOPES": {
+ const { status, value } = action;
+ const selectedFrameId = action.selectedFrame.id;
+
+ const original = {
+ ...threadState().frameScopes.original,
+ [selectedFrameId]: {
+ pending: status !== "done",
+ scope: value?.scope,
+ },
+ };
+
+ const mappings = {
+ ...threadState().frameScopes.mappings,
+ [selectedFrameId]: value?.mappings,
+ };
+
+ return updateThreadState({
+ frameScopes: {
+ ...threadState().frameScopes,
+ original,
+ mappings,
+ },
+ });
+ }
+
+ case "BREAK_ON_NEXT":
+ return updateThreadState({ isWaitingOnBreak: true });
+
+ case "SELECT_FRAME":
+ return updateThreadState({ selectedFrameId: action.frame.id });
+
+ case "PAUSE_ON_DEBUGGER_STATEMENT": {
+ const { shouldPauseOnDebuggerStatement } = action;
+
+ prefs.pauseOnDebuggerStatement = shouldPauseOnDebuggerStatement;
+
+ return {
+ ...state,
+ shouldPauseOnDebuggerStatement,
+ };
+ }
+
+ case "PAUSE_ON_EXCEPTIONS": {
+ const { shouldPauseOnExceptions, shouldPauseOnCaughtExceptions } = action;
+
+ prefs.pauseOnExceptions = shouldPauseOnExceptions;
+ prefs.pauseOnCaughtExceptions = shouldPauseOnCaughtExceptions;
+
+ // Preserving for the old debugger
+ prefs.ignoreCaughtExceptions = !shouldPauseOnCaughtExceptions;
+
+ return {
+ ...state,
+ shouldPauseOnExceptions,
+ shouldPauseOnCaughtExceptions,
+ };
+ }
+
+ case "COMMAND":
+ if (action.status === "start") {
+ return updateThreadState({
+ ...resumedPauseState,
+ command: action.command,
+ previousLocation: getPauseLocation(threadState(), action),
+ });
+ }
+ return updateThreadState({ command: null });
+
+ case "RESUME": {
+ if (action.thread == state.threadcx.thread) {
+ state = {
+ ...state,
+ threadcx: {
+ ...state.threadcx,
+ pauseCounter: state.threadcx.pauseCounter + 1,
+ },
+ };
+ }
+
+ return updateThreadState({
+ ...resumedPauseState,
+ expandedScopes: new Set(),
+ lastExpandedScopes: [...threadState().expandedScopes],
+ shouldBreakpointsPaneOpenOnPause: false,
+ });
+ }
+
+ case "EVALUATE_EXPRESSION":
+ return updateThreadState({
+ command: action.status === "start" ? "expression" : null,
+ });
+
+ case "NAVIGATE": {
+ const navigateCounter = state.cx.navigateCounter + 1;
+ return {
+ ...state,
+ cx: {
+ navigateCounter,
+ },
+ threadcx: {
+ navigateCounter,
+ thread: action.mainThread.actor,
+ pauseCounter: 0,
+ },
+ threads: {
+ ...state.threads,
+ [action.mainThread.actor]: {
+ ...getThreadPauseState(state, action.mainThread.actor),
+ ...resumedPauseState,
+ },
+ },
+ };
+ }
+
+ case "TOGGLE_SKIP_PAUSING": {
+ const { skipPausing } = action;
+ prefs.skipPausing = skipPausing;
+
+ return { ...state, skipPausing };
+ }
+
+ case "TOGGLE_MAP_SCOPES": {
+ const { mapScopes } = action;
+ prefs.mapScopes = mapScopes;
+ return { ...state, mapScopes };
+ }
+
+ case "SET_EXPANDED_SCOPE": {
+ const { path, expanded } = action;
+ const expandedScopes = new Set(threadState().expandedScopes);
+ if (expanded) {
+ expandedScopes.add(path);
+ } else {
+ expandedScopes.delete(path);
+ }
+ return updateThreadState({ expandedScopes });
+ }
+
+ case "ADD_INLINE_PREVIEW": {
+ const { selectedFrame, previews } = action;
+ const selectedFrameId = selectedFrame.id;
+
+ return updateThreadState({
+ inlinePreview: {
+ ...threadState().inlinePreview,
+ [selectedFrameId]: previews,
+ },
+ });
+ }
+
+ case "RESET_BREAKPOINTS_PANE_STATE": {
+ return updateThreadState({
+ ...threadState(),
+ shouldBreakpointsPaneOpenOnPause: false,
+ });
+ }
+ }
+
+ return state;
+}
+
+function getPauseLocation(state, action) {
+ const { frames, previousLocation } = state;
+
+ // NOTE: We store the previous location so that we ensure that we
+ // do not stop at the same location twice when we step over.
+ if (action.command !== "stepOver") {
+ return null;
+ }
+
+ const frame = frames?.[0];
+ if (!frame) {
+ return previousLocation;
+ }
+
+ return {
+ location: frame.location,
+ generatedLocation: frame.generatedLocation,
+ };
+}
+
+export default update;
diff --git a/devtools/client/debugger/src/reducers/pending-breakpoints.js b/devtools/client/debugger/src/reducers/pending-breakpoints.js
new file mode 100644
index 0000000000..a0d51e5693
--- /dev/null
+++ b/devtools/client/debugger/src/reducers/pending-breakpoints.js
@@ -0,0 +1,135 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Pending breakpoints reducer.
+ *
+ * Pending breakpoints are a more lightweight version compared to regular breakpoints objects.
+ * They are meant to be persisted across Firefox restarts and stored into async-storage.
+ * This reducer data is saved into asyncStore from bootstrap.js and restored from main.js.
+ *
+ * The main difference with pending breakpoints is that we only save breakpoints
+ * against source with an URL as only them can be restored. (source IDs are different across reloads).
+ * The second difference is that we don't store the whole source object but only the source URL.
+ */
+
+import { isPrettyURL } from "../utils/source";
+import assert from "../utils/assert";
+
+function update(state = {}, action) {
+ switch (action.type) {
+ case "SET_BREAKPOINT":
+ if (action.status === "start") {
+ return setBreakpoint(state, action.breakpoint);
+ }
+ return state;
+
+ case "REMOVE_BREAKPOINT":
+ if (action.status === "start") {
+ return removeBreakpoint(state, action.breakpoint);
+ }
+ return state;
+
+ case "REMOVE_PENDING_BREAKPOINT":
+ return removePendingBreakpoint(state, action.pendingBreakpoint);
+
+ case "CLEAR_BREAKPOINTS": {
+ return {};
+ }
+ }
+
+ return state;
+}
+
+function shouldBreakpointBePersisted(breakpoint) {
+ // We only save breakpoint for source with URL.
+ // Source without URL can only be identified via their source actor ID
+ // which isn't persisted across reloads.
+ return !breakpoint.options.hidden && breakpoint.location.source.url;
+}
+
+function setBreakpoint(state, breakpoint) {
+ if (!shouldBreakpointBePersisted(breakpoint)) {
+ return state;
+ }
+
+ const id = makeIdFromBreakpoint(breakpoint);
+ const pendingBreakpoint = createPendingBreakpoint(breakpoint);
+
+ return { ...state, [id]: pendingBreakpoint };
+}
+
+function removeBreakpoint(state, breakpoint) {
+ if (!shouldBreakpointBePersisted(breakpoint)) {
+ return state;
+ }
+
+ const id = makeIdFromBreakpoint(breakpoint);
+ state = { ...state };
+
+ delete state[id];
+ return state;
+}
+
+function removePendingBreakpoint(state, pendingBreakpoint) {
+ const id = makeIdFromPendingBreakpoint(pendingBreakpoint);
+ state = { ...state };
+
+ delete state[id];
+ return state;
+}
+
+/**
+ * Return a unique identifier for a given breakpoint,
+ * using its original location, or for pretty-printed sources,
+ * its generated location.
+ *
+ * @param {Object} breakpoint
+ */
+function makeIdFromBreakpoint(breakpoint) {
+ const location = isPrettyURL(breakpoint.location.source.url)
+ ? breakpoint.generatedLocation
+ : breakpoint.location;
+
+ const { source, line, column } = location;
+ const sourceUrlString = source.url || "";
+ const columnString = column || "";
+
+ return `${sourceUrlString}:${line}:${columnString}`;
+}
+
+function makeIdFromPendingBreakpoint(pendingBreakpoint) {
+ const { sourceUrl, line, column } = pendingBreakpoint.location;
+ const sourceUrlString = sourceUrl || "";
+ const columnString = column || "";
+
+ return `${sourceUrlString}:${line}:${columnString}`;
+}
+
+/**
+ * Convert typical debugger frontend location (created via location.js:createLocation)
+ * to a more lightweight flavor of it which will be stored in async storage.
+ */
+function createPendingLocation(location) {
+ assert(location.hasOwnProperty("line"), "location must have a line");
+ assert(location.hasOwnProperty("column"), "location must have a column");
+
+ const { source, line, column } = location;
+ assert(source.url !== undefined, "pending location must have a source url");
+ return { sourceUrl: source.url, line, column };
+}
+
+/**
+ * Create a new pending breakpoint, which is a more lightweight version of the regular breakpoint object.
+ */
+function createPendingBreakpoint(bp) {
+ return {
+ options: bp.options,
+ disabled: bp.disabled,
+ location: createPendingLocation(bp.location),
+ generatedLocation: createPendingLocation(bp.generatedLocation),
+ };
+}
+
+export default update;
diff --git a/devtools/client/debugger/src/reducers/quick-open.js b/devtools/client/debugger/src/reducers/quick-open.js
new file mode 100644
index 0000000000..459e530e7b
--- /dev/null
+++ b/devtools/client/debugger/src/reducers/quick-open.js
@@ -0,0 +1,41 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Quick Open reducer
+ * @module reducers/quick-open
+ */
+
+import { parseQuickOpenQuery } from "../utils/quick-open";
+
+export const initialQuickOpenState = () => ({
+ enabled: false,
+ query: "",
+ searchType: "sources",
+});
+
+export default function update(state = initialQuickOpenState(), action) {
+ switch (action.type) {
+ case "OPEN_QUICK_OPEN":
+ if (action.query != null) {
+ return {
+ ...state,
+ enabled: true,
+ query: action.query,
+ searchType: parseQuickOpenQuery(action.query),
+ };
+ }
+ return { ...state, enabled: true };
+ case "CLOSE_QUICK_OPEN":
+ return initialQuickOpenState();
+ case "SET_QUICK_OPEN_QUERY":
+ return {
+ ...state,
+ query: action.query,
+ searchType: parseQuickOpenQuery(action.query),
+ };
+ default:
+ return state;
+ }
+}
diff --git a/devtools/client/debugger/src/reducers/source-actors.js b/devtools/client/debugger/src/reducers/source-actors.js
new file mode 100644
index 0000000000..fd99955742
--- /dev/null
+++ b/devtools/client/debugger/src/reducers/source-actors.js
@@ -0,0 +1,109 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * This reducer stores the list of all source actors as well their breakable lines.
+ *
+ * There is a one-one relationship with Source Actors from the server codebase,
+ * as well as SOURCE Resources distributed by the ResourceCommand API.
+ *
+ */
+function initialSourceActorsState() {
+ return {
+ // Map(Source Actor ID: string => SourceActor: object)
+ // See create.js: `createSourceActor` for the shape of the source actor objects.
+ mutableSourceActors: new Map(),
+
+ // Map(Source Actor ID: string => Breakable lines: Array<Number>)
+ // The array is the list of all lines where breakpoints can be set
+ mutableBreakableLines: new Map(),
+
+ // Set(Source Actor ID: string)
+ // List of all IDs of source actor which have a valid related source map / original source.
+ // The SourceActor object may have a sourceMapURL attribute set,
+ // but this may be invalid. The source map URL or source map file content may be invalid.
+ // In these scenarios we will remove the source actor from this set.
+ mutableSourceActorsWithSourceMap: new Set(),
+
+ // Map(Source Actor ID: string => string)
+ // Store the exception message when processing the sourceMapURL field of the source actor.
+ mutableSourceMapErrors: new Map(),
+
+ // Map(Source Actor ID: string => string)
+ // When a bundle has a functional sourcemap, reports the resolved source map URL.
+ mutableResolvedSourceMapURL: new Map(),
+ };
+}
+
+export const initial = initialSourceActorsState();
+
+export default function update(state = initialSourceActorsState(), action) {
+ switch (action.type) {
+ case "INSERT_SOURCE_ACTORS": {
+ for (const sourceActor of action.sourceActors) {
+ state.mutableSourceActors.set(sourceActor.id, sourceActor);
+
+ // If the sourceMapURL attribute is set, consider that it is valid.
+ // But this may be revised later and removed from this Set.
+ if (sourceActor.sourceMapURL) {
+ state.mutableSourceActorsWithSourceMap.add(sourceActor.id);
+ }
+ }
+ return {
+ ...state,
+ };
+ }
+
+ case "REMOVE_THREAD": {
+ for (const sourceActor of state.mutableSourceActors.values()) {
+ if (sourceActor.thread == action.threadActorID) {
+ state.mutableSourceActors.delete(sourceActor.id);
+ state.mutableBreakableLines.delete(sourceActor.id);
+ state.mutableSourceActorsWithSourceMap.delete(sourceActor.id);
+ }
+ }
+ return {
+ ...state,
+ };
+ }
+
+ case "SET_SOURCE_ACTOR_BREAKABLE_LINES":
+ state.mutableBreakableLines.set(
+ action.sourceActor.id,
+ action.breakableLines
+ );
+
+ return {
+ ...state,
+ };
+
+ case "CLEAR_SOURCE_ACTOR_MAP_URL":
+ if (
+ state.mutableSourceActorsWithSourceMap.delete(action.sourceActor.id)
+ ) {
+ return {
+ ...state,
+ };
+ }
+ return state;
+
+ case "SOURCE_MAP_ERROR": {
+ state.mutableSourceMapErrors.set(
+ action.sourceActor.id,
+ action.errorMessage
+ );
+ return { ...state };
+ }
+
+ case "RESOLVED_SOURCEMAP_URL": {
+ state.mutableResolvedSourceMapURL.set(
+ action.sourceActor.id,
+ action.resolvedSourceMapURL
+ );
+ return { ...state };
+ }
+ }
+
+ return state;
+}
diff --git a/devtools/client/debugger/src/reducers/source-blackbox.js b/devtools/client/debugger/src/reducers/source-blackbox.js
new file mode 100644
index 0000000000..3ccca49790
--- /dev/null
+++ b/devtools/client/debugger/src/reducers/source-blackbox.js
@@ -0,0 +1,145 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Reducer containing all data about sources being "black boxed".
+ *
+ * i.e. sources which should be ignored by the debugger.
+ * Typically, these sources should be hidden from paused stack frames,
+ * and any debugger statement or breakpoint should be ignored.
+ */
+
+export function initialSourceBlackBoxState(state) {
+ return {
+ /* FORMAT:
+ * blackboxedRanges: {
+ * [source url]: [range, range, ...], -- source lines blackboxed
+ * [source url]: [], -- whole source blackboxed
+ * ...
+ * }
+ */
+ blackboxedRanges: state?.blackboxedRanges ?? {},
+
+ blackboxedSet: state?.blackboxedRanges
+ ? new Set(Object.keys(state.blackboxedRanges))
+ : new Set(),
+
+ sourceMapIgnoreListUrls: [],
+ };
+}
+
+function update(state = initialSourceBlackBoxState(), action) {
+ switch (action.type) {
+ case "BLACKBOX_WHOLE_SOURCES": {
+ const { sources } = action;
+
+ const currentBlackboxedRanges = { ...state.blackboxedRanges };
+ const currentBlackboxedSet = new Set(state.blackboxedSet);
+
+ for (const source of sources) {
+ currentBlackboxedRanges[source.url] = [];
+ currentBlackboxedSet.add(source.url);
+ }
+
+ return {
+ ...state,
+ blackboxedRanges: currentBlackboxedRanges,
+ blackboxedSet: currentBlackboxedSet,
+ };
+ }
+
+ case "BLACKBOX_SOURCE_RANGES": {
+ const { source, ranges } = action;
+
+ const currentBlackboxedRanges = { ...state.blackboxedRanges };
+ const currentBlackboxedSet = new Set(state.blackboxedSet);
+
+ if (!currentBlackboxedRanges[source.url]) {
+ currentBlackboxedRanges[source.url] = [];
+ currentBlackboxedSet.add(source.url);
+ } else {
+ currentBlackboxedRanges[source.url] = [
+ ...state.blackboxedRanges[source.url],
+ ];
+ }
+
+ // Add new blackboxed lines in acsending order
+ for (const newRange of ranges) {
+ const index = currentBlackboxedRanges[source.url].findIndex(
+ range =>
+ range.end.line <= newRange.start.line &&
+ range.end.column <= newRange.start.column
+ );
+ currentBlackboxedRanges[source.url].splice(index + 1, 0, newRange);
+ }
+
+ return {
+ ...state,
+ blackboxedRanges: currentBlackboxedRanges,
+ blackboxedSet: currentBlackboxedSet,
+ };
+ }
+
+ case "UNBLACKBOX_WHOLE_SOURCES": {
+ const { sources } = action;
+
+ const currentBlackboxedRanges = { ...state.blackboxedRanges };
+ const currentBlackboxedSet = new Set(state.blackboxedSet);
+
+ for (const source of sources) {
+ delete currentBlackboxedRanges[source.url];
+ currentBlackboxedSet.delete(source.url);
+ }
+
+ return {
+ ...state,
+ blackboxedRanges: currentBlackboxedRanges,
+ blackboxedSet: currentBlackboxedSet,
+ };
+ }
+
+ case "UNBLACKBOX_SOURCE_RANGES": {
+ const { source, ranges } = action;
+
+ const currentBlackboxedRanges = {
+ ...state.blackboxedRanges,
+ [source.url]: [...state.blackboxedRanges[source.url]],
+ };
+
+ for (const newRange of ranges) {
+ const index = currentBlackboxedRanges[source.url].findIndex(
+ range =>
+ range.start.line === newRange.start.line &&
+ range.end.line === newRange.end.line
+ );
+
+ if (index !== -1) {
+ currentBlackboxedRanges[source.url].splice(index, 1);
+ }
+ }
+
+ return {
+ ...state,
+ blackboxedRanges: currentBlackboxedRanges,
+ };
+ }
+
+ case "ADD_SOURCEMAP_IGNORE_LIST_SOURCES": {
+ return {
+ ...state,
+ sourceMapIgnoreListUrls: [
+ ...state.sourceMapIgnoreListUrls,
+ ...action.ignoreListUrls,
+ ],
+ };
+ }
+
+ case "NAVIGATE":
+ return initialSourceBlackBoxState(state);
+ }
+
+ return state;
+}
+
+export default update;
diff --git a/devtools/client/debugger/src/reducers/sources-content.js b/devtools/client/debugger/src/reducers/sources-content.js
new file mode 100644
index 0000000000..e71330dc5c
--- /dev/null
+++ b/devtools/client/debugger/src/reducers/sources-content.js
@@ -0,0 +1,139 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Sources content reducer.
+ *
+ * This store the textual content for each source.
+ */
+
+import { pending, fulfilled, rejected } from "../utils/async-value";
+
+export function initialSourcesContentState() {
+ return {
+ /**
+ * Text content of all the original sources.
+ * This is large data, so this is only fetched on-demand for a subset of sources.
+ * This state attribute is mutable in order to avoid cloning this possibly large map
+ * on each new source. But selectors are never based on the map. Instead they only
+ * query elements of the map.
+ *
+ * Map(source id => AsyncValue<String>)
+ */
+ mutableOriginalSourceTextContentMapBySourceId: new Map(),
+
+ /**
+ * Text content of all the generated sources.
+ *
+ * Map(source actor is => AsyncValue<String>)
+ */
+ mutableGeneratedSourceTextContentMapBySourceActorId: new Map(),
+
+ /**
+ * Incremental number that is bumped each time we navigate to a new page.
+ *
+ * This is used to better handle async race condition where we mix previous page data
+ * with the new page. As sources are keyed by URL we may easily conflate the two page loads data.
+ */
+ epoch: 1,
+ };
+}
+
+function update(state = initialSourcesContentState(), action) {
+ switch (action.type) {
+ case "LOAD_ORIGINAL_SOURCE_TEXT":
+ if (!action.source) {
+ throw new Error("Missing source");
+ }
+ return updateSourceTextContent(state, action);
+
+ case "LOAD_GENERATED_SOURCE_TEXT":
+ if (!action.sourceActor) {
+ throw new Error("Missing source actor.");
+ }
+ return updateSourceTextContent(state, action);
+
+ case "REMOVE_THREAD":
+ return removeThread(state, action);
+ }
+
+ return state;
+}
+
+/*
+ * Update a source's loaded text content.
+ */
+function updateSourceTextContent(state, action) {
+ // If there was a navigation between the time the action was started and
+ // completed, we don't want to update the store.
+ if (action.epoch !== state.epoch) {
+ return state;
+ }
+
+ let content;
+ if (action.status === "start") {
+ content = pending();
+ } else if (action.status === "error") {
+ content = rejected(action.error);
+ } else if (typeof action.value.text === "string") {
+ content = fulfilled({
+ type: "text",
+ value: action.value.text,
+ contentType: action.value.contentType,
+ });
+ } else {
+ content = fulfilled({
+ type: "wasm",
+ value: action.value.text,
+ });
+ }
+
+ if (action.source && action.sourceActor) {
+ throw new Error(
+ "Both the source and the source actor should not exist at the same time"
+ );
+ }
+
+ if (action.source) {
+ state.mutableOriginalSourceTextContentMapBySourceId.set(
+ action.source.id,
+ content
+ );
+ }
+
+ if (action.sourceActor) {
+ state.mutableGeneratedSourceTextContentMapBySourceActorId.set(
+ action.sourceActor.id,
+ content
+ );
+ }
+
+ return {
+ ...state,
+ };
+}
+
+function removeThread(state, action) {
+ const originalSizeBefore =
+ state.mutableOriginalSourceTextContentMapBySourceId.size;
+ for (const source of action.sources) {
+ state.mutableOriginalSourceTextContentMapBySourceId.delete(source.id);
+ }
+ const generatedSizeBefore =
+ state.mutableGeneratedSourceTextContentMapBySourceActorId.size;
+ for (const actor of action.actors) {
+ state.mutableGeneratedSourceTextContentMapBySourceActorId.delete(actor.id);
+ }
+ if (
+ originalSizeBefore !=
+ state.mutableOriginalSourceTextContentMapBySourceId.size ||
+ generatedSizeBefore !=
+ state.mutableGeneratedSourceTextContentMapBySourceActorId.size
+ ) {
+ return { ...state };
+ }
+ return state;
+}
+
+export default update;
diff --git a/devtools/client/debugger/src/reducers/sources-tree.js b/devtools/client/debugger/src/reducers/sources-tree.js
new file mode 100644
index 0000000000..0f0e8dadb3
--- /dev/null
+++ b/devtools/client/debugger/src/reducers/sources-tree.js
@@ -0,0 +1,704 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Sources tree reducer
+ *
+ * A Source Tree is composed of:
+ *
+ * - Thread Items To designate targets/threads.
+ * These are the roots of the Tree if no project directory is selected.
+ *
+ * - Group Items To designates the different domains used in the website.
+ * These are direct children of threads and may contain directory or source items.
+ *
+ * - Directory Items To designate all the folders.
+ * Note that each every folder has an items. The Source Tree React component is doing the magic to coallesce folders made of only one sub folder.
+ *
+ * - Source Items To designate sources.
+ * They are the leaves of the Tree. (we should not have empty directories.)
+ */
+
+const IGNORED_URLS = ["debugger eval code", "XStringBundle"];
+const IGNORED_EXTENSIONS = ["css", "svg", "png"];
+import { isPretty, getRawSourceURL } from "../utils/source";
+import { prefs } from "../utils/prefs";
+
+export function initialSourcesTreeState() {
+ return {
+ // List of all Thread Tree Items.
+ // All other item types are children of these and aren't store in
+ // the reducer as top level objects.
+ threadItems: [],
+
+ // List of `uniquePath` of Tree Items that are expanded.
+ // This should be all but Source Tree Items.
+ expanded: new Set(),
+
+ // Reference to the currently focused Tree Item.
+ // It can be any type of Tree Item.
+ focusedItem: null,
+
+ // Project root set from the Source Tree.
+ // This focuses the source tree on a subset of sources.
+ // This is a `uniquePath`, where ${thread} is replaced by "top-level"
+ // when we picked an item from the main thread. This allows to preserve
+ // the root selection on page reload.
+ projectDirectoryRoot: prefs.projectDirectoryRoot,
+
+ // The name is displayed in Source Tree header
+ projectDirectoryRootName: prefs.projectDirectoryRootName,
+
+ // Reports if the top level target is a web extension.
+ // If so, we should display all web extension sources.
+ isWebExtension: false,
+
+ /**
+ * Boolean, to be set to true in order to display WebExtension's content scripts
+ * that are applied to the current page we are debugging.
+ *
+ * Covered by: browser_dbg-content-script-sources.js
+ * Bound to: devtools.chrome.enabled
+ *
+ */
+ chromeAndExtensionsEnabled: prefs.chromeAndExtensionsEnabled,
+ };
+}
+
+// eslint-disable-next-line complexity
+export default function update(state = initialSourcesTreeState(), action) {
+ switch (action.type) {
+ case "ADD_ORIGINAL_SOURCES": {
+ const { generatedSourceActor } = action;
+ const validOriginalSources = action.originalSources.filter(source =>
+ isSourceVisibleInSourceTree(
+ source,
+ state.chromeAndExtensionsEnabled,
+ state.isWebExtension
+ )
+ );
+ if (!validOriginalSources.length) {
+ return state;
+ }
+ let changed = false;
+ // Fork the array only once for all the sources
+ const threadItems = [...state.threadItems];
+ for (const source of validOriginalSources) {
+ changed |= addSource(threadItems, source, generatedSourceActor);
+ }
+ if (changed) {
+ return {
+ ...state,
+ threadItems,
+ };
+ }
+ return state;
+ }
+ case "INSERT_SOURCE_ACTORS": {
+ // With this action, we only cover generated sources.
+ // (i.e. we need something else for sourcemapped/original sources)
+ // But we do want to process source actors in order to be able to display
+ // distinct Source Tree Items for sources with the same URL loaded in distinct thread.
+ // (And may be also later be able to highlight the many sources with the same URL loaded in a given thread)
+ const newSourceActors = action.sourceActors.filter(sourceActor =>
+ isSourceVisibleInSourceTree(
+ sourceActor.sourceObject,
+ state.chromeAndExtensionsEnabled,
+ state.isWebExtension
+ )
+ );
+ if (!newSourceActors.length) {
+ return state;
+ }
+ let changed = false;
+ // Fork the array only once for all the sources
+ const threadItems = [...state.threadItems];
+ for (const sourceActor of newSourceActors) {
+ // We mostly wanted to read the thread of the SourceActor,
+ // most of the interesting attributes are on the Source Object.
+ changed |= addSource(
+ threadItems,
+ sourceActor.sourceObject,
+ sourceActor
+ );
+ }
+ if (changed) {
+ return {
+ ...state,
+ threadItems,
+ };
+ }
+ return state;
+ }
+
+ case "INSERT_THREAD":
+ state = { ...state };
+ addThread(state, action.newThread);
+ return state;
+
+ case "REMOVE_THREAD": {
+ const { threadActorID } = action;
+ const index = state.threadItems.findIndex(item => {
+ return item.threadActorID == threadActorID;
+ });
+
+ if (index == -1) {
+ return state;
+ }
+
+ // Also clear focusedItem and expanded items related
+ // to this thread. These fields store uniquePath which starts
+ // with the thread actor ID.
+ let { focusedItem } = state;
+ if (focusedItem && focusedItem.uniquePath.startsWith(threadActorID)) {
+ focusedItem = null;
+ }
+ const expanded = new Set();
+ for (const path of state.expanded) {
+ if (!path.startsWith(threadActorID)) {
+ expanded.add(path);
+ }
+ }
+
+ const threadItems = [...state.threadItems];
+ threadItems.splice(index, 1);
+ return {
+ ...state,
+ threadItems,
+ focusedItem,
+ expanded,
+ };
+ }
+
+ case "SET_EXPANDED_STATE":
+ return updateExpanded(state, action);
+
+ case "SET_FOCUSED_SOURCE_ITEM":
+ return { ...state, focusedItem: action.item };
+
+ case "SET_SELECTED_LOCATION":
+ return updateSelectedLocation(state, action.location);
+
+ case "SET_PROJECT_DIRECTORY_ROOT":
+ const { uniquePath, name } = action;
+ return updateProjectDirectoryRoot(state, uniquePath, name);
+
+ case "BLACKBOX_WHOLE_SOURCES":
+ case "BLACKBOX_SOURCE_RANGES": {
+ const sources = action.sources || [action.source];
+ return updateBlackbox(state, sources, true);
+ }
+
+ case "UNBLACKBOX_WHOLE_SOURCES": {
+ const sources = action.sources || [action.source];
+ return updateBlackbox(state, sources, false);
+ }
+ }
+ return state;
+}
+
+function addThread(state, thread) {
+ const threadActorID = thread.actor;
+ // When processing the top level target,
+ // see if we are debugging an extension.
+ if (thread.isTopLevel) {
+ state.isWebExtension = thread.isWebExtension;
+ }
+ let threadItem = state.threadItems.find(item => {
+ return item.threadActorID == threadActorID;
+ });
+ if (!threadItem) {
+ threadItem = createThreadTreeItem(threadActorID);
+ state.threadItems = [...state.threadItems];
+ threadItem.thread = thread;
+ addSortedItem(state.threadItems, threadItem, sortThreadItems);
+ } else {
+ // We force updating the list to trigger mapStateToProps
+ // as the getSourcesTreeSources selector is awaiting for the `thread` attribute
+ // which we will set here.
+ state.threadItems = [...state.threadItems];
+
+ // Inject the reducer thread object on Thread Tree Items
+ // (this is handy shortcut to have access to from React components)
+ // (this is also used by sortThreadItems to sort the thread as a Tree in the Browser Toolbox)
+ threadItem.thread = thread;
+
+ // We have to re-sort all threads because of the new `thread` attribute on current thread item
+ state.threadItems.sort(sortThreadItems);
+ }
+}
+
+function updateBlackbox(state, sources, shouldBlackBox) {
+ const threadItems = [...state.threadItems];
+
+ for (const source of sources) {
+ for (const threadItem of threadItems) {
+ const sourceTreeItem = findSourceInThreadItem(source, threadItem);
+ if (sourceTreeItem && sourceTreeItem.isBlackBoxed != shouldBlackBox) {
+ // Replace the Item with a clone so that we get the expected React updates
+ const { children } = sourceTreeItem.parent;
+ children.splice(children.indexOf(sourceTreeItem), 1, {
+ ...sourceTreeItem,
+ isBlackBoxed: shouldBlackBox,
+ });
+ }
+ }
+ }
+ return { ...state, threadItems };
+}
+
+function updateExpanded(state, action) {
+ // We receive the full list of all expanded items
+ // (not only the one added/removed)
+ // Also assume that this action is called only if the Set changed.
+ return {
+ ...state,
+ // Consider that the action already cloned the Set
+ expanded: action.expanded,
+ };
+}
+
+/**
+ * Update the project directory root
+ */
+function updateProjectDirectoryRoot(state, uniquePath, name) {
+ // Only persists root within the top level target.
+ // Otherwise the thread actor ID will change on page reload and we won't match anything
+ if (!uniquePath || uniquePath.startsWith("top-level")) {
+ prefs.projectDirectoryRoot = uniquePath;
+ prefs.projectDirectoryRootName = name;
+ }
+
+ return {
+ ...state,
+ projectDirectoryRoot: uniquePath,
+ projectDirectoryRootName: name,
+ };
+}
+
+function isSourceVisibleInSourceTree(
+ source,
+ chromeAndExtensionsEnabled,
+ debuggeeIsWebExtension
+) {
+ return (
+ !!source.url &&
+ !IGNORED_EXTENSIONS.includes(source.displayURL.fileExtension) &&
+ !IGNORED_URLS.includes(source.url) &&
+ !isPretty(source) &&
+ // Only accept web extension sources when the chrome pref is enabled (to allows showing content scripts),
+ // or when we are debugging an extension
+ (!source.isExtension ||
+ chromeAndExtensionsEnabled ||
+ debuggeeIsWebExtension)
+ );
+}
+
+/**
+ * Generic Array helper to add a new value at the right position
+ * given that the array is already sorted.
+ *
+ * @param {Array} array
+ * The already sorted into which a value should be added.
+ * @param {any} newValue
+ * The value to add in the array while keeping the array sorted.
+ * @param {Function} sortFunction
+ * A function to compare two array values and their ordering.
+ * Follow same behavior as Array sorting function.
+ */
+function addSortedItem(array, newValue, sortFunction) {
+ let index = array.findIndex(value => sortFunction(value, newValue) === 1);
+ index = index >= 0 ? index : array.length;
+ array.splice(index, 0, newValue);
+}
+
+function addSource(threadItems, source, sourceActor) {
+ // Ensure creating or fetching the related Thread Item
+ let threadItem = threadItems.find(item => {
+ return item.threadActorID == sourceActor.thread;
+ });
+ if (!threadItem) {
+ threadItem = createThreadTreeItem(sourceActor.thread);
+ // Note that threadItems will be cloned once to force a state update
+ // by the callsite of `addSourceActor`
+ addSortedItem(threadItems, threadItem, sortThreadItems);
+ }
+
+ // Then ensure creating or fetching the related Group Item
+ // About `source` versus `sourceActor`:
+ const { displayURL } = source;
+ const { group } = displayURL;
+
+ let groupItem = threadItem.children.find(item => {
+ return item.groupName == group;
+ });
+
+ if (!groupItem) {
+ groupItem = createGroupTreeItem(group, threadItem, source);
+ // Copy children in order to force updating react in case we picked
+ // this directory as a project root
+ threadItem.children = [...threadItem.children];
+
+ addSortedItem(threadItem.children, groupItem, sortItems);
+ }
+
+ // Then ensure creating or fetching all possibly nested Directory Item(s)
+ const { path } = displayURL;
+ const parentPath = path.substring(0, path.lastIndexOf("/"));
+ const directoryItem = addOrGetParentDirectory(groupItem, parentPath);
+
+ // Check if a previous source actor registered this source.
+ // It happens if we load the same url multiple times, or,
+ // for inline sources (=HTML pages with inline scripts).
+ const existing = directoryItem.children.find(item => {
+ return item.type == "source" && item.source == source;
+ });
+ if (existing) {
+ return false;
+ }
+
+ // Finaly, create the Source Item and register it in its parent Directory Item
+ const sourceItem = createSourceTreeItem(source, sourceActor, directoryItem);
+ // Copy children in order to force updating react in case we picked
+ // this directory as a project root
+ directoryItem.children = [...directoryItem.children];
+ addSortedItem(directoryItem.children, sourceItem, sortItems);
+
+ return true;
+}
+/**
+ * Find all the source items in tree
+ * @param {Object} item - Current item node in the tree
+ * @param {Function} callback
+ */
+function findSourceInThreadItem(source, threadItem) {
+ const { displayURL } = source;
+ const { group, path } = displayURL;
+ const groupItem = threadItem.children.find(item => {
+ return item.groupName == group;
+ });
+ if (!groupItem) return null;
+
+ const parentPath = path.substring(0, path.lastIndexOf("/"));
+ const directoryItem = groupItem._allGroupDirectoryItems.find(item => {
+ return item.type == "directory" && item.path == parentPath;
+ });
+ if (!directoryItem) return null;
+
+ return directoryItem.children.find(item => {
+ return item.type == "source" && item.source == source;
+ });
+}
+
+function sortItems(a, b) {
+ if (a.type == "directory" && b.type == "source") {
+ return -1;
+ } else if (b.type == "directory" && a.type == "source") {
+ return 1;
+ } else if (a.type == "directory" && b.type == "directory") {
+ return a.path.localeCompare(b.path);
+ } else if (a.type == "source" && b.type == "source") {
+ return a.source.displayURL.filename.localeCompare(
+ b.source.displayURL.filename
+ );
+ }
+ return 0;
+}
+
+function sortThreadItems(a, b) {
+ // Jest tests aren't emitting the necessary actions to populate the thread attributes.
+ // Ignore sorting for them.
+ if (!a.thread || !b.thread) {
+ return 0;
+ }
+
+ // Top level target is always listed first
+ if (a.thread.isTopLevel) {
+ return -1;
+ } else if (b.thread.isTopLevel) {
+ return 1;
+ }
+
+ // Process targets should come next and after that frame targets
+ if (a.thread.targetType == "process" && b.thread.targetType == "frame") {
+ return -1;
+ } else if (
+ a.thread.targetType == "frame" &&
+ b.thread.targetType == "process"
+ ) {
+ return 1;
+ }
+
+ // And we display the worker targets last.
+ if (
+ a.thread.targetType.endsWith("worker") &&
+ !b.thread.targetType.endsWith("worker")
+ ) {
+ return 1;
+ } else if (
+ !a.thread.targetType.endsWith("worker") &&
+ b.thread.targetType.endsWith("worker")
+ ) {
+ return -1;
+ }
+
+ // Order the process targets by their process ids
+ if (a.thread.processID > b.thread.processID) {
+ return 1;
+ } else if (a.thread.processID < b.thread.processID) {
+ return 0;
+ }
+
+ // Order the frame targets and the worker targets by their target name
+ if (a.thread.targetType == "frame" && b.thread.targetType == "frame") {
+ return a.thread.name.localeCompare(b.thread.name);
+ } else if (
+ a.thread.targetType.endsWith("worker") &&
+ b.thread.targetType.endsWith("worker")
+ ) {
+ return a.thread.name.localeCompare(b.thread.name);
+ }
+
+ return 0;
+}
+
+/**
+ * For a given URL's path, in the given group (i.e. typically a given scheme+domain),
+ * return the already existing parent directory item, or create it if it doesn't exists.
+ * Note that it will create all ancestors up to the Group Item.
+ *
+ * @param {GroupItem} groupItem
+ * The Group Item for the group where the path should be displayed.
+ * @param {String} path
+ * Path of the directory for which we want a Directory Item.
+ * @return {GroupItem|DirectoryItem}
+ * The parent Item where this path should be inserted.
+ * Note that it may be displayed right under the Group Item if the path is empty.
+ */
+function addOrGetParentDirectory(groupItem, path) {
+ // We reached the top of the Tree, so return the Group Item.
+ if (!path) {
+ return groupItem;
+ }
+ // See if we have this directory already registered by a previous source
+ const existing = groupItem._allGroupDirectoryItems.find(item => {
+ return item.type == "directory" && item.path == path;
+ });
+ if (existing) {
+ return existing;
+ }
+ // It doesn't exists, so we will create a new Directory Item.
+ // But now, lookup recursively for the parent Item for this to-be-create Directory Item
+ const parentPath = path.substring(0, path.lastIndexOf("/"));
+ const parentDirectory = addOrGetParentDirectory(groupItem, parentPath);
+
+ // We can now create the new Directory Item and register it in its parent Item.
+ const directory = createDirectoryTreeItem(path, parentDirectory);
+ // Copy children in order to force updating react in case we picked
+ // this directory as a project root
+ parentDirectory.children = [...parentDirectory.children];
+
+ addSortedItem(parentDirectory.children, directory, sortItems);
+
+ // Also maintain the list of all group items,
+ // Which helps speedup querying for existing items.
+ groupItem._allGroupDirectoryItems.push(directory);
+
+ return directory;
+}
+
+/**
+ * Definition of all Items of a SourceTree
+ */
+// Highlights the attributes that all Source Tree Item should expose
+function createBaseTreeItem({ type, parent, uniquePath, children }) {
+ return {
+ // Can be: thread, group, directory or source
+ type,
+ // Reference to the parent TreeItem
+ parent,
+ // This attribute is used for two things:
+ // * as a string key identified in the React Tree
+ // * for project root in order to find the root in the tree
+ // It is of the form:
+ // `${ThreadActorID}|${GroupName}|${DirectoryPath}|${SourceID}`
+ // Group and path/ID are optional.
+ // `|` is used as separator in order to avoid having this character being used in name/path/IDs.
+ uniquePath,
+ // Array of TreeItem, children of this item.
+ // Will be null for Source Tree Item
+ children,
+ };
+}
+function createThreadTreeItem(thread) {
+ return {
+ ...createBaseTreeItem({
+ type: "thread",
+ // Each thread is considered as an independant root item
+ parent: null,
+ uniquePath: thread,
+ // Children of threads will only be Group Items
+ children: [],
+ }),
+
+ // This will be used to set the reducer's thread object.
+ // This threadActorID attribute isn't meant to be used outside of this selector.
+ // A `thread` attribute will be exposed from INSERT_THREAD action.
+ threadActorID: thread,
+ };
+}
+function createGroupTreeItem(groupName, parent, source) {
+ return {
+ ...createBaseTreeItem({
+ type: "group",
+ parent,
+ uniquePath: `${parent.uniquePath}|${groupName}`,
+ // Children of Group can be Directory and Source items
+ children: [],
+ }),
+
+ groupName,
+
+ // When a content script appear in a web page,
+ // a dedicated group is created for it and should
+ // be having an extension icon.
+ isForExtensionSource: source.isExtension,
+
+ // List of all nested items for this group.
+ // This helps find any nested directory in a given group without having to walk the tree.
+ // This is meant to be used only by the reducer.
+ _allGroupDirectoryItems: [],
+ };
+}
+function createDirectoryTreeItem(path, parent) {
+ // If the parent is a group we want to use '/' as separator
+ const pathSeparator = parent.type == "directory" ? "/" : "|";
+
+ // `path` will be the absolute path from the group/domain,
+ // while we want to append only the directory name in uniquePath.
+ // Also, we need to strip '/' prefix.
+ const relativePath =
+ parent.type == "directory"
+ ? path.replace(parent.path, "").replace(/^\//, "")
+ : path;
+
+ return {
+ ...createBaseTreeItem({
+ type: "directory",
+ parent,
+ uniquePath: `${parent.uniquePath}${pathSeparator}${relativePath}`,
+ // Children can be nested Directory or Source items
+ children: [],
+ }),
+
+ // This is the absolute path from the "group"
+ // i.e. the path from the domain name
+ // For http://mozilla.org/foo/bar folder,
+ // path will be:
+ // foo/bar
+ path,
+ };
+}
+function createSourceTreeItem(source, sourceActor, parent) {
+ return {
+ ...createBaseTreeItem({
+ type: "source",
+ parent,
+ uniquePath: `${parent.uniquePath}|${source.id}`,
+ // Sources items are leaves of the SourceTree
+ children: null,
+ }),
+
+ source,
+ sourceActor,
+ };
+}
+
+/**
+ * Update `expanded` and `focusedItem` so that we show and focus
+ * the new selected source.
+ *
+ * @param {Object} state
+ * @param {Object} selectedLocation
+ * The new location being selected.
+ */
+function updateSelectedLocation(state, selectedLocation) {
+ const sourceItem = getSourceItemForSelectedLocation(state, selectedLocation);
+ if (sourceItem) {
+ // Walk up the tree to expand all ancestor items up to the root of the tree.
+ const expanded = new Set(state.expanded);
+ let parentDirectory = sourceItem;
+ while (parentDirectory) {
+ expanded.add(parentDirectory.uniquePath);
+ parentDirectory = parentDirectory.parent;
+ }
+
+ return {
+ ...state,
+ expanded,
+ focusedItem: sourceItem,
+ };
+ }
+ return state;
+}
+
+/**
+ * Get the SourceItem displayed in the SourceTree for the currently selected location.
+ *
+ * @param {Object} state
+ * @param {Object} selectedLocation
+ * @return {SourceItem}
+ * The directory source item where the given source is displayed.
+ */
+function getSourceItemForSelectedLocation(state, selectedLocation) {
+ const { source, sourceActor } = selectedLocation;
+
+ // Sources without URLs are not visible in the SourceTree
+ if (!source.url) {
+ return null;
+ }
+
+ // In the SourceTree, we never show the pretty printed sources and only
+ // the minified version, so if we are selecting a pretty file, fake selecting
+ // the minified version by looking up for the minified URL instead of the pretty one.
+ const sourceUrl = getRawSourceURL(source.url);
+
+ const { displayURL } = source;
+ function findSourceInItem(item, path) {
+ if (item.type == "source") {
+ if (item.source.url == sourceUrl) {
+ return item;
+ }
+ return null;
+ }
+ // Bail out if the current item doesn't match the source
+ if (item.type == "thread" && item.threadActorID != sourceActor?.thread) {
+ return null;
+ }
+ if (item.type == "group" && displayURL.group != item.groupName) {
+ return null;
+ }
+ if (item.type == "directory" && !path.startsWith(item.path)) {
+ return null;
+ }
+ // Otherwise, walk down the tree if this ancestor item seems to match
+ for (const child of item.children) {
+ const match = findSourceInItem(child, path);
+ if (match) {
+ return match;
+ }
+ }
+
+ return null;
+ }
+ for (const rootItem of state.threadItems) {
+ // Note that when we are setting a project root, rootItem
+ // may no longer be only Thread Item, but also be Group, Directory or Source Items.
+ const item = findSourceInItem(rootItem, displayURL.path);
+ if (item) {
+ return item;
+ }
+ }
+ return null;
+}
diff --git a/devtools/client/debugger/src/reducers/sources.js b/devtools/client/debugger/src/reducers/sources.js
new file mode 100644
index 0000000000..76160b75f2
--- /dev/null
+++ b/devtools/client/debugger/src/reducers/sources.js
@@ -0,0 +1,395 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Sources reducer
+ * @module reducers/sources
+ */
+
+import { originalToGeneratedId } from "devtools/client/shared/source-map-loader/index";
+import { prefs } from "../utils/prefs";
+import { createPendingSelectedLocation } from "../utils/location";
+
+export const UNDEFINED_LOCATION = Symbol("Undefined location");
+export const NO_LOCATION = Symbol("No location");
+
+export function initialSourcesState(state) {
+ /* eslint sort-keys: "error" */
+ return {
+ /**
+ * List of all breakpoint positions for all sources (generated and original).
+ * Map of source id (string) to dictionary object whose keys are line numbers
+ * and values of array of positions.
+ * A position is an object made with two attributes:
+ * location and generatedLocation. Both refering to breakpoint positions
+ * in original and generated sources.
+ * In case of generated source, the two location will be the same.
+ *
+ * Map(source id => Dictionary(int => array<Position>))
+ */
+ mutableBreakpointPositions: new Map(),
+
+ /**
+ * List of all breakable lines for original sources only.
+ *
+ * Map(source id => array<int : breakable line numbers>)
+ */
+ mutableOriginalBreakableLines: new Map(),
+
+ /**
+ * Map of the source id's to one or more related original source id's
+ * Only generated sources which have related original sources will be maintained here.
+ *
+ * Map(source id => array<Original Source ID>)
+ */
+ mutableOriginalSources: new Map(),
+
+ /**
+ * List of override objects whose sources texts have been locally overridden.
+ *
+ * Object { sourceUrl, path }
+ */
+ mutableOverrideSources: state?.mutableOverrideSources || new Map(),
+
+ /**
+ * Mapping of source id's to one or more source-actor's.
+ * Dictionary whose keys are source id's and values are arrays
+ * made of all the related source-actor's.
+ * Note: The source mapped here are only generated sources.
+ *
+ * "source" are the objects stored in this reducer, in the `sources` attribute.
+ * "source-actor" are the objects stored in the "source-actors.js" reducer, in its `sourceActors` attribute.
+ *
+ * Map(source id => array<Source Actor object>)
+ */
+ mutableSourceActors: new Map(),
+
+ /**
+ * All currently available sources.
+ *
+ * See create.js: `createSourceObject` method for the description of stored objects.
+ */
+ mutableSources: new Map(),
+
+ /**
+ * All sources associated with a given URL. When using source maps, multiple
+ * sources can have the same URL.
+ *
+ * Map(url => array<source>)
+ */
+ mutableSourcesPerUrl: new Map(),
+
+ /**
+ * When we want to select a source that isn't available yet, use this.
+ * The location object should have a url attribute instead of a sourceId.
+ *
+ * See `createPendingSelectedLocation` for the definition of this object.
+ */
+ pendingSelectedLocation: prefs.pendingSelectedLocation,
+
+ /**
+ * The actual currently selected location.
+ * Only set if the related source is already registered in the sources reducer.
+ * Otherwise, pendingSelectedLocation should be used. Typically for sources
+ * which are about to be created.
+ *
+ * It also includes line and column information.
+ *
+ * See `createLocation` for the definition of this object.
+ */
+ selectedLocation: undefined,
+
+ /**
+ * When selectedLocation refers to a generated source mapping to an original source
+ * via a source-map, refers to the related original location.
+ *
+ * This is UNDEFINED_LOCATION by default and will switch to NO_LOCATION asynchronously after location
+ * selection if there is no valid original location to map to.
+ */
+ selectedOriginalLocation: UNDEFINED_LOCATION,
+
+ /**
+ * By default, the `selectedLocation` should be highlighted in the editor with a special background.
+ * On demand, this flag can be set to false in order to prevent this.
+ * The location will be shown, but not highlighted.
+ */
+ shouldHighlightSelectedLocation: true,
+
+ /**
+ * By default, if we have a source-mapped source, we would automatically try
+ * to select and show the content of the original source. But, if we explicitly
+ * select a generated source, we remember this choice. That, until we explicitly
+ * select an original source.
+ * Note that selections related to non-source-mapped sources should never
+ * change this setting.
+ */
+ shouldSelectOriginalLocation: true,
+ };
+ /* eslint-disable sort-keys */
+}
+
+function update(state = initialSourcesState(), action) {
+ switch (action.type) {
+ case "ADD_SOURCES":
+ return addSources(state, action.sources);
+
+ case "ADD_ORIGINAL_SOURCES":
+ return addSources(state, action.originalSources);
+
+ case "INSERT_SOURCE_ACTORS":
+ return insertSourceActors(state, action);
+
+ case "SET_SELECTED_LOCATION": {
+ let pendingSelectedLocation = null;
+
+ if (action.location.source.url) {
+ pendingSelectedLocation = createPendingSelectedLocation(
+ action.location
+ );
+ prefs.pendingSelectedLocation = pendingSelectedLocation;
+ }
+
+ return {
+ ...state,
+ selectedLocation: action.location,
+ selectedOriginalLocation: UNDEFINED_LOCATION,
+ pendingSelectedLocation,
+ shouldSelectOriginalLocation: action.shouldSelectOriginalLocation,
+ shouldHighlightSelectedLocation: action.shouldHighlightSelectedLocation,
+ };
+ }
+
+ case "CLEAR_SELECTED_LOCATION": {
+ const pendingSelectedLocation = { url: "" };
+ prefs.pendingSelectedLocation = pendingSelectedLocation;
+
+ return {
+ ...state,
+ selectedLocation: null,
+ selectedOriginalLocation: UNDEFINED_LOCATION,
+ pendingSelectedLocation,
+ };
+ }
+
+ case "SET_ORIGINAL_SELECTED_LOCATION": {
+ if (action.location != state.selectedLocation) {
+ return state;
+ }
+ return {
+ ...state,
+ selectedOriginalLocation: action.originalLocation,
+ };
+ }
+
+ case "SET_PENDING_SELECTED_LOCATION": {
+ const pendingSelectedLocation = {
+ url: action.url,
+ line: action.line,
+ column: action.column,
+ };
+
+ prefs.pendingSelectedLocation = pendingSelectedLocation;
+ return { ...state, pendingSelectedLocation };
+ }
+
+ case "SET_ORIGINAL_BREAKABLE_LINES": {
+ state.mutableOriginalBreakableLines.set(
+ action.source.id,
+ action.breakableLines
+ );
+
+ return {
+ ...state,
+ };
+ }
+
+ case "ADD_BREAKPOINT_POSITIONS": {
+ // Merge existing and new reported position if some where already stored
+ let positions = state.mutableBreakpointPositions.get(action.source.id);
+ if (positions) {
+ positions = { ...positions, ...action.positions };
+ } else {
+ positions = action.positions;
+ }
+
+ state.mutableBreakpointPositions.set(action.source.id, positions);
+
+ return {
+ ...state,
+ };
+ }
+
+ case "REMOVE_THREAD": {
+ return removeSourcesAndActors(state, action);
+ }
+
+ case "SET_OVERRIDE": {
+ state.mutableOverrideSources.set(action.url, action.path);
+ return state;
+ }
+
+ case "REMOVE_OVERRIDE": {
+ if (state.mutableOverrideSources.has(action.url)) {
+ state.mutableOverrideSources.delete(action.url);
+ }
+ return state;
+ }
+ }
+
+ return state;
+}
+
+/*
+ * Add sources to the sources store
+ * - Add the source to the sources store
+ * - Add the source URL to the source url map
+ */
+function addSources(state, sources) {
+ for (const source of sources) {
+ state.mutableSources.set(source.id, source);
+
+ // Update the source url map
+ const existing = state.mutableSourcesPerUrl.get(source.url);
+ if (existing) {
+ // We never return this array from selectors as-is,
+ // we either return the first entry or lookup for a precise entry
+ // so we can mutate it.
+ existing.push(source);
+ } else {
+ state.mutableSourcesPerUrl.set(source.url, [source]);
+ }
+
+ // In case of original source, maintain the mapping of generated source to original sources map.
+ if (source.isOriginal) {
+ const generatedSourceId = originalToGeneratedId(source.id);
+ let originalSourceIds =
+ state.mutableOriginalSources.get(generatedSourceId);
+ if (!originalSourceIds) {
+ originalSourceIds = [];
+ state.mutableOriginalSources.set(generatedSourceId, originalSourceIds);
+ }
+ // We never return this array out of selectors, so mutate the list
+ originalSourceIds.push(source.id);
+ }
+ }
+
+ return { ...state };
+}
+
+function removeSourcesAndActors(state, action) {
+ const {
+ mutableSourcesPerUrl,
+ mutableSources,
+ mutableOriginalSources,
+ mutableSourceActors,
+ mutableOriginalBreakableLines,
+ mutableBreakpointPositions,
+ } = state;
+
+ const newState = { ...state };
+
+ for (const removedSource of action.sources) {
+ const sourceId = removedSource.id;
+
+ // Clear the urls Map
+ const sourceUrl = removedSource.url;
+ if (sourceUrl) {
+ const sourcesForSameUrl = (
+ mutableSourcesPerUrl.get(sourceUrl) || []
+ ).filter(s => s != removedSource);
+ if (!sourcesForSameUrl.length) {
+ // All sources with this URL have been removed
+ mutableSourcesPerUrl.delete(sourceUrl);
+ } else {
+ // There are other sources still alive with the same URL
+ mutableSourcesPerUrl.set(sourceUrl, sourcesForSameUrl);
+ }
+ }
+
+ mutableSources.delete(sourceId);
+
+ // Note that the caller of this method queried the reducer state
+ // to aggregate the related original sources.
+ // So if we were having related original sources, they will be
+ // in `action.sources`.
+ mutableOriginalSources.delete(sourceId);
+
+ // If a source is removed, immediately remove all its related source actors.
+ // It can speed-up the following for loop cleaning actors.
+ mutableSourceActors.delete(sourceId);
+
+ if (removedSource.isOriginal) {
+ mutableOriginalBreakableLines.delete(sourceId);
+ }
+
+ mutableBreakpointPositions.delete(sourceId);
+
+ if (newState.selectedLocation?.source == removedSource) {
+ newState.selectedLocation = null;
+ newState.selectedOriginalLocation = UNDEFINED_LOCATION;
+ }
+ }
+
+ for (const removedActor of action.actors) {
+ const sourceId = removedActor.source;
+ const actorsForSource = mutableSourceActors.get(sourceId);
+ // actors may have already been cleared by the previous for..loop
+ if (!actorsForSource) {
+ continue;
+ }
+ const idx = actorsForSource.indexOf(removedActor);
+ if (idx != -1) {
+ actorsForSource.splice(idx, 1);
+ // While the Map is mutable, we expect new array instance on each new change
+ mutableSourceActors.set(sourceId, [...actorsForSource]);
+ }
+
+ // Remove the entry in the Map if there is no more actors for that source
+ if (!actorsForSource.length) {
+ mutableSourceActors.delete(sourceId);
+ }
+
+ if (newState.selectedLocation?.sourceActor == removedActor) {
+ newState.selectedLocation = null;
+ newState.selectedOriginalLocation = UNDEFINED_LOCATION;
+ }
+ }
+
+ return newState;
+}
+
+function insertSourceActors(state, action) {
+ const { sourceActors } = action;
+
+ const { mutableSourceActors } = state;
+ // The `sourceActor` objects are defined from `newGeneratedSources` action:
+ // https://searchfox.org/mozilla-central/rev/4646b826a25d3825cf209db890862b45fa09ffc3/devtools/client/debugger/src/actions/sources/newSources.js#300-314
+ for (const sourceActor of sourceActors) {
+ const sourceId = sourceActor.source;
+ // We always clone the array of source actors as we return it from selectors.
+ // So the map is mutable, but its values are considered immutable and will change
+ // anytime there is a new actor added per source ID.
+ const existing = mutableSourceActors.get(sourceId);
+ if (existing) {
+ mutableSourceActors.set(sourceId, [...existing, sourceActor]);
+ } else {
+ mutableSourceActors.set(sourceId, [sourceActor]);
+ }
+ }
+
+ const scriptActors = sourceActors.filter(
+ item => item.introductionType === "scriptElement"
+ );
+ if (scriptActors.length) {
+ // If new HTML sources are being added, we need to clear the breakpoint
+ // positions since the new source is a <script> with new breakpoints.
+ for (const { source } of scriptActors) {
+ state.mutableBreakpointPositions.delete(source);
+ }
+ }
+
+ return { ...state };
+}
+
+export default update;
diff --git a/devtools/client/debugger/src/reducers/tabs.js b/devtools/client/debugger/src/reducers/tabs.js
new file mode 100644
index 0000000000..28d1d7b568
--- /dev/null
+++ b/devtools/client/debugger/src/reducers/tabs.js
@@ -0,0 +1,200 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Tabs reducer
+ * @module reducers/tabs
+ */
+
+import { isSimilarTab } from "../utils/tabs";
+
+export function initialTabState() {
+ return { tabs: [] };
+}
+
+function update(state = initialTabState(), action) {
+ switch (action.type) {
+ case "ADD_TAB":
+ return updateTabList(state, action.source, action.sourceActor);
+
+ case "MOVE_TAB":
+ return moveTabInList(state, action);
+
+ case "MOVE_TAB_BY_SOURCE_ID":
+ return moveTabInListBySourceId(state, action);
+
+ case "CLOSE_TABS":
+ return removeSourcesFromTabList(state, action);
+
+ case "ADD_ORIGINAL_SOURCES":
+ return addVisibleTabsForOriginalSources(
+ state,
+ action.originalSources,
+ action.generatedSourceActor
+ );
+
+ case "INSERT_SOURCE_ACTORS":
+ return addVisibleTabsForSourceActors(state, action.sourceActors);
+
+ case "REMOVE_THREAD": {
+ return resetTabsForThread(state, action.threadActorID);
+ }
+
+ default:
+ return state;
+ }
+}
+
+function matchesSource(tab, source) {
+ return tab.source?.id === source.id || matchesUrl(tab, source);
+}
+
+function matchesUrl(tab, source) {
+ return (
+ source.url && tab.url === source.url && tab.isOriginal == source.isOriginal
+ );
+}
+
+function addVisibleTabsForSourceActors(state, sourceActors) {
+ let changed = false;
+ // Lookups for tabs matching any source actor's URL
+ // and reference their source and sourceActor attribute
+ // so that the tab becomes visible.
+ const tabs = state.tabs.map(tab => {
+ const sourceActor = sourceActors.find(actor =>
+ matchesUrl(tab, actor.sourceObject)
+ );
+ if (!sourceActor) {
+ return tab;
+ }
+ changed = true;
+ return {
+ ...tab,
+ source: sourceActor.sourceObject,
+ sourceActor,
+ };
+ });
+
+ return changed ? { tabs } : state;
+}
+
+function addVisibleTabsForOriginalSources(
+ state,
+ sources,
+ generatedSourceActor
+) {
+ let changed = false;
+
+ // Lookups for tabs matching any source's URL
+ // and reference their source and sourceActor attribute
+ // so that the tab becomes visible.
+ const tabs = state.tabs.map(tab => {
+ const source = sources.find(s => matchesUrl(tab, s));
+ if (!source) {
+ return tab;
+ }
+ changed = true;
+ return {
+ ...tab,
+ source,
+ // All currently reported original sources are related to a single source actor
+ sourceActor: generatedSourceActor,
+ };
+ });
+
+ return changed ? { tabs } : state;
+}
+
+function removeSourcesFromTabList(state, { sources }) {
+ const newTabs = sources.reduce(
+ (tabList, source) => tabList.filter(tab => !matchesSource(tab, source)),
+ state.tabs
+ );
+ if (newTabs.length == state.tabs.length) {
+ return state;
+ }
+
+ return { tabs: newTabs };
+}
+
+function resetTabsForThread(state, threadActorID) {
+ let changed = false;
+ // Nullify source and sourceActor attributes of all tabs
+ // related to the given thread so that they become hidden.
+ //
+ // They may later be restored if a source matches their URL again.
+ // This is similar to persistTabs, but specific to a unique thread.
+ const tabs = state.tabs.map(tab => {
+ if (tab.sourceActor?.thread != threadActorID) {
+ return tab;
+ }
+ changed = true;
+ return {
+ ...tab,
+ source: null,
+ sourceActor: null,
+ };
+ });
+
+ return changed ? { tabs } : state;
+}
+
+/**
+ * Adds the new source to the tab list if it is not already there.
+ */
+function updateTabList(state, source, sourceActor) {
+ const { url } = source;
+ const isOriginal = source.isOriginal;
+
+ let { tabs } = state;
+ // Set currentIndex to -1 for URL-less tabs so that they aren't
+ // filtered by isSimilarTab
+ const currentIndex = url
+ ? tabs.findIndex(tab => isSimilarTab(tab, url, isOriginal))
+ : -1;
+
+ if (currentIndex === -1) {
+ const newTab = {
+ url,
+ source,
+ isOriginal,
+ sourceActor,
+ };
+ // New tabs are added first in the list
+ tabs = [newTab, ...tabs];
+ } else {
+ return state;
+ }
+
+ return { ...state, tabs };
+}
+
+function moveTabInList(state, { url, tabIndex: newIndex }) {
+ const currentIndex = state.tabs.findIndex(tab => tab.url == url);
+ return moveTab(state, currentIndex, newIndex);
+}
+
+function moveTabInListBySourceId(state, { sourceId, tabIndex: newIndex }) {
+ const currentIndex = state.tabs.findIndex(tab => tab.source?.id == sourceId);
+ return moveTab(state, currentIndex, newIndex);
+}
+
+function moveTab(state, currentIndex, newIndex) {
+ const { tabs } = state;
+ const item = tabs[currentIndex];
+ // Avoid any state change if we are on the same position or the new is invalid
+ if (currentIndex == newIndex || isNaN(newIndex)) {
+ return state;
+ }
+
+ const newTabs = Array.from(tabs);
+ // Remove the item from its current location
+ newTabs.splice(currentIndex, 1);
+ // And add it to the new one
+ newTabs.splice(newIndex, 0, item);
+
+ return { tabs: newTabs };
+}
+
+export default update;
diff --git a/devtools/client/debugger/src/reducers/tests/breakpoints.spec.js b/devtools/client/debugger/src/reducers/tests/breakpoints.spec.js
new file mode 100644
index 0000000000..043c59dc5f
--- /dev/null
+++ b/devtools/client/debugger/src/reducers/tests/breakpoints.spec.js
@@ -0,0 +1,73 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { initialBreakpointsState } from "../breakpoints";
+import { getBreakpointsForSource } from "../../selectors/breakpoints";
+
+import { makeMockBreakpoint, makeMockSource } from "../../utils/test-mockup";
+
+function initializeStateWith(data) {
+ const state = initialBreakpointsState();
+ state.breakpoints = data;
+ return state;
+}
+
+describe("Breakpoints Selectors", () => {
+ it("gets a breakpoint for an original source", () => {
+ const sourceId = "server1.conn1.child1/source1/originalSource";
+ const source = makeMockSource(undefined, sourceId);
+ const matchingBreakpoints = {
+ id1: makeMockBreakpoint(source, 1),
+ };
+
+ const otherBreakpoints = {
+ id2: makeMockBreakpoint(makeMockSource(undefined, "not-this-source"), 1),
+ };
+
+ const data = {
+ ...matchingBreakpoints,
+ ...otherBreakpoints,
+ };
+
+ const breakpoints = initializeStateWith(data);
+ const allBreakpoints = Object.values(matchingBreakpoints);
+ const sourceBreakpoints = getBreakpointsForSource({ breakpoints }, source);
+
+ expect(sourceBreakpoints).toEqual(allBreakpoints);
+ expect(sourceBreakpoints[0] === allBreakpoints[0]).toBe(true);
+ });
+
+ it("gets a breakpoint for a generated source", () => {
+ const generatedSourceId = "random-source";
+ const generatedSource = makeMockSource(undefined, generatedSourceId);
+ const matchingBreakpoints = {
+ id1: {
+ ...makeMockBreakpoint(generatedSource, 1),
+ location: { line: 1, source: { id: "original-source-id-1" } },
+ },
+ };
+
+ const otherBreakpoints = {
+ id2: {
+ ...makeMockBreakpoint(makeMockSource(undefined, "not-this-source"), 1),
+ location: { line: 1, source: { id: "original-source-id-2" } },
+ },
+ };
+
+ const data = {
+ ...matchingBreakpoints,
+ ...otherBreakpoints,
+ };
+
+ const breakpoints = initializeStateWith(data);
+
+ const allBreakpoints = Object.values(matchingBreakpoints);
+ const sourceBreakpoints = getBreakpointsForSource(
+ { breakpoints },
+ generatedSource
+ );
+
+ expect(sourceBreakpoints).toEqual(allBreakpoints);
+ });
+});
diff --git a/devtools/client/debugger/src/reducers/tests/quick-open.spec.js b/devtools/client/debugger/src/reducers/tests/quick-open.spec.js
new file mode 100644
index 0000000000..cd91b040be
--- /dev/null
+++ b/devtools/client/debugger/src/reducers/tests/quick-open.spec.js
@@ -0,0 +1,59 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import update, { initialQuickOpenState } from "../quick-open";
+import {
+ getQuickOpenEnabled,
+ getQuickOpenQuery,
+ getQuickOpenType,
+} from "../../selectors/quick-open";
+import {
+ setQuickOpenQuery,
+ openQuickOpen,
+ closeQuickOpen,
+} from "../../actions/quick-open";
+
+describe("quickOpen reducer", () => {
+ test("initial state", () => {
+ const state = update(undefined, { type: "FAKE" });
+ expect(getQuickOpenQuery({ quickOpen: state })).toEqual("");
+ expect(getQuickOpenType({ quickOpen: state })).toEqual("sources");
+ });
+
+ test("opens the quickOpen modal", () => {
+ const state = update(initialQuickOpenState(), openQuickOpen());
+ expect(getQuickOpenEnabled({ quickOpen: state })).toEqual(true);
+ });
+
+ test("closes the quickOpen modal", () => {
+ let state = update(initialQuickOpenState(), openQuickOpen());
+ expect(getQuickOpenEnabled({ quickOpen: state })).toEqual(true);
+ state = update(initialQuickOpenState(), closeQuickOpen());
+ expect(getQuickOpenEnabled({ quickOpen: state })).toEqual(false);
+ });
+
+ test("leaves query alone on open if not provided", () => {
+ const state = update(initialQuickOpenState(), openQuickOpen());
+ expect(getQuickOpenQuery({ quickOpen: state })).toEqual("");
+ expect(getQuickOpenType({ quickOpen: state })).toEqual("sources");
+ });
+
+ test("set query on open if provided", () => {
+ const state = update(initialQuickOpenState(), openQuickOpen("@"));
+ expect(getQuickOpenQuery({ quickOpen: state })).toEqual("@");
+ expect(getQuickOpenType({ quickOpen: state })).toEqual("functions");
+ });
+
+ test("clear query on close", () => {
+ const state = update(initialQuickOpenState(), closeQuickOpen());
+ expect(getQuickOpenQuery({ quickOpen: state })).toEqual("");
+ expect(getQuickOpenType({ quickOpen: state })).toEqual("sources");
+ });
+
+ test("sets the query to the provided string", () => {
+ const state = update(initialQuickOpenState(), setQuickOpenQuery("test"));
+ expect(getQuickOpenQuery({ quickOpen: state })).toEqual("test");
+ expect(getQuickOpenType({ quickOpen: state })).toEqual("sources");
+ });
+});
diff --git a/devtools/client/debugger/src/reducers/tests/ui.spec.js b/devtools/client/debugger/src/reducers/tests/ui.spec.js
new file mode 100644
index 0000000000..0be451429f
--- /dev/null
+++ b/devtools/client/debugger/src/reducers/tests/ui.spec.js
@@ -0,0 +1,30 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { prefs } from "../../utils/prefs";
+import update, { initialUIState } from "../ui";
+
+describe("ui reducer", () => {
+ it("toggle framework grouping to false", () => {
+ const state = initialUIState();
+ const value = false;
+ const updatedState = update(state, {
+ type: "TOGGLE_FRAMEWORK_GROUPING",
+ value,
+ });
+ expect(updatedState.frameworkGroupingOn).toBe(value);
+ expect(prefs.frameworkGroupingOn).toBe(value);
+ });
+
+ it("toggle framework grouping to true", () => {
+ const state = initialUIState();
+ const value = true;
+ const updatedState = update(state, {
+ type: "TOGGLE_FRAMEWORK_GROUPING",
+ value,
+ });
+ expect(updatedState.frameworkGroupingOn).toBe(value);
+ expect(prefs.frameworkGroupingOn).toBe(value);
+ });
+});
diff --git a/devtools/client/debugger/src/reducers/threads.js b/devtools/client/debugger/src/reducers/threads.js
new file mode 100644
index 0000000000..0131c6c7e8
--- /dev/null
+++ b/devtools/client/debugger/src/reducers/threads.js
@@ -0,0 +1,69 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Threads reducer
+ * @module reducers/threads
+ */
+
+export function initialThreadsState() {
+ return {
+ threads: [],
+
+ // List of thread actor IDs which are current tracing.
+ // i.e. where JavaScript tracing is enabled.
+ mutableTracingThreads: new Set(),
+ };
+}
+
+export default function update(state = initialThreadsState(), action) {
+ switch (action.type) {
+ case "INSERT_THREAD":
+ return {
+ ...state,
+ threads: [...state.threads, action.newThread],
+ };
+
+ case "REMOVE_THREAD":
+ return {
+ ...state,
+ threads: state.threads.filter(
+ thread => action.threadActorID != thread.actor
+ ),
+ };
+
+ case "UPDATE_SERVICE_WORKER_STATUS":
+ return {
+ ...state,
+ threads: state.threads.map(t => {
+ if (t.actor == action.thread) {
+ return { ...t, serviceWorkerStatus: action.status };
+ }
+ return t;
+ }),
+ };
+
+ case "TRACING_TOGGLED":
+ const { mutableTracingThreads } = state;
+ const sizeBefore = mutableTracingThreads.size;
+ if (action.enabled) {
+ mutableTracingThreads.add(action.thread);
+ } else {
+ mutableTracingThreads.delete(action.thread);
+ }
+ // We may receive toggle events when we change the logging method
+ // while we are already tracing, but the list of tracing thread stays the same.
+ const changed = mutableTracingThreads.size != sizeBefore;
+ if (changed) {
+ return {
+ ...state,
+ mutableTracingThreads,
+ };
+ }
+ return state;
+
+ default:
+ return state;
+ }
+}
diff --git a/devtools/client/debugger/src/reducers/ui.js b/devtools/client/debugger/src/reducers/ui.js
new file mode 100644
index 0000000000..7f37d2f54f
--- /dev/null
+++ b/devtools/client/debugger/src/reducers/ui.js
@@ -0,0 +1,253 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/* eslint-disable complexity */
+
+/**
+ * UI reducer
+ * @module reducers/ui
+ */
+
+import { prefs, features } from "../utils/prefs";
+import { searchKeys } from "../constants";
+
+export const initialUIState = () => ({
+ selectedPrimaryPaneTab: "sources",
+ activeSearch: null,
+ startPanelCollapsed: prefs.startPanelCollapsed,
+ endPanelCollapsed: prefs.endPanelCollapsed,
+ frameworkGroupingOn: prefs.frameworkGroupingOn,
+
+ // This is used from Outline's copy to clipboard context menu
+ // and QuickOpen to highlight lines temporarily.
+ // If defined, it will be an object with following attributes:
+ // - sourceId, String
+ // - start, Number, start line to highlight, 1-based
+ // - end, Number, end line to highlight, 1-based
+ highlightedLineRange: null,
+
+ conditionalPanelLocation: null,
+ isLogPoint: false,
+ orientation: "horizontal",
+ viewport: null,
+ cursorPosition: null,
+ inlinePreviewEnabled: features.inlinePreview,
+ editorWrappingEnabled: prefs.editorWrapping,
+ javascriptEnabled: true,
+ javascriptTracingEnabled: false,
+ javascriptTracingLogMethod: prefs.javascriptTracingLogMethod,
+ javascriptTracingValues: prefs.javascriptTracingValues,
+ javascriptTracingOnNextInteraction: prefs.javascriptTracingOnNextInteraction,
+ javascriptTracingOnNextLoad: prefs.javascriptTracingOnNextLoad,
+ javascriptTracingFunctionReturn: prefs.javascriptTracingFunctionReturn,
+ mutableSearchOptions: prefs.searchOptions || {
+ [searchKeys.FILE_SEARCH]: {
+ regexMatch: false,
+ wholeWord: false,
+ caseSensitive: false,
+ excludePatterns: "",
+ },
+ [searchKeys.PROJECT_SEARCH]: {
+ regexMatch: false,
+ wholeWord: false,
+ caseSensitive: false,
+ excludePatterns: "",
+ },
+ [searchKeys.QUICKOPEN_SEARCH]: {
+ regexMatch: false,
+ wholeWord: false,
+ caseSensitive: false,
+ excludePatterns: "",
+ },
+ },
+ projectSearchQuery: "",
+ hideIgnoredSources: prefs.hideIgnoredSources,
+ sourceMapIgnoreListEnabled: prefs.sourceMapIgnoreListEnabled,
+});
+
+function update(state = initialUIState(), action) {
+ switch (action.type) {
+ case "TOGGLE_ACTIVE_SEARCH": {
+ return { ...state, activeSearch: action.value };
+ }
+
+ case "TOGGLE_FRAMEWORK_GROUPING": {
+ prefs.frameworkGroupingOn = action.value;
+ return { ...state, frameworkGroupingOn: action.value };
+ }
+
+ case "TOGGLE_INLINE_PREVIEW": {
+ features.inlinePreview = action.value;
+ return { ...state, inlinePreviewEnabled: action.value };
+ }
+
+ case "TOGGLE_EDITOR_WRAPPING": {
+ prefs.editorWrapping = action.value;
+ return { ...state, editorWrappingEnabled: action.value };
+ }
+
+ case "TOGGLE_JAVASCRIPT_ENABLED": {
+ return { ...state, javascriptEnabled: action.value };
+ }
+
+ case "TOGGLE_SOURCE_MAPS_ENABLED": {
+ prefs.clientSourceMapsEnabled = action.value;
+ return { ...state };
+ }
+
+ case "SET_ORIENTATION": {
+ return { ...state, orientation: action.orientation };
+ }
+
+ case "TOGGLE_PANE": {
+ if (action.position == "start") {
+ prefs.startPanelCollapsed = action.paneCollapsed;
+ return { ...state, startPanelCollapsed: action.paneCollapsed };
+ }
+
+ prefs.endPanelCollapsed = action.paneCollapsed;
+ return { ...state, endPanelCollapsed: action.paneCollapsed };
+ }
+
+ case "HIGHLIGHT_LINES": {
+ return { ...state, highlightedLineRange: action.location };
+ }
+
+ case "CLOSE_QUICK_OPEN":
+ case "CLEAR_HIGHLIGHT_LINES":
+ if (!state.highlightedLineRange) {
+ return state;
+ }
+ return { ...state, highlightedLineRange: null };
+
+ case "OPEN_CONDITIONAL_PANEL":
+ return {
+ ...state,
+ conditionalPanelLocation: action.location,
+ isLogPoint: action.log,
+ };
+
+ case "CLOSE_CONDITIONAL_PANEL":
+ return { ...state, conditionalPanelLocation: null };
+
+ case "SET_PRIMARY_PANE_TAB":
+ return { ...state, selectedPrimaryPaneTab: action.tabName };
+
+ case "CLOSE_PROJECT_SEARCH": {
+ if (state.activeSearch === "project") {
+ return { ...state, activeSearch: null };
+ }
+ return state;
+ }
+
+ case "SET_VIEWPORT": {
+ return { ...state, viewport: action.viewport };
+ }
+
+ case "SET_CURSOR_POSITION": {
+ return { ...state, cursorPosition: action.cursorPosition };
+ }
+
+ case "NAVIGATE": {
+ return { ...state, highlightedLineRange: null };
+ }
+
+ case "REMOVE_THREAD": {
+ // Reset the highlighted range if the related source has been removed
+ const sourceId = state.highlightedLineRange?.sourceId;
+ if (sourceId && action.sources.some(s => s.id == sourceId)) {
+ return { ...state, highlightedLineRange: null };
+ }
+ return state;
+ }
+
+ case "TOGGLE_TRACING": {
+ if (action.status === "start") {
+ return { ...state, javascriptTracingEnabled: action.enabled };
+ }
+ return state;
+ }
+
+ case "SET_JAVASCRIPT_TRACING_LOG_METHOD": {
+ prefs.javascriptTracingLogMethod = action.value;
+ return { ...state, javascriptTracingLogMethod: action.value };
+ }
+
+ case "TOGGLE_JAVASCRIPT_TRACING_VALUES": {
+ prefs.javascriptTracingValues = !prefs.javascriptTracingValues;
+ return {
+ ...state,
+ javascriptTracingValues: prefs.javascriptTracingValues,
+ };
+ }
+
+ case "TOGGLE_JAVASCRIPT_TRACING_ON_NEXT_INTERACTION": {
+ prefs.javascriptTracingOnNextInteraction =
+ !prefs.javascriptTracingOnNextInteraction;
+ return {
+ ...state,
+ javascriptTracingOnNextInteraction:
+ prefs.javascriptTracingOnNextInteraction,
+ };
+ }
+
+ case "TOGGLE_JAVASCRIPT_TRACING_ON_NEXT_LOAD": {
+ prefs.javascriptTracingOnNextLoad = !prefs.javascriptTracingOnNextLoad;
+ return {
+ ...state,
+ javascriptTracingOnNextLoad: prefs.javascriptTracingOnNextLoad,
+ };
+ }
+
+ case "TOGGLE_JAVASCRIPT_TRACING_FUNCTION_RETURN": {
+ prefs.javascriptTracingFunctionReturn =
+ !prefs.javascriptTracingFunctionReturn;
+ return {
+ ...state,
+ javascriptTracingFunctionReturn: prefs.javascriptTracingFunctionReturn,
+ };
+ }
+
+ case "SET_SEARCH_OPTIONS": {
+ state.mutableSearchOptions[action.searchKey] = {
+ ...state.mutableSearchOptions[action.searchKey],
+ ...action.searchOptions,
+ };
+ prefs.searchOptions = state.mutableSearchOptions;
+ return { ...state };
+ }
+
+ case "SET_PROJECT_SEARCH_QUERY": {
+ if (action.query != state.projectSearchQuery) {
+ state.projectSearchQuery = action.query;
+ return { ...state };
+ }
+ return state;
+ }
+
+ case "HIDE_IGNORED_SOURCES": {
+ const { shouldHide } = action;
+ if (shouldHide !== state.hideIgnoredSources) {
+ prefs.hideIgnoredSources = shouldHide;
+ return { ...state, hideIgnoredSources: shouldHide };
+ }
+ return state;
+ }
+
+ case "ENABLE_SOURCEMAP_IGNORELIST": {
+ const { shouldEnable } = action;
+ if (shouldEnable !== state.sourceMapIgnoreListEnabled) {
+ prefs.sourceMapIgnoreListEnabled = shouldEnable;
+ return { ...state, sourceMapIgnoreListEnabled: shouldEnable };
+ }
+ return state;
+ }
+
+ default: {
+ return state;
+ }
+ }
+}
+
+export default update;
diff --git a/devtools/client/debugger/src/selectors/ast.js b/devtools/client/debugger/src/selectors/ast.js
new file mode 100644
index 0000000000..4e2995d95c
--- /dev/null
+++ b/devtools/client/debugger/src/selectors/ast.js
@@ -0,0 +1,32 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { makeBreakpointId } from "../utils/breakpoint/index";
+
+export function getSymbols(state, location) {
+ if (!location) {
+ return null;
+ }
+ if (location.source.isOriginal) {
+ return (
+ state.ast.mutableOriginalSourcesSymbols[location.source.id]?.value || null
+ );
+ }
+ if (!location.sourceActor) {
+ throw new Error(
+ "Expects a location with a source actor when passing non-original sources to getSymbols"
+ );
+ }
+ return (
+ state.ast.mutableSourceActorSymbols[location.sourceActor.id]?.value || null
+ );
+}
+
+export function getInScopeLines(state, location) {
+ return state.ast.mutableInScopeLines[makeBreakpointId(location)]?.lines;
+}
+
+export function hasInScopeLines(state, location) {
+ return !!getInScopeLines(state, location);
+}
diff --git a/devtools/client/debugger/src/selectors/breakpointAtLocation.js b/devtools/client/debugger/src/selectors/breakpointAtLocation.js
new file mode 100644
index 0000000000..a542d86aeb
--- /dev/null
+++ b/devtools/client/debugger/src/selectors/breakpointAtLocation.js
@@ -0,0 +1,120 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { getSelectedSource, getBreakpointPositionsForLine } from "./sources";
+import { getBreakpointsList } from "./breakpoints";
+
+function getColumn(column, selectedSource) {
+ if (column) {
+ return column;
+ }
+
+ return !selectedSource.isOriginal ? undefined : 0;
+}
+
+function getLocation(bp, selectedSource) {
+ return !selectedSource.isOriginal
+ ? bp.generatedLocation || bp.location
+ : bp.location;
+}
+
+function getBreakpointsForSource(state, selectedSource) {
+ const breakpoints = getBreakpointsList(state);
+
+ return breakpoints.filter(bp => {
+ const location = getLocation(bp, selectedSource);
+ return location.source.id === selectedSource.id;
+ });
+}
+
+function findBreakpointAtLocation(
+ breakpoints,
+ selectedSource,
+ { line, column }
+) {
+ return breakpoints.find(breakpoint => {
+ const location = getLocation(breakpoint, selectedSource);
+ const sameLine = location.line === line;
+ if (!sameLine) {
+ return false;
+ }
+
+ if (column === undefined) {
+ return true;
+ }
+
+ return location.column === getColumn(column, selectedSource);
+ });
+}
+
+// returns the closest active column breakpoint
+function findClosestBreakpoint(breakpoints, column) {
+ if (!breakpoints || !breakpoints.length) {
+ return null;
+ }
+
+ const firstBreakpoint = breakpoints[0];
+ return breakpoints.reduce((closestBp, currentBp) => {
+ const currentColumn = currentBp.generatedLocation.column;
+ const closestColumn = closestBp.generatedLocation.column;
+ // check that breakpoint has a column.
+ if (column && currentColumn && closestColumn) {
+ const currentDistance = Math.abs(currentColumn - column);
+ const closestDistance = Math.abs(closestColumn - column);
+
+ return currentDistance < closestDistance ? currentBp : closestBp;
+ }
+ return closestBp;
+ }, firstBreakpoint);
+}
+
+/*
+ * Finds a breakpoint at a location (line, column) of the
+ * selected source.
+ *
+ * This is useful for finding a breakpoint when the
+ * user clicks in the gutter or on a token.
+ */
+export function getBreakpointAtLocation(state, location) {
+ const selectedSource = getSelectedSource(state);
+ if (!selectedSource) {
+ throw new Error("no selectedSource");
+ }
+ const breakpoints = getBreakpointsForSource(state, selectedSource);
+
+ return findBreakpointAtLocation(breakpoints, selectedSource, location);
+}
+
+export function getBreakpointsAtLine(state, line) {
+ const selectedSource = getSelectedSource(state);
+ if (!selectedSource) {
+ throw new Error("no selectedSource");
+ }
+ const breakpoints = getBreakpointsForSource(state, selectedSource);
+
+ return breakpoints.filter(
+ breakpoint => getLocation(breakpoint, selectedSource).line === line
+ );
+}
+
+export function getClosestBreakpoint(state, position) {
+ const columnBreakpoints = getBreakpointsAtLine(state, position.line);
+ const breakpoint = findClosestBreakpoint(columnBreakpoints, position.column);
+ return breakpoint;
+}
+
+export function getClosestBreakpointPosition(state, position) {
+ const selectedSource = getSelectedSource(state);
+ if (!selectedSource) {
+ throw new Error("no selectedSource");
+ }
+
+ const columnBreakpoints = getBreakpointPositionsForLine(
+ state,
+ selectedSource.id,
+ position.line
+ );
+
+ return findClosestBreakpoint(columnBreakpoints, position.column);
+}
diff --git a/devtools/client/debugger/src/selectors/breakpointSources.js b/devtools/client/debugger/src/selectors/breakpointSources.js
new file mode 100644
index 0000000000..a0daedae21
--- /dev/null
+++ b/devtools/client/debugger/src/selectors/breakpointSources.js
@@ -0,0 +1,52 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { createSelector } from "devtools/client/shared/vendor/reselect";
+import { getSelectedSource } from "./sources";
+import { getBreakpointsList } from "./breakpoints";
+import { getFilename } from "../utils/source";
+import { getSelectedLocation } from "../utils/selected-location";
+
+// Returns a list of sources with their related breakpoints:
+// [{ source, breakpoints: [breakpoint1, ...] }, ...]
+//
+// This only returns sources for which we have a visible breakpoint.
+// This will return either generated or original source based on the currently
+// selected source.
+export const getBreakpointSources = createSelector(
+ getBreakpointsList,
+ getSelectedSource,
+ (breakpoints, selectedSource) => {
+ const visibleBreakpoints = breakpoints.filter(
+ bp =>
+ !bp.options.hidden &&
+ (bp.text || bp.originalText || bp.options.condition || bp.disabled)
+ );
+
+ const sources = new Map();
+ for (const breakpoint of visibleBreakpoints) {
+ // Depending on the selected source, this will match the original or generated
+ // location of the given selected source.
+ const location = getSelectedLocation(breakpoint, selectedSource);
+ const { source } = location;
+
+ // We may have more than one breakpoint per source,
+ // so use the map to have a unique entry per source.
+ if (!sources.has(source)) {
+ sources.set(source, {
+ source,
+ breakpoints: [breakpoint],
+ filename: getFilename(source),
+ });
+ } else {
+ sources.get(source).breakpoints.push(breakpoint);
+ }
+ }
+
+ // Returns an array of breakpoints info per source, sorted by source's filename
+ return [...sources.values()].sort((a, b) =>
+ a.filename.localeCompare(b.filename)
+ );
+ }
+);
diff --git a/devtools/client/debugger/src/selectors/breakpoints.js b/devtools/client/debugger/src/selectors/breakpoints.js
new file mode 100644
index 0000000000..29b8fbdd42
--- /dev/null
+++ b/devtools/client/debugger/src/selectors/breakpoints.js
@@ -0,0 +1,84 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { createSelector } from "devtools/client/shared/vendor/reselect";
+
+import { makeBreakpointId } from "../utils/breakpoint/index";
+
+// This method is only used from the main test helper
+export function getBreakpointsMap(state) {
+ return state.breakpoints.breakpoints;
+}
+
+export const getBreakpointsList = createSelector(
+ state => state.breakpoints.breakpoints,
+ breakpoints => Object.values(breakpoints)
+);
+
+export function getBreakpointCount(state) {
+ return getBreakpointsList(state).length;
+}
+
+export function getBreakpoint(state, location) {
+ if (!location) {
+ return undefined;
+ }
+
+ const breakpoints = getBreakpointsMap(state);
+ return breakpoints[makeBreakpointId(location)];
+}
+
+/**
+ * Gets the breakpoints on a line or within a range of lines
+ * @param {Object} state
+ * @param {Number} source
+ * @param {Number|Object} lines - line or an object with a start and end range of lines
+ * @returns {Array} breakpoints
+ */
+export function getBreakpointsForSource(state, source, lines) {
+ if (!source) {
+ return [];
+ }
+
+ const breakpoints = getBreakpointsList(state);
+ return breakpoints.filter(bp => {
+ const location = source.isOriginal ? bp.location : bp.generatedLocation;
+
+ if (lines) {
+ const isOnLineOrWithinRange =
+ typeof lines == "number"
+ ? location.line == lines
+ : location.line >= lines.start.line &&
+ location.line <= lines.end.line;
+ return location.source === source && isOnLineOrWithinRange;
+ }
+ return location.source === source;
+ });
+}
+
+export function getHiddenBreakpoint(state) {
+ const breakpoints = getBreakpointsList(state);
+ return breakpoints.find(bp => bp.options.hidden);
+}
+
+export function hasLogpoint(state, location) {
+ const breakpoint = getBreakpoint(state, location);
+ return breakpoint?.options.logValue;
+}
+
+export function getXHRBreakpoints(state) {
+ return state.breakpoints.xhrBreakpoints;
+}
+
+export const shouldPauseOnAnyXHR = createSelector(
+ getXHRBreakpoints,
+ xhrBreakpoints => {
+ const emptyBp = xhrBreakpoints.find(({ path }) => path.length === 0);
+ if (!emptyBp) {
+ return false;
+ }
+
+ return !emptyBp.disabled;
+ }
+);
diff --git a/devtools/client/debugger/src/selectors/event-listeners.js b/devtools/client/debugger/src/selectors/event-listeners.js
new file mode 100644
index 0000000000..dcbcd8109f
--- /dev/null
+++ b/devtools/client/debugger/src/selectors/event-listeners.js
@@ -0,0 +1,19 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+export function getActiveEventListeners(state) {
+ return state.eventListenerBreakpoints.active;
+}
+
+export function getEventListenerBreakpointTypes(state) {
+ return state.eventListenerBreakpoints.categories;
+}
+
+export function getEventListenerExpanded(state) {
+ return state.eventListenerBreakpoints.expanded;
+}
+
+export function shouldLogEventBreakpoints(state) {
+ return state.eventListenerBreakpoints.logEventBreakpoints;
+}
diff --git a/devtools/client/debugger/src/selectors/exceptions.js b/devtools/client/debugger/src/selectors/exceptions.js
new file mode 100644
index 0000000000..f5a1a3f074
--- /dev/null
+++ b/devtools/client/debugger/src/selectors/exceptions.js
@@ -0,0 +1,58 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { createSelector } from "devtools/client/shared/vendor/reselect";
+import { shallowEqual, arrayShallowEqual } from "../utils/shallow-equal";
+
+import { getSelectedSource, getSourceActorsForSource } from "./index";
+
+export const getSelectedSourceExceptions = createSelector(
+ getSelectedSourceActors,
+ // Do not retrieve mutableExceptionsMap as it will never change and createSelector would
+ // prevent re-running the selector in case of modification. state.exception is the `state`
+ // in the reducer, which we take care of cloning in case of new exception.
+ state => state.exceptions,
+ (sourceActors, exceptionsState) => {
+ const { mutableExceptionsMap } = exceptionsState;
+ const sourceExceptions = [];
+
+ for (const sourceActor of sourceActors) {
+ const exceptions = mutableExceptionsMap.get(sourceActor.id);
+ if (exceptions) {
+ sourceExceptions.push(...exceptions);
+ }
+ }
+
+ return sourceExceptions;
+ },
+ // Shallow compare both input and output because of arrays being possibly always
+ // different instance but with same content.
+ {
+ memoizeOptions: {
+ equalityCheck: shallowEqual,
+ resultEqualityCheck: arrayShallowEqual,
+ },
+ }
+);
+
+function getSelectedSourceActors(state) {
+ const selectedSource = getSelectedSource(state);
+ if (!selectedSource) {
+ return [];
+ }
+ return getSourceActorsForSource(state, selectedSource.id);
+}
+
+export function getSelectedException(state, line, column) {
+ const sourceExceptions = getSelectedSourceExceptions(state);
+
+ if (!sourceExceptions) {
+ return undefined;
+ }
+
+ return sourceExceptions.find(
+ sourceExc =>
+ sourceExc.lineNumber === line && sourceExc.columnNumber === column
+ );
+}
diff --git a/devtools/client/debugger/src/selectors/expressions.js b/devtools/client/debugger/src/selectors/expressions.js
new file mode 100644
index 0000000000..085aa63033
--- /dev/null
+++ b/devtools/client/debugger/src/selectors/expressions.js
@@ -0,0 +1,29 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { createSelector } from "devtools/client/shared/vendor/reselect";
+
+const getExpressionsWrapper = state => state.expressions;
+
+export const getExpressions = createSelector(
+ getExpressionsWrapper,
+ expressions => expressions.expressions
+);
+
+const getAutocompleteMatches = createSelector(
+ getExpressionsWrapper,
+ expressions => expressions.autocompleteMatches
+);
+
+export function getExpression(state, input) {
+ return getExpressions(state).find(exp => exp.input == input);
+}
+
+export function getAutocompleteMatchset(state) {
+ const input = state.expressions.currentAutocompleteInput;
+ if (!input) {
+ return null;
+ }
+ return getAutocompleteMatches(state)[input];
+}
diff --git a/devtools/client/debugger/src/selectors/index.js b/devtools/client/debugger/src/selectors/index.js
new file mode 100644
index 0000000000..1c045ae6ad
--- /dev/null
+++ b/devtools/client/debugger/src/selectors/index.js
@@ -0,0 +1,48 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+export * from "./ast";
+export * from "./breakpoints";
+export {
+ getClosestBreakpoint,
+ getBreakpointAtLocation,
+ getBreakpointsAtLine,
+ getClosestBreakpointPosition,
+} from "./breakpointAtLocation";
+export { getBreakpointSources } from "./breakpointSources";
+export * from "./event-listeners";
+export * from "./exceptions";
+export * from "./expressions";
+export { isLineInScope } from "./isLineInScope";
+export { isSelectedFrameVisible } from "./isSelectedFrameVisible";
+export * from "./pause";
+export * from "./pending-breakpoints";
+export * from "./quick-open";
+export * from "./source-actors";
+export * from "./source-blackbox";
+export * from "./sources-content";
+export * from "./sources-tree";
+export * from "./sources";
+export * from "./tabs";
+export * from "./threads";
+export * from "./ui";
+export {
+ getVisibleBreakpoints,
+ getFirstVisibleBreakpoints,
+} from "./visibleBreakpoints";
+export * from "./visibleColumnBreakpoints";
+
+import { objectInspector } from "devtools/client/shared/components/reps/index";
+
+const { reducer } = objectInspector;
+
+Object.keys(reducer).forEach(function (key) {
+ if (key === "default" || key === "__esModule") {
+ return;
+ }
+ Object.defineProperty(exports, key, {
+ enumerable: true,
+ get: reducer[key],
+ });
+});
diff --git a/devtools/client/debugger/src/selectors/isLineInScope.js b/devtools/client/debugger/src/selectors/isLineInScope.js
new file mode 100644
index 0000000000..f8ca089b81
--- /dev/null
+++ b/devtools/client/debugger/src/selectors/isLineInScope.js
@@ -0,0 +1,22 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { getInScopeLines } from "./ast";
+import { getVisibleSelectedFrame } from "./pause";
+
+// Checks if a line is considered in scope
+// We consider all lines in scope, if we do not have lines in scope.
+export function isLineInScope(state, line) {
+ const frame = getVisibleSelectedFrame(state);
+ if (!frame) {
+ return false;
+ }
+
+ const lines = getInScopeLines(state, frame.location);
+ if (!lines) {
+ return true;
+ }
+
+ return lines.includes(line);
+}
diff --git a/devtools/client/debugger/src/selectors/isSelectedFrameVisible.js b/devtools/client/debugger/src/selectors/isSelectedFrameVisible.js
new file mode 100644
index 0000000000..f4d42ccc1d
--- /dev/null
+++ b/devtools/client/debugger/src/selectors/isSelectedFrameVisible.js
@@ -0,0 +1,37 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { originalToGeneratedId } from "devtools/client/shared/source-map-loader/index";
+import { getSelectedLocation } from "./sources";
+import { getCurrentThread, getSelectedFrame } from "./pause";
+
+function getGeneratedId(source) {
+ if (source.isOriginal) {
+ return originalToGeneratedId(source.id);
+ }
+
+ return source.id;
+}
+
+/*
+ * Checks to if the selected frame's source is currently
+ * selected.
+ */
+export function isSelectedFrameVisible(state) {
+ const thread = getCurrentThread(state);
+ const selectedLocation = getSelectedLocation(state);
+ const selectedFrame = getSelectedFrame(state, thread);
+
+ if (!selectedFrame || !selectedLocation) {
+ return false;
+ }
+
+ if (selectedLocation.source.isOriginal) {
+ return selectedLocation.source.id === selectedFrame.location.source.id;
+ }
+
+ return (
+ selectedLocation.source.id === getGeneratedId(selectedFrame.location.source)
+ );
+}
diff --git a/devtools/client/debugger/src/selectors/moz.build b/devtools/client/debugger/src/selectors/moz.build
new file mode 100644
index 0000000000..ac728b1de4
--- /dev/null
+++ b/devtools/client/debugger/src/selectors/moz.build
@@ -0,0 +1,32 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DIRS += []
+
+CompiledModules(
+ "ast.js",
+ "breakpointAtLocation.js",
+ "breakpoints.js",
+ "breakpointSources.js",
+ "event-listeners.js",
+ "exceptions.js",
+ "expressions.js",
+ "index.js",
+ "isLineInScope.js",
+ "isSelectedFrameVisible.js",
+ "pause.js",
+ "pending-breakpoints.js",
+ "quick-open.js",
+ "source-actors.js",
+ "source-blackbox.js",
+ "sources-tree.js",
+ "sources-content.js",
+ "sources.js",
+ "tabs.js",
+ "threads.js",
+ "visibleBreakpoints.js",
+ "visibleColumnBreakpoints.js",
+ "ui.js",
+)
diff --git a/devtools/client/debugger/src/selectors/pause.js b/devtools/client/debugger/src/selectors/pause.js
new file mode 100644
index 0000000000..a1bccda7c4
--- /dev/null
+++ b/devtools/client/debugger/src/selectors/pause.js
@@ -0,0 +1,293 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { getThreadPauseState } from "../reducers/pause";
+import { getSelectedSource, getSelectedLocation } from "./sources";
+import { getBlackBoxRanges } from "./source-blackbox";
+
+// eslint-disable-next-line
+import { getSelectedLocation as _getSelectedLocation } from "../utils/selected-location";
+import { isFrameBlackBoxed } from "../utils/source";
+import { createSelector } from "devtools/client/shared/vendor/reselect";
+
+export const getSelectedFrame = createSelector(
+ (state, thread) => state.pause.threads[thread],
+ threadPauseState => {
+ if (!threadPauseState) return null;
+ const { selectedFrameId, frames } = threadPauseState;
+ if (frames) {
+ return frames.find(frame => frame.id == selectedFrameId);
+ }
+ return null;
+ }
+);
+
+export const getVisibleSelectedFrame = createSelector(
+ getSelectedLocation,
+ state => getSelectedFrame(state, getCurrentThread(state)),
+ (selectedLocation, selectedFrame) => {
+ if (!selectedFrame) {
+ return null;
+ }
+
+ const { id, displayName } = selectedFrame;
+
+ return {
+ id,
+ displayName,
+ location: _getSelectedLocation(selectedFrame, selectedLocation),
+ };
+ }
+);
+
+export function getContext(state) {
+ return state.pause.cx;
+}
+
+export function getThreadContext(state) {
+ return state.pause.threadcx;
+}
+
+export function getNavigateCounter(state) {
+ return state.pause.threadcx.navigateCounter;
+}
+
+export function getPauseReason(state, thread) {
+ return getThreadPauseState(state.pause, thread).why;
+}
+
+export function getShouldBreakpointsPaneOpenOnPause(state, thread) {
+ return getThreadPauseState(state.pause, thread)
+ .shouldBreakpointsPaneOpenOnPause;
+}
+
+export function getPauseCommand(state, thread) {
+ return getThreadPauseState(state.pause, thread).command;
+}
+
+export function isStepping(state, thread) {
+ return ["stepIn", "stepOver", "stepOut"].includes(
+ getPauseCommand(state, thread)
+ );
+}
+
+export function getCurrentThread(state) {
+ return getThreadContext(state).thread;
+}
+
+export function getIsPaused(state, thread) {
+ return getThreadPauseState(state.pause, thread).isPaused;
+}
+
+export function getIsCurrentThreadPaused(state) {
+ return getIsPaused(state, getCurrentThread(state));
+}
+
+export function isEvaluatingExpression(state, thread) {
+ return getThreadPauseState(state.pause, thread).command === "expression";
+}
+
+export function getIsWaitingOnBreak(state, thread) {
+ return getThreadPauseState(state.pause, thread).isWaitingOnBreak;
+}
+
+export function getShouldPauseOnDebuggerStatement(state) {
+ return state.pause.shouldPauseOnDebuggerStatement;
+}
+
+export function getShouldPauseOnExceptions(state) {
+ return state.pause.shouldPauseOnExceptions;
+}
+
+export function getShouldPauseOnCaughtExceptions(state) {
+ return state.pause.shouldPauseOnCaughtExceptions;
+}
+
+export function getFrames(state, thread) {
+ const { frames, framesLoading } = getThreadPauseState(state.pause, thread);
+ return framesLoading ? null : frames;
+}
+
+export const getCurrentThreadFrames = createSelector(
+ state => {
+ const { frames, framesLoading } = getThreadPauseState(
+ state.pause,
+ getCurrentThread(state)
+ );
+ if (framesLoading) {
+ return [];
+ }
+ return frames;
+ },
+ getBlackBoxRanges,
+ (frames, blackboxedRanges) => {
+ return frames.filter(frame => !isFrameBlackBoxed(frame, blackboxedRanges));
+ }
+);
+
+function getGeneratedFrameId(frameId) {
+ if (frameId.includes("-originalFrame")) {
+ // The mapFrames can add original stack frames -- get generated frameId.
+ return frameId.substr(0, frameId.lastIndexOf("-originalFrame"));
+ }
+ return frameId;
+}
+
+export function getGeneratedFrameScope(state, frame) {
+ if (!frame) {
+ return null;
+ }
+ return getFrameScopes(state, frame.thread).generated[
+ getGeneratedFrameId(frame.id)
+ ];
+}
+
+export function getOriginalFrameScope(state, frame) {
+ if (!frame) {
+ return null;
+ }
+ // Only compute original scope if we are currently showing an original source.
+ const source = getSelectedSource(state);
+ if (!source || !source.isOriginal) {
+ return null;
+ }
+
+ const original = getFrameScopes(state, frame.thread).original[
+ getGeneratedFrameId(frame.id)
+ ];
+
+ if (original && (original.pending || original.scope)) {
+ return original;
+ }
+
+ return null;
+}
+
+// This is only used by tests
+export function getFrameScopes(state, thread) {
+ return getThreadPauseState(state.pause, thread).frameScopes;
+}
+
+export function getSelectedFrameBindings(state, thread) {
+ const scopes = getFrameScopes(state, thread);
+ const selectedFrameId = getSelectedFrameId(state, thread);
+ if (!scopes || !selectedFrameId) {
+ return null;
+ }
+
+ const frameScope = scopes.generated[selectedFrameId];
+ if (!frameScope || frameScope.pending) {
+ return null;
+ }
+
+ let currentScope = frameScope.scope;
+ let frameBindings = [];
+ while (currentScope && currentScope.type != "object") {
+ if (currentScope.bindings) {
+ const bindings = Object.keys(currentScope.bindings.variables);
+ const args = [].concat(
+ ...currentScope.bindings.arguments.map(argument =>
+ Object.keys(argument)
+ )
+ );
+
+ frameBindings = [...frameBindings, ...bindings, ...args];
+ }
+ currentScope = currentScope.parent;
+ }
+
+ return frameBindings;
+}
+
+function getFrameScope(state, frame) {
+ return (
+ getOriginalFrameScope(state, frame) || getGeneratedFrameScope(state, frame)
+ );
+}
+
+// This is only used by tests
+export function getSelectedScope(state, thread) {
+ const frame = getSelectedFrame(state, thread);
+
+ const frameScope = getFrameScope(state, frame);
+ if (!frameScope) {
+ return null;
+ }
+
+ return frameScope.scope || null;
+}
+
+export function getSelectedOriginalScope(state, thread) {
+ const frame = getSelectedFrame(state, thread);
+ return getOriginalFrameScope(state, frame);
+}
+
+export function getSelectedScopeMappings(state, thread) {
+ const frameId = getSelectedFrameId(state, thread);
+ if (!frameId) {
+ return null;
+ }
+
+ return getFrameScopes(state, thread).mappings[frameId];
+}
+
+export function getSelectedFrameId(state, thread) {
+ return getThreadPauseState(state.pause, thread).selectedFrameId;
+}
+
+export function isTopFrameSelected(state, thread) {
+ const selectedFrameId = getSelectedFrameId(state, thread);
+ const topFrame = getTopFrame(state, thread);
+ return selectedFrameId == topFrame?.id;
+}
+
+export function getTopFrame(state, thread) {
+ const frames = getFrames(state, thread);
+ return frames?.[0];
+}
+
+// getTopFrame wouldn't return the top frame if the frames are still being fetched
+export function getCurrentlyFetchedTopFrame(state, thread) {
+ const { frames } = getThreadPauseState(state.pause, thread);
+ return frames?.[0];
+}
+
+export function hasFrame(state, frame) {
+ // Don't use getFrames as it returns null when the frames are still loading
+ const { frames } = getThreadPauseState(state.pause, frame.thread);
+ if (!frames) {
+ return false;
+ }
+ // Compare IDs and not frame objects as they get cloned during mapping
+ return frames.some(f => f.id == frame.id);
+}
+
+export function getSkipPausing(state) {
+ return state.pause.skipPausing;
+}
+
+export function isMapScopesEnabled(state) {
+ return state.pause.mapScopes;
+}
+
+export function getInlinePreviews(state, thread, frameId) {
+ return getThreadPauseState(state.pause, thread).inlinePreview[
+ getGeneratedFrameId(frameId)
+ ];
+}
+
+// This is only used by tests
+export function getSelectedInlinePreviews(state) {
+ const thread = getCurrentThread(state);
+ const frameId = getSelectedFrameId(state, thread);
+ if (!frameId) {
+ return null;
+ }
+
+ return getInlinePreviews(state, thread, frameId);
+}
+
+export function getLastExpandedScopes(state, thread) {
+ return getThreadPauseState(state.pause, thread).lastExpandedScopes;
+}
diff --git a/devtools/client/debugger/src/selectors/pending-breakpoints.js b/devtools/client/debugger/src/selectors/pending-breakpoints.js
new file mode 100644
index 0000000000..a05c43477d
--- /dev/null
+++ b/devtools/client/debugger/src/selectors/pending-breakpoints.js
@@ -0,0 +1,20 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+export function getPendingBreakpoints(state) {
+ return state.pendingBreakpoints;
+}
+
+export function getPendingBreakpointList(state) {
+ return Object.values(getPendingBreakpoints(state));
+}
+
+export function getPendingBreakpointsForSource(state, source) {
+ return getPendingBreakpointList(state).filter(pendingBreakpoint => {
+ return (
+ pendingBreakpoint.location.sourceUrl === source.url ||
+ pendingBreakpoint.generatedLocation.sourceUrl == source.url
+ );
+ });
+}
diff --git a/devtools/client/debugger/src/selectors/quick-open.js b/devtools/client/debugger/src/selectors/quick-open.js
new file mode 100644
index 0000000000..8364c7bbf3
--- /dev/null
+++ b/devtools/client/debugger/src/selectors/quick-open.js
@@ -0,0 +1,15 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+export function getQuickOpenEnabled(state) {
+ return state.quickOpen.enabled;
+}
+
+export function getQuickOpenQuery(state) {
+ return state.quickOpen.query;
+}
+
+export function getQuickOpenType(state) {
+ return state.quickOpen.searchType;
+}
diff --git a/devtools/client/debugger/src/selectors/source-actors.js b/devtools/client/debugger/src/selectors/source-actors.js
new file mode 100644
index 0000000000..3c9c08dc1d
--- /dev/null
+++ b/devtools/client/debugger/src/selectors/source-actors.js
@@ -0,0 +1,119 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Tells if a given Source Actor is registered in the redux store
+ *
+ * @param {Object} state
+ * @param {String} sourceActorId
+ * Source Actor ID
+ * @return {Boolean}
+ */
+export function hasSourceActor(state, sourceActorId) {
+ return state.sourceActors.mutableSourceActors.has(sourceActorId);
+}
+
+/**
+ * Get the Source Actor object. See create.js:createSourceActor()
+ *
+ * @param {Object} state
+ * @param {String} sourceActorId
+ * Source Actor ID
+ * @return {Object}
+ * The Source Actor object (if registered)
+ */
+export function getSourceActor(state, sourceActorId) {
+ return state.sourceActors.mutableSourceActors.get(sourceActorId);
+}
+
+/**
+ * Reports if the Source Actor relates to a valid source map / original source.
+ *
+ * @param {Object} state
+ * @param {String} sourceActorId
+ * Source Actor ID
+ * @return {Boolean}
+ * True if it has a valid source map/original object.
+ */
+export function isSourceActorWithSourceMap(state, sourceActorId) {
+ return state.sourceActors.mutableSourceActorsWithSourceMap.has(sourceActorId);
+}
+
+export function getSourceMapErrorForSourceActor(state, sourceActorId) {
+ return state.sourceActors.mutableSourceMapErrors.get(sourceActorId);
+}
+
+export function getSourceMapResolvedURL(state, sourceActorId) {
+ return state.sourceActors.mutableResolvedSourceMapURL.get(sourceActorId);
+}
+
+// Used by threads selectors
+/**
+ * Get all Source Actor objects for a given thread. See create.js:createSourceActor()
+ *
+ * @param {Object} state
+ * @param {Array<String>} threadActorIDs
+ * List of Thread IDs
+ * @return {Array<Object>}
+ */
+export function getSourceActorsForThread(state, threadActorIDs) {
+ if (!Array.isArray(threadActorIDs)) {
+ threadActorIDs = [threadActorIDs];
+ }
+ const actors = [];
+ for (const sourceActor of state.sourceActors.mutableSourceActors.values()) {
+ if (threadActorIDs.includes(sourceActor.thread)) {
+ actors.push(sourceActor);
+ }
+ }
+ return actors;
+}
+
+/**
+ * Get the list of all breakable lines for a given source actor.
+ *
+ * @param {Object} state
+ * @param {String} sourceActorId
+ * Source Actor ID
+ * @return {AsyncValue<Array<Number>>}
+ * List of all the breakable lines.
+ */
+export function getSourceActorBreakableLines(state, sourceActorId) {
+ return state.sourceActors.mutableBreakableLines.get(sourceActorId);
+}
+
+// Used by sources selectors
+/**
+ * Get the list of all breakable lines for a set of source actors.
+ *
+ * This is typically used to fetch the breakable lines of HTML sources
+ * which are made of multiple source actors (one per inline script).
+ *
+ * @param {Object} state
+ * @param {Array<String>} sourceActors
+ * List of Source Actors
+ * @param {Boolean} isHTML
+ * True, if we are fetching the breakable lines for an HTML source.
+ * For them, we have to aggregate the lines of each source actors.
+ * Otherwise, we might still have many source actors, but one per thread.
+ * In this case, we simply return the first source actor to have the lines ready.
+ * @return {Array<Number>}
+ * List of all the breakable lines.
+ */
+export function getBreakableLinesForSourceActors(state, sourceActors, isHTML) {
+ const allBreakableLines = [];
+ for (const sourceActor of sourceActors) {
+ const breakableLines = state.sourceActors.mutableBreakableLines.get(
+ sourceActor.id
+ );
+ if (breakableLines) {
+ if (isHTML) {
+ allBreakableLines.push(...breakableLines);
+ } else {
+ return breakableLines;
+ }
+ }
+ }
+ return allBreakableLines;
+}
diff --git a/devtools/client/debugger/src/selectors/source-blackbox.js b/devtools/client/debugger/src/selectors/source-blackbox.js
new file mode 100644
index 0000000000..afd5695f18
--- /dev/null
+++ b/devtools/client/debugger/src/selectors/source-blackbox.js
@@ -0,0 +1,26 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+export function getBlackBoxRanges(state) {
+ return state.sourceBlackBox.blackboxedRanges;
+}
+
+export function isSourceBlackBoxed(state, source) {
+ // Only sources with a URL can be blackboxed.
+ if (!source.url) {
+ return false;
+ }
+ return state.sourceBlackBox.blackboxedSet.has(source.url);
+}
+
+export function isSourceOnSourceMapIgnoreList(state, source) {
+ if (!source) {
+ return false;
+ }
+ return getIgnoreListSourceUrls(state).includes(source.url);
+}
+
+export function getIgnoreListSourceUrls(state) {
+ return state.sourceBlackBox.sourceMapIgnoreListUrls;
+}
diff --git a/devtools/client/debugger/src/selectors/sources-content.js b/devtools/client/debugger/src/selectors/sources-content.js
new file mode 100644
index 0000000000..b7442fb555
--- /dev/null
+++ b/devtools/client/debugger/src/selectors/sources-content.js
@@ -0,0 +1,48 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { asSettled } from "../utils/async-value";
+
+import {
+ getSelectedLocation,
+ getFirstSourceActorForGeneratedSource,
+} from "../selectors/sources";
+
+export function getSourceTextContent(state, location) {
+ if (location.source.isOriginal) {
+ return state.sourcesContent.mutableOriginalSourceTextContentMapBySourceId.get(
+ location.source.id
+ );
+ }
+
+ let { sourceActor } = location;
+ if (!sourceActor) {
+ sourceActor = getFirstSourceActorForGeneratedSource(
+ state,
+ location.source.id
+ );
+ }
+ return state.sourcesContent.mutableGeneratedSourceTextContentMapBySourceActorId.get(
+ sourceActor.id
+ );
+}
+
+export function getSettledSourceTextContent(state, location) {
+ const content = getSourceTextContent(state, location);
+ return asSettled(content);
+}
+
+export function getSelectedSourceTextContent(state) {
+ const location = getSelectedLocation(state);
+
+ if (!location) {
+ return null;
+ }
+
+ return getSourceTextContent(state, location);
+}
+
+export function getSourcesEpoch(state) {
+ return state.sourcesContent.epoch;
+}
diff --git a/devtools/client/debugger/src/selectors/sources-tree.js b/devtools/client/debugger/src/selectors/sources-tree.js
new file mode 100644
index 0000000000..8fbf161397
--- /dev/null
+++ b/devtools/client/debugger/src/selectors/sources-tree.js
@@ -0,0 +1,151 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { createSelector } from "devtools/client/shared/vendor/reselect";
+
+/**
+ * Main selector to build the SourceTree,
+ * but this is also the source of data for the QuickOpen dialog.
+ *
+ * If no project directory root is set, this will return the thread items.
+ * Otherwise this will return the items where we set the directory root.
+ */
+export const getSourcesTreeSources = createSelector(
+ getProjectDirectoryRoot,
+ state => state.sourcesTree.threadItems,
+ (projectDirectoryRoot, threadItems) => {
+ // Only accept thread which have their thread attribute set.
+ // This may come late, if we receive ADD_SOURCES before INSERT_THREAD.
+ // Also filter out threads which have no sources, in case we had
+ // INSERT_THREAD with no ADD_SOURCES.
+ threadItems = threadItems.filter(
+ item => !!item.thread && !!item.children.length
+ );
+
+ if (projectDirectoryRoot) {
+ const directory = getDirectoryForUniquePath(
+ projectDirectoryRoot,
+ threadItems
+ );
+ if (directory) {
+ return directory.children;
+ }
+ return [];
+ }
+
+ return threadItems;
+ }
+);
+
+// This is used by QuickOpen UI
+/**
+ * Main selector for the QuickOpen dialog.
+ *
+ * The returns the list of all the reducer's source objects
+ * that are possibly displayed in the Source Tree.
+ * This doesn't return Source Tree Items, but the source objects.
+ */
+export const getDisplayedSourcesList = createSelector(
+ getSourcesTreeSources,
+ roots => {
+ const sources = [];
+ function walk(item) {
+ if (item.type == "source") {
+ sources.push(item.source);
+ } else {
+ for (const child of item.children) {
+ walk(child);
+ }
+ }
+ }
+ for (const root of roots) {
+ walk(root);
+ }
+ return sources;
+ }
+);
+
+export function getExpandedState(state) {
+ return state.sourcesTree.expanded;
+}
+
+export function getFocusedSourceItem(state) {
+ return state.sourcesTree.focusedItem;
+}
+
+export function getProjectDirectoryRoot(state) {
+ return state.sourcesTree.projectDirectoryRoot;
+}
+
+export function getProjectDirectoryRootName(state) {
+ return state.sourcesTree.projectDirectoryRootName;
+}
+
+/**
+ * Lookup for project root item, matching the given "unique path".
+ */
+function getDirectoryForUniquePath(projectRoot, threadItems) {
+ const sections = projectRoot.split("|");
+ const thread = sections.shift();
+
+ const threadItem = threadItems.find(item => {
+ return (
+ item.uniquePath == thread ||
+ (thread == "top-level" && item.thread.isTopLevel)
+ );
+ });
+ if (!threadItem) {
+ dump(
+ `No thread item for: ${projectRoot} -- ${thread} -- ${Object.keys(
+ threadItems
+ )}\n`
+ );
+ return null;
+ }
+
+ // If we selected a thread, the project root is for a Thread Item
+ // and it only contains `${thread}`
+ if (!sections.length) {
+ return threadItem;
+ }
+
+ const group = sections.shift();
+ for (const child of threadItem.children) {
+ if (child.groupName != group) {
+ continue;
+ }
+ // In case we picked a group, return it...
+ // project root looked like this `${thread}|${group}`
+ if (!sections.length) {
+ return child;
+ }
+ // ..otherwise, we picked a directory, so look for it by traversing the tree
+ // project root looked like this `${thread}|${group}|${directoryPath}`
+ const path = sections.shift();
+ return findPathInDirectory(child, path);
+ }
+ dump(` Unable to find group: ${group}\n`);
+ return null;
+
+ function findPathInDirectory(directory, path) {
+ for (const child of directory.children) {
+ if (child.type == "directory") {
+ // `path` should be the absolute path from the group/domain
+ if (child.path == path) {
+ return child;
+ }
+ // Ignore folders which doesn't match the beginning of the lookup path
+ if (!path.startsWith(child.path)) {
+ continue;
+ }
+ const match = findPathInDirectory(child, path);
+ if (match) {
+ return match;
+ }
+ }
+ }
+ dump(`Unable to find directory: ${path}\n`);
+ return null;
+ }
+}
diff --git a/devtools/client/debugger/src/selectors/sources.js b/devtools/client/debugger/src/selectors/sources.js
new file mode 100644
index 0000000000..938eae9fe2
--- /dev/null
+++ b/devtools/client/debugger/src/selectors/sources.js
@@ -0,0 +1,410 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { createSelector } from "devtools/client/shared/vendor/reselect";
+
+import { getPrettySourceURL, isPretty, isJavaScript } from "../utils/source";
+
+import { findPosition } from "../utils/breakpoint/breakpointPositions";
+import { isFulfilled } from "../utils/async-value";
+
+import { originalToGeneratedId } from "devtools/client/shared/source-map-loader/index";
+import { prefs } from "../utils/prefs";
+import { UNDEFINED_LOCATION, NO_LOCATION } from "../reducers/sources";
+
+import {
+ hasSourceActor,
+ getSourceActor,
+ getBreakableLinesForSourceActors,
+ isSourceActorWithSourceMap,
+} from "./source-actors";
+import { getSourceTextContent } from "./sources-content";
+
+export function hasSource(state, id) {
+ return state.sources.mutableSources.has(id);
+}
+
+export function getSource(state, id) {
+ return state.sources.mutableSources.get(id);
+}
+
+export function getSourceFromId(state, id) {
+ const source = getSource(state, id);
+ if (!source) {
+ console.warn(`source ${id} does not exist`);
+ }
+ return source;
+}
+
+export function getSourceByActorId(state, actorId) {
+ if (!hasSourceActor(state, actorId)) {
+ return null;
+ }
+
+ return getSource(state, getSourceActor(state, actorId).source);
+}
+
+function getSourcesByURL(state, url) {
+ return state.sources.mutableSourcesPerUrl.get(url) || [];
+}
+
+export function getSourceByURL(state, url) {
+ const foundSources = getSourcesByURL(state, url);
+ return foundSources[0];
+}
+
+// This is used by tabs selectors
+export function getSpecificSourceByURL(state, url, isOriginal) {
+ const foundSources = getSourcesByURL(state, url);
+ return foundSources.find(source => source.isOriginal == isOriginal);
+}
+
+function getOriginalSourceByURL(state, url) {
+ return getSpecificSourceByURL(state, url, true);
+}
+
+export function getGeneratedSourceByURL(state, url) {
+ return getSpecificSourceByURL(state, url, false);
+}
+
+export function getGeneratedSource(state, source) {
+ if (!source) {
+ return null;
+ }
+
+ if (!source.isOriginal) {
+ return source;
+ }
+
+ return getSourceFromId(state, originalToGeneratedId(source.id));
+}
+
+export function getPendingSelectedLocation(state) {
+ return state.sources.pendingSelectedLocation;
+}
+
+export function getPrettySource(state, id) {
+ if (!id) {
+ return null;
+ }
+
+ const source = getSource(state, id);
+ if (!source) {
+ return null;
+ }
+
+ return getOriginalSourceByURL(state, getPrettySourceURL(source.url));
+}
+
+// This is only used by Project Search and tests.
+export function getSourceList(state) {
+ return [...state.sources.mutableSources.values()];
+}
+
+// This is only used by tests and create.js
+export function getSourceCount(state) {
+ return state.sources.mutableSources.size;
+}
+
+export function getSelectedLocation(state) {
+ return state.sources.selectedLocation;
+}
+
+/**
+ * Return the "mapped" location for the currently selected location:
+ * - When selecting a location in an original source, returns
+ * the related location in the bundle source.
+ *
+ * - When selecting a location in a bundle source, returns
+ * the related location in the original source. This may return undefined
+ * while we are still computing this information. (we need to query the asynchronous SourceMap service)
+ *
+ * - Otherwise, when selecting a location in a source unrelated to source map
+ * or a pretty printed source, returns null.
+ */
+export function getSelectedMappedSource(state) {
+ const selectedLocation = getSelectedLocation(state);
+ if (!selectedLocation) {
+ return null;
+ }
+
+ // Don't map pretty printed to its related compressed source
+ if (selectedLocation.source.isPrettyPrinted) {
+ return null;
+ }
+
+ // If we are on a bundle with a functional source-map,
+ // the `selectLocation` action should compute the `selectedOriginalLocation` field.
+ if (
+ !selectedLocation.source.isOriginal &&
+ isSourceActorWithSourceMap(state, selectedLocation.sourceActor.id)
+ ) {
+ const { selectedOriginalLocation } = state.sources;
+ // Return undefined if we are still loading the source map.
+ // `selectedOriginalLocation` will be set to undefined instead of null
+ if (
+ selectedOriginalLocation &&
+ selectedOriginalLocation != UNDEFINED_LOCATION &&
+ selectedOriginalLocation != NO_LOCATION
+ ) {
+ return selectedOriginalLocation.source;
+ }
+ return null;
+ }
+
+ const mappedSource = getGeneratedSource(state, selectedLocation.source);
+ // getGeneratedSource will return the exact same source object on sources
+ // that don't map to any original source. In this case, return null
+ // as that's most likely a regular source, not using source maps.
+ if (mappedSource == selectedLocation.source) {
+ return null;
+ }
+ return mappedSource || null;
+}
+
+export const getSelectedSource = createSelector(
+ getSelectedLocation,
+ selectedLocation => {
+ if (!selectedLocation) {
+ return undefined;
+ }
+
+ return selectedLocation.source;
+ }
+);
+
+// This is used by tests and pause reducers
+export function getSelectedSourceId(state) {
+ const source = getSelectedSource(state);
+ return source?.id;
+}
+
+export function getShouldSelectOriginalLocation(state) {
+ return state.sources.shouldSelectOriginalLocation;
+}
+
+export function getShouldHighlightSelectedLocation(state) {
+ return state.sources.shouldHighlightSelectedLocation;
+}
+
+/**
+ * Gets the first source actor for the source and/or thread
+ * provided.
+ *
+ * @param {Object} state
+ * @param {String} sourceId
+ * The source used
+ * @param {String} [threadId]
+ * The thread to check, this is optional.
+ * @param {Object} sourceActor
+ *
+ */
+export function getFirstSourceActorForGeneratedSource(
+ state,
+ sourceId,
+ threadId
+) {
+ let source = getSource(state, sourceId);
+ // The source may have been removed if we are being called by async code
+ if (!source) {
+ return null;
+ }
+ if (source.isOriginal) {
+ source = getSource(state, originalToGeneratedId(source.id));
+ }
+ const actors = getSourceActorsForSource(state, source.id);
+ if (threadId) {
+ return actors.find(actorInfo => actorInfo.thread == threadId) || null;
+ }
+ return actors[0] || null;
+}
+
+/**
+ * Get the source actor of the source
+ *
+ * @param {Object} state
+ * @param {String} id
+ * The source id
+ * @return {Array<Object>}
+ * List of source actors
+ */
+export function getSourceActorsForSource(state, id) {
+ return state.sources.mutableSourceActors.get(id) || [];
+}
+
+export function isSourceWithMap(state, id) {
+ const actors = getSourceActorsForSource(state, id);
+ return actors.some(actor => isSourceActorWithSourceMap(state, actor.id));
+}
+
+export function canPrettyPrintSource(state, location) {
+ const sourceId = location.source.id;
+ const source = getSource(state, sourceId);
+ if (
+ !source ||
+ isPretty(source) ||
+ source.isOriginal ||
+ (prefs.clientSourceMapsEnabled && isSourceWithMap(state, sourceId))
+ ) {
+ return false;
+ }
+
+ const content = getSourceTextContent(state, location);
+ const sourceContent = content && isFulfilled(content) ? content.value : null;
+
+ if (
+ !sourceContent ||
+ (!isJavaScript(source, sourceContent) && !source.isHTML)
+ ) {
+ return false;
+ }
+
+ return true;
+}
+
+export function getPrettyPrintMessage(state, location) {
+ const source = location.source;
+ if (!source) {
+ return L10N.getStr("sourceTabs.prettyPrint");
+ }
+
+ if (isPretty(source)) {
+ return L10N.getStr("sourceFooter.prettyPrint.isPrettyPrintedMessage");
+ }
+
+ if (source.isOriginal) {
+ return L10N.getStr("sourceFooter.prettyPrint.isOriginalMessage");
+ }
+
+ if (prefs.clientSourceMapsEnabled && isSourceWithMap(state, source.id)) {
+ return L10N.getStr("sourceFooter.prettyPrint.hasSourceMapMessage");
+ }
+
+ const content = getSourceTextContent(state, location);
+
+ const sourceContent = content && isFulfilled(content) ? content.value : null;
+ if (!sourceContent) {
+ return L10N.getStr("sourceFooter.prettyPrint.noContentMessage");
+ }
+
+ if (!isJavaScript(source, sourceContent) && !source.isHTML) {
+ return L10N.getStr("sourceFooter.prettyPrint.isNotJavascriptMessage");
+ }
+
+ return L10N.getStr("sourceTabs.prettyPrint");
+}
+
+export function getBreakpointPositionsForSource(state, sourceId) {
+ return state.sources.mutableBreakpointPositions.get(sourceId);
+}
+
+// This is only used by one test
+export function hasBreakpointPositions(state, sourceId) {
+ return !!getBreakpointPositionsForSource(state, sourceId);
+}
+
+export function getBreakpointPositionsForLine(state, sourceId, line) {
+ const positions = getBreakpointPositionsForSource(state, sourceId);
+ return positions?.[line];
+}
+
+export function getBreakpointPositionsForLocation(state, location) {
+ const sourceId = location.source.id;
+ const positions = getBreakpointPositionsForSource(state, sourceId);
+ return findPosition(positions, location);
+}
+
+export function getBreakableLines(state, sourceId) {
+ if (!sourceId) {
+ return null;
+ }
+ const source = getSource(state, sourceId);
+ if (!source) {
+ return null;
+ }
+
+ if (source.isOriginal) {
+ return state.sources.mutableOriginalBreakableLines.get(sourceId);
+ }
+
+ const sourceActors = getSourceActorsForSource(state, sourceId);
+ if (!sourceActors.length) {
+ return null;
+ }
+
+ // We pull generated file breakable lines directly from the source actors
+ // so that breakable lines can be added as new source actors on HTML loads.
+ return getBreakableLinesForSourceActors(state, sourceActors, source.isHTML);
+}
+
+export const getSelectedBreakableLines = createSelector(
+ state => {
+ const sourceId = getSelectedSourceId(state);
+ return sourceId && getBreakableLines(state, sourceId);
+ },
+ breakableLines => new Set(breakableLines || [])
+);
+
+export function isSourceOverridden(state, source) {
+ if (!source || !source.url) {
+ return false;
+ }
+ return state.sources.mutableOverrideSources.has(source.url);
+}
+
+/**
+ * Compute the list of source actors and source objects to be removed
+ * when removing a given target/thread.
+ *
+ * @param {String} threadActorID
+ * The thread to be removed.
+ * @return {Object}
+ * An object with two arrays:
+ * - actors: list of source actor objects to remove
+ * - sources: list of source objects to remove
+ */
+export function getSourcesToRemoveForThread(state, threadActorID) {
+ const sourcesToRemove = [];
+ const actorsToRemove = [];
+
+ for (const [
+ sourceId,
+ actorsForSource,
+ ] of state.sources.mutableSourceActors.entries()) {
+ let removedActorsCount = 0;
+ // Find all actors for the current source which belongs to the given thread actor
+ for (const actor of actorsForSource) {
+ if (actor.thread == threadActorID) {
+ actorsToRemove.push(actor);
+ removedActorsCount++;
+ }
+ }
+
+ // If we are about to remove all source actors for the current source,
+ // or if for some unexpected reason we have a source with no actors,
+ // notify the caller to also remove this source.
+ if (
+ removedActorsCount == actorsForSource.length ||
+ !actorsForSource.length
+ ) {
+ sourcesToRemove.push(state.sources.mutableSources.get(sourceId));
+
+ // Also remove any original sources related to this generated source
+ const originalSourceIds =
+ state.sources.mutableOriginalSources.get(sourceId);
+ if (originalSourceIds?.length > 0) {
+ for (const originalSourceId of originalSourceIds) {
+ sourcesToRemove.push(
+ state.sources.mutableSources.get(originalSourceId)
+ );
+ }
+ }
+ }
+ }
+
+ return {
+ actors: actorsToRemove,
+ sources: sourcesToRemove,
+ };
+}
diff --git a/devtools/client/debugger/src/selectors/tabs.js b/devtools/client/debugger/src/selectors/tabs.js
new file mode 100644
index 0000000000..822bb7f49a
--- /dev/null
+++ b/devtools/client/debugger/src/selectors/tabs.js
@@ -0,0 +1,89 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { createSelector } from "devtools/client/shared/vendor/reselect";
+import { getPrettySourceURL } from "../utils/source";
+
+import { getSpecificSourceByURL } from "./sources";
+import { isSimilarTab } from "../utils/tabs";
+
+export const getTabs = state => state.tabs.tabs;
+
+// Return the list of tabs which relates to an active source
+export const getSourceTabs = createSelector(getTabs, tabs =>
+ tabs.filter(tab => tab.source)
+);
+
+export const getSourcesForTabs = createSelector(getSourceTabs, sourceTabs => {
+ return sourceTabs.map(tab => tab.source);
+});
+
+export function tabExists(state, sourceId) {
+ return !!getSourceTabs(state).find(tab => tab.source.id == sourceId);
+}
+
+export function hasPrettyTab(state, source) {
+ const prettyUrl = getPrettySourceURL(source.url);
+ return getTabs(state).some(tab => tab.url === prettyUrl);
+}
+
+/**
+ * Gets the next tab to select when a tab closes. Heuristics:
+ * 1. if the selected tab is available, it remains selected
+ * 2. if it is gone, the next available tab to the left should be active
+ * 3. if the first tab is active and closed, select the second tab
+ */
+export function getNewSelectedSource(state, tabList) {
+ const { selectedLocation } = state.sources;
+ const availableTabs = getTabs(state);
+ if (!selectedLocation) {
+ return null;
+ }
+
+ const selectedSource = selectedLocation.source;
+ if (!selectedSource) {
+ return null;
+ }
+
+ const matchingTab = availableTabs.find(tab =>
+ isSimilarTab(tab, selectedSource.url, selectedSource.isOriginal)
+ );
+
+ if (matchingTab) {
+ const specificSelectedSource = getSpecificSourceByURL(
+ state,
+ selectedSource.url,
+ selectedSource.isOriginal
+ );
+
+ if (specificSelectedSource) {
+ return specificSelectedSource;
+ }
+
+ return null;
+ }
+
+ const tabUrls = tabList.map(tab => tab.url);
+ const leftNeighborIndex = Math.max(
+ tabUrls.indexOf(selectedSource.url) - 1,
+ 0
+ );
+ const lastAvailbleTabIndex = availableTabs.length - 1;
+ const newSelectedTabIndex = Math.min(leftNeighborIndex, lastAvailbleTabIndex);
+ const availableTab = availableTabs[newSelectedTabIndex];
+
+ if (availableTab) {
+ const tabSource = getSpecificSourceByURL(
+ state,
+ availableTab.url,
+ availableTab.isOriginal
+ );
+
+ if (tabSource) {
+ return tabSource;
+ }
+ }
+
+ return null;
+}
diff --git a/devtools/client/debugger/src/selectors/test/__snapshots__/visibleColumnBreakpoints.spec.js.snap b/devtools/client/debugger/src/selectors/test/__snapshots__/visibleColumnBreakpoints.spec.js.snap
new file mode 100644
index 0000000000..e4b18538cf
--- /dev/null
+++ b/devtools/client/debugger/src/selectors/test/__snapshots__/visibleColumnBreakpoints.spec.js.snap
@@ -0,0 +1,269 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`visible column breakpoints doesnt show breakpoints to the right 1`] = `
+Array [
+ Object {
+ "breakpoint": Object {
+ "disabled": false,
+ "generatedLocation": Object {
+ "column": 1,
+ "line": 1,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "foo",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ },
+ "id": "breakpoint",
+ "location": Object {
+ "column": 1,
+ "line": 1,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "foo",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ },
+ "options": Object {},
+ "originalText": "text",
+ "text": "text",
+ },
+ "location": Object {
+ "column": 1,
+ "line": 1,
+ "sourceId": "foo",
+ },
+ },
+]
+`;
+
+exports[`visible column breakpoints ignores single breakpoints 1`] = `
+Array [
+ Object {
+ "breakpoint": Object {
+ "disabled": false,
+ "generatedLocation": Object {
+ "column": 1,
+ "line": 1,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "foo",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ },
+ "id": "breakpoint",
+ "location": Object {
+ "column": 1,
+ "line": 1,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "foo",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ },
+ "options": Object {},
+ "originalText": "text",
+ "text": "text",
+ },
+ "location": Object {
+ "column": 1,
+ "line": 1,
+ "sourceId": "foo",
+ },
+ },
+ Object {
+ "breakpoint": undefined,
+ "location": Object {
+ "column": 3,
+ "line": 1,
+ "sourceId": "foo",
+ },
+ },
+]
+`;
+
+exports[`visible column breakpoints only shows visible breakpoints 1`] = `
+Array [
+ Object {
+ "breakpoint": Object {
+ "disabled": false,
+ "generatedLocation": Object {
+ "column": 1,
+ "line": 1,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "foo",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ },
+ "id": "breakpoint",
+ "location": Object {
+ "column": 1,
+ "line": 1,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "foo",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ },
+ "options": Object {},
+ "originalText": "text",
+ "text": "text",
+ },
+ "location": Object {
+ "column": 1,
+ "line": 1,
+ "sourceId": "foo",
+ },
+ },
+ Object {
+ "breakpoint": undefined,
+ "location": Object {
+ "column": 3,
+ "line": 1,
+ "sourceId": "foo",
+ },
+ },
+]
+`;
+
+exports[`visible column breakpoints simple 1`] = `
+Array [
+ Object {
+ "breakpoint": Object {
+ "disabled": false,
+ "generatedLocation": Object {
+ "column": 1,
+ "line": 1,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "foo",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ },
+ "id": "breakpoint",
+ "location": Object {
+ "column": 1,
+ "line": 1,
+ "source": Object {
+ "displayURL": Object {
+ "fileExtension": "",
+ "filename": "url",
+ "group": "",
+ "path": "url",
+ "search": "",
+ },
+ "extensionName": null,
+ "id": "foo",
+ "isExtension": false,
+ "isOriginal": false,
+ "isPrettyPrinted": false,
+ "isWasm": false,
+ "thread": "FakeThread",
+ "url": "url",
+ },
+ },
+ "options": Object {},
+ "originalText": "text",
+ "text": "text",
+ },
+ "location": Object {
+ "column": 1,
+ "line": 1,
+ "sourceId": "foo",
+ },
+ },
+ Object {
+ "breakpoint": undefined,
+ "location": Object {
+ "column": 5,
+ "line": 1,
+ "sourceId": "foo",
+ },
+ },
+]
+`;
diff --git a/devtools/client/debugger/src/selectors/test/visibleColumnBreakpoints.spec.js b/devtools/client/debugger/src/selectors/test/visibleColumnBreakpoints.spec.js
new file mode 100644
index 0000000000..873bf35ae2
--- /dev/null
+++ b/devtools/client/debugger/src/selectors/test/visibleColumnBreakpoints.spec.js
@@ -0,0 +1,145 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { actions, createStore, makeSource } from "../../utils/test-head";
+import { createLocation } from "../../utils/location";
+
+import {
+ getColumnBreakpoints,
+ getFirstBreakpointPosition,
+} from "../visibleColumnBreakpoints";
+import {
+ makeMockSource,
+ makeMockSourceWithContent,
+ makeMockBreakpoint,
+} from "../../utils/test-mockup";
+
+function pp(line, column) {
+ return {
+ location: { sourceId: "foo", line, column },
+ generatedLocation: { sourceId: "foo", line, column },
+ };
+}
+
+function defaultSource() {
+ return makeMockSource(undefined, "foo");
+}
+
+function bp(line, column) {
+ return makeMockBreakpoint(defaultSource(), line, column);
+}
+
+const source = makeMockSourceWithContent(
+ undefined,
+ "foo.js",
+ undefined,
+ `function foo() {
+ console.log("hello");
+}
+console.log('bye');
+`
+);
+
+describe("visible column breakpoints", () => {
+ it("simple", () => {
+ const viewport = {
+ start: { line: 1, column: 0 },
+ end: { line: 10, column: 10 },
+ };
+ const pausePoints = { 1: [pp(1, 1), pp(1, 5)], 3: [pp(3, 1)] };
+ const breakpoints = [bp(1, 1), bp(4, 0), bp(4, 3)];
+
+ const columnBps = getColumnBreakpoints(
+ pausePoints,
+ breakpoints,
+ viewport,
+ source,
+ source.content
+ );
+ expect(columnBps).toMatchSnapshot();
+ });
+
+ it("ignores single breakpoints", () => {
+ const viewport = {
+ start: { line: 1, column: 0 },
+ end: { line: 10, column: 10 },
+ };
+ const pausePoints = { 1: [pp(1, 1), pp(1, 3)], 2: [pp(2, 1)] };
+ const breakpoints = [bp(1, 1)];
+ const columnBps = getColumnBreakpoints(
+ pausePoints,
+ breakpoints,
+ viewport,
+ source,
+ source.content
+ );
+ expect(columnBps).toMatchSnapshot();
+ });
+
+ it("only shows visible breakpoints", () => {
+ const viewport = {
+ start: { line: 1, column: 0 },
+ end: { line: 10, column: 10 },
+ };
+ const pausePoints = { 1: [pp(1, 1), pp(1, 3)], 20: [pp(20, 1)] };
+ const breakpoints = [bp(1, 1)];
+
+ const columnBps = getColumnBreakpoints(
+ pausePoints,
+ breakpoints,
+ viewport,
+ source,
+ source.content
+ );
+ expect(columnBps).toMatchSnapshot();
+ });
+
+ it("doesnt show breakpoints to the right", () => {
+ const viewport = {
+ start: { line: 1, column: 0 },
+ end: { line: 10, column: 10 },
+ };
+ const pausePoints = { 1: [pp(1, 1), pp(1, 15)], 20: [pp(20, 1)] };
+ const breakpoints = [bp(1, 1), bp(1, 15)];
+
+ const columnBps = getColumnBreakpoints(
+ pausePoints,
+ breakpoints,
+ viewport,
+ source,
+ source.content
+ );
+ expect(columnBps).toMatchSnapshot();
+ });
+});
+
+describe("getFirstBreakpointPosition", () => {
+ it("sorts the positions by column", async () => {
+ const store = createStore();
+ const { dispatch, getState } = store;
+
+ const fooSource = await dispatch(
+ actions.newGeneratedSource(makeSource("foo1"))
+ );
+
+ dispatch({
+ type: "ADD_BREAKPOINT_POSITIONS",
+ positions: [pp(1, 5), pp(1, 3)],
+ source: fooSource,
+ });
+
+ const position = getFirstBreakpointPosition(
+ getState(),
+ createLocation({
+ line: 1,
+ source: fooSource,
+ })
+ );
+
+ if (!position) {
+ throw new Error("There should be a position");
+ }
+ expect(position.location.column).toEqual(3);
+ });
+});
diff --git a/devtools/client/debugger/src/selectors/threads.js b/devtools/client/debugger/src/selectors/threads.js
new file mode 100644
index 0000000000..931af555a3
--- /dev/null
+++ b/devtools/client/debugger/src/selectors/threads.js
@@ -0,0 +1,56 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { createSelector } from "devtools/client/shared/vendor/reselect";
+import { parse } from "../utils/url";
+
+export const getThreads = createSelector(
+ state => state.threads.threads,
+ threads => threads.filter(thread => !isMainThread(thread))
+);
+
+export const getAllThreads = createSelector(
+ getMainThread,
+ getThreads,
+ (mainThread, threads) => {
+ const orderedThreads = Array.from(threads).sort((threadA, threadB) => {
+ if (threadA.name === threadB.name) {
+ return 0;
+ }
+ return threadA.name < threadB.name ? -1 : 1;
+ });
+ return [mainThread, ...orderedThreads].filter(Boolean);
+ }
+);
+
+function isMainThread(thread) {
+ return thread.isTopLevel;
+}
+
+export function getMainThread(state) {
+ return state.threads.threads.find(isMainThread);
+}
+
+/*
+ * Gets domain from the main thread url (without www prefix)
+ */
+export function getMainThreadHost(state) {
+ const url = getMainThread(state)?.url;
+ if (!url) {
+ return null;
+ }
+ const { host } = parse(url);
+ if (!host) {
+ return null;
+ }
+ return host.startsWith("www.") ? host.substring("www.".length) : host;
+}
+
+export function getThread(state, threadActor) {
+ return getAllThreads(state).find(thread => thread.actor === threadActor);
+}
+
+export function getIsThreadCurrentlyTracing(state, thread) {
+ return state.threads.mutableTracingThreads.has(thread);
+}
diff --git a/devtools/client/debugger/src/selectors/ui.js b/devtools/client/debugger/src/selectors/ui.js
new file mode 100644
index 0000000000..4780b5e051
--- /dev/null
+++ b/devtools/client/debugger/src/selectors/ui.js
@@ -0,0 +1,117 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { getSelectedSource } from "./sources";
+import { getIsThreadCurrentlyTracing, getAllThreads } from "./threads";
+
+export function getSelectedPrimaryPaneTab(state) {
+ return state.ui.selectedPrimaryPaneTab;
+}
+
+export function getActiveSearch(state) {
+ return state.ui.activeSearch;
+}
+
+export function getFrameworkGroupingState(state) {
+ return state.ui.frameworkGroupingOn;
+}
+
+export function getPaneCollapse(state, position) {
+ if (position == "start") {
+ return state.ui.startPanelCollapsed;
+ }
+
+ return state.ui.endPanelCollapsed;
+}
+
+export function getHighlightedLineRangeForSelectedSource(state) {
+ const selectedSource = getSelectedSource(state);
+ if (!selectedSource) {
+ return null;
+ }
+ // Only return the highlighted line range if it matches the selected source
+ const highlightedLineRange = state.ui.highlightedLineRange;
+ if (
+ highlightedLineRange &&
+ selectedSource.id == highlightedLineRange.sourceId
+ ) {
+ return highlightedLineRange;
+ }
+ return null;
+}
+
+export function getConditionalPanelLocation(state) {
+ return state.ui.conditionalPanelLocation;
+}
+
+export function getLogPointStatus(state) {
+ return state.ui.isLogPoint;
+}
+
+export function getOrientation(state) {
+ return state.ui.orientation;
+}
+
+export function getViewport(state) {
+ return state.ui.viewport;
+}
+
+export function getCursorPosition(state) {
+ return state.ui.cursorPosition;
+}
+
+export function getInlinePreview(state) {
+ return state.ui.inlinePreviewEnabled;
+}
+
+export function getEditorWrapping(state) {
+ return state.ui.editorWrappingEnabled;
+}
+
+export function getIsJavascriptTracingEnabled(state) {
+ // Check for the global state which may be set by debugger toggling,
+ // but also on individual thread state which will be set by the `:trace` console command.
+ return (
+ state.ui.javascriptTracingEnabled ||
+ getAllThreads(state).some(thread =>
+ getIsThreadCurrentlyTracing(state, thread.actor)
+ )
+ );
+}
+
+export function getJavascriptTracingLogMethod(state) {
+ return state.ui.javascriptTracingLogMethod;
+}
+
+export function getJavascriptTracingValues(state) {
+ return state.ui.javascriptTracingValues;
+}
+
+export function getJavascriptTracingOnNextInteraction(state) {
+ return state.ui.javascriptTracingOnNextInteraction;
+}
+
+export function getJavascriptTracingOnNextLoad(state) {
+ return state.ui.javascriptTracingOnNextLoad;
+}
+
+export function getJavascriptTracingFunctionReturn(state) {
+ return state.ui.javascriptTracingFunctionReturn;
+}
+
+export function getSearchOptions(state, searchKey) {
+ return state.ui.mutableSearchOptions[searchKey];
+}
+
+export function getProjectSearchQuery(state) {
+ return state.ui.projectSearchQuery;
+}
+
+export function getHideIgnoredSources(state) {
+ return state.ui.hideIgnoredSources;
+}
+
+export function isSourceMapIgnoreListEnabled(state) {
+ return state.ui.sourceMapIgnoreListEnabled;
+}
diff --git a/devtools/client/debugger/src/selectors/visibleBreakpoints.js b/devtools/client/debugger/src/selectors/visibleBreakpoints.js
new file mode 100644
index 0000000000..32eadb1ba7
--- /dev/null
+++ b/devtools/client/debugger/src/selectors/visibleBreakpoints.js
@@ -0,0 +1,55 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { createSelector } from "devtools/client/shared/vendor/reselect";
+
+import { getBreakpointsList } from "./breakpoints";
+import { getSelectedSource } from "./sources";
+
+import { sortSelectedBreakpoints } from "../utils/breakpoint/index";
+import { getSelectedLocation } from "../utils/selected-location";
+
+/*
+ * Finds the breakpoints, which appear in the selected source.
+ */
+export const getVisibleBreakpoints = createSelector(
+ getSelectedSource,
+ getBreakpointsList,
+ (selectedSource, breakpoints) => {
+ if (!selectedSource) {
+ return null;
+ }
+
+ return breakpoints.filter(
+ bp =>
+ selectedSource &&
+ getSelectedLocation(bp, selectedSource)?.source.id === selectedSource.id
+ );
+ }
+);
+
+/*
+ * Finds the first breakpoint per line, which appear in the selected source.
+ */
+export const getFirstVisibleBreakpoints = createSelector(
+ getVisibleBreakpoints,
+ getSelectedSource,
+ (breakpoints, selectedSource) => {
+ if (!breakpoints || !selectedSource) {
+ return [];
+ }
+
+ // Filter the array so it only return the first breakpoint when there's multiple
+ // breakpoints on the same line.
+ const handledLines = new Set();
+ return sortSelectedBreakpoints(breakpoints, selectedSource).filter(bp => {
+ const line = getSelectedLocation(bp, selectedSource).line;
+ if (handledLines.has(line)) {
+ return false;
+ }
+ handledLines.add(line);
+ return true;
+ });
+ }
+);
diff --git a/devtools/client/debugger/src/selectors/visibleColumnBreakpoints.js b/devtools/client/debugger/src/selectors/visibleColumnBreakpoints.js
new file mode 100644
index 0000000000..ce463bea14
--- /dev/null
+++ b/devtools/client/debugger/src/selectors/visibleColumnBreakpoints.js
@@ -0,0 +1,149 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { createSelector } from "devtools/client/shared/vendor/reselect";
+
+import {
+ getViewport,
+ getSelectedSource,
+ getSelectedSourceTextContent,
+ getBreakpointPositionsForSource,
+} from "./index";
+import { getVisibleBreakpoints } from "./visibleBreakpoints";
+import { getSelectedLocation } from "../utils/selected-location";
+import { sortSelectedLocations } from "../utils/location";
+import { getLineText } from "../utils/source";
+
+function contains(location, range) {
+ return (
+ location.line >= range.start.line &&
+ location.line <= range.end.line &&
+ (!location.column ||
+ (location.column >= range.start.column &&
+ location.column <= range.end.column))
+ );
+}
+
+function convertToList(breakpointPositions) {
+ return [].concat(...Object.values(breakpointPositions));
+}
+
+/**
+ * Retrieve the list of column breakpoints to be displayed.
+ * This ignores lines without any breakpoint, but also lines with a single possible breakpoint.
+ * So that we only return breakpoints where there is at least two possible breakpoint on a given line.
+ * Also, this only consider lines currently visible in CodeMirror editor.
+ *
+ * This method returns an array whose elements are objects having two attributes:
+ * - breakpoint: A breakpoint object refering to a precise column location
+ * - location: The location object in an active source where the breakpoint location matched.
+ * This location may be the generated or original source based on the currently selected source type.
+ *
+ * See `visibleColumnBreakpoints()` for the definition of arguments.
+ */
+export function getColumnBreakpoints(
+ positions,
+ breakpoints,
+ viewport,
+ selectedSource,
+ selectedSourceTextContent
+) {
+ if (!positions || !selectedSource || !breakpoints.length || !viewport) {
+ return [];
+ }
+
+ const breakpointsPerLine = new Map();
+ for (const breakpoint of breakpoints) {
+ if (breakpoint.options.hidden) {
+ continue;
+ }
+ const location = getSelectedLocation(breakpoint, selectedSource);
+ const { line } = location;
+ let breakpointsPerColumn = breakpointsPerLine.get(line);
+ if (!breakpointsPerColumn) {
+ breakpointsPerColumn = new Map();
+ breakpointsPerLine.set(line, breakpointsPerColumn);
+ }
+ breakpointsPerColumn.set(location.column, breakpoint);
+ }
+
+ const columnBreakpoints = [];
+ for (const keyLine in positions) {
+ const positionsPerLine = positions[keyLine];
+ // Only consider positions where there is more than one breakable position per line.
+ // When there is only one breakpoint, this isn't a column breakpoint.
+ if (positionsPerLine.length <= 1) {
+ continue;
+ }
+ for (const breakpointPosition of positionsPerLine) {
+ const location = getSelectedLocation(breakpointPosition, selectedSource);
+ const { line } = location;
+
+ // Ignore any further computation if there is no breakpoint on that line.
+ const breakpointsPerColumn = breakpointsPerLine.get(line);
+ if (!breakpointsPerColumn) {
+ continue;
+ }
+
+ // Only consider positions visible in the current CodeMirror viewport
+ if (!contains(location, viewport)) {
+ continue;
+ }
+
+ // Filters out breakpoints to the right of the line. (bug 1552039)
+ // XXX Not really clear why we get such positions??
+ const { column } = location;
+ if (column) {
+ const lineText = getLineText(
+ selectedSource.id,
+ selectedSourceTextContent,
+ line
+ );
+ if (column > lineText.length) {
+ continue;
+ }
+ }
+
+ // Finally, return the expected format output for this selector.
+ // Location of each column breakpoint + a reference to the breakpoint object (if one is set on that column, it can be null).
+ const breakpoint = breakpointsPerColumn.get(column);
+
+ columnBreakpoints.push({
+ location,
+ breakpoint,
+ });
+ }
+ }
+
+ return columnBreakpoints;
+}
+
+function getVisibleBreakpointPositions(state) {
+ const source = getSelectedSource(state);
+ if (!source) {
+ return null;
+ }
+ return getBreakpointPositionsForSource(state, source.id);
+}
+
+export const visibleColumnBreakpoints = createSelector(
+ getVisibleBreakpointPositions,
+ getVisibleBreakpoints,
+ getViewport,
+ getSelectedSource,
+ getSelectedSourceTextContent,
+ getColumnBreakpoints
+);
+
+export function getFirstBreakpointPosition(state, location) {
+ const positions = getBreakpointPositionsForSource(state, location.source.id);
+ if (!positions) {
+ return null;
+ }
+
+ return sortSelectedLocations(convertToList(positions), location.source).find(
+ position =>
+ getSelectedLocation(position, location.source).line == location.line
+ );
+}
diff --git a/devtools/client/debugger/src/test/__mocks__/request-animation-frame.js b/devtools/client/debugger/src/test/__mocks__/request-animation-frame.js
new file mode 100644
index 0000000000..d4441616ef
--- /dev/null
+++ b/devtools/client/debugger/src/test/__mocks__/request-animation-frame.js
@@ -0,0 +1,8 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+global.requestAnimationFrame = function (cb) {
+ cb();
+ return null;
+};
diff --git a/devtools/client/debugger/src/test/fixtures/README.md b/devtools/client/debugger/src/test/fixtures/README.md
new file mode 100644
index 0000000000..ea907643e3
--- /dev/null
+++ b/devtools/client/debugger/src/test/fixtures/README.md
@@ -0,0 +1,3 @@
+## Fixtures
+
+Fixtures used for unit tests
diff --git a/devtools/client/debugger/src/test/fixtures/foobar.json b/devtools/client/debugger/src/test/fixtures/foobar.json
new file mode 100644
index 0000000000..f225bf1f7a
--- /dev/null
+++ b/devtools/client/debugger/src/test/fixtures/foobar.json
@@ -0,0 +1,56 @@
+{
+ "sources": {
+ "sources": {
+ "fooSourceActor": {
+ "id": "fooSourceActor",
+ "url": "http://example.com/foo/foo.js",
+ "filename": "foo.js",
+ "pathname": "foo/foo.js"
+ },
+ "barSourceActor": {
+ "id": "barSourceActor",
+ "url": "http://example.com/bar/bar.js",
+ "filename": "bar.js",
+ "pathname": "bar/bar.js"
+ },
+ "bazzSourceActor": {
+ "id": "bazzSourceActor",
+ "url": "http://example.com/bazz/bazz.js",
+ "filename": "bazz.js",
+ "pathname": "bazz/bazz.js"
+ }
+ },
+ "sourcesText": {
+ "fooSourceActor": {
+ "contentType": "text/javascript",
+ "text": "function() {\n return foo;\n}"
+ },
+ "barSourceActor": {
+ "contentType": "text/javascript",
+ "text": "function() {\n return bar;\n}"
+ },
+ "bazzSourceActor": {
+ "contentType": "text/javascript",
+ "text": "function() {\n return bazz;\n}"
+ }
+ }
+ },
+ "breakpoints": {
+ "breakpoints": {
+ "fooBreakpointActor": {
+ "id": "fooBreakpointActor",
+ "location": {
+ "sourceId": "fooSourceActor",
+ "line": 16
+ }
+ },
+ "barBreakpointActor": {
+ "id": "barBreakpointActor",
+ "location": {
+ "sourceId": "barSourceActor",
+ "line": 18
+ }
+ }
+ }
+ }
+}
diff --git a/devtools/client/debugger/src/test/fixtures/index.js b/devtools/client/debugger/src/test/fixtures/index.js
new file mode 100644
index 0000000000..a0efc568b0
--- /dev/null
+++ b/devtools/client/debugger/src/test/fixtures/index.js
@@ -0,0 +1,3 @@
+import foobarJson from "./foobar.json";
+
+export const foobar = foobarJson;
diff --git a/devtools/client/debugger/src/test/shim.js b/devtools/client/debugger/src/test/shim.js
new file mode 100644
index 0000000000..d1ac2f549f
--- /dev/null
+++ b/devtools/client/debugger/src/test/shim.js
@@ -0,0 +1,31 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+const {
+ setMocksInGlobal,
+} = require("devtools/client/shared/test-helpers/shared-node-helpers");
+setMocksInGlobal();
+
+const { LocalizationHelper } = require("devtools/shared/l10n");
+global.L10N = new LocalizationHelper(
+ "devtools/client/locales/debugger.properties"
+);
+
+const { URL } = require("url");
+global.URL = URL;
+
+// JSDOM doesn't seem to have those functions that are used by codeMirror.
+// See https://github.com/jsdom/jsdom/issues/3002
+document.createRange = () => {
+ const range = new Range();
+
+ range.getBoundingClientRect = jest.fn();
+
+ range.getClientRects = jest.fn(() => ({
+ item: () => null,
+ length: 0,
+ }));
+
+ return range;
+};
diff --git a/devtools/client/debugger/src/test/tests-setup.js b/devtools/client/debugger/src/test/tests-setup.js
new file mode 100644
index 0000000000..c376f51d00
--- /dev/null
+++ b/devtools/client/debugger/src/test/tests-setup.js
@@ -0,0 +1,61 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+global.Worker = require("workerjs");
+
+import path from "path";
+import Enzyme from "enzyme";
+import Adapter from "enzyme-adapter-react-16";
+import { setupHelper } from "../utils/dbg";
+import { prefs } from "../utils/prefs";
+
+import { PrettyPrintDispatcher } from "../workers/pretty-print/index";
+import { ParserDispatcher } from "../workers/parser";
+import { SearchDispatcher } from "../workers/search/index";
+
+import { clearDocuments } from "../utils/editor/index";
+
+const rootPath = path.join(__dirname, "../../");
+
+Enzyme.configure({ adapter: new Adapter() });
+
+jest.setTimeout(20000);
+
+function formatException(reason, p) {
+ console && console.log("Unhandled Rejection at:", p, "reason:", reason);
+}
+
+export const parserWorker = new ParserDispatcher(
+ path.join(rootPath, "src/workers/parser/worker.js")
+);
+export const prettyPrintWorker = new PrettyPrintDispatcher(
+ path.join(rootPath, "src/workers/pretty-print/worker.js")
+);
+export const searchWorker = new SearchDispatcher(
+ path.join(rootPath, "src/workers/search/worker.js")
+);
+
+beforeAll(() => {
+ process.on("unhandledRejection", formatException);
+});
+
+afterAll(() => {
+ parserWorker.stop();
+ prettyPrintWorker.stop();
+ searchWorker.stop();
+
+ process.removeListener("unhandledRejection", formatException);
+});
+
+afterEach(() => {});
+
+beforeEach(async () => {
+ clearDocuments();
+ prefs.projectDirectoryRoot = "";
+ prefs.projectDirectoryRootName = "";
+ prefs.expressions = [];
+
+ // Ensures window.dbg is there to track telemetry
+ setupHelper({ selectors: {} });
+});
diff --git a/devtools/client/debugger/src/utils/DevToolsUtils.js b/devtools/client/debugger/src/utils/DevToolsUtils.js
new file mode 100644
index 0000000000..b2e01f5502
--- /dev/null
+++ b/devtools/client/debugger/src/utils/DevToolsUtils.js
@@ -0,0 +1,16 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import assert from "./assert";
+
+export function reportException(who, exception) {
+ const msg = `${who} threw an exception: `;
+ console.error(msg, exception);
+}
+
+export function executeSoon(fn) {
+ setTimeout(fn, 0);
+}
+
+export default assert;
diff --git a/devtools/client/debugger/src/utils/assert.js b/devtools/client/debugger/src/utils/assert.js
new file mode 100644
index 0000000000..2be4f3c7f1
--- /dev/null
+++ b/devtools/client/debugger/src/utils/assert.js
@@ -0,0 +1,22 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { isNodeTest } from "./environment";
+
+let assert;
+// TODO: try to enable these assertions on mochitest by also enabling it on:
+// import flags from "devtools/shared/flags";
+// if (flags.testing)
+// Unfortunately it throws a lot on mochitests...
+
+if (isNodeTest()) {
+ assert = function (condition, message) {
+ if (!condition) {
+ throw new Error(`Assertion failure: ${message}`);
+ }
+ };
+} else {
+ assert = function () {};
+}
+export default assert;
diff --git a/devtools/client/debugger/src/utils/ast.js b/devtools/client/debugger/src/utils/ast.js
new file mode 100644
index 0000000000..08869df8dd
--- /dev/null
+++ b/devtools/client/debugger/src/utils/ast.js
@@ -0,0 +1,64 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Check whether location A starts after location B
+export function positionAfter(a, b) {
+ return (
+ a.start.line > b.start.line ||
+ (a.start.line === b.start.line && a.start.column > b.start.column)
+ );
+}
+
+export function containsPosition(a, b) {
+ const bColumn = b.column || 0;
+ const startsBefore =
+ a.start.line < b.line ||
+ (a.start.line === b.line && a.start.column <= bColumn);
+ const endsAfter =
+ a.end.line > b.line || (a.end.line === b.line && a.end.column >= bColumn);
+
+ return startsBefore && endsAfter;
+}
+
+function findClosestofSymbol(declarations, location) {
+ if (!declarations) {
+ return null;
+ }
+
+ return declarations.reduce((found, currNode) => {
+ if (
+ currNode.name === "anonymous" ||
+ !containsPosition(currNode.location, {
+ line: location.line,
+ column: location.column || 0,
+ })
+ ) {
+ return found;
+ }
+
+ if (!found) {
+ return currNode;
+ }
+
+ if (found.location.start.line > currNode.location.start.line) {
+ return found;
+ }
+ if (
+ found.location.start.line === currNode.location.start.line &&
+ found.location.start.column > currNode.location.start.column
+ ) {
+ return found;
+ }
+
+ return currNode;
+ }, null);
+}
+
+export function findClosestFunction(symbols, location) {
+ if (!symbols) {
+ return null;
+ }
+
+ return findClosestofSymbol(symbols.functions, location);
+}
diff --git a/devtools/client/debugger/src/utils/async-value.js b/devtools/client/debugger/src/utils/async-value.js
new file mode 100644
index 0000000000..e1467d2401
--- /dev/null
+++ b/devtools/client/debugger/src/utils/async-value.js
@@ -0,0 +1,27 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+export function pending() {
+ return { state: "pending" };
+}
+export function fulfilled(value) {
+ return { state: "fulfilled", value };
+}
+export function rejected(value) {
+ return { state: "rejected", value };
+}
+
+export function asSettled(value) {
+ return value && value.state !== "pending" ? value : null;
+}
+
+export function isPending(value) {
+ return value.state === "pending";
+}
+export function isFulfilled(value) {
+ return value.state === "fulfilled";
+}
+export function isRejected(value) {
+ return value.state === "rejected";
+}
diff --git a/devtools/client/debugger/src/utils/bootstrap.js b/devtools/client/debugger/src/utils/bootstrap.js
new file mode 100644
index 0000000000..e8d6de2cf0
--- /dev/null
+++ b/devtools/client/debugger/src/utils/bootstrap.js
@@ -0,0 +1,142 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import React from "devtools/client/shared/vendor/react";
+import {
+ bindActionCreators,
+ combineReducers,
+} from "devtools/client/shared/vendor/redux";
+import ReactDOM from "devtools/client/shared/vendor/react-dom";
+const {
+ Provider,
+} = require("resource://devtools/client/shared/vendor/react-redux.js");
+
+import ToolboxProvider from "devtools/client/framework/store-provider";
+import flags from "devtools/shared/flags";
+const {
+ registerStoreObserver,
+} = require("resource://devtools/client/shared/redux/subscriber.js");
+
+const { AppConstants } = ChromeUtils.importESModule(
+ "resource://gre/modules/AppConstants.sys.mjs"
+);
+
+import { SearchDispatcher } from "../workers/search/index";
+import { PrettyPrintDispatcher } from "../workers/pretty-print/index";
+
+import configureStore from "../actions/utils/create-store";
+import reducers from "../reducers/index";
+import * as selectors from "../selectors/index";
+import App from "../components/App";
+import { asyncStore, prefs } from "./prefs";
+import { persistTabs } from "../utils/tabs";
+const {
+ sanitizeBreakpoints,
+} = require("resource://devtools/client/shared/thread-utils.js");
+
+let gWorkers;
+
+export function bootstrapStore(client, workers, panel, initialState) {
+ const debugJsModules = AppConstants.DEBUG_JS_MODULES == "1";
+ const createStore = configureStore({
+ log: prefs.logging || flags.testing,
+ timing: debugJsModules,
+ makeThunkArgs: (args, state) => {
+ return { ...args, client, ...workers, panel };
+ },
+ });
+
+ const store = createStore(combineReducers(reducers), initialState);
+ registerStoreObserver(store, updatePrefs);
+
+ const actions = bindActionCreators(
+ require("../actions/index").default,
+ store.dispatch
+ );
+
+ return { store, actions, selectors };
+}
+
+export function bootstrapWorkers(panelWorkers) {
+ // The panel worker will typically be the source map and parser workers.
+ // Both will be managed by the toolbox.
+ gWorkers = {
+ prettyPrintWorker: new PrettyPrintDispatcher(),
+ searchWorker: new SearchDispatcher(),
+ };
+ return { ...panelWorkers, ...gWorkers };
+}
+
+export function teardownWorkers() {
+ gWorkers.prettyPrintWorker.stop();
+ gWorkers.searchWorker.stop();
+}
+
+/**
+ * Create and mount the root App component.
+ *
+ * @param {ReduxStore} store
+ * @param {ReduxStore} toolboxStore
+ * @param {Object} appComponentAttributes
+ * @param {Array} appComponentAttributes.fluentBundles
+ * @param {Document} appComponentAttributes.toolboxDoc
+ */
+export function bootstrapApp(store, toolboxStore, appComponentAttributes = {}) {
+ const mount = getMountElement();
+ if (!mount) {
+ return;
+ }
+
+ ReactDOM.render(
+ React.createElement(
+ Provider,
+ { store },
+ React.createElement(
+ ToolboxProvider,
+ { store: toolboxStore },
+ React.createElement(App, appComponentAttributes)
+ )
+ ),
+ mount
+ );
+}
+
+function getMountElement() {
+ return document.querySelector("#mount");
+}
+
+// This is the opposite of bootstrapApp
+export function unmountRoot() {
+ ReactDOM.unmountComponentAtNode(getMountElement());
+}
+
+function updatePrefs(state, oldState) {
+ const hasChanged = selector =>
+ selector(oldState) && selector(oldState) !== selector(state);
+
+ if (hasChanged(selectors.getPendingBreakpoints)) {
+ asyncStore.pendingBreakpoints = sanitizeBreakpoints(
+ selectors.getPendingBreakpoints(state)
+ );
+ }
+
+ if (
+ oldState.eventListenerBreakpoints &&
+ oldState.eventListenerBreakpoints !== state.eventListenerBreakpoints
+ ) {
+ asyncStore.eventListenerBreakpoints = state.eventListenerBreakpoints;
+ }
+
+ if (hasChanged(selectors.getTabs)) {
+ asyncStore.tabs = persistTabs(selectors.getTabs(state));
+ }
+
+ if (hasChanged(selectors.getXHRBreakpoints)) {
+ asyncStore.xhrBreakpoints = selectors.getXHRBreakpoints(state);
+ }
+
+ if (hasChanged(selectors.getBlackBoxRanges)) {
+ asyncStore.blackboxedRanges = selectors.getBlackBoxRanges(state);
+ }
+}
diff --git a/devtools/client/debugger/src/utils/breakpoint/breakpointPositions.js b/devtools/client/debugger/src/utils/breakpoint/breakpointPositions.js
new file mode 100644
index 0000000000..49b8523284
--- /dev/null
+++ b/devtools/client/debugger/src/utils/breakpoint/breakpointPositions.js
@@ -0,0 +1,20 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { comparePosition } from "../location";
+import { getSelectedLocation } from "../selected-location";
+
+export function findPosition(positions, location) {
+ if (!positions) {
+ return null;
+ }
+
+ const lineBps = positions[location.line];
+ if (!lineBps) {
+ return null;
+ }
+ return lineBps.find(pos =>
+ comparePosition(getSelectedLocation(pos, location), location)
+ );
+}
diff --git a/devtools/client/debugger/src/utils/breakpoint/index.js b/devtools/client/debugger/src/utils/breakpoint/index.js
new file mode 100644
index 0000000000..740d3cd180
--- /dev/null
+++ b/devtools/client/debugger/src/utils/breakpoint/index.js
@@ -0,0 +1,71 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { getSourceActorsForSource } from "../../selectors/index";
+import { sortSelectedLocations } from "../location";
+export * from "./breakpointPositions";
+
+// The ID for a Breakpoint is derived from its location in its Source.
+export function makeBreakpointId(location) {
+ const { source, line, column } = location;
+ const columnString = column || "";
+ return `${source.id}:${line}:${columnString}`;
+}
+
+export function makeBreakpointServerLocationId(breakpointServerLocation) {
+ const { sourceUrl, sourceId, line, column } = breakpointServerLocation;
+ const sourceUrlOrId = sourceUrl || sourceId;
+ const columnString = column || "";
+
+ return `${sourceUrlOrId}:${line}:${columnString}`;
+}
+
+/**
+ * Create a location object to set a breakpoint on the server.
+ *
+ * Debugger location objects includes a source and sourceActor attributes
+ * whereas the server don't need them and instead only need either
+ * the source URL -or- a precise source actor ID.
+ */
+export function makeBreakpointServerLocation(state, location) {
+ const source = location.source;
+ if (!source) {
+ throw new Error("Missing 'source' attribute on location object");
+ }
+ const breakpointLocation = {
+ line: location.line,
+ column: location.column,
+ };
+ if (source.url) {
+ breakpointLocation.sourceUrl = source.url;
+ } else {
+ breakpointLocation.sourceId = getSourceActorsForSource(
+ state,
+ source.id
+ )[0].id;
+ }
+ return breakpointLocation;
+}
+
+export function createXHRBreakpoint(path, method, overrides = {}) {
+ const properties = {
+ path,
+ method,
+ disabled: false,
+ loading: false,
+ text: L10N.getFormatStr("xhrBreakpoints.item.label", path),
+ };
+
+ return { ...properties, ...overrides };
+}
+
+export function getSelectedText(breakpoint, selectedSource) {
+ return !!selectedSource && !selectedSource.isOriginal
+ ? breakpoint.text
+ : breakpoint.originalText;
+}
+
+export function sortSelectedBreakpoints(breakpoints, selectedSource) {
+ return sortSelectedLocations(breakpoints, selectedSource);
+}
diff --git a/devtools/client/debugger/src/utils/breakpoint/moz.build b/devtools/client/debugger/src/utils/breakpoint/moz.build
new file mode 100644
index 0000000000..02c5302a6c
--- /dev/null
+++ b/devtools/client/debugger/src/utils/breakpoint/moz.build
@@ -0,0 +1,11 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DIRS += []
+
+CompiledModules(
+ "breakpointPositions.js",
+ "index.js",
+)
diff --git a/devtools/client/debugger/src/utils/breakpoint/tests/index.spec.js b/devtools/client/debugger/src/utils/breakpoint/tests/index.spec.js
new file mode 100644
index 0000000000..fcfd155cff
--- /dev/null
+++ b/devtools/client/debugger/src/utils/breakpoint/tests/index.spec.js
@@ -0,0 +1,28 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { sortSelectedBreakpoints } from "../index";
+
+import { makeMockBreakpoint, makeMockSource } from "../../test-mockup";
+
+describe("breakpoint sorting", () => {
+ it("sortSelectedBreakpoints should sort by line number and column", () => {
+ const sorted = sortSelectedBreakpoints(
+ [
+ makeMockBreakpoint(undefined, 100, 2),
+ makeMockBreakpoint(undefined, 9, 2),
+ makeMockBreakpoint(undefined, 2),
+ makeMockBreakpoint(undefined, 2, 7),
+ ],
+ makeMockSource()
+ );
+
+ expect(sorted[0].location.line).toBe(2);
+ expect(sorted[0].location.column).toBe(undefined);
+ expect(sorted[1].location.line).toBe(2);
+ expect(sorted[1].location.column).toBe(7);
+ expect(sorted[2].location.line).toBe(9);
+ expect(sorted[3].location.line).toBe(100);
+ });
+});
diff --git a/devtools/client/debugger/src/utils/build-query.js b/devtools/client/debugger/src/utils/build-query.js
new file mode 100644
index 0000000000..f10999aee4
--- /dev/null
+++ b/devtools/client/debugger/src/utils/build-query.js
@@ -0,0 +1,80 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+function escapeRegExp(str) {
+ const reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
+ return str.replace(reRegExpChar, "\\$&");
+}
+
+/**
+ * Ignore doing outline matches for less than 3 whitespaces
+ *
+ * @memberof utils/source-search
+ * @static
+ */
+function ignoreWhiteSpace(str) {
+ return /^\s{0,2}$/.test(str) ? "(?!\\s*.*)" : str;
+}
+
+function wholeMatch(query, wholeWord) {
+ if (query === "" || !wholeWord) {
+ return query;
+ }
+
+ return `\\b${query}\\b`;
+}
+
+function buildFlags(caseSensitive, isGlobal) {
+ if (caseSensitive && isGlobal) {
+ return "g";
+ }
+
+ if (!caseSensitive && isGlobal) {
+ return "gi";
+ }
+
+ if (!caseSensitive && !isGlobal) {
+ return "i";
+ }
+
+ return null;
+}
+
+export default function buildQuery(
+ originalQuery,
+ modifiers,
+ { isGlobal = false, ignoreSpaces = false }
+) {
+ const { caseSensitive, regexMatch, wholeWord } = modifiers;
+
+ if (originalQuery === "") {
+ return new RegExp(originalQuery);
+ }
+
+ // Remove the backslashes at the end of the query as it
+ // breaks the RegExp
+ let query = originalQuery.replace(/\\$/, "");
+
+ // If we don't want to do a regexMatch, we need to escape all regex related characters
+ // so they would actually match.
+ if (!regexMatch) {
+ query = escapeRegExp(query);
+ }
+
+ // ignoreWhiteSpace might return a negative lookbehind, and in such case, we want it
+ // to be consumed as a RegExp part by the callsite, so this needs to be called after
+ // the regexp is escaped.
+ if (ignoreSpaces) {
+ query = ignoreWhiteSpace(query);
+ }
+
+ query = wholeMatch(query, wholeWord);
+ const flags = buildFlags(caseSensitive, isGlobal);
+
+ if (flags) {
+ return new RegExp(query, flags);
+ }
+
+ return new RegExp(query);
+}
diff --git a/devtools/client/debugger/src/utils/clipboard.js b/devtools/client/debugger/src/utils/clipboard.js
new file mode 100644
index 0000000000..66c0d297cc
--- /dev/null
+++ b/devtools/client/debugger/src/utils/clipboard.js
@@ -0,0 +1,19 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Clipboard function taken from
+ * https://searchfox.org/mozilla-central/source/devtools/shared/platform/clipboard.js
+ */
+
+export function copyToTheClipboard(string) {
+ const doCopy = function (e) {
+ e.clipboardData.setData("text/plain", string);
+ e.preventDefault();
+ };
+
+ document.addEventListener("copy", doCopy);
+ document.execCommand("copy", false, null);
+ document.removeEventListener("copy", doCopy);
+}
diff --git a/devtools/client/debugger/src/utils/context.js b/devtools/client/debugger/src/utils/context.js
new file mode 100644
index 0000000000..8c7311008d
--- /dev/null
+++ b/devtools/client/debugger/src/utils/context.js
@@ -0,0 +1,143 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import {
+ getThreadContext,
+ getSelectedFrame,
+ getCurrentThread,
+ hasSource,
+ hasSourceActor,
+ getCurrentlyFetchedTopFrame,
+ hasFrame,
+} from "../selectors/index";
+
+// Context encapsulates the main parameters of the current redux state, which
+// impact most other information tracked by the debugger.
+//
+// The main use of Context is to control when asynchronous operations are
+// allowed to make changes to the program state. Such operations might be
+// invalidated as the state changes from the time the operation was originally
+// initiated. For example, operations on pause state might still continue even
+// after the thread unpauses.
+//
+// The methods below can be used to compare an old context with the current one
+// and see if the operation is now invalid and should be abandoned. Actions can
+// also include a 'cx' Context property, which will be checked by the context
+// middleware. If the action fails validateContextAction() then it will not be
+// dispatched.
+//
+// Context can additionally be used as a shortcut to access the main properties
+// of the pause state.
+
+// A normal Context is invalidated if the target navigates.
+
+// A ThreadContext is invalidated if the target navigates, or if the current
+// thread changes, pauses, or resumes.
+
+export class ContextError extends Error {
+ constructor(msg) {
+ // Use a prefix string to help `PromiseTestUtils.allowMatchingRejectionsGlobally`
+ // ignore all these exceptions as this is based on error strings.
+ super(`DebuggerContextError: ${msg}`);
+ }
+}
+
+export function validateNavigateContext(state, cx) {
+ const newcx = getThreadContext(state);
+
+ if (newcx.navigateCounter != cx.navigateCounter) {
+ throw new ContextError("Page has navigated");
+ }
+}
+
+export function validateThreadContext(state, cx) {
+ const newcx = getThreadContext(state);
+
+ if (cx.thread != newcx.thread) {
+ throw new ContextError("Current thread has changed");
+ }
+
+ if (cx.pauseCounter != newcx.pauseCounter) {
+ throw new ContextError("Current thread has paused or resumed");
+ }
+}
+
+export function validateContext(state, cx) {
+ validateNavigateContext(state, cx);
+
+ if ("thread" in cx) {
+ validateThreadContext(state, cx);
+ }
+}
+
+export function validateSelectedFrame(state, selectedFrame) {
+ const newThread = getCurrentThread(state);
+ if (selectedFrame.thread != newThread) {
+ throw new ContextError("Selected thread has changed");
+ }
+
+ const newSelectedFrame = getSelectedFrame(state, newThread);
+ // Compare frame's IDs as frame objects are cloned during mapping
+ if (selectedFrame.id != newSelectedFrame?.id) {
+ throw new ContextError("Selected frame changed");
+ }
+}
+
+export function validateBreakpoint(state, breakpoint) {
+ // XHR breakpoint don't use any location and are always valid
+ if (!breakpoint.location) {
+ return;
+ }
+
+ if (!hasSource(state, breakpoint.location.source.id)) {
+ throw new ContextError(
+ `Breakpoint's location is obsolete (source '${breakpoint.location.source.id}' no longer exists)`
+ );
+ }
+ if (!hasSource(state, breakpoint.generatedLocation.source.id)) {
+ throw new ContextError(
+ `Breakpoint's generated location is obsolete (source '${breakpoint.generatedLocation.source.id}' no longer exists)`
+ );
+ }
+}
+
+export function validateSource(state, source) {
+ if (!hasSource(state, source.id)) {
+ throw new ContextError(
+ `Obsolete source (source '${source.id}' no longer exists)`
+ );
+ }
+}
+
+export function validateSourceActor(state, sourceActor) {
+ if (!hasSourceActor(state, sourceActor.id)) {
+ throw new ContextError(
+ `Obsolete source actor (source '${sourceActor.id}' no longer exists)`
+ );
+ }
+}
+
+export function validateThreadFrames(state, thread, frames) {
+ const newThread = getCurrentThread(state);
+ if (thread != newThread) {
+ throw new ContextError("Selected thread has changed");
+ }
+ const newTopFrame = getCurrentlyFetchedTopFrame(state, newThread);
+ if (newTopFrame?.id != frames[0].id) {
+ throw new ContextError("Thread moved to another location");
+ }
+}
+
+export function validateFrame(state, frame) {
+ if (!hasFrame(state, frame)) {
+ throw new ContextError(
+ `Obsolete frame (frame '${frame.id}' no longer exists)`
+ );
+ }
+}
+
+export function isValidThreadContext(state, cx) {
+ const newcx = getThreadContext(state);
+ return cx.thread == newcx.thread && cx.pauseCounter == newcx.pauseCounter;
+}
diff --git a/devtools/client/debugger/src/utils/dbg.js b/devtools/client/debugger/src/utils/dbg.js
new file mode 100644
index 0000000000..0d7dff72e1
--- /dev/null
+++ b/devtools/client/debugger/src/utils/dbg.js
@@ -0,0 +1,100 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { prefs, asyncStore, features } from "./prefs";
+import { getDocument } from "./editor/source-documents";
+import { wasmOffsetToLine } from "./wasm";
+
+function getThreadFront(dbg) {
+ return dbg.targetCommand.targetFront.threadFront;
+}
+
+function findSource(dbg, url) {
+ const sources = dbg.selectors.getSourceList();
+ return sources.find(s => (s.url || "").includes(url));
+}
+
+function findSources(dbg, url) {
+ const sources = dbg.selectors.getSourceList();
+ return sources.filter(s => (s.url || "").includes(url));
+}
+
+function evaluate(dbg, expression) {
+ return dbg.client.evaluate(expression);
+}
+
+function bindSelectors(obj) {
+ return Object.keys(obj.selectors).reduce((bound, selector) => {
+ bound[selector] = (a, b, c) =>
+ obj.selectors[selector](obj.store.getState(), a, b, c);
+ return bound;
+ }, {});
+}
+
+function getCM() {
+ const cm = document.querySelector(".CodeMirror");
+ return cm?.CodeMirror;
+}
+
+function formatMappedLocation(mappedLocation) {
+ const { location, generatedLocation } = mappedLocation;
+ return {
+ original: `(${location.line}, ${location.column})`,
+ generated: `(${generatedLocation.line}, ${generatedLocation.column})`,
+ };
+}
+
+function formatMappedLocations(locations) {
+ return console.table(locations.map(loc => formatMappedLocation(loc)));
+}
+
+function formatSelectedColumnBreakpoints(dbg) {
+ const positions = dbg.selectors.getBreakpointPositionsForSource(
+ dbg.selectors.getSelectedSource().id
+ );
+
+ return formatMappedLocations(positions);
+}
+
+function getDocumentForUrl(dbg, url) {
+ const source = findSource(dbg, url);
+ return getDocument(source.id);
+}
+
+const diff = (a, b) => Object.keys(a).filter(key => !Object.is(a[key], b[key]));
+
+export function setupHelper(obj) {
+ const selectors = bindSelectors(obj);
+ const dbg = {
+ ...obj,
+ selectors,
+ prefs,
+ asyncStore,
+ features,
+ getCM,
+
+ // Expose this to tests as they don't have access to debugger's browser loader require
+ // and so can't load utils/wasm.js
+ wasmOffsetToLine: (sourceId, offset) => wasmOffsetToLine(sourceId, offset),
+
+ helpers: {
+ findSource: url => findSource(dbg, url),
+ findSources: url => findSources(dbg, url),
+ evaluate: expression => evaluate(dbg, expression),
+ dumpThread: () => getThreadFront(dbg).dumpThread(),
+ getDocument: url => getDocumentForUrl(dbg, url),
+ },
+ formatters: {
+ mappedLocations: locations => formatMappedLocations(locations),
+ mappedLocation: location => formatMappedLocation(location),
+ selectedColumnBreakpoints: () => formatSelectedColumnBreakpoints(dbg),
+ },
+ _telemetry: {
+ events: {},
+ },
+ diff,
+ };
+
+ window.dbg = dbg;
+}
diff --git a/devtools/client/debugger/src/utils/editor/create-editor.js b/devtools/client/debugger/src/utils/editor/create-editor.js
new file mode 100644
index 0000000000..6bb280fc4d
--- /dev/null
+++ b/devtools/client/debugger/src/utils/editor/create-editor.js
@@ -0,0 +1,44 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import SourceEditor from "devtools/client/shared/sourceeditor/editor";
+import { features, prefs } from "../prefs";
+
+export function createEditor() {
+ const gutters = ["breakpoints", "hit-markers", "CodeMirror-linenumbers"];
+
+ if (features.codeFolding) {
+ gutters.push("CodeMirror-foldgutter");
+ }
+
+ return new SourceEditor({
+ mode: "javascript",
+ foldGutter: features.codeFolding,
+ enableCodeFolding: features.codeFolding,
+ readOnly: true,
+ lineNumbers: true,
+ theme: "mozilla",
+ styleActiveLine: false,
+ lineWrapping: prefs.editorWrapping,
+ matchBrackets: true,
+ showAnnotationRuler: true,
+ gutters,
+ value: " ",
+ extraKeys: {
+ // Override code mirror keymap to avoid conflicts with split console.
+ Esc: false,
+ "Cmd-F": false,
+ "Ctrl-F": false,
+ "Cmd-G": false,
+ "Ctrl-G": false,
+ },
+ cursorBlinkRate: prefs.cursorBlinkRate,
+ });
+}
+
+export function createHeadlessEditor() {
+ const editor = createEditor();
+ editor.appendToLocalElement(document.createElement("div"));
+ return editor;
+}
diff --git a/devtools/client/debugger/src/utils/editor/get-expression.js b/devtools/client/debugger/src/utils/editor/get-expression.js
new file mode 100644
index 0000000000..c664f163c3
--- /dev/null
+++ b/devtools/client/debugger/src/utils/editor/get-expression.js
@@ -0,0 +1,54 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+export function tokenAtTextPosition(cm, { line, column }) {
+ if (line < 0 || line >= cm.lineCount()) {
+ return null;
+ }
+
+ const token = cm.getTokenAt({ line: line - 1, ch: column });
+ if (!token) {
+ return null;
+ }
+
+ return { startColumn: token.start, endColumn: token.end, type: token.type };
+}
+
+// The strategy of querying codeMirror tokens was borrowed
+// from Chrome's inital implementation in JavaScriptSourceFrame.js#L414
+export function getExpressionFromCoords(cm, coord) {
+ const token = tokenAtTextPosition(cm, coord);
+ if (!token) {
+ return null;
+ }
+
+ let startHighlight = token.startColumn;
+ const endHighlight = token.endColumn;
+ const lineNumber = coord.line;
+ const line = cm.doc.getLine(coord.line - 1);
+ while (startHighlight > 1 && line.charAt(startHighlight - 1) === ".") {
+ const tokenBefore = tokenAtTextPosition(cm, {
+ line: coord.line,
+ column: startHighlight - 2,
+ });
+
+ if (!tokenBefore || !tokenBefore.type) {
+ return null;
+ }
+
+ startHighlight = tokenBefore.startColumn;
+ }
+
+ const expression = line.substring(startHighlight, endHighlight) || "";
+
+ if (!expression) {
+ return null;
+ }
+
+ const location = {
+ start: { line: lineNumber, column: startHighlight },
+ end: { line: lineNumber, column: endHighlight },
+ };
+ return { expression, location };
+}
diff --git a/devtools/client/debugger/src/utils/editor/index.js b/devtools/client/debugger/src/utils/editor/index.js
new file mode 100644
index 0000000000..1adc73b4f8
--- /dev/null
+++ b/devtools/client/debugger/src/utils/editor/index.js
@@ -0,0 +1,222 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+export * from "./source-documents";
+export * from "./source-search";
+export * from "../ui";
+export * from "./tokens";
+
+import { createEditor } from "./create-editor";
+
+import { isWasm, lineToWasmOffset, wasmOffsetToLine } from "../wasm";
+import { createLocation } from "../location";
+
+let editor;
+
+export function getEditor() {
+ if (editor) {
+ return editor;
+ }
+
+ editor = createEditor();
+ return editor;
+}
+
+export function removeEditor() {
+ editor = null;
+}
+
+function getCodeMirror() {
+ return editor && editor.hasCodeMirror ? editor.codeMirror : null;
+}
+
+export function startOperation() {
+ const codeMirror = getCodeMirror();
+ if (!codeMirror) {
+ return;
+ }
+
+ codeMirror.startOperation();
+}
+
+export function endOperation() {
+ const codeMirror = getCodeMirror();
+ if (!codeMirror) {
+ return;
+ }
+
+ codeMirror.endOperation();
+}
+
+export function toEditorLine(sourceId, lineOrOffset) {
+ if (isWasm(sourceId)) {
+ // TODO ensure offset is always "mappable" to edit line.
+ return wasmOffsetToLine(sourceId, lineOrOffset) || 0;
+ }
+
+ return lineOrOffset ? lineOrOffset - 1 : 1;
+}
+
+export function fromEditorLine(sourceId, line, sourceIsWasm) {
+ if (sourceIsWasm) {
+ return lineToWasmOffset(sourceId, line) || 0;
+ }
+
+ return line + 1;
+}
+
+export function toEditorPosition(location) {
+ // Note that Spidermonkey, Debugger frontend and CodeMirror are all consistant regarding column
+ // and are 0-based. But only CodeMirror consider the line to be 0-based while the two others
+ // consider lines to be 1-based.
+ return {
+ line: toEditorLine(location.source.id, location.line),
+ column:
+ isWasm(location.source.id) || (!location.column ? 0 : location.column),
+ };
+}
+
+export function toSourceLine(sourceId, line) {
+ return isWasm(sourceId) ? lineToWasmOffset(sourceId, line) : line + 1;
+}
+
+export function scrollToPosition(codeMirror, line, column) {
+ // For all cases where these are on the first line and column,
+ // avoid the possibly slow computation of cursor location on large bundles.
+ if (!line && !column) {
+ codeMirror.scrollTo(0, 0);
+ return;
+ }
+
+ const { top, left } = codeMirror.charCoords({ line, ch: column }, "local");
+
+ if (!isVisible(codeMirror, top, left)) {
+ const scroller = codeMirror.getScrollerElement();
+ const centeredX = Math.max(left - scroller.offsetWidth / 2, 0);
+ const centeredY = Math.max(top - scroller.offsetHeight / 2, 0);
+
+ codeMirror.scrollTo(centeredX, centeredY);
+ }
+}
+
+function isVisible(codeMirror, top, left) {
+ function withinBounds(x, min, max) {
+ return x >= min && x <= max;
+ }
+
+ const scrollArea = codeMirror.getScrollInfo();
+ const charWidth = codeMirror.defaultCharWidth();
+ const fontHeight = codeMirror.defaultTextHeight();
+ const { scrollTop, scrollLeft } = codeMirror.doc;
+
+ const inXView = withinBounds(
+ left,
+ scrollLeft,
+ scrollLeft + (scrollArea.clientWidth - 30) - charWidth
+ );
+
+ const inYView = withinBounds(
+ top,
+ scrollTop,
+ scrollTop + scrollArea.clientHeight - fontHeight
+ );
+
+ return inXView && inYView;
+}
+
+export function getLocationsInViewport(
+ { codeMirror },
+ // Offset represents an allowance of characters or lines offscreen to improve
+ // perceived performance of column breakpoint rendering
+ offsetHorizontalCharacters = 100,
+ offsetVerticalLines = 20
+) {
+ // Get scroll position
+ if (!codeMirror) {
+ return {
+ start: { line: 0, column: 0 },
+ end: { line: 0, column: 0 },
+ };
+ }
+ const charWidth = codeMirror.defaultCharWidth();
+ const scrollArea = codeMirror.getScrollInfo();
+ const { scrollLeft } = codeMirror.doc;
+ const rect = codeMirror.getWrapperElement().getBoundingClientRect();
+ const topVisibleLine =
+ codeMirror.lineAtHeight(rect.top, "window") - offsetVerticalLines;
+ const bottomVisibleLine =
+ codeMirror.lineAtHeight(rect.bottom, "window") + offsetVerticalLines;
+
+ const leftColumn = Math.floor(
+ scrollLeft > 0 ? scrollLeft / charWidth - offsetHorizontalCharacters : 0
+ );
+ const rightPosition = scrollLeft + (scrollArea.clientWidth - 30);
+ const rightCharacter =
+ Math.floor(rightPosition / charWidth) + offsetHorizontalCharacters;
+
+ return {
+ start: {
+ line: topVisibleLine || 0,
+ column: leftColumn || 0,
+ },
+ end: {
+ line: bottomVisibleLine || 0,
+ column: rightCharacter,
+ },
+ };
+}
+
+export function markText({ codeMirror }, className, { start, end }) {
+ return codeMirror.markText(
+ { ch: start.column, line: start.line },
+ { ch: end.column, line: end.line },
+ { className }
+ );
+}
+
+export function lineAtHeight({ codeMirror }, sourceId, event) {
+ const _editorLine = codeMirror.lineAtHeight(event.clientY);
+ return toSourceLine(sourceId, _editorLine);
+}
+
+export function getSourceLocationFromMouseEvent({ codeMirror }, source, e) {
+ const { line, ch } = codeMirror.coordsChar({
+ left: e.clientX,
+ top: e.clientY,
+ });
+
+ return createLocation({
+ source,
+ line: fromEditorLine(source.id, line, isWasm(source.id)),
+ column: isWasm(source.id) ? 0 : ch + 1,
+ });
+}
+
+export function forEachLine(codeMirror, iter) {
+ codeMirror.operation(() => {
+ codeMirror.doc.iter(0, codeMirror.lineCount(), iter);
+ });
+}
+
+export function removeLineClass(codeMirror, line, className) {
+ codeMirror.removeLineClass(line, "wrap", className);
+}
+
+export function clearLineClass(codeMirror, className) {
+ forEachLine(codeMirror, line => {
+ removeLineClass(codeMirror, line, className);
+ });
+}
+
+export function getTextForLine(codeMirror, line) {
+ return codeMirror.getLine(line - 1).trim();
+}
+
+export function getCursorLine(codeMirror) {
+ return codeMirror.getCursor().line;
+}
+
+export function getCursorColumn(codeMirror) {
+ return codeMirror.getCursor().ch;
+}
diff --git a/devtools/client/debugger/src/utils/editor/moz.build b/devtools/client/debugger/src/utils/editor/moz.build
new file mode 100644
index 0000000000..568546897d
--- /dev/null
+++ b/devtools/client/debugger/src/utils/editor/moz.build
@@ -0,0 +1,15 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DIRS += []
+
+CompiledModules(
+ "create-editor.js",
+ "get-expression.js",
+ "index.js",
+ "source-documents.js",
+ "source-search.js",
+ "tokens.js",
+)
diff --git a/devtools/client/debugger/src/utils/editor/source-documents.js b/devtools/client/debugger/src/utils/editor/source-documents.js
new file mode 100644
index 0000000000..2ddb0b1965
--- /dev/null
+++ b/devtools/client/debugger/src/utils/editor/source-documents.js
@@ -0,0 +1,256 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { isWasm, getWasmLineNumberFormatter, renderWasmText } from "../wasm";
+import { isMinified } from "../isMinified";
+import { resizeBreakpointGutter, resizeToggleButton } from "../ui";
+import { javascriptLikeExtensions } from "../source";
+
+const sourceDocs = new Map();
+
+export function getDocument(key) {
+ return sourceDocs.get(key);
+}
+
+export function hasDocument(key) {
+ return sourceDocs.has(key);
+}
+
+export function setDocument(key, doc) {
+ sourceDocs.set(key, doc);
+}
+
+export function removeDocument(key) {
+ sourceDocs.delete(key);
+}
+
+export function clearDocuments() {
+ sourceDocs.clear();
+}
+
+export function clearDocumentsForSources(sources) {
+ for (const source of sources) {
+ sourceDocs.delete(source.id);
+ }
+}
+
+function resetLineNumberFormat(editor) {
+ const cm = editor.codeMirror;
+ cm.setOption("lineNumberFormatter", number => number);
+ resizeBreakpointGutter(cm);
+ resizeToggleButton(cm);
+}
+
+function updateLineNumberFormat(editor, sourceId) {
+ if (!isWasm(sourceId)) {
+ resetLineNumberFormat(editor);
+ return;
+ }
+ const cm = editor.codeMirror;
+ const lineNumberFormatter = getWasmLineNumberFormatter(sourceId);
+ cm.setOption("lineNumberFormatter", lineNumberFormatter);
+ resizeBreakpointGutter(cm);
+ resizeToggleButton(cm);
+}
+
+export function updateDocument(editor, source) {
+ if (!source) {
+ return;
+ }
+
+ const sourceId = source.id;
+ const doc = getDocument(sourceId) || editor.createDocument();
+ editor.replaceDocument(doc);
+
+ updateLineNumberFormat(editor, sourceId);
+}
+
+/* used to apply the context menu wrap line option change to all the docs */
+export function updateDocuments(updater) {
+ for (const doc of sourceDocs.values()) {
+ if (doc.cm == null) {
+ continue;
+ } else {
+ updater(doc);
+ }
+ }
+}
+
+export function clearEditor(editor) {
+ const doc = editor.createDocument("", { name: "text" });
+ editor.replaceDocument(doc);
+ resetLineNumberFormat(editor);
+}
+
+export function showLoading(editor) {
+ // Create the "loading message" document only once
+ let doc = getDocument("loading");
+ if (!doc) {
+ doc = editor.createDocument(L10N.getStr("loadingText"), { name: "text" });
+ setDocument("loading", doc);
+ }
+ // `createDocument` won't be used right away in the editor, we still need to
+ // explicitely update it
+ editor.replaceDocument(doc);
+}
+
+export function showErrorMessage(editor, msg) {
+ let error;
+ if (msg.includes("WebAssembly binary source is not available")) {
+ error = L10N.getStr("wasmIsNotAvailable");
+ } else {
+ error = L10N.getFormatStr("errorLoadingText3", msg);
+ }
+ const doc = editor.createDocument(error, { name: "text" });
+ editor.replaceDocument(doc);
+ resetLineNumberFormat(editor);
+}
+
+const contentTypeModeMap = new Map([
+ ["text/javascript", { name: "javascript" }],
+ ["text/typescript", { name: "javascript", typescript: true }],
+ ["text/coffeescript", { name: "coffeescript" }],
+ [
+ "text/typescript-jsx",
+ {
+ name: "jsx",
+ base: { name: "javascript", typescript: true },
+ },
+ ],
+ ["text/jsx", { name: "jsx" }],
+ ["text/x-elm", { name: "elm" }],
+ ["text/x-clojure", { name: "clojure" }],
+ ["text/x-clojurescript", { name: "clojure" }],
+ ["text/wasm", { name: "text" }],
+ ["text/html", { name: "htmlmixed" }],
+ ["text/plain", { name: "text" }],
+]);
+
+const nonJSLanguageExtensionMap = new Map([
+ ["c", { name: "text/x-csrc" }],
+ ["kt", { name: "text/x-kotlin" }],
+ ["cpp", { name: "text/x-c++src" }],
+ ["m", { name: "text/x-objectivec" }],
+ ["rs", { name: "text/x-rustsrc" }],
+ ["hx", { name: "text/x-haxe" }],
+]);
+
+/**
+ * Returns Code Mirror mode for source content type
+ */
+// eslint-disable-next-line complexity
+export function getMode(source, sourceTextContent, symbols) {
+ const content = sourceTextContent.value;
+ // Disable modes for minified files with 1+ million characters (See Bug 1569829).
+ if (
+ content.type === "text" &&
+ isMinified(source, sourceTextContent) &&
+ content.value.length > 1000000
+ ) {
+ return contentTypeModeMap.get("text/plain");
+ }
+
+ if (content.type !== "text") {
+ return contentTypeModeMap.get("text/plain");
+ }
+
+ const extension = source.displayURL.fileExtension;
+ if (extension === "jsx" || (symbols && symbols.hasJsx)) {
+ if (symbols && symbols.hasTypes) {
+ return contentTypeModeMap.get("text/typescript-jsx");
+ }
+ return contentTypeModeMap.get("text/jsx");
+ }
+
+ if (symbols && symbols.hasTypes) {
+ if (symbols.hasJsx) {
+ return contentTypeModeMap.get("text/typescript-jsx");
+ }
+
+ return contentTypeModeMap.get("text/typescript");
+ }
+
+ // check for C and other non JS languages
+ if (nonJSLanguageExtensionMap.has(extension)) {
+ return nonJSLanguageExtensionMap.get(extension);
+ }
+
+ // if the url ends with a known Javascript-like URL, provide JavaScript mode.
+ if (javascriptLikeExtensions.has(extension)) {
+ return contentTypeModeMap.get("text/javascript");
+ }
+
+ const { contentType, value: text } = content;
+ // Use HTML mode for files in which the first non whitespace
+ // character is `<` regardless of extension.
+ const isHTMLLike = () => text.match(/^\s*</);
+ if (!contentType) {
+ if (isHTMLLike()) {
+ return contentTypeModeMap.get("text/html");
+ }
+ return contentTypeModeMap.get("text/plain");
+ }
+
+ // // @flow or /* @flow */
+ if (text.match(/^\s*(\/\/ @flow|\/\* @flow \*\/)/)) {
+ return contentTypeModeMap.get("text/typescript");
+ }
+
+ if (contentTypeModeMap.has(contentType)) {
+ return contentTypeModeMap.get(contentType);
+ }
+
+ if (isHTMLLike()) {
+ return contentTypeModeMap.get("text/html");
+ }
+
+ return contentTypeModeMap.get("text/plain");
+}
+
+function setMode(editor, source, sourceTextContent, symbols) {
+ const mode = getMode(source, sourceTextContent, symbols);
+ const currentMode = editor.codeMirror.getOption("mode");
+ if (!currentMode || currentMode.name != mode.name) {
+ editor.setMode(mode);
+ }
+}
+
+/**
+ * Handle getting the source document or creating a new
+ * document with the correct mode and text.
+ */
+export function showSourceText(editor, source, sourceTextContent, symbols) {
+ if (hasDocument(source.id)) {
+ const doc = getDocument(source.id);
+ if (editor.codeMirror.doc === doc) {
+ setMode(editor, source, sourceTextContent, symbols);
+ return;
+ }
+
+ editor.replaceDocument(doc);
+ updateLineNumberFormat(editor, source.id);
+ setMode(editor, source, sourceTextContent, symbols);
+ return;
+ }
+
+ const content = sourceTextContent.value;
+
+ const doc = editor.createDocument(
+ // We can set wasm text content directly from the constructor, so we pass an empty string
+ // here, and set the text after replacing the document.
+ content.type !== "wasm" ? content.value : "",
+ getMode(source, sourceTextContent, symbols)
+ );
+
+ setDocument(source.id, doc);
+ editor.replaceDocument(doc);
+
+ if (content.type === "wasm") {
+ const wasmLines = renderWasmText(source.id, content);
+ // cm will try to split into lines anyway, saving memory
+ editor.setText({ split: () => wasmLines, match: () => false });
+ }
+
+ updateLineNumberFormat(editor, source.id);
+}
diff --git a/devtools/client/debugger/src/utils/editor/source-editor.css b/devtools/client/debugger/src/utils/editor/source-editor.css
new file mode 100644
index 0000000000..b2ae305657
--- /dev/null
+++ b/devtools/client/debugger/src/utils/editor/source-editor.css
@@ -0,0 +1,271 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+:root {
+ --breakpoint-active-color: rgba(44, 187, 15, 0.2);
+ --breakpoint-active-color-hover: rgba(44, 187, 15, 0.5);
+ --debug-line-background: rgba(226, 236, 247, 0.5);
+ --debug-line-border: rgb(145, 188, 219);
+}
+
+.theme-dark:root {
+ --debug-line-background: rgb(73, 82, 103);
+ --debug-line-border: rgb(119, 134, 162);
+ --breakpoint-active-color: rgba(45, 210, 158, 0.5);
+ --breakpoint-active-color-hover: rgba(0, 255, 175, 0.7);
+}
+
+.CodeMirror .errors {
+ width: 16px;
+}
+
+.CodeMirror .error {
+ display: inline-block;
+ margin-left: 5px;
+ width: 12px;
+ height: 12px;
+ opacity: 0.75;
+}
+
+.CodeMirror .hit-counts {
+ width: 6px;
+}
+
+.CodeMirror .hit-count {
+ display: inline-block;
+ height: 12px;
+ border: solid rgba(0, 0, 0, 0.2);
+ border-width: 1px 1px 1px 0;
+ border-radius: 0 3px 3px 0;
+ padding: 0 3px;
+ font-size: 10px;
+ pointer-events: none;
+}
+
+.theme-dark .debug-line .CodeMirror-linenumber {
+ color: #c0c0c0;
+}
+
+.debug-line .CodeMirror-line {
+ background-color: var(--debug-line-background) !important;
+ outline: var(--debug-line-border) solid 1px;
+}
+
+/* Don't display the highlight color since the debug line
+ is already highlighted */
+.debug-line .CodeMirror-activeline-background {
+ display: none;
+}
+
+.CodeMirror {
+ cursor: text;
+ height: 100%;
+}
+
+.CodeMirror-gutters {
+ cursor: default;
+}
+
+/* This is to avoid the fake horizontal scrollbar div of codemirror to go 0
+height when floating scrollbars are active. Make sure that this value is equal
+to the maximum of `min-height` specific to the `scrollbar[orient="horizontal"]`
+selector in floating-scrollbar-light.css across all platforms. */
+.CodeMirror-hscrollbar {
+ min-height: 10px;
+}
+
+/* This is to avoid the fake vertical scrollbar div of codemirror to go 0
+width when floating scrollbars are active. Make sure that this value is equal
+to the maximum of `min-width` specific to the `scrollbar[orient="vertical"]`
+selector in floating-scrollbar-light.css across all platforms. */
+.CodeMirror-vscrollbar {
+ min-width: 10px;
+}
+
+.cm-trailingspace {
+ background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAACCAYAAAB/qH1jAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3QUXCToH00Y1UgAAACFJREFUCNdjPMDBUc/AwNDAAAFMTAwMDA0OP34wQgX/AQBYgwYEx4f9lQAAAABJRU5ErkJggg==");
+ opacity: 0.75;
+ background-position: left bottom;
+ background-repeat: repeat-x;
+}
+
+/* CodeMirror dialogs styling */
+
+.CodeMirror-dialog {
+ padding: 4px 3px;
+}
+
+.CodeMirror-dialog,
+.CodeMirror-dialog input {
+ font: message-box;
+}
+
+/* Fold addon */
+
+.CodeMirror-foldmarker {
+ color: blue;
+ text-shadow: #b9f 1px 1px 2px, #b9f -1px -1px 2px, #b9f 1px -1px 2px,
+ #b9f -1px 1px 2px;
+ font-family: sans-serif;
+ line-height: 0.3;
+ cursor: pointer;
+}
+
+.CodeMirror-foldgutter {
+ width: 10px;
+}
+
+.CodeMirror-foldgutter-open,
+.CodeMirror-foldgutter-folded {
+ color: #555;
+ cursor: pointer;
+ line-height: 1;
+ padding: 0 1px;
+}
+
+.CodeMirror-foldgutter-open::after,
+.CodeMirror-foldgutter-open::before,
+.CodeMirror-foldgutter-folded::after,
+.CodeMirror-foldgutter-folded::before {
+ content: "";
+ height: 0;
+ width: 0;
+ position: absolute;
+ border: 4px solid transparent;
+}
+
+.CodeMirror-foldgutter-open::after {
+ border-top-color: var(--theme-codemirror-gutter-background);
+ top: 4px;
+}
+
+.CodeMirror-foldgutter-open::before {
+ border-top-color: var(--theme-body-color);
+ top: 5px;
+}
+
+.new-breakpoint .CodeMirror-foldgutter-open::after {
+ border-top-color: var(--theme-selection-background);
+}
+
+.new-breakpoint .CodeMirror-foldgutter-open::before {
+ border-top-color: white;
+}
+
+.CodeMirror-foldgutter-folded::after {
+ border-left-color: var(--theme-codemirror-gutter-background);
+ left: 3px;
+ top: 3px;
+}
+
+.CodeMirror-foldgutter-folded::before {
+ border-left-color: var(--theme-body-color);
+ left: 4px;
+ top: 3px;
+}
+
+.new-breakpoint .CodeMirror-foldgutter-folded::after {
+ border-left-color: var(--theme-selection-background);
+}
+
+.new-breakpoint .CodeMirror-foldgutter-folded::before {
+ border-left-color: white;
+}
+
+.CodeMirror-hints {
+ position: absolute;
+ z-index: 10;
+ overflow: hidden;
+ list-style: none;
+ margin: 0;
+ padding: 2px;
+ border-radius: 3px;
+ font-size: 90%;
+ max-height: 20em;
+ overflow-y: auto;
+}
+
+.CodeMirror-hint {
+ margin: 0;
+ padding: 0 4px;
+ border-radius: 2px;
+ max-width: 19em;
+ overflow: hidden;
+ white-space: pre;
+ cursor: pointer;
+}
+
+.CodeMirror-Tern-completion {
+ padding-inline-start: 22px;
+ position: relative;
+ line-height: 18px;
+}
+
+.CodeMirror-Tern-completion:before {
+ position: absolute;
+ left: 2px;
+ bottom: 2px;
+ border-radius: 50%;
+ font-size: 12px;
+ font-weight: bold;
+ height: 15px;
+ width: 15px;
+ line-height: 16px;
+ text-align: center;
+ color: #ffffff;
+ box-sizing: border-box;
+}
+
+.CodeMirror-Tern-completion-unknown:before {
+ content: "?";
+}
+
+.CodeMirror-Tern-completion-object:before {
+ content: "O";
+}
+
+.CodeMirror-Tern-completion-fn:before {
+ content: "F";
+}
+
+.CodeMirror-Tern-completion-array:before {
+ content: "A";
+}
+
+.CodeMirror-Tern-completion-number:before {
+ content: "N";
+}
+
+.CodeMirror-Tern-completion-string:before {
+ content: "S";
+}
+
+.CodeMirror-Tern-completion-bool:before {
+ content: "B";
+}
+
+.CodeMirror-Tern-completion-guess {
+ color: #999;
+}
+
+.CodeMirror-Tern-tooltip {
+ border-radius: 3px;
+ padding: 2px 5px;
+ white-space: pre-wrap;
+ max-width: 40em;
+ position: absolute;
+ z-index: 10;
+}
+
+.CodeMirror-Tern-hint-doc {
+ max-width: 25em;
+}
+
+.CodeMirror-Tern-farg-current {
+ text-decoration: underline;
+}
+
+.CodeMirror-Tern-fhint-guess {
+ opacity: 0.7;
+}
diff --git a/devtools/client/debugger/src/utils/editor/source-search.js b/devtools/client/debugger/src/utils/editor/source-search.js
new file mode 100644
index 0000000000..92097377ba
--- /dev/null
+++ b/devtools/client/debugger/src/utils/editor/source-search.js
@@ -0,0 +1,327 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import buildQuery from "../build-query";
+
+/**
+ * @memberof utils/source-search
+ * @static
+ */
+function getSearchCursor(cm, query, pos, modifiers) {
+ const regexQuery = buildQuery(query, modifiers, { isGlobal: true });
+ return cm.getSearchCursor(regexQuery, pos);
+}
+
+/**
+ * @memberof utils/source-search
+ * @static
+ */
+function SearchState() {
+ this.posFrom = this.posTo = this.query = null;
+ this.overlay = null;
+ this.results = [];
+}
+
+/**
+ * @memberof utils/source-search
+ * @static
+ */
+function getSearchState(cm, query) {
+ const state = cm.state.search || (cm.state.search = new SearchState());
+ return state;
+}
+
+function isWhitespace(query) {
+ return !query.match(/\S/);
+}
+
+/**
+ * This returns a mode object used by CodeMirror's addOverlay function
+ * to parse and style tokens in the file.
+ * The mode object contains a tokenizer function (token) which takes
+ * a character stream as input, advances it a character at a time,
+ * and returns style(s) for that token. For more details see
+ * https://codemirror.net/5/doc/manual.html#modeapi
+ *
+ * @memberof utils/source-search
+ * @static
+ */
+function searchOverlay(query, modifiers) {
+ const regexQuery = buildQuery(query, modifiers, {
+ ignoreSpaces: true,
+ // regex must be global for the overlay
+ isGlobal: true,
+ });
+
+ return {
+ token: function (stream, state) {
+ // set the last index to be the current stream position
+ // this acts as an offset
+ regexQuery.lastIndex = stream.pos;
+ const match = regexQuery.exec(stream.string);
+ if (match && match.index === stream.pos) {
+ // if we have a match at the current stream position
+ // set the class for a match
+ stream.pos += match[0].length || 1;
+ return "highlight highlight-full";
+ }
+
+ if (match) {
+ // if we have a match somewhere in the line, go to that point in the
+ // stream
+ stream.pos = match.index;
+ } else {
+ // if we have no matches in this line, skip to the end of the line
+ stream.skipToEnd();
+ }
+
+ return null;
+ },
+ };
+}
+
+/**
+ * @memberof utils/source-search
+ * @static
+ */
+function updateOverlay(cm, state, query, modifiers) {
+ cm.removeOverlay(state.overlay);
+ state.overlay = searchOverlay(query, modifiers);
+ cm.addOverlay(state.overlay, { opaque: false });
+}
+
+function updateCursor(cm, state, keepSelection) {
+ state.posTo = cm.getCursor("anchor");
+ state.posFrom = cm.getCursor("head");
+
+ if (!keepSelection) {
+ state.posTo = { line: 0, ch: 0 };
+ state.posFrom = { line: 0, ch: 0 };
+ }
+}
+
+export function getMatchIndex(count, currentIndex, rev) {
+ if (!rev) {
+ if (currentIndex == count - 1) {
+ return 0;
+ }
+
+ return currentIndex + 1;
+ }
+
+ if (currentIndex == 0) {
+ return count - 1;
+ }
+
+ return currentIndex - 1;
+}
+
+/**
+ * If there's a saved search, selects the next results.
+ * Otherwise, creates a new search and selects the first
+ * result.
+ *
+ * @memberof utils/source-search
+ * @static
+ */
+function doSearch(
+ ctx,
+ rev,
+ query,
+ keepSelection,
+ modifiers,
+ focusFirstResult = true
+) {
+ const { cm, ed } = ctx;
+ if (!cm) {
+ return null;
+ }
+ const defaultIndex = { line: -1, ch: -1 };
+
+ return cm.operation(function () {
+ if (!query || isWhitespace(query)) {
+ clearSearch(cm, query);
+ return null;
+ }
+
+ const state = getSearchState(cm, query);
+ const isNewQuery = state.query !== query;
+ state.query = query;
+
+ updateOverlay(cm, state, query, modifiers);
+ updateCursor(cm, state, keepSelection);
+ const searchLocation = searchNext(ctx, rev, query, isNewQuery, modifiers);
+
+ // We don't want to jump the editor
+ // when we're selecting text
+ if (!cm.state.selectingText && searchLocation && focusFirstResult) {
+ ed.alignLine(searchLocation.from.line, "center");
+ cm.setSelection(searchLocation.from, searchLocation.to);
+ }
+
+ return searchLocation ? searchLocation.from : defaultIndex;
+ });
+}
+
+export function searchSourceForHighlight(
+ ctx,
+ rev,
+ query,
+ keepSelection,
+ modifiers,
+ line,
+ ch
+) {
+ const { cm } = ctx;
+ if (!cm) {
+ return;
+ }
+
+ cm.operation(function () {
+ const state = getSearchState(cm, query);
+ const isNewQuery = state.query !== query;
+ state.query = query;
+
+ updateOverlay(cm, state, query, modifiers);
+ updateCursor(cm, state, keepSelection);
+ findNextOnLine(ctx, rev, query, isNewQuery, modifiers, line, ch);
+ });
+}
+
+function getCursorPos(newQuery, rev, state) {
+ if (newQuery) {
+ return rev ? state.posFrom : state.posTo;
+ }
+
+ return rev ? state.posTo : state.posFrom;
+}
+
+/**
+ * Selects the next result of a saved search.
+ *
+ * @memberof utils/source-search
+ * @static
+ */
+function searchNext(ctx, rev, query, newQuery, modifiers) {
+ const { cm } = ctx;
+ let nextMatch;
+ cm.operation(function () {
+ const state = getSearchState(cm, query);
+ const pos = getCursorPos(newQuery, rev, state);
+
+ if (!state.query) {
+ return;
+ }
+
+ let cursor = getSearchCursor(cm, state.query, pos, modifiers);
+
+ const location = rev
+ ? { line: cm.lastLine(), ch: null }
+ : { line: cm.firstLine(), ch: 0 };
+
+ if (!cursor.find(rev) && state.query) {
+ cursor = getSearchCursor(cm, state.query, location, modifiers);
+ if (!cursor.find(rev)) {
+ return;
+ }
+ }
+
+ nextMatch = { from: cursor.from(), to: cursor.to() };
+ });
+
+ return nextMatch;
+}
+
+function findNextOnLine(ctx, rev, query, newQuery, modifiers, line, ch) {
+ const { cm, ed } = ctx;
+ cm.operation(function () {
+ const pos = { line: line - 1, ch };
+ let cursor = getSearchCursor(cm, query, pos, modifiers);
+
+ if (!cursor.find(rev) && query) {
+ cursor = getSearchCursor(cm, query, pos, modifiers);
+ if (!cursor.find(rev)) {
+ return;
+ }
+ }
+
+ // We don't want to jump the editor
+ // when we're selecting text
+ if (!cm.state.selectingText) {
+ ed.alignLine(cursor.from().line, "center");
+ cm.setSelection(cursor.from(), cursor.to());
+ }
+ });
+}
+
+/**
+ * Remove overlay.
+ *
+ * @memberof utils/source-search
+ * @static
+ */
+export function removeOverlay(ctx, query) {
+ const state = getSearchState(ctx.cm, query);
+ ctx.cm.removeOverlay(state.overlay);
+ const { line, ch } = ctx.cm.getCursor();
+ ctx.cm.doc.setSelection({ line, ch }, { line, ch }, { scroll: false });
+}
+
+/**
+ * Clears the currently saved search.
+ *
+ * @memberof utils/source-search
+ * @static
+ */
+export function clearSearch(cm, query) {
+ const state = getSearchState(cm, query);
+
+ state.results = [];
+
+ if (!state.query) {
+ return;
+ }
+ cm.removeOverlay(state.overlay);
+ state.query = null;
+}
+
+/**
+ * Starts a new search.
+ *
+ * @memberof utils/source-search
+ * @static
+ */
+export function find(ctx, query, keepSelection, modifiers, focusFirstResult) {
+ clearSearch(ctx.cm, query);
+ return doSearch(
+ ctx,
+ false,
+ query,
+ keepSelection,
+ modifiers,
+ focusFirstResult
+ );
+}
+
+/**
+ * Finds the next item based on the currently saved search.
+ *
+ * @memberof utils/source-search
+ * @static
+ */
+export function findNext(ctx, query, keepSelection, modifiers) {
+ return doSearch(ctx, false, query, keepSelection, modifiers);
+}
+
+/**
+ * Finds the previous item based on the currently saved search.
+ *
+ * @memberof utils/source-search
+ * @static
+ */
+export function findPrev(ctx, query, keepSelection, modifiers) {
+ return doSearch(ctx, true, query, keepSelection, modifiers);
+}
+
+export { buildQuery };
diff --git a/devtools/client/debugger/src/utils/editor/tests/__snapshots__/create-editor.spec.js.snap b/devtools/client/debugger/src/utils/editor/tests/__snapshots__/create-editor.spec.js.snap
new file mode 100644
index 0000000000..843647731b
--- /dev/null
+++ b/devtools/client/debugger/src/utils/editor/tests/__snapshots__/create-editor.spec.js.snap
Binary files differ
diff --git a/devtools/client/debugger/src/utils/editor/tests/create-editor.spec.js b/devtools/client/debugger/src/utils/editor/tests/create-editor.spec.js
new file mode 100644
index 0000000000..fe7cd5dcc6
--- /dev/null
+++ b/devtools/client/debugger/src/utils/editor/tests/create-editor.spec.js
@@ -0,0 +1,22 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { createEditor } from "../create-editor";
+
+import { features } from "../../prefs";
+
+describe("createEditor", () => {
+ test("SourceEditor default config", () => {
+ const editor = createEditor();
+ expect(editor.config).toMatchSnapshot();
+ expect(editor.config.gutters).not.toContain("CodeMirror-foldgutter");
+ });
+
+ test("Adds codeFolding", () => {
+ features.codeFolding = true;
+ const editor = createEditor();
+ expect(editor.config).toMatchSnapshot();
+ expect(editor.config.gutters).toContain("CodeMirror-foldgutter");
+ });
+});
diff --git a/devtools/client/debugger/src/utils/editor/tests/editor.spec.js b/devtools/client/debugger/src/utils/editor/tests/editor.spec.js
new file mode 100644
index 0000000000..b3fcad17ff
--- /dev/null
+++ b/devtools/client/debugger/src/utils/editor/tests/editor.spec.js
@@ -0,0 +1,186 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import {
+ toEditorLine,
+ toEditorPosition,
+ toSourceLine,
+ scrollToPosition,
+ markText,
+ lineAtHeight,
+ getSourceLocationFromMouseEvent,
+ forEachLine,
+ removeLineClass,
+ clearLineClass,
+ getTextForLine,
+ getCursorLine,
+} from "../index";
+
+import { makeMockSource } from "../../test-mockup";
+
+describe("toEditorLine", () => {
+ it("returns an editor line", () => {
+ const testId = "test-123";
+ const line = 30;
+ expect(toEditorLine(testId, line)).toEqual(29);
+ });
+});
+
+describe("toEditorPosition", () => {
+ it("returns an editor position", () => {
+ const loc = { source: { id: "source" }, line: 100, column: 25 };
+ expect(toEditorPosition(loc)).toEqual({
+ line: 99,
+ column: 25,
+ });
+ });
+});
+
+describe("toSourceLine", () => {
+ it("returns a source line", () => {
+ const testId = "test-123";
+ const line = 30;
+ expect(toSourceLine(testId, line)).toEqual(31);
+ });
+});
+
+const codeMirror = {
+ doc: {
+ iter: jest.fn((_, __, cb) => cb()),
+ },
+ lineCount: jest.fn(() => 100),
+ getLine: jest.fn(() => "something"),
+ getCursor: jest.fn(() => ({ line: 3 })),
+ getScrollerElement: jest.fn(() => ({
+ offsetWidth: 100,
+ offsetHeight: 100,
+ })),
+ getScrollInfo: () => ({
+ top: 0,
+ right: 0,
+ bottom: 0,
+ left: 0,
+ clientHeight: 100,
+ clientWidth: 100,
+ }),
+ removeLineClass: jest.fn(),
+ operation: jest.fn(cb => cb()),
+ charCoords: jest.fn(() => ({
+ top: 100,
+ right: 50,
+ bottom: 100,
+ left: 50,
+ })),
+ coordsChar: jest.fn(() => ({ line: 6, ch: 30 })),
+ lineAtHeight: jest.fn(() => 300),
+ markText: jest.fn(),
+ scrollTo: jest.fn(),
+ defaultCharWidth: jest.fn(() => 8),
+ defaultTextHeight: jest.fn(() => 16),
+};
+
+const editor = { codeMirror };
+
+describe("scrollToPosition", () => {
+ it("calls codemirror APIs charCoords, getScrollerElement, scrollTo", () => {
+ scrollToPosition(codeMirror, 60, 123);
+ expect(codeMirror.charCoords).toHaveBeenCalledWith(
+ { line: 60, ch: 123 },
+ "local"
+ );
+ expect(codeMirror.scrollTo).toHaveBeenCalledWith(0, 50);
+ });
+});
+
+describe("markText", () => {
+ it("calls codemirror API markText & returns marker", () => {
+ const loc = {
+ start: { line: 10, column: 0 },
+ end: { line: 30, column: 50 },
+ };
+ markText(editor, "test-123", loc);
+ expect(codeMirror.markText).toHaveBeenCalledWith(
+ { ch: loc.start.column, line: loc.start.line },
+ { ch: loc.end.column, line: loc.end.line },
+ { className: "test-123" }
+ );
+ });
+});
+
+describe("lineAtHeight", () => {
+ it("calls codemirror API lineAtHeight", () => {
+ const e = { clientX: 30, clientY: 60 };
+ expect(lineAtHeight(editor, "test-123", e)).toEqual(301);
+ expect(editor.codeMirror.lineAtHeight).toHaveBeenCalledWith(e.clientY);
+ });
+});
+
+describe("getSourceLocationFromMouseEvent", () => {
+ it("calls codemirror API coordsChar & returns location", () => {
+ const source = makeMockSource(undefined, "test-123");
+ const e = { clientX: 30, clientY: 60 };
+ expect(getSourceLocationFromMouseEvent(editor, source, e)).toEqual({
+ source,
+ line: 7,
+ column: 31,
+ sourceActorId: undefined,
+ sourceActor: null,
+ });
+ expect(editor.codeMirror.coordsChar).toHaveBeenCalledWith({
+ left: 30,
+ top: 60,
+ });
+ });
+});
+
+describe("forEachLine", () => {
+ it("calls codemirror API operation && doc.iter across a doc", () => {
+ const test = jest.fn();
+ forEachLine(codeMirror, test);
+ expect(codeMirror.operation).toHaveBeenCalled();
+ expect(codeMirror.doc.iter).toHaveBeenCalledWith(0, 100, test);
+ });
+});
+
+describe("removeLineClass", () => {
+ it("calls codemirror API removeLineClass", () => {
+ const line = 3;
+ const className = "test-class";
+ removeLineClass(codeMirror, line, className);
+ expect(codeMirror.removeLineClass).toHaveBeenCalledWith(
+ line,
+ "wrap",
+ className
+ );
+ });
+});
+
+describe("clearLineClass", () => {
+ it("Uses forEachLine & removeLineClass to clear class on all lines", () => {
+ codeMirror.operation.mockClear();
+ codeMirror.doc.iter.mockClear();
+ codeMirror.removeLineClass.mockClear();
+ clearLineClass(codeMirror, "test-class");
+ expect(codeMirror.operation).toHaveBeenCalled();
+ expect(codeMirror.doc.iter).toHaveBeenCalledWith(
+ 0,
+ 100,
+ expect.any(Function)
+ );
+ expect(codeMirror.removeLineClass).toHaveBeenCalled();
+ });
+});
+
+describe("getTextForLine", () => {
+ it("calls codemirror API getLine & returns line text", () => {
+ getTextForLine(codeMirror, 3);
+ expect(codeMirror.getLine).toHaveBeenCalledWith(2);
+ });
+});
+describe("getCursorLine", () => {
+ it("calls codemirror API getCursor & returns line number", () => {
+ getCursorLine(codeMirror);
+ expect(codeMirror.getCursor).toHaveBeenCalled();
+ });
+});
diff --git a/devtools/client/debugger/src/utils/editor/tests/source-documents.spec.js b/devtools/client/debugger/src/utils/editor/tests/source-documents.spec.js
new file mode 100644
index 0000000000..f85c6b43ff
--- /dev/null
+++ b/devtools/client/debugger/src/utils/editor/tests/source-documents.spec.js
@@ -0,0 +1,213 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { getMode } from "../source-documents.js";
+
+import {
+ makeMockSourceWithContent,
+ makeMockWasmSourceWithContent,
+} from "../../test-mockup";
+
+const defaultSymbolDeclarations = {
+ classes: [],
+ functions: [],
+ memberExpressions: [],
+ objectProperties: [],
+ identifiers: [],
+ comments: [],
+ literals: [],
+ hasJsx: false,
+ hasTypes: false,
+ framework: undefined,
+};
+
+describe("source-documents", () => {
+ describe("getMode", () => {
+ it("//", () => {
+ const source = makeMockSourceWithContent(
+ undefined,
+ undefined,
+ "text/javascript",
+ "// @flow"
+ );
+ expect(getMode(source, source.content)).toEqual({
+ name: "javascript",
+ typescript: true,
+ });
+ });
+
+ it("/* @flow */", () => {
+ const source = makeMockSourceWithContent(
+ undefined,
+ undefined,
+ "text/javascript",
+ " /* @flow */"
+ );
+ expect(getMode(source, source.content)).toEqual({
+ name: "javascript",
+ typescript: true,
+ });
+ });
+
+ it("mixed html", () => {
+ const source = makeMockSourceWithContent(
+ undefined,
+ undefined,
+ "",
+ " <html"
+ );
+ expect(getMode(source, source.content)).toEqual({ name: "htmlmixed" });
+ });
+
+ it("elm", () => {
+ const source = makeMockSourceWithContent(
+ undefined,
+ undefined,
+ "text/x-elm",
+ 'main = text "Hello, World!"'
+ );
+ expect(getMode(source, source.content)).toEqual({ name: "elm" });
+ });
+
+ it("returns jsx if contentType jsx is given", () => {
+ const source = makeMockSourceWithContent(
+ undefined,
+ undefined,
+ "text/jsx",
+ "<h1></h1>"
+ );
+ expect(getMode(source, source.content)).toEqual({ name: "jsx" });
+ });
+
+ it("returns jsx if sourceMetaData says it's a react component", () => {
+ const source = makeMockSourceWithContent(
+ undefined,
+ undefined,
+ "",
+ "<h1></h1>"
+ );
+ expect(
+ getMode(source, source.content, {
+ ...defaultSymbolDeclarations,
+ hasJsx: true,
+ })
+ ).toEqual({ name: "jsx" });
+ });
+
+ it("returns jsx if the fileExtension is .jsx", () => {
+ const source = makeMockSourceWithContent(
+ "myComponent.jsx",
+ undefined,
+ "",
+ "<h1></h1>"
+ );
+ expect(getMode(source, source.content)).toEqual({ name: "jsx" });
+ });
+
+ it("returns text/x-haxe if the file extension is .hx", () => {
+ const source = makeMockSourceWithContent(
+ "myComponent.hx",
+ undefined,
+ "",
+ "function foo(){}"
+ );
+ expect(getMode(source, source.content)).toEqual({ name: "text/x-haxe" });
+ });
+
+ it("typescript", () => {
+ const source = makeMockSourceWithContent(
+ undefined,
+ undefined,
+ "text/typescript",
+ "function foo(){}"
+ );
+ expect(getMode(source, source.content)).toEqual({
+ name: "javascript",
+ typescript: true,
+ });
+ });
+
+ it("typescript-jsx", () => {
+ const source = makeMockSourceWithContent(
+ undefined,
+ undefined,
+ "text/typescript-jsx",
+ "<h1></h1>"
+ );
+ expect(getMode(source, source.content).base).toEqual({
+ name: "javascript",
+ typescript: true,
+ });
+ });
+
+ it("cross-platform clojure(script) with reader conditionals", () => {
+ const source = makeMockSourceWithContent(
+ "my-clojurescript-source-with-reader-conditionals.cljc",
+ undefined,
+ "text/x-clojure",
+ "(defn str->int [s] " +
+ " #?(:clj (java.lang.Integer/parseInt s) " +
+ " :cljs (js/parseInt s)))"
+ );
+ expect(getMode(source, source.content)).toEqual({ name: "clojure" });
+ });
+
+ it("clojurescript", () => {
+ const source = makeMockSourceWithContent(
+ "my-clojurescript-source.cljs",
+ undefined,
+ "text/x-clojurescript",
+ "(+ 1 2 3)"
+ );
+ expect(getMode(source, source.content)).toEqual({ name: "clojure" });
+ });
+
+ it("coffeescript", () => {
+ const source = makeMockSourceWithContent(
+ undefined,
+ undefined,
+ "text/coffeescript",
+ "x = (a) -> 3"
+ );
+ expect(getMode(source, source.content)).toEqual({ name: "coffeescript" });
+ });
+
+ it("wasm", () => {
+ const source = makeMockWasmSourceWithContent({
+ binary: "\x00asm\x01\x00\x00\x00",
+ });
+ expect(getMode(source, source.content.value)).toEqual({ name: "text" });
+ });
+
+ it("marko", () => {
+ const source = makeMockSourceWithContent(
+ "http://localhost.com:7999/increment/sometestfile.marko",
+ undefined,
+ "does not matter",
+ "function foo(){}"
+ );
+ expect(getMode(source, source.content)).toEqual({ name: "javascript" });
+ });
+
+ it("es6", () => {
+ const source = makeMockSourceWithContent(
+ "http://localhost.com:7999/increment/sometestfile.es6",
+ undefined,
+ "does not matter",
+ "function foo(){}"
+ );
+ expect(getMode(source, source.content)).toEqual({ name: "javascript" });
+ });
+
+ it("vue", () => {
+ const source = makeMockSourceWithContent(
+ "http://localhost.com:7999/increment/sometestfile.vue?query=string",
+ undefined,
+ "does not matter",
+ "function foo(){}"
+ );
+ expect(getMode(source, source.content)).toEqual({ name: "javascript" });
+ });
+ });
+});
diff --git a/devtools/client/debugger/src/utils/editor/tests/source-search.spec.js b/devtools/client/debugger/src/utils/editor/tests/source-search.spec.js
new file mode 100644
index 0000000000..33f479766a
--- /dev/null
+++ b/devtools/client/debugger/src/utils/editor/tests/source-search.spec.js
@@ -0,0 +1,182 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import {
+ find,
+ searchSourceForHighlight,
+ getMatchIndex,
+ removeOverlay,
+} from "../source-search";
+
+const getCursor = jest.fn(() => ({ line: 90, ch: 54 }));
+const cursor = {
+ find: jest.fn(),
+ from: jest.fn(),
+ to: jest.fn(),
+};
+const getSearchCursor = jest.fn(() => cursor);
+const modifiers = {
+ caseSensitive: false,
+ regexMatch: false,
+ wholeWord: false,
+};
+
+const getCM = () => ({
+ operation: jest.fn(cb => cb()),
+ addOverlay: jest.fn(),
+ removeOverlay: jest.fn(),
+ getCursor,
+ getSearchCursor,
+ firstLine: jest.fn(),
+ state: {},
+});
+
+describe("source-search", () => {
+ describe("find", () => {
+ it("calls into CodeMirror APIs via clearSearch & doSearch", () => {
+ const ctx = { cm: getCM() };
+ expect(ctx.cm.state).toEqual({});
+ find(ctx, "test", false, modifiers);
+ // First we check the APIs called via clearSearch
+ expect(ctx.cm.removeOverlay).toHaveBeenCalledWith(null);
+ // Next those via doSearch
+ expect(ctx.cm.operation).toHaveBeenCalled();
+ expect(ctx.cm.removeOverlay).toHaveBeenCalledWith(null);
+ expect(ctx.cm.addOverlay).toHaveBeenCalledWith(
+ { token: expect.any(Function) },
+ { opaque: false }
+ );
+ expect(ctx.cm.getCursor).toHaveBeenCalledWith("anchor");
+ expect(ctx.cm.getCursor).toHaveBeenCalledWith("head");
+ const search = {
+ query: "test",
+ posTo: { line: 0, ch: 0 },
+ posFrom: { line: 0, ch: 0 },
+ overlay: { token: expect.any(Function) },
+ results: [],
+ };
+ expect(ctx.cm.state).toEqual({ search });
+ });
+
+ it("clears a previous overlay", () => {
+ const ctx = { cm: getCM() };
+ ctx.cm.state.search = {
+ query: "foo",
+ posTo: null,
+ posFrom: null,
+ overlay: { token: expect.any(Function) },
+ results: [],
+ };
+ find(ctx, "test", true, modifiers);
+ expect(ctx.cm.removeOverlay).toHaveBeenCalledWith({
+ token: expect.any(Function),
+ });
+ });
+
+ it("clears for empty queries", () => {
+ const ctx = { cm: getCM() };
+ ctx.cm.state.search = {
+ query: "foo",
+ posTo: null,
+ posFrom: null,
+ overlay: null,
+ results: [],
+ };
+ find(ctx, "", true, modifiers);
+ expect(ctx.cm.removeOverlay).toHaveBeenCalledWith(null);
+ ctx.cm.removeOverlay.mockClear();
+ ctx.cm.state.search.query = "bar";
+ find(ctx, "", true, modifiers);
+ expect(ctx.cm.removeOverlay).toHaveBeenCalledWith(null);
+ });
+ });
+
+ describe("searchSourceForHighlight", () => {
+ it("calls into CodeMirror APIs and sets the correct selection", () => {
+ const line = 15;
+ const from = { line, ch: 1 };
+ const to = { line, ch: 5 };
+ const cm = {
+ ...getCM(),
+ setSelection: jest.fn(),
+ getSearchCursor: () => ({
+ find: () => true,
+ from: () => from,
+ to: () => to,
+ }),
+ };
+ const ed = { alignLine: jest.fn() };
+ const ctx = { cm, ed };
+
+ expect(ctx.cm.state).toEqual({});
+ searchSourceForHighlight(ctx, false, "test", false, modifiers, line, 1);
+
+ expect(ctx.cm.operation).toHaveBeenCalled();
+ expect(ctx.cm.removeOverlay).toHaveBeenCalledWith(null);
+ expect(ctx.cm.addOverlay).toHaveBeenCalledWith(
+ { token: expect.any(Function) },
+ { opaque: false }
+ );
+ expect(ctx.cm.getCursor).toHaveBeenCalledWith("anchor");
+ expect(ctx.cm.getCursor).toHaveBeenCalledWith("head");
+ expect(ed.alignLine).toHaveBeenCalledWith(line, "center");
+ expect(cm.setSelection).toHaveBeenCalledWith(from, to);
+ });
+ });
+
+ describe("findNext", () => {});
+
+ describe("findPrev", () => {});
+
+ describe("getMatchIndex", () => {
+ it("iterates in the matches", () => {
+ const count = 3;
+
+ // reverse 2, 1, 0, 2
+
+ let matchIndex = getMatchIndex(count, 2, true);
+ expect(matchIndex).toBe(1);
+
+ matchIndex = getMatchIndex(count, 1, true);
+ expect(matchIndex).toBe(0);
+
+ matchIndex = getMatchIndex(count, 0, true);
+ expect(matchIndex).toBe(2);
+
+ // forward 1, 2, 0, 1
+
+ matchIndex = getMatchIndex(count, 1, false);
+ expect(matchIndex).toBe(2);
+
+ matchIndex = getMatchIndex(count, 2, false);
+ expect(matchIndex).toBe(0);
+
+ matchIndex = getMatchIndex(count, 0, false);
+ expect(matchIndex).toBe(1);
+ });
+ });
+
+ describe("removeOverlay", () => {
+ it("calls CodeMirror APIs: removeOverlay, getCursor & setSelection", () => {
+ const ctx = {
+ cm: {
+ removeOverlay: jest.fn(),
+ getCursor,
+ state: {},
+ doc: {
+ setSelection: jest.fn(),
+ },
+ },
+ };
+ removeOverlay(ctx, "test");
+ expect(ctx.cm.removeOverlay).toHaveBeenCalled();
+ expect(ctx.cm.getCursor).toHaveBeenCalled();
+ expect(ctx.cm.doc.setSelection).toHaveBeenCalledWith(
+ { line: 90, ch: 54 },
+ { line: 90, ch: 54 },
+ { scroll: false }
+ );
+ });
+ });
+});
diff --git a/devtools/client/debugger/src/utils/editor/tokens.js b/devtools/client/debugger/src/utils/editor/tokens.js
new file mode 100644
index 0000000000..f8783c02fe
--- /dev/null
+++ b/devtools/client/debugger/src/utils/editor/tokens.js
@@ -0,0 +1,178 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+function _isInvalidTarget(target) {
+ if (!target || !target.innerText) {
+ return true;
+ }
+
+ const tokenText = target.innerText.trim();
+
+ // exclude syntax where the expression would be a syntax error
+ const invalidToken =
+ tokenText === "" || tokenText.match(/^[(){}\|&%,.;=<>\+-/\*\s](?=)/);
+ if (invalidToken) {
+ return true;
+ }
+
+ // exclude tokens for which it does not make sense to show a preview:
+ // - literal
+ // - primitives
+ // - operators
+ // - tags
+ const INVALID_TARGET_CLASSES = [
+ "cm-atom",
+ "cm-number",
+ "cm-operator",
+ "cm-string",
+ "cm-tag",
+ // also exclude editor element (defined in Editor component)
+ "editor-mount",
+ ];
+ if (
+ target.className === "" ||
+ INVALID_TARGET_CLASSES.some(cls => target.classList.contains(cls))
+ ) {
+ return true;
+ }
+
+ // We need to exclude keywords, but since codeMirror tags "this" as a keyword, we need
+ // to check the tokenText as well.
+ // This seems to be the only case that we want to exclude (see devtools/client/shared/sourceeditor/codemirror/mode/javascript/javascript.js#24-41)
+ if (target.classList.contains("cm-keyword") && tokenText !== "this") {
+ return true;
+ }
+
+ // exclude codemirror elements that are not tokens
+ if (
+ // exclude inline preview
+ target.closest(".CodeMirror-widget") ||
+ // exclude in-line "empty" space, as well as the gutter
+ target.matches(".CodeMirror-line, .CodeMirror-gutter-elt") ||
+ target.getBoundingClientRect().top == 0
+ ) {
+ return true;
+ }
+
+ // exclude popup
+ if (target.closest(".popover")) {
+ return true;
+ }
+
+ return false;
+}
+
+function _dispatch(codeMirror, eventName, data) {
+ codeMirror.constructor.signal(codeMirror, eventName, data);
+}
+
+function _invalidLeaveTarget(target) {
+ if (!target || target.closest(".popover")) {
+ return true;
+ }
+
+ return false;
+}
+
+/**
+ * Wraps the codemirror mouse events to generate token events
+ * @param {*} codeMirror
+ * @returns
+ */
+export function onMouseOver(codeMirror) {
+ let prevTokenPos = null;
+
+ function onMouseLeave(event) {
+ if (_invalidLeaveTarget(event.relatedTarget)) {
+ addMouseLeave(event.target);
+ return;
+ }
+
+ prevTokenPos = null;
+ _dispatch(codeMirror, "tokenleave", event);
+ }
+
+ function addMouseLeave(target) {
+ target.addEventListener("mouseleave", onMouseLeave, {
+ capture: true,
+ once: true,
+ });
+ }
+
+ return enterEvent => {
+ const { target } = enterEvent;
+
+ if (_isInvalidTarget(target)) {
+ return;
+ }
+
+ const tokenPos = getTokenLocation(codeMirror, target);
+
+ if (
+ prevTokenPos?.line !== tokenPos?.line ||
+ prevTokenPos?.column !== tokenPos?.column
+ ) {
+ addMouseLeave(target);
+
+ _dispatch(codeMirror, "tokenenter", {
+ event: enterEvent,
+ target,
+ tokenPos,
+ });
+ prevTokenPos = tokenPos;
+ }
+ };
+}
+
+/**
+ * Gets the end position of a token at a specific line/column
+ *
+ * @param {*} codeMirror
+ * @param {Number} line
+ * @param {Number} column
+ * @returns {Number}
+ */
+export function getTokenEnd(codeMirror, line, column) {
+ const token = codeMirror.getTokenAt({
+ line,
+ ch: column + 1,
+ });
+ const tokenString = token.string;
+
+ return tokenString === "{" || tokenString === "[" ? null : token.end;
+}
+
+/**
+ * Given the dom element related to the token, this gets its line and column.
+ *
+ * @param {*} codeMirror
+ * @param {*} tokenEl
+ * @returns {Object} An object of the form { line, column }
+ */
+export function getTokenLocation(codeMirror, tokenEl) {
+ // Get the quad (and not the bounding rect), as the span could wrap on multiple lines
+ // and the middle of the bounding rect may not be over the token:
+ // +───────────────────────+
+ // │ myLongVariableNa│
+ // │me + │
+ // +───────────────────────+
+ const { p1, p2, p3 } = tokenEl.getBoxQuads()[0];
+ const left = p1.x + (p2.x - p1.x) / 2;
+ const top = p1.y + (p3.y - p1.y) / 2;
+ const { line, ch } = codeMirror.coordsChar(
+ {
+ left,
+ top,
+ },
+ // Use the "window" context where the coordinates are relative to the top-left corner
+ // of the currently visible (scrolled) window.
+ // This enables codemirror also correctly handle wrappped lines in the editor.
+ "window"
+ );
+
+ return {
+ line: line + 1,
+ column: ch,
+ };
+}
diff --git a/devtools/client/debugger/src/utils/environment.js b/devtools/client/debugger/src/utils/environment.js
new file mode 100644
index 0000000000..6f68dd793c
--- /dev/null
+++ b/devtools/client/debugger/src/utils/environment.js
@@ -0,0 +1,15 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+export function isNode() {
+ try {
+ return process.release.name == "node";
+ } catch (e) {
+ return false;
+ }
+}
+
+export function isNodeTest() {
+ return isNode() && process.env.NODE_ENV != "production";
+}
diff --git a/devtools/client/debugger/src/utils/evaluation-result.js b/devtools/client/debugger/src/utils/evaluation-result.js
new file mode 100644
index 0000000000..def02aacfa
--- /dev/null
+++ b/devtools/client/debugger/src/utils/evaluation-result.js
@@ -0,0 +1,19 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+function isFront(result) {
+ return !!result && typeof result === "object" && !!result.getGrip;
+}
+
+export function getGrip(result) {
+ if (isFront(result)) {
+ return result.getGrip();
+ }
+
+ return result;
+}
+
+export function getFront(result) {
+ return isFront(result) ? result : null;
+}
diff --git a/devtools/client/debugger/src/utils/expressions.js b/devtools/client/debugger/src/utils/expressions.js
new file mode 100644
index 0000000000..f30d0c089c
--- /dev/null
+++ b/devtools/client/debugger/src/utils/expressions.js
@@ -0,0 +1,67 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { correctIndentation } from "./indentation";
+import { getGrip, getFront } from "./evaluation-result";
+
+const UNAVAILABLE_GRIP = { unavailable: true };
+
+/*
+ * wrap the expression input in a try/catch so that it can be safely
+ * evaluated.
+ *
+ * NOTE: we add line after the expression to protect against comments.
+ */
+export function wrapExpression(input) {
+ return correctIndentation(`
+ try {
+ ${input}
+ } catch (e) {
+ e
+ }
+ `);
+}
+
+function isUnavailable(value) {
+ return (
+ value &&
+ !!value.isError &&
+ (value.class === "ReferenceError" || value.class === "TypeError")
+ );
+}
+
+/**
+ *
+ * @param {Object} expression: Expression item as stored in state.expressions in reducers/expressions.js
+ * @param {String} expression.input: evaluated expression string
+ * @param {Object} expression.value: evaluated expression result object as returned from ScriptCommand#execute
+ * @param {Object} expression.value.result: expression result, might be a primitive, a grip or a front
+ * @param {Object} expression.value.exception: expression result error, might be a primitive, a grip or a front
+ * @returns {Object} an object of the following shape:
+ * - expressionResultGrip: A primitive or a grip
+ * - expressionResultFront: An object front if it exists, or undefined
+ */
+export function getExpressionResultGripAndFront(expression) {
+ const { value } = expression;
+
+ if (!value) {
+ return { expressionResultGrip: UNAVAILABLE_GRIP };
+ }
+
+ const expressionResultReturn = value.exception || value.result;
+ const valueGrip = getGrip(expressionResultReturn);
+ if (!valueGrip || isUnavailable(valueGrip)) {
+ return { expressionResultGrip: UNAVAILABLE_GRIP };
+ }
+
+ if (valueGrip.isError) {
+ const { name, message } = valueGrip.preview;
+ return { expressionResultGrip: `${name}: ${message}` };
+ }
+
+ return {
+ expressionResultGrip: valueGrip,
+ expressionResultFront: getFront(expressionResultReturn),
+ };
+}
diff --git a/devtools/client/debugger/src/utils/function.js b/devtools/client/debugger/src/utils/function.js
new file mode 100644
index 0000000000..39d0f5a9a7
--- /dev/null
+++ b/devtools/client/debugger/src/utils/function.js
@@ -0,0 +1,37 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { isFulfilled } from "./async-value";
+import { findClosestFunction } from "./ast";
+import { correctIndentation } from "./indentation";
+
+export function findFunctionText(line, source, sourceTextContent, symbols) {
+ const func = findClosestFunction(symbols, {
+ sourceId: source.id,
+ line,
+ column: Infinity,
+ });
+
+ if (
+ source.isWasm ||
+ !func ||
+ !sourceTextContent ||
+ !isFulfilled(sourceTextContent) ||
+ sourceTextContent.value.type !== "text"
+ ) {
+ return null;
+ }
+
+ const {
+ location: { start, end },
+ } = func;
+ const lines = sourceTextContent.value.value.split("\n");
+ const firstLine = lines[start.line - 1].slice(start.column);
+ const lastLine = lines[end.line - 1].slice(0, end.column);
+ const middle = lines.slice(start.line, end.line - 1);
+ const functionText = [firstLine, ...middle, lastLine].join("\n");
+ const indentedFunctionText = correctIndentation(functionText);
+
+ return indentedFunctionText;
+}
diff --git a/devtools/client/debugger/src/utils/indentation.js b/devtools/client/debugger/src/utils/indentation.js
new file mode 100644
index 0000000000..80e5014f6d
--- /dev/null
+++ b/devtools/client/debugger/src/utils/indentation.js
@@ -0,0 +1,40 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+export function getIndentation(line) {
+ if (!line) {
+ return 0;
+ }
+
+ const lineMatch = line.match(/^\s*/);
+ if (!lineMatch) {
+ return 0;
+ }
+
+ return lineMatch[0].length;
+}
+
+function getMaxIndentation(lines) {
+ const firstLine = lines[0];
+ const secondLine = lines[1];
+ const lastLine = lines[lines.length - 1];
+
+ const indentations = [
+ getIndentation(firstLine),
+ getIndentation(secondLine),
+ getIndentation(lastLine),
+ ];
+
+ return Math.max(...indentations);
+}
+
+export function correctIndentation(text) {
+ const lines = text.trim().split("\n");
+ const indentation = getMaxIndentation(lines);
+ const formattedLines = lines.map(_line =>
+ _line.replace(new RegExp(`^\\s{0,${indentation - 1}}`), "")
+ );
+
+ return formattedLines.join("\n");
+}
diff --git a/devtools/client/debugger/src/utils/isMinified.js b/devtools/client/debugger/src/utils/isMinified.js
new file mode 100644
index 0000000000..dc5963b1b2
--- /dev/null
+++ b/devtools/client/debugger/src/utils/isMinified.js
@@ -0,0 +1,58 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { isFulfilled } from "./async-value";
+
+// Used to detect minification for automatic pretty printing
+const SAMPLE_SIZE = 50;
+const INDENT_COUNT_THRESHOLD = 5;
+const CHARACTER_LIMIT = 250;
+const _minifiedCache = new Map();
+
+export function isMinified(source, sourceTextContent) {
+ if (_minifiedCache.has(source.id)) {
+ return _minifiedCache.get(source.id);
+ }
+
+ if (
+ !sourceTextContent ||
+ !isFulfilled(sourceTextContent) ||
+ sourceTextContent.value.type !== "text"
+ ) {
+ return false;
+ }
+
+ let text = sourceTextContent.value.value;
+
+ let lineEndIndex = 0;
+ let lineStartIndex = 0;
+ let lines = 0;
+ let indentCount = 0;
+ let overCharLimit = false;
+
+ // Strip comments.
+ text = text.replace(/\/\*[\S\s]*?\*\/|\/\/(.+|\n)/g, "");
+
+ while (lines++ < SAMPLE_SIZE) {
+ lineEndIndex = text.indexOf("\n", lineStartIndex);
+ if (lineEndIndex == -1) {
+ break;
+ }
+ if (/^\s+/.test(text.slice(lineStartIndex, lineEndIndex))) {
+ indentCount++;
+ }
+ // For files with no indents but are not minified.
+ if (lineEndIndex - lineStartIndex > CHARACTER_LIMIT) {
+ overCharLimit = true;
+ break;
+ }
+ lineStartIndex = lineEndIndex + 1;
+ }
+
+ const minified =
+ (indentCount / lines) * 100 < INDENT_COUNT_THRESHOLD || overCharLimit;
+
+ _minifiedCache.set(source.id, minified);
+ return minified;
+}
diff --git a/devtools/client/debugger/src/utils/location.js b/devtools/client/debugger/src/utils/location.js
new file mode 100644
index 0000000000..46e5c4ae05
--- /dev/null
+++ b/devtools/client/debugger/src/utils/location.js
@@ -0,0 +1,124 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { getSelectedLocation } from "./selected-location";
+import { getSource } from "../selectors/index";
+
+/**
+ * Note that arguments can be created via `createLocation`.
+ * But they can also be created via `createPendingLocation` in reducer/pending-breakpoints.js.
+ * Both will have similar line and column attributes.
+ */
+export function comparePosition(a, b) {
+ return a && b && a.line == b.line && a.column == b.column;
+}
+
+export function createLocation({
+ source,
+ sourceActor = null,
+
+ // Line 0 represents no specific line chosen for action
+ line = 0,
+ column,
+}) {
+ return {
+ source,
+ sourceActor,
+ sourceActorId: sourceActor?.id,
+
+ // `line` and `column` are 1-based.
+ // This data is mostly coming from and driven by
+ // JSScript::lineno and JSScript::column
+ // https://searchfox.org/mozilla-central/rev/90dce6b0223b4dc17bb10f1125b44f70951585f9/js/src/vm/JSScript.h#1545-1548
+ line,
+ column,
+ };
+}
+
+/**
+ * Convert location objects created via `createLocation` into
+ * the format used by the Source Map Loader/Worker.
+ * It only needs sourceId, line and column attributes.
+ */
+export function debuggerToSourceMapLocation(location) {
+ return {
+ sourceId: location.source.id,
+ // In case of errors loading the source, we might not have a precise location.
+ // Defaults to first line and column.
+ line: location.line || 1,
+ column: location.column || 0,
+ };
+}
+
+/**
+ * Pending location only need these three attributes,
+ * and especially doesn't need the large source and sourceActor objects of the regular location objects.
+ *
+ * @param {Object} location
+ */
+export function createPendingSelectedLocation(location) {
+ return {
+ url: location.source.url,
+
+ line: location.line,
+ column: location.column,
+ };
+}
+
+export function sortSelectedLocations(locations, selectedSource) {
+ return Array.from(locations).sort((locationA, locationB) => {
+ const aSelected = getSelectedLocation(locationA, selectedSource);
+ const bSelected = getSelectedLocation(locationB, selectedSource);
+
+ // Order the locations by line number…
+ if (aSelected.line < bSelected.line) {
+ return -1;
+ }
+
+ if (aSelected.line > bSelected.line) {
+ return 1;
+ }
+
+ // … and if we have the same line, we want to return location with undefined columns
+ // first, and then order them by column
+ if (aSelected.column == bSelected.column) {
+ return 0;
+ }
+
+ if (aSelected.column === undefined) {
+ return -1;
+ }
+
+ if (bSelected.column === undefined) {
+ return 1;
+ }
+
+ return aSelected.column < bSelected.column ? -1 : 1;
+ });
+}
+
+/**
+ * Source map Loader/Worker and debugger frontend don't use the same objects for locations.
+ * Worker uses 'sourceId' attributes whereas the frontend has 'source' attribute.
+ */
+export function sourceMapToDebuggerLocation(state, location) {
+ // From MapScopes modules, we might re-process the exact same location objects
+ // for which we would already have computed the source object,
+ // and which would lack sourceId attribute.
+ if (location.source) {
+ return location;
+ }
+
+ // SourceMapLoader doesn't known about debugger's source objects
+ // so that we have to fetch it from here
+ const source = getSource(state, location.sourceId);
+ if (!source) {
+ throw new Error(`Could not find source-map source ${location.sourceId}`);
+ }
+
+ return createLocation({
+ ...location,
+ source,
+ });
+}
diff --git a/devtools/client/debugger/src/utils/log.js b/devtools/client/debugger/src/utils/log.js
new file mode 100644
index 0000000000..6e2e3b7b15
--- /dev/null
+++ b/devtools/client/debugger/src/utils/log.js
@@ -0,0 +1,30 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/* */
+
+/**
+ *
+ * Utils for logging to the console
+ * Suppresses logging in non-development environment
+ *
+ * @module utils/log
+ */
+
+import { prefs } from "./prefs";
+
+/**
+ * Produces a formatted console log line by imploding args, prefixed by [log]
+ *
+ * function input: log(["hello", "world"])
+ * console output: [log] hello world
+ *
+ * @memberof utils/log
+ * @static
+ */
+export function log(...args) {
+ if (prefs.logging) {
+ console.log(...args);
+ }
+}
diff --git a/devtools/client/debugger/src/utils/memoizableAction.js b/devtools/client/debugger/src/utils/memoizableAction.js
new file mode 100644
index 0000000000..0f465177e2
--- /dev/null
+++ b/devtools/client/debugger/src/utils/memoizableAction.js
@@ -0,0 +1,75 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { asSettled } from "./async-value";
+import { validateContext } from "./context";
+
+/*
+ * memoizableActon is a utility for actions that should only be performed
+ * once per key. It is useful for loading sources, parsing symbols ...
+ *
+ * @getValue - gets the result from the redux store
+ * @createKey - creates a key for the requests map
+ * @action - kicks off the async work for the action
+ *
+ *
+ * For Example
+ *
+ * export const setItem = memoizeableAction(
+ * "setItem",
+ * {
+ * hasValue: ({ a }, { getState }) => hasItem(getState(), a),
+ * getValue: ({ a }, { getState }) => getItem(getState(), a),
+ * createKey: ({ a }) => a,
+ * action: ({ a }, thunkArgs) => doSetItem(a, thunkArgs)
+ * }
+ * );
+ *
+ */
+export function memoizeableAction(name, { getValue, createKey, action }) {
+ const requests = new Map();
+ return args => async thunkArgs => {
+ let result = asSettled(getValue(args, thunkArgs));
+ if (!result) {
+ const key = createKey(args, thunkArgs);
+ if (!requests.has(key)) {
+ requests.set(
+ key,
+ (async () => {
+ try {
+ await action(args, thunkArgs);
+ } catch (e) {
+ console.warn(`Action ${name} had an exception:`, e);
+ } finally {
+ requests.delete(key);
+ }
+ })()
+ );
+ }
+
+ await requests.get(key);
+
+ if (args.cx) {
+ validateContext(thunkArgs.getState(), args.cx);
+ }
+
+ result = asSettled(getValue(args, thunkArgs));
+ if (!result) {
+ // Returning null here is not ideal. This means that the action
+ // resolved but 'getValue' didn't return a loaded value, for instance
+ // if the data the action was meant to store was deleted. In a perfect
+ // world we'd throw a ContextError here or handle cancellation somehow.
+ // Throwing will also allow us to change the return type on the action
+ // to always return a promise for the getValue AsyncValue type, but
+ // for now we have to add an additional '| null' for this case.
+ return null;
+ }
+ }
+
+ if (result.state === "rejected") {
+ throw result.value;
+ }
+ return result.value;
+ };
+}
diff --git a/devtools/client/debugger/src/utils/memoize.js b/devtools/client/debugger/src/utils/memoize.js
new file mode 100644
index 0000000000..3f634b326d
--- /dev/null
+++ b/devtools/client/debugger/src/utils/memoize.js
@@ -0,0 +1,63 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+function hasValue(keys, store) {
+ let currentStore = store;
+ for (const key of keys) {
+ if (!currentStore || !currentStore.has(key)) {
+ return false;
+ }
+
+ currentStore = currentStore.get(key);
+ }
+ return true;
+}
+
+function getValue(keys, store) {
+ let currentStore = store;
+ for (const key of keys) {
+ if (!currentStore) {
+ return null;
+ }
+ currentStore = currentStore.get(key);
+ }
+
+ return currentStore;
+}
+
+function setValue(keys, store, value) {
+ const keysExceptLast = keys.slice(0, -1);
+ const lastKey = keys[keys.length - 1];
+
+ let currentStore = store;
+ for (const key of keysExceptLast) {
+ if (!currentStore) {
+ return;
+ }
+
+ if (!currentStore.has(key)) {
+ currentStore.set(key, new WeakMap());
+ }
+ currentStore = currentStore.get(key);
+ }
+
+ if (currentStore) {
+ currentStore.set(lastKey, value);
+ }
+}
+
+// memoize with n arguments
+export default function memoize(func) {
+ const store = new WeakMap();
+
+ return function (...keys) {
+ if (hasValue(keys, store)) {
+ return getValue(keys, store);
+ }
+
+ const newValue = func.apply(null, keys);
+ setValue(keys, store, newValue);
+ return newValue;
+ };
+}
diff --git a/devtools/client/debugger/src/utils/memoizeLast.js b/devtools/client/debugger/src/utils/memoizeLast.js
new file mode 100644
index 0000000000..b3c46cab57
--- /dev/null
+++ b/devtools/client/debugger/src/utils/memoizeLast.js
@@ -0,0 +1,27 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+export function memoizeLast(fn) {
+ let lastArgs;
+ let lastResult;
+
+ const memoized = (...args) => {
+ if (
+ lastArgs &&
+ args.length === lastArgs.length &&
+ args.every((arg, i) => arg === lastArgs[i])
+ ) {
+ return lastResult;
+ }
+
+ lastArgs = args;
+ lastResult = fn(...args);
+
+ return lastResult;
+ };
+
+ return memoized;
+}
+
+export default memoizeLast;
diff --git a/devtools/client/debugger/src/utils/moz.build b/devtools/client/debugger/src/utils/moz.build
new file mode 100644
index 0000000000..8deb8e18db
--- /dev/null
+++ b/devtools/client/debugger/src/utils/moz.build
@@ -0,0 +1,53 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DIRS += [
+ "breakpoint",
+ "editor",
+ "pause",
+ "sources-tree",
+]
+
+CompiledModules(
+ "assert.js",
+ "ast.js",
+ "async-value.js",
+ "bootstrap.js",
+ "build-query.js",
+ "clipboard.js",
+ "context.js",
+ "dbg.js",
+ "DevToolsUtils.js",
+ "environment.js",
+ "expressions.js",
+ "evaluation-result.js",
+ "function.js",
+ "indentation.js",
+ "isMinified.js",
+ "location.js",
+ "log.js",
+ "memoize.js",
+ "memoizeLast.js",
+ "memoizableAction.js",
+ "path.js",
+ "prefs.js",
+ "preview.js",
+ "quick-open.js",
+ "result-list.js",
+ "selected-location.js",
+ "shallow-equal.js",
+ "source-maps.js",
+ "source-queue.js",
+ "source.js",
+ "tabs.js",
+ "task.js",
+ "telemetry.js",
+ "text.js",
+ "ui.js",
+ "url.js",
+ "utils.js",
+ "wasm.js",
+ "worker.js",
+)
diff --git a/devtools/client/debugger/src/utils/path.js b/devtools/client/debugger/src/utils/path.js
new file mode 100644
index 0000000000..bc7f975919
--- /dev/null
+++ b/devtools/client/debugger/src/utils/path.js
@@ -0,0 +1,24 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+export function basename(path) {
+ return path.split("/").pop();
+}
+
+export function dirname(path) {
+ const idx = path.lastIndexOf("/");
+ return path.slice(0, idx);
+}
+
+export function isURL(str) {
+ return str.includes("://");
+}
+
+export function isAbsolute(str) {
+ return str[0] === "/";
+}
+
+export function join(base, dir) {
+ return `${base}/${dir}`;
+}
diff --git a/devtools/client/debugger/src/utils/pause/frames/annotateFrames.js b/devtools/client/debugger/src/utils/pause/frames/annotateFrames.js
new file mode 100644
index 0000000000..3cdc4b1c1e
--- /dev/null
+++ b/devtools/client/debugger/src/utils/pause/frames/annotateFrames.js
@@ -0,0 +1,68 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { getLibraryFromUrl } from "./getLibraryFromUrl";
+
+/**
+ * Augment all frame objects with a 'library' attribute.
+ */
+export function annotateFramesWithLibrary(frames) {
+ for (const frame of frames) {
+ frame.library = getLibraryFromUrl(frame, frames);
+ }
+
+ // Babel need some special treatment to recognize some particular async stack pattern
+ for (const idx of getBabelFrameIndexes(frames)) {
+ const frame = frames[idx];
+ frame.library = "Babel";
+ }
+}
+
+/**
+ * Returns all the indexes that are part of a babel async call stack.
+ *
+ * @param {Array<Object>} frames
+ * @returns Array<Integer>
+ */
+function getBabelFrameIndexes(frames) {
+ const startIndexes = [];
+ const endIndexes = [];
+
+ for (let index = 0, length = frames.length; index < length; index++) {
+ const frame = frames[index];
+ const frameUrl = frame.location.source.url;
+
+ if (
+ frame.displayName === "tryCatch" &&
+ frameUrl.match(/regenerator-runtime/i)
+ ) {
+ startIndexes.push(index);
+ }
+
+ if (startIndexes.length > endIndexes.length) {
+ if (frame.displayName === "flush" && frameUrl.match(/_microtask/i)) {
+ endIndexes.push(index);
+ }
+ if (frame.displayName === "_asyncToGenerator/<") {
+ endIndexes.push(index + 1);
+ }
+ }
+ }
+
+ if (startIndexes.length != endIndexes.length || startIndexes.length === 0) {
+ return [];
+ }
+
+ const babelFrameIndexes = [];
+ // We have the same number of start and end indexes, we can loop through one of them to
+ // build our async call stack index ranges
+ // e.g. if we have startIndexes: [1,5] and endIndexes: [3,8], we want to return [1,2,3,5,6,7,8]
+ startIndexes.forEach((startIndex, index) => {
+ const matchingEndIndex = endIndexes[index];
+ for (let i = startIndex; i <= matchingEndIndex; i++) {
+ babelFrameIndexes.push(i);
+ }
+ });
+ return babelFrameIndexes;
+}
diff --git a/devtools/client/debugger/src/utils/pause/frames/collapseFrames.js b/devtools/client/debugger/src/utils/pause/frames/collapseFrames.js
new file mode 100644
index 0000000000..185b66e26c
--- /dev/null
+++ b/devtools/client/debugger/src/utils/pause/frames/collapseFrames.js
@@ -0,0 +1,58 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+function collapseLastFrames(frames) {
+ const index = frames.findIndex(frame =>
+ frame.location.source.url?.match(/webpack\/bootstrap/i)
+ );
+
+ if (index == -1) {
+ return { newFrames: frames, lastGroup: [] };
+ }
+
+ const newFrames = frames.slice(0, index);
+ const lastGroup = frames.slice(index);
+ return { newFrames, lastGroup };
+}
+
+export function collapseFrames(frames) {
+ // We collapse groups of one so that user frames
+ // are not in a group of one
+ function addGroupToList(group, list) {
+ if (!group) {
+ return list;
+ }
+
+ if (group.length > 1) {
+ list.push(group);
+ } else {
+ list = list.concat(group);
+ }
+
+ return list;
+ }
+ const { newFrames, lastGroup } = collapseLastFrames(frames);
+ frames = newFrames;
+ let items = [];
+ let currentGroup = null;
+ let prevItem = null;
+ for (const frame of frames) {
+ const prevLibrary = prevItem?.library;
+
+ if (!currentGroup) {
+ currentGroup = [frame];
+ } else if (prevLibrary && prevLibrary == frame.library) {
+ currentGroup.push(frame);
+ } else {
+ items = addGroupToList(currentGroup, items);
+ currentGroup = [frame];
+ }
+
+ prevItem = frame;
+ }
+
+ items = addGroupToList(currentGroup, items);
+ items = addGroupToList(lastGroup, items);
+ return items;
+}
diff --git a/devtools/client/debugger/src/utils/pause/frames/displayName.js b/devtools/client/debugger/src/utils/pause/frames/displayName.js
new file mode 100644
index 0000000000..0a47e9ac04
--- /dev/null
+++ b/devtools/client/debugger/src/utils/pause/frames/displayName.js
@@ -0,0 +1,114 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Decodes an anonymous naming scheme that
+// spider monkey implements based on "Naming Anonymous JavaScript Functions"
+// http://johnjbarton.github.io/nonymous/index.html
+const objectProperty = /([\w\d\$#]+)$/;
+const arrayProperty = /\[(.*?)\]$/;
+const functionProperty = /([\w\d]+)[\/\.<]*?$/;
+const annonymousProperty = /([\w\d]+)\(\^\)$/;
+const displayNameScenarios = [
+ objectProperty,
+ arrayProperty,
+ functionProperty,
+ annonymousProperty,
+];
+const includeSpace = /\s/;
+export function simplifyDisplayName(displayName) {
+ // if the display name has a space it has already been mapped
+ if (!displayName || includeSpace.exec(displayName)) {
+ return displayName;
+ }
+
+ for (const reg of displayNameScenarios) {
+ const match = reg.exec(displayName);
+ if (match) {
+ return match[1];
+ }
+ }
+
+ return displayName;
+}
+
+const displayNameLibraryMap = {
+ Babel: {
+ tryCatch: "Async",
+ },
+ Backbone: {
+ "extend/child": "Create Class",
+ ".create": "Create Model",
+ },
+ jQuery: {
+ "jQuery.event.dispatch": "Dispatch Event",
+ },
+ React: {
+ // eslint-disable-next-line max-len
+ "ReactCompositeComponent._renderValidatedComponentWithoutOwnerOrContext/renderedElement<":
+ "Render",
+ _renderValidatedComponentWithoutOwnerOrContext: "Render",
+ },
+ VueJS: {
+ "renderMixin/Vue.prototype._render": "Render",
+ },
+ Webpack: {
+ // eslint-disable-next-line camelcase
+ __webpack_require__: "Bootstrap",
+ },
+};
+
+/**
+ * Compute the typical way to show a frame or function to the user.
+ *
+ * @param {Object} frameOrFunc
+ * Either a frame or a func object.
+ * Frame object is typically created via create.js::createFrame
+ * Func object comes from ast reducer and getSymbols selector.
+ * @param {Boolean} shouldMapDisplayName
+ * True by default, will try to translate internal framework function name
+ * into a most explicit and simplier name.
+ * @param {Object} l10n
+ * The localization object.
+ */
+export function formatDisplayName(
+ frameOrFunc,
+ { shouldMapDisplayName = true } = {},
+ l10n
+) {
+ // All the following attributes are only available on Frame objects
+ const { library, displayName, originalDisplayName } = frameOrFunc;
+ let displayedName;
+
+ // If the frame was identified to relate to a library,
+ // lookup for pretty name for the most important method of some frameworks
+ if (library && shouldMapDisplayName) {
+ displayedName = displayNameLibraryMap[library]?.[displayName];
+ }
+
+ // Frames for original sources may have both displayName for the generated source,
+ // or originalDisplayName for the original source.
+ // (in case original and generated have distinct function names in uglified sources)
+ //
+ // Also fallback to "name" attribute when the passed object is a Func object.
+ if (!displayedName) {
+ displayedName = originalDisplayName || displayName || frameOrFunc.name;
+ }
+
+ if (!displayedName) {
+ return l10n.getStr("anonymousFunction");
+ }
+
+ return simplifyDisplayName(displayedName);
+}
+
+export function formatCopyName(frame, l10n, shouldDisplayOriginalLocation) {
+ const displayName = formatDisplayName(frame, undefined, l10n);
+ const location = shouldDisplayOriginalLocation
+ ? frame.location
+ : frame.generatedLocation;
+ const fileName = location.source.url || location.source.id;
+ const frameLocation = frame.location.line;
+
+ return `${displayName} (${fileName}#${frameLocation})`;
+}
diff --git a/devtools/client/debugger/src/utils/pause/frames/getLibraryFromUrl.js b/devtools/client/debugger/src/utils/pause/frames/getLibraryFromUrl.js
new file mode 100644
index 0000000000..40a4d83841
--- /dev/null
+++ b/devtools/client/debugger/src/utils/pause/frames/getLibraryFromUrl.js
@@ -0,0 +1,140 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+const libraryMap = [
+ {
+ label: "Backbone",
+ pattern: /backbone/i,
+ },
+ {
+ label: "Babel",
+ pattern: /node_modules\/@babel/i,
+ },
+ {
+ label: "jQuery",
+ pattern: /jquery/i,
+ },
+ {
+ label: "Preact",
+ pattern: /preact/i,
+ },
+ {
+ label: "React",
+ pattern:
+ /(node_modules\/(?:react(-dom)?(-dev)?\/))|(react(-dom)?(-dev)?(\.[a-z]+)*\.js$)/,
+ },
+ {
+ label: "Immutable",
+ pattern: /immutable/i,
+ },
+ {
+ label: "Webpack",
+ pattern: /webpack\/bootstrap/i,
+ },
+ {
+ label: "Express",
+ pattern: /node_modules\/express/,
+ },
+ {
+ label: "Pug",
+ pattern: /node_modules\/pug/,
+ },
+ {
+ label: "ExtJS",
+ pattern: /\/ext-all[\.\-]/,
+ },
+ {
+ label: "MobX",
+ pattern: /mobx/i,
+ },
+ {
+ label: "Underscore",
+ pattern: /underscore/i,
+ },
+ {
+ label: "Lodash",
+ pattern: /lodash/i,
+ },
+ {
+ label: "Ember",
+ pattern: /ember/i,
+ },
+ {
+ label: "Choo",
+ pattern: /choo/i,
+ },
+ {
+ label: "VueJS",
+ pattern: /vue(?:\.[a-z]+)*\.js/i,
+ },
+ {
+ label: "RxJS",
+ pattern: /rxjs/i,
+ },
+ {
+ label: "Angular",
+ pattern: /angular(?!.*\/app\/)/i,
+ contextPattern: /zone\.js/,
+ },
+ {
+ label: "Redux",
+ pattern: /redux/i,
+ },
+ {
+ label: "Dojo",
+ pattern: /dojo/i,
+ },
+ {
+ label: "Marko",
+ pattern: /marko/i,
+ },
+ {
+ label: "NuxtJS",
+ pattern: /[\._]nuxt/i,
+ },
+ {
+ label: "Aframe",
+ pattern: /aframe/i,
+ },
+ {
+ label: "NextJS",
+ pattern: /[\._]next/i,
+ },
+];
+
+export function getLibraryFromUrl(frame, callStack = []) {
+ const frameUrl = frame.location.source.url;
+
+ // Let's first check if the frame match a defined pattern.
+ let match = libraryMap.find(o => o.pattern.test(frameUrl));
+ if (match) {
+ return match.label;
+ }
+
+ // If it does not, it might still be one of the case where the file is used
+ // by a library but the name has not enough specificity. In such case, we want
+ // to only return the library name if there are frames matching the library
+ // pattern in the callStack (e.g. `zone.js` is used by Angular, but the name
+ // could be quite common and return false positive if evaluated alone. So we
+ // only return Angular if there are other frames matching Angular).
+ match = libraryMap.find(
+ o => o.contextPattern && o.contextPattern.test(frameUrl)
+ );
+ if (match) {
+ const contextMatch = callStack.some(f => {
+ const url = f.location.source.url;
+ if (!url) {
+ return false;
+ }
+
+ return libraryMap.some(o => o.pattern.test(url));
+ });
+
+ if (contextMatch) {
+ return match.label;
+ }
+ }
+
+ return null;
+}
diff --git a/devtools/client/debugger/src/utils/pause/frames/index.js b/devtools/client/debugger/src/utils/pause/frames/index.js
new file mode 100644
index 0000000000..8b232b3452
--- /dev/null
+++ b/devtools/client/debugger/src/utils/pause/frames/index.js
@@ -0,0 +1,8 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+export * from "./annotateFrames";
+export * from "./collapseFrames";
+export * from "./displayName";
+export * from "./getLibraryFromUrl";
diff --git a/devtools/client/debugger/src/utils/pause/frames/moz.build b/devtools/client/debugger/src/utils/pause/frames/moz.build
new file mode 100644
index 0000000000..67462d40c3
--- /dev/null
+++ b/devtools/client/debugger/src/utils/pause/frames/moz.build
@@ -0,0 +1,14 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DIRS += []
+
+CompiledModules(
+ "annotateFrames.js",
+ "collapseFrames.js",
+ "displayName.js",
+ "getLibraryFromUrl.js",
+ "index.js",
+)
diff --git a/devtools/client/debugger/src/utils/pause/frames/tests/__snapshots__/collapseFrames.spec.js.snap b/devtools/client/debugger/src/utils/pause/frames/tests/__snapshots__/collapseFrames.spec.js.snap
new file mode 100644
index 0000000000..a09cff5bee
--- /dev/null
+++ b/devtools/client/debugger/src/utils/pause/frames/tests/__snapshots__/collapseFrames.spec.js.snap
@@ -0,0 +1,87 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`collapseFrames default 1`] = `
+Array [
+ Object {
+ "displayName": "a",
+ "location": Object {
+ "source": Object {},
+ },
+ },
+ Array [
+ Object {
+ "displayName": "b",
+ "library": "React",
+ "location": Object {
+ "source": Object {},
+ },
+ },
+ Object {
+ "displayName": "c",
+ "library": "React",
+ "location": Object {
+ "source": Object {},
+ },
+ },
+ ],
+]
+`;
+
+exports[`collapseFrames promises 1`] = `
+Array [
+ Object {
+ "displayName": "a",
+ "location": Object {
+ "source": Object {},
+ },
+ },
+ Array [
+ Object {
+ "displayName": "b",
+ "library": "React",
+ "location": Object {
+ "source": Object {},
+ },
+ },
+ Object {
+ "displayName": "c",
+ "library": "React",
+ "location": Object {
+ "source": Object {},
+ },
+ },
+ ],
+ Object {
+ "asyncCause": "promise callback",
+ "displayName": "d",
+ "library": undefined,
+ "location": Object {
+ "source": Object {},
+ },
+ },
+ Array [
+ Object {
+ "displayName": "e",
+ "library": "React",
+ "location": Object {
+ "source": Object {},
+ },
+ },
+ Object {
+ "displayName": "f",
+ "library": "React",
+ "location": Object {
+ "source": Object {},
+ },
+ },
+ ],
+ Object {
+ "asyncCause": null,
+ "displayName": "g",
+ "library": undefined,
+ "location": Object {
+ "source": Object {},
+ },
+ },
+]
+`;
diff --git a/devtools/client/debugger/src/utils/pause/frames/tests/collapseFrames.spec.js b/devtools/client/debugger/src/utils/pause/frames/tests/collapseFrames.spec.js
new file mode 100644
index 0000000000..58cafc3211
--- /dev/null
+++ b/devtools/client/debugger/src/utils/pause/frames/tests/collapseFrames.spec.js
@@ -0,0 +1,43 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { collapseFrames } from "../collapseFrames";
+
+describe("collapseFrames", () => {
+ it("default", () => {
+ const groups = collapseFrames([
+ { displayName: "a", location: { source: {} } },
+
+ { displayName: "b", library: "React", location: { source: {} } },
+ { displayName: "c", library: "React", location: { source: {} } },
+ ]);
+
+ expect(groups).toMatchSnapshot();
+ });
+
+ it("promises", () => {
+ const groups = collapseFrames([
+ { displayName: "a", location: { source: {} } },
+
+ { displayName: "b", library: "React", location: { source: {} } },
+ { displayName: "c", library: "React", location: { source: {} } },
+ {
+ displayName: "d",
+ library: undefined,
+ asyncCause: "promise callback",
+ location: { source: {} },
+ },
+ { displayName: "e", library: "React", location: { source: {} } },
+ { displayName: "f", library: "React", location: { source: {} } },
+ {
+ displayName: "g",
+ library: undefined,
+ asyncCause: null,
+ location: { source: {} },
+ },
+ ]);
+
+ expect(groups).toMatchSnapshot();
+ });
+});
diff --git a/devtools/client/debugger/src/utils/pause/frames/tests/displayName.spec.js b/devtools/client/debugger/src/utils/pause/frames/tests/displayName.spec.js
new file mode 100644
index 0000000000..d969c18753
--- /dev/null
+++ b/devtools/client/debugger/src/utils/pause/frames/tests/displayName.spec.js
@@ -0,0 +1,129 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import {
+ formatCopyName,
+ formatDisplayName,
+ simplifyDisplayName,
+} from "../displayName";
+
+import { makeMockFrame, makeMockSource } from "../../../test-mockup";
+
+describe("formatCopyName", () => {
+ it("simple", () => {
+ const source = makeMockSource("todo-view.js");
+ const frame = makeMockFrame(undefined, source, undefined, 12, "child");
+
+ expect(formatCopyName(frame, L10N)).toEqual("child (todo-view.js#12)");
+ });
+});
+
+describe("formatting display names", () => {
+ it("uses a library description", () => {
+ const source = makeMockSource("assets/backbone.js");
+ const frame = {
+ ...makeMockFrame(undefined, source, undefined, undefined, "extend/child"),
+ library: "Backbone",
+ };
+
+ expect(formatDisplayName(frame, undefined, L10N)).toEqual("Create Class");
+ });
+
+ it("shortens an anonymous function", () => {
+ const source = makeMockSource("assets/bar.js");
+ const frame = makeMockFrame(
+ undefined,
+ source,
+ undefined,
+ undefined,
+ "extend/child/bar/baz"
+ );
+
+ expect(formatDisplayName(frame, undefined, L10N)).toEqual("baz");
+ });
+
+ it("does not truncates long function names", () => {
+ const source = makeMockSource("extend/child/bar/baz");
+ const frame = makeMockFrame(
+ undefined,
+ source,
+ undefined,
+ undefined,
+ "bazbazbazbazbazbazbazbazbazbazbazbazbaz"
+ );
+
+ expect(formatDisplayName(frame, undefined, L10N)).toEqual(
+ "bazbazbazbazbazbazbazbazbazbazbazbazbaz"
+ );
+ });
+
+ it("returns the original function name when present", () => {
+ const source = makeMockSource("entry.js");
+ const frame = {
+ ...makeMockFrame(undefined, source),
+ originalDisplayName: "originalFn",
+ displayName: "fn",
+ };
+
+ expect(formatDisplayName(frame, undefined, L10N)).toEqual("originalFn");
+ });
+
+ it("returns anonymous when displayName is undefined", () => {
+ const frame = { ...makeMockFrame(), displayName: undefined };
+ expect(formatDisplayName(frame, undefined, L10N)).toEqual("<anonymous>");
+ });
+
+ it("returns anonymous when displayName is null", () => {
+ const frame = { ...makeMockFrame(), displayName: null };
+ expect(formatDisplayName(frame, undefined, L10N)).toEqual("<anonymous>");
+ });
+
+ it("returns anonymous when displayName is an empty string", () => {
+ const frame = { ...makeMockFrame(), displayName: "" };
+ expect(formatDisplayName(frame, undefined, L10N)).toEqual("<anonymous>");
+ });
+});
+
+describe("simplifying display names", () => {
+ const cases = {
+ defaultCase: [["define", "define"]],
+
+ objectProperty: [
+ ["z.foz", "foz"],
+ ["z.foz/baz", "baz"],
+ ["z.foz/baz/y.bay", "bay"],
+ ["outer/x.fox.bax.nx", "nx"],
+ ["outer/fow.baw", "baw"],
+ ["fromYUI._attach", "_attach"],
+ ["Y.ClassNameManager</getClassName", "getClassName"],
+ ["orion.textview.TextView</addHandler", "addHandler"],
+ ["this.eventPool_.createObject", "createObject"],
+ ],
+
+ arrayProperty: [
+ ["this.eventPool_[createObject]", "createObject"],
+ ["jQuery.each(^)/jQuery.fn[o]", "o"],
+ ["viewport[get+D]", "get+D"],
+ ["arr[0]", "0"],
+ ],
+
+ functionProperty: [
+ ["fromYUI._attach/<.", "_attach"],
+ ["Y.ClassNameManager<", "ClassNameManager"],
+ ["fromExtJS.setVisible/cb<", "cb"],
+ ["fromDojo.registerWin/<", "registerWin"],
+ ],
+
+ annonymousProperty: [["jQuery.each(^)", "each"]],
+
+ privateMethod: [["#privateFunc", "#privateFunc"]],
+ };
+
+ Object.keys(cases).forEach(type => {
+ cases[type].forEach(([kase, expected]) => {
+ it(`${type} - ${kase}`, () =>
+ expect(simplifyDisplayName(kase)).toEqual(expected));
+ });
+ });
+});
diff --git a/devtools/client/debugger/src/utils/pause/frames/tests/getLibraryFromUrl.spec.js b/devtools/client/debugger/src/utils/pause/frames/tests/getLibraryFromUrl.spec.js
new file mode 100644
index 0000000000..ff5be43285
--- /dev/null
+++ b/devtools/client/debugger/src/utils/pause/frames/tests/getLibraryFromUrl.spec.js
@@ -0,0 +1,127 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { getLibraryFromUrl } from "../getLibraryFromUrl";
+import { makeMockFrameWithURL } from "../../../test-mockup";
+
+describe("getLibraryFromUrl", () => {
+ describe("When Preact is on the frame", () => {
+ it("should return Preact and not React", () => {
+ const frame = makeMockFrameWithURL(
+ "https://cdnjs.cloudflare.com/ajax/libs/preact/8.2.5/preact.js"
+ );
+ expect(getLibraryFromUrl(frame)).toEqual("Preact");
+ });
+ });
+
+ describe("When Vue is on the frame", () => {
+ it("should return VueJS for different builds", () => {
+ const buildTypeList = [
+ "vue.js",
+ "vue.common.js",
+ "vue.esm.js",
+ "vue.runtime.js",
+ "vue.runtime.common.js",
+ "vue.runtime.esm.js",
+ "vue.min.js",
+ "vue.runtime.min.js",
+ ];
+
+ buildTypeList.forEach(buildType => {
+ const frame = makeMockFrameWithURL(
+ `https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/${buildType}`
+ );
+ expect(getLibraryFromUrl(frame)).toEqual("VueJS");
+ });
+ });
+ });
+
+ describe("When React is in the URL", () => {
+ it("should not return React if it is not part of the filename", () => {
+ const notReactUrlList = [
+ "https://react.js.com/test.js",
+ "https://debugger-example.com/test.js",
+ "https://debugger-react-example.com/test.js",
+ "https://debugger-react-example.com/react/test.js",
+ "https://debugger-example.com/react-contextmenu.js",
+ ];
+ notReactUrlList.forEach(notReactUrl => {
+ const frame = makeMockFrameWithURL(notReactUrl);
+ expect(getLibraryFromUrl(frame)).toBeNull();
+ });
+ });
+ it("should return React if it is part of the filename", () => {
+ const reactUrlList = [
+ "https://debugger-example.com/react.js",
+ "https://debugger-example.com/react.development.js",
+ "https://debugger-example.com/react.production.min.js",
+ "https://debugger-react-example.com/react.js",
+ "https://debugger-react-example.com/react/react.js",
+ "https://debugger-example.com/react-dom.js",
+ "https://debugger-example.com/react-dom.development.js",
+ "https://debugger-example.com/react-dom.production.min.js",
+ "https://debugger-react-example.com/react-dom.js",
+ "https://debugger-react-example.com/react/react-dom.js",
+ "https://debugger-react-example.com/react-dom-dev.js",
+ "/node_modules/react/test.js",
+ "/node_modules/react-dev/test.js",
+ "/node_modules/react-dom/test.js",
+ "/node_modules/react-dom-dev/test.js",
+ ];
+ reactUrlList.forEach(reactUrl => {
+ const frame = makeMockFrameWithURL(reactUrl);
+ expect(getLibraryFromUrl(frame)).toEqual("React");
+ });
+ });
+ });
+
+ describe("When Angular is in the URL", () => {
+ it("should return Angular for AngularJS (1.x)", () => {
+ const frame = makeMockFrameWithURL(
+ "https://cdnjs.cloudflare.com/ajax/libs/angular/angular.js"
+ );
+ expect(getLibraryFromUrl(frame)).toEqual("Angular");
+ });
+
+ it("should return Angular for Angular (2.x)", () => {
+ const frame = makeMockFrameWithURL(
+ "https://stackblitz.io/turbo_modules/@angular/core@7.2.4/bundles/core.umd.js"
+ );
+ expect(getLibraryFromUrl(frame)).toEqual("Angular");
+ });
+
+ it("should not return Angular for Angular components", () => {
+ const frame = makeMockFrameWithURL(
+ "https://firefox-devtools-angular-log.stackblitz.io/~/src/app/hello.component.ts"
+ );
+ expect(getLibraryFromUrl(frame)).toBeNull();
+ });
+ });
+
+ describe("When zone.js is on the frame", () => {
+ it("should not return Angular when no callstack", () => {
+ const frame = makeMockFrameWithURL("/node_modules/zone/zone.js");
+ expect(getLibraryFromUrl(frame)).toBeNull();
+ });
+
+ it("should not return Angular when stack without Angular frames", () => {
+ const frame = makeMockFrameWithURL("/node_modules/zone/zone.js");
+ const callstack = [frame];
+
+ expect(getLibraryFromUrl(frame, callstack)).toBeNull();
+ });
+
+ it("should return Angular when stack with AngularJS (1.x) frames", () => {
+ const frame = makeMockFrameWithURL("/node_modules/zone/zone.js");
+ const callstack = [
+ frame,
+ makeMockFrameWithURL(
+ "https://cdnjs.cloudflare.com/ajax/libs/angular/angular.js"
+ ),
+ ];
+
+ expect(getLibraryFromUrl(frame, callstack)).toEqual("Angular");
+ });
+ });
+});
diff --git a/devtools/client/debugger/src/utils/pause/index.js b/devtools/client/debugger/src/utils/pause/index.js
new file mode 100644
index 0000000000..f6966999b0
--- /dev/null
+++ b/devtools/client/debugger/src/utils/pause/index.js
@@ -0,0 +1,5 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+export * from "./why";
diff --git a/devtools/client/debugger/src/utils/pause/mapScopes/README.md b/devtools/client/debugger/src/utils/pause/mapScopes/README.md
new file mode 100644
index 0000000000..2f65b8e847
--- /dev/null
+++ b/devtools/client/debugger/src/utils/pause/mapScopes/README.md
@@ -0,0 +1,191 @@
+# mapScopes
+
+The files in this directory manage the Devtools logic for taking the original
+JS file from the sourcemap and using the content, combined with source
+mappings, to provide an enhanced user experience for debugging the code.
+
+In this document, we'll refer to the files as either:
+
+* `original` - The code that the user wrote originally.
+* `generated` - The code actually executing in the engine, which may have been
+ transformed from the `original`, and if a bundler was used, may contain the
+ final output for several different `original` files.
+
+The enhancements implemented here break down into as two primary improvements:
+
+* Rendering the scopes as the user expects them, using the position in the
+ original file, rather than the content of the generated file.
+* Allowing users to interact with the code in the console as if it were the
+ original code, rather than the generated file.
+
+
+## Overall Approach
+
+The core goal of scope mapping is to parse the original and generated files,
+and then infer a correlation between the bindings in the original file,
+and the bindings in the generated file. This is correlation is done via the
+source mappings provided alongside the original code in the sourcemap.
+
+The overall steps break down into:
+
+
+### 1. Parsing
+
+First the generated and original files are parsed into ASTs, and then the ASTs
+are each traversed in order to generate a full picture of the scopes that are
+present in the file. This covers information for each binding in each scope,
+including all metadata about the declarations themselves, and all references
+to each of the bindings. The exact location of each binding reference is the
+most important factor because these will be used when working with sourcemaps.
+
+Importantly, this scope tree's structure also mirrors the structure of the
+scope data that the engine itself returns when paused.
+
+
+### 2. Generated Binding -> Grip Correlation
+
+When the engine pauses, we get back a full description of the current scope,
+as well as `grip` objects that can be used as proxy-like objects in order to
+access the actual values in the engine itself.
+
+With this data, along with the location where the engine is paused, we can
+use the AST-based scope information from step 1 to attach a line/column
+range to each `grip`. Using those mappings we have enough information to get
+the real engine value of any variable based on its position in the generated
+code, as long as it is in scope at the paused location in the generated file.
+
+The generated and engine scopes are correlated depth-first, because in some
+cases the scope data from the engine will be deeper that the data from the
+parsed code, meaning there are additional unknown parent scopes. This can
+happen, for instance, if the executing code is running inside of an `eval`
+since the parser only knows about the scopes inside of `eval`, and cannot
+know what context it is executed inside of.
+
+
+### 3. Original Binding -> Generated Binding Correlation
+
+Now that we can get the value of a generated location, we need to decide which
+generated location correlates with which original location. For each of
+the original bindings in each original scope, we iterate through the
+individual references to the binding in the file and:
+
+1. Use the sourcemap to convert the original location into a range on the
+ generated code.
+2. Filter the available bindings in the generated file down to those that
+ overlap with this generated range.
+3. Perform heuristics to decide if any of the bindings in the range appear
+ to be a valid and safe mapping.
+
+These steps allow us to build a datastructure that describes the scope
+as it is declared in the original file, while rendering the value using the
+`grip` objects, as returned from the engine itself.
+
+There is additional complexity here in the exact details of the heuristics
+mentioned above. See the later Heuristics sections diving into these details.
+
+During this phase, one additional task is performed, which is the construction
+of expressions that relate back to the original binding. After matching each
+binding in a range, we know the name of the binding in the original scope,
+and we _also_ know the name of the generated binding, or more generally the
+expression to evaluate in order to get the value of the original binding.
+
+These expression values are important for ensuring that the developer console
+is able to allow users to interact with the original code. If a user types
+a variable into the console, it can be translated into the expression
+correlated with that original variable, allowing the code to behave as it
+would have, were it actually part of the original file.
+
+
+### 4. Generate a Scope Tree
+
+The structure generated in step 3 is converted into a structure compatible
+with the standard scope data returned from the engine itself in order to allow
+for consistent usage of scope data, irrespective of the scope data source.
+This stage also re-attaches the global scope data, which is otherwise ignored
+during the correlation process.
+
+
+### 5. Validation
+
+As a simple form of validation, we ensure that a large percentage of bindings
+were actually resolved to a `grip` object. This offers some amount of
+protection, if the sourcemap itself turned out to be somewhat low-quality.
+
+This happens often with tooling that generates maps that simply map an original
+line to a generated line. While line-to-line mappings still enable step
+debugging, they do not provide enough information for original-scope mapping.
+
+On the other hand, generally line-to-line mappings are usually generated by
+tooling that performs minimal transformations on their own, so it is often
+acceptable to fall back to the engine-only generated-file scope data in this
+case.
+
+
+## Range Mapping Heuristics
+
+Since we know lots of information about the original bindings when performing
+matches, it is possible to make educated guesses about how their generated
+code will have likely been transformed. This allows us to perform more
+aggressive matching logic what would normally be too false-positive-heavy
+for generic use, when it is deemed safe enough.
+
+
+### Standard Matching
+
+In the general case, we iterate through the bindings that were found in the
+generated range, and consider it a match if the binding overlaps with the
+start of the range. One extra case here is that ranges at the start of
+a line often point to the first binding in a range and do not overlap the
+first binding, so there is special-casing for the first binding in each range.
+
+
+### ES6 Import Reference Special Case
+
+References to ES6 imports are often transformed into property accesses on objects
+in order to emulate the "live-binding" behavior defined by ES6. The standard
+logic here would end up always resolving the imported value to be the import
+namespace object itself, rather than reading the value of the property.
+
+To support this, specifically for ES6 imports, we walk outward from the matched
+binding itself, taking property accesses into account, as long as the
+property access itself is also within the mapped range.
+
+While decently effective, there are currently two downsides to this approach:
+
+* The "live" behavior of imports is often implemented using accessor
+ properties, which as of the time of this writing, cannot be evaluated to
+ retrieve their real value.
+* The "live" behavior of imports is sometimes implemented with function calls,
+ which also also cannot be evaluated, causing their value to be
+ unknown.
+
+
+### ES6 Import Declaration Special Case
+
+If there are no references to an imported value, or matching based on the
+reference failed, we fall back to a second case.
+
+ES6 import declarations themselves often map back to the location of the
+declaration of the imported module's namespace object. By getting the range for
+the import declaration itself, we can infer which generated binding is the
+namespace object. Alongside that, we already know the name of the property on
+the namespace itself because it is statically knowable by analyzing the
+import declaration.
+
+By combining both of those pieces of information, we can access the namespace's
+property to get the imported value.
+
+
+### Typescript Classes
+
+Typescript have several non-ideal ways in which they output source maps, most
+of which center around classes that are either exported, or decorated. These
+issues are currently tracked in [Typescript issue #22833][1].
+
+To work around this issue, we use a method similar to the import declaration
+case above. While the class name itself often maps to unhelpful locations,
+the class declaration itself generally maps to the class's transformed binding,
+so we make use of the class declaration location instead of the location of
+the class's declared name in these cases.
+
+ [1]: https://github.com/Microsoft/TypeScript/issues/22833
diff --git a/devtools/client/debugger/src/utils/pause/mapScopes/buildGeneratedBindingList.js b/devtools/client/debugger/src/utils/pause/mapScopes/buildGeneratedBindingList.js
new file mode 100644
index 0000000000..5f90138013
--- /dev/null
+++ b/devtools/client/debugger/src/utils/pause/mapScopes/buildGeneratedBindingList.js
@@ -0,0 +1,141 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { clientCommands } from "../../../client/firefox";
+
+import { locColumn } from "./locColumn";
+import { getOptimizedOutGrip } from "./optimizedOut";
+
+export function buildGeneratedBindingList(
+ scopes,
+ generatedAstScopes,
+ thisBinding
+) {
+ // The server's binding data doesn't include general 'this' binding
+ // information, so we manually inject the one 'this' binding we have into
+ // the normal binding data we are working with.
+ const frameThisOwner = generatedAstScopes.find(
+ generated => "this" in generated.bindings
+ );
+
+ let globalScope = null;
+ const clientScopes = [];
+ for (let s = scopes; s; s = s.parent) {
+ const bindings = s.bindings
+ ? Object.assign({}, ...s.bindings.arguments, s.bindings.variables)
+ : {};
+
+ clientScopes.push(bindings);
+ globalScope = s;
+ }
+
+ const generatedMainScopes = generatedAstScopes.slice(0, -2);
+ const generatedGlobalScopes = generatedAstScopes.slice(-2);
+
+ const clientMainScopes = clientScopes.slice(0, generatedMainScopes.length);
+ const clientGlobalScopes = clientScopes.slice(generatedMainScopes.length);
+
+ // Map the main parsed script body using the nesting hierarchy of the
+ // generated and client scopes.
+ const generatedBindings = generatedMainScopes.reduce((acc, generated, i) => {
+ const bindings = clientMainScopes[i];
+
+ if (generated === frameThisOwner && thisBinding) {
+ bindings.this = {
+ value: thisBinding,
+ };
+ }
+
+ for (const name of Object.keys(generated.bindings)) {
+ // If there is no 'this' value, we exclude the binding entirely.
+ // Otherwise it would pass through as found, but "(unscoped)", causing
+ // the search logic to stop with a match.
+ if (name === "this" && !bindings[name]) {
+ continue;
+ }
+
+ const { refs } = generated.bindings[name];
+ for (const loc of refs) {
+ acc.push({
+ name,
+ loc,
+ desc: () => Promise.resolve(bindings[name] || null),
+ });
+ }
+ }
+ return acc;
+ }, []);
+
+ // Bindings in the global/lexical global of the generated code may or
+ // may not be the real global if the generated code is running inside
+ // of an evaled context. To handle this, we just look up the client scope
+ // hierarchy to find the closest binding with that name.
+ for (const generated of generatedGlobalScopes) {
+ for (const name of Object.keys(generated.bindings)) {
+ const { refs } = generated.bindings[name];
+ const bindings = clientGlobalScopes.find(b => name in b);
+
+ for (const loc of refs) {
+ if (bindings) {
+ generatedBindings.push({
+ name,
+ loc,
+ desc: () => Promise.resolve(bindings[name]),
+ });
+ } else {
+ const globalGrip = globalScope?.object;
+ if (globalGrip) {
+ // Should always exist, just checking to keep Flow happy.
+
+ generatedBindings.push({
+ name,
+ loc,
+ desc: async () => {
+ const objectFront =
+ clientCommands.createObjectFront(globalGrip);
+ return (await objectFront.getProperty(name)).descriptor;
+ },
+ });
+ }
+ }
+ }
+ }
+ }
+
+ // Sort so we can binary-search.
+ return sortBindings(generatedBindings);
+}
+
+export function buildFakeBindingList(generatedAstScopes) {
+ // TODO if possible, inject real bindings for the global scope
+ const generatedBindings = generatedAstScopes.reduce((acc, generated) => {
+ for (const name of Object.keys(generated.bindings)) {
+ if (name === "this") {
+ continue;
+ }
+ const { refs } = generated.bindings[name];
+ for (const loc of refs) {
+ acc.push({
+ name,
+ loc,
+ desc: () => Promise.resolve(getOptimizedOutGrip()),
+ });
+ }
+ }
+ return acc;
+ }, []);
+ return sortBindings(generatedBindings);
+}
+
+function sortBindings(generatedBindings) {
+ return generatedBindings.sort((a, b) => {
+ const aStart = a.loc.start;
+ const bStart = b.loc.start;
+
+ if (aStart.line === bStart.line) {
+ return locColumn(aStart) - locColumn(bStart);
+ }
+ return aStart.line - bStart.line;
+ });
+}
diff --git a/devtools/client/debugger/src/utils/pause/mapScopes/filtering.js b/devtools/client/debugger/src/utils/pause/mapScopes/filtering.js
new file mode 100644
index 0000000000..dec3772e82
--- /dev/null
+++ b/devtools/client/debugger/src/utils/pause/mapScopes/filtering.js
@@ -0,0 +1,45 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+function findInsertionLocation(array, callback) {
+ let left = 0;
+ let right = array.length;
+ while (left < right) {
+ const mid = Math.floor((left + right) / 2);
+ const item = array[mid];
+
+ const result = callback(item);
+ if (result === 0) {
+ left = mid;
+ break;
+ }
+ if (result >= 0) {
+ right = mid;
+ } else {
+ left = mid + 1;
+ }
+ }
+
+ // Ensure the value is the start of any set of matches.
+ let i = left;
+ if (i < array.length) {
+ while (i >= 0 && callback(array[i]) >= 0) {
+ i--;
+ }
+ return i + 1;
+ }
+
+ return i;
+}
+
+export function filterSortedArray(array, callback) {
+ const start = findInsertionLocation(array, callback);
+
+ const results = [];
+ for (let i = start; i < array.length && callback(array[i]) === 0; i++) {
+ results.push(array[i]);
+ }
+
+ return results;
+}
diff --git a/devtools/client/debugger/src/utils/pause/mapScopes/findGeneratedBindingFromPosition.js b/devtools/client/debugger/src/utils/pause/mapScopes/findGeneratedBindingFromPosition.js
new file mode 100644
index 0000000000..6e833959f4
--- /dev/null
+++ b/devtools/client/debugger/src/utils/pause/mapScopes/findGeneratedBindingFromPosition.js
@@ -0,0 +1,305 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { locColumn } from "./locColumn";
+import { mappingContains } from "./mappingContains";
+
+// eslint-disable-next-line max-len
+
+import { clientCommands } from "../../../client/firefox";
+
+/**
+ * Given a mapped range over the generated source, attempt to resolve a real
+ * binding descriptor that can be used to access the value.
+ */
+export async function findGeneratedReference(applicableBindings) {
+ // We can adjust this number as we go, but these are a decent start as a
+ // general heuristic to assume the bindings were bad or just map a chunk of
+ // whole line or something.
+ if (applicableBindings.length > 4) {
+ // Babel's for..of generates at least 3 bindings inside one range for
+ // block-scoped loop variables, so we shouldn't go below that.
+ applicableBindings = [];
+ }
+
+ for (const applicable of applicableBindings) {
+ const result = await mapBindingReferenceToDescriptor(applicable);
+ if (result) {
+ return result;
+ }
+ }
+ return null;
+}
+
+export async function findGeneratedImportReference(applicableBindings) {
+ // When wrapped, for instance as `Object(ns.default)`, the `Object` binding
+ // will be the first in the list. To avoid resolving `Object` as the
+ // value of the import itself, we potentially skip the first binding.
+ applicableBindings = applicableBindings.filter((applicable, i) => {
+ if (
+ !applicable.firstInRange ||
+ applicable.binding.loc.type !== "ref" ||
+ applicable.binding.loc.meta
+ ) {
+ return true;
+ }
+
+ const next =
+ i + 1 < applicableBindings.length ? applicableBindings[i + 1] : null;
+
+ return !next || next.binding.loc.type !== "ref" || !next.binding.loc.meta;
+ });
+
+ // We can adjust this number as we go, but these are a decent start as a
+ // general heuristic to assume the bindings were bad or just map a chunk of
+ // whole line or something.
+ if (applicableBindings.length > 2) {
+ // Babel's for..of generates at least 3 bindings inside one range for
+ // block-scoped loop variables, so we shouldn't go below that.
+ applicableBindings = [];
+ }
+
+ for (const applicable of applicableBindings) {
+ const result = await mapImportReferenceToDescriptor(applicable);
+ if (result) {
+ return result;
+ }
+ }
+
+ return null;
+}
+
+/**
+ * Given a mapped range over the generated source and the name of the imported
+ * value that is referenced, attempt to resolve a binding descriptor for
+ * the import's value.
+ */
+export async function findGeneratedImportDeclaration(
+ applicableBindings,
+ importName
+) {
+ // We can adjust this number as we go, but these are a decent start as a
+ // general heuristic to assume the bindings were bad or just map a chunk of
+ // whole line or something.
+ if (applicableBindings.length > 10) {
+ // Import declarations tend to have a large number of bindings for
+ // for things like 'require' and 'interop', so this number is larger
+ // than other binding count checks.
+ applicableBindings = [];
+ }
+
+ let result = null;
+
+ for (const { binding } of applicableBindings) {
+ if (binding.loc.type === "ref") {
+ continue;
+ }
+
+ const namespaceDesc = await binding.desc();
+ if (isPrimitiveValue(namespaceDesc)) {
+ continue;
+ }
+ if (!isObjectValue(namespaceDesc)) {
+ // We want to handle cases like
+ //
+ // var _mod = require(...);
+ // var _mod2 = _interopRequire(_mod);
+ //
+ // where "_mod" is optimized out because it is only referenced once. To
+ // allow that, we track the optimized-out value as a possible result,
+ // but allow later binding values to overwrite the result.
+ result = {
+ name: binding.name,
+ desc: namespaceDesc,
+ expression: binding.name,
+ };
+ continue;
+ }
+
+ const desc = await readDescriptorProperty(namespaceDesc, importName);
+ const expression = `${binding.name}.${importName}`;
+
+ if (desc) {
+ result = {
+ name: binding.name,
+ desc,
+ expression,
+ };
+ break;
+ }
+ }
+
+ return result;
+}
+
+/**
+ * Given a generated binding, and a range over the generated code, statically
+ * check if the given binding matches the range.
+ */
+async function mapBindingReferenceToDescriptor({
+ binding,
+ range,
+ firstInRange,
+ firstOnLine,
+}) {
+ // Allow the mapping to point anywhere within the generated binding
+ // location to allow for less than perfect sourcemaps. Since you also
+ // need at least one character between identifiers, we also give one
+ // characters of space at the front the generated binding in order
+ // to increase the probability of finding the right mapping.
+ if (
+ range.start.line === binding.loc.start.line &&
+ // If a binding is the first on a line, Babel will extend the mapping to
+ // include the whitespace between the newline and the binding. To handle
+ // that, we skip the range requirement for starting location.
+ (firstInRange ||
+ firstOnLine ||
+ locColumn(range.start) >= locColumn(binding.loc.start)) &&
+ locColumn(range.start) <= locColumn(binding.loc.end)
+ ) {
+ return {
+ name: binding.name,
+ desc: await binding.desc(),
+ expression: binding.name,
+ };
+ }
+
+ return null;
+}
+
+/**
+ * Given an generated binding, and a range over the generated code, statically
+ * evaluate accessed properties within the mapped range to resolve the actual
+ * imported value.
+ */
+async function mapImportReferenceToDescriptor({ binding, range }) {
+ if (binding.loc.type !== "ref") {
+ return null;
+ }
+
+ // Expression matches require broader searching because sourcemaps usage
+ // varies in how they map certain things. For instance given
+ //
+ // import { bar } from "mod";
+ // bar();
+ //
+ // The "bar()" expression is generally expanded into one of two possibly
+ // forms, both of which map the "bar" identifier in different ways. See
+ // the "^^" markers below for the ranges.
+ //
+ // (0, foo.bar)() // Babel
+ // ^^^^^^^ // mapping
+ // ^^^ // binding
+ // vs
+ //
+ // __webpack_require__.i(foo.bar)() // Webpack 2
+ // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // mapping
+ // ^^^ // binding
+ // vs
+ //
+ // Object(foo.bar)() // Webpack >= 3
+ // ^^^^^^^^^^^^^^^ // mapping
+ // ^^^ // binding
+ //
+ // Unfortunately, Webpack also has a tendancy to over-map past the call
+ // expression to the start of the next line, at least when there isn't
+ // anything else on that line that is mapped, e.g.
+ //
+ // Object(foo.bar)()
+ // ^^^^^^^^^^^^^^^^^
+ // ^ // wrapped to column 0 of next line
+
+ if (!mappingContains(range, binding.loc)) {
+ return null;
+ }
+
+ // Webpack 2's import declarations wrap calls with an identity fn, so we
+ // need to make sure to skip that binding because it is mapped to the
+ // location of the original binding usage.
+ if (
+ binding.name === "__webpack_require__" &&
+ binding.loc.meta &&
+ binding.loc.meta.type === "member" &&
+ binding.loc.meta.property === "i"
+ ) {
+ return null;
+ }
+
+ let expression = binding.name;
+ let desc = await binding.desc();
+
+ if (binding.loc.type === "ref") {
+ const { meta } = binding.loc;
+
+ // Limit to 2 simple property or inherits operartions, since it would
+ // just be more work to search more and it is very unlikely that
+ // bindings would be mapped to more than a single member + inherits
+ // wrapper.
+ for (
+ let op = meta, index = 0;
+ op && mappingContains(range, op) && desc && index < 2;
+ index++, op = op?.parent
+ ) {
+ // Calling could potentially trigger side-effects, which would not
+ // be ideal for this case.
+ if (op.type === "call") {
+ return null;
+ }
+
+ if (op.type === "inherit") {
+ continue;
+ }
+
+ desc = await readDescriptorProperty(desc, op.property);
+ expression += `.${op.property}`;
+ }
+ }
+
+ return desc
+ ? {
+ name: binding.name,
+ desc,
+ expression,
+ }
+ : null;
+}
+
+function isPrimitiveValue(desc) {
+ return desc && (!desc.value || typeof desc.value !== "object");
+}
+function isObjectValue(desc) {
+ return (
+ desc &&
+ !isPrimitiveValue(desc) &&
+ desc.value.type === "object" &&
+ // Note: The check for `.type` might already cover the optimizedOut case
+ // but not 100% sure, so just being cautious.
+ !desc.value.optimizedOut
+ );
+}
+
+async function readDescriptorProperty(desc, property) {
+ if (!desc) {
+ return null;
+ }
+
+ if (typeof desc.value !== "object" || !desc.value) {
+ // If accessing a property on a primitive type, just return 'undefined'
+ // as the value.
+ return {
+ value: {
+ type: "undefined",
+ },
+ };
+ }
+
+ if (!isObjectValue(desc)) {
+ // If we got a non-primitive descriptor but it isn't an object, then
+ // it's definitely not the namespace and it is probably an error.
+ return desc;
+ }
+
+ const objectFront = clientCommands.createObjectFront(desc.value);
+ return (await objectFront.getProperty(property)).descriptor;
+}
diff --git a/devtools/client/debugger/src/utils/pause/mapScopes/getApplicableBindingsForOriginalPosition.js b/devtools/client/debugger/src/utils/pause/mapScopes/getApplicableBindingsForOriginalPosition.js
new file mode 100644
index 0000000000..c1a64ddfa0
--- /dev/null
+++ b/devtools/client/debugger/src/utils/pause/mapScopes/getApplicableBindingsForOriginalPosition.js
@@ -0,0 +1,112 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { positionCmp } from "./positionCmp";
+import { filterSortedArray } from "./filtering";
+import { mappingContains } from "./mappingContains";
+import { getGeneratedLocation } from "../../source-maps";
+
+export async function originalRangeStartsInside({ start, end }, thunkArgs) {
+ const endPosition = await getGeneratedLocation(end, thunkArgs);
+ const startPosition = await getGeneratedLocation(start, thunkArgs);
+
+ // If the start and end positions collapse into eachother, it means that
+ // the range in the original content didn't _start_ at the start position.
+ // Since this likely means that the range doesn't logically apply to this
+ // binding location, we skip it.
+ return positionCmp(startPosition, endPosition) !== 0;
+}
+
+export async function getApplicableBindingsForOriginalPosition(
+ generatedAstBindings,
+ source,
+ { start, end },
+ bindingType,
+ locationType,
+ thunkArgs
+) {
+ const { sourceMapLoader } = thunkArgs;
+ const ranges = await sourceMapLoader.getGeneratedRanges(start);
+
+ const resultRanges = ranges.map(mapRange => ({
+ start: {
+ line: mapRange.line,
+ column: mapRange.columnStart,
+ },
+ end: {
+ line: mapRange.line,
+ // SourceMapConsumer's 'lastColumn' is inclusive, so we add 1 to make
+ // it exclusive like all other locations.
+ column: mapRange.columnEnd + 1,
+ },
+ }));
+
+ // When searching for imports, we expand the range to up to the next available
+ // mapping to allow for import declarations that are composed of multiple
+ // variable statements, where the later ones are entirely unmapped.
+ // Babel 6 produces imports in this style, e.g.
+ //
+ // var _mod = require("mod"); // mapped from import statement
+ // var _mod2 = interop(_mod); // entirely unmapped
+ if (bindingType === "import" && locationType !== "ref") {
+ const endPosition = await getGeneratedLocation(end, thunkArgs);
+ const startPosition = await getGeneratedLocation(start, thunkArgs);
+
+ for (const range of resultRanges) {
+ if (
+ mappingContains(range, { start: startPosition, end: startPosition }) &&
+ positionCmp(range.end, endPosition) < 0
+ ) {
+ range.end = {
+ line: endPosition.line,
+ column: endPosition.column,
+ };
+ break;
+ }
+ }
+ }
+
+ return filterApplicableBindings(generatedAstBindings, resultRanges);
+}
+
+function filterApplicableBindings(bindings, ranges) {
+ const result = [];
+ for (const range of ranges) {
+ // Any binding overlapping a part of the mapping range.
+ const filteredBindings = filterSortedArray(bindings, binding => {
+ if (positionCmp(binding.loc.end, range.start) <= 0) {
+ return -1;
+ }
+ if (positionCmp(binding.loc.start, range.end) >= 0) {
+ return 1;
+ }
+
+ return 0;
+ });
+
+ let firstInRange = true;
+ let firstOnLine = true;
+ let line = -1;
+
+ for (const binding of filteredBindings) {
+ if (binding.loc.start.line === line) {
+ firstOnLine = false;
+ } else {
+ line = binding.loc.start.line;
+ firstOnLine = true;
+ }
+
+ result.push({
+ binding,
+ range,
+ firstOnLine,
+ firstInRange,
+ });
+
+ firstInRange = false;
+ }
+ }
+
+ return result;
+}
diff --git a/devtools/client/debugger/src/utils/pause/mapScopes/index.js b/devtools/client/debugger/src/utils/pause/mapScopes/index.js
new file mode 100644
index 0000000000..dbd99f8b11
--- /dev/null
+++ b/devtools/client/debugger/src/utils/pause/mapScopes/index.js
@@ -0,0 +1,586 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import {
+ debuggerToSourceMapLocation,
+ sourceMapToDebuggerLocation,
+} from "../../location";
+import { locColumn } from "./locColumn";
+import { loadRangeMetadata, findMatchingRange } from "./rangeMetadata";
+
+// eslint-disable-next-line max-len
+import {
+ findGeneratedReference,
+ findGeneratedImportReference,
+ findGeneratedImportDeclaration,
+} from "./findGeneratedBindingFromPosition";
+import {
+ buildGeneratedBindingList,
+ buildFakeBindingList,
+} from "./buildGeneratedBindingList";
+import {
+ originalRangeStartsInside,
+ getApplicableBindingsForOriginalPosition,
+} from "./getApplicableBindingsForOriginalPosition";
+import { getOptimizedOutGrip } from "./optimizedOut";
+
+import { log } from "../../log";
+
+// Create real location objects for all location start and end.
+//
+// Parser worker returns scopes with location having a sourceId
+// instead of a source object as it doesn't know about main thread source objects.
+function updateLocationsInScopes(state, scopes) {
+ for (const item of scopes) {
+ for (const name of Object.keys(item.bindings)) {
+ for (const ref of item.bindings[name].refs) {
+ const locs = [ref];
+ if (ref.type !== "ref") {
+ locs.push(ref.declaration);
+ }
+ for (const loc of locs) {
+ loc.start = sourceMapToDebuggerLocation(state, loc.start);
+ loc.end = sourceMapToDebuggerLocation(state, loc.end);
+ }
+ }
+ }
+ }
+}
+
+export async function buildMappedScopes(
+ source,
+ content,
+ frame,
+ generatedScopes,
+ thunkArgs
+) {
+ const { getState, parserWorker } = thunkArgs;
+ if (!parserWorker.isLocationSupported(frame.location)) {
+ return null;
+ }
+ const originalAstScopes = await parserWorker.getScopes(frame.location);
+ updateLocationsInScopes(getState(), originalAstScopes);
+ const generatedAstScopes = await parserWorker.getScopes(
+ frame.generatedLocation
+ );
+ updateLocationsInScopes(getState(), generatedAstScopes);
+
+ if (!originalAstScopes || !generatedAstScopes) {
+ return null;
+ }
+
+ const originalRanges = await loadRangeMetadata(
+ frame.location,
+ originalAstScopes,
+ thunkArgs
+ );
+
+ if (hasLineMappings(originalRanges)) {
+ // Fallback to generated scopes as there are no clear mappings to original scopes
+ // This means the scope variable names are likely the same for both the original
+ // generated sources.
+ return { scope: generatedScopes };
+ }
+
+ let generatedAstBindings;
+ if (generatedScopes) {
+ generatedAstBindings = buildGeneratedBindingList(
+ generatedScopes,
+ generatedAstScopes,
+ frame.this
+ );
+ } else {
+ generatedAstBindings = buildFakeBindingList(generatedAstScopes);
+ }
+
+ const { mappedOriginalScopes, expressionLookup } =
+ await mapOriginalBindingsToGenerated(
+ source,
+ content,
+ originalRanges,
+ originalAstScopes,
+ generatedAstBindings,
+ thunkArgs
+ );
+
+ const globalLexicalScope = generatedScopes
+ ? getGlobalFromScope(generatedScopes)
+ : generateGlobalFromAst(generatedAstScopes);
+ const mappedGeneratedScopes = generateClientScope(
+ globalLexicalScope,
+ mappedOriginalScopes
+ );
+
+ return isReliableScope(mappedGeneratedScopes)
+ ? { mappings: expressionLookup, scope: mappedGeneratedScopes }
+ : { scope: generatedScopes };
+}
+
+async function mapOriginalBindingsToGenerated(
+ source,
+ content,
+ originalRanges,
+ originalAstScopes,
+ generatedAstBindings,
+ thunkArgs
+) {
+ const expressionLookup = {};
+ const mappedOriginalScopes = [];
+
+ const cachedSourceMaps = batchScopeMappings(
+ originalAstScopes,
+ source,
+ thunkArgs
+ );
+ // Override sourceMapLoader attribute with the special cached SourceMapLoader instance
+ // in order to make it used by all functions used in this method.
+ thunkArgs = { ...thunkArgs, sourceMapLoader: cachedSourceMaps };
+
+ for (const item of originalAstScopes) {
+ const generatedBindings = {};
+
+ for (const name of Object.keys(item.bindings)) {
+ const binding = item.bindings[name];
+
+ const result = await findGeneratedBinding(
+ source,
+ content,
+ name,
+ binding,
+ originalRanges,
+ generatedAstBindings,
+ thunkArgs
+ );
+
+ if (result) {
+ generatedBindings[name] = result.grip;
+
+ if (
+ binding.refs.length !== 0 &&
+ // These are assigned depth-first, so we don't want shadowed
+ // bindings in parent scopes overwriting the expression.
+ !Object.prototype.hasOwnProperty.call(expressionLookup, name)
+ ) {
+ expressionLookup[name] = result.expression;
+ }
+ }
+ }
+
+ mappedOriginalScopes.push({
+ ...item,
+ generatedBindings,
+ });
+ }
+
+ return {
+ mappedOriginalScopes,
+ expressionLookup,
+ };
+}
+
+/**
+ * Consider a scope and its parents reliable if the vast majority of its
+ * bindings were successfully mapped to generated scope bindings.
+ */
+function isReliableScope(scope) {
+ let totalBindings = 0;
+ let unknownBindings = 0;
+
+ for (let s = scope; s; s = s.parent) {
+ const vars = s.bindings?.variables || {};
+ for (const key of Object.keys(vars)) {
+ const binding = vars[key];
+
+ totalBindings += 1;
+ if (
+ binding.value &&
+ typeof binding.value === "object" &&
+ (binding.value.type === "unscoped" || binding.value.type === "unmapped")
+ ) {
+ unknownBindings += 1;
+ }
+ }
+ }
+
+ // As determined by fair dice roll.
+ return totalBindings === 0 || unknownBindings / totalBindings < 0.25;
+}
+
+function hasLineMappings(ranges) {
+ return ranges.every(
+ range => range.columnStart === 0 && range.columnEnd === Infinity
+ );
+}
+
+/**
+ * Build a special SourceMapLoader instance, based on the one passed in thunkArgs,
+ * which will both:
+ * - preload generated ranges/locations for original locations mentioned
+ * in originalAstScopes
+ * - cache the requests to fetch these genereated ranges/locations
+ */
+function batchScopeMappings(originalAstScopes, source, thunkArgs) {
+ const { sourceMapLoader } = thunkArgs;
+ const precalculatedRanges = new Map();
+ const precalculatedLocations = new Map();
+
+ // Explicitly dispatch all of the sourcemap requests synchronously up front so
+ // that they will be batched into a single request for the worker to process.
+ for (const item of originalAstScopes) {
+ for (const name of Object.keys(item.bindings)) {
+ for (const ref of item.bindings[name].refs) {
+ const locs = [ref];
+ if (ref.type !== "ref") {
+ locs.push(ref.declaration);
+ }
+
+ for (const loc of locs) {
+ precalculatedRanges.set(
+ buildLocationKey(loc.start),
+ sourceMapLoader.getGeneratedRanges(
+ debuggerToSourceMapLocation(loc.start)
+ )
+ );
+ precalculatedLocations.set(
+ buildLocationKey(loc.start),
+ sourceMapLoader.getGeneratedLocation(
+ debuggerToSourceMapLocation(loc.start)
+ )
+ );
+ precalculatedLocations.set(
+ buildLocationKey(loc.end),
+ sourceMapLoader.getGeneratedLocation(
+ debuggerToSourceMapLocation(loc.end)
+ )
+ );
+ }
+ }
+ }
+ }
+
+ return {
+ async getGeneratedRanges(pos) {
+ const key = buildLocationKey(pos);
+
+ if (!precalculatedRanges.has(key)) {
+ log("Bad precalculated mapping");
+ return sourceMapLoader.getGeneratedRanges(
+ debuggerToSourceMapLocation(pos)
+ );
+ }
+ return precalculatedRanges.get(key);
+ },
+
+ async getGeneratedLocation(pos) {
+ const key = buildLocationKey(pos);
+
+ if (!precalculatedLocations.has(key)) {
+ log("Bad precalculated mapping");
+ return sourceMapLoader.getGeneratedLocation(
+ debuggerToSourceMapLocation(pos)
+ );
+ }
+ return precalculatedLocations.get(key);
+ },
+ };
+}
+function buildLocationKey(loc) {
+ return `${loc.line}:${locColumn(loc)}`;
+}
+
+function generateClientScope(globalLexicalScope, originalScopes) {
+ // Build a structure similar to the client's linked scope object using
+ // the original AST scopes, but pulling in the generated bindings
+ // linked to each scope.
+ const result = originalScopes
+ .slice(0, -2)
+ .reverse()
+ .reduce((acc, orig, i) => {
+ const {
+ // The 'this' binding data we have is handled independently, so
+ // the binding data is not included here.
+ // eslint-disable-next-line no-unused-vars
+ this: _this,
+ ...variables
+ } = orig.generatedBindings;
+
+ return {
+ parent: acc,
+ actor: `originalActor${i}`,
+ type: orig.type,
+ scopeKind: orig.scopeKind,
+ bindings: {
+ arguments: [],
+ variables,
+ },
+ ...(orig.type === "function"
+ ? {
+ function: {
+ displayName: orig.displayName,
+ },
+ }
+ : null),
+ ...(orig.type === "block"
+ ? {
+ block: {
+ displayName: orig.displayName,
+ },
+ }
+ : null),
+ };
+ }, globalLexicalScope);
+
+ // The rendering logic in getScope 'this' bindings only runs on the current
+ // selected frame scope, so we pluck out the 'this' binding that was mapped,
+ // and put it in a special location
+ const thisScope = originalScopes.find(scope => scope.bindings.this);
+ if (result.bindings && thisScope) {
+ result.bindings.this = thisScope.generatedBindings.this || null;
+ }
+
+ return result;
+}
+
+function getGlobalFromScope(scopes) {
+ // Pull the root object scope and root lexical scope to reuse them in
+ // our mapped scopes. This assumes that file being processed is
+ // a CommonJS or ES6 module, which might not be ideal. Potentially
+ // should add some logic to try to detect those cases?
+ let globalLexicalScope = null;
+ for (let s = scopes; s.parent; s = s.parent) {
+ globalLexicalScope = s;
+ }
+ if (!globalLexicalScope) {
+ throw new Error("Assertion failure - there should always be a scope");
+ }
+ return globalLexicalScope;
+}
+
+function generateGlobalFromAst(generatedScopes) {
+ const globalLexicalAst = generatedScopes[generatedScopes.length - 2];
+ if (!globalLexicalAst) {
+ throw new Error("Assertion failure - there should always be a scope");
+ }
+ return {
+ actor: "generatedActor1",
+ type: "block",
+ scopeKind: "",
+ bindings: {
+ arguments: [],
+ variables: Object.fromEntries(
+ Object.keys(globalLexicalAst).map(key => [key, getOptimizedOutGrip()])
+ ),
+ },
+ parent: {
+ actor: "generatedActor0",
+ object: getOptimizedOutGrip(),
+ scopeKind: "",
+ type: "object",
+ },
+ };
+}
+
+function hasValidIdent(range, pos) {
+ return (
+ range.type === "match" ||
+ // For declarations, we allow the range on the identifier to be a
+ // more general "contains" to increase the chances of a match.
+ (pos.type !== "ref" && range.type === "contains")
+ );
+}
+
+// eslint-disable-next-line complexity
+async function findGeneratedBinding(
+ source,
+ content,
+ name,
+ originalBinding,
+ originalRanges,
+ generatedAstBindings,
+ thunkArgs
+) {
+ // If there are no references to the implicits, then we have no way to
+ // even attempt to map it back to the original since there is no location
+ // data to use. Bail out instead of just showing it as unmapped.
+ if (
+ originalBinding.type === "implicit" &&
+ !originalBinding.refs.some(item => item.type === "ref")
+ ) {
+ return null;
+ }
+
+ const loadApplicableBindings = async (pos, locationType) => {
+ let applicableBindings = await getApplicableBindingsForOriginalPosition(
+ generatedAstBindings,
+ source,
+ pos,
+ originalBinding.type,
+ locationType,
+ thunkArgs
+ );
+ if (applicableBindings.length) {
+ hadApplicableBindings = true;
+ }
+ if (locationType === "ref") {
+ // Some tooling creates ranges that map a line as a whole, which is useful
+ // for step-debugging, but can easily lead to finding the wrong binding.
+ // To avoid these false-positives, we entirely ignore bindings matched
+ // by ranges that cover full lines.
+ applicableBindings = applicableBindings.filter(
+ ({ range }) =>
+ !(range.start.column === 0 && range.end.column === Infinity)
+ );
+ }
+ if (
+ locationType !== "ref" &&
+ !(await originalRangeStartsInside(pos, thunkArgs))
+ ) {
+ applicableBindings = [];
+ }
+ return applicableBindings;
+ };
+
+ const { refs } = originalBinding;
+
+ let hadApplicableBindings = false;
+ let genContent = null;
+ for (const pos of refs) {
+ const applicableBindings = await loadApplicableBindings(pos, pos.type);
+
+ const range = findMatchingRange(originalRanges, pos);
+ if (range && hasValidIdent(range, pos)) {
+ if (originalBinding.type === "import") {
+ genContent = await findGeneratedImportReference(applicableBindings);
+ } else {
+ genContent = await findGeneratedReference(applicableBindings);
+ }
+ }
+
+ if (
+ (pos.type === "class-decl" || pos.type === "class-inner") &&
+ content.contentType &&
+ content.contentType.match(/\/typescript/)
+ ) {
+ const declRange = findMatchingRange(originalRanges, pos.declaration);
+ if (declRange && declRange.type !== "multiple") {
+ const applicableDeclBindings = await loadApplicableBindings(
+ pos.declaration,
+ pos.type
+ );
+
+ // Resolve to first binding in the range
+ const declContent = await findGeneratedReference(
+ applicableDeclBindings
+ );
+
+ if (declContent) {
+ // Prefer the declaration mapping in this case because TS sometimes
+ // maps class declaration names to "export.Foo = Foo;" or to
+ // the decorator logic itself
+ genContent = declContent;
+ }
+ }
+ }
+
+ if (
+ !genContent &&
+ pos.type === "import-decl" &&
+ typeof pos.importName === "string"
+ ) {
+ const { importName } = pos;
+ const declRange = findMatchingRange(originalRanges, pos.declaration);
+
+ // The import declaration should have an original position mapping,
+ // but otherwise we don't really have preferences on the range type
+ // because it can have multiple bindings, but we do want to make sure
+ // that all of the bindings that match the range are part of the same
+ // import declaration.
+ if (declRange?.singleDeclaration) {
+ const applicableDeclBindings = await loadApplicableBindings(
+ pos.declaration,
+ pos.type
+ );
+
+ // match the import declaration location
+ genContent = await findGeneratedImportDeclaration(
+ applicableDeclBindings,
+ importName
+ );
+ }
+ }
+
+ if (genContent) {
+ break;
+ }
+ }
+
+ if (genContent && genContent.desc) {
+ return {
+ grip: genContent.desc,
+ expression: genContent.expression,
+ };
+ } else if (genContent) {
+ // If there is no descriptor for 'this', then this is not the top-level
+ // 'this' that the server gave us a binding for, and we can just ignore it.
+ if (name === "this") {
+ return null;
+ }
+
+ // If the location is found but the descriptor is not, then it
+ // means that the server scope information didn't match the scope
+ // information from the DevTools parsed scopes.
+ return {
+ grip: {
+ configurable: false,
+ enumerable: true,
+ writable: false,
+ value: {
+ type: "unscoped",
+ unscoped: true,
+
+ // HACK: Until support for "unscoped" lands in devtools-reps,
+ // this will make these show as (unavailable).
+ missingArguments: true,
+ },
+ },
+ expression: null,
+ };
+ } else if (!hadApplicableBindings && name !== "this") {
+ // If there were no applicable bindings to consider while searching for
+ // matching bindings, then the source map for this file didn't make any
+ // attempt to map the binding, and that most likely means that the
+ // code was entirely emitted from the output code.
+ return {
+ grip: getOptimizedOutGrip(),
+ expression: `
+ (() => {
+ throw new Error('"' + ${JSON.stringify(
+ name
+ )} + '" has been optimized out.');
+ })()
+ `,
+ };
+ }
+
+ // If no location mapping is found, then the map is bad, or
+ // the map is okay but it original location is inside
+ // of some scope, but the generated location is outside, leading
+ // us to search for bindings that don't technically exist.
+ return {
+ grip: {
+ configurable: false,
+ enumerable: true,
+ writable: false,
+ value: {
+ type: "unmapped",
+ unmapped: true,
+
+ // HACK: Until support for "unmapped" lands in devtools-reps,
+ // this will make these show as (unavailable).
+ missingArguments: true,
+ },
+ },
+ expression: null,
+ };
+}
diff --git a/devtools/client/debugger/src/utils/pause/mapScopes/locColumn.js b/devtools/client/debugger/src/utils/pause/mapScopes/locColumn.js
new file mode 100644
index 0000000000..075e902299
--- /dev/null
+++ b/devtools/client/debugger/src/utils/pause/mapScopes/locColumn.js
@@ -0,0 +1,13 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+export function locColumn(loc) {
+ if (typeof loc.column !== "number") {
+ // This shouldn't really happen with locations from the AST, but
+ // the datatype we are using allows null/undefined column.
+ return 0;
+ }
+
+ return loc.column;
+}
diff --git a/devtools/client/debugger/src/utils/pause/mapScopes/mappingContains.js b/devtools/client/debugger/src/utils/pause/mapScopes/mappingContains.js
new file mode 100644
index 0000000000..ca82fe42ec
--- /dev/null
+++ b/devtools/client/debugger/src/utils/pause/mapScopes/mappingContains.js
@@ -0,0 +1,12 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { positionCmp } from "./positionCmp";
+
+export function mappingContains(mapped, item) {
+ return (
+ positionCmp(item.start, mapped.start) >= 0 &&
+ positionCmp(item.end, mapped.end) <= 0
+ );
+}
diff --git a/devtools/client/debugger/src/utils/pause/mapScopes/moz.build b/devtools/client/debugger/src/utils/pause/mapScopes/moz.build
new file mode 100644
index 0000000000..05f2b7e3d8
--- /dev/null
+++ b/devtools/client/debugger/src/utils/pause/mapScopes/moz.build
@@ -0,0 +1,19 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DIRS += []
+
+CompiledModules(
+ "buildGeneratedBindingList.js",
+ "filtering.js",
+ "findGeneratedBindingFromPosition.js",
+ "getApplicableBindingsForOriginalPosition.js",
+ "index.js",
+ "locColumn.js",
+ "mappingContains.js",
+ "optimizedOut.js",
+ "positionCmp.js",
+ "rangeMetadata.js",
+)
diff --git a/devtools/client/debugger/src/utils/pause/mapScopes/optimizedOut.js b/devtools/client/debugger/src/utils/pause/mapScopes/optimizedOut.js
new file mode 100644
index 0000000000..755b308a2d
--- /dev/null
+++ b/devtools/client/debugger/src/utils/pause/mapScopes/optimizedOut.js
@@ -0,0 +1,15 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+export function getOptimizedOutGrip() {
+ return {
+ configurable: false,
+ enumerable: true,
+ writable: false,
+ value: {
+ type: "null",
+ optimizedOut: true,
+ },
+ };
+}
diff --git a/devtools/client/debugger/src/utils/pause/mapScopes/positionCmp.js b/devtools/client/debugger/src/utils/pause/mapScopes/positionCmp.js
new file mode 100644
index 0000000000..5d53fb933e
--- /dev/null
+++ b/devtools/client/debugger/src/utils/pause/mapScopes/positionCmp.js
@@ -0,0 +1,24 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { locColumn } from "./locColumn";
+
+/**
+ * * === 0 - Positions are equal.
+ * * < 0 - first position before second position
+ * * > 0 - first position after second position
+ */
+export function positionCmp(p1, p2) {
+ if (p1.line === p2.line) {
+ const l1 = locColumn(p1);
+ const l2 = locColumn(p2);
+
+ if (l1 === l2) {
+ return 0;
+ }
+ return l1 < l2 ? -1 : 1;
+ }
+
+ return p1.line < p2.line ? -1 : 1;
+}
diff --git a/devtools/client/debugger/src/utils/pause/mapScopes/rangeMetadata.js b/devtools/client/debugger/src/utils/pause/mapScopes/rangeMetadata.js
new file mode 100644
index 0000000000..7e04c34e35
--- /dev/null
+++ b/devtools/client/debugger/src/utils/pause/mapScopes/rangeMetadata.js
@@ -0,0 +1,117 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { locColumn } from "./locColumn";
+import { positionCmp } from "./positionCmp";
+import { filterSortedArray } from "./filtering";
+
+// * match - Range contains a single identifier with matching start location
+// * contains - Range contains a single identifier with non-matching start
+// * multiple - Range contains multiple identifiers
+// * empty - Range contains no identifiers
+
+export async function loadRangeMetadata(
+ location,
+ originalAstScopes,
+ { sourceMapLoader }
+) {
+ const originalRanges = await sourceMapLoader.getOriginalRanges(
+ location.source.id
+ );
+
+ const sortedOriginalAstBindings = [];
+ for (const item of originalAstScopes) {
+ for (const name of Object.keys(item.bindings)) {
+ for (const ref of item.bindings[name].refs) {
+ sortedOriginalAstBindings.push(ref);
+ }
+ }
+ }
+ sortedOriginalAstBindings.sort((a, b) => positionCmp(a.start, b.start));
+
+ let i = 0;
+
+ return originalRanges.map(range => {
+ const bindings = [];
+
+ while (
+ i < sortedOriginalAstBindings.length &&
+ (sortedOriginalAstBindings[i].start.line < range.line ||
+ (sortedOriginalAstBindings[i].start.line === range.line &&
+ locColumn(sortedOriginalAstBindings[i].start) < range.columnStart))
+ ) {
+ i++;
+ }
+
+ while (
+ i < sortedOriginalAstBindings.length &&
+ sortedOriginalAstBindings[i].start.line === range.line &&
+ locColumn(sortedOriginalAstBindings[i].start) >= range.columnStart &&
+ locColumn(sortedOriginalAstBindings[i].start) < range.columnEnd
+ ) {
+ const lastBinding = bindings[bindings.length - 1];
+ // Only add bindings when they're in new positions
+ if (
+ !lastBinding ||
+ positionCmp(lastBinding.start, sortedOriginalAstBindings[i].start) !== 0
+ ) {
+ bindings.push(sortedOriginalAstBindings[i]);
+ }
+ i++;
+ }
+
+ let type = "empty";
+ let singleDeclaration = true;
+ if (bindings.length === 1) {
+ const binding = bindings[0];
+ if (
+ binding.start.line === range.line &&
+ binding.start.column === range.columnStart
+ ) {
+ type = "match";
+ } else {
+ type = "contains";
+ }
+ } else if (bindings.length > 1) {
+ type = "multiple";
+ const binding = bindings[0];
+ const declStart =
+ binding.type !== "ref" ? binding.declaration.start : null;
+
+ singleDeclaration = bindings.every(b => {
+ return (
+ declStart &&
+ b.type !== "ref" &&
+ positionCmp(declStart, b.declaration.start) === 0
+ );
+ });
+ }
+
+ return {
+ type,
+ singleDeclaration,
+ ...range,
+ };
+ });
+}
+
+export function findMatchingRange(sortedOriginalRanges, bindingRange) {
+ return filterSortedArray(sortedOriginalRanges, range => {
+ if (range.line < bindingRange.start.line) {
+ return -1;
+ }
+ if (range.line > bindingRange.start.line) {
+ return 1;
+ }
+
+ if (range.columnEnd <= locColumn(bindingRange.start)) {
+ return -1;
+ }
+ if (range.columnStart > locColumn(bindingRange.start)) {
+ return 1;
+ }
+
+ return 0;
+ }).pop();
+}
diff --git a/devtools/client/debugger/src/utils/pause/moz.build b/devtools/client/debugger/src/utils/pause/moz.build
new file mode 100644
index 0000000000..db8b733274
--- /dev/null
+++ b/devtools/client/debugger/src/utils/pause/moz.build
@@ -0,0 +1,15 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DIRS += [
+ "frames",
+ "mapScopes",
+]
+
+CompiledModules(
+ "index.js",
+ "scopes.js",
+ "why.js",
+)
diff --git a/devtools/client/debugger/src/utils/pause/scopes.js b/devtools/client/debugger/src/utils/pause/scopes.js
new file mode 100644
index 0000000000..bdb53ba493
--- /dev/null
+++ b/devtools/client/debugger/src/utils/pause/scopes.js
@@ -0,0 +1,283 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// This file contains utility functions which supports the structure & display of
+// scopes information in Scopes panel.
+
+import { objectInspector } from "devtools/client/shared/components/reps/index";
+import { simplifyDisplayName } from "../pause/frames/index";
+
+const {
+ utils: {
+ node: { NODE_TYPES },
+ },
+} = objectInspector;
+
+// The heading that should be displayed for the scope
+function _getScopeTitle(type, scope) {
+ if (type === "block" && scope.block && scope.block.displayName) {
+ return scope.block.displayName;
+ }
+
+ if (type === "function" && scope.function) {
+ return scope.function.displayName
+ ? simplifyDisplayName(scope.function.displayName)
+ : L10N.getStr("anonymousFunction");
+ }
+ return L10N.getStr("scopes.block");
+}
+
+function _getThisVariable(this_, path) {
+ if (!this_) {
+ return null;
+ }
+
+ return {
+ name: "<this>",
+ path: `${path}/<this>`,
+ contents: { value: this_ },
+ };
+}
+
+/**
+ * Builds a tree of nodes representing all the variables and arguments
+ * for the bindings from a scope.
+ *
+ * Each binding => { variables: Array, arguments: Array }
+ * Each binding argument => [name: string, contents: BindingContents]
+ *
+ * @param {Array} bindings
+ * @param {String} parentName
+ * @returns
+ */
+function _getBindingVariables(bindings, parentName) {
+ if (!bindings) {
+ return [];
+ }
+
+ const nodes = [];
+ const addNode = (name, contents) =>
+ nodes.push({ name, contents, path: `${parentName}/${name}` });
+
+ for (const arg of bindings.arguments) {
+ // `arg` is an object which only has a single property whose name is the name of the
+ // argument. So here we can directly pick the first (and only) entry of `arg`
+ const [name, contents] = Object.entries(arg)[0];
+ addNode(name, contents);
+ }
+
+ for (const name in bindings.variables) {
+ addNode(name, bindings.variables[name]);
+ }
+
+ return nodes;
+}
+
+/**
+ * This generates the scope item for rendering in the scopes panel.
+ *
+ * @param {*} scope
+ * @param {*} selectedFrame
+ * @param {*} frameScopes
+ * @param {*} why
+ * @param {*} scopeIndex
+ * @returns
+ */
+function _getScopeItem(scope, selectedFrame, frameScopes, why, scopeIndex) {
+ const { type, actor } = scope;
+
+ const isLocalScope = scope.actor === frameScopes.actor;
+
+ const key = `${actor}-${scopeIndex}`;
+ if (type === "function" || type === "block") {
+ const { bindings } = scope;
+
+ let vars = _getBindingVariables(bindings, key);
+
+ // show exception, return, and this variables in innermost scope
+ if (isLocalScope) {
+ vars = vars.concat(_getFrameExceptionOrReturnedValueVariables(why, key));
+
+ let thisDesc_ = selectedFrame.this;
+
+ if (bindings && "this" in bindings) {
+ // The presence of "this" means we're rendering a "this" binding
+ // generated from mapScopes and this can override the binding
+ // provided by the current frame.
+ thisDesc_ = bindings.this ? bindings.this.value : null;
+ }
+
+ const this_ = _getThisVariable(thisDesc_, key);
+
+ if (this_) {
+ vars.push(this_);
+ }
+ }
+
+ if (vars?.length) {
+ const title = _getScopeTitle(type, scope) || "";
+ vars.sort((a, b) => a.name.localeCompare(b.name));
+ return {
+ name: title,
+ path: key,
+ contents: vars,
+ type: NODE_TYPES.BLOCK,
+ };
+ }
+ } else if (type === "object" && scope.object) {
+ let value = scope.object;
+ // If this is the global window scope, mark it as such so that it will
+ // preview Window: Global instead of Window: Window
+ if (value.class === "Window") {
+ value = { ...value, displayClass: "Global" };
+ }
+ return {
+ name: scope.object.class,
+ path: key,
+ contents: { value },
+ };
+ }
+
+ return null;
+}
+/**
+ * Merge the scope bindings for lexical scopes and its parent function body scopes
+ * Note: block scopes are not merged. See browser_dbg-merge-scopes.js for test examples
+ * to better understand the scenario,
+ *
+ * @param {*} scope
+ * @param {*} parentScope
+ * @param {*} item
+ * @param {*} parentItem
+ * @returns
+ */
+export function _mergeLexicalScopesBindings(
+ scope,
+ parentScope,
+ item,
+ parentItem
+) {
+ if (scope.scopeKind == "function lexical" && parentScope.type == "function") {
+ const contents = item.contents.concat(parentItem.contents);
+ contents.sort((a, b) => a.name.localeCompare(b.name));
+
+ return {
+ name: parentItem.name,
+ path: parentItem.path,
+ contents,
+ type: NODE_TYPES.BLOCK,
+ };
+ }
+ return null;
+}
+
+/**
+ * Returns a string path for an scope item which can be used
+ * in different pauses for a thread.
+ *
+ * @param {Object} item
+ * @returns
+ */
+
+export function getScopeItemPath(item) {
+ // Calling toString() on item.path allows symbols to be handled.
+ return item.path.toString();
+}
+
+// Generate variables when the function throws an exception or returned a value.
+function _getFrameExceptionOrReturnedValueVariables(why, path) {
+ const vars = [];
+
+ if (why && why.frameFinished) {
+ const { frameFinished } = why;
+
+ // Always display a `throw` property if present, even if it is falsy.
+ if (Object.prototype.hasOwnProperty.call(frameFinished, "throw")) {
+ vars.push({
+ name: "<exception>",
+ path: `${path}/<exception>`,
+ contents: { value: frameFinished.throw },
+ });
+ }
+
+ if (Object.prototype.hasOwnProperty.call(frameFinished, "return")) {
+ const returned = frameFinished.return;
+
+ // Do not display undefined. Do display falsy values like 0 and false. The
+ // protocol grip for undefined is a JSON object: { type: "undefined" }.
+ if (typeof returned !== "object" || returned.type !== "undefined") {
+ vars.push({
+ name: "<return>",
+ path: `${path}/<return>`,
+ contents: { value: returned },
+ });
+ }
+ }
+ }
+
+ return vars;
+}
+
+/**
+ * Generates the scope items (for scopes related to selected frame) to be rendered in the scope panel
+ * @param {*} why
+ * @param {*} selectedFrame
+ * @param {*} frameScopes
+ * @returns
+ */
+export function getScopesItemsForSelectedFrame(
+ why,
+ selectedFrame,
+ frameScopes
+) {
+ if (!why || !selectedFrame) {
+ return null;
+ }
+
+ if (!frameScopes) {
+ return null;
+ }
+
+ const scopes = [];
+
+ let currentScope = frameScopes;
+ let currentScopeIndex = 1;
+
+ let prevScope = null,
+ prevScopeItem = null;
+
+ while (currentScope) {
+ let currentScopeItem = _getScopeItem(
+ currentScope,
+ selectedFrame,
+ frameScopes,
+ why,
+ currentScopeIndex
+ );
+
+ if (currentScopeItem) {
+ const mergedItem =
+ prevScope && prevScopeItem
+ ? _mergeLexicalScopesBindings(
+ prevScope,
+ currentScope,
+ prevScopeItem,
+ currentScopeItem
+ )
+ : null;
+ if (mergedItem) {
+ currentScopeItem = mergedItem;
+ scopes.pop();
+ }
+ scopes.push(currentScopeItem);
+ }
+
+ prevScope = currentScope;
+ prevScopeItem = currentScopeItem;
+ currentScopeIndex++;
+ currentScope = currentScope.parent;
+ }
+
+ return scopes;
+}
diff --git a/devtools/client/debugger/src/utils/pause/tests/scopes.spec.js b/devtools/client/debugger/src/utils/pause/tests/scopes.spec.js
new file mode 100644
index 0000000000..08ac425774
--- /dev/null
+++ b/devtools/client/debugger/src/utils/pause/tests/scopes.spec.js
@@ -0,0 +1,150 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { getScopesItemsForSelectedFrame } from "../scopes";
+import {
+ makeMockFrame,
+ makeMockScope,
+ makeWhyNormal,
+ makeWhyThrow,
+ mockScopeAddVariable,
+} from "../../test-mockup";
+
+function convertScope(scope) {
+ return scope;
+}
+
+describe("scopes", () => {
+ describe("getScopes", () => {
+ it("single scope", () => {
+ const pauseData = makeWhyNormal();
+ const scope = makeMockScope("actor1");
+ const selectedFrame = makeMockFrame(undefined, undefined, scope);
+
+ if (!selectedFrame.scope) {
+ throw new Error("Frame must include scopes");
+ }
+
+ const frameScopes = convertScope(selectedFrame.scope);
+ const scopes = getScopesItemsForSelectedFrame(
+ pauseData,
+ selectedFrame,
+ frameScopes
+ );
+ if (!scopes) {
+ throw new Error("missing scopes");
+ }
+ expect(scopes[0].path).toEqual("actor1-1");
+ expect(scopes[0].contents[0]).toEqual({
+ name: "<this>",
+ path: "actor1-1/<this>",
+ contents: { value: {} },
+ });
+ });
+
+ it("second scope", () => {
+ const pauseData = makeWhyNormal();
+ const scope0 = makeMockScope("actor2");
+ const scope1 = makeMockScope("actor1", undefined, scope0);
+ const selectedFrame = makeMockFrame(undefined, undefined, scope1);
+ mockScopeAddVariable(scope0, "foo");
+
+ if (!selectedFrame.scope) {
+ throw new Error("Frame must include scopes");
+ }
+
+ const frameScopes = convertScope(selectedFrame.scope);
+ const scopes = getScopesItemsForSelectedFrame(
+ pauseData,
+ selectedFrame,
+ frameScopes
+ );
+ if (!scopes) {
+ throw new Error("missing scopes");
+ }
+ expect(scopes[1].path).toEqual("actor2-2");
+ expect(scopes[1].contents[0]).toEqual({
+ name: "foo",
+ path: "actor2-2/foo",
+ contents: { value: null },
+ });
+ });
+
+ it("returning scope", () => {
+ const why = makeWhyNormal("to sender");
+ const scope = makeMockScope("actor1");
+ const selectedFrame = makeMockFrame(undefined, undefined, scope);
+
+ if (!selectedFrame.scope) {
+ throw new Error("Frame must include scopes");
+ }
+
+ const frameScopes = convertScope(selectedFrame.scope);
+ const scopes = getScopesItemsForSelectedFrame(
+ why,
+ selectedFrame,
+ frameScopes
+ );
+ expect(scopes).toMatchObject([
+ {
+ path: "actor1-1",
+ contents: [
+ {
+ name: "<return>",
+ path: "actor1-1/<return>",
+ contents: {
+ value: "to sender",
+ },
+ },
+ {
+ name: "<this>",
+ path: "actor1-1/<this>",
+ contents: {
+ value: {},
+ },
+ },
+ ],
+ },
+ ]);
+ });
+
+ it("throwing scope", () => {
+ const why = makeWhyThrow("a party");
+ const scope = makeMockScope("actor1");
+ const selectedFrame = makeMockFrame(undefined, undefined, scope);
+
+ if (!selectedFrame.scope) {
+ throw new Error("Frame must include scopes");
+ }
+
+ const frameScopes = convertScope(selectedFrame.scope);
+ const scopes = getScopesItemsForSelectedFrame(
+ why,
+ selectedFrame,
+ frameScopes
+ );
+ expect(scopes).toMatchObject([
+ {
+ path: "actor1-1",
+ contents: [
+ {
+ name: "<exception>",
+ path: "actor1-1/<exception>",
+ contents: {
+ value: "a party",
+ },
+ },
+ {
+ name: "<this>",
+ path: "actor1-1/<this>",
+ contents: {
+ value: {},
+ },
+ },
+ ],
+ },
+ ]);
+ });
+ });
+});
diff --git a/devtools/client/debugger/src/utils/pause/why.js b/devtools/client/debugger/src/utils/pause/why.js
new file mode 100644
index 0000000000..115d94873b
--- /dev/null
+++ b/devtools/client/debugger/src/utils/pause/why.js
@@ -0,0 +1,40 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { DEBUGGER_PAUSED_REASONS_L10N_MAPPING } from "devtools/shared/constants";
+
+export function getPauseReason(why) {
+ if (!why) {
+ return null;
+ }
+
+ const reasonType = why.type;
+ if (!DEBUGGER_PAUSED_REASONS_L10N_MAPPING[reasonType]) {
+ console.log("Please file an issue: reasonType=", reasonType);
+ }
+
+ return DEBUGGER_PAUSED_REASONS_L10N_MAPPING[reasonType];
+}
+
+export function isException(why) {
+ return why?.type === "exception";
+}
+
+export function isInterrupted(why) {
+ return why?.type === "interrupted";
+}
+
+export function inDebuggerEval(why) {
+ if (
+ why &&
+ why.type === "exception" &&
+ why.exception &&
+ why.exception.preview &&
+ why.exception.preview.fileName
+ ) {
+ return why.exception.preview.fileName === "debugger eval code";
+ }
+
+ return false;
+}
diff --git a/devtools/client/debugger/src/utils/prefs.js b/devtools/client/debugger/src/utils/prefs.js
new file mode 100644
index 0000000000..287f3f8cc7
--- /dev/null
+++ b/devtools/client/debugger/src/utils/prefs.js
@@ -0,0 +1,170 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+const { PrefsHelper } = require("resource://devtools/client/shared/prefs.js");
+
+import { isNode } from "./environment";
+
+// Schema version to bump when the async store format has changed incompatibly
+// and old stores should be cleared.
+const prefsSchemaVersion = 11;
+const { pref } = Services;
+
+if (isNode()) {
+ pref("devtools.debugger.logging", false);
+ pref("devtools.debugger.alphabetize-outline", false);
+ pref("devtools.debugger.auto-pretty-print", false);
+ pref("devtools.source-map.client-service.enabled", true);
+ pref("devtools.chrome.enabled", false);
+ pref("devtools.debugger.pause-on-debugger-statement", true);
+ pref("devtools.debugger.pause-on-exceptions", false);
+ pref("devtools.debugger.pause-on-caught-exceptions", false);
+ pref("devtools.debugger.ignore-caught-exceptions", true);
+ pref("devtools.debugger.call-stack-visible", true);
+ pref("devtools.debugger.scopes-visible", true);
+ pref("devtools.debugger.threads-visible", true);
+ pref("devtools.debugger.expressions-visible", false);
+ pref("devtools.debugger.xhr-breakpoints-visible", false);
+ pref("devtools.debugger.breakpoints-visible", true);
+ pref("devtools.debugger.event-listeners-visible", false);
+ pref("devtools.debugger.dom-mutation-breakpoints-visible", false);
+ pref("devtools.debugger.start-panel-collapsed", false);
+ pref("devtools.debugger.end-panel-collapsed", false);
+ pref("devtools.debugger.start-panel-size", 300);
+ pref("devtools.debugger.end-panel-size", 300);
+ pref("devtools.debugger.ui.editor-wrapping", false);
+ pref("devtools.debugger.ui.framework-grouping-on", true);
+ pref("devtools.debugger.pending-selected-location", "{}");
+ pref("devtools.debugger.expressions", "[]");
+ pref("devtools.debugger.search-options", "{}");
+ pref("devtools.debugger.project-directory-root", "");
+ pref("devtools.debugger.map-scopes-enabled", false);
+ pref("devtools.debugger.prefs-schema-version", prefsSchemaVersion);
+ pref("devtools.debugger.skip-pausing", false);
+ pref("devtools.debugger.log-actions", true);
+ pref("devtools.debugger.log-event-breakpoints", false);
+ pref("devtools.debugger.javascript-tracing-log-method", "console");
+ pref("devtools.debugger.javascript-tracing-values", false);
+ pref("devtools.debugger.javascript-tracing-on-next-interaction", false);
+ pref("devtools.debugger.javascript-tracing-on-next-load", false);
+ pref("devtools.debugger.javascript-tracing-function-return", false);
+ pref("devtools.debugger.hide-ignored-sources", false);
+ pref("devtools.debugger.source-map-ignore-list-enabled", true);
+ pref("devtools.debugger.features.wasm", true);
+ pref("devtools.debugger.features.code-folding", false);
+ pref("devtools.debugger.features.autocomplete-expressions", false);
+ pref("devtools.debugger.features.map-expression-bindings", true);
+ pref("devtools.debugger.features.map-await-expression", true);
+ pref("devtools.debugger.features.log-points", true);
+ pref("devtools.debugger.features.inline-preview", true);
+ pref("devtools.debugger.features.javascript-tracing", false);
+ pref("devtools.debugger.features.codemirror-next", false);
+ pref("devtools.editor.tabsize", 2);
+ pref("devtools.editor.expandtab", false);
+ pref("devtools.editor.autoclosebrackets", false);
+}
+
+export const prefs = new PrefsHelper("devtools", {
+ logging: ["Bool", "debugger.logging"],
+ editorWrapping: ["Bool", "debugger.ui.editor-wrapping"],
+ alphabetizeOutline: ["Bool", "debugger.alphabetize-outline"],
+ autoPrettyPrint: ["Bool", "debugger.auto-pretty-print"],
+ clientSourceMapsEnabled: ["Bool", "source-map.client-service.enabled"],
+ chromeAndExtensionsEnabled: ["Bool", "chrome.enabled"],
+ pauseOnDebuggerStatement: ["Bool", "debugger.pause-on-debugger-statement"],
+ pauseOnExceptions: ["Bool", "debugger.pause-on-exceptions"],
+ pauseOnCaughtExceptions: ["Bool", "debugger.pause-on-caught-exceptions"],
+ ignoreCaughtExceptions: ["Bool", "debugger.ignore-caught-exceptions"],
+ callStackVisible: ["Bool", "debugger.call-stack-visible"],
+ scopesVisible: ["Bool", "debugger.scopes-visible"],
+ threadsVisible: ["Bool", "debugger.threads-visible"],
+ breakpointsVisible: ["Bool", "debugger.breakpoints-visible"],
+ expressionsVisible: ["Bool", "debugger.expressions-visible"],
+ xhrBreakpointsVisible: ["Bool", "debugger.xhr-breakpoints-visible"],
+ eventListenersVisible: ["Bool", "debugger.event-listeners-visible"],
+ domMutationBreakpointsVisible: [
+ "Bool",
+ "debugger.dom-mutation-breakpoints-visible",
+ ],
+ startPanelCollapsed: ["Bool", "debugger.start-panel-collapsed"],
+ endPanelCollapsed: ["Bool", "debugger.end-panel-collapsed"],
+ startPanelSize: ["Int", "debugger.start-panel-size"],
+ endPanelSize: ["Int", "debugger.end-panel-size"],
+ frameworkGroupingOn: ["Bool", "debugger.ui.framework-grouping-on"],
+ pendingSelectedLocation: ["Json", "debugger.pending-selected-location", {}],
+ expressions: ["Json", "debugger.expressions", []],
+ searchOptions: ["Json", "debugger.search-options"],
+ debuggerPrefsSchemaVersion: ["Int", "debugger.prefs-schema-version"],
+ projectDirectoryRoot: ["Char", "debugger.project-directory-root", ""],
+ projectDirectoryRootName: [
+ "Char",
+ "debugger.project-directory-root-name",
+ "",
+ ],
+ skipPausing: ["Bool", "debugger.skip-pausing"],
+ mapScopes: ["Bool", "debugger.map-scopes-enabled"],
+ logActions: ["Bool", "debugger.log-actions"],
+ logEventBreakpoints: ["Bool", "debugger.log-event-breakpoints"],
+ indentSize: ["Int", "editor.tabsize"],
+ javascriptTracingLogMethod: [
+ "String",
+ "debugger.javascript-tracing-log-method",
+ ],
+ javascriptTracingValues: ["Bool", "debugger.javascript-tracing-values"],
+ javascriptTracingOnNextInteraction: [
+ "Bool",
+ "debugger.javascript-tracing-on-next-interaction",
+ ],
+ javascriptTracingOnNextLoad: [
+ "Bool",
+ "debugger.javascript-tracing-on-next-load",
+ ],
+ javascriptTracingFunctionReturn: [
+ "Bool",
+ "debugger.javascript-tracing-function-return",
+ ],
+ hideIgnoredSources: ["Bool", "debugger.hide-ignored-sources"],
+ sourceMapIgnoreListEnabled: [
+ "Bool",
+ "debugger.source-map-ignore-list-enabled",
+ ],
+});
+
+// The pref may not be defined. Defaulting to null isn't viable (cursor never blinks).
+// Can't use CodeMirror.defaults here because it's loaded later.
+// Hardcode the fallback value to that of CodeMirror.defaults.cursorBlinkRate.
+prefs.cursorBlinkRate = Services.prefs.getIntPref("ui.caretBlinkTime", 530);
+
+export const features = new PrefsHelper("devtools.debugger.features", {
+ wasm: ["Bool", "wasm"],
+ outline: ["Bool", "outline"],
+ codeFolding: ["Bool", "code-folding"],
+ autocompleteExpression: ["Bool", "autocomplete-expressions"],
+ mapExpressionBindings: ["Bool", "map-expression-bindings"],
+ mapAwaitExpression: ["Bool", "map-await-expression"],
+ logPoints: ["Bool", "log-points"],
+ inlinePreview: ["Bool", "inline-preview"],
+ windowlessServiceWorkers: ["Bool", "windowless-service-workers"],
+ javascriptTracing: ["Bool", "javascript-tracing"],
+ codemirrorNext: ["Bool", "codemirror-next"],
+});
+
+// Import the asyncStore already spawned by the TargetMixin class
+const ThreadUtils = require("resource://devtools/client/shared/thread-utils.js");
+export const asyncStore = ThreadUtils.asyncStore;
+
+export function resetSchemaVersion() {
+ prefs.debuggerPrefsSchemaVersion = prefsSchemaVersion;
+}
+
+export function verifyPrefSchema() {
+ if (prefs.debuggerPrefsSchemaVersion < prefsSchemaVersion) {
+ asyncStore.pendingBreakpoints = {};
+ asyncStore.tabs = [];
+ asyncStore.xhrBreakpoints = [];
+ asyncStore.eventListenerBreakpoints = undefined;
+ asyncStore.blackboxedRanges = {};
+ prefs.debuggerPrefsSchemaVersion = prefsSchemaVersion;
+ }
+}
diff --git a/devtools/client/debugger/src/utils/preview.js b/devtools/client/debugger/src/utils/preview.js
new file mode 100644
index 0000000000..48b9d2bc98
--- /dev/null
+++ b/devtools/client/debugger/src/utils/preview.js
@@ -0,0 +1,7 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+export function isConsole(expression) {
+ return /^console/.test(expression);
+}
diff --git a/devtools/client/debugger/src/utils/quick-open.js b/devtools/client/debugger/src/utils/quick-open.js
new file mode 100644
index 0000000000..e2624559bc
--- /dev/null
+++ b/devtools/client/debugger/src/utils/quick-open.js
@@ -0,0 +1,113 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { endTruncateStr } from "./utils";
+import {
+ getFilename,
+ getSourceClassnames,
+ getSourceQueryString,
+ getRelativeUrl,
+} from "./source";
+
+export const MODIFIERS = {
+ "@": "functions",
+ "#": "variables",
+ ":": "goto",
+ "?": "shortcuts",
+};
+
+export function parseQuickOpenQuery(query) {
+ const startsWithModifier =
+ query[0] === "@" ||
+ query[0] === "#" ||
+ query[0] === ":" ||
+ query[0] === "?";
+
+ if (startsWithModifier) {
+ const modifier = query[0];
+ return MODIFIERS[modifier];
+ }
+
+ const isGotoSource = query.includes(":", 1);
+
+ if (isGotoSource) {
+ return "gotoSource";
+ }
+
+ return "sources";
+}
+
+export function parseLineColumn(query) {
+ const [, line, column] = query.split(":");
+ const lineNumber = parseInt(line, 10);
+ const columnNumber = parseInt(column, 10);
+ if (isNaN(lineNumber)) {
+ return null;
+ }
+ if (isNaN(columnNumber)) {
+ return { line: lineNumber };
+ }
+ // columnNumber here is the user input value which is 1-based.
+ // Whereas in location objects, line is 1-based, and column is 0-based.
+ return {
+ line: lineNumber,
+ column: columnNumber - 1,
+ };
+}
+
+export function formatSourceForList(
+ source,
+ hasTabOpened,
+ isBlackBoxed,
+ projectDirectoryRoot
+) {
+ const title = getFilename(source);
+ const relativeUrlWithQuery = `${getRelativeUrl(
+ source,
+ projectDirectoryRoot
+ )}${getSourceQueryString(source) || ""}`;
+ const subtitle = endTruncateStr(relativeUrlWithQuery, 100);
+ const value = relativeUrlWithQuery;
+ return {
+ value,
+ title,
+ subtitle,
+ icon: hasTabOpened
+ ? "tab result-item-icon"
+ : `result-item-icon ${getSourceClassnames(source, null, isBlackBoxed)}`,
+ id: source.id,
+ url: source.url,
+ source,
+ };
+}
+
+export function formatSymbol(symbol) {
+ return {
+ id: `${symbol.name}:${symbol.location.start.line}`,
+ title: symbol.name,
+ subtitle: `${symbol.location.start.line}`,
+ value: symbol.name,
+ location: symbol.location,
+ };
+}
+
+export function formatShortcutResults() {
+ return [
+ {
+ value: L10N.getStr("symbolSearch.search.functionsPlaceholder.title"),
+ title: `@ ${L10N.getStr("symbolSearch.search.functionsPlaceholder")}`,
+ id: "@",
+ },
+ {
+ value: L10N.getStr("symbolSearch.search.variablesPlaceholder.title"),
+ title: `# ${L10N.getStr("symbolSearch.search.variablesPlaceholder")}`,
+ id: "#",
+ },
+ {
+ value: L10N.getStr("gotoLineModal.title"),
+ title: `: ${L10N.getStr("gotoLineModal.placeholder")}`,
+ id: ":",
+ },
+ ];
+}
diff --git a/devtools/client/debugger/src/utils/result-list.js b/devtools/client/debugger/src/utils/result-list.js
new file mode 100644
index 0000000000..c8fe97ade6
--- /dev/null
+++ b/devtools/client/debugger/src/utils/result-list.js
@@ -0,0 +1,26 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+export function scrollList(resultList, index) {
+ if (!resultList.hasOwnProperty(index)) {
+ return;
+ }
+
+ const resultEl = resultList[index];
+
+ const scroll = () => {
+ // Avoid expensive DOM computations involved in scrollIntoView
+ // https://nolanlawson.com/2018/09/25/accurately-measuring-layout-on-the-web/
+ requestAnimationFrame(() => {
+ setTimeout(() => {
+ if (!resultEl.scrollIntoView) {
+ return;
+ }
+ resultEl.scrollIntoView({ block: "nearest", behavior: "auto" });
+ });
+ });
+ };
+
+ scroll();
+}
diff --git a/devtools/client/debugger/src/utils/selected-location.js b/devtools/client/debugger/src/utils/selected-location.js
new file mode 100644
index 0000000000..628186ff22
--- /dev/null
+++ b/devtools/client/debugger/src/utils/selected-location.js
@@ -0,0 +1,15 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+export function getSelectedLocation(mappedLocation, context) {
+ if (!context) {
+ return mappedLocation.location;
+ }
+
+ // `context` may be a location or directly a source object.
+ const source = context.source || context;
+ return source.isOriginal
+ ? mappedLocation.location
+ : mappedLocation.generatedLocation;
+}
diff --git a/devtools/client/debugger/src/utils/shallow-equal.js b/devtools/client/debugger/src/utils/shallow-equal.js
new file mode 100644
index 0000000000..f75430f476
--- /dev/null
+++ b/devtools/client/debugger/src/utils/shallow-equal.js
@@ -0,0 +1,51 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Shallow equal will consider equal:
+ * - exact same values (strict '===' equality)
+ * - distinct array instances having the exact same values in them (same number and strict equality).
+ * - distinct object instances having the exact same attributes and values.
+ *
+ * It will typically consider different array and object whose values
+ * aren't strictly equal. You may consider using "deep equality" checks for this scenario.
+ */
+export function shallowEqual(value, other) {
+ if (value === other) {
+ return true;
+ }
+
+ if (Array.isArray(value) && Array.isArray(other)) {
+ return arrayShallowEqual(value, other);
+ }
+
+ if (isObject(value) && isObject(other)) {
+ return objectShallowEqual(value, other);
+ }
+
+ return false;
+}
+
+export function arrayShallowEqual(value, other) {
+ // Redo this check in case we are called directly from the selectors.
+ if (value === other) {
+ return true;
+ }
+ return value.length === other.length && value.every((k, i) => k === other[i]);
+}
+
+function objectShallowEqual(value, other) {
+ const existingKeys = Object.keys(other);
+ const keys = Object.keys(value);
+
+ return (
+ keys.length === existingKeys.length &&
+ keys.every((k, i) => k === existingKeys[i]) &&
+ keys.every(k => value[k] === other[k])
+ );
+}
+
+function isObject(value) {
+ return typeof value === "object" && !!value;
+}
diff --git a/devtools/client/debugger/src/utils/source-maps.js b/devtools/client/debugger/src/utils/source-maps.js
new file mode 100644
index 0000000000..7a77639522
--- /dev/null
+++ b/devtools/client/debugger/src/utils/source-maps.js
@@ -0,0 +1,122 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import {
+ debuggerToSourceMapLocation,
+ sourceMapToDebuggerLocation,
+} from "./location";
+import { waitForSourceToBeRegisteredInStore } from "../client/firefox/create";
+
+/**
+ * For any location, return the matching generated location.
+ * If this is already a generated location, returns the same location.
+ *
+ * In additional to `SourceMapLoader.getGeneratedLocation`,
+ * this asserts that the related source is still registered in the reducer current state.
+ *
+ * @param {Object} location
+ * @param {Object} thunkArgs
+ * Redux action thunk arguments
+ * @param {Object}
+ * The matching generated location.
+ */
+export async function getGeneratedLocation(location, thunkArgs) {
+ if (!location.source.isOriginal) {
+ return location;
+ }
+
+ const { sourceMapLoader, getState } = thunkArgs;
+ const generatedLocation = await sourceMapLoader.getGeneratedLocation(
+ debuggerToSourceMapLocation(location)
+ );
+ if (!generatedLocation) {
+ return location;
+ }
+
+ return sourceMapToDebuggerLocation(getState(), generatedLocation);
+}
+
+/**
+ * For any location, return the matching original location.
+ * If this is already an original location, returns the same location.
+ *
+ * In additional to `SourceMapLoader.getOriginalLocation`,
+ * this automatically fetches the original source object in order to build
+ * the original location object.
+ *
+ * @param {Object} location
+ * @param {Object} thunkArgs
+ * Redux action thunk arguments
+ * @param {Object} options
+ * @param {boolean} options.waitForSource
+ * Default to false. If true is passed, this function will
+ * ensure waiting, possibly asynchronously for the related original source
+ * to be registered in the redux store.
+ * @param {boolean} options.looseSearch
+ * Default to false. If true, this won't query an exact mapping,
+ * but will also lookup for a loose match at the first column and next lines.
+ *
+ * @param {Object}
+ * The matching original location.
+ */
+export async function getOriginalLocation(
+ location,
+ thunkArgs,
+ { waitForSource = false, looseSearch = false } = {}
+) {
+ if (location.source.isOriginal) {
+ return location;
+ }
+ const { getState, sourceMapLoader } = thunkArgs;
+ const originalLocation = await sourceMapLoader.getOriginalLocation(
+ debuggerToSourceMapLocation(location),
+ { looseSearch }
+ );
+ if (!originalLocation) {
+ return location;
+ }
+
+ // When we are mapping frames while being paused,
+ // the original source may not be registered yet in the reducer.
+ if (waitForSource) {
+ await waitForSourceToBeRegisteredInStore(originalLocation.sourceId);
+ }
+
+ return sourceMapToDebuggerLocation(getState(), originalLocation);
+}
+
+export async function getMappedLocation(location, thunkArgs) {
+ if (location.source.isOriginal) {
+ const generatedLocation = await getGeneratedLocation(location, thunkArgs);
+ return { location, generatedLocation };
+ }
+
+ const generatedLocation = location;
+ const originalLocation = await getOriginalLocation(
+ generatedLocation,
+ thunkArgs
+ );
+
+ return { location: originalLocation, generatedLocation };
+}
+
+/**
+ * Gets the "mapped location".
+ *
+ * If the passed location is on a generated source, it gets the
+ * related location in the original source.
+ * If the passed location is on an original source, it gets the
+ * related location in the generated source.
+ */
+export async function getRelatedMapLocation(location, thunkArgs) {
+ if (!location.source) {
+ return location;
+ }
+
+ if (location.source.isOriginal) {
+ return getGeneratedLocation(location, thunkArgs);
+ }
+
+ return getOriginalLocation(location, thunkArgs);
+}
diff --git a/devtools/client/debugger/src/utils/source-queue.js b/devtools/client/debugger/src/utils/source-queue.js
new file mode 100644
index 0000000000..3b11b0616d
--- /dev/null
+++ b/devtools/client/debugger/src/utils/source-queue.js
@@ -0,0 +1,40 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+const { throttle } = require("resource://devtools/shared/throttle.js");
+
+// This SourceQueue module is now only used for source mapped sources
+let newOriginalQueuedSources;
+let queuedOriginalSources;
+let currentWork;
+
+async function dispatchNewSources() {
+ const sources = queuedOriginalSources;
+ if (!sources.length) {
+ return;
+ }
+ queuedOriginalSources = [];
+ currentWork = await newOriginalQueuedSources(sources);
+}
+
+const queue = throttle(dispatchNewSources, 100);
+
+export default {
+ initialize: actions => {
+ newOriginalQueuedSources = actions.newOriginalSources;
+ queuedOriginalSources = [];
+ },
+ queueOriginalSources: sources => {
+ if (sources.length) {
+ queuedOriginalSources.push(...sources);
+ queue();
+ }
+ },
+
+ flush: () => Promise.all([queue.flush(), currentWork]),
+ clear: () => {
+ queuedOriginalSources = [];
+ queue.cancel();
+ },
+};
diff --git a/devtools/client/debugger/src/utils/source.js b/devtools/client/debugger/src/utils/source.js
new file mode 100644
index 0000000000..31920453eb
--- /dev/null
+++ b/devtools/client/debugger/src/utils/source.js
@@ -0,0 +1,534 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Utils for working with Source URLs
+ * @module utils/source
+ */
+
+const {
+ getUnicodeUrl,
+} = require("resource://devtools/client/shared/unicode-url.js");
+const {
+ micromatch,
+} = require("resource://devtools/client/shared/vendor/micromatch/micromatch.js");
+
+import { getRelativePath } from "../utils/sources-tree/utils";
+import { endTruncateStr } from "./utils";
+import { truncateMiddleText } from "../utils/text";
+import { parse as parseURL } from "../utils/url";
+import { memoizeLast } from "../utils/memoizeLast";
+import { renderWasmText } from "./wasm";
+import { toEditorLine } from "./editor/index";
+export { isMinified } from "./isMinified";
+
+import { isFulfilled } from "./async-value";
+
+export const sourceTypes = {
+ coffee: "coffeescript",
+ js: "javascript",
+ jsx: "react",
+ ts: "typescript",
+ tsx: "typescript",
+ vue: "vue",
+};
+
+export const javascriptLikeExtensions = new Set(["marko", "es6", "vue", "jsm"]);
+
+function getPath(source) {
+ const { path } = source.displayURL;
+ let lastIndex = path.lastIndexOf("/");
+ let nextToLastIndex = path.lastIndexOf("/", lastIndex - 1);
+
+ const result = [];
+ do {
+ result.push(path.slice(nextToLastIndex + 1, lastIndex));
+ lastIndex = nextToLastIndex;
+ nextToLastIndex = path.lastIndexOf("/", lastIndex - 1);
+ } while (lastIndex !== nextToLastIndex);
+
+ result.push("");
+
+ return result;
+}
+
+export function shouldBlackbox(source) {
+ if (!source) {
+ return false;
+ }
+
+ if (!source.url) {
+ return false;
+ }
+
+ return true;
+}
+
+/**
+ * Checks if the frame is within a line ranges which are blackboxed
+ * in the source.
+ *
+ * @param {Object} frame
+ * The current frame
+ * @param {Object} blackboxedRanges
+ * The currently blackboxedRanges for all the sources.
+ * @param {Boolean} isFrameBlackBoxed
+ * If the frame is within the blackboxed range
+ * or not.
+ */
+export function isFrameBlackBoxed(frame, blackboxedRanges) {
+ const { source } = frame.location;
+ return (
+ !!blackboxedRanges[source.url] &&
+ (!blackboxedRanges[source.url].length ||
+ !!findBlackBoxRange(source, blackboxedRanges, {
+ start: frame.location.line,
+ end: frame.location.line,
+ }))
+ );
+}
+
+/**
+ * Checks if a blackbox range exist for the line range.
+ * That is if any start and end lines overlap any of the
+ * blackbox ranges
+ *
+ * @param {Object} source
+ * The current selected source
+ * @param {Object} blackboxedRanges
+ * The store of blackboxedRanges
+ * @param {Object} lineRange
+ * The start/end line range `{ start: <Number>, end: <Number> }`
+ * @return {Object} blackboxRange
+ * The first matching blackbox range that all or part of the
+ * specified lineRange sits within.
+ */
+export function findBlackBoxRange(source, blackboxedRanges, lineRange) {
+ const ranges = blackboxedRanges[source.url];
+ if (!ranges || !ranges.length) {
+ return null;
+ }
+
+ return ranges.find(
+ range =>
+ (lineRange.start >= range.start.line &&
+ lineRange.start <= range.end.line) ||
+ (lineRange.end >= range.start.line && lineRange.end <= range.end.line)
+ );
+}
+
+/**
+ * Checks if a source line is blackboxed
+ * @param {Array} ranges - Line ranges that are blackboxed
+ * @param {Number} line
+ * @param {Boolean} isSourceOnIgnoreList - is the line in a source that is on
+ * the sourcemap ignore lists then the line is blackboxed.
+ * @returns boolean
+ */
+export function isLineBlackboxed(ranges, line, isSourceOnIgnoreList) {
+ if (isSourceOnIgnoreList) {
+ return true;
+ }
+
+ if (!ranges) {
+ return false;
+ }
+ // If the whole source is ignored , then the line is
+ // ignored.
+ if (!ranges.length) {
+ return true;
+ }
+ return !!ranges.find(
+ range => line >= range.start.line && line <= range.end.line
+ );
+}
+
+/**
+ * Returns true if the specified url and/or content type are specific to
+ * javascript files.
+ *
+ * @return boolean
+ * True if the source is likely javascript.
+ *
+ * @memberof utils/source
+ * @static
+ */
+export function isJavaScript(source, content) {
+ const extension = source.displayURL.fileExtension;
+ const contentType = content.type === "wasm" ? null : content.contentType;
+ return (
+ javascriptLikeExtensions.has(extension) ||
+ !!(contentType && contentType.includes("javascript"))
+ );
+}
+
+/**
+ * @memberof utils/source
+ * @static
+ */
+export function isPretty(source) {
+ return isPrettyURL(source.url);
+}
+
+export function isPrettyURL(url) {
+ return url ? url.endsWith(":formatted") : false;
+}
+
+/**
+ * @memberof utils/source
+ * @static
+ */
+export function getPrettySourceURL(url) {
+ if (!url) {
+ url = "";
+ }
+ return `${url}:formatted`;
+}
+
+/**
+ * @memberof utils/source
+ * @static
+ */
+export function getRawSourceURL(url) {
+ return url && url.endsWith(":formatted")
+ ? url.slice(0, -":formatted".length)
+ : url;
+}
+
+function resolveFileURL(
+ url,
+ transformUrl = initialUrl => initialUrl,
+ truncate = true
+) {
+ url = getRawSourceURL(url || "");
+ const name = transformUrl(url);
+ if (!truncate) {
+ return name;
+ }
+ return endTruncateStr(name, 50);
+}
+
+export function getFormattedSourceId(id) {
+ return id.substring(id.lastIndexOf("/") + 1);
+}
+
+/**
+ * Gets a readable filename from a source URL for display purposes.
+ * If the source does not have a URL, the source ID will be returned instead.
+ *
+ * @memberof utils/source
+ * @static
+ */
+export function getFilename(
+ source,
+ rawSourceURL = getRawSourceURL(source.url)
+) {
+ const { id } = source;
+ if (!rawSourceURL) {
+ return getFormattedSourceId(id);
+ }
+
+ const { filename } = source.displayURL;
+ return getRawSourceURL(filename);
+}
+
+/**
+ * Provides a middle-trunated filename
+ *
+ * @memberof utils/source
+ * @static
+ */
+export function getTruncatedFileName(source, querystring = "", length = 30) {
+ return truncateMiddleText(`${getFilename(source)}${querystring}`, length);
+}
+
+/* Gets path for files with same filename for editor tabs, breakpoints, etc.
+ * Pass the source, and list of other sources
+ *
+ * @memberof utils/source
+ * @static
+ */
+
+export function getDisplayPath(mySource, sources) {
+ const rawSourceURL = getRawSourceURL(mySource.url);
+ const filename = getFilename(mySource, rawSourceURL);
+
+ // Find sources that have the same filename, but different paths
+ // as the original source
+ const similarSources = sources.filter(source => {
+ const rawSource = getRawSourceURL(source.url);
+ return (
+ rawSourceURL != rawSource && filename == getFilename(source, rawSource)
+ );
+ });
+
+ if (!similarSources.length) {
+ return undefined;
+ }
+
+ // get an array of source path directories e.g. ['a/b/c.html'] => [['b', 'a']]
+ const paths = new Array(similarSources.length + 1);
+
+ paths[0] = getPath(mySource);
+ for (let i = 0; i < similarSources.length; ++i) {
+ paths[i + 1] = getPath(similarSources[i]);
+ }
+
+ // create an array of similar path directories and one dis-similar directory
+ // for example [`a/b/c.html`, `a1/b/c.html`] => ['b', 'a']
+ // where 'b' is the similar directory and 'a' is the dis-similar directory.
+ let displayPath = "";
+ for (let i = 0; i < paths[0].length; i++) {
+ let similar = false;
+ for (let k = 1; k < paths.length; ++k) {
+ if (paths[k][i] === paths[0][i]) {
+ similar = true;
+ break;
+ }
+ }
+
+ displayPath = paths[0][i] + (i !== 0 ? "/" : "") + displayPath;
+
+ if (!similar) {
+ break;
+ }
+ }
+
+ return displayPath;
+}
+
+/**
+ * Gets a readable source URL for display purposes.
+ * If the source does not have a URL, the source ID will be returned instead.
+ *
+ * @memberof utils/source
+ * @static
+ */
+export function getFileURL(source, truncate = true) {
+ const { url, id } = source;
+ if (!url) {
+ return getFormattedSourceId(id);
+ }
+
+ return resolveFileURL(url, getUnicodeUrl, truncate);
+}
+
+export function getSourcePath(url) {
+ if (!url) {
+ return "";
+ }
+
+ const { path, href } = parseURL(url);
+ // for URLs like "about:home" the path is null so we pass the full href
+ return path || href;
+}
+
+/**
+ * Returns amount of lines in the source. If source is a WebAssembly binary,
+ * the function returns amount of bytes.
+ */
+export function getSourceLineCount(content) {
+ if (content.type === "wasm") {
+ const { binary } = content.value;
+ return binary.length;
+ }
+
+ let count = 0;
+
+ for (let i = 0; i < content.value.length; ++i) {
+ if (content.value[i] === "\n") {
+ ++count;
+ }
+ }
+
+ return count + 1;
+}
+
+export function isInlineScript(source) {
+ return source.introductionType === "scriptElement";
+}
+
+function getNthLine(str, lineNum) {
+ let startIndex = -1;
+
+ let newLinesFound = 0;
+ while (newLinesFound < lineNum) {
+ const nextIndex = str.indexOf("\n", startIndex + 1);
+ if (nextIndex === -1) {
+ return null;
+ }
+ startIndex = nextIndex;
+ newLinesFound++;
+ }
+ const endIndex = str.indexOf("\n", startIndex + 1);
+ if (endIndex === -1) {
+ return str.slice(startIndex + 1);
+ }
+
+ return str.slice(startIndex + 1, endIndex);
+}
+
+export const getLineText = memoizeLast((sourceId, asyncContent, line) => {
+ if (!asyncContent || !isFulfilled(asyncContent)) {
+ return "";
+ }
+
+ const content = asyncContent.value;
+
+ if (content.type === "wasm") {
+ const editorLine = toEditorLine(sourceId, line);
+ const lines = renderWasmText(sourceId, content);
+ return lines[editorLine] || "";
+ }
+
+ const lineText = getNthLine(content.value, line - 1);
+ return lineText || "";
+});
+
+export function getTextAtPosition(sourceId, asyncContent, location) {
+ const { column, line = 0 } = location;
+
+ const lineText = getLineText(sourceId, asyncContent, line);
+ return lineText.slice(column, column + 100).trim();
+}
+
+/**
+ * Compute the CSS classname string to use for the icon of a given source.
+ *
+ * @param {Object} source
+ * The reducer source object.
+ * @param {Object} symbols
+ * The reducer symbol object for the given source.
+ * @param {Boolean} isBlackBoxed
+ * To be set to true, when the given source is blackboxed.
+ * @param {Boolean} hasPrettyTab
+ * To be set to true, if the given source isn't the pretty printed one,
+ * but another tab for that source is opened pretty printed.
+ * @return String
+ * The classname to use.
+ */
+export function getSourceClassnames(
+ source,
+ symbols,
+ isBlackBoxed,
+ hasPrettyTab = false
+) {
+ // Conditionals should be ordered by priority of icon!
+ const defaultClassName = "file";
+
+ if (!source || !source.url) {
+ return defaultClassName;
+ }
+
+ // In the SourceTree, we don't show the pretty printed sources,
+ // but still want to show the pretty print icon when a pretty printed tab
+ // for the current source is opened.
+ if (isPretty(source) || hasPrettyTab) {
+ return "prettyPrint";
+ }
+
+ if (isBlackBoxed) {
+ return "blackBox";
+ }
+
+ if (symbols && symbols.framework) {
+ return symbols.framework.toLowerCase();
+ }
+
+ if (isUrlExtension(source.url)) {
+ return "extension";
+ }
+
+ return sourceTypes[source.displayURL.fileExtension] || defaultClassName;
+}
+
+export function getRelativeUrl(source, root) {
+ const { group, path } = source.displayURL;
+ if (!root) {
+ return path;
+ }
+
+ // + 1 removes the leading "/"
+ const url = group + path;
+ return url.slice(url.indexOf(root) + root.length + 1);
+}
+
+/**
+ * source.url doesn't include thread actor ID, so before calling underRoot(), the thread actor ID
+ * must be removed from the root, which this function handles.
+ * @param {string} root The root url to be cleaned
+ * @param {Set<Thread>} threads The list of threads
+ * @returns {string} The root url with thread actor IDs removed
+ */
+export function removeThreadActorId(root, threads) {
+ threads.forEach(thread => {
+ if (root.includes(thread.actor)) {
+ root = root.slice(thread.actor.length + 1);
+ }
+ });
+ return root;
+}
+
+/**
+ * Checks if the source is descendant of the root identified by the
+ * root url specified. The root might likely be projectDirectoryRoot which
+ * is a defined by a pref that allows users restrict the source tree to
+ * a subset of sources.
+ *
+ * @param {Object} source
+ * The source object
+ * @param {String} rootUrlWithoutThreadActor
+ * The url for the root node, without the thread actor ID. This can be obtained
+ * by calling removeThreadActorId()
+ */
+export function isDescendantOfRoot(source, rootUrlWithoutThreadActor) {
+ if (source.url && source.url.includes("chrome://")) {
+ const { group, path } = source.displayURL;
+ return (group + path).includes(rootUrlWithoutThreadActor);
+ }
+
+ return !!source.url && source.url.includes(rootUrlWithoutThreadActor);
+}
+
+export function getSourceQueryString(source) {
+ if (!source) {
+ return "";
+ }
+
+ return parseURL(getRawSourceURL(source.url)).search;
+}
+
+export function isUrlExtension(url) {
+ return url.includes("moz-extension:") || url.includes("chrome-extension");
+}
+
+/**
+* Checks that source url matches one of the glob patterns
+*
+* @param {Object} source
+* @param {String} excludePatterns
+ String of comma-seperated glob patterns
+* @return {return} Boolean value specifies if the string matches any
+ of the patterns.
+*/
+export function matchesGlobPatterns(source, excludePatterns) {
+ if (!excludePatterns) {
+ return false;
+ }
+ const patterns = excludePatterns
+ .split(",")
+ .map(pattern => pattern.trim())
+ .filter(pattern => pattern !== "");
+
+ if (!patterns.length) {
+ return false;
+ }
+
+ return micromatch.contains(
+ // Makes sure we format the url or id exactly the way its displayed in the search ui,
+ // as user wil usually create glob patterns based on what is seen in the ui.
+ source.url ? getRelativePath(source.url) : getFormattedSourceId(source.id),
+ patterns
+ );
+}
diff --git a/devtools/client/debugger/src/utils/sources-tree/getURL.js b/devtools/client/debugger/src/utils/sources-tree/getURL.js
new file mode 100644
index 0000000000..c01fce5f23
--- /dev/null
+++ b/devtools/client/debugger/src/utils/sources-tree/getURL.js
@@ -0,0 +1,180 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { parse } from "../url";
+
+const {
+ getUnicodeHostname,
+ getUnicodeUrlPath,
+} = require("resource://devtools/client/shared/unicode-url.js");
+
+export function getFilenameFromPath(pathname) {
+ let filename = "";
+ if (pathname) {
+ filename = pathname.substring(pathname.lastIndexOf("/") + 1);
+ // This file does not have a name. Default should be (index).
+ if (filename == "") {
+ filename = "(index)";
+ } else if (filename == ":formatted") {
+ filename = "(index:formatted)";
+ }
+ }
+ return filename;
+}
+
+function getFileExtension(path) {
+ if (!path) {
+ return "";
+ }
+
+ const lastIndex = path.lastIndexOf(".");
+ return lastIndex !== -1 ? path.slice(lastIndex + 1).toLowerCase() : "";
+}
+
+const NoDomain = "(no domain)";
+const def = {
+ path: "",
+ search: "",
+ group: "",
+ filename: "",
+ fileExtension: "",
+};
+
+/**
+ * Compute the URL which may be displayed in the Source Tree.
+ *
+ * @param {String} url
+ * The source absolute URL as a string
+ * @param {String} extensionName
+ * Optional, but mandatory when passing a moz-extension URL.
+ * Name of the extension serving this moz-extension source.
+ * @return URL Object
+ * A URL object to represent this source.
+ *
+ * Note that this isn't the standard URL object.
+ * This is augmented with custom properties like:
+ * - `group`, which is mostly the host of the source's URL.
+ * This is used to sort sources in the Source tree.
+ * - `fileExtension`, lowercased file extension of the source
+ * (if any extension is available)
+ * - `path` and `pathname` have some special behavior.
+ * See `parse` implementation.
+ */
+export function getDisplayURL(url, extensionName = null) {
+ if (!url) {
+ return def;
+ }
+
+ const { pathname, search, protocol, host } = parse(url);
+ const filename = getUnicodeUrlPath(getFilenameFromPath(pathname));
+
+ switch (protocol) {
+ case "javascript:":
+ // Ignore `javascript:` URLs for now
+ return def;
+
+ case "moz-extension:":
+ return {
+ ...def,
+ path: pathname,
+ search,
+ filename,
+ fileExtension: getFileExtension(pathname),
+ // For moz-extension, we replace the uuid by the extension name
+ // that we receive from the SourceActor.extensionName attribute.
+ // `extensionName` might be null for content script of disabled add-ons.
+ group: extensionName || `${protocol}//${host}`,
+ };
+ case "resource:":
+ return {
+ ...def,
+ path: pathname,
+ search,
+ filename,
+ fileExtension: getFileExtension(pathname),
+ group: `${protocol}//${host || ""}`,
+ };
+ case "webpack:":
+ return {
+ ...def,
+ path: pathname,
+ search,
+ filename,
+ fileExtension: getFileExtension(pathname),
+ group: `Webpack`,
+ };
+ case "ng:":
+ return {
+ ...def,
+ path: pathname,
+ search,
+ filename,
+ fileExtension: getFileExtension(pathname),
+ group: `Angular`,
+ };
+ case "about:":
+ // An about page is a special case
+ return {
+ ...def,
+ path: "/",
+ search,
+ filename,
+ fileExtension: getFileExtension("/"),
+ group: url,
+ };
+
+ case "data:":
+ return {
+ ...def,
+ path: "/",
+ search,
+ filename: url,
+ fileExtension: getFileExtension("/"),
+ group: NoDomain,
+ };
+
+ case "":
+ if (pathname && pathname.startsWith("/")) {
+ // use file protocol for a URL like "/foo/bar.js"
+ return {
+ ...def,
+ path: pathname,
+ search,
+ filename,
+ fileExtension: getFileExtension(pathname),
+ group: "file://",
+ };
+ } else if (!host) {
+ return {
+ ...def,
+ path: pathname,
+ search,
+ filename,
+ fileExtension: getFileExtension(pathname),
+ group: "",
+ };
+ }
+ break;
+
+ case "http:":
+ case "https:":
+ return {
+ ...def,
+ path: pathname,
+ search,
+ filename,
+ fileExtension: getFileExtension(pathname),
+ group: getUnicodeHostname(host),
+ };
+ }
+
+ return {
+ ...def,
+ path: pathname,
+ search,
+ fileExtension: getFileExtension(pathname),
+ filename,
+ group: protocol ? `${protocol}//` : "",
+ };
+}
diff --git a/devtools/client/debugger/src/utils/sources-tree/moz.build b/devtools/client/debugger/src/utils/sources-tree/moz.build
new file mode 100644
index 0000000000..400c0f0d1a
--- /dev/null
+++ b/devtools/client/debugger/src/utils/sources-tree/moz.build
@@ -0,0 +1,9 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+CompiledModules(
+ "getURL.js",
+ "utils.js",
+)
diff --git a/devtools/client/debugger/src/utils/sources-tree/tests/getUrl.spec.js b/devtools/client/debugger/src/utils/sources-tree/tests/getUrl.spec.js
new file mode 100644
index 0000000000..51919ffc4e
--- /dev/null
+++ b/devtools/client/debugger/src/utils/sources-tree/tests/getUrl.spec.js
@@ -0,0 +1,50 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { getDisplayURL } from "../getURL";
+
+describe("getUrl", () => {
+ it("handles normal url with http and https for filename", function () {
+ const urlObject = getDisplayURL("https://a/b.js");
+ expect(urlObject.filename).toBe("b.js");
+
+ const urlObject2 = getDisplayURL("http://a/b.js");
+ expect(urlObject2.filename).toBe("b.js");
+ });
+
+ it("handles url with querystring for filename", function () {
+ const urlObject = getDisplayURL("https://a/b.js?key=randomKey");
+ expect(urlObject.filename).toBe("b.js");
+ });
+
+ it("handles url with '#' for filename", function () {
+ const urlObject = getDisplayURL("https://a/b.js#specialSection");
+ expect(urlObject.filename).toBe("b.js");
+ });
+
+ it("handles url with no file extension for filename", function () {
+ const urlObject = getDisplayURL("https://a/c");
+ expect(urlObject.filename).toBe("c");
+ });
+
+ it("handles url with no name for filename", function () {
+ const urlObject = getDisplayURL("https://a/");
+ expect(urlObject.filename).toBe("(index)");
+ });
+
+ it("separates resources by protocol and host", () => {
+ const urlObject = getDisplayURL("moz-extension://xyz/123");
+ expect(urlObject.group).toBe("moz-extension://xyz");
+ });
+
+ it("creates a group name for webpack", () => {
+ const urlObject = getDisplayURL("webpack:///src/component.jsx");
+ expect(urlObject.group).toBe("Webpack");
+ });
+
+ it("creates a group name for angular source", () => {
+ const urlObject = getDisplayURL("ng://src/component.jsx");
+ expect(urlObject.group).toBe("Angular");
+ });
+});
diff --git a/devtools/client/debugger/src/utils/sources-tree/utils.js b/devtools/client/debugger/src/utils/sources-tree/utils.js
new file mode 100644
index 0000000000..0a2f41752b
--- /dev/null
+++ b/devtools/client/debugger/src/utils/sources-tree/utils.js
@@ -0,0 +1,44 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { parse } from "../../utils/url";
+
+/**
+ * Get the relative path of the url
+ * Does not include any query parameters or fragment parts
+ *
+ * @param string url
+ * @returns string path
+ */
+export function getRelativePath(url) {
+ const { pathname } = parse(url);
+ if (!pathname) {
+ return url;
+ }
+ const index = pathname.indexOf("/");
+ if (index !== -1) {
+ const path = pathname.slice(index + 1);
+ // If the path is empty this is likely the index file.
+ // e.g http://foo.com/
+ if (path == "") {
+ return "(index)";
+ }
+ return path;
+ }
+ return "";
+}
+
+/**
+ *
+ * @param {String} name: Name (e.g. computed in SourcesTreeItem renderItemName),
+ * which might include URI search.
+ * @returns {String} result of `decodedURI(name)`, or name if it `name` is malformed.
+ */
+export function safeDecodeItemName(name) {
+ try {
+ return decodeURI(name);
+ } catch (e) {
+ return name;
+ }
+}
diff --git a/devtools/client/debugger/src/utils/tabs.js b/devtools/client/debugger/src/utils/tabs.js
new file mode 100644
index 0000000000..5f16b6ce63
--- /dev/null
+++ b/devtools/client/debugger/src/utils/tabs.js
@@ -0,0 +1,121 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/*
+ * Finds the hidden tabs by comparing the tabs' top offset.
+ * hidden tabs will have a great top offset.
+ *
+ * @param sourceTabs Array
+ * @param sourceTabEls HTMLCollection
+ *
+ * @returns Array
+ */
+
+export function getHiddenTabs(sourceTabs, sourceTabEls) {
+ sourceTabEls = [].slice.call(sourceTabEls);
+ function getTopOffset() {
+ const topOffsets = sourceTabEls.map(t => t.getBoundingClientRect().top);
+ return Math.min(...topOffsets);
+ }
+
+ function hasTopOffset(el) {
+ // adding 10px helps account for cases where the tab might be offset by
+ // styling such as selected tabs which don't have a border.
+ const tabTopOffset = getTopOffset();
+ return el.getBoundingClientRect().top > tabTopOffset + 10;
+ }
+
+ return sourceTabs.filter((tab, index) => {
+ const element = sourceTabEls[index];
+ return element && hasTopOffset(element);
+ });
+}
+
+export function getTabMenuItems() {
+ return {
+ closeTab: {
+ id: "node-menu-close-tab",
+ label: L10N.getStr("sourceTabs.closeTab"),
+ accesskey: L10N.getStr("sourceTabs.closeTab.accesskey"),
+ disabled: false,
+ },
+ closeOtherTabs: {
+ id: "node-menu-close-other-tabs",
+ label: L10N.getStr("sourceTabs.closeOtherTabs"),
+ accesskey: L10N.getStr("sourceTabs.closeOtherTabs.accesskey"),
+ disabled: false,
+ },
+ closeTabsToEnd: {
+ id: "node-menu-close-tabs-to-end",
+ label: L10N.getStr("sourceTabs.closeTabsToEnd"),
+ accesskey: L10N.getStr("sourceTabs.closeTabsToEnd.accesskey"),
+ disabled: false,
+ },
+ closeAllTabs: {
+ id: "node-menu-close-all-tabs",
+ label: L10N.getStr("sourceTabs.closeAllTabs"),
+ accesskey: L10N.getStr("sourceTabs.closeAllTabs.accesskey"),
+ disabled: false,
+ },
+ showSource: {
+ id: "node-menu-show-source",
+ label: L10N.getStr("sourceTabs.revealInTree"),
+ accesskey: L10N.getStr("sourceTabs.revealInTree.accesskey"),
+ disabled: false,
+ },
+ copySource: {
+ id: "node-menu-copy-source",
+ label: L10N.getStr("copySource.label"),
+ accesskey: L10N.getStr("copySource.accesskey"),
+ disabled: false,
+ },
+ copySourceUri2: {
+ id: "node-menu-copy-source-url",
+ label: L10N.getStr("copySourceUri2"),
+ accesskey: L10N.getStr("copySourceUri2.accesskey"),
+ disabled: false,
+ },
+ toggleBlackBox: {
+ id: "node-menu-blackbox",
+ label: L10N.getStr("ignoreContextItem.ignore"),
+ accesskey: L10N.getStr("ignoreContextItem.ignore.accesskey"),
+ disabled: false,
+ },
+ prettyPrint: {
+ id: "node-menu-pretty-print",
+ label: L10N.getStr("sourceTabs.prettyPrint"),
+ accesskey: L10N.getStr("sourceTabs.prettyPrint.accesskey"),
+ disabled: false,
+ },
+ };
+}
+
+/**
+ * Determines if a tab exists with the following properties
+ *
+ * @param {Object} tab
+ * @param {String} url
+ * @param {Boolean} isOriginal
+ */
+export function isSimilarTab(tab, url, isOriginal) {
+ return tab.url === url && tab.isOriginal === isOriginal;
+}
+
+/**
+ * This cleans up some tab info (source id and thread info),
+ * mostly for persiting to pref and for navigation or reload.
+ * This is neccesary because the source and thread are destroyed
+ * and re-created across navigations / reloads.
+ *
+ * @param {Array} tabs
+ */
+export function persistTabs(tabs) {
+ return [...tabs]
+ .filter(tab => tab.url)
+ .map(tab => ({
+ ...tab,
+ source: null,
+ sourceActor: null,
+ }));
+}
diff --git a/devtools/client/debugger/src/utils/task.js b/devtools/client/debugger/src/utils/task.js
new file mode 100644
index 0000000000..25663fdd16
--- /dev/null
+++ b/devtools/client/debugger/src/utils/task.js
@@ -0,0 +1,44 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * This object provides the public module functions.
+ */
+export const Task = {
+ // XXX: Not sure if this works in all cases...
+ async: function (task) {
+ return function () {
+ return Task.spawn(task, this, arguments);
+ };
+ },
+
+ /**
+ * Creates and starts a new task.
+ * @param task A generator function
+ * @return A promise, resolved when the task terminates
+ */
+ spawn: function (task, scope, args) {
+ return new Promise(function (resolve, reject) {
+ const iterator = task.apply(scope, args);
+
+ const callNext = lastValue => {
+ const iteration = iterator.next(lastValue);
+ Promise.resolve(iteration.value)
+ .then(value => {
+ if (iteration.done) {
+ resolve(value);
+ } else {
+ callNext(value);
+ }
+ })
+ .catch(error => {
+ reject(error);
+ iterator.throw(error);
+ });
+ };
+
+ callNext(undefined);
+ });
+ },
+};
diff --git a/devtools/client/debugger/src/utils/telemetry.js b/devtools/client/debugger/src/utils/telemetry.js
new file mode 100644
index 0000000000..0e0c8766bb
--- /dev/null
+++ b/devtools/client/debugger/src/utils/telemetry.js
@@ -0,0 +1,72 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Usage:
+ *
+ * import { recordEvent } from "src/utils/telemetry";
+ *
+ * // Event without extra properties
+ * recordEvent("add_breakpoint");
+ *
+ * // Event with extra properties
+ * recordEvent("pause", {
+ * "reason": "debugger-statement",
+ * "collapsed_callstacks": 1
+ * });
+ *
+ * // If the properties are in multiple code paths and you can't send them all
+ * // in one go you will need to use the full telemetry API.
+ *
+ * const Telemetry = require("devtools/client/shared/telemetry");
+ *
+ * const telemetry = new Telemetry();
+ *
+ * // Prepare the event and define which properties to expect.
+ * //
+ * // NOTE: You CAN send properties before preparing the event.
+ * //
+ * telemetry.preparePendingEvent(this, "pause", "debugger", null, [
+ * "reason", "collapsed_callstacks"
+ * ]);
+ *
+ * // Elsewhere in another codepath send the reason property
+ * telemetry.addEventProperty(
+ * this, "pause", "debugger", null, "reason", "debugger-statement"
+ * );
+ *
+ * // Elsewhere in another codepath send the collapsed_callstacks property
+ * telemetry.addEventProperty(
+ * this, "pause", "debugger", null, "collapsed_callstacks", 1
+ * );
+ */
+
+import { isNode } from "./environment";
+
+let telemetry;
+
+if (isNode()) {
+ const Telemetry = require("resource://devtools/client/shared/telemetry.js");
+ telemetry = new Telemetry();
+}
+
+export function setToolboxTelemetry(toolboxTelemetry) {
+ telemetry = toolboxTelemetry;
+}
+
+/**
+ * @memberof utils/telemetry
+ * @static
+ */
+export function recordEvent(eventName, fields = {}) {
+ telemetry.recordEvent(eventName, "debugger", null, fields);
+
+ if (isNode()) {
+ const { events } = window.dbg._telemetry;
+ if (!events[eventName]) {
+ events[eventName] = [];
+ }
+ events[eventName].push(fields);
+ }
+}
diff --git a/devtools/client/debugger/src/utils/test-head.js b/devtools/client/debugger/src/utils/test-head.js
new file mode 100644
index 0000000000..c21f408b61
--- /dev/null
+++ b/devtools/client/debugger/src/utils/test-head.js
@@ -0,0 +1,283 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Utils for Jest
+ * @module utils/test-head
+ */
+
+import { combineReducers } from "devtools/client/shared/vendor/redux";
+import reducers from "../reducers/index";
+import actions from "../actions/index";
+import * as selectors from "../selectors/index";
+import {
+ searchWorker,
+ prettyPrintWorker,
+ parserWorker,
+} from "../test/tests-setup";
+import configureStore from "../actions/utils/create-store";
+import sourceQueue from "../utils/source-queue";
+import { setupCreate } from "../client/firefox/create";
+import { createLocation } from "./location";
+
+// Import the internal module used by the source-map worker
+// as node doesn't have Web Worker support and require path mapping
+// doesn't work from nodejs worker thread and break mappings to devtools/ folder.
+import sourceMapLoader from "devtools/client/shared/source-map-loader/source-map";
+
+/**
+ * This file contains older interfaces used by tests that have not been
+ * converted to use test-mockup.js
+ */
+
+/**
+ * @memberof utils/test-head
+ * @static
+ */
+function createStore(client, initialState = {}, sourceMapLoaderMock) {
+ const store = configureStore({
+ log: false,
+ makeThunkArgs: args => {
+ return {
+ ...args,
+ client,
+ sourceMapLoader:
+ sourceMapLoaderMock !== undefined
+ ? sourceMapLoaderMock
+ : sourceMapLoader,
+ parserWorker,
+ prettyPrintWorker,
+ searchWorker,
+ };
+ },
+ })(combineReducers(reducers), initialState);
+ sourceQueue.clear();
+ sourceQueue.initialize({
+ newOriginalSources: sources =>
+ store.dispatch(actions.newOriginalSources(sources)),
+ });
+
+ store.thunkArgs = () => ({
+ dispatch: store.dispatch,
+ getState: store.getState,
+ client,
+ sourceMapLoader,
+ panel: {},
+ });
+
+ // Put the initial context in the store, for convenience to unit tests.
+ store.cx = selectors.getThreadContext(store.getState());
+
+ setupCreate({ store });
+
+ return store;
+}
+
+/**
+ * @memberof utils/test-head
+ * @static
+ */
+function commonLog(msg, data = {}) {
+ console.log(`[INFO] ${msg} ${JSON.stringify(data)}`);
+}
+
+function makeFrame({ id, sourceId, thread }, opts = {}) {
+ const source = createSourceObject(sourceId);
+ const sourceActor = {
+ id: `${sourceId}-actor`,
+ actor: `${sourceId}-actor`,
+ source: sourceId,
+ sourceObject: source,
+ };
+ const location = createLocation({ source, sourceActor, line: 4 });
+ return {
+ id,
+ scope: { bindings: { variables: {}, arguments: [] } },
+ location,
+ generatedLocation: location,
+ thread: thread || "FakeThread",
+ ...opts,
+ };
+}
+
+function createSourceObject(filename, props = {}) {
+ return {
+ id: filename,
+ url: makeSourceURL(filename),
+ isPrettyPrinted: false,
+ isExtension: false,
+ isOriginal: filename.includes("originalSource"),
+ displayURL: makeSourceURL(filename),
+ };
+}
+
+function makeSourceURL(filename) {
+ return `http://localhost:8000/examples/${filename}`;
+}
+
+function createMakeSource() {
+ const indicies = {};
+
+ return function (name, props = {}) {
+ const index = (indicies[name] | 0) + 1;
+ indicies[name] = index;
+
+ // Mock a SOURCE Resource, which happens to be the SourceActor's form
+ // with resourceType and targetFront additional attributes
+ return {
+ resourceType: "source",
+ // Mock the targetFront to support makeSourceId function
+ targetFront: {
+ isDestroyed() {
+ return false;
+ },
+ getCachedFront(typeName) {
+ return typeName == "thread" ? { actorID: "FakeThread" } : null;
+ },
+ },
+ // Allow to use custom ID's for reducer source objects
+ mockedJestID: name,
+ actor: `${name}-${index}-actor`,
+ url: `http://localhost:8000/examples/${name}`,
+ sourceMapBaseURL: props.sourceMapBaseURL || null,
+ sourceMapURL: props.sourceMapURL || null,
+ introductionType: props.introductionType || null,
+ extensionName: null,
+ };
+ };
+}
+
+/**
+ * @memberof utils/test-head
+ * @static
+ */
+let creator;
+beforeEach(() => {
+ creator = createMakeSource();
+});
+afterEach(() => {
+ creator = null;
+});
+function makeSource(name, props) {
+ if (!creator) {
+ throw new Error("makeSource() cannot be called outside of a test");
+ }
+
+ return creator(name, props);
+}
+
+function makeOriginalSource(source) {
+ return {
+ id: `${source.id}/originalSource`,
+ url: `${source.url}-original`,
+ sourceActor: {
+ id: `${source.id}-1-actor`,
+ thread: "FakeThread",
+ },
+ };
+}
+
+function makeFuncLocation(startLine, endLine) {
+ if (!endLine) {
+ endLine = startLine + 1;
+ }
+ return {
+ start: {
+ line: startLine,
+ },
+ end: {
+ line: endLine,
+ },
+ };
+}
+
+function makeSymbolDeclaration(name, start, end, klass) {
+ return {
+ id: `${name}:${start}`,
+ name,
+ location: makeFuncLocation(start, end),
+ klass,
+ };
+}
+
+/**
+ * @memberof utils/test-head
+ * @static
+ */
+function waitForState(store, predicate) {
+ return new Promise(resolve => {
+ let ret = predicate(store.getState());
+ if (ret) {
+ resolve(ret);
+ }
+
+ const unsubscribe = store.subscribe(() => {
+ ret = predicate(store.getState());
+ if (ret) {
+ unsubscribe();
+ // NOTE: memoizableAction adds an additional tick for validating context
+ setTimeout(() => resolve(ret));
+ }
+ });
+ });
+}
+
+function watchForState(store, predicate) {
+ let sawState = false;
+ const checkState = function () {
+ if (!sawState && predicate(store.getState())) {
+ sawState = true;
+ }
+ return sawState;
+ };
+
+ let unsubscribe;
+ if (!checkState()) {
+ unsubscribe = store.subscribe(() => {
+ if (checkState()) {
+ unsubscribe();
+ }
+ });
+ }
+
+ return function read() {
+ if (unsubscribe) {
+ unsubscribe();
+ }
+
+ return sawState;
+ };
+}
+
+function getTelemetryEvents(eventName) {
+ return window.dbg._telemetry.events[eventName] || [];
+}
+
+function waitATick(callback) {
+ return new Promise(resolve => {
+ setTimeout(() => {
+ callback();
+ resolve();
+ });
+ });
+}
+
+export {
+ actions,
+ selectors,
+ reducers,
+ createStore,
+ commonLog,
+ getTelemetryEvents,
+ makeFrame,
+ createSourceObject,
+ createMakeSource,
+ makeSourceURL,
+ makeSource,
+ makeOriginalSource,
+ makeSymbolDeclaration,
+ waitForState,
+ watchForState,
+ waitATick,
+};
diff --git a/devtools/client/debugger/src/utils/test-mockup.js b/devtools/client/debugger/src/utils/test-mockup.js
new file mode 100644
index 0000000000..521872b7cb
--- /dev/null
+++ b/devtools/client/debugger/src/utils/test-mockup.js
@@ -0,0 +1,268 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * This file is for use by unit tests for isolated debugger components that do
+ * not need to interact with the redux store. When these tests need to construct
+ * debugger objects, these interfaces should be used instead of plain object
+ * literals.
+ */
+
+import * as asyncValue from "./async-value";
+
+import { initialState } from "../reducers/index";
+
+import { getDisplayURL } from "./sources-tree/getURL";
+import { createLocation } from "./location";
+
+function makeMockSource(url = "url", id = "source", thread = "FakeThread") {
+ return {
+ id,
+ url,
+ displayURL: getDisplayURL(url),
+ thread,
+ isPrettyPrinted: false,
+ isWasm: false,
+ extensionName: null,
+ isExtension: false,
+ isOriginal: id.includes("originalSource"),
+ };
+}
+
+function makeMockDisplaySource(
+ url = "url",
+ id = "source",
+ thread = "FakeThread"
+) {
+ return makeMockSource(url, id, thread);
+}
+
+function makeMockSourceWithContent(
+ url,
+ id,
+ contentType = "text/javascript",
+ text = ""
+) {
+ const source = makeMockSource(url, id);
+
+ return {
+ ...source,
+ content: text
+ ? asyncValue.fulfilled({
+ type: "text",
+ value: text,
+ contentType,
+ })
+ : null,
+ };
+}
+
+function makeMockSourceAndContent(
+ url,
+ id,
+ contentType = "text/javascript",
+ text = ""
+) {
+ const source = makeMockSource(url, id);
+
+ return {
+ ...source,
+ content: {
+ type: "text",
+ value: text,
+ contentType,
+ },
+ };
+}
+
+function makeFullfilledMockSourceContent(
+ text = "",
+ contentType = "text/javascript"
+) {
+ return asyncValue.fulfilled({
+ type: "text",
+ value: text,
+ contentType,
+ });
+}
+
+function makeMockWasmSource() {
+ return {
+ id: "wasm-source-id",
+ url: "url",
+ displayURL: getDisplayURL("url"),
+ thread: "FakeThread",
+ isPrettyPrinted: false,
+ isWasm: true,
+ extensionName: null,
+ isExtension: false,
+ isOriginal: false,
+ };
+}
+
+function makeMockWasmSourceWithContent(text) {
+ const source = makeMockWasmSource();
+
+ return {
+ ...source,
+ content: asyncValue.fulfilled({
+ type: "wasm",
+ value: text,
+ }),
+ };
+}
+
+function makeMockScope(actor = "scope-actor", type = "block", parent = null) {
+ return {
+ actor,
+ parent,
+ bindings: {
+ arguments: [],
+ variables: {},
+ },
+ object: null,
+ function: null,
+ type,
+ scopeKind: "",
+ };
+}
+
+function mockScopeAddVariable(scope, name) {
+ if (!scope.bindings) {
+ throw new Error("no scope bindings");
+ }
+ scope.bindings.variables[name] = { value: null };
+}
+
+function makeMockBreakpoint(source = makeMockSource(), line = 1, column) {
+ const location = column ? { source, line, column } : { source, line };
+ return {
+ id: "breakpoint",
+ location,
+ generatedLocation: location,
+ disabled: false,
+ text: "text",
+ originalText: "text",
+ options: {},
+ };
+}
+
+function makeMockFrame(
+ id = "frame",
+ source = makeMockSource("url"),
+ scope = makeMockScope(),
+ line = 4,
+ displayName = `display-${id}`,
+ index = 0
+) {
+ const sourceActor = {
+ id: `${source.id}-actor`,
+ actor: `${source.id}-actor`,
+ source: source.id,
+ sourceObject: source,
+ };
+ const location = createLocation({ source, sourceActor, line });
+ return {
+ id,
+ thread: "FakeThread",
+ displayName,
+ location,
+ generatedLocation: location,
+ source,
+ scope,
+ this: {},
+ index,
+ asyncCause: null,
+ state: "on-stack",
+ type: "call",
+ };
+}
+
+function makeMockFrameWithURL(url) {
+ return makeMockFrame(undefined, makeMockSource(url));
+}
+
+function makeWhyNormal(frameReturnValue = undefined) {
+ if (frameReturnValue) {
+ return { type: "why-normal", frameFinished: { return: frameReturnValue } };
+ }
+ return { type: "why-normal" };
+}
+
+function makeWhyThrow(frameThrowValue) {
+ return { type: "why-throw", frameFinished: { throw: frameThrowValue } };
+}
+
+function makeMockExpression(value) {
+ return {
+ input: "input",
+ value,
+ from: "from",
+ updating: false,
+ };
+}
+
+// Mock contexts for use in tests that do not create a redux store.
+const mockcx = { navigateCounter: 0 };
+const mockthreadcx = {
+ navigateCounter: 0,
+ thread: "FakeThread",
+ pauseCounter: 0,
+ isPaused: false,
+};
+
+function makeMockThread(fields) {
+ return {
+ actor: "test",
+ url: "example.com",
+ type: "worker",
+ name: "test",
+ ...fields,
+ };
+}
+
+function makeMockState(state) {
+ return {
+ ...initialState(),
+ ...state,
+ };
+}
+
+function formatTree(tree, depth = 0, str = "") {
+ const whitespace = new Array(depth * 2).join(" ");
+
+ if (tree.type === "directory") {
+ str += `${whitespace} - ${tree.name} path=${tree.path} \n`;
+ tree.contents.forEach(t => {
+ str = formatTree(t, depth + 1, str);
+ });
+ } else {
+ str += `${whitespace} - ${tree.name} path=${tree.path} source_id=${tree.contents.id} \n`;
+ }
+
+ return str;
+}
+
+export {
+ makeMockDisplaySource,
+ makeMockSource,
+ makeMockSourceWithContent,
+ makeMockSourceAndContent,
+ makeMockWasmSource,
+ makeMockWasmSourceWithContent,
+ makeMockScope,
+ mockScopeAddVariable,
+ makeMockBreakpoint,
+ makeMockFrame,
+ makeMockFrameWithURL,
+ makeWhyNormal,
+ makeWhyThrow,
+ makeMockExpression,
+ mockcx,
+ mockthreadcx,
+ makeMockState,
+ makeMockThread,
+ makeFullfilledMockSourceContent,
+ formatTree,
+};
diff --git a/devtools/client/debugger/src/utils/tests/DevToolsUtils.spec.js b/devtools/client/debugger/src/utils/tests/DevToolsUtils.spec.js
new file mode 100644
index 0000000000..be405d8628
--- /dev/null
+++ b/devtools/client/debugger/src/utils/tests/DevToolsUtils.spec.js
@@ -0,0 +1,41 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { reportException, executeSoon } from "../DevToolsUtils.js";
+
+describe("DevToolsUtils", () => {
+ describe("reportException", () => {
+ beforeEach(() => {
+ global.console = { error: jest.fn() };
+ });
+
+ it("calls console.error", () => {
+ reportException("caller", ["you broke it"]);
+ expect(console.error).toHaveBeenCalled();
+ });
+
+ it("returns a description of caller and exception text", () => {
+ const who = "who",
+ exception = "this is an error",
+ msgTxt = " threw an exception: ";
+
+ reportException(who, [exception]);
+
+ expect(console.error).toHaveBeenCalledWith(`${who}${msgTxt}`, [
+ exception,
+ ]);
+ });
+ });
+
+ describe("executeSoon", () => {
+ it("calls setTimeout with 0 ms", () => {
+ global.setTimeout = jest.fn();
+ const fnc = () => {};
+
+ executeSoon(fnc);
+
+ expect(setTimeout).toHaveBeenCalledWith(fnc, 0);
+ });
+ });
+});
diff --git a/devtools/client/debugger/src/utils/tests/__snapshots__/expressions.spec.js.snap b/devtools/client/debugger/src/utils/tests/__snapshots__/expressions.spec.js.snap
new file mode 100644
index 0000000000..a0d6b17bf6
--- /dev/null
+++ b/devtools/client/debugger/src/utils/tests/__snapshots__/expressions.spec.js.snap
@@ -0,0 +1,25 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`expressions wrap expression should wrap an expression 1`] = `
+"try {
+ foo
+} catch (e) {
+ e
+}"
+`;
+
+exports[`expressions wrap expression should wrap expression with a comment 1`] = `
+"try {
+ foo // yo yo
+} catch (e) {
+ e
+}"
+`;
+
+exports[`expressions wrap expression should wrap quotes 1`] = `
+"try {
+ \\"2\\"
+} catch (e) {
+ e
+}"
+`;
diff --git a/devtools/client/debugger/src/utils/tests/__snapshots__/function.spec.js.snap b/devtools/client/debugger/src/utils/tests/__snapshots__/function.spec.js.snap
new file mode 100644
index 0000000000..8d83a48d3b
--- /dev/null
+++ b/devtools/client/debugger/src/utils/tests/__snapshots__/function.spec.js.snap
@@ -0,0 +1,25 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`function findFunctionText finds class function 1`] = `
+"bar() {
+ 2 + 2;
+}"
+`;
+
+exports[`function findFunctionText finds function 1`] = `
+"async function exSlowFoo() {
+ return \\"yay in a bit\\";
+}"
+`;
+
+exports[`function findFunctionText finds function signature 1`] = `
+"async function exSlowFoo() {
+ return \\"yay in a bit\\";
+}"
+`;
+
+exports[`function findFunctionText finds property function 1`] = `
+"function name() {
+ 2 + 2;
+}"
+`;
diff --git a/devtools/client/debugger/src/utils/tests/__snapshots__/indentation.spec.js.snap b/devtools/client/debugger/src/utils/tests/__snapshots__/indentation.spec.js.snap
new file mode 100644
index 0000000000..883d48a7ff
--- /dev/null
+++ b/devtools/client/debugger/src/utils/tests/__snapshots__/indentation.spec.js.snap
@@ -0,0 +1,27 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`indentation mad indentation 1`] = `
+"try {
+console.log(\\"yo\\")
+} catch (e) {
+console.log(\\"yo\\")
+ }"
+`;
+
+exports[`indentation one function 1`] = `
+"function foo() {
+ console.log(\\"yo\\")
+}"
+`;
+
+exports[`indentation one line 1`] = `"foo"`;
+
+exports[`indentation simple 1`] = `"foo"`;
+
+exports[`indentation try catch 1`] = `
+"try {
+ console.log(\\"yo\\")
+} catch (e) {
+ console.log(\\"yo\\")
+}"
+`;
diff --git a/devtools/client/debugger/src/utils/tests/assert.spec.js b/devtools/client/debugger/src/utils/tests/assert.spec.js
new file mode 100644
index 0000000000..031665c5d3
--- /dev/null
+++ b/devtools/client/debugger/src/utils/tests/assert.spec.js
@@ -0,0 +1,30 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import assert from "../assert.js";
+
+let testAssertMessageHead, testAssertMessage;
+
+describe("assert", () => {
+ beforeEach(() => {
+ testAssertMessageHead = "Assertion failure: ";
+ testAssertMessage = "Test assert.js Message";
+ });
+
+ describe("when condition is truthy", () => {
+ it("does not throw an Error", () => {
+ expect(() => {
+ assert(true, testAssertMessage);
+ }).not.toThrow();
+ });
+ });
+
+ describe("when condition is falsy", () => {
+ it("throws an Error displaying the passed message", () => {
+ expect(() => {
+ assert(false, testAssertMessage);
+ }).toThrow(new Error(testAssertMessageHead + testAssertMessage));
+ });
+ });
+});
diff --git a/devtools/client/debugger/src/utils/tests/build-query.spec.js b/devtools/client/debugger/src/utils/tests/build-query.spec.js
new file mode 100644
index 0000000000..dbd0eba4a4
--- /dev/null
+++ b/devtools/client/debugger/src/utils/tests/build-query.spec.js
@@ -0,0 +1,256 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import buildQuery from "../build-query";
+
+describe("build-query", () => {
+ it("case-sensitive, whole-word, regex search", () => {
+ const query = buildQuery(
+ "hi.*",
+ {
+ caseSensitive: true,
+ wholeWord: true,
+ regexMatch: true,
+ },
+ {}
+ );
+
+ expect(query.source).toBe("\\bhi.*\\b");
+ expect(query.flags).toBe("");
+ expect(query.ignoreCase).toBe(false);
+ });
+
+ it("case-sensitive, whole-word, regex search, global", () => {
+ const query = buildQuery(
+ "hi.*",
+ {
+ caseSensitive: true,
+ wholeWord: true,
+ regexMatch: true,
+ },
+ { isGlobal: true }
+ );
+
+ expect(query.source).toBe("\\bhi.*\\b");
+ expect(query.flags).toBe("g");
+ expect(query.ignoreCase).toBe(false);
+ });
+
+ it("case-insensitive, non-whole, string search", () => {
+ const query = buildQuery(
+ "hi",
+ {
+ caseSensitive: false,
+ wholeWord: false,
+ regexMatch: false,
+ },
+ {}
+ );
+
+ expect(query.source).toBe("hi");
+ expect(query.flags).toBe("i");
+ expect(query.ignoreCase).toBe(true);
+ });
+
+ it("case-insensitive, non-whole, string search, global", () => {
+ const query = buildQuery(
+ "hi",
+ {
+ caseSensitive: false,
+ wholeWord: false,
+ regexMatch: false,
+ },
+ { isGlobal: true }
+ );
+
+ expect(query.source).toBe("hi");
+ expect(query.flags).toBe("gi");
+ expect(query.ignoreCase).toBe(true);
+ });
+
+ it("case-sensitive string search", () => {
+ const query = buildQuery(
+ "hi",
+ {
+ caseSensitive: true,
+ wholeWord: false,
+ regexMatch: false,
+ },
+ {}
+ );
+
+ expect(query.source).toBe("hi");
+ expect(query.flags).toBe("");
+ expect(query.ignoreCase).toBe(false);
+ });
+
+ it("string search with wholeWord", () => {
+ const query = buildQuery(
+ "hi",
+ {
+ caseSensitive: false,
+ wholeWord: true,
+ regexMatch: false,
+ },
+ {}
+ );
+
+ expect(query.source).toBe("\\bhi\\b");
+ expect(query.flags).toBe("i");
+ expect(query.ignoreCase).toBe(true);
+ });
+
+ it("case-insensitive, regex search", () => {
+ const query = buildQuery(
+ "hi.*",
+ {
+ caseSensitive: false,
+ wholeWord: false,
+ regexMatch: true,
+ },
+ {}
+ );
+
+ expect(query.source).toBe("hi.*");
+ expect(query.flags).toBe("i");
+ expect(query.global).toBe(false);
+ expect(query.ignoreCase).toBe(true);
+ });
+
+ it("string search with wholeWord and case sensitivity", () => {
+ const query = buildQuery(
+ "hi",
+ {
+ caseSensitive: true,
+ wholeWord: true,
+ regexMatch: false,
+ },
+ {}
+ );
+
+ expect(query.source).toBe("\\bhi\\b");
+ expect(query.flags).toBe("");
+ expect(query.global).toBe(false);
+ expect(query.ignoreCase).toBe(false);
+ });
+
+ it("string search with wholeWord and case sensitivity, global", () => {
+ const query = buildQuery(
+ "hi",
+ {
+ caseSensitive: true,
+ wholeWord: true,
+ regexMatch: false,
+ },
+ { isGlobal: true }
+ );
+
+ expect(query.source).toBe("\\bhi\\b");
+ expect(query.flags).toBe("g");
+ expect(query.global).toBe(true);
+ expect(query.ignoreCase).toBe(false);
+ });
+
+ it("string search with regex chars escaped", () => {
+ const query = buildQuery(
+ "hi.*",
+ {
+ caseSensitive: true,
+ wholeWord: true,
+ regexMatch: false,
+ },
+ {}
+ );
+
+ expect(query.source).toBe("\\bhi\\.\\*\\b");
+ expect(query.flags).toBe("");
+ expect(query.global).toBe(false);
+ expect(query.ignoreCase).toBe(false);
+ });
+
+ it("string search with regex chars escaped, global", () => {
+ const query = buildQuery(
+ "hi.*",
+ {
+ caseSensitive: true,
+ wholeWord: true,
+ regexMatch: false,
+ },
+ { isGlobal: true }
+ );
+
+ expect(query.source).toBe("\\bhi\\.\\*\\b");
+ expect(query.flags).toBe("g");
+ expect(query.global).toBe(true);
+ expect(query.ignoreCase).toBe(false);
+ });
+
+ it("ignore spaces w/o spaces", () => {
+ const query = buildQuery(
+ "hi",
+ {
+ caseSensitive: true,
+ wholeWord: false,
+ regexMatch: false,
+ },
+ { ignoreSpaces: true }
+ );
+
+ expect(query.source).toBe("hi");
+ expect(query.flags).toBe("");
+ expect(query.global).toBe(false);
+ expect(query.ignoreCase).toBe(false);
+ });
+
+ it("ignore spaces w/o spaces, global", () => {
+ const query = buildQuery(
+ "hi",
+ {
+ caseSensitive: true,
+ wholeWord: false,
+ regexMatch: false,
+ },
+ { isGlobal: true, ignoreSpaces: true }
+ );
+
+ expect(query.source).toBe("hi");
+ expect(query.flags).toBe("g");
+ expect(query.global).toBe(true);
+ expect(query.ignoreCase).toBe(false);
+ });
+
+ it("ignore spaces w/ spaces", () => {
+ const query = buildQuery(
+ " ",
+ {
+ caseSensitive: true,
+ wholeWord: false,
+ regexMatch: false,
+ },
+ { ignoreSpaces: true }
+ );
+
+ expect(query.source).toBe("(?!\\s*.*)");
+ expect(query.flags).toBe("");
+ expect(query.global).toBe(false);
+ expect(query.ignoreCase).toBe(false);
+ });
+
+ it("ignore spaces w/ spaces, global", () => {
+ const query = buildQuery(
+ " ",
+ {
+ caseSensitive: true,
+ wholeWord: false,
+ regexMatch: false,
+ },
+ { isGlobal: true, ignoreSpaces: true }
+ );
+
+ expect(query.source).toBe("(?!\\s*.*)");
+ expect(query.flags).toBe("g");
+ expect(query.global).toBe(true);
+ expect(query.ignoreCase).toBe(false);
+ });
+});
diff --git a/devtools/client/debugger/src/utils/tests/clipboard.spec.js b/devtools/client/debugger/src/utils/tests/clipboard.spec.js
new file mode 100644
index 0000000000..dcba730149
--- /dev/null
+++ b/devtools/client/debugger/src/utils/tests/clipboard.spec.js
@@ -0,0 +1,45 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { copyToTheClipboard } from "../clipboard";
+
+let clipboardTestCopyString, expectedCopyEvent;
+const addEventListener = jest.fn();
+const execCommand = jest.fn();
+const removeEventListener = jest.fn();
+
+describe("copyToTheClipboard()", () => {
+ beforeEach(() => {
+ expectedCopyEvent = "copy";
+ clipboardTestCopyString = "content intended for clipboard";
+
+ global.document.addEventListener = addEventListener;
+ global.document.execCommand = execCommand;
+ global.document.removeEventListener = removeEventListener;
+ });
+
+ it("listens for 'copy' event", () => {
+ copyToTheClipboard(clipboardTestCopyString);
+
+ expect(document.addEventListener).toHaveBeenCalledWith(
+ expectedCopyEvent,
+ expect.anything()
+ );
+ });
+
+ it("calls document.execCommand() with 'copy' command", () => {
+ copyToTheClipboard(clipboardTestCopyString);
+
+ expect(execCommand).toHaveBeenCalledWith(expectedCopyEvent, false, null);
+ });
+
+ it("removes event listener for 'copy' event", () => {
+ copyToTheClipboard(clipboardTestCopyString);
+
+ expect(document.removeEventListener).toHaveBeenCalledWith(
+ expectedCopyEvent,
+ expect.anything()
+ );
+ });
+});
diff --git a/devtools/client/debugger/src/utils/tests/expressions.spec.js b/devtools/client/debugger/src/utils/tests/expressions.spec.js
new file mode 100644
index 0000000000..b7c91c4e07
--- /dev/null
+++ b/devtools/client/debugger/src/utils/tests/expressions.spec.js
@@ -0,0 +1,67 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import {
+ wrapExpression,
+ getExpressionResultGripAndFront,
+} from "../expressions";
+import { makeMockExpression } from "../test-mockup";
+
+function createError(type, preview) {
+ return makeMockExpression({
+ result: { getGrip: () => ({ class: type, isError: true, preview }) },
+ });
+}
+
+describe("expressions", () => {
+ describe("wrap expression", () => {
+ it("should wrap an expression", () => {
+ expect(wrapExpression("foo")).toMatchSnapshot();
+ });
+
+ it("should wrap expression with a comment", () => {
+ expect(wrapExpression("foo // yo yo")).toMatchSnapshot();
+ });
+
+ it("should wrap quotes", () => {
+ expect(wrapExpression('"2"')).toMatchSnapshot();
+ });
+ });
+
+ describe("sanitize input", () => {
+ it("sanitizes quotes", () => {
+ expect('foo"').toEqual('foo"');
+ });
+
+ it("sanitizes 2 quotes", () => {
+ expect('"3"').toEqual('"3"');
+ });
+
+ it("evaluates \\u{61} as a", () => {
+ expect("\u{61}").toEqual("a");
+ });
+
+ it("evaluates N\\u{61}N as NaN", () => {
+ expect("N\u{61}N").toEqual("NaN");
+ });
+ });
+
+ describe("getValue", () => {
+ it("Reference Errors should be shown as (unavailable)", () => {
+ const { expressionResultGrip } = getExpressionResultGripAndFront(
+ createError("ReferenceError", { name: "ReferenceError" })
+ );
+ expect(expressionResultGrip).toEqual({
+ unavailable: true,
+ });
+ });
+
+ it("Errors messages should be shown", () => {
+ const { expressionResultGrip } = getExpressionResultGripAndFront(
+ createError("Error", { name: "Foo", message: "YO" })
+ );
+ expect(expressionResultGrip).toEqual("Foo: YO");
+ });
+ });
+});
diff --git a/devtools/client/debugger/src/utils/tests/function.spec.js b/devtools/client/debugger/src/utils/tests/function.spec.js
new file mode 100644
index 0000000000..db77736ab5
--- /dev/null
+++ b/devtools/client/debugger/src/utils/tests/function.spec.js
@@ -0,0 +1,61 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { findFunctionText } from "../function";
+
+import { getFunctionSymbols } from "../../workers/parser/getSymbols";
+import { populateOriginalSource } from "../../workers/parser/tests/helpers";
+
+describe("function", () => {
+ describe("findFunctionText", () => {
+ it("finds function", () => {
+ const source = populateOriginalSource("func");
+ const functions = getFunctionSymbols(source.id);
+ const text = findFunctionText(14, source, source.content, { functions });
+ expect(text).toMatchSnapshot();
+ });
+
+ it("finds function signature", () => {
+ const source = populateOriginalSource("func");
+ const functions = getFunctionSymbols(source.id);
+
+ const text = findFunctionText(13, source, source.content, { functions });
+ expect(text).toMatchSnapshot();
+ });
+
+ it("misses function closing brace", () => {
+ const source = populateOriginalSource("func");
+ const functions = getFunctionSymbols(source.id);
+
+ const text = findFunctionText(15, source, source.content, { functions });
+
+ // TODO: we should try and match the closing bracket.
+ expect(text).toEqual(null);
+ });
+
+ it("finds property function", () => {
+ const source = populateOriginalSource("func");
+ const functions = getFunctionSymbols(source.id);
+
+ const text = findFunctionText(29, source, source.content, { functions });
+ expect(text).toMatchSnapshot();
+ });
+
+ it("finds class function", () => {
+ const source = populateOriginalSource("func");
+ const functions = getFunctionSymbols(source.id);
+
+ const text = findFunctionText(33, source, source.content, { functions });
+ expect(text).toMatchSnapshot();
+ });
+
+ it("cant find function", () => {
+ const source = populateOriginalSource("func");
+ const functions = getFunctionSymbols(source.id);
+
+ const text = findFunctionText(20, source, source.content, { functions });
+ expect(text).toEqual(null);
+ });
+ });
+});
diff --git a/devtools/client/debugger/src/utils/tests/indentation.spec.js b/devtools/client/debugger/src/utils/tests/indentation.spec.js
new file mode 100644
index 0000000000..5ee7419371
--- /dev/null
+++ b/devtools/client/debugger/src/utils/tests/indentation.spec.js
@@ -0,0 +1,61 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { correctIndentation, getIndentation } from "../indentation";
+
+describe("indentation", () => {
+ it("simple", () => {
+ expect(
+ correctIndentation(`
+ foo
+ `)
+ ).toMatchSnapshot();
+ });
+
+ it("one line", () => {
+ expect(correctIndentation("foo")).toMatchSnapshot();
+ });
+
+ it("one function", () => {
+ const text = `
+ function foo() {
+ console.log("yo")
+ }
+ `;
+
+ expect(correctIndentation(text)).toMatchSnapshot();
+ });
+
+ it("try catch", () => {
+ const text = `
+ try {
+ console.log("yo")
+ } catch (e) {
+ console.log("yo")
+ }
+ `;
+
+ expect(correctIndentation(text)).toMatchSnapshot();
+ });
+
+ it("mad indentation", () => {
+ const text = `
+ try {
+ console.log("yo")
+ } catch (e) {
+ console.log("yo")
+ }
+ `;
+
+ expect(correctIndentation(text)).toMatchSnapshot();
+ });
+});
+
+describe("indentation length", () => {
+ it("leading spaces", () => {
+ const line = " console.log('Hello World');";
+
+ expect(getIndentation(line)).toEqual(16);
+ });
+});
diff --git a/devtools/client/debugger/src/utils/tests/isMinified.spec.js b/devtools/client/debugger/src/utils/tests/isMinified.spec.js
new file mode 100644
index 0000000000..1c49f96737
--- /dev/null
+++ b/devtools/client/debugger/src/utils/tests/isMinified.spec.js
@@ -0,0 +1,18 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { isMinified } from "../isMinified";
+import { makeMockSourceWithContent } from "../test-mockup";
+
+describe("isMinified", () => {
+ it("no indents", () => {
+ const sourceWithContent = makeMockSourceWithContent(
+ undefined,
+ undefined,
+ undefined,
+ "function base(boo) {\n}"
+ );
+ expect(isMinified(sourceWithContent, sourceWithContent.content)).toBe(true);
+ });
+});
diff --git a/devtools/client/debugger/src/utils/tests/location.spec.js b/devtools/client/debugger/src/utils/tests/location.spec.js
new file mode 100644
index 0000000000..2be71f3cae
--- /dev/null
+++ b/devtools/client/debugger/src/utils/tests/location.spec.js
@@ -0,0 +1,31 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { sortSelectedLocations } from "../location";
+
+function loc(line, column) {
+ return {
+ location: { sourceId: "foo", line, column },
+ generatedLocation: { sourceId: "foo", line, column },
+ };
+}
+describe("location.spec.js", () => {
+ it("sorts lines", () => {
+ const a = loc(3, 5);
+ const b = loc(1, 10);
+ expect(sortSelectedLocations([a, b], { id: "foo" })).toEqual([b, a]);
+ });
+
+ it("sorts columns", () => {
+ const a = loc(3, 10);
+ const b = loc(3, 5);
+ expect(sortSelectedLocations([a, b], { id: "foo" })).toEqual([b, a]);
+ });
+
+ it("prioritizes undefined columns", () => {
+ const a = loc(3, 10);
+ const b = loc(3, undefined);
+ expect(sortSelectedLocations([a, b], { id: "foo" })).toEqual([b, a]);
+ });
+});
diff --git a/devtools/client/debugger/src/utils/tests/log.spec.js b/devtools/client/debugger/src/utils/tests/log.spec.js
new file mode 100644
index 0000000000..ea7e4ca4d2
--- /dev/null
+++ b/devtools/client/debugger/src/utils/tests/log.spec.js
@@ -0,0 +1,35 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { prefs } from "../prefs";
+import { log } from "../log.js";
+
+let logArgFirst, logArgSecond, logArgArray;
+
+describe("log()", () => {
+ beforeEach(() => {
+ logArgFirst = "my info";
+ logArgSecond = "my other info";
+ logArgArray = [logArgFirst, logArgSecond];
+ global.console = { log: jest.fn() };
+ });
+
+ afterEach(() => {
+ prefs.logging = false;
+ });
+
+ describe("when logging pref is true", () => {
+ it("prints arguments", () => {
+ prefs.logging = true;
+ log(logArgArray);
+
+ expect(global.console.log).toHaveBeenCalledWith(logArgArray);
+ });
+
+ it("does not print by default", () => {
+ log(logArgArray);
+ expect(global.console.log).not.toHaveBeenCalled();
+ });
+ });
+});
diff --git a/devtools/client/debugger/src/utils/tests/memoize.spec.js b/devtools/client/debugger/src/utils/tests/memoize.spec.js
new file mode 100644
index 0000000000..fb72958516
--- /dev/null
+++ b/devtools/client/debugger/src/utils/tests/memoize.spec.js
@@ -0,0 +1,48 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import memoize from "../memoize";
+
+const a = { number: 3 };
+const b = { number: 4 };
+const c = { number: 5 };
+const d = { number: 6 };
+
+function add(...numberObjects) {
+ return numberObjects.reduce((prev, cur) => prev + cur.number, 0);
+}
+
+describe("memozie", () => {
+ it("should work for one arg as key", () => {
+ const mAdd = memoize(add);
+ mAdd(a);
+ expect(mAdd(a)).toEqual(3);
+ mAdd(b);
+ expect(mAdd(b)).toEqual(4);
+ });
+
+ it("should only be called once", () => {
+ const spy = jest.fn(() => 2);
+ const mAdd = memoize(spy);
+
+ mAdd(a);
+ mAdd(a);
+ mAdd(a);
+ expect(spy).toHaveBeenCalledTimes(1);
+ });
+
+ it("should work for two args as key", () => {
+ const mAdd = memoize(add);
+ expect(mAdd(a, b)).toEqual(7);
+ expect(mAdd(a, b)).toEqual(7);
+ expect(mAdd(a, c)).toEqual(8);
+ });
+
+ it("should work with many args as key", () => {
+ const mAdd = memoize(add);
+ expect(mAdd(a, b, c)).toEqual(12);
+ expect(mAdd(a, b, d)).toEqual(13);
+ expect(mAdd(a, b, c)).toEqual(12);
+ });
+});
diff --git a/devtools/client/debugger/src/utils/tests/memoizeLast.spec.js b/devtools/client/debugger/src/utils/tests/memoizeLast.spec.js
new file mode 100644
index 0000000000..a5622510e3
--- /dev/null
+++ b/devtools/client/debugger/src/utils/tests/memoizeLast.spec.js
@@ -0,0 +1,31 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { memoizeLast } from "../memoizeLast";
+
+const a = { number: 3 };
+const b = { number: 4 };
+
+function add(...numberObjects) {
+ return numberObjects.reduce((prev, cur) => prev + cur.number, 0);
+}
+
+describe("memozie", () => {
+ it("should re-calculate when a value changes", () => {
+ const mAdd = memoizeLast(add);
+ mAdd(a);
+ expect(mAdd(a)).toEqual(3);
+ mAdd(b);
+ expect(mAdd(b)).toEqual(4);
+ });
+
+ it("should only run once", () => {
+ const mockAdd = jest.fn(add);
+ const mAdd = memoizeLast(mockAdd);
+ mAdd(a);
+ mAdd(a);
+
+ expect(mockAdd.mock.calls[0]).toEqual([{ number: 3 }]);
+ });
+});
diff --git a/devtools/client/debugger/src/utils/tests/path.spec.js b/devtools/client/debugger/src/utils/tests/path.spec.js
new file mode 100644
index 0000000000..58bdf046f0
--- /dev/null
+++ b/devtools/client/debugger/src/utils/tests/path.spec.js
@@ -0,0 +1,49 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { basename, dirname, isURL, isAbsolute, join } from "../path";
+
+const fullTestURL = "https://www.example.com/some/endpoint";
+const absoluteTestPath = "/some/absolute/path/to/resource";
+const aTestName = "name";
+
+describe("basename()", () => {
+ it("returns the basename of the path", () => {
+ expect(basename(fullTestURL)).toBe("endpoint");
+ });
+});
+
+describe("dirname()", () => {
+ it("returns the current directory in a path", () => {
+ expect(dirname(fullTestURL)).toBe("https://www.example.com/some");
+ });
+});
+
+describe("isURL()", () => {
+ it("returns true if a string contains characters denoting a scheme", () => {
+ expect(isURL(fullTestURL)).toBe(true);
+ });
+
+ it("returns false if string does not denote a scheme", () => {
+ expect(isURL(absoluteTestPath)).toBe(false);
+ });
+});
+
+describe("isAbsolute()", () => {
+ it("returns true if a string begins with a slash", () => {
+ expect(isAbsolute(absoluteTestPath)).toBe(true);
+ });
+
+ it("returns false if a string does not begin with a slash", () => {
+ expect(isAbsolute(fullTestURL)).toBe(false);
+ });
+});
+
+describe("join()", () => {
+ it("concatenates a base path and a directory name", () => {
+ expect(join(absoluteTestPath, aTestName)).toBe(
+ "/some/absolute/path/to/resource/name"
+ );
+ });
+});
diff --git a/devtools/client/debugger/src/utils/tests/quick-open.spec.js b/devtools/client/debugger/src/utils/tests/quick-open.spec.js
new file mode 100644
index 0000000000..66cceb6825
--- /dev/null
+++ b/devtools/client/debugger/src/utils/tests/quick-open.spec.js
@@ -0,0 +1,35 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import cases from "jest-in-case";
+import { parseQuickOpenQuery, parseLineColumn } from "../quick-open";
+
+cases(
+ "parseQuickOpenQuery utility",
+ ({ type, query }) => expect(parseQuickOpenQuery(query)).toEqual(type),
+ [
+ { name: "empty query defaults to sources", type: "sources", query: "" },
+ { name: "sources query", type: "sources", query: "test" },
+ { name: "functions query", type: "functions", query: "@test" },
+ { name: "variables query", type: "variables", query: "#test" },
+ { name: "goto line", type: "goto", query: ":30" },
+ { name: "goto line:column", type: "goto", query: ":30:60" },
+ { name: "goto source line", type: "gotoSource", query: "test:30:60" },
+ { name: "shortcuts", type: "shortcuts", query: "?" },
+ ]
+);
+
+cases(
+ "parseLineColumn utility",
+ ({ query, location }) => expect(parseLineColumn(query)).toEqual(location),
+ [
+ { name: "empty query", query: "", location: null },
+ { name: "just line", query: ":30", location: { line: 30 } },
+ {
+ name: "line and column",
+ query: ":30:90",
+ location: { column: 89, line: 30 },
+ },
+ ]
+);
diff --git a/devtools/client/debugger/src/utils/tests/result-list.spec.js b/devtools/client/debugger/src/utils/tests/result-list.spec.js
new file mode 100644
index 0000000000..dcbaf421c5
--- /dev/null
+++ b/devtools/client/debugger/src/utils/tests/result-list.spec.js
@@ -0,0 +1,32 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { scrollList } from "../result-list.js";
+
+describe("scrollList", () => {
+ beforeEach(() => {
+ jest.useFakeTimers();
+ });
+
+ /* eslint-disable jest/expect-expect */
+ it("just returns if element not found", () => {
+ const li = document.createElement("li");
+ scrollList([li], 1);
+ });
+ /* eslint-enable jest/expect-expect */
+
+ it("calls scrollIntoView", () => {
+ const ul = document.createElement("ul");
+ const li = document.createElement("li");
+
+ li.scrollIntoView = jest.fn();
+ ul.appendChild(li);
+
+ scrollList([li], 0);
+
+ jest.runAllTimers();
+
+ expect(li.scrollIntoView).toHaveBeenCalled();
+ });
+});
diff --git a/devtools/client/debugger/src/utils/tests/source.spec.js b/devtools/client/debugger/src/utils/tests/source.spec.js
new file mode 100644
index 0000000000..484c8ce570
--- /dev/null
+++ b/devtools/client/debugger/src/utils/tests/source.spec.js
@@ -0,0 +1,367 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import {
+ getFilename,
+ getTruncatedFileName,
+ getFileURL,
+ getDisplayPath,
+ getSourceLineCount,
+ isJavaScript,
+ isDescendantOfRoot,
+ removeThreadActorId,
+ isUrlExtension,
+ getLineText,
+} from "../source.js";
+
+import {
+ makeMockSource,
+ makeMockSourceWithContent,
+ makeMockSourceAndContent,
+ makeMockWasmSourceWithContent,
+ makeMockThread,
+ makeFullfilledMockSourceContent,
+} from "../test-mockup";
+import { isFulfilled } from "../async-value.js";
+
+describe("sources", () => {
+ const unicode = "\u6e2c";
+ const encodedUnicode = encodeURIComponent(unicode);
+
+ describe("getFilename", () => {
+ it("should give us a default of (index)", () => {
+ expect(
+ getFilename(makeMockSource("http://localhost.com:7999/increment/"))
+ ).toBe("(index)");
+ });
+ it("should give us the filename", () => {
+ expect(
+ getFilename(
+ makeMockSource("http://localhost.com:7999/increment/hello.html")
+ )
+ ).toBe("hello.html");
+ });
+ it("should give us the readable Unicode filename if encoded", () => {
+ expect(
+ getFilename(
+ makeMockSource(
+ `http://localhost.com:7999/increment/${encodedUnicode}.html`
+ )
+ )
+ ).toBe(`${unicode}.html`);
+ });
+ it("should give us the filename excluding the query strings", () => {
+ expect(
+ getFilename(
+ makeMockSource(
+ "http://localhost.com:7999/increment/hello.html?query_strings"
+ )
+ )
+ ).toBe("hello.html");
+ });
+ it("should give us the proper filename for pretty files", () => {
+ expect(
+ getFilename(
+ makeMockSource(
+ "http://localhost.com:7999/increment/hello.html:formatted"
+ )
+ )
+ ).toBe("hello.html");
+ });
+ });
+
+ describe("getTruncatedFileName", () => {
+ it("should truncate the file name when it is more than 30 chars", () => {
+ expect(
+ getTruncatedFileName(
+ makeMockSource(
+ "really-really-really-really-really-really-long-name.html"
+ ),
+ "",
+ 30
+ )
+ ).toBe("really-really…long-name.html");
+ });
+ it("should first decode the filename and then truncate it", () => {
+ expect(
+ getTruncatedFileName(
+ makeMockSource(`${encodedUnicode.repeat(30)}.html`),
+ "",
+ 30
+ )
+ ).toBe("測測測測測測測測測測測測測…測測測測測測測測測.html");
+ });
+ });
+
+ describe("getDisplayPath", () => {
+ it("should give us the path for files with same name", () => {
+ const sources = [
+ makeMockSource("http://localhost.com:7999/increment/xyz/hello.html"),
+ makeMockSource("http://localhost.com:7999/increment/abc/hello.html"),
+ makeMockSource("http://localhost.com:7999/increment/hello.html"),
+ ];
+ expect(
+ getDisplayPath(
+ makeMockSource("http://localhost.com:7999/increment/abc/hello.html"),
+ sources
+ )
+ ).toBe("abc");
+ });
+
+ it(`should give us the path for files with same name
+ in directories with same name`, () => {
+ const sources = [
+ makeMockSource(
+ "http://localhost.com:7999/increment/xyz/web/hello.html"
+ ),
+ makeMockSource(
+ "http://localhost.com:7999/increment/abc/web/hello.html"
+ ),
+ makeMockSource("http://localhost.com:7999/increment/hello.html"),
+ ];
+ expect(
+ getDisplayPath(
+ makeMockSource(
+ "http://localhost.com:7999/increment/abc/web/hello.html"
+ ),
+ sources
+ )
+ ).toBe("abc/web");
+ });
+
+ it("should give no path for files with unique name", () => {
+ const sources = [
+ makeMockSource("http://localhost.com:7999/increment/xyz.html"),
+ makeMockSource("http://localhost.com:7999/increment/abc.html"),
+ makeMockSource("http://localhost.com:7999/increment/hello.html"),
+ ];
+ expect(
+ getDisplayPath(
+ makeMockSource("http://localhost.com:7999/increment/abc/web.html"),
+ sources
+ )
+ ).toBe(undefined);
+ });
+ it("should not show display path for pretty file", () => {
+ const sources = [
+ makeMockSource("http://localhost.com:7999/increment/abc/web/hell.html"),
+ makeMockSource(
+ "http://localhost.com:7999/increment/abc/web/hello.html"
+ ),
+ makeMockSource(
+ "http://localhost.com:7999/increment/xyz.html:formatted"
+ ),
+ ];
+ expect(
+ getDisplayPath(
+ makeMockSource(
+ "http://localhost.com:7999/increment/abc/web/hello.html:formatted"
+ ),
+ sources
+ )
+ ).toBe(undefined);
+ });
+ it(`should give us the path for files with same name when both
+ are pretty and different path`, () => {
+ const sources = [
+ makeMockSource(
+ "http://localhost.com:7999/increment/xyz/web/hello.html:formatted"
+ ),
+ makeMockSource(
+ "http://localhost.com:7999/increment/abc/web/hello.html:formatted"
+ ),
+ makeMockSource(
+ "http://localhost.com:7999/increment/hello.html:formatted"
+ ),
+ ];
+ expect(
+ getDisplayPath(
+ makeMockSource(
+ "http://localhost.com:7999/increment/abc/web/hello.html:formatted"
+ ),
+ sources
+ )
+ ).toBe("abc/web");
+ });
+ });
+
+ describe("getFileURL", () => {
+ it("should give us the file url", () => {
+ expect(
+ getFileURL(
+ makeMockSource("http://localhost.com:7999/increment/hello.html")
+ )
+ ).toBe("http://localhost.com:7999/increment/hello.html");
+ });
+ it("should truncate the file url when it is more than 50 chars", () => {
+ expect(
+ getFileURL(
+ makeMockSource("http://localhost-long.com:7999/increment/hello.html")
+ )
+ ).toBe("…ttp://localhost-long.com:7999/increment/hello.html");
+ });
+ it("should first decode the file URL and then truncate it", () => {
+ expect(
+ getFileURL(makeMockSource(`http://${encodedUnicode.repeat(39)}.html`))
+ ).toBe(`…ttp://${unicode.repeat(39)}.html`);
+ });
+ });
+
+ describe("isJavaScript", () => {
+ it("is not JavaScript", () => {
+ {
+ const source = makeMockSourceAndContent("foo.html", undefined, "");
+ expect(isJavaScript(source, source.content)).toBe(false);
+ }
+ {
+ const source = makeMockSourceAndContent(
+ undefined,
+ undefined,
+ "text/html"
+ );
+ expect(isJavaScript(source, source.content)).toBe(false);
+ }
+ });
+
+ it("is JavaScript", () => {
+ {
+ const source = makeMockSourceAndContent("foo.js");
+ expect(isJavaScript(source, source.content)).toBe(true);
+ }
+ {
+ const source = makeMockSourceAndContent("bar.jsm");
+ expect(isJavaScript(source, source.content)).toBe(true);
+ }
+ {
+ const source = makeMockSourceAndContent(
+ undefined,
+ undefined,
+ "text/javascript"
+ );
+ expect(isJavaScript(source, source.content)).toBe(true);
+ }
+ {
+ const source = makeMockSourceAndContent(
+ undefined,
+ undefined,
+ "application/javascript"
+ );
+ expect(isJavaScript(source, source.content)).toBe(true);
+ }
+ });
+ });
+
+ describe("getSourceLineCount", () => {
+ it("should give us the amount bytes for wasm source", () => {
+ const { content } = makeMockWasmSourceWithContent({
+ binary: "\x00asm\x01\x00\x00\x00",
+ });
+ expect(getSourceLineCount(content.value)).toEqual(8);
+ });
+
+ it("should give us the amout of lines for js source", () => {
+ const { content } = makeMockSourceWithContent(
+ undefined,
+ undefined,
+ "text/javascript",
+ "function foo(){\n}"
+ );
+ if (!content || !isFulfilled(content)) {
+ throw new Error("Unexpected content value");
+ }
+ expect(getSourceLineCount(content.value)).toEqual(2);
+ });
+ });
+
+ describe("isDescendantOfRoot", () => {
+ const threads = [
+ makeMockThread({ actor: "server0.conn1.child1/thread19" }),
+ ];
+
+ it("should detect normal source urls", () => {
+ const source = makeMockSource(
+ "resource://activity-stream/vendor/react.js"
+ );
+ const rootWithoutThreadActor = removeThreadActorId(
+ "resource://activity-stream",
+ threads
+ );
+ expect(isDescendantOfRoot(source, rootWithoutThreadActor)).toBe(true);
+ });
+
+ it("should detect source urls under chrome:// as root", () => {
+ const source = makeMockSource(
+ "chrome://browser/content/contentSearchUI.js"
+ );
+ const rootWithoutThreadActor = removeThreadActorId("chrome://", threads);
+ expect(isDescendantOfRoot(source, rootWithoutThreadActor)).toBe(true);
+ });
+
+ it("should detect source urls if root is a thread actor Id", () => {
+ const source = makeMockSource(
+ "resource://activity-stream/vendor/react-dom.js"
+ );
+ const rootWithoutThreadActor = removeThreadActorId(
+ "server0.conn1.child1/thread19",
+ threads
+ );
+ expect(isDescendantOfRoot(source, rootWithoutThreadActor)).toBe(true);
+ });
+ });
+
+ describe("isUrlExtension", () => {
+ it("should detect mozilla extension", () => {
+ expect(isUrlExtension("moz-extension://id/js/content.js")).toBe(true);
+ });
+ it("should detect chrome extension", () => {
+ expect(isUrlExtension("chrome-extension://id/js/content.js")).toBe(true);
+ });
+ it("should return false for non-extension assets", () => {
+ expect(isUrlExtension("https://example.org/init.js")).toBe(false);
+ });
+ });
+
+ describe("getLineText", () => {
+ it("first line", () => {
+ const text = getLineText(
+ "fake-source",
+ makeFullfilledMockSourceContent("aaa\nbbb\nccc"),
+ 1
+ );
+
+ expect(text).toEqual("aaa");
+ });
+
+ it("last line", () => {
+ const text = getLineText(
+ "fake-source",
+ makeFullfilledMockSourceContent("aaa\nbbb\nccc"),
+ 3
+ );
+
+ expect(text).toEqual("ccc");
+ });
+
+ it("one line", () => {
+ const text = getLineText(
+ "fake-source",
+ makeFullfilledMockSourceContent("aaa"),
+ 1
+ );
+
+ expect(text).toEqual("aaa");
+ });
+
+ it("bad line", () => {
+ const text = getLineText(
+ "fake-source",
+ makeFullfilledMockSourceContent("aaa\nbbb\nccc"),
+
+ 5
+ );
+
+ expect(text).toEqual("");
+ });
+ });
+});
diff --git a/devtools/client/debugger/src/utils/tests/telemetry.spec.js b/devtools/client/debugger/src/utils/tests/telemetry.spec.js
new file mode 100644
index 0000000000..7223641afd
--- /dev/null
+++ b/devtools/client/debugger/src/utils/tests/telemetry.spec.js
@@ -0,0 +1,13 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { recordEvent } from "../telemetry";
+
+describe("telemetry.recordEvent()", () => {
+ it("Receives the correct telemetry information", () => {
+ recordEvent("foo", { bar: 1 });
+
+ expect(window.dbg._telemetry.events.foo).toStrictEqual([{ bar: 1 }]);
+ });
+});
diff --git a/devtools/client/debugger/src/utils/tests/text.spec.js b/devtools/client/debugger/src/utils/tests/text.spec.js
new file mode 100644
index 0000000000..5786bc6232
--- /dev/null
+++ b/devtools/client/debugger/src/utils/tests/text.spec.js
@@ -0,0 +1,20 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { truncateMiddleText } from "../text";
+
+describe("text", () => {
+ it("should truncate the text in the middle", () => {
+ const sourceText = "this is a very long text and ends here";
+ expect(truncateMiddleText(sourceText, 30)).toMatch(
+ "this is a ver… and ends here"
+ );
+ });
+ it("should keep the text as it is", () => {
+ const sourceText = "this is a short text ends here";
+ expect(truncateMiddleText(sourceText, 30)).toMatch(
+ "this is a short text ends here"
+ );
+ });
+});
diff --git a/devtools/client/debugger/src/utils/tests/ui.spec.js b/devtools/client/debugger/src/utils/tests/ui.spec.js
new file mode 100644
index 0000000000..aa091e6798
--- /dev/null
+++ b/devtools/client/debugger/src/utils/tests/ui.spec.js
@@ -0,0 +1,15 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { isVisible } from "../ui";
+
+describe("ui", () => {
+ it("should return #mount width", () => {
+ if (!document.body) {
+ throw new Error("no document body");
+ }
+ document.body.innerHTML = "<div id='mount'></div>";
+ expect(isVisible()).toBe(false);
+ });
+});
diff --git a/devtools/client/debugger/src/utils/tests/url.spec.js b/devtools/client/debugger/src/utils/tests/url.spec.js
new file mode 100644
index 0000000000..d842acf7db
--- /dev/null
+++ b/devtools/client/debugger/src/utils/tests/url.spec.js
@@ -0,0 +1,89 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { parse } from "../url";
+
+describe("url", () => {
+ describe("parse", () => {
+ it("parses an absolute URL", () => {
+ const val = parse("http://example.com:8080/path/file.js");
+
+ expect(val.protocol).toBe("http:");
+ expect(val.host).toBe("example.com:8080");
+ expect(val.pathname).toBe("/path/file.js");
+ expect(val.search).toBe("");
+ expect(val.hash).toBe("");
+ });
+
+ it("parses an absolute URL with query params", () => {
+ const val = parse("http://example.com:8080/path/file.js?param");
+
+ expect(val.protocol).toBe("http:");
+ expect(val.host).toBe("example.com:8080");
+ expect(val.pathname).toBe("/path/file.js");
+ expect(val.search).toBe("?param");
+ expect(val.hash).toBe("");
+ });
+
+ it("parses an absolute URL with a fragment", () => {
+ const val = parse("http://example.com:8080/path/file.js#hash");
+
+ expect(val.protocol).toBe("http:");
+ expect(val.host).toBe("example.com:8080");
+ expect(val.pathname).toBe("/path/file.js");
+ expect(val.search).toBe("");
+ expect(val.hash).toBe("#hash");
+ });
+
+ it("parses an absolute URL with query params and a fragment", () => {
+ const val = parse("http://example.com:8080/path/file.js?param#hash");
+
+ expect(val.protocol).toBe("http:");
+ expect(val.host).toBe("example.com:8080");
+ expect(val.pathname).toBe("/path/file.js");
+ expect(val.search).toBe("?param");
+ expect(val.hash).toBe("#hash");
+ });
+
+ it("parses a partial URL", () => {
+ const val = parse("/path/file.js");
+
+ expect(val.protocol).toBe("");
+ expect(val.host).toBe("");
+ expect(val.pathname).toBe("/path/file.js");
+ expect(val.search).toBe("");
+ expect(val.hash).toBe("");
+ });
+
+ it("parses a partial URL with query params", () => {
+ const val = parse("/path/file.js?param");
+
+ expect(val.protocol).toBe("");
+ expect(val.host).toBe("");
+ expect(val.pathname).toBe("/path/file.js");
+ expect(val.search).toBe("?param");
+ expect(val.hash).toBe("");
+ });
+
+ it("parses a partial URL with a fragment", () => {
+ const val = parse("/path/file.js#hash");
+
+ expect(val.protocol).toBe("");
+ expect(val.host).toBe("");
+ expect(val.pathname).toBe("/path/file.js");
+ expect(val.search).toBe("");
+ expect(val.hash).toBe("#hash");
+ });
+
+ it("parses a partial URL with query params and a fragment", () => {
+ const val = parse("/path/file.js?param#hash");
+
+ expect(val.protocol).toBe("");
+ expect(val.host).toBe("");
+ expect(val.pathname).toBe("/path/file.js");
+ expect(val.search).toBe("?param");
+ expect(val.hash).toBe("#hash");
+ });
+ });
+});
diff --git a/devtools/client/debugger/src/utils/tests/utils.spec.js b/devtools/client/debugger/src/utils/tests/utils.spec.js
new file mode 100644
index 0000000000..f358ffc42a
--- /dev/null
+++ b/devtools/client/debugger/src/utils/tests/utils.spec.js
@@ -0,0 +1,87 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { handleError, promisify, endTruncateStr, waitForMs } from "../utils";
+
+describe("handleError()", () => {
+ const testErrorText = "ERROR: ";
+ const testErrorObject = { oh: "noes" };
+
+ beforeEach(() => {
+ global.console = { log: jest.fn() };
+ });
+
+ it("logs error text with error value", () => {
+ handleError(testErrorObject);
+
+ expect(console.log).toHaveBeenCalledWith(testErrorText, testErrorObject);
+ });
+});
+
+describe("promisify()", () => {
+ let testPromise, testContext, testMethod, testArgs;
+
+ beforeEach(() => {
+ testContext = {};
+ testMethod = jest.fn();
+ testArgs = [];
+ });
+
+ it("returns a Promise", () => {
+ testPromise = promisify(testContext, testMethod, testArgs);
+
+ expect(testPromise instanceof Promise).toBe(true);
+ });
+
+ it("applies promisified method", () => {
+ testPromise = promisify(testContext, testMethod, testArgs);
+
+ expect(testMethod).toHaveBeenCalledWith(testArgs, expect.anything());
+ });
+});
+
+describe("endTruncateStr()", () => {
+ let testString;
+ const testSize = 11;
+
+ describe("when the string is larger than the specified size", () => {
+ it("returns an elipsis and characters at the end of the string", () => {
+ testString = "Mozilla Firefox is my favorite web browser";
+
+ expect(endTruncateStr(testString, testSize)).toBe("…web browser");
+ });
+ });
+
+ describe("when the string is not larger than the specified size", () => {
+ it("returns the string unchanged", () => {
+ testString = "Firefox";
+
+ expect(endTruncateStr(testString, testSize)).toBe(testString);
+ });
+ });
+});
+
+describe("waitForMs()", () => {
+ let testPromise;
+ const testMilliseconds = 10;
+
+ beforeEach(() => {
+ global.setTimeout = jest.fn();
+ });
+
+ it("returns a Promise", () => {
+ testPromise = waitForMs(testMilliseconds);
+
+ expect(testPromise instanceof Promise).toBe(true);
+ });
+
+ it("calls setTimeout() on the resolve of the Promise", () => {
+ testPromise = waitForMs(testMilliseconds);
+
+ expect(setTimeout).toHaveBeenCalledWith(
+ expect.anything(),
+ testMilliseconds
+ );
+ });
+});
diff --git a/devtools/client/debugger/src/utils/tests/wasm.spec.js b/devtools/client/debugger/src/utils/tests/wasm.spec.js
new file mode 100644
index 0000000000..6cf3b1083b
--- /dev/null
+++ b/devtools/client/debugger/src/utils/tests/wasm.spec.js
@@ -0,0 +1,96 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import {
+ isWasm,
+ lineToWasmOffset,
+ wasmOffsetToLine,
+ clearWasmStates,
+ renderWasmText,
+} from "../wasm.js";
+
+import { makeMockWasmSourceWithContent } from "../test-mockup";
+
+describe("wasm", () => {
+ // Compiled version of `(module (func (nop)))`
+ const SIMPLE_WASM = {
+ binary:
+ "\x00asm\x01\x00\x00\x00\x01\x84\x80\x80\x80\x00\x01`\x00\x00" +
+ "\x03\x82\x80\x80\x80\x00\x01\x00\x06\x81\x80\x80\x80\x00\x00" +
+ "\n\x89\x80\x80\x80\x00\x01\x83\x80\x80\x80\x00\x00\x01\v",
+ };
+
+ // malformed binary which contains an unknown operator (\x09) which
+ // should cause the wasm parser to throw.
+ const MALFORMED_SIMPLE_WASM = {
+ binary:
+ "\x00asm\x01\x00\x00\x00\x09\x84\x80\x80\x80\x00\x01`\x00\x00" +
+ "\x03\x82\x80\x80\x80\x00\x01\x00\x06\x81\x80\x80\x80\x00\x00" +
+ "\n\x89\x80\x80\x80\x00\x01\x83\x80\x80\x80\x00\x00\x01\v",
+ };
+
+ const SIMPLE_WASM_TEXT = `(module
+ (func $func0
+ nop
+ )
+)`;
+ const SIMPLE_WASM_NOP_TEXT_LINE = 2;
+ const SIMPLE_WASM_NOP_OFFSET = 46;
+
+ describe("isWasm", () => {
+ it("should give us the false when wasm text was not registered", () => {
+ const sourceId = "source.0";
+ expect(isWasm(sourceId)).toEqual(false);
+ });
+ it("should give us the true when wasm text was registered", () => {
+ const source = makeMockWasmSourceWithContent(SIMPLE_WASM);
+ renderWasmText(source.id, source.content.value);
+ expect(isWasm(source.id)).toEqual(true);
+ // clear shall remove
+ clearWasmStates();
+ expect(isWasm(source.id)).toEqual(false);
+ });
+ });
+
+ describe("renderWasmText", () => {
+ it("render simple wasm", () => {
+ const source = makeMockWasmSourceWithContent(SIMPLE_WASM);
+ const lines = renderWasmText(source.id, source.content.value);
+ expect(lines.join("\n")).toEqual(SIMPLE_WASM_TEXT);
+ clearWasmStates();
+ });
+
+ it("should return error information when the parser throws", () => {
+ const source = makeMockWasmSourceWithContent(MALFORMED_SIMPLE_WASM);
+ const lines = renderWasmText(source.id, source.content.value);
+ expect(lines.join("\n")).toEqual(
+ "Error occured during wast conversion : Unsupported element segment type 96"
+ );
+ clearWasmStates();
+ });
+ });
+
+ describe("lineToWasmOffset", () => {
+ // Test data sanity check: checking if 'nop' is found in the SIMPLE_WASM.
+ expect(SIMPLE_WASM.binary[SIMPLE_WASM_NOP_OFFSET]).toEqual("\x01");
+
+ it("get simple wasm nop offset", () => {
+ const source = makeMockWasmSourceWithContent(SIMPLE_WASM);
+ renderWasmText(source.id, source.content.value);
+ const offset = lineToWasmOffset(source.id, SIMPLE_WASM_NOP_TEXT_LINE);
+ expect(offset).toEqual(SIMPLE_WASM_NOP_OFFSET);
+ clearWasmStates();
+ });
+ });
+
+ describe("wasmOffsetToLine", () => {
+ it("get simple wasm nop line", () => {
+ const source = makeMockWasmSourceWithContent(SIMPLE_WASM);
+ renderWasmText(source.id, source.content.value);
+ const line = wasmOffsetToLine(source.id, SIMPLE_WASM_NOP_OFFSET);
+ expect(line).toEqual(SIMPLE_WASM_NOP_TEXT_LINE);
+ clearWasmStates();
+ });
+ });
+});
diff --git a/devtools/client/debugger/src/utils/text.js b/devtools/client/debugger/src/utils/text.js
new file mode 100644
index 0000000000..19f99b3175
--- /dev/null
+++ b/devtools/client/debugger/src/utils/text.js
@@ -0,0 +1,58 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Utils for keyboard command strings
+ * @module utils/text
+ */
+
+const isMacOS = Services.appinfo.OS === "Darwin";
+
+/**
+ * Formats key for use in tooltips
+ * For macOS we use the following unicode
+ *
+ * cmd ⌘ = \u2318
+ * shift ⇧ – \u21E7
+ * option (alt) ⌥ \u2325
+ *
+ * For Win/Lin this replaces CommandOrControl or CmdOrCtrl with Ctrl
+ *
+ * @memberof utils/text
+ * @static
+ */
+export function formatKeyShortcut(shortcut) {
+ if (isMacOS) {
+ return shortcut
+ .replace(/Shift\+/g, "\u21E7")
+ .replace(/Command\+|Cmd\+/g, "\u2318")
+ .replace(/CommandOrControl\+|CmdOrCtrl\+/g, "\u2318")
+ .replace(/Alt\+/g, "\u2325");
+ }
+ return shortcut
+ .replace(/CommandOrControl\+|CmdOrCtrl\+/g, `${L10N.getStr("ctrl")}+`)
+ .replace(/Shift\+/g, "Shift+");
+}
+
+/**
+ * Truncates the received text to the maxLength in the format:
+ * Original: 'this is a very long text and ends here'
+ * Truncated: 'this is a ver...and ends here'
+ * @param {String} sourceText - Source text
+ * @param {Number} maxLength - Max allowed length
+ * @memberof utils/text
+ * @static
+ */
+export function truncateMiddleText(sourceText, maxLength) {
+ let truncatedText = sourceText;
+ if (sourceText.length > maxLength) {
+ truncatedText = `${sourceText.substring(
+ 0,
+ Math.round(maxLength / 2) - 2
+ )}…${sourceText.substring(
+ sourceText.length - Math.round(maxLength / 2 - 1)
+ )}`;
+ }
+ return truncatedText;
+}
diff --git a/devtools/client/debugger/src/utils/ui.js b/devtools/client/debugger/src/utils/ui.js
new file mode 100644
index 0000000000..eab5bb1e07
--- /dev/null
+++ b/devtools/client/debugger/src/utils/ui.js
@@ -0,0 +1,48 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/* Checks to see if the root element is available and
+ * if the element is visible. We check the width of the element
+ * because it is more reliable than either checking a focus state or
+ * the visibleState or hidden property.
+ */
+export function isVisible() {
+ const el = document.querySelector("#mount");
+ return !!(el && el.getBoundingClientRect().width > 0);
+}
+
+/* Gets the line numbers width in the code editor
+ */
+export function getLineNumberWidth(editor) {
+ const { gutters } = editor.display;
+ const lineNumbers = gutters.querySelector(".CodeMirror-linenumbers");
+ return lineNumbers?.clientWidth;
+}
+
+/**
+ * Forces the breakpoint gutter to be the same size as the line
+ * numbers gutter. Editor CSS will absolutely position the gutter
+ * beneath the line numbers. This makes it easy to be flexible with
+ * how we overlay breakpoints.
+ */
+export function resizeBreakpointGutter(editor) {
+ const { gutters } = editor.display;
+ const breakpoints = gutters.querySelector(".breakpoints");
+ if (breakpoints) {
+ breakpoints.style.width = `${getLineNumberWidth(editor)}px`;
+ }
+}
+
+/**
+ * Forces the left toggle button in source header to be the same size
+ * as the line numbers gutter.
+ */
+export function resizeToggleButton(editor) {
+ const toggleButton = document.querySelector(
+ ".source-header .toggle-button-start"
+ );
+ if (toggleButton) {
+ toggleButton.style.width = `${getLineNumberWidth(editor)}px`;
+ }
+}
diff --git a/devtools/client/debugger/src/utils/url.js b/devtools/client/debugger/src/utils/url.js
new file mode 100644
index 0000000000..2aabc31258
--- /dev/null
+++ b/devtools/client/debugger/src/utils/url.js
@@ -0,0 +1,75 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+const defaultUrl = {
+ hash: "",
+ host: "",
+ hostname: "",
+ href: "",
+ origin: "null",
+ password: "",
+ path: "",
+ pathname: "",
+ port: "",
+ protocol: "",
+ search: "",
+ // This should be a "URLSearchParams" object
+ searchParams: {},
+ username: "",
+};
+
+const parseCache = new Map();
+export function parse(url) {
+ if (parseCache.has(url)) {
+ return parseCache.get(url);
+ }
+
+ let urlObj;
+ try {
+ urlObj = new URL(url);
+ } catch (err) {
+ urlObj = { ...defaultUrl };
+ // If we're given simply a filename...
+ if (url) {
+ const hashStart = url.indexOf("#");
+ if (hashStart >= 0) {
+ urlObj.hash = url.slice(hashStart);
+ url = url.slice(0, hashStart);
+
+ if (urlObj.hash === "#") {
+ // The standard URL parser does not include the ? unless there are
+ // parameters included in the search value.
+ urlObj.hash = "";
+ }
+ }
+
+ const queryStart = url.indexOf("?");
+ if (queryStart >= 0) {
+ urlObj.search = url.slice(queryStart);
+ url = url.slice(0, queryStart);
+
+ if (urlObj.search === "?") {
+ // The standard URL parser does not include the ? unless there are
+ // parameters included in the search value.
+ urlObj.search = "";
+ }
+ }
+
+ urlObj.pathname = url;
+ }
+ }
+ // When provided a special URL like "webpack:///webpack/foo",
+ // prevents passing the three slashes in the path, and pass only onea.
+ // This will prevent displaying modules in empty-name sub folders.
+ urlObj.pathname = urlObj.pathname.replace(/\/+/, "/");
+ urlObj.path = urlObj.pathname + urlObj.search;
+
+ // Cache the result
+ parseCache.set(url, urlObj);
+ return urlObj;
+}
+
+export function sameOrigin(firstUrl, secondUrl) {
+ return parse(firstUrl).origin == parse(secondUrl).origin;
+}
diff --git a/devtools/client/debugger/src/utils/utils.js b/devtools/client/debugger/src/utils/utils.js
new file mode 100644
index 0000000000..7e3ed83032
--- /dev/null
+++ b/devtools/client/debugger/src/utils/utils.js
@@ -0,0 +1,59 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+const DevToolsUtils = require("resource://devtools/shared/DevToolsUtils.js");
+
+/**
+ * Utils for utils, by utils
+ * @module utils/utils
+ */
+
+/**
+ * @memberof utils/utils
+ * @static
+ */
+export function handleError(err) {
+ console.log("ERROR: ", err);
+}
+
+/**
+ * @memberof utils/utils
+ * @static
+ */
+export function promisify(context, method, ...args) {
+ return new Promise((resolve, reject) => {
+ args.push(response => {
+ if (response.error) {
+ reject(response);
+ } else {
+ resolve(response);
+ }
+ });
+ method.apply(context, args);
+ });
+}
+
+/**
+ * @memberof utils/utils
+ * @static
+ */
+export function endTruncateStr(str, size) {
+ if (str.length > size) {
+ return `…${str.slice(str.length - size)}`;
+ }
+ return str;
+}
+
+export function waitForMs(ms) {
+ return new Promise(resolve => setTimeout(resolve, ms));
+}
+
+export async function saveAsLocalFile(content, fileName) {
+ if (content.type !== "text") {
+ return null;
+ }
+
+ const data = new TextEncoder().encode(content.value);
+ return DevToolsUtils.saveAs(window, data, fileName);
+}
diff --git a/devtools/client/debugger/src/utils/wasm.js b/devtools/client/debugger/src/utils/wasm.js
new file mode 100644
index 0000000000..f2879af535
--- /dev/null
+++ b/devtools/client/debugger/src/utils/wasm.js
@@ -0,0 +1,166 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { BinaryReader } from "devtools/client/shared/vendor/WasmParser";
+import {
+ WasmDisassembler,
+ NameSectionReader,
+} from "devtools/client/shared/vendor/WasmDis";
+
+var wasmStates = Object.create(null);
+
+function maybeWasmSectionNameResolver(data) {
+ try {
+ const parser = new BinaryReader();
+ parser.setData(data.buffer, 0, data.length);
+ const reader = new NameSectionReader();
+ reader.read(parser);
+ return reader.hasValidNames() ? reader.getNameResolver() : null;
+ } catch (ex) {
+ // Ignoring any errors during names section retrival.
+ return null;
+ }
+}
+
+/**
+ * @memberof utils/wasm
+ * @static
+ */
+export function getWasmText(sourceId, data) {
+ const nameResolver = maybeWasmSectionNameResolver(data);
+ const parser = new BinaryReader();
+ let result;
+ parser.setData(data.buffer, 0, data.length);
+ const dis = new WasmDisassembler();
+ if (nameResolver) {
+ dis.nameResolver = nameResolver;
+ }
+ dis.addOffsets = true;
+ try {
+ const done = dis.disassembleChunk(parser);
+ result = dis.getResult();
+ if (result.lines.length === 0) {
+ result = { lines: ["No luck with wast conversion"], offsets: [0], done };
+ }
+ } catch (e) {
+ result = {
+ lines: [`Error occured during wast conversion : ${e.message}`],
+ offsets: [0],
+ done: null,
+ };
+ }
+
+ const { offsets } = result;
+ const lines = [];
+ for (let i = 0; i < offsets.length; i++) {
+ lines[offsets[i]] = i;
+ }
+
+ wasmStates[sourceId] = { offsets, lines };
+
+ return { lines: result.lines, done: result.done };
+}
+
+/**
+ * @memberof utils/wasm
+ * @static
+ */
+export function getWasmLineNumberFormatter(sourceId) {
+ const codeOf0 = 48,
+ codeOfA = 65;
+ const buffer = [
+ codeOf0,
+ codeOf0,
+ codeOf0,
+ codeOf0,
+ codeOf0,
+ codeOf0,
+ codeOf0,
+ codeOf0,
+ ];
+ let last0 = 7;
+ return function (number) {
+ const offset = lineToWasmOffset(sourceId, number - 1);
+ if (offset == undefined) {
+ return "";
+ }
+ let i = 7;
+ for (let n = offset; n !== 0 && i >= 0; n >>= 4, i--) {
+ const nibble = n & 15;
+ buffer[i] = nibble < 10 ? codeOf0 + nibble : codeOfA - 10 + nibble;
+ }
+ for (let j = i; j > last0; j--) {
+ buffer[j] = codeOf0;
+ }
+ last0 = i;
+ return String.fromCharCode.apply(null, buffer);
+ };
+}
+
+/**
+ * @memberof utils/wasm
+ * @static
+ */
+export function isWasm(sourceId) {
+ return sourceId in wasmStates;
+}
+
+/**
+ * @memberof utils/wasm
+ * @static
+ */
+export function lineToWasmOffset(sourceId, number) {
+ const wasmState = wasmStates[sourceId];
+ if (!wasmState) {
+ return undefined;
+ }
+ let offset = wasmState.offsets[number];
+ while (offset === undefined && number > 0) {
+ offset = wasmState.offsets[--number];
+ }
+ return offset;
+}
+
+/**
+ * @memberof utils/wasm
+ * @static
+ */
+export function wasmOffsetToLine(sourceId, offset) {
+ const wasmState = wasmStates[sourceId];
+ if (!wasmState) {
+ return undefined;
+ }
+ return wasmState.lines[offset];
+}
+
+/**
+ * @memberof utils/wasm
+ * @static
+ */
+export function clearWasmStates() {
+ wasmStates = Object.create(null);
+}
+
+const wasmLines = new WeakMap();
+export function renderWasmText(sourceId, content) {
+ if (wasmLines.has(content)) {
+ return wasmLines.get(content) || [];
+ }
+
+ // binary does not survive as Uint8Array, converting from string
+ const { binary } = content.value;
+ const data = new Uint8Array(binary.length);
+ for (let i = 0; i < data.length; i++) {
+ data[i] = binary.charCodeAt(i);
+ }
+ const { lines } = getWasmText(sourceId, data);
+ const MAX_LINES = 1000000;
+ if (lines.length > MAX_LINES) {
+ lines.splice(MAX_LINES, lines.length - MAX_LINES);
+ lines.push(";; .... text is truncated due to the size");
+ }
+
+ wasmLines.set(content, lines);
+ return lines;
+}
diff --git a/devtools/client/debugger/src/utils/worker.js b/devtools/client/debugger/src/utils/worker.js
new file mode 100644
index 0000000000..8cd7071466
--- /dev/null
+++ b/devtools/client/debugger/src/utils/worker.js
@@ -0,0 +1,49 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+let msgId = 1;
+/**
+ * @memberof utils/utils
+ * @static
+ */
+function workerTask(worker, method) {
+ return function (...args) {
+ return new Promise((resolve, reject) => {
+ const id = msgId++;
+ worker.postMessage({ id, method, args });
+
+ const listener = ({ data: result }) => {
+ if (result.id !== id) {
+ return;
+ }
+
+ worker.removeEventListener("message", listener);
+ if (result.error) {
+ reject(result.error);
+ } else {
+ resolve(result.response);
+ }
+ };
+
+ worker.addEventListener("message", listener);
+ });
+ };
+}
+
+function workerHandler(publicInterface) {
+ return function onTask(msg) {
+ const { id, method, args } = msg.data;
+ const response = publicInterface[method].apply(null, args);
+
+ if (response instanceof Promise) {
+ response
+ .then(val => self.postMessage({ id, response: val }))
+ .catch(error => self.postMessage({ id, error }));
+ } else {
+ self.postMessage({ id, response });
+ }
+ };
+}
+
+export { workerTask, workerHandler };
diff --git a/devtools/client/debugger/src/workers/moz.build b/devtools/client/debugger/src/workers/moz.build
new file mode 100644
index 0000000000..12327bf177
--- /dev/null
+++ b/devtools/client/debugger/src/workers/moz.build
@@ -0,0 +1,12 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DIRS += [
+ "parser",
+ "pretty-print",
+ "search",
+]
+
+CompiledModules()
diff --git a/devtools/client/debugger/src/workers/parser/findBestMatchExpression.js b/devtools/client/debugger/src/workers/parser/findBestMatchExpression.js
new file mode 100644
index 0000000000..6fd5d5e70e
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/findBestMatchExpression.js
@@ -0,0 +1,37 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { getInternalSymbols } from "./getSymbols";
+
+function findBestMatchExpression(sourceId, tokenPos) {
+ const symbols = getInternalSymbols(sourceId);
+ if (!symbols) {
+ return null;
+ }
+
+ const { line, column } = tokenPos;
+ const { memberExpressions, identifiers, literals } = symbols;
+
+ function matchExpression(expression) {
+ const { location } = expression;
+ const { start, end } = location;
+ return start.line == line && start.column <= column && end.column >= column;
+ }
+ function matchMemberExpression(expression) {
+ // For member expressions we ignore "computed" member expressions `foo[bar]`,
+ // to only match the one that looks like: `foo.bar`.
+ return !expression.computed && matchExpression(expression);
+ }
+ // Avoid duplicating these arrays and be careful about performance as they can be large
+ //
+ // Process member expressions first as they can be including identifiers which
+ // are subset of the member expression.
+ // Ex: `foo.bar` is a member expression made of `foo` and `bar` identifiers.
+ return (
+ memberExpressions.find(matchMemberExpression) ||
+ literals.find(matchExpression) ||
+ identifiers.find(matchExpression)
+ );
+}
+export default findBestMatchExpression;
diff --git a/devtools/client/debugger/src/workers/parser/findOutOfScopeLocations.js b/devtools/client/debugger/src/workers/parser/findOutOfScopeLocations.js
new file mode 100644
index 0000000000..6c466965c2
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/findOutOfScopeLocations.js
@@ -0,0 +1,132 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { containsLocation, containsPosition } from "./utils/contains";
+
+import { getInternalSymbols } from "./getSymbols";
+
+function findSymbols(source) {
+ const { functions, comments } = getInternalSymbols(source);
+ return { functions, comments };
+}
+
+/**
+ * Returns the location for a given function path. If the path represents a
+ * function declaration, the location will begin after the function identifier
+ * but before the function parameters.
+ */
+
+function getLocation(func) {
+ const location = { ...func.location };
+
+ // if the function has an identifier, start the block after it so the
+ // identifier is included in the "scope" of its parent
+ const identifierEnd = func?.identifier?.loc?.end;
+ if (identifierEnd) {
+ location.start = identifierEnd;
+ }
+
+ return location;
+}
+
+/**
+ * Find the nearest location containing the input position and
+ * return inner locations under that nearest location
+ *
+ * @param {Array<Object>} locations Notice! The locations MUST be sorted by `sortByStart`
+ * so that we can do linear time complexity operation.
+ * @returns {Array<Object>}
+ */
+function getInnerLocations(locations, position) {
+ // First, let's find the nearest position-enclosing function location,
+ // which is to find the last location enclosing the position.
+ let parentIndex;
+ for (let i = locations.length - 1; i >= 0; i--) {
+ const loc = locations[i];
+ if (containsPosition(loc, position)) {
+ parentIndex = i;
+ break;
+ }
+ }
+
+ if (parentIndex == undefined) {
+ return [];
+ }
+ const parentLoc = locations[parentIndex];
+
+ // Then, from the nearest location, loop locations again and put locations into
+ // the innerLocations array until we get to a location not enclosed by the nearest location.
+ const innerLocations = [];
+ for (let i = parentIndex + 1; i < locations.length; i++) {
+ const loc = locations[i];
+ if (!containsLocation(parentLoc, loc)) {
+ break;
+ }
+
+ innerLocations.push(loc);
+ }
+
+ return innerLocations;
+}
+
+/**
+ * Return an new locations array which excludes
+ * items that are completely enclosed by another location in the input locations
+ *
+ * @param locations Notice! The locations MUST be sorted by `sortByStart`
+ * so that we can do linear time complexity operation.
+ */
+function removeOverlaps(locations) {
+ if (!locations.length) {
+ return [];
+ }
+ const firstParent = locations[0];
+ return locations.reduce(deduplicateNode, [firstParent]);
+}
+
+function deduplicateNode(nodes, location) {
+ const parent = nodes[nodes.length - 1];
+ if (!containsLocation(parent, location)) {
+ nodes.push(location);
+ }
+ return nodes;
+}
+
+/**
+ * Sorts an array of locations by start position
+ */
+function sortByStart(a, b) {
+ if (a.start.line < b.start.line) {
+ return -1;
+ } else if (a.start.line === b.start.line) {
+ return a.start.column - b.start.column;
+ }
+
+ return 1;
+}
+
+/**
+ * Returns an array of locations that are considered out of scope for the given
+ * location.
+ */
+function findOutOfScopeLocations(location) {
+ const { functions, comments } = findSymbols(location.source.id);
+ const commentLocations = comments.map(c => c.location);
+ const locations = functions
+ .map(getLocation)
+ .concat(commentLocations)
+ .sort(sortByStart);
+
+ const innerLocations = getInnerLocations(locations, location);
+ const outerLocations = locations.filter(loc => {
+ if (innerLocations.includes(loc)) {
+ return false;
+ }
+
+ return !containsPosition(loc, location);
+ });
+ return removeOverlaps(outerLocations);
+}
+
+export default findOutOfScopeLocations;
diff --git a/devtools/client/debugger/src/workers/parser/frameworks.js b/devtools/client/debugger/src/workers/parser/frameworks.js
new file mode 100644
index 0000000000..aacaa5186f
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/frameworks.js
@@ -0,0 +1,60 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import * as t from "@babel/types";
+
+export function getFramework(symbols) {
+ if (isReactComponent(symbols)) {
+ return "React";
+ }
+ if (isAngularComponent(symbols)) {
+ return "Angular";
+ }
+ if (isVueComponent(symbols)) {
+ return "Vue";
+ }
+
+ return null;
+}
+
+function isReactComponent({ importsReact, classes, identifiers }) {
+ return (
+ importsReact ||
+ extendsReactComponent(classes) ||
+ isReact(identifiers) ||
+ isRedux(identifiers)
+ );
+}
+
+function extendsReactComponent(classes) {
+ return classes.some(
+ classObj =>
+ t.isIdentifier(classObj.parent, { name: "Component" }) ||
+ t.isIdentifier(classObj.parent, { name: "PureComponent" }) ||
+ (t.isMemberExpression(classObj.parent, { computed: false }) &&
+ t.isIdentifier(classObj.parent, { name: "Component" }))
+ );
+}
+
+function isAngularComponent({ memberExpressions }) {
+ return memberExpressions.some(
+ item =>
+ item.expression == "angular.controller" ||
+ item.expression == "angular.module"
+ );
+}
+
+function isVueComponent({ identifiers }) {
+ return identifiers.some(identifier => identifier.name == "Vue");
+}
+
+/* This identifies the react lib file */
+function isReact(identifiers) {
+ return identifiers.some(identifier => identifier.name == "isReactComponent");
+}
+
+/* This identifies the redux lib file */
+function isRedux(identifiers) {
+ return identifiers.some(identifier => identifier.name == "Redux");
+}
diff --git a/devtools/client/debugger/src/workers/parser/getScopes/index.js b/devtools/client/debugger/src/workers/parser/getScopes/index.js
new file mode 100644
index 0000000000..82631ab614
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/getScopes/index.js
@@ -0,0 +1,65 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { buildScopeList, parseSourceScopes } from "./visitor";
+
+const parsedScopesCache = new Map();
+
+export default function getScopes(location) {
+ const sourceId = location.source.id;
+ let parsedScopes = parsedScopesCache.get(sourceId);
+ if (!parsedScopes) {
+ parsedScopes = parseSourceScopes(sourceId);
+ parsedScopesCache.set(sourceId, parsedScopes);
+ }
+ return parsedScopes ? findScopes(parsedScopes, location) : [];
+}
+
+export function clearScopes(sourceIds) {
+ for (const sourceId of sourceIds) {
+ parsedScopesCache.delete(sourceId);
+ }
+}
+
+export { buildScopeList };
+
+/**
+ * Searches all scopes and their bindings at the specific location.
+ */
+function findScopes(scopes, location) {
+ // Find inner most in the tree structure.
+ let searchInScopes = scopes;
+ const found = [];
+ while (searchInScopes) {
+ const foundOne = searchInScopes.some(s => {
+ if (
+ compareLocations(s.start, location) <= 0 &&
+ compareLocations(location, s.end) < 0
+ ) {
+ // Found the next scope, trying to search recusevly in its children.
+ found.unshift(s);
+ searchInScopes = s.children;
+ return true;
+ }
+ return false;
+ });
+ if (!foundOne) {
+ break;
+ }
+ }
+ return found.map(i => ({
+ type: i.type,
+ scopeKind: i.scopeKind,
+ displayName: i.displayName,
+ start: i.start,
+ end: i.end,
+ bindings: i.bindings,
+ }));
+}
+
+function compareLocations(a, b) {
+ // According to type of Location.column can be undefined, if will not be the
+ // case here, ignoring flow error.
+ return a.line == b.line ? a.column - b.column : a.line - b.line;
+}
diff --git a/devtools/client/debugger/src/workers/parser/getScopes/visitor.js b/devtools/client/debugger/src/workers/parser/getScopes/visitor.js
new file mode 100644
index 0000000000..8046c7e89d
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/getScopes/visitor.js
@@ -0,0 +1,909 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import * as t from "@babel/types";
+
+import getFunctionName from "../utils/getFunctionName";
+import { getAst } from "../utils/ast";
+
+/**
+ * "implicit"
+ * Variables added automaticly like "this" and "arguments"
+ *
+ * "var"
+ * Variables declared with "var" or non-block function declarations
+ *
+ * "let"
+ * Variables declared with "let".
+ *
+ * "const"
+ * Variables declared with "const", or added as const
+ * bindings like inner function expressions and inner class names.
+ *
+ * "import"
+ * Imported binding names exposed from other modules.
+ *
+ * "global"
+ * Variables that reference undeclared global values.
+ */
+
+// Location information about the expression immediartely surrounding a
+// given binding reference.
+
+function isGeneratedId(id) {
+ return !/\/originalSource/.test(id);
+}
+
+export function parseSourceScopes(sourceId) {
+ const ast = getAst(sourceId);
+ if (!ast || !Object.keys(ast).length) {
+ return null;
+ }
+
+ return buildScopeList(ast, sourceId);
+}
+
+export function buildScopeList(ast, sourceId) {
+ const { global, lexical } = createGlobalScope(ast, sourceId);
+
+ const state = {
+ // The id for the source that scope list is generated for
+ sourceId,
+
+ // A map of any free variables(variables which are used within the current scope but not
+ // declared within the scope). This changes when a new scope is created.
+ freeVariables: new Map(),
+
+ // A stack of all the free variables created across all the scopes that have
+ // been created.
+ freeVariableStack: [],
+
+ inType: null,
+
+ // The current scope, a new scope is potentially created on a visit to each node
+ // depending in the criteria. Initially set to the lexical global scope which is the
+ // child to the global scope.
+ scope: lexical,
+
+ // A stack of all the existing scopes, this is mainly used retrieve the parent scope
+ // (which is the last scope push onto the stack) on exiting a visited node.
+ scopeStack: [],
+
+ declarationBindingIds: new Set(),
+ };
+ t.traverse(ast, scopeCollectionVisitor, state);
+
+ for (const [key, freeVariables] of state.freeVariables) {
+ let binding = global.bindings[key];
+ if (!binding) {
+ binding = {
+ type: "global",
+ refs: [],
+ };
+ global.bindings[key] = binding;
+ }
+
+ binding.refs = freeVariables.concat(binding.refs);
+ }
+
+ // TODO: This should probably check for ".mjs" extension on the
+ // original file, and should also be skipped if the the generated
+ // code is an ES6 module rather than a script.
+ if (
+ isGeneratedId(sourceId) ||
+ (ast.program.sourceType === "script" && !looksLikeCommonJS(global))
+ ) {
+ stripModuleScope(global);
+ }
+
+ return toParsedScopes([global], sourceId) || [];
+}
+
+function toParsedScopes(children, sourceId) {
+ if (!children || children.length === 0) {
+ return undefined;
+ }
+ return children.map(scope => ({
+ // Removing unneed information from TempScope such as parent reference.
+ // We also need to convert BabelLocation to the Location type.
+ start: scope.loc.start,
+ end: scope.loc.end,
+ type:
+ scope.type === "module" || scope.type === "function-body"
+ ? "block"
+ : scope.type,
+ scopeKind: "",
+ displayName: scope.displayName,
+ bindings: scope.bindings,
+ children: toParsedScopes(scope.children, sourceId),
+ }));
+}
+
+/**
+ * Create a new scope object and link the scope to it parent.
+ *
+ * @param {String} type - scope type
+ * @param {String} displayName - The scope display name
+ * @param {Object} parent - The parent object scope
+ * @param {Object} loc - The start and end postions (line/columns) of the scope
+ * @returns {Object} The newly created scope
+ */
+function createTempScope(type, displayName, parent, loc) {
+ const scope = {
+ type,
+ displayName,
+ parent,
+
+ // A list of all the child scopes
+ children: [],
+ loc,
+
+ // All the bindings defined in this scope
+ // bindings = [binding, ...]
+ // binding = { type: "", refs: []}
+ bindings: Object.create(null),
+ };
+
+ if (parent) {
+ parent.children.push(scope);
+ }
+ return scope;
+}
+
+// Sets a new current scope and creates a new map to store the free variables
+// that may exist in this scope.
+function pushTempScope(state, type, displayName, loc) {
+ const scope = createTempScope(type, displayName, state.scope, loc);
+
+ state.scope = scope;
+
+ state.freeVariableStack.push(state.freeVariables);
+ state.freeVariables = new Map();
+ return scope;
+}
+
+function isNode(node, type) {
+ return node ? node.type === type : false;
+}
+
+// Walks up the scope tree to the top most variable scope
+function getVarScope(scope) {
+ let s = scope;
+ while (s.type !== "function" && s.type !== "module") {
+ if (!s.parent) {
+ return s;
+ }
+ s = s.parent;
+ }
+ return s;
+}
+
+function fromBabelLocation(location, sourceId) {
+ return {
+ sourceId,
+ line: location.line,
+ column: location.column,
+ };
+}
+
+function parseDeclarator(
+ declaratorId,
+ targetScope,
+ type,
+ locationType,
+ declaration,
+ state
+) {
+ if (isNode(declaratorId, "Identifier")) {
+ let existing = targetScope.bindings[declaratorId.name];
+ if (!existing) {
+ existing = {
+ type,
+ refs: [],
+ };
+ targetScope.bindings[declaratorId.name] = existing;
+ }
+ state.declarationBindingIds.add(declaratorId);
+ existing.refs.push({
+ type: locationType,
+ start: fromBabelLocation(declaratorId.loc.start, state.sourceId),
+ end: fromBabelLocation(declaratorId.loc.end, state.sourceId),
+ declaration: {
+ start: fromBabelLocation(declaration.loc.start, state.sourceId),
+ end: fromBabelLocation(declaration.loc.end, state.sourceId),
+ },
+ });
+ } else if (isNode(declaratorId, "ObjectPattern")) {
+ declaratorId.properties.forEach(prop => {
+ parseDeclarator(
+ prop.value,
+ targetScope,
+ type,
+ locationType,
+ declaration,
+ state
+ );
+ });
+ } else if (isNode(declaratorId, "ArrayPattern")) {
+ declaratorId.elements.forEach(item => {
+ parseDeclarator(
+ item,
+ targetScope,
+ type,
+ locationType,
+ declaration,
+ state
+ );
+ });
+ } else if (isNode(declaratorId, "AssignmentPattern")) {
+ parseDeclarator(
+ declaratorId.left,
+ targetScope,
+ type,
+ locationType,
+ declaration,
+ state
+ );
+ } else if (isNode(declaratorId, "RestElement")) {
+ parseDeclarator(
+ declaratorId.argument,
+ targetScope,
+ type,
+ locationType,
+ declaration,
+ state
+ );
+ } else if (t.isTSParameterProperty(declaratorId)) {
+ parseDeclarator(
+ declaratorId.parameter,
+ targetScope,
+ type,
+ locationType,
+ declaration,
+ state
+ );
+ }
+}
+
+function isLetOrConst(node) {
+ return node.kind === "let" || node.kind === "const";
+}
+
+function hasLexicalDeclaration(node, parent) {
+ const nodes = [];
+ if (t.isSwitchStatement(node)) {
+ for (const caseNode of node.cases) {
+ nodes.push(...caseNode.consequent);
+ }
+ } else {
+ nodes.push(...node.body);
+ }
+
+ const isFunctionBody = t.isFunction(parent, { body: node });
+
+ return nodes.some(
+ child =>
+ isLexicalVariable(child) ||
+ t.isClassDeclaration(child) ||
+ (!isFunctionBody && t.isFunctionDeclaration(child))
+ );
+}
+function isLexicalVariable(node) {
+ return isNode(node, "VariableDeclaration") && isLetOrConst(node);
+}
+
+// Creates the global scopes for this source, the overall global scope
+// and a lexical global scope.
+function createGlobalScope(ast, sourceId) {
+ const global = createTempScope("object", "Global", null, {
+ start: fromBabelLocation(ast.loc.start, sourceId),
+ end: fromBabelLocation(ast.loc.end, sourceId),
+ });
+
+ const lexical = createTempScope("block", "Lexical Global", global, {
+ start: fromBabelLocation(ast.loc.start, sourceId),
+ end: fromBabelLocation(ast.loc.end, sourceId),
+ });
+
+ return { global, lexical };
+}
+
+const scopeCollectionVisitor = {
+ // eslint-disable-next-line complexity
+ enter(node, ancestors, state) {
+ state.scopeStack.push(state.scope);
+
+ const parentNode =
+ ancestors.length === 0 ? null : ancestors[ancestors.length - 1].node;
+
+ if (state.inType) {
+ return;
+ }
+
+ if (t.isProgram(node)) {
+ const scope = pushTempScope(state, "module", "Module", {
+ start: fromBabelLocation(node.loc.start, state.sourceId),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ });
+ scope.bindings.this = {
+ type: "implicit",
+ refs: [],
+ };
+ } else if (t.isFunction(node)) {
+ let { scope } = state;
+
+ if (t.isFunctionExpression(node) && isNode(node.id, "Identifier")) {
+ scope = pushTempScope(state, "block", "Function Expression", {
+ start: fromBabelLocation(node.loc.start, state.sourceId),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ });
+ state.declarationBindingIds.add(node.id);
+ scope.bindings[node.id.name] = {
+ type: "const",
+ refs: [
+ {
+ type: "fn-expr",
+ start: fromBabelLocation(node.id.loc.start, state.sourceId),
+ end: fromBabelLocation(node.id.loc.end, state.sourceId),
+ declaration: {
+ start: fromBabelLocation(node.loc.start, state.sourceId),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ },
+ },
+ ],
+ };
+ }
+
+ if (t.isFunctionDeclaration(node) && isNode(node.id, "Identifier")) {
+ // This ignores Annex B function declaration hoisting, which
+ // is probably a fine assumption.
+ state.declarationBindingIds.add(node.id);
+ const refs = [
+ {
+ type: "fn-decl",
+ start: fromBabelLocation(node.id.loc.start, state.sourceId),
+ end: fromBabelLocation(node.id.loc.end, state.sourceId),
+ declaration: {
+ start: fromBabelLocation(node.loc.start, state.sourceId),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ },
+ },
+ ];
+
+ if (scope.type === "block") {
+ scope.bindings[node.id.name] = {
+ type: "let",
+ refs,
+ };
+ } else {
+ // Add the binding to the ancestor scope
+ getVarScope(scope).bindings[node.id.name] = {
+ type: "var",
+ refs,
+ };
+ }
+ }
+
+ scope = pushTempScope(
+ state,
+ "function",
+ getFunctionName(node, parentNode),
+ {
+ // Being at the start of a function doesn't count as
+ // being inside of it.
+ start: fromBabelLocation(
+ node.params[0] ? node.params[0].loc.start : node.loc.start,
+ state.sourceId
+ ),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ }
+ );
+
+ node.params.forEach(param =>
+ parseDeclarator(param, scope, "var", "fn-param", node, state)
+ );
+
+ if (!t.isArrowFunctionExpression(node)) {
+ scope.bindings.this = {
+ type: "implicit",
+ refs: [],
+ };
+ scope.bindings.arguments = {
+ type: "implicit",
+ refs: [],
+ };
+ }
+
+ if (
+ t.isBlockStatement(node.body) &&
+ hasLexicalDeclaration(node.body, node)
+ ) {
+ scope = pushTempScope(state, "function-body", "Function Body", {
+ start: fromBabelLocation(node.body.loc.start, state.sourceId),
+ end: fromBabelLocation(node.body.loc.end, state.sourceId),
+ });
+ }
+ } else if (t.isClass(node)) {
+ if (t.isIdentifier(node.id)) {
+ // For decorated classes, the AST considers the first the decorator
+ // to be the start of the class. For the purposes of mapping class
+ // declarations however, we really want to look for the "class Foo"
+ // piece. To achieve that, we estimate the location of the declaration
+ // instead.
+ let declStart = node.loc.start;
+ if (node.decorators && node.decorators.length) {
+ // Estimate the location of the "class" keyword since it
+ // is unlikely to be a different line than the class name.
+ declStart = {
+ line: node.id.loc.start.line,
+ column: node.id.loc.start.column - "class ".length,
+ };
+ }
+
+ const declaration = {
+ start: fromBabelLocation(declStart, state.sourceId),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ };
+
+ if (t.isClassDeclaration(node)) {
+ state.declarationBindingIds.add(node.id);
+ state.scope.bindings[node.id.name] = {
+ type: "let",
+ refs: [
+ {
+ type: "class-decl",
+ start: fromBabelLocation(node.id.loc.start, state.sourceId),
+ end: fromBabelLocation(node.id.loc.end, state.sourceId),
+ declaration,
+ },
+ ],
+ };
+ }
+
+ const scope = pushTempScope(state, "block", "Class", {
+ start: fromBabelLocation(node.loc.start, state.sourceId),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ });
+
+ state.declarationBindingIds.add(node.id);
+ scope.bindings[node.id.name] = {
+ type: "const",
+ refs: [
+ {
+ type: "class-inner",
+ start: fromBabelLocation(node.id.loc.start, state.sourceId),
+ end: fromBabelLocation(node.id.loc.end, state.sourceId),
+ declaration,
+ },
+ ],
+ };
+ }
+ } else if (t.isForXStatement(node) || t.isForStatement(node)) {
+ const init = node.init || node.left;
+ if (isNode(init, "VariableDeclaration") && isLetOrConst(init)) {
+ // Debugger will create new lexical environment for the for.
+ pushTempScope(state, "block", "For", {
+ // Being at the start of a for loop doesn't count as
+ // being inside it.
+ start: fromBabelLocation(init.loc.start, state.sourceId),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ });
+ }
+ } else if (t.isCatchClause(node)) {
+ const scope = pushTempScope(state, "block", "Catch", {
+ start: fromBabelLocation(node.loc.start, state.sourceId),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ });
+ parseDeclarator(node.param, scope, "var", "catch", node, state);
+ } else if (
+ t.isBlockStatement(node) &&
+ // Function body's are handled in the function logic above.
+ !t.isFunction(parentNode) &&
+ hasLexicalDeclaration(node, parentNode)
+ ) {
+ // Debugger will create new lexical environment for the block.
+ pushTempScope(state, "block", "Block", {
+ start: fromBabelLocation(node.loc.start, state.sourceId),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ });
+ } else if (
+ t.isVariableDeclaration(node) &&
+ (node.kind === "var" ||
+ // Lexical declarations in for statements are handled above.
+ !t.isForStatement(parentNode, { init: node }) ||
+ !t.isForXStatement(parentNode, { left: node }))
+ ) {
+ // Finds right lexical environment
+ const hoistAt = !isLetOrConst(node)
+ ? getVarScope(state.scope)
+ : state.scope;
+ node.declarations.forEach(declarator => {
+ parseDeclarator(
+ declarator.id,
+ hoistAt,
+ node.kind,
+ node.kind,
+ node,
+ state
+ );
+ });
+ } else if (
+ t.isImportDeclaration(node) &&
+ (!node.importKind || node.importKind === "value")
+ ) {
+ node.specifiers.forEach(spec => {
+ if (spec.importKind && spec.importKind !== "value") {
+ return;
+ }
+
+ if (t.isImportNamespaceSpecifier(spec)) {
+ state.declarationBindingIds.add(spec.local);
+
+ state.scope.bindings[spec.local.name] = {
+ // Imported namespaces aren't live import bindings, they are
+ // just normal const bindings.
+ type: "const",
+ refs: [
+ {
+ type: "import-ns-decl",
+ start: fromBabelLocation(spec.local.loc.start, state.sourceId),
+ end: fromBabelLocation(spec.local.loc.end, state.sourceId),
+ declaration: {
+ start: fromBabelLocation(node.loc.start, state.sourceId),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ },
+ },
+ ],
+ };
+ } else {
+ state.declarationBindingIds.add(spec.local);
+
+ state.scope.bindings[spec.local.name] = {
+ type: "import",
+ refs: [
+ {
+ type: "import-decl",
+ start: fromBabelLocation(spec.local.loc.start, state.sourceId),
+ end: fromBabelLocation(spec.local.loc.end, state.sourceId),
+ importName: t.isImportDefaultSpecifier(spec)
+ ? "default"
+ : spec.imported.name,
+ declaration: {
+ start: fromBabelLocation(node.loc.start, state.sourceId),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ },
+ },
+ ],
+ };
+ }
+ });
+ } else if (t.isTSEnumDeclaration(node)) {
+ state.declarationBindingIds.add(node.id);
+ state.scope.bindings[node.id.name] = {
+ type: "const",
+ refs: [
+ {
+ type: "ts-enum-decl",
+ start: fromBabelLocation(node.id.loc.start, state.sourceId),
+ end: fromBabelLocation(node.id.loc.end, state.sourceId),
+ declaration: {
+ start: fromBabelLocation(node.loc.start, state.sourceId),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ },
+ },
+ ],
+ };
+ } else if (t.isTSModuleDeclaration(node)) {
+ state.declarationBindingIds.add(node.id);
+ state.scope.bindings[node.id.name] = {
+ type: "const",
+ refs: [
+ {
+ type: "ts-namespace-decl",
+ start: fromBabelLocation(node.id.loc.start, state.sourceId),
+ end: fromBabelLocation(node.id.loc.end, state.sourceId),
+ declaration: {
+ start: fromBabelLocation(node.loc.start, state.sourceId),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ },
+ },
+ ],
+ };
+ } else if (t.isTSModuleBlock(node)) {
+ pushTempScope(state, "block", "TypeScript Namespace", {
+ start: fromBabelLocation(node.loc.start, state.sourceId),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ });
+ } else if (
+ t.isIdentifier(node) &&
+ t.isReferenced(node, parentNode) &&
+ // Babel doesn't cover this in 'isReferenced' yet, but it should
+ // eventually.
+ !t.isTSEnumMember(parentNode, { id: node }) &&
+ !t.isTSModuleDeclaration(parentNode, { id: node }) &&
+ // isReferenced above fails to see `var { foo } = ...` as a non-reference
+ // because the direct parent is not enough to know that the pattern is
+ // used within a variable declaration.
+ !state.declarationBindingIds.has(node)
+ ) {
+ let freeVariables = state.freeVariables.get(node.name);
+ if (!freeVariables) {
+ freeVariables = [];
+ state.freeVariables.set(node.name, freeVariables);
+ }
+
+ freeVariables.push({
+ type: "ref",
+ start: fromBabelLocation(node.loc.start, state.sourceId),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ meta: buildMetaBindings(state.sourceId, node, ancestors),
+ });
+ } else if (isOpeningJSXIdentifier(node, ancestors)) {
+ let freeVariables = state.freeVariables.get(node.name);
+ if (!freeVariables) {
+ freeVariables = [];
+ state.freeVariables.set(node.name, freeVariables);
+ }
+
+ freeVariables.push({
+ type: "ref",
+ start: fromBabelLocation(node.loc.start, state.sourceId),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ meta: buildMetaBindings(state.sourceId, node, ancestors),
+ });
+ } else if (t.isThisExpression(node)) {
+ let freeVariables = state.freeVariables.get("this");
+ if (!freeVariables) {
+ freeVariables = [];
+ state.freeVariables.set("this", freeVariables);
+ }
+
+ freeVariables.push({
+ type: "ref",
+ start: fromBabelLocation(node.loc.start, state.sourceId),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ meta: buildMetaBindings(state.sourceId, node, ancestors),
+ });
+ } else if (t.isClassProperty(parentNode, { value: node })) {
+ const scope = pushTempScope(state, "function", "Class Field", {
+ start: fromBabelLocation(node.loc.start, state.sourceId),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ });
+ scope.bindings.this = {
+ type: "implicit",
+ refs: [],
+ };
+ scope.bindings.arguments = {
+ type: "implicit",
+ refs: [],
+ };
+ } else if (
+ t.isSwitchStatement(node) &&
+ hasLexicalDeclaration(node, parentNode)
+ ) {
+ pushTempScope(state, "block", "Switch", {
+ start: fromBabelLocation(node.loc.start, state.sourceId),
+ end: fromBabelLocation(node.loc.end, state.sourceId),
+ });
+ }
+
+ if (
+ // In general Flow expressions are deleted, so they can't contain
+ // runtime bindings, but typecasts are the one exception there.
+ (t.isFlow(node) && !t.isTypeCastExpression(node)) ||
+ // In general TS items are deleted, but TS has a few wrapper node
+ // types that can contain general JS expressions.
+ (node.type.startsWith("TS") &&
+ !t.isTSTypeAssertion(node) &&
+ !t.isTSAsExpression(node) &&
+ !t.isTSNonNullExpression(node) &&
+ !t.isTSModuleDeclaration(node) &&
+ !t.isTSModuleBlock(node) &&
+ !t.isTSParameterProperty(node) &&
+ !t.isTSExportAssignment(node))
+ ) {
+ // Flag this node as a root "type" node. All items inside of this
+ // will be skipped entirely.
+ state.inType = node;
+ }
+ },
+ exit(node, ancestors, state) {
+ const currentScope = state.scope;
+ const parentScope = state.scopeStack.pop();
+ if (!parentScope) {
+ throw new Error("Assertion failure - unsynchronized pop");
+ }
+ state.scope = parentScope;
+
+ // It is possible, as in the case of function expressions, that a single
+ // node has added multiple scopes, so we need to traverse upward here
+ // rather than jumping stright to 'parentScope'.
+ for (
+ let scope = currentScope;
+ scope && scope !== parentScope;
+ scope = scope.parent
+ ) {
+ const { freeVariables } = state;
+ state.freeVariables = state.freeVariableStack.pop();
+ const parentFreeVariables = state.freeVariables;
+
+ // Match up any free variables that match this scope's bindings and
+ // merge then into the refs.
+ for (const key of Object.keys(scope.bindings)) {
+ const binding = scope.bindings[key];
+
+ const freeVars = freeVariables.get(key);
+ if (freeVars) {
+ binding.refs.push(...freeVars);
+ freeVariables.delete(key);
+ }
+ }
+
+ // Move any undeclared references in this scope into the parent for
+ // processing in higher scopes.
+ for (const [key, value] of freeVariables) {
+ let refs = parentFreeVariables.get(key);
+ if (!refs) {
+ refs = [];
+ parentFreeVariables.set(key, refs);
+ }
+
+ refs.push(...value);
+ }
+ }
+
+ if (state.inType === node) {
+ state.inType = null;
+ }
+ },
+};
+
+function isOpeningJSXIdentifier(node, ancestors) {
+ if (!t.isJSXIdentifier(node)) {
+ return false;
+ }
+
+ for (let i = ancestors.length - 1; i >= 0; i--) {
+ const { node: parent, key } = ancestors[i];
+
+ if (t.isJSXOpeningElement(parent) && key === "name") {
+ return true;
+ } else if (!t.isJSXMemberExpression(parent) || key !== "object") {
+ break;
+ }
+ }
+
+ return false;
+}
+
+function buildMetaBindings(
+ sourceId,
+ node,
+ ancestors,
+ parentIndex = ancestors.length - 1
+) {
+ if (parentIndex <= 1) {
+ return null;
+ }
+ const parent = ancestors[parentIndex].node;
+ const grandparent = ancestors[parentIndex - 1].node;
+
+ // Consider "0, foo" to be equivalent to "foo".
+ if (
+ t.isSequenceExpression(parent) &&
+ parent.expressions.length === 2 &&
+ t.isNumericLiteral(parent.expressions[0]) &&
+ parent.expressions[1] === node
+ ) {
+ let { start, end } = parent.loc;
+
+ if (t.isCallExpression(grandparent, { callee: parent })) {
+ // Attempt to expand the range around parentheses, e.g.
+ // (0, foo.bar)()
+ start = grandparent.loc.start;
+ end = Object.assign({}, end);
+ end.column += 1;
+ }
+
+ return {
+ type: "inherit",
+ start: fromBabelLocation(start, sourceId),
+ end: fromBabelLocation(end, sourceId),
+ parent: buildMetaBindings(sourceId, parent, ancestors, parentIndex - 1),
+ };
+ }
+
+ // Consider "Object(foo)", and "__webpack_require__.i(foo)" to be
+ // equivalent to "foo" since they are essentially identity functions.
+ if (
+ t.isCallExpression(parent) &&
+ (t.isIdentifier(parent.callee, { name: "Object" }) ||
+ (t.isMemberExpression(parent.callee, { computed: false }) &&
+ t.isIdentifier(parent.callee.object, { name: "__webpack_require__" }) &&
+ t.isIdentifier(parent.callee.property, { name: "i" }))) &&
+ parent.arguments.length === 1 &&
+ parent.arguments[0] === node
+ ) {
+ return {
+ type: "inherit",
+ start: fromBabelLocation(parent.loc.start, sourceId),
+ end: fromBabelLocation(parent.loc.end, sourceId),
+ parent: buildMetaBindings(sourceId, parent, ancestors, parentIndex - 1),
+ };
+ }
+
+ if (t.isMemberExpression(parent, { object: node })) {
+ if (parent.computed) {
+ if (t.isStringLiteral(parent.property)) {
+ return {
+ type: "member",
+ start: fromBabelLocation(parent.loc.start, sourceId),
+ end: fromBabelLocation(parent.loc.end, sourceId),
+ property: parent.property.value,
+ parent: buildMetaBindings(
+ sourceId,
+ parent,
+ ancestors,
+ parentIndex - 1
+ ),
+ };
+ }
+ } else {
+ return {
+ type: "member",
+ start: fromBabelLocation(parent.loc.start, sourceId),
+ end: fromBabelLocation(parent.loc.end, sourceId),
+ property: parent.property.name,
+ parent: buildMetaBindings(sourceId, parent, ancestors, parentIndex - 1),
+ };
+ }
+ }
+ if (
+ t.isCallExpression(parent, { callee: node }) &&
+ !parent.arguments.length
+ ) {
+ return {
+ type: "call",
+ start: fromBabelLocation(parent.loc.start, sourceId),
+ end: fromBabelLocation(parent.loc.end, sourceId),
+ parent: buildMetaBindings(sourceId, parent, ancestors, parentIndex - 1),
+ };
+ }
+
+ return null;
+}
+
+function looksLikeCommonJS(rootScope) {
+ const hasRefs = name =>
+ rootScope.bindings[name] && !!rootScope.bindings[name].refs.length;
+
+ return (
+ hasRefs("__dirname") ||
+ hasRefs("__filename") ||
+ hasRefs("require") ||
+ hasRefs("exports") ||
+ hasRefs("module")
+ );
+}
+
+function stripModuleScope(rootScope) {
+ const rootLexicalScope = rootScope.children[0];
+ const moduleScope = rootLexicalScope.children[0];
+ if (moduleScope.type !== "module") {
+ throw new Error("Assertion failure - should be module");
+ }
+
+ Object.keys(moduleScope.bindings).forEach(name => {
+ const binding = moduleScope.bindings[name];
+ if (binding.type === "let" || binding.type === "const") {
+ rootLexicalScope.bindings[name] = binding;
+ } else {
+ rootScope.bindings[name] = binding;
+ }
+ });
+ rootLexicalScope.children = moduleScope.children;
+ rootLexicalScope.children.forEach(child => {
+ child.parent = rootLexicalScope;
+ });
+}
diff --git a/devtools/client/debugger/src/workers/parser/getSymbols.js b/devtools/client/debugger/src/workers/parser/getSymbols.js
new file mode 100644
index 0000000000..fb288adcfb
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/getSymbols.js
@@ -0,0 +1,567 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import * as t from "@babel/types";
+
+import createSimplePath from "./utils/simple-path";
+import { traverseAst } from "./utils/ast";
+import {
+ isFunction,
+ isObjectShorthand,
+ isComputedExpression,
+ getObjectExpressionValue,
+ addPatternIdentifiers,
+ getComments,
+ getCode,
+ nodeLocationKey,
+ getFunctionParameterNames,
+} from "./utils/helpers";
+
+import { inferClassName } from "./utils/inferClassName";
+import getFunctionName from "./utils/getFunctionName";
+import { getFramework } from "./frameworks";
+
+const symbolDeclarations = new Map();
+
+function extractFunctionSymbol(path, state, symbols) {
+ const name = getFunctionName(path.node, path.parent);
+
+ if (!state.fnCounts[name]) {
+ state.fnCounts[name] = 0;
+ }
+ const index = state.fnCounts[name]++;
+ symbols.functions.push({
+ name,
+ klass: inferClassName(path),
+ location: path.node.loc,
+ parameterNames: getFunctionParameterNames(path),
+ identifier: path.node.id,
+ // indicates the occurence of the function in a file
+ // e.g { name: foo, ... index: 4 } is the 4th foo function
+ // in the file
+ index,
+ });
+}
+
+function extractSymbol(path, symbols, state) {
+ if (isFunction(path)) {
+ extractFunctionSymbol(path, state, symbols);
+ }
+
+ if (t.isJSXElement(path)) {
+ symbols.hasJsx = true;
+ }
+
+ if (t.isGenericTypeAnnotation(path)) {
+ symbols.hasTypes = true;
+ }
+
+ if (t.isClassDeclaration(path)) {
+ symbols.classes.push(getClassDeclarationSymbol(path.node));
+ }
+
+ if (!symbols.importsReact) {
+ if (t.isImportDeclaration(path)) {
+ symbols.importsReact = isReactImport(path.node);
+ } else if (t.isCallExpression(path)) {
+ symbols.importsReact = isReactRequire(path.node);
+ }
+ }
+
+ if (t.isMemberExpression(path) || t.isOptionalMemberExpression(path)) {
+ symbols.memberExpressions.push(getMemberExpressionSymbol(path));
+ }
+
+ if (
+ (t.isStringLiteral(path) || t.isNumericLiteral(path)) &&
+ t.isMemberExpression(path.parentPath)
+ ) {
+ // We only need literals that are part of computed memeber expressions
+ const { start, end } = path.node.loc;
+ symbols.literals.push({
+ location: { start, end },
+ get expression() {
+ delete this.expression;
+ this.expression = getSnippet(path.parentPath);
+ return this.expression;
+ },
+ });
+ }
+
+ getIdentifierSymbols(symbols.identifiers, symbols.identifiersKeys, path);
+}
+
+function extractSymbols(sourceId) {
+ const symbols = {
+ functions: [],
+ memberExpressions: [],
+ comments: [],
+ identifiers: [],
+ // This holds a set of unique identifier location key (string)
+ // It helps registering only the first identifier when there is duplicated ones for the same location.
+ identifiersKeys: new Set(),
+ classes: [],
+ literals: [],
+ hasJsx: false,
+ hasTypes: false,
+ framework: undefined,
+ importsReact: false,
+ };
+
+ const state = {
+ fnCounts: Object.create(null),
+ };
+
+ const ast = traverseAst(sourceId, {
+ enter(node, ancestors) {
+ try {
+ const path = createSimplePath(ancestors);
+ if (path) {
+ extractSymbol(path, symbols, state);
+ }
+ } catch (e) {
+ console.error(e);
+ }
+ },
+ });
+
+ // comments are extracted separately from the AST
+ symbols.comments = getComments(ast);
+ symbols.framework = getFramework(symbols);
+
+ return symbols;
+}
+
+function extendSnippet(name, expression, path, prevPath) {
+ const computed = path?.node.computed;
+ const optional = path?.node.optional;
+ const prevComputed = prevPath?.node.computed;
+ const prevArray = t.isArrayExpression(prevPath);
+ const array = t.isArrayExpression(path);
+ const value = path?.node.property?.extra?.raw || "";
+
+ if (expression === "") {
+ if (computed) {
+ return name === undefined ? `[${value}]` : `[${name}]`;
+ }
+ return name;
+ }
+
+ if (computed || array) {
+ if (prevComputed || prevArray) {
+ return `[${name}]${expression}`;
+ }
+ return `[${name === undefined ? value : name}].${expression}`;
+ }
+
+ if (prevComputed || prevArray) {
+ return `${name}${expression}`;
+ }
+
+ if (isComputedExpression(expression) && name !== undefined) {
+ return `${name}${expression}`;
+ }
+
+ if (optional) {
+ return `${name}?.${expression}`;
+ }
+
+ return `${name}.${expression}`;
+}
+
+function getMemberSnippet(node, expression = "", optional = false) {
+ if (t.isMemberExpression(node) || t.isOptionalMemberExpression(node)) {
+ const name = t.isPrivateName(node.property)
+ ? `#${node.property.id.name}`
+ : node.property.name;
+ const snippet = getMemberSnippet(
+ node.object,
+ extendSnippet(name, expression, { node }),
+ node.optional
+ );
+ return snippet;
+ }
+
+ if (t.isCallExpression(node)) {
+ return "";
+ }
+
+ if (t.isThisExpression(node)) {
+ return `this.${expression}`;
+ }
+
+ if (t.isIdentifier(node)) {
+ if (isComputedExpression(expression)) {
+ return `${node.name}${expression}`;
+ }
+ if (optional) {
+ return `${node.name}?.${expression}`;
+ }
+ return `${node.name}.${expression}`;
+ }
+
+ return expression;
+}
+
+function getObjectSnippet(path, prevPath, expression = "") {
+ if (!path) {
+ return expression;
+ }
+
+ const { name } = path.node.key;
+
+ const extendedExpression = extendSnippet(name, expression, path, prevPath);
+
+ const nextPrevPath = path;
+ const nextPath = path.parentPath && path.parentPath.parentPath;
+
+ return getSnippet(nextPath, nextPrevPath, extendedExpression);
+}
+
+function getArraySnippet(path, prevPath, expression) {
+ if (!prevPath.parentPath) {
+ throw new Error("Assertion failure - path should exist");
+ }
+
+ const index = `${prevPath.parentPath.containerIndex}`;
+ const extendedExpression = extendSnippet(index, expression, path, prevPath);
+
+ const nextPrevPath = path;
+ const nextPath = path.parentPath && path.parentPath.parentPath;
+
+ return getSnippet(nextPath, nextPrevPath, extendedExpression);
+}
+
+function getSnippet(path, prevPath, expression = "") {
+ if (!path) {
+ return expression;
+ }
+
+ if (t.isVariableDeclaration(path)) {
+ const node = path.node.declarations[0];
+ const { name } = node.id;
+ return extendSnippet(name, expression, path, prevPath);
+ }
+
+ if (t.isVariableDeclarator(path)) {
+ const node = path.node.id;
+ if (t.isObjectPattern(node)) {
+ return expression;
+ }
+
+ const prop = extendSnippet(node.name, expression, path, prevPath);
+ return prop;
+ }
+
+ if (t.isAssignmentExpression(path)) {
+ const node = path.node.left;
+ const name = t.isMemberExpression(node)
+ ? getMemberSnippet(node)
+ : node.name;
+
+ const prop = extendSnippet(name, expression, path, prevPath);
+ return prop;
+ }
+
+ if (isFunction(path)) {
+ return expression;
+ }
+
+ if (t.isIdentifier(path)) {
+ return `${path.node.name}.${expression}`;
+ }
+
+ if (t.isObjectProperty(path)) {
+ return getObjectSnippet(path, prevPath, expression);
+ }
+
+ if (t.isObjectExpression(path)) {
+ const parentPath = prevPath?.parentPath;
+ return getObjectSnippet(parentPath, prevPath, expression);
+ }
+
+ if (t.isMemberExpression(path) || t.isOptionalMemberExpression(path)) {
+ return getMemberSnippet(path.node, expression);
+ }
+
+ if (t.isArrayExpression(path)) {
+ if (!prevPath) {
+ throw new Error("Assertion failure - path should exist");
+ }
+
+ return getArraySnippet(path, prevPath, expression);
+ }
+
+ return "";
+}
+
+export function clearSymbols(sourceIds) {
+ for (const sourceId of sourceIds) {
+ symbolDeclarations.delete(sourceId);
+ }
+}
+
+export function getInternalSymbols(sourceId) {
+ if (symbolDeclarations.has(sourceId)) {
+ const symbols = symbolDeclarations.get(sourceId);
+ if (symbols) {
+ return symbols;
+ }
+ }
+
+ const symbols = extractSymbols(sourceId);
+
+ symbolDeclarations.set(sourceId, symbols);
+ return symbols;
+}
+
+export function getFunctionSymbols(sourceId, maxResults) {
+ const symbols = getInternalSymbols(sourceId);
+ if (!symbols) {
+ return [];
+ }
+ let { functions } = symbols;
+ // Avoid transferring more symbols than necessary
+ if (maxResults && functions.length > maxResults) {
+ functions = functions.slice(0, maxResults);
+ }
+ // The Outline & the Quick open panels do not need anonymous functions
+ return functions.filter(fn => fn.name !== "anonymous");
+}
+
+export function getClassSymbols(sourceId) {
+ const symbols = getInternalSymbols(sourceId);
+ if (!symbols) {
+ return [];
+ }
+
+ return symbols.classes;
+}
+
+function containsPosition(a, b) {
+ const bColumn = b.column || 0;
+ const startsBefore =
+ a.start.line < b.line ||
+ (a.start.line === b.line && a.start.column <= bColumn);
+ const endsAfter =
+ a.end.line > b.line || (a.end.line === b.line && a.end.column >= bColumn);
+
+ return startsBefore && endsAfter;
+}
+
+export function getClosestFunctionName(location) {
+ const symbols = getInternalSymbols(location.source.id);
+ if (!symbols || !symbols.functions) {
+ return "";
+ }
+
+ const closestFunction = symbols.functions.reduce((found, currNode) => {
+ if (
+ currNode.name === "anonymous" ||
+ !containsPosition(currNode.location, {
+ line: location.line,
+ column: location.column || 0,
+ })
+ ) {
+ return found;
+ }
+
+ if (!found) {
+ return currNode;
+ }
+
+ if (found.location.start.line > currNode.location.start.line) {
+ return found;
+ }
+ if (
+ found.location.start.line === currNode.location.start.line &&
+ found.location.start.column > currNode.location.start.column
+ ) {
+ return found;
+ }
+
+ return currNode;
+ }, null);
+
+ if (!closestFunction) {
+ return "";
+ }
+ return closestFunction.name;
+}
+
+// This is only called from the main thread and we return a subset of attributes
+export function getSymbols(sourceId) {
+ const symbols = getInternalSymbols(sourceId);
+ return {
+ // This is used in the main thread by:
+ // * The `getFunctionSymbols` function which is used by the Outline, QuickOpen panels.
+ // * The `getClosestFunctionName` function used in the mapping of frame function names.
+ // * The `findOutOfScopeLocations` function use to determine in scope lines.
+ // functions: symbols.functions,
+
+ // The three following attributes are only used by `findBestMatchExpression` within the worker thread
+ // `memberExpressions`, `literals`
+ // This one is also used within the worker for framework computation
+ // `identifiers`
+ //
+ // These three memberExpressions, literals and identifiers attributes are arrays containing objects whose attributes are:
+ // * name: string
+ // * location: object {start: number, end: number}
+ // * expression: string
+ // * computed: boolean (only for memberExpressions)
+ //
+ // `findBestMatchExpression` uses `location`, `computed` and `expression` (not name).
+ // `expression` isn't used from the worker thread implementation of `findBestMatchExpression`.
+ // The main thread only uses `expression` and `location`.
+ // framework computation uses only:
+ // * `name` for identifiers
+ // * `expression` for memberExpression
+
+ // This is used within the worker for framework computation,
+ // and in the `getClassSymbols` function
+ // `classes`
+
+ // The two following are only used by the main thread for computing CodeMirror "mode"
+ hasJsx: symbols.hasJsx,
+ hasTypes: symbols.hasTypes,
+
+ // This is used in the main thread only to compute the source icon
+ framework: symbols.framework,
+
+ // This is only used by `findOutOfScopeLocations`:
+ // `comments`
+ };
+}
+
+function getMemberExpressionSymbol(path) {
+ const { start, end } = path.node.property.loc;
+ return {
+ location: { start, end },
+ get expression() {
+ delete this.expression;
+ this.expression = getSnippet(path);
+ return this.expression;
+ },
+ computed: path.node.computed,
+ };
+}
+
+function isReactImport(node) {
+ return (
+ node.source.value == "react" &&
+ node.specifiers?.some(specifier => specifier.local?.name == "React")
+ );
+}
+
+function isReactRequire(node) {
+ const { callee } = node;
+ const name = t.isMemberExpression(callee)
+ ? callee.property.name
+ : callee.loc.identifierName;
+ return name == "require" && node.arguments.some(arg => arg.value == "react");
+}
+
+function getClassParentName(superClass) {
+ return t.isMemberExpression(superClass)
+ ? getCode(superClass)
+ : superClass.name;
+}
+
+function getClassParentSymbol(superClass) {
+ if (!superClass) {
+ return null;
+ }
+ return {
+ name: getClassParentName(superClass),
+ location: superClass.loc,
+ };
+}
+
+function getClassDeclarationSymbol(node) {
+ const { loc, superClass } = node;
+ return {
+ name: node.id.name,
+ parent: getClassParentSymbol(superClass),
+ location: loc,
+ };
+}
+
+/**
+ * Get a list of identifiers that are part of the given path.
+ *
+ * @param {Array.<Object>} identifiers
+ * the current list of identifiers where to push the new identifiers
+ * related to this path.
+ * @param {Set<String>} identifiersKeys
+ * List of currently registered identifier location key.
+ * @param {Object} path
+ */
+function getIdentifierSymbols(identifiers, identifiersKeys, path) {
+ if (t.isStringLiteral(path) && t.isProperty(path.parentPath)) {
+ if (!identifiersKeys.has(nodeLocationKey(path.node.loc))) {
+ identifiers.push({
+ name: path.node.value,
+ get expression() {
+ delete this.expression;
+ this.expression = getObjectExpressionValue(path.parent);
+ return this.expression;
+ },
+ location: path.node.loc,
+ });
+ }
+ return;
+ }
+
+ if (t.isIdentifier(path) && !t.isGenericTypeAnnotation(path.parent)) {
+ // We want to include function params, but exclude the function name
+ if (t.isClassMethod(path.parent) && !path.inList) {
+ return;
+ }
+
+ if (t.isProperty(path.parentPath) && !isObjectShorthand(path.parent)) {
+ if (!identifiersKeys.has(nodeLocationKey(path.node.loc))) {
+ identifiers.push({
+ name: path.node.name,
+ get expression() {
+ delete this.expression;
+ this.expression = getObjectExpressionValue(path.parent);
+ return this.expression;
+ },
+ location: path.node.loc,
+ });
+ }
+ return;
+ }
+
+ let { start, end } = path.node.loc;
+ if (path.node.typeAnnotation) {
+ const { column } = path.node.typeAnnotation.loc.start;
+ end = { ...end, column };
+ }
+
+ if (!identifiersKeys.has(nodeLocationKey({ start, end }))) {
+ identifiers.push({
+ name: path.node.name,
+ expression: path.node.name,
+ location: { start, end },
+ });
+ }
+ }
+
+ if (t.isThisExpression(path.node)) {
+ if (!identifiersKeys.has(nodeLocationKey(path.node.loc))) {
+ identifiers.push({
+ name: "this",
+ location: path.node.loc,
+ expression: "this",
+ });
+ }
+ }
+
+ if (t.isVariableDeclarator(path)) {
+ const nodeId = path.node.id;
+
+ addPatternIdentifiers(identifiers, identifiersKeys, nodeId);
+ }
+}
diff --git a/devtools/client/debugger/src/workers/parser/index.js b/devtools/client/debugger/src/workers/parser/index.js
new file mode 100644
index 0000000000..d60c3d32aa
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/index.js
@@ -0,0 +1,55 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { WorkerDispatcher } from "devtools/client/shared/worker-utils";
+
+const WORKER_URL = "resource://devtools/client/debugger/dist/parser-worker.js";
+
+export class ParserDispatcher extends WorkerDispatcher {
+ constructor(jestUrl) {
+ super(jestUrl || WORKER_URL);
+ }
+
+ findOutOfScopeLocations = this.task("findOutOfScopeLocations");
+ findBestMatchExpression = this.task("findBestMatchExpression");
+
+ getScopes = this.task("getScopes");
+
+ getSymbols = this.task("getSymbols");
+ getFunctionSymbols = this.task("getFunctionSymbols");
+ getClassSymbols = this.task("getClassSymbols");
+ getClosestFunctionName = this.task("getClosestFunctionName");
+
+ async setSource(sourceId, content) {
+ const astSource = {
+ id: sourceId,
+ text: content.type === "wasm" ? "" : content.value,
+ contentType: content.contentType || null,
+ isWasm: content.type === "wasm",
+ };
+
+ return this.invoke("setSource", astSource);
+ }
+
+ mapExpression = this.task("mapExpression");
+
+ clearSources = this.task("clearSources");
+
+ /**
+ * Reports if the location's source can be parsed by this worker.
+ *
+ * @param {Object} location
+ * A debugger frontend location object. See createLocation().
+ * @return {Boolean}
+ * True, if the worker may be able to parse this source.
+ */
+ isLocationSupported(location) {
+ // There might be more sources that the worker doesn't support,
+ // like original sources which aren't JavaScript.
+ // But we can only know with the source's content type,
+ // which isn't available right away.
+ // These source will be ignored from within the worker.
+ return !location.source.isWasm;
+ }
+}
diff --git a/devtools/client/debugger/src/workers/parser/mapAwaitExpression.js b/devtools/client/debugger/src/workers/parser/mapAwaitExpression.js
new file mode 100644
index 0000000000..ec29d6cf21
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/mapAwaitExpression.js
@@ -0,0 +1,208 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import generate from "@babel/generator";
+import * as t from "@babel/types";
+
+import { hasNode, replaceNode } from "./utils/ast";
+import { isTopLevel } from "./utils/helpers";
+
+function hasTopLevelAwait(ast) {
+ const hasAwait = hasNode(
+ ast,
+ (node, ancestors, b) => t.isAwaitExpression(node) && isTopLevel(ancestors)
+ );
+
+ return hasAwait;
+}
+
+// translates new bindings `var a = 3` into `a = 3`.
+function translateDeclarationIntoAssignment(node) {
+ return node.declarations.reduce((acc, declaration) => {
+ // Don't translate declaration without initial assignment (e.g. `var a;`)
+ if (!declaration.init) {
+ return acc;
+ }
+ acc.push(
+ t.expressionStatement(
+ t.assignmentExpression("=", declaration.id, declaration.init)
+ )
+ );
+ return acc;
+ }, []);
+}
+
+/**
+ * Given an AST, modify it to return the last evaluated statement's expression value if possible.
+ * This is to preserve existing console behavior of displaying the last executed expression value.
+ */
+function addReturnNode(ast) {
+ const statements = ast.program.body;
+ const lastStatement = statements.pop();
+
+ // if the last expression is an awaitExpression, strip the `await` part and directly
+ // return the argument to avoid calling the argument's `then` function twice when the
+ // mapped expression gets evaluated (See Bug 1771428)
+ if (t.isAwaitExpression(lastStatement.expression)) {
+ lastStatement.expression = lastStatement.expression.argument;
+ }
+
+ // NOTE: For more complicated cases such as an if/for statement, the last evaluated
+ // expression value probably can not be displayed, unless doing hacky workarounds such
+ // as returning the `eval` of the final statement (won't always work due to CSP issues?)
+ // or SpiderMonkey support (See Bug 1839588) at which point this entire module can be removed.
+ statements.push(
+ t.isExpressionStatement(lastStatement)
+ ? t.returnStatement(lastStatement.expression)
+ : lastStatement
+ );
+ return statements;
+}
+
+function getDeclarations(node) {
+ const { kind, declarations } = node;
+ const declaratorNodes = declarations.reduce((acc, d) => {
+ const declarators = getVariableDeclarators(d.id);
+ return acc.concat(declarators);
+ }, []);
+
+ // We can't declare const variables outside of the async iife because we
+ // wouldn't be able to re-assign them. As a workaround, we transform them
+ // to `let` which should be good enough for those case.
+ return t.variableDeclaration(
+ kind === "const" ? "let" : kind,
+ declaratorNodes
+ );
+}
+
+function getVariableDeclarators(node) {
+ if (t.isIdentifier(node)) {
+ return t.variableDeclarator(t.identifier(node.name));
+ }
+
+ if (t.isObjectProperty(node)) {
+ return getVariableDeclarators(node.value);
+ }
+ if (t.isRestElement(node)) {
+ return getVariableDeclarators(node.argument);
+ }
+
+ if (t.isAssignmentPattern(node)) {
+ return getVariableDeclarators(node.left);
+ }
+
+ if (t.isArrayPattern(node)) {
+ return node.elements.reduce(
+ (acc, element) => acc.concat(getVariableDeclarators(element)),
+ []
+ );
+ }
+ if (t.isObjectPattern(node)) {
+ return node.properties.reduce(
+ (acc, property) => acc.concat(getVariableDeclarators(property)),
+ []
+ );
+ }
+ return [];
+}
+
+/**
+ * Given an AST and an array of variableDeclaration nodes, return a new AST with
+ * all the declarations at the top of the AST.
+ */
+function addTopDeclarationNodes(ast, declarationNodes) {
+ const statements = [];
+ declarationNodes.forEach(declarationNode => {
+ statements.push(getDeclarations(declarationNode));
+ });
+ statements.push(ast);
+ return t.program(statements);
+}
+
+/**
+ * Given an AST, return an object of the following shape:
+ * - newAst: {AST} the AST where variable declarations were transformed into
+ * variable assignments
+ * - declarations: {Array<Node>} An array of all the declaration nodes needed
+ * outside of the async iife.
+ */
+function translateDeclarationsIntoAssignment(ast) {
+ const declarations = [];
+ t.traverse(ast, (node, ancestors) => {
+ const parent = ancestors[ancestors.length - 1];
+
+ if (
+ t.isWithStatement(node) ||
+ !isTopLevel(ancestors) ||
+ t.isAssignmentExpression(node) ||
+ !t.isVariableDeclaration(node) ||
+ t.isForStatement(parent.node) ||
+ t.isForXStatement(parent.node) ||
+ !Array.isArray(node.declarations) ||
+ node.declarations.length === 0
+ ) {
+ return;
+ }
+
+ const newNodes = translateDeclarationIntoAssignment(node);
+ replaceNode(ancestors, newNodes);
+ declarations.push(node);
+ });
+
+ return {
+ newAst: ast,
+ declarations,
+ };
+}
+
+/**
+ * Given an AST, wrap its body in an async iife, transform variable declarations
+ * in assignments and move the variable declarations outside of the async iife.
+ * Example: With the AST for the following expression: `let a = await 123`, the
+ * function will return:
+ * let a;
+ * (async => {
+ * return a = await 123;
+ * })();
+ */
+function wrapExpressionFromAst(ast) {
+ // Transform let and var declarations into assignments, and get back an array
+ // of variable declarations.
+ let { newAst, declarations } = translateDeclarationsIntoAssignment(ast);
+ const body = addReturnNode(newAst);
+
+ // Create the async iife.
+ newAst = t.expressionStatement(
+ t.callExpression(
+ t.arrowFunctionExpression([], t.blockStatement(body), true),
+ []
+ )
+ );
+
+ // Now let's put all the variable declarations at the top of the async iife.
+ newAst = addTopDeclarationNodes(newAst, declarations);
+
+ return generate(newAst).code;
+}
+
+export default function mapTopLevelAwait(expression, ast) {
+ if (!ast) {
+ // If there's no ast this means the expression is malformed. And if the
+ // expression contains the await keyword, we still want to wrap it in an
+ // async iife in order to get a meaningful message (without this, the
+ // engine will throw an Error stating that await keywords are only valid
+ // in async functions and generators).
+ if (expression.includes("await ")) {
+ return `(async () => { ${expression} })();`;
+ }
+
+ return expression;
+ }
+
+ if (!hasTopLevelAwait(ast)) {
+ return expression;
+ }
+
+ return wrapExpressionFromAst(ast);
+}
diff --git a/devtools/client/debugger/src/workers/parser/mapBindings.js b/devtools/client/debugger/src/workers/parser/mapBindings.js
new file mode 100644
index 0000000000..f8260787f1
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/mapBindings.js
@@ -0,0 +1,120 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { replaceNode } from "./utils/ast";
+import { isTopLevel } from "./utils/helpers";
+
+import generate from "@babel/generator";
+import * as t from "@babel/types";
+
+function getAssignmentTarget(node, bindings) {
+ if (t.isObjectPattern(node)) {
+ for (const property of node.properties) {
+ if (t.isRestElement(property)) {
+ property.argument = getAssignmentTarget(property.argument, bindings);
+ } else {
+ property.value = getAssignmentTarget(property.value, bindings);
+ }
+ }
+
+ return node;
+ }
+
+ if (t.isArrayPattern(node)) {
+ for (const [i, element] of node.elements.entries()) {
+ node.elements[i] = getAssignmentTarget(element, bindings);
+ }
+
+ return node;
+ }
+
+ if (t.isAssignmentPattern(node)) {
+ node.left = getAssignmentTarget(node.left, bindings);
+
+ return node;
+ }
+
+ if (t.isRestElement(node)) {
+ node.argument = getAssignmentTarget(node.argument, bindings);
+
+ return node;
+ }
+
+ if (t.isIdentifier(node)) {
+ return bindings.includes(node.name)
+ ? node
+ : t.memberExpression(t.identifier("self"), node);
+ }
+
+ return node;
+}
+
+// translates new bindings `var a = 3` into `self.a = 3`
+// and existing bindings `var a = 3` into `a = 3` for re-assignments
+function globalizeDeclaration(node, bindings) {
+ return node.declarations.map(declaration =>
+ t.expressionStatement(
+ t.assignmentExpression(
+ "=",
+ getAssignmentTarget(declaration.id, bindings),
+ declaration.init || t.unaryExpression("void", t.numericLiteral(0))
+ )
+ )
+ );
+}
+
+// translates new bindings `a = 3` into `self.a = 3`
+// and keeps assignments the same for existing bindings.
+function globalizeAssignment(node, bindings) {
+ return t.assignmentExpression(
+ node.operator,
+ getAssignmentTarget(node.left, bindings),
+ node.right
+ );
+}
+
+export default function mapExpressionBindings(expression, ast, bindings = []) {
+ let isMapped = false;
+ let shouldUpdate = true;
+
+ t.traverse(ast, (node, ancestors) => {
+ const parent = ancestors[ancestors.length - 1];
+
+ if (t.isWithStatement(node)) {
+ shouldUpdate = false;
+ return;
+ }
+
+ if (!isTopLevel(ancestors)) {
+ return;
+ }
+
+ if (t.isAssignmentExpression(node)) {
+ if (t.isIdentifier(node.left) || t.isPattern(node.left)) {
+ const newNode = globalizeAssignment(node, bindings);
+ isMapped = true;
+ replaceNode(ancestors, newNode);
+ return;
+ }
+
+ return;
+ }
+
+ if (!t.isVariableDeclaration(node)) {
+ return;
+ }
+
+ if (!t.isForStatement(parent.node)) {
+ const newNodes = globalizeDeclaration(node, bindings);
+ isMapped = true;
+ replaceNode(ancestors, newNodes);
+ }
+ });
+
+ if (!shouldUpdate || !isMapped) {
+ return expression;
+ }
+
+ return generate(ast).code;
+}
diff --git a/devtools/client/debugger/src/workers/parser/mapExpression.js b/devtools/client/debugger/src/workers/parser/mapExpression.js
new file mode 100644
index 0000000000..71f3b016fc
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/mapExpression.js
@@ -0,0 +1,50 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { parseConsoleScript } from "./utils/ast";
+import mapOriginalExpression from "./mapOriginalExpression";
+import mapExpressionBindings from "./mapBindings";
+import mapTopLevelAwait from "./mapAwaitExpression";
+
+export default function mapExpression(
+ expression,
+ mappings,
+ bindings,
+ shouldMapBindings = true,
+ shouldMapAwait = true
+) {
+ const mapped = {
+ await: false,
+ bindings: false,
+ originalExpression: false,
+ };
+
+ const ast = parseConsoleScript(expression);
+ try {
+ if (mappings && ast) {
+ const beforeOriginalExpression = expression;
+ expression = mapOriginalExpression(expression, ast, mappings);
+ mapped.originalExpression = beforeOriginalExpression !== expression;
+ }
+
+ if (shouldMapBindings && ast) {
+ const beforeBindings = expression;
+ expression = mapExpressionBindings(expression, ast, bindings);
+ mapped.bindings = beforeBindings !== expression;
+ }
+
+ if (shouldMapAwait) {
+ const beforeAwait = expression;
+ expression = mapTopLevelAwait(expression, ast);
+ mapped.await = beforeAwait !== expression;
+ }
+ } catch (e) {
+ console.warn(`Error when mapping ${expression} expression:`, e);
+ }
+
+ return {
+ expression,
+ mapped,
+ };
+}
diff --git a/devtools/client/debugger/src/workers/parser/mapOriginalExpression.js b/devtools/client/debugger/src/workers/parser/mapOriginalExpression.js
new file mode 100644
index 0000000000..1724db9838
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/mapOriginalExpression.js
@@ -0,0 +1,106 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { parseScript } from "./utils/ast";
+import { buildScopeList } from "./getScopes";
+import generate from "@babel/generator";
+import * as t from "@babel/types";
+
+// NOTE: this will only work if we are replacing an original identifier
+function replaceNode(ancestors, node) {
+ const ancestor = ancestors[ancestors.length - 1];
+
+ if (typeof ancestor.index === "number") {
+ ancestor.node[ancestor.key][ancestor.index] = node;
+ } else {
+ ancestor.node[ancestor.key] = node;
+ }
+}
+
+function getFirstExpression(ast) {
+ const statements = ast.program.body;
+ if (!statements.length) {
+ return null;
+ }
+
+ return statements[0].expression;
+}
+
+function locationKey(start) {
+ return `${start.line}:${start.column}`;
+}
+
+export default function mapOriginalExpression(expression, ast, mappings) {
+ const scopes = buildScopeList(ast, "");
+ let shouldUpdate = false;
+
+ const nodes = new Map();
+ const replacements = new Map();
+
+ // The ref-only global bindings are the ones that are accessed, but not
+ // declared anywhere in the parsed code, meaning they are either global,
+ // or declared somewhere in a scope outside the parsed code, so we
+ // rewrite all of those specifically to avoid rewritting declarations that
+ // shadow outer mappings.
+ for (const name of Object.keys(scopes[0].bindings)) {
+ const { refs } = scopes[0].bindings[name];
+ const mapping = mappings[name];
+
+ if (
+ !refs.every(ref => ref.type === "ref") ||
+ !mapping ||
+ mapping === name
+ ) {
+ continue;
+ }
+
+ let node = nodes.get(name);
+ if (!node) {
+ node = getFirstExpression(parseScript(mapping));
+ nodes.set(name, node);
+ }
+
+ for (const ref of refs) {
+ let { line, column } = ref.start;
+
+ // This shouldn't happen, just keeping Flow happy.
+ if (typeof column !== "number") {
+ column = 0;
+ }
+
+ replacements.set(locationKey({ line, column }), node);
+ }
+ }
+
+ if (replacements.size === 0) {
+ // Avoid the extra code generation work and also avoid potentially
+ // reformatting the user's code unnecessarily.
+ return expression;
+ }
+
+ t.traverse(ast, (node, ancestors) => {
+ if (!t.isIdentifier(node) && !t.isThisExpression(node)) {
+ return;
+ }
+
+ const ancestor = ancestors[ancestors.length - 1];
+ // Shorthand properties can have a key and value with `node.loc.start` value
+ // and we only want to replace the value.
+ if (t.isObjectProperty(ancestor.node) && ancestor.key !== "value") {
+ return;
+ }
+
+ const replacement = replacements.get(locationKey(node.loc.start));
+ if (replacement) {
+ replaceNode(ancestors, t.cloneNode(replacement));
+ shouldUpdate = true;
+ }
+ });
+
+ if (shouldUpdate) {
+ return generate(ast).code;
+ }
+
+ return expression;
+}
diff --git a/devtools/client/debugger/src/workers/parser/moz.build b/devtools/client/debugger/src/workers/parser/moz.build
new file mode 100644
index 0000000000..b7223ac81a
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/moz.build
@@ -0,0 +1,10 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DIRS += []
+
+CompiledModules(
+ "index.js",
+)
diff --git a/devtools/client/debugger/src/workers/parser/sources.js b/devtools/client/debugger/src/workers/parser/sources.js
new file mode 100644
index 0000000000..24d358c566
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/sources.js
@@ -0,0 +1,24 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+const cachedSources = new Map();
+
+export function setSource(source) {
+ cachedSources.set(source.id, source);
+}
+
+export function getSource(sourceId) {
+ const source = cachedSources.get(sourceId);
+ if (!source) {
+ throw new Error(`Parser: source ${sourceId} was not provided.`);
+ }
+
+ return source;
+}
+
+export function clearSources(sourceIds) {
+ for (const sourceId of sourceIds) {
+ cachedSources.delete(sourceId);
+ }
+}
diff --git a/devtools/client/debugger/src/workers/parser/tests/__snapshots__/findOutOfScopeLocations.spec.js.snap b/devtools/client/debugger/src/workers/parser/tests/__snapshots__/findOutOfScopeLocations.spec.js.snap
new file mode 100644
index 0000000000..4689f0c824
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/__snapshots__/findOutOfScopeLocations.spec.js.snap
@@ -0,0 +1,47 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`Parser.findOutOfScopeLocations should exclude function for locations on declaration 1`] = `
+"(1, 0) -> (1, 16)
+(3, 14) -> (27, 1)
+(29, 16) -> (33, 1)
+(35, 20) -> (37, 1)
+(39, 26) -> (41, 1)
+(43, 20) -> (45, 1)
+(47, 31) -> (49, 1)
+(51, 19) -> (62, 1)"
+`;
+
+exports[`Parser.findOutOfScopeLocations should exclude non-enclosing function blocks 1`] = `
+"(1, 0) -> (1, 16)
+(8, 16) -> (10, 3)
+(12, 22) -> (14, 3)
+(16, 16) -> (18, 3)
+(20, 27) -> (22, 3)
+(24, 9) -> (26, 3)
+(29, 16) -> (33, 1)
+(35, 20) -> (37, 1)
+(39, 26) -> (41, 1)
+(43, 20) -> (45, 1)
+(47, 31) -> (49, 1)
+(51, 19) -> (62, 1)"
+`;
+
+exports[`Parser.findOutOfScopeLocations should not exclude in-scope inner locations 1`] = `
+"(1, 0) -> (1, 16)
+(3, 14) -> (27, 1)
+(29, 16) -> (33, 1)
+(35, 20) -> (37, 1)
+(39, 26) -> (41, 1)
+(43, 20) -> (45, 1)
+(47, 31) -> (49, 1)"
+`;
+
+exports[`Parser.findOutOfScopeLocations should roll up function blocks 1`] = `
+"(1, 0) -> (1, 16)
+(29, 16) -> (33, 1)
+(35, 20) -> (37, 1)
+(39, 26) -> (41, 1)
+(43, 20) -> (45, 1)
+(47, 31) -> (49, 1)
+(51, 19) -> (62, 1)"
+`;
diff --git a/devtools/client/debugger/src/workers/parser/tests/__snapshots__/getScopes.spec.js.snap b/devtools/client/debugger/src/workers/parser/tests/__snapshots__/getScopes.spec.js.snap
new file mode 100644
index 0000000000..b579b89587
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/__snapshots__/getScopes.spec.js.snap
@@ -0,0 +1,18895 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`Parser.getScopes finds scope bindings and exclude Flowtype: getScopes finds scope bindings and exclude Flowtype at line 8 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "aConst": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 39,
+ "line": 7,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 7,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 7,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 7,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "type": "const",
+ },
+ ],
+ "type": "const",
+ },
+ "root": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "start": Object {
+ "column": 15,
+ "line": 9,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 28,
+ "line": 9,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "start": Object {
+ "column": 24,
+ "line": 9,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "window": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 22,
+ "line": 7,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 16,
+ "line": 7,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings and exclude Flowtype: getScopes finds scope bindings and exclude Flowtype at line 10 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "root",
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 15,
+ "line": 9,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "aConst": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 39,
+ "line": 7,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 7,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 7,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 7,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "type": "const",
+ },
+ ],
+ "type": "const",
+ },
+ "root": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "start": Object {
+ "column": 15,
+ "line": 9,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 28,
+ "line": 9,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "start": Object {
+ "column": 24,
+ "line": 9,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "window": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 22,
+ "line": 7,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 16,
+ "line": 7,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/flowtype-bindings/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for arrow functions: getScopes finds scope bindings for arrow functions at line 2 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "outer": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 2,
+ "line": 11,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 18,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 14,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 9,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 13,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 2,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 13,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 17,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 6,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for arrow functions: getScopes finds scope bindings for arrow functions at line 4 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "p1": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 15,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 13,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "fn-param",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "outer",
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 13,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "outer": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 2,
+ "line": 11,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 18,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 14,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 9,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 13,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 2,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 13,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 17,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 6,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for arrow functions: getScopes finds scope bindings for arrow functions at line 7 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "inner": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 6,
+ "line": 9,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 7,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 22,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 18,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ },
+ "displayName": "anonymous",
+ "end": Object {
+ "column": 3,
+ "line": 10,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 3,
+ "line": 6,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "p1": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 15,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 13,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "fn-param",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "outer",
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 13,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "outer": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 2,
+ "line": 11,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 18,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 14,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 9,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 13,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 2,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 13,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 17,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 6,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for arrow functions: getScopes finds scope bindings for arrow functions at line 8 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "p2": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 5,
+ "line": 9,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 16,
+ "line": 7,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 19,
+ "line": 7,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 17,
+ "line": 7,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "fn-param",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "inner",
+ "end": Object {
+ "column": 5,
+ "line": 9,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 17,
+ "line": 7,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "inner": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 6,
+ "line": 9,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 7,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 22,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 18,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ },
+ "displayName": "anonymous",
+ "end": Object {
+ "column": 3,
+ "line": 10,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 3,
+ "line": 6,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "p1": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 15,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 13,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "fn-param",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "outer",
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 13,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "outer": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 2,
+ "line": 11,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 3,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 18,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 14,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 9,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 13,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 2,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 4,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 13,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 17,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 6,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 8,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/arrow-function/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for block statements: getScopes finds scope bindings for block statements at line 2 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "first": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 10,
+ "line": 3,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 3,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "second": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 6,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 6,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 6,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 6,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "seventh": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 13,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 13,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 13,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 13,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for block statements: getScopes finds scope bindings for block statements at line 6 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "Fourth": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 17,
+ "line": 8,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 8,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 8,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 8,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ "fifth": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 9,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 9,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 9,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 9,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "sixth": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 18,
+ "line": 10,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 10,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 10,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 10,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "type": "const",
+ },
+ ],
+ "type": "const",
+ },
+ "third": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 21,
+ "line": 7,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 7,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 16,
+ "line": 7,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 11,
+ "line": 7,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Block",
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 5,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "first": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 10,
+ "line": 3,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 3,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "second": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 6,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 6,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 6,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 6,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "seventh": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 13,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 13,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 13,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 13,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/block-statement/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for class declarations: getScopes finds scope bindings for class declarations at line 2 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "Outer": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 3,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 3,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ "Second": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 15,
+ "line": 14,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 14,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 14,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 15,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 15,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 15,
+ "line": 7,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 19,
+ "line": 7,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "decorator": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 10,
+ "line": 13,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 13,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 15,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for class declarations: getScopes finds scope bindings for class declarations at line 5 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "Inner": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 5,
+ "line": 9,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 5,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 15,
+ "line": 5,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 10,
+ "line": 5,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Function Body",
+ "end": Object {
+ "column": 3,
+ "line": 10,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 11,
+ "line": 4,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "method",
+ "end": Object {
+ "column": 3,
+ "line": 10,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 2,
+ "line": 4,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "Outer": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 3,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 3,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "class-inner",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "Class",
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Outer": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 3,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 3,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ "Second": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 15,
+ "line": 14,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 14,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 14,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 15,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 15,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 15,
+ "line": 7,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 19,
+ "line": 7,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "decorator": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 10,
+ "line": 13,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 13,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 15,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for class declarations: getScopes finds scope bindings for class declarations at line 7 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 24,
+ "line": 7,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 20,
+ "line": 7,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ },
+ "displayName": "m",
+ "end": Object {
+ "column": 7,
+ "line": 8,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 6,
+ "line": 6,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "Inner": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 5,
+ "line": 9,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 5,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 15,
+ "line": 5,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 10,
+ "line": 5,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "class-inner",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "Class",
+ "end": Object {
+ "column": 5,
+ "line": 9,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 4,
+ "line": 5,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Inner": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 5,
+ "line": 9,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 5,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 15,
+ "line": 5,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 10,
+ "line": 5,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Function Body",
+ "end": Object {
+ "column": 3,
+ "line": 10,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 11,
+ "line": 4,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "method",
+ "end": Object {
+ "column": 3,
+ "line": 10,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 2,
+ "line": 4,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "Outer": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 3,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 3,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "class-inner",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "Class",
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Outer": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 3,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 3,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ "Second": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 15,
+ "line": 14,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 14,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 14,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 15,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 15,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 15,
+ "line": 7,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 19,
+ "line": 7,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "decorator": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 10,
+ "line": 13,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 13,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 15,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-declaration/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for class expressions: getScopes finds scope bindings for class expressions at line 2 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "Outer": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 2,
+ "line": 11,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 3,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 15,
+ "line": 7,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 19,
+ "line": 7,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for class expressions: getScopes finds scope bindings for class expressions at line 5 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "Inner": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 6,
+ "line": 9,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 5,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 5,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 5,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "method",
+ "end": Object {
+ "column": 3,
+ "line": 10,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 2,
+ "line": 4,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "Outer": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 23,
+ "line": 3,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 18,
+ "line": 3,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "class-inner",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "Class",
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Outer": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 2,
+ "line": 11,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 3,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 15,
+ "line": 7,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 19,
+ "line": 7,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for class expressions: getScopes finds scope bindings for class expressions at line 7 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 24,
+ "line": 7,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 20,
+ "line": 7,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ },
+ "displayName": "m",
+ "end": Object {
+ "column": 7,
+ "line": 8,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 6,
+ "line": 6,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "Inner": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 6,
+ "line": 9,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 5,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 5,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 5,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "method",
+ "end": Object {
+ "column": 3,
+ "line": 10,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 2,
+ "line": 4,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "Outer": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 23,
+ "line": 3,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 18,
+ "line": 3,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "class-inner",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "Class",
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Outer": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 2,
+ "line": 11,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 3,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 15,
+ "line": 7,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 19,
+ "line": 7,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-expression/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for class properties: getScopes finds scope bindings for class properties at line 2 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "Foo": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 10,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 11,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 11,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 11,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for class properties: getScopes finds scope bindings for class properties at line 4 column 16 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 13,
+ "line": 4,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 18,
+ "line": 4,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "parent": Object {
+ "end": Object {
+ "column": 20,
+ "line": 4,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "parent": null,
+ "start": Object {
+ "column": 9,
+ "line": 4,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "call",
+ },
+ "property": "init",
+ "start": Object {
+ "column": 9,
+ "line": 4,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 4,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Class Field",
+ "end": Object {
+ "column": 20,
+ "line": 4,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 9,
+ "line": 4,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "Foo": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 10,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "class-inner",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "Class",
+ "end": Object {
+ "column": 1,
+ "line": 10,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Foo": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 10,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 11,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 11,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 11,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for class properties: getScopes finds scope bindings for class properties at line 6 column 12 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "one": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 7,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 7,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 7,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Class Field",
+ "end": Object {
+ "column": 3,
+ "line": 9,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 10,
+ "line": 6,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "Foo": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 10,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "class-inner",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "Class",
+ "end": Object {
+ "column": 1,
+ "line": 10,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Foo": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 10,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 11,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 11,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 11,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for class properties: getScopes finds scope bindings for class properties at line 7 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "two": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 8,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 8,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 8,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 8,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Block",
+ "end": Object {
+ "column": 3,
+ "line": 9,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 13,
+ "line": 6,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "one": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 7,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 7,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 7,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Class Field",
+ "end": Object {
+ "column": 3,
+ "line": 9,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 10,
+ "line": 6,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "Foo": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 10,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "class-inner",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "Class",
+ "end": Object {
+ "column": 1,
+ "line": 10,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Foo": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 10,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 3,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 11,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 11,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 11,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/class-property/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for complex binding nesting: getScopes finds scope bindings for complex binding nesting at line 16 column 4 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "_arguments": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 31,
+ "line": 13,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 12,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 18,
+ "line": 13,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 13,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "var",
+ },
+ Object {
+ "end": Object {
+ "column": 35,
+ "line": 19,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 25,
+ "line": 19,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "_this": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 31,
+ "line": 13,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 12,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 12,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 12,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "var",
+ },
+ Object {
+ "end": Object {
+ "column": 23,
+ "line": 19,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 18,
+ "line": 19,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "arg": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 3,
+ "line": 23,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 11,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 17,
+ "line": 11,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "fn-param",
+ },
+ ],
+ "type": "var",
+ },
+ "arguments": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 30,
+ "line": 13,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 21,
+ "line": 13,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 31,
+ "line": 15,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 22,
+ "line": 15,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ "arrow": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 6,
+ "line": 21,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 18,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 18,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 18,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "var",
+ },
+ Object {
+ "end": Object {
+ "column": 9,
+ "line": 22,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 4,
+ "line": 22,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 20,
+ "line": 12,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 16,
+ "line": 12,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 20,
+ "line": 15,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 16,
+ "line": 15,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ },
+ "displayName": "fn",
+ "end": Object {
+ "column": 3,
+ "line": 23,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 3,
+ "line": 23,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 11,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 11,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 11,
+ "line": 11,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 32,
+ "line": 16,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 30,
+ "line": 16,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 34,
+ "line": 20,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 32,
+ "line": 20,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 4,
+ "line": 25,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 9,
+ "line": 25,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "parent": null,
+ "property": "call",
+ "start": Object {
+ "column": 2,
+ "line": 25,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 25,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "root",
+ "end": Object {
+ "column": 1,
+ "line": 26,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "__webpack_require__": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 29,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 51,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 32,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "fn-param",
+ },
+ ],
+ "type": "var",
+ },
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "exports": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 29,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 30,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 23,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "fn-param",
+ },
+ Object {
+ "end": Object {
+ "column": 29,
+ "line": 6,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 22,
+ "line": 6,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 9,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 15,
+ "line": 9,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "parent": null,
+ "property": "default",
+ "start": Object {
+ "column": 0,
+ "line": 9,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 9,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 24,
+ "line": 27,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 35,
+ "line": 27,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "parent": null,
+ "property": "default",
+ "start": Object {
+ "column": 17,
+ "line": 27,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 17,
+ "line": 27,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "module": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 29,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 21,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 15,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "fn-param",
+ },
+ Object {
+ "end": Object {
+ "column": 6,
+ "line": 27,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 14,
+ "line": 27,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "parent": null,
+ "property": "exports",
+ "start": Object {
+ "column": 0,
+ "line": 27,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 27,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "root": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 26,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 10,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 10,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 22,
+ "line": 9,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 18,
+ "line": 9,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 38,
+ "line": 16,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 34,
+ "line": 16,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 40,
+ "line": 20,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 36,
+ "line": 20,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "named",
+ "end": Object {
+ "column": 1,
+ "line": 29,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 15,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 30,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Object": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 6,
+ "line": 6,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 21,
+ "line": 6,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "parent": null,
+ "property": "defineProperty",
+ "start": Object {
+ "column": 0,
+ "line": 6,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 6,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 15,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 15,
+ "line": 15,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 4,
+ "line": 15,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 15,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 16,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 15,
+ "line": 16,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 4,
+ "line": 16,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 16,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 13,
+ "line": 19,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 17,
+ "line": 19,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 6,
+ "line": 19,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 19,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 13,
+ "line": 20,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 17,
+ "line": 20,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 6,
+ "line": 20,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 20,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "named": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 29,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 30,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for complex binding nesting: getScopes finds scope bindings for complex binding nesting at line 20 column 6 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "argArrow": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 5,
+ "line": 21,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 16,
+ "line": 18,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 39,
+ "line": 18,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 31,
+ "line": 18,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "fn-param",
+ },
+ ],
+ "type": "var",
+ },
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "arrow",
+ "end": Object {
+ "column": 5,
+ "line": 21,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 31,
+ "line": 18,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "arrow": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 5,
+ "line": 21,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 16,
+ "line": 18,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 30,
+ "line": 18,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 25,
+ "line": 18,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "fn-expr",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "Function Expression",
+ "end": Object {
+ "column": 5,
+ "line": 21,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 16,
+ "line": 18,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "_arguments": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 31,
+ "line": 13,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 12,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 18,
+ "line": 13,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 13,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "var",
+ },
+ Object {
+ "end": Object {
+ "column": 35,
+ "line": 19,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 25,
+ "line": 19,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "_this": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 31,
+ "line": 13,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 12,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 12,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 12,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "var",
+ },
+ Object {
+ "end": Object {
+ "column": 23,
+ "line": 19,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 18,
+ "line": 19,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "arg": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 3,
+ "line": 23,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 11,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 17,
+ "line": 11,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "fn-param",
+ },
+ ],
+ "type": "var",
+ },
+ "arguments": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 30,
+ "line": 13,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 21,
+ "line": 13,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 31,
+ "line": 15,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 22,
+ "line": 15,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ "arrow": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 6,
+ "line": 21,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 18,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 18,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 18,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "var",
+ },
+ Object {
+ "end": Object {
+ "column": 9,
+ "line": 22,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 4,
+ "line": 22,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 20,
+ "line": 12,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 16,
+ "line": 12,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 20,
+ "line": 15,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 16,
+ "line": 15,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ },
+ "displayName": "fn",
+ "end": Object {
+ "column": 3,
+ "line": 23,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 3,
+ "line": 23,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 11,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 11,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 11,
+ "line": 11,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 32,
+ "line": 16,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 30,
+ "line": 16,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 34,
+ "line": 20,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 32,
+ "line": 20,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 4,
+ "line": 25,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 9,
+ "line": 25,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "parent": null,
+ "property": "call",
+ "start": Object {
+ "column": 2,
+ "line": 25,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 25,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "root",
+ "end": Object {
+ "column": 1,
+ "line": 26,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "__webpack_require__": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 29,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 51,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 32,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "fn-param",
+ },
+ ],
+ "type": "var",
+ },
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "exports": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 29,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 30,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 23,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "fn-param",
+ },
+ Object {
+ "end": Object {
+ "column": 29,
+ "line": 6,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 22,
+ "line": 6,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 9,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 15,
+ "line": 9,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "parent": null,
+ "property": "default",
+ "start": Object {
+ "column": 0,
+ "line": 9,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 9,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 24,
+ "line": 27,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 35,
+ "line": 27,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "parent": null,
+ "property": "default",
+ "start": Object {
+ "column": 17,
+ "line": 27,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 17,
+ "line": 27,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "module": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 29,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 21,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 15,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "fn-param",
+ },
+ Object {
+ "end": Object {
+ "column": 6,
+ "line": 27,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 14,
+ "line": 27,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "parent": null,
+ "property": "exports",
+ "start": Object {
+ "column": 0,
+ "line": 27,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 27,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "root": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 26,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 10,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 10,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 22,
+ "line": 9,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 18,
+ "line": 9,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 38,
+ "line": 16,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 34,
+ "line": 16,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 40,
+ "line": 20,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 36,
+ "line": 20,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "named",
+ "end": Object {
+ "column": 1,
+ "line": 29,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 15,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 30,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Object": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 6,
+ "line": 6,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 21,
+ "line": 6,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "parent": null,
+ "property": "defineProperty",
+ "start": Object {
+ "column": 0,
+ "line": 6,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 6,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 15,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 15,
+ "line": 15,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 4,
+ "line": 15,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 15,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 16,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 15,
+ "line": 16,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 4,
+ "line": 16,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 16,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 13,
+ "line": 19,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 17,
+ "line": 19,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 6,
+ "line": 19,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 19,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 13,
+ "line": 20,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 17,
+ "line": 20,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 6,
+ "line": 20,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 20,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "named": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 29,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 30,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/complex-nesting/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for declarations with patterns: getScopes finds scope bindings for declarations with patterns at line 1 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/pattern-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/pattern-declarations/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "one": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 23,
+ "line": 1,
+ "sourceId": "scopes/pattern-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/pattern-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 15,
+ "line": 1,
+ "sourceId": "scopes/pattern-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 12,
+ "line": 1,
+ "sourceId": "scopes/pattern-declarations/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "two": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 17,
+ "line": 2,
+ "sourceId": "scopes/pattern-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 2,
+ "sourceId": "scopes/pattern-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 2,
+ "sourceId": "scopes/pattern-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 2,
+ "sourceId": "scopes/pattern-declarations/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/pattern-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/pattern-declarations/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for for loops: getScopes finds scope bindings for for loops at line 2 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "four": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "one": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "seven": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for for loops: getScopes finds scope bindings for for loops at line 3 column 17 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "four": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "one": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "seven": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for for loops: getScopes finds scope bindings for for loops at line 4 column 17 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "two": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 4,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 4,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 4,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 4,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "For",
+ "end": Object {
+ "column": 18,
+ "line": 4,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 5,
+ "line": 4,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "four": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "one": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "seven": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for for loops: getScopes finds scope bindings for for loops at line 5 column 25 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "three": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 20,
+ "line": 5,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 5,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 16,
+ "line": 5,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 11,
+ "line": 5,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "const",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "For",
+ "end": Object {
+ "column": 26,
+ "line": 5,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 5,
+ "line": 5,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "four": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "one": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "seven": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for for loops: getScopes finds scope bindings for for loops at line 7 column 22 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "four": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "one": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "seven": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for for loops: getScopes finds scope bindings for for loops at line 8 column 22 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "five": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 8,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 8,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 8,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 8,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "For",
+ "end": Object {
+ "column": 23,
+ "line": 8,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 5,
+ "line": 8,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "four": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "one": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "seven": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for for loops: getScopes finds scope bindings for for loops at line 9 column 23 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "six": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 14,
+ "line": 9,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 9,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 9,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 11,
+ "line": 9,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "const",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "For",
+ "end": Object {
+ "column": 24,
+ "line": 9,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 5,
+ "line": 9,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "four": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "one": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "seven": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for for loops: getScopes finds scope bindings for for loops at line 11 column 23 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "four": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "one": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "seven": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for for loops: getScopes finds scope bindings for for loops at line 12 column 23 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "eight": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 14,
+ "line": 12,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 12,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 12,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 12,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "For",
+ "end": Object {
+ "column": 24,
+ "line": 12,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 5,
+ "line": 12,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "four": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "one": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "seven": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for for loops: getScopes finds scope bindings for for loops at line 13 column 24 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "nine": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 15,
+ "line": 13,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 13,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 15,
+ "line": 13,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 11,
+ "line": 13,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "const",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "For",
+ "end": Object {
+ "column": 25,
+ "line": 13,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 5,
+ "line": 13,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "four": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 7,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "one": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "seven": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 11,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/for-loops/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for function declarations: getScopes finds scope bindings for function declarations at line 2 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "outer": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 21,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 9,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 15,
+ "line": 9,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 4,
+ "line": 9,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 9,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for function declarations: getScopes finds scope bindings for function declarations at line 3 column 20 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "p1": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 21,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 17,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 15,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "fn-param",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "outer",
+ "end": Object {
+ "column": 21,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 15,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "outer": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 21,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 9,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 15,
+ "line": 9,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 4,
+ "line": 9,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 9,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for function declarations: getScopes finds scope bindings for function declarations at line 5 column 1 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "middle": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 3,
+ "line": 10,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 6,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 17,
+ "line": 6,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 11,
+ "line": 6,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Block",
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 5,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "outer": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 21,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 9,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 15,
+ "line": 9,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 4,
+ "line": 9,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 9,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for function declarations: getScopes finds scope bindings for function declarations at line 9 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "inner": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 25,
+ "line": 7,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 7,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 18,
+ "line": 7,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 13,
+ "line": 7,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "p2": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 3,
+ "line": 10,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 6,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 20,
+ "line": 6,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 18,
+ "line": 6,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "fn-param",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 20,
+ "line": 9,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 16,
+ "line": 9,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ },
+ "displayName": "middle",
+ "end": Object {
+ "column": 3,
+ "line": 10,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 18,
+ "line": 6,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "middle": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 3,
+ "line": 10,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 6,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 17,
+ "line": 6,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 11,
+ "line": 6,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Block",
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 5,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "outer": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 21,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 9,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 15,
+ "line": 9,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 4,
+ "line": 9,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 9,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-declaration/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for function expressions: getScopes finds scope bindings for function expressions at line 2 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 25,
+ "line": 3,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 6,
+ "line": 3,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 3,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "fn2": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 2,
+ "line": 7,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 5,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 7,
+ "line": 5,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 5,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 8,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 8,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 9,
+ "line": 6,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 13,
+ "line": 6,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 2,
+ "line": 6,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 6,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 8,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for function expressions: getScopes finds scope bindings for function expressions at line 3 column 23 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "p1": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 24,
+ "line": 3,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 20,
+ "line": 3,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 18,
+ "line": 3,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "fn-param",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "fn",
+ "end": Object {
+ "column": 24,
+ "line": 3,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 18,
+ "line": 3,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 25,
+ "line": 3,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 6,
+ "line": 3,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 3,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "fn2": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 2,
+ "line": 7,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 5,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 7,
+ "line": 5,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 5,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 8,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 8,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 9,
+ "line": 6,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 13,
+ "line": 6,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 2,
+ "line": 6,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 6,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 8,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for function expressions: getScopes finds scope bindings for function expressions at line 6 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "p2": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 7,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 10,
+ "line": 5,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 30,
+ "line": 5,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 28,
+ "line": 5,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "fn-param",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 18,
+ "line": 6,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 14,
+ "line": 6,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ },
+ "displayName": "withName",
+ "end": Object {
+ "column": 1,
+ "line": 7,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 28,
+ "line": 5,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "withName": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 7,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 10,
+ "line": 5,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 27,
+ "line": 5,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 19,
+ "line": 5,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "fn-expr",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "Function Expression",
+ "end": Object {
+ "column": 1,
+ "line": 7,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 10,
+ "line": 5,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 25,
+ "line": 3,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 6,
+ "line": 3,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 3,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "fn2": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 2,
+ "line": 7,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 5,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 7,
+ "line": 5,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 5,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 8,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 8,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 9,
+ "line": 6,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 13,
+ "line": 6,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 2,
+ "line": 6,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 6,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 8,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/function-expression/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for out of order declarations: getScopes finds scope bindings for out of order declarations at line 2 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "aDefault": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 33,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 15,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "importName": "default",
+ "start": Object {
+ "column": 7,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "import-decl",
+ },
+ ],
+ "type": "import",
+ },
+ "root": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 15,
+ "line": 3,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 28,
+ "line": 3,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 24,
+ "line": 3,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 39,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 35,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "val": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 8,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 7,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 15,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 4,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for out of order declarations: getScopes finds scope bindings for out of order declarations at line 5 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "callback": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 3,
+ "line": 16,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 10,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 19,
+ "line": 10,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 11,
+ "line": 10,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 33,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 25,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 10,
+ "line": 18,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 12,
+ "line": 18,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "parent": null,
+ "start": Object {
+ "column": 2,
+ "line": 18,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "call",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 18,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 9,
+ "line": 6,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 6,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 8,
+ "line": 6,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 6,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 6,
+ "line": 8,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 2,
+ "line": 8,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ "val": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 10,
+ "line": 4,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 4,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 4,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 4,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "root",
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 15,
+ "line": 3,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "aDefault": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 33,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 15,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "importName": "default",
+ "start": Object {
+ "column": 7,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "import-decl",
+ },
+ ],
+ "type": "import",
+ },
+ "root": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 15,
+ "line": 3,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 28,
+ "line": 3,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 24,
+ "line": 3,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 39,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 35,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "val": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 8,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 7,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 15,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 4,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for out of order declarations: getScopes finds scope bindings for out of order declarations at line 11 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 19,
+ "line": 15,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 15,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 15,
+ "line": 15,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 13,
+ "line": 15,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 23,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 21,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 45,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 41,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ "val": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 13,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 13,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 13,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 13,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "var",
+ },
+ Object {
+ "end": Object {
+ "column": 19,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 16,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "callback",
+ "end": Object {
+ "column": 3,
+ "line": 16,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 2,
+ "line": 10,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "callback": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 3,
+ "line": 16,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 10,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 19,
+ "line": 10,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 11,
+ "line": 10,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 33,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 25,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 10,
+ "line": 18,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 12,
+ "line": 18,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "parent": null,
+ "start": Object {
+ "column": 2,
+ "line": 18,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "call",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 18,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 9,
+ "line": 6,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 6,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 8,
+ "line": 6,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 6,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 6,
+ "line": 8,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 2,
+ "line": 8,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ "val": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 10,
+ "line": 4,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 4,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 4,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 4,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "root",
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 15,
+ "line": 3,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "aDefault": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 33,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 15,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "importName": "default",
+ "start": Object {
+ "column": 7,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "import-decl",
+ },
+ ],
+ "type": "import",
+ },
+ "root": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 15,
+ "line": 3,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 28,
+ "line": 3,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 24,
+ "line": 3,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 39,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 35,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "val": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 8,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 7,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 15,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 4,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for out of order declarations: getScopes finds scope bindings for out of order declarations at line 14 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 19,
+ "line": 15,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 15,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 15,
+ "line": 15,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 13,
+ "line": 15,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 23,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 21,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 45,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 41,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ "val": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 13,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 13,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 13,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 13,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "var",
+ },
+ Object {
+ "end": Object {
+ "column": 19,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 16,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "callback",
+ "end": Object {
+ "column": 3,
+ "line": 16,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 2,
+ "line": 10,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "callback": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 3,
+ "line": 16,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 10,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 19,
+ "line": 10,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 11,
+ "line": 10,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 33,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 25,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 10,
+ "line": 18,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 12,
+ "line": 18,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "parent": null,
+ "start": Object {
+ "column": 2,
+ "line": 18,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "call",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 18,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 9,
+ "line": 6,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 6,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 8,
+ "line": 6,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 6,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 6,
+ "line": 8,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 2,
+ "line": 8,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ "val": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 10,
+ "line": 4,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 4,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 4,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 4,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "root",
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 15,
+ "line": 3,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "aDefault": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 33,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 15,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "importName": "default",
+ "start": Object {
+ "column": 7,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "import-decl",
+ },
+ ],
+ "type": "import",
+ },
+ "root": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 15,
+ "line": 3,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 28,
+ "line": 3,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 24,
+ "line": 3,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 39,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 35,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "val": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 8,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 7,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 15,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 4,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for out of order declarations: getScopes finds scope bindings for out of order declarations at line 17 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "callback": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 3,
+ "line": 16,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 10,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 19,
+ "line": 10,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 11,
+ "line": 10,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 33,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 25,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 10,
+ "line": 18,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 12,
+ "line": 18,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "parent": null,
+ "start": Object {
+ "column": 2,
+ "line": 18,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "call",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 18,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 9,
+ "line": 6,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 6,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 8,
+ "line": 6,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 6,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 6,
+ "line": 8,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 2,
+ "line": 8,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ "val": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 10,
+ "line": 4,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 4,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 4,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 4,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "root",
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 15,
+ "line": 3,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "aDefault": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 33,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 15,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "importName": "default",
+ "start": Object {
+ "column": 7,
+ "line": 21,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "import-decl",
+ },
+ ],
+ "type": "import",
+ },
+ "root": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 15,
+ "line": 3,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 28,
+ "line": 3,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 24,
+ "line": 3,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 39,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 35,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "val": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 8,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 7,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 15,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 4,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 11,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/out-of-order-declarations/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for switch statements: getScopes finds scope bindings for switch statements at line 2 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "zero": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "foo": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 3,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 3,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 15,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 15,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 19,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 19,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for switch statements: getScopes finds scope bindings for switch statements at line 5 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "one": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 7,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 7,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 7,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "two": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 9,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 9,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 9,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 9,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Switch",
+ "end": Object {
+ "column": 1,
+ "line": 13,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "zero": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "foo": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 3,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 3,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 15,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 15,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 19,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 19,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for switch statements: getScopes finds scope bindings for switch statements at line 7 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "one": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 7,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 7,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 7,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "two": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 9,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 9,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 9,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 9,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Switch",
+ "end": Object {
+ "column": 1,
+ "line": 13,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "zero": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "foo": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 3,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 3,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 15,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 15,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 19,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 19,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for switch statements: getScopes finds scope bindings for switch statements at line 9 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "one": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 7,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 7,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 7,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "two": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 9,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 9,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 9,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 9,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Switch",
+ "end": Object {
+ "column": 1,
+ "line": 13,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "zero": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "foo": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 3,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 3,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 15,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 15,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 19,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 19,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for switch statements: getScopes finds scope bindings for switch statements at line 11 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "three": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 14,
+ "line": 11,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 11,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 11,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 11,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Block",
+ "end": Object {
+ "column": 3,
+ "line": 12,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 16,
+ "line": 10,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "one": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 7,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 7,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 7,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 7,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "two": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 9,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 9,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 9,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 9,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Switch",
+ "end": Object {
+ "column": 1,
+ "line": 13,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "zero": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "foo": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 3,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 3,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 15,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 15,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 19,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 19,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for switch statements: getScopes finds scope bindings for switch statements at line 17 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "two": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 20,
+ "line": 17,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 17,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 16,
+ "line": 17,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 13,
+ "line": 17,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Switch",
+ "end": Object {
+ "column": 1,
+ "line": 18,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 15,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "zero": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "foo": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 3,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 3,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 15,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 15,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 19,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 19,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for switch statements: getScopes finds scope bindings for switch statements at line 21 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "three": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 18,
+ "line": 21,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 21,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 15,
+ "line": 21,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 10,
+ "line": 21,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Switch",
+ "end": Object {
+ "column": 1,
+ "line": 22,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 19,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "zero": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 5,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "foo": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 3,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 3,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 15,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 15,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 19,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 8,
+ "line": 19,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 23,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/switch-statement/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for try..catch: getScopes finds scope bindings for try..catch at line 2 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "first": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 4,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 4,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 4,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 4,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "third": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 7,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 7,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 7,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 7,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for try..catch: getScopes finds scope bindings for try..catch at line 4 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "second": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 5,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 5,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 5,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 5,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Block",
+ "end": Object {
+ "column": 1,
+ "line": 6,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 4,
+ "line": 3,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "first": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 4,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 4,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 4,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 4,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "third": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 7,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 7,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 7,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 7,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings for try..catch: getScopes finds scope bindings for try..catch at line 7 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "fourth": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 8,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 8,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 8,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 8,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Block",
+ "end": Object {
+ "column": 1,
+ "line": 9,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 14,
+ "line": 6,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "err": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 9,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 6,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 6,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 6,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "catch",
+ },
+ ],
+ "type": "var",
+ },
+ },
+ "displayName": "Catch",
+ "end": Object {
+ "column": 1,
+ "line": 9,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 2,
+ "line": 6,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "first": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 4,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 4,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 4,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 4,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "third": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 7,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 7,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 7,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 7,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/try-catch/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings in a JSX element: getScopes finds scope bindings in a JSX element at line 2 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "SomeComponent": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 29,
+ "line": 1,
+ "sourceId": "scopes/jsx-component/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/jsx-component/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 20,
+ "line": 1,
+ "sourceId": "scopes/jsx-component/originalSource-1",
+ },
+ "importName": "default",
+ "start": Object {
+ "column": 7,
+ "line": 1,
+ "sourceId": "scopes/jsx-component/originalSource-1",
+ },
+ "type": "import-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 14,
+ "line": 3,
+ "sourceId": "scopes/jsx-component/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 3,
+ "sourceId": "scopes/jsx-component/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 14,
+ "line": 4,
+ "sourceId": "scopes/jsx-component/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 4,
+ "sourceId": "scopes/jsx-component/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 14,
+ "line": 5,
+ "sourceId": "scopes/jsx-component/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 5,
+ "sourceId": "scopes/jsx-component/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 14,
+ "line": 6,
+ "sourceId": "scopes/jsx-component/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 6,
+ "sourceId": "scopes/jsx-component/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "import",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 7,
+ "sourceId": "scopes/jsx-component/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/jsx-component/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 7,
+ "sourceId": "scopes/jsx-component/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/jsx-component/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 7,
+ "sourceId": "scopes/jsx-component/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/jsx-component/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings in a module: getScopes finds scope bindings in a module at line 7 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 16,
+ "line": 9,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 9,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 9,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 9,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "foo": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 22,
+ "line": 1,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 10,
+ "line": 1,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "importName": "default",
+ "start": Object {
+ "column": 7,
+ "line": 1,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "type": "import-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 15,
+ "line": 3,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 12,
+ "line": 3,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "import",
+ },
+ "one": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 5,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 5,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 7,
+ "line": 5,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 5,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 4,
+ "line": 11,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 0,
+ "line": 11,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ "three": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 16,
+ "line": 7,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 7,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 7,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 7,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "type": "const",
+ },
+ ],
+ "type": "const",
+ },
+ "two": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 12,
+ "line": 6,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 6,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 7,
+ "line": 6,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 6,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "console": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 3,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 11,
+ "line": 3,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "parent": null,
+ "property": "log",
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 12,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/simple-module/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings in a typescript file: getScopes finds scope bindings in a typescript file at line 9 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "Color": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 8,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 10,
+ "line": 3,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 3,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ts-enum-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "Example": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 16,
+ "line": 41,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 9,
+ "line": 41,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "let",
+ },
+ "TheSpace": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 35,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 31,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 18,
+ "line": 31,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 10,
+ "line": 31,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ts-namespace-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "foo": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 22,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 7,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Error": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 19,
+ "line": 17,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 14,
+ "line": 17,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "window": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 21,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 15,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 25,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 25,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 28,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 28,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings in a typescript file: getScopes finds scope bindings in a typescript file at line 13 column 4 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "foo": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 3,
+ "line": 14,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 12,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 24,
+ "line": 12,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 21,
+ "line": 12,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "fn-param",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "constructor",
+ "end": Object {
+ "column": 3,
+ "line": 14,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 14,
+ "line": 12,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "Example": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "class-inner",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "Class",
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Color": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 8,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 10,
+ "line": 3,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 3,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ts-enum-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "Example": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 16,
+ "line": 41,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 9,
+ "line": 41,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "let",
+ },
+ "TheSpace": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 35,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 31,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 18,
+ "line": 31,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 10,
+ "line": 31,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ts-namespace-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "foo": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 22,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 7,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Error": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 19,
+ "line": 17,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 14,
+ "line": 17,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "window": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 21,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 15,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 25,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 25,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 28,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 28,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings in a typescript file: getScopes finds scope bindings in a typescript file at line 17 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "method",
+ "end": Object {
+ "column": 3,
+ "line": 18,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 2,
+ "line": 16,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "Example": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "class-inner",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "Class",
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Color": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 8,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 10,
+ "line": 3,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 3,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ts-enum-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "Example": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 16,
+ "line": 41,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 9,
+ "line": 41,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "let",
+ },
+ "TheSpace": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 35,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 31,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 18,
+ "line": 31,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 10,
+ "line": 31,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ts-namespace-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "foo": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 22,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 7,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Error": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 19,
+ "line": 17,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 14,
+ "line": 17,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "window": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 21,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 15,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 25,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 25,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 28,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 28,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings in a typescript file: getScopes finds scope bindings in a typescript file at line 33 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "fn",
+ "end": Object {
+ "column": 3,
+ "line": 34,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 2,
+ "line": 32,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 3,
+ "line": 34,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 32,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 32,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 11,
+ "line": 32,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "TypeScript Namespace",
+ "end": Object {
+ "column": 1,
+ "line": 35,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 19,
+ "line": 31,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Color": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 8,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 10,
+ "line": 3,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 3,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ts-enum-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "Example": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 10,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 16,
+ "line": 41,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 9,
+ "line": 41,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "let",
+ },
+ "TheSpace": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 35,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 31,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 18,
+ "line": 31,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 10,
+ "line": 31,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ts-namespace-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "foo": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 22,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 7,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Error": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 19,
+ "line": 17,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 14,
+ "line": 17,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "window": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 21,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 15,
+ "line": 22,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 25,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 25,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 28,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 28,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/ts-sample/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings in a typescript-jsx file: getScopes finds scope bindings in a typescript-jsx file at line 9 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "Color": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 8,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 10,
+ "line": 3,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 3,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ts-enum-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "Example": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 16,
+ "line": 41,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 9,
+ "line": 41,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "let",
+ },
+ "TheSpace": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 35,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 31,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 18,
+ "line": 31,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 10,
+ "line": 31,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ts-namespace-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "foo": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 28,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 7,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Error": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 19,
+ "line": 17,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 14,
+ "line": 17,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "any": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 14,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 11,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "window": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 25,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 25,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 28,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 28,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings in a typescript-jsx file: getScopes finds scope bindings in a typescript-jsx file at line 13 column 4 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "foo": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 3,
+ "line": 14,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 12,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 24,
+ "line": 12,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 21,
+ "line": 12,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "fn-param",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "constructor",
+ "end": Object {
+ "column": 3,
+ "line": 14,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 14,
+ "line": 12,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "Example": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "class-inner",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "Class",
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Color": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 8,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 10,
+ "line": 3,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 3,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ts-enum-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "Example": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 16,
+ "line": 41,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 9,
+ "line": 41,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "let",
+ },
+ "TheSpace": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 35,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 31,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 18,
+ "line": 31,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 10,
+ "line": 31,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ts-namespace-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "foo": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 28,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 7,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Error": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 19,
+ "line": 17,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 14,
+ "line": 17,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "any": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 14,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 11,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "window": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 25,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 25,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 28,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 28,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings in a typescript-jsx file: getScopes finds scope bindings in a typescript-jsx file at line 17 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "method",
+ "end": Object {
+ "column": 3,
+ "line": 18,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 2,
+ "line": 16,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "Example": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "class-inner",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "Class",
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Color": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 8,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 10,
+ "line": 3,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 3,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ts-enum-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "Example": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 16,
+ "line": 41,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 9,
+ "line": 41,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "let",
+ },
+ "TheSpace": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 35,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 31,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 18,
+ "line": 31,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 10,
+ "line": 31,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ts-namespace-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "foo": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 28,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 7,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Error": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 19,
+ "line": 17,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 14,
+ "line": 17,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "any": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 14,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 11,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "window": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 25,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 25,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 28,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 28,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings in a typescript-jsx file: getScopes finds scope bindings in a typescript-jsx file at line 33 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "fn",
+ "end": Object {
+ "column": 3,
+ "line": 34,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 2,
+ "line": 32,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 3,
+ "line": 34,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 32,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 32,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 11,
+ "line": 32,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "TypeScript Namespace",
+ "end": Object {
+ "column": 1,
+ "line": 35,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 19,
+ "line": 31,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Color": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 8,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 10,
+ "line": 3,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 5,
+ "line": 3,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ts-enum-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "Example": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 19,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 10,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ Object {
+ "end": Object {
+ "column": 16,
+ "line": 41,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 9,
+ "line": 41,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "let",
+ },
+ "TheSpace": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 35,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 31,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 18,
+ "line": 31,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 10,
+ "line": 31,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ts-namespace-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "foo": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 28,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 7,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Error": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 19,
+ "line": 17,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 14,
+ "line": 17,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "any": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 14,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 11,
+ "line": 22,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "window": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 25,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 25,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 28,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 1,
+ "line": 28,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 42,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/tsx-sample/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings in a vue file: getScopes finds scope bindings in a vue file at line 14 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "fnVar": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 18,
+ "line": 13,
+ "sourceId": "scopes/vue-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 13,
+ "sourceId": "scopes/vue-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 13,
+ "sourceId": "scopes/vue-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 13,
+ "sourceId": "scopes/vue-sample/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "data",
+ "end": Object {
+ "column": 3,
+ "line": 18,
+ "sourceId": "scopes/vue-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 2,
+ "line": 12,
+ "sourceId": "scopes/vue-sample/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "moduleVar": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 23,
+ "line": 8,
+ "sourceId": "scopes/vue-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 8,
+ "sourceId": "scopes/vue-sample/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 8,
+ "sourceId": "scopes/vue-sample/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 8,
+ "sourceId": "scopes/vue-sample/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 1,
+ "line": 27,
+ "sourceId": "scopes/vue-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/vue-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 1,
+ "line": 27,
+ "sourceId": "scopes/vue-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/vue-sample/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 1,
+ "line": 27,
+ "sourceId": "scopes/vue-sample/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/vue-sample/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings in fn body with both lex and non-lex items: getScopes finds scope bindings in fn body with both lex and non-lex items at line 4 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "lex": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 10,
+ "line": 3,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 3,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 3,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Function Body",
+ "end": Object {
+ "column": 1,
+ "line": 5,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 14,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "nonlex": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 2,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 2,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 2,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 2,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "fn",
+ "end": Object {
+ "column": 1,
+ "line": 5,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 24,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 5,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "fn2": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 7,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 7,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 7,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "fn3": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 17,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 13,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 13,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 13,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "fn4": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 23,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 19,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 19,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 19,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 24,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings in fn body with both lex and non-lex items: getScopes finds scope bindings in fn body with both lex and non-lex items at line 10 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "lex": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 10,
+ "line": 9,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 9,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 9,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 9,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Function Body",
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 15,
+ "line": 7,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "nonlex": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 21,
+ "line": 8,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 8,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 17,
+ "line": 8,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 11,
+ "line": 8,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "fn2",
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 7,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 24,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 5,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "fn2": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 7,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 7,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 7,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "fn3": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 17,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 13,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 13,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 13,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "fn4": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 23,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 19,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 19,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 19,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 24,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings in fn body with both lex and non-lex items: getScopes finds scope bindings in fn body with both lex and non-lex items at line 16 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "Thing": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 16,
+ "line": 15,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 15,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 15,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 15,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Function Body",
+ "end": Object {
+ "column": 1,
+ "line": 17,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 15,
+ "line": 13,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "nonlex": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 13,
+ "line": 14,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 14,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 14,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 14,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "fn3",
+ "end": Object {
+ "column": 1,
+ "line": 17,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 13,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 24,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 5,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "fn2": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 7,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 7,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 7,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "fn3": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 17,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 13,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 13,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 13,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "fn4": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 23,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 19,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 19,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 19,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 24,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings in fn body with both lex and non-lex items: getScopes finds scope bindings in fn body with both lex and non-lex items at line 22 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "Thing": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 16,
+ "line": 21,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 21,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 13,
+ "line": 21,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 8,
+ "line": 21,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Function Body",
+ "end": Object {
+ "column": 1,
+ "line": 23,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 15,
+ "line": 19,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "nonlex": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 21,
+ "line": 20,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 20,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 17,
+ "line": 20,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 11,
+ "line": 20,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "fn4",
+ "end": Object {
+ "column": 1,
+ "line": 23,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 19,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 24,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 5,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "fn2": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 7,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 7,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 7,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "fn3": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 17,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 13,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 13,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 13,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "fn4": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 23,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 19,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 19,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 19,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 24,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/fn-body-lex-and-nonlex/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings with expression metadata: getScopes finds scope bindings with expression metadata at line 2 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "foo": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 15,
+ "line": 1,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 1,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 1,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "const",
+ },
+ Object {
+ "end": Object {
+ "column": 3,
+ "line": 3,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 7,
+ "line": 3,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "parent": Object {
+ "end": Object {
+ "column": 9,
+ "line": 3,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "parent": Object {
+ "end": Object {
+ "column": 13,
+ "line": 3,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "parent": null,
+ "property": "baz",
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "call",
+ },
+ "property": "bar",
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 7,
+ "line": 4,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 11,
+ "line": 4,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "parent": Object {
+ "end": Object {
+ "column": 12,
+ "line": 4,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "parent": Object {
+ "end": Object {
+ "column": 14,
+ "line": 4,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "parent": Object {
+ "end": Object {
+ "column": 18,
+ "line": 4,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "parent": null,
+ "property": "baz",
+ "start": Object {
+ "column": 0,
+ "line": 4,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 4,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "call",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 4,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "inherit",
+ },
+ "property": "bar",
+ "start": Object {
+ "column": 4,
+ "line": 4,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 4,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 10,
+ "line": 5,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 14,
+ "line": 5,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "parent": Object {
+ "end": Object {
+ "column": 15,
+ "line": 5,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "parent": Object {
+ "end": Object {
+ "column": 17,
+ "line": 5,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "parent": Object {
+ "end": Object {
+ "column": 21,
+ "line": 5,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "parent": null,
+ "property": "baz",
+ "start": Object {
+ "column": 0,
+ "line": 5,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 5,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "call",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 5,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "inherit",
+ },
+ "property": "bar",
+ "start": Object {
+ "column": 7,
+ "line": 5,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 7,
+ "line": 5,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "ref",
+ },
+ Object {
+ "end": Object {
+ "column": 25,
+ "line": 6,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 29,
+ "line": 6,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "parent": Object {
+ "end": Object {
+ "column": 30,
+ "line": 6,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "parent": Object {
+ "end": Object {
+ "column": 32,
+ "line": 6,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "parent": Object {
+ "end": Object {
+ "column": 36,
+ "line": 6,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "parent": null,
+ "property": "baz",
+ "start": Object {
+ "column": 0,
+ "line": 6,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 6,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "call",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 6,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "inherit",
+ },
+ "property": "bar",
+ "start": Object {
+ "column": 22,
+ "line": 6,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 22,
+ "line": 6,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 7,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "Object": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 6,
+ "line": 5,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 0,
+ "line": 5,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "__webpack_require__": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 19,
+ "line": 6,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "meta": Object {
+ "end": Object {
+ "column": 21,
+ "line": 6,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "parent": null,
+ "property": "i",
+ "start": Object {
+ "column": 0,
+ "line": 6,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "member",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 6,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "global",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 7,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/expressions/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings with proper types: getScopes finds scope bindings with proper types at line 5 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "aConst": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 18,
+ "line": 15,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 15,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 15,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 15,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "const",
+ },
+ ],
+ "type": "const",
+ },
+ "aLet": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 9,
+ "line": 14,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 8,
+ "line": 14,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 14,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "aVar": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 9,
+ "line": 13,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 13,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 8,
+ "line": 13,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 13,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "cls": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 7,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 7,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 7,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ "def": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 19,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 10,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "importName": "default",
+ "start": Object {
+ "column": 7,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "import-decl",
+ },
+ ],
+ "type": "import",
+ },
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 16,
+ "line": 6,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 6,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 6,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 6,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "named": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 25,
+ "line": 2,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 2,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 2,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "importName": "named",
+ "start": Object {
+ "column": 9,
+ "line": 2,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "import-decl",
+ },
+ ],
+ "type": "import",
+ },
+ "namespace": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 30,
+ "line": 4,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 4,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 21,
+ "line": 4,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 12,
+ "line": 4,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "import-ns-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "otherNamed": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 39,
+ "line": 3,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 28,
+ "line": 3,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "importName": "thing",
+ "start": Object {
+ "column": 18,
+ "line": 3,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "import-decl",
+ },
+ ],
+ "type": "import",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 25,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 25,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 25,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings with proper types: getScopes finds scope bindings with proper types at line 9 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "method",
+ "end": Object {
+ "column": 3,
+ "line": 10,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 2,
+ "line": 8,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "cls": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 7,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 7,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 7,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "class-inner",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "Class",
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 7,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "aConst": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 18,
+ "line": 15,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 15,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 15,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 15,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "const",
+ },
+ ],
+ "type": "const",
+ },
+ "aLet": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 9,
+ "line": 14,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 8,
+ "line": 14,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 14,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "aVar": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 9,
+ "line": 13,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 13,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 8,
+ "line": 13,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 13,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "cls": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 7,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 7,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 7,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ "def": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 19,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 10,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "importName": "default",
+ "start": Object {
+ "column": 7,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "import-decl",
+ },
+ ],
+ "type": "import",
+ },
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 16,
+ "line": 6,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 6,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 6,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 6,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "named": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 25,
+ "line": 2,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 2,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 2,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "importName": "named",
+ "start": Object {
+ "column": 9,
+ "line": 2,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "import-decl",
+ },
+ ],
+ "type": "import",
+ },
+ "namespace": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 30,
+ "line": 4,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 4,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 21,
+ "line": 4,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 12,
+ "line": 4,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "import-ns-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "otherNamed": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 39,
+ "line": 3,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 28,
+ "line": 3,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "importName": "thing",
+ "start": Object {
+ "column": 18,
+ "line": 3,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "import-decl",
+ },
+ ],
+ "type": "import",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 25,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 25,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 25,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings with proper types: getScopes finds scope bindings with proper types at line 18 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "arguments": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 11,
+ "line": 19,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 2,
+ "line": 19,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ "this": Object {
+ "refs": Array [
+ Object {
+ "end": Object {
+ "column": 6,
+ "line": 18,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "meta": null,
+ "start": Object {
+ "column": 2,
+ "line": 18,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "ref",
+ },
+ ],
+ "type": "implicit",
+ },
+ },
+ "displayName": "inner",
+ "end": Object {
+ "column": 1,
+ "line": 20,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 1,
+ "line": 17,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "function",
+ },
+ Object {
+ "bindings": Object {
+ "inner": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 20,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 1,
+ "line": 17,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 15,
+ "line": 17,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 10,
+ "line": 17,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "fn-expr",
+ },
+ ],
+ "type": "const",
+ },
+ },
+ "displayName": "Function Expression",
+ "end": Object {
+ "column": 1,
+ "line": 20,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 1,
+ "line": 17,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "aConst": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 18,
+ "line": 15,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 15,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 15,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 15,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "const",
+ },
+ ],
+ "type": "const",
+ },
+ "aLet": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 9,
+ "line": 14,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 8,
+ "line": 14,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 14,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "aVar": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 9,
+ "line": 13,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 13,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 8,
+ "line": 13,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 13,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "cls": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 7,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 7,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 7,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ "def": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 19,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 10,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "importName": "default",
+ "start": Object {
+ "column": 7,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "import-decl",
+ },
+ ],
+ "type": "import",
+ },
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 16,
+ "line": 6,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 6,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 6,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 6,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "named": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 25,
+ "line": 2,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 2,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 2,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "importName": "named",
+ "start": Object {
+ "column": 9,
+ "line": 2,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "import-decl",
+ },
+ ],
+ "type": "import",
+ },
+ "namespace": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 30,
+ "line": 4,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 4,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 21,
+ "line": 4,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 12,
+ "line": 4,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "import-ns-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "otherNamed": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 39,
+ "line": 3,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 28,
+ "line": 3,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "importName": "thing",
+ "start": Object {
+ "column": 18,
+ "line": 3,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "import-decl",
+ },
+ ],
+ "type": "import",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 25,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 25,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 25,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
+
+exports[`Parser.getScopes finds scope bindings with proper types: getScopes finds scope bindings with proper types at line 23 column 0 1`] = `
+Array [
+ Object {
+ "bindings": Object {
+ "blockFn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 22,
+ "line": 23,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 2,
+ "line": 23,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 18,
+ "line": 23,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 11,
+ "line": 23,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "let",
+ },
+ },
+ "displayName": "Block",
+ "end": Object {
+ "column": 1,
+ "line": 24,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 22,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {
+ "aConst": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 18,
+ "line": 15,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 15,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 12,
+ "line": 15,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 15,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "const",
+ },
+ ],
+ "type": "const",
+ },
+ "aLet": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 9,
+ "line": 14,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 14,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 8,
+ "line": 14,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 14,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "let",
+ },
+ ],
+ "type": "let",
+ },
+ "aVar": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 9,
+ "line": 13,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 13,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 8,
+ "line": 13,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 4,
+ "line": 13,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "var",
+ },
+ ],
+ "type": "var",
+ },
+ "cls": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 1,
+ "line": 11,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 7,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 9,
+ "line": 7,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 6,
+ "line": 7,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "class-decl",
+ },
+ ],
+ "type": "let",
+ },
+ "def": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 19,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 10,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "importName": "default",
+ "start": Object {
+ "column": 7,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "import-decl",
+ },
+ ],
+ "type": "import",
+ },
+ "fn": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 16,
+ "line": 6,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 6,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 11,
+ "line": 6,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 9,
+ "line": 6,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "fn-decl",
+ },
+ ],
+ "type": "var",
+ },
+ "named": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 25,
+ "line": 2,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 2,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 14,
+ "line": 2,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "importName": "named",
+ "start": Object {
+ "column": 9,
+ "line": 2,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "import-decl",
+ },
+ ],
+ "type": "import",
+ },
+ "namespace": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 30,
+ "line": 4,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 4,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 21,
+ "line": 4,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 12,
+ "line": 4,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "import-ns-decl",
+ },
+ ],
+ "type": "const",
+ },
+ "otherNamed": Object {
+ "refs": Array [
+ Object {
+ "declaration": Object {
+ "end": Object {
+ "column": 39,
+ "line": 3,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "start": Object {
+ "column": 0,
+ "line": 3,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ },
+ "end": Object {
+ "column": 28,
+ "line": 3,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "importName": "thing",
+ "start": Object {
+ "column": 18,
+ "line": 3,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "import-decl",
+ },
+ ],
+ "type": "import",
+ },
+ "this": Object {
+ "refs": Array [],
+ "type": "implicit",
+ },
+ },
+ "displayName": "Module",
+ "end": Object {
+ "column": 0,
+ "line": 25,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Lexical Global",
+ "end": Object {
+ "column": 0,
+ "line": 25,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "block",
+ },
+ Object {
+ "bindings": Object {},
+ "displayName": "Global",
+ "end": Object {
+ "column": 0,
+ "line": 25,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "scopeKind": "",
+ "start": Object {
+ "column": 0,
+ "line": 1,
+ "sourceId": "scopes/binding-types/originalSource-1",
+ },
+ "type": "object",
+ },
+]
+`;
diff --git a/devtools/client/debugger/src/workers/parser/tests/__snapshots__/getSymbols.spec.js.snap b/devtools/client/debugger/src/workers/parser/tests/__snapshots__/getSymbols.spec.js.snap
new file mode 100644
index 0000000000..d1fd35376d
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/__snapshots__/getSymbols.spec.js.snap
@@ -0,0 +1,169 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`Parser.getSymbols allSymbols 1`] = `
+"hasJsx: false
+
+hasTypes: false
+
+framework: null"
+`;
+
+exports[`Parser.getSymbols call expression 1`] = `
+"hasJsx: false
+
+hasTypes: false
+
+framework: null"
+`;
+
+exports[`Parser.getSymbols call sites 1`] = `
+"hasJsx: false
+
+hasTypes: false
+
+framework: null"
+`;
+
+exports[`Parser.getSymbols class 1`] = `
+"hasJsx: false
+
+hasTypes: false
+
+framework: null"
+`;
+
+exports[`Parser.getSymbols component 1`] = `
+"hasJsx: true
+
+hasTypes: false
+
+framework: null"
+`;
+
+exports[`Parser.getSymbols destruct 1`] = `
+"hasJsx: false
+
+hasTypes: false
+
+framework: null"
+`;
+
+exports[`Parser.getSymbols es6 1`] = `
+"hasJsx: false
+
+hasTypes: false
+
+framework: null"
+`;
+
+exports[`Parser.getSymbols expression 1`] = `
+"hasJsx: false
+
+hasTypes: false
+
+framework: null"
+`;
+
+exports[`Parser.getSymbols finds symbols in an html file 1`] = `
+"hasJsx: false
+
+hasTypes: false
+
+framework: null"
+`;
+
+exports[`Parser.getSymbols flow 1`] = `
+"hasJsx: false
+
+hasTypes: true
+
+framework: null"
+`;
+
+exports[`Parser.getSymbols func 1`] = `
+"hasJsx: false
+
+hasTypes: false
+
+framework: null"
+`;
+
+exports[`Parser.getSymbols function names 1`] = `
+"hasJsx: false
+
+hasTypes: false
+
+framework: null"
+`;
+
+exports[`Parser.getSymbols jsx 1`] = `
+"hasJsx: true
+
+hasTypes: false
+
+framework: null"
+`;
+
+exports[`Parser.getSymbols math 1`] = `
+"hasJsx: false
+
+hasTypes: false
+
+framework: null"
+`;
+
+exports[`Parser.getSymbols object expressions 1`] = `
+"hasJsx: false
+
+hasTypes: false
+
+framework: null"
+`;
+
+exports[`Parser.getSymbols optional chaining 1`] = `
+"hasJsx: false
+
+hasTypes: false
+
+framework: null"
+`;
+
+exports[`Parser.getSymbols private fields 1`] = `
+"hasJsx: false
+
+hasTypes: false
+
+framework: null"
+`;
+
+exports[`Parser.getSymbols proto 1`] = `
+"hasJsx: false
+
+hasTypes: false
+
+framework: null"
+`;
+
+exports[`Parser.getSymbols react component 1`] = `
+"hasJsx: false
+
+hasTypes: false
+
+framework: React"
+`;
+
+exports[`Parser.getSymbols regexp 1`] = `
+"hasJsx: false
+
+hasTypes: false
+
+framework: null"
+`;
+
+exports[`Parser.getSymbols var 1`] = `
+"hasJsx: false
+
+hasTypes: false
+
+framework: null"
+`;
diff --git a/devtools/client/debugger/src/workers/parser/tests/__snapshots__/validate.spec.js.snap b/devtools/client/debugger/src/workers/parser/tests/__snapshots__/validate.spec.js.snap
new file mode 100644
index 0000000000..a341538a5d
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/__snapshots__/validate.spec.js.snap
@@ -0,0 +1,3 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`has syntax error should return the error object for the invalid expression 1`] = `"SyntaxError : Missing semicolon. (1:3)"`;
diff --git a/devtools/client/debugger/src/workers/parser/tests/contains.spec.js b/devtools/client/debugger/src/workers/parser/tests/contains.spec.js
new file mode 100644
index 0000000000..741f1a29fc
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/contains.spec.js
@@ -0,0 +1,250 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { containsPosition, containsLocation } from "../utils/contains";
+
+function getTestLoc() {
+ return {
+ start: {
+ line: 10,
+ column: 2,
+ },
+ end: {
+ line: 12,
+ column: 10,
+ },
+ };
+}
+
+// AstPosition.column is typed as a number, but many parts of this test set it
+// to undefined. Using zero instead causes test failures, and allowing it to be
+// undefined causes many flow errors in code manipulating AstPosition.
+// Fake a coercion of undefined to number as a workaround for now.
+function undefinedColumn() {
+ return undefined;
+}
+
+function startPos(lineOffset, columnOffset) {
+ const { start } = getTestLoc();
+ return {
+ line: start.line + lineOffset,
+ column: start.column + columnOffset,
+ };
+}
+
+function endPos(lineOffset, columnOffset) {
+ const { end } = getTestLoc();
+ return {
+ line: end.line + lineOffset,
+ column: end.column + columnOffset,
+ };
+}
+
+function startLine(lineOffset = 0) {
+ const { start } = getTestLoc();
+ return {
+ line: start.line + lineOffset,
+ column: undefinedColumn(),
+ };
+}
+
+function endLine(lineOffset = 0) {
+ const { end } = getTestLoc();
+ return {
+ line: end.line + lineOffset,
+ column: undefinedColumn(),
+ };
+}
+
+function testContains(pos, bool) {
+ const loc = getTestLoc();
+ expect(containsPosition(loc, pos)).toEqual(bool);
+}
+
+describe("containsPosition", () => {
+ describe("location and postion both with the column criteria", () => {
+ /* eslint-disable jest/expect-expect */
+ it("should contain position within the location range", () =>
+ testContains(startPos(1, 1), true));
+
+ it("should not contain position out of the start line", () =>
+ testContains(startPos(-1, 0), false));
+
+ it("should not contain position out of the start column", () =>
+ testContains(startPos(0, -1), false));
+
+ it(`should contain position on the same start line and
+ within the start column`, () => testContains(startPos(0, 1), true));
+
+ it("should not contain position out of the end line", () =>
+ testContains(endPos(1, 0), false));
+
+ it("should not contain position out of the end column", () =>
+ testContains(endPos(0, 1), false));
+
+ // eslint-disable-next-line max-len
+ it("should contain position on the same end line and within the end column", () =>
+ testContains(endPos(0, -1), true));
+ /* eslint-enable jest/expect-expect */
+ });
+
+ describe("position without the column criterion", () => {
+ /* eslint-disable jest/expect-expect */
+ it("should contain position on the same start line", () =>
+ testContains(startLine(0), true));
+
+ it("should contain position on the same end line", () =>
+ testContains(endLine(0), true));
+ /* eslint-enable jest/expect-expect */
+ });
+
+ describe("location without the column criterion", () => {
+ it("should contain position on the same start line", () => {
+ const loc = getTestLoc();
+ loc.start.column = undefinedColumn();
+ const pos = {
+ line: loc.start.line,
+ column: 1,
+ };
+ expect(containsPosition(loc, pos)).toEqual(true);
+ });
+
+ it("should contain position on the same end line", () => {
+ const loc = getTestLoc();
+ loc.end.column = undefinedColumn();
+ const pos = {
+ line: loc.end.line,
+ column: 1,
+ };
+ expect(containsPosition(loc, pos)).toEqual(true);
+ });
+ });
+
+ describe("location and postion both without the column criterion", () => {
+ it("should contain position on the same start line", () => {
+ const loc = getTestLoc();
+ loc.start.column = undefinedColumn();
+ const pos = startLine();
+ expect(containsPosition(loc, pos)).toEqual(true);
+ });
+
+ it("should contain position on the same end line", () => {
+ const loc = getTestLoc();
+ loc.end.column = undefinedColumn();
+ const pos = endLine();
+ expect(containsPosition(loc, pos)).toEqual(true);
+ });
+ });
+});
+
+describe("containsLocation", () => {
+ describe("locations both with the column criteria", () => {
+ it("should contian location within the range", () => {
+ const locA = getTestLoc();
+ const locB = {
+ start: startPos(1, 1),
+ end: endPos(-1, -1),
+ };
+ expect(containsLocation(locA, locB)).toEqual(true);
+ });
+
+ it("should not contian location out of the start line", () => {
+ const locA = getTestLoc();
+ const locB = getTestLoc();
+ locB.start.line--;
+ expect(containsLocation(locA, locB)).toEqual(false);
+ });
+
+ it("should not contian location out of the start column", () => {
+ const locA = getTestLoc();
+ const locB = getTestLoc();
+ locB.start.column--;
+ expect(containsLocation(locA, locB)).toEqual(false);
+ });
+
+ it("should not contian location out of the end line", () => {
+ const locA = getTestLoc();
+ const locB = getTestLoc();
+ locB.end.line++;
+ expect(containsLocation(locA, locB)).toEqual(false);
+ });
+
+ it("should not contian location out of the end column", () => {
+ const locA = getTestLoc();
+ const locB = getTestLoc();
+ locB.end.column++;
+ expect(containsLocation(locA, locB)).toEqual(false);
+ });
+
+ it(`should contain location on the same start line and
+ within the start column`, () => {
+ const locA = getTestLoc();
+ const locB = {
+ start: startPos(0, 1),
+ end: endPos(-1, -1),
+ };
+ expect(containsLocation(locA, locB)).toEqual(true);
+ });
+
+ it(`should contain location on the same end line and
+ within the end column`, () => {
+ const locA = getTestLoc();
+ const locB = {
+ start: startPos(1, 1),
+ end: endPos(0, -1),
+ };
+ expect(containsLocation(locA, locB)).toEqual(true);
+ });
+ });
+
+ describe("location A without the column criterion", () => {
+ it("should contain location on the same start line", () => {
+ const locA = getTestLoc();
+ locA.start.column = undefinedColumn();
+ const locB = getTestLoc();
+ expect(containsLocation(locA, locB)).toEqual(true);
+ });
+
+ it("should contain location on the same end line", () => {
+ const locA = getTestLoc();
+ locA.end.column = undefinedColumn();
+ const locB = getTestLoc();
+ expect(containsLocation(locA, locB)).toEqual(true);
+ });
+ });
+
+ describe("location B without the column criterion", () => {
+ it("should contain location on the same start line", () => {
+ const locA = getTestLoc();
+ const locB = getTestLoc();
+ locB.start.column = undefinedColumn();
+ expect(containsLocation(locA, locB)).toEqual(true);
+ });
+
+ it("should contain location on the same end line", () => {
+ const locA = getTestLoc();
+ const locB = getTestLoc();
+ locB.end.column = undefinedColumn();
+ expect(containsLocation(locA, locB)).toEqual(true);
+ });
+ });
+
+ describe("locations both without the column criteria", () => {
+ it("should contain location on the same start line", () => {
+ const locA = getTestLoc();
+ const locB = getTestLoc();
+ locA.start.column = undefinedColumn();
+ locB.start.column = undefinedColumn();
+ expect(containsLocation(locA, locB)).toEqual(true);
+ });
+
+ it("should contain location on the same end line", () => {
+ const locA = getTestLoc();
+ const locB = getTestLoc();
+ locA.end.column = undefinedColumn();
+ locB.end.column = undefinedColumn();
+ expect(containsLocation(locA, locB)).toEqual(true);
+ });
+ });
+});
diff --git a/devtools/client/debugger/src/workers/parser/tests/findOutOfScopeLocations.spec.js b/devtools/client/debugger/src/workers/parser/tests/findOutOfScopeLocations.spec.js
new file mode 100644
index 0000000000..a2177c22eb
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/findOutOfScopeLocations.spec.js
@@ -0,0 +1,80 @@
+/* eslint max-nested-callbacks: ["error", 4]*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import findOutOfScopeLocations from "../findOutOfScopeLocations";
+
+import { populateSource } from "./helpers";
+
+function formatLines(actual) {
+ return actual
+ .map(
+ ({ start, end }) =>
+ `(${start.line}, ${start.column}) -> (${end.line}, ${end.column})`
+ )
+ .join("\n");
+}
+
+describe("Parser.findOutOfScopeLocations", () => {
+ it("should exclude non-enclosing function blocks", () => {
+ const source = populateSource("outOfScope");
+ const actual = findOutOfScopeLocations({
+ source,
+ line: 5,
+ column: 5,
+ });
+
+ expect(formatLines(actual)).toMatchSnapshot();
+ });
+
+ it("should roll up function blocks", () => {
+ const source = populateSource("outOfScope");
+ const actual = findOutOfScopeLocations({
+ source,
+ line: 24,
+ column: 0,
+ });
+
+ expect(formatLines(actual)).toMatchSnapshot();
+ });
+
+ it("should exclude function for locations on declaration", () => {
+ const source = populateSource("outOfScope");
+ const actual = findOutOfScopeLocations({
+ source,
+ line: 3,
+ column: 12,
+ });
+
+ expect(formatLines(actual)).toMatchSnapshot();
+ });
+
+ it("should treat comments as out of scope", () => {
+ const source = populateSource("outOfScopeComment");
+ const actual = findOutOfScopeLocations({
+ source,
+ line: 3,
+ column: 2,
+ });
+
+ expect(actual.length).toBe(1);
+
+ const location = actual[0];
+ expect(location.start.line).toBe(1);
+ expect(location.start.column).toBe(0);
+
+ expect(location.end.line).toBe(1);
+ expect(location.end.column).toBe(15);
+ });
+
+ it("should not exclude in-scope inner locations", () => {
+ const source = populateSource("outOfScope");
+ const actual = findOutOfScopeLocations({
+ source,
+ line: 61,
+ column: 0,
+ });
+ expect(formatLines(actual)).toMatchSnapshot();
+ });
+});
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/allSymbols.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/allSymbols.js
new file mode 100644
index 0000000000..bebda9f36a
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/allSymbols.js
@@ -0,0 +1,33 @@
+const TIME = 60;
+let count = 0;
+
+function incrementCounter(counter) {
+ return counter++;
+}
+
+const sum = (a, b) => a + b;
+
+const Obj = {
+ foo: 1,
+ doThing() {
+ console.log("hey");
+ },
+ doOtherThing: function() {
+ return 42;
+ }
+};
+
+Obj.property = () => {};
+Obj.otherProperty = 1;
+
+class Ultra {
+ constructor() {
+ this.awesome = true;
+ }
+
+ beAwesome(person) {
+ console.log(`${person} is Awesome!`);
+ }
+}
+
+this.props.history.push(`/dacs/${this.props.dac.id}`);
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/async.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/async.js
new file mode 100644
index 0000000000..43216be635
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/async.js
@@ -0,0 +1,10 @@
+async function foo() {
+ return new Promise(resolve => {
+ setTimeout(resolve, 10);
+ });
+}
+
+async function stuff() {
+ await foo(1);
+ await foo(2);
+}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/call-sites.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/call-sites.js
new file mode 100644
index 0000000000..aa73700d93
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/call-sites.js
@@ -0,0 +1,4 @@
+aaa(bbb(), ccc());
+dddd()
+ .eee()
+ .ffff();
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/callExpressions.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/callExpressions.js
new file mode 100644
index 0000000000..2771dede6a
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/callExpressions.js
@@ -0,0 +1,7 @@
+dispatch({ d });
+function evaluate(script, { frameId } = {frameId: 3}, {c} = {c: 2}) {}
+
+a(b(c()));
+
+a.b().c();
+a.b.c.d();
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/calls.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/calls.js
new file mode 100644
index 0000000000..f05d445db7
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/calls.js
@@ -0,0 +1,21 @@
+foo(1, '2', bar())
+
+foo()
+ .bar()
+ .bazz()
+
+console.log('yo')
+
+foo(
+ 1,
+ bar()
+)
+
+var a = 3;
+
+// set a step point at the first call expression in step expressions
+var x = { a: a(), b: b(), c: c() };
+var b = [ foo() ];
+[ a(), b(), c() ];
+(1, a(), b());
+x(1, a(), b());
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/class.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/class.js
new file mode 100644
index 0000000000..59d612ebfe
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/class.js
@@ -0,0 +1,28 @@
+class Test {
+ publicProperty;
+ #privateProperty = "default";
+ static myStatic = "static";
+ static hello() {
+ return "Hello " + this.myStatic
+ }
+ static {
+ const x = this.myStatic;
+ }
+
+ constructor() {
+ this.publicProperty = "foo";
+ this.#privateProperty = "bar";
+ }
+
+ bar(a) {
+ console.log("bar", a);
+ }
+
+ baz = b => {
+ return b * 2;
+ };
+}
+
+class Test2 {}
+
+let expressiveClass = class {};
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/component.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/component.js
new file mode 100644
index 0000000000..38d9b00096
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/component.js
@@ -0,0 +1,84 @@
+/*
+ * class
+ */
+
+class Punny extends Component {
+ constructor(props) {
+ super();
+ this.onClick = this.onClick.bind(this);
+ }
+
+ componentDidMount() {}
+
+ onClick() {}
+
+ renderMe() {
+ return <div onClick={this.onClick} />;
+ }
+
+ render() {}
+}
+
+/*
+ * CALL EXPRESSIONS - createClass, extend
+ */
+
+const TodoView = Backbone.View.extend({
+ tagName: "li",
+
+ render: function() {
+ console.log("yo");
+ }
+});
+
+const TodoClass = createClass({
+ tagName: "li",
+
+ render: function() {
+ console.log("yo");
+ }
+});
+
+TodoClass = createClass({
+ tagName: "li",
+
+ render: function() {
+ console.log("yo");
+ }
+});
+
+app.TodoClass = createClass({
+ tagName: "li",
+
+ render: function() {
+ console.log("yo");
+ }
+});
+
+/*
+ * PROTOTYPE
+ */
+
+function Button() {
+ if (!(this instanceof Button)) return new Button();
+ this.color = null;
+ Nanocomponent.call(this);
+}
+
+Button.prototype = Object.create(Nanocomponent.prototype);
+
+var x = function() {};
+
+Button.prototype.createElement = function(color) {
+ this.color = color;
+ return html`
+ <button style="background-color: ${color}">
+ Click Me
+ </button>
+ `;
+};
+
+// Implement conditional rendering
+Button.prototype.update = function(newColor) {
+ return newColor !== this.color;
+};
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/computed-props.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/computed-props.js
new file mode 100644
index 0000000000..4c0f182f33
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/computed-props.js
@@ -0,0 +1,8 @@
+(function(key) {
+ let obj = {
+ b: 5
+ };
+ obj[key] = 0;
+ const c = obj.b;
+ return obj;
+})("a");
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/control-flow.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/control-flow.js
new file mode 100644
index 0000000000..b9e859ff74
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/control-flow.js
@@ -0,0 +1,39 @@
+
+if (x) {
+ foo();
+}
+else if (y) {
+ foo();
+}
+else {
+ foo();
+}
+
+for (var i=0; i< 5; i++ ) {
+ foo();
+}
+
+while (x) {
+ foo();
+}
+
+switch (c) {
+ case a:
+ console.log('hi')
+}
+
+var a = 3;
+
+for (const val of [1, 2]) {
+ console.log("pause again", val);
+}
+
+for (const val of vals) {
+ console.log("pause again", val);
+}
+
+try {
+} catch (e) {
+}
+
+with (e) {}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/decorators.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/decorators.js
new file mode 100644
index 0000000000..22c0a1398d
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/decorators.js
@@ -0,0 +1,2 @@
+@annotation
+class MyClass { }
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/destructuring.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/destructuring.js
new file mode 100644
index 0000000000..52686e6573
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/destructuring.js
@@ -0,0 +1,16 @@
+const { b, resty } = compute(stuff);
+const { first: f, last: l } = obj;
+
+const [a, ...rest] = compute(stuff);
+const [x] = ["a"];
+
+for (const [index, element] of arr.entries()) {
+ console.log(index, element);
+}
+
+const { a: aa = 10, b: bb = 5 } = { a: 3 };
+const { temp: [{ foo: foooo }] } = obj;
+
+let { [key]: foo } = { z: "bar" };
+
+let [, prefName] = prefsBlueprint[accessorName];
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/es6.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/es6.js
new file mode 100644
index 0000000000..90b53141f4
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/es6.js
@@ -0,0 +1 @@
+dispatch({ ...action, [PROMISE]: promise });
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/expression.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/expression.js
new file mode 100644
index 0000000000..fa80b68add
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/expression.js
@@ -0,0 +1,25 @@
+const obj = { a: { b: 2 } }; // e.g. obj.a.b
+const foo = obj2.c.secondProperty; // e.g. foo.obj2.c.secondProperty
+
+// computed properties
+const com = { [a]: { b: "c", [d]: "e" }, [b]: 3 }; // e.g. com[a].b
+const firstAuthor = collection.books[1].author;
+const firstActionDirector = collection.genres["sci-fi"].movies[0].director;
+
+app.TodoView = Backbone.extend({
+ render: function() {}
+});
+
+// assignments
+obj.foo = { a: { b: "c" }, b: 3 }; // e.g. obj.foo.a.b
+com = { a: { b: "c" }, b: 3 }; // e.g. com.a.b
+
+// arrays
+const res = [{ a: 2 }, { b: 3 }]; // e.g. res[1].b
+const res2 = { a: [{ b: 2 }] }; // e.g. res.a[0].b
+const res3 = { a: [{ b: 2 }], b: [{ c: 3 }] }; // e.g. res.a[0].b
+const res4 = [[{ a: 3 }], [{ b: a.b.c.v.d }]]; // e.g. res[1][0].b
+
+function params({ a, b }) {} // e.g. a
+var pars = function({ a, b }) {};
+const evil = obj2.doEvil().c.secondProperty; // e.g. obj2.doEvil or ""
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/flow.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/flow.js
new file mode 100644
index 0000000000..1135bd62a4
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/flow.js
@@ -0,0 +1,5 @@
+class App extends Component {
+ renderHello(name: string, action: ReduxAction, { todos }: Props) {
+ return `howdy ${name}`;
+ }
+}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/angular1FalsePositive.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/angular1FalsePositive.js
new file mode 100644
index 0000000000..5220f26c8c
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/angular1FalsePositive.js
@@ -0,0 +1,11 @@
+const frameworkStars = {
+ angular: 40779,
+ react: 111576,
+ vue: 114358,
+};
+
+const container = new Container();
+container.module("sum", (...args) => args.reduce((s, c) => s + c, 0));
+
+container.get("sum",
+ (sum) => sum(Object.values(frameworkStars)));
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/angular1Module.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/angular1Module.js
new file mode 100644
index 0000000000..f0e8c381ef
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/angular1Module.js
@@ -0,0 +1,4 @@
+angular.module('something', ['ngRoute', 'ngResource'])
+ .config(function ($routeProvider) {
+ 'use strict';
+ });
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/plainJavascript.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/plainJavascript.js
new file mode 100644
index 0000000000..41609f8715
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/plainJavascript.js
@@ -0,0 +1,8 @@
+"use strict"
+
+const a = 2;
+
+function test(a) {
+ return a;
+}
+
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/reactComponent.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/reactComponent.js
new file mode 100644
index 0000000000..37f3ac49e5
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/reactComponent.js
@@ -0,0 +1,3 @@
+import React, { Component } from "react";
+
+class PrimaryPanes extends Component {}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/reactComponentEs5.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/reactComponentEs5.js
new file mode 100644
index 0000000000..a4370b5369
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/reactComponentEs5.js
@@ -0,0 +1,3 @@
+var React = require("react");
+
+class PrimaryPanes extends React.Component {}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/reactLibrary.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/reactLibrary.js
new file mode 100644
index 0000000000..9ca048e77f
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/reactLibrary.js
@@ -0,0 +1,19 @@
+/**
+ * Base class helpers for the updating state of a component.
+ */
+function Component(props, context, updater) {
+ this.props = props;
+ this.context = context;
+ // If a component has string refs, we will assign a different object later.
+ this.refs = emptyObject;
+ // We initialize the default updater but the real one gets injected by the
+ // renderer.
+ this.updater = updater || ReactNoopUpdateQueue;
+}
+
+Component.prototype.isReactComponent = {};
+Component.prototype.setState = function (partialState, callback) {
+ !(typeof partialState === 'object' || typeof partialState === 'function' || partialState == null)
+ ? invariant(false, 'setState(...): takes an object of state variables to update or a function which returns an object of state variables.') : void 0;
+ this.updater.enqueueSetState(this, partialState, callback, 'setState');
+};
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/reduxLibrary.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/reduxLibrary.js
new file mode 100644
index 0000000000..b86c8fb0cf
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/reduxLibrary.js
@@ -0,0 +1,39 @@
+(function (global, factory) {
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+ typeof define === 'function' && define.amd ? define(['exports'], factory) :
+ (factory((global.Redux = {})));
+ }(this, (function (exports) { 'use strict';
+
+ function symbolObservablePonyfill(root) {
+ var result;
+ var Symbol = root.Symbol;
+
+ if (typeof Symbol === 'function') {
+ if (Symbol.observable) {
+ result = Symbol.observable;
+ } else {
+ result = Symbol('observable');
+ Symbol.observable = result;
+ }
+ } else {
+ result = '@@observable';
+ }
+
+ return result;
+ }
+
+ /* global window */
+
+ var root;
+
+ if (typeof self !== 'undefined') {
+ root = self;
+ } else if (typeof window !== 'undefined') {
+ root = window;
+ } else if (typeof global !== 'undefined') {
+ root = global;
+ } else if (typeof module !== 'undefined') {
+ root = module;
+ } else {
+ root = Function('return this')();
+ } \ No newline at end of file
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/vueFileComponent.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/vueFileComponent.js
new file mode 100644
index 0000000000..d41e55b72b
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/vueFileComponent.js
@@ -0,0 +1,3 @@
+Vue.component('test-item', {
+ template: '<li>This is a test item</li>'
+}) \ No newline at end of file
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/vueFileDeclarative.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/vueFileDeclarative.js
new file mode 100644
index 0000000000..844fce1451
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/frameworks/vueFileDeclarative.js
@@ -0,0 +1,6 @@
+var app = new Vue({
+ el: '#app',
+ data: {
+ message: 'Hello Vue!'
+ }
+}) \ No newline at end of file
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/func.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/func.js
new file mode 100644
index 0000000000..bb0d4c1b05
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/func.js
@@ -0,0 +1,50 @@
+function square(n) {
+ return n * n;
+}
+
+export function exFoo() {
+ return "yay";
+}
+
+async function slowFoo() {
+ return "meh";
+}
+
+export async function exSlowFoo() {
+ return "yay in a bit";
+}
+
+function ret() {
+ return foo();
+}
+
+child = function() {};
+
+(function() {
+ 2;
+})();
+
+const obj = {
+ foo: function name() {
+ 2 + 2;
+ },
+
+ bar() {
+ 2 + 2;
+ }
+};
+
+export default function root() {
+}
+
+function test(a1, a2 = 45, { a3, a4, a5: { a6: a7 } = {} } = {}) {
+ console.log("pause next here");
+}
+
+() => (x = 4);
+
+function ret2() {
+ return (
+ foo()
+ );
+}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/functionNames.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/functionNames.js
new file mode 100644
index 0000000000..2ae38fc548
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/functionNames.js
@@ -0,0 +1,50 @@
+/* eslint-disable */
+
+({
+ foo: function() {},
+ "foo": function() {},
+ 42: function() {},
+
+ foo() {},
+ "foo"() {},
+ 42() {},
+});
+
+foo = function() {};
+obj.foo = function() {};
+
+var foo = function(){};
+var [foo = function(){}] = [];
+var {foo = function(){}} = {};
+
+[foo = function(){}] = [];
+({foo = function(){}} = {});
+({bar: foo = function(){}} = {});
+
+function fn([foo = function(){}]){}
+function f2({foo = function(){}} = {}){}
+function f3({bar: foo = function(){}} = {}){}
+
+class Cls {
+ foo = function() {};
+ "foo" = function() {};
+ 42 = function() {};
+
+ foo() {}
+ "foo"() {}
+ 42() {}
+}
+
+(function(){});
+
+export default function (){}
+
+const defaultObj = {a: 1};
+const defaultArr = ['smthng'];
+function a(first, second){}
+function b(first = 'bla', second){}
+function c(first = {}, second){}
+function d(first = [], second){}
+function e(first = defaultObj, second){}
+function f(first = defaultArr, second){}
+function g(first = null, second){}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/generators.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/generators.js
new file mode 100644
index 0000000000..7c71838827
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/generators.js
@@ -0,0 +1,4 @@
+function* foo() {
+ yield 1;
+ yield 2;
+}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/jsx.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/jsx.js
new file mode 100644
index 0000000000..c781f7666f
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/jsx.js
@@ -0,0 +1,5 @@
+const jsxElement = <h1> Hi ! I'm here ! </h1>;
+
+<div id="3" res={foo()}>
+ <Item>{foo()}</Item>
+</div>
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/math.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/math.js
new file mode 100644
index 0000000000..508d28ca99
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/math.js
@@ -0,0 +1,15 @@
+function math(n) {
+ function square(n) {
+ // inline comment
+ n * n;
+ }
+
+ // document some lines
+ const two = square(2);
+
+ const four = squaare(4);
+ return two * four;
+}
+
+var child = function() {};
+child2 = function() {};
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/modules.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/modules.js
new file mode 100644
index 0000000000..8ba351497e
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/modules.js
@@ -0,0 +1,10 @@
+import {x} from "y"
+import z from "y";
+
+export class AppComponent {
+ title = 'app'
+}
+
+export default class AppComponent {
+ title = 'app'
+}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/object-expressions.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/object-expressions.js
new file mode 100644
index 0000000000..b7f4806e04
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/object-expressions.js
@@ -0,0 +1,6 @@
+const y = ({ params });
+const foo = ({ b });
+const bar = { x: 3, y: "434", z: true, a: null, s: c * 2, d : getValue(2) }
+const params = frameId ? { frameActor: frameId } : {}
+
+const collection = {genres: {"sci-fi": {movies: [{director: "yo"}]}}}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/optional-chaining.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/optional-chaining.js
new file mode 100644
index 0000000000..757335f78b
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/optional-chaining.js
@@ -0,0 +1,3 @@
+const obj = {};
+obj?.a;
+obj?.a?.b ?? [];
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/outOfScope.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/outOfScope.js
new file mode 100644
index 0000000000..30218f546b
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/outOfScope.js
@@ -0,0 +1,62 @@
+// Program Scope
+
+function outer() {
+ function inner() {
+ const x = 1;
+ }
+
+ const arrow = () => {
+ const x = 1;
+ };
+
+ const declaration = function() {
+ const x = 1;
+ };
+
+ assignment = (function() {
+ const x = 1;
+ })();
+
+ const iifeDeclaration = (function() {
+ const x = 1;
+ })();
+
+ return function() {
+ const x = 1;
+ };
+}
+
+function exclude() {
+ function another() {
+ const x = 1;
+ }
+}
+
+const globalArrow = () => {
+ const x = 1;
+};
+
+const globalDeclaration = function() {
+ const x = 1;
+};
+
+globalAssignment = (function() {
+ const x = 1;
+})();
+
+const globalIifeDeclaration = (function() {
+ const x = 1;
+})();
+
+function parentFunc() {
+ let MAX = 3;
+ let nums = [0, 1, 2, 3];
+ let x = 1;
+ let y = nums.find(function(n) {
+ return n == x;
+ });
+ function innerFunc(a) {
+ return Math.max(a, MAX);
+ }
+ return innerFunc(y);
+}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/outOfScopeComment.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/outOfScopeComment.js
new file mode 100644
index 0000000000..bc02f94671
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/outOfScopeComment.js
@@ -0,0 +1,4 @@
+// Some comment
+(function() {
+ const x = 1;
+})();
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/parseScriptTags.html b/devtools/client/debugger/src/workers/parser/tests/fixtures/parseScriptTags.html
new file mode 100644
index 0000000000..6283f0ee98
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/parseScriptTags.html
@@ -0,0 +1,42 @@
+<html>
+<head>
+ <script type="text/javascript">
+ var globalObject = {
+ first: "name",
+ last: "words"
+ };
+ function sayHello (name) {
+ return `Hello, ${name}!`;
+ }
+ </script>
+ <style>
+ BODY {
+ font-size: 48px;
+ color: rebeccapurple;
+ }
+ </style>
+</head>
+<body>
+ <h1>Testing Script Tags in HTML</h1>
+ <script>
+ const capitalize = name => {
+ return name[0].toUpperCase() + name.substring(1)
+ };
+ const greetAll = ["my friend", "buddy", "world"]
+ .map(capitalize)
+ .map(sayHello)
+ .join("\n");
+
+ globalObject.greetings = greetAll;
+ </script>
+ <p>
+ Some arbitrary intermediate content to affect the offsets of the scripts
+ </p>
+ <script>
+ (function iife() {
+ const greeting = sayHello("Ryan");
+ console.log(greeting);
+ })();
+ </script>
+</body>
+</html>
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/private-fields.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/private-fields.js
new file mode 100644
index 0000000000..ca9abc8f1d
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/private-fields.js
@@ -0,0 +1,24 @@
+class MyClass {
+ constructor(secret, ...rest) {
+ const self = this;
+ this.#secret = secret;
+ self.#restParams = rest;
+ }
+
+ #secret;
+ #restParams;
+ #salt = "bloup";
+ creationDate = new Date();
+
+ #getSalt() {
+ return this.#salt;
+ }
+
+ debug() {
+ const self = this;
+ const creationDate = this.creationDate;
+ const secret = this.#secret;
+ const salt = self.#getSalt();
+ return `${creationDate}|${salt}|${secret}`;
+ }
+}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/proto.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/proto.js
new file mode 100644
index 0000000000..38c3b63ac7
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/proto.js
@@ -0,0 +1,14 @@
+const foo = function() {};
+
+const bar = () => {};
+
+const TodoView = Backbone.View.extend({
+ tagName: "li",
+ initialize: function() {},
+ doThing(b) {
+ console.log("hi", b);
+ },
+ render: function() {
+ return this;
+ }
+});
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/regexp.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/regexp.js
new file mode 100644
index 0000000000..fb0f13b0d0
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/regexp.js
@@ -0,0 +1 @@
+const re = /^\p{RGI_Emoji}$/v; \ No newline at end of file
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/resolveToken.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/resolveToken.js
new file mode 100644
index 0000000000..4660f0f568
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/resolveToken.js
@@ -0,0 +1,40 @@
+const a = 1;
+let b = 0;
+
+function getA() {
+ return a;
+}
+
+function setB(newB) {
+ b = newB;
+}
+
+const plusAB = (function(x, y) {
+ const obj = { x, y };
+ function insideClosure(alpha, beta) {
+ return alpha + beta + obj.x + obj.y;
+ }
+
+ return insideClosure;
+})(a, b);
+
+function withMultipleScopes() {
+ var outer = 1;
+ function innerScope() {
+ var inner = outer + 1;
+ return inner;
+ }
+
+ const fromIIFE = (function(toIIFE) {
+ return innerScope() + toIIFE;
+ })(1);
+
+ {
+ // random block
+ let x = outer + fromIIFE;
+ if (x) {
+ const y = x * x;
+ console.log(y);
+ }
+ }
+}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/arrow-function.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/arrow-function.js
new file mode 100644
index 0000000000..4ec72fd450
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/arrow-function.js
@@ -0,0 +1,11 @@
+export {};
+
+let outer = (p1) => {
+ console.log(this);
+
+ (function() {
+ var inner = (p2) => {
+ console.log(this);
+ };
+ })();
+};
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/binding-types.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/binding-types.js
new file mode 100644
index 0000000000..8c9cc05d1d
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/binding-types.js
@@ -0,0 +1,24 @@
+import def from "";
+import { named } from "";
+import { thing as otherNamed } from "";
+import * as namespace from "";
+
+function fn() {}
+class cls {
+ method(){
+
+ }
+}
+
+var aVar;
+let aLet;
+const aConst = "";
+
+(function inner() {
+ this;
+ arguments;
+});
+
+{
+ function blockFn(){}
+}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/block-statement.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/block-statement.js
new file mode 100644
index 0000000000..5e64d1180f
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/block-statement.js
@@ -0,0 +1,13 @@
+export {};
+
+let first;
+
+{
+ var second;
+ function third() {}
+ class Fourth {}
+ let fifth;
+ const sixth = 6;
+}
+
+var seventh;
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/class-declaration.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/class-declaration.js
new file mode 100644
index 0000000000..1c2c74dcbc
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/class-declaration.js
@@ -0,0 +1,14 @@
+export {};
+
+class Outer {
+ method() {
+ class Inner {
+ m() {
+ console.log(this);
+ }
+ }
+ }
+}
+
+@decorator
+class Second {}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/class-expression.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/class-expression.js
new file mode 100644
index 0000000000..16b6841d71
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/class-expression.js
@@ -0,0 +1,11 @@
+export {};
+
+var Outer = class Outer {
+ method() {
+ var Inner = class {
+ m() {
+ console.log(this);
+ }
+ };
+ }
+};
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/class-property.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/class-property.js
new file mode 100644
index 0000000000..a80cad3a87
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/class-property.js
@@ -0,0 +1,10 @@
+export {};
+
+class Foo {
+ prop = this.init();
+
+ other = do {
+ var one;
+ let two;
+ };
+}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/complex-nesting.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/complex-nesting.js
new file mode 100644
index 0000000000..40763f556f
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/complex-nesting.js
@@ -0,0 +1,29 @@
+function named(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = root;
+function root() {
+ function fn(arg) {
+ var _this = this,
+ _arguments = arguments;
+
+ console.log(this, arguments);
+ console.log("pause here", fn, root);
+
+ var arrow = function arrow(argArrow) {
+ console.log(_this, _arguments);
+ console.log("pause here", fn, root);
+ };
+ arrow("arrow-arg");
+ }
+
+ fn.call("this-value", "arg-value");
+}
+module.exports = exports["default"];
+
+}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/expressions.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/expressions.js
new file mode 100644
index 0000000000..6698acd8e8
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/expressions.js
@@ -0,0 +1,6 @@
+const foo = {};
+
+foo.bar().baz;
+(0, foo.bar)().baz;
+Object(foo.bar)().baz;
+__webpack_require__.i(foo.bar)().baz;
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/flowtype-bindings.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/flowtype-bindings.js
new file mode 100644
index 0000000000..385797c044
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/flowtype-bindings.js
@@ -0,0 +1,11 @@
+import type { One, Two, Three } from "./src/mod";
+
+type Other = {
+ root: typeof root,
+};
+
+const aConst = (window: Array<string>);
+
+export default function root() {
+
+}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/fn-body-lex-and-nonlex.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/fn-body-lex-and-nonlex.js
new file mode 100644
index 0000000000..a7f6d7670a
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/fn-body-lex-and-nonlex.js
@@ -0,0 +1,23 @@
+function fn() {
+ var nonlex;
+ let lex;
+
+}
+
+function fn2() {
+ function nonlex(){}
+ let lex;
+
+}
+
+function fn3() {
+ var nonlex;
+ class Thing {}
+
+}
+
+function fn4() {
+ function nonlex(){}
+ class Thing {}
+
+}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/for-loops.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/for-loops.js
new file mode 100644
index 0000000000..747eeeae7d
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/for-loops.js
@@ -0,0 +1,13 @@
+export {};
+
+for (var one;;) {}
+for (let two;;) {}
+for (const three = 3;;) {}
+
+for (var four in {}) {}
+for (let five in {}) {}
+for (const six in {}) {}
+
+for (var seven of {}) {}
+for (let eight of {}) {}
+for (const nine of {}) {}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/function-declaration.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/function-declaration.js
new file mode 100644
index 0000000000..759374b437
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/function-declaration.js
@@ -0,0 +1,11 @@
+export {};
+
+function outer(p1) {}
+
+{
+ function middle(p2) {
+ function inner(p3) {}
+
+ console.log(this);
+ }
+}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/function-expression.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/function-expression.js
new file mode 100644
index 0000000000..436413533e
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/function-expression.js
@@ -0,0 +1,7 @@
+export {};
+
+let fn = function(p1) {};
+
+let fn2 = function withName(p2) {
+ console.log(this);
+};
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/jsx-component.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/jsx-component.js
new file mode 100644
index 0000000000..ffe1c1dfce
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/jsx-component.js
@@ -0,0 +1,6 @@
+import SomeComponent from "";
+
+<SomeComponent attr="value" />;
+<SomeComponent attr="value"></SomeComponent>;
+<SomeComponent.prop attr="value" />;
+<SomeComponent.prop.child attr="value" />;
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/out-of-order-declarations.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/out-of-order-declarations.js
new file mode 100644
index 0000000000..4f36d9fc38
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/out-of-order-declarations.js
@@ -0,0 +1,21 @@
+var val;
+
+export default function root() {
+ var val;
+
+ var fn;
+
+ this;
+
+ function callback() {
+ console.log(val, fn, callback, root, this);
+
+ var val;
+
+ function fn(){};
+ }
+
+ callback();
+}
+
+import aDefault from "./src/mod";
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/pattern-declarations.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/pattern-declarations.js
new file mode 100644
index 0000000000..6810ef4614
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/pattern-declarations.js
@@ -0,0 +1,2 @@
+var { prop: one } = {};
+var [ two ] = [];
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/simple-module.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/simple-module.js
new file mode 100644
index 0000000000..b25cc7a863
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/simple-module.js
@@ -0,0 +1,11 @@
+import foo from "foo";
+
+console.log(foo);
+
+var one = 1;
+let two = 2;
+const three = 3;
+
+function fn() {}
+
+this;
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/switch-statement.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/switch-statement.js
new file mode 100644
index 0000000000..7163c3811d
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/switch-statement.js
@@ -0,0 +1,22 @@
+export {};
+
+switch (foo) {
+ case "zero":
+ var zero;
+ case "one":
+ let one;
+ case "two":
+ let two;
+ case "three": {
+ let three;
+ }
+}
+
+switch (foo) {
+ case "":
+ function two(){}
+}
+switch (foo) {
+ case "":
+ class three {}
+}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/try-catch.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/try-catch.js
new file mode 100644
index 0000000000..8ccf4db592
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/try-catch.js
@@ -0,0 +1,9 @@
+export {};
+
+try {
+ var first;
+ let second;
+} catch (err) {
+ var third;
+ let fourth;
+}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/ts-sample.ts b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/ts-sample.ts
new file mode 100644
index 0000000000..e23ff83754
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/ts-sample.ts
@@ -0,0 +1,41 @@
+
+// TSEnumDeclaration
+enum Color {
+ // TSEnumMember
+ Red,
+ Green,
+ Blue,
+}
+
+class Example<T> {
+ // TSParameterProperty
+ constructor(public foo) {
+
+ }
+
+ method(): never {
+ throw new Error();
+ }
+}
+
+// TSTypeAssertion
+var foo = <any>window;
+
+// TSAsExpression
+(window as any);
+
+// TSNonNullExpression
+(window!);
+
+// TSModuleDeclaration
+namespace TheSpace {
+ function fn() {
+
+ }
+}
+
+// TSImportEqualsDeclaration
+import ImportedClass = require("mod");
+
+// TSExportAssignment
+export = Example;
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/tsx-sample.tsx b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/tsx-sample.tsx
new file mode 100644
index 0000000000..9e2b9faf8b
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/tsx-sample.tsx
@@ -0,0 +1,41 @@
+
+// TSEnumDeclaration
+enum Color {
+ // TSEnumMember
+ Red,
+ Green,
+ Blue,
+}
+
+class Example<T> {
+ // TSParameterProperty
+ constructor(public foo) {
+
+ }
+
+ method(): never {
+ throw new Error();
+ }
+}
+
+// JSXElement
+var foo = <any>window</any>;
+
+// TSAsExpression
+(window as any);
+
+// TSNonNullExpression
+(window!);
+
+// TSModuleDeclaration
+namespace TheSpace {
+ function fn() {
+
+ }
+}
+
+// TSImportEqualsDeclaration
+import ImportedClass = require("mod");
+
+// TSExportAssignment
+export = Example;
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/vue-sample.vue b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/vue-sample.vue
new file mode 100644
index 0000000000..0fceee99d1
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/scopes/vue-sample.vue
@@ -0,0 +1,26 @@
+<template>
+ <div class="hello">
+ <h1>{{ msg }}</h1>
+ </div>
+</template>
+
+<script>
+var moduleVar = "data";
+
+export default {
+ name: 'HelloWorld',
+ data () {
+ var fnVar = 4;
+
+ return {
+ msg: 'Welcome to Your Vue.js App'
+ };
+ }
+};
+</script>
+
+<style scoped>
+a {
+ color: red;
+}
+</style>
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/statements.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/statements.js
new file mode 100644
index 0000000000..f2c113570e
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/statements.js
@@ -0,0 +1,40 @@
+debugger; debugger;
+console.log("a"); console.log("a");
+
+// assignments with valid pause locations
+this.x = 3;
+var a = 4;
+var d = [foo()]
+var f = 3, e = 4;
+var g = [], h = {};
+
+// assignments with invalid pause locations
+var b = foo();
+c = foo();
+
+
+const arr = [
+ '1',
+ 2,
+ foo()
+]
+
+const obj = {
+ a: '1',
+ b: 2,
+ c: foo(),
+}
+
+foo(
+ 1,
+ foo(
+ 1
+ ),
+ 3
+)
+
+throw new Error("3");
+3;
+
+while (i < 6) { break }
+while (i < 6) { continue;}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/thisExpression.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/thisExpression.js
new file mode 100644
index 0000000000..dd398db426
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/thisExpression.js
@@ -0,0 +1,11 @@
+class Test {
+ constructor() {
+ this.foo = {
+ a: "foobar"
+ };
+ }
+
+ bar() {
+ console.log(this.foo.a);
+ }
+}
diff --git a/devtools/client/debugger/src/workers/parser/tests/fixtures/var.js b/devtools/client/debugger/src/workers/parser/tests/fixtures/var.js
new file mode 100644
index 0000000000..509ad368e8
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/fixtures/var.js
@@ -0,0 +1,21 @@
+var foo = 1;
+let bar = 2;
+const baz = 3;
+const a = 4,
+ b = 5;
+a = 5;
+
+var { foo: { baw } } = {}
+var {bap} = {}
+var {ll = 3} = {}
+
+
+var [first] = [1]
+
+var { a: _a } = 3
+
+var [oh, {my: god}] = [{},{}]
+
+var [[oj], [{oy, vey: _vey, mitzvot: _mitz = 4}]] = [{},{}]
+
+var [one, ...stuff] = []
diff --git a/devtools/client/debugger/src/workers/parser/tests/framework.spec.js b/devtools/client/debugger/src/workers/parser/tests/framework.spec.js
new file mode 100644
index 0000000000..d41f45b71c
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/framework.spec.js
@@ -0,0 +1,63 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { getSymbols } from "../getSymbols";
+import { populateOriginalSource } from "./helpers";
+import cases from "jest-in-case";
+
+cases(
+ "Parser.getFramework",
+ ({ name, file, value }) => {
+ const source = populateOriginalSource("frameworks/plainJavascript");
+ const symbols = getSymbols(source.id);
+ expect(symbols.framework).toBeNull();
+ },
+ [
+ {
+ name: "is undefined when no framework",
+ file: "frameworks/plainJavascript",
+ value: null,
+ },
+ {
+ name: "does not get confused with angular (#6833)",
+ file: "frameworks/angular1FalsePositive",
+ value: null,
+ },
+ {
+ name: "recognizes ES6 React component",
+ file: "frameworks/reactComponent",
+ value: "React",
+ },
+ {
+ name: "recognizes ES5 React component",
+ file: "frameworks/reactComponentEs5",
+ value: "React",
+ },
+ {
+ name: "recognizes Angular 1 module",
+ file: "frameworks/angular1Module",
+ value: "Angular",
+ },
+ {
+ name: "recognizes declarative Vue file",
+ file: "frameworks/vueFileDeclarative",
+ value: "Vue",
+ },
+ {
+ name: "recognizes component Vue file",
+ file: "frameworks/vueFileComponent",
+ value: "Vue",
+ },
+ {
+ name: "recognizes the react library file",
+ file: "framework/reactLibrary",
+ value: "React",
+ },
+ {
+ name: "recognizes the redux library file",
+ file: "framework/reduxLibrary",
+ value: "React",
+ },
+ ]
+);
diff --git a/devtools/client/debugger/src/workers/parser/tests/getScopes.spec.js b/devtools/client/debugger/src/workers/parser/tests/getScopes.spec.js
new file mode 100644
index 0000000000..a2d394ae96
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/getScopes.spec.js
@@ -0,0 +1,227 @@
+/* eslint max-nested-callbacks: ["error", 4]*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import getScopes from "../getScopes";
+import { populateOriginalSource } from "./helpers";
+import cases from "jest-in-case";
+
+cases(
+ "Parser.getScopes",
+ ({ name, file, type, locations }) => {
+ const source = populateOriginalSource(file, type);
+
+ locations.forEach(([line, column]) => {
+ const scopes = getScopes({
+ source,
+ line,
+ column,
+ });
+
+ expect(scopes).toMatchSnapshot(
+ `getScopes ${name} at line ${line} column ${column}`
+ );
+ });
+ },
+ [
+ {
+ name: "finds scope bindings in fn body with both lex and non-lex items",
+ file: "scopes/fn-body-lex-and-nonlex",
+ locations: [
+ [4, 0],
+ [10, 0],
+ [16, 0],
+ [22, 0],
+ ],
+ },
+ {
+ name: "finds scope bindings in a vue file",
+ file: "scopes/vue-sample",
+ type: "vue",
+ locations: [[14, 0]],
+ },
+ {
+ name: "finds scope bindings in a typescript file",
+ file: "scopes/ts-sample",
+ type: "ts",
+ locations: [
+ [9, 0],
+ [13, 4],
+ [17, 0],
+ [33, 0],
+ ],
+ },
+ {
+ name: "finds scope bindings in a typescript-jsx file",
+ file: "scopes/tsx-sample",
+ type: "tsx",
+ locations: [
+ [9, 0],
+ [13, 4],
+ [17, 0],
+ [33, 0],
+ ],
+ },
+ {
+ name: "finds scope bindings in a module",
+ file: "scopes/simple-module",
+ locations: [[7, 0]],
+ },
+ {
+ name: "finds scope bindings in a JSX element",
+ file: "scopes/jsx-component",
+ locations: [[2, 0]],
+ },
+ {
+ name: "finds scope bindings for complex binding nesting",
+ file: "scopes/complex-nesting",
+ locations: [
+ [16, 4],
+ [20, 6],
+ ],
+ },
+ {
+ name: "finds scope bindings for function declarations",
+ file: "scopes/function-declaration",
+ locations: [
+ [2, 0],
+ [3, 20],
+ [5, 1],
+ [9, 0],
+ ],
+ },
+ {
+ name: "finds scope bindings for function expressions",
+ file: "scopes/function-expression",
+ locations: [
+ [2, 0],
+ [3, 23],
+ [6, 0],
+ ],
+ },
+ {
+ name: "finds scope bindings for arrow functions",
+ file: "scopes/arrow-function",
+ locations: [
+ [2, 0],
+ [4, 0],
+ [7, 0],
+ [8, 0],
+ ],
+ },
+ {
+ name: "finds scope bindings for class declarations",
+ file: "scopes/class-declaration",
+ locations: [
+ [2, 0],
+ [5, 0],
+ [7, 0],
+ ],
+ },
+ {
+ name: "finds scope bindings for class expressions",
+ file: "scopes/class-expression",
+ locations: [
+ [2, 0],
+ [5, 0],
+ [7, 0],
+ ],
+ },
+ {
+ name: "finds scope bindings for for loops",
+ file: "scopes/for-loops",
+ locations: [
+ [2, 0],
+ [3, 17],
+ [4, 17],
+ [5, 25],
+ [7, 22],
+ [8, 22],
+ [9, 23],
+ [11, 23],
+ [12, 23],
+ [13, 24],
+ ],
+ },
+ {
+ name: "finds scope bindings for try..catch",
+ file: "scopes/try-catch",
+ locations: [
+ [2, 0],
+ [4, 0],
+ [7, 0],
+ ],
+ },
+ {
+ name: "finds scope bindings for out of order declarations",
+ file: "scopes/out-of-order-declarations",
+ locations: [
+ [2, 0],
+ [5, 0],
+ [11, 0],
+ [14, 0],
+ [17, 0],
+ ],
+ },
+ {
+ name: "finds scope bindings for block statements",
+ file: "scopes/block-statement",
+ locations: [
+ [2, 0],
+ [6, 0],
+ ],
+ },
+ {
+ name: "finds scope bindings for class properties",
+ file: "scopes/class-property",
+ locations: [
+ [2, 0],
+ [4, 16],
+ [6, 12],
+ [7, 0],
+ ],
+ },
+ {
+ name: "finds scope bindings and exclude Flowtype",
+ file: "scopes/flowtype-bindings",
+ locations: [
+ [8, 0],
+ [10, 0],
+ ],
+ },
+ {
+ name: "finds scope bindings for declarations with patterns",
+ file: "scopes/pattern-declarations",
+ locations: [[1, 0]],
+ },
+ {
+ name: "finds scope bindings for switch statements",
+ file: "scopes/switch-statement",
+ locations: [
+ [2, 0],
+ [5, 0],
+ [7, 0],
+ [9, 0],
+ [11, 0],
+ [17, 0],
+ [21, 0],
+ ],
+ },
+ {
+ name: "finds scope bindings with proper types",
+ file: "scopes/binding-types",
+ locations: [
+ [5, 0],
+ [9, 0],
+ [18, 0],
+ [23, 0],
+ ],
+ },
+ {
+ name: "finds scope bindings with expression metadata",
+ file: "scopes/expressions",
+ locations: [[2, 0]],
+ },
+ ]
+);
diff --git a/devtools/client/debugger/src/workers/parser/tests/getSymbols.spec.js b/devtools/client/debugger/src/workers/parser/tests/getSymbols.spec.js
new file mode 100644
index 0000000000..723eef1fd9
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/getSymbols.spec.js
@@ -0,0 +1,51 @@
+/* eslint max-nested-callbacks: ["error", 4]*/
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { formatSymbols } from "../utils/formatSymbols";
+import { populateSource, populateOriginalSource } from "./helpers";
+import cases from "jest-in-case";
+
+cases(
+ "Parser.getSymbols",
+ ({ name, file, original, type }) => {
+ const source = original
+ ? populateOriginalSource(file, type)
+ : populateSource(file, type);
+
+ expect(formatSymbols(source.id)).toMatchSnapshot();
+ },
+ [
+ { name: "es6", file: "es6", original: true },
+ { name: "func", file: "func", original: true },
+ { name: "function names", file: "functionNames", original: true },
+ { name: "math", file: "math" },
+ { name: "proto", file: "proto" },
+ { name: "class", file: "class", original: true },
+ { name: "var", file: "var" },
+ { name: "expression", file: "expression" },
+ { name: "allSymbols", file: "allSymbols" },
+ { name: "call sites", file: "call-sites" },
+ { name: "call expression", file: "callExpressions" },
+ { name: "object expressions", file: "object-expressions" },
+ { name: "optional chaining", file: "optional-chaining" },
+ { name: "private fields", file: "private-fields" },
+ {
+ name: "finds symbols in an html file",
+ file: "parseScriptTags",
+ type: "html",
+ },
+ { name: "component", file: "component", original: true },
+ {
+ name: "react component",
+ file: "frameworks/reactComponent",
+ original: true,
+ },
+ { name: "flow", file: "flow", original: true },
+ { name: "jsx", file: "jsx", original: true },
+ { name: "destruct", file: "destructuring" },
+
+ { name: "regexp", file: "regexp" },
+ ]
+);
diff --git a/devtools/client/debugger/src/workers/parser/tests/helpers/index.js b/devtools/client/debugger/src/workers/parser/tests/helpers/index.js
new file mode 100644
index 0000000000..47c358ae66
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/helpers/index.js
@@ -0,0 +1,86 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import fs from "fs";
+import path from "path";
+
+import { makeMockSourceAndContent } from "../../../../utils/test-mockup";
+import { setSource } from "../../sources";
+import * as asyncValue from "../../../../utils/async-value";
+
+export function getFixture(name, type = "js") {
+ return fs.readFileSync(
+ path.join(__dirname, `../fixtures/${name}.${type}`),
+ "utf8"
+ );
+}
+
+function getSourceContent(name, type = "js") {
+ const text = getFixture(name, type);
+ let contentType = "text/javascript";
+ if (type === "html") {
+ contentType = "text/html";
+ } else if (type === "vue") {
+ contentType = "text/vue";
+ } else if (type === "ts") {
+ contentType = "text/typescript";
+ } else if (type === "tsx") {
+ contentType = "text/typescript-jsx";
+ }
+
+ return {
+ type: "text",
+ value: text,
+ contentType,
+ };
+}
+
+export function getSource(name, type) {
+ const { value: text, contentType } = getSourceContent(name, type);
+
+ return makeMockSourceAndContent(undefined, name, contentType, text);
+}
+
+export function populateSource(name, type) {
+ const { content, ...source } = getSource(name, type);
+ setSource({
+ id: source.id,
+ text: content.value,
+ contentType: content.contentType,
+ isWasm: false,
+ });
+ return {
+ ...source,
+ content: asyncValue.fulfilled(content),
+ };
+}
+
+export function getOriginalSource(name, type) {
+ return getOriginalSourceWithContent(name, type);
+}
+
+export function getOriginalSourceWithContent(name, type) {
+ const { value: text, contentType } = getSourceContent(name, type);
+
+ return makeMockSourceAndContent(
+ undefined,
+ `${name}/originalSource-1`,
+ contentType,
+ text
+ );
+}
+
+export function populateOriginalSource(name, type) {
+ const { content, ...source } = getOriginalSourceWithContent(name, type);
+ setSource({
+ id: source.id,
+ text: content.value,
+ contentType: content.contentType,
+ isWasm: false,
+ });
+ return {
+ ...source,
+ content: asyncValue.fulfilled(content),
+ };
+}
diff --git a/devtools/client/debugger/src/workers/parser/tests/mapBindings.spec.js b/devtools/client/debugger/src/workers/parser/tests/mapBindings.spec.js
new file mode 100644
index 0000000000..8c23ab5873
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/mapBindings.spec.js
@@ -0,0 +1,161 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import mapExpressionBindings from "../mapBindings";
+import { parseConsoleScript } from "../utils/ast";
+import cases from "jest-in-case";
+
+const prettier = require("prettier");
+
+function format(code) {
+ return prettier.format(code, { semi: false, parser: "babel" });
+}
+
+function excludedTest({ name, expression, bindings = [] }) {
+ const safeExpression = mapExpressionBindings(
+ expression,
+ parseConsoleScript(expression),
+ bindings
+ );
+ expect(format(safeExpression)).toEqual(format(expression));
+}
+
+function includedTest({ name, expression, newExpression, bindings }) {
+ const safeExpression = mapExpressionBindings(
+ expression,
+ parseConsoleScript(expression),
+ bindings
+ );
+ expect(format(safeExpression)).toEqual(format(newExpression));
+}
+
+describe("mapExpressionBindings", () => {
+ cases("included cases", includedTest, [
+ {
+ name: "single declaration",
+ expression: "const a = 2; let b = 3; var c = 4;",
+ newExpression: "self.a = 2; self.b = 3; self.c = 4;",
+ },
+ {
+ name: "multiple declarations",
+ expression: "const a = 2, b = 3",
+ newExpression: "self.a = 2; self.b = 3",
+ },
+ {
+ name: "declaration with separate assignment",
+ expression: "let a; a = 2;",
+ newExpression: "self.a = void 0; self.a = 2;",
+ },
+ {
+ name: "multiple declarations with no assignment",
+ expression: "let a = 2, b;",
+ newExpression: "self.a = 2; self.b = void 0;",
+ },
+ {
+ name: "local bindings become assignments",
+ bindings: ["a"],
+ expression: "var a = 2;",
+ newExpression: "a = 2;",
+ },
+ {
+ name: "assignments",
+ expression: "a = 2;",
+ newExpression: "self.a = 2;",
+ },
+ {
+ name: "assignments with +=",
+ expression: "a += 2;",
+ newExpression: "self.a += 2;",
+ },
+ {
+ name: "destructuring (objects)",
+ expression: "const { a } = {}; ",
+ newExpression: "({ a: self.a } = {})",
+ },
+ {
+ name: "destructuring (arrays)",
+ expression: " var [a, ...foo] = [];",
+ newExpression: "([self.a, ...self.foo] = [])",
+ },
+ {
+ name: "destructuring (declarations)",
+ expression: "var {d,e} = {}, {f} = {}; ",
+ newExpression: `({ d: self.d, e: self.e } = {});
+ ({ f: self.f } = {})
+ `,
+ },
+ {
+ name: "destructuring & declaration",
+ expression: "const { a } = {}; var b = 3",
+ newExpression: `({ a: self.a } = {});
+ self.b = 3
+ `,
+ },
+ {
+ name: "destructuring assignment",
+ expression: "[a] = [3]",
+ newExpression: "[self.a] = [3]",
+ },
+ {
+ name: "destructuring assignment (declarations)",
+ expression: "[a] = [3]; var b = 4",
+ newExpression: "[self.a] = [3];\n self.b = 4",
+ },
+ ]);
+
+ cases("excluded cases", excludedTest, [
+ { name: "local variables", expression: "function a() { var b = 2}" },
+ { name: "functions", expression: "function a() {}" },
+ { name: "classes", expression: "class a {}" },
+
+ { name: "with", expression: "with (obj) {var a = 2;}" },
+ {
+ name: "with & declaration",
+ expression: "with (obj) {var a = 2;}; ; var b = 3",
+ },
+ {
+ name: "hoisting",
+ expression: "{ const h = 3; }",
+ },
+ {
+ name: "assignments",
+ bindings: ["a"],
+ expression: "a = 2;",
+ },
+ {
+ name: "identifier",
+ expression: "a",
+ },
+ ]);
+
+ cases("cases that we should map in the future", excludedTest, [
+ { name: "blocks (IF)", expression: "if (true) { var a = 3; }" },
+ {
+ name: "hoisting",
+ expression: "{ var g = 5; }",
+ },
+ {
+ name: "for loops bindings",
+ expression: "for (let foo = 4; false;){}",
+ },
+ ]);
+
+ cases("cases that we shouldn't map in the future", includedTest, [
+ {
+ name: "window properties",
+ expression: "var innerHeight = 3; var location = 5;",
+ newExpression: "self.innerHeight = 3; self.location = 5;",
+ },
+ {
+ name: "self declaration",
+ expression: "var self = 3",
+ newExpression: "self.self = 3",
+ },
+ {
+ name: "self assignment",
+ expression: "self = 3",
+ newExpression: "self.self = 3",
+ },
+ ]);
+});
diff --git a/devtools/client/debugger/src/workers/parser/tests/mapExpression.spec.js b/devtools/client/debugger/src/workers/parser/tests/mapExpression.spec.js
new file mode 100644
index 0000000000..6c89231012
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/mapExpression.spec.js
@@ -0,0 +1,796 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import mapExpression from "../mapExpression";
+import { format } from "prettier";
+import cases from "jest-in-case";
+
+function test({
+ expression,
+ newExpression,
+ bindings,
+ mappings,
+ shouldMapBindings,
+ expectedMapped,
+ parseExpression = true,
+}) {
+ const res = mapExpression(expression, mappings, bindings, shouldMapBindings);
+
+ if (parseExpression) {
+ expect(
+ format(res.expression, {
+ parser: "babel",
+ })
+ ).toEqual(format(newExpression, { parser: "babel" }));
+ } else {
+ expect(res.expression).toEqual(newExpression);
+ }
+
+ expect(res.mapped).toEqual(expectedMapped);
+}
+
+function formatAwait(body) {
+ return `(async () => { ${body} })();`;
+}
+
+describe("mapExpression", () => {
+ cases("mapExpressions", test, [
+ {
+ name: "await",
+ expression: "await a()",
+ newExpression: formatAwait("return a()"),
+ bindings: [],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (multiple statements)",
+ expression: "const x = await a(); x + x",
+ newExpression: formatAwait("self.x = await a(); return x + x;"),
+ bindings: [],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: true,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (inner)",
+ expression: "async () => await a();",
+ newExpression: "async () => await a();",
+ bindings: [],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: false,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (multiple awaits)",
+ expression: "const x = await a(); await b(x)",
+ newExpression: formatAwait("self.x = await a(); return b(x);"),
+ bindings: [],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: true,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (assignment)",
+ expression: "let x = await sleep(100, 2)",
+ newExpression: formatAwait("return (self.x = await sleep(100, 2))"),
+ bindings: [],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: true,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (destructuring)",
+ expression: "const { a, c: y } = await b()",
+ newExpression: formatAwait(
+ "return ({ a: self.a, c: self.y } = await b())"
+ ),
+ bindings: [],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: true,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (array destructuring)",
+ expression: "const [a, y] = await b();",
+ newExpression: formatAwait("return ([self.a, self.y] = await b())"),
+ bindings: [],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: true,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (mixed destructuring)",
+ expression: "const [{ a }] = await b();",
+ newExpression: formatAwait("return ([{ a: self.a }] = await b())"),
+ bindings: [],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: true,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (destructuring, multiple statements)",
+ expression: "const { a, c: y } = await b(), { x } = await y()",
+ newExpression: formatAwait(`
+ ({ a: self.a, c: self.y } = await b())
+ return ({ x: self.x } = await y());
+ `),
+ bindings: [],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: true,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (destructuring, bindings)",
+ expression: "const { a, c: y } = await b();",
+ newExpression: formatAwait("return ({ a, c: y } = await b())"),
+ bindings: ["a", "y"],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: true,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (array destructuring, bindings)",
+ expression: "const [a, y] = await b();",
+ newExpression: formatAwait("return ([a, y] = await b())"),
+ bindings: ["a", "y"],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: true,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (mixed destructuring, bindings)",
+ expression: "const [{ a }] = await b();",
+ newExpression: formatAwait("return ([{ a }] = await b())"),
+ bindings: ["a"],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: true,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (destructuring with defaults, bindings)",
+ expression: "const { c, a = 5 } = await b();",
+ newExpression: formatAwait("return ({ c: self.c, a = 5 } = await b())"),
+ bindings: ["a", "y"],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: true,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (array destructuring with defaults, bindings)",
+ expression: "const [a, y = 10] = await b();",
+ newExpression: formatAwait("return ([a, y = 10] = await b())"),
+ bindings: ["a", "y"],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: true,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (mixed destructuring with defaults, bindings)",
+ expression: "const [{ c = 5 }, a = 5] = await b();",
+ newExpression: formatAwait(
+ "return ([ { c: self.c = 5 }, a = 5] = await b())"
+ ),
+ bindings: ["a"],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: true,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (nested destructuring, bindings)",
+ expression: "const { a, c: { y } } = await b();",
+ newExpression: formatAwait(`
+ return ({
+ a,
+ c: { y }
+ } = await b());
+ `),
+ bindings: ["a", "y"],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: true,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (nested destructuring with defaults)",
+ expression: "const { a, c: { y = 5 } = {} } = await b();",
+ newExpression: formatAwait(`return ({
+ a: self.a,
+ c: { y: self.y = 5 } = {},
+ } = await b());
+ `),
+ bindings: [],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: true,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (very nested destructuring with defaults)",
+ expression:
+ "const { a, c: { y: { z = 10, b } = { b: 5 } } } = await b();",
+ newExpression: formatAwait(`
+ return ({
+ a: self.a,
+ c: {
+ y: { z: self.z = 10, b: self.b } = {
+ b: 5
+ }
+ }
+ } = await b());
+ `),
+ bindings: [],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: true,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (with SyntaxError)",
+ expression: "await new Promise())",
+ newExpression: formatAwait("await new Promise())"),
+ parseExpression: false,
+ bindings: [],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (no bindings, let assignment)",
+ expression: "let a = await 123;",
+ newExpression: `let a;
+ (async () => {
+ return a = await 123;
+ })()`,
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (no bindings, var assignment)",
+ expression: "var a = await 123;",
+ newExpression: `var a;
+ (async () => {
+ return a = await 123;
+ })()`,
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (no bindings, const assignment)",
+ expression: "const a = await 123;",
+ newExpression: `let a;
+ (async () => {
+ return a = await 123;
+ })()`,
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (no bindings, multiple assignments)",
+ expression: "let a = 1, b, c = 3; b = await 123; a + b + c",
+ newExpression: `let a, b, c;
+ (async () => {
+ a = 1;
+ c = 3;
+ b = await 123;
+ return a + b + c;
+ })()`,
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (no bindings, object destructuring)",
+ expression: "let {a, b, c} = await x;",
+ newExpression: `let a, b, c;
+ (async () => {
+ return ({a, b, c} = await x);
+ })()`,
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (no bindings, object destructuring with rest)",
+ expression: "let {a, ...rest} = await x;",
+ newExpression: `let a, rest;
+ (async () => {
+ return ({a, ...rest} = await x);
+ })()`,
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (no bindings, object destructuring with renaming and default)",
+ expression: "let {a: hello, b, c: world, d: $ = 4} = await x;",
+ newExpression: `let hello, b, world, $;
+ (async () => {
+ return ({a: hello, b, c: world, d: $ = 4} = await x);
+ })()`,
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (no bindings, nested object destructuring + renaming + default)",
+ expression: `let {
+ a: hello, c: { y: { z = 10, b: bill, d: [e, f = 20] }}
+ } = await x; z;`,
+ newExpression: `let hello, z, bill, e, f;
+ (async () => {
+ ({ a: hello, c: { y: { z = 10, b: bill, d: [e, f = 20] }}} = await x);
+ return z;
+ })()`,
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (no bindings, array destructuring)",
+ expression: "let [a, b, c] = await x; c;",
+ newExpression: `let a, b, c;
+ (async () => {
+ [a, b, c] = await x;
+ return c;
+ })()`,
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (no bindings, array destructuring with default)",
+ expression: "let [a, b = 1, c = 2] = await x; c;",
+ newExpression: `let a, b, c;
+ (async () => {
+ [a, b = 1, c = 2] = await x;
+ return c;
+ })()`,
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (no bindings, array destructuring with default and rest)",
+ expression: "let [a, b = 1, c = 2, ...rest] = await x; rest;",
+ newExpression: `let a, b, c, rest;
+ (async () => {
+ [a, b = 1, c = 2, ...rest] = await x;
+ return rest;
+ })()`,
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (no bindings, nested array destructuring with default)",
+ expression: "let [a, b = 1, [c = 2, [d = 3, e = 4]]] = await x; c;",
+ newExpression: `let a, b, c, d, e;
+ (async () => {
+ [a, b = 1, [c = 2, [d = 3, e = 4]]] = await x;
+ return c;
+ })()`,
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (no bindings, dynamic import)",
+ expression: `
+ var {rainbowLog} = await import("./cool-module.js");
+ rainbowLog("dynamic");`,
+ newExpression: `var rainbowLog;
+ (async () => {
+ ({rainbowLog} = await import("./cool-module.js"));
+ return rainbowLog("dynamic");
+ })()`,
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (nullish coalesce operator)",
+ expression: "await x; true ?? false",
+ newExpression: `(async () => {
+ await x;
+ return true ?? false;
+ })()`,
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (optional chaining operator)",
+ expression: "await x; x?.y?.z",
+ newExpression: `(async () => {
+ await x;
+ return x?.y?.z;
+ })()`,
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (async function declaration with nullish coalesce operator)",
+ expression: "async function coalesce(x) { await x; return x ?? false; }",
+ newExpression:
+ "async function coalesce(x) { await x; return x ?? false; }",
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: false,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (async function declaration with optional chaining operator)",
+ expression: "async function chain(x) { await x; return x?.y?.z; }",
+ newExpression: "async function chain(x) { await x; return x?.y?.z; }",
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: false,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ // check that variable declaration in for loop is not put outside of the async iife
+ name: "await (for loop)",
+ expression: "for (let i=0;i<2;i++) {}; var b = await 1;",
+ newExpression: `var b;
+ (async () => {
+ for (let i=0;i<2;i++) {}
+ return (b = await 1);
+ })()`,
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ // check that variable declaration in for-in loop is not put outside of the async iife
+ name: "await (for..in loop)",
+ expression: "for (let i in {}) {}; var b = await 1;",
+ newExpression: `var b;
+ (async () => {
+ for (let i in {}) {}
+ return (b = await 1);
+ })()`,
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ // check that variable declaration in for-of loop is not put outside of the async iife
+ name: "await (for..of loop)",
+ expression: "for (let i of []) {}; var b = await 1;",
+ newExpression: `var b;
+ (async () => {
+ for (let i of []) {}
+ return (b = await 1);
+ })()`,
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (if condition)",
+ expression: "if (await true) console.log(1);",
+ newExpression: formatAwait("if (await true) console.log(1);"),
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "await (non-expression final statement: bug 1851759)",
+ expression: `j = { "foo": 1, "bar": 2 }; await 42; for (var k in j) { console.log(k); }`,
+ newExpression: formatAwait(`
+ j = {
+ foo: 1,
+ bar: 2,
+ };
+ await 42;
+ for (var k in j) {
+ console.log(k);
+ }`),
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: true,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "simple",
+ expression: "a",
+ newExpression: "a",
+ bindings: [],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: false,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "mappings",
+ expression: "a",
+ newExpression: "_a",
+ bindings: [],
+ mappings: {
+ a: "_a",
+ },
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: false,
+ bindings: false,
+ originalExpression: true,
+ },
+ },
+ {
+ name: "declaration",
+ expression: "var a = 3;",
+ newExpression: "self.a = 3",
+ bindings: [],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: false,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "declaration + destructuring",
+ expression: "var { a } = { a: 3 };",
+ newExpression: "({ a: self.a } = {\n a: 3 \n})",
+ bindings: [],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: false,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "bindings",
+ expression: "var a = 3;",
+ newExpression: "a = 3",
+ bindings: ["a"],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: false,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "bindings + destructuring",
+ expression: "var { a } = { a: 3 };",
+ newExpression: "({ a } = { \n a: 3 \n })",
+ bindings: ["a"],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: false,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "bindings + destructuring + rest",
+ expression: "var { a, ...foo } = {}",
+ newExpression: "({ a, ...self.foo } = {})",
+ bindings: ["a"],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: false,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "bindings + array destructuring + rest",
+ expression: "var [a, ...foo] = []",
+ newExpression: "([a, ...self.foo] = [])",
+ bindings: ["a"],
+ mappings: {},
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: false,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "bindings + mappings",
+ expression: "a = 3;",
+ newExpression: "self.a = 3",
+ bindings: ["_a"],
+ mappings: { a: "_a" },
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: false,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "bindings + mappings + destructuring",
+ expression: "var { a } = { a: 4 }",
+ newExpression: "({ a: self.a } = {\n a: 4 \n})",
+ bindings: ["_a"],
+ mappings: { a: "_a" },
+ shouldMapBindings: true,
+ expectedMapped: {
+ await: false,
+ bindings: true,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "bindings without mappings",
+ expression: "a = 3;",
+ newExpression: "a = 3",
+ bindings: [],
+ mappings: { a: "_a" },
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: false,
+ bindings: false,
+ originalExpression: false,
+ },
+ },
+ {
+ name: "object destructuring + bindings without mappings",
+ expression: "({ a } = {});",
+ newExpression: "({ a: _a } = {})",
+ bindings: [],
+ mappings: { a: "_a" },
+ shouldMapBindings: false,
+ expectedMapped: {
+ await: false,
+ bindings: false,
+ originalExpression: true,
+ },
+ },
+ ]);
+});
diff --git a/devtools/client/debugger/src/workers/parser/tests/mapOriginalExpression.spec.js b/devtools/client/debugger/src/workers/parser/tests/mapOriginalExpression.spec.js
new file mode 100644
index 0000000000..4949d65cd9
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/mapOriginalExpression.spec.js
@@ -0,0 +1,93 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import mapExpression from "../mapExpression";
+import { format } from "prettier";
+
+const formatOutput = output =>
+ format(output, {
+ parser: "babel",
+ });
+
+const mapOriginalExpression = (expression, mappings) =>
+ mapExpression(expression, mappings, [], false, false).expression;
+
+describe("mapOriginalExpression", () => {
+ it("simple", () => {
+ const generatedExpression = mapOriginalExpression("a + b;", {
+ a: "foo",
+ b: "bar",
+ });
+ expect(generatedExpression).toEqual("foo + bar;");
+ });
+
+ it("this", () => {
+ const generatedExpression = mapOriginalExpression("this.prop;", {
+ this: "_this",
+ });
+ expect(generatedExpression).toEqual("_this.prop;");
+ });
+
+ it("member expressions", () => {
+ const generatedExpression = mapOriginalExpression("a + b", {
+ a: "_mod.foo",
+ b: "_mod.bar",
+ });
+ expect(generatedExpression).toEqual("_mod.foo + _mod.bar;");
+ });
+
+ it("block", () => {
+ // todo: maybe wrap with parens ()
+ const generatedExpression = mapOriginalExpression("{a}", {
+ a: "_mod.foo",
+ b: "_mod.bar",
+ });
+ expect(generatedExpression).toEqual("{\n _mod.foo;\n}");
+ });
+
+ it("skips codegen with no mappings", () => {
+ const generatedExpression = mapOriginalExpression("a + b", {
+ a: "a",
+ c: "_c",
+ });
+ expect(generatedExpression).toEqual("a + b");
+ });
+
+ it("object destructuring", () => {
+ const generatedExpression = mapOriginalExpression("({ a } = { a: 4 })", {
+ a: "_mod.foo",
+ });
+
+ expect(formatOutput(generatedExpression)).toEqual(
+ formatOutput("({ a: _mod.foo } = {\n a: 4 \n})")
+ );
+ });
+
+ it("nested object destructuring", () => {
+ const generatedExpression = mapOriginalExpression(
+ "({ a: { b, c } } = { a: 4 })",
+ {
+ a: "_mod.foo",
+ b: "_mod.bar",
+ }
+ );
+
+ expect(formatOutput(generatedExpression)).toEqual(
+ formatOutput("({ a: { b: _mod.bar, c } } = {\n a: 4 \n})")
+ );
+ });
+
+ it("shadowed bindings", () => {
+ const generatedExpression = mapOriginalExpression(
+ "window.thing = function fn(){ var a; a; b; }; a; b; ",
+ {
+ a: "_a",
+ b: "_b",
+ }
+ );
+ expect(generatedExpression).toEqual(
+ "window.thing = function fn() {\n var a;\n a;\n _b;\n};\n_a;\n_b;"
+ );
+ });
+});
diff --git a/devtools/client/debugger/src/workers/parser/tests/sources.spec.js b/devtools/client/debugger/src/workers/parser/tests/sources.spec.js
new file mode 100644
index 0000000000..e84ae4ad22
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/tests/sources.spec.js
@@ -0,0 +1,14 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { getSource } from "../sources";
+
+describe("sources", () => {
+ it("fail getSource", () => {
+ const sourceId = "some.nonexistent.source.id";
+ expect(() => {
+ getSource(sourceId);
+ }).toThrow();
+ });
+});
diff --git a/devtools/client/debugger/src/workers/parser/utils/ast.js b/devtools/client/debugger/src/workers/parser/utils/ast.js
new file mode 100644
index 0000000000..445645c12f
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/utils/ast.js
@@ -0,0 +1,230 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { parseScriptTags } from "./parse-script-tags";
+import * as babelParser from "@babel/parser";
+import * as t from "@babel/types";
+import { getSource } from "../sources";
+
+const ASTs = new Map();
+
+function _parse(code, opts) {
+ return babelParser.parse(code, {
+ ...opts,
+ tokens: true,
+ });
+}
+
+const sourceOptions = {
+ generated: {
+ sourceType: "unambiguous",
+ tokens: true,
+ plugins: [
+ "classStaticBlock",
+ "classPrivateProperties",
+ "classPrivateMethods",
+ "classProperties",
+ "objectRestSpread",
+ "optionalChaining",
+ "privateIn",
+ "nullishCoalescingOperator",
+ "regexpUnicodeSets",
+ ],
+ },
+ original: {
+ sourceType: "unambiguous",
+ tokens: true,
+ plugins: [
+ "jsx",
+ "flow",
+ "doExpressions",
+ "optionalChaining",
+ "nullishCoalescingOperator",
+ "decorators-legacy",
+ "objectRestSpread",
+ "classStaticBlock",
+ "classPrivateProperties",
+ "classPrivateMethods",
+ "classProperties",
+ "exportDefaultFrom",
+ "exportNamespaceFrom",
+ "asyncGenerators",
+ "functionBind",
+ "functionSent",
+ "dynamicImport",
+ "react-jsx",
+ "regexpUnicodeSets",
+ ],
+ },
+};
+
+export function parse(text, opts) {
+ let ast = {};
+ if (!text) {
+ return ast;
+ }
+
+ try {
+ ast = _parse(text, opts);
+ } catch (error) {
+ console.error(error);
+ }
+
+ return ast;
+}
+
+// Custom parser for parse-script-tags that adapts its input structure to
+// our parser's signature
+function htmlParser({ source, line }) {
+ return parse(source, { startLine: line, ...sourceOptions.generated });
+}
+
+const VUE_COMPONENT_START = /^\s*</;
+function vueParser({ source, line }) {
+ return parse(source, {
+ startLine: line,
+ ...sourceOptions.original,
+ });
+}
+function parseVueScript(code) {
+ if (typeof code !== "string") {
+ return {};
+ }
+
+ let ast;
+
+ // .vue files go through several passes, so while there is a
+ // single-file-component Vue template, there are also generally .vue files
+ // that are still just JS as well.
+ if (code.match(VUE_COMPONENT_START)) {
+ ast = parseScriptTags(code, vueParser);
+ if (t.isFile(ast)) {
+ // parseScriptTags is currently hard-coded to return scripts, but Vue
+ // always expects ESM syntax, so we just hard-code it.
+ ast.program.sourceType = "module";
+ }
+ } else {
+ ast = parse(code, sourceOptions.original);
+ }
+ return ast;
+}
+
+export function parseConsoleScript(text, opts) {
+ try {
+ return _parse(text, {
+ plugins: [
+ "classStaticBlock",
+ "classPrivateProperties",
+ "classPrivateMethods",
+ "objectRestSpread",
+ "dynamicImport",
+ "nullishCoalescingOperator",
+ "optionalChaining",
+ "regexpUnicodeSets",
+ ],
+ ...opts,
+ allowAwaitOutsideFunction: true,
+ });
+ } catch (e) {
+ return null;
+ }
+}
+
+export function parseScript(text, opts) {
+ return _parse(text, opts);
+}
+
+export function getAst(sourceId) {
+ if (ASTs.has(sourceId)) {
+ return ASTs.get(sourceId);
+ }
+
+ const source = getSource(sourceId);
+
+ if (source.isWasm) {
+ return null;
+ }
+
+ let ast = {};
+ const { contentType } = source;
+ if (contentType == "text/html") {
+ ast = parseScriptTags(source.text, htmlParser) || {};
+ } else if (contentType && contentType === "text/vue") {
+ ast = parseVueScript(source.text) || {};
+ } else if (
+ contentType &&
+ contentType.match(/(javascript|jsx)/) &&
+ !contentType.match(/typescript-jsx/)
+ ) {
+ const type = source.id.includes("original") ? "original" : "generated";
+ const options = sourceOptions[type];
+ ast = parse(source.text, options);
+ } else if (contentType && contentType.match(/typescript/)) {
+ const options = {
+ ...sourceOptions.original,
+ plugins: [
+ ...sourceOptions.original.plugins.filter(
+ p =>
+ p !== "flow" &&
+ p !== "decorators" &&
+ p !== "decorators2" &&
+ (p !== "jsx" || contentType.match(/typescript-jsx/))
+ ),
+ "decorators-legacy",
+ "typescript",
+ ],
+ };
+ ast = parse(source.text, options);
+ }
+
+ ASTs.set(source.id, ast);
+ return ast;
+}
+
+export function clearASTs(sourceIds) {
+ for (const sourceId of sourceIds) {
+ ASTs.delete(sourceId);
+ }
+}
+
+export function traverseAst(sourceId, visitor, state) {
+ const ast = getAst(sourceId);
+ if (!ast || !Object.keys(ast).length) {
+ return null;
+ }
+
+ t.traverse(ast, visitor, state);
+ return ast;
+}
+
+export function hasNode(rootNode, predicate) {
+ try {
+ t.traverse(rootNode, {
+ enter: (node, ancestors) => {
+ if (predicate(node, ancestors)) {
+ throw new Error("MATCH");
+ }
+ },
+ });
+ } catch (e) {
+ if (e.message === "MATCH") {
+ return true;
+ }
+ }
+ return false;
+}
+
+export function replaceNode(ancestors, node) {
+ const parent = ancestors[ancestors.length - 1];
+
+ if (typeof parent.index === "number") {
+ if (Array.isArray(node)) {
+ parent.node[parent.key].splice(parent.index, 1, ...node);
+ } else {
+ parent.node[parent.key][parent.index] = node;
+ }
+ } else {
+ parent.node[parent.key] = node;
+ }
+}
diff --git a/devtools/client/debugger/src/workers/parser/utils/contains.js b/devtools/client/debugger/src/workers/parser/utils/contains.js
new file mode 100644
index 0000000000..ed4cb31c1d
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/utils/contains.js
@@ -0,0 +1,29 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+function startsBefore(a, b) {
+ let before = a.start.line < b.line;
+ if (a.start.line === b.line) {
+ before =
+ a.start.column >= 0 && b.column >= 0 ? a.start.column <= b.column : true;
+ }
+ return before;
+}
+
+function endsAfter(a, b) {
+ let after = a.end.line > b.line;
+ if (a.end.line === b.line) {
+ after =
+ a.end.column >= 0 && b.column >= 0 ? a.end.column >= b.column : true;
+ }
+ return after;
+}
+
+export function containsPosition(a, b) {
+ return startsBefore(a, b) && endsAfter(a, b);
+}
+
+export function containsLocation(a, b) {
+ return containsPosition(a, b.start) && containsPosition(a, b.end);
+}
diff --git a/devtools/client/debugger/src/workers/parser/utils/formatSymbols.js b/devtools/client/debugger/src/workers/parser/utils/formatSymbols.js
new file mode 100644
index 0000000000..3bcf37e7c4
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/utils/formatSymbols.js
@@ -0,0 +1,65 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { getSymbols } from "../getSymbols";
+
+function formatLocation(loc) {
+ if (!loc) {
+ return "";
+ }
+
+ const { start, end } = loc;
+ const startLoc = `(${start.line}, ${start.column})`;
+ const endLoc = `(${end.line}, ${end.column})`;
+
+ return `[${startLoc}, ${endLoc}]`;
+}
+
+function summarize(symbol) {
+ if (typeof symbol == "boolean") {
+ return symbol ? "true" : "false";
+ }
+
+ const loc = formatLocation(symbol.location);
+ const params = symbol.parameterNames
+ ? `(${symbol.parameterNames.join(", ")})`
+ : "";
+ const expression = symbol.expression || "";
+ const klass = symbol.klass || "";
+ const name = symbol.name == undefined ? "" : symbol.name;
+ const names = symbol.specifiers ? symbol.specifiers.join(", ") : "";
+ const values = symbol.values ? symbol.values.join(", ") : "";
+ const index = symbol.index ? symbol.index : "";
+
+ return `${loc} ${expression} ${name}${params} ${klass} ${names} ${values} ${index}`.trim(); // eslint-disable-line max-len
+}
+const bools = ["hasJsx", "hasTypes"];
+const strings = ["framework"];
+function formatBool(name, symbols) {
+ return `${name}: ${symbols[name] ? "true" : "false"}`;
+}
+
+function formatString(name, symbols) {
+ return `${name}: ${symbols[name]}`;
+}
+
+function formatKey(name, symbols) {
+ if (bools.includes(name)) {
+ return formatBool(name, symbols);
+ }
+
+ if (strings.includes(name)) {
+ return formatString(name, symbols);
+ }
+
+ return `${name}:\n${symbols[name].map(summarize).join("\n")}`;
+}
+
+export function formatSymbols(sourceId) {
+ const symbols = getSymbols(sourceId);
+
+ return Object.keys(symbols)
+ .map(name => formatKey(name, symbols))
+ .join("\n\n");
+}
diff --git a/devtools/client/debugger/src/workers/parser/utils/getFunctionName.js b/devtools/client/debugger/src/workers/parser/utils/getFunctionName.js
new file mode 100644
index 0000000000..1fe85a5c69
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/utils/getFunctionName.js
@@ -0,0 +1,96 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import * as t from "@babel/types";
+
+// Perform ES6's anonymous function name inference for all
+// locations where static analysis is possible.
+// eslint-disable-next-line complexity
+export default function getFunctionName(node, parent) {
+ if (t.isIdentifier(node.id)) {
+ return node.id.name;
+ }
+
+ if (
+ t.isObjectMethod(node, { computed: false }) ||
+ t.isClassMethod(node, { computed: false }) ||
+ t.isClassPrivateMethod(node)
+ ) {
+ const { key } = node;
+
+ if (t.isIdentifier(key)) {
+ return key.name;
+ }
+ if (t.isStringLiteral(key)) {
+ return key.value;
+ }
+ if (t.isNumericLiteral(key)) {
+ return `${key.value}`;
+ }
+
+ if (t.isPrivateName(key)) {
+ return `#${key.id.name}`;
+ }
+ }
+
+ if (
+ t.isObjectProperty(parent, { computed: false, value: node }) ||
+ // TODO: Babylon 6 doesn't support computed class props. It is included
+ // here so that it is most flexible. Once Babylon 7 is used, this
+ // can change to use computed: false like ObjectProperty.
+ (t.isClassProperty(parent, { value: node }) && !parent.computed) ||
+ (t.isClassPrivateProperty(parent, { value: node }) && !parent.computed)
+ ) {
+ const { key } = parent;
+
+ if (t.isIdentifier(key)) {
+ return key.name;
+ }
+ if (t.isStringLiteral(key)) {
+ return key.value;
+ }
+ if (t.isNumericLiteral(key)) {
+ return `${key.value}`;
+ }
+
+ if (t.isPrivateName(key)) {
+ return `#${key.id.name}`;
+ }
+ }
+
+ if (t.isAssignmentExpression(parent, { operator: "=", right: node })) {
+ if (t.isIdentifier(parent.left)) {
+ return parent.left.name;
+ }
+
+ // This case is not supported in standard ES6 name inference, but it
+ // is included here since it is still a helpful case during debugging.
+ if (t.isMemberExpression(parent.left, { computed: false })) {
+ return parent.left.property.name;
+ }
+ }
+
+ if (
+ t.isAssignmentPattern(parent, { right: node }) &&
+ t.isIdentifier(parent.left)
+ ) {
+ return parent.left.name;
+ }
+
+ if (
+ t.isVariableDeclarator(parent, { init: node }) &&
+ t.isIdentifier(parent.id)
+ ) {
+ return parent.id.name;
+ }
+
+ if (
+ t.isExportDefaultDeclaration(parent, { declaration: node }) &&
+ t.isFunctionDeclaration(node)
+ ) {
+ return "default";
+ }
+
+ return "anonymous";
+}
diff --git a/devtools/client/debugger/src/workers/parser/utils/helpers.js b/devtools/client/debugger/src/workers/parser/utils/helpers.js
new file mode 100644
index 0000000000..0045b54136
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/utils/helpers.js
@@ -0,0 +1,232 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import * as t from "@babel/types";
+import generate from "@babel/generator";
+
+export function isFunction(node) {
+ return (
+ t.isFunction(node) ||
+ t.isArrowFunctionExpression(node) ||
+ t.isObjectMethod(node) ||
+ t.isClassMethod(node)
+ );
+}
+
+export function isAwaitExpression(path) {
+ const { node, parent } = path;
+ return (
+ t.isAwaitExpression(node) ||
+ t.isAwaitExpression(parent.init) ||
+ t.isAwaitExpression(parent)
+ );
+}
+
+export function isYieldExpression(path) {
+ const { node, parent } = path;
+ return (
+ t.isYieldExpression(node) ||
+ t.isYieldExpression(parent.init) ||
+ t.isYieldExpression(parent)
+ );
+}
+
+export function isObjectShorthand(parent) {
+ if (!t.isObjectProperty(parent)) {
+ return false;
+ }
+
+ if (parent.value && parent.value.left) {
+ return (
+ parent.value.type === "AssignmentPattern" &&
+ parent.value.left.type === "Identifier"
+ );
+ }
+
+ return (
+ parent.value &&
+ parent.key.start == parent.value.start &&
+ parent.key.loc.identifierName === parent.value.loc.identifierName
+ );
+}
+
+export function getObjectExpressionValue(node) {
+ const { value } = node;
+
+ if (t.isIdentifier(value)) {
+ return value.name;
+ }
+
+ if (t.isCallExpression(value) || t.isFunctionExpression(value)) {
+ return "";
+ }
+ const code = generate(value).code;
+
+ const shouldWrap = t.isObjectExpression(value);
+ return shouldWrap ? `(${code})` : code;
+}
+
+export function getCode(node) {
+ return generate(node).code;
+}
+
+export function getComments(ast) {
+ if (!ast || !ast.comments) {
+ return [];
+ }
+ return ast.comments.map(comment => ({
+ name: comment.location,
+ location: comment.loc,
+ }));
+}
+
+export function isComputedExpression(expression) {
+ return /^\[/m.test(expression);
+}
+
+export function getMemberExpression(root) {
+ function _getMemberExpression(node, expr) {
+ if (t.isMemberExpression(node)) {
+ expr = [node.property.name].concat(expr);
+ return _getMemberExpression(node.object, expr);
+ }
+
+ if (t.isCallExpression(node)) {
+ return [];
+ }
+
+ if (t.isThisExpression(node)) {
+ return ["this"].concat(expr);
+ }
+
+ return [node.name].concat(expr);
+ }
+
+ const expr = _getMemberExpression(root, []);
+ return expr.join(".");
+}
+
+export function getVariables(dec) {
+ if (!dec.id) {
+ return [];
+ }
+
+ if (t.isArrayPattern(dec.id)) {
+ if (!dec.id.elements) {
+ return [];
+ }
+
+ // NOTE: it's possible that an element is empty or has several variables
+ // e.g. const [, a] = arr
+ // e.g. const [{a, b }] = 2
+ return dec.id.elements
+ .filter(Boolean)
+ .map(element => ({
+ name: t.isAssignmentPattern(element)
+ ? element.left.name
+ : element.name || element.argument?.name,
+ location: element.loc,
+ }))
+ .filter(({ name }) => name);
+ }
+
+ return [
+ {
+ name: dec.id.name,
+ location: dec.loc,
+ },
+ ];
+}
+
+/**
+ * Add the identifiers for a given object pattern.
+ *
+ * @param {Array.<Object>} identifiers
+ * the current list of identifiers where to push the new identifiers
+ * related to this path.
+ * @param {Set<String>} identifiersKeys
+ * List of currently registered identifier location key.
+ * @param {Object} pattern
+ */
+export function addPatternIdentifiers(identifiers, identifiersKeys, pattern) {
+ let items;
+ if (t.isObjectPattern(pattern)) {
+ items = pattern.properties.map(({ value }) => value);
+ }
+
+ if (t.isArrayPattern(pattern)) {
+ items = pattern.elements;
+ }
+
+ if (items) {
+ addIdentifiers(identifiers, identifiersKeys, items);
+ }
+}
+
+function addIdentifiers(identifiers, identifiersKeys, items) {
+ for (const item of items) {
+ if (t.isObjectPattern(item) || t.isArrayPattern(item)) {
+ addPatternIdentifiers(identifiers, identifiersKeys, item);
+ } else if (t.isIdentifier(item)) {
+ if (!identifiersKeys.has(nodeLocationKey(item.loc))) {
+ identifiers.push({
+ name: item.name,
+ expression: item.name,
+ location: item.loc,
+ });
+ }
+ }
+ }
+}
+
+// Top Level checks the number of "body" nodes in the ancestor chain
+// if the node is top-level, then it shoul only have one body.
+export function isTopLevel(ancestors) {
+ return ancestors.filter(ancestor => ancestor.key == "body").length == 1;
+}
+
+export function nodeLocationKey({ start, end }) {
+ return `${start.line}:${start.column}:${end.line}:${end.column}`;
+}
+
+export function getFunctionParameterNames(path) {
+ if (path.node.params != null) {
+ return path.node.params.map(param => {
+ if (param.type !== "AssignmentPattern") {
+ return param.name;
+ }
+
+ // Parameter with default value
+ if (
+ param.left.type === "Identifier" &&
+ param.right.type === "Identifier"
+ ) {
+ return `${param.left.name} = ${param.right.name}`;
+ } else if (
+ param.left.type === "Identifier" &&
+ param.right.type === "StringLiteral"
+ ) {
+ return `${param.left.name} = ${param.right.value}`;
+ } else if (
+ param.left.type === "Identifier" &&
+ param.right.type === "ObjectExpression"
+ ) {
+ return `${param.left.name} = {}`;
+ } else if (
+ param.left.type === "Identifier" &&
+ param.right.type === "ArrayExpression"
+ ) {
+ return `${param.left.name} = []`;
+ } else if (
+ param.left.type === "Identifier" &&
+ param.right.type === "NullLiteral"
+ ) {
+ return `${param.left.name} = null`;
+ }
+
+ return null;
+ });
+ }
+ return [];
+}
diff --git a/devtools/client/debugger/src/workers/parser/utils/inferClassName.js b/devtools/client/debugger/src/workers/parser/utils/inferClassName.js
new file mode 100644
index 0000000000..09d25f275d
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/utils/inferClassName.js
@@ -0,0 +1,93 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import * as t from "@babel/types";
+
+// the function class is inferred from a call like
+// createClass or extend
+function fromCallExpression(callExpression) {
+ const allowlist = ["extend", "createClass"];
+ const { callee } = callExpression.node;
+ if (!callee) {
+ return null;
+ }
+
+ const name = t.isMemberExpression(callee)
+ ? callee.property.name
+ : callee.name;
+
+ if (!allowlist.includes(name)) {
+ return null;
+ }
+
+ const variable = callExpression.findParent(p =>
+ t.isVariableDeclarator(p.node)
+ );
+ if (variable) {
+ return variable.node.id.name;
+ }
+
+ const assignment = callExpression.findParent(p =>
+ t.isAssignmentExpression(p.node)
+ );
+
+ if (!assignment) {
+ return null;
+ }
+
+ const { left } = assignment.node;
+
+ if (left.name) {
+ return name;
+ }
+
+ if (t.isMemberExpression(left)) {
+ return left.property.name;
+ }
+
+ return null;
+}
+
+// the function class is inferred from a prototype assignment
+// e.g. TodoClass.prototype.render = function() {}
+function fromPrototype(assignment) {
+ const { left } = assignment.node;
+ if (!left) {
+ return null;
+ }
+
+ if (
+ t.isMemberExpression(left) &&
+ left.object &&
+ t.isMemberExpression(left.object) &&
+ left.object.property.identifier === "prototype"
+ ) {
+ return left.object.object.name;
+ }
+
+ return null;
+}
+
+// infer class finds an appropriate class for functions
+// that are defined inside of a class like thing.
+// e.g. `class Foo`, `TodoClass.prototype.foo`,
+// `Todo = createClass({ foo: () => {}})`
+export function inferClassName(path) {
+ const classDeclaration = path.findParent(p => t.isClassDeclaration(p.node));
+ if (classDeclaration) {
+ return classDeclaration.node.id.name;
+ }
+
+ const callExpression = path.findParent(p => t.isCallExpression(p.node));
+ if (callExpression) {
+ return fromCallExpression(callExpression);
+ }
+
+ const assignment = path.findParent(p => t.isAssignmentExpression(p.node));
+ if (assignment) {
+ return fromPrototype(assignment);
+ }
+
+ return null;
+}
diff --git a/devtools/client/debugger/src/workers/parser/utils/parse-script-tags/customParse.js b/devtools/client/debugger/src/workers/parser/utils/parse-script-tags/customParse.js
new file mode 100644
index 0000000000..5c7fed480d
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/utils/parse-script-tags/customParse.js
@@ -0,0 +1,132 @@
+/**
+ * https://github.com/ryanjduffy/parse-script-tags
+ *
+ * Copyright (c) by Ryan Duff
+ * Licensed under the MIT License.
+ */
+
+import * as types from "@babel/types";
+
+import parseFragment from "./parseScriptFragment.js";
+
+const startScript = /<script[^>]*>/im;
+const endScript = /<\/script\s*>/im;
+// https://stackoverflow.com/questions/5034781/js-regex-to-split-by-line#comment5633979_5035005
+const newLines = /\r\n|[\n\v\f\r\x85\u2028\u2029]/;
+
+function getType(tag) {
+ const fragment = parseFragment(tag);
+
+ if (fragment) {
+ const type = fragment.attributes.type;
+
+ return type ? type.toLowerCase() : null;
+ }
+
+ return null;
+}
+
+function getCandidateScriptLocations(source, index) {
+ const i = index || 0;
+ const str = source.substring(i);
+
+ const startMatch = startScript.exec(str);
+ if (startMatch) {
+ const startsAt = startMatch.index + startMatch[0].length;
+ const afterStart = str.substring(startsAt);
+ const endMatch = endScript.exec(afterStart);
+ if (endMatch) {
+ const locLength = endMatch.index;
+ const locIndex = i + startsAt;
+ const endIndex = locIndex + locLength + endMatch[0].length;
+
+ // extract the complete tag (incl start and end tags and content). if the
+ // type is invalid (= not JS), skip this tag and continue
+ const tag = source.substring(i + startMatch.index, endIndex);
+ const type = getType(tag);
+ if (
+ type &&
+ type !== "javascript" &&
+ type !== "text/javascript" &&
+ type !== "module"
+ ) {
+ return getCandidateScriptLocations(source, endIndex);
+ }
+
+ return [
+ adjustForLineAndColumn(source, {
+ index: locIndex,
+ length: locLength,
+ source: source.substring(locIndex, locIndex + locLength),
+ }),
+ ...getCandidateScriptLocations(source, endIndex),
+ ];
+ }
+ }
+
+ return [];
+}
+
+function parseScripts(locations, parser) {
+ return locations.map(parser);
+}
+
+function calcLineAndColumn(source, index) {
+ const lines = source.substring(0, index).split(newLines);
+ const line = lines.length;
+ const column = lines.pop().length + 1;
+
+ return {
+ column,
+ line,
+ };
+}
+
+function adjustForLineAndColumn(fullSource, location) {
+ const { column, line } = calcLineAndColumn(fullSource, location.index);
+ return Object.assign({}, location, {
+ line,
+ column,
+ // prepend whitespace for scripts that do not start on the first column
+ // NOTE: `column` is 1-based
+ source: " ".repeat(column - 1) + location.source,
+ });
+}
+
+function parseScriptTags(source, parser) {
+ const scripts = parseScripts(getCandidateScriptLocations(source), parser)
+ .filter(types.isFile)
+ .reduce(
+ (main, script) => {
+ return {
+ statements: main.statements.concat(script.program.body),
+ comments: main.comments.concat(script.comments),
+ tokens: main.tokens.concat(script.tokens),
+ };
+ },
+ {
+ statements: [],
+ comments: [],
+ tokens: [],
+ }
+ );
+
+ const program = types.program(scripts.statements);
+ const file = types.file(program, scripts.comments, scripts.tokens);
+
+ const end = calcLineAndColumn(source, source.length);
+ file.start = program.start = 0;
+ file.end = program.end = source.length;
+ file.loc = program.loc = {
+ start: {
+ line: 1,
+ column: 0,
+ },
+ end,
+ };
+
+ return file;
+}
+
+export default parseScriptTags;
+export { getCandidateScriptLocations, parseScripts, parseScriptTags };
diff --git a/devtools/client/debugger/src/workers/parser/utils/parse-script-tags/index.js b/devtools/client/debugger/src/workers/parser/utils/parse-script-tags/index.js
new file mode 100644
index 0000000000..e85d0cdc53
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/utils/parse-script-tags/index.js
@@ -0,0 +1,60 @@
+/**
+ * https://github.com/ryanjduffy/parse-script-tags
+ *
+ * Copyright (c) by Ryan Duff
+ * Licensed under the MIT License.
+ */
+
+import * as types from "@babel/types";
+import * as babelParser from "@babel/parser";
+
+import {
+ getCandidateScriptLocations,
+ parseScripts as customParseScripts,
+ parseScriptTags as customParseScriptTags,
+} from "./customParse.js";
+
+function parseScript({ source, line }) {
+ // remove empty or only whitespace scripts
+ if (source.length === 0 || /^\s+$/.test(source)) {
+ return null;
+ }
+
+ try {
+ return babelParser.parse(source, {
+ sourceType: "script",
+ startLine: line,
+ });
+ } catch (e) {
+ return null;
+ }
+}
+
+function parseScripts(locations, parser = parseScript) {
+ return customParseScripts(locations, parser);
+}
+
+function extractScriptTags(source) {
+ return parseScripts(getCandidateScriptLocations(source), loc => {
+ const ast = parseScript(loc);
+
+ if (ast) {
+ return loc;
+ }
+
+ return null;
+ }).filter(types.isFile);
+}
+
+function parseScriptTags(source, parser = parseScript) {
+ return customParseScriptTags(source, parser);
+}
+
+export default parseScriptTags;
+export {
+ extractScriptTags,
+ getCandidateScriptLocations,
+ parseScript,
+ parseScripts,
+ parseScriptTags,
+};
diff --git a/devtools/client/debugger/src/workers/parser/utils/parse-script-tags/parseScriptFragment.js b/devtools/client/debugger/src/workers/parser/utils/parse-script-tags/parseScriptFragment.js
new file mode 100644
index 0000000000..11dfe4dc1b
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/utils/parse-script-tags/parseScriptFragment.js
@@ -0,0 +1,155 @@
+/**
+ * https://github.com/ryanjduffy/parse-script-tags
+ *
+ * Copyright (c) by Ryan Duff
+ * Licensed under the MIT License.
+ */
+
+const alphanum = /[a-z0-9\-]/i;
+
+function parseToken(str, start) {
+ let i = start;
+ while (i < str.length && alphanum.test(str.charAt(i++))) {
+ continue;
+ }
+
+ if (i !== start) {
+ return {
+ token: str.substring(start, i - 1),
+ index: i,
+ };
+ }
+
+ return null;
+}
+
+function parseAttributes(str, start) {
+ let i = start;
+ const attributes = {};
+ let attribute = null;
+
+ while (i < str.length) {
+ const c = str.charAt(i);
+
+ if (attribute === null && c == ">") {
+ break;
+ } else if (attribute === null && alphanum.test(c)) {
+ attribute = {
+ name: null,
+ value: true,
+ bool: true,
+ terminator: null,
+ };
+
+ const attributeNameNode = parseToken(str, i);
+ if (attributeNameNode) {
+ attribute.name = attributeNameNode.token;
+ i = attributeNameNode.index - 2;
+ }
+ } else if (attribute !== null) {
+ if (c === "=") {
+ // once we've started an attribute, look for = to indicate
+ // it's a non-boolean attribute
+ attribute.bool = false;
+ if (attribute.value === true) {
+ attribute.value = "";
+ }
+ } else if (
+ !attribute.bool &&
+ attribute.terminator === null &&
+ (c === '"' || c === "'")
+ ) {
+ // once we've determined it's non-boolean, look for a
+ // value terminator (", ')
+ attribute.terminator = c;
+ } else if (attribute.terminator) {
+ if (c === attribute.terminator) {
+ // if we had a terminator and found another, we've
+ // reach the end of the attribute
+ attributes[attribute.name] = attribute.value;
+ attribute = null;
+ } else {
+ // otherwise, append the character to the attribute value
+ attribute.value += c;
+
+ // check for an escaped terminator and push it as well
+ // to avoid terminating prematurely
+ if (c === "\\") {
+ const next = str.charAt(i + 1);
+ if (next === attribute.terminator) {
+ attribute.value += next;
+ i += 1;
+ }
+ }
+ }
+ } else if (!/\s/.test(c)) {
+ // if we've hit a non-space character and aren't processing a value,
+ // we're starting a new attribute so push the attribute and clear the
+ // local variable
+ attributes[attribute.name] = attribute.value;
+ attribute = null;
+
+ // move the cursor back to re-find the start of the attribute
+ i -= 1;
+ }
+ }
+
+ i++;
+ }
+
+ if (i !== start) {
+ return {
+ attributes,
+ index: i,
+ };
+ }
+
+ return null;
+}
+
+function parseFragment(str, start = 0) {
+ let tag = null;
+ let open = false;
+ let attributes = {};
+
+ let i = start;
+ while (i < str.length) {
+ const c = str.charAt(i++);
+
+ if (!open && !tag && c === "<") {
+ // Open Start Tag
+ open = true;
+
+ const tagNode = parseToken(str, i);
+ if (!tagNode) {
+ return null;
+ }
+
+ i = tagNode.index - 1;
+ tag = tagNode.token;
+ } else if (open && c === ">") {
+ // Close Start Tag
+ break;
+ } else if (open) {
+ // Attributes
+ const attributeNode = parseAttributes(str, i - 1);
+
+ if (attributeNode) {
+ i = attributeNode.index;
+ attributes = attributeNode.attributes || attributes;
+ }
+ }
+ }
+
+ if (tag) {
+ return {
+ tag,
+ attributes,
+ };
+ }
+
+ return null;
+}
+
+export default parseFragment;
+export { parseFragment };
diff --git a/devtools/client/debugger/src/workers/parser/utils/simple-path.js b/devtools/client/debugger/src/workers/parser/utils/simple-path.js
new file mode 100644
index 0000000000..b3958dcf42
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/utils/simple-path.js
@@ -0,0 +1,104 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+export default function createSimplePath(ancestors) {
+ if (ancestors.length === 0) {
+ return null;
+ }
+
+ // Slice the array because babel-types traverse may continue mutating
+ // the ancestors array in later traversal logic.
+ return new SimplePath(ancestors.slice());
+}
+
+/**
+ * Mimics @babel/traverse's NodePath API in a simpler fashion that isn't as
+ * heavy, but still allows the ease of passing paths around to process nested
+ * AST structures.
+ */
+class SimplePath {
+ _index;
+ _ancestors;
+ _ancestor;
+
+ _parentPath;
+
+ constructor(ancestors, index = ancestors.length - 1) {
+ if (index < 0 || index >= ancestors.length) {
+ console.error(ancestors);
+ throw new Error("Created invalid path");
+ }
+
+ this._ancestors = ancestors;
+ this._ancestor = ancestors[index];
+ this._index = index;
+ }
+
+ get parentPath() {
+ let path = this._parentPath;
+ if (path === undefined) {
+ if (this._index === 0) {
+ path = null;
+ } else {
+ path = new SimplePath(this._ancestors, this._index - 1);
+ }
+ this._parentPath = path;
+ }
+
+ return path;
+ }
+
+ get parent() {
+ return this._ancestor.node;
+ }
+
+ get node() {
+ const { node, key, index } = this._ancestor;
+
+ if (typeof index === "number") {
+ return node[key][index];
+ }
+
+ return node[key];
+ }
+
+ get key() {
+ return this._ancestor.key;
+ }
+
+ get type() {
+ return this.node.type;
+ }
+
+ get inList() {
+ return typeof this._ancestor.index === "number";
+ }
+
+ get containerIndex() {
+ const { index } = this._ancestor;
+
+ if (typeof index !== "number") {
+ throw new Error("Cannot get index of non-array node");
+ }
+
+ return index;
+ }
+
+ find(predicate) {
+ for (let path = this; path; path = path.parentPath) {
+ if (predicate(path)) {
+ return path;
+ }
+ }
+ return null;
+ }
+
+ findParent(predicate) {
+ if (!this.parentPath) {
+ throw new Error("Cannot use findParent on root path");
+ }
+
+ return this.parentPath.find(predicate);
+ }
+}
diff --git a/devtools/client/debugger/src/workers/parser/utils/tests/ast.spec.js b/devtools/client/debugger/src/workers/parser/utils/tests/ast.spec.js
new file mode 100644
index 0000000000..e8d2964205
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/utils/tests/ast.spec.js
@@ -0,0 +1,41 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { getAst } from "../ast";
+import { setSource } from "../../sources";
+import cases from "jest-in-case";
+
+import { makeMockSourceAndContent } from "../../../../utils/test-mockup";
+
+const astKeys = [
+ "type",
+ "start",
+ "end",
+ "loc",
+ "errors",
+ "program",
+ "comments",
+ "tokens",
+];
+
+cases(
+ "ast.getAst",
+ ({ name }) => {
+ const source = makeMockSourceAndContent(undefined, "foo", name, "2");
+ setSource({
+ id: source.id,
+ text: source.content.value || "",
+ contentType: source.content.contentType,
+ isWasm: false,
+ });
+ const ast = getAst("foo");
+ expect(ast && Object.keys(ast)).toEqual(astKeys);
+ },
+ [
+ { name: "text/javascript" },
+ { name: "application/javascript" },
+ { name: "application/x-javascript" },
+ { name: "text/jsx" },
+ ]
+);
diff --git a/devtools/client/debugger/src/workers/parser/worker.js b/devtools/client/debugger/src/workers/parser/worker.js
new file mode 100644
index 0000000000..e0c25632f3
--- /dev/null
+++ b/devtools/client/debugger/src/workers/parser/worker.js
@@ -0,0 +1,39 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import {
+ getSymbols,
+ getFunctionSymbols,
+ getClassSymbols,
+ getClosestFunctionName,
+ clearSymbols,
+} from "./getSymbols";
+import { clearASTs } from "./utils/ast";
+import getScopes, { clearScopes } from "./getScopes";
+import { setSource, clearSources } from "./sources";
+import findOutOfScopeLocations from "./findOutOfScopeLocations";
+import findBestMatchExpression from "./findBestMatchExpression";
+import mapExpression from "./mapExpression";
+
+import { workerHandler } from "../../../../shared/worker-utils";
+
+function clearAllHelpersForSources(sourceIds) {
+ clearASTs(sourceIds);
+ clearScopes(sourceIds);
+ clearSources(sourceIds);
+ clearSymbols(sourceIds);
+}
+
+self.onmessage = workerHandler({
+ findOutOfScopeLocations,
+ findBestMatchExpression,
+ getSymbols,
+ getFunctionSymbols,
+ getClassSymbols,
+ getClosestFunctionName,
+ getScopes,
+ clearSources: clearAllHelpersForSources,
+ mapExpression,
+ setSource,
+});
diff --git a/devtools/client/debugger/src/workers/pretty-print/LICENSE.md b/devtools/client/debugger/src/workers/pretty-print/LICENSE.md
new file mode 100644
index 0000000000..cc8e9a752c
--- /dev/null
+++ b/devtools/client/debugger/src/workers/pretty-print/LICENSE.md
@@ -0,0 +1,23 @@
+Copyright (c) 2013, Nick Fitzgerald
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice, this
+ list of conditions and the following disclaimer.
+
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/devtools/client/debugger/src/workers/pretty-print/index.js b/devtools/client/debugger/src/workers/pretty-print/index.js
new file mode 100644
index 0000000000..4b151b39e4
--- /dev/null
+++ b/devtools/client/debugger/src/workers/pretty-print/index.js
@@ -0,0 +1,30 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { WorkerDispatcher } from "devtools/client/shared/worker-utils";
+
+const WORKER_URL =
+ "resource://devtools/client/debugger/dist/pretty-print-worker.js";
+
+export class PrettyPrintDispatcher extends WorkerDispatcher {
+ constructor(jestUrl) {
+ super(jestUrl || WORKER_URL);
+ }
+
+ #prettyPrintTask = this.task("prettyPrint");
+ #prettyPrintInlineScriptTask = this.task("prettyPrintInlineScript");
+ #getSourceMapForTask = this.task("getSourceMapForTask");
+
+ prettyPrint(options) {
+ return this.#prettyPrintTask(options);
+ }
+
+ prettyPrintInlineScript(options) {
+ return this.#prettyPrintInlineScriptTask(options);
+ }
+
+ getSourceMap(taskId) {
+ return this.#getSourceMapForTask(taskId);
+ }
+}
diff --git a/devtools/client/debugger/src/workers/pretty-print/moz.build b/devtools/client/debugger/src/workers/pretty-print/moz.build
new file mode 100644
index 0000000000..b7223ac81a
--- /dev/null
+++ b/devtools/client/debugger/src/workers/pretty-print/moz.build
@@ -0,0 +1,10 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DIRS += []
+
+CompiledModules(
+ "index.js",
+)
diff --git a/devtools/client/debugger/src/workers/pretty-print/pretty-fast.js b/devtools/client/debugger/src/workers/pretty-print/pretty-fast.js
new file mode 100644
index 0000000000..44b07f4eda
--- /dev/null
+++ b/devtools/client/debugger/src/workers/pretty-print/pretty-fast.js
@@ -0,0 +1,1178 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/* eslint-disable complexity */
+
+var acorn = require("acorn");
+var sourceMap = require("source-map");
+const NEWLINE_CODE = 10;
+
+export function prettyFast(input, options) {
+ return new PrettyFast(options).getPrettifiedCodeAndSourceMap(input);
+}
+
+// If any of these tokens are seen before a "[" token, we know that "[" token
+// is the start of an array literal, rather than a property access.
+//
+// The only exception is "}", which would need to be disambiguated by
+// parsing. The majority of the time, an open bracket following a closing
+// curly is going to be an array literal, so we brush the complication under
+// the rug, and handle the ambiguity by always assuming that it will be an
+// array literal.
+const PRE_ARRAY_LITERAL_TOKENS = new Set([
+ "typeof",
+ "void",
+ "delete",
+ "case",
+ "do",
+ "=",
+ "in",
+ "of",
+ "...",
+ "{",
+ "*",
+ "/",
+ "%",
+ "else",
+ ";",
+ "++",
+ "--",
+ "+",
+ "-",
+ "~",
+ "!",
+ ":",
+ "?",
+ ">>",
+ ">>>",
+ "<<",
+ "||",
+ "&&",
+ "<",
+ ">",
+ "<=",
+ ">=",
+ "instanceof",
+ "&",
+ "^",
+ "|",
+ "==",
+ "!=",
+ "===",
+ "!==",
+ ",",
+ "}",
+]);
+
+// If any of these tokens are seen before a "{" token, we know that "{" token
+// is the start of an object literal, rather than the start of a block.
+const PRE_OBJECT_LITERAL_TOKENS = new Set([
+ "typeof",
+ "void",
+ "delete",
+ "=",
+ "in",
+ "of",
+ "...",
+ "*",
+ "/",
+ "%",
+ "++",
+ "--",
+ "+",
+ "-",
+ "~",
+ "!",
+ ">>",
+ ">>>",
+ "<<",
+ "<",
+ ">",
+ "<=",
+ ">=",
+ "instanceof",
+ "&",
+ "^",
+ "|",
+ "==",
+ "!=",
+ "===",
+ "!==",
+]);
+
+class PrettyFast {
+ /**
+ * @param {Object} options: Provides configurability of the pretty printing.
+ * @param {String} options.url: The URL string of the ugly JS code.
+ * @param {String} options.indent: The string to indent code by.
+ * @param {SourceMapGenerator} options.sourceMapGenerator: An optional sourceMapGenerator
+ * the mappings will be added to.
+ * @param {Boolean} options.prefixWithNewLine: When true, the pretty printed code will start
+ * with a line break
+ * @param {Integer} options.originalStartLine: The line the passed script starts at (1-based).
+ * This is used for inline scripts where we need to account for the lines
+ * before the script tag
+ * @param {Integer} options.originalStartColumn: The column the passed script starts at (1-based).
+ * This is used for inline scripts where we need to account for the position
+ * of the script tag within the line.
+ * @param {Integer} options.generatedStartLine: The line where the pretty printed script
+ * will start at (1-based). This is used for pretty printing HTML file,
+ * where we might have handle previous inline scripts that impact the
+ * position of this script.
+ */
+ constructor(options = {}) {
+ // The level of indents deep we are.
+ this.#indentLevel = 0;
+ this.#indentChar = options.indent;
+
+ // We will handle mappings between ugly and pretty printed code in this SourceMapGenerator.
+ this.#sourceMapGenerator =
+ options.sourceMapGenerator ||
+ new sourceMap.SourceMapGenerator({
+ file: options.url,
+ });
+
+ this.#file = options.url;
+ this.#hasOriginalStartLine = "originalStartLine" in options;
+ this.#hasOriginalStartColumn = "originalStartColumn" in options;
+ this.#hasGeneratedStartLine = "generatedStartLine" in options;
+ this.#originalStartLine = options.originalStartLine;
+ this.#originalStartColumn = options.originalStartColumn;
+ this.#generatedStartLine = options.generatedStartLine;
+ this.#prefixWithNewLine = options.prefixWithNewLine;
+ }
+
+ /* options */
+ #indentChar;
+ #indentLevel;
+ #file;
+ #hasOriginalStartLine;
+ #hasOriginalStartColumn;
+ #hasGeneratedStartLine;
+ #originalStartLine;
+ #originalStartColumn;
+ #prefixWithNewLine;
+ #generatedStartLine;
+ #sourceMapGenerator;
+
+ /* internals */
+
+ // Whether or not we added a newline on after we added the previous token.
+ #addedNewline = false;
+ // Whether or not we added a space after we added the previous token.
+ #addedSpace = false;
+ #currentCode = "";
+ #currentLine = 1;
+ #currentColumn = 0;
+ // The tokens parsed by acorn.
+ #tokenQueue;
+ // The index of the current token in this.#tokenQueue.
+ #currentTokenIndex;
+ // The previous token we added to the pretty printed code.
+ #previousToken;
+ // Stack of token types/keywords that can affect whether we want to add a
+ // newline or a space. We can make that decision based on what token type is
+ // on the top of the stack. For example, a comma in a parameter list should
+ // be followed by a space, while a comma in an object literal should be
+ // followed by a newline.
+ //
+ // Strings that go on the stack:
+ //
+ // - "{"
+ // - "{\n"
+ // - "("
+ // - "(\n"
+ // - "["
+ // - "[\n"
+ // - "do"
+ // - "?"
+ // - "switch"
+ // - "case"
+ // - "default"
+ //
+ // The difference between "[" and "[\n" (as well as "{" and "{\n", and "(" and "(\n")
+ // is that "\n" is used when we are treating (curly) brackets/parens as line delimiters
+ // and should increment and decrement the indent level when we find them.
+ // "[" can represent either a property access (e.g. `x["hi"]`), or an empty array literal
+ // "{" only represents an empty object literals
+ // "(" can represent lots of different things (wrapping expression, if/loop condition, function call, …)
+ #stack = [];
+
+ /**
+ * @param {String} input: The ugly JS code we want to pretty print.
+ * @returns {Object}
+ * An object with the following properties:
+ * - code: The pretty printed code string.
+ * - map: A SourceMapGenerator instance.
+ */
+ getPrettifiedCodeAndSourceMap(input) {
+ // Add the initial new line if needed
+ if (this.#prefixWithNewLine) {
+ this.#write("\n");
+ }
+
+ // Pass through acorn's tokenizer and append tokens and comments into a
+ // single queue to process. For example, the source file:
+ //
+ // foo
+ // // a
+ // // b
+ // bar
+ //
+ // After this process, tokenQueue has the following token stream:
+ //
+ // [ foo, '// a', '// b', bar]
+ this.#tokenQueue = this.#getTokens(input);
+
+ for (let i = 0, len = this.#tokenQueue.length; i < len; i++) {
+ this.#currentTokenIndex = i;
+ const token = this.#tokenQueue[i];
+ const nextToken = this.#tokenQueue[i + 1];
+ this.#handleToken(token, nextToken);
+
+ // Acorn's tokenizer re-uses tokens, so we have to copy the previous token on
+ // every iteration. We follow acorn's lead here, and reuse the previousToken
+ // object the same way that acorn reuses the token object. This allows us
+ // to avoid allocations and minimize GC pauses.
+ if (!this.#previousToken) {
+ this.#previousToken = { loc: { start: {}, end: {} } };
+ }
+ this.#previousToken.start = token.start;
+ this.#previousToken.end = token.end;
+ this.#previousToken.loc.start.line = token.loc.start.line;
+ this.#previousToken.loc.start.column = token.loc.start.column;
+ this.#previousToken.loc.end.line = token.loc.end.line;
+ this.#previousToken.loc.end.column = token.loc.end.column;
+ this.#previousToken.type = token.type;
+ this.#previousToken.value = token.value;
+ }
+
+ return { code: this.#currentCode, map: this.#sourceMapGenerator };
+ }
+
+ /**
+ * Write a pretty printed string to the prettified string and for tokens, add their
+ * mapping to the SourceMapGenerator.
+ *
+ * @param String str
+ * The string to be added to the result.
+ * @param Number line
+ * The line number the string came from in the ugly source.
+ * @param Number column
+ * The column number the string came from in the ugly source.
+ * @param Boolean isToken
+ * Set to true when writing tokens, so we can differentiate them from the
+ * whitespace we add.
+ */
+ #write(str, line, column, isToken) {
+ this.#currentCode += str;
+ if (isToken) {
+ this.#sourceMapGenerator.addMapping({
+ source: this.#file,
+ // We need to swap original and generated locations, as the prettified text should
+ // be seen by the sourcemap service as the "original" one.
+ generated: {
+ // originalStartLine is 1-based, and here we just want to offset by a number of
+ // lines, so we need to decrement it
+ line: this.#hasOriginalStartLine
+ ? line + (this.#originalStartLine - 1)
+ : line,
+ // We only need to adjust the column number if we're looking at the first line, to
+ // account for the html text before the opening <script> tag.
+ column:
+ line == 1 && this.#hasOriginalStartColumn
+ ? column + this.#originalStartColumn
+ : column,
+ },
+ original: {
+ // generatedStartLine is 1-based, and here we just want to offset by a number of
+ // lines, so we need to decrement it.
+ line: this.#hasGeneratedStartLine
+ ? this.#currentLine + (this.#generatedStartLine - 1)
+ : this.#currentLine,
+ column: this.#currentColumn,
+ },
+ name: null,
+ });
+ }
+
+ for (let idx = 0, length = str.length; idx < length; idx++) {
+ if (str.charCodeAt(idx) === NEWLINE_CODE) {
+ this.#currentLine++;
+ this.#currentColumn = 0;
+ } else {
+ this.#currentColumn++;
+ }
+ }
+ }
+
+ /**
+ * Add the given token to the pretty printed results.
+ *
+ * @param Object token
+ * The token to add.
+ */
+ #writeToken(token) {
+ if (token.type.label == "string") {
+ this.#write(
+ `'${sanitize(token.value)}'`,
+ token.loc.start.line,
+ token.loc.start.column,
+ true
+ );
+ } else if (token.type.label == "regexp") {
+ this.#write(
+ String(token.value.value),
+ token.loc.start.line,
+ token.loc.start.column,
+ true
+ );
+ } else {
+ let value;
+ if (token.value != null) {
+ value = token.value;
+ if (token.type.label === "privateId") {
+ value = `#${value}`;
+ }
+ } else {
+ value = token.type.label;
+ }
+ this.#write(
+ String(value),
+ token.loc.start.line,
+ token.loc.start.column,
+ true
+ );
+ }
+ }
+
+ /**
+ * Returns the tokens computed with acorn.
+ *
+ * @param String input
+ * The JS code we want the tokens of.
+ * @returns Array<Object>
+ */
+ #getTokens(input) {
+ const tokens = [];
+
+ const res = acorn.tokenizer(input, {
+ locations: true,
+ ecmaVersion: "latest",
+ onComment(block, text, start, end, startLoc, endLoc) {
+ tokens.push({
+ type: {},
+ comment: true,
+ block,
+ text,
+ loc: { start: startLoc, end: endLoc },
+ });
+ },
+ });
+
+ for (;;) {
+ const token = res.getToken();
+ tokens.push(token);
+ if (token.type.label == "eof") {
+ break;
+ }
+ }
+
+ return tokens;
+ }
+
+ /**
+ * Add the required whitespace before this token, whether that is a single
+ * space, newline, and/or the indent on fresh lines.
+ *
+ * @param Object token
+ * The token we are currently handling.
+ * @param {Object|undefined} nextToken
+ * The next token, might not exist if we're on the last token
+ */
+ #handleToken(token, nextToken) {
+ if (token.comment) {
+ let commentIndentLevel = this.#indentLevel;
+ if (this.#previousToken?.loc?.end?.line == token.loc.start.line) {
+ commentIndentLevel = 0;
+ this.#write(" ");
+ }
+ this.#addComment(
+ commentIndentLevel,
+ token.block,
+ token.text,
+ token.loc.start.line,
+ nextToken
+ );
+ return;
+ }
+
+ // Shorthand for token.type.keyword, so we don't have to repeatedly access
+ // properties.
+ const ttk = token.type.keyword;
+
+ if (ttk && this.#previousToken?.type?.label == ".") {
+ token.type = acorn.tokTypes.name;
+ }
+
+ // Shorthand for token.type.label, so we don't have to repeatedly access
+ // properties.
+ const ttl = token.type.label;
+
+ if (ttl == "eof") {
+ if (!this.#addedNewline) {
+ this.#write("\n");
+ }
+ return;
+ }
+
+ if (belongsOnStack(token)) {
+ let stackEntry;
+
+ if (isArrayLiteral(token, this.#previousToken)) {
+ // Don't add new lines for empty array literals
+ stackEntry = nextToken?.type?.label === "]" ? "[" : "[\n";
+ } else if (isObjectLiteral(token, this.#previousToken)) {
+ // Don't add new lines for empty object literals
+ stackEntry = nextToken?.type?.label === "}" ? "{" : "{\n";
+ } else if (
+ isRoundBracketStartingLongParenthesis(
+ token,
+ this.#tokenQueue,
+ this.#currentTokenIndex
+ )
+ ) {
+ stackEntry = "(\n";
+ } else if (ttl == "{") {
+ // We need to add a line break for "{" which are not empty object literals
+ stackEntry = "{\n";
+ } else {
+ stackEntry = ttl || ttk;
+ }
+
+ this.#stack.push(stackEntry);
+ }
+
+ this.#maybeDecrementIndent(token);
+ this.#prependWhiteSpace(token);
+ this.#writeToken(token);
+ this.#addedSpace = false;
+
+ // If the next token is going to be a comment starting on the same line,
+ // then no need to add a new line here
+ if (
+ !nextToken ||
+ !nextToken.comment ||
+ token.loc.end.line != nextToken.loc.start.line
+ ) {
+ this.#maybeAppendNewline(token);
+ }
+
+ this.#maybePopStack(token);
+ this.#maybeIncrementIndent(token);
+ }
+
+ /**
+ * Returns true if the given token should cause us to pop the stack.
+ */
+ #maybePopStack(token) {
+ const ttl = token.type.label;
+ const ttk = token.type.keyword;
+ const top = this.#stack.at(-1);
+
+ if (
+ ttl == "]" ||
+ ttl == ")" ||
+ ttl == "}" ||
+ (ttl == ":" && (top == "case" || top == "default" || top == "?")) ||
+ (ttk == "while" && top == "do")
+ ) {
+ this.#stack.pop();
+ if (ttl == "}" && this.#stack.at(-1) == "switch") {
+ this.#stack.pop();
+ }
+ }
+ }
+
+ #maybeIncrementIndent(token) {
+ if (
+ // Don't increment indent for empty object literals
+ (token.type.label == "{" && this.#stack.at(-1) === "{\n") ||
+ // Don't increment indent for empty array literals
+ (token.type.label == "[" && this.#stack.at(-1) === "[\n") ||
+ token.type.keyword == "switch" ||
+ (token.type.label == "(" && this.#stack.at(-1) === "(\n")
+ ) {
+ this.#indentLevel++;
+ }
+ }
+
+ #shouldDecrementIndent(token) {
+ const top = this.#stack.at(-1);
+ const ttl = token.type.label;
+ return (
+ (ttl == "}" && top == "{\n") ||
+ (ttl == "]" && top == "[\n") ||
+ (ttl == ")" && top == "(\n")
+ );
+ }
+
+ #maybeDecrementIndent(token) {
+ if (!this.#shouldDecrementIndent(token)) {
+ return;
+ }
+
+ const ttl = token.type.label;
+ this.#indentLevel--;
+ if (ttl == "}" && this.#stack.at(-2) == "switch") {
+ this.#indentLevel--;
+ }
+ }
+
+ /**
+ * Add a comment to the pretty printed code.
+ *
+ * @param Number indentLevel
+ * The number of indents deep we are (might be different from this.#indentLevel).
+ * @param Boolean block
+ * True if the comment is a multiline block style comment.
+ * @param String text
+ * The text of the comment.
+ * @param Number line
+ * The line number to comment appeared on.
+ * @param Object nextToken
+ * The next token if any.
+ */
+ #addComment(indentLevel, block, text, line, nextToken) {
+ const indentString = this.#indentChar.repeat(indentLevel);
+ const needNewLineAfter =
+ !block || !(nextToken && nextToken.loc.start.line == line);
+
+ if (block) {
+ const commentLinesText = text
+ .split(new RegExp(`/\n${indentString}/`, "g"))
+ .join(`\n${indentString}`);
+
+ this.#write(
+ `${indentString}/*${commentLinesText}*/${needNewLineAfter ? "\n" : " "}`
+ );
+ } else {
+ this.#write(`${indentString}//${text}\n`);
+ }
+
+ this.#addedNewline = needNewLineAfter;
+ this.#addedSpace = !needNewLineAfter;
+ }
+
+ /**
+ * Add the required whitespace before this token, whether that is a single
+ * space, newline, and/or the indent on fresh lines.
+ *
+ * @param Object token
+ * The token we are about to add to the pretty printed code.
+ */
+ #prependWhiteSpace(token) {
+ const ttk = token.type.keyword;
+ const ttl = token.type.label;
+ let newlineAdded = this.#addedNewline;
+ let spaceAdded = this.#addedSpace;
+ const ltt = this.#previousToken?.type?.label;
+
+ // Handle whitespace and newlines after "}" here instead of in
+ // `isLineDelimiter` because it is only a line delimiter some of the
+ // time. For example, we don't want to put "else if" on a new line after
+ // the first if's block.
+ if (this.#previousToken && ltt == "}") {
+ if (
+ (ttk == "while" && this.#stack.at(-1) == "do") ||
+ needsSpaceBeforeClosingCurlyBracket(ttk)
+ ) {
+ this.#write(" ");
+ spaceAdded = true;
+ } else if (needsLineBreakBeforeClosingCurlyBracket(ttl)) {
+ this.#write("\n");
+ newlineAdded = true;
+ }
+ }
+
+ if (
+ (ttl == ":" && this.#stack.at(-1) == "?") ||
+ (ttl == "}" && this.#stack.at(-1) == "${")
+ ) {
+ this.#write(" ");
+ spaceAdded = true;
+ }
+
+ if (this.#previousToken && ltt != "}" && ltt != "." && ttk == "else") {
+ this.#write(" ");
+ spaceAdded = true;
+ }
+
+ const ensureNewline = () => {
+ if (!newlineAdded) {
+ this.#write("\n");
+ newlineAdded = true;
+ }
+ };
+
+ if (isASI(token, this.#previousToken)) {
+ ensureNewline();
+ }
+
+ if (this.#shouldDecrementIndent(token)) {
+ ensureNewline();
+ }
+
+ if (newlineAdded) {
+ let indentLevel = this.#indentLevel;
+ if (ttk == "case" || ttk == "default") {
+ indentLevel--;
+ }
+ this.#write(this.#indentChar.repeat(indentLevel));
+ } else if (!spaceAdded && needsSpaceAfter(token, this.#previousToken)) {
+ this.#write(" ");
+ spaceAdded = true;
+ }
+ }
+
+ /**
+ * Append the necessary whitespace to the result after we have added the given
+ * token.
+ *
+ * @param Object token
+ * The token that was just added to the result.
+ */
+ #maybeAppendNewline(token) {
+ if (!isLineDelimiter(token, this.#stack)) {
+ this.#addedNewline = false;
+ return;
+ }
+
+ this.#write("\n");
+ this.#addedNewline = true;
+ }
+}
+
+/**
+ * Determines if we think that the given token starts an array literal.
+ *
+ * @param Object token
+ * The token we want to determine if it is an array literal.
+ * @param Object previousToken
+ * The previous token we added to the pretty printed results.
+ *
+ * @returns Boolean
+ * True if we believe it is an array literal, false otherwise.
+ */
+function isArrayLiteral(token, previousToken) {
+ if (token.type.label != "[") {
+ return false;
+ }
+ if (!previousToken) {
+ return true;
+ }
+ if (previousToken.type.isAssign) {
+ return true;
+ }
+
+ return PRE_ARRAY_LITERAL_TOKENS.has(
+ previousToken.type.keyword ||
+ // Some tokens ('of', 'yield', …) have a `token.type.keyword` of 'name' and their
+ // actual value in `token.value`
+ (previousToken.type.label == "name"
+ ? previousToken.value
+ : previousToken.type.label)
+ );
+}
+
+/**
+ * Determines if we think that the given token starts an object literal.
+ *
+ * @param Object token
+ * The token we want to determine if it is an object literal.
+ * @param Object previousToken
+ * The previous token we added to the pretty printed results.
+ *
+ * @returns Boolean
+ * True if we believe it is an object literal, false otherwise.
+ */
+function isObjectLiteral(token, previousToken) {
+ if (token.type.label != "{") {
+ return false;
+ }
+ if (!previousToken) {
+ return false;
+ }
+ if (previousToken.type.isAssign) {
+ return true;
+ }
+ return PRE_OBJECT_LITERAL_TOKENS.has(
+ previousToken.type.keyword || previousToken.type.label
+ );
+}
+
+/**
+ * Determines if we think that the given token starts a long parenthesis
+ *
+ * @param {Object} token
+ * The token we want to determine if it is the beginning of a long paren.
+ * @param {Array<Object>} tokenQueue
+ * The whole list of tokens parsed by acorn
+ * @param {Integer} currentTokenIndex
+ * The index of `token` in `tokenQueue`
+ * @returns
+ */
+function isRoundBracketStartingLongParenthesis(
+ token,
+ tokenQueue,
+ currentTokenIndex
+) {
+ if (token.type.label !== "(") {
+ return false;
+ }
+
+ // If we're just wrapping an object, we'll have a new line right after
+ if (tokenQueue[currentTokenIndex + 1].type.label == "{") {
+ return false;
+ }
+
+ // We're going to iterate through the following tokens until :
+ // - we find the closing parent
+ // - or we reached the maximum character we think should be in parenthesis
+ const longParentContentLength = 60;
+
+ // Keep track of other parens so we know when we get the closing one for `token`
+ let parenCount = 0;
+ let parenContentLength = 0;
+ for (let i = currentTokenIndex + 1, len = tokenQueue.length; i < len; i++) {
+ const currToken = tokenQueue[i];
+ const ttl = currToken.type.label;
+
+ if (ttl == "(") {
+ parenCount++;
+ } else if (ttl == ")") {
+ if (parenCount == 0) {
+ // Matching closing paren, if we got here, we didn't reach the length limit,
+ // as we return when parenContentLength is greater than the limit.
+ return false;
+ }
+ parenCount--;
+ }
+
+ // Aside block comments, all tokens start and end location are on the same line, so
+ // we can use `start` and `end` to deduce the token length.
+ const tokenLength = currToken.comment
+ ? currToken.text.length
+ : currToken.end - currToken.start;
+ parenContentLength += tokenLength;
+
+ // If we didn't find the matching closing paren yet and the characters from the
+ // tokens we evaluated so far are longer than the limit, so consider the token
+ // a long paren.
+ if (parenContentLength > longParentContentLength) {
+ return true;
+ }
+ }
+
+ // if we get to here, we didn't found a closing paren, which shouldn't happen
+ // (scripts with syntax error are not displayed in the debugger), but just to
+ // be safe, return false.
+ return false;
+}
+
+// If any of these tokens are followed by a token on a new line, we know that
+// ASI cannot happen.
+const PREVENT_ASI_AFTER_TOKENS = new Set([
+ // Binary operators
+ "*",
+ "/",
+ "%",
+ "+",
+ "-",
+ "<<",
+ ">>",
+ ">>>",
+ "<",
+ ">",
+ "<=",
+ ">=",
+ "instanceof",
+ "in",
+ "==",
+ "!=",
+ "===",
+ "!==",
+ "&",
+ "^",
+ "|",
+ "&&",
+ "||",
+ ",",
+ ".",
+ "=",
+ "*=",
+ "/=",
+ "%=",
+ "+=",
+ "-=",
+ "<<=",
+ ">>=",
+ ">>>=",
+ "&=",
+ "^=",
+ "|=",
+ // Unary operators
+ "delete",
+ "void",
+ "typeof",
+ "~",
+ "!",
+ "new",
+ // Function calls and grouped expressions
+ "(",
+]);
+
+// If any of these tokens are on a line after the token before it, we know
+// that ASI cannot happen.
+const PREVENT_ASI_BEFORE_TOKENS = new Set([
+ // Binary operators
+ "*",
+ "/",
+ "%",
+ "<<",
+ ">>",
+ ">>>",
+ "<",
+ ">",
+ "<=",
+ ">=",
+ "instanceof",
+ "in",
+ "==",
+ "!=",
+ "===",
+ "!==",
+ "&",
+ "^",
+ "|",
+ "&&",
+ "||",
+ ",",
+ ".",
+ "=",
+ "*=",
+ "/=",
+ "%=",
+ "+=",
+ "-=",
+ "<<=",
+ ">>=",
+ ">>>=",
+ "&=",
+ "^=",
+ "|=",
+ // Function calls
+ "(",
+]);
+
+/**
+ * Determine if a token can look like an identifier. More precisely,
+ * this determines if the token may end or start with a character from
+ * [A-Za-z0-9_].
+ *
+ * @param Object token
+ * The token we are looking at.
+ *
+ * @returns Boolean
+ * True if identifier-like.
+ */
+function isIdentifierLike(token) {
+ const ttl = token.type.label;
+ return (
+ ttl == "name" || ttl == "num" || ttl == "privateId" || !!token.type.keyword
+ );
+}
+
+/**
+ * Determines if Automatic Semicolon Insertion (ASI) occurs between these
+ * tokens.
+ *
+ * @param Object token
+ * The current token.
+ * @param Object previousToken
+ * The previous token we added to the pretty printed results.
+ *
+ * @returns Boolean
+ * True if we believe ASI occurs.
+ */
+function isASI(token, previousToken) {
+ if (!previousToken) {
+ return false;
+ }
+ if (token.loc.start.line === previousToken.loc.start.line) {
+ return false;
+ }
+ if (
+ previousToken.type.keyword == "return" ||
+ previousToken.type.keyword == "yield" ||
+ (previousToken.type.label == "name" && previousToken.value == "yield")
+ ) {
+ return true;
+ }
+ if (
+ PREVENT_ASI_AFTER_TOKENS.has(
+ previousToken.type.label || previousToken.type.keyword
+ )
+ ) {
+ return false;
+ }
+ if (PREVENT_ASI_BEFORE_TOKENS.has(token.type.label || token.type.keyword)) {
+ return false;
+ }
+ return true;
+}
+
+/**
+ * Determine if we should add a newline after the given token.
+ *
+ * @param Object token
+ * The token we are looking at.
+ * @param Array stack
+ * The stack of open parens/curlies/brackets/etc.
+ *
+ * @returns Boolean
+ * True if we should add a newline.
+ */
+function isLineDelimiter(token, stack) {
+ const ttl = token.type.label;
+ const top = stack.at(-1);
+ return (
+ (ttl == ";" && top != "(") ||
+ // Don't add a new line for empty object literals
+ (ttl == "{" && top == "{\n") ||
+ // Don't add a new line for empty array literals
+ (ttl == "[" && top == "[\n") ||
+ ((ttl == "," || ttl == "||" || ttl == "&&") && top != "(") ||
+ (ttl == ":" && (top == "case" || top == "default")) ||
+ (ttl == "(" && top == "(\n")
+ );
+}
+
+/**
+ * Determines if we need to add a space after the token we are about to add.
+ *
+ * @param Object token
+ * The token we are about to add to the pretty printed code.
+ * @param Object [previousToken]
+ * Optional previous token added to the pretty printed code.
+ */
+function needsSpaceAfter(token, previousToken) {
+ if (previousToken && needsSpaceBetweenTokens(token, previousToken)) {
+ return true;
+ }
+
+ if (token.type.isAssign) {
+ return true;
+ }
+ if (token.type.binop != null && previousToken) {
+ return true;
+ }
+ if (token.type.label == "?") {
+ return true;
+ }
+ if (token.type.label == "=>") {
+ return true;
+ }
+
+ return false;
+}
+
+function needsSpaceBeforePreviousToken(previousToken) {
+ if (previousToken.type.isLoop) {
+ return true;
+ }
+ if (previousToken.type.isAssign) {
+ return true;
+ }
+ if (previousToken.type.binop != null) {
+ return true;
+ }
+ if (previousToken.value == "of") {
+ return true;
+ }
+
+ const previousTokenTypeLabel = previousToken.type.label;
+ if (previousTokenTypeLabel == "?") {
+ return true;
+ }
+ if (previousTokenTypeLabel == ":") {
+ return true;
+ }
+ if (previousTokenTypeLabel == ",") {
+ return true;
+ }
+ if (previousTokenTypeLabel == ";") {
+ return true;
+ }
+ if (previousTokenTypeLabel == "${") {
+ return true;
+ }
+ if (previousTokenTypeLabel == "=>") {
+ return true;
+ }
+ return false;
+}
+
+function isBreakContinueOrReturnStatement(previousTokenKeyword) {
+ return (
+ previousTokenKeyword == "break" ||
+ previousTokenKeyword == "continue" ||
+ previousTokenKeyword == "return"
+ );
+}
+
+function needsSpaceBeforePreviousTokenKeywordAfterNotDot(previousTokenKeyword) {
+ return (
+ previousTokenKeyword != "debugger" &&
+ previousTokenKeyword != "null" &&
+ previousTokenKeyword != "true" &&
+ previousTokenKeyword != "false" &&
+ previousTokenKeyword != "this" &&
+ previousTokenKeyword != "default"
+ );
+}
+
+function needsSpaceBeforeClosingParen(tokenTypeLabel) {
+ return (
+ tokenTypeLabel != ")" &&
+ tokenTypeLabel != "]" &&
+ tokenTypeLabel != ";" &&
+ tokenTypeLabel != "," &&
+ tokenTypeLabel != "."
+ );
+}
+
+/**
+ * Determines if we need to add a space between the previous token we added and
+ * the token we are about to add.
+ *
+ * @param Object token
+ * The token we are about to add to the pretty printed code.
+ * @param Object previousToken
+ * The previous token added to the pretty printed code.
+ */
+function needsSpaceBetweenTokens(token, previousToken) {
+ if (needsSpaceBeforePreviousToken(previousToken)) {
+ return true;
+ }
+
+ const ltt = previousToken.type.label;
+ if (ltt == "num" && token.type.label == ".") {
+ return true;
+ }
+
+ const ltk = previousToken.type.keyword;
+ const ttl = token.type.label;
+ if (ltk != null && ttl != ".") {
+ if (isBreakContinueOrReturnStatement(ltk)) {
+ return ttl != ";";
+ }
+ if (needsSpaceBeforePreviousTokenKeywordAfterNotDot(ltk)) {
+ return true;
+ }
+ }
+
+ if (ltt == ")" && needsSpaceBeforeClosingParen(ttl)) {
+ return true;
+ }
+
+ if (isIdentifierLike(token) && isIdentifierLike(previousToken)) {
+ // We must emit a space to avoid merging the tokens.
+ return true;
+ }
+
+ if (token.type.label == "{" && previousToken.type.label == "name") {
+ return true;
+ }
+
+ return false;
+}
+
+function needsSpaceBeforeClosingCurlyBracket(tokenTypeKeyword) {
+ return (
+ tokenTypeKeyword == "else" ||
+ tokenTypeKeyword == "catch" ||
+ tokenTypeKeyword == "finally"
+ );
+}
+
+function needsLineBreakBeforeClosingCurlyBracket(tokenTypeLabel) {
+ return (
+ tokenTypeLabel != "(" &&
+ tokenTypeLabel != ";" &&
+ tokenTypeLabel != "," &&
+ tokenTypeLabel != ")" &&
+ tokenTypeLabel != "." &&
+ tokenTypeLabel != "template" &&
+ tokenTypeLabel != "`"
+ );
+}
+
+const escapeCharacters = {
+ // Backslash
+ "\\": "\\\\",
+ // Newlines
+ "\n": "\\n",
+ // Carriage return
+ "\r": "\\r",
+ // Tab
+ "\t": "\\t",
+ // Vertical tab
+ "\v": "\\v",
+ // Form feed
+ "\f": "\\f",
+ // Null character
+ "\0": "\\x00",
+ // Line separator
+ "\u2028": "\\u2028",
+ // Paragraph separator
+ "\u2029": "\\u2029",
+ // Single quotes
+ "'": "\\'",
+};
+
+// eslint-disable-next-line prefer-template
+const regExpString = "(" + Object.values(escapeCharacters).join("|") + ")";
+const escapeCharactersRegExp = new RegExp(regExpString, "g");
+
+function sanitizerReplaceFunc(_, c) {
+ return escapeCharacters[c];
+}
+
+/**
+ * Make sure that we output the escaped character combination inside string
+ * literals instead of various problematic characters.
+ */
+function sanitize(str) {
+ return str.replace(escapeCharactersRegExp, sanitizerReplaceFunc);
+}
+
+/**
+ * Returns true if the given token type belongs on the stack.
+ */
+function belongsOnStack(token) {
+ const ttl = token.type.label;
+ const ttk = token.type.keyword;
+ return (
+ ttl == "{" ||
+ ttl == "(" ||
+ ttl == "[" ||
+ ttl == "?" ||
+ ttl == "${" ||
+ ttk == "do" ||
+ ttk == "switch" ||
+ ttk == "case" ||
+ ttk == "default"
+ );
+}
diff --git a/devtools/client/debugger/src/workers/pretty-print/tests/__snapshots__/prettyFast.spec.js.snap b/devtools/client/debugger/src/workers/pretty-print/tests/__snapshots__/prettyFast.spec.js.snap
new file mode 100644
index 0000000000..498bee267e
--- /dev/null
+++ b/devtools/client/debugger/src/workers/pretty-print/tests/__snapshots__/prettyFast.spec.js.snap
@@ -0,0 +1,1974 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`ASI return 1`] = `
+"function f() {
+ return
+ {
+ }
+}
+"
+`;
+
+exports[`ASI return 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 9) -> (1, 9)",
+ "(1, 10) -> (1, 10)",
+ "(1, 11) -> (1, 11)",
+ "(1, 13) -> (1, 13)",
+ "(2, 2) -> (2, 13)",
+ "(3, 2) -> (3, 13)",
+ "(4, 2) -> (3, 14)",
+ "(5, 0) -> (4, 11)",
+]
+`;
+
+exports[`Arrays 1`] = `
+"var a = [
+ 1,
+ 2,
+ 3
+];
+"
+`;
+
+exports[`Arrays 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 4) -> (1, 4)",
+ "(1, 6) -> (1, 5)",
+ "(1, 8) -> (1, 6)",
+ "(2, 2) -> (1, 7)",
+ "(2, 3) -> (1, 8)",
+ "(3, 2) -> (1, 9)",
+ "(3, 3) -> (1, 10)",
+ "(4, 2) -> (1, 11)",
+ "(5, 0) -> (1, 12)",
+ "(5, 1) -> (1, 13)",
+]
+`;
+
+exports[`Arrays and spread operator 1`] = `
+"var a = [
+ 1,
+ ...[
+ 2,
+ 3
+ ],
+ ...[],
+ 4
+];
+"
+`;
+
+exports[`Arrays and spread operator 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 4) -> (1, 4)",
+ "(1, 6) -> (1, 5)",
+ "(1, 8) -> (1, 6)",
+ "(2, 2) -> (1, 7)",
+ "(2, 3) -> (1, 8)",
+ "(3, 2) -> (1, 9)",
+ "(3, 5) -> (1, 12)",
+ "(4, 4) -> (1, 13)",
+ "(4, 5) -> (1, 14)",
+ "(5, 4) -> (1, 15)",
+ "(6, 2) -> (1, 16)",
+ "(6, 3) -> (1, 17)",
+ "(7, 2) -> (1, 18)",
+ "(7, 5) -> (1, 21)",
+ "(7, 6) -> (1, 22)",
+ "(7, 7) -> (1, 23)",
+ "(8, 2) -> (1, 25)",
+ "(9, 0) -> (1, 26)",
+ "(9, 1) -> (1, 27)",
+]
+`;
+
+exports[`Binary operators 1`] = `
+"var a = 5 * 30;
+var b = 5 >> 3;
+"
+`;
+
+exports[`Binary operators 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 4) -> (1, 4)",
+ "(1, 6) -> (1, 5)",
+ "(1, 8) -> (1, 6)",
+ "(1, 10) -> (1, 7)",
+ "(1, 12) -> (1, 8)",
+ "(1, 14) -> (1, 10)",
+ "(2, 0) -> (1, 11)",
+ "(2, 4) -> (1, 15)",
+ "(2, 6) -> (1, 16)",
+ "(2, 8) -> (1, 17)",
+ "(2, 10) -> (1, 18)",
+ "(2, 13) -> (1, 20)",
+ "(2, 14) -> (1, 21)",
+]
+`;
+
+exports[`Bug 975477 don't move end of line comments to next line 1`] = `
+"switch (request.action) {
+ case 'show': //$NON-NLS-0$
+ if (localStorage.hideicon !== 'true') { //$NON-NLS-0$
+ chrome.pageAction.show(sender.tab.id);
+ }
+ break;
+ case 'hide': /*Multiline
+ Comment */
+ break;
+ default:
+ console.warn('unknown request'); //$NON-NLS-0$
+ // don't respond if you don't understand the message.
+ return;
+}
+"
+`;
+
+exports[`Bug 975477 don't move end of line comments to next line 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 7) -> (1, 7)",
+ "(1, 8) -> (1, 8)",
+ "(1, 15) -> (1, 15)",
+ "(1, 16) -> (1, 16)",
+ "(1, 22) -> (1, 22)",
+ "(1, 24) -> (1, 24)",
+ "(2, 2) -> (2, 13)",
+ "(2, 7) -> (2, 18)",
+ "(2, 13) -> (2, 24)",
+ "(3, 4) -> (3, 15)",
+ "(3, 7) -> (3, 18)",
+ "(3, 8) -> (3, 19)",
+ "(3, 20) -> (3, 31)",
+ "(3, 21) -> (3, 32)",
+ "(3, 30) -> (3, 41)",
+ "(3, 34) -> (3, 45)",
+ "(3, 40) -> (3, 51)",
+ "(3, 42) -> (3, 53)",
+ "(4, 6) -> (4, 17)",
+ "(4, 12) -> (4, 23)",
+ "(4, 13) -> (4, 24)",
+ "(4, 23) -> (4, 34)",
+ "(4, 24) -> (4, 35)",
+ "(4, 28) -> (4, 39)",
+ "(4, 29) -> (4, 40)",
+ "(4, 35) -> (4, 46)",
+ "(4, 36) -> (4, 47)",
+ "(4, 39) -> (4, 50)",
+ "(4, 40) -> (4, 51)",
+ "(4, 42) -> (4, 53)",
+ "(4, 43) -> (4, 54)",
+ "(5, 4) -> (5, 15)",
+ "(6, 4) -> (6, 15)",
+ "(6, 9) -> (6, 20)",
+ "(7, 2) -> (7, 13)",
+ "(7, 7) -> (7, 18)",
+ "(7, 13) -> (7, 24)",
+ "(9, 4) -> (9, 15)",
+ "(9, 9) -> (9, 20)",
+ "(10, 2) -> (10, 13)",
+ "(10, 9) -> (10, 20)",
+ "(11, 4) -> (11, 15)",
+ "(11, 11) -> (11, 22)",
+ "(11, 12) -> (11, 23)",
+ "(11, 16) -> (11, 27)",
+ "(11, 17) -> (11, 28)",
+ "(11, 34) -> (11, 45)",
+ "(11, 35) -> (11, 46)",
+ "(13, 4) -> (13, 15)",
+ "(13, 10) -> (13, 21)",
+ "(14, 0) -> (14, 11)",
+]
+`;
+
+exports[`Bug 977082 - space between grouping operator and dot notation 1`] = `
+"JSON.stringify(3).length;
+([1,
+2,
+3]).length;
+(new Date()).toLocaleString();
+"
+`;
+
+exports[`Bug 977082 - space between grouping operator and dot notation 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 4) -> (1, 4)",
+ "(1, 5) -> (1, 5)",
+ "(1, 14) -> (1, 14)",
+ "(1, 15) -> (1, 15)",
+ "(1, 16) -> (1, 16)",
+ "(1, 17) -> (1, 17)",
+ "(1, 18) -> (1, 18)",
+ "(1, 24) -> (1, 24)",
+ "(2, 0) -> (2, 11)",
+ "(2, 1) -> (2, 12)",
+ "(2, 2) -> (2, 13)",
+ "(2, 3) -> (2, 14)",
+ "(3, 0) -> (2, 15)",
+ "(3, 1) -> (2, 16)",
+ "(4, 0) -> (2, 17)",
+ "(4, 1) -> (2, 18)",
+ "(4, 2) -> (2, 19)",
+ "(4, 3) -> (2, 20)",
+ "(4, 4) -> (2, 21)",
+ "(4, 10) -> (2, 27)",
+ "(5, 0) -> (3, 11)",
+ "(5, 1) -> (3, 12)",
+ "(5, 5) -> (3, 16)",
+ "(5, 9) -> (3, 20)",
+ "(5, 10) -> (3, 21)",
+ "(5, 11) -> (3, 22)",
+ "(5, 12) -> (3, 23)",
+ "(5, 13) -> (3, 24)",
+ "(5, 27) -> (3, 38)",
+ "(5, 28) -> (3, 39)",
+ "(5, 29) -> (3, 40)",
+]
+`;
+
+exports[`Bug 1206633 - spaces in for of 1`] = `
+"for (let tab of tabs) {
+}
+"
+`;
+
+exports[`Bug 1206633 - spaces in for of 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 4) -> (1, 4)",
+ "(1, 5) -> (1, 5)",
+ "(1, 9) -> (1, 9)",
+ "(1, 13) -> (1, 13)",
+ "(1, 16) -> (1, 16)",
+ "(1, 20) -> (1, 20)",
+ "(1, 22) -> (1, 22)",
+ "(2, 0) -> (1, 23)",
+]
+`;
+
+exports[`Bug 1261971 - indentation after switch statement 1`] = `
+"{
+ switch (x) {
+ }
+ if (y) {
+ }
+ done();
+}
+"
+`;
+
+exports[`Bug 1261971 - indentation after switch statement 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(2, 2) -> (1, 1)",
+ "(2, 9) -> (1, 7)",
+ "(2, 10) -> (1, 8)",
+ "(2, 11) -> (1, 9)",
+ "(2, 13) -> (1, 10)",
+ "(3, 2) -> (1, 11)",
+ "(4, 2) -> (1, 12)",
+ "(4, 5) -> (1, 14)",
+ "(4, 6) -> (1, 15)",
+ "(4, 7) -> (1, 16)",
+ "(4, 9) -> (1, 17)",
+ "(5, 2) -> (1, 18)",
+ "(6, 2) -> (1, 19)",
+ "(6, 6) -> (1, 23)",
+ "(6, 7) -> (1, 24)",
+ "(6, 8) -> (1, 25)",
+ "(7, 0) -> (1, 26)",
+]
+`;
+
+exports[`Bug pretty-sure-3 - escaping line and paragraph separators 1`] = `
+"x = '\\\\u2029\\\\u2028';
+"
+`;
+
+exports[`Bug pretty-sure-3 - escaping line and paragraph separators 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 2) -> (1, 2)",
+ "(1, 4) -> (1, 4)",
+ "(1, 18) -> (1, 18)",
+]
+`;
+
+exports[`Bug pretty-sure-4 - escaping null character before digit 1`] = `
+"x = '\\\\x001';
+"
+`;
+
+exports[`Bug pretty-sure-4 - escaping null character before digit 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 2) -> (1, 2)",
+ "(1, 4) -> (1, 4)",
+ "(1, 11) -> (1, 13)",
+]
+`;
+
+exports[`Bug pretty-sure-5 - empty multiline comment shouldn't throw exception 1`] = `
+"{
+ /*
+ */
+ return;
+}
+"
+`;
+
+exports[`Bug pretty-sure-5 - empty multiline comment shouldn't throw exception 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(4, 2) -> (4, 13)",
+ "(4, 8) -> (4, 19)",
+ "(5, 0) -> (5, 11)",
+]
+`;
+
+exports[`Bug pretty-sure-6 - inline comment shouldn't move parenthesis to next line 1`] = `
+"return /* inline comment */ (1 + 1);
+"
+`;
+
+exports[`Bug pretty-sure-6 - inline comment shouldn't move parenthesis to next line 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 28) -> (1, 28)",
+ "(1, 29) -> (2, 13)",
+ "(1, 31) -> (2, 14)",
+ "(1, 33) -> (2, 15)",
+ "(1, 34) -> (2, 16)",
+ "(1, 35) -> (2, 17)",
+]
+`;
+
+exports[`Bug pretty-sure-7 - accessing a literal number property requires a space 1`] = `
+"0 .toString() + x.toString();
+"
+`;
+
+exports[`Bug pretty-sure-7 - accessing a literal number property requires a space 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 2) -> (1, 2)",
+ "(1, 3) -> (1, 3)",
+ "(1, 11) -> (1, 11)",
+ "(1, 12) -> (1, 12)",
+ "(1, 14) -> (1, 13)",
+ "(1, 16) -> (1, 14)",
+ "(1, 17) -> (1, 15)",
+ "(1, 18) -> (1, 16)",
+ "(1, 26) -> (1, 24)",
+ "(1, 27) -> (1, 25)",
+ "(1, 28) -> (1, 26)",
+]
+`;
+
+exports[`Bug pretty-sure-8 - return and yield only accept arguments when on the same line 1`] = `
+"{
+ return
+ (x)
+ yield
+ (x)
+ yield
+ * x
+}
+"
+`;
+
+exports[`Bug pretty-sure-8 - return and yield only accept arguments when on the same line 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(2, 2) -> (2, 13)",
+ "(3, 2) -> (3, 13)",
+ "(3, 3) -> (3, 14)",
+ "(3, 4) -> (3, 15)",
+ "(4, 2) -> (4, 13)",
+ "(5, 2) -> (5, 13)",
+ "(5, 3) -> (5, 14)",
+ "(5, 4) -> (5, 15)",
+ "(6, 2) -> (6, 13)",
+ "(7, 2) -> (7, 13)",
+ "(7, 4) -> (7, 14)",
+ "(8, 0) -> (8, 11)",
+]
+`;
+
+exports[`Bug pretty-sure-9 - accept unary operator at start of file 1`] = `
+"+ 0
+"
+`;
+
+exports[`Bug pretty-sure-9 - accept unary operator at start of file 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 2) -> (1, 2)",
+]
+`;
+
+exports[`Class extension within a function 1`] = `
+"(function () {
+ class X extends Y {
+ constructor() {
+ }
+ }
+}) ()
+"
+`;
+
+exports[`Class extension within a function 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 1) -> (1, 1)",
+ "(1, 10) -> (1, 9)",
+ "(1, 11) -> (1, 10)",
+ "(1, 13) -> (1, 12)",
+ "(2, 2) -> (1, 15)",
+ "(2, 8) -> (1, 21)",
+ "(2, 10) -> (1, 23)",
+ "(2, 18) -> (1, 31)",
+ "(2, 20) -> (1, 33)",
+ "(3, 4) -> (1, 35)",
+ "(3, 15) -> (1, 46)",
+ "(3, 16) -> (1, 47)",
+ "(3, 18) -> (1, 49)",
+ "(4, 4) -> (1, 50)",
+ "(5, 2) -> (1, 52)",
+ "(6, 0) -> (1, 55)",
+ "(6, 1) -> (1, 56)",
+ "(6, 3) -> (1, 57)",
+ "(6, 4) -> (1, 58)",
+]
+`;
+
+exports[`Class handling 1`] = `
+"class Class {
+ constructor() {
+ }
+}
+"
+`;
+
+exports[`Class handling 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 6) -> (1, 7)",
+ "(1, 12) -> (1, 12)",
+ "(2, 2) -> (1, 13)",
+ "(2, 13) -> (1, 24)",
+ "(2, 14) -> (1, 25)",
+ "(2, 16) -> (1, 26)",
+ "(3, 2) -> (1, 27)",
+ "(4, 0) -> (1, 28)",
+]
+`;
+
+exports[`Code that relies on ASI 1`] = `
+"var foo = 10
+var bar = 20
+function g() {
+ a()
+ b()
+}
+"
+`;
+
+exports[`Code that relies on ASI 2`] = `
+Array [
+ "(1, 0) -> (2, 11)",
+ "(1, 4) -> (2, 15)",
+ "(1, 8) -> (2, 19)",
+ "(1, 10) -> (2, 21)",
+ "(2, 0) -> (3, 11)",
+ "(2, 4) -> (3, 15)",
+ "(2, 8) -> (3, 19)",
+ "(2, 10) -> (3, 21)",
+ "(3, 0) -> (4, 11)",
+ "(3, 9) -> (4, 20)",
+ "(3, 10) -> (4, 21)",
+ "(3, 11) -> (4, 22)",
+ "(3, 13) -> (4, 24)",
+ "(4, 2) -> (5, 13)",
+ "(4, 3) -> (5, 14)",
+ "(4, 4) -> (5, 15)",
+ "(5, 2) -> (6, 13)",
+ "(5, 3) -> (6, 14)",
+ "(5, 4) -> (6, 15)",
+ "(6, 0) -> (7, 11)",
+]
+`;
+
+exports[`Const handling 1`] = `
+"const d = 'yes';
+"
+`;
+
+exports[`Const handling 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 6) -> (1, 6)",
+ "(1, 8) -> (1, 8)",
+ "(1, 10) -> (1, 10)",
+ "(1, 15) -> (1, 15)",
+]
+`;
+
+exports[`Continue/break statements 1`] = `
+"while (1) {
+ if (x) {
+ continue
+ }
+ if (y) {
+ break
+ }
+ if (z) {
+ break foo
+ }
+}
+"
+`;
+
+exports[`Continue/break statements 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 6) -> (1, 5)",
+ "(1, 7) -> (1, 6)",
+ "(1, 8) -> (1, 7)",
+ "(1, 10) -> (1, 8)",
+ "(2, 2) -> (1, 9)",
+ "(2, 5) -> (1, 11)",
+ "(2, 6) -> (1, 12)",
+ "(2, 7) -> (1, 13)",
+ "(2, 9) -> (1, 14)",
+ "(3, 4) -> (1, 15)",
+ "(4, 2) -> (1, 23)",
+ "(5, 2) -> (1, 24)",
+ "(5, 5) -> (1, 26)",
+ "(5, 6) -> (1, 27)",
+ "(5, 7) -> (1, 28)",
+ "(5, 9) -> (1, 29)",
+ "(6, 4) -> (1, 30)",
+ "(7, 2) -> (1, 35)",
+ "(8, 2) -> (1, 36)",
+ "(8, 5) -> (1, 38)",
+ "(8, 6) -> (1, 39)",
+ "(8, 7) -> (1, 40)",
+ "(8, 9) -> (1, 41)",
+ "(9, 4) -> (1, 42)",
+ "(9, 10) -> (1, 48)",
+ "(10, 2) -> (1, 51)",
+ "(11, 0) -> (1, 52)",
+]
+`;
+
+exports[`Delete 1`] = `
+"delete obj.prop;
+"
+`;
+
+exports[`Delete 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 7) -> (1, 7)",
+ "(1, 10) -> (1, 10)",
+ "(1, 11) -> (1, 11)",
+ "(1, 15) -> (1, 15)",
+]
+`;
+
+exports[`Do/while loop 1`] = `
+"do {
+ x
+} while (y)
+"
+`;
+
+exports[`Do/while loop 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 3) -> (1, 2)",
+ "(2, 2) -> (1, 3)",
+ "(3, 0) -> (1, 4)",
+ "(3, 2) -> (1, 5)",
+ "(3, 8) -> (1, 10)",
+ "(3, 9) -> (1, 11)",
+ "(3, 10) -> (1, 12)",
+]
+`;
+
+exports[`Dot handling with keywords which are identifier name 1`] = `
+"y.await.break.const.delete.else.return.new.yield = 1.23;
+"
+`;
+
+exports[`Dot handling with keywords which are identifier name 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 1) -> (1, 1)",
+ "(1, 2) -> (1, 2)",
+ "(1, 7) -> (1, 7)",
+ "(1, 8) -> (1, 8)",
+ "(1, 13) -> (1, 13)",
+ "(1, 14) -> (1, 14)",
+ "(1, 19) -> (1, 19)",
+ "(1, 20) -> (1, 20)",
+ "(1, 26) -> (1, 26)",
+ "(1, 27) -> (1, 27)",
+ "(1, 31) -> (1, 31)",
+ "(1, 32) -> (1, 32)",
+ "(1, 38) -> (1, 38)",
+ "(1, 39) -> (1, 39)",
+ "(1, 42) -> (1, 42)",
+ "(1, 43) -> (1, 43)",
+ "(1, 49) -> (1, 49)",
+ "(1, 51) -> (1, 51)",
+ "(1, 55) -> (1, 55)",
+]
+`;
+
+exports[`Dot handling with let which is identifier name 1`] = `
+"y.let.let = 1.23;
+"
+`;
+
+exports[`Dot handling with let which is identifier name 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 1) -> (1, 1)",
+ "(1, 2) -> (1, 2)",
+ "(1, 5) -> (1, 5)",
+ "(1, 6) -> (1, 6)",
+ "(1, 10) -> (1, 10)",
+ "(1, 12) -> (1, 12)",
+ "(1, 16) -> (1, 16)",
+]
+`;
+
+exports[`Empty object/array literals 1`] = `
+"let a = [];
+const b = {};
+c = {
+ ...{},
+ d: 42
+};
+for (let x of []) {
+ for (let y in {}) {
+ }
+}
+"
+`;
+
+exports[`Empty object/array literals 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 4) -> (1, 4)",
+ "(1, 6) -> (1, 5)",
+ "(1, 8) -> (1, 6)",
+ "(1, 9) -> (1, 7)",
+ "(1, 10) -> (1, 8)",
+ "(2, 0) -> (1, 9)",
+ "(2, 6) -> (1, 15)",
+ "(2, 8) -> (1, 16)",
+ "(2, 10) -> (1, 17)",
+ "(2, 11) -> (1, 18)",
+ "(2, 12) -> (1, 19)",
+ "(3, 0) -> (1, 20)",
+ "(3, 2) -> (1, 21)",
+ "(3, 4) -> (1, 22)",
+ "(4, 2) -> (1, 23)",
+ "(4, 5) -> (1, 26)",
+ "(4, 6) -> (1, 27)",
+ "(4, 7) -> (1, 28)",
+ "(5, 2) -> (1, 29)",
+ "(5, 3) -> (1, 30)",
+ "(5, 5) -> (1, 32)",
+ "(6, 0) -> (1, 34)",
+ "(6, 1) -> (1, 35)",
+ "(7, 0) -> (1, 36)",
+ "(7, 4) -> (1, 39)",
+ "(7, 5) -> (1, 40)",
+ "(7, 9) -> (1, 44)",
+ "(7, 11) -> (1, 46)",
+ "(7, 14) -> (1, 49)",
+ "(7, 15) -> (1, 50)",
+ "(7, 16) -> (1, 51)",
+ "(7, 18) -> (1, 52)",
+ "(8, 2) -> (1, 53)",
+ "(8, 6) -> (1, 56)",
+ "(8, 7) -> (1, 57)",
+ "(8, 11) -> (1, 61)",
+ "(8, 13) -> (1, 63)",
+ "(8, 16) -> (1, 66)",
+ "(8, 17) -> (1, 67)",
+ "(8, 18) -> (1, 68)",
+ "(8, 20) -> (1, 69)",
+ "(9, 2) -> (1, 70)",
+ "(10, 0) -> (1, 71)",
+]
+`;
+
+exports[`Escaping backslashes in strings 1`] = `
+"'\\\\\\\\'
+"
+`;
+
+exports[`Escaping backslashes in strings 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+]
+`;
+
+exports[`Escaping carriage return in strings 1`] = `
+"'\\\\r'
+"
+`;
+
+exports[`Escaping carriage return in strings 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+]
+`;
+
+exports[`Escaping form feed in strings 1`] = `
+"'\\\\f'
+"
+`;
+
+exports[`Escaping form feed in strings 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+]
+`;
+
+exports[`Escaping null character in strings 1`] = `
+"'\\\\x00'
+"
+`;
+
+exports[`Escaping null character in strings 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+]
+`;
+
+exports[`Escaping tab in strings 1`] = `
+"'\\\\t'
+"
+`;
+
+exports[`Escaping tab in strings 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+]
+`;
+
+exports[`Escaping vertical tab in strings 1`] = `
+"'\\\\v'
+"
+`;
+
+exports[`Escaping vertical tab in strings 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+]
+`;
+
+exports[`False assignment 1`] = `
+"var foo = false;
+"
+`;
+
+exports[`False assignment 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 4) -> (1, 4)",
+ "(1, 8) -> (1, 7)",
+ "(1, 10) -> (1, 8)",
+ "(1, 15) -> (1, 13)",
+]
+`;
+
+exports[`Fat arrow function 1`] = `
+"const a = () => 42
+addEventListener('click', e => {
+ return false
+});
+const sum = (c, d) => c + d
+"
+`;
+
+exports[`Fat arrow function 2`] = `
+Array [
+ "(1, 0) -> (2, 6)",
+ "(1, 6) -> (2, 12)",
+ "(1, 8) -> (2, 14)",
+ "(1, 10) -> (2, 16)",
+ "(1, 11) -> (2, 17)",
+ "(1, 13) -> (2, 19)",
+ "(1, 16) -> (2, 22)",
+ "(2, 0) -> (3, 6)",
+ "(2, 16) -> (3, 22)",
+ "(2, 17) -> (3, 23)",
+ "(2, 24) -> (3, 30)",
+ "(2, 26) -> (3, 32)",
+ "(2, 28) -> (3, 34)",
+ "(2, 31) -> (3, 37)",
+ "(3, 2) -> (3, 39)",
+ "(3, 9) -> (3, 46)",
+ "(4, 0) -> (3, 52)",
+ "(4, 1) -> (3, 53)",
+ "(4, 2) -> (3, 54)",
+ "(5, 0) -> (4, 6)",
+ "(5, 6) -> (4, 12)",
+ "(5, 10) -> (4, 16)",
+ "(5, 12) -> (4, 18)",
+ "(5, 13) -> (4, 19)",
+ "(5, 14) -> (4, 20)",
+ "(5, 16) -> (4, 21)",
+ "(5, 17) -> (4, 22)",
+ "(5, 19) -> (4, 24)",
+ "(5, 22) -> (4, 27)",
+ "(5, 24) -> (4, 28)",
+ "(5, 26) -> (4, 29)",
+]
+`;
+
+exports[`For loop 1`] = `
+"for (var i = 0; i < n; i++) {
+ console.log(i);
+}
+"
+`;
+
+exports[`For loop 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 4) -> (1, 4)",
+ "(1, 5) -> (1, 5)",
+ "(1, 9) -> (1, 9)",
+ "(1, 11) -> (1, 11)",
+ "(1, 13) -> (1, 13)",
+ "(1, 14) -> (1, 14)",
+ "(1, 16) -> (1, 16)",
+ "(1, 18) -> (1, 18)",
+ "(1, 20) -> (1, 20)",
+ "(1, 21) -> (1, 21)",
+ "(1, 23) -> (1, 23)",
+ "(1, 24) -> (1, 24)",
+ "(1, 26) -> (1, 26)",
+ "(1, 28) -> (1, 28)",
+ "(2, 2) -> (1, 30)",
+ "(2, 9) -> (1, 37)",
+ "(2, 10) -> (1, 38)",
+ "(2, 13) -> (1, 41)",
+ "(2, 14) -> (1, 42)",
+ "(2, 15) -> (1, 43)",
+ "(2, 16) -> (1, 44)",
+ "(3, 0) -> (1, 46)",
+]
+`;
+
+exports[`Function calls 1`] = `
+"var result = func(a, b, c, d);
+"
+`;
+
+exports[`Function calls 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 4) -> (1, 4)",
+ "(1, 11) -> (1, 10)",
+ "(1, 13) -> (1, 11)",
+ "(1, 17) -> (1, 15)",
+ "(1, 18) -> (1, 16)",
+ "(1, 19) -> (1, 17)",
+ "(1, 21) -> (1, 18)",
+ "(1, 22) -> (1, 19)",
+ "(1, 24) -> (1, 20)",
+ "(1, 25) -> (1, 21)",
+ "(1, 27) -> (1, 22)",
+ "(1, 28) -> (1, 23)",
+ "(1, 29) -> (1, 24)",
+]
+`;
+
+exports[`Getter and setter literals 1`] = `
+"var obj = {
+ get foo() {
+ return this._foo
+ },
+ set foo(v) {
+ this._foo = v
+ }
+}
+"
+`;
+
+exports[`Getter and setter literals 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 4) -> (1, 4)",
+ "(1, 8) -> (1, 7)",
+ "(1, 10) -> (1, 8)",
+ "(2, 2) -> (1, 9)",
+ "(2, 6) -> (1, 13)",
+ "(2, 9) -> (1, 16)",
+ "(2, 10) -> (1, 17)",
+ "(2, 12) -> (1, 18)",
+ "(3, 4) -> (1, 19)",
+ "(3, 11) -> (1, 26)",
+ "(3, 15) -> (1, 30)",
+ "(3, 16) -> (1, 31)",
+ "(4, 2) -> (1, 35)",
+ "(4, 3) -> (1, 36)",
+ "(5, 2) -> (1, 37)",
+ "(5, 6) -> (1, 41)",
+ "(5, 9) -> (1, 44)",
+ "(5, 10) -> (1, 45)",
+ "(5, 11) -> (1, 46)",
+ "(5, 13) -> (1, 47)",
+ "(6, 4) -> (1, 48)",
+ "(6, 8) -> (1, 52)",
+ "(6, 9) -> (1, 53)",
+ "(6, 14) -> (1, 57)",
+ "(6, 16) -> (1, 58)",
+ "(7, 2) -> (1, 59)",
+ "(8, 0) -> (1, 60)",
+]
+`;
+
+exports[`If/else statement 1`] = `
+"if (c) {
+ then()
+} else {
+ other()
+}
+"
+`;
+
+exports[`If/else statement 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 3) -> (1, 2)",
+ "(1, 4) -> (1, 3)",
+ "(1, 5) -> (1, 4)",
+ "(1, 7) -> (1, 5)",
+ "(2, 2) -> (1, 6)",
+ "(2, 6) -> (1, 10)",
+ "(2, 7) -> (1, 11)",
+ "(3, 0) -> (1, 12)",
+ "(3, 2) -> (1, 13)",
+ "(3, 7) -> (1, 17)",
+ "(4, 2) -> (1, 18)",
+ "(4, 7) -> (1, 23)",
+ "(4, 8) -> (1, 24)",
+ "(5, 0) -> (1, 25)",
+]
+`;
+
+exports[`If/else without curlies 1`] = `
+"if (c) a else b
+"
+`;
+
+exports[`If/else without curlies 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 3) -> (1, 2)",
+ "(1, 4) -> (1, 3)",
+ "(1, 5) -> (1, 4)",
+ "(1, 7) -> (1, 6)",
+ "(1, 9) -> (1, 8)",
+ "(1, 14) -> (1, 13)",
+]
+`;
+
+exports[`Immediately invoked function expression 1`] = `
+"(function () {
+ thingy()
+}())
+"
+`;
+
+exports[`Immediately invoked function expression 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 1) -> (1, 1)",
+ "(1, 10) -> (1, 9)",
+ "(1, 11) -> (1, 10)",
+ "(1, 13) -> (1, 11)",
+ "(2, 2) -> (1, 12)",
+ "(2, 8) -> (1, 18)",
+ "(2, 9) -> (1, 19)",
+ "(3, 0) -> (1, 20)",
+ "(3, 1) -> (1, 21)",
+ "(3, 2) -> (1, 22)",
+ "(3, 3) -> (1, 23)",
+]
+`;
+
+exports[`In operator 1`] = `
+"if (foo in bar) {
+ doThing()
+}
+"
+`;
+
+exports[`In operator 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 3) -> (1, 2)",
+ "(1, 4) -> (1, 3)",
+ "(1, 8) -> (1, 7)",
+ "(1, 11) -> (1, 10)",
+ "(1, 14) -> (1, 13)",
+ "(1, 16) -> (1, 14)",
+ "(2, 2) -> (1, 15)",
+ "(2, 9) -> (1, 22)",
+ "(2, 10) -> (1, 23)",
+ "(3, 0) -> (1, 24)",
+]
+`;
+
+exports[`Indented multiline comment 1`] = `
+"function foo() {
+ /**
+ * java doc style comment
+ * more comment
+ */
+ bar();
+}
+"
+`;
+
+exports[`Indented multiline comment 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 9) -> (1, 9)",
+ "(1, 12) -> (1, 12)",
+ "(1, 13) -> (1, 13)",
+ "(1, 15) -> (1, 15)",
+ "(6, 2) -> (6, 13)",
+ "(6, 5) -> (6, 16)",
+ "(6, 6) -> (6, 17)",
+ "(6, 7) -> (6, 18)",
+ "(7, 0) -> (7, 11)",
+]
+`;
+
+exports[`Instanceof 1`] = `
+"var a = x instanceof y;
+"
+`;
+
+exports[`Instanceof 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 4) -> (1, 4)",
+ "(1, 6) -> (1, 5)",
+ "(1, 8) -> (1, 6)",
+ "(1, 10) -> (1, 8)",
+ "(1, 21) -> (1, 19)",
+ "(1, 22) -> (1, 20)",
+]
+`;
+
+exports[`Let handling with value 1`] = `
+"let d = 'yes';
+"
+`;
+
+exports[`Let handling with value 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 4) -> (1, 4)",
+ "(1, 6) -> (1, 6)",
+ "(1, 8) -> (1, 8)",
+ "(1, 13) -> (1, 13)",
+]
+`;
+
+exports[`Let handling without value 1`] = `
+"let d;
+"
+`;
+
+exports[`Let handling without value 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 4) -> (1, 4)",
+ "(1, 5) -> (1, 5)",
+]
+`;
+
+exports[`Long parenthesis 1`] = `
+"if (
+ thisIsAVeryLongVariable &&
+ thisIsAnotherOne ||
+ yetAnotherVeryLongVariable
+) {
+ (
+ thisIsAnotherOne = thisMayReturnNull() ||
+ 'hi',
+ thisIsAVeryLongVariable = 42,
+ yetAnotherVeryLongVariable &&
+ doSomething(
+ true /* do it well */ ,
+ thisIsAVeryLongVariable,
+ thisIsAnotherOne,
+ yetAnotherVeryLongVariable
+ )
+ )
+}
+for (
+ let thisIsAnotherVeryLongVariable = 0;
+ i < thisIsAnotherVeryLongVariable.length;
+ thisIsAnotherVeryLongVariable++
+) {
+}
+const x = ({
+ thisIsAnotherVeryLongPropertyName: 'but should not cause the paren to be a line delimiter'
+})
+"
+`;
+
+exports[`Long parenthesis 2`] = `
+Array [
+ "(1, 0) -> (2, 6)",
+ "(1, 3) -> (2, 9)",
+ "(2, 2) -> (2, 10)",
+ "(2, 26) -> (2, 34)",
+ "(3, 2) -> (2, 37)",
+ "(3, 19) -> (2, 54)",
+ "(4, 2) -> (2, 57)",
+ "(5, 0) -> (2, 83)",
+ "(5, 2) -> (2, 85)",
+ "(6, 2) -> (3, 8)",
+ "(7, 4) -> (3, 9)",
+ "(7, 21) -> (3, 26)",
+ "(7, 23) -> (3, 28)",
+ "(7, 40) -> (3, 45)",
+ "(7, 41) -> (3, 46)",
+ "(7, 43) -> (3, 48)",
+ "(8, 4) -> (3, 51)",
+ "(8, 8) -> (3, 55)",
+ "(9, 4) -> (3, 57)",
+ "(9, 28) -> (3, 81)",
+ "(9, 30) -> (3, 83)",
+ "(9, 32) -> (3, 85)",
+ "(10, 4) -> (3, 87)",
+ "(10, 31) -> (3, 114)",
+ "(11, 4) -> (3, 117)",
+ "(11, 15) -> (3, 128)",
+ "(12, 6) -> (3, 129)",
+ "(12, 28) -> (3, 150)",
+ "(13, 6) -> (3, 151)",
+ "(13, 29) -> (3, 174)",
+ "(14, 6) -> (3, 176)",
+ "(14, 22) -> (3, 192)",
+ "(15, 6) -> (3, 194)",
+ "(16, 4) -> (3, 220)",
+ "(17, 2) -> (3, 221)",
+ "(18, 0) -> (4, 6)",
+ "(19, 0) -> (5, 6)",
+ "(19, 4) -> (5, 10)",
+ "(20, 2) -> (5, 11)",
+ "(20, 6) -> (5, 15)",
+ "(20, 36) -> (5, 45)",
+ "(20, 38) -> (5, 47)",
+ "(20, 39) -> (5, 48)",
+ "(21, 2) -> (5, 50)",
+ "(21, 4) -> (5, 52)",
+ "(21, 6) -> (5, 54)",
+ "(21, 35) -> (5, 83)",
+ "(21, 36) -> (5, 84)",
+ "(21, 42) -> (5, 90)",
+ "(22, 2) -> (5, 92)",
+ "(22, 31) -> (5, 121)",
+ "(23, 0) -> (5, 123)",
+ "(23, 2) -> (5, 125)",
+ "(24, 0) -> (5, 126)",
+ "(25, 0) -> (6, 6)",
+ "(25, 6) -> (6, 12)",
+ "(25, 8) -> (6, 14)",
+ "(25, 10) -> (6, 16)",
+ "(25, 11) -> (6, 17)",
+ "(26, 2) -> (6, 18)",
+ "(26, 35) -> (6, 51)",
+ "(26, 37) -> (6, 53)",
+ "(27, 0) -> (6, 108)",
+ "(27, 1) -> (6, 109)",
+]
+`;
+
+exports[`Multi line comment 1`] = `
+"/* Comment
+ more comment */
+function foo() {
+ bar();
+}
+"
+`;
+
+exports[`Multi line comment 2`] = `
+Array [
+ "(3, 0) -> (4, 4)",
+ "(3, 9) -> (4, 13)",
+ "(3, 12) -> (4, 16)",
+ "(3, 13) -> (4, 17)",
+ "(3, 15) -> (4, 19)",
+ "(4, 2) -> (4, 21)",
+ "(4, 5) -> (4, 24)",
+ "(4, 6) -> (4, 25)",
+ "(4, 7) -> (4, 26)",
+ "(5, 0) -> (4, 28)",
+]
+`;
+
+exports[`Multiple single line comments 1`] = `
+"function f() {
+ // a
+ // b
+ // c
+}
+"
+`;
+
+exports[`Multiple single line comments 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 9) -> (1, 9)",
+ "(1, 10) -> (1, 10)",
+ "(1, 11) -> (1, 11)",
+ "(1, 13) -> (1, 13)",
+ "(5, 0) -> (5, 11)",
+]
+`;
+
+exports[`Named class handling 1`] = `
+"let unnamed = class Class {
+ constructor() {
+ }
+}
+"
+`;
+
+exports[`Named class handling 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 4) -> (1, 4)",
+ "(1, 12) -> (1, 11)",
+ "(1, 14) -> (1, 12)",
+ "(1, 20) -> (1, 18)",
+ "(1, 26) -> (1, 23)",
+ "(2, 2) -> (1, 24)",
+ "(2, 13) -> (1, 35)",
+ "(2, 14) -> (1, 36)",
+ "(2, 16) -> (1, 37)",
+ "(3, 2) -> (1, 38)",
+ "(4, 0) -> (1, 39)",
+]
+`;
+
+exports[`Nested function 1`] = `
+"function foo() {
+ function bar() {
+ debugger;
+ }
+ bar();
+}
+"
+`;
+
+exports[`Nested function 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 9) -> (1, 9)",
+ "(1, 12) -> (1, 12)",
+ "(1, 13) -> (1, 13)",
+ "(1, 15) -> (1, 15)",
+ "(2, 2) -> (1, 17)",
+ "(2, 11) -> (1, 26)",
+ "(2, 14) -> (1, 29)",
+ "(2, 15) -> (1, 30)",
+ "(2, 17) -> (1, 32)",
+ "(3, 4) -> (1, 34)",
+ "(3, 12) -> (1, 42)",
+ "(4, 2) -> (1, 44)",
+ "(5, 2) -> (1, 46)",
+ "(5, 5) -> (1, 49)",
+ "(5, 6) -> (1, 50)",
+ "(5, 7) -> (1, 51)",
+ "(6, 0) -> (1, 53)",
+]
+`;
+
+exports[`New expression 1`] = `
+"var foo = new Foo();
+"
+`;
+
+exports[`New expression 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 4) -> (1, 4)",
+ "(1, 8) -> (1, 7)",
+ "(1, 10) -> (1, 8)",
+ "(1, 14) -> (1, 12)",
+ "(1, 17) -> (1, 15)",
+ "(1, 18) -> (1, 16)",
+ "(1, 19) -> (1, 17)",
+]
+`;
+
+exports[`Non-ASI function call 1`] = `
+"f()
+"
+`;
+
+exports[`Non-ASI function call 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 1) -> (2, 11)",
+ "(1, 2) -> (2, 12)",
+]
+`;
+
+exports[`Non-ASI in 1`] = `
+"'x' in foo
+"
+`;
+
+exports[`Non-ASI in 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 4) -> (2, 11)",
+ "(1, 7) -> (2, 14)",
+]
+`;
+
+exports[`Non-ASI new 1`] = `
+"new F()
+"
+`;
+
+exports[`Non-ASI new 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 4) -> (2, 11)",
+ "(1, 5) -> (2, 12)",
+ "(1, 6) -> (2, 13)",
+]
+`;
+
+exports[`Non-ASI property access 1`] = `
+"[
+ 1,
+ 2,
+ 3
+]
+[0]
+"
+`;
+
+exports[`Non-ASI property access 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(2, 2) -> (1, 1)",
+ "(2, 3) -> (1, 2)",
+ "(3, 2) -> (1, 3)",
+ "(3, 3) -> (1, 4)",
+ "(4, 2) -> (1, 5)",
+ "(5, 0) -> (1, 6)",
+ "(6, 0) -> (2, 11)",
+ "(6, 1) -> (2, 12)",
+ "(6, 2) -> (2, 13)",
+]
+`;
+
+exports[`Null assignment 1`] = `
+"var i = null;
+"
+`;
+
+exports[`Null assignment 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 4) -> (1, 4)",
+ "(1, 6) -> (1, 5)",
+ "(1, 8) -> (1, 6)",
+ "(1, 12) -> (1, 10)",
+]
+`;
+
+exports[`Objects 1`] = `
+"var o = {
+ a: 1,
+ b: 2
+};
+"
+`;
+
+exports[`Objects 2`] = `
+Array [
+ "(1, 0) -> (2, 6)",
+ "(1, 4) -> (2, 10)",
+ "(1, 6) -> (2, 11)",
+ "(1, 8) -> (2, 12)",
+ "(2, 2) -> (2, 13)",
+ "(2, 3) -> (2, 14)",
+ "(2, 5) -> (2, 15)",
+ "(2, 6) -> (2, 16)",
+ "(3, 2) -> (3, 6)",
+ "(3, 3) -> (3, 7)",
+ "(3, 5) -> (3, 8)",
+ "(4, 0) -> (3, 9)",
+ "(4, 1) -> (3, 10)",
+]
+`;
+
+exports[`Optional chaining parsing support 1`] = `
+"x?.y?.z?.['a']?.check();
+"
+`;
+
+exports[`Optional chaining parsing support 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 1) -> (1, 1)",
+ "(1, 3) -> (1, 3)",
+ "(1, 4) -> (1, 4)",
+ "(1, 6) -> (1, 6)",
+ "(1, 7) -> (1, 7)",
+ "(1, 9) -> (1, 9)",
+ "(1, 10) -> (1, 10)",
+ "(1, 13) -> (1, 13)",
+ "(1, 14) -> (1, 14)",
+ "(1, 16) -> (1, 16)",
+ "(1, 21) -> (1, 21)",
+ "(1, 22) -> (1, 22)",
+ "(1, 23) -> (1, 23)",
+]
+`;
+
+exports[`Private fields parsing support 1`] = `
+"class MyClass {
+ constructor(a) {
+ this.#a = a;
+ this.#b = Math.random();
+ this.ab = this.#getAB();
+ }
+ #a
+ #b = 'default value'
+ static #someStaticPrivate
+ #getA() {
+ return this.#a;
+ }
+ #getAB() {
+ return this.#getA() + this.#b
+ }
+}
+"
+`;
+
+exports[`Private fields parsing support 2`] = `
+Array [
+ "(1, 0) -> (2, 6)",
+ "(1, 6) -> (2, 12)",
+ "(1, 14) -> (2, 20)",
+ "(2, 2) -> (3, 8)",
+ "(2, 13) -> (3, 19)",
+ "(2, 14) -> (3, 20)",
+ "(2, 15) -> (3, 21)",
+ "(2, 17) -> (3, 23)",
+ "(3, 4) -> (4, 10)",
+ "(3, 8) -> (4, 14)",
+ "(3, 9) -> (4, 15)",
+ "(3, 12) -> (4, 18)",
+ "(3, 14) -> (4, 20)",
+ "(3, 15) -> (4, 21)",
+ "(4, 4) -> (4, 22)",
+ "(4, 8) -> (4, 26)",
+ "(4, 9) -> (4, 27)",
+ "(4, 12) -> (4, 30)",
+ "(4, 14) -> (4, 32)",
+ "(4, 18) -> (4, 36)",
+ "(4, 19) -> (4, 37)",
+ "(4, 25) -> (4, 43)",
+ "(4, 26) -> (4, 44)",
+ "(4, 27) -> (4, 45)",
+ "(5, 4) -> (4, 46)",
+ "(5, 8) -> (4, 50)",
+ "(5, 9) -> (4, 51)",
+ "(5, 12) -> (4, 54)",
+ "(5, 14) -> (4, 56)",
+ "(5, 18) -> (4, 60)",
+ "(5, 19) -> (4, 61)",
+ "(5, 25) -> (4, 67)",
+ "(5, 26) -> (4, 68)",
+ "(5, 27) -> (4, 69)",
+ "(6, 2) -> (5, 8)",
+ "(7, 2) -> (6, 8)",
+ "(8, 2) -> (7, 8)",
+ "(8, 5) -> (7, 11)",
+ "(8, 7) -> (7, 13)",
+ "(9, 2) -> (8, 8)",
+ "(9, 9) -> (8, 15)",
+ "(10, 2) -> (9, 8)",
+ "(10, 7) -> (9, 13)",
+ "(10, 8) -> (9, 14)",
+ "(10, 10) -> (9, 16)",
+ "(11, 4) -> (10, 10)",
+ "(11, 11) -> (10, 17)",
+ "(11, 15) -> (10, 21)",
+ "(11, 16) -> (10, 22)",
+ "(11, 18) -> (10, 24)",
+ "(12, 2) -> (11, 8)",
+ "(13, 2) -> (12, 8)",
+ "(13, 8) -> (12, 14)",
+ "(13, 9) -> (12, 15)",
+ "(13, 11) -> (12, 17)",
+ "(14, 4) -> (13, 10)",
+ "(14, 11) -> (13, 17)",
+ "(14, 15) -> (13, 21)",
+ "(14, 16) -> (13, 22)",
+ "(14, 21) -> (13, 27)",
+ "(14, 22) -> (13, 28)",
+ "(14, 24) -> (13, 29)",
+ "(14, 26) -> (13, 30)",
+ "(14, 30) -> (13, 34)",
+ "(14, 31) -> (14, 12)",
+ "(15, 2) -> (15, 8)",
+ "(16, 0) -> (16, 6)",
+]
+`;
+
+exports[`Regexp 1`] = `
+"var r = /foobar/g;
+"
+`;
+
+exports[`Regexp 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 4) -> (1, 4)",
+ "(1, 6) -> (1, 5)",
+ "(1, 8) -> (1, 6)",
+ "(1, 17) -> (1, 15)",
+]
+`;
+
+exports[`Simple function 1`] = `
+"function foo() {
+ bar();
+}
+"
+`;
+
+exports[`Simple function 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 9) -> (1, 9)",
+ "(1, 12) -> (1, 12)",
+ "(1, 13) -> (1, 13)",
+ "(1, 15) -> (1, 15)",
+ "(2, 2) -> (1, 17)",
+ "(2, 5) -> (1, 20)",
+ "(2, 6) -> (1, 21)",
+ "(2, 7) -> (1, 22)",
+ "(3, 0) -> (1, 24)",
+]
+`;
+
+exports[`Single line comment 1`] = `
+"// Comment
+function foo() {
+ bar();
+}
+"
+`;
+
+exports[`Single line comment 2`] = `
+Array [
+ "(2, 0) -> (3, 4)",
+ "(2, 9) -> (3, 13)",
+ "(2, 12) -> (3, 16)",
+ "(2, 13) -> (3, 17)",
+ "(2, 15) -> (3, 19)",
+ "(3, 2) -> (3, 21)",
+ "(3, 5) -> (3, 24)",
+ "(3, 6) -> (3, 25)",
+ "(3, 7) -> (3, 26)",
+ "(4, 0) -> (3, 28)",
+]
+`;
+
+exports[`Stack-keyword property access 1`] = `
+"foo.a = 1.1;
+foo.do.switch.case.default = 2.2;
+foo.b = 3.3;
+"
+`;
+
+exports[`Stack-keyword property access 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 3) -> (1, 3)",
+ "(1, 4) -> (1, 4)",
+ "(1, 6) -> (1, 5)",
+ "(1, 8) -> (1, 6)",
+ "(1, 11) -> (1, 9)",
+ "(2, 0) -> (1, 10)",
+ "(2, 3) -> (1, 13)",
+ "(2, 4) -> (1, 14)",
+ "(2, 6) -> (1, 16)",
+ "(2, 7) -> (1, 17)",
+ "(2, 13) -> (1, 23)",
+ "(2, 14) -> (1, 24)",
+ "(2, 18) -> (1, 28)",
+ "(2, 19) -> (1, 29)",
+ "(2, 27) -> (1, 36)",
+ "(2, 29) -> (1, 37)",
+ "(2, 32) -> (1, 40)",
+ "(3, 0) -> (1, 41)",
+ "(3, 3) -> (1, 44)",
+ "(3, 4) -> (1, 45)",
+ "(3, 6) -> (1, 46)",
+ "(3, 8) -> (1, 47)",
+ "(3, 11) -> (1, 50)",
+]
+`;
+
+exports[`String with quote 1`] = `
+"var foo = '\\\\'';
+"
+`;
+
+exports[`String with quote 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 4) -> (1, 4)",
+ "(1, 8) -> (1, 8)",
+ "(1, 10) -> (1, 10)",
+ "(1, 14) -> (1, 13)",
+]
+`;
+
+exports[`String with semicolon 1`] = `
+"var foo = ';';
+"
+`;
+
+exports[`String with semicolon 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 4) -> (1, 4)",
+ "(1, 8) -> (1, 8)",
+ "(1, 10) -> (1, 10)",
+ "(1, 13) -> (1, 13)",
+]
+`;
+
+exports[`Subclass handling 1`] = `
+"class Class extends Base {
+ constructor() {
+ }
+}
+"
+`;
+
+exports[`Subclass handling 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 6) -> (1, 7)",
+ "(1, 12) -> (1, 14)",
+ "(1, 20) -> (1, 23)",
+ "(1, 25) -> (1, 27)",
+ "(2, 2) -> (1, 28)",
+ "(2, 13) -> (1, 39)",
+ "(2, 14) -> (1, 40)",
+ "(2, 16) -> (1, 41)",
+ "(3, 2) -> (1, 42)",
+ "(4, 0) -> (1, 43)",
+]
+`;
+
+exports[`Switch statements 1`] = `
+"switch (x) {
+ case a:
+ foo();
+ break;
+ default:
+ bar()
+}
+"
+`;
+
+exports[`Switch statements 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 7) -> (1, 6)",
+ "(1, 8) -> (1, 7)",
+ "(1, 9) -> (1, 8)",
+ "(1, 11) -> (1, 9)",
+ "(2, 2) -> (1, 10)",
+ "(2, 7) -> (1, 15)",
+ "(2, 8) -> (1, 16)",
+ "(3, 4) -> (1, 17)",
+ "(3, 7) -> (1, 20)",
+ "(3, 8) -> (1, 21)",
+ "(3, 9) -> (1, 22)",
+ "(4, 4) -> (1, 23)",
+ "(4, 9) -> (1, 28)",
+ "(5, 2) -> (1, 29)",
+ "(5, 9) -> (1, 36)",
+ "(6, 4) -> (1, 37)",
+ "(6, 7) -> (1, 40)",
+ "(6, 8) -> (1, 41)",
+ "(7, 0) -> (1, 42)",
+]
+`;
+
+exports[`Template literals 1`] = `
+"\`abc\${ JSON.stringify({
+ clas: 'testing'
+}) }def\`;
+{
+ a();
+}
+"
+`;
+
+exports[`Template literals 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 1) -> (1, 1)",
+ "(1, 4) -> (1, 4)",
+ "(1, 7) -> (1, 6)",
+ "(1, 11) -> (1, 10)",
+ "(1, 12) -> (1, 11)",
+ "(1, 21) -> (1, 20)",
+ "(1, 22) -> (1, 21)",
+ "(2, 2) -> (1, 22)",
+ "(2, 6) -> (1, 26)",
+ "(2, 8) -> (1, 28)",
+ "(3, 0) -> (1, 37)",
+ "(3, 1) -> (1, 38)",
+ "(3, 3) -> (1, 39)",
+ "(3, 4) -> (1, 40)",
+ "(3, 7) -> (1, 43)",
+ "(3, 8) -> (1, 44)",
+ "(4, 0) -> (1, 45)",
+ "(5, 2) -> (1, 46)",
+ "(5, 3) -> (1, 47)",
+ "(5, 4) -> (1, 48)",
+ "(5, 5) -> (1, 49)",
+ "(6, 0) -> (1, 50)",
+]
+`;
+
+exports[`Ternary operator 1`] = `
+"bar ? baz : bang;
+"
+`;
+
+exports[`Ternary operator 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 4) -> (1, 3)",
+ "(1, 6) -> (1, 4)",
+ "(1, 10) -> (1, 7)",
+ "(1, 12) -> (1, 8)",
+ "(1, 16) -> (1, 12)",
+]
+`;
+
+exports[`This property access 1`] = `
+"var foo = this.foo;
+"
+`;
+
+exports[`This property access 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 4) -> (1, 4)",
+ "(1, 8) -> (1, 7)",
+ "(1, 10) -> (1, 8)",
+ "(1, 14) -> (1, 12)",
+ "(1, 15) -> (1, 13)",
+ "(1, 18) -> (1, 16)",
+]
+`;
+
+exports[`True assignment 1`] = `
+"var foo = true;
+"
+`;
+
+exports[`True assignment 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 4) -> (1, 4)",
+ "(1, 8) -> (1, 7)",
+ "(1, 10) -> (1, 8)",
+ "(1, 14) -> (1, 12)",
+]
+`;
+
+exports[`Try/catch/finally statement 1`] = `
+"try {
+ dangerous()
+} catch (e) {
+ handle(e)
+} finally {
+ cleanup()
+}
+"
+`;
+
+exports[`Try/catch/finally statement 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 4) -> (1, 3)",
+ "(2, 2) -> (1, 4)",
+ "(2, 11) -> (1, 13)",
+ "(2, 12) -> (1, 14)",
+ "(3, 0) -> (1, 15)",
+ "(3, 2) -> (1, 16)",
+ "(3, 8) -> (1, 21)",
+ "(3, 9) -> (1, 22)",
+ "(3, 10) -> (1, 23)",
+ "(3, 12) -> (1, 24)",
+ "(4, 2) -> (1, 25)",
+ "(4, 8) -> (1, 31)",
+ "(4, 9) -> (1, 32)",
+ "(4, 10) -> (1, 33)",
+ "(5, 0) -> (1, 34)",
+ "(5, 2) -> (1, 35)",
+ "(5, 10) -> (1, 42)",
+ "(6, 2) -> (1, 43)",
+ "(6, 9) -> (1, 50)",
+ "(6, 10) -> (1, 51)",
+ "(7, 0) -> (1, 52)",
+]
+`;
+
+exports[`Undefined assignment 1`] = `
+"var i = undefined;
+"
+`;
+
+exports[`Undefined assignment 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 4) -> (1, 4)",
+ "(1, 6) -> (1, 5)",
+ "(1, 8) -> (1, 6)",
+ "(1, 17) -> (1, 15)",
+]
+`;
+
+exports[`Unnamed class handling 1`] = `
+"let unnamed = class {
+ constructor() {
+ }
+}
+"
+`;
+
+exports[`Unnamed class handling 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 4) -> (1, 4)",
+ "(1, 12) -> (1, 11)",
+ "(1, 14) -> (1, 12)",
+ "(1, 20) -> (1, 17)",
+ "(2, 2) -> (1, 18)",
+ "(2, 13) -> (1, 29)",
+ "(2, 14) -> (1, 30)",
+ "(2, 16) -> (1, 31)",
+ "(3, 2) -> (1, 32)",
+ "(4, 0) -> (1, 33)",
+]
+`;
+
+exports[`Void 0 assignment 1`] = `
+"var i = void 0;
+"
+`;
+
+exports[`Void 0 assignment 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 4) -> (1, 4)",
+ "(1, 6) -> (1, 5)",
+ "(1, 8) -> (1, 6)",
+ "(1, 13) -> (1, 11)",
+ "(1, 14) -> (1, 12)",
+]
+`;
+
+exports[`With statement 1`] = `
+"with (obj) {
+ crock()
+}
+"
+`;
+
+exports[`With statement 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 5) -> (1, 4)",
+ "(1, 6) -> (1, 5)",
+ "(1, 9) -> (1, 8)",
+ "(1, 11) -> (1, 9)",
+ "(2, 2) -> (1, 10)",
+ "(2, 7) -> (1, 15)",
+ "(2, 8) -> (1, 16)",
+ "(3, 0) -> (1, 17)",
+]
+`;
+
+exports[`for..of loop 1`] = `
+"for (const x of [
+ 1,
+ 2,
+ 3
+]) {
+ console.log(x)
+}
+"
+`;
+
+exports[`for..of loop 2`] = `
+Array [
+ "(1, 0) -> (1, 0)",
+ "(1, 4) -> (1, 4)",
+ "(1, 5) -> (1, 5)",
+ "(1, 11) -> (1, 11)",
+ "(1, 13) -> (1, 13)",
+ "(1, 16) -> (1, 16)",
+ "(2, 2) -> (1, 17)",
+ "(2, 3) -> (1, 18)",
+ "(3, 2) -> (1, 19)",
+ "(3, 3) -> (1, 20)",
+ "(4, 2) -> (1, 21)",
+ "(5, 0) -> (1, 22)",
+ "(5, 1) -> (1, 23)",
+ "(5, 3) -> (1, 25)",
+ "(6, 2) -> (1, 27)",
+ "(6, 9) -> (1, 34)",
+ "(6, 10) -> (1, 35)",
+ "(6, 13) -> (1, 38)",
+ "(6, 14) -> (1, 39)",
+ "(6, 15) -> (1, 40)",
+ "(7, 0) -> (1, 42)",
+]
+`;
diff --git a/devtools/client/debugger/src/workers/pretty-print/tests/prettyFast.spec.js b/devtools/client/debugger/src/workers/pretty-print/tests/prettyFast.spec.js
new file mode 100644
index 0000000000..b9c19093ad
--- /dev/null
+++ b/devtools/client/debugger/src/workers/pretty-print/tests/prettyFast.spec.js
@@ -0,0 +1,435 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/*
+ * Copyright 2013 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE.md or:
+ * http://opensource.org/licenses/BSD-2-Clause
+ */
+import { prettyFast } from "../pretty-fast";
+import { SourceMapConsumer } from "devtools/client/shared/vendor/source-map/source-map";
+
+const cases = [
+ {
+ name: "Simple function",
+ input: "function foo() { bar(); }",
+ },
+ {
+ name: "Nested function",
+ input: "function foo() { function bar() { debugger; } bar(); }",
+ },
+ {
+ name: "Immediately invoked function expression",
+ input: "(function(){thingy()}())",
+ },
+ {
+ name: "Single line comment",
+ input: `
+ // Comment
+ function foo() { bar(); }`,
+ },
+ {
+ name: "Multi line comment",
+ input: `
+ /* Comment
+ more comment */
+ function foo() { bar(); }
+ `,
+ },
+ { name: "Null assignment", input: "var i=null;" },
+ { name: "Undefined assignment", input: "var i=undefined;" },
+ { name: "Void 0 assignment", input: "var i=void 0;" },
+ {
+ name: "This property access",
+ input: "var foo=this.foo;\n",
+ },
+
+ {
+ name: "True assignment",
+ input: "var foo=true;\n",
+ },
+
+ {
+ name: "False assignment",
+ input: "var foo=false;\n",
+ },
+
+ {
+ name: "For loop",
+ input: "for (var i = 0; i < n; i++) { console.log(i); }",
+ },
+
+ {
+ name: "for..of loop",
+ input: "for (const x of [1,2,3]) { console.log(x) }",
+ },
+
+ {
+ name: "String with semicolon",
+ input: "var foo = ';';\n",
+ },
+
+ {
+ name: "String with quote",
+ input: 'var foo = "\'";\n',
+ },
+
+ {
+ name: "Function calls",
+ input: "var result=func(a,b,c,d);",
+ },
+
+ {
+ name: "Regexp",
+ input: "var r=/foobar/g;",
+ },
+
+ {
+ name: "In operator",
+ input: "if(foo in bar){doThing()}",
+ output: "if (foo in bar) {\n" + " doThing()\n" + "}\n",
+ },
+ {
+ name: "With statement",
+ input: "with(obj){crock()}",
+ },
+ {
+ name: "New expression",
+ input: "var foo=new Foo();",
+ },
+ {
+ name: "Continue/break statements",
+ input: "while(1){if(x){continue}if(y){break}if(z){break foo}}",
+ },
+ {
+ name: "Instanceof",
+ input: "var a=x instanceof y;",
+ },
+ {
+ name: "Binary operators",
+ input: "var a=5*30;var b=5>>3;",
+ },
+ {
+ name: "Delete",
+ input: "delete obj.prop;",
+ },
+
+ {
+ name: "Try/catch/finally statement",
+ input: "try{dangerous()}catch(e){handle(e)}finally{cleanup()}",
+ },
+ {
+ name: "If/else statement",
+ input: "if(c){then()}else{other()}",
+ },
+ {
+ name: "If/else without curlies",
+ input: "if(c) a else b",
+ },
+ {
+ name: "Objects",
+ input: `
+ var o={a:1,
+ b:2};`,
+ },
+ {
+ name: "Do/while loop",
+ input: "do{x}while(y)",
+ },
+ {
+ name: "Arrays",
+ input: "var a=[1,2,3];",
+ },
+ {
+ name: "Arrays and spread operator",
+ input: "var a=[1,...[2,3],...[], 4];",
+ },
+ {
+ name: "Empty object/array literals",
+ input: `let a=[];const b={};c={...{},d: 42};for(let x of []){for(let y in {}){}}`,
+ },
+ {
+ name: "Code that relies on ASI",
+ input: `
+ var foo = 10
+ var bar = 20
+ function g() {
+ a()
+ b()
+ }`,
+ },
+ {
+ name: "Ternary operator",
+ input: "bar?baz:bang;",
+ },
+ {
+ name: "Switch statements",
+ input: "switch(x){case a:foo();break;default:bar()}",
+ },
+
+ {
+ name: "Multiple single line comments",
+ input: `function f() {
+ // a
+ // b
+ // c
+ }`,
+ },
+ {
+ name: "Indented multiline comment",
+ input: `function foo() {
+ /**
+ * java doc style comment
+ * more comment
+ */
+ bar();
+ }`,
+ },
+ {
+ name: "ASI return",
+ input: `function f() {
+ return
+ {}
+ }`,
+ },
+ {
+ name: "Non-ASI property access",
+ input: `[1,2,3]
+ [0]`,
+ },
+ {
+ name: "Non-ASI in",
+ input: `'x'
+ in foo`,
+ },
+
+ {
+ name: "Non-ASI function call",
+ input: `f
+ ()`,
+ },
+ {
+ name: "Non-ASI new",
+ input: `new
+ F()`,
+ },
+ {
+ name: "Getter and setter literals",
+ input: "var obj={get foo(){return this._foo},set foo(v){this._foo=v}}",
+ },
+ {
+ name: "Escaping backslashes in strings",
+ input: "'\\\\'\n",
+ },
+ {
+ name: "Escaping carriage return in strings",
+ input: "'\\r'\n",
+ },
+ {
+ name: "Escaping tab in strings",
+ input: "'\\t'\n",
+ },
+ {
+ name: "Escaping vertical tab in strings",
+ input: "'\\v'\n",
+ },
+ {
+ name: "Escaping form feed in strings",
+ input: "'\\f'\n",
+ },
+ {
+ name: "Escaping null character in strings",
+ input: "'\\0'\n",
+ },
+ {
+ name: "Bug 977082 - space between grouping operator and dot notation",
+ input: `JSON.stringify(3).length;
+ ([1,2,3]).length;
+ (new Date()).toLocaleString();`,
+ },
+ {
+ name: "Bug 975477 don't move end of line comments to next line",
+ input: `switch (request.action) {
+ case 'show': //$NON-NLS-0$
+ if (localStorage.hideicon !== 'true') { //$NON-NLS-0$
+ chrome.pageAction.show(sender.tab.id);
+ }
+ break;
+ case 'hide': /*Multiline
+ Comment */
+ break;
+ default:
+ console.warn('unknown request'); //$NON-NLS-0$
+ // don't respond if you don't understand the message.
+ return;
+ }`,
+ },
+ {
+ name: "Const handling",
+ input: "const d = 'yes';\n",
+ },
+ {
+ name: "Let handling without value",
+ input: "let d;\n",
+ },
+ {
+ name: "Let handling with value",
+ input: "let d = 'yes';\n",
+ },
+ {
+ name: "Template literals",
+ // issue in acorn
+ input: "`abc${JSON.stringify({clas: 'testing'})}def`;{a();}",
+ },
+ {
+ name: "Class handling",
+ input: "class Class{constructor(){}}",
+ },
+ {
+ name: "Subclass handling",
+ input: "class Class extends Base{constructor(){}}",
+ },
+ {
+ name: "Unnamed class handling",
+ input: "let unnamed=class{constructor(){}}",
+ },
+ {
+ name: "Named class handling",
+ input: "let unnamed=class Class{constructor(){}}",
+ },
+ {
+ name: "Class extension within a function",
+ input: "(function() { class X extends Y { constructor() {} } })()",
+ },
+ {
+ name: "Bug 1261971 - indentation after switch statement",
+ input: "{switch(x){}if(y){}done();}",
+ },
+ {
+ name: "Bug 1206633 - spaces in for of",
+ input: "for (let tab of tabs) {}",
+ },
+ {
+ name: "Bug pretty-sure-3 - escaping line and paragraph separators",
+ input: "x = '\\u2029\\u2028';",
+ },
+ {
+ name: "Bug pretty-sure-4 - escaping null character before digit",
+ input: "x = '\\u00001';",
+ },
+ {
+ name: "Bug pretty-sure-5 - empty multiline comment shouldn't throw exception",
+ input: `{
+ /*
+ */
+ return;
+ }`,
+ },
+ {
+ name: "Bug pretty-sure-6 - inline comment shouldn't move parenthesis to next line",
+ input: `return /* inline comment */ (
+ 1+1);`,
+ },
+ {
+ name: "Bug pretty-sure-7 - accessing a literal number property requires a space",
+ input: "0..toString()+x.toString();",
+ },
+ {
+ name: "Bug pretty-sure-8 - return and yield only accept arguments when on the same line",
+ input: `{
+ return
+ (x)
+ yield
+ (x)
+ yield
+ *x
+ }`,
+ },
+ {
+ name: "Bug pretty-sure-9 - accept unary operator at start of file",
+ input: "+ 0",
+ },
+ {
+ name: "Stack-keyword property access",
+ input: "foo.a=1.1;foo.do.switch.case.default=2.2;foo.b=3.3;\n",
+ },
+ {
+ name: "Dot handling with let which is identifier name",
+ input: "y.let.let = 1.23;\n",
+ },
+ {
+ name: "Dot handling with keywords which are identifier name",
+ input: "y.await.break.const.delete.else.return.new.yield = 1.23;\n",
+ },
+ {
+ name: "Optional chaining parsing support",
+ input: "x?.y?.z?.['a']?.check();\n",
+ },
+ {
+ name: "Private fields parsing support",
+ input: `
+ class MyClass {
+ constructor(a) {
+ this.#a = a;this.#b = Math.random();this.ab = this.#getAB();
+ }
+ #a
+ #b = "default value"
+ static #someStaticPrivate
+ #getA() {
+ return this.#a;
+ }
+ #getAB() {
+ return this.#getA()+this.
+ #b
+ }
+ }
+ `,
+ },
+ {
+ name: "Long parenthesis",
+ input: `
+ if (thisIsAVeryLongVariable && thisIsAnotherOne || yetAnotherVeryLongVariable) {
+ (thisIsAnotherOne = thisMayReturnNull() || "hi", thisIsAVeryLongVariable = 42, yetAnotherVeryLongVariable && doSomething(true /* do it well */,thisIsAVeryLongVariable, thisIsAnotherOne, yetAnotherVeryLongVariable))
+ }
+ for (let thisIsAnotherVeryLongVariable = 0; i < thisIsAnotherVeryLongVariable.length; thisIsAnotherVeryLongVariable++) {}
+ const x = ({thisIsAnotherVeryLongPropertyName: "but should not cause the paren to be a line delimiter"})
+ `,
+ },
+ {
+ name: "Fat arrow function",
+ input: `
+ const a = () => 42
+ addEventListener("click", e => { return false });
+ const sum = (c,d) => c+d
+ `,
+ },
+];
+
+const includesOnly = cases.find(({ only }) => only);
+
+for (const { name, input, only, skip } of cases) {
+ if ((includesOnly && !only) || skip) {
+ continue;
+ }
+ // Wrapping name into a string to avoid jest/valid-title failures
+ test(`${name}`, async () => {
+ const actual = prettyFast(input, {
+ indent: " ",
+ url: "test.js",
+ });
+
+ expect(actual.code).toMatchSnapshot();
+
+ const smc = await new SourceMapConsumer(actual.map.toJSON());
+ const mappings = [];
+ smc.eachMapping(
+ ({ generatedColumn, generatedLine, originalColumn, originalLine }) => {
+ mappings.push(
+ `(${originalLine}, ${originalColumn}) -> (${generatedLine}, ${generatedColumn})`
+ );
+ }
+ );
+ expect(mappings).toMatchSnapshot();
+ });
+}
diff --git a/devtools/client/debugger/src/workers/pretty-print/worker.js b/devtools/client/debugger/src/workers/pretty-print/worker.js
new file mode 100644
index 0000000000..1c5587db9f
--- /dev/null
+++ b/devtools/client/debugger/src/workers/pretty-print/worker.js
@@ -0,0 +1,98 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { workerHandler } from "../../../../shared/worker-utils";
+import { prettyFast } from "./pretty-fast";
+
+var { SourceMapGenerator } = require("source-map");
+
+const sourceMapGeneratorByTaskId = new Map();
+
+function prettyPrint({ url, indent, sourceText }) {
+ const { code, map: sourceMapGenerator } = prettyFast(sourceText, {
+ url,
+ indent,
+ });
+
+ return {
+ code,
+ sourceMap: sourceMapGenerator.toJSON(),
+ };
+}
+
+function prettyPrintInlineScript({
+ taskId,
+ url,
+ indent,
+ sourceText,
+ originalStartLine,
+ originalStartColumn,
+ generatedStartLine,
+}) {
+ let taskSourceMapGenerator;
+ if (!sourceMapGeneratorByTaskId.has(taskId)) {
+ taskSourceMapGenerator = new SourceMapGenerator({ file: url });
+ sourceMapGeneratorByTaskId.set(taskId, taskSourceMapGenerator);
+ } else {
+ taskSourceMapGenerator = sourceMapGeneratorByTaskId.get(taskId);
+ }
+
+ const { code } = prettyFast(sourceText, {
+ url,
+ indent,
+ sourceMapGenerator: taskSourceMapGenerator,
+ /*
+ * By default prettyPrint will trim the text, and we'd have the pretty text displayed
+ * just after the script tag, e.g.:
+ *
+ * ```
+ * <script>if (true) {
+ * something()
+ * }
+ * </script>
+ * ```
+ *
+ * We want the text to start on a new line, so prepend a line break, so we get
+ * something like:
+ *
+ * ```
+ * <script>
+ * if (true) {
+ * something()
+ * }
+ * </script>
+ * ```
+ */
+ prefixWithNewLine: true,
+ originalStartLine,
+ originalStartColumn,
+ generatedStartLine,
+ });
+
+ // When a taskId was passed, we only return the pretty printed text.
+ // The source map should be retrieved with getSourceMapForTask.
+ return code;
+}
+
+/**
+ * Get the source map for a pretty-print task
+ *
+ * @param {Integer} taskId: The taskId that was used to call prettyPrint
+ * @returns {Object} A source map object
+ */
+function getSourceMapForTask(taskId) {
+ if (!sourceMapGeneratorByTaskId.has(taskId)) {
+ return null;
+ }
+
+ const taskSourceMapGenerator = sourceMapGeneratorByTaskId.get(taskId);
+ sourceMapGeneratorByTaskId.delete(taskId);
+ return taskSourceMapGenerator.toJSON();
+}
+
+self.onmessage = workerHandler({
+ prettyPrint,
+ prettyPrintInlineScript,
+ getSourceMapForTask,
+});
diff --git a/devtools/client/debugger/src/workers/search/get-matches.js b/devtools/client/debugger/src/workers/search/get-matches.js
new file mode 100644
index 0000000000..972dea6818
--- /dev/null
+++ b/devtools/client/debugger/src/workers/search/get-matches.js
@@ -0,0 +1,45 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import assert from "../../utils/assert";
+import buildQuery from "../../utils/build-query";
+
+export default function getMatches(query, text, options) {
+ if (!query || !text || !options) {
+ return [];
+ }
+ const regexQuery = buildQuery(query, options, {
+ isGlobal: true,
+ });
+ const matchedLocations = [];
+ const lines = text.split("\n");
+ for (let i = 0; i < lines.length; i++) {
+ let singleMatch;
+ const line = lines[i];
+ while ((singleMatch = regexQuery.exec(line)) !== null) {
+ // Flow doesn't understand the test above.
+ if (!singleMatch) {
+ throw new Error("no singleMatch");
+ }
+
+ matchedLocations.push({
+ line: i,
+ ch: singleMatch.index,
+ match: singleMatch[0],
+ });
+
+ // When the match is an empty string the regexQuery.lastIndex will not
+ // change resulting in an infinite loop so we need to check for this and
+ // increment it manually in that case. See issue #7023
+ if (singleMatch[0] === "") {
+ assert(
+ !regexQuery.unicode,
+ "lastIndex++ can cause issues in unicode mode"
+ );
+ regexQuery.lastIndex++;
+ }
+ }
+ }
+ return matchedLocations;
+}
diff --git a/devtools/client/debugger/src/workers/search/index.js b/devtools/client/debugger/src/workers/search/index.js
new file mode 100644
index 0000000000..928bbf50e6
--- /dev/null
+++ b/devtools/client/debugger/src/workers/search/index.js
@@ -0,0 +1,17 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import { WorkerDispatcher } from "devtools/client/shared/worker-utils";
+
+const WORKER_URL = "resource://devtools/client/debugger/dist/search-worker.js";
+
+export class SearchDispatcher extends WorkerDispatcher {
+ constructor(jestUrl) {
+ super(jestUrl || WORKER_URL);
+ }
+
+ getMatches = this.task("getMatches");
+
+ findSourceMatches = this.task("findSourceMatches");
+}
diff --git a/devtools/client/debugger/src/workers/search/moz.build b/devtools/client/debugger/src/workers/search/moz.build
new file mode 100644
index 0000000000..b7223ac81a
--- /dev/null
+++ b/devtools/client/debugger/src/workers/search/moz.build
@@ -0,0 +1,10 @@
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+DIRS += []
+
+CompiledModules(
+ "index.js",
+)
diff --git a/devtools/client/debugger/src/workers/search/project-search.js b/devtools/client/debugger/src/workers/search/project-search.js
new file mode 100644
index 0000000000..f3751b57c4
--- /dev/null
+++ b/devtools/client/debugger/src/workers/search/project-search.js
@@ -0,0 +1,70 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Maybe reuse file search's functions?
+
+import getMatches from "./get-matches";
+
+export function findSourceMatches(content, queryText, options) {
+ if (queryText == "") {
+ return [];
+ }
+
+ const text = content.value;
+ const lines = text.split("\n");
+
+ return getMatches(queryText, text, options).map(({ line, ch, match }) => {
+ const { value, matchIndex } = truncateLine(lines[line], ch);
+ return {
+ line: line + 1,
+ column: ch,
+
+ matchIndex,
+ match,
+ value,
+ };
+ });
+}
+
+// This is used to find start of a word, so that cropped string look nice
+const startRegex = /([ !@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?])/g;
+// Similarly, find
+const endRegex = new RegExp(
+ [
+ "([ !@#$%^&*()_+-=[]{};':\"\\|,.<>/?])",
+ '[^ !@#$%^&*()_+-=[]{};\':"\\|,.<>/?]*$"/',
+ ].join("")
+);
+// For texts over 100 characters this truncates the text (for display)
+// around the context of the matched text.
+function truncateLine(text, column) {
+ if (text.length < 100) {
+ return {
+ matchIndex: column,
+ value: text,
+ };
+ }
+
+ // Initially take 40 chars left to the match
+ const offset = Math.max(column - 40, 0);
+ // 400 characters should be enough to figure out the context of the match
+ const truncStr = text.slice(offset, column + 400);
+ let start = truncStr.search(startRegex);
+ let end = truncStr.search(endRegex);
+
+ if (start > column) {
+ // No word separator found before the match, so we take all characters
+ // before the match
+ start = -1;
+ }
+ if (end < column) {
+ end = truncStr.length;
+ }
+ const value = truncStr.slice(start + 1, end);
+
+ return {
+ matchIndex: column - start - offset - 1,
+ value,
+ };
+}
diff --git a/devtools/client/debugger/src/workers/search/tests/get-matches.spec.js b/devtools/client/debugger/src/workers/search/tests/get-matches.spec.js
new file mode 100644
index 0000000000..30b0ce316d
--- /dev/null
+++ b/devtools/client/debugger/src/workers/search/tests/get-matches.spec.js
@@ -0,0 +1,99 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import getMatches from "../get-matches";
+
+describe("search", () => {
+ describe("getMatches", () => {
+ it("gets basic string match", () => {
+ const text = "the test string with test in it multiple times test.";
+ const query = "test";
+ const matchLocations = getMatches(query, text, {
+ caseSensitive: true,
+ wholeWord: false,
+ regexMatch: false,
+ });
+ expect(matchLocations).toHaveLength(3);
+ });
+
+ it("gets basic string match case-sensitive", () => {
+ const text = "the Test string with test in it multiple times test.";
+ const query = "Test";
+ const matchLocations = getMatches(query, text, {
+ caseSensitive: true,
+ wholeWord: false,
+ regexMatch: false,
+ });
+ expect(matchLocations).toHaveLength(1);
+ });
+
+ it("gets whole word string match", () => {
+ const text = "the test string test in it multiple times whoatestthe.";
+ const query = "test";
+ const matchLocations = getMatches(query, text, {
+ caseSensitive: true,
+ wholeWord: true,
+ regexMatch: false,
+ });
+ expect(matchLocations).toHaveLength(2);
+ });
+
+ it("gets regex match", () => {
+ const text = "the test string test in it multiple times whoatestthe.";
+ const query = "(\\w+)\\s+(\\w+)";
+ const matchLocations = getMatches(query, text, {
+ caseSensitive: true,
+ wholeWord: false,
+ regexMatch: true,
+ });
+ expect(matchLocations).toHaveLength(4);
+ });
+
+ it("doesnt fail on empty data", () => {
+ const text = "";
+ const query = "";
+ const matchLocations = getMatches(query, text, {
+ caseSensitive: true,
+ wholeWord: false,
+ regexMatch: true,
+ });
+ expect(matchLocations).toHaveLength(0);
+ });
+
+ it("fails gracefully when the line is too long", () => {
+ const text = Array(100002).join("x");
+ const query = "query";
+ const matchLocations = getMatches(query, text, {
+ caseSensitive: true,
+ wholeWord: false,
+ regexMatch: true,
+ });
+ expect(matchLocations).toHaveLength(0);
+ });
+
+ // regression test for #6896
+ it("doesn't crash on the regex 'a*'", () => {
+ const text = "abc";
+ const query = "a*";
+ const matchLocations = getMatches(query, text, {
+ caseSensitive: true,
+ wholeWord: false,
+ regexMatch: true,
+ });
+ expect(matchLocations).toHaveLength(4);
+ });
+
+ // regression test for #6896
+ it("doesn't crash on the regex '^'", () => {
+ const text = "012";
+ const query = "^";
+ const matchLocations = getMatches(query, text, {
+ caseSensitive: true,
+ wholeWord: false,
+ regexMatch: true,
+ });
+ expect(matchLocations).toHaveLength(1);
+ });
+ });
+});
diff --git a/devtools/client/debugger/src/workers/search/worker.js b/devtools/client/debugger/src/workers/search/worker.js
new file mode 100644
index 0000000000..b452697516
--- /dev/null
+++ b/devtools/client/debugger/src/workers/search/worker.js
@@ -0,0 +1,9 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+import getMatches from "./get-matches";
+import { findSourceMatches } from "./project-search";
+import { workerHandler } from "../../../../shared/worker-utils";
+
+self.onmessage = workerHandler({ getMatches, findSourceMatches });
diff --git a/devtools/client/debugger/test/mochitest/browser_aj.toml b/devtools/client/debugger/test/mochitest/browser_aj.toml
new file mode 100644
index 0000000000..cbedf75eae
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_aj.toml
@@ -0,0 +1,300 @@
+[DEFAULT]
+tags = "devtools"
+subsuite = "devtools"
+skip-if = [
+ "asan", # Frequent failures when opening tabs due to OOM issues, bug 1760260
+]
+support-files = [
+ "examples/*",
+ "integration-tests/*",
+ "head.js",
+ "shared-head.js",
+ "!/devtools/client/framework/browser-toolbox/test/helpers-browser-toolbox.js",
+ "!/devtools/client/inspector/test/head.js",
+ "!/devtools/client/inspector/test/shared-head.js",
+ "!/devtools/client/shared/test/shared-head.js",
+ "!/devtools/client/shared/test/telemetry-test-helpers.js",
+ "!/devtools/client/shared/test/highlighter-test-actor.js",
+ "!/devtools/client/webconsole/test/browser/shared-head.js",
+]
+prefs = [
+ "dom.ipc.processPrelaunch.enabled=false", # Disable randomly spawning processes during tests. After enabling windowless service workers, a process spawning will trigger an update of the service workers list which can fail the test if it occurs during shutdown (unhandled promise rejection).
+ "devtools.debugger.features.javascript-tracing=true", # This pref has to be set before the process starts
+]
+
+["browser_dbg-async-stepping.js"]
+
+["browser_dbg-asyncstacks.js"]
+
+["browser_dbg-audiocontext.js"]
+
+["browser_dbg-backgroundtask-debugging.js"]
+skip-if = ["asan"] # Bug 1591064
+
+["browser_dbg-bfcache.js"]
+
+["browser_dbg-blackbox-all.js"]
+
+["browser_dbg-blackbox-original.js"]
+
+["browser_dbg-blackbox.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-breaking-from-console.js"]
+skip-if = ["debug"] # Window leaks: bug 1575332
+
+["browser_dbg-breaking.js"]
+
+["browser_dbg-breakpoint-skipping-console.js"]
+
+["browser_dbg-breakpoint-skipping.js"]
+
+["browser_dbg-breakpoints-actions.js"]
+
+["browser_dbg-breakpoints-columns.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-breakpoints-cond-functional.js"]
+
+["browser_dbg-breakpoints-cond-shortcut.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-breakpoints-cond-source-maps.js"]
+
+["browser_dbg-breakpoints-cond-ui-state.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-breakpoints-debugger-statement.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-breakpoints-duplicate-functions.js"]
+
+["browser_dbg-breakpoints-in-evaled-sources.js"]
+
+["browser_dbg-breakpoints-list.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-breakpoints-popup.js"]
+skip-if = [
+ "os == 'linux' && debug", # Bug 1750199
+ "tsan", # Bug 1750199
+ "apple_catalina && !debug", # Bug 1767705
+]
+
+["browser_dbg-breakpoints-reloading-with-source-changes.js"]
+
+["browser_dbg-breakpoints-reloading.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-breakpoints-same-file-per-target.js"]
+
+["browser_dbg-breakpoints-scroll-to-log.js"]
+
+["browser_dbg-breakpoints-sourcemap-with-sections.js"]
+
+["browser_dbg-breakpoints.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-browser-toolbox-unselected-pause.js"]
+skip-if = [
+ "asan", # Bug 1591064
+ "os == 'win' && fission && debug", # intermittent on fission, Bug 1720165 - test timed out
+]
+
+["browser_dbg-browser-toolbox-workers.js"]
+skip-if = [
+ "asan", # Bug 1591064, parent intercept mode is needed
+ "!nightly_build", # bug 1588154, Disable frequent fission intermittents
+ "fission", # Bug 1675020
+]
+
+["browser_dbg-call-stack.js"]
+
+["browser_dbg-chrome-create.js"]
+skip-if = ["verify && !debug && os == 'linux'"]
+
+["browser_dbg-console-async.js"]
+
+["browser_dbg-console-eval.js"]
+
+["browser_dbg-console-link.js"]
+
+["browser_dbg-console-map-bindings.js"]
+
+["browser_dbg-console.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-content-script-sources.js"]
+skip-if = ["os == 'win' && ccov"] # Bug 1424154
+
+["browser_dbg-continue-to-here-click.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+skip-if = ["os == 'win'"]
+
+["browser_dbg-continue-to-here.js"]
+
+["browser_dbg-custom-formatters.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-debug-line.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-debugger-buttons.js"]
+
+["browser_dbg-dom-mutation-breakpoints-fission.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-dom-mutation-breakpoints.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-eager-eval-skip-pause.js"]
+
+["browser_dbg-editor-exception.js"]
+
+["browser_dbg-editor-gutter.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-editor-highlight.js"]
+
+["browser_dbg-editor-mode.js"]
+
+["browser_dbg-editor-scroll.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-editor-select.js"]
+fail-if = ["a11y_checks"] # Bug 1870062 clicked element may not be focusable and/or labeled
+
+["browser_dbg-ember-original-variable-mapping-notifications.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+skip-if = ["debug"] # Window leaks: bug 1575332
+
+["browser_dbg-es-module-worker.js"]
+
+["browser_dbg-eval-throw.js"]
+
+["browser_dbg-event-breakpoints-fission.js"]
+
+["browser_dbg-event-breakpoints.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-event-handler.js"]
+
+["browser_dbg-expressions-error.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-expressions-focus.js"]
+
+["browser_dbg-expressions-thread.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+skip-if = ["!fission"] # threads panel only shows remote frame when fission is enabled.
+
+["browser_dbg-expressions-watch.js"]
+
+["browser_dbg-expressions.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-extension-inspectedWindow-debugger-statement.js"]
+
+["browser_dbg-features-asm.js"]
+
+["browser_dbg-features-breakable-lines.js"]
+
+["browser_dbg-features-breakable-positions.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+skip-if = ["win11_2009"] # Bug 1798331
+
+["browser_dbg-features-breakpoints.js"]
+
+["browser_dbg-features-browser-toolbox-source-tree.js"]
+skip-if = [
+ "asan", # Bug 1591064
+ "win11_2009", # Bug 1798331
+]
+
+["browser_dbg-features-source-text-content.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-features-source-tree.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-features-tabs.js"]
+
+["browser_dbg-features-wasm.js"]
+
+["browser_dbg-fission-frame-breakpoint.js"]
+skip-if = ["!fission"] # threads panel only shows remote frame when fission is enabled.
+
+["browser_dbg-fission-frame-pause-exceptions.js"]
+
+["browser_dbg-fission-frame-sources.js"]
+
+["browser_dbg-fission-project-search.js"]
+
+["browser_dbg-fission-switch-target.js"]
+
+["browser_dbg-gc-breakpoint-positions.js"]
+
+["browser_dbg-gc-sources.js"]
+
+["browser_dbg-go-to-line.js"]
+
+["browser_dbg-html-breakpoints.js"]
+skip-if = [
+ "os == 'linux' && debug", # Bug 1802862
+ "tsan", # Bug 1802862
+]
+
+["browser_dbg-idb-run-to-completion.js"]
+
+["browser_dbg-iframes.js"]
+
+["browser_dbg-inline-cache.js"]
+skip-if = ["ccov && os == 'win'"] # Bug 1443132
+
+["browser_dbg-inline-exceptions-inline-script.js"]
+
+["browser_dbg-inline-exceptions-position.js"]
+
+["browser_dbg-inline-exceptions.js"]
+
+["browser_dbg-inline-preview.js"]
+skip-if = ["true"] # bug 1607636
+
+["browser_dbg-inline-script-offset.js"]
+
+["browser_dbg-inspector-integration.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-integration-reloading-compressed-sourcemaps.js"]
+
+["browser_dbg-integration-reloading-uncompressed-sourcemaps.js"]
+
+["browser_dbg-javascript-tracer.js"]
+skip-if = [
+ "tsan", # Bug 1832135
+]
+
+["browser_dbg-javascript-tracer-function-returns.js"]
+skip-if = [
+ "tsan", # Bug 1832135
+]
+
+["browser_dbg-javascript-tracer-next-interation.js"]
+skip-if = [
+ "tsan", # Bug 1832135
+]
+
+["browser_dbg-javascript-tracer-next-load.js"]
+skip-if = [
+ "tsan", # Bug 1832135
+]
+
+["browser_dbg-javascript-tracer-values.js"]
+skip-if = [
+ "tsan", # Bug 1832135
+]
+
+["browser_dbg-javascript-tracer-worker.js"]
+skip-if = [
+ "tsan", # Bug 1832135
+]
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-async-stepping.js b/devtools/client/debugger/test/mochitest/browser_dbg-async-stepping.js
new file mode 100644
index 0000000000..d04783d666
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-async-stepping.js
@@ -0,0 +1,23 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests async stepping will step over await statements
+
+"use strict";
+
+add_task(async function test() {
+ const dbg = await initDebugger("doc-async.html", "async.js");
+
+ await selectSource(dbg, "async.js");
+ await addBreakpoint(dbg, "async.js", 8);
+ invokeInTab("main");
+
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, findSource(dbg, "async.js").id, 8);
+
+ await stepOver(dbg);
+ assertPausedAtSourceAndLine(dbg, findSource(dbg, "async.js").id, 9);
+
+ await assertBreakpoint(dbg, 8);
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-asyncstacks.js b/devtools/client/debugger/test/mochitest/browser_dbg-asyncstacks.js
new file mode 100644
index 0000000000..f99eb66496
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-asyncstacks.js
@@ -0,0 +1,21 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests that async stacks include the async separator
+
+"use strict";
+
+add_task(async function () {
+ pushPref("devtools.debugger.features.async-captured-stacks", true);
+ const dbg = await initDebugger("doc-frames-async.html");
+
+ invokeInTab("main");
+ await waitForPaused(dbg);
+
+ is(findElement(dbg, "frame", 1).innerText, "sleep\ndoc-frames-async.html:13");
+ is(
+ findElement(dbg, "frame", 2).innerText,
+ "async\nmain\ndoc-frames-async.html:17"
+ );
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-audiocontext.js b/devtools/client/debugger/test/mochitest/browser_dbg-audiocontext.js
new file mode 100644
index 0000000000..f77fedbe2a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-audiocontext.js
@@ -0,0 +1,20 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test the AudioContext are paused and resume appropriately when using the
+// debugger.
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-audiocontext.html");
+
+ await invokeInTab("myFunction");
+ await invokeInTab("suspendAC");
+ invokeInTab("debuggerStatement");
+ await waitForPaused(dbg);
+ await resume(dbg);
+ await invokeInTab("checkACState");
+ ok(true, "No AudioContext state transition are caused by the debugger");
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-backgroundtask-debugging.js b/devtools/client/debugger/test/mochitest/browser_dbg-backgroundtask-debugging.js
new file mode 100644
index 0000000000..6e0f62deb9
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-backgroundtask-debugging.js
@@ -0,0 +1,161 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Tests that `--backgroundtask` debugging works.
+ *
+ * This test is subtle. We launch a `--backgroundtask` with `--jsdebugger` and
+ * `--wait-for-jsdebugger` within the test. The background task infrastructure
+ * launches a browser toolbox, and the test connects to that browser toolbox
+ * instance. The test drives the instance, verifying that the automatically
+ * placed breakpoint paused execution. It then closes the browser toolbox,
+ * which resumes the execution and the task exits.
+ *
+ * In the future, it would be nice to change the task's running environment, for
+ * example by redefining a failing exit code to exit code 0. Attempts to do
+ * this have so far not been robust in automation.
+ */
+
+"use strict";
+
+requestLongerTimeout(4);
+
+Services.scriptloader.loadSubScript(
+ "chrome://mochitests/content/browser/devtools/client/framework/browser-toolbox/test/helpers-browser-toolbox.js",
+ this
+);
+
+const { BackgroundTasksTestUtils } = ChromeUtils.importESModule(
+ "resource://testing-common/BackgroundTasksTestUtils.sys.mjs"
+);
+BackgroundTasksTestUtils.init(this);
+const do_backgroundtask = BackgroundTasksTestUtils.do_backgroundtask.bind(
+ BackgroundTasksTestUtils
+);
+
+add_task(async function test_backgroundtask_debugger() {
+ // In this test, the background task infrastructure launches the browser
+ // toolbox. The browser toolbox profile prefs are taken from the default
+ // profile (which is the standard place for background tasks to look for
+ // task-specific configuration). The current test profile will be
+ // considered the default profile by the background task apparatus, so this
+ // is how we configure the browser toolbox profile prefs.
+ //
+ // These prefs are not set for the background task under test directly: the
+ // relevant prefs are set in the background task defaults.
+ await pushPref("devtools.chrome.enabled", true);
+ await pushPref("devtools.debugger.remote-enabled", true);
+ await pushPref("devtools.browsertoolbox.enable-test-server", true);
+ await pushPref("devtools.debugger.prompt-connection", false);
+
+ // Before we start the background task, the preference file must be flushed to disk.
+ Services.prefs.savePrefFile(null);
+
+ // This invokes the test-only background task `BackgroundTask_jsdebugger.jsm`.
+ const p = do_backgroundtask("jsdebugger", {
+ extraArgs: [`--jsdebugger`, "--wait-for-jsdebugger"],
+ extraEnv: {
+ // Force the current test profile to be considered the default profile.
+ MOZ_BACKGROUNDTASKS_DEFAULT_PROFILE_PATH: Services.dirsvc.get(
+ "ProfD",
+ Ci.nsIFile
+ ).path,
+ },
+ });
+
+ ok(true, "Launched background task");
+
+ const existingProcessClose = async () => {
+ const exitCode = await p;
+ return { exitCode };
+ };
+ const ToolboxTask = await initBrowserToolboxTask({ existingProcessClose });
+
+ await ToolboxTask.spawn(selectors, () => {
+ const {
+ LocalizationHelper,
+ } = require("resource://devtools/shared/l10n.js");
+ // We have to expose this symbol as global for waitForSelectedSource
+ this.DEBUGGER_L10N = new LocalizationHelper(
+ "devtools/client/locales/debugger.properties"
+ );
+ });
+
+ await ToolboxTask.importFunctions({
+ checkEvaluateInTopFrame,
+ evaluateInTopFrame,
+ createDebuggerContext,
+ expandAllScopes,
+ findElement,
+ findElementWithSelector,
+ getSelector,
+ getVisibleSelectedFrameLine,
+ isPaused,
+ resume,
+ stepOver,
+ toggleObjectInspectorNode,
+ toggleScopeNode,
+ waitForElement,
+ waitForLoadedScopes,
+ waitForPaused,
+ waitForResumed,
+ waitForSelectedSource,
+ waitForState,
+ waitUntil,
+ createLocation,
+ getCM,
+ log: (msg, data) =>
+ console.log(`${msg} ${!data ? "" : JSON.stringify(data)}`),
+ info: (msg, data) =>
+ console.info(`${msg} ${!data ? "" : JSON.stringify(data)}`),
+ });
+
+ // ToolboxTask.spawn passes input arguments by stringify-ing them via string
+ // concatenation. But functions do not survive this process, so we manually
+ // recreate (in the toolbox process) the single function the `expandAllScopes`
+ // invocation in this test needs.
+ await ToolboxTask.spawn(selectors, async _selectors => {
+ this.selectors = _selectors;
+ this.selectors.scopeNode = i =>
+ `.scopes-list .tree-node:nth-child(${i}) .object-label`;
+ });
+
+ // The debugger should automatically be selected.
+ await ToolboxTask.spawn(null, async () => {
+ await waitUntil(() => gToolbox.currentToolId == "jsdebugger");
+ });
+ ok(true, "Debugger selected");
+
+ // The debugger should automatically pause.
+ await ToolboxTask.spawn(null, async () => {
+ try {
+ /* global gToolbox */
+ // Wait for the debugger to finish loading.
+ await gToolbox.getPanelWhenReady("jsdebugger");
+
+ const dbg = createDebuggerContext(gToolbox);
+
+ // Scopes are supposed to be automatically expanded, but with
+ // `setBreakpointOnLoad` that doesn't seem to be happening. Explicitly
+ // expand scopes so that they are expanded for `waitForPaused`.
+ await expandAllScopes(dbg);
+
+ await waitForPaused(dbg);
+
+ if (!gToolbox.isHighlighted("jsdebugger")) {
+ throw new Error("Debugger not highlighted");
+ }
+ } catch (e) {
+ console.log("Caught exception in spawn", e);
+ throw e;
+ }
+ });
+ ok(true, "Paused in backgroundtask script");
+
+ // If we `resume`, then the task completes and the Browser Toolbox exits,
+ // which isn't handled cleanly by `spawn`, resulting in a test time out. This
+ // closes the toolbox "from the inside", which continues execution. The test
+ // then waits for the background task to terminate with exit code 0.
+ await ToolboxTask.destroy();
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-bfcache.js b/devtools/client/debugger/test/mochitest/browser_dbg-bfcache.js
new file mode 100644
index 0000000000..d66bd294bc
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-bfcache.js
@@ -0,0 +1,98 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test the debugger when navigating using the BFCache.
+
+"use strict";
+
+PromiseTestUtils.allowMatchingRejectionsGlobally(/Connection closed/);
+
+add_task(async function () {
+ info("Run test with bfcacheInParent DISABLED");
+ await pushPref("fission.bfcacheInParent", false);
+ await testSourcesOnNavigation();
+ await testDebuggerPauseStateOnNavigation();
+
+ // bfcacheInParent only works if sessionHistoryInParent is enable
+ // so only test it if both settings are enabled.
+ if (Services.appinfo.sessionHistoryInParent) {
+ info("Run test with bfcacheInParent ENABLED");
+ await pushPref("fission.bfcacheInParent", true);
+ await testSourcesOnNavigation();
+ await testDebuggerPauseStateOnNavigation();
+ }
+});
+
+async function testSourcesOnNavigation() {
+ info(
+ "Test that sources appear in the debugger when navigating using the BFCache"
+ );
+ const dbg = await initDebugger("doc-bfcache1.html");
+
+ await navigate(dbg, "doc-bfcache2.html", "doc-bfcache2.html");
+
+ invokeInTab("goBack");
+ await waitForSources(dbg, "doc-bfcache1.html");
+
+ invokeInTab("goForward");
+ await waitForSources(dbg, "doc-bfcache2.html");
+ ok(true, "Found sources after BFCache navigations");
+
+ await dbg.toolbox.closeToolbox();
+}
+
+async function testDebuggerPauseStateOnNavigation() {
+ info("Test the debugger pause state when navigating using the BFCache");
+
+ info("Open debugger on the first page");
+ const dbg = await initDebugger("doc-bfcache1.html");
+
+ await addBreakpoint(dbg, "doc-bfcache1.html", 4);
+
+ info("Navigate to the second page");
+ await navigate(dbg, "doc-bfcache2.html");
+ await waitForSources(dbg, "doc-bfcache2.html");
+
+ info("Navigate back to the first page (which should resurect from bfcache)");
+ await goBack(`${EXAMPLE_URL}doc-bfcache1.html`);
+ await waitForSources(dbg, "doc-bfcache1.html");
+
+ // We paused when navigation back to bfcache1.html
+ // The previous navigation will prevent the page from completing its load.
+ // And we will do the same with this reload, which will pause page load
+ // and we will navigate forward and never complete the reload page load.
+ info("Reload the first page (which was in bfcache)");
+ await reloadWhenPausedBeforePageLoaded(dbg);
+ await waitForPaused(dbg);
+
+ ok(dbg.toolbox.isHighlighted("jsdebugger"), "Debugger is highlighted");
+
+ info(
+ "Navigate forward to the second page (which should also coming from bfcache)"
+ );
+ await goForward(`${EXAMPLE_URL}doc-bfcache2.html`);
+
+ await waitUntil(() => !dbg.toolbox.isHighlighted("jsdebugger"));
+ ok(true, "Debugger is not highlighted");
+
+ dbg.toolbox.closeToolbox();
+}
+
+async function goBack(expectedUrl) {
+ const onLocationChange = BrowserTestUtils.waitForLocationChange(
+ gBrowser,
+ expectedUrl
+ );
+ gBrowser.goBack();
+ await onLocationChange;
+}
+
+async function goForward(expectedUrl) {
+ const onLocationChange = BrowserTestUtils.waitForLocationChange(
+ gBrowser,
+ expectedUrl
+ );
+ gBrowser.goForward();
+ await onLocationChange;
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-blackbox-all.js b/devtools/client/debugger/test/mochitest/browser_dbg-blackbox-all.js
new file mode 100644
index 0000000000..8080d3c145
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-blackbox-all.js
@@ -0,0 +1,215 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// This contains tests for
+// 1) The context menu items that blackboxes multiple files in the Sources Panel.
+// Checks if submenu works correctly for options:
+// - 'Un/Blackbox files in this group'
+// - 'Un/Blackbox files outside this group'
+// - 'Un/Blackbox files in this directory'
+// - 'Un/Blackbox files outside this directory'
+// 2) The context menu item to hide/show the blackboxed files.
+
+"use strict";
+
+const SOURCE_FILES = {
+ nestedSource: "nested-source.js",
+ codeReload1: "code_reload_1.js",
+};
+
+const NODE_SELECTORS = {
+ nodeBlackBoxAll: "#node-blackbox-all",
+ nodeBlackBoxAllInside: "#node-blackbox-all-inside",
+ nodeUnBlackBoxAllInside: "#node-unblackbox-all-inside",
+ nodeBlackBoxAllOutside: "#node-blackbox-all-outside",
+ nodeUnBlackBoxAllOutside: "#node-unblackbox-all-outside",
+};
+
+add_task(async function testBlackBoxOnMultipleFiles() {
+ const dbg = await initDebugger(
+ "doc-blackbox-all.html",
+ SOURCE_FILES.nestedSource,
+ SOURCE_FILES.codeReload1
+ );
+
+ // Expand the SourceTree and wait for all sources to be visible,
+ // so that we can assert the visible state of blackboxing in the source tree.
+ await waitForSourcesInSourceTree(dbg, Object.values(SOURCE_FILES));
+
+ info("Loads the source file and sets a breakpoint at line 2.");
+ await selectSource(dbg, SOURCE_FILES.nestedSource);
+ await addBreakpoint(dbg, SOURCE_FILES.nestedSource, 2);
+
+ info("Selecting the source will highlight it and expand the tree down to it");
+ await waitForAllElements(dbg, "sourceTreeFolderNode", 3);
+ const sourceTreeFolderNodeEls = findAllElements(dbg, "sourceTreeFolderNode");
+ const sourceTreeRootNodeEl = findElement(dbg, "sourceTreeRootNode");
+
+ info("Blackbox files in this directory.");
+ rightClickEl(dbg, sourceTreeFolderNodeEls[1]);
+ await waitForContextMenu(dbg);
+ await openContextMenuSubmenu(dbg, NODE_SELECTORS.nodeBlackBoxAll);
+ await assertContextMenuLabel(
+ dbg,
+ NODE_SELECTORS.nodeBlackBoxAllInside,
+ "Ignore files in this directory"
+ );
+ await assertContextMenuLabel(
+ dbg,
+ NODE_SELECTORS.nodeBlackBoxAllOutside,
+ "Ignore files outside this directory"
+ );
+ selectContextMenuItem(dbg, NODE_SELECTORS.nodeBlackBoxAllInside);
+ await waitForDispatch(dbg.store, "BLACKBOX_WHOLE_SOURCES");
+ await waitForBlackboxCount(dbg, 1);
+ await waitForRequestsToSettle(dbg);
+
+ assertSourceNodeIsBlackBoxed(dbg, SOURCE_FILES.nestedSource, true);
+ assertSourceNodeIsBlackBoxed(dbg, SOURCE_FILES.codeReload1, false);
+
+ info("The invoked function is blackboxed and the debugger does not pause.");
+ invokeInTab("computeSomething");
+ assertNotPaused(dbg);
+
+ info("Unblackbox files outside this directory.");
+ rightClickEl(dbg, sourceTreeFolderNodeEls[2]);
+ await waitForContextMenu(dbg);
+ await openContextMenuSubmenu(dbg, NODE_SELECTORS.nodeBlackBoxAll);
+ await assertContextMenuLabel(
+ dbg,
+ NODE_SELECTORS.nodeBlackBoxAllInside,
+ "Ignore files in this directory"
+ );
+ await assertContextMenuLabel(
+ dbg,
+ NODE_SELECTORS.nodeUnBlackBoxAllOutside,
+ "Unignore files outside this directory"
+ );
+ selectContextMenuItem(dbg, NODE_SELECTORS.nodeUnBlackBoxAllOutside);
+ await waitForDispatch(dbg.store, "UNBLACKBOX_WHOLE_SOURCES");
+ await waitForBlackboxCount(dbg, 0);
+ await waitForRequestsToSettle(dbg);
+ info("Wait for any breakpoints in the source to get enabled");
+ await waitForDispatch(dbg.store, "SET_BREAKPOINT");
+
+ assertSourceNodeIsBlackBoxed(dbg, SOURCE_FILES.nestedSource, false);
+ assertSourceNodeIsBlackBoxed(dbg, SOURCE_FILES.codeReload1, false);
+
+ info("All sources are unblackboxed and the debugger pauses on line 2.");
+ invokeInTab("computeSomething");
+ await waitForPaused(dbg);
+ await resume(dbg);
+
+ info("Blackbox files in this group.");
+ rightClickEl(dbg, sourceTreeRootNodeEl);
+ await waitForContextMenu(dbg);
+ await assertContextMenuLabel(
+ dbg,
+ NODE_SELECTORS.nodeBlackBoxAllInside,
+ "Ignore files in this group"
+ );
+ selectContextMenuItem(dbg, NODE_SELECTORS.nodeBlackBoxAllInside);
+ await waitForBlackboxCount(dbg, 2);
+ await waitForRequestsToSettle(dbg);
+
+ assertSourceNodeIsBlackBoxed(dbg, SOURCE_FILES.nestedSource, true);
+ assertSourceNodeIsBlackBoxed(dbg, SOURCE_FILES.codeReload1, true);
+
+ info("Unblackbox files in this group.");
+ rightClickEl(dbg, sourceTreeRootNodeEl);
+ await waitForContextMenu(dbg);
+ await assertContextMenuLabel(
+ dbg,
+ NODE_SELECTORS.nodeUnBlackBoxAllInside,
+ "Unignore files in this group"
+ );
+ selectContextMenuItem(dbg, NODE_SELECTORS.nodeUnBlackBoxAllInside);
+ await waitForBlackboxCount(dbg, 0);
+ await waitForRequestsToSettle(dbg);
+
+ assertSourceNodeIsBlackBoxed(dbg, SOURCE_FILES.nestedSource, false);
+ assertSourceNodeIsBlackBoxed(dbg, SOURCE_FILES.codeReload1, false);
+});
+
+add_task(async function testHideAndShowBlackBoxedFiles() {
+ Services.prefs.setBoolPref("devtools.debugger.hide-ignored-sources", false);
+
+ const dbg = await initDebugger(
+ "doc-blackbox-all.html",
+ SOURCE_FILES.nestedSource,
+ SOURCE_FILES.codeReload1
+ );
+
+ await waitForSourcesInSourceTree(dbg, Object.values(SOURCE_FILES));
+ await selectSource(dbg, SOURCE_FILES.nestedSource);
+ clickElement(dbg, "blackbox");
+ await waitForDispatch(dbg.store, "BLACKBOX_WHOLE_SOURCES");
+
+ info("Assert and click the hide ignored files button in the settings menu");
+ await toggleDebbuggerSettingsMenuItem(dbg, {
+ className: ".debugger-settings-menu-item-hide-ignored-sources",
+ isChecked: false,
+ });
+
+ info("Wait until ignored sources are no longer visible");
+ await waitUntil(
+ () => !findSourceNodeWithText(dbg, SOURCE_FILES.nestedSource)
+ );
+
+ is(
+ Services.prefs.getBoolPref("devtools.debugger.hide-ignored-sources"),
+ true,
+ "Hide ignored files is enabled"
+ );
+
+ is(
+ dbg.win.document.querySelector(".source-list-footer").innerText,
+ "Ignored sources are hidden.\nShow all sources",
+ "Notification is visible with the correct message"
+ );
+
+ info("Assert that newly ignored files are automatically hidden");
+ await selectSource(dbg, SOURCE_FILES.codeReload1);
+ await triggerSourceTreeContextMenu(
+ dbg,
+ findSourceNodeWithText(dbg, SOURCE_FILES.codeReload1),
+ "#node-menu-blackbox"
+ );
+ await waitForDispatch(dbg.store, "BLACKBOX_WHOLE_SOURCES");
+ await waitUntil(() => !findSourceNodeWithText(dbg, SOURCE_FILES.codeReload1));
+
+ info("Show the hidden ignored files using the button in the notification");
+ clickElementWithSelector(dbg, ".source-list-footer button");
+
+ info("Wait until ignored sources are visible");
+ await waitUntil(() => findSourceNodeWithText(dbg, SOURCE_FILES.nestedSource));
+
+ is(
+ Services.prefs.getBoolPref("devtools.debugger.hide-ignored-sources"),
+ false,
+ "Hide ignored files is disabled"
+ );
+
+ ok(
+ !document.querySelector(".source-list-footer"),
+ "Notification is no longer visible"
+ );
+});
+
+function waitForBlackboxCount(dbg, count) {
+ return waitForState(
+ dbg,
+ state => Object.keys(dbg.selectors.getBlackBoxRanges()).length === count
+ );
+}
+
+function assertSourceNodeIsBlackBoxed(dbg, sourceFilename, shouldBeBlackBoxed) {
+ const treeItem = findSourceNodeWithText(dbg, sourceFilename);
+ ok(treeItem, `Found tree item for ${sourceFilename}`);
+ is(
+ !!treeItem.querySelector(".img.blackBox"),
+ shouldBeBlackBoxed,
+ `${sourceFilename} is ${shouldBeBlackBoxed ? "" : "not"} blackboxed`
+ );
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-blackbox-original.js b/devtools/client/debugger/test/mochitest/browser_dbg-blackbox-original.js
new file mode 100644
index 0000000000..b9e06e4121
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-blackbox-original.js
@@ -0,0 +1,53 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// This source map does not have source contents, so it's fetched separately
+
+"use strict";
+
+add_task(async function () {
+ await pushPref("devtools.debugger.map-scopes-enabled", true);
+ // NOTE: the CORS call makes the test run times inconsistent
+ const dbg = await initDebugger(
+ "doc-sourcemaps3.html",
+ "bundle.js",
+ "sorted.js",
+ "test.js"
+ );
+
+ const sortedSrc = findSource(dbg, "sorted.js");
+ await selectSource(dbg, sortedSrc);
+ await clickElement(dbg, "blackbox");
+ await waitForDispatch(dbg.store, "BLACKBOX_WHOLE_SOURCES");
+
+ const sourceTab = findElementWithSelector(dbg, ".source-tab.active");
+ ok(
+ sourceTab.querySelector(".img.blackBox"),
+ "Source tab has a blackbox icon"
+ );
+
+ const treeItem = findElementWithSelector(dbg, ".tree-node.focused");
+ ok(
+ treeItem.querySelector(".img.blackBox"),
+ "Source tree item has a blackbox icon"
+ );
+
+ // breakpoint at line 38 in sorted
+ await addBreakpoint(dbg, sortedSrc, 38);
+ // invoke test
+ invokeInTab("test");
+ // should not pause
+ assertNotPaused(dbg);
+
+ // unblackbox
+ await clickElement(dbg, "blackbox");
+ await waitForDispatch(dbg.store, "UNBLACKBOX_WHOLE_SOURCES");
+
+ // click on test
+ invokeInTab("test");
+ // should pause
+ await waitForPaused(dbg);
+
+ ok(true, "blackbox works");
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-blackbox.js b/devtools/client/debugger/test/mochitest/browser_dbg-blackbox.js
new file mode 100644
index 0000000000..88dce529c9
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-blackbox.js
@@ -0,0 +1,732 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// This test covers all the blackboxing functionality relating to a selected
+// source open in the debugger editor.
+
+"use strict";
+
+requestLongerTimeout(5);
+
+const contextMenuItems = {
+ ignoreSource: { selector: "#node-menu-blackbox", label: "Ignore source" },
+ unignoreSource: { selector: "#node-menu-blackbox", label: "Unignore source" },
+ ignoreLines: { selector: "#node-menu-blackbox-lines", label: "Ignore lines" },
+ unignoreLines: {
+ selector: "#node-menu-blackbox-lines",
+ label: "Unignore lines",
+ },
+ ignoreLine: { selector: "#node-menu-blackbox-line", label: "Ignore line" },
+ unignoreLine: {
+ selector: "#node-menu-blackbox-line",
+ label: "Unignore line",
+ },
+};
+
+const SOURCE_IS_FULLY_IGNORED = "source";
+const SOURCE_LINES_ARE_IGNORED = "line";
+const SOURCE_IS_NOT_IGNORED = "none";
+
+// Tests basic functionality for blackbox source and blackbox single and multiple lines
+add_task(async function testAllBlackBox() {
+ // using the doc-command-click.html as it has a simple js file we can use
+ // testing.
+ const file = "simple4.js";
+ const dbg = await initDebugger("doc-command-click.html", file);
+
+ const source = findSource(dbg, file);
+
+ await selectSource(dbg, source);
+
+ await addBreakpoint(dbg, file, 8);
+
+ await testBlackBoxSource(dbg, source);
+ await testBlackBoxMultipleLines(dbg, source);
+ await testBlackBoxSingleLine(dbg, source);
+});
+
+// Test that the blackboxed lines are persisted accross reloads and still work accordingly.
+add_task(async function testBlackBoxOnReload() {
+ const file = "simple4.js";
+ const dbg = await initDebugger("doc-command-click.html", file);
+
+ const source = findSource(dbg, file);
+
+ await selectSource(dbg, source);
+
+ // Adding 2 breakpoints in funcB() and funcC() which
+ // would be hit in order.
+ await addBreakpoint(dbg, file, 8);
+ await addBreakpoint(dbg, file, 12);
+
+ info("Reload without any blackboxing to make all necesary postions are hit");
+ const onReloaded = reload(dbg, file);
+
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, source.id, 2);
+ await resume(dbg);
+
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, source.id, 8);
+ await resume(dbg);
+
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, source.id, 12);
+ await resume(dbg);
+
+ info("Wait for reload to complete after resume");
+ await onReloaded;
+
+ assertNotPaused(dbg);
+
+ info("Ignoring line 2 using the gutter context menu");
+ await openContextMenuInDebugger(dbg, "gutter", 2);
+ await selectBlackBoxContextMenuItem(dbg, "blackbox-line");
+
+ info("Ignoring line 7 to 9 using the editor context menu");
+ await selectEditorLinesAndOpenContextMenu(dbg, { startLine: 7, endLine: 9 });
+ await selectBlackBoxContextMenuItem(dbg, "blackbox-lines");
+
+ const onReloaded2 = reload(dbg, file);
+
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, source.id, 12);
+ await resume(dbg);
+ info("Wait for reload to complete after resume");
+ await onReloaded2;
+
+ assertNotPaused(dbg);
+
+ info(
+ "Check that the expected blackbox context menu state is correct across reload"
+ );
+
+ await assertEditorBlackBoxBoxContextMenuItems(dbg, {
+ blackboxedLine: 2,
+ nonBlackBoxedLine: 4,
+ blackBoxedLines: [7, 9],
+ nonBlackBoxedLines: [3, 4],
+ blackboxedSourceState: SOURCE_LINES_ARE_IGNORED,
+ });
+
+ await assertGutterBlackBoxBoxContextMenuItems(dbg, {
+ blackboxedLine: 2,
+ nonBlackBoxedLine: 4,
+ blackboxedSourceState: SOURCE_LINES_ARE_IGNORED,
+ });
+
+ await assertSourceTreeBlackBoxBoxContextMenuItems(dbg, {
+ blackBoxedSourceTreeNode: findSourceNodeWithText(dbg, "simple4.js"),
+ nonBlackBoxedSourceTreeNode: findSourceNodeWithText(dbg, "simple2.js"),
+ });
+});
+
+add_task(async function testBlackBoxOnToolboxRestart() {
+ const dbg = await initDebugger("doc-command-click.html", "simple4.js");
+ const source = findSource(dbg, "simple4.js");
+
+ await selectSource(dbg, source);
+
+ const onReloaded = reload(dbg, "simple4.js");
+ await waitForPaused(dbg);
+
+ info("Assert it paused at the debugger statement");
+ assertPausedAtSourceAndLine(dbg, source.id, 2);
+ await resume(dbg);
+ await onReloaded;
+
+ info("Ignoring line 2 using the gutter context menu");
+ await openContextMenuInDebugger(dbg, "gutter", 2);
+ await selectBlackBoxContextMenuItem(dbg, "blackbox-line");
+
+ await reloadBrowser();
+ // Wait a little bit incase of a pause
+ await wait(1000);
+
+ info("Assert that the debugger no longer pauses on the debugger statement");
+ assertNotPaused(dbg);
+
+ info("Close the toolbox");
+ await dbg.toolbox.closeToolbox();
+
+ info("Reopen the toolbox on the debugger");
+ const toolbox = await openToolboxForTab(gBrowser.selectedTab, "jsdebugger");
+ const dbg2 = createDebuggerContext(toolbox);
+ await waitForSelectedSource(dbg2, findSource(dbg2, "simple4.js"));
+
+ await reloadBrowser();
+ // Wait a little incase of a pause
+ await wait(1000);
+
+ info("Assert that debbuger still does not pause on the debugger statement");
+ assertNotPaused(dbg2);
+});
+
+async function testBlackBoxSource(dbg, source) {
+ info("Start testing blackboxing the whole source");
+
+ info("Assert the blackbox context menu items before any blackboxing is done");
+ // When the source is not blackboxed there are no blackboxed lines
+ await assertEditorBlackBoxBoxContextMenuItems(dbg, {
+ blackboxedLine: null,
+ nonBlackBoxedLine: 4,
+ blackBoxedLines: null,
+ nonBlackBoxedLines: [3, 4],
+ blackboxedSourceState: SOURCE_IS_NOT_IGNORED,
+ });
+
+ await assertGutterBlackBoxBoxContextMenuItems(dbg, {
+ blackboxedLine: null,
+ nonBlackBoxedLine: 4,
+ blackboxedSourceState: SOURCE_IS_NOT_IGNORED,
+ });
+
+ await assertSourceTreeBlackBoxBoxContextMenuItems(dbg, {
+ blackBoxedSourceTreeNode: null,
+ nonBlackBoxedSourceTreeNode: findSourceNodeWithText(dbg, "simple4.js"),
+ });
+
+ info(
+ "Blackbox the whole simple4.js source file using the editor context menu"
+ );
+ await openContextMenuInDebugger(dbg, "CodeMirrorLines");
+ await selectBlackBoxContextMenuItem(dbg, "blackbox");
+
+ info("Assert that all lines in the source are styled correctly");
+ assertIgnoredStyleInSourceLines(dbg, { hasBlackboxedLinesClass: true });
+
+ info("Assert that the source tree for simple4.js has the ignored style");
+ const node = findSourceNodeWithText(dbg, "simple4.js");
+ ok(
+ node.querySelector(".blackboxed"),
+ "simple4.js node does not have the ignored style"
+ );
+
+ invokeInTab("funcA");
+
+ info(
+ "The debugger statement on line 2 and the breakpoint on line 8 should not be hit"
+ );
+ assertNotPaused(dbg);
+
+ info("Assert the blackbox context menu items after blackboxing is done");
+ // When the whole source is blackboxed there are no nonBlackboxed lines
+ await assertEditorBlackBoxBoxContextMenuItems(dbg, {
+ blackboxedLine: 2,
+ nonBlackBoxedLine: null,
+ blackBoxedLines: [3, 5],
+ nonBlackBoxedLines: null,
+ blackboxedSourceState: SOURCE_IS_FULLY_IGNORED,
+ });
+
+ await assertGutterBlackBoxBoxContextMenuItems(dbg, {
+ blackboxedLine: 2,
+ nonBlackBoxedLine: null,
+ blackboxedSourceState: SOURCE_IS_FULLY_IGNORED,
+ });
+
+ await assertSourceTreeBlackBoxBoxContextMenuItems(dbg, {
+ blackBoxedSourceTreeNode: findSourceNodeWithText(dbg, "simple4.js"),
+ nonBlackBoxedSourceTreeNode: findSourceNodeWithText(dbg, "simple2.js"),
+ });
+
+ info("Unblackbox the whole source using the sourcetree context menu");
+ rightClickEl(dbg, findSourceNodeWithText(dbg, "simple4.js"));
+ await waitForContextMenu(dbg);
+ await selectBlackBoxContextMenuItem(dbg, "blackbox");
+
+ info("Assert that all lines in the source are un-styled correctly");
+ assertIgnoredStyleInSourceLines(dbg, { hasBlackboxedLinesClass: false });
+
+ info(
+ "Assert that the source tree for simple4.js does not have the ignored style"
+ );
+ const nodeAfterBlackbox = findSourceNodeWithText(dbg, "simple4.js");
+ ok(
+ !nodeAfterBlackbox.querySelector(".blackboxed"),
+ "simple4.js node still has the ignored style"
+ );
+
+ invokeInTab("funcA");
+
+ info("assert the pause at the debugger statement on line 2");
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, source.id, 2);
+ await resume(dbg);
+
+ info("assert the pause at the breakpoint set on line 8");
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, source.id, 8);
+ await resume(dbg);
+
+ assertNotPaused(dbg);
+
+ // When the source is not blackboxed there are no blackboxed lines
+ await assertEditorBlackBoxBoxContextMenuItems(dbg, {
+ blackboxedLine: null,
+ nonBlackBoxedLine: 4,
+ blackBoxedLines: null,
+ nonBlackBoxedLines: [3, 4],
+ blackboxedSourceState: SOURCE_IS_NOT_IGNORED,
+ });
+
+ await assertGutterBlackBoxBoxContextMenuItems(dbg, {
+ blackboxedLine: null,
+ nonBlackBoxedLine: 4,
+ blackboxedSourceState: SOURCE_IS_NOT_IGNORED,
+ });
+
+ await assertSourceTreeBlackBoxBoxContextMenuItems(dbg, {
+ blackBoxedSourceTreeNode: null,
+ nonBlackBoxedSourceTreeNode: findSourceNodeWithText(dbg, "simple2.js"),
+ });
+}
+
+async function testBlackBoxMultipleLines(dbg, source) {
+ info("Blackbox lines 7 to 13 using the editor content menu items");
+ await selectEditorLinesAndOpenContextMenu(dbg, { startLine: 7, endLine: 13 });
+ await selectBlackBoxContextMenuItem(dbg, "blackbox-lines");
+
+ await assertEditorBlackBoxBoxContextMenuItems(dbg, {
+ blackboxedLine: null,
+ nonBlackBoxedLine: 3,
+ blackBoxedLines: [7, 9],
+ nonBlackBoxedLines: [3, 4],
+ blackboxedSourceState: SOURCE_LINES_ARE_IGNORED,
+ });
+
+ await assertGutterBlackBoxBoxContextMenuItems(dbg, {
+ blackboxedLine: null,
+ nonBlackBoxedLine: 3,
+ blackboxedSourceState: SOURCE_LINES_ARE_IGNORED,
+ });
+
+ await assertSourceTreeBlackBoxBoxContextMenuItems(dbg, {
+ blackBoxedSourceTreeNode: findSourceNodeWithText(dbg, "simple4.js"),
+ nonBlackBoxedSourceTreeNode: findSourceNodeWithText(dbg, "simple2.js"),
+ });
+
+ info("Assert that the ignored lines are styled correctly");
+ assertIgnoredStyleInSourceLines(dbg, {
+ lines: [7, 13],
+ hasBlackboxedLinesClass: true,
+ });
+
+ info("Assert that the source tree for simple4.js has the ignored style");
+ const node = findSourceNodeWithText(dbg, "simple4.js");
+
+ ok(
+ node.querySelector(".blackboxed"),
+ "simple4.js node does not have the ignored style"
+ );
+
+ invokeInTab("funcA");
+
+ info("assert the pause at the debugger statement on line 2");
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, source.id, 2);
+ await resume(dbg);
+
+ info(
+ "The breakpoint set on line 8 should not get hit as its within the blackboxed range"
+ );
+ assertNotPaused(dbg);
+
+ info("Unblackbox lines 7 to 13");
+ await selectEditorLinesAndOpenContextMenu(dbg, { startLine: 7, endLine: 13 });
+ await selectBlackBoxContextMenuItem(dbg, "blackbox-lines");
+
+ await assertEditorBlackBoxBoxContextMenuItems(dbg, {
+ blackboxedLine: null,
+ nonBlackBoxedLine: 4,
+ blackBoxedLines: null,
+ nonBlackBoxedLines: [3, 4],
+ blackboxedSourceState: SOURCE_IS_NOT_IGNORED,
+ });
+
+ await assertGutterBlackBoxBoxContextMenuItems(dbg, {
+ blackboxedLine: null,
+ nonBlackBoxedLine: 4,
+ blackboxedSourceState: SOURCE_IS_NOT_IGNORED,
+ });
+
+ await assertSourceTreeBlackBoxBoxContextMenuItems(dbg, {
+ blackBoxedSourceTreeNode: null,
+ nonBlackBoxedSourceTreeNode: findSourceNodeWithText(dbg, "simple2.js"),
+ });
+
+ info("Assert that the un-ignored lines are no longer have the style");
+ assertIgnoredStyleInSourceLines(dbg, {
+ lines: [7, 13],
+ hasBlackboxedLinesClass: false,
+ });
+
+ info(
+ "Assert that the source tree for simple4.js does not have the ignored style"
+ );
+ const nodeAfterBlackbox = findSourceNodeWithText(dbg, "simple4.js");
+ ok(
+ !nodeAfterBlackbox.querySelector(".blackboxed"),
+ "simple4.js still has the ignored style"
+ );
+
+ invokeInTab("funcA");
+
+ // assert the pause at the debugger statement on line 2
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, source.id, 2);
+ await resume(dbg);
+
+ // assert the pause at the breakpoint set on line 8
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, source.id, 8);
+ await resume(dbg);
+
+ assertNotPaused(dbg);
+}
+
+async function testBlackBoxSingleLine(dbg, source) {
+ info("Black box line 2 of funcA() with the debugger statement");
+ await openContextMenuInDebugger(dbg, "gutter", 2);
+ await selectBlackBoxContextMenuItem(dbg, "blackbox-line");
+
+ await assertEditorBlackBoxBoxContextMenuItems(dbg, {
+ blackboxedLine: 2,
+ nonBlackBoxedLine: 4,
+ blackBoxedLines: null,
+ nonBlackBoxedLines: [3, 4],
+ blackboxedSourceState: SOURCE_LINES_ARE_IGNORED,
+ });
+
+ await assertGutterBlackBoxBoxContextMenuItems(dbg, {
+ blackboxedLine: null,
+ nonBlackBoxedLine: 4,
+ blackboxedSourceState: SOURCE_LINES_ARE_IGNORED,
+ });
+
+ await assertSourceTreeBlackBoxBoxContextMenuItems(dbg, {
+ blackBoxedSourceTreeNode: findSourceNodeWithText(dbg, "simple4.js"),
+ nonBlackBoxedSourceTreeNode: findSourceNodeWithText(dbg, "simple2.js"),
+ });
+
+ info("Assert that the ignored line 2 is styled correctly");
+ assertIgnoredStyleInSourceLines(dbg, {
+ lines: [2],
+ hasBlackboxedLinesClass: true,
+ });
+
+ info("Black box line 4 of funcC() with the debugger statement");
+ await openContextMenuInDebugger(dbg, "gutter", 4);
+ await selectBlackBoxContextMenuItem(dbg, "blackbox-line");
+
+ info("Assert that the ignored line 4 is styled correctly");
+ assertIgnoredStyleInSourceLines(dbg, {
+ lines: [4],
+ hasBlackboxedLinesClass: true,
+ });
+
+ invokeInTab("funcA");
+
+ // assert the pause at the breakpoint set on line 8
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, source.id, 8);
+ await resume(dbg);
+
+ assertNotPaused(dbg);
+
+ info("Un-blackbox line 2 of funcA()");
+ selectEditorLines(dbg, 2, 2);
+ await openContextMenuInDebugger(dbg, "CodeMirrorLines");
+ await selectBlackBoxContextMenuItem(dbg, "blackbox-line");
+
+ await assertEditorBlackBoxBoxContextMenuItems(dbg, {
+ blackboxedLine: 4,
+ nonBlackBoxedLine: 3,
+ blackBoxedLines: null,
+ nonBlackBoxedLines: [11, 12],
+ blackboxedSourceState: SOURCE_LINES_ARE_IGNORED,
+ });
+
+ await assertGutterBlackBoxBoxContextMenuItems(dbg, {
+ blackboxedLine: 4,
+ nonBlackBoxedLine: 3,
+ blackboxedSourceState: SOURCE_LINES_ARE_IGNORED,
+ });
+
+ await assertSourceTreeBlackBoxBoxContextMenuItems(dbg, {
+ blackBoxedSourceTreeNode: null,
+ nonBlackBoxedSourceTreeNode: findSourceNodeWithText(dbg, "simple2.js"),
+ });
+
+ info("Assert that the un-ignored line 2 is styled correctly");
+ assertIgnoredStyleInSourceLines(dbg, {
+ lines: [2],
+ hasBlackboxedLinesClass: false,
+ });
+
+ invokeInTab("funcA");
+
+ // assert the pause at the debugger statement on line 2
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, source.id, 2);
+ await resume(dbg);
+
+ // assert the pause at the breakpoint set on line 8
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, source.id, 8);
+ await resume(dbg);
+
+ assertNotPaused(dbg);
+}
+
+async function assertContextMenuDisabled(dbg, selector, shouldBeDisabled) {
+ const item = await waitFor(() => findContextMenu(dbg, selector));
+ is(
+ item.disabled,
+ shouldBeDisabled,
+ `The the context menu item is ${
+ shouldBeDisabled ? "disabled" : "not disabled"
+ }`
+ );
+}
+
+/**
+ * Asserts that the gutter blackbox context menu items which are visible are correct
+ * @params {Object} dbg
+ * @params {Array} testFixtures
+ * Details needed for the assertion. Any blackboxed/nonBlackboxed lines
+ * and any blackboxed/nonBlackboxed sources
+ */
+async function assertGutterBlackBoxBoxContextMenuItems(dbg, testFixtures) {
+ const { blackboxedLine, nonBlackBoxedLine, blackboxedSourceState } =
+ testFixtures;
+ if (blackboxedLine) {
+ info(
+ "Asserts that the gutter context menu items when clicking on the gutter of a blackboxed line"
+ );
+ const popup = await openContextMenuInDebugger(
+ dbg,
+ "gutter",
+ blackboxedLine
+ );
+ // When the whole source is blackboxed the the gutter visually shows `ignore line`
+ // but it is disabled indicating that individual lines cannot be nonBlackboxed.
+ const item =
+ blackboxedSourceState == SOURCE_IS_FULLY_IGNORED
+ ? contextMenuItems.ignoreLine
+ : contextMenuItems.unignoreLine;
+
+ await assertContextMenuLabel(dbg, item.selector, item.label);
+ await assertContextMenuDisabled(
+ dbg,
+ item.selector,
+ blackboxedSourceState == SOURCE_IS_FULLY_IGNORED
+ );
+ await closeContextMenu(dbg, popup);
+ }
+
+ if (nonBlackBoxedLine) {
+ info(
+ "Asserts that the gutter context menu items when clicking on the gutter of a nonBlackboxed line"
+ );
+ const popup = await openContextMenuInDebugger(
+ dbg,
+ "gutter",
+ nonBlackBoxedLine
+ );
+ const item = contextMenuItems.ignoreLine;
+ await assertContextMenuLabel(dbg, item.selector, item.label);
+ await assertContextMenuDisabled(dbg, item.selector, false);
+ await closeContextMenu(dbg, popup);
+ }
+}
+
+/**
+ * Asserts that the source tree blackbox context menu items which are visible are correct
+ * @params {Object} dbg
+ * @params {Array} testFixtures
+ * Details needed for the assertion. Any blackboxed/nonBlackboxed sources
+ */
+async function assertSourceTreeBlackBoxBoxContextMenuItems(dbg, testFixtures) {
+ const { blackBoxedSourceTreeNode, nonBlackBoxedSourceTreeNode } =
+ testFixtures;
+ if (blackBoxedSourceTreeNode) {
+ info(
+ "Asserts that the source tree blackbox context menu items when clicking on a blackboxed source tree node"
+ );
+ rightClickEl(dbg, blackBoxedSourceTreeNode);
+ const popup = await waitForContextMenu(dbg);
+ const item = contextMenuItems.unignoreSource;
+ await assertContextMenuLabel(dbg, item.selector, item.label);
+ await closeContextMenu(dbg, popup);
+ }
+
+ if (nonBlackBoxedSourceTreeNode) {
+ info(
+ "Asserts that the source tree blackbox context menu items when clicking on an un-blackboxed sorce tree node"
+ );
+ rightClickEl(dbg, nonBlackBoxedSourceTreeNode);
+ const popup = await waitForContextMenu(dbg);
+ const _item = contextMenuItems.ignoreSource;
+ await assertContextMenuLabel(dbg, _item.selector, _item.label);
+ await closeContextMenu(dbg, popup);
+ }
+}
+
+/**
+ * Asserts that the editor blackbox context menu items which are visible are correct
+ * @params {Object} dbg
+ * @params {Array} testFixtures
+ * Details needed for the assertion. Any blackboxed/nonBlackboxed lines
+ * and any blackboxed/nonBlackboxed sources
+ */
+async function assertEditorBlackBoxBoxContextMenuItems(dbg, testFixtures) {
+ const {
+ blackboxedLine,
+ nonBlackBoxedLine,
+ blackBoxedLines,
+ nonBlackBoxedLines,
+ blackboxedSourceState,
+ } = testFixtures;
+
+ if (blackboxedLine) {
+ info(
+ "Asserts the editor blackbox context menu items when right-clicking on a single blackboxed line"
+ );
+ const popup = await selectEditorLinesAndOpenContextMenu(dbg, {
+ startLine: blackboxedLine,
+ });
+
+ const expectedContextMenuItems = [contextMenuItems.unignoreSource];
+
+ if (blackboxedSourceState !== SOURCE_IS_FULLY_IGNORED) {
+ expectedContextMenuItems.push(contextMenuItems.unignoreLine);
+ }
+
+ for (const expectedContextMenuItem of expectedContextMenuItems) {
+ info(
+ "Checking context menu item " +
+ expectedContextMenuItem.selector +
+ " with label " +
+ expectedContextMenuItem.label
+ );
+ await assertContextMenuLabel(
+ dbg,
+ expectedContextMenuItem.selector,
+ expectedContextMenuItem.label
+ );
+ }
+ await closeContextMenu(dbg, popup);
+ }
+
+ if (nonBlackBoxedLine) {
+ info(
+ "Asserts the editor blackbox context menu items when right-clicking on a single non-blackboxed line"
+ );
+ const popup = await selectEditorLinesAndOpenContextMenu(dbg, {
+ startLine: nonBlackBoxedLine,
+ });
+
+ const expectedContextMenuItems = [
+ blackboxedSourceState == SOURCE_IS_NOT_IGNORED
+ ? contextMenuItems.ignoreSource
+ : contextMenuItems.unignoreSource,
+ contextMenuItems.ignoreLine,
+ ];
+
+ for (const expectedContextMenuItem of expectedContextMenuItems) {
+ info(
+ "Checking context menu item " +
+ expectedContextMenuItem.selector +
+ " with label " +
+ expectedContextMenuItem.label
+ );
+ await assertContextMenuLabel(
+ dbg,
+ expectedContextMenuItem.selector,
+ expectedContextMenuItem.label
+ );
+ }
+ await closeContextMenu(dbg, popup);
+ }
+
+ if (blackBoxedLines) {
+ info(
+ "Asserts the editor blackbox context menu items when right-clicking on multiple blackboxed lines"
+ );
+ const popup = await selectEditorLinesAndOpenContextMenu(dbg, {
+ startLine: blackBoxedLines[0],
+ endLine: blackBoxedLines[1],
+ });
+
+ const expectedContextMenuItems = [contextMenuItems.unignoreSource];
+
+ if (blackboxedSourceState !== SOURCE_IS_FULLY_IGNORED) {
+ expectedContextMenuItems.push(contextMenuItems.unignoreLines);
+ }
+
+ for (const expectedContextMenuItem of expectedContextMenuItems) {
+ info(
+ "Checking context menu item " +
+ expectedContextMenuItem.selector +
+ " with label " +
+ expectedContextMenuItem.label
+ );
+ await assertContextMenuLabel(
+ dbg,
+ expectedContextMenuItem.selector,
+ expectedContextMenuItem.label
+ );
+ }
+ await closeContextMenu(dbg, popup);
+ }
+
+ if (nonBlackBoxedLines) {
+ info(
+ "Asserts the editor blackbox context menu items when right-clicking on multiple non-blackboxed lines"
+ );
+ const popup = await selectEditorLinesAndOpenContextMenu(dbg, {
+ startLine: nonBlackBoxedLines[0],
+ endLine: nonBlackBoxedLines[1],
+ });
+
+ const expectedContextMenuItems = [
+ blackboxedSourceState == SOURCE_IS_NOT_IGNORED
+ ? contextMenuItems.ignoreSource
+ : contextMenuItems.unignoreSource,
+ ];
+
+ if (blackboxedSourceState !== SOURCE_IS_FULLY_IGNORED) {
+ expectedContextMenuItems.push(contextMenuItems.ignoreLines);
+ }
+
+ for (const expectedContextMenuItem of expectedContextMenuItems) {
+ info(
+ "Checking context menu item " +
+ expectedContextMenuItem.selector +
+ " with label " +
+ expectedContextMenuItem.label
+ );
+ await assertContextMenuLabel(
+ dbg,
+ expectedContextMenuItem.selector,
+ expectedContextMenuItem.label
+ );
+ }
+ await closeContextMenu(dbg, popup);
+ }
+}
+
+/**
+ * Selects a range of lines
+ * @param {Object} dbg
+ * @param {Number} startLine
+ * @param {Number} endLine
+ */
+function selectEditorLines(dbg, startLine, endLine) {
+ getCM(dbg).setSelection(
+ { line: startLine - 1, ch: 0 },
+ { line: endLine, ch: 0 }
+ );
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-breaking-from-console.js b/devtools/client/debugger/test/mochitest/browser_dbg-breaking-from-console.js
new file mode 100644
index 0000000000..3a29506002
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-breaking-from-console.js
@@ -0,0 +1,38 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+// Tests that `debugger` statements are hit before the debugger even
+// initializes and it properly highlights the right location in the
+// debugger.
+
+add_task(async function () {
+ const url = `${EXAMPLE_URL}doc-script-switching.html`;
+ const toolbox = await openNewTabAndToolbox(url, "webconsole");
+
+ // Type "debugger" into console
+ const wrapper = toolbox.getPanel("webconsole").hud.ui.wrapper;
+ const onSelected = toolbox.once("jsdebugger-selected");
+ wrapper.dispatchEvaluateExpression("debugger");
+
+ // Wait for the debugger to be selected and make sure it's paused
+ await onSelected;
+ is(toolbox.threadFront.state, "paused");
+
+ // Create a dbg context
+ const dbg = createDebuggerContext(toolbox);
+
+ // Make sure the thread is paused in the right source and location
+ await waitForPaused(dbg);
+ const selectedSource = dbg.selectors.getSelectedSource();
+ ok(
+ !selectedSource.url,
+ "The selected source is the console evaluation and doesn't have a URL"
+ );
+ is(getCM(dbg).getValue(), "debugger");
+ assertPausedAtSourceAndLine(dbg, selectedSource.id, 1);
+
+ await resume(dbg);
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-breaking.js b/devtools/client/debugger/test/mochitest/browser_dbg-breaking.js
new file mode 100644
index 0000000000..59594aea07
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-breaking.js
@@ -0,0 +1,55 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+// Tests the breakpoints are hit in various situations.
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-scripts.html");
+ const {
+ selectors: { getSelectedSource },
+ } = dbg;
+
+ await selectSource(dbg, "doc-scripts.html");
+
+ // Make sure we can set a top-level breakpoint and it will be hit on
+ // reload.
+ await addBreakpoint(dbg, "doc-scripts.html", 21);
+
+ const onReloaded = reload(dbg, "doc-scripts.html");
+
+ await waitForPaused(dbg);
+
+ let whyPaused = await waitFor(
+ () => dbg.win.document.querySelector(".why-paused")?.innerText
+ );
+ is(whyPaused, "Paused on breakpoint");
+
+ assertPausedAtSourceAndLine(dbg, findSource(dbg, "doc-scripts.html").id, 21);
+ await resume(dbg);
+ info("Wait for reload to complete after resume");
+ await onReloaded;
+
+ info("Create an eval script that pauses itself.");
+ invokeInTab("doEval");
+ await waitForPaused(dbg);
+ const source = getSelectedSource();
+ ok(!source.url, "It is an eval source");
+ assertPausedAtSourceAndLine(dbg, source.id, 2);
+
+ whyPaused = await waitFor(
+ () => dbg.win.document.querySelector(".why-paused")?.innerText
+ );
+ is(whyPaused, "Paused on debugger statement");
+
+ await resume(dbg);
+
+ await addBreakpoint(dbg, source, 5);
+ invokeInTab("evaledFunc");
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, source.id, 5);
+
+ await resume(dbg);
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-breakpoint-skipping-console.js b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoint-skipping-console.js
new file mode 100644
index 0000000000..73acdce3c1
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoint-skipping-console.js
@@ -0,0 +1,20 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/*
+ * Test that debugger statements are skipped when
+ * skip pausing is enabled.
+ */
+
+"use strict";
+
+add_task(async function () {
+ const toolbox = await initPane("doc-scripts.html", "webconsole", [
+ ["devtools.debugger.skip-pausing", true],
+ ]);
+ await navigateTo(`${EXAMPLE_URL}doc-debugger-statements.html`);
+
+ await hasConsoleMessage({ toolbox }, "done!");
+ ok(true, "We reached the end");
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-breakpoint-skipping.js b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoint-skipping.js
new file mode 100644
index 0000000000..c766a0e549
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoint-skipping.js
@@ -0,0 +1,87 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/*
+ * Tests toggling the skip pausing button and
+ * invoking functions without pausing.
+ */
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-scripts.html");
+ await selectSource(dbg, "simple3.js");
+
+ info("Adding a breakpoint should remove the skipped pausing state");
+ await skipPausing(dbg);
+ await waitForState(dbg, state => dbg.selectors.getSkipPausing());
+ await addBreakpoint(dbg, "simple3.js", 2);
+ await waitForState(dbg, state => !dbg.selectors.getSkipPausing());
+ invokeInTab("simple");
+ await waitForPaused(dbg);
+ ok(true, "The breakpoint has been hit after a breakpoint was created");
+ await resume(dbg);
+
+ info("Toggling a breakpoint should remove the skipped pausing state");
+ // First disable the breakpoint to ensure skip pausing gets turned off
+ // during a disable
+ await skipPausing(dbg);
+ await disableBreakpoint(dbg, 0);
+ await waitForState(dbg, state => !dbg.selectors.getSkipPausing());
+ // Then re-enable the breakpoint to ensure skip pausing gets turned off
+ // during an enable
+ await skipPausing(dbg);
+ await waitForState(dbg, state => dbg.selectors.getSkipPausing());
+ toggleBreakpoint(dbg, 0);
+ await waitForState(dbg, state => !dbg.selectors.getSkipPausing());
+ await waitForDispatch(dbg.store, "SET_BREAKPOINT");
+ invokeInTab("simple");
+ await waitForPaused(dbg);
+ ok(true, "The breakpoint has been hit after skip pausing was disabled");
+ await resume(dbg);
+
+ info("Disabling a breakpoint should remove the skipped pausing state");
+ await addBreakpoint(dbg, "simple3.js", 3);
+ await skipPausing(dbg);
+ await disableBreakpoint(dbg, 0);
+ await waitForState(dbg, state => !dbg.selectors.getSkipPausing());
+ invokeInTab("simple");
+ await waitForPaused(dbg);
+ ok(true, "The breakpoint has been hit after skip pausing was disabled again");
+ await resume(dbg);
+
+ info("Removing a breakpoint should remove the skipped pause state");
+ toggleBreakpoint(dbg, 0);
+ await skipPausing(dbg);
+ const source = findSource(dbg, "simple3.js");
+ removeBreakpoint(dbg, source.id, 3);
+ const wait = waitForDispatch(dbg.store, "TOGGLE_SKIP_PAUSING");
+ await waitForState(dbg, state => !dbg.selectors.getSkipPausing());
+ await wait;
+ invokeInTab("simple");
+ await waitForPaused(dbg);
+ // Unfortunately required as the test harness throws if preview doesn't
+ // complete before the end of the test.
+ await waitForDispatch(dbg.store, "ADD_INLINE_PREVIEW");
+ ok(true, "Breakpoint is hit after a breakpoint was removed");
+ await resume(dbg);
+});
+
+function skipPausing(dbg) {
+ clickElementWithSelector(dbg, ".command-bar-skip-pausing");
+ return waitForState(dbg, state => dbg.selectors.getSkipPausing());
+}
+
+function toggleBreakpoint(dbg, index) {
+ const breakpoints = findAllElements(dbg, "breakpointItems");
+ const bp = breakpoints[index];
+ const input = bp.querySelector("input");
+ input.click();
+}
+
+async function disableBreakpoint(dbg, index) {
+ const disabled = waitForDispatch(dbg.store, "SET_BREAKPOINT");
+ toggleBreakpoint(dbg, index);
+ await disabled;
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-actions.js b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-actions.js
new file mode 100644
index 0000000000..900c55e7fa
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-actions.js
@@ -0,0 +1,84 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+// Tests to see if we can trigger a breakpoint action via the context menu
+add_task(async function () {
+ const dbg = await initDebugger("doc-scripts.html", "simple2.js");
+ await selectSource(dbg, "simple2.js");
+ await waitForSelectedSource(dbg, "simple2.js");
+
+ await addBreakpoint(dbg, "simple2.js", 3);
+
+ await openFirstBreakpointContextMenu(dbg);
+ // select "Remove breakpoint"
+ selectContextMenuItem(dbg, selectors.breakpointContextMenu.remove);
+
+ await waitForState(dbg, state => dbg.selectors.getBreakpointCount() === 0);
+ ok(true, "successfully removed the breakpoint");
+});
+
+// Tests "disable others", "enable others" and "remove others" context actions
+add_task(async function () {
+ const dbg = await initDebugger("doc-scripts.html");
+ await selectSource(dbg, "simple1.js");
+ await waitForSelectedSource(dbg, "simple1.js");
+
+ await addBreakpoint(dbg, "simple1.js", 4);
+ await addBreakpoint(dbg, "simple1.js", 5);
+ await addBreakpoint(dbg, "simple1.js", 6);
+
+ await openFirstBreakpointContextMenu(dbg);
+ // select "Disable Others"
+ let dispatched = waitForDispatch(dbg.store, "SET_BREAKPOINT", 2);
+ selectContextMenuItem(dbg, selectors.breakpointContextMenu.disableOthers);
+ await waitForState(dbg, state =>
+ dbg.selectors
+ .getBreakpointsList()
+ .every(bp => (bp.location.line !== 4) === bp.disabled)
+ );
+ await dispatched;
+ ok(true, "breakpoint at 4 is the only enabled breakpoint");
+
+ await openFirstBreakpointContextMenu(dbg);
+ // select "Disable All"
+ dispatched = waitForDispatch(dbg.store, "SET_BREAKPOINT");
+ selectContextMenuItem(dbg, selectors.breakpointContextMenu.disableAll);
+ await waitForState(dbg, state =>
+ dbg.selectors.getBreakpointsList().every(bp => bp.disabled)
+ );
+ await dispatched;
+ ok(true, "all breakpoints are disabled");
+
+ await openFirstBreakpointContextMenu(dbg);
+ // select "Enable Others"
+ dispatched = waitForDispatch(dbg.store, "SET_BREAKPOINT", 2);
+ selectContextMenuItem(dbg, selectors.breakpointContextMenu.enableOthers);
+ await waitForState(dbg, state =>
+ dbg.selectors
+ .getBreakpointsList()
+ .every(bp => (bp.location.line === 4) === bp.disabled)
+ );
+ await dispatched;
+ ok(true, "all breakpoints except line 1 are enabled");
+
+ await openFirstBreakpointContextMenu(dbg);
+ // select "Remove Others"
+ dispatched = waitForDispatch(dbg.store, "REMOVE_BREAKPOINT", 2);
+ selectContextMenuItem(dbg, selectors.breakpointContextMenu.removeOthers);
+ await waitForState(
+ dbg,
+ state =>
+ dbg.selectors.getBreakpointsList().length === 1 &&
+ dbg.selectors.getBreakpointsList()[0].location.line === 4
+ );
+ await dispatched;
+ ok(true, "remaining breakpoint should be on line 4");
+});
+
+async function openFirstBreakpointContextMenu(dbg) {
+ rightClickElement(dbg, "breakpointItem", 2);
+ await waitForContextMenu(dbg);
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-columns.js b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-columns.js
new file mode 100644
index 0000000000..6234e22dcb
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-columns.js
@@ -0,0 +1,131 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-scripts.html", "simple1.js");
+ await selectSource(dbg, "long.js");
+
+ info("1. Add a column breakpoint on line 32");
+ await enableFirstBreakpoint(dbg);
+
+ info("2. Click on the second breakpoint on line 32");
+ await enableSecondBreakpoint(dbg);
+
+ info("3. Disable second breakpoint using shift-click");
+ await shiftClickDisable(dbg);
+
+ info("4. Re-enable second breakpoint using shift-click");
+ await shiftClickEnable(dbg);
+
+ info("5. Add a condition to the first breakpoint");
+ await setConditionalBreakpoint(dbg, 0, "foo");
+
+ info("6. Add a log to the first breakpoint");
+ await setLogPoint(dbg, 0, "bar");
+
+ info("7. Disable the first breakpoint");
+ await disableBreakpoint(dbg, 0);
+
+ info("8. Remove the first breakpoint");
+ await removeFirstBreakpoint(dbg);
+
+ info("9. Add a condition to the second breakpoint");
+ await setConditionalBreakpoint(dbg, 1, "foo2");
+
+ info("10. Test removing the breakpoints by clicking in the gutter");
+ await removeAllBreakpoints(dbg, 32, 0);
+});
+
+async function enableFirstBreakpoint(dbg) {
+ getCM(dbg).setCursor({ line: 32, ch: 0 });
+ await addBreakpoint(dbg, "long.js", 32);
+ const bpMarkers = await waitForAllElements(dbg, "columnBreakpoints");
+
+ Assert.strictEqual(bpMarkers.length, 2, "2 column breakpoints");
+ assertClass(bpMarkers[0], "active");
+ assertClass(bpMarkers[1], "active", false);
+}
+
+async function enableSecondBreakpoint(dbg) {
+ let bpMarkers = await waitForAllElements(dbg, "columnBreakpoints");
+
+ bpMarkers[1].click();
+ await waitForBreakpointCount(dbg, 2);
+
+ bpMarkers = findAllElements(dbg, "columnBreakpoints");
+ assertClass(bpMarkers[1], "active");
+ await waitForAllElements(dbg, "breakpointItems", 2);
+}
+
+// disable active column bp with shift-click.
+async function shiftClickDisable(dbg) {
+ let bpMarkers = await waitForAllElements(dbg, "columnBreakpoints");
+ shiftClickElement(dbg, "columnBreakpoints");
+ bpMarkers = findAllElements(dbg, "columnBreakpoints");
+ assertClass(bpMarkers[0], "disabled");
+}
+
+// re-enable disabled column bp with shift-click.
+async function shiftClickEnable(dbg) {
+ let bpMarkers = await waitForAllElements(dbg, "columnBreakpoints");
+ shiftClickElement(dbg, "columnBreakpoints");
+ bpMarkers = findAllElements(dbg, "columnBreakpoints");
+ assertClass(bpMarkers[0], "active");
+}
+
+async function setConditionalBreakpoint(dbg, index, condition) {
+ let bpMarkers = await waitForAllElements(dbg, "columnBreakpoints");
+ rightClickEl(dbg, bpMarkers[index]);
+ await waitForContextMenu(dbg);
+ selectContextMenuItem(dbg, selectors.addConditionItem);
+ await typeInPanel(dbg, condition);
+ await waitForCondition(dbg, condition);
+
+ bpMarkers = await waitForAllElements(dbg, "columnBreakpoints");
+ assertClass(bpMarkers[index], "has-condition");
+}
+
+async function setLogPoint(dbg, index, expression) {
+ let bpMarkers = await waitForAllElements(dbg, "columnBreakpoints");
+ rightClickEl(dbg, bpMarkers[index]);
+ await waitForContextMenu(dbg);
+
+ selectContextMenuItem(dbg, selectors.addLogItem);
+ await typeInPanel(dbg, expression);
+ await waitForLog(dbg, expression);
+
+ bpMarkers = await waitForAllElements(dbg, "columnBreakpoints");
+ assertClass(bpMarkers[index], "has-log");
+}
+
+async function disableBreakpoint(dbg, index) {
+ rightClickElement(dbg, "columnBreakpoints");
+ await waitForContextMenu(dbg);
+ selectContextMenuItem(dbg, selectors.disableItem);
+
+ await waitForState(dbg, state => {
+ const bp = dbg.selectors.getBreakpointsList()[index];
+ return bp.disabled;
+ });
+
+ const bpMarkers = await waitForAllElements(dbg, "columnBreakpoints");
+ assertClass(bpMarkers[0], "disabled");
+}
+
+async function removeFirstBreakpoint(dbg) {
+ let bpMarkers = await waitForAllElements(dbg, "columnBreakpoints");
+
+ bpMarkers[0].click();
+ bpMarkers = await waitForAllElements(dbg, "columnBreakpoints");
+ assertClass(bpMarkers[0], "active", false);
+}
+
+async function removeAllBreakpoints(dbg, line, count) {
+ await clickGutter(dbg, 32);
+ await waitForBreakpointCount(dbg, 0);
+
+ ok(!findAllElements(dbg, "columnBreakpoints").length);
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-cond-functional.js b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-cond-functional.js
new file mode 100644
index 0000000000..96fd2a5d8a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-cond-functional.js
@@ -0,0 +1,79 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+// This test focuses on verifying that the conditional breakpoint are trigerred.
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-scripts.html", "simple2.js");
+
+ await selectSource(dbg, "simple2.js");
+
+ info("Set condition `x === 1` in the foo function, and pause");
+ await setConditionalBreakpoint(dbg, 5, "x === 1");
+
+ invokeInTab("foo", /* x */ 1);
+ await waitForPaused(dbg);
+ ok(true, "Conditional breakpoint was hit");
+ await resume(dbg);
+
+ await removeBreakpoint(dbg, findSource(dbg, "simple2.js").id, 5);
+
+ info("Set condition `x === 2` in the foo function, and do not pause");
+ await setConditionalBreakpoint(dbg, 5, "x == 2");
+
+ invokeInTab("foo", /* x */ 1);
+ // Let some time for a leftover breakpoint to be hit
+ await wait(500);
+ assertNotPaused(dbg);
+
+ await removeBreakpoint(dbg, findSource(dbg, "simple2.js").id, 5);
+
+ info("Set condition `foo(` (syntax error), and pause on the exception");
+ await setConditionalBreakpoint(dbg, 5, "foo(");
+
+ invokeInTab("main");
+ await waitForPaused(dbg);
+ let whyPaused = dbg.win.document.querySelector(".why-paused").innerText;
+ is(
+ whyPaused,
+ "Error with conditional breakpoint\nexpected expression, got end of script"
+ );
+ await resume(dbg);
+ assertNotPaused(dbg);
+
+ info(
+ "Retrigger the same breakpoint with pause on exception enabled and ensure it still reports the exception and only once"
+ );
+ await togglePauseOnExceptions(dbg, true, false);
+
+ invokeInTab("main");
+ await waitForPaused(dbg);
+ whyPaused = dbg.win.document.querySelector(".why-paused").innerText;
+ is(
+ whyPaused,
+ "Error with conditional breakpoint\nexpected expression, got end of script"
+ );
+ await resume(dbg);
+
+ // Let some time for a duplicated breakpoint to be hit
+ await wait(500);
+ assertNotPaused(dbg);
+
+ await removeBreakpoint(dbg, findSource(dbg, "simple2.js").id, 5);
+});
+
+async function setConditionalBreakpoint(dbg, index, condition) {
+ // Make this work with either add or edit menu items
+ const { addConditionItem, editConditionItem } = selectors;
+ const selector = `${addConditionItem},${editConditionItem}`;
+ rightClickElement(dbg, "gutter", index);
+ await waitForContextMenu(dbg);
+ selectContextMenuItem(dbg, selector);
+ const dispatched = waitForDispatch(dbg.store, "SET_BREAKPOINT");
+ typeInPanel(dbg, condition);
+ await dispatched;
+ await waitForCondition(dbg, condition);
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-cond-shortcut.js b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-cond-shortcut.js
new file mode 100644
index 0000000000..be1ce2bfeb
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-cond-shortcut.js
@@ -0,0 +1,147 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test opening conditional panel using keyboard shortcut.
+// Should access the closest breakpoint to a passed in cursorPosition.
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-scripts.html", "long.js");
+
+ await selectSource(dbg, "long.js");
+ await waitForSelectedSource(dbg, "long.js");
+
+ info(
+ "toggle conditional panel with shortcut: no breakpoints, default cursorPosition"
+ );
+ pressKey(dbg, "toggleCondPanel");
+ await waitForConditionalPanelFocus(dbg);
+ ok(
+ !!getConditionalPanel(dbg, 1),
+ "conditional panel panel is open on line 1"
+ );
+ is(
+ dbg.selectors.getConditionalPanelLocation().line,
+ 1,
+ "conditional panel location is line 1"
+ );
+ info("close conditional panel");
+ pressKey(dbg, "Escape");
+
+ info(
+ "toggle conditional panel with shortcut: cursor on line 32, no breakpoints"
+ );
+ // codemirror editor offset: cursorPosition will be line + 1, column + 1
+ getCM(dbg).setCursor({ line: 31, ch: 1 });
+ pressKey(dbg, "toggleCondPanel");
+
+ await waitForConditionalPanelFocus(dbg);
+ ok(
+ !!getConditionalPanel(dbg, 32),
+ "conditional panel panel is open on line 32"
+ );
+ is(
+ dbg.selectors.getConditionalPanelLocation().line,
+ 32,
+ "conditional panel location is line 32"
+ );
+ info("close conditional panel");
+ pressKey(dbg, "Escape");
+
+ info("add active column breakpoint on line 32 and set cursorPosition");
+ await enableFirstBreakpoint(dbg);
+ getCM(dbg).setCursor({ line: 31, ch: 1 });
+ info(
+ "toggle conditional panel with shortcut and add condition to first breakpoint"
+ );
+ setConditionalBreakpoint(dbg, "1");
+ await waitForCondition(dbg, 1);
+ const firstBreakpoint = findColumnBreakpoint(dbg, "long.js", 32, 2);
+ is(
+ firstBreakpoint.options.condition,
+ "1",
+ "first breakpoint created with condition using shortcut"
+ );
+
+ info("set cursor at second breakpoint position and activate breakpoint");
+ getCM(dbg).setCursor({ line: 31, ch: 25 });
+
+ await enableSecondBreakpoint(dbg);
+ info(
+ "toggle conditional panel with shortcut and add condition to second breakpoint"
+ );
+ setConditionalBreakpoint(dbg, "2");
+ await waitForCondition(dbg, 2);
+ const secondBreakpoint = findColumnBreakpoint(dbg, "long.js", 32, 26);
+ is(
+ secondBreakpoint.options.condition,
+ "2",
+ "second breakpoint created with condition using shortcut"
+ );
+
+ info(
+ "set cursor position near first breakpoint, toggle conditional panel and edit breakpoint"
+ );
+ getCM(dbg).setCursor({ line: 31, ch: 7 });
+ info("toggle conditional panel and edit condition using shortcut");
+ setConditionalBreakpoint(dbg, "2");
+ ok(
+ !!waitForCondition(dbg, "12"),
+ "breakpoint closest to cursor position has been edited"
+ );
+
+ info("close conditional panel");
+ pressKey(dbg, "Escape");
+
+ info(
+ "set cursor position near second breakpoint, toggle conditional panel and edit breakpoint"
+ );
+ getCM(dbg).setCursor({ line: 31, ch: 21 });
+ info("toggle conditional panel and edit condition using shortcut");
+ setConditionalBreakpoint(dbg, "3");
+ ok(
+ !!waitForCondition(dbg, "13"),
+ "breakpoint closest to cursor position has been edited"
+ );
+});
+
+// from test/mochitest/browser_dbg-breakpoints-cond-source-maps.js
+function getConditionalPanel(dbg, line) {
+ return getCM(dbg).doc.getLineHandle(line - 1).widgets[0];
+}
+
+// from devtools browser_dbg-breakpoints-cond-source-maps.js
+async function waitForConditionalPanelFocus(dbg) {
+ await waitFor(() => dbg.win.document.activeElement.tagName === "TEXTAREA");
+}
+
+// from browser_dbg-breakpoints-columns.js
+async function enableFirstBreakpoint(dbg) {
+ getCM(dbg).setCursor({ line: 32, ch: 0 });
+ await addBreakpoint(dbg, "long.js", 32);
+ const bpMarkers = await waitForAllElements(dbg, "columnBreakpoints");
+
+ Assert.strictEqual(bpMarkers.length, 2, "2 column breakpoints");
+ assertClass(bpMarkers[0], "active");
+ assertClass(bpMarkers[1], "active", false);
+}
+
+async function enableSecondBreakpoint(dbg) {
+ let bpMarkers = await waitForAllElements(dbg, "columnBreakpoints");
+
+ bpMarkers[1].click();
+ await waitForBreakpointCount(dbg, 2);
+
+ bpMarkers = findAllElements(dbg, "columnBreakpoints");
+ assertClass(bpMarkers[1], "active");
+ await waitForAllElements(dbg, "breakpointItems", 2);
+}
+
+// modified method from browser_dbg-breakpoints-columns.js
+// use shortcut to open conditional panel.
+function setConditionalBreakpoint(dbg, condition) {
+ pressKey(dbg, "toggleCondPanel");
+ typeInPanel(dbg, condition);
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-cond-source-maps.js b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-cond-source-maps.js
new file mode 100644
index 0000000000..3e9a9d5087
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-cond-source-maps.js
@@ -0,0 +1,45 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Confirms that a conditional panel is opened at the
+// correct location in generated files.
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-sourcemaps.html", "entry.js");
+
+ await selectSource(dbg, "bundle.js");
+ getCM(dbg).scrollIntoView({ line: 55, ch: 0 });
+
+ await setLogPoint(dbg, 55);
+ await waitForConditionalPanelFocus(dbg);
+ ok(
+ !!getConditionalPanel(dbg, 55),
+ "conditional panel panel is open on line 55"
+ );
+ is(
+ dbg.selectors.getConditionalPanelLocation().line,
+ 55,
+ "conditional panel location is line 55"
+ );
+});
+
+async function setLogPoint(dbg, index) {
+ const gutterEl = await getEditorLineGutter(dbg, index);
+ rightClickEl(dbg, gutterEl);
+ await waitForContextMenu(dbg);
+ selectContextMenuItem(
+ dbg,
+ `${selectors.addLogItem},${selectors.editLogItem}`
+ );
+}
+
+async function waitForConditionalPanelFocus(dbg) {
+ await waitFor(() => dbg.win.document.activeElement.tagName === "TEXTAREA");
+}
+
+function getConditionalPanel(dbg, line) {
+ return getCM(dbg).doc.getLineHandle(line - 1).widgets[0];
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-cond-ui-state.js b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-cond-ui-state.js
new file mode 100644
index 0000000000..972c493a7d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-cond-ui-state.js
@@ -0,0 +1,138 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+// This test focuses on the UI interaction and doesn't assert that the breakpoints actually works
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-scripts.html", "simple2.js");
+
+ await selectSource(dbg, "simple2.js");
+ await waitForSelectedSource(dbg, "simple2.js");
+
+ info("Set condition `1`");
+ await setConditionalBreakpoint(dbg, 5, "1");
+ await waitForCondition(dbg, 1);
+
+ let bp = findBreakpoint(dbg, "simple2.js", 5);
+ is(bp.options.condition, "1", "breakpoint is created with the condition");
+ await assertConditionBreakpoint(dbg, 5);
+
+ info("Edit the conditional breakpoint set above");
+ await setConditionalBreakpoint(dbg, 5, "2");
+ await waitForCondition(dbg, 12);
+
+ bp = findBreakpoint(dbg, "simple2.js", 5);
+ is(bp.options.condition, "12", "breakpoint is created with the condition");
+ await assertConditionBreakpoint(dbg, 5);
+
+ info("Hit 'Enter' when the cursor is in the conditional statement");
+ rightClickElement(dbg, "gutter", 5);
+ await waitForContextMenu(dbg);
+ selectContextMenuItem(dbg, `${selectors.editConditionItem}`);
+ await waitForConditionalPanelFocus(dbg);
+ pressKey(dbg, "Left");
+ pressKey(dbg, "Enter");
+ await waitForCondition(dbg, 12);
+
+ bp = findBreakpoint(dbg, "simple2.js", 5);
+ is(bp.options.condition, "12", "Hit 'Enter' doesn't add a new line");
+
+ info("Hit 'Alt+Enter' when the cursor is in the conditional statement");
+ rightClickElement(dbg, "gutter", 5);
+ await waitForContextMenu(dbg);
+ selectContextMenuItem(dbg, `${selectors.editConditionItem}`);
+ await waitForConditionalPanelFocus(dbg);
+ pressKey(dbg, "Left");
+ pressKey(dbg, "AltEnter");
+ pressKey(dbg, "Enter");
+ await waitForCondition(dbg, "1\n2");
+
+ bp = findBreakpoint(dbg, "simple2.js", 5);
+ is(bp.options.condition, "1\n2", "Hit 'Alt+Enter' adds a new line");
+
+ clickElement(dbg, "gutter", 5);
+ await waitForDispatch(dbg.store, "REMOVE_BREAKPOINT");
+ bp = findBreakpoint(dbg, "simple2.js", 5);
+ is(bp, undefined, "breakpoint was removed");
+ await assertNoBreakpoint(dbg, 5);
+
+ info("Adding a condition to a breakpoint");
+ clickElement(dbg, "gutter", 5);
+ await waitForDispatch(dbg.store, "SET_BREAKPOINT");
+ await setConditionalBreakpoint(dbg, 5, "1");
+ await waitForCondition(dbg, 1);
+
+ bp = findBreakpoint(dbg, "simple2.js", 5);
+ is(bp.options.condition, "1", "breakpoint is created with the condition");
+ await assertConditionBreakpoint(dbg, 5);
+
+ info("Double click the conditional breakpoint in secondary pane");
+ dblClickElement(dbg, "conditionalBreakpointInSecPane");
+ is(
+ dbg.win.document.activeElement.tagName,
+ "TEXTAREA",
+ "The textarea of conditional breakpoint panel is focused"
+ );
+
+ info("Click the conditional breakpoint in secondary pane");
+ await clickElement(dbg, "conditionalBreakpointInSecPane");
+ const conditonalPanel = findElement(dbg, "conditionalPanel");
+ is(conditonalPanel, null, "The conditional breakpoint panel is closed");
+
+ rightClickElement(dbg, "breakpointItem", 2);
+ await waitForContextMenu(dbg);
+ info('select "remove condition"');
+ selectContextMenuItem(dbg, selectors.breakpointContextMenu.removeCondition);
+ await waitForBreakpointWithoutCondition(dbg, "simple2.js", 5);
+ bp = findBreakpoint(dbg, "simple2.js", 5);
+ is(bp.options.condition, null, "breakpoint condition removed");
+
+ info('Add "log point"');
+ await setLogPoint(dbg, 5, "44");
+ await waitForLog(dbg, 44);
+ await assertLogBreakpoint(dbg, 5);
+
+ bp = findBreakpoint(dbg, "simple2.js", 5);
+ is(bp.options.logValue, "44", "breakpoint condition removed");
+
+ await altClickElement(dbg, "gutter", 6);
+ bp = await waitForBreakpoint(dbg, "simple2.js", 6);
+ is(bp.options.logValue, "displayName", "logPoint has default value");
+
+ info("Double click the logpoint in secondary pane");
+ dblClickElement(dbg, "logPointInSecPane");
+ is(
+ dbg.win.document.activeElement.tagName,
+ "TEXTAREA",
+ "The textarea of logpoint panel is focused"
+ );
+
+ info("Click the logpoint in secondary pane");
+ await clickElement(dbg, "logPointInSecPane");
+ const logPointPanel = findElement(dbg, "logPointPanel");
+ is(logPointPanel, null, "The logpoint panel is closed");
+});
+
+function waitForBreakpointWithoutCondition(dbg, url, line) {
+ return waitForState(dbg, () => {
+ const bp = findBreakpoint(dbg, url, line);
+ return bp && !bp.options.condition;
+ });
+}
+
+async function setConditionalBreakpoint(dbg, index, condition) {
+ // Make this work with either add or edit menu items
+ const { addConditionItem, editConditionItem } = selectors;
+ const selector = `${addConditionItem},${editConditionItem}`;
+ rightClickElement(dbg, "gutter", index);
+ await waitForContextMenu(dbg);
+ selectContextMenuItem(dbg, selector);
+ typeInPanel(dbg, condition);
+}
+
+async function waitForConditionalPanelFocus(dbg) {
+ await waitFor(() => dbg.win.document.activeElement.tagName === "TEXTAREA");
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-debugger-statement.js b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-debugger-statement.js
new file mode 100644
index 0000000000..b30bdd9660
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-debugger-statement.js
@@ -0,0 +1,94 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test enabling and disabling a debugger statement using editor context menu
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-pause-points.html", "pause-points.js");
+ await selectSource(dbg, "pause-points.js");
+ await waitForSelectedSource(dbg, "pause-points.js");
+
+ info("Disable the first debugger statement on line 12 by gutter menu");
+ rightClickElement(dbg, "gutter", 12);
+ await waitForContextMenu(dbg);
+ selectContextMenuItem(
+ dbg,
+ selectors.breakpointContextMenu.disableDbgStatement
+ );
+ await waitForCondition(dbg, "false");
+
+ let bp = findBreakpoint(dbg, "pause-points.js", 12);
+ is(
+ bp.options.condition,
+ "false",
+ "The debugger statement has a conditional breakpoint with 'false' as statement"
+ );
+
+ info("Enable the previously disabled debugger statement by gutter menu");
+ rightClickElement(dbg, "gutter", 12);
+ await waitForContextMenu(dbg);
+ selectContextMenuItem(
+ dbg,
+ selectors.breakpointContextMenu.enableDbgStatement
+ );
+ await waitForBreakpointWithoutCondition(dbg, "pause-points.js", 12, 0);
+
+ bp = findBreakpoint(dbg, "pause-points.js", 12);
+ is(bp.options.condition, null, "The conditional statement is removed");
+
+ info("Enable the breakpoint for the second debugger statement on line 12");
+ let bpElements = await waitForAllElements(dbg, "columnBreakpoints");
+ Assert.strictEqual(bpElements.length, 2, "2 column breakpoints");
+ assertClass(bpElements[0], "active");
+ assertClass(bpElements[1], "active", false);
+
+ bpElements[1].click();
+ await waitForBreakpointCount(dbg, 2);
+ bpElements = findAllElements(dbg, "columnBreakpoints");
+ assertClass(bpElements[1], "active");
+
+ info("Disable the second debugger statement by breakpoint menu");
+ rightClickEl(dbg, bpElements[1]);
+ await waitForContextMenu(dbg);
+ selectContextMenuItem(
+ dbg,
+ selectors.breakpointContextMenu.disableDbgStatement
+ );
+ await waitForCondition(dbg, "false");
+
+ bp = findBreakpoints(dbg, "pause-points.js", 12)[1];
+ is(
+ bp.options.condition,
+ "false",
+ "The second debugger statement has a conditional breakpoint with 'false' as statement"
+ );
+
+ info("Enable the second debugger statement by breakpoint menu");
+ bpElements = findAllElements(dbg, "columnBreakpoints");
+ assertClass(bpElements[1], "has-condition");
+ rightClickEl(dbg, bpElements[1]);
+ await waitForContextMenu(dbg);
+ selectContextMenuItem(
+ dbg,
+ selectors.breakpointContextMenu.enableDbgStatement
+ );
+ await waitForBreakpointWithoutCondition(dbg, "pause-points.js", 12, 1);
+
+ bp = findBreakpoints(dbg, "pause-points.js", 12)[1];
+ is(bp.options.condition, null, "The conditional statement is removed");
+});
+
+function waitForBreakpointWithoutCondition(dbg, url, line, index) {
+ return waitForState(dbg, () => {
+ const bp = findBreakpoints(dbg, url, line)[index];
+ return bp && !bp.options.condition;
+ });
+}
+
+function findBreakpoints(dbg, url, line) {
+ const source = findSource(dbg, url);
+ return dbg.selectors.getBreakpointsForSource(source, line);
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-duplicate-functions.js b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-duplicate-functions.js
new file mode 100644
index 0000000000..bb1fa3d64b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-duplicate-functions.js
@@ -0,0 +1,38 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests to make sure we do not accidentally slide the breakpoint up to the first
+// function with the same name in the file.
+// TODO: Likely to remove this test when removing the breakpoint sliding functionality
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger(
+ "doc-duplicate-functions.html",
+ "doc-duplicate-functions.html"
+ );
+ let source = findSource(dbg, "doc-duplicate-functions.html");
+
+ await selectSource(dbg, source);
+ await addBreakpoint(dbg, source, 21);
+
+ await reload(dbg, "doc-duplicate-functions.html");
+
+ await waitForState(dbg, state => dbg.selectors.getBreakpointCount() == 1);
+
+ const firstBreakpoint = dbg.selectors.getBreakpointsList()[0];
+ is(firstBreakpoint.location.line, 21, "Breakpoint is on line 21");
+
+ // Make sure the breakpoint set on line 19 gets hit
+ await invokeInTab("b");
+ invokeInTab("func");
+ await waitForPaused(dbg);
+
+ source = findSource(dbg, "doc-duplicate-functions.html");
+ assertPausedAtSourceAndLine(dbg, source.id, 21);
+ await assertBreakpoint(dbg, 21);
+
+ await resume(dbg);
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-in-evaled-sources.js b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-in-evaled-sources.js
new file mode 100644
index 0000000000..a4569dbfda
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-in-evaled-sources.js
@@ -0,0 +1,92 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// this evaled source includes a "debugger" statement so that it gets
+// automatically opened in the debugger when it is executed.
+// We wrap it in a setTimeout to avoid errors in the webconsole actor which
+// would still be processing the outcome of the evaluation after we destroy
+// the thread actor.
+
+"use strict";
+
+const EVALED_SOURCE_TEXT = `setTimeout(function() {
+ debugger;
+ console.log("SECOND LINE");
+}, 10)`;
+
+/**
+ * Check against blank debugger panel issues when attempting to restore
+ * breakpoints set in evaled sources (Bug 1720512).
+ *
+ * The STRs triggering this bug require to:
+ * - set a valid breakpoint on a regular source
+ * - then set a breakpoint on an evaled source
+ * - close and reopen the debugger
+ *
+ * This test will follow those STRs while also performing a few additional
+ * checks (eg verify breakpoints can be hit at various stages of the test).
+ */
+add_task(async function () {
+ info("Open the debugger and set a breakpoint on a regular script");
+ const dbg = await initDebugger("doc-scripts.html");
+ await selectSource(dbg, "doc-scripts.html");
+ await addBreakpoint(dbg, "doc-scripts.html", 21);
+
+ info("Switch to the console and evaluate a source with a debugger statement");
+ const { hud } = await dbg.toolbox.selectTool("webconsole");
+ const onSelected = dbg.toolbox.once("jsdebugger-selected");
+ await hud.ui.wrapper.dispatchEvaluateExpression(EVALED_SOURCE_TEXT);
+
+ info("Wait for the debugger to be selected");
+ await onSelected;
+
+ info("Wait for the debugger to be paused on the debugger statement");
+ await waitForPaused(dbg);
+
+ is(
+ getCM(dbg).getValue(),
+ EVALED_SOURCE_TEXT,
+ "The debugger is showing the evaled source"
+ );
+
+ const evaledSource = dbg.selectors.getSelectedSource();
+ assertPausedAtSourceAndLine(dbg, evaledSource.id, 2);
+
+ info("Add a breakpoint in the evaled source");
+ await addBreakpoint(dbg, evaledSource, 3);
+
+ info("Resume and check that we hit the breakpoint");
+ await resume(dbg);
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, evaledSource.id, 3);
+
+ info("Close the toolbox");
+ await dbg.toolbox.closeToolbox();
+
+ info("Reopen the toolbox on the debugger");
+ const toolbox2 = await openToolboxForTab(gBrowser.selectedTab, "jsdebugger");
+ const dbg2 = createDebuggerContext(toolbox2);
+
+ // The initial regression tested here led to a blank debugger,
+ // if we can see the doc-scripts.html source, this already means the debugger
+ // is functional.
+ await waitForSources(dbg2, "doc-scripts.html");
+
+ // Wait until codeMirror is rendered before reloading the debugger.
+ await waitFor(() => findElement(dbg2, "codeMirror"));
+
+ info("Reload to check if we hit the breakpoint added in doc-scripts.html");
+ const onReloaded = reload(dbg2);
+
+ await waitForDispatch(dbg2.store, "NAVIGATE");
+ await waitForSelectedSource(dbg2, "doc-scripts.html");
+ await waitForPaused(dbg2);
+
+ const scriptSource = dbg2.selectors.getSelectedSource();
+ assertPausedAtSourceAndLine(dbg2, scriptSource.id, 21);
+ await resume(dbg2);
+
+ info("Wait for reload to complete after resume");
+ await onReloaded;
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-list.js b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-list.js
new file mode 100644
index 0000000000..a4373907be
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-list.js
@@ -0,0 +1,189 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Testing displaying breakpoints in the breakpoints list and the tooltip
+// shows the source url.
+
+"use strict";
+
+add_task(async function testBreakpointsListForMultipleTargets() {
+ const dbg = await initDebugger(
+ "doc_dbg-fission-frame-sources.html",
+ "simple1.js",
+ "simple2.js"
+ );
+
+ info("Add breakpoint to the source (simple1.js) in the main thread");
+ await selectSource(dbg, "simple1.js");
+ const source1 = findSource(dbg, "simple1.js");
+ await addBreakpoint(dbg, "simple1.js", 5);
+
+ info("Add breakpoint to the source (simple2.js) in the frame");
+ await selectSource(dbg, "simple2.js");
+ const source2 = findSource(dbg, "simple2.js");
+ await addBreakpoint(dbg, "simple2.js", 3);
+
+ const breakpointHeadings = findAllElements(dbg, "breakpointHeadings");
+ const breakpointItems = findAllElements(dbg, "breakpointItems");
+
+ is(
+ breakpointHeadings.length,
+ 2,
+ "The breakpoint list shows two breakpoints sources"
+ );
+ is(
+ breakpointItems.length,
+ 2,
+ "The breakpoint list shows only two breakpoints"
+ );
+
+ is(
+ breakpointHeadings[0].title,
+ source1.url,
+ "The breakpoint heading tooltip shows the source info for the first breakpoint"
+ );
+ is(
+ breakpointHeadings[0].textContent,
+ "simple1.js",
+ "The info displayed for the breakpoint heading of the 1st breakpoint is correct"
+ );
+ is(
+ breakpointItems[0].textContent,
+ "func();5:18",
+ "The info displayed for the 1st breakpoint is correct"
+ );
+
+ is(
+ breakpointHeadings[1].title,
+ source2.url,
+ "The breakpoint heading tooltip shows the source info for the second breakpoint"
+ );
+ is(
+ breakpointHeadings[1].textContent,
+ "simple2.js",
+ "The info displayed for the breakpoint heading of the 2nd breakpoint is correct"
+ );
+ is(
+ breakpointItems[1].textContent,
+ "return x + y;3:5",
+ "The info displayed for the 2nd breakpoint is correct"
+ );
+
+ await removeBreakpoint(dbg, source1.id, 5);
+ await removeBreakpoint(dbg, source2.id, 3);
+});
+
+add_task(async function testBreakpointsListForOriginalFiles() {
+ const dbg = await initDebugger("doc-sourcemaps.html", "entry.js");
+
+ info("Add breakpoint to the entry.js (original source)");
+ await selectSource(dbg, "entry.js");
+ const source = findSource(dbg, "entry.js");
+ await addBreakpoint(dbg, "entry.js", 5);
+
+ const breakpointHeadings = findAllElements(dbg, "breakpointHeadings");
+ const breakpointItems = findAllElements(dbg, "breakpointItems");
+
+ is(
+ breakpointHeadings.length,
+ 1,
+ "The breakpoint list shows one breakpoints sources"
+ );
+ is(
+ breakpointItems.length,
+ 1,
+ "The breakpoint list shows only one breakpoints"
+ );
+
+ is(
+ breakpointHeadings[0].title,
+ source.url,
+ "The breakpoint heading tooltip shows the source info for the first breakpoint"
+ );
+ is(
+ breakpointHeadings[0].textContent,
+ "entry.js",
+ "The info displayed for the breakpoint heading of the 1st breakpoint is correct"
+ );
+ is(
+ breakpointItems[0].textContent,
+ "output(times2(1));5",
+ "The info displayed for the 1st breakpoint is correct"
+ );
+
+ await removeBreakpoint(dbg, source.id, 5);
+});
+
+add_task(async function testBreakpointsListForIgnoredLines() {
+ const dbg = await initDebugger("doc-sourcemaps.html", "entry.js");
+
+ info("Add breakpoint to the entry.js (original source)");
+ await selectSource(dbg, "entry.js");
+ await addBreakpoint(dbg, "entry.js", 5);
+
+ info("Ignoring line 5 to 6 which has a breakpoint already set");
+ await selectEditorLinesAndOpenContextMenu(dbg, {
+ startLine: 5,
+ endLine: 6,
+ });
+ await selectBlackBoxContextMenuItem(dbg, "blackbox-lines");
+
+ info("Assert the breakpoint on the ignored line");
+ let breakpointItems = findAllElements(dbg, "breakpointItems");
+ is(
+ breakpointItems[0].textContent,
+ "output(times2(1));5",
+ "The info displayed for the 1st breakpoint is correct"
+ );
+ const firstBreakpointCheck = breakpointItems[0].querySelector("input");
+ ok(
+ firstBreakpointCheck.disabled,
+ "The first breakpoint checkbox on an ignored line is disabled"
+ );
+ ok(
+ !firstBreakpointCheck.checked,
+ "The first breakpoint on an ignored line is not checked"
+ );
+
+ info("Ignoring line 8 to 9 which currently has not breakpoint");
+ await selectEditorLinesAndOpenContextMenu(dbg, {
+ startLine: 8,
+ endLine: 9,
+ });
+ await selectBlackBoxContextMenuItem(dbg, "blackbox-lines");
+
+ await addBreakpointViaGutter(dbg, 9);
+
+ breakpointItems = findAllElements(dbg, "breakpointItems");
+ is(
+ breakpointItems[1].textContent,
+ "output(times2(3));9",
+ "The info displayed for the 2nd breakpoint is correct"
+ );
+ const secondBreakpointCheck = breakpointItems[1].querySelector("input");
+ ok(
+ secondBreakpointCheck.disabled,
+ "The second breakpoint checkbox on an ignored line is disabled"
+ );
+ ok(
+ !secondBreakpointCheck.checked,
+ "The second breakpoint on an ignored line is not checked"
+ );
+
+ await clickElement(dbg, "blackbox");
+ await waitForDispatch(dbg.store, "UNBLACKBOX_WHOLE_SOURCES");
+
+ info("Assert that both breakpoints are now enabled");
+ breakpointItems = findAllElements(dbg, "breakpointItems");
+ [...breakpointItems].forEach(breakpointItem => {
+ const check = breakpointItem.querySelector("input");
+ ok(
+ !check.disabled,
+ "The breakpoint checkbox on the unignored line is enabled"
+ );
+ ok(check.checked, "The breakpoint on the unignored line is checked");
+ });
+
+ await dbg.toolbox.closeToolbox();
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-popup.js b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-popup.js
new file mode 100644
index 0000000000..a3b7753738
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-popup.js
@@ -0,0 +1,250 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Verify that we hit breakpoints on popups
+
+"use strict";
+
+const TEST_URI = "https://example.org/document-builder.sjs?html=main page";
+const POPUP_URL = `https://example.com/document-builder.sjs?html=${escape(`popup for breakpoints
+ <script>
+ var paused = true;
+ console.log('popup');
+ paused = false;
+ </script>
+`)}`;
+const POPUP_DEBUGGER_STATEMENT_URL = `https://example.com/document-builder.sjs?html=${escape(`popup with debugger;
+ <script>
+ var paused = true;
+ debugger;
+ paused = false;
+ </script>
+`)}`;
+
+function isPopupPaused(popupBrowsingContext) {
+ return SpecialPowers.spawn(popupBrowsingContext, [], function (url) {
+ return content.wrappedJSObject.paused;
+ });
+}
+
+async function openPopup(popupUrl, browser = gBrowser.selectedBrowser) {
+ const onPopupTabSelected = BrowserTestUtils.waitForEvent(
+ gBrowser.tabContainer,
+ "TabSelect"
+ );
+ const popupBrowsingContext = await SpecialPowers.spawn(
+ browser,
+ [popupUrl],
+ function (url) {
+ const popup = content.open(url);
+ return popup.browsingContext;
+ }
+ );
+ await onPopupTabSelected;
+ is(
+ gBrowser.selectedBrowser.browsingContext,
+ popupBrowsingContext,
+ "The popup is the selected tab"
+ );
+ return popupBrowsingContext;
+}
+
+async function closePopup(browsingContext) {
+ const onPreviousTabSelected = BrowserTestUtils.waitForEvent(
+ gBrowser.tabContainer,
+ "TabSelect"
+ );
+ await SpecialPowers.spawn(browsingContext, [], function () {
+ content.close();
+ });
+ await onPreviousTabSelected;
+}
+
+add_task(async function testPausedByBreakpoint() {
+ await pushPref("devtools.popups.debug", true);
+
+ info("Test breakpoints set in popup scripts");
+ const dbg = await initDebuggerWithAbsoluteURL(TEST_URI);
+
+ info("Open the popup in order to be able to set a breakpoint");
+ const firstPopupBrowsingContext = await openPopup(POPUP_URL);
+
+ await waitForSource(dbg, POPUP_URL);
+ const source = findSource(dbg, POPUP_URL);
+
+ await selectSource(dbg, source);
+ await addBreakpoint(dbg, source, 4);
+
+ info("Now close and reopen the popup");
+ await closePopup(firstPopupBrowsingContext);
+
+ info("Re-open the popup");
+ const popupBrowsingContext = await openPopup(POPUP_URL);
+ await waitForPaused(dbg);
+ is(
+ await isPopupPaused(popupBrowsingContext),
+ true,
+ "The popup is really paused"
+ );
+
+ await waitForSource(dbg, POPUP_URL);
+ assertPausedAtSourceAndLine(dbg, source.id, 4);
+
+ await resume(dbg);
+ is(
+ await isPopupPaused(popupBrowsingContext),
+ false,
+ "The popup resumed its execution"
+ );
+});
+
+add_task(async function testPausedByDebuggerStatement() {
+ info("Test debugger statements in popup scripts");
+ const dbg = await initDebuggerWithAbsoluteURL(TEST_URI);
+
+ info("Open a popup with a debugger statement");
+ const popupBrowsingContext = await openPopup(POPUP_DEBUGGER_STATEMENT_URL);
+ await waitForPaused(dbg);
+ is(
+ await isPopupPaused(popupBrowsingContext),
+ true,
+ "The popup is really paused"
+ );
+
+ const source = findSource(dbg, POPUP_DEBUGGER_STATEMENT_URL);
+ assertPausedAtSourceAndLine(dbg, source.id, 4);
+
+ await resume(dbg);
+ is(
+ await isPopupPaused(popupBrowsingContext),
+ false,
+ "The popup resumed its execution"
+ );
+});
+
+add_task(async function testPausedInTwoPopups() {
+ info("Test being paused in two popup at the same time");
+ const dbg = await initDebuggerWithAbsoluteURL(TEST_URI);
+
+ info("Open the popup in order to be able to set a breakpoint");
+ const browser = gBrowser.selectedBrowser;
+ const popupBrowsingContext = await openPopup(POPUP_URL);
+
+ await waitForSource(dbg, POPUP_URL);
+ const source = findSource(dbg, POPUP_URL);
+
+ await selectSource(dbg, source);
+ await addBreakpoint(dbg, source, 4);
+
+ info("Now close and reopen the popup");
+ await closePopup(popupBrowsingContext);
+
+ info("Open a first popup which will hit the breakpoint");
+ const firstPopupBrowsingContext = await openPopup(POPUP_URL);
+ await waitForPaused(dbg);
+ const { targetCommand } = dbg.commands;
+ const firstTarget = targetCommand
+ .getAllTargets([targetCommand.TYPES.FRAME])
+ .find(targetFront => targetFront.url == POPUP_URL);
+ is(
+ firstTarget.browsingContextID,
+ firstPopupBrowsingContext.id,
+ "The popup target matches the popup BrowsingContext"
+ );
+ const firstThread = (await firstTarget.getFront("thread")).actorID;
+ is(
+ dbg.selectors.getCurrentThread(),
+ firstThread,
+ "The popup thread is automatically selected on pause"
+ );
+ is(
+ await isPopupPaused(firstPopupBrowsingContext),
+ true,
+ "The first popup is really paused"
+ );
+
+ info("Open a second popup which will also hit the breakpoint");
+ let onAvailable;
+ const onNewTarget = new Promise(resolve => {
+ onAvailable = ({ targetFront }) => {
+ if (
+ targetFront.url == POPUP_URL &&
+ targetFront.browsingContextID != firstPopupBrowsingContext.id
+ ) {
+ targetCommand.unwatchTargets({
+ types: [targetCommand.TYPES.FRAME],
+ onAvailable,
+ });
+ resolve(targetFront);
+ }
+ };
+ });
+ await targetCommand.watchTargets({
+ types: [targetCommand.TYPES.FRAME],
+ onAvailable,
+ });
+ const secondPopupBrowsingContext = await openPopup(POPUP_URL, browser);
+ info("Wait for second popup's target");
+ const popupTarget = await onNewTarget;
+ is(
+ popupTarget.browsingContextID,
+ secondPopupBrowsingContext.id,
+ "The new target matches the popup WindowGlobal"
+ );
+ const secondThread = (await popupTarget.getFront("thread")).actorID;
+ await waitForPausedThread(dbg, secondThread);
+ is(
+ dbg.selectors.getCurrentThread(),
+ secondThread,
+ "The second popup thread is automatically selected on pause"
+ );
+ is(
+ await isPopupPaused(secondPopupBrowsingContext),
+ true,
+ "The second popup is really paused"
+ );
+
+ info("Resume the execution of the second popup");
+ await resume(dbg);
+ is(
+ await isPopupPaused(secondPopupBrowsingContext),
+ false,
+ "The second popup resumed its execution"
+ );
+ is(
+ await isPopupPaused(firstPopupBrowsingContext),
+ true,
+ "The first popup is still paused"
+ );
+
+ info("Resume the execution of the first popup");
+ await dbg.actions.selectThread(firstThread);
+ await resume(dbg);
+ is(
+ await isPopupPaused(firstPopupBrowsingContext),
+ false,
+ "The first popup resumed its execution"
+ );
+});
+
+add_task(async function testClosingOriginalTab() {
+ info(
+ "Test closing the toolbox on the original tab while the popup is kept open"
+ );
+ const dbg = await initDebuggerWithAbsoluteURL(TEST_URI);
+ await dbg.toolbox.selectTool("webconsole");
+
+ info("Open a popup");
+ const originalTab = gBrowser.selectedTab;
+ await openPopup("about:blank");
+ await wait(1000);
+ const popupTab = gBrowser.selectedTab;
+ gBrowser.selectedTab = originalTab;
+ info("Close the toolbox from the original tab");
+ await dbg.toolbox.closeToolbox();
+ await wait(1000);
+ info("Re-select the popup");
+ gBrowser.selectedTab = popupTab;
+ await wait(1000);
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-reloading-with-source-changes.js b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-reloading-with-source-changes.js
new file mode 100644
index 0000000000..a95599a2b4
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-reloading-with-source-changes.js
@@ -0,0 +1,186 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// This tests breakpoints resyncing when source content changes
+// after reload.
+"use strict";
+
+const httpServer = createTestHTTPServer();
+httpServer.registerContentType("html", "text/html");
+httpServer.registerContentType("js", "application/javascript");
+
+httpServer.registerPathHandler(
+ "/doc-breakpoint-reload.html",
+ (request, response) => {
+ response.setStatusLine(request.httpVersion, 200, "OK");
+ response.write(`<!DOCTYPE html>
+ <html>
+ <head>
+ <script type="text/javascript" src="/script.js"></script>
+ </head>
+ </html>
+ `);
+ }
+);
+
+let views = 0;
+httpServer.registerPathHandler("/script.js", (request, response) => {
+ response.setHeader("Content-Type", "application/javascript");
+ // The script contents to serve on reload of script.js. Each relaod
+ // cycles through the script content.
+ const content = [
+ // CONTENT 1: Source content with 1 function
+ // The breakpoint will be set on line 3 (i.e with the `return` statement)
+ `function bar() {
+ const prefix = "long";
+ return prefix + "bar";
+}
+console.log(bar());`,
+
+ // CONTENT 2: Source content with 2 functions, where the breakpoint is now in a
+ // different function though the line does not change.
+ `function foo() {
+ const prefix = "long";
+ return prefix + "foo";
+}
+
+function bar() {
+ const prefix = "long";
+ return prefix + "bar";
+}
+console.log(bar(), foo());`,
+
+ // CONTENT 3: Source content with comments and 1 function, where the breakpoint is
+ // is now at a line with comments (non-breakable line).
+ `// This is a random comment which is here
+// to move the function a couple of lines
+// down, making sure the breakpoint is on
+// a non-breakable line.
+function bar() {
+ const prefix = "long";
+ return prefix + "bar";
+}
+console.log(bar());`,
+
+ // CONTENT 4: Source content with just a comment where the line which the breakpoint
+ // is supposed to be on no longer exists.
+ `// one line comment`,
+ ];
+
+ response.write(content[views % content.length]);
+ views++;
+});
+
+const BASE_URL = `http://localhost:${httpServer.identity.primaryPort}/`;
+
+add_task(async function testBreakpointInFunctionRelocation() {
+ info("Start test for relocation of breakpoint set in a function");
+ const dbg = await initDebuggerWithAbsoluteURL(
+ `${BASE_URL}doc-breakpoint-reload.html`,
+ "script.js"
+ );
+
+ let source = findSource(dbg, "script.js");
+ await selectSource(dbg, source);
+
+ info("Add breakpoint in bar()");
+ await addBreakpoint(dbg, source, 3);
+
+ info(
+ "Assert the text content on line 3 to make sure the breakpoint was set in bar()"
+ );
+ assertTextContentOnLine(dbg, 3, 'return prefix + "bar";');
+
+ info("Check that only one breakpoint is set in the reducer");
+ is(dbg.selectors.getBreakpointCount(), 1, "Only one breakpoint exists");
+
+ info("Check that only one breakpoint is set on the server");
+ is(
+ dbg.client.getServerBreakpointsList().length,
+ 1,
+ "Only one breakpoint exists on the server"
+ );
+
+ info(
+ "Reload should change the source content to CONTENT 2 i.e 2 functions foo() and bar()"
+ );
+ const onReloaded = reload(dbg);
+ await waitForPaused(dbg);
+
+ source = findSource(dbg, "script.js");
+
+ info("Assert that the breakpoint pauses on line 3");
+ assertPausedAtSourceAndLine(dbg, source.id, 3);
+
+ info("Assert that the breakpoint is visible on line 3");
+ await assertBreakpoint(dbg, 3);
+
+ info("Assert the text content on line 3 to make sure we are paused in foo()");
+ assertTextContentOnLine(dbg, 3, 'return prefix + "foo";');
+
+ info("Check that only one breakpoint currently exists in the reducer");
+ is(dbg.selectors.getBreakpointCount(), 1, "One breakpoint exists");
+
+ info("Check that only one breakpoint exist on the server");
+ is(
+ dbg.client.getServerBreakpointsList().length,
+ 1,
+ "Only one breakpoint exists on the server"
+ );
+
+ await resume(dbg);
+ info("Wait for reload to complete after resume");
+ await onReloaded;
+
+ info(
+ "Reload should change the source content to CONTENT 3 i.e comments and 1 function bar()"
+ );
+ await reload(dbg);
+ await waitForSelectedSource(dbg, "script.js");
+
+ await assertNotPaused(dbg);
+
+ info(
+ "Assert that the breakpoint is not visible on line 3 which is a non-breakable line"
+ );
+ await assertNoBreakpoint(dbg, 3);
+
+ info("Check that no breakpoint exists in the reducer");
+ is(dbg.selectors.getBreakpointCount(), 0, "Breakpoint has been removed");
+
+ // See comment on line 175
+ info("Check that one breakpoint exists on the server");
+ is(
+ dbg.client.getServerBreakpointsList().length,
+ 1,
+ "Breakpoint has been removed on the server"
+ );
+
+ info(
+ "Reload should change the source content to CONTENT 4 which is just a one comment line"
+ );
+ await reload(dbg);
+ await waitForSelectedSource(dbg, "script.js");
+
+ // There will initially be zero breakpoints, but wait to make sure none are
+ // installed while syncing.
+ await wait(1000);
+ assertNotPaused(dbg);
+
+ info("Assert that the source content is one comment line");
+ assertTextContentOnLine(dbg, 1, "// one line comment");
+
+ info("Check that no breakpoint still exists in the reducer");
+ is(dbg.selectors.getBreakpointCount(), 0, "No breakpoint exists");
+
+ // Breakpoints do not get removed in this situation, to support breakpoints in
+ // inline sources which load and get hit progressively. See the browser_dbg-breakpoints-reloading.js
+ // test for this behaviour.
+ info("Check that one breakpoint exists on the server");
+ is(
+ dbg.client.getServerBreakpointsList().length,
+ 1,
+ "One breakpoint exists on the server"
+ );
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-reloading.js b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-reloading.js
new file mode 100644
index 0000000000..ca953445ba
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-reloading.js
@@ -0,0 +1,124 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests breakpoints syncing when reloading
+
+"use strict";
+
+requestLongerTimeout(3);
+
+// Tests that a breakpoint set is correctly synced after reload
+// and gets hit correctly.
+add_task(async function () {
+ const dbg = await initDebugger("doc-scripts.html", "simple1.js", "long.js");
+
+ await selectSource(dbg, "simple1.js");
+
+ // Setting 2 breakpoints, one on line 61 which is expected
+ // to get hit, while the other on line 56 which is not expected
+ // to get hit, but to assert that it correctly set after reload.
+ await addBreakpointViaGutter(dbg, 61);
+ await addBreakpointViaGutter(dbg, 56);
+
+ await selectSource(dbg, "long.js");
+
+ await addBreakpointViaGutter(dbg, 1);
+
+ const onReloaded = reload(dbg);
+ await waitForPaused(dbg);
+
+ info("Assert that the source is not long.js");
+ // Adding this is redundant but just to make it explicit that we
+ // make sure long.js should not exist yet
+ assertSourceDoesNotExist(dbg, "long.js");
+
+ const source = findSource(dbg, "simple1.js");
+
+ await assertPausedAtSourceAndLine(dbg, source.id, 61);
+
+ info("The breakpoint for long.js does not exist yet");
+ await waitForState(dbg, state => dbg.selectors.getBreakpointCount() == 2);
+
+ // The breakpoints are available once their corresponding source
+ // has been processed. Let's assert that all the breakpoints for
+ // simple1.js have been restored.
+ await assertBreakpoint(dbg, 56);
+ await assertBreakpoint(dbg, 61);
+
+ await resume(dbg);
+ await waitForPaused(dbg);
+
+ const source2 = findSource(dbg, "long.js");
+
+ await assertPausedAtSourceAndLine(dbg, source2.id, 1);
+
+ info("All 3 breakpoints from simple1.js and long.js still exist");
+ await waitForState(dbg, state => dbg.selectors.getBreakpointCount() == 3);
+
+ await assertBreakpoint(dbg, 1);
+
+ await resume(dbg);
+
+ info("Wait for reload to complete after resume");
+ await onReloaded;
+
+ // remove breakpoints so they do not affect other
+ // tests.
+ await removeBreakpoint(dbg, source.id, 56);
+ await removeBreakpoint(dbg, source.id, 61);
+ await removeBreakpoint(dbg, source2.id, 1);
+
+ await dbg.toolbox.closeToolbox();
+});
+
+// Test that pending breakpoints are installed in inline scripts as they are
+// sent to the client.
+add_task(async function () {
+ const dbg = await initDebugger("doc-scripts.html", "doc-scripts.html");
+
+ await selectSource(dbg, "doc-scripts.html");
+ await addBreakpointViaGutter(dbg, 22);
+ await addBreakpointViaGutter(dbg, 27);
+
+ const onReloaded = reload(dbg, "doc-scripts.html");
+ await waitForPaused(dbg);
+
+ const source = findSource(dbg, "doc-scripts.html");
+
+ await assertPausedAtSourceAndLine(dbg, source.id, 22);
+
+ info("Only the breakpoint for the first inline script should exist");
+ await waitForState(dbg, state => dbg.selectors.getBreakpointCount() == 1);
+
+ await assertBreakpoint(dbg, 22);
+
+ // The second breakpoint we added is in a later inline script, and won't
+ // appear until after we have resumed from the first breakpoint and the
+ // second inline script has been created.
+ await assertNoBreakpoint(dbg, 27);
+
+ await resume(dbg);
+ await waitForPaused(dbg);
+
+ info("All 2 breakpoints from both inline scripts still exist");
+ await waitForState(dbg, state => dbg.selectors.getBreakpointCount() == 2);
+
+ await assertPausedAtSourceAndLine(dbg, source.id, 27);
+ await assertBreakpoint(dbg, 27);
+
+ await resume(dbg);
+
+ info("Wait for reload to complete after resume");
+ await onReloaded;
+
+ await removeBreakpoint(dbg, source.id, 22);
+ await removeBreakpoint(dbg, source.id, 27);
+
+ await dbg.toolbox.closeToolbox();
+});
+
+function assertSourceDoesNotExist(dbg, url) {
+ const source = findSource(dbg, url, { silent: true });
+ ok(!source, `Source for ${url} does not exist`);
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-same-file-per-target.js b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-same-file-per-target.js
new file mode 100644
index 0000000000..08918c235f
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-same-file-per-target.js
@@ -0,0 +1,114 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests shows that breakpoints per url feature works in the debugger.
+
+"use strict";
+
+add_task(async function () {
+ // This test fails with server side target switching disabled
+ if (!isFissionEnabled() && !isEveryFrameTargetEnabled()) {
+ return;
+ }
+
+ const dbg = await initDebugger(
+ "doc_dbg-same-source-distinct-threads.html",
+ "same-script.js"
+ );
+
+ // There is one source but 3 source actors. One per same-script.js instance,
+ // one <script> tag, one worker and one <script> tag in the iframe.
+ const source = findSource(dbg, "same-script.js");
+ await waitUntil(
+ () => dbg.selectors.getSourceActorsForSource(source.id).length == 3
+ );
+
+ info("Add a breakpoint to the same-script.js from the iframe");
+ await selectSource(dbg, source);
+ await addBreakpoint(dbg, source, 5);
+
+ info("Click in the page of the top-level document");
+ BrowserTestUtils.synthesizeMouseAtCenter(
+ "body",
+ {},
+ gBrowser.selectedBrowser
+ );
+
+ await waitForPaused(dbg);
+
+ is(
+ dbg.selectors.getSelectedSource().id,
+ source.id,
+ "The current selected source is the `same-script.js` from the main thread"
+ );
+
+ info("Assert that the breakpoint pauses on line 5");
+ assertPausedAtSourceAndLine(dbg, source.id, 5);
+
+ // This fails at the moment as there is no visible breakpoint on this line
+ info("Assert that there is a breakpoint displayed on line 5");
+ await assertBreakpoint(dbg, 5);
+
+ info("Check that only one breakpoint currently exists");
+ is(dbg.selectors.getBreakpointCount(), 1, "One breakpoint exists");
+
+ await resume(dbg);
+
+ info(
+ "Trigger the breakpoint in the worker thread to make sure it hit the breakpoint"
+ );
+
+ invokeInTab("postMessageToWorker");
+ await waitForPaused(dbg);
+
+ is(
+ dbg.selectors.getSelectedSource().id,
+ source.id,
+ "The current selected source is the `same-script.js` from the worker thread"
+ );
+
+ info("Assert that the breakpoint pauses on line 5");
+ assertPausedAtSourceAndLine(dbg, source.id, 5);
+
+ info("Assert that there is a breakpoint dispalyed on line 5");
+ await assertBreakpoint(dbg, 5);
+
+ info("Check that only one breakpoint still currently exists");
+ is(dbg.selectors.getBreakpointCount(), 1, "One breakpoint exists");
+
+ await resume(dbg);
+
+ info("Trigger breakpoint in the iframe to make sure it hits the breakpoint");
+
+ const iframeBrowsingContext = await SpecialPowers.spawn(
+ gBrowser.selectedBrowser,
+ [],
+ async () => {
+ return content.document.querySelector("iframe").browsingContext;
+ }
+ );
+
+ BrowserTestUtils.synthesizeMouseAtCenter("body", {}, iframeBrowsingContext);
+
+ await waitForPaused(dbg);
+
+ is(
+ dbg.selectors.getSelectedSource().id,
+ source.id,
+ "The current selected source is the `same-script.js` from the iframe"
+ );
+
+ info("Assert that the breakpoint pauses on line 5");
+ assertPausedAtSourceAndLine(dbg, source.id, 5);
+
+ info("Assert that there is a breakpoint displayed on line 5");
+ await assertBreakpoint(dbg, 5);
+
+ await resume(dbg);
+ assertNotPaused(dbg);
+
+ await removeBreakpoint(dbg, source.id, 5);
+
+ await dbg.toolbox.closeToolbox();
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-scroll-to-log.js b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-scroll-to-log.js
new file mode 100644
index 0000000000..c4a1b70322
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-scroll-to-log.js
@@ -0,0 +1,61 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Confirms the editor scrolls to the correct line when a log point is set or edited from
+// the breakpoints context menu.
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-scripts.html");
+ await selectSource(dbg, "long.js");
+ await waitForSelectedSource(dbg, "long.js");
+
+ await addBreakpoint(dbg, "long.js", 66);
+ await waitForBreakpoint(dbg, "long.js", 66);
+
+ info("scroll editor to the top");
+ const cm = getCM(dbg);
+ cm.scrollTo(0, 0);
+
+ is(cm.getScrollInfo().top, 0, "editor is scrolled to the top.");
+
+ info("open breakpointContextMenu and select add log");
+ await openBreakpointContextMenu(dbg);
+
+ selectContextMenuItem(
+ dbg,
+ `${selectors.addLogItem},${selectors.editLogItem}`
+ );
+
+ info("set the log value");
+ await typeInPanel(dbg, "this.todos");
+ await waitForDispatch(dbg.store, "SET_BREAKPOINT");
+
+ is(cm.getScrollInfo().top, 870, "editor is scrolled to the log input line.");
+
+ info("scroll editor to the top");
+ cm.scrollTo(0, 0);
+
+ is(cm.getScrollInfo().top, 0, "editor is scrolled to the top.");
+
+ info("open breakpointContextMenu and select edit log");
+ await openBreakpointContextMenu(dbg);
+
+ selectContextMenuItem(
+ dbg,
+ `${selectors.addLogItem},${selectors.editLogItem}`
+ );
+
+ info("set the log value");
+ await typeInPanel(dbg, ".id");
+ await waitForDispatch(dbg.store, "SET_BREAKPOINT");
+
+ is(cm.getScrollInfo().top, 870, "editor is scrolled to the log input line.");
+});
+
+async function openBreakpointContextMenu(dbg) {
+ rightClickElement(dbg, "breakpointItem", 2);
+ await waitForContextMenu(dbg);
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-sourcemap-with-sections.js b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-sourcemap-with-sections.js
new file mode 100644
index 0000000000..423eb37e2c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints-sourcemap-with-sections.js
@@ -0,0 +1,27 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+// Test that breakpoints gets hit in sources generated from a sourcemap
+// where the mappings are put in the `sections` property.
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-sourcemaps.html", "xbundle.js");
+ await selectSource(dbg, "xbundle.js");
+ await waitForSelectedSource(dbg, "xbundle.js");
+
+ await addBreakpoint(dbg, "xbundle.js", 5);
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, findSource(dbg, "xbundle.js").id, 5);
+
+ // Switch to original source
+ await dbg.actions.jumpToMappedSelectedLocation();
+
+ info("Wait for the original file (xsource.js) to get selected");
+ await waitForSelectedSource(dbg, "xsource.js");
+
+ const originalSource = findSource(dbg, "xsource.js");
+ assertPausedAtSourceAndLine(dbg, originalSource.id, 3);
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints.js b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints.js
new file mode 100644
index 0000000000..9a68c5ba39
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-breakpoints.js
@@ -0,0 +1,102 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test enabling and disabling a breakpoint using the check boxes
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-scripts.html", "simple2.js");
+
+ // Create two breakpoints
+ await selectSource(dbg, "simple2.js");
+ await addBreakpoint(dbg, "simple2.js", 3);
+ await addBreakpoint(dbg, "simple2.js", 5);
+
+ // Disable the first one
+ await disableBreakpoint(dbg, 0);
+ let bp1 = findBreakpoint(dbg, "simple2.js", 3);
+ let bp2 = findBreakpoint(dbg, "simple2.js", 5);
+ is(bp1.disabled, true, "first breakpoint is disabled");
+ is(bp2.disabled, false, "second breakpoint is enabled");
+
+ // Disable and Re-Enable the second one
+ await disableBreakpoint(dbg, 1);
+ await enableBreakpoint(dbg, 1);
+ bp2 = findBreakpoint(dbg, "simple2.js", 5);
+ is(bp2.disabled, false, "second breakpoint is enabled");
+
+ // Cleanup
+ await cleanupBreakpoints(dbg);
+
+ // Test enabling and disabling a breakpoint using the context menu
+ await selectSource(dbg, "simple2.js");
+ await addBreakpoint(dbg, "simple2.js", 3);
+ await addBreakpoint(dbg, "simple2.js", 5);
+
+ assertBreakpointSnippet(dbg, 3, "return x + y;");
+
+ rightClickElement(dbg, "breakpointItem", 2);
+ await waitForContextMenu(dbg);
+ const disableBreakpointDispatch = waitForDispatch(
+ dbg.store,
+ "SET_BREAKPOINT"
+ );
+ selectContextMenuItem(dbg, selectors.breakpointContextMenu.disableSelf);
+ await disableBreakpointDispatch;
+
+ bp1 = findBreakpoint(dbg, "simple2.js", 3);
+ bp2 = findBreakpoint(dbg, "simple2.js", 5);
+ is(bp1.disabled, true, "first breakpoint is disabled");
+ is(bp2.disabled, false, "second breakpoint is enabled");
+
+ rightClickElement(dbg, "breakpointItem", 2);
+ await waitForContextMenu(dbg);
+ const enableBreakpointDispatch = waitForDispatch(dbg.store, "SET_BREAKPOINT");
+ selectContextMenuItem(dbg, selectors.breakpointContextMenu.enableSelf);
+ await enableBreakpointDispatch;
+
+ bp1 = findBreakpoint(dbg, "simple2.js", 3);
+ bp2 = findBreakpoint(dbg, "simple2.js", 5);
+ is(bp1.disabled, false, "first breakpoint is enabled");
+ is(bp2.disabled, false, "second breakpoint is enabled");
+
+ // Cleanup
+ await cleanupBreakpoints(dbg);
+
+ // Test creation of disabled breakpoint with shift-click
+ await shiftClickElement(dbg, "gutter", 3);
+ await waitForBreakpoint(dbg, "simple2.js", 3);
+
+ const bp = findBreakpoint(dbg, "simple2.js", 3);
+ is(bp.disabled, true, "breakpoint is disabled");
+
+ // Cleanup
+ await cleanupBreakpoints(dbg);
+});
+
+function toggleBreakpoint(dbg, index) {
+ const bp = findAllElements(dbg, "breakpointItems")[index];
+ const input = bp.querySelector("input");
+ input.click();
+}
+
+async function disableBreakpoint(dbg, index) {
+ const disabled = waitForDispatch(dbg.store, "SET_BREAKPOINT");
+ toggleBreakpoint(dbg, index);
+ await disabled;
+}
+
+async function enableBreakpoint(dbg, index) {
+ const enabled = waitForDispatch(dbg.store, "SET_BREAKPOINT");
+ toggleBreakpoint(dbg, index);
+ await enabled;
+}
+
+async function cleanupBreakpoints(dbg) {
+ clickElement(dbg, "gutter", 3);
+ clickElement(dbg, "gutter", 5);
+ await waitForBreakpointRemoved(dbg, "simple2.js", 3);
+ await waitForBreakpointRemoved(dbg, "simple2.js", 5);
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-browser-toolbox-unselected-pause.js b/devtools/client/debugger/test/mochitest/browser_dbg-browser-toolbox-unselected-pause.js
new file mode 100644
index 0000000000..1380eb7549
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-browser-toolbox-unselected-pause.js
@@ -0,0 +1,67 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test that the debugger pauses in the multiprocess browser toolbox even when
+// it hasn't been opened.
+
+"use strict";
+
+requestLongerTimeout(4);
+
+Services.scriptloader.loadSubScript(
+ "chrome://mochitests/content/browser/devtools/client/framework/browser-toolbox/test/helpers-browser-toolbox.js",
+ this
+);
+
+add_task(async function () {
+ await pushPref("devtools.browsertoolbox.scope", "everything");
+
+ // Make sure the toolbox opens with the webconsole initially selected.
+ await pushPref("devtools.browsertoolbox.panel", "webconsole");
+
+ const ToolboxTask = await initBrowserToolboxTask();
+ await ToolboxTask.importFunctions({
+ createDebuggerContext,
+ waitUntil,
+ waitForPaused,
+ isPaused,
+ waitForState,
+ waitForSelectedSource,
+ waitForLoadedScopes,
+ waitForElement,
+ findElement,
+ getSelector,
+ findElementWithSelector,
+ createLocation,
+ });
+ // ToolboxTask.spawn pass input arguments by stringify them via string concatenation.
+ // This mean we have to stringify the input object, but don't have to parse it from the task.
+ await ToolboxTask.spawn(selectors, async _selectors => {
+ this.selectors = _selectors;
+ });
+
+ addTab("data:text/html,<script>debugger;</script>");
+
+ // The debugger should automatically be selected.
+ await ToolboxTask.spawn(null, async () => {
+ /* global gToolbox */
+ await waitUntil(() => gToolbox.currentToolId == "jsdebugger");
+ });
+ ok(true, "Debugger selected");
+
+ // The debugger should pause.
+ await ToolboxTask.spawn(null, async () => {
+ // Wait for the debugger to finish loading.
+ await gToolbox.getPanelWhenReady("jsdebugger");
+
+ const dbg = createDebuggerContext(gToolbox);
+ await waitForPaused(dbg);
+ if (!gToolbox.isHighlighted("jsdebugger")) {
+ throw new Error("Debugger not highlighted");
+ }
+ });
+ ok(true, "Paused in new tab");
+
+ await ToolboxTask.destroy();
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-browser-toolbox-workers.js b/devtools/client/debugger/test/mochitest/browser_dbg-browser-toolbox-workers.js
new file mode 100644
index 0000000000..f08feb4ba9
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-browser-toolbox-workers.js
@@ -0,0 +1,55 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test that all kinds of workers show up properly in the multiprocess browser
+// toolbox.
+
+"use strict";
+
+requestLongerTimeout(4);
+
+Services.scriptloader.loadSubScript(
+ "chrome://mochitests/content/browser/devtools/client/framework/browser-toolbox/test/helpers-browser-toolbox.js",
+ this
+);
+
+add_task(async function () {
+ await pushPref("devtools.browsertoolbox.scope", "everything");
+ await pushPref("dom.serviceWorkers.enabled", true);
+ await pushPref("dom.serviceWorkers.testing.enabled", true);
+
+ const ToolboxTask = await initBrowserToolboxTask();
+ await ToolboxTask.importFunctions({
+ waitUntil,
+ waitForAllTargetsToBeAttached,
+ });
+
+ await addTab(`${EXAMPLE_URL}doc-all-workers.html`);
+
+ await ToolboxTask.spawn(null, async () => {
+ /* global gToolbox */
+ await gToolbox.selectTool("jsdebugger");
+ const dbg = gToolbox.getCurrentPanel().panelWin.dbg;
+
+ await waitUntil(() => {
+ const threads = dbg.selectors.getThreads();
+ function hasWorker(workerName) {
+ // eslint-disable-next-line max-nested-callbacks
+ return threads.some(({ name }) => name == workerName);
+ }
+ return (
+ hasWorker("simple-worker.js") &&
+ hasWorker("shared-worker.js") &&
+ hasWorker("service-worker.sjs")
+ );
+ });
+
+ await waitForAllTargetsToBeAttached(gToolbox.commands.targetCommand);
+ });
+ ok(true, "All workers appear in browser toolbox debugger");
+
+ invokeInTab("unregisterServiceWorker");
+
+ await ToolboxTask.destroy();
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-call-stack.js b/devtools/client/debugger/test/mochitest/browser_dbg-call-stack.js
new file mode 100644
index 0000000000..d461918d7a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-call-stack.js
@@ -0,0 +1,124 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+// Ignore strange errors when shutting down.
+PromiseTestUtils.allowMatchingRejectionsGlobally(/No such actor/);
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-script-switching.html");
+
+ const found = findElement(dbg, "callStackBody");
+ is(found, null, "Call stack is hidden");
+
+ invokeInTab("firstCall");
+ await waitForPaused(dbg);
+ ok(isFrameSelected(dbg, 1, "secondCall"), "the first frame is selected");
+
+ const button = toggleButton(dbg);
+ ok(!button, "toggle button shouldn't be there");
+});
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-frames.html");
+
+ invokeInTab("startRecursion");
+ await waitForPaused(dbg);
+ ok(isFrameSelected(dbg, 1, "recurseA"), "the first frame is selected");
+
+ // check to make sure that the toggle button isn't there
+ let button = toggleButton(dbg);
+ let frames = findAllElements(dbg, "frames");
+ is(button.innerText, "Expand rows", "toggle button should be 'expand'");
+ is(frames.length, 7, "There should be at most seven frames");
+
+ button.click();
+
+ button = toggleButton(dbg);
+ frames = findAllElements(dbg, "frames");
+ is(button.innerText, "Collapse rows", "toggle button should be collapsed");
+ is(frames.length, 22, "All of the frames should be shown");
+ await waitForSelectedSource(dbg, "frames.js");
+});
+
+add_task(async function () {
+ const url = createMockAngularPage();
+ const tab = await addTab(url);
+ info("Open debugger");
+ const toolbox = await openToolboxForTab(tab, "jsdebugger");
+ const dbg = createDebuggerContext(toolbox);
+
+ const found = findElement(dbg, "callStackBody");
+ is(found, null, "Call stack is hidden");
+
+ const pausedContent = SpecialPowers.spawn(
+ gBrowser.selectedBrowser,
+ [],
+ function () {
+ content.document.querySelector("button.pause").click();
+ }
+ );
+
+ await waitForPaused(dbg);
+ const $group = findElementWithSelector(dbg, ".frames .frames-group");
+ is(
+ $group.querySelector(".badge").textContent,
+ "2",
+ "Group has expected badge"
+ );
+ is(
+ $group.querySelector(".group-description-name").textContent,
+ "Angular",
+ "Group has expected location"
+ );
+
+ await resume(dbg);
+
+ info("Wait for content to be resumed");
+ await pausedContent;
+});
+
+function toggleButton(dbg) {
+ const callStackBody = findElement(dbg, "callStackBody");
+ return callStackBody.querySelector(".show-more");
+}
+
+// Create an HTTP server to simulate an angular app with anonymous functions
+// and return the URL.
+function createMockAngularPage() {
+ const httpServer = createTestHTTPServer();
+
+ httpServer.registerContentType("html", "text/html");
+ httpServer.registerContentType("js", "application/javascript");
+
+ const htmlFilename = "angular-mock.html";
+ httpServer.registerPathHandler(
+ `/${htmlFilename}`,
+ function (request, response) {
+ response.setStatusLine(request.httpVersion, 200, "OK");
+ response.write(`
+ <html>
+ <button class="pause">Click me</button>
+ <script type="text/javascript" src="angular.js"></script>
+ </html>`);
+ }
+ );
+
+ // Register an angular.js file in order to create a Group with anonymous functions in
+ // the callstack panel.
+ httpServer.registerPathHandler("/angular.js", function (request, response) {
+ response.setHeader("Content-Type", "application/javascript");
+ response.write(`
+ document.querySelector("button.pause").addEventListener("click", () => {
+ (function() {
+ debugger;
+ })();
+ })
+ `);
+ });
+
+ const port = httpServer.identity.primaryPort;
+ return `http://localhost:${port}/${htmlFilename}`;
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-chrome-create.js b/devtools/client/debugger/test/mochitest/browser_dbg-chrome-create.js
new file mode 100644
index 0000000000..6edf1e8745
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-chrome-create.js
@@ -0,0 +1,65 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Tests that a chrome debugger can be created in a new process.
+ */
+
+"use strict";
+
+// There are shutdown issues for which multiple rejections are left uncaught.
+// See bug 1018184 for resolving these issues.
+PromiseTestUtils.allowMatchingRejectionsGlobally(/File closed/);
+PromiseTestUtils.allowMatchingRejectionsGlobally(/NS_ERROR_FAILURE/);
+
+// This test can be slow to run
+requestLongerTimeout(5);
+
+const { BrowserToolboxLauncher } = ChromeUtils.importESModule(
+ "resource://devtools/client/framework/browser-toolbox/Launcher.sys.mjs"
+);
+
+add_task(async function () {
+ await pushPref("devtools.chrome.enabled", true);
+ await pushPref("devtools.debugger.remote-enabled", true);
+
+ info("Call BrowserToolboxLauncher.init");
+ const [browserToolboxLauncher, process, profilePath] = await new Promise(
+ resolve => {
+ BrowserToolboxLauncher.init({
+ onRun: (btl, dbgProcess, dbgProfilePath) => {
+ info("Browser toolbox process started successfully.");
+ resolve([btl, dbgProcess, dbgProfilePath]);
+ },
+ });
+ }
+ );
+
+ ok(process, "The remote debugger process was created");
+ Assert.equal(
+ process.exitCode,
+ null,
+ "The remote debugger process is running"
+ );
+ is(
+ typeof process.pid,
+ "number",
+ `The remote debugger process has a proper pid (${process.pid})`
+ );
+
+ is(
+ profilePath,
+ PathUtils.join(PathUtils.profileDir, "chrome_debugger_profile"),
+ `The remote debugger profile has the expected path`
+ );
+
+ info("Close the browser toolbox");
+ await browserToolboxLauncher.close();
+
+ is(
+ process.exitCode,
+ Services.appinfo.OS == "WINNT" ? -9 : -15,
+ "The remote debugger process died cleanly"
+ );
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-console-async.js b/devtools/client/debugger/test/mochitest/browser_dbg-console-async.js
new file mode 100644
index 0000000000..4c669766b0
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-console-async.js
@@ -0,0 +1,50 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Return a promise with a reference to jsterm, opening the split
+// console if necessary. This cleans up the split console pref so
+// it won't pollute other tests.
+
+"use strict";
+
+add_task(async function () {
+ Services.prefs.setBoolPref("devtools.toolbox.splitconsoleEnabled", true);
+ Services.prefs.setBoolPref(
+ "devtools.debugger.features.map-await-expression",
+ true
+ );
+
+ const dbg = await initDebugger(
+ "doc-script-switching.html",
+ "script-switching-01.js"
+ );
+
+ await selectSource(dbg, "script-switching-01.js");
+
+ // open the console
+ await getDebuggerSplitConsole(dbg);
+ ok(dbg.toolbox.splitConsole, "Split console is shown.");
+
+ const webConsole = await dbg.toolbox.getPanel("webconsole");
+ const wrapper = webConsole.hud.ui.wrapper;
+
+ wrapper.dispatchEvaluateExpression(`
+ let sleep = async (time, v) => new Promise(
+ res => setTimeout(() => res(v+'!!!'), time)
+ )
+ `);
+
+ await hasMessageByType(dbg, "sleep", ".command");
+
+ wrapper.dispatchEvaluateExpression(`await sleep(200, "DONE")`);
+ await hasMessageByType(dbg, "DONE!!!", ".result");
+});
+
+async function hasMessageByType(dbg, msg, typeSelector) {
+ const webConsole = await dbg.toolbox.getPanel("webconsole");
+ const hud = webConsole.hud;
+ return waitFor(
+ async () => !!findMessagesByType(hud, msg, typeSelector).length
+ );
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-console-eval.js b/devtools/client/debugger/test/mochitest/browser_dbg-console-eval.js
new file mode 100644
index 0000000000..0e4cf793ec
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-console-eval.js
@@ -0,0 +1,37 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests that clicking the DOM node button in any ObjectInspect
+// opens the Inspector panel
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-scripts.html", "simple2.js");
+
+ await selectSource(dbg, "simple2.js", 1);
+
+ clickElement(dbg, "CodeMirrorLines");
+ await waitForElementWithSelector(dbg, ".CodeMirror-code");
+
+ getCM(dbg).setSelection({ line: 0, ch: 0 }, { line: 8, ch: 0 });
+
+ rightClickElement(dbg, "CodeMirrorLines");
+ await waitForContextMenu(dbg);
+ selectContextMenuItem(dbg, "#node-menu-evaluate-in-console");
+
+ await waitForConsolePanelChange(dbg);
+ await hasConsoleMessage(dbg, "undefined");
+});
+
+function waitForConsolePanelChange(dbg) {
+ const { toolbox } = dbg;
+
+ return new Promise(resolve => {
+ toolbox.getPanelWhenReady("webconsole").then(() => {
+ ok(toolbox.webconsolePanel, "Console is shown.");
+ resolve(toolbox.webconsolePanel);
+ });
+ });
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-console-link.js b/devtools/client/debugger/test/mochitest/browser_dbg-console-link.js
new file mode 100644
index 0000000000..5789c0ab6f
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-console-link.js
@@ -0,0 +1,29 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests opening the console first, clicking a link
+// opens the editor at the correct location.
+
+"use strict";
+
+add_task(async function () {
+ const toolbox = await initPane("doc-script-switching.html", "webconsole");
+ const node = await waitForLink(toolbox, "hi");
+ node.click();
+
+ await waitFor(() => toolbox.getPanel("jsdebugger"));
+ const dbg = createDebuggerContext(toolbox);
+ await waitForElementWithSelector(dbg, ".CodeMirror-code > .highlight-line");
+ assertHighlightLocation(dbg, "script-switching-02.js", 18);
+});
+
+async function waitForLink(toolbox, messageText) {
+ return waitFor(async () => {
+ const [message] = await findConsoleMessages(toolbox, messageText);
+ if (!message) {
+ return false;
+ }
+ return message.querySelector(".frame-link-source");
+ });
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-console-map-bindings.js b/devtools/client/debugger/test/mochitest/browser_dbg-console-map-bindings.js
new file mode 100644
index 0000000000..26529a75cd
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-console-map-bindings.js
@@ -0,0 +1,47 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+add_task(async function () {
+ Services.prefs.setBoolPref("devtools.toolbox.splitconsoleEnabled", true);
+ const dbg = await initDebugger("doc-strict.html");
+
+ await getSplitConsole(dbg);
+ ok(dbg.toolbox.splitConsole, "Split console is shown.");
+
+ invokeInTab("strict", 2);
+
+ await waitForPaused(dbg);
+ await evaluate(dbg, "var c = 3");
+ const msg2 = await evaluate(dbg, "c");
+
+ is(msg2.trim(), "3");
+});
+
+// Return a promise with a reference to jsterm, opening the split
+// console if necessary. This cleans up the split console pref so
+// it won't pollute other tests.
+function getSplitConsole(dbg) {
+ const { toolbox } = dbg;
+
+ if (!toolbox.splitConsole) {
+ pressKey(dbg, "Escape");
+ }
+
+ return new Promise(resolve => {
+ toolbox.getPanelWhenReady("webconsole").then(() => {
+ ok(toolbox.splitConsole, "Split console is shown.");
+ const jsterm = toolbox.getPanel("webconsole").hud.jsterm;
+ resolve(jsterm);
+ });
+ });
+}
+
+async function evaluate(dbg, expression) {
+ const { toolbox } = dbg;
+ const { hud } = toolbox.getPanel("webconsole");
+ const msg = await evaluateExpressionInConsole(hud, expression);
+ return msg.innerText;
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-console.js b/devtools/client/debugger/test/mochitest/browser_dbg-console.js
new file mode 100644
index 0000000000..a725f7de43
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-console.js
@@ -0,0 +1,28 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+add_task(async function () {
+ Services.prefs.setBoolPref("devtools.toolbox.splitconsoleEnabled", true);
+ const dbg = await initDebugger(
+ "doc-script-switching.html",
+ "script-switching-01.js"
+ );
+
+ await selectSource(dbg, "script-switching-01.js");
+
+ // open the console
+ await getDebuggerSplitConsole(dbg);
+ ok(dbg.toolbox.splitConsole, "Split console is shown.");
+
+ // close the console
+ await clickElement(dbg, "codeMirror");
+ // First time to focus out of text area
+ pressKey(dbg, "Escape");
+
+ // Second time to hide console
+ pressKey(dbg, "Escape");
+ ok(!dbg.toolbox.splitConsole, "Split console is hidden.");
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-content-script-sources.js b/devtools/client/debugger/test/mochitest/browser_dbg-content-script-sources.js
new file mode 100644
index 0000000000..b95b08cbbb
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-content-script-sources.js
@@ -0,0 +1,52 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests that the content scripts are listed in the source tree.
+
+"use strict";
+
+add_task(async function () {
+ await pushPref("devtools.chrome.enabled", true);
+ const extension = await installAndStartContentScriptExtension();
+
+ let dbg = await initDebugger(
+ "doc-content-script-sources.html",
+ "content_script.js"
+ );
+ await selectSource(dbg, "content_script.js");
+ await closeTab(dbg, "content_script.js");
+
+ // Destroy the toolbox and repeat the test in a new toolbox
+ // and ensures that the content script is still listed.
+ await dbg.toolbox.destroy();
+
+ const toolbox = await openToolboxForTab(gBrowser.selectedTab, "jsdebugger");
+ dbg = createDebuggerContext(toolbox);
+ await waitForSources(dbg, "content_script.js");
+ await selectSource(dbg, "content_script.js");
+
+ await addBreakpoint(dbg, "content_script.js", 2);
+
+ for (let i = 1; i < 3; i++) {
+ info(`Reloading tab (${i} time)`);
+ gBrowser.reloadTab(gBrowser.selectedTab);
+ await waitForPaused(dbg);
+ await waitForSelectedSource(dbg, "content_script.js");
+
+ await waitFor(
+ () => findElementWithSelector(dbg, ".sources-list .focused"),
+ "Source is focused"
+ );
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "content_script.js").id,
+ 2
+ );
+ await resume(dbg);
+ }
+
+ await closeTab(dbg, "content_script.js");
+
+ await extension.unload();
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-continue-to-here-click.js b/devtools/client/debugger/test/mochitest/browser_dbg-continue-to-here-click.js
new file mode 100644
index 0000000000..4a22a038c0
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-continue-to-here-click.js
@@ -0,0 +1,48 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test cmd+click continuing to a line
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-pause-points.html", "pause-points.js");
+ await selectSource(dbg, "pause-points.js");
+ await waitForSelectedSource(dbg, "pause-points.js");
+
+ info(
+ "Pause the debugger by clicking a button with a click handler containing a debugger statement"
+ );
+ clickElementInTab("#sequences");
+ await waitForPaused(dbg);
+ await waitForInlinePreviews(dbg);
+ ok(true, "Debugger is paused");
+
+ info("Cmd+click on a line and check the debugger continues to that line");
+ const lineToContinueTo = 31;
+ const onResumed = waitForResumed(dbg);
+ await cmdClickLine(dbg, lineToContinueTo);
+
+ // continuing will resume and pause again. Let's wait until we resume so we can properly
+ // wait for the next pause.
+ await onResumed;
+ // waitForPaused properly waits for the scopes to be available
+ await waitForPaused(dbg);
+
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "pause-points.js").id,
+ lineToContinueTo,
+ 5
+ );
+ ok(true, "Debugger continued to the expected line");
+
+ info("Resume");
+ await resume(dbg);
+ await waitForRequestsToSettle(dbg);
+});
+
+async function cmdClickLine(dbg, line) {
+ await cmdClickGutter(dbg, line);
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-continue-to-here.js b/devtools/client/debugger/test/mochitest/browser_dbg-continue-to-here.js
new file mode 100644
index 0000000000..a33ec42199
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-continue-to-here.js
@@ -0,0 +1,58 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-pause-points.html", "pause-points.js");
+ await selectSource(dbg, "pause-points.js");
+ await waitForSelectedSource(dbg, "pause-points.js");
+
+ info("Test continuing to a line");
+ clickElementInTab("#sequences");
+ await waitForPaused(dbg);
+ await waitForInlinePreviews(dbg);
+
+ await continueToLine(dbg, 31);
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "pause-points.js").id,
+ 31,
+ 5
+ );
+ await resume(dbg);
+
+ info("Test continuing to a column");
+ clickElementInTab("#sequences");
+ await waitForPaused(dbg);
+ await waitForInlinePreviews(dbg);
+
+ await continueToColumn(dbg, { line: 31, column: 8 });
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "pause-points.js").id,
+ 31,
+ 5
+ );
+ await resume(dbg);
+});
+
+async function continueToLine(dbg, line) {
+ rightClickElement(dbg, "gutter", line);
+ await waitForContextMenu(dbg);
+ selectContextMenuItem(dbg, selectors.editorContextMenu.continueToHere);
+ await waitForDispatch(dbg.store, "RESUME");
+ await waitForPaused(dbg);
+ await waitForInlinePreviews(dbg);
+}
+
+async function continueToColumn(dbg, pos) {
+ await rightClickAtPos(dbg, pos);
+ await waitForContextMenu(dbg);
+
+ selectContextMenuItem(dbg, selectors.editorContextMenu.continueToHere);
+ await waitForDispatch(dbg.store, "RESUME");
+ await waitForPaused(dbg);
+ await waitForInlinePreviews(dbg);
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-custom-formatters.js b/devtools/client/debugger/test/mochitest/browser_dbg-custom-formatters.js
new file mode 100644
index 0000000000..3c983ef77e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-custom-formatters.js
@@ -0,0 +1,154 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+// Check display of custom formatters in debugger.
+const TEST_FILENAME = `doc_dbg-custom-formatters.html`;
+const TEST_FUNCTION_NAME = "pauseWithCustomFormattedObject";
+const CUSTOM_FORMATTED_BODY = "customFormattedBody";
+const VARIABLE_NAME = "xyz";
+
+add_task(async function () {
+ await pushPref("devtools.custom-formatters.enabled", true);
+
+ const dbg = await initDebugger(TEST_FILENAME);
+ await selectSource(dbg, TEST_FILENAME);
+
+ info(
+ "Test that custom formatted objects are displayed as expected in the Watch Expressions panel"
+ );
+ await addExpression(dbg, `({customFormatHeaderAndBody: "body"})`);
+ const expressionsElements = findAllElements(dbg, "expressionNodes");
+ is(expressionsElements.length, 1);
+
+ const customFormattedElement = expressionsElements[0];
+
+ const headerJsonMlNode =
+ customFormattedElement.querySelector(".objectBox-jsonml");
+ is(
+ headerJsonMlNode.innerText,
+ "CUSTOM",
+ "The object is rendered with a custom formatter"
+ );
+
+ is(
+ customFormattedElement.querySelector(".arrow"),
+ null,
+ "The expression is not expandable…"
+ );
+ const customFormattedElementArrow =
+ customFormattedElement.querySelector(".collapse-button");
+ ok(customFormattedElementArrow, "… but the custom formatter is");
+
+ info("Expanding the Object");
+ const onBodyRendered = waitFor(
+ () =>
+ !!customFormattedElement.querySelector(
+ ".objectBox-jsonml-body-wrapper .objectBox-jsonml"
+ )
+ );
+
+ customFormattedElementArrow.click();
+ await onBodyRendered;
+
+ ok(
+ customFormattedElement
+ .querySelector(".collapse-button")
+ .classList.contains("expanded"),
+ "The arrow of the node has the expected class after clicking on it"
+ );
+
+ const bodyJsonMlNode = customFormattedElement.querySelector(
+ ".objectBox-jsonml-body-wrapper > .objectBox-jsonml"
+ );
+ ok(bodyJsonMlNode, "The body is custom formatted");
+ is(bodyJsonMlNode?.textContent, "body", "The body text is correct");
+
+ info("Check that custom formatters are displayed in Scopes panel");
+
+ // The function has a debugger statement that will pause the debugger
+ invokeInTab(TEST_FUNCTION_NAME);
+
+ info("Wait for the debugger to be paused");
+ await waitForPaused(dbg);
+
+ info(
+ `Check that '${VARIABLE_NAME}' is in the scopes panel and custom formatted`
+ );
+ const index = 4;
+ is(
+ getScopeNodeLabel(dbg, index),
+ VARIABLE_NAME,
+ `Got '${VARIABLE_NAME}' at the expected position`
+ );
+ const scopeXElement = findElement(dbg, "scopeValue", index);
+ is(
+ scopeXElement.innerText,
+ "CUSTOM",
+ `'${VARIABLE_NAME}' is custom formatted in the scopes panel`
+ );
+ const xArrow = scopeXElement.querySelector(".collapse-button");
+ ok(xArrow, `'${VARIABLE_NAME}' is expandable`);
+
+ info(`Expanding '${VARIABLE_NAME}'`);
+ const onScopeBodyRendered = waitFor(
+ () =>
+ !!scopeXElement.querySelector(
+ ".objectBox-jsonml-body-wrapper .objectBox-jsonml"
+ )
+ );
+
+ xArrow.click();
+ await onScopeBodyRendered;
+ const scopeXBodyJsonMlNode = scopeXElement.querySelector(
+ ".objectBox-jsonml-body-wrapper > .objectBox-jsonml"
+ );
+ ok(scopeXBodyJsonMlNode, "The scope item body is custom formatted");
+ is(
+ scopeXBodyJsonMlNode?.textContent,
+ CUSTOM_FORMATTED_BODY,
+ "The scope item body text is correct"
+ );
+
+ await resume(dbg);
+
+ info("Check that custom formatters are displayed in the Debugger tooltip");
+
+ // The function has a debugger statement that will pause the debugger
+ invokeInTab(TEST_FUNCTION_NAME);
+ await waitForPaused(dbg);
+
+ await assertPreviewTextValue(dbg, 26, 16, {
+ expression: VARIABLE_NAME,
+ result: "CUSTOM",
+ doNotClose: true,
+ });
+
+ const tooltipPopup = findElement(dbg, "previewPopup");
+
+ const tooltipArrow = tooltipPopup.querySelector(".collapse-button");
+ ok(tooltipArrow, `'${VARIABLE_NAME}' is expandable`);
+
+ info(`Expanding '${VARIABLE_NAME}'`);
+ const onTooltipBodyRendered = waitFor(
+ () =>
+ !!tooltipPopup.querySelector(
+ ".objectBox-jsonml-body-wrapper .objectBox-jsonml"
+ )
+ );
+
+ tooltipArrow.click();
+ await onTooltipBodyRendered;
+ const tooltipBodyJsonMlNode = tooltipPopup.querySelector(
+ ".objectBox-jsonml-body-wrapper > .objectBox-jsonml"
+ );
+ ok(tooltipBodyJsonMlNode, "The tooltip variable body is custom formatted");
+ is(
+ tooltipBodyJsonMlNode?.textContent,
+ CUSTOM_FORMATTED_BODY,
+ "The tooltip variable body text is correct"
+ );
+
+ await resume(dbg);
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-debug-line.js b/devtools/client/debugger/test/mochitest/browser_dbg-debug-line.js
new file mode 100644
index 0000000000..ab13a1ee50
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-debug-line.js
@@ -0,0 +1,46 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test ensures zombie debug lines do not persist
+// https://github.com/firefox-devtools/debugger/issues/7755
+
+"use strict";
+
+add_task(async function () {
+ // Load test files
+ const dbg = await initDebugger("doc-sources.html");
+ await waitForSources(dbg, "simple1.js", "simple2.js");
+
+ // Add breakpoint to debug-line-2
+ await selectSource(dbg, "simple2.js");
+ await addBreakpoint(dbg, "simple2.js", 5);
+
+ // Trigger the breakpoint ane ensure we're paused
+ invokeInTab("main");
+ await waitForPaused(dbg);
+ await waitForDispatch(dbg.store, "ADD_INLINE_PREVIEW");
+
+ // Scroll element into view
+ findElement(dbg, "frame", 2).focus();
+
+ // Click the call stack to get to debugger-line-1
+ const dispatched = waitForDispatch(dbg.store, "ADD_INLINE_PREVIEW");
+ await clickElement(dbg, "frame", 2);
+ await dispatched;
+ await waitForRequestsToSettle(dbg);
+ await waitForSelectedSource(dbg, "simple1.js");
+
+ // Resume, which ends all pausing and would trigger the problem
+ await resume(dbg);
+
+ // Select the source that had the initial debug line
+ await selectSource(dbg, "simple2.js");
+
+ info("Ensuring there's no zombie debug line");
+ is(
+ findAllElements(dbg, "debugLine").length,
+ 0,
+ "Debug line no longer exists!"
+ );
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-debugger-buttons.js b/devtools/client/debugger/test/mochitest/browser_dbg-debugger-buttons.js
new file mode 100644
index 0000000000..14c71bb4f9
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-debugger-buttons.js
@@ -0,0 +1,124 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Test debugger buttons
+ * 1. resume
+ * 2. stepOver
+ * 3. stepIn
+ * 4. stepOver to the end of a function
+ * 5. stepUp at the end of a function
+ */
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-debugger-statements.html");
+
+ let onReloaded = reload(dbg, "doc-debugger-statements.html");
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "doc-debugger-statements.html").id,
+ 11
+ );
+
+ info("resume");
+ await clickResume(dbg);
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "doc-debugger-statements.html").id,
+ 16
+ );
+
+ info("step over");
+ await clickStepOver(dbg);
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "doc-debugger-statements.html").id,
+ 17
+ );
+
+ info("step into");
+ await clickStepIn(dbg);
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "doc-debugger-statements.html").id,
+ 22
+ );
+
+ info("step over");
+ await clickStepOver(dbg);
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "doc-debugger-statements.html").id,
+ 24
+ );
+
+ info("step out");
+ await clickStepOut(dbg);
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "doc-debugger-statements.html").id,
+ 18
+ );
+
+ await resume(dbg);
+
+ info("Wait for reload to complete after resume");
+ await onReloaded;
+
+ info("Toggle debugger statement off");
+ const toggleCheckbox = findElementWithSelector(
+ dbg,
+ ".breakpoints-debugger-statement input"
+ );
+ toggleCheckbox.click();
+ await waitFor(() => !toggleCheckbox.checked);
+
+ await reload(dbg, "doc-debugger-statements.html");
+ assertNotPaused(dbg);
+
+ info("Re-enable debugger statement");
+ toggleCheckbox.click();
+ await waitFor(() => toggleCheckbox.checked);
+
+ onReloaded = reload(dbg, "doc-debugger-statements.html");
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "doc-debugger-statements.html").id,
+ 11
+ );
+ await resume(dbg);
+ await waitForPaused(dbg);
+ await resume(dbg);
+ await onReloaded;
+});
+
+function clickButton(dbg, button) {
+ const resumeFired = waitForDispatch(dbg.store, "COMMAND");
+ clickElement(dbg, button);
+ return resumeFired;
+}
+
+async function clickStepOver(dbg) {
+ await clickButton(dbg, "stepOver");
+ return waitForPaused(dbg);
+}
+
+async function clickStepIn(dbg) {
+ await clickButton(dbg, "stepIn");
+ return waitForPaused(dbg);
+}
+
+async function clickStepOut(dbg) {
+ await clickButton(dbg, "stepOut");
+ return waitForPaused(dbg);
+}
+
+async function clickResume(dbg) {
+ return clickButton(dbg, "resume");
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-dom-mutation-breakpoints-fission.js b/devtools/client/debugger/test/mochitest/browser_dbg-dom-mutation-breakpoints-fission.js
new file mode 100644
index 0000000000..81c1ad2d50
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-dom-mutation-breakpoints-fission.js
@@ -0,0 +1,110 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests dom mutation breakpoints with a remote frame.
+
+"use strict";
+
+// Import helpers for the inspector
+Services.scriptloader.loadSubScript(
+ "chrome://mochitests/content/browser/devtools/client/inspector/test/shared-head.js",
+ this
+);
+
+/**
+ * The test page contains an INPUT and a BUTTON.
+ *
+ * On "click", the button will update the disabled attribute of the input.
+ * Updating the attribute via SpecialPowers.spawn would not trigger the DOM
+ * breakpoint, that's why we need the page itself to have a way of updating
+ * the attribute.
+ */
+const TEST_COM_URI = `https://example.com/document-builder.sjs?html=${encodeURI(
+ `<input disabled=""/>
+ <button onclick="document.querySelector('input').toggleAttribute('disabled')">
+ click me
+ </button>`
+)}`;
+
+// Embed the example.com test page in an example.org iframe.
+const TEST_URI = `https://example.org/document-builder.sjs?html=
+<iframe src="${encodeURI(TEST_COM_URI)}"></iframe><body>`;
+
+add_task(async function () {
+ await pushPref("devtools.debugger.dom-mutation-breakpoints-visible", true);
+
+ const { inspector, toolbox } = await openInspectorForURL(TEST_URI);
+
+ await selectNodeInFrames(["iframe", "input"], inspector);
+ info("Adding DOM mutation breakpoints to body");
+ const allMenuItems = openContextMenuAndGetAllItems(inspector);
+
+ const attributeMenuItem = allMenuItems.find(
+ item => item.id === "node-menu-mutation-breakpoint-attribute"
+ );
+ attributeMenuItem.click();
+
+ info("Switches over to the debugger pane");
+ await toolbox.selectTool("jsdebugger");
+
+ const dbg = createDebuggerContext(toolbox);
+
+ info("Changing attribute to trigger debugger pause");
+ const frameBC = await SpecialPowers.spawn(
+ gBrowser.selectedBrowser,
+ [],
+ function () {
+ return content.document.querySelector("iframe").browsingContext;
+ }
+ );
+
+ info("Confirms that one DOM mutation breakpoint exists");
+ const mutationItem = await waitForElement(dbg, "domMutationItem");
+ ok(mutationItem, "A DOM mutation breakpoint exists");
+
+ mutationItem.scrollIntoView();
+
+ info("Enabling and disabling the DOM mutation breakpoint works");
+ const checkbox = mutationItem.querySelector("input");
+ checkbox.click();
+ await waitFor(() => !checkbox.checked);
+
+ info("Click the button in the remote iframe, should not hit the breakpoint");
+ BrowserTestUtils.synthesizeMouseAtCenter("button", {}, frameBC);
+
+ info("Wait until the input is enabled");
+ await asyncWaitUntil(() =>
+ SpecialPowers.spawn(
+ frameBC,
+ [],
+ () => !content.document.querySelector("input").disabled
+ )
+ );
+ assertNotPaused(dbg, "DOM breakpoint should not have been hit");
+
+ info("Restore the disabled attribute");
+ await SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () {
+ return SpecialPowers.spawn(
+ content.document.querySelector("iframe"),
+ [],
+ () =>
+ !content.document.querySelector("input").setAttribute("disabled", "")
+ );
+ });
+
+ checkbox.click();
+ await waitFor(() => checkbox.checked);
+
+ info("Click the button in the remote iframe, to trigger the breakpoint");
+ BrowserTestUtils.synthesizeMouseAtCenter("button", {}, frameBC);
+
+ info("Wait for paused");
+ await waitForPaused(dbg);
+ info("Resume");
+ await resume(dbg);
+
+ info("Removing breakpoints works");
+ dbg.win.document.querySelector(".dom-mutation-list .close-btn").click();
+ await waitForAllElements(dbg, "domMutationItem", 0, true);
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-dom-mutation-breakpoints.js b/devtools/client/debugger/test/mochitest/browser_dbg-dom-mutation-breakpoints.js
new file mode 100644
index 0000000000..e26ca0493b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-dom-mutation-breakpoints.js
@@ -0,0 +1,171 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests adding, disble/enable, and removal of dom mutation breakpoints
+
+"use strict";
+
+// Import helpers for the inspector
+Services.scriptloader.loadSubScript(
+ "chrome://mochitests/content/browser/devtools/client/inspector/test/shared-head.js",
+ this
+);
+
+const DMB_TEST_URL =
+ "https://example.com/browser/devtools/client/debugger/test/mochitest/examples/doc-dom-mutation.html";
+
+async function enableMutationBreakpoints() {
+ await pushPref("devtools.debugger.dom-mutation-breakpoints-visible", true);
+}
+
+add_task(async function () {
+ // Enable features
+ await enableMutationBreakpoints();
+ await pushPref("devtools.debugger.map-scopes-enabled", true);
+
+ info("Switches over to the inspector pane");
+
+ const { inspector, toolbox } = await openInspectorForURL(DMB_TEST_URL);
+
+ {
+ info("Selecting the body node");
+ await selectNode("body", inspector);
+
+ info("Adding DOM mutation breakpoints to body");
+ const allMenuItems = openContextMenuAndGetAllItems(inspector);
+
+ const attributeMenuItem = allMenuItems.find(
+ item => item.id === "node-menu-mutation-breakpoint-attribute"
+ );
+ attributeMenuItem.click();
+
+ const subtreeMenuItem = allMenuItems.find(
+ item => item.id === "node-menu-mutation-breakpoint-subtree"
+ );
+ subtreeMenuItem.click();
+ }
+
+ {
+ info("Find and expand the shadow host.");
+ const hostFront = await getNodeFront("#host", inspector);
+ const hostContainer = inspector.markup.getContainer(hostFront);
+ await expandContainer(inspector, hostContainer);
+
+ info("Expand the shadow root");
+ const shadowRootContainer = hostContainer.getChildContainers()[0];
+ await expandContainer(inspector, shadowRootContainer);
+
+ info("Select the div under the shadow root");
+ const divContainer = shadowRootContainer.getChildContainers()[0];
+ await selectNode(divContainer.node, inspector);
+
+ const allMenuItems = openContextMenuAndGetAllItems(inspector);
+ info("Adding attribute breakpoint.");
+ const attributeMenuItem = allMenuItems.find(
+ item => item.id === "node-menu-mutation-breakpoint-attribute"
+ );
+ attributeMenuItem.click();
+ }
+
+ info("Switches over to the debugger pane");
+ await toolbox.selectTool("jsdebugger");
+
+ const dbg = createDebuggerContext(toolbox);
+
+ info("Confirms that one DOM mutation breakpoint exists");
+ const mutationItem = await waitForElement(dbg, "domMutationItem");
+ ok(mutationItem, "A DOM mutation breakpoint exists");
+
+ mutationItem.scrollIntoView();
+
+ info("Enabling and disabling the DOM mutation breakpoint works");
+ const checkbox = mutationItem.querySelector("input");
+ checkbox.click();
+ await waitFor(() => !checkbox.checked);
+ checkbox.click();
+ await waitFor(() => checkbox.checked);
+
+ info("Changing attribute to trigger debugger pause");
+ SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () {
+ content.document.querySelector("#attribute").click();
+ });
+ await waitForPaused(dbg);
+ let whyPaused = await waitFor(
+ () => dbg.win.document.querySelector(".why-paused")?.innerText
+ );
+ is(
+ whyPaused,
+ `Paused on DOM mutation\nDOM Mutation: 'attributeModified'\nbody`
+ );
+
+ await resume(dbg);
+
+ info("Changing style to trigger debugger pause");
+ SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () {
+ content.document.querySelector("#style-attribute").click();
+ });
+ await waitForPaused(dbg);
+ await resume(dbg);
+
+ info("Changing attribute in shadow dom to trigger debugger pause");
+ SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () {
+ content.document.querySelector("#shadow-attribute").click();
+ });
+ await waitForPaused(dbg);
+ await resume(dbg);
+
+ info("Adding element in subtree to trigger debugger pause");
+ SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () {
+ content.document.querySelector("#add-in-subtree").click();
+ });
+ await waitForPaused(dbg);
+ whyPaused = await waitFor(
+ () => dbg.win.document.querySelector(".why-paused")?.innerText
+ );
+ is(
+ whyPaused,
+ `Paused on DOM mutation\nDOM Mutation: 'subtreeModified'\nbodyAdded:div#dynamic`
+ );
+
+ await resume(dbg);
+
+ info("Removing element in subtree to trigger debugger pause");
+ SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () {
+ content.document.querySelector("#remove-in-subtree").click();
+ });
+ await waitForPaused(dbg);
+ whyPaused = await waitFor(
+ () => dbg.win.document.querySelector(".why-paused")?.innerText
+ );
+ is(
+ whyPaused,
+ `Paused on DOM mutation\nDOM Mutation: 'subtreeModified'\nbodyRemoved:div#dynamic`
+ );
+
+ await resume(dbg);
+
+ info("Blackboxing the source prevents debugger pause");
+ await waitForSource(dbg, "dom-mutation.original.js");
+
+ const source = findSource(dbg, "dom-mutation.original.js");
+
+ await selectSource(dbg, source);
+ await clickElement(dbg, "blackbox");
+ await waitForDispatch(dbg.store, "BLACKBOX_WHOLE_SOURCES");
+
+ SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () {
+ content.document.querySelector("#blackbox").click();
+ });
+
+ await waitForPaused(dbg, "click.js");
+ await resume(dbg);
+
+ await selectSource(dbg, source);
+ await clickElement(dbg, "blackbox");
+ await waitForDispatch(dbg.store, "UNBLACKBOX_WHOLE_SOURCES");
+
+ info("Removing breakpoints works");
+ dbg.win.document.querySelector(".dom-mutation-list .close-btn").click();
+ await waitForAllElements(dbg, "domMutationItem", 2, true);
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-eager-eval-skip-pause.js b/devtools/client/debugger/test/mochitest/browser_dbg-eager-eval-skip-pause.js
new file mode 100644
index 0000000000..dcd8f4605b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-eager-eval-skip-pause.js
@@ -0,0 +1,19 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test that eager evaluation skips breakpoints and debugger statements
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-strict.html");
+ const { hud } = await getDebuggerSplitConsole(dbg);
+
+ await addBreakpoint(dbg, "doc-strict.html", 15);
+ setInputValue(hud, "strict()");
+ await waitForEagerEvaluationResult(hud, `3`);
+
+ setInputValue(hud, "debugger; 2");
+ await waitForEagerEvaluationResult(hud, `2`);
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-editor-exception.js b/devtools/client/debugger/test/mochitest/browser_dbg-editor-exception.js
new file mode 100644
index 0000000000..67f8a9f374
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-editor-exception.js
@@ -0,0 +1,26 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests that the editor does not crash when closing a tab (using the contextmenu)
+
+"use strict";
+
+add_task(async function testEditorExceptionClose() {
+ const dbg = await initDebugger("doc-exceptions.html", "exceptions.js");
+ await selectSource(dbg, "exceptions.js");
+ is(countTabs(dbg), 1, "Tab for the exceptions.js source is open");
+ await openActiveTabContextMenuAndSelectCloseTabItem(dbg);
+ is(countTabs(dbg), 0, "All tabs are closed");
+});
+
+async function openActiveTabContextMenuAndSelectCloseTabItem(dbg) {
+ const waitForOpen = waitForContextMenu(dbg);
+ info(`Open the current active tab context menu`);
+ rightClickElement(dbg, "activeTab");
+ await waitForOpen;
+ const wait = waitForDispatch(dbg.store, "CLOSE_TABS");
+ info(`Select the close tab context menu item`);
+ selectContextMenuItem(dbg, `#node-menu-close-tab`);
+ return wait;
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-editor-gutter.js b/devtools/client/debugger/test/mochitest/browser_dbg-editor-gutter.js
new file mode 100644
index 0000000000..e5386009f0
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-editor-gutter.js
@@ -0,0 +1,144 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests the breakpoint gutter and making sure breakpoint icons exist
+// correctly
+
+"use strict";
+
+// FIXME bug 1524374 removing breakpoints in this test can cause uncaught
+// rejections and make bug 1512742 permafail.
+PromiseTestUtils.allowMatchingRejectionsGlobally(/NS_ERROR_NOT_INITIALIZED/);
+
+add_task(async function testGutterBreakpoints() {
+ const dbg = await initDebugger("doc-scripts.html", "simple1.js");
+ const source = findSource(dbg, "simple1.js");
+
+ await selectSource(dbg, source);
+
+ // Make sure that clicking the gutter creates a breakpoint icon.
+ await clickGutter(dbg, 4);
+ await waitForDispatch(dbg.store, "SET_BREAKPOINT");
+ is(dbg.selectors.getBreakpointCount(), 1, "One breakpoint exists");
+ await assertBreakpoint(dbg, 4);
+
+ // Make sure clicking at the same place removes the icon.
+ await clickGutter(dbg, 4);
+ await waitForDispatch(dbg.store, "REMOVE_BREAKPOINT");
+ is(dbg.selectors.getBreakpointCount(), 0, "No breakpoints exist");
+ await assertNoBreakpoint(dbg, 4);
+});
+
+add_task(async function testGutterBreakpointsInIgnoredSource() {
+ await pushPref("devtools.debugger.map-scopes-enabled", true);
+ info(
+ "Ensure clicking on gutter to add breakpoint should not un-ignore source"
+ );
+ const dbg = await initDebugger("doc-sourcemaps3.html");
+ await waitForSources(dbg, "bundle.js", "sorted.js", "test.js");
+
+ info("Ignore the source");
+ await selectSource(dbg, findSource(dbg, "sorted.js"));
+ await clickElement(dbg, "blackbox");
+ await waitForDispatch(dbg.store, "BLACKBOX_WHOLE_SOURCES");
+
+ // invoke test
+ invokeInTab("test");
+
+ // wait to make sure no pause has occured
+ await wait(1000);
+ assertNotPaused(dbg);
+
+ info("Ensure gutter breakpoint gets set with click");
+ await clickGutter(dbg, 4);
+ await waitForDispatch(dbg.store, "SET_BREAKPOINT");
+
+ info("Assert that the `Enable breakpoint` context menu item is disabled");
+ const popup = await openContextMenuInDebugger(dbg, "gutter", 4);
+ await assertContextMenuItemDisabled(
+ dbg,
+ "#node-menu-enable-breakpoint",
+ true
+ );
+ await closeContextMenu(dbg, popup);
+
+ is(dbg.selectors.getBreakpointCount(), 1, "One breakpoint exists");
+ await assertBreakpoint(dbg, 4);
+ is(
+ findBreakpoint(dbg, "sorted.js", 4).disabled,
+ true,
+ "The breakpoint in the ignored source looks disabled"
+ );
+
+ invokeInTab("test");
+
+ await wait(1000);
+ assertNotPaused(dbg);
+
+ ok(true, "source is still blackboxed");
+});
+
+add_task(async function testGutterBreakpointsForSourceWithIgnoredLines() {
+ info(
+ "Asserts that adding a breakpoint to the gutter of an un-ignored line does not un-ignore other ranges in the source"
+ );
+ const dbg = await initDebugger("doc-sourcemaps3.html");
+ await waitForSources(dbg, "bundle.js", "sorted.js", "test.js");
+
+ await selectSource(dbg, findSource(dbg, "sorted.js"));
+
+ info("Ignoring line 17 to 21 using the editor context menu");
+ await selectEditorLinesAndOpenContextMenu(dbg, {
+ startLine: 17,
+ endLine: 21,
+ });
+ await selectBlackBoxContextMenuItem(dbg, "blackbox-lines");
+
+ info("Set breakpoint on an un-ignored line");
+ await clickGutter(dbg, 4);
+ await waitForDispatch(dbg.store, "SET_BREAKPOINT");
+
+ info("Assert that the `Disable breakpoint` context menu item is enabled");
+ const popup = await openContextMenuInDebugger(dbg, "gutter", 4);
+ await assertContextMenuItemDisabled(
+ dbg,
+ "#node-menu-disable-breakpoint",
+ false
+ );
+ await closeContextMenu(dbg, popup);
+
+ info("Assert that the lines 17 to 21 are still ignored");
+ assertIgnoredStyleInSourceLines(dbg, {
+ lines: [17, 21],
+ hasBlackboxedLinesClass: true,
+ });
+
+ info(
+ "Asserts that adding a breakpoint to the gutter of an ignored line creates a disabled breakpoint"
+ );
+ info("Set breakpoint on an ignored line");
+ await clickGutter(dbg, 19);
+ await waitForDispatch(dbg.store, "SET_BREAKPOINT");
+
+ info("Assert that the `Enable breakpoint` context menu item is disabled");
+ const popup2 = await openContextMenuInDebugger(dbg, "gutter", 19);
+ await assertContextMenuItemDisabled(
+ dbg,
+ "#node-menu-enable-breakpoint",
+ true
+ );
+ await closeContextMenu(dbg, popup2);
+
+ info("Assert that the breakpoint on the line 19 is visually disabled");
+ is(
+ findBreakpoint(dbg, "sorted.js", 19).disabled,
+ true,
+ "The breakpoint on an ignored line is disabled"
+ );
+});
+
+async function assertContextMenuItemDisabled(dbg, selector, expectedState) {
+ const item = await waitFor(() => findContextMenu(dbg, selector));
+ is(item.disabled, expectedState, "The context menu item is disabled");
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-editor-highlight.js b/devtools/client/debugger/test/mochitest/browser_dbg-editor-highlight.js
new file mode 100644
index 0000000000..4fd5a6be40
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-editor-highlight.js
@@ -0,0 +1,50 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests that the editor will always highight the right line, no
+// matter if the source text doesn't exist yet or even if the source
+// doesn't exist.
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-scripts.html", "long.js");
+ const {
+ selectors: { getSettledSourceTextContent },
+ } = dbg;
+
+ // The source itself doesn't even exist yet, and using
+ // `selectSourceURL` will set a pending request to load this source
+ // and highlight a specific line.
+
+ await selectSource(dbg, "long.js", 66);
+
+ // TODO: revisit highlighting lines when the debugger opens
+ // assertHighlightLocation(dbg, "long.js", 66);
+
+ info("Select line 16 and make sure the editor scrolled.");
+ await selectSource(dbg, "long.js", 16);
+ await waitForElementWithSelector(dbg, ".CodeMirror-code > .highlight-line");
+ assertHighlightLocation(dbg, "long.js", 16);
+
+ info("Select several locations and check that we have one highlight");
+ await selectSource(dbg, "long.js", 17);
+ await selectSource(dbg, "long.js", 18);
+ assertHighlightLocation(dbg, "long.js", 18);
+
+ // Test jumping to a line in a source that exists but hasn't been
+ // loaded yet.
+ info("Select an unloaded source");
+ selectSource(dbg, "simple1.js", 6);
+
+ // Make sure the source is in the loading state, wait for it to be
+ // fully loaded, and check the highlighted line.
+ const simple1 = findSource(dbg, "simple1.js");
+ const location = createLocation({ source: simple1 });
+ is(getSettledSourceTextContent(location), null);
+
+ await waitForSelectedSource(dbg, "simple1.js");
+ ok(getSettledSourceTextContent(location).value.value);
+ assertHighlightLocation(dbg, "simple1.js", 6);
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-editor-mode.js b/devtools/client/debugger/test/mochitest/browser_dbg-editor-mode.js
new file mode 100644
index 0000000000..6cec2e1dbf
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-editor-mode.js
@@ -0,0 +1,18 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests that the editor sets the correct mode for different file
+// types
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-scripts.html", "simple1.js");
+
+ await selectSource(dbg, "simple1.js");
+ is(dbg.getCM().getOption("mode").name, "javascript", "Mode is correct");
+
+ await selectSource(dbg, "doc-scripts.html");
+ is(dbg.getCM().getOption("mode").name, "htmlmixed", "Mode is correct");
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-editor-scroll.js b/devtools/client/debugger/test/mochitest/browser_dbg-editor-scroll.js
new file mode 100644
index 0000000000..50185d7340
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-editor-scroll.js
@@ -0,0 +1,52 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests that the editor keeps proper scroll position per document
+// while also moving to the correct location upon pause/breakpoint selection
+
+"use strict";
+
+requestLongerTimeout(2);
+
+add_task(async function () {
+ // This test runs too slowly on linux debug. I'd like to figure out
+ // which is the slowest part of this and make it run faster, but to
+ // fix a frequent failure allow a longer timeout.
+ const dbg = await initDebugger("doc-editor-scroll.html");
+
+ // Set the initial breakpoint.
+ await selectSource(dbg, "simple1.js");
+ await addBreakpoint(dbg, "simple1.js", 26);
+
+ const cm = getCM(dbg);
+
+ info("Open long file, scroll down to line below the fold");
+ await selectSource(dbg, "long.js");
+ cm.scrollTo(0, 600);
+
+ info("Ensure vertical scroll is the same after switching documents");
+ await selectSource(dbg, "simple1.js");
+ is(cm.getScrollInfo().top, 0);
+ await selectSource(dbg, "long.js");
+ is(cm.getScrollInfo().top, 600);
+
+ info("Trigger a pause, click on a frame, ensure the right line is selected");
+ invokeInTab("doNamedEval");
+ await waitForPaused(dbg);
+ findElement(dbg, "frame", 1).focus();
+ await clickElement(dbg, "frame", 1);
+ Assert.notEqual(
+ cm.getScrollInfo().top,
+ 0,
+ "frame scrolled down to correct location"
+ );
+
+ info("Navigating while paused, goes to the correct location");
+ await selectSource(dbg, "long.js");
+ is(cm.getScrollInfo().top, 600);
+
+ info("Open new source, ensure it's at 0 scroll");
+ await selectSource(dbg, "frames.js");
+ is(cm.getScrollInfo().top, 0);
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-editor-select.js b/devtools/client/debugger/test/mochitest/browser_dbg-editor-select.js
new file mode 100644
index 0000000000..c0c6c03a43
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-editor-select.js
@@ -0,0 +1,100 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests that the editor highlights the correct location when the
+// debugger pauses
+
+"use strict";
+
+requestLongerTimeout(2);
+
+add_task(async function () {
+ // This test runs too slowly on linux debug. I'd like to figure out
+ // which is the slowest part of this and make it run faster, but to
+ // fix a frequent failure allow a longer timeout.
+ const dbg = await initDebugger("doc-scripts.html");
+
+ info("Set the initial breakpoint.");
+ await selectSource(dbg, "simple1.js");
+ ok(
+ !findElementWithSelector(dbg, ".cursor-position"),
+ "no position is displayed when selecting a location without an explicit line number"
+ );
+ await selectSource(dbg, "simple1.js", 1, 1);
+ assertCursorPosition(
+ dbg,
+ 1,
+ 2,
+ "when passing an explicit line number, the position is displayed"
+ );
+ assertHighlightLocation(dbg, "simple1.js", 1);
+
+ // Note that CodeMirror is 0-based while the footer displays 1-based
+ getCM(dbg).setCursor({ line: 1, ch: 0 });
+ assertCursorPosition(
+ dbg,
+ 2,
+ 1,
+ "when moving the cursor, the position footer updates"
+ );
+ ok(
+ !findElement(dbg, "highlightLine"),
+ "Moving the cursor resets the highlighted line"
+ );
+
+ getCM(dbg).setCursor({ line: 2, ch: 0 });
+ assertCursorPosition(
+ dbg,
+ 3,
+ 1,
+ "when moving the cursor a second time, the position footer still updates"
+ );
+
+ await addBreakpoint(dbg, "simple1.js", 4);
+ const breakpointItems = findAllElements(dbg, "breakpointItems");
+ breakpointItems[0].click();
+ await waitForCursorPosition(dbg, 4);
+ assertCursorPosition(
+ dbg,
+ 4,
+ 16,
+ "when moving the cursor a second time, the position footer still updates"
+ );
+ assertHighlightLocation(dbg, "simple1.js", 4);
+
+ info("Call the function that we set a breakpoint in.");
+ invokeInTab("main");
+ await waitForPaused(dbg);
+ await waitForSelectedSource(dbg, "simple1.js");
+ assertPausedAtSourceAndLine(dbg, findSource(dbg, "simple1.js").id, 4);
+ assertCursorPosition(dbg, 4, 16, "on pause, the cursor updates");
+
+ info("Step into another file.");
+ await stepOver(dbg);
+ await stepIn(dbg);
+ await waitForSelectedSource(dbg, "simple2.js");
+ assertPausedAtSourceAndLine(dbg, findSource(dbg, "simple2.js").id, 3);
+ assertCursorPosition(dbg, 3, 5, "on step-in, the cursor updates");
+
+ info("Step out to the initial file.");
+ await stepOut(dbg);
+ assertPausedAtSourceAndLine(dbg, findSource(dbg, "simple1.js").id, 6);
+ assertCursorPosition(dbg, 6, 3, "on step-out, the cursor updates");
+ await resume(dbg);
+
+ info("Make sure that the editor scrolls to the paused location.");
+ const longSrc = findSource(dbg, "long.js");
+ await selectSource(dbg, "long.js");
+ await addBreakpoint(dbg, longSrc, 66);
+
+ invokeInTab("testModel");
+ await waitForPaused(dbg);
+ await waitForSelectedSource(dbg, "long.js");
+
+ assertPausedAtSourceAndLine(dbg, findSource(dbg, "long.js").id, 66);
+ ok(
+ isVisibleInEditor(dbg, findElement(dbg, "breakpoint")),
+ "Breakpoint is visible"
+ );
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-ember-original-variable-mapping-notifications.js b/devtools/client/debugger/test/mochitest/browser_dbg-ember-original-variable-mapping-notifications.js
new file mode 100644
index 0000000000..752acd979b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-ember-original-variable-mapping-notifications.js
@@ -0,0 +1,78 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+// Tests pausing in original sources from projects built on ember framework,
+// This also tests the original variable mapping toggle and notifications
+
+add_task(async function () {
+ const dbg = await initDebugger("ember/quickstart/dist/");
+
+ await invokeWithBreakpoint(
+ dbg,
+ "mapTestFunction",
+ "router.js",
+ { line: 13, column: 3 },
+ async () => {
+ info("Assert the original variable mapping notifications are visible");
+ is(
+ getScopeNotificationMessage(dbg),
+ DEBUGGER_L10N.getFormatStr(
+ "scopes.noOriginalScopes",
+ DEBUGGER_L10N.getStr("scopes.showOriginalScopes")
+ ),
+ "Original mapping is disabled so the scopes notification is visible"
+ );
+
+ // Open the expressions pane
+ let notificationText;
+ const notificationVisible = waitUntil(() => {
+ notificationText = getExpressionNotificationMessage(dbg);
+ return notificationText;
+ });
+ await toggleExpressions(dbg);
+ await notificationVisible;
+
+ is(
+ notificationText,
+ DEBUGGER_L10N.getStr("expressions.noOriginalScopes"),
+ "Original mapping is disabled so the expressions notification is visible"
+ );
+
+ await toggleMapScopes(dbg);
+
+ info(
+ "Assert the original variable mapping notifications no longer visible"
+ );
+ ok(
+ !getScopeNotificationMessage(dbg),
+ "Original mapping is enabled so the scopes notification is no longer visible"
+ );
+ ok(
+ !getScopeNotificationMessage(dbg),
+ "Original mapping is enabled so the expressions notification is no longer visible"
+ );
+
+ await assertScopes(dbg, [
+ "Module",
+ ["config", "{\u2026}"],
+ "EmberRouter:Class()",
+ "Router:Class()",
+ ]);
+ },
+ { shouldWaitForLoadedScopes: false }
+ );
+});
+
+function getScopeNotificationMessage(dbg) {
+ return dbg.win.document.querySelector(
+ ".scopes-pane .pane-info.no-original-scopes-info"
+ )?.innerText;
+}
+
+function getExpressionNotificationMessage(dbg) {
+ return dbg.win.document.querySelector(
+ ".watch-expressions-pane .pane-info.no-original-scopes-info"
+ )?.innerText;
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-es-module-worker.js b/devtools/client/debugger/test/mochitest/browser_dbg-es-module-worker.js
new file mode 100644
index 0000000000..93123187e1
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-es-module-worker.js
@@ -0,0 +1,75 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test that we can debug workers using ES Modules.
+
+"use strict";
+
+const httpServer = createTestHTTPServer();
+httpServer.registerContentType("html", "text/html");
+httpServer.registerContentType("js", "application/javascript");
+
+httpServer.registerPathHandler(`/`, function (request, response) {
+ response.setStatusLine(request.httpVersion, 200, "OK");
+ response.write(`
+ <html>
+ <script>window.worker = new Worker("worker.js", { type: "module" })</script>
+ </html>`);
+});
+
+httpServer.registerPathHandler("/worker.js", function (request, response) {
+ response.setHeader("Content-Type", "application/javascript");
+ response.write(`
+ onmessage = () => {
+ console.log("breakpoint line");
+ postMessage("resume");
+ }
+ `);
+});
+const port = httpServer.identity.primaryPort;
+const TEST_URL = `http://localhost:${port}/`;
+const WORKER_URL = TEST_URL + "worker.js";
+
+add_task(async function () {
+ const dbg = await initDebuggerWithAbsoluteURL(TEST_URL);
+
+ // Note that the following APIs only returns the additional threads
+ await waitForThreadCount(dbg, 1);
+ const threads = dbg.selectors.getThreads();
+ is(threads.length, 1, "Got the page and the worker threads");
+ is(threads[0].name, WORKER_URL, "Thread name is correct");
+
+ const source = findSource(dbg, "worker.js");
+ await selectSource(dbg, source);
+ await addBreakpoint(dbg, source, 3);
+
+ info("Call worker code to trigger the breakpoint");
+ await SpecialPowers.spawn(gBrowser.selectedBrowser, [], () => {
+ content.wrappedJSObject.worker.postMessage("foo");
+ });
+
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, source.id, 3);
+ assertTextContentOnLine(dbg, 3, `console.log("breakpoint line");`);
+
+ await SpecialPowers.spawn(gBrowser.selectedBrowser, [], () => {
+ // Create a Promise which will resolve once the worker resumes and send a message
+ // Hold the promise on window, so that a following task can use it.
+ content.onWorkerResumed = new Promise(
+ resolve => (content.wrappedJSObject.worker.onmessage = resolve)
+ );
+ });
+
+ await resume(dbg);
+
+ info("Wait for the worker to resume its execution and send a message");
+ await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async () => {
+ ok(
+ content.onWorkerResumed,
+ "The promise created by the previous task exists"
+ );
+ await content.onWorkerResumed;
+ ok(true, "The worker resumed its execution");
+ });
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-eval-throw.js b/devtools/client/debugger/test/mochitest/browser_dbg-eval-throw.js
new file mode 100644
index 0000000000..803037d921
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-eval-throw.js
@@ -0,0 +1,18 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test that exceptions thrown while evaluating code will pause at the point the
+// exception was generated when pausing on uncaught exceptions.
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-eval-throw.html");
+ await togglePauseOnExceptions(dbg, true, true);
+
+ invokeInTab("evaluateException");
+ await waitForPaused(dbg);
+ const source = dbg.selectors.getSelectedSource();
+ ok(!source.url, "Selected source should not have a URL");
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-event-breakpoints-fission.js b/devtools/client/debugger/test/mochitest/browser_dbg-event-breakpoints-fission.js
new file mode 100644
index 0000000000..072b840a14
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-event-breakpoints-fission.js
@@ -0,0 +1,81 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests early event breakpoints and event breakpoints in a remote frame.
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger(
+ "doc-event-breakpoints-fission.html",
+ "event-breakpoints.js"
+ );
+
+ await selectSource(dbg, "event-breakpoints.js");
+ await waitForSelectedSource(dbg, "event-breakpoints.js");
+
+ await dbg.actions.addEventListenerBreakpoints([
+ "event.mouse.click",
+ "event.xhr.load",
+ "timer.timeout.set",
+ ]);
+
+ info("Assert early timeout event breakpoint gets hit");
+ const waitForReload = reloadBrowser();
+
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "doc-event-breakpoints-fission.html").id,
+ 17
+ );
+ await resume(dbg);
+
+ await waitForReload;
+
+ info("Assert event breakpoints work in remote frame");
+ await invokeAndAssertBreakpoints(dbg);
+
+ info("reload the iframe");
+ await SpecialPowers.spawn(gBrowser.selectedBrowser, [], () =>
+ content.wrappedJSObject.reloadIframe()
+ );
+ info("Assert event breakpoints work in remote frame after reload");
+ await invokeAndAssertBreakpoints(dbg);
+});
+
+async function invokeAndAssertBreakpoints(dbg) {
+ invokeInTabRemoteFrame("clickHandler");
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "event-breakpoints.js").id,
+ 12
+ );
+ await resume(dbg);
+
+ invokeInTabRemoteFrame("xhrHandler");
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "event-breakpoints.js").id,
+ 20
+ );
+ await resume(dbg);
+}
+
+async function invokeInTabRemoteFrame(fnc, ...args) {
+ info(`Invoking in tab remote frame: ${fnc}(${args.map(uneval).join(",")})`);
+ await SpecialPowers.spawn(
+ gBrowser.selectedBrowser,
+ [fnc, args],
+ function (_fnc, _args) {
+ return SpecialPowers.spawn(
+ content.document.querySelector("iframe"),
+ [_fnc, _args],
+ (__fnc, __args) => content.wrappedJSObject[__fnc](...__args)
+ );
+ }
+ );
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-event-breakpoints.js b/devtools/client/debugger/test/mochitest/browser_dbg-event-breakpoints.js
new file mode 100644
index 0000000000..1065674186
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-event-breakpoints.js
@@ -0,0 +1,317 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+add_task(async function () {
+ await pushPref("dom.element.invokers.enabled", true);
+ await pushPref("dom.element.popover.enabled", true);
+
+ const dbg = await initDebugger(
+ "doc-event-breakpoints.html",
+ "event-breakpoints.js"
+ );
+ await selectSource(dbg, "event-breakpoints.js");
+ await waitForSelectedSource(dbg, "event-breakpoints.js");
+ const eventBreakpointsSource = findSource(dbg, "event-breakpoints.js");
+
+ // We want to set each breakpoint individually to test adding/removing breakpoints, see Bug 1748589.
+ await toggleEventBreakpoint(dbg, "Mouse", "event.mouse.click");
+
+ invokeInTab("clickHandler");
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, eventBreakpointsSource.id, 12);
+
+ const whyPaused = await waitFor(
+ () => dbg.win.document.querySelector(".why-paused")?.innerText
+ );
+ is(
+ whyPaused,
+ `Paused on event breakpoint\nDOM 'click' event`,
+ "whyPaused does state that the debugger is paused as a result of a click event breakpoint"
+ );
+ await resume(dbg);
+
+ await toggleEventBreakpoint(dbg, "XHR", "event.xhr.load");
+ invokeInTab("xhrHandler");
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, eventBreakpointsSource.id, 20);
+ await resume(dbg);
+
+ await toggleEventBreakpoint(dbg, "Timer", "timer.timeout.set");
+ await toggleEventBreakpoint(dbg, "Timer", "timer.timeout.fire");
+ invokeInTab("timerHandler");
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, eventBreakpointsSource.id, 27);
+ await resume(dbg);
+
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, eventBreakpointsSource.id, 28);
+ await resume(dbg);
+
+ await toggleEventBreakpoint(dbg, "Script", "script.source.firstStatement");
+ invokeInTab("evalHandler");
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, findSource(dbg, "eval-test.js").id, 2);
+ await resume(dbg);
+ await toggleEventBreakpoint(dbg, "Script", "script.source.firstStatement");
+
+ await toggleEventBreakpoint(dbg, "Control", "event.control.focusin");
+ await toggleEventBreakpoint(dbg, "Control", "event.control.focusout");
+ invokeOnElement("#focus-text", "focus");
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, eventBreakpointsSource.id, 43);
+ await resume(dbg);
+
+ // wait for focus-out event to fire
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, eventBreakpointsSource.id, 48);
+ await resume(dbg);
+
+ info("Deselect focus events");
+ // We need to give the input focus to test composition, but we don't want the
+ // focus breakpoints to fire.
+ await toggleEventBreakpoint(dbg, "Control", "event.control.focusin");
+ await toggleEventBreakpoint(dbg, "Control", "event.control.focusout");
+
+ await toggleEventBreakpoint(dbg, "Control", "event.control.invoke");
+ invokeOnElement("#invoker", "click");
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, eventBreakpointsSource.id, 73);
+ await resume(dbg);
+
+ info("Enable beforetoggle and toggle events");
+ await toggleEventBreakpoint(dbg, "Control", "event.control.beforetoggle");
+ await toggleEventBreakpoint(dbg, "Control", "event.control.toggle");
+ invokeOnElement("#popover-toggle", "click");
+ info("Wait for pause in beforetoggle event listener");
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, eventBreakpointsSource.id, 89);
+ await resume(dbg);
+ info("And wait for pause in toggle event listener after resuming");
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, eventBreakpointsSource.id, 93);
+ await resume(dbg);
+
+ await toggleEventBreakpoint(
+ dbg,
+ "Keyboard",
+ "event.keyboard.compositionstart"
+ );
+ invokeOnElement("#focus-text", "focus");
+
+ info("Type some characters during composition");
+ invokeComposition();
+
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, eventBreakpointsSource.id, 53);
+ await resume(dbg);
+
+ info("Deselect compositionstart and select compositionupdate");
+ await toggleEventBreakpoint(
+ dbg,
+ "Keyboard",
+ "event.keyboard.compositionstart"
+ );
+ await toggleEventBreakpoint(
+ dbg,
+ "Keyboard",
+ "event.keyboard.compositionupdate"
+ );
+
+ invokeOnElement("#focus-text", "focus");
+
+ info("Type some characters during composition");
+ invokeComposition();
+
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, eventBreakpointsSource.id, 58);
+ await resume(dbg);
+
+ info("Deselect compositionupdate and select compositionend");
+ await toggleEventBreakpoint(
+ dbg,
+ "Keyboard",
+ "event.keyboard.compositionupdate"
+ );
+ await toggleEventBreakpoint(dbg, "Keyboard", "event.keyboard.compositionend");
+ invokeOnElement("#focus-text", "focus");
+
+ info("Type some characters during composition");
+ invokeComposition();
+
+ info("Commit the composition");
+ EventUtils.synthesizeComposition({
+ type: "compositioncommitasis",
+ key: { key: "KEY_Enter" },
+ });
+
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, eventBreakpointsSource.id, 63);
+ await resume(dbg);
+
+ info(`Check that breakpoint can be set on "scrollend"`);
+ await toggleEventBreakpoint(dbg, "Control", "event.control.scrollend");
+
+ await SpecialPowers.spawn(gBrowser.selectedBrowser, [], () => {
+ content.scrollTo({ top: 20, behavior: "smooth" });
+ });
+
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, eventBreakpointsSource.id, 68);
+ await resume(dbg);
+
+ info("Check that the click event breakpoint is still enabled");
+ invokeInTab("clickHandler");
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, eventBreakpointsSource.id, 12);
+ await resume(dbg);
+
+ info("Check that disabling an event breakpoint works");
+ await toggleEventBreakpoint(dbg, "Mouse", "event.mouse.click");
+ invokeInTab("clickHandler");
+ // wait for a bit to make sure the debugger do not pause
+ await wait(100);
+ assertNotPaused(dbg);
+
+ info("Check that we can re-enable event breakpoints");
+ await toggleEventBreakpoint(dbg, "Mouse", "event.mouse.click");
+ invokeInTab("clickHandler");
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, eventBreakpointsSource.id, 12);
+ await resume(dbg);
+
+ info(
+ "Test that we don't pause on event breakpoints when source is blackboxed."
+ );
+ await clickElement(dbg, "blackbox");
+ await waitForDispatch(dbg.store, "BLACKBOX_WHOLE_SOURCES");
+
+ invokeInTab("clickHandler");
+ // wait for a bit to make sure the debugger do not pause
+ await wait(100);
+ assertNotPaused(dbg);
+
+ invokeInTab("xhrHandler");
+ // wait for a bit to make sure the debugger do not pause
+ await wait(100);
+ assertNotPaused(dbg);
+
+ invokeInTab("timerHandler");
+ // wait for a bit to make sure the debugger do not pause
+ await wait(100);
+ assertNotPaused(dbg);
+
+ // Cleanup - unblackbox the source
+ await clickElement(dbg, "blackbox");
+ await waitForDispatch(dbg.store, "UNBLACKBOX_WHOLE_SOURCES");
+
+ info(`Check that breakpoint can be set on "beforeUnload" event`);
+ await toggleEventBreakpoint(dbg, "Load", "event.load.beforeunload");
+ let onReload = reload(dbg);
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, eventBreakpointsSource.id, 78);
+ await resume(dbg);
+ await onReload;
+ await toggleEventBreakpoint(dbg, "Load", "event.load.beforeunload");
+
+ info(`Check that breakpoint can be set on "unload" event`);
+ await toggleEventBreakpoint(dbg, "Load", "event.load.unload");
+ onReload = reload(dbg);
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, eventBreakpointsSource.id, 83);
+ await resume(dbg);
+ await onReload;
+ await toggleEventBreakpoint(dbg, "Load", "event.load.unload");
+});
+
+function getEventListenersPanel(dbg) {
+ return findElementWithSelector(dbg, ".event-listeners-pane .event-listeners");
+}
+
+async function toggleEventBreakpoint(
+ dbg,
+ eventBreakpointGroup,
+ eventBreakpointName
+) {
+ const eventCheckbox = await getEventBreakpointCheckbox(
+ dbg,
+ eventBreakpointGroup,
+ eventBreakpointName
+ );
+ eventCheckbox.scrollIntoView();
+ info(`Toggle ${eventBreakpointName} breakpoint`);
+ const onEventListenersUpdate = waitForDispatch(
+ dbg.store,
+ "UPDATE_EVENT_LISTENERS"
+ );
+ const checked = eventCheckbox.checked;
+ eventCheckbox.click();
+ await onEventListenersUpdate;
+
+ info("Wait for the event breakpoint checkbox to be toggled");
+ // Wait for he UI to be toggled, otherwise, the reducer may not be fully updated
+ await waitFor(() => {
+ return eventCheckbox.checked == !checked;
+ });
+}
+
+async function getEventBreakpointCheckbox(
+ dbg,
+ eventBreakpointGroup,
+ eventBreakpointName
+) {
+ if (!getEventListenersPanel(dbg)) {
+ // Event listeners panel is collapsed, expand it
+ findElementWithSelector(
+ dbg,
+ `.event-listeners-pane ._header .header-label`
+ ).click();
+ await waitFor(() => getEventListenersPanel(dbg));
+ }
+
+ const groupCheckbox = findElementWithSelector(
+ dbg,
+ `input[value="${eventBreakpointGroup}"]`
+ );
+ const groupEl = groupCheckbox.closest(".event-listener-group");
+ let groupEventsUl = groupEl.querySelector("ul");
+ if (!groupEventsUl) {
+ info(
+ `Expand ${eventBreakpointGroup} and wait for the sub list to be displayed`
+ );
+ groupEl.querySelector(".event-listener-expand").click();
+ groupEventsUl = await waitFor(() => groupEl.querySelector("ul"));
+ }
+
+ return findElementWithSelector(dbg, `input[value="${eventBreakpointName}"]`);
+}
+
+async function invokeOnElement(selector, action) {
+ await SpecialPowers.focus(gBrowser.selectedBrowser);
+ await SpecialPowers.spawn(
+ gBrowser.selectedBrowser,
+ [selector, action],
+ (_selector, _action) => {
+ content.document.querySelector(_selector)[_action]();
+ }
+ );
+}
+
+function invokeComposition() {
+ const string = "ex";
+ EventUtils.synthesizeCompositionChange({
+ composition: {
+ string,
+ clauses: [
+ {
+ length: string.length,
+ attr: Ci.nsITextInputProcessor.ATTR_RAW_CLAUSE,
+ },
+ ],
+ },
+ caret: { start: string.length, length: 0 },
+ key: { key: string[string.length - 1] },
+ });
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-event-handler.js b/devtools/client/debugger/test/mochitest/browser_dbg-event-handler.js
new file mode 100644
index 0000000000..10acc9f118
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-event-handler.js
@@ -0,0 +1,18 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test that pausing within an event handler on an element does *not* show the
+// HTML page containing that element. It should show a sources tab containing
+// just the handler's text instead.
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-event-handler.html");
+
+ invokeInTab("synthesizeClick");
+ await waitForPaused(dbg);
+ const source = dbg.selectors.getSelectedSource();
+ ok(!source.url, "Selected source should not have a URL");
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-expressions-error.js b/devtools/client/debugger/test/mochitest/browser_dbg-expressions-error.js
new file mode 100644
index 0000000000..5245af75e1
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-expressions-error.js
@@ -0,0 +1,33 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * test pausing on an errored watch expression
+ * assert that you can:
+ * 1. resume
+ * 2. still evalutate expressions
+ * 3. expand properties
+ */
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-script-switching.html");
+
+ await togglePauseOnExceptions(dbg, true, true);
+
+ // add a good expression, 2 bad expressions, and another good one
+ info(`Adding location`);
+ await addExpression(dbg, "location");
+ await addExpression(dbg, "foo.bar");
+ await addExpression(dbg, "foo)(");
+ await addExpression(dbg, "2");
+ // check the value of
+ is(getWatchExpressionValue(dbg, 2), "(unavailable)");
+ is(getWatchExpressionValue(dbg, 3), "\"SyntaxError: unexpected token: ')'\"");
+ is(getWatchExpressionValue(dbg, 4), "2");
+
+ await toggleExpressionNode(dbg, 1);
+ is(findAllElements(dbg, "expressionNodes").length, 37);
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-expressions-focus.js b/devtools/client/debugger/test/mochitest/browser_dbg-expressions-focus.js
new file mode 100644
index 0000000000..ad6bfae662
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-expressions-focus.js
@@ -0,0 +1,50 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Ensures the input is displayed and focused when "+" is clicked
+
+"use strict";
+
+add_task(async function () {
+ // Start with the watch expression panel open
+ await pushPref("devtools.debugger.expressions-visible", true);
+ const dbg = await initDebugger("doc-script-switching.html");
+
+ const watchExpressionHeaderEl = findElement(dbg, "watchExpressionsHeader");
+ is(
+ watchExpressionHeaderEl.tagName,
+ "BUTTON",
+ "The accordion toggle is a proper button"
+ );
+ is(
+ watchExpressionHeaderEl.getAttribute("aria-expanded"),
+ "true",
+ "The accordion toggle is properly marked as expanded"
+ );
+
+ info("Close the panel");
+ clickDOMElement(dbg, watchExpressionHeaderEl);
+ await waitFor(() =>
+ watchExpressionHeaderEl.getAttribute("aria-expanded", "false")
+ );
+ ok(true, "The accordion toggle is properly marked as collapsed");
+
+ info("Click + to add the new expression");
+ await waitForElement(dbg, "watchExpressionsAddButton");
+ clickElement(dbg, "watchExpressionsAddButton");
+
+ await waitFor(() =>
+ watchExpressionHeaderEl.getAttribute("aria-expanded", "true")
+ );
+ ok(true, "The accordion toggle is properly marked as expanded again");
+
+ info("Check that the input element gets focused");
+ await waitForElementWithSelector(dbg, ".expression-input-container.focused");
+ ok(true, "Found the expression input container, with the focused class");
+ is(
+ dbg.win.document.activeElement.classList.contains("input-expression"),
+ true,
+ "The active element is the watch expression input"
+ );
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-expressions-thread.js b/devtools/client/debugger/test/mochitest/browser_dbg-expressions-thread.js
new file mode 100644
index 0000000000..ca0406844b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-expressions-thread.js
@@ -0,0 +1,100 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Test the watch expressions update when selecting a different thread in the thread panel.
+ */
+
+"use strict";
+
+const TEST_COM_URI = `${URL_ROOT_COM_SSL}examples/doc_dbg-fission-frame-sources.html`;
+const TEST_ORG_IFRAME_URI = `${URL_ROOT_ORG_SSL}examples/doc_dbg-fission-frame-sources-frame.html`;
+const DATA_URI = "data:text/html,<title>foo</title>";
+
+add_task(async function () {
+ // Make sure that the thread section is expanded
+ await pushPref("devtools.debugger.threads-visible", true);
+
+ // Load a test page with a remote frame and wait for both sources to be visible.
+ // simple1.js is imported by the main page. simple2.js comes from the frame.
+ const dbg = await initDebuggerWithAbsoluteURL(
+ TEST_COM_URI,
+ "simple1.js",
+ "simple2.js"
+ );
+
+ const threadsPaneEl = await waitForElementWithSelector(
+ dbg,
+ ".threads-pane .header-label"
+ );
+
+ await waitForElement(dbg, "threadsPaneItems");
+ const threadsEl = findAllElements(dbg, "threadsPaneItems");
+ is(threadsEl.length, 2, "There are two threads in the thread panel");
+ const [mainThreadEl, remoteThreadEl] = threadsEl;
+ is(
+ mainThreadEl.textContent,
+ "Main Thread",
+ "first thread displayed is the main thread"
+ );
+ is(
+ remoteThreadEl.textContent,
+ "Test remote frame sources",
+ "second thread displayed is the remote thread"
+ );
+
+ await addExpression(dbg, "document.location.href");
+
+ is(
+ getWatchExpressionValue(dbg, 1),
+ JSON.stringify(TEST_COM_URI),
+ "expression is evaluated on the expected thread"
+ );
+
+ info(
+ "Select the remote frame thread and check that the expression is updated"
+ );
+ let onExpressionsEvaluated = waitForDispatch(
+ dbg.store,
+ "EVALUATE_EXPRESSIONS"
+ );
+ remoteThreadEl.click();
+ await onExpressionsEvaluated;
+
+ is(
+ getWatchExpressionValue(dbg, 1),
+ JSON.stringify(TEST_ORG_IFRAME_URI),
+ "expression is evaluated on the remote origin thread"
+ );
+
+ info("Select the main thread again and check that the expression is updated");
+ onExpressionsEvaluated = waitForDispatch(dbg.store, "EVALUATE_EXPRESSIONS");
+ mainThreadEl.click();
+ await onExpressionsEvaluated;
+
+ is(
+ getWatchExpressionValue(dbg, 1),
+ JSON.stringify(TEST_COM_URI),
+ "expression is evaluated on the main thread again"
+ );
+
+ // close the threads pane so following test don't have it open
+ threadsPaneEl.click();
+
+ await navigateToAbsoluteURL(dbg, DATA_URI);
+
+ is(
+ getWatchExpressionValue(dbg, 1),
+ JSON.stringify(DATA_URI),
+ "The location.host expression is updated after a navigaiton"
+ );
+
+ await addExpression(dbg, "document.title");
+
+ is(
+ getWatchExpressionValue(dbg, 2),
+ `"foo"`,
+ "We can add expressions after a navigation"
+ );
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-expressions-watch.js b/devtools/client/debugger/test/mochitest/browser_dbg-expressions-watch.js
new file mode 100644
index 0000000000..5f2c6aba40
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-expressions-watch.js
@@ -0,0 +1,91 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Test the watch expressions "refresh" button:
+ * - hidden when no expression is available
+ * - visible with one or more expressions
+ * - updates expressions values after clicking on it
+ * - disappears when all expressions are removed
+ */
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-script-switching.html");
+
+ invokeInTab("firstCall");
+ await waitForPaused(dbg);
+
+ ok(
+ !getRefreshExpressionsElement(dbg),
+ "No refresh button is displayed when there are no watch expressions"
+ );
+
+ await addExpression(dbg, "someVariable");
+
+ ok(
+ getRefreshExpressionsElement(dbg),
+ "Refresh button is displayed after adding a watch expression"
+ );
+
+ is(
+ getWatchExpressionLabel(dbg, 1),
+ "someVariable",
+ "Watch expression was added"
+ );
+ is(
+ getWatchExpressionValue(dbg, 1),
+ "(unavailable)",
+ "Watch expression has no value"
+ );
+
+ info("Switch to the console and update the value of the watched variable");
+ const { hud } = await dbg.toolbox.selectTool("webconsole");
+ await evaluateExpressionInConsole(hud, "var someVariable = 1");
+
+ info("Switch back to the debugger");
+ await dbg.toolbox.selectTool("jsdebugger");
+
+ is(
+ getWatchExpressionLabel(dbg, 1),
+ "someVariable",
+ "Watch expression is still available"
+ );
+ is(
+ getWatchExpressionValue(dbg, 1),
+ "(unavailable)",
+ "Watch expression still has no value"
+ );
+
+ info(
+ "Click on the watch expression refresh button and wait for the " +
+ "expression to update."
+ );
+ const refreshed = waitForDispatch(dbg.store, "EVALUATE_EXPRESSIONS");
+ await clickElement(dbg, "expressionRefresh");
+ await refreshed;
+
+ is(
+ getWatchExpressionLabel(dbg, 1),
+ "someVariable",
+ "Watch expression is still available"
+ );
+ is(
+ getWatchExpressionValue(dbg, 1),
+ "1",
+ "Watch expression value has been updated"
+ );
+
+ await deleteExpression(dbg, "someVariable");
+
+ ok(
+ !getRefreshExpressionsElement(dbg),
+ "The refresh button is no longer displayed after removing watch expressions"
+ );
+});
+
+function getRefreshExpressionsElement(dbg) {
+ return findElement(dbg, "expressionRefresh", 1);
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-expressions.js b/devtools/client/debugger/test/mochitest/browser_dbg-expressions.js
new file mode 100644
index 0000000000..4ff9dd0fa1
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-expressions.js
@@ -0,0 +1,104 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * tests the watch expressions component
+ * 1. add watch expressions
+ * 2. edit watch expressions
+ * 3. delete watch expressions
+ * 4. expanding properties when not paused
+ */
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-script-switching.html");
+
+ invokeInTab("firstCall");
+ await waitForPaused(dbg);
+
+ await addExpression(dbg, "f");
+ is(getWatchExpressionLabel(dbg, 1), "f");
+ is(getWatchExpressionValue(dbg, 1), "(unavailable)");
+
+ await editExpression(dbg, "oo");
+ is(getWatchExpressionLabel(dbg, 1), "foo()");
+
+ // There is no "value" element for functions.
+ assertEmptyValue(dbg, 1);
+
+ await addExpression(dbg, "location");
+ is(getWatchExpressionLabel(dbg, 2), "location");
+ ok(getWatchExpressionValue(dbg, 2).includes("Location"), "has a value");
+
+ // can expand an expression
+ await toggleExpressionNode(dbg, 2);
+
+ is(findAllElements(dbg, "expressionNodes").length, 35);
+ is(dbg.selectors.getExpressions(dbg.store.getState()).length, 2);
+
+ await deleteExpression(dbg, "foo");
+ await deleteExpression(dbg, "location");
+ is(findAllElements(dbg, "expressionNodes").length, 0);
+ is(dbg.selectors.getExpressions(dbg.store.getState()).length, 0);
+
+ // Test expanding properties when the debuggee is active
+ // Wait for full evaluation of the expressions in order to avoid having
+ // mixed up code between the location being removed and the one being re-added
+ const evaluated = waitForDispatch(dbg.store, "EVALUATE_EXPRESSIONS");
+ await resume(dbg);
+ await evaluated;
+
+ await addExpression(dbg, "location");
+ is(dbg.selectors.getExpressions(dbg.store.getState()).length, 1);
+
+ is(findAllElements(dbg, "expressionNodes").length, 1);
+
+ await toggleExpressionNode(dbg, 1);
+ is(findAllElements(dbg, "expressionNodes").length, 34);
+
+ await deleteExpression(dbg, "location");
+ is(findAllElements(dbg, "expressionNodes").length, 0);
+
+ info(
+ "Test an expression calling a function with a breakpoint and a debugger statement, which shouldn't pause"
+ );
+ await addBreakpoint(dbg, "script-switching-01.js", 7);
+ // firstCall will call secondCall from script-switching-02.js which has a debugger statement
+ await addExpression(dbg, "firstCall()");
+ is(getWatchExpressionLabel(dbg, 1), "firstCall()");
+ is(getWatchExpressionValue(dbg, 1), "43", "has a value");
+
+ await addExpression(dbg, "$('body')");
+ is(getWatchExpressionLabel(dbg, 2), "$('body')");
+ ok(
+ getWatchExpressionValue(dbg, 2).includes("body"),
+ "uses console command $() helper"
+ );
+
+ info("Implement a custom '$' function in the page");
+ await SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () {
+ content.eval("window.$ = function () {return 'page-override';}");
+ });
+
+ info("Refresh expressions");
+ const refreshed = waitForDispatch(dbg.store, "EVALUATE_EXPRESSIONS");
+ await clickElement(dbg, "expressionRefresh");
+ await refreshed;
+
+ ok(
+ getWatchExpressionValue(dbg, 2).includes("page-override"),
+ "the expression uses the page symbols and not the console command '$' function"
+ );
+});
+
+function assertEmptyValue(dbg, index) {
+ const value = findElement(dbg, "expressionValue", index);
+ if (value) {
+ is(value.innerText, "");
+ return;
+ }
+
+ is(value, null);
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-extension-inspectedWindow-debugger-statement.js b/devtools/client/debugger/test/mochitest/browser_dbg-extension-inspectedWindow-debugger-statement.js
new file mode 100644
index 0000000000..790b0366b9
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-extension-inspectedWindow-debugger-statement.js
@@ -0,0 +1,88 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test that web extensions' inspectedWindow.eval() doesn't break debugger/console
+
+"use strict";
+
+// Test debugger statement in page, with devtools opened to debugger panel
+add_task(async function () {
+ const extension = await installAndStartExtension();
+
+ const dbg = await initDebugger("doc-scripts.html");
+
+ await extension.awaitMessage("loaded");
+
+ info("Evaluating debugger statement in page");
+ const evalFinished = invokeInTab("nestedC");
+ await waitForPaused(dbg);
+
+ info("resuming once");
+ await resume(dbg);
+
+ // bug 1728290: WebExtension target used to trigger the thread actor and also pause a second time on the debugger statement.
+ // This would prevent the evaluation from completing.
+ info("waiting for invoked function to complete");
+ await evalFinished;
+
+ await closeTabAndToolbox();
+ await extension.unload();
+});
+
+// Test debugger statement in webconsole
+add_task(async function () {
+ const extension = await installAndStartExtension();
+
+ // Test again with debugger panel closed
+ const toolbox = await openNewTabAndToolbox(
+ EXAMPLE_URL + "doc-scripts.html",
+ "webconsole"
+ );
+ await extension.awaitMessage("loaded");
+
+ info("Evaluating debugger statement in console");
+ const onSelected = toolbox.once("jsdebugger-selected");
+ const evalFinished = invokeInTab("nestedC");
+
+ await onSelected;
+ const dbg = createDebuggerContext(toolbox);
+ await waitForPaused(dbg);
+
+ info("resuming once");
+ await resume(dbg);
+
+ await evalFinished;
+
+ await closeTabAndToolbox();
+ await extension.unload();
+});
+
+async function installAndStartExtension() {
+ async function devtools_page() {
+ await globalThis.browser.devtools.inspectedWindow.eval("");
+ globalThis.browser.test.sendMessage("loaded");
+ }
+
+ const extension = ExtensionTestUtils.loadExtension({
+ manifest: {
+ devtools_page: "devtools_page.html",
+ },
+ files: {
+ "devtools_page.html": `<!DOCTYPE html>
+ <html>
+ <head>
+ <meta charset="utf-8">
+ </head>
+ <body>
+ <script src="devtools_page.js"></script>
+ </body>
+ </html>`,
+ "devtools_page.js": devtools_page,
+ },
+ });
+
+ await extension.startup();
+
+ return extension;
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-features-asm.js b/devtools/client/debugger/test/mochitest/browser_dbg-features-asm.js
new file mode 100644
index 0000000000..15c7737072
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-features-asm.js
@@ -0,0 +1,92 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * This test covers all specifics of debugging ASM.js files.
+ *
+ * ASM.js is a subset of the Javascript syntax.
+ * Thanks to these limitations, the JS engine is able to compile this code
+ * into machine instructions and execute it faster.
+ *
+ * When the DevTools are opened, ThreadConfiguration's `observeAsmJS` is set to true,
+ * which sets DebuggerAPI's `allowUnobservedAsmJS` to false,
+ * which disables the compilation of ASM.js files and make them run as regular JS code.
+ * Thus, allowing to debug them as regular JS code.
+ *
+ * This behavior introduces some limitations when opening the debugger against
+ * and already loaded page. The ASM.js file won't be debuggable.
+ */
+
+"use strict";
+
+add_task(async function () {
+ // Load the test page before opening the debugger
+ // and also force a GC before opening the debugger
+ // so that ASM.js is fully garbaged collected.
+ // Otherwise on debug builds, the thread actor is able to intermittently
+ // retrieve the ASM.js sources and retrieve the breakable lines.
+ const tab = await addTab(EXAMPLE_URL + "doc-asm.html");
+ await SpecialPowers.spawn(tab.linkedBrowser, [], function () {
+ Cu.forceGC();
+ });
+ const toolbox = await openToolboxForTab(tab, "jsdebugger");
+ const dbg = createDebuggerContext(toolbox);
+
+ // There is the legit and the spurious wasm source (see following comment)
+ await waitForSourcesInSourceTree(dbg, ["doc-asm.html", "asm.js", "asm.js"]);
+ is(dbg.selectors.getSourceCount(), 3, "There are only three sources");
+
+ const legitSource = findSource(dbg, EXAMPLE_URL + "asm.js");
+ ok(
+ legitSource.url.startsWith("https://"),
+ "We got the legit source that works, not the spurious WASM one"
+ );
+ is(legitSource.isWasm, false, "ASM.js sources are *not* flagged as WASM");
+
+ // XXX Bug 1759573 - There is a spurious wasm source reported which is broken
+ // and ideally shouldn't exists at all in UI.
+ // The Thread Actor is notified by the Debugger API about a WASM
+ // source when calling Debugger.findSources in ThreadActor.addAllSources.
+ const wasmUrl = "wasm:" + legitSource.url;
+ ok(
+ sourceExists(dbg, wasmUrl),
+ `There is a spurious wasm:// source displayed: ${wasmUrl}`
+ );
+
+ await selectSource(dbg, legitSource);
+
+ assertTextContentOnLine(dbg, 7, "return 1 | 0;");
+
+ info(
+ "Before reloading, ThreadConfiguration's 'observedAsmJS' was false while the page was loading"
+ );
+ info(
+ "So that we miss info about the ASM sources and lines are not breakables"
+ );
+ assertLineIsBreakable(dbg, legitSource.url, 7, false);
+
+ info("Reload and assert that ASM.js file are then debuggable");
+ await reload(dbg, "doc-asm.html", "asm.js");
+
+ info("After reloading, ASM lines are breakable");
+ // Ensure selecting the source before asserting breakable lines
+ // otherwise the gutter may not be yet updated
+ await selectSource(dbg, "asm.js");
+ assertLineIsBreakable(dbg, legitSource.url, 7, true);
+
+ await waitForSourcesInSourceTree(dbg, ["doc-asm.html", "asm.js"]);
+ is(dbg.selectors.getSourceCount(), 2, "There is only the two sources");
+
+ assertTextContentOnLine(dbg, 7, "return 1 | 0;");
+
+ await addBreakpoint(dbg, "asm.js", 7);
+ invokeInTab("runAsm");
+
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, findSource(dbg, "asm.js").id, 7);
+ await assertBreakpoint(dbg, 7);
+
+ await removeBreakpoint(dbg, findSource(dbg, "asm.js").id, 7);
+ await resume(dbg);
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-features-breakable-lines.js b/devtools/client/debugger/test/mochitest/browser_dbg-features-breakable-lines.js
new file mode 100644
index 0000000000..872530025f
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-features-breakable-lines.js
@@ -0,0 +1,92 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+const testServer = createVersionizedHttpTestServer(
+ "examples/sourcemaps-reload-uncompressed"
+);
+const TEST_URL = testServer.urlFor("index.html");
+
+// Assert the behavior of the gutter that grays out non-breakable lines
+add_task(async function testBreakableLinesOverReloads() {
+ const dbg = await initDebuggerWithAbsoluteURL(
+ TEST_URL,
+ "index.html",
+ "script.js",
+ "original.js"
+ );
+
+ info("Assert breakable lines of the first html page load");
+ await assertBreakableLines(dbg, "index.html", 78, [
+ ...getRange(16, 17),
+ 21,
+ ...getRange(24, 25),
+ 30,
+ 36,
+ ]);
+
+ info("Assert breakable lines of the first original source file, original.js");
+ // The length of original.js is longer than the test file
+ // because the sourcemap replaces the content of the original file
+ // and appends a few lines with a "WEBPACK FOOTER" comment
+ // All the appended lines are empty lines or comments, so none of them are breakable.
+ await assertBreakableLines(dbg, "original.js", 15, [
+ ...getRange(1, 3),
+ 5,
+ ...getRange(8, 10),
+ ]);
+
+ info("Assert breakable lines of the simple first load of script.js");
+ await assertBreakableLines(dbg, "script.js", 9, [1, 5, 7, 8, 9]);
+
+ info("Assert breakable lines of the first iframe page load");
+ await assertBreakableLines(dbg, "iframe.html", 30, [
+ ...getRange(16, 17),
+ ...getRange(22, 23),
+ ]);
+
+ info(
+ "Reload the page, wait for sources and assert that breakable lines get updated"
+ );
+ testServer.switchToNextVersion();
+ await reload(dbg, "index.html", "script.js", "original.js", "iframe.html");
+
+ // Wait for previously selected source to be re-selected after reload
+ // otherwise it may overlap with the next source selected by assertBreakableLines.
+ await waitForSelectedSource(dbg, "iframe.html");
+
+ info("Assert breakable lines of the more complex second load of script.js");
+ await assertBreakableLines(dbg, "script.js", 23, [2, ...getRange(13, 23)]);
+
+ info("Assert breakable lines of the second html page load");
+ await assertBreakableLines(dbg, "index.html", 33, [25, 27]);
+
+ info("Assert breakable lines of the second orignal file");
+ // See first assertion about original.js,
+ // the size of original.js doesn't match the size of the test file
+ await assertBreakableLines(dbg, "original.js", 18, [
+ ...getRange(1, 3),
+ ...getRange(8, 11),
+ 13,
+ ]);
+
+ await selectSource(dbg, "iframe.html");
+ // When EFT is disabled, iframe.html is a regular source and the right content is displayed
+ if (isEveryFrameTargetEnabled()) {
+ is(
+ getCM(dbg).getValue(),
+ `Error: Incorrect contents fetched, please reload.`
+ );
+ }
+ /**
+ * Bug 1762381 - Can't assert breakable lines yet, because the iframe page content fails loading
+
+ info("Assert breakable lines of the second iframe page load");
+ await assertBreakableLines(dbg, "iframe.html", 27, [
+ ...getRange(15, 17),
+ ...getRange(21, 23),
+ ]);
+ */
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-features-breakable-positions.js b/devtools/client/debugger/test/mochitest/browser_dbg-features-breakable-positions.js
new file mode 100644
index 0000000000..8921b83f2b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-features-breakable-positions.js
@@ -0,0 +1,284 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+const testServer = createVersionizedHttpTestServer(
+ "examples/sourcemaps-reload-uncompressed"
+);
+const TEST_URL = testServer.urlFor("index.html");
+
+// getTokenFromPosition pauses 0.5s for each line,
+// so this test is quite slow to complete
+requestLongerTimeout(4);
+
+/**
+ * Cover the breakpoints positions/columns:
+ * - assert that the UI displayed markers in CodeMirror next to each breakable columns,
+ * - assert the data in the reducers about the breakable columns.
+ *
+ * Note that it doesn't assert that the breakpoint can be hit.
+ * It only verify data integrity and the UI.
+ */
+add_task(async function testBreakableLinesOverReloads() {
+ const dbg = await initDebuggerWithAbsoluteURL(
+ TEST_URL,
+ "index.html",
+ "script.js",
+ "original.js"
+ );
+
+ info("Assert breakable lines of the first html page load");
+ await assertBreakablePositions(dbg, "index.html", 78, [
+ { line: 16, columns: [6, 14] },
+ { line: 17, columns: [] },
+ { line: 21, columns: [12, 20, 48] },
+ { line: 24, columns: [12, 20] },
+ { line: 25, columns: [] },
+ { line: 30, columns: [] },
+ { line: 36, columns: [] },
+ ]);
+
+ info("Pretty print first html page load and assert breakable lines");
+ await prettyPrint(dbg);
+ await assertBreakablePositions(dbg, "index.html:formatted", 87, [
+ { line: 16, columns: [0, 8] },
+ { line: 22, columns: [0, 8, 35] },
+ { line: 27, columns: [0, 8] },
+ { line: 28, columns: [] },
+ { line: 36, columns: [] },
+ ]);
+ await closeTab(dbg, "index.html:formatted");
+
+ info("Assert breakable lines of the first original source file, original.js");
+ // The length of original.js is longer than the test file
+ // because the sourcemap replaces the content of the original file
+ // and appends a few lines with a "WEBPACK FOOTER" comment
+ // All the appended lines are empty lines or comments, so none of them are breakable.
+ await assertBreakablePositions(dbg, "original.js", 15, [
+ { line: 1, columns: [] },
+ { line: 2, columns: [2, 9, 32] },
+ { line: 3, columns: [] },
+ { line: 5, columns: [] },
+ { line: 8, columns: [2, 8] },
+ { line: 9, columns: [2, 10] },
+ { line: 10, columns: [] },
+ ]);
+
+ info("Assert breakable lines of the simple first load of script.js");
+ await assertBreakablePositions(dbg, "script.js", 9, [
+ { line: 1, columns: [0, 8] },
+ { line: 5, columns: [2, 10] },
+ { line: 7, columns: [2, 9] },
+ { line: 8, columns: [] },
+ { line: 9, columns: [] },
+ ]);
+
+ info("Pretty print first load of script.js and assert breakable lines");
+ await prettyPrint(dbg);
+ await assertBreakablePositions(dbg, "script.js:formatted", 8, [
+ { line: 1, columns: [0, 8] },
+ { line: 4, columns: [2, 10] },
+ { line: 6, columns: [2, 9] },
+ { line: 7, columns: [] },
+ ]);
+ await closeTab(dbg, "script.js:formatted");
+
+ info(
+ "Reload the page, wait for sources and assert that breakable lines get updated"
+ );
+ testServer.switchToNextVersion();
+ await reload(dbg, "index.html", "script.js", "original.js");
+
+ info("Assert breakable lines of the more complex second load of script.js");
+ await assertBreakablePositions(dbg, "script.js", 23, [
+ { line: 2, columns: [0, 8] },
+ { line: 13, columns: [4, 12] },
+ { line: 14, columns: [] },
+ { line: 15, columns: [] },
+ { line: 16, columns: [] },
+ { line: 17, columns: [] },
+ { line: 18, columns: [2, 10] },
+ { line: 19, columns: [] },
+ { line: 20, columns: [] },
+ { line: 21, columns: [] },
+ { line: 22, columns: [] },
+ { line: 23, columns: [] },
+ ]);
+
+ info("Pretty print first load of script.js and assert breakable lines");
+ await prettyPrint(dbg);
+ await assertBreakablePositions(dbg, "script.js:formatted", 23, [
+ { line: 2, columns: [0, 8] },
+ { line: 13, columns: [4, 12] },
+ { line: 14, columns: [] },
+ { line: 15, columns: [] },
+ { line: 16, columns: [] },
+ { line: 17, columns: [] },
+ { line: 18, columns: [2, 10] },
+ { line: 19, columns: [] },
+ { line: 20, columns: [] },
+ { line: 21, columns: [] },
+ { line: 22, columns: [] },
+ ]);
+ await closeTab(dbg, "script.js:formatted");
+
+ info("Assert breakable lines of the second html page load");
+ await assertBreakablePositions(dbg, "index.html", 33, [
+ { line: 25, columns: [6, 14] },
+ { line: 27, columns: [] },
+ ]);
+
+ info("Pretty print second html page load and assert breakable lines");
+ await prettyPrint(dbg);
+ await assertBreakablePositions(dbg, "index.html:formatted", 33, [
+ { line: 25, columns: [0, 8] },
+ ]);
+ await closeTab(dbg, "index.html:formatted");
+
+ info("Assert breakable lines of the second orignal file");
+ // See first assertion about original.js,
+ // the size of original.js doesn't match the size of the test file
+ await assertBreakablePositions(dbg, "original.js", 18, [
+ { line: 1, columns: [] },
+ { line: 2, columns: [2, 9, 32] },
+ { line: 3, columns: [] },
+ { line: 8, columns: [] },
+ { line: 9, columns: [2, 8] },
+ { line: 10, columns: [2, 10] },
+ { line: 11, columns: [] },
+ { line: 13, columns: [] },
+ ]);
+});
+
+async function assertBreakablePositions(
+ dbg,
+ file,
+ numberOfLines,
+ breakablePositions
+) {
+ await selectSource(dbg, file);
+ is(
+ getCM(dbg).lineCount(),
+ numberOfLines,
+ `We show the expected number of lines in CodeMirror for ${file}`
+ );
+ for (let line = 1; line <= numberOfLines; line++) {
+ info(`Asserting line #${line}`);
+ const positions = breakablePositions.find(
+ position => position.line == line
+ );
+ // If we don't have any position, only assert that the line isn't breakable
+ if (!positions) {
+ assertLineIsBreakable(dbg, file, line, false);
+ continue;
+ }
+ const { columns } = positions;
+ // Otherwise, set a breakpoint on the line to ensure we force fetching the breakable columns per line
+ // (this is only fetch on-demand)
+ await addBreakpointViaGutter(dbg, line);
+ await assertBreakpoint(dbg, line);
+ const source = findSource(dbg, file);
+
+ // If there is no column breakpoint, skip all further assertions
+ // Last lines of inline script are reported as breakable lines and selectors reports
+ // one breakable column, but, we don't report any available column breakpoint for them.
+ if (!columns.length) {
+ // So, only ensure that the really is no marker on this line
+ const lineElement = await getTokenFromPosition(dbg, { line });
+ const columnMarkers = lineElement.querySelectorAll(".column-breakpoint");
+ is(
+ columnMarkers.length,
+ 0,
+ `There is no breakable columns on line ${line}`
+ );
+ await removeBreakpoint(dbg, source.id, line);
+ continue;
+ }
+
+ const selectorPositions = dbg.selectors.getBreakpointPositionsForSource(
+ source.id
+ );
+ ok(selectorPositions, "Selector returned positions");
+ const selectorPositionsForLine = selectorPositions[line];
+ ok(selectorPositionsForLine, "Selector returned positions for the line");
+ is(
+ selectorPositionsForLine.length,
+ columns.length,
+ "Selector has the expected number of breakable columns"
+ );
+ for (const selPos of selectorPositionsForLine) {
+ is(
+ selPos.location.line,
+ line,
+ "Selector breakable column has the right line"
+ );
+ ok(
+ columns.includes(selPos.location.column),
+ `Selector breakable column has an expected column (${
+ selPos.location.column
+ } in ${JSON.stringify(columns)}) for line ${line}`
+ );
+ is(
+ selPos.location.source.id,
+ source.id,
+ "Selector breakable column has the right source id"
+ );
+ is(
+ selPos.location.source.url,
+ source.url,
+ "Selector breakable column has the right source url"
+ );
+ }
+
+ const tokenElement = await getTokenFromPosition(dbg, { line });
+ const lineElement = tokenElement.closest(".CodeMirror-line");
+ // Those are the breakpoint chevron we click on to set a breakpoint on a given column
+ const columnMarkers = [
+ ...lineElement.querySelectorAll(".column-breakpoint"),
+ ];
+ is(
+ columnMarkers.length,
+ columns.length,
+ "Got the expeced number of column markers"
+ );
+
+ // The first breakable column received the line breakpoint when calling addBreakpoint()
+ const firstColumn = columns.shift();
+ ok(
+ findColumnBreakpoint(dbg, file, line, firstColumn),
+ `The first column ${firstColumn} has a breakpoint automatically`
+ );
+ columnMarkers.shift();
+
+ for (const column of columns) {
+ ok(
+ !findColumnBreakpoint(dbg, file, line, column),
+ `Before clicking on the marker, the column ${column} was not having a breakpoint`
+ );
+ const marker = columnMarkers.shift();
+ const onSetBreakpoint = waitForDispatch(dbg.store, "SET_BREAKPOINT");
+ marker.click();
+ await onSetBreakpoint;
+ ok(
+ findColumnBreakpoint(dbg, file, line, column),
+ `Was able to set column breakpoint for ${file} @ ${line}:${column}`
+ );
+
+ const onRemoveBreakpoint = waitForDispatch(
+ dbg.store,
+ "REMOVE_BREAKPOINT"
+ );
+ marker.click();
+ await onRemoveBreakpoint;
+
+ ok(
+ !findColumnBreakpoint(dbg, file, line, column),
+ `Removed the just-added column breakpoint`
+ );
+ }
+
+ await removeBreakpoint(dbg, source.id, line);
+ }
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-features-breakpoints.js b/devtools/client/debugger/test/mochitest/browser_dbg-features-breakpoints.js
new file mode 100644
index 0000000000..0f4ad6959a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-features-breakpoints.js
@@ -0,0 +1,73 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+/**
+ * Assert that breakpoints and stepping works in various conditions
+ */
+
+const testServer = createVersionizedHttpTestServer(
+ "examples/sourcemaps-reload-uncompressed"
+);
+const TEST_URL = testServer.urlFor("index.html");
+
+add_task(
+ async function testSteppingFromOriginalToGeneratedAndAnotherOriginal() {
+ const dbg = await initDebuggerWithAbsoluteURL(
+ TEST_URL,
+ "index.html",
+ "script.js",
+ "original.js"
+ );
+
+ await selectSource(dbg, "original.js");
+ await addBreakpoint(dbg, "original.js", 8);
+ assertBreakpointSnippet(dbg, 1, "await nonSourceMappedFunction();");
+
+ info("Test pausing on an original source");
+ invokeInTab("foo");
+ await waitForPausedInOriginalFileAndToggleMapScopes(dbg, "original.js");
+
+ assertPausedAtSourceAndLine(dbg, findSource(dbg, "original.js").id, 8);
+
+ info("Then stepping into a generated source");
+ await stepIn(dbg);
+ assertPausedAtSourceAndLine(dbg, findSource(dbg, "script.js").id, 5);
+
+ info("Stepping another time within the same generated source");
+ await stepIn(dbg);
+ assertPausedAtSourceAndLine(dbg, findSource(dbg, "script.js").id, 7);
+
+ info("And finally stepping into another original source");
+ await stepIn(dbg);
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "removed-original.js").id,
+ 4
+ );
+
+ info("Walk up the stack backward, until we resume execution");
+ await stepIn(dbg);
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "removed-original.js").id,
+ 5
+ );
+
+ await stepIn(dbg);
+ assertPausedAtSourceAndLine(dbg, findSource(dbg, "script.js").id, 8);
+
+ await stepIn(dbg);
+ assertPausedAtSourceAndLine(dbg, findSource(dbg, "original.js").id, 9);
+
+ await stepIn(dbg);
+ assertPausedAtSourceAndLine(dbg, findSource(dbg, "original.js").id, 10);
+
+ // We can't use the `stepIn` helper as this last step will resume
+ // and the helper is expecting to pause again
+ await dbg.actions.stepIn();
+ await assertNotPaused(dbg);
+ }
+);
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-features-browser-toolbox-source-tree.js b/devtools/client/debugger/test/mochitest/browser_dbg-features-browser-toolbox-source-tree.js
new file mode 100644
index 0000000000..fa321f5f43
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-features-browser-toolbox-source-tree.js
@@ -0,0 +1,122 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * This test focuses on the SourceTree component, within the browser toolbox.
+ */
+
+"use strict";
+
+requestLongerTimeout(2);
+
+Services.scriptloader.loadSubScript(
+ "chrome://mochitests/content/browser/devtools/client/framework/browser-toolbox/test/helpers-browser-toolbox.js",
+ this
+);
+
+// Test that the Web extension name is shown in source tree rather than
+// the extensions internal UUID. This checks both the web toolbox and the
+// browser toolbox.
+add_task(async function testSourceTreeNamesForWebExtensions() {
+ await pushPref("devtools.chrome.enabled", true);
+ await pushPref("devtools.browsertoolbox.scope", "everything");
+ const extension = await installAndStartContentScriptExtension();
+
+ const dbg = await initDebugger("doc-content-script-sources.html");
+ await waitForSourcesInSourceTree(dbg, [], {
+ noExpand: true,
+ });
+
+ is(
+ getSourceTreeLabel(dbg, 2),
+ "Test content script extension",
+ "Test content script extension is labeled properly"
+ );
+
+ await dbg.toolbox.closeToolbox();
+ await extension.unload();
+
+ // Make sure the toolbox opens with the debugger selected.
+ await pushPref("devtools.browsertoolbox.panel", "jsdebugger");
+
+ const ToolboxTask = await initBrowserToolboxTask();
+ await ToolboxTask.importFunctions({
+ createDebuggerContext,
+ waitUntil,
+ findSourceNodeWithText,
+ findAllElements,
+ getSelector,
+ findAllElementsWithSelector,
+ assertSourceTreeNode,
+ });
+
+ await ToolboxTask.spawn(selectors, async _selectors => {
+ this.selectors = _selectors;
+ });
+
+ await ToolboxTask.spawn(null, async () => {
+ try {
+ /* global gToolbox */
+ // Wait for the debugger to finish loading.
+ await gToolbox.getPanelWhenReady("jsdebugger");
+ const dbgx = createDebuggerContext(gToolbox);
+ let rootNodeForExtensions = null;
+ await waitUntil(() => {
+ rootNodeForExtensions = findSourceNodeWithText(dbgx, "extension");
+ return !!rootNodeForExtensions;
+ });
+ // Find the root node for extensions and expand it if needed
+ if (
+ !!rootNodeForExtensions &&
+ !rootNodeForExtensions.querySelector(".arrow.expanded")
+ ) {
+ rootNodeForExtensions.querySelector(".arrow").click();
+ }
+
+ // Assert that extensions are displayed in the source tree
+ // with their extension name.
+ await assertSourceTreeNode(dbgx, "Picture-In-Picture");
+ await assertSourceTreeNode(dbgx, "Form Autofill");
+
+ const threadLabels = [...findAllElements(dbgx, "sourceTreeThreads")].map(
+ el => {
+ return el.textContent;
+ }
+ );
+ is(
+ threadLabels[0],
+ "Main Thread",
+ "The first thread is always the main thread"
+ );
+ let lastPID = -1,
+ lastThreadLabel = "";
+ for (let i = 1; i < threadLabels.length; i++) {
+ const label = threadLabels[i];
+ if (label.startsWith("(pid ")) {
+ ok(
+ !lastThreadLabel,
+ "We should only have content process threads first after the main thread"
+ );
+ const pid = parseInt(label.match(/pid (\d+)\)/)[1], 10);
+ ok(
+ pid >= lastPID,
+ `The content process threads are sorted by incremental PID ${pid} > ${lastPID}`
+ );
+ lastPID = pid;
+ } else {
+ ok(
+ label.localeCompare(lastThreadLabel) >= 0,
+ `Worker thread labels are sorted alphabeticaly: ${label} vs ${lastThreadLabel}`
+ );
+ lastThreadLabel = label;
+ }
+ }
+ } catch (e) {
+ console.log("Caught exception in spawn", e);
+ throw e;
+ }
+ });
+
+ await ToolboxTask.destroy();
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-features-source-text-content.js b/devtools/client/debugger/test/mochitest/browser_dbg-features-source-text-content.js
new file mode 100644
index 0000000000..2b853f2c4f
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-features-source-text-content.js
@@ -0,0 +1,581 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * This test focus on asserting the source content displayed in CodeMirror
+ * when we open a source from the SourceTree (or by any other means).
+ *
+ * The source content is being fetched from the server only on-demand.
+ * The main shortcoming is about sources being GC-ed. This only happens
+ * when we open the debugger on an already loaded page.
+ * When we (re)load a page while the debugger is opened, sources are never GC-ed.
+ * There are also specifics related to HTML page having inline scripts.
+ * Also, as this data is fetched on-demand, there is a loading prompt
+ * being displayed while the source is being fetched from the server.
+ */
+
+"use strict";
+
+const httpServer = createTestHTTPServer();
+const BASE_URL = `http://localhost:${httpServer.identity.primaryPort}/`;
+const loadCounts = {};
+
+/**
+ * Simple tests, asserting that we correctly display source text content in CodeMirror
+ */
+const NAMED_EVAL_CONTENT = `function namedEval() {}; console.log('eval script'); //# sourceURL=named-eval.js`;
+const NEW_FUNCTION_CONTENT =
+ "console.log('new function'); //# sourceURL=new-function.js";
+const INDEX_PAGE_CONTENT = `<!DOCTYPE html>
+ <html>
+ <head>
+ <script type="text/javascript" src="/normal-script.js"></script>
+ <script type="text/javascript" src="/slow-loading-script.js"></script>
+ <script type="text/javascript" src="/http-error-script.js"></script>
+ <script type="text/javascript" src="/same-url.js"></script>
+ <script>
+ console.log("inline script");
+ </script>
+ <script>
+ console.log("second inline script");
+ this.evaled1 = eval("${NAMED_EVAL_CONTENT}");
+
+ // Load same-url.js in various different ways
+ this.evaled2 = eval("function sameUrlEval() {}; //# sourceURL=same-url.js");
+
+ const script = document.createElement("script");
+ script.src = "same-url.js";
+ document.documentElement.append(script);
+
+ // Ensure loading the same-url.js file *after*
+ // the iframe is done loading. So that we have a deterministic load order.
+ window.onload = () => {
+ this.worker = new Worker("same-url.js");
+ this.worker.postMessage("foo");
+ };
+
+ this.newFunction = new Function("${NEW_FUNCTION_CONTENT}");
+
+ // This method will be called via invokeInTab.
+ let inFunctionIncrement = 1;
+ function breakInNewFunction() {
+ new Function("a\\n", "b" +inFunctionIncrement++, "debugger;")();
+ }
+ </script>
+ </head>
+ <body>
+ <iframe src="iframe.html"></iframe>
+ </body>
+ </html>`;
+const IFRAME_CONTENT = `<!DOCTYPE html>
+ <html>
+ <head>
+ <script type="text/javascript" src="/same-url.js"></script>
+ </head>
+ <body>
+ <script>
+ console.log("First inline script");
+ </script>
+ <script>
+ console.log("Second inline script");
+ </script>
+ </body>
+ </html>`;
+
+httpServer.registerPathHandler("/index.html", (request, response) => {
+ loadCounts[request.path] = (loadCounts[request.path] || 0) + 1;
+ response.setStatusLine(request.httpVersion, 200, "OK");
+ response.write(INDEX_PAGE_CONTENT);
+});
+
+httpServer.registerPathHandler("/normal-script.js", (request, response) => {
+ loadCounts[request.path] = (loadCounts[request.path] || 0) + 1;
+ response.setHeader("Content-Type", "application/javascript");
+ response.write(`console.log("normal script")`);
+});
+httpServer.registerPathHandler(
+ "/slow-loading-script.js",
+ (request, response) => {
+ loadCounts[request.path] = (loadCounts[request.path] || 0) + 1;
+ response.processAsync();
+ // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
+ setTimeout(function () {
+ response.setHeader("Content-Type", "application/javascript");
+ response.write(`console.log("slow loading script")`);
+ response.finish();
+ }, 1000);
+ }
+);
+httpServer.registerPathHandler("/http-error-script.js", (request, response) => {
+ loadCounts[request.path] = (loadCounts[request.path] || 0) + 1;
+ response.setStatusLine(request.httpVersion, 404, "Not found");
+ response.write(`console.log("http error")`);
+});
+httpServer.registerPathHandler("/same-url.js", (request, response) => {
+ loadCounts[request.path] = (loadCounts[request.path] || 0) + 1;
+ const sameUrlLoadCount = loadCounts[request.path];
+ // Prevents gecko from cache this request in order to force fetching
+ // a new, distinct content for each usage of this URL
+ response.setHeader("Cache-Control", "no-store");
+ response.setHeader("Content-Type", "application/javascript");
+ response.write(`console.log("same url #${sameUrlLoadCount}")`);
+});
+httpServer.registerPathHandler("/iframe.html", (request, response) => {
+ loadCounts[request.path] = (loadCounts[request.path] || 0) + 1;
+ response.setHeader("Content-Type", "text/html");
+ response.write(IFRAME_CONTENT);
+});
+add_task(async function testSourceTextContent() {
+ const dbg = await initDebuggerWithAbsoluteURL("about:blank");
+
+ const waitForSources = [
+ "index.html",
+ "normal-script.js",
+ "slow-loading-script.js",
+ "same-url.js",
+ "new-function.js",
+ ];
+
+ // With fission and EFT disabled, the structure of the source tree changes
+ // as there is no iframe thread and all the iframe sources are loaded under the
+ // Main thread, so nodes will be in different positions in the tree.
+ const noFissionNoEFT = !isFissionEnabled() && !isEveryFrameTargetEnabled();
+
+ if (noFissionNoEFT) {
+ waitForSources.push("iframe.html", "named-eval.js");
+ }
+
+ // Load the document *once* the debugger is opened
+ // in order to avoid having any source being GC-ed.
+ await navigateToAbsoluteURL(dbg, BASE_URL + "index.html", ...waitForSources);
+
+ await selectSourceFromSourceTree(
+ dbg,
+ "new-function.js",
+ noFissionNoEFT ? 6 : 5,
+ "Select `new-function.js`"
+ );
+ is(
+ getCM(dbg).getValue(),
+ `function anonymous(\n) {\n${NEW_FUNCTION_CONTENT}\n}`
+ );
+
+ await selectSourceFromSourceTree(
+ dbg,
+ "normal-script.js",
+ noFissionNoEFT ? 7 : 6,
+ "Select `normal-script.js`"
+ );
+ is(getCM(dbg).getValue(), `console.log("normal script")`);
+
+ await selectSourceFromSourceTree(
+ dbg,
+ "slow-loading-script.js",
+ noFissionNoEFT ? 9 : 8,
+ "Select `slow-loading-script.js`"
+ );
+ is(getCM(dbg).getValue(), `console.log("slow loading script")`);
+
+ await selectSourceFromSourceTree(
+ dbg,
+ "index.html",
+ noFissionNoEFT ? 4 : 3,
+ "Select `index.html`"
+ );
+ is(getCM(dbg).getValue(), INDEX_PAGE_CONTENT);
+
+ await selectSourceFromSourceTree(
+ dbg,
+ "named-eval.js",
+ noFissionNoEFT ? 5 : 4,
+ "Select `named-eval.js`"
+ );
+ is(getCM(dbg).getValue(), NAMED_EVAL_CONTENT);
+
+ await selectSourceFromSourceTree(
+ dbg,
+ "same-url.js",
+ noFissionNoEFT ? 8 : 7,
+ "Select `same-url.js` in the Main Thread"
+ );
+
+ is(
+ getCM(dbg).getValue(),
+ `console.log("same url #1")`,
+ "We get an arbitrary content for same-url, the first loaded one"
+ );
+
+ const sameUrlSource = findSource(dbg, "same-url.js");
+ const sourceActors = dbg.selectors.getSourceActorsForSource(sameUrlSource.id);
+
+ if (isFissionEnabled() || isEveryFrameTargetEnabled()) {
+ const mainThread = dbg.selectors
+ .getAllThreads()
+ .find(thread => thread.name == "Main Thread");
+
+ is(
+ sourceActors.filter(actor => actor.thread == mainThread.actor).length,
+ 3,
+ "same-url.js is loaded 3 times in the main thread"
+ );
+
+ info(`Close the same-url.js from Main Thread`);
+ await closeTab(dbg, "same-url.js");
+
+ info("Click on the iframe tree node to show sources in the iframe");
+ await clickElement(dbg, "sourceDirectoryLabel", 9);
+ await waitForSourcesInSourceTree(
+ dbg,
+ [
+ "index.html",
+ "named-eval.js",
+ "normal-script.js",
+ "slow-loading-script.js",
+ "same-url.js",
+ "iframe.html",
+ "same-url.js",
+ "new-function.js",
+ ],
+ {
+ noExpand: true,
+ }
+ );
+
+ await selectSourceFromSourceTree(
+ dbg,
+ "same-url.js",
+ 12,
+ "Select `same-url.js` in the iframe"
+ );
+
+ is(
+ getCM(dbg).getValue(),
+ `console.log("same url #3")`,
+ "We get the expected content for same-url.js in the iframe"
+ );
+
+ const iframeThread = dbg.selectors
+ .getAllThreads()
+ .find(thread => thread.name == `${BASE_URL}iframe.html`);
+ is(
+ sourceActors.filter(actor => actor.thread == iframeThread.actor).length,
+ 1,
+ "same-url.js is loaded one time in the iframe thread"
+ );
+ } else {
+ // There is no iframe thread when fission is off
+ const mainThread = dbg.selectors
+ .getAllThreads()
+ .find(thread => thread.name == "Main Thread");
+
+ is(
+ sourceActors.filter(actor => actor.thread == mainThread.actor).length,
+ 4,
+ "same-url.js is loaded 4 times in the main thread without fission"
+ );
+ }
+
+ info(`Close the same-url.js from the iframe`);
+ await closeTab(dbg, "same-url.js");
+
+ info("Click on the worker tree node to show sources in the worker");
+
+ await clickElement(dbg, "sourceDirectoryLabel", noFissionNoEFT ? 10 : 13);
+
+ const workerSources = [
+ "index.html",
+ "named-eval.js",
+ "normal-script.js",
+ "slow-loading-script.js",
+ "same-url.js",
+ "iframe.html",
+ "same-url.js",
+ "new-function.js",
+ ];
+
+ if (!noFissionNoEFT) {
+ workerSources.push("same-url.js");
+ }
+
+ await waitForSourcesInSourceTree(dbg, workerSources, {
+ noExpand: true,
+ });
+
+ await selectSourceFromSourceTree(
+ dbg,
+ "same-url.js",
+ noFissionNoEFT ? 12 : 15,
+ "Select `same-url.js` in the worker"
+ );
+
+ is(
+ getCM(dbg).getValue(),
+ `console.log("same url #4")`,
+ "We get the expected content for same-url.js worker"
+ );
+
+ const workerThread = dbg.selectors
+ .getAllThreads()
+ .find(thread => thread.name == `${BASE_URL}same-url.js`);
+
+ is(
+ sourceActors.filter(actor => actor.thread == workerThread.actor).length,
+ 1,
+ "same-url.js is loaded one time in the worker thread"
+ );
+
+ await selectSource(dbg, "iframe.html");
+ is(getCM(dbg).getValue(), IFRAME_CONTENT);
+
+ ok(
+ !sourceExists(dbg, "http-error-script.js"),
+ "scripts with HTTP error code do not appear in the source list"
+ );
+
+ info(
+ "Verify that breaking in a source without url displays the right content"
+ );
+ let onNewSource = waitForDispatch(dbg.store, "ADD_SOURCES");
+ invokeInTab("breakInNewFunction");
+ await waitForPaused(dbg);
+ let { sources } = await onNewSource;
+ is(sources.length, 1, "Got a unique source related to new Function source");
+ let newFunctionSource = sources[0];
+ // We acknowledge the function header as well as the new line in the first argument
+ assertPausedAtSourceAndLine(dbg, newFunctionSource.id, 4, 0);
+ is(getCM(dbg).getValue(), "function anonymous(a\n,b1\n) {\ndebugger;\n}");
+ await resume(dbg);
+
+ info(
+ "Break a second time in a source without url to verify we display the right content"
+ );
+ onNewSource = waitForDispatch(dbg.store, "ADD_SOURCES");
+ invokeInTab("breakInNewFunction");
+ await waitForPaused(dbg);
+ ({ sources } = await onNewSource);
+ is(sources.length, 1, "Got a unique source related to new Function source");
+ newFunctionSource = sources[0];
+ // We acknowledge the function header as well as the new line in the first argument
+ assertPausedAtSourceAndLine(dbg, newFunctionSource.id, 4, 0);
+ is(getCM(dbg).getValue(), "function anonymous(a\n,b2\n) {\ndebugger;\n}");
+ await resume(dbg);
+
+ // As we are loading the page while the debugger is already opened,
+ // none of the resources are loaded twice.
+ is(loadCounts["/index.html"], 1, "We loaded index.html only once");
+ is(
+ loadCounts["/normal-script.js"],
+ 1,
+ "We loaded normal-script.js only once"
+ );
+ is(
+ loadCounts["/slow-loading-script.js"],
+ 1,
+ "We loaded slow-loading-script.js only once"
+ );
+ is(
+ loadCounts["/same-url.js"],
+ 4,
+ "We loaded same-url.js in 4 distinct ways (the named eval doesn't count)"
+ );
+ // For some reason external to the debugger, we issue two requests to scripts having http error codes.
+ // These two requests are done before opening the debugger.
+ is(
+ loadCounts["/http-error-script.js"],
+ 2,
+ "We loaded http-error-script.js twice, only before the debugger is opened"
+ );
+});
+
+/**
+ * In this test, we force a GC before loading DevTools.
+ * So that Spidermonkey will no longer have access to the sources
+ * and another request should be issues to load the source text content.
+ */
+const GARBAGED_PAGE_CONTENT = `<!DOCTYPE html>
+ <html>
+ <head>
+ <script type="text/javascript" src="/garbaged-script.js"></script>
+ <script>
+ console.log("garbaged inline script");
+ </script>
+ </head>
+ </html>`;
+
+httpServer.registerPathHandler(
+ "/garbaged-collected.html",
+ (request, response) => {
+ loadCounts[request.path] = (loadCounts[request.path] || 0) + 1;
+ response.setStatusLine(request.httpVersion, 200, "OK");
+ response.write(GARBAGED_PAGE_CONTENT);
+ }
+);
+
+httpServer.registerPathHandler("/garbaged-script.js", (request, response) => {
+ loadCounts[request.path] = (loadCounts[request.path] || 0) + 1;
+ response.setHeader("Content-Type", "application/javascript");
+ response.write(`console.log("garbaged script ${loadCounts[request.path]}")`);
+});
+add_task(async function testGarbageCollectedSourceTextContent() {
+ const tab = await addTab(BASE_URL + "garbaged-collected.html");
+ is(
+ loadCounts["/garbaged-collected.html"],
+ 1,
+ "The HTML page is loaded once before opening the DevTools"
+ );
+ is(
+ loadCounts["/garbaged-script.js"],
+ 1,
+ "The script is loaded once before opening the DevTools"
+ );
+
+ // Force freeing both the HTML page and script in memory
+ // so that the debugger has to fetch source content from http cache.
+ await SpecialPowers.spawn(tab.linkedBrowser, [], () => {
+ Cu.forceGC();
+ });
+
+ const toolbox = await openToolboxForTab(tab, "jsdebugger");
+ const dbg = createDebuggerContext(toolbox);
+ await waitForSources(dbg, "garbaged-collected.html", "garbaged-script.js");
+
+ await selectSource(dbg, "garbaged-script.js");
+ // XXX Bug 1758454 - Source content of GC-ed script can be wrong!
+ // Even if we have to issue a new HTTP request for this source,
+ // we should be using HTTP cache and retrieve the first served version which
+ // is the one that actually runs in the page!
+ // We should be displaying `console.log("garbaged script 1")`,
+ // but instead, a new HTTP request is dispatched and we get a new content.
+ is(getCM(dbg).getValue(), `console.log("garbaged script 2")`);
+
+ await selectSource(dbg, "garbaged-collected.html");
+ is(getCM(dbg).getValue(), GARBAGED_PAGE_CONTENT);
+
+ is(
+ loadCounts["/garbaged-collected.html"],
+ 2,
+ "We loaded the html page once as we haven't tried to display it in the debugger (2)"
+ );
+ is(
+ loadCounts["/garbaged-script.js"],
+ 2,
+ "We loaded the garbaged script twice as we lost its content"
+ );
+});
+
+/**
+ * Test failures when trying to open the source text content.
+ *
+ * In this test we load an html page
+ * - with inline source (so that it shows up in the debugger)
+ * - it first loads fine so that it shows up
+ * - initDebuggerWithAbsoluteURL will first load the document before the debugger
+ * - so the debugger will have to fetch the html page content via a network request
+ * - the test page will return a connection reset error on the second load attempt
+ */
+let loadCount = 0;
+httpServer.registerPathHandler(
+ "/200-then-connection-reset.html",
+ (request, response) => {
+ loadCount++;
+ if (loadCount > 1) {
+ response.seizePower();
+ response.bodyOutPutStream.close();
+ response.finish();
+ return;
+ }
+ response.setStatusLine(request.httpVersion, 200, "OK");
+ response.write(`<!DOCTYPE html><script>console.log("200 page");</script>`);
+ }
+);
+add_task(async function testFailingHtmlSource() {
+ info("Test failure in retrieving html page sources");
+
+ // initDebuggerWithAbsoluteURL will first load the document once before the debugger,
+ // then the debugger will have to fetch the html page content via a network request
+ // therefore the test page will encounter a connection reset error on the second load attempt
+ const dbg = await initDebuggerWithAbsoluteURL(
+ BASE_URL + "200-then-connection-reset.html",
+ "200-then-connection-reset.html"
+ );
+
+ // We can't select the HTML page as its source content isn't fetched
+ // (waitForSelectedSource doesn't resolve)
+ // Note that it is important to load the page *before* opening the page
+ // so that the thread actor has to request the page content and will fail
+ const source = findSource(dbg, "200-then-connection-reset.html");
+ await dbg.actions.selectLocation(createLocation({ source }), {
+ keepContext: false,
+ });
+
+ ok(
+ getCM(dbg).getValue().includes("Could not load the source"),
+ "Display failure error"
+ );
+});
+
+/**
+ * In this test we try to reproduce the "Loading..." message.
+ * This may happen when opening an HTML source that was loaded *before*
+ * opening DevTools. The thread actor will have to issue a new HTTP request
+ * to load the source content.
+ */
+let loadCount2 = 0;
+let slowLoadingPageResolution = null;
+httpServer.registerPathHandler(
+ "/slow-loading-page.html",
+ (request, response) => {
+ loadCount2++;
+ if (loadCount2 > 1) {
+ response.processAsync();
+ slowLoadingPageResolution = function () {
+ response.write(
+ `<!DOCTYPE html><script>console.log("slow-loading-page:second-load");</script>`
+ );
+ response.finish();
+ };
+ return;
+ }
+ response.write(
+ `<!DOCTYPE html><script>console.log("slow-loading-page:first-load");</script>`
+ );
+ }
+);
+add_task(async function testLoadingHtmlSource() {
+ info("Test loading progress of html page sources");
+ const dbg = await initDebuggerWithAbsoluteURL(
+ BASE_URL + "slow-loading-page.html",
+ "slow-loading-page.html"
+ );
+
+ const onSelected = selectSource(dbg, "slow-loading-page.html");
+ await waitFor(
+ () => getCM(dbg).getValue() == DEBUGGER_L10N.getStr("loadingText"),
+ "Wait for the source to be displayed as loading"
+ );
+
+ info("Wait for a second HTTP request to be made for the html page");
+ await waitFor(
+ () => slowLoadingPageResolution,
+ "Wait for the html page to be queried a second time"
+ );
+ is(
+ getCM(dbg).getValue(),
+ DEBUGGER_L10N.getStr("loadingText"),
+ "The source is still loading until we release the network request"
+ );
+
+ slowLoadingPageResolution();
+ info("Wait for the source to be fully selected and loaded");
+ await onSelected;
+
+ // Note that, even if the thread actor triggers a new HTTP request,
+ // it will use the HTTP cache and retrieve the first request content.
+ // This is actually relevant as that's the source that actually runs in the page!
+ //
+ // XXX Bug 1758458 - the source content is wrong.
+ // We should be seeing the whole HTML page content,
+ // whereas we only see the inline source text content.
+ is(getCM(dbg).getValue(), `console.log("slow-loading-page:first-load");`);
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-features-source-tree.js b/devtools/client/debugger/test/mochitest/browser_dbg-features-source-tree.js
new file mode 100644
index 0000000000..f4fdd30898
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-features-source-tree.js
@@ -0,0 +1,554 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * This test focuses on the SourceTree component, where we display all debuggable sources.
+ *
+ * The first two tests expand the tree via manual DOM events (first with clicks and second with keys).
+ * `waitForSourcesInSourceTree()` is a key assertion method. Passing `{noExpand: true}`
+ * is important to avoid automatically expand the source tree.
+ *
+ * The following tests depend on auto-expand and only assert all the sources possibly displayed
+ */
+
+"use strict";
+
+const testServer = createVersionizedHttpTestServer(
+ "examples/sourcemaps-reload-uncompressed"
+);
+const TEST_URL = testServer.urlFor("index.html");
+
+/**
+ * This test opens the SourceTree manually via click events on the nested source,
+ * and then adds a source dynamically and asserts it is visible.
+ */
+add_task(async function testSimpleSourcesWithManualClickExpand() {
+ const dbg = await initDebugger(
+ "doc-sources.html",
+ "simple1.js",
+ "simple2.js",
+ "nested-source.js",
+ "long.js"
+ );
+
+ // Expand nodes and make sure more sources appear.
+ is(
+ getSourceTreeLabel(dbg, 1),
+ "Main Thread",
+ "Main thread is labeled properly"
+ );
+ info("Before interacting with the source tree, no source are displayed");
+ await waitForSourcesInSourceTree(dbg, [], { noExpand: true });
+ await clickElement(dbg, "sourceDirectoryLabel", 3);
+ info(
+ "After clicking on the directory, all sources but the nested ones are displayed"
+ );
+ await waitForSourcesInSourceTree(
+ dbg,
+ ["doc-sources.html", "simple1.js", "simple2.js", "long.js"],
+ { noExpand: true }
+ );
+
+ await clickElement(dbg, "sourceDirectoryLabel", 4);
+ info(
+ "After clicking on the nested directory, the nested source is also displayed"
+ );
+ await waitForSourcesInSourceTree(
+ dbg,
+ [
+ "doc-sources.html",
+ "simple1.js",
+ "simple2.js",
+ "long.js",
+ "nested-source.js",
+ ],
+ { noExpand: true }
+ );
+
+ const selected = waitForDispatch(dbg.store, "SET_SELECTED_LOCATION");
+ await clickElement(dbg, "sourceNode", 5);
+ await selected;
+ await waitForSelectedSource(dbg, "nested-source.js");
+
+ // Ensure the source file clicked is now focused
+ await waitForElementWithSelector(dbg, ".sources-list .focused");
+
+ const selectedSource = dbg.selectors.getSelectedSource().url;
+ ok(selectedSource.includes("nested-source.js"), "nested-source is selected");
+ await assertNodeIsFocused(dbg, 5);
+
+ // Make sure new sources appear in the list.
+ await SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () {
+ const script = content.document.createElement("script");
+ script.src = "math.min.js";
+ content.document.body.appendChild(script);
+ });
+
+ info("After adding math.min.js, we got a new source displayed");
+ await waitForSourcesInSourceTree(
+ dbg,
+ [
+ "doc-sources.html",
+ "simple1.js",
+ "simple2.js",
+ "long.js",
+ "nested-source.js",
+ "math.min.js",
+ ],
+ { noExpand: true }
+ );
+ is(
+ getSourceNodeLabel(dbg, 8),
+ "math.min.js",
+ "math.min.js - The dynamic script exists"
+ );
+
+ info("Assert that nested-source.js is still the selected source");
+ await assertNodeIsFocused(dbg, 5);
+
+ info("Test the copy to clipboard context menu");
+ const mathMinTreeNode = findSourceNodeWithText(dbg, "math.min.js");
+ await triggerSourceTreeContextMenu(
+ dbg,
+ mathMinTreeNode,
+ "#node-menu-copy-source"
+ );
+ const clipboardData = SpecialPowers.getClipboardData("text/plain");
+ is(
+ clipboardData,
+ EXAMPLE_URL + "math.min.js",
+ "The clipboard content is the selected source URL"
+ );
+
+ info("Test the download file context menu");
+ // Before trigerring the menu, mock the file picker
+ const MockFilePicker = SpecialPowers.MockFilePicker;
+ MockFilePicker.init(window);
+ const nsiFile = new FileUtils.File(
+ PathUtils.join(PathUtils.tempDir, `export_source_content_${Date.now()}.log`)
+ );
+ MockFilePicker.setFiles([nsiFile]);
+ const path = nsiFile.path;
+
+ await triggerSourceTreeContextMenu(
+ dbg,
+ mathMinTreeNode,
+ "#node-menu-download-file"
+ );
+
+ info("Wait for the downloaded file to be fully saved to disk");
+ await BrowserTestUtils.waitForCondition(() => IOUtils.exists(path));
+ await BrowserTestUtils.waitForCondition(async () => {
+ const { size } = await IOUtils.stat(path);
+ return size > 0;
+ });
+ const buffer = await IOUtils.read(path);
+ const savedFileContent = new TextDecoder().decode(buffer);
+
+ const mathMinRequest = await fetch(EXAMPLE_URL + "math.min.js");
+ const mathMinContent = await mathMinRequest.text();
+
+ is(
+ savedFileContent,
+ mathMinContent,
+ "The downloaded file has the expected content"
+ );
+
+ dbg.toolbox.closeToolbox();
+});
+
+/**
+ * Test keyboard arrow behaviour on the SourceTree with a nested folder
+ * that we manually expand/collapse via arrow keys.
+ */
+add_task(async function testSimpleSourcesWithManualKeyShortcutsExpand() {
+ const dbg = await initDebugger(
+ "doc-sources.html",
+ "simple1.js",
+ "simple2.js",
+ "nested-source.js",
+ "long.js"
+ );
+
+ // Before clicking on the source label, no source is displayed
+ await waitForSourcesInSourceTree(dbg, [], { noExpand: true });
+ await clickElement(dbg, "sourceDirectoryLabel", 3);
+ // Right after, all sources, but the nested one are displayed
+ await waitForSourcesInSourceTree(
+ dbg,
+ ["doc-sources.html", "simple1.js", "simple2.js", "long.js"],
+ { noExpand: true }
+ );
+
+ // Right key on open dir
+ await pressKey(dbg, "Right");
+ await assertNodeIsFocused(dbg, 3);
+
+ // Right key on closed dir
+ await pressKey(dbg, "Right");
+ await assertNodeIsFocused(dbg, 4);
+
+ // Left key on a open dir
+ await pressKey(dbg, "Left");
+ await assertNodeIsFocused(dbg, 4);
+
+ // Down key on a closed dir
+ await pressKey(dbg, "Down");
+ await assertNodeIsFocused(dbg, 4);
+
+ // Right key on a source
+ // We are focused on the nested source and up to this point we still display only the 4 initial sources
+ await waitForSourcesInSourceTree(
+ dbg,
+ ["doc-sources.html", "simple1.js", "simple2.js", "long.js"],
+ { noExpand: true }
+ );
+ await pressKey(dbg, "Right");
+ await assertNodeIsFocused(dbg, 4);
+ // Now, the nested source is also displayed
+ await waitForSourcesInSourceTree(
+ dbg,
+ [
+ "doc-sources.html",
+ "simple1.js",
+ "simple2.js",
+ "long.js",
+ "nested-source.js",
+ ],
+ { noExpand: true }
+ );
+
+ // Down key on a source
+ await pressKey(dbg, "Down");
+ await assertNodeIsFocused(dbg, 5);
+
+ // Go to bottom of tree and press down key
+ await pressKey(dbg, "Down");
+ await pressKey(dbg, "Down");
+ await assertNodeIsFocused(dbg, 6);
+
+ // Up key on a source
+ await pressKey(dbg, "Up");
+ await assertNodeIsFocused(dbg, 5);
+
+ // Left key on a source
+ await pressKey(dbg, "Left");
+ await assertNodeIsFocused(dbg, 4);
+
+ // Left key on a closed dir
+ // We are about to close the nested folder, the nested source is about to disappear
+ await waitForSourcesInSourceTree(
+ dbg,
+ [
+ "doc-sources.html",
+ "simple1.js",
+ "simple2.js",
+ "long.js",
+ "nested-source.js",
+ ],
+ { noExpand: true }
+ );
+ await pressKey(dbg, "Left");
+ // And it disappeared
+ await waitForSourcesInSourceTree(
+ dbg,
+ ["doc-sources.html", "simple1.js", "simple2.js", "long.js"],
+ { noExpand: true }
+ );
+ await pressKey(dbg, "Left");
+ await assertNodeIsFocused(dbg, 3);
+
+ // Up Key at the top of the source tree
+ await pressKey(dbg, "Up");
+ await assertNodeIsFocused(dbg, 2);
+ dbg.toolbox.closeToolbox();
+});
+
+/**
+ * Tests that the source tree works with all the various types of sources
+ * coming from the integration test page.
+ *
+ * Also assert a few extra things on sources with query strings:
+ * - they can be pretty printed,
+ * - quick open matches them,
+ * - you can set breakpoint on them.
+ */
+add_task(async function testSourceTreeOnTheIntegrationTestPage() {
+ // We open against a blank page and only then navigate to the test page
+ // so that sources aren't GC-ed before opening the debugger.
+ // When we (re)load a page while the debugger is opened, the debugger
+ // will force all sources to be held in memory.
+ const dbg = await initDebuggerWithAbsoluteURL("about:blank");
+
+ await navigateToAbsoluteURL(
+ dbg,
+ TEST_URL,
+ "index.html",
+ "script.js",
+ "test-functions.js",
+ "query.js?x=1",
+ "query.js?x=2",
+ "query2.js?y=3",
+ "bundle.js",
+ "original.js",
+ "replaced-bundle.js",
+ "removed-original.js",
+ "named-eval.js"
+ );
+
+ info("Verify source tree content");
+ await waitForSourcesInSourceTree(dbg, INTEGRATION_TEST_PAGE_SOURCES);
+
+ info("Verify Thread Source Items");
+ const mainThreadItem = findSourceTreeThreadByName(dbg, "Main Thread");
+ ok(mainThreadItem, "Found the thread item for the main thread");
+ ok(
+ mainThreadItem.querySelector("span.img.window"),
+ "The thread has the window icon"
+ );
+
+ info(
+ "Assert the number of sources and source actors for the same-url.sjs sources"
+ );
+ const sameUrlSource = findSource(dbg, "same-url.sjs");
+ ok(sameUrlSource, "Found same-url.js in the main thread");
+
+ const sourceActors = dbg.selectors.getSourceActorsForSource(sameUrlSource.id);
+
+ const mainThread = dbg.selectors
+ .getAllThreads()
+ .find(thread => thread.name == "Main Thread");
+
+ is(
+ sourceActors.filter(actor => actor.thread == mainThread.actor).length,
+ // When EFT is disabled the iframe's source is meld into the main target
+ isEveryFrameTargetEnabled() ? 3 : 4,
+ "same-url.js is loaded 3 times in the main thread"
+ );
+
+ if (isEveryFrameTargetEnabled()) {
+ const iframeThread = dbg.selectors
+ .getAllThreads()
+ .find(thread => thread.name == testServer.urlFor("iframe.html"));
+
+ is(
+ sourceActors.filter(actor => actor.thread == iframeThread.actor).length,
+ 1,
+ "same-url.js is loaded one time in the iframe thread"
+ );
+ }
+
+ const workerThread = dbg.selectors
+ .getAllThreads()
+ .find(thread => thread.name == testServer.urlFor("same-url.sjs"));
+
+ is(
+ sourceActors.filter(actor => actor.thread == workerThread.actor).length,
+ 1,
+ "same-url.js is loaded one time in the worker thread"
+ );
+
+ const workerThreadItem = findSourceTreeThreadByName(dbg, "same-url.sjs");
+ ok(workerThreadItem, "Found the thread item for the worker");
+ ok(
+ workerThreadItem.querySelector("span.img.worker"),
+ "The thread has the worker icon"
+ );
+
+ info("Verify source icons");
+ assertSourceIcon(dbg, "index.html", "file");
+ assertSourceIcon(dbg, "script.js", "javascript");
+ assertSourceIcon(dbg, "query.js?x=1", "javascript");
+ assertSourceIcon(dbg, "original.js", "javascript");
+ // Framework icons are only displayed when we parse the source,
+ // which happens when we select the source
+ assertSourceIcon(dbg, "react-component-module.js", "javascript");
+ await selectSource(dbg, "react-component-module.js");
+ assertSourceIcon(dbg, "react-component-module.js", "react");
+
+ info("Verify blackbox source icon");
+ await selectSource(dbg, "script.js");
+ await clickElement(dbg, "blackbox");
+ await waitForDispatch(dbg.store, "BLACKBOX_WHOLE_SOURCES");
+ assertSourceIcon(dbg, "script.js", "blackBox");
+ await clickElement(dbg, "blackbox");
+ await waitForDispatch(dbg.store, "UNBLACKBOX_WHOLE_SOURCES");
+ assertSourceIcon(dbg, "script.js", "javascript");
+
+ info("Assert the content of the named eval");
+ await selectSource(dbg, "named-eval.js");
+ assertTextContentOnLine(dbg, 3, `console.log("named-eval");`);
+
+ info("Assert that nameless eval don't show up in the source tree");
+ invokeInTab("breakInEval");
+ await waitForPaused(dbg);
+ await waitForSourcesInSourceTree(dbg, INTEGRATION_TEST_PAGE_SOURCES);
+ await resume(dbg);
+
+ info("Assert the content of sources with query string");
+ await selectSource(dbg, "query.js?x=1");
+ const tab = findElement(dbg, "activeTab");
+ is(tab.innerText, "query.js?x=1", "Tab label is query.js?x=1");
+ assertTextContentOnLine(
+ dbg,
+ 1,
+ `function query() {console.log("query x=1");}`
+ );
+ await addBreakpoint(dbg, "query.js?x=1", 1);
+ assertBreakpointHeading(dbg, "query.js?x=1", 0);
+
+ // pretty print the source and check the tab text
+ clickElement(dbg, "prettyPrintButton");
+ await waitForSource(dbg, "query.js?x=1:formatted");
+ await waitForSelectedSource(dbg, "query.js?x=1:formatted");
+ assertSourceIcon(dbg, "query.js?x=1", "prettyPrint");
+
+ const prettyTab = findElement(dbg, "activeTab");
+ is(prettyTab.innerText, "query.js?x=1", "Tab label is query.js?x=1");
+ ok(prettyTab.querySelector(".img.prettyPrint"));
+ assertBreakpointHeading(dbg, "query.js?x=1", 0);
+ assertTextContentOnLine(dbg, 1, `function query() {`);
+ // Note the replacements of " by ' here:
+ assertTextContentOnLine(dbg, 2, `console.log('query x=1');`);
+
+ // assert quick open works with queries
+ pressKey(dbg, "quickOpen");
+ type(dbg, "query.js?x");
+
+ // There can be intermediate updates in the results,
+ // so wait for the final expected value
+ await waitFor(async () => {
+ const resultItem = findElement(dbg, "resultItems");
+ if (!resultItem) {
+ return false;
+ }
+ return resultItem.innerText.includes("query.js?x=1");
+ }, "Results include the source with the query string");
+ dbg.toolbox.closeToolbox();
+});
+
+/**
+ * Verify that Web Extension content scripts appear only when
+ * devtools.chrome.enabled is set to true and that they get
+ * automatically re-selected on page reload.
+ */
+add_task(async function testSourceTreeWithWebExtensionContentScript() {
+ const extension = await installAndStartContentScriptExtension();
+
+ info("Without the chrome preference, the content script doesn't show up");
+ await pushPref("devtools.chrome.enabled", false);
+ let dbg = await initDebugger("doc-content-script-sources.html");
+ // Let some time for unexpected source to appear
+ await wait(1000);
+ await waitForSourcesInSourceTree(dbg, []);
+ await dbg.toolbox.closeToolbox();
+
+ info("With the chrome preference, the content script shows up");
+ await pushPref("devtools.chrome.enabled", true);
+ const toolbox = await openToolboxForTab(gBrowser.selectedTab, "jsdebugger");
+ dbg = createDebuggerContext(toolbox);
+ await waitForSourcesInSourceTree(dbg, ["content_script.js"]);
+ await selectSource(dbg, "content_script.js");
+ ok(
+ findElementWithSelector(dbg, ".sources-list .focused"),
+ "Source is focused"
+ );
+
+ const contentScriptGroupItem = findSourceNodeWithText(
+ dbg,
+ "Test content script extension"
+ );
+ ok(contentScriptGroupItem, "Found the group item for the content script");
+ ok(
+ contentScriptGroupItem.querySelector("span.img.extension"),
+ "The group has the extension icon"
+ );
+ assertSourceIcon(dbg, "content_script.js", "javascript");
+
+ for (let i = 1; i < 3; i++) {
+ info(
+ `Reloading tab (${i} time), the content script should always be reselected`
+ );
+ gBrowser.reloadTab(gBrowser.selectedTab);
+ await waitForSelectedSource(dbg, "content_script.js");
+ ok(
+ findElementWithSelector(dbg, ".sources-list .focused"),
+ "Source is focused"
+ );
+ }
+ await dbg.toolbox.closeToolbox();
+
+ await extension.unload();
+});
+
+add_task(async function testSourceTreeWithEncodedPaths() {
+ const httpServer = createTestHTTPServer();
+ httpServer.registerContentType("html", "text/html");
+ httpServer.registerContentType("js", "application/javascript");
+
+ httpServer.registerPathHandler("/index.html", function (request, response) {
+ response.setStatusLine(request.httpVersion, 200, "OK");
+ response.write(`<!DOCTYPE html>
+ <html>
+ <head>
+ <script src="/my folder/my file.js"></script>
+ <script src="/malformedUri.js?%"></script>
+ </head>
+ <body>
+ <h1>Encoded scripts paths</h1>
+ </body>
+ `);
+ });
+ httpServer.registerPathHandler(
+ encodeURI("/my folder/my file.js"),
+ function (request, response) {
+ response.setStatusLine(request.httpVersion, 200, "OK");
+ response.setHeader("Content-Type", "application/javascript", false);
+ response.write(`const x = 42`);
+ }
+ );
+ httpServer.registerPathHandler(
+ "/malformedUri.js",
+ function (request, response) {
+ response.setStatusLine(request.httpVersion, 200, "OK");
+ response.setHeader("Content-Type", "application/javascript", false);
+ response.write(`const y = "malformed"`);
+ }
+ );
+ const port = httpServer.identity.primaryPort;
+
+ const dbg = await initDebuggerWithAbsoluteURL(
+ `http://localhost:${port}/index.html`,
+ "my file.js"
+ );
+
+ await waitForSourcesInSourceTree(dbg, ["my file.js", "malformedUri.js?%"]);
+ ok(
+ true,
+ "source name are decoded in the tree, and malformed uri source are displayed"
+ );
+ is(
+ // We don't have any specific class on the folder item, so let's target the folder
+ // icon next sibling, which is the directory label.
+ findElementWithSelector(dbg, ".sources-panel .node .folder + .label")
+ .innerText,
+ "my folder",
+ "folder name is decoded in the tree"
+ );
+});
+
+/**
+ * Assert the location displayed in the breakpoint list, in the right sidebar.
+ *
+ * @param {Object} dbg
+ * @param {String} label
+ * The expected displayed location
+ * @param {Number} index
+ * The position of the breakpoint in the list to verify
+ */
+function assertBreakpointHeading(dbg, label, index) {
+ const breakpointHeading = findAllElements(dbg, "breakpointHeadings")[index]
+ .innerText;
+ is(breakpointHeading, label, `Breakpoint heading is ${label}`);
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-features-tabs.js b/devtools/client/debugger/test/mochitest/browser_dbg-features-tabs.js
new file mode 100644
index 0000000000..5f6e3d1741
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-features-tabs.js
@@ -0,0 +1,92 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * This test focuses on the Tabs component, where we display all opened sources.
+ */
+
+"use strict";
+
+const testServer = createVersionizedHttpTestServer(
+ "examples/sourcemaps-reload-uncompressed"
+);
+const TEST_URL = testServer.urlFor("index.html");
+
+add_task(async function () {
+ // We open against a blank page and only then navigate to the test page
+ // so that sources aren't GC-ed before opening the debugger.
+ // When we (re)load a page while the debugger is opened, the debugger
+ // will force all sources to be held in memory.
+ const dbg = await initDebuggerWithAbsoluteURL("about:blank");
+
+ await navigateToAbsoluteURL(dbg, TEST_URL, ...INTEGRATION_TEST_PAGE_SOURCES);
+
+ info("Wait for all sources to be displayed in the source tree");
+ let displayedSources;
+ await waitFor(() => {
+ displayedSources = dbg.selectors.getDisplayedSourcesList();
+ return displayedSources.length == INTEGRATION_TEST_PAGE_SOURCES.length;
+ }, "Got the expected number of sources from the selectors");
+
+ // Open each visible source in tabs
+ const uniqueUrls = new Set();
+ for (const source of displayedSources) {
+ info(`Opening '${source.url}'`);
+ await selectSource(dbg, source);
+ uniqueUrls.add(source.url);
+ }
+
+ // Some sources are loaded from the same URL and only one tab will be opened for them
+ is(countTabs(dbg), uniqueUrls.size, "Got a tab for each distinct source URL");
+
+ invokeInTab("breakInEval");
+ await waitFor(
+ () => countTabs(dbg) == uniqueUrls.size + 1,
+ "Wait for the tab for the new evaled source"
+ );
+ await resume(dbg);
+
+ invokeInTab("breakInEval");
+ await waitFor(
+ () => countTabs(dbg) == uniqueUrls.size + 2,
+ "Wait for yet another tab for the second evaled source"
+ );
+ await resume(dbg);
+
+ await reload(dbg, ...INTEGRATION_TEST_PAGE_SOURCES);
+
+ await waitFor(
+ () => countTabs(dbg) == uniqueUrls.size,
+ "Wait for tab count to be fully restored"
+ );
+
+ is(
+ countTabs(dbg),
+ uniqueUrls.size,
+ "Still get the same number of tabs after reload"
+ );
+
+ await selectSource(dbg, "query.js?x=1");
+ // Ensure focusing the window, otherwise copyToTheClipboard doesn't emit "copy" event.
+ dbg.panel.panelWin.focus();
+
+ info("Open the current active tab context menu");
+ const waitForOpen = waitForContextMenu(dbg);
+ rightClickElement(dbg, "activeTab");
+ await waitForOpen;
+ info("Trigger copy to source context menu");
+ await waitForClipboardPromise(
+ () => selectContextMenuItem(dbg, `#node-menu-copy-source`),
+ `function query() {console.log("query x=1");}\n`
+ );
+
+ // Update displayed sources, so that we pass the right source objects to closeTab
+ displayedSources = dbg.selectors.getDisplayedSourcesList();
+ for (const source of displayedSources) {
+ info(`Closing '${source.url}'`);
+ await closeTab(dbg, source);
+ }
+
+ is(countTabs(dbg), 0, "All tabs are closed");
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-features-wasm.js b/devtools/client/debugger/test/mochitest/browser_dbg-features-wasm.js
new file mode 100644
index 0000000000..157204a596
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-features-wasm.js
@@ -0,0 +1,164 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * This test covers all specifics of debugging WASM/WebAssembly files.
+ *
+ * WebAssembly is a binary file format for the Web.
+ * The binary files are loaded by Gecko and machine code runs.
+ * In order to debug them ThreadConfiguration's `observeWasm` is set to true,
+ * only once the debugger is opened. This will set DebuggerAPI's `allowUnobservedWasm` to false.
+ * Then, the engine will compute a different machine code with debugging instruction.
+ * This will use a lot more memory, but allow debugger to set breakpoint and break on WASM sources.
+ *
+ * This behavior introduces some limitations when opening the debugger against
+ * and already loaded page. The WASM file won't be debuggable.
+ */
+
+"use strict";
+
+add_task(async function () {
+ // Load the test page before opening the debugger so that WASM are built
+ // without debugging instructions. Opening the console still doesn't enable debugging instructions.
+ const tab = await addTab(EXAMPLE_URL + "doc-wasm-sourcemaps.html");
+ const toolbox = await openToolboxForTab(tab, "webconsole");
+
+ // Reload once again, while the console is opened.
+ // When opening the debugger, it will still miss the source content.
+ // To see the sources, we have to reload while the debugger has been opened.
+ await reloadBrowser();
+
+ await toolbox.selectTool("jsdebugger");
+ const dbg = createDebuggerContext(toolbox);
+
+ // When opening against an already loaded page, WASM source loading doesn't work
+ // And because of that we don't see sourcemap/original files.
+ await waitForSourcesInSourceTree(dbg, [
+ "doc-wasm-sourcemaps.html",
+ "fib.wasm",
+ ]);
+ is(dbg.selectors.getSourceCount(), 2, "There are only these two sources");
+
+ const source = findSource(dbg, "fib.wasm");
+ is(source.isWasm, true, "The original source is flagged as Wasm source");
+
+ // Note that there is no point in asserting breakable lines,
+ // as we aren't fetching any source.
+ await dbg.actions.selectLocation(createLocation({ source }), {
+ keepContext: false,
+ });
+ is(getCM(dbg).getValue(), `Please refresh to debug this module`);
+
+ info("Reload and assert that WASM files are then debuggable");
+ await reload(dbg, "doc-wasm-sourcemaps.html", "fib.wasm", "fib.c");
+
+ info("After reloading, original file lines are breakable");
+ // Ensure selecting the source before asserting breakable lines
+ // otherwise the gutter may not be yet updated
+ await selectSource(dbg, "fib.c");
+ assertLineIsBreakable(dbg, source.url, 14, true);
+
+ await waitForSourcesInSourceTree(dbg, [
+ "doc-wasm-sourcemaps.html",
+ "fib.wasm",
+ "fib.c",
+ ]);
+ is(dbg.selectors.getSourceCount(), 3, "There is all these 3 sources");
+ // (even if errno_location.c is still not functional)
+
+ // The line in the original C file, where the for() loop starts
+ const breakpointLine = 12;
+ assertTextContentOnLine(dbg, breakpointLine, "for (i = 0; i < n; i++) {");
+
+ info("Register and trigger a breakpoint from the original source in C");
+ await addBreakpoint(dbg, "fib.c", breakpointLine);
+ invokeInTab("runWasm");
+
+ await waitForPausedInOriginalFileAndToggleMapScopes(dbg);
+
+ assertPausedAtSourceAndLine(dbg, findSource(dbg, "fib.c").id, breakpointLine);
+ await assertBreakpoint(dbg, breakpointLine);
+ // Capture the generated location line, so that we can better report
+ // when the binary code changed later in this test
+ const frames = dbg.selectors.getCurrentThreadFrames();
+ const generatedLine = frames[0].generatedLocation.line;
+
+ assertFirstFrameTitleAndLocation(dbg, "(wasmcall)", "fib.c");
+
+ await removeBreakpoint(dbg, findSource(dbg, "fib.c").id, breakpointLine);
+ await resume(dbg);
+
+ info(
+ "Now register and trigger the same breakpoint from the binary source file"
+ );
+ const binarySource = findSource(dbg, "fib.wasm");
+
+ // There is two lines, the hexadecimal one is the "virtual line" displayed in the gutter.
+ // While the decimal one is the line where the line appear in CodeMirror.
+ // So while we set the breakpoint on the decimal line in CodeMirror gutter,
+ // internaly, the engine sets the breakpoint on the "virtual line".
+ const virtualBinaryLine = 0x11a;
+ is(
+ "0x" + virtualBinaryLine.toString(16),
+ "0x" + generatedLine.toString(16),
+ "The hardcoded binary line matches the mapped location when we set the breakpoint on the original line. If you rebuilt the binary, you may just need to update the virtualBinaryLine variable to the new location."
+ );
+ const binaryLine =
+ dbg.wasmOffsetToLine(binarySource.id, virtualBinaryLine) + 1;
+
+ // We can't use selectSource here because binary source won't have symbols loaded
+ // (getSymbols(source) selector will be false)
+ await dbg.actions.selectLocation(createLocation({ source: binarySource }), {
+ keepContext: false,
+ });
+
+ assertLineIsBreakable(dbg, binarySource.url, binaryLine, true);
+
+ await addBreakpoint(dbg, binarySource, virtualBinaryLine);
+ invokeInTab("runWasm");
+
+ // We can't use waitForPaused test helper as the text content isn't displayed correctly
+ // so only assert that we are in paused state.
+ await waitForPaused(dbg);
+ // We don't try to assert paused line as there is two types of line in wasm
+ assertPausedAtSourceAndLine(dbg, binarySource.id, virtualBinaryLine);
+
+ // Switch to original source
+ info(
+ "Manually switch to original C source as we set the breakpoint on binary source, we paused on it"
+ );
+ await dbg.actions.jumpToMappedSelectedLocation();
+
+ // But once we switch to original source, we should have the original text content and be able
+ // to do all classic assertions for paused state.
+ await waitForPausedInOriginalFileAndToggleMapScopes(dbg);
+
+ assertPausedAtSourceAndLine(dbg, findSource(dbg, "fib.c").id, breakpointLine);
+
+ info("Reselect the binary source");
+ await dbg.actions.selectLocation(createLocation({ source: binarySource }), {
+ keepContext: false,
+ });
+
+ assertFirstFrameTitleAndLocation(dbg, "(wasmcall)", "fib.wasm");
+
+ // We can't use this method as it uses internaly the breakpoint line, which isn't the line in CodeMirror
+ // assertPausedAtSourceAndLine(dbg, binarySource.id, binaryLine);
+ await assertBreakpoint(dbg, binaryLine);
+
+ await removeBreakpoint(dbg, binarySource.id, virtualBinaryLine);
+ await resume(dbg);
+});
+
+function assertFirstFrameTitleAndLocation(dbg, title, location) {
+ const frames = findAllElements(dbg, "frames");
+ const firstFrameTitle = frames[0].querySelector(".title").textContent;
+ is(firstFrameTitle, title, "First frame title is the expected one");
+ const firstFrameLocation = frames[0].querySelector(".location").textContent;
+ is(
+ firstFrameLocation.includes(location),
+ true,
+ `First frame location '${firstFrameLocation}' includes '${location}'`
+ );
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-fission-frame-breakpoint.js b/devtools/client/debugger/test/mochitest/browser_dbg-fission-frame-breakpoint.js
new file mode 100644
index 0000000000..fa447fa832
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-fission-frame-breakpoint.js
@@ -0,0 +1,101 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+const TEST_COM_URI = `${URL_ROOT_COM_SSL}examples/doc_dbg-fission-frame-sources.html`;
+
+add_task(async function () {
+ // Load a test page with a remote frame:
+ // simple1.js is imported by the main page. simple2.js comes from the remote frame.
+ const dbg = await initDebuggerWithAbsoluteURL(
+ TEST_COM_URI,
+ "simple1.js",
+ "simple2.js"
+ );
+ const {
+ selectors: { getSelectedSource },
+ } = dbg;
+
+ // Check threads
+ await waitForElement(dbg, "threadsPaneItems");
+ let threadsEl = findAllElements(dbg, "threadsPaneItems");
+ is(threadsEl.length, 2, "There are two threads in the thread panel");
+ ok(
+ Array.from(threadsEl).every(
+ el => !isThreadElementPaused(el) && !getThreadElementPausedBadge(el)
+ ),
+ "No threads are paused"
+ );
+
+ // Add breakpoint within the iframe, which is hit early on load
+ await selectSource(dbg, "simple2.js");
+ await addBreakpoint(dbg, "simple2.js", 7);
+
+ const onBreakpoint = waitForDispatch(dbg.store, "SET_BREAKPOINT");
+ info("Reload the page to hit the breakpoint on load");
+ const onReloaded = reload(dbg);
+ await onBreakpoint;
+ await waitForSelectedSource(dbg, "simple2.js");
+
+ ok(
+ getSelectedSource().url.includes("simple2.js"),
+ "Selected source is simple2.js"
+ );
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, findSource(dbg, "simple2.js").id, 7);
+
+ await waitForElement(dbg, "threadsPaneItems");
+ threadsEl = findAllElements(dbg, "threadsPaneItems");
+ is(threadsEl.length, 2, "There are two threads in the thread panel");
+ const [mainThreadEl, remoteThreadEl] = threadsEl;
+ is(
+ mainThreadEl.textContent,
+ "Main Thread",
+ "first thread displayed is the main thread"
+ );
+ ok(
+ !isThreadElementPaused(mainThreadEl),
+ "Main Thread does not have the paused styling"
+ );
+ ok(
+ !getThreadElementPausedBadge(mainThreadEl),
+ "Main Thread does not have a paused badge"
+ );
+
+ ok(
+ remoteThreadEl.textContent.startsWith(URL_ROOT_ORG_SSL),
+ "second thread displayed is the remote thread"
+ );
+ ok(
+ isThreadElementPaused(remoteThreadEl),
+ "paused thread has the paused styling"
+ );
+ is(
+ getThreadElementPausedBadge(remoteThreadEl).textContent,
+ "paused",
+ "paused badge is displayed in the remote thread item"
+ );
+
+ await stepIn(dbg);
+ assertPausedAtSourceAndLine(dbg, findSource(dbg, "simple2.js").id, 7);
+
+ // We can't used `stepIn` helper as this last step will resume
+ // and the helper is expecting to pause again
+ await dbg.actions.stepIn();
+ assertNotPaused(dbg, "Stepping in two times resumes");
+
+ info("Wait for reload to complete after resume");
+ await onReloaded;
+
+ await dbg.toolbox.closeToolbox();
+});
+
+function isThreadElementPaused(el) {
+ return el.classList.contains("paused");
+}
+
+function getThreadElementPausedBadge(el) {
+ return el.querySelector(".pause-badge");
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-fission-frame-pause-exceptions.js b/devtools/client/debugger/test/mochitest/browser_dbg-fission-frame-pause-exceptions.js
new file mode 100644
index 0000000000..8a76831e8c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-fission-frame-pause-exceptions.js
@@ -0,0 +1,54 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+const TEST_COM_URI = `${URL_ROOT_COM_SSL}examples/doc_dbg-fission-pause-exceptions.html`;
+// Tests Pause on exceptions in remote iframes
+
+add_task(async function () {
+ // Load a test page with a remote iframe
+ const dbg = await initDebuggerWithAbsoluteURL(TEST_COM_URI);
+
+ info("Test pause on exceptions ignoring caught exceptions");
+ await togglePauseOnExceptions(dbg, true, false);
+
+ let onReloaded = reload(dbg);
+ await waitForPaused(dbg);
+
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "doc_dbg-fission-frame-pause-exceptions.html").id,
+ 17
+ );
+
+ await resume(dbg);
+ info("Wait for reload to complete after resume");
+ await onReloaded;
+
+ info("Test pause on exceptions including caught exceptions");
+ await togglePauseOnExceptions(dbg, true, true);
+
+ onReloaded = reload(dbg);
+ await waitForPaused(dbg);
+
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "doc_dbg-fission-frame-pause-exceptions.html").id,
+ 13
+ );
+
+ await resume(dbg);
+ await waitForPaused(dbg);
+
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "doc_dbg-fission-frame-pause-exceptions.html").id,
+ 17
+ );
+
+ await resume(dbg);
+ info("Wait for reload to complete after resume");
+ await onReloaded;
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-fission-frame-sources.js b/devtools/client/debugger/test/mochitest/browser_dbg-fission-frame-sources.js
new file mode 100644
index 0000000000..b40058a7dd
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-fission-frame-sources.js
@@ -0,0 +1,47 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+const TEST_COM_URI = `${URL_ROOT_COM_SSL}examples/doc_dbg-fission-frame-sources.html`;
+
+add_task(async function () {
+ // Simply load a test page with a remote frame and wait for both sources to
+ // be visible.
+ // simple1.js is imported by the main page. simple2.js comes from the frame.
+ const dbg = await initDebuggerWithAbsoluteURL(
+ TEST_COM_URI,
+ "simple1.js",
+ "simple2.js"
+ );
+
+ const rootNodes = dbg.win.document.querySelectorAll(
+ selectors.sourceTreeRootNode
+ );
+
+ info("Expands the main root node");
+ await expandAllSourceNodes(dbg, rootNodes[0]);
+
+ // We need to assert the actual DOM nodes in the source tree, because the
+ // state can contain simple1.js and simple2.js, but only show one of them.
+ info("Waiting for simple1.js from example.com (parent page)");
+ await waitUntil(() => findSourceNodeWithText(dbg, "simple1.js"));
+
+ // If fission or EFT is enabled, the second source is under another root node.
+ if (isFissionEnabled() || isEveryFrameTargetEnabled()) {
+ is(
+ rootNodes.length,
+ 2,
+ "Found 2 sourceview root nodes when iframe has dedicated target"
+ );
+
+ info("Expands the remote frame root node");
+ await expandAllSourceNodes(dbg, rootNodes[1]);
+ }
+
+ info("Waiting for simple2.js from example.org (frame)");
+ await waitUntil(() => findSourceNodeWithText(dbg, "simple2.js"));
+
+ await dbg.toolbox.closeToolbox();
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-fission-project-search.js b/devtools/client/debugger/test/mochitest/browser_dbg-fission-project-search.js
new file mode 100644
index 0000000000..1924e4b9bf
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-fission-project-search.js
@@ -0,0 +1,52 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+const TEST_COM_URI = `${URL_ROOT_COM_SSL}examples/doc_dbg-fission-frame-sources.html`;
+
+// Testing project search for remote frames.
+add_task(async function () {
+ // Load page and wait for sources. simple.js is loaded from
+ // the top-level document in the dot com domain, while simple2.js
+ // is loaded from the remote frame in the dot org domain
+ const dbg = await initDebuggerWithAbsoluteURL(
+ TEST_COM_URI,
+ "simple1.js",
+ "simple2.js"
+ );
+
+ pressKey(dbg, "projectSearch");
+ type(dbg, "foo");
+ pressKey(dbg, "Enter");
+
+ await waitForSearchResults(dbg, 2);
+
+ const fileResults = findAllElements(dbg, "projectSearchFileResults");
+ const matches = findAllElements(dbg, "projectSearchExpandedResults");
+
+ is(fileResults.length, 2, "Two results found");
+ is(matches.length, 6, "Total no of matches found");
+
+ // Asserts that we find a matches in the js file included in the top-level document
+ assertFileResult("simple1.js", 5);
+ // Asserts that we find the match in the js file included
+ assertFileResult("simple2.js", 1);
+
+ function assertFileResult(fileMatched, noOfMatches) {
+ // The results can be out of order so let find it from the collection
+ const match = [...fileResults].find(result =>
+ result.querySelector(".file-path").innerText.includes(fileMatched)
+ );
+
+ ok(match, `Matches were found in ${fileMatched} file.`);
+
+ const matchText = noOfMatches > 1 ? "matches" : "match";
+ is(
+ match.querySelector(".matches-summary").innerText.trim(),
+ `(${noOfMatches} ${matchText})`,
+ `${noOfMatches} ${matchText} were found in ${fileMatched} file.`
+ );
+ }
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-fission-switch-target.js b/devtools/client/debugger/test/mochitest/browser_dbg-fission-switch-target.js
new file mode 100644
index 0000000000..6500942d0a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-fission-switch-target.js
@@ -0,0 +1,32 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test switching for the top-level target.
+
+"use strict";
+
+const PARENT_PROCESS_URI = "about:robots";
+
+add_task(async function () {
+ // Start the debugger on a parent process URL
+ const dbg = await initDebuggerWithAbsoluteURL(
+ PARENT_PROCESS_URI,
+ "aboutRobots.js"
+ );
+
+ // Navigate to a content process URL and check that the sources tree updates
+ await navigate(dbg, "doc-scripts.html", "simple1.js");
+ info("Wait for all sources to be in the store");
+ await waitFor(() => dbg.selectors.getSourceCount() == 5);
+ is(dbg.selectors.getSourceCount(), 5, "5 sources are loaded.");
+
+ // Check that you can still break after target switching.
+ await selectSource(dbg, "simple1.js");
+ await addBreakpoint(dbg, "simple1.js", 4);
+ invokeInTab("main");
+ await waitForPaused(dbg);
+ await waitForLoadedSource(dbg, "simple1.js");
+
+ await dbg.toolbox.closeToolbox();
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-gc-breakpoint-positions.js b/devtools/client/debugger/test/mochitest/browser_dbg-gc-breakpoint-positions.js
new file mode 100644
index 0000000000..7c46e7cacc
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-gc-breakpoint-positions.js
@@ -0,0 +1,17 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test that we can set breakpoints in scripts that have been GCed.
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger(
+ "doc-gc-breakpoint-positions.html",
+ "doc-gc-breakpoint-positions.html"
+ );
+ await selectSource(dbg, "doc-gc-breakpoint-positions.html");
+ await addBreakpoint(dbg, "doc-gc-breakpoint-positions.html", 21);
+ ok(true, "Added breakpoint at GC'ed script location");
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-gc-sources.js b/devtools/client/debugger/test/mochitest/browser_dbg-gc-sources.js
new file mode 100644
index 0000000000..e4a6da536a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-gc-sources.js
@@ -0,0 +1,29 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test that we can set breakpoints in scripts that have been GCed.
+// Check that breakpoints can be set in GC'ed inline scripts, and in
+// generated and original sources of scripts with source maps specified either
+// inline or in their HTTP response headers.
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger(
+ "doc-gc-sources.html",
+ "doc-gc-sources.html",
+ "collected-bundle.js",
+ "collected.js",
+ "collected2.js"
+ );
+ await selectSource(dbg, "doc-gc-sources.html");
+ await addBreakpoint(dbg, "doc-gc-sources.html", 21);
+ await selectSource(dbg, "collected-bundle.js");
+ await addBreakpoint(dbg, "collected-bundle.js", 31);
+ await selectSource(dbg, "collected.js");
+ await addBreakpoint(dbg, "collected.js", 2);
+ await selectSource(dbg, "collected2.js");
+ await addBreakpoint(dbg, "collected2.js", 2);
+ ok(true, "Added breakpoint in GC'ed sources");
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-go-to-line.js b/devtools/client/debugger/test/mochitest/browser_dbg-go-to-line.js
new file mode 100644
index 0000000000..d151d03a51
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-go-to-line.js
@@ -0,0 +1,64 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test the "go to line" feature correctly responses to keyboard shortcuts.
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-scripts.html", "long.js");
+ await selectSource(dbg, "long.js");
+ await waitForSelectedSource(dbg, "long.js");
+
+ info("Test opening");
+ pressKey(dbg, "goToLine");
+ assertEnabled(dbg);
+ is(
+ dbg.win.document.activeElement.tagName,
+ "INPUT",
+ "The input area of 'go to line' box is focused"
+ );
+
+ info("Test closing by the same keyboard shortcut");
+ pressKey(dbg, "goToLine");
+ assertDisabled(dbg);
+ is(findElement(dbg, "searchField"), null, "The 'go to line' box is closed");
+
+ info("Test closing by escape");
+ pressKey(dbg, "goToLine");
+ assertEnabled(dbg);
+
+ pressKey(dbg, "Escape");
+ assertDisabled(dbg);
+ is(findElement(dbg, "searchField"), null, "The 'go to line' box is closed");
+
+ info("Test going to the correct line");
+ pressKey(dbg, "goToLine");
+ await waitForGoToLineBoxFocus(dbg);
+ type(dbg, "66");
+ pressKey(dbg, "Enter");
+ await assertLine(dbg, 66);
+});
+
+function assertEnabled(dbg) {
+ is(dbg.selectors.getQuickOpenEnabled(), true, "quickOpen enabled");
+}
+
+function assertDisabled(dbg) {
+ is(dbg.selectors.getQuickOpenEnabled(), false, "quickOpen disabled");
+}
+
+async function waitForGoToLineBoxFocus(dbg) {
+ await waitFor(() => dbg.win.document.activeElement.tagName === "INPUT");
+}
+
+async function assertLine(dbg, lineNumber) {
+ // Wait for the line to be set
+ await waitUntil(() => !!dbg.selectors.getSelectedLocation().line);
+ is(
+ dbg.selectors.getSelectedLocation().line,
+ lineNumber,
+ `goto line is ${lineNumber}`
+ );
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-html-breakpoints.js b/devtools/client/debugger/test/mochitest/browser_dbg-html-breakpoints.js
new file mode 100644
index 0000000000..aafea0d650
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-html-breakpoints.js
@@ -0,0 +1,54 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-html-breakpoints.html");
+
+ await selectSource(dbg, "doc-html-breakpoints.html");
+
+ // Reload the page so that we know the debugger is already open and
+ // functional before the page loads and we start getting notifications
+ // about new actors being created in the page content.
+ await reload(dbg, "doc-html-breakpoints.html");
+
+ await waitForBreakableLine(dbg, "doc-html-breakpoints.html", 8);
+ await addBreakpoint(dbg, "doc-html-breakpoints.html", 8);
+
+ // Ensure that the breakpoints get added once the later scripts load.
+ await waitForBreakableLine(dbg, "doc-html-breakpoints.html", 15);
+ await addBreakpoint(dbg, "doc-html-breakpoints.html", 15);
+ await waitForBreakableLine(dbg, "doc-html-breakpoints.html", 20);
+ await addBreakpoint(dbg, "doc-html-breakpoints.html", 20);
+
+ await reload(dbg, "doc-html-breakpoints.html", "simple2.js");
+
+ invokeInTab("test1");
+ await waitForPaused(dbg);
+
+ const htmlSource = findSource(dbg, "doc-html-breakpoints.html");
+
+ is(htmlSource.isHTML, true, "The html page is flagged as an html source");
+ is(
+ findSource(dbg, "simple2.js").isHTML,
+ false,
+ "The js source is not flagged as an html source"
+ );
+
+ assertPausedAtSourceAndLine(dbg, htmlSource.id, 8);
+ await resume(dbg);
+
+ await waitForBreakableLine(dbg, "doc-html-breakpoints.html", 15);
+ invokeInTab("test3");
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, htmlSource.id, 15);
+ await resume(dbg);
+
+ await waitForBreakableLine(dbg, "doc-html-breakpoints.html", 20);
+ invokeInTab("test4");
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, htmlSource.id, 20);
+ await resume(dbg);
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-idb-run-to-completion.js b/devtools/client/debugger/test/mochitest/browser_dbg-idb-run-to-completion.js
new file mode 100644
index 0000000000..dcd4a11463
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-idb-run-to-completion.js
@@ -0,0 +1,15 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test that IDB transactions are not processed at microtask checkpoints
+// introduced by debugger hooks.
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-idb-run-to-completion.html");
+ invokeInTab("test", "doc-xhr-run-to-completion.html");
+ await waitForPaused(dbg);
+ ok(true, "paused after successfully processing IDB transaction");
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-iframes.js b/devtools/client/debugger/test/mochitest/browser_dbg-iframes.js
new file mode 100644
index 0000000000..0bcc0e020f
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-iframes.js
@@ -0,0 +1,60 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test is taking too much time to complete on some hardware since
+// release at https://bugzilla.mozilla.org/show_bug.cgi?id=1423158
+
+"use strict";
+
+requestLongerTimeout(3);
+
+/**
+ * Test debugging a page with iframes
+ * 1. pause in the main thread
+ * 2. pause in the iframe
+ */
+add_task(async function () {
+ const dbg = await initDebugger("doc-iframes.html");
+
+ // test pausing in the main thread
+ const onReloaded = reload(dbg);
+ await waitForPaused(dbg);
+ await waitForLoadedSource(dbg, "doc-iframes.html");
+ assertPausedAtSourceAndLine(dbg, findSource(dbg, "doc-iframes.html").id, 11);
+
+ // test pausing in the iframe
+ await resume(dbg);
+ await waitForPaused(dbg);
+ await waitForLoadedSource(dbg, "doc-debugger-statements.html");
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "doc-debugger-statements.html").id,
+ 11
+ );
+
+ // test pausing in the iframe
+ await resume(dbg);
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "doc-debugger-statements.html").id,
+ 16
+ );
+ await waitFor(() => dbg.toolbox.isHighlighted("jsdebugger"));
+ ok(true, "Debugger is highlighted when paused");
+
+ if (isFissionEnabled() || isEveryFrameTargetEnabled()) {
+ info("Remove the iframe and wait for resume");
+ await SpecialPowers.spawn(gBrowser.selectedBrowser, [], () => {
+ const iframe = content.document.querySelector("iframe");
+ iframe.remove();
+ });
+ await waitForResumed(dbg);
+ await waitFor(() => !dbg.toolbox.isHighlighted("jsdebugger"));
+ ok(true, "Debugger is no longer highlighted when resumed");
+
+ info("Wait for reload to complete after resume");
+ await onReloaded;
+ }
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-inline-cache.js b/devtools/client/debugger/test/mochitest/browser_dbg-inline-cache.js
new file mode 100644
index 0000000000..f579ddb1b9
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-inline-cache.js
@@ -0,0 +1,146 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/*
+ * Test loading inline scripts from cache:
+ * - Load document with inline script
+ * - Reload inside debugger with toolbox caching disabled
+ * - Reload inside debugger with toolbox caching enabled
+ */
+
+"use strict";
+
+// Breakpoint position calculations can throw when interrupted by a navigation.
+PromiseTestUtils.allowMatchingRejectionsGlobally(/Resource .*? does not exist/);
+
+const server = createTestHTTPServer();
+
+let docValue = 1;
+server.registerPathHandler("/inline-cache.html", (request, response) => {
+ response.setHeader("Content-Type", "text/html");
+ // HTTP should assume cacheable by default.
+ // Toolbox defaults to disabling cache for subsequent loads when open.
+ response.setHeader("Cache-Control", "public, max-age=3600");
+ response.write(`
+ <html>
+ <head>
+ <script>
+ let x = ${docValue};
+ </script>
+ </head>
+ </html>
+ `);
+});
+
+const SOURCE_URL = `http://localhost:${server.identity.primaryPort}/inline-cache.html`;
+
+add_task(async function () {
+ info("Load document with inline script");
+ const tab = await addTab(SOURCE_URL);
+ info("Open debugger");
+ clearDebuggerPreferences();
+ const toolbox = await openToolboxForTab(tab, "jsdebugger");
+ const dbg = createDebuggerContext(toolbox);
+ await waitForSource(dbg, "inline-cache.html");
+ info("Reload tab to ensure debugger finds script");
+ await reloadBrowser();
+ let pageValue = await getPageValue(tab);
+ is(pageValue, "let x = 1;", "Content loads from network, has doc value 1");
+ await waitForSource(dbg, "inline-cache.html");
+ await selectSource(dbg, "inline-cache.html");
+ await waitForLoadedSource(dbg, "inline-cache.html");
+ let dbgValue = findSourceContent(dbg, "inline-cache.html");
+ info(`Debugger text: ${dbgValue.value}`);
+ ok(
+ dbgValue.value.includes(pageValue),
+ "Debugger loads from cache, gets value 1 like page"
+ );
+
+ info("Disable HTTP cache for page");
+ await toolbox.commands.targetConfigurationCommand.updateConfiguration({
+ cacheDisabled: true,
+ });
+ makeChanges();
+
+ info("Reload inside debugger with toolbox caching disabled (attempt 1)");
+ await reloadBrowser();
+ pageValue = await getPageValue(tab);
+ is(pageValue, "let x = 2;", "Content loads from network, has doc value 2");
+ await waitForLoadedSource(dbg, "inline-cache.html");
+ dbgValue = findSourceContent(dbg, "inline-cache.html");
+
+ info(`Debugger text: ${dbgValue.value}`);
+ ok(
+ dbgValue.value.includes(pageValue),
+ "Debugger loads from network, gets value 2 like page"
+ );
+
+ makeChanges();
+
+ info("Reload inside debugger with toolbox caching disabled (attempt 2)");
+ await reloadBrowser();
+ pageValue = await getPageValue(tab);
+ is(pageValue, "let x = 3;", "Content loads from network, has doc value 3");
+ await waitForLoadedSource(dbg, "inline-cache.html");
+ dbgValue = findSourceContent(dbg, "inline-cache.html");
+ info(`Debugger text: ${dbgValue.value}`);
+ ok(
+ dbgValue.value.includes(pageValue),
+ "Debugger loads from network, gets value 3 like page"
+ );
+
+ info("Enable HTTP cache for page");
+ await toolbox.commands.targetConfigurationCommand.updateConfiguration({
+ cacheDisabled: false,
+ });
+ makeChanges();
+
+ // Even though the HTTP cache is now enabled, Gecko sets the VALIDATE_ALWAYS flag when
+ // reloading the page. So, it will always make a request to the server for the main
+ // document contents.
+
+ info("Reload inside debugger with toolbox caching enabled (attempt 1)");
+ await reloadBrowser();
+ pageValue = await getPageValue(tab);
+ is(pageValue, "let x = 4;", "Content loads from network, has doc value 4");
+ await waitForLoadedSource(dbg, "inline-cache.html");
+ dbgValue = findSourceContent(dbg, "inline-cache.html");
+ info(`Debugger text: ${dbgValue.value}`);
+ ok(
+ dbgValue.value.includes(pageValue),
+ "Debugger loads from cache, gets value 4 like page"
+ );
+
+ makeChanges();
+
+ info("Reload inside debugger with toolbox caching enabled (attempt 2)");
+ await reloadBrowser();
+ pageValue = await getPageValue(tab);
+ is(pageValue, "let x = 5;", "Content loads from network, has doc value 5");
+ await waitForLoadedSource(dbg, "inline-cache.html");
+ await waitForSelectedSource(dbg, "inline-cache.html");
+ dbgValue = findSourceContent(dbg, "inline-cache.html");
+ info(`Debugger text: ${dbgValue.value}`);
+ ok(
+ dbgValue.value.includes(pageValue),
+ "Debugger loads from cache, gets value 5 like page"
+ );
+
+ await toolbox.destroy();
+ await removeTab(tab);
+});
+
+/**
+ * This is meant to simulate the developer editing the inline source and saving.
+ * Effectively, we change the source during the test at specific controlled points.
+ */
+function makeChanges() {
+ docValue++;
+}
+
+function getPageValue(tab) {
+ return SpecialPowers.spawn(tab.linkedBrowser, [], function () {
+ return content.document.querySelector("script").textContent.trim();
+ });
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-inline-exceptions-inline-script.js b/devtools/client/debugger/test/mochitest/browser_dbg-inline-exceptions-inline-script.js
new file mode 100644
index 0000000000..2977672524
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-inline-exceptions-inline-script.js
@@ -0,0 +1,34 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// This test checks the appearance of an inline exception in inline script
+// and the content of the exception tooltip.
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-exceptions-inline-script.html");
+ await selectSource(dbg, "doc-exceptions-inline-script.html");
+
+ info("Hovers over the inline exception mark text.");
+ await assertInlineExceptionPreview(dbg, 7, 39, {
+ fields: [
+ [
+ "<anonymous>",
+ "https://example.com/browser/devtools/client/debugger/test/mochitest/examples/doc-exceptions-inline-script.html:7",
+ ],
+ ],
+ result: "TypeError: [].plop is not a function",
+ expression: "plop",
+ });
+
+ const excLineEls = findAllElementsWithSelector(dbg, ".line-exception");
+ const excTextMarkEls = findAllElementsWithSelector(
+ dbg,
+ ".mark-text-exception"
+ );
+
+ is(excLineEls.length, 1, "The editor has one exception line");
+ is(excTextMarkEls.length, 1, "One token is marked as an exception.");
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-inline-exceptions-position.js b/devtools/client/debugger/test/mochitest/browser_dbg-inline-exceptions-position.js
new file mode 100644
index 0000000000..e5db201af1
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-inline-exceptions-position.js
@@ -0,0 +1,42 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// This test checks the appearance of an inline exception
+// and the content of the exception tooltip.
+
+"use strict";
+
+function waitForElementsWithSelector(dbg, selector) {
+ return waitFor(() => {
+ const elems = findAllElementsWithSelector(dbg, selector);
+ if (!elems.length) {
+ return false;
+ }
+ return elems;
+ });
+}
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-exception-position.html");
+
+ await selectSource(dbg, "exception-position-1.js");
+ let elems = await waitForElementsWithSelector(dbg, ".mark-text-exception");
+ is(elems.length, 1);
+ is(elems[0].textContent, "a1");
+
+ await selectSource(dbg, "exception-position-2.js");
+ elems = await waitForElementsWithSelector(dbg, ".mark-text-exception");
+ is(elems.length, 1);
+ is(elems[0].textContent, "a2");
+
+ await selectSource(dbg, "exception-position-3.js");
+ elems = await waitForElementsWithSelector(dbg, ".mark-text-exception");
+ is(elems.length, 1);
+ is(elems[0].textContent, "a3");
+
+ await selectSource(dbg, "exception-position-4.js");
+ elems = await waitForElementsWithSelector(dbg, ".mark-text-exception");
+ is(elems.length, 1);
+ is(elems[0].textContent, "a4");
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-inline-exceptions.js b/devtools/client/debugger/test/mochitest/browser_dbg-inline-exceptions.js
new file mode 100644
index 0000000000..56c0f0eeed
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-inline-exceptions.js
@@ -0,0 +1,38 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// This test checks the appearance of an inline exception
+// and the content of the exception tooltip.
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-exceptions.html");
+ await selectSource(dbg, "exceptions.js");
+
+ info("Hovers over the inline exception mark text.");
+ await assertInlineExceptionPreview(dbg, 85, 10, {
+ fields: [
+ [
+ "inlineExc",
+ "https://example.com/browser/devtools/client/debugger/test/mochitest/examples/exceptions.js:85",
+ ],
+ [
+ "<anonymous>",
+ "https://example.com/browser/devtools/client/debugger/test/mochitest/examples/exceptions.js:88",
+ ],
+ ],
+ result: 'TypeError: "abc".push is not a function',
+ expression: "push",
+ });
+
+ const excLineEls = findAllElementsWithSelector(dbg, ".line-exception");
+ const excTextMarkEls = findAllElementsWithSelector(
+ dbg,
+ ".mark-text-exception"
+ );
+
+ is(excLineEls.length, 1, "The editor has one exception line");
+ is(excTextMarkEls.length, 1, "One token is marked as an exception.");
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-inline-preview.js b/devtools/client/debugger/test/mochitest/browser_dbg-inline-preview.js
new file mode 100644
index 0000000000..7f2d06739f
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-inline-preview.js
@@ -0,0 +1,117 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test checking inline preview feature
+
+"use strict";
+
+add_task(async function () {
+ await pushPref("devtools.debugger.features.inline-preview", true);
+
+ const dbg = await initDebugger(
+ "doc-inline-preview.html",
+ "inline-preview.js"
+ );
+ await selectSource(dbg, "inline-preview.js");
+
+ await checkInlinePreview(dbg, "checkValues", [
+ { identifier: "a:", value: '""' },
+ { identifier: "b:", value: "false" },
+ { identifier: "c:", value: "undefined" },
+ { identifier: "d:", value: "null" },
+ { identifier: "e:", value: "Array []" },
+ { identifier: "f:", value: "Object { }" },
+ { identifier: "reg:", value: "/^\\p{RGI_Emoji}$/v" },
+ { identifier: "obj:", value: "Object { foo: 1 }" },
+ {
+ identifier: "bs:",
+ value: "Array(101) [ {…}, {…}, {…}, … ]",
+ },
+ ]);
+
+ await checkInlinePreview(dbg, "columnWise", [
+ { identifier: "c:", value: '"c"' },
+ { identifier: "a:", value: '"a"' },
+ { identifier: "b:", value: '"b"' },
+ ]);
+
+ // Check that referencing an object property previews the property, not the
+ // object (bug 1599917)
+ await checkInlinePreview(dbg, "objectProperties", [
+ { identifier: "obj:", value: 'Object { hello: "world", a: {…} }' },
+ { identifier: "obj.hello:", value: '"world"' },
+ { identifier: "obj.a.b:", value: '"c"' },
+ ]);
+
+ await checkInlinePreview(dbg, "classProperties", [
+ { identifier: "i:", value: "2" },
+ { identifier: "self:", value: `Object { x: 1, #privateVar: 2 }` },
+ ]);
+
+ // Check inline previews for values within a module script
+ await checkInlinePreview(dbg, "runInModule", [
+ { identifier: "val:", value: "4" },
+ ]);
+
+ // Checks that open in inspector button works in inline preview
+ invokeInTab("btnClick");
+ await checkInspectorIcon(dbg);
+
+ const { toolbox } = dbg;
+ await toolbox.selectTool("jsdebugger");
+
+ await waitForSelectedSource(dbg);
+
+ // Check preview of event ( event.target should be clickable )
+ // onBtnClick function in inline-preview.js
+ await checkInspectorIcon(dbg);
+});
+
+async function checkInlinePreview(dbg, fnName, inlinePreviews) {
+ invokeInTab(fnName);
+
+ await waitForAllElements(dbg, "inlinePreviewLabels", inlinePreviews.length);
+
+ const labels = findAllElements(dbg, "inlinePreviewLabels");
+ const values = findAllElements(dbg, "inlinePreviewValues");
+
+ inlinePreviews.forEach((inlinePreview, index) => {
+ const { identifier, value } = inlinePreview;
+ is(
+ labels[index].innerText,
+ identifier,
+ `${identifier} in ${fnName} has correct inline preview label`
+ );
+ is(
+ values[index].innerText,
+ value,
+ `${identifier} in ${fnName} has correct inline preview value`
+ );
+ });
+
+ await resume(dbg);
+}
+
+async function checkInspectorIcon(dbg) {
+ await waitForElement(dbg, "inlinePreviewOpenInspector");
+
+ const { toolbox } = dbg;
+ const node = findElement(dbg, "inlinePreviewOpenInspector");
+
+ // Ensure hovering over button highlights the node in content pane
+ const view = node.ownerDocument.defaultView;
+ const onNodeHighlight = toolbox.getHighlighter().waitForHighlighterShown();
+
+ EventUtils.synthesizeMouseAtCenter(node, { type: "mousemove" }, view);
+
+ const { nodeFront } = await onNodeHighlight;
+ is(nodeFront.displayName, "button", "The correct node was highlighted");
+
+ // Ensure panel changes when button is clicked
+ const onInspectorPanelLoad = waitForInspectorPanelChange(dbg);
+ node.click();
+ await onInspectorPanelLoad;
+
+ await resume(dbg);
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-inline-script-offset.js b/devtools/client/debugger/test/mochitest/browser_dbg-inline-script-offset.js
new file mode 100644
index 0000000000..c053d28508
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-inline-script-offset.js
@@ -0,0 +1,40 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test that breakpoints work when set in inline scripts that do not start at column 0.
+
+"use strict";
+
+const TEST_PAGE = "doc-inline-script-offset.html";
+
+add_task(async function () {
+ const dbg = await initDebugger(TEST_PAGE);
+ await selectSource(dbg, TEST_PAGE);
+
+ // Ensure that breakable lines are correct when loading against an already loaded page
+ await assertBreakableLines(dbg, TEST_PAGE, 16, [
+ ...getRange(3, 5),
+ ...getRange(11, 13),
+ 15,
+ ]);
+
+ await reload(dbg, TEST_PAGE);
+
+ // Also verify they are fine after reload
+ await assertBreakableLines(dbg, TEST_PAGE, 16, [
+ ...getRange(3, 5),
+ ...getRange(11, 13),
+ 15,
+ ]);
+
+ await addBreakpoint(dbg, "doc-inline-script-offset.html", 15, 67);
+
+ const onReloaded = reload(dbg);
+ await waitForPaused(dbg);
+ ok(true, "paused after reloading at column breakpoint");
+
+ await resume(dbg);
+ info("Wait for reload to complete after resume");
+ await onReloaded;
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-inspector-integration.js b/devtools/client/debugger/test/mochitest/browser_dbg-inspector-integration.js
new file mode 100644
index 0000000000..1135a18a97
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-inspector-integration.js
@@ -0,0 +1,147 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests that clicking the DOM node button in any ObjectInspect
+// opens the Inspector panel
+
+"use strict";
+
+add_task(async function () {
+ // Ensures the end panel is wide enough to show the inspector icon
+ await pushPref("devtools.debugger.end-panel-size", 600);
+ // Disable 3-pane inspector as it might trigger unwanted server communication.
+ await pushPref("devtools.inspector.three-pane-enabled", false);
+
+ const dbg = await initDebugger("doc-script-switching.html");
+ const { toolbox } = dbg;
+ const highlighterTestFront = await getHighlighterTestFront(toolbox);
+ const highlighter = toolbox.getHighlighter();
+
+ // Bug 1562165: the WhyPaused element is displayed for a few hundred ms when adding an
+ // expression, which can break synthesizeMouseAtCenter. So here we wait for the
+ // whyPaused element to be displayed then hidden before testing the highlight feature.
+ const onWhyPausedDisplayed = waitUntil(() =>
+ dbg.win.document.querySelector(".why-paused")
+ );
+ await addExpression(dbg, "window.document.querySelector('button')");
+ // TODO: Remove when Bug 1562165 lands.
+ await onWhyPausedDisplayed;
+ // TODO: Remove when Bug 1562165 lands.
+ await waitUntil(() => !dbg.win.document.querySelector(".why-paused"));
+
+ info(
+ "Check that hovering over DOM element highlights the node in content panel"
+ );
+ let onNodeHighlight = highlighter.waitForHighlighterShown();
+
+ info("Mouseover the open in inspector button");
+ const inspectorNode = await waitFor(() => findElement(dbg, "openInspector"));
+ const view = inspectorNode.ownerDocument.defaultView;
+ EventUtils.synthesizeMouseAtCenter(
+ inspectorNode,
+ { type: "mouseover" },
+ view
+ );
+
+ info("Wait for highligther to be shown");
+ const { nodeFront } = await onNodeHighlight;
+ is(nodeFront.displayName, "button", "The correct node was highlighted");
+
+ info("Check that moving the mouse away from the node hides the highlighter");
+ let onNodeUnhighlight = highlighter.waitForHighlighterHidden();
+ const nonHighlightEl = inspectorNode.closest(".object-node");
+ EventUtils.synthesizeMouseAtCenter(
+ nonHighlightEl,
+ { type: "mouseover" },
+ view
+ );
+
+ await onNodeUnhighlight;
+ isVisible = await highlighterTestFront.isHighlighting();
+ is(isVisible, false, "The highlighter is not displayed anymore");
+
+ info("Check we don't have zombie highlighters when briefly hovering a node");
+ onNodeHighlight = highlighter.waitForHighlighterShown();
+ onNodeUnhighlight = highlighter.waitForHighlighterHidden();
+
+ // Move hover the node and then, right after, move out.
+ EventUtils.synthesizeMouseAtCenter(
+ inspectorNode,
+ { type: "mousemove" },
+ view
+ );
+ EventUtils.synthesizeMouseAtCenter(
+ nonHighlightEl,
+ { type: "mousemove" },
+ view
+ );
+
+ await Promise.all([onNodeHighlight, onNodeUnhighlight]);
+ isVisible = await highlighterTestFront.isHighlighting();
+ is(isVisible, false, "The highlighter is not displayed anymore - no zombie");
+
+ info("Ensure panel changes when button is clicked");
+ // Loading the inspector panel at first, to make it possible to listen for
+ // new node selections
+ const inspector = await toolbox.loadTool("inspector");
+ const onInspectorSelected = toolbox.once("inspector-selected");
+ const onInspectorUpdated = inspector.once("inspector-updated");
+ const onNewNode = toolbox.selection.once("new-node-front");
+
+ inspectorNode.click();
+
+ await onInspectorSelected;
+ await onInspectorUpdated;
+ const inspectorNodeFront = await onNewNode;
+
+ ok(true, "Inspector selected and new node got selected");
+ is(
+ inspectorNodeFront.displayName,
+ "button",
+ "The expected node was selected"
+ );
+});
+
+add_task(async function () {
+ // Disable 3-pane inspector as it might trigger unwanted server communication.
+ await pushPref("devtools.inspector.three-pane-enabled", false);
+
+ const dbg = await initDebugger("doc-event-handler.html");
+ const { toolbox } = dbg;
+
+ invokeInTab("synthesizeClick");
+ await waitForPaused(dbg);
+
+ findElement(dbg, "frame", 2).focus();
+ clickElement(dbg, "frame", 2);
+ await waitForPaused(dbg);
+ await waitForSelectedSource(dbg, "doc-event-handler.html");
+
+ // Hover over the token to launch preview popup
+ await tryHovering(dbg, 5, 8, "popup");
+
+ info("Wait for top level node to expand and child nodes to load");
+ await waitUntil(
+ () => dbg.win.document.querySelectorAll(".preview-popup .node").length > 1
+ );
+
+ // Click the first inspector button to view node in inspector
+ await waitForElement(dbg, "openInspector");
+
+ // Loading the inspector panel at first, to make it possible to listen for
+ // new node selections
+ const inspector = await toolbox.loadTool("inspector");
+
+ const onInspectorSelected = toolbox.once("inspector-selected");
+ const onInspectorUpdated = inspector.once("inspector-updated");
+ const onNewNode = toolbox.selection.once("new-node-front");
+
+ findElement(dbg, "openInspector").click();
+
+ await onInspectorSelected;
+ await onInspectorUpdated;
+ await onNewNode;
+
+ ok(true, "Inspector selected and new node got selected");
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-integration-reloading-compressed-sourcemaps.js b/devtools/client/debugger/test/mochitest/browser_dbg-integration-reloading-compressed-sourcemaps.js
new file mode 100644
index 0000000000..d832447216
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-integration-reloading-compressed-sourcemaps.js
@@ -0,0 +1,23 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * This runs all integration tests against a test using sources maps
+ * whose generated files (bundles) are compressed.
+ * i.e. bundles are made of a unique line with all sources compressed into one line.
+ */
+
+"use strict";
+
+requestLongerTimeout(10);
+
+add_task(async function () {
+ await pushPref("devtools.debugger.map-scopes-enabled", true);
+ const testFolder = "sourcemaps-reload-compressed";
+ const isCompressed = true;
+
+ await runAllIntegrationTests(testFolder, {
+ isCompressed,
+ });
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-integration-reloading-uncompressed-sourcemaps.js b/devtools/client/debugger/test/mochitest/browser_dbg-integration-reloading-uncompressed-sourcemaps.js
new file mode 100644
index 0000000000..f07688d8f8
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-integration-reloading-uncompressed-sourcemaps.js
@@ -0,0 +1,23 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * This runs all integration tests against a test using sources maps
+ * whose generated files (bundles) are uncompressed.
+ * i.e. bundles are keeping the same format as original files.
+ */
+
+"use strict";
+
+requestLongerTimeout(10);
+
+add_task(async function () {
+ await pushPref("devtools.debugger.map-scopes-enabled", true);
+ const testFolder = "sourcemaps-reload-uncompressed";
+ const isCompressed = false;
+
+ await runAllIntegrationTests(testFolder, {
+ isCompressed,
+ });
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-function-returns.js b/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-function-returns.js
new file mode 100644
index 0000000000..4b75be5cd7
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-function-returns.js
@@ -0,0 +1,106 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests tracing all function returns
+
+"use strict";
+
+add_task(async function testTracingFunctionReturn() {
+ await pushPref("devtools.debugger.features.javascript-tracing", true);
+
+ const jsCode = `async function foo() { nullReturn(); falseReturn(); await new Promise(r => setTimeout(r, 0)); return bar(); }; function nullReturn() { return null; } function falseReturn() { return false; } function bar() { return 42; }; function throwingFunction() { throw new Error("the exception") }`;
+ const dbg = await initDebuggerWithAbsoluteURL(
+ "data:text/html," +
+ encodeURIComponent(`<script>${jsCode}</script><body></body>`)
+ );
+
+ await openContextMenuInDebugger(dbg, "trace");
+ let toggled = waitForDispatch(
+ dbg.store,
+ "TOGGLE_JAVASCRIPT_TRACING_FUNCTION_RETURN"
+ );
+ selectContextMenuItem(dbg, `#debugger-trace-menu-item-function-return`);
+ await toggled;
+ ok(true, "Toggled the trace of function returns");
+
+ await clickElement(dbg, "trace");
+
+ const topLevelThreadActorID =
+ dbg.toolbox.commands.targetCommand.targetFront.threadFront.actorID;
+ info("Wait for tracing to be enabled");
+ await waitForState(dbg, state => {
+ return dbg.selectors.getIsThreadCurrentlyTracing(topLevelThreadActorID);
+ });
+
+ invokeInTab("foo");
+ await hasConsoleMessage(dbg, "⟶ interpreter λ foo");
+ await hasConsoleMessage(dbg, "⟶ interpreter λ bar");
+ await hasConsoleMessage(dbg, "⟵ λ bar");
+ await hasConsoleMessage(dbg, "⟵ λ foo");
+
+ await clickElement(dbg, "trace");
+
+ info("Wait for tracing to be disabled");
+ await waitForState(dbg, state => {
+ return !dbg.selectors.getIsThreadCurrentlyTracing(topLevelThreadActorID);
+ });
+
+ await openContextMenuInDebugger(dbg, "trace");
+ toggled = waitForDispatch(dbg.store, "TOGGLE_JAVASCRIPT_TRACING_VALUES");
+ selectContextMenuItem(dbg, `#debugger-trace-menu-item-log-values`);
+ await toggled;
+ ok(true, "Toggled the log values setting");
+
+ await clickElement(dbg, "trace");
+
+ info("Wait for tracing to be re-enabled with logging of returned values");
+ await waitForState(dbg, state => {
+ return dbg.selectors.getIsThreadCurrentlyTracing(topLevelThreadActorID);
+ });
+
+ invokeInTab("foo");
+
+ await hasConsoleMessage(dbg, "⟶ interpreter λ foo");
+ await hasConsoleMessage(dbg, "⟶ interpreter λ bar");
+ await hasConsoleMessage(dbg, "⟵ λ bar return 42");
+ await hasConsoleMessage(dbg, "⟶ interpreter λ nullReturn");
+ await hasConsoleMessage(dbg, "⟵ λ nullReturn return null");
+ await hasConsoleMessage(dbg, "⟶ interpreter λ falseReturn");
+ await hasConsoleMessage(dbg, "⟵ λ falseReturn return false");
+ await hasConsoleMessage(
+ dbg,
+ `⟵ λ foo return \nPromise { <state>: "fulfilled", <value>: 42 }`
+ );
+
+ invokeInTab("throwingFunction").catch(() => {});
+ await hasConsoleMessage(
+ dbg,
+ `⟵ λ throwingFunction throw \nError: the exception`
+ );
+
+ info("Stop tracing");
+ await clickElement(dbg, "trace");
+ await waitForState(dbg, state => {
+ return !dbg.selectors.getIsThreadCurrentlyTracing(topLevelThreadActorID);
+ });
+
+ info("Toggle the two settings to the default value");
+ await openContextMenuInDebugger(dbg, "trace");
+ toggled = waitForDispatch(dbg.store, "TOGGLE_JAVASCRIPT_TRACING_VALUES");
+ selectContextMenuItem(dbg, `#debugger-trace-menu-item-log-values`);
+ await toggled;
+
+ await openContextMenuInDebugger(dbg, "trace");
+ toggled = waitForDispatch(
+ dbg.store,
+ "TOGGLE_JAVASCRIPT_TRACING_FUNCTION_RETURN"
+ );
+ selectContextMenuItem(dbg, `#debugger-trace-menu-item-function-return`);
+ await toggled;
+
+ // Reset the trace on next interaction setting
+ Services.prefs.clearUserPref(
+ "devtools.debugger.javascript-tracing-on-next-interaction"
+ );
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-next-interation.js b/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-next-interation.js
new file mode 100644
index 0000000000..37e275f273
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-next-interation.js
@@ -0,0 +1,181 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests tracing only on next user interaction
+
+"use strict";
+
+add_task(async function testTracingOnNextInteraction() {
+ await pushPref("devtools.debugger.features.javascript-tracing", true);
+
+ // Cover tracing only on next user interaction
+ const jsCode = `function foo() {}; window.addEventListener("mousedown", function onmousedown(){}, { capture: true }); window.onclick = function onclick() {};`;
+ const dbg = await initDebuggerWithAbsoluteURL(
+ "data:text/html," +
+ encodeURIComponent(`<script>${jsCode}</script><body></body>`)
+ );
+
+ await openContextMenuInDebugger(dbg, "trace");
+ const toggled = waitForDispatch(
+ dbg.store,
+ "TOGGLE_JAVASCRIPT_TRACING_ON_NEXT_INTERACTION"
+ );
+ selectContextMenuItem(dbg, `#debugger-trace-menu-item-next-interaction`);
+ await toggled;
+ ok(true, "Toggled the trace on next interaction");
+
+ await clickElement(dbg, "trace");
+
+ const traceButton = findElement(dbg, "trace");
+ // Wait for the trace button to be highlighted
+ await waitFor(() => {
+ return traceButton.classList.contains("pending");
+ });
+ ok(
+ traceButton.classList.contains("pending"),
+ "The tracer button is also highlighted as pending until the user interaction is triggered"
+ );
+
+ invokeInTab("foo");
+
+ // Let a change to have the tracer to regress and log foo call
+ await wait(500);
+
+ is(
+ (await findConsoleMessages(dbg.toolbox, "λ foo")).length,
+ 0,
+ "The tracer did not log the function call before trigerring the click event"
+ );
+
+ // We intentionally turn off this a11y check, because the following click
+ // is send on an empty <body> to to test the click event tracer performance,
+ // and not to activate any control, therefore this check can be ignored.
+ AccessibilityUtils.setEnv({
+ mustHaveAccessibleRule: false,
+ });
+ await BrowserTestUtils.synthesizeMouseAtCenter(
+ "body",
+ {},
+ gBrowser.selectedBrowser
+ );
+ AccessibilityUtils.resetEnv();
+
+ let topLevelThreadActorID =
+ dbg.toolbox.commands.targetCommand.targetFront.threadFront.actorID;
+ info("Wait for tracing to be enabled");
+ await waitForState(dbg, state => {
+ return dbg.selectors.getIsThreadCurrentlyTracing(topLevelThreadActorID);
+ });
+
+ await hasConsoleMessage(dbg, "λ onmousedown");
+ await hasConsoleMessage(dbg, "λ onclick");
+
+ ok(
+ traceButton.classList.contains("active"),
+ "The tracer button is still highlighted as active"
+ );
+ ok(
+ !traceButton.classList.contains("pending"),
+ "The tracer button is no longer pending after the user interaction"
+ );
+
+ is(
+ (await findConsoleMessages(dbg.toolbox, "λ foo")).length,
+ 0,
+ "Even after the click, the code called before the click is still not logged"
+ );
+
+ // But if we call this code again, now it should be logged
+ invokeInTab("foo");
+ await hasConsoleMessage(dbg, "λ foo");
+ ok(true, "foo was traced as expected");
+
+ await clickElement(dbg, "trace");
+
+ topLevelThreadActorID =
+ dbg.toolbox.commands.targetCommand.targetFront.threadFront.actorID;
+ info("Wait for tracing to be disabled");
+ await waitForState(dbg, state => {
+ return !dbg.selectors.getIsThreadCurrentlyTracing(topLevelThreadActorID);
+ });
+
+ ok(
+ !traceButton.classList.contains("active"),
+ "The tracer button is no longer highlighted as active"
+ );
+ ok(
+ !traceButton.classList.contains("pending"),
+ "The tracer button is still not pending after disabling"
+ );
+
+ // Reset the trace on next interaction setting
+ Services.prefs.clearUserPref(
+ "devtools.debugger.javascript-tracing-on-next-interaction"
+ );
+});
+
+add_task(async function testInteractionBetweenDebuggerAndConsole() {
+ const jsCode = `function foo() {};`;
+ const dbg = await initDebuggerWithAbsoluteURL(
+ "data:text/html," + encodeURIComponent(`<script>${jsCode}</script>`)
+ );
+
+ info("Enable the tracing via the debugger button");
+ await clickElement(dbg, "trace");
+
+ const topLevelThreadActorID =
+ dbg.toolbox.commands.targetCommand.targetFront.threadFront.actorID;
+ info("Wait for tracing to be enabled");
+ await waitForState(dbg, state => {
+ return dbg.selectors.getIsThreadCurrentlyTracing(topLevelThreadActorID);
+ });
+
+ invokeInTab("foo");
+
+ await hasConsoleMessage(dbg, "λ foo");
+
+ info("Disable the tracing via a console command");
+ const { hud } = await dbg.toolbox.getPanel("webconsole");
+ let msg = await evaluateExpressionInConsole(hud, ":trace", "console-api");
+ is(msg.textContent.trim(), "Stopped tracing");
+
+ ok(
+ !dbg.selectors.getIsThreadCurrentlyTracing(topLevelThreadActorID),
+ "Tracing is also reported as disabled in the debugger"
+ );
+
+ info(
+ "Clear the console output from the first tracing session started from the debugger"
+ );
+ hud.ui.clearOutput();
+ await waitFor(
+ async () => !(await findConsoleMessages(dbg.toolbox, "λ foo")).length,
+ "Wait for console to be cleared"
+ );
+
+ info("Enable the tracing via a console command");
+ msg = await evaluateExpressionInConsole(hud, ":trace", "console-api");
+ is(msg.textContent.trim(), "Started tracing to Web Console");
+
+ info("Wait for tracing to be also enabled in the debugger");
+ await waitForState(dbg, state => {
+ return dbg.selectors.getIsThreadCurrentlyTracing(topLevelThreadActorID);
+ });
+ ok(true, "Debugger also reports the tracing in progress");
+
+ invokeInTab("foo");
+
+ await hasConsoleMessage(dbg, "λ foo");
+
+ info("Disable the tracing via the debugger button");
+ await clickElement(dbg, "trace");
+
+ info("Wait for tracing to be disabled per debugger button");
+ await waitForState(dbg, state => {
+ return dbg.selectors.getIsThreadCurrentlyTracing(topLevelThreadActorID);
+ });
+
+ info("Also wait for stop message in the console");
+ await hasConsoleMessage(dbg, "Stopped tracing");
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-next-load.js b/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-next-load.js
new file mode 100644
index 0000000000..6ee442cbd0
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-next-load.js
@@ -0,0 +1,131 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests tracing only on next page load
+
+"use strict";
+
+add_task(async function testTracingOnNextLoad() {
+ await pushPref("devtools.debugger.features.javascript-tracing", true);
+
+ await pushPref(
+ "devtools.debugger.features.javascript-tracing-log-method",
+ "console"
+ );
+ // Cover tracing function argument values
+ const jsCode = `function foo() {}; function bar() {}; foo(); dump("plop\\n")`;
+ const dbg = await initDebuggerWithAbsoluteURL(
+ "data:text/html," +
+ encodeURIComponent(`<script>${jsCode}</script><body></body>`)
+ );
+
+ const traceButton = findElement(dbg, "trace");
+
+ await openContextMenuInDebugger(dbg, "trace");
+ let toggled = waitForDispatch(
+ dbg.store,
+ "TOGGLE_JAVASCRIPT_TRACING_ON_NEXT_LOAD"
+ );
+ selectContextMenuItem(dbg, `#debugger-trace-menu-item-next-load`);
+ await toggled;
+ ok(true, "Toggled the trace on next load");
+
+ await clickElement(dbg, "trace");
+
+ ok(
+ !traceButton.classList.contains("pending"),
+ "Before toggling the trace button, it has no particular state"
+ );
+
+ info(
+ "Wait for the split console to be automatically displayed when toggling this setting"
+ );
+ await dbg.toolbox.getPanelWhenReady("webconsole");
+
+ invokeInTab("bar");
+
+ // Let some time for the call to be traced
+ await wait(500);
+
+ is(
+ (await findConsoleMessages(dbg.toolbox, "λ bar")).length,
+ 0,
+ "The code isn't logged as the tracer shouldn't be started yet"
+ );
+
+ // Wait for the trace button to be highlighted
+ await waitFor(() => {
+ return traceButton.classList.contains("pending");
+ }, "The tracer button is pending before reloading the page");
+
+ info("Add an iframe to trigger a target creation");
+ await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async function () {
+ const iframe = content.document.createElement("iframe");
+ iframe.src = "data:text/html,iframe";
+ content.document.body.appendChild(iframe);
+ });
+
+ // Let some time to regress and start the tracer
+ await wait(500);
+
+ ok(
+ traceButton.classList.contains("pending"),
+ "verify that the tracer is still pending after the iframe creation"
+ );
+
+ // Reload the page to trigger the tracer
+ await reload(dbg);
+
+ let topLevelThreadActorID =
+ dbg.toolbox.commands.targetCommand.targetFront.threadFront.actorID;
+ info("Wait for tracing to be enabled after page reload");
+ await waitForState(dbg, state => {
+ return dbg.selectors.getIsThreadCurrentlyTracing(topLevelThreadActorID);
+ });
+ ok(
+ traceButton.classList.contains("active"),
+ "The tracer button is now active after reload"
+ );
+
+ info("Wait for the split console to be displayed");
+ await dbg.toolbox.getPanelWhenReady("webconsole");
+
+ // Ensure that the very early code is traced
+ await hasConsoleMessage(dbg, "λ foo");
+
+ is(
+ (await findConsoleMessages(dbg.toolbox, "λ bar")).length,
+ 0,
+ "The code ran before the reload isn't logged"
+ );
+
+ await clickElement(dbg, "trace");
+
+ topLevelThreadActorID =
+ dbg.toolbox.commands.targetCommand.targetFront.threadFront.actorID;
+ info("Wait for tracing to be disabled");
+ await waitForState(dbg, state => {
+ return dbg.selectors.getIsThreadCurrentlyTracing(topLevelThreadActorID);
+ });
+ await waitFor(() => {
+ return !traceButton.classList.contains("active");
+ }, "The tracer button is no longer active after stop request");
+
+ info("Toggle the setting back off");
+ await openContextMenuInDebugger(dbg, "trace");
+ toggled = waitForDispatch(
+ dbg.store,
+ "TOGGLE_JAVASCRIPT_TRACING_ON_NEXT_LOAD"
+ );
+ selectContextMenuItem(dbg, `#debugger-trace-menu-item-next-load`);
+ await toggled;
+ await waitFor(() => {
+ return !traceButton.classList.contains("pending");
+ }, "The tracer button is no longer pending after toggling the setting");
+
+ // Reset the trace on next interaction setting
+ Services.prefs.clearUserPref(
+ "devtools.debugger.javascript-tracing-on-next-interaction"
+ );
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-values.js b/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-values.js
new file mode 100644
index 0000000000..92ff3c30a4
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-values.js
@@ -0,0 +1,48 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests tracing argument values
+
+"use strict";
+add_task(async function testTracingValues() {
+ await pushPref("devtools.debugger.features.javascript-tracing", true);
+
+ // Cover tracing function argument values
+ const jsCode = `function foo() { bar(1, ["array"], { attribute: 3 }, BigInt(4), Infinity, Symbol("6"), "7"); }; function bar(a, b, c) {}`;
+ const dbg = await initDebuggerWithAbsoluteURL(
+ "data:text/html," + encodeURIComponent(`<script>${jsCode}</script>`)
+ );
+
+ await openContextMenuInDebugger(dbg, "trace");
+ const toggled = waitForDispatch(
+ dbg.store,
+ "TOGGLE_JAVASCRIPT_TRACING_VALUES"
+ );
+ selectContextMenuItem(dbg, `#debugger-trace-menu-item-log-values`);
+ await toggled;
+ ok(true, "Toggled the log values setting");
+
+ await clickElement(dbg, "trace");
+
+ const topLevelThreadActorID =
+ dbg.toolbox.commands.targetCommand.targetFront.threadFront.actorID;
+ info("Wait for tracing to be enabled");
+ await waitForState(dbg, state => {
+ return dbg.selectors.getIsThreadCurrentlyTracing(topLevelThreadActorID);
+ });
+
+ invokeInTab("foo");
+
+ await hasConsoleMessage(dbg, "λ foo()");
+ await hasConsoleMessage(dbg, "λ bar");
+ const { value } = await findConsoleMessage(dbg, "λ bar");
+ is(
+ value,
+ `⟶ interpreter λ bar(1, \nArray [ "array" ]\n, \nObject { attribute: 3 }\n, 4n, Infinity, Symbol("6"), "7")`,
+ "The argument were printed for bar()"
+ );
+
+ // Reset the log values setting
+ Services.prefs.clearUserPref("devtools.debugger.javascript-tracing-values");
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-worker.js b/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-worker.js
new file mode 100644
index 0000000000..cabcb1deb8
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer-worker.js
@@ -0,0 +1,63 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests tracing web workers
+
+"use strict";
+add_task(async function testTracingWorker() {
+ await pushPref("devtools.debugger.features.javascript-tracing", true);
+
+ // We have to enable worker targets and disable this pref to have functional tracing for workers
+ await pushPref("dom.worker.console.dispatch_events_to_main_thread", false);
+
+ const dbg = await initDebugger("doc-scripts.html");
+
+ info("Instantiate a worker");
+ const { targetCommand } = dbg.toolbox.commands;
+ let onAvailable;
+ const onNewTarget = new Promise(resolve => {
+ onAvailable = ({ targetFront }) => {
+ resolve(targetFront);
+ };
+ });
+ await targetCommand.watchTargets({
+ types: [targetCommand.TYPES.FRAME],
+ onAvailable,
+ });
+ await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async function () {
+ content.worker = new content.Worker("simple-worker.js");
+ });
+ info("Wait for the worker target");
+ const workerTarget = await onNewTarget;
+
+ await waitFor(
+ () => findAllElements(dbg, "threadsPaneItems").length == 2,
+ "Wait for the two threads to be displayed in the thread pane"
+ );
+ const threadsEl = findAllElements(dbg, "threadsPaneItems");
+ is(threadsEl.length, 2, "There are two threads in the thread panel");
+
+ info("Enable tracing on all threads");
+ await clickElement(dbg, "trace");
+ info("Wait for tracing to be enabled for the worker");
+ await waitForState(dbg, state => {
+ return dbg.selectors.getIsThreadCurrentlyTracing(
+ workerTarget.threadFront.actorID
+ );
+ });
+
+ // `timer` is called within the worker via a setInterval of 1 second
+ await hasConsoleMessage(dbg, "setIntervalCallback");
+ await hasConsoleMessage(dbg, "λ timer");
+
+ // Also verify that postMessage are traced
+ await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async function () {
+ content.worker.postMessage("foo");
+ });
+
+ await hasConsoleMessage(dbg, "DOM(message)");
+ await hasConsoleMessage(dbg, "λ onmessage");
+
+ await dbg.toolbox.closeToolbox();
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer.js b/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer.js
new file mode 100644
index 0000000000..9292e1ba17
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-javascript-tracer.js
@@ -0,0 +1,323 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests the Javascript Tracing feature.
+
+"use strict";
+
+add_task(async function () {
+ // This is preffed off for now, so ensure turning it on
+ await pushPref("devtools.debugger.features.javascript-tracing", true);
+
+ const dbg = await initDebugger("doc-scripts.html");
+
+ info("Enable the tracing");
+ await clickElement(dbg, "trace");
+
+ const topLevelThreadActorID =
+ dbg.toolbox.commands.targetCommand.targetFront.threadFront.actorID;
+ info("Wait for tracing to be enabled");
+ await waitForState(dbg, state => {
+ return dbg.selectors.getIsThreadCurrentlyTracing(topLevelThreadActorID);
+ });
+
+ ok(
+ dbg.toolbox.splitConsole,
+ "Split console is automatically opened when tracing to the console"
+ );
+
+ await hasConsoleMessage(dbg, "Started tracing to Web Console");
+
+ invokeInTab("main");
+
+ info("Wait for console messages for the whole trace");
+ // `main` calls `foo` which calls `bar`
+ await hasConsoleMessage(dbg, "λ main");
+ await hasConsoleMessage(dbg, "λ foo");
+ await hasConsoleMessage(dbg, "λ bar");
+
+ const traceMessages = await findConsoleMessages(dbg.toolbox, "λ main");
+ is(traceMessages.length, 1, "We got a unique trace for 'main' function call");
+ const sourceLink = traceMessages[0].querySelector(".frame-link-source");
+ sourceLink.click();
+ info("Wait for the main function to be highlighted in the debugger");
+ await waitForSelectedSource(dbg, "simple1.js");
+ await waitForSelectedLocation(dbg, 1, 16);
+
+ // Trigger a click to verify we do trace DOM events
+ BrowserTestUtils.synthesizeMouseAtCenter(
+ "button",
+ {},
+ gBrowser.selectedBrowser
+ );
+
+ await hasConsoleMessage(dbg, "DOM(click)");
+ await hasConsoleMessage(dbg, "λ simple");
+
+ // Test Blackboxing
+ info("Clear the console from previous traces");
+ const { hud } = await dbg.toolbox.getPanel("webconsole");
+ hud.ui.clearOutput();
+ await waitFor(
+ async () => !(await findConsoleMessages(dbg.toolbox, "λ main")).length,
+ "Wait for console to be cleared"
+ );
+
+ info(
+ "Now blackbox only the source where main function is (simple1.js), but foo and bar are in another module"
+ );
+ await clickElement(dbg, "blackbox");
+ await waitForDispatch(dbg.store, "BLACKBOX_WHOLE_SOURCES");
+
+ info("Trigger some code from simple1 and simple2");
+ invokeInTab("main");
+
+ info("Only methods from simple2 are logged");
+ await hasConsoleMessage(dbg, "λ foo");
+ await hasConsoleMessage(dbg, "λ bar");
+ is(
+ (await findConsoleMessages(dbg.toolbox, "λ main")).length,
+ 0,
+ "Traces from simple1.js, related to main function are not logged"
+ );
+
+ info("Revert blackboxing");
+ await clickElement(dbg, "blackbox");
+ await waitForDispatch(dbg.store, "UNBLACKBOX_WHOLE_SOURCES");
+
+ // Test Disabling tracing
+ info("Disable the tracing");
+ await clickElement(dbg, "trace");
+ info("Wait for tracing to be disabled");
+ await waitForState(dbg, state => {
+ return !dbg.selectors.getIsThreadCurrentlyTracing(topLevelThreadActorID);
+ });
+ await hasConsoleMessage(dbg, "Stopped tracing");
+
+ invokeInTab("inline_script2");
+
+ // Let some time for the tracer to appear if we failed disabling the tracing
+ await wait(1000);
+
+ const messages = await findConsoleMessages(dbg.toolbox, "inline_script2");
+ is(
+ messages.length,
+ 0,
+ "We stopped recording traces, an the function call isn't logged in the console"
+ );
+
+ // Test Navigations
+ await navigate(dbg, "doc-sourcemaps2.html", "main.js", "main.min.js");
+
+ info("Re-enable the tracing after navigation");
+ await clickElement(dbg, "trace");
+
+ const newTopLevelThread =
+ dbg.toolbox.commands.targetCommand.targetFront.threadFront.actorID;
+ info("Wait for tracing to be re-enabled");
+ await waitForState(dbg, state => {
+ return dbg.selectors.getIsThreadCurrentlyTracing(newTopLevelThread);
+ });
+
+ invokeInTab("logMessage");
+
+ await hasConsoleMessage(dbg, "λ logMessage");
+
+ // Test clicking on the function to open the precise related location
+ const traceMessages2 = await findConsoleMessages(dbg.toolbox, "λ logMessage");
+ is(
+ traceMessages2.length,
+ 1,
+ "We got a unique trace for 'logMessage' function call"
+ );
+ const sourceLink2 = traceMessages2[0].querySelector(".frame-link-source");
+ sourceLink2.click();
+
+ info("Wait for the 'logMessage' function to be highlighted in the debugger");
+ await waitForSelectedSource(dbg, "main.js");
+ await waitForSelectedLocation(dbg, 4, 2);
+ ok(true, "The selected source and location is on the original file");
+
+ await dbg.toolbox.closeToolbox();
+});
+
+add_task(async function testPersitentLogMethod() {
+ let dbg = await initDebugger("doc-scripts.html");
+ is(
+ dbg.selectors.getJavascriptTracingLogMethod(),
+ "console",
+ "By default traces are logged to the console"
+ );
+
+ info("Change the log method to stdout");
+ dbg.actions.setJavascriptTracingLogMethod("stdout");
+
+ await dbg.toolbox.closeToolbox();
+
+ dbg = await initDebugger("doc-scripts.html");
+ is(
+ dbg.selectors.getJavascriptTracingLogMethod(),
+ "stdout",
+ "The new setting has been persisted"
+ );
+
+ info("Reset back to the default value");
+ dbg.actions.setJavascriptTracingLogMethod("console");
+});
+
+add_task(async function testPageKeyShortcut() {
+ // Ensures that the key shortcut emitted in the content process bubbles up to the parent process
+ await pushPref("test.events.async.enabled", true);
+
+ // Fake DevTools being opened by a real user interaction.
+ // Tests are bypassing DevToolsStartup to open the tools by calling gDevTools directly.
+ // By doing so DevToolsStartup considers itself as uninitialized,
+ // whereas we want it to handle the key shortcut we trigger in this test.
+ const DevToolsStartup = Cc["@mozilla.org/devtools/startup-clh;1"].getService(
+ Ci.nsISupports
+ ).wrappedJSObject;
+ DevToolsStartup.initialized = true;
+ registerCleanupFunction(() => {
+ DevToolsStartup.initialized = false;
+ });
+
+ const dbg = await initDebuggerWithAbsoluteURL("data:text/html,key-shortcut");
+
+ const topLevelThreadActorID =
+ dbg.toolbox.commands.targetCommand.targetFront.threadFront.actorID;
+ ok(
+ !dbg.selectors.getIsThreadCurrentlyTracing(topLevelThreadActorID),
+ "Tracing is disabled on debugger opening"
+ );
+
+ info(
+ "Focus the page in order to assert that the page keeps the focus when enabling the tracer"
+ );
+ await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async function () {
+ content.focus();
+ });
+ await waitFor(
+ () => Services.focus.focusedElement == gBrowser.selectedBrowser
+ );
+ is(
+ Services.focus.focusedElement,
+ gBrowser.selectedBrowser,
+ "The tab is still focused before enabling tracing"
+ );
+
+ info("Toggle ON the tracing via the key shortcut from the web page");
+ await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async function () {
+ EventUtils.synthesizeKey(
+ "VK_5",
+ { ctrlKey: true, shiftKey: true },
+ content
+ );
+ });
+
+ info("Wait for tracing to be enabled");
+ await waitForState(dbg, state => {
+ return dbg.selectors.getIsThreadCurrentlyTracing(topLevelThreadActorID);
+ });
+
+ is(
+ Services.focus.focusedElement,
+ gBrowser.selectedBrowser,
+ "The tab is still focused after enabling tracing"
+ );
+
+ info("Toggle it back off, with the same shortcut");
+ await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async function () {
+ EventUtils.synthesizeKey(
+ "VK_5",
+ { ctrlKey: true, shiftKey: true },
+ content
+ );
+ });
+
+ info("Wait for tracing to be disabled");
+ await waitForState(dbg, state => {
+ return !dbg.selectors.getIsThreadCurrentlyTracing(topLevelThreadActorID);
+ });
+});
+
+add_task(async function testPageKeyShortcutWithoutDebugger() {
+ // Ensures that the key shortcut emitted in the content process bubbles up to the parent process
+ await pushPref("test.events.async.enabled", true);
+
+ // Fake DevTools being opened by a real user interaction.
+ // Tests are bypassing DevToolsStartup to open the tools by calling gDevTools directly.
+ // By doing so DevToolsStartup considers itself as uninitialized,
+ // whereas we want it to handle the key shortcut we trigger in this test.
+ const DevToolsStartup = Cc["@mozilla.org/devtools/startup-clh;1"].getService(
+ Ci.nsISupports
+ ).wrappedJSObject;
+ DevToolsStartup.initialized = true;
+ registerCleanupFunction(() => {
+ DevToolsStartup.initialized = false;
+ });
+
+ const toolbox = await openNewTabAndToolbox(
+ "data:text/html,tracer",
+ "webconsole"
+ );
+
+ info(
+ "Focus the page in order to assert that the page keeps the focus when enabling the tracer"
+ );
+ await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async function () {
+ content.focus();
+ });
+ await waitFor(
+ () => Services.focus.focusedElement == gBrowser.selectedBrowser
+ );
+ is(
+ Services.focus.focusedElement,
+ gBrowser.selectedBrowser,
+ "The tab is still focused before enabling tracing"
+ );
+
+ info("Toggle ON the tracing via the key shortcut from the web page");
+ const { resourceCommand } = toolbox.commands;
+ const { onResource: onTracingStateEnabled } =
+ await resourceCommand.waitForNextResource(
+ resourceCommand.TYPES.JSTRACER_STATE,
+ {
+ ignoreExistingResources: true,
+ predicate(resource) {
+ return resource.enabled;
+ },
+ }
+ );
+ await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async function () {
+ EventUtils.synthesizeKey(
+ "VK_5",
+ { ctrlKey: true, shiftKey: true },
+ content
+ );
+ });
+ info("Wait for tracing to be enabled");
+ await onTracingStateEnabled;
+
+ info("Toggle it back off, with the same shortcut");
+ const { onResource: onTracingStateDisabled } =
+ await resourceCommand.waitForNextResource(
+ resourceCommand.TYPES.JSTRACER_STATE,
+ {
+ ignoreExistingResources: true,
+ predicate(resource) {
+ return !resource.enabled;
+ },
+ }
+ );
+ await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async function () {
+ EventUtils.synthesizeKey(
+ "VK_5",
+ { ctrlKey: true, shiftKey: true },
+ content
+ );
+ });
+
+ info("Wait for tracing to be disabled");
+ await onTracingStateDisabled;
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-keyboard-navigation.js b/devtools/client/debugger/test/mochitest/browser_dbg-keyboard-navigation.js
new file mode 100644
index 0000000000..21d911a2cd
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-keyboard-navigation.js
@@ -0,0 +1,41 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests that keyboard navigation into and out of debugger code editor
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-scripts.html", "simple2.js");
+ const doc = dbg.win.document;
+
+ await selectSource(dbg, "simple2.js");
+
+ await waitForElementWithSelector(dbg, ".CodeMirror");
+ findElementWithSelector(dbg, ".CodeMirror").focus();
+
+ // Enter code editor
+ pressKey(dbg, "Enter");
+ is(
+ findElementWithSelector(dbg, "textarea"),
+ doc.activeElement,
+ "Editor is enabled"
+ );
+
+ // Exit code editor and focus on container
+ pressKey(dbg, "Escape");
+ is(
+ findElementWithSelector(dbg, ".CodeMirror"),
+ doc.activeElement,
+ "Focused on container"
+ );
+
+ // Enter code editor
+ pressKey(dbg, "Tab");
+ is(
+ findElementWithSelector(dbg, "textarea"),
+ doc.activeElement,
+ "Editor is enabled"
+ );
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-keyboard-shortcuts-modal.js b/devtools/client/debugger/test/mochitest/browser_dbg-keyboard-shortcuts-modal.js
new file mode 100644
index 0000000000..d293d3d56f
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-keyboard-shortcuts-modal.js
@@ -0,0 +1,49 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Test the keyboard shortcuts modal
+ */
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebuggerWithAbsoluteURL(
+ "data:text/html,Test keyboard shortcuts modal"
+ );
+
+ ok(!getShortcutsModal(dbg), "The shortcuts modal is hidden by default");
+
+ info("Open the modal with the shortcut");
+ pressKeyboardShortcut(dbg);
+
+ const el = await waitFor(() => getShortcutsModal(dbg));
+ const sections = [...el.querySelectorAll(".shortcuts-section h2")].map(
+ h2 => h2.textContent
+ );
+ is(
+ JSON.stringify(sections),
+ JSON.stringify(["Editor", "Stepping", "Search"]),
+ "The modal has the expected sections"
+ );
+
+ info("Close the modal with the shortcut");
+ pressKeyboardShortcut(dbg);
+ await waitFor(() => !getShortcutsModal(dbg));
+ ok(true, "The modal was closed");
+});
+
+function getShortcutsModal(dbg) {
+ return findElementWithSelector(dbg, ".shortcuts-modal");
+}
+
+function pressKeyboardShortcut(dbg) {
+ EventUtils.synthesizeKey(
+ "/",
+ {
+ [Services.appinfo.OS === "Darwin" ? "metaKey" : "ctrlKey"]: true,
+ },
+ dbg.win
+ );
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-keyboard-shortcuts.js b/devtools/client/debugger/test/mochitest/browser_dbg-keyboard-shortcuts.js
new file mode 100644
index 0000000000..67fa1d397e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-keyboard-shortcuts.js
@@ -0,0 +1,58 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Test keyboard shortcuts.
+ */
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-debugger-statements.html");
+
+ const onReloaded = reload(dbg);
+ await waitForPaused(dbg);
+ await waitForLoadedSource(dbg, "doc-debugger-statements.html");
+ const source = findSource(dbg, "doc-debugger-statements.html");
+ assertPausedAtSourceAndLine(dbg, source.id, 11);
+
+ await pressResume(dbg);
+ assertPausedAtSourceAndLine(dbg, source.id, 16);
+
+ await pressStepOver(dbg);
+ assertPausedAtSourceAndLine(dbg, source.id, 17);
+
+ await pressStepIn(dbg);
+ assertPausedAtSourceAndLine(dbg, source.id, 22);
+
+ await pressStepOut(dbg);
+ assertPausedAtSourceAndLine(dbg, source.id, 18);
+
+ await pressStepOver(dbg);
+ assertPausedAtSourceAndLine(dbg, source.id, 18);
+
+ await resume(dbg);
+ info("Wait for reload to complete after resume");
+ await onReloaded;
+});
+
+function pressResume(dbg) {
+ pressKey(dbg, "resumeKey");
+ return waitForPaused(dbg);
+}
+
+function pressStepOver(dbg) {
+ pressKey(dbg, "stepOverKey");
+ return waitForPaused(dbg);
+}
+
+function pressStepIn(dbg) {
+ pressKey(dbg, "stepInKey");
+ return waitForPaused(dbg);
+}
+
+function pressStepOut(dbg) {
+ pressKey(dbg, "stepOutKey");
+ return waitForPaused(dbg);
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-layout-changes.js b/devtools/client/debugger/test/mochitest/browser_dbg-layout-changes.js
new file mode 100644
index 0000000000..609879c7b1
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-layout-changes.js
@@ -0,0 +1,94 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * This if the debugger's layout is correctly modified when the toolbox's
+ * host changes.
+ */
+
+"use strict";
+
+requestLongerTimeout(2);
+
+let gDefaultHostType = Services.prefs.getCharPref("devtools.toolbox.host");
+
+add_setup(async function () {
+ // Disable window occlusion. See bug 1733955 / bug 1779559.
+ if (navigator.platform.indexOf("Win") == 0) {
+ await SpecialPowers.pushPrefEnv({
+ set: [["widget.windows.window_occlusion_tracking.enabled", false]],
+ });
+ }
+});
+
+add_task(async function () {
+ // test is too slow on some platforms due to the number of test cases
+ const dbg = await initDebugger("doc-iframes.html");
+
+ const layouts = [
+ ["vertical", "window:small"],
+ ["horizontal", "bottom"],
+ ["vertical", "right"],
+ ["horizontal", "window:big"],
+ ];
+
+ for (const layout of layouts) {
+ const [orientation, host] = layout;
+ await testLayout(dbg, orientation, host);
+ }
+
+ ok(true, "Orientations are correct");
+});
+
+async function testLayout(dbg, orientation, host) {
+ info(`Switching to ${host} ${orientation}.`);
+
+ await switchHost(dbg, host);
+ await resizeToolboxWindow(dbg, host);
+ return waitForState(
+ dbg,
+ state => dbg.selectors.getOrientation() == orientation
+ );
+}
+
+function getHost(host) {
+ if (host.indexOf("window") == 0) {
+ return "window";
+ }
+ return host;
+}
+
+async function switchHost(dbg, hostType) {
+ const { toolbox } = dbg;
+ await toolbox.switchHost(getHost(hostType));
+}
+
+function resizeToolboxWindow(dbg, host) {
+ const { toolbox } = dbg;
+ const sizeOption = host.split(":")[1];
+ if (!sizeOption) {
+ return;
+ }
+
+ const win = toolbox.win.parent;
+
+ let breakpoint = 800;
+ if (sizeOption == "big" && win.outerWidth <= breakpoint) {
+ breakpoint += 300;
+ } else if (sizeOption == "small" && win.outerWidth >= breakpoint) {
+ breakpoint -= 300;
+ }
+ resizeWindow(dbg, breakpoint);
+}
+
+function resizeWindow(dbg, width) {
+ const { toolbox } = dbg;
+ const win = toolbox.win.parent;
+ win.resizeTo(width, window.screen.availHeight);
+}
+
+registerCleanupFunction(function () {
+ Services.prefs.setCharPref("devtools.toolbox.host", gDefaultHostType);
+ gDefaultHostType = null;
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-link-reload.js b/devtools/client/debugger/test/mochitest/browser_dbg-link-reload.js
new file mode 100644
index 0000000000..c374fc6bba
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-link-reload.js
@@ -0,0 +1,65 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Test reload via an href link, which refers to the same document.
+ * It seems to cause different codepath compared to F5.
+ */
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger(
+ "doc-reload-link.html",
+ "doc-reload-link.html"
+ );
+
+ info("Add a breakpoint that will be hit on reload");
+ await addBreakpoint(dbg, "doc-reload-link.html", 3);
+
+ for (let i = 0; i < 5; i++) {
+ const onReloaded = waitForReload(dbg.commands);
+
+ info(
+ "Reload via a link, this causes special race condition different from F5"
+ );
+ await SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () {
+ const reloadLink = content.document.querySelector("a");
+ reloadLink.click();
+ });
+
+ info("Wait for paused\n");
+ await waitForPaused(dbg);
+
+ info("Check paused location\n");
+ const source = findSource(dbg, "doc-reload-link.html");
+ assertPausedAtSourceAndLine(dbg, source.id, 3);
+
+ await resume(dbg);
+
+ info("Wait for completion of the page load");
+ // This help ensure that the page loaded correctly and prevent pending request at teardown
+ await onReloaded;
+ }
+});
+
+async function waitForReload(commands) {
+ let resolve;
+ const onReloaded = new Promise(r => (resolve = r));
+ const { resourceCommand } = commands;
+ const { DOCUMENT_EVENT } = resourceCommand.TYPES;
+ const onAvailable = resources => {
+ if (resources.find(resource => resource.name == "dom-complete")) {
+ resourceCommand.unwatchResources([DOCUMENT_EVENT], { onAvailable });
+ resolve();
+ }
+ };
+ // Wait for watchResources completion before reloading, otherwise we might miss the dom-complete event
+ // if watchResources is still pending while the reload already started and finished loading the document early.
+ await resourceCommand.watchResources([DOCUMENT_EVENT], {
+ onAvailable,
+ ignoreExistingResources: true,
+ });
+ return onReloaded;
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-log-events.js b/devtools/client/debugger/test/mochitest/browser_dbg-log-events.js
new file mode 100644
index 0000000000..6ce0acbc77
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-log-events.js
@@ -0,0 +1,25 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/*
+ * Tests that we can log event listeners calls
+ */
+
+"use strict";
+
+add_task(async function () {
+ Services.prefs.setBoolPref("devtools.toolbox.splitconsoleEnabled", true);
+ const dbg = await initDebugger(
+ "doc-event-breakpoints.html",
+ "event-breakpoints.js"
+ );
+
+ await clickElement(dbg, "logEventsCheckbox");
+ await dbg.actions.addEventListenerBreakpoints(["event.mouse.click"]);
+ clickElementInTab("#click-target");
+
+ await hasConsoleMessage(dbg, "click");
+ await waitForRequestsToSettle(dbg);
+ ok(true);
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-log-point-mapping.js b/devtools/client/debugger/test/mochitest/browser_dbg-log-point-mapping.js
new file mode 100644
index 0000000000..67886672b6
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-log-point-mapping.js
@@ -0,0 +1,43 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/*
+ * Tests that expressions in log points are source mapped.
+ */
+
+"use strict";
+
+add_task(async function () {
+ Services.prefs.setBoolPref("devtools.toolbox.splitconsoleEnabled", true);
+ await pushPref("devtools.debugger.map-scopes-enabled", true);
+
+ const dbg = await initDebugger("doc-sourcemaps3.html", "test.js");
+
+ const source = findSource(dbg, "test.js");
+ await selectSource(dbg, "test.js");
+
+ await getDebuggerSplitConsole(dbg);
+
+ await addBreakpoint(dbg, "test.js", 6);
+ await waitForBreakpoint(dbg, "test.js", 6);
+
+ await dbg.actions.addBreakpoint(createLocation({ line: 5, source }), {
+ logValue: "`value: ${JSON.stringify(test)}`",
+ requiresMapping: true,
+ });
+ await waitForBreakpoint(dbg, "test.js", 5);
+
+ invokeInTab("test");
+
+ await waitForPaused(dbg);
+
+ await hasConsoleMessage(dbg, "value:");
+ const { value } = await findConsoleMessage(dbg, "value:");
+ is(
+ value,
+ 'value: ["b (30)","a","b (5)","z"]',
+ "Variables in logpoint expression should be mapped"
+ );
+ await resume(dbg);
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-log-points-workers.js b/devtools/client/debugger/test/mochitest/browser_dbg-log-points-workers.js
new file mode 100644
index 0000000000..aa52904d31
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-log-points-workers.js
@@ -0,0 +1,30 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/*
+ * Tests that log points in a worker are correctly logged to the console
+ */
+
+"use strict";
+
+add_task(async function () {
+ Services.prefs.setBoolPref("devtools.toolbox.splitconsoleEnabled", true);
+
+ const dbg = await initDebugger("doc-windowless-workers.html");
+
+ await waitForSource(dbg, "simple-worker.js");
+ await selectSource(dbg, "simple-worker.js");
+
+ await altClickElement(dbg, "gutter", 4);
+ await waitForBreakpoint(dbg, "simple-worker.js", 4);
+
+ await getDebuggerSplitConsole(dbg);
+ await hasConsoleMessage(dbg, "timer");
+ const { link } = await findConsoleMessage(dbg, "timer");
+ is(
+ link,
+ "simple-worker.js:4:9",
+ "message should include the url and linenumber"
+ );
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-log-points.js b/devtools/client/debugger/test/mochitest/browser_dbg-log-points.js
new file mode 100644
index 0000000000..d265caa0ad
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-log-points.js
@@ -0,0 +1,93 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/*
+ * Tests that log points are correctly logged to the console
+ */
+
+"use strict";
+
+add_task(async function () {
+ Services.prefs.setBoolPref("devtools.toolbox.splitconsoleEnabled", true);
+ const dbg = await initDebugger(
+ "doc-script-switching.html",
+ "script-switching-01.js"
+ );
+
+ const source = findSource(dbg, "script-switching-01.js");
+ await selectSource(dbg, "script-switching-01.js");
+
+ await getDebuggerSplitConsole(dbg);
+
+ info(
+ `Add a first log breakpoint with no argument, which will log "display name", i.e. firstCall`
+ );
+ await altClickElement(dbg, "gutter", 7);
+ await waitForBreakpoint(dbg, "script-switching-01.js", 7);
+
+ info("Add another log breakpoint with static arguments");
+ await dbg.actions.addBreakpoint(createLocation({ line: 8, source }), {
+ logValue: "'a', 'b', 'c'",
+ });
+
+ invokeInTab("firstCall");
+ await waitForPaused(dbg);
+
+ info("Wait for the two log breakpoints");
+ await hasConsoleMessage(dbg, "firstCall");
+ await hasConsoleMessage(dbg, "a b c");
+
+ const { link, value } = await findConsoleMessage(dbg, "a b c");
+ is(link, "script-switching-01.js:8:2", "logs should have the relevant link");
+ is(value, "a b c", "logs should have multiple values");
+ await removeBreakpoint(dbg, source.id, 7);
+ await removeBreakpoint(dbg, source.id, 8);
+
+ await resume(dbg);
+
+ info(
+ "Now set a log point calling a method with a debugger statement and a breakpoint, it shouldn't pause on the log point"
+ );
+ await addBreakpoint(dbg, "script-switching-01.js", 8);
+ await addBreakpoint(dbg, "script-switching-01.js", 7);
+ await dbg.actions.addBreakpoint(createLocation({ line: 7, source }), {
+ logValue: "'second call', secondCall()",
+ });
+
+ invokeInTab("firstCall");
+ await waitForPaused(dbg);
+ // We aren't pausing on secondCall's debugger statement,
+ // called by the condition, but only on the breakpoint we set on firstCall, line 8
+ assertPausedAtSourceAndLine(dbg, source.id, 8);
+
+ // The log point is visible, even if it had a debugger statement in it.
+ await hasConsoleMessage(dbg, "second call 44");
+ await removeBreakpoint(dbg, source.id, 7);
+ await removeBreakpoint(dbg, source.id, 8);
+
+ await resume(dbg);
+ // Resume a second time as we are hittin the debugger statement as firstCall calls secondCall
+ await resume(dbg);
+
+ info(
+ "Set a log point throwing an exception and ensure the exception is displayed"
+ );
+ await dbg.actions.addBreakpoint(createLocation({ line: 7, source }), {
+ logValue: "jsWithError(",
+ });
+ invokeInTab("firstCall");
+ await waitForPaused(dbg);
+ // Exceptions in conditional breakpoint would not trigger a pause,
+ // So we end up pausing on the debugger statement in the other script.
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "script-switching-02.js").id,
+ 6
+ );
+
+ // But verify that the exception message is visible even if we didn't pause.
+ // As the logValue is evaled within an array `[${logValue}]`,
+ // the exception message is a bit cryptic...
+ await hasConsoleMessage(dbg, "expected expression, got ']'");
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-many-breakpoints-same-line.js b/devtools/client/debugger/test/mochitest/browser_dbg-many-breakpoints-same-line.js
new file mode 100644
index 0000000000..d6d1fc30c7
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-many-breakpoints-same-line.js
@@ -0,0 +1,93 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test settings multiple types of breakpoints on the same line
+// Only the last should be used
+
+"use strict";
+
+// Line where we set a breakpoint in simple2.js
+const BREAKPOINT_LINE = 5;
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-scripts.html", "simple2.js");
+
+ await selectSource(dbg, "simple2.js");
+ await waitForSelectedSource(dbg, "simple2.js");
+
+ await testSimpleAndLog(dbg);
+
+ await testLogUpdates(dbg);
+});
+
+async function testSimpleAndLog(dbg) {
+ info("Add a simple breakpoint");
+ await addBreakpoint(dbg, "simple2.js", BREAKPOINT_LINE);
+
+ info("Add a log breakpoint, replacing the breakpoint into a logpoint");
+ await setLogPoint(dbg, BREAKPOINT_LINE, "`log point ${x}`");
+ await waitForLog(dbg, "`log point ${x}`");
+ await assertLogBreakpoint(dbg, BREAKPOINT_LINE);
+
+ const bp = findBreakpoint(dbg, "simple2.js", BREAKPOINT_LINE);
+ is(
+ bp.options.logValue,
+ "`log point ${x}`",
+ "log breakpoint value is correct"
+ );
+
+ info(
+ "Eval foo() and trigger the breakpoints. If this freeze here, it means that the log point has been ignored."
+ );
+ await SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () {
+ content.wrappedJSObject.foo(42);
+ });
+
+ info(
+ "Wait for the log-point message. Only log-point breakpoint should work."
+ );
+
+ await waitForMessageByType(dbg, "log point 42", ".logPoint");
+
+ const source = findSource(dbg, "simple2.js");
+ await removeBreakpoint(dbg, source.id, BREAKPOINT_LINE);
+}
+
+async function testLogUpdates(dbg) {
+ info("Add a log breakpoint");
+ await setLogPoint(dbg, BREAKPOINT_LINE, "`log point`");
+ await waitForLog(dbg, "`log point`");
+ await assertLogBreakpoint(dbg, BREAKPOINT_LINE);
+
+ const bp = findBreakpoint(dbg, "simple2.js", BREAKPOINT_LINE);
+ is(bp.options.logValue, "`log point`", "log breakpoint value is correct");
+
+ info("Edit the log breakpoint");
+ await setLogPoint(dbg, BREAKPOINT_LINE, " + ` edited`");
+ await waitForLog(dbg, "`log point` + ` edited`");
+ await assertLogBreakpoint(dbg, BREAKPOINT_LINE);
+
+ const bp2 = findBreakpoint(dbg, "simple2.js", BREAKPOINT_LINE);
+ is(
+ bp2.options.logValue,
+ "`log point` + ` edited`",
+ "log breakpoint value is correct"
+ );
+
+ info("Eval foo() and trigger the breakpoints");
+ await SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () {
+ content.wrappedJSObject.foo();
+ });
+
+ info("Wait for the log-point message. Only the edited one should appear");
+ await waitForMessageByType(dbg, "log point edited", ".logPoint");
+}
+
+async function waitForMessageByType(dbg, msg, typeSelector) {
+ const webConsolePanel = await getDebuggerSplitConsole(dbg);
+ const hud = webConsolePanel.hud;
+ return waitFor(
+ async () => !!findMessagesByType(hud, msg, typeSelector).length
+ );
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-merge-scopes.js b/devtools/client/debugger/test/mochitest/browser_dbg-merge-scopes.js
new file mode 100644
index 0000000000..48dfd26a48
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-merge-scopes.js
@@ -0,0 +1,51 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test that adjacent scopes are merged together as expected.
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-merge-scopes.html");
+
+ invokeInTab("run");
+ await waitForPaused(dbg, "doc-merge-scopes.html");
+
+ // Function body and function lexical scopes are merged together.
+ expectLabels(dbg, ["first", "<this>", "arguments", "x", "y", "z"]);
+
+ await resume(dbg);
+ await waitForPaused(dbg);
+
+ // Function body and inner lexical scopes are not merged together.
+ await toggleScopeNode(dbg, 4);
+ expectLabels(dbg, ["Block", "<this>", "y", "second", "arguments", "x"]);
+
+ await resume(dbg);
+ await waitForPaused(dbg);
+
+ // When there is a function body, function lexical, and inner lexical scope,
+ // the first two are merged together.
+ await toggleScopeNode(dbg, 4);
+ expectLabels(dbg, [
+ "Block",
+ "<this>",
+ "z",
+ "third",
+ "arguments",
+ "v",
+ "x",
+ "y",
+ ]);
+});
+
+function expectLabels(dbg, array) {
+ for (let i = 0; i < array.length; i++) {
+ is(
+ getScopeNodeLabel(dbg, i + 1),
+ array[i],
+ `Correct label ${array[i]} for index ${i + 1}`
+ );
+ }
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-message-run-to-completion.js b/devtools/client/debugger/test/mochitest/browser_dbg-message-run-to-completion.js
new file mode 100644
index 0000000000..a168c9233d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-message-run-to-completion.js
@@ -0,0 +1,24 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test that messages from postMessage calls are not delivered while paused in
+// the debugger.
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-message-run-to-completion.html");
+ invokeInTab("test", "doc-message-run-to-completion.html");
+ await waitForPaused(dbg);
+ let result = await dbg.client.evaluate("event.data");
+ is(result.result, "first", "first message delivered in order");
+ await resume(dbg);
+ await waitForPaused(dbg);
+ result = await dbg.client.evaluate("event.data");
+ is(result.result, "second", "second message delivered in order");
+ await resume(dbg);
+ await waitForPaused(dbg);
+ result = await dbg.client.evaluate("event.data");
+ is(result.result, "third", "third message delivered in order");
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-minified.js b/devtools/client/debugger/test/mochitest/browser_dbg-minified.js
new file mode 100644
index 0000000000..1a15d1588a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-minified.js
@@ -0,0 +1,25 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests minfied + source maps.
+
+"use strict";
+
+add_task(async function () {
+ await pushPref("devtools.debugger.map-scopes-enabled", true);
+ const dbg = await initDebugger("doc-minified2.html", "sum.js");
+
+ await selectSource(dbg, "sum.js");
+ await addBreakpoint(dbg, "sum.js", 2);
+
+ invokeInTab("test");
+ await waitForPaused(dbg);
+
+ is(getScopeNodeLabel(dbg, 1), "sum", "check scope label");
+ is(getScopeNodeLabel(dbg, 2), "first", "check scope label");
+ is(getScopeNodeValue(dbg, 2), "40", "check scope value");
+ is(getScopeNodeLabel(dbg, 3), "second", "check scope label");
+ is(getScopeNodeValue(dbg, 3), "2", "check scope value");
+ is(getScopeNodeLabel(dbg, 4), "Window", "check scope label");
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-navigation-when-paused.js b/devtools/client/debugger/test/mochitest/browser_dbg-navigation-when-paused.js
new file mode 100644
index 0000000000..9af7228527
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-navigation-when-paused.js
@@ -0,0 +1,42 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-navigation-when-paused.html");
+
+ await togglePauseOnExceptions(dbg, true, true);
+
+ clickElementInTab("body");
+
+ await waitForPaused(dbg, "doc-navigation-when-paused.html");
+
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "doc-navigation-when-paused.html").id,
+ 12
+ );
+
+ await navigate(
+ dbg,
+ "doc-navigation-when-paused.html",
+ "doc-navigation-when-paused.html"
+ );
+
+ clickElementInTab("body");
+
+ await waitForPaused(dbg, "doc-navigation-when-paused.html");
+
+ // If breakpoints aren't properly ignored after navigation, this could
+ // potentially pause at line 9. This helper also ensures that the file
+ // source itself has loaded, which may not be the case if navigation cleared
+ // the source and nothing has sent it to the devtools client yet, as was
+ // the case in Bug 1581530.
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "doc-navigation-when-paused.html").id,
+ 12
+ );
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-navigation.js b/devtools/client/debugger/test/mochitest/browser_dbg-navigation.js
new file mode 100644
index 0000000000..6cf5c0ec5f
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-navigation.js
@@ -0,0 +1,73 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+const SOURCES = [
+ "simple1.js",
+ "simple2.js",
+ "simple3.js",
+ "long.js",
+ "doc-scripts.html",
+];
+
+/**
+ * Test navigating
+ * navigating while paused will reset the pause state and sources
+ */
+add_task(async function () {
+ const dbg = await initDebugger("doc-script-switching.html");
+ const {
+ selectors: { getSelectedSource, getIsPaused, getCurrentThread },
+ } = dbg;
+ ok(getCurrentThread(), "We get a thread selected on debugger opening");
+
+ info("Pause in the first document");
+ invokeInTab("firstCall");
+ await waitForPaused(dbg);
+
+ info("Navigate while being paused in the first document");
+ await navigate(dbg, "doc-scripts.html", "simple1.js");
+ ok(
+ getCurrentThread(),
+ "The new top level thread is selected after navigation"
+ );
+
+ info("Set a breakpoint on the second document and pause on it");
+ await selectSource(dbg, "simple1.js");
+ await addBreakpoint(dbg, "simple1.js", 4);
+ invokeInTab("main");
+ await waitForPaused(dbg);
+ const source = findSource(dbg, "simple1.js");
+ assertPausedAtSourceAndLine(dbg, source.id, 4);
+ is(countSources(dbg), 5, "5 sources are loaded.");
+
+ await waitForRequestsToSettle(dbg);
+ let onBreakpoint = waitForDispatch(dbg.store, "SET_BREAKPOINT");
+ await navigate(dbg, "doc-scripts.html", ...SOURCES);
+ await onBreakpoint;
+ is(countSources(dbg), 5, "5 sources are loaded.");
+ ok(!getIsPaused(getCurrentThread()), "Is not paused");
+
+ await waitForRequestsToSettle(dbg);
+ onBreakpoint = waitForDispatch(dbg.store, "SET_BREAKPOINT");
+ await navigate(dbg, "doc-scripts.html", ...SOURCES);
+ await onBreakpoint;
+ is(countSources(dbg), 5, "5 sources are loaded.");
+
+ info("Test that the current selected source persists across reloads");
+ await selectSource(dbg, "long.js");
+
+ await waitForRequestsToSettle(dbg);
+ onBreakpoint = waitForDispatch(dbg.store, "SET_BREAKPOINT");
+ await reload(dbg, "long.js");
+ await onBreakpoint;
+ await waitForSelectedSource(dbg, "long.js");
+
+ ok(getSelectedSource().url.includes("long.js"), "Selected source is long.js");
+});
+
+function countSources(dbg) {
+ return dbg.selectors.getSourceCount();
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-no-duplicate-breakpoints-on-frame-reload.js b/devtools/client/debugger/test/mochitest/browser_dbg-no-duplicate-breakpoints-on-frame-reload.js
new file mode 100644
index 0000000000..22143adf44
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-no-duplicate-breakpoints-on-frame-reload.js
@@ -0,0 +1,101 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// This tests makes sure that on reload of a remote iframe, there
+// are no duplicated breakpoints. The test case relates to a specific
+// issue in Bug 1728587
+"use strict";
+
+add_task(async function () {
+ // With fission and EFT disabled all the sources are going to be under the Main Thread
+ // and this sceanrio becomes irrelevant
+ if (!isFissionEnabled() && !isEveryFrameTargetEnabled()) {
+ return;
+ }
+
+ const dbg = await initDebugger(
+ "doc_dbg-fission-frame-sources.html",
+ "simple2.js"
+ );
+
+ info(
+ "Open a tab for a source in the top document to assert it doesn't disappear"
+ );
+ await selectSource(dbg, "simple1.js");
+
+ info("Add breakpoint to the source (simple2.js) in the remote frame");
+ await selectSource(dbg, "simple2.js");
+ await addBreakpoint(dbg, "simple2.js", 3);
+
+ is(dbg.selectors.getBreakpointCount(), 1, "Only one breakpoint exists");
+
+ const source = findSource(dbg, "simple2.js");
+ assertBreakpointsList(dbg, source);
+
+ is(
+ countTabs(dbg),
+ 2,
+ "We see the tabs for the sources of both top and iframe documents"
+ );
+
+ const onBreakpointSet = waitForDispatch(dbg.store, "SET_BREAKPOINT");
+
+ info("reload the iframe");
+ const iframeBrowsingContext = await SpecialPowers.spawn(
+ gBrowser.selectedBrowser,
+ [],
+ function () {
+ const iframe = content.document.querySelector("iframe");
+ return iframe.browsingContext;
+ }
+ );
+ await SpecialPowers.spawn(iframeBrowsingContext, [], () => {
+ content.location.reload();
+ });
+
+ await onBreakpointSet;
+
+ await waitForSelectedSource(dbg, "simple2.js");
+
+ is(dbg.selectors.getBreakpointCount(), 1, "Only one breakpoint still exists");
+
+ const sourceAfterReload = findSource(dbg, "simple2.js");
+ assertBreakpointsList(dbg, sourceAfterReload);
+
+ is(countTabs(dbg), 2, "We still see the tabs for the two sources");
+
+ await removeBreakpoint(dbg, sourceAfterReload.id, 3);
+});
+
+function assertBreakpointsList(dbg, source) {
+ const breakpointHeadings = findAllElements(dbg, "breakpointHeadings");
+ const breakpointItems = findAllElements(dbg, "breakpointItems");
+
+ is(
+ breakpointHeadings.length,
+ 1,
+ "The breakpoint list show one breakpoint source"
+ );
+ is(
+ breakpointItems.length,
+ 1,
+ "The breakpoint list shows only one breakpoint"
+ );
+
+ is(
+ breakpointHeadings[0].title,
+ source.url,
+ "The info displayed for the breakpoint tooltip of the 1st breakpoint is correct"
+ );
+ is(
+ breakpointHeadings[0].textContent,
+ "simple2.js",
+ "The info displayed for the breakpoint heading of the 1st breakpoint is correct"
+ );
+ is(
+ breakpointItems[0].textContent,
+ "return x + y;3:5",
+ "The info displayed for the 1st breakpoint is correct"
+ );
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-old-breakpoint.js b/devtools/client/debugger/test/mochitest/browser_dbg-old-breakpoint.js
new file mode 100644
index 0000000000..bee9084f27
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-old-breakpoint.js
@@ -0,0 +1,111 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test that we show a breakpoint in the UI when there is an old pending
+// breakpoint with an invalid original location.
+
+"use strict";
+
+add_task(async function () {
+ clearDebuggerPreferences();
+
+ const pending = {
+ bp1: {
+ location: {
+ sourceId: "",
+ sourceUrl: `${EXAMPLE_URL}nowhere2.js`,
+ line: 5,
+ column: 0,
+ },
+ generatedLocation: {
+ sourceUrl: `${EXAMPLE_URL}simple1.js`,
+ line: 4,
+ column: 0,
+ },
+ options: {},
+ disabled: false,
+ },
+ bp2: {
+ location: {
+ sourceId: "",
+ sourceUrl: `${EXAMPLE_URL}nowhere.js`,
+ line: 5,
+ column: 0,
+ },
+ generatedLocation: {
+ sourceUrl: `${EXAMPLE_URL}simple3.js`,
+ line: 2,
+ column: 0,
+ },
+ options: {},
+ disabled: false,
+ },
+ };
+ asyncStorage.setItem("debugger.pending-breakpoints", pending);
+
+ const toolbox = await openNewTabAndToolbox(
+ `${EXAMPLE_URL}doc-scripts.html`,
+ "jsdebugger"
+ );
+ const dbg = createDebuggerContext(toolbox);
+ const onBreakpoint = waitForDispatch(dbg.store, "SET_BREAKPOINT", 2);
+
+ // Pending breakpoints are installed asynchronously, keep invoking the entry
+ // function until the debugger pauses.
+ await waitUntil(() => {
+ invokeInTab("main");
+ return isPaused(dbg);
+ });
+ await onBreakpoint;
+
+ ok(true, "paused at unmapped breakpoint");
+ await waitForState(
+ dbg,
+ state => dbg.selectors.getBreakpointCount(state) == 2
+ );
+ ok(true, "unmapped breakpoints shown in UI");
+});
+
+// Test that if we show a breakpoint with an old generated location, it is
+// removed after we load the original source and find the new generated
+// location.
+add_task(async function () {
+ clearDebuggerPreferences();
+
+ const pending = {
+ bp1: {
+ location: {
+ sourceId: "",
+ sourceUrl: "webpack:///entry.js",
+ line: 15,
+ column: 0,
+ },
+ generatedLocation: {
+ sourceUrl: `${EXAMPLE_URL}sourcemaps/bundle.js`,
+ line: 47,
+ column: 16,
+ },
+ options: {},
+ disabled: false,
+ },
+ };
+ asyncStorage.setItem("debugger.pending-breakpoints", pending);
+
+ const toolbox = await openNewTabAndToolbox(
+ `${EXAMPLE_URL}doc-sourcemaps.html`,
+ "jsdebugger"
+ );
+ const dbg = createDebuggerContext(toolbox);
+
+ await waitForState(dbg, state => {
+ const bps = dbg.selectors.getBreakpointsList(state);
+ return (
+ bps.length == 1 &&
+ bps[0].location.source.url.includes("entry.js") &&
+ bps[0].location.line == 15
+ );
+ });
+ ok(true, "removed old breakpoint during sync");
+ await waitForRequestsToSettle(dbg);
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-outline-filter.js b/devtools/client/debugger/test/mochitest/browser_dbg-outline-filter.js
new file mode 100644
index 0000000000..a60dc72070
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-outline-filter.js
@@ -0,0 +1,82 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests the outline pane fuzzy filtering of outline items
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-scripts.html", "long.js");
+ await selectSource(dbg, "long.js", 1);
+ await openOutlinePanel(dbg);
+
+ // turn off alphetical sort if active
+ const alphabetizeButton = findElementWithSelector(
+ dbg,
+ ".outline-footer button"
+ );
+ if (alphabetizeButton.className === "active") {
+ alphabetizeButton.click();
+ }
+
+ const outlineFilter = findElementWithSelector(dbg, ".outline-filter-input");
+ ok(outlineFilter, "Outline filter is present");
+
+ outlineFilter.blur();
+ ok(
+ !findElementWithSelector(dbg, ".outline-filter-input.focused"),
+ "does not have class focused when not focused"
+ );
+
+ outlineFilter.focus();
+ ok(
+ findElementWithSelector(dbg, ".outline-filter-input.focused"),
+ "has class focused when focused"
+ );
+
+ is(getItems(dbg).length, 9, "9 items in the unfiltered list");
+
+ // filter all items starting with t
+ type(dbg, "t");
+ is(getItems(dbg).length, 4, "4 items in the list after 't' filter");
+ ok(getItems(dbg)[0].textContent.includes("TodoModel(key)"), "item TodoModel");
+ ok(
+ getItems(dbg)[1].textContent.includes("toggleAll(checked)"),
+ "item toggleAll"
+ );
+ ok(
+ getItems(dbg)[2].textContent.includes("toggle(todoToToggle)"),
+ "item toggle"
+ );
+ ok(getItems(dbg)[3].textContent.includes("testModel()"), "item testModel");
+
+ // filter using term 'tog'
+ type(dbg, "og");
+ is(getItems(dbg).length, 2, "2 items in the list after 'tog' filter");
+ ok(
+ getItems(dbg)[0].textContent.includes("toggleAll(checked)"),
+ "item toggleAll"
+ );
+ ok(
+ getItems(dbg)[1].textContent.includes("toggle(todoToToggle)"),
+ "item toggle"
+ );
+
+ pressKey(dbg, "Escape");
+ is(getItems(dbg).length, 9, "9 items in the list after escape pressed");
+
+ // Ensure no action is taken when Enter key is pressed
+ pressKey(dbg, "Enter");
+ is(getItems(dbg).length, 9, "9 items in the list after enter pressed");
+
+ // check that the term 'todo' includes items with todo
+ type(dbg, "todo");
+ is(getItems(dbg).length, 2, "2 items in the list after 'todo' filter");
+ ok(getItems(dbg)[0].textContent.includes("TodoModel(key)"), "item TodoModel");
+ ok(getItems(dbg)[1].textContent.includes("addTodo(title)"), "item addTodo");
+});
+
+function getItems(dbg) {
+ return findAllElements(dbg, "outlineItems");
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-outline-focus.js b/devtools/client/debugger/test/mochitest/browser_dbg-outline-focus.js
new file mode 100644
index 0000000000..beb2baf77e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-outline-focus.js
@@ -0,0 +1,82 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests that after clicking a function in edtior, outline focuses that function
+
+"use strict";
+
+// Tests that after clicking a function in edtior, outline focuses that function
+add_task(async function () {
+ const dbg = await initDebugger("doc-sources.html", "long.js");
+
+ await selectSource(dbg, "long.js", 1);
+ await openOutlinePanel(dbg);
+
+ is(
+ findAllElements(dbg, "outlineItems").length,
+ 9,
+ "9 items in the outline list"
+ );
+
+ info("Clicking inside a function in editor should focus the outline");
+ await clickAtPos(dbg, { line: 15, column: 3 });
+ await waitForElementWithSelector(dbg, ".outline-list__element.focused");
+ ok(
+ getFocusedFunction(dbg).includes("addTodo"),
+ "The right function is focused"
+ );
+
+ info("Clicking an empty line in the editor should unfocus the outline");
+ await clickAtPos(dbg, { line: 13, column: 3 });
+ is(getFocusedNode(dbg), null, "should not exist");
+});
+
+// Tests that clicking a function in outline panel, the editor highlights the correct location.
+add_task(async function () {
+ const dbg = await initDebugger("doc-scripts.html", "simple1.js");
+
+ await selectSource(dbg, "simple1.js", 1);
+
+ await openOutlinePanel(dbg);
+
+ assertOutlineItems(dbg, [
+ "λmain()",
+ "λdoEval()",
+ "λevaledFunc()",
+ "λdoNamedEval()",
+ // evaledFunc is set twice
+ "λevaledFunc()",
+ "class MyClass",
+ "λconstructor(a, b)",
+ "λtest()",
+ "λ#privateFunc(a, b)",
+ "class Klass",
+ "λconstructor()",
+ "λtest()",
+ ]);
+
+ info("Click an item in outline panel");
+ const item = getNthItem(dbg, 3);
+ item.click();
+ await waitForLoadedSource(dbg, "simple1.js");
+ assertHighlightLocation(dbg, "simple1.js", 15);
+ ok(
+ item.parentNode.classList.contains("focused"),
+ "The clicked item li is focused"
+ );
+});
+
+// Clicking on a class heading select the correct class line
+
+function getFocusedNode(dbg) {
+ return findElementWithSelector(dbg, ".outline-list__element.focused");
+}
+
+function getFocusedFunction(dbg) {
+ return getFocusedNode(dbg).innerText;
+}
+
+function getNthItem(dbg, index) {
+ return findElement(dbg, "outlineItem", index);
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-outline-pretty.js b/devtools/client/debugger/test/mochitest/browser_dbg-outline-pretty.js
new file mode 100644
index 0000000000..8275193d27
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-outline-pretty.js
@@ -0,0 +1,30 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests that the length of outline functions for original and pretty printed source matches
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-scripts.html", "simple1.js");
+
+ await selectSource(dbg, "simple1.js");
+ await openOutlinePanel(dbg);
+ const originalSourceOutlineItems = getItems(dbg);
+
+ clickElement(dbg, "prettyPrintButton");
+ await waitForLoadedSource(dbg, "simple1.js:formatted");
+ await waitForElementWithSelector(dbg, ".outline-list");
+ const prettySourceOutlineItems = getItems(dbg);
+
+ is(
+ originalSourceOutlineItems.length,
+ prettySourceOutlineItems.length,
+ "Length of outline functions for both prettyPrint and originalSource same"
+ );
+});
+
+function getItems(dbg) {
+ return findAllElements(dbg, "outlineItems");
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-outline.js b/devtools/client/debugger/test/mochitest/browser_dbg-outline.js
new file mode 100644
index 0000000000..6048a7a92d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-outline.js
@@ -0,0 +1,93 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests that outline panel can sort functions alphabetically.
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-scripts.html", "simple1.js");
+
+ openOutlinePanel(dbg, false);
+
+ is(
+ findAllElements(dbg, "outlineItems").length,
+ 0,
+ " There are no outline items when no source is selected"
+ );
+ is(
+ findElementWithSelector(dbg, ".outline-pane-info").innerText,
+ "No file selected",
+ "The correct message is displayed when there are no outline items"
+ );
+
+ const sourcesTab = findElementWithSelector(dbg, ".sources-tab a");
+ EventUtils.synthesizeMouseAtCenter(sourcesTab, {}, sourcesTab.ownerGlobal);
+ await waitForSourcesInSourceTree(dbg, [], { noExpand: true });
+
+ await selectSource(dbg, "simple1.js", 1);
+
+ await openOutlinePanel(dbg);
+
+ assertOutlineItems(dbg, [
+ "λmain()",
+ "λdoEval()",
+ "λevaledFunc()",
+ "λdoNamedEval()",
+ // evaledFunc is set twice
+ "λevaledFunc()",
+ "class MyClass",
+ "λconstructor(a, b)",
+ "λtest()",
+ "λ#privateFunc(a, b)",
+ "class Klass",
+ "λconstructor()",
+ "λtest()",
+ ]);
+
+ info("Sort the list");
+ findElementWithSelector(dbg, ".outline-footer button").click();
+ // Button becomes active to show alphabetization
+ is(
+ findElementWithSelector(dbg, ".outline-footer button").className,
+ "active",
+ "Alphabetize button is highlighted when active"
+ );
+
+ info("Check that the list was sorted as expected");
+ assertOutlineItems(dbg, [
+ "λdoEval()",
+ "λdoNamedEval()",
+ // evaledFunc is set twice
+ "λevaledFunc()",
+ "λevaledFunc()",
+ "λmain()",
+ "class Klass",
+ "λconstructor()",
+ "λtest()",
+ "class MyClass",
+ "λ#privateFunc(a, b)",
+ "λconstructor(a, b)",
+ "λtest()",
+ ]);
+});
+
+// Test empty panel when source has not function or class symbols
+add_task(async function () {
+ const dbg = await initDebugger("doc-on-load.html", "top-level.js");
+ await selectSource(dbg, "top-level.js", 1);
+
+ openOutlinePanel(dbg, false);
+ await waitFor(
+ () =>
+ dbg.win.document.querySelector(".outline-pane-info").innerText ==
+ "No functions"
+ );
+
+ is(
+ findAllElements(dbg, "outlineItems").length,
+ 0,
+ " There are no outline items when no source is selected"
+ );
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-overrides.js b/devtools/client/debugger/test/mochitest/browser_dbg-overrides.js
new file mode 100644
index 0000000000..48f5893799
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-overrides.js
@@ -0,0 +1,130 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Testing the script overrides feature
+ */
+
+"use strict";
+
+const httpServer = createTestHTTPServer();
+const BASE_URL = `http://localhost:${httpServer.identity.primaryPort}/`;
+
+httpServer.registerContentType("html", "text/html");
+httpServer.registerContentType("js", "application/javascript");
+
+const testSourceContent = `function foo() {
+ console.log("original test script");
+}`;
+
+const testOverrideSourceContent = `function foo() {
+ console.log("overriden test script");
+}
+foo();
+`;
+
+httpServer.registerPathHandler("/index.html", (request, response) => {
+ response.setStatusLine(request.httpVersion, 200, "OK");
+ response.write(`<!DOCTYPE html>
+ <html>
+ <head>
+ <script type="text/javascript" src="/test.js"></script>
+ </head>
+ <body>
+ </body>
+ </html>
+ `);
+});
+
+httpServer.registerPathHandler("/test.js", (request, response) => {
+ response.setHeader("Content-Type", "application/javascript");
+ response.write(testSourceContent);
+});
+
+add_task(async function () {
+ const dbg = await initDebuggerWithAbsoluteURL(
+ BASE_URL + "index.html",
+ "test.js"
+ );
+
+ await waitForSourcesInSourceTree(dbg, ["test.js"], {
+ noExpand: false,
+ });
+
+ info("Load and assert the content of the test.js script");
+ await selectSourceFromSourceTree(
+ dbg,
+ "test.js",
+ 3,
+ "Select the `test.js` script for the tree"
+ );
+ is(
+ getCM(dbg).getValue(),
+ testSourceContent,
+ "The test.js is the original source content"
+ );
+
+ info("Add a breakpoint");
+ await addBreakpoint(dbg, "test.js", 2);
+
+ info("Select test.js tree node, and add override");
+ const MockFilePicker = SpecialPowers.MockFilePicker;
+ MockFilePicker.init(window);
+ const nsiFile = new FileUtils.File(
+ PathUtils.join(PathUtils.tempDir, "test.js")
+ );
+ MockFilePicker.setFiles([nsiFile]);
+ const path = nsiFile.path;
+
+ await triggerSourceTreeContextMenu(
+ dbg,
+ findSourceNodeWithText(dbg, "test.js"),
+ "#node-menu-overrides"
+ );
+
+ info("Wait for `test.js` to be saved to disk and re-write it");
+ await BrowserTestUtils.waitForCondition(() => IOUtils.exists(path));
+ await BrowserTestUtils.waitForCondition(async () => {
+ const { size } = await IOUtils.stat(path);
+ return size > 0;
+ });
+
+ await IOUtils.write(
+ path,
+ new TextEncoder().encode(testOverrideSourceContent)
+ );
+
+ info("Reload and assert `test.js` pause and it overriden source content");
+ const onReloaded = reload(dbg, "test.js");
+ await waitForPaused(dbg);
+
+ assertPausedAtSourceAndLine(dbg, findSource(dbg, "test.js").id, 2);
+ is(
+ getCM(dbg).getValue(),
+ testOverrideSourceContent,
+ "The test.js is the overridden source content"
+ );
+
+ await resume(dbg);
+ await onReloaded;
+
+ info("Remove override and test");
+ const removed = waitForDispatch(dbg.store, "REMOVE_OVERRIDE");
+ await triggerSourceTreeContextMenu(
+ dbg,
+ findSourceNodeWithText(dbg, "test.js"),
+ "#node-menu-overrides"
+ );
+ await removed;
+
+ info("Reload and assert `test.js`'s original source content");
+ await reload(dbg, "test.js");
+ await waitForSelectedSource(dbg, "test.js");
+
+ is(
+ getCM(dbg).getValue(),
+ testSourceContent,
+ "The test.js is the original source content"
+ );
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-pause-exceptions.js b/devtools/client/debugger/test/mochitest/browser_dbg-pause-exceptions.js
new file mode 100644
index 0000000000..eeebb1be3d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-pause-exceptions.js
@@ -0,0 +1,139 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/*
+ Tests Pausing on exception
+ 1. skip an uncaught exception
+ 2. pause on an uncaught exception
+ 3. pause on a caught error
+ 4. skip a caught error
+*/
+
+"use strict";
+
+const { PromiseTestUtils } = ChromeUtils.importESModule(
+ "resource://testing-common/PromiseTestUtils.sys.mjs"
+);
+// This is step 9
+PromiseTestUtils.allowMatchingRejectionsGlobally(/doesntExists is not defined/);
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-exceptions.html", "exceptions.js");
+ const source = findSource(dbg, "exceptions.js");
+
+ info("1. test skipping an uncaught exception");
+ await uncaughtException();
+ assertNotPaused(dbg);
+
+ info("2. Test pausing on an uncaught exception");
+ await togglePauseOnExceptions(dbg, true, true);
+ uncaughtException();
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, source.id, 2);
+
+ const whyPaused = await waitFor(
+ () => dbg.win.document.querySelector(".why-paused")?.innerText
+ );
+ is(whyPaused, `Paused on exception\nunreachable`);
+
+ await resume(dbg);
+
+ info("2.b Test throwing the same uncaught exception pauses again");
+ await togglePauseOnExceptions(dbg, true, true);
+ uncaughtException();
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, source.id, 2);
+ await resume(dbg);
+
+ info("3. Test pausing on a caught Error");
+ caughtException();
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, source.id, 7);
+
+ info("3.b Test pausing in the catch statement");
+ await resume(dbg);
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, source.id, 9);
+ await resume(dbg);
+
+ info("4. Test skipping a caught error");
+ await togglePauseOnExceptions(dbg, true, false);
+ caughtException();
+
+ info("4.b Test pausing in the catch statement");
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, source.id, 9);
+ await resume(dbg);
+
+ await togglePauseOnExceptions(dbg, true, true);
+
+ info("5. Only pause once when throwing deep in the stack");
+ invokeInTab("deepError");
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, source.id, 16);
+ await resume(dbg);
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, source.id, 22);
+ await resume(dbg);
+
+ info("6. Only pause once on an exception when pausing in a finally block");
+ invokeInTab("deepErrorFinally");
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, source.id, 34);
+ await resume(dbg);
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, source.id, 31);
+ await resume(dbg);
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, source.id, 40);
+ await resume(dbg);
+
+ info("7. Only pause once on an exception when it is rethrown from a catch");
+ invokeInTab("deepErrorCatch");
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, source.id, 53);
+ await resume(dbg);
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, source.id, 49);
+ await resume(dbg);
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, source.id, 59);
+ await resume(dbg);
+
+ info("8. Pause on each exception thrown while unwinding");
+ invokeInTab("deepErrorThrowDifferent");
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, source.id, 71);
+ await resume(dbg);
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, source.id, 68);
+ await resume(dbg);
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, source.id, 77);
+ await resume(dbg);
+
+ info("9. Pause in throwing new Function argument");
+ const onNewSource = waitForDispatch(dbg.store, "ADD_SOURCES");
+ invokeInTab("throwInNewFunctionArgument");
+ await waitForPaused(dbg);
+ const { sources } = await onNewSource;
+ is(sources.length, 1, "Got a unique source related to new Function source");
+ const newFunctionSource = sources[0];
+ is(
+ newFunctionSource.url,
+ null,
+ "This new source looks like the new function one as it has no url"
+ );
+ assertPausedAtSourceAndLine(dbg, newFunctionSource.id, 1, 0);
+ assertTextContentOnLine(dbg, 1, "function anonymous(f=doesntExists()");
+ await resume(dbg);
+});
+
+function uncaughtException() {
+ return invokeInTab("uncaughtException").catch(() => {});
+}
+
+function caughtException() {
+ return invokeInTab("caughtException");
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-pause-on-next.js b/devtools/client/debugger/test/mochitest/browser_dbg-pause-on-next.js
new file mode 100644
index 0000000000..27ae30983f
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-pause-on-next.js
@@ -0,0 +1,21 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests that when pause on next is selected, we pause on the next execution
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-scripts.html");
+ const {
+ selectors: { getIsWaitingOnBreak, getCurrentThread },
+ } = dbg;
+
+ clickElement(dbg, "pause");
+ await waitForState(dbg, state => getIsWaitingOnBreak(getCurrentThread()));
+ invokeInTab("simple");
+
+ await waitForPaused(dbg, "simple3");
+ assertPaused(dbg);
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-pause-on-unload.js b/devtools/client/debugger/test/mochitest/browser_dbg-pause-on-unload.js
new file mode 100644
index 0000000000..662bd8685b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-pause-on-unload.js
@@ -0,0 +1,87 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests that the debugger works when pausing on unload.
+
+"use strict";
+
+const TEST_URL_1 =
+ "data:text/html," +
+ encodeURI(
+ `<script>window.addEventListener("unload", (event) => { debugger; });</script>`
+ );
+
+add_task(async function debuggerStatementOnUnload() {
+ const dbg = await initDebuggerWithAbsoluteURL(TEST_URL_1);
+
+ await addExpression(dbg, "event.type");
+ is(getWatchExpressionLabel(dbg, 1), "event.type");
+ is(getWatchExpressionValue(dbg, 1), "(unavailable)");
+
+ info("Reloading the page should trigger the debugger statement on unload");
+ const evaluated = waitForDispatch(dbg.store, "EVALUATE_EXPRESSIONS");
+ const onReload = reload(dbg);
+
+ await waitForPaused(dbg);
+ await waitForInlinePreviews(dbg);
+ assertPausedAtSourceAndLine(dbg, findSource(dbg, TEST_URL_1).id, 1, 56);
+
+ await evaluated;
+ is(
+ getWatchExpressionValue(dbg, 1),
+ `"unload"`,
+ "event.type evaluation does return the expected result"
+ );
+
+ // Verify that project search works while being paused on unload
+ await openProjectSearch(dbg);
+ await doProjectSearch(dbg, "unload", 1);
+
+ info("Resume execution and wait for the page to complete its reload");
+ await resume(dbg);
+ await onReload;
+});
+
+// Note that inline exception doesn't work on single line <script>
+const TEST_URL_2 =
+ "data:text/html," +
+ encodeURI(`<script>
+window.addEventListener("unload", () => { throw new Error("Exception on unload") });
+[].inlineException();
+</script>`);
+
+add_task(async function exceptionsOnUnload() {
+ const dbg = await initDebuggerWithAbsoluteURL(TEST_URL_2);
+
+ info("Enable pause on uncaught exception (but not for caught exception)");
+ await togglePauseOnExceptions(dbg, true, false);
+
+ await openProjectSearch(dbg);
+ await doProjectSearch(dbg, "exception", 1);
+ is(getExpandedResultsCount(dbg), 2);
+
+ info("Reloading the page should trigger the debugger statement on unload");
+ const onReload = reload(dbg);
+
+ // Cover catching exception on unload
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, findSource(dbg, TEST_URL_2).id, 2, 49);
+
+ // But also that previous inline exceptions are still visible
+ await assertInlineExceptionPreview(dbg, 3, 4, {
+ fields: [["<anonymous>", TEST_URL_2 + ":3"]],
+ result: "TypeError: [].inlineException is not a function",
+ expression: "inlineException",
+ });
+
+ // Verify that project search results are still displayed
+ is(getExpandedResultsCount(dbg), 2);
+
+ // Stop pausing on exception to prevent pausing on the inline exception on the load of the next page
+ await togglePauseOnExceptions(dbg, false, false);
+
+ info("Resume execution and wait for the page to complete its reload");
+ await resume(dbg);
+ await onReload;
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-pause-points.js b/devtools/client/debugger/test/mochitest/browser_dbg-pause-points.js
new file mode 100644
index 0000000000..456e4e10f5
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-pause-points.js
@@ -0,0 +1,97 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+requestLongerTimeout(2);
+
+async function testCase(dbg, { name, steps }) {
+ info(` ### Execute testCase "${name}"`);
+
+ const {
+ selectors: { getTopFrame, getCurrentThread },
+ } = dbg;
+ const locations = [];
+
+ const recordFrame = state => {
+ const { line, column } = getTopFrame(getCurrentThread()).location;
+ locations.push([line, column]);
+ info(`Break on ${line}:${column}`);
+ };
+
+ info("Trigger the expected debugger statement");
+ const onPaused = waitForPaused(dbg);
+ invokeInTab(name);
+ await onPaused;
+ recordFrame();
+
+ info("Start stepping over");
+ for (let i = 0; i < steps.length - 1; i++) {
+ await dbg.actions.stepOver();
+ await waitForPaused(dbg);
+ recordFrame();
+ }
+
+ is(formatSteps(locations), formatSteps(steps), name);
+
+ await resume(dbg);
+}
+
+add_task(async function test() {
+ const dbg = await initDebugger("doc-pause-points.html", "pause-points.js");
+
+ await selectSource(dbg, "pause-points.js");
+ await testCase(dbg, {
+ name: "statements",
+ steps: [
+ [9, 2],
+ [10, 4],
+ [10, 13],
+ [11, 2],
+ [11, 21],
+ [12, 2],
+ [12, 12],
+ [13, 0],
+ ],
+ });
+
+ await testCase(dbg, {
+ name: "expressions",
+ steps: [
+ [40, 2],
+ [41, 2],
+ [42, 12],
+ [43, 0],
+ ],
+ });
+
+ await testCase(dbg, {
+ name: "sequences",
+ steps: [
+ [23, 2],
+ [25, 12],
+ [29, 12],
+ [34, 2],
+ [37, 0],
+ ],
+ });
+
+ await testCase(dbg, {
+ name: "flow",
+ steps: [
+ [16, 2],
+ [17, 12],
+ [18, 10],
+ [19, 8],
+ [19, 17],
+ [19, 8],
+ [19, 17],
+ [19, 8],
+ ],
+ });
+});
+
+function formatSteps(steps) {
+ return steps.map(loc => `(${loc.join(",")})`).join(", ");
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-pause-ux.js b/devtools/client/debugger/test/mochitest/browser_dbg-pause-ux.js
new file mode 100644
index 0000000000..689324ca50
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-pause-ux.js
@@ -0,0 +1,52 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-scripts.html");
+
+ // Make sure that we can set a breakpoint on a line out of the
+ // viewport, and that pausing there scrolls the editor to it.
+ const longSrc = findSource(dbg, "long.js");
+ await selectSource(dbg, "long.js");
+ await addBreakpoint(dbg, longSrc, 66);
+ invokeInTab("testModel");
+ await waitForPaused(dbg, "long.js");
+
+ const pauseScrollTop = getScrollTop(dbg);
+
+ info("1. adding a breakpoint should not scroll the editor");
+ getCM(dbg).scrollTo(0, 0);
+ await addBreakpoint(dbg, longSrc, 11);
+ is(getScrollTop(dbg), 0, "scroll position");
+
+ info("2. searching should jump to the match");
+ pressKey(dbg, "fileSearch");
+ type(dbg, "check");
+
+ const cm = getCM(dbg);
+ await waitFor(
+ () => cm.getSelection() == "check",
+ "Wait for actual selection in CodeMirror"
+ );
+ is(
+ cm.getCursor().line,
+ 26,
+ "The line of first check occurence in long.js is selected (this is zero-based)"
+ );
+ // The column is the end of "check", so after 'k'
+ is(
+ cm.getCursor().ch,
+ 51,
+ "The column of first check occurence in long.js is selected (this is zero-based)"
+ );
+
+ const matchScrollTop = getScrollTop(dbg);
+ Assert.notEqual(pauseScrollTop, matchScrollTop, "did not jump to debug line");
+});
+
+function getScrollTop(dbg) {
+ return getCM(dbg).doc.scrollTop;
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-paused-overlay-iframe.js b/devtools/client/debugger/test/mochitest/browser_dbg-paused-overlay-iframe.js
new file mode 100644
index 0000000000..5f8bcd972c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-paused-overlay-iframe.js
@@ -0,0 +1,76 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests the paused overlay in a remote frame
+
+"use strict";
+
+const TEST_COM_URI = `${URL_ROOT_COM_SSL}examples/doc_dbg-fission-frame-sources.html`;
+
+add_task(async function () {
+ info("Load a test page with a remote frame");
+ // simple1.js is imported by the main page. simple2.js comes from the remote frame.
+ const dbg = await initDebuggerWithAbsoluteURL(
+ TEST_COM_URI,
+ "simple1.js",
+ "simple2.js"
+ );
+ const {
+ selectors: { getSelectedSource },
+ commands,
+ } = dbg;
+
+ info("Add breakpoint within the iframe, in `foo` function");
+ await selectSource(dbg, "simple2.js");
+ await addBreakpoint(dbg, "simple2.js", 5);
+
+ info("Call `foo` in the iframe");
+ SpecialPowers.spawn(gBrowser.selectedBrowser, [], () => {
+ const iframe = content.document.querySelector("iframe");
+ SpecialPowers.spawn(iframe, [], () => {
+ return content.wrappedJSObject.foo();
+ });
+ });
+ await waitForPaused(dbg);
+ ok(true, "debugger is paused");
+
+ let highlighterTestFront;
+ if (isFissionEnabled() || isEveryFrameTargetEnabled()) {
+ // We need to retrieve the highlighterTestFront for the frame target.
+ const iframeTarget = commands.targetCommand
+ .getAllTargets([commands.targetCommand.TYPES.FRAME])
+ .find(target => target.url.includes("example.org"));
+ highlighterTestFront = await iframeTarget.getFront("highlighterTest");
+ } else {
+ // When fission is disabled, we don't have a dedicated target for the remote frame.
+ // In this case, the overlay is displayed by the top-level target anyway, so we can
+ // get the corresponding highlighter test front.
+ highlighterTestFront = await getHighlighterTestFront(dbg.toolbox);
+ }
+
+ info("Check that the paused overlay is displayed");
+ await waitFor(() => highlighterTestFront.isPausedDebuggerOverlayVisible());
+ ok(true, "Paused debugger overlay is visible");
+
+ ok(
+ getSelectedSource().url.includes("simple2.js"),
+ "Selected source is simple2.js"
+ );
+ assertPausedAtSourceAndLine(dbg, findSource(dbg, "simple2.js").id, 5);
+
+ info("Test clicking the resume button");
+ await highlighterTestFront.clickPausedDebuggerOverlayButton(
+ "paused-dbg-resume-button"
+ );
+
+ await waitForResumed(dbg);
+ ok("The debugger isn't paused after clicking on the resume button");
+
+ await waitFor(async () => {
+ const visible = await highlighterTestFront.isPausedDebuggerOverlayVisible();
+ return !visible;
+ });
+
+ ok(true, "The overlay is now hidden");
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-paused-overlay-loading.js b/devtools/client/debugger/test/mochitest/browser_dbg-paused-overlay-loading.js
new file mode 100644
index 0000000000..0601a66a9c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-paused-overlay-loading.js
@@ -0,0 +1,48 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests that the paused overlay isn't visible after resuming if the debugger paused
+// while the DOM was still loading (Bug 1678636).
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebuggerWithAbsoluteURL(
+ "data:text/html,<meta charset=utf8><script>debugger;</script>"
+ );
+
+ info("Reload the page to hit the debugger statement while loading");
+ const onReloaded = reload(dbg);
+ await waitForPaused(dbg);
+ ok(true, "We're paused");
+
+ info("Check that the paused overlay is displayed");
+ const highlighterTestFront = await dbg.toolbox.target.getFront(
+ "highlighterTest"
+ );
+
+ await waitFor(async () => {
+ const visible = await highlighterTestFront.isPausedDebuggerOverlayVisible();
+ return visible;
+ });
+ ok(true, "Paused debugger overlay is visible");
+
+ info("Click the resume button");
+ await highlighterTestFront.clickPausedDebuggerOverlayButton(
+ "paused-dbg-resume-button"
+ );
+
+ await waitForResumed(dbg);
+ ok("The debugger isn't paused after clicking on the resume button");
+
+ await waitFor(async () => {
+ const visible = await highlighterTestFront.isPausedDebuggerOverlayVisible();
+ return !visible;
+ });
+
+ ok(true, "The overlay is now hidden");
+
+ info("Wait for reload to complete after resume");
+ await onReloaded;
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-paused-overlay.js b/devtools/client/debugger/test/mochitest/browser_dbg-paused-overlay.js
new file mode 100644
index 0000000000..1d442c5ca5
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-paused-overlay.js
@@ -0,0 +1,73 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests the paused overlay
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-scripts.html");
+
+ // Sanity check
+ const highlighterTestFront = await getHighlighterTestFront(dbg.toolbox);
+ let isPausedOverlayVisible =
+ await highlighterTestFront.isPausedDebuggerOverlayVisible();
+ is(
+ isPausedOverlayVisible,
+ false,
+ "The pause overlay is not visible in the beginning"
+ );
+
+ info("Create an eval script that pauses itself.");
+ invokeInTab("doEval");
+ await waitForPaused(dbg);
+
+ info("Check that the paused overlay is displayed");
+ await waitFor(() => highlighterTestFront.isPausedDebuggerOverlayVisible());
+ ok(true, "Paused debugger overlay is visible");
+
+ const pauseLine = getVisibleSelectedFrameLine(dbg);
+ is(pauseLine, 2, "We're paused at the expected location");
+
+ info("Test clicking the step over button");
+ await highlighterTestFront.clickPausedDebuggerOverlayButton(
+ "paused-dbg-step-button"
+ );
+ await waitFor(() => isPaused(dbg) && getVisibleSelectedFrameLine(dbg) === 4);
+ ok(true, "We're paused at the expected location after stepping");
+
+ isPausedOverlayVisible =
+ await highlighterTestFront.isPausedDebuggerOverlayVisible();
+ is(isPausedOverlayVisible, true, "The pause overlay is still visible");
+
+ info("Test clicking the highlighter resume button");
+ await highlighterTestFront.clickPausedDebuggerOverlayButton(
+ "paused-dbg-resume-button"
+ );
+
+ await waitForResumed(dbg);
+ ok("The debugger isn't paused after clicking on the resume button");
+
+ await waitFor(async () => {
+ const visible = await highlighterTestFront.isPausedDebuggerOverlayVisible();
+ return !visible;
+ });
+ ok(true, "The overlay is now hidden");
+
+ info(
+ "Check that the highlighter is removed when clicking on the debugger resume button"
+ );
+ invokeInTab("doEval");
+ await waitFor(() => highlighterTestFront.isPausedDebuggerOverlayVisible());
+ ok(true, "Paused debugger overlay is visible again");
+
+ info("Click debugger UI resume button");
+ const resumeButton = await waitFor(() => findElement(dbg, "resume"));
+ resumeButton.click();
+ await waitFor(async () => {
+ const visible = await highlighterTestFront.isPausedDebuggerOverlayVisible();
+ return !visible;
+ });
+ ok(true, "The overlay is hidden after clicking on the resume button");
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-breakpoints-columns.js b/devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-breakpoints-columns.js
new file mode 100644
index 0000000000..3793efb74d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-breakpoints-columns.js
@@ -0,0 +1,119 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests that breakpoints set in the pretty printed files display and paused
+// correctly.
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-pretty.html", "pretty.js");
+
+ await selectSource(dbg, "pretty.js");
+ await prettyPrint(dbg);
+
+ info(
+ "Add breakpoint in funcWithMultipleBreakableColumns, on the for-loop line"
+ );
+ const LINE_INDEX_TO_BREAK_ON = 15;
+ const prettySourceFileName = "pretty.js:formatted";
+ await addBreakpoint(dbg, prettySourceFileName, LINE_INDEX_TO_BREAK_ON);
+ const prettySource = findSource(dbg, prettySourceFileName);
+
+ info("Check that multiple column breakpoints can be set");
+ const columnBreakpointMarkers = await waitForAllElements(
+ dbg,
+ "columnBreakpoints"
+ );
+ /*
+ * We're pausing on the following line, which should have those breakpoints (marked with ➤)
+ *
+ * for( ➤let i=0; ➤i < items.length; ➤i++ ) {
+ *
+ */
+ is(
+ columnBreakpointMarkers.length,
+ 3,
+ "We have the expected numbers of possible column breakpoints"
+ );
+
+ info("Enable the second column breakpoint");
+ columnBreakpointMarkers[1].click();
+ await waitForBreakpointCount(dbg, 2);
+ await waitForAllElements(dbg, "breakpointItems", 2);
+
+ info("Check that we do pause at expected locations");
+ invokeInTab("funcWithMultipleBreakableColumns");
+
+ info("We pause on the first column breakpoint (before `i` init)");
+ await waitForPaused(dbg);
+ await waitForInlinePreviews(dbg);
+ await assertPausedAtSourceAndLine(
+ dbg,
+ prettySource.id,
+ LINE_INDEX_TO_BREAK_ON,
+ 16
+ );
+ await resume(dbg);
+
+ info(
+ "We pause at the second column breakpoint, before the first loop iteration"
+ );
+ await waitForPaused(dbg);
+ await waitForInlinePreviews(dbg);
+ await assertPausedAtSourceAndLine(
+ dbg,
+ prettySource.id,
+ LINE_INDEX_TO_BREAK_ON,
+ 19
+ );
+ const assertScopesForSecondColumnBreakpoint = topBlockItems =>
+ assertScopes(dbg, [
+ "Block",
+ ["<this>", "Window"],
+ ...topBlockItems,
+ "funcWithMultipleBreakableColumns",
+ ["arguments", "Arguments"],
+ ["items", "(2) […]"],
+ ]);
+ await assertScopesForSecondColumnBreakpoint([["i", "0"]]);
+ await resume(dbg);
+
+ info(
+ "We pause at the second column breakpoint, before the second loop iteration"
+ );
+ await waitForPaused(dbg);
+ await waitForInlinePreviews(dbg);
+ await assertPausedAtSourceAndLine(
+ dbg,
+ prettySource.id,
+ LINE_INDEX_TO_BREAK_ON,
+ 19
+ );
+ await assertScopesForSecondColumnBreakpoint([["i", "1"]]);
+ await resume(dbg);
+
+ info(
+ "We pause at the second column breakpoint, before we exit the loop (`items.length` is 2, so the condition will fail)"
+ );
+ await waitForPaused(dbg);
+ await waitForInlinePreviews(dbg);
+ await assertPausedAtSourceAndLine(
+ dbg,
+ prettySource.id,
+ LINE_INDEX_TO_BREAK_ON,
+ 19
+ );
+ await assertScopesForSecondColumnBreakpoint([["i", "2"]]);
+ await resume(dbg);
+
+ info("Remove all breakpoints");
+ await clickGutter(dbg, LINE_INDEX_TO_BREAK_ON);
+ await waitForBreakpointCount(dbg, 0);
+
+ ok(
+ !findAllElements(dbg, "columnBreakpoints").length,
+ "There is no column breakpoints anymore after clicking on the gutter"
+ );
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-breakpoints-delete.js b/devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-breakpoints-delete.js
new file mode 100644
index 0000000000..38798f2b50
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-breakpoints-delete.js
@@ -0,0 +1,113 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests that breakpoints in pretty printed files
+// are properly removed when the user deletes them on either the generated or original files.
+
+"use strict";
+
+add_task(async function () {
+ info(
+ "Test removing the breakpoint from the minified file (generated source) works"
+ );
+
+ const dbg = await initDebugger("doc-pretty.html", "pretty.js");
+
+ await selectSource(dbg, "pretty.js");
+
+ await prettyPrint(dbg);
+
+ await addBreakpointToPrettyPrintedFile(dbg);
+
+ info(
+ `Close the pretty-printed source, so it is not automatically reopened on reload`
+ );
+ await closeTab(dbg, "pretty.js:formatted");
+
+ await waitForSelectedSource(dbg, "pretty.js");
+
+ info(
+ "Assert that a equivalent breakpoint was set in pretty.js (generated source)"
+ );
+ await assertBreakpoint(dbg, 4);
+
+ info(`Remove the breakpoint from pretty.js (generated source)`);
+ await clickGutter(dbg, 4);
+
+ await waitForBreakpointCount(dbg, 0);
+
+ await reloadAndCheckNoBreakpointExists(dbg);
+});
+
+add_task(async function () {
+ info(
+ "Test removing the breakpoint from the pretty printed (original source) works"
+ );
+
+ const dbg = await initDebugger("doc-pretty.html", "pretty.js");
+
+ await selectSource(dbg, "pretty.js");
+
+ await prettyPrint(dbg);
+
+ await addBreakpointToPrettyPrintedFile(dbg);
+
+ info("Check that breakpoint gets added to pretty.js (generated source)");
+ await selectSource(dbg, "pretty.js");
+ await assertBreakpoint(dbg, 4);
+
+ info("Close the pretty.js (generated source)");
+ await closeTab(dbg, "pretty.js");
+
+ await waitForSelectedSource(dbg, "pretty.js:formatted");
+
+ info(`Remove the breakpoint from pretty.js:formatted (original source)`);
+ await clickGutter(dbg, 5);
+
+ await waitForBreakpointCount(dbg, 0);
+
+ info(
+ `Close the pretty-printed source, so it is not automatically reopened on reload`
+ );
+ await closeTab(dbg, "pretty.js:formatted");
+
+ await reloadAndCheckNoBreakpointExists(dbg);
+});
+
+async function addBreakpointToPrettyPrintedFile(dbg) {
+ // This breakpoint would be set before the debugger statement
+ // and should be hit first.
+ info("Add breakpoint to pretty.js:formatted (original source)");
+ await addBreakpoint(dbg, "pretty.js:formatted", 5);
+ await waitForBreakpointCount(dbg, 1);
+}
+
+async function reloadAndCheckNoBreakpointExists(dbg) {
+ info("Reload and pretty print pretty.js");
+ await reload(dbg, "pretty.js");
+ await selectSource(dbg, "pretty.js");
+ await prettyPrint(dbg);
+ info("Check that we do not pause on the removed breakpoint");
+ invokeInTab("stuff");
+ await waitForPaused(dbg);
+
+ const sourcePretty = findSource(dbg, "pretty.js:formatted");
+ info(
+ "Assert pause at the debugger statement in pretty.js:formatted (original source) and not the removed breakpoint"
+ );
+ assertPausedAtSourceAndLine(dbg, sourcePretty.id, 8);
+
+ await selectSource(dbg, "pretty.js");
+ const source = findSource(dbg, "pretty.js");
+
+ info(
+ "Assert pause at the debugger statement in pretty.js (generated source) and not the removed breakpoint"
+ );
+ assertPausedAtSourceAndLine(dbg, source.id, 6);
+
+ info(`Confirm that pretty.js:formatted does not have any breakpoints`);
+ is(dbg.selectors.getBreakpointCount(), 0, "Breakpoints should be cleared");
+
+ await resume(dbg);
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-breakpoints.js b/devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-breakpoints.js
new file mode 100644
index 0000000000..3f9a3e24ec
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-breakpoints.js
@@ -0,0 +1,126 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests that breakpoints set in the pretty printed files display and paused
+// correctly.
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-pretty.html", "pretty.js");
+
+ await selectSource(dbg, "pretty.js");
+ await prettyPrint(dbg);
+
+ await addBreakpoint(dbg, "pretty.js:formatted", 5);
+
+ is(dbg.selectors.getBreakpointCount(), 1, "Only one breakpoint is created");
+
+ invokeInTab("stuff");
+ await waitForPaused(dbg);
+
+ await assertBreakpointsInNonPrettyAndPrettySources(dbg);
+
+ is(
+ dbg.selectors.getBreakpointCount(),
+ 1,
+ "Only one breakpoint still exists after pause "
+ );
+
+ await resume(dbg);
+
+ info("Wait for another pause because of a debugger statement on line 8");
+ await waitForPaused(dbg);
+
+ await resume(dbg);
+ assertNotPaused(dbg);
+
+ await closeTab(dbg, "pretty.js");
+ await closeTab(dbg, "pretty.js:formatted");
+});
+
+// Tests that breakpoints appear and work when you reload a page
+// with pretty-printed files.
+add_task(async function () {
+ const dbg = await initDebugger("doc-pretty.html", "pretty.js");
+
+ await selectSource(dbg, "pretty.js");
+ await prettyPrint(dbg);
+
+ await addBreakpoint(dbg, "pretty.js:formatted", 5);
+
+ info("Check that equivalent breakpoint to pretty.js (generated source)");
+ await selectSource(dbg, "pretty.js");
+ await assertBreakpoint(dbg, 4);
+
+ await selectSource(dbg, "pretty.js:formatted");
+
+ is(dbg.selectors.getBreakpointCount(), 1, "Only one breakpoint exists");
+
+ await reload(dbg, "pretty.js", "pretty.js:formatted");
+
+ await waitForSelectedSource(dbg, "pretty.js:formatted");
+
+ invokeInTab("stuff");
+ await waitForPaused(dbg);
+
+ await assertBreakpointsInNonPrettyAndPrettySources(dbg);
+
+ is(
+ dbg.selectors.getBreakpointCount(),
+ 1,
+ "Only one breakpoint still exists after reload and pause "
+ );
+});
+
+// Test that breakpoints appear and work when set in the minified source
+add_task(async function () {
+ const dbg = await initDebugger("doc-pretty.html", "pretty.js");
+
+ await selectSource(dbg, "pretty.js");
+
+ info("Add breakpoint to pretty.js (generated source)");
+ await addBreakpoint(dbg, "pretty.js", 4, 8);
+
+ await prettyPrint(dbg);
+
+ info(
+ "Check that equivalent breakpoint is added to pretty.js:formatted (original source)"
+ );
+ await selectSource(dbg, "pretty.js:formatted");
+ await assertBreakpoint(dbg, 5);
+
+ is(dbg.selectors.getBreakpointCount(), 1, "Only one breakpoint created");
+
+ await reload(dbg, "pretty.js", "pretty.js:formatted");
+
+ await waitForSelectedSource(dbg, "pretty.js:formatted");
+
+ invokeInTab("stuff");
+ await waitForPaused(dbg);
+
+ await assertBreakpointsInNonPrettyAndPrettySources(dbg);
+
+ is(
+ dbg.selectors.getBreakpointCount(),
+ 1,
+ "Only one breakpoint still exists after reload and pause "
+ );
+});
+
+async function assertBreakpointsInNonPrettyAndPrettySources(dbg) {
+ info(
+ "Asserts breakpoint pause and display on the correct line in the pretty printed source"
+ );
+ const prettyPrintedSource = findSource(dbg, "pretty.js:formatted");
+ await assertPausedAtSourceAndLine(dbg, prettyPrintedSource.id, 5);
+ await assertBreakpoint(dbg, 5);
+
+ await selectSource(dbg, "pretty.js");
+
+ info("Assert pause and display on the correct line in the minified source");
+ const minifiedSource = findSource(dbg, "pretty.js");
+ await assertPausedAtSourceAndLine(dbg, minifiedSource.id, 4, 8);
+ await assertBreakpoint(dbg, 4);
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-console.js b/devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-console.js
new file mode 100644
index 0000000000..e6aa266b26
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-console.js
@@ -0,0 +1,66 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// The test has a lot of interactions between debugger and console panels which
+// might take more than 30s to complete on a slow machine.
+
+"use strict";
+
+requestLongerTimeout(2);
+
+// Tests that pretty-printing updates console messages.
+add_task(async function () {
+ const dbg = await initDebugger("doc-minified.html");
+ invokeInTab("arithmetic");
+
+ info("Switch to console and check message");
+ const minifiedLink = await waitForConsoleLink(
+ dbg,
+ "arithmetic",
+ "math.min.js:3:73"
+ );
+
+ info("Click on the link to open the debugger");
+ minifiedLink.click();
+ await waitForSelectedSource(dbg, "math.min.js");
+ await waitForSelectedLocation(dbg, 3);
+
+ info("Click on pretty print button and wait for the file to be formatted");
+ clickElement(dbg, "prettyPrintButton");
+ await waitForSelectedSource(dbg, "math.min.js:formatted");
+
+ info("Switch back to console and check message");
+ const formattedLink = await waitForConsoleLink(
+ dbg,
+ "arithmetic",
+ "math.min.js:formatted:31:24"
+ );
+ ok(true, "Message location was updated as expected");
+
+ info(
+ "Click on the link again and check the debugger opens in formatted file"
+ );
+ formattedLink.click();
+ await selectSource(dbg, "math.min.js:formatted");
+ await waitForSelectedLocation(dbg, 31);
+});
+
+async function waitForConsoleLink(dbg, messageText, linkText) {
+ const { toolbox } = dbg;
+ await toolbox.selectTool("webconsole");
+
+ return waitFor(async () => {
+ // Wait until the message updates.
+ const [message] = await findConsoleMessages(toolbox, messageText);
+ if (!message) {
+ return false;
+ }
+ const linkEl = message.querySelector(".frame-link-source");
+ if (!linkEl) {
+ return false;
+ }
+
+ return linkEl.textContent == linkText ? linkEl : false;
+ });
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-flow.js b/devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-flow.js
new file mode 100644
index 0000000000..eb8db0b25e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-flow.js
@@ -0,0 +1,78 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests that loader and new tab appear when pretty printing,
+// and the selected location is mapped afterwards
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-pretty.html", "pretty.js");
+
+ SpecialPowers.spawn(gBrowser.selectedBrowser, [], () => {
+ const scriptEl = content.document.createElement("script");
+ scriptEl.innerText = `(function callInPretty() { debugger; funcWithMultipleBreakableColumns() })()`;
+ content.document.body.append(scriptEl);
+ });
+
+ await waitForPaused(dbg);
+ const scriptSource = dbg.selectors.getSelectedSource();
+
+ info(
+ "Step-in to navigate to pretty.js `funcWithMultipleBreakableColumns` function"
+ );
+ await stepOver(dbg);
+ await stepIn(dbg);
+ await waitForSelectedSource(dbg, "pretty.js");
+ await waitForSelectedLocation(dbg, 9);
+
+ is(
+ countTabs(dbg),
+ 2,
+ "Two tabs are opened, one for the dynamically inserted script and one for minified pretty.js"
+ );
+ is(
+ dbg.selectors.getSourceCount(),
+ 2,
+ "There are 2 sources before pretty printing"
+ );
+ await prettyPrint(dbg);
+
+ info("Wait for the pretty printed source to be selected on a different line");
+ await waitForSelectedLocation(dbg, 11);
+
+ is(countTabs(dbg), 3, "A new tab was opened for the prettified source");
+ is(
+ dbg.selectors.getSourceCount(),
+ 3,
+ "There are three sources after pretty printing"
+ );
+
+ info("Navigate to previous frame in call stack");
+ clickElement(dbg, "frame", 2);
+ await waitForSelectedSource(dbg, scriptSource);
+
+ info("Navigate back to `funcWithMultipleBreakableColumns` frame");
+ clickElement(dbg, "frame", 1);
+ await waitForSelectedLocation(dbg, 11);
+ await waitForSelectedSource(dbg, "pretty.js:formatted");
+ ok(true, "pretty-printed source was selected");
+
+ await resume(dbg);
+
+ info("Re select the minified version");
+ await selectSource(dbg, "pretty.js", 4, 8);
+ info("Re toggle pretty print from the minified source");
+ await prettyPrint(dbg);
+ is(countTabs(dbg), 3, "There are stil three tabs");
+ info(
+ "Wait for re-selecting the mapped location in the pretty printed source"
+ );
+ await waitForSelectedLocation(dbg, 5);
+ is(
+ dbg.selectors.getSourceCount(),
+ 3,
+ "There are still 3 sources after retrying to pretty print the same source"
+ );
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-inline-scripts.js b/devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-inline-scripts.js
new file mode 100644
index 0000000000..2b263ad0a9
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-inline-scripts.js
@@ -0,0 +1,256 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests pretty-printing of HTML file and its inner scripts.
+
+"use strict";
+
+const TEST_FILENAME = `doc-pretty-print-inline-scripts.html`;
+const PRETTY_PRINTED_FILENAME = `${TEST_FILENAME}:formatted`;
+
+const BREAKABLE_LINE_HINT_CHAR = `➤`;
+
+// Import helpers for the inspector
+Services.scriptloader.loadSubScript(
+ "chrome://mochitests/content/browser/devtools/client/inspector/test/shared-head.js",
+ this
+);
+
+add_task(async function () {
+ const dbg = await initDebugger(TEST_FILENAME);
+
+ await selectSource(dbg, TEST_FILENAME);
+ clickElement(dbg, "prettyPrintButton");
+
+ await waitForSelectedSource(dbg, PRETTY_PRINTED_FILENAME);
+ const prettyPrintedSource = findSourceContent(dbg, PRETTY_PRINTED_FILENAME);
+
+ ok(prettyPrintedSource, "Pretty-printed source exists");
+
+ info("Check that the HTML file was pretty-printed as expected");
+ const expectedPrettyHtml = getExpectedPrettyPrintedHtml();
+ is(
+ prettyPrintedSource.value,
+ // ➤ is used to indicate breakable lines, we remove them to assert the actual
+ // content of the editor.
+ expectedPrettyHtml.replaceAll(BREAKABLE_LINE_HINT_CHAR, ""),
+ "HTML file is pretty printed as expected"
+ );
+
+ info("Check breakable lines");
+ const htmlLines = expectedPrettyHtml.split("\n");
+ const expectedBreakableLines = [];
+ htmlLines.forEach((line, index) => {
+ if (line.startsWith(BREAKABLE_LINE_HINT_CHAR)) {
+ // Lines in the debugger are 1-based
+ expectedBreakableLines.push(index + 1);
+ }
+ });
+
+ await assertBreakableLines(
+ dbg,
+ PRETTY_PRINTED_FILENAME,
+ htmlLines.length,
+ expectedBreakableLines
+ );
+
+ info("Check that console messages are pointing to pretty-printed file");
+ const { toolbox } = dbg;
+ await toolbox.selectTool("webconsole");
+
+ const { hud } = await dbg.toolbox.getPanel("webconsole");
+ info("Wait until messages are sourcemapped");
+ await waitFor(
+ () => !!findMessageByType(hud, PRETTY_PRINTED_FILENAME, ".log")
+ );
+
+ const firstMessage = await waitFor(() =>
+ findMessageByType(hud, "User information", ".log")
+ );
+ const firstMessageLink = firstMessage.querySelector(".frame-link-source");
+ is(
+ firstMessageLink.innerText,
+ `${PRETTY_PRINTED_FILENAME}:18:8`,
+ "first console message has expected location"
+ );
+ info(
+ "Click on the link of the first message to open the file in the debugger"
+ );
+ firstMessageLink.click();
+ await waitForSelectedSource(dbg, PRETTY_PRINTED_FILENAME);
+ ok(true, "pretty printed file was selected in debugger…");
+ await waitForSelectedLocation(dbg, 18);
+ ok(true, "…at the expected location");
+
+ info("Go back to the console to check an other message");
+ await toolbox.selectTool("webconsole");
+
+ const secondMessage = await waitFor(() =>
+ findMessageByType(hud, "42 yay", ".log")
+ );
+ const secondMessageLink = secondMessage.querySelector(".frame-link-source");
+ is(
+ secondMessageLink.innerText,
+ `${PRETTY_PRINTED_FILENAME}:41:12`,
+ "second console message has expected location"
+ );
+ info(
+ "Click on the link of the second message to open the file in the debugger"
+ );
+ secondMessageLink.click();
+ await waitForSelectedSource(dbg, PRETTY_PRINTED_FILENAME);
+ ok(true, "pretty printed file was selected in debugger…");
+ await waitForSelectedLocation(dbg, 41);
+ ok(true, "…at the expected location");
+
+ info("Check that event listener popup is pointing to pretty-printed file");
+ const inspector = await toolbox.selectTool("inspector");
+
+ const nodeFront = await getNodeFront("h1", inspector);
+ const markupContainer = inspector.markup.getContainer(nodeFront);
+ const evHolder = markupContainer.elt.querySelector(
+ ".inspector-badge.interactive[data-event]"
+ );
+ const eventTooltip = inspector.markup.eventDetailsTooltip;
+
+ info("Open event tooltip.");
+ EventUtils.synthesizeMouseAtCenter(
+ evHolder,
+ {},
+ inspector.markup.doc.defaultView
+ );
+ await eventTooltip.once("shown");
+ ok(true, "event tooltip opened");
+ // wait for filename to be sourcemapped
+ await waitFor(() =>
+ eventTooltip.panel
+ .querySelector(".event-header")
+ ?.innerText.includes(PRETTY_PRINTED_FILENAME)
+ );
+ const header = eventTooltip.panel.querySelector(".event-header");
+ const headerFilename = header.querySelector(
+ ".event-tooltip-filename"
+ ).innerText;
+ ok(
+ headerFilename.endsWith(`${PRETTY_PRINTED_FILENAME}:51`),
+ `Location in event tooltip is the pretty printed one (${headerFilename})`
+ );
+ info(
+ "Check that clicking on open debugger icon selects the pretty printed file"
+ );
+ header.querySelector(".event-tooltip-debugger-icon").click();
+ await waitForSelectedSource(dbg, PRETTY_PRINTED_FILENAME);
+ ok(true, "pretty printed file was selected in debugger…");
+ await waitForSelectedLocation(dbg, 51);
+ ok(true, "…at the expected location");
+});
+
+add_task(async function prettyPrintSingleLineDataUrl() {
+ const TEST_URL = `data:text/html,<meta charset=utf8><script>{"use strict"; globalThis.foo = function() {}}</script>`;
+ const PRETTY_PRINTED_URL = `${TEST_URL}:formatted`;
+ const dbg = await initDebuggerWithAbsoluteURL(TEST_URL);
+
+ await selectSource(dbg, TEST_URL);
+ clickElement(dbg, "prettyPrintButton");
+
+ const prettySource = await waitForSource(dbg, PRETTY_PRINTED_URL);
+ await waitForSelectedSource(dbg, prettySource);
+ const prettyPrintedSource = findSourceContent(dbg, PRETTY_PRINTED_URL);
+
+ ok(prettyPrintedSource, "Pretty-printed source exists");
+
+ info("Check that the HTML file was pretty-printed as expected");
+ const expectedPrettyHtml = `<meta charset=utf8><script>
+{
+ 'use strict';
+ globalThis.foo = function () {
+ }
+}
+</script>`;
+ is(
+ prettyPrintedSource.value,
+ expectedPrettyHtml,
+ "HTML file is pretty printed as expected"
+ );
+});
+
+/**
+ * Return the expected pretty-printed HTML. Lines starting with ➤ indicate breakable
+ * lines for easier maintenance.
+ *
+ * @returns {String}
+ */
+function getExpectedPrettyPrintedHtml() {
+ return `<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!doctype html>
+
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Debugger test page</title>
+ <!-- Added to check we don't handle non js scripts -->
+ <script id="json-data" type="application/json">
+ { "foo": "bar" }
+ </script>
+
+ <!-- the unusual formatting is wanted to check inline scripts pretty printing -->
+ <script id="inline" type="application/javascript">
+➤const userInfo = JSON.parse(document.getElementById('json-data').text);
+➤console.log('User information: %o', userInfo);
+➤document.addEventListener(
+ 'click',
+ function onClick(e) {
+➤ console.log('in inline script');
+ // this is
+ // something
+➤ e.target;
+➤ }
+);
+</script>
+ </head>
+
+ <body>
+ <h1>Minified</h1>
+ <!-- Checking that having empty inline scripts doesn't throw off pretty printing -->
+ <script></script>
+ <!-- Single line "minified" script -->
+ <script id="minified" type="module">
+➤for (const x of [
+ 42
+]) {
+➤ if (x > 0) {
+➤ console.log(x, 'yay')
+ } else {
+➤ console.log(x, 'booh')
+ }
+➤}
+</script>
+ <!-- Multiple line "minified" script, with content on the first line -->
+ <script>
+{
+ 'use strict';
+➤ document.querySelector('h1').addEventListener('mousedown', e => {
+➤ console.log('mousedown on h1')
+➤ })
+➤}
+</script>
+ <hr><script>
+➤const x = {
+ a: 1,
+ b: 2
+➤};
+</script><hr><!-- multiple scripts on same line --><script>
+➤const y = [
+ 1,
+ 2,
+ 3
+];
+➤y.map(i => i * 2)
+</script>
+ </body>
+</html>
+`;
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-paused-anonymous.js b/devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-paused-anonymous.js
new file mode 100644
index 0000000000..8d3771cae9
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-paused-anonymous.js
@@ -0,0 +1,148 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests that pretty-printing a file with no URL works while paused.
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-minified.html");
+
+ info("Evaluate an expression with scriptCommand.execute");
+ const debuggerDone = dbg.commands.scriptCommand.execute(
+ `debugger; var foo; document.addEventListener("click", e => { debugger; }, {once: true})`
+ );
+ await waitForPaused(dbg);
+ const evaluatedSourceId = dbg.selectors.getSelectedSourceId();
+
+ // This will throw if things fail to pretty-print and render properly.
+ info("Pretty print the source created by the evaluated expression");
+ await prettyPrint(dbg);
+
+ const prettyEvaluatedSourceFilename =
+ evaluatedSourceId.split("/").at(-1) + ":formatted";
+ await waitForSource(dbg, prettyEvaluatedSourceFilename);
+ const prettySource = findSource(dbg, prettyEvaluatedSourceFilename);
+
+ info("Check that the script was pretty-printed as expected");
+ const { value: prettySourceValue } = findSourceContent(dbg, prettySource);
+
+ is(
+ prettySourceValue.trim(),
+ `debugger;
+var foo;
+document.addEventListener('click', e => {
+ debugger;
+}, {
+ once: true
+})
+`.trim(),
+ "script was pretty printed as expected"
+ );
+
+ await resume(dbg);
+ await debuggerDone;
+
+ info("Check if we can pause inside the pretty-printed source");
+ SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () {
+ content.document.body.click();
+ });
+ await waitForPaused(dbg);
+ await assertPausedAtSourceAndLine(dbg, prettySource.id, 4);
+ await resume(dbg);
+
+ info("Check that pretty printing works in `eval`'d source");
+ SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () {
+ content.eval(
+ `setTimeout(() => {debugger;document.addEventListener("click", e => { debugger; }, {once: true})}, 100)`
+ );
+ });
+ await waitForPaused(dbg);
+ const evalSourceId = dbg.selectors.getSelectedSourceId();
+
+ // This will throw if things fail to pretty-print and render properly.
+ info("Pretty print the source created by the `eval` expression");
+ await prettyPrint(dbg);
+
+ const prettyEvalSourceFilename =
+ evalSourceId.split("/").at(-1) + ":formatted";
+ await waitForSource(dbg, prettyEvalSourceFilename);
+ const prettyEvalSource = findSource(dbg, prettyEvalSourceFilename);
+
+ info("Check that the script was pretty-printed as expected");
+ const { value: prettyEvalSourceValue } = findSourceContent(
+ dbg,
+ prettyEvalSource
+ );
+
+ is(
+ prettyEvalSourceValue.trim(),
+ `
+setTimeout(
+ () => {
+ debugger;
+ document.addEventListener('click', e => {
+ debugger;
+ }, {
+ once: true
+ })
+ },
+ 100
+)`.trim(),
+ "script was pretty printed as expected"
+ );
+ await resume(dbg);
+
+ info("Check if we can pause inside the pretty-printed eval source");
+ SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () {
+ content.document.body.click();
+ });
+ await waitForPaused(dbg);
+ await assertPausedAtSourceAndLine(dbg, prettyEvalSource.id, 5);
+ await resume(dbg);
+
+ info("Check that pretty printing works in `new Function` source");
+ invokeInTab("breakInNewFunction");
+ await waitForPaused(dbg);
+ const newFunctionSourceId = dbg.selectors.getSelectedSourceId();
+
+ // This will throw if things fail to pretty-print and render properly.
+ info("Pretty print the source created with `new Function`");
+ await prettyPrint(dbg);
+
+ const prettyNewFunctionSourceFilename =
+ newFunctionSourceId.split("/").at(-1) + ":formatted";
+ await waitForSource(dbg, prettyNewFunctionSourceFilename);
+ const prettyNewFunctionSource = findSource(
+ dbg,
+ prettyNewFunctionSourceFilename
+ );
+
+ info("Check that the script was pretty-printed as expected");
+ const { value: prettyNewFunctionSourceValue } = findSourceContent(
+ dbg,
+ prettyNewFunctionSource
+ );
+
+ is(
+ prettyNewFunctionSourceValue.trim(),
+ `function anonymous() {
+ debugger;
+ document.addEventListener('click', function () {
+ debugger;
+ })
+}
+`.trim(),
+ "script was pretty printed as expected"
+ );
+ await resume(dbg);
+
+ info("Check if we can pause inside the pretty-printed eval source");
+ SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () {
+ content.document.body.click();
+ });
+ await waitForPaused(dbg);
+ await assertPausedAtSourceAndLine(dbg, prettyNewFunctionSource.id, 4);
+ await resume(dbg);
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-paused.js b/devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-paused.js
new file mode 100644
index 0000000000..a5b9260af2
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-paused.js
@@ -0,0 +1,35 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests pretty-printing a source that is currently paused.
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-minified.html", "math.min.js");
+ const thread = dbg.selectors.getCurrentThread();
+
+ await selectSource(dbg, "math.min.js");
+ await addBreakpoint(dbg, "math.min.js", 2);
+
+ invokeInTab("arithmetic");
+ await waitForPaused(dbg, "math.min.js");
+ assertPausedAtSourceAndLine(dbg, findSource(dbg, "math.min.js").id, 2);
+
+ clickElement(dbg, "prettyPrintButton");
+ await waitForSelectedSource(dbg, "math.min.js:formatted");
+ await waitForState(
+ dbg,
+ state => dbg.selectors.getSelectedFrame(thread).location.line == 18
+ );
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "math.min.js:formatted").id,
+ 18
+ );
+ await waitForBreakpoint(dbg, "math.min.js:formatted", 18);
+ await assertBreakpoint(dbg, 18);
+
+ await resume(dbg);
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-sourcemap.js b/devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-sourcemap.js
new file mode 100644
index 0000000000..c7e9e3f06f
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-pretty-print-sourcemap.js
@@ -0,0 +1,164 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// This tests pretty-printing for sourcemapped files.
+
+"use strict";
+
+const httpServer = createTestHTTPServer();
+httpServer.registerContentType("html", "text/html");
+httpServer.registerContentType("js", "application/javascript");
+
+httpServer.registerPathHandler(
+ "/doc-prettyprint-sourcemap.html",
+ (request, response) => {
+ response.setStatusLine(request.httpVersion, 200, "OK");
+ response.write(`<!DOCTYPE html>
+ <html>
+ <head>
+ <script type="text/javascript" src="/js1.min.js"></script>
+ <script type="text/javascript" src="/js2.min.js"></script>
+ </head>
+ <script>
+ const a = 3;
+ console.log(a);
+ </script>
+ </html>
+ `);
+ }
+);
+
+function sourceHandler(request, response) {
+ response.setHeader("Content-Type", "text/javascript");
+ console.log(request.path.substring(1));
+ response.write(`function add(a,b,k){var result=a+b;return k(result)}function sub(a,b,k){var result=a-b;return k(result)}function mul(a,b,k){var result=a*b;return k(result)}function div(a,b,k){var result=a/b;return k(result)}function arithmetic(){add(4,4,function(a){sub(a,2,function(b){mul(b,3,function(c){div(c,2,function(d){console.log("arithmetic",d)})})})})};
+//# sourceMappingURL=${request.path.substring(1)}.map`);
+}
+
+httpServer.registerPathHandler("/js1.min.js", sourceHandler);
+httpServer.registerPathHandler("/js2.min.js", sourceHandler);
+
+// This returns no sourcemap
+httpServer.registerPathHandler("/js1.min.js.map", (request, response) => {
+ response.setHeader("Content-Type", "application/javascript");
+ response.setStatusLine(request.httpVersion, 404, "Not found");
+ response.write(`console.log("http error")`);
+});
+
+// This returns a sourcemap without any original source
+httpServer.registerPathHandler("/js2.min.js.map", (request, response) => {
+ response.setHeader("Content-Type", "application/javascript");
+ response.setStatusLine(request.httpVersion, 200, "OK");
+ response.write(
+ `{"version":3,"sources":[],"names":["message","document","getElementById","logMessage","console","log","value","addEventListener","logMessageButton"],"mappings":"AAAA,GAAIA,SAAUC,SAASC,eAAe,UAEtC,SAASC,cACPC,QAAQC,IAAI,eAAiBL,QAAQM,OAGvCN,QAAQO,iBAAiB,QAAS,WAChCP,QAAQM,MAAQ,IACf,MAEH,IAAIE,kBAAmBP,SAASC,eAAe,cAE/CM,kBAAiBD,iBAAiB,QAAS,WACzCJ,cACC"}`
+ );
+});
+
+const BASE_URL = `http://localhost:${httpServer.identity.primaryPort}/`;
+
+// Tests that the pretty-print icon is visible for source files with a sourceMappingURL
+// but the linked sourcemap is not found or no original files exist.
+add_task(async () => {
+ const dbg = await initDebuggerWithAbsoluteURL(
+ `${BASE_URL}doc-prettyprint-sourcemap.html`,
+ "doc-prettyprint-sourcemap.html",
+ "js1.min.js",
+ "js2.min.js"
+ );
+
+ info(" - Test HTML source");
+ const htmlSource = findSource(dbg, "doc-prettyprint-sourcemap.html");
+ await selectSource(dbg, htmlSource);
+ assertPrettyPrintButton(
+ dbg,
+ DEBUGGER_L10N.getStr("sourceTabs.prettyPrint"),
+ false
+ );
+
+ info(" - Test source with sourceMappingURL but sourcemap does not exist");
+ const source1 = findSource(dbg, "js1.min.js");
+ await selectSource(dbg, source1);
+
+ // The source may be reported as pretty printable while we are fetching the sourcemap,
+ // but once the sourcemap is reported to be failing, we no longer report to be pretty printable.
+ await waitFor(
+ () => !dbg.selectors.isSourceWithMap(source1.id),
+ "Wait for the selector to report the source to be source-map less"
+ );
+
+ assertPrettyPrintButton(
+ dbg,
+ DEBUGGER_L10N.getStr("sourceTabs.prettyPrint"),
+ false
+ );
+
+ info(
+ " - Test source with sourceMappingURL and sourcemap but no original files"
+ );
+ const source2 = findSource(dbg, "js2.min.js");
+ await selectSource(dbg, source2);
+
+ assertPrettyPrintButton(
+ dbg,
+ DEBUGGER_L10N.getStr("sourceTabs.prettyPrint"),
+ false
+ );
+
+ info(" - Test an already pretty-printed source");
+ info("Pretty print the script");
+ clickElement(dbg, "prettyPrintButton");
+
+ await waitForSelectedSource(dbg, "js2.min.js:formatted");
+ assertPrettyPrintButton(
+ dbg,
+ DEBUGGER_L10N.getStr("sourceFooter.prettyPrint.isPrettyPrintedMessage"),
+ true
+ );
+});
+
+add_task(async () => {
+ const dbg = await initDebugger(
+ "doc-sourcemaps2.html",
+ "main.min.js",
+ "main.js"
+ );
+
+ info(
+ " - Test source with sourceMappingURL, sourcemap and original files exist"
+ );
+ const source = findSource(dbg, "main.min.js");
+ await selectSource(dbg, source);
+
+ assertPrettyPrintButton(
+ dbg,
+ DEBUGGER_L10N.getStr("sourceFooter.prettyPrint.hasSourceMapMessage"),
+ true
+ );
+
+ info(" - Test an original source");
+ const originalSource = findSource(dbg, "main.js");
+ await selectSource(dbg, originalSource);
+
+ assertPrettyPrintButton(
+ dbg,
+ DEBUGGER_L10N.getStr("sourceFooter.prettyPrint.isOriginalMessage"),
+ true
+ );
+});
+
+function assertPrettyPrintButton(dbg, expectedTitle, shouldBeDisabled) {
+ const prettyPrintButton = findElement(dbg, "prettyPrintButton");
+ ok(prettyPrintButton, "Pretty Print Button is visible");
+ is(
+ prettyPrintButton.title,
+ expectedTitle,
+ "The pretty print button title should be correct"
+ );
+ ok(
+ shouldBeDisabled ? prettyPrintButton.disabled : !prettyPrintButton.disabled,
+ `The pretty print button should be ${
+ shouldBeDisabled ? "disabled" : "enabled"
+ }`
+ );
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-pretty-print.js b/devtools/client/debugger/test/mochitest/browser_dbg-pretty-print.js
new file mode 100644
index 0000000000..2b767bd6b5
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-pretty-print.js
@@ -0,0 +1,142 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests basic pretty-printing functionality.
+
+"use strict";
+
+requestLongerTimeout(2);
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-minified.html", "math.min.js");
+
+ await selectSource(dbg, "math.min.js", 2);
+ clickElement(dbg, "prettyPrintButton");
+
+ await waitForSelectedSource(dbg, "math.min.js:formatted");
+ ok(
+ !findElement(dbg, "mappedSourceLink"),
+ "When we are on the pretty printed source, we don't show the link to the minified source"
+ );
+ const ppSrc = findSource(dbg, "math.min.js:formatted");
+
+ ok(ppSrc, "Pretty-printed source exists");
+
+ // this is not implemented yet
+ // assertHighlightLocation(dbg, "math.min.js:formatted", 18);
+ // await selectSource(dbg, "math.min.js")
+ await addBreakpoint(dbg, ppSrc, 18);
+
+ invokeInTab("arithmetic");
+ await waitForPaused(dbg);
+
+ assertPausedAtSourceAndLine(dbg, ppSrc.id, 18);
+
+ await stepOver(dbg);
+
+ assertPausedAtSourceAndLine(dbg, ppSrc.id, 39);
+
+ await resume(dbg);
+
+ // The pretty-print button should be disabled in the pretty-printed source.
+ ok(
+ findElement(dbg, "prettyPrintButton").disabled,
+ "Pretty Print Button should be disabled"
+ );
+
+ await selectSource(dbg, "math.min.js");
+ await waitForSelectedSource(dbg, "math.min.js");
+ ok(
+ !findElement(dbg, "mappedSourceLink"),
+ "When we are on the minified source, we don't show the link to the pretty printed source"
+ );
+
+ ok(
+ !findElement(dbg, "prettyPrintButton").disabled,
+ "Pretty Print Button should be enabled"
+ );
+});
+
+add_task(async function testPrivateFields() {
+ // Create a source containing a class with private fields
+ const httpServer = createTestHTTPServer();
+ httpServer.registerContentType("html", "text/html");
+ httpServer.registerContentType("js", "application/javascript");
+
+ httpServer.registerPathHandler(`/`, function (request, response) {
+ response.setStatusLine(request.httpVersion, 200, "OK");
+ response.write(`
+ <html>
+ Test pretty-printing class with private fields
+ <script type="text/javascript" src="class-with-private-fields.js"></script>
+ </html>`);
+ });
+
+ httpServer.registerPathHandler(
+ "/class-with-private-fields.js",
+ function (request, response) {
+ response.setHeader("Content-Type", "application/javascript");
+ response.write(`
+ class MyClass {
+ constructor(a) {
+ this.#a = a;this.#b = Math.random();this.ab = this.#getAB();
+ }
+ #a
+ #b = "default value"
+ static #someStaticPrivate
+ #getA() {
+ return this.#a;
+ }
+ #getAB() {
+ return this.#getA()+this.
+ #b
+ }
+ }
+ `);
+ }
+ );
+ const port = httpServer.identity.primaryPort;
+ const TEST_URL = `http://localhost:${port}/`;
+
+ info("Open toolbox");
+ const dbg = await initDebuggerWithAbsoluteURL(TEST_URL);
+
+ info("Select script with private fields");
+ await selectSource(dbg, "class-with-private-fields.js", 2);
+
+ info("Pretty print the script");
+ clickElement(dbg, "prettyPrintButton");
+
+ info("Wait until the script is pretty-printed");
+ await waitForSelectedSource(dbg, "class-with-private-fields.js:formatted");
+
+ info("Check that the script was pretty-printed as expected");
+ const prettyPrintedSource = await findSourceContent(
+ dbg,
+ "class-with-private-fields.js:formatted"
+ );
+
+ is(
+ prettyPrintedSource.value.trim(),
+ `
+class MyClass {
+ constructor(a) {
+ this.#a = a;
+ this.#b = Math.random();
+ this.ab = this.#getAB();
+ }
+ #a
+ #b = 'default value'
+ static #someStaticPrivate
+ #getA() {
+ return this.#a;
+ }
+ #getAB() {
+ return this.#getA() + this.#b
+ }
+}
+ `.trim(),
+ "script was pretty printed as expected"
+ );
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-preview-frame.js b/devtools/client/debugger/test/mochitest/browser_dbg-preview-frame.js
new file mode 100644
index 0000000000..4075b6525a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-preview-frame.js
@@ -0,0 +1,68 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test hovering in a selected frame
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-script-switching.html");
+
+ const found = findElement(dbg, "callStackBody");
+ is(found, null, "Call stack is hidden");
+
+ invokeInTab("firstCall");
+ await waitForPaused(dbg);
+
+ info("Preview a variable in the second frame");
+ clickElement(dbg, "frame", 2);
+ await waitForSelectedFrame(dbg, "firstCall");
+ await assertPreviews(dbg, [
+ {
+ line: 8,
+ column: 4,
+ header: `function secondCall()`,
+ fields: [["name", `"secondCall"`]],
+ expression: "secondCall",
+ },
+ ]);
+
+ info("Preview should still work after selecting different locations");
+ const frame = dbg.selectors.getVisibleSelectedFrame();
+ const inScopeLines = dbg.selectors.getInScopeLines(frame.location);
+ await selectSource(dbg, "script-switching-01.js");
+ await assertPreviews(dbg, [
+ {
+ line: 6,
+ column: 12,
+ header: `function firstCall()`,
+ fields: [["name", `"firstCall"`]],
+ expression: "firstCall",
+ },
+ ]);
+ await assertPreviews(dbg, [
+ {
+ line: 8,
+ column: 4,
+ header: `function secondCall()`,
+ fields: [["name", `"secondCall"`]],
+ expression: "secondCall",
+ },
+ ]);
+
+ is(
+ dbg.selectors.getInScopeLines(frame.location),
+ inScopeLines,
+ "In scope lines"
+ );
+});
+
+function waitForSelectedFrame(dbg, displayName) {
+ const { getInScopeLines, getVisibleSelectedFrame } = dbg.selectors;
+ return waitForState(dbg, state => {
+ const frame = getVisibleSelectedFrame();
+
+ return frame?.displayName == displayName && getInScopeLines(frame.location);
+ });
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-preview-getter.js b/devtools/client/debugger/test/mochitest/browser_dbg-preview-getter.js
new file mode 100644
index 0000000000..72146963ad
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-preview-getter.js
@@ -0,0 +1,64 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// This test checks if 'executing getter' in a preview correctly displays values.
+// Bug 1456441 - 'execute getter' not working in Preview
+
+"use strict";
+
+add_task(async function () {
+ // Make sure the toolbox is tall enough to be able to display the whole popup.
+ await pushPref("devtools.toolbox.footer.height", 500);
+
+ const dbg = await initDebugger(
+ "doc-preview-getter.html",
+ "preview-getter.js"
+ );
+
+ await loadAndAddBreakpoint(dbg, "preview-getter.js", 5, 5);
+ invokeInTab("funcA");
+ await waitForPaused(dbg);
+
+ info("Hovers over 'this' token to display the preview.");
+ const { tokenEl } = await tryHovering(dbg, 5, 5, "previewPopup");
+
+ info("Wait for properties to be loaded");
+ await waitUntil(
+ () => dbg.win.document.querySelectorAll(".preview-popup .node").length > 1
+ );
+
+ info("Invokes getter and waits for the element to be rendered");
+ await clickElement(dbg, "previewPopupInvokeGetterButton");
+ await waitForAllElements(dbg, "previewPopupObjectNumber", 2);
+
+ await clickElement(dbg, "previewPopupInvokeGetterButton");
+ await waitForAllElements(dbg, "previewPopupObjectObject", 4);
+
+ const getterButtonEls = findAllElements(
+ dbg,
+ "previewPopupInvokeGetterButton"
+ );
+ const previewObjectNumberEls = findAllElements(
+ dbg,
+ "previewPopupObjectNumber"
+ );
+ const previewObjectObjectEls = findAllElements(
+ dbg,
+ "previewPopupObjectObject"
+ );
+
+ is(getterButtonEls.length, 0, "There are no getter buttons in the preview.");
+ is(
+ previewObjectNumberEls.length,
+ 2,
+ "Getters were invoked and two numerical values are displayed as expected."
+ );
+ is(
+ previewObjectObjectEls.length,
+ 4,
+ "Getters were invoked and three object values are displayed as expected."
+ );
+
+ await closePreviewForToken(dbg, tokenEl);
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-preview-module.js b/devtools/client/debugger/test/mochitest/browser_dbg-preview-module.js
new file mode 100644
index 0000000000..d513b406ec
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-preview-module.js
@@ -0,0 +1,36 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test hovering in a script that is paused on load
+// and doesn't have functions.
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-scripts.html");
+
+ const onNavigated = navigate(dbg, "doc-on-load.html");
+
+ // wait for `top-level.js` to load and to pause at a debugger statement
+ await waitForSelectedSource(dbg, "top-level.js");
+ await waitForPaused(dbg);
+
+ await assertPreviews(dbg, [
+ {
+ line: 1,
+ column: 6,
+ expression: "obj",
+ fields: [
+ ["foo", "1"],
+ ["bar", "2"],
+ ],
+ },
+ ]);
+
+ await assertPreviewTextValue(dbg, 2, 7, { result: "3", expression: "func" });
+
+ info("Resume and wait for full navigation of the tab");
+ await resume(dbg);
+ await onNavigated;
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-preview-source-maps.js b/devtools/client/debugger/test/mochitest/browser_dbg-preview-source-maps.js
new file mode 100644
index 0000000000..18f1d2594c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-preview-source-maps.js
@@ -0,0 +1,38 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger(
+ "doc-sourcemaps.html",
+ "entry.js",
+ "output.js",
+ "times2.js",
+ "opts.js"
+ );
+
+ await selectSource(dbg, "times2.js");
+ await addBreakpoint(dbg, "times2.js", 2);
+
+ invokeInTab("keepMeAlive");
+ await waitForPausedInOriginalFileAndToggleMapScopes(dbg, "times2.js");
+
+ info("Test previewing in the original location");
+ await assertPreviews(dbg, [
+ { line: 2, column: 10, result: 4, expression: "x" },
+ ]);
+
+ info("Test previewing in the generated location");
+ await dbg.actions.jumpToMappedSelectedLocation();
+ await waitForSelectedSource(dbg, "bundle.js");
+ await assertPreviews(dbg, [
+ { line: 70, column: 11, result: 4, expression: "x" },
+ ]);
+
+ info("Test that you can not preview in another original file");
+ await selectSource(dbg, "output.js");
+ await hoverAtPos(dbg, { line: 2, column: 17 });
+ await assertNoTooltip(dbg);
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-preview-wrapped-lines.js b/devtools/client/debugger/test/mochitest/browser_dbg-preview-wrapped-lines.js
new file mode 100644
index 0000000000..bb222408f3
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-preview-wrapped-lines.js
@@ -0,0 +1,154 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test that the tooltip previews are correct with wrapped editor lines.
+
+"use strict";
+
+const httpServer = createTestHTTPServer();
+httpServer.registerContentType("html", "text/html");
+httpServer.registerContentType("js", "application/javascript");
+
+httpServer.registerPathHandler(
+ "/doc-wrapped-lines.html",
+ (request, response) => {
+ response.setStatusLine(request.httpVersion, 200, "OK");
+ response.write(`<!DOCTYPE html>
+ <html>
+ <head>
+ <script type="text/javascript">
+ const cs1 = getComputedStyle(document.documentElement);
+ const cs2 = getComputedStyle(document.documentElement);
+ // This line generates a very long inline-preview which is loaded a bit later after the
+ // initial positions for the page has been calculated
+ function add(a,b,k){var result=a+b;return k(result)}function sub(a,b,k){var result=a-b;return k(result)}function mul(a,b,k){var result=a*b;return k(result)}function div(a,b,k){var result=a/b;return k(result)}function arithmetic(){
+ add(4,4,function(a){
+ sub(a,2,function(b){mul(b,3,function(c){div(c,2,function(d){console.log("arithmetic",d)})})})})};
+ isNaN(cs1, cs2);
+ const foo = { prop: 0 };
+ const bar = Math.min(foo);
+ const myVeryLongVariableNameThatMayWrap = 42;
+ myVeryLongVariableNameThatMayWrap * 2;
+ debugger;
+ </script>
+ </head>
+ </html>
+ `);
+ }
+);
+
+const BASE_URL = `http://localhost:${httpServer.identity.primaryPort}/`;
+
+add_task(async function () {
+ await pushPref("devtools.toolbox.footer.height", 500);
+ await pushPref("devtools.debugger.ui.editor-wrapping", true);
+
+ // Reset toolbox height and end panel size to avoid impacting other tests
+ registerCleanupFunction(() => {
+ Services.prefs.clearUserPref("debugger.end-panel-size");
+ });
+
+ const dbg = await initDebuggerWithAbsoluteURL(
+ `${BASE_URL}doc-wrapped-lines.html`
+ );
+ await waitForSources(dbg, "doc-wrapped-lines.html");
+
+ const onReloaded = reload(dbg);
+ await waitForPaused(dbg);
+
+ await assertPreviews(dbg, [
+ {
+ line: 13,
+ column: 18,
+ expression: "foo",
+ fields: [["prop", "0"]],
+ },
+ {
+ line: 14,
+ column: 18,
+ result: "NaN",
+ expression: "bar",
+ },
+ ]);
+
+ info("Resize the editor until `myVeryLongVariableNameThatMayWrap` wraps");
+ // Use splitter to resize to make sure CodeMirror internal state is refreshed
+ // in such case (CodeMirror already handle window resize on its own).
+ const splitter = dbg.win.document.querySelectorAll(".splitter")[1];
+ const splitterOriginalX = splitter.getBoundingClientRect().left;
+ ok(splitter, "Got the splitter");
+
+ let longToken = getTokenElAtLine(
+ dbg,
+ "myVeryLongVariableNameThatMayWrap",
+ 16
+ );
+ const longTokenBoundingClientRect = longToken.getBoundingClientRect();
+ await resizeSplitter(
+ dbg,
+ splitter,
+ longTokenBoundingClientRect.left + longTokenBoundingClientRect.width / 2
+ );
+
+ info("Wait until the token does wrap");
+ longToken = await waitFor(() => {
+ const token = getTokenElAtLine(
+ dbg,
+ "myVeryLongVariableNameThatMayWrap",
+ 16
+ );
+ if (token.getBoxQuads().length === 1) {
+ return null;
+ }
+ return token;
+ });
+
+ longToken.scrollIntoView();
+
+ await assertPreviews(dbg, [
+ {
+ line: 16,
+ column: 13,
+ expression: "myVeryLongVariableNameThatMayWrap",
+ result: "42",
+ },
+ ]);
+
+ // clearing the pref isn't enough to have consistent sizes between runs,
+ // so set it back to its original position
+ await resizeSplitter(dbg, splitter, splitterOriginalX);
+
+ await resume(dbg);
+ await onReloaded;
+
+ Services.prefs.clearUserPref("debugger.end-panel-size");
+ await wait(1000);
+});
+
+async function resizeSplitter(dbg, splitterEl, x) {
+ EventUtils.synthesizeMouse(splitterEl, 0, 0, { type: "mousedown" }, dbg.win);
+
+ // Resizing the editor should cause codeMirror to refresh
+ const cm = dbg.getCM();
+ const onEditorRefreshed = new Promise(resolve =>
+ cm.on("refresh", function onCmRefresh() {
+ cm.off("refresh", onCmRefresh);
+ resolve();
+ })
+ );
+ // Move the splitter of the secondary pane to the middle of the token,
+ // this should cause the token to wrap.
+ EventUtils.synthesizeMouseAtPoint(
+ x,
+ splitterEl.getBoundingClientRect().top + 10,
+ { type: "mousemove" },
+ dbg.win
+ );
+
+ // Stop dragging
+ EventUtils.synthesizeMouseAtCenter(splitterEl, { type: "mouseup" }, dbg.win);
+
+ await onEditorRefreshed;
+ ok(true, "CodeMirror was refreshed when resizing the editor");
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-preview.js b/devtools/client/debugger/test/mochitest/browser_dbg-preview.js
new file mode 100644
index 0000000000..532854548c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-preview.js
@@ -0,0 +1,333 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test hovering on an object, which will show a popup and on a
+// simple value, which will show a tooltip.
+
+"use strict";
+
+// Showing/hiding the preview tooltip can be slow as we wait for CodeMirror scroll...
+requestLongerTimeout(2);
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-preview.html", "preview.js");
+
+ await testPreviews(dbg, "testInline", [
+ { line: 17, column: 16, expression: "prop", result: 2 },
+ ]);
+
+ await selectSource(dbg, "preview.js");
+ await testBucketedArray(dbg);
+
+ await testPreviews(dbg, "empties", [
+ { line: 6, column: 9, expression: "a", result: '""' },
+ { line: 7, column: 9, expression: "b", result: "false" },
+ { line: 8, column: 9, expression: "c", result: "undefined" },
+ { line: 9, column: 9, expression: "d", result: "null" },
+ ]);
+
+ await testPreviews(dbg, "objects", [
+ { line: 27, column: 10, expression: "empty", result: "Object" },
+ { line: 28, column: 22, expression: "foo", result: 1 },
+ ]);
+
+ await testPreviews(dbg, "smalls", [
+ { line: 14, column: 9, expression: "a", result: '"..."' },
+ { line: 15, column: 9, expression: "b", result: "true" },
+ { line: 16, column: 9, expression: "c", result: "1" },
+ {
+ line: 17,
+ column: 9,
+ expression: "d",
+ fields: [["length", "0"]],
+ },
+ ]);
+
+ await testPreviews(dbg, "classPreview", [
+ { line: 50, column: 20, expression: "x", result: 1 },
+ { line: 50, column: 29, expression: "#privateVar", result: 2 },
+ {
+ line: 50,
+ column: 47,
+ expression: "#privateStatic",
+ fields: [
+ ["first", `"a"`],
+ ["second", `"b"`],
+ ],
+ },
+ {
+ line: 51,
+ column: 26,
+ expression: "this",
+ fields: [
+ ["x", "1"],
+ ["#privateVar", "2"],
+ ],
+ },
+ { line: 51, column: 39, expression: "#privateVar", result: 2 },
+ ]);
+
+ await testPreviews(dbg, "multipleTokens", [
+ { line: 81, column: 4, expression: "foo", result: "Object" },
+ { line: 81, column: 11, expression: "blip", result: "Object" },
+ { line: 82, column: 8, expression: "bar", result: "Object" },
+ { line: 84, column: 16, expression: "boom", result: `0` },
+ ]);
+
+ await testHoveringInvalidTargetTokens(dbg);
+
+ info(
+ "Check that closing the preview tooltip doesn't release the underlying object actor"
+ );
+ invokeInTab("classPreview");
+ await waitForPaused(dbg);
+ info("Display popup a first time and hide it");
+ await assertPreviews(dbg, [
+ {
+ line: 60,
+ column: 7,
+ expression: "y",
+ fields: [["hello", "{…}"]],
+ },
+ ]);
+
+ info("Display the popup again and try to expand a property");
+ const { element: popupEl, tokenEl } = await tryHovering(
+ dbg,
+ 60,
+ 7,
+ "previewPopup"
+ );
+ const nodes = popupEl.querySelectorAll(".preview-popup .node");
+ const initialNodesLength = nodes.length;
+ nodes[1].querySelector(".arrow").click();
+ await waitFor(
+ () =>
+ popupEl.querySelectorAll(".preview-popup .node").length >
+ initialNodesLength
+ );
+ ok(true, `"hello" was expanded`);
+ await closePreviewForToken(dbg, tokenEl, "popup");
+ await resume(dbg);
+
+ await testMovingFromATokenToAnother(dbg);
+});
+
+async function testPreviews(dbg, fnName, previews) {
+ invokeInTab(fnName);
+ await waitForPaused(dbg);
+
+ await assertPreviews(dbg, previews);
+ await resume(dbg);
+
+ info(`Ran tests for ${fnName}`);
+}
+
+async function testHoveringInvalidTargetTokens(dbg) {
+ // Test hovering tokens for which we shouldn't have a preview popup displayed
+ invokeInTab("invalidTargets");
+ await waitForPaused(dbg);
+ // CodeMirror refreshes after inline previews are displayed, so wait until they're rendered.
+ await waitForInlinePreviews(dbg);
+
+ await assertNoPreviews(dbg, `"a"`, 69, 4);
+ await assertNoPreviews(dbg, `false`, 70, 4);
+ await assertNoPreviews(dbg, `undefined`, 71, 4);
+ await assertNoPreviews(dbg, `null`, 72, 4);
+ await assertNoPreviews(dbg, `42`, 73, 4);
+ await assertNoPreviews(dbg, `const`, 74, 4);
+
+ // checking inline preview widget
+ // Move the cursor to the top left corner to have a clean state
+ resetCursorPositionToTopLeftCorner(dbg);
+
+ const inlinePreviewEl = findElementWithSelector(
+ dbg,
+ ".CodeMirror-code .CodeMirror-widget"
+ );
+ is(inlinePreviewEl.innerText, `myVar:"foo"`, "got expected inline preview");
+
+ const racePromise = Promise.any([
+ waitForElement(dbg, "previewPopup"),
+ wait(500).then(() => "TIMEOUT"),
+ ]);
+ // Hover over the inline preview element
+ hoverToken(inlinePreviewEl);
+ const raceResult = await racePromise;
+ is(raceResult, "TIMEOUT", "No popup was displayed over the inline preview");
+
+ await resume(dbg);
+}
+
+async function assertNoPreviews(dbg, expression, line, column) {
+ // Move the cursor to the top left corner to have a clean state
+ resetCursorPositionToTopLeftCorner(dbg);
+
+ // Hover the token
+ const result = await Promise.race([
+ tryHoverTokenAtLine(dbg, expression, line, column, "previewPopup"),
+ wait(500).then(() => "TIMEOUT"),
+ ]);
+ is(result, "TIMEOUT", `No popup was displayed when hovering "${expression}"`);
+}
+
+function resetCursorPositionToTopLeftCorner(dbg) {
+ EventUtils.synthesizeMouse(
+ findElement(dbg, "codeMirror"),
+ 0,
+ 0,
+ {
+ type: "mousemove",
+ },
+ dbg.win
+ );
+}
+
+async function testMovingFromATokenToAnother(dbg) {
+ info(
+ "Check that moving the mouse to another token when popup is displayed updates highlighted token and popup position"
+ );
+ invokeInTab("classPreview");
+ await waitForPaused(dbg);
+
+ info("Hover token `Foo` in `Foo.#privateStatic` expression");
+ const fooTokenEl = getTokenElAtLine(dbg, "Foo", 50, 44);
+ const cm = getCM(dbg);
+ const onScrolled = waitForScrolling(cm);
+ cm.scrollIntoView({ line: 49, ch: 0 }, 0);
+ await onScrolled;
+ const { element: fooPopupEl } = await tryHoverToken(dbg, fooTokenEl, "popup");
+ ok(!!fooPopupEl, "popup is displayed");
+ ok(
+ fooTokenEl.classList.contains("preview-token"),
+ "`Foo` token is highlighted"
+ );
+
+ // store original position
+ const originalPopupPosition = fooPopupEl.getBoundingClientRect().x;
+
+ info(
+ "Move mouse over the `#privateStatic` token in `Foo.#privateStatic` expression"
+ );
+ const privateStaticTokenEl = getTokenElAtLine(dbg, "#privateStatic", 50, 48);
+
+ // The sequence of event to trigger the bug this is covering isn't easily reproducible
+ // by firing a few chosen events (because of React async rendering), so we are going to
+ // mimick moving the mouse from the `Foo` to `#privateStatic` in a given amount of time
+
+ // So get all the different token quads to compute their center
+ const fooTokenQuad = fooTokenEl.getBoxQuads()[0];
+ const privateStaticTokenQuad = privateStaticTokenEl.getBoxQuads()[0];
+ const fooXCenter =
+ fooTokenQuad.p1.x + (fooTokenQuad.p2.x - fooTokenQuad.p1.x) / 2;
+ const fooYCenter =
+ fooTokenQuad.p1.y + (fooTokenQuad.p3.y - fooTokenQuad.p1.y) / 2;
+ const privateStaticXCenter =
+ privateStaticTokenQuad.p1.x +
+ (privateStaticTokenQuad.p2.x - privateStaticTokenQuad.p1.x) / 2;
+ const privateStaticYCenter =
+ privateStaticTokenQuad.p1.y +
+ (privateStaticTokenQuad.p3.y - privateStaticTokenQuad.p1.y) / 2;
+
+ // we can then compute the distance to cover between the two token centers
+ const xDistance = privateStaticXCenter - fooXCenter;
+ const yDistance = privateStaticYCenter - fooYCenter;
+ const movementDuration = 50;
+ const xIncrements = xDistance / movementDuration;
+ const yIncrements = yDistance / movementDuration;
+
+ // Finally, we're going to fire a mouseover event every ms
+ info("Move mousecursor between the `Foo` token to the `#privateStatic` one");
+ for (let i = 0; i < movementDuration; i++) {
+ const x = fooXCenter + (yDistance + i * xIncrements);
+ const y = fooYCenter + (yDistance + i * yIncrements);
+ EventUtils.synthesizeMouseAtPoint(
+ x,
+ y,
+ {
+ type: "mouseover",
+ },
+ fooTokenEl.ownerGlobal
+ );
+ await wait(1);
+ }
+
+ info("Wait for the popup to display the data for `#privateStatic`");
+ await waitFor(() => {
+ const popup = findElement(dbg, "popup");
+ if (!popup) {
+ return false;
+ }
+ // for `Foo`, the header text content is "Foo", so when it's "Object", we know the
+ // popup was updated
+ return (
+ popup.querySelector(".preview-popup .node .objectBox")?.textContent ===
+ "Object"
+ );
+ });
+ ok(true, "Popup is displayed for #privateStatic");
+
+ ok(
+ !fooTokenEl.classList.contains("preview-token"),
+ "`Foo` token is not highlighted anymore"
+ );
+ ok(
+ privateStaticTokenEl.classList.contains("preview-token"),
+ "`#privateStatic` token is highlighted"
+ );
+
+ const privateStaticPopupEl = await waitForElement(dbg, "popup");
+ const newPopupPosition = privateStaticPopupEl.getBoundingClientRect().x;
+ isnot(
+ Math.round(newPopupPosition),
+ Math.round(originalPopupPosition),
+ `Popup position was updated`
+ );
+
+ await resume(dbg);
+}
+
+async function testBucketedArray(dbg) {
+ invokeInTab("largeArray");
+ await waitForPaused(dbg);
+ const { element: popupEl, tokenEl } = await tryHovering(
+ dbg,
+ 34,
+ 10,
+ "previewPopup"
+ );
+
+ info("Wait for top level node to expand and child nodes to load");
+ await waitUntil(
+ () => popupEl.querySelectorAll(".preview-popup .node").length > 1
+ );
+
+ const oiNodes = Array.from(popupEl.querySelectorAll(".preview-popup .node"));
+
+ const displayedPropertyNames = oiNodes.map(
+ oiNode => oiNode.querySelector(".object-label")?.textContent
+ );
+ Assert.deepEqual(displayedPropertyNames, [
+ null, // No property name is displayed for the root node
+ "[0…99]",
+ "[100…100]",
+ "length",
+ "<prototype>",
+ ]);
+ const node = oiNodes.find(
+ oiNode => oiNode.querySelector(".object-label")?.textContent === "length"
+ );
+ if (!node) {
+ ok(false, `The "length" property is not displayed in the popup`);
+ } else {
+ is(
+ node.querySelector(".objectBox").textContent,
+ "101",
+ `The "length" property has the expected value`
+ );
+ }
+ await closePreviewForToken(dbg, tokenEl, "popup");
+
+ await resume(dbg);
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-project-root.js b/devtools/client/debugger/test/mochitest/browser_dbg-project-root.js
new file mode 100644
index 0000000000..e1e3c4a9ad
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-project-root.js
@@ -0,0 +1,119 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// This test covers changing to a distinct "project root"
+// i.e. displaying only one particular thread, domain, or directory in the Source Tree.
+
+"use strict";
+
+const httpServer = createTestHTTPServer();
+const HOST = `localhost:${httpServer.identity.primaryPort}`;
+const BASE_URL = `http://${HOST}/`;
+
+const INDEX_PAGE_CONTENT = `<!DOCTYPE html>
+ <html>
+ <head>
+ <script type="text/javascript" src="/root-script.js"></script>
+ <script type="text/javascript" src="/folder/folder-script.js"></script>
+ <script type="text/javascript" src="/folder/sub-folder/sub-folder-script.js"></script>
+ </head>
+ <body></body>
+ </html>`;
+
+httpServer.registerPathHandler("/index.html", (request, response) => {
+ response.setStatusLine(request.httpVersion, 200, "OK");
+ response.write(INDEX_PAGE_CONTENT);
+});
+httpServer.registerPathHandler("/root-script.js", (request, response) => {
+ response.setStatusLine(request.httpVersion, 200, "OK");
+ response.write("console.log('root script')");
+});
+httpServer.registerPathHandler(
+ "/folder/folder-script.js",
+ (request, response) => {
+ response.setStatusLine(request.httpVersion, 200, "OK");
+ response.write("console.log('folder script')");
+ }
+);
+httpServer.registerPathHandler(
+ "/folder/sub-folder/sub-folder-script.js",
+ (request, response) => {
+ response.setStatusLine(request.httpVersion, 200, "OK");
+ response.write("console.log('sub folder script')");
+ }
+);
+
+const ALL_SCRIPTS = [
+ "root-script.js",
+ "folder-script.js",
+ "sub-folder-script.js",
+];
+
+add_task(async function testProjectRoot() {
+ const dbg = await initDebuggerWithAbsoluteURL(
+ BASE_URL + "index.html",
+ ...ALL_SCRIPTS
+ );
+
+ await waitForSourcesInSourceTree(dbg, ALL_SCRIPTS);
+
+ info("Select the Main Thread as project root");
+ const threadItem = findSourceNodeWithText(dbg, "Main Thread");
+ await setProjectRoot(dbg, threadItem);
+ assertRootLabel(dbg, "Main Thread");
+ await waitForSourcesInSourceTree(dbg, ALL_SCRIPTS);
+
+ info("Select the host as project root");
+ const hostItem = findSourceNodeWithText(dbg, HOST);
+ await setProjectRoot(dbg, hostItem);
+ assertRootLabel(dbg, HOST);
+ await waitForSourcesInSourceTree(dbg, ALL_SCRIPTS);
+
+ info("Select 'folder' as project root");
+ const folderItem = findSourceNodeWithText(dbg, "folder");
+ await setProjectRoot(dbg, folderItem);
+ assertRootLabel(dbg, "folder");
+ await waitForSourcesInSourceTree(dbg, [
+ "folder-script.js",
+ "sub-folder-script.js",
+ ]);
+
+ info("Reload and see if project root is preserved");
+ await reload(dbg, "folder-script.js", "sub-folder-script.js");
+ assertRootLabel(dbg, "folder");
+ await waitForSourcesInSourceTree(dbg, [
+ "folder-script.js",
+ "sub-folder-script.js",
+ ]);
+
+ info("Select 'sub-folder' as project root");
+ const subFolderItem = findSourceNodeWithText(dbg, "sub-folder");
+ await setProjectRoot(dbg, subFolderItem);
+ assertRootLabel(dbg, "sub-folder");
+ await waitForSourcesInSourceTree(dbg, ["sub-folder-script.js"]);
+
+ info("Clear project root");
+ await clearProjectRoot(dbg);
+ await waitForSourcesInSourceTree(dbg, ALL_SCRIPTS);
+});
+
+async function setProjectRoot(dbg, treeNode) {
+ return triggerSourceTreeContextMenu(
+ dbg,
+ treeNode,
+ "#node-set-directory-root"
+ );
+}
+
+function assertRootLabel(dbg, label) {
+ const rootHeaderLabel = dbg.win.document.querySelector(
+ ".sources-clear-root-label"
+ );
+ is(rootHeaderLabel.textContent, label);
+}
+
+async function clearProjectRoot(dbg) {
+ const rootHeader = dbg.win.document.querySelector(".sources-clear-root");
+ rootHeader.click();
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-project-search.js b/devtools/client/debugger/test/mochitest/browser_dbg-project-search.js
new file mode 100644
index 0000000000..988e70e908
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-project-search.js
@@ -0,0 +1,306 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Testing various project search features
+
+"use strict";
+
+requestLongerTimeout(3);
+
+add_task(async function testProjectSearchCloseOnNavigation() {
+ const dbg = await initDebugger(
+ "doc-script-switching.html",
+ "script-switching-01.js"
+ );
+
+ await selectSource(dbg, "script-switching-01.js");
+
+ await openProjectSearch(dbg);
+
+ ok(
+ !findElement(dbg, "projectSearchRefreshButton"),
+ "The refresh button is only visible after having done a search"
+ );
+
+ await doProjectSearch(dbg, "function", 2);
+
+ is(getExpandedResultsCount(dbg), 5);
+
+ is(dbg.selectors.getActiveSearch(), "project");
+
+ const refreshButton = findElement(dbg, "projectSearchRefreshButton");
+ ok(
+ refreshButton,
+ "Refresh button is visible right after search is completed"
+ );
+ ok(
+ !refreshButton.classList.contains("highlight"),
+ "Refresh button is *not* highlighted by default"
+ );
+
+ await navigate(dbg, "doc-scripts.html");
+
+ // Project search is still visible after navigation
+ is(dbg.selectors.getActiveSearch(), "project");
+ // With same search results
+ is(getExpandedResultsCount(dbg), 5);
+
+ ok(
+ refreshButton.classList.contains("highlight"),
+ "Refresh button is highlighted after navigation"
+ );
+
+ info("Try to open a discarded source");
+ await clickElement(dbg, "fileMatch");
+
+ info("Wait for the warning popup to be visible");
+ // We are waiting for the popup to be added...
+ await waitFor(() => dbg.win.document.querySelector(".unavailable-source"));
+ // ...and verify that the popup is made visible.
+ await waitFor(() => dbg.win.document.querySelector(".tooltip-shown"));
+ info("Retry to open the discard source, this should hide the popup");
+ await clickElement(dbg, "fileMatch");
+ info("Wait for the popup to be hidden");
+ // Note that .unavailable-source won't be removed from the DOM
+ await waitFor(() => !dbg.win.document.querySelector(".tooltip-visible"));
+
+ info("Refresh results against the new page");
+ refreshButton.click();
+
+ // Wait for the search to be updated against the new page
+ await waitForSearchResults(dbg, 5);
+ is(getExpandedResultsCount(dbg), 29);
+ ok(
+ !refreshButton.classList.contains("highlight"),
+ "Refresh button is no longer highlighted after refreshing the search"
+ );
+});
+
+add_task(async function testSimpleProjectSearch() {
+ // Start with side panel collapsed so we can assert that the project search keyboard
+ // shortcut will open it.
+ await pushPref("devtools.debugger.start-panel-collapsed", true);
+
+ const dbg = await initDebugger(
+ "doc-script-switching.html",
+ "script-switching-01.js"
+ );
+
+ await openProjectSearch(dbg);
+
+ ok(
+ !!findElementWithSelector(dbg, ".project-text-search"),
+ "Project search is visible"
+ );
+
+ const searchTerm = "first";
+ await doProjectSearch(dbg, searchTerm, 1);
+
+ const queryMatch = findElement(dbg, "fileMatch").querySelector(
+ ".query-match"
+ );
+ is(
+ queryMatch.innerText,
+ searchTerm,
+ "The highlighted text matches the search term"
+ );
+
+ info("Select a result match to open the location in the source");
+ await clickElement(dbg, "fileMatch");
+ await waitForSelectedSource(dbg, "script-switching-01.js");
+
+ info("Close start sidebar");
+ const startPanelToggleButtonEl = findElementWithSelector(
+ dbg,
+ ".toggle-button.start"
+ );
+ startPanelToggleButtonEl.click();
+ await waitFor(() => startPanelToggleButtonEl.classList.contains("collapsed"));
+
+ info("Try to open project search again");
+ await openProjectSearch(dbg);
+ ok(
+ !!findElementWithSelector(dbg, ".project-text-search"),
+ "Project search is visible"
+ );
+});
+
+add_task(async function testMatchesForRegexSearches() {
+ const dbg = await initDebugger("doc-react.html", "App.js");
+ await openProjectSearch(dbg);
+
+ type(dbg, "import .* from 'react'");
+ await clickElement(dbg, "projectSearchModifiersRegexMatch");
+
+ await waitForSearchResults(dbg, 2);
+
+ const queryMatch = findAllElements(dbg, "fileMatch")[1].querySelector(
+ ".query-match"
+ );
+
+ is(
+ queryMatch.innerText,
+ "import React, { Component } from 'react'",
+ "The highlighted text matches the search term"
+ );
+
+ // Turn off the regex modifier so does not break tests below
+ await clickElement(dbg, "projectSearchModifiersRegexMatch");
+});
+
+// Test expanding search results to reveal the search matches.
+add_task(async function testExpandSearchResultsToShowMatches() {
+ const dbg = await initDebugger("doc-react.html", "App.js");
+
+ await openProjectSearch(dbg);
+ await doProjectSearch(dbg, "we", 19);
+
+ is(getExpandedResultsCount(dbg), 159);
+
+ const collapsedNodes = findAllElements(dbg, "projectSearchCollapsed");
+ is(collapsedNodes.length, 1);
+
+ collapsedNodes[0].click();
+
+ is(getExpandedResultsCount(dbg), 367);
+});
+
+add_task(async function testSearchModifiers() {
+ const dbg = await initDebugger("doc-react.html", "App.js");
+
+ await openProjectSearch(dbg);
+
+ await assertProjectSearchModifier(
+ dbg,
+ "projectSearchModifiersCaseSensitive",
+ "FIELDS",
+ "case sensitive",
+ { resultWithModifierOn: 0, resultWithModifierOff: 2 }
+ );
+ await assertProjectSearchModifier(
+ dbg,
+ "projectSearchModifiersRegexMatch",
+ `\\*`,
+ "regex match",
+ { resultWithModifierOn: 12, resultWithModifierOff: 0 }
+ );
+ await assertProjectSearchModifier(
+ dbg,
+ "projectSearchModifiersWholeWordMatch",
+ "so",
+ "whole word match",
+ { resultWithModifierOn: 6, resultWithModifierOff: 16 }
+ );
+});
+
+add_task(async function testSearchExcludePatterns() {
+ const dbg = await initDebugger("doc-react.html", "App.js");
+
+ info("Search across all files");
+ await openProjectSearch(dbg);
+ let fileResults = await doProjectSearch(dbg, "console", 5);
+
+ let resultsFromNodeModules = [...fileResults].filter(result =>
+ result.innerText.includes("node_modules")
+ );
+
+ is(
+ resultsFromNodeModules.length,
+ 3,
+ "3 results were found from node_modules"
+ );
+
+ info("Excludes search results based on multiple search patterns");
+
+ await clickElement(dbg, "excludePatternsInput");
+ type(dbg, "App.js, main.js");
+ pressKey(dbg, "Enter");
+
+ fileResults = await waitForSearchResults(dbg, 3);
+
+ const resultsFromAppJS = [...fileResults].filter(result =>
+ result.innerText.includes("App.js")
+ );
+
+ is(resultsFromAppJS.length, 0, "None of the results is from the App.js file");
+
+ const resultsFromMainJS = [...fileResults].filter(result =>
+ result.innerText.includes("main.js")
+ );
+
+ is(
+ resultsFromMainJS.length,
+ 0,
+ "None of the results is from the main.js file"
+ );
+
+ info("Excludes search results from node modules files");
+
+ await clearElement(dbg, "excludePatternsInput");
+ type(dbg, "**/node_modules/**");
+ pressKey(dbg, "Enter");
+
+ fileResults = await waitForSearchResults(dbg, 2);
+
+ resultsFromNodeModules = [...fileResults].filter(result =>
+ result.innerText.includes("node_modules")
+ );
+
+ is(
+ resultsFromNodeModules.length,
+ 0,
+ "None of the results is from the node modules files"
+ );
+
+ info("Assert that the exclude pattern is persisted across reloads");
+ await reloadBrowser();
+ await openProjectSearch(dbg);
+
+ const excludePatternsInputElement = await waitForElement(
+ dbg,
+ "excludePatternsInput"
+ );
+
+ is(
+ excludePatternsInputElement.value,
+ "**/node_modules/**",
+ "The exclude pattern for node modules is persisted accross reloads"
+ );
+
+ // Clear the fields so that it does not impact on the subsequent tests
+ await clearElement(dbg, "projectSearchSearchInput");
+ await clearElement(dbg, "excludePatternsInput");
+ pressKey(dbg, "Enter");
+});
+
+async function assertProjectSearchModifier(
+ dbg,
+ searchModifierBtn,
+ searchTerm,
+ title,
+ expected
+) {
+ info(`Assert ${title} search modifier`);
+
+ type(dbg, searchTerm);
+ info(`Turn on the ${title} search modifier option`);
+ await clickElement(dbg, searchModifierBtn);
+ let results = await waitForSearchResults(dbg, expected.resultWithModifierOn);
+ is(
+ results.length,
+ expected.resultWithModifierOn,
+ `${results.length} results where found`
+ );
+
+ info(`Turn off the ${title} search modifier`);
+ await clickElement(dbg, searchModifierBtn);
+
+ results = await waitForSearchResults(dbg, expected.resultWithModifierOff);
+ is(
+ results.length,
+ expected.resultWithModifierOff,
+ `${results.length} results where found`
+ );
+ await clearElement(dbg, "projectSearchSearchInput");
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-quick-open.js b/devtools/client/debugger/test/mochitest/browser_dbg-quick-open.js
new file mode 100644
index 0000000000..5a1b76a7bd
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-quick-open.js
@@ -0,0 +1,172 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Testing quick open
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-script-switching.html");
+
+ // Inject lots of sources to go beyond the maximum limit of displayed sources (set to 100)
+ const injectedSources = await SpecialPowers.spawn(
+ gBrowser.selectedBrowser,
+ [],
+ function () {
+ const sources = [];
+ for (let i = 1; i <= 200; i++) {
+ const value = String(i).padStart(3, "0");
+ content.eval(
+ `function evalSource() {}; //# sourceURL=eval-source-${value}.js`
+ );
+ sources.push(`eval-source-${value}.js`);
+ }
+ return sources;
+ }
+ );
+ await waitForSources(dbg, ...injectedSources);
+
+ info("Test opening and closing");
+ await quickOpen(dbg, "");
+ // Only the first 100 results are shown in the quick open menu
+ await waitForResults(dbg, injectedSources.slice(0, 100));
+ is(resultCount(dbg), 100, "100 file results");
+ pressKey(dbg, "Escape");
+ assertQuickOpenDisabled(dbg);
+
+ info("Testing the number of results for source search");
+ await quickOpen(dbg, "sw");
+ await waitForResults(dbg, [undefined, undefined]);
+ is(resultCount(dbg), 2, "two file results");
+ pressKey(dbg, "Escape");
+
+ // We ensure that sources after maxResult limit are visible
+ info("Test that first and last eval source are visible");
+ await quickOpen(dbg, "eval-source-001.js");
+ await waitForResults(dbg, ["eval-source-001.js"]);
+ is(resultCount(dbg), 1, "one file result");
+ pressKey(dbg, "Escape");
+ await quickOpen(dbg, "eval-source-200.js");
+ await waitForResults(dbg, ["eval-source-200.js"]);
+ is(resultCount(dbg), 1, "one file result");
+ pressKey(dbg, "Escape");
+
+ info("Testing source search and check to see if source is selected");
+ await waitForSource(dbg, "script-switching-01.js");
+ await quickOpen(dbg, "sw1");
+ await waitForResults(dbg, ["script-switching-01.js"]);
+ is(resultCount(dbg), 1, "one file results");
+ pressKey(dbg, "Enter");
+ await waitForSelectedSource(dbg, "script-switching-01.js");
+
+ info("Test that results show tab icons");
+ await quickOpen(dbg, "sw1");
+ await waitForResults(dbg, ["script-switching-01.js"]);
+ await assertResultIsTab(dbg, 1);
+ pressKey(dbg, "Tab");
+
+ info(
+ "Testing arrow keys in source search and check to see if source is selected"
+ );
+ await quickOpen(dbg, "sw2");
+ await waitForResults(dbg, ["script-switching-02.js"]);
+ is(resultCount(dbg), 1, "one file results");
+ pressKey(dbg, "Down");
+ pressKey(dbg, "Enter");
+ await waitForSelectedSource(dbg, "script-switching-02.js");
+
+ info("Testing tab closes the search");
+ await quickOpen(dbg, "sw");
+ await waitForResults(dbg, [undefined, undefined]);
+ pressKey(dbg, "Tab");
+ assertQuickOpenDisabled(dbg);
+
+ info("Testing function search (anonymous fuctions should not display)");
+ await quickOpen(dbg, "", "quickOpenFunc");
+ await waitForResults(dbg, ["secondCall", "foo"]);
+ is(resultCount(dbg), 2, "two function results");
+
+ type(dbg, "@x");
+ await waitForResults(dbg, []);
+ is(resultCount(dbg), 0, "no functions with 'x' in name");
+
+ pressKey(dbg, "Escape");
+ assertQuickOpenDisabled(dbg);
+
+ info("Testing goto line:column");
+ assertLine(dbg, 0);
+ assertColumn(dbg, null);
+ await quickOpen(dbg, ":7:12");
+ await waitForResults(dbg, [undefined, undefined]);
+ pressKey(dbg, "Enter");
+ await waitForSelectedSource(dbg, "script-switching-02.js");
+ assertLine(dbg, 7);
+ assertColumn(dbg, 12);
+
+ info("Testing gotoSource");
+ await quickOpen(dbg, "sw1:5");
+ await waitForResults(dbg, ["script-switching-01.js"]);
+ pressKey(dbg, "Enter");
+ await waitForSelectedSource(dbg, "script-switching-01.js");
+ assertLine(dbg, 5);
+});
+
+function assertQuickOpenEnabled(dbg) {
+ is(dbg.selectors.getQuickOpenEnabled(), true, "quickOpen enabled");
+}
+
+function assertQuickOpenDisabled(dbg) {
+ is(dbg.selectors.getQuickOpenEnabled(), false, "quickOpen disabled");
+}
+
+function assertLine(dbg, lineNumber) {
+ is(
+ dbg.selectors.getSelectedLocation().line,
+ lineNumber,
+ `goto line is ${lineNumber}`
+ );
+}
+
+function assertColumn(dbg, columnNumber) {
+ let value = dbg.selectors.getSelectedLocation().column;
+ if (value === undefined) {
+ value = null;
+ } else {
+ // column is 0-based, while we want to mention 1-based in the test.
+ value++;
+ }
+ is(value, columnNumber, `goto column is ${columnNumber}`);
+}
+
+function resultCount(dbg) {
+ return findAllElements(dbg, "resultItems").length;
+}
+
+async function quickOpen(dbg, query, shortcut = "quickOpen") {
+ pressKey(dbg, shortcut);
+ assertQuickOpenEnabled(dbg);
+ query !== "" && type(dbg, query);
+}
+
+async function waitForResults(dbg, results) {
+ await waitForAllElements(dbg, "resultItems", results.length, true);
+
+ for (let i = 0; i < results.length; ++i) {
+ if (results[i] !== undefined) {
+ await waitForElement(dbg, "resultItemName", results[i], i + 1);
+ }
+ }
+}
+
+function findResultEl(dbg, index = 1) {
+ return waitForElementWithSelector(dbg, `.result-item:nth-child(${index})`);
+}
+
+async function assertResultIsTab(dbg, index) {
+ const el = await findResultEl(dbg, index);
+ ok(
+ el && !!el.querySelector(".tab.result-item-icon"),
+ "Result should be a tab"
+ );
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-react-app.js b/devtools/client/debugger/test/mochitest/browser_dbg-react-app.js
new file mode 100644
index 0000000000..2882bba1b6
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-react-app.js
@@ -0,0 +1,38 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+add_task(async function () {
+ await pushPref("devtools.debugger.map-scopes-enabled", true);
+ const dbg = await initDebugger("doc-react.html", "App.js");
+
+ await selectSource(dbg, "App.js");
+ await addBreakpoint(dbg, "App.js", 11);
+
+ info("Test previewing an immutable Map inside of a react component");
+ invokeInTab("clickButton");
+ await waitForPaused(dbg);
+
+ await waitForState(dbg, state =>
+ dbg.selectors.getSelectedScopeMappings(dbg.selectors.getCurrentThread())
+ );
+
+ await assertPreviews(dbg, [
+ {
+ line: 10,
+ column: 22,
+ expression: "fields",
+ fields: [["size", "1"]],
+ },
+ ]);
+
+ info("Verify that the file is flagged as a React module");
+ const sourceTab = findElementWithSelector(dbg, ".source-tab.active");
+ ok(
+ sourceTab.querySelector(".source-icon.react"),
+ "Source tab has a React icon"
+ );
+ assertSourceIcon(dbg, "App.js", "react");
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-react-jsx.js b/devtools/client/debugger/test/mochitest/browser_dbg-react-jsx.js
new file mode 100644
index 0000000000..12b4e57b35
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-react-jsx.js
@@ -0,0 +1,20 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test that dynamically generated <script> elements which contain source maps
+// will be shown in the debugger.
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-react-jsx.html");
+
+ invokeInTab("injectScript");
+ await waitForSources(dbg, "doc-react-jsx.html", "main.js");
+ await selectSource(dbg, "main.js");
+ await addBreakpoint(dbg, "main.js", 3);
+ invokeInTab("foo");
+ await waitForPausedInOriginalFileAndToggleMapScopes(dbg);
+ assertPausedAtSourceAndLine(dbg, findSource(dbg, "main.js").id, 3);
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-reducer-cleanup-on-target-removal.js b/devtools/client/debugger/test/mochitest/browser_dbg-reducer-cleanup-on-target-removal.js
new file mode 100644
index 0000000000..ad7ff57f2a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-reducer-cleanup-on-target-removal.js
@@ -0,0 +1,180 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Verify that reducers are cleared on target removal
+
+"use strict";
+
+const testServer = createVersionizedHttpTestServer(
+ "examples/sourcemaps-reload-uncompressed"
+);
+const IFRAME_TEST_URL = testServer.urlFor("index.html");
+
+// Embed the integration test page into an iframe
+const TEST_URI = `https://example.com/document-builder.sjs?html=
+<iframe src="${encodeURI(IFRAME_TEST_URL)}"></iframe><body>`;
+
+add_task(async function () {
+ if (!isEveryFrameTargetEnabled()) {
+ ok(true, "This test is disabled without EFT");
+ return;
+ }
+ await pushPref("devtools.debugger.map-scopes-enabled", true);
+ const dbg = await initDebuggerWithAbsoluteURL(TEST_URI);
+
+ const frameBC = await SpecialPowers.spawn(
+ gBrowser.selectedBrowser,
+ [],
+ function () {
+ return content.document.querySelector("iframe").browsingContext;
+ }
+ );
+
+ info("Pause on an original source to ensure filling the reducers");
+ await waitForSource(dbg, "original.js");
+ await selectSource(dbg, "original.js");
+ await addBreakpoint(dbg, "original.js", 8);
+
+ // The following task will never resolve as the call to foo()
+ // will be paused and never released
+ PromiseTestUtils.allowMatchingRejectionsGlobally(
+ /Actor 'SpecialPowers' destroyed before query 'Spawn'/
+ );
+ SpecialPowers.spawn(frameBC, [], function () {
+ return content.wrappedJSObject.foo();
+ });
+
+ await waitForPaused(dbg, "original.js");
+ assertPausedAtSourceAndLine(dbg, findSource(dbg, "original.js").id, 8);
+ // Also open the genertated source to populate the reducer for original and generated sources
+ await dbg.actions.jumpToMappedSelectedLocation();
+ await waitForSelectedSource(dbg, "bundle.js");
+
+ // Assert that reducer do have some data before remove the target.
+ Assert.greater(dbg.selectors.getSourceCount(), 0, "Some sources exists");
+ is(dbg.selectors.getBreakpointCount(), 1, "There is one breakpoint");
+ is(dbg.selectors.getSourceTabs().length, 2, "Two tabs are opened");
+ Assert.greater(
+ dbg.selectors.getAllThreads().length,
+ 1,
+ "There is many targets/threads involved by the intergration test"
+ );
+ ok(
+ !!dbg.selectors.getSourcesTreeSources().length,
+ "There is sources displayed in the SourceTree"
+ );
+ is(
+ dbg.selectors.getSelectedLocation().source.id,
+ findSource(dbg, "bundle.js").id,
+ "The generated source is reporeted as selected"
+ );
+ ok(!!dbg.selectors.getFocusedSourceItem(), "Has a focused source tree item");
+ Assert.greater(
+ dbg.selectors.getExpandedState().size,
+ 0,
+ "Has some expanded source tree items"
+ );
+
+ // But also directly querying the reducer states, as we don't necessarily
+ // have selectors exposing their raw internals
+ let state = dbg.store.getState();
+ ok(
+ !!Object.keys(state.ast.mutableOriginalSourcesSymbols).length,
+ "Some symbols for original sources exists"
+ );
+ ok(
+ !!Object.keys(state.ast.mutableSourceActorSymbols).length,
+ "Some symbols for generated sources exists"
+ );
+ ok(!!Object.keys(state.ast.mutableInScopeLines).length, "Some scopes exists");
+ Assert.greater(
+ state.sourceActors.mutableSourceActors.size,
+ 0,
+ "Some source actor exists"
+ );
+ Assert.greater(
+ state.sourceActors.mutableBreakableLines.size,
+ 0,
+ "Some breakable line exists"
+ );
+ Assert.greater(
+ state.sources.mutableBreakpointPositions.size,
+ 0,
+ "Some breakable positions exists"
+ );
+ Assert.greater(
+ state.sources.mutableOriginalBreakableLines.size,
+ 0,
+ "Some original breakable lines exists"
+ );
+
+ info("Remove the iframe");
+ await SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () {
+ content.document.querySelector("iframe").remove();
+ });
+
+ info("Wait for all sources to be removed");
+ await waitFor(() => dbg.selectors.getSourceCount() == 0);
+ // The pause thread being removed, we are no longer paused.
+ assertNotPaused(dbg);
+
+ // Assert they largest reducer data is cleared on thread removal
+
+ // First via common selectors
+ is(dbg.selectors.getSourceCount(), 0, "No sources exists");
+ is(dbg.selectors.getBreakpointCount(), 0, "No breakpoints exists");
+ is(dbg.selectors.getSourceTabs().length, 0, "No tabs exists");
+ is(
+ dbg.selectors.getAllThreads().length,
+ 1,
+ "There is only the top level target/thread"
+ );
+ is(
+ dbg.selectors.getSourcesTreeSources().length,
+ 0,
+ "There is no source in the SourceTree"
+ );
+ is(
+ dbg.selectors.getSelectedLocation(),
+ null,
+ "Selected location is nullified as the selected source has been removed"
+ );
+ ok(!dbg.selectors.getFocusedSourceItem(), "No more focused source tree item");
+ is(
+ dbg.selectors.getExpandedState().size,
+ 0,
+ "No more expanded source tree items"
+ );
+
+ // But also directly querying the reducer states, as we don't necessarily
+ // have selectors exposing their raw internals
+ state = dbg.store.getState();
+ is(
+ Object.keys(state.ast.mutableOriginalSourcesSymbols).length,
+ 0,
+ "No symbols for original sources exists"
+ );
+ is(
+ Object.keys(state.ast.mutableSourceActorSymbols).length,
+ 0,
+ "No symbols for generated sources exists"
+ );
+ is(Object.keys(state.ast.mutableInScopeLines).length, 0, "No scopes exists");
+ is(state.sourceActors.mutableSourceActors.size, 0, "No source actor exists");
+ is(
+ state.sourceActors.mutableBreakableLines.size,
+ 0,
+ "No breakable line exists"
+ );
+ is(
+ state.sources.mutableBreakpointPositions.size,
+ 0,
+ "No breakable positions exists"
+ );
+ is(
+ state.sources.mutableOriginalBreakableLines.size,
+ 0,
+ "No original breakable lines exists"
+ );
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-reloading.js b/devtools/client/debugger/test/mochitest/browser_dbg-reloading.js
new file mode 100644
index 0000000000..9d09505687
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-reloading.js
@@ -0,0 +1,39 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/*
+ * Test reloading:
+ * 1. reload the source
+ * 2. re-sync breakpoints
+ */
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger(
+ "ember/quickstart/dist/",
+ "ember-application/index.js"
+ );
+
+ await selectSource(dbg, "ember-application/index.js");
+
+ info("1. reload and hit breakpoint");
+ await addBreakpoint(dbg, "ember-application/index.js", 4);
+ reload(dbg, "ember/quickstart/dist/");
+
+ info("2. Wait for sources to appear and then reload");
+ await waitForDispatch(dbg.store, "ADD_SOURCES");
+ reload(dbg, "ember/quickstart/dist/");
+
+ info("3. Wait for sources to appear and then reload mid source-maps");
+ await waitForDispatch(dbg.store, "ADD_SOURCES");
+ reload(dbg, "ember/quickstart/dist/");
+
+ info(
+ "4. wait for the debugger to pause and show that we're in the correct location"
+ );
+ await waitForPaused(dbg);
+ const source = findSource(dbg, "ember-application/index.js");
+ assertPausedAtSourceAndLine(dbg, source.id, 4);
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-remember-expanded-scopes.js b/devtools/client/debugger/test/mochitest/browser_dbg-remember-expanded-scopes.js
new file mode 100644
index 0000000000..9d1a993b83
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-remember-expanded-scopes.js
@@ -0,0 +1,41 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+// Ignore strange errors when shutting down.
+PromiseTestUtils.allowMatchingRejectionsGlobally(/No such actor/);
+PromiseTestUtils.allowMatchingRejectionsGlobally(/connection just closed/);
+
+const MAXIMUM_ITEMS = 10;
+
+// Test that expanded scopes stay expanded after resuming and pausing again.
+add_task(async function () {
+ const dbg = await initDebugger("doc-remember-expanded-scopes.html");
+ invokeInTab("main", "doc-remember-expanded-scopes.html");
+ await waitForPaused(dbg);
+
+ await toggleNode(dbg, "object");
+ await toggleNode(dbg, "innerObject");
+ await stepOver(dbg);
+ await waitForPaused(dbg);
+
+ await waitUntil(() => findNode(dbg, "innerData"));
+ ok(true, "Inner object data automatically expanded after stepping");
+});
+
+function findNode(dbg, text) {
+ for (let index = 0; index < MAXIMUM_ITEMS; index++) {
+ const elem = findElement(dbg, "scopeNode", index);
+ if (elem?.innerText == text) {
+ return elem;
+ }
+ }
+ return null;
+}
+
+async function toggleNode(dbg, text) {
+ const node = await waitFor(() => findNode(dbg, text));
+ return toggleObjectInspectorNode(node);
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-restart-frame.js b/devtools/client/debugger/test/mochitest/browser_dbg-restart-frame.js
new file mode 100644
index 0000000000..97b2e85b06
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-restart-frame.js
@@ -0,0 +1,34 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// This test checks the 'Restart frame' context menu item in the Call stack.
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-scripts.html", "simple3.js");
+ await selectSource(dbg, "simple3.js");
+
+ info("Invokes function 'nestedA' and pauses in function 'nestedC'.");
+ invokeInTab("nestedA");
+ await waitForPaused(dbg);
+
+ info("Right clicks frame 'nestedB' and selects 'Restart frame'.");
+ const frameEls = findAllElementsWithSelector(dbg, ".pane.frames .frame");
+ rightClickEl(dbg, frameEls[1]);
+ await waitForContextMenu(dbg);
+
+ selectContextMenuItem(dbg, "#node-menu-restartFrame");
+ await waitForDispatch(dbg.store, "COMMAND");
+ await waitForPaused(dbg);
+
+ const pauseLine = getVisibleSelectedFrameLine(dbg);
+ is(pauseLine, 13, "The debugger is paused on line 13.");
+
+ const frames = dbg.selectors.getCurrentThreadFrames();
+ is(frames.length, 2, "Callstack has two frames.");
+
+ const selectedFrame = dbg.selectors.getVisibleSelectedFrame();
+ is(selectedFrame.displayName, "nestedB", "The selected frame is 'nestedB'.");
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-returnvalues.js b/devtools/client/debugger/test/mochitest/browser_dbg-returnvalues.js
new file mode 100644
index 0000000000..a0c070ab2d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-returnvalues.js
@@ -0,0 +1,106 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-return-values.html");
+ await togglePauseOnExceptions(dbg, true, true);
+
+ info("Test return values");
+ await testReturnValue(dbg, "to sender", [
+ { label: "return_something" },
+ { label: "<return>", value: uneval("to sender") },
+ ]);
+ await testReturnValue(dbg, "undefined", [
+ { label: "return_something" },
+ { label: "<return>", value: '"undefined"' },
+ ]);
+ await testReturnValue(dbg, 2, [
+ { label: "return_something" },
+ { label: "<return>", value: "2" },
+ ]);
+ await testReturnValue(dbg, new Error("blah"), [
+ { label: "return_something" },
+ { label: "<return>", value: "Restricted" },
+ ]);
+
+ info("Test throw values");
+ await testThrowValue(dbg, "a fit", [
+ { label: "callee" },
+ // The "uneval" call here gives us the way one would write `val` as
+ // a JavaScript expression, similar to the way the debugger
+ // displays values, so this test works when `val` is a string.
+ { label: "<exception>", value: uneval("a fit") },
+ ]);
+ await testThrowValue(dbg, "undefined", [
+ { label: "callee" },
+ { label: "<exception>", value: '"undefined"' },
+ ]);
+ await testThrowValue(dbg, 2, [
+ { label: "callee" },
+ { label: "<exception>", value: "2" },
+ ]);
+ await testThrowValue(dbg, new Error("blah"), [
+ { label: "callee" },
+ { label: "<exception>", value: "Restricted" },
+ ]);
+});
+
+async function testReturnValue(dbg, val, expectedScopeNodes) {
+ invokeInTab("return_something", val);
+ await waitForPaused(dbg);
+
+ // "Step in" 2 times to get to the point where the debugger can
+ // see the return value.
+ await stepIn(dbg);
+ await stepIn(dbg);
+
+ for (const [i, scopeNode] of expectedScopeNodes.entries()) {
+ const index = i + 1;
+ is(
+ getScopeNodeLabel(dbg, index),
+ scopeNode.label,
+ `check for ${scopeNode.label}`
+ );
+ if (scopeNode.value) {
+ is(
+ getScopeNodeValue(dbg, index),
+ scopeNode.value,
+ `check value is ${scopeNode.value}`
+ );
+ }
+ }
+
+ await resume(dbg);
+ assertNotPaused(dbg);
+}
+
+async function testThrowValue(dbg, val, expectedScopeNodes) {
+ invokeInTab("throw_something", val);
+ await waitForPaused(dbg);
+
+ // "Step in" once to get to the point where the debugger can see the
+ // exception.
+ await stepIn(dbg);
+
+ for (const [i, scopeNode] of expectedScopeNodes.entries()) {
+ const index = i + 1;
+ is(
+ getScopeNodeLabel(dbg, index),
+ scopeNode.label,
+ `check for ${scopeNode.label}`
+ );
+ if (scopeNode.value) {
+ is(
+ getScopeNodeValue(dbg, index),
+ scopeNode.value,
+ `check exception is ${scopeNode.value}`
+ );
+ }
+ }
+
+ await resume(dbg);
+ assertNotPaused(dbg);
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-scopes-duplicated.js b/devtools/client/debugger/test/mochitest/browser_dbg-scopes-duplicated.js
new file mode 100644
index 0000000000..81f7fcdcd7
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-scopes-duplicated.js
@@ -0,0 +1,196 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test that properties with the same value objec be expanded. See Bug 1617210.
+
+"use strict";
+
+const httpServer = createTestHTTPServer();
+httpServer.registerContentType("html", "text/html");
+httpServer.registerContentType("js", "application/javascript");
+
+httpServer.registerPathHandler(`/`, function (request, response) {
+ response.setStatusLine(request.httpVersion, 200, "OK");
+ response.write(`
+ <html>
+ <button class="pause">Click me</button>
+ <script type="text/javascript" src="test.js"></script>
+ </html>`);
+});
+
+httpServer.registerPathHandler("/test.js", function (request, response) {
+ response.setHeader("Content-Type", "application/javascript");
+ response.write(`
+ document.addEventListener("click", function onClick(e) {
+ var sharedValue = {hello: "world"};
+ var x = {
+ a: sharedValue,
+ b: sharedValue,
+ c: sharedValue,
+ d: {
+ e: {
+ g: sharedValue
+ },
+ f: {
+ h: sharedValue
+ }
+ }
+ };
+ debugger;
+ });
+ `);
+});
+const port = httpServer.identity.primaryPort;
+const TEST_URL = `http://localhost:${port}/`;
+
+add_task(async function () {
+ const dbg = await initDebuggerWithAbsoluteURL(TEST_URL);
+
+ const ready = Promise.all([
+ waitForPaused(dbg),
+ waitForLoadedSource(dbg, "test.js"),
+ ]);
+
+ SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () {
+ content.document.querySelector("button.pause").click();
+ });
+
+ await ready;
+
+ checkScopesLabels(
+ dbg,
+ `
+ | e
+ | sharedValue
+ | x
+ `,
+ { startIndex: 3 }
+ );
+
+ info("Expand `x` node");
+ await toggleScopeNode(dbg, 6);
+ checkScopesLabels(
+ dbg,
+ `
+ | x
+ | | a
+ | | b
+ | | c
+ | | d
+ `,
+ { startIndex: 5 }
+ );
+
+ info("Expand node `d`");
+ await toggleScopeNode(dbg, 10);
+ checkScopesLabels(
+ dbg,
+ `
+ | | d
+ | | | e
+ | | | f
+ `,
+ { startIndex: 9 }
+ );
+
+ info("Expand `f` and `e` nodes");
+ await toggleScopeNode(dbg, 12);
+ await toggleScopeNode(dbg, 11);
+ checkScopesLabels(
+ dbg,
+ `
+ | | d
+ | | | e
+ | | | | g
+ | | | | <prototype>
+ | | | f
+ | | | | h
+ | | | | <prototype>
+ `,
+ { startIndex: 9 }
+ );
+
+ info("Expand `h`, `g`, `e`, `c`, `b` and `a` nodes");
+ await toggleScopeNode(dbg, 15);
+ await toggleScopeNode(dbg, 12);
+ await toggleScopeNode(dbg, 9);
+ await toggleScopeNode(dbg, 8);
+ await toggleScopeNode(dbg, 7);
+
+ checkScopesLabels(
+ dbg,
+ `
+ | x
+ | | a
+ | | | hello
+ | | | <prototype>
+ | | b
+ | | | hello
+ | | | <prototype>
+ | | c
+ | | | hello
+ | | | <prototype>
+ | | d
+ | | | e
+ | | | | g
+ | | | | | hello
+ | | | | | <prototype>
+ | | | | <prototype>
+ | | | f
+ | | | | h
+ | | | | | hello
+ | | | | | <prototype>
+ | | | | <prototype>
+ `,
+ { startIndex: 5 }
+ );
+
+ info("Expand `e`");
+ await toggleScopeNode(dbg, 4);
+
+ info("Expand the `target` node");
+ let nodes = getAllLabels(dbg);
+ const originalNodesCount = nodes.length;
+ const targetNodeIndex = nodes.indexOf("target");
+ Assert.greater(targetNodeIndex, -1, "Found the target node");
+ await toggleScopeNode(dbg, targetNodeIndex);
+ nodes = getAllLabels(dbg);
+ Assert.greater(
+ nodes.length,
+ originalNodesCount,
+ "the target node was expanded"
+ );
+ ok(nodes.includes("classList"), "classList is displayed");
+
+ await resume(dbg);
+});
+
+function getAllLabels(dbg, withIndent = false) {
+ return Array.from(findAllElements(dbg, "scopeNodes")).map(el => {
+ let text = el.innerText;
+ if (withIndent) {
+ const node = el.closest(".tree-node");
+ const level = Number(node.getAttribute("aria-level"));
+ if (!Number.isNaN(level)) {
+ text = `${"| ".repeat(level - 1)}${text}`.trim();
+ }
+ }
+ return text;
+ });
+}
+
+function checkScopesLabels(dbg, expected, { startIndex = 0 } = {}) {
+ const lines = expected
+ .trim()
+ .split("\n")
+ .map(line => line.trim());
+
+ const labels = getAllLabels(dbg, true).slice(
+ startIndex,
+ startIndex + lines.length
+ );
+
+ const format = arr => `\n${arr.join("\n")}\n`;
+ is(format(labels), format(lines), "got expected scope labels");
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-scopes-mutations.js b/devtools/client/debugger/test/mochitest/browser_dbg-scopes-mutations.js
new file mode 100644
index 0000000000..7d3f1a777e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-scopes-mutations.js
@@ -0,0 +1,85 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-script-mutate.html");
+
+ const onPaused = waitForPaused(dbg);
+ invokeInTab("mutate");
+ await onPaused;
+ await waitForSelectedSource(dbg, "script-mutate");
+ await waitForDispatch(dbg.store, "ADD_INLINE_PREVIEW");
+
+ is(
+ getScopeNodeLabel(dbg, 2),
+ "<this>",
+ 'The second element in the scope panel is "<this>"'
+ );
+ is(
+ getScopeNodeLabel(dbg, 4),
+ "phonebook",
+ 'The fourth element in the scope panel is "phonebook"'
+ );
+
+ info("Expand `phonebook`");
+ await expandNode(dbg, 4);
+ is(
+ getScopeNodeLabel(dbg, 5),
+ "S",
+ 'The fifth element in the scope panel is "S"'
+ );
+
+ info("Expand `S`");
+ await expandNode(dbg, 5);
+ is(
+ getScopeNodeLabel(dbg, 6),
+ "sarah",
+ 'The sixth element in the scope panel is "sarah"'
+ );
+ is(
+ getScopeNodeLabel(dbg, 7),
+ "serena",
+ 'The seventh element in the scope panel is "serena"'
+ );
+
+ info("Expand `sarah`");
+ await expandNode(dbg, 6);
+ is(
+ getScopeNodeLabel(dbg, 7),
+ "lastName",
+ 'The seventh element in the scope panel is now "lastName"'
+ );
+ is(
+ getScopeNodeValue(dbg, 7),
+ '"Doe"',
+ 'The "lastName" element has the expected "Doe" value'
+ );
+
+ await resume(dbg);
+ await waitForPaused(dbg);
+ await waitForDispatch(dbg.store, "ADD_INLINE_PREVIEW");
+
+ is(
+ getScopeNodeLabel(dbg, 2),
+ "<this>",
+ 'The second element in the scope panel is "<this>"'
+ );
+ is(
+ getScopeNodeLabel(dbg, 4),
+ "phonebook",
+ 'The fourth element in the scope panel is "phonebook"'
+ );
+});
+
+function expandNode(dbg, index) {
+ const node = findElement(dbg, "scopeNode", index);
+ const objectInspector = node.closest(".object-inspector");
+ const properties = objectInspector.querySelectorAll(".node").length;
+ findElement(dbg, "scopeNode", index).click();
+ return waitUntil(
+ () => objectInspector.querySelectorAll(".node").length !== properties
+ );
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-scopes-xrays.js b/devtools/client/debugger/test/mochitest/browser_dbg-scopes-xrays.js
new file mode 100644
index 0000000000..227cf7000e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-scopes-xrays.js
@@ -0,0 +1,67 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test that xrays do not interfere with examining objects in the scopes pane.
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-scopes-xrays.html");
+
+ invokeInTab("start");
+ await waitForPaused(dbg, "doc-scopes-xrays.html");
+
+ await toggleNode(dbg, "set");
+ await toggleNode(dbg, "<entries>");
+ await checkObjectNode(dbg, "0", "1");
+ await toggleNode(dbg, "set");
+
+ await toggleNode(dbg, "weakset");
+ await toggleNode(dbg, "<entries>");
+ await checkObjectNode(dbg, "0", "2");
+ await toggleNode(dbg, "weakset");
+
+ await toggleNode(dbg, "map");
+ await toggleNode(dbg, "<entries>");
+ await toggleNode(dbg, "0");
+ await checkObjectNode(dbg, "<key>", "3");
+ await toggleNode(dbg, "<key>");
+ await checkObjectNode(dbg, "<value>", "4");
+ await toggleNode(dbg, "map");
+
+ await toggleNode(dbg, "weakmap");
+ await toggleNode(dbg, "<entries>");
+ await toggleNode(dbg, "0");
+ await checkObjectNode(dbg, "<key>", "5");
+ await toggleNode(dbg, "<key>");
+ await checkObjectNode(dbg, "<value>", "6");
+ await toggleNode(dbg, "weakmap");
+});
+
+function findNode(dbg, text) {
+ for (let index = 0; ; index++) {
+ const elem = findElement(dbg, "scopeNode", index);
+ if (elem?.innerText == text) {
+ return elem;
+ }
+ }
+}
+
+function toggleNode(dbg, text) {
+ return toggleObjectInspectorNode(findNode(dbg, text));
+}
+
+function findNodeValue(dbg, text) {
+ for (let index = 0; ; index++) {
+ const elem = findElement(dbg, "scopeNode", index);
+ if (elem?.innerText == text) {
+ return getScopeNodeValue(dbg, index);
+ }
+ }
+}
+
+async function checkObjectNode(dbg, text, value) {
+ await toggleNode(dbg, text);
+ Assert.equal(findNodeValue(dbg, "a"), value, "object value");
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-scopes.js b/devtools/client/debugger/test/mochitest/browser_dbg-scopes.js
new file mode 100644
index 0000000000..bdd91edc09
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-scopes.js
@@ -0,0 +1,57 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+// Test that the values of the scope nodes are displayed correctly.
+add_task(async function testScopeNodes() {
+ const dbg = await initDebugger("doc-script-switching.html");
+
+ const ready = Promise.all([
+ waitForPaused(dbg),
+ waitForLoadedSource(dbg, "script-switching-02.js"),
+
+ // MAP_FRAMES triggers a new Scopes panel render cycle, which introduces
+ // a race condition with the click event on the foo node.
+ waitForDispatch(dbg.store, "MAP_FRAMES"),
+ ]);
+ invokeInTab("firstCall");
+ await ready;
+
+ is(getScopeNodeLabel(dbg, 1), "secondCall");
+ is(getScopeNodeLabel(dbg, 2), "<this>");
+ is(getScopeNodeLabel(dbg, 4), "foo()");
+ await toggleScopeNode(dbg, 4);
+ is(getScopeNodeLabel(dbg, 5), "arguments");
+
+ await stepOver(dbg);
+ is(getScopeNodeLabel(dbg, 4), "foo()");
+ is(getScopeNodeLabel(dbg, 5), "Window");
+ is(getScopeNodeValue(dbg, 5), "Global");
+
+ info("Resuming the thread");
+ await resume(dbg);
+});
+
+// Test scope nodes for anonymous functions display correctly.
+add_task(async function testAnonymousScopeNodes() {
+ const dbg = await initDebuggerWithAbsoluteURL(
+ "data:text/html;charset=utf8,<!DOCTYPE html><script>(function(){const x = 3; debugger;})()</script>"
+ );
+
+ info("Reload the page to hit the debugger statement while loading");
+ const onReloaded = reload(dbg);
+ await waitForPaused(dbg);
+ ok(true, "We're paused");
+
+ is(
+ getScopeNodeLabel(dbg, 1),
+ "<anonymous>",
+ "The scope node for the anonymous function is displayed correctly"
+ );
+
+ info("Resuming the thread");
+ await resume(dbg);
+ await onReloaded;
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-scroll-run-to-completion.js b/devtools/client/debugger/test/mochitest/browser_dbg-scroll-run-to-completion.js
new file mode 100644
index 0000000000..c42841f135
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-scroll-run-to-completion.js
@@ -0,0 +1,25 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-scroll-run-to-completion.html");
+ invokeInTab("pauseOnce", "doc-scroll-run-to-completion.html");
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "doc-scroll-run-to-completion.html").id,
+ 20
+ );
+
+ await checkEvaluateInTopFrame(dbg, "window.scrollBy(0, 10);", undefined);
+
+ // checkEvaluateInTopFrame does an implicit resume for some reason.
+ await waitForPaused(dbg);
+
+ const onTestPassed = once(Services.ppmm, "test passed");
+ await resume(dbg);
+ await onTestPassed;
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-search-file-paused.js b/devtools/client/debugger/test/mochitest/browser_dbg-search-file-paused.js
new file mode 100644
index 0000000000..54a493fc2d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-search-file-paused.js
@@ -0,0 +1,71 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests the search bar correctly responds to queries, enter, shift enter
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger(
+ "doc-scripts.html",
+ "simple1.js",
+ "simple2.js"
+ );
+
+ info("Add a breakpoint, wait for pause");
+ const source = findSource(dbg, "simple2.js");
+ await selectSource(dbg, source);
+ await addBreakpoint(dbg, source, 5);
+ invokeInTab("main");
+ await waitForPaused(dbg);
+
+ info("Starting a search for 'bar'");
+ const cm = getCM(dbg);
+ pressKey(dbg, "fileSearch");
+ is(dbg.selectors.getActiveSearch(), "file");
+ const el = getFocusedEl(dbg);
+ type(dbg, "bar");
+ await waitForSearchState(dbg);
+
+ info("Ensuring 'bar' matches are highlighted");
+ pressKey(dbg, "Enter");
+ is(cm.state.search.posFrom.line, 1);
+ pressKey(dbg, "Enter");
+ is(cm.state.search.posFrom.line, 4);
+
+ info("Switching files via frame click");
+ const frames = findAllElements(dbg, "frames");
+ pressMouseDown(dbg, frames[1]);
+
+ // Ensure that the debug line is in view, and not the first "bar" instance,
+ // which the user would have to scroll down for
+ const { top } = cm.getScrollInfo();
+ is(top, 0, "First search term is not in view");
+
+ // Change the search term and go back to the first source in stack
+ info("Switching to paused file via frame click");
+ pressKey(dbg, "fileSearch");
+ el.value = "";
+ type(dbg, "func");
+ await waitForSearchState(dbg);
+ pressMouseDown(dbg, frames[0]);
+ await waitFor(() => cm.state.search.query === "func");
+
+ // Ensure there is a match for the new term
+ pressKey(dbg, "Enter");
+ await waitFor(() => cm.state.search.posFrom.line === 0);
+ is(cm.state.search.posFrom.line, 0);
+ pressKey(dbg, "Enter");
+ await waitFor(() => cm.state.search.posFrom.line === 1);
+ is(cm.state.search.posFrom.line, 1);
+});
+
+function getFocusedEl(dbg) {
+ const doc = dbg.win.document;
+ return doc.activeElement;
+}
+
+function pressMouseDown(dbg, node) {
+ EventUtils.sendMouseEvent({ type: "mousedown" }, node, dbg.win);
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-search-file-retains-query.js b/devtools/client/debugger/test/mochitest/browser_dbg-search-file-retains-query.js
new file mode 100644
index 0000000000..53e9861d14
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-search-file-retains-query.js
@@ -0,0 +1,40 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests the search bar retains previous query on re-opening.
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-scripts.html", "simple1.js");
+ const {
+ selectors: { getActiveSearch },
+ } = dbg;
+ await selectSource(dbg, "simple1.js");
+
+ // Open search bar
+ pressKey(dbg, "fileSearch");
+ await waitFor(() => getActiveSearch() === "file");
+ is(getActiveSearch(), "file");
+
+ // Type a search query
+ type(dbg, "con");
+ await waitForSearchState(dbg);
+ is(findElement(dbg, "fileSearchInput").value, "con");
+ is(getCM(dbg).state.search.query, "con");
+
+ // Close the search bar
+ pressKey(dbg, "Escape");
+ await waitFor(() => getActiveSearch() === null);
+ is(getActiveSearch(), null);
+
+ // Re-open search bar
+ pressKey(dbg, "fileSearch");
+ await waitFor(() => getActiveSearch() === "file");
+ is(getActiveSearch(), "file");
+
+ // Test for the retained query
+ is(getCM(dbg).state.search.query, "con");
+ is(findElement(dbg, "fileSearchInput").value, "con");
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-search-file.js b/devtools/client/debugger/test/mochitest/browser_dbg-search-file.js
new file mode 100644
index 0000000000..75daa9a469
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-search-file.js
@@ -0,0 +1,131 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests the search bar correctly responds to queries, enter, shift enter
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-scripts.html", "simple1.js");
+ await selectSource(dbg, "simple1.js");
+
+ pressKey(dbg, "fileSearch");
+ is(dbg.selectors.getActiveSearch(), "file", "The search UI was opened");
+
+ info("Test closing and re-opening the search UI");
+ pressKey(dbg, "Escape");
+ is(
+ dbg.selectors.getActiveSearch(),
+ null,
+ "The search UI was closed when hitting Escape"
+ );
+
+ pressKey(dbg, "fileSearch");
+ is(dbg.selectors.getActiveSearch(), "file", "The search UI was opened again");
+
+ info("Search for `con` in the script");
+ type(dbg, "con");
+ await waitForSearchState(dbg);
+
+ // All the lines in the script that include `con`
+ const linesWithResults = [
+ // const func
+ 4,
+ // const result
+ 5,
+ // constructor (in MyClass)
+ 42,
+ // constructor (in Klass)
+ 55,
+ // console.log
+ 62,
+ ];
+
+ await waitForCursorPosition(dbg, linesWithResults[0]);
+ assertCursorPosition(
+ dbg,
+ linesWithResults[0],
+ 6,
+ "typing in the search input moves the cursor in the source content"
+ );
+
+ info("Check that pressing Enter navigates forward through the results");
+ await navigateWithKey(
+ dbg,
+ "Enter",
+ linesWithResults[1],
+ "Enter moves forward in the search results"
+ );
+
+ await navigateWithKey(
+ dbg,
+ "Enter",
+ linesWithResults[2],
+ "Enter moves forward in the search results"
+ );
+
+ info(
+ "Check that pressing Shift+Enter navigates backward through the results"
+ );
+ await navigateWithKey(
+ dbg,
+ "ShiftEnter",
+ linesWithResults[1],
+ "Shift+Enter moves backward in the search results"
+ );
+
+ await navigateWithKey(
+ dbg,
+ "ShiftEnter",
+ linesWithResults[0],
+ "Shift+Enter moves backward in the search results"
+ );
+
+ info(
+ "Check that navigating backward goes to the last result when we were at the first one"
+ );
+ await navigateWithKey(
+ dbg,
+ "ShiftEnter",
+ linesWithResults.at(-1),
+ "Shift+Enter cycles back through the results"
+ );
+
+ info(
+ "Check that navigating forward goes to the first result when we were at the last one"
+ );
+ await navigateWithKey(
+ dbg,
+ "Enter",
+ linesWithResults[0],
+ "Enter cycles forward through the results"
+ );
+
+ info("Check that changing the search term works");
+ pressKey(dbg, "fileSearch");
+ type(dbg, "doEval");
+
+ await waitForCursorPosition(dbg, 9);
+ assertCursorPosition(
+ dbg,
+ 9,
+ 16,
+ "The UI navigates to the new search results"
+ );
+
+ // selecting another source keeps search open
+ await selectSource(dbg, "simple2.js");
+ ok(findElement(dbg, "searchField"), "Search field is still visible");
+
+ // search is always focused regardless of when or how it was opened
+ pressKey(dbg, "fileSearch");
+ await clickElement(dbg, "codeMirror");
+ pressKey(dbg, "fileSearch");
+ is(dbg.win.document.activeElement.tagName, "INPUT", "Search field focused");
+});
+
+async function navigateWithKey(dbg, key, expectedLine, assertionMessage) {
+ pressKey(dbg, key);
+ await waitForCursorPosition(dbg, expectedLine);
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-settings-disable-javascript.js b/devtools/client/debugger/test/mochitest/browser_dbg-settings-disable-javascript.js
new file mode 100644
index 0000000000..9b244ca4b7
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-settings-disable-javascript.js
@@ -0,0 +1,49 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+requestLongerTimeout(2);
+
+// Tests that using the Settings menu to enable and disable JavaScript
+// updates the pref properly
+add_task(async function () {
+ const dbg = await initDebugger("doc-scripts.html", "simple1.js");
+ const menuItemClassName = ".debugger-settings-menu-item-disable-javascript";
+
+ info("Waiting for source to load");
+ await waitForSource(dbg, "simple1.js");
+
+ const waitForDevToolsReload = await watchForDevToolsReload(
+ gBrowser.selectedBrowser
+ );
+ info("Clicking the disable javascript button in the settings menu");
+ await toggleDebbuggerSettingsMenuItem(dbg, {
+ className: menuItemClassName,
+ isChecked: false,
+ });
+
+ info("Waiting for reload triggered by disabling javascript");
+ await waitForSourcesInSourceTree(dbg, [], { noExpand: true });
+
+ info("Wait for DevTools to be reloaded");
+ await waitForDevToolsReload();
+
+ info(
+ "Clicking the disable javascript button in the settings menu to reenable JavaScript"
+ );
+ await toggleDebbuggerSettingsMenuItem(dbg, {
+ className: menuItemClassName,
+ isChecked: true,
+ });
+ is(
+ Services.prefs.getBoolPref("javascript.enabled"),
+ true,
+ "JavaScript is enabled"
+ );
+
+ info("Reloading page to ensure there are sources");
+ await reload(dbg);
+ await waitForSource(dbg, "simple1.js");
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-slow-script.js b/devtools/client/debugger/test/mochitest/browser_dbg-slow-script.js
new file mode 100644
index 0000000000..83b35e1009
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-slow-script.js
@@ -0,0 +1,91 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+// Tests the slow script warning
+
+add_task(async function openDebuggerFirst() {
+ // In mochitest, the timeout is disable, so set it to a short, but non zero duration
+ await pushPref("dom.max_script_run_time", 1);
+ // Prevents having to click on the page to have the dialog to appear
+ await pushPref("dom.max_script_run_time.require_critical_input", false);
+
+ const dbg = await initDebugger("doc-slow-script.html");
+
+ const alert = BrowserTestUtils.waitForGlobalNotificationBar(
+ window,
+ "process-hang"
+ );
+
+ info("Execute an infinite loop");
+ invokeInTab("infiniteLoop");
+
+ info("Wait for the slow script warning");
+ const notification = await alert;
+
+ info("Click on the debug script button");
+ const buttons = notification.buttonContainer.getElementsByTagName("button");
+ // The first button is "stop", the second is "debug script"
+ buttons[1].click();
+
+ info("Waiting for the debugger to be paused");
+ await waitForPaused(dbg);
+ const source = findSource(dbg, "doc-slow-script.html");
+ assertPausedAtSourceAndLine(dbg, source.id, 14);
+
+ info("Close toolbox and tab");
+ await dbg.toolbox.closeToolbox();
+ await removeTab(gBrowser.selectedTab);
+});
+
+add_task(async function openDebuggerFromDialog() {
+ const tab = await addTab(EXAMPLE_URL + "doc-slow-script.html");
+
+ const alert = BrowserTestUtils.waitForGlobalNotificationBar(
+ window,
+ "process-hang"
+ );
+
+ // /!\ Hack this attribute in order to force showing the "debug script" button
+ // on all channels. Otherwise it is only displayed in dev edition.
+ tab.linkedBrowser.browsingContext.watchedByDevTools = true;
+
+ info("Execute an infinite loop");
+ // Note that spawn will return a promise that may be rejected because of the infinite loop
+ // And mochitest may consider this as an error. So ignore any rejection.
+ SpecialPowers.spawn(gBrowser.selectedBrowser, [], function () {
+ content.wrappedJSObject.infiniteLoop();
+ }).catch(e => {});
+
+ info("Wait for the slow script warning");
+ const notification = await alert;
+
+ info("Click on the debug script button");
+ const buttons = notification.buttonContainer.getElementsByTagName("button");
+ // The first button is "stop", the second is "debug script"
+ buttons[1].click();
+
+ info("Wait for the toolbox to appear and have the debugger initialized");
+ await waitFor(async () => {
+ const tb = gDevTools.getToolboxForTab(gBrowser.selectedTab);
+ if (tb) {
+ await tb.getPanelWhenReady("jsdebugger");
+ return true;
+ }
+ return false;
+ });
+ const toolbox = gDevTools.getToolboxForTab(gBrowser.selectedTab);
+ ok(toolbox, "Got a toolbox");
+ const dbg = createDebuggerContext(toolbox);
+
+ info("Waiting for the debugger to be paused");
+ await waitForPaused(dbg);
+ const source = findSource(dbg, "doc-slow-script.html");
+ assertPausedAtSourceAndLine(dbg, source.id, 14);
+
+ info("Close toolbox and tab");
+ await dbg.toolbox.closeToolbox();
+ await removeTab(gBrowser.selectedTab);
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-source-pragma.js b/devtools/client/debugger/test/mochitest/browser_dbg-source-pragma.js
new file mode 100644
index 0000000000..edca4e2b80
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-source-pragma.js
@@ -0,0 +1,26 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+add_task(async function () {
+ // Disable handling of //# source(Mapping)URL= comments.
+ await SpecialPowers.pushPrefEnv({
+ set: [["javascript.options.source_pragmas", false]],
+ });
+
+ const dbg = await initDebugger("doc-source-pragma.html");
+
+ // The sourceURL pragma didn't rename the source
+ await waitForSource(dbg, "source-pragma.js");
+ const source = findSource(dbg, "source-pragma.js");
+ const actors = dbg.selectors.getSourceActorsForSource(source.id);
+
+ is(actors.length, 1, "have a single actor");
+ ok(
+ actors[0].url.endsWith("/source-pragma.js"),
+ "source url was not rewritten"
+ );
+ is(actors[0].sourceMapURL, null, "source map was not exposed");
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-sourceURL-breakpoint.js b/devtools/client/debugger/test/mochitest/browser_dbg-sourceURL-breakpoint.js
new file mode 100644
index 0000000000..a054d4fcac
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-sourceURL-breakpoint.js
@@ -0,0 +1,18 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test that breakpoints are hit in eval'ed sources with a sourceURL property.
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-sourceURL-breakpoint.html", "my-foo.js");
+ await selectSource(dbg, "my-foo.js");
+ await addBreakpoint(dbg, "my-foo.js", 2);
+
+ invokeInTab("foo");
+ await waitForPaused(dbg);
+
+ ok(true, "paused at breakpoint");
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-sourcemapped-breakpoint-console.js b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemapped-breakpoint-console.js
new file mode 100644
index 0000000000..0d69bdc17f
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemapped-breakpoint-console.js
@@ -0,0 +1,86 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+// This test can be really slow on debug platforms and should be split.
+requestLongerTimeout(3);
+
+add_task(async function () {
+ await pushPref("devtools.debugger.map-scopes-enabled", true);
+ const dbg = await initDebugger("doc-sourcemapped.html");
+
+ await evalInConsoleAtPoint(
+ dbg,
+ "webpack3-babel6",
+ "eval-maps",
+ { line: 14, column: 5 },
+ ["one === 1", "two === 4", "three === 5"]
+ );
+
+ await evalInConsoleAtPoint(
+ dbg,
+ "webpack3-babel6",
+ "esmodules-cjs",
+ { line: 18, column: 3 },
+ [
+ `aDefault === "a-default"`,
+ `anAliased === "an-original"`,
+ `aNamed === "a-named"`,
+ `aDefault2 === "a-default2"`,
+ `anAliased2 === "an-original2"`,
+ `aNamed2 === "a-named2"`,
+ `aDefault3 === "a-default3"`,
+ `anAliased3 === "an-original3"`,
+ `aNamed3 === "a-named3"`,
+ ]
+ );
+
+ await evalInConsoleAtPoint(
+ dbg,
+ "webpack3-babel6",
+ "shadowed-vars",
+ { line: 18, column: 7 },
+ [`aVar === "var3"`, `aLet === "let3"`, `aConst === "const3"`]
+ );
+
+ await evalInConsoleAtPoint(
+ dbg,
+ "webpack3-babel6",
+ "babel-classes",
+ { line: 8, column: 17 },
+ [`this.hasOwnProperty("bound")`]
+ );
+});
+
+async function evalInConsoleAtPoint(
+ dbg,
+ target,
+ fixture,
+ { line, column },
+ statements
+) {
+ const url = `${target}://./${fixture}/input.js`;
+ const fnName = `${target}-${fixture}`.replace(/-([a-z])/g, (s, c) =>
+ c.toUpperCase()
+ );
+
+ await invokeWithBreakpoint(dbg, fnName, url, { line, column }, async () => {
+ await assertConsoleEval(dbg, statements);
+ });
+
+ ok(true, `Ran tests for ${fixture} at line ${line} column ${column}`);
+}
+
+async function assertConsoleEval(dbg, statements) {
+ const { hud } = await dbg.toolbox.selectTool("webconsole");
+
+ for (const statement of statements.values()) {
+ await dbg.client.evaluate(`window.TEST_RESULT = false;`);
+ await evaluateExpressionInConsole(hud, `TEST_RESULT = ${statement};`);
+
+ const result = await dbg.client.evaluate(`window.TEST_RESULT`);
+ is(result.result, true, `'${statement}' evaluates to true`);
+ }
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-sourcemapped-preview.js b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemapped-preview.js
new file mode 100644
index 0000000000..2a33879f54
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemapped-preview.js
@@ -0,0 +1,206 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+// Tests for preview through Babel's compile output.
+requestLongerTimeout(3);
+
+add_task(async function () {
+ await pushPref("devtools.debugger.map-scopes-enabled", true);
+ const dbg = await initDebugger("doc-sourcemapped.html");
+
+ await testForOf(dbg);
+ await testShadowing(dbg);
+ await testImportedBindings(dbg);
+});
+
+async function breakpointPreviews(
+ dbg,
+ target,
+ fixture,
+ { line, column },
+ previews
+) {
+ const url = `${target}://./${fixture}/input.js`;
+ const fnName = `${target}-${fixture}`.replace(/-([a-z])/g, (s, c) =>
+ c.toUpperCase()
+ );
+
+ info(`Starting ${fixture} tests`);
+
+ await invokeWithBreakpoint(dbg, fnName, url, { line, column }, async () => {
+ await assertPreviews(dbg, previews);
+ });
+
+ ok(true, `Ran tests for ${fixture} at line ${line} column ${column}`);
+}
+
+function testForOf(dbg) {
+ return breakpointPreviews(
+ dbg,
+ "webpack3-babel6",
+ "for-of",
+ { line: 5, column: 5 },
+ [
+ {
+ line: 5,
+ column: 4,
+ expression: "doThing",
+ result: "doThing(arg)",
+ },
+ {
+ line: 5,
+ column: 13,
+ expression: "x",
+ result: "1",
+ },
+ {
+ line: 8,
+ column: 12,
+ expression: "doThing",
+ result: "doThing(arg)",
+ },
+ ]
+ );
+}
+
+function testShadowing(dbg) {
+ return breakpointPreviews(
+ dbg,
+ "webpack3-babel6",
+ "shadowed-vars",
+ { line: 18, column: 7 },
+ [
+ // These aren't what the user would expect, but we test them anyway since
+ // they reflect what this actually returns. These shadowed bindings read
+ // the binding closest to the current frame's scope even though their
+ // actual value is different.
+ {
+ line: 2,
+ column: 10,
+ expression: "aVar",
+ result: '"var3"',
+ },
+ {
+ line: 3,
+ column: 10,
+ expression: "aLet",
+ result: '"let3"',
+ },
+ {
+ line: 4,
+ column: 12,
+ expression: "aConst",
+ result: '"const3"',
+ },
+ {
+ line: 10,
+ column: 12,
+ expression: "aVar",
+ result: '"var3"',
+ },
+ {
+ line: 11,
+ column: 12,
+ expression: "aLet",
+ result: '"let3"',
+ },
+ {
+ line: 12,
+ column: 14,
+ expression: "aConst",
+ result: '"const3"',
+ },
+
+ // These actually result in the values the user would expect.
+ {
+ line: 14,
+ column: 14,
+ expression: "aVar",
+ result: '"var3"',
+ },
+ {
+ line: 15,
+ column: 14,
+ expression: "aLet",
+ result: '"let3"',
+ },
+ {
+ line: 16,
+ column: 14,
+ expression: "aConst",
+ result: '"const3"',
+ },
+ ]
+ );
+}
+
+function testImportedBindings(dbg) {
+ return breakpointPreviews(
+ dbg,
+ "webpack3-babel6",
+ "esmodules-cjs",
+ { line: 20, column: 3 },
+ [
+ {
+ line: 20,
+ column: 17,
+ expression: "aDefault",
+ result: '"a-default"',
+ },
+ {
+ line: 21,
+ column: 17,
+ expression: "anAliased",
+ result: '"an-original"',
+ },
+ {
+ line: 22,
+ column: 17,
+ expression: "aNamed",
+ result: '"a-named"',
+ },
+ {
+ line: 23,
+ column: 17,
+ expression: "anotherNamed",
+ result: '"a-named"',
+ },
+ {
+ line: 24,
+ column: 17,
+ expression: "aNamespace",
+ fields: [
+ ["aNamed", '"a-named"'],
+ ["default", '"a-default"'],
+ ],
+ },
+ {
+ line: 29,
+ column: 21,
+ expression: "aDefault2",
+ result: '"a-default2"',
+ },
+ {
+ line: 30,
+ column: 21,
+ expression: "anAliased2",
+ result: '"an-original2"',
+ },
+ {
+ line: 31,
+ column: 21,
+ expression: "aNamed2",
+ result: '"a-named2"',
+ },
+ {
+ line: 32,
+ column: 21,
+ expression: "anotherNamed2",
+ result: '"a-named2"',
+ },
+ ]
+ );
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-sourcemapped-scopes.js b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemapped-scopes.js
new file mode 100644
index 0000000000..9379b91d90
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemapped-scopes.js
@@ -0,0 +1,1646 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+// This test can be really slow on debug platforms and should be split.
+requestLongerTimeout(30);
+
+// Tests loading sourcemapped sources for Babel's compile output.
+
+/* eslint-disable no-inline-comments */
+
+const ACTIVE_TARGETS = new Set([
+ // "webpack3",
+ "webpack3-babel6",
+ // "webpack3-babel7",
+ // "webpack4",
+ // "webpack4-babel6",
+ // "webpack4-babel7",
+ "rollup",
+ // "rollup-babel6",
+ // "rollup-babel7",
+ "parcel",
+]);
+
+const ACTIVE_FIXTURES = [
+ testBabelBindingsWithFlow,
+ testBabelFlowtypeBindings,
+ testEvalMaps,
+ testForOf,
+ testShadowedVars,
+ testLineStartBindingsES6,
+ testThisArgumentsBindings,
+ testClasses,
+ testForLoops,
+ testFunctions,
+ testSwitches,
+ testTryCatches,
+ testLexAndNonlex,
+ testTypescriptClasses,
+ testTypeModule,
+ testTypeScriptCJS,
+ testOutOfOrderDeclarationsCJS,
+ testModulesCJS,
+ testWebpackLineMappings,
+ testWebpackFunctions,
+ testESModules,
+ testESModulesCJS,
+ testESModulesES6,
+];
+
+async function breakpointScopes(
+ dbg,
+ target,
+ fixture,
+ { line, column },
+ scopes
+) {
+ if (!ACTIVE_TARGETS.has(target)) {
+ return;
+ }
+
+ const extension = fixture == "typescript-classes" ? "ts" : "js";
+ const url = `${target}://./${fixture}/input.${extension}`;
+ const fnName = pairToFnName(target, fixture);
+
+ await invokeWithBreakpoint(dbg, fnName, url, { line, column }, async () => {
+ await assertScopes(dbg, scopes);
+ });
+
+ ok(true, `Ran tests for ${fixture} at line ${line} column ${column}`);
+}
+
+add_task(async function () {
+ await pushPref("devtools.debugger.map-scopes-enabled", true);
+ const dbg = await initDebugger("doc-sourcemapped.html");
+
+ for (const fixture of ACTIVE_FIXTURES) {
+ await fixture(dbg);
+ }
+});
+
+function targetToFlags(target) {
+ const isRollup = target.startsWith("rollup");
+ const isWebpack = target.startsWith("webpack");
+ const isParcel = target.startsWith("parcel");
+ const isWebpack4 = target.startsWith("webpack4");
+
+ // Rollup removes lots of things as dead code, so they are marked as optimized out.
+ const rollupOptimized = isRollup ? "(optimized away)" : null;
+ const webpackImportGetter = isWebpack ? "Getter" : null;
+ const webpack4ImportGetter = isWebpack4 ? "Getter" : null;
+ const maybeLineStart = col => col;
+ const defaultExport = isWebpack4
+ ? name => `${name}()`
+ : name => [name, "(optimized away)"];
+
+ return {
+ isRollup,
+ isWebpack,
+ isParcel,
+ rollupOptimized,
+ webpackImportGetter,
+ webpack4ImportGetter,
+ maybeLineStart,
+ defaultExport,
+ };
+}
+function pairToFnName(target, fixture) {
+ return `${target}-${fixture}`.replace(/-([a-z])/g, (s, c) => c.toUpperCase());
+}
+
+function runtimeFunctionName(target, fixture) {
+ // Webpack 4 appears to output it's bundles in such a way that Spidermonkey
+ if (target === "webpack4") {
+ return "js";
+ }
+
+ return pairToFnName(target, fixture);
+}
+
+function webpackModule(target, fixture, optimizedOut) {
+ return [
+ runtimeFunctionName(target, fixture),
+ ["__webpack_exports__", optimizedOut ? "(optimized away)" : "{\u2026}"],
+ optimizedOut
+ ? ["__webpack_require__", "(optimized away)"]
+ : "__webpack_require__()",
+ ["arguments", optimizedOut ? "(unavailable)" : "Arguments"],
+ ];
+}
+
+async function testBabelBindingsWithFlow(dbg) {
+ // Flow is not available on the non-babel builds.
+ for (const target of [
+ "parcel",
+ "rollup-babel6",
+ "rollup-babel7",
+ "webpack3-babel6",
+ "webpack3-babel7",
+ "webpack4-babel6",
+ "webpack4-babel7",
+ ]) {
+ const { webpackImportGetter } = targetToFlags(target);
+
+ await breakpointScopes(
+ dbg,
+ target,
+ "babel-bindings-with-flow",
+ { line: 9, column: 3 },
+ [
+ "root",
+ ["value", '"a-named"'],
+ "Module",
+ ["aNamed", webpackImportGetter || '"a-named"'],
+ "root()",
+ ]
+ );
+ }
+}
+
+async function testBabelFlowtypeBindings(dbg) {
+ // Flow is not available on the non-babel builds.
+ for (const target of [
+ "parcel",
+ "rollup-babel6",
+ "rollup-babel7",
+ "webpack3-babel6",
+ "webpack3-babel7",
+ "webpack4-babel6",
+ "webpack4-babel7",
+ ]) {
+ const { webpackImportGetter } = targetToFlags(target);
+
+ await breakpointScopes(
+ dbg,
+ target,
+ "babel-flowtype-bindings",
+ { line: 9, column: 3 },
+ [
+ "Module",
+ ["aConst", '"a-const"'],
+ ["Four", webpackImportGetter || '"one"'],
+ "root()",
+ ]
+ );
+ }
+}
+
+async function testEvalMaps(dbg) {
+ // At times, this test has been a bit flakey due to the inlined source map
+ // never loading. I'm not sure what causes that. If we observe flakiness in CI,
+ // we should consider disabling this test for now.
+
+ for (const target of ["webpack3", "webpack4"]) {
+ const { defaultExport } = targetToFlags(target);
+
+ await breakpointScopes(dbg, target, "eval-maps", { line: 14, column: 5 }, [
+ "Block",
+ ["<this>", "Window"],
+ ["three", "5"],
+ ["two", "4"],
+ "Block",
+ ["three", "3"],
+ ["two", "2"],
+ "Block",
+ ["arguments", "Arguments"],
+ ["one", "1"],
+ ...webpackModule(target, "eval-maps", true /* optimized out */),
+ ["module", "(optimized away)"],
+ defaultExport("root"),
+ ]);
+ }
+
+ for (const target of [
+ "parcel",
+ "rollup",
+ "rollup-babel6",
+ "rollup-babel7",
+ "webpack3-babel6",
+ "webpack3-babel7",
+ "webpack4-babel6",
+ "webpack4-babel7",
+ ]) {
+ const { defaultExport, rollupOptimized, maybeLineStart } =
+ targetToFlags(target);
+
+ await breakpointScopes(
+ dbg,
+ target,
+ "eval-maps",
+ { line: 14, column: maybeLineStart(5) },
+ [
+ "Block",
+ ["three", "5"],
+ ["two", "4"],
+ "Function Body",
+ ["three", rollupOptimized || "3"],
+ ["two", rollupOptimized || "2"],
+ "root",
+ ["one", "1"],
+ "Module",
+ defaultExport("root"),
+ ]
+ );
+ }
+}
+
+async function testForOf(dbg) {
+ for (const target of ["webpack3", "webpack4"]) {
+ const { defaultExport } = targetToFlags(target);
+
+ await breakpointScopes(dbg, target, "for-of", { line: 5, column: 1 }, [
+ "Block",
+ ["<this>", "Window"],
+ ["x", "1"],
+ "Block",
+ ["arguments", "Arguments"],
+ "class doThing",
+ "Block",
+ "mod",
+ ...webpackModule(target, "for-of", true /* optimizedOut */),
+ defaultExport("forOf"),
+ "module",
+ ]);
+ }
+
+ for (const target of [
+ "parcel",
+ "rollup",
+ "rollup-babel6",
+ "rollup-babel7",
+ "webpack3-babel6",
+ "webpack3-babel7",
+ "webpack4-babel6",
+ "webpack4-babel7",
+ ]) {
+ const { defaultExport, maybeLineStart } = targetToFlags(target);
+
+ await breakpointScopes(
+ dbg,
+ target,
+ "for-of",
+ { line: 5, column: maybeLineStart(5) },
+ [
+ "For",
+ ["x", "1"],
+ "forOf",
+ "doThing(arg)",
+ "Module",
+ defaultExport("forOf"),
+ "mod",
+ ]
+ );
+ }
+}
+
+async function testShadowedVars(dbg) {
+ for (const target of ["webpack3", "webpack4"]) {
+ await breakpointScopes(
+ dbg,
+ target,
+ "shadowed-vars",
+ { line: 18, column: 1 },
+ [
+ "Block",
+ ["<this>", "Window"],
+ ["aConst", '"const3"'],
+ ["aLet", '"let3"'],
+
+ "Block",
+ ["aConst", '"const2"'],
+ ["aLet", '"let2"'],
+ "class Outer",
+
+ "Block",
+ ["aConst", '"const1"'],
+ ["aLet", '"let1"'],
+ "class Outer",
+
+ "Block",
+ ["arguments", "Arguments"],
+ ["aVar", '"var3"'],
+
+ ...webpackModule(target, "shadowed-vars", true /* optimizedOut */),
+ ["module", "(optimized away)"],
+ ]
+ );
+ }
+
+ for (const target of [
+ "parcel",
+ "rollup",
+ "rollup-babel6",
+ "rollup-babel7",
+ "webpack3-babel6",
+ "webpack3-babel7",
+ "webpack4-babel6",
+ "webpack4-babel7",
+ ]) {
+ const { isParcel, rollupOptimized, maybeLineStart } = targetToFlags(target);
+
+ await breakpointScopes(
+ dbg,
+ target,
+ "shadowed-vars",
+ { line: 18, column: maybeLineStart(7) },
+ [
+ "Block",
+ ["aConst", rollupOptimized || '"const3"'],
+ ["aLet", rollupOptimized || '"let3"'],
+ "Block",
+ ["aConst", rollupOptimized || '"const2"'],
+ ["aLet", rollupOptimized || '"let2"'],
+ // eslint-disable-next-line no-nested-ternary
+ isParcel
+ ? "Outer()"
+ : rollupOptimized
+ ? ["Outer", rollupOptimized]
+ : "Outer:_Outer()",
+ "Function Body",
+ ["aConst", rollupOptimized || '"const1"'],
+ ["aLet", rollupOptimized || '"let1"'],
+ // eslint-disable-next-line no-nested-ternary
+ rollupOptimized
+ ? ["Outer", rollupOptimized]
+ : isParcel
+ ? "class Outer"
+ : "Outer()",
+ "default",
+ ["aVar", rollupOptimized || '"var3"'],
+ ]
+ );
+ }
+}
+
+async function testLineStartBindingsES6(dbg) {
+ for (const target of ["webpack3", "webpack4"]) {
+ await breakpointScopes(
+ dbg,
+ target,
+ "line-start-bindings-es6",
+ { line: 19, column: 1 },
+ [
+ "Block",
+ ["<this>", "{\u2026}"],
+ ["one", "1"],
+ ["two", "2"],
+ "Block",
+ ["arguments", "Arguments"],
+
+ "Block",
+ ["aFunc", "(optimized away)"],
+ ["arguments", "(unavailable)"],
+
+ ...webpackModule(
+ target,
+ "line-start-bindings-es6",
+ true /* optimizedOut */
+ ),
+ ["module", "(optimized away)"],
+ "root()",
+ ]
+ );
+ }
+
+ for (const target of [
+ "parcel",
+ "rollup",
+ "rollup-babel6",
+ "rollup-babel7",
+ "webpack3-babel6",
+ "webpack3-babel7",
+ "webpack4-babel6",
+ "webpack4-babel7",
+ ]) {
+ const { rollupOptimized, maybeLineStart } = targetToFlags(target);
+
+ await breakpointScopes(
+ dbg,
+ target,
+ "line-start-bindings-es6",
+ { line: 19, column: maybeLineStart(5) },
+ [
+ "Function Body",
+ ["<this>", "{\u2026}"],
+ ["one", rollupOptimized || "1"],
+ ["two", rollupOptimized || "2"],
+ "root",
+ ["aFunc", "(optimized away)"],
+ "Module",
+ "root()",
+ ]
+ );
+ }
+}
+
+async function testThisArgumentsBindings(dbg) {
+ for (const target of ["webpack3", "webpack4"]) {
+ await breakpointScopes(
+ dbg,
+ target,
+ "this-arguments-bindings",
+ { line: 4, column: 1 },
+ [
+ "Block",
+ ["<this>", '"this-value"'],
+ ["arrow", "(uninitialized)"],
+ "fn",
+ ["arg", '"arg-value"'],
+ ["arguments", "Arguments"],
+ "root",
+ ["arguments", "Arguments"],
+ "fn()",
+ ...webpackModule(
+ target,
+ "this-arguments-bindings",
+ true /* optimizedOut */
+ ),
+ ["module", "(optimized away)"],
+ "root()",
+ ]
+ );
+
+ await breakpointScopes(
+ dbg,
+ target,
+ "this-arguments-bindings",
+ { line: 8, column: 1 },
+ [
+ "Block",
+ ["<this>", '"this-value"'],
+ ["argArrow", '"arrow-arg"'],
+ ["arguments", "Arguments"],
+ "Block",
+ ["arrow", "(optimized away)"],
+ "fn",
+ ["arg", '"arg-value"'],
+ ["arguments", "Arguments"],
+ "root",
+ ["arguments", "Arguments"],
+ "fn()",
+ ...webpackModule(
+ target,
+ "this-arguments-bindings",
+ true /* optimizedOut */
+ ),
+ ["module", "(optimized away)"],
+ "root()",
+ ]
+ );
+ }
+
+ for (const target of [
+ "parcel",
+ "rollup",
+ "rollup-babel6",
+ "rollup-babel7",
+ "webpack3-babel6",
+ "webpack3-babel7",
+ "webpack4-babel6",
+ "webpack4-babel7",
+ ]) {
+ const { isParcel, maybeLineStart } = targetToFlags(target);
+
+ await breakpointScopes(
+ dbg,
+ target,
+ "this-arguments-bindings",
+ { line: 4, column: maybeLineStart(5) },
+ [
+ "Function Body",
+ ["<this>", '"this-value"'],
+ [
+ "arrow",
+ target === "rollup" || isParcel ? "(uninitialized)" : "undefined",
+ ],
+ "fn",
+ ["arg", '"arg-value"'],
+ ["arguments", "Arguments"],
+ "root",
+ "fn(arg)",
+ "Module",
+ "root()",
+ ]
+ );
+
+ await breakpointScopes(
+ dbg,
+ target,
+ "this-arguments-bindings",
+ { line: 8, column: maybeLineStart(7) },
+ [
+ "arrow",
+ ["<this>", '"this-value"'],
+ ["argArrow", '"arrow-arg"'],
+ "Function Body",
+ target === "rollup" || isParcel
+ ? ["arrow", "(optimized away)"]
+ : "arrow(argArrow)",
+ "fn",
+ ["arg", '"arg-value"'],
+ ["arguments", "Arguments"],
+ "root",
+ "fn(arg)",
+ "Module",
+ "root()",
+ ]
+ );
+ }
+}
+
+async function testClasses(dbg) {
+ for (const target of ["webpack3", "webpack4"]) {
+ await breakpointScopes(dbg, target, "classes", { line: 6, column: 1 }, [
+ "Block",
+ ["<this>", "{}"],
+ ["arguments", "Arguments"],
+ "Block",
+ ["Thing", "(optimized away)"],
+ "Block",
+ "Another()",
+ ["one", "1"],
+ "Thing()",
+ "Block",
+ ["arguments", "(unavailable)"],
+ ...webpackModule(target, "classes", true /* optimizedOut */),
+ ["module", "(optimized away)"],
+ "root()",
+ ]);
+
+ await breakpointScopes(dbg, target, "classes", { line: 16, column: 1 }, [
+ "Block",
+ ["<this>", "{}"],
+ ["three", "3"],
+ ["two", "2"],
+ "Block",
+ ["arguments", "Arguments"],
+ "Block",
+ "Another()",
+ "Block",
+ "Another()",
+ ["one", "1"],
+ "Thing()",
+ "Block",
+ ["arguments", "(unavailable)"],
+ ...webpackModule(target, "classes", true /* optimizedOut */),
+ ["module", "(optimized away)"],
+ "root()",
+ ]);
+ }
+
+ for (const target of [
+ "parcel",
+ "rollup",
+ "rollup-babel6",
+ "rollup-babel7",
+ "webpack3-babel6",
+ "webpack3-babel7",
+ "webpack4-babel6",
+ "webpack4-babel7",
+ ]) {
+ const { isParcel, rollupOptimized, maybeLineStart } = targetToFlags(target);
+
+ await breakpointScopes(
+ dbg,
+ target,
+ "classes",
+ { line: 6, column: maybeLineStart(7) },
+ [
+ "Class",
+ target === "rollup" || isParcel
+ ? ["Thing", "(optimized away)"]
+ : "Thing()",
+ "Function Body",
+ target === "webpack3-babel6" ? "Another()" : "class Another",
+ "one",
+ target === "rollup" || isParcel
+ ? ["Thing", "(optimized away)"]
+ : "Thing()",
+ "Module",
+ "root()",
+ ]
+ );
+
+ await breakpointScopes(
+ dbg,
+ target,
+ "classes",
+ { line: 16, column: maybeLineStart(7) },
+ [
+ "Function Body",
+ ["three", rollupOptimized || "3"],
+ ["two", rollupOptimized || "2"],
+ "Class",
+ target === "webpack3-babel6" ? "Another()" : "class Another",
+ "Function Body",
+ target === "webpack3-babel6" ? "Another()" : "class Another",
+ ["one", "1"],
+ target === "webpack3-babel6" ? "Thing()" : "class Thing",
+ "Module",
+ "root()",
+ ]
+ );
+ }
+}
+
+async function testForLoops(dbg) {
+ for (const target of ["webpack3", "webpack4"]) {
+ await breakpointScopes(dbg, target, "for-loops", { line: 5, column: 1 }, [
+ "Block",
+ ["<this>", "Window"],
+ ["i", "1"],
+ "Block",
+ ["i", "0"],
+ "Block",
+ ["arguments", "Arguments"],
+ ...webpackModule(target, "for-loops", true /* optimizedOut */),
+ ["module", "(optimized away)"],
+ "root()",
+ ]);
+ await breakpointScopes(dbg, target, "for-loops", { line: 9, column: 1 }, [
+ "Block",
+ ["<this>", "Window"],
+ ["i", '"2"'],
+ "Block",
+ ["i", "0"],
+ "Block",
+ ["arguments", "Arguments"],
+ ...webpackModule(target, "for-loops", true /* optimizedOut */),
+ ["module", "(optimized away)"],
+ "root()",
+ ]);
+ await breakpointScopes(dbg, target, "for-loops", { line: 13, column: 1 }, [
+ "Block",
+ ["<this>", "Window"],
+ ["i", "3"],
+ "Block",
+ ["i", "0"],
+ "Block",
+ ["arguments", "Arguments"],
+ ...webpackModule(target, "for-loops", true /* optimizedOut */),
+ ["module", "(optimized away)"],
+ "root()",
+ ]);
+ }
+
+ for (const target of [
+ "parcel",
+ "rollup",
+ "rollup-babel6",
+ "rollup-babel7",
+ "webpack3-babel6",
+ "webpack3-babel7",
+ "webpack4-babel6",
+ "webpack4-babel7",
+ ]) {
+ const { rollupOptimized, maybeLineStart } = targetToFlags(target);
+
+ await breakpointScopes(
+ dbg,
+ target,
+ "for-loops",
+ { line: 5, column: maybeLineStart(5) },
+ [
+ "For",
+ ["i", "1"],
+ "Function Body",
+ ["i", rollupOptimized || "0"],
+ "Module",
+ "root()",
+ ]
+ );
+ await breakpointScopes(
+ dbg,
+ target,
+ "for-loops",
+ { line: 9, column: maybeLineStart(5) },
+ [
+ "For",
+ ["i", '"2"'],
+ "Function Body",
+ ["i", rollupOptimized || "0"],
+ "Module",
+ "root()",
+ ]
+ );
+ await breakpointScopes(
+ dbg,
+ target,
+ "for-loops",
+ { line: 13, column: maybeLineStart(5) },
+ [
+ "For",
+ ["i", target === "rollup" ? "3" : rollupOptimized || "3"],
+ "Function Body",
+ ["i", rollupOptimized || "0"],
+ "Module",
+ "root()",
+ ]
+ );
+ }
+}
+
+async function testFunctions(dbg) {
+ for (const target of ["webpack3", "webpack4"]) {
+ await breakpointScopes(dbg, target, "functions", { line: 6, column: 1 }, [
+ "Block",
+ ["<this>", "(optimized away)"],
+ ["arguments", "Arguments"],
+ ["p3", "undefined"],
+ "Block",
+ "arrow()",
+ "inner",
+ ["arguments", "Arguments"],
+ ["p2", "undefined"],
+ "Block",
+ "inner(p2)",
+ "Block",
+ ["inner", "(optimized away)"],
+ "decl",
+ ["arguments", "Arguments"],
+ ["p1", "undefined"],
+ "root",
+ ["arguments", "Arguments"],
+ "decl()",
+ ...webpackModule(target, "functions", true /* optimizedOut */),
+ ["module", "(optimized away)"],
+ "root()",
+ ]);
+ }
+
+ for (const target of [
+ "parcel",
+ "rollup",
+ "rollup-babel6",
+ "rollup-babel7",
+ "webpack3-babel6",
+ "webpack3-babel7",
+ "webpack4-babel6",
+ "webpack4-babel7",
+ ]) {
+ const { isParcel, maybeLineStart } = targetToFlags(target);
+
+ await breakpointScopes(
+ dbg,
+ target,
+ "functions",
+ { line: 6, column: maybeLineStart(9) },
+ [
+ "arrow",
+ ["p3", "undefined"],
+ "Function Body",
+ "arrow(p3)",
+ "inner",
+ ["p2", "undefined"],
+ "Function Expression",
+ "inner(p2)",
+ "Function Body",
+ target === "rollup" || isParcel
+ ? ["inner", "(optimized away)"]
+ : "inner(p2)",
+ "decl",
+ ["p1", "undefined"],
+ "root",
+ "decl(p1)",
+ "Module",
+ "root()",
+ ]
+ );
+ }
+}
+
+async function testSwitches(dbg) {
+ for (const target of ["webpack3", "webpack4"]) {
+ await breakpointScopes(dbg, target, "switches", { line: 7, column: 1 }, [
+ "Block",
+ ["<this>", "Window"],
+ ["val", "2"],
+ "Block",
+ ["val", "1"],
+ "Block",
+ ["arguments", "Arguments"],
+ ...webpackModule(target, "switches", true /* optimizedOut */),
+ ["module", "(optimized away)"],
+ "root()",
+ ]);
+
+ await breakpointScopes(dbg, target, "switches", { line: 10, column: 1 }, [
+ "Block",
+ ["<this>", "Window"],
+ ["val", "3"],
+ "Block",
+ ["val", "2"],
+ "Block",
+ ["val", "1"],
+ "Block",
+ ["arguments", "Arguments"],
+ ...webpackModule(target, "switches", true /* optimizedOut */),
+ ["module", "(optimized away)"],
+ "root()",
+ ]);
+ }
+
+ for (const target of [
+ "parcel",
+ "rollup",
+ "rollup-babel6",
+ "rollup-babel7",
+ "webpack3-babel6",
+ "webpack3-babel7",
+ "webpack4-babel6",
+ "webpack4-babel7",
+ ]) {
+ const { rollupOptimized, maybeLineStart } = targetToFlags(target);
+
+ await breakpointScopes(
+ dbg,
+ target,
+ "switches",
+ { line: 7, column: maybeLineStart(7) },
+ [
+ "Switch",
+ ["val", rollupOptimized || "2"],
+ "Function Body",
+ ["val", rollupOptimized || "1"],
+ "Module",
+ "root()",
+ ]
+ );
+
+ await breakpointScopes(
+ dbg,
+ target,
+ "switches",
+ { line: 10, column: maybeLineStart(7) },
+ [
+ "Block",
+ ["val", rollupOptimized || "3"],
+ "Switch",
+ ["val", rollupOptimized || "2"],
+ "Function Body",
+ ["val", rollupOptimized || "1"],
+ "Module",
+ "root()",
+ ]
+ );
+ }
+}
+
+async function testTryCatches(dbg) {
+ for (const target of ["webpack3", "webpack4"]) {
+ await breakpointScopes(dbg, target, "try-catches", { line: 8, column: 1 }, [
+ "Block",
+ ["<this>", "Window"],
+ ["two", "2"],
+ "Block",
+ ["err", '"AnError"'],
+ "Block",
+ ["one", "1"],
+ "Block",
+ ["arguments", "Arguments"],
+ ...webpackModule(target, "try-catches", true /* optimizedOut */),
+ ["module", "(optimized away)"],
+ "root()",
+ ]);
+ }
+
+ for (const target of [
+ "parcel",
+ "rollup",
+ "rollup-babel6",
+ "rollup-babel7",
+ "webpack3-babel6",
+ "webpack3-babel7",
+ "webpack4-babel6",
+ "webpack4-babel7",
+ ]) {
+ const { rollupOptimized, maybeLineStart } = targetToFlags(target);
+
+ await breakpointScopes(
+ dbg,
+ target,
+ "try-catches",
+ { line: 8, column: maybeLineStart(5) },
+ [
+ "Block",
+ ["two", rollupOptimized || "2"],
+ "Catch",
+ ["err", '"AnError"'],
+ "Function Body",
+ ["one", rollupOptimized || "1"],
+ "Module",
+ "root()",
+ ]
+ );
+ }
+}
+
+async function testLexAndNonlex(dbg) {
+ for (const target of ["webpack3", "webpack4"]) {
+ await breakpointScopes(
+ dbg,
+ target,
+ "lex-and-nonlex",
+ { line: 3, column: 1 },
+ [
+ "Block",
+ ["<this>", "undefined"],
+ ["arguments", "Arguments"],
+ "Block",
+ "class Thing",
+ "Block",
+ ["arguments", "(unavailable)"],
+ ["someHelper", "(optimized away)"],
+ ...webpackModule(target, "lex-and-nonlex", true /* optimizedOut */),
+ ["module", "(optimized away)"],
+ "root()",
+ ]
+ );
+ }
+
+ for (const target of [
+ "parcel",
+ "rollup",
+ "rollup-babel6",
+ "rollup-babel7",
+ "webpack3-babel6",
+ "webpack3-babel7",
+ "webpack4-babel6",
+ "webpack4-babel7",
+ ]) {
+ const { isParcel, maybeLineStart } = targetToFlags(target);
+
+ await breakpointScopes(
+ dbg,
+ target,
+ "lex-and-nonlex",
+ { line: 3, column: maybeLineStart(5) },
+ [
+ "Function Body",
+ target === "rollup" || target === "parcel" ? "class Thing" : "Thing()",
+ "root",
+ target === "rollup" || isParcel
+ ? ["someHelper", "(optimized away)"]
+ : "someHelper()",
+ "Module",
+ "root()",
+ ]
+ );
+ }
+}
+
+async function testTypescriptClasses(dbg) {
+ // Typescript is not available on the Babel builds.
+ for (const target of ["parcel", "webpack3", "webpack4", "rollup"]) {
+ const { isRollup, isParcel, rollupOptimized } = targetToFlags(target);
+
+ await breakpointScopes(
+ dbg,
+ target,
+ "typescript-classes",
+ { line: 50, column: 3 },
+ [
+ "Module",
+ "AnotherThing()",
+ "AppComponent()",
+ "decoratorFactory(opts)",
+ rollupOptimized ? ["def", rollupOptimized] : "def()",
+ rollupOptimized
+ ? ["ExportedOther", rollupOptimized]
+ : "ExportedOther()",
+ rollupOptimized
+ ? ["ExpressionClass", rollupOptimized]
+ : "ExpressionClass:Foo()",
+ "fn(arg)",
+ // Rollup optimizes out the 'ns' reference here, but when it does, it leave a mapping
+ // pointed at a location that is super weird, so it ends up being unmapped instead
+ // be "(optimized out)".
+ // Parcel converts the "ns;" mapping into a single full-line mapping, for some reason.
+ // That may have to do with https://github.com/parcel-bundler/parcel/pull/1755#discussion_r205584159
+ // though it's not 100% clear.
+ ["ns", isRollup || isParcel ? "(unmapped)" : "{\u2026}"],
+ "SubDecl()",
+ "SubVar:SubExpr()",
+ ]
+ );
+ }
+}
+
+async function testTypeModule(dbg) {
+ for (const target of ["webpack3", "webpack4"]) {
+ await breakpointScopes(dbg, target, "type-module", { line: 7, column: 1 }, [
+ "Block",
+ ["<this>", "Window"],
+ ["arguments", "Arguments"],
+ "Block",
+ ["alsoModuleScoped", "2"],
+ ...webpackModule(target, "type-module", true /* optimizedOut */),
+ ["module", "(optimized away)"],
+ ["moduleScoped", "1"],
+ "thirdModuleScoped()",
+ ]);
+ }
+
+ for (const target of [
+ "parcel",
+ "rollup",
+ "rollup-babel6",
+ "rollup-babel7",
+ "webpack3-babel6",
+ "webpack3-babel7",
+ "webpack4-babel6",
+ "webpack4-babel7",
+ ]) {
+ const { maybeLineStart } = targetToFlags(target);
+
+ await breakpointScopes(
+ dbg,
+ target,
+ "type-module",
+ { line: 7, column: maybeLineStart(3) },
+ [
+ "Module",
+ ["alsoModuleScoped", "2"],
+ ["moduleScoped", "1"],
+ "thirdModuleScoped()",
+ ]
+ );
+ }
+}
+
+async function testTypeScriptCJS(dbg) {
+ for (const target of ["webpack3", "webpack4"]) {
+ await breakpointScopes(
+ dbg,
+ target,
+ "type-script-cjs",
+ { line: 7, column: 1 },
+ [
+ "Block",
+ ["<this>", "Window"],
+ ["arguments", "Arguments"],
+ "Block",
+ "alsoModuleScopes",
+
+ runtimeFunctionName(target, "type-script-cjs"),
+ ["arguments", "(unavailable)"],
+ ["exports", "(optimized away)"],
+ ["module", "(optimized away)"],
+ "moduleScoped",
+ "nonModules",
+ "thirdModuleScoped",
+ ]
+ );
+ }
+
+ // CJS does not work on Rollup.
+ for (const target of [
+ "parcel",
+ "webpack3-babel6",
+ "webpack3-babel7",
+ "webpack4-babel6",
+ "webpack4-babel7",
+ ]) {
+ await breakpointScopes(
+ dbg,
+ target,
+ "type-script-cjs",
+ { line: 7, column: 3 },
+ [
+ "Module",
+ "alsoModuleScopes",
+ "moduleScoped",
+ "nonModules",
+ "thirdModuleScoped",
+ ]
+ );
+ }
+}
+
+async function testOutOfOrderDeclarationsCJS(dbg) {
+ // CJS does not work on Rollup.
+ for (const target of [
+ "parcel",
+ "webpack3-babel6",
+ "webpack3-babel7",
+ "webpack4-babel6",
+ "webpack4-babel7",
+ ]) {
+ await breakpointScopes(
+ dbg,
+ target,
+ "out-of-order-declarations-cjs",
+ { line: 8, column: 5 },
+ [
+ "callback",
+ "fn(inner)",
+ ["val", "undefined"],
+ "root",
+ ["callback", "(optimized away)"],
+ ["fn", "(optimized away)"],
+ ["val", "(optimized away)"],
+ "Module",
+
+ // This value is currently optimized away, which isn't 100% accurate.
+ // Because import declarations is the last thing in the file, our current
+ // logic doesn't cover _both_ 'var' statements that it generates,
+ // making us use the first, optimized-out binding. Given that imports
+ // are almost never the last thing in a file though, this is probably not
+ // a huge deal for now.
+ [
+ "aDefault",
+ target.match(/webpack(3|4)-babel7/)
+ ? '"a-default"'
+ : "(optimized away)",
+ ],
+ ["root", "(optimized away)"],
+ ["val", "(optimized away)"],
+ ]
+ );
+ }
+}
+
+async function testModulesCJS(dbg) {
+ for (const target of ["webpack3", "webpack4"]) {
+ await breakpointScopes(dbg, target, "modules-cjs", { line: 7, column: 1 }, [
+ "Block",
+ ["<this>", "Window"],
+ ["arguments", "Arguments"],
+ "Block",
+ ["alsoModuleScoped", "2"],
+ runtimeFunctionName(target, "modules-cjs"),
+ ["arguments", "(unavailable)"],
+ ["exports", "(optimized away)"],
+ ["module", "(optimized away)"],
+ ["moduleScoped", "1"],
+ "thirdModuleScoped()",
+ ]);
+ }
+
+ // CJS does not work on Rollup.
+ for (const target of [
+ "parcel",
+ "webpack3-babel6",
+ "webpack3-babel7",
+ "webpack4-babel6",
+ "webpack4-babel7",
+ ]) {
+ await breakpointScopes(dbg, target, "modules-cjs", { line: 7, column: 3 }, [
+ "Module",
+ ["alsoModuleScoped", "2"],
+ ["moduleScoped", "1"],
+ "thirdModuleScoped()",
+ ]);
+ }
+}
+
+async function testWebpackLineMappings(dbg) {
+ await breakpointScopes(
+ dbg,
+ "webpack3",
+ "webpack-line-mappings",
+ { line: 11, column: 1 },
+ [
+ "Block",
+ ["<this>", '"this-value"'],
+ ["arg", '"arg-value"'],
+ ["arguments", "Arguments"],
+ ["inner", "undefined"],
+ "Block",
+ ["someName", "(optimized away)"],
+ "Block",
+ ["two", "2"],
+ "Block",
+ ["one", "1"],
+ "root",
+ ["arguments", "Arguments"],
+ "fn:someName()",
+ runtimeFunctionName("webpack3", "webpack-line-mappings"),
+ ["__webpack_exports__", "(optimized away)"],
+ ["__WEBPACK_IMPORTED_MODULE_0__src_mod1__", "{\u2026}"],
+ ["__webpack_require__", "(optimized away)"],
+ ["arguments", "(unavailable)"],
+ ["module", "(optimized away)"],
+ "root()",
+ ]
+ );
+
+ await breakpointScopes(
+ dbg,
+ "webpack4",
+ "webpack-line-mappings",
+ { line: 11, column: 1 },
+ [
+ "Block",
+ ["<this>", '"this-value"'],
+ ["arg", '"arg-value"'],
+ ["arguments", "Arguments"],
+ ["inner", "undefined"],
+ "Block",
+ ["someName", "(optimized away)"],
+ "Block",
+ ["two", "2"],
+ "Block",
+ ["one", "1"],
+ "root",
+ ["arguments", "Arguments"],
+ "fn:someName()",
+ runtimeFunctionName("webpack4", "webpack-line-mappings"),
+ ["__webpack_exports__", "(optimized away)"],
+ ["__webpack_require__", "(optimized away)"],
+ ["_src_mod1__WEBPACK_IMPORTED_MODULE_0__", "{\u2026}"],
+ ["arguments", "(unavailable)"],
+ ["module", "(optimized away)"],
+ "root()",
+ ]
+ );
+}
+
+async function testWebpackFunctions(dbg) {
+ for (const target of ["webpack3", "webpack4"]) {
+ const { defaultExport } = targetToFlags(target);
+
+ await breakpointScopes(
+ dbg,
+ target,
+ "webpack-functions",
+ { line: 4, column: 1 },
+ [
+ "Block",
+ ["<this>", "{\u2026}"],
+ ["arguments", "Arguments"],
+ ["x", "4"],
+ runtimeFunctionName(target, "webpack-functions"),
+ ["__webpack_exports__", "(optimized away)"],
+ ["__webpack_require__", "(optimized away)"],
+ ["arguments", "(unavailable)"],
+ ["module", "{\u2026}"],
+ defaultExport("root"),
+ ]
+ );
+ }
+}
+
+async function testESModules(dbg) {
+ await breakpointScopes(
+ dbg,
+ "webpack3",
+ "esmodules",
+ { line: 20, column: 1 },
+ [
+ "Block",
+ ["<this>", "Window"],
+ ["arguments", "Arguments"],
+ runtimeFunctionName("webpack3", "esmodules"),
+ "__webpack_exports__",
+ "__WEBPACK_IMPORTED_MODULE_0__src_mod1__",
+ "__WEBPACK_IMPORTED_MODULE_1__src_mod2__",
+ "__WEBPACK_IMPORTED_MODULE_10__src_optimized_out__",
+ "__WEBPACK_IMPORTED_MODULE_2__src_mod3__",
+ "__WEBPACK_IMPORTED_MODULE_3__src_mod4__",
+ "__WEBPACK_IMPORTED_MODULE_4__src_mod5__",
+ "__WEBPACK_IMPORTED_MODULE_5__src_mod6__",
+ "__WEBPACK_IMPORTED_MODULE_6__src_mod7__",
+ "__WEBPACK_IMPORTED_MODULE_7__src_mod9__",
+ "__WEBPACK_IMPORTED_MODULE_8__src_mod10__",
+ "__WEBPACK_IMPORTED_MODULE_9__src_mod11__",
+ "__webpack_require__",
+ "arguments",
+ "example",
+ "module",
+ "root()",
+ ]
+ );
+
+ await breakpointScopes(
+ dbg,
+ "webpack4",
+ "esmodules",
+ { line: 20, column: 1 },
+ [
+ "Block",
+ ["<this>", "Window"],
+ ["arguments", "Arguments"],
+ runtimeFunctionName("webpack4", "esmodules"),
+ "__webpack_exports__",
+ "__webpack_require__",
+ "_src_mod1__WEBPACK_IMPORTED_MODULE_0__",
+ "_src_mod10__WEBPACK_IMPORTED_MODULE_8__",
+ "_src_mod11__WEBPACK_IMPORTED_MODULE_9__",
+ "_src_mod2__WEBPACK_IMPORTED_MODULE_1__",
+ "_src_mod3__WEBPACK_IMPORTED_MODULE_2__",
+ "_src_mod4__WEBPACK_IMPORTED_MODULE_3__",
+ "_src_mod5__WEBPACK_IMPORTED_MODULE_4__",
+ "_src_mod6__WEBPACK_IMPORTED_MODULE_5__",
+ "_src_mod7__WEBPACK_IMPORTED_MODULE_6__",
+ "_src_mod9__WEBPACK_IMPORTED_MODULE_7__",
+ "_src_optimized_out__WEBPACK_IMPORTED_MODULE_10__",
+ "arguments",
+ "example()",
+ "module",
+ "root()",
+ ]
+ );
+
+ for (const target of [
+ "parcel",
+ "rollup",
+ "webpack3-babel6",
+ "webpack3-babel7",
+ "webpack4-babel6",
+ "webpack4-babel7",
+ ]) {
+ const { defaultExport, webpackImportGetter, maybeLineStart } =
+ targetToFlags(target);
+
+ await breakpointScopes(
+ dbg,
+ target,
+ "esmodules",
+ { line: 20, column: maybeLineStart(3) },
+ [
+ "Module",
+ ["aDefault", '"a-default"'],
+ ["aDefault2", '"a-default2"'],
+ ["aDefault3", '"a-default3"'],
+ ["anAliased", webpackImportGetter || '"an-original"'],
+ ["anAliased2", webpackImportGetter || '"an-original2"'],
+ ["anAliased3", webpackImportGetter || '"an-original3"'],
+ ["aNamed", webpackImportGetter || '"a-named"'],
+ ["aNamed2", webpackImportGetter || '"a-named2"'],
+ ["aNamed3", webpackImportGetter || '"a-named3"'],
+ ["aNamespace", "{\u2026}"],
+ ["anotherNamed", webpackImportGetter || '"a-named"'],
+ ["anotherNamed2", webpackImportGetter || '"a-named2"'],
+ ["anotherNamed3", webpackImportGetter || '"a-named3"'],
+ defaultExport("example"),
+ ["optimizedOut", "(optimized away)"],
+ "root()",
+ ]
+ );
+ }
+
+ for (const target of ["rollup-babel6", "rollup-babel7"]) {
+ // This test currently bails out because Babel does not map function calls
+ // fully and includes the () of the call in the range of the identifier.
+ // this means that Rollup, has to map locations for calls to imports,
+ // it can fail. This will be addressed in Babel eventually.
+ await breakpointScopes(dbg, target, "esmodules", { line: 20, column: 3 }, [
+ "root",
+ ["<this>", "Window"],
+ ["arguments", "Arguments"],
+ runtimeFunctionName(target, "esmodules"),
+ ["aDefault", '"a-default"'],
+ ["aDefault2", '"a-default2"'],
+ ["aDefault3", '"a-default3"'],
+ ["aNamed", '"a-named"'],
+ ["aNamed$1", "(optimized away)"],
+ ["aNamed2", '"a-named2"'],
+ ["aNamed3", '"a-named3"'],
+ ["aNamespace", "{\u2026}"],
+ ["arguments", "(unavailable)"],
+ ["mod4", "(optimized away)"],
+ ["original", '"an-original"'],
+ ["original$1", '"an-original2"'],
+ ["original$2", '"an-original3"'],
+ "root()",
+ ]);
+ }
+}
+
+async function testESModulesCJS(dbg) {
+ await breakpointScopes(
+ dbg,
+ "webpack3",
+ "esmodules-cjs",
+ { line: 20, column: 1 },
+ [
+ "Block",
+ ["<this>", "Window"],
+ ["arguments", "Arguments"],
+ runtimeFunctionName("webpack3", "esmodules-cjs"),
+ "__webpack_exports__",
+ "__WEBPACK_IMPORTED_MODULE_0__src_mod1__",
+ "__WEBPACK_IMPORTED_MODULE_1__src_mod2__",
+ "__WEBPACK_IMPORTED_MODULE_10__src_optimized_out__",
+ "__WEBPACK_IMPORTED_MODULE_2__src_mod3__",
+ "__WEBPACK_IMPORTED_MODULE_3__src_mod4__",
+ "__WEBPACK_IMPORTED_MODULE_4__src_mod5__",
+ "__WEBPACK_IMPORTED_MODULE_5__src_mod6__",
+ "__WEBPACK_IMPORTED_MODULE_6__src_mod7__",
+ "__WEBPACK_IMPORTED_MODULE_7__src_mod9__",
+ "__WEBPACK_IMPORTED_MODULE_8__src_mod10__",
+ "__WEBPACK_IMPORTED_MODULE_9__src_mod11__",
+ "__webpack_require__",
+ "arguments",
+ "example",
+ "module",
+ "root()",
+ ]
+ );
+
+ await breakpointScopes(
+ dbg,
+ "webpack4",
+ "esmodules-cjs",
+ { line: 20, column: 1 },
+ [
+ "Block",
+ ["<this>", "Window"],
+ ["arguments", "Arguments"],
+ runtimeFunctionName("webpack4", "esmodules-cjs"),
+ "__webpack_exports__",
+ "__webpack_require__",
+ "_src_mod1__WEBPACK_IMPORTED_MODULE_0__",
+ "_src_mod10__WEBPACK_IMPORTED_MODULE_8__",
+ "_src_mod11__WEBPACK_IMPORTED_MODULE_9__",
+ "_src_mod2__WEBPACK_IMPORTED_MODULE_1__",
+ "_src_mod3__WEBPACK_IMPORTED_MODULE_2__",
+ "_src_mod4__WEBPACK_IMPORTED_MODULE_3__",
+ "_src_mod5__WEBPACK_IMPORTED_MODULE_4__",
+ "_src_mod6__WEBPACK_IMPORTED_MODULE_5__",
+ "_src_mod7__WEBPACK_IMPORTED_MODULE_6__",
+ "_src_mod9__WEBPACK_IMPORTED_MODULE_7__",
+ "_src_optimized_out__WEBPACK_IMPORTED_MODULE_10__",
+ "arguments",
+ "example()",
+ "module",
+ "root()",
+ ]
+ );
+
+ // CJS does not work on Rollup.
+ for (const target of [
+ "parcel",
+ "webpack3-babel6",
+ "webpack3-babel7",
+ "webpack4-babel6",
+ "webpack4-babel7",
+ ]) {
+ await breakpointScopes(
+ dbg,
+ target,
+ "esmodules-cjs",
+ { line: 20, column: 3 },
+ [
+ "Module",
+ ["aDefault", '"a-default"'],
+ ["aDefault2", '"a-default2"'],
+ ["aDefault3", '"a-default3"'],
+ ["anAliased", '"an-original"'],
+ ["anAliased2", '"an-original2"'],
+ ["anAliased3", '"an-original3"'],
+ ["aNamed", '"a-named"'],
+ ["aNamed2", '"a-named2"'],
+ ["aNamed3", '"a-named3"'],
+ ["aNamespace", "{\u2026}"],
+ ["anotherNamed", '"a-named"'],
+ ["anotherNamed2", '"a-named2"'],
+ ["anotherNamed3", '"a-named3"'],
+ ["example", "(optimized away)"],
+ ["optimizedOut", "(optimized away)"],
+ "root()",
+ ]
+ );
+ }
+}
+
+async function testESModulesES6(dbg) {
+ await breakpointScopes(
+ dbg,
+ "webpack3",
+ "esmodules-es6",
+ { line: 20, column: 1 },
+ [
+ "Block",
+ ["<this>", "Window"],
+ ["arguments", "Arguments"],
+ runtimeFunctionName("webpack3", "esmodules-es6"),
+ "__webpack_exports__",
+ "__WEBPACK_IMPORTED_MODULE_0__src_mod1__",
+ "__WEBPACK_IMPORTED_MODULE_1__src_mod2__",
+ "__WEBPACK_IMPORTED_MODULE_10__src_optimized_out__",
+ "__WEBPACK_IMPORTED_MODULE_2__src_mod3__",
+ "__WEBPACK_IMPORTED_MODULE_3__src_mod4__",
+ "__WEBPACK_IMPORTED_MODULE_4__src_mod5__",
+ "__WEBPACK_IMPORTED_MODULE_5__src_mod6__",
+ "__WEBPACK_IMPORTED_MODULE_6__src_mod7__",
+ "__WEBPACK_IMPORTED_MODULE_7__src_mod9__",
+ "__WEBPACK_IMPORTED_MODULE_8__src_mod10__",
+ "__WEBPACK_IMPORTED_MODULE_9__src_mod11__",
+ "__webpack_require__",
+ "arguments",
+ "example",
+ "module",
+ "root()",
+ ]
+ );
+
+ await breakpointScopes(
+ dbg,
+ "webpack4",
+ "esmodules-es6",
+ { line: 20, column: 1 },
+ [
+ "Block",
+ ["<this>", "Window"],
+ ["arguments", "Arguments"],
+ runtimeFunctionName("webpack4", "esmodules-es6"),
+ "__webpack_exports__",
+ "__webpack_require__",
+ "_src_mod1__WEBPACK_IMPORTED_MODULE_0__",
+ "_src_mod10__WEBPACK_IMPORTED_MODULE_8__",
+ "_src_mod11__WEBPACK_IMPORTED_MODULE_9__",
+ "_src_mod2__WEBPACK_IMPORTED_MODULE_1__",
+ "_src_mod3__WEBPACK_IMPORTED_MODULE_2__",
+ "_src_mod4__WEBPACK_IMPORTED_MODULE_3__",
+ "_src_mod5__WEBPACK_IMPORTED_MODULE_4__",
+ "_src_mod6__WEBPACK_IMPORTED_MODULE_5__",
+ "_src_mod7__WEBPACK_IMPORTED_MODULE_6__",
+ "_src_mod9__WEBPACK_IMPORTED_MODULE_7__",
+ "_src_optimized_out__WEBPACK_IMPORTED_MODULE_10__",
+ "arguments",
+ "example()",
+ "module",
+ "root()",
+ ]
+ );
+
+ for (const target of [
+ "parcel",
+ "rollup",
+ "webpack3-babel6",
+ "webpack3-babel7",
+ "webpack4-babel6",
+ "webpack4-babel7",
+ ]) {
+ const { defaultExport, webpack4ImportGetter, maybeLineStart } =
+ targetToFlags(target);
+
+ await breakpointScopes(
+ dbg,
+ target,
+ "esmodules-es6",
+ { line: 20, column: maybeLineStart(3) },
+ [
+ "Module",
+ ["aDefault", '"a-default"'],
+ ["aDefault2", '"a-default2"'],
+ ["aDefault3", '"a-default3"'],
+ ["anAliased", webpack4ImportGetter || '"an-original"'],
+ ["anAliased2", webpack4ImportGetter || '"an-original2"'],
+ ["anAliased3", webpack4ImportGetter || '"an-original3"'],
+ ["aNamed", webpack4ImportGetter || '"a-named"'],
+ ["aNamed2", webpack4ImportGetter || '"a-named2"'],
+ ["aNamed3", webpack4ImportGetter || '"a-named3"'],
+ ["aNamespace", "{\u2026}"],
+ ["anotherNamed", webpack4ImportGetter || '"a-named"'],
+ ["anotherNamed2", webpack4ImportGetter || '"a-named2"'],
+ ["anotherNamed3", webpack4ImportGetter || '"a-named3"'],
+ defaultExport("example"),
+ ["optimizedOut", "(optimized away)"],
+ "root()",
+ ]
+ );
+ }
+
+ for (const target of ["rollup-babel6", "rollup-babel7"]) {
+ // This test currently bails out because Babel does not map function calls
+ // fully and includes the () of the call in the range of the identifier.
+ // this means that Rollup, has to map locations for calls to imports,
+ // it can fail. This will be addressed in Babel eventually.
+ await breakpointScopes(
+ dbg,
+ target,
+ "esmodules-es6",
+ { line: 20, column: 3 },
+ [
+ "root",
+ ["<this>", "Window"],
+ ["arguments", "Arguments"],
+
+ "Block",
+ ["aNamed", '"a-named"'],
+ ["aNamed$1", "undefined"],
+ ["aNamed2", '"a-named2"'],
+ ["aNamed3", '"a-named3"'],
+ ["original", '"an-original"'],
+ ["original$1", '"an-original2"'],
+ ["original$2", '"an-original3"'],
+
+ runtimeFunctionName(target, "esmodules-es6"),
+ ["aDefault", '"a-default"'],
+ ["aDefault2", '"a-default2"'],
+ ["aDefault3", '"a-default3"'],
+
+ ["aNamespace", "{\u2026}"],
+ ["arguments", "(unavailable)"],
+ ["mod4", "(optimized away)"],
+ "root()",
+ ]
+ );
+ }
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-sourcemapped-stepping.js b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemapped-stepping.js
new file mode 100644
index 0000000000..99d0dde458
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemapped-stepping.js
@@ -0,0 +1,158 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+// Tests for stepping through Babel's compile output.
+requestLongerTimeout(4);
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-sourcemapped.html");
+
+ await testStepOverForOf(dbg);
+ await testStepOverForOfArray(dbg);
+ await testStepOveForOfClosure(dbg);
+ await testStepOverForOfArrayClosure(dbg);
+ await testStepOverFunctionParams(dbg);
+ await testStepOverRegeneratorAwait(dbg);
+});
+
+async function breakpointSteps(dbg, target, fixture, { line, column }, steps) {
+ const filename = `${target}://./${fixture}/input.`;
+ const fnName = `${target}-${fixture}`.replace(/-([a-z])/g, (s, c) =>
+ c.toUpperCase()
+ );
+
+ await invokeWithBreakpoint(
+ dbg,
+ fnName,
+ filename,
+ { line, column },
+ async source => {
+ await runSteps(dbg, source, steps);
+ }
+ );
+
+ ok(true, `Ran tests for ${fixture} at line ${line} column ${column}`);
+}
+
+async function runSteps(dbg, source, steps) {
+ for (const [i, [type, position]] of steps.entries()) {
+ info(`Step ${i}`);
+ switch (type) {
+ case "stepOver":
+ await stepOver(dbg);
+ break;
+ case "stepIn":
+ await stepIn(dbg);
+ break;
+ default:
+ throw new Error("Unknown stepping type");
+ }
+
+ assertPausedAtSourceAndLine(dbg, source.id, position.line, position.column);
+ }
+}
+
+function testStepOverForOf(dbg) {
+ return breakpointSteps(
+ dbg,
+ "webpack3-babel6",
+ "step-over-for-of",
+ { line: 4, column: 2 },
+ [
+ ["stepOver", { line: 6, column: 20 }],
+ ["stepOver", { line: 6, column: 2 }],
+ ["stepOver", { line: 7, column: 4 }],
+ ["stepOver", { line: 6, column: 2 }],
+ ["stepOver", { line: 7, column: 4 }],
+ ["stepOver", { line: 6, column: 2 }],
+ ["stepOver", { line: 10, column: 2 }],
+ ]
+ );
+}
+
+// This codifies the current behavior, but stepping twice over the for
+// header isn't ideal.
+function testStepOverForOfArray(dbg) {
+ return breakpointSteps(
+ dbg,
+ "webpack3-babel6",
+ "step-over-for-of-array",
+ { line: 3, column: 2 },
+ [
+ ["stepOver", { line: 5, column: 2 }],
+ ["stepOver", { line: 5, column: 13 }],
+ ["stepOver", { line: 6, column: 4 }],
+ ["stepOver", { line: 5, column: 2 }],
+ ["stepOver", { line: 5, column: 13 }],
+ ["stepOver", { line: 6, column: 4 }],
+ ["stepOver", { line: 5, column: 2 }],
+ ["stepOver", { line: 9, column: 2 }],
+ ]
+ );
+}
+
+// The closure means it isn't actually possible to step into the for body,
+// and Babel doesn't map the _loop() call, so we step past it automatically.
+function testStepOveForOfClosure(dbg) {
+ return breakpointSteps(
+ dbg,
+ "webpack3-babel6",
+ "step-over-for-of-closure",
+ { line: 6, column: 2 },
+ [
+ ["stepOver", { line: 8, column: 20 }],
+ ["stepOver", { line: 8, column: 2 }],
+ ["stepOver", { line: 12, column: 2 }],
+ ]
+ );
+}
+
+// Same as the previous, not possible to step into the body. The less
+// complicated array logic makes it possible to step into the header at least,
+// but this does end up double-visiting the for head.
+function testStepOverForOfArrayClosure(dbg) {
+ return breakpointSteps(
+ dbg,
+ "webpack3-babel6",
+ "step-over-for-of-array-closure",
+ { line: 3, column: 2 },
+ [
+ ["stepOver", { line: 5, column: 2 }],
+ ["stepOver", { line: 5, column: 13 }],
+ ["stepOver", { line: 5, column: 2 }],
+ ["stepOver", { line: 5, column: 13 }],
+ ["stepOver", { line: 5, column: 2 }],
+ ["stepOver", { line: 9, column: 2 }],
+ ]
+ );
+}
+
+function testStepOverFunctionParams(dbg) {
+ return breakpointSteps(
+ dbg,
+ "webpack3-babel6",
+ "step-over-function-params",
+ { line: 6, column: 2 },
+ [
+ ["stepOver", { line: 7, column: 2 }],
+ ["stepIn", { line: 2, column: 2 }],
+ ]
+ );
+}
+
+function testStepOverRegeneratorAwait(dbg) {
+ return breakpointSteps(
+ dbg,
+ "webpack3-babel6",
+ "step-over-regenerator-await",
+ { line: 2, column: 2 },
+ [
+ // Won't work until a fix to regenerator lands and we rebuild.
+ // https://github.com/facebook/regenerator/issues/342
+ // ["stepOver", { line: 4, column: 2 }],
+ ]
+ );
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-sourcemapped-toggle.js b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemapped-toggle.js
new file mode 100644
index 0000000000..02a91961b6
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemapped-toggle.js
@@ -0,0 +1,73 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+// Tests for preview through Babel's compile output.
+requestLongerTimeout(5);
+
+// Test pausing with mapScopes enabled and disabled
+add_task(async function () {
+ await pushPref("devtools.debugger.map-scopes-enabled", true);
+ const dbg = await initDebugger("doc-sourcemapped.html");
+
+ info("1. Pause on line 20");
+ const url = "webpack3-babel6://./esmodules-cjs/input.js";
+ await waitForSources(dbg, url);
+
+ const source = findSource(dbg, url);
+ await selectSource(dbg, source);
+ await addBreakpoint(dbg, source, 20, 3);
+
+ invokeInTab("webpack3Babel6EsmodulesCjs");
+ await waitForPaused(dbg);
+
+ Assert.notEqual(getOriginalScope(dbg), null, "Scopes are now mapped");
+
+ ok(!findFooterNotificationMessage(dbg), "No footer notification message");
+ await assertPreviewTextValue(dbg, 20, 20, {
+ result: '"a-default"',
+ expression: "aDefault",
+ });
+
+ info("3. Disable original variable mapping");
+ await toggleMapScopes(dbg);
+
+ const notificationMessage = DEBUGGER_L10N.getFormatStr(
+ "editorNotificationFooter.noOriginalScopes",
+ DEBUGGER_L10N.getStr("scopes.showOriginalScopes")
+ );
+
+ info(
+ "Assert that previews are disabled and the footer notification is visible"
+ );
+ await hoverAtPos(dbg, { line: 20, column: 17 });
+ await assertNoTooltip(dbg);
+ is(
+ findFooterNotificationMessage(dbg),
+ notificationMessage,
+ "The Original variable mapping warning is displayed"
+ );
+
+ info("4. StepOver with mapScopes disabled");
+ await stepOver(dbg, { shouldWaitForLoadedScopes: false });
+
+ info(
+ "Assert that previews are still disabled and the footer notification is visible"
+ );
+ await hoverAtPos(dbg, { line: 20, column: 17 });
+ await assertNoTooltip(dbg);
+
+ is(
+ findFooterNotificationMessage(dbg),
+ notificationMessage,
+ "The Original variable mapping warning is displayed"
+ );
+});
+
+function getOriginalScope(dbg) {
+ return dbg.selectors.getSelectedOriginalScope(
+ dbg.selectors.getCurrentThread()
+ );
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-bogus.js b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-bogus.js
new file mode 100644
index 0000000000..e9e3a3c7f2
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-bogus.js
@@ -0,0 +1,91 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test that errors while loading sourcemap does not break debugging.
+
+"use strict";
+
+requestLongerTimeout(2);
+
+add_task(async function () {
+ // NOTE: the CORS call makes the test run times inconsistent
+
+ // - non-existant-map.js has a reference to source map file which doesn't exists.
+ // There is no particular warning and no original file is displayed, only the generated file.
+ // - map-with-failed-original-request.js has a reference to a valid source map file,
+ // but the map doesn't inline source content and refers to a URL which fails loading.
+ // (this file is based on dom-mutation.js and related map)
+ const dbg = await initDebugger(
+ "doc-sourcemap-bogus.html",
+ "non-existant-map.js",
+ "map-with-failed-original-request.js",
+ "map-with-failed-original-request.original.js",
+ "invalid-json-map.js"
+ );
+ // Make sure there is only the expected sources and we miss some original sources.
+ is(dbg.selectors.getSourceCount(), 4, "Only 4 source exists");
+
+ await selectSource(dbg, "non-existant-map.js");
+ is(
+ findFooterNotificationMessage(dbg),
+ "Source Map Error: request failed with status 404",
+ "There is a warning about the missing source map file"
+ );
+
+ // We should still be able to set breakpoints and pause in the
+ // generated source.
+ await addBreakpoint(dbg, "non-existant-map.js", 4);
+ invokeInTab("runCode");
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "non-existant-map.js").id,
+ 4
+ );
+ await resume(dbg);
+
+ // Test a Source Map with invalid JSON
+ await selectSource(dbg, "invalid-json-map.js");
+ is(
+ findFooterNotificationMessage(dbg),
+ "Source Map Error: JSON.parse: expected property name or '}' at line 2 column 3 of the JSON data",
+ "There is a warning about the missing source map file"
+ );
+
+ // Test a Source Map with missing original text content
+ await selectSource(dbg, "map-with-failed-original-request.js");
+ ok(
+ !findElement(dbg, "editorNotificationFooter"),
+ "The source-map is valid enough to not spawn a warning message"
+ );
+ await addBreakpoint(dbg, "map-with-failed-original-request.js", 7);
+ invokeInTab("changeStyleAttribute");
+ await waitForPaused(dbg);
+
+ // As the original file can't be loaded, the generated source is automatically selected
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "map-with-failed-original-request.js").id,
+ 7
+ );
+
+ // The original file is visible in the source tree and can be selected,
+ // but its content can't be displayed
+ await selectSource(dbg, "map-with-failed-original-request.original.js");
+ const notificationMessage = DEBUGGER_L10N.getFormatStr(
+ "editorNotificationFooter.noOriginalScopes",
+ DEBUGGER_L10N.getStr("scopes.showOriginalScopes")
+ );
+ is(
+ findFooterNotificationMessage(dbg),
+ notificationMessage,
+ "There is no warning about source-map but rather one about original scopes"
+ );
+ is(
+ getCM(dbg).getValue(),
+ `Error while fetching an original source: request failed with status 404\nSource URL: ${EXAMPLE_URL}map-with-failed-original-request.original.js`
+ );
+
+ await resume(dbg);
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-breakpoints.js b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-breakpoints.js
new file mode 100644
index 0000000000..b1ae737f35
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-breakpoints.js
@@ -0,0 +1,35 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests setting breakpoints in an original file and
+// removing it in the generated file.
+
+"use strict";
+
+requestLongerTimeout(2);
+
+add_task(async function () {
+ // NOTE: the CORS call makes the test run times inconsistent
+ const dbg = await initDebugger("doc-sourcemaps.html", "entry.js");
+
+ ok(true, "Original sources exist");
+
+ await selectSource(dbg, "entry.js");
+
+ await clickGutter(dbg, 9);
+ await waitForBreakpointCount(dbg, 1);
+ await assertBreakpoint(dbg, 9);
+ assertBreakpointSnippet(dbg, 3, "output(times2(3));");
+
+ await selectSource(dbg, "bundle.js");
+ await assertBreakpoint(dbg, 55);
+ assertBreakpointSnippet(dbg, 3, "output(times2(3));");
+
+ await clickGutter(dbg, 55);
+ await waitForBreakpointCount(dbg, 0);
+ await assertNoBreakpoint(dbg, 55);
+
+ await selectSource(dbg, "entry.js");
+ await assertNoBreakpoint(dbg, 9);
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-disabled.js b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-disabled.js
new file mode 100644
index 0000000000..93440dc9e1
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-disabled.js
@@ -0,0 +1,23 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests loading and pretty printing bundles with sourcemaps disabled
+
+"use strict";
+
+requestLongerTimeout(2);
+
+add_task(async function () {
+ await pushPref("devtools.source-map.client-service.enabled", false);
+ const dbg = await initDebugger("doc-sourcemaps.html");
+
+ await waitForSources(dbg, "bundle.js");
+ const bundleSrc = findSource(dbg, "bundle.js");
+
+ info("Pretty print the bundle");
+ await selectSource(dbg, bundleSrc);
+ clickElement(dbg, "prettyPrintButton");
+ await waitForSelectedSource(dbg, "bundle.js:formatted");
+ ok(true, "everything finished");
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-ignorelist.js b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-ignorelist.js
new file mode 100644
index 0000000000..d811d85592
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-ignorelist.js
@@ -0,0 +1,75 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests that sources on the sourcemaps ignore list are ignored on debugger load
+// when the 'Ignore Known Third-party Scripts' setting is enabled.
+
+"use strict";
+
+add_task(async function () {
+ const sources = [
+ "bundle.js",
+ "original-1.js",
+ "original-2.js",
+ "original-3.js",
+ "original-4.js",
+ "original-5.js",
+ ];
+ const dbg = await initDebugger("doc-sourcemaps-ignorelist.html", ...sources);
+
+ info("Click the settings menu to ignore the third party scripts");
+ await toggleDebbuggerSettingsMenuItem(dbg, {
+ className: ".debugger-settings-menu-item-enable-sourcemap-ignore-list",
+ isChecked: false,
+ });
+ await waitForDispatch(dbg.store, "ENABLE_SOURCEMAP_IGNORELIST");
+
+ info(
+ "Reload to hit breakpoints in the original-2.js and original-3.js files"
+ );
+ const onReloaded = reload(dbg, ...sources);
+ await waitForPaused(dbg, null, { shouldWaitForLoadedScopes: false });
+
+ info("Assert paused in original-2.js as original-1.js is ignored");
+ const original2Source = findSource(dbg, "original-2.js");
+ assertPausedAtSourceAndLine(dbg, original2Source.id, 2);
+
+ await resume(dbg);
+ await waitForPaused(dbg, null, { shouldWaitForLoadedScopes: false });
+
+ info("Assert paused in original-4.js as original-3.js is ignored");
+ const original4Source = findSource(dbg, "original-4.js");
+ assertPausedAtSourceAndLine(dbg, original4Source.id, 2);
+
+ await resume(dbg);
+ await onReloaded;
+
+ info("Click the settings menu to stop ignoring the third party scripts");
+ await toggleDebbuggerSettingsMenuItem(dbg, {
+ className: ".debugger-settings-menu-item-enable-sourcemap-ignore-list",
+ isChecked: true,
+ });
+ await waitForDispatch(dbg.store, "ENABLE_SOURCEMAP_IGNORELIST");
+
+ info("Reload to hit breakpoints in all the original-[x].js files");
+ const onReloaded2 = reload(dbg, "original-1.js");
+ await waitForPaused(dbg, null, { shouldWaitForLoadedScopes: false });
+
+ info("Assert paused in original-1.js as it is no longer ignored");
+ const original1Source = findSource(dbg, "original-1.js");
+ assertPausedAtSourceAndLine(dbg, original1Source.id, 2);
+
+ const originalSources = ["original-2.js", "original-3.js", "original-4.js"];
+ for (const fileName of originalSources) {
+ await resume(dbg);
+ await waitForPaused(dbg, null, { shouldWaitForLoadedScopes: false });
+
+ const originalSource = findSource(dbg, fileName);
+ assertPausedAtSourceAndLine(dbg, originalSource.id, 2);
+ }
+ await resume(dbg);
+
+ await onReloaded2;
+ await dbg.toolbox.closeToolbox();
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-indexed.js b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-indexed.js
new file mode 100644
index 0000000000..2c39494b76
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-indexed.js
@@ -0,0 +1,51 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests loading sourcemapped sources, setting breakpoints, and
+// stepping in them.
+
+"use strict";
+
+requestLongerTimeout(2);
+
+// This source map does not have source contents, so it's fetched separately
+add_task(async function () {
+ // NOTE: the CORS call makes the test run times inconsistent
+ const dbg = await initDebugger(
+ "doc-sourcemaps-indexed.html",
+ "main.js",
+ "main.min.js"
+ );
+ const {
+ selectors: { getBreakpoint, getBreakpointCount },
+ } = dbg;
+
+ ok(true, "Original sources exist");
+ const mainSrc = findSource(dbg, "main.js");
+
+ await selectSource(dbg, mainSrc);
+
+ // Test that breakpoint is not off by a line.
+ await addBreakpoint(dbg, mainSrc, 4, 3);
+ is(getBreakpointCount(), 1, "One breakpoint exists");
+ ok(
+ getBreakpoint(createLocation({ source: mainSrc, line: 4, column: 2 })),
+ "Breakpoint has correct line"
+ );
+
+ await assertBreakpoint(dbg, 4);
+ invokeInTab("logMessage");
+
+ await waitForPausedInOriginalFileAndToggleMapScopes(dbg);
+ assertPausedAtSourceAndLine(dbg, mainSrc.id, 4, 3);
+
+ // Tests the existence of the sourcemap link in the original source.
+ ok(findElement(dbg, "mappedSourceLink"), "Sourcemap link in original source");
+ await selectSource(dbg, "main.min.js");
+
+ ok(
+ !findElement(dbg, "mappedSourceLink"),
+ "No Sourcemap link exists in generated source"
+ );
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-redirect.js b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-redirect.js
new file mode 100644
index 0000000000..afde670811
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-redirect.js
@@ -0,0 +1,54 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test the redirects on the sourceMappingURL are blocked and not followed.
+
+"use strict";
+
+const httpServer = createTestHTTPServer();
+const BASE_URL = `http://localhost:${httpServer.identity.primaryPort}`;
+
+httpServer.registerContentType("html", "text/html");
+httpServer.registerContentType("js", "application/javascript");
+
+httpServer.registerPathHandler("/index.html", (request, response) => {
+ response.setStatusLine(request.httpVersion, 200, "OK");
+ response.write(`<!doctype html>
+ <html>
+ <head>
+ <script>
+ const foo = 2;
+ console.log(foo);
+ //# sourceMappingURL=${BASE_URL}/redirect
+ </script>
+ </head>
+ </html>
+ `);
+});
+
+httpServer.registerPathHandler("/redirect", (request, response) => {
+ response.setStatusLine(request.httpVersion, 301, "Moved Permanently");
+ response.setHeader("Location", `${BASE_URL}/evil`);
+});
+
+httpServer.registerPathHandler("/evil", (request, response) => {
+ response.setStatusLine(request.httpVersion, 200, "OK");
+ response.write(
+ `{"version":3,"sources":["evil.original.js"],"names":[], "mappings": ""}`
+ );
+});
+
+add_task(async function () {
+ const dbg = await initDebuggerWithAbsoluteURL(`${BASE_URL}/index.html`);
+
+ await getDebuggerSplitConsole(dbg);
+ await hasConsoleMessage(dbg, "Source map error");
+ const { value } = await findConsoleMessage(dbg, "Source map error");
+
+ is(
+ value,
+ `Source map error: NetworkError when attempting to fetch resource.\nResource URL: ${BASE_URL}/index.html\nSource Map URL: ${BASE_URL}/redirect[Learn More]`,
+ "A source map error message is logged indicating the redirect failed"
+ );
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-reloading-quickly.js b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-reloading-quickly.js
new file mode 100644
index 0000000000..ed2a3ceeac
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-reloading-quickly.js
@@ -0,0 +1,28 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/*
+ * Test reloading an original file while the sourcemap is loading.
+ * The test passes when the selected source is visible after two reloads.
+ */
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-sourcemaps.html");
+
+ await waitForSources(dbg, "entry.js");
+ await selectSource(dbg, "entry.js");
+
+ await reload(dbg);
+ await waitForSources(dbg, "bundle.js");
+
+ await reload(dbg);
+ await waitForLoadedSource(dbg, "entry.js");
+
+ ok(
+ getCM(dbg).getValue().includes("window.keepMeAlive"),
+ "Original source text loaded correctly"
+ );
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-reloading.js b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-reloading.js
new file mode 100644
index 0000000000..c10273baaf
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps-reloading.js
@@ -0,0 +1,61 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+requestLongerTimeout(2);
+
+add_task(async function () {
+ // NOTE: the CORS call makes the test run times inconsistent
+ const dbg = await initDebugger("doc-sourcemaps.html");
+ const {
+ selectors: { getBreakpoint, getBreakpointCount },
+ } = dbg;
+
+ await waitForSources(dbg, "entry.js", "output.js", "times2.js", "opts.js");
+ ok(true, "Original sources exist");
+ const entrySrc = findSource(dbg, "entry.js");
+
+ await selectSource(dbg, entrySrc);
+ ok(
+ getCM(dbg).getValue().includes("window.keepMeAlive"),
+ "Original source text loaded correctly"
+ );
+
+ await addBreakpoint(dbg, entrySrc, 5);
+ await addBreakpoint(dbg, entrySrc, 15, 1);
+ await disableBreakpoint(dbg, entrySrc, 15, 1);
+
+ // Test reloading the debugger
+ const onReloaded = reload(dbg, "opts.js");
+ await waitForDispatch(dbg.store, "LOAD_ORIGINAL_SOURCE_TEXT");
+
+ await waitForPausedInOriginalFileAndToggleMapScopes(dbg, "entry.js");
+ assertPausedAtSourceAndLine(dbg, findSource(dbg, "entry.js").id, 5);
+
+ await waitForBreakpointCount(dbg, 2);
+ is(getBreakpointCount(), 2, "Two breakpoints exist");
+
+ const bp = getBreakpoint(
+ createLocation({
+ source: entrySrc,
+ line: 15,
+ column: 0,
+ })
+ );
+ ok(bp, "Breakpoint is on the correct line");
+ ok(bp.disabled, "Breakpoint is disabled");
+ await assertBreakpoint(dbg, 15);
+
+ await resume(dbg);
+ info("Wait for reload to complete after resume");
+ await onReloaded;
+});
+
+async function waitForBreakpointCount(dbg, count) {
+ return waitForState(
+ dbg,
+ state => dbg.selectors.getBreakpointCount() === count
+ );
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps.js b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps.js
new file mode 100644
index 0000000000..7ed70b3310
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps.js
@@ -0,0 +1,147 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests loading sourcemapped sources, setting breakpoints, and
+// stepping in them.
+
+"use strict";
+
+requestLongerTimeout(2);
+
+add_task(async function () {
+ // NOTE: the CORS call makes the test run times inconsistent
+ const dbg = await initDebugger(
+ "doc-sourcemaps.html",
+ "entry.js",
+ "output.js",
+ "times2.js",
+ "opts.js"
+ );
+ const {
+ selectors: { getBreakpointCount },
+ } = dbg;
+
+ // Check that the original sources appear in the source tree
+ info("Before opening the page directory, no source are displayed");
+ await waitForSourcesInSourceTree(dbg, [], { noExpand: true });
+ await clickElement(dbg, "sourceDirectoryLabel", 4);
+ info(
+ "After opening the page directory, only all original sources (entry, output, time2, opts). (bundle is still hidden)"
+ );
+ await waitForSourcesInSourceTree(
+ dbg,
+ ["entry.js", "output.js", "times2.js", "opts.js"],
+ { noExpand: true }
+ );
+ info("Expand the page folder and assert that the bundle appears");
+ await clickElement(dbg, "sourceDirectoryLabel", 3);
+ await clickElement(dbg, "sourceDirectoryLabel", 4);
+ await waitForSourcesInSourceTree(
+ dbg,
+ ["entry.js", "output.js", "times2.js", "opts.js", "bundle.js"],
+ { noExpand: true }
+ );
+
+ const bundleSrc = findSource(dbg, "bundle.js");
+ await selectSource(dbg, bundleSrc);
+
+ await clickGutter(dbg, 70);
+ await waitForBreakpointCount(dbg, 1);
+ await assertBreakpoint(dbg, 70);
+
+ await clickGutter(dbg, 70);
+ await waitForBreakpointCount(dbg, 0);
+
+ const entrySrc = findSource(dbg, "entry.js");
+
+ await selectSource(dbg, entrySrc);
+ ok(
+ getCM(dbg).getValue().includes("window.keepMeAlive"),
+ "Original source text loaded correctly"
+ );
+
+ // Bug 1824375 - pending location shouldn't be location and include only url, line and column attributes
+ let pendingSelectedLocation = Services.prefs.getStringPref(
+ "devtools.debugger.pending-selected-location"
+ );
+ is(
+ pendingSelectedLocation,
+ JSON.stringify({ url: entrySrc.url, line: 0, column: undefined }),
+ "Pending selected location is the expected one"
+ );
+
+ // Test breaking on a breakpoint
+ await addBreakpoint(dbg, "entry.js", 15);
+ is(getBreakpointCount(), 1, "One breakpoint exists");
+ assertBreakpointExists(dbg, entrySrc, 15);
+
+ invokeInTab("keepMeAlive");
+ await waitForPausedInOriginalFileAndToggleMapScopes(dbg);
+ assertPausedAtSourceAndLine(dbg, entrySrc.id, 15);
+
+ await stepIn(dbg);
+ assertPausedAtSourceAndLine(dbg, findSource(dbg, "times2.js").id, 2);
+
+ await stepOver(dbg);
+ assertPausedAtSourceAndLine(dbg, findSource(dbg, "times2.js").id, 3);
+
+ await stepOut(dbg);
+ assertPausedAtSourceAndLine(dbg, entrySrc.id, 16);
+
+ pendingSelectedLocation = Services.prefs.getStringPref(
+ "devtools.debugger.pending-selected-location"
+ );
+ is(
+ pendingSelectedLocation,
+ JSON.stringify({ url: entrySrc.url, line: 16, column: 0 }),
+ "Pending selected location is the expected one"
+ );
+
+ info("Click on jump to generated source link from editor's footer");
+ let mappedSourceLink = findElement(dbg, "mappedSourceLink");
+ is(
+ mappedSourceLink.textContent,
+ "To bundle.js",
+ "The link to mapped source mentions the bundle"
+ );
+ mappedSourceLink.click();
+
+ await waitForSelectedSource(dbg, bundleSrc);
+ assertPausedAtSourceAndLine(dbg, bundleSrc.id, 62);
+ // The mapped source link is computed asynchronously when we are on the bundle
+ mappedSourceLink = await waitFor(() => findElement(dbg, "mappedSourceLink"));
+ mappedSourceLink = findElement(dbg, "mappedSourceLink");
+ is(
+ mappedSourceLink.textContent,
+ "From entry.js",
+ "The link to mapped source mentions the original source"
+ );
+
+ info("Move the cursor within the bundle to another original source");
+ getCM(dbg).setCursor({ line: 70, ch: 0 });
+ mappedSourceLink = await waitFor(() => findElement(dbg, "mappedSourceLink"));
+ is(
+ mappedSourceLink.textContent,
+ "From times2.js",
+ "The link to mapped source updates to the newly selected original source within the bundle"
+ );
+});
+
+function assertBreakpointExists(dbg, source, line) {
+ const {
+ selectors: { getBreakpoint },
+ } = dbg;
+
+ ok(
+ getBreakpoint(createLocation({ source, line })),
+ "Breakpoint has correct line"
+ );
+}
+
+async function waitForBreakpointCount(dbg, count) {
+ const {
+ selectors: { getBreakpointCount },
+ } = dbg;
+ await waitForState(dbg, state => getBreakpointCount() == count);
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps2.js b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps2.js
new file mode 100644
index 0000000000..aaad44b1e8
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps2.js
@@ -0,0 +1,60 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests loading sourcemapped sources, setting breakpoints, and
+// stepping in them.
+
+"use strict";
+
+requestLongerTimeout(2);
+
+// This source map does not have source contents, so it's fetched separately
+add_task(async function () {
+ // NOTE: the CORS call makes the test run times inconsistent
+ const dbg = await initDebugger(
+ "doc-sourcemaps2.html",
+ "main.js",
+ "main.min.js"
+ );
+ const {
+ selectors: { getBreakpoint, getBreakpointCount },
+ } = dbg;
+
+ ok(true, "Original sources exist");
+ const mainSrc = findSource(dbg, "main.js");
+
+ await selectSource(dbg, mainSrc);
+
+ // Test that breakpoint is not off by a line.
+ await addBreakpoint(dbg, mainSrc, 4, 3);
+ is(getBreakpointCount(), 1, "One breakpoint exists");
+ ok(
+ getBreakpoint(createLocation({ source: mainSrc, line: 4, column: 2 })),
+ "Breakpoint has correct line"
+ );
+
+ await assertBreakpoint(dbg, 4);
+ invokeInTab("logMessage");
+
+ await waitForPausedInOriginalFileAndToggleMapScopes(dbg);
+ assertPausedAtSourceAndLine(dbg, mainSrc.id, 4);
+
+ // Tests the existence of the sourcemap link in the original source.
+ let sourceMapLink = findElement(dbg, "mappedSourceLink");
+ is(
+ sourceMapLink.textContent,
+ "To main.min.js",
+ "Sourcemap link in original source refers to the bundle"
+ );
+
+ await selectSource(dbg, "main.min.js");
+
+ // The mapped source link is computed asynchronously when we are on the bundle
+ sourceMapLink = await waitFor(() => findElement(dbg, "mappedSourceLink"));
+ is(
+ sourceMapLink.textContent,
+ "From main.js",
+ "Sourcemap link in bundle refers to the original source"
+ );
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps3.js b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps3.js
new file mode 100644
index 0000000000..86ab35129a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-sourcemaps3.js
@@ -0,0 +1,94 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+// Tests loading sourcemapped sources, setting breakpoints, and
+// inspecting restored scopes.
+requestLongerTimeout(2);
+
+// This source map does not have source contents, so it's fetched separately
+add_task(async function () {
+ await pushPref("devtools.debugger.map-scopes-enabled", true);
+ // NOTE: the CORS call makes the test run times inconsistent
+ const dbg = await initDebugger(
+ "doc-sourcemaps3.html",
+ "bundle.js",
+ "sorted.js",
+ "test.js"
+ );
+
+ ok(true, "Original sources exist");
+ const sortedSrc = findSource(dbg, "sorted.js");
+
+ await selectSource(dbg, sortedSrc);
+
+ // Test that breakpoint is not off by a line.
+ await addBreakpoint(dbg, sortedSrc, 9, 5);
+ is(dbg.selectors.getBreakpointCount(), 1, "One breakpoint exists");
+ ok(
+ dbg.selectors.getBreakpoint(
+ createLocation({ source: sortedSrc, line: 9, column: 4 })
+ ),
+ "Breakpoint has correct line"
+ );
+
+ invokeInTab("test");
+
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, sortedSrc.id, 9, 5);
+
+ is(getScopeNodeLabel(dbg, 1), "Block");
+ is(getScopeNodeLabel(dbg, 2), "na");
+ is(getScopeNodeLabel(dbg, 3), "nb");
+
+ is(getScopeNodeLabel(dbg, 4), "Function Body");
+
+ await toggleScopeNode(dbg, 4);
+
+ is(getScopeNodeLabel(dbg, 5), "ma");
+ is(getScopeNodeLabel(dbg, 6), "mb");
+
+ await toggleScopeNode(dbg, 7);
+
+ is(getScopeNodeLabel(dbg, 8), "a");
+ is(getScopeNodeLabel(dbg, 9), "b");
+
+ is(getScopeNodeLabel(dbg, 10), "Module");
+
+ await toggleScopeNode(dbg, 10);
+
+ is(getScopeNodeLabel(dbg, 11), "binaryLookup:o(n, e, r)");
+ is(getScopeNodeLabel(dbg, 12), "comparer:t(n, e)");
+ is(getScopeNodeLabel(dbg, 13), "fancySort");
+
+ const frameLabels = [
+ ...findAllElementsWithSelector(dbg, ".pane.frames .frame .title"),
+ ].map(el => el.textContent);
+ // The frame display named are mapped to the original source.
+ // For example "fancySort" method is named "u" in the generated source.
+ Assert.deepEqual(frameLabels, [
+ "comparer",
+ "binaryLookup",
+ "fancySort",
+ "fancySort",
+ "originalTestName",
+ ]);
+
+ info(
+ "Verify that original function names are displayed in frames on source selection"
+ );
+ await selectSource(dbg, "test.js");
+
+ const frameLabelsAfterUpdate = [
+ ...findAllElementsWithSelector(dbg, ".pane.frames .frame .title"),
+ ].map(el => el.textContent);
+ Assert.deepEqual(frameLabelsAfterUpdate, [
+ "comparer",
+ "binaryLookup",
+ "fancySort",
+ "fancySort",
+ "originalTestName", // <== this frame was updated
+ ]);
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-sources-project-search.js b/devtools/client/debugger/test/mochitest/browser_dbg-sources-project-search.js
new file mode 100644
index 0000000000..94cfedfe30
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-sources-project-search.js
@@ -0,0 +1,134 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Testing project search for various types of sources scenarios
+
+"use strict";
+
+requestLongerTimeout(3);
+
+// Tests for searching in dynamic (without urls) sources
+add_task(async function testSearchDynamicScripts() {
+ const dbg = await initDebugger("doc-minified.html");
+
+ const executeComplete = dbg.commands.scriptCommand.execute(
+ `const foo = 5; debugger; console.log(foo)`
+ );
+ await waitForPaused(dbg);
+
+ await openProjectSearch(dbg);
+ const fileResults = await doProjectSearch(dbg, "foo", 1);
+ ok(
+ /source\d+/g.test(fileResults[0].innerText),
+ "The search result was found in the eval script."
+ );
+
+ await resume(dbg);
+ await executeComplete;
+});
+
+// Tests that minified sources are ignored when the prettyfied versions
+// exist.
+add_task(async function testIgnoreMinifiedSourceForPrettySource() {
+ const dbg = await initDebugger("doc-pretty.html", "pretty.js");
+
+ await openProjectSearch(dbg);
+ let fileResults = await doProjectSearch(dbg, "stuff", 1);
+
+ is(fileResults.length, 1, "Only the result was found");
+ ok(
+ fileResults[0].innerText.includes("pretty.js\n(1 match)"),
+ "The search result was found in the minified (pretty.js) source"
+ );
+
+ await selectSource(dbg, "pretty.js");
+ await waitForSelectedSource(dbg, "pretty.js");
+
+ info("Pretty print the source");
+ await prettyPrint(dbg);
+
+ fileResults = await doProjectSearch(dbg, "stuff", 2);
+
+ is(
+ fileResults.length,
+ 2,
+ "Two results were found form both the pretty and minified sources"
+ );
+ ok(
+ fileResults[0].innerText.includes("pretty.js:formatted\n(1 match)"),
+ "The first search result was found in the prettyified (pretty.js:formatted) source"
+ );
+
+ ok(
+ fileResults[1].innerText.includes("pretty.js\n(1 match)"),
+ "The second search result was found in the minified (pretty.js) source"
+ );
+});
+
+// Test the prioritization of files. Original files should be prioritized over
+// generated files and third-party files should be deprioritized and load after the others.
+add_task(async function testFilesPrioritization() {
+ const dbg = await initDebugger("doc-react.html", "App.js");
+
+ await openProjectSearch(dbg);
+ const fileResults = await doProjectSearch(dbg, "componentDidMount", 3);
+
+ is(getExpandedResultsCount(dbg), 13);
+
+ ok(
+ fileResults[0].innerText.includes(
+ "browser/devtools/client/debugger/test/mochitest/examples/react/build/App.js"
+ ),
+ "The first item should be the original (prettified) file"
+ );
+
+ ok(
+ findAllElements(dbg, "projectSearchExpandedResults")[0].innerText.endsWith(
+ "componentDidMount() {"
+ ),
+ "The first result match in the original file is correct"
+ );
+
+ const firstNodeModulesResultFound = [...fileResults].findIndex(el =>
+ el.innerText.includes("node_modules")
+ );
+ is(
+ firstNodeModulesResultFound,
+ 2,
+ "The node_modules (third-party) file is the last result in the list"
+ );
+});
+
+add_task(async function testBlackBoxedSources() {
+ const dbg = await initDebugger("doc-pretty.html", "pretty.js");
+ await selectSource(dbg, "pretty.js");
+
+ info("Blackbox pretty.js");
+ await toggleBlackbox(dbg);
+
+ await openProjectSearch(dbg);
+ let fileResults = await doProjectSearch(dbg, "stuff", 0);
+
+ is(fileResults.length, 0, "No results were found as pretty.js is blackboxed");
+
+ info("Unblackbox pretty.js");
+ await toggleBlackbox(dbg);
+
+ await openProjectSearch(dbg);
+ fileResults = await doProjectSearch(dbg, "stuff", 1);
+
+ is(
+ fileResults.length,
+ 1,
+ "One result was found as pretty.js is no longer blackboxed"
+ );
+});
+
+async function toggleBlackbox(dbg) {
+ await clickElement(dbg, "blackbox");
+ await Promise.any([
+ waitForDispatch(dbg.store, "BLACKBOX_WHOLE_SOURCES"),
+ waitForDispatch(dbg.store, "UNBLACKBOX_WHOLE_SOURCES"),
+ ]);
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-state-based-panels.js b/devtools/client/debugger/test/mochitest/browser_dbg-state-based-panels.js
new file mode 100644
index 0000000000..0dc81605c9
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-state-based-panels.js
@@ -0,0 +1,164 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+// Tests that breakpoint panels open when their relevant breakpoint is hit
+add_task(async function testBreakpointsPaneOpenOnPause() {
+ const dbg = await initDebugger("doc-sources.html", "simple1.js");
+
+ clickElementWithSelector(dbg, ".breakpoints-pane h2");
+
+ info("Confirm the breakpoints pane is closed");
+ is(getPaneElements(dbg).length, 1);
+
+ await selectSource(dbg, "simple1.js");
+ await addBreakpoint(dbg, "simple1.js", 4);
+
+ info("Trigger the breakpoint ane ensure we're paused");
+ invokeInTab("main");
+ await waitForPaused(dbg, "simple1.js");
+
+ info("Confirm the breakpoints pane is open");
+ is(getPaneElements(dbg).length, 2);
+
+ await resume(dbg);
+
+ info("Confirm the breakpoints pane is closed again");
+ is(getPaneElements(dbg).length, 1);
+});
+
+// Tests that the breakpoint pane remains closed on stepping
+add_task(async function testBreakpointsPanePersistOnStepping() {
+ const dbg = await initDebugger("doc-scripts.html", "simple3.js");
+
+ await selectSource(dbg, "simple3.js");
+ await addBreakpoint(dbg, "simple3.js", 9);
+ await waitForBreakpoint(dbg, "simple3.js", 9);
+
+ invokeInTab("nestedA");
+ await waitForPaused(dbg, "simple3.js");
+
+ is(getPaneElements(dbg).length, 2, "Breakpoints pane is open");
+
+ info("Close breakpoints pane");
+
+ clickElementWithSelector(dbg, ".breakpoints-pane h2");
+
+ is(getPaneElements(dbg).length, 1, "Breakpoint pane is closed");
+
+ info("Step into nestedB");
+
+ await stepIn(dbg);
+
+ ok(isFrameSelected(dbg, 1, "nestedB"), "nestedB frame is selected");
+
+ is(getPaneElements(dbg).length, 1, "Breakpoints pane is still closed");
+});
+
+// Tests that the breakpoint pane remains closed on call-stack frame selection
+add_task(async function testBreakpointsPanePersistOnFrameSelection() {
+ const dbg = await initDebugger("doc-scripts.html", "simple3.js");
+
+ info("Close breakpoints pane");
+
+ clickElementWithSelector(dbg, ".breakpoints-pane h2");
+
+ is(getPaneElements(dbg).length, 1, "Breakpoint pane is closed");
+
+ await selectSource(dbg, "simple3.js");
+ await addBreakpoint(dbg, "simple3.js", 13);
+ await waitForBreakpoint(dbg, "simple3.js", 13);
+
+ invokeInTab("nestedA");
+ await waitForPaused(dbg, "simple3.js");
+
+ is(getPaneElements(dbg).length, 2, "Breakpoints pane is open");
+
+ info("Close breakpoints pane");
+
+ clickElementWithSelector(dbg, ".breakpoints-pane h2");
+
+ is(getPaneElements(dbg).length, 1, "Breakpoint pane is closed");
+
+ is(getFrameList(dbg).length, 2, "Call stack has two frames");
+
+ info("Click on second call stack frame");
+
+ await clickElement(dbg, "frame", 2);
+
+ ok(isFrameSelected(dbg, 2, "nestedA"), "Second frame is selected");
+
+ is(getPaneElements(dbg).length, 1, "Breakpoint pane is still closed");
+});
+
+// Tests that the breakpoint pane persists when toggled during pause
+add_task(async function testBreakpointsPanePersistOnPauseToggle() {
+ const dbg = await initDebugger("doc-scripts.html", "simple3.js");
+
+ await selectSource(dbg, "simple3.js");
+ await addBreakpoint(dbg, "simple3.js", 9);
+ await waitForBreakpoint(dbg, "simple3.js", 9);
+
+ info("Close breakpoint pane");
+
+ clickElementWithSelector(dbg, ".breakpoints-pane h2");
+
+ is(getPaneElements(dbg).length, 1, "Breakpoint pane is closed");
+
+ info("Trigger breakpoint");
+
+ invokeInTab("nestedA");
+ await waitForPaused(dbg, "simple3.js");
+
+ is(getPaneElements(dbg).length, 2, "Breakpoints pane is open");
+
+ info("Close breakpoint pane and reopen it");
+
+ clickElementWithSelector(dbg, ".breakpoints-pane h2");
+
+ is(getPaneElements(dbg).length, 1, "Breakpoints pane is closed");
+
+ clickElementWithSelector(dbg, ".breakpoints-pane h2");
+
+ is(getPaneElements(dbg).length, 2, "Breakpoints pane is open");
+
+ await resume(dbg);
+
+ is(getPaneElements(dbg).length, 2, "Breakpoints pane is still open");
+});
+
+// Tests that the breakpoint pane remains closed when event breakpoints log is toggled
+add_task(async function testBreakpointsPanePersistOnPauseToggle() {
+ const dbg = await initDebugger("doc-scripts.html", "simple3.js");
+
+ await selectSource(dbg, "simple3.js");
+ await addBreakpoint(dbg, "simple3.js", 9);
+ await waitForBreakpoint(dbg, "simple3.js", 9);
+
+ info("Trigger breakpoint");
+
+ invokeInTab("nestedA");
+ await waitForPaused(dbg, "simple3.js");
+
+ info("Close breakpoint pane");
+
+ clickElementWithSelector(dbg, ".breakpoints-pane h2");
+
+ is(getPaneElements(dbg).length, 1, "Breakpoint pane is closed");
+
+ info("Check event listener breakpoints log box");
+
+ await clickElement(dbg, "logEventsCheckbox");
+
+ is(getPaneElements(dbg).length, 1, "Breakpoint pane is still closed");
+});
+
+function getPaneElements(dbg) {
+ return findElementWithSelector(dbg, ".breakpoints-pane").childNodes;
+}
+
+function getFrameList(dbg) {
+ return dbg.win.document.querySelectorAll(".call-stack-pane .frame");
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-step-in-navigate.js b/devtools/client/debugger/test/mochitest/browser_dbg-step-in-navigate.js
new file mode 100644
index 0000000000..53d66c6f12
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-step-in-navigate.js
@@ -0,0 +1,34 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests that Step In is cancelled when navigating to another page
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-scripts.html", "simple3.js", "long.js");
+
+ // With the debugger stopped at a breakpoint, blackbox the current source and step in
+ await selectSource(dbg, "simple3.js");
+ await addBreakpoint(dbg, "simple3.js", 5);
+ invokeInTab("simple");
+ await waitForPaused(dbg, "simple3");
+
+ await clickElement(dbg, "blackbox");
+ await waitForDispatch(dbg.store, "BLACKBOX_WHOLE_SOURCES");
+ await dbg.actions.stepIn();
+
+ // We should stop at this breakpoint, rather than the first executed script
+ await selectSource(dbg, "long.js");
+ await addBreakpoint(dbg, "long.js", 1);
+
+ // Navigation should clear the stepping state
+ const reloaded = reload(dbg);
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, findSource(dbg, "long.js").id, 1);
+
+ await resume(dbg);
+ await reloaded;
+ await waitForSource(dbg, "simple3.js");
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-step-in-uninitialized.js b/devtools/client/debugger/test/mochitest/browser_dbg-step-in-uninitialized.js
new file mode 100644
index 0000000000..3f135dde68
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-step-in-uninitialized.js
@@ -0,0 +1,47 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// When stepping into a function, 'let' variables should show as uninitialized
+// instead of undefined.
+
+"use strict";
+
+add_task(async function test() {
+ const dbg = await initDebugger("doc-step-in-uninitialized.html");
+ invokeInTab("main");
+ await waitForPaused(dbg, "doc-step-in-uninitialized.html");
+
+ await stepOver(dbg);
+ await stepIn(dbg);
+
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "doc-step-in-uninitialized.html").id,
+ 8
+ );
+
+ // We step past the 'let x' at the start of the function because it is not
+ // a breakpoint position.
+ Assert.equal(findNodeValue(dbg, "x"), "undefined", "x undefined");
+ Assert.equal(findNodeValue(dbg, "y"), "(uninitialized)", "y uninitialized");
+
+ await stepOver(dbg);
+
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "doc-step-in-uninitialized.html").id,
+ 9
+ );
+
+ Assert.equal(findNodeValue(dbg, "y"), "3", "y initialized");
+});
+
+function findNodeValue(dbg, text) {
+ for (let index = 0; ; index++) {
+ const elem = findElement(dbg, "scopeNode", index);
+ if (elem?.innerText == text) {
+ return getScopeNodeValue(dbg, index);
+ }
+ }
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-stepping.js b/devtools/client/debugger/test/mochitest/browser_dbg-stepping.js
new file mode 100644
index 0000000000..5935c7c3af
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-stepping.js
@@ -0,0 +1,48 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+// This test can be really slow on debug platforms
+requestLongerTimeout(5);
+
+add_task(async function test() {
+ await pushPref("devtools.debugger.map-scopes-enabled", true);
+ const dbg = await initDebugger(
+ "big-sourcemap.html",
+ "bundle.js",
+ "step-in-test.js"
+ );
+ invokeInTab("hitDebugStatement");
+ // Bug 1829860 - The sourcemap for this file is broken and we couldn't resolve the paused location
+ // to the related original file. The debugger fallbacks to the generated source,
+ // but that highlights a bug in the example page.
+ await waitForPaused(dbg, "bundle.js");
+ assertPausedAtSourceAndLine(dbg, findSource(dbg, "bundle.js").id, 52411);
+
+ await stepIn(dbg);
+
+ const whyPaused = await waitFor(
+ () => dbg.win.document.querySelector(".why-paused")?.innerText
+ );
+ is(whyPaused, `Paused while stepping`);
+
+ await stepIn(dbg);
+ await stepIn(dbg);
+ await stepIn(dbg);
+ await stepIn(dbg);
+ await stepIn(dbg);
+ await stepIn(dbg);
+ await stepIn(dbg);
+ await stepIn(dbg);
+ await stepIn(dbg);
+ await stepIn(dbg);
+ await stepIn(dbg);
+ await stepIn(dbg);
+ await stepIn(dbg);
+
+ // Note that we are asserting against an original source here,
+ // See earlier comment about paused in bundle.js
+ assertPausedAtSourceAndLine(dbg, findSource(dbg, "step-in-test.js").id, 7679);
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-tabs-keyboard.js b/devtools/client/debugger/test/mochitest/browser_dbg-tabs-keyboard.js
new file mode 100644
index 0000000000..96db07e2b5
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-tabs-keyboard.js
@@ -0,0 +1,29 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests removing tabs with keyboard shortcuts
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger(
+ "doc-scripts.html",
+ "simple1.js",
+ "simple2.js"
+ );
+
+ await selectSource(dbg, "simple1.js");
+ await selectSource(dbg, "simple2.js");
+ is(countTabs(dbg), 2, "Two tabs are open");
+
+ pressKey(dbg, "close");
+ waitForDispatch(dbg.store, "CLOSE_TABS");
+ is(countTabs(dbg), 1, "One tab is open");
+
+ await waitForSelectedSource(dbg, "simple1.js");
+
+ pressKey(dbg, "close");
+ waitForDispatch(dbg.store, "CLOSE_TABS");
+ is(countTabs(dbg), 0, "No tabs open");
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-tabs-pretty-print.js b/devtools/client/debugger/test/mochitest/browser_dbg-tabs-pretty-print.js
new file mode 100644
index 0000000000..939c54ab03
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-tabs-pretty-print.js
@@ -0,0 +1,46 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests re-opening pretty printed tabs on load
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-minified.html", "math.min.js");
+
+ await selectSource(dbg, "math.min.js");
+ clickElement(dbg, "prettyPrintButton");
+ await waitForSource(dbg, "math.min.js:formatted");
+
+ await waitFor(() => findElement(dbg, "sourceTabs").children.length == 2);
+ const [prettyTab, originalTab] = findElement(dbg, "sourceTabs").children;
+ ok(
+ prettyTab.querySelector(".source-icon.img.prettyPrint"),
+ "Pretty printed tab has the pretty-print icon"
+ );
+ ok(
+ !originalTab.querySelector(".source-icon.img.prettyPrint"),
+ "original tab does not have the pretty-print icon"
+ );
+
+ // Test reloading the debugger
+ await waitForSelectedSource(dbg, "math.min.js:formatted");
+ await reload(dbg);
+
+ await waitForSelectedSource(dbg, "math.min.js:formatted");
+ ok(true, "Pretty printed source is selected on reload");
+
+ await selectSource(dbg, "math.min.js:formatted");
+ const source = findSource(dbg, "math.min.js:formatted");
+ dbg.actions.showSource(source.id);
+ const focusedTreeElement = findElementWithSelector(
+ dbg,
+ ".sources-list .focused .label"
+ );
+ is(
+ focusedTreeElement.textContent.trim(),
+ "math.min.js",
+ "Pretty printed source is selected in tree"
+ );
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-tabs-without-urls-selected.js b/devtools/client/debugger/test/mochitest/browser_dbg-tabs-without-urls-selected.js
new file mode 100644
index 0000000000..fbfef690df
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-tabs-without-urls-selected.js
@@ -0,0 +1,28 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test that URL-less sources have tabs and selecting that location does not
+// create a new tab for the same URL-less source
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger(
+ "doc-scripts.html",
+ "simple1.js",
+ "simple2.js"
+ );
+
+ // Create a URL-less source
+ invokeInTab("doEval");
+ await waitForPaused(dbg);
+
+ // Click a frame which shouldn't open a new source tab
+ await clickElement(dbg, "frame", 2);
+
+ // Click the frame to select the same location and ensure there's only 1 tab
+ is(countTabs(dbg), 1);
+
+ await resume(dbg);
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-tabs-without-urls.js b/devtools/client/debugger/test/mochitest/browser_dbg-tabs-without-urls.js
new file mode 100644
index 0000000000..f6e223a657
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-tabs-without-urls.js
@@ -0,0 +1,46 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test that URL-less sources have tabs added to the UI, are named correctly
+// and do not persist upon reload
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger(
+ "doc-scripts.html",
+ "simple1.js",
+ "simple2.js"
+ );
+
+ await selectSource(dbg, "simple1.js");
+ is(countTabs(dbg), 1, "Only the `simple.js` source tab exists");
+
+ invokeInTab("doEval");
+ await waitForPaused(dbg);
+
+ is(countTabs(dbg), 2, "The new eval tab is now added");
+
+ info("Assert that the eval source the tab source name correctly");
+ ok(
+ /source\d+/g.test(getTabContent(dbg, 0)),
+ "The tab name pattern is correct"
+ );
+
+ await resume(dbg);
+
+ // Test reloading the debugger
+ await reload(dbg, "simple1.js", "simple2.js");
+ is(countTabs(dbg), 1, "The eval source tab is no longer available");
+});
+
+/*
+ * Get the tab content for the specific tab
+ *
+ * @param {Number} index - index of the tab to get the source content
+ */
+function getTabContent(dbg, index) {
+ const tabs = findElement(dbg, "sourceTabs").children;
+ return tabs[index]?.innerText || "";
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-tabs.js b/devtools/client/debugger/test/mochitest/browser_dbg-tabs.js
new file mode 100644
index 0000000000..74d5a4afbc
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-tabs.js
@@ -0,0 +1,107 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests adding and removing tabs
+
+"use strict";
+
+add_task(async function testTabsOnReload() {
+ const dbg = await initDebugger(
+ "doc-scripts.html",
+ "simple1.js",
+ "simple2.js"
+ );
+
+ await selectSource(dbg, "simple1.js");
+ await selectSource(dbg, "simple2.js");
+ is(countTabs(dbg), 2);
+
+ info("Test reloading the debugger");
+ await reload(dbg, "simple1.js", "simple2.js");
+ await waitForSelectedSource(dbg, "simple2.js");
+ is(countTabs(dbg), 2);
+
+ info("Test reloading the debuggee a second time");
+ await reload(dbg, "simple1.js", "simple2.js");
+ await waitForSelectedSource(dbg, "simple2.js");
+ is(countTabs(dbg), 2);
+});
+
+add_task(async function testOpeningAndClosingTabs() {
+ const dbg = await initDebugger(
+ "doc-scripts.html",
+ "simple1.js",
+ "simple2.js",
+ "simple3.js"
+ );
+
+ // /!\ Tabs are opened by default on the left/beginning
+ // so that they are displayed in the other way around.
+ // To make the test clearer insert them in a way so that
+ // they are in the expected order: simple1 then simple2,...
+ await selectSource(dbg, "simple3.js");
+ await selectSource(dbg, "simple2.js");
+ await selectSource(dbg, "simple1.js");
+
+ info("Reselect simple2 so that we then close the selected tab");
+ await selectSource(dbg, "simple2.js");
+ await closeTab(dbg, "simple2.js");
+ is(countTabs(dbg), 2);
+ info("Removing the tab in the middle should select the following one");
+ await waitForSelectedSource(dbg, "simple3.js");
+
+ await closeTab(dbg, "simple3.js");
+ is(countTabs(dbg), 1);
+ info("Removing the last tab should select the first tab before");
+ await waitForSelectedSource(dbg, "simple1.js");
+
+ info("Re-open a second tab so that we can cover closing the first tab");
+ await selectSource(dbg, "simple2.js");
+ is(countTabs(dbg), 2);
+ await closeTab(dbg, "simple1.js");
+ info("Removing the first tab should select the first tab after");
+ is(countTabs(dbg), 1);
+ await waitForSelectedSource(dbg, "simple2.js");
+
+ info("Close the last tab");
+ await closeTab(dbg, "simple2.js");
+ is(countTabs(dbg), 0);
+ is(
+ dbg.selectors.getSelectedLocation(),
+ null,
+ "Selected location is cleared when closing the last tab"
+ );
+
+ info("Test reloading the debugger");
+ await reload(dbg, "simple1.js", "simple2.js", "simple3.js");
+ is(countTabs(dbg), 0);
+
+ // /!\ Tabs are opened by default on the left/beginning
+ // so that they are displayed in the other way around.
+ // To make the test clearer insert them in a way so that
+ // they are in the expected order: simple1 then simple2,...
+ await selectSource(dbg, "simple3.js");
+ await selectSource(dbg, "simple2.js");
+ await selectSource(dbg, "simple1.js");
+ is(countTabs(dbg), 3);
+
+ info("Reselect simple3 so that we then close the selected tab");
+ await selectSource(dbg, "simple3.js");
+
+ info("Removing the last tab, should select the one before");
+ await closeTab(dbg, "simple3.js");
+ is(countTabs(dbg), 2);
+ await waitForSelectedSource(dbg, "simple2.js");
+
+ info("Test the close all tabs context menu");
+ const waitForOpen = waitForContextMenu(dbg);
+ info(`Open the current active tab context menu`);
+ rightClickElement(dbg, "activeTab");
+ await waitForOpen;
+ const onCloseTabsAction = waitForDispatch(dbg.store, "CLOSE_TABS");
+ info(`Select the close all tabs context menu item`);
+ selectContextMenuItem(dbg, `#node-menu-close-all-tabs`);
+ await onCloseTabsAction;
+ is(countTabs(dbg), 0);
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-toggling-tools.js b/devtools/client/debugger/test/mochitest/browser_dbg-toggling-tools.js
new file mode 100644
index 0000000000..7e6025869c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-toggling-tools.js
@@ -0,0 +1,19 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Tests that you can switch tools, without losing your editor position
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-scripts.html", "long.js");
+
+ await selectSource(dbg, "long.js");
+ getCM(dbg).scrollTo(0, 284);
+
+ pressKey(dbg, "inspector");
+ pressKey(dbg, "debugger");
+
+ is(getCM(dbg).getScrollInfo().top, 284);
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-ua-widgets.js b/devtools/client/debugger/test/mochitest/browser_dbg-ua-widgets.js
new file mode 100644
index 0000000000..e563d52824
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-ua-widgets.js
@@ -0,0 +1,47 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test that you can debug User Agent widgets (like video controls)
+// only when enabling "devtools.inspector.showAllAnonymousContent" pref.
+
+"use strict";
+
+const TEST_URL = "data:text/html,<video controls>";
+
+add_task(async function () {
+ await pushPref("devtools.inspector.showAllAnonymousContent", false);
+ let dbg = await initDebuggerWithAbsoluteURL(TEST_URL);
+ ok(
+ !sourceExists(dbg, "videocontrols.js"),
+ "Video controls internal file is *not* visibile in the debugger when the pref is false"
+ );
+ await dbg.toolbox.closeToolbox();
+
+ info("Toggle the pref to true");
+ await pushPref("devtools.inspector.showAllAnonymousContent", true);
+
+ dbg = await initDebuggerWithAbsoluteURL(TEST_URL);
+ ok(
+ sourceExists(dbg, "videocontrols.js"),
+ "Video controls internal file *is* visibile in the debugger when the pref is true"
+ );
+
+ clickElement(dbg, "pause");
+ await waitForState(dbg, state =>
+ dbg.selectors.getIsWaitingOnBreak(dbg.selectors.getCurrentThread())
+ );
+
+ await SpecialPowers.spawn(gBrowser.selectedBrowser, [], () => {
+ EventUtils.synthesizeMouseAtCenter(
+ content.document.getElementsByTagName("video")[0],
+ { type: "mouseover" },
+ content
+ );
+ });
+
+ await waitForPaused(dbg);
+ await waitForSelectedSource(dbg, "videocontrols.js");
+
+ await dbg.toolbox.closeToolbox();
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-unselected-pause.js b/devtools/client/debugger/test/mochitest/browser_dbg-unselected-pause.js
new file mode 100644
index 0000000000..f93859eb05
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-unselected-pause.js
@@ -0,0 +1,203 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test that the debugger pauses and is automatically highlighted and selected,
+// even when it hasn't been opened.
+
+"use strict";
+
+const IFRAME_TEST_COM_URI = `https://example.com/document-builder.sjs?html=${encodeURI(
+ `<script>const a=2;\ndebugger;\nconsole.log(a);</script>`
+)}`;
+
+// Embed the example.com test page in an example.org iframe.
+const IFRAME_TEST_URI = `https://example.org/document-builder.sjs?html=${encodeURI(
+ `<script>function breakDebugger() {const b=3;\ndebugger;\nconsole.log(b);}</script><iframe src="${IFRAME_TEST_COM_URI}"></iframe><body>`
+)}`;
+
+add_task(async function () {
+ info("Test a debugger statement from the top level document");
+
+ // Make sure the toolbox opens with the webconsole initially selected.
+ const toolbox = await initPane("doc-debugger-statements.html", "webconsole");
+
+ info("Execute a debugger statement");
+ const pausedRun = SpecialPowers.spawn(
+ gBrowser.selectedBrowser,
+ [],
+ function () {
+ content.wrappedJSObject.test();
+ }
+ );
+
+ const dbg = await assertDebuggerIsHighlightedAndPaused(toolbox);
+ const source = findSource(dbg, "doc-debugger-statements.html");
+ assertPausedAtSourceAndLine(dbg, source.id, 16);
+
+ await resume(dbg);
+ info("Wait for the paused code to complete after resume");
+ await pausedRun;
+
+ ok(
+ !toolbox.isHighlighted("jsdebugger"),
+ "Debugger is no longer highlighted after resume"
+ );
+});
+
+add_task(async function () {
+ info("Test a debugger statement from an iframe");
+
+ // Make sure the toolbox opens with the webconsole initially selected.
+ const toolbox = await openNewTabAndToolbox(IFRAME_TEST_URI, "webconsole");
+
+ info(
+ "Reload the test page, which will trigger the debugger statement in the iframe"
+ );
+ const pausedReload = reloadBrowser();
+
+ const dbg = await assertDebuggerIsHighlightedAndPaused(toolbox);
+ const source = findSource(dbg, IFRAME_TEST_COM_URI);
+ assertPausedAtSourceAndLine(dbg, source.id, 2);
+
+ await resume(dbg);
+ info("Wait for the paused code to complete after resume");
+ await pausedReload;
+
+ ok(
+ !toolbox.isHighlighted("jsdebugger"),
+ "Debugger is no longer highlighted after resume"
+ );
+});
+
+add_task(async function () {
+ info("Test pausing from two distinct targets");
+
+ // Make sure the toolbox opens with the webconsole initially selected.
+ const toolbox = await openNewTabAndToolbox(IFRAME_TEST_URI, "webconsole");
+
+ info(
+ "Reload the test page, which will trigger the debugger statement in the iframe"
+ );
+ const pausedReload = reloadBrowser();
+
+ const dbg = await assertDebuggerIsHighlightedAndPaused(toolbox);
+ const topLevelThread =
+ toolbox.commands.targetCommand.targetFront.threadFront.actorID;
+ const iframeThread = dbg.selectors.getCurrentThread();
+ if (isFissionEnabled() || isEveryFrameTargetEnabled()) {
+ isnot(
+ topLevelThread,
+ iframeThread,
+ "With fission/EFT, we get two distinct threads and could pause two times"
+ );
+ ok(
+ !dbg.selectors.getIsPaused(topLevelThread),
+ "The top level document thread is not paused"
+ );
+ ok(
+ dbg.selectors.getIsPaused(iframeThread),
+ "Only the iframe thread is paused"
+ );
+ } else {
+ is(
+ topLevelThread,
+ iframeThread,
+ "Without fission/EFT, we get a unique thread and we won't pause when calling top document code"
+ );
+ }
+ const source = findSource(dbg, IFRAME_TEST_COM_URI);
+ assertPausedAtSourceAndLine(dbg, source.id, 2);
+
+ info("Step over to the next line");
+ await stepOver(dbg);
+ assertPausedAtSourceAndLine(dbg, source.id, 3);
+
+ info("Now execute a debugger statement in the top level target");
+ const onPaused = waitForPausedThread(dbg, topLevelThread);
+ const pausedTopTarget = SpecialPowers.spawn(
+ gBrowser.selectedBrowser,
+ [],
+ function () {
+ content.wrappedJSObject.breakDebugger();
+ }
+ );
+
+ if (isFissionEnabled() || isEveryFrameTargetEnabled()) {
+ info("Wait for the top level target to be paused");
+ await onPaused;
+ // also use waitForPause to wait for UI updates
+ await waitForPaused(dbg);
+
+ ok(
+ dbg.selectors.getIsPaused(topLevelThread),
+ "The top level document thread is paused"
+ );
+ ok(dbg.selectors.getIsPaused(iframeThread), "The iframe thread is paused");
+
+ ok(
+ toolbox.isHighlighted("jsdebugger"),
+ "Debugger stays highlighted when pausing on another thread"
+ );
+
+ info(
+ "The new paused state refers to the latest breakpoint being hit, on the top level target"
+ );
+ const source2 = findSource(dbg, IFRAME_TEST_URI);
+ assertPausedAtSourceAndLine(dbg, source2.id, 2);
+
+ info("Resume the top level target");
+ await resume(dbg);
+
+ info("Wait for top level target paused code to complete after resume");
+ await pausedTopTarget;
+
+ info(
+ "By default we stay on the last selected thread on resume and so the current thread is no longer paused"
+ );
+ assertNotPaused(dbg);
+ ok(
+ toolbox.isHighlighted("jsdebugger"),
+ "Debugger stays highlighted when resuming only the top level target"
+ );
+
+ info(
+ "Re-select the iframe thread, which is still paused on the original breakpoint"
+ );
+ dbg.actions.selectThread(iframeThread);
+ await waitForPausedThread(dbg, iframeThread);
+ await waitForSelectedSource(dbg, source);
+ assertPausedAtSourceAndLine(dbg, source.id, 3);
+
+ info("Resume the iframe target");
+ await resume(dbg);
+ assertNotPaused(dbg);
+
+ info("Wait for the paused code in the iframe to complete after resume");
+ await pausedReload;
+
+ await waitUntil(() => !toolbox.isHighlighted("jsdebugger"));
+ ok(
+ true,
+ "Debugger is no longer highlighted after resuming all the paused targets"
+ );
+ } else {
+ info(
+ "Without fission/EFT, the iframe thread is the same as top document and doesn't pause. So wait for its resolution."
+ );
+ await pausedTopTarget;
+ }
+
+ info("Resume the last paused thread");
+ await resume(dbg);
+ assertNotPaused(dbg);
+
+ info("Wait for the paused code in the iframe to complete after resume");
+ await pausedReload;
+
+ await waitUntil(() => !toolbox.isHighlighted("jsdebugger"));
+ ok(
+ true,
+ "Debugger is no longer highlighted after resuming all the paused targets"
+ );
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-watchpoints.js b/devtools/client/debugger/test/mochitest/browser_dbg-watchpoints.js
new file mode 100644
index 0000000000..4d68795104
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-watchpoints.js
@@ -0,0 +1,118 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// - Tests adding a watchpoint
+// - Tests removing a watchpoint
+// - Tests adding a watchpoint, resuming to after the youngest frame has popped,
+// then removing and adding a watchpoint during the same pause
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-sources.html");
+
+ // Do not await for navigation as an early breakpoint pauses the document load
+ const onNavigated = navigateTo(`${EXAMPLE_URL}doc-watchpoints.html`);
+ await waitForSources(dbg, "doc-watchpoints.html");
+ await selectSource(dbg, "doc-watchpoints.html");
+ await waitForPaused(dbg);
+ const sourceId = findSource(dbg, "doc-watchpoints.html").id;
+
+ info("Add a get watchpoint at b");
+ await toggleScopeNode(dbg, 3);
+ const addedWatchpoint = waitForDispatch(dbg.store, "SET_WATCHPOINT");
+ await rightClickScopeNode(dbg, 5);
+ let popup = await waitForContextMenu(dbg);
+ let submenu = await openContextMenuSubmenu(dbg, selectors.watchpointsSubmenu);
+ const getWatchpointItem = document.querySelector(selectors.addGetWatchpoint);
+ submenu.activateItem(getWatchpointItem);
+ await addedWatchpoint;
+ popup.hidePopup();
+
+ await resume(dbg);
+ await waitForPaused(dbg);
+ await waitForState(dbg, () => dbg.selectors.getSelectedInlinePreviews());
+ assertPausedAtSourceAndLine(dbg, sourceId, 17);
+ is(await getScopeNodeValue(dbg, 5), "3");
+ const whyPaused = await waitFor(
+ () => dbg.win.document.querySelector(".why-paused")?.innerText
+ );
+ is(whyPaused, `Paused on property get\nobj.b`);
+
+ info("Resume and wait to pause at the access to b in the first `obj.b;`");
+ await resume(dbg);
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, sourceId, 19);
+
+ info("Remove the get watchpoint on b");
+ const removedWatchpoint1 = waitForDispatch(dbg.store, "REMOVE_WATCHPOINT");
+ const el1 = await waitForElementWithSelector(dbg, ".remove-watchpoint-get");
+ el1.scrollIntoView();
+ clickElementWithSelector(dbg, ".remove-watchpoint-get");
+ await removedWatchpoint1;
+
+ info(
+ "Resume and wait to skip the second `obj.b` and pause on the debugger statement"
+ );
+ await resume(dbg);
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, sourceId, 21);
+
+ info("Resume and pause on the debugger statement in getB");
+ await resume(dbg);
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, sourceId, 5);
+
+ info("Add a get watchpoint to b");
+ await toggleScopeNode(dbg, 4);
+ const addedWatchpoint2 = waitForDispatch(dbg.store, "SET_WATCHPOINT");
+ await rightClickScopeNode(dbg, 6);
+ popup = await waitForContextMenu(dbg);
+ submenu = await openContextMenuSubmenu(dbg, selectors.watchpointsSubmenu);
+ const getWatchpointItem2 = document.querySelector(selectors.addGetWatchpoint);
+ submenu.activateItem(getWatchpointItem2);
+ await addedWatchpoint2;
+ popup.hidePopup();
+
+ info("Resume and wait to pause at the access to b in getB");
+ await resume(dbg);
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, sourceId, 6);
+
+ info("Resume and pause on the debugger statement");
+ await waitForRequestsToSettle(dbg);
+ await resume(dbg);
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, sourceId, 24);
+
+ info("Remove the get watchpoint on b");
+ const removedWatchpoint2 = waitForDispatch(dbg.store, "REMOVE_WATCHPOINT");
+ await toggleScopeNode(dbg, 3);
+
+ const el2 = await waitForElementWithSelector(dbg, ".remove-watchpoint-get");
+ el2.scrollIntoView();
+ clickElementWithSelector(dbg, ".remove-watchpoint-get");
+ await removedWatchpoint2;
+
+ info("Add back the get watchpoint on b");
+ const addedWatchpoint3 = waitForDispatch(dbg.store, "SET_WATCHPOINT");
+ await rightClickScopeNode(dbg, 5);
+ popup = await waitForContextMenu(dbg);
+ submenu = await openContextMenuSubmenu(dbg, selectors.watchpointsSubmenu);
+ const getWatchpointItem3 = document.querySelector(selectors.addGetWatchpoint);
+ submenu.activateItem(getWatchpointItem3);
+ await addedWatchpoint3;
+ popup.hidePopup();
+
+ info("Resume and wait to pause on the final `obj.b;`");
+ await resume(dbg);
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, sourceId, 25);
+
+ info("Do a last resume to finalize the document load");
+ await resume(dbg);
+ await onNavigated;
+
+ await waitForRequestsToSettle(dbg);
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-windowless-service-workers-reload.js b/devtools/client/debugger/test/mochitest/browser_dbg-windowless-service-workers-reload.js
new file mode 100644
index 0000000000..1638cb9722
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-windowless-service-workers-reload.js
@@ -0,0 +1,65 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test that service worker sources are still displayed after reloading the page
+// and that we can hit breakpoints in them.
+
+"use strict";
+
+const SW_URL = EXAMPLE_URL + "service-worker.sjs";
+
+add_task(async function () {
+ await pushPref("devtools.debugger.features.windowless-service-workers", true);
+ await pushPref("devtools.debugger.threads-visible", true);
+ await pushPref("dom.serviceWorkers.testing.enabled", true);
+
+ const dbg = await initDebugger("doc-service-workers.html");
+
+ invokeInTab("registerWorker");
+ await waitForSource(dbg, "service-worker.sjs");
+ const workerSource = findSource(dbg, "service-worker.sjs");
+
+ await reload(dbg, "service-worker.sjs");
+
+ await addBreakpoint(dbg, "service-worker.sjs", 13);
+ invokeInTab("fetchFromWorker");
+
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, workerSource.id, 13);
+
+ await assertPreviews(dbg, [
+ {
+ line: 10,
+ column: 9,
+ result: EXAMPLE_URL + "whatever",
+ expression: "url",
+ },
+ ]);
+
+ await resume(dbg);
+
+ // Reload a second time to ensure we can still debug the SW
+ await reload(dbg, "service-worker.sjs");
+
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, workerSource.id, 13);
+
+ await assertPreviews(dbg, [
+ {
+ line: 10,
+ column: 9,
+ result: EXAMPLE_URL + "whatever",
+ expression: "url",
+ },
+ ]);
+
+ await resume(dbg);
+
+ await unregisterServiceWorker(SW_URL);
+
+ await checkAdditionalThreadCount(dbg, 0);
+
+ await waitForRequestsToSettle(dbg);
+ await removeTab(gBrowser.selectedTab);
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-windowless-service-workers.js b/devtools/client/debugger/test/mochitest/browser_dbg-windowless-service-workers.js
new file mode 100644
index 0000000000..a38aebe6e0
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-windowless-service-workers.js
@@ -0,0 +1,179 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test that we can detect a new service worker and hit breakpoints that we've
+// set in it.
+
+"use strict";
+
+// Use an URL with a specific port to check that Bug 1876533 is fixed
+// We're using URL without port in other tests, like browser_dbg-windowless-service-workers-reload.js
+const SW_URL = EXAMPLE_URL_WITH_PORT + "service-worker.sjs";
+
+add_task(async function () {
+ info("Subtest #1");
+ await pushPref("devtools.debugger.features.windowless-service-workers", true);
+ await pushPref("devtools.debugger.threads-visible", true);
+ await pushPref("dom.serviceWorkers.testing.enabled", true);
+
+ const dbg = await initDebuggerWithAbsoluteURL(
+ EXAMPLE_URL_WITH_PORT + "doc-service-workers.html"
+ );
+
+ invokeInTab("registerWorker");
+ await waitForSource(dbg, "service-worker.sjs");
+ const workerSource = findSource(dbg, "service-worker.sjs");
+
+ await addBreakpoint(dbg, "service-worker.sjs", 13);
+
+ invokeInTab("fetchFromWorker");
+
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, workerSource.id, 13);
+ // Leave the breakpoint and worker in place for the next subtest.
+ await resume(dbg);
+ await waitForRequestsToSettle(dbg);
+ await removeTab(gBrowser.selectedTab);
+});
+
+// Test that breakpoints can be immediately hit in service workers when reloading.
+add_task(async function () {
+ info("Subtest #2");
+
+ const toolbox = await openNewTabAndToolbox(
+ `${EXAMPLE_URL_WITH_PORT}doc-service-workers.html`,
+ "jsdebugger"
+ );
+ const dbg = createDebuggerContext(toolbox);
+
+ await checkAdditionalThreadCount(dbg, 1);
+
+ // The test page will immediately fetch from the service worker if registered.
+ const onReloaded = reload(dbg);
+
+ await waitForSource(dbg, "service-worker.sjs");
+ const workerSource = findSource(dbg, "service-worker.sjs");
+
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, workerSource.id, 13);
+ await checkAdditionalThreadCount(dbg, 1);
+
+ await resume(dbg);
+ await dbg.actions.removeAllBreakpoints();
+
+ info("Wait for reload to complete after resume");
+ await onReloaded;
+
+ await unregisterServiceWorker(SW_URL);
+
+ await checkAdditionalThreadCount(dbg, 0);
+ await waitForRequestsToSettle(dbg);
+ await removeTab(gBrowser.selectedTab);
+});
+
+// Test having a waiting and active service worker for the same registration.
+add_task(async function () {
+ info("Subtest #3");
+
+ const toolbox = await openNewTabAndToolbox(
+ `${EXAMPLE_URL_WITH_PORT}doc-service-workers.html`,
+ "jsdebugger"
+ );
+ const dbg = createDebuggerContext(toolbox);
+
+ invokeInTab("registerWorker");
+ await checkAdditionalThreadCount(dbg, 1);
+ await checkWorkerStatus(dbg, "activated");
+
+ const firstTab = gBrowser.selectedTab;
+
+ await addTab(
+ `${EXAMPLE_URL_WITH_PORT}service-worker.sjs?setStatus=newServiceWorker`
+ );
+ await removeTab(gBrowser.selectedTab);
+
+ const secondTab = await addTab(
+ `${EXAMPLE_URL_WITH_PORT}doc-service-workers.html`
+ );
+
+ await gBrowser.selectTabAtIndex(gBrowser.tabs.indexOf(firstTab));
+ await checkAdditionalThreadCount(dbg, 2);
+
+ const sources = await waitFor(() => {
+ const list = dbg.selectors
+ .getSourceList()
+ .filter(s => s.url.includes("service-worker.sjs"));
+ return list.length == 1 ? list : null;
+ });
+ ok(sources.length, "Found one sources for service worker");
+
+ // Add a breakpoint for the next subtest.
+ await addBreakpoint(dbg, "service-worker.sjs", 2);
+
+ await unregisterServiceWorker(SW_URL);
+
+ await checkAdditionalThreadCount(dbg, 0);
+ await waitForRequestsToSettle(dbg);
+ await removeTab(firstTab);
+ await removeTab(secondTab);
+
+ // Reset the SJS in case we will be repeating the test.
+ await addTab(`${EXAMPLE_URL_WITH_PORT}service-worker.sjs?setStatus=`);
+ await removeTab(gBrowser.selectedTab);
+});
+
+// Test setting breakpoints while the service worker is starting up.
+add_task(async function () {
+ info("Subtest #4");
+ if (Services.appinfo.fissionAutostart) {
+ // Disabled when serviceworker isolation is used due to bug 1749341
+ return;
+ }
+
+ const toolbox = await openNewTabAndToolbox(
+ `${EXAMPLE_URL_WITH_PORT}doc-service-workers.html`,
+ "jsdebugger"
+ );
+ const dbg = createDebuggerContext(toolbox);
+
+ invokeInTab("registerWorker");
+ await checkAdditionalThreadCount(dbg, 1);
+
+ await waitForSource(dbg, "service-worker.sjs");
+ const workerSource = findSource(dbg, "service-worker.sjs");
+
+ await waitForBreakpointCount(dbg, 1);
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, workerSource.id, 2);
+ await checkWorkerStatus(dbg, "parsed");
+
+ await addBreakpoint(dbg, "service-worker.sjs", 19);
+ await resume(dbg);
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, workerSource.id, 19);
+ await checkWorkerStatus(dbg, "installing");
+
+ await addBreakpoint(dbg, "service-worker.sjs", 5);
+ await resume(dbg);
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, workerSource.id, 5);
+ await checkWorkerStatus(dbg, "activating");
+
+ await resume(dbg);
+ await unregisterServiceWorker(SW_URL);
+
+ await checkAdditionalThreadCount(dbg, 0);
+ await waitForRequestsToSettle(dbg);
+ await removeTab(gBrowser.selectedTab);
+});
+
+async function checkWorkerStatus(dbg, status) {
+ /* TODO: Re-Add support for showing service worker status (Bug 1641099)
+ await waitUntil(() => {
+ const threads = dbg.selectors.getThreads();
+ return threads.some(t => t.serviceWorkerStatus == status);
+ });
+ ok(true, `Have thread with status ${status}`);
+ */
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-windowless-workers-early-breakpoint.js b/devtools/client/debugger/test/mochitest/browser_dbg-windowless-workers-early-breakpoint.js
new file mode 100644
index 0000000000..642b1a18dd
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-windowless-workers-early-breakpoint.js
@@ -0,0 +1,40 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test that breakpoints at worker startup are hit when using windowless workers.
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger(
+ "doc-windowless-workers-early-breakpoint.html",
+ "simple-worker.js"
+ );
+
+ const workerSource = findSource(dbg, "simple-worker.js");
+
+ await selectSource(dbg, "simple-worker.js");
+ await waitForSelectedSource(dbg, "simple-worker.js");
+ await addBreakpoint(dbg, workerSource, 1);
+ invokeInTab("startWorker");
+ await waitForPaused(dbg, "simple-worker.js");
+
+ // We should be paused at the first line of simple-worker.js
+ assertPausedAtSourceAndLine(dbg, workerSource.id, 1);
+ // We have to remove the first breakpoint, set on the first worker.
+ // All the workers use the same source.
+ // The first worker is loaded on the html page load.
+ await removeBreakpoint(dbg, workerSource.id, 1, 13);
+ await resume(dbg);
+
+ // Make sure that suspending activity in the worker when attaching does not
+ // interfere with sending messages to the worker.
+ await addBreakpoint(dbg, workerSource, 10);
+ invokeInTab("startWorkerWithMessage");
+ await waitForPaused(dbg, "simple-worker.js");
+
+ // We should be paused in the message listener in simple-worker.js
+ assertPausedAtSourceAndLine(dbg, workerSource.id, 10);
+ await removeBreakpoint(dbg, workerSource.id, 10, 3);
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-windowless-workers.js b/devtools/client/debugger/test/mochitest/browser_dbg-windowless-workers.js
new file mode 100644
index 0000000000..ffe362b44f
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-windowless-workers.js
@@ -0,0 +1,170 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test basic worker functionality: the main thread and worker can be
+// separately controlled from the same debugger.
+
+"use strict";
+
+add_task(async function () {
+ await pushPref("devtools.debugger.threads-visible", true);
+
+ const dbg = await initDebugger("doc-windowless-workers.html");
+ const mainThread = dbg.toolbox.threadFront.actor;
+
+ await waitForThreadCount(dbg, 2);
+ const workers = dbg.selectors.getThreads();
+ Assert.equal(workers.length, 2, "Got two workers");
+ const thread1 = workers[0].actor;
+ const thread2 = workers[1].actor;
+
+ const mainThreadSource = findSource(dbg, "doc-windowless-workers.html");
+
+ await waitForSource(dbg, "simple-worker.js");
+
+ info("Pause in the main thread");
+ assertNotPaused(dbg);
+ await dbg.actions.breakOnNext();
+ await waitForPaused(dbg, "doc-windowless-workers.html");
+ assertPausedAtSourceAndLine(dbg, mainThreadSource.id, 10);
+ threadIsSelected(dbg, 1);
+
+ info("Pause in the first worker");
+ await dbg.actions.selectThread(thread1);
+ assertNotPaused(dbg);
+ await dbg.actions.breakOnNext();
+ await waitForPaused(dbg, "simple-worker.js");
+ threadIsSelected(dbg, 2);
+ const workerSource2 = dbg.selectors.getSelectedSource();
+ assertPausedAtSourceAndLine(dbg, workerSource2.id, 3);
+
+ info("Add a watch expression and view the value");
+ await addExpression(dbg, "count");
+ is(getWatchExpressionLabel(dbg, 1), "count");
+ const v = getWatchExpressionValue(dbg, 1);
+ Assert.equal(v, `${+v}`, "Value of count should be a number");
+
+ info("StepOver in the first worker");
+ await stepOver(dbg);
+ assertPausedAtSourceAndLine(dbg, workerSource2.id, 4);
+
+ info("Ensure that the watch expression has updated");
+ await waitUntil(() => {
+ const v2 = getWatchExpressionValue(dbg, 1);
+ return +v2 == +v + 1;
+ });
+
+ info("Resume in the first worker");
+ await resume(dbg);
+ assertNotPaused(dbg);
+
+ info("StepOver in the main thread");
+ dbg.actions.selectThread(mainThread);
+ await stepOver(dbg);
+ assertPausedAtSourceAndLine(dbg, mainThreadSource.id, 11);
+
+ info("Resume in the mainThread");
+ await resume(dbg);
+ assertNotPaused(dbg);
+
+ info("Pause in both workers");
+ await addBreakpoint(dbg, "simple-worker.js", 10);
+ invokeInTab("sayHello");
+
+ info("Wait for both workers to pause");
+ // When a thread pauses the current thread changes,
+ // and we don't want to get confused.
+ await waitForPausedThread(dbg, thread1);
+ await waitForPausedThread(dbg, thread2);
+ threadIsPaused(dbg, 2);
+ threadIsPaused(dbg, 3);
+
+ info("View the first paused thread");
+ dbg.actions.selectThread(thread1);
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, workerSource2.id, 10);
+
+ info("View the second paused thread");
+ await dbg.actions.selectThread(thread2);
+ threadIsSelected(dbg, 3);
+ await waitForPaused(dbg);
+ const workerSource3 = dbg.selectors.getSelectedSource();
+ is(
+ workerSource2,
+ workerSource3,
+ "The selected source is the same as we have one source per URL"
+ );
+ assertPausedAtSourceAndLine(dbg, workerSource3.id, 10);
+
+ info("StepOver in second worker and not the first");
+ await stepOver(dbg);
+ assertPausedAtSourceAndLine(dbg, workerSource3.id, 11);
+ await dbg.actions.selectThread(thread1);
+ assertPausedAtSourceAndLine(dbg, workerSource2.id, 10);
+
+ info("Resume both worker execution");
+ await resume(dbg);
+ assertNotPaused(dbg);
+ await dbg.actions.selectThread(thread2);
+ await resume(dbg);
+ assertNotPaused(dbg);
+
+ let sourceActors = dbg.selectors.getSourceActorsForSource(workerSource3.id);
+ is(
+ sourceActors.length,
+ 2,
+ "There is one source actor per thread for the worker source"
+ );
+ info(
+ "Terminate the first worker and wait for having only the second worker in threads list"
+ );
+ await SpecialPowers.spawn(gBrowser.selectedBrowser, [], () => {
+ content.wrappedJSObject.worker1.terminate();
+ });
+ await waitForThreadCount(dbg, 1);
+ sourceActors = dbg.selectors.getSourceActorsForSource(workerSource3.id);
+ is(
+ sourceActors.length,
+ 1,
+ "After the first worker is destroyed, we only have one source actor for the worker source"
+ );
+ ok(
+ sourceExists(dbg, "simple-worker.js"),
+ "But we still have the worker source object"
+ );
+
+ info("Terminate the second worker and wait for no more additional threads");
+ await SpecialPowers.spawn(gBrowser.selectedBrowser, [], () => {
+ content.wrappedJSObject.worker2.terminate();
+ });
+ await waitForThreadCount(dbg, 0);
+ sourceActors = dbg.selectors.getSourceActorsForSource(workerSource3.id);
+ is(
+ sourceActors.length,
+ 0,
+ "After all workers are destroyed, we no longer have any source actor"
+ );
+ ok(
+ !sourceExists(dbg, "simple-worker.js"),
+ "And we no longer have the worker source"
+ );
+});
+
+function assertClass(dbg, selector, className, ...args) {
+ ok(
+ findElement(dbg, selector, ...args).classList.contains(className),
+ `${className} class exists`
+ );
+}
+
+function threadIsPaused(dbg, index) {
+ return ok(
+ findElement(dbg, "threadsPaneItemPause", index),
+ `Thread ${index} is paused`
+ );
+}
+
+function threadIsSelected(dbg, index) {
+ return assertClass(dbg, "threadsPaneItem", "selected", index);
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-worker-exception.js b/devtools/client/debugger/test/mochitest/browser_dbg-worker-exception.js
new file mode 100644
index 0000000000..275b4f91fb
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-worker-exception.js
@@ -0,0 +1,26 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test that we can pause on exceptions early in newly created workers.
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-worker-exception.html");
+
+ await togglePauseOnExceptions(dbg, true, false);
+
+ invokeInTab("startWorker");
+ invokeInTab("messageWorker");
+
+ info("Test pause on exceptions on worker load");
+ await waitForPaused(dbg);
+ const source = findSource(dbg, "worker-exception.js");
+ assertPausedAtSourceAndLine(dbg, source.id, 4);
+
+ await resume(dbg);
+ info("Test pause on exceptions on worker postMessage ");
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, source.id, 2);
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-worker-module.js b/devtools/client/debugger/test/mochitest/browser_dbg-worker-module.js
new file mode 100644
index 0000000000..5c75e8f795
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-worker-module.js
@@ -0,0 +1,19 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test that worker modules do not crash when run in the debugger.
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-module-worker.html");
+ // reload the page
+ await navigate(dbg, "doc-module-worker.html", "doc-module-worker.html");
+
+ ok(true, "didn't crash");
+ // TODO: bug 1816933 -- we can test actual functionality:
+ // await waitForThreadCount(dbg, 1);
+ // const workers = dbg.selectors.getThreads();
+ // ok(workers.length == 1, "Got one worker");
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-worker-nested.js b/devtools/client/debugger/test/mochitest/browser_dbg-worker-nested.js
new file mode 100644
index 0000000000..c8605f9986
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-worker-nested.js
@@ -0,0 +1,15 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test that workers started by other workers show up in the debugger.
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-nested-worker.html");
+
+ await waitForThreadCount(dbg, 2);
+ const workers = dbg.selectors.getThreads();
+ Assert.equal(workers.length, 2, "Got two workers");
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-worker-scopes.js b/devtools/client/debugger/test/mochitest/browser_dbg-worker-scopes.js
new file mode 100644
index 0000000000..b94b63014a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-worker-scopes.js
@@ -0,0 +1,102 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+PromiseTestUtils.allowMatchingRejectionsGlobally(/Current state is running/);
+PromiseTestUtils.allowMatchingRejectionsGlobally(/Connection closed/);
+
+// Test that unusual objects have their contents shown in worker thread scopes.
+add_task(async function () {
+ const dbg = await initDebugger("doc-worker-scopes.html", "scopes-worker.js");
+
+ await selectSource(dbg, "scopes-worker.js");
+ await addBreakpointViaGutter(dbg, 11);
+ await dbg.toolbox.target.waitForRequestsToSettle();
+ invokeInTab("startWorker");
+ await waitForPaused(dbg, "scopes-worker.js");
+ await removeBreakpointViaGutter(dbg, 11);
+ // We should be paused at the first line of simple-worker.js
+ const workerSource2 = dbg.selectors.getSelectedSource();
+ assertPausedAtSourceAndLine(dbg, workerSource2.id, 11);
+
+ await toggleNode(dbg, "var_array");
+ Assert.equal(findNodeValue(dbg, "0"), '"mango"', "array elem0");
+ Assert.equal(findNodeValue(dbg, "1"), '"pamplemousse"', "array elem1");
+ Assert.equal(findNodeValue(dbg, "2"), '"pineapple"', "array elem2");
+ await toggleNode(dbg, "var_array");
+
+ await toggleNode(dbg, "var_tarray");
+ Assert.equal(findNodeValue(dbg, "0"), "42", "tarray elem0");
+ Assert.equal(findNodeValue(dbg, "1"), "43", "tarray elem1");
+ Assert.equal(findNodeValue(dbg, "2"), "44", "tarray elem2");
+ await toggleNode(dbg, "var_tarray");
+
+ await toggleNode(dbg, "var_set");
+ await toggleNode(dbg, "<entries>");
+
+ Assert.equal(findNodeValue(dbg, "0"), '"papaya"', "set elem0");
+ Assert.equal(findNodeValue(dbg, "1"), '"banana"', "set elem1");
+ await toggleNode(dbg, "var_set");
+
+ await toggleNode(dbg, "var_map");
+ await toggleNode(dbg, "<entries>");
+ await toggleNode(dbg, "0");
+ ok(findNodeValue(dbg, "<key>"), "1");
+ ok(findNodeValue(dbg, "<value>"), '"one"');
+ await toggleNode(dbg, "0");
+ await toggleNode(dbg, "1");
+ ok(findNodeValue(dbg, "<key>"), "2");
+ ok(findNodeValue(dbg, "<value>"), '"two"');
+ await toggleNode(dbg, "var_map");
+
+ await toggleNode(dbg, "var_weakmap");
+ await toggleNode(dbg, "<entries>");
+ await toggleNode(dbg, "0");
+ await toggleNode(dbg, "<key>");
+ ok(findNodeValue(dbg, "foo"), "foo");
+ await toggleNode(dbg, "<value>");
+ ok(findNodeValue(dbg, "bar"), "bar");
+ await toggleNode(dbg, "var_weakmap");
+
+ await toggleNode(dbg, "var_weakset");
+ await toggleNode(dbg, "<entries>");
+ await toggleNode(dbg, "0");
+ ok(findNodeValue(dbg, "foo"), "foo");
+ await toggleNode(dbg, "var_weakset");
+
+ // Close the scopes in order to unmount the reps in order to force spawning
+ // the various `release` RDP requests which, otherwise, would happen in
+ // middle of the toolbox destruction. Then, wait for them to finish.
+ await toggleScopes(dbg);
+ await waitForRequestsToSettle(dbg);
+});
+
+function findNode(dbg, text) {
+ for (let index = 0; ; index++) {
+ const elem = findElement(dbg, "scopeNode", index);
+ if (elem?.innerText == text) {
+ return elem;
+ }
+ }
+}
+
+function toggleNode(dbg, text) {
+ return toggleObjectInspectorNode(findNode(dbg, text));
+}
+
+function findNodeValue(dbg, text) {
+ for (let index = 0; ; index++) {
+ const elem = findElement(dbg, "scopeNode", index);
+ if (elem?.innerText == text) {
+ return getScopeNodeValue(dbg, index);
+ }
+ }
+}
+
+async function removeBreakpointViaGutter(dbg, line) {
+ const onRemoved = waitForDispatch(dbg.store, "REMOVE_BREAKPOINT");
+ await clickGutter(dbg, line);
+ await onRemoved;
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-wrong-fetch.js b/devtools/client/debugger/test/mochitest/browser_dbg-wrong-fetch.js
new file mode 100644
index 0000000000..4ab5baeda4
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-wrong-fetch.js
@@ -0,0 +1,27 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test that incorrect source contents are not shown if the server refetches
+// different HTML when attaching to an open page.
+
+"use strict";
+
+add_task(async function () {
+ await addTab(`${EXAMPLE_URL}different_html.sjs`);
+
+ // This goop is here to manually clear the HTTP cache because setting response
+ // headers in different_html.sjs to not cache the response doesn't work.
+ Services.cache2.clear();
+
+ const toolbox = await openToolboxForTab(gBrowser.selectedTab, "jsdebugger");
+ const dbg = createDebuggerContext(toolbox);
+ await selectSource(dbg, "different_html.sjs");
+ await waitForLoadedSource(dbg, "different_html.sjs");
+ const contents = findSourceContent(dbg, "different_html.sjs");
+
+ ok(
+ contents.value.includes("Incorrect contents fetched"),
+ "Error message is shown"
+ );
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-xhr-breakpoints.js b/devtools/client/debugger/test/mochitest/browser_dbg-xhr-breakpoints.js
new file mode 100644
index 0000000000..bc8b62f766
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-xhr-breakpoints.js
@@ -0,0 +1,236 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+const { asyncStore } = require("devtools/client/debugger/src/utils/prefs");
+
+add_task(async function () {
+ info("Test XHR requests done very early during page load");
+
+ const dbg = await initDebugger("doc-xhr.html", "fetch.js");
+
+ await addXHRBreakpoint(dbg, "doc", "GET");
+
+ await SpecialPowers.spawn(
+ gBrowser.selectedBrowser,
+ [`${EXAMPLE_REMOTE_URL}doc-early-xhr.html`],
+ remoteUrl => {
+ const firstIframe = content.document.createElement("iframe");
+ content.document.body.append(firstIframe);
+ firstIframe.src = remoteUrl;
+ }
+ );
+
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "doc-early-xhr.html").id,
+ 10
+ );
+
+ const whyPaused = await waitFor(
+ () => dbg.win.document.querySelector(".why-paused")?.innerText
+ );
+ is(whyPaused, `Paused on XMLHttpRequest`);
+
+ await resume(dbg);
+
+ await dbg.actions.removeXHRBreakpoint(0);
+
+ await SpecialPowers.spawn(
+ gBrowser.selectedBrowser,
+ [`${EXAMPLE_REMOTE_URL}doc-early-xhr.html`],
+ remoteUrl => {
+ const secondIframe = content.document.createElement("iframe");
+ content.document.body.append(secondIframe);
+ secondIframe.src = remoteUrl;
+ }
+ );
+
+ // Wait for some time, in order to wait for it to be paused
+ // in case we regress
+ await wait(1000);
+
+ assertNotPaused(dbg);
+});
+
+add_task(async function () {
+ info("Test simple XHR breakpoints set before doing the request");
+
+ const dbg = await initDebugger("doc-xhr.html", "fetch.js");
+
+ await addXHRBreakpoint(dbg, "doc", "GET");
+
+ invokeInTab("main", "doc-xhr.html");
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(dbg, findSource(dbg, "fetch.js").id, 4);
+ await resume(dbg);
+
+ await dbg.actions.removeXHRBreakpoint(0);
+ await invokeInTab("main", "doc-xhr.html");
+ assertNotPaused(dbg);
+
+ info("Test that we do not pause on different method type");
+ await addXHRBreakpoint(dbg, "doc", "POST");
+ await invokeInTab("main", "doc-xhr.html");
+ assertNotPaused(dbg);
+});
+
+// Tests the "pause on any URL" checkbox works properly
+add_task(async function () {
+ info("Test 'pause on any URL'");
+ const dbg = await initDebugger("doc-xhr.html", "fetch.js");
+
+ // Enable pause on any URL
+ await clickPauseOnAny(dbg, "SET_XHR_BREAKPOINT");
+
+ invokeInTab("main", "doc-xhr.html");
+ await waitForPaused(dbg);
+ await resume(dbg);
+ await assertDebuggerTabHighlight(dbg);
+
+ invokeInTab("main", "fetch.js");
+ await waitForPaused(dbg);
+ await resume(dbg);
+ await assertDebuggerTabHighlight(dbg);
+
+ invokeInTab("main", "README.md");
+ await waitForPaused(dbg);
+ await resume(dbg);
+ await assertDebuggerTabHighlight(dbg);
+
+ // Disable pause on any URL
+ await clickPauseOnAny(dbg, "DISABLE_XHR_BREAKPOINT");
+ invokeInTab("main", "README.md");
+ assertNotPaused(dbg);
+
+ // Turn off the checkbox
+ await dbg.actions.removeXHRBreakpoint(0);
+});
+
+// Tests removal works properly
+add_task(async function () {
+ info("Assert the frontend state when removing breakpoints");
+ const dbg = await initDebugger("doc-xhr.html");
+
+ const pauseOnAnyCheckbox = getXHRBreakpointCheckbox(dbg);
+
+ await clickPauseOnAny(dbg, "SET_XHR_BREAKPOINT");
+ await addXHRBreakpoint(dbg, "1");
+ await addXHRBreakpoint(dbg, "2");
+ await addXHRBreakpoint(dbg, "3");
+ await addXHRBreakpoint(dbg, "4");
+
+ // Remove "2"
+ await removeXHRBreakpoint(dbg, 1);
+
+ const listItems = getXHRBreakpointsElements(dbg);
+ is(listItems.length, 3, "3 XHR breakpoints display in list");
+ is(pauseOnAnyCheckbox.checked, true, "The pause on any is still checked");
+ is(
+ getXHRBreakpointLabels(listItems).join(""),
+ "134",
+ "Only the desired breakpoint was removed"
+ );
+});
+
+add_task(async function () {
+ info("Assert that remove all the breakpoints work well");
+ const dbg = await initDebugger("doc-xhr.html");
+
+ await addXHRBreakpoint(dbg, "1");
+ await addXHRBreakpoint(dbg, "2");
+ await addXHRBreakpoint(dbg, "3");
+ await addXHRBreakpoint(dbg, "4");
+
+ is(
+ getXHRBreakpointsElements(dbg).length,
+ 4,
+ "There a 4 items on the XHR breakpoints display list"
+ );
+
+ let persistedXHRBreakpoints = await asyncStore.xhrBreakpoints;
+ is(
+ persistedXHRBreakpoints.length,
+ 4,
+ "Check that the persisted XHR breakpoints have 4 items"
+ );
+
+ await dbg.actions.removeAllXHRBreakpoints();
+
+ is(
+ getXHRBreakpointsElements(dbg).length,
+ 0,
+ "XHR breakpoints display list is empty"
+ );
+
+ persistedXHRBreakpoints = await asyncStore.xhrBreakpoints;
+ is(
+ persistedXHRBreakpoints.length,
+ 0,
+ "Check that there are no persisted XHR breakpoints"
+ );
+});
+
+async function addXHRBreakpoint(dbg, text, method) {
+ info(`Adding a XHR breakpoint for pattern ${text} and method ${method}`);
+
+ const plusIcon = findElementWithSelector(dbg, ".xhr-breakpoints-pane .plus");
+ if (plusIcon) {
+ plusIcon.click();
+ }
+ findElementWithSelector(dbg, ".xhr-input-url").focus();
+ type(dbg, text);
+
+ if (method) {
+ findElementWithSelector(dbg, ".xhr-input-method").value = method;
+ }
+
+ pressKey(dbg, "Enter");
+
+ await waitForDispatch(dbg.store, "SET_XHR_BREAKPOINT");
+}
+
+async function removeXHRBreakpoint(dbg, index) {
+ info("Removing a XHR breakpoint");
+
+ const closeButtons = dbg.win.document.querySelectorAll(
+ ".xhr-breakpoints-pane .close-btn"
+ );
+ if (closeButtons[index]) {
+ closeButtons[index].click();
+ }
+
+ await waitForDispatch(dbg.store, "REMOVE_XHR_BREAKPOINT");
+}
+
+function getXHRBreakpointsElements(dbg) {
+ return [
+ ...dbg.win.document.querySelectorAll(
+ ".xhr-breakpoints-pane .xhr-container"
+ ),
+ ];
+}
+
+function getXHRBreakpointLabels(elements) {
+ return elements.map(element => element.title);
+}
+
+function getXHRBreakpointCheckbox(dbg) {
+ return findElementWithSelector(
+ dbg,
+ ".xhr-breakpoints-pane .breakpoints-exceptions input"
+ );
+}
+
+async function clickPauseOnAny(dbg, expectedEvent) {
+ getXHRBreakpointCheckbox(dbg).click();
+ await waitForDispatch(dbg.store, expectedEvent);
+}
+
+async function assertDebuggerTabHighlight(dbg) {
+ await waitUntil(() => !dbg.toolbox.isHighlighted("jsdebugger"));
+ ok(true, "Debugger is no longer highlighted after resume");
+}
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg-xhr-run-to-completion.js b/devtools/client/debugger/test/mochitest/browser_dbg-xhr-run-to-completion.js
new file mode 100644
index 0000000000..2417f84809
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg-xhr-run-to-completion.js
@@ -0,0 +1,54 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+// Test that XHR handlers are not called when pausing in the debugger.
+
+"use strict";
+
+add_task(async function () {
+ const dbg = await initDebugger("doc-xhr-run-to-completion.html");
+ invokeInTab("singleRequest", "doc-xhr-run-to-completion.html");
+ await waitForPaused(dbg);
+ await waitForSelectedLocation(dbg, 23);
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "doc-xhr-run-to-completion.html").id,
+ 23
+ );
+
+ const onTestPassed = once(Services.ppmm, "test passed");
+ await resume(dbg);
+ await onTestPassed;
+});
+
+// Test that XHR handlers are not called when pausing in the debugger,
+// including when there are multiple XHRs and multiple times we pause before
+// they can be processed.
+add_task(async function () {
+ const dbg = await initDebugger("doc-xhr-run-to-completion.html");
+ invokeInTab("multipleRequests", "doc-xhr-run-to-completion.html");
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "doc-xhr-run-to-completion.html").id,
+ 31
+ );
+ await resume(dbg);
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "doc-xhr-run-to-completion.html").id,
+ 33
+ );
+ await resume(dbg);
+ await waitForPaused(dbg);
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "doc-xhr-run-to-completion.html").id,
+ 34
+ );
+ const onTestPassed = once(Services.ppmm, "test passed");
+ await resume(dbg);
+ await onTestPassed;
+});
diff --git a/devtools/client/debugger/test/mochitest/browser_kz.toml b/devtools/client/debugger/test/mochitest/browser_kz.toml
new file mode 100644
index 0000000000..5af2243d7f
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_kz.toml
@@ -0,0 +1,337 @@
+[DEFAULT]
+tags = "devtools"
+subsuite = "devtools"
+skip-if = [
+ "asan", # Frequent failures when opening tabs due to OOM issues, bug 1760260
+]
+support-files = [
+ "examples/*",
+ "integration-tests/*",
+ "head.js",
+ "shared-head.js",
+ "!/devtools/client/framework/browser-toolbox/test/helpers-browser-toolbox.js",
+ "!/devtools/client/inspector/test/head.js",
+ "!/devtools/client/inspector/test/shared-head.js",
+ "!/devtools/client/shared/test/shared-head.js",
+ "!/devtools/client/shared/test/telemetry-test-helpers.js",
+ "!/devtools/client/shared/test/highlighter-test-actor.js",
+ "!/devtools/client/webconsole/test/browser/shared-head.js",
+]
+prefs = [
+ "dom.ipc.processPrelaunch.enabled=false", # Disable randomly spawning processes during tests. After enabling windowless service workers, a process spawning will trigger an update of the service workers list which can fail the test if it occurs during shutdown (unhandled promise rejection).
+ "devtools.debugger.features.javascript-tracing=true", # This pref has to be set before the process starts
+]
+
+["browser_dbg-keyboard-navigation.js"]
+
+["browser_dbg-keyboard-shortcuts-modal.js"]
+
+["browser_dbg-keyboard-shortcuts.js"]
+
+["browser_dbg-layout-changes.js"]
+
+["browser_dbg-link-reload.js"]
+skip-if = [
+ "os == 'linux' && asan", # Bug 1715866
+ "os == 'win' && bits == 64", # Bug 1715866
+]
+
+["browser_dbg-log-events.js"]
+
+["browser_dbg-log-point-mapping.js"]
+
+["browser_dbg-log-points-workers.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-log-points.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-many-breakpoints-same-line.js"]
+
+["browser_dbg-merge-scopes.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-message-run-to-completion.js"]
+
+["browser_dbg-minified.js"]
+
+["browser_dbg-navigation-when-paused.js"]
+
+["browser_dbg-navigation.js"]
+skip-if = [
+ "verify && debug && os == 'mac'", # Bug 1307249
+ "os == 'linux' && debug && bits == 64", # Bug 1307249
+ "os == 'mac' && debug", # Bug 1307249
+]
+
+["browser_dbg-no-duplicate-breakpoints-on-frame-reload.js"]
+
+["browser_dbg-old-breakpoint.js"]
+skip-if = [
+ "os == 'linux'", #Bug 1644044
+ "os == 'mac'", #Bug 1644044
+]
+
+["browser_dbg-outline-filter.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-outline-focus.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+skip-if = ["verify"]
+
+["browser_dbg-outline-pretty.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-outline.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-overrides.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-pause-exceptions.js"]
+
+["browser_dbg-pause-on-next.js"]
+
+["browser_dbg-pause-on-unload.js"]
+
+["browser_dbg-pause-points.js"]
+
+["browser_dbg-pause-ux.js"]
+skip-if = ["os == 'win'"]
+
+["browser_dbg-paused-overlay-iframe.js"]
+
+["browser_dbg-paused-overlay-loading.js"]
+
+["browser_dbg-paused-overlay.js"]
+
+["browser_dbg-pretty-print-breakpoints-columns.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-pretty-print-breakpoints-delete.js"]
+
+["browser_dbg-pretty-print-breakpoints.js"]
+
+["browser_dbg-pretty-print-console.js"]
+
+["browser_dbg-pretty-print-flow.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-pretty-print-inline-scripts.js"]
+skip-if = ["a11y_checks"] # Bug 1858041 and 1849028 intermittent a11y_checks results (fails on Try, passes on Autoland)
+
+["browser_dbg-pretty-print-paused-anonymous.js"]
+
+["browser_dbg-pretty-print-paused.js"]
+
+["browser_dbg-pretty-print-sourcemap.js"]
+
+["browser_dbg-pretty-print.js"]
+
+["browser_dbg-preview-frame.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+skip-if = ["os == 'win'"]
+
+["browser_dbg-preview-getter.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-preview-module.js"]
+skip-if = ["os == 'win'"]
+
+["browser_dbg-preview-source-maps.js"]
+skip-if = ["os == 'win'"]
+
+["browser_dbg-preview-wrapped-lines.js"]
+fail-if = ["a11y_checks"] # Bug 1860733 splitter element is not focusable
+
+["browser_dbg-preview.js"]
+skip-if = [
+ "os == 'win'",
+ "os == 'linux'",
+ "os == 'mac' && !debug",
+]
+
+["browser_dbg-project-root.js"]
+
+["browser_dbg-project-search.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-quick-open.js"]
+skip-if = [
+ "os == 'win'",
+ "os == 'linux' && bits == 64 && debug", # Bug 1721999
+]
+
+["browser_dbg-react-app.js"]
+skip-if = [
+ "os == 'win'",
+ "os == 'linux' && tsan", # Bug 1813196
+]
+
+["browser_dbg-react-jsx.js"]
+
+["browser_dbg-reducer-cleanup-on-target-removal.js"]
+skip-if = ["os == 'linux' && (debug || tsan)"] # Bug 1835255
+
+["browser_dbg-reloading.js"]
+skip-if = ["true"]
+
+["browser_dbg-remember-expanded-scopes.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-restart-frame.js"]
+
+["browser_dbg-returnvalues.js"]
+
+["browser_dbg-scopes-duplicated.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-scopes-mutations.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-scopes-xrays.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-scopes.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-scroll-run-to-completion.js"]
+
+["browser_dbg-search-file-paused.js"]
+skip-if = ["os == 'win'"] # Bug 1393121
+
+["browser_dbg-search-file-retains-query.js"]
+skip-if = ["os == 'win'"] # Bug 1393121
+
+["browser_dbg-search-file.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+skip-if = ["os == 'win'"] # Bug 1393121
+
+["browser_dbg-settings-disable-javascript.js"]
+
+["browser_dbg-slow-script.js"]
+
+["browser_dbg-source-pragma.js"]
+
+["browser_dbg-sourceURL-breakpoint.js"]
+
+["browser_dbg-sourcemapped-breakpoint-console.js"]
+skip-if = ["os == 'win' && ccov"] # Bug 1453549
+
+["browser_dbg-sourcemapped-preview.js"]
+skip-if = ["os == 'win'"] # Bug 1448523, Bug 1448450
+
+["browser_dbg-sourcemapped-scopes.js"]
+# Bug 1441545, 1536253 - very slow on debug
+skip-if = [
+ "ccov",
+ "debug",
+ "tsan",
+ "verify && debug && os == 'linux'",
+ "a11y_checks", # Bugs 1858041 and 1849028 intermittent results (fails on Try, passes on Autoland)
+]
+
+["browser_dbg-sourcemapped-stepping.js"]
+skip-if = ["true"] # original stepping is currently disabled
+
+["browser_dbg-sourcemapped-toggle.js"]
+
+["browser_dbg-sourcemaps-bogus.js"]
+skip-if = ["os == 'linux' && !asan"] # bug 1447118
+
+["browser_dbg-sourcemaps-breakpoints.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-sourcemaps-disabled.js"]
+
+["browser_dbg-sourcemaps-ignorelist.js"]
+
+["browser_dbg-sourcemaps-indexed.js"]
+skip-if = [
+ "os == 'win'", # Bug 1434792
+ "verify", # Bug 1434792
+]
+
+["browser_dbg-sourcemaps-redirect.js"]
+
+["browser_dbg-sourcemaps-reloading-quickly.js"]
+
+["browser_dbg-sourcemaps-reloading.js"]
+
+["browser_dbg-sourcemaps.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-sourcemaps2.js"]
+
+["browser_dbg-sourcemaps3.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-sources-project-search.js"]
+
+["browser_dbg-state-based-panels.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-step-in-navigate.js"]
+
+["browser_dbg-step-in-uninitialized.js"]
+
+["browser_dbg-stepping.js"]
+skip-if = [
+ "debug",
+ "verify && os == 'win'",
+]
+
+["browser_dbg-tabs-keyboard.js"]
+skip-if = ["os == 'win'"]
+
+["browser_dbg-tabs-pretty-print.js"]
+
+["browser_dbg-tabs-without-urls-selected.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-tabs-without-urls.js"]
+
+["browser_dbg-tabs.js"]
+
+["browser_dbg-toggling-tools.js"]
+
+["browser_dbg-ua-widgets.js"]
+
+["browser_dbg-unselected-pause.js"]
+
+["browser_dbg-watchpoints.js"]
+skip-if = ["true"] # Bug 1814093
+
+["browser_dbg-windowless-service-workers-reload.js"]
+skip-if = [
+ "!serviceworker_e10s", # parent intercept mode required.
+ "os == 'linux'", # Bug 1767716
+ "win11_2009 && !debug", # Bug 1767716
+]
+
+["browser_dbg-windowless-service-workers.js"]
+skip-if = [
+ "!serviceworker_e10s", # parent intercept mode is needed bug 1588154. Bug 1613543, the test consistently timeouts on Linux coverage builds and WR debug builds.
+ "os == 'linux'", # Bug 1732486, # Bug 1767717
+ "win11_2009 && !debug", # Bug 1767717
+]
+
+["browser_dbg-windowless-workers-early-breakpoint.js"]
+
+["browser_dbg-windowless-workers.js"]
+
+["browser_dbg-worker-exception.js"]
+
+["browser_dbg-worker-module.js"]
+
+["browser_dbg-worker-nested.js"]
+
+["browser_dbg-worker-scopes.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-wrong-fetch.js"]
+
+["browser_dbg-xhr-breakpoints.js"]
+fail-if = ["a11y_checks"] # Bug 1849028 clicked element may not be focusable and/or labeled
+
+["browser_dbg-xhr-run-to-completion.js"]
diff --git a/devtools/client/debugger/test/mochitest/examples/README.md b/devtools/client/debugger/test/mochitest/examples/README.md
new file mode 100644
index 0000000000..5ec141f951
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/README.md
@@ -0,0 +1,14 @@
+### Test Examples
+
+##### Pages
+* **doc_script-switching-01** - includes two scripts that reference each other. The second function has a debugger.
+* **doc-scripts** - includes three sources, a long source and two sources that reference each other.
+* **doc-iframes** - includes an iframe with the debugger statements source.
+* **debugger-statements** - inline script with functions for testing stepping.
+
+
+#### Source Maps
+
+* **sourcemaps** - simple case where the map has source contents
+* **sourcemap-bogus** - simple case where the map has source contents
+* **sourcemaps2** - simple case where the map does not have source contents, so we fetch the source
diff --git a/devtools/client/debugger/test/mochitest/examples/asm.js b/devtools/client/debugger/test/mochitest/examples/asm.js
new file mode 100644
index 0000000000..6ad5a620ed
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/asm.js
@@ -0,0 +1,10 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+var asmjs = (function() {
+ "use asm";
+ function f() {
+ return 1 | 0;
+ }
+ return { f: f };
+})();
diff --git a/devtools/client/debugger/test/mochitest/examples/async.js b/devtools/client/debugger/test/mochitest/examples/async.js
new file mode 100644
index 0000000000..73d1675b86
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/async.js
@@ -0,0 +1,10 @@
+async function thing(inc) {
+ return new Promise(resolve => {
+ setTimeout(resolve, 10);
+ });
+}
+
+async function main() {
+ await thing(1);
+ await thing(2);
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/big-sourcemap.html b/devtools/client/debugger/test/mochitest/examples/big-sourcemap.html
new file mode 100644
index 0000000000..d87e5a6508
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/big-sourcemap.html
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<html lang="en"><head>
+<meta http-equiv="content-type" content="text/html; charset=UTF-8">
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
+ <meta name="theme-color" content="#000000">
+ <!--
+ manifest.json provides metadata used when your web app is added to the
+ homescreen on Android. See https://developers.google.com/web/fundamentals/engage-and-retain/web-app-manifest/
+ -->
+ <link rel="manifest" href="http://localhost:3000/manifest.json">
+ <!--
+ Notice the use of in the tags above.
+ It will be replaced with the URL of the `public` folder during the build.
+ Only files inside the `public` folder can be referenced from the HTML.
+
+ Unlike "/favicon.ico" or "favicon.ico", "/favicon.ico" will
+ work correctly both with client-side routing and a non-root public URL.
+ Learn how to configure a non-root public URL by running `npm run build`.
+ -->
+ <title>React App</title>
+ </head>
+ <body>
+ <noscript>
+ You need to enable JavaScript to run this app.
+ </noscript>
+ <div id="root"><div class="App"><header class="App-header"><h1 class="App-title">Welcome to React</h1></header><p class="App-intro">To get started, edit <code>src/App.js</code> and save to reload.</p></div></div>
+ <!--
+ This HTML file is a template.
+ If you open it directly in the browser, you will see an empty page.
+
+ You can add webfonts, meta tags, or analytics to this file.
+ The build step will place the bundled scripts into the <body> tag.
+
+ To begin the development, run `npm start` or `yarn start`.
+ To create a production bundle, use `npm run build` or `yarn build`.
+ -->
+ <script type="text/javascript" src="big-sourcemap_files/bundle.js"></script>
+
+</body></html> \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/big-sourcemap_files/bundle.js b/devtools/client/debugger/test/mochitest/examples/big-sourcemap_files/bundle.js
new file mode 100644
index 0000000000..b853171f2f
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/big-sourcemap_files/bundle.js
@@ -0,0 +1,53505 @@
+/******/ (function(modules) {
+ // webpackBootstrap
+ /******/ function hotDisposeChunk(chunkId) {
+ /******/ delete installedChunks[chunkId];
+ /******/
+ }
+ /******/ var parentHotUpdateCallback = this["webpackHotUpdate"];
+ /******/ this[
+ "webpackHotUpdate"
+ ] = /******/ function webpackHotUpdateCallback(chunkId, moreModules) {
+ // eslint-disable-line no-unused-vars
+ /******/ hotAddUpdateChunk(chunkId, moreModules);
+ /******/ if (parentHotUpdateCallback)
+ parentHotUpdateCallback(chunkId, moreModules);
+ /******/
+ };
+ /******/
+
+ /******/ function hotDownloadUpdateChunk(chunkId) {
+ // eslint-disable-line no-unused-vars
+ /******/ var head = document.getElementsByTagName("head")[0];
+ /******/ var script = document.createElement("script");
+ /******/ script.type = "text/javascript";
+ /******/ script.charset = "utf-8";
+ /******/ script.src =
+ __webpack_require__.p +
+ "" +
+ chunkId +
+ "." +
+ hotCurrentHash +
+ ".hot-update.js";
+ /******/ /******/ head.appendChild(script);
+ /******/
+ }
+ /******/
+
+ /******/ function hotDownloadManifest(requestTimeout) {
+ // eslint-disable-line no-unused-vars
+ /******/ requestTimeout = requestTimeout || 10000;
+ /******/ return new Promise(function(resolve, reject) {
+ /******/ if (typeof XMLHttpRequest === "undefined")
+ /******/ return reject(new Error("No browser support"));
+ /******/ try {
+ /******/ var request = new XMLHttpRequest();
+ /******/ var requestPath =
+ __webpack_require__.p + "" + hotCurrentHash + ".hot-update.json";
+ /******/ request.open("GET", requestPath, true);
+ /******/ request.timeout = requestTimeout;
+ /******/ request.send(null);
+ /******/
+ } catch (err) {
+ /******/ return reject(err);
+ /******/
+ }
+ /******/ request.onreadystatechange = function() {
+ /******/ if (request.readyState !== 4) return;
+ /******/ if (request.status === 0) {
+ /******/ // timeout
+ /******/ reject(
+ new Error("Manifest request to " + requestPath + " timed out.")
+ );
+ /******/
+ } else if (request.status === 404) {
+ /******/ // no update available
+ /******/ resolve();
+ /******/
+ } else if (request.status !== 200 && request.status !== 304) {
+ /******/ // other failure
+ /******/ reject(
+ new Error("Manifest request to " + requestPath + " failed.")
+ );
+ /******/
+ } else {
+ /******/ // success
+ /******/ try {
+ /******/ var update = JSON.parse(request.responseText);
+ /******/
+ } catch (e) {
+ /******/ reject(e);
+ /******/ return;
+ /******/
+ }
+ /******/ resolve(update);
+ /******/
+ }
+ /******/
+ };
+ /******/
+ });
+ /******/
+ }
+ /******/
+ /******/
+
+ /******/
+
+ /******/ var hotApplyOnUpdate = true;
+ /******/ var hotCurrentHash = "cbd3f28b2666e547679d"; // eslint-disable-line no-unused-vars
+ /******/ var hotRequestTimeout = 10000;
+ /******/ var hotCurrentModuleData = {};
+ /******/ var hotCurrentChildModule; // eslint-disable-line no-unused-vars
+ /******/ var hotCurrentParents = []; // eslint-disable-line no-unused-vars
+ /******/ var hotCurrentParentsTemp = []; // eslint-disable-line no-unused-vars
+ /******/
+
+ /******/ function hotCreateRequire(moduleId) {
+ // eslint-disable-line no-unused-vars
+ /******/ var me = installedModules[moduleId];
+ /******/ if (!me) return __webpack_require__;
+ /******/ var fn = function(request) {
+ /******/ if (me.hot.active) {
+ /******/ if (installedModules[request]) {
+ /******/ if (installedModules[request].parents.indexOf(moduleId) < 0)
+ /******/ installedModules[request].parents.push(moduleId);
+ /******/
+ } else {
+ /******/ hotCurrentParents = [moduleId];
+ /******/ hotCurrentChildModule = request;
+ /******/
+ }
+ /******/ if (me.children.indexOf(request) < 0)
+ /******/ me.children.push(request);
+ /******/
+ } else {
+ /******/ console.warn(
+ "[HMR] unexpected require(" +
+ request +
+ ") from disposed module " +
+ moduleId
+ );
+ /******/ hotCurrentParents = [];
+ /******/
+ }
+ /******/ return __webpack_require__(request);
+ /******/
+ };
+ /******/ var ObjectFactory = function ObjectFactory(name) {
+ /******/ return {
+ /******/ configurable: true,
+ /******/ enumerable: true,
+ /******/ get: function() {
+ /******/ return __webpack_require__[name];
+ /******/
+ },
+ /******/ set: function(value) {
+ /******/ __webpack_require__[name] = value;
+ /******/
+ }
+ /******/
+ };
+ /******/
+ };
+ /******/ for (var name in __webpack_require__) {
+ /******/ if (
+ Object.prototype.hasOwnProperty.call(__webpack_require__, name) &&
+ name !== "e"
+ ) {
+ /******/ Object.defineProperty(fn, name, ObjectFactory(name));
+ /******/
+ }
+ /******/
+ }
+ /******/ fn.e = function(chunkId) {
+ /******/ if (hotStatus === "ready") /******/ hotSetStatus("prepare");
+ /******/ hotChunksLoading++;
+ /******/ return __webpack_require__
+ .e(chunkId)
+ .then(finishChunkLoading, function(err) {
+ /******/ finishChunkLoading();
+ /******/ throw err;
+ /******/
+ });
+ /******/
+
+ /******/ function finishChunkLoading() {
+ /******/ hotChunksLoading--;
+ /******/ if (hotStatus === "prepare") {
+ /******/ if (!hotWaitingFilesMap[chunkId]) {
+ /******/ hotEnsureUpdateChunk(chunkId);
+ /******/
+ }
+ /******/ if (hotChunksLoading === 0 && hotWaitingFiles === 0) {
+ /******/ hotUpdateDownloaded();
+ /******/
+ }
+ /******/
+ }
+ /******/
+ }
+ /******/
+ };
+ /******/ return fn;
+ /******/
+ }
+ /******/
+
+ /******/ function hotCreateModule(moduleId) {
+ // eslint-disable-line no-unused-vars
+ /******/ var hot = {
+ /******/ // private stuff
+ /******/ _acceptedDependencies: {},
+ /******/ _declinedDependencies: {},
+ /******/ _selfAccepted: false,
+ /******/ _selfDeclined: false,
+ /******/ _disposeHandlers: [],
+ /******/ _main: hotCurrentChildModule !== moduleId, // Module API
+ /******/
+
+ /******/ /******/ active: true,
+ /******/ accept: function(dep, callback) {
+ /******/ if (typeof dep === "undefined")
+ /******/ hot._selfAccepted = true;
+ else if (typeof dep === "function")
+ /******/ /******/ hot._selfAccepted = dep;
+ else if (typeof dep === "object")
+ /******/ /******/ for (var i = 0; i < dep.length; i++)
+ /******/ hot._acceptedDependencies[dep[i]] =
+ callback || function() {};
+ else
+ /******/ /******/ hot._acceptedDependencies[dep] =
+ callback || function() {};
+ /******/
+ },
+ /******/ decline: function(dep) {
+ /******/ if (typeof dep === "undefined")
+ /******/ hot._selfDeclined = true;
+ else if (typeof dep === "object")
+ /******/ /******/ for (var i = 0; i < dep.length; i++)
+ /******/ hot._declinedDependencies[dep[i]] = true;
+ else /******/ /******/ hot._declinedDependencies[dep] = true;
+ /******/
+ },
+ /******/ dispose: function(callback) {
+ /******/ hot._disposeHandlers.push(callback);
+ /******/
+ },
+ /******/ addDisposeHandler: function(callback) {
+ /******/ hot._disposeHandlers.push(callback);
+ /******/
+ },
+ /******/ removeDisposeHandler: function(callback) {
+ /******/ var idx = hot._disposeHandlers.indexOf(callback);
+ /******/ if (idx >= 0) hot._disposeHandlers.splice(idx, 1);
+ /******/
+ }, // Management API
+ /******/
+
+ /******/ /******/ check: hotCheck,
+ /******/ apply: hotApply,
+ /******/ status: function(l) {
+ /******/ if (!l) return hotStatus;
+ /******/ hotStatusHandlers.push(l);
+ /******/
+ },
+ /******/ addStatusHandler: function(l) {
+ /******/ hotStatusHandlers.push(l);
+ /******/
+ },
+ /******/ removeStatusHandler: function(l) {
+ /******/ var idx = hotStatusHandlers.indexOf(l);
+ /******/ if (idx >= 0) hotStatusHandlers.splice(idx, 1);
+ /******/
+ }, //inherit from previous dispose call
+ /******/
+
+ /******/ /******/ data: hotCurrentModuleData[moduleId]
+ /******/
+ };
+ /******/ hotCurrentChildModule = undefined;
+ /******/ return hot;
+ /******/
+ }
+ /******/
+
+ /******/ var hotStatusHandlers = [];
+ /******/ var hotStatus = "idle";
+ /******/
+
+ /******/ function hotSetStatus(newStatus) {
+ /******/ hotStatus = newStatus;
+ /******/ for (var i = 0; i < hotStatusHandlers.length; i++)
+ /******/ hotStatusHandlers[i].call(null, newStatus);
+ /******/
+ } // while downloading
+ /******/
+
+ /******/ /******/ var hotWaitingFiles = 0;
+ /******/ var hotChunksLoading = 0;
+ /******/ var hotWaitingFilesMap = {};
+ /******/ var hotRequestedFilesMap = {};
+ /******/ var hotAvailableFilesMap = {};
+ /******/ var hotDeferred; // The update info
+ /******/
+
+ /******/ /******/ var hotUpdate, hotUpdateNewHash;
+ /******/
+
+ /******/ function toModuleId(id) {
+ /******/ var isNumber = +id + "" === id;
+ /******/ return isNumber ? +id : id;
+ /******/
+ }
+ /******/
+
+ /******/ function hotCheck(apply) {
+ /******/ if (hotStatus !== "idle")
+ throw new Error("check() is only allowed in idle status");
+ /******/ hotApplyOnUpdate = apply;
+ /******/ hotSetStatus("check");
+ /******/ return hotDownloadManifest(hotRequestTimeout).then(function(
+ update
+ ) {
+ /******/ if (!update) {
+ /******/ hotSetStatus("idle");
+ /******/ return null;
+ /******/
+ }
+ /******/ hotRequestedFilesMap = {};
+ /******/ hotWaitingFilesMap = {};
+ /******/ hotAvailableFilesMap = update.c;
+ /******/ hotUpdateNewHash = update.h;
+ /******/
+
+ /******/ hotSetStatus("prepare");
+ /******/ var promise = new Promise(function(resolve, reject) {
+ /******/ hotDeferred = {
+ /******/ resolve: resolve,
+ /******/ reject: reject
+ /******/
+ };
+ /******/
+ });
+ /******/ hotUpdate = {};
+ /******/ var chunkId = 0;
+ /******/ {
+ // eslint-disable-line no-lone-blocks
+ /******/ /*globals chunkId */
+ /******/ hotEnsureUpdateChunk(chunkId);
+ /******/
+ }
+ /******/ if (
+ hotStatus === "prepare" &&
+ hotChunksLoading === 0 &&
+ hotWaitingFiles === 0
+ ) {
+ /******/ hotUpdateDownloaded();
+ /******/
+ }
+ /******/ return promise;
+ /******/
+ });
+ /******/
+ }
+ /******/
+
+ /******/ function hotAddUpdateChunk(chunkId, moreModules) {
+ // eslint-disable-line no-unused-vars
+ /******/ if (
+ !hotAvailableFilesMap[chunkId] ||
+ !hotRequestedFilesMap[chunkId]
+ )
+ /******/ return;
+ /******/ hotRequestedFilesMap[chunkId] = false;
+ /******/ for (var moduleId in moreModules) {
+ /******/ if (
+ Object.prototype.hasOwnProperty.call(moreModules, moduleId)
+ ) {
+ /******/ hotUpdate[moduleId] = moreModules[moduleId];
+ /******/
+ }
+ /******/
+ }
+ /******/ if (--hotWaitingFiles === 0 && hotChunksLoading === 0) {
+ /******/ hotUpdateDownloaded();
+ /******/
+ }
+ /******/
+ }
+ /******/
+
+ /******/ function hotEnsureUpdateChunk(chunkId) {
+ /******/ if (!hotAvailableFilesMap[chunkId]) {
+ /******/ hotWaitingFilesMap[chunkId] = true;
+ /******/
+ } else {
+ /******/ hotRequestedFilesMap[chunkId] = true;
+ /******/ hotWaitingFiles++;
+ /******/ hotDownloadUpdateChunk(chunkId);
+ /******/
+ }
+ /******/
+ }
+ /******/
+
+ /******/ function hotUpdateDownloaded() {
+ /******/ hotSetStatus("ready");
+ /******/ var deferred = hotDeferred;
+ /******/ hotDeferred = null;
+ /******/ if (!deferred) return;
+ /******/ if (hotApplyOnUpdate) {
+ /******/ // Wrap deferred object in Promise to mark it as a well-handled Promise to
+ /******/ // avoid triggering uncaught exception warning in Chrome.
+ /******/ // See https://bugs.chromium.org/p/chromium/issues/detail?id=465666
+ /******/ Promise.resolve()
+ .then(function() {
+ /******/ return hotApply(hotApplyOnUpdate);
+ /******/
+ })
+ .then(
+ /******/ function(result) {
+ /******/ deferred.resolve(result);
+ /******/
+ },
+ /******/ function(err) {
+ /******/ deferred.reject(err);
+ /******/
+ }
+ /******/
+ );
+ /******/
+ } else {
+ /******/ var outdatedModules = [];
+ /******/ for (var id in hotUpdate) {
+ /******/ if (Object.prototype.hasOwnProperty.call(hotUpdate, id)) {
+ /******/ outdatedModules.push(toModuleId(id));
+ /******/
+ }
+ /******/
+ }
+ /******/ deferred.resolve(outdatedModules);
+ /******/
+ }
+ /******/
+ }
+ /******/
+
+ /******/ function hotApply(options) {
+ /******/ if (hotStatus !== "ready")
+ throw new Error("apply() is only allowed in ready status");
+ /******/ options = options || {};
+ /******/
+
+ /******/ var cb;
+ /******/ var i;
+ /******/ var j;
+ /******/ var module;
+ /******/ var moduleId;
+ /******/
+
+ /******/ function getAffectedStuff(updateModuleId) {
+ /******/ var outdatedModules = [updateModuleId];
+ /******/ var outdatedDependencies = {};
+ /******/
+
+ /******/ var queue = outdatedModules.slice().map(function(id) {
+ /******/ return {
+ /******/ chain: [id],
+ /******/ id: id
+ /******/
+ };
+ /******/
+ });
+ /******/ while (queue.length > 0) {
+ /******/ var queueItem = queue.pop();
+ /******/ var moduleId = queueItem.id;
+ /******/ var chain = queueItem.chain;
+ /******/ module = installedModules[moduleId];
+ /******/ if (!module || module.hot._selfAccepted) /******/ continue;
+ /******/ if (module.hot._selfDeclined) {
+ /******/ return {
+ /******/ type: "self-declined",
+ /******/ chain: chain,
+ /******/ moduleId: moduleId
+ /******/
+ };
+ /******/
+ }
+ /******/ if (module.hot._main) {
+ /******/ return {
+ /******/ type: "unaccepted",
+ /******/ chain: chain,
+ /******/ moduleId: moduleId
+ /******/
+ };
+ /******/
+ }
+ /******/ for (var i = 0; i < module.parents.length; i++) {
+ /******/ var parentId = module.parents[i];
+ /******/ var parent = installedModules[parentId];
+ /******/ if (!parent) continue;
+ /******/ if (parent.hot._declinedDependencies[moduleId]) {
+ /******/ return {
+ /******/ type: "declined",
+ /******/ chain: chain.concat([parentId]),
+ /******/ moduleId: moduleId,
+ /******/ parentId: parentId
+ /******/
+ };
+ /******/
+ }
+ /******/ if (outdatedModules.indexOf(parentId) >= 0) continue;
+ /******/ if (parent.hot._acceptedDependencies[moduleId]) {
+ /******/ if (!outdatedDependencies[parentId])
+ /******/ outdatedDependencies[parentId] = [];
+ /******/ addAllToSet(outdatedDependencies[parentId], [moduleId]);
+ /******/ continue;
+ /******/
+ }
+ /******/ delete outdatedDependencies[parentId];
+ /******/ outdatedModules.push(parentId);
+ /******/ queue.push({
+ /******/ chain: chain.concat([parentId]),
+ /******/ id: parentId
+ /******/
+ });
+ /******/
+ }
+ /******/
+ }
+ /******/
+
+ /******/ return {
+ /******/ type: "accepted",
+ /******/ moduleId: updateModuleId,
+ /******/ outdatedModules: outdatedModules,
+ /******/ outdatedDependencies: outdatedDependencies
+ /******/
+ };
+ /******/
+ }
+ /******/
+
+ /******/ function addAllToSet(a, b) {
+ /******/ for (var i = 0; i < b.length; i++) {
+ /******/ var item = b[i];
+ /******/ if (a.indexOf(item) < 0) /******/ a.push(item);
+ /******/
+ }
+ /******/
+ } // at begin all updates modules are outdated // the "outdated" status can propagate to parents if they don't accept the children
+ /******/
+
+ /******/ /******/ /******/ var outdatedDependencies = {};
+ /******/ var outdatedModules = [];
+ /******/ var appliedUpdate = {};
+ /******/
+
+ /******/ var warnUnexpectedRequire = function warnUnexpectedRequire() {
+ /******/ console.warn(
+ "[HMR] unexpected require(" + result.moduleId + ") to disposed module"
+ );
+ /******/
+ };
+ /******/
+
+ /******/ for (var id in hotUpdate) {
+ /******/ if (Object.prototype.hasOwnProperty.call(hotUpdate, id)) {
+ /******/ moduleId = toModuleId(id);
+ /******/ var result;
+ /******/ if (hotUpdate[id]) {
+ /******/ result = getAffectedStuff(moduleId);
+ /******/
+ } else {
+ /******/ result = {
+ /******/ type: "disposed",
+ /******/ moduleId: id
+ /******/
+ };
+ /******/
+ }
+ /******/ var abortError = false;
+ /******/ var doApply = false;
+ /******/ var doDispose = false;
+ /******/ var chainInfo = "";
+ /******/ if (result.chain) {
+ /******/ chainInfo =
+ "\nUpdate propagation: " + result.chain.join(" -> ");
+ /******/
+ }
+ /******/ switch (result.type) {
+ /******/ case "self-declined":
+ /******/ if (options.onDeclined)
+ /******/ options.onDeclined(result);
+ /******/ if (!options.ignoreDeclined)
+ /******/ abortError = new Error(
+ "Aborted because of self decline: " +
+ result.moduleId +
+ chainInfo
+ );
+ /******/ break;
+ /******/ case "declined":
+ /******/ if (options.onDeclined)
+ /******/ options.onDeclined(result);
+ /******/ if (!options.ignoreDeclined)
+ /******/ abortError = new Error(
+ "Aborted because of declined dependency: " +
+ result.moduleId +
+ " in " +
+ result.parentId +
+ chainInfo
+ );
+ /******/ break;
+ /******/ case "unaccepted":
+ /******/ if (options.onUnaccepted)
+ /******/ options.onUnaccepted(result);
+ /******/ if (!options.ignoreUnaccepted)
+ /******/ abortError = new Error(
+ "Aborted because " + moduleId + " is not accepted" + chainInfo
+ );
+ /******/ break;
+ /******/ case "accepted":
+ /******/ if (options.onAccepted)
+ /******/ options.onAccepted(result);
+ /******/ doApply = true;
+ /******/ break;
+ /******/ case "disposed":
+ /******/ if (options.onDisposed)
+ /******/ options.onDisposed(result);
+ /******/ doDispose = true;
+ /******/ break;
+ /******/ default:
+ /******/ throw new Error("Unexception type " + result.type);
+ /******/
+ }
+ /******/ if (abortError) {
+ /******/ hotSetStatus("abort");
+ /******/ return Promise.reject(abortError);
+ /******/
+ }
+ /******/ if (doApply) {
+ /******/ appliedUpdate[moduleId] = hotUpdate[moduleId];
+ /******/ addAllToSet(outdatedModules, result.outdatedModules);
+ /******/ for (moduleId in result.outdatedDependencies) {
+ /******/ if (
+ Object.prototype.hasOwnProperty.call(
+ result.outdatedDependencies,
+ moduleId
+ )
+ ) {
+ /******/ if (!outdatedDependencies[moduleId])
+ /******/ outdatedDependencies[moduleId] = [];
+ /******/ addAllToSet(
+ outdatedDependencies[moduleId],
+ result.outdatedDependencies[moduleId]
+ );
+ /******/
+ }
+ /******/
+ }
+ /******/
+ }
+ /******/ if (doDispose) {
+ /******/ addAllToSet(outdatedModules, [result.moduleId]);
+ /******/ appliedUpdate[moduleId] = warnUnexpectedRequire;
+ /******/
+ }
+ /******/
+ }
+ /******/
+ } // Store self accepted outdated modules to require them later by the module system
+ /******/
+
+ /******/ /******/ var outdatedSelfAcceptedModules = [];
+ /******/ for (i = 0; i < outdatedModules.length; i++) {
+ /******/ moduleId = outdatedModules[i];
+ /******/ if (
+ installedModules[moduleId] &&
+ installedModules[moduleId].hot._selfAccepted
+ )
+ /******/ outdatedSelfAcceptedModules.push({
+ /******/ module: moduleId,
+ /******/ errorHandler: installedModules[moduleId].hot._selfAccepted
+ /******/
+ });
+ /******/
+ } // Now in "dispose" phase
+ /******/
+
+ /******/ /******/ hotSetStatus("dispose");
+ /******/ Object.keys(hotAvailableFilesMap).forEach(function(chunkId) {
+ /******/ if (hotAvailableFilesMap[chunkId] === false) {
+ /******/ hotDisposeChunk(chunkId);
+ /******/
+ }
+ /******/
+ });
+ /******/
+
+ /******/ var idx;
+ /******/ var queue = outdatedModules.slice();
+ /******/ while (queue.length > 0) {
+ /******/ moduleId = queue.pop();
+ /******/ module = installedModules[moduleId];
+ /******/ if (!module) continue;
+ /******/
+
+ /******/ var data = {}; // Call dispose handlers
+ /******/
+
+ /******/ /******/ var disposeHandlers = module.hot._disposeHandlers;
+ /******/ for (j = 0; j < disposeHandlers.length; j++) {
+ /******/ cb = disposeHandlers[j];
+ /******/ cb(data);
+ /******/
+ }
+ /******/ hotCurrentModuleData[moduleId] = data; // disable module (this disables requires from this module)
+ /******/
+
+ /******/ /******/ module.hot.active = false; // remove module from cache
+ /******/
+
+ /******/ /******/ delete installedModules[moduleId]; // when disposing there is no need to call dispose handler
+ /******/
+
+ /******/ /******/ delete outdatedDependencies[moduleId]; // remove "parents" references from all children
+ /******/
+
+ /******/ /******/ for (j = 0; j < module.children.length; j++) {
+ /******/ var child = installedModules[module.children[j]];
+ /******/ if (!child) continue;
+ /******/ idx = child.parents.indexOf(moduleId);
+ /******/ if (idx >= 0) {
+ /******/ child.parents.splice(idx, 1);
+ /******/
+ }
+ /******/
+ }
+ /******/
+ } // remove outdated dependency from module children
+ /******/
+
+ /******/ /******/ var dependency;
+ /******/ var moduleOutdatedDependencies;
+ /******/ for (moduleId in outdatedDependencies) {
+ /******/ if (
+ Object.prototype.hasOwnProperty.call(outdatedDependencies, moduleId)
+ ) {
+ /******/ module = installedModules[moduleId];
+ /******/ if (module) {
+ /******/ moduleOutdatedDependencies = outdatedDependencies[moduleId];
+ /******/ for (j = 0; j < moduleOutdatedDependencies.length; j++) {
+ /******/ dependency = moduleOutdatedDependencies[j];
+ /******/ idx = module.children.indexOf(dependency);
+ /******/ if (idx >= 0) module.children.splice(idx, 1);
+ /******/
+ }
+ /******/
+ }
+ /******/
+ }
+ /******/
+ } // Not in "apply" phase
+ /******/
+
+ /******/ /******/ hotSetStatus("apply");
+ /******/
+
+ /******/ hotCurrentHash = hotUpdateNewHash; // insert new code
+ /******/
+
+ /******/ /******/ for (moduleId in appliedUpdate) {
+ /******/ if (
+ Object.prototype.hasOwnProperty.call(appliedUpdate, moduleId)
+ ) {
+ /******/ modules[moduleId] = appliedUpdate[moduleId];
+ /******/
+ }
+ /******/
+ } // call accept handlers
+ /******/
+
+ /******/ /******/ var error = null;
+ /******/ for (moduleId in outdatedDependencies) {
+ /******/ if (
+ Object.prototype.hasOwnProperty.call(outdatedDependencies, moduleId)
+ ) {
+ /******/ module = installedModules[moduleId];
+ /******/ if (module) {
+ /******/ moduleOutdatedDependencies = outdatedDependencies[moduleId];
+ /******/ var callbacks = [];
+ /******/ for (i = 0; i < moduleOutdatedDependencies.length; i++) {
+ /******/ dependency = moduleOutdatedDependencies[i];
+ /******/ cb = module.hot._acceptedDependencies[dependency];
+ /******/ if (cb) {
+ /******/ if (callbacks.indexOf(cb) >= 0) continue;
+ /******/ callbacks.push(cb);
+ /******/
+ }
+ /******/
+ }
+ /******/ for (i = 0; i < callbacks.length; i++) {
+ /******/ cb = callbacks[i];
+ /******/ try {
+ /******/ cb(moduleOutdatedDependencies);
+ /******/
+ } catch (err) {
+ /******/ if (options.onErrored) {
+ /******/ options.onErrored({
+ /******/ type: "accept-errored",
+ /******/ moduleId: moduleId,
+ /******/ dependencyId: moduleOutdatedDependencies[i],
+ /******/ error: err
+ /******/
+ });
+ /******/
+ }
+ /******/ if (!options.ignoreErrored) {
+ /******/ if (!error) /******/ error = err;
+ /******/
+ }
+ /******/
+ }
+ /******/
+ }
+ /******/
+ }
+ /******/
+ }
+ /******/
+ } // Load self accepted modules
+ /******/
+
+ /******/ /******/ for (i = 0; i < outdatedSelfAcceptedModules.length; i++) {
+ /******/ var item = outdatedSelfAcceptedModules[i];
+ /******/ moduleId = item.module;
+ /******/ hotCurrentParents = [moduleId];
+ /******/ try {
+ /******/ __webpack_require__(moduleId);
+ /******/
+ } catch (err) {
+ /******/ if (typeof item.errorHandler === "function") {
+ /******/ try {
+ /******/ item.errorHandler(err);
+ /******/
+ } catch (err2) {
+ /******/ if (options.onErrored) {
+ /******/ options.onErrored({
+ /******/ type: "self-accept-error-handler-errored",
+ /******/ moduleId: moduleId,
+ /******/ error: err2,
+ /******/ orginalError: err, // TODO remove in webpack 4
+ /******/ originalError: err
+ /******/
+ });
+ /******/
+ }
+ /******/ if (!options.ignoreErrored) {
+ /******/ if (!error) /******/ error = err2;
+ /******/
+ }
+ /******/ if (!error) /******/ error = err;
+ /******/
+ }
+ /******/
+ } else {
+ /******/ if (options.onErrored) {
+ /******/ options.onErrored({
+ /******/ type: "self-accept-errored",
+ /******/ moduleId: moduleId,
+ /******/ error: err
+ /******/
+ });
+ /******/
+ }
+ /******/ if (!options.ignoreErrored) {
+ /******/ if (!error) /******/ error = err;
+ /******/
+ }
+ /******/
+ }
+ /******/
+ }
+ /******/
+ } // handle errors in accept handlers and self accepted module load
+ /******/
+
+ /******/ /******/ if (error) {
+ /******/ hotSetStatus("fail");
+ /******/ return Promise.reject(error);
+ /******/
+ }
+ /******/
+
+ /******/ hotSetStatus("idle");
+ /******/ return new Promise(function(resolve) {
+ /******/ resolve(outdatedModules);
+ /******/
+ });
+ /******/
+ } // The module cache
+ /******/
+ /******/ /******/ var installedModules = {}; // The require function
+ /******/
+ /******/ /******/ function __webpack_require__(moduleId) {
+ /******/
+ /******/ // Check if module is in cache
+ /******/ if (installedModules[moduleId]) {
+ /******/ return installedModules[moduleId].exports;
+ /******/
+ } // Create a new module (and put it into the cache)
+ /******/ /******/ var module = (installedModules[moduleId] = {
+ /******/ i: moduleId,
+ /******/ l: false,
+ /******/ exports: {},
+ /******/ hot: hotCreateModule(moduleId),
+ /******/ parents: ((hotCurrentParentsTemp = hotCurrentParents),
+ (hotCurrentParents = []),
+ hotCurrentParentsTemp),
+ /******/ children: []
+ /******/
+ }); // Execute the module function
+ /******/
+ /******/ /******/ modules[moduleId].call(
+ module.exports,
+ module,
+ module.exports,
+ hotCreateRequire(moduleId)
+ ); // Flag the module as loaded
+ /******/
+ /******/ /******/ module.l = true; // Return the exports of the module
+ /******/
+ /******/ /******/ return module.exports;
+ /******/
+ } // expose the modules object (__webpack_modules__)
+ /******/
+ /******/
+ /******/ /******/ __webpack_require__.m = modules; // expose the module cache
+ /******/
+ /******/ /******/ __webpack_require__.c = installedModules; // define getter function for harmony exports
+ /******/
+ /******/ /******/ __webpack_require__.d = function(exports, name, getter) {
+ /******/ if (!__webpack_require__.o(exports, name)) {
+ /******/ Object.defineProperty(exports, name, {
+ /******/ configurable: false,
+ /******/ enumerable: true,
+ /******/ get: getter
+ /******/
+ });
+ /******/
+ }
+ /******/
+ }; // getDefaultExport function for compatibility with non-harmony modules
+ /******/
+ /******/ /******/ __webpack_require__.n = function(module) {
+ /******/ var getter =
+ module && module.__esModule
+ ? /******/ function getDefault() {
+ return module["default"];
+ }
+ : /******/ function getModuleExports() {
+ return module;
+ };
+ /******/ __webpack_require__.d(getter, "a", getter);
+ /******/ return getter;
+ /******/
+ }; // Object.prototype.hasOwnProperty.call
+ /******/
+ /******/ /******/ __webpack_require__.o = function(object, property) {
+ return Object.prototype.hasOwnProperty.call(object, property);
+ }; // __webpack_public_path__
+ /******/
+ /******/ /******/ __webpack_require__.p = "/"; // __webpack_hash__
+ /******/
+ /******/ /******/ __webpack_require__.h = function() {
+ return hotCurrentHash;
+ }; // Load entry module and return exports
+ /******/
+ /******/ /******/ return hotCreateRequire(0)((__webpack_require__.s = 0));
+ /******/
+})(
+ /************************************************************************/
+ /******/ {
+ /***/ "./node_modules/ansi-regex/index.js":
+ /*!******************************************!*\
+ !*** ./node_modules/ansi-regex/index.js ***!
+ \******************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ module.exports = function() {
+ return /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-PRZcf-nqry=><]/g;
+ };
+
+ /***/
+ },
+
+ /***/ "./node_modules/ansi-styles/index.js":
+ /*!*******************************************!*\
+ !*** ./node_modules/ansi-styles/index.js ***!
+ \*******************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /* WEBPACK VAR INJECTION */ (function(module) {
+ function assembleStyles() {
+ var styles = {
+ modifiers: {
+ reset: [0, 0],
+ bold: [1, 22], // 21 isn't widely supported and 22 does the same thing
+ dim: [2, 22],
+ italic: [3, 23],
+ underline: [4, 24],
+ inverse: [7, 27],
+ hidden: [8, 28],
+ strikethrough: [9, 29]
+ },
+ colors: {
+ black: [30, 39],
+ red: [31, 39],
+ green: [32, 39],
+ yellow: [33, 39],
+ blue: [34, 39],
+ magenta: [35, 39],
+ cyan: [36, 39],
+ white: [37, 39],
+ gray: [90, 39]
+ },
+ bgColors: {
+ bgBlack: [40, 49],
+ bgRed: [41, 49],
+ bgGreen: [42, 49],
+ bgYellow: [43, 49],
+ bgBlue: [44, 49],
+ bgMagenta: [45, 49],
+ bgCyan: [46, 49],
+ bgWhite: [47, 49]
+ }
+ };
+
+ // fix humans
+ styles.colors.grey = styles.colors.gray;
+
+ Object.keys(styles).forEach(function(groupName) {
+ var group = styles[groupName];
+
+ Object.keys(group).forEach(function(styleName) {
+ var style = group[styleName];
+
+ styles[styleName] = group[styleName] = {
+ open: "\u001b[" + style[0] + "m",
+ close: "\u001b[" + style[1] + "m"
+ };
+ });
+
+ Object.defineProperty(styles, groupName, {
+ value: group,
+ enumerable: false
+ });
+ });
+
+ return styles;
+ }
+
+ Object.defineProperty(module, "exports", {
+ enumerable: true,
+ get: assembleStyles
+ });
+
+ /* WEBPACK VAR INJECTION */
+ }.call(
+ exports,
+ __webpack_require__(
+ /*! ./../webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js"
+ )(module)
+ ));
+
+ /***/
+ },
+
+ /***/ "./node_modules/asap/browser-raw.js":
+ /*!******************************************!*\
+ !*** ./node_modules/asap/browser-raw.js ***!
+ \******************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /* WEBPACK VAR INJECTION */ (function(global) {
+ // Use the fastest means possible to execute a task in its own turn, with
+ // priority over other events including IO, animation, reflow, and redraw
+ // events in browsers.
+ //
+ // An exception thrown by a task will permanently interrupt the processing of
+ // subsequent tasks. The higher level `asap` function ensures that if an
+ // exception is thrown by a task, that the task queue will continue flushing as
+ // soon as possible, but if you use `rawAsap` directly, you are responsible to
+ // either ensure that no exceptions are thrown from your task, or to manually
+ // call `rawAsap.requestFlush` if an exception is thrown.
+ module.exports = rawAsap;
+ function rawAsap(task) {
+ if (!queue.length) {
+ requestFlush();
+ flushing = true;
+ }
+ // Equivalent to push, but avoids a function call.
+ queue[queue.length] = task;
+ }
+
+ var queue = [];
+ // Once a flush has been requested, no further calls to `requestFlush` are
+ // necessary until the next `flush` completes.
+ var flushing = false;
+ // `requestFlush` is an implementation-specific method that attempts to kick
+ // off a `flush` event as quickly as possible. `flush` will attempt to exhaust
+ // the event queue before yielding to the browser's own event loop.
+ var requestFlush;
+ // The position of the next task to execute in the task queue. This is
+ // preserved between calls to `flush` so that it can be resumed if
+ // a task throws an exception.
+ var index = 0;
+ // If a task schedules additional tasks recursively, the task queue can grow
+ // unbounded. To prevent memory exhaustion, the task queue will periodically
+ // truncate already-completed tasks.
+ var capacity = 1024;
+
+ // The flush function processes all tasks that have been scheduled with
+ // `rawAsap` unless and until one of those tasks throws an exception.
+ // If a task throws an exception, `flush` ensures that its state will remain
+ // consistent and will resume where it left off when called again.
+ // However, `flush` does not make any arrangements to be called again if an
+ // exception is thrown.
+ function flush() {
+ while (index < queue.length) {
+ var currentIndex = index;
+ // Advance the index before calling the task. This ensures that we will
+ // begin flushing on the next task the task throws an error.
+ index = index + 1;
+ queue[currentIndex].call();
+ // Prevent leaking memory for long chains of recursive calls to `asap`.
+ // If we call `asap` within tasks scheduled by `asap`, the queue will
+ // grow, but to avoid an O(n) walk for every task we execute, we don't
+ // shift tasks off the queue after they have been executed.
+ // Instead, we periodically shift 1024 tasks off the queue.
+ if (index > capacity) {
+ // Manually shift all values starting at the index back to the
+ // beginning of the queue.
+ for (
+ var scan = 0, newLength = queue.length - index;
+ scan < newLength;
+ scan++
+ ) {
+ queue[scan] = queue[scan + index];
+ }
+ queue.length -= index;
+ index = 0;
+ }
+ }
+ queue.length = 0;
+ index = 0;
+ flushing = false;
+ }
+
+ // `requestFlush` is implemented using a strategy based on data collected from
+ // every available SauceLabs Selenium web driver worker at time of writing.
+ // https://docs.google.com/spreadsheets/d/1mG-5UYGup5qxGdEMWkhP6BWCz053NUb2E1QoUTU16uA/edit#gid=783724593
+
+ // Safari 6 and 6.1 for desktop, iPad, and iPhone are the only browsers that
+ // have WebKitMutationObserver but not un-prefixed MutationObserver.
+ // Must use `global` or `self` instead of `window` to work in both frames and web
+ // workers. `global` is a provision of Browserify, Mr, Mrs, or Mop.
+
+ /* globals self */
+ var scope = typeof global !== "undefined" ? global : self;
+ var BrowserMutationObserver =
+ scope.MutationObserver || scope.WebKitMutationObserver;
+
+ // MutationObservers are desirable because they have high priority and work
+ // reliably everywhere they are implemented.
+ // They are implemented in all modern browsers.
+ //
+ // - Android 4-4.3
+ // - Chrome 26-34
+ // - Firefox 14-29
+ // - Internet Explorer 11
+ // - iPad Safari 6-7.1
+ // - iPhone Safari 7-7.1
+ // - Safari 6-7
+ if (typeof BrowserMutationObserver === "function") {
+ requestFlush = makeRequestCallFromMutationObserver(flush);
+
+ // MessageChannels are desirable because they give direct access to the HTML
+ // task queue, are implemented in Internet Explorer 10, Safari 5.0-1, and Opera
+ // 11-12, and in web workers in many engines.
+ // Although message channels yield to any queued rendering and IO tasks, they
+ // would be better than imposing the 4ms delay of timers.
+ // However, they do not work reliably in Internet Explorer or Safari.
+
+ // Internet Explorer 10 is the only browser that has setImmediate but does
+ // not have MutationObservers.
+ // Although setImmediate yields to the browser's renderer, it would be
+ // preferrable to falling back to setTimeout since it does not have
+ // the minimum 4ms penalty.
+ // Unfortunately there appears to be a bug in Internet Explorer 10 Mobile (and
+ // Desktop to a lesser extent) that renders both setImmediate and
+ // MessageChannel useless for the purposes of ASAP.
+ // https://github.com/kriskowal/q/issues/396
+
+ // Timers are implemented universally.
+ // We fall back to timers in workers in most engines, and in foreground
+ // contexts in the following browsers.
+ // However, note that even this simple case requires nuances to operate in a
+ // broad spectrum of browsers.
+ //
+ // - Firefox 3-13
+ // - Internet Explorer 6-9
+ // - iPad Safari 4.3
+ // - Lynx 2.8.7
+ } else {
+ requestFlush = makeRequestCallFromTimer(flush);
+ }
+
+ // `requestFlush` requests that the high priority event queue be flushed as
+ // soon as possible.
+ // This is useful to prevent an error thrown in a task from stalling the event
+ // queue if the exception handled by Node.js’s
+ // `process.on("uncaughtException")` or by a domain.
+ rawAsap.requestFlush = requestFlush;
+
+ // To request a high priority event, we induce a mutation observer by toggling
+ // the text of a text node between "1" and "-1".
+ function makeRequestCallFromMutationObserver(callback) {
+ var toggle = 1;
+ var observer = new BrowserMutationObserver(callback);
+ var node = document.createTextNode("");
+ observer.observe(node, { characterData: true });
+ return function requestCall() {
+ toggle = -toggle;
+ node.data = toggle;
+ };
+ }
+
+ // The message channel technique was discovered by Malte Ubl and was the
+ // original foundation for this library.
+ // http://www.nonblocking.io/2011/06/windownexttick.html
+
+ // Safari 6.0.5 (at least) intermittently fails to create message ports on a
+ // page's first load. Thankfully, this version of Safari supports
+ // MutationObservers, so we don't need to fall back in that case.
+
+ // function makeRequestCallFromMessageChannel(callback) {
+ // var channel = new MessageChannel();
+ // channel.port1.onmessage = callback;
+ // return function requestCall() {
+ // channel.port2.postMessage(0);
+ // };
+ // }
+
+ // For reasons explained above, we are also unable to use `setImmediate`
+ // under any circumstances.
+ // Even if we were, there is another bug in Internet Explorer 10.
+ // It is not sufficient to assign `setImmediate` to `requestFlush` because
+ // `setImmediate` must be called *by name* and therefore must be wrapped in a
+ // closure.
+ // Never forget.
+
+ // function makeRequestCallFromSetImmediate(callback) {
+ // return function requestCall() {
+ // setImmediate(callback);
+ // };
+ // }
+
+ // Safari 6.0 has a problem where timers will get lost while the user is
+ // scrolling. This problem does not impact ASAP because Safari 6.0 supports
+ // mutation observers, so that implementation is used instead.
+ // However, if we ever elect to use timers in Safari, the prevalent work-around
+ // is to add a scroll event listener that calls for a flush.
+
+ // `setTimeout` does not call the passed callback if the delay is less than
+ // approximately 7 in web workers in Firefox 8 through 18, and sometimes not
+ // even then.
+
+ function makeRequestCallFromTimer(callback) {
+ return function requestCall() {
+ // We dispatch a timeout with a specified delay of 0 for engines that
+ // can reliably accommodate that request. This will usually be snapped
+ // to a 4 milisecond delay, but once we're flushing, there's no delay
+ // between events.
+ var timeoutHandle = setTimeout(handleTimer, 0);
+ // However, since this timer gets frequently dropped in Firefox
+ // workers, we enlist an interval handle that will try to fire
+ // an event 20 times per second until it succeeds.
+ var intervalHandle = setInterval(handleTimer, 50);
+
+ function handleTimer() {
+ // Whichever timer succeeds will cancel both timers and
+ // execute the callback.
+ clearTimeout(timeoutHandle);
+ clearInterval(intervalHandle);
+ callback();
+ }
+ };
+ }
+
+ // This is for `asap.js` only.
+ // Its name will be periodically randomized to break any code that depends on
+ // its existence.
+ rawAsap.makeRequestCallFromTimer = makeRequestCallFromTimer;
+
+ // ASAP was originally a nextTick shim included in Q. This was factored out
+ // into this ASAP package. It was later adapted to RSVP which made further
+ // amendments. These decisions, particularly to marginalize MessageChannel and
+ // to capture the MutationObserver implementation in a closure, were integrated
+ // back into ASAP proper.
+ // https://github.com/tildeio/rsvp.js/blob/cddf7232546a9cf858524b75cde6f9edf72620a7/lib/rsvp/asap.js
+
+ /* WEBPACK VAR INJECTION */
+ }.call(
+ exports,
+ __webpack_require__(
+ /*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"
+ )
+ ));
+
+ /***/
+ },
+
+ /***/ "./node_modules/escape-string-regexp/index.js":
+ /*!****************************************************!*\
+ !*** ./node_modules/escape-string-regexp/index.js ***!
+ \****************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g;
+
+ module.exports = function(str) {
+ if (typeof str !== "string") {
+ throw new TypeError("Expected a string");
+ }
+
+ return str.replace(matchOperatorsRe, "\\$&");
+ };
+
+ /***/
+ },
+
+ /***/ "./node_modules/fbjs/lib/EventListener.js":
+ /*!************************************************!*\
+ !*** ./node_modules/fbjs/lib/EventListener.js ***!
+ \************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ /**
+ * Copyright (c) 2013-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ * @typechecks
+ */
+
+ var emptyFunction = __webpack_require__(
+ /*! ./emptyFunction */ "./node_modules/fbjs/lib/emptyFunction.js"
+ );
+
+ /**
+ * Upstream version of event listener. Does not take into account specific
+ * nature of platform.
+ */
+ var EventListener = {
+ /**
+ * Listen to DOM events during the bubble phase.
+ *
+ * @param {DOMEventTarget} target DOM element to register listener on.
+ * @param {string} eventType Event type, e.g. 'click' or 'mouseover'.
+ * @param {function} callback Callback function.
+ * @return {object} Object with a `remove` method.
+ */
+ listen: function listen(target, eventType, callback) {
+ if (target.addEventListener) {
+ target.addEventListener(eventType, callback, false);
+ return {
+ remove: function remove() {
+ target.removeEventListener(eventType, callback, false);
+ }
+ };
+ } else if (target.attachEvent) {
+ target.attachEvent("on" + eventType, callback);
+ return {
+ remove: function remove() {
+ target.detachEvent("on" + eventType, callback);
+ }
+ };
+ }
+ },
+
+ /**
+ * Listen to DOM events during the capture phase.
+ *
+ * @param {DOMEventTarget} target DOM element to register listener on.
+ * @param {string} eventType Event type, e.g. 'click' or 'mouseover'.
+ * @param {function} callback Callback function.
+ * @return {object} Object with a `remove` method.
+ */
+ capture: function capture(target, eventType, callback) {
+ if (target.addEventListener) {
+ target.addEventListener(eventType, callback, true);
+ return {
+ remove: function remove() {
+ target.removeEventListener(eventType, callback, true);
+ }
+ };
+ } else {
+ if (true) {
+ console.error(
+ "Attempted to listen to events during the capture phase on a " +
+ "browser that does not support the capture phase. Your application " +
+ "will not receive some events."
+ );
+ }
+ return {
+ remove: emptyFunction
+ };
+ }
+ },
+
+ registerDefault: function registerDefault() {}
+ };
+
+ module.exports = EventListener;
+
+ /***/
+ },
+
+ /***/ "./node_modules/fbjs/lib/ExecutionEnvironment.js":
+ /*!*******************************************************!*\
+ !*** ./node_modules/fbjs/lib/ExecutionEnvironment.js ***!
+ \*******************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /**
+ * Copyright (c) 2013-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ */
+
+ var canUseDOM = !!(
+ typeof window !== "undefined" &&
+ window.document &&
+ window.document.createElement
+ );
+
+ /**
+ * Simple, lightweight module assisting with the detection and context of
+ * Worker. Helps avoid circular dependencies and allows code to reason about
+ * whether or not they are in a Worker, even if they never include the main
+ * `ReactWorker` dependency.
+ */
+ var ExecutionEnvironment = {
+ canUseDOM: canUseDOM,
+
+ canUseWorkers: typeof Worker !== "undefined",
+
+ canUseEventListeners:
+ canUseDOM && !!(window.addEventListener || window.attachEvent),
+
+ canUseViewport: canUseDOM && !!window.screen,
+
+ isInWorker: !canUseDOM // For now, this is true - might change in the future.
+ };
+
+ module.exports = ExecutionEnvironment;
+
+ /***/
+ },
+
+ /***/ "./node_modules/fbjs/lib/camelize.js":
+ /*!*******************************************!*\
+ !*** ./node_modules/fbjs/lib/camelize.js ***!
+ \*******************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ /**
+ * Copyright (c) 2013-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ * @typechecks
+ */
+
+ var _hyphenPattern = /-(.)/g;
+
+ /**
+ * Camelcases a hyphenated string, for example:
+ *
+ * > camelize('background-color')
+ * < "backgroundColor"
+ *
+ * @param {string} string
+ * @return {string}
+ */
+ function camelize(string) {
+ return string.replace(_hyphenPattern, function(_, character) {
+ return character.toUpperCase();
+ });
+ }
+
+ module.exports = camelize;
+
+ /***/
+ },
+
+ /***/ "./node_modules/fbjs/lib/camelizeStyleName.js":
+ /*!****************************************************!*\
+ !*** ./node_modules/fbjs/lib/camelizeStyleName.js ***!
+ \****************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /**
+ * Copyright (c) 2013-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ * @typechecks
+ */
+
+ var camelize = __webpack_require__(
+ /*! ./camelize */ "./node_modules/fbjs/lib/camelize.js"
+ );
+
+ var msPattern = /^-ms-/;
+
+ /**
+ * Camelcases a hyphenated CSS property name, for example:
+ *
+ * > camelizeStyleName('background-color')
+ * < "backgroundColor"
+ * > camelizeStyleName('-moz-transition')
+ * < "MozTransition"
+ * > camelizeStyleName('-ms-transition')
+ * < "msTransition"
+ *
+ * As Andi Smith suggests
+ * (http://www.andismith.com/blog/2012/02/modernizr-prefixed/), an `-ms` prefix
+ * is converted to lowercase `ms`.
+ *
+ * @param {string} string
+ * @return {string}
+ */
+ function camelizeStyleName(string) {
+ return camelize(string.replace(msPattern, "ms-"));
+ }
+
+ module.exports = camelizeStyleName;
+
+ /***/
+ },
+
+ /***/ "./node_modules/fbjs/lib/containsNode.js":
+ /*!***********************************************!*\
+ !*** ./node_modules/fbjs/lib/containsNode.js ***!
+ \***********************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ /**
+ * Copyright (c) 2013-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ *
+ */
+
+ var isTextNode = __webpack_require__(
+ /*! ./isTextNode */ "./node_modules/fbjs/lib/isTextNode.js"
+ );
+
+ /*eslint-disable no-bitwise */
+
+ /**
+ * Checks if a given DOM node contains or is another DOM node.
+ */
+ function containsNode(outerNode, innerNode) {
+ if (!outerNode || !innerNode) {
+ return false;
+ } else if (outerNode === innerNode) {
+ return true;
+ } else if (isTextNode(outerNode)) {
+ return false;
+ } else if (isTextNode(innerNode)) {
+ return containsNode(outerNode, innerNode.parentNode);
+ } else if ("contains" in outerNode) {
+ return outerNode.contains(innerNode);
+ } else if (outerNode.compareDocumentPosition) {
+ return !!(outerNode.compareDocumentPosition(innerNode) & 16);
+ } else {
+ return false;
+ }
+ }
+
+ module.exports = containsNode;
+
+ /***/
+ },
+
+ /***/ "./node_modules/fbjs/lib/emptyFunction.js":
+ /*!************************************************!*\
+ !*** ./node_modules/fbjs/lib/emptyFunction.js ***!
+ \************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ /**
+ * Copyright (c) 2013-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ *
+ */
+
+ function makeEmptyFunction(arg) {
+ return function() {
+ return arg;
+ };
+ }
+
+ /**
+ * This function accepts and discards inputs; it has no side effects. This is
+ * primarily useful idiomatically for overridable function endpoints which
+ * always need to be callable, since JS lacks a null-call idiom ala Cocoa.
+ */
+ var emptyFunction = function emptyFunction() {};
+
+ emptyFunction.thatReturns = makeEmptyFunction;
+ emptyFunction.thatReturnsFalse = makeEmptyFunction(false);
+ emptyFunction.thatReturnsTrue = makeEmptyFunction(true);
+ emptyFunction.thatReturnsNull = makeEmptyFunction(null);
+ emptyFunction.thatReturnsThis = function() {
+ return this;
+ };
+ emptyFunction.thatReturnsArgument = function(arg) {
+ return arg;
+ };
+
+ module.exports = emptyFunction;
+
+ /***/
+ },
+
+ /***/ "./node_modules/fbjs/lib/emptyObject.js":
+ /*!**********************************************!*\
+ !*** ./node_modules/fbjs/lib/emptyObject.js ***!
+ \**********************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /**
+ * Copyright (c) 2013-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ */
+
+ var emptyObject = {};
+
+ if (true) {
+ Object.freeze(emptyObject);
+ }
+
+ module.exports = emptyObject;
+
+ /***/
+ },
+
+ /***/ "./node_modules/fbjs/lib/focusNode.js":
+ /*!********************************************!*\
+ !*** ./node_modules/fbjs/lib/focusNode.js ***!
+ \********************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /**
+ * Copyright (c) 2013-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ */
+
+ /**
+ * @param {DOMElement} node input/textarea to focus
+ */
+
+ function focusNode(node) {
+ // IE8 can throw "Can't move focus to the control because it is invisible,
+ // not enabled, or of a type that does not accept the focus." for all kinds of
+ // reasons that are too expensive and fragile to test.
+ try {
+ node.focus();
+ } catch (e) {}
+ }
+
+ module.exports = focusNode;
+
+ /***/
+ },
+
+ /***/ "./node_modules/fbjs/lib/getActiveElement.js":
+ /*!***************************************************!*\
+ !*** ./node_modules/fbjs/lib/getActiveElement.js ***!
+ \***************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ /**
+ * Copyright (c) 2013-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ * @typechecks
+ */
+
+ /* eslint-disable fb-www/typeof-undefined */
+
+ /**
+ * Same as document.activeElement but wraps in a try-catch block. In IE it is
+ * not safe to call document.activeElement if there is nothing focused.
+ *
+ * The activeElement will be null only if the document or document body is not
+ * yet defined.
+ *
+ * @param {?DOMDocument} doc Defaults to current document.
+ * @return {?DOMElement}
+ */
+ function getActiveElement(doc) /*?DOMElement*/ {
+ doc = doc || (typeof document !== "undefined" ? document : undefined);
+ if (typeof doc === "undefined") {
+ return null;
+ }
+ try {
+ return doc.activeElement || doc.body;
+ } catch (e) {
+ return doc.body;
+ }
+ }
+
+ module.exports = getActiveElement;
+
+ /***/
+ },
+
+ /***/ "./node_modules/fbjs/lib/hyphenate.js":
+ /*!********************************************!*\
+ !*** ./node_modules/fbjs/lib/hyphenate.js ***!
+ \********************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ /**
+ * Copyright (c) 2013-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ * @typechecks
+ */
+
+ var _uppercasePattern = /([A-Z])/g;
+
+ /**
+ * Hyphenates a camelcased string, for example:
+ *
+ * > hyphenate('backgroundColor')
+ * < "background-color"
+ *
+ * For CSS style names, use `hyphenateStyleName` instead which works properly
+ * with all vendor prefixes, including `ms`.
+ *
+ * @param {string} string
+ * @return {string}
+ */
+ function hyphenate(string) {
+ return string.replace(_uppercasePattern, "-$1").toLowerCase();
+ }
+
+ module.exports = hyphenate;
+
+ /***/
+ },
+
+ /***/ "./node_modules/fbjs/lib/hyphenateStyleName.js":
+ /*!*****************************************************!*\
+ !*** ./node_modules/fbjs/lib/hyphenateStyleName.js ***!
+ \*****************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /**
+ * Copyright (c) 2013-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ * @typechecks
+ */
+
+ var hyphenate = __webpack_require__(
+ /*! ./hyphenate */ "./node_modules/fbjs/lib/hyphenate.js"
+ );
+
+ var msPattern = /^ms-/;
+
+ /**
+ * Hyphenates a camelcased CSS property name, for example:
+ *
+ * > hyphenateStyleName('backgroundColor')
+ * < "background-color"
+ * > hyphenateStyleName('MozTransition')
+ * < "-moz-transition"
+ * > hyphenateStyleName('msTransition')
+ * < "-ms-transition"
+ *
+ * As Modernizr suggests (http://modernizr.com/docs/#prefixed), an `ms` prefix
+ * is converted to `-ms-`.
+ *
+ * @param {string} string
+ * @return {string}
+ */
+ function hyphenateStyleName(string) {
+ return hyphenate(string).replace(msPattern, "-ms-");
+ }
+
+ module.exports = hyphenateStyleName;
+
+ /***/
+ },
+
+ /***/ "./node_modules/fbjs/lib/invariant.js":
+ /*!********************************************!*\
+ !*** ./node_modules/fbjs/lib/invariant.js ***!
+ \********************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /**
+ * Copyright (c) 2013-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ */
+
+ /**
+ * Use invariant() to assert state which your program assumes to be true.
+ *
+ * Provide sprintf-style format (only %s is supported) and arguments
+ * to provide information about what broke and what you were
+ * expecting.
+ *
+ * The invariant message will be stripped in production, but the invariant
+ * will remain to ensure logic does not differ in production.
+ */
+
+ var validateFormat = function validateFormat(format) {};
+
+ if (true) {
+ validateFormat = function validateFormat(format) {
+ if (format === undefined) {
+ throw new Error("invariant requires an error message argument");
+ }
+ };
+ }
+
+ function invariant(condition, format, a, b, c, d, e, f) {
+ validateFormat(format);
+
+ if (!condition) {
+ var error;
+ if (format === undefined) {
+ error = new Error(
+ "Minified exception occurred; use the non-minified dev environment " +
+ "for the full error message and additional helpful warnings."
+ );
+ } else {
+ var args = [a, b, c, d, e, f];
+ var argIndex = 0;
+ error = new Error(
+ format.replace(/%s/g, function() {
+ return args[argIndex++];
+ })
+ );
+ error.name = "Invariant Violation";
+ }
+
+ error.framesToPop = 1; // we don't care about invariant's own frame
+ throw error;
+ }
+ }
+
+ module.exports = invariant;
+
+ /***/
+ },
+
+ /***/ "./node_modules/fbjs/lib/isNode.js":
+ /*!*****************************************!*\
+ !*** ./node_modules/fbjs/lib/isNode.js ***!
+ \*****************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ /**
+ * Copyright (c) 2013-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ * @typechecks
+ */
+
+ /**
+ * @param {*} object The object to check.
+ * @return {boolean} Whether or not the object is a DOM node.
+ */
+ function isNode(object) {
+ var doc = object ? object.ownerDocument || object : document;
+ var defaultView = doc.defaultView || window;
+ return !!(
+ object &&
+ (typeof defaultView.Node === "function"
+ ? object instanceof defaultView.Node
+ : typeof object === "object" &&
+ typeof object.nodeType === "number" &&
+ typeof object.nodeName === "string")
+ );
+ }
+
+ module.exports = isNode;
+
+ /***/
+ },
+
+ /***/ "./node_modules/fbjs/lib/isTextNode.js":
+ /*!*********************************************!*\
+ !*** ./node_modules/fbjs/lib/isTextNode.js ***!
+ \*********************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ /**
+ * Copyright (c) 2013-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ * @typechecks
+ */
+
+ var isNode = __webpack_require__(
+ /*! ./isNode */ "./node_modules/fbjs/lib/isNode.js"
+ );
+
+ /**
+ * @param {*} object The object to check.
+ * @return {boolean} Whether or not the object is a DOM text node.
+ */
+ function isTextNode(object) {
+ return isNode(object) && object.nodeType == 3;
+ }
+
+ module.exports = isTextNode;
+
+ /***/
+ },
+
+ /***/ "./node_modules/fbjs/lib/shallowEqual.js":
+ /*!***********************************************!*\
+ !*** ./node_modules/fbjs/lib/shallowEqual.js ***!
+ \***********************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /**
+ * Copyright (c) 2013-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ * @typechecks
+ *
+ */
+
+ /*eslint-disable no-self-compare */
+
+ var hasOwnProperty = Object.prototype.hasOwnProperty;
+
+ /**
+ * inlined Object.is polyfill to avoid requiring consumers ship their own
+ * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
+ */
+ function is(x, y) {
+ // SameValue algorithm
+ if (x === y) {
+ // Steps 1-5, 7-10
+ // Steps 6.b-6.e: +0 != -0
+ // Added the nonzero y check to make Flow happy, but it is redundant
+ return x !== 0 || y !== 0 || 1 / x === 1 / y;
+ } else {
+ // Step 6.a: NaN == NaN
+ return x !== x && y !== y;
+ }
+ }
+
+ /**
+ * Performs equality by iterating through keys on an object and returning false
+ * when any key has values which are not strictly equal between the arguments.
+ * Returns true when the values of all keys are strictly equal.
+ */
+ function shallowEqual(objA, objB) {
+ if (is(objA, objB)) {
+ return true;
+ }
+
+ if (
+ typeof objA !== "object" ||
+ objA === null ||
+ typeof objB !== "object" ||
+ objB === null
+ ) {
+ return false;
+ }
+
+ var keysA = Object.keys(objA);
+ var keysB = Object.keys(objB);
+
+ if (keysA.length !== keysB.length) {
+ return false;
+ }
+
+ // Test for A's keys different from B.
+ for (var i = 0; i < keysA.length; i++) {
+ if (
+ !hasOwnProperty.call(objB, keysA[i]) ||
+ !is(objA[keysA[i]], objB[keysA[i]])
+ ) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ module.exports = shallowEqual;
+
+ /***/
+ },
+
+ /***/ "./node_modules/fbjs/lib/warning.js":
+ /*!******************************************!*\
+ !*** ./node_modules/fbjs/lib/warning.js ***!
+ \******************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /**
+ * Copyright (c) 2014-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ *
+ */
+
+ var emptyFunction = __webpack_require__(
+ /*! ./emptyFunction */ "./node_modules/fbjs/lib/emptyFunction.js"
+ );
+
+ /**
+ * Similar to invariant but only logs a warning if the condition is not met.
+ * This can be used to log issues in development environments in critical
+ * paths. Removing the logging code for production environments will keep the
+ * same logic and follow the same code paths.
+ */
+
+ var warning = emptyFunction;
+
+ if (true) {
+ var printWarning = function printWarning(format) {
+ for (
+ var _len = arguments.length,
+ args = Array(_len > 1 ? _len - 1 : 0),
+ _key = 1;
+ _key < _len;
+ _key++
+ ) {
+ args[_key - 1] = arguments[_key];
+ }
+
+ var argIndex = 0;
+ var message =
+ "Warning: " +
+ format.replace(/%s/g, function() {
+ return args[argIndex++];
+ });
+ if (typeof console !== "undefined") {
+ console.error(message);
+ }
+ try {
+ // --- Welcome to debugging React ---
+ // This error was thrown as a convenience so that you can use this stack
+ // to find the callsite that caused this warning to fire.
+ throw new Error(message);
+ } catch (x) {}
+ };
+
+ warning = function warning(condition, format) {
+ if (format === undefined) {
+ throw new Error(
+ "`warning(condition, format, ...args)` requires a warning " +
+ "message argument"
+ );
+ }
+
+ if (format.indexOf("Failed Composite propType: ") === 0) {
+ return; // Ignore CompositeComponent proptype check.
+ }
+
+ if (!condition) {
+ for (
+ var _len2 = arguments.length,
+ args = Array(_len2 > 2 ? _len2 - 2 : 0),
+ _key2 = 2;
+ _key2 < _len2;
+ _key2++
+ ) {
+ args[_key2 - 2] = arguments[_key2];
+ }
+
+ printWarning.apply(undefined, [format].concat(args));
+ }
+ };
+ }
+
+ module.exports = warning;
+
+ /***/
+ },
+
+ /***/ "./node_modules/has-ansi/index.js":
+ /*!****************************************!*\
+ !*** ./node_modules/has-ansi/index.js ***!
+ \****************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ var ansiRegex = __webpack_require__(
+ /*! ansi-regex */ "./node_modules/ansi-regex/index.js"
+ );
+ var re = new RegExp(ansiRegex().source); // remove the `g` flag
+ module.exports = re.test.bind(re);
+
+ /***/
+ },
+
+ /***/ "./node_modules/inherits/inherits_browser.js":
+ /*!***************************************************!*\
+ !*** ./node_modules/inherits/inherits_browser.js ***!
+ \***************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports) {
+ if (typeof Object.create === "function") {
+ // implementation from standard node.js 'util' module
+ module.exports = function inherits(ctor, superCtor) {
+ ctor.super_ = superCtor;
+ ctor.prototype = Object.create(superCtor.prototype, {
+ constructor: {
+ value: ctor,
+ enumerable: false,
+ writable: true,
+ configurable: true
+ }
+ });
+ };
+ } else {
+ // old school shim for old browsers
+ module.exports = function inherits(ctor, superCtor) {
+ ctor.super_ = superCtor;
+ var TempCtor = function() {};
+ TempCtor.prototype = superCtor.prototype;
+ ctor.prototype = new TempCtor();
+ ctor.prototype.constructor = ctor;
+ };
+ }
+
+ /***/
+ },
+
+ /***/ "./node_modules/json3/lib/json3.js":
+ /*!*****************************************!*\
+ !*** ./node_modules/json3/lib/json3.js ***!
+ \*****************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ /* WEBPACK VAR INJECTION */ (function(module, global) {
+ var __WEBPACK_AMD_DEFINE_RESULT__; /*! JSON v3.3.2 | http://bestiejs.github.io/json3 | Copyright 2012-2014, Kit Cambridge | http://kit.mit-license.org */
+ (function() {
+ // Detect the `define` function exposed by asynchronous module loaders. The
+ // strict `define` check is necessary for compatibility with `r.js`.
+ var isLoader =
+ "function" === "function" &&
+ __webpack_require__(
+ /*! !webpack amd options */ "./node_modules/webpack/buildin/amd-options.js"
+ );
+
+ // A set of types used to distinguish objects from primitives.
+ var objectTypes = {
+ function: true,
+ object: true
+ };
+
+ // Detect the `exports` object exposed by CommonJS implementations.
+ var freeExports =
+ objectTypes[typeof exports] &&
+ exports &&
+ !exports.nodeType &&
+ exports;
+
+ // Use the `global` object exposed by Node (including Browserify via
+ // `insert-module-globals`), Narwhal, and Ringo as the default context,
+ // and the `window` object in browsers. Rhino exports a `global` function
+ // instead.
+ var root = (objectTypes[typeof window] && window) || this,
+ freeGlobal =
+ freeExports &&
+ objectTypes[typeof module] &&
+ module &&
+ !module.nodeType &&
+ typeof global == "object" &&
+ global;
+
+ if (
+ freeGlobal &&
+ (freeGlobal["global"] === freeGlobal ||
+ freeGlobal["window"] === freeGlobal ||
+ freeGlobal["self"] === freeGlobal)
+ ) {
+ root = freeGlobal;
+ }
+
+ // Public: Initializes JSON 3 using the given `context` object, attaching the
+ // `stringify` and `parse` functions to the specified `exports` object.
+ function runInContext(context, exports) {
+ context || (context = root["Object"]());
+ exports || (exports = root["Object"]());
+
+ // Native constructor aliases.
+ var Number = context["Number"] || root["Number"],
+ String = context["String"] || root["String"],
+ Object = context["Object"] || root["Object"],
+ Date = context["Date"] || root["Date"],
+ SyntaxError = context["SyntaxError"] || root["SyntaxError"],
+ TypeError = context["TypeError"] || root["TypeError"],
+ Math = context["Math"] || root["Math"],
+ nativeJSON = context["JSON"] || root["JSON"];
+
+ // Delegate to the native `stringify` and `parse` implementations.
+ if (typeof nativeJSON == "object" && nativeJSON) {
+ exports.stringify = nativeJSON.stringify;
+ exports.parse = nativeJSON.parse;
+ }
+
+ // Convenience aliases.
+ var objectProto = Object.prototype,
+ getClass = objectProto.toString,
+ isProperty,
+ forEach,
+ undef;
+
+ // Test the `Date#getUTC*` methods. Based on work by @Yaffle.
+ var isExtended = new Date(-3509827334573292);
+ try {
+ // The `getUTCFullYear`, `Month`, and `Date` methods return nonsensical
+ // results for certain dates in Opera >= 10.53.
+ isExtended =
+ isExtended.getUTCFullYear() == -109252 &&
+ isExtended.getUTCMonth() === 0 &&
+ isExtended.getUTCDate() === 1 &&
+ // Safari < 2.0.2 stores the internal millisecond time value correctly,
+ // but clips the values returned by the date methods to the range of
+ // signed 32-bit integers ([-2 ** 31, 2 ** 31 - 1]).
+ isExtended.getUTCHours() == 10 &&
+ isExtended.getUTCMinutes() == 37 &&
+ isExtended.getUTCSeconds() == 6 &&
+ isExtended.getUTCMilliseconds() == 708;
+ } catch (exception) {}
+
+ // Internal: Determines whether the native `JSON.stringify` and `parse`
+ // implementations are spec-compliant. Based on work by Ken Snyder.
+ function has(name) {
+ if (has[name] !== undef) {
+ // Return cached feature test result.
+ return has[name];
+ }
+ var isSupported;
+ if (name == "bug-string-char-index") {
+ // IE <= 7 doesn't support accessing string characters using square
+ // bracket notation. IE 8 only supports this for primitives.
+ isSupported = "a"[0] != "a";
+ } else if (name == "json") {
+ // Indicates whether both `JSON.stringify` and `JSON.parse` are
+ // supported.
+ isSupported = has("json-stringify") && has("json-parse");
+ } else {
+ var value,
+ serialized =
+ '{"a":[1,true,false,null,"\\u0000\\b\\n\\f\\r\\t"]}';
+ // Test `JSON.stringify`.
+ if (name == "json-stringify") {
+ var stringify = exports.stringify,
+ stringifySupported =
+ typeof stringify == "function" && isExtended;
+ if (stringifySupported) {
+ // A test function object with a custom `toJSON` method.
+ (value = function() {
+ return 1;
+ }).toJSON = value;
+ try {
+ stringifySupported =
+ // Firefox 3.1b1 and b2 serialize string, number, and boolean
+ // primitives as object literals.
+ stringify(0) === "0" &&
+ // FF 3.1b1, b2, and JSON 2 serialize wrapped primitives as object
+ // literals.
+ stringify(new Number()) === "0" &&
+ stringify(new String()) == '""' &&
+ // FF 3.1b1, 2 throw an error if the value is `null`, `undefined`, or
+ // does not define a canonical JSON representation (this applies to
+ // objects with `toJSON` properties as well, *unless* they are nested
+ // within an object or array).
+ stringify(getClass) === undef &&
+ // IE 8 serializes `undefined` as `"undefined"`. Safari <= 5.1.7 and
+ // FF 3.1b3 pass this test.
+ stringify(undef) === undef &&
+ // Safari <= 5.1.7 and FF 3.1b3 throw `Error`s and `TypeError`s,
+ // respectively, if the value is omitted entirely.
+ stringify() === undef &&
+ // FF 3.1b1, 2 throw an error if the given value is not a number,
+ // string, array, object, Boolean, or `null` literal. This applies to
+ // objects with custom `toJSON` methods as well, unless they are nested
+ // inside object or array literals. YUI 3.0.0b1 ignores custom `toJSON`
+ // methods entirely.
+ stringify(value) === "1" &&
+ stringify([value]) == "[1]" &&
+ // Prototype <= 1.6.1 serializes `[undefined]` as `"[]"` instead of
+ // `"[null]"`.
+ stringify([undef]) == "[null]" &&
+ // YUI 3.0.0b1 fails to serialize `null` literals.
+ stringify(null) == "null" &&
+ // FF 3.1b1, 2 halts serialization if an array contains a function:
+ // `[1, true, getClass, 1]` serializes as "[1,true,],". FF 3.1b3
+ // elides non-JSON values from objects and arrays, unless they
+ // define custom `toJSON` methods.
+ stringify([undef, getClass, null]) ==
+ "[null,null,null]" &&
+ // Simple serialization test. FF 3.1b1 uses Unicode escape sequences
+ // where character escape codes are expected (e.g., `\b` => `\u0008`).
+ stringify({
+ a: [value, true, false, null, "\x00\b\n\f\r\t"]
+ }) == serialized &&
+ // FF 3.1b1 and b2 ignore the `filter` and `width` arguments.
+ stringify(null, value) === "1" &&
+ stringify([1, 2], null, 1) == "[\n 1,\n 2\n]" &&
+ // JSON 2, Prototype <= 1.7, and older WebKit builds incorrectly
+ // serialize extended years.
+ stringify(new Date(-8.64e15)) ==
+ '"-271821-04-20T00:00:00.000Z"' &&
+ // The milliseconds are optional in ES 5, but required in 5.1.
+ stringify(new Date(8.64e15)) ==
+ '"+275760-09-13T00:00:00.000Z"' &&
+ // Firefox <= 11.0 incorrectly serializes years prior to 0 as negative
+ // four-digit years instead of six-digit years. Credits: @Yaffle.
+ stringify(new Date(-621987552e5)) ==
+ '"-000001-01-01T00:00:00.000Z"' &&
+ // Safari <= 5.1.5 and Opera >= 10.53 incorrectly serialize millisecond
+ // values less than 1000. Credits: @Yaffle.
+ stringify(new Date(-1)) ==
+ '"1969-12-31T23:59:59.999Z"';
+ } catch (exception) {
+ stringifySupported = false;
+ }
+ }
+ isSupported = stringifySupported;
+ }
+ // Test `JSON.parse`.
+ if (name == "json-parse") {
+ var parse = exports.parse;
+ if (typeof parse == "function") {
+ try {
+ // FF 3.1b1, b2 will throw an exception if a bare literal is provided.
+ // Conforming implementations should also coerce the initial argument to
+ // a string prior to parsing.
+ if (parse("0") === 0 && !parse(false)) {
+ // Simple parsing test.
+ value = parse(serialized);
+ var parseSupported =
+ value["a"].length == 5 && value["a"][0] === 1;
+ if (parseSupported) {
+ try {
+ // Safari <= 5.1.2 and FF 3.1b1 allow unescaped tabs in strings.
+ parseSupported = !parse('"\t"');
+ } catch (exception) {}
+ if (parseSupported) {
+ try {
+ // FF 4.0 and 4.0.1 allow leading `+` signs and leading
+ // decimal points. FF 4.0, 4.0.1, and IE 9-10 also allow
+ // certain octal literals.
+ parseSupported = parse("01") !== 1;
+ } catch (exception) {}
+ }
+ if (parseSupported) {
+ try {
+ // FF 4.0, 4.0.1, and Rhino 1.7R3-R4 allow trailing decimal
+ // points. These environments, along with FF 3.1b1 and 2,
+ // also allow trailing commas in JSON objects and arrays.
+ parseSupported = parse("1.") !== 1;
+ } catch (exception) {}
+ }
+ }
+ }
+ } catch (exception) {
+ parseSupported = false;
+ }
+ }
+ isSupported = parseSupported;
+ }
+ }
+ return (has[name] = !!isSupported);
+ }
+
+ if (!has("json")) {
+ // Common `[[Class]]` name aliases.
+ var functionClass = "[object Function]",
+ dateClass = "[object Date]",
+ numberClass = "[object Number]",
+ stringClass = "[object String]",
+ arrayClass = "[object Array]",
+ booleanClass = "[object Boolean]";
+
+ // Detect incomplete support for accessing string characters by index.
+ var charIndexBuggy = has("bug-string-char-index");
+
+ // Define additional utility methods if the `Date` methods are buggy.
+ if (!isExtended) {
+ var floor = Math.floor;
+ // A mapping between the months of the year and the number of days between
+ // January 1st and the first of the respective month.
+ var Months = [
+ 0,
+ 31,
+ 59,
+ 90,
+ 120,
+ 151,
+ 181,
+ 212,
+ 243,
+ 273,
+ 304,
+ 334
+ ];
+ // Internal: Calculates the number of days between the Unix epoch and the
+ // first day of the given month.
+ var getDay = function(year, month) {
+ return (
+ Months[month] +
+ 365 * (year - 1970) +
+ floor((year - 1969 + (month = +(month > 1))) / 4) -
+ floor((year - 1901 + month) / 100) +
+ floor((year - 1601 + month) / 400)
+ );
+ };
+ }
+
+ // Internal: Determines if a property is a direct property of the given
+ // object. Delegates to the native `Object#hasOwnProperty` method.
+ if (!(isProperty = objectProto.hasOwnProperty)) {
+ isProperty = function(property) {
+ var members = {},
+ constructor;
+ if (
+ ((members.__proto__ = null),
+ (members.__proto__ = {
+ // The *proto* property cannot be set multiple times in recent
+ // versions of Firefox and SeaMonkey.
+ toString: 1
+ }),
+ members).toString != getClass
+ ) {
+ // Safari <= 2.0.3 doesn't implement `Object#hasOwnProperty`, but
+ // supports the mutable *proto* property.
+ isProperty = function(property) {
+ // Capture and break the object's prototype chain (see section 8.6.2
+ // of the ES 5.1 spec). The parenthesized expression prevents an
+ // unsafe transformation by the Closure Compiler.
+ var original = this.__proto__,
+ result = property in ((this.__proto__ = null), this);
+ // Restore the original prototype chain.
+ this.__proto__ = original;
+ return result;
+ };
+ } else {
+ // Capture a reference to the top-level `Object` constructor.
+ constructor = members.constructor;
+ // Use the `constructor` property to simulate `Object#hasOwnProperty` in
+ // other environments.
+ isProperty = function(property) {
+ var parent = (this.constructor || constructor)
+ .prototype;
+ return (
+ property in this &&
+ !(
+ property in parent &&
+ this[property] === parent[property]
+ )
+ );
+ };
+ }
+ members = null;
+ return isProperty.call(this, property);
+ };
+ }
+
+ // Internal: Normalizes the `for...in` iteration algorithm across
+ // environments. Each enumerated key is yielded to a `callback` function.
+ forEach = function(object, callback) {
+ var size = 0,
+ Properties,
+ members,
+ property;
+
+ // Tests for bugs in the current environment's `for...in` algorithm. The
+ // `valueOf` property inherits the non-enumerable flag from
+ // `Object.prototype` in older versions of IE, Netscape, and Mozilla.
+ (Properties = function() {
+ this.valueOf = 0;
+ }).prototype.valueOf = 0;
+
+ // Iterate over a new instance of the `Properties` class.
+ members = new Properties();
+ for (property in members) {
+ // Ignore all properties inherited from `Object.prototype`.
+ if (isProperty.call(members, property)) {
+ size++;
+ }
+ }
+ Properties = members = null;
+
+ // Normalize the iteration algorithm.
+ if (!size) {
+ // A list of non-enumerable properties inherited from `Object.prototype`.
+ members = [
+ "valueOf",
+ "toString",
+ "toLocaleString",
+ "propertyIsEnumerable",
+ "isPrototypeOf",
+ "hasOwnProperty",
+ "constructor"
+ ];
+ // IE <= 8, Mozilla 1.0, and Netscape 6.2 ignore shadowed non-enumerable
+ // properties.
+ forEach = function(object, callback) {
+ var isFunction = getClass.call(object) == functionClass,
+ property,
+ length;
+ var hasProperty =
+ (!isFunction &&
+ typeof object.constructor != "function" &&
+ objectTypes[typeof object.hasOwnProperty] &&
+ object.hasOwnProperty) ||
+ isProperty;
+ for (property in object) {
+ // Gecko <= 1.0 enumerates the `prototype` property of functions under
+ // certain conditions; IE does not.
+ if (
+ !(isFunction && property == "prototype") &&
+ hasProperty.call(object, property)
+ ) {
+ callback(property);
+ }
+ }
+ // Manually invoke the callback for each non-enumerable property.
+ for (
+ length = members.length;
+ (property = members[--length]);
+ hasProperty.call(object, property) && callback(property)
+ );
+ };
+ } else if (size == 2) {
+ // Safari <= 2.0.4 enumerates shadowed properties twice.
+ forEach = function(object, callback) {
+ // Create a set of iterated properties.
+ var members = {},
+ isFunction = getClass.call(object) == functionClass,
+ property;
+ for (property in object) {
+ // Store each property name to prevent double enumeration. The
+ // `prototype` property of functions is not enumerated due to cross-
+ // environment inconsistencies.
+ if (
+ !(isFunction && property == "prototype") &&
+ !isProperty.call(members, property) &&
+ (members[property] = 1) &&
+ isProperty.call(object, property)
+ ) {
+ callback(property);
+ }
+ }
+ };
+ } else {
+ // No bugs detected; use the standard `for...in` algorithm.
+ forEach = function(object, callback) {
+ var isFunction = getClass.call(object) == functionClass,
+ property,
+ isConstructor;
+ for (property in object) {
+ if (
+ !(isFunction && property == "prototype") &&
+ isProperty.call(object, property) &&
+ !(isConstructor = property === "constructor")
+ ) {
+ callback(property);
+ }
+ }
+ // Manually invoke the callback for the `constructor` property due to
+ // cross-environment inconsistencies.
+ if (
+ isConstructor ||
+ isProperty.call(object, (property = "constructor"))
+ ) {
+ callback(property);
+ }
+ };
+ }
+ return forEach(object, callback);
+ };
+
+ // Public: Serializes a JavaScript `value` as a JSON string. The optional
+ // `filter` argument may specify either a function that alters how object and
+ // array members are serialized, or an array of strings and numbers that
+ // indicates which properties should be serialized. The optional `width`
+ // argument may be either a string or number that specifies the indentation
+ // level of the output.
+ if (!has("json-stringify")) {
+ // Internal: A map of control characters and their escaped equivalents.
+ var Escapes = {
+ 92: "\\\\",
+ 34: '\\"',
+ 8: "\\b",
+ 12: "\\f",
+ 10: "\\n",
+ 13: "\\r",
+ 9: "\\t"
+ };
+
+ // Internal: Converts `value` into a zero-padded string such that its
+ // length is at least equal to `width`. The `width` must be <= 6.
+ var leadingZeroes = "000000";
+ var toPaddedString = function(width, value) {
+ // The `|| 0` expression is necessary to work around a bug in
+ // Opera <= 7.54u2 where `0 == -0`, but `String(-0) !== "0"`.
+ return (leadingZeroes + (value || 0)).slice(-width);
+ };
+
+ // Internal: Double-quotes a string `value`, replacing all ASCII control
+ // characters (characters with code unit values between 0 and 31) with
+ // their escaped equivalents. This is an implementation of the
+ // `Quote(value)` operation defined in ES 5.1 section 15.12.3.
+ var unicodePrefix = "\\u00";
+ var quote = function(value) {
+ var result = '"',
+ index = 0,
+ length = value.length,
+ useCharIndex = !charIndexBuggy || length > 10;
+ var symbols =
+ useCharIndex &&
+ (charIndexBuggy ? value.split("") : value);
+ for (; index < length; index++) {
+ var charCode = value.charCodeAt(index);
+ // If the character is a control character, append its Unicode or
+ // shorthand escape sequence; otherwise, append the character as-is.
+ switch (charCode) {
+ case 8:
+ case 9:
+ case 10:
+ case 12:
+ case 13:
+ case 34:
+ case 92:
+ result += Escapes[charCode];
+ break;
+ default:
+ if (charCode < 32) {
+ result +=
+ unicodePrefix +
+ toPaddedString(2, charCode.toString(16));
+ break;
+ }
+ result += useCharIndex
+ ? symbols[index]
+ : value.charAt(index);
+ }
+ }
+ return result + '"';
+ };
+
+ // Internal: Recursively serializes an object. Implements the
+ // `Str(key, holder)`, `JO(value)`, and `JA(value)` operations.
+ var serialize = function(
+ property,
+ object,
+ callback,
+ properties,
+ whitespace,
+ indentation,
+ stack
+ ) {
+ var value,
+ className,
+ year,
+ month,
+ date,
+ time,
+ hours,
+ minutes,
+ seconds,
+ milliseconds,
+ results,
+ element,
+ index,
+ length,
+ prefix,
+ result;
+ try {
+ // Necessary for host object support.
+ value = object[property];
+ } catch (exception) {}
+ if (typeof value == "object" && value) {
+ className = getClass.call(value);
+ if (
+ className == dateClass &&
+ !isProperty.call(value, "toJSON")
+ ) {
+ if (value > -1 / 0 && value < 1 / 0) {
+ // Dates are serialized according to the `Date#toJSON` method
+ // specified in ES 5.1 section 15.9.5.44. See section 15.9.1.15
+ // for the ISO 8601 date time string format.
+ if (getDay) {
+ // Manually compute the year, month, date, hours, minutes,
+ // seconds, and milliseconds if the `getUTC*` methods are
+ // buggy. Adapted from @Yaffle's `date-shim` project.
+ date = floor(value / 864e5);
+ for (
+ year = floor(date / 365.2425) + 1970 - 1;
+ getDay(year + 1, 0) <= date;
+ year++
+ );
+ for (
+ month = floor((date - getDay(year, 0)) / 30.42);
+ getDay(year, month + 1) <= date;
+ month++
+ );
+ date = 1 + date - getDay(year, month);
+ // The `time` value specifies the time within the day (see ES
+ // 5.1 section 15.9.1.2). The formula `(A % B + B) % B` is used
+ // to compute `A modulo B`, as the `%` operator does not
+ // correspond to the `modulo` operation for negative numbers.
+ time = (value % 864e5 + 864e5) % 864e5;
+ // The hours, minutes, seconds, and milliseconds are obtained by
+ // decomposing the time within the day. See section 15.9.1.10.
+ hours = floor(time / 36e5) % 24;
+ minutes = floor(time / 6e4) % 60;
+ seconds = floor(time / 1e3) % 60;
+ milliseconds = time % 1e3;
+ } else {
+ year = value.getUTCFullYear();
+ month = value.getUTCMonth();
+ date = value.getUTCDate();
+ hours = value.getUTCHours();
+ minutes = value.getUTCMinutes();
+ seconds = value.getUTCSeconds();
+ milliseconds = value.getUTCMilliseconds();
+ }
+ // Serialize extended years correctly.
+ value =
+ (year <= 0 || year >= 1e4
+ ? (year < 0 ? "-" : "+") +
+ toPaddedString(6, year < 0 ? -year : year)
+ : toPaddedString(4, year)) +
+ "-" +
+ toPaddedString(2, month + 1) +
+ "-" +
+ toPaddedString(2, date) +
+ // Months, dates, hours, minutes, and seconds should have two
+ // digits; milliseconds should have three.
+ "T" +
+ toPaddedString(2, hours) +
+ ":" +
+ toPaddedString(2, minutes) +
+ ":" +
+ toPaddedString(2, seconds) +
+ // Milliseconds are optional in ES 5.0, but required in 5.1.
+ "." +
+ toPaddedString(3, milliseconds) +
+ "Z";
+ } else {
+ value = null;
+ }
+ } else if (
+ typeof value.toJSON == "function" &&
+ ((className != numberClass &&
+ className != stringClass &&
+ className != arrayClass) ||
+ isProperty.call(value, "toJSON"))
+ ) {
+ // Prototype <= 1.6.1 adds non-standard `toJSON` methods to the
+ // `Number`, `String`, `Date`, and `Array` prototypes. JSON 3
+ // ignores all `toJSON` methods on these objects unless they are
+ // defined directly on an instance.
+ value = value.toJSON(property);
+ }
+ }
+ if (callback) {
+ // If a replacement function was provided, call it to obtain the value
+ // for serialization.
+ value = callback.call(object, property, value);
+ }
+ if (value === null) {
+ return "null";
+ }
+ className = getClass.call(value);
+ if (className == booleanClass) {
+ // Booleans are represented literally.
+ return "" + value;
+ } else if (className == numberClass) {
+ // JSON numbers must be finite. `Infinity` and `NaN` are serialized as
+ // `"null"`.
+ return value > -1 / 0 && value < 1 / 0
+ ? "" + value
+ : "null";
+ } else if (className == stringClass) {
+ // Strings are double-quoted and escaped.
+ return quote("" + value);
+ }
+ // Recursively serialize objects and arrays.
+ if (typeof value == "object") {
+ // Check for cyclic structures. This is a linear search; performance
+ // is inversely proportional to the number of unique nested objects.
+ for (length = stack.length; length--; ) {
+ if (stack[length] === value) {
+ // Cyclic structures cannot be serialized by `JSON.stringify`.
+ throw TypeError();
+ }
+ }
+ // Add the object to the stack of traversed objects.
+ stack.push(value);
+ results = [];
+ // Save the current indentation level and indent one additional level.
+ prefix = indentation;
+ indentation += whitespace;
+ if (className == arrayClass) {
+ // Recursively serialize array elements.
+ for (
+ index = 0, length = value.length;
+ index < length;
+ index++
+ ) {
+ element = serialize(
+ index,
+ value,
+ callback,
+ properties,
+ whitespace,
+ indentation,
+ stack
+ );
+ results.push(element === undef ? "null" : element);
+ }
+ result = results.length
+ ? whitespace
+ ? "[\n" +
+ indentation +
+ results.join(",\n" + indentation) +
+ "\n" +
+ prefix +
+ "]"
+ : "[" + results.join(",") + "]"
+ : "[]";
+ } else {
+ // Recursively serialize object members. Members are selected from
+ // either a user-specified list of property names, or the object
+ // itself.
+ forEach(properties || value, function(property) {
+ var element = serialize(
+ property,
+ value,
+ callback,
+ properties,
+ whitespace,
+ indentation,
+ stack
+ );
+ if (element !== undef) {
+ // According to ES 5.1 section 15.12.3: "If `gap` {whitespace}
+ // is not the empty string, let `member` {quote(property) + ":"}
+ // be the concatenation of `member` and the `space` character."
+ // The "`space` character" refers to the literal space
+ // character, not the `space` {width} argument provided to
+ // `JSON.stringify`.
+ results.push(
+ quote(property) +
+ ":" +
+ (whitespace ? " " : "") +
+ element
+ );
+ }
+ });
+ result = results.length
+ ? whitespace
+ ? "{\n" +
+ indentation +
+ results.join(",\n" + indentation) +
+ "\n" +
+ prefix +
+ "}"
+ : "{" + results.join(",") + "}"
+ : "{}";
+ }
+ // Remove the object from the traversed object stack.
+ stack.pop();
+ return result;
+ }
+ };
+
+ // Public: `JSON.stringify`. See ES 5.1 section 15.12.3.
+ exports.stringify = function(source, filter, width) {
+ var whitespace, callback, properties, className;
+ if (objectTypes[typeof filter] && filter) {
+ if (
+ (className = getClass.call(filter)) == functionClass
+ ) {
+ callback = filter;
+ } else if (className == arrayClass) {
+ // Convert the property names array into a makeshift set.
+ properties = {};
+ for (
+ var index = 0, length = filter.length, value;
+ index < length;
+ value = filter[index++],
+ ((className = getClass.call(value)),
+ className == stringClass ||
+ className == numberClass) &&
+ (properties[value] = 1)
+ );
+ }
+ }
+ if (width) {
+ if ((className = getClass.call(width)) == numberClass) {
+ // Convert the `width` to an integer and create a string containing
+ // `width` number of space characters.
+ if ((width -= width % 1) > 0) {
+ for (
+ whitespace = "", width > 10 && (width = 10);
+ whitespace.length < width;
+ whitespace += " "
+ );
+ }
+ } else if (className == stringClass) {
+ whitespace =
+ width.length <= 10 ? width : width.slice(0, 10);
+ }
+ }
+ // Opera <= 7.54u2 discards the values associated with empty string keys
+ // (`""`) only if they are used directly within an object member list
+ // (e.g., `!("" in { "": 1})`).
+ return serialize(
+ "",
+ ((value = {}), (value[""] = source), value),
+ callback,
+ properties,
+ whitespace,
+ "",
+ []
+ );
+ };
+ }
+
+ // Public: Parses a JSON source string.
+ if (!has("json-parse")) {
+ var fromCharCode = String.fromCharCode;
+
+ // Internal: A map of escaped control characters and their unescaped
+ // equivalents.
+ var Unescapes = {
+ 92: "\\",
+ 34: '"',
+ 47: "/",
+ 98: "\b",
+ 116: "\t",
+ 110: "\n",
+ 102: "\f",
+ 114: "\r"
+ };
+
+ // Internal: Stores the parser state.
+ var Index, Source;
+
+ // Internal: Resets the parser state and throws a `SyntaxError`.
+ var abort = function() {
+ Index = Source = null;
+ throw SyntaxError();
+ };
+
+ // Internal: Returns the next token, or `"$"` if the parser has reached
+ // the end of the source string. A token may be a string, number, `null`
+ // literal, or Boolean literal.
+ var lex = function() {
+ var source = Source,
+ length = source.length,
+ value,
+ begin,
+ position,
+ isSigned,
+ charCode;
+ while (Index < length) {
+ charCode = source.charCodeAt(Index);
+ switch (charCode) {
+ case 9:
+ case 10:
+ case 13:
+ case 32:
+ // Skip whitespace tokens, including tabs, carriage returns, line
+ // feeds, and space characters.
+ Index++;
+ break;
+ case 123:
+ case 125:
+ case 91:
+ case 93:
+ case 58:
+ case 44:
+ // Parse a punctuator token (`{`, `}`, `[`, `]`, `:`, or `,`) at
+ // the current position.
+ value = charIndexBuggy
+ ? source.charAt(Index)
+ : source[Index];
+ Index++;
+ return value;
+ case 34:
+ // `"` delimits a JSON string; advance to the next character and
+ // begin parsing the string. String tokens are prefixed with the
+ // sentinel `@` character to distinguish them from punctuators and
+ // end-of-string tokens.
+ for (value = "@", Index++; Index < length; ) {
+ charCode = source.charCodeAt(Index);
+ if (charCode < 32) {
+ // Unescaped ASCII control characters (those with a code unit
+ // less than the space character) are not permitted.
+ abort();
+ } else if (charCode == 92) {
+ // A reverse solidus (`\`) marks the beginning of an escaped
+ // control character (including `"`, `\`, and `/`) or Unicode
+ // escape sequence.
+ charCode = source.charCodeAt(++Index);
+ switch (charCode) {
+ case 92:
+ case 34:
+ case 47:
+ case 98:
+ case 116:
+ case 110:
+ case 102:
+ case 114:
+ // Revive escaped control characters.
+ value += Unescapes[charCode];
+ Index++;
+ break;
+ case 117:
+ // `\u` marks the beginning of a Unicode escape sequence.
+ // Advance to the first character and validate the
+ // four-digit code point.
+ begin = ++Index;
+ for (
+ position = Index + 4;
+ Index < position;
+ Index++
+ ) {
+ charCode = source.charCodeAt(Index);
+ // A valid sequence comprises four hexdigits (case-
+ // insensitive) that form a single hexadecimal value.
+ if (
+ !(
+ (charCode >= 48 && charCode <= 57) ||
+ (charCode >= 97 && charCode <= 102) ||
+ (charCode >= 65 && charCode <= 70)
+ )
+ ) {
+ // Invalid Unicode escape sequence.
+ abort();
+ }
+ }
+ // Revive the escaped character.
+ value += fromCharCode(
+ "0x" + source.slice(begin, Index)
+ );
+ break;
+ default:
+ // Invalid escape sequence.
+ abort();
+ }
+ } else {
+ if (charCode == 34) {
+ // An unescaped double-quote character marks the end of the
+ // string.
+ break;
+ }
+ charCode = source.charCodeAt(Index);
+ begin = Index;
+ // Optimize for the common case where a string is valid.
+ while (
+ charCode >= 32 &&
+ charCode != 92 &&
+ charCode != 34
+ ) {
+ charCode = source.charCodeAt(++Index);
+ }
+ // Append the string as-is.
+ value += source.slice(begin, Index);
+ }
+ }
+ if (source.charCodeAt(Index) == 34) {
+ // Advance to the next character and return the revived string.
+ Index++;
+ return value;
+ }
+ // Unterminated string.
+ abort();
+ default:
+ // Parse numbers and literals.
+ begin = Index;
+ // Advance past the negative sign, if one is specified.
+ if (charCode == 45) {
+ isSigned = true;
+ charCode = source.charCodeAt(++Index);
+ }
+ // Parse an integer or floating-point value.
+ if (charCode >= 48 && charCode <= 57) {
+ // Leading zeroes are interpreted as octal literals.
+ if (
+ charCode == 48 &&
+ ((charCode = source.charCodeAt(Index + 1)),
+ charCode >= 48 && charCode <= 57)
+ ) {
+ // Illegal octal literal.
+ abort();
+ }
+ isSigned = false;
+ // Parse the integer component.
+ for (
+ ;
+ Index < length &&
+ ((charCode = source.charCodeAt(Index)),
+ charCode >= 48 && charCode <= 57);
+ Index++
+ );
+ // Floats cannot contain a leading decimal point; however, this
+ // case is already accounted for by the parser.
+ if (source.charCodeAt(Index) == 46) {
+ position = ++Index;
+ // Parse the decimal component.
+ for (
+ ;
+ position < length &&
+ ((charCode = source.charCodeAt(position)),
+ charCode >= 48 && charCode <= 57);
+ position++
+ );
+ if (position == Index) {
+ // Illegal trailing decimal.
+ abort();
+ }
+ Index = position;
+ }
+ // Parse exponents. The `e` denoting the exponent is
+ // case-insensitive.
+ charCode = source.charCodeAt(Index);
+ if (charCode == 101 || charCode == 69) {
+ charCode = source.charCodeAt(++Index);
+ // Skip past the sign following the exponent, if one is
+ // specified.
+ if (charCode == 43 || charCode == 45) {
+ Index++;
+ }
+ // Parse the exponential component.
+ for (
+ position = Index;
+ position < length &&
+ ((charCode = source.charCodeAt(position)),
+ charCode >= 48 && charCode <= 57);
+ position++
+ );
+ if (position == Index) {
+ // Illegal empty exponent.
+ abort();
+ }
+ Index = position;
+ }
+ // Coerce the parsed value to a JavaScript number.
+ return +source.slice(begin, Index);
+ }
+ // A negative sign may only precede numbers.
+ if (isSigned) {
+ abort();
+ }
+ // `true`, `false`, and `null` literals.
+ if (source.slice(Index, Index + 4) == "true") {
+ Index += 4;
+ return true;
+ } else if (
+ source.slice(Index, Index + 5) == "false"
+ ) {
+ Index += 5;
+ return false;
+ } else if (source.slice(Index, Index + 4) == "null") {
+ Index += 4;
+ return null;
+ }
+ // Unrecognized token.
+ abort();
+ }
+ }
+ // Return the sentinel `$` character if the parser has reached the end
+ // of the source string.
+ return "$";
+ };
+
+ // Internal: Parses a JSON `value` token.
+ var get = function(value) {
+ var results, hasMembers;
+ if (value == "$") {
+ // Unexpected end of input.
+ abort();
+ }
+ if (typeof value == "string") {
+ if (
+ (charIndexBuggy ? value.charAt(0) : value[0]) == "@"
+ ) {
+ // Remove the sentinel `@` character.
+ return value.slice(1);
+ }
+ // Parse object and array literals.
+ if (value == "[") {
+ // Parses a JSON array, returning a new JavaScript array.
+ results = [];
+ for (; ; hasMembers || (hasMembers = true)) {
+ value = lex();
+ // A closing square bracket marks the end of the array literal.
+ if (value == "]") {
+ break;
+ }
+ // If the array literal contains elements, the current token
+ // should be a comma separating the previous element from the
+ // next.
+ if (hasMembers) {
+ if (value == ",") {
+ value = lex();
+ if (value == "]") {
+ // Unexpected trailing `,` in array literal.
+ abort();
+ }
+ } else {
+ // A `,` must separate each array element.
+ abort();
+ }
+ }
+ // Elisions and leading commas are not permitted.
+ if (value == ",") {
+ abort();
+ }
+ results.push(get(value));
+ }
+ return results;
+ } else if (value == "{") {
+ // Parses a JSON object, returning a new JavaScript object.
+ results = {};
+ for (; ; hasMembers || (hasMembers = true)) {
+ value = lex();
+ // A closing curly brace marks the end of the object literal.
+ if (value == "}") {
+ break;
+ }
+ // If the object literal contains members, the current token
+ // should be a comma separator.
+ if (hasMembers) {
+ if (value == ",") {
+ value = lex();
+ if (value == "}") {
+ // Unexpected trailing `,` in object literal.
+ abort();
+ }
+ } else {
+ // A `,` must separate each object member.
+ abort();
+ }
+ }
+ // Leading commas are not permitted, object property names must be
+ // double-quoted strings, and a `:` must separate each property
+ // name and value.
+ if (
+ value == "," ||
+ typeof value != "string" ||
+ (charIndexBuggy ? value.charAt(0) : value[0]) !=
+ "@" ||
+ lex() != ":"
+ ) {
+ abort();
+ }
+ results[value.slice(1)] = get(lex());
+ }
+ return results;
+ }
+ // Unexpected token encountered.
+ abort();
+ }
+ return value;
+ };
+
+ // Internal: Updates a traversed object member.
+ var update = function(source, property, callback) {
+ var element = walk(source, property, callback);
+ if (element === undef) {
+ delete source[property];
+ } else {
+ source[property] = element;
+ }
+ };
+
+ // Internal: Recursively traverses a parsed JSON object, invoking the
+ // `callback` function for each value. This is an implementation of the
+ // `Walk(holder, name)` operation defined in ES 5.1 section 15.12.2.
+ var walk = function(source, property, callback) {
+ var value = source[property],
+ length;
+ if (typeof value == "object" && value) {
+ // `forEach` can't be used to traverse an array in Opera <= 8.54
+ // because its `Object#hasOwnProperty` implementation returns `false`
+ // for array indices (e.g., `![1, 2, 3].hasOwnProperty("0")`).
+ if (getClass.call(value) == arrayClass) {
+ for (length = value.length; length--; ) {
+ update(value, length, callback);
+ }
+ } else {
+ forEach(value, function(property) {
+ update(value, property, callback);
+ });
+ }
+ }
+ return callback.call(source, property, value);
+ };
+
+ // Public: `JSON.parse`. See ES 5.1 section 15.12.2.
+ exports.parse = function(source, callback) {
+ var result, value;
+ Index = 0;
+ Source = "" + source;
+ result = get(lex());
+ // If a JSON string contains multiple tokens, it is invalid.
+ if (lex() != "$") {
+ abort();
+ }
+ // Reset the parser state.
+ Index = Source = null;
+ return callback && getClass.call(callback) == functionClass
+ ? walk(
+ ((value = {}), (value[""] = result), value),
+ "",
+ callback
+ )
+ : result;
+ };
+ }
+ }
+
+ exports["runInContext"] = runInContext;
+ return exports;
+ }
+
+ if (freeExports && !isLoader) {
+ // Export for CommonJS environments.
+ runInContext(root, freeExports);
+ } else {
+ // Export for web browsers and JavaScript engines.
+ var nativeJSON = root.JSON,
+ previousJSON = root["JSON3"],
+ isRestored = false;
+
+ var JSON3 = runInContext(
+ root,
+ (root["JSON3"] = {
+ // Public: Restores the original value of the global `JSON` object and
+ // returns a reference to the `JSON3` object.
+ noConflict: function() {
+ if (!isRestored) {
+ isRestored = true;
+ root.JSON = nativeJSON;
+ root["JSON3"] = previousJSON;
+ nativeJSON = previousJSON = null;
+ }
+ return JSON3;
+ }
+ })
+ );
+
+ root.JSON = {
+ parse: JSON3.parse,
+ stringify: JSON3.stringify
+ };
+ }
+
+ // Export for asynchronous module loaders.
+ if (isLoader) {
+ !((__WEBPACK_AMD_DEFINE_RESULT__ = function() {
+ return JSON3;
+ }.call(exports, __webpack_require__, exports, module)),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined &&
+ (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ }
+ }.call(this));
+
+ /* WEBPACK VAR INJECTION */
+ }.call(
+ exports,
+ __webpack_require__(
+ /*! ./../../webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js"
+ )(module),
+ __webpack_require__(
+ /*! ./../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"
+ )
+ ));
+
+ /***/
+ },
+
+ /***/ "./node_modules/ms/index.js":
+ /*!**********************************!*\
+ !*** ./node_modules/ms/index.js ***!
+ \**********************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports) {
+ /**
+ * Helpers.
+ */
+
+ var s = 1000;
+ var m = s * 60;
+ var h = m * 60;
+ var d = h * 24;
+ var y = d * 365.25;
+
+ /**
+ * Parse or format the given `val`.
+ *
+ * Options:
+ *
+ * - `long` verbose formatting [false]
+ *
+ * @param {String|Number} val
+ * @param {Object} [options]
+ * @throws {Error} throw an error if val is not a non-empty string or a number
+ * @return {String|Number}
+ * @api public
+ */
+
+ module.exports = function(val, options) {
+ options = options || {};
+ var type = typeof val;
+ if (type === "string" && val.length > 0) {
+ return parse(val);
+ } else if (type === "number" && isNaN(val) === false) {
+ return options.long ? fmtLong(val) : fmtShort(val);
+ }
+ throw new Error(
+ "val is not a non-empty string or a valid number. val=" +
+ JSON.stringify(val)
+ );
+ };
+
+ /**
+ * Parse the given `str` and return milliseconds.
+ *
+ * @param {String} str
+ * @return {Number}
+ * @api private
+ */
+
+ function parse(str) {
+ str = String(str);
+ if (str.length > 100) {
+ return;
+ }
+ var match = /^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(
+ str
+ );
+ if (!match) {
+ return;
+ }
+ var n = parseFloat(match[1]);
+ var type = (match[2] || "ms").toLowerCase();
+ switch (type) {
+ case "years":
+ case "year":
+ case "yrs":
+ case "yr":
+ case "y":
+ return n * y;
+ case "days":
+ case "day":
+ case "d":
+ return n * d;
+ case "hours":
+ case "hour":
+ case "hrs":
+ case "hr":
+ case "h":
+ return n * h;
+ case "minutes":
+ case "minute":
+ case "mins":
+ case "min":
+ case "m":
+ return n * m;
+ case "seconds":
+ case "second":
+ case "secs":
+ case "sec":
+ case "s":
+ return n * s;
+ case "milliseconds":
+ case "millisecond":
+ case "msecs":
+ case "msec":
+ case "ms":
+ return n;
+ default:
+ return undefined;
+ }
+ }
+
+ /**
+ * Short format for `ms`.
+ *
+ * @param {Number} ms
+ * @return {String}
+ * @api private
+ */
+
+ function fmtShort(ms) {
+ if (ms >= d) {
+ return Math.round(ms / d) + "d";
+ }
+ if (ms >= h) {
+ return Math.round(ms / h) + "h";
+ }
+ if (ms >= m) {
+ return Math.round(ms / m) + "m";
+ }
+ if (ms >= s) {
+ return Math.round(ms / s) + "s";
+ }
+ return ms + "ms";
+ }
+
+ /**
+ * Long format for `ms`.
+ *
+ * @param {Number} ms
+ * @return {String}
+ * @api private
+ */
+
+ function fmtLong(ms) {
+ return (
+ plural(ms, d, "day") ||
+ plural(ms, h, "hour") ||
+ plural(ms, m, "minute") ||
+ plural(ms, s, "second") ||
+ ms + " ms"
+ );
+ }
+
+ /**
+ * Pluralization helper.
+ */
+
+ function plural(ms, n, name) {
+ if (ms < n) {
+ return;
+ }
+ if (ms < n * 1.5) {
+ return Math.floor(ms / n) + " " + name;
+ }
+ return Math.ceil(ms / n) + " " + name + "s";
+ }
+
+ /***/
+ },
+
+ /***/ "./node_modules/object-assign/index.js":
+ /*!*********************************************!*\
+ !*** ./node_modules/object-assign/index.js ***!
+ \*********************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /*
+object-assign
+(c) Sindre Sorhus
+@license MIT
+*/
+
+ /* eslint-disable no-unused-vars */
+ var getOwnPropertySymbols = Object.getOwnPropertySymbols;
+ var hasOwnProperty = Object.prototype.hasOwnProperty;
+ var propIsEnumerable = Object.prototype.propertyIsEnumerable;
+
+ function toObject(val) {
+ if (val === null || val === undefined) {
+ throw new TypeError(
+ "Object.assign cannot be called with null or undefined"
+ );
+ }
+
+ return Object(val);
+ }
+
+ function shouldUseNative() {
+ try {
+ if (!Object.assign) {
+ return false;
+ }
+
+ // Detect buggy property enumeration order in older V8 versions.
+
+ // https://bugs.chromium.org/p/v8/issues/detail?id=4118
+ var test1 = new String("abc"); // eslint-disable-line no-new-wrappers
+ test1[5] = "de";
+ if (Object.getOwnPropertyNames(test1)[0] === "5") {
+ return false;
+ }
+
+ // https://bugs.chromium.org/p/v8/issues/detail?id=3056
+ var test2 = {};
+ for (var i = 0; i < 10; i++) {
+ test2["_" + String.fromCharCode(i)] = i;
+ }
+ var order2 = Object.getOwnPropertyNames(test2).map(function(n) {
+ return test2[n];
+ });
+ if (order2.join("") !== "0123456789") {
+ return false;
+ }
+
+ // https://bugs.chromium.org/p/v8/issues/detail?id=3056
+ var test3 = {};
+ "abcdefghijklmnopqrst".split("").forEach(function(letter) {
+ test3[letter] = letter;
+ });
+ if (
+ Object.keys(Object.assign({}, test3)).join("") !==
+ "abcdefghijklmnopqrst"
+ ) {
+ return false;
+ }
+
+ return true;
+ } catch (err) {
+ // We don't expect any of the above to throw, but better to be safe.
+ return false;
+ }
+ }
+
+ module.exports = shouldUseNative()
+ ? Object.assign
+ : function(target, source) {
+ var from;
+ var to = toObject(target);
+ var symbols;
+
+ for (var s = 1; s < arguments.length; s++) {
+ from = Object(arguments[s]);
+
+ for (var key in from) {
+ if (hasOwnProperty.call(from, key)) {
+ to[key] = from[key];
+ }
+ }
+
+ if (getOwnPropertySymbols) {
+ symbols = getOwnPropertySymbols(from);
+ for (var i = 0; i < symbols.length; i++) {
+ if (propIsEnumerable.call(from, symbols[i])) {
+ to[symbols[i]] = from[symbols[i]];
+ }
+ }
+ }
+ }
+
+ return to;
+ };
+
+ /***/
+ },
+
+ /***/ "./node_modules/process/browser.js":
+ /*!*****************************************!*\
+ !*** ./node_modules/process/browser.js ***!
+ \*****************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports) {
+ // shim for using process in browser
+ var process = (module.exports = {});
+
+ // cached from whatever global is present so that test runners that stub it
+ // don't break things. But we need to wrap it in a try catch in case it is
+ // wrapped in strict mode code which doesn't define any globals. It's inside a
+ // function because try/catches deoptimize in certain engines.
+
+ var cachedSetTimeout;
+ var cachedClearTimeout;
+
+ function defaultSetTimout() {
+ throw new Error("setTimeout has not been defined");
+ }
+ function defaultClearTimeout() {
+ throw new Error("clearTimeout has not been defined");
+ }
+ (function() {
+ try {
+ if (typeof setTimeout === "function") {
+ cachedSetTimeout = setTimeout;
+ } else {
+ cachedSetTimeout = defaultSetTimout;
+ }
+ } catch (e) {
+ cachedSetTimeout = defaultSetTimout;
+ }
+ try {
+ if (typeof clearTimeout === "function") {
+ cachedClearTimeout = clearTimeout;
+ } else {
+ cachedClearTimeout = defaultClearTimeout;
+ }
+ } catch (e) {
+ cachedClearTimeout = defaultClearTimeout;
+ }
+ })();
+ function runTimeout(fun) {
+ if (cachedSetTimeout === setTimeout) {
+ //normal enviroments in sane situations
+ return setTimeout(fun, 0);
+ }
+ // if setTimeout wasn't available but was latter defined
+ if (
+ (cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) &&
+ setTimeout
+ ) {
+ cachedSetTimeout = setTimeout;
+ return setTimeout(fun, 0);
+ }
+ try {
+ // when when somebody has screwed with setTimeout but no I.E. maddness
+ return cachedSetTimeout(fun, 0);
+ } catch (e) {
+ try {
+ // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+ return cachedSetTimeout.call(null, fun, 0);
+ } catch (e) {
+ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
+ return cachedSetTimeout.call(this, fun, 0);
+ }
+ }
+ }
+ function runClearTimeout(marker) {
+ if (cachedClearTimeout === clearTimeout) {
+ //normal enviroments in sane situations
+ return clearTimeout(marker);
+ }
+ // if clearTimeout wasn't available but was latter defined
+ if (
+ (cachedClearTimeout === defaultClearTimeout ||
+ !cachedClearTimeout) &&
+ clearTimeout
+ ) {
+ cachedClearTimeout = clearTimeout;
+ return clearTimeout(marker);
+ }
+ try {
+ // when when somebody has screwed with setTimeout but no I.E. maddness
+ return cachedClearTimeout(marker);
+ } catch (e) {
+ try {
+ // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+ return cachedClearTimeout.call(null, marker);
+ } catch (e) {
+ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
+ // Some versions of I.E. have different rules for clearTimeout vs setTimeout
+ return cachedClearTimeout.call(this, marker);
+ }
+ }
+ }
+ var queue = [];
+ var draining = false;
+ var currentQueue;
+ var queueIndex = -1;
+
+ function cleanUpNextTick() {
+ if (!draining || !currentQueue) {
+ return;
+ }
+ draining = false;
+ if (currentQueue.length) {
+ queue = currentQueue.concat(queue);
+ } else {
+ queueIndex = -1;
+ }
+ if (queue.length) {
+ drainQueue();
+ }
+ }
+
+ function drainQueue() {
+ if (draining) {
+ return;
+ }
+ var timeout = runTimeout(cleanUpNextTick);
+ draining = true;
+
+ var len = queue.length;
+ while (len) {
+ currentQueue = queue;
+ queue = [];
+ while (++queueIndex < len) {
+ if (currentQueue) {
+ currentQueue[queueIndex].run();
+ }
+ }
+ queueIndex = -1;
+ len = queue.length;
+ }
+ currentQueue = null;
+ draining = false;
+ runClearTimeout(timeout);
+ }
+
+ process.nextTick = function(fun) {
+ var args = new Array(arguments.length - 1);
+ if (arguments.length > 1) {
+ for (var i = 1; i < arguments.length; i++) {
+ args[i - 1] = arguments[i];
+ }
+ }
+ queue.push(new Item(fun, args));
+ if (queue.length === 1 && !draining) {
+ runTimeout(drainQueue);
+ }
+ };
+
+ // v8 likes predictible objects
+ function Item(fun, array) {
+ this.fun = fun;
+ this.array = array;
+ }
+ Item.prototype.run = function() {
+ this.fun.apply(null, this.array);
+ };
+ process.title = "browser";
+ process.browser = true;
+ process.env = {};
+ process.argv = [];
+ process.version = ""; // empty string to avoid regexp issues
+ process.versions = {};
+
+ function noop() {}
+
+ process.on = noop;
+ process.addListener = noop;
+ process.once = noop;
+ process.off = noop;
+ process.removeListener = noop;
+ process.removeAllListeners = noop;
+ process.emit = noop;
+ process.prependListener = noop;
+ process.prependOnceListener = noop;
+
+ process.listeners = function(name) {
+ return [];
+ };
+
+ process.binding = function(name) {
+ throw new Error("process.binding is not supported");
+ };
+
+ process.cwd = function() {
+ return "/";
+ };
+ process.chdir = function(dir) {
+ throw new Error("process.chdir is not supported");
+ };
+ process.umask = function() {
+ return 0;
+ };
+
+ /***/
+ },
+
+ /***/ "./node_modules/prop-types/checkPropTypes.js":
+ /*!***************************************************!*\
+ !*** ./node_modules/prop-types/checkPropTypes.js ***!
+ \***************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /**
+ * Copyright (c) 2013-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+ if (true) {
+ var invariant = __webpack_require__(
+ /*! fbjs/lib/invariant */ "./node_modules/fbjs/lib/invariant.js"
+ );
+ var warning = __webpack_require__(
+ /*! fbjs/lib/warning */ "./node_modules/fbjs/lib/warning.js"
+ );
+ var ReactPropTypesSecret = __webpack_require__(
+ /*! ./lib/ReactPropTypesSecret */ "./node_modules/prop-types/lib/ReactPropTypesSecret.js"
+ );
+ var loggedTypeFailures = {};
+ }
+
+ /**
+ * Assert that the values match with the type specs.
+ * Error messages are memorized and will only be shown once.
+ *
+ * @param {object} typeSpecs Map of name to a ReactPropType
+ * @param {object} values Runtime values that need to be type-checked
+ * @param {string} location e.g. "prop", "context", "child context"
+ * @param {string} componentName Name of the component for error messages.
+ * @param {?Function} getStack Returns the component stack.
+ * @private
+ */
+ function checkPropTypes(
+ typeSpecs,
+ values,
+ location,
+ componentName,
+ getStack
+ ) {
+ if (true) {
+ for (var typeSpecName in typeSpecs) {
+ if (typeSpecs.hasOwnProperty(typeSpecName)) {
+ var error;
+ // Prop type validation may throw. In case they do, we don't want to
+ // fail the render phase where it didn't fail before. So we log it.
+ // After these have been cleaned up, we'll let them throw.
+ try {
+ // This is intentionally an invariant that gets caught. It's the same
+ // behavior as without this statement except with a better message.
+ invariant(
+ typeof typeSpecs[typeSpecName] === "function",
+ "%s: %s type `%s` is invalid; it must be a function, usually from " +
+ "the `prop-types` package, but received `%s`.",
+ componentName || "React class",
+ location,
+ typeSpecName,
+ typeof typeSpecs[typeSpecName]
+ );
+ error = typeSpecs[typeSpecName](
+ values,
+ typeSpecName,
+ componentName,
+ location,
+ null,
+ ReactPropTypesSecret
+ );
+ } catch (ex) {
+ error = ex;
+ }
+ warning(
+ !error || error instanceof Error,
+ "%s: type specification of %s `%s` is invalid; the type checker " +
+ "function must return `null` or an `Error` but returned a %s. " +
+ "You may have forgotten to pass an argument to the type checker " +
+ "creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and " +
+ "shape all require an argument).",
+ componentName || "React class",
+ location,
+ typeSpecName,
+ typeof error
+ );
+ if (
+ error instanceof Error &&
+ !(error.message in loggedTypeFailures)
+ ) {
+ // Only monitor this failure once because there tends to be a lot of the
+ // same error.
+ loggedTypeFailures[error.message] = true;
+
+ var stack = getStack ? getStack() : "";
+
+ warning(
+ false,
+ "Failed %s type: %s%s",
+ location,
+ error.message,
+ stack != null ? stack : ""
+ );
+ }
+ }
+ }
+ }
+ }
+
+ module.exports = checkPropTypes;
+
+ /***/
+ },
+
+ /***/ "./node_modules/prop-types/lib/ReactPropTypesSecret.js":
+ /*!*************************************************************!*\
+ !*** ./node_modules/prop-types/lib/ReactPropTypesSecret.js ***!
+ \*************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /**
+ * Copyright (c) 2013-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+ var ReactPropTypesSecret =
+ "SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED";
+
+ module.exports = ReactPropTypesSecret;
+
+ /***/
+ },
+
+ /***/ "./node_modules/punycode/punycode.js":
+ /*!*******************************************!*\
+ !*** ./node_modules/punycode/punycode.js ***!
+ \*******************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ /* WEBPACK VAR INJECTION */ (function(module, global) {
+ var __WEBPACK_AMD_DEFINE_RESULT__; /*! https://mths.be/punycode v1.4.1 by @mathias */
+ (function(root) {
+ /** Detect free variables */
+ var freeExports =
+ typeof exports == "object" &&
+ exports &&
+ !exports.nodeType &&
+ exports;
+ var freeModule =
+ typeof module == "object" && module && !module.nodeType && module;
+ var freeGlobal = typeof global == "object" && global;
+ if (
+ freeGlobal.global === freeGlobal ||
+ freeGlobal.window === freeGlobal ||
+ freeGlobal.self === freeGlobal
+ ) {
+ root = freeGlobal;
+ }
+
+ /**
+ * The `punycode` object.
+ * @name punycode
+ * @type Object
+ */
+ var punycode,
+ /** Highest positive signed 32-bit float value */
+ maxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1
+ /** Bootstring parameters */
+ base = 36,
+ tMin = 1,
+ tMax = 26,
+ skew = 38,
+ damp = 700,
+ initialBias = 72,
+ initialN = 128, // 0x80
+ delimiter = "-", // '\x2D'
+ /** Regular expressions */
+ regexPunycode = /^xn--/,
+ regexNonASCII = /[^\x20-\x7E]/, // unprintable ASCII chars + non-ASCII chars
+ regexSeparators = /[\x2E\u3002\uFF0E\uFF61]/g, // RFC 3490 separators
+ /** Error messages */
+ errors = {
+ overflow: "Overflow: input needs wider integers to process",
+ "not-basic": "Illegal input >= 0x80 (not a basic code point)",
+ "invalid-input": "Invalid input"
+ },
+ /** Convenience shortcuts */
+ baseMinusTMin = base - tMin,
+ floor = Math.floor,
+ stringFromCharCode = String.fromCharCode,
+ /** Temporary variable */
+ key;
+
+ /*--------------------------------------------------------------------------*/
+
+ /**
+ * A generic error utility function.
+ * @private
+ * @param {String} type The error type.
+ * @returns {Error} Throws a `RangeError` with the applicable error message.
+ */
+ function error(type) {
+ throw new RangeError(errors[type]);
+ }
+
+ /**
+ * A generic `Array#map` utility function.
+ * @private
+ * @param {Array} array The array to iterate over.
+ * @param {Function} callback The function that gets called for every array
+ * item.
+ * @returns {Array} A new array of values returned by the callback function.
+ */
+ function map(array, fn) {
+ var length = array.length;
+ var result = [];
+ while (length--) {
+ result[length] = fn(array[length]);
+ }
+ return result;
+ }
+
+ /**
+ * A simple `Array#map`-like wrapper to work with domain name strings or email
+ * addresses.
+ * @private
+ * @param {String} domain The domain name or email address.
+ * @param {Function} callback The function that gets called for every
+ * character.
+ * @returns {Array} A new string of characters returned by the callback
+ * function.
+ */
+ function mapDomain(string, fn) {
+ var parts = string.split("@");
+ var result = "";
+ if (parts.length > 1) {
+ // In email addresses, only the domain name should be punycoded. Leave
+ // the local part (i.e. everything up to `@`) intact.
+ result = parts[0] + "@";
+ string = parts[1];
+ }
+ // Avoid `split(regex)` for IE8 compatibility. See #17.
+ string = string.replace(regexSeparators, "\x2E");
+ var labels = string.split(".");
+ var encoded = map(labels, fn).join(".");
+ return result + encoded;
+ }
+
+ /**
+ * Creates an array containing the numeric code points of each Unicode
+ * character in the string. While JavaScript uses UCS-2 internally,
+ * this function will convert a pair of surrogate halves (each of which
+ * UCS-2 exposes as separate characters) into a single code point,
+ * matching UTF-16.
+ * @see `punycode.ucs2.encode`
+ * @see <https://mathiasbynens.be/notes/javascript-encoding>
+ * @memberOf punycode.ucs2
+ * @name decode
+ * @param {String} string The Unicode input string (UCS-2).
+ * @returns {Array} The new array of code points.
+ */
+ function ucs2decode(string) {
+ var output = [],
+ counter = 0,
+ length = string.length,
+ value,
+ extra;
+ while (counter < length) {
+ value = string.charCodeAt(counter++);
+ if (value >= 0xd800 && value <= 0xdbff && counter < length) {
+ // high surrogate, and there is a next character
+ extra = string.charCodeAt(counter++);
+ if ((extra & 0xfc00) == 0xdc00) {
+ // low surrogate
+ output.push(
+ ((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000
+ );
+ } else {
+ // unmatched surrogate; only append this code unit, in case the next
+ // code unit is the high surrogate of a surrogate pair
+ output.push(value);
+ counter--;
+ }
+ } else {
+ output.push(value);
+ }
+ }
+ return output;
+ }
+
+ /**
+ * Creates a string based on an array of numeric code points.
+ * @see `punycode.ucs2.decode`
+ * @memberOf punycode.ucs2
+ * @name encode
+ * @param {Array} codePoints The array of numeric code points.
+ * @returns {String} The new Unicode string (UCS-2).
+ */
+ function ucs2encode(array) {
+ return map(array, function(value) {
+ var output = "";
+ if (value > 0xffff) {
+ value -= 0x10000;
+ output += stringFromCharCode(
+ ((value >>> 10) & 0x3ff) | 0xd800
+ );
+ value = 0xdc00 | (value & 0x3ff);
+ }
+ output += stringFromCharCode(value);
+ return output;
+ }).join("");
+ }
+
+ /**
+ * Converts a basic code point into a digit/integer.
+ * @see `digitToBasic()`
+ * @private
+ * @param {Number} codePoint The basic numeric code point value.
+ * @returns {Number} The numeric value of a basic code point (for use in
+ * representing integers) in the range `0` to `base - 1`, or `base` if
+ * the code point does not represent a value.
+ */
+ function basicToDigit(codePoint) {
+ if (codePoint - 48 < 10) {
+ return codePoint - 22;
+ }
+ if (codePoint - 65 < 26) {
+ return codePoint - 65;
+ }
+ if (codePoint - 97 < 26) {
+ return codePoint - 97;
+ }
+ return base;
+ }
+
+ /**
+ * Converts a digit/integer into a basic code point.
+ * @see `basicToDigit()`
+ * @private
+ * @param {Number} digit The numeric value of a basic code point.
+ * @returns {Number} The basic code point whose value (when used for
+ * representing integers) is `digit`, which needs to be in the range
+ * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is
+ * used; else, the lowercase form is used. The behavior is undefined
+ * if `flag` is non-zero and `digit` has no uppercase form.
+ */
+ function digitToBasic(digit, flag) {
+ // 0..25 map to ASCII a..z or A..Z
+ // 26..35 map to ASCII 0..9
+ return digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);
+ }
+
+ /**
+ * Bias adaptation function as per section 3.4 of RFC 3492.
+ * https://tools.ietf.org/html/rfc3492#section-3.4
+ * @private
+ */
+ function adapt(delta, numPoints, firstTime) {
+ var k = 0;
+ delta = firstTime ? floor(delta / damp) : delta >> 1;
+ delta += floor(delta / numPoints);
+ for (
+ ;
+ /* no initialization */ delta > (baseMinusTMin * tMax) >> 1;
+ k += base
+ ) {
+ delta = floor(delta / baseMinusTMin);
+ }
+ return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));
+ }
+
+ /**
+ * Converts a Punycode string of ASCII-only symbols to a string of Unicode
+ * symbols.
+ * @memberOf punycode
+ * @param {String} input The Punycode string of ASCII-only symbols.
+ * @returns {String} The resulting string of Unicode symbols.
+ */
+ function decode(input) {
+ // Don't use UCS-2
+ var output = [],
+ inputLength = input.length,
+ out,
+ i = 0,
+ n = initialN,
+ bias = initialBias,
+ basic,
+ j,
+ index,
+ oldi,
+ w,
+ k,
+ digit,
+ t,
+ /** Cached calculation results */
+ baseMinusT;
+
+ // Handle the basic code points: let `basic` be the number of input code
+ // points before the last delimiter, or `0` if there is none, then copy
+ // the first basic code points to the output.
+
+ basic = input.lastIndexOf(delimiter);
+ if (basic < 0) {
+ basic = 0;
+ }
+
+ for (j = 0; j < basic; ++j) {
+ // if it's not a basic code point
+ if (input.charCodeAt(j) >= 0x80) {
+ error("not-basic");
+ }
+ output.push(input.charCodeAt(j));
+ }
+
+ // Main decoding loop: start just after the last delimiter if any basic code
+ // points were copied; start at the beginning otherwise.
+
+ for (
+ index = basic > 0 ? basic + 1 : 0;
+ index < inputLength /* no final expression */;
+
+ ) {
+ // `index` is the index of the next character to be consumed.
+ // Decode a generalized variable-length integer into `delta`,
+ // which gets added to `i`. The overflow checking is easier
+ // if we increase `i` as we go, then subtract off its starting
+ // value at the end to obtain `delta`.
+ for (
+ oldi = i, w = 1, k = base /* no condition */;
+ ;
+ k += base
+ ) {
+ if (index >= inputLength) {
+ error("invalid-input");
+ }
+
+ digit = basicToDigit(input.charCodeAt(index++));
+
+ if (digit >= base || digit > floor((maxInt - i) / w)) {
+ error("overflow");
+ }
+
+ i += digit * w;
+ t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;
+
+ if (digit < t) {
+ break;
+ }
+
+ baseMinusT = base - t;
+ if (w > floor(maxInt / baseMinusT)) {
+ error("overflow");
+ }
+
+ w *= baseMinusT;
+ }
+
+ out = output.length + 1;
+ bias = adapt(i - oldi, out, oldi == 0);
+
+ // `i` was supposed to wrap around from `out` to `0`,
+ // incrementing `n` each time, so we'll fix that now:
+ if (floor(i / out) > maxInt - n) {
+ error("overflow");
+ }
+
+ n += floor(i / out);
+ i %= out;
+
+ // Insert `n` at position `i` of the output
+ output.splice(i++, 0, n);
+ }
+
+ return ucs2encode(output);
+ }
+
+ /**
+ * Converts a string of Unicode symbols (e.g. a domain name label) to a
+ * Punycode string of ASCII-only symbols.
+ * @memberOf punycode
+ * @param {String} input The string of Unicode symbols.
+ * @returns {String} The resulting Punycode string of ASCII-only symbols.
+ */
+ function encode(input) {
+ var n,
+ delta,
+ handledCPCount,
+ basicLength,
+ bias,
+ j,
+ m,
+ q,
+ k,
+ t,
+ currentValue,
+ output = [],
+ /** `inputLength` will hold the number of code points in `input`. */
+ inputLength,
+ /** Cached calculation results */
+ handledCPCountPlusOne,
+ baseMinusT,
+ qMinusT;
+
+ // Convert the input in UCS-2 to Unicode
+ input = ucs2decode(input);
+
+ // Cache the length
+ inputLength = input.length;
+
+ // Initialize the state
+ n = initialN;
+ delta = 0;
+ bias = initialBias;
+
+ // Handle the basic code points
+ for (j = 0; j < inputLength; ++j) {
+ currentValue = input[j];
+ if (currentValue < 0x80) {
+ output.push(stringFromCharCode(currentValue));
+ }
+ }
+
+ handledCPCount = basicLength = output.length;
+
+ // `handledCPCount` is the number of code points that have been handled;
+ // `basicLength` is the number of basic code points.
+
+ // Finish the basic string - if it is not empty - with a delimiter
+ if (basicLength) {
+ output.push(delimiter);
+ }
+
+ // Main encoding loop:
+ while (handledCPCount < inputLength) {
+ // All non-basic code points < n have been handled already. Find the next
+ // larger one:
+ for (m = maxInt, j = 0; j < inputLength; ++j) {
+ currentValue = input[j];
+ if (currentValue >= n && currentValue < m) {
+ m = currentValue;
+ }
+ }
+
+ // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,
+ // but guard against overflow
+ handledCPCountPlusOne = handledCPCount + 1;
+ if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {
+ error("overflow");
+ }
+
+ delta += (m - n) * handledCPCountPlusOne;
+ n = m;
+
+ for (j = 0; j < inputLength; ++j) {
+ currentValue = input[j];
+
+ if (currentValue < n && ++delta > maxInt) {
+ error("overflow");
+ }
+
+ if (currentValue == n) {
+ // Represent delta as a generalized variable-length integer
+ for (q = delta, k = base /* no condition */; ; k += base) {
+ t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias;
+ if (q < t) {
+ break;
+ }
+ qMinusT = q - t;
+ baseMinusT = base - t;
+ output.push(
+ stringFromCharCode(
+ digitToBasic(t + qMinusT % baseMinusT, 0)
+ )
+ );
+ q = floor(qMinusT / baseMinusT);
+ }
+
+ output.push(stringFromCharCode(digitToBasic(q, 0)));
+ bias = adapt(
+ delta,
+ handledCPCountPlusOne,
+ handledCPCount == basicLength
+ );
+ delta = 0;
+ ++handledCPCount;
+ }
+ }
+
+ ++delta;
+ ++n;
+ }
+ return output.join("");
+ }
+
+ /**
+ * Converts a Punycode string representing a domain name or an email address
+ * to Unicode. Only the Punycoded parts of the input will be converted, i.e.
+ * it doesn't matter if you call it on a string that has already been
+ * converted to Unicode.
+ * @memberOf punycode
+ * @param {String} input The Punycoded domain name or email address to
+ * convert to Unicode.
+ * @returns {String} The Unicode representation of the given Punycode
+ * string.
+ */
+ function toUnicode(input) {
+ return mapDomain(input, function(string) {
+ return regexPunycode.test(string)
+ ? decode(string.slice(4).toLowerCase())
+ : string;
+ });
+ }
+
+ /**
+ * Converts a Unicode string representing a domain name or an email address to
+ * Punycode. Only the non-ASCII parts of the domain name will be converted,
+ * i.e. it doesn't matter if you call it with a domain that's already in
+ * ASCII.
+ * @memberOf punycode
+ * @param {String} input The domain name or email address to convert, as a
+ * Unicode string.
+ * @returns {String} The Punycode representation of the given domain name or
+ * email address.
+ */
+ function toASCII(input) {
+ return mapDomain(input, function(string) {
+ return regexNonASCII.test(string)
+ ? "xn--" + encode(string)
+ : string;
+ });
+ }
+
+ /*--------------------------------------------------------------------------*/
+
+ /** Define the public API */
+ punycode = {
+ /**
+ * A string representing the current Punycode.js version number.
+ * @memberOf punycode
+ * @type String
+ */
+ version: "1.4.1",
+ /**
+ * An object of methods to convert from JavaScript's internal character
+ * representation (UCS-2) to Unicode code points, and back.
+ * @see <https://mathiasbynens.be/notes/javascript-encoding>
+ * @memberOf punycode
+ * @type Object
+ */
+ ucs2: {
+ decode: ucs2decode,
+ encode: ucs2encode
+ },
+ decode: decode,
+ encode: encode,
+ toASCII: toASCII,
+ toUnicode: toUnicode
+ };
+
+ /** Expose `punycode` */
+ // Some AMD build optimizers, like r.js, check for specific condition patterns
+ // like the following:
+ if (true) {
+ !((__WEBPACK_AMD_DEFINE_RESULT__ = function() {
+ return punycode;
+ }.call(exports, __webpack_require__, exports, module)),
+ __WEBPACK_AMD_DEFINE_RESULT__ !== undefined &&
+ (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
+ } else if (freeExports && freeModule) {
+ if (module.exports == freeExports) {
+ // in Node.js, io.js, or RingoJS v0.8.0+
+ freeModule.exports = punycode;
+ } else {
+ // in Narwhal or RingoJS v0.7.0-
+ for (key in punycode) {
+ punycode.hasOwnProperty(key) &&
+ (freeExports[key] = punycode[key]);
+ }
+ }
+ } else {
+ // in Rhino or a web browser
+ root.punycode = punycode;
+ }
+ })(this);
+
+ /* WEBPACK VAR INJECTION */
+ }.call(
+ exports,
+ __webpack_require__(
+ /*! ./../webpack/buildin/module.js */ "./node_modules/webpack/buildin/module.js"
+ )(module),
+ __webpack_require__(
+ /*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"
+ )
+ ));
+
+ /***/
+ },
+
+ /***/ "./node_modules/querystring-es3/decode.js":
+ /*!************************************************!*\
+ !*** ./node_modules/querystring-es3/decode.js ***!
+ \************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ // Copyright Joyent, Inc. and other Node contributors.
+ //
+ // 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.
+
+ // If obj.hasOwnProperty has been overridden, then calling
+ // obj.hasOwnProperty(prop) will break.
+ // See: https://github.com/joyent/node/issues/1707
+ function hasOwnProperty(obj, prop) {
+ return Object.prototype.hasOwnProperty.call(obj, prop);
+ }
+
+ module.exports = function(qs, sep, eq, options) {
+ sep = sep || "&";
+ eq = eq || "=";
+ var obj = {};
+
+ if (typeof qs !== "string" || qs.length === 0) {
+ return obj;
+ }
+
+ var regexp = /\+/g;
+ qs = qs.split(sep);
+
+ var maxKeys = 1000;
+ if (options && typeof options.maxKeys === "number") {
+ maxKeys = options.maxKeys;
+ }
+
+ var len = qs.length;
+ // maxKeys <= 0 means that we should not limit keys count
+ if (maxKeys > 0 && len > maxKeys) {
+ len = maxKeys;
+ }
+
+ for (var i = 0; i < len; ++i) {
+ var x = qs[i].replace(regexp, "%20"),
+ idx = x.indexOf(eq),
+ kstr,
+ vstr,
+ k,
+ v;
+
+ if (idx >= 0) {
+ kstr = x.substr(0, idx);
+ vstr = x.substr(idx + 1);
+ } else {
+ kstr = x;
+ vstr = "";
+ }
+
+ k = decodeURIComponent(kstr);
+ v = decodeURIComponent(vstr);
+
+ if (!hasOwnProperty(obj, k)) {
+ obj[k] = v;
+ } else if (isArray(obj[k])) {
+ obj[k].push(v);
+ } else {
+ obj[k] = [obj[k], v];
+ }
+ }
+
+ return obj;
+ };
+
+ var isArray =
+ Array.isArray ||
+ function(xs) {
+ return Object.prototype.toString.call(xs) === "[object Array]";
+ };
+
+ /***/
+ },
+
+ /***/ "./node_modules/querystring-es3/encode.js":
+ /*!************************************************!*\
+ !*** ./node_modules/querystring-es3/encode.js ***!
+ \************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ // Copyright Joyent, Inc. and other Node contributors.
+ //
+ // 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.
+
+ var stringifyPrimitive = function(v) {
+ switch (typeof v) {
+ case "string":
+ return v;
+
+ case "boolean":
+ return v ? "true" : "false";
+
+ case "number":
+ return isFinite(v) ? v : "";
+
+ default:
+ return "";
+ }
+ };
+
+ module.exports = function(obj, sep, eq, name) {
+ sep = sep || "&";
+ eq = eq || "=";
+ if (obj === null) {
+ obj = undefined;
+ }
+
+ if (typeof obj === "object") {
+ return map(objectKeys(obj), function(k) {
+ var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;
+ if (isArray(obj[k])) {
+ return map(obj[k], function(v) {
+ return ks + encodeURIComponent(stringifyPrimitive(v));
+ }).join(sep);
+ } else {
+ return ks + encodeURIComponent(stringifyPrimitive(obj[k]));
+ }
+ }).join(sep);
+ }
+
+ if (!name) return "";
+ return (
+ encodeURIComponent(stringifyPrimitive(name)) +
+ eq +
+ encodeURIComponent(stringifyPrimitive(obj))
+ );
+ };
+
+ var isArray =
+ Array.isArray ||
+ function(xs) {
+ return Object.prototype.toString.call(xs) === "[object Array]";
+ };
+
+ function map(xs, f) {
+ if (xs.map) return xs.map(f);
+ var res = [];
+ for (var i = 0; i < xs.length; i++) {
+ res.push(f(xs[i], i));
+ }
+ return res;
+ }
+
+ var objectKeys =
+ Object.keys ||
+ function(obj) {
+ var res = [];
+ for (var key in obj) {
+ if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key);
+ }
+ return res;
+ };
+
+ /***/
+ },
+
+ /***/ "./node_modules/querystring-es3/index.js":
+ /*!***********************************************!*\
+ !*** ./node_modules/querystring-es3/index.js ***!
+ \***********************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ exports.decode = exports.parse = __webpack_require__(
+ /*! ./decode */ "./node_modules/querystring-es3/decode.js"
+ );
+ exports.encode = exports.stringify = __webpack_require__(
+ /*! ./encode */ "./node_modules/querystring-es3/encode.js"
+ );
+
+ /***/
+ },
+
+ /***/ "./node_modules/react-dev-utils/formatWebpackMessages.js":
+ /*!***************************************************************!*\
+ !*** ./node_modules/react-dev-utils/formatWebpackMessages.js ***!
+ \***************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /**
+ * Copyright (c) 2015-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+ // WARNING: this code is untranspiled and is used in browser too.
+ // Please make sure any changes are in ES5 or contribute a Babel compile step.
+
+ // Some custom utilities to prettify Webpack output.
+ // This is quite hacky and hopefully won't be needed when Webpack fixes this.
+ // https://github.com/webpack/webpack/issues/2878
+
+ var chalk = __webpack_require__(
+ /*! chalk */ "./node_modules/react-dev-utils/node_modules/chalk/index.js"
+ );
+ var friendlySyntaxErrorLabel = "Syntax error:";
+
+ function isLikelyASyntaxError(message) {
+ return message.indexOf(friendlySyntaxErrorLabel) !== -1;
+ }
+
+ // Cleans up webpack error messages.
+ // eslint-disable-next-line no-unused-vars
+ function formatMessage(message, isError) {
+ var lines = message.split("\n");
+
+ if (lines.length > 2 && lines[1] === "") {
+ // Remove extra newline.
+ lines.splice(1, 1);
+ }
+
+ // Remove webpack-specific loader notation from filename.
+ // Before:
+ // ./~/css-loader!./~/postcss-loader!./src/App.css
+ // After:
+ // ./src/App.css
+ if (lines[0].lastIndexOf("!") !== -1) {
+ lines[0] = lines[0].substr(lines[0].lastIndexOf("!") + 1);
+ }
+
+ lines = lines.filter(function(line) {
+ // Webpack adds a list of entry points to warning messages:
+ // @ ./src/index.js
+ // @ multi react-scripts/~/react-dev-utils/webpackHotDevClient.js ...
+ // It is misleading (and unrelated to the warnings) so we clean it up.
+ // It is only useful for syntax errors but we have beautiful frames for them.
+ return line.indexOf(" @ ") !== 0;
+ });
+
+ // line #0 is filename
+ // line #1 is the main error message
+ if (!lines[0] || !lines[1]) {
+ return lines.join("\n");
+ }
+
+ // Cleans up verbose "module not found" messages for files and packages.
+ if (lines[1].indexOf("Module not found: ") === 0) {
+ lines = [
+ lines[0],
+ // Clean up message because "Module not found: " is descriptive enough.
+ lines[1]
+ .replace("Cannot resolve 'file' or 'directory' ", "")
+ .replace("Cannot resolve module ", "")
+ .replace("Error: ", "")
+ .replace("[CaseSensitivePathsPlugin] ", "")
+ ];
+ }
+
+ // Cleans up syntax error messages.
+ if (lines[1].indexOf("Module build failed: ") === 0) {
+ lines[1] = lines[1].replace(
+ "Module build failed: SyntaxError:",
+ friendlySyntaxErrorLabel
+ );
+ }
+
+ // Clean up export errors.
+ // TODO: we should really send a PR to Webpack for this.
+ var exportError = /\s*(.+?)\s*(")?export '(.+?)' was not found in '(.+?)'/;
+ if (lines[1].match(exportError)) {
+ lines[1] = lines[1].replace(
+ exportError,
+ "$1 '$4' does not contain an export named '$3'."
+ );
+ }
+
+ lines[0] = chalk.inverse(lines[0]);
+
+ // Reassemble the message.
+ message = lines.join("\n");
+ // Internal stacks are generally useless so we strip them... with the
+ // exception of stacks containing `webpack:` because they're normally
+ // from user code generated by WebPack. For more information see
+ // https://github.com/facebookincubator/create-react-app/pull/1050
+ message = message.replace(
+ /^\s*at\s((?!webpack:).)*:\d+:\d+[\s)]*(\n|$)/gm,
+ ""
+ ); // at ... ...:x:y
+
+ return message.trim();
+ }
+
+ function formatWebpackMessages(json) {
+ var formattedErrors = json.errors.map(function(message) {
+ return formatMessage(message, true);
+ });
+ var formattedWarnings = json.warnings.map(function(message) {
+ return formatMessage(message, false);
+ });
+ var result = {
+ errors: formattedErrors,
+ warnings: formattedWarnings
+ };
+ if (result.errors.some(isLikelyASyntaxError)) {
+ // If there are any syntax errors, show just them.
+ // This prevents a confusing ESLint parsing error
+ // preceding a much more useful Babel syntax error.
+ result.errors = result.errors.filter(isLikelyASyntaxError);
+ }
+ return result;
+ }
+
+ module.exports = formatWebpackMessages;
+
+ /***/
+ },
+
+ /***/ "./node_modules/react-dev-utils/launchEditorEndpoint.js":
+ /*!**************************************************************!*\
+ !*** ./node_modules/react-dev-utils/launchEditorEndpoint.js ***!
+ \**************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /**
+ * Copyright (c) 2015-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+ // TODO: we might want to make this injectable to support DEV-time non-root URLs.
+ module.exports = "/__open-stack-frame-in-editor";
+
+ /***/
+ },
+
+ /***/ "./node_modules/react-dev-utils/node_modules/chalk/index.js":
+ /*!******************************************************************!*\
+ !*** ./node_modules/react-dev-utils/node_modules/chalk/index.js ***!
+ \******************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /* WEBPACK VAR INJECTION */ (function(process) {
+ var escapeStringRegexp = __webpack_require__(
+ /*! escape-string-regexp */ "./node_modules/escape-string-regexp/index.js"
+ );
+ var ansiStyles = __webpack_require__(
+ /*! ansi-styles */ "./node_modules/ansi-styles/index.js"
+ );
+ var stripAnsi = __webpack_require__(
+ /*! strip-ansi */ "./node_modules/react-dev-utils/node_modules/strip-ansi/index.js"
+ );
+ var hasAnsi = __webpack_require__(
+ /*! has-ansi */ "./node_modules/has-ansi/index.js"
+ );
+ var supportsColor = __webpack_require__(
+ /*! supports-color */ "./node_modules/supports-color/index.js"
+ );
+ var defineProps = Object.defineProperties;
+ var isSimpleWindowsTerm =
+ process.platform === "win32" &&
+ !/^xterm/i.test(
+ Object({ NODE_ENV: "development", PUBLIC_URL: "" }).TERM
+ );
+
+ function Chalk(options) {
+ // detect mode if not set manually
+ this.enabled =
+ !options || options.enabled === undefined
+ ? supportsColor
+ : options.enabled;
+ }
+
+ // use bright blue on Windows as the normal blue color is illegible
+ if (isSimpleWindowsTerm) {
+ ansiStyles.blue.open = "\u001b[94m";
+ }
+
+ var styles = (function() {
+ var ret = {};
+
+ Object.keys(ansiStyles).forEach(function(key) {
+ ansiStyles[key].closeRe = new RegExp(
+ escapeStringRegexp(ansiStyles[key].close),
+ "g"
+ );
+
+ ret[key] = {
+ get: function() {
+ return build.call(this, this._styles.concat(key));
+ }
+ };
+ });
+
+ return ret;
+ })();
+
+ var proto = defineProps(function chalk() {}, styles);
+
+ function build(_styles) {
+ var builder = function() {
+ return applyStyle.apply(builder, arguments);
+ };
+
+ builder._styles = _styles;
+ builder.enabled = this.enabled;
+ // __proto__ is used because we must return a function, but there is
+ // no way to create a function with a different prototype.
+ /* eslint-disable no-proto */
+ builder.__proto__ = proto;
+
+ return builder;
+ }
+
+ function applyStyle() {
+ // support varags, but simply cast to string in case there's only one arg
+ var args = arguments;
+ var argsLen = args.length;
+ var str = argsLen !== 0 && String(arguments[0]);
+
+ if (argsLen > 1) {
+ // don't slice `arguments`, it prevents v8 optimizations
+ for (var a = 1; a < argsLen; a++) {
+ str += " " + args[a];
+ }
+ }
+
+ if (!this.enabled || !str) {
+ return str;
+ }
+
+ var nestedStyles = this._styles;
+ var i = nestedStyles.length;
+
+ // Turns out that on Windows dimmed gray text becomes invisible in cmd.exe,
+ // see https://github.com/chalk/chalk/issues/58
+ // If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop.
+ var originalDim = ansiStyles.dim.open;
+ if (
+ isSimpleWindowsTerm &&
+ (nestedStyles.indexOf("gray") !== -1 ||
+ nestedStyles.indexOf("grey") !== -1)
+ ) {
+ ansiStyles.dim.open = "";
+ }
+
+ while (i--) {
+ var code = ansiStyles[nestedStyles[i]];
+
+ // Replace any instances already present with a re-opening code
+ // otherwise only the part of the string until said closing code
+ // will be colored, and the rest will simply be 'plain'.
+ str =
+ code.open + str.replace(code.closeRe, code.open) + code.close;
+ }
+
+ // Reset the original 'dim' if we changed it to work around the Windows dimmed gray issue.
+ ansiStyles.dim.open = originalDim;
+
+ return str;
+ }
+
+ function init() {
+ var ret = {};
+
+ Object.keys(styles).forEach(function(name) {
+ ret[name] = {
+ get: function() {
+ return build.call(this, [name]);
+ }
+ };
+ });
+
+ return ret;
+ }
+
+ defineProps(Chalk.prototype, init());
+
+ module.exports = new Chalk();
+ module.exports.styles = ansiStyles;
+ module.exports.hasColor = hasAnsi;
+ module.exports.stripColor = stripAnsi;
+ module.exports.supportsColor = supportsColor;
+
+ /* WEBPACK VAR INJECTION */
+ }.call(
+ exports,
+ __webpack_require__(
+ /*! ./../../../process/browser.js */ "./node_modules/process/browser.js"
+ )
+ ));
+
+ /***/
+ },
+
+ /***/ "./node_modules/react-dev-utils/node_modules/strip-ansi/index.js":
+ /*!***********************************************************************!*\
+ !*** ./node_modules/react-dev-utils/node_modules/strip-ansi/index.js ***!
+ \***********************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ var ansiRegex = __webpack_require__(
+ /*! ansi-regex */ "./node_modules/ansi-regex/index.js"
+ )();
+
+ module.exports = function(str) {
+ return typeof str === "string" ? str.replace(ansiRegex, "") : str;
+ };
+
+ /***/
+ },
+
+ /***/ "./node_modules/react-dev-utils/webpackHotDevClient.js":
+ /*!*************************************************************!*\
+ !*** ./node_modules/react-dev-utils/webpackHotDevClient.js ***!
+ \*************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /**
+ * Copyright (c) 2015-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+ // This alternative WebpackDevServer combines the functionality of:
+ // https://github.com/webpack/webpack-dev-server/blob/webpack-1/client/index.js
+ // https://github.com/webpack/webpack/blob/webpack-1/hot/dev-server.js
+
+ // It only supports their simplest configuration (hot updates on same server).
+ // It makes some opinionated choices on top, like adding a syntax error overlay
+ // that looks similar to our console output. The error overlay is inspired by:
+ // https://github.com/glenjamin/webpack-hot-middleware
+
+ var SockJS = __webpack_require__(
+ /*! sockjs-client */ "./node_modules/sockjs-client/lib/entry.js"
+ );
+ var stripAnsi = __webpack_require__(
+ /*! strip-ansi */ "./node_modules/react-dev-utils/node_modules/strip-ansi/index.js"
+ );
+ var url = __webpack_require__(/*! url */ "./node_modules/url/url.js");
+ var launchEditorEndpoint = __webpack_require__(
+ /*! ./launchEditorEndpoint */ "./node_modules/react-dev-utils/launchEditorEndpoint.js"
+ );
+ var formatWebpackMessages = __webpack_require__(
+ /*! ./formatWebpackMessages */ "./node_modules/react-dev-utils/formatWebpackMessages.js"
+ );
+ var ErrorOverlay = __webpack_require__(
+ /*! react-error-overlay */ "./node_modules/react-error-overlay/lib/index.js"
+ );
+
+ ErrorOverlay.setEditorHandler(function editorHandler(errorLocation) {
+ // Keep this sync with errorOverlayMiddleware.js
+ fetch(
+ launchEditorEndpoint +
+ "?fileName=" +
+ window.encodeURIComponent(errorLocation.fileName) +
+ "&lineNumber=" +
+ window.encodeURIComponent(errorLocation.lineNumber || 1)
+ );
+ });
+
+ // We need to keep track of if there has been a runtime error.
+ // Essentially, we cannot guarantee application state was not corrupted by the
+ // runtime error. To prevent confusing behavior, we forcibly reload the entire
+ // application. This is handled below when we are notified of a compile (code
+ // change).
+ // See https://github.com/facebookincubator/create-react-app/issues/3096
+ var hadRuntimeError = false;
+ ErrorOverlay.startReportingRuntimeErrors({
+ onError: function() {
+ hadRuntimeError = true;
+ },
+ filename: "/static/js/bundle.js"
+ });
+
+ if (module.hot && typeof module.hot.dispose === "function") {
+ module.hot.dispose(function() {
+ // TODO: why do we need this?
+ ErrorOverlay.stopReportingRuntimeErrors();
+ });
+ }
+
+ // Connect to WebpackDevServer via a socket.
+ var connection = new SockJS(
+ url.format({
+ protocol: window.location.protocol,
+ hostname: window.location.hostname,
+ port: window.location.port,
+ // Hardcoded in WebpackDevServer
+ pathname: "/sockjs-node"
+ })
+ );
+
+ // Unlike WebpackDevServer client, we won't try to reconnect
+ // to avoid spamming the console. Disconnect usually happens
+ // when developer stops the server.
+ connection.onclose = function() {
+ if (
+ typeof console !== "undefined" &&
+ typeof console.info === "function"
+ ) {
+ console.info(
+ "The development server has disconnected.\nRefresh the page if necessary."
+ );
+ }
+ };
+
+ // Remember some state related to hot module replacement.
+ var isFirstCompilation = true;
+ var mostRecentCompilationHash = null;
+ var hasCompileErrors = false;
+
+ function clearOutdatedErrors() {
+ // Clean up outdated compile errors, if any.
+ if (
+ typeof console !== "undefined" &&
+ typeof console.clear === "function"
+ ) {
+ if (hasCompileErrors) {
+ console.clear();
+ }
+ }
+ }
+
+ // Successful compilation.
+ function handleSuccess() {
+ clearOutdatedErrors();
+
+ var isHotUpdate = !isFirstCompilation;
+ isFirstCompilation = false;
+ hasCompileErrors = false;
+
+ // Attempt to apply hot updates or reload.
+ if (isHotUpdate) {
+ tryApplyUpdates(function onHotUpdateSuccess() {
+ // Only dismiss it when we're sure it's a hot update.
+ // Otherwise it would flicker right before the reload.
+ ErrorOverlay.dismissBuildError();
+ });
+ }
+ }
+
+ // Compilation with warnings (e.g. ESLint).
+ function handleWarnings(warnings) {
+ clearOutdatedErrors();
+
+ var isHotUpdate = !isFirstCompilation;
+ isFirstCompilation = false;
+ hasCompileErrors = false;
+
+ function printWarnings() {
+ // Print warnings to the console.
+ var formatted = formatWebpackMessages({
+ warnings: warnings,
+ errors: []
+ });
+
+ if (
+ typeof console !== "undefined" &&
+ typeof console.warn === "function"
+ ) {
+ for (var i = 0; i < formatted.warnings.length; i++) {
+ if (i === 5) {
+ console.warn(
+ "There were more warnings in other files.\n" +
+ "You can find a complete log in the terminal."
+ );
+ break;
+ }
+ console.warn(stripAnsi(formatted.warnings[i]));
+ }
+ }
+ }
+
+ // Attempt to apply hot updates or reload.
+ if (isHotUpdate) {
+ tryApplyUpdates(function onSuccessfulHotUpdate() {
+ // Only print warnings if we aren't refreshing the page.
+ // Otherwise they'll disappear right away anyway.
+ printWarnings();
+ // Only dismiss it when we're sure it's a hot update.
+ // Otherwise it would flicker right before the reload.
+ ErrorOverlay.dismissBuildError();
+ });
+ } else {
+ // Print initial warnings immediately.
+ printWarnings();
+ }
+ }
+
+ // Compilation with errors (e.g. syntax error or missing modules).
+ function handleErrors(errors) {
+ clearOutdatedErrors();
+
+ isFirstCompilation = false;
+ hasCompileErrors = true;
+
+ // "Massage" webpack messages.
+ var formatted = formatWebpackMessages({
+ errors: errors,
+ warnings: []
+ });
+
+ // Only show the first error.
+ ErrorOverlay.reportBuildError(formatted.errors[0]);
+
+ // Also log them to the console.
+ if (
+ typeof console !== "undefined" &&
+ typeof console.error === "function"
+ ) {
+ for (var i = 0; i < formatted.errors.length; i++) {
+ console.error(stripAnsi(formatted.errors[i]));
+ }
+ }
+
+ // Do not attempt to reload now.
+ // We will reload on next success instead.
+ }
+
+ // There is a newer version of the code available.
+ function handleAvailableHash(hash) {
+ // Update last known compilation hash.
+ mostRecentCompilationHash = hash;
+ }
+
+ // Handle messages from the server.
+ connection.onmessage = function(e) {
+ var message = JSON.parse(e.data);
+ switch (message.type) {
+ case "hash":
+ handleAvailableHash(message.data);
+ break;
+ case "still-ok":
+ case "ok":
+ handleSuccess();
+ break;
+ case "content-changed":
+ // Triggered when a file from `contentBase` changed.
+ window.location.reload();
+ break;
+ case "warnings":
+ handleWarnings(message.data);
+ break;
+ case "errors":
+ handleErrors(message.data);
+ break;
+ default:
+ // Do nothing.
+ }
+ };
+
+ // Is there a newer version of this code available?
+ function isUpdateAvailable() {
+ /* globals __webpack_hash__ */
+ // __webpack_hash__ is the hash of the current compilation.
+ // It's a global variable injected by Webpack.
+ return mostRecentCompilationHash !== __webpack_require__.h();
+ }
+
+ // Webpack disallows updates in other states.
+ function canApplyUpdates() {
+ return module.hot.status() === "idle";
+ }
+
+ // Attempt to update code on the fly, fall back to a hard reload.
+ function tryApplyUpdates(onHotUpdateSuccess) {
+ if (false) {
+ // HotModuleReplacementPlugin is not in Webpack configuration.
+ window.location.reload();
+ return;
+ }
+
+ if (!isUpdateAvailable() || !canApplyUpdates()) {
+ return;
+ }
+
+ function handleApplyUpdates(err, updatedModules) {
+ if (err || !updatedModules || hadRuntimeError) {
+ window.location.reload();
+ return;
+ }
+
+ if (typeof onHotUpdateSuccess === "function") {
+ // Maybe we want to do something.
+ onHotUpdateSuccess();
+ }
+
+ if (isUpdateAvailable()) {
+ // While we were updating, there was a new update! Do it again.
+ tryApplyUpdates();
+ }
+ }
+
+ // https://webpack.github.io/docs/hot-module-replacement.html#check
+ var result = module.hot.check(
+ /* autoApply */ true,
+ handleApplyUpdates
+ );
+
+ // // Webpack 2 returns a Promise instead of invoking a callback
+ if (result && result.then) {
+ result.then(
+ function(updatedModules) {
+ handleApplyUpdates(null, updatedModules);
+ },
+ function(err) {
+ handleApplyUpdates(err, null);
+ }
+ );
+ }
+ }
+
+ /***/
+ },
+
+ /***/ "./node_modules/react-dom/cjs/react-dom.development.js":
+ /*!*************************************************************!*\
+ !*** ./node_modules/react-dom/cjs/react-dom.development.js ***!
+ \*************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /** @license React v16.2.0
+ * react-dom.development.js
+ *
+ * Copyright (c) 2013-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+ if (true) {
+ (function() {
+ "use strict";
+
+ var React = __webpack_require__(
+ /*! react */ "./node_modules/react/index.js"
+ );
+ var invariant = __webpack_require__(
+ /*! fbjs/lib/invariant */ "./node_modules/fbjs/lib/invariant.js"
+ );
+ var warning = __webpack_require__(
+ /*! fbjs/lib/warning */ "./node_modules/fbjs/lib/warning.js"
+ );
+ var ExecutionEnvironment = __webpack_require__(
+ /*! fbjs/lib/ExecutionEnvironment */ "./node_modules/fbjs/lib/ExecutionEnvironment.js"
+ );
+ var _assign = __webpack_require__(
+ /*! object-assign */ "./node_modules/object-assign/index.js"
+ );
+ var emptyFunction = __webpack_require__(
+ /*! fbjs/lib/emptyFunction */ "./node_modules/fbjs/lib/emptyFunction.js"
+ );
+ var EventListener = __webpack_require__(
+ /*! fbjs/lib/EventListener */ "./node_modules/fbjs/lib/EventListener.js"
+ );
+ var getActiveElement = __webpack_require__(
+ /*! fbjs/lib/getActiveElement */ "./node_modules/fbjs/lib/getActiveElement.js"
+ );
+ var shallowEqual = __webpack_require__(
+ /*! fbjs/lib/shallowEqual */ "./node_modules/fbjs/lib/shallowEqual.js"
+ );
+ var containsNode = __webpack_require__(
+ /*! fbjs/lib/containsNode */ "./node_modules/fbjs/lib/containsNode.js"
+ );
+ var focusNode = __webpack_require__(
+ /*! fbjs/lib/focusNode */ "./node_modules/fbjs/lib/focusNode.js"
+ );
+ var emptyObject = __webpack_require__(
+ /*! fbjs/lib/emptyObject */ "./node_modules/fbjs/lib/emptyObject.js"
+ );
+ var checkPropTypes = __webpack_require__(
+ /*! prop-types/checkPropTypes */ "./node_modules/prop-types/checkPropTypes.js"
+ );
+ var hyphenateStyleName = __webpack_require__(
+ /*! fbjs/lib/hyphenateStyleName */ "./node_modules/fbjs/lib/hyphenateStyleName.js"
+ );
+ var camelizeStyleName = __webpack_require__(
+ /*! fbjs/lib/camelizeStyleName */ "./node_modules/fbjs/lib/camelizeStyleName.js"
+ );
+
+ /**
+ * WARNING: DO NOT manually require this module.
+ * This is a replacement for `invariant(...)` used by the error code system
+ * and will _only_ be required by the corresponding babel pass.
+ * It always throws.
+ */
+
+ !React
+ ? invariant(
+ false,
+ "ReactDOM was loaded before React. Make sure you load the React package before loading ReactDOM."
+ )
+ : void 0;
+
+ // These attributes should be all lowercase to allow for
+ // case insensitive checks
+ var RESERVED_PROPS = {
+ children: true,
+ dangerouslySetInnerHTML: true,
+ defaultValue: true,
+ defaultChecked: true,
+ innerHTML: true,
+ suppressContentEditableWarning: true,
+ suppressHydrationWarning: true,
+ style: true
+ };
+
+ function checkMask(value, bitmask) {
+ return (value & bitmask) === bitmask;
+ }
+
+ var DOMPropertyInjection = {
+ /**
+ * Mapping from normalized, camelcased property names to a configuration that
+ * specifies how the associated DOM property should be accessed or rendered.
+ */
+ MUST_USE_PROPERTY: 0x1,
+ HAS_BOOLEAN_VALUE: 0x4,
+ HAS_NUMERIC_VALUE: 0x8,
+ HAS_POSITIVE_NUMERIC_VALUE: 0x10 | 0x8,
+ HAS_OVERLOADED_BOOLEAN_VALUE: 0x20,
+ HAS_STRING_BOOLEAN_VALUE: 0x40,
+
+ /**
+ * Inject some specialized knowledge about the DOM. This takes a config object
+ * with the following properties:
+ *
+ * Properties: object mapping DOM property name to one of the
+ * DOMPropertyInjection constants or null. If your attribute isn't in here,
+ * it won't get written to the DOM.
+ *
+ * DOMAttributeNames: object mapping React attribute name to the DOM
+ * attribute name. Attribute names not specified use the **lowercase**
+ * normalized name.
+ *
+ * DOMAttributeNamespaces: object mapping React attribute name to the DOM
+ * attribute namespace URL. (Attribute names not specified use no namespace.)
+ *
+ * DOMPropertyNames: similar to DOMAttributeNames but for DOM properties.
+ * Property names not specified use the normalized name.
+ *
+ * DOMMutationMethods: Properties that require special mutation methods. If
+ * `value` is undefined, the mutation method should unset the property.
+ *
+ * @param {object} domPropertyConfig the config as described above.
+ */
+ injectDOMPropertyConfig: function(domPropertyConfig) {
+ var Injection = DOMPropertyInjection;
+ var Properties = domPropertyConfig.Properties || {};
+ var DOMAttributeNamespaces =
+ domPropertyConfig.DOMAttributeNamespaces || {};
+ var DOMAttributeNames =
+ domPropertyConfig.DOMAttributeNames || {};
+ var DOMMutationMethods =
+ domPropertyConfig.DOMMutationMethods || {};
+
+ for (var propName in Properties) {
+ !!properties.hasOwnProperty(propName)
+ ? invariant(
+ false,
+ "injectDOMPropertyConfig(...): You're trying to inject DOM property '%s' which has already been injected. You may be accidentally injecting the same DOM property config twice, or you may be injecting two configs that have conflicting property names.",
+ propName
+ )
+ : void 0;
+
+ var lowerCased = propName.toLowerCase();
+ var propConfig = Properties[propName];
+
+ var propertyInfo = {
+ attributeName: lowerCased,
+ attributeNamespace: null,
+ propertyName: propName,
+ mutationMethod: null,
+
+ mustUseProperty: checkMask(
+ propConfig,
+ Injection.MUST_USE_PROPERTY
+ ),
+ hasBooleanValue: checkMask(
+ propConfig,
+ Injection.HAS_BOOLEAN_VALUE
+ ),
+ hasNumericValue: checkMask(
+ propConfig,
+ Injection.HAS_NUMERIC_VALUE
+ ),
+ hasPositiveNumericValue: checkMask(
+ propConfig,
+ Injection.HAS_POSITIVE_NUMERIC_VALUE
+ ),
+ hasOverloadedBooleanValue: checkMask(
+ propConfig,
+ Injection.HAS_OVERLOADED_BOOLEAN_VALUE
+ ),
+ hasStringBooleanValue: checkMask(
+ propConfig,
+ Injection.HAS_STRING_BOOLEAN_VALUE
+ )
+ };
+ !(
+ propertyInfo.hasBooleanValue +
+ propertyInfo.hasNumericValue +
+ propertyInfo.hasOverloadedBooleanValue <=
+ 1
+ )
+ ? invariant(
+ false,
+ "DOMProperty: Value can be one of boolean, overloaded boolean, or numeric value, but not a combination: %s",
+ propName
+ )
+ : void 0;
+
+ if (DOMAttributeNames.hasOwnProperty(propName)) {
+ var attributeName = DOMAttributeNames[propName];
+
+ propertyInfo.attributeName = attributeName;
+ }
+
+ if (DOMAttributeNamespaces.hasOwnProperty(propName)) {
+ propertyInfo.attributeNamespace =
+ DOMAttributeNamespaces[propName];
+ }
+
+ if (DOMMutationMethods.hasOwnProperty(propName)) {
+ propertyInfo.mutationMethod = DOMMutationMethods[propName];
+ }
+
+ // Downcase references to whitelist properties to check for membership
+ // without case-sensitivity. This allows the whitelist to pick up
+ // `allowfullscreen`, which should be written using the property configuration
+ // for `allowFullscreen`
+ properties[propName] = propertyInfo;
+ }
+ }
+ };
+
+ /* eslint-disable max-len */
+ var ATTRIBUTE_NAME_START_CHAR =
+ ":A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD";
+ /* eslint-enable max-len */
+ var ATTRIBUTE_NAME_CHAR =
+ ATTRIBUTE_NAME_START_CHAR +
+ "\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040";
+
+ var ROOT_ATTRIBUTE_NAME = "data-reactroot";
+
+ /**
+ * Map from property "standard name" to an object with info about how to set
+ * the property in the DOM. Each object contains:
+ *
+ * attributeName:
+ * Used when rendering markup or with `*Attribute()`.
+ * attributeNamespace
+ * propertyName:
+ * Used on DOM node instances. (This includes properties that mutate due to
+ * external factors.)
+ * mutationMethod:
+ * If non-null, used instead of the property or `setAttribute()` after
+ * initial render.
+ * mustUseProperty:
+ * Whether the property must be accessed and mutated as an object property.
+ * hasBooleanValue:
+ * Whether the property should be removed when set to a falsey value.
+ * hasNumericValue:
+ * Whether the property must be numeric or parse as a numeric and should be
+ * removed when set to a falsey value.
+ * hasPositiveNumericValue:
+ * Whether the property must be positive numeric or parse as a positive
+ * numeric and should be removed when set to a falsey value.
+ * hasOverloadedBooleanValue:
+ * Whether the property can be used as a flag as well as with a value.
+ * Removed when strictly equal to false; present without a value when
+ * strictly equal to true; present with a value otherwise.
+ */
+ var properties = {};
+
+ /**
+ * Checks whether a property name is a writeable attribute.
+ * @method
+ */
+ function shouldSetAttribute(name, value) {
+ if (isReservedProp(name)) {
+ return false;
+ }
+ if (
+ name.length > 2 &&
+ (name[0] === "o" || name[0] === "O") &&
+ (name[1] === "n" || name[1] === "N")
+ ) {
+ return false;
+ }
+ if (value === null) {
+ return true;
+ }
+ switch (typeof value) {
+ case "boolean":
+ return shouldAttributeAcceptBooleanValue(name);
+ case "undefined":
+ case "number":
+ case "string":
+ case "object":
+ return true;
+ default:
+ // function, symbol
+ return false;
+ }
+ }
+
+ function getPropertyInfo(name) {
+ return properties.hasOwnProperty(name) ? properties[name] : null;
+ }
+
+ function shouldAttributeAcceptBooleanValue(name) {
+ if (isReservedProp(name)) {
+ return true;
+ }
+ var propertyInfo = getPropertyInfo(name);
+ if (propertyInfo) {
+ return (
+ propertyInfo.hasBooleanValue ||
+ propertyInfo.hasStringBooleanValue ||
+ propertyInfo.hasOverloadedBooleanValue
+ );
+ }
+ var prefix = name.toLowerCase().slice(0, 5);
+ return prefix === "data-" || prefix === "aria-";
+ }
+
+ /**
+ * Checks to see if a property name is within the list of properties
+ * reserved for internal React operations. These properties should
+ * not be set on an HTML element.
+ *
+ * @private
+ * @param {string} name
+ * @return {boolean} If the name is within reserved props
+ */
+ function isReservedProp(name) {
+ return RESERVED_PROPS.hasOwnProperty(name);
+ }
+
+ var injection = DOMPropertyInjection;
+
+ var MUST_USE_PROPERTY = injection.MUST_USE_PROPERTY;
+ var HAS_BOOLEAN_VALUE = injection.HAS_BOOLEAN_VALUE;
+ var HAS_NUMERIC_VALUE = injection.HAS_NUMERIC_VALUE;
+ var HAS_POSITIVE_NUMERIC_VALUE =
+ injection.HAS_POSITIVE_NUMERIC_VALUE;
+ var HAS_OVERLOADED_BOOLEAN_VALUE =
+ injection.HAS_OVERLOADED_BOOLEAN_VALUE;
+ var HAS_STRING_BOOLEAN_VALUE = injection.HAS_STRING_BOOLEAN_VALUE;
+
+ var HTMLDOMPropertyConfig = {
+ // When adding attributes to this list, be sure to also add them to
+ // the `possibleStandardNames` module to ensure casing and incorrect
+ // name warnings.
+ Properties: {
+ allowFullScreen: HAS_BOOLEAN_VALUE,
+ // specifies target context for links with `preload` type
+ async: HAS_BOOLEAN_VALUE,
+ // Note: there is a special case that prevents it from being written to the DOM
+ // on the client side because the browsers are inconsistent. Instead we call focus().
+ autoFocus: HAS_BOOLEAN_VALUE,
+ autoPlay: HAS_BOOLEAN_VALUE,
+ capture: HAS_OVERLOADED_BOOLEAN_VALUE,
+ checked: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
+ cols: HAS_POSITIVE_NUMERIC_VALUE,
+ contentEditable: HAS_STRING_BOOLEAN_VALUE,
+ controls: HAS_BOOLEAN_VALUE,
+ default: HAS_BOOLEAN_VALUE,
+ defer: HAS_BOOLEAN_VALUE,
+ disabled: HAS_BOOLEAN_VALUE,
+ download: HAS_OVERLOADED_BOOLEAN_VALUE,
+ draggable: HAS_STRING_BOOLEAN_VALUE,
+ formNoValidate: HAS_BOOLEAN_VALUE,
+ hidden: HAS_BOOLEAN_VALUE,
+ loop: HAS_BOOLEAN_VALUE,
+ // Caution; `option.selected` is not updated if `select.multiple` is
+ // disabled with `removeAttribute`.
+ multiple: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
+ muted: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
+ noValidate: HAS_BOOLEAN_VALUE,
+ open: HAS_BOOLEAN_VALUE,
+ playsInline: HAS_BOOLEAN_VALUE,
+ readOnly: HAS_BOOLEAN_VALUE,
+ required: HAS_BOOLEAN_VALUE,
+ reversed: HAS_BOOLEAN_VALUE,
+ rows: HAS_POSITIVE_NUMERIC_VALUE,
+ rowSpan: HAS_NUMERIC_VALUE,
+ scoped: HAS_BOOLEAN_VALUE,
+ seamless: HAS_BOOLEAN_VALUE,
+ selected: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,
+ size: HAS_POSITIVE_NUMERIC_VALUE,
+ start: HAS_NUMERIC_VALUE,
+ // support for projecting regular DOM Elements via V1 named slots ( shadow dom )
+ span: HAS_POSITIVE_NUMERIC_VALUE,
+ spellCheck: HAS_STRING_BOOLEAN_VALUE,
+ // Style must be explicitly set in the attribute list. React components
+ // expect a style object
+ style: 0,
+ // Keep it in the whitelist because it is case-sensitive for SVG.
+ tabIndex: 0,
+ // itemScope is for for Microdata support.
+ // See http://schema.org/docs/gs.html
+ itemScope: HAS_BOOLEAN_VALUE,
+ // These attributes must stay in the white-list because they have
+ // different attribute names (see DOMAttributeNames below)
+ acceptCharset: 0,
+ className: 0,
+ htmlFor: 0,
+ httpEquiv: 0,
+ // Attributes with mutation methods must be specified in the whitelist
+ // Set the string boolean flag to allow the behavior
+ value: HAS_STRING_BOOLEAN_VALUE
+ },
+ DOMAttributeNames: {
+ acceptCharset: "accept-charset",
+ className: "class",
+ htmlFor: "for",
+ httpEquiv: "http-equiv"
+ },
+ DOMMutationMethods: {
+ value: function(node, value) {
+ if (value == null) {
+ return node.removeAttribute("value");
+ }
+
+ // Number inputs get special treatment due to some edge cases in
+ // Chrome. Let everything else assign the value attribute as normal.
+ // https://github.com/facebook/react/issues/7253#issuecomment-236074326
+ if (
+ node.type !== "number" ||
+ node.hasAttribute("value") === false
+ ) {
+ node.setAttribute("value", "" + value);
+ } else if (
+ node.validity &&
+ !node.validity.badInput &&
+ node.ownerDocument.activeElement !== node
+ ) {
+ // Don't assign an attribute if validation reports bad
+ // input. Chrome will clear the value. Additionally, don't
+ // operate on inputs that have focus, otherwise Chrome might
+ // strip off trailing decimal places and cause the user's
+ // cursor position to jump to the beginning of the input.
+ //
+ // In ReactDOMInput, we have an onBlur event that will trigger
+ // this function again when focus is lost.
+ node.setAttribute("value", "" + value);
+ }
+ }
+ }
+ };
+
+ var HAS_STRING_BOOLEAN_VALUE$1 = injection.HAS_STRING_BOOLEAN_VALUE;
+
+ var NS = {
+ xlink: "http://www.w3.org/1999/xlink",
+ xml: "http://www.w3.org/XML/1998/namespace"
+ };
+
+ /**
+ * This is a list of all SVG attributes that need special casing,
+ * namespacing, or boolean value assignment.
+ *
+ * When adding attributes to this list, be sure to also add them to
+ * the `possibleStandardNames` module to ensure casing and incorrect
+ * name warnings.
+ *
+ * SVG Attributes List:
+ * https://www.w3.org/TR/SVG/attindex.html
+ * SMIL Spec:
+ * https://www.w3.org/TR/smil
+ */
+ var ATTRS = [
+ "accent-height",
+ "alignment-baseline",
+ "arabic-form",
+ "baseline-shift",
+ "cap-height",
+ "clip-path",
+ "clip-rule",
+ "color-interpolation",
+ "color-interpolation-filters",
+ "color-profile",
+ "color-rendering",
+ "dominant-baseline",
+ "enable-background",
+ "fill-opacity",
+ "fill-rule",
+ "flood-color",
+ "flood-opacity",
+ "font-family",
+ "font-size",
+ "font-size-adjust",
+ "font-stretch",
+ "font-style",
+ "font-variant",
+ "font-weight",
+ "glyph-name",
+ "glyph-orientation-horizontal",
+ "glyph-orientation-vertical",
+ "horiz-adv-x",
+ "horiz-origin-x",
+ "image-rendering",
+ "letter-spacing",
+ "lighting-color",
+ "marker-end",
+ "marker-mid",
+ "marker-start",
+ "overline-position",
+ "overline-thickness",
+ "paint-order",
+ "panose-1",
+ "pointer-events",
+ "rendering-intent",
+ "shape-rendering",
+ "stop-color",
+ "stop-opacity",
+ "strikethrough-position",
+ "strikethrough-thickness",
+ "stroke-dasharray",
+ "stroke-dashoffset",
+ "stroke-linecap",
+ "stroke-linejoin",
+ "stroke-miterlimit",
+ "stroke-opacity",
+ "stroke-width",
+ "text-anchor",
+ "text-decoration",
+ "text-rendering",
+ "underline-position",
+ "underline-thickness",
+ "unicode-bidi",
+ "unicode-range",
+ "units-per-em",
+ "v-alphabetic",
+ "v-hanging",
+ "v-ideographic",
+ "v-mathematical",
+ "vector-effect",
+ "vert-adv-y",
+ "vert-origin-x",
+ "vert-origin-y",
+ "word-spacing",
+ "writing-mode",
+ "x-height",
+ "xlink:actuate",
+ "xlink:arcrole",
+ "xlink:href",
+ "xlink:role",
+ "xlink:show",
+ "xlink:title",
+ "xlink:type",
+ "xml:base",
+ "xmlns:xlink",
+ "xml:lang",
+ "xml:space"
+ ];
+
+ var SVGDOMPropertyConfig = {
+ Properties: {
+ autoReverse: HAS_STRING_BOOLEAN_VALUE$1,
+ externalResourcesRequired: HAS_STRING_BOOLEAN_VALUE$1,
+ preserveAlpha: HAS_STRING_BOOLEAN_VALUE$1
+ },
+ DOMAttributeNames: {
+ autoReverse: "autoReverse",
+ externalResourcesRequired: "externalResourcesRequired",
+ preserveAlpha: "preserveAlpha"
+ },
+ DOMAttributeNamespaces: {
+ xlinkActuate: NS.xlink,
+ xlinkArcrole: NS.xlink,
+ xlinkHref: NS.xlink,
+ xlinkRole: NS.xlink,
+ xlinkShow: NS.xlink,
+ xlinkTitle: NS.xlink,
+ xlinkType: NS.xlink,
+ xmlBase: NS.xml,
+ xmlLang: NS.xml,
+ xmlSpace: NS.xml
+ }
+ };
+
+ var CAMELIZE = /[\-\:]([a-z])/g;
+ var capitalize = function(token) {
+ return token[1].toUpperCase();
+ };
+
+ ATTRS.forEach(function(original) {
+ var reactName = original.replace(CAMELIZE, capitalize);
+
+ SVGDOMPropertyConfig.Properties[reactName] = 0;
+ SVGDOMPropertyConfig.DOMAttributeNames[reactName] = original;
+ });
+
+ injection.injectDOMPropertyConfig(HTMLDOMPropertyConfig);
+ injection.injectDOMPropertyConfig(SVGDOMPropertyConfig);
+
+ var ReactErrorUtils = {
+ // Used by Fiber to simulate a try-catch.
+ _caughtError: null,
+ _hasCaughtError: false,
+
+ // Used by event system to capture/rethrow the first error.
+ _rethrowError: null,
+ _hasRethrowError: false,
+
+ injection: {
+ injectErrorUtils: function(injectedErrorUtils) {
+ !(
+ typeof injectedErrorUtils.invokeGuardedCallback ===
+ "function"
+ )
+ ? invariant(
+ false,
+ "Injected invokeGuardedCallback() must be a function."
+ )
+ : void 0;
+ invokeGuardedCallback =
+ injectedErrorUtils.invokeGuardedCallback;
+ }
+ },
+
+ /**
+ * Call a function while guarding against errors that happens within it.
+ * Returns an error if it throws, otherwise null.
+ *
+ * In production, this is implemented using a try-catch. The reason we don't
+ * use a try-catch directly is so that we can swap out a different
+ * implementation in DEV mode.
+ *
+ * @param {String} name of the guard to use for logging or debugging
+ * @param {Function} func The function to invoke
+ * @param {*} context The context to use when calling the function
+ * @param {...*} args Arguments for function
+ */
+ invokeGuardedCallback: function(
+ name,
+ func,
+ context,
+ a,
+ b,
+ c,
+ d,
+ e,
+ f
+ ) {
+ invokeGuardedCallback.apply(ReactErrorUtils, arguments);
+ },
+
+ /**
+ * Same as invokeGuardedCallback, but instead of returning an error, it stores
+ * it in a global so it can be rethrown by `rethrowCaughtError` later.
+ * TODO: See if _caughtError and _rethrowError can be unified.
+ *
+ * @param {String} name of the guard to use for logging or debugging
+ * @param {Function} func The function to invoke
+ * @param {*} context The context to use when calling the function
+ * @param {...*} args Arguments for function
+ */
+ invokeGuardedCallbackAndCatchFirstError: function(
+ name,
+ func,
+ context,
+ a,
+ b,
+ c,
+ d,
+ e,
+ f
+ ) {
+ ReactErrorUtils.invokeGuardedCallback.apply(this, arguments);
+ if (ReactErrorUtils.hasCaughtError()) {
+ var error = ReactErrorUtils.clearCaughtError();
+ if (!ReactErrorUtils._hasRethrowError) {
+ ReactErrorUtils._hasRethrowError = true;
+ ReactErrorUtils._rethrowError = error;
+ }
+ }
+ },
+
+ /**
+ * During execution of guarded functions we will capture the first error which
+ * we will rethrow to be handled by the top level error handler.
+ */
+ rethrowCaughtError: function() {
+ return rethrowCaughtError.apply(ReactErrorUtils, arguments);
+ },
+
+ hasCaughtError: function() {
+ return ReactErrorUtils._hasCaughtError;
+ },
+
+ clearCaughtError: function() {
+ if (ReactErrorUtils._hasCaughtError) {
+ var error = ReactErrorUtils._caughtError;
+ ReactErrorUtils._caughtError = null;
+ ReactErrorUtils._hasCaughtError = false;
+ return error;
+ } else {
+ invariant(
+ false,
+ "clearCaughtError was called but no error was captured. This error is likely caused by a bug in React. Please file an issue."
+ );
+ }
+ }
+ };
+
+ var invokeGuardedCallback = function(
+ name,
+ func,
+ context,
+ a,
+ b,
+ c,
+ d,
+ e,
+ f
+ ) {
+ ReactErrorUtils._hasCaughtError = false;
+ ReactErrorUtils._caughtError = null;
+ var funcArgs = Array.prototype.slice.call(arguments, 3);
+ try {
+ func.apply(context, funcArgs);
+ } catch (error) {
+ ReactErrorUtils._caughtError = error;
+ ReactErrorUtils._hasCaughtError = true;
+ }
+ };
+
+ {
+ // In DEV mode, we swap out invokeGuardedCallback for a special version
+ // that plays more nicely with the browser's DevTools. The idea is to preserve
+ // "Pause on exceptions" behavior. Because React wraps all user-provided
+ // functions in invokeGuardedCallback, and the production version of
+ // invokeGuardedCallback uses a try-catch, all user exceptions are treated
+ // like caught exceptions, and the DevTools won't pause unless the developer
+ // takes the extra step of enabling pause on caught exceptions. This is
+ // untintuitive, though, because even though React has caught the error, from
+ // the developer's perspective, the error is uncaught.
+ //
+ // To preserve the expected "Pause on exceptions" behavior, we don't use a
+ // try-catch in DEV. Instead, we synchronously dispatch a fake event to a fake
+ // DOM node, and call the user-provided callback from inside an event handler
+ // for that fake event. If the callback throws, the error is "captured" using
+ // a global event handler. But because the error happens in a different
+ // event loop context, it does not interrupt the normal program flow.
+ // Effectively, this gives us try-catch behavior without actually using
+ // try-catch. Neat!
+
+ // Check that the browser supports the APIs we need to implement our special
+ // DEV version of invokeGuardedCallback
+ if (
+ typeof window !== "undefined" &&
+ typeof window.dispatchEvent === "function" &&
+ typeof document !== "undefined" &&
+ typeof document.createEvent === "function"
+ ) {
+ var fakeNode = document.createElement("react");
+
+ var invokeGuardedCallbackDev = function(
+ name,
+ func,
+ context,
+ a,
+ b,
+ c,
+ d,
+ e,
+ f
+ ) {
+ // Keeps track of whether the user-provided callback threw an error. We
+ // set this to true at the beginning, then set it to false right after
+ // calling the function. If the function errors, `didError` will never be
+ // set to false. This strategy works even if the browser is flaky and
+ // fails to call our global error handler, because it doesn't rely on
+ // the error event at all.
+ var didError = true;
+
+ // Create an event handler for our fake event. We will synchronously
+ // dispatch our fake event using `dispatchEvent`. Inside the handler, we
+ // call the user-provided callback.
+ var funcArgs = Array.prototype.slice.call(arguments, 3);
+ function callCallback() {
+ // We immediately remove the callback from event listeners so that
+ // nested `invokeGuardedCallback` calls do not clash. Otherwise, a
+ // nested call would trigger the fake event handlers of any call higher
+ // in the stack.
+ fakeNode.removeEventListener(evtType, callCallback, false);
+ func.apply(context, funcArgs);
+ didError = false;
+ }
+
+ // Create a global error event handler. We use this to capture the value
+ // that was thrown. It's possible that this error handler will fire more
+ // than once; for example, if non-React code also calls `dispatchEvent`
+ // and a handler for that event throws. We should be resilient to most of
+ // those cases. Even if our error event handler fires more than once, the
+ // last error event is always used. If the callback actually does error,
+ // we know that the last error event is the correct one, because it's not
+ // possible for anything else to have happened in between our callback
+ // erroring and the code that follows the `dispatchEvent` call below. If
+ // the callback doesn't error, but the error event was fired, we know to
+ // ignore it because `didError` will be false, as described above.
+ var error = void 0;
+ // Use this to track whether the error event is ever called.
+ var didSetError = false;
+ var isCrossOriginError = false;
+
+ function onError(event) {
+ error = event.error;
+ didSetError = true;
+ if (
+ error === null &&
+ event.colno === 0 &&
+ event.lineno === 0
+ ) {
+ isCrossOriginError = true;
+ }
+ }
+
+ // Create a fake event type.
+ var evtType =
+ "react-" + (name ? name : "invokeguardedcallback");
+
+ // Attach our event handlers
+ window.addEventListener("error", onError);
+ fakeNode.addEventListener(evtType, callCallback, false);
+
+ // Synchronously dispatch our fake event. If the user-provided function
+ // errors, it will trigger our global error handler.
+ var evt = document.createEvent("Event");
+ evt.initEvent(evtType, false, false);
+ fakeNode.dispatchEvent(evt);
+
+ if (didError) {
+ if (!didSetError) {
+ // The callback errored, but the error event never fired.
+ error = new Error(
+ "An error was thrown inside one of your components, but React " +
+ "doesn't know what it was. This is likely due to browser " +
+ 'flakiness. React does its best to preserve the "Pause on ' +
+ 'exceptions" behavior of the DevTools, which requires some ' +
+ "DEV-mode only tricks. It's possible that these don't work in " +
+ "your browser. Try triggering the error in production mode, " +
+ "or switching to a modern browser. If you suspect that this is " +
+ "actually an issue with React, please file an issue."
+ );
+ } else if (isCrossOriginError) {
+ error = new Error(
+ "A cross-origin error was thrown. React doesn't have access to " +
+ "the actual error object in development. " +
+ "See https://fb.me/react-crossorigin-error for more information."
+ );
+ }
+ ReactErrorUtils._hasCaughtError = true;
+ ReactErrorUtils._caughtError = error;
+ } else {
+ ReactErrorUtils._hasCaughtError = false;
+ ReactErrorUtils._caughtError = null;
+ }
+
+ // Remove our event listeners
+ window.removeEventListener("error", onError);
+ };
+
+ invokeGuardedCallback = invokeGuardedCallbackDev;
+ }
+ }
+
+ var rethrowCaughtError = function() {
+ if (ReactErrorUtils._hasRethrowError) {
+ var error = ReactErrorUtils._rethrowError;
+ ReactErrorUtils._rethrowError = null;
+ ReactErrorUtils._hasRethrowError = false;
+ throw error;
+ }
+ };
+
+ /**
+ * Injectable ordering of event plugins.
+ */
+ var eventPluginOrder = null;
+
+ /**
+ * Injectable mapping from names to event plugin modules.
+ */
+ var namesToPlugins = {};
+
+ /**
+ * Recomputes the plugin list using the injected plugins and plugin ordering.
+ *
+ * @private
+ */
+ function recomputePluginOrdering() {
+ if (!eventPluginOrder) {
+ // Wait until an `eventPluginOrder` is injected.
+ return;
+ }
+ for (var pluginName in namesToPlugins) {
+ var pluginModule = namesToPlugins[pluginName];
+ var pluginIndex = eventPluginOrder.indexOf(pluginName);
+ !(pluginIndex > -1)
+ ? invariant(
+ false,
+ "EventPluginRegistry: Cannot inject event plugins that do not exist in the plugin ordering, `%s`.",
+ pluginName
+ )
+ : void 0;
+ if (plugins[pluginIndex]) {
+ continue;
+ }
+ !pluginModule.extractEvents
+ ? invariant(
+ false,
+ "EventPluginRegistry: Event plugins must implement an `extractEvents` method, but `%s` does not.",
+ pluginName
+ )
+ : void 0;
+ plugins[pluginIndex] = pluginModule;
+ var publishedEvents = pluginModule.eventTypes;
+ for (var eventName in publishedEvents) {
+ !publishEventForPlugin(
+ publishedEvents[eventName],
+ pluginModule,
+ eventName
+ )
+ ? invariant(
+ false,
+ "EventPluginRegistry: Failed to publish event `%s` for plugin `%s`.",
+ eventName,
+ pluginName
+ )
+ : void 0;
+ }
+ }
+ }
+
+ /**
+ * Publishes an event so that it can be dispatched by the supplied plugin.
+ *
+ * @param {object} dispatchConfig Dispatch configuration for the event.
+ * @param {object} PluginModule Plugin publishing the event.
+ * @return {boolean} True if the event was successfully published.
+ * @private
+ */
+ function publishEventForPlugin(
+ dispatchConfig,
+ pluginModule,
+ eventName
+ ) {
+ !!eventNameDispatchConfigs.hasOwnProperty(eventName)
+ ? invariant(
+ false,
+ "EventPluginHub: More than one plugin attempted to publish the same event name, `%s`.",
+ eventName
+ )
+ : void 0;
+ eventNameDispatchConfigs[eventName] = dispatchConfig;
+
+ var phasedRegistrationNames =
+ dispatchConfig.phasedRegistrationNames;
+ if (phasedRegistrationNames) {
+ for (var phaseName in phasedRegistrationNames) {
+ if (phasedRegistrationNames.hasOwnProperty(phaseName)) {
+ var phasedRegistrationName =
+ phasedRegistrationNames[phaseName];
+ publishRegistrationName(
+ phasedRegistrationName,
+ pluginModule,
+ eventName
+ );
+ }
+ }
+ return true;
+ } else if (dispatchConfig.registrationName) {
+ publishRegistrationName(
+ dispatchConfig.registrationName,
+ pluginModule,
+ eventName
+ );
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * Publishes a registration name that is used to identify dispatched events.
+ *
+ * @param {string} registrationName Registration name to add.
+ * @param {object} PluginModule Plugin publishing the event.
+ * @private
+ */
+ function publishRegistrationName(
+ registrationName,
+ pluginModule,
+ eventName
+ ) {
+ !!registrationNameModules[registrationName]
+ ? invariant(
+ false,
+ "EventPluginHub: More than one plugin attempted to publish the same registration name, `%s`.",
+ registrationName
+ )
+ : void 0;
+ registrationNameModules[registrationName] = pluginModule;
+ registrationNameDependencies[registrationName] =
+ pluginModule.eventTypes[eventName].dependencies;
+
+ {
+ var lowerCasedName = registrationName.toLowerCase();
+ possibleRegistrationNames[lowerCasedName] = registrationName;
+
+ if (registrationName === "onDoubleClick") {
+ possibleRegistrationNames.ondblclick = registrationName;
+ }
+ }
+ }
+
+ /**
+ * Registers plugins so that they can extract and dispatch events.
+ *
+ * @see {EventPluginHub}
+ */
+
+ /**
+ * Ordered list of injected plugins.
+ */
+ var plugins = [];
+
+ /**
+ * Mapping from event name to dispatch config
+ */
+ var eventNameDispatchConfigs = {};
+
+ /**
+ * Mapping from registration name to plugin module
+ */
+ var registrationNameModules = {};
+
+ /**
+ * Mapping from registration name to event name
+ */
+ var registrationNameDependencies = {};
+
+ /**
+ * Mapping from lowercase registration names to the properly cased version,
+ * used to warn in the case of missing event handlers. Available
+ * only in true.
+ * @type {Object}
+ */
+ var possibleRegistrationNames = {};
+ // Trust the developer to only use possibleRegistrationNames in true
+
+ /**
+ * Injects an ordering of plugins (by plugin name). This allows the ordering
+ * to be decoupled from injection of the actual plugins so that ordering is
+ * always deterministic regardless of packaging, on-the-fly injection, etc.
+ *
+ * @param {array} InjectedEventPluginOrder
+ * @internal
+ * @see {EventPluginHub.injection.injectEventPluginOrder}
+ */
+ function injectEventPluginOrder(injectedEventPluginOrder) {
+ !!eventPluginOrder
+ ? invariant(
+ false,
+ "EventPluginRegistry: Cannot inject event plugin ordering more than once. You are likely trying to load more than one copy of React."
+ )
+ : void 0;
+ // Clone the ordering so it cannot be dynamically mutated.
+ eventPluginOrder = Array.prototype.slice.call(
+ injectedEventPluginOrder
+ );
+ recomputePluginOrdering();
+ }
+
+ /**
+ * Injects plugins to be used by `EventPluginHub`. The plugin names must be
+ * in the ordering injected by `injectEventPluginOrder`.
+ *
+ * Plugins can be injected as part of page initialization or on-the-fly.
+ *
+ * @param {object} injectedNamesToPlugins Map from names to plugin modules.
+ * @internal
+ * @see {EventPluginHub.injection.injectEventPluginsByName}
+ */
+ function injectEventPluginsByName(injectedNamesToPlugins) {
+ var isOrderingDirty = false;
+ for (var pluginName in injectedNamesToPlugins) {
+ if (!injectedNamesToPlugins.hasOwnProperty(pluginName)) {
+ continue;
+ }
+ var pluginModule = injectedNamesToPlugins[pluginName];
+ if (
+ !namesToPlugins.hasOwnProperty(pluginName) ||
+ namesToPlugins[pluginName] !== pluginModule
+ ) {
+ !!namesToPlugins[pluginName]
+ ? invariant(
+ false,
+ "EventPluginRegistry: Cannot inject two different event plugins using the same name, `%s`.",
+ pluginName
+ )
+ : void 0;
+ namesToPlugins[pluginName] = pluginModule;
+ isOrderingDirty = true;
+ }
+ }
+ if (isOrderingDirty) {
+ recomputePluginOrdering();
+ }
+ }
+
+ var EventPluginRegistry = Object.freeze({
+ plugins: plugins,
+ eventNameDispatchConfigs: eventNameDispatchConfigs,
+ registrationNameModules: registrationNameModules,
+ registrationNameDependencies: registrationNameDependencies,
+ possibleRegistrationNames: possibleRegistrationNames,
+ injectEventPluginOrder: injectEventPluginOrder,
+ injectEventPluginsByName: injectEventPluginsByName
+ });
+
+ var getFiberCurrentPropsFromNode = null;
+ var getInstanceFromNode = null;
+ var getNodeFromInstance = null;
+
+ var injection$2 = {
+ injectComponentTree: function(Injected) {
+ getFiberCurrentPropsFromNode =
+ Injected.getFiberCurrentPropsFromNode;
+ getInstanceFromNode = Injected.getInstanceFromNode;
+ getNodeFromInstance = Injected.getNodeFromInstance;
+
+ {
+ warning(
+ getNodeFromInstance && getInstanceFromNode,
+ "EventPluginUtils.injection.injectComponentTree(...): Injected " +
+ "module is missing getNodeFromInstance or getInstanceFromNode."
+ );
+ }
+ }
+ };
+
+ var validateEventDispatches;
+ {
+ validateEventDispatches = function(event) {
+ var dispatchListeners = event._dispatchListeners;
+ var dispatchInstances = event._dispatchInstances;
+
+ var listenersIsArr = Array.isArray(dispatchListeners);
+ var listenersLen = listenersIsArr
+ ? dispatchListeners.length
+ : dispatchListeners ? 1 : 0;
+
+ var instancesIsArr = Array.isArray(dispatchInstances);
+ var instancesLen = instancesIsArr
+ ? dispatchInstances.length
+ : dispatchInstances ? 1 : 0;
+
+ warning(
+ instancesIsArr === listenersIsArr &&
+ instancesLen === listenersLen,
+ "EventPluginUtils: Invalid `event`."
+ );
+ };
+ }
+
+ /**
+ * Dispatch the event to the listener.
+ * @param {SyntheticEvent} event SyntheticEvent to handle
+ * @param {boolean} simulated If the event is simulated (changes exn behavior)
+ * @param {function} listener Application-level callback
+ * @param {*} inst Internal component instance
+ */
+ function executeDispatch(event, simulated, listener, inst) {
+ var type = event.type || "unknown-event";
+ event.currentTarget = getNodeFromInstance(inst);
+ ReactErrorUtils.invokeGuardedCallbackAndCatchFirstError(
+ type,
+ listener,
+ undefined,
+ event
+ );
+ event.currentTarget = null;
+ }
+
+ /**
+ * Standard/simple iteration through an event's collected dispatches.
+ */
+ function executeDispatchesInOrder(event, simulated) {
+ var dispatchListeners = event._dispatchListeners;
+ var dispatchInstances = event._dispatchInstances;
+ {
+ validateEventDispatches(event);
+ }
+ if (Array.isArray(dispatchListeners)) {
+ for (var i = 0; i < dispatchListeners.length; i++) {
+ if (event.isPropagationStopped()) {
+ break;
+ }
+ // Listeners and Instances are two parallel arrays that are always in sync.
+ executeDispatch(
+ event,
+ simulated,
+ dispatchListeners[i],
+ dispatchInstances[i]
+ );
+ }
+ } else if (dispatchListeners) {
+ executeDispatch(
+ event,
+ simulated,
+ dispatchListeners,
+ dispatchInstances
+ );
+ }
+ event._dispatchListeners = null;
+ event._dispatchInstances = null;
+ }
+
+ /**
+ * @see executeDispatchesInOrderStopAtTrueImpl
+ */
+
+ /**
+ * Execution of a "direct" dispatch - there must be at most one dispatch
+ * accumulated on the event or it is considered an error. It doesn't really make
+ * sense for an event with multiple dispatches (bubbled) to keep track of the
+ * return values at each dispatch execution, but it does tend to make sense when
+ * dealing with "direct" dispatches.
+ *
+ * @return {*} The return value of executing the single dispatch.
+ */
+
+ /**
+ * @param {SyntheticEvent} event
+ * @return {boolean} True iff number of dispatches accumulated is greater than 0.
+ */
+
+ /**
+ * Accumulates items that must not be null or undefined into the first one. This
+ * is used to conserve memory by avoiding array allocations, and thus sacrifices
+ * API cleanness. Since `current` can be null before being passed in and not
+ * null after this function, make sure to assign it back to `current`:
+ *
+ * `a = accumulateInto(a, b);`
+ *
+ * This API should be sparingly used. Try `accumulate` for something cleaner.
+ *
+ * @return {*|array<*>} An accumulation of items.
+ */
+
+ function accumulateInto(current, next) {
+ !(next != null)
+ ? invariant(
+ false,
+ "accumulateInto(...): Accumulated items must not be null or undefined."
+ )
+ : void 0;
+
+ if (current == null) {
+ return next;
+ }
+
+ // Both are not empty. Warning: Never call x.concat(y) when you are not
+ // certain that x is an Array (x could be a string with concat method).
+ if (Array.isArray(current)) {
+ if (Array.isArray(next)) {
+ current.push.apply(current, next);
+ return current;
+ }
+ current.push(next);
+ return current;
+ }
+
+ if (Array.isArray(next)) {
+ // A bit too dangerous to mutate `next`.
+ return [current].concat(next);
+ }
+
+ return [current, next];
+ }
+
+ /**
+ * @param {array} arr an "accumulation" of items which is either an Array or
+ * a single item. Useful when paired with the `accumulate` module. This is a
+ * simple utility that allows us to reason about a collection of items, but
+ * handling the case when there is exactly one item (and we do not need to
+ * allocate an array).
+ * @param {function} cb Callback invoked with each element or a collection.
+ * @param {?} [scope] Scope used as `this` in a callback.
+ */
+ function forEachAccumulated(arr, cb, scope) {
+ if (Array.isArray(arr)) {
+ arr.forEach(cb, scope);
+ } else if (arr) {
+ cb.call(scope, arr);
+ }
+ }
+
+ /**
+ * Internal queue of events that have accumulated their dispatches and are
+ * waiting to have their dispatches executed.
+ */
+ var eventQueue = null;
+
+ /**
+ * Dispatches an event and releases it back into the pool, unless persistent.
+ *
+ * @param {?object} event Synthetic event to be dispatched.
+ * @param {boolean} simulated If the event is simulated (changes exn behavior)
+ * @private
+ */
+ var executeDispatchesAndRelease = function(event, simulated) {
+ if (event) {
+ executeDispatchesInOrder(event, simulated);
+
+ if (!event.isPersistent()) {
+ event.constructor.release(event);
+ }
+ }
+ };
+ var executeDispatchesAndReleaseSimulated = function(e) {
+ return executeDispatchesAndRelease(e, true);
+ };
+ var executeDispatchesAndReleaseTopLevel = function(e) {
+ return executeDispatchesAndRelease(e, false);
+ };
+
+ function isInteractive(tag) {
+ return (
+ tag === "button" ||
+ tag === "input" ||
+ tag === "select" ||
+ tag === "textarea"
+ );
+ }
+
+ function shouldPreventMouseEvent(name, type, props) {
+ switch (name) {
+ case "onClick":
+ case "onClickCapture":
+ case "onDoubleClick":
+ case "onDoubleClickCapture":
+ case "onMouseDown":
+ case "onMouseDownCapture":
+ case "onMouseMove":
+ case "onMouseMoveCapture":
+ case "onMouseUp":
+ case "onMouseUpCapture":
+ return !!(props.disabled && isInteractive(type));
+ default:
+ return false;
+ }
+ }
+
+ /**
+ * This is a unified interface for event plugins to be installed and configured.
+ *
+ * Event plugins can implement the following properties:
+ *
+ * `extractEvents` {function(string, DOMEventTarget, string, object): *}
+ * Required. When a top-level event is fired, this method is expected to
+ * extract synthetic events that will in turn be queued and dispatched.
+ *
+ * `eventTypes` {object}
+ * Optional, plugins that fire events must publish a mapping of registration
+ * names that are used to register listeners. Values of this mapping must
+ * be objects that contain `registrationName` or `phasedRegistrationNames`.
+ *
+ * `executeDispatch` {function(object, function, string)}
+ * Optional, allows plugins to override how an event gets dispatched. By
+ * default, the listener is simply invoked.
+ *
+ * Each plugin that is injected into `EventsPluginHub` is immediately operable.
+ *
+ * @public
+ */
+
+ /**
+ * Methods for injecting dependencies.
+ */
+ var injection$1 = {
+ /**
+ * @param {array} InjectedEventPluginOrder
+ * @public
+ */
+ injectEventPluginOrder: injectEventPluginOrder,
+
+ /**
+ * @param {object} injectedNamesToPlugins Map from names to plugin modules.
+ */
+ injectEventPluginsByName: injectEventPluginsByName
+ };
+
+ /**
+ * @param {object} inst The instance, which is the source of events.
+ * @param {string} registrationName Name of listener (e.g. `onClick`).
+ * @return {?function} The stored callback.
+ */
+ function getListener(inst, registrationName) {
+ var listener;
+
+ // TODO: shouldPreventMouseEvent is DOM-specific and definitely should not
+ // live here; needs to be moved to a better place soon
+ var stateNode = inst.stateNode;
+ if (!stateNode) {
+ // Work in progress (ex: onload events in incremental mode).
+ return null;
+ }
+ var props = getFiberCurrentPropsFromNode(stateNode);
+ if (!props) {
+ // Work in progress.
+ return null;
+ }
+ listener = props[registrationName];
+ if (shouldPreventMouseEvent(registrationName, inst.type, props)) {
+ return null;
+ }
+ !(!listener || typeof listener === "function")
+ ? invariant(
+ false,
+ "Expected `%s` listener to be a function, instead got a value of `%s` type.",
+ registrationName,
+ typeof listener
+ )
+ : void 0;
+ return listener;
+ }
+
+ /**
+ * Allows registered plugins an opportunity to extract events from top-level
+ * native browser events.
+ *
+ * @return {*} An accumulation of synthetic events.
+ * @internal
+ */
+ function extractEvents(
+ topLevelType,
+ targetInst,
+ nativeEvent,
+ nativeEventTarget
+ ) {
+ var events;
+ for (var i = 0; i < plugins.length; i++) {
+ // Not every plugin in the ordering may be loaded at runtime.
+ var possiblePlugin = plugins[i];
+ if (possiblePlugin) {
+ var extractedEvents = possiblePlugin.extractEvents(
+ topLevelType,
+ targetInst,
+ nativeEvent,
+ nativeEventTarget
+ );
+ if (extractedEvents) {
+ events = accumulateInto(events, extractedEvents);
+ }
+ }
+ }
+ return events;
+ }
+
+ /**
+ * Enqueues a synthetic event that should be dispatched when
+ * `processEventQueue` is invoked.
+ *
+ * @param {*} events An accumulation of synthetic events.
+ * @internal
+ */
+ function enqueueEvents(events) {
+ if (events) {
+ eventQueue = accumulateInto(eventQueue, events);
+ }
+ }
+
+ /**
+ * Dispatches all synthetic events on the event queue.
+ *
+ * @internal
+ */
+ function processEventQueue(simulated) {
+ // Set `eventQueue` to null before processing it so that we can tell if more
+ // events get enqueued while processing.
+ var processingEventQueue = eventQueue;
+ eventQueue = null;
+
+ if (!processingEventQueue) {
+ return;
+ }
+
+ if (simulated) {
+ forEachAccumulated(
+ processingEventQueue,
+ executeDispatchesAndReleaseSimulated
+ );
+ } else {
+ forEachAccumulated(
+ processingEventQueue,
+ executeDispatchesAndReleaseTopLevel
+ );
+ }
+ !!eventQueue
+ ? invariant(
+ false,
+ "processEventQueue(): Additional events were enqueued while processing an event queue. Support for this has not yet been implemented."
+ )
+ : void 0;
+ // This would be a good time to rethrow if any of the event handlers threw.
+ ReactErrorUtils.rethrowCaughtError();
+ }
+
+ var EventPluginHub = Object.freeze({
+ injection: injection$1,
+ getListener: getListener,
+ extractEvents: extractEvents,
+ enqueueEvents: enqueueEvents,
+ processEventQueue: processEventQueue
+ });
+
+ var IndeterminateComponent = 0; // Before we know whether it is functional or class
+ var FunctionalComponent = 1;
+ var ClassComponent = 2;
+ var HostRoot = 3; // Root of a host tree. Could be nested inside another node.
+ var HostPortal = 4; // A subtree. Could be an entry point to a different renderer.
+ var HostComponent = 5;
+ var HostText = 6;
+ var CallComponent = 7;
+ var CallHandlerPhase = 8;
+ var ReturnComponent = 9;
+ var Fragment = 10;
+
+ var randomKey = Math.random()
+ .toString(36)
+ .slice(2);
+ var internalInstanceKey = "__reactInternalInstance$" + randomKey;
+ var internalEventHandlersKey = "__reactEventHandlers$" + randomKey;
+
+ function precacheFiberNode$1(hostInst, node) {
+ node[internalInstanceKey] = hostInst;
+ }
+
+ /**
+ * Given a DOM node, return the closest ReactDOMComponent or
+ * ReactDOMTextComponent instance ancestor.
+ */
+ function getClosestInstanceFromNode(node) {
+ if (node[internalInstanceKey]) {
+ return node[internalInstanceKey];
+ }
+
+ // Walk up the tree until we find an ancestor whose instance we have cached.
+ var parents = [];
+ while (!node[internalInstanceKey]) {
+ parents.push(node);
+ if (node.parentNode) {
+ node = node.parentNode;
+ } else {
+ // Top of the tree. This node must not be part of a React tree (or is
+ // unmounted, potentially).
+ return null;
+ }
+ }
+
+ var closest = void 0;
+ var inst = node[internalInstanceKey];
+ if (inst.tag === HostComponent || inst.tag === HostText) {
+ // In Fiber, this will always be the deepest root.
+ return inst;
+ }
+ for (
+ ;
+ node && (inst = node[internalInstanceKey]);
+ node = parents.pop()
+ ) {
+ closest = inst;
+ }
+
+ return closest;
+ }
+
+ /**
+ * Given a DOM node, return the ReactDOMComponent or ReactDOMTextComponent
+ * instance, or null if the node was not rendered by this React.
+ */
+ function getInstanceFromNode$1(node) {
+ var inst = node[internalInstanceKey];
+ if (inst) {
+ if (inst.tag === HostComponent || inst.tag === HostText) {
+ return inst;
+ } else {
+ return null;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Given a ReactDOMComponent or ReactDOMTextComponent, return the corresponding
+ * DOM node.
+ */
+ function getNodeFromInstance$1(inst) {
+ if (inst.tag === HostComponent || inst.tag === HostText) {
+ // In Fiber this, is just the state node right now. We assume it will be
+ // a host component or host text.
+ return inst.stateNode;
+ }
+
+ // Without this first invariant, passing a non-DOM-component triggers the next
+ // invariant for a missing parent, which is super confusing.
+ invariant(false, "getNodeFromInstance: Invalid argument.");
+ }
+
+ function getFiberCurrentPropsFromNode$1(node) {
+ return node[internalEventHandlersKey] || null;
+ }
+
+ function updateFiberProps$1(node, props) {
+ node[internalEventHandlersKey] = props;
+ }
+
+ var ReactDOMComponentTree = Object.freeze({
+ precacheFiberNode: precacheFiberNode$1,
+ getClosestInstanceFromNode: getClosestInstanceFromNode,
+ getInstanceFromNode: getInstanceFromNode$1,
+ getNodeFromInstance: getNodeFromInstance$1,
+ getFiberCurrentPropsFromNode: getFiberCurrentPropsFromNode$1,
+ updateFiberProps: updateFiberProps$1
+ });
+
+ function getParent(inst) {
+ do {
+ inst = inst["return"];
+ // TODO: If this is a HostRoot we might want to bail out.
+ // That is depending on if we want nested subtrees (layers) to bubble
+ // events to their parent. We could also go through parentNode on the
+ // host node but that wouldn't work for React Native and doesn't let us
+ // do the portal feature.
+ } while (inst && inst.tag !== HostComponent);
+ if (inst) {
+ return inst;
+ }
+ return null;
+ }
+
+ /**
+ * Return the lowest common ancestor of A and B, or null if they are in
+ * different trees.
+ */
+ function getLowestCommonAncestor(instA, instB) {
+ var depthA = 0;
+ for (var tempA = instA; tempA; tempA = getParent(tempA)) {
+ depthA++;
+ }
+ var depthB = 0;
+ for (var tempB = instB; tempB; tempB = getParent(tempB)) {
+ depthB++;
+ }
+
+ // If A is deeper, crawl up.
+ while (depthA - depthB > 0) {
+ instA = getParent(instA);
+ depthA--;
+ }
+
+ // If B is deeper, crawl up.
+ while (depthB - depthA > 0) {
+ instB = getParent(instB);
+ depthB--;
+ }
+
+ // Walk in lockstep until we find a match.
+ var depth = depthA;
+ while (depth--) {
+ if (instA === instB || instA === instB.alternate) {
+ return instA;
+ }
+ instA = getParent(instA);
+ instB = getParent(instB);
+ }
+ return null;
+ }
+
+ /**
+ * Return if A is an ancestor of B.
+ */
+
+ /**
+ * Return the parent instance of the passed-in instance.
+ */
+ function getParentInstance(inst) {
+ return getParent(inst);
+ }
+
+ /**
+ * Simulates the traversal of a two-phase, capture/bubble event dispatch.
+ */
+ function traverseTwoPhase(inst, fn, arg) {
+ var path = [];
+ while (inst) {
+ path.push(inst);
+ inst = getParent(inst);
+ }
+ var i;
+ for (i = path.length; i-- > 0; ) {
+ fn(path[i], "captured", arg);
+ }
+ for (i = 0; i < path.length; i++) {
+ fn(path[i], "bubbled", arg);
+ }
+ }
+
+ /**
+ * Traverses the ID hierarchy and invokes the supplied `cb` on any IDs that
+ * should would receive a `mouseEnter` or `mouseLeave` event.
+ *
+ * Does not invoke the callback on the nearest common ancestor because nothing
+ * "entered" or "left" that element.
+ */
+ function traverseEnterLeave(from, to, fn, argFrom, argTo) {
+ var common =
+ from && to ? getLowestCommonAncestor(from, to) : null;
+ var pathFrom = [];
+ while (true) {
+ if (!from) {
+ break;
+ }
+ if (from === common) {
+ break;
+ }
+ var alternate = from.alternate;
+ if (alternate !== null && alternate === common) {
+ break;
+ }
+ pathFrom.push(from);
+ from = getParent(from);
+ }
+ var pathTo = [];
+ while (true) {
+ if (!to) {
+ break;
+ }
+ if (to === common) {
+ break;
+ }
+ var _alternate = to.alternate;
+ if (_alternate !== null && _alternate === common) {
+ break;
+ }
+ pathTo.push(to);
+ to = getParent(to);
+ }
+ for (var i = 0; i < pathFrom.length; i++) {
+ fn(pathFrom[i], "bubbled", argFrom);
+ }
+ for (var _i = pathTo.length; _i-- > 0; ) {
+ fn(pathTo[_i], "captured", argTo);
+ }
+ }
+
+ /**
+ * Some event types have a notion of different registration names for different
+ * "phases" of propagation. This finds listeners by a given phase.
+ */
+ function listenerAtPhase(inst, event, propagationPhase) {
+ var registrationName =
+ event.dispatchConfig.phasedRegistrationNames[propagationPhase];
+ return getListener(inst, registrationName);
+ }
+
+ /**
+ * A small set of propagation patterns, each of which will accept a small amount
+ * of information, and generate a set of "dispatch ready event objects" - which
+ * are sets of events that have already been annotated with a set of dispatched
+ * listener functions/ids. The API is designed this way to discourage these
+ * propagation strategies from actually executing the dispatches, since we
+ * always want to collect the entire set of dispatches before executing even a
+ * single one.
+ */
+
+ /**
+ * Tags a `SyntheticEvent` with dispatched listeners. Creating this function
+ * here, allows us to not have to bind or create functions for each event.
+ * Mutating the event's members allows us to not have to create a wrapping
+ * "dispatch" object that pairs the event with the listener.
+ */
+ function accumulateDirectionalDispatches(inst, phase, event) {
+ {
+ warning(inst, "Dispatching inst must not be null");
+ }
+ var listener = listenerAtPhase(inst, event, phase);
+ if (listener) {
+ event._dispatchListeners = accumulateInto(
+ event._dispatchListeners,
+ listener
+ );
+ event._dispatchInstances = accumulateInto(
+ event._dispatchInstances,
+ inst
+ );
+ }
+ }
+
+ /**
+ * Collect dispatches (must be entirely collected before dispatching - see unit
+ * tests). Lazily allocate the array to conserve memory. We must loop through
+ * each event and perform the traversal for each one. We cannot perform a
+ * single traversal for the entire collection of events because each event may
+ * have a different target.
+ */
+ function accumulateTwoPhaseDispatchesSingle(event) {
+ if (event && event.dispatchConfig.phasedRegistrationNames) {
+ traverseTwoPhase(
+ event._targetInst,
+ accumulateDirectionalDispatches,
+ event
+ );
+ }
+ }
+
+ /**
+ * Same as `accumulateTwoPhaseDispatchesSingle`, but skips over the targetID.
+ */
+ function accumulateTwoPhaseDispatchesSingleSkipTarget(event) {
+ if (event && event.dispatchConfig.phasedRegistrationNames) {
+ var targetInst = event._targetInst;
+ var parentInst = targetInst
+ ? getParentInstance(targetInst)
+ : null;
+ traverseTwoPhase(
+ parentInst,
+ accumulateDirectionalDispatches,
+ event
+ );
+ }
+ }
+
+ /**
+ * Accumulates without regard to direction, does not look for phased
+ * registration names. Same as `accumulateDirectDispatchesSingle` but without
+ * requiring that the `dispatchMarker` be the same as the dispatched ID.
+ */
+ function accumulateDispatches(inst, ignoredDirection, event) {
+ if (inst && event && event.dispatchConfig.registrationName) {
+ var registrationName = event.dispatchConfig.registrationName;
+ var listener = getListener(inst, registrationName);
+ if (listener) {
+ event._dispatchListeners = accumulateInto(
+ event._dispatchListeners,
+ listener
+ );
+ event._dispatchInstances = accumulateInto(
+ event._dispatchInstances,
+ inst
+ );
+ }
+ }
+ }
+
+ /**
+ * Accumulates dispatches on an `SyntheticEvent`, but only for the
+ * `dispatchMarker`.
+ * @param {SyntheticEvent} event
+ */
+ function accumulateDirectDispatchesSingle(event) {
+ if (event && event.dispatchConfig.registrationName) {
+ accumulateDispatches(event._targetInst, null, event);
+ }
+ }
+
+ function accumulateTwoPhaseDispatches(events) {
+ forEachAccumulated(events, accumulateTwoPhaseDispatchesSingle);
+ }
+
+ function accumulateTwoPhaseDispatchesSkipTarget(events) {
+ forEachAccumulated(
+ events,
+ accumulateTwoPhaseDispatchesSingleSkipTarget
+ );
+ }
+
+ function accumulateEnterLeaveDispatches(leave, enter, from, to) {
+ traverseEnterLeave(from, to, accumulateDispatches, leave, enter);
+ }
+
+ function accumulateDirectDispatches(events) {
+ forEachAccumulated(events, accumulateDirectDispatchesSingle);
+ }
+
+ var EventPropagators = Object.freeze({
+ accumulateTwoPhaseDispatches: accumulateTwoPhaseDispatches,
+ accumulateTwoPhaseDispatchesSkipTarget: accumulateTwoPhaseDispatchesSkipTarget,
+ accumulateEnterLeaveDispatches: accumulateEnterLeaveDispatches,
+ accumulateDirectDispatches: accumulateDirectDispatches
+ });
+
+ var contentKey = null;
+
+ /**
+ * Gets the key used to access text content on a DOM node.
+ *
+ * @return {?string} Key used to access text content.
+ * @internal
+ */
+ function getTextContentAccessor() {
+ if (!contentKey && ExecutionEnvironment.canUseDOM) {
+ // Prefer textContent to innerText because many browsers support both but
+ // SVG <text> elements don't support innerText even when <div> does.
+ contentKey =
+ "textContent" in document.documentElement
+ ? "textContent"
+ : "innerText";
+ }
+ return contentKey;
+ }
+
+ /**
+ * This helper object stores information about text content of a target node,
+ * allowing comparison of content before and after a given event.
+ *
+ * Identify the node where selection currently begins, then observe
+ * both its text content and its current position in the DOM. Since the
+ * browser may natively replace the target node during composition, we can
+ * use its position to find its replacement.
+ *
+ *
+ */
+ var compositionState = {
+ _root: null,
+ _startText: null,
+ _fallbackText: null
+ };
+
+ function initialize(nativeEventTarget) {
+ compositionState._root = nativeEventTarget;
+ compositionState._startText = getText();
+ return true;
+ }
+
+ function reset() {
+ compositionState._root = null;
+ compositionState._startText = null;
+ compositionState._fallbackText = null;
+ }
+
+ function getData() {
+ if (compositionState._fallbackText) {
+ return compositionState._fallbackText;
+ }
+
+ var start;
+ var startValue = compositionState._startText;
+ var startLength = startValue.length;
+ var end;
+ var endValue = getText();
+ var endLength = endValue.length;
+
+ for (start = 0; start < startLength; start++) {
+ if (startValue[start] !== endValue[start]) {
+ break;
+ }
+ }
+
+ var minEnd = startLength - start;
+ for (end = 1; end <= minEnd; end++) {
+ if (
+ startValue[startLength - end] !== endValue[endLength - end]
+ ) {
+ break;
+ }
+ }
+
+ var sliceTail = end > 1 ? 1 - end : undefined;
+ compositionState._fallbackText = endValue.slice(start, sliceTail);
+ return compositionState._fallbackText;
+ }
+
+ function getText() {
+ if ("value" in compositionState._root) {
+ return compositionState._root.value;
+ }
+ return compositionState._root[getTextContentAccessor()];
+ }
+
+ /* eslint valid-typeof: 0 */
+
+ var didWarnForAddedNewProperty = false;
+ var isProxySupported = typeof Proxy === "function";
+ var EVENT_POOL_SIZE = 10;
+
+ var shouldBeReleasedProperties = [
+ "dispatchConfig",
+ "_targetInst",
+ "nativeEvent",
+ "isDefaultPrevented",
+ "isPropagationStopped",
+ "_dispatchListeners",
+ "_dispatchInstances"
+ ];
+
+ /**
+ * @interface Event
+ * @see http://www.w3.org/TR/DOM-Level-3-Events/
+ */
+ var EventInterface = {
+ type: null,
+ target: null,
+ // currentTarget is set when dispatching; no use in copying it here
+ currentTarget: emptyFunction.thatReturnsNull,
+ eventPhase: null,
+ bubbles: null,
+ cancelable: null,
+ timeStamp: function(event) {
+ return event.timeStamp || Date.now();
+ },
+ defaultPrevented: null,
+ isTrusted: null
+ };
+
+ /**
+ * Synthetic events are dispatched by event plugins, typically in response to a
+ * top-level event delegation handler.
+ *
+ * These systems should generally use pooling to reduce the frequency of garbage
+ * collection. The system should check `isPersistent` to determine whether the
+ * event should be released into the pool after being dispatched. Users that
+ * need a persisted event should invoke `persist`.
+ *
+ * Synthetic events (and subclasses) implement the DOM Level 3 Events API by
+ * normalizing browser quirks. Subclasses do not necessarily have to implement a
+ * DOM interface; custom application-specific events can also subclass this.
+ *
+ * @param {object} dispatchConfig Configuration used to dispatch this event.
+ * @param {*} targetInst Marker identifying the event target.
+ * @param {object} nativeEvent Native browser event.
+ * @param {DOMEventTarget} nativeEventTarget Target node.
+ */
+ function SyntheticEvent(
+ dispatchConfig,
+ targetInst,
+ nativeEvent,
+ nativeEventTarget
+ ) {
+ {
+ // these have a getter/setter for warnings
+ delete this.nativeEvent;
+ delete this.preventDefault;
+ delete this.stopPropagation;
+ }
+
+ this.dispatchConfig = dispatchConfig;
+ this._targetInst = targetInst;
+ this.nativeEvent = nativeEvent;
+
+ var Interface = this.constructor.Interface;
+ for (var propName in Interface) {
+ if (!Interface.hasOwnProperty(propName)) {
+ continue;
+ }
+ {
+ delete this[propName]; // this has a getter/setter for warnings
+ }
+ var normalize = Interface[propName];
+ if (normalize) {
+ this[propName] = normalize(nativeEvent);
+ } else {
+ if (propName === "target") {
+ this.target = nativeEventTarget;
+ } else {
+ this[propName] = nativeEvent[propName];
+ }
+ }
+ }
+
+ var defaultPrevented =
+ nativeEvent.defaultPrevented != null
+ ? nativeEvent.defaultPrevented
+ : nativeEvent.returnValue === false;
+ if (defaultPrevented) {
+ this.isDefaultPrevented = emptyFunction.thatReturnsTrue;
+ } else {
+ this.isDefaultPrevented = emptyFunction.thatReturnsFalse;
+ }
+ this.isPropagationStopped = emptyFunction.thatReturnsFalse;
+ return this;
+ }
+
+ _assign(SyntheticEvent.prototype, {
+ preventDefault: function() {
+ this.defaultPrevented = true;
+ var event = this.nativeEvent;
+ if (!event) {
+ return;
+ }
+
+ if (event.preventDefault) {
+ event.preventDefault();
+ } else if (typeof event.returnValue !== "unknown") {
+ event.returnValue = false;
+ }
+ this.isDefaultPrevented = emptyFunction.thatReturnsTrue;
+ },
+
+ stopPropagation: function() {
+ var event = this.nativeEvent;
+ if (!event) {
+ return;
+ }
+
+ if (event.stopPropagation) {
+ event.stopPropagation();
+ } else if (typeof event.cancelBubble !== "unknown") {
+ // The ChangeEventPlugin registers a "propertychange" event for
+ // IE. This event does not support bubbling or cancelling, and
+ // any references to cancelBubble throw "Member not found". A
+ // typeof check of "unknown" circumvents this issue (and is also
+ // IE specific).
+ event.cancelBubble = true;
+ }
+
+ this.isPropagationStopped = emptyFunction.thatReturnsTrue;
+ },
+
+ /**
+ * We release all dispatched `SyntheticEvent`s after each event loop, adding
+ * them back into the pool. This allows a way to hold onto a reference that
+ * won't be added back into the pool.
+ */
+ persist: function() {
+ this.isPersistent = emptyFunction.thatReturnsTrue;
+ },
+
+ /**
+ * Checks if this event should be released back into the pool.
+ *
+ * @return {boolean} True if this should not be released, false otherwise.
+ */
+ isPersistent: emptyFunction.thatReturnsFalse,
+
+ /**
+ * `PooledClass` looks for `destructor` on each instance it releases.
+ */
+ destructor: function() {
+ var Interface = this.constructor.Interface;
+ for (var propName in Interface) {
+ {
+ Object.defineProperty(
+ this,
+ propName,
+ getPooledWarningPropertyDefinition(
+ propName,
+ Interface[propName]
+ )
+ );
+ }
+ }
+ for (var i = 0; i < shouldBeReleasedProperties.length; i++) {
+ this[shouldBeReleasedProperties[i]] = null;
+ }
+ {
+ Object.defineProperty(
+ this,
+ "nativeEvent",
+ getPooledWarningPropertyDefinition("nativeEvent", null)
+ );
+ Object.defineProperty(
+ this,
+ "preventDefault",
+ getPooledWarningPropertyDefinition(
+ "preventDefault",
+ emptyFunction
+ )
+ );
+ Object.defineProperty(
+ this,
+ "stopPropagation",
+ getPooledWarningPropertyDefinition(
+ "stopPropagation",
+ emptyFunction
+ )
+ );
+ }
+ }
+ });
+
+ SyntheticEvent.Interface = EventInterface;
+
+ /**
+ * Helper to reduce boilerplate when creating subclasses.
+ *
+ * @param {function} Class
+ * @param {?object} Interface
+ */
+ SyntheticEvent.augmentClass = function(Class, Interface) {
+ var Super = this;
+
+ var E = function() {};
+ E.prototype = Super.prototype;
+ var prototype = new E();
+
+ _assign(prototype, Class.prototype);
+ Class.prototype = prototype;
+ Class.prototype.constructor = Class;
+
+ Class.Interface = _assign({}, Super.Interface, Interface);
+ Class.augmentClass = Super.augmentClass;
+ addEventPoolingTo(Class);
+ };
+
+ /** Proxying after everything set on SyntheticEvent
+ * to resolve Proxy issue on some WebKit browsers
+ * in which some Event properties are set to undefined (GH#10010)
+ */
+ {
+ if (isProxySupported) {
+ /*eslint-disable no-func-assign */
+ SyntheticEvent = new Proxy(SyntheticEvent, {
+ construct: function(target, args) {
+ return this.apply(
+ target,
+ Object.create(target.prototype),
+ args
+ );
+ },
+ apply: function(constructor, that, args) {
+ return new Proxy(constructor.apply(that, args), {
+ set: function(target, prop, value) {
+ if (
+ prop !== "isPersistent" &&
+ !target.constructor.Interface.hasOwnProperty(prop) &&
+ shouldBeReleasedProperties.indexOf(prop) === -1
+ ) {
+ warning(
+ didWarnForAddedNewProperty || target.isPersistent(),
+ "This synthetic event is reused for performance reasons. If you're " +
+ "seeing this, you're adding a new property in the synthetic event object. " +
+ "The property is never released. See " +
+ "https://fb.me/react-event-pooling for more information."
+ );
+ didWarnForAddedNewProperty = true;
+ }
+ target[prop] = value;
+ return true;
+ }
+ });
+ }
+ });
+ /*eslint-enable no-func-assign */
+ }
+ }
+
+ addEventPoolingTo(SyntheticEvent);
+
+ /**
+ * Helper to nullify syntheticEvent instance properties when destructing
+ *
+ * @param {String} propName
+ * @param {?object} getVal
+ * @return {object} defineProperty object
+ */
+ function getPooledWarningPropertyDefinition(propName, getVal) {
+ var isFunction = typeof getVal === "function";
+ return {
+ configurable: true,
+ set: set,
+ get: get
+ };
+
+ function set(val) {
+ var action = isFunction
+ ? "setting the method"
+ : "setting the property";
+ warn(action, "This is effectively a no-op");
+ return val;
+ }
+
+ function get() {
+ var action = isFunction
+ ? "accessing the method"
+ : "accessing the property";
+ var result = isFunction
+ ? "This is a no-op function"
+ : "This is set to null";
+ warn(action, result);
+ return getVal;
+ }
+
+ function warn(action, result) {
+ var warningCondition = false;
+ warning(
+ warningCondition,
+ "This synthetic event is reused for performance reasons. If you're seeing this, " +
+ "you're %s `%s` on a released/nullified synthetic event. %s. " +
+ "If you must keep the original synthetic event around, use event.persist(). " +
+ "See https://fb.me/react-event-pooling for more information.",
+ action,
+ propName,
+ result
+ );
+ }
+ }
+
+ function getPooledEvent(
+ dispatchConfig,
+ targetInst,
+ nativeEvent,
+ nativeInst
+ ) {
+ var EventConstructor = this;
+ if (EventConstructor.eventPool.length) {
+ var instance = EventConstructor.eventPool.pop();
+ EventConstructor.call(
+ instance,
+ dispatchConfig,
+ targetInst,
+ nativeEvent,
+ nativeInst
+ );
+ return instance;
+ }
+ return new EventConstructor(
+ dispatchConfig,
+ targetInst,
+ nativeEvent,
+ nativeInst
+ );
+ }
+
+ function releasePooledEvent(event) {
+ var EventConstructor = this;
+ !(event instanceof EventConstructor)
+ ? invariant(
+ false,
+ "Trying to release an event instance into a pool of a different type."
+ )
+ : void 0;
+ event.destructor();
+ if (EventConstructor.eventPool.length < EVENT_POOL_SIZE) {
+ EventConstructor.eventPool.push(event);
+ }
+ }
+
+ function addEventPoolingTo(EventConstructor) {
+ EventConstructor.eventPool = [];
+ EventConstructor.getPooled = getPooledEvent;
+ EventConstructor.release = releasePooledEvent;
+ }
+
+ var SyntheticEvent$1 = SyntheticEvent;
+
+ /**
+ * @interface Event
+ * @see http://www.w3.org/TR/DOM-Level-3-Events/#events-compositionevents
+ */
+ var CompositionEventInterface = {
+ data: null
+ };
+
+ /**
+ * @param {object} dispatchConfig Configuration used to dispatch this event.
+ * @param {string} dispatchMarker Marker identifying the event target.
+ * @param {object} nativeEvent Native browser event.
+ * @extends {SyntheticEvent}
+ */
+ function SyntheticCompositionEvent(
+ dispatchConfig,
+ dispatchMarker,
+ nativeEvent,
+ nativeEventTarget
+ ) {
+ return SyntheticEvent$1.call(
+ this,
+ dispatchConfig,
+ dispatchMarker,
+ nativeEvent,
+ nativeEventTarget
+ );
+ }
+
+ SyntheticEvent$1.augmentClass(
+ SyntheticCompositionEvent,
+ CompositionEventInterface
+ );
+
+ /**
+ * @interface Event
+ * @see http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105
+ * /#events-inputevents
+ */
+ var InputEventInterface = {
+ data: null
+ };
+
+ /**
+ * @param {object} dispatchConfig Configuration used to dispatch this event.
+ * @param {string} dispatchMarker Marker identifying the event target.
+ * @param {object} nativeEvent Native browser event.
+ * @extends {SyntheticEvent}
+ */
+ function SyntheticInputEvent(
+ dispatchConfig,
+ dispatchMarker,
+ nativeEvent,
+ nativeEventTarget
+ ) {
+ return SyntheticEvent$1.call(
+ this,
+ dispatchConfig,
+ dispatchMarker,
+ nativeEvent,
+ nativeEventTarget
+ );
+ }
+
+ SyntheticEvent$1.augmentClass(
+ SyntheticInputEvent,
+ InputEventInterface
+ );
+
+ var END_KEYCODES = [9, 13, 27, 32]; // Tab, Return, Esc, Space
+ var START_KEYCODE = 229;
+
+ var canUseCompositionEvent =
+ ExecutionEnvironment.canUseDOM && "CompositionEvent" in window;
+
+ var documentMode = null;
+ if (ExecutionEnvironment.canUseDOM && "documentMode" in document) {
+ documentMode = document.documentMode;
+ }
+
+ // Webkit offers a very useful `textInput` event that can be used to
+ // directly represent `beforeInput`. The IE `textinput` event is not as
+ // useful, so we don't use it.
+ var canUseTextInputEvent =
+ ExecutionEnvironment.canUseDOM &&
+ "TextEvent" in window &&
+ !documentMode &&
+ !isPresto();
+
+ // In IE9+, we have access to composition events, but the data supplied
+ // by the native compositionend event may be incorrect. Japanese ideographic
+ // spaces, for instance (\u3000) are not recorded correctly.
+ var useFallbackCompositionData =
+ ExecutionEnvironment.canUseDOM &&
+ (!canUseCompositionEvent ||
+ (documentMode && documentMode > 8 && documentMode <= 11));
+
+ /**
+ * Opera <= 12 includes TextEvent in window, but does not fire
+ * text input events. Rely on keypress instead.
+ */
+ function isPresto() {
+ var opera = window.opera;
+ return (
+ typeof opera === "object" &&
+ typeof opera.version === "function" &&
+ parseInt(opera.version(), 10) <= 12
+ );
+ }
+
+ var SPACEBAR_CODE = 32;
+ var SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE);
+
+ // Events and their corresponding property names.
+ var eventTypes = {
+ beforeInput: {
+ phasedRegistrationNames: {
+ bubbled: "onBeforeInput",
+ captured: "onBeforeInputCapture"
+ },
+ dependencies: [
+ "topCompositionEnd",
+ "topKeyPress",
+ "topTextInput",
+ "topPaste"
+ ]
+ },
+ compositionEnd: {
+ phasedRegistrationNames: {
+ bubbled: "onCompositionEnd",
+ captured: "onCompositionEndCapture"
+ },
+ dependencies: [
+ "topBlur",
+ "topCompositionEnd",
+ "topKeyDown",
+ "topKeyPress",
+ "topKeyUp",
+ "topMouseDown"
+ ]
+ },
+ compositionStart: {
+ phasedRegistrationNames: {
+ bubbled: "onCompositionStart",
+ captured: "onCompositionStartCapture"
+ },
+ dependencies: [
+ "topBlur",
+ "topCompositionStart",
+ "topKeyDown",
+ "topKeyPress",
+ "topKeyUp",
+ "topMouseDown"
+ ]
+ },
+ compositionUpdate: {
+ phasedRegistrationNames: {
+ bubbled: "onCompositionUpdate",
+ captured: "onCompositionUpdateCapture"
+ },
+ dependencies: [
+ "topBlur",
+ "topCompositionUpdate",
+ "topKeyDown",
+ "topKeyPress",
+ "topKeyUp",
+ "topMouseDown"
+ ]
+ }
+ };
+
+ // Track whether we've ever handled a keypress on the space key.
+ var hasSpaceKeypress = false;
+
+ /**
+ * Return whether a native keypress event is assumed to be a command.
+ * This is required because Firefox fires `keypress` events for key commands
+ * (cut, copy, select-all, etc.) even though no character is inserted.
+ */
+ function isKeypressCommand(nativeEvent) {
+ return (
+ (nativeEvent.ctrlKey ||
+ nativeEvent.altKey ||
+ nativeEvent.metaKey) &&
+ // ctrlKey && altKey is equivalent to AltGr, and is not a command.
+ !(nativeEvent.ctrlKey && nativeEvent.altKey)
+ );
+ }
+
+ /**
+ * Translate native top level events into event types.
+ *
+ * @param {string} topLevelType
+ * @return {object}
+ */
+ function getCompositionEventType(topLevelType) {
+ switch (topLevelType) {
+ case "topCompositionStart":
+ return eventTypes.compositionStart;
+ case "topCompositionEnd":
+ return eventTypes.compositionEnd;
+ case "topCompositionUpdate":
+ return eventTypes.compositionUpdate;
+ }
+ }
+
+ /**
+ * Does our fallback best-guess model think this event signifies that
+ * composition has begun?
+ *
+ * @param {string} topLevelType
+ * @param {object} nativeEvent
+ * @return {boolean}
+ */
+ function isFallbackCompositionStart(topLevelType, nativeEvent) {
+ return (
+ topLevelType === "topKeyDown" &&
+ nativeEvent.keyCode === START_KEYCODE
+ );
+ }
+
+ /**
+ * Does our fallback mode think that this event is the end of composition?
+ *
+ * @param {string} topLevelType
+ * @param {object} nativeEvent
+ * @return {boolean}
+ */
+ function isFallbackCompositionEnd(topLevelType, nativeEvent) {
+ switch (topLevelType) {
+ case "topKeyUp":
+ // Command keys insert or clear IME input.
+ return END_KEYCODES.indexOf(nativeEvent.keyCode) !== -1;
+ case "topKeyDown":
+ // Expect IME keyCode on each keydown. If we get any other
+ // code we must have exited earlier.
+ return nativeEvent.keyCode !== START_KEYCODE;
+ case "topKeyPress":
+ case "topMouseDown":
+ case "topBlur":
+ // Events are not possible without cancelling IME.
+ return true;
+ default:
+ return false;
+ }
+ }
+
+ /**
+ * Google Input Tools provides composition data via a CustomEvent,
+ * with the `data` property populated in the `detail` object. If this
+ * is available on the event object, use it. If not, this is a plain
+ * composition event and we have nothing special to extract.
+ *
+ * @param {object} nativeEvent
+ * @return {?string}
+ */
+ function getDataFromCustomEvent(nativeEvent) {
+ var detail = nativeEvent.detail;
+ if (typeof detail === "object" && "data" in detail) {
+ return detail.data;
+ }
+ return null;
+ }
+
+ // Track the current IME composition status, if any.
+ var isComposing = false;
+
+ /**
+ * @return {?object} A SyntheticCompositionEvent.
+ */
+ function extractCompositionEvent(
+ topLevelType,
+ targetInst,
+ nativeEvent,
+ nativeEventTarget
+ ) {
+ var eventType;
+ var fallbackData;
+
+ if (canUseCompositionEvent) {
+ eventType = getCompositionEventType(topLevelType);
+ } else if (!isComposing) {
+ if (isFallbackCompositionStart(topLevelType, nativeEvent)) {
+ eventType = eventTypes.compositionStart;
+ }
+ } else if (isFallbackCompositionEnd(topLevelType, nativeEvent)) {
+ eventType = eventTypes.compositionEnd;
+ }
+
+ if (!eventType) {
+ return null;
+ }
+
+ if (useFallbackCompositionData) {
+ // The current composition is stored statically and must not be
+ // overwritten while composition continues.
+ if (!isComposing && eventType === eventTypes.compositionStart) {
+ isComposing = initialize(nativeEventTarget);
+ } else if (eventType === eventTypes.compositionEnd) {
+ if (isComposing) {
+ fallbackData = getData();
+ }
+ }
+ }
+
+ var event = SyntheticCompositionEvent.getPooled(
+ eventType,
+ targetInst,
+ nativeEvent,
+ nativeEventTarget
+ );
+
+ if (fallbackData) {
+ // Inject data generated from fallback path into the synthetic event.
+ // This matches the property of native CompositionEventInterface.
+ event.data = fallbackData;
+ } else {
+ var customData = getDataFromCustomEvent(nativeEvent);
+ if (customData !== null) {
+ event.data = customData;
+ }
+ }
+
+ accumulateTwoPhaseDispatches(event);
+ return event;
+ }
+
+ /**
+ * @param {TopLevelTypes} topLevelType Record from `BrowserEventConstants`.
+ * @param {object} nativeEvent Native browser event.
+ * @return {?string} The string corresponding to this `beforeInput` event.
+ */
+ function getNativeBeforeInputChars(topLevelType, nativeEvent) {
+ switch (topLevelType) {
+ case "topCompositionEnd":
+ return getDataFromCustomEvent(nativeEvent);
+ case "topKeyPress":
+ /**
+ * If native `textInput` events are available, our goal is to make
+ * use of them. However, there is a special case: the spacebar key.
+ * In Webkit, preventing default on a spacebar `textInput` event
+ * cancels character insertion, but it *also* causes the browser
+ * to fall back to its default spacebar behavior of scrolling the
+ * page.
+ *
+ * Tracking at:
+ * https://code.google.com/p/chromium/issues/detail?id=355103
+ *
+ * To avoid this issue, use the keypress event as if no `textInput`
+ * event is available.
+ */
+ var which = nativeEvent.which;
+ if (which !== SPACEBAR_CODE) {
+ return null;
+ }
+
+ hasSpaceKeypress = true;
+ return SPACEBAR_CHAR;
+
+ case "topTextInput":
+ // Record the characters to be added to the DOM.
+ var chars = nativeEvent.data;
+
+ // If it's a spacebar character, assume that we have already handled
+ // it at the keypress level and bail immediately. Android Chrome
+ // doesn't give us keycodes, so we need to blacklist it.
+ if (chars === SPACEBAR_CHAR && hasSpaceKeypress) {
+ return null;
+ }
+
+ return chars;
+
+ default:
+ // For other native event types, do nothing.
+ return null;
+ }
+ }
+
+ /**
+ * For browsers that do not provide the `textInput` event, extract the
+ * appropriate string to use for SyntheticInputEvent.
+ *
+ * @param {string} topLevelType Record from `BrowserEventConstants`.
+ * @param {object} nativeEvent Native browser event.
+ * @return {?string} The fallback string for this `beforeInput` event.
+ */
+ function getFallbackBeforeInputChars(topLevelType, nativeEvent) {
+ // If we are currently composing (IME) and using a fallback to do so,
+ // try to extract the composed characters from the fallback object.
+ // If composition event is available, we extract a string only at
+ // compositionevent, otherwise extract it at fallback events.
+ if (isComposing) {
+ if (
+ topLevelType === "topCompositionEnd" ||
+ (!canUseCompositionEvent &&
+ isFallbackCompositionEnd(topLevelType, nativeEvent))
+ ) {
+ var chars = getData();
+ reset();
+ isComposing = false;
+ return chars;
+ }
+ return null;
+ }
+
+ switch (topLevelType) {
+ case "topPaste":
+ // If a paste event occurs after a keypress, throw out the input
+ // chars. Paste events should not lead to BeforeInput events.
+ return null;
+ case "topKeyPress":
+ /**
+ * As of v27, Firefox may fire keypress events even when no character
+ * will be inserted. A few possibilities:
+ *
+ * - `which` is `0`. Arrow keys, Esc key, etc.
+ *
+ * - `which` is the pressed key code, but no char is available.
+ * Ex: 'AltGr + d` in Polish. There is no modified character for
+ * this key combination and no character is inserted into the
+ * document, but FF fires the keypress for char code `100` anyway.
+ * No `input` event will occur.
+ *
+ * - `which` is the pressed key code, but a command combination is
+ * being used. Ex: `Cmd+C`. No character is inserted, and no
+ * `input` event will occur.
+ */
+ if (!isKeypressCommand(nativeEvent)) {
+ // IE fires the `keypress` event when a user types an emoji via
+ // Touch keyboard of Windows. In such a case, the `char` property
+ // holds an emoji character like `\uD83D\uDE0A`. Because its length
+ // is 2, the property `which` does not represent an emoji correctly.
+ // In such a case, we directly return the `char` property instead of
+ // using `which`.
+ if (nativeEvent.char && nativeEvent.char.length > 1) {
+ return nativeEvent.char;
+ } else if (nativeEvent.which) {
+ return String.fromCharCode(nativeEvent.which);
+ }
+ }
+ return null;
+ case "topCompositionEnd":
+ return useFallbackCompositionData ? null : nativeEvent.data;
+ default:
+ return null;
+ }
+ }
+
+ /**
+ * Extract a SyntheticInputEvent for `beforeInput`, based on either native
+ * `textInput` or fallback behavior.
+ *
+ * @return {?object} A SyntheticInputEvent.
+ */
+ function extractBeforeInputEvent(
+ topLevelType,
+ targetInst,
+ nativeEvent,
+ nativeEventTarget
+ ) {
+ var chars;
+
+ if (canUseTextInputEvent) {
+ chars = getNativeBeforeInputChars(topLevelType, nativeEvent);
+ } else {
+ chars = getFallbackBeforeInputChars(topLevelType, nativeEvent);
+ }
+
+ // If no characters are being inserted, no BeforeInput event should
+ // be fired.
+ if (!chars) {
+ return null;
+ }
+
+ var event = SyntheticInputEvent.getPooled(
+ eventTypes.beforeInput,
+ targetInst,
+ nativeEvent,
+ nativeEventTarget
+ );
+
+ event.data = chars;
+ accumulateTwoPhaseDispatches(event);
+ return event;
+ }
+
+ /**
+ * Create an `onBeforeInput` event to match
+ * http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105/#events-inputevents.
+ *
+ * This event plugin is based on the native `textInput` event
+ * available in Chrome, Safari, Opera, and IE. This event fires after
+ * `onKeyPress` and `onCompositionEnd`, but before `onInput`.
+ *
+ * `beforeInput` is spec'd but not implemented in any browsers, and
+ * the `input` event does not provide any useful information about what has
+ * actually been added, contrary to the spec. Thus, `textInput` is the best
+ * available event to identify the characters that have actually been inserted
+ * into the target node.
+ *
+ * This plugin is also responsible for emitting `composition` events, thus
+ * allowing us to share composition fallback code for both `beforeInput` and
+ * `composition` event types.
+ */
+ var BeforeInputEventPlugin = {
+ eventTypes: eventTypes,
+
+ extractEvents: function(
+ topLevelType,
+ targetInst,
+ nativeEvent,
+ nativeEventTarget
+ ) {
+ return [
+ extractCompositionEvent(
+ topLevelType,
+ targetInst,
+ nativeEvent,
+ nativeEventTarget
+ ),
+ extractBeforeInputEvent(
+ topLevelType,
+ targetInst,
+ nativeEvent,
+ nativeEventTarget
+ )
+ ];
+ }
+ };
+
+ // Use to restore controlled state after a change event has fired.
+
+ var fiberHostComponent = null;
+
+ var ReactControlledComponentInjection = {
+ injectFiberControlledHostComponent: function(hostComponentImpl) {
+ // The fiber implementation doesn't use dynamic dispatch so we need to
+ // inject the implementation.
+ fiberHostComponent = hostComponentImpl;
+ }
+ };
+
+ var restoreTarget = null;
+ var restoreQueue = null;
+
+ function restoreStateOfTarget(target) {
+ // We perform this translation at the end of the event loop so that we
+ // always receive the correct fiber here
+ var internalInstance = getInstanceFromNode(target);
+ if (!internalInstance) {
+ // Unmounted
+ return;
+ }
+ !(
+ fiberHostComponent &&
+ typeof fiberHostComponent.restoreControlledState === "function"
+ )
+ ? invariant(
+ false,
+ "Fiber needs to be injected to handle a fiber target for controlled events. This error is likely caused by a bug in React. Please file an issue."
+ )
+ : void 0;
+ var props = getFiberCurrentPropsFromNode(
+ internalInstance.stateNode
+ );
+ fiberHostComponent.restoreControlledState(
+ internalInstance.stateNode,
+ internalInstance.type,
+ props
+ );
+ }
+
+ var injection$3 = ReactControlledComponentInjection;
+
+ function enqueueStateRestore(target) {
+ if (restoreTarget) {
+ if (restoreQueue) {
+ restoreQueue.push(target);
+ } else {
+ restoreQueue = [target];
+ }
+ } else {
+ restoreTarget = target;
+ }
+ }
+
+ function restoreStateIfNeeded() {
+ if (!restoreTarget) {
+ return;
+ }
+ var target = restoreTarget;
+ var queuedTargets = restoreQueue;
+ restoreTarget = null;
+ restoreQueue = null;
+
+ restoreStateOfTarget(target);
+ if (queuedTargets) {
+ for (var i = 0; i < queuedTargets.length; i++) {
+ restoreStateOfTarget(queuedTargets[i]);
+ }
+ }
+ }
+
+ var ReactControlledComponent = Object.freeze({
+ injection: injection$3,
+ enqueueStateRestore: enqueueStateRestore,
+ restoreStateIfNeeded: restoreStateIfNeeded
+ });
+
+ // Used as a way to call batchedUpdates when we don't have a reference to
+ // the renderer. Such as when we're dispatching events or if third party
+ // libraries need to call batchedUpdates. Eventually, this API will go away when
+ // everything is batched by default. We'll then have a similar API to opt-out of
+ // scheduled work and instead do synchronous work.
+
+ // Defaults
+ var fiberBatchedUpdates = function(fn, bookkeeping) {
+ return fn(bookkeeping);
+ };
+
+ var isNestingBatched = false;
+ function batchedUpdates(fn, bookkeeping) {
+ if (isNestingBatched) {
+ // If we are currently inside another batch, we need to wait until it
+ // fully completes before restoring state. Therefore, we add the target to
+ // a queue of work.
+ return fiberBatchedUpdates(fn, bookkeeping);
+ }
+ isNestingBatched = true;
+ try {
+ return fiberBatchedUpdates(fn, bookkeeping);
+ } finally {
+ // Here we wait until all updates have propagated, which is important
+ // when using controlled components within layers:
+ // https://github.com/facebook/react/issues/1698
+ // Then we restore state of any controlled component.
+ isNestingBatched = false;
+ restoreStateIfNeeded();
+ }
+ }
+
+ var ReactGenericBatchingInjection = {
+ injectFiberBatchedUpdates: function(_batchedUpdates) {
+ fiberBatchedUpdates = _batchedUpdates;
+ }
+ };
+
+ var injection$4 = ReactGenericBatchingInjection;
+
+ /**
+ * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary
+ */
+ var supportedInputTypes = {
+ color: true,
+ date: true,
+ datetime: true,
+ "datetime-local": true,
+ email: true,
+ month: true,
+ number: true,
+ password: true,
+ range: true,
+ search: true,
+ tel: true,
+ text: true,
+ time: true,
+ url: true,
+ week: true
+ };
+
+ function isTextInputElement(elem) {
+ var nodeName =
+ elem && elem.nodeName && elem.nodeName.toLowerCase();
+
+ if (nodeName === "input") {
+ return !!supportedInputTypes[elem.type];
+ }
+
+ if (nodeName === "textarea") {
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * HTML nodeType values that represent the type of the node
+ */
+
+ var ELEMENT_NODE = 1;
+ var TEXT_NODE = 3;
+ var COMMENT_NODE = 8;
+ var DOCUMENT_NODE = 9;
+ var DOCUMENT_FRAGMENT_NODE = 11;
+
+ /**
+ * Gets the target node from a native browser event by accounting for
+ * inconsistencies in browser DOM APIs.
+ *
+ * @param {object} nativeEvent Native browser event.
+ * @return {DOMEventTarget} Target node.
+ */
+ function getEventTarget(nativeEvent) {
+ var target =
+ nativeEvent.target || nativeEvent.srcElement || window;
+
+ // Normalize SVG <use> element events #4963
+ if (target.correspondingUseElement) {
+ target = target.correspondingUseElement;
+ }
+
+ // Safari may fire events on text nodes (Node.TEXT_NODE is 3).
+ // @see http://www.quirksmode.org/js/events_properties.html
+ return target.nodeType === TEXT_NODE ? target.parentNode : target;
+ }
+
+ var useHasFeature;
+ if (ExecutionEnvironment.canUseDOM) {
+ useHasFeature =
+ document.implementation &&
+ document.implementation.hasFeature &&
+ // always returns true in newer browsers as per the standard.
+ // @see http://dom.spec.whatwg.org/#dom-domimplementation-hasfeature
+ document.implementation.hasFeature("", "") !== true;
+ }
+
+ /**
+ * Checks if an event is supported in the current execution environment.
+ *
+ * NOTE: This will not work correctly for non-generic events such as `change`,
+ * `reset`, `load`, `error`, and `select`.
+ *
+ * Borrows from Modernizr.
+ *
+ * @param {string} eventNameSuffix Event name, e.g. "click".
+ * @param {?boolean} capture Check if the capture phase is supported.
+ * @return {boolean} True if the event is supported.
+ * @internal
+ * @license Modernizr 3.0.0pre (Custom Build) | MIT
+ */
+ function isEventSupported(eventNameSuffix, capture) {
+ if (
+ !ExecutionEnvironment.canUseDOM ||
+ (capture && !("addEventListener" in document))
+ ) {
+ return false;
+ }
+
+ var eventName = "on" + eventNameSuffix;
+ var isSupported = eventName in document;
+
+ if (!isSupported) {
+ var element = document.createElement("div");
+ element.setAttribute(eventName, "return;");
+ isSupported = typeof element[eventName] === "function";
+ }
+
+ if (
+ !isSupported &&
+ useHasFeature &&
+ eventNameSuffix === "wheel"
+ ) {
+ // This is the only way to test support for the `wheel` event in IE9+.
+ isSupported = document.implementation.hasFeature(
+ "Events.wheel",
+ "3.0"
+ );
+ }
+
+ return isSupported;
+ }
+
+ function isCheckable(elem) {
+ var type = elem.type;
+ var nodeName = elem.nodeName;
+ return (
+ nodeName &&
+ nodeName.toLowerCase() === "input" &&
+ (type === "checkbox" || type === "radio")
+ );
+ }
+
+ function getTracker(node) {
+ return node._valueTracker;
+ }
+
+ function detachTracker(node) {
+ node._valueTracker = null;
+ }
+
+ function getValueFromNode(node) {
+ var value = "";
+ if (!node) {
+ return value;
+ }
+
+ if (isCheckable(node)) {
+ value = node.checked ? "true" : "false";
+ } else {
+ value = node.value;
+ }
+
+ return value;
+ }
+
+ function trackValueOnNode(node) {
+ var valueField = isCheckable(node) ? "checked" : "value";
+ var descriptor = Object.getOwnPropertyDescriptor(
+ node.constructor.prototype,
+ valueField
+ );
+
+ var currentValue = "" + node[valueField];
+
+ // if someone has already defined a value or Safari, then bail
+ // and don't track value will cause over reporting of changes,
+ // but it's better then a hard failure
+ // (needed for certain tests that spyOn input values and Safari)
+ if (
+ node.hasOwnProperty(valueField) ||
+ typeof descriptor.get !== "function" ||
+ typeof descriptor.set !== "function"
+ ) {
+ return;
+ }
+
+ Object.defineProperty(node, valueField, {
+ enumerable: descriptor.enumerable,
+ configurable: true,
+ get: function() {
+ return descriptor.get.call(this);
+ },
+ set: function(value) {
+ currentValue = "" + value;
+ descriptor.set.call(this, value);
+ }
+ });
+
+ var tracker = {
+ getValue: function() {
+ return currentValue;
+ },
+ setValue: function(value) {
+ currentValue = "" + value;
+ },
+ stopTracking: function() {
+ detachTracker(node);
+ delete node[valueField];
+ }
+ };
+ return tracker;
+ }
+
+ function track(node) {
+ if (getTracker(node)) {
+ return;
+ }
+
+ // TODO: Once it's just Fiber we can move this to node._wrapperState
+ node._valueTracker = trackValueOnNode(node);
+ }
+
+ function updateValueIfChanged(node) {
+ if (!node) {
+ return false;
+ }
+
+ var tracker = getTracker(node);
+ // if there is no tracker at this point it's unlikely
+ // that trying again will succeed
+ if (!tracker) {
+ return true;
+ }
+
+ var lastValue = tracker.getValue();
+ var nextValue = getValueFromNode(node);
+ if (nextValue !== lastValue) {
+ tracker.setValue(nextValue);
+ return true;
+ }
+ return false;
+ }
+
+ var eventTypes$1 = {
+ change: {
+ phasedRegistrationNames: {
+ bubbled: "onChange",
+ captured: "onChangeCapture"
+ },
+ dependencies: [
+ "topBlur",
+ "topChange",
+ "topClick",
+ "topFocus",
+ "topInput",
+ "topKeyDown",
+ "topKeyUp",
+ "topSelectionChange"
+ ]
+ }
+ };
+
+ function createAndAccumulateChangeEvent(inst, nativeEvent, target) {
+ var event = SyntheticEvent$1.getPooled(
+ eventTypes$1.change,
+ inst,
+ nativeEvent,
+ target
+ );
+ event.type = "change";
+ // Flag this event loop as needing state restore.
+ enqueueStateRestore(target);
+ accumulateTwoPhaseDispatches(event);
+ return event;
+ }
+ /**
+ * For IE shims
+ */
+ var activeElement = null;
+ var activeElementInst = null;
+
+ /**
+ * SECTION: handle `change` event
+ */
+ function shouldUseChangeEvent(elem) {
+ var nodeName = elem.nodeName && elem.nodeName.toLowerCase();
+ return (
+ nodeName === "select" ||
+ (nodeName === "input" && elem.type === "file")
+ );
+ }
+
+ function manualDispatchChangeEvent(nativeEvent) {
+ var event = createAndAccumulateChangeEvent(
+ activeElementInst,
+ nativeEvent,
+ getEventTarget(nativeEvent)
+ );
+
+ // If change and propertychange bubbled, we'd just bind to it like all the
+ // other events and have it go through ReactBrowserEventEmitter. Since it
+ // doesn't, we manually listen for the events and so we have to enqueue and
+ // process the abstract event manually.
+ //
+ // Batching is necessary here in order to ensure that all event handlers run
+ // before the next rerender (including event handlers attached to ancestor
+ // elements instead of directly on the input). Without this, controlled
+ // components don't work properly in conjunction with event bubbling because
+ // the component is rerendered and the value reverted before all the event
+ // handlers can run. See https://github.com/facebook/react/issues/708.
+ batchedUpdates(runEventInBatch, event);
+ }
+
+ function runEventInBatch(event) {
+ enqueueEvents(event);
+ processEventQueue(false);
+ }
+
+ function getInstIfValueChanged(targetInst) {
+ var targetNode = getNodeFromInstance$1(targetInst);
+ if (updateValueIfChanged(targetNode)) {
+ return targetInst;
+ }
+ }
+
+ function getTargetInstForChangeEvent(topLevelType, targetInst) {
+ if (topLevelType === "topChange") {
+ return targetInst;
+ }
+ }
+
+ /**
+ * SECTION: handle `input` event
+ */
+ var isInputEventSupported = false;
+ if (ExecutionEnvironment.canUseDOM) {
+ // IE9 claims to support the input event but fails to trigger it when
+ // deleting text, so we ignore its input events.
+ isInputEventSupported =
+ isEventSupported("input") &&
+ (!document.documentMode || document.documentMode > 9);
+ }
+
+ /**
+ * (For IE <=9) Starts tracking propertychange events on the passed-in element
+ * and override the value property so that we can distinguish user events from
+ * value changes in JS.
+ */
+ function startWatchingForValueChange(target, targetInst) {
+ activeElement = target;
+ activeElementInst = targetInst;
+ activeElement.attachEvent(
+ "onpropertychange",
+ handlePropertyChange
+ );
+ }
+
+ /**
+ * (For IE <=9) Removes the event listeners from the currently-tracked element,
+ * if any exists.
+ */
+ function stopWatchingForValueChange() {
+ if (!activeElement) {
+ return;
+ }
+ activeElement.detachEvent(
+ "onpropertychange",
+ handlePropertyChange
+ );
+ activeElement = null;
+ activeElementInst = null;
+ }
+
+ /**
+ * (For IE <=9) Handles a propertychange event, sending a `change` event if
+ * the value of the active element has changed.
+ */
+ function handlePropertyChange(nativeEvent) {
+ if (nativeEvent.propertyName !== "value") {
+ return;
+ }
+ if (getInstIfValueChanged(activeElementInst)) {
+ manualDispatchChangeEvent(nativeEvent);
+ }
+ }
+
+ function handleEventsForInputEventPolyfill(
+ topLevelType,
+ target,
+ targetInst
+ ) {
+ if (topLevelType === "topFocus") {
+ // In IE9, propertychange fires for most input events but is buggy and
+ // doesn't fire when text is deleted, but conveniently, selectionchange
+ // appears to fire in all of the remaining cases so we catch those and
+ // forward the event if the value has changed
+ // In either case, we don't want to call the event handler if the value
+ // is changed from JS so we redefine a setter for `.value` that updates
+ // our activeElementValue variable, allowing us to ignore those changes
+ //
+ // stopWatching() should be a noop here but we call it just in case we
+ // missed a blur event somehow.
+ stopWatchingForValueChange();
+ startWatchingForValueChange(target, targetInst);
+ } else if (topLevelType === "topBlur") {
+ stopWatchingForValueChange();
+ }
+ }
+
+ // For IE8 and IE9.
+ function getTargetInstForInputEventPolyfill(
+ topLevelType,
+ targetInst
+ ) {
+ if (
+ topLevelType === "topSelectionChange" ||
+ topLevelType === "topKeyUp" ||
+ topLevelType === "topKeyDown"
+ ) {
+ // On the selectionchange event, the target is just document which isn't
+ // helpful for us so just check activeElement instead.
+ //
+ // 99% of the time, keydown and keyup aren't necessary. IE8 fails to fire
+ // propertychange on the first input event after setting `value` from a
+ // script and fires only keydown, keypress, keyup. Catching keyup usually
+ // gets it and catching keydown lets us fire an event for the first
+ // keystroke if user does a key repeat (it'll be a little delayed: right
+ // before the second keystroke). Other input methods (e.g., paste) seem to
+ // fire selectionchange normally.
+ return getInstIfValueChanged(activeElementInst);
+ }
+ }
+
+ /**
+ * SECTION: handle `click` event
+ */
+ function shouldUseClickEvent(elem) {
+ // Use the `click` event to detect changes to checkbox and radio inputs.
+ // This approach works across all browsers, whereas `change` does not fire
+ // until `blur` in IE8.
+ var nodeName = elem.nodeName;
+ return (
+ nodeName &&
+ nodeName.toLowerCase() === "input" &&
+ (elem.type === "checkbox" || elem.type === "radio")
+ );
+ }
+
+ function getTargetInstForClickEvent(topLevelType, targetInst) {
+ if (topLevelType === "topClick") {
+ return getInstIfValueChanged(targetInst);
+ }
+ }
+
+ function getTargetInstForInputOrChangeEvent(
+ topLevelType,
+ targetInst
+ ) {
+ if (topLevelType === "topInput" || topLevelType === "topChange") {
+ return getInstIfValueChanged(targetInst);
+ }
+ }
+
+ function handleControlledInputBlur(inst, node) {
+ // TODO: In IE, inst is occasionally null. Why?
+ if (inst == null) {
+ return;
+ }
+
+ // Fiber and ReactDOM keep wrapper state in separate places
+ var state = inst._wrapperState || node._wrapperState;
+
+ if (!state || !state.controlled || node.type !== "number") {
+ return;
+ }
+
+ // If controlled, assign the value attribute to the current value on blur
+ var value = "" + node.value;
+ if (node.getAttribute("value") !== value) {
+ node.setAttribute("value", value);
+ }
+ }
+
+ /**
+ * This plugin creates an `onChange` event that normalizes change events
+ * across form elements. This event fires at a time when it's possible to
+ * change the element's value without seeing a flicker.
+ *
+ * Supported elements are:
+ * - input (see `isTextInputElement`)
+ * - textarea
+ * - select
+ */
+ var ChangeEventPlugin = {
+ eventTypes: eventTypes$1,
+
+ _isInputEventSupported: isInputEventSupported,
+
+ extractEvents: function(
+ topLevelType,
+ targetInst,
+ nativeEvent,
+ nativeEventTarget
+ ) {
+ var targetNode = targetInst
+ ? getNodeFromInstance$1(targetInst)
+ : window;
+
+ var getTargetInstFunc, handleEventFunc;
+ if (shouldUseChangeEvent(targetNode)) {
+ getTargetInstFunc = getTargetInstForChangeEvent;
+ } else if (isTextInputElement(targetNode)) {
+ if (isInputEventSupported) {
+ getTargetInstFunc = getTargetInstForInputOrChangeEvent;
+ } else {
+ getTargetInstFunc = getTargetInstForInputEventPolyfill;
+ handleEventFunc = handleEventsForInputEventPolyfill;
+ }
+ } else if (shouldUseClickEvent(targetNode)) {
+ getTargetInstFunc = getTargetInstForClickEvent;
+ }
+
+ if (getTargetInstFunc) {
+ var inst = getTargetInstFunc(topLevelType, targetInst);
+ if (inst) {
+ var event = createAndAccumulateChangeEvent(
+ inst,
+ nativeEvent,
+ nativeEventTarget
+ );
+ return event;
+ }
+ }
+
+ if (handleEventFunc) {
+ handleEventFunc(topLevelType, targetNode, targetInst);
+ }
+
+ // When blurring, set the value attribute for number inputs
+ if (topLevelType === "topBlur") {
+ handleControlledInputBlur(targetInst, targetNode);
+ }
+ }
+ };
+
+ /**
+ * Module that is injectable into `EventPluginHub`, that specifies a
+ * deterministic ordering of `EventPlugin`s. A convenient way to reason about
+ * plugins, without having to package every one of them. This is better than
+ * having plugins be ordered in the same order that they are injected because
+ * that ordering would be influenced by the packaging order.
+ * `ResponderEventPlugin` must occur before `SimpleEventPlugin` so that
+ * preventing default on events is convenient in `SimpleEventPlugin` handlers.
+ */
+ var DOMEventPluginOrder = [
+ "ResponderEventPlugin",
+ "SimpleEventPlugin",
+ "TapEventPlugin",
+ "EnterLeaveEventPlugin",
+ "ChangeEventPlugin",
+ "SelectEventPlugin",
+ "BeforeInputEventPlugin"
+ ];
+
+ /**
+ * @interface UIEvent
+ * @see http://www.w3.org/TR/DOM-Level-3-Events/
+ */
+ var UIEventInterface = {
+ view: null,
+ detail: null
+ };
+
+ /**
+ * @param {object} dispatchConfig Configuration used to dispatch this event.
+ * @param {string} dispatchMarker Marker identifying the event target.
+ * @param {object} nativeEvent Native browser event.
+ * @extends {SyntheticEvent}
+ */
+ function SyntheticUIEvent(
+ dispatchConfig,
+ dispatchMarker,
+ nativeEvent,
+ nativeEventTarget
+ ) {
+ return SyntheticEvent$1.call(
+ this,
+ dispatchConfig,
+ dispatchMarker,
+ nativeEvent,
+ nativeEventTarget
+ );
+ }
+
+ SyntheticEvent$1.augmentClass(SyntheticUIEvent, UIEventInterface);
+
+ /**
+ * Translation from modifier key to the associated property in the event.
+ * @see http://www.w3.org/TR/DOM-Level-3-Events/#keys-Modifiers
+ */
+
+ var modifierKeyToProp = {
+ Alt: "altKey",
+ Control: "ctrlKey",
+ Meta: "metaKey",
+ Shift: "shiftKey"
+ };
+
+ // IE8 does not implement getModifierState so we simply map it to the only
+ // modifier keys exposed by the event itself, does not support Lock-keys.
+ // Currently, all major browsers except Chrome seems to support Lock-keys.
+ function modifierStateGetter(keyArg) {
+ var syntheticEvent = this;
+ var nativeEvent = syntheticEvent.nativeEvent;
+ if (nativeEvent.getModifierState) {
+ return nativeEvent.getModifierState(keyArg);
+ }
+ var keyProp = modifierKeyToProp[keyArg];
+ return keyProp ? !!nativeEvent[keyProp] : false;
+ }
+
+ function getEventModifierState(nativeEvent) {
+ return modifierStateGetter;
+ }
+
+ /**
+ * @interface MouseEvent
+ * @see http://www.w3.org/TR/DOM-Level-3-Events/
+ */
+ var MouseEventInterface = {
+ screenX: null,
+ screenY: null,
+ clientX: null,
+ clientY: null,
+ pageX: null,
+ pageY: null,
+ ctrlKey: null,
+ shiftKey: null,
+ altKey: null,
+ metaKey: null,
+ getModifierState: getEventModifierState,
+ button: null,
+ buttons: null,
+ relatedTarget: function(event) {
+ return (
+ event.relatedTarget ||
+ (event.fromElement === event.srcElement
+ ? event.toElement
+ : event.fromElement)
+ );
+ }
+ };
+
+ /**
+ * @param {object} dispatchConfig Configuration used to dispatch this event.
+ * @param {string} dispatchMarker Marker identifying the event target.
+ * @param {object} nativeEvent Native browser event.
+ * @extends {SyntheticUIEvent}
+ */
+ function SyntheticMouseEvent(
+ dispatchConfig,
+ dispatchMarker,
+ nativeEvent,
+ nativeEventTarget
+ ) {
+ return SyntheticUIEvent.call(
+ this,
+ dispatchConfig,
+ dispatchMarker,
+ nativeEvent,
+ nativeEventTarget
+ );
+ }
+
+ SyntheticUIEvent.augmentClass(
+ SyntheticMouseEvent,
+ MouseEventInterface
+ );
+
+ var eventTypes$2 = {
+ mouseEnter: {
+ registrationName: "onMouseEnter",
+ dependencies: ["topMouseOut", "topMouseOver"]
+ },
+ mouseLeave: {
+ registrationName: "onMouseLeave",
+ dependencies: ["topMouseOut", "topMouseOver"]
+ }
+ };
+
+ var EnterLeaveEventPlugin = {
+ eventTypes: eventTypes$2,
+
+ /**
+ * For almost every interaction we care about, there will be both a top-level
+ * `mouseover` and `mouseout` event that occurs. Only use `mouseout` so that
+ * we do not extract duplicate events. However, moving the mouse into the
+ * browser from outside will not fire a `mouseout` event. In this case, we use
+ * the `mouseover` top-level event.
+ */
+ extractEvents: function(
+ topLevelType,
+ targetInst,
+ nativeEvent,
+ nativeEventTarget
+ ) {
+ if (
+ topLevelType === "topMouseOver" &&
+ (nativeEvent.relatedTarget || nativeEvent.fromElement)
+ ) {
+ return null;
+ }
+ if (
+ topLevelType !== "topMouseOut" &&
+ topLevelType !== "topMouseOver"
+ ) {
+ // Must not be a mouse in or mouse out - ignoring.
+ return null;
+ }
+
+ var win;
+ if (nativeEventTarget.window === nativeEventTarget) {
+ // `nativeEventTarget` is probably a window object.
+ win = nativeEventTarget;
+ } else {
+ // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8.
+ var doc = nativeEventTarget.ownerDocument;
+ if (doc) {
+ win = doc.defaultView || doc.parentWindow;
+ } else {
+ win = window;
+ }
+ }
+
+ var from;
+ var to;
+ if (topLevelType === "topMouseOut") {
+ from = targetInst;
+ var related =
+ nativeEvent.relatedTarget || nativeEvent.toElement;
+ to = related ? getClosestInstanceFromNode(related) : null;
+ } else {
+ // Moving to a node from outside the window.
+ from = null;
+ to = targetInst;
+ }
+
+ if (from === to) {
+ // Nothing pertains to our managed components.
+ return null;
+ }
+
+ var fromNode = from == null ? win : getNodeFromInstance$1(from);
+ var toNode = to == null ? win : getNodeFromInstance$1(to);
+
+ var leave = SyntheticMouseEvent.getPooled(
+ eventTypes$2.mouseLeave,
+ from,
+ nativeEvent,
+ nativeEventTarget
+ );
+ leave.type = "mouseleave";
+ leave.target = fromNode;
+ leave.relatedTarget = toNode;
+
+ var enter = SyntheticMouseEvent.getPooled(
+ eventTypes$2.mouseEnter,
+ to,
+ nativeEvent,
+ nativeEventTarget
+ );
+ enter.type = "mouseenter";
+ enter.target = toNode;
+ enter.relatedTarget = fromNode;
+
+ accumulateEnterLeaveDispatches(leave, enter, from, to);
+
+ return [leave, enter];
+ }
+ };
+
+ /**
+ * `ReactInstanceMap` maintains a mapping from a public facing stateful
+ * instance (key) and the internal representation (value). This allows public
+ * methods to accept the user facing instance as an argument and map them back
+ * to internal methods.
+ *
+ * Note that this module is currently shared and assumed to be stateless.
+ * If this becomes an actual Map, that will break.
+ */
+
+ /**
+ * This API should be called `delete` but we'd have to make sure to always
+ * transform these to strings for IE support. When this transform is fully
+ * supported we can rename it.
+ */
+
+ function get(key) {
+ return key._reactInternalFiber;
+ }
+
+ function has(key) {
+ return key._reactInternalFiber !== undefined;
+ }
+
+ function set(key, value) {
+ key._reactInternalFiber = value;
+ }
+
+ var ReactInternals =
+ React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
+
+ var ReactCurrentOwner = ReactInternals.ReactCurrentOwner;
+ var ReactDebugCurrentFrame = ReactInternals.ReactDebugCurrentFrame;
+
+ function getComponentName(fiber) {
+ var type = fiber.type;
+
+ if (typeof type === "string") {
+ return type;
+ }
+ if (typeof type === "function") {
+ return type.displayName || type.name;
+ }
+ return null;
+ }
+
+ // Don't change these two values:
+ var NoEffect = 0; // 0b00000000
+ var PerformedWork = 1; // 0b00000001
+
+ // You can change the rest (and add more).
+ var Placement = 2; // 0b00000010
+ var Update = 4; // 0b00000100
+ var PlacementAndUpdate = 6; // 0b00000110
+ var Deletion = 8; // 0b00001000
+ var ContentReset = 16; // 0b00010000
+ var Callback = 32; // 0b00100000
+ var Err = 64; // 0b01000000
+ var Ref = 128; // 0b10000000
+
+ var MOUNTING = 1;
+ var MOUNTED = 2;
+ var UNMOUNTED = 3;
+
+ function isFiberMountedImpl(fiber) {
+ var node = fiber;
+ if (!fiber.alternate) {
+ // If there is no alternate, this might be a new tree that isn't inserted
+ // yet. If it is, then it will have a pending insertion effect on it.
+ if ((node.effectTag & Placement) !== NoEffect) {
+ return MOUNTING;
+ }
+ while (node["return"]) {
+ node = node["return"];
+ if ((node.effectTag & Placement) !== NoEffect) {
+ return MOUNTING;
+ }
+ }
+ } else {
+ while (node["return"]) {
+ node = node["return"];
+ }
+ }
+ if (node.tag === HostRoot) {
+ // TODO: Check if this was a nested HostRoot when used with
+ // renderContainerIntoSubtree.
+ return MOUNTED;
+ }
+ // If we didn't hit the root, that means that we're in an disconnected tree
+ // that has been unmounted.
+ return UNMOUNTED;
+ }
+
+ function isFiberMounted(fiber) {
+ return isFiberMountedImpl(fiber) === MOUNTED;
+ }
+
+ function isMounted(component) {
+ {
+ var owner = ReactCurrentOwner.current;
+ if (owner !== null && owner.tag === ClassComponent) {
+ var ownerFiber = owner;
+ var instance = ownerFiber.stateNode;
+ warning(
+ instance._warnedAboutRefsInRender,
+ "%s is accessing isMounted inside its render() function. " +
+ "render() should be a pure function of props and state. It should " +
+ "never access something that requires stale data from the previous " +
+ "render, such as refs. Move this logic to componentDidMount and " +
+ "componentDidUpdate instead.",
+ getComponentName(ownerFiber) || "A component"
+ );
+ instance._warnedAboutRefsInRender = true;
+ }
+ }
+
+ var fiber = get(component);
+ if (!fiber) {
+ return false;
+ }
+ return isFiberMountedImpl(fiber) === MOUNTED;
+ }
+
+ function assertIsMounted(fiber) {
+ !(isFiberMountedImpl(fiber) === MOUNTED)
+ ? invariant(
+ false,
+ "Unable to find node on an unmounted component."
+ )
+ : void 0;
+ }
+
+ function findCurrentFiberUsingSlowPath(fiber) {
+ var alternate = fiber.alternate;
+ if (!alternate) {
+ // If there is no alternate, then we only need to check if it is mounted.
+ var state = isFiberMountedImpl(fiber);
+ !(state !== UNMOUNTED)
+ ? invariant(
+ false,
+ "Unable to find node on an unmounted component."
+ )
+ : void 0;
+ if (state === MOUNTING) {
+ return null;
+ }
+ return fiber;
+ }
+ // If we have two possible branches, we'll walk backwards up to the root
+ // to see what path the root points to. On the way we may hit one of the
+ // special cases and we'll deal with them.
+ var a = fiber;
+ var b = alternate;
+ while (true) {
+ var parentA = a["return"];
+ var parentB = parentA ? parentA.alternate : null;
+ if (!parentA || !parentB) {
+ // We're at the root.
+ break;
+ }
+
+ // If both copies of the parent fiber point to the same child, we can
+ // assume that the child is current. This happens when we bailout on low
+ // priority: the bailed out fiber's child reuses the current child.
+ if (parentA.child === parentB.child) {
+ var child = parentA.child;
+ while (child) {
+ if (child === a) {
+ // We've determined that A is the current branch.
+ assertIsMounted(parentA);
+ return fiber;
+ }
+ if (child === b) {
+ // We've determined that B is the current branch.
+ assertIsMounted(parentA);
+ return alternate;
+ }
+ child = child.sibling;
+ }
+ // We should never have an alternate for any mounting node. So the only
+ // way this could possibly happen is if this was unmounted, if at all.
+ invariant(
+ false,
+ "Unable to find node on an unmounted component."
+ );
+ }
+
+ if (a["return"] !== b["return"]) {
+ // The return pointer of A and the return pointer of B point to different
+ // fibers. We assume that return pointers never criss-cross, so A must
+ // belong to the child set of A.return, and B must belong to the child
+ // set of B.return.
+ a = parentA;
+ b = parentB;
+ } else {
+ // The return pointers point to the same fiber. We'll have to use the
+ // default, slow path: scan the child sets of each parent alternate to see
+ // which child belongs to which set.
+ //
+ // Search parent A's child set
+ var didFindChild = false;
+ var _child = parentA.child;
+ while (_child) {
+ if (_child === a) {
+ didFindChild = true;
+ a = parentA;
+ b = parentB;
+ break;
+ }
+ if (_child === b) {
+ didFindChild = true;
+ b = parentA;
+ a = parentB;
+ break;
+ }
+ _child = _child.sibling;
+ }
+ if (!didFindChild) {
+ // Search parent B's child set
+ _child = parentB.child;
+ while (_child) {
+ if (_child === a) {
+ didFindChild = true;
+ a = parentB;
+ b = parentA;
+ break;
+ }
+ if (_child === b) {
+ didFindChild = true;
+ b = parentB;
+ a = parentA;
+ break;
+ }
+ _child = _child.sibling;
+ }
+ !didFindChild
+ ? invariant(
+ false,
+ "Child was not found in either parent set. This indicates a bug in React related to the return pointer. Please file an issue."
+ )
+ : void 0;
+ }
+ }
+
+ !(a.alternate === b)
+ ? invariant(
+ false,
+ "Return fibers should always be each others' alternates. This error is likely caused by a bug in React. Please file an issue."
+ )
+ : void 0;
+ }
+ // If the root is not a host container, we're in a disconnected tree. I.e.
+ // unmounted.
+ !(a.tag === HostRoot)
+ ? invariant(
+ false,
+ "Unable to find node on an unmounted component."
+ )
+ : void 0;
+ if (a.stateNode.current === a) {
+ // We've determined that A is the current branch.
+ return fiber;
+ }
+ // Otherwise B has to be current branch.
+ return alternate;
+ }
+
+ function findCurrentHostFiber(parent) {
+ var currentParent = findCurrentFiberUsingSlowPath(parent);
+ if (!currentParent) {
+ return null;
+ }
+
+ // Next we'll drill down this component to find the first HostComponent/Text.
+ var node = currentParent;
+ while (true) {
+ if (node.tag === HostComponent || node.tag === HostText) {
+ return node;
+ } else if (node.child) {
+ node.child["return"] = node;
+ node = node.child;
+ continue;
+ }
+ if (node === currentParent) {
+ return null;
+ }
+ while (!node.sibling) {
+ if (!node["return"] || node["return"] === currentParent) {
+ return null;
+ }
+ node = node["return"];
+ }
+ node.sibling["return"] = node["return"];
+ node = node.sibling;
+ }
+ // Flow needs the return null here, but ESLint complains about it.
+ // eslint-disable-next-line no-unreachable
+ return null;
+ }
+
+ function findCurrentHostFiberWithNoPortals(parent) {
+ var currentParent = findCurrentFiberUsingSlowPath(parent);
+ if (!currentParent) {
+ return null;
+ }
+
+ // Next we'll drill down this component to find the first HostComponent/Text.
+ var node = currentParent;
+ while (true) {
+ if (node.tag === HostComponent || node.tag === HostText) {
+ return node;
+ } else if (node.child && node.tag !== HostPortal) {
+ node.child["return"] = node;
+ node = node.child;
+ continue;
+ }
+ if (node === currentParent) {
+ return null;
+ }
+ while (!node.sibling) {
+ if (!node["return"] || node["return"] === currentParent) {
+ return null;
+ }
+ node = node["return"];
+ }
+ node.sibling["return"] = node["return"];
+ node = node.sibling;
+ }
+ // Flow needs the return null here, but ESLint complains about it.
+ // eslint-disable-next-line no-unreachable
+ return null;
+ }
+
+ var CALLBACK_BOOKKEEPING_POOL_SIZE = 10;
+ var callbackBookkeepingPool = [];
+
+ /**
+ * Find the deepest React component completely containing the root of the
+ * passed-in instance (for use when entire React trees are nested within each
+ * other). If React trees are not nested, returns null.
+ */
+ function findRootContainerNode(inst) {
+ // TODO: It may be a good idea to cache this to prevent unnecessary DOM
+ // traversal, but caching is difficult to do correctly without using a
+ // mutation observer to listen for all DOM changes.
+ while (inst["return"]) {
+ inst = inst["return"];
+ }
+ if (inst.tag !== HostRoot) {
+ // This can happen if we're in a detached tree.
+ return null;
+ }
+ return inst.stateNode.containerInfo;
+ }
+
+ // Used to store ancestor hierarchy in top level callback
+ function getTopLevelCallbackBookKeeping(
+ topLevelType,
+ nativeEvent,
+ targetInst
+ ) {
+ if (callbackBookkeepingPool.length) {
+ var instance = callbackBookkeepingPool.pop();
+ instance.topLevelType = topLevelType;
+ instance.nativeEvent = nativeEvent;
+ instance.targetInst = targetInst;
+ return instance;
+ }
+ return {
+ topLevelType: topLevelType,
+ nativeEvent: nativeEvent,
+ targetInst: targetInst,
+ ancestors: []
+ };
+ }
+
+ function releaseTopLevelCallbackBookKeeping(instance) {
+ instance.topLevelType = null;
+ instance.nativeEvent = null;
+ instance.targetInst = null;
+ instance.ancestors.length = 0;
+ if (
+ callbackBookkeepingPool.length < CALLBACK_BOOKKEEPING_POOL_SIZE
+ ) {
+ callbackBookkeepingPool.push(instance);
+ }
+ }
+
+ function handleTopLevelImpl(bookKeeping) {
+ var targetInst = bookKeeping.targetInst;
+
+ // Loop through the hierarchy, in case there's any nested components.
+ // It's important that we build the array of ancestors before calling any
+ // event handlers, because event handlers can modify the DOM, leading to
+ // inconsistencies with ReactMount's node cache. See #1105.
+ var ancestor = targetInst;
+ do {
+ if (!ancestor) {
+ bookKeeping.ancestors.push(ancestor);
+ break;
+ }
+ var root = findRootContainerNode(ancestor);
+ if (!root) {
+ break;
+ }
+ bookKeeping.ancestors.push(ancestor);
+ ancestor = getClosestInstanceFromNode(root);
+ } while (ancestor);
+
+ for (var i = 0; i < bookKeeping.ancestors.length; i++) {
+ targetInst = bookKeeping.ancestors[i];
+ _handleTopLevel(
+ bookKeeping.topLevelType,
+ targetInst,
+ bookKeeping.nativeEvent,
+ getEventTarget(bookKeeping.nativeEvent)
+ );
+ }
+ }
+
+ // TODO: can we stop exporting these?
+ var _enabled = true;
+ var _handleTopLevel = void 0;
+
+ function setHandleTopLevel(handleTopLevel) {
+ _handleTopLevel = handleTopLevel;
+ }
+
+ function setEnabled(enabled) {
+ _enabled = !!enabled;
+ }
+
+ function isEnabled() {
+ return _enabled;
+ }
+
+ /**
+ * Traps top-level events by using event bubbling.
+ *
+ * @param {string} topLevelType Record from `BrowserEventConstants`.
+ * @param {string} handlerBaseName Event name (e.g. "click").
+ * @param {object} element Element on which to attach listener.
+ * @return {?object} An object with a remove function which will forcefully
+ * remove the listener.
+ * @internal
+ */
+ function trapBubbledEvent(topLevelType, handlerBaseName, element) {
+ if (!element) {
+ return null;
+ }
+ return EventListener.listen(
+ element,
+ handlerBaseName,
+ dispatchEvent.bind(null, topLevelType)
+ );
+ }
+
+ /**
+ * Traps a top-level event by using event capturing.
+ *
+ * @param {string} topLevelType Record from `BrowserEventConstants`.
+ * @param {string} handlerBaseName Event name (e.g. "click").
+ * @param {object} element Element on which to attach listener.
+ * @return {?object} An object with a remove function which will forcefully
+ * remove the listener.
+ * @internal
+ */
+ function trapCapturedEvent(topLevelType, handlerBaseName, element) {
+ if (!element) {
+ return null;
+ }
+ return EventListener.capture(
+ element,
+ handlerBaseName,
+ dispatchEvent.bind(null, topLevelType)
+ );
+ }
+
+ function dispatchEvent(topLevelType, nativeEvent) {
+ if (!_enabled) {
+ return;
+ }
+
+ var nativeEventTarget = getEventTarget(nativeEvent);
+ var targetInst = getClosestInstanceFromNode(nativeEventTarget);
+ if (
+ targetInst !== null &&
+ typeof targetInst.tag === "number" &&
+ !isFiberMounted(targetInst)
+ ) {
+ // If we get an event (ex: img onload) before committing that
+ // component's mount, ignore it for now (that is, treat it as if it was an
+ // event on a non-React tree). We might also consider queueing events and
+ // dispatching them after the mount.
+ targetInst = null;
+ }
+
+ var bookKeeping = getTopLevelCallbackBookKeeping(
+ topLevelType,
+ nativeEvent,
+ targetInst
+ );
+
+ try {
+ // Event queue being processed in the same cycle allows
+ // `preventDefault`.
+ batchedUpdates(handleTopLevelImpl, bookKeeping);
+ } finally {
+ releaseTopLevelCallbackBookKeeping(bookKeeping);
+ }
+ }
+
+ var ReactDOMEventListener = Object.freeze({
+ get _enabled() {
+ return _enabled;
+ },
+ get _handleTopLevel() {
+ return _handleTopLevel;
+ },
+ setHandleTopLevel: setHandleTopLevel,
+ setEnabled: setEnabled,
+ isEnabled: isEnabled,
+ trapBubbledEvent: trapBubbledEvent,
+ trapCapturedEvent: trapCapturedEvent,
+ dispatchEvent: dispatchEvent
+ });
+
+ /**
+ * Generate a mapping of standard vendor prefixes using the defined style property and event name.
+ *
+ * @param {string} styleProp
+ * @param {string} eventName
+ * @returns {object}
+ */
+ function makePrefixMap(styleProp, eventName) {
+ var prefixes = {};
+
+ prefixes[styleProp.toLowerCase()] = eventName.toLowerCase();
+ prefixes["Webkit" + styleProp] = "webkit" + eventName;
+ prefixes["Moz" + styleProp] = "moz" + eventName;
+ prefixes["ms" + styleProp] = "MS" + eventName;
+ prefixes["O" + styleProp] = "o" + eventName.toLowerCase();
+
+ return prefixes;
+ }
+
+ /**
+ * A list of event names to a configurable list of vendor prefixes.
+ */
+ var vendorPrefixes = {
+ animationend: makePrefixMap("Animation", "AnimationEnd"),
+ animationiteration: makePrefixMap(
+ "Animation",
+ "AnimationIteration"
+ ),
+ animationstart: makePrefixMap("Animation", "AnimationStart"),
+ transitionend: makePrefixMap("Transition", "TransitionEnd")
+ };
+
+ /**
+ * Event names that have already been detected and prefixed (if applicable).
+ */
+ var prefixedEventNames = {};
+
+ /**
+ * Element to check for prefixes on.
+ */
+ var style = {};
+
+ /**
+ * Bootstrap if a DOM exists.
+ */
+ if (ExecutionEnvironment.canUseDOM) {
+ style = document.createElement("div").style;
+
+ // On some platforms, in particular some releases of Android 4.x,
+ // the un-prefixed "animation" and "transition" properties are defined on the
+ // style object but the events that fire will still be prefixed, so we need
+ // to check if the un-prefixed events are usable, and if not remove them from the map.
+ if (!("AnimationEvent" in window)) {
+ delete vendorPrefixes.animationend.animation;
+ delete vendorPrefixes.animationiteration.animation;
+ delete vendorPrefixes.animationstart.animation;
+ }
+
+ // Same as above
+ if (!("TransitionEvent" in window)) {
+ delete vendorPrefixes.transitionend.transition;
+ }
+ }
+
+ /**
+ * Attempts to determine the correct vendor prefixed event name.
+ *
+ * @param {string} eventName
+ * @returns {string}
+ */
+ function getVendorPrefixedEventName(eventName) {
+ if (prefixedEventNames[eventName]) {
+ return prefixedEventNames[eventName];
+ } else if (!vendorPrefixes[eventName]) {
+ return eventName;
+ }
+
+ var prefixMap = vendorPrefixes[eventName];
+
+ for (var styleProp in prefixMap) {
+ if (prefixMap.hasOwnProperty(styleProp) && styleProp in style) {
+ return (prefixedEventNames[eventName] = prefixMap[styleProp]);
+ }
+ }
+
+ return "";
+ }
+
+ /**
+ * Types of raw signals from the browser caught at the top level.
+ *
+ * For events like 'submit' which don't consistently bubble (which we
+ * trap at a lower node than `document`), binding at `document` would
+ * cause duplicate events so we don't include them here.
+ */
+ var topLevelTypes$1 = {
+ topAbort: "abort",
+ topAnimationEnd:
+ getVendorPrefixedEventName("animationend") || "animationend",
+ topAnimationIteration:
+ getVendorPrefixedEventName("animationiteration") ||
+ "animationiteration",
+ topAnimationStart:
+ getVendorPrefixedEventName("animationstart") ||
+ "animationstart",
+ topBlur: "blur",
+ topCancel: "cancel",
+ topCanPlay: "canplay",
+ topCanPlayThrough: "canplaythrough",
+ topChange: "change",
+ topClick: "click",
+ topClose: "close",
+ topCompositionEnd: "compositionend",
+ topCompositionStart: "compositionstart",
+ topCompositionUpdate: "compositionupdate",
+ topContextMenu: "contextmenu",
+ topCopy: "copy",
+ topCut: "cut",
+ topDoubleClick: "dblclick",
+ topDrag: "drag",
+ topDragEnd: "dragend",
+ topDragEnter: "dragenter",
+ topDragExit: "dragexit",
+ topDragLeave: "dragleave",
+ topDragOver: "dragover",
+ topDragStart: "dragstart",
+ topDrop: "drop",
+ topDurationChange: "durationchange",
+ topEmptied: "emptied",
+ topEncrypted: "encrypted",
+ topEnded: "ended",
+ topError: "error",
+ topFocus: "focus",
+ topInput: "input",
+ topKeyDown: "keydown",
+ topKeyPress: "keypress",
+ topKeyUp: "keyup",
+ topLoadedData: "loadeddata",
+ topLoad: "load",
+ topLoadedMetadata: "loadedmetadata",
+ topLoadStart: "loadstart",
+ topMouseDown: "mousedown",
+ topMouseMove: "mousemove",
+ topMouseOut: "mouseout",
+ topMouseOver: "mouseover",
+ topMouseUp: "mouseup",
+ topPaste: "paste",
+ topPause: "pause",
+ topPlay: "play",
+ topPlaying: "playing",
+ topProgress: "progress",
+ topRateChange: "ratechange",
+ topScroll: "scroll",
+ topSeeked: "seeked",
+ topSeeking: "seeking",
+ topSelectionChange: "selectionchange",
+ topStalled: "stalled",
+ topSuspend: "suspend",
+ topTextInput: "textInput",
+ topTimeUpdate: "timeupdate",
+ topToggle: "toggle",
+ topTouchCancel: "touchcancel",
+ topTouchEnd: "touchend",
+ topTouchMove: "touchmove",
+ topTouchStart: "touchstart",
+ topTransitionEnd:
+ getVendorPrefixedEventName("transitionend") || "transitionend",
+ topVolumeChange: "volumechange",
+ topWaiting: "waiting",
+ topWheel: "wheel"
+ };
+
+ var BrowserEventConstants = {
+ topLevelTypes: topLevelTypes$1
+ };
+
+ function runEventQueueInBatch(events) {
+ enqueueEvents(events);
+ processEventQueue(false);
+ }
+
+ /**
+ * Streams a fired top-level event to `EventPluginHub` where plugins have the
+ * opportunity to create `ReactEvent`s to be dispatched.
+ */
+ function handleTopLevel(
+ topLevelType,
+ targetInst,
+ nativeEvent,
+ nativeEventTarget
+ ) {
+ var events = extractEvents(
+ topLevelType,
+ targetInst,
+ nativeEvent,
+ nativeEventTarget
+ );
+ runEventQueueInBatch(events);
+ }
+
+ var topLevelTypes = BrowserEventConstants.topLevelTypes;
+
+ /**
+ * Summary of `ReactBrowserEventEmitter` event handling:
+ *
+ * - Top-level delegation is used to trap most native browser events. This
+ * may only occur in the main thread and is the responsibility of
+ * ReactDOMEventListener, which is injected and can therefore support
+ * pluggable event sources. This is the only work that occurs in the main
+ * thread.
+ *
+ * - We normalize and de-duplicate events to account for browser quirks. This
+ * may be done in the worker thread.
+ *
+ * - Forward these native events (with the associated top-level type used to
+ * trap it) to `EventPluginHub`, which in turn will ask plugins if they want
+ * to extract any synthetic events.
+ *
+ * - The `EventPluginHub` will then process each event by annotating them with
+ * "dispatches", a sequence of listeners and IDs that care about that event.
+ *
+ * - The `EventPluginHub` then dispatches the events.
+ *
+ * Overview of React and the event system:
+ *
+ * +------------+ .
+ * | DOM | .
+ * +------------+ .
+ * | .
+ * v .
+ * +------------+ .
+ * | ReactEvent | .
+ * | Listener | .
+ * +------------+ . +-----------+
+ * | . +--------+|SimpleEvent|
+ * | . | |Plugin |
+ * +-----|------+ . v +-----------+
+ * | | | . +--------------+ +------------+
+ * | +-----------.--->|EventPluginHub| | Event |
+ * | | . | | +-----------+ | Propagators|
+ * | ReactEvent | . | | |TapEvent | |------------|
+ * | Emitter | . | |<---+|Plugin | |other plugin|
+ * | | . | | +-----------+ | utilities |
+ * | +-----------.--->| | +------------+
+ * | | | . +--------------+
+ * +-----|------+ . ^ +-----------+
+ * | . | |Enter/Leave|
+ * + . +-------+|Plugin |
+ * +-------------+ . +-----------+
+ * | application | .
+ * |-------------| .
+ * | | .
+ * | | .
+ * +-------------+ .
+ * .
+ * React Core . General Purpose Event Plugin System
+ */
+
+ var alreadyListeningTo = {};
+ var reactTopListenersCounter = 0;
+
+ /**
+ * To ensure no conflicts with other potential React instances on the page
+ */
+ var topListenersIDKey =
+ "_reactListenersID" + ("" + Math.random()).slice(2);
+
+ function getListeningForDocument(mountAt) {
+ // In IE8, `mountAt` is a host object and doesn't have `hasOwnProperty`
+ // directly.
+ if (
+ !Object.prototype.hasOwnProperty.call(
+ mountAt,
+ topListenersIDKey
+ )
+ ) {
+ mountAt[topListenersIDKey] = reactTopListenersCounter++;
+ alreadyListeningTo[mountAt[topListenersIDKey]] = {};
+ }
+ return alreadyListeningTo[mountAt[topListenersIDKey]];
+ }
+
+ /**
+ * We listen for bubbled touch events on the document object.
+ *
+ * Firefox v8.01 (and possibly others) exhibited strange behavior when
+ * mounting `onmousemove` events at some node that was not the document
+ * element. The symptoms were that if your mouse is not moving over something
+ * contained within that mount point (for example on the background) the
+ * top-level listeners for `onmousemove` won't be called. However, if you
+ * register the `mousemove` on the document object, then it will of course
+ * catch all `mousemove`s. This along with iOS quirks, justifies restricting
+ * top-level listeners to the document object only, at least for these
+ * movement types of events and possibly all events.
+ *
+ * @see http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html
+ *
+ * Also, `keyup`/`keypress`/`keydown` do not bubble to the window on IE, but
+ * they bubble to document.
+ *
+ * @param {string} registrationName Name of listener (e.g. `onClick`).
+ * @param {object} contentDocumentHandle Document which owns the container
+ */
+ function listenTo(registrationName, contentDocumentHandle) {
+ var mountAt = contentDocumentHandle;
+ var isListening = getListeningForDocument(mountAt);
+ var dependencies = registrationNameDependencies[registrationName];
+
+ for (var i = 0; i < dependencies.length; i++) {
+ var dependency = dependencies[i];
+ if (
+ !(
+ isListening.hasOwnProperty(dependency) &&
+ isListening[dependency]
+ )
+ ) {
+ if (dependency === "topScroll") {
+ trapCapturedEvent("topScroll", "scroll", mountAt);
+ } else if (
+ dependency === "topFocus" ||
+ dependency === "topBlur"
+ ) {
+ trapCapturedEvent("topFocus", "focus", mountAt);
+ trapCapturedEvent("topBlur", "blur", mountAt);
+
+ // to make sure blur and focus event listeners are only attached once
+ isListening.topBlur = true;
+ isListening.topFocus = true;
+ } else if (dependency === "topCancel") {
+ if (isEventSupported("cancel", true)) {
+ trapCapturedEvent("topCancel", "cancel", mountAt);
+ }
+ isListening.topCancel = true;
+ } else if (dependency === "topClose") {
+ if (isEventSupported("close", true)) {
+ trapCapturedEvent("topClose", "close", mountAt);
+ }
+ isListening.topClose = true;
+ } else if (topLevelTypes.hasOwnProperty(dependency)) {
+ trapBubbledEvent(
+ dependency,
+ topLevelTypes[dependency],
+ mountAt
+ );
+ }
+
+ isListening[dependency] = true;
+ }
+ }
+ }
+
+ function isListeningToAllDependencies(registrationName, mountAt) {
+ var isListening = getListeningForDocument(mountAt);
+ var dependencies = registrationNameDependencies[registrationName];
+ for (var i = 0; i < dependencies.length; i++) {
+ var dependency = dependencies[i];
+ if (
+ !(
+ isListening.hasOwnProperty(dependency) &&
+ isListening[dependency]
+ )
+ ) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Given any node return the first leaf node without children.
+ *
+ * @param {DOMElement|DOMTextNode} node
+ * @return {DOMElement|DOMTextNode}
+ */
+ function getLeafNode(node) {
+ while (node && node.firstChild) {
+ node = node.firstChild;
+ }
+ return node;
+ }
+
+ /**
+ * Get the next sibling within a container. This will walk up the
+ * DOM if a node's siblings have been exhausted.
+ *
+ * @param {DOMElement|DOMTextNode} node
+ * @return {?DOMElement|DOMTextNode}
+ */
+ function getSiblingNode(node) {
+ while (node) {
+ if (node.nextSibling) {
+ return node.nextSibling;
+ }
+ node = node.parentNode;
+ }
+ }
+
+ /**
+ * Get object describing the nodes which contain characters at offset.
+ *
+ * @param {DOMElement|DOMTextNode} root
+ * @param {number} offset
+ * @return {?object}
+ */
+ function getNodeForCharacterOffset(root, offset) {
+ var node = getLeafNode(root);
+ var nodeStart = 0;
+ var nodeEnd = 0;
+
+ while (node) {
+ if (node.nodeType === TEXT_NODE) {
+ nodeEnd = nodeStart + node.textContent.length;
+
+ if (nodeStart <= offset && nodeEnd >= offset) {
+ return {
+ node: node,
+ offset: offset - nodeStart
+ };
+ }
+
+ nodeStart = nodeEnd;
+ }
+
+ node = getLeafNode(getSiblingNode(node));
+ }
+ }
+
+ /**
+ * @param {DOMElement} outerNode
+ * @return {?object}
+ */
+ function getOffsets(outerNode) {
+ var selection = window.getSelection && window.getSelection();
+
+ if (!selection || selection.rangeCount === 0) {
+ return null;
+ }
+
+ var anchorNode = selection.anchorNode,
+ anchorOffset = selection.anchorOffset,
+ focusNode$$1 = selection.focusNode,
+ focusOffset = selection.focusOffset;
+
+ // In Firefox, anchorNode and focusNode can be "anonymous divs", e.g. the
+ // up/down buttons on an <input type="number">. Anonymous divs do not seem to
+ // expose properties, triggering a "Permission denied error" if any of its
+ // properties are accessed. The only seemingly possible way to avoid erroring
+ // is to access a property that typically works for non-anonymous divs and
+ // catch any error that may otherwise arise. See
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=208427
+
+ try {
+ /* eslint-disable no-unused-expressions */
+ anchorNode.nodeType;
+ focusNode$$1.nodeType;
+ /* eslint-enable no-unused-expressions */
+ } catch (e) {
+ return null;
+ }
+
+ return getModernOffsetsFromPoints(
+ outerNode,
+ anchorNode,
+ anchorOffset,
+ focusNode$$1,
+ focusOffset
+ );
+ }
+
+ /**
+ * Returns {start, end} where `start` is the character/codepoint index of
+ * (anchorNode, anchorOffset) within the textContent of `outerNode`, and
+ * `end` is the index of (focusNode, focusOffset).
+ *
+ * Returns null if you pass in garbage input but we should probably just crash.
+ *
+ * Exported only for testing.
+ */
+ function getModernOffsetsFromPoints(
+ outerNode,
+ anchorNode,
+ anchorOffset,
+ focusNode$$1,
+ focusOffset
+ ) {
+ var length = 0;
+ var start = -1;
+ var end = -1;
+ var indexWithinAnchor = 0;
+ var indexWithinFocus = 0;
+ var node = outerNode;
+ var parentNode = null;
+
+ outer: while (true) {
+ var next = null;
+
+ while (true) {
+ if (
+ node === anchorNode &&
+ (anchorOffset === 0 || node.nodeType === TEXT_NODE)
+ ) {
+ start = length + anchorOffset;
+ }
+ if (
+ node === focusNode$$1 &&
+ (focusOffset === 0 || node.nodeType === TEXT_NODE)
+ ) {
+ end = length + focusOffset;
+ }
+
+ if (node.nodeType === TEXT_NODE) {
+ length += node.nodeValue.length;
+ }
+
+ if ((next = node.firstChild) === null) {
+ break;
+ }
+ // Moving from `node` to its first child `next`.
+ parentNode = node;
+ node = next;
+ }
+
+ while (true) {
+ if (node === outerNode) {
+ // If `outerNode` has children, this is always the second time visiting
+ // it. If it has no children, this is still the first loop, and the only
+ // valid selection is anchorNode and focusNode both equal to this node
+ // and both offsets 0, in which case we will have handled above.
+ break outer;
+ }
+ if (
+ parentNode === anchorNode &&
+ ++indexWithinAnchor === anchorOffset
+ ) {
+ start = length;
+ }
+ if (
+ parentNode === focusNode$$1 &&
+ ++indexWithinFocus === focusOffset
+ ) {
+ end = length;
+ }
+ if ((next = node.nextSibling) !== null) {
+ break;
+ }
+ node = parentNode;
+ parentNode = node.parentNode;
+ }
+
+ // Moving from `node` to its next sibling `next`.
+ node = next;
+ }
+
+ if (start === -1 || end === -1) {
+ // This should never happen. (Would happen if the anchor/focus nodes aren't
+ // actually inside the passed-in node.)
+ return null;
+ }
+
+ return {
+ start: start,
+ end: end
+ };
+ }
+
+ /**
+ * In modern non-IE browsers, we can support both forward and backward
+ * selections.
+ *
+ * Note: IE10+ supports the Selection object, but it does not support
+ * the `extend` method, which means that even in modern IE, it's not possible
+ * to programmatically create a backward selection. Thus, for all IE
+ * versions, we use the old IE API to create our selections.
+ *
+ * @param {DOMElement|DOMTextNode} node
+ * @param {object} offsets
+ */
+ function setOffsets(node, offsets) {
+ if (!window.getSelection) {
+ return;
+ }
+
+ var selection = window.getSelection();
+ var length = node[getTextContentAccessor()].length;
+ var start = Math.min(offsets.start, length);
+ var end =
+ offsets.end === undefined
+ ? start
+ : Math.min(offsets.end, length);
+
+ // IE 11 uses modern selection, but doesn't support the extend method.
+ // Flip backward selections, so we can set with a single range.
+ if (!selection.extend && start > end) {
+ var temp = end;
+ end = start;
+ start = temp;
+ }
+
+ var startMarker = getNodeForCharacterOffset(node, start);
+ var endMarker = getNodeForCharacterOffset(node, end);
+
+ if (startMarker && endMarker) {
+ if (
+ selection.rangeCount === 1 &&
+ selection.anchorNode === startMarker.node &&
+ selection.anchorOffset === startMarker.offset &&
+ selection.focusNode === endMarker.node &&
+ selection.focusOffset === endMarker.offset
+ ) {
+ return;
+ }
+ var range = document.createRange();
+ range.setStart(startMarker.node, startMarker.offset);
+ selection.removeAllRanges();
+
+ if (start > end) {
+ selection.addRange(range);
+ selection.extend(endMarker.node, endMarker.offset);
+ } else {
+ range.setEnd(endMarker.node, endMarker.offset);
+ selection.addRange(range);
+ }
+ }
+ }
+
+ function isInDocument(node) {
+ return containsNode(document.documentElement, node);
+ }
+
+ /**
+ * @ReactInputSelection: React input selection module. Based on Selection.js,
+ * but modified to be suitable for react and has a couple of bug fixes (doesn't
+ * assume buttons have range selections allowed).
+ * Input selection module for React.
+ */
+
+ function hasSelectionCapabilities(elem) {
+ var nodeName =
+ elem && elem.nodeName && elem.nodeName.toLowerCase();
+ return (
+ nodeName &&
+ ((nodeName === "input" && elem.type === "text") ||
+ nodeName === "textarea" ||
+ elem.contentEditable === "true")
+ );
+ }
+
+ function getSelectionInformation() {
+ var focusedElem = getActiveElement();
+ return {
+ focusedElem: focusedElem,
+ selectionRange: hasSelectionCapabilities(focusedElem)
+ ? getSelection$1(focusedElem)
+ : null
+ };
+ }
+
+ /**
+ * @restoreSelection: If any selection information was potentially lost,
+ * restore it. This is useful when performing operations that could remove dom
+ * nodes and place them back in, resulting in focus being lost.
+ */
+ function restoreSelection(priorSelectionInformation) {
+ var curFocusedElem = getActiveElement();
+ var priorFocusedElem = priorSelectionInformation.focusedElem;
+ var priorSelectionRange =
+ priorSelectionInformation.selectionRange;
+ if (
+ curFocusedElem !== priorFocusedElem &&
+ isInDocument(priorFocusedElem)
+ ) {
+ if (hasSelectionCapabilities(priorFocusedElem)) {
+ setSelection(priorFocusedElem, priorSelectionRange);
+ }
+
+ // Focusing a node can change the scroll position, which is undesirable
+ var ancestors = [];
+ var ancestor = priorFocusedElem;
+ while ((ancestor = ancestor.parentNode)) {
+ if (ancestor.nodeType === ELEMENT_NODE) {
+ ancestors.push({
+ element: ancestor,
+ left: ancestor.scrollLeft,
+ top: ancestor.scrollTop
+ });
+ }
+ }
+
+ focusNode(priorFocusedElem);
+
+ for (var i = 0; i < ancestors.length; i++) {
+ var info = ancestors[i];
+ info.element.scrollLeft = info.left;
+ info.element.scrollTop = info.top;
+ }
+ }
+ }
+
+ /**
+ * @getSelection: Gets the selection bounds of a focused textarea, input or
+ * contentEditable node.
+ * -@input: Look up selection bounds of this input
+ * -@return {start: selectionStart, end: selectionEnd}
+ */
+ function getSelection$1(input) {
+ var selection = void 0;
+
+ if ("selectionStart" in input) {
+ // Modern browser with input or textarea.
+ selection = {
+ start: input.selectionStart,
+ end: input.selectionEnd
+ };
+ } else {
+ // Content editable or old IE textarea.
+ selection = getOffsets(input);
+ }
+
+ return selection || { start: 0, end: 0 };
+ }
+
+ /**
+ * @setSelection: Sets the selection bounds of a textarea or input and focuses
+ * the input.
+ * -@input Set selection bounds of this input or textarea
+ * -@offsets Object of same form that is returned from get*
+ */
+ function setSelection(input, offsets) {
+ var start = offsets.start,
+ end = offsets.end;
+
+ if (end === undefined) {
+ end = start;
+ }
+
+ if ("selectionStart" in input) {
+ input.selectionStart = start;
+ input.selectionEnd = Math.min(end, input.value.length);
+ } else {
+ setOffsets(input, offsets);
+ }
+ }
+
+ var skipSelectionChangeEvent =
+ ExecutionEnvironment.canUseDOM &&
+ "documentMode" in document &&
+ document.documentMode <= 11;
+
+ var eventTypes$3 = {
+ select: {
+ phasedRegistrationNames: {
+ bubbled: "onSelect",
+ captured: "onSelectCapture"
+ },
+ dependencies: [
+ "topBlur",
+ "topContextMenu",
+ "topFocus",
+ "topKeyDown",
+ "topKeyUp",
+ "topMouseDown",
+ "topMouseUp",
+ "topSelectionChange"
+ ]
+ }
+ };
+
+ var activeElement$1 = null;
+ var activeElementInst$1 = null;
+ var lastSelection = null;
+ var mouseDown = false;
+
+ /**
+ * Get an object which is a unique representation of the current selection.
+ *
+ * The return value will not be consistent across nodes or browsers, but
+ * two identical selections on the same node will return identical objects.
+ *
+ * @param {DOMElement} node
+ * @return {object}
+ */
+ function getSelection(node) {
+ if ("selectionStart" in node && hasSelectionCapabilities(node)) {
+ return {
+ start: node.selectionStart,
+ end: node.selectionEnd
+ };
+ } else if (window.getSelection) {
+ var selection = window.getSelection();
+ return {
+ anchorNode: selection.anchorNode,
+ anchorOffset: selection.anchorOffset,
+ focusNode: selection.focusNode,
+ focusOffset: selection.focusOffset
+ };
+ }
+ }
+
+ /**
+ * Poll selection to see whether it's changed.
+ *
+ * @param {object} nativeEvent
+ * @return {?SyntheticEvent}
+ */
+ function constructSelectEvent(nativeEvent, nativeEventTarget) {
+ // Ensure we have the right element, and that the user is not dragging a
+ // selection (this matches native `select` event behavior). In HTML5, select
+ // fires only on input and textarea thus if there's no focused element we
+ // won't dispatch.
+ if (
+ mouseDown ||
+ activeElement$1 == null ||
+ activeElement$1 !== getActiveElement()
+ ) {
+ return null;
+ }
+
+ // Only fire when selection has actually changed.
+ var currentSelection = getSelection(activeElement$1);
+ if (
+ !lastSelection ||
+ !shallowEqual(lastSelection, currentSelection)
+ ) {
+ lastSelection = currentSelection;
+
+ var syntheticEvent = SyntheticEvent$1.getPooled(
+ eventTypes$3.select,
+ activeElementInst$1,
+ nativeEvent,
+ nativeEventTarget
+ );
+
+ syntheticEvent.type = "select";
+ syntheticEvent.target = activeElement$1;
+
+ accumulateTwoPhaseDispatches(syntheticEvent);
+
+ return syntheticEvent;
+ }
+
+ return null;
+ }
+
+ /**
+ * This plugin creates an `onSelect` event that normalizes select events
+ * across form elements.
+ *
+ * Supported elements are:
+ * - input (see `isTextInputElement`)
+ * - textarea
+ * - contentEditable
+ *
+ * This differs from native browser implementations in the following ways:
+ * - Fires on contentEditable fields as well as inputs.
+ * - Fires for collapsed selection.
+ * - Fires after user input.
+ */
+ var SelectEventPlugin = {
+ eventTypes: eventTypes$3,
+
+ extractEvents: function(
+ topLevelType,
+ targetInst,
+ nativeEvent,
+ nativeEventTarget
+ ) {
+ var doc =
+ nativeEventTarget.window === nativeEventTarget
+ ? nativeEventTarget.document
+ : nativeEventTarget.nodeType === DOCUMENT_NODE
+ ? nativeEventTarget
+ : nativeEventTarget.ownerDocument;
+ // Track whether all listeners exists for this plugin. If none exist, we do
+ // not extract events. See #3639.
+ if (!doc || !isListeningToAllDependencies("onSelect", doc)) {
+ return null;
+ }
+
+ var targetNode = targetInst
+ ? getNodeFromInstance$1(targetInst)
+ : window;
+
+ switch (topLevelType) {
+ // Track the input node that has focus.
+ case "topFocus":
+ if (
+ isTextInputElement(targetNode) ||
+ targetNode.contentEditable === "true"
+ ) {
+ activeElement$1 = targetNode;
+ activeElementInst$1 = targetInst;
+ lastSelection = null;
+ }
+ break;
+ case "topBlur":
+ activeElement$1 = null;
+ activeElementInst$1 = null;
+ lastSelection = null;
+ break;
+ // Don't fire the event while the user is dragging. This matches the
+ // semantics of the native select event.
+ case "topMouseDown":
+ mouseDown = true;
+ break;
+ case "topContextMenu":
+ case "topMouseUp":
+ mouseDown = false;
+ return constructSelectEvent(nativeEvent, nativeEventTarget);
+ // Chrome and IE fire non-standard event when selection is changed (and
+ // sometimes when it hasn't). IE's event fires out of order with respect
+ // to key and input events on deletion, so we discard it.
+ //
+ // Firefox doesn't support selectionchange, so check selection status
+ // after each key entry. The selection changes after keydown and before
+ // keyup, but we check on keydown as well in the case of holding down a
+ // key, when multiple keydown events are fired but only one keyup is.
+ // This is also our approach for IE handling, for the reason above.
+ case "topSelectionChange":
+ if (skipSelectionChangeEvent) {
+ break;
+ }
+ // falls through
+ case "topKeyDown":
+ case "topKeyUp":
+ return constructSelectEvent(nativeEvent, nativeEventTarget);
+ }
+
+ return null;
+ }
+ };
+
+ /**
+ * @interface Event
+ * @see http://www.w3.org/TR/css3-animations/#AnimationEvent-interface
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/AnimationEvent
+ */
+ var AnimationEventInterface = {
+ animationName: null,
+ elapsedTime: null,
+ pseudoElement: null
+ };
+
+ /**
+ * @param {object} dispatchConfig Configuration used to dispatch this event.
+ * @param {string} dispatchMarker Marker identifying the event target.
+ * @param {object} nativeEvent Native browser event.
+ * @extends {SyntheticEvent}
+ */
+ function SyntheticAnimationEvent(
+ dispatchConfig,
+ dispatchMarker,
+ nativeEvent,
+ nativeEventTarget
+ ) {
+ return SyntheticEvent$1.call(
+ this,
+ dispatchConfig,
+ dispatchMarker,
+ nativeEvent,
+ nativeEventTarget
+ );
+ }
+
+ SyntheticEvent$1.augmentClass(
+ SyntheticAnimationEvent,
+ AnimationEventInterface
+ );
+
+ /**
+ * @interface Event
+ * @see http://www.w3.org/TR/clipboard-apis/
+ */
+ var ClipboardEventInterface = {
+ clipboardData: function(event) {
+ return "clipboardData" in event
+ ? event.clipboardData
+ : window.clipboardData;
+ }
+ };
+
+ /**
+ * @param {object} dispatchConfig Configuration used to dispatch this event.
+ * @param {string} dispatchMarker Marker identifying the event target.
+ * @param {object} nativeEvent Native browser event.
+ * @extends {SyntheticEvent}
+ */
+ function SyntheticClipboardEvent(
+ dispatchConfig,
+ dispatchMarker,
+ nativeEvent,
+ nativeEventTarget
+ ) {
+ return SyntheticEvent$1.call(
+ this,
+ dispatchConfig,
+ dispatchMarker,
+ nativeEvent,
+ nativeEventTarget
+ );
+ }
+
+ SyntheticEvent$1.augmentClass(
+ SyntheticClipboardEvent,
+ ClipboardEventInterface
+ );
+
+ /**
+ * @interface FocusEvent
+ * @see http://www.w3.org/TR/DOM-Level-3-Events/
+ */
+ var FocusEventInterface = {
+ relatedTarget: null
+ };
+
+ /**
+ * @param {object} dispatchConfig Configuration used to dispatch this event.
+ * @param {string} dispatchMarker Marker identifying the event target.
+ * @param {object} nativeEvent Native browser event.
+ * @extends {SyntheticUIEvent}
+ */
+ function SyntheticFocusEvent(
+ dispatchConfig,
+ dispatchMarker,
+ nativeEvent,
+ nativeEventTarget
+ ) {
+ return SyntheticUIEvent.call(
+ this,
+ dispatchConfig,
+ dispatchMarker,
+ nativeEvent,
+ nativeEventTarget
+ );
+ }
+
+ SyntheticUIEvent.augmentClass(
+ SyntheticFocusEvent,
+ FocusEventInterface
+ );
+
+ /**
+ * `charCode` represents the actual "character code" and is safe to use with
+ * `String.fromCharCode`. As such, only keys that correspond to printable
+ * characters produce a valid `charCode`, the only exception to this is Enter.
+ * The Tab-key is considered non-printable and does not have a `charCode`,
+ * presumably because it does not produce a tab-character in browsers.
+ *
+ * @param {object} nativeEvent Native browser event.
+ * @return {number} Normalized `charCode` property.
+ */
+ function getEventCharCode(nativeEvent) {
+ var charCode;
+ var keyCode = nativeEvent.keyCode;
+
+ if ("charCode" in nativeEvent) {
+ charCode = nativeEvent.charCode;
+
+ // FF does not set `charCode` for the Enter-key, check against `keyCode`.
+ if (charCode === 0 && keyCode === 13) {
+ charCode = 13;
+ }
+ } else {
+ // IE8 does not implement `charCode`, but `keyCode` has the correct value.
+ charCode = keyCode;
+ }
+
+ // Some non-printable keys are reported in `charCode`/`keyCode`, discard them.
+ // Must not discard the (non-)printable Enter-key.
+ if (charCode >= 32 || charCode === 13) {
+ return charCode;
+ }
+
+ return 0;
+ }
+
+ /**
+ * Normalization of deprecated HTML5 `key` values
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names
+ */
+ var normalizeKey = {
+ Esc: "Escape",
+ Spacebar: " ",
+ Left: "ArrowLeft",
+ Up: "ArrowUp",
+ Right: "ArrowRight",
+ Down: "ArrowDown",
+ Del: "Delete",
+ Win: "OS",
+ Menu: "ContextMenu",
+ Apps: "ContextMenu",
+ Scroll: "ScrollLock",
+ MozPrintableKey: "Unidentified"
+ };
+
+ /**
+ * Translation from legacy `keyCode` to HTML5 `key`
+ * Only special keys supported, all others depend on keyboard layout or browser
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names
+ */
+ var translateToKey = {
+ "8": "Backspace",
+ "9": "Tab",
+ "12": "Clear",
+ "13": "Enter",
+ "16": "Shift",
+ "17": "Control",
+ "18": "Alt",
+ "19": "Pause",
+ "20": "CapsLock",
+ "27": "Escape",
+ "32": " ",
+ "33": "PageUp",
+ "34": "PageDown",
+ "35": "End",
+ "36": "Home",
+ "37": "ArrowLeft",
+ "38": "ArrowUp",
+ "39": "ArrowRight",
+ "40": "ArrowDown",
+ "45": "Insert",
+ "46": "Delete",
+ "112": "F1",
+ "113": "F2",
+ "114": "F3",
+ "115": "F4",
+ "116": "F5",
+ "117": "F6",
+ "118": "F7",
+ "119": "F8",
+ "120": "F9",
+ "121": "F10",
+ "122": "F11",
+ "123": "F12",
+ "144": "NumLock",
+ "145": "ScrollLock",
+ "224": "Meta"
+ };
+
+ /**
+ * @param {object} nativeEvent Native browser event.
+ * @return {string} Normalized `key` property.
+ */
+ function getEventKey(nativeEvent) {
+ if (nativeEvent.key) {
+ // Normalize inconsistent values reported by browsers due to
+ // implementations of a working draft specification.
+
+ // FireFox implements `key` but returns `MozPrintableKey` for all
+ // printable characters (normalized to `Unidentified`), ignore it.
+ var key = normalizeKey[nativeEvent.key] || nativeEvent.key;
+ if (key !== "Unidentified") {
+ return key;
+ }
+ }
+
+ // Browser does not implement `key`, polyfill as much of it as we can.
+ if (nativeEvent.type === "keypress") {
+ var charCode = getEventCharCode(nativeEvent);
+
+ // The enter-key is technically both printable and non-printable and can
+ // thus be captured by `keypress`, no other non-printable key should.
+ return charCode === 13
+ ? "Enter"
+ : String.fromCharCode(charCode);
+ }
+ if (
+ nativeEvent.type === "keydown" ||
+ nativeEvent.type === "keyup"
+ ) {
+ // While user keyboard layout determines the actual meaning of each
+ // `keyCode` value, almost all function keys have a universal value.
+ return translateToKey[nativeEvent.keyCode] || "Unidentified";
+ }
+ return "";
+ }
+
+ /**
+ * @interface KeyboardEvent
+ * @see http://www.w3.org/TR/DOM-Level-3-Events/
+ */
+ var KeyboardEventInterface = {
+ key: getEventKey,
+ location: null,
+ ctrlKey: null,
+ shiftKey: null,
+ altKey: null,
+ metaKey: null,
+ repeat: null,
+ locale: null,
+ getModifierState: getEventModifierState,
+ // Legacy Interface
+ charCode: function(event) {
+ // `charCode` is the result of a KeyPress event and represents the value of
+ // the actual printable character.
+
+ // KeyPress is deprecated, but its replacement is not yet final and not
+ // implemented in any major browser. Only KeyPress has charCode.
+ if (event.type === "keypress") {
+ return getEventCharCode(event);
+ }
+ return 0;
+ },
+ keyCode: function(event) {
+ // `keyCode` is the result of a KeyDown/Up event and represents the value of
+ // physical keyboard key.
+
+ // The actual meaning of the value depends on the users' keyboard layout
+ // which cannot be detected. Assuming that it is a US keyboard layout
+ // provides a surprisingly accurate mapping for US and European users.
+ // Due to this, it is left to the user to implement at this time.
+ if (event.type === "keydown" || event.type === "keyup") {
+ return event.keyCode;
+ }
+ return 0;
+ },
+ which: function(event) {
+ // `which` is an alias for either `keyCode` or `charCode` depending on the
+ // type of the event.
+ if (event.type === "keypress") {
+ return getEventCharCode(event);
+ }
+ if (event.type === "keydown" || event.type === "keyup") {
+ return event.keyCode;
+ }
+ return 0;
+ }
+ };
+
+ /**
+ * @param {object} dispatchConfig Configuration used to dispatch this event.
+ * @param {string} dispatchMarker Marker identifying the event target.
+ * @param {object} nativeEvent Native browser event.
+ * @extends {SyntheticUIEvent}
+ */
+ function SyntheticKeyboardEvent(
+ dispatchConfig,
+ dispatchMarker,
+ nativeEvent,
+ nativeEventTarget
+ ) {
+ return SyntheticUIEvent.call(
+ this,
+ dispatchConfig,
+ dispatchMarker,
+ nativeEvent,
+ nativeEventTarget
+ );
+ }
+
+ SyntheticUIEvent.augmentClass(
+ SyntheticKeyboardEvent,
+ KeyboardEventInterface
+ );
+
+ /**
+ * @interface DragEvent
+ * @see http://www.w3.org/TR/DOM-Level-3-Events/
+ */
+ var DragEventInterface = {
+ dataTransfer: null
+ };
+
+ /**
+ * @param {object} dispatchConfig Configuration used to dispatch this event.
+ * @param {string} dispatchMarker Marker identifying the event target.
+ * @param {object} nativeEvent Native browser event.
+ * @extends {SyntheticMouseEvent}
+ */
+ function SyntheticDragEvent(
+ dispatchConfig,
+ dispatchMarker,
+ nativeEvent,
+ nativeEventTarget
+ ) {
+ return SyntheticMouseEvent.call(
+ this,
+ dispatchConfig,
+ dispatchMarker,
+ nativeEvent,
+ nativeEventTarget
+ );
+ }
+
+ SyntheticMouseEvent.augmentClass(
+ SyntheticDragEvent,
+ DragEventInterface
+ );
+
+ /**
+ * @interface TouchEvent
+ * @see http://www.w3.org/TR/touch-events/
+ */
+ var TouchEventInterface = {
+ touches: null,
+ targetTouches: null,
+ changedTouches: null,
+ altKey: null,
+ metaKey: null,
+ ctrlKey: null,
+ shiftKey: null,
+ getModifierState: getEventModifierState
+ };
+
+ /**
+ * @param {object} dispatchConfig Configuration used to dispatch this event.
+ * @param {string} dispatchMarker Marker identifying the event target.
+ * @param {object} nativeEvent Native browser event.
+ * @extends {SyntheticUIEvent}
+ */
+ function SyntheticTouchEvent(
+ dispatchConfig,
+ dispatchMarker,
+ nativeEvent,
+ nativeEventTarget
+ ) {
+ return SyntheticUIEvent.call(
+ this,
+ dispatchConfig,
+ dispatchMarker,
+ nativeEvent,
+ nativeEventTarget
+ );
+ }
+
+ SyntheticUIEvent.augmentClass(
+ SyntheticTouchEvent,
+ TouchEventInterface
+ );
+
+ /**
+ * @interface Event
+ * @see http://www.w3.org/TR/2009/WD-css3-transitions-20090320/#transition-events-
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/TransitionEvent
+ */
+ var TransitionEventInterface = {
+ propertyName: null,
+ elapsedTime: null,
+ pseudoElement: null
+ };
+
+ /**
+ * @param {object} dispatchConfig Configuration used to dispatch this event.
+ * @param {string} dispatchMarker Marker identifying the event target.
+ * @param {object} nativeEvent Native browser event.
+ * @extends {SyntheticEvent}
+ */
+ function SyntheticTransitionEvent(
+ dispatchConfig,
+ dispatchMarker,
+ nativeEvent,
+ nativeEventTarget
+ ) {
+ return SyntheticEvent$1.call(
+ this,
+ dispatchConfig,
+ dispatchMarker,
+ nativeEvent,
+ nativeEventTarget
+ );
+ }
+
+ SyntheticEvent$1.augmentClass(
+ SyntheticTransitionEvent,
+ TransitionEventInterface
+ );
+
+ /**
+ * @interface WheelEvent
+ * @see http://www.w3.org/TR/DOM-Level-3-Events/
+ */
+ var WheelEventInterface = {
+ deltaX: function(event) {
+ return "deltaX" in event
+ ? event.deltaX // Fallback to `wheelDeltaX` for Webkit and normalize (right is positive).
+ : "wheelDeltaX" in event ? -event.wheelDeltaX : 0;
+ },
+ deltaY: function(event) {
+ return "deltaY" in event
+ ? event.deltaY // Fallback to `wheelDeltaY` for Webkit and normalize (down is positive).
+ : "wheelDeltaY" in event
+ ? -event.wheelDeltaY // Fallback to `wheelDelta` for IE<9 and normalize (down is positive).
+ : "wheelDelta" in event ? -event.wheelDelta : 0;
+ },
+ deltaZ: null,
+
+ // Browsers without "deltaMode" is reporting in raw wheel delta where one
+ // notch on the scroll is always +/- 120, roughly equivalent to pixels.
+ // A good approximation of DOM_DELTA_LINE (1) is 5% of viewport size or
+ // ~40 pixels, for DOM_DELTA_SCREEN (2) it is 87.5% of viewport size.
+ deltaMode: null
+ };
+
+ /**
+ * @param {object} dispatchConfig Configuration used to dispatch this event.
+ * @param {string} dispatchMarker Marker identifying the event target.
+ * @param {object} nativeEvent Native browser event.
+ * @extends {SyntheticMouseEvent}
+ */
+ function SyntheticWheelEvent(
+ dispatchConfig,
+ dispatchMarker,
+ nativeEvent,
+ nativeEventTarget
+ ) {
+ return SyntheticMouseEvent.call(
+ this,
+ dispatchConfig,
+ dispatchMarker,
+ nativeEvent,
+ nativeEventTarget
+ );
+ }
+
+ SyntheticMouseEvent.augmentClass(
+ SyntheticWheelEvent,
+ WheelEventInterface
+ );
+
+ /**
+ * Turns
+ * ['abort', ...]
+ * into
+ * eventTypes = {
+ * 'abort': {
+ * phasedRegistrationNames: {
+ * bubbled: 'onAbort',
+ * captured: 'onAbortCapture',
+ * },
+ * dependencies: ['topAbort'],
+ * },
+ * ...
+ * };
+ * topLevelEventsToDispatchConfig = {
+ * 'topAbort': { sameConfig }
+ * };
+ */
+ var eventTypes$4 = {};
+ var topLevelEventsToDispatchConfig = {};
+ [
+ "abort",
+ "animationEnd",
+ "animationIteration",
+ "animationStart",
+ "blur",
+ "cancel",
+ "canPlay",
+ "canPlayThrough",
+ "click",
+ "close",
+ "contextMenu",
+ "copy",
+ "cut",
+ "doubleClick",
+ "drag",
+ "dragEnd",
+ "dragEnter",
+ "dragExit",
+ "dragLeave",
+ "dragOver",
+ "dragStart",
+ "drop",
+ "durationChange",
+ "emptied",
+ "encrypted",
+ "ended",
+ "error",
+ "focus",
+ "input",
+ "invalid",
+ "keyDown",
+ "keyPress",
+ "keyUp",
+ "load",
+ "loadedData",
+ "loadedMetadata",
+ "loadStart",
+ "mouseDown",
+ "mouseMove",
+ "mouseOut",
+ "mouseOver",
+ "mouseUp",
+ "paste",
+ "pause",
+ "play",
+ "playing",
+ "progress",
+ "rateChange",
+ "reset",
+ "scroll",
+ "seeked",
+ "seeking",
+ "stalled",
+ "submit",
+ "suspend",
+ "timeUpdate",
+ "toggle",
+ "touchCancel",
+ "touchEnd",
+ "touchMove",
+ "touchStart",
+ "transitionEnd",
+ "volumeChange",
+ "waiting",
+ "wheel"
+ ].forEach(function(event) {
+ var capitalizedEvent = event[0].toUpperCase() + event.slice(1);
+ var onEvent = "on" + capitalizedEvent;
+ var topEvent = "top" + capitalizedEvent;
+
+ var type = {
+ phasedRegistrationNames: {
+ bubbled: onEvent,
+ captured: onEvent + "Capture"
+ },
+ dependencies: [topEvent]
+ };
+ eventTypes$4[event] = type;
+ topLevelEventsToDispatchConfig[topEvent] = type;
+ });
+
+ // Only used in DEV for exhaustiveness validation.
+ var knownHTMLTopLevelTypes = [
+ "topAbort",
+ "topCancel",
+ "topCanPlay",
+ "topCanPlayThrough",
+ "topClose",
+ "topDurationChange",
+ "topEmptied",
+ "topEncrypted",
+ "topEnded",
+ "topError",
+ "topInput",
+ "topInvalid",
+ "topLoad",
+ "topLoadedData",
+ "topLoadedMetadata",
+ "topLoadStart",
+ "topPause",
+ "topPlay",
+ "topPlaying",
+ "topProgress",
+ "topRateChange",
+ "topReset",
+ "topSeeked",
+ "topSeeking",
+ "topStalled",
+ "topSubmit",
+ "topSuspend",
+ "topTimeUpdate",
+ "topToggle",
+ "topVolumeChange",
+ "topWaiting"
+ ];
+
+ var SimpleEventPlugin = {
+ eventTypes: eventTypes$4,
+
+ extractEvents: function(
+ topLevelType,
+ targetInst,
+ nativeEvent,
+ nativeEventTarget
+ ) {
+ var dispatchConfig =
+ topLevelEventsToDispatchConfig[topLevelType];
+ if (!dispatchConfig) {
+ return null;
+ }
+ var EventConstructor;
+ switch (topLevelType) {
+ case "topKeyPress":
+ // Firefox creates a keypress event for function keys too. This removes
+ // the unwanted keypress events. Enter is however both printable and
+ // non-printable. One would expect Tab to be as well (but it isn't).
+ if (getEventCharCode(nativeEvent) === 0) {
+ return null;
+ }
+ /* falls through */
+ case "topKeyDown":
+ case "topKeyUp":
+ EventConstructor = SyntheticKeyboardEvent;
+ break;
+ case "topBlur":
+ case "topFocus":
+ EventConstructor = SyntheticFocusEvent;
+ break;
+ case "topClick":
+ // Firefox creates a click event on right mouse clicks. This removes the
+ // unwanted click events.
+ if (nativeEvent.button === 2) {
+ return null;
+ }
+ /* falls through */
+ case "topDoubleClick":
+ case "topMouseDown":
+ case "topMouseMove":
+ case "topMouseUp":
+ // TODO: Disabled elements should not respond to mouse events
+ /* falls through */
+ case "topMouseOut":
+ case "topMouseOver":
+ case "topContextMenu":
+ EventConstructor = SyntheticMouseEvent;
+ break;
+ case "topDrag":
+ case "topDragEnd":
+ case "topDragEnter":
+ case "topDragExit":
+ case "topDragLeave":
+ case "topDragOver":
+ case "topDragStart":
+ case "topDrop":
+ EventConstructor = SyntheticDragEvent;
+ break;
+ case "topTouchCancel":
+ case "topTouchEnd":
+ case "topTouchMove":
+ case "topTouchStart":
+ EventConstructor = SyntheticTouchEvent;
+ break;
+ case "topAnimationEnd":
+ case "topAnimationIteration":
+ case "topAnimationStart":
+ EventConstructor = SyntheticAnimationEvent;
+ break;
+ case "topTransitionEnd":
+ EventConstructor = SyntheticTransitionEvent;
+ break;
+ case "topScroll":
+ EventConstructor = SyntheticUIEvent;
+ break;
+ case "topWheel":
+ EventConstructor = SyntheticWheelEvent;
+ break;
+ case "topCopy":
+ case "topCut":
+ case "topPaste":
+ EventConstructor = SyntheticClipboardEvent;
+ break;
+ default:
+ {
+ if (knownHTMLTopLevelTypes.indexOf(topLevelType) === -1) {
+ warning(
+ false,
+ "SimpleEventPlugin: Unhandled event type, `%s`. This warning " +
+ "is likely caused by a bug in React. Please file an issue.",
+ topLevelType
+ );
+ }
+ }
+ // HTML Events
+ // @see http://www.w3.org/TR/html5/index.html#events-0
+ EventConstructor = SyntheticEvent$1;
+ break;
+ }
+ var event = EventConstructor.getPooled(
+ dispatchConfig,
+ targetInst,
+ nativeEvent,
+ nativeEventTarget
+ );
+ accumulateTwoPhaseDispatches(event);
+ return event;
+ }
+ };
+
+ setHandleTopLevel(handleTopLevel);
+
+ /**
+ * Inject modules for resolving DOM hierarchy and plugin ordering.
+ */
+ injection$1.injectEventPluginOrder(DOMEventPluginOrder);
+ injection$2.injectComponentTree(ReactDOMComponentTree);
+
+ /**
+ * Some important event plugins included by default (without having to require
+ * them).
+ */
+ injection$1.injectEventPluginsByName({
+ SimpleEventPlugin: SimpleEventPlugin,
+ EnterLeaveEventPlugin: EnterLeaveEventPlugin,
+ ChangeEventPlugin: ChangeEventPlugin,
+ SelectEventPlugin: SelectEventPlugin,
+ BeforeInputEventPlugin: BeforeInputEventPlugin
+ });
+
+ var enableAsyncSubtreeAPI = true;
+ var enableAsyncSchedulingByDefaultInReactDOM = false;
+ // Exports ReactDOM.createRoot
+ var enableCreateRoot = false;
+ var enableUserTimingAPI = true;
+
+ // Mutating mode (React DOM, React ART, React Native):
+ var enableMutatingReconciler = true;
+ // Experimental noop mode (currently unused):
+ var enableNoopReconciler = false;
+ // Experimental persistent mode (CS):
+ var enablePersistentReconciler = false;
+
+ // Helps identify side effects in begin-phase lifecycle hooks and setState reducers:
+ var debugRenderPhaseSideEffects = false;
+
+ // Only used in www builds.
+
+ var valueStack = [];
+
+ {
+ var fiberStack = [];
+ }
+
+ var index = -1;
+
+ function createCursor(defaultValue) {
+ return {
+ current: defaultValue
+ };
+ }
+
+ function pop(cursor, fiber) {
+ if (index < 0) {
+ {
+ warning(false, "Unexpected pop.");
+ }
+ return;
+ }
+
+ {
+ if (fiber !== fiberStack[index]) {
+ warning(false, "Unexpected Fiber popped.");
+ }
+ }
+
+ cursor.current = valueStack[index];
+
+ valueStack[index] = null;
+
+ {
+ fiberStack[index] = null;
+ }
+
+ index--;
+ }
+
+ function push(cursor, value, fiber) {
+ index++;
+
+ valueStack[index] = cursor.current;
+
+ {
+ fiberStack[index] = fiber;
+ }
+
+ cursor.current = value;
+ }
+
+ function reset$1() {
+ while (index > -1) {
+ valueStack[index] = null;
+
+ {
+ fiberStack[index] = null;
+ }
+
+ index--;
+ }
+ }
+
+ var describeComponentFrame = function(name, source, ownerName) {
+ return (
+ "\n in " +
+ (name || "Unknown") +
+ (source
+ ? " (at " +
+ source.fileName.replace(/^.*[\\\/]/, "") +
+ ":" +
+ source.lineNumber +
+ ")"
+ : ownerName ? " (created by " + ownerName + ")" : "")
+ );
+ };
+
+ function describeFiber(fiber) {
+ switch (fiber.tag) {
+ case IndeterminateComponent:
+ case FunctionalComponent:
+ case ClassComponent:
+ case HostComponent:
+ var owner = fiber._debugOwner;
+ var source = fiber._debugSource;
+ var name = getComponentName(fiber);
+ var ownerName = null;
+ if (owner) {
+ ownerName = getComponentName(owner);
+ }
+ return describeComponentFrame(name, source, ownerName);
+ default:
+ return "";
+ }
+ }
+
+ // This function can only be called with a work-in-progress fiber and
+ // only during begin or complete phase. Do not call it under any other
+ // circumstances.
+ function getStackAddendumByWorkInProgressFiber(workInProgress) {
+ var info = "";
+ var node = workInProgress;
+ do {
+ info += describeFiber(node);
+ // Otherwise this return pointer might point to the wrong tree:
+ node = node["return"];
+ } while (node);
+ return info;
+ }
+
+ function getCurrentFiberOwnerName() {
+ {
+ var fiber = ReactDebugCurrentFiber.current;
+ if (fiber === null) {
+ return null;
+ }
+ var owner = fiber._debugOwner;
+ if (owner !== null && typeof owner !== "undefined") {
+ return getComponentName(owner);
+ }
+ }
+ return null;
+ }
+
+ function getCurrentFiberStackAddendum() {
+ {
+ var fiber = ReactDebugCurrentFiber.current;
+ if (fiber === null) {
+ return null;
+ }
+ // Safe because if current fiber exists, we are reconciling,
+ // and it is guaranteed to be the work-in-progress version.
+ return getStackAddendumByWorkInProgressFiber(fiber);
+ }
+ return null;
+ }
+
+ function resetCurrentFiber() {
+ ReactDebugCurrentFrame.getCurrentStack = null;
+ ReactDebugCurrentFiber.current = null;
+ ReactDebugCurrentFiber.phase = null;
+ }
+
+ function setCurrentFiber(fiber) {
+ ReactDebugCurrentFrame.getCurrentStack = getCurrentFiberStackAddendum;
+ ReactDebugCurrentFiber.current = fiber;
+ ReactDebugCurrentFiber.phase = null;
+ }
+
+ function setCurrentPhase(phase) {
+ ReactDebugCurrentFiber.phase = phase;
+ }
+
+ var ReactDebugCurrentFiber = {
+ current: null,
+ phase: null,
+ resetCurrentFiber: resetCurrentFiber,
+ setCurrentFiber: setCurrentFiber,
+ setCurrentPhase: setCurrentPhase,
+ getCurrentFiberOwnerName: getCurrentFiberOwnerName,
+ getCurrentFiberStackAddendum: getCurrentFiberStackAddendum
+ };
+
+ // Prefix measurements so that it's possible to filter them.
+ // Longer prefixes are hard to read in DevTools.
+ var reactEmoji = "\u269B";
+ var warningEmoji = "\u26D4";
+ var supportsUserTiming =
+ typeof performance !== "undefined" &&
+ typeof performance.mark === "function" &&
+ typeof performance.clearMarks === "function" &&
+ typeof performance.measure === "function" &&
+ typeof performance.clearMeasures === "function";
+
+ // Keep track of current fiber so that we know the path to unwind on pause.
+ // TODO: this looks the same as nextUnitOfWork in scheduler. Can we unify them?
+ var currentFiber = null;
+ // If we're in the middle of user code, which fiber and method is it?
+ // Reusing `currentFiber` would be confusing for this because user code fiber
+ // can change during commit phase too, but we don't need to unwind it (since
+ // lifecycles in the commit phase don't resemble a tree).
+ var currentPhase = null;
+ var currentPhaseFiber = null;
+ // Did lifecycle hook schedule an update? This is often a performance problem,
+ // so we will keep track of it, and include it in the report.
+ // Track commits caused by cascading updates.
+ var isCommitting = false;
+ var hasScheduledUpdateInCurrentCommit = false;
+ var hasScheduledUpdateInCurrentPhase = false;
+ var commitCountInCurrentWorkLoop = 0;
+ var effectCountInCurrentCommit = 0;
+ var isWaitingForCallback = false;
+ // During commits, we only show a measurement once per method name
+ // to avoid stretch the commit phase with measurement overhead.
+ var labelsInCurrentCommit = new Set();
+
+ var formatMarkName = function(markName) {
+ return reactEmoji + " " + markName;
+ };
+
+ var formatLabel = function(label, warning$$1) {
+ var prefix = warning$$1 ? warningEmoji + " " : reactEmoji + " ";
+ var suffix = warning$$1 ? " Warning: " + warning$$1 : "";
+ return "" + prefix + label + suffix;
+ };
+
+ var beginMark = function(markName) {
+ performance.mark(formatMarkName(markName));
+ };
+
+ var clearMark = function(markName) {
+ performance.clearMarks(formatMarkName(markName));
+ };
+
+ var endMark = function(label, markName, warning$$1) {
+ var formattedMarkName = formatMarkName(markName);
+ var formattedLabel = formatLabel(label, warning$$1);
+ try {
+ performance.measure(formattedLabel, formattedMarkName);
+ } catch (err) {}
+ // If previous mark was missing for some reason, this will throw.
+ // This could only happen if React crashed in an unexpected place earlier.
+ // Don't pile on with more errors.
+
+ // Clear marks immediately to avoid growing buffer.
+ performance.clearMarks(formattedMarkName);
+ performance.clearMeasures(formattedLabel);
+ };
+
+ var getFiberMarkName = function(label, debugID) {
+ return label + " (#" + debugID + ")";
+ };
+
+ var getFiberLabel = function(componentName, isMounted, phase) {
+ if (phase === null) {
+ // These are composite component total time measurements.
+ return (
+ componentName + " [" + (isMounted ? "update" : "mount") + "]"
+ );
+ } else {
+ // Composite component methods.
+ return componentName + "." + phase;
+ }
+ };
+
+ var beginFiberMark = function(fiber, phase) {
+ var componentName = getComponentName(fiber) || "Unknown";
+ var debugID = fiber._debugID;
+ var isMounted = fiber.alternate !== null;
+ var label = getFiberLabel(componentName, isMounted, phase);
+
+ if (isCommitting && labelsInCurrentCommit.has(label)) {
+ // During the commit phase, we don't show duplicate labels because
+ // there is a fixed overhead for every measurement, and we don't
+ // want to stretch the commit phase beyond necessary.
+ return false;
+ }
+ labelsInCurrentCommit.add(label);
+
+ var markName = getFiberMarkName(label, debugID);
+ beginMark(markName);
+ return true;
+ };
+
+ var clearFiberMark = function(fiber, phase) {
+ var componentName = getComponentName(fiber) || "Unknown";
+ var debugID = fiber._debugID;
+ var isMounted = fiber.alternate !== null;
+ var label = getFiberLabel(componentName, isMounted, phase);
+ var markName = getFiberMarkName(label, debugID);
+ clearMark(markName);
+ };
+
+ var endFiberMark = function(fiber, phase, warning$$1) {
+ var componentName = getComponentName(fiber) || "Unknown";
+ var debugID = fiber._debugID;
+ var isMounted = fiber.alternate !== null;
+ var label = getFiberLabel(componentName, isMounted, phase);
+ var markName = getFiberMarkName(label, debugID);
+ endMark(label, markName, warning$$1);
+ };
+
+ var shouldIgnoreFiber = function(fiber) {
+ // Host components should be skipped in the timeline.
+ // We could check typeof fiber.type, but does this work with RN?
+ switch (fiber.tag) {
+ case HostRoot:
+ case HostComponent:
+ case HostText:
+ case HostPortal:
+ case ReturnComponent:
+ case Fragment:
+ return true;
+ default:
+ return false;
+ }
+ };
+
+ var clearPendingPhaseMeasurement = function() {
+ if (currentPhase !== null && currentPhaseFiber !== null) {
+ clearFiberMark(currentPhaseFiber, currentPhase);
+ }
+ currentPhaseFiber = null;
+ currentPhase = null;
+ hasScheduledUpdateInCurrentPhase = false;
+ };
+
+ var pauseTimers = function() {
+ // Stops all currently active measurements so that they can be resumed
+ // if we continue in a later deferred loop from the same unit of work.
+ var fiber = currentFiber;
+ while (fiber) {
+ if (fiber._debugIsCurrentlyTiming) {
+ endFiberMark(fiber, null, null);
+ }
+ fiber = fiber["return"];
+ }
+ };
+
+ var resumeTimersRecursively = function(fiber) {
+ if (fiber["return"] !== null) {
+ resumeTimersRecursively(fiber["return"]);
+ }
+ if (fiber._debugIsCurrentlyTiming) {
+ beginFiberMark(fiber, null);
+ }
+ };
+
+ var resumeTimers = function() {
+ // Resumes all measurements that were active during the last deferred loop.
+ if (currentFiber !== null) {
+ resumeTimersRecursively(currentFiber);
+ }
+ };
+
+ function recordEffect() {
+ if (enableUserTimingAPI) {
+ effectCountInCurrentCommit++;
+ }
+ }
+
+ function recordScheduleUpdate() {
+ if (enableUserTimingAPI) {
+ if (isCommitting) {
+ hasScheduledUpdateInCurrentCommit = true;
+ }
+ if (
+ currentPhase !== null &&
+ currentPhase !== "componentWillMount" &&
+ currentPhase !== "componentWillReceiveProps"
+ ) {
+ hasScheduledUpdateInCurrentPhase = true;
+ }
+ }
+ }
+
+ function startRequestCallbackTimer() {
+ if (enableUserTimingAPI) {
+ if (supportsUserTiming && !isWaitingForCallback) {
+ isWaitingForCallback = true;
+ beginMark("(Waiting for async callback...)");
+ }
+ }
+ }
+
+ function stopRequestCallbackTimer(didExpire) {
+ if (enableUserTimingAPI) {
+ if (supportsUserTiming) {
+ isWaitingForCallback = false;
+ var warning$$1 = didExpire
+ ? "React was blocked by main thread"
+ : null;
+ endMark(
+ "(Waiting for async callback...)",
+ "(Waiting for async callback...)",
+ warning$$1
+ );
+ }
+ }
+ }
+
+ function startWorkTimer(fiber) {
+ if (enableUserTimingAPI) {
+ if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {
+ return;
+ }
+ // If we pause, this is the fiber to unwind from.
+ currentFiber = fiber;
+ if (!beginFiberMark(fiber, null)) {
+ return;
+ }
+ fiber._debugIsCurrentlyTiming = true;
+ }
+ }
+
+ function cancelWorkTimer(fiber) {
+ if (enableUserTimingAPI) {
+ if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {
+ return;
+ }
+ // Remember we shouldn't complete measurement for this fiber.
+ // Otherwise flamechart will be deep even for small updates.
+ fiber._debugIsCurrentlyTiming = false;
+ clearFiberMark(fiber, null);
+ }
+ }
+
+ function stopWorkTimer(fiber) {
+ if (enableUserTimingAPI) {
+ if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {
+ return;
+ }
+ // If we pause, its parent is the fiber to unwind from.
+ currentFiber = fiber["return"];
+ if (!fiber._debugIsCurrentlyTiming) {
+ return;
+ }
+ fiber._debugIsCurrentlyTiming = false;
+ endFiberMark(fiber, null, null);
+ }
+ }
+
+ function stopFailedWorkTimer(fiber) {
+ if (enableUserTimingAPI) {
+ if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {
+ return;
+ }
+ // If we pause, its parent is the fiber to unwind from.
+ currentFiber = fiber["return"];
+ if (!fiber._debugIsCurrentlyTiming) {
+ return;
+ }
+ fiber._debugIsCurrentlyTiming = false;
+ var warning$$1 =
+ "An error was thrown inside this error boundary";
+ endFiberMark(fiber, null, warning$$1);
+ }
+ }
+
+ function startPhaseTimer(fiber, phase) {
+ if (enableUserTimingAPI) {
+ if (!supportsUserTiming) {
+ return;
+ }
+ clearPendingPhaseMeasurement();
+ if (!beginFiberMark(fiber, phase)) {
+ return;
+ }
+ currentPhaseFiber = fiber;
+ currentPhase = phase;
+ }
+ }
+
+ function stopPhaseTimer() {
+ if (enableUserTimingAPI) {
+ if (!supportsUserTiming) {
+ return;
+ }
+ if (currentPhase !== null && currentPhaseFiber !== null) {
+ var warning$$1 = hasScheduledUpdateInCurrentPhase
+ ? "Scheduled a cascading update"
+ : null;
+ endFiberMark(currentPhaseFiber, currentPhase, warning$$1);
+ }
+ currentPhase = null;
+ currentPhaseFiber = null;
+ }
+ }
+
+ function startWorkLoopTimer(nextUnitOfWork) {
+ if (enableUserTimingAPI) {
+ currentFiber = nextUnitOfWork;
+ if (!supportsUserTiming) {
+ return;
+ }
+ commitCountInCurrentWorkLoop = 0;
+ // This is top level call.
+ // Any other measurements are performed within.
+ beginMark("(React Tree Reconciliation)");
+ // Resume any measurements that were in progress during the last loop.
+ resumeTimers();
+ }
+ }
+
+ function stopWorkLoopTimer(interruptedBy) {
+ if (enableUserTimingAPI) {
+ if (!supportsUserTiming) {
+ return;
+ }
+ var warning$$1 = null;
+ if (interruptedBy !== null) {
+ if (interruptedBy.tag === HostRoot) {
+ warning$$1 =
+ "A top-level update interrupted the previous render";
+ } else {
+ var componentName =
+ getComponentName(interruptedBy) || "Unknown";
+ warning$$1 =
+ "An update to " +
+ componentName +
+ " interrupted the previous render";
+ }
+ } else if (commitCountInCurrentWorkLoop > 1) {
+ warning$$1 = "There were cascading updates";
+ }
+ commitCountInCurrentWorkLoop = 0;
+ // Pause any measurements until the next loop.
+ pauseTimers();
+ endMark(
+ "(React Tree Reconciliation)",
+ "(React Tree Reconciliation)",
+ warning$$1
+ );
+ }
+ }
+
+ function startCommitTimer() {
+ if (enableUserTimingAPI) {
+ if (!supportsUserTiming) {
+ return;
+ }
+ isCommitting = true;
+ hasScheduledUpdateInCurrentCommit = false;
+ labelsInCurrentCommit.clear();
+ beginMark("(Committing Changes)");
+ }
+ }
+
+ function stopCommitTimer() {
+ if (enableUserTimingAPI) {
+ if (!supportsUserTiming) {
+ return;
+ }
+
+ var warning$$1 = null;
+ if (hasScheduledUpdateInCurrentCommit) {
+ warning$$1 = "Lifecycle hook scheduled a cascading update";
+ } else if (commitCountInCurrentWorkLoop > 0) {
+ warning$$1 = "Caused by a cascading update in earlier commit";
+ }
+ hasScheduledUpdateInCurrentCommit = false;
+ commitCountInCurrentWorkLoop++;
+ isCommitting = false;
+ labelsInCurrentCommit.clear();
+
+ endMark(
+ "(Committing Changes)",
+ "(Committing Changes)",
+ warning$$1
+ );
+ }
+ }
+
+ function startCommitHostEffectsTimer() {
+ if (enableUserTimingAPI) {
+ if (!supportsUserTiming) {
+ return;
+ }
+ effectCountInCurrentCommit = 0;
+ beginMark("(Committing Host Effects)");
+ }
+ }
+
+ function stopCommitHostEffectsTimer() {
+ if (enableUserTimingAPI) {
+ if (!supportsUserTiming) {
+ return;
+ }
+ var count = effectCountInCurrentCommit;
+ effectCountInCurrentCommit = 0;
+ endMark(
+ "(Committing Host Effects: " + count + " Total)",
+ "(Committing Host Effects)",
+ null
+ );
+ }
+ }
+
+ function startCommitLifeCyclesTimer() {
+ if (enableUserTimingAPI) {
+ if (!supportsUserTiming) {
+ return;
+ }
+ effectCountInCurrentCommit = 0;
+ beginMark("(Calling Lifecycle Methods)");
+ }
+ }
+
+ function stopCommitLifeCyclesTimer() {
+ if (enableUserTimingAPI) {
+ if (!supportsUserTiming) {
+ return;
+ }
+ var count = effectCountInCurrentCommit;
+ effectCountInCurrentCommit = 0;
+ endMark(
+ "(Calling Lifecycle Methods: " + count + " Total)",
+ "(Calling Lifecycle Methods)",
+ null
+ );
+ }
+ }
+
+ {
+ var warnedAboutMissingGetChildContext = {};
+ }
+
+ // A cursor to the current merged context object on the stack.
+ var contextStackCursor = createCursor(emptyObject);
+ // A cursor to a boolean indicating whether the context has changed.
+ var didPerformWorkStackCursor = createCursor(false);
+ // Keep track of the previous context object that was on the stack.
+ // We use this to get access to the parent context after we have already
+ // pushed the next context provider, and now need to merge their contexts.
+ var previousContext = emptyObject;
+
+ function getUnmaskedContext(workInProgress) {
+ var hasOwnContext = isContextProvider(workInProgress);
+ if (hasOwnContext) {
+ // If the fiber is a context provider itself, when we read its context
+ // we have already pushed its own child context on the stack. A context
+ // provider should not "see" its own child context. Therefore we read the
+ // previous (parent) context instead for a context provider.
+ return previousContext;
+ }
+ return contextStackCursor.current;
+ }
+
+ function cacheContext(
+ workInProgress,
+ unmaskedContext,
+ maskedContext
+ ) {
+ var instance = workInProgress.stateNode;
+ instance.__reactInternalMemoizedUnmaskedChildContext = unmaskedContext;
+ instance.__reactInternalMemoizedMaskedChildContext = maskedContext;
+ }
+
+ function getMaskedContext(workInProgress, unmaskedContext) {
+ var type = workInProgress.type;
+ var contextTypes = type.contextTypes;
+ if (!contextTypes) {
+ return emptyObject;
+ }
+
+ // Avoid recreating masked context unless unmasked context has changed.
+ // Failing to do this will result in unnecessary calls to componentWillReceiveProps.
+ // This may trigger infinite loops if componentWillReceiveProps calls setState.
+ var instance = workInProgress.stateNode;
+ if (
+ instance &&
+ instance.__reactInternalMemoizedUnmaskedChildContext ===
+ unmaskedContext
+ ) {
+ return instance.__reactInternalMemoizedMaskedChildContext;
+ }
+
+ var context = {};
+ for (var key in contextTypes) {
+ context[key] = unmaskedContext[key];
+ }
+
+ {
+ var name = getComponentName(workInProgress) || "Unknown";
+ checkPropTypes(
+ contextTypes,
+ context,
+ "context",
+ name,
+ ReactDebugCurrentFiber.getCurrentFiberStackAddendum
+ );
+ }
+
+ // Cache unmasked context so we can avoid recreating masked context unless necessary.
+ // Context is created before the class component is instantiated so check for instance.
+ if (instance) {
+ cacheContext(workInProgress, unmaskedContext, context);
+ }
+
+ return context;
+ }
+
+ function hasContextChanged() {
+ return didPerformWorkStackCursor.current;
+ }
+
+ function isContextConsumer(fiber) {
+ return (
+ fiber.tag === ClassComponent && fiber.type.contextTypes != null
+ );
+ }
+
+ function isContextProvider(fiber) {
+ return (
+ fiber.tag === ClassComponent &&
+ fiber.type.childContextTypes != null
+ );
+ }
+
+ function popContextProvider(fiber) {
+ if (!isContextProvider(fiber)) {
+ return;
+ }
+
+ pop(didPerformWorkStackCursor, fiber);
+ pop(contextStackCursor, fiber);
+ }
+
+ function popTopLevelContextObject(fiber) {
+ pop(didPerformWorkStackCursor, fiber);
+ pop(contextStackCursor, fiber);
+ }
+
+ function pushTopLevelContextObject(fiber, context, didChange) {
+ !(contextStackCursor.cursor == null)
+ ? invariant(
+ false,
+ "Unexpected context found on stack. This error is likely caused by a bug in React. Please file an issue."
+ )
+ : void 0;
+
+ push(contextStackCursor, context, fiber);
+ push(didPerformWorkStackCursor, didChange, fiber);
+ }
+
+ function processChildContext(fiber, parentContext) {
+ var instance = fiber.stateNode;
+ var childContextTypes = fiber.type.childContextTypes;
+
+ // TODO (bvaughn) Replace this behavior with an invariant() in the future.
+ // It has only been added in Fiber to match the (unintentional) behavior in Stack.
+ if (typeof instance.getChildContext !== "function") {
+ {
+ var componentName = getComponentName(fiber) || "Unknown";
+
+ if (!warnedAboutMissingGetChildContext[componentName]) {
+ warnedAboutMissingGetChildContext[componentName] = true;
+ warning(
+ false,
+ "%s.childContextTypes is specified but there is no getChildContext() method " +
+ "on the instance. You can either define getChildContext() on %s or remove " +
+ "childContextTypes from it.",
+ componentName,
+ componentName
+ );
+ }
+ }
+ return parentContext;
+ }
+
+ var childContext = void 0;
+ {
+ ReactDebugCurrentFiber.setCurrentPhase("getChildContext");
+ }
+ startPhaseTimer(fiber, "getChildContext");
+ childContext = instance.getChildContext();
+ stopPhaseTimer();
+ {
+ ReactDebugCurrentFiber.setCurrentPhase(null);
+ }
+ for (var contextKey in childContext) {
+ !(contextKey in childContextTypes)
+ ? invariant(
+ false,
+ '%s.getChildContext(): key "%s" is not defined in childContextTypes.',
+ getComponentName(fiber) || "Unknown",
+ contextKey
+ )
+ : void 0;
+ }
+ {
+ var name = getComponentName(fiber) || "Unknown";
+ checkPropTypes(
+ childContextTypes,
+ childContext,
+ "child context",
+ name,
+ // In practice, there is one case in which we won't get a stack. It's when
+ // somebody calls unstable_renderSubtreeIntoContainer() and we process
+ // context from the parent component instance. The stack will be missing
+ // because it's outside of the reconciliation, and so the pointer has not
+ // been set. This is rare and doesn't matter. We'll also remove that API.
+ ReactDebugCurrentFiber.getCurrentFiberStackAddendum
+ );
+ }
+
+ return _assign({}, parentContext, childContext);
+ }
+
+ function pushContextProvider(workInProgress) {
+ if (!isContextProvider(workInProgress)) {
+ return false;
+ }
+
+ var instance = workInProgress.stateNode;
+ // We push the context as early as possible to ensure stack integrity.
+ // If the instance does not exist yet, we will push null at first,
+ // and replace it on the stack later when invalidating the context.
+ var memoizedMergedChildContext =
+ (instance &&
+ instance.__reactInternalMemoizedMergedChildContext) ||
+ emptyObject;
+
+ // Remember the parent context so we can merge with it later.
+ // Inherit the parent's did-perform-work value to avoid inadvertently blocking updates.
+ previousContext = contextStackCursor.current;
+ push(
+ contextStackCursor,
+ memoizedMergedChildContext,
+ workInProgress
+ );
+ push(
+ didPerformWorkStackCursor,
+ didPerformWorkStackCursor.current,
+ workInProgress
+ );
+
+ return true;
+ }
+
+ function invalidateContextProvider(workInProgress, didChange) {
+ var instance = workInProgress.stateNode;
+ !instance
+ ? invariant(
+ false,
+ "Expected to have an instance by this point. This error is likely caused by a bug in React. Please file an issue."
+ )
+ : void 0;
+
+ if (didChange) {
+ // Merge parent and own context.
+ // Skip this if we're not updating due to sCU.
+ // This avoids unnecessarily recomputing memoized values.
+ var mergedContext = processChildContext(
+ workInProgress,
+ previousContext
+ );
+ instance.__reactInternalMemoizedMergedChildContext = mergedContext;
+
+ // Replace the old (or empty) context with the new one.
+ // It is important to unwind the context in the reverse order.
+ pop(didPerformWorkStackCursor, workInProgress);
+ pop(contextStackCursor, workInProgress);
+ // Now push the new context and mark that it has changed.
+ push(contextStackCursor, mergedContext, workInProgress);
+ push(didPerformWorkStackCursor, didChange, workInProgress);
+ } else {
+ pop(didPerformWorkStackCursor, workInProgress);
+ push(didPerformWorkStackCursor, didChange, workInProgress);
+ }
+ }
+
+ function resetContext() {
+ previousContext = emptyObject;
+ contextStackCursor.current = emptyObject;
+ didPerformWorkStackCursor.current = false;
+ }
+
+ function findCurrentUnmaskedContext(fiber) {
+ // Currently this is only used with renderSubtreeIntoContainer; not sure if it
+ // makes sense elsewhere
+ !(isFiberMounted(fiber) && fiber.tag === ClassComponent)
+ ? invariant(
+ false,
+ "Expected subtree parent to be a mounted class component. This error is likely caused by a bug in React. Please file an issue."
+ )
+ : void 0;
+
+ var node = fiber;
+ while (node.tag !== HostRoot) {
+ if (isContextProvider(node)) {
+ return node.stateNode
+ .__reactInternalMemoizedMergedChildContext;
+ }
+ var parent = node["return"];
+ !parent
+ ? invariant(
+ false,
+ "Found unexpected detached subtree parent. This error is likely caused by a bug in React. Please file an issue."
+ )
+ : void 0;
+ node = parent;
+ }
+ return node.stateNode.context;
+ }
+
+ var NoWork = 0; // TODO: Use an opaque type once ESLint et al support the syntax
+
+ var Sync = 1;
+ var Never = 2147483647; // Max int32: Math.pow(2, 31) - 1
+
+ var UNIT_SIZE = 10;
+ var MAGIC_NUMBER_OFFSET = 2;
+
+ // 1 unit of expiration time represents 10ms.
+ function msToExpirationTime(ms) {
+ // Always add an offset so that we don't clash with the magic number for NoWork.
+ return ((ms / UNIT_SIZE) | 0) + MAGIC_NUMBER_OFFSET;
+ }
+
+ function expirationTimeToMs(expirationTime) {
+ return (expirationTime - MAGIC_NUMBER_OFFSET) * UNIT_SIZE;
+ }
+
+ function ceiling(num, precision) {
+ return (((num / precision) | 0) + 1) * precision;
+ }
+
+ function computeExpirationBucket(
+ currentTime,
+ expirationInMs,
+ bucketSizeMs
+ ) {
+ return ceiling(
+ currentTime + expirationInMs / UNIT_SIZE,
+ bucketSizeMs / UNIT_SIZE
+ );
+ }
+
+ var NoContext = 0;
+ var AsyncUpdates = 1;
+
+ {
+ var hasBadMapPolyfill = false;
+ try {
+ var nonExtensibleObject = Object.preventExtensions({});
+ /* eslint-disable no-new */
+
+ /* eslint-enable no-new */
+ } catch (e) {
+ // TODO: Consider warning about bad polyfills
+ hasBadMapPolyfill = true;
+ }
+ }
+
+ // A Fiber is work on a Component that needs to be done or was done. There can
+ // be more than one per component.
+
+ {
+ var debugCounter = 1;
+ }
+
+ function FiberNode(tag, key, internalContextTag) {
+ // Instance
+ this.tag = tag;
+ this.key = key;
+ this.type = null;
+ this.stateNode = null;
+
+ // Fiber
+ this["return"] = null;
+ this.child = null;
+ this.sibling = null;
+ this.index = 0;
+
+ this.ref = null;
+
+ this.pendingProps = null;
+ this.memoizedProps = null;
+ this.updateQueue = null;
+ this.memoizedState = null;
+
+ this.internalContextTag = internalContextTag;
+
+ // Effects
+ this.effectTag = NoEffect;
+ this.nextEffect = null;
+
+ this.firstEffect = null;
+ this.lastEffect = null;
+
+ this.expirationTime = NoWork;
+
+ this.alternate = null;
+
+ {
+ this._debugID = debugCounter++;
+ this._debugSource = null;
+ this._debugOwner = null;
+ this._debugIsCurrentlyTiming = false;
+ if (
+ !hasBadMapPolyfill &&
+ typeof Object.preventExtensions === "function"
+ ) {
+ Object.preventExtensions(this);
+ }
+ }
+ }
+
+ // This is a constructor function, rather than a POJO constructor, still
+ // please ensure we do the following:
+ // 1) Nobody should add any instance methods on this. Instance methods can be
+ // more difficult to predict when they get optimized and they are almost
+ // never inlined properly in static compilers.
+ // 2) Nobody should rely on `instanceof Fiber` for type testing. We should
+ // always know when it is a fiber.
+ // 3) We might want to experiment with using numeric keys since they are easier
+ // to optimize in a non-JIT environment.
+ // 4) We can easily go from a constructor to a createFiber object literal if that
+ // is faster.
+ // 5) It should be easy to port this to a C struct and keep a C implementation
+ // compatible.
+ var createFiber = function(tag, key, internalContextTag) {
+ // $FlowFixMe: the shapes are exact here but Flow doesn't like constructors
+ return new FiberNode(tag, key, internalContextTag);
+ };
+
+ function shouldConstruct(Component) {
+ return !!(
+ Component.prototype && Component.prototype.isReactComponent
+ );
+ }
+
+ // This is used to create an alternate fiber to do work on.
+ function createWorkInProgress(
+ current,
+ pendingProps,
+ expirationTime
+ ) {
+ var workInProgress = current.alternate;
+ if (workInProgress === null) {
+ // We use a double buffering pooling technique because we know that we'll
+ // only ever need at most two versions of a tree. We pool the "other" unused
+ // node that we're free to reuse. This is lazily created to avoid allocating
+ // extra objects for things that are never updated. It also allow us to
+ // reclaim the extra memory if needed.
+ workInProgress = createFiber(
+ current.tag,
+ current.key,
+ current.internalContextTag
+ );
+ workInProgress.type = current.type;
+ workInProgress.stateNode = current.stateNode;
+
+ {
+ // DEV-only fields
+ workInProgress._debugID = current._debugID;
+ workInProgress._debugSource = current._debugSource;
+ workInProgress._debugOwner = current._debugOwner;
+ }
+
+ workInProgress.alternate = current;
+ current.alternate = workInProgress;
+ } else {
+ // We already have an alternate.
+ // Reset the effect tag.
+ workInProgress.effectTag = NoEffect;
+
+ // The effect list is no longer valid.
+ workInProgress.nextEffect = null;
+ workInProgress.firstEffect = null;
+ workInProgress.lastEffect = null;
+ }
+
+ workInProgress.expirationTime = expirationTime;
+ workInProgress.pendingProps = pendingProps;
+
+ workInProgress.child = current.child;
+ workInProgress.memoizedProps = current.memoizedProps;
+ workInProgress.memoizedState = current.memoizedState;
+ workInProgress.updateQueue = current.updateQueue;
+
+ // These will be overridden during the parent's reconciliation
+ workInProgress.sibling = current.sibling;
+ workInProgress.index = current.index;
+ workInProgress.ref = current.ref;
+
+ return workInProgress;
+ }
+
+ function createHostRootFiber() {
+ var fiber = createFiber(HostRoot, null, NoContext);
+ return fiber;
+ }
+
+ function createFiberFromElement(
+ element,
+ internalContextTag,
+ expirationTime
+ ) {
+ var owner = null;
+ {
+ owner = element._owner;
+ }
+
+ var fiber = void 0;
+ var type = element.type,
+ key = element.key;
+
+ if (typeof type === "function") {
+ fiber = shouldConstruct(type)
+ ? createFiber(ClassComponent, key, internalContextTag)
+ : createFiber(
+ IndeterminateComponent,
+ key,
+ internalContextTag
+ );
+ fiber.type = type;
+ fiber.pendingProps = element.props;
+ } else if (typeof type === "string") {
+ fiber = createFiber(HostComponent, key, internalContextTag);
+ fiber.type = type;
+ fiber.pendingProps = element.props;
+ } else if (
+ typeof type === "object" &&
+ type !== null &&
+ typeof type.tag === "number"
+ ) {
+ // Currently assumed to be a continuation and therefore is a fiber already.
+ // TODO: The yield system is currently broken for updates in some cases.
+ // The reified yield stores a fiber, but we don't know which fiber that is;
+ // the current or a workInProgress? When the continuation gets rendered here
+ // we don't know if we can reuse that fiber or if we need to clone it.
+ // There is probably a clever way to restructure this.
+ fiber = type;
+ fiber.pendingProps = element.props;
+ } else {
+ var info = "";
+ {
+ if (
+ type === undefined ||
+ (typeof type === "object" &&
+ type !== null &&
+ Object.keys(type).length === 0)
+ ) {
+ info +=
+ " You likely forgot to export your component from the file " +
+ "it's defined in, or you might have mixed up default and named imports.";
+ }
+ var ownerName = owner ? getComponentName(owner) : null;
+ if (ownerName) {
+ info +=
+ "\n\nCheck the render method of `" + ownerName + "`.";
+ }
+ }
+ invariant(
+ false,
+ "Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s",
+ type == null ? type : typeof type,
+ info
+ );
+ }
+
+ {
+ fiber._debugSource = element._source;
+ fiber._debugOwner = element._owner;
+ }
+
+ fiber.expirationTime = expirationTime;
+
+ return fiber;
+ }
+
+ function createFiberFromFragment(
+ elements,
+ internalContextTag,
+ expirationTime,
+ key
+ ) {
+ var fiber = createFiber(Fragment, key, internalContextTag);
+ fiber.pendingProps = elements;
+ fiber.expirationTime = expirationTime;
+ return fiber;
+ }
+
+ function createFiberFromText(
+ content,
+ internalContextTag,
+ expirationTime
+ ) {
+ var fiber = createFiber(HostText, null, internalContextTag);
+ fiber.pendingProps = content;
+ fiber.expirationTime = expirationTime;
+ return fiber;
+ }
+
+ function createFiberFromHostInstanceForDeletion() {
+ var fiber = createFiber(HostComponent, null, NoContext);
+ fiber.type = "DELETED";
+ return fiber;
+ }
+
+ function createFiberFromCall(
+ call,
+ internalContextTag,
+ expirationTime
+ ) {
+ var fiber = createFiber(
+ CallComponent,
+ call.key,
+ internalContextTag
+ );
+ fiber.type = call.handler;
+ fiber.pendingProps = call;
+ fiber.expirationTime = expirationTime;
+ return fiber;
+ }
+
+ function createFiberFromReturn(
+ returnNode,
+ internalContextTag,
+ expirationTime
+ ) {
+ var fiber = createFiber(
+ ReturnComponent,
+ null,
+ internalContextTag
+ );
+ fiber.expirationTime = expirationTime;
+ return fiber;
+ }
+
+ function createFiberFromPortal(
+ portal,
+ internalContextTag,
+ expirationTime
+ ) {
+ var fiber = createFiber(
+ HostPortal,
+ portal.key,
+ internalContextTag
+ );
+ fiber.pendingProps = portal.children || [];
+ fiber.expirationTime = expirationTime;
+ fiber.stateNode = {
+ containerInfo: portal.containerInfo,
+ pendingChildren: null, // Used by persistent updates
+ implementation: portal.implementation
+ };
+ return fiber;
+ }
+
+ function createFiberRoot(containerInfo, hydrate) {
+ // Cyclic construction. This cheats the type system right now because
+ // stateNode is any.
+ var uninitializedFiber = createHostRootFiber();
+ var root = {
+ current: uninitializedFiber,
+ containerInfo: containerInfo,
+ pendingChildren: null,
+ remainingExpirationTime: NoWork,
+ isReadyForCommit: false,
+ finishedWork: null,
+ context: null,
+ pendingContext: null,
+ hydrate: hydrate,
+ nextScheduledRoot: null
+ };
+ uninitializedFiber.stateNode = root;
+ return root;
+ }
+
+ var onCommitFiberRoot = null;
+ var onCommitFiberUnmount = null;
+ var hasLoggedError = false;
+
+ function catchErrors(fn) {
+ return function(arg) {
+ try {
+ return fn(arg);
+ } catch (err) {
+ if (true && !hasLoggedError) {
+ hasLoggedError = true;
+ warning(
+ false,
+ "React DevTools encountered an error: %s",
+ err
+ );
+ }
+ }
+ };
+ }
+
+ function injectInternals(internals) {
+ if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === "undefined") {
+ // No DevTools
+ return false;
+ }
+ var hook = __REACT_DEVTOOLS_GLOBAL_HOOK__;
+ if (hook.isDisabled) {
+ // This isn't a real property on the hook, but it can be set to opt out
+ // of DevTools integration and associated warnings and logs.
+ // https://github.com/facebook/react/issues/3877
+ return true;
+ }
+ if (!hook.supportsFiber) {
+ {
+ warning(
+ false,
+ "The installed version of React DevTools is too old and will not work " +
+ "with the current version of React. Please update React DevTools. " +
+ "https://fb.me/react-devtools"
+ );
+ }
+ // DevTools exists, even though it doesn't support Fiber.
+ return true;
+ }
+ try {
+ var rendererID = hook.inject(internals);
+ // We have successfully injected, so now it is safe to set up hooks.
+ onCommitFiberRoot = catchErrors(function(root) {
+ return hook.onCommitFiberRoot(rendererID, root);
+ });
+ onCommitFiberUnmount = catchErrors(function(fiber) {
+ return hook.onCommitFiberUnmount(rendererID, fiber);
+ });
+ } catch (err) {
+ // Catch all errors because it is unsafe to throw during initialization.
+ {
+ warning(
+ false,
+ "React DevTools encountered an error: %s.",
+ err
+ );
+ }
+ }
+ // DevTools exists
+ return true;
+ }
+
+ function onCommitRoot(root) {
+ if (typeof onCommitFiberRoot === "function") {
+ onCommitFiberRoot(root);
+ }
+ }
+
+ function onCommitUnmount(fiber) {
+ if (typeof onCommitFiberUnmount === "function") {
+ onCommitFiberUnmount(fiber);
+ }
+ }
+
+ {
+ var didWarnUpdateInsideUpdate = false;
+ }
+
+ // Callbacks are not validated until invocation
+
+ // Singly linked-list of updates. When an update is scheduled, it is added to
+ // the queue of the current fiber and the work-in-progress fiber. The two queues
+ // are separate but they share a persistent structure.
+ //
+ // During reconciliation, updates are removed from the work-in-progress fiber,
+ // but they remain on the current fiber. That ensures that if a work-in-progress
+ // is aborted, the aborted updates are recovered by cloning from current.
+ //
+ // The work-in-progress queue is always a subset of the current queue.
+ //
+ // When the tree is committed, the work-in-progress becomes the current.
+
+ function createUpdateQueue(baseState) {
+ var queue = {
+ baseState: baseState,
+ expirationTime: NoWork,
+ first: null,
+ last: null,
+ callbackList: null,
+ hasForceUpdate: false,
+ isInitialized: false
+ };
+ {
+ queue.isProcessing = false;
+ }
+ return queue;
+ }
+
+ function insertUpdateIntoQueue(queue, update) {
+ // Append the update to the end of the list.
+ if (queue.last === null) {
+ // Queue is empty
+ queue.first = queue.last = update;
+ } else {
+ queue.last.next = update;
+ queue.last = update;
+ }
+ if (
+ queue.expirationTime === NoWork ||
+ queue.expirationTime > update.expirationTime
+ ) {
+ queue.expirationTime = update.expirationTime;
+ }
+ }
+
+ function insertUpdateIntoFiber(fiber, update) {
+ // We'll have at least one and at most two distinct update queues.
+ var alternateFiber = fiber.alternate;
+ var queue1 = fiber.updateQueue;
+ if (queue1 === null) {
+ // TODO: We don't know what the base state will be until we begin work.
+ // It depends on which fiber is the next current. Initialize with an empty
+ // base state, then set to the memoizedState when rendering. Not super
+ // happy with this approach.
+ queue1 = fiber.updateQueue = createUpdateQueue(null);
+ }
+
+ var queue2 = void 0;
+ if (alternateFiber !== null) {
+ queue2 = alternateFiber.updateQueue;
+ if (queue2 === null) {
+ queue2 = alternateFiber.updateQueue = createUpdateQueue(null);
+ }
+ } else {
+ queue2 = null;
+ }
+ queue2 = queue2 !== queue1 ? queue2 : null;
+
+ // Warn if an update is scheduled from inside an updater function.
+ {
+ if (
+ (queue1.isProcessing ||
+ (queue2 !== null && queue2.isProcessing)) &&
+ !didWarnUpdateInsideUpdate
+ ) {
+ warning(
+ false,
+ "An update (setState, replaceState, or forceUpdate) was scheduled " +
+ "from inside an update function. Update functions should be pure, " +
+ "with zero side-effects. Consider using componentDidUpdate or a " +
+ "callback."
+ );
+ didWarnUpdateInsideUpdate = true;
+ }
+ }
+
+ // If there's only one queue, add the update to that queue and exit.
+ if (queue2 === null) {
+ insertUpdateIntoQueue(queue1, update);
+ return;
+ }
+
+ // If either queue is empty, we need to add to both queues.
+ if (queue1.last === null || queue2.last === null) {
+ insertUpdateIntoQueue(queue1, update);
+ insertUpdateIntoQueue(queue2, update);
+ return;
+ }
+
+ // If both lists are not empty, the last update is the same for both lists
+ // because of structural sharing. So, we should only append to one of
+ // the lists.
+ insertUpdateIntoQueue(queue1, update);
+ // But we still need to update the `last` pointer of queue2.
+ queue2.last = update;
+ }
+
+ function getUpdateExpirationTime(fiber) {
+ if (fiber.tag !== ClassComponent && fiber.tag !== HostRoot) {
+ return NoWork;
+ }
+ var updateQueue = fiber.updateQueue;
+ if (updateQueue === null) {
+ return NoWork;
+ }
+ return updateQueue.expirationTime;
+ }
+
+ function getStateFromUpdate(update, instance, prevState, props) {
+ var partialState = update.partialState;
+ if (typeof partialState === "function") {
+ var updateFn = partialState;
+
+ // Invoke setState callback an extra time to help detect side-effects.
+ if (debugRenderPhaseSideEffects) {
+ updateFn.call(instance, prevState, props);
+ }
+
+ return updateFn.call(instance, prevState, props);
+ } else {
+ return partialState;
+ }
+ }
+
+ function processUpdateQueue(
+ current,
+ workInProgress,
+ queue,
+ instance,
+ props,
+ renderExpirationTime
+ ) {
+ if (current !== null && current.updateQueue === queue) {
+ // We need to create a work-in-progress queue, by cloning the current queue.
+ var currentQueue = queue;
+ queue = workInProgress.updateQueue = {
+ baseState: currentQueue.baseState,
+ expirationTime: currentQueue.expirationTime,
+ first: currentQueue.first,
+ last: currentQueue.last,
+ isInitialized: currentQueue.isInitialized,
+ // These fields are no longer valid because they were already committed.
+ // Reset them.
+ callbackList: null,
+ hasForceUpdate: false
+ };
+ }
+
+ {
+ // Set this flag so we can warn if setState is called inside the update
+ // function of another setState.
+ queue.isProcessing = true;
+ }
+
+ // Reset the remaining expiration time. If we skip over any updates, we'll
+ // increase this accordingly.
+ queue.expirationTime = NoWork;
+
+ // TODO: We don't know what the base state will be until we begin work.
+ // It depends on which fiber is the next current. Initialize with an empty
+ // base state, then set to the memoizedState when rendering. Not super
+ // happy with this approach.
+ var state = void 0;
+ if (queue.isInitialized) {
+ state = queue.baseState;
+ } else {
+ state = queue.baseState = workInProgress.memoizedState;
+ queue.isInitialized = true;
+ }
+ var dontMutatePrevState = true;
+ var update = queue.first;
+ var didSkip = false;
+ while (update !== null) {
+ var updateExpirationTime = update.expirationTime;
+ if (updateExpirationTime > renderExpirationTime) {
+ // This update does not have sufficient priority. Skip it.
+ var remainingExpirationTime = queue.expirationTime;
+ if (
+ remainingExpirationTime === NoWork ||
+ remainingExpirationTime > updateExpirationTime
+ ) {
+ // Update the remaining expiration time.
+ queue.expirationTime = updateExpirationTime;
+ }
+ if (!didSkip) {
+ didSkip = true;
+ queue.baseState = state;
+ }
+ // Continue to the next update.
+ update = update.next;
+ continue;
+ }
+
+ // This update does have sufficient priority.
+
+ // If no previous updates were skipped, drop this update from the queue by
+ // advancing the head of the list.
+ if (!didSkip) {
+ queue.first = update.next;
+ if (queue.first === null) {
+ queue.last = null;
+ }
+ }
+
+ // Process the update
+ var _partialState = void 0;
+ if (update.isReplace) {
+ state = getStateFromUpdate(update, instance, state, props);
+ dontMutatePrevState = true;
+ } else {
+ _partialState = getStateFromUpdate(
+ update,
+ instance,
+ state,
+ props
+ );
+ if (_partialState) {
+ if (dontMutatePrevState) {
+ // $FlowFixMe: Idk how to type this properly.
+ state = _assign({}, state, _partialState);
+ } else {
+ state = _assign(state, _partialState);
+ }
+ dontMutatePrevState = false;
+ }
+ }
+ if (update.isForced) {
+ queue.hasForceUpdate = true;
+ }
+ if (update.callback !== null) {
+ // Append to list of callbacks.
+ var _callbackList = queue.callbackList;
+ if (_callbackList === null) {
+ _callbackList = queue.callbackList = [];
+ }
+ _callbackList.push(update);
+ }
+ update = update.next;
+ }
+
+ if (queue.callbackList !== null) {
+ workInProgress.effectTag |= Callback;
+ } else if (queue.first === null && !queue.hasForceUpdate) {
+ // The queue is empty. We can reset it.
+ workInProgress.updateQueue = null;
+ }
+
+ if (!didSkip) {
+ didSkip = true;
+ queue.baseState = state;
+ }
+
+ {
+ // No longer processing.
+ queue.isProcessing = false;
+ }
+
+ return state;
+ }
+
+ function commitCallbacks(queue, context) {
+ var callbackList = queue.callbackList;
+ if (callbackList === null) {
+ return;
+ }
+ // Set the list to null to make sure they don't get called more than once.
+ queue.callbackList = null;
+ for (var i = 0; i < callbackList.length; i++) {
+ var update = callbackList[i];
+ var _callback = update.callback;
+ // This update might be processed again. Clear the callback so it's only
+ // called once.
+ update.callback = null;
+ !(typeof _callback === "function")
+ ? invariant(
+ false,
+ "Invalid argument passed as callback. Expected a function. Instead received: %s",
+ _callback
+ )
+ : void 0;
+ _callback.call(context);
+ }
+ }
+
+ var fakeInternalInstance = {};
+ var isArray = Array.isArray;
+
+ {
+ var didWarnAboutStateAssignmentForComponent = {};
+
+ var warnOnInvalidCallback = function(callback, callerName) {
+ warning(
+ callback === null || typeof callback === "function",
+ "%s(...): Expected the last optional `callback` argument to be a " +
+ "function. Instead received: %s.",
+ callerName,
+ callback
+ );
+ };
+
+ // This is so gross but it's at least non-critical and can be removed if
+ // it causes problems. This is meant to give a nicer error message for
+ // ReactDOM15.unstable_renderSubtreeIntoContainer(reactDOM16Component,
+ // ...)) which otherwise throws a "_processChildContext is not a function"
+ // exception.
+ Object.defineProperty(
+ fakeInternalInstance,
+ "_processChildContext",
+ {
+ enumerable: false,
+ value: function() {
+ invariant(
+ false,
+ "_processChildContext is not available in React 16+. This likely means you have multiple copies of React and are attempting to nest a React 15 tree inside a React 16 tree using unstable_renderSubtreeIntoContainer, which isn't supported. Try to make sure you have only one copy of React (and ideally, switch to ReactDOM.createPortal)."
+ );
+ }
+ }
+ );
+ Object.freeze(fakeInternalInstance);
+ }
+
+ var ReactFiberClassComponent = function(
+ scheduleWork,
+ computeExpirationForFiber,
+ memoizeProps,
+ memoizeState
+ ) {
+ // Class component state updater
+ var updater = {
+ isMounted: isMounted,
+ enqueueSetState: function(instance, partialState, callback) {
+ var fiber = get(instance);
+ callback = callback === undefined ? null : callback;
+ {
+ warnOnInvalidCallback(callback, "setState");
+ }
+ var expirationTime = computeExpirationForFiber(fiber);
+ var update = {
+ expirationTime: expirationTime,
+ partialState: partialState,
+ callback: callback,
+ isReplace: false,
+ isForced: false,
+ nextCallback: null,
+ next: null
+ };
+ insertUpdateIntoFiber(fiber, update);
+ scheduleWork(fiber, expirationTime);
+ },
+ enqueueReplaceState: function(instance, state, callback) {
+ var fiber = get(instance);
+ callback = callback === undefined ? null : callback;
+ {
+ warnOnInvalidCallback(callback, "replaceState");
+ }
+ var expirationTime = computeExpirationForFiber(fiber);
+ var update = {
+ expirationTime: expirationTime,
+ partialState: state,
+ callback: callback,
+ isReplace: true,
+ isForced: false,
+ nextCallback: null,
+ next: null
+ };
+ insertUpdateIntoFiber(fiber, update);
+ scheduleWork(fiber, expirationTime);
+ },
+ enqueueForceUpdate: function(instance, callback) {
+ var fiber = get(instance);
+ callback = callback === undefined ? null : callback;
+ {
+ warnOnInvalidCallback(callback, "forceUpdate");
+ }
+ var expirationTime = computeExpirationForFiber(fiber);
+ var update = {
+ expirationTime: expirationTime,
+ partialState: null,
+ callback: callback,
+ isReplace: false,
+ isForced: true,
+ nextCallback: null,
+ next: null
+ };
+ insertUpdateIntoFiber(fiber, update);
+ scheduleWork(fiber, expirationTime);
+ }
+ };
+
+ function checkShouldComponentUpdate(
+ workInProgress,
+ oldProps,
+ newProps,
+ oldState,
+ newState,
+ newContext
+ ) {
+ if (
+ oldProps === null ||
+ (workInProgress.updateQueue !== null &&
+ workInProgress.updateQueue.hasForceUpdate)
+ ) {
+ // If the workInProgress already has an Update effect, return true
+ return true;
+ }
+
+ var instance = workInProgress.stateNode;
+ var type = workInProgress.type;
+ if (typeof instance.shouldComponentUpdate === "function") {
+ startPhaseTimer(workInProgress, "shouldComponentUpdate");
+ var shouldUpdate = instance.shouldComponentUpdate(
+ newProps,
+ newState,
+ newContext
+ );
+ stopPhaseTimer();
+
+ // Simulate an async bailout/interruption by invoking lifecycle twice.
+ if (debugRenderPhaseSideEffects) {
+ instance.shouldComponentUpdate(
+ newProps,
+ newState,
+ newContext
+ );
+ }
+
+ {
+ warning(
+ shouldUpdate !== undefined,
+ "%s.shouldComponentUpdate(): Returned undefined instead of a " +
+ "boolean value. Make sure to return true or false.",
+ getComponentName(workInProgress) || "Unknown"
+ );
+ }
+
+ return shouldUpdate;
+ }
+
+ if (type.prototype && type.prototype.isPureReactComponent) {
+ return (
+ !shallowEqual(oldProps, newProps) ||
+ !shallowEqual(oldState, newState)
+ );
+ }
+
+ return true;
+ }
+
+ function checkClassInstance(workInProgress) {
+ var instance = workInProgress.stateNode;
+ var type = workInProgress.type;
+ {
+ var name = getComponentName(workInProgress);
+ var renderPresent = instance.render;
+
+ if (!renderPresent) {
+ if (
+ type.prototype &&
+ typeof type.prototype.render === "function"
+ ) {
+ warning(
+ false,
+ "%s(...): No `render` method found on the returned component " +
+ "instance: did you accidentally return an object from the constructor?",
+ name
+ );
+ } else {
+ warning(
+ false,
+ "%s(...): No `render` method found on the returned component " +
+ "instance: you may have forgotten to define `render`.",
+ name
+ );
+ }
+ }
+
+ var noGetInitialStateOnES6 =
+ !instance.getInitialState ||
+ instance.getInitialState.isReactClassApproved ||
+ instance.state;
+ warning(
+ noGetInitialStateOnES6,
+ "getInitialState was defined on %s, a plain JavaScript class. " +
+ "This is only supported for classes created using React.createClass. " +
+ "Did you mean to define a state property instead?",
+ name
+ );
+ var noGetDefaultPropsOnES6 =
+ !instance.getDefaultProps ||
+ instance.getDefaultProps.isReactClassApproved;
+ warning(
+ noGetDefaultPropsOnES6,
+ "getDefaultProps was defined on %s, a plain JavaScript class. " +
+ "This is only supported for classes created using React.createClass. " +
+ "Use a static property to define defaultProps instead.",
+ name
+ );
+ var noInstancePropTypes = !instance.propTypes;
+ warning(
+ noInstancePropTypes,
+ "propTypes was defined as an instance property on %s. Use a static " +
+ "property to define propTypes instead.",
+ name
+ );
+ var noInstanceContextTypes = !instance.contextTypes;
+ warning(
+ noInstanceContextTypes,
+ "contextTypes was defined as an instance property on %s. Use a static " +
+ "property to define contextTypes instead.",
+ name
+ );
+ var noComponentShouldUpdate =
+ typeof instance.componentShouldUpdate !== "function";
+ warning(
+ noComponentShouldUpdate,
+ "%s has a method called " +
+ "componentShouldUpdate(). Did you mean shouldComponentUpdate()? " +
+ "The name is phrased as a question because the function is " +
+ "expected to return a value.",
+ name
+ );
+ if (
+ type.prototype &&
+ type.prototype.isPureReactComponent &&
+ typeof instance.shouldComponentUpdate !== "undefined"
+ ) {
+ warning(
+ false,
+ "%s has a method called shouldComponentUpdate(). " +
+ "shouldComponentUpdate should not be used when extending React.PureComponent. " +
+ "Please extend React.Component if shouldComponentUpdate is used.",
+ getComponentName(workInProgress) || "A pure component"
+ );
+ }
+ var noComponentDidUnmount =
+ typeof instance.componentDidUnmount !== "function";
+ warning(
+ noComponentDidUnmount,
+ "%s has a method called " +
+ "componentDidUnmount(). But there is no such lifecycle method. " +
+ "Did you mean componentWillUnmount()?",
+ name
+ );
+ var noComponentDidReceiveProps =
+ typeof instance.componentDidReceiveProps !== "function";
+ warning(
+ noComponentDidReceiveProps,
+ "%s has a method called " +
+ "componentDidReceiveProps(). But there is no such lifecycle method. " +
+ "If you meant to update the state in response to changing props, " +
+ "use componentWillReceiveProps(). If you meant to fetch data or " +
+ "run side-effects or mutations after React has updated the UI, use componentDidUpdate().",
+ name
+ );
+ var noComponentWillRecieveProps =
+ typeof instance.componentWillRecieveProps !== "function";
+ warning(
+ noComponentWillRecieveProps,
+ "%s has a method called " +
+ "componentWillRecieveProps(). Did you mean componentWillReceiveProps()?",
+ name
+ );
+ var hasMutatedProps =
+ instance.props !== workInProgress.pendingProps;
+ warning(
+ instance.props === undefined || !hasMutatedProps,
+ "%s(...): When calling super() in `%s`, make sure to pass " +
+ "up the same props that your component's constructor was passed.",
+ name,
+ name
+ );
+ var noInstanceDefaultProps = !instance.defaultProps;
+ warning(
+ noInstanceDefaultProps,
+ "Setting defaultProps as an instance property on %s is not supported and will be ignored." +
+ " Instead, define defaultProps as a static property on %s.",
+ name,
+ name
+ );
+ }
+
+ var state = instance.state;
+ if (state && (typeof state !== "object" || isArray(state))) {
+ warning(
+ false,
+ "%s.state: must be set to an object or null",
+ getComponentName(workInProgress)
+ );
+ }
+ if (typeof instance.getChildContext === "function") {
+ warning(
+ typeof workInProgress.type.childContextTypes === "object",
+ "%s.getChildContext(): childContextTypes must be defined in order to " +
+ "use getChildContext().",
+ getComponentName(workInProgress)
+ );
+ }
+ }
+
+ function resetInputPointers(workInProgress, instance) {
+ instance.props = workInProgress.memoizedProps;
+ instance.state = workInProgress.memoizedState;
+ }
+
+ function adoptClassInstance(workInProgress, instance) {
+ instance.updater = updater;
+ workInProgress.stateNode = instance;
+ // The instance needs access to the fiber so that it can schedule updates
+ set(instance, workInProgress);
+ {
+ instance._reactInternalInstance = fakeInternalInstance;
+ }
+ }
+
+ function constructClassInstance(workInProgress, props) {
+ var ctor = workInProgress.type;
+ var unmaskedContext = getUnmaskedContext(workInProgress);
+ var needsContext = isContextConsumer(workInProgress);
+ var context = needsContext
+ ? getMaskedContext(workInProgress, unmaskedContext)
+ : emptyObject;
+ var instance = new ctor(props, context);
+ adoptClassInstance(workInProgress, instance);
+
+ // Cache unmasked context so we can avoid recreating masked context unless necessary.
+ // ReactFiberContext usually updates this cache but can't for newly-created instances.
+ if (needsContext) {
+ cacheContext(workInProgress, unmaskedContext, context);
+ }
+
+ return instance;
+ }
+
+ function callComponentWillMount(workInProgress, instance) {
+ startPhaseTimer(workInProgress, "componentWillMount");
+ var oldState = instance.state;
+ instance.componentWillMount();
+ stopPhaseTimer();
+
+ // Simulate an async bailout/interruption by invoking lifecycle twice.
+ if (debugRenderPhaseSideEffects) {
+ instance.componentWillMount();
+ }
+
+ if (oldState !== instance.state) {
+ {
+ warning(
+ false,
+ "%s.componentWillMount(): Assigning directly to this.state is " +
+ "deprecated (except inside a component's " +
+ "constructor). Use setState instead.",
+ getComponentName(workInProgress)
+ );
+ }
+ updater.enqueueReplaceState(instance, instance.state, null);
+ }
+ }
+
+ function callComponentWillReceiveProps(
+ workInProgress,
+ instance,
+ newProps,
+ newContext
+ ) {
+ startPhaseTimer(workInProgress, "componentWillReceiveProps");
+ var oldState = instance.state;
+ instance.componentWillReceiveProps(newProps, newContext);
+ stopPhaseTimer();
+
+ // Simulate an async bailout/interruption by invoking lifecycle twice.
+ if (debugRenderPhaseSideEffects) {
+ instance.componentWillReceiveProps(newProps, newContext);
+ }
+
+ if (instance.state !== oldState) {
+ {
+ var componentName =
+ getComponentName(workInProgress) || "Component";
+ if (
+ !didWarnAboutStateAssignmentForComponent[componentName]
+ ) {
+ warning(
+ false,
+ "%s.componentWillReceiveProps(): Assigning directly to " +
+ "this.state is deprecated (except inside a component's " +
+ "constructor). Use setState instead.",
+ componentName
+ );
+ didWarnAboutStateAssignmentForComponent[
+ componentName
+ ] = true;
+ }
+ }
+ updater.enqueueReplaceState(instance, instance.state, null);
+ }
+ }
+
+ // Invokes the mount life-cycles on a previously never rendered instance.
+ function mountClassInstance(
+ workInProgress,
+ renderExpirationTime
+ ) {
+ var current = workInProgress.alternate;
+
+ {
+ checkClassInstance(workInProgress);
+ }
+
+ var instance = workInProgress.stateNode;
+ var state = instance.state || null;
+
+ var props = workInProgress.pendingProps;
+ !props
+ ? invariant(
+ false,
+ "There must be pending props for an initial mount. This error is likely caused by a bug in React. Please file an issue."
+ )
+ : void 0;
+
+ var unmaskedContext = getUnmaskedContext(workInProgress);
+
+ instance.props = props;
+ instance.state = workInProgress.memoizedState = state;
+ instance.refs = emptyObject;
+ instance.context = getMaskedContext(
+ workInProgress,
+ unmaskedContext
+ );
+
+ if (
+ enableAsyncSubtreeAPI &&
+ workInProgress.type != null &&
+ workInProgress.type.prototype != null &&
+ workInProgress.type.prototype
+ .unstable_isAsyncReactComponent === true
+ ) {
+ workInProgress.internalContextTag |= AsyncUpdates;
+ }
+
+ if (typeof instance.componentWillMount === "function") {
+ callComponentWillMount(workInProgress, instance);
+ // If we had additional state updates during this life-cycle, let's
+ // process them now.
+ var updateQueue = workInProgress.updateQueue;
+ if (updateQueue !== null) {
+ instance.state = processUpdateQueue(
+ current,
+ workInProgress,
+ updateQueue,
+ instance,
+ props,
+ renderExpirationTime
+ );
+ }
+ }
+ if (typeof instance.componentDidMount === "function") {
+ workInProgress.effectTag |= Update;
+ }
+ }
+
+ // Called on a preexisting class instance. Returns false if a resumed render
+ // could be reused.
+ // function resumeMountClassInstance(
+ // workInProgress: Fiber,
+ // priorityLevel: PriorityLevel,
+ // ): boolean {
+ // const instance = workInProgress.stateNode;
+ // resetInputPointers(workInProgress, instance);
+
+ // let newState = workInProgress.memoizedState;
+ // let newProps = workInProgress.pendingProps;
+ // if (!newProps) {
+ // // If there isn't any new props, then we'll reuse the memoized props.
+ // // This could be from already completed work.
+ // newProps = workInProgress.memoizedProps;
+ // invariant(
+ // newProps != null,
+ // 'There should always be pending or memoized props. This error is ' +
+ // 'likely caused by a bug in React. Please file an issue.',
+ // );
+ // }
+ // const newUnmaskedContext = getUnmaskedContext(workInProgress);
+ // const newContext = getMaskedContext(workInProgress, newUnmaskedContext);
+
+ // const oldContext = instance.context;
+ // const oldProps = workInProgress.memoizedProps;
+
+ // if (
+ // typeof instance.componentWillReceiveProps === 'function' &&
+ // (oldProps !== newProps || oldContext !== newContext)
+ // ) {
+ // callComponentWillReceiveProps(
+ // workInProgress,
+ // instance,
+ // newProps,
+ // newContext,
+ // );
+ // }
+
+ // // Process the update queue before calling shouldComponentUpdate
+ // const updateQueue = workInProgress.updateQueue;
+ // if (updateQueue !== null) {
+ // newState = processUpdateQueue(
+ // workInProgress,
+ // updateQueue,
+ // instance,
+ // newState,
+ // newProps,
+ // priorityLevel,
+ // );
+ // }
+
+ // // TODO: Should we deal with a setState that happened after the last
+ // // componentWillMount and before this componentWillMount? Probably
+ // // unsupported anyway.
+
+ // if (
+ // !checkShouldComponentUpdate(
+ // workInProgress,
+ // workInProgress.memoizedProps,
+ // newProps,
+ // workInProgress.memoizedState,
+ // newState,
+ // newContext,
+ // )
+ // ) {
+ // // Update the existing instance's state, props, and context pointers even
+ // // though we're bailing out.
+ // instance.props = newProps;
+ // instance.state = newState;
+ // instance.context = newContext;
+ // return false;
+ // }
+
+ // // Update the input pointers now so that they are correct when we call
+ // // componentWillMount
+ // instance.props = newProps;
+ // instance.state = newState;
+ // instance.context = newContext;
+
+ // if (typeof instance.componentWillMount === 'function') {
+ // callComponentWillMount(workInProgress, instance);
+ // // componentWillMount may have called setState. Process the update queue.
+ // const newUpdateQueue = workInProgress.updateQueue;
+ // if (newUpdateQueue !== null) {
+ // newState = processUpdateQueue(
+ // workInProgress,
+ // newUpdateQueue,
+ // instance,
+ // newState,
+ // newProps,
+ // priorityLevel,
+ // );
+ // }
+ // }
+
+ // if (typeof instance.componentDidMount === 'function') {
+ // workInProgress.effectTag |= Update;
+ // }
+
+ // instance.state = newState;
+
+ // return true;
+ // }
+
+ // Invokes the update life-cycles and returns false if it shouldn't rerender.
+ function updateClassInstance(
+ current,
+ workInProgress,
+ renderExpirationTime
+ ) {
+ var instance = workInProgress.stateNode;
+ resetInputPointers(workInProgress, instance);
+
+ var oldProps = workInProgress.memoizedProps;
+ var newProps = workInProgress.pendingProps;
+ if (!newProps) {
+ // If there aren't any new props, then we'll reuse the memoized props.
+ // This could be from already completed work.
+ newProps = oldProps;
+ !(newProps != null)
+ ? invariant(
+ false,
+ "There should always be pending or memoized props. This error is likely caused by a bug in React. Please file an issue."
+ )
+ : void 0;
+ }
+ var oldContext = instance.context;
+ var newUnmaskedContext = getUnmaskedContext(workInProgress);
+ var newContext = getMaskedContext(
+ workInProgress,
+ newUnmaskedContext
+ );
+
+ // Note: During these life-cycles, instance.props/instance.state are what
+ // ever the previously attempted to render - not the "current". However,
+ // during componentDidUpdate we pass the "current" props.
+
+ if (
+ typeof instance.componentWillReceiveProps === "function" &&
+ (oldProps !== newProps || oldContext !== newContext)
+ ) {
+ callComponentWillReceiveProps(
+ workInProgress,
+ instance,
+ newProps,
+ newContext
+ );
+ }
+
+ // Compute the next state using the memoized state and the update queue.
+ var oldState = workInProgress.memoizedState;
+ // TODO: Previous state can be null.
+ var newState = void 0;
+ if (workInProgress.updateQueue !== null) {
+ newState = processUpdateQueue(
+ current,
+ workInProgress,
+ workInProgress.updateQueue,
+ instance,
+ newProps,
+ renderExpirationTime
+ );
+ } else {
+ newState = oldState;
+ }
+
+ if (
+ oldProps === newProps &&
+ oldState === newState &&
+ !hasContextChanged() &&
+ !(
+ workInProgress.updateQueue !== null &&
+ workInProgress.updateQueue.hasForceUpdate
+ )
+ ) {
+ // If an update was already in progress, we should schedule an Update
+ // effect even though we're bailing out, so that cWU/cDU are called.
+ if (typeof instance.componentDidUpdate === "function") {
+ if (
+ oldProps !== current.memoizedProps ||
+ oldState !== current.memoizedState
+ ) {
+ workInProgress.effectTag |= Update;
+ }
+ }
+ return false;
+ }
+
+ var shouldUpdate = checkShouldComponentUpdate(
+ workInProgress,
+ oldProps,
+ newProps,
+ oldState,
+ newState,
+ newContext
+ );
+
+ if (shouldUpdate) {
+ if (typeof instance.componentWillUpdate === "function") {
+ startPhaseTimer(workInProgress, "componentWillUpdate");
+ instance.componentWillUpdate(
+ newProps,
+ newState,
+ newContext
+ );
+ stopPhaseTimer();
+
+ // Simulate an async bailout/interruption by invoking lifecycle twice.
+ if (debugRenderPhaseSideEffects) {
+ instance.componentWillUpdate(
+ newProps,
+ newState,
+ newContext
+ );
+ }
+ }
+ if (typeof instance.componentDidUpdate === "function") {
+ workInProgress.effectTag |= Update;
+ }
+ } else {
+ // If an update was already in progress, we should schedule an Update
+ // effect even though we're bailing out, so that cWU/cDU are called.
+ if (typeof instance.componentDidUpdate === "function") {
+ if (
+ oldProps !== current.memoizedProps ||
+ oldState !== current.memoizedState
+ ) {
+ workInProgress.effectTag |= Update;
+ }
+ }
+
+ // If shouldComponentUpdate returned false, we should still update the
+ // memoized props/state to indicate that this work can be reused.
+ memoizeProps(workInProgress, newProps);
+ memoizeState(workInProgress, newState);
+ }
+
+ // Update the existing instance's state, props, and context pointers even
+ // if shouldComponentUpdate returns false.
+ instance.props = newProps;
+ instance.state = newState;
+ instance.context = newContext;
+
+ return shouldUpdate;
+ }
+
+ return {
+ adoptClassInstance: adoptClassInstance,
+ constructClassInstance: constructClassInstance,
+ mountClassInstance: mountClassInstance,
+ // resumeMountClassInstance,
+ updateClassInstance: updateClassInstance
+ };
+ };
+
+ // The Symbol used to tag the ReactElement-like types. If there is no native Symbol
+ // nor polyfill, then a plain number is used for performance.
+ var hasSymbol = typeof Symbol === "function" && Symbol["for"];
+
+ var REACT_ELEMENT_TYPE = hasSymbol
+ ? Symbol["for"]("react.element")
+ : 0xeac7;
+ var REACT_CALL_TYPE = hasSymbol
+ ? Symbol["for"]("react.call")
+ : 0xeac8;
+ var REACT_RETURN_TYPE = hasSymbol
+ ? Symbol["for"]("react.return")
+ : 0xeac9;
+ var REACT_PORTAL_TYPE = hasSymbol
+ ? Symbol["for"]("react.portal")
+ : 0xeaca;
+ var REACT_FRAGMENT_TYPE = hasSymbol
+ ? Symbol["for"]("react.fragment")
+ : 0xeacb;
+
+ var MAYBE_ITERATOR_SYMBOL =
+ typeof Symbol === "function" && Symbol.iterator;
+ var FAUX_ITERATOR_SYMBOL = "@@iterator";
+
+ function getIteratorFn(maybeIterable) {
+ if (
+ maybeIterable === null ||
+ typeof maybeIterable === "undefined"
+ ) {
+ return null;
+ }
+ var maybeIterator =
+ (MAYBE_ITERATOR_SYMBOL &&
+ maybeIterable[MAYBE_ITERATOR_SYMBOL]) ||
+ maybeIterable[FAUX_ITERATOR_SYMBOL];
+ if (typeof maybeIterator === "function") {
+ return maybeIterator;
+ }
+ return null;
+ }
+
+ var getCurrentFiberStackAddendum$1 =
+ ReactDebugCurrentFiber.getCurrentFiberStackAddendum;
+
+ {
+ var didWarnAboutMaps = false;
+ /**
+ * Warn if there's no key explicitly set on dynamic arrays of children or
+ * object keys are not valid. This allows us to keep track of children between
+ * updates.
+ */
+ var ownerHasKeyUseWarning = {};
+ var ownerHasFunctionTypeWarning = {};
+
+ var warnForMissingKey = function(child) {
+ if (child === null || typeof child !== "object") {
+ return;
+ }
+ if (
+ !child._store ||
+ child._store.validated ||
+ child.key != null
+ ) {
+ return;
+ }
+ !(typeof child._store === "object")
+ ? invariant(
+ false,
+ "React Component in warnForMissingKey should have a _store. This error is likely caused by a bug in React. Please file an issue."
+ )
+ : void 0;
+ child._store.validated = true;
+
+ var currentComponentErrorInfo =
+ "Each child in an array or iterator should have a unique " +
+ '"key" prop. See https://fb.me/react-warning-keys for ' +
+ "more information." +
+ (getCurrentFiberStackAddendum$1() || "");
+ if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {
+ return;
+ }
+ ownerHasKeyUseWarning[currentComponentErrorInfo] = true;
+
+ warning(
+ false,
+ "Each child in an array or iterator should have a unique " +
+ '"key" prop. See https://fb.me/react-warning-keys for ' +
+ "more information.%s",
+ getCurrentFiberStackAddendum$1()
+ );
+ };
+ }
+
+ var isArray$1 = Array.isArray;
+
+ function coerceRef(current, element) {
+ var mixedRef = element.ref;
+ if (mixedRef !== null && typeof mixedRef !== "function") {
+ if (element._owner) {
+ var owner = element._owner;
+ var inst = void 0;
+ if (owner) {
+ var ownerFiber = owner;
+ !(ownerFiber.tag === ClassComponent)
+ ? invariant(
+ false,
+ "Stateless function components cannot have refs."
+ )
+ : void 0;
+ inst = ownerFiber.stateNode;
+ }
+ !inst
+ ? invariant(
+ false,
+ "Missing owner for string ref %s. This error is likely caused by a bug in React. Please file an issue.",
+ mixedRef
+ )
+ : void 0;
+ var stringRef = "" + mixedRef;
+ // Check if previous string ref matches new string ref
+ if (
+ current !== null &&
+ current.ref !== null &&
+ current.ref._stringRef === stringRef
+ ) {
+ return current.ref;
+ }
+ var ref = function(value) {
+ var refs =
+ inst.refs === emptyObject ? (inst.refs = {}) : inst.refs;
+ if (value === null) {
+ delete refs[stringRef];
+ } else {
+ refs[stringRef] = value;
+ }
+ };
+ ref._stringRef = stringRef;
+ return ref;
+ } else {
+ !(typeof mixedRef === "string")
+ ? invariant(
+ false,
+ "Expected ref to be a function or a string."
+ )
+ : void 0;
+ !element._owner
+ ? invariant(
+ false,
+ "Element ref was specified as a string (%s) but no owner was set. You may have multiple copies of React loaded. (details: https://fb.me/react-refs-must-have-owner).",
+ mixedRef
+ )
+ : void 0;
+ }
+ }
+ return mixedRef;
+ }
+
+ function throwOnInvalidObjectType(returnFiber, newChild) {
+ if (returnFiber.type !== "textarea") {
+ var addendum = "";
+ {
+ addendum =
+ " If you meant to render a collection of children, use an array " +
+ "instead." +
+ (getCurrentFiberStackAddendum$1() || "");
+ }
+ invariant(
+ false,
+ "Objects are not valid as a React child (found: %s).%s",
+ Object.prototype.toString.call(newChild) === "[object Object]"
+ ? "object with keys {" +
+ Object.keys(newChild).join(", ") +
+ "}"
+ : newChild,
+ addendum
+ );
+ }
+ }
+
+ function warnOnFunctionType() {
+ var currentComponentErrorInfo =
+ "Functions are not valid as a React child. This may happen if " +
+ "you return a Component instead of <Component /> from render. " +
+ "Or maybe you meant to call this function rather than return it." +
+ (getCurrentFiberStackAddendum$1() || "");
+
+ if (ownerHasFunctionTypeWarning[currentComponentErrorInfo]) {
+ return;
+ }
+ ownerHasFunctionTypeWarning[currentComponentErrorInfo] = true;
+
+ warning(
+ false,
+ "Functions are not valid as a React child. This may happen if " +
+ "you return a Component instead of <Component /> from render. " +
+ "Or maybe you meant to call this function rather than return it.%s",
+ getCurrentFiberStackAddendum$1() || ""
+ );
+ }
+
+ // This wrapper function exists because I expect to clone the code in each path
+ // to be able to optimize each path individually by branching early. This needs
+ // a compiler or we can do it manually. Helpers that don't need this branching
+ // live outside of this function.
+ function ChildReconciler(shouldTrackSideEffects) {
+ function deleteChild(returnFiber, childToDelete) {
+ if (!shouldTrackSideEffects) {
+ // Noop.
+ return;
+ }
+ // Deletions are added in reversed order so we add it to the front.
+ // At this point, the return fiber's effect list is empty except for
+ // deletions, so we can just append the deletion to the list. The remaining
+ // effects aren't added until the complete phase. Once we implement
+ // resuming, this may not be true.
+ var last = returnFiber.lastEffect;
+ if (last !== null) {
+ last.nextEffect = childToDelete;
+ returnFiber.lastEffect = childToDelete;
+ } else {
+ returnFiber.firstEffect = returnFiber.lastEffect = childToDelete;
+ }
+ childToDelete.nextEffect = null;
+ childToDelete.effectTag = Deletion;
+ }
+
+ function deleteRemainingChildren(returnFiber, currentFirstChild) {
+ if (!shouldTrackSideEffects) {
+ // Noop.
+ return null;
+ }
+
+ // TODO: For the shouldClone case, this could be micro-optimized a bit by
+ // assuming that after the first child we've already added everything.
+ var childToDelete = currentFirstChild;
+ while (childToDelete !== null) {
+ deleteChild(returnFiber, childToDelete);
+ childToDelete = childToDelete.sibling;
+ }
+ return null;
+ }
+
+ function mapRemainingChildren(returnFiber, currentFirstChild) {
+ // Add the remaining children to a temporary map so that we can find them by
+ // keys quickly. Implicit (null) keys get added to this set with their index
+ var existingChildren = new Map();
+
+ var existingChild = currentFirstChild;
+ while (existingChild !== null) {
+ if (existingChild.key !== null) {
+ existingChildren.set(existingChild.key, existingChild);
+ } else {
+ existingChildren.set(existingChild.index, existingChild);
+ }
+ existingChild = existingChild.sibling;
+ }
+ return existingChildren;
+ }
+
+ function useFiber(fiber, pendingProps, expirationTime) {
+ // We currently set sibling to null and index to 0 here because it is easy
+ // to forget to do before returning it. E.g. for the single child case.
+ var clone = createWorkInProgress(
+ fiber,
+ pendingProps,
+ expirationTime
+ );
+ clone.index = 0;
+ clone.sibling = null;
+ return clone;
+ }
+
+ function placeChild(newFiber, lastPlacedIndex, newIndex) {
+ newFiber.index = newIndex;
+ if (!shouldTrackSideEffects) {
+ // Noop.
+ return lastPlacedIndex;
+ }
+ var current = newFiber.alternate;
+ if (current !== null) {
+ var oldIndex = current.index;
+ if (oldIndex < lastPlacedIndex) {
+ // This is a move.
+ newFiber.effectTag = Placement;
+ return lastPlacedIndex;
+ } else {
+ // This item can stay in place.
+ return oldIndex;
+ }
+ } else {
+ // This is an insertion.
+ newFiber.effectTag = Placement;
+ return lastPlacedIndex;
+ }
+ }
+
+ function placeSingleChild(newFiber) {
+ // This is simpler for the single child case. We only need to do a
+ // placement for inserting new children.
+ if (shouldTrackSideEffects && newFiber.alternate === null) {
+ newFiber.effectTag = Placement;
+ }
+ return newFiber;
+ }
+
+ function updateTextNode(
+ returnFiber,
+ current,
+ textContent,
+ expirationTime
+ ) {
+ if (current === null || current.tag !== HostText) {
+ // Insert
+ var created = createFiberFromText(
+ textContent,
+ returnFiber.internalContextTag,
+ expirationTime
+ );
+ created["return"] = returnFiber;
+ return created;
+ } else {
+ // Update
+ var existing = useFiber(current, textContent, expirationTime);
+ existing["return"] = returnFiber;
+ return existing;
+ }
+ }
+
+ function updateElement(
+ returnFiber,
+ current,
+ element,
+ expirationTime
+ ) {
+ if (current !== null && current.type === element.type) {
+ // Move based on index
+ var existing = useFiber(
+ current,
+ element.props,
+ expirationTime
+ );
+ existing.ref = coerceRef(current, element);
+ existing["return"] = returnFiber;
+ {
+ existing._debugSource = element._source;
+ existing._debugOwner = element._owner;
+ }
+ return existing;
+ } else {
+ // Insert
+ var created = createFiberFromElement(
+ element,
+ returnFiber.internalContextTag,
+ expirationTime
+ );
+ created.ref = coerceRef(current, element);
+ created["return"] = returnFiber;
+ return created;
+ }
+ }
+
+ function updateCall(returnFiber, current, call, expirationTime) {
+ // TODO: Should this also compare handler to determine whether to reuse?
+ if (current === null || current.tag !== CallComponent) {
+ // Insert
+ var created = createFiberFromCall(
+ call,
+ returnFiber.internalContextTag,
+ expirationTime
+ );
+ created["return"] = returnFiber;
+ return created;
+ } else {
+ // Move based on index
+ var existing = useFiber(current, call, expirationTime);
+ existing["return"] = returnFiber;
+ return existing;
+ }
+ }
+
+ function updateReturn(
+ returnFiber,
+ current,
+ returnNode,
+ expirationTime
+ ) {
+ if (current === null || current.tag !== ReturnComponent) {
+ // Insert
+ var created = createFiberFromReturn(
+ returnNode,
+ returnFiber.internalContextTag,
+ expirationTime
+ );
+ created.type = returnNode.value;
+ created["return"] = returnFiber;
+ return created;
+ } else {
+ // Move based on index
+ var existing = useFiber(current, null, expirationTime);
+ existing.type = returnNode.value;
+ existing["return"] = returnFiber;
+ return existing;
+ }
+ }
+
+ function updatePortal(
+ returnFiber,
+ current,
+ portal,
+ expirationTime
+ ) {
+ if (
+ current === null ||
+ current.tag !== HostPortal ||
+ current.stateNode.containerInfo !== portal.containerInfo ||
+ current.stateNode.implementation !== portal.implementation
+ ) {
+ // Insert
+ var created = createFiberFromPortal(
+ portal,
+ returnFiber.internalContextTag,
+ expirationTime
+ );
+ created["return"] = returnFiber;
+ return created;
+ } else {
+ // Update
+ var existing = useFiber(
+ current,
+ portal.children || [],
+ expirationTime
+ );
+ existing["return"] = returnFiber;
+ return existing;
+ }
+ }
+
+ function updateFragment(
+ returnFiber,
+ current,
+ fragment,
+ expirationTime,
+ key
+ ) {
+ if (current === null || current.tag !== Fragment) {
+ // Insert
+ var created = createFiberFromFragment(
+ fragment,
+ returnFiber.internalContextTag,
+ expirationTime,
+ key
+ );
+ created["return"] = returnFiber;
+ return created;
+ } else {
+ // Update
+ var existing = useFiber(current, fragment, expirationTime);
+ existing["return"] = returnFiber;
+ return existing;
+ }
+ }
+
+ function createChild(returnFiber, newChild, expirationTime) {
+ if (
+ typeof newChild === "string" ||
+ typeof newChild === "number"
+ ) {
+ // Text nodes don't have keys. If the previous node is implicitly keyed
+ // we can continue to replace it without aborting even if it is not a text
+ // node.
+ var created = createFiberFromText(
+ "" + newChild,
+ returnFiber.internalContextTag,
+ expirationTime
+ );
+ created["return"] = returnFiber;
+ return created;
+ }
+
+ if (typeof newChild === "object" && newChild !== null) {
+ switch (newChild.$$typeof) {
+ case REACT_ELEMENT_TYPE: {
+ if (newChild.type === REACT_FRAGMENT_TYPE) {
+ var _created = createFiberFromFragment(
+ newChild.props.children,
+ returnFiber.internalContextTag,
+ expirationTime,
+ newChild.key
+ );
+ _created["return"] = returnFiber;
+ return _created;
+ } else {
+ var _created2 = createFiberFromElement(
+ newChild,
+ returnFiber.internalContextTag,
+ expirationTime
+ );
+ _created2.ref = coerceRef(null, newChild);
+ _created2["return"] = returnFiber;
+ return _created2;
+ }
+ }
+
+ case REACT_CALL_TYPE: {
+ var _created3 = createFiberFromCall(
+ newChild,
+ returnFiber.internalContextTag,
+ expirationTime
+ );
+ _created3["return"] = returnFiber;
+ return _created3;
+ }
+
+ case REACT_RETURN_TYPE: {
+ var _created4 = createFiberFromReturn(
+ newChild,
+ returnFiber.internalContextTag,
+ expirationTime
+ );
+ _created4.type = newChild.value;
+ _created4["return"] = returnFiber;
+ return _created4;
+ }
+
+ case REACT_PORTAL_TYPE: {
+ var _created5 = createFiberFromPortal(
+ newChild,
+ returnFiber.internalContextTag,
+ expirationTime
+ );
+ _created5["return"] = returnFiber;
+ return _created5;
+ }
+ }
+
+ if (isArray$1(newChild) || getIteratorFn(newChild)) {
+ var _created6 = createFiberFromFragment(
+ newChild,
+ returnFiber.internalContextTag,
+ expirationTime,
+ null
+ );
+ _created6["return"] = returnFiber;
+ return _created6;
+ }
+
+ throwOnInvalidObjectType(returnFiber, newChild);
+ }
+
+ {
+ if (typeof newChild === "function") {
+ warnOnFunctionType();
+ }
+ }
+
+ return null;
+ }
+
+ function updateSlot(
+ returnFiber,
+ oldFiber,
+ newChild,
+ expirationTime
+ ) {
+ // Update the fiber if the keys match, otherwise return null.
+
+ var key = oldFiber !== null ? oldFiber.key : null;
+
+ if (
+ typeof newChild === "string" ||
+ typeof newChild === "number"
+ ) {
+ // Text nodes don't have keys. If the previous node is implicitly keyed
+ // we can continue to replace it without aborting even if it is not a text
+ // node.
+ if (key !== null) {
+ return null;
+ }
+ return updateTextNode(
+ returnFiber,
+ oldFiber,
+ "" + newChild,
+ expirationTime
+ );
+ }
+
+ if (typeof newChild === "object" && newChild !== null) {
+ switch (newChild.$$typeof) {
+ case REACT_ELEMENT_TYPE: {
+ if (newChild.key === key) {
+ if (newChild.type === REACT_FRAGMENT_TYPE) {
+ return updateFragment(
+ returnFiber,
+ oldFiber,
+ newChild.props.children,
+ expirationTime,
+ key
+ );
+ }
+ return updateElement(
+ returnFiber,
+ oldFiber,
+ newChild,
+ expirationTime
+ );
+ } else {
+ return null;
+ }
+ }
+
+ case REACT_CALL_TYPE: {
+ if (newChild.key === key) {
+ return updateCall(
+ returnFiber,
+ oldFiber,
+ newChild,
+ expirationTime
+ );
+ } else {
+ return null;
+ }
+ }
+
+ case REACT_RETURN_TYPE: {
+ // Returns don't have keys. If the previous node is implicitly keyed
+ // we can continue to replace it without aborting even if it is not a
+ // yield.
+ if (key === null) {
+ return updateReturn(
+ returnFiber,
+ oldFiber,
+ newChild,
+ expirationTime
+ );
+ } else {
+ return null;
+ }
+ }
+
+ case REACT_PORTAL_TYPE: {
+ if (newChild.key === key) {
+ return updatePortal(
+ returnFiber,
+ oldFiber,
+ newChild,
+ expirationTime
+ );
+ } else {
+ return null;
+ }
+ }
+ }
+
+ if (isArray$1(newChild) || getIteratorFn(newChild)) {
+ if (key !== null) {
+ return null;
+ }
+
+ return updateFragment(
+ returnFiber,
+ oldFiber,
+ newChild,
+ expirationTime,
+ null
+ );
+ }
+
+ throwOnInvalidObjectType(returnFiber, newChild);
+ }
+
+ {
+ if (typeof newChild === "function") {
+ warnOnFunctionType();
+ }
+ }
+
+ return null;
+ }
+
+ function updateFromMap(
+ existingChildren,
+ returnFiber,
+ newIdx,
+ newChild,
+ expirationTime
+ ) {
+ if (
+ typeof newChild === "string" ||
+ typeof newChild === "number"
+ ) {
+ // Text nodes don't have keys, so we neither have to check the old nor
+ // new node for the key. If both are text nodes, they match.
+ var matchedFiber = existingChildren.get(newIdx) || null;
+ return updateTextNode(
+ returnFiber,
+ matchedFiber,
+ "" + newChild,
+ expirationTime
+ );
+ }
+
+ if (typeof newChild === "object" && newChild !== null) {
+ switch (newChild.$$typeof) {
+ case REACT_ELEMENT_TYPE: {
+ var _matchedFiber =
+ existingChildren.get(
+ newChild.key === null ? newIdx : newChild.key
+ ) || null;
+ if (newChild.type === REACT_FRAGMENT_TYPE) {
+ return updateFragment(
+ returnFiber,
+ _matchedFiber,
+ newChild.props.children,
+ expirationTime,
+ newChild.key
+ );
+ }
+ return updateElement(
+ returnFiber,
+ _matchedFiber,
+ newChild,
+ expirationTime
+ );
+ }
+
+ case REACT_CALL_TYPE: {
+ var _matchedFiber2 =
+ existingChildren.get(
+ newChild.key === null ? newIdx : newChild.key
+ ) || null;
+ return updateCall(
+ returnFiber,
+ _matchedFiber2,
+ newChild,
+ expirationTime
+ );
+ }
+
+ case REACT_RETURN_TYPE: {
+ // Returns don't have keys, so we neither have to check the old nor
+ // new node for the key. If both are returns, they match.
+ var _matchedFiber3 = existingChildren.get(newIdx) || null;
+ return updateReturn(
+ returnFiber,
+ _matchedFiber3,
+ newChild,
+ expirationTime
+ );
+ }
+
+ case REACT_PORTAL_TYPE: {
+ var _matchedFiber4 =
+ existingChildren.get(
+ newChild.key === null ? newIdx : newChild.key
+ ) || null;
+ return updatePortal(
+ returnFiber,
+ _matchedFiber4,
+ newChild,
+ expirationTime
+ );
+ }
+ }
+
+ if (isArray$1(newChild) || getIteratorFn(newChild)) {
+ var _matchedFiber5 = existingChildren.get(newIdx) || null;
+ return updateFragment(
+ returnFiber,
+ _matchedFiber5,
+ newChild,
+ expirationTime,
+ null
+ );
+ }
+
+ throwOnInvalidObjectType(returnFiber, newChild);
+ }
+
+ {
+ if (typeof newChild === "function") {
+ warnOnFunctionType();
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Warns if there is a duplicate or missing key
+ */
+ function warnOnInvalidKey(child, knownKeys) {
+ {
+ if (typeof child !== "object" || child === null) {
+ return knownKeys;
+ }
+ switch (child.$$typeof) {
+ case REACT_ELEMENT_TYPE:
+ case REACT_CALL_TYPE:
+ case REACT_PORTAL_TYPE:
+ warnForMissingKey(child);
+ var key = child.key;
+ if (typeof key !== "string") {
+ break;
+ }
+ if (knownKeys === null) {
+ knownKeys = new Set();
+ knownKeys.add(key);
+ break;
+ }
+ if (!knownKeys.has(key)) {
+ knownKeys.add(key);
+ break;
+ }
+ warning(
+ false,
+ "Encountered two children with the same key, `%s`. " +
+ "Keys should be unique so that components maintain their identity " +
+ "across updates. Non-unique keys may cause children to be " +
+ "duplicated and/or omitted — the behavior is unsupported and " +
+ "could change in a future version.%s",
+ key,
+ getCurrentFiberStackAddendum$1()
+ );
+ break;
+ default:
+ break;
+ }
+ }
+ return knownKeys;
+ }
+
+ function reconcileChildrenArray(
+ returnFiber,
+ currentFirstChild,
+ newChildren,
+ expirationTime
+ ) {
+ // This algorithm can't optimize by searching from boths ends since we
+ // don't have backpointers on fibers. I'm trying to see how far we can get
+ // with that model. If it ends up not being worth the tradeoffs, we can
+ // add it later.
+
+ // Even with a two ended optimization, we'd want to optimize for the case
+ // where there are few changes and brute force the comparison instead of
+ // going for the Map. It'd like to explore hitting that path first in
+ // forward-only mode and only go for the Map once we notice that we need
+ // lots of look ahead. This doesn't handle reversal as well as two ended
+ // search but that's unusual. Besides, for the two ended optimization to
+ // work on Iterables, we'd need to copy the whole set.
+
+ // In this first iteration, we'll just live with hitting the bad case
+ // (adding everything to a Map) in for every insert/move.
+
+ // If you change this code, also update reconcileChildrenIterator() which
+ // uses the same algorithm.
+
+ {
+ // First, validate keys.
+ var knownKeys = null;
+ for (var i = 0; i < newChildren.length; i++) {
+ var child = newChildren[i];
+ knownKeys = warnOnInvalidKey(child, knownKeys);
+ }
+ }
+
+ var resultingFirstChild = null;
+ var previousNewFiber = null;
+
+ var oldFiber = currentFirstChild;
+ var lastPlacedIndex = 0;
+ var newIdx = 0;
+ var nextOldFiber = null;
+ for (
+ ;
+ oldFiber !== null && newIdx < newChildren.length;
+ newIdx++
+ ) {
+ if (oldFiber.index > newIdx) {
+ nextOldFiber = oldFiber;
+ oldFiber = null;
+ } else {
+ nextOldFiber = oldFiber.sibling;
+ }
+ var newFiber = updateSlot(
+ returnFiber,
+ oldFiber,
+ newChildren[newIdx],
+ expirationTime
+ );
+ if (newFiber === null) {
+ // TODO: This breaks on empty slots like null children. That's
+ // unfortunate because it triggers the slow path all the time. We need
+ // a better way to communicate whether this was a miss or null,
+ // boolean, undefined, etc.
+ if (oldFiber === null) {
+ oldFiber = nextOldFiber;
+ }
+ break;
+ }
+ if (shouldTrackSideEffects) {
+ if (oldFiber && newFiber.alternate === null) {
+ // We matched the slot, but we didn't reuse the existing fiber, so we
+ // need to delete the existing child.
+ deleteChild(returnFiber, oldFiber);
+ }
+ }
+ lastPlacedIndex = placeChild(
+ newFiber,
+ lastPlacedIndex,
+ newIdx
+ );
+ if (previousNewFiber === null) {
+ // TODO: Move out of the loop. This only happens for the first run.
+ resultingFirstChild = newFiber;
+ } else {
+ // TODO: Defer siblings if we're not at the right index for this slot.
+ // I.e. if we had null values before, then we want to defer this
+ // for each null value. However, we also don't want to call updateSlot
+ // with the previous one.
+ previousNewFiber.sibling = newFiber;
+ }
+ previousNewFiber = newFiber;
+ oldFiber = nextOldFiber;
+ }
+
+ if (newIdx === newChildren.length) {
+ // We've reached the end of the new children. We can delete the rest.
+ deleteRemainingChildren(returnFiber, oldFiber);
+ return resultingFirstChild;
+ }
+
+ if (oldFiber === null) {
+ // If we don't have any more existing children we can choose a fast path
+ // since the rest will all be insertions.
+ for (; newIdx < newChildren.length; newIdx++) {
+ var _newFiber = createChild(
+ returnFiber,
+ newChildren[newIdx],
+ expirationTime
+ );
+ if (!_newFiber) {
+ continue;
+ }
+ lastPlacedIndex = placeChild(
+ _newFiber,
+ lastPlacedIndex,
+ newIdx
+ );
+ if (previousNewFiber === null) {
+ // TODO: Move out of the loop. This only happens for the first run.
+ resultingFirstChild = _newFiber;
+ } else {
+ previousNewFiber.sibling = _newFiber;
+ }
+ previousNewFiber = _newFiber;
+ }
+ return resultingFirstChild;
+ }
+
+ // Add all children to a key map for quick lookups.
+ var existingChildren = mapRemainingChildren(
+ returnFiber,
+ oldFiber
+ );
+
+ // Keep scanning and use the map to restore deleted items as moves.
+ for (; newIdx < newChildren.length; newIdx++) {
+ var _newFiber2 = updateFromMap(
+ existingChildren,
+ returnFiber,
+ newIdx,
+ newChildren[newIdx],
+ expirationTime
+ );
+ if (_newFiber2) {
+ if (shouldTrackSideEffects) {
+ if (_newFiber2.alternate !== null) {
+ // The new fiber is a work in progress, but if there exists a
+ // current, that means that we reused the fiber. We need to delete
+ // it from the child list so that we don't add it to the deletion
+ // list.
+ existingChildren["delete"](
+ _newFiber2.key === null ? newIdx : _newFiber2.key
+ );
+ }
+ }
+ lastPlacedIndex = placeChild(
+ _newFiber2,
+ lastPlacedIndex,
+ newIdx
+ );
+ if (previousNewFiber === null) {
+ resultingFirstChild = _newFiber2;
+ } else {
+ previousNewFiber.sibling = _newFiber2;
+ }
+ previousNewFiber = _newFiber2;
+ }
+ }
+
+ if (shouldTrackSideEffects) {
+ // Any existing children that weren't consumed above were deleted. We need
+ // to add them to the deletion list.
+ existingChildren.forEach(function(child) {
+ return deleteChild(returnFiber, child);
+ });
+ }
+
+ return resultingFirstChild;
+ }
+
+ function reconcileChildrenIterator(
+ returnFiber,
+ currentFirstChild,
+ newChildrenIterable,
+ expirationTime
+ ) {
+ // This is the same implementation as reconcileChildrenArray(),
+ // but using the iterator instead.
+
+ var iteratorFn = getIteratorFn(newChildrenIterable);
+ !(typeof iteratorFn === "function")
+ ? invariant(
+ false,
+ "An object is not an iterable. This error is likely caused by a bug in React. Please file an issue."
+ )
+ : void 0;
+
+ {
+ // Warn about using Maps as children
+ if (typeof newChildrenIterable.entries === "function") {
+ var possibleMap = newChildrenIterable;
+ if (possibleMap.entries === iteratorFn) {
+ warning(
+ didWarnAboutMaps,
+ "Using Maps as children is unsupported and will likely yield " +
+ "unexpected results. Convert it to a sequence/iterable of keyed " +
+ "ReactElements instead.%s",
+ getCurrentFiberStackAddendum$1()
+ );
+ didWarnAboutMaps = true;
+ }
+ }
+
+ // First, validate keys.
+ // We'll get a different iterator later for the main pass.
+ var _newChildren = iteratorFn.call(newChildrenIterable);
+ if (_newChildren) {
+ var knownKeys = null;
+ var _step = _newChildren.next();
+ for (; !_step.done; _step = _newChildren.next()) {
+ var child = _step.value;
+ knownKeys = warnOnInvalidKey(child, knownKeys);
+ }
+ }
+ }
+
+ var newChildren = iteratorFn.call(newChildrenIterable);
+ !(newChildren != null)
+ ? invariant(false, "An iterable object provided no iterator.")
+ : void 0;
+
+ var resultingFirstChild = null;
+ var previousNewFiber = null;
+
+ var oldFiber = currentFirstChild;
+ var lastPlacedIndex = 0;
+ var newIdx = 0;
+ var nextOldFiber = null;
+
+ var step = newChildren.next();
+ for (
+ ;
+ oldFiber !== null && !step.done;
+ newIdx++, step = newChildren.next()
+ ) {
+ if (oldFiber.index > newIdx) {
+ nextOldFiber = oldFiber;
+ oldFiber = null;
+ } else {
+ nextOldFiber = oldFiber.sibling;
+ }
+ var newFiber = updateSlot(
+ returnFiber,
+ oldFiber,
+ step.value,
+ expirationTime
+ );
+ if (newFiber === null) {
+ // TODO: This breaks on empty slots like null children. That's
+ // unfortunate because it triggers the slow path all the time. We need
+ // a better way to communicate whether this was a miss or null,
+ // boolean, undefined, etc.
+ if (!oldFiber) {
+ oldFiber = nextOldFiber;
+ }
+ break;
+ }
+ if (shouldTrackSideEffects) {
+ if (oldFiber && newFiber.alternate === null) {
+ // We matched the slot, but we didn't reuse the existing fiber, so we
+ // need to delete the existing child.
+ deleteChild(returnFiber, oldFiber);
+ }
+ }
+ lastPlacedIndex = placeChild(
+ newFiber,
+ lastPlacedIndex,
+ newIdx
+ );
+ if (previousNewFiber === null) {
+ // TODO: Move out of the loop. This only happens for the first run.
+ resultingFirstChild = newFiber;
+ } else {
+ // TODO: Defer siblings if we're not at the right index for this slot.
+ // I.e. if we had null values before, then we want to defer this
+ // for each null value. However, we also don't want to call updateSlot
+ // with the previous one.
+ previousNewFiber.sibling = newFiber;
+ }
+ previousNewFiber = newFiber;
+ oldFiber = nextOldFiber;
+ }
+
+ if (step.done) {
+ // We've reached the end of the new children. We can delete the rest.
+ deleteRemainingChildren(returnFiber, oldFiber);
+ return resultingFirstChild;
+ }
+
+ if (oldFiber === null) {
+ // If we don't have any more existing children we can choose a fast path
+ // since the rest will all be insertions.
+ for (; !step.done; newIdx++, step = newChildren.next()) {
+ var _newFiber3 = createChild(
+ returnFiber,
+ step.value,
+ expirationTime
+ );
+ if (_newFiber3 === null) {
+ continue;
+ }
+ lastPlacedIndex = placeChild(
+ _newFiber3,
+ lastPlacedIndex,
+ newIdx
+ );
+ if (previousNewFiber === null) {
+ // TODO: Move out of the loop. This only happens for the first run.
+ resultingFirstChild = _newFiber3;
+ } else {
+ previousNewFiber.sibling = _newFiber3;
+ }
+ previousNewFiber = _newFiber3;
+ }
+ return resultingFirstChild;
+ }
+
+ // Add all children to a key map for quick lookups.
+ var existingChildren = mapRemainingChildren(
+ returnFiber,
+ oldFiber
+ );
+
+ // Keep scanning and use the map to restore deleted items as moves.
+ for (; !step.done; newIdx++, step = newChildren.next()) {
+ var _newFiber4 = updateFromMap(
+ existingChildren,
+ returnFiber,
+ newIdx,
+ step.value,
+ expirationTime
+ );
+ if (_newFiber4 !== null) {
+ if (shouldTrackSideEffects) {
+ if (_newFiber4.alternate !== null) {
+ // The new fiber is a work in progress, but if there exists a
+ // current, that means that we reused the fiber. We need to delete
+ // it from the child list so that we don't add it to the deletion
+ // list.
+ existingChildren["delete"](
+ _newFiber4.key === null ? newIdx : _newFiber4.key
+ );
+ }
+ }
+ lastPlacedIndex = placeChild(
+ _newFiber4,
+ lastPlacedIndex,
+ newIdx
+ );
+ if (previousNewFiber === null) {
+ resultingFirstChild = _newFiber4;
+ } else {
+ previousNewFiber.sibling = _newFiber4;
+ }
+ previousNewFiber = _newFiber4;
+ }
+ }
+
+ if (shouldTrackSideEffects) {
+ // Any existing children that weren't consumed above were deleted. We need
+ // to add them to the deletion list.
+ existingChildren.forEach(function(child) {
+ return deleteChild(returnFiber, child);
+ });
+ }
+
+ return resultingFirstChild;
+ }
+
+ function reconcileSingleTextNode(
+ returnFiber,
+ currentFirstChild,
+ textContent,
+ expirationTime
+ ) {
+ // There's no need to check for keys on text nodes since we don't have a
+ // way to define them.
+ if (
+ currentFirstChild !== null &&
+ currentFirstChild.tag === HostText
+ ) {
+ // We already have an existing node so let's just update it and delete
+ // the rest.
+ deleteRemainingChildren(
+ returnFiber,
+ currentFirstChild.sibling
+ );
+ var existing = useFiber(
+ currentFirstChild,
+ textContent,
+ expirationTime
+ );
+ existing["return"] = returnFiber;
+ return existing;
+ }
+ // The existing first child is not a text node so we need to create one
+ // and delete the existing ones.
+ deleteRemainingChildren(returnFiber, currentFirstChild);
+ var created = createFiberFromText(
+ textContent,
+ returnFiber.internalContextTag,
+ expirationTime
+ );
+ created["return"] = returnFiber;
+ return created;
+ }
+
+ function reconcileSingleElement(
+ returnFiber,
+ currentFirstChild,
+ element,
+ expirationTime
+ ) {
+ var key = element.key;
+ var child = currentFirstChild;
+ while (child !== null) {
+ // TODO: If key === null and child.key === null, then this only applies to
+ // the first item in the list.
+ if (child.key === key) {
+ if (
+ child.tag === Fragment
+ ? element.type === REACT_FRAGMENT_TYPE
+ : child.type === element.type
+ ) {
+ deleteRemainingChildren(returnFiber, child.sibling);
+ var existing = useFiber(
+ child,
+ element.type === REACT_FRAGMENT_TYPE
+ ? element.props.children
+ : element.props,
+ expirationTime
+ );
+ existing.ref = coerceRef(child, element);
+ existing["return"] = returnFiber;
+ {
+ existing._debugSource = element._source;
+ existing._debugOwner = element._owner;
+ }
+ return existing;
+ } else {
+ deleteRemainingChildren(returnFiber, child);
+ break;
+ }
+ } else {
+ deleteChild(returnFiber, child);
+ }
+ child = child.sibling;
+ }
+
+ if (element.type === REACT_FRAGMENT_TYPE) {
+ var created = createFiberFromFragment(
+ element.props.children,
+ returnFiber.internalContextTag,
+ expirationTime,
+ element.key
+ );
+ created["return"] = returnFiber;
+ return created;
+ } else {
+ var _created7 = createFiberFromElement(
+ element,
+ returnFiber.internalContextTag,
+ expirationTime
+ );
+ _created7.ref = coerceRef(currentFirstChild, element);
+ _created7["return"] = returnFiber;
+ return _created7;
+ }
+ }
+
+ function reconcileSingleCall(
+ returnFiber,
+ currentFirstChild,
+ call,
+ expirationTime
+ ) {
+ var key = call.key;
+ var child = currentFirstChild;
+ while (child !== null) {
+ // TODO: If key === null and child.key === null, then this only applies to
+ // the first item in the list.
+ if (child.key === key) {
+ if (child.tag === CallComponent) {
+ deleteRemainingChildren(returnFiber, child.sibling);
+ var existing = useFiber(child, call, expirationTime);
+ existing["return"] = returnFiber;
+ return existing;
+ } else {
+ deleteRemainingChildren(returnFiber, child);
+ break;
+ }
+ } else {
+ deleteChild(returnFiber, child);
+ }
+ child = child.sibling;
+ }
+
+ var created = createFiberFromCall(
+ call,
+ returnFiber.internalContextTag,
+ expirationTime
+ );
+ created["return"] = returnFiber;
+ return created;
+ }
+
+ function reconcileSingleReturn(
+ returnFiber,
+ currentFirstChild,
+ returnNode,
+ expirationTime
+ ) {
+ // There's no need to check for keys on yields since they're stateless.
+ var child = currentFirstChild;
+ if (child !== null) {
+ if (child.tag === ReturnComponent) {
+ deleteRemainingChildren(returnFiber, child.sibling);
+ var existing = useFiber(child, null, expirationTime);
+ existing.type = returnNode.value;
+ existing["return"] = returnFiber;
+ return existing;
+ } else {
+ deleteRemainingChildren(returnFiber, child);
+ }
+ }
+
+ var created = createFiberFromReturn(
+ returnNode,
+ returnFiber.internalContextTag,
+ expirationTime
+ );
+ created.type = returnNode.value;
+ created["return"] = returnFiber;
+ return created;
+ }
+
+ function reconcileSinglePortal(
+ returnFiber,
+ currentFirstChild,
+ portal,
+ expirationTime
+ ) {
+ var key = portal.key;
+ var child = currentFirstChild;
+ while (child !== null) {
+ // TODO: If key === null and child.key === null, then this only applies to
+ // the first item in the list.
+ if (child.key === key) {
+ if (
+ child.tag === HostPortal &&
+ child.stateNode.containerInfo === portal.containerInfo &&
+ child.stateNode.implementation === portal.implementation
+ ) {
+ deleteRemainingChildren(returnFiber, child.sibling);
+ var existing = useFiber(
+ child,
+ portal.children || [],
+ expirationTime
+ );
+ existing["return"] = returnFiber;
+ return existing;
+ } else {
+ deleteRemainingChildren(returnFiber, child);
+ break;
+ }
+ } else {
+ deleteChild(returnFiber, child);
+ }
+ child = child.sibling;
+ }
+
+ var created = createFiberFromPortal(
+ portal,
+ returnFiber.internalContextTag,
+ expirationTime
+ );
+ created["return"] = returnFiber;
+ return created;
+ }
+
+ // This API will tag the children with the side-effect of the reconciliation
+ // itself. They will be added to the side-effect list as we pass through the
+ // children and the parent.
+ function reconcileChildFibers(
+ returnFiber,
+ currentFirstChild,
+ newChild,
+ expirationTime
+ ) {
+ // This function is not recursive.
+ // If the top level item is an array, we treat it as a set of children,
+ // not as a fragment. Nested arrays on the other hand will be treated as
+ // fragment nodes. Recursion happens at the normal flow.
+
+ // Handle top level unkeyed fragments as if they were arrays.
+ // This leads to an ambiguity between <>{[...]}</> and <>...</>.
+ // We treat the ambiguous cases above the same.
+ if (
+ typeof newChild === "object" &&
+ newChild !== null &&
+ newChild.type === REACT_FRAGMENT_TYPE &&
+ newChild.key === null
+ ) {
+ newChild = newChild.props.children;
+ }
+
+ // Handle object types
+ var isObject =
+ typeof newChild === "object" && newChild !== null;
+
+ if (isObject) {
+ switch (newChild.$$typeof) {
+ case REACT_ELEMENT_TYPE:
+ return placeSingleChild(
+ reconcileSingleElement(
+ returnFiber,
+ currentFirstChild,
+ newChild,
+ expirationTime
+ )
+ );
+
+ case REACT_CALL_TYPE:
+ return placeSingleChild(
+ reconcileSingleCall(
+ returnFiber,
+ currentFirstChild,
+ newChild,
+ expirationTime
+ )
+ );
+ case REACT_RETURN_TYPE:
+ return placeSingleChild(
+ reconcileSingleReturn(
+ returnFiber,
+ currentFirstChild,
+ newChild,
+ expirationTime
+ )
+ );
+ case REACT_PORTAL_TYPE:
+ return placeSingleChild(
+ reconcileSinglePortal(
+ returnFiber,
+ currentFirstChild,
+ newChild,
+ expirationTime
+ )
+ );
+ }
+ }
+
+ if (
+ typeof newChild === "string" ||
+ typeof newChild === "number"
+ ) {
+ return placeSingleChild(
+ reconcileSingleTextNode(
+ returnFiber,
+ currentFirstChild,
+ "" + newChild,
+ expirationTime
+ )
+ );
+ }
+
+ if (isArray$1(newChild)) {
+ return reconcileChildrenArray(
+ returnFiber,
+ currentFirstChild,
+ newChild,
+ expirationTime
+ );
+ }
+
+ if (getIteratorFn(newChild)) {
+ return reconcileChildrenIterator(
+ returnFiber,
+ currentFirstChild,
+ newChild,
+ expirationTime
+ );
+ }
+
+ if (isObject) {
+ throwOnInvalidObjectType(returnFiber, newChild);
+ }
+
+ {
+ if (typeof newChild === "function") {
+ warnOnFunctionType();
+ }
+ }
+ if (typeof newChild === "undefined") {
+ // If the new child is undefined, and the return fiber is a composite
+ // component, throw an error. If Fiber return types are disabled,
+ // we already threw above.
+ switch (returnFiber.tag) {
+ case ClassComponent: {
+ {
+ var instance = returnFiber.stateNode;
+ if (instance.render._isMockFunction) {
+ // We allow auto-mocks to proceed as if they're returning null.
+ break;
+ }
+ }
+ }
+ // Intentionally fall through to the next case, which handles both
+ // functions and classes
+ // eslint-disable-next-lined no-fallthrough
+ case FunctionalComponent: {
+ var Component = returnFiber.type;
+ invariant(
+ false,
+ "%s(...): Nothing was returned from render. This usually means a return statement is missing. Or, to render nothing, return null.",
+ Component.displayName || Component.name || "Component"
+ );
+ }
+ }
+ }
+
+ // Remaining cases are all treated as empty.
+ return deleteRemainingChildren(returnFiber, currentFirstChild);
+ }
+
+ return reconcileChildFibers;
+ }
+
+ var reconcileChildFibers = ChildReconciler(true);
+ var mountChildFibers = ChildReconciler(false);
+
+ function cloneChildFibers(current, workInProgress) {
+ !(current === null || workInProgress.child === current.child)
+ ? invariant(false, "Resuming work not yet implemented.")
+ : void 0;
+
+ if (workInProgress.child === null) {
+ return;
+ }
+
+ var currentChild = workInProgress.child;
+ var newChild = createWorkInProgress(
+ currentChild,
+ currentChild.pendingProps,
+ currentChild.expirationTime
+ );
+ workInProgress.child = newChild;
+
+ newChild["return"] = workInProgress;
+ while (currentChild.sibling !== null) {
+ currentChild = currentChild.sibling;
+ newChild = newChild.sibling = createWorkInProgress(
+ currentChild,
+ currentChild.pendingProps,
+ currentChild.expirationTime
+ );
+ newChild["return"] = workInProgress;
+ }
+ newChild.sibling = null;
+ }
+
+ {
+ var warnedAboutStatelessRefs = {};
+ }
+
+ var ReactFiberBeginWork = function(
+ config,
+ hostContext,
+ hydrationContext,
+ scheduleWork,
+ computeExpirationForFiber
+ ) {
+ var shouldSetTextContent = config.shouldSetTextContent,
+ useSyncScheduling = config.useSyncScheduling,
+ shouldDeprioritizeSubtree = config.shouldDeprioritizeSubtree;
+ var pushHostContext = hostContext.pushHostContext,
+ pushHostContainer = hostContext.pushHostContainer;
+ var enterHydrationState = hydrationContext.enterHydrationState,
+ resetHydrationState = hydrationContext.resetHydrationState,
+ tryToClaimNextHydratableInstance =
+ hydrationContext.tryToClaimNextHydratableInstance;
+
+ var _ReactFiberClassCompo = ReactFiberClassComponent(
+ scheduleWork,
+ computeExpirationForFiber,
+ memoizeProps,
+ memoizeState
+ ),
+ adoptClassInstance = _ReactFiberClassCompo.adoptClassInstance,
+ constructClassInstance =
+ _ReactFiberClassCompo.constructClassInstance,
+ mountClassInstance = _ReactFiberClassCompo.mountClassInstance,
+ updateClassInstance = _ReactFiberClassCompo.updateClassInstance;
+
+ // TODO: Remove this and use reconcileChildrenAtExpirationTime directly.
+
+ function reconcileChildren(
+ current,
+ workInProgress,
+ nextChildren
+ ) {
+ reconcileChildrenAtExpirationTime(
+ current,
+ workInProgress,
+ nextChildren,
+ workInProgress.expirationTime
+ );
+ }
+
+ function reconcileChildrenAtExpirationTime(
+ current,
+ workInProgress,
+ nextChildren,
+ renderExpirationTime
+ ) {
+ if (current === null) {
+ // If this is a fresh new component that hasn't been rendered yet, we
+ // won't update its child set by applying minimal side-effects. Instead,
+ // we will add them all to the child before it gets rendered. That means
+ // we can optimize this reconciliation pass by not tracking side-effects.
+ workInProgress.child = mountChildFibers(
+ workInProgress,
+ null,
+ nextChildren,
+ renderExpirationTime
+ );
+ } else {
+ // If the current child is the same as the work in progress, it means that
+ // we haven't yet started any work on these children. Therefore, we use
+ // the clone algorithm to create a copy of all the current children.
+
+ // If we had any progressed work already, that is invalid at this point so
+ // let's throw it out.
+ workInProgress.child = reconcileChildFibers(
+ workInProgress,
+ current.child,
+ nextChildren,
+ renderExpirationTime
+ );
+ }
+ }
+
+ function updateFragment(current, workInProgress) {
+ var nextChildren = workInProgress.pendingProps;
+ if (hasContextChanged()) {
+ // Normally we can bail out on props equality but if context has changed
+ // we don't do the bailout and we have to reuse existing props instead.
+ if (nextChildren === null) {
+ nextChildren = workInProgress.memoizedProps;
+ }
+ } else if (
+ nextChildren === null ||
+ workInProgress.memoizedProps === nextChildren
+ ) {
+ return bailoutOnAlreadyFinishedWork(current, workInProgress);
+ }
+ reconcileChildren(current, workInProgress, nextChildren);
+ memoizeProps(workInProgress, nextChildren);
+ return workInProgress.child;
+ }
+
+ function markRef(current, workInProgress) {
+ var ref = workInProgress.ref;
+ if (ref !== null && (!current || current.ref !== ref)) {
+ // Schedule a Ref effect
+ workInProgress.effectTag |= Ref;
+ }
+ }
+
+ function updateFunctionalComponent(current, workInProgress) {
+ var fn = workInProgress.type;
+ var nextProps = workInProgress.pendingProps;
+
+ var memoizedProps = workInProgress.memoizedProps;
+ if (hasContextChanged()) {
+ // Normally we can bail out on props equality but if context has changed
+ // we don't do the bailout and we have to reuse existing props instead.
+ if (nextProps === null) {
+ nextProps = memoizedProps;
+ }
+ } else {
+ if (nextProps === null || memoizedProps === nextProps) {
+ return bailoutOnAlreadyFinishedWork(
+ current,
+ workInProgress
+ );
+ }
+ // TODO: consider bringing fn.shouldComponentUpdate() back.
+ // It used to be here.
+ }
+
+ var unmaskedContext = getUnmaskedContext(workInProgress);
+ var context = getMaskedContext(workInProgress, unmaskedContext);
+
+ var nextChildren;
+
+ {
+ ReactCurrentOwner.current = workInProgress;
+ ReactDebugCurrentFiber.setCurrentPhase("render");
+ nextChildren = fn(nextProps, context);
+ ReactDebugCurrentFiber.setCurrentPhase(null);
+ }
+ // React DevTools reads this flag.
+ workInProgress.effectTag |= PerformedWork;
+ reconcileChildren(current, workInProgress, nextChildren);
+ memoizeProps(workInProgress, nextProps);
+ return workInProgress.child;
+ }
+
+ function updateClassComponent(
+ current,
+ workInProgress,
+ renderExpirationTime
+ ) {
+ // Push context providers early to prevent context stack mismatches.
+ // During mounting we don't know the child context yet as the instance doesn't exist.
+ // We will invalidate the child context in finishClassComponent() right after rendering.
+ var hasContext = pushContextProvider(workInProgress);
+
+ var shouldUpdate = void 0;
+ if (current === null) {
+ if (!workInProgress.stateNode) {
+ // In the initial pass we might need to construct the instance.
+ constructClassInstance(
+ workInProgress,
+ workInProgress.pendingProps
+ );
+ mountClassInstance(workInProgress, renderExpirationTime);
+ shouldUpdate = true;
+ } else {
+ invariant(false, "Resuming work not yet implemented.");
+ // In a resume, we'll already have an instance we can reuse.
+ // shouldUpdate = resumeMountClassInstance(workInProgress, renderExpirationTime);
+ }
+ } else {
+ shouldUpdate = updateClassInstance(
+ current,
+ workInProgress,
+ renderExpirationTime
+ );
+ }
+ return finishClassComponent(
+ current,
+ workInProgress,
+ shouldUpdate,
+ hasContext
+ );
+ }
+
+ function finishClassComponent(
+ current,
+ workInProgress,
+ shouldUpdate,
+ hasContext
+ ) {
+ // Refs should update even if shouldComponentUpdate returns false
+ markRef(current, workInProgress);
+
+ if (!shouldUpdate) {
+ // Context providers should defer to sCU for rendering
+ if (hasContext) {
+ invalidateContextProvider(workInProgress, false);
+ }
+
+ return bailoutOnAlreadyFinishedWork(current, workInProgress);
+ }
+
+ var instance = workInProgress.stateNode;
+
+ // Rerender
+ ReactCurrentOwner.current = workInProgress;
+ var nextChildren = void 0;
+ {
+ ReactDebugCurrentFiber.setCurrentPhase("render");
+ nextChildren = instance.render();
+ if (debugRenderPhaseSideEffects) {
+ instance.render();
+ }
+ ReactDebugCurrentFiber.setCurrentPhase(null);
+ }
+ // React DevTools reads this flag.
+ workInProgress.effectTag |= PerformedWork;
+ reconcileChildren(current, workInProgress, nextChildren);
+ // Memoize props and state using the values we just used to render.
+ // TODO: Restructure so we never read values from the instance.
+ memoizeState(workInProgress, instance.state);
+ memoizeProps(workInProgress, instance.props);
+
+ // The context might have changed so we need to recalculate it.
+ if (hasContext) {
+ invalidateContextProvider(workInProgress, true);
+ }
+
+ return workInProgress.child;
+ }
+
+ function pushHostRootContext(workInProgress) {
+ var root = workInProgress.stateNode;
+ if (root.pendingContext) {
+ pushTopLevelContextObject(
+ workInProgress,
+ root.pendingContext,
+ root.pendingContext !== root.context
+ );
+ } else if (root.context) {
+ // Should always be set
+ pushTopLevelContextObject(
+ workInProgress,
+ root.context,
+ false
+ );
+ }
+ pushHostContainer(workInProgress, root.containerInfo);
+ }
+
+ function updateHostRoot(
+ current,
+ workInProgress,
+ renderExpirationTime
+ ) {
+ pushHostRootContext(workInProgress);
+ var updateQueue = workInProgress.updateQueue;
+ if (updateQueue !== null) {
+ var prevState = workInProgress.memoizedState;
+ var state = processUpdateQueue(
+ current,
+ workInProgress,
+ updateQueue,
+ null,
+ null,
+ renderExpirationTime
+ );
+ if (prevState === state) {
+ // If the state is the same as before, that's a bailout because we had
+ // no work that expires at this time.
+ resetHydrationState();
+ return bailoutOnAlreadyFinishedWork(
+ current,
+ workInProgress
+ );
+ }
+ var element = state.element;
+ var root = workInProgress.stateNode;
+ if (
+ (current === null || current.child === null) &&
+ root.hydrate &&
+ enterHydrationState(workInProgress)
+ ) {
+ // If we don't have any current children this might be the first pass.
+ // We always try to hydrate. If this isn't a hydration pass there won't
+ // be any children to hydrate which is effectively the same thing as
+ // not hydrating.
+
+ // This is a bit of a hack. We track the host root as a placement to
+ // know that we're currently in a mounting state. That way isMounted
+ // works as expected. We must reset this before committing.
+ // TODO: Delete this when we delete isMounted and findDOMNode.
+ workInProgress.effectTag |= Placement;
+
+ // Ensure that children mount into this root without tracking
+ // side-effects. This ensures that we don't store Placement effects on
+ // nodes that will be hydrated.
+ workInProgress.child = mountChildFibers(
+ workInProgress,
+ null,
+ element,
+ renderExpirationTime
+ );
+ } else {
+ // Otherwise reset hydration state in case we aborted and resumed another
+ // root.
+ resetHydrationState();
+ reconcileChildren(current, workInProgress, element);
+ }
+ memoizeState(workInProgress, state);
+ return workInProgress.child;
+ }
+ resetHydrationState();
+ // If there is no update queue, that's a bailout because the root has no props.
+ return bailoutOnAlreadyFinishedWork(current, workInProgress);
+ }
+
+ function updateHostComponent(
+ current,
+ workInProgress,
+ renderExpirationTime
+ ) {
+ pushHostContext(workInProgress);
+
+ if (current === null) {
+ tryToClaimNextHydratableInstance(workInProgress);
+ }
+
+ var type = workInProgress.type;
+ var memoizedProps = workInProgress.memoizedProps;
+ var nextProps = workInProgress.pendingProps;
+ if (nextProps === null) {
+ nextProps = memoizedProps;
+ !(nextProps !== null)
+ ? invariant(
+ false,
+ "We should always have pending or current props. This error is likely caused by a bug in React. Please file an issue."
+ )
+ : void 0;
+ }
+ var prevProps = current !== null ? current.memoizedProps : null;
+
+ if (hasContextChanged()) {
+ // Normally we can bail out on props equality but if context has changed
+ // we don't do the bailout and we have to reuse existing props instead.
+ } else if (nextProps === null || memoizedProps === nextProps) {
+ return bailoutOnAlreadyFinishedWork(current, workInProgress);
+ }
+
+ var nextChildren = nextProps.children;
+ var isDirectTextChild = shouldSetTextContent(type, nextProps);
+
+ if (isDirectTextChild) {
+ // We special case a direct text child of a host node. This is a common
+ // case. We won't handle it as a reified child. We will instead handle
+ // this in the host environment that also have access to this prop. That
+ // avoids allocating another HostText fiber and traversing it.
+ nextChildren = null;
+ } else if (prevProps && shouldSetTextContent(type, prevProps)) {
+ // If we're switching from a direct text child to a normal child, or to
+ // empty, we need to schedule the text content to be reset.
+ workInProgress.effectTag |= ContentReset;
+ }
+
+ markRef(current, workInProgress);
+
+ // Check the host config to see if the children are offscreen/hidden.
+ if (
+ renderExpirationTime !== Never &&
+ !useSyncScheduling &&
+ shouldDeprioritizeSubtree(type, nextProps)
+ ) {
+ // Down-prioritize the children.
+ workInProgress.expirationTime = Never;
+ // Bailout and come back to this fiber later.
+ return null;
+ }
+
+ reconcileChildren(current, workInProgress, nextChildren);
+ memoizeProps(workInProgress, nextProps);
+ return workInProgress.child;
+ }
+
+ function updateHostText(current, workInProgress) {
+ if (current === null) {
+ tryToClaimNextHydratableInstance(workInProgress);
+ }
+ var nextProps = workInProgress.pendingProps;
+ if (nextProps === null) {
+ nextProps = workInProgress.memoizedProps;
+ }
+ memoizeProps(workInProgress, nextProps);
+ // Nothing to do here. This is terminal. We'll do the completion step
+ // immediately after.
+ return null;
+ }
+
+ function mountIndeterminateComponent(
+ current,
+ workInProgress,
+ renderExpirationTime
+ ) {
+ !(current === null)
+ ? invariant(
+ false,
+ "An indeterminate component should never have mounted. This error is likely caused by a bug in React. Please file an issue."
+ )
+ : void 0;
+ var fn = workInProgress.type;
+ var props = workInProgress.pendingProps;
+ var unmaskedContext = getUnmaskedContext(workInProgress);
+ var context = getMaskedContext(workInProgress, unmaskedContext);
+
+ var value;
+
+ {
+ if (
+ fn.prototype &&
+ typeof fn.prototype.render === "function"
+ ) {
+ var componentName = getComponentName(workInProgress);
+ warning(
+ false,
+ "The <%s /> component appears to have a render method, but doesn't extend React.Component. " +
+ "This is likely to cause errors. Change %s to extend React.Component instead.",
+ componentName,
+ componentName
+ );
+ }
+ ReactCurrentOwner.current = workInProgress;
+ value = fn(props, context);
+ }
+ // React DevTools reads this flag.
+ workInProgress.effectTag |= PerformedWork;
+
+ if (
+ typeof value === "object" &&
+ value !== null &&
+ typeof value.render === "function"
+ ) {
+ // Proceed under the assumption that this is a class instance
+ workInProgress.tag = ClassComponent;
+
+ // Push context providers early to prevent context stack mismatches.
+ // During mounting we don't know the child context yet as the instance doesn't exist.
+ // We will invalidate the child context in finishClassComponent() right after rendering.
+ var hasContext = pushContextProvider(workInProgress);
+ adoptClassInstance(workInProgress, value);
+ mountClassInstance(workInProgress, renderExpirationTime);
+ return finishClassComponent(
+ current,
+ workInProgress,
+ true,
+ hasContext
+ );
+ } else {
+ // Proceed under the assumption that this is a functional component
+ workInProgress.tag = FunctionalComponent;
+ {
+ var Component = workInProgress.type;
+
+ if (Component) {
+ warning(
+ !Component.childContextTypes,
+ "%s(...): childContextTypes cannot be defined on a functional component.",
+ Component.displayName || Component.name || "Component"
+ );
+ }
+ if (workInProgress.ref !== null) {
+ var info = "";
+ var ownerName = ReactDebugCurrentFiber.getCurrentFiberOwnerName();
+ if (ownerName) {
+ info +=
+ "\n\nCheck the render method of `" + ownerName + "`.";
+ }
+
+ var warningKey =
+ ownerName || workInProgress._debugID || "";
+ var debugSource = workInProgress._debugSource;
+ if (debugSource) {
+ warningKey =
+ debugSource.fileName + ":" + debugSource.lineNumber;
+ }
+ if (!warnedAboutStatelessRefs[warningKey]) {
+ warnedAboutStatelessRefs[warningKey] = true;
+ warning(
+ false,
+ "Stateless function components cannot be given refs. " +
+ "Attempts to access this ref will fail.%s%s",
+ info,
+ ReactDebugCurrentFiber.getCurrentFiberStackAddendum()
+ );
+ }
+ }
+ }
+ reconcileChildren(current, workInProgress, value);
+ memoizeProps(workInProgress, props);
+ return workInProgress.child;
+ }
+ }
+
+ function updateCallComponent(
+ current,
+ workInProgress,
+ renderExpirationTime
+ ) {
+ var nextCall = workInProgress.pendingProps;
+ if (hasContextChanged()) {
+ // Normally we can bail out on props equality but if context has changed
+ // we don't do the bailout and we have to reuse existing props instead.
+ if (nextCall === null) {
+ nextCall = current && current.memoizedProps;
+ !(nextCall !== null)
+ ? invariant(
+ false,
+ "We should always have pending or current props. This error is likely caused by a bug in React. Please file an issue."
+ )
+ : void 0;
+ }
+ } else if (
+ nextCall === null ||
+ workInProgress.memoizedProps === nextCall
+ ) {
+ nextCall = workInProgress.memoizedProps;
+ // TODO: When bailing out, we might need to return the stateNode instead
+ // of the child. To check it for work.
+ // return bailoutOnAlreadyFinishedWork(current, workInProgress);
+ }
+
+ var nextChildren = nextCall.children;
+
+ // The following is a fork of reconcileChildrenAtExpirationTime but using
+ // stateNode to store the child.
+ if (current === null) {
+ workInProgress.stateNode = mountChildFibers(
+ workInProgress,
+ workInProgress.stateNode,
+ nextChildren,
+ renderExpirationTime
+ );
+ } else {
+ workInProgress.stateNode = reconcileChildFibers(
+ workInProgress,
+ workInProgress.stateNode,
+ nextChildren,
+ renderExpirationTime
+ );
+ }
+
+ memoizeProps(workInProgress, nextCall);
+ // This doesn't take arbitrary time so we could synchronously just begin
+ // eagerly do the work of workInProgress.child as an optimization.
+ return workInProgress.stateNode;
+ }
+
+ function updatePortalComponent(
+ current,
+ workInProgress,
+ renderExpirationTime
+ ) {
+ pushHostContainer(
+ workInProgress,
+ workInProgress.stateNode.containerInfo
+ );
+ var nextChildren = workInProgress.pendingProps;
+ if (hasContextChanged()) {
+ // Normally we can bail out on props equality but if context has changed
+ // we don't do the bailout and we have to reuse existing props instead.
+ if (nextChildren === null) {
+ nextChildren = current && current.memoizedProps;
+ !(nextChildren != null)
+ ? invariant(
+ false,
+ "We should always have pending or current props. This error is likely caused by a bug in React. Please file an issue."
+ )
+ : void 0;
+ }
+ } else if (
+ nextChildren === null ||
+ workInProgress.memoizedProps === nextChildren
+ ) {
+ return bailoutOnAlreadyFinishedWork(current, workInProgress);
+ }
+
+ if (current === null) {
+ // Portals are special because we don't append the children during mount
+ // but at commit. Therefore we need to track insertions which the normal
+ // flow doesn't do during mount. This doesn't happen at the root because
+ // the root always starts with a "current" with a null child.
+ // TODO: Consider unifying this with how the root works.
+ workInProgress.child = reconcileChildFibers(
+ workInProgress,
+ null,
+ nextChildren,
+ renderExpirationTime
+ );
+ memoizeProps(workInProgress, nextChildren);
+ } else {
+ reconcileChildren(current, workInProgress, nextChildren);
+ memoizeProps(workInProgress, nextChildren);
+ }
+ return workInProgress.child;
+ }
+
+ /*
+ function reuseChildrenEffects(returnFiber : Fiber, firstChild : Fiber) {
+ let child = firstChild;
+ do {
+ // Ensure that the first and last effect of the parent corresponds
+ // to the children's first and last effect.
+ if (!returnFiber.firstEffect) {
+ returnFiber.firstEffect = child.firstEffect;
+ }
+ if (child.lastEffect) {
+ if (returnFiber.lastEffect) {
+ returnFiber.lastEffect.nextEffect = child.firstEffect;
+ }
+ returnFiber.lastEffect = child.lastEffect;
+ }
+ } while (child = child.sibling);
+ }
+ */
+
+ function bailoutOnAlreadyFinishedWork(current, workInProgress) {
+ cancelWorkTimer(workInProgress);
+
+ // TODO: We should ideally be able to bail out early if the children have no
+ // more work to do. However, since we don't have a separation of this
+ // Fiber's priority and its children yet - we don't know without doing lots
+ // of the same work we do anyway. Once we have that separation we can just
+ // bail out here if the children has no more work at this priority level.
+ // if (workInProgress.priorityOfChildren <= priorityLevel) {
+ // // If there are side-effects in these children that have not yet been
+ // // committed we need to ensure that they get properly transferred up.
+ // if (current && current.child !== workInProgress.child) {
+ // reuseChildrenEffects(workInProgress, child);
+ // }
+ // return null;
+ // }
+
+ cloneChildFibers(current, workInProgress);
+ return workInProgress.child;
+ }
+
+ function bailoutOnLowPriority(current, workInProgress) {
+ cancelWorkTimer(workInProgress);
+
+ // TODO: Handle HostComponent tags here as well and call pushHostContext()?
+ // See PR 8590 discussion for context
+ switch (workInProgress.tag) {
+ case HostRoot:
+ pushHostRootContext(workInProgress);
+ break;
+ case ClassComponent:
+ pushContextProvider(workInProgress);
+ break;
+ case HostPortal:
+ pushHostContainer(
+ workInProgress,
+ workInProgress.stateNode.containerInfo
+ );
+ break;
+ }
+ // TODO: What if this is currently in progress?
+ // How can that happen? How is this not being cloned?
+ return null;
+ }
+
+ // TODO: Delete memoizeProps/State and move to reconcile/bailout instead
+ function memoizeProps(workInProgress, nextProps) {
+ workInProgress.memoizedProps = nextProps;
+ }
+
+ function memoizeState(workInProgress, nextState) {
+ workInProgress.memoizedState = nextState;
+ // Don't reset the updateQueue, in case there are pending updates. Resetting
+ // is handled by processUpdateQueue.
+ }
+
+ function beginWork(
+ current,
+ workInProgress,
+ renderExpirationTime
+ ) {
+ if (
+ workInProgress.expirationTime === NoWork ||
+ workInProgress.expirationTime > renderExpirationTime
+ ) {
+ return bailoutOnLowPriority(current, workInProgress);
+ }
+
+ switch (workInProgress.tag) {
+ case IndeterminateComponent:
+ return mountIndeterminateComponent(
+ current,
+ workInProgress,
+ renderExpirationTime
+ );
+ case FunctionalComponent:
+ return updateFunctionalComponent(current, workInProgress);
+ case ClassComponent:
+ return updateClassComponent(
+ current,
+ workInProgress,
+ renderExpirationTime
+ );
+ case HostRoot:
+ return updateHostRoot(
+ current,
+ workInProgress,
+ renderExpirationTime
+ );
+ case HostComponent:
+ return updateHostComponent(
+ current,
+ workInProgress,
+ renderExpirationTime
+ );
+ case HostText:
+ return updateHostText(current, workInProgress);
+ case CallHandlerPhase:
+ // This is a restart. Reset the tag to the initial phase.
+ workInProgress.tag = CallComponent;
+ // Intentionally fall through since this is now the same.
+ case CallComponent:
+ return updateCallComponent(
+ current,
+ workInProgress,
+ renderExpirationTime
+ );
+ case ReturnComponent:
+ // A return component is just a placeholder, we can just run through the
+ // next one immediately.
+ return null;
+ case HostPortal:
+ return updatePortalComponent(
+ current,
+ workInProgress,
+ renderExpirationTime
+ );
+ case Fragment:
+ return updateFragment(current, workInProgress);
+ default:
+ invariant(
+ false,
+ "Unknown unit of work tag. This error is likely caused by a bug in React. Please file an issue."
+ );
+ }
+ }
+
+ function beginFailedWork(
+ current,
+ workInProgress,
+ renderExpirationTime
+ ) {
+ // Push context providers here to avoid a push/pop context mismatch.
+ switch (workInProgress.tag) {
+ case ClassComponent:
+ pushContextProvider(workInProgress);
+ break;
+ case HostRoot:
+ pushHostRootContext(workInProgress);
+ break;
+ default:
+ invariant(
+ false,
+ "Invalid type of work. This error is likely caused by a bug in React. Please file an issue."
+ );
+ }
+
+ // Add an error effect so we can handle the error during the commit phase
+ workInProgress.effectTag |= Err;
+
+ // This is a weird case where we do "resume" work — work that failed on
+ // our first attempt. Because we no longer have a notion of "progressed
+ // deletions," reset the child to the current child to make sure we delete
+ // it again. TODO: Find a better way to handle this, perhaps during a more
+ // general overhaul of error handling.
+ if (current === null) {
+ workInProgress.child = null;
+ } else if (workInProgress.child !== current.child) {
+ workInProgress.child = current.child;
+ }
+
+ if (
+ workInProgress.expirationTime === NoWork ||
+ workInProgress.expirationTime > renderExpirationTime
+ ) {
+ return bailoutOnLowPriority(current, workInProgress);
+ }
+
+ // If we don't bail out, we're going be recomputing our children so we need
+ // to drop our effect list.
+ workInProgress.firstEffect = null;
+ workInProgress.lastEffect = null;
+
+ // Unmount the current children as if the component rendered null
+ var nextChildren = null;
+ reconcileChildrenAtExpirationTime(
+ current,
+ workInProgress,
+ nextChildren,
+ renderExpirationTime
+ );
+
+ if (workInProgress.tag === ClassComponent) {
+ var instance = workInProgress.stateNode;
+ workInProgress.memoizedProps = instance.props;
+ workInProgress.memoizedState = instance.state;
+ }
+
+ return workInProgress.child;
+ }
+
+ return {
+ beginWork: beginWork,
+ beginFailedWork: beginFailedWork
+ };
+ };
+
+ var ReactFiberCompleteWork = function(
+ config,
+ hostContext,
+ hydrationContext
+ ) {
+ var createInstance = config.createInstance,
+ createTextInstance = config.createTextInstance,
+ appendInitialChild = config.appendInitialChild,
+ finalizeInitialChildren = config.finalizeInitialChildren,
+ prepareUpdate = config.prepareUpdate,
+ mutation = config.mutation,
+ persistence = config.persistence;
+ var getRootHostContainer = hostContext.getRootHostContainer,
+ popHostContext = hostContext.popHostContext,
+ getHostContext = hostContext.getHostContext,
+ popHostContainer = hostContext.popHostContainer;
+ var prepareToHydrateHostInstance =
+ hydrationContext.prepareToHydrateHostInstance,
+ prepareToHydrateHostTextInstance =
+ hydrationContext.prepareToHydrateHostTextInstance,
+ popHydrationState = hydrationContext.popHydrationState;
+
+ function markUpdate(workInProgress) {
+ // Tag the fiber with an update effect. This turns a Placement into
+ // an UpdateAndPlacement.
+ workInProgress.effectTag |= Update;
+ }
+
+ function markRef(workInProgress) {
+ workInProgress.effectTag |= Ref;
+ }
+
+ function appendAllReturns(returns, workInProgress) {
+ var node = workInProgress.stateNode;
+ if (node) {
+ node["return"] = workInProgress;
+ }
+ while (node !== null) {
+ if (
+ node.tag === HostComponent ||
+ node.tag === HostText ||
+ node.tag === HostPortal
+ ) {
+ invariant(
+ false,
+ "A call cannot have host component children."
+ );
+ } else if (node.tag === ReturnComponent) {
+ returns.push(node.type);
+ } else if (node.child !== null) {
+ node.child["return"] = node;
+ node = node.child;
+ continue;
+ }
+ while (node.sibling === null) {
+ if (
+ node["return"] === null ||
+ node["return"] === workInProgress
+ ) {
+ return;
+ }
+ node = node["return"];
+ }
+ node.sibling["return"] = node["return"];
+ node = node.sibling;
+ }
+ }
+
+ function moveCallToHandlerPhase(
+ current,
+ workInProgress,
+ renderExpirationTime
+ ) {
+ var call = workInProgress.memoizedProps;
+ !call
+ ? invariant(
+ false,
+ "Should be resolved by now. This error is likely caused by a bug in React. Please file an issue."
+ )
+ : void 0;
+
+ // First step of the call has completed. Now we need to do the second.
+ // TODO: It would be nice to have a multi stage call represented by a
+ // single component, or at least tail call optimize nested ones. Currently
+ // that requires additional fields that we don't want to add to the fiber.
+ // So this requires nested handlers.
+ // Note: This doesn't mutate the alternate node. I don't think it needs to
+ // since this stage is reset for every pass.
+ workInProgress.tag = CallHandlerPhase;
+
+ // Build up the returns.
+ // TODO: Compare this to a generator or opaque helpers like Children.
+ var returns = [];
+ appendAllReturns(returns, workInProgress);
+ var fn = call.handler;
+ var props = call.props;
+ var nextChildren = fn(props, returns);
+
+ var currentFirstChild = current !== null ? current.child : null;
+ workInProgress.child = reconcileChildFibers(
+ workInProgress,
+ currentFirstChild,
+ nextChildren,
+ renderExpirationTime
+ );
+ return workInProgress.child;
+ }
+
+ function appendAllChildren(parent, workInProgress) {
+ // We only have the top Fiber that was created but we need recurse down its
+ // children to find all the terminal nodes.
+ var node = workInProgress.child;
+ while (node !== null) {
+ if (node.tag === HostComponent || node.tag === HostText) {
+ appendInitialChild(parent, node.stateNode);
+ } else if (node.tag === HostPortal) {
+ // If we have a portal child, then we don't want to traverse
+ // down its children. Instead, we'll get insertions from each child in
+ // the portal directly.
+ } else if (node.child !== null) {
+ node.child["return"] = node;
+ node = node.child;
+ continue;
+ }
+ if (node === workInProgress) {
+ return;
+ }
+ while (node.sibling === null) {
+ if (
+ node["return"] === null ||
+ node["return"] === workInProgress
+ ) {
+ return;
+ }
+ node = node["return"];
+ }
+ node.sibling["return"] = node["return"];
+ node = node.sibling;
+ }
+ }
+
+ var updateHostContainer = void 0;
+ var updateHostComponent = void 0;
+ var updateHostText = void 0;
+ if (mutation) {
+ if (enableMutatingReconciler) {
+ // Mutation mode
+ updateHostContainer = function(workInProgress) {
+ // Noop
+ };
+ updateHostComponent = function(
+ current,
+ workInProgress,
+ updatePayload,
+ type,
+ oldProps,
+ newProps,
+ rootContainerInstance
+ ) {
+ // TODO: Type this specific to this type of component.
+ workInProgress.updateQueue = updatePayload;
+ // If the update payload indicates that there is a change or if there
+ // is a new ref we mark this as an update. All the work is done in commitWork.
+ if (updatePayload) {
+ markUpdate(workInProgress);
+ }
+ };
+ updateHostText = function(
+ current,
+ workInProgress,
+ oldText,
+ newText
+ ) {
+ // If the text differs, mark it as an update. All the work in done in commitWork.
+ if (oldText !== newText) {
+ markUpdate(workInProgress);
+ }
+ };
+ } else {
+ invariant(false, "Mutating reconciler is disabled.");
+ }
+ } else if (persistence) {
+ if (enablePersistentReconciler) {
+ // Persistent host tree mode
+ var cloneInstance = persistence.cloneInstance,
+ createContainerChildSet =
+ persistence.createContainerChildSet,
+ appendChildToContainerChildSet =
+ persistence.appendChildToContainerChildSet,
+ finalizeContainerChildren =
+ persistence.finalizeContainerChildren;
+
+ // An unfortunate fork of appendAllChildren because we have two different parent types.
+
+ var appendAllChildrenToContainer = function(
+ containerChildSet,
+ workInProgress
+ ) {
+ // We only have the top Fiber that was created but we need recurse down its
+ // children to find all the terminal nodes.
+ var node = workInProgress.child;
+ while (node !== null) {
+ if (node.tag === HostComponent || node.tag === HostText) {
+ appendChildToContainerChildSet(
+ containerChildSet,
+ node.stateNode
+ );
+ } else if (node.tag === HostPortal) {
+ // If we have a portal child, then we don't want to traverse
+ // down its children. Instead, we'll get insertions from each child in
+ // the portal directly.
+ } else if (node.child !== null) {
+ node.child["return"] = node;
+ node = node.child;
+ continue;
+ }
+ if (node === workInProgress) {
+ return;
+ }
+ while (node.sibling === null) {
+ if (
+ node["return"] === null ||
+ node["return"] === workInProgress
+ ) {
+ return;
+ }
+ node = node["return"];
+ }
+ node.sibling["return"] = node["return"];
+ node = node.sibling;
+ }
+ };
+ updateHostContainer = function(workInProgress) {
+ var portalOrRoot = workInProgress.stateNode;
+ var childrenUnchanged = workInProgress.firstEffect === null;
+ if (childrenUnchanged) {
+ // No changes, just reuse the existing instance.
+ } else {
+ var container = portalOrRoot.containerInfo;
+ var newChildSet = createContainerChildSet(container);
+ if (finalizeContainerChildren(container, newChildSet)) {
+ markUpdate(workInProgress);
+ }
+ portalOrRoot.pendingChildren = newChildSet;
+ // If children might have changed, we have to add them all to the set.
+ appendAllChildrenToContainer(newChildSet, workInProgress);
+ // Schedule an update on the container to swap out the container.
+ markUpdate(workInProgress);
+ }
+ };
+ updateHostComponent = function(
+ current,
+ workInProgress,
+ updatePayload,
+ type,
+ oldProps,
+ newProps,
+ rootContainerInstance
+ ) {
+ // If there are no effects associated with this node, then none of our children had any updates.
+ // This guarantees that we can reuse all of them.
+ var childrenUnchanged = workInProgress.firstEffect === null;
+ var currentInstance = current.stateNode;
+ if (childrenUnchanged && updatePayload === null) {
+ // No changes, just reuse the existing instance.
+ // Note that this might release a previous clone.
+ workInProgress.stateNode = currentInstance;
+ } else {
+ var recyclableInstance = workInProgress.stateNode;
+ var newInstance = cloneInstance(
+ currentInstance,
+ updatePayload,
+ type,
+ oldProps,
+ newProps,
+ workInProgress,
+ childrenUnchanged,
+ recyclableInstance
+ );
+ if (
+ finalizeInitialChildren(
+ newInstance,
+ type,
+ newProps,
+ rootContainerInstance
+ )
+ ) {
+ markUpdate(workInProgress);
+ }
+ workInProgress.stateNode = newInstance;
+ if (childrenUnchanged) {
+ // If there are no other effects in this tree, we need to flag this node as having one.
+ // Even though we're not going to use it for anything.
+ // Otherwise parents won't know that there are new children to propagate upwards.
+ markUpdate(workInProgress);
+ } else {
+ // If children might have changed, we have to add them all to the set.
+ appendAllChildren(newInstance, workInProgress);
+ }
+ }
+ };
+ updateHostText = function(
+ current,
+ workInProgress,
+ oldText,
+ newText
+ ) {
+ if (oldText !== newText) {
+ // If the text content differs, we'll create a new text instance for it.
+ var rootContainerInstance = getRootHostContainer();
+ var currentHostContext = getHostContext();
+ workInProgress.stateNode = createTextInstance(
+ newText,
+ rootContainerInstance,
+ currentHostContext,
+ workInProgress
+ );
+ // We'll have to mark it as having an effect, even though we won't use the effect for anything.
+ // This lets the parents know that at least one of their children has changed.
+ markUpdate(workInProgress);
+ }
+ };
+ } else {
+ invariant(false, "Persistent reconciler is disabled.");
+ }
+ } else {
+ if (enableNoopReconciler) {
+ // No host operations
+ updateHostContainer = function(workInProgress) {
+ // Noop
+ };
+ updateHostComponent = function(
+ current,
+ workInProgress,
+ updatePayload,
+ type,
+ oldProps,
+ newProps,
+ rootContainerInstance
+ ) {
+ // Noop
+ };
+ updateHostText = function(
+ current,
+ workInProgress,
+ oldText,
+ newText
+ ) {
+ // Noop
+ };
+ } else {
+ invariant(false, "Noop reconciler is disabled.");
+ }
+ }
+
+ function completeWork(
+ current,
+ workInProgress,
+ renderExpirationTime
+ ) {
+ // Get the latest props.
+ var newProps = workInProgress.pendingProps;
+ if (newProps === null) {
+ newProps = workInProgress.memoizedProps;
+ } else if (
+ workInProgress.expirationTime !== Never ||
+ renderExpirationTime === Never
+ ) {
+ // Reset the pending props, unless this was a down-prioritization.
+ workInProgress.pendingProps = null;
+ }
+
+ switch (workInProgress.tag) {
+ case FunctionalComponent:
+ return null;
+ case ClassComponent: {
+ // We are leaving this subtree, so pop context if any.
+ popContextProvider(workInProgress);
+ return null;
+ }
+ case HostRoot: {
+ popHostContainer(workInProgress);
+ popTopLevelContextObject(workInProgress);
+ var fiberRoot = workInProgress.stateNode;
+ if (fiberRoot.pendingContext) {
+ fiberRoot.context = fiberRoot.pendingContext;
+ fiberRoot.pendingContext = null;
+ }
+
+ if (current === null || current.child === null) {
+ // If we hydrated, pop so that we can delete any remaining children
+ // that weren't hydrated.
+ popHydrationState(workInProgress);
+ // This resets the hacky state to fix isMounted before committing.
+ // TODO: Delete this when we delete isMounted and findDOMNode.
+ workInProgress.effectTag &= ~Placement;
+ }
+ updateHostContainer(workInProgress);
+ return null;
+ }
+ case HostComponent: {
+ popHostContext(workInProgress);
+ var rootContainerInstance = getRootHostContainer();
+ var type = workInProgress.type;
+ if (current !== null && workInProgress.stateNode != null) {
+ // If we have an alternate, that means this is an update and we need to
+ // schedule a side-effect to do the updates.
+ var oldProps = current.memoizedProps;
+ // If we get updated because one of our children updated, we don't
+ // have newProps so we'll have to reuse them.
+ // TODO: Split the update API as separate for the props vs. children.
+ // Even better would be if children weren't special cased at all tho.
+ var instance = workInProgress.stateNode;
+ var currentHostContext = getHostContext();
+ var updatePayload = prepareUpdate(
+ instance,
+ type,
+ oldProps,
+ newProps,
+ rootContainerInstance,
+ currentHostContext
+ );
+
+ updateHostComponent(
+ current,
+ workInProgress,
+ updatePayload,
+ type,
+ oldProps,
+ newProps,
+ rootContainerInstance
+ );
+
+ if (current.ref !== workInProgress.ref) {
+ markRef(workInProgress);
+ }
+ } else {
+ if (!newProps) {
+ !(workInProgress.stateNode !== null)
+ ? invariant(
+ false,
+ "We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue."
+ )
+ : void 0;
+ // This can happen when we abort work.
+ return null;
+ }
+
+ var _currentHostContext = getHostContext();
+ // TODO: Move createInstance to beginWork and keep it on a context
+ // "stack" as the parent. Then append children as we go in beginWork
+ // or completeWork depending on we want to add then top->down or
+ // bottom->up. Top->down is faster in IE11.
+ var wasHydrated = popHydrationState(workInProgress);
+ if (wasHydrated) {
+ // TODO: Move this and createInstance step into the beginPhase
+ // to consolidate.
+ if (
+ prepareToHydrateHostInstance(
+ workInProgress,
+ rootContainerInstance,
+ _currentHostContext
+ )
+ ) {
+ // If changes to the hydrated node needs to be applied at the
+ // commit-phase we mark this as such.
+ markUpdate(workInProgress);
+ }
+ } else {
+ var _instance = createInstance(
+ type,
+ newProps,
+ rootContainerInstance,
+ _currentHostContext,
+ workInProgress
+ );
+
+ appendAllChildren(_instance, workInProgress);
+
+ // Certain renderers require commit-time effects for initial mount.
+ // (eg DOM renderer supports auto-focus for certain elements).
+ // Make sure such renderers get scheduled for later work.
+ if (
+ finalizeInitialChildren(
+ _instance,
+ type,
+ newProps,
+ rootContainerInstance
+ )
+ ) {
+ markUpdate(workInProgress);
+ }
+ workInProgress.stateNode = _instance;
+ }
+
+ if (workInProgress.ref !== null) {
+ // If there is a ref on a host node we need to schedule a callback
+ markRef(workInProgress);
+ }
+ }
+ return null;
+ }
+ case HostText: {
+ var newText = newProps;
+ if (current && workInProgress.stateNode != null) {
+ var oldText = current.memoizedProps;
+ // If we have an alternate, that means this is an update and we need
+ // to schedule a side-effect to do the updates.
+ updateHostText(current, workInProgress, oldText, newText);
+ } else {
+ if (typeof newText !== "string") {
+ !(workInProgress.stateNode !== null)
+ ? invariant(
+ false,
+ "We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue."
+ )
+ : void 0;
+ // This can happen when we abort work.
+ return null;
+ }
+ var _rootContainerInstance = getRootHostContainer();
+ var _currentHostContext2 = getHostContext();
+ var _wasHydrated = popHydrationState(workInProgress);
+ if (_wasHydrated) {
+ if (prepareToHydrateHostTextInstance(workInProgress)) {
+ markUpdate(workInProgress);
+ }
+ } else {
+ workInProgress.stateNode = createTextInstance(
+ newText,
+ _rootContainerInstance,
+ _currentHostContext2,
+ workInProgress
+ );
+ }
+ }
+ return null;
+ }
+ case CallComponent:
+ return moveCallToHandlerPhase(
+ current,
+ workInProgress,
+ renderExpirationTime
+ );
+ case CallHandlerPhase:
+ // Reset the tag to now be a first phase call.
+ workInProgress.tag = CallComponent;
+ return null;
+ case ReturnComponent:
+ // Does nothing.
+ return null;
+ case Fragment:
+ return null;
+ case HostPortal:
+ popHostContainer(workInProgress);
+ updateHostContainer(workInProgress);
+ return null;
+ // Error cases
+ case IndeterminateComponent:
+ invariant(
+ false,
+ "An indeterminate component should have become determinate before completing. This error is likely caused by a bug in React. Please file an issue."
+ );
+ // eslint-disable-next-line no-fallthrough
+ default:
+ invariant(
+ false,
+ "Unknown unit of work tag. This error is likely caused by a bug in React. Please file an issue."
+ );
+ }
+ }
+
+ return {
+ completeWork: completeWork
+ };
+ };
+
+ var invokeGuardedCallback$2 = ReactErrorUtils.invokeGuardedCallback;
+ var hasCaughtError$1 = ReactErrorUtils.hasCaughtError;
+ var clearCaughtError$1 = ReactErrorUtils.clearCaughtError;
+
+ var ReactFiberCommitWork = function(config, captureError) {
+ var getPublicInstance = config.getPublicInstance,
+ mutation = config.mutation,
+ persistence = config.persistence;
+
+ var callComponentWillUnmountWithTimer = function(
+ current,
+ instance
+ ) {
+ startPhaseTimer(current, "componentWillUnmount");
+ instance.props = current.memoizedProps;
+ instance.state = current.memoizedState;
+ instance.componentWillUnmount();
+ stopPhaseTimer();
+ };
+
+ // Capture errors so they don't interrupt unmounting.
+ function safelyCallComponentWillUnmount(current, instance) {
+ {
+ invokeGuardedCallback$2(
+ null,
+ callComponentWillUnmountWithTimer,
+ null,
+ current,
+ instance
+ );
+ if (hasCaughtError$1()) {
+ var unmountError = clearCaughtError$1();
+ captureError(current, unmountError);
+ }
+ }
+ }
+
+ function safelyDetachRef(current) {
+ var ref = current.ref;
+ if (ref !== null) {
+ {
+ invokeGuardedCallback$2(null, ref, null, null);
+ if (hasCaughtError$1()) {
+ var refError = clearCaughtError$1();
+ captureError(current, refError);
+ }
+ }
+ }
+ }
+
+ function commitLifeCycles(current, finishedWork) {
+ switch (finishedWork.tag) {
+ case ClassComponent: {
+ var instance = finishedWork.stateNode;
+ if (finishedWork.effectTag & Update) {
+ if (current === null) {
+ startPhaseTimer(finishedWork, "componentDidMount");
+ instance.props = finishedWork.memoizedProps;
+ instance.state = finishedWork.memoizedState;
+ instance.componentDidMount();
+ stopPhaseTimer();
+ } else {
+ var prevProps = current.memoizedProps;
+ var prevState = current.memoizedState;
+ startPhaseTimer(finishedWork, "componentDidUpdate");
+ instance.props = finishedWork.memoizedProps;
+ instance.state = finishedWork.memoizedState;
+ instance.componentDidUpdate(prevProps, prevState);
+ stopPhaseTimer();
+ }
+ }
+ var updateQueue = finishedWork.updateQueue;
+ if (updateQueue !== null) {
+ commitCallbacks(updateQueue, instance);
+ }
+ return;
+ }
+ case HostRoot: {
+ var _updateQueue = finishedWork.updateQueue;
+ if (_updateQueue !== null) {
+ var _instance =
+ finishedWork.child !== null
+ ? finishedWork.child.stateNode
+ : null;
+ commitCallbacks(_updateQueue, _instance);
+ }
+ return;
+ }
+ case HostComponent: {
+ var _instance2 = finishedWork.stateNode;
+
+ // Renderers may schedule work to be done after host components are mounted
+ // (eg DOM renderer may schedule auto-focus for inputs and form controls).
+ // These effects should only be committed when components are first mounted,
+ // aka when there is no current/alternate.
+ if (current === null && finishedWork.effectTag & Update) {
+ var type = finishedWork.type;
+ var props = finishedWork.memoizedProps;
+ commitMount(_instance2, type, props, finishedWork);
+ }
+
+ return;
+ }
+ case HostText: {
+ // We have no life-cycles associated with text.
+ return;
+ }
+ case HostPortal: {
+ // We have no life-cycles associated with portals.
+ return;
+ }
+ default: {
+ invariant(
+ false,
+ "This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue."
+ );
+ }
+ }
+ }
+
+ function commitAttachRef(finishedWork) {
+ var ref = finishedWork.ref;
+ if (ref !== null) {
+ var instance = finishedWork.stateNode;
+ switch (finishedWork.tag) {
+ case HostComponent:
+ ref(getPublicInstance(instance));
+ break;
+ default:
+ ref(instance);
+ }
+ }
+ }
+
+ function commitDetachRef(current) {
+ var currentRef = current.ref;
+ if (currentRef !== null) {
+ currentRef(null);
+ }
+ }
+
+ // User-originating errors (lifecycles and refs) should not interrupt
+ // deletion, so don't let them throw. Host-originating errors should
+ // interrupt deletion, so it's okay
+ function commitUnmount(current) {
+ if (typeof onCommitUnmount === "function") {
+ onCommitUnmount(current);
+ }
+
+ switch (current.tag) {
+ case ClassComponent: {
+ safelyDetachRef(current);
+ var instance = current.stateNode;
+ if (typeof instance.componentWillUnmount === "function") {
+ safelyCallComponentWillUnmount(current, instance);
+ }
+ return;
+ }
+ case HostComponent: {
+ safelyDetachRef(current);
+ return;
+ }
+ case CallComponent: {
+ commitNestedUnmounts(current.stateNode);
+ return;
+ }
+ case HostPortal: {
+ // TODO: this is recursive.
+ // We are also not using this parent because
+ // the portal will get pushed immediately.
+ if (enableMutatingReconciler && mutation) {
+ unmountHostComponents(current);
+ } else if (enablePersistentReconciler && persistence) {
+ emptyPortalContainer(current);
+ }
+ return;
+ }
+ }
+ }
+
+ function commitNestedUnmounts(root) {
+ // While we're inside a removed host node we don't want to call
+ // removeChild on the inner nodes because they're removed by the top
+ // call anyway. We also want to call componentWillUnmount on all
+ // composites before this host node is removed from the tree. Therefore
+ var node = root;
+ while (true) {
+ commitUnmount(node);
+ // Visit children because they may contain more composite or host nodes.
+ // Skip portals because commitUnmount() currently visits them recursively.
+ if (
+ node.child !== null &&
+ // If we use mutation we drill down into portals using commitUnmount above.
+ // If we don't use mutation we drill down into portals here instead.
+ (!mutation || node.tag !== HostPortal)
+ ) {
+ node.child["return"] = node;
+ node = node.child;
+ continue;
+ }
+ if (node === root) {
+ return;
+ }
+ while (node.sibling === null) {
+ if (node["return"] === null || node["return"] === root) {
+ return;
+ }
+ node = node["return"];
+ }
+ node.sibling["return"] = node["return"];
+ node = node.sibling;
+ }
+ }
+
+ function detachFiber(current) {
+ // Cut off the return pointers to disconnect it from the tree. Ideally, we
+ // should clear the child pointer of the parent alternate to let this
+ // get GC:ed but we don't know which for sure which parent is the current
+ // one so we'll settle for GC:ing the subtree of this child. This child
+ // itself will be GC:ed when the parent updates the next time.
+ current["return"] = null;
+ current.child = null;
+ if (current.alternate) {
+ current.alternate.child = null;
+ current.alternate["return"] = null;
+ }
+ }
+
+ if (!mutation) {
+ var commitContainer = void 0;
+ if (persistence) {
+ var replaceContainerChildren =
+ persistence.replaceContainerChildren,
+ createContainerChildSet =
+ persistence.createContainerChildSet;
+
+ var emptyPortalContainer = function(current) {
+ var portal = current.stateNode;
+ var containerInfo = portal.containerInfo;
+
+ var emptyChildSet = createContainerChildSet(containerInfo);
+ replaceContainerChildren(containerInfo, emptyChildSet);
+ };
+ commitContainer = function(finishedWork) {
+ switch (finishedWork.tag) {
+ case ClassComponent: {
+ return;
+ }
+ case HostComponent: {
+ return;
+ }
+ case HostText: {
+ return;
+ }
+ case HostRoot:
+ case HostPortal: {
+ var portalOrRoot = finishedWork.stateNode;
+ var containerInfo = portalOrRoot.containerInfo,
+ _pendingChildren = portalOrRoot.pendingChildren;
+
+ replaceContainerChildren(
+ containerInfo,
+ _pendingChildren
+ );
+ return;
+ }
+ default: {
+ invariant(
+ false,
+ "This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue."
+ );
+ }
+ }
+ };
+ } else {
+ commitContainer = function(finishedWork) {
+ // Noop
+ };
+ }
+ if (enablePersistentReconciler || enableNoopReconciler) {
+ return {
+ commitResetTextContent: function(finishedWork) {},
+ commitPlacement: function(finishedWork) {},
+ commitDeletion: function(current) {
+ // Detach refs and call componentWillUnmount() on the whole subtree.
+ commitNestedUnmounts(current);
+ detachFiber(current);
+ },
+ commitWork: function(current, finishedWork) {
+ commitContainer(finishedWork);
+ },
+
+ commitLifeCycles: commitLifeCycles,
+ commitAttachRef: commitAttachRef,
+ commitDetachRef: commitDetachRef
+ };
+ } else if (persistence) {
+ invariant(false, "Persistent reconciler is disabled.");
+ } else {
+ invariant(false, "Noop reconciler is disabled.");
+ }
+ }
+ var commitMount = mutation.commitMount,
+ commitUpdate = mutation.commitUpdate,
+ resetTextContent = mutation.resetTextContent,
+ commitTextUpdate = mutation.commitTextUpdate,
+ appendChild = mutation.appendChild,
+ appendChildToContainer = mutation.appendChildToContainer,
+ insertBefore = mutation.insertBefore,
+ insertInContainerBefore = mutation.insertInContainerBefore,
+ removeChild = mutation.removeChild,
+ removeChildFromContainer = mutation.removeChildFromContainer;
+
+ function getHostParentFiber(fiber) {
+ var parent = fiber["return"];
+ while (parent !== null) {
+ if (isHostParent(parent)) {
+ return parent;
+ }
+ parent = parent["return"];
+ }
+ invariant(
+ false,
+ "Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue."
+ );
+ }
+
+ function isHostParent(fiber) {
+ return (
+ fiber.tag === HostComponent ||
+ fiber.tag === HostRoot ||
+ fiber.tag === HostPortal
+ );
+ }
+
+ function getHostSibling(fiber) {
+ // We're going to search forward into the tree until we find a sibling host
+ // node. Unfortunately, if multiple insertions are done in a row we have to
+ // search past them. This leads to exponential search for the next sibling.
+ var node = fiber;
+ siblings: while (true) {
+ // If we didn't find anything, let's try the next sibling.
+ while (node.sibling === null) {
+ if (
+ node["return"] === null ||
+ isHostParent(node["return"])
+ ) {
+ // If we pop out of the root or hit the parent the fiber we are the
+ // last sibling.
+ return null;
+ }
+ node = node["return"];
+ }
+ node.sibling["return"] = node["return"];
+ node = node.sibling;
+ while (node.tag !== HostComponent && node.tag !== HostText) {
+ // If it is not host node and, we might have a host node inside it.
+ // Try to search down until we find one.
+ if (node.effectTag & Placement) {
+ // If we don't have a child, try the siblings instead.
+ continue siblings;
+ }
+ // If we don't have a child, try the siblings instead.
+ // We also skip portals because they are not part of this host tree.
+ if (node.child === null || node.tag === HostPortal) {
+ continue siblings;
+ } else {
+ node.child["return"] = node;
+ node = node.child;
+ }
+ }
+ // Check if this host node is stable or about to be placed.
+ if (!(node.effectTag & Placement)) {
+ // Found it!
+ return node.stateNode;
+ }
+ }
+ }
+
+ function commitPlacement(finishedWork) {
+ // Recursively insert all host nodes into the parent.
+ var parentFiber = getHostParentFiber(finishedWork);
+ var parent = void 0;
+ var isContainer = void 0;
+ switch (parentFiber.tag) {
+ case HostComponent:
+ parent = parentFiber.stateNode;
+ isContainer = false;
+ break;
+ case HostRoot:
+ parent = parentFiber.stateNode.containerInfo;
+ isContainer = true;
+ break;
+ case HostPortal:
+ parent = parentFiber.stateNode.containerInfo;
+ isContainer = true;
+ break;
+ default:
+ invariant(
+ false,
+ "Invalid host parent fiber. This error is likely caused by a bug in React. Please file an issue."
+ );
+ }
+ if (parentFiber.effectTag & ContentReset) {
+ // Reset the text content of the parent before doing any insertions
+ resetTextContent(parent);
+ // Clear ContentReset from the effect tag
+ parentFiber.effectTag &= ~ContentReset;
+ }
+
+ var before = getHostSibling(finishedWork);
+ // We only have the top Fiber that was inserted but we need recurse down its
+ // children to find all the terminal nodes.
+ var node = finishedWork;
+ while (true) {
+ if (node.tag === HostComponent || node.tag === HostText) {
+ if (before) {
+ if (isContainer) {
+ insertInContainerBefore(parent, node.stateNode, before);
+ } else {
+ insertBefore(parent, node.stateNode, before);
+ }
+ } else {
+ if (isContainer) {
+ appendChildToContainer(parent, node.stateNode);
+ } else {
+ appendChild(parent, node.stateNode);
+ }
+ }
+ } else if (node.tag === HostPortal) {
+ // If the insertion itself is a portal, then we don't want to traverse
+ // down its children. Instead, we'll get insertions from each child in
+ // the portal directly.
+ } else if (node.child !== null) {
+ node.child["return"] = node;
+ node = node.child;
+ continue;
+ }
+ if (node === finishedWork) {
+ return;
+ }
+ while (node.sibling === null) {
+ if (
+ node["return"] === null ||
+ node["return"] === finishedWork
+ ) {
+ return;
+ }
+ node = node["return"];
+ }
+ node.sibling["return"] = node["return"];
+ node = node.sibling;
+ }
+ }
+
+ function unmountHostComponents(current) {
+ // We only have the top Fiber that was inserted but we need recurse down its
+ var node = current;
+
+ // Each iteration, currentParent is populated with node's host parent if not
+ // currentParentIsValid.
+ var currentParentIsValid = false;
+ var currentParent = void 0;
+ var currentParentIsContainer = void 0;
+
+ while (true) {
+ if (!currentParentIsValid) {
+ var parent = node["return"];
+ findParent: while (true) {
+ !(parent !== null)
+ ? invariant(
+ false,
+ "Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue."
+ )
+ : void 0;
+ switch (parent.tag) {
+ case HostComponent:
+ currentParent = parent.stateNode;
+ currentParentIsContainer = false;
+ break findParent;
+ case HostRoot:
+ currentParent = parent.stateNode.containerInfo;
+ currentParentIsContainer = true;
+ break findParent;
+ case HostPortal:
+ currentParent = parent.stateNode.containerInfo;
+ currentParentIsContainer = true;
+ break findParent;
+ }
+ parent = parent["return"];
+ }
+ currentParentIsValid = true;
+ }
+
+ if (node.tag === HostComponent || node.tag === HostText) {
+ commitNestedUnmounts(node);
+ // After all the children have unmounted, it is now safe to remove the
+ // node from the tree.
+ if (currentParentIsContainer) {
+ removeChildFromContainer(currentParent, node.stateNode);
+ } else {
+ removeChild(currentParent, node.stateNode);
+ }
+ // Don't visit children because we already visited them.
+ } else if (node.tag === HostPortal) {
+ // When we go into a portal, it becomes the parent to remove from.
+ // We will reassign it back when we pop the portal on the way up.
+ currentParent = node.stateNode.containerInfo;
+ // Visit children because portals might contain host components.
+ if (node.child !== null) {
+ node.child["return"] = node;
+ node = node.child;
+ continue;
+ }
+ } else {
+ commitUnmount(node);
+ // Visit children because we may find more host components below.
+ if (node.child !== null) {
+ node.child["return"] = node;
+ node = node.child;
+ continue;
+ }
+ }
+ if (node === current) {
+ return;
+ }
+ while (node.sibling === null) {
+ if (node["return"] === null || node["return"] === current) {
+ return;
+ }
+ node = node["return"];
+ if (node.tag === HostPortal) {
+ // When we go out of the portal, we need to restore the parent.
+ // Since we don't keep a stack of them, we will search for it.
+ currentParentIsValid = false;
+ }
+ }
+ node.sibling["return"] = node["return"];
+ node = node.sibling;
+ }
+ }
+
+ function commitDeletion(current) {
+ // Recursively delete all host nodes from the parent.
+ // Detach refs and call componentWillUnmount() on the whole subtree.
+ unmountHostComponents(current);
+ detachFiber(current);
+ }
+
+ function commitWork(current, finishedWork) {
+ switch (finishedWork.tag) {
+ case ClassComponent: {
+ return;
+ }
+ case HostComponent: {
+ var instance = finishedWork.stateNode;
+ if (instance != null) {
+ // Commit the work prepared earlier.
+ var newProps = finishedWork.memoizedProps;
+ // For hydration we reuse the update path but we treat the oldProps
+ // as the newProps. The updatePayload will contain the real change in
+ // this case.
+ var oldProps =
+ current !== null ? current.memoizedProps : newProps;
+ var type = finishedWork.type;
+ // TODO: Type the updateQueue to be specific to host components.
+ var updatePayload = finishedWork.updateQueue;
+ finishedWork.updateQueue = null;
+ if (updatePayload !== null) {
+ commitUpdate(
+ instance,
+ updatePayload,
+ type,
+ oldProps,
+ newProps,
+ finishedWork
+ );
+ }
+ }
+ return;
+ }
+ case HostText: {
+ !(finishedWork.stateNode !== null)
+ ? invariant(
+ false,
+ "This should have a text node initialized. This error is likely caused by a bug in React. Please file an issue."
+ )
+ : void 0;
+ var textInstance = finishedWork.stateNode;
+ var newText = finishedWork.memoizedProps;
+ // For hydration we reuse the update path but we treat the oldProps
+ // as the newProps. The updatePayload will contain the real change in
+ // this case.
+ var oldText =
+ current !== null ? current.memoizedProps : newText;
+ commitTextUpdate(textInstance, oldText, newText);
+ return;
+ }
+ case HostRoot: {
+ return;
+ }
+ default: {
+ invariant(
+ false,
+ "This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue."
+ );
+ }
+ }
+ }
+
+ function commitResetTextContent(current) {
+ resetTextContent(current.stateNode);
+ }
+
+ if (enableMutatingReconciler) {
+ return {
+ commitResetTextContent: commitResetTextContent,
+ commitPlacement: commitPlacement,
+ commitDeletion: commitDeletion,
+ commitWork: commitWork,
+ commitLifeCycles: commitLifeCycles,
+ commitAttachRef: commitAttachRef,
+ commitDetachRef: commitDetachRef
+ };
+ } else {
+ invariant(false, "Mutating reconciler is disabled.");
+ }
+ };
+
+ var NO_CONTEXT = {};
+
+ var ReactFiberHostContext = function(config) {
+ var getChildHostContext = config.getChildHostContext,
+ getRootHostContext = config.getRootHostContext;
+
+ var contextStackCursor = createCursor(NO_CONTEXT);
+ var contextFiberStackCursor = createCursor(NO_CONTEXT);
+ var rootInstanceStackCursor = createCursor(NO_CONTEXT);
+
+ function requiredContext(c) {
+ !(c !== NO_CONTEXT)
+ ? invariant(
+ false,
+ "Expected host context to exist. This error is likely caused by a bug in React. Please file an issue."
+ )
+ : void 0;
+ return c;
+ }
+
+ function getRootHostContainer() {
+ var rootInstance = requiredContext(
+ rootInstanceStackCursor.current
+ );
+ return rootInstance;
+ }
+
+ function pushHostContainer(fiber, nextRootInstance) {
+ // Push current root instance onto the stack;
+ // This allows us to reset root when portals are popped.
+ push(rootInstanceStackCursor, nextRootInstance, fiber);
+
+ var nextRootContext = getRootHostContext(nextRootInstance);
+
+ // Track the context and the Fiber that provided it.
+ // This enables us to pop only Fibers that provide unique contexts.
+ push(contextFiberStackCursor, fiber, fiber);
+ push(contextStackCursor, nextRootContext, fiber);
+ }
+
+ function popHostContainer(fiber) {
+ pop(contextStackCursor, fiber);
+ pop(contextFiberStackCursor, fiber);
+ pop(rootInstanceStackCursor, fiber);
+ }
+
+ function getHostContext() {
+ var context = requiredContext(contextStackCursor.current);
+ return context;
+ }
+
+ function pushHostContext(fiber) {
+ var rootInstance = requiredContext(
+ rootInstanceStackCursor.current
+ );
+ var context = requiredContext(contextStackCursor.current);
+ var nextContext = getChildHostContext(
+ context,
+ fiber.type,
+ rootInstance
+ );
+
+ // Don't push this Fiber's context unless it's unique.
+ if (context === nextContext) {
+ return;
+ }
+
+ // Track the context and the Fiber that provided it.
+ // This enables us to pop only Fibers that provide unique contexts.
+ push(contextFiberStackCursor, fiber, fiber);
+ push(contextStackCursor, nextContext, fiber);
+ }
+
+ function popHostContext(fiber) {
+ // Do not pop unless this Fiber provided the current context.
+ // pushHostContext() only pushes Fibers that provide unique contexts.
+ if (contextFiberStackCursor.current !== fiber) {
+ return;
+ }
+
+ pop(contextStackCursor, fiber);
+ pop(contextFiberStackCursor, fiber);
+ }
+
+ function resetHostContainer() {
+ contextStackCursor.current = NO_CONTEXT;
+ rootInstanceStackCursor.current = NO_CONTEXT;
+ }
+
+ return {
+ getHostContext: getHostContext,
+ getRootHostContainer: getRootHostContainer,
+ popHostContainer: popHostContainer,
+ popHostContext: popHostContext,
+ pushHostContainer: pushHostContainer,
+ pushHostContext: pushHostContext,
+ resetHostContainer: resetHostContainer
+ };
+ };
+
+ var ReactFiberHydrationContext = function(config) {
+ var shouldSetTextContent = config.shouldSetTextContent,
+ hydration = config.hydration;
+
+ // If this doesn't have hydration mode.
+
+ if (!hydration) {
+ return {
+ enterHydrationState: function() {
+ return false;
+ },
+ resetHydrationState: function() {},
+ tryToClaimNextHydratableInstance: function() {},
+ prepareToHydrateHostInstance: function() {
+ invariant(
+ false,
+ "Expected prepareToHydrateHostInstance() to never be called. This error is likely caused by a bug in React. Please file an issue."
+ );
+ },
+ prepareToHydrateHostTextInstance: function() {
+ invariant(
+ false,
+ "Expected prepareToHydrateHostTextInstance() to never be called. This error is likely caused by a bug in React. Please file an issue."
+ );
+ },
+ popHydrationState: function(fiber) {
+ return false;
+ }
+ };
+ }
+
+ var canHydrateInstance = hydration.canHydrateInstance,
+ canHydrateTextInstance = hydration.canHydrateTextInstance,
+ getNextHydratableSibling = hydration.getNextHydratableSibling,
+ getFirstHydratableChild = hydration.getFirstHydratableChild,
+ hydrateInstance = hydration.hydrateInstance,
+ hydrateTextInstance = hydration.hydrateTextInstance,
+ didNotMatchHydratedContainerTextInstance =
+ hydration.didNotMatchHydratedContainerTextInstance,
+ didNotMatchHydratedTextInstance =
+ hydration.didNotMatchHydratedTextInstance,
+ didNotHydrateContainerInstance =
+ hydration.didNotHydrateContainerInstance,
+ didNotHydrateInstance = hydration.didNotHydrateInstance,
+ didNotFindHydratableContainerInstance =
+ hydration.didNotFindHydratableContainerInstance,
+ didNotFindHydratableContainerTextInstance =
+ hydration.didNotFindHydratableContainerTextInstance,
+ didNotFindHydratableInstance =
+ hydration.didNotFindHydratableInstance,
+ didNotFindHydratableTextInstance =
+ hydration.didNotFindHydratableTextInstance;
+
+ // The deepest Fiber on the stack involved in a hydration context.
+ // This may have been an insertion or a hydration.
+
+ var hydrationParentFiber = null;
+ var nextHydratableInstance = null;
+ var isHydrating = false;
+
+ function enterHydrationState(fiber) {
+ var parentInstance = fiber.stateNode.containerInfo;
+ nextHydratableInstance = getFirstHydratableChild(
+ parentInstance
+ );
+ hydrationParentFiber = fiber;
+ isHydrating = true;
+ return true;
+ }
+
+ function deleteHydratableInstance(returnFiber, instance) {
+ {
+ switch (returnFiber.tag) {
+ case HostRoot:
+ didNotHydrateContainerInstance(
+ returnFiber.stateNode.containerInfo,
+ instance
+ );
+ break;
+ case HostComponent:
+ didNotHydrateInstance(
+ returnFiber.type,
+ returnFiber.memoizedProps,
+ returnFiber.stateNode,
+ instance
+ );
+ break;
+ }
+ }
+
+ var childToDelete = createFiberFromHostInstanceForDeletion();
+ childToDelete.stateNode = instance;
+ childToDelete["return"] = returnFiber;
+ childToDelete.effectTag = Deletion;
+
+ // This might seem like it belongs on progressedFirstDeletion. However,
+ // these children are not part of the reconciliation list of children.
+ // Even if we abort and rereconcile the children, that will try to hydrate
+ // again and the nodes are still in the host tree so these will be
+ // recreated.
+ if (returnFiber.lastEffect !== null) {
+ returnFiber.lastEffect.nextEffect = childToDelete;
+ returnFiber.lastEffect = childToDelete;
+ } else {
+ returnFiber.firstEffect = returnFiber.lastEffect = childToDelete;
+ }
+ }
+
+ function insertNonHydratedInstance(returnFiber, fiber) {
+ fiber.effectTag |= Placement;
+ {
+ switch (returnFiber.tag) {
+ case HostRoot: {
+ var parentContainer = returnFiber.stateNode.containerInfo;
+ switch (fiber.tag) {
+ case HostComponent:
+ var type = fiber.type;
+ var props = fiber.pendingProps;
+ didNotFindHydratableContainerInstance(
+ parentContainer,
+ type,
+ props
+ );
+ break;
+ case HostText:
+ var text = fiber.pendingProps;
+ didNotFindHydratableContainerTextInstance(
+ parentContainer,
+ text
+ );
+ break;
+ }
+ break;
+ }
+ case HostComponent: {
+ var parentType = returnFiber.type;
+ var parentProps = returnFiber.memoizedProps;
+ var parentInstance = returnFiber.stateNode;
+ switch (fiber.tag) {
+ case HostComponent:
+ var _type = fiber.type;
+ var _props = fiber.pendingProps;
+ didNotFindHydratableInstance(
+ parentType,
+ parentProps,
+ parentInstance,
+ _type,
+ _props
+ );
+ break;
+ case HostText:
+ var _text = fiber.pendingProps;
+ didNotFindHydratableTextInstance(
+ parentType,
+ parentProps,
+ parentInstance,
+ _text
+ );
+ break;
+ }
+ break;
+ }
+ default:
+ return;
+ }
+ }
+ }
+
+ function tryHydrate(fiber, nextInstance) {
+ switch (fiber.tag) {
+ case HostComponent: {
+ var type = fiber.type;
+ var props = fiber.pendingProps;
+ var instance = canHydrateInstance(
+ nextInstance,
+ type,
+ props
+ );
+ if (instance !== null) {
+ fiber.stateNode = instance;
+ return true;
+ }
+ return false;
+ }
+ case HostText: {
+ var text = fiber.pendingProps;
+ var textInstance = canHydrateTextInstance(
+ nextInstance,
+ text
+ );
+ if (textInstance !== null) {
+ fiber.stateNode = textInstance;
+ return true;
+ }
+ return false;
+ }
+ default:
+ return false;
+ }
+ }
+
+ function tryToClaimNextHydratableInstance(fiber) {
+ if (!isHydrating) {
+ return;
+ }
+ var nextInstance = nextHydratableInstance;
+ if (!nextInstance) {
+ // Nothing to hydrate. Make it an insertion.
+ insertNonHydratedInstance(hydrationParentFiber, fiber);
+ isHydrating = false;
+ hydrationParentFiber = fiber;
+ return;
+ }
+ if (!tryHydrate(fiber, nextInstance)) {
+ // If we can't hydrate this instance let's try the next one.
+ // We use this as a heuristic. It's based on intuition and not data so it
+ // might be flawed or unnecessary.
+ nextInstance = getNextHydratableSibling(nextInstance);
+ if (!nextInstance || !tryHydrate(fiber, nextInstance)) {
+ // Nothing to hydrate. Make it an insertion.
+ insertNonHydratedInstance(hydrationParentFiber, fiber);
+ isHydrating = false;
+ hydrationParentFiber = fiber;
+ return;
+ }
+ // We matched the next one, we'll now assume that the first one was
+ // superfluous and we'll delete it. Since we can't eagerly delete it
+ // we'll have to schedule a deletion. To do that, this node needs a dummy
+ // fiber associated with it.
+ deleteHydratableInstance(
+ hydrationParentFiber,
+ nextHydratableInstance
+ );
+ }
+ hydrationParentFiber = fiber;
+ nextHydratableInstance = getFirstHydratableChild(nextInstance);
+ }
+
+ function prepareToHydrateHostInstance(
+ fiber,
+ rootContainerInstance,
+ hostContext
+ ) {
+ var instance = fiber.stateNode;
+ var updatePayload = hydrateInstance(
+ instance,
+ fiber.type,
+ fiber.memoizedProps,
+ rootContainerInstance,
+ hostContext,
+ fiber
+ );
+ // TODO: Type this specific to this type of component.
+ fiber.updateQueue = updatePayload;
+ // If the update payload indicates that there is a change or if there
+ // is a new ref we mark this as an update.
+ if (updatePayload !== null) {
+ return true;
+ }
+ return false;
+ }
+
+ function prepareToHydrateHostTextInstance(fiber) {
+ var textInstance = fiber.stateNode;
+ var textContent = fiber.memoizedProps;
+ var shouldUpdate = hydrateTextInstance(
+ textInstance,
+ textContent,
+ fiber
+ );
+ {
+ if (shouldUpdate) {
+ // We assume that prepareToHydrateHostTextInstance is called in a context where the
+ // hydration parent is the parent host component of this host text.
+ var returnFiber = hydrationParentFiber;
+ if (returnFiber !== null) {
+ switch (returnFiber.tag) {
+ case HostRoot: {
+ var parentContainer =
+ returnFiber.stateNode.containerInfo;
+ didNotMatchHydratedContainerTextInstance(
+ parentContainer,
+ textInstance,
+ textContent
+ );
+ break;
+ }
+ case HostComponent: {
+ var parentType = returnFiber.type;
+ var parentProps = returnFiber.memoizedProps;
+ var parentInstance = returnFiber.stateNode;
+ didNotMatchHydratedTextInstance(
+ parentType,
+ parentProps,
+ parentInstance,
+ textInstance,
+ textContent
+ );
+ break;
+ }
+ }
+ }
+ }
+ }
+ return shouldUpdate;
+ }
+
+ function popToNextHostParent(fiber) {
+ var parent = fiber["return"];
+ while (
+ parent !== null &&
+ parent.tag !== HostComponent &&
+ parent.tag !== HostRoot
+ ) {
+ parent = parent["return"];
+ }
+ hydrationParentFiber = parent;
+ }
+
+ function popHydrationState(fiber) {
+ if (fiber !== hydrationParentFiber) {
+ // We're deeper than the current hydration context, inside an inserted
+ // tree.
+ return false;
+ }
+ if (!isHydrating) {
+ // If we're not currently hydrating but we're in a hydration context, then
+ // we were an insertion and now need to pop up reenter hydration of our
+ // siblings.
+ popToNextHostParent(fiber);
+ isHydrating = true;
+ return false;
+ }
+
+ var type = fiber.type;
+
+ // If we have any remaining hydratable nodes, we need to delete them now.
+ // We only do this deeper than head and body since they tend to have random
+ // other nodes in them. We also ignore components with pure text content in
+ // side of them.
+ // TODO: Better heuristic.
+ if (
+ fiber.tag !== HostComponent ||
+ (type !== "head" &&
+ type !== "body" &&
+ !shouldSetTextContent(type, fiber.memoizedProps))
+ ) {
+ var nextInstance = nextHydratableInstance;
+ while (nextInstance) {
+ deleteHydratableInstance(fiber, nextInstance);
+ nextInstance = getNextHydratableSibling(nextInstance);
+ }
+ }
+
+ popToNextHostParent(fiber);
+ nextHydratableInstance = hydrationParentFiber
+ ? getNextHydratableSibling(fiber.stateNode)
+ : null;
+ return true;
+ }
+
+ function resetHydrationState() {
+ hydrationParentFiber = null;
+ nextHydratableInstance = null;
+ isHydrating = false;
+ }
+
+ return {
+ enterHydrationState: enterHydrationState,
+ resetHydrationState: resetHydrationState,
+ tryToClaimNextHydratableInstance: tryToClaimNextHydratableInstance,
+ prepareToHydrateHostInstance: prepareToHydrateHostInstance,
+ prepareToHydrateHostTextInstance: prepareToHydrateHostTextInstance,
+ popHydrationState: popHydrationState
+ };
+ };
+
+ // This lets us hook into Fiber to debug what it's doing.
+ // See https://github.com/facebook/react/pull/8033.
+ // This is not part of the public API, not even for React DevTools.
+ // You may only inject a debugTool if you work on React Fiber itself.
+ var ReactFiberInstrumentation = {
+ debugTool: null
+ };
+
+ var ReactFiberInstrumentation_1 = ReactFiberInstrumentation;
+
+ var defaultShowDialog = function(capturedError) {
+ return true;
+ };
+
+ var showDialog = defaultShowDialog;
+
+ function logCapturedError(capturedError) {
+ var logError = showDialog(capturedError);
+
+ // Allow injected showDialog() to prevent default console.error logging.
+ // This enables renderers like ReactNative to better manage redbox behavior.
+ if (logError === false) {
+ return;
+ }
+
+ var error = capturedError.error;
+ var suppressLogging = error && error.suppressReactErrorLogging;
+ if (suppressLogging) {
+ return;
+ }
+
+ {
+ var componentName = capturedError.componentName,
+ componentStack = capturedError.componentStack,
+ errorBoundaryName = capturedError.errorBoundaryName,
+ errorBoundaryFound = capturedError.errorBoundaryFound,
+ willRetry = capturedError.willRetry;
+
+ var componentNameMessage = componentName
+ ? "The above error occurred in the <" +
+ componentName +
+ "> component:"
+ : "The above error occurred in one of your React components:";
+
+ var errorBoundaryMessage = void 0;
+ // errorBoundaryFound check is sufficient; errorBoundaryName check is to satisfy Flow.
+ if (errorBoundaryFound && errorBoundaryName) {
+ if (willRetry) {
+ errorBoundaryMessage =
+ "React will try to recreate this component tree from scratch " +
+ ("using the error boundary you provided, " +
+ errorBoundaryName +
+ ".");
+ } else {
+ errorBoundaryMessage =
+ "This error was initially handled by the error boundary " +
+ errorBoundaryName +
+ ".\n" +
+ "Recreating the tree from scratch failed so React will unmount the tree.";
+ }
+ } else {
+ errorBoundaryMessage =
+ "Consider adding an error boundary to your tree to customize error handling behavior.\n" +
+ "Visit https://fb.me/react-error-boundaries to learn more about error boundaries.";
+ }
+ var combinedMessage =
+ "" +
+ componentNameMessage +
+ componentStack +
+ "\n\n" +
+ ("" + errorBoundaryMessage);
+
+ // In development, we provide our own message with just the component stack.
+ // We don't include the original error message and JS stack because the browser
+ // has already printed it. Even if the application swallows the error, it is still
+ // displayed by the browser thanks to the DEV-only fake event trick in ReactErrorUtils.
+ console.error(combinedMessage);
+ }
+ }
+
+ var invokeGuardedCallback$1 = ReactErrorUtils.invokeGuardedCallback;
+ var hasCaughtError = ReactErrorUtils.hasCaughtError;
+ var clearCaughtError = ReactErrorUtils.clearCaughtError;
+
+ {
+ var didWarnAboutStateTransition = false;
+ var didWarnSetStateChildContext = false;
+ var didWarnStateUpdateForUnmountedComponent = {};
+
+ var warnAboutUpdateOnUnmounted = function(fiber) {
+ var componentName = getComponentName(fiber) || "ReactClass";
+ if (didWarnStateUpdateForUnmountedComponent[componentName]) {
+ return;
+ }
+ warning(
+ false,
+ "Can only update a mounted or mounting " +
+ "component. This usually means you called setState, replaceState, " +
+ "or forceUpdate on an unmounted component. This is a no-op.\n\nPlease " +
+ "check the code for the %s component.",
+ componentName
+ );
+ didWarnStateUpdateForUnmountedComponent[componentName] = true;
+ };
+
+ var warnAboutInvalidUpdates = function(instance) {
+ switch (ReactDebugCurrentFiber.phase) {
+ case "getChildContext":
+ if (didWarnSetStateChildContext) {
+ return;
+ }
+ warning(
+ false,
+ "setState(...): Cannot call setState() inside getChildContext()"
+ );
+ didWarnSetStateChildContext = true;
+ break;
+ case "render":
+ if (didWarnAboutStateTransition) {
+ return;
+ }
+ warning(
+ false,
+ "Cannot update during an existing state transition (such as within " +
+ "`render` or another component's constructor). Render methods should " +
+ "be a pure function of props and state; constructor side-effects are " +
+ "an anti-pattern, but can be moved to `componentWillMount`."
+ );
+ didWarnAboutStateTransition = true;
+ break;
+ }
+ };
+ }
+
+ var ReactFiberScheduler = function(config) {
+ var hostContext = ReactFiberHostContext(config);
+ var hydrationContext = ReactFiberHydrationContext(config);
+ var popHostContainer = hostContext.popHostContainer,
+ popHostContext = hostContext.popHostContext,
+ resetHostContainer = hostContext.resetHostContainer;
+
+ var _ReactFiberBeginWork = ReactFiberBeginWork(
+ config,
+ hostContext,
+ hydrationContext,
+ scheduleWork,
+ computeExpirationForFiber
+ ),
+ beginWork = _ReactFiberBeginWork.beginWork,
+ beginFailedWork = _ReactFiberBeginWork.beginFailedWork;
+
+ var _ReactFiberCompleteWo = ReactFiberCompleteWork(
+ config,
+ hostContext,
+ hydrationContext
+ ),
+ completeWork = _ReactFiberCompleteWo.completeWork;
+
+ var _ReactFiberCommitWork = ReactFiberCommitWork(
+ config,
+ captureError
+ ),
+ commitResetTextContent =
+ _ReactFiberCommitWork.commitResetTextContent,
+ commitPlacement = _ReactFiberCommitWork.commitPlacement,
+ commitDeletion = _ReactFiberCommitWork.commitDeletion,
+ commitWork = _ReactFiberCommitWork.commitWork,
+ commitLifeCycles = _ReactFiberCommitWork.commitLifeCycles,
+ commitAttachRef = _ReactFiberCommitWork.commitAttachRef,
+ commitDetachRef = _ReactFiberCommitWork.commitDetachRef;
+
+ var now = config.now,
+ scheduleDeferredCallback = config.scheduleDeferredCallback,
+ cancelDeferredCallback = config.cancelDeferredCallback,
+ useSyncScheduling = config.useSyncScheduling,
+ prepareForCommit = config.prepareForCommit,
+ resetAfterCommit = config.resetAfterCommit;
+
+ // Represents the current time in ms.
+
+ var startTime = now();
+ var mostRecentCurrentTime = msToExpirationTime(0);
+
+ // Represents the expiration time that incoming updates should use. (If this
+ // is NoWork, use the default strategy: async updates in async mode, sync
+ // updates in sync mode.)
+ var expirationContext = NoWork;
+
+ var isWorking = false;
+
+ // The next work in progress fiber that we're currently working on.
+ var nextUnitOfWork = null;
+ var nextRoot = null;
+ // The time at which we're currently rendering work.
+ var nextRenderExpirationTime = NoWork;
+
+ // The next fiber with an effect that we're currently committing.
+ var nextEffect = null;
+
+ // Keep track of which fibers have captured an error that need to be handled.
+ // Work is removed from this collection after componentDidCatch is called.
+ var capturedErrors = null;
+ // Keep track of which fibers have failed during the current batch of work.
+ // This is a different set than capturedErrors, because it is not reset until
+ // the end of the batch. This is needed to propagate errors correctly if a
+ // subtree fails more than once.
+ var failedBoundaries = null;
+ // Error boundaries that captured an error during the current commit.
+ var commitPhaseBoundaries = null;
+ var firstUncaughtError = null;
+ var didFatal = false;
+
+ var isCommitting = false;
+ var isUnmounting = false;
+
+ // Used for performance tracking.
+ var interruptedBy = null;
+
+ function resetContextStack() {
+ // Reset the stack
+ reset$1();
+ // Reset the cursors
+ resetContext();
+ resetHostContainer();
+ }
+
+ function commitAllHostEffects() {
+ while (nextEffect !== null) {
+ {
+ ReactDebugCurrentFiber.setCurrentFiber(nextEffect);
+ }
+ recordEffect();
+
+ var effectTag = nextEffect.effectTag;
+ if (effectTag & ContentReset) {
+ commitResetTextContent(nextEffect);
+ }
+
+ if (effectTag & Ref) {
+ var current = nextEffect.alternate;
+ if (current !== null) {
+ commitDetachRef(current);
+ }
+ }
+
+ // The following switch statement is only concerned about placement,
+ // updates, and deletions. To avoid needing to add a case for every
+ // possible bitmap value, we remove the secondary effects from the
+ // effect tag and switch on that value.
+ var primaryEffectTag =
+ effectTag &
+ ~(Callback | Err | ContentReset | Ref | PerformedWork);
+ switch (primaryEffectTag) {
+ case Placement: {
+ commitPlacement(nextEffect);
+ // Clear the "placement" from effect tag so that we know that this is inserted, before
+ // any life-cycles like componentDidMount gets called.
+ // TODO: findDOMNode doesn't rely on this any more but isMounted
+ // does and isMounted is deprecated anyway so we should be able
+ // to kill this.
+ nextEffect.effectTag &= ~Placement;
+ break;
+ }
+ case PlacementAndUpdate: {
+ // Placement
+ commitPlacement(nextEffect);
+ // Clear the "placement" from effect tag so that we know that this is inserted, before
+ // any life-cycles like componentDidMount gets called.
+ nextEffect.effectTag &= ~Placement;
+
+ // Update
+ var _current = nextEffect.alternate;
+ commitWork(_current, nextEffect);
+ break;
+ }
+ case Update: {
+ var _current2 = nextEffect.alternate;
+ commitWork(_current2, nextEffect);
+ break;
+ }
+ case Deletion: {
+ isUnmounting = true;
+ commitDeletion(nextEffect);
+ isUnmounting = false;
+ break;
+ }
+ }
+ nextEffect = nextEffect.nextEffect;
+ }
+
+ {
+ ReactDebugCurrentFiber.resetCurrentFiber();
+ }
+ }
+
+ function commitAllLifeCycles() {
+ while (nextEffect !== null) {
+ var effectTag = nextEffect.effectTag;
+
+ if (effectTag & (Update | Callback)) {
+ recordEffect();
+ var current = nextEffect.alternate;
+ commitLifeCycles(current, nextEffect);
+ }
+
+ if (effectTag & Ref) {
+ recordEffect();
+ commitAttachRef(nextEffect);
+ }
+
+ if (effectTag & Err) {
+ recordEffect();
+ commitErrorHandling(nextEffect);
+ }
+
+ var next = nextEffect.nextEffect;
+ // Ensure that we clean these up so that we don't accidentally keep them.
+ // I'm not actually sure this matters because we can't reset firstEffect
+ // and lastEffect since they're on every node, not just the effectful
+ // ones. So we have to clean everything as we reuse nodes anyway.
+ nextEffect.nextEffect = null;
+ // Ensure that we reset the effectTag here so that we can rely on effect
+ // tags to reason about the current life-cycle.
+ nextEffect = next;
+ }
+ }
+
+ function commitRoot(finishedWork) {
+ // We keep track of this so that captureError can collect any boundaries
+ // that capture an error during the commit phase. The reason these aren't
+ // local to this function is because errors that occur during cWU are
+ // captured elsewhere, to prevent the unmount from being interrupted.
+ isWorking = true;
+ isCommitting = true;
+ startCommitTimer();
+
+ var root = finishedWork.stateNode;
+ !(root.current !== finishedWork)
+ ? invariant(
+ false,
+ "Cannot commit the same tree as before. This is probably a bug related to the return field. This error is likely caused by a bug in React. Please file an issue."
+ )
+ : void 0;
+ root.isReadyForCommit = false;
+
+ // Reset this to null before calling lifecycles
+ ReactCurrentOwner.current = null;
+
+ var firstEffect = void 0;
+ if (finishedWork.effectTag > PerformedWork) {
+ // A fiber's effect list consists only of its children, not itself. So if
+ // the root has an effect, we need to add it to the end of the list. The
+ // resulting list is the set that would belong to the root's parent, if
+ // it had one; that is, all the effects in the tree including the root.
+ if (finishedWork.lastEffect !== null) {
+ finishedWork.lastEffect.nextEffect = finishedWork;
+ firstEffect = finishedWork.firstEffect;
+ } else {
+ firstEffect = finishedWork;
+ }
+ } else {
+ // There is no effect on the root.
+ firstEffect = finishedWork.firstEffect;
+ }
+
+ prepareForCommit();
+
+ // Commit all the side-effects within a tree. We'll do this in two passes.
+ // The first pass performs all the host insertions, updates, deletions and
+ // ref unmounts.
+ nextEffect = firstEffect;
+ startCommitHostEffectsTimer();
+ while (nextEffect !== null) {
+ var didError = false;
+ var _error = void 0;
+ {
+ invokeGuardedCallback$1(null, commitAllHostEffects, null);
+ if (hasCaughtError()) {
+ didError = true;
+ _error = clearCaughtError();
+ }
+ }
+ if (didError) {
+ !(nextEffect !== null)
+ ? invariant(
+ false,
+ "Should have next effect. This error is likely caused by a bug in React. Please file an issue."
+ )
+ : void 0;
+ captureError(nextEffect, _error);
+ // Clean-up
+ if (nextEffect !== null) {
+ nextEffect = nextEffect.nextEffect;
+ }
+ }
+ }
+ stopCommitHostEffectsTimer();
+
+ resetAfterCommit();
+
+ // The work-in-progress tree is now the current tree. This must come after
+ // the first pass of the commit phase, so that the previous tree is still
+ // current during componentWillUnmount, but before the second pass, so that
+ // the finished work is current during componentDidMount/Update.
+ root.current = finishedWork;
+
+ // In the second pass we'll perform all life-cycles and ref callbacks.
+ // Life-cycles happen as a separate pass so that all placements, updates,
+ // and deletions in the entire tree have already been invoked.
+ // This pass also triggers any renderer-specific initial effects.
+ nextEffect = firstEffect;
+ startCommitLifeCyclesTimer();
+ while (nextEffect !== null) {
+ var _didError = false;
+ var _error2 = void 0;
+ {
+ invokeGuardedCallback$1(null, commitAllLifeCycles, null);
+ if (hasCaughtError()) {
+ _didError = true;
+ _error2 = clearCaughtError();
+ }
+ }
+ if (_didError) {
+ !(nextEffect !== null)
+ ? invariant(
+ false,
+ "Should have next effect. This error is likely caused by a bug in React. Please file an issue."
+ )
+ : void 0;
+ captureError(nextEffect, _error2);
+ if (nextEffect !== null) {
+ nextEffect = nextEffect.nextEffect;
+ }
+ }
+ }
+
+ isCommitting = false;
+ isWorking = false;
+ stopCommitLifeCyclesTimer();
+ stopCommitTimer();
+ if (typeof onCommitRoot === "function") {
+ onCommitRoot(finishedWork.stateNode);
+ }
+ if (true && ReactFiberInstrumentation_1.debugTool) {
+ ReactFiberInstrumentation_1.debugTool.onCommitWork(
+ finishedWork
+ );
+ }
+
+ // If we caught any errors during this commit, schedule their boundaries
+ // to update.
+ if (commitPhaseBoundaries) {
+ commitPhaseBoundaries.forEach(scheduleErrorRecovery);
+ commitPhaseBoundaries = null;
+ }
+
+ if (firstUncaughtError !== null) {
+ var _error3 = firstUncaughtError;
+ firstUncaughtError = null;
+ onUncaughtError(_error3);
+ }
+
+ var remainingTime = root.current.expirationTime;
+
+ if (remainingTime === NoWork) {
+ capturedErrors = null;
+ failedBoundaries = null;
+ }
+
+ return remainingTime;
+ }
+
+ function resetExpirationTime(workInProgress, renderTime) {
+ if (
+ renderTime !== Never &&
+ workInProgress.expirationTime === Never
+ ) {
+ // The children of this component are hidden. Don't bubble their
+ // expiration times.
+ return;
+ }
+
+ // Check for pending updates.
+ var newExpirationTime = getUpdateExpirationTime(workInProgress);
+
+ // TODO: Calls need to visit stateNode
+
+ // Bubble up the earliest expiration time.
+ var child = workInProgress.child;
+ while (child !== null) {
+ if (
+ child.expirationTime !== NoWork &&
+ (newExpirationTime === NoWork ||
+ newExpirationTime > child.expirationTime)
+ ) {
+ newExpirationTime = child.expirationTime;
+ }
+ child = child.sibling;
+ }
+ workInProgress.expirationTime = newExpirationTime;
+ }
+
+ function completeUnitOfWork(workInProgress) {
+ while (true) {
+ // The current, flushed, state of this fiber is the alternate.
+ // Ideally nothing should rely on this, but relying on it here
+ // means that we don't need an additional field on the work in
+ // progress.
+ var current = workInProgress.alternate;
+ {
+ ReactDebugCurrentFiber.setCurrentFiber(workInProgress);
+ }
+ var next = completeWork(
+ current,
+ workInProgress,
+ nextRenderExpirationTime
+ );
+ {
+ ReactDebugCurrentFiber.resetCurrentFiber();
+ }
+
+ var returnFiber = workInProgress["return"];
+ var siblingFiber = workInProgress.sibling;
+
+ resetExpirationTime(workInProgress, nextRenderExpirationTime);
+
+ if (next !== null) {
+ stopWorkTimer(workInProgress);
+ if (true && ReactFiberInstrumentation_1.debugTool) {
+ ReactFiberInstrumentation_1.debugTool.onCompleteWork(
+ workInProgress
+ );
+ }
+ // If completing this work spawned new work, do that next. We'll come
+ // back here again.
+ return next;
+ }
+
+ if (returnFiber !== null) {
+ // Append all the effects of the subtree and this fiber onto the effect
+ // list of the parent. The completion order of the children affects the
+ // side-effect order.
+ if (returnFiber.firstEffect === null) {
+ returnFiber.firstEffect = workInProgress.firstEffect;
+ }
+ if (workInProgress.lastEffect !== null) {
+ if (returnFiber.lastEffect !== null) {
+ returnFiber.lastEffect.nextEffect =
+ workInProgress.firstEffect;
+ }
+ returnFiber.lastEffect = workInProgress.lastEffect;
+ }
+
+ // If this fiber had side-effects, we append it AFTER the children's
+ // side-effects. We can perform certain side-effects earlier if
+ // needed, by doing multiple passes over the effect list. We don't want
+ // to schedule our own side-effect on our own list because if end up
+ // reusing children we'll schedule this effect onto itself since we're
+ // at the end.
+ var effectTag = workInProgress.effectTag;
+ // Skip both NoWork and PerformedWork tags when creating the effect list.
+ // PerformedWork effect is read by React DevTools but shouldn't be committed.
+ if (effectTag > PerformedWork) {
+ if (returnFiber.lastEffect !== null) {
+ returnFiber.lastEffect.nextEffect = workInProgress;
+ } else {
+ returnFiber.firstEffect = workInProgress;
+ }
+ returnFiber.lastEffect = workInProgress;
+ }
+ }
+
+ stopWorkTimer(workInProgress);
+ if (true && ReactFiberInstrumentation_1.debugTool) {
+ ReactFiberInstrumentation_1.debugTool.onCompleteWork(
+ workInProgress
+ );
+ }
+
+ if (siblingFiber !== null) {
+ // If there is more work to do in this returnFiber, do that next.
+ return siblingFiber;
+ } else if (returnFiber !== null) {
+ // If there's no more work in this returnFiber. Complete the returnFiber.
+ workInProgress = returnFiber;
+ continue;
+ } else {
+ // We've reached the root.
+ var root = workInProgress.stateNode;
+ root.isReadyForCommit = true;
+ return null;
+ }
+ }
+
+ // Without this explicit null return Flow complains of invalid return type
+ // TODO Remove the above while(true) loop
+ // eslint-disable-next-line no-unreachable
+ return null;
+ }
+
+ function performUnitOfWork(workInProgress) {
+ // The current, flushed, state of this fiber is the alternate.
+ // Ideally nothing should rely on this, but relying on it here
+ // means that we don't need an additional field on the work in
+ // progress.
+ var current = workInProgress.alternate;
+
+ // See if beginning this work spawns more work.
+ startWorkTimer(workInProgress);
+ {
+ ReactDebugCurrentFiber.setCurrentFiber(workInProgress);
+ }
+
+ var next = beginWork(
+ current,
+ workInProgress,
+ nextRenderExpirationTime
+ );
+ {
+ ReactDebugCurrentFiber.resetCurrentFiber();
+ }
+ if (true && ReactFiberInstrumentation_1.debugTool) {
+ ReactFiberInstrumentation_1.debugTool.onBeginWork(
+ workInProgress
+ );
+ }
+
+ if (next === null) {
+ // If this doesn't spawn new work, complete the current work.
+ next = completeUnitOfWork(workInProgress);
+ }
+
+ ReactCurrentOwner.current = null;
+
+ return next;
+ }
+
+ function performFailedUnitOfWork(workInProgress) {
+ // The current, flushed, state of this fiber is the alternate.
+ // Ideally nothing should rely on this, but relying on it here
+ // means that we don't need an additional field on the work in
+ // progress.
+ var current = workInProgress.alternate;
+
+ // See if beginning this work spawns more work.
+ startWorkTimer(workInProgress);
+ {
+ ReactDebugCurrentFiber.setCurrentFiber(workInProgress);
+ }
+ var next = beginFailedWork(
+ current,
+ workInProgress,
+ nextRenderExpirationTime
+ );
+ {
+ ReactDebugCurrentFiber.resetCurrentFiber();
+ }
+ if (true && ReactFiberInstrumentation_1.debugTool) {
+ ReactFiberInstrumentation_1.debugTool.onBeginWork(
+ workInProgress
+ );
+ }
+
+ if (next === null) {
+ // If this doesn't spawn new work, complete the current work.
+ next = completeUnitOfWork(workInProgress);
+ }
+
+ ReactCurrentOwner.current = null;
+
+ return next;
+ }
+
+ function workLoop(expirationTime) {
+ if (capturedErrors !== null) {
+ // If there are unhandled errors, switch to the slow work loop.
+ // TODO: How to avoid this check in the fast path? Maybe the renderer
+ // could keep track of which roots have unhandled errors and call a
+ // forked version of renderRoot.
+ slowWorkLoopThatChecksForFailedWork(expirationTime);
+ return;
+ }
+ if (
+ nextRenderExpirationTime === NoWork ||
+ nextRenderExpirationTime > expirationTime
+ ) {
+ return;
+ }
+
+ if (nextRenderExpirationTime <= mostRecentCurrentTime) {
+ // Flush all expired work.
+ while (nextUnitOfWork !== null) {
+ nextUnitOfWork = performUnitOfWork(nextUnitOfWork);
+ }
+ } else {
+ // Flush asynchronous work until the deadline runs out of time.
+ while (nextUnitOfWork !== null && !shouldYield()) {
+ nextUnitOfWork = performUnitOfWork(nextUnitOfWork);
+ }
+ }
+ }
+
+ function slowWorkLoopThatChecksForFailedWork(expirationTime) {
+ if (
+ nextRenderExpirationTime === NoWork ||
+ nextRenderExpirationTime > expirationTime
+ ) {
+ return;
+ }
+
+ if (nextRenderExpirationTime <= mostRecentCurrentTime) {
+ // Flush all expired work.
+ while (nextUnitOfWork !== null) {
+ if (hasCapturedError(nextUnitOfWork)) {
+ // Use a forked version of performUnitOfWork
+ nextUnitOfWork = performFailedUnitOfWork(nextUnitOfWork);
+ } else {
+ nextUnitOfWork = performUnitOfWork(nextUnitOfWork);
+ }
+ }
+ } else {
+ // Flush asynchronous work until the deadline runs out of time.
+ while (nextUnitOfWork !== null && !shouldYield()) {
+ if (hasCapturedError(nextUnitOfWork)) {
+ // Use a forked version of performUnitOfWork
+ nextUnitOfWork = performFailedUnitOfWork(nextUnitOfWork);
+ } else {
+ nextUnitOfWork = performUnitOfWork(nextUnitOfWork);
+ }
+ }
+ }
+ }
+
+ function renderRootCatchBlock(
+ root,
+ failedWork,
+ boundary,
+ expirationTime
+ ) {
+ // We're going to restart the error boundary that captured the error.
+ // Conceptually, we're unwinding the stack. We need to unwind the
+ // context stack, too.
+ unwindContexts(failedWork, boundary);
+
+ // Restart the error boundary using a forked version of
+ // performUnitOfWork that deletes the boundary's children. The entire
+ // failed subree will be unmounted. During the commit phase, a special
+ // lifecycle method is called on the error boundary, which triggers
+ // a re-render.
+ nextUnitOfWork = performFailedUnitOfWork(boundary);
+
+ // Continue working.
+ workLoop(expirationTime);
+ }
+
+ function renderRoot(root, expirationTime) {
+ !!isWorking
+ ? invariant(
+ false,
+ "renderRoot was called recursively. This error is likely caused by a bug in React. Please file an issue."
+ )
+ : void 0;
+ isWorking = true;
+
+ // We're about to mutate the work-in-progress tree. If the root was pending
+ // commit, it no longer is: we'll need to complete it again.
+ root.isReadyForCommit = false;
+
+ // Check if we're starting from a fresh stack, or if we're resuming from
+ // previously yielded work.
+ if (
+ root !== nextRoot ||
+ expirationTime !== nextRenderExpirationTime ||
+ nextUnitOfWork === null
+ ) {
+ // Reset the stack and start working from the root.
+ resetContextStack();
+ nextRoot = root;
+ nextRenderExpirationTime = expirationTime;
+ nextUnitOfWork = createWorkInProgress(
+ nextRoot.current,
+ null,
+ expirationTime
+ );
+ }
+
+ startWorkLoopTimer(nextUnitOfWork);
+
+ var didError = false;
+ var error = null;
+ {
+ invokeGuardedCallback$1(null, workLoop, null, expirationTime);
+ if (hasCaughtError()) {
+ didError = true;
+ error = clearCaughtError();
+ }
+ }
+
+ // An error was thrown during the render phase.
+ while (didError) {
+ if (didFatal) {
+ // This was a fatal error. Don't attempt to recover from it.
+ firstUncaughtError = error;
+ break;
+ }
+
+ var failedWork = nextUnitOfWork;
+ if (failedWork === null) {
+ // An error was thrown but there's no current unit of work. This can
+ // happen during the commit phase if there's a bug in the renderer.
+ didFatal = true;
+ continue;
+ }
+
+ // "Capture" the error by finding the nearest boundary. If there is no
+ // error boundary, we use the root.
+ var boundary = captureError(failedWork, error);
+ !(boundary !== null)
+ ? invariant(
+ false,
+ "Should have found an error boundary. This error is likely caused by a bug in React. Please file an issue."
+ )
+ : void 0;
+
+ if (didFatal) {
+ // The error we just captured was a fatal error. This happens
+ // when the error propagates to the root more than once.
+ continue;
+ }
+
+ didError = false;
+ error = null;
+ {
+ invokeGuardedCallback$1(
+ null,
+ renderRootCatchBlock,
+ null,
+ root,
+ failedWork,
+ boundary,
+ expirationTime
+ );
+ if (hasCaughtError()) {
+ didError = true;
+ error = clearCaughtError();
+ continue;
+ }
+ }
+ // We're finished working. Exit the error loop.
+ break;
+ }
+
+ var uncaughtError = firstUncaughtError;
+
+ // We're done performing work. Time to clean up.
+ stopWorkLoopTimer(interruptedBy);
+ interruptedBy = null;
+ isWorking = false;
+ didFatal = false;
+ firstUncaughtError = null;
+
+ if (uncaughtError !== null) {
+ onUncaughtError(uncaughtError);
+ }
+
+ return root.isReadyForCommit ? root.current.alternate : null;
+ }
+
+ // Returns the boundary that captured the error, or null if the error is ignored
+ function captureError(failedWork, error) {
+ // It is no longer valid because we exited the user code.
+ ReactCurrentOwner.current = null;
+ {
+ ReactDebugCurrentFiber.resetCurrentFiber();
+ }
+
+ // Search for the nearest error boundary.
+ var boundary = null;
+
+ // Passed to logCapturedError()
+ var errorBoundaryFound = false;
+ var willRetry = false;
+ var errorBoundaryName = null;
+
+ // Host containers are a special case. If the failed work itself is a host
+ // container, then it acts as its own boundary. In all other cases, we
+ // ignore the work itself and only search through the parents.
+ if (failedWork.tag === HostRoot) {
+ boundary = failedWork;
+
+ if (isFailedBoundary(failedWork)) {
+ // If this root already failed, there must have been an error when
+ // attempting to unmount it. This is a worst-case scenario and
+ // should only be possible if there's a bug in the renderer.
+ didFatal = true;
+ }
+ } else {
+ var node = failedWork["return"];
+ while (node !== null && boundary === null) {
+ if (node.tag === ClassComponent) {
+ var instance = node.stateNode;
+ if (typeof instance.componentDidCatch === "function") {
+ errorBoundaryFound = true;
+ errorBoundaryName = getComponentName(node);
+
+ // Found an error boundary!
+ boundary = node;
+ willRetry = true;
+ }
+ } else if (node.tag === HostRoot) {
+ // Treat the root like a no-op error boundary
+ boundary = node;
+ }
+
+ if (isFailedBoundary(node)) {
+ // This boundary is already in a failed state.
+
+ // If we're currently unmounting, that means this error was
+ // thrown while unmounting a failed subtree. We should ignore
+ // the error.
+ if (isUnmounting) {
+ return null;
+ }
+
+ // If we're in the commit phase, we should check to see if
+ // this boundary already captured an error during this commit.
+ // This case exists because multiple errors can be thrown during
+ // a single commit without interruption.
+ if (
+ commitPhaseBoundaries !== null &&
+ (commitPhaseBoundaries.has(node) ||
+ (node.alternate !== null &&
+ commitPhaseBoundaries.has(node.alternate)))
+ ) {
+ // If so, we should ignore this error.
+ return null;
+ }
+
+ // The error should propagate to the next boundary -— we keep looking.
+ boundary = null;
+ willRetry = false;
+ }
+
+ node = node["return"];
+ }
+ }
+
+ if (boundary !== null) {
+ // Add to the collection of failed boundaries. This lets us know that
+ // subsequent errors in this subtree should propagate to the next boundary.
+ if (failedBoundaries === null) {
+ failedBoundaries = new Set();
+ }
+ failedBoundaries.add(boundary);
+
+ // This method is unsafe outside of the begin and complete phases.
+ // We might be in the commit phase when an error is captured.
+ // The risk is that the return path from this Fiber may not be accurate.
+ // That risk is acceptable given the benefit of providing users more context.
+ var _componentStack = getStackAddendumByWorkInProgressFiber(
+ failedWork
+ );
+ var _componentName = getComponentName(failedWork);
+
+ // Add to the collection of captured errors. This is stored as a global
+ // map of errors and their component stack location keyed by the boundaries
+ // that capture them. We mostly use this Map as a Set; it's a Map only to
+ // avoid adding a field to Fiber to store the error.
+ if (capturedErrors === null) {
+ capturedErrors = new Map();
+ }
+
+ var capturedError = {
+ componentName: _componentName,
+ componentStack: _componentStack,
+ error: error,
+ errorBoundary: errorBoundaryFound
+ ? boundary.stateNode
+ : null,
+ errorBoundaryFound: errorBoundaryFound,
+ errorBoundaryName: errorBoundaryName,
+ willRetry: willRetry
+ };
+
+ capturedErrors.set(boundary, capturedError);
+
+ try {
+ logCapturedError(capturedError);
+ } catch (e) {
+ // Prevent cycle if logCapturedError() throws.
+ // A cycle may still occur if logCapturedError renders a component that throws.
+ var suppressLogging = e && e.suppressReactErrorLogging;
+ if (!suppressLogging) {
+ console.error(e);
+ }
+ }
+
+ // If we're in the commit phase, defer scheduling an update on the
+ // boundary until after the commit is complete
+ if (isCommitting) {
+ if (commitPhaseBoundaries === null) {
+ commitPhaseBoundaries = new Set();
+ }
+ commitPhaseBoundaries.add(boundary);
+ } else {
+ // Otherwise, schedule an update now.
+ // TODO: Is this actually necessary during the render phase? Is it
+ // possible to unwind and continue rendering at the same priority,
+ // without corrupting internal state?
+ scheduleErrorRecovery(boundary);
+ }
+ return boundary;
+ } else if (firstUncaughtError === null) {
+ // If no boundary is found, we'll need to throw the error
+ firstUncaughtError = error;
+ }
+ return null;
+ }
+
+ function hasCapturedError(fiber) {
+ // TODO: capturedErrors should store the boundary instance, to avoid needing
+ // to check the alternate.
+ return (
+ capturedErrors !== null &&
+ (capturedErrors.has(fiber) ||
+ (fiber.alternate !== null &&
+ capturedErrors.has(fiber.alternate)))
+ );
+ }
+
+ function isFailedBoundary(fiber) {
+ // TODO: failedBoundaries should store the boundary instance, to avoid
+ // needing to check the alternate.
+ return (
+ failedBoundaries !== null &&
+ (failedBoundaries.has(fiber) ||
+ (fiber.alternate !== null &&
+ failedBoundaries.has(fiber.alternate)))
+ );
+ }
+
+ function commitErrorHandling(effectfulFiber) {
+ var capturedError = void 0;
+ if (capturedErrors !== null) {
+ capturedError = capturedErrors.get(effectfulFiber);
+ capturedErrors["delete"](effectfulFiber);
+ if (capturedError == null) {
+ if (effectfulFiber.alternate !== null) {
+ effectfulFiber = effectfulFiber.alternate;
+ capturedError = capturedErrors.get(effectfulFiber);
+ capturedErrors["delete"](effectfulFiber);
+ }
+ }
+ }
+
+ !(capturedError != null)
+ ? invariant(
+ false,
+ "No error for given unit of work. This error is likely caused by a bug in React. Please file an issue."
+ )
+ : void 0;
+
+ switch (effectfulFiber.tag) {
+ case ClassComponent:
+ var instance = effectfulFiber.stateNode;
+
+ var info = {
+ componentStack: capturedError.componentStack
+ };
+
+ // Allow the boundary to handle the error, usually by scheduling
+ // an update to itself
+ instance.componentDidCatch(capturedError.error, info);
+ return;
+ case HostRoot:
+ if (firstUncaughtError === null) {
+ firstUncaughtError = capturedError.error;
+ }
+ return;
+ default:
+ invariant(
+ false,
+ "Invalid type of work. This error is likely caused by a bug in React. Please file an issue."
+ );
+ }
+ }
+
+ function unwindContexts(from, to) {
+ var node = from;
+ while (node !== null) {
+ switch (node.tag) {
+ case ClassComponent:
+ popContextProvider(node);
+ break;
+ case HostComponent:
+ popHostContext(node);
+ break;
+ case HostRoot:
+ popHostContainer(node);
+ break;
+ case HostPortal:
+ popHostContainer(node);
+ break;
+ }
+ if (node === to || node.alternate === to) {
+ stopFailedWorkTimer(node);
+ break;
+ } else {
+ stopWorkTimer(node);
+ }
+ node = node["return"];
+ }
+ }
+
+ function computeAsyncExpiration() {
+ // Given the current clock time, returns an expiration time. We use rounding
+ // to batch like updates together.
+ // Should complete within ~1000ms. 1200ms max.
+ var currentTime = recalculateCurrentTime();
+ var expirationMs = 1000;
+ var bucketSizeMs = 200;
+ return computeExpirationBucket(
+ currentTime,
+ expirationMs,
+ bucketSizeMs
+ );
+ }
+
+ function computeExpirationForFiber(fiber) {
+ var expirationTime = void 0;
+ if (expirationContext !== NoWork) {
+ // An explicit expiration context was set;
+ expirationTime = expirationContext;
+ } else if (isWorking) {
+ if (isCommitting) {
+ // Updates that occur during the commit phase should have sync priority
+ // by default.
+ expirationTime = Sync;
+ } else {
+ // Updates during the render phase should expire at the same time as
+ // the work that is being rendered.
+ expirationTime = nextRenderExpirationTime;
+ }
+ } else {
+ // No explicit expiration context was set, and we're not currently
+ // performing work. Calculate a new expiration time.
+ if (
+ useSyncScheduling &&
+ !(fiber.internalContextTag & AsyncUpdates)
+ ) {
+ // This is a sync update
+ expirationTime = Sync;
+ } else {
+ // This is an async update
+ expirationTime = computeAsyncExpiration();
+ }
+ }
+ return expirationTime;
+ }
+
+ function scheduleWork(fiber, expirationTime) {
+ return scheduleWorkImpl(fiber, expirationTime, false);
+ }
+
+ function checkRootNeedsClearing(root, fiber, expirationTime) {
+ if (
+ !isWorking &&
+ root === nextRoot &&
+ expirationTime < nextRenderExpirationTime
+ ) {
+ // Restart the root from the top.
+ if (nextUnitOfWork !== null) {
+ // This is an interruption. (Used for performance tracking.)
+ interruptedBy = fiber;
+ }
+ nextRoot = null;
+ nextUnitOfWork = null;
+ nextRenderExpirationTime = NoWork;
+ }
+ }
+
+ function scheduleWorkImpl(
+ fiber,
+ expirationTime,
+ isErrorRecovery
+ ) {
+ recordScheduleUpdate();
+
+ {
+ if (!isErrorRecovery && fiber.tag === ClassComponent) {
+ var instance = fiber.stateNode;
+ warnAboutInvalidUpdates(instance);
+ }
+ }
+
+ var node = fiber;
+ while (node !== null) {
+ // Walk the parent path to the root and update each node's
+ // expiration time.
+ if (
+ node.expirationTime === NoWork ||
+ node.expirationTime > expirationTime
+ ) {
+ node.expirationTime = expirationTime;
+ }
+ if (node.alternate !== null) {
+ if (
+ node.alternate.expirationTime === NoWork ||
+ node.alternate.expirationTime > expirationTime
+ ) {
+ node.alternate.expirationTime = expirationTime;
+ }
+ }
+ if (node["return"] === null) {
+ if (node.tag === HostRoot) {
+ var root = node.stateNode;
+
+ checkRootNeedsClearing(root, fiber, expirationTime);
+ requestWork(root, expirationTime);
+ checkRootNeedsClearing(root, fiber, expirationTime);
+ } else {
+ {
+ if (!isErrorRecovery && fiber.tag === ClassComponent) {
+ warnAboutUpdateOnUnmounted(fiber);
+ }
+ }
+ return;
+ }
+ }
+ node = node["return"];
+ }
+ }
+
+ function scheduleErrorRecovery(fiber) {
+ scheduleWorkImpl(fiber, Sync, true);
+ }
+
+ function recalculateCurrentTime() {
+ // Subtract initial time so it fits inside 32bits
+ var ms = now() - startTime;
+ mostRecentCurrentTime = msToExpirationTime(ms);
+ return mostRecentCurrentTime;
+ }
+
+ function deferredUpdates(fn) {
+ var previousExpirationContext = expirationContext;
+ expirationContext = computeAsyncExpiration();
+ try {
+ return fn();
+ } finally {
+ expirationContext = previousExpirationContext;
+ }
+ }
+
+ function syncUpdates(fn) {
+ var previousExpirationContext = expirationContext;
+ expirationContext = Sync;
+ try {
+ return fn();
+ } finally {
+ expirationContext = previousExpirationContext;
+ }
+ }
+
+ // TODO: Everything below this is written as if it has been lifted to the
+ // renderers. I'll do this in a follow-up.
+
+ // Linked-list of roots
+ var firstScheduledRoot = null;
+ var lastScheduledRoot = null;
+
+ var callbackExpirationTime = NoWork;
+ var callbackID = -1;
+ var isRendering = false;
+ var nextFlushedRoot = null;
+ var nextFlushedExpirationTime = NoWork;
+ var deadlineDidExpire = false;
+ var hasUnhandledError = false;
+ var unhandledError = null;
+ var deadline = null;
+
+ var isBatchingUpdates = false;
+ var isUnbatchingUpdates = false;
+
+ // Use these to prevent an infinite loop of nested updates
+ var NESTED_UPDATE_LIMIT = 1000;
+ var nestedUpdateCount = 0;
+
+ var timeHeuristicForUnitOfWork = 1;
+
+ function scheduleCallbackWithExpiration(expirationTime) {
+ if (callbackExpirationTime !== NoWork) {
+ // A callback is already scheduled. Check its expiration time (timeout).
+ if (expirationTime > callbackExpirationTime) {
+ // Existing callback has sufficient timeout. Exit.
+ return;
+ } else {
+ // Existing callback has insufficient timeout. Cancel and schedule a
+ // new one.
+ cancelDeferredCallback(callbackID);
+ }
+ // The request callback timer is already running. Don't start a new one.
+ } else {
+ startRequestCallbackTimer();
+ }
+
+ // Compute a timeout for the given expiration time.
+ var currentMs = now() - startTime;
+ var expirationMs = expirationTimeToMs(expirationTime);
+ var timeout = expirationMs - currentMs;
+
+ callbackExpirationTime = expirationTime;
+ callbackID = scheduleDeferredCallback(performAsyncWork, {
+ timeout: timeout
+ });
+ }
+
+ // requestWork is called by the scheduler whenever a root receives an update.
+ // It's up to the renderer to call renderRoot at some point in the future.
+ function requestWork(root, expirationTime) {
+ if (nestedUpdateCount > NESTED_UPDATE_LIMIT) {
+ invariant(
+ false,
+ "Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops."
+ );
+ }
+
+ // Add the root to the schedule.
+ // Check if this root is already part of the schedule.
+ if (root.nextScheduledRoot === null) {
+ // This root is not already scheduled. Add it.
+ root.remainingExpirationTime = expirationTime;
+ if (lastScheduledRoot === null) {
+ firstScheduledRoot = lastScheduledRoot = root;
+ root.nextScheduledRoot = root;
+ } else {
+ lastScheduledRoot.nextScheduledRoot = root;
+ lastScheduledRoot = root;
+ lastScheduledRoot.nextScheduledRoot = firstScheduledRoot;
+ }
+ } else {
+ // This root is already scheduled, but its priority may have increased.
+ var remainingExpirationTime = root.remainingExpirationTime;
+ if (
+ remainingExpirationTime === NoWork ||
+ expirationTime < remainingExpirationTime
+ ) {
+ // Update the priority.
+ root.remainingExpirationTime = expirationTime;
+ }
+ }
+
+ if (isRendering) {
+ // Prevent reentrancy. Remaining work will be scheduled at the end of
+ // the currently rendering batch.
+ return;
+ }
+
+ if (isBatchingUpdates) {
+ // Flush work at the end of the batch.
+ if (isUnbatchingUpdates) {
+ // ...unless we're inside unbatchedUpdates, in which case we should
+ // flush it now.
+ nextFlushedRoot = root;
+ nextFlushedExpirationTime = Sync;
+ performWorkOnRoot(
+ nextFlushedRoot,
+ nextFlushedExpirationTime
+ );
+ }
+ return;
+ }
+
+ // TODO: Get rid of Sync and use current time?
+ if (expirationTime === Sync) {
+ performWork(Sync, null);
+ } else {
+ scheduleCallbackWithExpiration(expirationTime);
+ }
+ }
+
+ function findHighestPriorityRoot() {
+ var highestPriorityWork = NoWork;
+ var highestPriorityRoot = null;
+
+ if (lastScheduledRoot !== null) {
+ var previousScheduledRoot = lastScheduledRoot;
+ var root = firstScheduledRoot;
+ while (root !== null) {
+ var remainingExpirationTime = root.remainingExpirationTime;
+ if (remainingExpirationTime === NoWork) {
+ // This root no longer has work. Remove it from the scheduler.
+
+ // TODO: This check is redudant, but Flow is confused by the branch
+ // below where we set lastScheduledRoot to null, even though we break
+ // from the loop right after.
+ !(
+ previousScheduledRoot !== null &&
+ lastScheduledRoot !== null
+ )
+ ? invariant(
+ false,
+ "Should have a previous and last root. This error is likely caused by a bug in React. Please file an issue."
+ )
+ : void 0;
+ if (root === root.nextScheduledRoot) {
+ // This is the only root in the list.
+ root.nextScheduledRoot = null;
+ firstScheduledRoot = lastScheduledRoot = null;
+ break;
+ } else if (root === firstScheduledRoot) {
+ // This is the first root in the list.
+ var next = root.nextScheduledRoot;
+ firstScheduledRoot = next;
+ lastScheduledRoot.nextScheduledRoot = next;
+ root.nextScheduledRoot = null;
+ } else if (root === lastScheduledRoot) {
+ // This is the last root in the list.
+ lastScheduledRoot = previousScheduledRoot;
+ lastScheduledRoot.nextScheduledRoot = firstScheduledRoot;
+ root.nextScheduledRoot = null;
+ break;
+ } else {
+ previousScheduledRoot.nextScheduledRoot =
+ root.nextScheduledRoot;
+ root.nextScheduledRoot = null;
+ }
+ root = previousScheduledRoot.nextScheduledRoot;
+ } else {
+ if (
+ highestPriorityWork === NoWork ||
+ remainingExpirationTime < highestPriorityWork
+ ) {
+ // Update the priority, if it's higher
+ highestPriorityWork = remainingExpirationTime;
+ highestPriorityRoot = root;
+ }
+ if (root === lastScheduledRoot) {
+ break;
+ }
+ previousScheduledRoot = root;
+ root = root.nextScheduledRoot;
+ }
+ }
+ }
+
+ // If the next root is the same as the previous root, this is a nested
+ // update. To prevent an infinite loop, increment the nested update count.
+ var previousFlushedRoot = nextFlushedRoot;
+ if (
+ previousFlushedRoot !== null &&
+ previousFlushedRoot === highestPriorityRoot
+ ) {
+ nestedUpdateCount++;
+ } else {
+ // Reset whenever we switch roots.
+ nestedUpdateCount = 0;
+ }
+ nextFlushedRoot = highestPriorityRoot;
+ nextFlushedExpirationTime = highestPriorityWork;
+ }
+
+ function performAsyncWork(dl) {
+ performWork(NoWork, dl);
+ }
+
+ function performWork(minExpirationTime, dl) {
+ deadline = dl;
+
+ // Keep working on roots until there's no more work, or until the we reach
+ // the deadline.
+ findHighestPriorityRoot();
+
+ if (enableUserTimingAPI && deadline !== null) {
+ var didExpire =
+ nextFlushedExpirationTime < recalculateCurrentTime();
+ stopRequestCallbackTimer(didExpire);
+ }
+
+ while (
+ nextFlushedRoot !== null &&
+ nextFlushedExpirationTime !== NoWork &&
+ (minExpirationTime === NoWork ||
+ nextFlushedExpirationTime <= minExpirationTime) &&
+ !deadlineDidExpire
+ ) {
+ performWorkOnRoot(nextFlushedRoot, nextFlushedExpirationTime);
+ // Find the next highest priority work.
+ findHighestPriorityRoot();
+ }
+
+ // We're done flushing work. Either we ran out of time in this callback,
+ // or there's no more work left with sufficient priority.
+
+ // If we're inside a callback, set this to false since we just completed it.
+ if (deadline !== null) {
+ callbackExpirationTime = NoWork;
+ callbackID = -1;
+ }
+ // If there's work left over, schedule a new callback.
+ if (nextFlushedExpirationTime !== NoWork) {
+ scheduleCallbackWithExpiration(nextFlushedExpirationTime);
+ }
+
+ // Clean-up.
+ deadline = null;
+ deadlineDidExpire = false;
+ nestedUpdateCount = 0;
+
+ if (hasUnhandledError) {
+ var _error4 = unhandledError;
+ unhandledError = null;
+ hasUnhandledError = false;
+ throw _error4;
+ }
+ }
+
+ function performWorkOnRoot(root, expirationTime) {
+ !!isRendering
+ ? invariant(
+ false,
+ "performWorkOnRoot was called recursively. This error is likely caused by a bug in React. Please file an issue."
+ )
+ : void 0;
+
+ isRendering = true;
+
+ // Check if this is async work or sync/expired work.
+ // TODO: Pass current time as argument to renderRoot, commitRoot
+ if (expirationTime <= recalculateCurrentTime()) {
+ // Flush sync work.
+ var finishedWork = root.finishedWork;
+ if (finishedWork !== null) {
+ // This root is already complete. We can commit it.
+ root.finishedWork = null;
+ root.remainingExpirationTime = commitRoot(finishedWork);
+ } else {
+ root.finishedWork = null;
+ finishedWork = renderRoot(root, expirationTime);
+ if (finishedWork !== null) {
+ // We've completed the root. Commit it.
+ root.remainingExpirationTime = commitRoot(finishedWork);
+ }
+ }
+ } else {
+ // Flush async work.
+ var _finishedWork = root.finishedWork;
+ if (_finishedWork !== null) {
+ // This root is already complete. We can commit it.
+ root.finishedWork = null;
+ root.remainingExpirationTime = commitRoot(_finishedWork);
+ } else {
+ root.finishedWork = null;
+ _finishedWork = renderRoot(root, expirationTime);
+ if (_finishedWork !== null) {
+ // We've completed the root. Check the deadline one more time
+ // before committing.
+ if (!shouldYield()) {
+ // Still time left. Commit the root.
+ root.remainingExpirationTime = commitRoot(
+ _finishedWork
+ );
+ } else {
+ // There's no time left. Mark this root as complete. We'll come
+ // back and commit it later.
+ root.finishedWork = _finishedWork;
+ }
+ }
+ }
+ }
+
+ isRendering = false;
+ }
+
+ // When working on async work, the reconciler asks the renderer if it should
+ // yield execution. For DOM, we implement this with requestIdleCallback.
+ function shouldYield() {
+ if (deadline === null) {
+ return false;
+ }
+ if (deadline.timeRemaining() > timeHeuristicForUnitOfWork) {
+ // Disregard deadline.didTimeout. Only expired work should be flushed
+ // during a timeout. This path is only hit for non-expired work.
+ return false;
+ }
+ deadlineDidExpire = true;
+ return true;
+ }
+
+ // TODO: Not happy about this hook. Conceptually, renderRoot should return a
+ // tuple of (isReadyForCommit, didError, error)
+ function onUncaughtError(error) {
+ !(nextFlushedRoot !== null)
+ ? invariant(
+ false,
+ "Should be working on a root. This error is likely caused by a bug in React. Please file an issue."
+ )
+ : void 0;
+ // Unschedule this root so we don't work on it again until there's
+ // another update.
+ nextFlushedRoot.remainingExpirationTime = NoWork;
+ if (!hasUnhandledError) {
+ hasUnhandledError = true;
+ unhandledError = error;
+ }
+ }
+
+ // TODO: Batching should be implemented at the renderer level, not inside
+ // the reconciler.
+ function batchedUpdates(fn, a) {
+ var previousIsBatchingUpdates = isBatchingUpdates;
+ isBatchingUpdates = true;
+ try {
+ return fn(a);
+ } finally {
+ isBatchingUpdates = previousIsBatchingUpdates;
+ if (!isBatchingUpdates && !isRendering) {
+ performWork(Sync, null);
+ }
+ }
+ }
+
+ // TODO: Batching should be implemented at the renderer level, not inside
+ // the reconciler.
+ function unbatchedUpdates(fn) {
+ if (isBatchingUpdates && !isUnbatchingUpdates) {
+ isUnbatchingUpdates = true;
+ try {
+ return fn();
+ } finally {
+ isUnbatchingUpdates = false;
+ }
+ }
+ return fn();
+ }
+
+ // TODO: Batching should be implemented at the renderer level, not within
+ // the reconciler.
+ function flushSync(fn) {
+ var previousIsBatchingUpdates = isBatchingUpdates;
+ isBatchingUpdates = true;
+ try {
+ return syncUpdates(fn);
+ } finally {
+ isBatchingUpdates = previousIsBatchingUpdates;
+ !!isRendering
+ ? invariant(
+ false,
+ "flushSync was called from inside a lifecycle method. It cannot be called when React is already rendering."
+ )
+ : void 0;
+ performWork(Sync, null);
+ }
+ }
+
+ return {
+ computeAsyncExpiration: computeAsyncExpiration,
+ computeExpirationForFiber: computeExpirationForFiber,
+ scheduleWork: scheduleWork,
+ batchedUpdates: batchedUpdates,
+ unbatchedUpdates: unbatchedUpdates,
+ flushSync: flushSync,
+ deferredUpdates: deferredUpdates
+ };
+ };
+
+ {
+ var didWarnAboutNestedUpdates = false;
+ }
+
+ // 0 is PROD, 1 is DEV.
+ // Might add PROFILE later.
+
+ function getContextForSubtree(parentComponent) {
+ if (!parentComponent) {
+ return emptyObject;
+ }
+
+ var fiber = get(parentComponent);
+ var parentContext = findCurrentUnmaskedContext(fiber);
+ return isContextProvider(fiber)
+ ? processChildContext(fiber, parentContext)
+ : parentContext;
+ }
+
+ var ReactFiberReconciler$1 = function(config) {
+ var getPublicInstance = config.getPublicInstance;
+
+ var _ReactFiberScheduler = ReactFiberScheduler(config),
+ computeAsyncExpiration =
+ _ReactFiberScheduler.computeAsyncExpiration,
+ computeExpirationForFiber =
+ _ReactFiberScheduler.computeExpirationForFiber,
+ scheduleWork = _ReactFiberScheduler.scheduleWork,
+ batchedUpdates = _ReactFiberScheduler.batchedUpdates,
+ unbatchedUpdates = _ReactFiberScheduler.unbatchedUpdates,
+ flushSync = _ReactFiberScheduler.flushSync,
+ deferredUpdates = _ReactFiberScheduler.deferredUpdates;
+
+ function scheduleTopLevelUpdate(current, element, callback) {
+ {
+ if (
+ ReactDebugCurrentFiber.phase === "render" &&
+ ReactDebugCurrentFiber.current !== null &&
+ !didWarnAboutNestedUpdates
+ ) {
+ didWarnAboutNestedUpdates = true;
+ warning(
+ false,
+ "Render methods should be a pure function of props and state; " +
+ "triggering nested component updates from render is not allowed. " +
+ "If necessary, trigger nested updates in componentDidUpdate.\n\n" +
+ "Check the render method of %s.",
+ getComponentName(ReactDebugCurrentFiber.current) ||
+ "Unknown"
+ );
+ }
+ }
+
+ callback = callback === undefined ? null : callback;
+ {
+ warning(
+ callback === null || typeof callback === "function",
+ "render(...): Expected the last optional `callback` argument to be a " +
+ "function. Instead received: %s.",
+ callback
+ );
+ }
+
+ var expirationTime = void 0;
+ // Check if the top-level element is an async wrapper component. If so,
+ // treat updates to the root as async. This is a bit weird but lets us
+ // avoid a separate `renderAsync` API.
+ if (
+ enableAsyncSubtreeAPI &&
+ element != null &&
+ element.type != null &&
+ element.type.prototype != null &&
+ element.type.prototype.unstable_isAsyncReactComponent === true
+ ) {
+ expirationTime = computeAsyncExpiration();
+ } else {
+ expirationTime = computeExpirationForFiber(current);
+ }
+
+ var update = {
+ expirationTime: expirationTime,
+ partialState: { element: element },
+ callback: callback,
+ isReplace: false,
+ isForced: false,
+ nextCallback: null,
+ next: null
+ };
+ insertUpdateIntoFiber(current, update);
+ scheduleWork(current, expirationTime);
+ }
+
+ function findHostInstance(fiber) {
+ var hostFiber = findCurrentHostFiber(fiber);
+ if (hostFiber === null) {
+ return null;
+ }
+ return hostFiber.stateNode;
+ }
+
+ return {
+ createContainer: function(containerInfo, hydrate) {
+ return createFiberRoot(containerInfo, hydrate);
+ },
+ updateContainer: function(
+ element,
+ container,
+ parentComponent,
+ callback
+ ) {
+ // TODO: If this is a nested container, this won't be the root.
+ var current = container.current;
+
+ {
+ if (ReactFiberInstrumentation_1.debugTool) {
+ if (current.alternate === null) {
+ ReactFiberInstrumentation_1.debugTool.onMountContainer(
+ container
+ );
+ } else if (element === null) {
+ ReactFiberInstrumentation_1.debugTool.onUnmountContainer(
+ container
+ );
+ } else {
+ ReactFiberInstrumentation_1.debugTool.onUpdateContainer(
+ container
+ );
+ }
+ }
+ }
+
+ var context = getContextForSubtree(parentComponent);
+ if (container.context === null) {
+ container.context = context;
+ } else {
+ container.pendingContext = context;
+ }
+
+ scheduleTopLevelUpdate(current, element, callback);
+ },
+
+ batchedUpdates: batchedUpdates,
+
+ unbatchedUpdates: unbatchedUpdates,
+
+ deferredUpdates: deferredUpdates,
+
+ flushSync: flushSync,
+
+ getPublicRootInstance: function(container) {
+ var containerFiber = container.current;
+ if (!containerFiber.child) {
+ return null;
+ }
+ switch (containerFiber.child.tag) {
+ case HostComponent:
+ return getPublicInstance(containerFiber.child.stateNode);
+ default:
+ return containerFiber.child.stateNode;
+ }
+ },
+
+ findHostInstance: findHostInstance,
+
+ findHostInstanceWithNoPortals: function(fiber) {
+ var hostFiber = findCurrentHostFiberWithNoPortals(fiber);
+ if (hostFiber === null) {
+ return null;
+ }
+ return hostFiber.stateNode;
+ },
+ injectIntoDevTools: function(devToolsConfig) {
+ var findFiberByHostInstance =
+ devToolsConfig.findFiberByHostInstance;
+
+ return injectInternals(
+ _assign({}, devToolsConfig, {
+ findHostInstanceByFiber: function(fiber) {
+ return findHostInstance(fiber);
+ },
+ findFiberByHostInstance: function(instance) {
+ if (!findFiberByHostInstance) {
+ // Might not be implemented by the renderer.
+ return null;
+ }
+ return findFiberByHostInstance(instance);
+ }
+ })
+ );
+ }
+ };
+ };
+
+ var ReactFiberReconciler$2 = Object.freeze({
+ default: ReactFiberReconciler$1
+ });
+
+ var ReactFiberReconciler$3 =
+ (ReactFiberReconciler$2 && ReactFiberReconciler$1) ||
+ ReactFiberReconciler$2;
+
+ // TODO: bundle Flow types with the package.
+
+ // TODO: decide on the top-level export form.
+ // This is hacky but makes it work with both Rollup and Jest.
+ var reactReconciler = ReactFiberReconciler$3["default"]
+ ? ReactFiberReconciler$3["default"]
+ : ReactFiberReconciler$3;
+
+ function createPortal$1(
+ children,
+ containerInfo,
+ // TODO: figure out the API for cross-renderer implementation.
+ implementation
+ ) {
+ var key =
+ arguments.length > 3 && arguments[3] !== undefined
+ ? arguments[3]
+ : null;
+
+ return {
+ // This tag allow us to uniquely identify this as a React Portal
+ $$typeof: REACT_PORTAL_TYPE,
+ key: key == null ? null : "" + key,
+ children: children,
+ containerInfo: containerInfo,
+ implementation: implementation
+ };
+ }
+
+ // TODO: this is special because it gets imported during build.
+
+ var ReactVersion = "16.2.0";
+
+ // a requestAnimationFrame, storing the time for the start of the frame, then
+ // scheduling a postMessage which gets scheduled after paint. Within the
+ // postMessage handler do as much work as possible until time + frame rate.
+ // By separating the idle call into a separate event tick we ensure that
+ // layout, paint and other browser work is counted against the available time.
+ // The frame rate is dynamically adjusted.
+
+ {
+ if (
+ ExecutionEnvironment.canUseDOM &&
+ typeof requestAnimationFrame !== "function"
+ ) {
+ warning(
+ false,
+ "React depends on requestAnimationFrame. Make sure that you load a " +
+ "polyfill in older browsers. http://fb.me/react-polyfills"
+ );
+ }
+ }
+
+ var hasNativePerformanceNow =
+ typeof performance === "object" &&
+ typeof performance.now === "function";
+
+ var now = void 0;
+ if (hasNativePerformanceNow) {
+ now = function() {
+ return performance.now();
+ };
+ } else {
+ now = function() {
+ return Date.now();
+ };
+ }
+
+ // TODO: There's no way to cancel, because Fiber doesn't atm.
+ var rIC = void 0;
+ var cIC = void 0;
+
+ if (!ExecutionEnvironment.canUseDOM) {
+ rIC = function(frameCallback) {
+ return setTimeout(function() {
+ frameCallback({
+ timeRemaining: function() {
+ return Infinity;
+ }
+ });
+ });
+ };
+ cIC = function(timeoutID) {
+ clearTimeout(timeoutID);
+ };
+ } else if (
+ typeof requestIdleCallback !== "function" ||
+ typeof cancelIdleCallback !== "function"
+ ) {
+ // Polyfill requestIdleCallback and cancelIdleCallback
+
+ var scheduledRICCallback = null;
+ var isIdleScheduled = false;
+ var timeoutTime = -1;
+
+ var isAnimationFrameScheduled = false;
+
+ var frameDeadline = 0;
+ // We start out assuming that we run at 30fps but then the heuristic tracking
+ // will adjust this value to a faster fps if we get more frequent animation
+ // frames.
+ var previousFrameTime = 33;
+ var activeFrameTime = 33;
+
+ var frameDeadlineObject;
+ if (hasNativePerformanceNow) {
+ frameDeadlineObject = {
+ didTimeout: false,
+ timeRemaining: function() {
+ // We assume that if we have a performance timer that the rAF callback
+ // gets a performance timer value. Not sure if this is always true.
+ var remaining = frameDeadline - performance.now();
+ return remaining > 0 ? remaining : 0;
+ }
+ };
+ } else {
+ frameDeadlineObject = {
+ didTimeout: false,
+ timeRemaining: function() {
+ // Fallback to Date.now()
+ var remaining = frameDeadline - Date.now();
+ return remaining > 0 ? remaining : 0;
+ }
+ };
+ }
+
+ // We use the postMessage trick to defer idle work until after the repaint.
+ var messageKey =
+ "__reactIdleCallback$" +
+ Math.random()
+ .toString(36)
+ .slice(2);
+ var idleTick = function(event) {
+ if (event.source !== window || event.data !== messageKey) {
+ return;
+ }
+
+ isIdleScheduled = false;
+
+ var currentTime = now();
+ if (frameDeadline - currentTime <= 0) {
+ // There's no time left in this idle period. Check if the callback has
+ // a timeout and whether it's been exceeded.
+ if (timeoutTime !== -1 && timeoutTime <= currentTime) {
+ // Exceeded the timeout. Invoke the callback even though there's no
+ // time left.
+ frameDeadlineObject.didTimeout = true;
+ } else {
+ // No timeout.
+ if (!isAnimationFrameScheduled) {
+ // Schedule another animation callback so we retry later.
+ isAnimationFrameScheduled = true;
+ requestAnimationFrame(animationTick);
+ }
+ // Exit without invoking the callback.
+ return;
+ }
+ } else {
+ // There's still time left in this idle period.
+ frameDeadlineObject.didTimeout = false;
+ }
+
+ timeoutTime = -1;
+ var callback = scheduledRICCallback;
+ scheduledRICCallback = null;
+ if (callback !== null) {
+ callback(frameDeadlineObject);
+ }
+ };
+ // Assumes that we have addEventListener in this environment. Might need
+ // something better for old IE.
+ window.addEventListener("message", idleTick, false);
+
+ var animationTick = function(rafTime) {
+ isAnimationFrameScheduled = false;
+ var nextFrameTime = rafTime - frameDeadline + activeFrameTime;
+ if (
+ nextFrameTime < activeFrameTime &&
+ previousFrameTime < activeFrameTime
+ ) {
+ if (nextFrameTime < 8) {
+ // Defensive coding. We don't support higher frame rates than 120hz.
+ // If we get lower than that, it is probably a bug.
+ nextFrameTime = 8;
+ }
+ // If one frame goes long, then the next one can be short to catch up.
+ // If two frames are short in a row, then that's an indication that we
+ // actually have a higher frame rate than what we're currently optimizing.
+ // We adjust our heuristic dynamically accordingly. For example, if we're
+ // running on 120hz display or 90hz VR display.
+ // Take the max of the two in case one of them was an anomaly due to
+ // missed frame deadlines.
+ activeFrameTime =
+ nextFrameTime < previousFrameTime
+ ? previousFrameTime
+ : nextFrameTime;
+ } else {
+ previousFrameTime = nextFrameTime;
+ }
+ frameDeadline = rafTime + activeFrameTime;
+ if (!isIdleScheduled) {
+ isIdleScheduled = true;
+ window.postMessage(messageKey, "*");
+ }
+ };
+
+ rIC = function(callback, options) {
+ // This assumes that we only schedule one callback at a time because that's
+ // how Fiber uses it.
+ scheduledRICCallback = callback;
+ if (options != null && typeof options.timeout === "number") {
+ timeoutTime = now() + options.timeout;
+ }
+ if (!isAnimationFrameScheduled) {
+ // If rAF didn't already schedule one, we need to schedule a frame.
+ // TODO: If this rAF doesn't materialize because the browser throttles, we
+ // might want to still have setTimeout trigger rIC as a backup to ensure
+ // that we keep performing work.
+ isAnimationFrameScheduled = true;
+ requestAnimationFrame(animationTick);
+ }
+ return 0;
+ };
+
+ cIC = function() {
+ scheduledRICCallback = null;
+ isIdleScheduled = false;
+ timeoutTime = -1;
+ };
+ } else {
+ rIC = window.requestIdleCallback;
+ cIC = window.cancelIdleCallback;
+ }
+
+ /**
+ * Forked from fbjs/warning:
+ * https://github.com/facebook/fbjs/blob/e66ba20ad5be433eb54423f2b097d829324d9de6/packages/fbjs/src/__forks__/warning.js
+ *
+ * Only change is we use console.warn instead of console.error,
+ * and do nothing when 'console' is not supported.
+ * This really simplifies the code.
+ * ---
+ * Similar to invariant but only logs a warning if the condition is not met.
+ * This can be used to log issues in development environments in critical
+ * paths. Removing the logging code for production environments will keep the
+ * same logic and follow the same code paths.
+ */
+
+ var lowPriorityWarning = function() {};
+
+ {
+ var printWarning = function(format) {
+ for (
+ var _len = arguments.length,
+ args = Array(_len > 1 ? _len - 1 : 0),
+ _key = 1;
+ _key < _len;
+ _key++
+ ) {
+ args[_key - 1] = arguments[_key];
+ }
+
+ var argIndex = 0;
+ var message =
+ "Warning: " +
+ format.replace(/%s/g, function() {
+ return args[argIndex++];
+ });
+ if (typeof console !== "undefined") {
+ console.warn(message);
+ }
+ try {
+ // --- Welcome to debugging React ---
+ // This error was thrown as a convenience so that you can use this stack
+ // to find the callsite that caused this warning to fire.
+ throw new Error(message);
+ } catch (x) {}
+ };
+
+ lowPriorityWarning = function(condition, format) {
+ if (format === undefined) {
+ throw new Error(
+ "`warning(condition, format, ...args)` requires a warning " +
+ "message argument"
+ );
+ }
+ if (!condition) {
+ for (
+ var _len2 = arguments.length,
+ args = Array(_len2 > 2 ? _len2 - 2 : 0),
+ _key2 = 2;
+ _key2 < _len2;
+ _key2++
+ ) {
+ args[_key2 - 2] = arguments[_key2];
+ }
+
+ printWarning.apply(undefined, [format].concat(args));
+ }
+ };
+ }
+
+ var lowPriorityWarning$1 = lowPriorityWarning;
+
+ // isAttributeNameSafe() is currently duplicated in DOMMarkupOperations.
+ // TODO: Find a better place for this.
+ var VALID_ATTRIBUTE_NAME_REGEX = new RegExp(
+ "^[" +
+ ATTRIBUTE_NAME_START_CHAR +
+ "][" +
+ ATTRIBUTE_NAME_CHAR +
+ "]*$"
+ );
+ var illegalAttributeNameCache = {};
+ var validatedAttributeNameCache = {};
+ function isAttributeNameSafe(attributeName) {
+ if (validatedAttributeNameCache.hasOwnProperty(attributeName)) {
+ return true;
+ }
+ if (illegalAttributeNameCache.hasOwnProperty(attributeName)) {
+ return false;
+ }
+ if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) {
+ validatedAttributeNameCache[attributeName] = true;
+ return true;
+ }
+ illegalAttributeNameCache[attributeName] = true;
+ {
+ warning(false, "Invalid attribute name: `%s`", attributeName);
+ }
+ return false;
+ }
+
+ // shouldIgnoreValue() is currently duplicated in DOMMarkupOperations.
+ // TODO: Find a better place for this.
+ function shouldIgnoreValue(propertyInfo, value) {
+ return (
+ value == null ||
+ (propertyInfo.hasBooleanValue && !value) ||
+ (propertyInfo.hasNumericValue && isNaN(value)) ||
+ (propertyInfo.hasPositiveNumericValue && value < 1) ||
+ (propertyInfo.hasOverloadedBooleanValue && value === false)
+ );
+ }
+
+ /**
+ * Operations for dealing with DOM properties.
+ */
+
+ /**
+ * Get the value for a property on a node. Only used in DEV for SSR validation.
+ * The "expected" argument is used as a hint of what the expected value is.
+ * Some properties have multiple equivalent values.
+ */
+ function getValueForProperty(node, name, expected) {
+ {
+ var propertyInfo = getPropertyInfo(name);
+ if (propertyInfo) {
+ var mutationMethod = propertyInfo.mutationMethod;
+ if (mutationMethod || propertyInfo.mustUseProperty) {
+ return node[propertyInfo.propertyName];
+ } else {
+ var attributeName = propertyInfo.attributeName;
+
+ var stringValue = null;
+
+ if (propertyInfo.hasOverloadedBooleanValue) {
+ if (node.hasAttribute(attributeName)) {
+ var value = node.getAttribute(attributeName);
+ if (value === "") {
+ return true;
+ }
+ if (shouldIgnoreValue(propertyInfo, expected)) {
+ return value;
+ }
+ if (value === "" + expected) {
+ return expected;
+ }
+ return value;
+ }
+ } else if (node.hasAttribute(attributeName)) {
+ if (shouldIgnoreValue(propertyInfo, expected)) {
+ // We had an attribute but shouldn't have had one, so read it
+ // for the error message.
+ return node.getAttribute(attributeName);
+ }
+ if (propertyInfo.hasBooleanValue) {
+ // If this was a boolean, it doesn't matter what the value is
+ // the fact that we have it is the same as the expected.
+ return expected;
+ }
+ // Even if this property uses a namespace we use getAttribute
+ // because we assume its namespaced name is the same as our config.
+ // To use getAttributeNS we need the local name which we don't have
+ // in our config atm.
+ stringValue = node.getAttribute(attributeName);
+ }
+
+ if (shouldIgnoreValue(propertyInfo, expected)) {
+ return stringValue === null ? expected : stringValue;
+ } else if (stringValue === "" + expected) {
+ return expected;
+ } else {
+ return stringValue;
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Get the value for a attribute on a node. Only used in DEV for SSR validation.
+ * The third argument is used as a hint of what the expected value is. Some
+ * attributes have multiple equivalent values.
+ */
+ function getValueForAttribute(node, name, expected) {
+ {
+ if (!isAttributeNameSafe(name)) {
+ return;
+ }
+ if (!node.hasAttribute(name)) {
+ return expected === undefined ? undefined : null;
+ }
+ var value = node.getAttribute(name);
+ if (value === "" + expected) {
+ return expected;
+ }
+ return value;
+ }
+ }
+
+ /**
+ * Sets the value for a property on a node.
+ *
+ * @param {DOMElement} node
+ * @param {string} name
+ * @param {*} value
+ */
+ function setValueForProperty(node, name, value) {
+ var propertyInfo = getPropertyInfo(name);
+
+ if (propertyInfo && shouldSetAttribute(name, value)) {
+ var mutationMethod = propertyInfo.mutationMethod;
+ if (mutationMethod) {
+ mutationMethod(node, value);
+ } else if (shouldIgnoreValue(propertyInfo, value)) {
+ deleteValueForProperty(node, name);
+ return;
+ } else if (propertyInfo.mustUseProperty) {
+ // Contrary to `setAttribute`, object properties are properly
+ // `toString`ed by IE8/9.
+ node[propertyInfo.propertyName] = value;
+ } else {
+ var attributeName = propertyInfo.attributeName;
+ var namespace = propertyInfo.attributeNamespace;
+ // `setAttribute` with objects becomes only `[object]` in IE8/9,
+ // ('' + value) makes it output the correct toString()-value.
+ if (namespace) {
+ node.setAttributeNS(namespace, attributeName, "" + value);
+ } else if (
+ propertyInfo.hasBooleanValue ||
+ (propertyInfo.hasOverloadedBooleanValue && value === true)
+ ) {
+ node.setAttribute(attributeName, "");
+ } else {
+ node.setAttribute(attributeName, "" + value);
+ }
+ }
+ } else {
+ setValueForAttribute(
+ node,
+ name,
+ shouldSetAttribute(name, value) ? value : null
+ );
+ return;
+ }
+
+ {
+ }
+ }
+
+ function setValueForAttribute(node, name, value) {
+ if (!isAttributeNameSafe(name)) {
+ return;
+ }
+ if (value == null) {
+ node.removeAttribute(name);
+ } else {
+ node.setAttribute(name, "" + value);
+ }
+
+ {
+ }
+ }
+
+ /**
+ * Deletes an attributes from a node.
+ *
+ * @param {DOMElement} node
+ * @param {string} name
+ */
+ function deleteValueForAttribute(node, name) {
+ node.removeAttribute(name);
+ }
+
+ /**
+ * Deletes the value for a property on a node.
+ *
+ * @param {DOMElement} node
+ * @param {string} name
+ */
+ function deleteValueForProperty(node, name) {
+ var propertyInfo = getPropertyInfo(name);
+ if (propertyInfo) {
+ var mutationMethod = propertyInfo.mutationMethod;
+ if (mutationMethod) {
+ mutationMethod(node, undefined);
+ } else if (propertyInfo.mustUseProperty) {
+ var propName = propertyInfo.propertyName;
+ if (propertyInfo.hasBooleanValue) {
+ node[propName] = false;
+ } else {
+ node[propName] = "";
+ }
+ } else {
+ node.removeAttribute(propertyInfo.attributeName);
+ }
+ } else {
+ node.removeAttribute(name);
+ }
+ }
+
+ var ReactControlledValuePropTypes = {
+ checkPropTypes: null
+ };
+
+ {
+ var hasReadOnlyValue = {
+ button: true,
+ checkbox: true,
+ image: true,
+ hidden: true,
+ radio: true,
+ reset: true,
+ submit: true
+ };
+
+ var propTypes = {
+ value: function(props, propName, componentName) {
+ if (
+ !props[propName] ||
+ hasReadOnlyValue[props.type] ||
+ props.onChange ||
+ props.readOnly ||
+ props.disabled
+ ) {
+ return null;
+ }
+ return new Error(
+ "You provided a `value` prop to a form field without an " +
+ "`onChange` handler. This will render a read-only field. If " +
+ "the field should be mutable use `defaultValue`. Otherwise, " +
+ "set either `onChange` or `readOnly`."
+ );
+ },
+ checked: function(props, propName, componentName) {
+ if (
+ !props[propName] ||
+ props.onChange ||
+ props.readOnly ||
+ props.disabled
+ ) {
+ return null;
+ }
+ return new Error(
+ "You provided a `checked` prop to a form field without an " +
+ "`onChange` handler. This will render a read-only field. If " +
+ "the field should be mutable use `defaultChecked`. Otherwise, " +
+ "set either `onChange` or `readOnly`."
+ );
+ }
+ };
+
+ /**
+ * Provide a linked `value` attribute for controlled forms. You should not use
+ * this outside of the ReactDOM controlled form components.
+ */
+ ReactControlledValuePropTypes.checkPropTypes = function(
+ tagName,
+ props,
+ getStack
+ ) {
+ checkPropTypes(propTypes, props, "prop", tagName, getStack);
+ };
+ }
+
+ // TODO: direct imports like some-package/src/* are bad. Fix me.
+ var getCurrentFiberOwnerName$2 =
+ ReactDebugCurrentFiber.getCurrentFiberOwnerName;
+ var getCurrentFiberStackAddendum$3 =
+ ReactDebugCurrentFiber.getCurrentFiberStackAddendum;
+
+ var didWarnValueDefaultValue = false;
+ var didWarnCheckedDefaultChecked = false;
+ var didWarnControlledToUncontrolled = false;
+ var didWarnUncontrolledToControlled = false;
+
+ function isControlled(props) {
+ var usesChecked =
+ props.type === "checkbox" || props.type === "radio";
+ return usesChecked ? props.checked != null : props.value != null;
+ }
+
+ /**
+ * Implements an <input> host component that allows setting these optional
+ * props: `checked`, `value`, `defaultChecked`, and `defaultValue`.
+ *
+ * If `checked` or `value` are not supplied (or null/undefined), user actions
+ * that affect the checked state or value will trigger updates to the element.
+ *
+ * If they are supplied (and not null/undefined), the rendered element will not
+ * trigger updates to the element. Instead, the props must change in order for
+ * the rendered element to be updated.
+ *
+ * The rendered element will be initialized as unchecked (or `defaultChecked`)
+ * with an empty value (or `defaultValue`).
+ *
+ * See http://www.w3.org/TR/2012/WD-html5-20121025/the-input-element.html
+ */
+
+ function getHostProps(element, props) {
+ var node = element;
+ var value = props.value;
+ var checked = props.checked;
+
+ var hostProps = _assign(
+ {
+ // Make sure we set .type before any other properties (setting .value
+ // before .type means .value is lost in IE11 and below)
+ type: undefined,
+ // Make sure we set .step before .value (setting .value before .step
+ // means .value is rounded on mount, based upon step precision)
+ step: undefined,
+ // Make sure we set .min & .max before .value (to ensure proper order
+ // in corner cases such as min or max deriving from value, e.g. Issue #7170)
+ min: undefined,
+ max: undefined
+ },
+ props,
+ {
+ defaultChecked: undefined,
+ defaultValue: undefined,
+ value:
+ value != null ? value : node._wrapperState.initialValue,
+ checked:
+ checked != null
+ ? checked
+ : node._wrapperState.initialChecked
+ }
+ );
+
+ return hostProps;
+ }
+
+ function initWrapperState(element, props) {
+ {
+ ReactControlledValuePropTypes.checkPropTypes(
+ "input",
+ props,
+ getCurrentFiberStackAddendum$3
+ );
+
+ if (
+ props.checked !== undefined &&
+ props.defaultChecked !== undefined &&
+ !didWarnCheckedDefaultChecked
+ ) {
+ warning(
+ false,
+ "%s contains an input of type %s with both checked and defaultChecked props. " +
+ "Input elements must be either controlled or uncontrolled " +
+ "(specify either the checked prop, or the defaultChecked prop, but not " +
+ "both). Decide between using a controlled or uncontrolled input " +
+ "element and remove one of these props. More info: " +
+ "https://fb.me/react-controlled-components",
+ getCurrentFiberOwnerName$2() || "A component",
+ props.type
+ );
+ didWarnCheckedDefaultChecked = true;
+ }
+ if (
+ props.value !== undefined &&
+ props.defaultValue !== undefined &&
+ !didWarnValueDefaultValue
+ ) {
+ warning(
+ false,
+ "%s contains an input of type %s with both value and defaultValue props. " +
+ "Input elements must be either controlled or uncontrolled " +
+ "(specify either the value prop, or the defaultValue prop, but not " +
+ "both). Decide between using a controlled or uncontrolled input " +
+ "element and remove one of these props. More info: " +
+ "https://fb.me/react-controlled-components",
+ getCurrentFiberOwnerName$2() || "A component",
+ props.type
+ );
+ didWarnValueDefaultValue = true;
+ }
+ }
+
+ var defaultValue = props.defaultValue;
+ var node = element;
+ node._wrapperState = {
+ initialChecked:
+ props.checked != null ? props.checked : props.defaultChecked,
+ initialValue: props.value != null ? props.value : defaultValue,
+ controlled: isControlled(props)
+ };
+ }
+
+ function updateChecked(element, props) {
+ var node = element;
+ var checked = props.checked;
+ if (checked != null) {
+ setValueForProperty(node, "checked", checked);
+ }
+ }
+
+ function updateWrapper(element, props) {
+ var node = element;
+ {
+ var controlled = isControlled(props);
+
+ if (
+ !node._wrapperState.controlled &&
+ controlled &&
+ !didWarnUncontrolledToControlled
+ ) {
+ warning(
+ false,
+ "A component is changing an uncontrolled input of type %s to be controlled. " +
+ "Input elements should not switch from uncontrolled to controlled (or vice versa). " +
+ "Decide between using a controlled or uncontrolled input " +
+ "element for the lifetime of the component. More info: https://fb.me/react-controlled-components%s",
+ props.type,
+ getCurrentFiberStackAddendum$3()
+ );
+ didWarnUncontrolledToControlled = true;
+ }
+ if (
+ node._wrapperState.controlled &&
+ !controlled &&
+ !didWarnControlledToUncontrolled
+ ) {
+ warning(
+ false,
+ "A component is changing a controlled input of type %s to be uncontrolled. " +
+ "Input elements should not switch from controlled to uncontrolled (or vice versa). " +
+ "Decide between using a controlled or uncontrolled input " +
+ "element for the lifetime of the component. More info: https://fb.me/react-controlled-components%s",
+ props.type,
+ getCurrentFiberStackAddendum$3()
+ );
+ didWarnControlledToUncontrolled = true;
+ }
+ }
+
+ updateChecked(element, props);
+
+ var value = props.value;
+ if (value != null) {
+ if (value === 0 && node.value === "") {
+ node.value = "0";
+ // Note: IE9 reports a number inputs as 'text', so check props instead.
+ } else if (props.type === "number") {
+ // Simulate `input.valueAsNumber`. IE9 does not support it
+ var valueAsNumber = parseFloat(node.value) || 0;
+
+ if (
+ // eslint-disable-next-line
+ value != valueAsNumber ||
+ // eslint-disable-next-line
+ (value == valueAsNumber && node.value != value)
+ ) {
+ // Cast `value` to a string to ensure the value is set correctly. While
+ // browsers typically do this as necessary, jsdom doesn't.
+ node.value = "" + value;
+ }
+ } else if (node.value !== "" + value) {
+ // Cast `value` to a string to ensure the value is set correctly. While
+ // browsers typically do this as necessary, jsdom doesn't.
+ node.value = "" + value;
+ }
+ } else {
+ if (props.value == null && props.defaultValue != null) {
+ // In Chrome, assigning defaultValue to certain input types triggers input validation.
+ // For number inputs, the display value loses trailing decimal points. For email inputs,
+ // Chrome raises "The specified value <x> is not a valid email address".
+ //
+ // Here we check to see if the defaultValue has actually changed, avoiding these problems
+ // when the user is inputting text
+ //
+ // https://github.com/facebook/react/issues/7253
+ if (node.defaultValue !== "" + props.defaultValue) {
+ node.defaultValue = "" + props.defaultValue;
+ }
+ }
+ if (props.checked == null && props.defaultChecked != null) {
+ node.defaultChecked = !!props.defaultChecked;
+ }
+ }
+ }
+
+ function postMountWrapper(element, props) {
+ var node = element;
+
+ // Detach value from defaultValue. We won't do anything if we're working on
+ // submit or reset inputs as those values & defaultValues are linked. They
+ // are not resetable nodes so this operation doesn't matter and actually
+ // removes browser-default values (eg "Submit Query") when no value is
+ // provided.
+
+ switch (props.type) {
+ case "submit":
+ case "reset":
+ break;
+ case "color":
+ case "date":
+ case "datetime":
+ case "datetime-local":
+ case "month":
+ case "time":
+ case "week":
+ // This fixes the no-show issue on iOS Safari and Android Chrome:
+ // https://github.com/facebook/react/issues/7233
+ node.value = "";
+ node.value = node.defaultValue;
+ break;
+ default:
+ node.value = node.value;
+ break;
+ }
+
+ // Normally, we'd just do `node.checked = node.checked` upon initial mount, less this bug
+ // this is needed to work around a chrome bug where setting defaultChecked
+ // will sometimes influence the value of checked (even after detachment).
+ // Reference: https://bugs.chromium.org/p/chromium/issues/detail?id=608416
+ // We need to temporarily unset name to avoid disrupting radio button groups.
+ var name = node.name;
+ if (name !== "") {
+ node.name = "";
+ }
+ node.defaultChecked = !node.defaultChecked;
+ node.defaultChecked = !node.defaultChecked;
+ if (name !== "") {
+ node.name = name;
+ }
+ }
+
+ function restoreControlledState$1(element, props) {
+ var node = element;
+ updateWrapper(node, props);
+ updateNamedCousins(node, props);
+ }
+
+ function updateNamedCousins(rootNode, props) {
+ var name = props.name;
+ if (props.type === "radio" && name != null) {
+ var queryRoot = rootNode;
+
+ while (queryRoot.parentNode) {
+ queryRoot = queryRoot.parentNode;
+ }
+
+ // If `rootNode.form` was non-null, then we could try `form.elements`,
+ // but that sometimes behaves strangely in IE8. We could also try using
+ // `form.getElementsByName`, but that will only return direct children
+ // and won't include inputs that use the HTML5 `form=` attribute. Since
+ // the input might not even be in a form. It might not even be in the
+ // document. Let's just use the local `querySelectorAll` to ensure we don't
+ // miss anything.
+ var group = queryRoot.querySelectorAll(
+ "input[name=" + JSON.stringify("" + name) + '][type="radio"]'
+ );
+
+ for (var i = 0; i < group.length; i++) {
+ var otherNode = group[i];
+ if (
+ otherNode === rootNode ||
+ otherNode.form !== rootNode.form
+ ) {
+ continue;
+ }
+ // This will throw if radio buttons rendered by different copies of React
+ // and the same name are rendered into the same form (same as #1939).
+ // That's probably okay; we don't support it just as we don't support
+ // mixing React radio buttons with non-React ones.
+ var otherProps = getFiberCurrentPropsFromNode$1(otherNode);
+ !otherProps
+ ? invariant(
+ false,
+ "ReactDOMInput: Mixing React and non-React radio inputs with the same `name` is not supported."
+ )
+ : void 0;
+
+ // We need update the tracked value on the named cousin since the value
+ // was changed but the input saw no event or value set
+ updateValueIfChanged(otherNode);
+
+ // If this is a controlled radio button group, forcing the input that
+ // was previously checked to update will cause it to be come re-checked
+ // as appropriate.
+ updateWrapper(otherNode, otherProps);
+ }
+ }
+ }
+
+ function flattenChildren(children) {
+ var content = "";
+
+ // Flatten children and warn if they aren't strings or numbers;
+ // invalid types are ignored.
+ // We can silently skip them because invalid DOM nesting warning
+ // catches these cases in Fiber.
+ React.Children.forEach(children, function(child) {
+ if (child == null) {
+ return;
+ }
+ if (typeof child === "string" || typeof child === "number") {
+ content += child;
+ }
+ });
+
+ return content;
+ }
+
+ /**
+ * Implements an <option> host component that warns when `selected` is set.
+ */
+
+ function validateProps(element, props) {
+ // TODO (yungsters): Remove support for `selected` in <option>.
+ {
+ warning(
+ props.selected == null,
+ "Use the `defaultValue` or `value` props on <select> instead of " +
+ "setting `selected` on <option>."
+ );
+ }
+ }
+
+ function postMountWrapper$1(element, props) {
+ // value="" should make a value attribute (#6219)
+ if (props.value != null) {
+ element.setAttribute("value", props.value);
+ }
+ }
+
+ function getHostProps$1(element, props) {
+ var hostProps = _assign({ children: undefined }, props);
+ var content = flattenChildren(props.children);
+
+ if (content) {
+ hostProps.children = content;
+ }
+
+ return hostProps;
+ }
+
+ // TODO: direct imports like some-package/src/* are bad. Fix me.
+ var getCurrentFiberOwnerName$3 =
+ ReactDebugCurrentFiber.getCurrentFiberOwnerName;
+ var getCurrentFiberStackAddendum$4 =
+ ReactDebugCurrentFiber.getCurrentFiberStackAddendum;
+
+ {
+ var didWarnValueDefaultValue$1 = false;
+ }
+
+ function getDeclarationErrorAddendum() {
+ var ownerName = getCurrentFiberOwnerName$3();
+ if (ownerName) {
+ return "\n\nCheck the render method of `" + ownerName + "`.";
+ }
+ return "";
+ }
+
+ var valuePropNames = ["value", "defaultValue"];
+
+ /**
+ * Validation function for `value` and `defaultValue`.
+ */
+ function checkSelectPropTypes(props) {
+ ReactControlledValuePropTypes.checkPropTypes(
+ "select",
+ props,
+ getCurrentFiberStackAddendum$4
+ );
+
+ for (var i = 0; i < valuePropNames.length; i++) {
+ var propName = valuePropNames[i];
+ if (props[propName] == null) {
+ continue;
+ }
+ var isArray = Array.isArray(props[propName]);
+ if (props.multiple && !isArray) {
+ warning(
+ false,
+ "The `%s` prop supplied to <select> must be an array if " +
+ "`multiple` is true.%s",
+ propName,
+ getDeclarationErrorAddendum()
+ );
+ } else if (!props.multiple && isArray) {
+ warning(
+ false,
+ "The `%s` prop supplied to <select> must be a scalar " +
+ "value if `multiple` is false.%s",
+ propName,
+ getDeclarationErrorAddendum()
+ );
+ }
+ }
+ }
+
+ function updateOptions(
+ node,
+ multiple,
+ propValue,
+ setDefaultSelected
+ ) {
+ var options = node.options;
+
+ if (multiple) {
+ var selectedValues = propValue;
+ var selectedValue = {};
+ for (var i = 0; i < selectedValues.length; i++) {
+ // Prefix to avoid chaos with special keys.
+ selectedValue["$" + selectedValues[i]] = true;
+ }
+ for (var _i = 0; _i < options.length; _i++) {
+ var selected = selectedValue.hasOwnProperty(
+ "$" + options[_i].value
+ );
+ if (options[_i].selected !== selected) {
+ options[_i].selected = selected;
+ }
+ if (selected && setDefaultSelected) {
+ options[_i].defaultSelected = true;
+ }
+ }
+ } else {
+ // Do not set `select.value` as exact behavior isn't consistent across all
+ // browsers for all cases.
+ var _selectedValue = "" + propValue;
+ var defaultSelected = null;
+ for (var _i2 = 0; _i2 < options.length; _i2++) {
+ if (options[_i2].value === _selectedValue) {
+ options[_i2].selected = true;
+ if (setDefaultSelected) {
+ options[_i2].defaultSelected = true;
+ }
+ return;
+ }
+ if (defaultSelected === null && !options[_i2].disabled) {
+ defaultSelected = options[_i2];
+ }
+ }
+ if (defaultSelected !== null) {
+ defaultSelected.selected = true;
+ }
+ }
+ }
+
+ /**
+ * Implements a <select> host component that allows optionally setting the
+ * props `value` and `defaultValue`. If `multiple` is false, the prop must be a
+ * stringable. If `multiple` is true, the prop must be an array of stringables.
+ *
+ * If `value` is not supplied (or null/undefined), user actions that change the
+ * selected option will trigger updates to the rendered options.
+ *
+ * If it is supplied (and not null/undefined), the rendered options will not
+ * update in response to user actions. Instead, the `value` prop must change in
+ * order for the rendered options to update.
+ *
+ * If `defaultValue` is provided, any options with the supplied values will be
+ * selected.
+ */
+
+ function getHostProps$2(element, props) {
+ return _assign({}, props, {
+ value: undefined
+ });
+ }
+
+ function initWrapperState$1(element, props) {
+ var node = element;
+ {
+ checkSelectPropTypes(props);
+ }
+
+ var value = props.value;
+ node._wrapperState = {
+ initialValue: value != null ? value : props.defaultValue,
+ wasMultiple: !!props.multiple
+ };
+
+ {
+ if (
+ props.value !== undefined &&
+ props.defaultValue !== undefined &&
+ !didWarnValueDefaultValue$1
+ ) {
+ warning(
+ false,
+ "Select elements must be either controlled or uncontrolled " +
+ "(specify either the value prop, or the defaultValue prop, but not " +
+ "both). Decide between using a controlled or uncontrolled select " +
+ "element and remove one of these props. More info: " +
+ "https://fb.me/react-controlled-components"
+ );
+ didWarnValueDefaultValue$1 = true;
+ }
+ }
+ }
+
+ function postMountWrapper$2(element, props) {
+ var node = element;
+ node.multiple = !!props.multiple;
+ var value = props.value;
+ if (value != null) {
+ updateOptions(node, !!props.multiple, value, false);
+ } else if (props.defaultValue != null) {
+ updateOptions(node, !!props.multiple, props.defaultValue, true);
+ }
+ }
+
+ function postUpdateWrapper(element, props) {
+ var node = element;
+ // After the initial mount, we control selected-ness manually so don't pass
+ // this value down
+ node._wrapperState.initialValue = undefined;
+
+ var wasMultiple = node._wrapperState.wasMultiple;
+ node._wrapperState.wasMultiple = !!props.multiple;
+
+ var value = props.value;
+ if (value != null) {
+ updateOptions(node, !!props.multiple, value, false);
+ } else if (wasMultiple !== !!props.multiple) {
+ // For simplicity, reapply `defaultValue` if `multiple` is toggled.
+ if (props.defaultValue != null) {
+ updateOptions(
+ node,
+ !!props.multiple,
+ props.defaultValue,
+ true
+ );
+ } else {
+ // Revert the select back to its default unselected state.
+ updateOptions(
+ node,
+ !!props.multiple,
+ props.multiple ? [] : "",
+ false
+ );
+ }
+ }
+ }
+
+ function restoreControlledState$2(element, props) {
+ var node = element;
+ var value = props.value;
+
+ if (value != null) {
+ updateOptions(node, !!props.multiple, value, false);
+ }
+ }
+
+ // TODO: direct imports like some-package/src/* are bad. Fix me.
+ var getCurrentFiberStackAddendum$5 =
+ ReactDebugCurrentFiber.getCurrentFiberStackAddendum;
+
+ var didWarnValDefaultVal = false;
+
+ /**
+ * Implements a <textarea> host component that allows setting `value`, and
+ * `defaultValue`. This differs from the traditional DOM API because value is
+ * usually set as PCDATA children.
+ *
+ * If `value` is not supplied (or null/undefined), user actions that affect the
+ * value will trigger updates to the element.
+ *
+ * If `value` is supplied (and not null/undefined), the rendered element will
+ * not trigger updates to the element. Instead, the `value` prop must change in
+ * order for the rendered element to be updated.
+ *
+ * The rendered element will be initialized with an empty value, the prop
+ * `defaultValue` if specified, or the children content (deprecated).
+ */
+
+ function getHostProps$3(element, props) {
+ var node = element;
+ !(props.dangerouslySetInnerHTML == null)
+ ? invariant(
+ false,
+ "`dangerouslySetInnerHTML` does not make sense on <textarea>."
+ )
+ : void 0;
+
+ // Always set children to the same thing. In IE9, the selection range will
+ // get reset if `textContent` is mutated. We could add a check in setTextContent
+ // to only set the value if/when the value differs from the node value (which would
+ // completely solve this IE9 bug), but Sebastian+Sophie seemed to like this
+ // solution. The value can be a boolean or object so that's why it's forced
+ // to be a string.
+ var hostProps = _assign({}, props, {
+ value: undefined,
+ defaultValue: undefined,
+ children: "" + node._wrapperState.initialValue
+ });
+
+ return hostProps;
+ }
+
+ function initWrapperState$2(element, props) {
+ var node = element;
+ {
+ ReactControlledValuePropTypes.checkPropTypes(
+ "textarea",
+ props,
+ getCurrentFiberStackAddendum$5
+ );
+ if (
+ props.value !== undefined &&
+ props.defaultValue !== undefined &&
+ !didWarnValDefaultVal
+ ) {
+ warning(
+ false,
+ "Textarea elements must be either controlled or uncontrolled " +
+ "(specify either the value prop, or the defaultValue prop, but not " +
+ "both). Decide between using a controlled or uncontrolled textarea " +
+ "and remove one of these props. More info: " +
+ "https://fb.me/react-controlled-components"
+ );
+ didWarnValDefaultVal = true;
+ }
+ }
+
+ var initialValue = props.value;
+
+ // Only bother fetching default value if we're going to use it
+ if (initialValue == null) {
+ var defaultValue = props.defaultValue;
+ // TODO (yungsters): Remove support for children content in <textarea>.
+ var children = props.children;
+ if (children != null) {
+ {
+ warning(
+ false,
+ "Use the `defaultValue` or `value` props instead of setting " +
+ "children on <textarea>."
+ );
+ }
+ !(defaultValue == null)
+ ? invariant(
+ false,
+ "If you supply `defaultValue` on a <textarea>, do not pass children."
+ )
+ : void 0;
+ if (Array.isArray(children)) {
+ !(children.length <= 1)
+ ? invariant(
+ false,
+ "<textarea> can only have at most one child."
+ )
+ : void 0;
+ children = children[0];
+ }
+
+ defaultValue = "" + children;
+ }
+ if (defaultValue == null) {
+ defaultValue = "";
+ }
+ initialValue = defaultValue;
+ }
+
+ node._wrapperState = {
+ initialValue: "" + initialValue
+ };
+ }
+
+ function updateWrapper$1(element, props) {
+ var node = element;
+ var value = props.value;
+ if (value != null) {
+ // Cast `value` to a string to ensure the value is set correctly. While
+ // browsers typically do this as necessary, jsdom doesn't.
+ var newValue = "" + value;
+
+ // To avoid side effects (such as losing text selection), only set value if changed
+ if (newValue !== node.value) {
+ node.value = newValue;
+ }
+ if (props.defaultValue == null) {
+ node.defaultValue = newValue;
+ }
+ }
+ if (props.defaultValue != null) {
+ node.defaultValue = props.defaultValue;
+ }
+ }
+
+ function postMountWrapper$3(element, props) {
+ var node = element;
+ // This is in postMount because we need access to the DOM node, which is not
+ // available until after the component has mounted.
+ var textContent = node.textContent;
+
+ // Only set node.value if textContent is equal to the expected
+ // initial value. In IE10/IE11 there is a bug where the placeholder attribute
+ // will populate textContent as well.
+ // https://developer.microsoft.com/microsoft-edge/platform/issues/101525/
+ if (textContent === node._wrapperState.initialValue) {
+ node.value = textContent;
+ }
+ }
+
+ function restoreControlledState$3(element, props) {
+ // DOM component is still mounted; update
+ updateWrapper$1(element, props);
+ }
+
+ var HTML_NAMESPACE$1 = "http://www.w3.org/1999/xhtml";
+ var MATH_NAMESPACE = "http://www.w3.org/1998/Math/MathML";
+ var SVG_NAMESPACE = "http://www.w3.org/2000/svg";
+
+ var Namespaces = {
+ html: HTML_NAMESPACE$1,
+ mathml: MATH_NAMESPACE,
+ svg: SVG_NAMESPACE
+ };
+
+ // Assumes there is no parent namespace.
+ function getIntrinsicNamespace(type) {
+ switch (type) {
+ case "svg":
+ return SVG_NAMESPACE;
+ case "math":
+ return MATH_NAMESPACE;
+ default:
+ return HTML_NAMESPACE$1;
+ }
+ }
+
+ function getChildNamespace(parentNamespace, type) {
+ if (
+ parentNamespace == null ||
+ parentNamespace === HTML_NAMESPACE$1
+ ) {
+ // No (or default) parent namespace: potential entry point.
+ return getIntrinsicNamespace(type);
+ }
+ if (
+ parentNamespace === SVG_NAMESPACE &&
+ type === "foreignObject"
+ ) {
+ // We're leaving SVG.
+ return HTML_NAMESPACE$1;
+ }
+ // By default, pass namespace below.
+ return parentNamespace;
+ }
+
+ /* globals MSApp */
+
+ /**
+ * Create a function which has 'unsafe' privileges (required by windows8 apps)
+ */
+ var createMicrosoftUnsafeLocalFunction = function(func) {
+ if (
+ typeof MSApp !== "undefined" &&
+ MSApp.execUnsafeLocalFunction
+ ) {
+ return function(arg0, arg1, arg2, arg3) {
+ MSApp.execUnsafeLocalFunction(function() {
+ return func(arg0, arg1, arg2, arg3);
+ });
+ };
+ } else {
+ return func;
+ }
+ };
+
+ // SVG temp container for IE lacking innerHTML
+ var reusableSVGContainer = void 0;
+
+ /**
+ * Set the innerHTML property of a node
+ *
+ * @param {DOMElement} node
+ * @param {string} html
+ * @internal
+ */
+ var setInnerHTML = createMicrosoftUnsafeLocalFunction(function(
+ node,
+ html
+ ) {
+ // IE does not have innerHTML for SVG nodes, so instead we inject the
+ // new markup in a temp node and then move the child nodes across into
+ // the target node
+
+ if (
+ node.namespaceURI === Namespaces.svg &&
+ !("innerHTML" in node)
+ ) {
+ reusableSVGContainer =
+ reusableSVGContainer || document.createElement("div");
+ reusableSVGContainer.innerHTML = "<svg>" + html + "</svg>";
+ var svgNode = reusableSVGContainer.firstChild;
+ while (node.firstChild) {
+ node.removeChild(node.firstChild);
+ }
+ while (svgNode.firstChild) {
+ node.appendChild(svgNode.firstChild);
+ }
+ } else {
+ node.innerHTML = html;
+ }
+ });
+
+ /**
+ * Set the textContent property of a node, ensuring that whitespace is preserved
+ * even in IE8. innerText is a poor substitute for textContent and, among many
+ * issues, inserts <br> instead of the literal newline chars. innerHTML behaves
+ * as it should.
+ *
+ * @param {DOMElement} node
+ * @param {string} text
+ * @internal
+ */
+ var setTextContent = function(node, text) {
+ if (text) {
+ var firstChild = node.firstChild;
+
+ if (
+ firstChild &&
+ firstChild === node.lastChild &&
+ firstChild.nodeType === TEXT_NODE
+ ) {
+ firstChild.nodeValue = text;
+ return;
+ }
+ }
+ node.textContent = text;
+ };
+
+ /**
+ * CSS properties which accept numbers but are not in units of "px".
+ */
+ var isUnitlessNumber = {
+ animationIterationCount: true,
+ borderImageOutset: true,
+ borderImageSlice: true,
+ borderImageWidth: true,
+ boxFlex: true,
+ boxFlexGroup: true,
+ boxOrdinalGroup: true,
+ columnCount: true,
+ columns: true,
+ flex: true,
+ flexGrow: true,
+ flexPositive: true,
+ flexShrink: true,
+ flexNegative: true,
+ flexOrder: true,
+ gridRow: true,
+ gridRowEnd: true,
+ gridRowSpan: true,
+ gridRowStart: true,
+ gridColumn: true,
+ gridColumnEnd: true,
+ gridColumnSpan: true,
+ gridColumnStart: true,
+ fontWeight: true,
+ lineClamp: true,
+ lineHeight: true,
+ opacity: true,
+ order: true,
+ orphans: true,
+ tabSize: true,
+ widows: true,
+ zIndex: true,
+ zoom: true,
+
+ // SVG-related properties
+ fillOpacity: true,
+ floodOpacity: true,
+ stopOpacity: true,
+ strokeDasharray: true,
+ strokeDashoffset: true,
+ strokeMiterlimit: true,
+ strokeOpacity: true,
+ strokeWidth: true
+ };
+
+ /**
+ * @param {string} prefix vendor-specific prefix, eg: Webkit
+ * @param {string} key style name, eg: transitionDuration
+ * @return {string} style name prefixed with `prefix`, properly camelCased, eg:
+ * WebkitTransitionDuration
+ */
+ function prefixKey(prefix, key) {
+ return prefix + key.charAt(0).toUpperCase() + key.substring(1);
+ }
+
+ /**
+ * Support style names that may come passed in prefixed by adding permutations
+ * of vendor prefixes.
+ */
+ var prefixes = ["Webkit", "ms", "Moz", "O"];
+
+ // Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an
+ // infinite loop, because it iterates over the newly added props too.
+ Object.keys(isUnitlessNumber).forEach(function(prop) {
+ prefixes.forEach(function(prefix) {
+ isUnitlessNumber[prefixKey(prefix, prop)] =
+ isUnitlessNumber[prop];
+ });
+ });
+
+ /**
+ * Convert a value into the proper css writable value. The style name `name`
+ * should be logical (no hyphens), as specified
+ * in `CSSProperty.isUnitlessNumber`.
+ *
+ * @param {string} name CSS property name such as `topMargin`.
+ * @param {*} value CSS property value such as `10px`.
+ * @return {string} Normalized style value with dimensions applied.
+ */
+ function dangerousStyleValue(name, value, isCustomProperty) {
+ // Note that we've removed escapeTextForBrowser() calls here since the
+ // whole string will be escaped when the attribute is injected into
+ // the markup. If you provide unsafe user data here they can inject
+ // arbitrary CSS which may be problematic (I couldn't repro this):
+ // https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet
+ // http://www.thespanner.co.uk/2007/11/26/ultimate-xss-css-injection/
+ // This is not an XSS hole but instead a potential CSS injection issue
+ // which has lead to a greater discussion about how we're going to
+ // trust URLs moving forward. See #2115901
+
+ var isEmpty =
+ value == null || typeof value === "boolean" || value === "";
+ if (isEmpty) {
+ return "";
+ }
+
+ if (
+ !isCustomProperty &&
+ typeof value === "number" &&
+ value !== 0 &&
+ !(
+ isUnitlessNumber.hasOwnProperty(name) &&
+ isUnitlessNumber[name]
+ )
+ ) {
+ return value + "px"; // Presumes implicit 'px' suffix for unitless numbers
+ }
+
+ return ("" + value).trim();
+ }
+
+ var warnValidStyle = emptyFunction;
+
+ {
+ // 'msTransform' is correct, but the other prefixes should be capitalized
+ var badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/;
+
+ // style values shouldn't contain a semicolon
+ var badStyleValueWithSemicolonPattern = /;\s*$/;
+
+ var warnedStyleNames = {};
+ var warnedStyleValues = {};
+ var warnedForNaNValue = false;
+ var warnedForInfinityValue = false;
+
+ var warnHyphenatedStyleName = function(name, getStack) {
+ if (
+ warnedStyleNames.hasOwnProperty(name) &&
+ warnedStyleNames[name]
+ ) {
+ return;
+ }
+
+ warnedStyleNames[name] = true;
+ warning(
+ false,
+ "Unsupported style property %s. Did you mean %s?%s",
+ name,
+ camelizeStyleName(name),
+ getStack()
+ );
+ };
+
+ var warnBadVendoredStyleName = function(name, getStack) {
+ if (
+ warnedStyleNames.hasOwnProperty(name) &&
+ warnedStyleNames[name]
+ ) {
+ return;
+ }
+
+ warnedStyleNames[name] = true;
+ warning(
+ false,
+ "Unsupported vendor-prefixed style property %s. Did you mean %s?%s",
+ name,
+ name.charAt(0).toUpperCase() + name.slice(1),
+ getStack()
+ );
+ };
+
+ var warnStyleValueWithSemicolon = function(
+ name,
+ value,
+ getStack
+ ) {
+ if (
+ warnedStyleValues.hasOwnProperty(value) &&
+ warnedStyleValues[value]
+ ) {
+ return;
+ }
+
+ warnedStyleValues[value] = true;
+ warning(
+ false,
+ "Style property values shouldn't contain a semicolon. " +
+ 'Try "%s: %s" instead.%s',
+ name,
+ value.replace(badStyleValueWithSemicolonPattern, ""),
+ getStack()
+ );
+ };
+
+ var warnStyleValueIsNaN = function(name, value, getStack) {
+ if (warnedForNaNValue) {
+ return;
+ }
+
+ warnedForNaNValue = true;
+ warning(
+ false,
+ "`NaN` is an invalid value for the `%s` css style property.%s",
+ name,
+ getStack()
+ );
+ };
+
+ var warnStyleValueIsInfinity = function(name, value, getStack) {
+ if (warnedForInfinityValue) {
+ return;
+ }
+
+ warnedForInfinityValue = true;
+ warning(
+ false,
+ "`Infinity` is an invalid value for the `%s` css style property.%s",
+ name,
+ getStack()
+ );
+ };
+
+ warnValidStyle = function(name, value, getStack) {
+ if (name.indexOf("-") > -1) {
+ warnHyphenatedStyleName(name, getStack);
+ } else if (badVendoredStyleNamePattern.test(name)) {
+ warnBadVendoredStyleName(name, getStack);
+ } else if (badStyleValueWithSemicolonPattern.test(value)) {
+ warnStyleValueWithSemicolon(name, value, getStack);
+ }
+
+ if (typeof value === "number") {
+ if (isNaN(value)) {
+ warnStyleValueIsNaN(name, value, getStack);
+ } else if (!isFinite(value)) {
+ warnStyleValueIsInfinity(name, value, getStack);
+ }
+ }
+ };
+ }
+
+ var warnValidStyle$1 = warnValidStyle;
+
+ /**
+ * Operations for dealing with CSS properties.
+ */
+
+ /**
+ * This creates a string that is expected to be equivalent to the style
+ * attribute generated by server-side rendering. It by-passes warnings and
+ * security checks so it's not safe to use this value for anything other than
+ * comparison. It is only used in DEV for SSR validation.
+ */
+ function createDangerousStringForStyles(styles) {
+ {
+ var serialized = "";
+ var delimiter = "";
+ for (var styleName in styles) {
+ if (!styles.hasOwnProperty(styleName)) {
+ continue;
+ }
+ var styleValue = styles[styleName];
+ if (styleValue != null) {
+ var isCustomProperty = styleName.indexOf("--") === 0;
+ serialized +=
+ delimiter + hyphenateStyleName(styleName) + ":";
+ serialized += dangerousStyleValue(
+ styleName,
+ styleValue,
+ isCustomProperty
+ );
+
+ delimiter = ";";
+ }
+ }
+ return serialized || null;
+ }
+ }
+
+ /**
+ * Sets the value for multiple styles on a node. If a value is specified as
+ * '' (empty string), the corresponding style property will be unset.
+ *
+ * @param {DOMElement} node
+ * @param {object} styles
+ */
+ function setValueForStyles(node, styles, getStack) {
+ var style = node.style;
+ for (var styleName in styles) {
+ if (!styles.hasOwnProperty(styleName)) {
+ continue;
+ }
+ var isCustomProperty = styleName.indexOf("--") === 0;
+ {
+ if (!isCustomProperty) {
+ warnValidStyle$1(styleName, styles[styleName], getStack);
+ }
+ }
+ var styleValue = dangerousStyleValue(
+ styleName,
+ styles[styleName],
+ isCustomProperty
+ );
+ if (styleName === "float") {
+ styleName = "cssFloat";
+ }
+ if (isCustomProperty) {
+ style.setProperty(styleName, styleValue);
+ } else {
+ style[styleName] = styleValue;
+ }
+ }
+ }
+
+ // For HTML, certain tags should omit their close tag. We keep a whitelist for
+ // those special-case tags.
+
+ var omittedCloseTags = {
+ area: true,
+ base: true,
+ br: true,
+ col: true,
+ embed: true,
+ hr: true,
+ img: true,
+ input: true,
+ keygen: true,
+ link: true,
+ meta: true,
+ param: true,
+ source: true,
+ track: true,
+ wbr: true
+ };
+
+ // For HTML, certain tags cannot have children. This has the same purpose as
+ // `omittedCloseTags` except that `menuitem` should still have its closing tag.
+
+ var voidElementTags = _assign(
+ {
+ menuitem: true
+ },
+ omittedCloseTags
+ );
+
+ var HTML$1 = "__html";
+
+ function assertValidProps(tag, props, getStack) {
+ if (!props) {
+ return;
+ }
+ // Note the use of `==` which checks for null or undefined.
+ if (voidElementTags[tag]) {
+ !(
+ props.children == null &&
+ props.dangerouslySetInnerHTML == null
+ )
+ ? invariant(
+ false,
+ "%s is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`.%s",
+ tag,
+ getStack()
+ )
+ : void 0;
+ }
+ if (props.dangerouslySetInnerHTML != null) {
+ !(props.children == null)
+ ? invariant(
+ false,
+ "Can only set one of `children` or `props.dangerouslySetInnerHTML`."
+ )
+ : void 0;
+ !(
+ typeof props.dangerouslySetInnerHTML === "object" &&
+ HTML$1 in props.dangerouslySetInnerHTML
+ )
+ ? invariant(
+ false,
+ "`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. Please visit https://fb.me/react-invariant-dangerously-set-inner-html for more information."
+ )
+ : void 0;
+ }
+ {
+ warning(
+ props.suppressContentEditableWarning ||
+ !props.contentEditable ||
+ props.children == null,
+ "A component is `contentEditable` and contains `children` managed by " +
+ "React. It is now your responsibility to guarantee that none of " +
+ "those nodes are unexpectedly modified or duplicated. This is " +
+ "probably not intentional.%s",
+ getStack()
+ );
+ }
+ !(props.style == null || typeof props.style === "object")
+ ? invariant(
+ false,
+ "The `style` prop expects a mapping from style properties to values, not a string. For example, style={{marginRight: spacing + 'em'}} when using JSX.%s",
+ getStack()
+ )
+ : void 0;
+ }
+
+ function isCustomComponent(tagName, props) {
+ if (tagName.indexOf("-") === -1) {
+ return typeof props.is === "string";
+ }
+ switch (tagName) {
+ // These are reserved SVG and MathML elements.
+ // We don't mind this whitelist too much because we expect it to never grow.
+ // The alternative is to track the namespace in a few places which is convoluted.
+ // https://w3c.github.io/webcomponents/spec/custom/#custom-elements-core-concepts
+ case "annotation-xml":
+ case "color-profile":
+ case "font-face":
+ case "font-face-src":
+ case "font-face-uri":
+ case "font-face-format":
+ case "font-face-name":
+ case "missing-glyph":
+ return false;
+ default:
+ return true;
+ }
+ }
+
+ var ariaProperties = {
+ "aria-current": 0, // state
+ "aria-details": 0,
+ "aria-disabled": 0, // state
+ "aria-hidden": 0, // state
+ "aria-invalid": 0, // state
+ "aria-keyshortcuts": 0,
+ "aria-label": 0,
+ "aria-roledescription": 0,
+ // Widget Attributes
+ "aria-autocomplete": 0,
+ "aria-checked": 0,
+ "aria-expanded": 0,
+ "aria-haspopup": 0,
+ "aria-level": 0,
+ "aria-modal": 0,
+ "aria-multiline": 0,
+ "aria-multiselectable": 0,
+ "aria-orientation": 0,
+ "aria-placeholder": 0,
+ "aria-pressed": 0,
+ "aria-readonly": 0,
+ "aria-required": 0,
+ "aria-selected": 0,
+ "aria-sort": 0,
+ "aria-valuemax": 0,
+ "aria-valuemin": 0,
+ "aria-valuenow": 0,
+ "aria-valuetext": 0,
+ // Live Region Attributes
+ "aria-atomic": 0,
+ "aria-busy": 0,
+ "aria-live": 0,
+ "aria-relevant": 0,
+ // Drag-and-Drop Attributes
+ "aria-dropeffect": 0,
+ "aria-grabbed": 0,
+ // Relationship Attributes
+ "aria-activedescendant": 0,
+ "aria-colcount": 0,
+ "aria-colindex": 0,
+ "aria-colspan": 0,
+ "aria-controls": 0,
+ "aria-describedby": 0,
+ "aria-errormessage": 0,
+ "aria-flowto": 0,
+ "aria-labelledby": 0,
+ "aria-owns": 0,
+ "aria-posinset": 0,
+ "aria-rowcount": 0,
+ "aria-rowindex": 0,
+ "aria-rowspan": 0,
+ "aria-setsize": 0
+ };
+
+ var warnedProperties = {};
+ var rARIA = new RegExp("^(aria)-[" + ATTRIBUTE_NAME_CHAR + "]*$");
+ var rARIACamel = new RegExp(
+ "^(aria)[A-Z][" + ATTRIBUTE_NAME_CHAR + "]*$"
+ );
+
+ var hasOwnProperty = Object.prototype.hasOwnProperty;
+
+ function getStackAddendum() {
+ var stack = ReactDebugCurrentFrame.getStackAddendum();
+ return stack != null ? stack : "";
+ }
+
+ function validateProperty(tagName, name) {
+ if (
+ hasOwnProperty.call(warnedProperties, name) &&
+ warnedProperties[name]
+ ) {
+ return true;
+ }
+
+ if (rARIACamel.test(name)) {
+ var ariaName = "aria-" + name.slice(4).toLowerCase();
+ var correctName = ariaProperties.hasOwnProperty(ariaName)
+ ? ariaName
+ : null;
+
+ // If this is an aria-* attribute, but is not listed in the known DOM
+ // DOM properties, then it is an invalid aria-* attribute.
+ if (correctName == null) {
+ warning(
+ false,
+ "Invalid ARIA attribute `%s`. ARIA attributes follow the pattern aria-* and must be lowercase.%s",
+ name,
+ getStackAddendum()
+ );
+ warnedProperties[name] = true;
+ return true;
+ }
+ // aria-* attributes should be lowercase; suggest the lowercase version.
+ if (name !== correctName) {
+ warning(
+ false,
+ "Invalid ARIA attribute `%s`. Did you mean `%s`?%s",
+ name,
+ correctName,
+ getStackAddendum()
+ );
+ warnedProperties[name] = true;
+ return true;
+ }
+ }
+
+ if (rARIA.test(name)) {
+ var lowerCasedName = name.toLowerCase();
+ var standardName = ariaProperties.hasOwnProperty(lowerCasedName)
+ ? lowerCasedName
+ : null;
+
+ // If this is an aria-* attribute, but is not listed in the known DOM
+ // DOM properties, then it is an invalid aria-* attribute.
+ if (standardName == null) {
+ warnedProperties[name] = true;
+ return false;
+ }
+ // aria-* attributes should be lowercase; suggest the lowercase version.
+ if (name !== standardName) {
+ warning(
+ false,
+ "Unknown ARIA attribute `%s`. Did you mean `%s`?%s",
+ name,
+ standardName,
+ getStackAddendum()
+ );
+ warnedProperties[name] = true;
+ return true;
+ }
+ }
+
+ return true;
+ }
+
+ function warnInvalidARIAProps(type, props) {
+ var invalidProps = [];
+
+ for (var key in props) {
+ var isValid = validateProperty(type, key);
+ if (!isValid) {
+ invalidProps.push(key);
+ }
+ }
+
+ var unknownPropString = invalidProps
+ .map(function(prop) {
+ return "`" + prop + "`";
+ })
+ .join(", ");
+
+ if (invalidProps.length === 1) {
+ warning(
+ false,
+ "Invalid aria prop %s on <%s> tag. " +
+ "For details, see https://fb.me/invalid-aria-prop%s",
+ unknownPropString,
+ type,
+ getStackAddendum()
+ );
+ } else if (invalidProps.length > 1) {
+ warning(
+ false,
+ "Invalid aria props %s on <%s> tag. " +
+ "For details, see https://fb.me/invalid-aria-prop%s",
+ unknownPropString,
+ type,
+ getStackAddendum()
+ );
+ }
+ }
+
+ function validateProperties(type, props) {
+ if (isCustomComponent(type, props)) {
+ return;
+ }
+ warnInvalidARIAProps(type, props);
+ }
+
+ var didWarnValueNull = false;
+
+ function getStackAddendum$1() {
+ var stack = ReactDebugCurrentFrame.getStackAddendum();
+ return stack != null ? stack : "";
+ }
+
+ function validateProperties$1(type, props) {
+ if (
+ type !== "input" &&
+ type !== "textarea" &&
+ type !== "select"
+ ) {
+ return;
+ }
+
+ if (props != null && props.value === null && !didWarnValueNull) {
+ didWarnValueNull = true;
+ if (type === "select" && props.multiple) {
+ warning(
+ false,
+ "`value` prop on `%s` should not be null. " +
+ "Consider using an empty array when `multiple` is set to `true` " +
+ "to clear the component or `undefined` for uncontrolled components.%s",
+ type,
+ getStackAddendum$1()
+ );
+ } else {
+ warning(
+ false,
+ "`value` prop on `%s` should not be null. " +
+ "Consider using an empty string to clear the component or `undefined` " +
+ "for uncontrolled components.%s",
+ type,
+ getStackAddendum$1()
+ );
+ }
+ }
+ }
+
+ // When adding attributes to the HTML or SVG whitelist, be sure to
+ // also add them to this module to ensure casing and incorrect name
+ // warnings.
+ var possibleStandardNames = {
+ // HTML
+ accept: "accept",
+ acceptcharset: "acceptCharset",
+ "accept-charset": "acceptCharset",
+ accesskey: "accessKey",
+ action: "action",
+ allowfullscreen: "allowFullScreen",
+ alt: "alt",
+ as: "as",
+ async: "async",
+ autocapitalize: "autoCapitalize",
+ autocomplete: "autoComplete",
+ autocorrect: "autoCorrect",
+ autofocus: "autoFocus",
+ autoplay: "autoPlay",
+ autosave: "autoSave",
+ capture: "capture",
+ cellpadding: "cellPadding",
+ cellspacing: "cellSpacing",
+ challenge: "challenge",
+ charset: "charSet",
+ checked: "checked",
+ children: "children",
+ cite: "cite",
+ class: "className",
+ classid: "classID",
+ classname: "className",
+ cols: "cols",
+ colspan: "colSpan",
+ content: "content",
+ contenteditable: "contentEditable",
+ contextmenu: "contextMenu",
+ controls: "controls",
+ controlslist: "controlsList",
+ coords: "coords",
+ crossorigin: "crossOrigin",
+ dangerouslysetinnerhtml: "dangerouslySetInnerHTML",
+ data: "data",
+ datetime: "dateTime",
+ default: "default",
+ defaultchecked: "defaultChecked",
+ defaultvalue: "defaultValue",
+ defer: "defer",
+ dir: "dir",
+ disabled: "disabled",
+ download: "download",
+ draggable: "draggable",
+ enctype: "encType",
+ for: "htmlFor",
+ form: "form",
+ formmethod: "formMethod",
+ formaction: "formAction",
+ formenctype: "formEncType",
+ formnovalidate: "formNoValidate",
+ formtarget: "formTarget",
+ frameborder: "frameBorder",
+ headers: "headers",
+ height: "height",
+ hidden: "hidden",
+ high: "high",
+ href: "href",
+ hreflang: "hrefLang",
+ htmlfor: "htmlFor",
+ httpequiv: "httpEquiv",
+ "http-equiv": "httpEquiv",
+ icon: "icon",
+ id: "id",
+ innerhtml: "innerHTML",
+ inputmode: "inputMode",
+ integrity: "integrity",
+ is: "is",
+ itemid: "itemID",
+ itemprop: "itemProp",
+ itemref: "itemRef",
+ itemscope: "itemScope",
+ itemtype: "itemType",
+ keyparams: "keyParams",
+ keytype: "keyType",
+ kind: "kind",
+ label: "label",
+ lang: "lang",
+ list: "list",
+ loop: "loop",
+ low: "low",
+ manifest: "manifest",
+ marginwidth: "marginWidth",
+ marginheight: "marginHeight",
+ max: "max",
+ maxlength: "maxLength",
+ media: "media",
+ mediagroup: "mediaGroup",
+ method: "method",
+ min: "min",
+ minlength: "minLength",
+ multiple: "multiple",
+ muted: "muted",
+ name: "name",
+ nonce: "nonce",
+ novalidate: "noValidate",
+ open: "open",
+ optimum: "optimum",
+ pattern: "pattern",
+ placeholder: "placeholder",
+ playsinline: "playsInline",
+ poster: "poster",
+ preload: "preload",
+ profile: "profile",
+ radiogroup: "radioGroup",
+ readonly: "readOnly",
+ referrerpolicy: "referrerPolicy",
+ rel: "rel",
+ required: "required",
+ reversed: "reversed",
+ role: "role",
+ rows: "rows",
+ rowspan: "rowSpan",
+ sandbox: "sandbox",
+ scope: "scope",
+ scoped: "scoped",
+ scrolling: "scrolling",
+ seamless: "seamless",
+ selected: "selected",
+ shape: "shape",
+ size: "size",
+ sizes: "sizes",
+ span: "span",
+ spellcheck: "spellCheck",
+ src: "src",
+ srcdoc: "srcDoc",
+ srclang: "srcLang",
+ srcset: "srcSet",
+ start: "start",
+ step: "step",
+ style: "style",
+ summary: "summary",
+ tabindex: "tabIndex",
+ target: "target",
+ title: "title",
+ type: "type",
+ usemap: "useMap",
+ value: "value",
+ width: "width",
+ wmode: "wmode",
+ wrap: "wrap",
+
+ // SVG
+ about: "about",
+ accentheight: "accentHeight",
+ "accent-height": "accentHeight",
+ accumulate: "accumulate",
+ additive: "additive",
+ alignmentbaseline: "alignmentBaseline",
+ "alignment-baseline": "alignmentBaseline",
+ allowreorder: "allowReorder",
+ alphabetic: "alphabetic",
+ amplitude: "amplitude",
+ arabicform: "arabicForm",
+ "arabic-form": "arabicForm",
+ ascent: "ascent",
+ attributename: "attributeName",
+ attributetype: "attributeType",
+ autoreverse: "autoReverse",
+ azimuth: "azimuth",
+ basefrequency: "baseFrequency",
+ baselineshift: "baselineShift",
+ "baseline-shift": "baselineShift",
+ baseprofile: "baseProfile",
+ bbox: "bbox",
+ begin: "begin",
+ bias: "bias",
+ by: "by",
+ calcmode: "calcMode",
+ capheight: "capHeight",
+ "cap-height": "capHeight",
+ clip: "clip",
+ clippath: "clipPath",
+ "clip-path": "clipPath",
+ clippathunits: "clipPathUnits",
+ cliprule: "clipRule",
+ "clip-rule": "clipRule",
+ color: "color",
+ colorinterpolation: "colorInterpolation",
+ "color-interpolation": "colorInterpolation",
+ colorinterpolationfilters: "colorInterpolationFilters",
+ "color-interpolation-filters": "colorInterpolationFilters",
+ colorprofile: "colorProfile",
+ "color-profile": "colorProfile",
+ colorrendering: "colorRendering",
+ "color-rendering": "colorRendering",
+ contentscripttype: "contentScriptType",
+ contentstyletype: "contentStyleType",
+ cursor: "cursor",
+ cx: "cx",
+ cy: "cy",
+ d: "d",
+ datatype: "datatype",
+ decelerate: "decelerate",
+ descent: "descent",
+ diffuseconstant: "diffuseConstant",
+ direction: "direction",
+ display: "display",
+ divisor: "divisor",
+ dominantbaseline: "dominantBaseline",
+ "dominant-baseline": "dominantBaseline",
+ dur: "dur",
+ dx: "dx",
+ dy: "dy",
+ edgemode: "edgeMode",
+ elevation: "elevation",
+ enablebackground: "enableBackground",
+ "enable-background": "enableBackground",
+ end: "end",
+ exponent: "exponent",
+ externalresourcesrequired: "externalResourcesRequired",
+ fill: "fill",
+ fillopacity: "fillOpacity",
+ "fill-opacity": "fillOpacity",
+ fillrule: "fillRule",
+ "fill-rule": "fillRule",
+ filter: "filter",
+ filterres: "filterRes",
+ filterunits: "filterUnits",
+ floodopacity: "floodOpacity",
+ "flood-opacity": "floodOpacity",
+ floodcolor: "floodColor",
+ "flood-color": "floodColor",
+ focusable: "focusable",
+ fontfamily: "fontFamily",
+ "font-family": "fontFamily",
+ fontsize: "fontSize",
+ "font-size": "fontSize",
+ fontsizeadjust: "fontSizeAdjust",
+ "font-size-adjust": "fontSizeAdjust",
+ fontstretch: "fontStretch",
+ "font-stretch": "fontStretch",
+ fontstyle: "fontStyle",
+ "font-style": "fontStyle",
+ fontvariant: "fontVariant",
+ "font-variant": "fontVariant",
+ fontweight: "fontWeight",
+ "font-weight": "fontWeight",
+ format: "format",
+ from: "from",
+ fx: "fx",
+ fy: "fy",
+ g1: "g1",
+ g2: "g2",
+ glyphname: "glyphName",
+ "glyph-name": "glyphName",
+ glyphorientationhorizontal: "glyphOrientationHorizontal",
+ "glyph-orientation-horizontal": "glyphOrientationHorizontal",
+ glyphorientationvertical: "glyphOrientationVertical",
+ "glyph-orientation-vertical": "glyphOrientationVertical",
+ glyphref: "glyphRef",
+ gradienttransform: "gradientTransform",
+ gradientunits: "gradientUnits",
+ hanging: "hanging",
+ horizadvx: "horizAdvX",
+ "horiz-adv-x": "horizAdvX",
+ horizoriginx: "horizOriginX",
+ "horiz-origin-x": "horizOriginX",
+ ideographic: "ideographic",
+ imagerendering: "imageRendering",
+ "image-rendering": "imageRendering",
+ in2: "in2",
+ in: "in",
+ inlist: "inlist",
+ intercept: "intercept",
+ k1: "k1",
+ k2: "k2",
+ k3: "k3",
+ k4: "k4",
+ k: "k",
+ kernelmatrix: "kernelMatrix",
+ kernelunitlength: "kernelUnitLength",
+ kerning: "kerning",
+ keypoints: "keyPoints",
+ keysplines: "keySplines",
+ keytimes: "keyTimes",
+ lengthadjust: "lengthAdjust",
+ letterspacing: "letterSpacing",
+ "letter-spacing": "letterSpacing",
+ lightingcolor: "lightingColor",
+ "lighting-color": "lightingColor",
+ limitingconeangle: "limitingConeAngle",
+ local: "local",
+ markerend: "markerEnd",
+ "marker-end": "markerEnd",
+ markerheight: "markerHeight",
+ markermid: "markerMid",
+ "marker-mid": "markerMid",
+ markerstart: "markerStart",
+ "marker-start": "markerStart",
+ markerunits: "markerUnits",
+ markerwidth: "markerWidth",
+ mask: "mask",
+ maskcontentunits: "maskContentUnits",
+ maskunits: "maskUnits",
+ mathematical: "mathematical",
+ mode: "mode",
+ numoctaves: "numOctaves",
+ offset: "offset",
+ opacity: "opacity",
+ operator: "operator",
+ order: "order",
+ orient: "orient",
+ orientation: "orientation",
+ origin: "origin",
+ overflow: "overflow",
+ overlineposition: "overlinePosition",
+ "overline-position": "overlinePosition",
+ overlinethickness: "overlineThickness",
+ "overline-thickness": "overlineThickness",
+ paintorder: "paintOrder",
+ "paint-order": "paintOrder",
+ panose1: "panose1",
+ "panose-1": "panose1",
+ pathlength: "pathLength",
+ patterncontentunits: "patternContentUnits",
+ patterntransform: "patternTransform",
+ patternunits: "patternUnits",
+ pointerevents: "pointerEvents",
+ "pointer-events": "pointerEvents",
+ points: "points",
+ pointsatx: "pointsAtX",
+ pointsaty: "pointsAtY",
+ pointsatz: "pointsAtZ",
+ prefix: "prefix",
+ preservealpha: "preserveAlpha",
+ preserveaspectratio: "preserveAspectRatio",
+ primitiveunits: "primitiveUnits",
+ property: "property",
+ r: "r",
+ radius: "radius",
+ refx: "refX",
+ refy: "refY",
+ renderingintent: "renderingIntent",
+ "rendering-intent": "renderingIntent",
+ repeatcount: "repeatCount",
+ repeatdur: "repeatDur",
+ requiredextensions: "requiredExtensions",
+ requiredfeatures: "requiredFeatures",
+ resource: "resource",
+ restart: "restart",
+ result: "result",
+ results: "results",
+ rotate: "rotate",
+ rx: "rx",
+ ry: "ry",
+ scale: "scale",
+ security: "security",
+ seed: "seed",
+ shaperendering: "shapeRendering",
+ "shape-rendering": "shapeRendering",
+ slope: "slope",
+ spacing: "spacing",
+ specularconstant: "specularConstant",
+ specularexponent: "specularExponent",
+ speed: "speed",
+ spreadmethod: "spreadMethod",
+ startoffset: "startOffset",
+ stddeviation: "stdDeviation",
+ stemh: "stemh",
+ stemv: "stemv",
+ stitchtiles: "stitchTiles",
+ stopcolor: "stopColor",
+ "stop-color": "stopColor",
+ stopopacity: "stopOpacity",
+ "stop-opacity": "stopOpacity",
+ strikethroughposition: "strikethroughPosition",
+ "strikethrough-position": "strikethroughPosition",
+ strikethroughthickness: "strikethroughThickness",
+ "strikethrough-thickness": "strikethroughThickness",
+ string: "string",
+ stroke: "stroke",
+ strokedasharray: "strokeDasharray",
+ "stroke-dasharray": "strokeDasharray",
+ strokedashoffset: "strokeDashoffset",
+ "stroke-dashoffset": "strokeDashoffset",
+ strokelinecap: "strokeLinecap",
+ "stroke-linecap": "strokeLinecap",
+ strokelinejoin: "strokeLinejoin",
+ "stroke-linejoin": "strokeLinejoin",
+ strokemiterlimit: "strokeMiterlimit",
+ "stroke-miterlimit": "strokeMiterlimit",
+ strokewidth: "strokeWidth",
+ "stroke-width": "strokeWidth",
+ strokeopacity: "strokeOpacity",
+ "stroke-opacity": "strokeOpacity",
+ suppresscontenteditablewarning: "suppressContentEditableWarning",
+ suppresshydrationwarning: "suppressHydrationWarning",
+ surfacescale: "surfaceScale",
+ systemlanguage: "systemLanguage",
+ tablevalues: "tableValues",
+ targetx: "targetX",
+ targety: "targetY",
+ textanchor: "textAnchor",
+ "text-anchor": "textAnchor",
+ textdecoration: "textDecoration",
+ "text-decoration": "textDecoration",
+ textlength: "textLength",
+ textrendering: "textRendering",
+ "text-rendering": "textRendering",
+ to: "to",
+ transform: "transform",
+ typeof: "typeof",
+ u1: "u1",
+ u2: "u2",
+ underlineposition: "underlinePosition",
+ "underline-position": "underlinePosition",
+ underlinethickness: "underlineThickness",
+ "underline-thickness": "underlineThickness",
+ unicode: "unicode",
+ unicodebidi: "unicodeBidi",
+ "unicode-bidi": "unicodeBidi",
+ unicoderange: "unicodeRange",
+ "unicode-range": "unicodeRange",
+ unitsperem: "unitsPerEm",
+ "units-per-em": "unitsPerEm",
+ unselectable: "unselectable",
+ valphabetic: "vAlphabetic",
+ "v-alphabetic": "vAlphabetic",
+ values: "values",
+ vectoreffect: "vectorEffect",
+ "vector-effect": "vectorEffect",
+ version: "version",
+ vertadvy: "vertAdvY",
+ "vert-adv-y": "vertAdvY",
+ vertoriginx: "vertOriginX",
+ "vert-origin-x": "vertOriginX",
+ vertoriginy: "vertOriginY",
+ "vert-origin-y": "vertOriginY",
+ vhanging: "vHanging",
+ "v-hanging": "vHanging",
+ videographic: "vIdeographic",
+ "v-ideographic": "vIdeographic",
+ viewbox: "viewBox",
+ viewtarget: "viewTarget",
+ visibility: "visibility",
+ vmathematical: "vMathematical",
+ "v-mathematical": "vMathematical",
+ vocab: "vocab",
+ widths: "widths",
+ wordspacing: "wordSpacing",
+ "word-spacing": "wordSpacing",
+ writingmode: "writingMode",
+ "writing-mode": "writingMode",
+ x1: "x1",
+ x2: "x2",
+ x: "x",
+ xchannelselector: "xChannelSelector",
+ xheight: "xHeight",
+ "x-height": "xHeight",
+ xlinkactuate: "xlinkActuate",
+ "xlink:actuate": "xlinkActuate",
+ xlinkarcrole: "xlinkArcrole",
+ "xlink:arcrole": "xlinkArcrole",
+ xlinkhref: "xlinkHref",
+ "xlink:href": "xlinkHref",
+ xlinkrole: "xlinkRole",
+ "xlink:role": "xlinkRole",
+ xlinkshow: "xlinkShow",
+ "xlink:show": "xlinkShow",
+ xlinktitle: "xlinkTitle",
+ "xlink:title": "xlinkTitle",
+ xlinktype: "xlinkType",
+ "xlink:type": "xlinkType",
+ xmlbase: "xmlBase",
+ "xml:base": "xmlBase",
+ xmllang: "xmlLang",
+ "xml:lang": "xmlLang",
+ xmlns: "xmlns",
+ "xml:space": "xmlSpace",
+ xmlnsxlink: "xmlnsXlink",
+ "xmlns:xlink": "xmlnsXlink",
+ xmlspace: "xmlSpace",
+ y1: "y1",
+ y2: "y2",
+ y: "y",
+ ychannelselector: "yChannelSelector",
+ z: "z",
+ zoomandpan: "zoomAndPan"
+ };
+
+ function getStackAddendum$2() {
+ var stack = ReactDebugCurrentFrame.getStackAddendum();
+ return stack != null ? stack : "";
+ }
+
+ {
+ var warnedProperties$1 = {};
+ var hasOwnProperty$1 = Object.prototype.hasOwnProperty;
+ var EVENT_NAME_REGEX = /^on./;
+ var INVALID_EVENT_NAME_REGEX = /^on[^A-Z]/;
+ var rARIA$1 = new RegExp(
+ "^(aria)-[" + ATTRIBUTE_NAME_CHAR + "]*$"
+ );
+ var rARIACamel$1 = new RegExp(
+ "^(aria)[A-Z][" + ATTRIBUTE_NAME_CHAR + "]*$"
+ );
+
+ var validateProperty$1 = function(
+ tagName,
+ name,
+ value,
+ canUseEventSystem
+ ) {
+ if (
+ hasOwnProperty$1.call(warnedProperties$1, name) &&
+ warnedProperties$1[name]
+ ) {
+ return true;
+ }
+
+ var lowerCasedName = name.toLowerCase();
+ if (
+ lowerCasedName === "onfocusin" ||
+ lowerCasedName === "onfocusout"
+ ) {
+ warning(
+ false,
+ "React uses onFocus and onBlur instead of onFocusIn and onFocusOut. " +
+ "All React events are normalized to bubble, so onFocusIn and onFocusOut " +
+ "are not needed/supported by React."
+ );
+ warnedProperties$1[name] = true;
+ return true;
+ }
+
+ // We can't rely on the event system being injected on the server.
+ if (canUseEventSystem) {
+ if (registrationNameModules.hasOwnProperty(name)) {
+ return true;
+ }
+ var registrationName = possibleRegistrationNames.hasOwnProperty(
+ lowerCasedName
+ )
+ ? possibleRegistrationNames[lowerCasedName]
+ : null;
+ if (registrationName != null) {
+ warning(
+ false,
+ "Invalid event handler property `%s`. Did you mean `%s`?%s",
+ name,
+ registrationName,
+ getStackAddendum$2()
+ );
+ warnedProperties$1[name] = true;
+ return true;
+ }
+ if (EVENT_NAME_REGEX.test(name)) {
+ warning(
+ false,
+ "Unknown event handler property `%s`. It will be ignored.%s",
+ name,
+ getStackAddendum$2()
+ );
+ warnedProperties$1[name] = true;
+ return true;
+ }
+ } else if (EVENT_NAME_REGEX.test(name)) {
+ // If no event plugins have been injected, we are in a server environment.
+ // So we can't tell if the event name is correct for sure, but we can filter
+ // out known bad ones like `onclick`. We can't suggest a specific replacement though.
+ if (INVALID_EVENT_NAME_REGEX.test(name)) {
+ warning(
+ false,
+ "Invalid event handler property `%s`. " +
+ "React events use the camelCase naming convention, for example `onClick`.%s",
+ name,
+ getStackAddendum$2()
+ );
+ }
+ warnedProperties$1[name] = true;
+ return true;
+ }
+
+ // Let the ARIA attribute hook validate ARIA attributes
+ if (rARIA$1.test(name) || rARIACamel$1.test(name)) {
+ return true;
+ }
+
+ if (lowerCasedName === "innerhtml") {
+ warning(
+ false,
+ "Directly setting property `innerHTML` is not permitted. " +
+ "For more information, lookup documentation on `dangerouslySetInnerHTML`."
+ );
+ warnedProperties$1[name] = true;
+ return true;
+ }
+
+ if (lowerCasedName === "aria") {
+ warning(
+ false,
+ "The `aria` attribute is reserved for future use in React. " +
+ "Pass individual `aria-` attributes instead."
+ );
+ warnedProperties$1[name] = true;
+ return true;
+ }
+
+ if (
+ lowerCasedName === "is" &&
+ value !== null &&
+ value !== undefined &&
+ typeof value !== "string"
+ ) {
+ warning(
+ false,
+ "Received a `%s` for a string attribute `is`. If this is expected, cast " +
+ "the value to a string.%s",
+ typeof value,
+ getStackAddendum$2()
+ );
+ warnedProperties$1[name] = true;
+ return true;
+ }
+
+ if (typeof value === "number" && isNaN(value)) {
+ warning(
+ false,
+ "Received NaN for the `%s` attribute. If this is expected, cast " +
+ "the value to a string.%s",
+ name,
+ getStackAddendum$2()
+ );
+ warnedProperties$1[name] = true;
+ return true;
+ }
+
+ var isReserved = isReservedProp(name);
+
+ // Known attributes should match the casing specified in the property config.
+ if (possibleStandardNames.hasOwnProperty(lowerCasedName)) {
+ var standardName = possibleStandardNames[lowerCasedName];
+ if (standardName !== name) {
+ warning(
+ false,
+ "Invalid DOM property `%s`. Did you mean `%s`?%s",
+ name,
+ standardName,
+ getStackAddendum$2()
+ );
+ warnedProperties$1[name] = true;
+ return true;
+ }
+ } else if (!isReserved && name !== lowerCasedName) {
+ // Unknown attributes should have lowercase casing since that's how they
+ // will be cased anyway with server rendering.
+ warning(
+ false,
+ "React does not recognize the `%s` prop on a DOM element. If you " +
+ "intentionally want it to appear in the DOM as a custom " +
+ "attribute, spell it as lowercase `%s` instead. " +
+ "If you accidentally passed it from a parent component, remove " +
+ "it from the DOM element.%s",
+ name,
+ lowerCasedName,
+ getStackAddendum$2()
+ );
+ warnedProperties$1[name] = true;
+ return true;
+ }
+
+ if (
+ typeof value === "boolean" &&
+ !shouldAttributeAcceptBooleanValue(name)
+ ) {
+ if (value) {
+ warning(
+ false,
+ "Received `%s` for a non-boolean attribute `%s`.\n\n" +
+ "If you want to write it to the DOM, pass a string instead: " +
+ '%s="%s" or %s={value.toString()}.%s',
+ value,
+ name,
+ name,
+ value,
+ name,
+ getStackAddendum$2()
+ );
+ } else {
+ warning(
+ false,
+ "Received `%s` for a non-boolean attribute `%s`.\n\n" +
+ "If you want to write it to the DOM, pass a string instead: " +
+ '%s="%s" or %s={value.toString()}.\n\n' +
+ "If you used to conditionally omit it with %s={condition && value}, " +
+ "pass %s={condition ? value : undefined} instead.%s",
+ value,
+ name,
+ name,
+ value,
+ name,
+ name,
+ name,
+ getStackAddendum$2()
+ );
+ }
+ warnedProperties$1[name] = true;
+ return true;
+ }
+
+ // Now that we've validated casing, do not validate
+ // data types for reserved props
+ if (isReserved) {
+ return true;
+ }
+
+ // Warn when a known attribute is a bad type
+ if (!shouldSetAttribute(name, value)) {
+ warnedProperties$1[name] = true;
+ return false;
+ }
+
+ return true;
+ };
+ }
+
+ var warnUnknownProperties = function(
+ type,
+ props,
+ canUseEventSystem
+ ) {
+ var unknownProps = [];
+ for (var key in props) {
+ var isValid = validateProperty$1(
+ type,
+ key,
+ props[key],
+ canUseEventSystem
+ );
+ if (!isValid) {
+ unknownProps.push(key);
+ }
+ }
+
+ var unknownPropString = unknownProps
+ .map(function(prop) {
+ return "`" + prop + "`";
+ })
+ .join(", ");
+ if (unknownProps.length === 1) {
+ warning(
+ false,
+ "Invalid value for prop %s on <%s> tag. Either remove it from the element, " +
+ "or pass a string or number value to keep it in the DOM. " +
+ "For details, see https://fb.me/react-attribute-behavior%s",
+ unknownPropString,
+ type,
+ getStackAddendum$2()
+ );
+ } else if (unknownProps.length > 1) {
+ warning(
+ false,
+ "Invalid values for props %s on <%s> tag. Either remove them from the element, " +
+ "or pass a string or number value to keep them in the DOM. " +
+ "For details, see https://fb.me/react-attribute-behavior%s",
+ unknownPropString,
+ type,
+ getStackAddendum$2()
+ );
+ }
+ };
+
+ function validateProperties$2(type, props, canUseEventSystem) {
+ if (isCustomComponent(type, props)) {
+ return;
+ }
+ warnUnknownProperties(type, props, canUseEventSystem);
+ }
+
+ // TODO: direct imports like some-package/src/* are bad. Fix me.
+ var getCurrentFiberOwnerName$1 =
+ ReactDebugCurrentFiber.getCurrentFiberOwnerName;
+ var getCurrentFiberStackAddendum$2 =
+ ReactDebugCurrentFiber.getCurrentFiberStackAddendum;
+
+ var didWarnInvalidHydration = false;
+ var didWarnShadyDOM = false;
+
+ var DANGEROUSLY_SET_INNER_HTML = "dangerouslySetInnerHTML";
+ var SUPPRESS_CONTENT_EDITABLE_WARNING =
+ "suppressContentEditableWarning";
+ var SUPPRESS_HYDRATION_WARNING$1 = "suppressHydrationWarning";
+ var AUTOFOCUS = "autoFocus";
+ var CHILDREN = "children";
+ var STYLE = "style";
+ var HTML = "__html";
+
+ var HTML_NAMESPACE = Namespaces.html;
+
+ var getStack = emptyFunction.thatReturns("");
+
+ {
+ getStack = getCurrentFiberStackAddendum$2;
+
+ var warnedUnknownTags = {
+ // Chrome is the only major browser not shipping <time>. But as of July
+ // 2017 it intends to ship it due to widespread usage. We intentionally
+ // *don't* warn for <time> even if it's unrecognized by Chrome because
+ // it soon will be, and many apps have been using it anyway.
+ time: true,
+ // There are working polyfills for <dialog>. Let people use it.
+ dialog: true
+ };
+
+ var validatePropertiesInDevelopment = function(type, props) {
+ validateProperties(type, props);
+ validateProperties$1(type, props);
+ validateProperties$2(type, props, /* canUseEventSystem */ true);
+ };
+
+ // HTML parsing normalizes CR and CRLF to LF.
+ // It also can turn \u0000 into \uFFFD inside attributes.
+ // https://www.w3.org/TR/html5/single-page.html#preprocessing-the-input-stream
+ // If we have a mismatch, it might be caused by that.
+ // We will still patch up in this case but not fire the warning.
+ var NORMALIZE_NEWLINES_REGEX = /\r\n?/g;
+ var NORMALIZE_NULL_AND_REPLACEMENT_REGEX = /\u0000|\uFFFD/g;
+
+ var normalizeMarkupForTextOrAttribute = function(markup) {
+ var markupString =
+ typeof markup === "string" ? markup : "" + markup;
+ return markupString
+ .replace(NORMALIZE_NEWLINES_REGEX, "\n")
+ .replace(NORMALIZE_NULL_AND_REPLACEMENT_REGEX, "");
+ };
+
+ var warnForTextDifference = function(serverText, clientText) {
+ if (didWarnInvalidHydration) {
+ return;
+ }
+ var normalizedClientText = normalizeMarkupForTextOrAttribute(
+ clientText
+ );
+ var normalizedServerText = normalizeMarkupForTextOrAttribute(
+ serverText
+ );
+ if (normalizedServerText === normalizedClientText) {
+ return;
+ }
+ didWarnInvalidHydration = true;
+ warning(
+ false,
+ 'Text content did not match. Server: "%s" Client: "%s"',
+ normalizedServerText,
+ normalizedClientText
+ );
+ };
+
+ var warnForPropDifference = function(
+ propName,
+ serverValue,
+ clientValue
+ ) {
+ if (didWarnInvalidHydration) {
+ return;
+ }
+ var normalizedClientValue = normalizeMarkupForTextOrAttribute(
+ clientValue
+ );
+ var normalizedServerValue = normalizeMarkupForTextOrAttribute(
+ serverValue
+ );
+ if (normalizedServerValue === normalizedClientValue) {
+ return;
+ }
+ didWarnInvalidHydration = true;
+ warning(
+ false,
+ "Prop `%s` did not match. Server: %s Client: %s",
+ propName,
+ JSON.stringify(normalizedServerValue),
+ JSON.stringify(normalizedClientValue)
+ );
+ };
+
+ var warnForExtraAttributes = function(attributeNames) {
+ if (didWarnInvalidHydration) {
+ return;
+ }
+ didWarnInvalidHydration = true;
+ var names = [];
+ attributeNames.forEach(function(name) {
+ names.push(name);
+ });
+ warning(false, "Extra attributes from the server: %s", names);
+ };
+
+ var warnForInvalidEventListener = function(
+ registrationName,
+ listener
+ ) {
+ if (listener === false) {
+ warning(
+ false,
+ "Expected `%s` listener to be a function, instead got `false`.\n\n" +
+ "If you used to conditionally omit it with %s={condition && value}, " +
+ "pass %s={condition ? value : undefined} instead.%s",
+ registrationName,
+ registrationName,
+ registrationName,
+ getCurrentFiberStackAddendum$2()
+ );
+ } else {
+ warning(
+ false,
+ "Expected `%s` listener to be a function, instead got a value of `%s` type.%s",
+ registrationName,
+ typeof listener,
+ getCurrentFiberStackAddendum$2()
+ );
+ }
+ };
+
+ // Parse the HTML and read it back to normalize the HTML string so that it
+ // can be used for comparison.
+ var normalizeHTML = function(parent, html) {
+ // We could have created a separate document here to avoid
+ // re-initializing custom elements if they exist. But this breaks
+ // how <noscript> is being handled. So we use the same document.
+ // See the discussion in https://github.com/facebook/react/pull/11157.
+ var testElement =
+ parent.namespaceURI === HTML_NAMESPACE
+ ? parent.ownerDocument.createElement(parent.tagName)
+ : parent.ownerDocument.createElementNS(
+ parent.namespaceURI,
+ parent.tagName
+ );
+ testElement.innerHTML = html;
+ return testElement.innerHTML;
+ };
+ }
+
+ function ensureListeningTo(rootContainerElement, registrationName) {
+ var isDocumentOrFragment =
+ rootContainerElement.nodeType === DOCUMENT_NODE ||
+ rootContainerElement.nodeType === DOCUMENT_FRAGMENT_NODE;
+ var doc = isDocumentOrFragment
+ ? rootContainerElement
+ : rootContainerElement.ownerDocument;
+ listenTo(registrationName, doc);
+ }
+
+ function getOwnerDocumentFromRootContainer(rootContainerElement) {
+ return rootContainerElement.nodeType === DOCUMENT_NODE
+ ? rootContainerElement
+ : rootContainerElement.ownerDocument;
+ }
+
+ // There are so many media events, it makes sense to just
+ // maintain a list rather than create a `trapBubbledEvent` for each
+ var mediaEvents = {
+ topAbort: "abort",
+ topCanPlay: "canplay",
+ topCanPlayThrough: "canplaythrough",
+ topDurationChange: "durationchange",
+ topEmptied: "emptied",
+ topEncrypted: "encrypted",
+ topEnded: "ended",
+ topError: "error",
+ topLoadedData: "loadeddata",
+ topLoadedMetadata: "loadedmetadata",
+ topLoadStart: "loadstart",
+ topPause: "pause",
+ topPlay: "play",
+ topPlaying: "playing",
+ topProgress: "progress",
+ topRateChange: "ratechange",
+ topSeeked: "seeked",
+ topSeeking: "seeking",
+ topStalled: "stalled",
+ topSuspend: "suspend",
+ topTimeUpdate: "timeupdate",
+ topVolumeChange: "volumechange",
+ topWaiting: "waiting"
+ };
+
+ function trapClickOnNonInteractiveElement(node) {
+ // Mobile Safari does not fire properly bubble click events on
+ // non-interactive elements, which means delegated click listeners do not
+ // fire. The workaround for this bug involves attaching an empty click
+ // listener on the target node.
+ // http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html
+ // Just set it using the onclick property so that we don't have to manage any
+ // bookkeeping for it. Not sure if we need to clear it when the listener is
+ // removed.
+ // TODO: Only do this for the relevant Safaris maybe?
+ node.onclick = emptyFunction;
+ }
+
+ function setInitialDOMProperties(
+ tag,
+ domElement,
+ rootContainerElement,
+ nextProps,
+ isCustomComponentTag
+ ) {
+ for (var propKey in nextProps) {
+ if (!nextProps.hasOwnProperty(propKey)) {
+ continue;
+ }
+ var nextProp = nextProps[propKey];
+ if (propKey === STYLE) {
+ {
+ if (nextProp) {
+ // Freeze the next style object so that we can assume it won't be
+ // mutated. We have already warned for this in the past.
+ Object.freeze(nextProp);
+ }
+ }
+ // Relies on `updateStylesByID` not mutating `styleUpdates`.
+ setValueForStyles(domElement, nextProp, getStack);
+ } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
+ var nextHtml = nextProp ? nextProp[HTML] : undefined;
+ if (nextHtml != null) {
+ setInnerHTML(domElement, nextHtml);
+ }
+ } else if (propKey === CHILDREN) {
+ if (typeof nextProp === "string") {
+ // Avoid setting initial textContent when the text is empty. In IE11 setting
+ // textContent on a <textarea> will cause the placeholder to not
+ // show within the <textarea> until it has been focused and blurred again.
+ // https://github.com/facebook/react/issues/6731#issuecomment-254874553
+ var canSetTextContent =
+ tag !== "textarea" || nextProp !== "";
+ if (canSetTextContent) {
+ setTextContent(domElement, nextProp);
+ }
+ } else if (typeof nextProp === "number") {
+ setTextContent(domElement, "" + nextProp);
+ }
+ } else if (
+ propKey === SUPPRESS_CONTENT_EDITABLE_WARNING ||
+ propKey === SUPPRESS_HYDRATION_WARNING$1
+ ) {
+ // Noop
+ } else if (propKey === AUTOFOCUS) {
+ // We polyfill it separately on the client during commit.
+ // We blacklist it here rather than in the property list because we emit it in SSR.
+ } else if (registrationNameModules.hasOwnProperty(propKey)) {
+ if (nextProp != null) {
+ if (true && typeof nextProp !== "function") {
+ warnForInvalidEventListener(propKey, nextProp);
+ }
+ ensureListeningTo(rootContainerElement, propKey);
+ }
+ } else if (isCustomComponentTag) {
+ setValueForAttribute(domElement, propKey, nextProp);
+ } else if (nextProp != null) {
+ // If we're updating to null or undefined, we should remove the property
+ // from the DOM node instead of inadvertently setting to a string. This
+ // brings us in line with the same behavior we have on initial render.
+ setValueForProperty(domElement, propKey, nextProp);
+ }
+ }
+ }
+
+ function updateDOMProperties(
+ domElement,
+ updatePayload,
+ wasCustomComponentTag,
+ isCustomComponentTag
+ ) {
+ // TODO: Handle wasCustomComponentTag
+ for (var i = 0; i < updatePayload.length; i += 2) {
+ var propKey = updatePayload[i];
+ var propValue = updatePayload[i + 1];
+ if (propKey === STYLE) {
+ setValueForStyles(domElement, propValue, getStack);
+ } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
+ setInnerHTML(domElement, propValue);
+ } else if (propKey === CHILDREN) {
+ setTextContent(domElement, propValue);
+ } else if (isCustomComponentTag) {
+ if (propValue != null) {
+ setValueForAttribute(domElement, propKey, propValue);
+ } else {
+ deleteValueForAttribute(domElement, propKey);
+ }
+ } else if (propValue != null) {
+ setValueForProperty(domElement, propKey, propValue);
+ } else {
+ // If we're updating to null or undefined, we should remove the property
+ // from the DOM node instead of inadvertently setting to a string. This
+ // brings us in line with the same behavior we have on initial render.
+ deleteValueForProperty(domElement, propKey);
+ }
+ }
+ }
+
+ function createElement$1(
+ type,
+ props,
+ rootContainerElement,
+ parentNamespace
+ ) {
+ // We create tags in the namespace of their parent container, except HTML
+ var ownerDocument = getOwnerDocumentFromRootContainer(
+ rootContainerElement
+ );
+ var domElement;
+ var namespaceURI = parentNamespace;
+ if (namespaceURI === HTML_NAMESPACE) {
+ namespaceURI = getIntrinsicNamespace(type);
+ }
+ if (namespaceURI === HTML_NAMESPACE) {
+ {
+ var isCustomComponentTag = isCustomComponent(type, props);
+ // Should this check be gated by parent namespace? Not sure we want to
+ // allow <SVG> or <mATH>.
+ warning(
+ isCustomComponentTag || type === type.toLowerCase(),
+ "<%s /> is using uppercase HTML. Always use lowercase HTML tags " +
+ "in React.",
+ type
+ );
+ }
+
+ if (type === "script") {
+ // Create the script via .innerHTML so its "parser-inserted" flag is
+ // set to true and it does not execute
+ var div = ownerDocument.createElement("div");
+ div.innerHTML = "<script><" + "/script>"; // eslint-disable-line
+ // This is guaranteed to yield a script element.
+ var firstChild = div.firstChild;
+ domElement = div.removeChild(firstChild);
+ } else if (typeof props.is === "string") {
+ // $FlowIssue `createElement` should be updated for Web Components
+ domElement = ownerDocument.createElement(type, {
+ is: props.is
+ });
+ } else {
+ // Separate else branch instead of using `props.is || undefined` above because of a Firefox bug.
+ // See discussion in https://github.com/facebook/react/pull/6896
+ // and discussion in https://bugzilla.mozilla.org/show_bug.cgi?id=1276240
+ domElement = ownerDocument.createElement(type);
+ }
+ } else {
+ domElement = ownerDocument.createElementNS(namespaceURI, type);
+ }
+
+ {
+ if (namespaceURI === HTML_NAMESPACE) {
+ if (
+ !isCustomComponentTag &&
+ Object.prototype.toString.call(domElement) ===
+ "[object HTMLUnknownElement]" &&
+ !Object.prototype.hasOwnProperty.call(
+ warnedUnknownTags,
+ type
+ )
+ ) {
+ warnedUnknownTags[type] = true;
+ warning(
+ false,
+ "The tag <%s> is unrecognized in this browser. " +
+ "If you meant to render a React component, start its name with " +
+ "an uppercase letter.",
+ type
+ );
+ }
+ }
+ }
+
+ return domElement;
+ }
+
+ function createTextNode$1(text, rootContainerElement) {
+ return getOwnerDocumentFromRootContainer(
+ rootContainerElement
+ ).createTextNode(text);
+ }
+
+ function setInitialProperties$1(
+ domElement,
+ tag,
+ rawProps,
+ rootContainerElement
+ ) {
+ var isCustomComponentTag = isCustomComponent(tag, rawProps);
+ {
+ validatePropertiesInDevelopment(tag, rawProps);
+ if (
+ isCustomComponentTag &&
+ !didWarnShadyDOM &&
+ domElement.shadyRoot
+ ) {
+ warning(
+ false,
+ "%s is using shady DOM. Using shady DOM with React can " +
+ "cause things to break subtly.",
+ getCurrentFiberOwnerName$1() || "A component"
+ );
+ didWarnShadyDOM = true;
+ }
+ }
+
+ // TODO: Make sure that we check isMounted before firing any of these events.
+ var props;
+ switch (tag) {
+ case "iframe":
+ case "object":
+ trapBubbledEvent("topLoad", "load", domElement);
+ props = rawProps;
+ break;
+ case "video":
+ case "audio":
+ // Create listener for each media event
+ for (var event in mediaEvents) {
+ if (mediaEvents.hasOwnProperty(event)) {
+ trapBubbledEvent(event, mediaEvents[event], domElement);
+ }
+ }
+ props = rawProps;
+ break;
+ case "source":
+ trapBubbledEvent("topError", "error", domElement);
+ props = rawProps;
+ break;
+ case "img":
+ case "image":
+ trapBubbledEvent("topError", "error", domElement);
+ trapBubbledEvent("topLoad", "load", domElement);
+ props = rawProps;
+ break;
+ case "form":
+ trapBubbledEvent("topReset", "reset", domElement);
+ trapBubbledEvent("topSubmit", "submit", domElement);
+ props = rawProps;
+ break;
+ case "details":
+ trapBubbledEvent("topToggle", "toggle", domElement);
+ props = rawProps;
+ break;
+ case "input":
+ initWrapperState(domElement, rawProps);
+ props = getHostProps(domElement, rawProps);
+ trapBubbledEvent("topInvalid", "invalid", domElement);
+ // For controlled components we always need to ensure we're listening
+ // to onChange. Even if there is no listener.
+ ensureListeningTo(rootContainerElement, "onChange");
+ break;
+ case "option":
+ validateProps(domElement, rawProps);
+ props = getHostProps$1(domElement, rawProps);
+ break;
+ case "select":
+ initWrapperState$1(domElement, rawProps);
+ props = getHostProps$2(domElement, rawProps);
+ trapBubbledEvent("topInvalid", "invalid", domElement);
+ // For controlled components we always need to ensure we're listening
+ // to onChange. Even if there is no listener.
+ ensureListeningTo(rootContainerElement, "onChange");
+ break;
+ case "textarea":
+ initWrapperState$2(domElement, rawProps);
+ props = getHostProps$3(domElement, rawProps);
+ trapBubbledEvent("topInvalid", "invalid", domElement);
+ // For controlled components we always need to ensure we're listening
+ // to onChange. Even if there is no listener.
+ ensureListeningTo(rootContainerElement, "onChange");
+ break;
+ default:
+ props = rawProps;
+ }
+
+ assertValidProps(tag, props, getStack);
+
+ setInitialDOMProperties(
+ tag,
+ domElement,
+ rootContainerElement,
+ props,
+ isCustomComponentTag
+ );
+
+ switch (tag) {
+ case "input":
+ // TODO: Make sure we check if this is still unmounted or do any clean
+ // up necessary since we never stop tracking anymore.
+ track(domElement);
+ postMountWrapper(domElement, rawProps);
+ break;
+ case "textarea":
+ // TODO: Make sure we check if this is still unmounted or do any clean
+ // up necessary since we never stop tracking anymore.
+ track(domElement);
+ postMountWrapper$3(domElement, rawProps);
+ break;
+ case "option":
+ postMountWrapper$1(domElement, rawProps);
+ break;
+ case "select":
+ postMountWrapper$2(domElement, rawProps);
+ break;
+ default:
+ if (typeof props.onClick === "function") {
+ // TODO: This cast may not be sound for SVG, MathML or custom elements.
+ trapClickOnNonInteractiveElement(domElement);
+ }
+ break;
+ }
+ }
+
+ // Calculate the diff between the two objects.
+ function diffProperties$1(
+ domElement,
+ tag,
+ lastRawProps,
+ nextRawProps,
+ rootContainerElement
+ ) {
+ {
+ validatePropertiesInDevelopment(tag, nextRawProps);
+ }
+
+ var updatePayload = null;
+
+ var lastProps;
+ var nextProps;
+ switch (tag) {
+ case "input":
+ lastProps = getHostProps(domElement, lastRawProps);
+ nextProps = getHostProps(domElement, nextRawProps);
+ updatePayload = [];
+ break;
+ case "option":
+ lastProps = getHostProps$1(domElement, lastRawProps);
+ nextProps = getHostProps$1(domElement, nextRawProps);
+ updatePayload = [];
+ break;
+ case "select":
+ lastProps = getHostProps$2(domElement, lastRawProps);
+ nextProps = getHostProps$2(domElement, nextRawProps);
+ updatePayload = [];
+ break;
+ case "textarea":
+ lastProps = getHostProps$3(domElement, lastRawProps);
+ nextProps = getHostProps$3(domElement, nextRawProps);
+ updatePayload = [];
+ break;
+ default:
+ lastProps = lastRawProps;
+ nextProps = nextRawProps;
+ if (
+ typeof lastProps.onClick !== "function" &&
+ typeof nextProps.onClick === "function"
+ ) {
+ // TODO: This cast may not be sound for SVG, MathML or custom elements.
+ trapClickOnNonInteractiveElement(domElement);
+ }
+ break;
+ }
+
+ assertValidProps(tag, nextProps, getStack);
+
+ var propKey;
+ var styleName;
+ var styleUpdates = null;
+ for (propKey in lastProps) {
+ if (
+ nextProps.hasOwnProperty(propKey) ||
+ !lastProps.hasOwnProperty(propKey) ||
+ lastProps[propKey] == null
+ ) {
+ continue;
+ }
+ if (propKey === STYLE) {
+ var lastStyle = lastProps[propKey];
+ for (styleName in lastStyle) {
+ if (lastStyle.hasOwnProperty(styleName)) {
+ if (!styleUpdates) {
+ styleUpdates = {};
+ }
+ styleUpdates[styleName] = "";
+ }
+ }
+ } else if (
+ propKey === DANGEROUSLY_SET_INNER_HTML ||
+ propKey === CHILDREN
+ ) {
+ // Noop. This is handled by the clear text mechanism.
+ } else if (
+ propKey === SUPPRESS_CONTENT_EDITABLE_WARNING ||
+ propKey === SUPPRESS_HYDRATION_WARNING$1
+ ) {
+ // Noop
+ } else if (propKey === AUTOFOCUS) {
+ // Noop. It doesn't work on updates anyway.
+ } else if (registrationNameModules.hasOwnProperty(propKey)) {
+ // This is a special case. If any listener updates we need to ensure
+ // that the "current" fiber pointer gets updated so we need a commit
+ // to update this element.
+ if (!updatePayload) {
+ updatePayload = [];
+ }
+ } else {
+ // For all other deleted properties we add it to the queue. We use
+ // the whitelist in the commit phase instead.
+ (updatePayload = updatePayload || []).push(propKey, null);
+ }
+ }
+ for (propKey in nextProps) {
+ var nextProp = nextProps[propKey];
+ var lastProp =
+ lastProps != null ? lastProps[propKey] : undefined;
+ if (
+ !nextProps.hasOwnProperty(propKey) ||
+ nextProp === lastProp ||
+ (nextProp == null && lastProp == null)
+ ) {
+ continue;
+ }
+ if (propKey === STYLE) {
+ {
+ if (nextProp) {
+ // Freeze the next style object so that we can assume it won't be
+ // mutated. We have already warned for this in the past.
+ Object.freeze(nextProp);
+ }
+ }
+ if (lastProp) {
+ // Unset styles on `lastProp` but not on `nextProp`.
+ for (styleName in lastProp) {
+ if (
+ lastProp.hasOwnProperty(styleName) &&
+ (!nextProp || !nextProp.hasOwnProperty(styleName))
+ ) {
+ if (!styleUpdates) {
+ styleUpdates = {};
+ }
+ styleUpdates[styleName] = "";
+ }
+ }
+ // Update styles that changed since `lastProp`.
+ for (styleName in nextProp) {
+ if (
+ nextProp.hasOwnProperty(styleName) &&
+ lastProp[styleName] !== nextProp[styleName]
+ ) {
+ if (!styleUpdates) {
+ styleUpdates = {};
+ }
+ styleUpdates[styleName] = nextProp[styleName];
+ }
+ }
+ } else {
+ // Relies on `updateStylesByID` not mutating `styleUpdates`.
+ if (!styleUpdates) {
+ if (!updatePayload) {
+ updatePayload = [];
+ }
+ updatePayload.push(propKey, styleUpdates);
+ }
+ styleUpdates = nextProp;
+ }
+ } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
+ var nextHtml = nextProp ? nextProp[HTML] : undefined;
+ var lastHtml = lastProp ? lastProp[HTML] : undefined;
+ if (nextHtml != null) {
+ if (lastHtml !== nextHtml) {
+ (updatePayload = updatePayload || []).push(
+ propKey,
+ "" + nextHtml
+ );
+ }
+ } else {
+ // TODO: It might be too late to clear this if we have children
+ // inserted already.
+ }
+ } else if (propKey === CHILDREN) {
+ if (
+ lastProp !== nextProp &&
+ (typeof nextProp === "string" ||
+ typeof nextProp === "number")
+ ) {
+ (updatePayload = updatePayload || []).push(
+ propKey,
+ "" + nextProp
+ );
+ }
+ } else if (
+ propKey === SUPPRESS_CONTENT_EDITABLE_WARNING ||
+ propKey === SUPPRESS_HYDRATION_WARNING$1
+ ) {
+ // Noop
+ } else if (registrationNameModules.hasOwnProperty(propKey)) {
+ if (nextProp != null) {
+ // We eagerly listen to this even though we haven't committed yet.
+ if (true && typeof nextProp !== "function") {
+ warnForInvalidEventListener(propKey, nextProp);
+ }
+ ensureListeningTo(rootContainerElement, propKey);
+ }
+ if (!updatePayload && lastProp !== nextProp) {
+ // This is a special case. If any listener updates we need to ensure
+ // that the "current" props pointer gets updated so we need a commit
+ // to update this element.
+ updatePayload = [];
+ }
+ } else {
+ // For any other property we always add it to the queue and then we
+ // filter it out using the whitelist during the commit.
+ (updatePayload = updatePayload || []).push(propKey, nextProp);
+ }
+ }
+ if (styleUpdates) {
+ (updatePayload = updatePayload || []).push(STYLE, styleUpdates);
+ }
+ return updatePayload;
+ }
+
+ // Apply the diff.
+ function updateProperties$1(
+ domElement,
+ updatePayload,
+ tag,
+ lastRawProps,
+ nextRawProps
+ ) {
+ // Update checked *before* name.
+ // In the middle of an update, it is possible to have multiple checked.
+ // When a checked radio tries to change name, browser makes another radio's checked false.
+ if (
+ tag === "input" &&
+ nextRawProps.type === "radio" &&
+ nextRawProps.name != null
+ ) {
+ updateChecked(domElement, nextRawProps);
+ }
+
+ var wasCustomComponentTag = isCustomComponent(tag, lastRawProps);
+ var isCustomComponentTag = isCustomComponent(tag, nextRawProps);
+ // Apply the diff.
+ updateDOMProperties(
+ domElement,
+ updatePayload,
+ wasCustomComponentTag,
+ isCustomComponentTag
+ );
+
+ // TODO: Ensure that an update gets scheduled if any of the special props
+ // changed.
+ switch (tag) {
+ case "input":
+ // Update the wrapper around inputs *after* updating props. This has to
+ // happen after `updateDOMProperties`. Otherwise HTML5 input validations
+ // raise warnings and prevent the new value from being assigned.
+ updateWrapper(domElement, nextRawProps);
+ break;
+ case "textarea":
+ updateWrapper$1(domElement, nextRawProps);
+ break;
+ case "select":
+ // <select> value update needs to occur after <option> children
+ // reconciliation
+ postUpdateWrapper(domElement, nextRawProps);
+ break;
+ }
+ }
+
+ function diffHydratedProperties$1(
+ domElement,
+ tag,
+ rawProps,
+ parentNamespace,
+ rootContainerElement
+ ) {
+ {
+ var suppressHydrationWarning =
+ rawProps[SUPPRESS_HYDRATION_WARNING$1] === true;
+ var isCustomComponentTag = isCustomComponent(tag, rawProps);
+ validatePropertiesInDevelopment(tag, rawProps);
+ if (
+ isCustomComponentTag &&
+ !didWarnShadyDOM &&
+ domElement.shadyRoot
+ ) {
+ warning(
+ false,
+ "%s is using shady DOM. Using shady DOM with React can " +
+ "cause things to break subtly.",
+ getCurrentFiberOwnerName$1() || "A component"
+ );
+ didWarnShadyDOM = true;
+ }
+ }
+
+ // TODO: Make sure that we check isMounted before firing any of these events.
+ switch (tag) {
+ case "iframe":
+ case "object":
+ trapBubbledEvent("topLoad", "load", domElement);
+ break;
+ case "video":
+ case "audio":
+ // Create listener for each media event
+ for (var event in mediaEvents) {
+ if (mediaEvents.hasOwnProperty(event)) {
+ trapBubbledEvent(event, mediaEvents[event], domElement);
+ }
+ }
+ break;
+ case "source":
+ trapBubbledEvent("topError", "error", domElement);
+ break;
+ case "img":
+ case "image":
+ trapBubbledEvent("topError", "error", domElement);
+ trapBubbledEvent("topLoad", "load", domElement);
+ break;
+ case "form":
+ trapBubbledEvent("topReset", "reset", domElement);
+ trapBubbledEvent("topSubmit", "submit", domElement);
+ break;
+ case "details":
+ trapBubbledEvent("topToggle", "toggle", domElement);
+ break;
+ case "input":
+ initWrapperState(domElement, rawProps);
+ trapBubbledEvent("topInvalid", "invalid", domElement);
+ // For controlled components we always need to ensure we're listening
+ // to onChange. Even if there is no listener.
+ ensureListeningTo(rootContainerElement, "onChange");
+ break;
+ case "option":
+ validateProps(domElement, rawProps);
+ break;
+ case "select":
+ initWrapperState$1(domElement, rawProps);
+ trapBubbledEvent("topInvalid", "invalid", domElement);
+ // For controlled components we always need to ensure we're listening
+ // to onChange. Even if there is no listener.
+ ensureListeningTo(rootContainerElement, "onChange");
+ break;
+ case "textarea":
+ initWrapperState$2(domElement, rawProps);
+ trapBubbledEvent("topInvalid", "invalid", domElement);
+ // For controlled components we always need to ensure we're listening
+ // to onChange. Even if there is no listener.
+ ensureListeningTo(rootContainerElement, "onChange");
+ break;
+ }
+
+ assertValidProps(tag, rawProps, getStack);
+
+ {
+ var extraAttributeNames = new Set();
+ var attributes = domElement.attributes;
+ for (var i = 0; i < attributes.length; i++) {
+ var name = attributes[i].name.toLowerCase();
+ switch (name) {
+ // Built-in SSR attribute is whitelisted
+ case "data-reactroot":
+ break;
+ // Controlled attributes are not validated
+ // TODO: Only ignore them on controlled tags.
+ case "value":
+ break;
+ case "checked":
+ break;
+ case "selected":
+ break;
+ default:
+ // Intentionally use the original name.
+ // See discussion in https://github.com/facebook/react/pull/10676.
+ extraAttributeNames.add(attributes[i].name);
+ }
+ }
+ }
+
+ var updatePayload = null;
+ for (var propKey in rawProps) {
+ if (!rawProps.hasOwnProperty(propKey)) {
+ continue;
+ }
+ var nextProp = rawProps[propKey];
+ if (propKey === CHILDREN) {
+ // For text content children we compare against textContent. This
+ // might match additional HTML that is hidden when we read it using
+ // textContent. E.g. "foo" will match "f<span>oo</span>" but that still
+ // satisfies our requirement. Our requirement is not to produce perfect
+ // HTML and attributes. Ideally we should preserve structure but it's
+ // ok not to if the visible content is still enough to indicate what
+ // even listeners these nodes might be wired up to.
+ // TODO: Warn if there is more than a single textNode as a child.
+ // TODO: Should we use domElement.firstChild.nodeValue to compare?
+ if (typeof nextProp === "string") {
+ if (domElement.textContent !== nextProp) {
+ if (true && !suppressHydrationWarning) {
+ warnForTextDifference(domElement.textContent, nextProp);
+ }
+ updatePayload = [CHILDREN, nextProp];
+ }
+ } else if (typeof nextProp === "number") {
+ if (domElement.textContent !== "" + nextProp) {
+ if (true && !suppressHydrationWarning) {
+ warnForTextDifference(domElement.textContent, nextProp);
+ }
+ updatePayload = [CHILDREN, "" + nextProp];
+ }
+ }
+ } else if (registrationNameModules.hasOwnProperty(propKey)) {
+ if (nextProp != null) {
+ if (true && typeof nextProp !== "function") {
+ warnForInvalidEventListener(propKey, nextProp);
+ }
+ ensureListeningTo(rootContainerElement, propKey);
+ }
+ } else {
+ // Validate that the properties correspond to their expected values.
+ var serverValue;
+ var propertyInfo;
+ if (suppressHydrationWarning) {
+ // Don't bother comparing. We're ignoring all these warnings.
+ } else if (
+ propKey === SUPPRESS_CONTENT_EDITABLE_WARNING ||
+ propKey === SUPPRESS_HYDRATION_WARNING$1 ||
+ // Controlled attributes are not validated
+ // TODO: Only ignore them on controlled tags.
+ propKey === "value" ||
+ propKey === "checked" ||
+ propKey === "selected"
+ ) {
+ // Noop
+ } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {
+ var rawHtml = nextProp ? nextProp[HTML] || "" : "";
+ var serverHTML = domElement.innerHTML;
+ var expectedHTML = normalizeHTML(domElement, rawHtml);
+ if (expectedHTML !== serverHTML) {
+ warnForPropDifference(propKey, serverHTML, expectedHTML);
+ }
+ } else if (propKey === STYLE) {
+ // $FlowFixMe - Should be inferred as not undefined.
+ extraAttributeNames["delete"](propKey);
+ var expectedStyle = createDangerousStringForStyles(
+ nextProp
+ );
+ serverValue = domElement.getAttribute("style");
+ if (expectedStyle !== serverValue) {
+ warnForPropDifference(
+ propKey,
+ serverValue,
+ expectedStyle
+ );
+ }
+ } else if (isCustomComponentTag) {
+ // $FlowFixMe - Should be inferred as not undefined.
+ extraAttributeNames["delete"](propKey.toLowerCase());
+ serverValue = getValueForAttribute(
+ domElement,
+ propKey,
+ nextProp
+ );
+
+ if (nextProp !== serverValue) {
+ warnForPropDifference(propKey, serverValue, nextProp);
+ }
+ } else if (shouldSetAttribute(propKey, nextProp)) {
+ if ((propertyInfo = getPropertyInfo(propKey))) {
+ // $FlowFixMe - Should be inferred as not undefined.
+ extraAttributeNames["delete"](propertyInfo.attributeName);
+ serverValue = getValueForProperty(
+ domElement,
+ propKey,
+ nextProp
+ );
+ } else {
+ var ownNamespace = parentNamespace;
+ if (ownNamespace === HTML_NAMESPACE) {
+ ownNamespace = getIntrinsicNamespace(tag);
+ }
+ if (ownNamespace === HTML_NAMESPACE) {
+ // $FlowFixMe - Should be inferred as not undefined.
+ extraAttributeNames["delete"](propKey.toLowerCase());
+ } else {
+ // $FlowFixMe - Should be inferred as not undefined.
+ extraAttributeNames["delete"](propKey);
+ }
+ serverValue = getValueForAttribute(
+ domElement,
+ propKey,
+ nextProp
+ );
+ }
+
+ if (nextProp !== serverValue) {
+ warnForPropDifference(propKey, serverValue, nextProp);
+ }
+ }
+ }
+ }
+
+ {
+ // $FlowFixMe - Should be inferred as not undefined.
+ if (extraAttributeNames.size > 0 && !suppressHydrationWarning) {
+ // $FlowFixMe - Should be inferred as not undefined.
+ warnForExtraAttributes(extraAttributeNames);
+ }
+ }
+
+ switch (tag) {
+ case "input":
+ // TODO: Make sure we check if this is still unmounted or do any clean
+ // up necessary since we never stop tracking anymore.
+ track(domElement);
+ postMountWrapper(domElement, rawProps);
+ break;
+ case "textarea":
+ // TODO: Make sure we check if this is still unmounted or do any clean
+ // up necessary since we never stop tracking anymore.
+ track(domElement);
+ postMountWrapper$3(domElement, rawProps);
+ break;
+ case "select":
+ case "option":
+ // For input and textarea we current always set the value property at
+ // post mount to force it to diverge from attributes. However, for
+ // option and select we don't quite do the same thing and select
+ // is not resilient to the DOM state changing so we don't do that here.
+ // TODO: Consider not doing this for input and textarea.
+ break;
+ default:
+ if (typeof rawProps.onClick === "function") {
+ // TODO: This cast may not be sound for SVG, MathML or custom elements.
+ trapClickOnNonInteractiveElement(domElement);
+ }
+ break;
+ }
+
+ return updatePayload;
+ }
+
+ function diffHydratedText$1(textNode, text) {
+ var isDifferent = textNode.nodeValue !== text;
+ return isDifferent;
+ }
+
+ function warnForUnmatchedText$1(textNode, text) {
+ {
+ warnForTextDifference(textNode.nodeValue, text);
+ }
+ }
+
+ function warnForDeletedHydratableElement$1(parentNode, child) {
+ {
+ if (didWarnInvalidHydration) {
+ return;
+ }
+ didWarnInvalidHydration = true;
+ warning(
+ false,
+ "Did not expect server HTML to contain a <%s> in <%s>.",
+ child.nodeName.toLowerCase(),
+ parentNode.nodeName.toLowerCase()
+ );
+ }
+ }
+
+ function warnForDeletedHydratableText$1(parentNode, child) {
+ {
+ if (didWarnInvalidHydration) {
+ return;
+ }
+ didWarnInvalidHydration = true;
+ warning(
+ false,
+ 'Did not expect server HTML to contain the text node "%s" in <%s>.',
+ child.nodeValue,
+ parentNode.nodeName.toLowerCase()
+ );
+ }
+ }
+
+ function warnForInsertedHydratedElement$1(parentNode, tag, props) {
+ {
+ if (didWarnInvalidHydration) {
+ return;
+ }
+ didWarnInvalidHydration = true;
+ warning(
+ false,
+ "Expected server HTML to contain a matching <%s> in <%s>.",
+ tag,
+ parentNode.nodeName.toLowerCase()
+ );
+ }
+ }
+
+ function warnForInsertedHydratedText$1(parentNode, text) {
+ {
+ if (text === "") {
+ // We expect to insert empty text nodes since they're not represented in
+ // the HTML.
+ // TODO: Remove this special case if we can just avoid inserting empty
+ // text nodes.
+ return;
+ }
+ if (didWarnInvalidHydration) {
+ return;
+ }
+ didWarnInvalidHydration = true;
+ warning(
+ false,
+ 'Expected server HTML to contain a matching text node for "%s" in <%s>.',
+ text,
+ parentNode.nodeName.toLowerCase()
+ );
+ }
+ }
+
+ function restoreControlledState(domElement, tag, props) {
+ switch (tag) {
+ case "input":
+ restoreControlledState$1(domElement, props);
+ return;
+ case "textarea":
+ restoreControlledState$3(domElement, props);
+ return;
+ case "select":
+ restoreControlledState$2(domElement, props);
+ return;
+ }
+ }
+
+ var ReactDOMFiberComponent = Object.freeze({
+ createElement: createElement$1,
+ createTextNode: createTextNode$1,
+ setInitialProperties: setInitialProperties$1,
+ diffProperties: diffProperties$1,
+ updateProperties: updateProperties$1,
+ diffHydratedProperties: diffHydratedProperties$1,
+ diffHydratedText: diffHydratedText$1,
+ warnForUnmatchedText: warnForUnmatchedText$1,
+ warnForDeletedHydratableElement: warnForDeletedHydratableElement$1,
+ warnForDeletedHydratableText: warnForDeletedHydratableText$1,
+ warnForInsertedHydratedElement: warnForInsertedHydratedElement$1,
+ warnForInsertedHydratedText: warnForInsertedHydratedText$1,
+ restoreControlledState: restoreControlledState
+ });
+
+ // TODO: direct imports like some-package/src/* are bad. Fix me.
+ var getCurrentFiberStackAddendum$6 =
+ ReactDebugCurrentFiber.getCurrentFiberStackAddendum;
+
+ var validateDOMNesting = emptyFunction;
+
+ {
+ // This validation code was written based on the HTML5 parsing spec:
+ // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope
+ //
+ // Note: this does not catch all invalid nesting, nor does it try to (as it's
+ // not clear what practical benefit doing so provides); instead, we warn only
+ // for cases where the parser will give a parse tree differing from what React
+ // intended. For example, <b><div></div></b> is invalid but we don't warn
+ // because it still parses correctly; we do warn for other cases like nested
+ // <p> tags where the beginning of the second element implicitly closes the
+ // first, causing a confusing mess.
+
+ // https://html.spec.whatwg.org/multipage/syntax.html#special
+ var specialTags = [
+ "address",
+ "applet",
+ "area",
+ "article",
+ "aside",
+ "base",
+ "basefont",
+ "bgsound",
+ "blockquote",
+ "body",
+ "br",
+ "button",
+ "caption",
+ "center",
+ "col",
+ "colgroup",
+ "dd",
+ "details",
+ "dir",
+ "div",
+ "dl",
+ "dt",
+ "embed",
+ "fieldset",
+ "figcaption",
+ "figure",
+ "footer",
+ "form",
+ "frame",
+ "frameset",
+ "h1",
+ "h2",
+ "h3",
+ "h4",
+ "h5",
+ "h6",
+ "head",
+ "header",
+ "hgroup",
+ "hr",
+ "html",
+ "iframe",
+ "img",
+ "input",
+ "isindex",
+ "li",
+ "link",
+ "listing",
+ "main",
+ "marquee",
+ "menu",
+ "menuitem",
+ "meta",
+ "nav",
+ "noembed",
+ "noframes",
+ "noscript",
+ "object",
+ "ol",
+ "p",
+ "param",
+ "plaintext",
+ "pre",
+ "script",
+ "section",
+ "select",
+ "source",
+ "style",
+ "summary",
+ "table",
+ "tbody",
+ "td",
+ "template",
+ "textarea",
+ "tfoot",
+ "th",
+ "thead",
+ "title",
+ "tr",
+ "track",
+ "ul",
+ "wbr",
+ "xmp"
+ ];
+
+ // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope
+ var inScopeTags = [
+ "applet",
+ "caption",
+ "html",
+ "table",
+ "td",
+ "th",
+ "marquee",
+ "object",
+ "template",
+
+ // https://html.spec.whatwg.org/multipage/syntax.html#html-integration-point
+ // TODO: Distinguish by namespace here -- for <title>, including it here
+ // errs on the side of fewer warnings
+ "foreignObject",
+ "desc",
+ "title"
+ ];
+
+ // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-button-scope
+ var buttonScopeTags = inScopeTags.concat(["button"]);
+
+ // https://html.spec.whatwg.org/multipage/syntax.html#generate-implied-end-tags
+ var impliedEndTags = [
+ "dd",
+ "dt",
+ "li",
+ "option",
+ "optgroup",
+ "p",
+ "rp",
+ "rt"
+ ];
+
+ var emptyAncestorInfo = {
+ current: null,
+
+ formTag: null,
+ aTagInScope: null,
+ buttonTagInScope: null,
+ nobrTagInScope: null,
+ pTagInButtonScope: null,
+
+ listItemTagAutoclosing: null,
+ dlItemTagAutoclosing: null
+ };
+
+ var updatedAncestorInfo$1 = function(oldInfo, tag, instance) {
+ var ancestorInfo = _assign({}, oldInfo || emptyAncestorInfo);
+ var info = { tag: tag, instance: instance };
+
+ if (inScopeTags.indexOf(tag) !== -1) {
+ ancestorInfo.aTagInScope = null;
+ ancestorInfo.buttonTagInScope = null;
+ ancestorInfo.nobrTagInScope = null;
+ }
+ if (buttonScopeTags.indexOf(tag) !== -1) {
+ ancestorInfo.pTagInButtonScope = null;
+ }
+
+ // See rules for 'li', 'dd', 'dt' start tags in
+ // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody
+ if (
+ specialTags.indexOf(tag) !== -1 &&
+ tag !== "address" &&
+ tag !== "div" &&
+ tag !== "p"
+ ) {
+ ancestorInfo.listItemTagAutoclosing = null;
+ ancestorInfo.dlItemTagAutoclosing = null;
+ }
+
+ ancestorInfo.current = info;
+
+ if (tag === "form") {
+ ancestorInfo.formTag = info;
+ }
+ if (tag === "a") {
+ ancestorInfo.aTagInScope = info;
+ }
+ if (tag === "button") {
+ ancestorInfo.buttonTagInScope = info;
+ }
+ if (tag === "nobr") {
+ ancestorInfo.nobrTagInScope = info;
+ }
+ if (tag === "p") {
+ ancestorInfo.pTagInButtonScope = info;
+ }
+ if (tag === "li") {
+ ancestorInfo.listItemTagAutoclosing = info;
+ }
+ if (tag === "dd" || tag === "dt") {
+ ancestorInfo.dlItemTagAutoclosing = info;
+ }
+
+ return ancestorInfo;
+ };
+
+ /**
+ * Returns whether
+ */
+ var isTagValidWithParent = function(tag, parentTag) {
+ // First, let's check if we're in an unusual parsing mode...
+ switch (parentTag) {
+ // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inselect
+ case "select":
+ return (
+ tag === "option" || tag === "optgroup" || tag === "#text"
+ );
+ case "optgroup":
+ return tag === "option" || tag === "#text";
+ // Strictly speaking, seeing an <option> doesn't mean we're in a <select>
+ // but
+ case "option":
+ return tag === "#text";
+ // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intd
+ // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incaption
+ // No special behavior since these rules fall back to "in body" mode for
+ // all except special table nodes which cause bad parsing behavior anyway.
+
+ // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intr
+ case "tr":
+ return (
+ tag === "th" ||
+ tag === "td" ||
+ tag === "style" ||
+ tag === "script" ||
+ tag === "template"
+ );
+ // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intbody
+ case "tbody":
+ case "thead":
+ case "tfoot":
+ return (
+ tag === "tr" ||
+ tag === "style" ||
+ tag === "script" ||
+ tag === "template"
+ );
+ // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incolgroup
+ case "colgroup":
+ return tag === "col" || tag === "template";
+ // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intable
+ case "table":
+ return (
+ tag === "caption" ||
+ tag === "colgroup" ||
+ tag === "tbody" ||
+ tag === "tfoot" ||
+ tag === "thead" ||
+ tag === "style" ||
+ tag === "script" ||
+ tag === "template"
+ );
+ // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inhead
+ case "head":
+ return (
+ tag === "base" ||
+ tag === "basefont" ||
+ tag === "bgsound" ||
+ tag === "link" ||
+ tag === "meta" ||
+ tag === "title" ||
+ tag === "noscript" ||
+ tag === "noframes" ||
+ tag === "style" ||
+ tag === "script" ||
+ tag === "template"
+ );
+ // https://html.spec.whatwg.org/multipage/semantics.html#the-html-element
+ case "html":
+ return tag === "head" || tag === "body";
+ case "#document":
+ return tag === "html";
+ }
+
+ // Probably in the "in body" parsing mode, so we outlaw only tag combos
+ // where the parsing rules cause implicit opens or closes to be added.
+ // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody
+ switch (tag) {
+ case "h1":
+ case "h2":
+ case "h3":
+ case "h4":
+ case "h5":
+ case "h6":
+ return (
+ parentTag !== "h1" &&
+ parentTag !== "h2" &&
+ parentTag !== "h3" &&
+ parentTag !== "h4" &&
+ parentTag !== "h5" &&
+ parentTag !== "h6"
+ );
+
+ case "rp":
+ case "rt":
+ return impliedEndTags.indexOf(parentTag) === -1;
+
+ case "body":
+ case "caption":
+ case "col":
+ case "colgroup":
+ case "frame":
+ case "head":
+ case "html":
+ case "tbody":
+ case "td":
+ case "tfoot":
+ case "th":
+ case "thead":
+ case "tr":
+ // These tags are only valid with a few parents that have special child
+ // parsing rules -- if we're down here, then none of those matched and
+ // so we allow it only if we don't know what the parent is, as all other
+ // cases are invalid.
+ return parentTag == null;
+ }
+
+ return true;
+ };
+
+ /**
+ * Returns whether
+ */
+ var findInvalidAncestorForTag = function(tag, ancestorInfo) {
+ switch (tag) {
+ case "address":
+ case "article":
+ case "aside":
+ case "blockquote":
+ case "center":
+ case "details":
+ case "dialog":
+ case "dir":
+ case "div":
+ case "dl":
+ case "fieldset":
+ case "figcaption":
+ case "figure":
+ case "footer":
+ case "header":
+ case "hgroup":
+ case "main":
+ case "menu":
+ case "nav":
+ case "ol":
+ case "p":
+ case "section":
+ case "summary":
+ case "ul":
+ case "pre":
+ case "listing":
+ case "table":
+ case "hr":
+ case "xmp":
+ case "h1":
+ case "h2":
+ case "h3":
+ case "h4":
+ case "h5":
+ case "h6":
+ return ancestorInfo.pTagInButtonScope;
+
+ case "form":
+ return (
+ ancestorInfo.formTag || ancestorInfo.pTagInButtonScope
+ );
+
+ case "li":
+ return ancestorInfo.listItemTagAutoclosing;
+
+ case "dd":
+ case "dt":
+ return ancestorInfo.dlItemTagAutoclosing;
+
+ case "button":
+ return ancestorInfo.buttonTagInScope;
+
+ case "a":
+ // Spec says something about storing a list of markers, but it sounds
+ // equivalent to this check.
+ return ancestorInfo.aTagInScope;
+
+ case "nobr":
+ return ancestorInfo.nobrTagInScope;
+ }
+
+ return null;
+ };
+
+ var didWarn = {};
+
+ validateDOMNesting = function(childTag, childText, ancestorInfo) {
+ ancestorInfo = ancestorInfo || emptyAncestorInfo;
+ var parentInfo = ancestorInfo.current;
+ var parentTag = parentInfo && parentInfo.tag;
+
+ if (childText != null) {
+ warning(
+ childTag == null,
+ "validateDOMNesting: when childText is passed, childTag should be null"
+ );
+ childTag = "#text";
+ }
+
+ var invalidParent = isTagValidWithParent(childTag, parentTag)
+ ? null
+ : parentInfo;
+ var invalidAncestor = invalidParent
+ ? null
+ : findInvalidAncestorForTag(childTag, ancestorInfo);
+ var invalidParentOrAncestor = invalidParent || invalidAncestor;
+ if (!invalidParentOrAncestor) {
+ return;
+ }
+
+ var ancestorTag = invalidParentOrAncestor.tag;
+ var addendum = getCurrentFiberStackAddendum$6();
+
+ var warnKey =
+ !!invalidParent +
+ "|" +
+ childTag +
+ "|" +
+ ancestorTag +
+ "|" +
+ addendum;
+ if (didWarn[warnKey]) {
+ return;
+ }
+ didWarn[warnKey] = true;
+
+ var tagDisplayName = childTag;
+ var whitespaceInfo = "";
+ if (childTag === "#text") {
+ if (/\S/.test(childText)) {
+ tagDisplayName = "Text nodes";
+ } else {
+ tagDisplayName = "Whitespace text nodes";
+ whitespaceInfo =
+ " Make sure you don't have any extra whitespace between tags on " +
+ "each line of your source code.";
+ }
+ } else {
+ tagDisplayName = "<" + childTag + ">";
+ }
+
+ if (invalidParent) {
+ var info = "";
+ if (ancestorTag === "table" && childTag === "tr") {
+ info +=
+ " Add a <tbody> to your code to match the DOM tree generated by " +
+ "the browser.";
+ }
+ warning(
+ false,
+ "validateDOMNesting(...): %s cannot appear as a child of <%s>.%s%s%s",
+ tagDisplayName,
+ ancestorTag,
+ whitespaceInfo,
+ info,
+ addendum
+ );
+ } else {
+ warning(
+ false,
+ "validateDOMNesting(...): %s cannot appear as a descendant of " +
+ "<%s>.%s",
+ tagDisplayName,
+ ancestorTag,
+ addendum
+ );
+ }
+ };
+
+ // TODO: turn this into a named export
+ validateDOMNesting.updatedAncestorInfo = updatedAncestorInfo$1;
+
+ // For testing
+ validateDOMNesting.isTagValidInContext = function(
+ tag,
+ ancestorInfo
+ ) {
+ ancestorInfo = ancestorInfo || emptyAncestorInfo;
+ var parentInfo = ancestorInfo.current;
+ var parentTag = parentInfo && parentInfo.tag;
+ return (
+ isTagValidWithParent(tag, parentTag) &&
+ !findInvalidAncestorForTag(tag, ancestorInfo)
+ );
+ };
+ }
+
+ var validateDOMNesting$1 = validateDOMNesting;
+
+ // TODO: direct imports like some-package/src/* are bad. Fix me.
+ var createElement = createElement$1;
+ var createTextNode = createTextNode$1;
+ var setInitialProperties = setInitialProperties$1;
+ var diffProperties = diffProperties$1;
+ var updateProperties = updateProperties$1;
+ var diffHydratedProperties = diffHydratedProperties$1;
+ var diffHydratedText = diffHydratedText$1;
+ var warnForUnmatchedText = warnForUnmatchedText$1;
+ var warnForDeletedHydratableElement = warnForDeletedHydratableElement$1;
+ var warnForDeletedHydratableText = warnForDeletedHydratableText$1;
+ var warnForInsertedHydratedElement = warnForInsertedHydratedElement$1;
+ var warnForInsertedHydratedText = warnForInsertedHydratedText$1;
+ var updatedAncestorInfo = validateDOMNesting$1.updatedAncestorInfo;
+ var precacheFiberNode = precacheFiberNode$1;
+ var updateFiberProps = updateFiberProps$1;
+
+ {
+ var SUPPRESS_HYDRATION_WARNING = "suppressHydrationWarning";
+ if (
+ typeof Map !== "function" ||
+ Map.prototype == null ||
+ typeof Map.prototype.forEach !== "function" ||
+ typeof Set !== "function" ||
+ Set.prototype == null ||
+ typeof Set.prototype.clear !== "function" ||
+ typeof Set.prototype.forEach !== "function"
+ ) {
+ warning(
+ false,
+ "React depends on Map and Set built-in types. Make sure that you load a " +
+ "polyfill in older browsers. http://fb.me/react-polyfills"
+ );
+ }
+ }
+
+ injection$3.injectFiberControlledHostComponent(
+ ReactDOMFiberComponent
+ );
+
+ var eventsEnabled = null;
+ var selectionInformation = null;
+
+ /**
+ * True if the supplied DOM node is a valid node element.
+ *
+ * @param {?DOMElement} node The candidate DOM node.
+ * @return {boolean} True if the DOM is a valid DOM node.
+ * @internal
+ */
+ function isValidContainer(node) {
+ return !!(
+ node &&
+ (node.nodeType === ELEMENT_NODE ||
+ node.nodeType === DOCUMENT_NODE ||
+ node.nodeType === DOCUMENT_FRAGMENT_NODE ||
+ (node.nodeType === COMMENT_NODE &&
+ node.nodeValue === " react-mount-point-unstable "))
+ );
+ }
+
+ function getReactRootElementInContainer(container) {
+ if (!container) {
+ return null;
+ }
+
+ if (container.nodeType === DOCUMENT_NODE) {
+ return container.documentElement;
+ } else {
+ return container.firstChild;
+ }
+ }
+
+ function shouldHydrateDueToLegacyHeuristic(container) {
+ var rootElement = getReactRootElementInContainer(container);
+ return !!(
+ rootElement &&
+ rootElement.nodeType === ELEMENT_NODE &&
+ rootElement.hasAttribute(ROOT_ATTRIBUTE_NAME)
+ );
+ }
+
+ function shouldAutoFocusHostComponent(type, props) {
+ switch (type) {
+ case "button":
+ case "input":
+ case "select":
+ case "textarea":
+ return !!props.autoFocus;
+ }
+ return false;
+ }
+
+ var DOMRenderer = reactReconciler({
+ getRootHostContext: function(rootContainerInstance) {
+ var type = void 0;
+ var namespace = void 0;
+ var nodeType = rootContainerInstance.nodeType;
+ switch (nodeType) {
+ case DOCUMENT_NODE:
+ case DOCUMENT_FRAGMENT_NODE: {
+ type =
+ nodeType === DOCUMENT_NODE ? "#document" : "#fragment";
+ var root = rootContainerInstance.documentElement;
+ namespace = root
+ ? root.namespaceURI
+ : getChildNamespace(null, "");
+ break;
+ }
+ default: {
+ var container =
+ nodeType === COMMENT_NODE
+ ? rootContainerInstance.parentNode
+ : rootContainerInstance;
+ var ownNamespace = container.namespaceURI || null;
+ type = container.tagName;
+ namespace = getChildNamespace(ownNamespace, type);
+ break;
+ }
+ }
+ {
+ var validatedTag = type.toLowerCase();
+ var _ancestorInfo = updatedAncestorInfo(
+ null,
+ validatedTag,
+ null
+ );
+ return { namespace: namespace, ancestorInfo: _ancestorInfo };
+ }
+ return namespace;
+ },
+ getChildHostContext: function(parentHostContext, type) {
+ {
+ var parentHostContextDev = parentHostContext;
+ var _namespace = getChildNamespace(
+ parentHostContextDev.namespace,
+ type
+ );
+ var _ancestorInfo2 = updatedAncestorInfo(
+ parentHostContextDev.ancestorInfo,
+ type,
+ null
+ );
+ return {
+ namespace: _namespace,
+ ancestorInfo: _ancestorInfo2
+ };
+ }
+ var parentNamespace = parentHostContext;
+ return getChildNamespace(parentNamespace, type);
+ },
+ getPublicInstance: function(instance) {
+ return instance;
+ },
+ prepareForCommit: function() {
+ eventsEnabled = isEnabled();
+ selectionInformation = getSelectionInformation();
+ setEnabled(false);
+ },
+ resetAfterCommit: function() {
+ restoreSelection(selectionInformation);
+ selectionInformation = null;
+ setEnabled(eventsEnabled);
+ eventsEnabled = null;
+ },
+ createInstance: function(
+ type,
+ props,
+ rootContainerInstance,
+ hostContext,
+ internalInstanceHandle
+ ) {
+ var parentNamespace = void 0;
+ {
+ // TODO: take namespace into account when validating.
+ var hostContextDev = hostContext;
+ validateDOMNesting$1(type, null, hostContextDev.ancestorInfo);
+ if (
+ typeof props.children === "string" ||
+ typeof props.children === "number"
+ ) {
+ var string = "" + props.children;
+ var ownAncestorInfo = updatedAncestorInfo(
+ hostContextDev.ancestorInfo,
+ type,
+ null
+ );
+ validateDOMNesting$1(null, string, ownAncestorInfo);
+ }
+ parentNamespace = hostContextDev.namespace;
+ }
+ var domElement = createElement(
+ type,
+ props,
+ rootContainerInstance,
+ parentNamespace
+ );
+ precacheFiberNode(internalInstanceHandle, domElement);
+ updateFiberProps(domElement, props);
+ return domElement;
+ },
+ appendInitialChild: function(parentInstance, child) {
+ parentInstance.appendChild(child);
+ },
+ finalizeInitialChildren: function(
+ domElement,
+ type,
+ props,
+ rootContainerInstance
+ ) {
+ setInitialProperties(
+ domElement,
+ type,
+ props,
+ rootContainerInstance
+ );
+ return shouldAutoFocusHostComponent(type, props);
+ },
+ prepareUpdate: function(
+ domElement,
+ type,
+ oldProps,
+ newProps,
+ rootContainerInstance,
+ hostContext
+ ) {
+ {
+ var hostContextDev = hostContext;
+ if (
+ typeof newProps.children !== typeof oldProps.children &&
+ (typeof newProps.children === "string" ||
+ typeof newProps.children === "number")
+ ) {
+ var string = "" + newProps.children;
+ var ownAncestorInfo = updatedAncestorInfo(
+ hostContextDev.ancestorInfo,
+ type,
+ null
+ );
+ validateDOMNesting$1(null, string, ownAncestorInfo);
+ }
+ }
+ return diffProperties(
+ domElement,
+ type,
+ oldProps,
+ newProps,
+ rootContainerInstance
+ );
+ },
+ shouldSetTextContent: function(type, props) {
+ return (
+ type === "textarea" ||
+ typeof props.children === "string" ||
+ typeof props.children === "number" ||
+ (typeof props.dangerouslySetInnerHTML === "object" &&
+ props.dangerouslySetInnerHTML !== null &&
+ typeof props.dangerouslySetInnerHTML.__html === "string")
+ );
+ },
+ shouldDeprioritizeSubtree: function(type, props) {
+ return !!props.hidden;
+ },
+ createTextInstance: function(
+ text,
+ rootContainerInstance,
+ hostContext,
+ internalInstanceHandle
+ ) {
+ {
+ var hostContextDev = hostContext;
+ validateDOMNesting$1(null, text, hostContextDev.ancestorInfo);
+ }
+ var textNode = createTextNode(text, rootContainerInstance);
+ precacheFiberNode(internalInstanceHandle, textNode);
+ return textNode;
+ },
+
+ now: now,
+
+ mutation: {
+ commitMount: function(
+ domElement,
+ type,
+ newProps,
+ internalInstanceHandle
+ ) {
+ domElement.focus();
+ },
+ commitUpdate: function(
+ domElement,
+ updatePayload,
+ type,
+ oldProps,
+ newProps,
+ internalInstanceHandle
+ ) {
+ // Update the props handle so that we know which props are the ones with
+ // with current event handlers.
+ updateFiberProps(domElement, newProps);
+ // Apply the diff to the DOM node.
+ updateProperties(
+ domElement,
+ updatePayload,
+ type,
+ oldProps,
+ newProps
+ );
+ },
+ resetTextContent: function(domElement) {
+ domElement.textContent = "";
+ },
+ commitTextUpdate: function(textInstance, oldText, newText) {
+ textInstance.nodeValue = newText;
+ },
+ appendChild: function(parentInstance, child) {
+ parentInstance.appendChild(child);
+ },
+ appendChildToContainer: function(container, child) {
+ if (container.nodeType === COMMENT_NODE) {
+ container.parentNode.insertBefore(child, container);
+ } else {
+ container.appendChild(child);
+ }
+ },
+ insertBefore: function(parentInstance, child, beforeChild) {
+ parentInstance.insertBefore(child, beforeChild);
+ },
+ insertInContainerBefore: function(
+ container,
+ child,
+ beforeChild
+ ) {
+ if (container.nodeType === COMMENT_NODE) {
+ container.parentNode.insertBefore(child, beforeChild);
+ } else {
+ container.insertBefore(child, beforeChild);
+ }
+ },
+ removeChild: function(parentInstance, child) {
+ parentInstance.removeChild(child);
+ },
+ removeChildFromContainer: function(container, child) {
+ if (container.nodeType === COMMENT_NODE) {
+ container.parentNode.removeChild(child);
+ } else {
+ container.removeChild(child);
+ }
+ }
+ },
+
+ hydration: {
+ canHydrateInstance: function(instance, type, props) {
+ if (
+ instance.nodeType !== ELEMENT_NODE ||
+ type.toLowerCase() !== instance.nodeName.toLowerCase()
+ ) {
+ return null;
+ }
+ // This has now been refined to an element node.
+ return instance;
+ },
+ canHydrateTextInstance: function(instance, text) {
+ if (text === "" || instance.nodeType !== TEXT_NODE) {
+ // Empty strings are not parsed by HTML so there won't be a correct match here.
+ return null;
+ }
+ // This has now been refined to a text node.
+ return instance;
+ },
+ getNextHydratableSibling: function(instance) {
+ var node = instance.nextSibling;
+ // Skip non-hydratable nodes.
+ while (
+ node &&
+ node.nodeType !== ELEMENT_NODE &&
+ node.nodeType !== TEXT_NODE
+ ) {
+ node = node.nextSibling;
+ }
+ return node;
+ },
+ getFirstHydratableChild: function(parentInstance) {
+ var next = parentInstance.firstChild;
+ // Skip non-hydratable nodes.
+ while (
+ next &&
+ next.nodeType !== ELEMENT_NODE &&
+ next.nodeType !== TEXT_NODE
+ ) {
+ next = next.nextSibling;
+ }
+ return next;
+ },
+ hydrateInstance: function(
+ instance,
+ type,
+ props,
+ rootContainerInstance,
+ hostContext,
+ internalInstanceHandle
+ ) {
+ precacheFiberNode(internalInstanceHandle, instance);
+ // TODO: Possibly defer this until the commit phase where all the events
+ // get attached.
+ updateFiberProps(instance, props);
+ var parentNamespace = void 0;
+ {
+ var hostContextDev = hostContext;
+ parentNamespace = hostContextDev.namespace;
+ }
+ return diffHydratedProperties(
+ instance,
+ type,
+ props,
+ parentNamespace,
+ rootContainerInstance
+ );
+ },
+ hydrateTextInstance: function(
+ textInstance,
+ text,
+ internalInstanceHandle
+ ) {
+ precacheFiberNode(internalInstanceHandle, textInstance);
+ return diffHydratedText(textInstance, text);
+ },
+ didNotMatchHydratedContainerTextInstance: function(
+ parentContainer,
+ textInstance,
+ text
+ ) {
+ {
+ warnForUnmatchedText(textInstance, text);
+ }
+ },
+ didNotMatchHydratedTextInstance: function(
+ parentType,
+ parentProps,
+ parentInstance,
+ textInstance,
+ text
+ ) {
+ if (
+ true &&
+ parentProps[SUPPRESS_HYDRATION_WARNING] !== true
+ ) {
+ warnForUnmatchedText(textInstance, text);
+ }
+ },
+ didNotHydrateContainerInstance: function(
+ parentContainer,
+ instance
+ ) {
+ {
+ if (instance.nodeType === 1) {
+ warnForDeletedHydratableElement(
+ parentContainer,
+ instance
+ );
+ } else {
+ warnForDeletedHydratableText(parentContainer, instance);
+ }
+ }
+ },
+ didNotHydrateInstance: function(
+ parentType,
+ parentProps,
+ parentInstance,
+ instance
+ ) {
+ if (
+ true &&
+ parentProps[SUPPRESS_HYDRATION_WARNING] !== true
+ ) {
+ if (instance.nodeType === 1) {
+ warnForDeletedHydratableElement(parentInstance, instance);
+ } else {
+ warnForDeletedHydratableText(parentInstance, instance);
+ }
+ }
+ },
+ didNotFindHydratableContainerInstance: function(
+ parentContainer,
+ type,
+ props
+ ) {
+ {
+ warnForInsertedHydratedElement(
+ parentContainer,
+ type,
+ props
+ );
+ }
+ },
+ didNotFindHydratableContainerTextInstance: function(
+ parentContainer,
+ text
+ ) {
+ {
+ warnForInsertedHydratedText(parentContainer, text);
+ }
+ },
+ didNotFindHydratableInstance: function(
+ parentType,
+ parentProps,
+ parentInstance,
+ type,
+ props
+ ) {
+ if (
+ true &&
+ parentProps[SUPPRESS_HYDRATION_WARNING] !== true
+ ) {
+ warnForInsertedHydratedElement(parentInstance, type, props);
+ }
+ },
+ didNotFindHydratableTextInstance: function(
+ parentType,
+ parentProps,
+ parentInstance,
+ text
+ ) {
+ if (
+ true &&
+ parentProps[SUPPRESS_HYDRATION_WARNING] !== true
+ ) {
+ warnForInsertedHydratedText(parentInstance, text);
+ }
+ }
+ },
+
+ scheduleDeferredCallback: rIC,
+ cancelDeferredCallback: cIC,
+
+ useSyncScheduling: !enableAsyncSchedulingByDefaultInReactDOM
+ });
+
+ injection$4.injectFiberBatchedUpdates(DOMRenderer.batchedUpdates);
+
+ var warnedAboutHydrateAPI = false;
+
+ function renderSubtreeIntoContainer(
+ parentComponent,
+ children,
+ container,
+ forceHydrate,
+ callback
+ ) {
+ !isValidContainer(container)
+ ? invariant(false, "Target container is not a DOM element.")
+ : void 0;
+
+ {
+ if (
+ container._reactRootContainer &&
+ container.nodeType !== COMMENT_NODE
+ ) {
+ var hostInstance = DOMRenderer.findHostInstanceWithNoPortals(
+ container._reactRootContainer.current
+ );
+ if (hostInstance) {
+ warning(
+ hostInstance.parentNode === container,
+ "render(...): It looks like the React-rendered content of this " +
+ "container was removed without using React. This is not " +
+ "supported and will cause errors. Instead, call " +
+ "ReactDOM.unmountComponentAtNode to empty a container."
+ );
+ }
+ }
+
+ var isRootRenderedBySomeReact = !!container._reactRootContainer;
+ var rootEl = getReactRootElementInContainer(container);
+ var hasNonRootReactChild = !!(
+ rootEl && getInstanceFromNode$1(rootEl)
+ );
+
+ warning(
+ !hasNonRootReactChild || isRootRenderedBySomeReact,
+ "render(...): Replacing React-rendered children with a new root " +
+ "component. If you intended to update the children of this node, " +
+ "you should instead have the existing children update their state " +
+ "and render the new components instead of calling ReactDOM.render."
+ );
+
+ warning(
+ container.nodeType !== ELEMENT_NODE ||
+ !container.tagName ||
+ container.tagName.toUpperCase() !== "BODY",
+ "render(): Rendering components directly into document.body is " +
+ "discouraged, since its children are often manipulated by third-party " +
+ "scripts and browser extensions. This may lead to subtle " +
+ "reconciliation issues. Try rendering into a container element created " +
+ "for your app."
+ );
+ }
+
+ var root = container._reactRootContainer;
+ if (!root) {
+ var shouldHydrate =
+ forceHydrate || shouldHydrateDueToLegacyHeuristic(container);
+ // First clear any existing content.
+ if (!shouldHydrate) {
+ var warned = false;
+ var rootSibling = void 0;
+ while ((rootSibling = container.lastChild)) {
+ {
+ if (
+ !warned &&
+ rootSibling.nodeType === ELEMENT_NODE &&
+ rootSibling.hasAttribute(ROOT_ATTRIBUTE_NAME)
+ ) {
+ warned = true;
+ warning(
+ false,
+ "render(): Target node has markup rendered by React, but there " +
+ "are unrelated nodes as well. This is most commonly caused by " +
+ "white-space inserted around server-rendered markup."
+ );
+ }
+ }
+ container.removeChild(rootSibling);
+ }
+ }
+ {
+ if (
+ shouldHydrate &&
+ !forceHydrate &&
+ !warnedAboutHydrateAPI
+ ) {
+ warnedAboutHydrateAPI = true;
+ lowPriorityWarning$1(
+ false,
+ "render(): Calling ReactDOM.render() to hydrate server-rendered markup " +
+ "will stop working in React v17. Replace the ReactDOM.render() call " +
+ "with ReactDOM.hydrate() if you want React to attach to the server HTML."
+ );
+ }
+ }
+ var newRoot = DOMRenderer.createContainer(
+ container,
+ shouldHydrate
+ );
+ root = container._reactRootContainer = newRoot;
+ // Initial mount should not be batched.
+ DOMRenderer.unbatchedUpdates(function() {
+ DOMRenderer.updateContainer(
+ children,
+ newRoot,
+ parentComponent,
+ callback
+ );
+ });
+ } else {
+ DOMRenderer.updateContainer(
+ children,
+ root,
+ parentComponent,
+ callback
+ );
+ }
+ return DOMRenderer.getPublicRootInstance(root);
+ }
+
+ function createPortal(children, container) {
+ var key =
+ arguments.length > 2 && arguments[2] !== undefined
+ ? arguments[2]
+ : null;
+
+ !isValidContainer(container)
+ ? invariant(false, "Target container is not a DOM element.")
+ : void 0;
+ // TODO: pass ReactDOM portal implementation as third argument
+ return createPortal$1(children, container, null, key);
+ }
+
+ function ReactRoot(container, hydrate) {
+ var root = DOMRenderer.createContainer(container, hydrate);
+ this._reactRootContainer = root;
+ }
+ ReactRoot.prototype.render = function(children, callback) {
+ var root = this._reactRootContainer;
+ DOMRenderer.updateContainer(children, root, null, callback);
+ };
+ ReactRoot.prototype.unmount = function(callback) {
+ var root = this._reactRootContainer;
+ DOMRenderer.updateContainer(null, root, null, callback);
+ };
+
+ var ReactDOM = {
+ createPortal: createPortal,
+
+ findDOMNode: function(componentOrElement) {
+ {
+ var owner = ReactCurrentOwner.current;
+ if (owner !== null) {
+ var warnedAboutRefsInRender =
+ owner.stateNode._warnedAboutRefsInRender;
+ warning(
+ warnedAboutRefsInRender,
+ "%s is accessing findDOMNode inside its render(). " +
+ "render() should be a pure function of props and state. It should " +
+ "never access something that requires stale data from the previous " +
+ "render, such as refs. Move this logic to componentDidMount and " +
+ "componentDidUpdate instead.",
+ getComponentName(owner) || "A component"
+ );
+ owner.stateNode._warnedAboutRefsInRender = true;
+ }
+ }
+ if (componentOrElement == null) {
+ return null;
+ }
+ if (componentOrElement.nodeType === ELEMENT_NODE) {
+ return componentOrElement;
+ }
+
+ var inst = get(componentOrElement);
+ if (inst) {
+ return DOMRenderer.findHostInstance(inst);
+ }
+
+ if (typeof componentOrElement.render === "function") {
+ invariant(
+ false,
+ "Unable to find node on an unmounted component."
+ );
+ } else {
+ invariant(
+ false,
+ "Element appears to be neither ReactComponent nor DOMNode. Keys: %s",
+ Object.keys(componentOrElement)
+ );
+ }
+ },
+ hydrate: function(element, container, callback) {
+ // TODO: throw or warn if we couldn't hydrate?
+ return renderSubtreeIntoContainer(
+ null,
+ element,
+ container,
+ true,
+ callback
+ );
+ },
+ render: function(element, container, callback) {
+ return renderSubtreeIntoContainer(
+ null,
+ element,
+ container,
+ false,
+ callback
+ );
+ },
+ unstable_renderSubtreeIntoContainer: function(
+ parentComponent,
+ element,
+ containerNode,
+ callback
+ ) {
+ !(parentComponent != null && has(parentComponent))
+ ? invariant(
+ false,
+ "parentComponent must be a valid React Component"
+ )
+ : void 0;
+ return renderSubtreeIntoContainer(
+ parentComponent,
+ element,
+ containerNode,
+ false,
+ callback
+ );
+ },
+ unmountComponentAtNode: function(container) {
+ !isValidContainer(container)
+ ? invariant(
+ false,
+ "unmountComponentAtNode(...): Target container is not a DOM element."
+ )
+ : void 0;
+
+ if (container._reactRootContainer) {
+ {
+ var rootEl = getReactRootElementInContainer(container);
+ var renderedByDifferentReact =
+ rootEl && !getInstanceFromNode$1(rootEl);
+ warning(
+ !renderedByDifferentReact,
+ "unmountComponentAtNode(): The node you're attempting to unmount " +
+ "was rendered by another copy of React."
+ );
+ }
+
+ // Unmount should not be batched.
+ DOMRenderer.unbatchedUpdates(function() {
+ renderSubtreeIntoContainer(
+ null,
+ null,
+ container,
+ false,
+ function() {
+ container._reactRootContainer = null;
+ }
+ );
+ });
+ // If you call unmountComponentAtNode twice in quick succession, you'll
+ // get `true` twice. That's probably fine?
+ return true;
+ } else {
+ {
+ var _rootEl = getReactRootElementInContainer(container);
+ var hasNonRootReactChild = !!(
+ _rootEl && getInstanceFromNode$1(_rootEl)
+ );
+
+ // Check if the container itself is a React root node.
+ var isContainerReactRoot =
+ container.nodeType === 1 &&
+ isValidContainer(container.parentNode) &&
+ !!container.parentNode._reactRootContainer;
+
+ warning(
+ !hasNonRootReactChild,
+ "unmountComponentAtNode(): The node you're attempting to unmount " +
+ "was rendered by React and is not a top-level container. %s",
+ isContainerReactRoot
+ ? "You may have accidentally passed in a React root node instead " +
+ "of its container."
+ : "Instead, have the parent component update its state and " +
+ "rerender in order to remove this component."
+ );
+ }
+
+ return false;
+ }
+ },
+
+ // Temporary alias since we already shipped React 16 RC with it.
+ // TODO: remove in React 17.
+ unstable_createPortal: createPortal,
+
+ unstable_batchedUpdates: batchedUpdates,
+
+ unstable_deferredUpdates: DOMRenderer.deferredUpdates,
+
+ flushSync: DOMRenderer.flushSync,
+
+ __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: {
+ // For TapEventPlugin which is popular in open source
+ EventPluginHub: EventPluginHub,
+ // Used by test-utils
+ EventPluginRegistry: EventPluginRegistry,
+ EventPropagators: EventPropagators,
+ ReactControlledComponent: ReactControlledComponent,
+ ReactDOMComponentTree: ReactDOMComponentTree,
+ ReactDOMEventListener: ReactDOMEventListener
+ }
+ };
+
+ if (enableCreateRoot) {
+ ReactDOM.createRoot = function createRoot(container, options) {
+ var hydrate = options != null && options.hydrate === true;
+ return new ReactRoot(container, hydrate);
+ };
+ }
+
+ var foundDevTools = DOMRenderer.injectIntoDevTools({
+ findFiberByHostInstance: getClosestInstanceFromNode,
+ bundleType: 1,
+ version: ReactVersion,
+ rendererPackageName: "react-dom"
+ });
+
+ {
+ if (
+ !foundDevTools &&
+ ExecutionEnvironment.canUseDOM &&
+ window.top === window.self
+ ) {
+ // If we're in Chrome or Firefox, provide a download link if not installed.
+ if (
+ (navigator.userAgent.indexOf("Chrome") > -1 &&
+ navigator.userAgent.indexOf("Edge") === -1) ||
+ navigator.userAgent.indexOf("Firefox") > -1
+ ) {
+ var protocol = window.location.protocol;
+ // Don't warn in exotic cases like chrome-extension://.
+ if (/^(https?|file):$/.test(protocol)) {
+ console.info(
+ "%cDownload the React DevTools " +
+ "for a better development experience: " +
+ "https://fb.me/react-devtools" +
+ (protocol === "file:"
+ ? "\nYou might need to use a local HTTP server (instead of file://): " +
+ "https://fb.me/react-devtools-faq"
+ : ""),
+ "font-weight:bold"
+ );
+ }
+ }
+ }
+ }
+
+ var ReactDOM$2 = Object.freeze({
+ default: ReactDOM
+ });
+
+ var ReactDOM$3 = (ReactDOM$2 && ReactDOM) || ReactDOM$2;
+
+ // TODO: decide on the top-level export form.
+ // This is hacky but makes it work with both Rollup and Jest.
+ var reactDom = ReactDOM$3["default"]
+ ? ReactDOM$3["default"]
+ : ReactDOM$3;
+
+ module.exports = reactDom;
+ })();
+ }
+
+ /***/
+ },
+
+ /***/ "./node_modules/react-dom/index.js":
+ /*!*****************************************!*\
+ !*** ./node_modules/react-dom/index.js ***!
+ \*****************************************/
+ /*! dynamic exports provided */
+ /*! exports used: default */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ function checkDCE() {
+ /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */
+ if (
+ typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === "undefined" ||
+ typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== "function"
+ ) {
+ return;
+ }
+ if (true) {
+ // This branch is unreachable because this function is only called
+ // in production, but the condition is true only in development.
+ // Therefore if the branch is still here, dead code elimination wasn't
+ // properly applied.
+ // Don't change the message. React DevTools relies on it. Also make sure
+ // this message doesn't occur elsewhere in this function, or it will cause
+ // a false positive.
+ throw new Error("^_^");
+ }
+ try {
+ // Verify that the code above has been dead code eliminated (DCE'd).
+ __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);
+ } catch (err) {
+ // DevTools shouldn't crash React, no matter what.
+ // We should still report in case we break this code.
+ console.error(err);
+ }
+ }
+
+ if (false) {
+ // DCE check should happen before ReactDOM bundle executes so that
+ // DevTools can report bad minification during injection.
+ checkDCE();
+ module.exports = require("./cjs/react-dom.production.min.js");
+ } else {
+ module.exports = __webpack_require__(
+ /*! ./cjs/react-dom.development.js */ "./node_modules/react-dom/cjs/react-dom.development.js"
+ );
+ }
+
+ /***/
+ },
+
+ /***/ "./node_modules/react-error-overlay/lib/index.js":
+ /*!*******************************************************!*\
+ !*** ./node_modules/react-error-overlay/lib/index.js ***!
+ \*******************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ (function webpackUniversalModuleDefinition(root, factory) {
+ if (true) module.exports = factory();
+ else if (typeof define === "function" && define.amd)
+ define([], factory);
+ else if (typeof exports === "object")
+ exports["ReactErrorOverlay"] = factory();
+ else root["ReactErrorOverlay"] = factory();
+ })(this, function() {
+ return /******/ (function(modules) {
+ // webpackBootstrap
+ /******/ // The module cache
+ /******/ var installedModules = {}; // The require function
+ /******/
+ /******/ /******/ function __webpack_require__(moduleId) {
+ /******/
+ /******/ // Check if module is in cache
+ /******/ if (installedModules[moduleId]) {
+ /******/ return installedModules[moduleId].exports;
+ /******/
+ } // Create a new module (and put it into the cache)
+ /******/ /******/ var module = (installedModules[moduleId] = {
+ /******/ i: moduleId,
+ /******/ l: false,
+ /******/ exports: {}
+ /******/
+ }); // Execute the module function
+ /******/
+ /******/ /******/ modules[moduleId].call(
+ module.exports,
+ module,
+ module.exports,
+ __webpack_require__
+ ); // Flag the module as loaded
+ /******/
+ /******/ /******/ module.l = true; // Return the exports of the module
+ /******/
+ /******/ /******/ return module.exports;
+ /******/
+ } // expose the modules object (__webpack_modules__)
+ /******/
+ /******/
+ /******/ /******/ __webpack_require__.m = modules; // expose the module cache
+ /******/
+ /******/ /******/ __webpack_require__.c = installedModules; // define getter function for harmony exports
+ /******/
+ /******/ /******/ __webpack_require__.d = function(
+ exports,
+ name,
+ getter
+ ) {
+ /******/ if (!__webpack_require__.o(exports, name)) {
+ /******/ Object.defineProperty(exports, name, {
+ /******/ configurable: false,
+ /******/ enumerable: true,
+ /******/ get: getter
+ /******/
+ });
+ /******/
+ }
+ /******/
+ }; // getDefaultExport function for compatibility with non-harmony modules
+ /******/
+ /******/ /******/ __webpack_require__.n = function(module) {
+ /******/ var getter =
+ module && module.__esModule
+ ? /******/ function getDefault() {
+ return module["default"];
+ }
+ : /******/ function getModuleExports() {
+ return module;
+ };
+ /******/ __webpack_require__.d(getter, "a", getter);
+ /******/ return getter;
+ /******/
+ }; // Object.prototype.hasOwnProperty.call
+ /******/
+ /******/ /******/ __webpack_require__.o = function(
+ object,
+ property
+ ) {
+ return Object.prototype.hasOwnProperty.call(object, property);
+ }; // __webpack_public_path__
+ /******/
+ /******/ /******/ __webpack_require__.p = ""; // Load entry module and return exports
+ /******/
+ /******/ /******/ return __webpack_require__(
+ (__webpack_require__.s = 9)
+ );
+ /******/
+ })(
+ /************************************************************************/
+ /******/ [
+ /* 0 */
+ /***/ function(module, exports) {
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ /**
+ * This is a helper function for getting values from parameter/options
+ * objects.
+ *
+ * @param args The object we are extracting values from
+ * @param name The name of the property we are getting.
+ * @param defaultValue An optional value to return if the property is missing
+ * from the object. If this is not specified and the property is missing, an
+ * error will be thrown.
+ */
+ function getArg(aArgs, aName, aDefaultValue) {
+ if (aName in aArgs) {
+ return aArgs[aName];
+ } else if (arguments.length === 3) {
+ return aDefaultValue;
+ } else {
+ throw new Error('"' + aName + '" is a required argument.');
+ }
+ }
+ exports.getArg = getArg;
+
+ var urlRegexp = /^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.]*)(?::(\d+))?(\S*)$/;
+ var dataUrlRegexp = /^data:.+\,.+$/;
+
+ function urlParse(aUrl) {
+ var match = aUrl.match(urlRegexp);
+ if (!match) {
+ return null;
+ }
+ return {
+ scheme: match[1],
+ auth: match[2],
+ host: match[3],
+ port: match[4],
+ path: match[5]
+ };
+ }
+ exports.urlParse = urlParse;
+
+ function urlGenerate(aParsedUrl) {
+ var url = "";
+ if (aParsedUrl.scheme) {
+ url += aParsedUrl.scheme + ":";
+ }
+ url += "//";
+ if (aParsedUrl.auth) {
+ url += aParsedUrl.auth + "@";
+ }
+ if (aParsedUrl.host) {
+ url += aParsedUrl.host;
+ }
+ if (aParsedUrl.port) {
+ url += ":" + aParsedUrl.port;
+ }
+ if (aParsedUrl.path) {
+ url += aParsedUrl.path;
+ }
+ return url;
+ }
+ exports.urlGenerate = urlGenerate;
+
+ /**
+ * Normalizes a path, or the path portion of a URL:
+ *
+ * - Replaces consecutive slashes with one slash.
+ * - Removes unnecessary '.' parts.
+ * - Removes unnecessary '<dir>/..' parts.
+ *
+ * Based on code in the Node.js 'path' core module.
+ *
+ * @param aPath The path or url to normalize.
+ */
+ function normalize(aPath) {
+ var path = aPath;
+ var url = urlParse(aPath);
+ if (url) {
+ if (!url.path) {
+ return aPath;
+ }
+ path = url.path;
+ }
+ var isAbsolute = exports.isAbsolute(path);
+
+ var parts = path.split(/\/+/);
+ for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {
+ part = parts[i];
+ if (part === ".") {
+ parts.splice(i, 1);
+ } else if (part === "..") {
+ up++;
+ } else if (up > 0) {
+ if (part === "") {
+ // The first part is blank if the path is absolute. Trying to go
+ // above the root is a no-op. Therefore we can remove all '..' parts
+ // directly after the root.
+ parts.splice(i + 1, up);
+ up = 0;
+ } else {
+ parts.splice(i, 2);
+ up--;
+ }
+ }
+ }
+ path = parts.join("/");
+
+ if (path === "") {
+ path = isAbsolute ? "/" : ".";
+ }
+
+ if (url) {
+ url.path = path;
+ return urlGenerate(url);
+ }
+ return path;
+ }
+ exports.normalize = normalize;
+
+ /**
+ * Joins two paths/URLs.
+ *
+ * @param aRoot The root path or URL.
+ * @param aPath The path or URL to be joined with the root.
+ *
+ * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a
+ * scheme-relative URL: Then the scheme of aRoot, if any, is prepended
+ * first.
+ * - Otherwise aPath is a path. If aRoot is a URL, then its path portion
+ * is updated with the result and aRoot is returned. Otherwise the result
+ * is returned.
+ * - If aPath is absolute, the result is aPath.
+ * - Otherwise the two paths are joined with a slash.
+ * - Joining for example 'http://' and 'www.example.com' is also supported.
+ */
+ function join(aRoot, aPath) {
+ if (aRoot === "") {
+ aRoot = ".";
+ }
+ if (aPath === "") {
+ aPath = ".";
+ }
+ var aPathUrl = urlParse(aPath);
+ var aRootUrl = urlParse(aRoot);
+ if (aRootUrl) {
+ aRoot = aRootUrl.path || "/";
+ }
+
+ // `join(foo, '//www.example.org')`
+ if (aPathUrl && !aPathUrl.scheme) {
+ if (aRootUrl) {
+ aPathUrl.scheme = aRootUrl.scheme;
+ }
+ return urlGenerate(aPathUrl);
+ }
+
+ if (aPathUrl || aPath.match(dataUrlRegexp)) {
+ return aPath;
+ }
+
+ // `join('http://', 'www.example.com')`
+ if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {
+ aRootUrl.host = aPath;
+ return urlGenerate(aRootUrl);
+ }
+
+ var joined =
+ aPath.charAt(0) === "/"
+ ? aPath
+ : normalize(aRoot.replace(/\/+$/, "") + "/" + aPath);
+
+ if (aRootUrl) {
+ aRootUrl.path = joined;
+ return urlGenerate(aRootUrl);
+ }
+ return joined;
+ }
+ exports.join = join;
+
+ exports.isAbsolute = function(aPath) {
+ return aPath.charAt(0) === "/" || !!aPath.match(urlRegexp);
+ };
+
+ /**
+ * Make a path relative to a URL or another path.
+ *
+ * @param aRoot The root path or URL.
+ * @param aPath The path or URL to be made relative to aRoot.
+ */
+ function relative(aRoot, aPath) {
+ if (aRoot === "") {
+ aRoot = ".";
+ }
+
+ aRoot = aRoot.replace(/\/$/, "");
+
+ // It is possible for the path to be above the root. In this case, simply
+ // checking whether the root is a prefix of the path won't work. Instead, we
+ // need to remove components from the root one by one, until either we find
+ // a prefix that fits, or we run out of components to remove.
+ var level = 0;
+ while (aPath.indexOf(aRoot + "/") !== 0) {
+ var index = aRoot.lastIndexOf("/");
+ if (index < 0) {
+ return aPath;
+ }
+
+ // If the only part of the root that is left is the scheme (i.e. http://,
+ // file:///, etc.), one or more slashes (/), or simply nothing at all, we
+ // have exhausted all components, so the path is not relative to the root.
+ aRoot = aRoot.slice(0, index);
+ if (aRoot.match(/^([^\/]+:\/)?\/*$/)) {
+ return aPath;
+ }
+
+ ++level;
+ }
+
+ // Make sure we add a "../" for each component we removed from the root.
+ return (
+ Array(level + 1).join("../") +
+ aPath.substr(aRoot.length + 1)
+ );
+ }
+ exports.relative = relative;
+
+ var supportsNullProto = (function() {
+ var obj = Object.create(null);
+ return !("__proto__" in obj);
+ })();
+
+ function identity(s) {
+ return s;
+ }
+
+ /**
+ * Because behavior goes wacky when you set `__proto__` on objects, we
+ * have to prefix all the strings in our set with an arbitrary character.
+ *
+ * See https://github.com/mozilla/source-map/pull/31 and
+ * https://github.com/mozilla/source-map/issues/30
+ *
+ * @param String aStr
+ */
+ function toSetString(aStr) {
+ if (isProtoString(aStr)) {
+ return "$" + aStr;
+ }
+
+ return aStr;
+ }
+ exports.toSetString = supportsNullProto
+ ? identity
+ : toSetString;
+
+ function fromSetString(aStr) {
+ if (isProtoString(aStr)) {
+ return aStr.slice(1);
+ }
+
+ return aStr;
+ }
+ exports.fromSetString = supportsNullProto
+ ? identity
+ : fromSetString;
+
+ function isProtoString(s) {
+ if (!s) {
+ return false;
+ }
+
+ var length = s.length;
+
+ if (length < 9 /* "__proto__".length */) {
+ return false;
+ }
+
+ if (
+ s.charCodeAt(length - 1) !== 95 /* '_' */ ||
+ s.charCodeAt(length - 2) !== 95 /* '_' */ ||
+ s.charCodeAt(length - 3) !== 111 /* 'o' */ ||
+ s.charCodeAt(length - 4) !== 116 /* 't' */ ||
+ s.charCodeAt(length - 5) !== 111 /* 'o' */ ||
+ s.charCodeAt(length - 6) !== 114 /* 'r' */ ||
+ s.charCodeAt(length - 7) !== 112 /* 'p' */ ||
+ s.charCodeAt(length - 8) !== 95 /* '_' */ ||
+ s.charCodeAt(length - 9) !== 95 /* '_' */
+ ) {
+ return false;
+ }
+
+ for (var i = length - 10; i >= 0; i--) {
+ if (s.charCodeAt(i) !== 36 /* '$' */) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Comparator between two mappings where the original positions are compared.
+ *
+ * Optionally pass in `true` as `onlyCompareGenerated` to consider two
+ * mappings with the same original source/line/column, but different generated
+ * line and column the same. Useful when searching for a mapping with a
+ * stubbed out mapping.
+ */
+ function compareByOriginalPositions(
+ mappingA,
+ mappingB,
+ onlyCompareOriginal
+ ) {
+ var cmp = mappingA.source - mappingB.source;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalLine - mappingB.originalLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalColumn - mappingB.originalColumn;
+ if (cmp !== 0 || onlyCompareOriginal) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ return mappingA.name - mappingB.name;
+ }
+ exports.compareByOriginalPositions = compareByOriginalPositions;
+
+ /**
+ * Comparator between two mappings with deflated source and name indices where
+ * the generated positions are compared.
+ *
+ * Optionally pass in `true` as `onlyCompareGenerated` to consider two
+ * mappings with the same generated line and column, but different
+ * source/name/original line and column the same. Useful when searching for a
+ * mapping with a stubbed out mapping.
+ */
+ function compareByGeneratedPositionsDeflated(
+ mappingA,
+ mappingB,
+ onlyCompareGenerated
+ ) {
+ var cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp !== 0 || onlyCompareGenerated) {
+ return cmp;
+ }
+
+ cmp = mappingA.source - mappingB.source;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalLine - mappingB.originalLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalColumn - mappingB.originalColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ return mappingA.name - mappingB.name;
+ }
+ exports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;
+
+ function strcmp(aStr1, aStr2) {
+ if (aStr1 === aStr2) {
+ return 0;
+ }
+
+ if (aStr1 > aStr2) {
+ return 1;
+ }
+
+ return -1;
+ }
+
+ /**
+ * Comparator between two mappings with inflated source and name strings where
+ * the generated positions are compared.
+ */
+ function compareByGeneratedPositionsInflated(
+ mappingA,
+ mappingB
+ ) {
+ var cmp = mappingA.generatedLine - mappingB.generatedLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.generatedColumn - mappingB.generatedColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = strcmp(mappingA.source, mappingB.source);
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalLine - mappingB.originalLine;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ cmp = mappingA.originalColumn - mappingB.originalColumn;
+ if (cmp !== 0) {
+ return cmp;
+ }
+
+ return strcmp(mappingA.name, mappingB.name);
+ }
+ exports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;
+
+ /***/
+ },
+ /* 1 */
+ /***/ function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ /* unused harmony export StackFrame */
+ /* harmony export (binding) */ __webpack_require__.d(
+ __webpack_exports__,
+ "a",
+ function() {
+ return ScriptLine;
+ }
+ );
+ var _createClass = (function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || false;
+ descriptor.configurable = true;
+ if ("value" in descriptor) descriptor.writable = true;
+ Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ if (protoProps)
+ defineProperties(Constructor.prototype, protoProps);
+ if (staticProps) defineProperties(Constructor, staticProps);
+ return Constructor;
+ };
+ })();
+
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ /**
+ * Copyright (c) 2015-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+ /** A container holding a script line. */
+ var ScriptLine =
+ /** The content (or value) of this line of source. */
+ function ScriptLine(lineNumber, content) {
+ var highlight =
+ arguments.length > 2 && arguments[2] !== undefined
+ ? arguments[2]
+ : false;
+
+ _classCallCheck(this, ScriptLine);
+
+ this.lineNumber = lineNumber;
+ this.content = content;
+ this.highlight = highlight;
+ };
+ /** Whether or not this line should be highlighted. Particularly useful for error reporting with context. */
+
+ /** The line number of this line of source. */
+
+ /**
+ * A representation of a stack frame.
+ */
+
+ var StackFrame = (function() {
+ function StackFrame() {
+ var functionName =
+ arguments.length > 0 && arguments[0] !== undefined
+ ? arguments[0]
+ : null;
+ var fileName =
+ arguments.length > 1 && arguments[1] !== undefined
+ ? arguments[1]
+ : null;
+ var lineNumber =
+ arguments.length > 2 && arguments[2] !== undefined
+ ? arguments[2]
+ : null;
+ var columnNumber =
+ arguments.length > 3 && arguments[3] !== undefined
+ ? arguments[3]
+ : null;
+ var scriptCode =
+ arguments.length > 4 && arguments[4] !== undefined
+ ? arguments[4]
+ : null;
+ var sourceFunctionName =
+ arguments.length > 5 && arguments[5] !== undefined
+ ? arguments[5]
+ : null;
+ var sourceFileName =
+ arguments.length > 6 && arguments[6] !== undefined
+ ? arguments[6]
+ : null;
+ var sourceLineNumber =
+ arguments.length > 7 && arguments[7] !== undefined
+ ? arguments[7]
+ : null;
+ var sourceColumnNumber =
+ arguments.length > 8 && arguments[8] !== undefined
+ ? arguments[8]
+ : null;
+ var sourceScriptCode =
+ arguments.length > 9 && arguments[9] !== undefined
+ ? arguments[9]
+ : null;
+
+ _classCallCheck(this, StackFrame);
+
+ if (functionName && functionName.indexOf("Object.") === 0) {
+ functionName = functionName.slice("Object.".length);
+ }
+ if (
+ // Chrome has a bug with inferring function.name:
+ // https://github.com/facebookincubator/create-react-app/issues/2097
+ // Let's ignore a meaningless name we get for top-level modules.
+ functionName === "friendlySyntaxErrorLabel" ||
+ functionName === "exports.__esModule" ||
+ functionName === "<anonymous>" ||
+ !functionName
+ ) {
+ functionName = null;
+ }
+ this.functionName = functionName;
+
+ this.fileName = fileName;
+ this.lineNumber = lineNumber;
+ this.columnNumber = columnNumber;
+
+ this._originalFunctionName = sourceFunctionName;
+ this._originalFileName = sourceFileName;
+ this._originalLineNumber = sourceLineNumber;
+ this._originalColumnNumber = sourceColumnNumber;
+
+ this._scriptCode = scriptCode;
+ this._originalScriptCode = sourceScriptCode;
+ }
+
+ /**
+ * Returns the name of this function.
+ */
+
+ _createClass(StackFrame, [
+ {
+ key: "getFunctionName",
+ value: function getFunctionName() {
+ return this.functionName || "(anonymous function)";
+ }
+
+ /**
+ * Returns the source of the frame.
+ * This contains the file name, line number, and column number when available.
+ */
+ },
+ {
+ key: "getSource",
+ value: function getSource() {
+ var str = "";
+ if (this.fileName != null) {
+ str += this.fileName + ":";
+ }
+ if (this.lineNumber != null) {
+ str += this.lineNumber + ":";
+ }
+ if (this.columnNumber != null) {
+ str += this.columnNumber + ":";
+ }
+ return str.slice(0, -1);
+ }
+
+ /**
+ * Returns a pretty version of this stack frame.
+ */
+ },
+ {
+ key: "toString",
+ value: function toString() {
+ var functionName = this.getFunctionName();
+ var source = this.getSource();
+ return (
+ "" +
+ functionName +
+ (source ? " (" + source + ")" : "")
+ );
+ }
+ }
+ ]);
+
+ return StackFrame;
+ })();
+
+ /* harmony default export */ __webpack_exports__[
+ "b"
+ ] = StackFrame;
+
+ /***/
+ },
+ /* 2 */
+ /***/ function(module, exports, __webpack_require__) {
+ module.exports = __webpack_require__(19);
+
+ /***/
+ },
+ /* 3 */
+ /***/ function(module, exports) {
+ // shim for using process in browser
+ var process = (module.exports = {});
+
+ // cached from whatever global is present so that test runners that stub it
+ // don't break things. But we need to wrap it in a try catch in case it is
+ // wrapped in strict mode code which doesn't define any globals. It's inside a
+ // function because try/catches deoptimize in certain engines.
+
+ var cachedSetTimeout;
+ var cachedClearTimeout;
+
+ function defaultSetTimout() {
+ throw new Error("setTimeout has not been defined");
+ }
+ function defaultClearTimeout() {
+ throw new Error("clearTimeout has not been defined");
+ }
+ (function() {
+ try {
+ if (typeof setTimeout === "function") {
+ cachedSetTimeout = setTimeout;
+ } else {
+ cachedSetTimeout = defaultSetTimout;
+ }
+ } catch (e) {
+ cachedSetTimeout = defaultSetTimout;
+ }
+ try {
+ if (typeof clearTimeout === "function") {
+ cachedClearTimeout = clearTimeout;
+ } else {
+ cachedClearTimeout = defaultClearTimeout;
+ }
+ } catch (e) {
+ cachedClearTimeout = defaultClearTimeout;
+ }
+ })();
+ function runTimeout(fun) {
+ if (cachedSetTimeout === setTimeout) {
+ //normal enviroments in sane situations
+ return setTimeout(fun, 0);
+ }
+ // if setTimeout wasn't available but was latter defined
+ if (
+ (cachedSetTimeout === defaultSetTimout ||
+ !cachedSetTimeout) &&
+ setTimeout
+ ) {
+ cachedSetTimeout = setTimeout;
+ return setTimeout(fun, 0);
+ }
+ try {
+ // when when somebody has screwed with setTimeout but no I.E. maddness
+ return cachedSetTimeout(fun, 0);
+ } catch (e) {
+ try {
+ // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+ return cachedSetTimeout.call(null, fun, 0);
+ } catch (e) {
+ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
+ return cachedSetTimeout.call(this, fun, 0);
+ }
+ }
+ }
+ function runClearTimeout(marker) {
+ if (cachedClearTimeout === clearTimeout) {
+ //normal enviroments in sane situations
+ return clearTimeout(marker);
+ }
+ // if clearTimeout wasn't available but was latter defined
+ if (
+ (cachedClearTimeout === defaultClearTimeout ||
+ !cachedClearTimeout) &&
+ clearTimeout
+ ) {
+ cachedClearTimeout = clearTimeout;
+ return clearTimeout(marker);
+ }
+ try {
+ // when when somebody has screwed with setTimeout but no I.E. maddness
+ return cachedClearTimeout(marker);
+ } catch (e) {
+ try {
+ // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+ return cachedClearTimeout.call(null, marker);
+ } catch (e) {
+ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
+ // Some versions of I.E. have different rules for clearTimeout vs setTimeout
+ return cachedClearTimeout.call(this, marker);
+ }
+ }
+ }
+ var queue = [];
+ var draining = false;
+ var currentQueue;
+ var queueIndex = -1;
+
+ function cleanUpNextTick() {
+ if (!draining || !currentQueue) {
+ return;
+ }
+ draining = false;
+ if (currentQueue.length) {
+ queue = currentQueue.concat(queue);
+ } else {
+ queueIndex = -1;
+ }
+ if (queue.length) {
+ drainQueue();
+ }
+ }
+
+ function drainQueue() {
+ if (draining) {
+ return;
+ }
+ var timeout = runTimeout(cleanUpNextTick);
+ draining = true;
+
+ var len = queue.length;
+ while (len) {
+ currentQueue = queue;
+ queue = [];
+ while (++queueIndex < len) {
+ if (currentQueue) {
+ currentQueue[queueIndex].run();
+ }
+ }
+ queueIndex = -1;
+ len = queue.length;
+ }
+ currentQueue = null;
+ draining = false;
+ runClearTimeout(timeout);
+ }
+
+ process.nextTick = function(fun) {
+ var args = new Array(arguments.length - 1);
+ if (arguments.length > 1) {
+ for (var i = 1; i < arguments.length; i++) {
+ args[i - 1] = arguments[i];
+ }
+ }
+ queue.push(new Item(fun, args));
+ if (queue.length === 1 && !draining) {
+ runTimeout(drainQueue);
+ }
+ };
+
+ // v8 likes predictible objects
+ function Item(fun, array) {
+ this.fun = fun;
+ this.array = array;
+ }
+ Item.prototype.run = function() {
+ this.fun.apply(null, this.array);
+ };
+ process.title = "browser";
+ process.browser = true;
+ process.env = {};
+ process.argv = [];
+ process.version = ""; // empty string to avoid regexp issues
+ process.versions = {};
+
+ function noop() {}
+
+ process.on = noop;
+ process.addListener = noop;
+ process.once = noop;
+ process.off = noop;
+ process.removeListener = noop;
+ process.removeAllListeners = noop;
+ process.emit = noop;
+ process.prependListener = noop;
+ process.prependOnceListener = noop;
+
+ process.listeners = function(name) {
+ return [];
+ };
+
+ process.binding = function(name) {
+ throw new Error("process.binding is not supported");
+ };
+
+ process.cwd = function() {
+ return "/";
+ };
+ process.chdir = function(dir) {
+ throw new Error("process.chdir is not supported");
+ };
+ process.umask = function() {
+ return 0;
+ };
+
+ /***/
+ },
+ /* 4 */
+ /***/ function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ /* unused harmony export extractSourceMapUrl */
+ /* harmony export (binding) */ __webpack_require__.d(
+ __webpack_exports__,
+ "a",
+ function() {
+ return getSourceMap;
+ }
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator__ = __webpack_require__(
+ 2
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default = __webpack_require__.n(
+ __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator__
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_source_map__ = __webpack_require__(
+ 21
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_source_map___default = __webpack_require__.n(
+ __WEBPACK_IMPORTED_MODULE_1_source_map__
+ );
+
+ var _createClass = (function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || false;
+ descriptor.configurable = true;
+ if ("value" in descriptor) descriptor.writable = true;
+ Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ if (protoProps)
+ defineProperties(Constructor.prototype, protoProps);
+ if (staticProps) defineProperties(Constructor, staticProps);
+ return Constructor;
+ };
+ })();
+
+ /**
+ * Returns an instance of <code>{@link SourceMap}</code> for a given fileUri and fileContents.
+ * @param {string} fileUri The URI of the source file.
+ * @param {string} fileContents The contents of the source file.
+ */
+ var getSourceMap = (function() {
+ var _ref = _asyncToGenerator(
+ /*#__PURE__*/ __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.mark(
+ function _callee(fileUri, fileContents) {
+ var sm, base64, match2, index, url, obj;
+ return __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.wrap(
+ function _callee$(_context) {
+ while (1) {
+ switch ((_context.prev = _context.next)) {
+ case 0:
+ _context.next = 2;
+ return extractSourceMapUrl(
+ fileUri,
+ fileContents
+ );
+
+ case 2:
+ sm = _context.sent;
+
+ if (!(sm.indexOf("data:") === 0)) {
+ _context.next = 14;
+ break;
+ }
+
+ base64 = /^data:application\/json;([\w=:"-]+;)*base64,/;
+ match2 = sm.match(base64);
+
+ if (match2) {
+ _context.next = 8;
+ break;
+ }
+
+ throw new Error(
+ "Sorry, non-base64 inline source-map encoding is not supported."
+ );
+
+ case 8:
+ sm = sm.substring(match2[0].length);
+ sm = window.atob(sm);
+ sm = JSON.parse(sm);
+ return _context.abrupt(
+ "return",
+ new SourceMap(
+ new __WEBPACK_IMPORTED_MODULE_1_source_map__[
+ "SourceMapConsumer"
+ ](sm)
+ )
+ );
+
+ case 14:
+ index = fileUri.lastIndexOf("/");
+ url = fileUri.substring(0, index + 1) + sm;
+ _context.next = 18;
+ return fetch(url).then(function(res) {
+ return res.json();
+ });
+
+ case 18:
+ obj = _context.sent;
+ return _context.abrupt(
+ "return",
+ new SourceMap(
+ new __WEBPACK_IMPORTED_MODULE_1_source_map__[
+ "SourceMapConsumer"
+ ](obj)
+ )
+ );
+
+ case 20:
+ case "end":
+ return _context.stop();
+ }
+ }
+ },
+ _callee,
+ this
+ );
+ }
+ )
+ );
+
+ return function getSourceMap(_x, _x2) {
+ return _ref.apply(this, arguments);
+ };
+ })();
+
+ function _asyncToGenerator(fn) {
+ return function() {
+ var gen = fn.apply(this, arguments);
+ return new Promise(function(resolve, reject) {
+ function step(key, arg) {
+ try {
+ var info = gen[key](arg);
+ var value = info.value;
+ } catch (error) {
+ reject(error);
+ return;
+ }
+ if (info.done) {
+ resolve(value);
+ } else {
+ return Promise.resolve(value).then(
+ function(value) {
+ step("next", value);
+ },
+ function(err) {
+ step("throw", err);
+ }
+ );
+ }
+ }
+ return step("next");
+ });
+ };
+ }
+
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ /**
+ * Copyright (c) 2015-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+ /**
+ * A wrapped instance of a <code>{@link https://github.com/mozilla/source-map SourceMapConsumer}</code>.
+ *
+ * This exposes methods which will be indifferent to changes made in <code>{@link https://github.com/mozilla/source-map source-map}</code>.
+ */
+
+ var SourceMap = (function() {
+ function SourceMap(sourceMap) {
+ _classCallCheck(this, SourceMap);
+
+ this.__source_map = sourceMap;
+ }
+
+ /**
+ * Returns the original code position for a generated code position.
+ * @param {number} line The line of the generated code position.
+ * @param {number} column The column of the generated code position.
+ */
+
+ _createClass(SourceMap, [
+ {
+ key: "getOriginalPosition",
+ value: function getOriginalPosition(line, column) {
+ var _source_map$original = this.__source_map.originalPositionFor(
+ {
+ line: line,
+ column: column
+ }
+ ),
+ l = _source_map$original.line,
+ c = _source_map$original.column,
+ s = _source_map$original.source;
+
+ return { line: l, column: c, source: s };
+ }
+
+ /**
+ * Returns the generated code position for an original position.
+ * @param {string} source The source file of the original code position.
+ * @param {number} line The line of the original code position.
+ * @param {number} column The column of the original code position.
+ */
+ },
+ {
+ key: "getGeneratedPosition",
+ value: function getGeneratedPosition(
+ source,
+ line,
+ column
+ ) {
+ var _source_map$generate = this.__source_map.generatedPositionFor(
+ {
+ source: source,
+ line: line,
+ column: column
+ }
+ ),
+ l = _source_map$generate.line,
+ c = _source_map$generate.column;
+
+ return {
+ line: l,
+ column: c
+ };
+ }
+
+ /**
+ * Returns the code for a given source file name.
+ * @param {string} sourceName The name of the source file.
+ */
+ },
+ {
+ key: "getSource",
+ value: function getSource(sourceName) {
+ return this.__source_map.sourceContentFor(sourceName);
+ }
+ },
+ {
+ key: "getSources",
+ value: function getSources() {
+ return this.__source_map.sources;
+ }
+ }
+ ]);
+
+ return SourceMap;
+ })();
+
+ function extractSourceMapUrl(fileUri, fileContents) {
+ var regex = /\/\/[#@] ?sourceMappingURL=([^\s'"]+)\s*$/gm;
+ var match = null;
+ for (;;) {
+ var next = regex.exec(fileContents);
+ if (next == null) {
+ break;
+ }
+ match = next;
+ }
+ if (!(match && match[1])) {
+ return Promise.reject(
+ "Cannot find a source map directive for " + fileUri + "."
+ );
+ }
+ return Promise.resolve(match[1].toString());
+ }
+
+ /* unused harmony default export */ var _unused_webpack_default_export = getSourceMap;
+
+ /***/
+ },
+ /* 5 */
+ /***/ function(module, exports, __webpack_require__) {
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ var base64VLQ = __webpack_require__(6);
+ var util = __webpack_require__(0);
+ var ArraySet = __webpack_require__(7).ArraySet;
+ var MappingList = __webpack_require__(23).MappingList;
+
+ /**
+ * An instance of the SourceMapGenerator represents a source map which is
+ * being built incrementally. You may pass an object with the following
+ * properties:
+ *
+ * - file: The filename of the generated source.
+ * - sourceRoot: A root for all relative URLs in this source map.
+ */
+ function SourceMapGenerator(aArgs) {
+ if (!aArgs) {
+ aArgs = {};
+ }
+ this._file = util.getArg(aArgs, "file", null);
+ this._sourceRoot = util.getArg(aArgs, "sourceRoot", null);
+ this._skipValidation = util.getArg(
+ aArgs,
+ "skipValidation",
+ false
+ );
+ this._sources = new ArraySet();
+ this._names = new ArraySet();
+ this._mappings = new MappingList();
+ this._sourcesContents = null;
+ }
+
+ SourceMapGenerator.prototype._version = 3;
+
+ /**
+ * Creates a new SourceMapGenerator based on a SourceMapConsumer
+ *
+ * @param aSourceMapConsumer The SourceMap.
+ */
+ SourceMapGenerator.fromSourceMap = function SourceMapGenerator_fromSourceMap(
+ aSourceMapConsumer
+ ) {
+ var sourceRoot = aSourceMapConsumer.sourceRoot;
+ var generator = new SourceMapGenerator({
+ file: aSourceMapConsumer.file,
+ sourceRoot: sourceRoot
+ });
+ aSourceMapConsumer.eachMapping(function(mapping) {
+ var newMapping = {
+ generated: {
+ line: mapping.generatedLine,
+ column: mapping.generatedColumn
+ }
+ };
+
+ if (mapping.source != null) {
+ newMapping.source = mapping.source;
+ if (sourceRoot != null) {
+ newMapping.source = util.relative(
+ sourceRoot,
+ newMapping.source
+ );
+ }
+
+ newMapping.original = {
+ line: mapping.originalLine,
+ column: mapping.originalColumn
+ };
+
+ if (mapping.name != null) {
+ newMapping.name = mapping.name;
+ }
+ }
+
+ generator.addMapping(newMapping);
+ });
+ aSourceMapConsumer.sources.forEach(function(sourceFile) {
+ var content = aSourceMapConsumer.sourceContentFor(
+ sourceFile
+ );
+ if (content != null) {
+ generator.setSourceContent(sourceFile, content);
+ }
+ });
+ return generator;
+ };
+
+ /**
+ * Add a single mapping from original source line and column to the generated
+ * source's line and column for this source map being created. The mapping
+ * object should have the following properties:
+ *
+ * - generated: An object with the generated line and column positions.
+ * - original: An object with the original line and column positions.
+ * - source: The original source file (relative to the sourceRoot).
+ * - name: An optional original token name for this mapping.
+ */
+ SourceMapGenerator.prototype.addMapping = function SourceMapGenerator_addMapping(
+ aArgs
+ ) {
+ var generated = util.getArg(aArgs, "generated");
+ var original = util.getArg(aArgs, "original", null);
+ var source = util.getArg(aArgs, "source", null);
+ var name = util.getArg(aArgs, "name", null);
+
+ if (!this._skipValidation) {
+ this._validateMapping(generated, original, source, name);
+ }
+
+ if (source != null) {
+ source = String(source);
+ if (!this._sources.has(source)) {
+ this._sources.add(source);
+ }
+ }
+
+ if (name != null) {
+ name = String(name);
+ if (!this._names.has(name)) {
+ this._names.add(name);
+ }
+ }
+
+ this._mappings.add({
+ generatedLine: generated.line,
+ generatedColumn: generated.column,
+ originalLine: original != null && original.line,
+ originalColumn: original != null && original.column,
+ source: source,
+ name: name
+ });
+ };
+
+ /**
+ * Set the source content for a source file.
+ */
+ SourceMapGenerator.prototype.setSourceContent = function SourceMapGenerator_setSourceContent(
+ aSourceFile,
+ aSourceContent
+ ) {
+ var source = aSourceFile;
+ if (this._sourceRoot != null) {
+ source = util.relative(this._sourceRoot, source);
+ }
+
+ if (aSourceContent != null) {
+ // Add the source content to the _sourcesContents map.
+ // Create a new _sourcesContents map if the property is null.
+ if (!this._sourcesContents) {
+ this._sourcesContents = Object.create(null);
+ }
+ this._sourcesContents[
+ util.toSetString(source)
+ ] = aSourceContent;
+ } else if (this._sourcesContents) {
+ // Remove the source file from the _sourcesContents map.
+ // If the _sourcesContents map is empty, set the property to null.
+ delete this._sourcesContents[util.toSetString(source)];
+ if (Object.keys(this._sourcesContents).length === 0) {
+ this._sourcesContents = null;
+ }
+ }
+ };
+
+ /**
+ * Applies the mappings of a sub-source-map for a specific source file to the
+ * source map being generated. Each mapping to the supplied source file is
+ * rewritten using the supplied source map. Note: The resolution for the
+ * resulting mappings is the minimium of this map and the supplied map.
+ *
+ * @param aSourceMapConsumer The source map to be applied.
+ * @param aSourceFile Optional. The filename of the source file.
+ * If omitted, SourceMapConsumer's file property will be used.
+ * @param aSourceMapPath Optional. The dirname of the path to the source map
+ * to be applied. If relative, it is relative to the SourceMapConsumer.
+ * This parameter is needed when the two source maps aren't in the same
+ * directory, and the source map to be applied contains relative source
+ * paths. If so, those relative source paths need to be rewritten
+ * relative to the SourceMapGenerator.
+ */
+ SourceMapGenerator.prototype.applySourceMap = function SourceMapGenerator_applySourceMap(
+ aSourceMapConsumer,
+ aSourceFile,
+ aSourceMapPath
+ ) {
+ var sourceFile = aSourceFile;
+ // If aSourceFile is omitted, we will use the file property of the SourceMap
+ if (aSourceFile == null) {
+ if (aSourceMapConsumer.file == null) {
+ throw new Error(
+ "SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, " +
+ 'or the source map\'s "file" property. Both were omitted.'
+ );
+ }
+ sourceFile = aSourceMapConsumer.file;
+ }
+ var sourceRoot = this._sourceRoot;
+ // Make "sourceFile" relative if an absolute Url is passed.
+ if (sourceRoot != null) {
+ sourceFile = util.relative(sourceRoot, sourceFile);
+ }
+ // Applying the SourceMap can add and remove items from the sources and
+ // the names array.
+ var newSources = new ArraySet();
+ var newNames = new ArraySet();
+
+ // Find mappings for the "sourceFile"
+ this._mappings.unsortedForEach(function(mapping) {
+ if (
+ mapping.source === sourceFile &&
+ mapping.originalLine != null
+ ) {
+ // Check if it can be mapped by the source map, then update the mapping.
+ var original = aSourceMapConsumer.originalPositionFor({
+ line: mapping.originalLine,
+ column: mapping.originalColumn
+ });
+ if (original.source != null) {
+ // Copy mapping
+ mapping.source = original.source;
+ if (aSourceMapPath != null) {
+ mapping.source = util.join(
+ aSourceMapPath,
+ mapping.source
+ );
+ }
+ if (sourceRoot != null) {
+ mapping.source = util.relative(
+ sourceRoot,
+ mapping.source
+ );
+ }
+ mapping.originalLine = original.line;
+ mapping.originalColumn = original.column;
+ if (original.name != null) {
+ mapping.name = original.name;
+ }
+ }
+ }
+
+ var source = mapping.source;
+ if (source != null && !newSources.has(source)) {
+ newSources.add(source);
+ }
+
+ var name = mapping.name;
+ if (name != null && !newNames.has(name)) {
+ newNames.add(name);
+ }
+ }, this);
+ this._sources = newSources;
+ this._names = newNames;
+
+ // Copy sourcesContents of applied map.
+ aSourceMapConsumer.sources.forEach(function(sourceFile) {
+ var content = aSourceMapConsumer.sourceContentFor(
+ sourceFile
+ );
+ if (content != null) {
+ if (aSourceMapPath != null) {
+ sourceFile = util.join(aSourceMapPath, sourceFile);
+ }
+ if (sourceRoot != null) {
+ sourceFile = util.relative(sourceRoot, sourceFile);
+ }
+ this.setSourceContent(sourceFile, content);
+ }
+ }, this);
+ };
+
+ /**
+ * A mapping can have one of the three levels of data:
+ *
+ * 1. Just the generated position.
+ * 2. The Generated position, original position, and original source.
+ * 3. Generated and original position, original source, as well as a name
+ * token.
+ *
+ * To maintain consistency, we validate that any new mapping being added falls
+ * in to one of these categories.
+ */
+ SourceMapGenerator.prototype._validateMapping = function SourceMapGenerator_validateMapping(
+ aGenerated,
+ aOriginal,
+ aSource,
+ aName
+ ) {
+ if (
+ aGenerated &&
+ "line" in aGenerated &&
+ "column" in aGenerated &&
+ aGenerated.line > 0 &&
+ aGenerated.column >= 0 &&
+ !aOriginal &&
+ !aSource &&
+ !aName
+ ) {
+ // Case 1.
+ return;
+ } else if (
+ aGenerated &&
+ "line" in aGenerated &&
+ "column" in aGenerated &&
+ aOriginal &&
+ "line" in aOriginal &&
+ "column" in aOriginal &&
+ aGenerated.line > 0 &&
+ aGenerated.column >= 0 &&
+ aOriginal.line > 0 &&
+ aOriginal.column >= 0 &&
+ aSource
+ ) {
+ // Cases 2 and 3.
+ return;
+ } else {
+ throw new Error(
+ "Invalid mapping: " +
+ JSON.stringify({
+ generated: aGenerated,
+ source: aSource,
+ original: aOriginal,
+ name: aName
+ })
+ );
+ }
+ };
+
+ /**
+ * Serialize the accumulated mappings in to the stream of base 64 VLQs
+ * specified by the source map format.
+ */
+ SourceMapGenerator.prototype._serializeMappings = function SourceMapGenerator_serializeMappings() {
+ var previousGeneratedColumn = 0;
+ var previousGeneratedLine = 1;
+ var previousOriginalColumn = 0;
+ var previousOriginalLine = 0;
+ var previousName = 0;
+ var previousSource = 0;
+ var result = "";
+ var next;
+ var mapping;
+ var nameIdx;
+ var sourceIdx;
+
+ var mappings = this._mappings.toArray();
+ for (var i = 0, len = mappings.length; i < len; i++) {
+ mapping = mappings[i];
+ next = "";
+
+ if (mapping.generatedLine !== previousGeneratedLine) {
+ previousGeneratedColumn = 0;
+ while (mapping.generatedLine !== previousGeneratedLine) {
+ next += ";";
+ previousGeneratedLine++;
+ }
+ } else {
+ if (i > 0) {
+ if (
+ !util.compareByGeneratedPositionsInflated(
+ mapping,
+ mappings[i - 1]
+ )
+ ) {
+ continue;
+ }
+ next += ",";
+ }
+ }
+
+ next += base64VLQ.encode(
+ mapping.generatedColumn - previousGeneratedColumn
+ );
+ previousGeneratedColumn = mapping.generatedColumn;
+
+ if (mapping.source != null) {
+ sourceIdx = this._sources.indexOf(mapping.source);
+ next += base64VLQ.encode(sourceIdx - previousSource);
+ previousSource = sourceIdx;
+
+ // lines are stored 0-based in SourceMap spec version 3
+ next += base64VLQ.encode(
+ mapping.originalLine - 1 - previousOriginalLine
+ );
+ previousOriginalLine = mapping.originalLine - 1;
+
+ next += base64VLQ.encode(
+ mapping.originalColumn - previousOriginalColumn
+ );
+ previousOriginalColumn = mapping.originalColumn;
+
+ if (mapping.name != null) {
+ nameIdx = this._names.indexOf(mapping.name);
+ next += base64VLQ.encode(nameIdx - previousName);
+ previousName = nameIdx;
+ }
+ }
+
+ result += next;
+ }
+
+ return result;
+ };
+
+ SourceMapGenerator.prototype._generateSourcesContent = function SourceMapGenerator_generateSourcesContent(
+ aSources,
+ aSourceRoot
+ ) {
+ return aSources.map(function(source) {
+ if (!this._sourcesContents) {
+ return null;
+ }
+ if (aSourceRoot != null) {
+ source = util.relative(aSourceRoot, source);
+ }
+ var key = util.toSetString(source);
+ return Object.prototype.hasOwnProperty.call(
+ this._sourcesContents,
+ key
+ )
+ ? this._sourcesContents[key]
+ : null;
+ }, this);
+ };
+
+ /**
+ * Externalize the source map.
+ */
+ SourceMapGenerator.prototype.toJSON = function SourceMapGenerator_toJSON() {
+ var map = {
+ version: this._version,
+ sources: this._sources.toArray(),
+ names: this._names.toArray(),
+ mappings: this._serializeMappings()
+ };
+ if (this._file != null) {
+ map.file = this._file;
+ }
+ if (this._sourceRoot != null) {
+ map.sourceRoot = this._sourceRoot;
+ }
+ if (this._sourcesContents) {
+ map.sourcesContent = this._generateSourcesContent(
+ map.sources,
+ map.sourceRoot
+ );
+ }
+
+ return map;
+ };
+
+ /**
+ * Render the source map being generated to a string.
+ */
+ SourceMapGenerator.prototype.toString = function SourceMapGenerator_toString() {
+ return JSON.stringify(this.toJSON());
+ };
+
+ exports.SourceMapGenerator = SourceMapGenerator;
+
+ /***/
+ },
+ /* 6 */
+ /***/ function(module, exports, __webpack_require__) {
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ *
+ * Based on the Base 64 VLQ implementation in Closure Compiler:
+ * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java
+ *
+ * Copyright 2011 The Closure Compiler Authors. All rights reserved.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following
+ * disclaimer in the documentation and/or other materials provided
+ * with the distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+ var base64 = __webpack_require__(22);
+
+ // A single base 64 digit can contain 6 bits of data. For the base 64 variable
+ // length quantities we use in the source map spec, the first bit is the sign,
+ // the next four bits are the actual value, and the 6th bit is the
+ // continuation bit. The continuation bit tells us whether there are more
+ // digits in this value following this digit.
+ //
+ // Continuation
+ // | Sign
+ // | |
+ // V V
+ // 101011
+
+ var VLQ_BASE_SHIFT = 5;
+
+ // binary: 100000
+ var VLQ_BASE = 1 << VLQ_BASE_SHIFT;
+
+ // binary: 011111
+ var VLQ_BASE_MASK = VLQ_BASE - 1;
+
+ // binary: 100000
+ var VLQ_CONTINUATION_BIT = VLQ_BASE;
+
+ /**
+ * Converts from a two-complement value to a value where the sign bit is
+ * placed in the least significant bit. For example, as decimals:
+ * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary)
+ * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary)
+ */
+ function toVLQSigned(aValue) {
+ return aValue < 0 ? (-aValue << 1) + 1 : (aValue << 1) + 0;
+ }
+
+ /**
+ * Converts to a two-complement value from a value where the sign bit is
+ * placed in the least significant bit. For example, as decimals:
+ * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1
+ * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2
+ */
+ function fromVLQSigned(aValue) {
+ var isNegative = (aValue & 1) === 1;
+ var shifted = aValue >> 1;
+ return isNegative ? -shifted : shifted;
+ }
+
+ /**
+ * Returns the base 64 VLQ encoded value.
+ */
+ exports.encode = function base64VLQ_encode(aValue) {
+ var encoded = "";
+ var digit;
+
+ var vlq = toVLQSigned(aValue);
+
+ do {
+ digit = vlq & VLQ_BASE_MASK;
+ vlq >>>= VLQ_BASE_SHIFT;
+ if (vlq > 0) {
+ // There are still more digits in this value, so we must make sure the
+ // continuation bit is marked.
+ digit |= VLQ_CONTINUATION_BIT;
+ }
+ encoded += base64.encode(digit);
+ } while (vlq > 0);
+
+ return encoded;
+ };
+
+ /**
+ * Decodes the next base 64 VLQ value from the given string and returns the
+ * value and the rest of the string via the out parameter.
+ */
+ exports.decode = function base64VLQ_decode(
+ aStr,
+ aIndex,
+ aOutParam
+ ) {
+ var strLen = aStr.length;
+ var result = 0;
+ var shift = 0;
+ var continuation, digit;
+
+ do {
+ if (aIndex >= strLen) {
+ throw new Error(
+ "Expected more digits in base 64 VLQ value."
+ );
+ }
+
+ digit = base64.decode(aStr.charCodeAt(aIndex++));
+ if (digit === -1) {
+ throw new Error(
+ "Invalid base64 digit: " + aStr.charAt(aIndex - 1)
+ );
+ }
+
+ continuation = !!(digit & VLQ_CONTINUATION_BIT);
+ digit &= VLQ_BASE_MASK;
+ result = result + (digit << shift);
+ shift += VLQ_BASE_SHIFT;
+ } while (continuation);
+
+ aOutParam.value = fromVLQSigned(result);
+ aOutParam.rest = aIndex;
+ };
+
+ /***/
+ },
+ /* 7 */
+ /***/ function(module, exports, __webpack_require__) {
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ var util = __webpack_require__(0);
+ var has = Object.prototype.hasOwnProperty;
+
+ /**
+ * A data structure which is a combination of an array and a set. Adding a new
+ * member is O(1), testing for membership is O(1), and finding the index of an
+ * element is O(1). Removing elements from the set is not supported. Only
+ * strings are supported for membership.
+ */
+ function ArraySet() {
+ this._array = [];
+ this._set = Object.create(null);
+ }
+
+ /**
+ * Static method for creating ArraySet instances from an existing array.
+ */
+ ArraySet.fromArray = function ArraySet_fromArray(
+ aArray,
+ aAllowDuplicates
+ ) {
+ var set = new ArraySet();
+ for (var i = 0, len = aArray.length; i < len; i++) {
+ set.add(aArray[i], aAllowDuplicates);
+ }
+ return set;
+ };
+
+ /**
+ * Return how many unique items are in this ArraySet. If duplicates have been
+ * added, than those do not count towards the size.
+ *
+ * @returns Number
+ */
+ ArraySet.prototype.size = function ArraySet_size() {
+ return Object.getOwnPropertyNames(this._set).length;
+ };
+
+ /**
+ * Add the given string to this set.
+ *
+ * @param String aStr
+ */
+ ArraySet.prototype.add = function ArraySet_add(
+ aStr,
+ aAllowDuplicates
+ ) {
+ var sStr = util.toSetString(aStr);
+ var isDuplicate = has.call(this._set, sStr);
+ var idx = this._array.length;
+ if (!isDuplicate || aAllowDuplicates) {
+ this._array.push(aStr);
+ }
+ if (!isDuplicate) {
+ this._set[sStr] = idx;
+ }
+ };
+
+ /**
+ * Is the given string a member of this set?
+ *
+ * @param String aStr
+ */
+ ArraySet.prototype.has = function ArraySet_has(aStr) {
+ var sStr = util.toSetString(aStr);
+ return has.call(this._set, sStr);
+ };
+
+ /**
+ * What is the index of the given string in the array?
+ *
+ * @param String aStr
+ */
+ ArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {
+ var sStr = util.toSetString(aStr);
+ if (has.call(this._set, sStr)) {
+ return this._set[sStr];
+ }
+ throw new Error('"' + aStr + '" is not in the set.');
+ };
+
+ /**
+ * What is the element at the given index?
+ *
+ * @param Number aIdx
+ */
+ ArraySet.prototype.at = function ArraySet_at(aIdx) {
+ if (aIdx >= 0 && aIdx < this._array.length) {
+ return this._array[aIdx];
+ }
+ throw new Error("No element indexed by " + aIdx);
+ };
+
+ /**
+ * Returns the array representation of this set (which has the proper indices
+ * indicated by indexOf). Note that this is a copy of the internal array used
+ * for storing the members so that no one can mess with internal state.
+ */
+ ArraySet.prototype.toArray = function ArraySet_toArray() {
+ return this._array.slice();
+ };
+
+ exports.ArraySet = ArraySet;
+
+ /***/
+ },
+ /* 8 */
+ /***/ function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ /* harmony export (binding) */ __webpack_require__.d(
+ __webpack_exports__,
+ "a",
+ function() {
+ return getLinesAround;
+ }
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__stack_frame__ = __webpack_require__(
+ 1
+ );
+ /**
+ * Copyright (c) 2015-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+ /**
+ *
+ * @param {number} line The line number to provide context around.
+ * @param {number} count The number of lines you'd like for context.
+ * @param {string[] | string} lines The source code.
+ */
+ function getLinesAround(line, count, lines) {
+ if (typeof lines === "string") {
+ lines = lines.split("\n");
+ }
+ var result = [];
+ for (
+ var index = Math.max(0, line - 1 - count);
+ index <= Math.min(lines.length - 1, line - 1 + count);
+ ++index
+ ) {
+ result.push(
+ new __WEBPACK_IMPORTED_MODULE_0__stack_frame__[
+ "a" /* ScriptLine */
+ ](index + 1, lines[index], index === line - 1)
+ );
+ }
+ return result;
+ }
+
+ /* unused harmony default export */ var _unused_webpack_default_export = getLinesAround;
+
+ /***/
+ },
+ /* 9 */
+ /***/ function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ Object.defineProperty(__webpack_exports__, "__esModule", {
+ value: true
+ });
+ /* WEBPACK VAR INJECTION */ (function(process) {
+ /* harmony export (immutable) */ __webpack_exports__[
+ "setEditorHandler"
+ ] = setEditorHandler;
+ /* harmony export (immutable) */ __webpack_exports__[
+ "reportBuildError"
+ ] = reportBuildError;
+ /* harmony export (immutable) */ __webpack_exports__[
+ "dismissBuildError"
+ ] = dismissBuildError;
+ /* harmony export (immutable) */ __webpack_exports__[
+ "startReportingRuntimeErrors"
+ ] = startReportingRuntimeErrors;
+ /* harmony export (immutable) */ __webpack_exports__[
+ "stopReportingRuntimeErrors"
+ ] = stopReportingRuntimeErrors;
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__listenToRuntimeErrors__ = __webpack_require__(
+ 10
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__styles__ = __webpack_require__(
+ 31
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__utils_dom_css__ = __webpack_require__(
+ 32
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_iframeScript__ = __webpack_require__(
+ 33
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_iframeScript___default = __webpack_require__.n(
+ __WEBPACK_IMPORTED_MODULE_3_iframeScript__
+ );
+ /**
+ * Copyright (c) 2015-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+ // Importing iframe-bundle generated in the pre build step as
+ // a text using webpack raw-loader. See webpack.config.js file.
+ // $FlowFixMe
+
+ var iframe = null;
+ var isLoadingIframe = false;
+ var isIframeReady = false;
+
+ var editorHandler = null;
+ var currentBuildError = null;
+ var currentRuntimeErrorRecords = [];
+ var currentRuntimeErrorOptions = null;
+ var stopListeningToRuntimeErrors = null;
+
+ function setEditorHandler(handler) {
+ editorHandler = handler;
+ if (iframe) {
+ update();
+ }
+ }
+
+ function reportBuildError(error) {
+ currentBuildError = error;
+ update();
+ }
+
+ function dismissBuildError() {
+ currentBuildError = null;
+ update();
+ }
+
+ function startReportingRuntimeErrors(options) {
+ if (stopListeningToRuntimeErrors !== null) {
+ throw new Error("Already listening");
+ }
+ if (options.launchEditorEndpoint) {
+ console.warn(
+ "Warning: `startReportingRuntimeErrors` doesn’t accept " +
+ "`launchEditorEndpoint` argument anymore. Use `listenToOpenInEditor` " +
+ "instead with your own implementation to open errors in editor "
+ );
+ }
+ currentRuntimeErrorOptions = options;
+ Object(
+ __WEBPACK_IMPORTED_MODULE_0__listenToRuntimeErrors__[
+ "a" /* listenToRuntimeErrors */
+ ]
+ )(function(errorRecord) {
+ try {
+ if (typeof options.onError === "function") {
+ options.onError.call(null);
+ }
+ } finally {
+ handleRuntimeError(errorRecord);
+ }
+ }, options.filename);
+ }
+
+ function handleRuntimeError(errorRecord) {
+ if (
+ currentRuntimeErrorRecords.some(function(_ref) {
+ var error = _ref.error;
+ return error === errorRecord.error;
+ })
+ ) {
+ // Deduplicate identical errors.
+ // This fixes https://github.com/facebookincubator/create-react-app/issues/3011.
+ return;
+ }
+ currentRuntimeErrorRecords = currentRuntimeErrorRecords.concat(
+ [errorRecord]
+ );
+ update();
+ }
+
+ function dismissRuntimeErrors() {
+ currentRuntimeErrorRecords = [];
+ update();
+ }
+
+ function stopReportingRuntimeErrors() {
+ if (stopListeningToRuntimeErrors === null) {
+ throw new Error("Not currently listening");
+ }
+ currentRuntimeErrorOptions = null;
+ try {
+ stopListeningToRuntimeErrors();
+ } finally {
+ stopListeningToRuntimeErrors = null;
+ }
+ }
+
+ function update() {
+ // Loading iframe can be either sync or async depending on the browser.
+ if (isLoadingIframe) {
+ // Iframe is loading.
+ // First render will happen soon--don't need to do anything.
+ return;
+ }
+ if (isIframeReady) {
+ // Iframe is ready.
+ // Just update it.
+ updateIframeContent();
+ return;
+ }
+ // We need to schedule the first render.
+ isLoadingIframe = true;
+ var loadingIframe = window.document.createElement("iframe");
+ Object(
+ __WEBPACK_IMPORTED_MODULE_2__utils_dom_css__[
+ "a" /* applyStyles */
+ ]
+ )(
+ loadingIframe,
+ __WEBPACK_IMPORTED_MODULE_1__styles__[
+ "a" /* iframeStyle */
+ ]
+ );
+ loadingIframe.onload = function() {
+ var iframeDocument = loadingIframe.contentDocument;
+ if (
+ iframeDocument != null &&
+ iframeDocument.body != null
+ ) {
+ iframe = loadingIframe;
+ var script = loadingIframe.contentWindow.document.createElement(
+ "script"
+ );
+ script.type = "text/javascript";
+ script.innerHTML =
+ __WEBPACK_IMPORTED_MODULE_3_iframeScript___default.a;
+ iframeDocument.body.appendChild(script);
+ }
+ };
+ var appDocument = window.document;
+ appDocument.body.appendChild(loadingIframe);
+ }
+
+ function updateIframeContent() {
+ if (!currentRuntimeErrorOptions) {
+ throw new Error("Expected options to be injected.");
+ }
+
+ if (!iframe) {
+ throw new Error("Iframe has not been created yet.");
+ }
+
+ var isRendered = iframe.contentWindow.updateContent({
+ currentBuildError: currentBuildError,
+ currentRuntimeErrorRecords: currentRuntimeErrorRecords,
+ dismissRuntimeErrors: dismissRuntimeErrors,
+ editorHandler: editorHandler
+ });
+
+ if (!isRendered) {
+ window.document.body.removeChild(iframe);
+ iframe = null;
+ isIframeReady = false;
+ }
+ }
+
+ window.__REACT_ERROR_OVERLAY_GLOBAL_HOOK__ =
+ window.__REACT_ERROR_OVERLAY_GLOBAL_HOOK__ || {};
+ window.__REACT_ERROR_OVERLAY_GLOBAL_HOOK__.iframeReady = function iframeReady() {
+ isIframeReady = true;
+ isLoadingIframe = false;
+ updateIframeContent();
+ };
+
+ if (process.env.NODE_ENV === "production") {
+ console.warn(
+ "react-error-overlay is not meant for use in production. You should " +
+ "ensure it is not included in your build to reduce bundle size."
+ );
+ }
+ /* WEBPACK VAR INJECTION */
+ }.call(__webpack_exports__, __webpack_require__(3)));
+
+ /***/
+ },
+ /* 10 */
+ /***/ function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ /* harmony export (immutable) */ __webpack_exports__[
+ "a"
+ ] = listenToRuntimeErrors;
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__effects_unhandledError__ = __webpack_require__(
+ 11
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__effects_unhandledRejection__ = __webpack_require__(
+ 12
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__effects_stackTraceLimit__ = __webpack_require__(
+ 13
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__effects_proxyConsole__ = __webpack_require__(
+ 14
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__utils_warnings__ = __webpack_require__(
+ 15
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__utils_getStackFrames__ = __webpack_require__(
+ 16
+ );
+ /**
+ * Copyright (c) 2015-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+ var CONTEXT_SIZE = 3;
+
+ function listenToRuntimeErrors(crash) {
+ var filename =
+ arguments.length > 1 && arguments[1] !== undefined
+ ? arguments[1]
+ : "/static/js/bundle.js";
+
+ function crashWithFrames(error) {
+ var unhandledRejection =
+ arguments.length > 1 && arguments[1] !== undefined
+ ? arguments[1]
+ : false;
+
+ Object(
+ __WEBPACK_IMPORTED_MODULE_5__utils_getStackFrames__[
+ "a" /* default */
+ ]
+ )(error, unhandledRejection, CONTEXT_SIZE)
+ .then(function(stackFrames) {
+ if (stackFrames == null) {
+ return;
+ }
+ crash({
+ error: error,
+ unhandledRejection: unhandledRejection,
+ contextSize: CONTEXT_SIZE,
+ stackFrames: stackFrames
+ });
+ })
+ .catch(function(e) {
+ console.log(
+ "Could not get the stack frames of error:",
+ e
+ );
+ });
+ }
+ Object(
+ __WEBPACK_IMPORTED_MODULE_0__effects_unhandledError__[
+ "a" /* register */
+ ]
+ )(window, function(error) {
+ return crashWithFrames(error, false);
+ });
+ Object(
+ __WEBPACK_IMPORTED_MODULE_1__effects_unhandledRejection__[
+ "a" /* register */
+ ]
+ )(window, function(error) {
+ return crashWithFrames(error, true);
+ });
+ Object(
+ __WEBPACK_IMPORTED_MODULE_2__effects_stackTraceLimit__[
+ "a" /* register */
+ ]
+ )();
+ Object(
+ __WEBPACK_IMPORTED_MODULE_3__effects_proxyConsole__[
+ "b" /* registerReactStack */
+ ]
+ )();
+ Object(
+ __WEBPACK_IMPORTED_MODULE_3__effects_proxyConsole__[
+ "a" /* permanentRegister */
+ ]
+ )("error", function(warning, stack) {
+ var data = Object(
+ __WEBPACK_IMPORTED_MODULE_4__utils_warnings__[
+ "a" /* massage */
+ ]
+ )(warning, stack);
+ crashWithFrames(
+ // $FlowFixMe
+ {
+ message: data.message,
+ stack: data.stack,
+ __unmap_source: filename
+ },
+ false
+ );
+ });
+
+ return function stopListening() {
+ Object(
+ __WEBPACK_IMPORTED_MODULE_2__effects_stackTraceLimit__[
+ "b" /* unregister */
+ ]
+ )();
+ Object(
+ __WEBPACK_IMPORTED_MODULE_1__effects_unhandledRejection__[
+ "b" /* unregister */
+ ]
+ )(window);
+ Object(
+ __WEBPACK_IMPORTED_MODULE_0__effects_unhandledError__[
+ "b" /* unregister */
+ ]
+ )(window);
+ Object(
+ __WEBPACK_IMPORTED_MODULE_3__effects_proxyConsole__[
+ "c" /* unregisterReactStack */
+ ]
+ )();
+ };
+ }
+
+ /***/
+ },
+ /* 11 */
+ /***/ function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ /* harmony export (binding) */ __webpack_require__.d(
+ __webpack_exports__,
+ "a",
+ function() {
+ return registerUnhandledError;
+ }
+ );
+ /* harmony export (binding) */ __webpack_require__.d(
+ __webpack_exports__,
+ "b",
+ function() {
+ return unregisterUnhandledError;
+ }
+ );
+ /**
+ * Copyright (c) 2015-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+ var boundErrorHandler = null;
+
+ function errorHandler(callback, e) {
+ if (!e.error) {
+ return;
+ }
+ // $FlowFixMe
+ var error = e.error;
+
+ if (error instanceof Error) {
+ callback(error);
+ } else {
+ // A non-error was thrown, we don't have a trace. :(
+ // Look in your browser's devtools for more information
+ callback(new Error(error));
+ }
+ }
+
+ function registerUnhandledError(target, callback) {
+ if (boundErrorHandler !== null) {
+ return;
+ }
+ boundErrorHandler = errorHandler.bind(undefined, callback);
+ target.addEventListener("error", boundErrorHandler);
+ }
+
+ function unregisterUnhandledError(target) {
+ if (boundErrorHandler === null) {
+ return;
+ }
+ target.removeEventListener("error", boundErrorHandler);
+ boundErrorHandler = null;
+ }
+
+ /***/
+ },
+ /* 12 */
+ /***/ function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ /* harmony export (binding) */ __webpack_require__.d(
+ __webpack_exports__,
+ "a",
+ function() {
+ return registerUnhandledRejection;
+ }
+ );
+ /* harmony export (binding) */ __webpack_require__.d(
+ __webpack_exports__,
+ "b",
+ function() {
+ return unregisterUnhandledRejection;
+ }
+ );
+ /**
+ * Copyright (c) 2015-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+ var boundRejectionHandler = null;
+
+ function rejectionHandler(callback, e) {
+ if (e == null || e.reason == null) {
+ return callback(new Error("Unknown"));
+ }
+ var reason = e.reason;
+
+ if (reason instanceof Error) {
+ return callback(reason);
+ }
+ // A non-error was rejected, we don't have a trace :(
+ // Look in your browser's devtools for more information
+ return callback(new Error(reason));
+ }
+
+ function registerUnhandledRejection(target, callback) {
+ if (boundRejectionHandler !== null) {
+ return;
+ }
+ boundRejectionHandler = rejectionHandler.bind(
+ undefined,
+ callback
+ );
+ // $FlowFixMe
+ target.addEventListener(
+ "unhandledrejection",
+ boundRejectionHandler
+ );
+ }
+
+ function unregisterUnhandledRejection(target) {
+ if (boundRejectionHandler === null) {
+ return;
+ }
+ // $FlowFixMe
+ target.removeEventListener(
+ "unhandledrejection",
+ boundRejectionHandler
+ );
+ boundRejectionHandler = null;
+ }
+
+ /***/
+ },
+ /* 13 */
+ /***/ function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ /* harmony export (binding) */ __webpack_require__.d(
+ __webpack_exports__,
+ "a",
+ function() {
+ return registerStackTraceLimit;
+ }
+ );
+ /* harmony export (binding) */ __webpack_require__.d(
+ __webpack_exports__,
+ "b",
+ function() {
+ return unregisterStackTraceLimit;
+ }
+ );
+ /**
+ * Copyright (c) 2015-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+ var stackTraceRegistered = false;
+ // Default: https://docs.microsoft.com/en-us/scripting/javascript/reference/stacktracelimit-property-error-javascript
+ var restoreStackTraceValue = 10;
+
+ var MAX_STACK_LENGTH = 50;
+
+ function registerStackTraceLimit() {
+ var limit =
+ arguments.length > 0 && arguments[0] !== undefined
+ ? arguments[0]
+ : MAX_STACK_LENGTH;
+
+ if (stackTraceRegistered) {
+ return;
+ }
+ try {
+ restoreStackTraceValue = Error.stackTraceLimit;
+ Error.stackTraceLimit = limit;
+ stackTraceRegistered = true;
+ } catch (e) {
+ // Not all browsers support this so we don't care if it errors
+ }
+ }
+
+ function unregisterStackTraceLimit() {
+ if (!stackTraceRegistered) {
+ return;
+ }
+ try {
+ Error.stackTraceLimit = restoreStackTraceValue;
+ stackTraceRegistered = false;
+ } catch (e) {
+ // Not all browsers support this so we don't care if it errors
+ }
+ }
+
+ /***/
+ },
+ /* 14 */
+ /***/ function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ /* harmony export (binding) */ __webpack_require__.d(
+ __webpack_exports__,
+ "a",
+ function() {
+ return permanentRegister;
+ }
+ );
+ /* harmony export (binding) */ __webpack_require__.d(
+ __webpack_exports__,
+ "b",
+ function() {
+ return registerReactStack;
+ }
+ );
+ /* harmony export (binding) */ __webpack_require__.d(
+ __webpack_exports__,
+ "c",
+ function() {
+ return unregisterReactStack;
+ }
+ );
+
+ var reactFrameStack = []; /**
+ * Copyright (c) 2015-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+ // This is a stripped down barebones version of this proposal:
+ // https://gist.github.com/sebmarkbage/bdefa100f19345229d526d0fdd22830f
+ // We're implementing just enough to get the invalid element type warnings
+ // to display the component stack in React 15.6+:
+ // https://github.com/facebook/react/pull/9679
+ /// TODO: a more comprehensive implementation.
+
+ var registerReactStack = function registerReactStack() {
+ if (typeof console !== "undefined") {
+ // $FlowFixMe
+ console.reactStack = function(frames) {
+ return reactFrameStack.push(frames);
+ };
+ // $FlowFixMe
+ console.reactStackEnd = function(frames) {
+ return reactFrameStack.pop();
+ };
+ }
+ };
+
+ var unregisterReactStack = function unregisterReactStack() {
+ if (typeof console !== "undefined") {
+ // $FlowFixMe
+ console.reactStack = undefined;
+ // $FlowFixMe
+ console.reactStackEnd = undefined;
+ }
+ };
+
+ var permanentRegister = function proxyConsole(type, callback) {
+ if (typeof console !== "undefined") {
+ var orig = console[type];
+ if (typeof orig === "function") {
+ console[
+ type
+ ] = function __stack_frame_overlay_proxy_console__() {
+ try {
+ var _message = arguments[0];
+ if (
+ typeof _message === "string" &&
+ reactFrameStack.length > 0
+ ) {
+ callback(
+ _message,
+ reactFrameStack[reactFrameStack.length - 1]
+ );
+ }
+ } catch (err) {
+ // Warnings must never crash. Rethrow with a clean stack.
+ setTimeout(function() {
+ throw err;
+ });
+ }
+ return orig.apply(this, arguments);
+ };
+ }
+ }
+ };
+
+ /***/
+ },
+ /* 15 */
+ /***/ function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ /* harmony export (binding) */ __webpack_require__.d(
+ __webpack_exports__,
+ "a",
+ function() {
+ return massage;
+ }
+ );
+
+ function stripInlineStacktrace(message) {
+ return message
+ .split("\n")
+ .filter(function(line) {
+ return !line.match(/^\s*in/);
+ })
+ .join("\n"); // " in Foo"
+ } /**
+ * Copyright (c) 2015-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+ function massage(warning, frames) {
+ var message = stripInlineStacktrace(warning);
+
+ // Reassemble the stack with full filenames provided by React
+ var stack = "";
+ var lastFilename = void 0;
+ var lastLineNumber = void 0;
+ for (var index = 0; index < frames.length; ++index) {
+ var _frames$index = frames[index],
+ fileName = _frames$index.fileName,
+ lineNumber = _frames$index.lineNumber;
+
+ if (fileName == null || lineNumber == null) {
+ continue;
+ }
+
+ // TODO: instead, collapse them in the UI
+ if (
+ fileName === lastFilename &&
+ typeof lineNumber === "number" &&
+ typeof lastLineNumber === "number" &&
+ Math.abs(lineNumber - lastLineNumber) < 3
+ ) {
+ continue;
+ }
+ lastFilename = fileName;
+ lastLineNumber = lineNumber;
+
+ var name = frames[index].name;
+
+ name = name || "(anonymous function)";
+ stack +=
+ "in " +
+ name +
+ " (at " +
+ fileName +
+ ":" +
+ lineNumber +
+ ")\n";
+ }
+
+ return { message: message, stack: stack };
+ }
+
+ /***/
+ },
+ /* 16 */
+ /***/ function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ /* unused harmony export getStackFrames */
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__parser__ = __webpack_require__(
+ 17
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__mapper__ = __webpack_require__(
+ 18
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__unmapper__ = __webpack_require__(
+ 29
+ );
+
+ /**
+ * Copyright (c) 2015-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+ function getStackFrames(error) {
+ var unhandledRejection =
+ arguments.length > 1 && arguments[1] !== undefined
+ ? arguments[1]
+ : false;
+ var contextSize =
+ arguments.length > 2 && arguments[2] !== undefined
+ ? arguments[2]
+ : 3;
+
+ var parsedFrames = Object(
+ __WEBPACK_IMPORTED_MODULE_0__parser__["a" /* parse */]
+ )(error);
+ var enhancedFramesPromise = void 0;
+ if (error.__unmap_source) {
+ enhancedFramesPromise = Object(
+ __WEBPACK_IMPORTED_MODULE_2__unmapper__["a" /* unmap */]
+ )(
+ // $FlowFixMe
+ error.__unmap_source,
+ parsedFrames,
+ contextSize
+ );
+ } else {
+ enhancedFramesPromise = Object(
+ __WEBPACK_IMPORTED_MODULE_1__mapper__["a" /* map */]
+ )(parsedFrames, contextSize);
+ }
+ return enhancedFramesPromise.then(function(enhancedFrames) {
+ if (
+ enhancedFrames
+ .map(function(f) {
+ return f._originalFileName;
+ })
+ .filter(function(f) {
+ return f != null && f.indexOf("node_modules") === -1;
+ }).length === 0
+ ) {
+ return null;
+ }
+ return enhancedFrames.filter(function(_ref) {
+ var functionName = _ref.functionName;
+ return (
+ functionName == null ||
+ functionName.indexOf(
+ "__stack_frame_overlay_proxy_console__"
+ ) === -1
+ );
+ });
+ });
+ }
+
+ /* harmony default export */ __webpack_exports__[
+ "a"
+ ] = getStackFrames;
+
+ /***/
+ },
+ /* 17 */
+ /***/ function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ /* harmony export (binding) */ __webpack_require__.d(
+ __webpack_exports__,
+ "a",
+ function() {
+ return parseError;
+ }
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__stack_frame__ = __webpack_require__(
+ 1
+ );
+ function _toConsumableArray(arr) {
+ if (Array.isArray(arr)) {
+ for (
+ var i = 0, arr2 = Array(arr.length);
+ i < arr.length;
+ i++
+ ) {
+ arr2[i] = arr[i];
+ }
+ return arr2;
+ } else {
+ return Array.from(arr);
+ }
+ }
+
+ /**
+ * Copyright (c) 2015-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+ var regexExtractLocation = /\(?(.+?)(?::(\d+))?(?::(\d+))?\)?$/;
+
+ function extractLocation(token) {
+ return regexExtractLocation
+ .exec(token)
+ .slice(1)
+ .map(function(v) {
+ var p = Number(v);
+ if (!isNaN(p)) {
+ return p;
+ }
+ return v;
+ });
+ }
+
+ var regexValidFrame_Chrome = /^\s*(at|in)\s.+(:\d+)/;
+ var regexValidFrame_FireFox = /(^|@)\S+:\d+|.+line\s+\d+\s+>\s+(eval|Function).+/;
+
+ function parseStack(stack) {
+ var frames = stack
+ .filter(function(e) {
+ return (
+ regexValidFrame_Chrome.test(e) ||
+ regexValidFrame_FireFox.test(e)
+ );
+ })
+ .map(function(e) {
+ if (regexValidFrame_FireFox.test(e)) {
+ // Strip eval, we don't care about it
+ var isEval = false;
+ if (/ > (eval|Function)/.test(e)) {
+ e = e.replace(
+ / line (\d+)(?: > eval line \d+)* > (eval|Function):\d+:\d+/g,
+ ":$1"
+ );
+ isEval = true;
+ }
+ var data = e.split(/[@]/g);
+ var last = data.pop();
+ return new (Function.prototype.bind.apply(
+ __WEBPACK_IMPORTED_MODULE_0__stack_frame__[
+ "b" /* default */
+ ],
+ [null].concat(
+ [data.join("@") || (isEval ? "eval" : null)],
+ _toConsumableArray(extractLocation(last))
+ )
+ ))();
+ } else {
+ // Strip eval, we don't care about it
+ if (e.indexOf("(eval ") !== -1) {
+ e = e.replace(/(\(eval at [^()]*)|(\),.*$)/g, "");
+ }
+ if (e.indexOf("(at ") !== -1) {
+ e = e.replace(/\(at /, "(");
+ }
+ var _data = e
+ .trim()
+ .split(/\s+/g)
+ .slice(1);
+ var _last = _data.pop();
+ return new (Function.prototype.bind.apply(
+ __WEBPACK_IMPORTED_MODULE_0__stack_frame__[
+ "b" /* default */
+ ],
+ [null].concat(
+ [_data.join(" ") || null],
+ _toConsumableArray(extractLocation(_last))
+ )
+ ))();
+ }
+ });
+ return frames;
+ }
+
+ /**
+ * Turns an <code>Error</code>, or similar object, into a set of <code>StackFrame</code>s.
+ * @alias parse
+ */
+ function parseError(error) {
+ if (error == null) {
+ throw new Error("You cannot pass a null object.");
+ }
+ if (typeof error === "string") {
+ return parseStack(error.split("\n"));
+ }
+ if (Array.isArray(error)) {
+ return parseStack(error);
+ }
+ if (typeof error.stack === "string") {
+ return parseStack(error.stack.split("\n"));
+ }
+ throw new Error(
+ "The error you provided does not contain a stack trace."
+ );
+ }
+
+ /* unused harmony default export */ var _unused_webpack_default_export = parseError;
+
+ /***/
+ },
+ /* 18 */
+ /***/ function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ /* harmony export (binding) */ __webpack_require__.d(
+ __webpack_exports__,
+ "a",
+ function() {
+ return map;
+ }
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator__ = __webpack_require__(
+ 2
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default = __webpack_require__.n(
+ __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator__
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__stack_frame__ = __webpack_require__(
+ 1
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__getSourceMap__ = __webpack_require__(
+ 4
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__getLinesAround__ = __webpack_require__(
+ 8
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_settle_promise__ = __webpack_require__(
+ 28
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_settle_promise___default = __webpack_require__.n(
+ __WEBPACK_IMPORTED_MODULE_4_settle_promise__
+ );
+
+ /**
+ * Enhances a set of <code>StackFrame</code>s with their original positions and code (when available).
+ * @param {StackFrame[]} frames A set of <code>StackFrame</code>s which contain (generated) code positions.
+ * @param {number} [contextLines=3] The number of lines to provide before and after the line specified in the <code>StackFrame</code>.
+ */
+ var map = (function() {
+ var _ref = _asyncToGenerator(
+ /*#__PURE__*/ __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.mark(
+ function _callee2(frames) {
+ var _this = this;
+
+ var contextLines =
+ arguments.length > 1 && arguments[1] !== undefined
+ ? arguments[1]
+ : 3;
+ var cache, files;
+ return __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.wrap(
+ function _callee2$(_context2) {
+ while (1) {
+ switch ((_context2.prev = _context2.next)) {
+ case 0:
+ cache = {};
+ files = [];
+
+ frames.forEach(function(frame) {
+ var fileName = frame.fileName;
+
+ if (fileName == null) {
+ return;
+ }
+ if (files.indexOf(fileName) !== -1) {
+ return;
+ }
+ files.push(fileName);
+ });
+ _context2.next = 5;
+ return Object(
+ __WEBPACK_IMPORTED_MODULE_4_settle_promise__[
+ "settle"
+ ]
+ )(
+ files.map(
+ (function() {
+ var _ref2 = _asyncToGenerator(
+ /*#__PURE__*/ __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.mark(
+ function _callee(fileName) {
+ var fileSource, map;
+ return __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.wrap(
+ function _callee$(_context) {
+ while (1) {
+ switch ((_context.prev =
+ _context.next)) {
+ case 0:
+ _context.next = 2;
+ return fetch(
+ fileName
+ ).then(function(r) {
+ return r.text();
+ });
+
+ case 2:
+ fileSource =
+ _context.sent;
+ _context.next = 5;
+ return Object(
+ __WEBPACK_IMPORTED_MODULE_2__getSourceMap__[
+ "a" /* getSourceMap */
+ ]
+ )(fileName, fileSource);
+
+ case 5:
+ map = _context.sent;
+
+ cache[fileName] = {
+ fileSource: fileSource,
+ map: map
+ };
+
+ case 7:
+ case "end":
+ return _context.stop();
+ }
+ }
+ },
+ _callee,
+ _this
+ );
+ }
+ )
+ );
+
+ return function(_x3) {
+ return _ref2.apply(this, arguments);
+ };
+ })()
+ )
+ );
+
+ case 5:
+ return _context2.abrupt(
+ "return",
+ frames.map(function(frame) {
+ var functionName = frame.functionName,
+ fileName = frame.fileName,
+ lineNumber = frame.lineNumber,
+ columnNumber = frame.columnNumber;
+
+ var _ref3 = cache[fileName] || {},
+ map = _ref3.map,
+ fileSource = _ref3.fileSource;
+
+ if (map == null || lineNumber == null) {
+ return frame;
+ }
+
+ var _map$getOriginalPosit = map.getOriginalPosition(
+ lineNumber,
+ columnNumber
+ ),
+ source = _map$getOriginalPosit.source,
+ line = _map$getOriginalPosit.line,
+ column = _map$getOriginalPosit.column;
+
+ var originalSource =
+ source == null
+ ? []
+ : map.getSource(source);
+ return new __WEBPACK_IMPORTED_MODULE_1__stack_frame__[
+ "b" /* default */
+ ](functionName, fileName, lineNumber, columnNumber, Object(__WEBPACK_IMPORTED_MODULE_3__getLinesAround__["a" /* getLinesAround */])(lineNumber, contextLines, fileSource), functionName, source, line, column, Object(__WEBPACK_IMPORTED_MODULE_3__getLinesAround__["a" /* getLinesAround */])(line, contextLines, originalSource));
+ })
+ );
+
+ case 6:
+ case "end":
+ return _context2.stop();
+ }
+ }
+ },
+ _callee2,
+ this
+ );
+ }
+ )
+ );
+
+ return function map(_x2) {
+ return _ref.apply(this, arguments);
+ };
+ })();
+
+ function _asyncToGenerator(fn) {
+ return function() {
+ var gen = fn.apply(this, arguments);
+ return new Promise(function(resolve, reject) {
+ function step(key, arg) {
+ try {
+ var info = gen[key](arg);
+ var value = info.value;
+ } catch (error) {
+ reject(error);
+ return;
+ }
+ if (info.done) {
+ resolve(value);
+ } else {
+ return Promise.resolve(value).then(
+ function(value) {
+ step("next", value);
+ },
+ function(err) {
+ step("throw", err);
+ }
+ );
+ }
+ }
+ return step("next");
+ });
+ };
+ }
+
+ /**
+ * Copyright (c) 2015-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+ /* unused harmony default export */ var _unused_webpack_default_export = map;
+
+ /***/
+ },
+ /* 19 */
+ /***/ function(module, exports, __webpack_require__) {
+ // This method of obtaining a reference to the global object needs to be
+ // kept identical to the way it is obtained in runtime.js
+ var g =
+ (function() {
+ return this;
+ })() || Function("return this")();
+
+ // Use `getOwnPropertyNames` because not all browsers support calling
+ // `hasOwnProperty` on the global `self` object in a worker. See #183.
+ var hadRuntime =
+ g.regeneratorRuntime &&
+ Object.getOwnPropertyNames(g).indexOf("regeneratorRuntime") >=
+ 0;
+
+ // Save the old regeneratorRuntime in case it needs to be restored later.
+ var oldRuntime = hadRuntime && g.regeneratorRuntime;
+
+ // Force reevalutation of runtime.js.
+ g.regeneratorRuntime = undefined;
+
+ module.exports = __webpack_require__(20);
+
+ if (hadRuntime) {
+ // Restore the original runtime.
+ g.regeneratorRuntime = oldRuntime;
+ } else {
+ // Remove the global property added by runtime.js.
+ try {
+ delete g.regeneratorRuntime;
+ } catch (e) {
+ g.regeneratorRuntime = undefined;
+ }
+ }
+
+ /***/
+ },
+ /* 20 */
+ /***/ function(module, exports) {
+ /**
+ * Copyright (c) 2014, Facebook, Inc.
+ * All rights reserved.
+ *
+ * This source code is licensed under the BSD-style license found in the
+ * https://raw.github.com/facebook/regenerator/master/LICENSE file. An
+ * additional grant of patent rights can be found in the PATENTS file in
+ * the same directory.
+ */
+
+ !(function(global) {
+ "use strict";
+
+ var Op = Object.prototype;
+ var hasOwn = Op.hasOwnProperty;
+ var undefined; // More compressible than void 0.
+ var $Symbol = typeof Symbol === "function" ? Symbol : {};
+ var iteratorSymbol = $Symbol.iterator || "@@iterator";
+ var asyncIteratorSymbol =
+ $Symbol.asyncIterator || "@@asyncIterator";
+ var toStringTagSymbol =
+ $Symbol.toStringTag || "@@toStringTag";
+
+ var inModule = typeof module === "object";
+ var runtime = global.regeneratorRuntime;
+ if (runtime) {
+ if (inModule) {
+ // If regeneratorRuntime is defined globally and we're in a module,
+ // make the exports object identical to regeneratorRuntime.
+ module.exports = runtime;
+ }
+ // Don't bother evaluating the rest of this file if the runtime was
+ // already defined globally.
+ return;
+ }
+
+ // Define the runtime globally (as expected by generated code) as either
+ // module.exports (if we're in a module) or a new, empty object.
+ runtime = global.regeneratorRuntime = inModule
+ ? module.exports
+ : {};
+
+ function wrap(innerFn, outerFn, self, tryLocsList) {
+ // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.
+ var protoGenerator =
+ outerFn && outerFn.prototype instanceof Generator
+ ? outerFn
+ : Generator;
+ var generator = Object.create(protoGenerator.prototype);
+ var context = new Context(tryLocsList || []);
+
+ // The ._invoke method unifies the implementations of the .next,
+ // .throw, and .return methods.
+ generator._invoke = makeInvokeMethod(
+ innerFn,
+ self,
+ context
+ );
+
+ return generator;
+ }
+ runtime.wrap = wrap;
+
+ // Try/catch helper to minimize deoptimizations. Returns a completion
+ // record like context.tryEntries[i].completion. This interface could
+ // have been (and was previously) designed to take a closure to be
+ // invoked without arguments, but in all the cases we care about we
+ // already have an existing method we want to call, so there's no need
+ // to create a new function object. We can even get away with assuming
+ // the method takes exactly one argument, since that happens to be true
+ // in every case, so we don't have to touch the arguments object. The
+ // only additional allocation required is the completion record, which
+ // has a stable shape and so hopefully should be cheap to allocate.
+ function tryCatch(fn, obj, arg) {
+ try {
+ return { type: "normal", arg: fn.call(obj, arg) };
+ } catch (err) {
+ return { type: "throw", arg: err };
+ }
+ }
+
+ var GenStateSuspendedStart = "suspendedStart";
+ var GenStateSuspendedYield = "suspendedYield";
+ var GenStateExecuting = "executing";
+ var GenStateCompleted = "completed";
+
+ // Returning this object from the innerFn has the same effect as
+ // breaking out of the dispatch switch statement.
+ var ContinueSentinel = {};
+
+ // Dummy constructor functions that we use as the .constructor and
+ // .constructor.prototype properties for functions that return Generator
+ // objects. For full spec compliance, you may wish to configure your
+ // minifier not to mangle the names of these two functions.
+ function Generator() {}
+ function GeneratorFunction() {}
+ function GeneratorFunctionPrototype() {}
+
+ // This is a polyfill for %IteratorPrototype% for environments that
+ // don't natively support it.
+ var IteratorPrototype = {};
+ IteratorPrototype[iteratorSymbol] = function() {
+ return this;
+ };
+
+ var getProto = Object.getPrototypeOf;
+ var NativeIteratorPrototype =
+ getProto && getProto(getProto(values([])));
+ if (
+ NativeIteratorPrototype &&
+ NativeIteratorPrototype !== Op &&
+ hasOwn.call(NativeIteratorPrototype, iteratorSymbol)
+ ) {
+ // This environment has a native %IteratorPrototype%; use it instead
+ // of the polyfill.
+ IteratorPrototype = NativeIteratorPrototype;
+ }
+
+ var Gp = (GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(
+ IteratorPrototype
+ ));
+ GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
+ GeneratorFunctionPrototype.constructor = GeneratorFunction;
+ GeneratorFunctionPrototype[
+ toStringTagSymbol
+ ] = GeneratorFunction.displayName = "GeneratorFunction";
+
+ // Helper for defining the .next, .throw, and .return methods of the
+ // Iterator interface in terms of a single ._invoke method.
+ function defineIteratorMethods(prototype) {
+ ["next", "throw", "return"].forEach(function(method) {
+ prototype[method] = function(arg) {
+ return this._invoke(method, arg);
+ };
+ });
+ }
+
+ runtime.isGeneratorFunction = function(genFun) {
+ var ctor =
+ typeof genFun === "function" && genFun.constructor;
+ return ctor
+ ? ctor === GeneratorFunction ||
+ // For the native GeneratorFunction constructor, the best we can
+ // do is to check its .name property.
+ (ctor.displayName || ctor.name) ===
+ "GeneratorFunction"
+ : false;
+ };
+
+ runtime.mark = function(genFun) {
+ if (Object.setPrototypeOf) {
+ Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
+ } else {
+ genFun.__proto__ = GeneratorFunctionPrototype;
+ if (!(toStringTagSymbol in genFun)) {
+ genFun[toStringTagSymbol] = "GeneratorFunction";
+ }
+ }
+ genFun.prototype = Object.create(Gp);
+ return genFun;
+ };
+
+ // Within the body of any async function, `await x` is transformed to
+ // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
+ // `hasOwn.call(value, "__await")` to determine if the yielded value is
+ // meant to be awaited.
+ runtime.awrap = function(arg) {
+ return { __await: arg };
+ };
+
+ function AsyncIterator(generator) {
+ function invoke(method, arg, resolve, reject) {
+ var record = tryCatch(generator[method], generator, arg);
+ if (record.type === "throw") {
+ reject(record.arg);
+ } else {
+ var result = record.arg;
+ var value = result.value;
+ if (
+ value &&
+ typeof value === "object" &&
+ hasOwn.call(value, "__await")
+ ) {
+ return Promise.resolve(value.__await).then(
+ function(value) {
+ invoke("next", value, resolve, reject);
+ },
+ function(err) {
+ invoke("throw", err, resolve, reject);
+ }
+ );
+ }
+
+ return Promise.resolve(value).then(function(unwrapped) {
+ // When a yielded Promise is resolved, its final value becomes
+ // the .value of the Promise<{value,done}> result for the
+ // current iteration. If the Promise is rejected, however, the
+ // result for this iteration will be rejected with the same
+ // reason. Note that rejections of yielded Promises are not
+ // thrown back into the generator function, as is the case
+ // when an awaited Promise is rejected. This difference in
+ // behavior between yield and await is important, because it
+ // allows the consumer to decide what to do with the yielded
+ // rejection (swallow it and continue, manually .throw it back
+ // into the generator, abandon iteration, whatever). With
+ // await, by contrast, there is no opportunity to examine the
+ // rejection reason outside the generator function, so the
+ // only option is to throw it from the await expression, and
+ // let the generator function handle the exception.
+ result.value = unwrapped;
+ resolve(result);
+ }, reject);
+ }
+ }
+
+ var previousPromise;
+
+ function enqueue(method, arg) {
+ function callInvokeWithMethodAndArg() {
+ return new Promise(function(resolve, reject) {
+ invoke(method, arg, resolve, reject);
+ });
+ }
+
+ return (previousPromise =
+ // If enqueue has been called before, then we want to wait until
+ // all previous Promises have been resolved before calling invoke,
+ // so that results are always delivered in the correct order. If
+ // enqueue has not been called before, then it is important to
+ // call invoke immediately, without waiting on a callback to fire,
+ // so that the async generator function has the opportunity to do
+ // any necessary setup in a predictable way. This predictability
+ // is why the Promise constructor synchronously invokes its
+ // executor callback, and why async functions synchronously
+ // execute code before the first await. Since we implement simple
+ // async functions in terms of async generators, it is especially
+ // important to get this right, even though it requires care.
+ previousPromise
+ ? previousPromise.then(
+ callInvokeWithMethodAndArg,
+ // Avoid propagating failures to Promises returned by later
+ // invocations of the iterator.
+ callInvokeWithMethodAndArg
+ )
+ : callInvokeWithMethodAndArg());
+ }
+
+ // Define the unified helper method that is used to implement .next,
+ // .throw, and .return (see defineIteratorMethods).
+ this._invoke = enqueue;
+ }
+
+ defineIteratorMethods(AsyncIterator.prototype);
+ AsyncIterator.prototype[asyncIteratorSymbol] = function() {
+ return this;
+ };
+ runtime.AsyncIterator = AsyncIterator;
+
+ // Note that simple async functions are implemented on top of
+ // AsyncIterator objects; they just return a Promise for the value of
+ // the final result produced by the iterator.
+ runtime.async = function(
+ innerFn,
+ outerFn,
+ self,
+ tryLocsList
+ ) {
+ var iter = new AsyncIterator(
+ wrap(innerFn, outerFn, self, tryLocsList)
+ );
+
+ return runtime.isGeneratorFunction(outerFn)
+ ? iter // If outerFn is a generator, return the full iterator.
+ : iter.next().then(function(result) {
+ return result.done ? result.value : iter.next();
+ });
+ };
+
+ function makeInvokeMethod(innerFn, self, context) {
+ var state = GenStateSuspendedStart;
+
+ return function invoke(method, arg) {
+ if (state === GenStateExecuting) {
+ throw new Error("Generator is already running");
+ }
+
+ if (state === GenStateCompleted) {
+ if (method === "throw") {
+ throw arg;
+ }
+
+ // Be forgiving, per 25.3.3.3.3 of the spec:
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
+ return doneResult();
+ }
+
+ context.method = method;
+ context.arg = arg;
+
+ while (true) {
+ var delegate = context.delegate;
+ if (delegate) {
+ var delegateResult = maybeInvokeDelegate(
+ delegate,
+ context
+ );
+ if (delegateResult) {
+ if (delegateResult === ContinueSentinel) continue;
+ return delegateResult;
+ }
+ }
+
+ if (context.method === "next") {
+ // Setting context._sent for legacy support of Babel's
+ // function.sent implementation.
+ context.sent = context._sent = context.arg;
+ } else if (context.method === "throw") {
+ if (state === GenStateSuspendedStart) {
+ state = GenStateCompleted;
+ throw context.arg;
+ }
+
+ context.dispatchException(context.arg);
+ } else if (context.method === "return") {
+ context.abrupt("return", context.arg);
+ }
+
+ state = GenStateExecuting;
+
+ var record = tryCatch(innerFn, self, context);
+ if (record.type === "normal") {
+ // If an exception is thrown from innerFn, we leave state ===
+ // GenStateExecuting and loop back for another invocation.
+ state = context.done
+ ? GenStateCompleted
+ : GenStateSuspendedYield;
+
+ if (record.arg === ContinueSentinel) {
+ continue;
+ }
+
+ return {
+ value: record.arg,
+ done: context.done
+ };
+ } else if (record.type === "throw") {
+ state = GenStateCompleted;
+ // Dispatch the exception by looping back around to the
+ // context.dispatchException(context.arg) call above.
+ context.method = "throw";
+ context.arg = record.arg;
+ }
+ }
+ };
+ }
+
+ // Call delegate.iterator[context.method](context.arg) and handle the
+ // result, either by returning a { value, done } result from the
+ // delegate iterator, or by modifying context.method and context.arg,
+ // setting context.delegate to null, and returning the ContinueSentinel.
+ function maybeInvokeDelegate(delegate, context) {
+ var method = delegate.iterator[context.method];
+ if (method === undefined) {
+ // A .throw or .return when the delegate iterator has no .throw
+ // method always terminates the yield* loop.
+ context.delegate = null;
+
+ if (context.method === "throw") {
+ if (delegate.iterator.return) {
+ // If the delegate iterator has a return method, give it a
+ // chance to clean up.
+ context.method = "return";
+ context.arg = undefined;
+ maybeInvokeDelegate(delegate, context);
+
+ if (context.method === "throw") {
+ // If maybeInvokeDelegate(context) changed context.method from
+ // "return" to "throw", let that override the TypeError below.
+ return ContinueSentinel;
+ }
+ }
+
+ context.method = "throw";
+ context.arg = new TypeError(
+ "The iterator does not provide a 'throw' method"
+ );
+ }
+
+ return ContinueSentinel;
+ }
+
+ var record = tryCatch(
+ method,
+ delegate.iterator,
+ context.arg
+ );
+
+ if (record.type === "throw") {
+ context.method = "throw";
+ context.arg = record.arg;
+ context.delegate = null;
+ return ContinueSentinel;
+ }
+
+ var info = record.arg;
+
+ if (!info) {
+ context.method = "throw";
+ context.arg = new TypeError(
+ "iterator result is not an object"
+ );
+ context.delegate = null;
+ return ContinueSentinel;
+ }
+
+ if (info.done) {
+ // Assign the result of the finished delegate to the temporary
+ // variable specified by delegate.resultName (see delegateYield).
+ context[delegate.resultName] = info.value;
+
+ // Resume execution at the desired location (see delegateYield).
+ context.next = delegate.nextLoc;
+
+ // If context.method was "throw" but the delegate handled the
+ // exception, let the outer generator proceed normally. If
+ // context.method was "next", forget context.arg since it has been
+ // "consumed" by the delegate iterator. If context.method was
+ // "return", allow the original .return call to continue in the
+ // outer generator.
+ if (context.method !== "return") {
+ context.method = "next";
+ context.arg = undefined;
+ }
+ } else {
+ // Re-yield the result returned by the delegate method.
+ return info;
+ }
+
+ // The delegate iterator is finished, so forget it and continue with
+ // the outer generator.
+ context.delegate = null;
+ return ContinueSentinel;
+ }
+
+ // Define Generator.prototype.{next,throw,return} in terms of the
+ // unified ._invoke helper method.
+ defineIteratorMethods(Gp);
+
+ Gp[toStringTagSymbol] = "Generator";
+
+ // A Generator should always return itself as the iterator object when the
+ // @@iterator function is called on it. Some browsers' implementations of the
+ // iterator prototype chain incorrectly implement this, causing the Generator
+ // object to not be returned from this call. This ensures that doesn't happen.
+ // See https://github.com/facebook/regenerator/issues/274 for more details.
+ Gp[iteratorSymbol] = function() {
+ return this;
+ };
+
+ Gp.toString = function() {
+ return "[object Generator]";
+ };
+
+ function pushTryEntry(locs) {
+ var entry = { tryLoc: locs[0] };
+
+ if (1 in locs) {
+ entry.catchLoc = locs[1];
+ }
+
+ if (2 in locs) {
+ entry.finallyLoc = locs[2];
+ entry.afterLoc = locs[3];
+ }
+
+ this.tryEntries.push(entry);
+ }
+
+ function resetTryEntry(entry) {
+ var record = entry.completion || {};
+ record.type = "normal";
+ delete record.arg;
+ entry.completion = record;
+ }
+
+ function Context(tryLocsList) {
+ // The root entry object (effectively a try statement without a catch
+ // or a finally block) gives us a place to store values thrown from
+ // locations where there is no enclosing try statement.
+ this.tryEntries = [{ tryLoc: "root" }];
+ tryLocsList.forEach(pushTryEntry, this);
+ this.reset(true);
+ }
+
+ runtime.keys = function(object) {
+ var keys = [];
+ for (var key in object) {
+ keys.push(key);
+ }
+ keys.reverse();
+
+ // Rather than returning an object with a next method, we keep
+ // things simple and return the next function itself.
+ return function next() {
+ while (keys.length) {
+ var key = keys.pop();
+ if (key in object) {
+ next.value = key;
+ next.done = false;
+ return next;
+ }
+ }
+
+ // To avoid creating an additional object, we just hang the .value
+ // and .done properties off the next function object itself. This
+ // also ensures that the minifier will not anonymize the function.
+ next.done = true;
+ return next;
+ };
+ };
+
+ function values(iterable) {
+ if (iterable) {
+ var iteratorMethod = iterable[iteratorSymbol];
+ if (iteratorMethod) {
+ return iteratorMethod.call(iterable);
+ }
+
+ if (typeof iterable.next === "function") {
+ return iterable;
+ }
+
+ if (!isNaN(iterable.length)) {
+ var i = -1,
+ next = function next() {
+ while (++i < iterable.length) {
+ if (hasOwn.call(iterable, i)) {
+ next.value = iterable[i];
+ next.done = false;
+ return next;
+ }
+ }
+
+ next.value = undefined;
+ next.done = true;
+
+ return next;
+ };
+
+ return (next.next = next);
+ }
+ }
+
+ // Return an iterator with no values.
+ return { next: doneResult };
+ }
+ runtime.values = values;
+
+ function doneResult() {
+ return { value: undefined, done: true };
+ }
+
+ Context.prototype = {
+ constructor: Context,
+
+ reset: function(skipTempReset) {
+ this.prev = 0;
+ this.next = 0;
+ // Resetting context._sent for legacy support of Babel's
+ // function.sent implementation.
+ this.sent = this._sent = undefined;
+ this.done = false;
+ this.delegate = null;
+
+ this.method = "next";
+ this.arg = undefined;
+
+ this.tryEntries.forEach(resetTryEntry);
+
+ if (!skipTempReset) {
+ for (var name in this) {
+ // Not sure about the optimal order of these conditions:
+ if (
+ name.charAt(0) === "t" &&
+ hasOwn.call(this, name) &&
+ !isNaN(+name.slice(1))
+ ) {
+ this[name] = undefined;
+ }
+ }
+ }
+ },
+
+ stop: function() {
+ this.done = true;
+
+ var rootEntry = this.tryEntries[0];
+ var rootRecord = rootEntry.completion;
+ if (rootRecord.type === "throw") {
+ throw rootRecord.arg;
+ }
+
+ return this.rval;
+ },
+
+ dispatchException: function(exception) {
+ if (this.done) {
+ throw exception;
+ }
+
+ var context = this;
+ function handle(loc, caught) {
+ record.type = "throw";
+ record.arg = exception;
+ context.next = loc;
+
+ if (caught) {
+ // If the dispatched exception was caught by a catch block,
+ // then let that catch block handle the exception normally.
+ context.method = "next";
+ context.arg = undefined;
+ }
+
+ return !!caught;
+ }
+
+ for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+ var entry = this.tryEntries[i];
+ var record = entry.completion;
+
+ if (entry.tryLoc === "root") {
+ // Exception thrown outside of any try block that could handle
+ // it, so set the completion value of the entire function to
+ // throw the exception.
+ return handle("end");
+ }
+
+ if (entry.tryLoc <= this.prev) {
+ var hasCatch = hasOwn.call(entry, "catchLoc");
+ var hasFinally = hasOwn.call(entry, "finallyLoc");
+
+ if (hasCatch && hasFinally) {
+ if (this.prev < entry.catchLoc) {
+ return handle(entry.catchLoc, true);
+ } else if (this.prev < entry.finallyLoc) {
+ return handle(entry.finallyLoc);
+ }
+ } else if (hasCatch) {
+ if (this.prev < entry.catchLoc) {
+ return handle(entry.catchLoc, true);
+ }
+ } else if (hasFinally) {
+ if (this.prev < entry.finallyLoc) {
+ return handle(entry.finallyLoc);
+ }
+ } else {
+ throw new Error(
+ "try statement without catch or finally"
+ );
+ }
+ }
+ }
+ },
+
+ abrupt: function(type, arg) {
+ for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+ var entry = this.tryEntries[i];
+ if (
+ entry.tryLoc <= this.prev &&
+ hasOwn.call(entry, "finallyLoc") &&
+ this.prev < entry.finallyLoc
+ ) {
+ var finallyEntry = entry;
+ break;
+ }
+ }
+
+ if (
+ finallyEntry &&
+ (type === "break" || type === "continue") &&
+ finallyEntry.tryLoc <= arg &&
+ arg <= finallyEntry.finallyLoc
+ ) {
+ // Ignore the finally entry if control is not jumping to a
+ // location outside the try/catch block.
+ finallyEntry = null;
+ }
+
+ var record = finallyEntry ? finallyEntry.completion : {};
+ record.type = type;
+ record.arg = arg;
+
+ if (finallyEntry) {
+ this.method = "next";
+ this.next = finallyEntry.finallyLoc;
+ return ContinueSentinel;
+ }
+
+ return this.complete(record);
+ },
+
+ complete: function(record, afterLoc) {
+ if (record.type === "throw") {
+ throw record.arg;
+ }
+
+ if (
+ record.type === "break" ||
+ record.type === "continue"
+ ) {
+ this.next = record.arg;
+ } else if (record.type === "return") {
+ this.rval = this.arg = record.arg;
+ this.method = "return";
+ this.next = "end";
+ } else if (record.type === "normal" && afterLoc) {
+ this.next = afterLoc;
+ }
+
+ return ContinueSentinel;
+ },
+
+ finish: function(finallyLoc) {
+ for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+ var entry = this.tryEntries[i];
+ if (entry.finallyLoc === finallyLoc) {
+ this.complete(entry.completion, entry.afterLoc);
+ resetTryEntry(entry);
+ return ContinueSentinel;
+ }
+ }
+ },
+
+ catch: function(tryLoc) {
+ for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+ var entry = this.tryEntries[i];
+ if (entry.tryLoc === tryLoc) {
+ var record = entry.completion;
+ if (record.type === "throw") {
+ var thrown = record.arg;
+ resetTryEntry(entry);
+ }
+ return thrown;
+ }
+ }
+
+ // The context.catch method must only be called with a location
+ // argument that corresponds to a known catch block.
+ throw new Error("illegal catch attempt");
+ },
+
+ delegateYield: function(iterable, resultName, nextLoc) {
+ this.delegate = {
+ iterator: values(iterable),
+ resultName: resultName,
+ nextLoc: nextLoc
+ };
+
+ if (this.method === "next") {
+ // Deliberately forget the last sent value so that we don't
+ // accidentally pass it on to the delegate.
+ this.arg = undefined;
+ }
+
+ return ContinueSentinel;
+ }
+ };
+ })(
+ // In sloppy mode, unbound `this` refers to the global object, fallback to
+ // Function constructor if we're in global strict mode. That is sadly a form
+ // of indirect eval which violates Content Security Policy.
+ (function() {
+ return this;
+ })() || Function("return this")()
+ );
+
+ /***/
+ },
+ /* 21 */
+ /***/ function(module, exports, __webpack_require__) {
+ /*
+ * Copyright 2009-2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE.txt or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+ exports.SourceMapGenerator = __webpack_require__(
+ 5
+ ).SourceMapGenerator;
+ exports.SourceMapConsumer = __webpack_require__(
+ 24
+ ).SourceMapConsumer;
+ exports.SourceNode = __webpack_require__(27).SourceNode;
+
+ /***/
+ },
+ /* 22 */
+ /***/ function(module, exports) {
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ var intToCharMap = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(
+ ""
+ );
+
+ /**
+ * Encode an integer in the range of 0 to 63 to a single base 64 digit.
+ */
+ exports.encode = function(number) {
+ if (0 <= number && number < intToCharMap.length) {
+ return intToCharMap[number];
+ }
+ throw new TypeError("Must be between 0 and 63: " + number);
+ };
+
+ /**
+ * Decode a single base 64 character code digit to an integer. Returns -1 on
+ * failure.
+ */
+ exports.decode = function(charCode) {
+ var bigA = 65; // 'A'
+ var bigZ = 90; // 'Z'
+
+ var littleA = 97; // 'a'
+ var littleZ = 122; // 'z'
+
+ var zero = 48; // '0'
+ var nine = 57; // '9'
+
+ var plus = 43; // '+'
+ var slash = 47; // '/'
+
+ var littleOffset = 26;
+ var numberOffset = 52;
+
+ // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ
+ if (bigA <= charCode && charCode <= bigZ) {
+ return charCode - bigA;
+ }
+
+ // 26 - 51: abcdefghijklmnopqrstuvwxyz
+ if (littleA <= charCode && charCode <= littleZ) {
+ return charCode - littleA + littleOffset;
+ }
+
+ // 52 - 61: 0123456789
+ if (zero <= charCode && charCode <= nine) {
+ return charCode - zero + numberOffset;
+ }
+
+ // 62: +
+ if (charCode == plus) {
+ return 62;
+ }
+
+ // 63: /
+ if (charCode == slash) {
+ return 63;
+ }
+
+ // Invalid base64 digit.
+ return -1;
+ };
+
+ /***/
+ },
+ /* 23 */
+ /***/ function(module, exports, __webpack_require__) {
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+ /*
+ * Copyright 2014 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ var util = __webpack_require__(0);
+
+ /**
+ * Determine whether mappingB is after mappingA with respect to generated
+ * position.
+ */
+ function generatedPositionAfter(mappingA, mappingB) {
+ // Optimized for most common case
+ var lineA = mappingA.generatedLine;
+ var lineB = mappingB.generatedLine;
+ var columnA = mappingA.generatedColumn;
+ var columnB = mappingB.generatedColumn;
+ return (
+ lineB > lineA ||
+ (lineB == lineA && columnB >= columnA) ||
+ util.compareByGeneratedPositionsInflated(
+ mappingA,
+ mappingB
+ ) <= 0
+ );
+ }
+
+ /**
+ * A data structure to provide a sorted view of accumulated mappings in a
+ * performance conscious manner. It trades a neglibable overhead in general
+ * case for a large speedup in case of mappings being added in order.
+ */
+ function MappingList() {
+ this._array = [];
+ this._sorted = true;
+ // Serves as infimum
+ this._last = { generatedLine: -1, generatedColumn: 0 };
+ }
+
+ /**
+ * Iterate through internal items. This method takes the same arguments that
+ * `Array.prototype.forEach` takes.
+ *
+ * NOTE: The order of the mappings is NOT guaranteed.
+ */
+ MappingList.prototype.unsortedForEach = function MappingList_forEach(
+ aCallback,
+ aThisArg
+ ) {
+ this._array.forEach(aCallback, aThisArg);
+ };
+
+ /**
+ * Add the given source mapping.
+ *
+ * @param Object aMapping
+ */
+ MappingList.prototype.add = function MappingList_add(aMapping) {
+ if (generatedPositionAfter(this._last, aMapping)) {
+ this._last = aMapping;
+ this._array.push(aMapping);
+ } else {
+ this._sorted = false;
+ this._array.push(aMapping);
+ }
+ };
+
+ /**
+ * Returns the flat, sorted array of mappings. The mappings are sorted by
+ * generated position.
+ *
+ * WARNING: This method returns internal data without copying, for
+ * performance. The return value must NOT be mutated, and should be treated as
+ * an immutable borrow. If you want to take ownership, you must make your own
+ * copy.
+ */
+ MappingList.prototype.toArray = function MappingList_toArray() {
+ if (!this._sorted) {
+ this._array.sort(util.compareByGeneratedPositionsInflated);
+ this._sorted = true;
+ }
+ return this._array;
+ };
+
+ exports.MappingList = MappingList;
+
+ /***/
+ },
+ /* 24 */
+ /***/ function(module, exports, __webpack_require__) {
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ var util = __webpack_require__(0);
+ var binarySearch = __webpack_require__(25);
+ var ArraySet = __webpack_require__(7).ArraySet;
+ var base64VLQ = __webpack_require__(6);
+ var quickSort = __webpack_require__(26).quickSort;
+
+ function SourceMapConsumer(aSourceMap) {
+ var sourceMap = aSourceMap;
+ if (typeof aSourceMap === "string") {
+ sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, ""));
+ }
+
+ return sourceMap.sections != null
+ ? new IndexedSourceMapConsumer(sourceMap)
+ : new BasicSourceMapConsumer(sourceMap);
+ }
+
+ SourceMapConsumer.fromSourceMap = function(aSourceMap) {
+ return BasicSourceMapConsumer.fromSourceMap(aSourceMap);
+ };
+
+ /**
+ * The version of the source mapping spec that we are consuming.
+ */
+ SourceMapConsumer.prototype._version = 3;
+
+ // `__generatedMappings` and `__originalMappings` are arrays that hold the
+ // parsed mapping coordinates from the source map's "mappings" attribute. They
+ // are lazily instantiated, accessed via the `_generatedMappings` and
+ // `_originalMappings` getters respectively, and we only parse the mappings
+ // and create these arrays once queried for a source location. We jump through
+ // these hoops because there can be many thousands of mappings, and parsing
+ // them is expensive, so we only want to do it if we must.
+ //
+ // Each object in the arrays is of the form:
+ //
+ // {
+ // generatedLine: The line number in the generated code,
+ // generatedColumn: The column number in the generated code,
+ // source: The path to the original source file that generated this
+ // chunk of code,
+ // originalLine: The line number in the original source that
+ // corresponds to this chunk of generated code,
+ // originalColumn: The column number in the original source that
+ // corresponds to this chunk of generated code,
+ // name: The name of the original symbol which generated this chunk of
+ // code.
+ // }
+ //
+ // All properties except for `generatedLine` and `generatedColumn` can be
+ // `null`.
+ //
+ // `_generatedMappings` is ordered by the generated positions.
+ //
+ // `_originalMappings` is ordered by the original positions.
+
+ SourceMapConsumer.prototype.__generatedMappings = null;
+ Object.defineProperty(
+ SourceMapConsumer.prototype,
+ "_generatedMappings",
+ {
+ get: function() {
+ if (!this.__generatedMappings) {
+ this._parseMappings(this._mappings, this.sourceRoot);
+ }
+
+ return this.__generatedMappings;
+ }
+ }
+ );
+
+ SourceMapConsumer.prototype.__originalMappings = null;
+ Object.defineProperty(
+ SourceMapConsumer.prototype,
+ "_originalMappings",
+ {
+ get: function() {
+ if (!this.__originalMappings) {
+ this._parseMappings(this._mappings, this.sourceRoot);
+ }
+
+ return this.__originalMappings;
+ }
+ }
+ );
+
+ SourceMapConsumer.prototype._charIsMappingSeparator = function SourceMapConsumer_charIsMappingSeparator(
+ aStr,
+ index
+ ) {
+ var c = aStr.charAt(index);
+ return c === ";" || c === ",";
+ };
+
+ /**
+ * Parse the mappings in a string in to a data structure which we can easily
+ * query (the ordered arrays in the `this.__generatedMappings` and
+ * `this.__originalMappings` properties).
+ */
+ SourceMapConsumer.prototype._parseMappings = function SourceMapConsumer_parseMappings(
+ aStr,
+ aSourceRoot
+ ) {
+ throw new Error("Subclasses must implement _parseMappings");
+ };
+
+ SourceMapConsumer.GENERATED_ORDER = 1;
+ SourceMapConsumer.ORIGINAL_ORDER = 2;
+
+ SourceMapConsumer.GREATEST_LOWER_BOUND = 1;
+ SourceMapConsumer.LEAST_UPPER_BOUND = 2;
+
+ /**
+ * Iterate over each mapping between an original source/line/column and a
+ * generated line/column in this source map.
+ *
+ * @param Function aCallback
+ * The function that is called with each mapping.
+ * @param Object aContext
+ * Optional. If specified, this object will be the value of `this` every
+ * time that `aCallback` is called.
+ * @param aOrder
+ * Either `SourceMapConsumer.GENERATED_ORDER` or
+ * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to
+ * iterate over the mappings sorted by the generated file's line/column
+ * order or the original's source/line/column order, respectively. Defaults to
+ * `SourceMapConsumer.GENERATED_ORDER`.
+ */
+ SourceMapConsumer.prototype.eachMapping = function SourceMapConsumer_eachMapping(
+ aCallback,
+ aContext,
+ aOrder
+ ) {
+ var context = aContext || null;
+ var order = aOrder || SourceMapConsumer.GENERATED_ORDER;
+
+ var mappings;
+ switch (order) {
+ case SourceMapConsumer.GENERATED_ORDER:
+ mappings = this._generatedMappings;
+ break;
+ case SourceMapConsumer.ORIGINAL_ORDER:
+ mappings = this._originalMappings;
+ break;
+ default:
+ throw new Error("Unknown order of iteration.");
+ }
+
+ var sourceRoot = this.sourceRoot;
+ mappings
+ .map(function(mapping) {
+ var source =
+ mapping.source === null
+ ? null
+ : this._sources.at(mapping.source);
+ if (source != null && sourceRoot != null) {
+ source = util.join(sourceRoot, source);
+ }
+ return {
+ source: source,
+ generatedLine: mapping.generatedLine,
+ generatedColumn: mapping.generatedColumn,
+ originalLine: mapping.originalLine,
+ originalColumn: mapping.originalColumn,
+ name:
+ mapping.name === null
+ ? null
+ : this._names.at(mapping.name)
+ };
+ }, this)
+ .forEach(aCallback, context);
+ };
+
+ /**
+ * Returns all generated line and column information for the original source,
+ * line, and column provided. If no column is provided, returns all mappings
+ * corresponding to a either the line we are searching for or the next
+ * closest line that has any mappings. Otherwise, returns all mappings
+ * corresponding to the given line and either the column we are searching for
+ * or the next closest column that has any offsets.
+ *
+ * The only argument is an object with the following properties:
+ *
+ * - source: The filename of the original source.
+ * - line: The line number in the original source.
+ * - column: Optional. the column number in the original source.
+ *
+ * and an array of objects is returned, each with the following properties:
+ *
+ * - line: The line number in the generated source, or null.
+ * - column: The column number in the generated source, or null.
+ */
+ SourceMapConsumer.prototype.allGeneratedPositionsFor = function SourceMapConsumer_allGeneratedPositionsFor(
+ aArgs
+ ) {
+ var line = util.getArg(aArgs, "line");
+
+ // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping
+ // returns the index of the closest mapping less than the needle. By
+ // setting needle.originalColumn to 0, we thus find the last mapping for
+ // the given line, provided such a mapping exists.
+ var needle = {
+ source: util.getArg(aArgs, "source"),
+ originalLine: line,
+ originalColumn: util.getArg(aArgs, "column", 0)
+ };
+
+ if (this.sourceRoot != null) {
+ needle.source = util.relative(
+ this.sourceRoot,
+ needle.source
+ );
+ }
+ if (!this._sources.has(needle.source)) {
+ return [];
+ }
+ needle.source = this._sources.indexOf(needle.source);
+
+ var mappings = [];
+
+ var index = this._findMapping(
+ needle,
+ this._originalMappings,
+ "originalLine",
+ "originalColumn",
+ util.compareByOriginalPositions,
+ binarySearch.LEAST_UPPER_BOUND
+ );
+ if (index >= 0) {
+ var mapping = this._originalMappings[index];
+
+ if (aArgs.column === undefined) {
+ var originalLine = mapping.originalLine;
+
+ // Iterate until either we run out of mappings, or we run into
+ // a mapping for a different line than the one we found. Since
+ // mappings are sorted, this is guaranteed to find all mappings for
+ // the line we found.
+ while (mapping && mapping.originalLine === originalLine) {
+ mappings.push({
+ line: util.getArg(mapping, "generatedLine", null),
+ column: util.getArg(mapping, "generatedColumn", null),
+ lastColumn: util.getArg(
+ mapping,
+ "lastGeneratedColumn",
+ null
+ )
+ });
+
+ mapping = this._originalMappings[++index];
+ }
+ } else {
+ var originalColumn = mapping.originalColumn;
+
+ // Iterate until either we run out of mappings, or we run into
+ // a mapping for a different line than the one we were searching for.
+ // Since mappings are sorted, this is guaranteed to find all mappings for
+ // the line we are searching for.
+ while (
+ mapping &&
+ mapping.originalLine === line &&
+ mapping.originalColumn == originalColumn
+ ) {
+ mappings.push({
+ line: util.getArg(mapping, "generatedLine", null),
+ column: util.getArg(mapping, "generatedColumn", null),
+ lastColumn: util.getArg(
+ mapping,
+ "lastGeneratedColumn",
+ null
+ )
+ });
+
+ mapping = this._originalMappings[++index];
+ }
+ }
+ }
+
+ return mappings;
+ };
+
+ exports.SourceMapConsumer = SourceMapConsumer;
+
+ /**
+ * A BasicSourceMapConsumer instance represents a parsed source map which we can
+ * query for information about the original file positions by giving it a file
+ * position in the generated source.
+ *
+ * The only parameter is the raw source map (either as a JSON string, or
+ * already parsed to an object). According to the spec, source maps have the
+ * following attributes:
+ *
+ * - version: Which version of the source map spec this map is following.
+ * - sources: An array of URLs to the original source files.
+ * - names: An array of identifiers which can be referrenced by individual mappings.
+ * - sourceRoot: Optional. The URL root from which all sources are relative.
+ * - sourcesContent: Optional. An array of contents of the original source files.
+ * - mappings: A string of base64 VLQs which contain the actual mappings.
+ * - file: Optional. The generated file this source map is associated with.
+ *
+ * Here is an example source map, taken from the source map spec[0]:
+ *
+ * {
+ * version : 3,
+ * file: "out.js",
+ * sourceRoot : "",
+ * sources: ["foo.js", "bar.js"],
+ * names: ["src", "maps", "are", "fun"],
+ * mappings: "AA,AB;;ABCDE;"
+ * }
+ *
+ * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#
+ */
+ function BasicSourceMapConsumer(aSourceMap) {
+ var sourceMap = aSourceMap;
+ if (typeof aSourceMap === "string") {
+ sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, ""));
+ }
+
+ var version = util.getArg(sourceMap, "version");
+ var sources = util.getArg(sourceMap, "sources");
+ // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which
+ // requires the array) to play nice here.
+ var names = util.getArg(sourceMap, "names", []);
+ var sourceRoot = util.getArg(sourceMap, "sourceRoot", null);
+ var sourcesContent = util.getArg(
+ sourceMap,
+ "sourcesContent",
+ null
+ );
+ var mappings = util.getArg(sourceMap, "mappings");
+ var file = util.getArg(sourceMap, "file", null);
+
+ // Once again, Sass deviates from the spec and supplies the version as a
+ // string rather than a number, so we use loose equality checking here.
+ if (version != this._version) {
+ throw new Error("Unsupported version: " + version);
+ }
+
+ sources = sources
+ .map(String)
+ // Some source maps produce relative source paths like "./foo.js" instead of
+ // "foo.js". Normalize these first so that future comparisons will succeed.
+ // See bugzil.la/1090768.
+ .map(util.normalize)
+ // Always ensure that absolute sources are internally stored relative to
+ // the source root, if the source root is absolute. Not doing this would
+ // be particularly problematic when the source root is a prefix of the
+ // source (valid, but why??). See github issue #199 and bugzil.la/1188982.
+ .map(function(source) {
+ return sourceRoot &&
+ util.isAbsolute(sourceRoot) &&
+ util.isAbsolute(source)
+ ? util.relative(sourceRoot, source)
+ : source;
+ });
+
+ // Pass `true` below to allow duplicate names and sources. While source maps
+ // are intended to be compressed and deduplicated, the TypeScript compiler
+ // sometimes generates source maps with duplicates in them. See Github issue
+ // #72 and bugzil.la/889492.
+ this._names = ArraySet.fromArray(names.map(String), true);
+ this._sources = ArraySet.fromArray(sources, true);
+
+ this.sourceRoot = sourceRoot;
+ this.sourcesContent = sourcesContent;
+ this._mappings = mappings;
+ this.file = file;
+ }
+
+ BasicSourceMapConsumer.prototype = Object.create(
+ SourceMapConsumer.prototype
+ );
+ BasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;
+
+ /**
+ * Create a BasicSourceMapConsumer from a SourceMapGenerator.
+ *
+ * @param SourceMapGenerator aSourceMap
+ * The source map that will be consumed.
+ * @returns BasicSourceMapConsumer
+ */
+ BasicSourceMapConsumer.fromSourceMap = function SourceMapConsumer_fromSourceMap(
+ aSourceMap
+ ) {
+ var smc = Object.create(BasicSourceMapConsumer.prototype);
+
+ var names = (smc._names = ArraySet.fromArray(
+ aSourceMap._names.toArray(),
+ true
+ ));
+ var sources = (smc._sources = ArraySet.fromArray(
+ aSourceMap._sources.toArray(),
+ true
+ ));
+ smc.sourceRoot = aSourceMap._sourceRoot;
+ smc.sourcesContent = aSourceMap._generateSourcesContent(
+ smc._sources.toArray(),
+ smc.sourceRoot
+ );
+ smc.file = aSourceMap._file;
+
+ // Because we are modifying the entries (by converting string sources and
+ // names to indices into the sources and names ArraySets), we have to make
+ // a copy of the entry or else bad things happen. Shared mutable state
+ // strikes again! See github issue #191.
+
+ var generatedMappings = aSourceMap._mappings
+ .toArray()
+ .slice();
+ var destGeneratedMappings = (smc.__generatedMappings = []);
+ var destOriginalMappings = (smc.__originalMappings = []);
+
+ for (
+ var i = 0, length = generatedMappings.length;
+ i < length;
+ i++
+ ) {
+ var srcMapping = generatedMappings[i];
+ var destMapping = new Mapping();
+ destMapping.generatedLine = srcMapping.generatedLine;
+ destMapping.generatedColumn = srcMapping.generatedColumn;
+
+ if (srcMapping.source) {
+ destMapping.source = sources.indexOf(srcMapping.source);
+ destMapping.originalLine = srcMapping.originalLine;
+ destMapping.originalColumn = srcMapping.originalColumn;
+
+ if (srcMapping.name) {
+ destMapping.name = names.indexOf(srcMapping.name);
+ }
+
+ destOriginalMappings.push(destMapping);
+ }
+
+ destGeneratedMappings.push(destMapping);
+ }
+
+ quickSort(
+ smc.__originalMappings,
+ util.compareByOriginalPositions
+ );
+
+ return smc;
+ };
+
+ /**
+ * The version of the source mapping spec that we are consuming.
+ */
+ BasicSourceMapConsumer.prototype._version = 3;
+
+ /**
+ * The list of original sources.
+ */
+ Object.defineProperty(
+ BasicSourceMapConsumer.prototype,
+ "sources",
+ {
+ get: function() {
+ return this._sources.toArray().map(function(s) {
+ return this.sourceRoot != null
+ ? util.join(this.sourceRoot, s)
+ : s;
+ }, this);
+ }
+ }
+ );
+
+ /**
+ * Provide the JIT with a nice shape / hidden class.
+ */
+ function Mapping() {
+ this.generatedLine = 0;
+ this.generatedColumn = 0;
+ this.source = null;
+ this.originalLine = null;
+ this.originalColumn = null;
+ this.name = null;
+ }
+
+ /**
+ * Parse the mappings in a string in to a data structure which we can easily
+ * query (the ordered arrays in the `this.__generatedMappings` and
+ * `this.__originalMappings` properties).
+ */
+ BasicSourceMapConsumer.prototype._parseMappings = function SourceMapConsumer_parseMappings(
+ aStr,
+ aSourceRoot
+ ) {
+ var generatedLine = 1;
+ var previousGeneratedColumn = 0;
+ var previousOriginalLine = 0;
+ var previousOriginalColumn = 0;
+ var previousSource = 0;
+ var previousName = 0;
+ var length = aStr.length;
+ var index = 0;
+ var cachedSegments = {};
+ var temp = {};
+ var originalMappings = [];
+ var generatedMappings = [];
+ var mapping, str, segment, end, value;
+
+ while (index < length) {
+ if (aStr.charAt(index) === ";") {
+ generatedLine++;
+ index++;
+ previousGeneratedColumn = 0;
+ } else if (aStr.charAt(index) === ",") {
+ index++;
+ } else {
+ mapping = new Mapping();
+ mapping.generatedLine = generatedLine;
+
+ // Because each offset is encoded relative to the previous one,
+ // many segments often have the same encoding. We can exploit this
+ // fact by caching the parsed variable length fields of each segment,
+ // allowing us to avoid a second parse if we encounter the same
+ // segment again.
+ for (end = index; end < length; end++) {
+ if (this._charIsMappingSeparator(aStr, end)) {
+ break;
+ }
+ }
+ str = aStr.slice(index, end);
+
+ segment = cachedSegments[str];
+ if (segment) {
+ index += str.length;
+ } else {
+ segment = [];
+ while (index < end) {
+ base64VLQ.decode(aStr, index, temp);
+ value = temp.value;
+ index = temp.rest;
+ segment.push(value);
+ }
+
+ if (segment.length === 2) {
+ throw new Error(
+ "Found a source, but no line and column"
+ );
+ }
+
+ if (segment.length === 3) {
+ throw new Error(
+ "Found a source and line, but no column"
+ );
+ }
+
+ cachedSegments[str] = segment;
+ }
+
+ // Generated column.
+ mapping.generatedColumn =
+ previousGeneratedColumn + segment[0];
+ previousGeneratedColumn = mapping.generatedColumn;
+
+ if (segment.length > 1) {
+ // Original source.
+ mapping.source = previousSource + segment[1];
+ previousSource += segment[1];
+
+ // Original line.
+ mapping.originalLine =
+ previousOriginalLine + segment[2];
+ previousOriginalLine = mapping.originalLine;
+ // Lines are stored 0-based
+ mapping.originalLine += 1;
+
+ // Original column.
+ mapping.originalColumn =
+ previousOriginalColumn + segment[3];
+ previousOriginalColumn = mapping.originalColumn;
+
+ if (segment.length > 4) {
+ // Original name.
+ mapping.name = previousName + segment[4];
+ previousName += segment[4];
+ }
+ }
+
+ generatedMappings.push(mapping);
+ if (typeof mapping.originalLine === "number") {
+ originalMappings.push(mapping);
+ }
+ }
+ }
+
+ quickSort(
+ generatedMappings,
+ util.compareByGeneratedPositionsDeflated
+ );
+ this.__generatedMappings = generatedMappings;
+
+ quickSort(originalMappings, util.compareByOriginalPositions);
+ this.__originalMappings = originalMappings;
+ };
+
+ /**
+ * Find the mapping that best matches the hypothetical "needle" mapping that
+ * we are searching for in the given "haystack" of mappings.
+ */
+ BasicSourceMapConsumer.prototype._findMapping = function SourceMapConsumer_findMapping(
+ aNeedle,
+ aMappings,
+ aLineName,
+ aColumnName,
+ aComparator,
+ aBias
+ ) {
+ // To return the position we are searching for, we must first find the
+ // mapping for the given position and then return the opposite position it
+ // points to. Because the mappings are sorted, we can use binary search to
+ // find the best mapping.
+
+ if (aNeedle[aLineName] <= 0) {
+ throw new TypeError(
+ "Line must be greater than or equal to 1, got " +
+ aNeedle[aLineName]
+ );
+ }
+ if (aNeedle[aColumnName] < 0) {
+ throw new TypeError(
+ "Column must be greater than or equal to 0, got " +
+ aNeedle[aColumnName]
+ );
+ }
+
+ return binarySearch.search(
+ aNeedle,
+ aMappings,
+ aComparator,
+ aBias
+ );
+ };
+
+ /**
+ * Compute the last column for each generated mapping. The last column is
+ * inclusive.
+ */
+ BasicSourceMapConsumer.prototype.computeColumnSpans = function SourceMapConsumer_computeColumnSpans() {
+ for (
+ var index = 0;
+ index < this._generatedMappings.length;
+ ++index
+ ) {
+ var mapping = this._generatedMappings[index];
+
+ // Mappings do not contain a field for the last generated columnt. We
+ // can come up with an optimistic estimate, however, by assuming that
+ // mappings are contiguous (i.e. given two consecutive mappings, the
+ // first mapping ends where the second one starts).
+ if (index + 1 < this._generatedMappings.length) {
+ var nextMapping = this._generatedMappings[index + 1];
+
+ if (mapping.generatedLine === nextMapping.generatedLine) {
+ mapping.lastGeneratedColumn =
+ nextMapping.generatedColumn - 1;
+ continue;
+ }
+ }
+
+ // The last mapping for each line spans the entire line.
+ mapping.lastGeneratedColumn = Infinity;
+ }
+ };
+
+ /**
+ * Returns the original source, line, and column information for the generated
+ * source's line and column positions provided. The only argument is an object
+ * with the following properties:
+ *
+ * - line: The line number in the generated source.
+ * - column: The column number in the generated source.
+ * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
+ * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - source: The original source file, or null.
+ * - line: The line number in the original source, or null.
+ * - column: The column number in the original source, or null.
+ * - name: The original identifier, or null.
+ */
+ BasicSourceMapConsumer.prototype.originalPositionFor = function SourceMapConsumer_originalPositionFor(
+ aArgs
+ ) {
+ var needle = {
+ generatedLine: util.getArg(aArgs, "line"),
+ generatedColumn: util.getArg(aArgs, "column")
+ };
+
+ var index = this._findMapping(
+ needle,
+ this._generatedMappings,
+ "generatedLine",
+ "generatedColumn",
+ util.compareByGeneratedPositionsDeflated,
+ util.getArg(
+ aArgs,
+ "bias",
+ SourceMapConsumer.GREATEST_LOWER_BOUND
+ )
+ );
+
+ if (index >= 0) {
+ var mapping = this._generatedMappings[index];
+
+ if (mapping.generatedLine === needle.generatedLine) {
+ var source = util.getArg(mapping, "source", null);
+ if (source !== null) {
+ source = this._sources.at(source);
+ if (this.sourceRoot != null) {
+ source = util.join(this.sourceRoot, source);
+ }
+ }
+ var name = util.getArg(mapping, "name", null);
+ if (name !== null) {
+ name = this._names.at(name);
+ }
+ return {
+ source: source,
+ line: util.getArg(mapping, "originalLine", null),
+ column: util.getArg(mapping, "originalColumn", null),
+ name: name
+ };
+ }
+ }
+
+ return {
+ source: null,
+ line: null,
+ column: null,
+ name: null
+ };
+ };
+
+ /**
+ * Return true if we have the source content for every source in the source
+ * map, false otherwise.
+ */
+ BasicSourceMapConsumer.prototype.hasContentsOfAllSources = function BasicSourceMapConsumer_hasContentsOfAllSources() {
+ if (!this.sourcesContent) {
+ return false;
+ }
+ return (
+ this.sourcesContent.length >= this._sources.size() &&
+ !this.sourcesContent.some(function(sc) {
+ return sc == null;
+ })
+ );
+ };
+
+ /**
+ * Returns the original source content. The only argument is the url of the
+ * original source file. Returns null if no original source content is
+ * available.
+ */
+ BasicSourceMapConsumer.prototype.sourceContentFor = function SourceMapConsumer_sourceContentFor(
+ aSource,
+ nullOnMissing
+ ) {
+ if (!this.sourcesContent) {
+ return null;
+ }
+
+ if (this.sourceRoot != null) {
+ aSource = util.relative(this.sourceRoot, aSource);
+ }
+
+ if (this._sources.has(aSource)) {
+ return this.sourcesContent[this._sources.indexOf(aSource)];
+ }
+
+ var url;
+ if (
+ this.sourceRoot != null &&
+ (url = util.urlParse(this.sourceRoot))
+ ) {
+ // XXX: file:// URIs and absolute paths lead to unexpected behavior for
+ // many users. We can help them out when they expect file:// URIs to
+ // behave like it would if they were running a local HTTP server. See
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.
+ var fileUriAbsPath = aSource.replace(/^file:\/\//, "");
+ if (
+ url.scheme == "file" &&
+ this._sources.has(fileUriAbsPath)
+ ) {
+ return this.sourcesContent[
+ this._sources.indexOf(fileUriAbsPath)
+ ];
+ }
+
+ if (
+ (!url.path || url.path == "/") &&
+ this._sources.has("/" + aSource)
+ ) {
+ return this.sourcesContent[
+ this._sources.indexOf("/" + aSource)
+ ];
+ }
+ }
+
+ // This function is used recursively from
+ // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we
+ // don't want to throw if we can't find the source - we just want to
+ // return null, so we provide a flag to exit gracefully.
+ if (nullOnMissing) {
+ return null;
+ } else {
+ throw new Error(
+ '"' + aSource + '" is not in the SourceMap.'
+ );
+ }
+ };
+
+ /**
+ * Returns the generated line and column information for the original source,
+ * line, and column positions provided. The only argument is an object with
+ * the following properties:
+ *
+ * - source: The filename of the original source.
+ * - line: The line number in the original source.
+ * - column: The column number in the original source.
+ * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or
+ * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - line: The line number in the generated source, or null.
+ * - column: The column number in the generated source, or null.
+ */
+ BasicSourceMapConsumer.prototype.generatedPositionFor = function SourceMapConsumer_generatedPositionFor(
+ aArgs
+ ) {
+ var source = util.getArg(aArgs, "source");
+ if (this.sourceRoot != null) {
+ source = util.relative(this.sourceRoot, source);
+ }
+ if (!this._sources.has(source)) {
+ return {
+ line: null,
+ column: null,
+ lastColumn: null
+ };
+ }
+ source = this._sources.indexOf(source);
+
+ var needle = {
+ source: source,
+ originalLine: util.getArg(aArgs, "line"),
+ originalColumn: util.getArg(aArgs, "column")
+ };
+
+ var index = this._findMapping(
+ needle,
+ this._originalMappings,
+ "originalLine",
+ "originalColumn",
+ util.compareByOriginalPositions,
+ util.getArg(
+ aArgs,
+ "bias",
+ SourceMapConsumer.GREATEST_LOWER_BOUND
+ )
+ );
+
+ if (index >= 0) {
+ var mapping = this._originalMappings[index];
+
+ if (mapping.source === needle.source) {
+ return {
+ line: util.getArg(mapping, "generatedLine", null),
+ column: util.getArg(mapping, "generatedColumn", null),
+ lastColumn: util.getArg(
+ mapping,
+ "lastGeneratedColumn",
+ null
+ )
+ };
+ }
+ }
+
+ return {
+ line: null,
+ column: null,
+ lastColumn: null
+ };
+ };
+
+ exports.BasicSourceMapConsumer = BasicSourceMapConsumer;
+
+ /**
+ * An IndexedSourceMapConsumer instance represents a parsed source map which
+ * we can query for information. It differs from BasicSourceMapConsumer in
+ * that it takes "indexed" source maps (i.e. ones with a "sections" field) as
+ * input.
+ *
+ * The only parameter is a raw source map (either as a JSON string, or already
+ * parsed to an object). According to the spec for indexed source maps, they
+ * have the following attributes:
+ *
+ * - version: Which version of the source map spec this map is following.
+ * - file: Optional. The generated file this source map is associated with.
+ * - sections: A list of section definitions.
+ *
+ * Each value under the "sections" field has two fields:
+ * - offset: The offset into the original specified at which this section
+ * begins to apply, defined as an object with a "line" and "column"
+ * field.
+ * - map: A source map definition. This source map could also be indexed,
+ * but doesn't have to be.
+ *
+ * Instead of the "map" field, it's also possible to have a "url" field
+ * specifying a URL to retrieve a source map from, but that's currently
+ * unsupported.
+ *
+ * Here's an example source map, taken from the source map spec[0], but
+ * modified to omit a section which uses the "url" field.
+ *
+ * {
+ * version : 3,
+ * file: "app.js",
+ * sections: [{
+ * offset: {line:100, column:10},
+ * map: {
+ * version : 3,
+ * file: "section.js",
+ * sources: ["foo.js", "bar.js"],
+ * names: ["src", "maps", "are", "fun"],
+ * mappings: "AAAA,E;;ABCDE;"
+ * }
+ * }],
+ * }
+ *
+ * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt
+ */
+ function IndexedSourceMapConsumer(aSourceMap) {
+ var sourceMap = aSourceMap;
+ if (typeof aSourceMap === "string") {
+ sourceMap = JSON.parse(aSourceMap.replace(/^\)\]\}'/, ""));
+ }
+
+ var version = util.getArg(sourceMap, "version");
+ var sections = util.getArg(sourceMap, "sections");
+
+ if (version != this._version) {
+ throw new Error("Unsupported version: " + version);
+ }
+
+ this._sources = new ArraySet();
+ this._names = new ArraySet();
+
+ var lastOffset = {
+ line: -1,
+ column: 0
+ };
+ this._sections = sections.map(function(s) {
+ if (s.url) {
+ // The url field will require support for asynchronicity.
+ // See https://github.com/mozilla/source-map/issues/16
+ throw new Error(
+ "Support for url field in sections not implemented."
+ );
+ }
+ var offset = util.getArg(s, "offset");
+ var offsetLine = util.getArg(offset, "line");
+ var offsetColumn = util.getArg(offset, "column");
+
+ if (
+ offsetLine < lastOffset.line ||
+ (offsetLine === lastOffset.line &&
+ offsetColumn < lastOffset.column)
+ ) {
+ throw new Error(
+ "Section offsets must be ordered and non-overlapping."
+ );
+ }
+ lastOffset = offset;
+
+ return {
+ generatedOffset: {
+ // The offset fields are 0-based, but we use 1-based indices when
+ // encoding/decoding from VLQ.
+ generatedLine: offsetLine + 1,
+ generatedColumn: offsetColumn + 1
+ },
+ consumer: new SourceMapConsumer(util.getArg(s, "map"))
+ };
+ });
+ }
+
+ IndexedSourceMapConsumer.prototype = Object.create(
+ SourceMapConsumer.prototype
+ );
+ IndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;
+
+ /**
+ * The version of the source mapping spec that we are consuming.
+ */
+ IndexedSourceMapConsumer.prototype._version = 3;
+
+ /**
+ * The list of original sources.
+ */
+ Object.defineProperty(
+ IndexedSourceMapConsumer.prototype,
+ "sources",
+ {
+ get: function() {
+ var sources = [];
+ for (var i = 0; i < this._sections.length; i++) {
+ for (
+ var j = 0;
+ j < this._sections[i].consumer.sources.length;
+ j++
+ ) {
+ sources.push(this._sections[i].consumer.sources[j]);
+ }
+ }
+ return sources;
+ }
+ }
+ );
+
+ /**
+ * Returns the original source, line, and column information for the generated
+ * source's line and column positions provided. The only argument is an object
+ * with the following properties:
+ *
+ * - line: The line number in the generated source.
+ * - column: The column number in the generated source.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - source: The original source file, or null.
+ * - line: The line number in the original source, or null.
+ * - column: The column number in the original source, or null.
+ * - name: The original identifier, or null.
+ */
+ IndexedSourceMapConsumer.prototype.originalPositionFor = function IndexedSourceMapConsumer_originalPositionFor(
+ aArgs
+ ) {
+ var needle = {
+ generatedLine: util.getArg(aArgs, "line"),
+ generatedColumn: util.getArg(aArgs, "column")
+ };
+
+ // Find the section containing the generated position we're trying to map
+ // to an original position.
+ var sectionIndex = binarySearch.search(
+ needle,
+ this._sections,
+ function(needle, section) {
+ var cmp =
+ needle.generatedLine -
+ section.generatedOffset.generatedLine;
+ if (cmp) {
+ return cmp;
+ }
+
+ return (
+ needle.generatedColumn -
+ section.generatedOffset.generatedColumn
+ );
+ }
+ );
+ var section = this._sections[sectionIndex];
+
+ if (!section) {
+ return {
+ source: null,
+ line: null,
+ column: null,
+ name: null
+ };
+ }
+
+ return section.consumer.originalPositionFor({
+ line:
+ needle.generatedLine -
+ (section.generatedOffset.generatedLine - 1),
+ column:
+ needle.generatedColumn -
+ (section.generatedOffset.generatedLine ===
+ needle.generatedLine
+ ? section.generatedOffset.generatedColumn - 1
+ : 0),
+ bias: aArgs.bias
+ });
+ };
+
+ /**
+ * Return true if we have the source content for every source in the source
+ * map, false otherwise.
+ */
+ IndexedSourceMapConsumer.prototype.hasContentsOfAllSources = function IndexedSourceMapConsumer_hasContentsOfAllSources() {
+ return this._sections.every(function(s) {
+ return s.consumer.hasContentsOfAllSources();
+ });
+ };
+
+ /**
+ * Returns the original source content. The only argument is the url of the
+ * original source file. Returns null if no original source content is
+ * available.
+ */
+ IndexedSourceMapConsumer.prototype.sourceContentFor = function IndexedSourceMapConsumer_sourceContentFor(
+ aSource,
+ nullOnMissing
+ ) {
+ for (var i = 0; i < this._sections.length; i++) {
+ var section = this._sections[i];
+
+ var content = section.consumer.sourceContentFor(
+ aSource,
+ true
+ );
+ if (content) {
+ return content;
+ }
+ }
+ if (nullOnMissing) {
+ return null;
+ } else {
+ throw new Error(
+ '"' + aSource + '" is not in the SourceMap.'
+ );
+ }
+ };
+
+ /**
+ * Returns the generated line and column information for the original source,
+ * line, and column positions provided. The only argument is an object with
+ * the following properties:
+ *
+ * - source: The filename of the original source.
+ * - line: The line number in the original source.
+ * - column: The column number in the original source.
+ *
+ * and an object is returned with the following properties:
+ *
+ * - line: The line number in the generated source, or null.
+ * - column: The column number in the generated source, or null.
+ */
+ IndexedSourceMapConsumer.prototype.generatedPositionFor = function IndexedSourceMapConsumer_generatedPositionFor(
+ aArgs
+ ) {
+ for (var i = 0; i < this._sections.length; i++) {
+ var section = this._sections[i];
+
+ // Only consider this section if the requested source is in the list of
+ // sources of the consumer.
+ if (
+ section.consumer.sources.indexOf(
+ util.getArg(aArgs, "source")
+ ) === -1
+ ) {
+ continue;
+ }
+ var generatedPosition = section.consumer.generatedPositionFor(
+ aArgs
+ );
+ if (generatedPosition) {
+ var ret = {
+ line:
+ generatedPosition.line +
+ (section.generatedOffset.generatedLine - 1),
+ column:
+ generatedPosition.column +
+ (section.generatedOffset.generatedLine ===
+ generatedPosition.line
+ ? section.generatedOffset.generatedColumn - 1
+ : 0)
+ };
+ return ret;
+ }
+ }
+
+ return {
+ line: null,
+ column: null
+ };
+ };
+
+ /**
+ * Parse the mappings in a string in to a data structure which we can easily
+ * query (the ordered arrays in the `this.__generatedMappings` and
+ * `this.__originalMappings` properties).
+ */
+ IndexedSourceMapConsumer.prototype._parseMappings = function IndexedSourceMapConsumer_parseMappings(
+ aStr,
+ aSourceRoot
+ ) {
+ this.__generatedMappings = [];
+ this.__originalMappings = [];
+ for (var i = 0; i < this._sections.length; i++) {
+ var section = this._sections[i];
+ var sectionMappings = section.consumer._generatedMappings;
+ for (var j = 0; j < sectionMappings.length; j++) {
+ var mapping = sectionMappings[j];
+
+ var source = section.consumer._sources.at(mapping.source);
+ if (section.consumer.sourceRoot !== null) {
+ source = util.join(section.consumer.sourceRoot, source);
+ }
+ this._sources.add(source);
+ source = this._sources.indexOf(source);
+
+ var name = section.consumer._names.at(mapping.name);
+ this._names.add(name);
+ name = this._names.indexOf(name);
+
+ // The mappings coming from the consumer for the section have
+ // generated positions relative to the start of the section, so we
+ // need to offset them to be relative to the start of the concatenated
+ // generated file.
+ var adjustedMapping = {
+ source: source,
+ generatedLine:
+ mapping.generatedLine +
+ (section.generatedOffset.generatedLine - 1),
+ generatedColumn:
+ mapping.generatedColumn +
+ (section.generatedOffset.generatedLine ===
+ mapping.generatedLine
+ ? section.generatedOffset.generatedColumn - 1
+ : 0),
+ originalLine: mapping.originalLine,
+ originalColumn: mapping.originalColumn,
+ name: name
+ };
+
+ this.__generatedMappings.push(adjustedMapping);
+ if (typeof adjustedMapping.originalLine === "number") {
+ this.__originalMappings.push(adjustedMapping);
+ }
+ }
+ }
+
+ quickSort(
+ this.__generatedMappings,
+ util.compareByGeneratedPositionsDeflated
+ );
+ quickSort(
+ this.__originalMappings,
+ util.compareByOriginalPositions
+ );
+ };
+
+ exports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;
+
+ /***/
+ },
+ /* 25 */
+ /***/ function(module, exports) {
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ exports.GREATEST_LOWER_BOUND = 1;
+ exports.LEAST_UPPER_BOUND = 2;
+
+ /**
+ * Recursive implementation of binary search.
+ *
+ * @param aLow Indices here and lower do not contain the needle.
+ * @param aHigh Indices here and higher do not contain the needle.
+ * @param aNeedle The element being searched for.
+ * @param aHaystack The non-empty array being searched.
+ * @param aCompare Function which takes two elements and returns -1, 0, or 1.
+ * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
+ * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ */
+ function recursiveSearch(
+ aLow,
+ aHigh,
+ aNeedle,
+ aHaystack,
+ aCompare,
+ aBias
+ ) {
+ // This function terminates when one of the following is true:
+ //
+ // 1. We find the exact element we are looking for.
+ //
+ // 2. We did not find the exact element, but we can return the index of
+ // the next-closest element.
+ //
+ // 3. We did not find the exact element, and there is no next-closest
+ // element than the one we are searching for, so we return -1.
+ var mid = Math.floor((aHigh - aLow) / 2) + aLow;
+ var cmp = aCompare(aNeedle, aHaystack[mid], true);
+ if (cmp === 0) {
+ // Found the element we are looking for.
+ return mid;
+ } else if (cmp > 0) {
+ // Our needle is greater than aHaystack[mid].
+ if (aHigh - mid > 1) {
+ // The element is in the upper half.
+ return recursiveSearch(
+ mid,
+ aHigh,
+ aNeedle,
+ aHaystack,
+ aCompare,
+ aBias
+ );
+ }
+
+ // The exact needle element was not found in this haystack. Determine if
+ // we are in termination case (3) or (2) and return the appropriate thing.
+ if (aBias == exports.LEAST_UPPER_BOUND) {
+ return aHigh < aHaystack.length ? aHigh : -1;
+ } else {
+ return mid;
+ }
+ } else {
+ // Our needle is less than aHaystack[mid].
+ if (mid - aLow > 1) {
+ // The element is in the lower half.
+ return recursiveSearch(
+ aLow,
+ mid,
+ aNeedle,
+ aHaystack,
+ aCompare,
+ aBias
+ );
+ }
+
+ // we are in termination case (3) or (2) and return the appropriate thing.
+ if (aBias == exports.LEAST_UPPER_BOUND) {
+ return mid;
+ } else {
+ return aLow < 0 ? -1 : aLow;
+ }
+ }
+ }
+
+ /**
+ * This is an implementation of binary search which will always try and return
+ * the index of the closest element if there is no exact hit. This is because
+ * mappings between original and generated line/col pairs are single points,
+ * and there is an implicit region between each of them, so a miss just means
+ * that you aren't on the very start of a region.
+ *
+ * @param aNeedle The element you are looking for.
+ * @param aHaystack The array that is being searched.
+ * @param aCompare A function which takes the needle and an element in the
+ * array and returns -1, 0, or 1 depending on whether the needle is less
+ * than, equal to, or greater than the element, respectively.
+ * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or
+ * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the
+ * closest element that is smaller than or greater than the one we are
+ * searching for, respectively, if the exact element cannot be found.
+ * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.
+ */
+ exports.search = function search(
+ aNeedle,
+ aHaystack,
+ aCompare,
+ aBias
+ ) {
+ if (aHaystack.length === 0) {
+ return -1;
+ }
+
+ var index = recursiveSearch(
+ -1,
+ aHaystack.length,
+ aNeedle,
+ aHaystack,
+ aCompare,
+ aBias || exports.GREATEST_LOWER_BOUND
+ );
+ if (index < 0) {
+ return -1;
+ }
+
+ // We have found either the exact element, or the next-closest element than
+ // the one we are searching for. However, there may be more than one such
+ // element. Make sure we always return the smallest of these.
+ while (index - 1 >= 0) {
+ if (
+ aCompare(aHaystack[index], aHaystack[index - 1], true) !==
+ 0
+ ) {
+ break;
+ }
+ --index;
+ }
+
+ return index;
+ };
+
+ /***/
+ },
+ /* 26 */
+ /***/ function(module, exports) {
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ // It turns out that some (most?) JavaScript engines don't self-host
+ // `Array.prototype.sort`. This makes sense because C++ will likely remain
+ // faster than JS when doing raw CPU-intensive sorting. However, when using a
+ // custom comparator function, calling back and forth between the VM's C++ and
+ // JIT'd JS is rather slow *and* loses JIT type information, resulting in
+ // worse generated code for the comparator function than would be optimal. In
+ // fact, when sorting with a comparator, these costs outweigh the benefits of
+ // sorting in C++. By using our own JS-implemented Quick Sort (below), we get
+ // a ~3500ms mean speed-up in `bench/bench.html`.
+
+ /**
+ * Swap the elements indexed by `x` and `y` in the array `ary`.
+ *
+ * @param {Array} ary
+ * The array.
+ * @param {Number} x
+ * The index of the first item.
+ * @param {Number} y
+ * The index of the second item.
+ */
+ function swap(ary, x, y) {
+ var temp = ary[x];
+ ary[x] = ary[y];
+ ary[y] = temp;
+ }
+
+ /**
+ * Returns a random integer within the range `low .. high` inclusive.
+ *
+ * @param {Number} low
+ * The lower bound on the range.
+ * @param {Number} high
+ * The upper bound on the range.
+ */
+ function randomIntInRange(low, high) {
+ return Math.round(low + Math.random() * (high - low));
+ }
+
+ /**
+ * The Quick Sort algorithm.
+ *
+ * @param {Array} ary
+ * An array to sort.
+ * @param {function} comparator
+ * Function to use to compare two items.
+ * @param {Number} p
+ * Start index of the array
+ * @param {Number} r
+ * End index of the array
+ */
+ function doQuickSort(ary, comparator, p, r) {
+ // If our lower bound is less than our upper bound, we (1) partition the
+ // array into two pieces and (2) recurse on each half. If it is not, this is
+ // the empty array and our base case.
+
+ if (p < r) {
+ // (1) Partitioning.
+ //
+ // The partitioning chooses a pivot between `p` and `r` and moves all
+ // elements that are less than or equal to the pivot to the before it, and
+ // all the elements that are greater than it after it. The effect is that
+ // once partition is done, the pivot is in the exact place it will be when
+ // the array is put in sorted order, and it will not need to be moved
+ // again. This runs in O(n) time.
+
+ // Always choose a random pivot so that an input array which is reverse
+ // sorted does not cause O(n^2) running time.
+ var pivotIndex = randomIntInRange(p, r);
+ var i = p - 1;
+
+ swap(ary, pivotIndex, r);
+ var pivot = ary[r];
+
+ // Immediately after `j` is incremented in this loop, the following hold
+ // true:
+ //
+ // * Every element in `ary[p .. i]` is less than or equal to the pivot.
+ //
+ // * Every element in `ary[i+1 .. j-1]` is greater than the pivot.
+ for (var j = p; j < r; j++) {
+ if (comparator(ary[j], pivot) <= 0) {
+ i += 1;
+ swap(ary, i, j);
+ }
+ }
+
+ swap(ary, i + 1, j);
+ var q = i + 1;
+
+ // (2) Recurse on each half.
+
+ doQuickSort(ary, comparator, p, q - 1);
+ doQuickSort(ary, comparator, q + 1, r);
+ }
+ }
+
+ /**
+ * Sort the given array in-place with the given comparator function.
+ *
+ * @param {Array} ary
+ * An array to sort.
+ * @param {function} comparator
+ * Function to use to compare two items.
+ */
+ exports.quickSort = function(ary, comparator) {
+ doQuickSort(ary, comparator, 0, ary.length - 1);
+ };
+
+ /***/
+ },
+ /* 27 */
+ /***/ function(module, exports, __webpack_require__) {
+ /* -*- Mode: js; js-indent-level: 2; -*- */
+ /*
+ * Copyright 2011 Mozilla Foundation and contributors
+ * Licensed under the New BSD license. See LICENSE or:
+ * http://opensource.org/licenses/BSD-3-Clause
+ */
+
+ var SourceMapGenerator = __webpack_require__(5)
+ .SourceMapGenerator;
+ var util = __webpack_require__(0);
+
+ // Matches a Windows-style `\r\n` newline or a `\n` newline used by all other
+ // operating systems these days (capturing the result).
+ var REGEX_NEWLINE = /(\r?\n)/;
+
+ // Newline character code for charCodeAt() comparisons
+ var NEWLINE_CODE = 10;
+
+ // Private symbol for identifying `SourceNode`s when multiple versions of
+ // the source-map library are loaded. This MUST NOT CHANGE across
+ // versions!
+ var isSourceNode = "$$$isSourceNode$$$";
+
+ /**
+ * SourceNodes provide a way to abstract over interpolating/concatenating
+ * snippets of generated JavaScript source code while maintaining the line and
+ * column information associated with the original source code.
+ *
+ * @param aLine The original line number.
+ * @param aColumn The original column number.
+ * @param aSource The original source's filename.
+ * @param aChunks Optional. An array of strings which are snippets of
+ * generated JS, or other SourceNodes.
+ * @param aName The original identifier.
+ */
+ function SourceNode(aLine, aColumn, aSource, aChunks, aName) {
+ this.children = [];
+ this.sourceContents = {};
+ this.line = aLine == null ? null : aLine;
+ this.column = aColumn == null ? null : aColumn;
+ this.source = aSource == null ? null : aSource;
+ this.name = aName == null ? null : aName;
+ this[isSourceNode] = true;
+ if (aChunks != null) this.add(aChunks);
+ }
+
+ /**
+ * Creates a SourceNode from generated code and a SourceMapConsumer.
+ *
+ * @param aGeneratedCode The generated code
+ * @param aSourceMapConsumer The SourceMap for the generated code
+ * @param aRelativePath Optional. The path that relative sources in the
+ * SourceMapConsumer should be relative to.
+ */
+ SourceNode.fromStringWithSourceMap = function SourceNode_fromStringWithSourceMap(
+ aGeneratedCode,
+ aSourceMapConsumer,
+ aRelativePath
+ ) {
+ // The SourceNode we want to fill with the generated code
+ // and the SourceMap
+ var node = new SourceNode();
+
+ // All even indices of this array are one line of the generated code,
+ // while all odd indices are the newlines between two adjacent lines
+ // (since `REGEX_NEWLINE` captures its match).
+ // Processed fragments are removed from this array, by calling `shiftNextLine`.
+ var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);
+ var shiftNextLine = function() {
+ var lineContents = remainingLines.shift();
+ // The last line of a file might not have a newline.
+ var newLine = remainingLines.shift() || "";
+ return lineContents + newLine;
+ };
+
+ // We need to remember the position of "remainingLines"
+ var lastGeneratedLine = 1,
+ lastGeneratedColumn = 0;
+
+ // The generate SourceNodes we need a code range.
+ // To extract it current and last mapping is used.
+ // Here we store the last mapping.
+ var lastMapping = null;
+
+ aSourceMapConsumer.eachMapping(function(mapping) {
+ if (lastMapping !== null) {
+ // We add the code from "lastMapping" to "mapping":
+ // First check if there is a new line in between.
+ if (lastGeneratedLine < mapping.generatedLine) {
+ // Associate first line with "lastMapping"
+ addMappingWithCode(lastMapping, shiftNextLine());
+ lastGeneratedLine++;
+ lastGeneratedColumn = 0;
+ // The remaining code is added without mapping
+ } else {
+ // There is no new line in between.
+ // Associate the code between "lastGeneratedColumn" and
+ // "mapping.generatedColumn" with "lastMapping"
+ var nextLine = remainingLines[0];
+ var code = nextLine.substr(
+ 0,
+ mapping.generatedColumn - lastGeneratedColumn
+ );
+ remainingLines[0] = nextLine.substr(
+ mapping.generatedColumn - lastGeneratedColumn
+ );
+ lastGeneratedColumn = mapping.generatedColumn;
+ addMappingWithCode(lastMapping, code);
+ // No more remaining code, continue
+ lastMapping = mapping;
+ return;
+ }
+ }
+ // We add the generated code until the first mapping
+ // to the SourceNode without any mapping.
+ // Each line is added as separate string.
+ while (lastGeneratedLine < mapping.generatedLine) {
+ node.add(shiftNextLine());
+ lastGeneratedLine++;
+ }
+ if (lastGeneratedColumn < mapping.generatedColumn) {
+ var nextLine = remainingLines[0];
+ node.add(nextLine.substr(0, mapping.generatedColumn));
+ remainingLines[0] = nextLine.substr(
+ mapping.generatedColumn
+ );
+ lastGeneratedColumn = mapping.generatedColumn;
+ }
+ lastMapping = mapping;
+ }, this);
+ // We have processed all mappings.
+ if (remainingLines.length > 0) {
+ if (lastMapping) {
+ // Associate the remaining code in the current line with "lastMapping"
+ addMappingWithCode(lastMapping, shiftNextLine());
+ }
+ // and add the remaining lines without any mapping
+ node.add(remainingLines.join(""));
+ }
+
+ // Copy sourcesContent into SourceNode
+ aSourceMapConsumer.sources.forEach(function(sourceFile) {
+ var content = aSourceMapConsumer.sourceContentFor(
+ sourceFile
+ );
+ if (content != null) {
+ if (aRelativePath != null) {
+ sourceFile = util.join(aRelativePath, sourceFile);
+ }
+ node.setSourceContent(sourceFile, content);
+ }
+ });
+
+ return node;
+
+ function addMappingWithCode(mapping, code) {
+ if (mapping === null || mapping.source === undefined) {
+ node.add(code);
+ } else {
+ var source = aRelativePath
+ ? util.join(aRelativePath, mapping.source)
+ : mapping.source;
+ node.add(
+ new SourceNode(
+ mapping.originalLine,
+ mapping.originalColumn,
+ source,
+ code,
+ mapping.name
+ )
+ );
+ }
+ }
+ };
+
+ /**
+ * Add a chunk of generated JS to this source node.
+ *
+ * @param aChunk A string snippet of generated JS code, another instance of
+ * SourceNode, or an array where each member is one of those things.
+ */
+ SourceNode.prototype.add = function SourceNode_add(aChunk) {
+ if (Array.isArray(aChunk)) {
+ aChunk.forEach(function(chunk) {
+ this.add(chunk);
+ }, this);
+ } else if (
+ aChunk[isSourceNode] ||
+ typeof aChunk === "string"
+ ) {
+ if (aChunk) {
+ this.children.push(aChunk);
+ }
+ } else {
+ throw new TypeError(
+ "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " +
+ aChunk
+ );
+ }
+ return this;
+ };
+
+ /**
+ * Add a chunk of generated JS to the beginning of this source node.
+ *
+ * @param aChunk A string snippet of generated JS code, another instance of
+ * SourceNode, or an array where each member is one of those things.
+ */
+ SourceNode.prototype.prepend = function SourceNode_prepend(
+ aChunk
+ ) {
+ if (Array.isArray(aChunk)) {
+ for (var i = aChunk.length - 1; i >= 0; i--) {
+ this.prepend(aChunk[i]);
+ }
+ } else if (
+ aChunk[isSourceNode] ||
+ typeof aChunk === "string"
+ ) {
+ this.children.unshift(aChunk);
+ } else {
+ throw new TypeError(
+ "Expected a SourceNode, string, or an array of SourceNodes and strings. Got " +
+ aChunk
+ );
+ }
+ return this;
+ };
+
+ /**
+ * Walk over the tree of JS snippets in this node and its children. The
+ * walking function is called once for each snippet of JS and is passed that
+ * snippet and the its original associated source's line/column location.
+ *
+ * @param aFn The traversal function.
+ */
+ SourceNode.prototype.walk = function SourceNode_walk(aFn) {
+ var chunk;
+ for (var i = 0, len = this.children.length; i < len; i++) {
+ chunk = this.children[i];
+ if (chunk[isSourceNode]) {
+ chunk.walk(aFn);
+ } else {
+ if (chunk !== "") {
+ aFn(chunk, {
+ source: this.source,
+ line: this.line,
+ column: this.column,
+ name: this.name
+ });
+ }
+ }
+ }
+ };
+
+ /**
+ * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between
+ * each of `this.children`.
+ *
+ * @param aSep The separator.
+ */
+ SourceNode.prototype.join = function SourceNode_join(aSep) {
+ var newChildren;
+ var i;
+ var len = this.children.length;
+ if (len > 0) {
+ newChildren = [];
+ for (i = 0; i < len - 1; i++) {
+ newChildren.push(this.children[i]);
+ newChildren.push(aSep);
+ }
+ newChildren.push(this.children[i]);
+ this.children = newChildren;
+ }
+ return this;
+ };
+
+ /**
+ * Call String.prototype.replace on the very right-most source snippet. Useful
+ * for trimming whitespace from the end of a source node, etc.
+ *
+ * @param aPattern The pattern to replace.
+ * @param aReplacement The thing to replace the pattern with.
+ */
+ SourceNode.prototype.replaceRight = function SourceNode_replaceRight(
+ aPattern,
+ aReplacement
+ ) {
+ var lastChild = this.children[this.children.length - 1];
+ if (lastChild[isSourceNode]) {
+ lastChild.replaceRight(aPattern, aReplacement);
+ } else if (typeof lastChild === "string") {
+ this.children[this.children.length - 1] = lastChild.replace(
+ aPattern,
+ aReplacement
+ );
+ } else {
+ this.children.push("".replace(aPattern, aReplacement));
+ }
+ return this;
+ };
+
+ /**
+ * Set the source content for a source file. This will be added to the SourceMapGenerator
+ * in the sourcesContent field.
+ *
+ * @param aSourceFile The filename of the source file
+ * @param aSourceContent The content of the source file
+ */
+ SourceNode.prototype.setSourceContent = function SourceNode_setSourceContent(
+ aSourceFile,
+ aSourceContent
+ ) {
+ this.sourceContents[
+ util.toSetString(aSourceFile)
+ ] = aSourceContent;
+ };
+
+ /**
+ * Walk over the tree of SourceNodes. The walking function is called for each
+ * source file content and is passed the filename and source content.
+ *
+ * @param aFn The traversal function.
+ */
+ SourceNode.prototype.walkSourceContents = function SourceNode_walkSourceContents(
+ aFn
+ ) {
+ for (var i = 0, len = this.children.length; i < len; i++) {
+ if (this.children[i][isSourceNode]) {
+ this.children[i].walkSourceContents(aFn);
+ }
+ }
+
+ var sources = Object.keys(this.sourceContents);
+ for (var i = 0, len = sources.length; i < len; i++) {
+ aFn(
+ util.fromSetString(sources[i]),
+ this.sourceContents[sources[i]]
+ );
+ }
+ };
+
+ /**
+ * Return the string representation of this source node. Walks over the tree
+ * and concatenates all the various snippets together to one string.
+ */
+ SourceNode.prototype.toString = function SourceNode_toString() {
+ var str = "";
+ this.walk(function(chunk) {
+ str += chunk;
+ });
+ return str;
+ };
+
+ /**
+ * Returns the string representation of this source node along with a source
+ * map.
+ */
+ SourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(
+ aArgs
+ ) {
+ var generated = {
+ code: "",
+ line: 1,
+ column: 0
+ };
+ var map = new SourceMapGenerator(aArgs);
+ var sourceMappingActive = false;
+ var lastOriginalSource = null;
+ var lastOriginalLine = null;
+ var lastOriginalColumn = null;
+ var lastOriginalName = null;
+ this.walk(function(chunk, original) {
+ generated.code += chunk;
+ if (
+ original.source !== null &&
+ original.line !== null &&
+ original.column !== null
+ ) {
+ if (
+ lastOriginalSource !== original.source ||
+ lastOriginalLine !== original.line ||
+ lastOriginalColumn !== original.column ||
+ lastOriginalName !== original.name
+ ) {
+ map.addMapping({
+ source: original.source,
+ original: {
+ line: original.line,
+ column: original.column
+ },
+ generated: {
+ line: generated.line,
+ column: generated.column
+ },
+ name: original.name
+ });
+ }
+ lastOriginalSource = original.source;
+ lastOriginalLine = original.line;
+ lastOriginalColumn = original.column;
+ lastOriginalName = original.name;
+ sourceMappingActive = true;
+ } else if (sourceMappingActive) {
+ map.addMapping({
+ generated: {
+ line: generated.line,
+ column: generated.column
+ }
+ });
+ lastOriginalSource = null;
+ sourceMappingActive = false;
+ }
+ for (
+ var idx = 0, length = chunk.length;
+ idx < length;
+ idx++
+ ) {
+ if (chunk.charCodeAt(idx) === NEWLINE_CODE) {
+ generated.line++;
+ generated.column = 0;
+ // Mappings end at eol
+ if (idx + 1 === length) {
+ lastOriginalSource = null;
+ sourceMappingActive = false;
+ } else if (sourceMappingActive) {
+ map.addMapping({
+ source: original.source,
+ original: {
+ line: original.line,
+ column: original.column
+ },
+ generated: {
+ line: generated.line,
+ column: generated.column
+ },
+ name: original.name
+ });
+ }
+ } else {
+ generated.column++;
+ }
+ }
+ });
+ this.walkSourceContents(function(sourceFile, sourceContent) {
+ map.setSourceContent(sourceFile, sourceContent);
+ });
+
+ return { code: generated.code, map: map };
+ };
+
+ exports.SourceNode = SourceNode;
+
+ /***/
+ },
+ /* 28 */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ function settle(val) {
+ if (!Array.isArray(val)) val = [val];
+ return Promise.all(
+ val.map(function(p) {
+ return p
+ .then(function(value) {
+ return {
+ isFulfilled: true,
+ isRejected: false,
+ value: value
+ };
+ })
+ .catch(function(reason) {
+ return {
+ isFulfilled: false,
+ isRejected: true,
+ reason: reason
+ };
+ });
+ })
+ );
+ }
+
+ exports.settle = settle;
+ exports.default = settle;
+
+ /***/
+ },
+ /* 29 */
+ /***/ function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ /* harmony export (binding) */ __webpack_require__.d(
+ __webpack_exports__,
+ "a",
+ function() {
+ return unmap;
+ }
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator__ = __webpack_require__(
+ 2
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default = __webpack_require__.n(
+ __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator__
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__stack_frame__ = __webpack_require__(
+ 1
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__getSourceMap__ = __webpack_require__(
+ 4
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__getLinesAround__ = __webpack_require__(
+ 8
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_path__ = __webpack_require__(
+ 30
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_path___default = __webpack_require__.n(
+ __WEBPACK_IMPORTED_MODULE_4_path__
+ );
+
+ var _typeof =
+ typeof Symbol === "function" &&
+ typeof Symbol.iterator === "symbol"
+ ? function(obj) {
+ return typeof obj;
+ }
+ : function(obj) {
+ return obj &&
+ typeof Symbol === "function" &&
+ obj.constructor === Symbol &&
+ obj !== Symbol.prototype
+ ? "symbol"
+ : typeof obj;
+ };
+
+ /**
+ * Turns a set of mapped <code>StackFrame</code>s back into their generated code position and enhances them with code.
+ * @param {string} fileUri The URI of the <code>bundle.js</code> file.
+ * @param {StackFrame[]} frames A set of <code>StackFrame</code>s which are already mapped and missing their generated positions.
+ * @param {number} [fileContents=3] The number of lines to provide before and after the line specified in the <code>StackFrame</code>.
+ */
+ var unmap = (function() {
+ var _ref = _asyncToGenerator(
+ /*#__PURE__*/ __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.mark(
+ function _callee(_fileUri, frames) {
+ var contextLines =
+ arguments.length > 2 && arguments[2] !== undefined
+ ? arguments[2]
+ : 3;
+ var fileContents, fileUri, map;
+ return __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.wrap(
+ function _callee$(_context) {
+ while (1) {
+ switch ((_context.prev = _context.next)) {
+ case 0:
+ fileContents =
+ (typeof _fileUri === "undefined"
+ ? "undefined"
+ : _typeof(_fileUri)) === "object"
+ ? _fileUri.contents
+ : null;
+ fileUri =
+ (typeof _fileUri === "undefined"
+ ? "undefined"
+ : _typeof(_fileUri)) === "object"
+ ? _fileUri.uri
+ : _fileUri;
+
+ if (!(fileContents == null)) {
+ _context.next = 6;
+ break;
+ }
+
+ _context.next = 5;
+ return fetch(fileUri).then(function(res) {
+ return res.text();
+ });
+
+ case 5:
+ fileContents = _context.sent;
+
+ case 6:
+ _context.next = 8;
+ return Object(
+ __WEBPACK_IMPORTED_MODULE_2__getSourceMap__[
+ "a" /* getSourceMap */
+ ]
+ )(fileUri, fileContents);
+
+ case 8:
+ map = _context.sent;
+ return _context.abrupt(
+ "return",
+ frames.map(function(frame) {
+ var functionName = frame.functionName,
+ lineNumber = frame.lineNumber,
+ columnNumber = frame.columnNumber,
+ _originalLineNumber =
+ frame._originalLineNumber;
+
+ if (_originalLineNumber != null) {
+ return frame;
+ }
+ var fileName = frame.fileName;
+
+ if (fileName) {
+ // The web version of this module only provides POSIX support, so Windows
+ // paths like C:\foo\\baz\..\\bar\ cannot be normalized.
+ // A simple solution to this is to replace all `\` with `/`, then
+ // normalize afterwards.
+ fileName = __WEBPACK_IMPORTED_MODULE_4_path___default.a.normalize(
+ fileName.replace(/[\\]+/g, "/")
+ );
+ }
+ if (fileName == null) {
+ return frame;
+ }
+ var fN = fileName;
+ var source = map
+ .getSources()
+ // Prepare path for normalization; see comment above for reasoning.
+ .map(function(s) {
+ return s.replace(/[\\]+/g, "/");
+ })
+ .filter(function(p) {
+ p = __WEBPACK_IMPORTED_MODULE_4_path___default.a.normalize(
+ p
+ );
+ var i = p.lastIndexOf(fN);
+ return (
+ i !== -1 &&
+ i === p.length - fN.length
+ );
+ })
+ .map(function(p) {
+ return {
+ token: p,
+ seps: count(
+ __WEBPACK_IMPORTED_MODULE_4_path___default
+ .a.sep,
+ __WEBPACK_IMPORTED_MODULE_4_path___default.a.normalize(
+ p
+ )
+ ),
+ penalties:
+ count("node_modules", p) +
+ count("~", p)
+ };
+ })
+ .sort(function(a, b) {
+ var s = Math.sign(a.seps - b.seps);
+ if (s !== 0) {
+ return s;
+ }
+ return Math.sign(
+ a.penalties - b.penalties
+ );
+ });
+ if (
+ source.length < 1 ||
+ lineNumber == null
+ ) {
+ return new __WEBPACK_IMPORTED_MODULE_1__stack_frame__[
+ "b" /* default */
+ ](
+ null,
+ null,
+ null,
+ null,
+ null,
+ functionName,
+ fN,
+ lineNumber,
+ columnNumber,
+ null
+ );
+ }
+ var sourceT = source[0].token;
+
+ var _map$getGeneratedPosi = map.getGeneratedPosition(
+ sourceT,
+ lineNumber,
+ // $FlowFixMe
+ columnNumber
+ ),
+ line = _map$getGeneratedPosi.line,
+ column = _map$getGeneratedPosi.column;
+
+ var originalSource = map.getSource(
+ sourceT
+ );
+ return new __WEBPACK_IMPORTED_MODULE_1__stack_frame__[
+ "b" /* default */
+ ](functionName, fileUri, line, column || null, Object(__WEBPACK_IMPORTED_MODULE_3__getLinesAround__["a" /* getLinesAround */])(line, contextLines, fileContents || []), functionName, fN, lineNumber, columnNumber, Object(__WEBPACK_IMPORTED_MODULE_3__getLinesAround__["a" /* getLinesAround */])(lineNumber, contextLines, originalSource));
+ })
+ );
+
+ case 10:
+ case "end":
+ return _context.stop();
+ }
+ }
+ },
+ _callee,
+ this
+ );
+ }
+ )
+ );
+
+ return function unmap(_x2, _x3) {
+ return _ref.apply(this, arguments);
+ };
+ })();
+
+ function _asyncToGenerator(fn) {
+ return function() {
+ var gen = fn.apply(this, arguments);
+ return new Promise(function(resolve, reject) {
+ function step(key, arg) {
+ try {
+ var info = gen[key](arg);
+ var value = info.value;
+ } catch (error) {
+ reject(error);
+ return;
+ }
+ if (info.done) {
+ resolve(value);
+ } else {
+ return Promise.resolve(value).then(
+ function(value) {
+ step("next", value);
+ },
+ function(err) {
+ step("throw", err);
+ }
+ );
+ }
+ }
+ return step("next");
+ });
+ };
+ }
+
+ /**
+ * Copyright (c) 2015-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+ function count(search, string) {
+ // Count starts at -1 becuse a do-while loop always runs at least once
+ var count = -1,
+ index = -1;
+ do {
+ // First call or the while case evaluated true, meaning we have to make
+ // count 0 or we found a character
+ ++count;
+ // Find the index of our search string, starting after the previous index
+ index = string.indexOf(search, index + 1);
+ } while (index !== -1);
+ return count;
+ }
+
+ /* unused harmony default export */ var _unused_webpack_default_export = unmap;
+
+ /***/
+ },
+ /* 30 */
+ /***/ function(module, exports, __webpack_require__) {
+ /* WEBPACK VAR INJECTION */ (function(process) {
+ // Copyright Joyent, Inc. and other Node contributors.
+ //
+ // 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.
+
+ // resolves . and .. elements in a path array with directory names there
+ // must be no slashes, empty elements, or device names (c:\) in the array
+ // (so also no leading and trailing slashes - it does not distinguish
+ // relative and absolute paths)
+ function normalizeArray(parts, allowAboveRoot) {
+ // if the path tries to go above the root, `up` ends up > 0
+ var up = 0;
+ for (var i = parts.length - 1; i >= 0; i--) {
+ var last = parts[i];
+ if (last === ".") {
+ parts.splice(i, 1);
+ } else if (last === "..") {
+ parts.splice(i, 1);
+ up++;
+ } else if (up) {
+ parts.splice(i, 1);
+ up--;
+ }
+ }
+
+ // if the path is allowed to go above the root, restore leading ..s
+ if (allowAboveRoot) {
+ for (; up--; up) {
+ parts.unshift("..");
+ }
+ }
+
+ return parts;
+ }
+
+ // Split a filename into [root, dir, basename, ext], unix version
+ // 'root' is just a slash, or nothing.
+ var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
+ var splitPath = function(filename) {
+ return splitPathRe.exec(filename).slice(1);
+ };
+
+ // path.resolve([from ...], to)
+ // posix version
+ exports.resolve = function() {
+ var resolvedPath = "",
+ resolvedAbsolute = false;
+
+ for (
+ var i = arguments.length - 1;
+ i >= -1 && !resolvedAbsolute;
+ i--
+ ) {
+ var path = i >= 0 ? arguments[i] : process.cwd();
+
+ // Skip empty and invalid entries
+ if (typeof path !== "string") {
+ throw new TypeError(
+ "Arguments to path.resolve must be strings"
+ );
+ } else if (!path) {
+ continue;
+ }
+
+ resolvedPath = path + "/" + resolvedPath;
+ resolvedAbsolute = path.charAt(0) === "/";
+ }
+
+ // At this point the path should be resolved to a full absolute path, but
+ // handle relative paths to be safe (might happen when process.cwd() fails)
+
+ // Normalize the path
+ resolvedPath = normalizeArray(
+ filter(resolvedPath.split("/"), function(p) {
+ return !!p;
+ }),
+ !resolvedAbsolute
+ ).join("/");
+
+ return (resolvedAbsolute ? "/" : "") + resolvedPath || ".";
+ };
+
+ // path.normalize(path)
+ // posix version
+ exports.normalize = function(path) {
+ var isAbsolute = exports.isAbsolute(path),
+ trailingSlash = substr(path, -1) === "/";
+
+ // Normalize the path
+ path = normalizeArray(
+ filter(path.split("/"), function(p) {
+ return !!p;
+ }),
+ !isAbsolute
+ ).join("/");
+
+ if (!path && !isAbsolute) {
+ path = ".";
+ }
+ if (path && trailingSlash) {
+ path += "/";
+ }
+
+ return (isAbsolute ? "/" : "") + path;
+ };
+
+ // posix version
+ exports.isAbsolute = function(path) {
+ return path.charAt(0) === "/";
+ };
+
+ // posix version
+ exports.join = function() {
+ var paths = Array.prototype.slice.call(arguments, 0);
+ return exports.normalize(
+ filter(paths, function(p, index) {
+ if (typeof p !== "string") {
+ throw new TypeError(
+ "Arguments to path.join must be strings"
+ );
+ }
+ return p;
+ }).join("/")
+ );
+ };
+
+ // path.relative(from, to)
+ // posix version
+ exports.relative = function(from, to) {
+ from = exports.resolve(from).substr(1);
+ to = exports.resolve(to).substr(1);
+
+ function trim(arr) {
+ var start = 0;
+ for (; start < arr.length; start++) {
+ if (arr[start] !== "") break;
+ }
+
+ var end = arr.length - 1;
+ for (; end >= 0; end--) {
+ if (arr[end] !== "") break;
+ }
+
+ if (start > end) return [];
+ return arr.slice(start, end - start + 1);
+ }
+
+ var fromParts = trim(from.split("/"));
+ var toParts = trim(to.split("/"));
+
+ var length = Math.min(fromParts.length, toParts.length);
+ var samePartsLength = length;
+ for (var i = 0; i < length; i++) {
+ if (fromParts[i] !== toParts[i]) {
+ samePartsLength = i;
+ break;
+ }
+ }
+
+ var outputParts = [];
+ for (var i = samePartsLength; i < fromParts.length; i++) {
+ outputParts.push("..");
+ }
+
+ outputParts = outputParts.concat(
+ toParts.slice(samePartsLength)
+ );
+
+ return outputParts.join("/");
+ };
+
+ exports.sep = "/";
+ exports.delimiter = ":";
+
+ exports.dirname = function(path) {
+ var result = splitPath(path),
+ root = result[0],
+ dir = result[1];
+
+ if (!root && !dir) {
+ // No dirname whatsoever
+ return ".";
+ }
+
+ if (dir) {
+ // It has a dirname, strip trailing slash
+ dir = dir.substr(0, dir.length - 1);
+ }
+
+ return root + dir;
+ };
+
+ exports.basename = function(path, ext) {
+ var f = splitPath(path)[2];
+ // TODO: make this comparison case-insensitive on windows?
+ if (ext && f.substr(-1 * ext.length) === ext) {
+ f = f.substr(0, f.length - ext.length);
+ }
+ return f;
+ };
+
+ exports.extname = function(path) {
+ return splitPath(path)[3];
+ };
+
+ function filter(xs, f) {
+ if (xs.filter) return xs.filter(f);
+ var res = [];
+ for (var i = 0; i < xs.length; i++) {
+ if (f(xs[i], i, xs)) res.push(xs[i]);
+ }
+ return res;
+ }
+
+ // String.prototype.substr - negative index don't work in IE8
+ var substr =
+ "ab".substr(-1) === "b"
+ ? function(str, start, len) {
+ return str.substr(start, len);
+ }
+ : function(str, start, len) {
+ if (start < 0) start = str.length + start;
+ return str.substr(start, len);
+ };
+
+ /* WEBPACK VAR INJECTION */
+ }.call(exports, __webpack_require__(3)));
+
+ /***/
+ },
+ /* 31 */
+ /***/ function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ /* harmony export (binding) */ __webpack_require__.d(
+ __webpack_exports__,
+ "a",
+ function() {
+ return iframeStyle;
+ }
+ );
+ /* unused harmony export overlayStyle */
+ /* unused harmony export primaryErrorStyle */
+ /* unused harmony export secondaryErrorStyle */
+ /* unused harmony export black */
+ /* unused harmony export darkGray */
+ /* unused harmony export red */
+ /* unused harmony export redTransparent */
+ /* unused harmony export yellowTransparent */
+ /**
+ * Copyright (c) 2015-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+ var black = "#293238",
+ darkGray = "#878e91",
+ red = "#ce1126",
+ redTransparent = "rgba(206, 17, 38, 0.05)",
+ lightRed = "#fccfcf",
+ yellow = "#fbf5b4",
+ yellowTransparent = "rgba(251, 245, 180, 0.3)",
+ white = "#ffffff";
+
+ var iframeStyle = {
+ position: "fixed",
+ top: "0",
+ left: "0",
+ width: "100%",
+ height: "100%",
+ border: "none",
+ "z-index": 2147483647
+ };
+
+ var overlayStyle = {
+ width: "100%",
+ height: "100%",
+ "box-sizing": "border-box",
+ "text-align": "center",
+ "background-color": white
+ };
+
+ var primaryErrorStyle = {
+ "background-color": lightRed
+ };
+
+ var secondaryErrorStyle = {
+ "background-color": yellow
+ };
+
+ /***/
+ },
+ /* 32 */
+ /***/ function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ /* unused harmony export getHead */
+ /* unused harmony export injectCss */
+ /* unused harmony export removeCss */
+ /* harmony export (binding) */ __webpack_require__.d(
+ __webpack_exports__,
+ "a",
+ function() {
+ return applyStyles;
+ }
+ );
+ /**
+ * Copyright (c) 2015-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+ var injectedCount = 0;
+ var injectedCache = {};
+
+ function getHead(document) {
+ return (
+ document.head || document.getElementsByTagName("head")[0]
+ );
+ }
+
+ function injectCss(document, css) {
+ var head = getHead(document);
+ var style = document.createElement("style");
+ style.type = "text/css";
+ style.appendChild(document.createTextNode(css));
+ head.appendChild(style);
+
+ injectedCache[++injectedCount] = style;
+ return injectedCount;
+ }
+
+ function removeCss(document, ref) {
+ if (injectedCache[ref] == null) {
+ return;
+ }
+ var head = getHead(document);
+ head.removeChild(injectedCache[ref]);
+ delete injectedCache[ref];
+ }
+
+ function applyStyles(element, styles) {
+ element.setAttribute("style", "");
+ for (var key in styles) {
+ if (!styles.hasOwnProperty(key)) {
+ continue;
+ }
+ // $FlowFixMe
+ element.style[key] = styles[key];
+ }
+ }
+
+ /***/
+ },
+ /* 33 */
+ /***/ function(module, exports) {
+ module.exports =
+ '!function(e){function t(r){if(n[r])return n[r].exports;var u=n[r]={i:r,l:!1,exports:{}};return e[r].call(u.exports,u,u.exports,t),u.l=!0,u.exports}var n={};t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=18)}([function(e,t,n){"use strict";e.exports=n(24)},function(e,t,n){"use strict";n.d(t,"c",function(){return l}),n.d(t,"d",function(){return s}),n.d(t,"g",function(){return c}),n.d(t,"a",function(){return r}),n.d(t,"b",function(){return u}),n.d(t,"e",function(){return o}),n.d(t,"f",function(){return a}),n.d(t,"h",function(){return i});var r="#293238",u="#878e91",o="#ce1126",a="rgba(206, 17, 38, 0.05)",i="rgba(251, 245, 180, 0.3)",l={width:"100%",height:"100%","box-sizing":"border-box","text-align":"center","background-color":"#ffffff"},s={"background-color":"#fccfcf"},c={"background-color":"#fbf5b4"}},function(e,t,n){"use strict";function r(e){if(null===e||void 0===e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}var u=Object.getOwnPropertySymbols,o=Object.prototype.hasOwnProperty,a=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map(function(e){return t[e]}).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach(function(e){r[e]=e}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(e){return!1}}()?Object.assign:function(e,t){for(var n,i,l=r(e),s=1;s<arguments.length;s++){n=Object(arguments[s]);for(var c in n)o.call(n,c)&&(l[c]=n[c]);if(u){i=u(n);for(var p=0;p<i.length;p++)a.call(n,i[p])&&(l[i[p]]=n[i[p]])}}return l}},function(e,t,n){"use strict";function r(e){return function(){return e}}var u=function(){};u.thatReturns=r,u.thatReturnsFalse=r(!1),u.thatReturnsTrue=r(!0),u.thatReturnsNull=r(null),u.thatReturnsThis=function(){return this},u.thatReturnsArgument=function(e){return e},e.exports=u},function(e,t,n){"use strict";function r(){}function u(e){try{return e.then}catch(e){return m=e,C}}function o(e,t){try{return e(t)}catch(e){return m=e,C}}function a(e,t,n){try{e(t,n)}catch(e){return m=e,C}}function i(e){if("object"!==typeof this)throw new TypeError("Promises must be constructed via new");if("function"!==typeof e)throw new TypeError("Promise constructor\'s argument is not a function");this._75=0,this._83=0,this._18=null,this._38=null,e!==r&&h(e,this)}function l(e,t,n){return new e.constructor(function(u,o){var a=new i(r);a.then(u,o),s(e,new D(t,n,a))})}function s(e,t){for(;3===e._83;)e=e._18;if(i._47&&i._47(e),0===e._83)return 0===e._75?(e._75=1,void(e._38=t)):1===e._75?(e._75=2,void(e._38=[e._38,t])):void e._38.push(t);c(e,t)}function c(e,t){g(function(){var n=1===e._83?t.onFulfilled:t.onRejected;if(null===n)return void(1===e._83?p(t.promise,e._18):f(t.promise,e._18));var r=o(n,e._18);r===C?f(t.promise,m):p(t.promise,r)})}function p(e,t){if(t===e)return f(e,new TypeError("A promise cannot be resolved with itself."));if(t&&("object"===typeof t||"function"===typeof t)){var n=u(t);if(n===C)return f(e,m);if(n===e.then&&t instanceof i)return e._83=3,e._18=t,void d(e);if("function"===typeof n)return void h(n.bind(t),e)}e._83=1,e._18=t,d(e)}function f(e,t){e._83=2,e._18=t,i._71&&i._71(e,t),d(e)}function d(e){if(1===e._75&&(s(e,e._38),e._38=null),2===e._75){for(var t=0;t<e._38.length;t++)s(e,e._38[t]);e._38=null}}function D(e,t,n){this.onFulfilled="function"===typeof e?e:null,this.onRejected="function"===typeof t?t:null,this.promise=n}function h(e,t){var n=!1,r=a(e,function(e){n||(n=!0,p(t,e))},function(e){n||(n=!0,f(t,e))});n||r!==C||(n=!0,f(t,m))}var g=n(21),m=null,C={};e.exports=i,i._47=null,i._71=null,i._44=r,i.prototype.then=function(e,t){if(this.constructor!==i)return l(this,e,t);var n=new i(r);return s(this,new D(e,t,n)),n}},function(e,t,n){"use strict";var r={};e.exports=r},function(e,t,n){"use strict";function r(e,t,n,r,o,a,i,l){if(u(t),!e){var s;if(void 0===t)s=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var c=[n,r,o,a,i,l],p=0;s=new Error(t.replace(/%s/g,function(){return c[p++]})),s.name="Invariant Violation"}throw s.framesToPop=1,s}}var u=function(e){};e.exports=r},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function u(e,t){if(!e)throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called");return!t||"object"!==typeof t&&"function"!==typeof t?e:t}function o(e,t){if("function"!==typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var a=n(0),i=n.n(a),l=n(1),s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),c={position:"relative",display:"inline-flex",flexDirection:"column",height:"100%",width:"1024px",maxWidth:"100%",overflowX:"hidden",overflowY:"auto",padding:"0.5rem",boxSizing:"border-box",textAlign:"left",fontFamily:"Consolas, Menlo, monospace",fontSize:"11px",whiteSpace:"pre-wrap",wordBreak:"break-word",lineHeight:1.5,color:l.a},p=function(e){function t(){var e,n,o,a;r(this,t);for(var i=arguments.length,l=Array(i),s=0;s<i;s++)l[s]=arguments[s];return n=o=u(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(l))),o.iframeWindow=null,o.getIframeWindow=function(e){if(e){var t=e.ownerDocument;o.iframeWindow=t.defaultView}},o.onKeyDown=function(e){var t=o.props.shortcutHandler;t&&t(e.key)},a=n,u(o,a)}return o(t,e),s(t,[{key:"componentDidMount",value:function(){window.addEventListener("keydown",this.onKeyDown),this.iframeWindow&&this.iframeWindow.addEventListener("keydown",this.onKeyDown)}},{key:"componentWillUnmount",value:function(){window.removeEventListener("keydown",this.onKeyDown),this.iframeWindow&&this.iframeWindow.removeEventListener("keydown",this.onKeyDown)}},{key:"render",value:function(){return i.a.createElement("div",{style:c,ref:this.getIframeWindow},this.props.children)}}]),t}(a.Component);t.a=p},function(e,t,n){"use strict";function r(e){return o.a.createElement("div",{style:i},e.line1,o.a.createElement("br",null),e.line2)}var u=n(0),o=n.n(u),a=n(1),i={fontFamily:"sans-serif",color:a.b,marginTop:"0.5rem",flex:"0 0 auto"};t.a=r},function(e,t,n){"use strict";function r(e){return o.a.createElement("div",{style:i},e.headerText)}var u=n(0),o=n.n(u),a=n(1),i={fontSize:"2em",fontFamily:"sans-serif",color:a.e,whiteSpace:"pre-wrap",margin:"0 2rem 0.75rem 0",flex:"0 0 auto",maxHeight:"50%",overflow:"auto"};t.a=r},function(e,t,n){"use strict";function r(e){var t=e.main?l:s,n={__html:e.codeHTML};return o.a.createElement("pre",{style:t},o.a.createElement("code",{style:c,dangerouslySetInnerHTML:n}))}var u=n(0),o=n.n(u),a=n(1),i={display:"block",padding:"0.5em",marginTop:"0.5em",marginBottom:"0.5em",overflowX:"auto",whiteSpace:"pre-wrap",borderRadius:"0.25rem"},l=Object.assign({},i,{backgroundColor:a.f}),s=Object.assign({},i,{backgroundColor:a.h}),c={fontFamily:"Consolas, Menlo, monospace"};t.a=r},function(e,t,n){"use strict";function r(e){for(var t=(new o.a).ansiToJson(i.encode(e),{use_classes:!0}),n="",r=!1,u=0;u<t.length;++u)for(var a=t[u],c=a.content,p=a.fg,f=c.split("\\n"),d=0;d<f.length;++d){r||(n+=\'<span data-ansi-line="true">\',r=!0);var D=f[d].replace("\\r",""),h=l[s[p]];null!=h?n+=\'<span style="color: #\'+h+\';">\'+D+"</span>":(null!=p&&console.log("Missing color mapping: ",p),n+="<span>"+D+"</span>"),d<f.length-1&&(n+="</span>",r=!1,n+="<br/>")}return r&&(n+="</span>",r=!1),n}var u=n(12),o=n.n(u),a=n(36),i=(n.n(a),new a.AllHtmlEntities),l={reset:["333333","transparent"],black:"333333",red:"881280",green:"1155cc",yellow:"881280",blue:"994500",magenta:"994500",cyan:"c80000",gray:"6e6e6e",lightgrey:"f5f5f5",darkgrey:"6e6e6e"},s={"ansi-bright-black":"black","ansi-bright-yellow":"yellow","ansi-yellow":"yellow","ansi-bright-green":"green","ansi-green":"green","ansi-bright-cyan":"cyan","ansi-cyan":"cyan","ansi-bright-red":"red","ansi-red":"red","ansi-bright-magenta":"magenta","ansi-magenta":"magenta","ansi-white":"darkgrey"};t.a=r},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var u=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),o=[[{color:"0, 0, 0",class:"ansi-black"},{color:"187, 0, 0",class:"ansi-red"},{color:"0, 187, 0",class:"ansi-green"},{color:"187, 187, 0",class:"ansi-yellow"},{color:"0, 0, 187",class:"ansi-blue"},{color:"187, 0, 187",class:"ansi-magenta"},{color:"0, 187, 187",class:"ansi-cyan"},{color:"255,255,255",class:"ansi-white"}],[{color:"85, 85, 85",class:"ansi-bright-black"},{color:"255, 85, 85",class:"ansi-bright-red"},{color:"0, 255, 0",class:"ansi-bright-green"},{color:"255, 255, 85",class:"ansi-bright-yellow"},{color:"85, 85, 255",class:"ansi-bright-blue"},{color:"255, 85, 255",class:"ansi-bright-magenta"},{color:"85, 255, 255",class:"ansi-bright-cyan"},{color:"255, 255, 255",class:"ansi-bright-white"}]],a=function(){function e(){r(this,e),this.fg=this.bg=this.fg_truecolor=this.bg_truecolor=null,this.bright=0}return u(e,null,[{key:"escapeForHtml",value:function(t){return(new e).escapeForHtml(t)}},{key:"linkify",value:function(t){return(new e).linkify(t)}},{key:"ansiToHtml",value:function(t,n){return(new e).ansiToHtml(t,n)}},{key:"ansiToJson",value:function(t,n){return(new e).ansiToJson(t,n)}},{key:"ansiToText",value:function(t){return(new e).ansiToText(t)}}]),u(e,[{key:"setupPalette",value:function(){this.PALETTE_COLORS=[];for(var e=0;e<2;++e)for(var t=0;t<8;++t)this.PALETTE_COLORS.push(o[e][t].color);for(var n=[0,95,135,175,215,255],r=function(e,t,r){return n[e]+", "+n[t]+", "+n[r]},u=0;u<6;++u)for(var a=0;a<6;++a)for(var i=0;i<6;++i)this.PALETTE_COLORS.push(r(u,a,i));for(var l=8,s=0;s<24;++s,l+=10)this.PALETTE_COLORS.push(r(l,l,l))}},{key:"escapeForHtml",value:function(e){return e.replace(/[&<>]/gm,function(e){return"&"==e?"&amp;":"<"==e?"&lt;":">"==e?"&gt;":""})}},{key:"linkify",value:function(e){return e.replace(/(https?:\\/\\/[^\\s]+)/gm,function(e){return\'<a href="\'+e+\'">\'+e+"</a>"})}},{key:"ansiToHtml",value:function(e,t){return this.process(e,t,!0)}},{key:"ansiToJson",value:function(e,t){return t=t||{},t.json=!0,t.clearLine=!1,this.process(e,t,!0)}},{key:"ansiToText",value:function(e){return this.process(e,{},!1)}},{key:"process",value:function(e,t,n){var r=this,u=this,o=e.split(/\\033\\[/),a=o.shift();void 0!==t&&null!==t||(t={}),t.clearLine=/\\r/.test(e);var i=o.map(function(e){return r.processChunk(e,t,n)});if(t&&t.json){var l=u.processChunkJson("");return l.content=a,l.clearLine=t.clearLine,i.unshift(l),t.remove_empty&&(i=i.filter(function(e){return!e.isEmpty()})),i}return i.unshift(a),i.join("")}},{key:"processChunkJson",value:function(e,t,n){t="undefined"==typeof t?{}:t;var r=t.use_classes="undefined"!=typeof t.use_classes&&t.use_classes,u=t.key=r?"class":"color",a={content:e,fg:null,bg:null,fg_truecolor:null,bg_truecolor:null,clearLine:t.clearLine,decoration:null,was_processed:!1,isEmpty:function(){return!a.content}},i=e.match(/^([!\\x3c-\\x3f]*)([\\d;]*)([\\x20-\\x2c]*[\\x40-\\x7e])([\\s\\S]*)/m);if(!i)return a;var l=(a.content=i[4],i[2].split(";"));if(""!==i[1]||"m"!==i[3])return a;if(!n)return a;var s=this;for(s.decoration=null;l.length>0;){var c=l.shift(),p=parseInt(c);if(isNaN(p)||0===p)s.fg=s.bg=s.decoration=null;else if(1===p)s.decoration="bold";else if(2===p)s.decoration="dim";else if(3==p)s.decoration="italic";else if(4==p)s.decoration="underline";else if(5==p)s.decoration="blink";else if(7===p)s.decoration="reverse";else if(8===p)s.decoration="hidden";else if(9===p)s.decoration="strikethrough";else if(39==p)s.fg=null;else if(49==p)s.bg=null;else if(p>=30&&p<38)s.fg=o[0][p%10][u];else if(p>=90&&p<98)s.fg=o[1][p%10][u];else if(p>=40&&p<48)s.bg=o[0][p%10][u];else if(p>=100&&p<108)s.bg=o[1][p%10][u];else if(38===p||48===p){var f=38===p;if(l.length>=1){var d=l.shift();if("5"===d&&l.length>=1){var D=parseInt(l.shift());if(D>=0&&D<=255)if(r){var h=D>=16?"ansi-palette-"+D:o[D>7?1:0][D%8].class;f?s.fg=h:s.bg=h}else this.PALETTE_COLORS||s.setupPalette(),f?s.fg=this.PALETTE_COLORS[D]:s.bg=this.PALETTE_COLORS[D]}else if("2"===d&&l.length>=3){var g=parseInt(l.shift()),m=parseInt(l.shift()),C=parseInt(l.shift());if(g>=0&&g<=255&&m>=0&&m<=255&&C>=0&&C<=255){var E=g+", "+m+", "+C;r?f?(s.fg="ansi-truecolor",s.fg_truecolor=E):(s.bg="ansi-truecolor",s.bg_truecolor=E):f?s.fg=E:s.bg=E}}}}}if(null===s.fg&&null===s.bg&&null===s.decoration)return a;return a.fg=s.fg,a.bg=s.bg,a.fg_truecolor=s.fg_truecolor,a.bg_truecolor=s.bg_truecolor,a.decoration=s.decoration,a.was_processed=!0,a}},{key:"processChunk",value:function(e,t,n){var r=this;t=t||{};var u=this.processChunkJson(e,t,n);if(t.json)return u;if(u.isEmpty())return"";if(!u.was_processed)return u.content;var o=t.use_classes,a=[],i=[],l={},s=function(e){var t=[],n=void 0;for(n in e)e.hasOwnProperty(n)&&t.push("data-"+n+\'="\'+r.escapeForHtml(e[n])+\'"\');return t.length>0?" "+t.join(" "):""};return u.fg&&(o?(i.push(u.fg+"-fg"),null!==u.fg_truecolor&&(l["ansi-truecolor-fg"]=u.fg_truecolor,u.fg_truecolor=null)):a.push("color:rgb("+u.fg+")")),u.bg&&(o?(i.push(u.bg+"-bg"),null!==u.bg_truecolor&&(l["ansi-truecolor-bg"]=u.bg_truecolor,u.bg_truecolor=null)):a.push("background-color:rgb("+u.bg+")")),u.decoration&&(o?i.push("ansi-"+u.decoration):"bold"===u.decoration?a.push("font-weight:bold"):"dim"===u.decoration?a.push("opacity:0.5"):"italic"===u.decoration?a.push("font-style:italic"):"reverse"===u.decoration?a.push("filter:invert(100%)"):"hidden"===u.decoration?a.push("visibility:hidden"):"strikethrough"===u.decoration?a.push("text-decoration:line-through"):a.push("text-decoration:"+u.decoration)),o?\'<span class="\'+i.join(" ")+\'"\'+s(l)+">"+u.content+"</span>":\'<span style="\'+a.join(";")+\'"\'+s(l)+">"+u.content+"</span>"}}]),e}();e.exports=a},function(e,t){function n(){}var r=[["Aacute",[193]],["aacute",[225]],["Abreve",[258]],["abreve",[259]],["ac",[8766]],["acd",[8767]],["acE",[8766,819]],["Acirc",[194]],["acirc",[226]],["acute",[180]],["Acy",[1040]],["acy",[1072]],["AElig",[198]],["aelig",[230]],["af",[8289]],["Afr",[120068]],["afr",[120094]],["Agrave",[192]],["agrave",[224]],["alefsym",[8501]],["aleph",[8501]],["Alpha",[913]],["alpha",[945]],["Amacr",[256]],["amacr",[257]],["amalg",[10815]],["amp",[38]],["AMP",[38]],["andand",[10837]],["And",[10835]],["and",[8743]],["andd",[10844]],["andslope",[10840]],["andv",[10842]],["ang",[8736]],["ange",[10660]],["angle",[8736]],["angmsdaa",[10664]],["angmsdab",[10665]],["angmsdac",[10666]],["angmsdad",[10667]],["angmsdae",[10668]],["angmsdaf",[10669]],["angmsdag",[10670]],["angmsdah",[10671]],["angmsd",[8737]],["angrt",[8735]],["angrtvb",[8894]],["angrtvbd",[10653]],["angsph",[8738]],["angst",[197]],["angzarr",[9084]],["Aogon",[260]],["aogon",[261]],["Aopf",[120120]],["aopf",[120146]],["apacir",[10863]],["ap",[8776]],["apE",[10864]],["ape",[8778]],["apid",[8779]],["apos",[39]],["ApplyFunction",[8289]],["approx",[8776]],["approxeq",[8778]],["Aring",[197]],["aring",[229]],["Ascr",[119964]],["ascr",[119990]],["Assign",[8788]],["ast",[42]],["asymp",[8776]],["asympeq",[8781]],["Atilde",[195]],["atilde",[227]],["Auml",[196]],["auml",[228]],["awconint",[8755]],["awint",[10769]],["backcong",[8780]],["backepsilon",[1014]],["backprime",[8245]],["backsim",[8765]],["backsimeq",[8909]],["Backslash",[8726]],["Barv",[10983]],["barvee",[8893]],["barwed",[8965]],["Barwed",[8966]],["barwedge",[8965]],["bbrk",[9141]],["bbrktbrk",[9142]],["bcong",[8780]],["Bcy",[1041]],["bcy",[1073]],["bdquo",[8222]],["becaus",[8757]],["because",[8757]],["Because",[8757]],["bemptyv",[10672]],["bepsi",[1014]],["bernou",[8492]],["Bernoullis",[8492]],["Beta",[914]],["beta",[946]],["beth",[8502]],["between",[8812]],["Bfr",[120069]],["bfr",[120095]],["bigcap",[8898]],["bigcirc",[9711]],["bigcup",[8899]],["bigodot",[10752]],["bigoplus",[10753]],["bigotimes",[10754]],["bigsqcup",[10758]],["bigstar",[9733]],["bigtriangledown",[9661]],["bigtriangleup",[9651]],["biguplus",[10756]],["bigvee",[8897]],["bigwedge",[8896]],["bkarow",[10509]],["blacklozenge",[10731]],["blacksquare",[9642]],["blacktriangle",[9652]],["blacktriangledown",[9662]],["blacktriangleleft",[9666]],["blacktriangleright",[9656]],["blank",[9251]],["blk12",[9618]],["blk14",[9617]],["blk34",[9619]],["block",[9608]],["bne",[61,8421]],["bnequiv",[8801,8421]],["bNot",[10989]],["bnot",[8976]],["Bopf",[120121]],["bopf",[120147]],["bot",[8869]],["bottom",[8869]],["bowtie",[8904]],["boxbox",[10697]],["boxdl",[9488]],["boxdL",[9557]],["boxDl",[9558]],["boxDL",[9559]],["boxdr",[9484]],["boxdR",[9554]],["boxDr",[9555]],["boxDR",[9556]],["boxh",[9472]],["boxH",[9552]],["boxhd",[9516]],["boxHd",[9572]],["boxhD",[9573]],["boxHD",[9574]],["boxhu",[9524]],["boxHu",[9575]],["boxhU",[9576]],["boxHU",[9577]],["boxminus",[8863]],["boxplus",[8862]],["boxtimes",[8864]],["boxul",[9496]],["boxuL",[9563]],["boxUl",[9564]],["boxUL",[9565]],["boxur",[9492]],["boxuR",[9560]],["boxUr",[9561]],["boxUR",[9562]],["boxv",[9474]],["boxV",[9553]],["boxvh",[9532]],["boxvH",[9578]],["boxVh",[9579]],["boxVH",[9580]],["boxvl",[9508]],["boxvL",[9569]],["boxVl",[9570]],["boxVL",[9571]],["boxvr",[9500]],["boxvR",[9566]],["boxVr",[9567]],["boxVR",[9568]],["bprime",[8245]],["breve",[728]],["Breve",[728]],["brvbar",[166]],["bscr",[119991]],["Bscr",[8492]],["bsemi",[8271]],["bsim",[8765]],["bsime",[8909]],["bsolb",[10693]],["bsol",[92]],["bsolhsub",[10184]],["bull",[8226]],["bullet",[8226]],["bump",[8782]],["bumpE",[10926]],["bumpe",[8783]],["Bumpeq",[8782]],["bumpeq",[8783]],["Cacute",[262]],["cacute",[263]],["capand",[10820]],["capbrcup",[10825]],["capcap",[10827]],["cap",[8745]],["Cap",[8914]],["capcup",[10823]],["capdot",[10816]],["CapitalDifferentialD",[8517]],["caps",[8745,65024]],["caret",[8257]],["caron",[711]],["Cayleys",[8493]],["ccaps",[10829]],["Ccaron",[268]],["ccaron",[269]],["Ccedil",[199]],["ccedil",[231]],["Ccirc",[264]],["ccirc",[265]],["Cconint",[8752]],["ccups",[10828]],["ccupssm",[10832]],["Cdot",[266]],["cdot",[267]],["cedil",[184]],["Cedilla",[184]],["cemptyv",[10674]],["cent",[162]],["centerdot",[183]],["CenterDot",[183]],["cfr",[120096]],["Cfr",[8493]],["CHcy",[1063]],["chcy",[1095]],["check",[10003]],["checkmark",[10003]],["Chi",[935]],["chi",[967]],["circ",[710]],["circeq",[8791]],["circlearrowleft",[8634]],["circlearrowright",[8635]],["circledast",[8859]],["circledcirc",[8858]],["circleddash",[8861]],["CircleDot",[8857]],["circledR",[174]],["circledS",[9416]],["CircleMinus",[8854]],["CirclePlus",[8853]],["CircleTimes",[8855]],["cir",[9675]],["cirE",[10691]],["cire",[8791]],["cirfnint",[10768]],["cirmid",[10991]],["cirscir",[10690]],["ClockwiseContourIntegral",[8754]],["clubs",[9827]],["clubsuit",[9827]],["colon",[58]],["Colon",[8759]],["Colone",[10868]],["colone",[8788]],["coloneq",[8788]],["comma",[44]],["commat",[64]],["comp",[8705]],["compfn",[8728]],["complement",[8705]],["complexes",[8450]],["cong",[8773]],["congdot",[10861]],["Congruent",[8801]],["conint",[8750]],["Conint",[8751]],["ContourIntegral",[8750]],["copf",[120148]],["Copf",[8450]],["coprod",[8720]],["Coproduct",[8720]],["copy",[169]],["COPY",[169]],["copysr",[8471]],["CounterClockwiseContourIntegral",[8755]],["crarr",[8629]],["cross",[10007]],["Cross",[10799]],["Cscr",[119966]],["cscr",[119992]],["csub",[10959]],["csube",[10961]],["csup",[10960]],["csupe",[10962]],["ctdot",[8943]],["cudarrl",[10552]],["cudarrr",[10549]],["cuepr",[8926]],["cuesc",[8927]],["cularr",[8630]],["cularrp",[10557]],["cupbrcap",[10824]],["cupcap",[10822]],["CupCap",[8781]],["cup",[8746]],["Cup",[8915]],["cupcup",[10826]],["cupdot",[8845]],["cupor",[10821]],["cups",[8746,65024]],["curarr",[8631]],["curarrm",[10556]],["curlyeqprec",[8926]],["curlyeqsucc",[8927]],["curlyvee",[8910]],["curlywedge",[8911]],["curren",[164]],["curvearrowleft",[8630]],["curvearrowright",[8631]],["cuvee",[8910]],["cuwed",[8911]],["cwconint",[8754]],["cwint",[8753]],["cylcty",[9005]],["dagger",[8224]],["Dagger",[8225]],["daleth",[8504]],["darr",[8595]],["Darr",[8609]],["dArr",[8659]],["dash",[8208]],["Dashv",[10980]],["dashv",[8867]],["dbkarow",[10511]],["dblac",[733]],["Dcaron",[270]],["dcaron",[271]],["Dcy",[1044]],["dcy",[1076]],["ddagger",[8225]],["ddarr",[8650]],["DD",[8517]],["dd",[8518]],["DDotrahd",[10513]],["ddotseq",[10871]],["deg",[176]],["Del",[8711]],["Delta",[916]],["delta",[948]],["demptyv",[10673]],["dfisht",[10623]],["Dfr",[120071]],["dfr",[120097]],["dHar",[10597]],["dharl",[8643]],["dharr",[8642]],["DiacriticalAcute",[180]],["DiacriticalDot",[729]],["DiacriticalDoubleAcute",[733]],["DiacriticalGrave",[96]],["DiacriticalTilde",[732]],["diam",[8900]],["diamond",[8900]],["Diamond",[8900]],["diamondsuit",[9830]],["diams",[9830]],["die",[168]],["DifferentialD",[8518]],["digamma",[989]],["disin",[8946]],["div",[247]],["divide",[247]],["divideontimes",[8903]],["divonx",[8903]],["DJcy",[1026]],["djcy",[1106]],["dlcorn",[8990]],["dlcrop",[8973]],["dollar",[36]],["Dopf",[120123]],["dopf",[120149]],["Dot",[168]],["dot",[729]],["DotDot",[8412]],["doteq",[8784]],["doteqdot",[8785]],["DotEqual",[8784]],["dotminus",[8760]],["dotplus",[8724]],["dotsquare",[8865]],["doublebarwedge",[8966]],["DoubleContourIntegral",[8751]],["DoubleDot",[168]],["DoubleDownArrow",[8659]],["DoubleLeftArrow",[8656]],["DoubleLeftRightArrow",[8660]],["DoubleLeftTee",[10980]],["DoubleLongLeftArrow",[10232]],["DoubleLongLeftRightArrow",[10234]],["DoubleLongRightArrow",[10233]],["DoubleRightArrow",[8658]],["DoubleRightTee",[8872]],["DoubleUpArrow",[8657]],["DoubleUpDownArrow",[8661]],["DoubleVerticalBar",[8741]],["DownArrowBar",[10515]],["downarrow",[8595]],["DownArrow",[8595]],["Downarrow",[8659]],["DownArrowUpArrow",[8693]],["DownBreve",[785]],["downdownarrows",[8650]],["downharpoonleft",[8643]],["downharpoonright",[8642]],["DownLeftRightVector",[10576]],["DownLeftTeeVector",[10590]],["DownLeftVectorBar",[10582]],["DownLeftVector",[8637]],["DownRightTeeVector",[10591]],["DownRightVectorBar",[10583]],["DownRightVector",[8641]],["DownTeeArrow",[8615]],["DownTee",[8868]],["drbkarow",[10512]],["drcorn",[8991]],["drcrop",[8972]],["Dscr",[119967]],["dscr",[119993]],["DScy",[1029]],["dscy",[1109]],["dsol",[10742]],["Dstrok",[272]],["dstrok",[273]],["dtdot",[8945]],["dtri",[9663]],["dtrif",[9662]],["duarr",[8693]],["duhar",[10607]],["dwangle",[10662]],["DZcy",[1039]],["dzcy",[1119]],["dzigrarr",[10239]],["Eacute",[201]],["eacute",[233]],["easter",[10862]],["Ecaron",[282]],["ecaron",[283]],["Ecirc",[202]],["ecirc",[234]],["ecir",[8790]],["ecolon",[8789]],["Ecy",[1069]],["ecy",[1101]],["eDDot",[10871]],["Edot",[278]],["edot",[279]],["eDot",[8785]],["ee",[8519]],["efDot",[8786]],["Efr",[120072]],["efr",[120098]],["eg",[10906]],["Egrave",[200]],["egrave",[232]],["egs",[10902]],["egsdot",[10904]],["el",[10905]],["Element",[8712]],["elinters",[9191]],["ell",[8467]],["els",[10901]],["elsdot",[10903]],["Emacr",[274]],["emacr",[275]],["empty",[8709]],["emptyset",[8709]],["EmptySmallSquare",[9723]],["emptyv",[8709]],["EmptyVerySmallSquare",[9643]],["emsp13",[8196]],["emsp14",[8197]],["emsp",[8195]],["ENG",[330]],["eng",[331]],["ensp",[8194]],["Eogon",[280]],["eogon",[281]],["Eopf",[120124]],["eopf",[120150]],["epar",[8917]],["eparsl",[10723]],["eplus",[10865]],["epsi",[949]],["Epsilon",[917]],["epsilon",[949]],["epsiv",[1013]],["eqcirc",[8790]],["eqcolon",[8789]],["eqsim",[8770]],["eqslantgtr",[10902]],["eqslantless",[10901]],["Equal",[10869]],["equals",[61]],["EqualTilde",[8770]],["equest",[8799]],["Equilibrium",[8652]],["equiv",[8801]],["equivDD",[10872]],["eqvparsl",[10725]],["erarr",[10609]],["erDot",[8787]],["escr",[8495]],["Escr",[8496]],["esdot",[8784]],["Esim",[10867]],["esim",[8770]],["Eta",[919]],["eta",[951]],["ETH",[208]],["eth",[240]],["Euml",[203]],["euml",[235]],["euro",[8364]],["excl",[33]],["exist",[8707]],["Exists",[8707]],["expectation",[8496]],["exponentiale",[8519]],["ExponentialE",[8519]],["fallingdotseq",[8786]],["Fcy",[1060]],["fcy",[1092]],["female",[9792]],["ffilig",[64259]],["fflig",[64256]],["ffllig",[64260]],["Ffr",[120073]],["ffr",[120099]],["filig",[64257]],["FilledSmallSquare",[9724]],["FilledVerySmallSquare",[9642]],["fjlig",[102,106]],["flat",[9837]],["fllig",[64258]],["fltns",[9649]],["fnof",[402]],["Fopf",[120125]],["fopf",[120151]],["forall",[8704]],["ForAll",[8704]],["fork",[8916]],["forkv",[10969]],["Fouriertrf",[8497]],["fpartint",[10765]],["frac12",[189]],["frac13",[8531]],["frac14",[188]],["frac15",[8533]],["frac16",[8537]],["frac18",[8539]],["frac23",[8532]],["frac25",[8534]],["frac34",[190]],["frac35",[8535]],["frac38",[8540]],["frac45",[8536]],["frac56",[8538]],["frac58",[8541]],["frac78",[8542]],["frasl",[8260]],["frown",[8994]],["fscr",[119995]],["Fscr",[8497]],["gacute",[501]],["Gamma",[915]],["gamma",[947]],["Gammad",[988]],["gammad",[989]],["gap",[10886]],["Gbreve",[286]],["gbreve",[287]],["Gcedil",[290]],["Gcirc",[284]],["gcirc",[285]],["Gcy",[1043]],["gcy",[1075]],["Gdot",[288]],["gdot",[289]],["ge",[8805]],["gE",[8807]],["gEl",[10892]],["gel",[8923]],["geq",[8805]],["geqq",[8807]],["geqslant",[10878]],["gescc",[10921]],["ges",[10878]],["gesdot",[10880]],["gesdoto",[10882]],["gesdotol",[10884]],["gesl",[8923,65024]],["gesles",[10900]],["Gfr",[120074]],["gfr",[120100]],["gg",[8811]],["Gg",[8921]],["ggg",[8921]],["gimel",[8503]],["GJcy",[1027]],["gjcy",[1107]],["gla",[10917]],["gl",[8823]],["glE",[10898]],["glj",[10916]],["gnap",[10890]],["gnapprox",[10890]],["gne",[10888]],["gnE",[8809]],["gneq",[10888]],["gneqq",[8809]],["gnsim",[8935]],["Gopf",[120126]],["gopf",[120152]],["grave",[96]],["GreaterEqual",[8805]],["GreaterEqualLess",[8923]],["GreaterFullEqual",[8807]],["GreaterGreater",[10914]],["GreaterLess",[8823]],["GreaterSlantEqual",[10878]],["GreaterTilde",[8819]],["Gscr",[119970]],["gscr",[8458]],["gsim",[8819]],["gsime",[10894]],["gsiml",[10896]],["gtcc",[10919]],["gtcir",[10874]],["gt",[62]],["GT",[62]],["Gt",[8811]],["gtdot",[8919]],["gtlPar",[10645]],["gtquest",[10876]],["gtrapprox",[10886]],["gtrarr",[10616]],["gtrdot",[8919]],["gtreqless",[8923]],["gtreqqless",[10892]],["gtrless",[8823]],["gtrsim",[8819]],["gvertneqq",[8809,65024]],["gvnE",[8809,65024]],["Hacek",[711]],["hairsp",[8202]],["half",[189]],["hamilt",[8459]],["HARDcy",[1066]],["hardcy",[1098]],["harrcir",[10568]],["harr",[8596]],["hArr",[8660]],["harrw",[8621]],["Hat",[94]],["hbar",[8463]],["Hcirc",[292]],["hcirc",[293]],["hearts",[9829]],["heartsuit",[9829]],["hellip",[8230]],["hercon",[8889]],["hfr",[120101]],["Hfr",[8460]],["HilbertSpace",[8459]],["hksearow",[10533]],["hkswarow",[10534]],["hoarr",[8703]],["homtht",[8763]],["hookleftarrow",[8617]],["hookrightarrow",[8618]],["hopf",[120153]],["Hopf",[8461]],["horbar",[8213]],["HorizontalLine",[9472]],["hscr",[119997]],["Hscr",[8459]],["hslash",[8463]],["Hstrok",[294]],["hstrok",[295]],["HumpDownHump",[8782]],["HumpEqual",[8783]],["hybull",[8259]],["hyphen",[8208]],["Iacute",[205]],["iacute",[237]],["ic",[8291]],["Icirc",[206]],["icirc",[238]],["Icy",[1048]],["icy",[1080]],["Idot",[304]],["IEcy",[1045]],["iecy",[1077]],["iexcl",[161]],["iff",[8660]],["ifr",[120102]],["Ifr",[8465]],["Igrave",[204]],["igrave",[236]],["ii",[8520]],["iiiint",[10764]],["iiint",[8749]],["iinfin",[10716]],["iiota",[8489]],["IJlig",[306]],["ijlig",[307]],["Imacr",[298]],["imacr",[299]],["image",[8465]],["ImaginaryI",[8520]],["imagline",[8464]],["imagpart",[8465]],["imath",[305]],["Im",[8465]],["imof",[8887]],["imped",[437]],["Implies",[8658]],["incare",[8453]],["in",[8712]],["infin",[8734]],["infintie",[10717]],["inodot",[305]],["intcal",[8890]],["int",[8747]],["Int",[8748]],["integers",[8484]],["Integral",[8747]],["intercal",[8890]],["Intersection",[8898]],["intlarhk",[10775]],["intprod",[10812]],["InvisibleComma",[8291]],["InvisibleTimes",[8290]],["IOcy",[1025]],["iocy",[1105]],["Iogon",[302]],["iogon",[303]],["Iopf",[120128]],["iopf",[120154]],["Iota",[921]],["iota",[953]],["iprod",[10812]],["iquest",[191]],["iscr",[119998]],["Iscr",[8464]],["isin",[8712]],["isindot",[8949]],["isinE",[8953]],["isins",[8948]],["isinsv",[8947]],["isinv",[8712]],["it",[8290]],["Itilde",[296]],["itilde",[297]],["Iukcy",[1030]],["iukcy",[1110]],["Iuml",[207]],["iuml",[239]],["Jcirc",[308]],["jcirc",[309]],["Jcy",[1049]],["jcy",[1081]],["Jfr",[120077]],["jfr",[120103]],["jmath",[567]],["Jopf",[120129]],["jopf",[120155]],["Jscr",[119973]],["jscr",[119999]],["Jsercy",[1032]],["jsercy",[1112]],["Jukcy",[1028]],["jukcy",[1108]],["Kappa",[922]],["kappa",[954]],["kappav",[1008]],["Kcedil",[310]],["kcedil",[311]],["Kcy",[1050]],["kcy",[1082]],["Kfr",[120078]],["kfr",[120104]],["kgreen",[312]],["KHcy",[1061]],["khcy",[1093]],["KJcy",[1036]],["kjcy",[1116]],["Kopf",[120130]],["kopf",[120156]],["Kscr",[119974]],["kscr",[12e4]],["lAarr",[8666]],["Lacute",[313]],["lacute",[314]],["laemptyv",[10676]],["lagran",[8466]],["Lambda",[923]],["lambda",[955]],["lang",[10216]],["Lang",[10218]],["langd",[10641]],["langle",[10216]],["lap",[10885]],["Laplacetrf",[8466]],["laquo",[171]],["larrb",[8676]],["larrbfs",[10527]],["larr",[8592]],["Larr",[8606]],["lArr",[8656]],["larrfs",[10525]],["larrhk",[8617]],["larrlp",[8619]],["larrpl",[10553]],["larrsim",[10611]],["larrtl",[8610]],["latail",[10521]],["lAtail",[10523]],["lat",[10923]],["late",[10925]],["lates",[10925,65024]],["lbarr",[10508]],["lBarr",[10510]],["lbbrk",[10098]],["lbrace",[123]],["lbrack",[91]],["lbrke",[10635]],["lbrksld",[10639]],["lbrkslu",[10637]],["Lcaron",[317]],["lcaron",[318]],["Lcedil",[315]],["lcedil",[316]],["lceil",[8968]],["lcub",[123]],["Lcy",[1051]],["lcy",[1083]],["ldca",[10550]],["ldquo",[8220]],["ldquor",[8222]],["ldrdhar",[10599]],["ldrushar",[10571]],["ldsh",[8626]],["le",[8804]],["lE",[8806]],["LeftAngleBracket",[10216]],["LeftArrowBar",[8676]],["leftarrow",[8592]],["LeftArrow",[8592]],["Leftarrow",[8656]],["LeftArrowRightArrow",[8646]],["leftarrowtail",[8610]],["LeftCeiling",[8968]],["LeftDoubleBracket",[10214]],["LeftDownTeeVector",[10593]],["LeftDownVectorBar",[10585]],["LeftDownVector",[8643]],["LeftFloor",[8970]],["leftharpoondown",[8637]],["leftharpoonup",[8636]],["leftleftarrows",[8647]],["leftrightarrow",[8596]],["LeftRightArrow",[8596]],["Leftrightarrow",[8660]],["leftrightarrows",[8646]],["leftrightharpoons",[8651]],["leftrightsquigarrow",[8621]],["LeftRightVector",[10574]],["LeftTeeArrow",[8612]],["LeftTee",[8867]],["LeftTeeVector",[10586]],["leftthreetimes",[8907]],["LeftTriangleBar",[10703]],["LeftTriangle",[8882]],["LeftTriangleEqual",[8884]],["LeftUpDownVector",[10577]],["LeftUpTeeVector",[10592]],["LeftUpVectorBar",[10584]],["LeftUpVector",[8639]],["LeftVectorBar",[10578]],["LeftVector",[8636]],["lEg",[10891]],["leg",[8922]],["leq",[8804]],["leqq",[8806]],["leqslant",[10877]],["lescc",[10920]],["les",[10877]],["lesdot",[10879]],["lesdoto",[10881]],["lesdotor",[10883]],["lesg",[8922,65024]],["lesges",[10899]],["lessapprox",[10885]],["lessdot",[8918]],["lesseqgtr",[8922]],["lesseqqgtr",[10891]],["LessEqualGreater",[8922]],["LessFullEqual",[8806]],["LessGreater",[8822]],["lessgtr",[8822]],["LessLess",[10913]],["lesssim",[8818]],["LessSlantEqual",[10877]],["LessTilde",[8818]],["lfisht",[10620]],["lfloor",[8970]],["Lfr",[120079]],["lfr",[120105]],["lg",[8822]],["lgE",[10897]],["lHar",[10594]],["lhard",[8637]],["lharu",[8636]],["lharul",[10602]],["lhblk",[9604]],["LJcy",[1033]],["ljcy",[1113]],["llarr",[8647]],["ll",[8810]],["Ll",[8920]],["llcorner",[8990]],["Lleftarrow",[8666]],["llhard",[10603]],["lltri",[9722]],["Lmidot",[319]],["lmidot",[320]],["lmoustache",[9136]],["lmoust",[9136]],["lnap",[10889]],["lnapprox",[10889]],["lne",[10887]],["lnE",[8808]],["lneq",[10887]],["lneqq",[8808]],["lnsim",[8934]],["loang",[10220]],["loarr",[8701]],["lobrk",[10214]],["longleftarrow",[10229]],["LongLeftArrow",[10229]],["Longleftarrow",[10232]],["longleftrightarrow",[10231]],["LongLeftRightArrow",[10231]],["Longleftrightarrow",[10234]],["longmapsto",[10236]],["longrightarrow",[10230]],["LongRightArrow",[10230]],["Longrightarrow",[10233]],["looparrowleft",[8619]],["looparrowright",[8620]],["lopar",[10629]],["Lopf",[120131]],["lopf",[120157]],["loplus",[10797]],["lotimes",[10804]],["lowast",[8727]],["lowbar",[95]],["LowerLeftArrow",[8601]],["LowerRightArrow",[8600]],["loz",[9674]],["lozenge",[9674]],["lozf",[10731]],["lpar",[40]],["lparlt",[10643]],["lrarr",[8646]],["lrcorner",[8991]],["lrhar",[8651]],["lrhard",[10605]],["lrm",[8206]],["lrtri",[8895]],["lsaquo",[8249]],["lscr",[120001]],["Lscr",[8466]],["lsh",[8624]],["Lsh",[8624]],["lsim",[8818]],["lsime",[10893]],["lsimg",[10895]],["lsqb",[91]],["lsquo",[8216]],["lsquor",[8218]],["Lstrok",[321]],["lstrok",[322]],["ltcc",[10918]],["ltcir",[10873]],["lt",[60]],["LT",[60]],["Lt",[8810]],["ltdot",[8918]],["lthree",[8907]],["ltimes",[8905]],["ltlarr",[10614]],["ltquest",[10875]],["ltri",[9667]],["ltrie",[8884]],["ltrif",[9666]],["ltrPar",[10646]],["lurdshar",[10570]],["luruhar",[10598]],["lvertneqq",[8808,65024]],["lvnE",[8808,65024]],["macr",[175]],["male",[9794]],["malt",[10016]],["maltese",[10016]],["Map",[10501]],["map",[8614]],["mapsto",[8614]],["mapstodown",[8615]],["mapstoleft",[8612]],["mapstoup",[8613]],["marker",[9646]],["mcomma",[10793]],["Mcy",[1052]],["mcy",[1084]],["mdash",[8212]],["mDDot",[8762]],["measuredangle",[8737]],["MediumSpace",[8287]],["Mellintrf",[8499]],["Mfr",[120080]],["mfr",[120106]],["mho",[8487]],["micro",[181]],["midast",[42]],["midcir",[10992]],["mid",[8739]],["middot",[183]],["minusb",[8863]],["minus",[8722]],["minusd",[8760]],["minusdu",[10794]],["MinusPlus",[8723]],["mlcp",[10971]],["mldr",[8230]],["mnplus",[8723]],["models",[8871]],["Mopf",[120132]],["mopf",[120158]],["mp",[8723]],["mscr",[120002]],["Mscr",[8499]],["mstpos",[8766]],["Mu",[924]],["mu",[956]],["multimap",[8888]],["mumap",[8888]],["nabla",[8711]],["Nacute",[323]],["nacute",[324]],["nang",[8736,8402]],["nap",[8777]],["napE",[10864,824]],["napid",[8779,824]],["napos",[329]],["napprox",[8777]],["natural",[9838]],["naturals",[8469]],["natur",[9838]],["nbsp",[160]],["nbump",[8782,824]],["nbumpe",[8783,824]],["ncap",[10819]],["Ncaron",[327]],["ncaron",[328]],["Ncedil",[325]],["ncedil",[326]],["ncong",[8775]],["ncongdot",[10861,824]],["ncup",[10818]],["Ncy",[1053]],["ncy",[1085]],["ndash",[8211]],["nearhk",[10532]],["nearr",[8599]],["neArr",[8663]],["nearrow",[8599]],["ne",[8800]],["nedot",[8784,824]],["NegativeMediumSpace",[8203]],["NegativeThickSpace",[8203]],["NegativeThinSpace",[8203]],["NegativeVeryThinSpace",[8203]],["nequiv",[8802]],["nesear",[10536]],["nesim",[8770,824]],["NestedGreaterGreater",[8811]],["NestedLessLess",[8810]],["nexist",[8708]],["nexists",[8708]],["Nfr",[120081]],["nfr",[120107]],["ngE",[8807,824]],["nge",[8817]],["ngeq",[8817]],["ngeqq",[8807,824]],["ngeqslant",[10878,824]],["nges",[10878,824]],["nGg",[8921,824]],["ngsim",[8821]],["nGt",[8811,8402]],["ngt",[8815]],["ngtr",[8815]],["nGtv",[8811,824]],["nharr",[8622]],["nhArr",[8654]],["nhpar",[10994]],["ni",[8715]],["nis",[8956]],["nisd",[8954]],["niv",[8715]],["NJcy",[1034]],["njcy",[1114]],["nlarr",[8602]],["nlArr",[8653]],["nldr",[8229]],["nlE",[8806,824]],["nle",[8816]],["nleftarrow",[8602]],["nLeftarrow",[8653]],["nleftrightarrow",[8622]],["nLeftrightarrow",[8654]],["nleq",[8816]],["nleqq",[8806,824]],["nleqslant",[10877,824]],["nles",[10877,824]],["nless",[8814]],["nLl",[8920,824]],["nlsim",[8820]],["nLt",[8810,8402]],["nlt",[8814]],["nltri",[8938]],["nltrie",[8940]],["nLtv",[8810,824]],["nmid",[8740]],["NoBreak",[8288]],["NonBreakingSpace",[160]],["nopf",[120159]],["Nopf",[8469]],["Not",[10988]],["not",[172]],["NotCongruent",[8802]],["NotCupCap",[8813]],["NotDoubleVerticalBar",[8742]],["NotElement",[8713]],["NotEqual",[8800]],["NotEqualTilde",[8770,824]],["NotExists",[8708]],["NotGreater",[8815]],["NotGreaterEqual",[8817]],["NotGreaterFullEqual",[8807,824]],["NotGreaterGreater",[8811,824]],["NotGreaterLess",[8825]],["NotGreaterSlantEqual",[10878,824]],["NotGreaterTilde",[8821]],["NotHumpDownHump",[8782,824]],["NotHumpEqual",[8783,824]],["notin",[8713]],["notindot",[8949,824]],["notinE",[8953,824]],["notinva",[8713]],["notinvb",[8951]],["notinvc",[8950]],["NotLeftTriangleBar",[10703,824]],["NotLeftTriangle",[8938]],["NotLeftTriangleEqual",[8940]],["NotLess",[8814]],["NotLessEqual",[8816]],["NotLessGreater",[8824]],["NotLessLess",[8810,824]],["NotLessSlantEqual",[10877,824]],["NotLessTilde",[8820]],["NotNestedGreaterGreater",[10914,824]],["NotNestedLessLess",[10913,824]],["notni",[8716]],["notniva",[8716]],["notnivb",[8958]],["notnivc",[8957]],["NotPrecedes",[8832]],["NotPrecedesEqual",[10927,824]],["NotPrecedesSlantEqual",[8928]],["NotReverseElement",[8716]],["NotRightTriangleBar",[10704,824]],["NotRightTriangle",[8939]],["NotRightTriangleEqual",[8941]],["NotSquareSubset",[8847,824]],["NotSquareSubsetEqual",[8930]],["NotSquareSuperset",[8848,824]],["NotSquareSupersetEqual",[8931]],["NotSubset",[8834,8402]],["NotSubsetEqual",[8840]],["NotSucceeds",[8833]],["NotSucceedsEqual",[10928,824]],["NotSucceedsSlantEqual",[8929]],["NotSucceedsTilde",[8831,824]],["NotSuperset",[8835,8402]],["NotSupersetEqual",[8841]],["NotTilde",[8769]],["NotTildeEqual",[8772]],["NotTildeFullEqual",[8775]],["NotTildeTilde",[8777]],["NotVerticalBar",[8740]],["nparallel",[8742]],["npar",[8742]],["nparsl",[11005,8421]],["npart",[8706,824]],["npolint",[10772]],["npr",[8832]],["nprcue",[8928]],["nprec",[8832]],["npreceq",[10927,824]],["npre",[10927,824]],["nrarrc",[10547,824]],["nrarr",[8603]],["nrArr",[8655]],["nrarrw",[8605,824]],["nrightarrow",[8603]],["nRightarrow",[8655]],["nrtri",[8939]],["nrtrie",[8941]],["nsc",[8833]],["nsccue",[8929]],["nsce",[10928,824]],["Nscr",[119977]],["nscr",[120003]],["nshortmid",[8740]],["nshortparallel",[8742]],["nsim",[8769]],["nsime",[8772]],["nsimeq",[8772]],["nsmid",[8740]],["nspar",[8742]],["nsqsube",[8930]],["nsqsupe",[8931]],["nsub",[8836]],["nsubE",[10949,824]],["nsube",[8840]],["nsubset",[8834,8402]],["nsubseteq",[8840]],["nsubseteqq",[10949,824]],["nsucc",[8833]],["nsucceq",[10928,824]],["nsup",[8837]],["nsupE",[10950,824]],["nsupe",[8841]],["nsupset",[8835,8402]],["nsupseteq",[8841]],["nsupseteqq",[10950,824]],["ntgl",[8825]],["Ntilde",[209]],["ntilde",[241]],["ntlg",[8824]],["ntriangleleft",[8938]],["ntrianglelefteq",[8940]],["ntriangleright",[8939]],["ntrianglerighteq",[8941]],["Nu",[925]],["nu",[957]],["num",[35]],["numero",[8470]],["numsp",[8199]],["nvap",[8781,8402]],["nvdash",[8876]],["nvDash",[8877]],["nVdash",[8878]],["nVDash",[8879]],["nvge",[8805,8402]],["nvgt",[62,8402]],["nvHarr",[10500]],["nvinfin",[10718]],["nvlArr",[10498]],["nvle",[8804,8402]],["nvlt",[60,8402]],["nvltrie",[8884,8402]],["nvrArr",[10499]],["nvrtrie",[8885,8402]],["nvsim",[8764,8402]],["nwarhk",[10531]],["nwarr",[8598]],["nwArr",[8662]],["nwarrow",[8598]],["nwnear",[10535]],["Oacute",[211]],["oacute",[243]],["oast",[8859]],["Ocirc",[212]],["ocirc",[244]],["ocir",[8858]],["Ocy",[1054]],["ocy",[1086]],["odash",[8861]],["Odblac",[336]],["odblac",[337]],["odiv",[10808]],["odot",[8857]],["odsold",[10684]],["OElig",[338]],["oelig",[339]],["ofcir",[10687]],["Ofr",[120082]],["ofr",[120108]],["ogon",[731]],["Ograve",[210]],["ograve",[242]],["ogt",[10689]],["ohbar",[10677]],["ohm",[937]],["oint",[8750]],["olarr",[8634]],["olcir",[10686]],["olcross",[10683]],["oline",[8254]],["olt",[10688]],["Omacr",[332]],["omacr",[333]],["Omega",[937]],["omega",[969]],["Omicron",[927]],["omicron",[959]],["omid",[10678]],["ominus",[8854]],["Oopf",[120134]],["oopf",[120160]],["opar",[10679]],["OpenCurlyDoubleQuote",[8220]],["OpenCurlyQuote",[8216]],["operp",[10681]],["oplus",[8853]],["orarr",[8635]],["Or",[10836]],["or",[8744]],["ord",[10845]],["order",[8500]],["orderof",[8500]],["ordf",[170]],["ordm",[186]],["origof",[8886]],["oror",[10838]],["orslope",[10839]],["orv",[10843]],["oS",[9416]],["Oscr",[119978]],["oscr",[8500]],["Oslash",[216]],["oslash",[248]],["osol",[8856]],["Otilde",[213]],["otilde",[245]],["otimesas",[10806]],["Otimes",[10807]],["otimes",[8855]],["Ouml",[214]],["ouml",[246]],["ovbar",[9021]],["OverBar",[8254]],["OverBrace",[9182]],["OverBracket",[9140]],["OverParenthesis",[9180]],["para",[182]],["parallel",[8741]],["par",[8741]],["parsim",[10995]],["parsl",[11005]],["part",[8706]],["PartialD",[8706]],["Pcy",[1055]],["pcy",[1087]],["percnt",[37]],["period",[46]],["permil",[8240]],["perp",[8869]],["pertenk",[8241]],["Pfr",[120083]],["pfr",[120109]],["Phi",[934]],["phi",[966]],["phiv",[981]],["phmmat",[8499]],["phone",[9742]],["Pi",[928]],["pi",[960]],["pitchfork",[8916]],["piv",[982]],["planck",[8463]],["planckh",[8462]],["plankv",[8463]],["plusacir",[10787]],["plusb",[8862]],["pluscir",[10786]],["plus",[43]],["plusdo",[8724]],["plusdu",[10789]],["pluse",[10866]],["PlusMinus",[177]],["plusmn",[177]],["plussim",[10790]],["plustwo",[10791]],["pm",[177]],["Poincareplane",[8460]],["pointint",[10773]],["popf",[120161]],["Popf",[8473]],["pound",[163]],["prap",[10935]],["Pr",[10939]],["pr",[8826]],["prcue",[8828]],["precapprox",[10935]],["prec",[8826]],["preccurlyeq",[8828]],["Precedes",[8826]],["PrecedesEqual",[10927]],["PrecedesSlantEqual",[8828]],["PrecedesTilde",[8830]],["preceq",[10927]],["precnapprox",[10937]],["precneqq",[10933]],["precnsim",[8936]],["pre",[10927]],["prE",[10931]],["precsim",[8830]],["prime",[8242]],["Prime",[8243]],["primes",[8473]],["prnap",[10937]],["prnE",[10933]],["prnsim",[8936]],["prod",[8719]],["Product",[8719]],["profalar",[9006]],["profline",[8978]],["profsurf",[8979]],["prop",[8733]],["Proportional",[8733]],["Proportion",[8759]],["propto",[8733]],["prsim",[8830]],["prurel",[8880]],["Pscr",[119979]],["pscr",[120005]],["Psi",[936]],["psi",[968]],["puncsp",[8200]],["Qfr",[120084]],["qfr",[120110]],["qint",[10764]],["qopf",[120162]],["Qopf",[8474]],["qprime",[8279]],["Qscr",[119980]],["qscr",[120006]],["quaternions",[8461]],["quatint",[10774]],["quest",[63]],["questeq",[8799]],["quot",[34]],["QUOT",[34]],["rAarr",[8667]],["race",[8765,817]],["Racute",[340]],["racute",[341]],["radic",[8730]],["raemptyv",[10675]],["rang",[10217]],["Rang",[10219]],["rangd",[10642]],["range",[10661]],["rangle",[10217]],["raquo",[187]],["rarrap",[10613]],["rarrb",[8677]],["rarrbfs",[10528]],["rarrc",[10547]],["rarr",[8594]],["Rarr",[8608]],["rArr",[8658]],["rarrfs",[10526]],["rarrhk",[8618]],["rarrlp",[8620]],["rarrpl",[10565]],["rarrsim",[10612]],["Rarrtl",[10518]],["rarrtl",[8611]],["rarrw",[8605]],["ratail",[10522]],["rAtail",[10524]],["ratio",[8758]],["rationals",[8474]],["rbarr",[10509]],["rBarr",[10511]],["RBarr",[10512]],["rbbrk",[10099]],["rbrace",[125]],["rbrack",[93]],["rbrke",[10636]],["rbrksld",[10638]],["rbrkslu",[10640]],["Rcaron",[344]],["rcaron",[345]],["Rcedil",[342]],["rcedil",[343]],["rceil",[8969]],["rcub",[125]],["Rcy",[1056]],["rcy",[1088]],["rdca",[10551]],["rdldhar",[10601]],["rdquo",[8221]],["rdquor",[8221]],["CloseCurlyDoubleQuote",[8221]],["rdsh",[8627]],["real",[8476]],["realine",[8475]],["realpart",[8476]],["reals",[8477]],["Re",[8476]],["rect",[9645]],["reg",[174]],["REG",[174]],["ReverseElement",[8715]],["ReverseEquilibrium",[8651]],["ReverseUpEquilibrium",[10607]],["rfisht",[10621]],["rfloor",[8971]],["rfr",[120111]],["Rfr",[8476]],["rHar",[10596]],["rhard",[8641]],["rharu",[8640]],["rharul",[10604]],["Rho",[929]],["rho",[961]],["rhov",[1009]],["RightAngleBracket",[10217]],["RightArrowBar",[8677]],["rightarrow",[8594]],["RightArrow",[8594]],["Rightarrow",[8658]],["RightArrowLeftArrow",[8644]],["rightarrowtail",[8611]],["RightCeiling",[8969]],["RightDoubleBracket",[10215]],["RightDownTeeVector",[10589]],["RightDownVectorBar",[10581]],["RightDownVector",[8642]],["RightFloor",[8971]],["rightharpoondown",[8641]],["rightharpoonup",[8640]],["rightleftarrows",[8644]],["rightleftharpoons",[8652]],["rightrightarrows",[8649]],["rightsquigarrow",[8605]],["RightTeeArrow",[8614]],["RightTee",[8866]],["RightTeeVector",[10587]],["rightthreetimes",[8908]],["RightTriangleBar",[10704]],["RightTriangle",[8883]],["RightTriangleEqual",[8885]],["RightUpDownVector",[10575]],["RightUpTeeVector",[10588]],["RightUpVectorBar",[10580]],["RightUpVector",[8638]],["RightVectorBar",[10579]],["RightVector",[8640]],["ring",[730]],["risingdotseq",[8787]],["rlarr",[8644]],["rlhar",[8652]],["rlm",[8207]],["rmoustache",[9137]],["rmoust",[9137]],["rnmid",[10990]],["roang",[10221]],["roarr",[8702]],["robrk",[10215]],["ropar",[10630]],["ropf",[120163]],["Ropf",[8477]],["roplus",[10798]],["rotimes",[10805]],["RoundImplies",[10608]],["rpar",[41]],["rpargt",[10644]],["rppolint",[10770]],["rrarr",[8649]],["Rrightarrow",[8667]],["rsaquo",[8250]],["rscr",[120007]],["Rscr",[8475]],["rsh",[8625]],["Rsh",[8625]],["rsqb",[93]],["rsquo",[8217]],["rsquor",[8217]],["CloseCurlyQuote",[8217]],["rthree",[8908]],["rtimes",[8906]],["rtri",[9657]],["rtrie",[8885]],["rtrif",[9656]],["rtriltri",[10702]],["RuleDelayed",[10740]],["ruluhar",[10600]],["rx",[8478]],["Sacute",[346]],["sacute",[347]],["sbquo",[8218]],["scap",[10936]],["Scaron",[352]],["scaron",[353]],["Sc",[10940]],["sc",[8827]],["sccue",[8829]],["sce",[10928]],["scE",[10932]],["Scedil",[350]],["scedil",[351]],["Scirc",[348]],["scirc",[349]],["scnap",[10938]],["scnE",[10934]],["scnsim",[8937]],["scpolint",[10771]],["scsim",[8831]],["Scy",[1057]],["scy",[1089]],["sdotb",[8865]],["sdot",[8901]],["sdote",[10854]],["searhk",[10533]],["searr",[8600]],["seArr",[8664]],["searrow",[8600]],["sect",[167]],["semi",[59]],["seswar",[10537]],["setminus",[8726]],["setmn",[8726]],["sext",[10038]],["Sfr",[120086]],["sfr",[120112]],["sfrown",[8994]],["sharp",[9839]],["SHCHcy",[1065]],["shchcy",[1097]],["SHcy",[1064]],["shcy",[1096]],["ShortDownArrow",[8595]],["ShortLeftArrow",[8592]],["shortmid",[8739]],["shortparallel",[8741]],["ShortRightArrow",[8594]],["ShortUpArrow",[8593]],["shy",[173]],["Sigma",[931]],["sigma",[963]],["sigmaf",[962]],["sigmav",[962]],["sim",[8764]],["simdot",[10858]],["sime",[8771]],["simeq",[8771]],["simg",[10910]],["simgE",[10912]],["siml",[10909]],["simlE",[10911]],["simne",[8774]],["simplus",[10788]],["simrarr",[10610]],["slarr",[8592]],["SmallCircle",[8728]],["smallsetminus",[8726]],["smashp",[10803]],["smeparsl",[10724]],["smid",[8739]],["smile",[8995]],["smt",[10922]],["smte",[10924]],["smtes",[10924,65024]],["SOFTcy",[1068]],["softcy",[1100]],["solbar",[9023]],["solb",[10692]],["sol",[47]],["Sopf",[120138]],["sopf",[120164]],["spades",[9824]],["spadesuit",[9824]],["spar",[8741]],["sqcap",[8851]],["sqcaps",[8851,65024]],["sqcup",[8852]],["sqcups",[8852,65024]],["Sqrt",[8730]],["sqsub",[8847]],["sqsube",[8849]],["sqsubset",[8847]],["sqsubseteq",[8849]],["sqsup",[8848]],["sqsupe",[8850]],["sqsupset",[8848]],["sqsupseteq",[8850]],["square",[9633]],["Square",[9633]],["SquareIntersection",[8851]],["SquareSubset",[8847]],["SquareSubsetEqual",[8849]],["SquareSuperset",[8848]],["SquareSupersetEqual",[8850]],["SquareUnion",[8852]],["squarf",[9642]],["squ",[9633]],["squf",[9642]],["srarr",[8594]],["Sscr",[119982]],["sscr",[120008]],["ssetmn",[8726]],["ssmile",[8995]],["sstarf",[8902]],["Star",[8902]],["star",[9734]],["starf",[9733]],["straightepsilon",[1013]],["straightphi",[981]],["strns",[175]],["sub",[8834]],["Sub",[8912]],["subdot",[10941]],["subE",[10949]],["sube",[8838]],["subedot",[10947]],["submult",[10945]],["subnE",[10955]],["subne",[8842]],["subplus",[10943]],["subrarr",[10617]],["subset",[8834]],["Subset",[8912]],["subseteq",[8838]],["subseteqq",[10949]],["SubsetEqual",[8838]],["subsetneq",[8842]],["subsetneqq",[10955]],["subsim",[10951]],["subsub",[10965]],["subsup",[10963]],["succapprox",[10936]],["succ",[8827]],["succcurlyeq",[8829]],["Succeeds",[8827]],["SucceedsEqual",[10928]],["SucceedsSlantEqual",[8829]],["SucceedsTilde",[8831]],["succeq",[10928]],["succnapprox",[10938]],["succneqq",[10934]],["succnsim",[8937]],["succsim",[8831]],["SuchThat",[8715]],["sum",[8721]],["Sum",[8721]],["sung",[9834]],["sup1",[185]],["sup2",[178]],["sup3",[179]],["sup",[8835]],["Sup",[8913]],["supdot",[10942]],["supdsub",[10968]],["supE",[10950]],["supe",[8839]],["supedot",[10948]],["Superset",[8835]],["SupersetEqual",[8839]],["suphsol",[10185]],["suphsub",[10967]],["suplarr",[10619]],["supmult",[10946]],["supnE",[10956]],["supne",[8843]],["supplus",[10944]],["supset",[8835]],["Supset",[8913]],["supseteq",[8839]],["supseteqq",[10950]],["supsetneq",[8843]],["supsetneqq",[10956]],["supsim",[10952]],["supsub",[10964]],["supsup",[10966]],["swarhk",[10534]],["swarr",[8601]],["swArr",[8665]],["swarrow",[8601]],["swnwar",[10538]],["szlig",[223]],["Tab",[9]],["target",[8982]],["Tau",[932]],["tau",[964]],["tbrk",[9140]],["Tcaron",[356]],["tcaron",[357]],["Tcedil",[354]],["tcedil",[355]],["Tcy",[1058]],["tcy",[1090]],["tdot",[8411]],["telrec",[8981]],["Tfr",[120087]],["tfr",[120113]],["there4",[8756]],["therefore",[8756]],["Therefore",[8756]],["Theta",[920]],["theta",[952]],["thetasym",[977]],["thetav",[977]],["thickapprox",[8776]],["thicksim",[8764]],["ThickSpace",[8287,8202]],["ThinSpace",[8201]],["thinsp",[8201]],["thkap",[8776]],["thksim",[8764]],["THORN",[222]],["thorn",[254]],["tilde",[732]],["Tilde",[8764]],["TildeEqual",[8771]],["TildeFullEqual",[8773]],["TildeTilde",[8776]],["timesbar",[10801]],["timesb",[8864]],["times",[215]],["timesd",[10800]],["tint",[8749]],["toea",[10536]],["topbot",[9014]],["topcir",[10993]],["top",[8868]],["Topf",[120139]],["topf",[120165]],["topfork",[10970]],["tosa",[10537]],["tprime",[8244]],["trade",[8482]],["TRADE",[8482]],["triangle",[9653]],["triangledown",[9663]],["triangleleft",[9667]],["trianglelefteq",[8884]],["triangleq",[8796]],["triangleright",[9657]],["trianglerighteq",[8885]],["tridot",[9708]],["trie",[8796]],["triminus",[10810]],["TripleDot",[8411]],["triplus",[10809]],["trisb",[10701]],["tritime",[10811]],["trpezium",[9186]],["Tscr",[119983]],["tscr",[120009]],["TScy",[1062]],["tscy",[1094]],["TSHcy",[1035]],["tshcy",[1115]],["Tstrok",[358]],["tstrok",[359]],["twixt",[8812]],["twoheadleftarrow",[8606]],["twoheadrightarrow",[8608]],["Uacute",[218]],["uacute",[250]],["uarr",[8593]],["Uarr",[8607]],["uArr",[8657]],["Uarrocir",[10569]],["Ubrcy",[1038]],["ubrcy",[1118]],["Ubreve",[364]],["ubreve",[365]],["Ucirc",[219]],["ucirc",[251]],["Ucy",[1059]],["ucy",[1091]],["udarr",[8645]],["Udblac",[368]],["udblac",[369]],["udhar",[10606]],["ufisht",[10622]],["Ufr",[120088]],["ufr",[120114]],["Ugrave",[217]],["ugrave",[249]],["uHar",[10595]],["uharl",[8639]],["uharr",[8638]],["uhblk",[9600]],["ulcorn",[8988]],["ulcorner",[8988]],["ulcrop",[8975]],["ultri",[9720]],["Umacr",[362]],["umacr",[363]],["uml",[168]],["UnderBar",[95]],["UnderBrace",[9183]],["UnderBracket",[9141]],["UnderParenthesis",[9181]],["Union",[8899]],["UnionPlus",[8846]],["Uogon",[370]],["uogon",[371]],["Uopf",[120140]],["uopf",[120166]],["UpArrowBar",[10514]],["uparrow",[8593]],["UpArrow",[8593]],["Uparrow",[8657]],["UpArrowDownArrow",[8645]],["updownarrow",[8597]],["UpDownArrow",[8597]],["Updownarrow",[8661]],["UpEquilibrium",[10606]],["upharpoonleft",[8639]],["upharpoonright",[8638]],["uplus",[8846]],["UpperLeftArrow",[8598]],["UpperRightArrow",[8599]],["upsi",[965]],["Upsi",[978]],["upsih",[978]],["Upsilon",[933]],["upsilon",[965]],["UpTeeArrow",[8613]],["UpTee",[8869]],["upuparrows",[8648]],["urcorn",[8989]],["urcorner",[8989]],["urcrop",[8974]],["Uring",[366]],["uring",[367]],["urtri",[9721]],["Uscr",[119984]],["uscr",[120010]],["utdot",[8944]],["Utilde",[360]],["utilde",[361]],["utri",[9653]],["utrif",[9652]],["uuarr",[8648]],["Uuml",[220]],["uuml",[252]],["uwangle",[10663]],["vangrt",[10652]],["varepsilon",[1013]],["varkappa",[1008]],["varnothing",[8709]],["varphi",[981]],["varpi",[982]],["varpropto",[8733]],["varr",[8597]],["vArr",[8661]],["varrho",[1009]],["varsigma",[962]],["varsubsetneq",[8842,65024]],["varsubsetneqq",[10955,65024]],["varsupsetneq",[8843,65024]],["varsupsetneqq",[10956,65024]],["vartheta",[977]],["vartriangleleft",[8882]],["vartriangleright",[8883]],["vBar",[10984]],["Vbar",[10987]],["vBarv",[10985]],["Vcy",[1042]],["vcy",[1074]],["vdash",[8866]],["vDash",[8872]],["Vdash",[8873]],["VDash",[8875]],["Vdashl",[10982]],["veebar",[8891]],["vee",[8744]],["Vee",[8897]],["veeeq",[8794]],["vellip",[8942]],["verbar",[124]],["Verbar",[8214]],["vert",[124]],["Vert",[8214]],["VerticalBar",[8739]],["VerticalLine",[124]],["VerticalSeparator",[10072]],["VerticalTilde",[8768]],["VeryThinSpace",[8202]],["Vfr",[120089]],["vfr",[120115]],["vltri",[8882]],["vnsub",[8834,8402]],["vnsup",[8835,8402]],["Vopf",[120141]],["vopf",[120167]],["vprop",[8733]],["vrtri",[8883]],["Vscr",[119985]],["vscr",[120011]],["vsubnE",[10955,65024]],["vsubne",[8842,65024]],["vsupnE",[10956,65024]],["vsupne",[8843,65024]],["Vvdash",[8874]],["vzigzag",[10650]],["Wcirc",[372]],["wcirc",[373]],["wedbar",[10847]],["wedge",[8743]],["Wedge",[8896]],["wedgeq",[8793]],["weierp",[8472]],["Wfr",[120090]],["wfr",[120116]],["Wopf",[120142]],["wopf",[120168]],["wp",[8472]],["wr",[8768]],["wreath",[8768]],["Wscr",[119986]],["wscr",[120012]],["xcap",[8898]],["xcirc",[9711]],["xcup",[8899]],["xdtri",[9661]],["Xfr",[120091]],["xfr",[120117]],["xharr",[10231]],["xhArr",[10234]],["Xi",[926]],["xi",[958]],["xlarr",[10229]],["xlArr",[10232]],["xmap",[10236]],["xnis",[8955]],["xodot",[10752]],["Xopf",[120143]],["xopf",[120169]],["xoplus",[10753]],["xotime",[10754]],["xrarr",[10230]],["xrArr",[10233]],["Xscr",[119987]],["xscr",[120013]],["xsqcup",[10758]],["xuplus",[10756]],["xutri",[9651]],["xvee",[8897]],["xwedge",[8896]],["Yacute",[221]],["yacute",[253]],["YAcy",[1071]],["yacy",[1103]],["Ycirc",[374]],["ycirc",[375]],["Ycy",[1067]],["ycy",[1099]],["yen",[165]],["Yfr",[120092]],["yfr",[120118]],["YIcy",[1031]],["yicy",[1111]],["Yopf",[120144]],["yopf",[120170]],["Yscr",[119988]],["yscr",[120014]],["YUcy",[1070]],["yucy",[1102]],["yuml",[255]],["Yuml",[376]],["Zacute",[377]],["zacute",[378]],["Zcaron",[381]],["zcaron",[382]],["Zcy",[1047]],["zcy",[1079]],["Zdot",[379]],["zdot",[380]],["zeetrf",[8488]],["ZeroWidthSpace",[8203]],["Zeta",[918]],["zeta",[950]],["zfr",[120119]],["Zfr",[8488]],["ZHcy",[1046]],["zhcy",[1078]],["zigrarr",[8669]],["zopf",[120171]],["Zopf",[8484]],["Zscr",[119989]],["zscr",[120015]],["zwj",[8205]],["zwnj",[8204]]],u={},o={};!function(e,t){for(var n=r.length,u=[];n--;){var o,a=r[n],i=a[0],l=a[1],s=l[0],c=s<32||s>126||62===s||60===s||38===s||34===s||39===s;if(c&&(o=t[s]=t[s]||{}),l[1]){var p=l[1];e[i]=String.fromCharCode(s)+String.fromCharCode(p),u.push(c&&(o[p]=i))}else e[i]=String.fromCharCode(s),u.push(c&&(o[""]=i))}}(u,o),n.prototype.decode=function(e){return e&&e.length?e.replace(/&(#?[\\w\\d]+);?/g,function(e,t){var n;if("#"===t.charAt(0)){var r="x"===t.charAt(1)?parseInt(t.substr(2).toLowerCase(),16):parseInt(t.substr(1));isNaN(r)||r<-32768||r>65535||(n=String.fromCharCode(r))}else n=u[t];return n||e}):""},n.decode=function(e){return(new n).decode(e)},n.prototype.encode=function(e){if(!e||!e.length)return"";for(var t=e.length,n="",r=0;r<t;){var u=o[e.charCodeAt(r)];if(u){var a=u[e.charCodeAt(r+1)];if(a?r++:a=u[""],a){n+="&"+a+";",r++;continue}}n+=e.charAt(r),r++}return n},n.encode=function(e){return(new n).encode(e)},n.prototype.encodeNonUTF=function(e){if(!e||!e.length)return"";for(var t=e.length,n="",r=0;r<t;){var u=e.charCodeAt(r),a=o[u];if(a){var i=a[e.charCodeAt(r+1)];if(i?r++:i=a[""],i){n+="&"+i+";",r++;continue}}n+=u<32||u>126?"&#"+u+";":e.charAt(r),r++}return n},n.encodeNonUTF=function(e){return(new n).encodeNonUTF(e)},n.prototype.encodeNonASCII=function(e){if(!e||!e.length)return"";for(var t=e.length,n="",r=0;r<t;){var u=e.charCodeAt(r);u<=255?n+=e[r++]:(n+="&#"+u+";",r++)}return n},n.encodeNonASCII=function(e){return(new n).encodeNonASCII(e)},e.exports=n},function(e,t,n){"use strict";function r(e,t){e.setAttribute("style","");for(var n in t)t.hasOwnProperty(n)&&(e.style[n]=t[n])}n.d(t,"a",function(){return r})},function(e,t){!function(){"use strict";function t(e){return 48<=e&&e<=57}function n(e){return 48<=e&&e<=57||97<=e&&e<=102||65<=e&&e<=70}function r(e){return e>=48&&e<=55}function u(e){return 32===e||9===e||11===e||12===e||160===e||e>=5760&&d.indexOf(e)>=0}function o(e){return 10===e||13===e||8232===e||8233===e}function a(e){return e<=65535?String.fromCharCode(e):String.fromCharCode(Math.floor((e-65536)/1024)+55296)+String.fromCharCode((e-65536)%1024+56320)}function i(e){return e<128?D[e]:f.NonAsciiIdentifierStart.test(a(e))}function l(e){return e<128?h[e]:f.NonAsciiIdentifierPart.test(a(e))}function s(e){return e<128?D[e]:p.NonAsciiIdentifierStart.test(a(e))}function c(e){return e<128?h[e]:p.NonAsciiIdentifierPart.test(a(e))}var p,f,d,D,h,g;for(f={NonAsciiIdentifierStart:/[\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0-\\u08B2\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D60\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA78E\\uA790-\\uA7AD\\uA7B0\\uA7B1\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB5F\\uAB64\\uAB65\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]/,NonAsciiIdentifierPart:/[\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0300-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u0483-\\u0487\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0610-\\u061A\\u0620-\\u0669\\u066E-\\u06D3\\u06D5-\\u06DC\\u06DF-\\u06E8\\u06EA-\\u06FC\\u06FF\\u0710-\\u074A\\u074D-\\u07B1\\u07C0-\\u07F5\\u07FA\\u0800-\\u082D\\u0840-\\u085B\\u08A0-\\u08B2\\u08E4-\\u0963\\u0966-\\u096F\\u0971-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BC-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09E6-\\u09F1\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A66-\\u0A75\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABC-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AD0\\u0AE0-\\u0AE3\\u0AE6-\\u0AEF\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3C-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B66-\\u0B6F\\u0B71\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD0\\u0BD7\\u0BE6-\\u0BEF\\u0C00-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C58\\u0C59\\u0C60-\\u0C63\\u0C66-\\u0C6F\\u0C81-\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBC-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CDE\\u0CE0-\\u0CE3\\u0CE6-\\u0CEF\\u0CF1\\u0CF2\\u0D01-\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4E\\u0D57\\u0D60-\\u0D63\\u0D66-\\u0D6F\\u0D7A-\\u0D7F\\u0D82\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DE6-\\u0DEF\\u0DF2\\u0DF3\\u0E01-\\u0E3A\\u0E40-\\u0E4E\\u0E50-\\u0E59\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB9\\u0EBB-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDC-\\u0EDF\\u0F00\\u0F18\\u0F19\\u0F20-\\u0F29\\u0F35\\u0F37\\u0F39\\u0F3E-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F84\\u0F86-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u1000-\\u1049\\u1050-\\u109D\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u135F\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1714\\u1720-\\u1734\\u1740-\\u1753\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773\\u1780-\\u17D3\\u17D7\\u17DC\\u17DD\\u17E0-\\u17E9\\u180B-\\u180D\\u1810-\\u1819\\u1820-\\u1877\\u1880-\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1920-\\u192B\\u1930-\\u193B\\u1946-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u19D0-\\u19D9\\u1A00-\\u1A1B\\u1A20-\\u1A5E\\u1A60-\\u1A7C\\u1A7F-\\u1A89\\u1A90-\\u1A99\\u1AA7\\u1AB0-\\u1ABD\\u1B00-\\u1B4B\\u1B50-\\u1B59\\u1B6B-\\u1B73\\u1B80-\\u1BF3\\u1C00-\\u1C37\\u1C40-\\u1C49\\u1C4D-\\u1C7D\\u1CD0-\\u1CD2\\u1CD4-\\u1CF6\\u1CF8\\u1CF9\\u1D00-\\u1DF5\\u1DFC-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u200C\\u200D\\u203F\\u2040\\u2054\\u2071\\u207F\\u2090-\\u209C\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D7F-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2DE0-\\u2DFF\\u2E2F\\u3005-\\u3007\\u3021-\\u302F\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u3099\\u309A\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA62B\\uA640-\\uA66F\\uA674-\\uA67D\\uA67F-\\uA69D\\uA69F-\\uA6F1\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA78E\\uA790-\\uA7AD\\uA7B0\\uA7B1\\uA7F7-\\uA827\\uA840-\\uA873\\uA880-\\uA8C4\\uA8D0-\\uA8D9\\uA8E0-\\uA8F7\\uA8FB\\uA900-\\uA92D\\uA930-\\uA953\\uA960-\\uA97C\\uA980-\\uA9C0\\uA9CF-\\uA9D9\\uA9E0-\\uA9FE\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA50-\\uAA59\\uAA60-\\uAA76\\uAA7A-\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEF\\uAAF2-\\uAAF6\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB5F\\uAB64\\uAB65\\uABC0-\\uABEA\\uABEC\\uABED\\uABF0-\\uABF9\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE00-\\uFE0F\\uFE20-\\uFE2D\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF10-\\uFF19\\uFF21-\\uFF3A\\uFF3F\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]/},p={NonAsciiIdentifierStart:/[\\xAA\\xB5\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0620-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u08A0-\\u08B2\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0CF1\\u0CF2\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D60\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1CE9-\\u1CEC\\u1CEE-\\u1CF1\\u1CF5\\u1CF6\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2118-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309B-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA78E\\uA790-\\uA7AD\\uA7B0\\uA7B1\\uA7F7-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB5F\\uAB64\\uAB65\\uABC0-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDF00-\\uDF1F\\uDF30-\\uDF4A\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48]|\\uD804[\\uDC03-\\uDC37\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDD03-\\uDD26\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDDA\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDEB0-\\uDEDE\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF5D-\\uDF61]|\\uD805[\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDD80-\\uDDAE\\uDE00-\\uDE2F\\uDE44\\uDE80-\\uDEAA]|\\uD806[\\uDCA0-\\uDCDF\\uDCFF\\uDEC0-\\uDEF8]|\\uD808[\\uDC00-\\uDF98]|\\uD809[\\uDC00-\\uDC6E]|[\\uD80C\\uD840-\\uD868\\uD86A-\\uD86C][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF40-\\uDF43\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50\\uDF93-\\uDF9F]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB]|\\uD83A[\\uDC00-\\uDCC4]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D]|\\uD87E[\\uDC00-\\uDE1D]/,NonAsciiIdentifierPart:/[\\xAA\\xB5\\xB7\\xBA\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0300-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u0483-\\u0487\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0610-\\u061A\\u0620-\\u0669\\u066E-\\u06D3\\u06D5-\\u06DC\\u06DF-\\u06E8\\u06EA-\\u06FC\\u06FF\\u0710-\\u074A\\u074D-\\u07B1\\u07C0-\\u07F5\\u07FA\\u0800-\\u082D\\u0840-\\u085B\\u08A0-\\u08B2\\u08E4-\\u0963\\u0966-\\u096F\\u0971-\\u0983\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BC-\\u09C4\\u09C7\\u09C8\\u09CB-\\u09CE\\u09D7\\u09DC\\u09DD\\u09DF-\\u09E3\\u09E6-\\u09F1\\u0A01-\\u0A03\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A3C\\u0A3E-\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A59-\\u0A5C\\u0A5E\\u0A66-\\u0A75\\u0A81-\\u0A83\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABC-\\u0AC5\\u0AC7-\\u0AC9\\u0ACB-\\u0ACD\\u0AD0\\u0AE0-\\u0AE3\\u0AE6-\\u0AEF\\u0B01-\\u0B03\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3C-\\u0B44\\u0B47\\u0B48\\u0B4B-\\u0B4D\\u0B56\\u0B57\\u0B5C\\u0B5D\\u0B5F-\\u0B63\\u0B66-\\u0B6F\\u0B71\\u0B82\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BBE-\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCD\\u0BD0\\u0BD7\\u0BE6-\\u0BEF\\u0C00-\\u0C03\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D-\\u0C44\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C58\\u0C59\\u0C60-\\u0C63\\u0C66-\\u0C6F\\u0C81-\\u0C83\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBC-\\u0CC4\\u0CC6-\\u0CC8\\u0CCA-\\u0CCD\\u0CD5\\u0CD6\\u0CDE\\u0CE0-\\u0CE3\\u0CE6-\\u0CEF\\u0CF1\\u0CF2\\u0D01-\\u0D03\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D-\\u0D44\\u0D46-\\u0D48\\u0D4A-\\u0D4E\\u0D57\\u0D60-\\u0D63\\u0D66-\\u0D6F\\u0D7A-\\u0D7F\\u0D82\\u0D83\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DCA\\u0DCF-\\u0DD4\\u0DD6\\u0DD8-\\u0DDF\\u0DE6-\\u0DEF\\u0DF2\\u0DF3\\u0E01-\\u0E3A\\u0E40-\\u0E4E\\u0E50-\\u0E59\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB9\\u0EBB-\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EC8-\\u0ECD\\u0ED0-\\u0ED9\\u0EDC-\\u0EDF\\u0F00\\u0F18\\u0F19\\u0F20-\\u0F29\\u0F35\\u0F37\\u0F39\\u0F3E-\\u0F47\\u0F49-\\u0F6C\\u0F71-\\u0F84\\u0F86-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u1000-\\u1049\\u1050-\\u109D\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u135D-\\u135F\\u1369-\\u1371\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u170C\\u170E-\\u1714\\u1720-\\u1734\\u1740-\\u1753\\u1760-\\u176C\\u176E-\\u1770\\u1772\\u1773\\u1780-\\u17D3\\u17D7\\u17DC\\u17DD\\u17E0-\\u17E9\\u180B-\\u180D\\u1810-\\u1819\\u1820-\\u1877\\u1880-\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1920-\\u192B\\u1930-\\u193B\\u1946-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u19D0-\\u19DA\\u1A00-\\u1A1B\\u1A20-\\u1A5E\\u1A60-\\u1A7C\\u1A7F-\\u1A89\\u1A90-\\u1A99\\u1AA7\\u1AB0-\\u1ABD\\u1B00-\\u1B4B\\u1B50-\\u1B59\\u1B6B-\\u1B73\\u1B80-\\u1BF3\\u1C00-\\u1C37\\u1C40-\\u1C49\\u1C4D-\\u1C7D\\u1CD0-\\u1CD2\\u1CD4-\\u1CF6\\u1CF8\\u1CF9\\u1D00-\\u1DF5\\u1DFC-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u200C\\u200D\\u203F\\u2040\\u2054\\u2071\\u207F\\u2090-\\u209C\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2118-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2160-\\u2188\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2CE4\\u2CEB-\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D7F-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2DE0-\\u2DFF\\u3005-\\u3007\\u3021-\\u302F\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u3099-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31BA\\u31F0-\\u31FF\\u3400-\\u4DB5\\u4E00-\\u9FCC\\uA000-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA62B\\uA640-\\uA66F\\uA674-\\uA67D\\uA67F-\\uA69D\\uA69F-\\uA6F1\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA78E\\uA790-\\uA7AD\\uA7B0\\uA7B1\\uA7F7-\\uA827\\uA840-\\uA873\\uA880-\\uA8C4\\uA8D0-\\uA8D9\\uA8E0-\\uA8F7\\uA8FB\\uA900-\\uA92D\\uA930-\\uA953\\uA960-\\uA97C\\uA980-\\uA9C0\\uA9CF-\\uA9D9\\uA9E0-\\uA9FE\\uAA00-\\uAA36\\uAA40-\\uAA4D\\uAA50-\\uAA59\\uAA60-\\uAA76\\uAA7A-\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEF\\uAAF2-\\uAAF6\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB5F\\uAB64\\uAB65\\uABC0-\\uABEA\\uABEC\\uABED\\uABF0-\\uABF9\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE00-\\uFE0F\\uFE20-\\uFE2D\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF10-\\uFF19\\uFF21-\\uFF3A\\uFF3F\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD40-\\uDD74\\uDDFD\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDEE0\\uDF00-\\uDF1F\\uDF30-\\uDF4A\\uDF50-\\uDF7A\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDCA0-\\uDCA9\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC60-\\uDC76\\uDC80-\\uDC9E\\uDD00-\\uDD15\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBE\\uDDBF\\uDE00-\\uDE03\\uDE05\\uDE06\\uDE0C-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE33\\uDE38-\\uDE3A\\uDE3F\\uDE60-\\uDE7C\\uDE80-\\uDE9C\\uDEC0-\\uDEC7\\uDEC9-\\uDEE6\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF60-\\uDF72\\uDF80-\\uDF91]|\\uD803[\\uDC00-\\uDC48]|\\uD804[\\uDC00-\\uDC46\\uDC66-\\uDC6F\\uDC7F-\\uDCBA\\uDCD0-\\uDCE8\\uDCF0-\\uDCF9\\uDD00-\\uDD34\\uDD36-\\uDD3F\\uDD50-\\uDD73\\uDD76\\uDD80-\\uDDC4\\uDDD0-\\uDDDA\\uDE00-\\uDE11\\uDE13-\\uDE37\\uDEB0-\\uDEEA\\uDEF0-\\uDEF9\\uDF01-\\uDF03\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3C-\\uDF44\\uDF47\\uDF48\\uDF4B-\\uDF4D\\uDF57\\uDF5D-\\uDF63\\uDF66-\\uDF6C\\uDF70-\\uDF74]|\\uD805[\\uDC80-\\uDCC5\\uDCC7\\uDCD0-\\uDCD9\\uDD80-\\uDDB5\\uDDB8-\\uDDC0\\uDE00-\\uDE40\\uDE44\\uDE50-\\uDE59\\uDE80-\\uDEB7\\uDEC0-\\uDEC9]|\\uD806[\\uDCA0-\\uDCE9\\uDCFF\\uDEC0-\\uDEF8]|\\uD808[\\uDC00-\\uDF98]|\\uD809[\\uDC00-\\uDC6E]|[\\uD80C\\uD840-\\uD868\\uD86A-\\uD86C][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDE60-\\uDE69\\uDED0-\\uDEED\\uDEF0-\\uDEF4\\uDF00-\\uDF36\\uDF40-\\uDF43\\uDF50-\\uDF59\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDF00-\\uDF44\\uDF50-\\uDF7E\\uDF8F-\\uDF9F]|\\uD82C[\\uDC00\\uDC01]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99\\uDC9D\\uDC9E]|\\uD834[\\uDD65-\\uDD69\\uDD6D-\\uDD72\\uDD7B-\\uDD82\\uDD85-\\uDD8B\\uDDAA-\\uDDAD\\uDE42-\\uDE44]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB\\uDFCE-\\uDFFF]|\\uD83A[\\uDC00-\\uDCC4\\uDCD0-\\uDCD6]|\\uD83B[\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD869[\\uDC00-\\uDED6\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF34\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D]|\\uD87E[\\uDC00-\\uDE1D]|\\uDB40[\\uDD00-\\uDDEF]/},d=[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279],D=new Array(128),g=0;g<128;++g)D[g]=g>=97&&g<=122||g>=65&&g<=90||36===g||95===g;for(h=new Array(128),g=0;g<128;++g)h[g]=g>=97&&g<=122||g>=65&&g<=90||g>=48&&g<=57||36===g||95===g;e.exports={isDecimalDigit:t,isHexDigit:n,isOctalDigit:r,isWhiteSpace:u,isLineTerminator:o,isIdentifierStartES5:i,isIdentifierPartES5:l,isIdentifierStartES6:s,isIdentifierPartES6:c}}()},function(e,t){function n(){throw new Error("setTimeout has not been defined")}function r(){throw new Error("clearTimeout has not been defined")}function u(e){if(c===setTimeout)return setTimeout(e,0);if((c===n||!c)&&setTimeout)return c=setTimeout,setTimeout(e,0);try{return c(e,0)}catch(t){try{return c.call(null,e,0)}catch(t){return c.call(this,e,0)}}}function o(e){if(p===clearTimeout)return clearTimeout(e);if((p===r||!p)&&clearTimeout)return p=clearTimeout,clearTimeout(e);try{return p(e)}catch(t){try{return p.call(null,e)}catch(t){return p.call(this,e)}}}function a(){h&&d&&(h=!1,d.length?D=d.concat(D):g=-1,D.length&&i())}function i(){if(!h){var e=u(a);h=!0;for(var t=D.length;t;){for(d=D,D=[];++g<t;)d&&d[g].run();g=-1,t=D.length}d=null,h=!1,o(e)}}function l(e,t){this.fun=e,this.array=t}function s(){}var c,p,f=e.exports={};!function(){try{c="function"===typeof setTimeout?setTimeout:n}catch(e){c=n}try{p="function"===typeof clearTimeout?clearTimeout:r}catch(e){p=r}}();var d,D=[],h=!1,g=-1;f.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];D.push(new l(e,t)),1!==D.length||h||u(i)},l.prototype.run=function(){this.fun.apply(null,this.array)},f.title="browser",f.browser=!0,f.env={},f.argv=[],f.version="",f.versions={},f.on=s,f.addListener=s,f.once=s,f.off=s,f.removeListener=s,f.removeAllListeners=s,f.emit=s,f.prependListener=s,f.prependOnceListener=s,f.listeners=function(e){return[]},f.binding=function(e){throw new Error("process.binding is not supported")},f.cwd=function(){return"/"},f.chdir=function(e){throw new Error("process.chdir is not supported")},f.umask=function(){return 0}},function(e,t,n){"use strict";e.exports=function(){return/[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-PRZcf-nqry=><]/g}},function(e,t,n){"use strict";function r(e){var t=e.currentBuildError,n=e.currentRuntimeErrorRecords,r=e.dismissRuntimeErrors,u=e.editorHandler;return t?a.a.createElement(s.a,{error:t,editorHandler:u}):n.length>0?a.a.createElement(c.a,{errorRecords:n,close:r,editorHandler:u}):null}Object.defineProperty(t,"__esModule",{value:!0});var u=n(19),o=(n.n(u),n(0)),a=n.n(o),i=n(25),l=n.n(i),s=n(35),c=n(40),p=n(1),f=n(14),d=null;window.updateContent=function(e){var t=r(e);return null===t?(l.a.unmountComponentAtNode(d),!1):(l.a.render(t,d),!0)},document.body.style.margin="0",document.body.style["max-width"]="100vw",d=document.createElement("div"),Object(f.a)(d,p.c),document.body.appendChild(d),window.parent.__REACT_ERROR_OVERLAY_GLOBAL_HOOK__.iframeReady()},function(e,t,n){"undefined"===typeof Promise&&(n(20).enable(),window.Promise=n(23)),Object.assign=n(2)},function(e,t,n){"use strict";function r(){s=!1,i._47=null,i._71=null}function u(e){function t(t){(e.allRejections||a(p[t].error,e.whitelist||l))&&(p[t].displayId=c++,e.onUnhandled?(p[t].logged=!0,e.onUnhandled(p[t].displayId,p[t].error)):(p[t].logged=!0,o(p[t].displayId,p[t].error)))}function n(t){p[t].logged&&(e.onHandled?e.onHandled(p[t].displayId,p[t].error):p[t].onUnhandled||(console.warn("Promise Rejection Handled (id: "+p[t].displayId+"):"),console.warn(\' This means you can ignore any previous messages of the form "Possible Unhandled Promise Rejection" with id \'+p[t].displayId+".")))}e=e||{},s&&r(),s=!0;var u=0,c=0,p={};i._47=function(e){2===e._83&&p[e._56]&&(p[e._56].logged?n(e._56):clearTimeout(p[e._56].timeout),delete p[e._56])},i._71=function(e,n){0===e._75&&(e._56=u++,p[e._56]={displayId:null,error:n,timeout:setTimeout(t.bind(null,e._56),a(n,l)?100:2e3),logged:!1})}}function o(e,t){console.warn("Possible Unhandled Promise Rejection (id: "+e+"):"),((t&&(t.stack||t))+"").split("\\n").forEach(function(e){console.warn(" "+e)})}function a(e,t){return t.some(function(t){return e instanceof t})}var i=n(4),l=[ReferenceError,TypeError,RangeError],s=!1;t.disable=r,t.enable=u},function(e,t,n){"use strict";(function(t){function n(e){a.length||(o(),i=!0),a[a.length]=e}function r(){for(;l<a.length;){var e=l;if(l+=1,a[e].call(),l>s){for(var t=0,n=a.length-l;t<n;t++)a[t]=a[t+l];a.length-=l,l=0}}a.length=0,l=0,i=!1}function u(e){return function(){function t(){clearTimeout(n),clearInterval(r),e()}var n=setTimeout(t,0),r=setInterval(t,50)}}e.exports=n;var o,a=[],i=!1,l=0,s=1024,c="undefined"!==typeof t?t:self,p=c.MutationObserver||c.WebKitMutationObserver;o="function"===typeof p?function(e){var t=1,n=new p(e),r=document.createTextNode("");return n.observe(r,{characterData:!0}),function(){t=-t,r.data=t}}(r):u(r),n.requestFlush=o,n.makeRequestCallFromTimer=u}).call(t,n(22))},function(e,t){var n;n=function(){return this}();try{n=n||Function("return this")()||(0,eval)("this")}catch(e){"object"===typeof window&&(n=window)}e.exports=n},function(e,t,n){"use strict";function r(e){var t=new u(u._44);return t._83=1,t._18=e,t}var u=n(4);e.exports=u;var o=r(!0),a=r(!1),i=r(null),l=r(void 0),s=r(0),c=r("");u.resolve=function(e){if(e instanceof u)return e;if(null===e)return i;if(void 0===e)return l;if(!0===e)return o;if(!1===e)return a;if(0===e)return s;if(""===e)return c;if("object"===typeof e||"function"===typeof e)try{var t=e.then;if("function"===typeof t)return new u(t.bind(e))}catch(e){return new u(function(t,n){n(e)})}return r(e)},u.all=function(e){var t=Array.prototype.slice.call(e);return new u(function(e,n){function r(a,i){if(i&&("object"===typeof i||"function"===typeof i)){if(i instanceof u&&i.then===u.prototype.then){for(;3===i._83;)i=i._18;return 1===i._83?r(a,i._18):(2===i._83&&n(i._18),void i.then(function(e){r(a,e)},n))}var l=i.then;if("function"===typeof l){return void new u(l.bind(i)).then(function(e){r(a,e)},n)}}t[a]=i,0===--o&&e(t)}if(0===t.length)return e([]);for(var o=t.length,a=0;a<t.length;a++)r(a,t[a])})},u.reject=function(e){return new u(function(t,n){n(e)})},u.race=function(e){return new u(function(t,n){e.forEach(function(e){u.resolve(e).then(t,n)})})},u.prototype.catch=function(e){return this.then(null,e)}},function(e,t,n){"use strict";function r(e){for(var t=arguments.length-1,n="Minified React error #"+e+"; visit http://facebook.github.io/react/docs/error-decoder.html?invariant="+e,r=0;r<t;r++)n+="&args[]="+encodeURIComponent(arguments[r+1]);throw t=Error(n+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."),t.name="Invariant Violation",t.framesToPop=1,t}function u(e,t,n){this.props=e,this.context=t,this.refs=C,this.updater=n||A}function o(e,t,n){this.props=e,this.context=t,this.refs=C,this.updater=n||A}function a(){}function i(e,t,n){this.props=e,this.context=t,this.refs=C,this.updater=n||A}function l(e,t,n,r,u,o,a){return{$$typeof:w,type:e,key:t,ref:n,props:a,_owner:o}}function s(e){var t={"=":"=0",":":"=2"};return"$"+(""+e).replace(/[=:]/g,function(e){return t[e]})}function c(e,t,n,r){if(P.length){var u=P.pop();return u.result=e,u.keyPrefix=t,u.func=n,u.context=r,u.count=0,u}return{result:e,keyPrefix:t,func:n,context:r,count:0}}function p(e){e.result=null,e.keyPrefix=null,e.func=null,e.context=null,e.count=0,10>P.length&&P.push(e)}function f(e,t,n,u){var o=typeof e;if("undefined"!==o&&"boolean"!==o||(e=null),null===e||"string"===o||"number"===o||"object"===o&&e.$$typeof===T)return n(u,e,""===t?"."+d(e,0):t),1;var a=0;if(t=""===t?".":t+":",Array.isArray(e))for(var i=0;i<e.length;i++){o=e[i];var l=t+d(o,i);a+=f(o,l,n,u)}else if("function"===typeof(l=x&&e[x]||e["@@iterator"]))for(e=l.call(e),i=0;!(o=e.next()).done;)o=o.value,l=t+d(o,i++),a+=f(o,l,n,u);else"object"===o&&(n=""+e,r("31","[object Object]"===n?"object with keys {"+Object.keys(e).join(", ")+"}":n,""));return a}function d(e,t){return"object"===typeof e&&null!==e&&null!=e.key?s(e.key):t.toString(36)}function D(e,t){e.func.call(e.context,t,e.count++)}function h(e,t,n){var r=e.result,u=e.keyPrefix;e=e.func.call(e.context,t,e.count++),Array.isArray(e)?g(e,r,n,E.thatReturnsArgument):null!=e&&(l.isValidElement(e)&&(e=l.cloneAndReplaceKey(e,u+(!e.key||t&&t.key===e.key?"":(""+e.key).replace(S,"$&/")+"/")+n)),r.push(e))}function g(e,t,n,r,u){var o="";null!=n&&(o=(""+n).replace(S,"$&/")+"/"),t=c(t,o,r,u),null==e||f(e,"",h,t),p(t)}var m=n(2),C=n(5);n(6);var E=n(3),A={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}};u.prototype.isReactComponent={},u.prototype.setState=function(e,t){"object"!==typeof e&&"function"!==typeof e&&null!=e&&r("85"),this.updater.enqueueSetState(this,e,t,"setState")},u.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},a.prototype=u.prototype;var F=o.prototype=new a;F.constructor=o,m(F,u.prototype),F.isPureReactComponent=!0;var b=i.prototype=new a;b.constructor=i,m(b,u.prototype),b.unstable_isAsyncReactComponent=!0,b.render=function(){return this.props.children};var y={Component:u,PureComponent:o,AsyncComponent:i},v={current:null},B=Object.prototype.hasOwnProperty,w="function"===typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,k={key:!0,ref:!0,__self:!0,__source:!0};l.createElement=function(e,t,n){var r,u={},o=null,a=null,i=null,s=null;if(null!=t)for(r in void 0!==t.ref&&(a=t.ref),void 0!==t.key&&(o=""+t.key),i=void 0===t.__self?null:t.__self,s=void 0===t.__source?null:t.__source,t)B.call(t,r)&&!k.hasOwnProperty(r)&&(u[r]=t[r]);var c=arguments.length-2;if(1===c)u.children=n;else if(1<c){for(var p=Array(c),f=0;f<c;f++)p[f]=arguments[f+2];u.children=p}if(e&&e.defaultProps)for(r in c=e.defaultProps)void 0===u[r]&&(u[r]=c[r]);return l(e,o,a,i,s,v.current,u)},l.createFactory=function(e){var t=l.createElement.bind(null,e);return t.type=e,t},l.cloneAndReplaceKey=function(e,t){return l(e.type,t,e.ref,e._self,e._source,e._owner,e.props)},l.cloneElement=function(e,t,n){var r=m({},e.props),u=e.key,o=e.ref,a=e._self,i=e._source,s=e._owner;if(null!=t){if(void 0!==t.ref&&(o=t.ref,s=v.current),void 0!==t.key&&(u=""+t.key),e.type&&e.type.defaultProps)var c=e.type.defaultProps;for(p in t)B.call(t,p)&&!k.hasOwnProperty(p)&&(r[p]=void 0===t[p]&&void 0!==c?c[p]:t[p])}var p=arguments.length-2;if(1===p)r.children=n;else if(1<p){c=Array(p);for(var f=0;f<p;f++)c[f]=arguments[f+2];r.children=c}return l(e.type,u,o,a,i,s,r)},l.isValidElement=function(e){return"object"===typeof e&&null!==e&&e.$$typeof===w};var x="function"===typeof Symbol&&Symbol.iterator,T="function"===typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,S=/\\/+/g,P=[],N={forEach:function(e,t,n){if(null==e)return e;t=c(null,null,t,n),null==e||f(e,"",D,t),p(t)},map:function(e,t,n){if(null==e)return e;var r=[];return g(e,r,null,t,n),r},count:function(e){return null==e?0:f(e,"",E.thatReturnsNull,null)},toArray:function(e){var t=[];return g(e,t,null,E.thatReturnsArgument),t}};e.exports={Children:{map:N.map,forEach:N.forEach,count:N.count,toArray:N.toArray,only:function(e){return l.isValidElement(e)||r("143"),e}},Component:y.Component,PureComponent:y.PureComponent,unstable_AsyncComponent:y.AsyncComponent,createElement:l.createElement,cloneElement:l.cloneElement,isValidElement:l.isValidElement,createFactory:l.createFactory,version:"16.0.0",__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:{ReactCurrentOwner:v,assign:m}}},function(e,t,n){"use strict";function r(){if("undefined"!==typeof{}&&"function"===typeof{}.checkDCE)try{({}).checkDCE(r)}catch(e){console.error(e)}}r(),e.exports=n(26)},function(e,t,n){"use strict";function r(e){for(var t=arguments.length-1,n="Minified React error #"+e+"; visit http://facebook.github.io/react/docs/error-decoder.html?invariant="+e,r=0;r<t;r++)n+="&args[]="+encodeURIComponent(arguments[r+1]);throw t=Error(n+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."),t.name="Invariant Violation",t.framesToPop=1,t}function u(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function o(){if(xt)for(var e in Tt){var t=Tt[e],n=xt.indexOf(e);if(-1<n||r("96",e),!St.plugins[n]){t.extractEvents||r("97",e),St.plugins[n]=t,n=t.eventTypes;for(var u in n){var o=void 0,i=n[u],l=t,s=u;St.eventNameDispatchConfigs.hasOwnProperty(s)&&r("99",s),St.eventNameDispatchConfigs[s]=i;var c=i.phasedRegistrationNames;if(c){for(o in c)c.hasOwnProperty(o)&&a(c[o],l,s);o=!0}else i.registrationName?(a(i.registrationName,l,s),o=!0):o=!1;o||r("98",u,e)}}}}function a(e,t,n){St.registrationNameModules[e]&&r("100",e),St.registrationNameModules[e]=t,St.registrationNameDependencies[e]=t.eventTypes[n].dependencies}function i(e,t){return(e&t)===t}function l(e){for(var t;t=e._renderedComponent;)e=t;return e}function s(e,t){e=l(e),e._hostNode=t,t[zt]=e}function c(e,t){if(!(e._flags&Vt.hasCachedChildNodes)){var n=e._renderedChildren;t=t.firstChild;var u;e:for(u in n)if(n.hasOwnProperty(u)){var o=n[u],a=l(o)._domID;if(0!==a){for(;null!==t;t=t.nextSibling){var i=t,c=a;if(i.nodeType===Ht&&i.getAttribute(jt)===""+c||i.nodeType===qt&&i.nodeValue===" react-text: "+c+" "||i.nodeType===qt&&i.nodeValue===" react-empty: "+c+" "){s(o,t);continue e}}r("32",a)}}e._flags|=Vt.hasCachedChildNodes}}function p(e){if(e[zt])return e[zt];for(var t=[];!e[zt];){if(t.push(e),!e.parentNode)return null;e=e.parentNode}var n=e[zt];if(n.tag===Ut||n.tag===Mt)return n;for(;e&&(n=e[zt]);e=t.pop()){var r=n;t.length&&c(n,e)}return r}function f(e){if("function"===typeof e.getName)return e.getName();if("number"===typeof e.tag){if("string"===typeof(e=e.type))return e;if("function"===typeof e)return e.displayName||e.name}return null}function d(e){var t=e;if(e.alternate)for(;t.return;)t=t.return;else{if((t.effectTag&nn)!==tn)return 1;for(;t.return;)if(t=t.return,(t.effectTag&nn)!==tn)return 1}return t.tag===Jt?2:3}function D(e){2!==d(e)&&r("188")}function h(e){var t=e.alternate;if(!t)return t=d(e),3===t&&r("188"),1===t?null:e;for(var n=e,u=t;;){var o=n.return,a=o?o.alternate:null;if(!o||!a)break;if(o.child===a.child){for(var i=o.child;i;){if(i===n)return D(o),e;if(i===u)return D(o),t;i=i.sibling}r("188")}if(n.return!==u.return)n=o,u=a;else{i=!1;for(var l=o.child;l;){if(l===n){i=!0,n=o,u=a;break}if(l===u){i=!0,u=o,n=a;break}l=l.sibling}if(!i){for(l=a.child;l;){if(l===n){i=!0,n=a,u=o;break}if(l===u){i=!0,u=a,n=o;break}l=l.sibling}i||r("189")}}n.alternate!==u&&r("190")}return n.tag!==Jt&&r("188"),n.stateNode.current===n?e:t}function g(e,t,n,r,u,o,a,i,l){un._hasCaughtError=!1,un._caughtError=null;var s=Array.prototype.slice.call(arguments,3);try{t.apply(n,s)}catch(e){un._caughtError=e,un._hasCaughtError=!0}}function m(){if(un._hasRethrowError){var e=un._rethrowError;throw un._rethrowError=null,un._hasRethrowError=!1,e}}function C(e,t,n,r){t=e.type||"unknown-event",e.currentTarget=an.getNodeFromInstance(r),on.invokeGuardedCallbackAndCatchFirstError(t,n,void 0,e),e.currentTarget=null}function E(e){if(e=ln.getInstanceFromNode(e))if("number"===typeof e.tag){sn&&"function"===typeof sn.restoreControlledState||r("194");var t=ln.getFiberCurrentPropsFromNode(e.stateNode);sn.restoreControlledState(e.stateNode,e.type,t)}else"function"!==typeof e.restoreControlledState&&r("195"),e.restoreControlledState()}function A(e,t,n,r,u,o){return e(t,n,r,u,o)}function F(e,t){return e(t)}function b(e,t){return F(e,t)}function y(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===hn?e.parentNode:e}function v(e){var t=e.targetInst;do{if(!t){e.ancestors.push(t);break}var n=t;if("number"===typeof n.tag){for(;n.return;)n=n.return;n=n.tag!==gn?null:n.stateNode.containerInfo}else{for(;n._hostParent;)n=n._hostParent;n=Gt.getNodeFromInstance(n).parentNode}if(!n)break;e.ancestors.push(t),t=Gt.getClosestInstanceFromNode(n)}while(t);for(n=0;n<e.ancestors.length;n++)t=e.ancestors[n],Cn._handleTopLevel(e.topLevelType,t,e.nativeEvent,y(e.nativeEvent))}function B(e,t){return null==t&&r("30"),null==e?t:Array.isArray(e)?Array.isArray(t)?(e.push.apply(e,t),e):(e.push(t),e):Array.isArray(t)?[e].concat(t):[e,t]}function w(e,t,n){Array.isArray(e)?e.forEach(t,n):e&&t.call(n,e)}function k(e,t){e&&(ln.executeDispatchesInOrder(e,t),e.isPersistent()||e.constructor.release(e))}function x(e){return k(e,!0)}function T(e){return k(e,!1)}function S(e,t,n){switch(e){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":return!(!n.disabled||"button"!==t&&"input"!==t&&"select"!==t&&"textarea"!==t);default:return!1}}function P(e,t){if(!gt.canUseDOM||t&&!("addEventListener"in document))return!1;t="on"+e;var n=t in document;return n||(n=document.createElement("div"),n.setAttribute(t,"return;"),n="function"===typeof n[t]),!n&&wt&&"wheel"===e&&(n=document.implementation.hasFeature("Events.wheel","3.0")),n}function N(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n["ms"+e]="MS"+t,n["O"+e]="o"+t.toLowerCase(),n}function _(e){if(yn[e])return yn[e];if(!bn[e])return e;var t,n=bn[e];for(t in n)if(n.hasOwnProperty(t)&&t in vn)return yn[e]=n[t];return""}function O(e){return Object.prototype.hasOwnProperty.call(e,xn)||(e[xn]=kn++,wn[e[xn]]={}),wn[e[xn]]}function I(e){return!!Hn.hasOwnProperty(e)||!Mn.hasOwnProperty(e)&&(Un.test(e)?Hn[e]=!0:(Mn[e]=!0,!1))}function R(){return null}function L(e){var t="";return ht.Children.forEach(e,function(e){null==e||"string"!==typeof e&&"number"!==typeof e||(t+=e)}),t}function U(e,t,n){if(e=e.options,t){t={};for(var r=0;r<n.length;r++)t["$"+n[r]]=!0;for(n=0;n<e.length;n++)r=t.hasOwnProperty("$"+e[n].value),e[n].selected!==r&&(e[n].selected=r)}else{for(n=""+n,t=null,r=0;r<e.length;r++){if(e[r].value===n)return void(e[r].selected=!0);null!==t||e[r].disabled||(t=e[r])}null!==t&&(t.selected=!0)}}function M(e,t){t&&(Jn[e]&&(null!=t.children||null!=t.dangerouslySetInnerHTML)&&r("137",e,""),null!=t.dangerouslySetInnerHTML&&(null!=t.children&&r("60"),"object"===typeof t.dangerouslySetInnerHTML&&"__html"in t.dangerouslySetInnerHTML||r("61")),null!=t.style&&"object"!==typeof t.style&&r("62",""))}function H(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function q(e){var t=H(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&"function"===typeof n.get&&"function"===typeof n.set)return Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:!0,get:function(){return n.get.call(this)},set:function(e){r=""+e,n.set.call(this,e)}}),{getValue:function(){return r},setValue:function(e){r=""+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}function j(e,t){if(-1===e.indexOf("-"))return"string"===typeof t.is;switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}function V(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===rr)return void(n.nodeValue=t)}e.textContent=t}function W(e,t){ir(t,e.nodeType===or||e.nodeType===ar?e:e.ownerDocument)}function z(e,t){return e!==Nr&&e!==Pr||t!==Nr&&t!==Pr?e===Sr&&t!==Sr?-255:e!==Sr&&t===Sr?255:e-t:0}function K(){return{first:null,last:null,hasForceUpdate:!1,callbackList:null}}function G(e,t,n,r){null!==n?n.next=t:(t.next=e.first,e.first=t),null!==r?t.next=r:e.last=t}function Y(e,t){t=t.priorityLevel;var n=null;if(null!==e.last&&0>=z(e.last.priorityLevel,t))n=e.last;else for(e=e.first;null!==e&&0>=z(e.priorityLevel,t);)n=e,e=e.next;return n}function $(e,t){var n=e.alternate,r=e.updateQueue;null===r&&(r=e.updateQueue=K()),null!==n?null===(e=n.updateQueue)&&(e=n.updateQueue=K()):e=null,Ir=r,Rr=e!==r?e:null;var u=Ir;n=Rr;var o=Y(u,t),a=null!==o?o.next:u.first;return null===n?(G(u,t,o,a),null):(r=Y(n,t),e=null!==r?r.next:n.first,G(u,t,o,a),a===e&&null!==a||o===r&&null!==o?(null===r&&(n.first=t),null===e&&(n.last=null),null):(t={priorityLevel:t.priorityLevel,partialState:t.partialState,callback:t.callback,isReplace:t.isReplace,isForced:t.isForced,isTopLevelUnmount:t.isTopLevelUnmount,next:null},G(n,t,r,e),t))}function Q(e,t,n,r){return e=e.partialState,"function"===typeof e?e.call(t,n,r):e}function X(e,t,n){e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=n}function J(e){return e.tag===jr&&null!=e.type.childContextTypes}function Z(e,t){var n=e.stateNode,u=e.type.childContextTypes;if("function"!==typeof n.getChildContext)return t;n=n.getChildContext();for(var o in n)o in u||r("108",f(e)||"Unknown",o);return mt({},t,n)}function ee(e,t,n){this.tag=e,this.key=t,this.stateNode=this.type=null,this.sibling=this.child=this.return=null,this.index=0,this.memoizedState=this.updateQueue=this.memoizedProps=this.pendingProps=this.ref=null,this.internalContextTag=n,this.effectTag=su,this.lastEffect=this.firstEffect=this.nextEffect=null,this.pendingWorkPriority=iu,this.alternate=null}function te(e,t,n){var u=void 0;return"function"===typeof e?(u=e.prototype&&e.prototype.isReactComponent?new ee(Zr,t,n):new ee(Jr,t,n),u.type=e):"string"===typeof e?(u=new ee(tu,t,n),u.type=e):"object"===typeof e&&null!==e&&"number"===typeof e.tag?u=e:r("130",null==e?e:typeof e,""),u}function ne(e){return null===e||"undefined"===typeof e?null:(e=Hu&&e[Hu]||e["@@iterator"],"function"===typeof e?e:null)}function re(e,t){var n=t.ref;if(null!==n&&"function"!==typeof n){if(t._owner){t=t._owner;var u=void 0;t&&("number"===typeof t.tag?(t.tag!==Pu&&r("110"),u=t.stateNode):u=t.getPublicInstance()),u||r("147",n);var o=""+n;return null!==e&&null!==e.ref&&e.ref._stringRef===o?e.ref:(e=function(e){var t=u.refs===At?u.refs={}:u.refs;null===e?delete t[o]:t[o]=e},e._stringRef=o,e)}"string"!==typeof n&&r("148"),t._owner||r("149",n)}return n}function ue(e,t){"textarea"!==e.type&&r("31","[object Object]"===Object.prototype.toString.call(t)?"object with keys {"+Object.keys(t).join(", ")+"}":t,"")}function oe(e,t){function n(n,r){if(t){if(!e){if(null===r.alternate)return;r=r.alternate}var u=n.lastEffect;null!==u?(u.nextEffect=r,n.lastEffect=r):n.firstEffect=n.lastEffect=r,r.nextEffect=null,r.effectTag=Mu}}function u(e,r){if(!t)return null;for(;null!==r;)n(e,r),r=r.sibling;return null}function o(e,t){for(e=new Map;null!==t;)null!==t.key?e.set(t.key,t):e.set(t.index,t),t=t.sibling;return e}function a(t,n){return e?(t=bu(t,n),t.index=0,t.sibling=null,t):(t.pendingWorkPriority=n,t.effectTag=Lu,t.index=0,t.sibling=null,t)}function i(e,n,r){return e.index=r,t?null!==(r=e.alternate)?(r=r.index,r<n?(e.effectTag=Uu,n):r):(e.effectTag=Uu,n):n}function l(e){return t&&null===e.alternate&&(e.effectTag=Uu),e}function s(e,t,n,r){return null===t||t.tag!==Nu?(n=Bu(n,e.internalContextTag,r),n.return=e,n):(t=a(t,r),t.pendingProps=n,t.return=e,t)}function c(e,t,n,r){return null===t||t.type!==n.type?(r=yu(n,e.internalContextTag,r),r.ref=re(t,n),r.return=e,r):(r=a(t,r),r.ref=re(t,n),r.pendingProps=n.props,r.return=e,r)}function p(e,t,n,r){return null===t||t.tag!==Ou?(n=wu(n,e.internalContextTag,r),n.return=e,n):(t=a(t,r),t.pendingProps=n,t.return=e,t)}function f(e,t,n,r){return null===t||t.tag!==Iu?(t=ku(n,e.internalContextTag,r),t.type=n.value,t.return=e,t):(t=a(t,r),t.type=n.value,t.return=e,t)}function d(e,t,n,r){return null===t||t.tag!==_u||t.stateNode.containerInfo!==n.containerInfo||t.stateNode.implementation!==n.implementation?(n=xu(n,e.internalContextTag,r),n.return=e,n):(t=a(t,r),t.pendingProps=n.children||[],t.return=e,t)}function D(e,t,n,r){return null===t||t.tag!==Ru?(n=vu(n,e.internalContextTag,r),n.return=e,n):(t=a(t,r),t.pendingProps=n,t.return=e,t)}function h(e,t,n){if("string"===typeof t||"number"===typeof t)return t=Bu(""+t,e.internalContextTag,n),t.return=e,t;if("object"===typeof t&&null!==t){switch(t.$$typeof){case qu:return n=yu(t,e.internalContextTag,n),n.ref=re(null,t),n.return=e,n;case Eu:return t=wu(t,e.internalContextTag,n),t.return=e,t;case Au:return n=ku(t,e.internalContextTag,n),n.type=t.value,n.return=e,n;case Fu:return t=xu(t,e.internalContextTag,n),t.return=e,t}if(Tu(t)||ne(t))return t=vu(t,e.internalContextTag,n),t.return=e,t;ue(e,t)}return null}function g(e,t,n,r){var u=null!==t?t.key:null;if("string"===typeof n||"number"===typeof n)return null!==u?null:s(e,t,""+n,r);if("object"===typeof n&&null!==n){switch(n.$$typeof){case qu:return n.key===u?c(e,t,n,r):null;case Eu:return n.key===u?p(e,t,n,r):null;case Au:return null===u?f(e,t,n,r):null;case Fu:return n.key===u?d(e,t,n,r):null}if(Tu(n)||ne(n))return null!==u?null:D(e,t,n,r);ue(e,n)}return null}function m(e,t,n,r,u){if("string"===typeof r||"number"===typeof r)return e=e.get(n)||null,s(t,e,""+r,u);if("object"===typeof r&&null!==r){switch(r.$$typeof){case qu:return e=e.get(null===r.key?n:r.key)||null,c(t,e,r,u);case Eu:return e=e.get(null===r.key?n:r.key)||null,p(t,e,r,u);case Au:return e=e.get(n)||null,f(t,e,r,u);case Fu:return e=e.get(null===r.key?n:r.key)||null,d(t,e,r,u)}if(Tu(r)||ne(r))return e=e.get(n)||null,D(t,e,r,u);ue(t,r)}return null}function C(e,r,a,l){for(var s=null,c=null,p=r,f=r=0,d=null;null!==p&&f<a.length;f++){p.index>f?(d=p,p=null):d=p.sibling;var D=g(e,p,a[f],l);if(null===D){null===p&&(p=d);break}t&&p&&null===D.alternate&&n(e,p),r=i(D,r,f),null===c?s=D:c.sibling=D,c=D,p=d}if(f===a.length)return u(e,p),s;if(null===p){for(;f<a.length;f++)(p=h(e,a[f],l))&&(r=i(p,r,f),null===c?s=p:c.sibling=p,c=p);return s}for(p=o(e,p);f<a.length;f++)(d=m(p,e,f,a[f],l))&&(t&&null!==d.alternate&&p.delete(null===d.key?f:d.key),r=i(d,r,f),null===c?s=d:c.sibling=d,c=d);return t&&p.forEach(function(t){return n(e,t)}),s}function E(e,a,l,s){var c=ne(l);"function"!==typeof c&&r("150"),null==(l=c.call(l))&&r("151");for(var p=c=null,f=a,d=a=0,D=null,C=l.next();null!==f&&!C.done;d++,C=l.next()){f.index>d?(D=f,f=null):D=f.sibling;var E=g(e,f,C.value,s);if(null===E){f||(f=D);break}t&&f&&null===E.alternate&&n(e,f),a=i(E,a,d),null===p?c=E:p.sibling=E,p=E,f=D}if(C.done)return u(e,f),c;if(null===f){for(;!C.done;d++,C=l.next())null!==(C=h(e,C.value,s))&&(a=i(C,a,d),null===p?c=C:p.sibling=C,p=C);return c}for(f=o(e,f);!C.done;d++,C=l.next())null!==(C=m(f,e,d,C.value,s))&&(t&&null!==C.alternate&&f.delete(null===C.key?d:C.key),a=i(C,a,d),null===p?c=C:p.sibling=C,p=C);return t&&f.forEach(function(t){return n(e,t)}),c}return function(e,t,o,i){var s="object"===typeof o&&null!==o;if(s)switch(o.$$typeof){case qu:e:{var c=o.key;for(s=t;null!==s;){if(s.key===c){if(s.type===o.type){u(e,s.sibling),t=a(s,i),t.ref=re(s,o),t.pendingProps=o.props,t.return=e,e=t;break e}u(e,s);break}n(e,s),s=s.sibling}i=yu(o,e.internalContextTag,i),i.ref=re(t,o),i.return=e,e=i}return l(e);case Eu:e:{for(s=o.key;null!==t;){if(t.key===s){if(t.tag===Ou){u(e,t.sibling),t=a(t,i),t.pendingProps=o,t.return=e,e=t;break e}u(e,t);break}n(e,t),t=t.sibling}o=wu(o,e.internalContextTag,i),o.return=e,e=o}return l(e);case Au:e:{if(null!==t){if(t.tag===Iu){u(e,t.sibling),t=a(t,i),t.type=o.value,t.return=e,e=t;break e}u(e,t)}t=ku(o,e.internalContextTag,i),t.type=o.value,t.return=e,e=t}return l(e);case Fu:e:{for(s=o.key;null!==t;){if(t.key===s){if(t.tag===_u&&t.stateNode.containerInfo===o.containerInfo&&t.stateNode.implementation===o.implementation){u(e,t.sibling),t=a(t,i),t.pendingProps=o.children||[],t.return=e,e=t;break e}u(e,t);break}n(e,t),t=t.sibling}o=xu(o,e.internalContextTag,i),o.return=e,e=o}return l(e)}if("string"===typeof o||"number"===typeof o)return o=""+o,null!==t&&t.tag===Nu?(u(e,t.sibling),t=a(t,i),t.pendingProps=o,t.return=e,e=t):(u(e,t),o=Bu(o,e.internalContextTag,i),o.return=e,e=o),l(e);if(Tu(o))return C(e,t,o,i);if(ne(o))return E(e,t,o,i);if(s&&ue(e,o),"undefined"===typeof o)switch(e.tag){case Pu:case Su:o=e.type,r("152",o.displayName||o.name||"Component")}return u(e,t)}}function ae(e,t,n,u){function o(e,t){t.updater=a,e.stateNode=t,Yt.set(t,e)}var a={isMounted:ro,enqueueSetState:function(n,r,u){n=Yt.get(n);var o=t(n,!1);Ju(n,r,void 0===u?null:u,o),e(n,o)},enqueueReplaceState:function(n,r,u){n=Yt.get(n);var o=t(n,!1);Zu(n,r,void 0===u?null:u,o),e(n,o)},enqueueForceUpdate:function(n,r){n=Yt.get(n);var u=t(n,!1);eo(n,void 0===r?null:r,u),e(n,u)}};return{adoptClassInstance:o,constructClassInstance:function(e,t){var n=e.type,r=Qu(e),u=Xu(e),a=u?$u(e,r):At;return t=new n(t,a),o(e,t),u&&Yu(e,r,a),t},mountClassInstance:function(e,t){var n=e.alternate,u=e.stateNode,o=u.state||null,i=e.pendingProps;i||r("158");var l=Qu(e);u.props=i,u.state=o,u.refs=At,u.context=$u(e,l),kr.enableAsyncSubtreeAPI&&null!=e.type&&null!=e.type.prototype&&!0===e.type.prototype.unstable_isAsyncReactComponent&&(e.internalContextTag|=Gu),"function"===typeof u.componentWillMount&&(l=u.state,u.componentWillMount(),l!==u.state&&a.enqueueReplaceState(u,u.state,null),null!==(l=e.updateQueue)&&(u.state=to(n,e,l,u,o,i,t))),"function"===typeof u.componentDidMount&&(e.effectTag|=Ku)},updateClassInstance:function(e,t,o){var i=t.stateNode;i.props=t.memoizedProps,i.state=t.memoizedState;var l=t.memoizedProps,s=t.pendingProps;s||null==(s=l)&&r("159");var c=i.context,p=Qu(t);if(p=$u(t,p),"function"!==typeof i.componentWillReceiveProps||l===s&&c===p||(c=i.state,i.componentWillReceiveProps(s,p),i.state!==c&&a.enqueueReplaceState(i,i.state,null)),c=t.memoizedState,o=null!==t.updateQueue?to(e,t,t.updateQueue,i,c,s,o):c,!(l!==s||c!==o||no()||null!==t.updateQueue&&t.updateQueue.hasForceUpdate))return"function"!==typeof i.componentDidUpdate||l===e.memoizedProps&&c===e.memoizedState||(t.effectTag|=Ku),!1;var f=s;if(null===l||null!==t.updateQueue&&t.updateQueue.hasForceUpdate)f=!0;else{var d=t.stateNode,D=t.type;f="function"===typeof d.shouldComponentUpdate?d.shouldComponentUpdate(f,o,p):!D.prototype||!D.prototype.isPureReactComponent||(!Ft(l,f)||!Ft(c,o))}return f?("function"===typeof i.componentWillUpdate&&i.componentWillUpdate(s,o,p),"function"===typeof i.componentDidUpdate&&(t.effectTag|=Ku)):("function"!==typeof i.componentDidUpdate||l===e.memoizedProps&&c===e.memoizedState||(t.effectTag|=Ku),n(t,s),u(t,o)),i.props=s,i.state=o,i.context=p,f}}}function ie(e,t,n,u,o){function a(e,t,n){i(e,t,n,t.pendingWorkPriority)}function i(e,t,n,r){t.child=null===e?uo(t,t.child,n,r):e.child===t.child?oo(t,t.child,n,r):ao(t,t.child,n,r)}function l(e,t){var n=t.ref;null===n||e&&e.ref===n||(t.effectTag|=_o)}function s(e,t,n,r){if(l(e,t),!n)return r&&ho(t,!1),p(e,t);n=t.stateNode,Oo.current=t;var u=n.render();return t.effectTag|=To,a(e,t,u),t.memoizedState=n.state,t.memoizedProps=n.props,r&&ho(t,!0),t.child}function c(e){var t=e.stateNode;t.pendingContext?Do(e,t.pendingContext,t.pendingContext!==t.context):t.context&&Do(e,t.context,!1),m(e,t.containerInfo)}function p(e,t){return io(e,t),t.child}function f(e,t){switch(t.tag){case Eo:c(t);break;case Co:fo(t);break;case bo:m(t,t.stateNode.containerInfo)}return null}var d=e.shouldSetTextContent,D=e.useSyncScheduling,h=e.shouldDeprioritizeSubtree,g=t.pushHostContext,m=t.pushHostContainer,C=n.enterHydrationState,E=n.resetHydrationState,A=n.tryToClaimNextHydratableInstance;e=ae(u,o,function(e,t){e.memoizedProps=t},function(e,t){e.memoizedState=t});var F=e.adoptClassInstance,b=e.constructClassInstance,y=e.mountClassInstance,v=e.updateClassInstance;return{beginWork:function(e,t,n){if(t.pendingWorkPriority===ko||t.pendingWorkPriority>n)return f(e,t);switch(t.tag){case go:null!==e&&r("155");var u=t.type,o=t.pendingProps,i=co(t);return i=so(t,i),u=u(o,i),t.effectTag|=To,"object"===typeof u&&null!==u&&"function"===typeof u.render?(t.tag=Co,o=fo(t),F(t,u),y(t,n),t=s(e,t,!0,o)):(t.tag=mo,a(e,t,u),t.memoizedProps=o,t=t.child),t;case mo:e:{if(o=t.type,n=t.pendingProps,u=t.memoizedProps,po())null===n&&(n=u);else if(null===n||u===n){t=p(e,t);break e}u=co(t),u=so(t,u),o=o(n,u),t.effectTag|=To,a(e,t,o),t.memoizedProps=n,t=t.child}return t;case Co:return o=fo(t),u=void 0,null===e?t.stateNode?r("153"):(b(t,t.pendingProps),y(t,n),u=!0):u=v(e,t,n),s(e,t,u,o);case Eo:return c(t),u=t.updateQueue,null!==u?(o=t.memoizedState,u=lo(e,t,u,null,o,null,n),o===u?(E(),t=p(e,t)):(o=u.element,null!==e&&null!==e.child||!C(t)?(E(),a(e,t,o)):(t.effectTag|=So,t.child=uo(t,t.child,o,n)),t.memoizedState=u,t=t.child)):(E(),t=p(e,t)),t;case Ao:g(t),null===e&&A(t),o=t.type;var B=t.memoizedProps;return u=t.pendingProps,null===u&&null===(u=B)&&r("154"),i=null!==e?e.memoizedProps:null,po()||null!==u&&B!==u?(B=u.children,d(o,u)?B=null:i&&d(o,i)&&(t.effectTag|=Po),l(e,t),n!==xo&&!D&&h(o,u)?(t.pendingWorkPriority=xo,t=null):(a(e,t,B),t.memoizedProps=u,t=t.child)):t=p(e,t),t;case Fo:return null===e&&A(t),e=t.pendingProps,null===e&&(e=t.memoizedProps),t.memoizedProps=e,null;case vo:t.tag=yo;case yo:return n=t.pendingProps,po()?null===n&&null===(n=e&&e.memoizedProps)&&r("154"):null!==n&&t.memoizedProps!==n||(n=t.memoizedProps),o=n.children,u=t.pendingWorkPriority,t.stateNode=null===e?uo(t,t.stateNode,o,u):e.child===t.child?oo(t,t.stateNode,o,u):ao(t,t.stateNode,o,u),t.memoizedProps=n,t.stateNode;case Bo:return null;case bo:e:{if(m(t,t.stateNode.containerInfo),n=t.pendingWorkPriority,o=t.pendingProps,po())null===o&&null==(o=e&&e.memoizedProps)&&r("154");else if(null===o||t.memoizedProps===o){t=p(e,t);break e}null===e?t.child=ao(t,t.child,o,n):a(e,t,o),t.memoizedProps=o,t=t.child}return t;case wo:e:{if(n=t.pendingProps,po())null===n&&(n=t.memoizedProps);else if(null===n||t.memoizedProps===n){t=p(e,t);break e}a(e,t,n),t.memoizedProps=n,t=t.child}return t;default:r("156")}},beginFailedWork:function(e,t,n){switch(t.tag){case Co:fo(t);break;case Eo:c(t);break;default:r("157")}return t.effectTag|=No,null===e?t.child=null:t.child!==e.child&&(t.child=e.child),t.pendingWorkPriority===ko||t.pendingWorkPriority>n?f(e,t):(t.firstEffect=null,t.lastEffect=null,i(e,t,null,n),t.tag===Co&&(e=t.stateNode,t.memoizedProps=e.props,t.memoizedState=e.state),t.child)}}}function le(e,t,n){var u=e.createInstance,o=e.createTextInstance,a=e.appendInitialChild,i=e.finalizeInitialChildren,l=e.prepareUpdate,s=t.getRootHostContainer,c=t.popHostContext,p=t.getHostContext,f=t.popHostContainer,d=n.prepareToHydrateHostInstance,D=n.prepareToHydrateHostTextInstance,h=n.popHydrationState;return{completeWork:function(e,t,n){var g=t.pendingProps;switch(null===g?g=t.memoizedProps:t.pendingWorkPriority===Jo&&n!==Jo||(t.pendingProps=null),t.tag){case Mo:return null;case Ho:return Ro(t),null;case qo:return f(t),Lo(t),g=t.stateNode,g.pendingContext&&(g.context=g.pendingContext,g.pendingContext=null),null!==e&&null!==e.child||(h(t),t.effectTag&=~$o),null;case jo:c(t),n=s();var m=t.type;if(null!==e&&null!=t.stateNode){var C=e.memoizedProps,E=t.stateNode,A=p();g=l(E,m,C,g,n,A),(t.updateQueue=g)&&(t.effectTag|=Xo),e.ref!==t.ref&&(t.effectTag|=Qo)}else{if(!g)return null===t.stateNode&&r("166"),null;if(e=p(),h(t))d(t,n,e)&&(t.effectTag|=Xo);else{e=u(m,g,n,e,t);e:for(C=t.child;null!==C;){if(C.tag===jo||C.tag===Vo)a(e,C.stateNode);else if(C.tag!==Wo&&null!==C.child){C=C.child;continue}if(C===t)break e;for(;null===C.sibling;){if(null===C.return||C.return===t)break e;C=C.return}C=C.sibling}i(e,m,g,n)&&(t.effectTag|=Xo),t.stateNode=e}null!==t.ref&&(t.effectTag|=Qo)}return null;case Vo:if(e&&null!=t.stateNode)e.memoizedProps!==g&&(t.effectTag|=Xo);else{if("string"!==typeof g)return null===t.stateNode&&r("166"),null;e=s(),n=p(),h(t)?D(t)&&(t.effectTag|=Xo):t.stateNode=o(g,e,n,t)}return null;case zo:(g=t.memoizedProps)||r("165"),t.tag=Ko,n=[];e:for((m=t.stateNode)&&(m.return=t);null!==m;){if(m.tag===jo||m.tag===Vo||m.tag===Wo)r("164");else if(m.tag===Go)n.push(m.type);else if(null!==m.child){m.child.return=m,m=m.child;continue}for(;null===m.sibling;){if(null===m.return||m.return===t)break e;m=m.return}m.sibling.return=m.return,m=m.sibling}return m=g.handler,g=m(g.props,n),t.child=Io(t,null!==e?e.child:null,g,t.pendingWorkPriority),t.child;case Ko:return t.tag=zo,null;case Go:case Yo:return null;case Wo:return t.effectTag|=Xo,f(t),null;case Uo:r("167");default:r("156")}}}}function se(e){return function(t){try{return e(t)}catch(e){}}}function ce(e,t){function n(e){var n=e.ref;if(null!==n)try{n(null)}catch(n){t(e,n)}}function u(e){return e.tag===ua||e.tag===ra||e.tag===aa}function o(e){for(var t=e;;)if(i(t),null!==t.child&&t.tag!==aa)t.child.return=t,t=t.child;else{if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return;t=t.return}t.sibling.return=t.return,t=t.sibling}}function a(e){for(var t=e,n=!1,u=void 0,a=void 0;;){if(!n){n=t.return;e:for(;;){switch(null===n&&r("160"),n.tag){case ua:u=n.stateNode,a=!1;break e;case ra:case aa:u=n.stateNode.containerInfo,a=!0;break e}n=n.return}n=!0}if(t.tag===ua||t.tag===oa)o(t),a?m(u,t.stateNode):g(u,t.stateNode);else if(t.tag===aa?u=t.stateNode.containerInfo:i(t),null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return;t=t.return,t.tag===aa&&(n=!1)}t.sibling.return=t.return,t=t.sibling}}function i(e){switch("function"===typeof sa&&sa(e),e.tag){case na:n(e);var r=e.stateNode;if("function"===typeof r.componentWillUnmount)try{r.props=e.memoizedProps,r.state=e.memoizedState,r.componentWillUnmount()}catch(n){t(e,n)}break;case ua:n(e);break;case ia:o(e.stateNode);break;case aa:a(e)}}var l=e.commitMount,s=e.commitUpdate,c=e.resetTextContent,p=e.commitTextUpdate,f=e.appendChild,d=e.appendChildToContainer,D=e.insertBefore,h=e.insertInContainerBefore,g=e.removeChild,m=e.removeChildFromContainer,C=e.getPublicInstance;return{commitPlacement:function(e){e:{for(var t=e.return;null!==t;){if(u(t)){var n=t;break e}t=t.return}r("160"),n=void 0}var o=t=void 0;switch(n.tag){case ua:t=n.stateNode,o=!1;break;case ra:case aa:t=n.stateNode.containerInfo,o=!0;break;default:r("161")}n.effectTag&da&&(c(t),n.effectTag&=~da);e:t:for(n=e;;){for(;null===n.sibling;){if(null===n.return||u(n.return)){n=null;break e}n=n.return}for(n.sibling.return=n.return,n=n.sibling;n.tag!==ua&&n.tag!==oa;){if(n.effectTag&ca)continue t;if(null===n.child||n.tag===aa)continue t;n.child.return=n,n=n.child}if(!(n.effectTag&ca)){n=n.stateNode;break e}}for(var a=e;;){if(a.tag===ua||a.tag===oa)n?o?h(t,a.stateNode,n):D(t,a.stateNode,n):o?d(t,a.stateNode):f(t,a.stateNode);else if(a.tag!==aa&&null!==a.child){a.child.return=a,a=a.child;continue}if(a===e)break;for(;null===a.sibling;){if(null===a.return||a.return===e)return;a=a.return}a.sibling.return=a.return,a=a.sibling}},commitDeletion:function(e){a(e),e.return=null,e.child=null,e.alternate&&(e.alternate.child=null,e.alternate.return=null)},commitWork:function(e,t){switch(t.tag){case na:break;case ua:var n=t.stateNode;if(null!=n){var u=t.memoizedProps;e=null!==e?e.memoizedProps:u;var o=t.type,a=t.updateQueue;t.updateQueue=null,null!==a&&s(n,a,o,e,u,t)}break;case oa:null===t.stateNode&&r("162"),n=t.memoizedProps,p(t.stateNode,null!==e?e.memoizedProps:n,n);break;case ra:case aa:break;default:r("163")}},commitLifeCycles:function(e,t){switch(t.tag){case na:var n=t.stateNode;if(t.effectTag&pa)if(null===e)n.props=t.memoizedProps,n.state=t.memoizedState,n.componentDidMount();else{var u=e.memoizedProps;e=e.memoizedState,n.props=t.memoizedProps,n.state=t.memoizedState,n.componentDidUpdate(u,e)}t.effectTag&fa&&null!==t.updateQueue&&la(t,t.updateQueue,n);break;case ra:e=t.updateQueue,null!==e&&la(t,e,t.child&&t.child.stateNode);break;case ua:n=t.stateNode,null===e&&t.effectTag&pa&&l(n,t.type,t.memoizedProps,t);break;case oa:case aa:break;default:r("163")}},commitAttachRef:function(e){var t=e.ref;if(null!==t){var n=e.stateNode;switch(e.tag){case ua:t(C(n));break;default:t(n)}}},commitDetachRef:function(e){null!==(e=e.ref)&&e(null)}}}function pe(e){function t(e){return e===ma&&r("174"),e}var n=e.getChildHostContext,u=e.getRootHostContext,o=Da(ma),a=Da(ma),i=Da(ma);return{getHostContext:function(){return t(o.current)},getRootHostContainer:function(){return t(i.current)},popHostContainer:function(e){ha(o,e),ha(a,e),ha(i,e)},popHostContext:function(e){a.current===e&&(ha(o,e),ha(a,e))},pushHostContainer:function(e,t){ga(i,t,e),t=u(t),ga(a,e,e),ga(o,t,e)},pushHostContext:function(e){var r=t(i.current),u=t(o.current);r=n(u,e.type,r),u!==r&&(ga(a,e,e),ga(o,r,e))},resetHostContainer:function(){o.current=ma,i.current=ma}}}function fe(e){function t(e,t){var n=ya();n.stateNode=t,n.return=e,n.effectTag=Fa,null!==e.lastEffect?(e.lastEffect.nextEffect=n,e.lastEffect=n):e.firstEffect=e.lastEffect=n}function n(e,t){switch(e.tag){case Ca:return a(t,e.type,e.pendingProps);case Ea:return i(t,e.pendingProps);default:return!1}}function u(e){for(e=e.return;null!==e&&e.tag!==Ca&&e.tag!==Aa;)e=e.return;D=e}var o=e.shouldSetTextContent,a=e.canHydrateInstance,i=e.canHydrateTextInstance,l=e.getNextHydratableSibling,s=e.getFirstHydratableChild,c=e.hydrateInstance,p=e.hydrateTextInstance,f=e.didNotHydrateInstance,d=e.didNotFindHydratableInstance;if(e=e.didNotFindHydratableTextInstance,!(a&&i&&l&&s&&c&&p&&f&&d&&e))return{enterHydrationState:function(){return!1},resetHydrationState:function(){},tryToClaimNextHydratableInstance:function(){},prepareToHydrateHostInstance:function(){r("175")},prepareToHydrateHostTextInstance:function(){r("176")},popHydrationState:function(){return!1}};var D=null,h=null,g=!1;return{enterHydrationState:function(e){return h=s(e.stateNode.containerInfo),D=e,g=!0},resetHydrationState:function(){h=D=null,g=!1},tryToClaimNextHydratableInstance:function(e){if(g){var r=h;if(r){if(!n(e,r)){if(!(r=l(r))||!n(e,r))return e.effectTag|=ba,g=!1,void(D=e);t(D,h)}e.stateNode=r,D=e,h=s(r)}else e.effectTag|=ba,g=!1,D=e}},prepareToHydrateHostInstance:function(e,t,n){return t=c(e.stateNode,e.type,e.memoizedProps,t,n,e),e.updateQueue=t,null!==t},prepareToHydrateHostTextInstance:function(e){return p(e.stateNode,e.memoizedProps,e)},popHydrationState:function(e){if(e!==D)return!1;if(!g)return u(e),g=!0,!1;var n=e.type;if(e.tag!==Ca||"head"!==n&&"body"!==n&&!o(n,e.memoizedProps))for(n=h;n;)t(e,n),n=l(n);return u(e),h=D?l(e.stateNode):null,!0}}}function de(e){function t(){for(;null!==K&&K.current.pendingWorkPriority===Sa;){K.isScheduled=!1;var e=K.nextScheduledRoot;if(K.nextScheduledRoot=null,K===G)return G=K=null,V=Sa,null;K=e}e=K;for(var t=null,n=Sa;null!==e;)e.current.pendingWorkPriority!==Sa&&(n===Sa||n>e.current.pendingWorkPriority)&&(n=e.current.pendingWorkPriority,t=e),e=e.nextScheduledRoot;null!==t?(V=n,Ba(),Xa(),b(),j=ka(t.current,n),t!==ue&&(re=0,ue=t)):(V=Sa,ue=j=null)}function n(n){ee=!0,z=null;var u=n.stateNode;if(u.current===n&&r("177"),V!==Pa&&V!==Na||re++,wa.current=null,n.effectTag>La)if(null!==n.lastEffect){n.lastEffect.nextEffect=n;var o=n.firstEffect}else o=n;else o=n.firstEffect;for(I(),W=o;null!==W;){var a=!1,i=void 0;try{for(;null!==W;){var l=W.effectTag;if(l&ja&&e.resetTextContent(W.stateNode),l&za){var s=W.alternate;null!==s&&N(s)}switch(l&~(Va|Wa|ja|za|La)){case Ua:k(W),W.effectTag&=~Ua;break;case Ha:k(W),W.effectTag&=~Ua,T(W.alternate,W);break;case Ma:T(W.alternate,W);break;case qa:te=!0,x(W),te=!1}W=W.nextEffect}}catch(e){a=!0,i=e}a&&(null===W&&r("178"),p(W,i),null!==W&&(W=W.nextEffect))}for(R(),u.current=n,W=o;null!==W;){u=!1,o=void 0;try{for(;null!==W;){var c=W.effectTag;if(c&(Ma|Va)&&S(W.alternate,W),c&za&&P(W),c&Wa)switch(a=W,i=void 0,null!==$&&(i=$.get(a),$.delete(a),null==i&&null!==a.alternate&&(a=a.alternate,i=$.get(a),$.delete(a))),null==i&&r("184"),a.tag){case $a:a.stateNode.componentDidCatch(i.error,{componentStack:i.componentStack});break;case Ka:null===J&&(J=i.error);break;default:r("157")}var f=W.nextEffect;W.nextEffect=null,W=f}}catch(e){u=!0,o=e}u&&(null===W&&r("178"),p(W,o),null!==W&&(W=W.nextEffect))}ee=!1,"function"===typeof Ta&&Ta(n.stateNode),X&&(X.forEach(m),X=null),t()}function u(e){for(;;){var t=w(e.alternate,e,V),n=e.return,r=e.sibling,u=e;if(!(u.pendingWorkPriority!==Sa&&u.pendingWorkPriority>V)){for(var o=Qa(u),a=u.child;null!==a;)o=xa(o,a.pendingWorkPriority),a=a.sibling;u.pendingWorkPriority=o}if(null!==t)return t;if(null!==n&&(null===n.firstEffect&&(n.firstEffect=e.firstEffect),null!==e.lastEffect&&(null!==n.lastEffect&&(n.lastEffect.nextEffect=e.firstEffect),n.lastEffect=e.lastEffect),e.effectTag>La&&(null!==n.lastEffect?n.lastEffect.nextEffect=e:n.firstEffect=e,n.lastEffect=e)),null!==r)return r;if(null===n){z=e;break}e=n}return null}function o(e){var t=v(e.alternate,e,V);return null===t&&(t=u(e)),wa.current=null,t}function a(e){var t=B(e.alternate,e,V);return null===t&&(t=u(e)),wa.current=null,t}function i(e){c(Ia,e)}function l(){if(null!==$&&0<$.size&&V===Na)for(;null!==j;){var e=j;if(null===(j=null!==$&&($.has(e)||null!==e.alternate&&$.has(e.alternate))?a(j):o(j))&&(null===z&&r("179"),L=Na,n(z),L=V,null===$||0===$.size||V!==Na))break}}function s(e,u){if(null!==z?(L=Na,n(z),l()):null===j&&t(),!(V===Sa||V>e)){L=V;e:for(;;){if(V<=Na)for(;null!==j&&!(null===(j=o(j))&&(null===z&&r("179"),L=Na,n(z),L=V,l(),V===Sa||V>e||V>Na)););else if(null!==u)for(;null!==j&&!M;)if(1<u.timeRemaining()){if(null===(j=o(j)))if(null===z&&r("179"),1<u.timeRemaining()){if(L=Na,n(z),L=V,l(),V===Sa||V>e||V<_a)break}else M=!0}else M=!0;switch(V){case Pa:case Na:if(V<=e)continue e;break e;case _a:case Oa:case Ia:if(null===u)break e;if(!M&&V<=e)continue e;break e;case Sa:break e;default:r("181")}}}}function c(e,t){U&&r("182"),U=!0;var n=L,u=!1,o=null;try{s(e,t)}catch(e){u=!0,o=e}for(;u;){if(Z){J=o;break}var l=j;if(null===l)Z=!0;else{var c=p(l,o);if(null===c&&r("183"),!Z){try{u=c,o=e,c=t;for(var f=u;null!==l;){switch(l.tag){case $a:va(l);break;case Ga:F(l);break;case Ka:A(l);break;case Ya:A(l)}if(l===f||l.alternate===f)break;l=l.return}j=a(u),s(o,c)}catch(e){u=!0,o=e;continue}break}}}if(L=n,null!==t&&(Y=!1),V>Na&&!Y&&(_(i),Y=!0),e=J,Z=M=U=!1,ue=Q=$=J=null,re=0,null!==e)throw e}function p(e,t){var n=wa.current=null,r=!1,u=!1,o=null;if(e.tag===Ka)n=e,d(e)&&(Z=!0);else for(var a=e.return;null!==a&&null===n;){if(a.tag===$a?"function"===typeof a.stateNode.componentDidCatch&&(r=!0,o=f(a),n=a,u=!0):a.tag===Ka&&(n=a),d(a)){if(te||null!==X&&(X.has(a)||null!==a.alternate&&X.has(a.alternate)))return null;n=null,u=!1}a=a.return}if(null!==n){null===Q&&(Q=new Set),Q.add(n);var i="";a=e;do{e:switch(a.tag){case fu:case du:case Du:case hu:var l=a._debugOwner,s=a._debugSource,c=f(a),p=null;l&&(p=f(l)),l=s,c="\\n in "+(c||"Unknown")+(l?" (at "+l.fileName.replace(/^.*[\\\\\\/]/,"")+":"+l.lineNumber+")":p?" (created by "+p+")":"");break e;default:c=""}i+=c,a=a.return}while(a);a=i,e=f(e),null===$&&($=new Map),t={componentName:e,componentStack:a,error:t,errorBoundary:r?n.stateNode:null,errorBoundaryFound:r,errorBoundaryName:o,willRetry:u},$.set(n,t);try{console.error(t.error)}catch(e){console.error(e)}return ee?(null===X&&(X=new Set),X.add(n)):m(n),n}return null===J&&(J=t),null}function d(e){return null!==Q&&(Q.has(e)||null!==e.alternate&&Q.has(e.alternate))}function D(e,t){return h(e,t,!1)}function h(e,t){re>ne&&(Z=!0,r("185")),!U&&t<=V&&(j=null);for(var n=!0;null!==e&&n;){if(n=!1,(e.pendingWorkPriority===Sa||e.pendingWorkPriority>t)&&(n=!0,e.pendingWorkPriority=t),null!==e.alternate&&(e.alternate.pendingWorkPriority===Sa||e.alternate.pendingWorkPriority>t)&&(n=!0,e.alternate.pendingWorkPriority=t),null===e.return){if(e.tag!==Ka)break;var u=e.stateNode;if(t===Sa||u.isScheduled||(u.isScheduled=!0,G?G.nextScheduledRoot=u:K=u,G=u),!U)switch(t){case Pa:q?c(Pa,null):c(Na,null);break;case Na:H||r("186");break;default:Y||(_(i),Y=!0)}}e=e.return}}function g(e,t){var n=L;return n===Sa&&(n=!O||e.internalContextTag&Ra||t?Oa:Pa),n===Pa&&(U||H)?Na:n}function m(e){h(e,Na,!0)}var C=pe(e),E=fe(e),A=C.popHostContainer,F=C.popHostContext,b=C.resetHostContainer,y=ie(e,C,E,D,g),v=y.beginWork,B=y.beginFailedWork,w=le(e,C,E).completeWork;C=ce(e,p);var k=C.commitPlacement,x=C.commitDeletion,T=C.commitWork,S=C.commitLifeCycles,P=C.commitAttachRef,N=C.commitDetachRef,_=e.scheduleDeferredCallback,O=e.useSyncScheduling,I=e.prepareForCommit,R=e.resetAfterCommit,L=Sa,U=!1,M=!1,H=!1,q=!1,j=null,V=Sa,W=null,z=null,K=null,G=null,Y=!1,$=null,Q=null,X=null,J=null,Z=!1,ee=!1,te=!1,ne=1e3,re=0,ue=null;return{scheduleUpdate:D,getPriorityContext:g,batchedUpdates:function(e,t){var n=H;H=!0;try{return e(t)}finally{H=n,U||H||c(Na,null)}},unbatchedUpdates:function(e){var t=q,n=H;q=H,H=!1;try{return e()}finally{H=n,q=t}},flushSync:function(e){var t=H,n=L;H=!0,L=Pa;try{return e()}finally{H=t,L=n,U&&r("187"),c(Na,null)}},deferredUpdates:function(e){var t=L;L=Oa;try{return e()}finally{L=t}}}}function De(){r("196")}function he(e){return e?(e=Yt.get(e),"number"===typeof e.tag?De(e):e._processChildContext(e._context)):At}function ge(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function me(e,t){var n=ge(e);e=0;for(var r;n;){if(n.nodeType===oi){if(r=e+n.textContent.length,e<=t&&r>=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=ge(n)}}function Ce(){return!ai&&gt.canUseDOM&&(ai="textContent"in document.documentElement?"textContent":"innerText"),ai}function Ee(){r("211")}function Ae(){r("212")}function Fe(e){if(null==e)return null;if(e.nodeType===pi)return e;var t=Yt.get(e);if(t)return"number"===typeof t.tag?Ee(t):Ae(t);"function"===typeof e.render?r("188"):r("213",Object.keys(e))}function be(e){if(void 0!==e._hostParent)return e._hostParent;if("number"===typeof e.tag){do{e=e.return}while(e&&e.tag!==fi);if(e)return e}return null}function ye(e,t){for(var n=0,r=e;r;r=be(r))n++;r=0;for(var u=t;u;u=be(u))r++;for(;0<n-r;)e=be(e),n--;for(;0<r-n;)t=be(t),r--;for(;n--;){if(e===t||e===t.alternate)return e;e=be(e),t=be(t)}return null}function ve(e,t,n){(t=Di(e,n.dispatchConfig.phasedRegistrationNames[t]))&&(n._dispatchListeners=B(n._dispatchListeners,t),n._dispatchInstances=B(n._dispatchInstances,e))}function Be(e){e&&e.dispatchConfig.phasedRegistrationNames&&di.traverseTwoPhase(e._targetInst,ve,e)}function we(e){if(e&&e.dispatchConfig.phasedRegistrationNames){var t=e._targetInst;t=t?di.getParentInstance(t):null,di.traverseTwoPhase(t,ve,e)}}function ke(e,t,n){e&&n&&n.dispatchConfig.registrationName&&(t=Di(e,n.dispatchConfig.registrationName))&&(n._dispatchListeners=B(n._dispatchListeners,t),n._dispatchInstances=B(n._dispatchInstances,e))}function xe(e){e&&e.dispatchConfig.registrationName&&ke(e._targetInst,null,e)}function Te(e,t,n,r){this.dispatchConfig=e,this._targetInst=t,this.nativeEvent=n,e=this.constructor.Interface;for(var u in e)e.hasOwnProperty(u)&&((t=e[u])?this[u]=t(n):"target"===u?this.target=r:this[u]=n[u]);return this.isDefaultPrevented=(null!=n.defaultPrevented?n.defaultPrevented:!1===n.returnValue)?Et.thatReturnsTrue:Et.thatReturnsFalse,this.isPropagationStopped=Et.thatReturnsFalse,this}function Se(e,t,n,r){if(this.eventPool.length){var u=this.eventPool.pop();return this.call(u,e,t,n,r),u}return new this(e,t,n,r)}function Pe(e){e instanceof this||r("223"),e.destructor(),10>this.eventPool.length&&this.eventPool.push(e)}function Ne(e){e.eventPool=[],e.getPooled=Se,e.release=Pe}function _e(e,t,n,r){return Te.call(this,e,t,n,r)}function Oe(e,t,n,r){return Te.call(this,e,t,n,r)}function Ie(e,t){switch(e){case"topKeyUp":return-1!==Fi.indexOf(t.keyCode);case"topKeyDown":return 229!==t.keyCode;case"topKeyPress":case"topMouseDown":case"topBlur":return!0;default:return!1}}function Re(e){return e=e.detail,"object"===typeof e&&"data"in e?e.data:null}function Le(e,t){switch(e){case"topCompositionEnd":return Re(t);case"topKeyPress":return 32!==t.which?null:(Si=!0,xi);case"topTextInput":return e=t.data,e===xi&&Si?null:e;default:return null}}function Ue(e,t){if(Pi)return"topCompositionEnd"===e||!bi&&Ie(e,t)?(e=Ci.getData(),Ci.reset(),Pi=!1,e):null;switch(e){case"topPaste":return null;case"topKeyPress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"topCompositionEnd":return ki?null:t.data;default:return null}}function Me(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!_i[e.type]:"textarea"===t}function He(e,t,n){return e=Te.getPooled(Oi.change,e,t,n),e.type="change",fn.enqueueStateRestore(n),hi.accumulateTwoPhaseDispatches(e),e}function qe(e){Fn.enqueueEvents(e),Fn.processEventQueue(!1)}function je(e){var t=Gt.getNodeFromInstance(e);if(Zn.updateValueIfChanged(t))return e}function Ve(e,t){if("topChange"===e)return t}function We(){Ii&&(Ii.detachEvent("onpropertychange",ze),Ri=Ii=null)}function ze(e){"value"===e.propertyName&&je(Ri)&&(e=He(Ri,e,y(e)),Dn.batchedUpdates(qe,e))}function Ke(e,t,n){"topFocus"===e?(We(),Ii=t,Ri=n,Ii.attachEvent("onpropertychange",ze)):"topBlur"===e&&We()}function Ge(e){if("topSelectionChange"===e||"topKeyUp"===e||"topKeyDown"===e)return je(Ri)}function Ye(e,t){if("topClick"===e)return je(t)}function $e(e,t){if("topInput"===e||"topChange"===e)return je(t)}function Qe(e,t,n,r){return Te.call(this,e,t,n,r)}function Xe(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=Mi[e])&&!!t[e]}function Je(){return Xe}function Ze(e,t,n,r){return Te.call(this,e,t,n,r)}function et(e,t){if(Yi||null==zi||zi!==vt())return null;var n=zi;return"selectionStart"in n&&ci.hasSelectionCapabilities(n)?n={start:n.selectionStart,end:n.selectionEnd}:window.getSelection?(n=window.getSelection(),n={anchorNode:n.anchorNode,anchorOffset:n.anchorOffset,focusNode:n.focusNode,focusOffset:n.focusOffset}):n=void 0,Gi&&Ft(Gi,n)?null:(Gi=n,e=Te.getPooled(Wi.select,Ki,e,t),e.type="select",e.target=zi,hi.accumulateTwoPhaseDispatches(e),e)}function tt(e,t,n,r){return Te.call(this,e,t,n,r)}function nt(e,t,n,r){return Te.call(this,e,t,n,r)}function rt(e,t,n,r){return Te.call(this,e,t,n,r)}function ut(e){var t=e.keyCode;return"charCode"in e?0===(e=e.charCode)&&13===t&&(e=13):e=t,32<=e||13===e?e:0}function ot(e,t,n,r){return Te.call(this,e,t,n,r)}function at(e,t,n,r){return Te.call(this,e,t,n,r)}function it(e,t,n,r){return Te.call(this,e,t,n,r)}function lt(e,t,n,r){return Te.call(this,e,t,n,r)}function st(e,t,n,r){return Te.call(this,e,t,n,r)}function ct(e){return e[1].toUpperCase()}function pt(e){return!(!e||e.nodeType!==dl&&e.nodeType!==gl&&e.nodeType!==ml&&(e.nodeType!==hl||" react-mount-point-unstable "!==e.nodeValue))}function ft(e){return!(!(e=e?e.nodeType===gl?e.documentElement:e.firstChild:null)||e.nodeType!==dl||!e.hasAttribute(Cl))}function dt(e,t,n,u,o){pt(n)||r("200");var a=n._reactRootContainer;if(a)Il.updateContainer(t,a,e,o);else{if(!u&&!ft(n))for(u=void 0;u=n.lastChild;)n.removeChild(u);var i=Il.createContainer(n);a=n._reactRootContainer=i,Il.unbatchedUpdates(function(){Il.updateContainer(t,i,e,o)})}return Il.getPublicRootInstance(a)}function Dt(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;return pt(t)||r("200"),Cu.createPortal(e,t,null,n)}var ht=n(0);n(6);var gt=n(27),mt=n(2),Ct=n(28),Et=n(3),At=n(5),Ft=n(29),bt=n(30),yt=n(33),vt=n(34);ht||r("227");var Bt,wt,kt={Namespaces:{html:"http://www.w3.org/1999/xhtml",mathml:"http://www.w3.org/1998/Math/MathML",svg:"http://www.w3.org/2000/svg"},getIntrinsicNamespace:u,getChildNamespace:function(e,t){return null==e||"http://www.w3.org/1999/xhtml"===e?u(t):"http://www.w3.org/2000/svg"===e&&"foreignObject"===t?"http://www.w3.org/1999/xhtml":e}},xt=null,Tt={},St={plugins:[],eventNameDispatchConfigs:{},registrationNameModules:{},registrationNameDependencies:{},possibleRegistrationNames:null,injectEventPluginOrder:function(e){xt&&r("101"),xt=Array.prototype.slice.call(e),o()},injectEventPluginsByName:function(e){var t,n=!1;for(t in e)if(e.hasOwnProperty(t)){var u=e[t];Tt.hasOwnProperty(t)&&Tt[t]===u||(Tt[t]&&r("102",t),Tt[t]=u,n=!0)}n&&o()}},Pt=St,Nt={children:!0,dangerouslySetInnerHTML:!0,autoFocus:!0,defaultValue:!0,defaultChecked:!0,innerHTML:!0,suppressContentEditableWarning:!0,style:!0},_t={MUST_USE_PROPERTY:1,HAS_BOOLEAN_VALUE:4,HAS_NUMERIC_VALUE:8,HAS_POSITIVE_NUMERIC_VALUE:24,HAS_OVERLOADED_BOOLEAN_VALUE:32,HAS_STRING_BOOLEAN_VALUE:64,injectDOMPropertyConfig:function(e){var t=_t,n=e.Properties||{},u=e.DOMAttributeNamespaces||{},o=e.DOMAttributeNames||{};e=e.DOMMutationMethods||{};for(var a in n){Ot.properties.hasOwnProperty(a)&&r("48",a);var l=a.toLowerCase(),s=n[a];l={attributeName:l,attributeNamespace:null,propertyName:a,mutationMethod:null,mustUseProperty:i(s,t.MUST_USE_PROPERTY),hasBooleanValue:i(s,t.HAS_BOOLEAN_VALUE),hasNumericValue:i(s,t.HAS_NUMERIC_VALUE),hasPositiveNumericValue:i(s,t.HAS_POSITIVE_NUMERIC_VALUE),hasOverloadedBooleanValue:i(s,t.HAS_OVERLOADED_BOOLEAN_VALUE),hasStringBooleanValue:i(s,t.HAS_STRING_BOOLEAN_VALUE)},1>=l.hasBooleanValue+l.hasNumericValue+l.hasOverloadedBooleanValue||r("50",a),o.hasOwnProperty(a)&&(l.attributeName=o[a]),u.hasOwnProperty(a)&&(l.attributeNamespace=u[a]),e.hasOwnProperty(a)&&(l.mutationMethod=e[a]),Ot.properties[a]=l}}},Ot={ID_ATTRIBUTE_NAME:"data-reactid",ROOT_ATTRIBUTE_NAME:"data-reactroot",ATTRIBUTE_NAME_START_CHAR:":A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD",ATTRIBUTE_NAME_CHAR:":A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD\\\\-.0-9\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040",properties:{},shouldSetAttribute:function(e,t){if(Ot.isReservedProp(e)||!("o"!==e[0]&&"O"!==e[0]||"n"!==e[1]&&"N"!==e[1]))return!1;if(null===t)return!0;switch(typeof t){case"boolean":return Ot.shouldAttributeAcceptBooleanValue(e);case"undefined":case"number":case"string":case"object":return!0;default:return!1}},getPropertyInfo:function(e){return Ot.properties.hasOwnProperty(e)?Ot.properties[e]:null},shouldAttributeAcceptBooleanValue:function(e){if(Ot.isReservedProp(e))return!0;var t=Ot.getPropertyInfo(e);return t?t.hasBooleanValue||t.hasStringBooleanValue||t.hasOverloadedBooleanValue:"data-"===(e=e.toLowerCase().slice(0,5))||"aria-"===e},isReservedProp:function(e){return Nt.hasOwnProperty(e)},injection:_t},It=Ot,Rt={IndeterminateComponent:0,FunctionalComponent:1,ClassComponent:2,HostRoot:3,HostPortal:4,HostComponent:5,HostText:6,CoroutineComponent:7,CoroutineHandlerPhase:8,YieldComponent:9,Fragment:10},Lt={ELEMENT_NODE:1,TEXT_NODE:3,COMMENT_NODE:8,DOCUMENT_NODE:9,DOCUMENT_FRAGMENT_NODE:11},Ut=Rt.HostComponent,Mt=Rt.HostText,Ht=Lt.ELEMENT_NODE,qt=Lt.COMMENT_NODE,jt=It.ID_ATTRIBUTE_NAME,Vt={hasCachedChildNodes:1},Wt=Math.random().toString(36).slice(2),zt="__reactInternalInstance$"+Wt,Kt="__reactEventHandlers$"+Wt,Gt={getClosestInstanceFromNode:p,getInstanceFromNode:function(e){var t=e[zt];return t?t.tag===Ut||t.tag===Mt?t:t._hostNode===e?t:null:(t=p(e),null!=t&&t._hostNode===e?t:null)},getNodeFromInstance:function(e){if(e.tag===Ut||e.tag===Mt)return e.stateNode;if(void 0===e._hostNode&&r("33"),e._hostNode)return e._hostNode;for(var t=[];!e._hostNode;)t.push(e),e._hostParent||r("34"),e=e._hostParent;for(;t.length;e=t.pop())c(e,e._hostNode);return e._hostNode},precacheChildNodes:c,precacheNode:s,uncacheNode:function(e){var t=e._hostNode;t&&(delete t[zt],e._hostNode=null)},precacheFiberNode:function(e,t){t[zt]=e},getFiberCurrentPropsFromNode:function(e){return e[Kt]||null},updateFiberProps:function(e,t){e[Kt]=t}},Yt={remove:function(e){e._reactInternalFiber=void 0},get:function(e){return e._reactInternalFiber},has:function(e){return void 0!==e._reactInternalFiber},set:function(e,t){e._reactInternalFiber=t}},$t={ReactCurrentOwner:ht.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner},Qt={NoEffect:0,PerformedWork:1,Placement:2,Update:4,PlacementAndUpdate:6,Deletion:8,ContentReset:16,Callback:32,Err:64,Ref:128},Xt=Rt.HostComponent,Jt=Rt.HostRoot,Zt=Rt.HostPortal,en=Rt.HostText,tn=Qt.NoEffect,nn=Qt.Placement,rn={isFiberMounted:function(e){return 2===d(e)},isMounted:function(e){return!!(e=Yt.get(e))&&2===d(e)},findCurrentFiberUsingSlowPath:h,findCurrentHostFiber:function(e){if(!(e=h(e)))return null;for(var t=e;;){if(t.tag===Xt||t.tag===en)return t;if(t.child)t.child.return=t,t=t.child;else{if(t===e)break;for(;!t.sibling;){if(!t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}}return null},findCurrentHostFiberWithNoPortals:function(e){if(!(e=h(e)))return null;for(var t=e;;){if(t.tag===Xt||t.tag===en)return t;if(t.child&&t.tag!==Zt)t.child.return=t,t=t.child;else{if(t===e)break;for(;!t.sibling;){if(!t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}}return null}},un={_caughtError:null,_hasCaughtError:!1,_rethrowError:null,_hasRethrowError:!1,injection:{injectErrorUtils:function(e){"function"!==typeof e.invokeGuardedCallback&&r("197"),g=e.invokeGuardedCallback}},invokeGuardedCallback:function(e,t,n,r,u,o,a,i,l){g.apply(un,arguments)},invokeGuardedCallbackAndCatchFirstError:function(e,t,n,r,u,o,a,i,l){if(un.invokeGuardedCallback.apply(this,arguments),un.hasCaughtError()){var s=un.clearCaughtError();un._hasRethrowError||(un._hasRethrowError=!0,un._rethrowError=s)}},rethrowCaughtError:function(){return m.apply(un,arguments)},hasCaughtError:function(){return un._hasCaughtError},clearCaughtError:function(){if(un._hasCaughtError){var e=un._caughtError;return un._caughtError=null,un._hasCaughtError=!1,e}r("198")}},on=un,an={isEndish:function(e){return"topMouseUp"===e||"topTouchEnd"===e||"topTouchCancel"===e},isMoveish:function(e){return"topMouseMove"===e||"topTouchMove"===e},isStartish:function(e){return"topMouseDown"===e||"topTouchStart"===e},executeDirectDispatch:function(e){var t=e._dispatchListeners,n=e._dispatchInstances;return Array.isArray(t)&&r("103"),e.currentTarget=t?an.getNodeFromInstance(n):null,t=t?t(e):null,e.currentTarget=null,e._dispatchListeners=null,e._dispatchInstances=null,t},executeDispatchesInOrder:function(e,t){var n=e._dispatchListeners,r=e._dispatchInstances;if(Array.isArray(n))for(var u=0;u<n.length&&!e.isPropagationStopped();u++)C(e,t,n[u],r[u]);else n&&C(e,t,n,r);e._dispatchListeners=null,e._dispatchInstances=null},executeDispatchesInOrderStopAtTrue:function(e){e:{var t=e._dispatchListeners,n=e._dispatchInstances;if(Array.isArray(t)){for(var r=0;r<t.length&&!e.isPropagationStopped();r++)if(t[r](e,n[r])){t=n[r];break e}}else if(t&&t(e,n)){t=n;break e}t=null}return e._dispatchInstances=null,e._dispatchListeners=null,t},hasDispatches:function(e){return!!e._dispatchListeners},getFiberCurrentPropsFromNode:function(e){return Bt.getFiberCurrentPropsFromNode(e)},getInstanceFromNode:function(e){return Bt.getInstanceFromNode(e)},getNodeFromInstance:function(e){return Bt.getNodeFromInstance(e)},injection:{injectComponentTree:function(e){Bt=e}}},ln=an,sn=null,cn=null,pn=null,fn={injection:{injectFiberControlledHostComponent:function(e){sn=e}},enqueueStateRestore:function(e){cn?pn?pn.push(e):pn=[e]:cn=e},restoreStateIfNeeded:function(){if(cn){var e=cn,t=pn;if(pn=cn=null,E(e),t)for(e=0;e<t.length;e++)E(t[e])}}},dn=!1,Dn={batchedUpdates:function(e,t){if(dn)return A(b,e,t);dn=!0;try{return A(b,e,t)}finally{dn=!1,fn.restoreStateIfNeeded()}},injection:{injectStackBatchedUpdates:function(e){A=e},injectFiberBatchedUpdates:function(e){F=e}}},hn=Lt.TEXT_NODE,gn=Rt.HostRoot,mn=[],Cn={_enabled:!0,_handleTopLevel:null,setHandleTopLevel:function(e){Cn._handleTopLevel=e},setEnabled:function(e){Cn._enabled=!!e},isEnabled:function(){return Cn._enabled},trapBubbledEvent:function(e,t,n){return n?Ct.listen(n,t,Cn.dispatchEvent.bind(null,e)):null},trapCapturedEvent:function(e,t,n){return n?Ct.capture(n,t,Cn.dispatchEvent.bind(null,e)):null},dispatchEvent:function(e,t){if(Cn._enabled){var n=y(t);if(n=Gt.getClosestInstanceFromNode(n),null===n||"number"!==typeof n.tag||rn.isFiberMounted(n)||(n=null),mn.length){var r=mn.pop();r.topLevelType=e,r.nativeEvent=t,r.targetInst=n,e=r}else e={topLevelType:e,nativeEvent:t,targetInst:n,ancestors:[]};try{Dn.batchedUpdates(v,e)}finally{e.topLevelType=null,e.nativeEvent=null,e.targetInst=null,e.ancestors.length=0,10>mn.length&&mn.push(e)}}}},En=Cn,An=null,Fn={injection:{injectEventPluginOrder:Pt.injectEventPluginOrder,injectEventPluginsByName:Pt.injectEventPluginsByName},getListener:function(e,t){if("number"===typeof e.tag){var n=e.stateNode;if(!n)return null;var u=ln.getFiberCurrentPropsFromNode(n);if(!u)return null;if(n=u[t],S(t,e.type,u))return null}else{if("string"===typeof(u=e._currentElement)||"number"===typeof u||!e._rootNodeID)return null;if(e=u.props,n=e[t],S(t,u.type,e))return null}return n&&"function"!==typeof n&&r("231",t,typeof n),n},extractEvents:function(e,t,n,r){for(var u,o=Pt.plugins,a=0;a<o.length;a++){var i=o[a];i&&(i=i.extractEvents(e,t,n,r))&&(u=B(u,i))}return u},enqueueEvents:function(e){e&&(An=B(An,e))},processEventQueue:function(e){var t=An;An=null,e?w(t,x):w(t,T),An&&r("95"),on.rethrowCaughtError()}};gt.canUseDOM&&(wt=document.implementation&&document.implementation.hasFeature&&!0!==document.implementation.hasFeature("",""));var bn={animationend:N("Animation","AnimationEnd"),animationiteration:N("Animation","AnimationIteration"),animationstart:N("Animation","AnimationStart"),transitionend:N("Transition","TransitionEnd")},yn={},vn={};gt.canUseDOM&&(vn=document.createElement("div").style,"AnimationEvent"in window||(delete bn.animationend.animation,delete bn.animationiteration.animation,delete bn.animationstart.animation),"TransitionEvent"in window||delete bn.transitionend.transition);var Bn={topAbort:"abort",topAnimationEnd:_("animationend")||"animationend",topAnimationIteration:_("animationiteration")||"animationiteration",topAnimationStart:_("animationstart")||"animationstart",topBlur:"blur",topCancel:"cancel",topCanPlay:"canplay",topCanPlayThrough:"canplaythrough",topChange:"change",topClick:"click",topClose:"close",topCompositionEnd:"compositionend",topCompositionStart:"compositionstart",topCompositionUpdate:"compositionupdate",topContextMenu:"contextmenu",topCopy:"copy",topCut:"cut",topDoubleClick:"dblclick",topDrag:"drag",topDragEnd:"dragend",topDragEnter:"dragenter",topDragExit:"dragexit",topDragLeave:"dragleave",topDragOver:"dragover",topDragStart:"dragstart",topDrop:"drop",topDurationChange:"durationchange",topEmptied:"emptied",topEncrypted:"encrypted",topEnded:"ended",topError:"error",topFocus:"focus",topInput:"input",topKeyDown:"keydown",topKeyPress:"keypress",topKeyUp:"keyup",topLoadedData:"loadeddata",topLoad:"load",topLoadedMetadata:"loadedmetadata",topLoadStart:"loadstart",topMouseDown:"mousedown",topMouseMove:"mousemove",topMouseOut:"mouseout",topMouseOver:"mouseover",topMouseUp:"mouseup",topPaste:"paste",topPause:"pause",topPlay:"play",topPlaying:"playing",topProgress:"progress",topRateChange:"ratechange",topScroll:"scroll",topSeeked:"seeked",topSeeking:"seeking",topSelectionChange:"selectionchange",topStalled:"stalled",topSuspend:"suspend",topTextInput:"textInput",topTimeUpdate:"timeupdate",topToggle:"toggle",topTouchCancel:"touchcancel",topTouchEnd:"touchend",topTouchMove:"touchmove",topTouchStart:"touchstart",topTransitionEnd:_("transitionend")||"transitionend",topVolumeChange:"volumechange",topWaiting:"waiting",topWheel:"wheel"},wn={},kn=0,xn="_reactListenersID"+(""+Math.random()).slice(2),Tn=mt({},{handleTopLevel:function(e,t,n,r){e=Fn.extractEvents(e,t,n,r),Fn.enqueueEvents(e),Fn.processEventQueue(!1)}},{setEnabled:function(e){En&&En.setEnabled(e)},isEnabled:function(){return!(!En||!En.isEnabled())},listenTo:function(e,t){var n=O(t);e=Pt.registrationNameDependencies[e];for(var r=0;r<e.length;r++){var u=e[r];n.hasOwnProperty(u)&&n[u]||("topWheel"===u?P("wheel")?En.trapBubbledEvent("topWheel","wheel",t):P("mousewheel")?En.trapBubbledEvent("topWheel","mousewheel",t):En.trapBubbledEvent("topWheel","DOMMouseScroll",t):"topScroll"===u?En.trapCapturedEvent("topScroll","scroll",t):"topFocus"===u||"topBlur"===u?(En.trapCapturedEvent("topFocus","focus",t),En.trapCapturedEvent("topBlur","blur",t),n.topBlur=!0,n.topFocus=!0):"topCancel"===u?(P("cancel",!0)&&En.trapCapturedEvent("topCancel","cancel",t),n.topCancel=!0):"topClose"===u?(P("close",!0)&&En.trapCapturedEvent("topClose","close",t),n.topClose=!0):Bn.hasOwnProperty(u)&&En.trapBubbledEvent(u,Bn[u],t),n[u]=!0)}},isListeningToAllDependencies:function(e,t){t=O(t),e=Pt.registrationNameDependencies[e];for(var n=0;n<e.length;n++){var r=e[n];if(!t.hasOwnProperty(r)||!t[r])return!1}return!0},trapBubbledEvent:function(e,t,n){return En.trapBubbledEvent(e,t,n)},trapCapturedEvent:function(e,t,n){return En.trapCapturedEvent(e,t,n)}}),Sn={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Pn=["Webkit","ms","Moz","O"];Object.keys(Sn).forEach(function(e){Pn.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Sn[t]=Sn[e]})});var Nn={isUnitlessNumber:Sn,shorthandPropertyExpansions:{background:{backgroundAttachment:!0,backgroundColor:!0,backgroundImage:!0,backgroundPositionX:!0,backgroundPositionY:!0,backgroundRepeat:!0},backgroundPosition:{backgroundPositionX:!0,backgroundPositionY:!0},border:{borderWidth:!0,borderStyle:!0,borderColor:!0},borderBottom:{borderBottomWidth:!0,borderBottomStyle:!0,borderBottomColor:!0},borderLeft:{borderLeftWidth:!0,borderLeftStyle:!0,borderLeftColor:!0},borderRight:{borderRightWidth:!0,borderRightStyle:!0,borderRightColor:!0},borderTop:{borderTopWidth:!0,borderTopStyle:!0,borderTopColor:!0},font:{fontStyle:!0,fontVariant:!0,fontWeight:!0,fontSize:!0,lineHeight:!0,fontFamily:!0},outline:{outlineWidth:!0,outlineStyle:!0,outlineColor:!0}}},_n=Nn.isUnitlessNumber,On=!1;if(gt.canUseDOM){var In=document.createElement("div").style;try{In.font=""}catch(e){On=!0}}var Rn,Ln={createDangerousStringForStyles:function(){},setValueForStyles:function(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=0===n.indexOf("--"),u=n,o=t[n];if(u=null==o||"boolean"===typeof o||""===o?"":r||"number"!==typeof o||0===o||_n.hasOwnProperty(u)&&_n[u]?(""+o).trim():o+"px","float"===n&&(n="cssFloat"),r)e.setProperty(n,u);else if(u)e[n]=u;else if(r=On&&Nn.shorthandPropertyExpansions[n])for(var a in r)e[a]="";else e[n]=""}}},Un=new RegExp("^["+It.ATTRIBUTE_NAME_START_CHAR+"]["+It.ATTRIBUTE_NAME_CHAR+"]*$"),Mn={},Hn={},qn={setAttributeForID:function(e,t){e.setAttribute(It.ID_ATTRIBUTE_NAME,t)},setAttributeForRoot:function(e){e.setAttribute(It.ROOT_ATTRIBUTE_NAME,"")},getValueForProperty:function(){},getValueForAttribute:function(){},setValueForProperty:function(e,t,n){var r=It.getPropertyInfo(t);if(r&&It.shouldSetAttribute(t,n)){var u=r.mutationMethod;u?u(e,n):null==n||r.hasBooleanValue&&!n||r.hasNumericValue&&isNaN(n)||r.hasPositiveNumericValue&&1>n||r.hasOverloadedBooleanValue&&!1===n?qn.deleteValueForProperty(e,t):r.mustUseProperty?e[r.propertyName]=n:(t=r.attributeName,(u=r.attributeNamespace)?e.setAttributeNS(u,t,""+n):r.hasBooleanValue||r.hasOverloadedBooleanValue&&!0===n?e.setAttribute(t,""):e.setAttribute(t,""+n))}else qn.setValueForAttribute(e,t,It.shouldSetAttribute(t,n)?n:null)},setValueForAttribute:function(e,t,n){I(t)&&(null==n?e.removeAttribute(t):e.setAttribute(t,""+n))},deleteValueForAttribute:function(e,t){e.removeAttribute(t)},deleteValueForProperty:function(e,t){var n=It.getPropertyInfo(t);n?(t=n.mutationMethod)?t(e,void 0):n.mustUseProperty?e[n.propertyName]=!n.hasBooleanValue&&"":e.removeAttribute(n.attributeName):e.removeAttribute(t)}},jn=qn,Vn=$t.ReactDebugCurrentFrame,Wn={current:null,phase:null,resetCurrentFiber:function(){Vn.getCurrentStack=null,Wn.current=null,Wn.phase=null},setCurrentFiber:function(e,t){Vn.getCurrentStack=R,Wn.current=e,Wn.phase=t},getCurrentFiberOwnerName:function(){return null},getCurrentFiberStackAddendum:R},zn=Wn,Kn={getHostProps:function(e,t){var n=t.value,r=t.checked;return mt({type:void 0,step:void 0,min:void 0,max:void 0},t,{defaultChecked:void 0,defaultValue:void 0,value:null!=n?n:e._wrapperState.initialValue,checked:null!=r?r:e._wrapperState.initialChecked})},initWrapperState:function(e,t){var n=t.defaultValue;e._wrapperState={initialChecked:null!=t.checked?t.checked:t.defaultChecked,initialValue:null!=t.value?t.value:n,controlled:"checkbox"===t.type||"radio"===t.type?null!=t.checked:null!=t.value}},updateWrapper:function(e,t){var n=t.checked;null!=n&&jn.setValueForProperty(e,"checked",n||!1),n=t.value,null!=n?0===n&&""===e.value?e.value="0":"number"===t.type?(t=parseFloat(e.value)||0,(n!=t||n==t&&e.value!=n)&&(e.value=""+n)):e.value!==""+n&&(e.value=""+n):(null==t.value&&null!=t.defaultValue&&e.defaultValue!==""+t.defaultValue&&(e.defaultValue=""+t.defaultValue),null==t.checked&&null!=t.defaultChecked&&(e.defaultChecked=!!t.defaultChecked))},postMountWrapper:function(e,t){switch(t.type){case"submit":case"reset":break;case"color":case"date":case"datetime":case"datetime-local":case"month":case"time":case"week":e.value="",e.value=e.defaultValue;break;default:e.value=e.value}t=e.name,""!==t&&(e.name=""),e.defaultChecked=!e.defaultChecked,e.defaultChecked=!e.defaultChecked,""!==t&&(e.name=t)},restoreControlledState:function(e,t){Kn.updateWrapper(e,t);var n=t.name;if("radio"===t.type&&null!=n){for(t=e;t.parentNode;)t=t.parentNode;for(n=t.querySelectorAll("input[name="+JSON.stringify(""+n)+\'][type="radio"]\'),t=0;t<n.length;t++){var u=n[t];if(u!==e&&u.form===e.form){var o=Gt.getFiberCurrentPropsFromNode(u);o||r("90"),Kn.updateWrapper(u,o)}}}}},Gn=Kn,Yn={validateProps:function(){},postMountWrapper:function(e,t){null!=t.value&&e.setAttribute("value",t.value)},getHostProps:function(e,t){return e=mt({children:void 0},t),(t=L(t.children))&&(e.children=t),e}},$n={getHostProps:function(e,t){return mt({},t,{value:void 0})},initWrapperState:function(e,t){var n=t.value;e._wrapperState={initialValue:null!=n?n:t.defaultValue,wasMultiple:!!t.multiple}},postMountWrapper:function(e,t){e.multiple=!!t.multiple;var n=t.value;null!=n?U(e,!!t.multiple,n):null!=t.defaultValue&&U(e,!!t.multiple,t.defaultValue)},postUpdateWrapper:function(e,t){e._wrapperState.initialValue=void 0;var n=e._wrapperState.wasMultiple;e._wrapperState.wasMultiple=!!t.multiple;var r=t.value;null!=r?U(e,!!t.multiple,r):n!==!!t.multiple&&(null!=t.defaultValue?U(e,!!t.multiple,t.defaultValue):U(e,!!t.multiple,t.multiple?[]:""))},restoreControlledState:function(e,t){var n=t.value;null!=n&&U(e,!!t.multiple,n)}},Qn={getHostProps:function(e,t){return null!=t.dangerouslySetInnerHTML&&r("91"),mt({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})},initWrapperState:function(e,t){var n=t.value,u=n;null==n&&(n=t.defaultValue,t=t.children,null!=t&&(null!=n&&r("92"),Array.isArray(t)&&(1>=t.length||r("93"),t=t[0]),n=""+t),null==n&&(n=""),u=n),e._wrapperState={initialValue:""+u}},updateWrapper:function(e,t){var n=t.value;null!=n&&(n=""+n,n!==e.value&&(e.value=n),null==t.defaultValue&&(e.defaultValue=n)),null!=t.defaultValue&&(e.defaultValue=t.defaultValue)},postMountWrapper:function(e){var t=e.textContent;t===e._wrapperState.initialValue&&(e.value=t)},restoreControlledState:function(e,t){Qn.updateWrapper(e,t)}},Xn=Qn,Jn=mt({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0}),Zn={_getTrackerFromNode:function(e){return e._valueTracker},track:function(e){e._valueTracker||(e._valueTracker=q(e))},updateValueIfChanged:function(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=H(e)?e.checked?"true":"false":e.value),(e=r)!==n&&(t.setValue(e),!0)},stopTracking:function(e){(e=e._valueTracker)&&e.stopTracking()}},er=kt.Namespaces,tr=function(e){return"undefined"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(t,n,r,u){MSApp.execUnsafeLocalFunction(function(){return e(t,n)})}:e}(function(e,t){if(e.namespaceURI!==er.svg||"innerHTML"in e)e.innerHTML=t;else for(Rn=Rn||document.createElement("div"),Rn.innerHTML="<svg>"+t+"</svg>",t=Rn.firstChild;t.firstChild;)e.appendChild(t.firstChild)}),nr=/["\'&<>]/,rr=Lt.TEXT_NODE;gt.canUseDOM&&("textContent"in document.documentElement||(V=function(e,t){if(e.nodeType===rr)e.nodeValue=t;else{if("boolean"===typeof t||"number"===typeof t)t=""+t;else{t=""+t;var n=nr.exec(t);if(n){var r,u="",o=0;for(r=n.index;r<t.length;r++){switch(t.charCodeAt(r)){case 34:n="&quot;";break;case 38:n="&amp;";break;case 39:n="&#x27;";break;case 60:n="&lt;";break;case 62:n="&gt;";break;default:continue}o!==r&&(u+=t.substring(o,r)),o=r+1,u+=n}t=o!==r?u+t.substring(o,r):u}}tr(e,t)}}));var ur=V,or=(zn.getCurrentFiberOwnerName,Lt.DOCUMENT_NODE),ar=Lt.DOCUMENT_FRAGMENT_NODE,ir=Tn.listenTo,lr=Pt.registrationNameModules,sr=kt.Namespaces.html,cr=kt.getIntrinsicNamespace,pr={topAbort:"abort",topCanPlay:"canplay",topCanPlayThrough:"canplaythrough",topDurationChange:"durationchange",topEmptied:"emptied",topEncrypted:"encrypted",topEnded:"ended",topError:"error",topLoadedData:"loadeddata",topLoadedMetadata:"loadedmetadata",topLoadStart:"loadstart",topPause:"pause",topPlay:"play",topPlaying:"playing",topProgress:"progress",topRateChange:"ratechange",topSeeked:"seeked",topSeeking:"seeking",topStalled:"stalled",topSuspend:"suspend",topTimeUpdate:"timeupdate",topVolumeChange:"volumechange",topWaiting:"waiting"},fr={createElement:function(e,t,n,r){return n=n.nodeType===or?n:n.ownerDocument,r===sr&&(r=cr(e)),r===sr?"script"===e?(e=n.createElement("div"),e.innerHTML="<script><\\/script>",e=e.removeChild(e.firstChild)):e="string"===typeof t.is?n.createElement(e,{is:t.is}):n.createElement(e):e=n.createElementNS(r,e),e},createTextNode:function(e,t){return(t.nodeType===or?t:t.ownerDocument).createTextNode(e)},setInitialProperties:function(e,t,n,r){var u=j(t,n);switch(t){case"iframe":case"object":Tn.trapBubbledEvent("topLoad","load",e);var o=n;break;case"video":case"audio":for(o in pr)pr.hasOwnProperty(o)&&Tn.trapBubbledEvent(o,pr[o],e);o=n;break;case"source":Tn.trapBubbledEvent("topError","error",e),o=n;break;case"img":case"image":Tn.trapBubbledEvent("topError","error",e),Tn.trapBubbledEvent("topLoad","load",e),o=n;break;case"form":Tn.trapBubbledEvent("topReset","reset",e),Tn.trapBubbledEvent("topSubmit","submit",e),o=n;break;case"details":Tn.trapBubbledEvent("topToggle","toggle",e),o=n;break;case"input":Gn.initWrapperState(e,n),o=Gn.getHostProps(e,n),Tn.trapBubbledEvent("topInvalid","invalid",e),W(r,"onChange");break;case"option":Yn.validateProps(e,n),o=Yn.getHostProps(e,n);break;case"select":$n.initWrapperState(e,n),o=$n.getHostProps(e,n),Tn.trapBubbledEvent("topInvalid","invalid",e),W(r,"onChange");break;case"textarea":Xn.initWrapperState(e,n),o=Xn.getHostProps(e,n),Tn.trapBubbledEvent("topInvalid","invalid",e),W(r,"onChange");break;default:o=n}M(t,o);var a,i=o;for(a in i)if(i.hasOwnProperty(a)){var l=i[a];"style"===a?Ln.setValueForStyles(e,l):"dangerouslySetInnerHTML"===a?null!=(l=l?l.__html:void 0)&&tr(e,l):"children"===a?"string"===typeof l?ur(e,l):"number"===typeof l&&ur(e,""+l):"suppressContentEditableWarning"!==a&&(lr.hasOwnProperty(a)?null!=l&&W(r,a):u?jn.setValueForAttribute(e,a,l):null!=l&&jn.setValueForProperty(e,a,l))}switch(t){case"input":Zn.track(e),Gn.postMountWrapper(e,n);break;case"textarea":Zn.track(e),Xn.postMountWrapper(e,n);break;case"option":Yn.postMountWrapper(e,n);break;case"select":$n.postMountWrapper(e,n);break;default:"function"===typeof o.onClick&&(e.onclick=Et)}},diffProperties:function(e,t,n,r,u){var o=null;switch(t){case"input":n=Gn.getHostProps(e,n),r=Gn.getHostProps(e,r),o=[];break;case"option":n=Yn.getHostProps(e,n),r=Yn.getHostProps(e,r),o=[];break;case"select":n=$n.getHostProps(e,n),r=$n.getHostProps(e,r),o=[];break;case"textarea":n=Xn.getHostProps(e,n),r=Xn.getHostProps(e,r),o=[];break;default:"function"!==typeof n.onClick&&"function"===typeof r.onClick&&(e.onclick=Et)}M(t,r);var a,i;e=null;for(a in n)if(!r.hasOwnProperty(a)&&n.hasOwnProperty(a)&&null!=n[a])if("style"===a)for(i in t=n[a])t.hasOwnProperty(i)&&(e||(e={}),e[i]="");else"dangerouslySetInnerHTML"!==a&&"children"!==a&&"suppressContentEditableWarning"!==a&&(lr.hasOwnProperty(a)?o||(o=[]):(o=o||[]).push(a,null));for(a in r){var l=r[a];if(t=null!=n?n[a]:void 0,r.hasOwnProperty(a)&&l!==t&&(null!=l||null!=t))if("style"===a)if(t){for(i in t)!t.hasOwnProperty(i)||l&&l.hasOwnProperty(i)||(e||(e={}),e[i]="");for(i in l)l.hasOwnProperty(i)&&t[i]!==l[i]&&(e||(e={}),e[i]=l[i])}else e||(o||(o=[]),o.push(a,e)),e=l;else"dangerouslySetInnerHTML"===a?(l=l?l.__html:void 0,t=t?t.__html:void 0,null!=l&&t!==l&&(o=o||[]).push(a,""+l)):"children"===a?t===l||"string"!==typeof l&&"number"!==typeof l||(o=o||[]).push(a,""+l):"suppressContentEditableWarning"!==a&&(lr.hasOwnProperty(a)?(null!=l&&W(u,a),o||t===l||(o=[])):(o=o||[]).push(a,l))}return e&&(o=o||[]).push("style",e),o},updateProperties:function(e,t,n,r,u){j(n,r),r=j(n,u);for(var o=0;o<t.length;o+=2){var a=t[o],i=t[o+1];"style"===a?Ln.setValueForStyles(e,i):"dangerouslySetInnerHTML"===a?tr(e,i):"children"===a?ur(e,i):r?null!=i?jn.setValueForAttribute(e,a,i):jn.deleteValueForAttribute(e,a):null!=i?jn.setValueForProperty(e,a,i):jn.deleteValueForProperty(e,a)}switch(n){case"input":Gn.updateWrapper(e,u),Zn.updateValueIfChanged(e);break;case"textarea":Xn.updateWrapper(e,u);break;case"select":$n.postUpdateWrapper(e,u)}},diffHydratedProperties:function(e,t,n,r,u){switch(t){case"iframe":case"object":Tn.trapBubbledEvent("topLoad","load",e);break;case"video":case"audio":for(var o in pr)pr.hasOwnProperty(o)&&Tn.trapBubbledEvent(o,pr[o],e);break;case"source":Tn.trapBubbledEvent("topError","error",e);break;case"img":case"image":Tn.trapBubbledEvent("topError","error",e),Tn.trapBubbledEvent("topLoad","load",e);break;case"form":Tn.trapBubbledEvent("topReset","reset",e),Tn.trapBubbledEvent("topSubmit","submit",e);break;case"details":Tn.trapBubbledEvent("topToggle","toggle",e);break;case"input":Gn.initWrapperState(e,n),Tn.trapBubbledEvent("topInvalid","invalid",e),W(u,"onChange");break;case"option":Yn.validateProps(e,n);break;case"select":$n.initWrapperState(e,n),Tn.trapBubbledEvent("topInvalid","invalid",e),W(u,"onChange");break;case"textarea":Xn.initWrapperState(e,n),Tn.trapBubbledEvent("topInvalid","invalid",e),W(u,"onChange")}M(t,n),r=null;for(var a in n)n.hasOwnProperty(a)&&(o=n[a],"children"===a?"string"===typeof o?e.textContent!==o&&(r=["children",o]):"number"===typeof o&&e.textContent!==""+o&&(r=["children",""+o]):lr.hasOwnProperty(a)&&null!=o&&W(u,a));switch(t){case"input":Zn.track(e),Gn.postMountWrapper(e,n);break;case"textarea":Zn.track(e),Xn.postMountWrapper(e,n);break;case"select":case"option":break;default:"function"===typeof n.onClick&&(e.onclick=Et)}return r},diffHydratedText:function(e,t){return e.nodeValue!==t},warnForDeletedHydratableElement:function(){},warnForDeletedHydratableText:function(){},warnForInsertedHydratedElement:function(){},warnForInsertedHydratedText:function(){},restoreControlledState:function(e,t,n){switch(t){case"input":Gn.restoreControlledState(e,n);break;case"textarea":Xn.restoreControlledState(e,n);break;case"select":$n.restoreControlledState(e,n)}}},dr=void 0;if(gt.canUseDOM)if("function"!==typeof requestIdleCallback){var Dr=null,hr=null,gr=!1,mr=!1,Cr=0,Er=33,Ar=33,Fr={timeRemaining:"object"===typeof performance&&"function"===typeof performance.now?function(){return Cr-performance.now()}:function(){return Cr-Date.now()}},br="__reactIdleCallback$"+Math.random().toString(36).slice(2);window.addEventListener("message",function(e){e.source===window&&e.data===br&&(gr=!1,e=hr,hr=null,null!==e&&e(Fr))},!1);var yr=function(e){mr=!1;var t=e-Cr+Ar;t<Ar&&Er<Ar?(8>t&&(t=8),Ar=t<Er?Er:t):Er=t,Cr=e+Ar,gr||(gr=!0,window.postMessage(br,"*")),t=Dr,Dr=null,null!==t&&t(e)};dr=function(e){return hr=e,mr||(mr=!0,requestAnimationFrame(yr)),0}}else dr=requestIdleCallback;else dr=function(e){return setTimeout(function(){e({timeRemaining:function(){return 1/0}})}),0};var vr,Br,wr={rIC:dr},kr={enableAsyncSubtreeAPI:!0},xr={NoWork:0,SynchronousPriority:1,TaskPriority:2,HighPriority:3,LowPriority:4,OffscreenPriority:5},Tr=Qt.Callback,Sr=xr.NoWork,Pr=xr.SynchronousPriority,Nr=xr.TaskPriority,_r=Rt.ClassComponent,Or=Rt.HostRoot,Ir=void 0,Rr=void 0,Lr={addUpdate:function(e,t,n,r){$(e,{priorityLevel:r,partialState:t,callback:n,isReplace:!1,isForced:!1,isTopLevelUnmount:!1,next:null})},addReplaceUpdate:function(e,t,n,r){$(e,{priorityLevel:r,partialState:t,callback:n,isReplace:!0,isForced:!1,isTopLevelUnmount:!1,next:null})},addForceUpdate:function(e,t,n){$(e,{priorityLevel:n,partialState:null,callback:t,isReplace:!1,isForced:!0,isTopLevelUnmount:!1,next:null})},getUpdatePriority:function(e){var t=e.updateQueue;return null===t||e.tag!==_r&&e.tag!==Or?Sr:null!==t.first?t.first.priorityLevel:Sr},addTopLevelUpdate:function(e,t,n,r){var u=null===t.element;t={priorityLevel:r,partialState:t,callback:n,isReplace:!1,isForced:!1,isTopLevelUnmount:u,next:null},e=$(e,t),u&&(u=Ir,n=Rr,null!==u&&null!==t.next&&(t.next=null,u.last=t),null!==n&&null!==e&&null!==e.next&&(e.next=null,n.last=t))},beginUpdateQueue:function(e,t,n,r,u,o,a){null!==e&&e.updateQueue===n&&(n=t.updateQueue={first:n.first,last:n.last,callbackList:null,hasForceUpdate:!1}),e=n.callbackList;for(var i=n.hasForceUpdate,l=!0,s=n.first;null!==s&&0>=z(s.priorityLevel,a);){n.first=s.next,null===n.first&&(n.last=null);var c;s.isReplace?(u=Q(s,r,u,o),l=!0):(c=Q(s,r,u,o))&&(u=l?mt({},u,c):mt(u,c),l=!1),s.isForced&&(i=!0),null===s.callback||s.isTopLevelUnmount&&null!==s.next||(e=null!==e?e:[],e.push(s.callback),t.effectTag|=Tr),s=s.next}return n.callbackList=e,n.hasForceUpdate=i,null!==n.first||null!==e||i||(t.updateQueue=null),u},commitCallbacks:function(e,t,n){if(null!==(e=t.callbackList))for(t.callbackList=null,t=0;t<e.length;t++){var u=e[t];"function"!==typeof u&&r("191",u),u.call(n)}}},Ur=[],Mr=-1,Hr={createCursor:function(e){return{current:e}},isEmpty:function(){return-1===Mr},pop:function(e){0>Mr||(e.current=Ur[Mr],Ur[Mr]=null,Mr--)},push:function(e,t){Mr++,Ur[Mr]=e.current,e.current=t},reset:function(){for(;-1<Mr;)Ur[Mr]=null,Mr--}},qr=rn.isFiberMounted,jr=Rt.ClassComponent,Vr=Rt.HostRoot,Wr=Hr.createCursor,zr=Hr.pop,Kr=Hr.push,Gr=Wr(At),Yr=Wr(!1),$r=At,Qr={getUnmaskedContext:function(e){return J(e)?$r:Gr.current},cacheContext:X,getMaskedContext:function(e,t){var n=e.type.contextTypes;if(!n)return At;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var u,o={};for(u in n)o[u]=t[u];return r&&X(e,t,o),o},hasContextChanged:function(){return Yr.current},isContextConsumer:function(e){return e.tag===jr&&null!=e.type.contextTypes},isContextProvider:J,popContextProvider:function(e){J(e)&&(zr(Yr,e),zr(Gr,e))},popTopLevelContextObject:function(e){zr(Yr,e),zr(Gr,e)},pushTopLevelContextObject:function(e,t,n){null!=Gr.cursor&&r("168"),Kr(Gr,t,e),Kr(Yr,n,e)},processChildContext:Z,pushContextProvider:function(e){if(!J(e))return!1;var t=e.stateNode;return t=t&&t.__reactInternalMemoizedMergedChildContext||At,$r=Gr.current,Kr(Gr,t,e),Kr(Yr,Yr.current,e),!0},invalidateContextProvider:function(e,t){var n=e.stateNode;if(n||r("169"),t){var u=Z(e,$r);n.__reactInternalMemoizedMergedChildContext=u,zr(Yr,e),zr(Gr,e),Kr(Gr,u,e)}else zr(Yr,e);Kr(Yr,t,e)},resetContext:function(){$r=At,Gr.current=At,Yr.current=!1},findCurrentUnmaskedContext:function(e){for(qr(e)&&e.tag===jr?void 0:r("170");e.tag!==Vr;){if(J(e))return e.stateNode.__reactInternalMemoizedMergedChildContext;(e=e.return)||r("171")}return e.stateNode.context}},Xr={NoContext:0,AsyncUpdates:1},Jr=Rt.IndeterminateComponent,Zr=Rt.ClassComponent,eu=Rt.HostRoot,tu=Rt.HostComponent,nu=Rt.HostText,ru=Rt.HostPortal,uu=Rt.CoroutineComponent,ou=Rt.YieldComponent,au=Rt.Fragment,iu=xr.NoWork,lu=Xr.NoContext,su=Qt.NoEffect,cu={createWorkInProgress:function(e,t){var n=e.alternate;return null===n?(n=new ee(e.tag,e.key,e.internalContextTag),n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.effectTag=su,n.nextEffect=null,n.firstEffect=null,n.lastEffect=null),n.pendingWorkPriority=t,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n},createHostRootFiber:function(){return new ee(eu,null,lu)},createFiberFromElement:function(e,t,n){return t=te(e.type,e.key,t),t.pendingProps=e.props,t.pendingWorkPriority=n,t},createFiberFromFragment:function(e,t,n){return t=new ee(au,null,t),t.pendingProps=e,t.pendingWorkPriority=n,t},createFiberFromText:function(e,t,n){return t=new ee(nu,null,t),t.pendingProps=e,t.pendingWorkPriority=n,t},createFiberFromElementType:te,createFiberFromHostInstanceForDeletion:function(){var e=new ee(tu,null,lu);return e.type="DELETED",e},createFiberFromCoroutine:function(e,t,n){return t=new ee(uu,e.key,t),t.type=e.handler,t.pendingProps=e,t.pendingWorkPriority=n,t},createFiberFromYield:function(e,t){return new ee(ou,null,t)},createFiberFromPortal:function(e,t,n){return t=new ee(ru,e.key,t),t.pendingProps=e.children||[],t.pendingWorkPriority=n,t.stateNode={containerInfo:e.containerInfo,implementation:e.implementation},t},largerPriority:function(e,t){return e!==iu&&(t===iu||t>e)?e:t}},pu=cu.createHostRootFiber,fu=Rt.IndeterminateComponent,du=Rt.FunctionalComponent,Du=Rt.ClassComponent,hu=Rt.HostComponent;"function"===typeof Symbol&&Symbol.for?(vr=Symbol.for("react.coroutine"),Br=Symbol.for("react.yield")):(vr=60104,Br=60105);var gu={createCoroutine:function(e,t,n){var r=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:vr,key:null==r?null:""+r,children:e,handler:t,props:n}},createYield:function(e){return{$$typeof:Br,value:e}},isCoroutine:function(e){return"object"===typeof e&&null!==e&&e.$$typeof===vr},isYield:function(e){return"object"===typeof e&&null!==e&&e.$$typeof===Br},REACT_YIELD_TYPE:Br,REACT_COROUTINE_TYPE:vr},mu="function"===typeof Symbol&&Symbol.for&&Symbol.for("react.portal")||60106,Cu={createPortal:function(e,t,n){var r=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:mu,key:null==r?null:""+r,children:e,containerInfo:t,implementation:n}},isPortal:function(e){return"object"===typeof e&&null!==e&&e.$$typeof===mu},REACT_PORTAL_TYPE:mu},Eu=gu.REACT_COROUTINE_TYPE,Au=gu.REACT_YIELD_TYPE,Fu=Cu.REACT_PORTAL_TYPE,bu=cu.createWorkInProgress,yu=cu.createFiberFromElement,vu=cu.createFiberFromFragment,Bu=cu.createFiberFromText,wu=cu.createFiberFromCoroutine,ku=cu.createFiberFromYield,xu=cu.createFiberFromPortal,Tu=Array.isArray,Su=Rt.FunctionalComponent,Pu=Rt.ClassComponent,Nu=Rt.HostText,_u=Rt.HostPortal,Ou=Rt.CoroutineComponent,Iu=Rt.YieldComponent,Ru=Rt.Fragment,Lu=Qt.NoEffect,Uu=Qt.Placement,Mu=Qt.Deletion,Hu="function"===typeof Symbol&&Symbol.iterator,qu="function"===typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,ju=oe(!0,!0),Vu=oe(!1,!0),Wu=oe(!1,!1),zu={reconcileChildFibers:ju,reconcileChildFibersInPlace:Vu,mountChildFibersInPlace:Wu,cloneChildFibers:function(e,t){if(null!==e&&t.child!==e.child&&r("153"),null!==t.child){e=t.child;var n=bu(e,e.pendingWorkPriority);for(n.pendingProps=e.pendingProps,t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,n=n.sibling=bu(e,e.pendingWorkPriority),n.pendingProps=e.pendingProps,n.return=t;n.sibling=null}}},Ku=Qt.Update,Gu=Xr.AsyncUpdates,Yu=Qr.cacheContext,$u=Qr.getMaskedContext,Qu=Qr.getUnmaskedContext,Xu=Qr.isContextConsumer,Ju=Lr.addUpdate,Zu=Lr.addReplaceUpdate,eo=Lr.addForceUpdate,to=Lr.beginUpdateQueue,no=Qr.hasContextChanged,ro=rn.isMounted,uo=zu.mountChildFibersInPlace,oo=zu.reconcileChildFibers,ao=zu.reconcileChildFibersInPlace,io=zu.cloneChildFibers,lo=Lr.beginUpdateQueue,so=Qr.getMaskedContext,co=Qr.getUnmaskedContext,po=Qr.hasContextChanged,fo=Qr.pushContextProvider,Do=Qr.pushTopLevelContextObject,ho=Qr.invalidateContextProvider,go=Rt.IndeterminateComponent,mo=Rt.FunctionalComponent,Co=Rt.ClassComponent,Eo=Rt.HostRoot,Ao=Rt.HostComponent,Fo=Rt.HostText,bo=Rt.HostPortal,yo=Rt.CoroutineComponent,vo=Rt.CoroutineHandlerPhase,Bo=Rt.YieldComponent,wo=Rt.Fragment,ko=xr.NoWork,xo=xr.OffscreenPriority,To=Qt.PerformedWork,So=Qt.Placement,Po=Qt.ContentReset,No=Qt.Err,_o=Qt.Ref,Oo=$t.ReactCurrentOwner,Io=zu.reconcileChildFibers,Ro=Qr.popContextProvider,Lo=Qr.popTopLevelContextObject,Uo=Rt.IndeterminateComponent,Mo=Rt.FunctionalComponent,Ho=Rt.ClassComponent,qo=Rt.HostRoot,jo=Rt.HostComponent,Vo=Rt.HostText,Wo=Rt.HostPortal,zo=Rt.CoroutineComponent,Ko=Rt.CoroutineHandlerPhase,Go=Rt.YieldComponent,Yo=Rt.Fragment,$o=Qt.Placement,Qo=Qt.Ref,Xo=Qt.Update,Jo=xr.OffscreenPriority,Zo=null,ea=null,ta={injectInternals:function(e){if("undefined"===typeof{})return!1;var t={};if(!t.supportsFiber)return!0;try{var n=t.inject(e);Zo=se(function(e){return t.onCommitFiberRoot(n,e)}),ea=se(function(e){return t.onCommitFiberUnmount(n,e)})}catch(e){}return!0},onCommitRoot:function(e){"function"===typeof Zo&&Zo(e)},onCommitUnmount:function(e){"function"===typeof ea&&ea(e)}},na=Rt.ClassComponent,ra=Rt.HostRoot,ua=Rt.HostComponent,oa=Rt.HostText,aa=Rt.HostPortal,ia=Rt.CoroutineComponent,la=Lr.commitCallbacks,sa=ta.onCommitUnmount,ca=Qt.Placement,pa=Qt.Update,fa=Qt.Callback,da=Qt.ContentReset,Da=Hr.createCursor,ha=Hr.pop,ga=Hr.push,ma={},Ca=Rt.HostComponent,Ea=Rt.HostText,Aa=Rt.HostRoot,Fa=Qt.Deletion,ba=Qt.Placement,ya=cu.createFiberFromHostInstanceForDeletion,va=Qr.popContextProvider,Ba=Hr.reset,wa=$t.ReactCurrentOwner,ka=cu.createWorkInProgress,xa=cu.largerPriority,Ta=ta.onCommitRoot,Sa=xr.NoWork,Pa=xr.SynchronousPriority,Na=xr.TaskPriority,_a=xr.HighPriority,Oa=xr.LowPriority,Ia=xr.OffscreenPriority,Ra=Xr.AsyncUpdates,La=Qt.PerformedWork,Ua=Qt.Placement,Ma=Qt.Update,Ha=Qt.PlacementAndUpdate,qa=Qt.Deletion,ja=Qt.ContentReset,Va=Qt.Callback,Wa=Qt.Err,za=Qt.Ref,Ka=Rt.HostRoot,Ga=Rt.HostComponent,Ya=Rt.HostPortal,$a=Rt.ClassComponent,Qa=Lr.getUpdatePriority,Xa=Qr.resetContext;he._injectFiber=function(e){De=e};var Ja=Lr.addTopLevelUpdate,Za=Qr.findCurrentUnmaskedContext,ei=Qr.isContextProvider,ti=Qr.processChildContext,ni=Rt.HostComponent,ri=rn.findCurrentHostFiber,ui=rn.findCurrentHostFiberWithNoPortals;he._injectFiber(function(e){var t=Za(e);return ei(e)?ti(e,t,!1):t});var oi=Lt.TEXT_NODE,ai=null,ii={getOffsets:function(e){var t=window.getSelection&&window.getSelection();if(!t||0===t.rangeCount)return null;var n=t.anchorNode,r=t.anchorOffset,u=t.focusNode,o=t.focusOffset,a=t.getRangeAt(0);try{a.startContainer.nodeType,a.endContainer.nodeType}catch(e){return null}t=t.anchorNode===t.focusNode&&t.anchorOffset===t.focusOffset?0:a.toString().length;var i=a.cloneRange();return i.selectNodeContents(e),i.setEnd(a.startContainer,a.startOffset),e=i.startContainer===i.endContainer&&i.startOffset===i.endOffset?0:i.toString().length,a=e+t,t=document.createRange(),t.setStart(n,r),t.setEnd(u,o),n=t.collapsed,{start:n?a:e,end:n?e:a}},setOffsets:function(e,t){if(window.getSelection){var n=window.getSelection(),r=e[Ce()].length,u=Math.min(t.start,r);if(t=void 0===t.end?u:Math.min(t.end,r),!n.extend&&u>t&&(r=t,t=u,u=r),r=me(e,u),e=me(e,t),r&&e){var o=document.createRange();o.setStart(r.node,r.offset),n.removeAllRanges(),u>t?(n.addRange(o),n.extend(e.node,e.offset)):(o.setEnd(e.node,e.offset),n.addRange(o))}}}},li=Lt.ELEMENT_NODE,si={hasSelectionCapabilities:function(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&"text"===e.type||"textarea"===t||"true"===e.contentEditable)},getSelectionInformation:function(){var e=vt();return{focusedElem:e,selectionRange:si.hasSelectionCapabilities(e)?si.getSelection(e):null}},restoreSelection:function(e){var t=vt(),n=e.focusedElem;if(e=e.selectionRange,t!==n&&bt(document.documentElement,n)){for(si.hasSelectionCapabilities(n)&&si.setSelection(n,e),t=[],e=n;e=e.parentNode;)e.nodeType===li&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(yt(n),n=0;n<t.length;n++)e=t[n],e.element.scrollLeft=e.left,e.element.scrollTop=e.top}},getSelection:function(e){return("selectionStart"in e?{start:e.selectionStart,end:e.selectionEnd}:ii.getOffsets(e))||{start:0,end:0}},setSelection:function(e,t){var n=t.start,r=t.end;void 0===r&&(r=n),"selectionStart"in e?(e.selectionStart=n,e.selectionEnd=Math.min(r,e.value.length)):ii.setOffsets(e,t)}},ci=si,pi=Lt.ELEMENT_NODE;Fe._injectFiber=function(e){Ee=e},Fe._injectStack=function(e){Ae=e};var fi=Rt.HostComponent,di={isAncestor:function(e,t){for(;t;){if(e===t||e===t.alternate)return!0;t=be(t)}return!1},getLowestCommonAncestor:ye,getParentInstance:function(e){return be(e)},traverseTwoPhase:function(e,t,n){for(var r=[];e;)r.push(e),e=be(e);for(e=r.length;0<e--;)t(r[e],"captured",n);for(e=0;e<r.length;e++)t(r[e],"bubbled",n)},traverseEnterLeave:function(e,t,n,r,u){for(var o=e&&t?ye(e,t):null,a=[];e&&e!==o;)a.push(e),e=be(e);for(e=[];t&&t!==o;)e.push(t),t=be(t);for(t=0;t<a.length;t++)n(a[t],"bubbled",r);for(t=e.length;0<t--;)n(e[t],"captured",u)}},Di=Fn.getListener,hi={accumulateTwoPhaseDispatches:function(e){w(e,Be)},accumulateTwoPhaseDispatchesSkipTarget:function(e){w(e,we)},accumulateDirectDispatches:function(e){w(e,xe)},accumulateEnterLeaveDispatches:function(e,t,n,r){di.traverseEnterLeave(n,r,ke,e,t)}},gi={_root:null,_startText:null,_fallbackText:null},mi={initialize:function(e){return gi._root=e,gi._startText=mi.getText(),!0},reset:function(){gi._root=null,gi._startText=null,gi._fallbackText=null},getData:function(){if(gi._fallbackText)return gi._fallbackText;var e,t,n=gi._startText,r=n.length,u=mi.getText(),o=u.length;for(e=0;e<r&&n[e]===u[e];e++);var a=r-e;for(t=1;t<=a&&n[r-t]===u[o-t];t++);return gi._fallbackText=u.slice(e,1<t?1-t:void 0),gi._fallbackText},getText:function(){return"value"in gi._root?gi._root.value:gi._root[Ce()]}},Ci=mi,Ei="dispatchConfig _targetInst nativeEvent isDefaultPrevented isPropagationStopped _dispatchListeners _dispatchInstances".split(" "),Ai={type:null,target:null,currentTarget:Et.thatReturnsNull,eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null};mt(Te.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!==typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=Et.thatReturnsTrue)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!==typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=Et.thatReturnsTrue)},persist:function(){this.isPersistent=Et.thatReturnsTrue},isPersistent:Et.thatReturnsFalse,destructor:function(){var e,t=this.constructor.Interface;for(e in t)this[e]=null;for(t=0;t<Ei.length;t++)this[Ei[t]]=null}}),Te.Interface=Ai,Te.augmentClass=function(e,t){function n(){}n.prototype=this.prototype;var r=new n;mt(r,e.prototype),e.prototype=r,e.prototype.constructor=e,e.Interface=mt({},this.Interface,t),e.augmentClass=this.augmentClass,Ne(e)},Ne(Te),Te.augmentClass(_e,{data:null}),Te.augmentClass(Oe,{data:null});var Fi=[9,13,27,32],bi=gt.canUseDOM&&"CompositionEvent"in window,yi=null;gt.canUseDOM&&"documentMode"in document&&(yi=document.documentMode);var vi;if(vi=gt.canUseDOM&&"TextEvent"in window&&!yi){var Bi=window.opera;vi=!("object"===typeof Bi&&"function"===typeof Bi.version&&12>=parseInt(Bi.version(),10))}var wi=vi,ki=gt.canUseDOM&&(!bi||yi&&8<yi&&11>=yi),xi=String.fromCharCode(32),Ti={beforeInput:{phasedRegistrationNames:{bubbled:"onBeforeInput",captured:"onBeforeInputCapture"},dependencies:["topCompositionEnd","topKeyPress","topTextInput","topPaste"]},compositionEnd:{phasedRegistrationNames:{bubbled:"onCompositionEnd",captured:"onCompositionEndCapture"},dependencies:"topBlur topCompositionEnd topKeyDown topKeyPress topKeyUp topMouseDown".split(" ")},compositionStart:{phasedRegistrationNames:{bubbled:"onCompositionStart",captured:"onCompositionStartCapture"},dependencies:"topBlur topCompositionStart topKeyDown topKeyPress topKeyUp topMouseDown".split(" ")},compositionUpdate:{phasedRegistrationNames:{bubbled:"onCompositionUpdate",captured:"onCompositionUpdateCapture"},dependencies:"topBlur topCompositionUpdate topKeyDown topKeyPress topKeyUp topMouseDown".split(" ")}},Si=!1,Pi=!1,Ni={eventTypes:Ti,extractEvents:function(e,t,n,r){var u;if(bi)e:{switch(e){case"topCompositionStart":var o=Ti.compositionStart;break e;case"topCompositionEnd":o=Ti.compositionEnd;break e;case"topCompositionUpdate":o=Ti.compositionUpdate;break e}o=void 0}else Pi?Ie(e,n)&&(o=Ti.compositionEnd):"topKeyDown"===e&&229===n.keyCode&&(o=Ti.compositionStart);return o?(ki&&(Pi||o!==Ti.compositionStart?o===Ti.compositionEnd&&Pi&&(u=Ci.getData()):Pi=Ci.initialize(r)),o=_e.getPooled(o,t,n,r),u?o.data=u:null!==(u=Re(n))&&(o.data=u),hi.accumulateTwoPhaseDispatches(o),u=o):u=null,(e=wi?Le(e,n):Ue(e,n))?(t=Oe.getPooled(Ti.beforeInput,t,n,r),t.data=e,hi.accumulateTwoPhaseDispatches(t)):t=null,[u,t]}},_i={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0},Oi={change:{phasedRegistrationNames:{bubbled:"onChange",captured:"onChangeCapture"},dependencies:"topBlur topChange topClick topFocus topInput topKeyDown topKeyUp topSelectionChange".split(" ")}},Ii=null,Ri=null,Li=!1;gt.canUseDOM&&(Li=P("input")&&(!document.documentMode||9<document.documentMode));var Ui={eventTypes:Oi,_isInputEventSupported:Li,extractEvents:function(e,t,n,r){var u=t?Gt.getNodeFromInstance(t):window,o=u.nodeName&&u.nodeName.toLowerCase();if("select"===o||"input"===o&&"file"===u.type)var a=Ve;else if(Me(u))if(Li)a=$e;else{a=Ge;var i=Ke}else!(o=u.nodeName)||"input"!==o.toLowerCase()||"checkbox"!==u.type&&"radio"!==u.type||(a=Ye);if(a&&(a=a(e,t)))return He(a,n,r);i&&i(e,u,t),"topBlur"===e&&null!=t&&(e=t._wrapperState||u._wrapperState)&&e.controlled&&"number"===u.type&&(e=""+u.value,u.getAttribute("value")!==e&&u.setAttribute("value",e))}};Te.augmentClass(Qe,{view:function(e){return e.view?e.view:(e=y(e),e.window===e?e:(e=e.ownerDocument)?e.defaultView||e.parentWindow:window)},detail:function(e){return e.detail||0}});var Mi={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};Qe.augmentClass(Ze,{screenX:null,screenY:null,clientX:null,clientY:null,pageX:null,pageY:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,getModifierState:Je,button:null,buttons:null,relatedTarget:function(e){return e.relatedTarget||(e.fromElement===e.srcElement?e.toElement:e.fromElement)}});var Hi={mouseEnter:{registrationName:"onMouseEnter",dependencies:["topMouseOut","topMouseOver"]},mouseLeave:{registrationName:"onMouseLeave",dependencies:["topMouseOut","topMouseOver"]}},qi={eventTypes:Hi,extractEvents:function(e,t,n,r){if("topMouseOver"===e&&(n.relatedTarget||n.fromElement)||"topMouseOut"!==e&&"topMouseOver"!==e)return null;var u=r.window===r?r:(u=r.ownerDocument)?u.defaultView||u.parentWindow:window;if("topMouseOut"===e?(e=t,t=(t=n.relatedTarget||n.toElement)?Gt.getClosestInstanceFromNode(t):null):e=null,e===t)return null;var o=null==e?u:Gt.getNodeFromInstance(e);u=null==t?u:Gt.getNodeFromInstance(t);var a=Ze.getPooled(Hi.mouseLeave,e,n,r);return a.type="mouseleave",a.target=o,a.relatedTarget=u,n=Ze.getPooled(Hi.mouseEnter,t,n,r),n.type="mouseenter",n.target=u,n.relatedTarget=o,hi.accumulateEnterLeaveDispatches(a,n,e,t),[a,n]}},ji=Lt.DOCUMENT_NODE,Vi=gt.canUseDOM&&"documentMode"in document&&11>=document.documentMode,Wi={select:{phasedRegistrationNames:{bubbled:"onSelect",captured:"onSelectCapture"},dependencies:"topBlur topContextMenu topFocus topKeyDown topKeyUp topMouseDown topMouseUp topSelectionChange".split(" ")}},zi=null,Ki=null,Gi=null,Yi=!1,$i=Tn.isListeningToAllDependencies,Qi={eventTypes:Wi,extractEvents:function(e,t,n,r){var u=r.window===r?r.document:r.nodeType===ji?r:r.ownerDocument;if(!u||!$i("onSelect",u))return null;switch(u=t?Gt.getNodeFromInstance(t):window,e){case"topFocus":(Me(u)||"true"===u.contentEditable)&&(zi=u,Ki=t,Gi=null);break;case"topBlur":Gi=Ki=zi=null;break;case"topMouseDown":Yi=!0;break;case"topContextMenu":case"topMouseUp":return Yi=!1,et(n,r);case"topSelectionChange":if(Vi)break;case"topKeyDown":case"topKeyUp":return et(n,r)}return null}};Te.augmentClass(tt,{animationName:null,elapsedTime:null,pseudoElement:null}),Te.augmentClass(nt,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),Qe.augmentClass(rt,{relatedTarget:null});var Xi={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},Ji={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"};Qe.augmentClass(ot,{key:function(e){if(e.key){var t=Xi[e.key]||e.key;if("Unidentified"!==t)return t}return"keypress"===e.type?(e=ut(e),13===e?"Enter":String.fromCharCode(e)):"keydown"===e.type||"keyup"===e.type?Ji[e.keyCode]||"Unidentified":""},location:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,repeat:null,locale:null,getModifierState:Je,charCode:function(e){return"keypress"===e.type?ut(e):0},keyCode:function(e){return"keydown"===e.type||"keyup"===e.type?e.keyCode:0},which:function(e){return"keypress"===e.type?ut(e):"keydown"===e.type||"keyup"===e.type?e.keyCode:0}}),Ze.augmentClass(at,{dataTransfer:null}),Qe.augmentClass(it,{touches:null,targetTouches:null,changedTouches:null,altKey:null,metaKey:null,ctrlKey:null,shiftKey:null,getModifierState:Je}),Te.augmentClass(lt,{propertyName:null,elapsedTime:null,pseudoElement:null}),Ze.augmentClass(st,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:null,deltaMode:null});var Zi={},el={};"abort animationEnd animationIteration animationStart blur cancel canPlay canPlayThrough click close contextMenu copy cut doubleClick drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error focus input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing progress rateChange reset scroll seeked seeking stalled submit suspend timeUpdate toggle touchCancel touchEnd touchMove touchStart transitionEnd volumeChange waiting wheel".split(" ").forEach(function(e){var t=e[0].toUpperCase()+e.slice(1),n="on"+t;t="top"+t,n={phasedRegistrationNames:{bubbled:n,captured:n+"Capture"},dependencies:[t]},Zi[e]=n,el[t]=n});var tl={eventTypes:Zi,extractEvents:function(e,t,n,u){var o=el[e];if(!o)return null;switch(e){case"topAbort":case"topCancel":case"topCanPlay":case"topCanPlayThrough":case"topClose":case"topDurationChange":case"topEmptied":case"topEncrypted":case"topEnded":case"topError":case"topInput":case"topInvalid":case"topLoad":case"topLoadedData":case"topLoadedMetadata":case"topLoadStart":case"topPause":case"topPlay":case"topPlaying":case"topProgress":case"topRateChange":case"topReset":case"topSeeked":case"topSeeking":case"topStalled":case"topSubmit":case"topSuspend":case"topTimeUpdate":case"topToggle":case"topVolumeChange":case"topWaiting":var a=Te;break;case"topKeyPress":if(0===ut(n))return null;case"topKeyDown":case"topKeyUp":a=ot;break;case"topBlur":case"topFocus":a=rt;break;case"topClick":if(2===n.button)return null;case"topDoubleClick":case"topMouseDown":case"topMouseMove":case"topMouseUp":case"topMouseOut":case"topMouseOver":case"topContextMenu":a=Ze;break;case"topDrag":case"topDragEnd":case"topDragEnter":case"topDragExit":case"topDragLeave":case"topDragOver":case"topDragStart":case"topDrop":a=at;break;case"topTouchCancel":case"topTouchEnd":case"topTouchMove":case"topTouchStart":a=it;break;case"topAnimationEnd":case"topAnimationIteration":case"topAnimationStart":a=tt;break;case"topTransitionEnd":a=lt;break;case"topScroll":a=Qe;break;case"topWheel":a=st;break;case"topCopy":case"topCut":case"topPaste":a=nt}return a||r("86",e),e=a.getPooled(o,t,n,u),hi.accumulateTwoPhaseDispatches(e),e}};En.setHandleTopLevel(Tn.handleTopLevel),Fn.injection.injectEventPluginOrder("ResponderEventPlugin SimpleEventPlugin TapEventPlugin EnterLeaveEventPlugin ChangeEventPlugin SelectEventPlugin BeforeInputEventPlugin".split(" ")),ln.injection.injectComponentTree(Gt),Fn.injection.injectEventPluginsByName({SimpleEventPlugin:tl,EnterLeaveEventPlugin:qi,ChangeEventPlugin:Ui,SelectEventPlugin:Qi,BeforeInputEventPlugin:Ni});var nl=It.injection.MUST_USE_PROPERTY,rl=It.injection.HAS_BOOLEAN_VALUE,ul=It.injection.HAS_NUMERIC_VALUE,ol=It.injection.HAS_POSITIVE_NUMERIC_VALUE,al=It.injection.HAS_STRING_BOOLEAN_VALUE,il={Properties:{allowFullScreen:rl,allowTransparency:al,async:rl,autoPlay:rl,capture:rl,checked:nl|rl,cols:ol,contentEditable:al,controls:rl,default:rl,defer:rl,disabled:rl,download:It.injection.HAS_OVERLOADED_BOOLEAN_VALUE,draggable:al,formNoValidate:rl,hidden:rl,loop:rl,multiple:nl|rl,muted:nl|rl,noValidate:rl,open:rl,playsInline:rl,readOnly:rl,required:rl,reversed:rl,rows:ol,rowSpan:ul,scoped:rl,seamless:rl,selected:nl|rl,size:ol,start:ul,span:ol,spellCheck:al,style:0,itemScope:rl,acceptCharset:0,className:0,htmlFor:0,httpEquiv:0,value:al},DOMAttributeNames:{acceptCharset:"accept-charset",className:"class",htmlFor:"for",httpEquiv:"http-equiv"},DOMMutationMethods:{value:function(e,t){if(null==t)return e.removeAttribute("value");"number"!==e.type||!1===e.hasAttribute("value")?e.setAttribute("value",""+t):e.validity&&!e.validity.badInput&&e.ownerDocument.activeElement!==e&&e.setAttribute("value",""+t)}}},ll=It.injection.HAS_STRING_BOOLEAN_VALUE,sl={xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace"},cl={Properties:{autoReverse:ll,externalResourcesRequired:ll,preserveAlpha:ll},DOMAttributeNames:{autoReverse:"autoReverse",externalResourcesRequired:"externalResourcesRequired",preserveAlpha:"preserveAlpha"},DOMAttributeNamespaces:{xlinkActuate:sl.xlink,xlinkArcrole:sl.xlink,xlinkHref:sl.xlink,xlinkRole:sl.xlink,xlinkShow:sl.xlink,xlinkTitle:sl.xlink,xlinkType:sl.xlink,xmlBase:sl.xml,xmlLang:sl.xml,xmlSpace:sl.xml}},pl=/[\\-\\:]([a-z])/g;"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode x-height xlink:actuate xlink:arcrole xlink:href xlink:role xlink:show xlink:title xlink:type xml:base xmlns:xlink xml:lang xml:space".split(" ").forEach(function(e){var t=e.replace(pl,ct);cl.Properties[t]=0,cl.DOMAttributeNames[t]=e}),It.injection.injectDOMPropertyConfig(il),It.injection.injectDOMPropertyConfig(cl);var fl=ta.injectInternals,dl=Lt.ELEMENT_NODE,Dl=Lt.TEXT_NODE,hl=Lt.COMMENT_NODE,gl=Lt.DOCUMENT_NODE,ml=Lt.DOCUMENT_FRAGMENT_NODE,Cl=It.ROOT_ATTRIBUTE_NAME,El=kt.getChildNamespace,Al=fr.createElement,Fl=fr.createTextNode,bl=fr.setInitialProperties,yl=fr.diffProperties,vl=fr.updateProperties,Bl=fr.diffHydratedProperties,wl=fr.diffHydratedText,kl=fr.warnForDeletedHydratableElement,xl=fr.warnForDeletedHydratableText,Tl=fr.warnForInsertedHydratedElement,Sl=fr.warnForInsertedHydratedText,Pl=Gt.precacheFiberNode,Nl=Gt.updateFiberProps;fn.injection.injectFiberControlledHostComponent(fr),Fe._injectFiber(function(e){return Il.findHostInstance(e)});var _l=null,Ol=null,Il=function(e){var t=e.getPublicInstance;e=de(e);var n=e.scheduleUpdate,r=e.getPriorityContext;return{createContainer:function(e){var t=pu();return e={current:t,containerInfo:e,isScheduled:!1,nextScheduledRoot:null,context:null,pendingContext:null},t.stateNode=e},updateContainer:function(e,t,u,o){var a=t.current;u=he(u),null===t.context?t.context=u:t.pendingContext=u,t=o,o=r(a,kr.enableAsyncSubtreeAPI&&null!=e&&null!=e.type&&null!=e.type.prototype&&!0===e.type.prototype.unstable_isAsyncReactComponent),e={element:e},Ja(a,e,void 0===t?null:t,o),n(a,o)},batchedUpdates:e.batchedUpdates,unbatchedUpdates:e.unbatchedUpdates,deferredUpdates:e.deferredUpdates,flushSync:e.flushSync,getPublicRootInstance:function(e){if(e=e.current,!e.child)return null;switch(e.child.tag){case ni:return t(e.child.stateNode);default:return e.child.stateNode}},findHostInstance:function(e){return e=ri(e),null===e?null:e.stateNode},findHostInstanceWithNoPortals:function(e){return e=ui(e),null===e?null:e.stateNode}}}({getRootHostContext:function(e){if(e.nodeType===gl)e=(e=e.documentElement)?e.namespaceURI:El(null,"");else{var t=e.nodeType===hl?e.parentNode:e;e=t.namespaceURI||null,t=t.tagName,e=El(e,t)}return e},getChildHostContext:function(e,t){return El(e,t)},getPublicInstance:function(e){return e},prepareForCommit:function(){_l=Tn.isEnabled(),Ol=ci.getSelectionInformation(),Tn.setEnabled(!1)},resetAfterCommit:function(){ci.restoreSelection(Ol),Ol=null,Tn.setEnabled(_l),_l=null},createInstance:function(e,t,n,r,u){return e=Al(e,t,n,r),Pl(u,e),Nl(e,t),e},appendInitialChild:function(e,t){e.appendChild(t)},finalizeInitialChildren:function(e,t,n,r){bl(e,t,n,r);e:{switch(t){case"button":case"input":case"select":case"textarea":e=!!n.autoFocus;break e}e=!1}return e},prepareUpdate:function(e,t,n,r,u){return yl(e,t,n,r,u)},commitMount:function(e){e.focus()},commitUpdate:function(e,t,n,r,u){Nl(e,u),vl(e,t,n,r,u)},shouldSetTextContent:function(e,t){return"textarea"===e||"string"===typeof t.children||"number"===typeof t.children||"object"===typeof t.dangerouslySetInnerHTML&&null!==t.dangerouslySetInnerHTML&&"string"===typeof t.dangerouslySetInnerHTML.__html},resetTextContent:function(e){e.textContent=""},shouldDeprioritizeSubtree:function(e,t){return!!t.hidden},createTextInstance:function(e,t,n,r){return e=Fl(e,t),Pl(r,e),e},commitTextUpdate:function(e,t,n){e.nodeValue=n},appendChild:function(e,t){e.appendChild(t)},appendChildToContainer:function(e,t){e.nodeType===hl?e.parentNode.insertBefore(t,e):e.appendChild(t)},insertBefore:function(e,t,n){e.insertBefore(t,n)},insertInContainerBefore:function(e,t,n){e.nodeType===hl?e.parentNode.insertBefore(t,n):e.insertBefore(t,n)},removeChild:function(e,t){e.removeChild(t)},removeChildFromContainer:function(e,t){e.nodeType===hl?e.parentNode.removeChild(t):e.removeChild(t)},canHydrateInstance:function(e,t){return e.nodeType===dl&&t===e.nodeName.toLowerCase()},canHydrateTextInstance:function(e,t){return""!==t&&e.nodeType===Dl},getNextHydratableSibling:function(e){for(e=e.nextSibling;e&&e.nodeType!==dl&&e.nodeType!==Dl;)e=e.nextSibling;return e},getFirstHydratableChild:function(e){for(e=e.firstChild;e&&e.nodeType!==dl&&e.nodeType!==Dl;)e=e.nextSibling;return e},hydrateInstance:function(e,t,n,r,u,o){return Pl(o,e),Nl(e,n),Bl(e,t,n,u,r)},hydrateTextInstance:function(e,t,n){return Pl(n,e),wl(e,t)},didNotHydrateInstance:function(e,t){1===t.nodeType?kl(e,t):xl(e,t)},didNotFindHydratableInstance:function(e,t,n){Tl(e,t,n)},didNotFindHydratableTextInstance:function(e,t){Sl(e,t)},scheduleDeferredCallback:wr.rIC,useSyncScheduling:!0});Dn.injection.injectFiberBatchedUpdates(Il.batchedUpdates);var Rl={createPortal:Dt,hydrate:function(e,t,n){return dt(null,e,t,!0,n)},render:function(e,t,n){return dt(null,e,t,!1,n)},unstable_renderSubtreeIntoContainer:function(e,t,n,u){return null!=e&&Yt.has(e)||r("38"),dt(e,t,n,!1,u)},unmountComponentAtNode:function(e){return pt(e)||r("40"),!!e._reactRootContainer&&(Il.unbatchedUpdates(function(){dt(null,null,e,!1,function(){e._reactRootContainer=null})}),!0)},findDOMNode:Fe,unstable_createPortal:Dt,unstable_batchedUpdates:Dn.batchedUpdates,unstable_deferredUpdates:Il.deferredUpdates,flushSync:Il.flushSync,__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:{EventPluginHub:Fn,EventPluginRegistry:Pt,EventPropagators:hi,ReactControlledComponent:fn,ReactDOMComponentTree:Gt,ReactDOMEventListener:En}};fl({findFiberByHostInstance:Gt.getClosestInstanceFromNode,findHostInstanceByFiber:Il.findHostInstance,bundleType:0,version:"16.0.0",rendererPackageName:"react-dom"}),e.exports=Rl},function(e,t,n){"use strict";var r=!("undefined"===typeof window||!window.document||!window.document.createElement),u={canUseDOM:r,canUseWorkers:"undefined"!==typeof Worker,canUseEventListeners:r&&!(!window.addEventListener&&!window.attachEvent),canUseViewport:r&&!!window.screen,isInWorker:!r};e.exports=u},function(e,t,n){"use strict";var r=n(3),u={listen:function(e,t,n){return e.addEventListener?(e.addEventListener(t,n,!1),{remove:function(){e.removeEventListener(t,n,!1)}}):e.attachEvent?(e.attachEvent("on"+t,n),{remove:function(){e.detachEvent("on"+t,n)}}):void 0},capture:function(e,t,n){return e.addEventListener?(e.addEventListener(t,n,!0),{remove:function(){e.removeEventListener(t,n,!0)}}):{remove:r}},registerDefault:function(){}};e.exports=u},function(e,t,n){"use strict";function r(e,t){return e===t?0!==e||0!==t||1/e===1/t:e!==e&&t!==t}function u(e,t){if(r(e,t))return!0;if("object"!==typeof e||null===e||"object"!==typeof t||null===t)return!1;var n=Object.keys(e),u=Object.keys(t);if(n.length!==u.length)return!1;for(var a=0;a<n.length;a++)if(!o.call(t,n[a])||!r(e[n[a]],t[n[a]]))return!1;return!0}var o=Object.prototype.hasOwnProperty;e.exports=u},function(e,t,n){"use strict";function r(e,t){return!(!e||!t)&&(e===t||!u(e)&&(u(t)?r(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}var u=n(31);e.exports=r},function(e,t,n){"use strict";function r(e){return u(e)&&3==e.nodeType}var u=n(32);e.exports=r},function(e,t,n){"use strict";function r(e){var t=e?e.ownerDocument||e:document,n=t.defaultView||window;return!(!e||!("function"===typeof n.Node?e instanceof n.Node:"object"===typeof e&&"number"===typeof e.nodeType&&"string"===typeof e.nodeName))}e.exports=r},function(e,t,n){"use strict";function r(e){try{e.focus()}catch(e){}}e.exports=r},function(e,t,n){"use strict";function r(e){if("undefined"===typeof(e=e||("undefined"!==typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}e.exports=r},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function u(e,t){if(!e)throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called");return!t||"object"!==typeof t&&"function"!==typeof t?e:t}function o(e,t){if("function"!==typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var a=n(0),i=n.n(a),l=n(7),s=n(8),c=n(9),p=n(10),f=n(11),d=n(39),D=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),h={cursor:"pointer"},g=function(e){function t(){return r(this,t),u(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return o(t,e),D(t,[{key:"render",value:function(){var e=this.props,t=e.error,n=e.editorHandler,r=Object(d.a)(t),u=null!==r&&null!==n;return i.a.createElement(l.a,null,i.a.createElement(c.a,{headerText:"Failed to compile"}),i.a.createElement("a",{onClick:u&&r?function(){return n(r)}:null,style:u?h:null},i.a.createElement(p.a,{main:!0,codeHTML:Object(f.a)(t)})),i.a.createElement(s.a,{line1:"This error occurred during the build time and cannot be dismissed."}))}}]),t}(a.PureComponent);t.a=g},function(e,t,n){e.exports={XmlEntities:n(37),Html4Entities:n(38),Html5Entities:n(13),AllHtmlEntities:n(13)}},function(e,t){function n(){}var r={"&lt":"<","&gt":">","&quot":\'"\',"&apos":"\'","&amp":"&","&lt;":"<","&gt;":">","&quot;":\'"\',"&apos;":"\'","&amp;":"&"},u={60:"lt",62:"gt",34:"quot",39:"apos",38:"amp"},o={"<":"&lt;",">":"&gt;",\'"\':"&quot;","\'":"&apos;","&":"&amp;"};n.prototype.encode=function(e){return e&&e.length?e.replace(/<|>|"|\'|&/g,function(e){return o[e]}):""},n.encode=function(e){return(new n).encode(e)},n.prototype.decode=function(e){return e&&e.length?e.replace(/&#?[0-9a-zA-Z]+;?/g,function(e){if("#"===e.charAt(1)){var t="x"===e.charAt(2).toLowerCase()?parseInt(e.substr(3),16):parseInt(e.substr(2));return isNaN(t)||t<-32768||t>65535?"":String.fromCharCode(t)}return r[e]||e}):""},n.decode=function(e){return(new n).decode(e)},n.prototype.encodeNonUTF=function(e){if(!e||!e.length)return"";for(var t=e.length,n="",r=0;r<t;){var o=e.charCodeAt(r),a=u[o];a?(n+="&"+a+";",r++):(n+=o<32||o>126?"&#"+o+";":e.charAt(r),r++)}return n},n.encodeNonUTF=function(e){return(new n).encodeNonUTF(e)},n.prototype.encodeNonASCII=function(e){if(!e||!e.length)return"";for(var t=e.length,n="",r=0;r<t;){var u=e.charCodeAt(r);u<=255?n+=e[r++]:(n+="&#"+u+";",r++)}return n},n.encodeNonASCII=function(e){return(new n).encodeNonASCII(e)},e.exports=n},function(e,t){function n(){}for(var r=["apos","nbsp","iexcl","cent","pound","curren","yen","brvbar","sect","uml","copy","ordf","laquo","not","shy","reg","macr","deg","plusmn","sup2","sup3","acute","micro","para","middot","cedil","sup1","ordm","raquo","frac14","frac12","frac34","iquest","Agrave","Aacute","Acirc","Atilde","Auml","Aring","Aelig","Ccedil","Egrave","Eacute","Ecirc","Euml","Igrave","Iacute","Icirc","Iuml","ETH","Ntilde","Ograve","Oacute","Ocirc","Otilde","Ouml","times","Oslash","Ugrave","Uacute","Ucirc","Uuml","Yacute","THORN","szlig","agrave","aacute","acirc","atilde","auml","aring","aelig","ccedil","egrave","eacute","ecirc","euml","igrave","iacute","icirc","iuml","eth","ntilde","ograve","oacute","ocirc","otilde","ouml","divide","oslash","ugrave","uacute","ucirc","uuml","yacute","thorn","yuml","quot","amp","lt","gt","OElig","oelig","Scaron","scaron","Yuml","circ","tilde","ensp","emsp","thinsp","zwnj","zwj","lrm","rlm","ndash","mdash","lsquo","rsquo","sbquo","ldquo","rdquo","bdquo","dagger","Dagger","permil","lsaquo","rsaquo","euro","fnof","Alpha","Beta","Gamma","Delta","Epsilon","Zeta","Eta","Theta","Iota","Kappa","Lambda","Mu","Nu","Xi","Omicron","Pi","Rho","Sigma","Tau","Upsilon","Phi","Chi","Psi","Omega","alpha","beta","gamma","delta","epsilon","zeta","eta","theta","iota","kappa","lambda","mu","nu","xi","omicron","pi","rho","sigmaf","sigma","tau","upsilon","phi","chi","psi","omega","thetasym","upsih","piv","bull","hellip","prime","Prime","oline","frasl","weierp","image","real","trade","alefsym","larr","uarr","rarr","darr","harr","crarr","lArr","uArr","rArr","dArr","hArr","forall","part","exist","empty","nabla","isin","notin","ni","prod","sum","minus","lowast","radic","prop","infin","ang","and","or","cap","cup","int","there4","sim","cong","asymp","ne","equiv","le","ge","sub","sup","nsub","sube","supe","oplus","otimes","perp","sdot","lceil","rceil","lfloor","rfloor","lang","rang","loz","spades","clubs","hearts","diams"],u=[39,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,34,38,60,62,338,339,352,353,376,710,732,8194,8195,8201,8204,8205,8206,8207,8211,8212,8216,8217,8218,8220,8221,8222,8224,8225,8240,8249,8250,8364,402,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,977,978,982,8226,8230,8242,8243,8254,8260,8472,8465,8476,8482,8501,8592,8593,8594,8595,8596,8629,8656,8657,8658,8659,8660,8704,8706,8707,8709,8711,8712,8713,8715,8719,8721,8722,8727,8730,8733,8734,8736,8743,8744,8745,8746,8747,8756,8764,8773,8776,8800,8801,8804,8805,8834,8835,8836,8838,8839,8853,8855,8869,8901,8968,8969,8970,8971,9001,9002,9674,9824,9827,9829,9830],o={},a={},i=0,l=r.length;i<l;){var s=r[i],c=u[i];o[s]=String.fromCharCode(c),a[c]=s,i++}n.prototype.decode=function(e){return e&&e.length?e.replace(/&(#?[\\w\\d]+);?/g,function(e,t){var n;if("#"===t.charAt(0)){var r="x"===t.charAt(1).toLowerCase()?parseInt(t.substr(2),16):parseInt(t.substr(1));isNaN(r)||r<-32768||r>65535||(n=String.fromCharCode(r))}else n=o[t];return n||e}):""},n.decode=function(e){return(new n).decode(e)},n.prototype.encode=function(e){if(!e||!e.length)return"";for(var t=e.length,n="",r=0;r<t;){var u=a[e.charCodeAt(r)];n+=u?"&"+u+";":e.charAt(r),r++}return n},n.encode=function(e){return(new n).encode(e)},n.prototype.encodeNonUTF=function(e){if(!e||!e.length)return"";for(var t=e.length,n="",r=0;r<t;){var u=e.charCodeAt(r),o=a[u];n+=o?"&"+o+";":u<32||u>126?"&#"+u+";":e.charAt(r),r++}return n},n.encodeNonUTF=function(e){return(new n).encodeNonUTF(e)},n.prototype.encodeNonASCII=function(e){if(!e||!e.length)return"";for(var t=e.length,n="",r=0;r<t;){var u=e.charCodeAt(r);u<=255?n+=e[r++]:(n+="&#"+u+";",r++)}return n},n.encodeNonASCII=function(e){return(new n).encodeNonASCII(e)},e.exports=n},function(e,t,n){"use strict";function r(e){for(var t=e.split("\\n"),n="",r=0,u=0;u<t.length;u++){var l=o.a.ansiToText(t[u]).trim();if(l){!n&&l.match(a)&&(n=l);for(var s=0;s<i.length;){var c=l.match(i[s]);if(c){r=parseInt(c[1],10);break}s++}if(n&&r)break}}return n&&r?{fileName:n,lineNumber:r}:null}var u=n(12),o=n.n(u),a=/^\\.(\\/[^\\/\\n ]+)+\\.[^\\/\\n ]+$/,i=[/^.*\\((\\d+):(\\d+)\\)$/,/^Line (\\d+):.+$/];t.a=r},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function u(e,t){if(!e)throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called");return!t||"object"!==typeof t&&"function"!==typeof t?e:t}function o(e,t){if("function"!==typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var a=n(0),i=n.n(a),l=n(7),s=n(41),c=n(42),p=n(43),f=n(8),d=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),D=function(e){function t(){var e,n,o,a;r(this,t);for(var i=arguments.length,l=Array(i),s=0;s<i;s++)l[s]=arguments[s];return n=o=u(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(l))),o.state={currentIndex:0},o.previous=function(){o.setState(function(e,t){return{currentIndex:e.currentIndex>0?e.currentIndex-1:t.errorRecords.length-1}})},o.next=function(){o.setState(function(e,t){return{currentIndex:e.currentIndex<t.errorRecords.length-1?e.currentIndex+1:0}})},o.shortcutHandler=function(e){"Escape"===e?o.props.close():"ArrowLeft"===e?o.previous():"ArrowRight"===e&&o.next()},a=n,u(o,a)}return o(t,e),d(t,[{key:"render",value:function(){var e=this.props,t=e.errorRecords,n=e.close,r=t.length;return i.a.createElement(l.a,{shortcutHandler:this.shortcutHandler},i.a.createElement(s.a,{close:n}),r>1&&i.a.createElement(c.a,{currentError:this.state.currentIndex+1,totalErrors:r,previous:this.previous,next:this.next}),i.a.createElement(p.a,{errorRecord:t[this.state.currentIndex],editorHandler:this.props.editorHandler}),i.a.createElement(f.a,{line1:"This screen is visible only in development. It will not appear if the app crashes in production.",line2:"Open your browser’s developer console to further inspect this error."}))}}]),t}(a.PureComponent);t.a=D},function(e,t,n){"use strict";function r(e){var t=e.close;return o.a.createElement("span",{title:"Click or press Escape to dismiss.",onClick:t,style:i},"×")}var u=n(0),o=n.n(u),a=n(1),i={color:a.a,lineHeight:"1rem",fontSize:"1.5rem",padding:"1rem",cursor:"pointer",position:"absolute",right:0,top:0};t.a=r},function(e,t,n){"use strict";function r(e){var t=e.currentError,n=e.totalErrors,r=e.previous,u=e.next;return o.a.createElement("div",{style:i},o.a.createElement("span",{style:l},o.a.createElement("button",{onClick:r,style:c},"←"),o.a.createElement("button",{onClick:u,style:p},"→")),t+" of "+n+" errors on the page")}var u=n(0),o=n.n(u),a=n(1),i={marginBottom:"0.5rem"},l={marginRight:"1em"},s={backgroundColor:a.f,color:a.e,border:"none",borderRadius:"4px",padding:"3px 6px",cursor:"pointer"},c=Object.assign({},s,{borderTopRightRadius:"0px",borderBottomRightRadius:"0px",marginRight:"1px"}),p=Object.assign({},s,{borderTopLeftRadius:"0px",borderBottomLeftRadius:"0px"});t.a=r},function(e,t,n){"use strict";function r(e){var t=e.errorRecord,n=e.editorHandler,r=t.error,u=t.unhandledRejection,s=t.contextSize,c=t.stackFrames,p=u?"Unhandled Rejection ("+r.name+")":r.name,f=r.message,d=f.match(/^\\w*:/)||!p?f:p+": "+f;return d=d.replace(/^Invariant Violation:\\s*/,"").replace(/^Warning:\\s*/,"").replace(" Check the render method","\\n\\nCheck the render method").replace(" Check your code at","\\n\\nCheck your code at"),o.a.createElement("div",{style:l},o.a.createElement(a.a,{headerText:d}),o.a.createElement(i.a,{stackFrames:c,errorName:p,contextSize:s,editorHandler:n}))}var u=n(0),o=n.n(u),a=n(9),i=n(44),l={display:"flex",flexDirection:"column"};t.a=r},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function u(e,t){if(!e)throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called");return!t||"object"!==typeof t&&"function"!==typeof t?e:t}function o(e,t){if("function"!==typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var a=n(0),i=n.n(a),l=n(45),s=n(61),c=n(62),p=n(63),f=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),d={fontSize:"1em",flex:"0 1 auto",minHeight:"0px",overflow:"auto"},D=function(e){function t(){return r(this,t),u(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return o(t,e),f(t,[{key:"renderFrames",value:function(){var e=this.props,t=e.stackFrames,n=e.errorName,r=e.contextSize,u=e.editorHandler,o=[],a=!1,f=[],d=0;return t.forEach(function(e,D){var h=e.fileName,g=e._originalFileName,m=Object(c.a)(g,h),C=!Object(p.a)(n),E=m&&(C||a);m||(a=!0);var A=i.a.createElement(l.a,{key:"frame-"+D,frame:e,contextSize:r,critical:0===D,showCode:!E,editorHandler:u}),F=D===t.length-1;E&&f.push(A),E&&!F||(1===f.length?o.push(f[0]):f.length>1&&(d++,o.push(i.a.createElement(s.a,{key:"bundle-"+d},f))),f=[]),E||o.push(A)}),o}},{key:"render",value:function(){return i.a.createElement("div",{style:d},this.renderFrames())}}]),t}(a.Component);t.a=D},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function u(e,t){if(!e)throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called");return!t||"object"!==typeof t&&"function"!==typeof t?e:t}function o(e,t){if("function"!==typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var a=n(0),i=n.n(a),l=n(46),s=n(60),c=n(1),p=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),f={fontSize:"0.9em",marginBottom:"0.9em"},d={textDecoration:"none",color:c.b,cursor:"pointer"},D={cursor:"pointer"},h={marginBottom:"1.5em",color:c.b,cursor:"pointer",border:"none",display:"block",width:"100%",textAlign:"left",background:"#fff",fontFamily:"Consolas, Menlo, monospace",fontSize:"1em",padding:"0px",lineHeight:"1.5"},g=function(e){function t(){var e,n,o,a;r(this,t);for(var i=arguments.length,l=Array(i),s=0;s<i;s++)l[s]=arguments[s];return n=o=u(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(l))),o.state={compiled:!1},o.toggleCompiled=function(){o.setState(function(e){return{compiled:!e.compiled}})},o.editorHandler=function(){var e=o.getErrorLocation();e&&o.props.editorHandler(e)},o.onKeyDown=function(e){"Enter"===e.key&&o.editorHandler()},a=n,u(o,a)}return o(t,e),p(t,[{key:"getErrorLocation",value:function(){var e=this.props.frame,t=e._originalFileName,n=e._originalLineNumber;return t?-1!==t.trim().indexOf(" ")?null:{fileName:t,lineNumber:n||1}:null}},{key:"render",value:function(){var e=this.props,t=e.frame,n=e.contextSize,r=e.critical,u=e.showCode,o=t.fileName,a=t.lineNumber,c=t.columnNumber,p=t._scriptCode,g=t._originalFileName,m=t._originalLineNumber,C=t._originalColumnNumber,E=t._originalScriptCode,A=t.getFunctionName(),F=this.state.compiled,b=Object(s.a)(g,m,C,o,a,c,F),y=null;u&&(F&&p&&0!==p.length&&null!=a?y={lines:p,lineNum:a,columnNum:c,contextSize:n,main:r}:!F&&E&&0!==E.length&&null!=m&&(y={lines:E,lineNum:m,columnNum:C,contextSize:n,main:r}));var v=null!==this.getErrorLocation()&&null!==this.props.editorHandler;return i.a.createElement("div",null,i.a.createElement("div",null,A),i.a.createElement("div",{style:f},i.a.createElement("a",{style:v?d:null,onClick:v?this.editorHandler:null,onKeyDown:v?this.onKeyDown:null,tabIndex:v?"0":null},b)),y&&i.a.createElement("span",null,i.a.createElement("a",{onClick:v?this.editorHandler:null,style:v?D:null},i.a.createElement(l.a,y)),i.a.createElement("button",{style:h,onClick:this.toggleCompiled},"View "+(F?"source":"compiled"))))}}]),t}(a.Component);t.a=g},function(e,t,n){"use strict";function r(e){var t=e.lines,n=e.lineNum,r=e.columnNum,u=e.contextSize,p=e.main,d=[],D=1/0;t.forEach(function(e){var t=e.content,n=t.match(/^\\s*/);""!==t&&(D=n&&n[0]?Math.min(D,n[0].length):0)}),t.forEach(function(e){var t=e.content,n=e.lineNumber;isFinite(D)&&(t=t.substring(D)),d[n-1]=t});var h=f()(d.join("\\n"),n,null==r?0:r-(isFinite(D)?D:0),{forceColor:!0,linesAbove:u,linesBelow:u}),g=Object(c.a)(h),m=document.createElement("code");m.innerHTML=g,Object(l.a)(m);var C=m.childNodes;e:for(var E=0;E<C.length;++E)for(var A=C[E],F=A.childNodes,b=0;b<F.length;++b){var y=F[b],v=y.innerText;if(null!=v&&-1!==v.indexOf(" "+n+" |")){Object(i.a)(A,p?s.d:s.g);break e}}return o.a.createElement(a.a,{main:p,codeHTML:m.innerHTML})}var u=n(0),o=n.n(u),a=n(10),i=n(14),l=n(47),s=n(1),c=n(11),p=n(48),f=n.n(p);t.a=r},function(e,t,n){"use strict";function r(e,t){for(;null!=t&&"br"!==t.tagName.toLowerCase();)t=t.nextElementSibling;null!=t&&e.removeChild(t)}function u(e){for(var t=e.childNodes,n=0;n<t.length;++n){var u=t[n];if("span"===u.tagName.toLowerCase()){var o=u.innerText;if(null!=o){"|^"===o.replace(/\\s/g,"")&&(u.style.position="absolute",r(e,u))}}}}n.d(t,"a",function(){return u})},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function u(e){return{keyword:e.cyan,capitalized:e.yellow,jsx_tag:e.yellow,punctuator:e.yellow,number:e.magenta,string:e.green,regex:e.magenta,comment:e.grey,invalid:e.white.bgRed.bold,gutter:e.grey,marker:e.red.bold}}function o(e){var t=e.slice(-2),n=t[0],r=t[1],u=(0,i.matchToToken)(e);if("name"===u.type){if(c.default.keyword.isReservedWordES6(u.value))return"keyword";if(D.test(u.value)&&("<"===r[n-1]||"</"==r.substr(n-2,2)))return"jsx_tag";if(u.value[0]!==u.value[0].toLowerCase())return"capitalized"}return"punctuator"===u.type&&h.test(u.value)?"bracket":u.type}function a(e,t){return t.replace(l.default,function(){for(var t=arguments.length,n=Array(t),r=0;r<t;r++)n[r]=arguments[r];var u=o(n),a=e[u];return a?n[0].split(d).map(function(e){return a(e)}).join("\\n"):n[0]})}t.__esModule=!0,t.default=function(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};n=Math.max(n,0);var o=r.highlightCode&&f.default.supportsColor||r.forceColor,i=f.default;r.forceColor&&(i=new f.default.constructor({enabled:!0}));var l=function(e,t){return o?e(t):t},s=u(i);o&&(e=a(s,e));var c=r.linesAbove||2,p=r.linesBelow||3,D=e.split(d),h=Math.max(t-(c+1),0),g=Math.min(D.length,t+p);t||n||(h=0,g=D.length);var m=String(g).length,C=D.slice(h,g).map(function(e,r){var u=h+1+r,o=(" "+u).slice(-m),a=" "+o+" | ";if(u===t){var i="";if(n){var c=e.slice(0,n-1).replace(/[^\\t]/g," ");i=["\\n ",l(s.gutter,a.replace(/\\d/g," ")),c,l(s.marker,"^")].join("")}return[l(s.marker,">"),l(s.gutter,a),e,i].join("")}return" "+l(s.gutter,a)+e}).join("\\n");return o?i.reset(C):C};var i=n(49),l=r(i),s=n(50),c=r(s),p=n(53),f=r(p),d=/\\r\\n|[\\n\\r\\u2028\\u2029]/,D=/^[a-z][\\w-]*$/i,h=/^[()\\[\\]{}]$/;e.exports=t.default},function(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.default=/(([\'"])(?:(?!\\2|\\\\).|\\\\(?:\\r\\n|[\\s\\S]))*(\\2)?|`(?:[^`\\\\$]|\\\\[\\s\\S]|\\$(?!\\{)|\\$\\{(?:[^{}]|\\{[^}]*\\}?)*\\}?)*(`)?)|(\\/\\/.*)|(\\/\\*(?:[^*]|\\*(?!\\/))*(\\*\\/)?)|(\\/(?!\\*)(?:\\[(?:(?![\\]\\\\]).|\\\\.)*\\]|(?![\\/\\]\\\\]).|\\\\.)+\\/(?:(?!\\s*(?:\\b|[\\u0080-\\uFFFF$\\\\\'"~({]|[+\\-!](?!=)|\\.?\\d))|[gmiyu]{1,5}\\b(?![\\u0080-\\uFFFF$\\\\]|\\s*(?:[+\\-*%&|^<>!=?({]|\\/(?![\\/*])))))|(0[xX][\\da-fA-F]+|0[oO][0-7]+|0[bB][01]+|(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][+-]?\\d+)?)|((?!\\d)(?:(?!\\s)[$\\w\\u0080-\\uFFFF]|\\\\u[\\da-fA-F]{4}|\\\\u\\{[\\da-fA-F]+\\})+)|(--|\\+\\+|&&|\\|\\||=>|\\.{3}|(?:[+\\-\\/%&|^]|\\*{1,2}|<{1,2}|>{1,3}|!=?|={1,2})=?|[?~.,:;[\\](){}])|(\\s+)|(^$|[\\s\\S])/g,t.matchToToken=function(e){var t={type:"invalid",value:e[0]};return e[1]?(t.type="string",t.closed=!(!e[3]&&!e[4])):e[5]?t.type="comment":e[6]?(t.type="comment",t.closed=!!e[7]):e[8]?t.type="regex":e[9]?t.type="number":e[10]?t.type="name":e[11]?t.type="punctuator":e[12]&&(t.type="whitespace"),t}},function(e,t,n){!function(){"use strict";t.ast=n(51),t.code=n(15),t.keyword=n(52)}()},function(e,t){!function(){"use strict";function t(e){if(null==e)return!1;switch(e.type){case"ArrayExpression":case"AssignmentExpression":case"BinaryExpression":case"CallExpression":case"ConditionalExpression":case"FunctionExpression":case"Identifier":case"Literal":case"LogicalExpression":case"MemberExpression":case"NewExpression":case"ObjectExpression":case"SequenceExpression":case"ThisExpression":case"UnaryExpression":case"UpdateExpression":return!0}return!1}function n(e){if(null==e)return!1;switch(e.type){case"DoWhileStatement":case"ForInStatement":case"ForStatement":case"WhileStatement":return!0}return!1}function r(e){if(null==e)return!1;switch(e.type){case"BlockStatement":case"BreakStatement":case"ContinueStatement":case"DebuggerStatement":case"DoWhileStatement":case"EmptyStatement":case"ExpressionStatement":case"ForInStatement":case"ForStatement":case"IfStatement":case"LabeledStatement":case"ReturnStatement":case"SwitchStatement":case"ThrowStatement":case"TryStatement":case"VariableDeclaration":case"WhileStatement":case"WithStatement":return!0}return!1}function u(e){return r(e)||null!=e&&"FunctionDeclaration"===e.type}function o(e){switch(e.type){case"IfStatement":return null!=e.alternate?e.alternate:e.consequent;case"LabeledStatement":case"ForStatement":case"ForInStatement":case"WhileStatement":case"WithStatement":return e.body}return null}function a(e){var t;if("IfStatement"!==e.type)return!1;if(null==e.alternate)return!1;t=e.consequent;do{if("IfStatement"===t.type&&null==t.alternate)return!0;t=o(t)}while(t);return!1}e.exports={isExpression:t,isStatement:r,isIterationStatement:n,isSourceElement:u,isProblematicIfStatement:a,trailingStatement:o}}()},function(e,t,n){!function(){"use strict";function t(e){switch(e){case"implements":case"interface":case"package":case"private":case"protected":case"public":case"static":case"let":return!0;default:return!1}}function r(e,t){return!(!t&&"yield"===e)&&u(e,t)}function u(e,n){if(n&&t(e))return!0;switch(e.length){case 2:return"if"===e||"in"===e||"do"===e;case 3:return"var"===e||"for"===e||"new"===e||"try"===e;case 4:return"this"===e||"else"===e||"case"===e||"void"===e||"with"===e||"enum"===e;case 5:return"while"===e||"break"===e||"catch"===e||"throw"===e||"const"===e||"yield"===e||"class"===e||"super"===e;case 6:return"return"===e||"typeof"===e||"delete"===e||"switch"===e||"export"===e||"import"===e;case 7:return"default"===e||"finally"===e||"extends"===e;case 8:return"function"===e||"continue"===e||"debugger"===e;case 10:return"instanceof"===e;default:return!1}}function o(e,t){return"null"===e||"true"===e||"false"===e||r(e,t)}function a(e,t){return"null"===e||"true"===e||"false"===e||u(e,t)}function i(e){return"eval"===e||"arguments"===e}function l(e){var t,n,r;if(0===e.length)return!1;if(r=e.charCodeAt(0),!d.isIdentifierStartES5(r))return!1;for(t=1,n=e.length;t<n;++t)if(r=e.charCodeAt(t),!d.isIdentifierPartES5(r))return!1;return!0}function s(e,t){return 1024*(e-55296)+(t-56320)+65536}function c(e){var t,n,r,u,o;if(0===e.length)return!1;for(o=d.isIdentifierStartES6,t=0,n=e.length;t<n;++t){if(55296<=(r=e.charCodeAt(t))&&r<=56319){if(++t>=n)return!1;if(!(56320<=(u=e.charCodeAt(t))&&u<=57343))return!1;r=s(r,u)}if(!o(r))return!1;o=d.isIdentifierPartES6}return!0}function p(e,t){return l(e)&&!o(e,t)}function f(e,t){return c(e)&&!a(e,t)}var d=n(15);e.exports={isKeywordES5:r,isKeywordES6:u,isReservedWordES5:o,isReservedWordES6:a,isRestrictedWord:i,isIdentifierNameES5:l,isIdentifierNameES6:c,isIdentifierES5:p,isIdentifierES6:f}}()},function(e,t,n){"use strict";(function(t){function r(e){this.enabled=e&&void 0!==e.enabled?e.enabled:c}function u(e){var t=function(){return o.apply(t,arguments)};return t._styles=e,t.enabled=this.enabled,t.__proto__=D,t}function o(){var e=arguments,t=e.length,n=0!==t&&String(arguments[0]);if(t>1)for(var r=1;r<t;r++)n+=" "+e[r];if(!this.enabled||!n)return n;var u=this._styles,o=u.length,a=i.dim.open;for(!f||-1===u.indexOf("gray")&&-1===u.indexOf("grey")||(i.dim.open="");o--;){var l=i[u[o]];n=l.open+n.replace(l.closeRe,l.open)+l.close}return i.dim.open=a,n}var a=n(54),i=n(55),l=n(57),s=n(58),c=n(59),p=Object.defineProperties,f="win32"===t.platform&&!/^xterm/i.test(Object({NODE_ENV:"production"}).TERM);f&&(i.blue.open="\u001b[94m");var d=function(){var e={};return Object.keys(i).forEach(function(t){i[t].closeRe=new RegExp(a(i[t].close),"g"),e[t]={get:function(){return u.call(this,this._styles.concat(t))}}}),e}(),D=p(function(){},d);p(r.prototype,function(){var e={};return Object.keys(d).forEach(function(t){e[t]={get:function(){return u.call(this,[t])}}}),e}()),e.exports=new r,e.exports.styles=i,e.exports.hasColor=s,e.exports.stripColor=l,e.exports.supportsColor=c}).call(t,n(16))},function(e,t,n){"use strict";var r=/[|\\\\{}()[\\]^$+*?.]/g;e.exports=function(e){if("string"!==typeof e)throw new TypeError("Expected a string");return e.replace(r,"\\\\$&")}},function(e,t,n){"use strict";(function(e){function t(){var e={modifiers:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},colors:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],gray:[90,39]},bgColors:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49]}};return e.colors.grey=e.colors.gray,Object.keys(e).forEach(function(t){var n=e[t];Object.keys(n).forEach(function(t){var r=n[t];e[t]=n[t]={open:"\u001b["+r[0]+"m",close:"\u001b["+r[1]+"m"}}),Object.defineProperty(e,t,{value:n,enumerable:!1})}),e}Object.defineProperty(e,"exports",{enumerable:!0,get:t})}).call(t,n(56)(e))},function(e,t){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,"loaded",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,"id",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}},function(e,t,n){"use strict";var r=n(17)();e.exports=function(e){return"string"===typeof e?e.replace(r,""):e}},function(e,t,n){"use strict";var r=n(17),u=new RegExp(r().source);e.exports=u.test.bind(u)},function(e,t,n){"use strict";(function(t){var n=t.argv,r=n.indexOf("--"),u=function(e){e="--"+e;var t=n.indexOf(e);return-1!==t&&(-1===r||t<r)};e.exports=function(){return"FORCE_COLOR"in Object({NODE_ENV:"production"})||!(u("no-color")||u("no-colors")||u("color=false"))&&(!!(u("color")||u("colors")||u("color=true")||u("color=always"))||!(t.stdout&&!t.stdout.isTTY)&&("win32"===t.platform||("COLORTERM"in Object({NODE_ENV:"production"})||"dumb"!==Object({NODE_ENV:"production"}).TERM&&!!/^screen|^xterm|^vt100|color|ansi|cygwin|linux/i.test(Object({NODE_ENV:"production"}).TERM))))}()}).call(t,n(16))},function(e,t,n){"use strict";function r(e,t,n,r,u,o,a){var i=void 0;if(!a&&e&&"number"===typeof t){var l=/^[\\/|\\\\].*?[\\/|\\\\]((src|node_modules)[\\/|\\\\].*)/.exec(e);i=l&&l[1]?l[1]:e,i+=":"+t,n&&(i+=":"+n)}else r&&"number"===typeof u?(i=r+":"+u,o&&(i+=":"+o)):i="unknown";return i.replace("webpack://",".")}n.d(t,"a",function(){return r})},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function u(e,t){if(!e)throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called");return!t||"object"!==typeof t&&"function"!==typeof t?e:t}function o(e,t){if("function"!==typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var a=n(0),i=n.n(a),l=n(1),s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),c={color:l.a,cursor:"pointer",border:"none",display:"block",width:"100%",textAlign:"left",background:"#fff",fontFamily:"Consolas, Menlo, monospace",fontSize:"1em",padding:"0px",lineHeight:"1.5"},p=Object.assign({},c,{marginBottom:"1.5em"}),f=Object.assign({},c,{marginBottom:"0.6em"}),d=function(e){function t(){var e,n,o,a;r(this,t);for(var i=arguments.length,l=Array(i),s=0;s<i;s++)l[s]=arguments[s];return n=o=u(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(l))),o.state={collapsed:!0},o.toggleCollaped=function(){o.setState(function(e){return{collapsed:!e.collapsed}})},a=n,u(o,a)}return o(t,e),s(t,[{key:"render",value:function(){var e=this.props.children.length,t=this.state.collapsed;return i.a.createElement("div",null,i.a.createElement("button",{onClick:this.toggleCollaped,style:t?p:f},(t?"▶":"▼")+" "+e+" stack frames were "+(t?"collapsed.":"expanded.")),i.a.createElement("div",{style:{display:t?"none":"block"}},this.props.children,i.a.createElement("button",{onClick:this.toggleCollaped,style:f},"▲ "+e+" stack frames were expanded.")))}}]),t}(a.Component);t.a=d},function(e,t,n){"use strict";function r(e,t){return null==e||""===e||-1!==e.indexOf("/~/")||-1!==e.indexOf("/node_modules/")||-1!==e.trim().indexOf(" ")||null==t||""===t}n.d(t,"a",function(){return r})},function(e,t,n){"use strict";function r(e){switch(e){case"EvalError":case"InternalError":case"RangeError":case"ReferenceError":case"SyntaxError":case"TypeError":case"URIError":return!0;default:return!1}}n.d(t,"a",function(){return r})}]);';
+
+ /***/
+ }
+ /******/
+ ]
+ );
+ });
+
+ /***/
+ },
+
+ /***/ "./node_modules/react-scripts/config/polyfills.js":
+ /*!********************************************************!*\
+ !*** ./node_modules/react-scripts/config/polyfills.js ***!
+ \********************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ // @remove-on-eject-begin
+ /**
+ * Copyright (c) 2015-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+ // @remove-on-eject-end
+
+ if (typeof Promise === "undefined") {
+ // Rejection tracking prevents a common issue where React gets into an
+ // inconsistent state due to an error, but it gets swallowed by a Promise,
+ // and the user has no idea what causes React's erratic future behavior.
+ __webpack_require__(
+ /*! promise/lib/rejection-tracking */ "./node_modules/react-scripts/node_modules/promise/lib/rejection-tracking.js"
+ ).enable();
+ window.Promise = __webpack_require__(
+ /*! promise/lib/es6-extensions.js */ "./node_modules/react-scripts/node_modules/promise/lib/es6-extensions.js"
+ );
+ }
+
+ // fetch() polyfill for making API calls.
+ __webpack_require__(
+ /*! whatwg-fetch */ "./node_modules/whatwg-fetch/fetch.js"
+ );
+
+ // Object.assign() is commonly used with React.
+ // It will use the native implementation if it's present and isn't buggy.
+ Object.assign = __webpack_require__(
+ /*! object-assign */ "./node_modules/object-assign/index.js"
+ );
+
+ // In tests, polyfill requestAnimationFrame since jsdom doesn't provide it yet.
+ // We don't polyfill it in the browser--this is user's responsibility.
+ if (false) {
+ require("raf").polyfill(global);
+ }
+
+ /***/
+ },
+
+ /***/ "./node_modules/react-scripts/node_modules/promise/lib/core.js":
+ /*!*********************************************************************!*\
+ !*** ./node_modules/react-scripts/node_modules/promise/lib/core.js ***!
+ \*********************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ var asap = __webpack_require__(
+ /*! asap/raw */ "./node_modules/asap/browser-raw.js"
+ );
+
+ function noop() {}
+
+ // States:
+ //
+ // 0 - pending
+ // 1 - fulfilled with _value
+ // 2 - rejected with _value
+ // 3 - adopted the state of another promise, _value
+ //
+ // once the state is no longer pending (0) it is immutable
+
+ // All `_` prefixed properties will be reduced to `_{random number}`
+ // at build time to obfuscate them and discourage their use.
+ // We don't use symbols or Object.defineProperty to fully hide them
+ // because the performance isn't good enough.
+
+ // to avoid using try/catch inside critical functions, we
+ // extract them to here.
+ var LAST_ERROR = null;
+ var IS_ERROR = {};
+ function getThen(obj) {
+ try {
+ return obj.then;
+ } catch (ex) {
+ LAST_ERROR = ex;
+ return IS_ERROR;
+ }
+ }
+
+ function tryCallOne(fn, a) {
+ try {
+ return fn(a);
+ } catch (ex) {
+ LAST_ERROR = ex;
+ return IS_ERROR;
+ }
+ }
+ function tryCallTwo(fn, a, b) {
+ try {
+ fn(a, b);
+ } catch (ex) {
+ LAST_ERROR = ex;
+ return IS_ERROR;
+ }
+ }
+
+ module.exports = Promise;
+
+ function Promise(fn) {
+ if (typeof this !== "object") {
+ throw new TypeError("Promises must be constructed via new");
+ }
+ if (typeof fn !== "function") {
+ throw new TypeError(
+ "Promise constructor's argument is not a function"
+ );
+ }
+ this._75 = 0;
+ this._83 = 0;
+ this._18 = null;
+ this._38 = null;
+ if (fn === noop) return;
+ doResolve(fn, this);
+ }
+ Promise._47 = null;
+ Promise._71 = null;
+ Promise._44 = noop;
+
+ Promise.prototype.then = function(onFulfilled, onRejected) {
+ if (this.constructor !== Promise) {
+ return safeThen(this, onFulfilled, onRejected);
+ }
+ var res = new Promise(noop);
+ handle(this, new Handler(onFulfilled, onRejected, res));
+ return res;
+ };
+
+ function safeThen(self, onFulfilled, onRejected) {
+ return new self.constructor(function(resolve, reject) {
+ var res = new Promise(noop);
+ res.then(resolve, reject);
+ handle(self, new Handler(onFulfilled, onRejected, res));
+ });
+ }
+ function handle(self, deferred) {
+ while (self._83 === 3) {
+ self = self._18;
+ }
+ if (Promise._47) {
+ Promise._47(self);
+ }
+ if (self._83 === 0) {
+ if (self._75 === 0) {
+ self._75 = 1;
+ self._38 = deferred;
+ return;
+ }
+ if (self._75 === 1) {
+ self._75 = 2;
+ self._38 = [self._38, deferred];
+ return;
+ }
+ self._38.push(deferred);
+ return;
+ }
+ handleResolved(self, deferred);
+ }
+
+ function handleResolved(self, deferred) {
+ asap(function() {
+ var cb =
+ self._83 === 1 ? deferred.onFulfilled : deferred.onRejected;
+ if (cb === null) {
+ if (self._83 === 1) {
+ resolve(deferred.promise, self._18);
+ } else {
+ reject(deferred.promise, self._18);
+ }
+ return;
+ }
+ var ret = tryCallOne(cb, self._18);
+ if (ret === IS_ERROR) {
+ reject(deferred.promise, LAST_ERROR);
+ } else {
+ resolve(deferred.promise, ret);
+ }
+ });
+ }
+ function resolve(self, newValue) {
+ // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure
+ if (newValue === self) {
+ return reject(
+ self,
+ new TypeError("A promise cannot be resolved with itself.")
+ );
+ }
+ if (
+ newValue &&
+ (typeof newValue === "object" || typeof newValue === "function")
+ ) {
+ var then = getThen(newValue);
+ if (then === IS_ERROR) {
+ return reject(self, LAST_ERROR);
+ }
+ if (then === self.then && newValue instanceof Promise) {
+ self._83 = 3;
+ self._18 = newValue;
+ finale(self);
+ return;
+ } else if (typeof then === "function") {
+ doResolve(then.bind(newValue), self);
+ return;
+ }
+ }
+ self._83 = 1;
+ self._18 = newValue;
+ finale(self);
+ }
+
+ function reject(self, newValue) {
+ self._83 = 2;
+ self._18 = newValue;
+ if (Promise._71) {
+ Promise._71(self, newValue);
+ }
+ finale(self);
+ }
+ function finale(self) {
+ if (self._75 === 1) {
+ handle(self, self._38);
+ self._38 = null;
+ }
+ if (self._75 === 2) {
+ for (var i = 0; i < self._38.length; i++) {
+ handle(self, self._38[i]);
+ }
+ self._38 = null;
+ }
+ }
+
+ function Handler(onFulfilled, onRejected, promise) {
+ this.onFulfilled =
+ typeof onFulfilled === "function" ? onFulfilled : null;
+ this.onRejected =
+ typeof onRejected === "function" ? onRejected : null;
+ this.promise = promise;
+ }
+
+ /**
+ * Take a potentially misbehaving resolver function and make sure
+ * onFulfilled and onRejected are only called once.
+ *
+ * Makes no guarantees about asynchrony.
+ */
+ function doResolve(fn, promise) {
+ var done = false;
+ var res = tryCallTwo(
+ fn,
+ function(value) {
+ if (done) return;
+ done = true;
+ resolve(promise, value);
+ },
+ function(reason) {
+ if (done) return;
+ done = true;
+ reject(promise, reason);
+ }
+ );
+ if (!done && res === IS_ERROR) {
+ done = true;
+ reject(promise, LAST_ERROR);
+ }
+ }
+
+ /***/
+ },
+
+ /***/ "./node_modules/react-scripts/node_modules/promise/lib/es6-extensions.js":
+ /*!*******************************************************************************!*\
+ !*** ./node_modules/react-scripts/node_modules/promise/lib/es6-extensions.js ***!
+ \*******************************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ //This file contains the ES6 extensions to the core Promises/A+ API
+
+ var Promise = __webpack_require__(
+ /*! ./core.js */ "./node_modules/react-scripts/node_modules/promise/lib/core.js"
+ );
+
+ module.exports = Promise;
+
+ /* Static Functions */
+
+ var TRUE = valuePromise(true);
+ var FALSE = valuePromise(false);
+ var NULL = valuePromise(null);
+ var UNDEFINED = valuePromise(undefined);
+ var ZERO = valuePromise(0);
+ var EMPTYSTRING = valuePromise("");
+
+ function valuePromise(value) {
+ var p = new Promise(Promise._44);
+ p._83 = 1;
+ p._18 = value;
+ return p;
+ }
+ Promise.resolve = function(value) {
+ if (value instanceof Promise) return value;
+
+ if (value === null) return NULL;
+ if (value === undefined) return UNDEFINED;
+ if (value === true) return TRUE;
+ if (value === false) return FALSE;
+ if (value === 0) return ZERO;
+ if (value === "") return EMPTYSTRING;
+
+ if (typeof value === "object" || typeof value === "function") {
+ try {
+ var then = value.then;
+ if (typeof then === "function") {
+ return new Promise(then.bind(value));
+ }
+ } catch (ex) {
+ return new Promise(function(resolve, reject) {
+ reject(ex);
+ });
+ }
+ }
+ return valuePromise(value);
+ };
+
+ Promise.all = function(arr) {
+ var args = Array.prototype.slice.call(arr);
+
+ return new Promise(function(resolve, reject) {
+ if (args.length === 0) return resolve([]);
+ var remaining = args.length;
+ function res(i, val) {
+ if (
+ val &&
+ (typeof val === "object" || typeof val === "function")
+ ) {
+ if (
+ val instanceof Promise &&
+ val.then === Promise.prototype.then
+ ) {
+ while (val._83 === 3) {
+ val = val._18;
+ }
+ if (val._83 === 1) return res(i, val._18);
+ if (val._83 === 2) reject(val._18);
+ val.then(function(val) {
+ res(i, val);
+ }, reject);
+ return;
+ } else {
+ var then = val.then;
+ if (typeof then === "function") {
+ var p = new Promise(then.bind(val));
+ p.then(function(val) {
+ res(i, val);
+ }, reject);
+ return;
+ }
+ }
+ }
+ args[i] = val;
+ if (--remaining === 0) {
+ resolve(args);
+ }
+ }
+ for (var i = 0; i < args.length; i++) {
+ res(i, args[i]);
+ }
+ });
+ };
+
+ Promise.reject = function(value) {
+ return new Promise(function(resolve, reject) {
+ reject(value);
+ });
+ };
+
+ Promise.race = function(values) {
+ return new Promise(function(resolve, reject) {
+ values.forEach(function(value) {
+ Promise.resolve(value).then(resolve, reject);
+ });
+ });
+ };
+
+ /* Prototype Methods */
+
+ Promise.prototype["catch"] = function(onRejected) {
+ return this.then(null, onRejected);
+ };
+
+ /***/
+ },
+
+ /***/ "./node_modules/react-scripts/node_modules/promise/lib/rejection-tracking.js":
+ /*!***********************************************************************************!*\
+ !*** ./node_modules/react-scripts/node_modules/promise/lib/rejection-tracking.js ***!
+ \***********************************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ var Promise = __webpack_require__(
+ /*! ./core */ "./node_modules/react-scripts/node_modules/promise/lib/core.js"
+ );
+
+ var DEFAULT_WHITELIST = [ReferenceError, TypeError, RangeError];
+
+ var enabled = false;
+ exports.disable = disable;
+ function disable() {
+ enabled = false;
+ Promise._47 = null;
+ Promise._71 = null;
+ }
+
+ exports.enable = enable;
+ function enable(options) {
+ options = options || {};
+ if (enabled) disable();
+ enabled = true;
+ var id = 0;
+ var displayId = 0;
+ var rejections = {};
+ Promise._47 = function(promise) {
+ if (
+ promise._83 === 2 && // IS REJECTED
+ rejections[promise._56]
+ ) {
+ if (rejections[promise._56].logged) {
+ onHandled(promise._56);
+ } else {
+ clearTimeout(rejections[promise._56].timeout);
+ }
+ delete rejections[promise._56];
+ }
+ };
+ Promise._71 = function(promise, err) {
+ if (promise._75 === 0) {
+ // not yet handled
+ promise._56 = id++;
+ rejections[promise._56] = {
+ displayId: null,
+ error: err,
+ timeout: setTimeout(
+ onUnhandled.bind(null, promise._56),
+ // For reference errors and type errors, this almost always
+ // means the programmer made a mistake, so log them after just
+ // 100ms
+ // otherwise, wait 2 seconds to see if they get handled
+ matchWhitelist(err, DEFAULT_WHITELIST) ? 100 : 2000
+ ),
+ logged: false
+ };
+ }
+ };
+ function onUnhandled(id) {
+ if (
+ options.allRejections ||
+ matchWhitelist(
+ rejections[id].error,
+ options.whitelist || DEFAULT_WHITELIST
+ )
+ ) {
+ rejections[id].displayId = displayId++;
+ if (options.onUnhandled) {
+ rejections[id].logged = true;
+ options.onUnhandled(
+ rejections[id].displayId,
+ rejections[id].error
+ );
+ } else {
+ rejections[id].logged = true;
+ logError(rejections[id].displayId, rejections[id].error);
+ }
+ }
+ }
+ function onHandled(id) {
+ if (rejections[id].logged) {
+ if (options.onHandled) {
+ options.onHandled(
+ rejections[id].displayId,
+ rejections[id].error
+ );
+ } else if (!rejections[id].onUnhandled) {
+ console.warn(
+ "Promise Rejection Handled (id: " +
+ rejections[id].displayId +
+ "):"
+ );
+ console.warn(
+ ' This means you can ignore any previous messages of the form "Possible Unhandled Promise Rejection" with id ' +
+ rejections[id].displayId +
+ "."
+ );
+ }
+ }
+ }
+ }
+
+ function logError(id, error) {
+ console.warn(
+ "Possible Unhandled Promise Rejection (id: " + id + "):"
+ );
+ var errStr = (error && (error.stack || error)) + "";
+ errStr.split("\n").forEach(function(line) {
+ console.warn(" " + line);
+ });
+ }
+
+ function matchWhitelist(error, list) {
+ return list.some(function(cls) {
+ return error instanceof cls;
+ });
+ }
+
+ /***/
+ },
+
+ /***/ "./node_modules/react/cjs/react.development.js":
+ /*!*****************************************************!*\
+ !*** ./node_modules/react/cjs/react.development.js ***!
+ \*****************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /** @license React v16.2.0
+ * react.development.js
+ *
+ * Copyright (c) 2013-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+ if (true) {
+ (function() {
+ "use strict";
+
+ var _assign = __webpack_require__(
+ /*! object-assign */ "./node_modules/object-assign/index.js"
+ );
+ var emptyObject = __webpack_require__(
+ /*! fbjs/lib/emptyObject */ "./node_modules/fbjs/lib/emptyObject.js"
+ );
+ var invariant = __webpack_require__(
+ /*! fbjs/lib/invariant */ "./node_modules/fbjs/lib/invariant.js"
+ );
+ var warning = __webpack_require__(
+ /*! fbjs/lib/warning */ "./node_modules/fbjs/lib/warning.js"
+ );
+ var emptyFunction = __webpack_require__(
+ /*! fbjs/lib/emptyFunction */ "./node_modules/fbjs/lib/emptyFunction.js"
+ );
+ var checkPropTypes = __webpack_require__(
+ /*! prop-types/checkPropTypes */ "./node_modules/prop-types/checkPropTypes.js"
+ );
+
+ // TODO: this is special because it gets imported during build.
+
+ var ReactVersion = "16.2.0";
+
+ // The Symbol used to tag the ReactElement-like types. If there is no native Symbol
+ // nor polyfill, then a plain number is used for performance.
+ var hasSymbol = typeof Symbol === "function" && Symbol["for"];
+
+ var REACT_ELEMENT_TYPE = hasSymbol
+ ? Symbol["for"]("react.element")
+ : 0xeac7;
+ var REACT_CALL_TYPE = hasSymbol
+ ? Symbol["for"]("react.call")
+ : 0xeac8;
+ var REACT_RETURN_TYPE = hasSymbol
+ ? Symbol["for"]("react.return")
+ : 0xeac9;
+ var REACT_PORTAL_TYPE = hasSymbol
+ ? Symbol["for"]("react.portal")
+ : 0xeaca;
+ var REACT_FRAGMENT_TYPE = hasSymbol
+ ? Symbol["for"]("react.fragment")
+ : 0xeacb;
+
+ var MAYBE_ITERATOR_SYMBOL =
+ typeof Symbol === "function" && Symbol.iterator;
+ var FAUX_ITERATOR_SYMBOL = "@@iterator";
+
+ function getIteratorFn(maybeIterable) {
+ if (
+ maybeIterable === null ||
+ typeof maybeIterable === "undefined"
+ ) {
+ return null;
+ }
+ var maybeIterator =
+ (MAYBE_ITERATOR_SYMBOL &&
+ maybeIterable[MAYBE_ITERATOR_SYMBOL]) ||
+ maybeIterable[FAUX_ITERATOR_SYMBOL];
+ if (typeof maybeIterator === "function") {
+ return maybeIterator;
+ }
+ return null;
+ }
+
+ /**
+ * WARNING: DO NOT manually require this module.
+ * This is a replacement for `invariant(...)` used by the error code system
+ * and will _only_ be required by the corresponding babel pass.
+ * It always throws.
+ */
+
+ /**
+ * Forked from fbjs/warning:
+ * https://github.com/facebook/fbjs/blob/e66ba20ad5be433eb54423f2b097d829324d9de6/packages/fbjs/src/__forks__/warning.js
+ *
+ * Only change is we use console.warn instead of console.error,
+ * and do nothing when 'console' is not supported.
+ * This really simplifies the code.
+ * ---
+ * Similar to invariant but only logs a warning if the condition is not met.
+ * This can be used to log issues in development environments in critical
+ * paths. Removing the logging code for production environments will keep the
+ * same logic and follow the same code paths.
+ */
+
+ var lowPriorityWarning = function() {};
+
+ {
+ var printWarning = function(format) {
+ for (
+ var _len = arguments.length,
+ args = Array(_len > 1 ? _len - 1 : 0),
+ _key = 1;
+ _key < _len;
+ _key++
+ ) {
+ args[_key - 1] = arguments[_key];
+ }
+
+ var argIndex = 0;
+ var message =
+ "Warning: " +
+ format.replace(/%s/g, function() {
+ return args[argIndex++];
+ });
+ if (typeof console !== "undefined") {
+ console.warn(message);
+ }
+ try {
+ // --- Welcome to debugging React ---
+ // This error was thrown as a convenience so that you can use this stack
+ // to find the callsite that caused this warning to fire.
+ throw new Error(message);
+ } catch (x) {}
+ };
+
+ lowPriorityWarning = function(condition, format) {
+ if (format === undefined) {
+ throw new Error(
+ "`warning(condition, format, ...args)` requires a warning " +
+ "message argument"
+ );
+ }
+ if (!condition) {
+ for (
+ var _len2 = arguments.length,
+ args = Array(_len2 > 2 ? _len2 - 2 : 0),
+ _key2 = 2;
+ _key2 < _len2;
+ _key2++
+ ) {
+ args[_key2 - 2] = arguments[_key2];
+ }
+
+ printWarning.apply(undefined, [format].concat(args));
+ }
+ };
+ }
+
+ var lowPriorityWarning$1 = lowPriorityWarning;
+
+ var didWarnStateUpdateForUnmountedComponent = {};
+
+ function warnNoop(publicInstance, callerName) {
+ {
+ var constructor = publicInstance.constructor;
+ var componentName =
+ (constructor &&
+ (constructor.displayName || constructor.name)) ||
+ "ReactClass";
+ var warningKey = componentName + "." + callerName;
+ if (didWarnStateUpdateForUnmountedComponent[warningKey]) {
+ return;
+ }
+ warning(
+ false,
+ "%s(...): Can only update a mounted or mounting component. " +
+ "This usually means you called %s() on an unmounted component. " +
+ "This is a no-op.\n\nPlease check the code for the %s component.",
+ callerName,
+ callerName,
+ componentName
+ );
+ didWarnStateUpdateForUnmountedComponent[warningKey] = true;
+ }
+ }
+
+ /**
+ * This is the abstract API for an update queue.
+ */
+ var ReactNoopUpdateQueue = {
+ /**
+ * Checks whether or not this composite component is mounted.
+ * @param {ReactClass} publicInstance The instance we want to test.
+ * @return {boolean} True if mounted, false otherwise.
+ * @protected
+ * @final
+ */
+ isMounted: function(publicInstance) {
+ return false;
+ },
+
+ /**
+ * Forces an update. This should only be invoked when it is known with
+ * certainty that we are **not** in a DOM transaction.
+ *
+ * You may want to call this when you know that some deeper aspect of the
+ * component's state has changed but `setState` was not called.
+ *
+ * This will not invoke `shouldComponentUpdate`, but it will invoke
+ * `componentWillUpdate` and `componentDidUpdate`.
+ *
+ * @param {ReactClass} publicInstance The instance that should rerender.
+ * @param {?function} callback Called after component is updated.
+ * @param {?string} callerName name of the calling function in the public API.
+ * @internal
+ */
+ enqueueForceUpdate: function(
+ publicInstance,
+ callback,
+ callerName
+ ) {
+ warnNoop(publicInstance, "forceUpdate");
+ },
+
+ /**
+ * Replaces all of the state. Always use this or `setState` to mutate state.
+ * You should treat `this.state` as immutable.
+ *
+ * There is no guarantee that `this.state` will be immediately updated, so
+ * accessing `this.state` after calling this method may return the old value.
+ *
+ * @param {ReactClass} publicInstance The instance that should rerender.
+ * @param {object} completeState Next state.
+ * @param {?function} callback Called after component is updated.
+ * @param {?string} callerName name of the calling function in the public API.
+ * @internal
+ */
+ enqueueReplaceState: function(
+ publicInstance,
+ completeState,
+ callback,
+ callerName
+ ) {
+ warnNoop(publicInstance, "replaceState");
+ },
+
+ /**
+ * Sets a subset of the state. This only exists because _pendingState is
+ * internal. This provides a merging strategy that is not available to deep
+ * properties which is confusing. TODO: Expose pendingState or don't use it
+ * during the merge.
+ *
+ * @param {ReactClass} publicInstance The instance that should rerender.
+ * @param {object} partialState Next partial state to be merged with state.
+ * @param {?function} callback Called after component is updated.
+ * @param {?string} Name of the calling function in the public API.
+ * @internal
+ */
+ enqueueSetState: function(
+ publicInstance,
+ partialState,
+ callback,
+ callerName
+ ) {
+ warnNoop(publicInstance, "setState");
+ }
+ };
+
+ /**
+ * Base class helpers for the updating state of a component.
+ */
+ function Component(props, context, updater) {
+ this.props = props;
+ this.context = context;
+ this.refs = emptyObject;
+ // We initialize the default updater but the real one gets injected by the
+ // renderer.
+ this.updater = updater || ReactNoopUpdateQueue;
+ }
+
+ Component.prototype.isReactComponent = {};
+
+ /**
+ * Sets a subset of the state. Always use this to mutate
+ * state. You should treat `this.state` as immutable.
+ *
+ * There is no guarantee that `this.state` will be immediately updated, so
+ * accessing `this.state` after calling this method may return the old value.
+ *
+ * There is no guarantee that calls to `setState` will run synchronously,
+ * as they may eventually be batched together. You can provide an optional
+ * callback that will be executed when the call to setState is actually
+ * completed.
+ *
+ * When a function is provided to setState, it will be called at some point in
+ * the future (not synchronously). It will be called with the up to date
+ * component arguments (state, props, context). These values can be different
+ * from this.* because your function may be called after receiveProps but before
+ * shouldComponentUpdate, and this new state, props, and context will not yet be
+ * assigned to this.
+ *
+ * @param {object|function} partialState Next partial state or function to
+ * produce next partial state to be merged with current state.
+ * @param {?function} callback Called after state is updated.
+ * @final
+ * @protected
+ */
+ Component.prototype.setState = function(partialState, callback) {
+ !(
+ typeof partialState === "object" ||
+ typeof partialState === "function" ||
+ partialState == null
+ )
+ ? invariant(
+ false,
+ "setState(...): takes an object of state variables to update or a function which returns an object of state variables."
+ )
+ : void 0;
+ this.updater.enqueueSetState(
+ this,
+ partialState,
+ callback,
+ "setState"
+ );
+ };
+
+ /**
+ * Forces an update. This should only be invoked when it is known with
+ * certainty that we are **not** in a DOM transaction.
+ *
+ * You may want to call this when you know that some deeper aspect of the
+ * component's state has changed but `setState` was not called.
+ *
+ * This will not invoke `shouldComponentUpdate`, but it will invoke
+ * `componentWillUpdate` and `componentDidUpdate`.
+ *
+ * @param {?function} callback Called after update is complete.
+ * @final
+ * @protected
+ */
+ Component.prototype.forceUpdate = function(callback) {
+ this.updater.enqueueForceUpdate(this, callback, "forceUpdate");
+ };
+
+ /**
+ * Deprecated APIs. These APIs used to exist on classic React classes but since
+ * we would like to deprecate them, we're not going to move them over to this
+ * modern base class. Instead, we define a getter that warns if it's accessed.
+ */
+ {
+ var deprecatedAPIs = {
+ isMounted: [
+ "isMounted",
+ "Instead, make sure to clean up subscriptions and pending requests in " +
+ "componentWillUnmount to prevent memory leaks."
+ ],
+ replaceState: [
+ "replaceState",
+ "Refactor your code to use setState instead (see " +
+ "https://github.com/facebook/react/issues/3236)."
+ ]
+ };
+ var defineDeprecationWarning = function(methodName, info) {
+ Object.defineProperty(Component.prototype, methodName, {
+ get: function() {
+ lowPriorityWarning$1(
+ false,
+ "%s(...) is deprecated in plain JavaScript React classes. %s",
+ info[0],
+ info[1]
+ );
+ return undefined;
+ }
+ });
+ };
+ for (var fnName in deprecatedAPIs) {
+ if (deprecatedAPIs.hasOwnProperty(fnName)) {
+ defineDeprecationWarning(fnName, deprecatedAPIs[fnName]);
+ }
+ }
+ }
+
+ /**
+ * Base class helpers for the updating state of a component.
+ */
+ function PureComponent(props, context, updater) {
+ // Duplicated from Component.
+ this.props = props;
+ this.context = context;
+ this.refs = emptyObject;
+ // We initialize the default updater but the real one gets injected by the
+ // renderer.
+ this.updater = updater || ReactNoopUpdateQueue;
+ }
+
+ function ComponentDummy() {}
+ ComponentDummy.prototype = Component.prototype;
+ var pureComponentPrototype = (PureComponent.prototype = new ComponentDummy());
+ pureComponentPrototype.constructor = PureComponent;
+ // Avoid an extra prototype jump for these methods.
+ _assign(pureComponentPrototype, Component.prototype);
+ pureComponentPrototype.isPureReactComponent = true;
+
+ function AsyncComponent(props, context, updater) {
+ // Duplicated from Component.
+ this.props = props;
+ this.context = context;
+ this.refs = emptyObject;
+ // We initialize the default updater but the real one gets injected by the
+ // renderer.
+ this.updater = updater || ReactNoopUpdateQueue;
+ }
+
+ var asyncComponentPrototype = (AsyncComponent.prototype = new ComponentDummy());
+ asyncComponentPrototype.constructor = AsyncComponent;
+ // Avoid an extra prototype jump for these methods.
+ _assign(asyncComponentPrototype, Component.prototype);
+ asyncComponentPrototype.unstable_isAsyncReactComponent = true;
+ asyncComponentPrototype.render = function() {
+ return this.props.children;
+ };
+
+ /**
+ * Keeps track of the current owner.
+ *
+ * The current owner is the component who should own any components that are
+ * currently being constructed.
+ */
+ var ReactCurrentOwner = {
+ /**
+ * @internal
+ * @type {ReactComponent}
+ */
+ current: null
+ };
+
+ var hasOwnProperty = Object.prototype.hasOwnProperty;
+
+ var RESERVED_PROPS = {
+ key: true,
+ ref: true,
+ __self: true,
+ __source: true
+ };
+
+ var specialPropKeyWarningShown;
+ var specialPropRefWarningShown;
+
+ function hasValidRef(config) {
+ {
+ if (hasOwnProperty.call(config, "ref")) {
+ var getter = Object.getOwnPropertyDescriptor(config, "ref")
+ .get;
+ if (getter && getter.isReactWarning) {
+ return false;
+ }
+ }
+ }
+ return config.ref !== undefined;
+ }
+
+ function hasValidKey(config) {
+ {
+ if (hasOwnProperty.call(config, "key")) {
+ var getter = Object.getOwnPropertyDescriptor(config, "key")
+ .get;
+ if (getter && getter.isReactWarning) {
+ return false;
+ }
+ }
+ }
+ return config.key !== undefined;
+ }
+
+ function defineKeyPropWarningGetter(props, displayName) {
+ var warnAboutAccessingKey = function() {
+ if (!specialPropKeyWarningShown) {
+ specialPropKeyWarningShown = true;
+ warning(
+ false,
+ "%s: `key` is not a prop. Trying to access it will result " +
+ "in `undefined` being returned. If you need to access the same " +
+ "value within the child component, you should pass it as a different " +
+ "prop. (https://fb.me/react-special-props)",
+ displayName
+ );
+ }
+ };
+ warnAboutAccessingKey.isReactWarning = true;
+ Object.defineProperty(props, "key", {
+ get: warnAboutAccessingKey,
+ configurable: true
+ });
+ }
+
+ function defineRefPropWarningGetter(props, displayName) {
+ var warnAboutAccessingRef = function() {
+ if (!specialPropRefWarningShown) {
+ specialPropRefWarningShown = true;
+ warning(
+ false,
+ "%s: `ref` is not a prop. Trying to access it will result " +
+ "in `undefined` being returned. If you need to access the same " +
+ "value within the child component, you should pass it as a different " +
+ "prop. (https://fb.me/react-special-props)",
+ displayName
+ );
+ }
+ };
+ warnAboutAccessingRef.isReactWarning = true;
+ Object.defineProperty(props, "ref", {
+ get: warnAboutAccessingRef,
+ configurable: true
+ });
+ }
+
+ /**
+ * Factory method to create a new React element. This no longer adheres to
+ * the class pattern, so do not use new to call it. Also, no instanceof check
+ * will work. Instead test $$typeof field against Symbol.for('react.element') to check
+ * if something is a React Element.
+ *
+ * @param {*} type
+ * @param {*} key
+ * @param {string|object} ref
+ * @param {*} self A *temporary* helper to detect places where `this` is
+ * different from the `owner` when React.createElement is called, so that we
+ * can warn. We want to get rid of owner and replace string `ref`s with arrow
+ * functions, and as long as `this` and owner are the same, there will be no
+ * change in behavior.
+ * @param {*} source An annotation object (added by a transpiler or otherwise)
+ * indicating filename, line number, and/or other information.
+ * @param {*} owner
+ * @param {*} props
+ * @internal
+ */
+ var ReactElement = function(
+ type,
+ key,
+ ref,
+ self,
+ source,
+ owner,
+ props
+ ) {
+ var element = {
+ // This tag allow us to uniquely identify this as a React Element
+ $$typeof: REACT_ELEMENT_TYPE,
+
+ // Built-in properties that belong on the element
+ type: type,
+ key: key,
+ ref: ref,
+ props: props,
+
+ // Record the component responsible for creating this element.
+ _owner: owner
+ };
+
+ {
+ // The validation flag is currently mutative. We put it on
+ // an external backing store so that we can freeze the whole object.
+ // This can be replaced with a WeakMap once they are implemented in
+ // commonly used development environments.
+ element._store = {};
+
+ // To make comparing ReactElements easier for testing purposes, we make
+ // the validation flag non-enumerable (where possible, which should
+ // include every environment we run tests in), so the test framework
+ // ignores it.
+ Object.defineProperty(element._store, "validated", {
+ configurable: false,
+ enumerable: false,
+ writable: true,
+ value: false
+ });
+ // self and source are DEV only properties.
+ Object.defineProperty(element, "_self", {
+ configurable: false,
+ enumerable: false,
+ writable: false,
+ value: self
+ });
+ // Two elements created in two different places should be considered
+ // equal for testing purposes and therefore we hide it from enumeration.
+ Object.defineProperty(element, "_source", {
+ configurable: false,
+ enumerable: false,
+ writable: false,
+ value: source
+ });
+ if (Object.freeze) {
+ Object.freeze(element.props);
+ Object.freeze(element);
+ }
+ }
+
+ return element;
+ };
+
+ /**
+ * Create and return a new ReactElement of the given type.
+ * See https://reactjs.org/docs/react-api.html#createelement
+ */
+ function createElement(type, config, children) {
+ var propName;
+
+ // Reserved names are extracted
+ var props = {};
+
+ var key = null;
+ var ref = null;
+ var self = null;
+ var source = null;
+
+ if (config != null) {
+ if (hasValidRef(config)) {
+ ref = config.ref;
+ }
+ if (hasValidKey(config)) {
+ key = "" + config.key;
+ }
+
+ self = config.__self === undefined ? null : config.__self;
+ source = config.__source === undefined ? null : config.__source;
+ // Remaining properties are added to a new props object
+ for (propName in config) {
+ if (
+ hasOwnProperty.call(config, propName) &&
+ !RESERVED_PROPS.hasOwnProperty(propName)
+ ) {
+ props[propName] = config[propName];
+ }
+ }
+ }
+
+ // Children can be more than one argument, and those are transferred onto
+ // the newly allocated props object.
+ var childrenLength = arguments.length - 2;
+ if (childrenLength === 1) {
+ props.children = children;
+ } else if (childrenLength > 1) {
+ var childArray = Array(childrenLength);
+ for (var i = 0; i < childrenLength; i++) {
+ childArray[i] = arguments[i + 2];
+ }
+ {
+ if (Object.freeze) {
+ Object.freeze(childArray);
+ }
+ }
+ props.children = childArray;
+ }
+
+ // Resolve default props
+ if (type && type.defaultProps) {
+ var defaultProps = type.defaultProps;
+ for (propName in defaultProps) {
+ if (props[propName] === undefined) {
+ props[propName] = defaultProps[propName];
+ }
+ }
+ }
+ {
+ if (key || ref) {
+ if (
+ typeof props.$$typeof === "undefined" ||
+ props.$$typeof !== REACT_ELEMENT_TYPE
+ ) {
+ var displayName =
+ typeof type === "function"
+ ? type.displayName || type.name || "Unknown"
+ : type;
+ if (key) {
+ defineKeyPropWarningGetter(props, displayName);
+ }
+ if (ref) {
+ defineRefPropWarningGetter(props, displayName);
+ }
+ }
+ }
+ }
+ return ReactElement(
+ type,
+ key,
+ ref,
+ self,
+ source,
+ ReactCurrentOwner.current,
+ props
+ );
+ }
+
+ /**
+ * Return a function that produces ReactElements of a given type.
+ * See https://reactjs.org/docs/react-api.html#createfactory
+ */
+
+ function cloneAndReplaceKey(oldElement, newKey) {
+ var newElement = ReactElement(
+ oldElement.type,
+ newKey,
+ oldElement.ref,
+ oldElement._self,
+ oldElement._source,
+ oldElement._owner,
+ oldElement.props
+ );
+
+ return newElement;
+ }
+
+ /**
+ * Clone and return a new ReactElement using element as the starting point.
+ * See https://reactjs.org/docs/react-api.html#cloneelement
+ */
+ function cloneElement(element, config, children) {
+ var propName;
+
+ // Original props are copied
+ var props = _assign({}, element.props);
+
+ // Reserved names are extracted
+ var key = element.key;
+ var ref = element.ref;
+ // Self is preserved since the owner is preserved.
+ var self = element._self;
+ // Source is preserved since cloneElement is unlikely to be targeted by a
+ // transpiler, and the original source is probably a better indicator of the
+ // true owner.
+ var source = element._source;
+
+ // Owner will be preserved, unless ref is overridden
+ var owner = element._owner;
+
+ if (config != null) {
+ if (hasValidRef(config)) {
+ // Silently steal the ref from the parent.
+ ref = config.ref;
+ owner = ReactCurrentOwner.current;
+ }
+ if (hasValidKey(config)) {
+ key = "" + config.key;
+ }
+
+ // Remaining properties override existing props
+ var defaultProps;
+ if (element.type && element.type.defaultProps) {
+ defaultProps = element.type.defaultProps;
+ }
+ for (propName in config) {
+ if (
+ hasOwnProperty.call(config, propName) &&
+ !RESERVED_PROPS.hasOwnProperty(propName)
+ ) {
+ if (
+ config[propName] === undefined &&
+ defaultProps !== undefined
+ ) {
+ // Resolve default props
+ props[propName] = defaultProps[propName];
+ } else {
+ props[propName] = config[propName];
+ }
+ }
+ }
+ }
+
+ // Children can be more than one argument, and those are transferred onto
+ // the newly allocated props object.
+ var childrenLength = arguments.length - 2;
+ if (childrenLength === 1) {
+ props.children = children;
+ } else if (childrenLength > 1) {
+ var childArray = Array(childrenLength);
+ for (var i = 0; i < childrenLength; i++) {
+ childArray[i] = arguments[i + 2];
+ }
+ props.children = childArray;
+ }
+
+ return ReactElement(
+ element.type,
+ key,
+ ref,
+ self,
+ source,
+ owner,
+ props
+ );
+ }
+
+ /**
+ * Verifies the object is a ReactElement.
+ * See https://reactjs.org/docs/react-api.html#isvalidelement
+ * @param {?object} object
+ * @return {boolean} True if `object` is a valid component.
+ * @final
+ */
+ function isValidElement(object) {
+ return (
+ typeof object === "object" &&
+ object !== null &&
+ object.$$typeof === REACT_ELEMENT_TYPE
+ );
+ }
+
+ var ReactDebugCurrentFrame = {};
+
+ {
+ // Component that is being worked on
+ ReactDebugCurrentFrame.getCurrentStack = null;
+
+ ReactDebugCurrentFrame.getStackAddendum = function() {
+ var impl = ReactDebugCurrentFrame.getCurrentStack;
+ if (impl) {
+ return impl();
+ }
+ return null;
+ };
+ }
+
+ var SEPARATOR = ".";
+ var SUBSEPARATOR = ":";
+
+ /**
+ * Escape and wrap key so it is safe to use as a reactid
+ *
+ * @param {string} key to be escaped.
+ * @return {string} the escaped key.
+ */
+ function escape(key) {
+ var escapeRegex = /[=:]/g;
+ var escaperLookup = {
+ "=": "=0",
+ ":": "=2"
+ };
+ var escapedString = ("" + key).replace(escapeRegex, function(
+ match
+ ) {
+ return escaperLookup[match];
+ });
+
+ return "$" + escapedString;
+ }
+
+ /**
+ * TODO: Test that a single child and an array with one item have the same key
+ * pattern.
+ */
+
+ var didWarnAboutMaps = false;
+
+ var userProvidedKeyEscapeRegex = /\/+/g;
+ function escapeUserProvidedKey(text) {
+ return ("" + text).replace(userProvidedKeyEscapeRegex, "$&/");
+ }
+
+ var POOL_SIZE = 10;
+ var traverseContextPool = [];
+ function getPooledTraverseContext(
+ mapResult,
+ keyPrefix,
+ mapFunction,
+ mapContext
+ ) {
+ if (traverseContextPool.length) {
+ var traverseContext = traverseContextPool.pop();
+ traverseContext.result = mapResult;
+ traverseContext.keyPrefix = keyPrefix;
+ traverseContext.func = mapFunction;
+ traverseContext.context = mapContext;
+ traverseContext.count = 0;
+ return traverseContext;
+ } else {
+ return {
+ result: mapResult,
+ keyPrefix: keyPrefix,
+ func: mapFunction,
+ context: mapContext,
+ count: 0
+ };
+ }
+ }
+
+ function releaseTraverseContext(traverseContext) {
+ traverseContext.result = null;
+ traverseContext.keyPrefix = null;
+ traverseContext.func = null;
+ traverseContext.context = null;
+ traverseContext.count = 0;
+ if (traverseContextPool.length < POOL_SIZE) {
+ traverseContextPool.push(traverseContext);
+ }
+ }
+
+ /**
+ * @param {?*} children Children tree container.
+ * @param {!string} nameSoFar Name of the key path so far.
+ * @param {!function} callback Callback to invoke with each child found.
+ * @param {?*} traverseContext Used to pass information throughout the traversal
+ * process.
+ * @return {!number} The number of children in this subtree.
+ */
+ function traverseAllChildrenImpl(
+ children,
+ nameSoFar,
+ callback,
+ traverseContext
+ ) {
+ var type = typeof children;
+
+ if (type === "undefined" || type === "boolean") {
+ // All of the above are perceived as null.
+ children = null;
+ }
+
+ var invokeCallback = false;
+
+ if (children === null) {
+ invokeCallback = true;
+ } else {
+ switch (type) {
+ case "string":
+ case "number":
+ invokeCallback = true;
+ break;
+ case "object":
+ switch (children.$$typeof) {
+ case REACT_ELEMENT_TYPE:
+ case REACT_CALL_TYPE:
+ case REACT_RETURN_TYPE:
+ case REACT_PORTAL_TYPE:
+ invokeCallback = true;
+ }
+ }
+ }
+
+ if (invokeCallback) {
+ callback(
+ traverseContext,
+ children,
+ // If it's the only child, treat the name as if it was wrapped in an array
+ // so that it's consistent if the number of children grows.
+ nameSoFar === ""
+ ? SEPARATOR + getComponentKey(children, 0)
+ : nameSoFar
+ );
+ return 1;
+ }
+
+ var child;
+ var nextName;
+ var subtreeCount = 0; // Count of children found in the current subtree.
+ var nextNamePrefix =
+ nameSoFar === "" ? SEPARATOR : nameSoFar + SUBSEPARATOR;
+
+ if (Array.isArray(children)) {
+ for (var i = 0; i < children.length; i++) {
+ child = children[i];
+ nextName = nextNamePrefix + getComponentKey(child, i);
+ subtreeCount += traverseAllChildrenImpl(
+ child,
+ nextName,
+ callback,
+ traverseContext
+ );
+ }
+ } else {
+ var iteratorFn = getIteratorFn(children);
+ if (typeof iteratorFn === "function") {
+ {
+ // Warn about using Maps as children
+ if (iteratorFn === children.entries) {
+ warning(
+ didWarnAboutMaps,
+ "Using Maps as children is unsupported and will likely yield " +
+ "unexpected results. Convert it to a sequence/iterable of keyed " +
+ "ReactElements instead.%s",
+ ReactDebugCurrentFrame.getStackAddendum()
+ );
+ didWarnAboutMaps = true;
+ }
+ }
+
+ var iterator = iteratorFn.call(children);
+ var step;
+ var ii = 0;
+ while (!(step = iterator.next()).done) {
+ child = step.value;
+ nextName = nextNamePrefix + getComponentKey(child, ii++);
+ subtreeCount += traverseAllChildrenImpl(
+ child,
+ nextName,
+ callback,
+ traverseContext
+ );
+ }
+ } else if (type === "object") {
+ var addendum = "";
+ {
+ addendum =
+ " If you meant to render a collection of children, use an array " +
+ "instead." +
+ ReactDebugCurrentFrame.getStackAddendum();
+ }
+ var childrenString = "" + children;
+ invariant(
+ false,
+ "Objects are not valid as a React child (found: %s).%s",
+ childrenString === "[object Object]"
+ ? "object with keys {" +
+ Object.keys(children).join(", ") +
+ "}"
+ : childrenString,
+ addendum
+ );
+ }
+ }
+
+ return subtreeCount;
+ }
+
+ /**
+ * Traverses children that are typically specified as `props.children`, but
+ * might also be specified through attributes:
+ *
+ * - `traverseAllChildren(this.props.children, ...)`
+ * - `traverseAllChildren(this.props.leftPanelChildren, ...)`
+ *
+ * The `traverseContext` is an optional argument that is passed through the
+ * entire traversal. It can be used to store accumulations or anything else that
+ * the callback might find relevant.
+ *
+ * @param {?*} children Children tree object.
+ * @param {!function} callback To invoke upon traversing each child.
+ * @param {?*} traverseContext Context for traversal.
+ * @return {!number} The number of children in this subtree.
+ */
+ function traverseAllChildren(children, callback, traverseContext) {
+ if (children == null) {
+ return 0;
+ }
+
+ return traverseAllChildrenImpl(
+ children,
+ "",
+ callback,
+ traverseContext
+ );
+ }
+
+ /**
+ * Generate a key string that identifies a component within a set.
+ *
+ * @param {*} component A component that could contain a manual key.
+ * @param {number} index Index that is used if a manual key is not provided.
+ * @return {string}
+ */
+ function getComponentKey(component, index) {
+ // Do some typechecking here since we call this blindly. We want to ensure
+ // that we don't block potential future ES APIs.
+ if (
+ typeof component === "object" &&
+ component !== null &&
+ component.key != null
+ ) {
+ // Explicit key
+ return escape(component.key);
+ }
+ // Implicit key determined by the index in the set
+ return index.toString(36);
+ }
+
+ function forEachSingleChild(bookKeeping, child, name) {
+ var func = bookKeeping.func,
+ context = bookKeeping.context;
+
+ func.call(context, child, bookKeeping.count++);
+ }
+
+ /**
+ * Iterates through children that are typically specified as `props.children`.
+ *
+ * See https://reactjs.org/docs/react-api.html#react.children.foreach
+ *
+ * The provided forEachFunc(child, index) will be called for each
+ * leaf child.
+ *
+ * @param {?*} children Children tree container.
+ * @param {function(*, int)} forEachFunc
+ * @param {*} forEachContext Context for forEachContext.
+ */
+ function forEachChildren(children, forEachFunc, forEachContext) {
+ if (children == null) {
+ return children;
+ }
+ var traverseContext = getPooledTraverseContext(
+ null,
+ null,
+ forEachFunc,
+ forEachContext
+ );
+ traverseAllChildren(
+ children,
+ forEachSingleChild,
+ traverseContext
+ );
+ releaseTraverseContext(traverseContext);
+ }
+
+ function mapSingleChildIntoContext(bookKeeping, child, childKey) {
+ var result = bookKeeping.result,
+ keyPrefix = bookKeeping.keyPrefix,
+ func = bookKeeping.func,
+ context = bookKeeping.context;
+
+ var mappedChild = func.call(context, child, bookKeeping.count++);
+ if (Array.isArray(mappedChild)) {
+ mapIntoWithKeyPrefixInternal(
+ mappedChild,
+ result,
+ childKey,
+ emptyFunction.thatReturnsArgument
+ );
+ } else if (mappedChild != null) {
+ if (isValidElement(mappedChild)) {
+ mappedChild = cloneAndReplaceKey(
+ mappedChild,
+ // Keep both the (mapped) and old keys if they differ, just as
+ // traverseAllChildren used to do for objects as children
+ keyPrefix +
+ (mappedChild.key &&
+ (!child || child.key !== mappedChild.key)
+ ? escapeUserProvidedKey(mappedChild.key) + "/"
+ : "") +
+ childKey
+ );
+ }
+ result.push(mappedChild);
+ }
+ }
+
+ function mapIntoWithKeyPrefixInternal(
+ children,
+ array,
+ prefix,
+ func,
+ context
+ ) {
+ var escapedPrefix = "";
+ if (prefix != null) {
+ escapedPrefix = escapeUserProvidedKey(prefix) + "/";
+ }
+ var traverseContext = getPooledTraverseContext(
+ array,
+ escapedPrefix,
+ func,
+ context
+ );
+ traverseAllChildren(
+ children,
+ mapSingleChildIntoContext,
+ traverseContext
+ );
+ releaseTraverseContext(traverseContext);
+ }
+
+ /**
+ * Maps children that are typically specified as `props.children`.
+ *
+ * See https://reactjs.org/docs/react-api.html#react.children.map
+ *
+ * The provided mapFunction(child, key, index) will be called for each
+ * leaf child.
+ *
+ * @param {?*} children Children tree container.
+ * @param {function(*, int)} func The map function.
+ * @param {*} context Context for mapFunction.
+ * @return {object} Object containing the ordered map of results.
+ */
+ function mapChildren(children, func, context) {
+ if (children == null) {
+ return children;
+ }
+ var result = [];
+ mapIntoWithKeyPrefixInternal(
+ children,
+ result,
+ null,
+ func,
+ context
+ );
+ return result;
+ }
+
+ /**
+ * Count the number of children that are typically specified as
+ * `props.children`.
+ *
+ * See https://reactjs.org/docs/react-api.html#react.children.count
+ *
+ * @param {?*} children Children tree container.
+ * @return {number} The number of children.
+ */
+ function countChildren(children, context) {
+ return traverseAllChildren(
+ children,
+ emptyFunction.thatReturnsNull,
+ null
+ );
+ }
+
+ /**
+ * Flatten a children object (typically specified as `props.children`) and
+ * return an array with appropriately re-keyed children.
+ *
+ * See https://reactjs.org/docs/react-api.html#react.children.toarray
+ */
+ function toArray(children) {
+ var result = [];
+ mapIntoWithKeyPrefixInternal(
+ children,
+ result,
+ null,
+ emptyFunction.thatReturnsArgument
+ );
+ return result;
+ }
+
+ /**
+ * Returns the first child in a collection of children and verifies that there
+ * is only one child in the collection.
+ *
+ * See https://reactjs.org/docs/react-api.html#react.children.only
+ *
+ * The current implementation of this function assumes that a single child gets
+ * passed without a wrapper, but the purpose of this helper function is to
+ * abstract away the particular structure of children.
+ *
+ * @param {?object} children Child collection structure.
+ * @return {ReactElement} The first and only `ReactElement` contained in the
+ * structure.
+ */
+ function onlyChild(children) {
+ !isValidElement(children)
+ ? invariant(
+ false,
+ "React.Children.only expected to receive a single React element child."
+ )
+ : void 0;
+ return children;
+ }
+
+ var describeComponentFrame = function(name, source, ownerName) {
+ return (
+ "\n in " +
+ (name || "Unknown") +
+ (source
+ ? " (at " +
+ source.fileName.replace(/^.*[\\\/]/, "") +
+ ":" +
+ source.lineNumber +
+ ")"
+ : ownerName ? " (created by " + ownerName + ")" : "")
+ );
+ };
+
+ function getComponentName(fiber) {
+ var type = fiber.type;
+
+ if (typeof type === "string") {
+ return type;
+ }
+ if (typeof type === "function") {
+ return type.displayName || type.name;
+ }
+ return null;
+ }
+
+ /**
+ * ReactElementValidator provides a wrapper around a element factory
+ * which validates the props passed to the element. This is intended to be
+ * used only in DEV and could be replaced by a static type checker for languages
+ * that support it.
+ */
+
+ {
+ var currentlyValidatingElement = null;
+
+ var propTypesMisspellWarningShown = false;
+
+ var getDisplayName = function(element) {
+ if (element == null) {
+ return "#empty";
+ } else if (
+ typeof element === "string" ||
+ typeof element === "number"
+ ) {
+ return "#text";
+ } else if (typeof element.type === "string") {
+ return element.type;
+ } else if (element.type === REACT_FRAGMENT_TYPE) {
+ return "React.Fragment";
+ } else {
+ return (
+ element.type.displayName || element.type.name || "Unknown"
+ );
+ }
+ };
+
+ var getStackAddendum = function() {
+ var stack = "";
+ if (currentlyValidatingElement) {
+ var name = getDisplayName(currentlyValidatingElement);
+ var owner = currentlyValidatingElement._owner;
+ stack += describeComponentFrame(
+ name,
+ currentlyValidatingElement._source,
+ owner && getComponentName(owner)
+ );
+ }
+ stack += ReactDebugCurrentFrame.getStackAddendum() || "";
+ return stack;
+ };
+
+ var VALID_FRAGMENT_PROPS = new Map([
+ ["children", true],
+ ["key", true]
+ ]);
+ }
+
+ function getDeclarationErrorAddendum() {
+ if (ReactCurrentOwner.current) {
+ var name = getComponentName(ReactCurrentOwner.current);
+ if (name) {
+ return "\n\nCheck the render method of `" + name + "`.";
+ }
+ }
+ return "";
+ }
+
+ function getSourceInfoErrorAddendum(elementProps) {
+ if (
+ elementProps !== null &&
+ elementProps !== undefined &&
+ elementProps.__source !== undefined
+ ) {
+ var source = elementProps.__source;
+ var fileName = source.fileName.replace(/^.*[\\\/]/, "");
+ var lineNumber = source.lineNumber;
+ return (
+ "\n\nCheck your code at " + fileName + ":" + lineNumber + "."
+ );
+ }
+ return "";
+ }
+
+ /**
+ * Warn if there's no key explicitly set on dynamic arrays of children or
+ * object keys are not valid. This allows us to keep track of children between
+ * updates.
+ */
+ var ownerHasKeyUseWarning = {};
+
+ function getCurrentComponentErrorInfo(parentType) {
+ var info = getDeclarationErrorAddendum();
+
+ if (!info) {
+ var parentName =
+ typeof parentType === "string"
+ ? parentType
+ : parentType.displayName || parentType.name;
+ if (parentName) {
+ info =
+ "\n\nCheck the top-level render call using <" +
+ parentName +
+ ">.";
+ }
+ }
+ return info;
+ }
+
+ /**
+ * Warn if the element doesn't have an explicit key assigned to it.
+ * This element is in an array. The array could grow and shrink or be
+ * reordered. All children that haven't already been validated are required to
+ * have a "key" property assigned to it. Error statuses are cached so a warning
+ * will only be shown once.
+ *
+ * @internal
+ * @param {ReactElement} element Element that requires a key.
+ * @param {*} parentType element's parent's type.
+ */
+ function validateExplicitKey(element, parentType) {
+ if (
+ !element._store ||
+ element._store.validated ||
+ element.key != null
+ ) {
+ return;
+ }
+ element._store.validated = true;
+
+ var currentComponentErrorInfo = getCurrentComponentErrorInfo(
+ parentType
+ );
+ if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {
+ return;
+ }
+ ownerHasKeyUseWarning[currentComponentErrorInfo] = true;
+
+ // Usually the current owner is the offender, but if it accepts children as a
+ // property, it may be the creator of the child that's responsible for
+ // assigning it a key.
+ var childOwner = "";
+ if (
+ element &&
+ element._owner &&
+ element._owner !== ReactCurrentOwner.current
+ ) {
+ // Give the component that originally created this child.
+ childOwner =
+ " It was passed a child from " +
+ getComponentName(element._owner) +
+ ".";
+ }
+
+ currentlyValidatingElement = element;
+ {
+ warning(
+ false,
+ 'Each child in an array or iterator should have a unique "key" prop.' +
+ "%s%s See https://fb.me/react-warning-keys for more information.%s",
+ currentComponentErrorInfo,
+ childOwner,
+ getStackAddendum()
+ );
+ }
+ currentlyValidatingElement = null;
+ }
+
+ /**
+ * Ensure that every element either is passed in a static location, in an
+ * array with an explicit keys property defined, or in an object literal
+ * with valid key property.
+ *
+ * @internal
+ * @param {ReactNode} node Statically passed child of any type.
+ * @param {*} parentType node's parent's type.
+ */
+ function validateChildKeys(node, parentType) {
+ if (typeof node !== "object") {
+ return;
+ }
+ if (Array.isArray(node)) {
+ for (var i = 0; i < node.length; i++) {
+ var child = node[i];
+ if (isValidElement(child)) {
+ validateExplicitKey(child, parentType);
+ }
+ }
+ } else if (isValidElement(node)) {
+ // This element was passed in a valid location.
+ if (node._store) {
+ node._store.validated = true;
+ }
+ } else if (node) {
+ var iteratorFn = getIteratorFn(node);
+ if (typeof iteratorFn === "function") {
+ // Entry iterators used to provide implicit keys,
+ // but now we print a separate warning for them later.
+ if (iteratorFn !== node.entries) {
+ var iterator = iteratorFn.call(node);
+ var step;
+ while (!(step = iterator.next()).done) {
+ if (isValidElement(step.value)) {
+ validateExplicitKey(step.value, parentType);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Given an element, validate that its props follow the propTypes definition,
+ * provided by the type.
+ *
+ * @param {ReactElement} element
+ */
+ function validatePropTypes(element) {
+ var componentClass = element.type;
+ if (typeof componentClass !== "function") {
+ return;
+ }
+ var name = componentClass.displayName || componentClass.name;
+ var propTypes = componentClass.propTypes;
+ if (propTypes) {
+ currentlyValidatingElement = element;
+ checkPropTypes(
+ propTypes,
+ element.props,
+ "prop",
+ name,
+ getStackAddendum
+ );
+ currentlyValidatingElement = null;
+ } else if (
+ componentClass.PropTypes !== undefined &&
+ !propTypesMisspellWarningShown
+ ) {
+ propTypesMisspellWarningShown = true;
+ warning(
+ false,
+ "Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?",
+ name || "Unknown"
+ );
+ }
+ if (typeof componentClass.getDefaultProps === "function") {
+ warning(
+ componentClass.getDefaultProps.isReactClassApproved,
+ "getDefaultProps is only used on classic React.createClass " +
+ "definitions. Use a static property named `defaultProps` instead."
+ );
+ }
+ }
+
+ /**
+ * Given a fragment, validate that it can only be provided with fragment props
+ * @param {ReactElement} fragment
+ */
+ function validateFragmentProps(fragment) {
+ currentlyValidatingElement = fragment;
+
+ var _iteratorNormalCompletion = true;
+ var _didIteratorError = false;
+ var _iteratorError = undefined;
+
+ try {
+ for (
+ var _iterator = Object.keys(fragment.props)[
+ Symbol.iterator
+ ](),
+ _step;
+ !(_iteratorNormalCompletion = (_step = _iterator.next())
+ .done);
+ _iteratorNormalCompletion = true
+ ) {
+ var key = _step.value;
+
+ if (!VALID_FRAGMENT_PROPS.has(key)) {
+ warning(
+ false,
+ "Invalid prop `%s` supplied to `React.Fragment`. " +
+ "React.Fragment can only have `key` and `children` props.%s",
+ key,
+ getStackAddendum()
+ );
+ break;
+ }
+ }
+ } catch (err) {
+ _didIteratorError = true;
+ _iteratorError = err;
+ } finally {
+ try {
+ if (!_iteratorNormalCompletion && _iterator["return"]) {
+ _iterator["return"]();
+ }
+ } finally {
+ if (_didIteratorError) {
+ throw _iteratorError;
+ }
+ }
+ }
+
+ if (fragment.ref !== null) {
+ warning(
+ false,
+ "Invalid attribute `ref` supplied to `React.Fragment`.%s",
+ getStackAddendum()
+ );
+ }
+
+ currentlyValidatingElement = null;
+ }
+
+ function createElementWithValidation(type, props, children) {
+ var validType =
+ typeof type === "string" ||
+ typeof type === "function" ||
+ typeof type === "symbol" ||
+ typeof type === "number";
+ // We warn in this case but don't throw. We expect the element creation to
+ // succeed and there will likely be errors in render.
+ if (!validType) {
+ var info = "";
+ if (
+ type === undefined ||
+ (typeof type === "object" &&
+ type !== null &&
+ Object.keys(type).length === 0)
+ ) {
+ info +=
+ " You likely forgot to export your component from the file " +
+ "it's defined in, or you might have mixed up default and named imports.";
+ }
+
+ var sourceInfo = getSourceInfoErrorAddendum(props);
+ if (sourceInfo) {
+ info += sourceInfo;
+ } else {
+ info += getDeclarationErrorAddendum();
+ }
+
+ info += getStackAddendum() || "";
+
+ warning(
+ false,
+ "React.createElement: type is invalid -- expected a string (for " +
+ "built-in components) or a class/function (for composite " +
+ "components) but got: %s.%s",
+ type == null ? type : typeof type,
+ info
+ );
+ }
+
+ var element = createElement.apply(this, arguments);
+
+ // The result can be nullish if a mock or a custom function is used.
+ // TODO: Drop this when these are no longer allowed as the type argument.
+ if (element == null) {
+ return element;
+ }
+
+ // Skip key warning if the type isn't valid since our key validation logic
+ // doesn't expect a non-string/function type and can throw confusing errors.
+ // We don't want exception behavior to differ between dev and prod.
+ // (Rendering will throw with a helpful message and as soon as the type is
+ // fixed, the key warnings will appear.)
+ if (validType) {
+ for (var i = 2; i < arguments.length; i++) {
+ validateChildKeys(arguments[i], type);
+ }
+ }
+
+ if (typeof type === "symbol" && type === REACT_FRAGMENT_TYPE) {
+ validateFragmentProps(element);
+ } else {
+ validatePropTypes(element);
+ }
+
+ return element;
+ }
+
+ function createFactoryWithValidation(type) {
+ var validatedFactory = createElementWithValidation.bind(
+ null,
+ type
+ );
+ // Legacy hook TODO: Warn if this is accessed
+ validatedFactory.type = type;
+
+ {
+ Object.defineProperty(validatedFactory, "type", {
+ enumerable: false,
+ get: function() {
+ lowPriorityWarning$1(
+ false,
+ "Factory.type is deprecated. Access the class directly " +
+ "before passing it to createFactory."
+ );
+ Object.defineProperty(this, "type", {
+ value: type
+ });
+ return type;
+ }
+ });
+ }
+
+ return validatedFactory;
+ }
+
+ function cloneElementWithValidation(element, props, children) {
+ var newElement = cloneElement.apply(this, arguments);
+ for (var i = 2; i < arguments.length; i++) {
+ validateChildKeys(arguments[i], newElement.type);
+ }
+ validatePropTypes(newElement);
+ return newElement;
+ }
+
+ var React = {
+ Children: {
+ map: mapChildren,
+ forEach: forEachChildren,
+ count: countChildren,
+ toArray: toArray,
+ only: onlyChild
+ },
+
+ Component: Component,
+ PureComponent: PureComponent,
+ unstable_AsyncComponent: AsyncComponent,
+
+ Fragment: REACT_FRAGMENT_TYPE,
+
+ createElement: createElementWithValidation,
+ cloneElement: cloneElementWithValidation,
+ createFactory: createFactoryWithValidation,
+ isValidElement: isValidElement,
+
+ version: ReactVersion,
+
+ __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: {
+ ReactCurrentOwner: ReactCurrentOwner,
+ // Used by renderers to avoid bundling object-assign twice in UMD bundles:
+ assign: _assign
+ }
+ };
+
+ {
+ _assign(
+ React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,
+ {
+ // These should not be included in production.
+ ReactDebugCurrentFrame: ReactDebugCurrentFrame,
+ // Shim for React DOM 16.0.0 which still destructured (but not used) this.
+ // TODO: remove in React 17.0.
+ ReactComponentTreeHook: {}
+ }
+ );
+ }
+
+ var React$2 = Object.freeze({
+ default: React
+ });
+
+ var React$3 = (React$2 && React) || React$2;
+
+ // TODO: decide on the top-level export form.
+ // This is hacky but makes it work with both Rollup and Jest.
+ var react = React$3["default"] ? React$3["default"] : React$3;
+
+ module.exports = react;
+ })();
+ }
+
+ /***/
+ },
+
+ /***/ "./node_modules/react/index.js":
+ /*!*************************************!*\
+ !*** ./node_modules/react/index.js ***!
+ \*************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ if (false) {
+ module.exports = require("./cjs/react.production.min.js");
+ } else {
+ module.exports = __webpack_require__(
+ /*! ./cjs/react.development.js */ "./node_modules/react/cjs/react.development.js"
+ );
+ }
+
+ /***/
+ },
+
+ /***/ "./node_modules/requires-port/index.js":
+ /*!*********************************************!*\
+ !*** ./node_modules/requires-port/index.js ***!
+ \*********************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ /**
+ * Check if we're required to add a port number.
+ *
+ * @see https://url.spec.whatwg.org/#default-port
+ * @param {Number|String} port Port number we need to check
+ * @param {String} protocol Protocol we need to check against.
+ * @returns {Boolean} Is it a default port for the given protocol
+ * @api private
+ */
+ module.exports = function required(port, protocol) {
+ protocol = protocol.split(":")[0];
+ port = +port;
+
+ if (!port) return false;
+
+ switch (protocol) {
+ case "http":
+ case "ws":
+ return port !== 80;
+
+ case "https":
+ case "wss":
+ return port !== 443;
+
+ case "ftp":
+ return port !== 21;
+
+ case "gopher":
+ return port !== 70;
+
+ case "file":
+ return false;
+ }
+
+ return port !== 0;
+ };
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/entry.js":
+ /*!*************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/entry.js ***!
+ \*************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /* WEBPACK VAR INJECTION */ (function(global) {
+ var transportList = __webpack_require__(
+ /*! ./transport-list */ "./node_modules/sockjs-client/lib/transport-list.js"
+ );
+
+ module.exports = __webpack_require__(
+ /*! ./main */ "./node_modules/sockjs-client/lib/main.js"
+ )(transportList);
+
+ // TODO can't get rid of this until all servers do
+ if ("_sockjs_onload" in global) {
+ setTimeout(global._sockjs_onload, 1);
+ }
+
+ /* WEBPACK VAR INJECTION */
+ }.call(
+ exports,
+ __webpack_require__(
+ /*! ./../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"
+ )
+ ));
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/event/close.js":
+ /*!*******************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/event/close.js ***!
+ \*******************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ var inherits = __webpack_require__(
+ /*! inherits */ "./node_modules/inherits/inherits_browser.js"
+ ),
+ Event = __webpack_require__(
+ /*! ./event */ "./node_modules/sockjs-client/lib/event/event.js"
+ );
+
+ function CloseEvent() {
+ Event.call(this);
+ this.initEvent("close", false, false);
+ this.wasClean = false;
+ this.code = 0;
+ this.reason = "";
+ }
+
+ inherits(CloseEvent, Event);
+
+ module.exports = CloseEvent;
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/event/emitter.js":
+ /*!*********************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/event/emitter.js ***!
+ \*********************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ var inherits = __webpack_require__(
+ /*! inherits */ "./node_modules/inherits/inherits_browser.js"
+ ),
+ EventTarget = __webpack_require__(
+ /*! ./eventtarget */ "./node_modules/sockjs-client/lib/event/eventtarget.js"
+ );
+
+ function EventEmitter() {
+ EventTarget.call(this);
+ }
+
+ inherits(EventEmitter, EventTarget);
+
+ EventEmitter.prototype.removeAllListeners = function(type) {
+ if (type) {
+ delete this._listeners[type];
+ } else {
+ this._listeners = {};
+ }
+ };
+
+ EventEmitter.prototype.once = function(type, listener) {
+ var self = this,
+ fired = false;
+
+ function g() {
+ self.removeListener(type, g);
+
+ if (!fired) {
+ fired = true;
+ listener.apply(this, arguments);
+ }
+ }
+
+ this.on(type, g);
+ };
+
+ EventEmitter.prototype.emit = function() {
+ var type = arguments[0];
+ var listeners = this._listeners[type];
+ if (!listeners) {
+ return;
+ }
+ // equivalent of Array.prototype.slice.call(arguments, 1);
+ var l = arguments.length;
+ var args = new Array(l - 1);
+ for (var ai = 1; ai < l; ai++) {
+ args[ai - 1] = arguments[ai];
+ }
+ for (var i = 0; i < listeners.length; i++) {
+ listeners[i].apply(this, args);
+ }
+ };
+
+ EventEmitter.prototype.on = EventEmitter.prototype.addListener =
+ EventTarget.prototype.addEventListener;
+ EventEmitter.prototype.removeListener =
+ EventTarget.prototype.removeEventListener;
+
+ module.exports.EventEmitter = EventEmitter;
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/event/event.js":
+ /*!*******************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/event/event.js ***!
+ \*******************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ function Event(eventType) {
+ this.type = eventType;
+ }
+
+ Event.prototype.initEvent = function(eventType, canBubble, cancelable) {
+ this.type = eventType;
+ this.bubbles = canBubble;
+ this.cancelable = cancelable;
+ this.timeStamp = +new Date();
+ return this;
+ };
+
+ Event.prototype.stopPropagation = function() {};
+ Event.prototype.preventDefault = function() {};
+
+ Event.CAPTURING_PHASE = 1;
+ Event.AT_TARGET = 2;
+ Event.BUBBLING_PHASE = 3;
+
+ module.exports = Event;
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/event/eventtarget.js":
+ /*!*************************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/event/eventtarget.js ***!
+ \*************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ /* Simplified implementation of DOM2 EventTarget.
+ * http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-EventTarget
+ */
+
+ function EventTarget() {
+ this._listeners = {};
+ }
+
+ EventTarget.prototype.addEventListener = function(eventType, listener) {
+ if (!(eventType in this._listeners)) {
+ this._listeners[eventType] = [];
+ }
+ var arr = this._listeners[eventType];
+ // #4
+ if (arr.indexOf(listener) === -1) {
+ // Make a copy so as not to interfere with a current dispatchEvent.
+ arr = arr.concat([listener]);
+ }
+ this._listeners[eventType] = arr;
+ };
+
+ EventTarget.prototype.removeEventListener = function(
+ eventType,
+ listener
+ ) {
+ var arr = this._listeners[eventType];
+ if (!arr) {
+ return;
+ }
+ var idx = arr.indexOf(listener);
+ if (idx !== -1) {
+ if (arr.length > 1) {
+ // Make a copy so as not to interfere with a current dispatchEvent.
+ this._listeners[eventType] = arr
+ .slice(0, idx)
+ .concat(arr.slice(idx + 1));
+ } else {
+ delete this._listeners[eventType];
+ }
+ return;
+ }
+ };
+
+ EventTarget.prototype.dispatchEvent = function() {
+ var event = arguments[0];
+ var t = event.type;
+ // equivalent of Array.prototype.slice.call(arguments, 0);
+ var args =
+ arguments.length === 1 ? [event] : Array.apply(null, arguments);
+ // TODO: This doesn't match the real behavior; per spec, onfoo get
+ // their place in line from the /first/ time they're set from
+ // non-null. Although WebKit bumps it to the end every time it's
+ // set.
+ if (this["on" + t]) {
+ this["on" + t].apply(this, args);
+ }
+ if (t in this._listeners) {
+ // Grab a reference to the listeners list. removeEventListener may alter the list.
+ var listeners = this._listeners[t];
+ for (var i = 0; i < listeners.length; i++) {
+ listeners[i].apply(this, args);
+ }
+ }
+ };
+
+ module.exports = EventTarget;
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/event/trans-message.js":
+ /*!***************************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/event/trans-message.js ***!
+ \***************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ var inherits = __webpack_require__(
+ /*! inherits */ "./node_modules/inherits/inherits_browser.js"
+ ),
+ Event = __webpack_require__(
+ /*! ./event */ "./node_modules/sockjs-client/lib/event/event.js"
+ );
+
+ function TransportMessageEvent(data) {
+ Event.call(this);
+ this.initEvent("message", false, false);
+ this.data = data;
+ }
+
+ inherits(TransportMessageEvent, Event);
+
+ module.exports = TransportMessageEvent;
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/facade.js":
+ /*!**************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/facade.js ***!
+ \**************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ var JSON3 = __webpack_require__(
+ /*! json3 */ "./node_modules/json3/lib/json3.js"
+ ),
+ iframeUtils = __webpack_require__(
+ /*! ./utils/iframe */ "./node_modules/sockjs-client/lib/utils/iframe.js"
+ );
+
+ function FacadeJS(transport) {
+ this._transport = transport;
+ transport.on("message", this._transportMessage.bind(this));
+ transport.on("close", this._transportClose.bind(this));
+ }
+
+ FacadeJS.prototype._transportClose = function(code, reason) {
+ iframeUtils.postMessage("c", JSON3.stringify([code, reason]));
+ };
+ FacadeJS.prototype._transportMessage = function(frame) {
+ iframeUtils.postMessage("t", frame);
+ };
+ FacadeJS.prototype._send = function(data) {
+ this._transport.send(data);
+ };
+ FacadeJS.prototype._close = function() {
+ this._transport.close();
+ this._transport.removeAllListeners();
+ };
+
+ module.exports = FacadeJS;
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/iframe-bootstrap.js":
+ /*!************************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/iframe-bootstrap.js ***!
+ \************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ var urlUtils = __webpack_require__(
+ /*! ./utils/url */ "./node_modules/sockjs-client/lib/utils/url.js"
+ ),
+ eventUtils = __webpack_require__(
+ /*! ./utils/event */ "./node_modules/sockjs-client/lib/utils/event.js"
+ ),
+ JSON3 = __webpack_require__(
+ /*! json3 */ "./node_modules/json3/lib/json3.js"
+ ),
+ FacadeJS = __webpack_require__(
+ /*! ./facade */ "./node_modules/sockjs-client/lib/facade.js"
+ ),
+ InfoIframeReceiver = __webpack_require__(
+ /*! ./info-iframe-receiver */ "./node_modules/sockjs-client/lib/info-iframe-receiver.js"
+ ),
+ iframeUtils = __webpack_require__(
+ /*! ./utils/iframe */ "./node_modules/sockjs-client/lib/utils/iframe.js"
+ ),
+ loc = __webpack_require__(
+ /*! ./location */ "./node_modules/sockjs-client/lib/location.js"
+ );
+
+ var debug = function() {};
+ if (true) {
+ debug = __webpack_require__(
+ /*! debug */ "./node_modules/sockjs-client/node_modules/debug/src/browser.js"
+ )("sockjs-client:iframe-bootstrap");
+ }
+
+ module.exports = function(SockJS, availableTransports) {
+ var transportMap = {};
+ availableTransports.forEach(function(at) {
+ if (at.facadeTransport) {
+ transportMap[at.facadeTransport.transportName] =
+ at.facadeTransport;
+ }
+ });
+
+ // hard-coded for the info iframe
+ // TODO see if we can make this more dynamic
+ transportMap[InfoIframeReceiver.transportName] = InfoIframeReceiver;
+ var parentOrigin;
+
+ /* eslint-disable camelcase */
+ SockJS.bootstrap_iframe = function() {
+ /* eslint-enable camelcase */
+ var facade;
+ iframeUtils.currentWindowId = loc.hash.slice(1);
+ var onMessage = function(e) {
+ if (e.source !== parent) {
+ return;
+ }
+ if (typeof parentOrigin === "undefined") {
+ parentOrigin = e.origin;
+ }
+ if (e.origin !== parentOrigin) {
+ return;
+ }
+
+ var iframeMessage;
+ try {
+ iframeMessage = JSON3.parse(e.data);
+ } catch (ignored) {
+ debug("bad json", e.data);
+ return;
+ }
+
+ if (iframeMessage.windowId !== iframeUtils.currentWindowId) {
+ return;
+ }
+ switch (iframeMessage.type) {
+ case "s":
+ var p;
+ try {
+ p = JSON3.parse(iframeMessage.data);
+ } catch (ignored) {
+ debug("bad json", iframeMessage.data);
+ break;
+ }
+ var version = p[0];
+ var transport = p[1];
+ var transUrl = p[2];
+ var baseUrl = p[3];
+ debug(version, transport, transUrl, baseUrl);
+ // change this to semver logic
+ if (version !== SockJS.version) {
+ throw new Error(
+ "Incompatible SockJS! Main site uses:" +
+ ' "' +
+ version +
+ '", the iframe:' +
+ ' "' +
+ SockJS.version +
+ '".'
+ );
+ }
+
+ if (
+ !urlUtils.isOriginEqual(transUrl, loc.href) ||
+ !urlUtils.isOriginEqual(baseUrl, loc.href)
+ ) {
+ throw new Error(
+ "Can't connect to different domain from within an " +
+ "iframe. (" +
+ loc.href +
+ ", " +
+ transUrl +
+ ", " +
+ baseUrl +
+ ")"
+ );
+ }
+ facade = new FacadeJS(
+ new transportMap[transport](transUrl, baseUrl)
+ );
+ break;
+ case "m":
+ facade._send(iframeMessage.data);
+ break;
+ case "c":
+ if (facade) {
+ facade._close();
+ }
+ facade = null;
+ break;
+ }
+ };
+
+ eventUtils.attachEvent("message", onMessage);
+
+ // Start
+ iframeUtils.postMessage("s");
+ };
+ };
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/info-ajax.js":
+ /*!*****************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/info-ajax.js ***!
+ \*****************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ var EventEmitter = __webpack_require__(
+ /*! events */ "./node_modules/sockjs-client/lib/event/emitter.js"
+ ).EventEmitter,
+ inherits = __webpack_require__(
+ /*! inherits */ "./node_modules/inherits/inherits_browser.js"
+ ),
+ JSON3 = __webpack_require__(
+ /*! json3 */ "./node_modules/json3/lib/json3.js"
+ ),
+ objectUtils = __webpack_require__(
+ /*! ./utils/object */ "./node_modules/sockjs-client/lib/utils/object.js"
+ );
+
+ var debug = function() {};
+ if (true) {
+ debug = __webpack_require__(
+ /*! debug */ "./node_modules/sockjs-client/node_modules/debug/src/browser.js"
+ )("sockjs-client:info-ajax");
+ }
+
+ function InfoAjax(url, AjaxObject) {
+ EventEmitter.call(this);
+
+ var self = this;
+ var t0 = +new Date();
+ this.xo = new AjaxObject("GET", url);
+
+ this.xo.once("finish", function(status, text) {
+ var info, rtt;
+ if (status === 200) {
+ rtt = +new Date() - t0;
+ if (text) {
+ try {
+ info = JSON3.parse(text);
+ } catch (e) {
+ debug("bad json", text);
+ }
+ }
+
+ if (!objectUtils.isObject(info)) {
+ info = {};
+ }
+ }
+ self.emit("finish", info, rtt);
+ self.removeAllListeners();
+ });
+ }
+
+ inherits(InfoAjax, EventEmitter);
+
+ InfoAjax.prototype.close = function() {
+ this.removeAllListeners();
+ this.xo.close();
+ };
+
+ module.exports = InfoAjax;
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/info-iframe-receiver.js":
+ /*!****************************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/info-iframe-receiver.js ***!
+ \****************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ var inherits = __webpack_require__(
+ /*! inherits */ "./node_modules/inherits/inherits_browser.js"
+ ),
+ EventEmitter = __webpack_require__(
+ /*! events */ "./node_modules/sockjs-client/lib/event/emitter.js"
+ ).EventEmitter,
+ JSON3 = __webpack_require__(
+ /*! json3 */ "./node_modules/json3/lib/json3.js"
+ ),
+ XHRLocalObject = __webpack_require__(
+ /*! ./transport/sender/xhr-local */ "./node_modules/sockjs-client/lib/transport/sender/xhr-local.js"
+ ),
+ InfoAjax = __webpack_require__(
+ /*! ./info-ajax */ "./node_modules/sockjs-client/lib/info-ajax.js"
+ );
+
+ function InfoReceiverIframe(transUrl) {
+ var self = this;
+ EventEmitter.call(this);
+
+ this.ir = new InfoAjax(transUrl, XHRLocalObject);
+ this.ir.once("finish", function(info, rtt) {
+ self.ir = null;
+ self.emit("message", JSON3.stringify([info, rtt]));
+ });
+ }
+
+ inherits(InfoReceiverIframe, EventEmitter);
+
+ InfoReceiverIframe.transportName = "iframe-info-receiver";
+
+ InfoReceiverIframe.prototype.close = function() {
+ if (this.ir) {
+ this.ir.close();
+ this.ir = null;
+ }
+ this.removeAllListeners();
+ };
+
+ module.exports = InfoReceiverIframe;
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/info-iframe.js":
+ /*!*******************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/info-iframe.js ***!
+ \*******************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /* WEBPACK VAR INJECTION */ (function(global) {
+ var EventEmitter = __webpack_require__(
+ /*! events */ "./node_modules/sockjs-client/lib/event/emitter.js"
+ ).EventEmitter,
+ inherits = __webpack_require__(
+ /*! inherits */ "./node_modules/inherits/inherits_browser.js"
+ ),
+ JSON3 = __webpack_require__(
+ /*! json3 */ "./node_modules/json3/lib/json3.js"
+ ),
+ utils = __webpack_require__(
+ /*! ./utils/event */ "./node_modules/sockjs-client/lib/utils/event.js"
+ ),
+ IframeTransport = __webpack_require__(
+ /*! ./transport/iframe */ "./node_modules/sockjs-client/lib/transport/iframe.js"
+ ),
+ InfoReceiverIframe = __webpack_require__(
+ /*! ./info-iframe-receiver */ "./node_modules/sockjs-client/lib/info-iframe-receiver.js"
+ );
+
+ var debug = function() {};
+ if (true) {
+ debug = __webpack_require__(
+ /*! debug */ "./node_modules/sockjs-client/node_modules/debug/src/browser.js"
+ )("sockjs-client:info-iframe");
+ }
+
+ function InfoIframe(baseUrl, url) {
+ var self = this;
+ EventEmitter.call(this);
+
+ var go = function() {
+ var ifr = (self.ifr = new IframeTransport(
+ InfoReceiverIframe.transportName,
+ url,
+ baseUrl
+ ));
+
+ ifr.once("message", function(msg) {
+ if (msg) {
+ var d;
+ try {
+ d = JSON3.parse(msg);
+ } catch (e) {
+ debug("bad json", msg);
+ self.emit("finish");
+ self.close();
+ return;
+ }
+
+ var info = d[0],
+ rtt = d[1];
+ self.emit("finish", info, rtt);
+ }
+ self.close();
+ });
+
+ ifr.once("close", function() {
+ self.emit("finish");
+ self.close();
+ });
+ };
+
+ // TODO this seems the same as the 'needBody' from transports
+ if (!global.document.body) {
+ utils.attachEvent("load", go);
+ } else {
+ go();
+ }
+ }
+
+ inherits(InfoIframe, EventEmitter);
+
+ InfoIframe.enabled = function() {
+ return IframeTransport.enabled();
+ };
+
+ InfoIframe.prototype.close = function() {
+ if (this.ifr) {
+ this.ifr.close();
+ }
+ this.removeAllListeners();
+ this.ifr = null;
+ };
+
+ module.exports = InfoIframe;
+
+ /* WEBPACK VAR INJECTION */
+ }.call(
+ exports,
+ __webpack_require__(
+ /*! ./../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"
+ )
+ ));
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/info-receiver.js":
+ /*!*********************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/info-receiver.js ***!
+ \*********************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ var EventEmitter = __webpack_require__(
+ /*! events */ "./node_modules/sockjs-client/lib/event/emitter.js"
+ ).EventEmitter,
+ inherits = __webpack_require__(
+ /*! inherits */ "./node_modules/inherits/inherits_browser.js"
+ ),
+ urlUtils = __webpack_require__(
+ /*! ./utils/url */ "./node_modules/sockjs-client/lib/utils/url.js"
+ ),
+ XDR = __webpack_require__(
+ /*! ./transport/sender/xdr */ "./node_modules/sockjs-client/lib/transport/sender/xdr.js"
+ ),
+ XHRCors = __webpack_require__(
+ /*! ./transport/sender/xhr-cors */ "./node_modules/sockjs-client/lib/transport/sender/xhr-cors.js"
+ ),
+ XHRLocal = __webpack_require__(
+ /*! ./transport/sender/xhr-local */ "./node_modules/sockjs-client/lib/transport/sender/xhr-local.js"
+ ),
+ XHRFake = __webpack_require__(
+ /*! ./transport/sender/xhr-fake */ "./node_modules/sockjs-client/lib/transport/sender/xhr-fake.js"
+ ),
+ InfoIframe = __webpack_require__(
+ /*! ./info-iframe */ "./node_modules/sockjs-client/lib/info-iframe.js"
+ ),
+ InfoAjax = __webpack_require__(
+ /*! ./info-ajax */ "./node_modules/sockjs-client/lib/info-ajax.js"
+ );
+
+ var debug = function() {};
+ if (true) {
+ debug = __webpack_require__(
+ /*! debug */ "./node_modules/sockjs-client/node_modules/debug/src/browser.js"
+ )("sockjs-client:info-receiver");
+ }
+
+ function InfoReceiver(baseUrl, urlInfo) {
+ debug(baseUrl);
+ var self = this;
+ EventEmitter.call(this);
+
+ setTimeout(function() {
+ self.doXhr(baseUrl, urlInfo);
+ }, 0);
+ }
+
+ inherits(InfoReceiver, EventEmitter);
+
+ // TODO this is currently ignoring the list of available transports and the whitelist
+
+ InfoReceiver._getReceiver = function(baseUrl, url, urlInfo) {
+ // determine method of CORS support (if needed)
+ if (urlInfo.sameOrigin) {
+ return new InfoAjax(url, XHRLocal);
+ }
+ if (XHRCors.enabled) {
+ return new InfoAjax(url, XHRCors);
+ }
+ if (XDR.enabled && urlInfo.sameScheme) {
+ return new InfoAjax(url, XDR);
+ }
+ if (InfoIframe.enabled()) {
+ return new InfoIframe(baseUrl, url);
+ }
+ return new InfoAjax(url, XHRFake);
+ };
+
+ InfoReceiver.prototype.doXhr = function(baseUrl, urlInfo) {
+ var self = this,
+ url = urlUtils.addPath(baseUrl, "/info");
+ debug("doXhr", url);
+
+ this.xo = InfoReceiver._getReceiver(baseUrl, url, urlInfo);
+
+ this.timeoutRef = setTimeout(function() {
+ debug("timeout");
+ self._cleanup(false);
+ self.emit("finish");
+ }, InfoReceiver.timeout);
+
+ this.xo.once("finish", function(info, rtt) {
+ debug("finish", info, rtt);
+ self._cleanup(true);
+ self.emit("finish", info, rtt);
+ });
+ };
+
+ InfoReceiver.prototype._cleanup = function(wasClean) {
+ debug("_cleanup");
+ clearTimeout(this.timeoutRef);
+ this.timeoutRef = null;
+ if (!wasClean && this.xo) {
+ this.xo.close();
+ }
+ this.xo = null;
+ };
+
+ InfoReceiver.prototype.close = function() {
+ debug("close");
+ this.removeAllListeners();
+ this._cleanup(false);
+ };
+
+ InfoReceiver.timeout = 8000;
+
+ module.exports = InfoReceiver;
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/location.js":
+ /*!****************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/location.js ***!
+ \****************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /* WEBPACK VAR INJECTION */ (function(global) {
+ module.exports = global.location || {
+ origin: "http://localhost:80",
+ protocol: "http",
+ host: "localhost",
+ port: 80,
+ href: "http://localhost/",
+ hash: ""
+ };
+
+ /* WEBPACK VAR INJECTION */
+ }.call(
+ exports,
+ __webpack_require__(
+ /*! ./../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"
+ )
+ ));
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/main.js":
+ /*!************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/main.js ***!
+ \************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /* WEBPACK VAR INJECTION */ (function(global) {
+ __webpack_require__(
+ /*! ./shims */ "./node_modules/sockjs-client/lib/shims.js"
+ );
+
+ var URL = __webpack_require__(
+ /*! url-parse */ "./node_modules/url-parse/index.js"
+ ),
+ inherits = __webpack_require__(
+ /*! inherits */ "./node_modules/inherits/inherits_browser.js"
+ ),
+ JSON3 = __webpack_require__(
+ /*! json3 */ "./node_modules/json3/lib/json3.js"
+ ),
+ random = __webpack_require__(
+ /*! ./utils/random */ "./node_modules/sockjs-client/lib/utils/random.js"
+ ),
+ escape = __webpack_require__(
+ /*! ./utils/escape */ "./node_modules/sockjs-client/lib/utils/escape.js"
+ ),
+ urlUtils = __webpack_require__(
+ /*! ./utils/url */ "./node_modules/sockjs-client/lib/utils/url.js"
+ ),
+ eventUtils = __webpack_require__(
+ /*! ./utils/event */ "./node_modules/sockjs-client/lib/utils/event.js"
+ ),
+ transport = __webpack_require__(
+ /*! ./utils/transport */ "./node_modules/sockjs-client/lib/utils/transport.js"
+ ),
+ objectUtils = __webpack_require__(
+ /*! ./utils/object */ "./node_modules/sockjs-client/lib/utils/object.js"
+ ),
+ browser = __webpack_require__(
+ /*! ./utils/browser */ "./node_modules/sockjs-client/lib/utils/browser.js"
+ ),
+ log = __webpack_require__(
+ /*! ./utils/log */ "./node_modules/sockjs-client/lib/utils/log.js"
+ ),
+ Event = __webpack_require__(
+ /*! ./event/event */ "./node_modules/sockjs-client/lib/event/event.js"
+ ),
+ EventTarget = __webpack_require__(
+ /*! ./event/eventtarget */ "./node_modules/sockjs-client/lib/event/eventtarget.js"
+ ),
+ loc = __webpack_require__(
+ /*! ./location */ "./node_modules/sockjs-client/lib/location.js"
+ ),
+ CloseEvent = __webpack_require__(
+ /*! ./event/close */ "./node_modules/sockjs-client/lib/event/close.js"
+ ),
+ TransportMessageEvent = __webpack_require__(
+ /*! ./event/trans-message */ "./node_modules/sockjs-client/lib/event/trans-message.js"
+ ),
+ InfoReceiver = __webpack_require__(
+ /*! ./info-receiver */ "./node_modules/sockjs-client/lib/info-receiver.js"
+ );
+
+ var debug = function() {};
+ if (true) {
+ debug = __webpack_require__(
+ /*! debug */ "./node_modules/sockjs-client/node_modules/debug/src/browser.js"
+ )("sockjs-client:main");
+ }
+
+ var transports;
+
+ // follow constructor steps defined at http://dev.w3.org/html5/websockets/#the-websocket-interface
+ function SockJS(url, protocols, options) {
+ if (!(this instanceof SockJS)) {
+ return new SockJS(url, protocols, options);
+ }
+ if (arguments.length < 1) {
+ throw new TypeError(
+ "Failed to construct 'SockJS: 1 argument required, but only 0 present"
+ );
+ }
+ EventTarget.call(this);
+
+ this.readyState = SockJS.CONNECTING;
+ this.extensions = "";
+ this.protocol = "";
+
+ // non-standard extension
+ options = options || {};
+ if (options.protocols_whitelist) {
+ log.warn(
+ "'protocols_whitelist' is DEPRECATED. Use 'transports' instead."
+ );
+ }
+ this._transportsWhitelist = options.transports;
+ this._transportOptions = options.transportOptions || {};
+
+ var sessionId = options.sessionId || 8;
+ if (typeof sessionId === "function") {
+ this._generateSessionId = sessionId;
+ } else if (typeof sessionId === "number") {
+ this._generateSessionId = function() {
+ return random.string(sessionId);
+ };
+ } else {
+ throw new TypeError(
+ "If sessionId is used in the options, it needs to be a number or a function."
+ );
+ }
+
+ this._server = options.server || random.numberString(1000);
+
+ // Step 1 of WS spec - parse and validate the url. Issue #8
+ var parsedUrl = new URL(url);
+ if (!parsedUrl.host || !parsedUrl.protocol) {
+ throw new SyntaxError("The URL '" + url + "' is invalid");
+ } else if (parsedUrl.hash) {
+ throw new SyntaxError("The URL must not contain a fragment");
+ } else if (
+ parsedUrl.protocol !== "http:" &&
+ parsedUrl.protocol !== "https:"
+ ) {
+ throw new SyntaxError(
+ "The URL's scheme must be either 'http:' or 'https:'. '" +
+ parsedUrl.protocol +
+ "' is not allowed."
+ );
+ }
+
+ var secure = parsedUrl.protocol === "https:";
+ // Step 2 - don't allow secure origin with an insecure protocol
+ if (loc.protocol === "https" && !secure) {
+ throw new Error(
+ "SecurityError: An insecure SockJS connection may not be initiated from a page loaded over HTTPS"
+ );
+ }
+
+ // Step 3 - check port access - no need here
+ // Step 4 - parse protocols argument
+ if (!protocols) {
+ protocols = [];
+ } else if (!Array.isArray(protocols)) {
+ protocols = [protocols];
+ }
+
+ // Step 5 - check protocols argument
+ var sortedProtocols = protocols.sort();
+ sortedProtocols.forEach(function(proto, i) {
+ if (!proto) {
+ throw new SyntaxError(
+ "The protocols entry '" + proto + "' is invalid."
+ );
+ }
+ if (
+ i < sortedProtocols.length - 1 &&
+ proto === sortedProtocols[i + 1]
+ ) {
+ throw new SyntaxError(
+ "The protocols entry '" + proto + "' is duplicated."
+ );
+ }
+ });
+
+ // Step 6 - convert origin
+ var o = urlUtils.getOrigin(loc.href);
+ this._origin = o ? o.toLowerCase() : null;
+
+ // remove the trailing slash
+ parsedUrl.set("pathname", parsedUrl.pathname.replace(/\/+$/, ""));
+
+ // store the sanitized url
+ this.url = parsedUrl.href;
+ debug("using url", this.url);
+
+ // Step 7 - start connection in background
+ // obtain server info
+ // http://sockjs.github.io/sockjs-protocol/sockjs-protocol-0.3.3.html#section-26
+ this._urlInfo = {
+ nullOrigin: !browser.hasDomain(),
+ sameOrigin: urlUtils.isOriginEqual(this.url, loc.href),
+ sameScheme: urlUtils.isSchemeEqual(this.url, loc.href)
+ };
+
+ this._ir = new InfoReceiver(this.url, this._urlInfo);
+ this._ir.once("finish", this._receiveInfo.bind(this));
+ }
+
+ inherits(SockJS, EventTarget);
+
+ function userSetCode(code) {
+ return code === 1000 || (code >= 3000 && code <= 4999);
+ }
+
+ SockJS.prototype.close = function(code, reason) {
+ // Step 1
+ if (code && !userSetCode(code)) {
+ throw new Error("InvalidAccessError: Invalid code");
+ }
+ // Step 2.4 states the max is 123 bytes, but we are just checking length
+ if (reason && reason.length > 123) {
+ throw new SyntaxError("reason argument has an invalid length");
+ }
+
+ // Step 3.1
+ if (
+ this.readyState === SockJS.CLOSING ||
+ this.readyState === SockJS.CLOSED
+ ) {
+ return;
+ }
+
+ // TODO look at docs to determine how to set this
+ var wasClean = true;
+ this._close(code || 1000, reason || "Normal closure", wasClean);
+ };
+
+ SockJS.prototype.send = function(data) {
+ // #13 - convert anything non-string to string
+ // TODO this currently turns objects into [object Object]
+ if (typeof data !== "string") {
+ data = "" + data;
+ }
+ if (this.readyState === SockJS.CONNECTING) {
+ throw new Error(
+ "InvalidStateError: The connection has not been established yet"
+ );
+ }
+ if (this.readyState !== SockJS.OPEN) {
+ return;
+ }
+ this._transport.send(escape.quote(data));
+ };
+
+ SockJS.version = __webpack_require__(
+ /*! ./version */ "./node_modules/sockjs-client/lib/version.js"
+ );
+
+ SockJS.CONNECTING = 0;
+ SockJS.OPEN = 1;
+ SockJS.CLOSING = 2;
+ SockJS.CLOSED = 3;
+
+ SockJS.prototype._receiveInfo = function(info, rtt) {
+ debug("_receiveInfo", rtt);
+ this._ir = null;
+ if (!info) {
+ this._close(1002, "Cannot connect to server");
+ return;
+ }
+
+ // establish a round-trip timeout (RTO) based on the
+ // round-trip time (RTT)
+ this._rto = this.countRTO(rtt);
+ // allow server to override url used for the actual transport
+ this._transUrl = info.base_url ? info.base_url : this.url;
+ info = objectUtils.extend(info, this._urlInfo);
+ debug("info", info);
+ // determine list of desired and supported transports
+ var enabledTransports = transports.filterToEnabled(
+ this._transportsWhitelist,
+ info
+ );
+ this._transports = enabledTransports.main;
+ debug(this._transports.length + " enabled transports");
+
+ this._connect();
+ };
+
+ SockJS.prototype._connect = function() {
+ for (
+ var Transport = this._transports.shift();
+ Transport;
+ Transport = this._transports.shift()
+ ) {
+ debug("attempt", Transport.transportName);
+ if (Transport.needBody) {
+ if (
+ !global.document.body ||
+ (typeof global.document.readyState !== "undefined" &&
+ global.document.readyState !== "complete" &&
+ global.document.readyState !== "interactive")
+ ) {
+ debug("waiting for body");
+ this._transports.unshift(Transport);
+ eventUtils.attachEvent("load", this._connect.bind(this));
+ return;
+ }
+ }
+
+ // calculate timeout based on RTO and round trips. Default to 5s
+ var timeoutMs = this._rto * Transport.roundTrips || 5000;
+ this._transportTimeoutId = setTimeout(
+ this._transportTimeout.bind(this),
+ timeoutMs
+ );
+ debug("using timeout", timeoutMs);
+
+ var transportUrl = urlUtils.addPath(
+ this._transUrl,
+ "/" + this._server + "/" + this._generateSessionId()
+ );
+ var options = this._transportOptions[Transport.transportName];
+ debug("transport url", transportUrl);
+ var transportObj = new Transport(
+ transportUrl,
+ this._transUrl,
+ options
+ );
+ transportObj.on("message", this._transportMessage.bind(this));
+ transportObj.once("close", this._transportClose.bind(this));
+ transportObj.transportName = Transport.transportName;
+ this._transport = transportObj;
+
+ return;
+ }
+ this._close(2000, "All transports failed", false);
+ };
+
+ SockJS.prototype._transportTimeout = function() {
+ debug("_transportTimeout");
+ if (this.readyState === SockJS.CONNECTING) {
+ this._transportClose(2007, "Transport timed out");
+ }
+ };
+
+ SockJS.prototype._transportMessage = function(msg) {
+ debug("_transportMessage", msg);
+ var self = this,
+ type = msg.slice(0, 1),
+ content = msg.slice(1),
+ payload;
+
+ // first check for messages that don't need a payload
+ switch (type) {
+ case "o":
+ this._open();
+ return;
+ case "h":
+ this.dispatchEvent(new Event("heartbeat"));
+ debug("heartbeat", this.transport);
+ return;
+ }
+
+ if (content) {
+ try {
+ payload = JSON3.parse(content);
+ } catch (e) {
+ debug("bad json", content);
+ }
+ }
+
+ if (typeof payload === "undefined") {
+ debug("empty payload", content);
+ return;
+ }
+
+ switch (type) {
+ case "a":
+ if (Array.isArray(payload)) {
+ payload.forEach(function(p) {
+ debug("message", self.transport, p);
+ self.dispatchEvent(new TransportMessageEvent(p));
+ });
+ }
+ break;
+ case "m":
+ debug("message", this.transport, payload);
+ this.dispatchEvent(new TransportMessageEvent(payload));
+ break;
+ case "c":
+ if (Array.isArray(payload) && payload.length === 2) {
+ this._close(payload[0], payload[1], true);
+ }
+ break;
+ }
+ };
+
+ SockJS.prototype._transportClose = function(code, reason) {
+ debug("_transportClose", this.transport, code, reason);
+ if (this._transport) {
+ this._transport.removeAllListeners();
+ this._transport = null;
+ this.transport = null;
+ }
+
+ if (
+ !userSetCode(code) &&
+ code !== 2000 &&
+ this.readyState === SockJS.CONNECTING
+ ) {
+ this._connect();
+ return;
+ }
+
+ this._close(code, reason);
+ };
+
+ SockJS.prototype._open = function() {
+ debug("_open", this._transport.transportName, this.readyState);
+ if (this.readyState === SockJS.CONNECTING) {
+ if (this._transportTimeoutId) {
+ clearTimeout(this._transportTimeoutId);
+ this._transportTimeoutId = null;
+ }
+ this.readyState = SockJS.OPEN;
+ this.transport = this._transport.transportName;
+ this.dispatchEvent(new Event("open"));
+ debug("connected", this.transport);
+ } else {
+ // The server might have been restarted, and lost track of our
+ // connection.
+ this._close(1006, "Server lost session");
+ }
+ };
+
+ SockJS.prototype._close = function(code, reason, wasClean) {
+ debug(
+ "_close",
+ this.transport,
+ code,
+ reason,
+ wasClean,
+ this.readyState
+ );
+ var forceFail = false;
+
+ if (this._ir) {
+ forceFail = true;
+ this._ir.close();
+ this._ir = null;
+ }
+ if (this._transport) {
+ this._transport.close();
+ this._transport = null;
+ this.transport = null;
+ }
+
+ if (this.readyState === SockJS.CLOSED) {
+ throw new Error(
+ "InvalidStateError: SockJS has already been closed"
+ );
+ }
+
+ this.readyState = SockJS.CLOSING;
+ setTimeout(
+ function() {
+ this.readyState = SockJS.CLOSED;
+
+ if (forceFail) {
+ this.dispatchEvent(new Event("error"));
+ }
+
+ var e = new CloseEvent("close");
+ e.wasClean = wasClean || false;
+ e.code = code || 1000;
+ e.reason = reason;
+
+ this.dispatchEvent(e);
+ this.onmessage = this.onclose = this.onerror = null;
+ debug("disconnected");
+ }.bind(this),
+ 0
+ );
+ };
+
+ // See: http://www.erg.abdn.ac.uk/~gerrit/dccp/notes/ccid2/rto_estimator/
+ // and RFC 2988.
+ SockJS.prototype.countRTO = function(rtt) {
+ // In a local environment, when using IE8/9 and the `jsonp-polling`
+ // transport the time needed to establish a connection (the time that pass
+ // from the opening of the transport to the call of `_dispatchOpen`) is
+ // around 200msec (the lower bound used in the article above) and this
+ // causes spurious timeouts. For this reason we calculate a value slightly
+ // larger than that used in the article.
+ if (rtt > 100) {
+ return 4 * rtt; // rto > 400msec
+ }
+ return 300 + rtt; // 300msec < rto <= 400msec
+ };
+
+ module.exports = function(availableTransports) {
+ transports = transport(availableTransports);
+ __webpack_require__(
+ /*! ./iframe-bootstrap */ "./node_modules/sockjs-client/lib/iframe-bootstrap.js"
+ )(SockJS, availableTransports);
+ return SockJS;
+ };
+
+ /* WEBPACK VAR INJECTION */
+ }.call(
+ exports,
+ __webpack_require__(
+ /*! ./../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"
+ )
+ ));
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/shims.js":
+ /*!*************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/shims.js ***!
+ \*************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /* eslint-disable */
+ /* jscs: disable */
+
+ // pulled specific shims from https://github.com/es-shims/es5-shim
+
+ var ArrayPrototype = Array.prototype;
+ var ObjectPrototype = Object.prototype;
+ var FunctionPrototype = Function.prototype;
+ var StringPrototype = String.prototype;
+ var array_slice = ArrayPrototype.slice;
+
+ var _toString = ObjectPrototype.toString;
+ var isFunction = function(val) {
+ return ObjectPrototype.toString.call(val) === "[object Function]";
+ };
+ var isArray = function isArray(obj) {
+ return _toString.call(obj) === "[object Array]";
+ };
+ var isString = function isString(obj) {
+ return _toString.call(obj) === "[object String]";
+ };
+
+ var supportsDescriptors =
+ Object.defineProperty &&
+ (function() {
+ try {
+ Object.defineProperty({}, "x", {});
+ return true;
+ } catch (e) {
+ /* this is ES3 */
+ return false;
+ }
+ })();
+
+ // Define configurable, writable and non-enumerable props
+ // if they don't exist.
+ var defineProperty;
+ if (supportsDescriptors) {
+ defineProperty = function(object, name, method, forceAssign) {
+ if (!forceAssign && name in object) {
+ return;
+ }
+ Object.defineProperty(object, name, {
+ configurable: true,
+ enumerable: false,
+ writable: true,
+ value: method
+ });
+ };
+ } else {
+ defineProperty = function(object, name, method, forceAssign) {
+ if (!forceAssign && name in object) {
+ return;
+ }
+ object[name] = method;
+ };
+ }
+ var defineProperties = function(object, map, forceAssign) {
+ for (var name in map) {
+ if (ObjectPrototype.hasOwnProperty.call(map, name)) {
+ defineProperty(object, name, map[name], forceAssign);
+ }
+ }
+ };
+
+ var toObject = function(o) {
+ if (o == null) {
+ // this matches both null and undefined
+ throw new TypeError("can't convert " + o + " to object");
+ }
+ return Object(o);
+ };
+
+ //
+ // Util
+ // ======
+ //
+
+ // ES5 9.4
+ // http://es5.github.com/#x9.4
+ // http://jsperf.com/to-integer
+
+ function toInteger(num) {
+ var n = +num;
+ if (n !== n) {
+ // isNaN
+ n = 0;
+ } else if (n !== 0 && n !== 1 / 0 && n !== -(1 / 0)) {
+ n = (n > 0 || -1) * Math.floor(Math.abs(n));
+ }
+ return n;
+ }
+
+ function ToUint32(x) {
+ return x >>> 0;
+ }
+
+ //
+ // Function
+ // ========
+ //
+
+ // ES-5 15.3.4.5
+ // http://es5.github.com/#x15.3.4.5
+
+ function Empty() {}
+
+ defineProperties(FunctionPrototype, {
+ bind: function bind(that) {
+ // .length is 1
+ // 1. Let Target be the this value.
+ var target = this;
+ // 2. If IsCallable(Target) is false, throw a TypeError exception.
+ if (!isFunction(target)) {
+ throw new TypeError(
+ "Function.prototype.bind called on incompatible " + target
+ );
+ }
+ // 3. Let A be a new (possibly empty) internal list of all of the
+ // argument values provided after thisArg (arg1, arg2 etc), in order.
+ // XXX slicedArgs will stand in for "A" if used
+ var args = array_slice.call(arguments, 1); // for normal call
+ // 4. Let F be a new native ECMAScript object.
+ // 11. Set the [[Prototype]] internal property of F to the standard
+ // built-in Function prototype object as specified in 15.3.3.1.
+ // 12. Set the [[Call]] internal property of F as described in
+ // 15.3.4.5.1.
+ // 13. Set the [[Construct]] internal property of F as described in
+ // 15.3.4.5.2.
+ // 14. Set the [[HasInstance]] internal property of F as described in
+ // 15.3.4.5.3.
+ var binder = function() {
+ if (this instanceof bound) {
+ // 15.3.4.5.2 [[Construct]]
+ // When the [[Construct]] internal method of a function object,
+ // F that was created using the bind function is called with a
+ // list of arguments ExtraArgs, the following steps are taken:
+ // 1. Let target be the value of F's [[TargetFunction]]
+ // internal property.
+ // 2. If target has no [[Construct]] internal method, a
+ // TypeError exception is thrown.
+ // 3. Let boundArgs be the value of F's [[BoundArgs]] internal
+ // property.
+ // 4. Let args be a new list containing the same values as the
+ // list boundArgs in the same order followed by the same
+ // values as the list ExtraArgs in the same order.
+ // 5. Return the result of calling the [[Construct]] internal
+ // method of target providing args as the arguments.
+
+ var result = target.apply(
+ this,
+ args.concat(array_slice.call(arguments))
+ );
+ if (Object(result) === result) {
+ return result;
+ }
+ return this;
+ } else {
+ // 15.3.4.5.1 [[Call]]
+ // When the [[Call]] internal method of a function object, F,
+ // which was created using the bind function is called with a
+ // this value and a list of arguments ExtraArgs, the following
+ // steps are taken:
+ // 1. Let boundArgs be the value of F's [[BoundArgs]] internal
+ // property.
+ // 2. Let boundThis be the value of F's [[BoundThis]] internal
+ // property.
+ // 3. Let target be the value of F's [[TargetFunction]] internal
+ // property.
+ // 4. Let args be a new list containing the same values as the
+ // list boundArgs in the same order followed by the same
+ // values as the list ExtraArgs in the same order.
+ // 5. Return the result of calling the [[Call]] internal method
+ // of target providing boundThis as the this value and
+ // providing args as the arguments.
+
+ // equiv: target.call(this, ...boundArgs, ...args)
+ return target.apply(
+ that,
+ args.concat(array_slice.call(arguments))
+ );
+ }
+ };
+
+ // 15. If the [[Class]] internal property of Target is "Function", then
+ // a. Let L be the length property of Target minus the length of A.
+ // b. Set the length own property of F to either 0 or L, whichever is
+ // larger.
+ // 16. Else set the length own property of F to 0.
+
+ var boundLength = Math.max(0, target.length - args.length);
+
+ // 17. Set the attributes of the length own property of F to the values
+ // specified in 15.3.5.1.
+ var boundArgs = [];
+ for (var i = 0; i < boundLength; i++) {
+ boundArgs.push("$" + i);
+ }
+
+ // XXX Build a dynamic function with desired amount of arguments is the only
+ // way to set the length property of a function.
+ // In environments where Content Security Policies enabled (Chrome extensions,
+ // for ex.) all use of eval or Function costructor throws an exception.
+ // However in all of these environments Function.prototype.bind exists
+ // and so this code will never be executed.
+ var bound = Function(
+ "binder",
+ "return function (" +
+ boundArgs.join(",") +
+ "){ return binder.apply(this, arguments); }"
+ )(binder);
+
+ if (target.prototype) {
+ Empty.prototype = target.prototype;
+ bound.prototype = new Empty();
+ // Clean up dangling references.
+ Empty.prototype = null;
+ }
+
+ // TODO
+ // 18. Set the [[Extensible]] internal property of F to true.
+
+ // TODO
+ // 19. Let thrower be the [[ThrowTypeError]] function Object (13.2.3).
+ // 20. Call the [[DefineOwnProperty]] internal method of F with
+ // arguments "caller", PropertyDescriptor {[[Get]]: thrower, [[Set]]:
+ // thrower, [[Enumerable]]: false, [[Configurable]]: false}, and
+ // false.
+ // 21. Call the [[DefineOwnProperty]] internal method of F with
+ // arguments "arguments", PropertyDescriptor {[[Get]]: thrower,
+ // [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false},
+ // and false.
+
+ // TODO
+ // NOTE Function objects created using Function.prototype.bind do not
+ // have a prototype property or the [[Code]], [[FormalParameters]], and
+ // [[Scope]] internal properties.
+ // XXX can't delete prototype in pure-js.
+
+ // 22. Return F.
+ return bound;
+ }
+ });
+
+ //
+ // Array
+ // =====
+ //
+
+ // ES5 15.4.3.2
+ // http://es5.github.com/#x15.4.3.2
+ // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray
+ defineProperties(Array, { isArray: isArray });
+
+ var boxedString = Object("a");
+ var splitString = boxedString[0] !== "a" || !(0 in boxedString);
+
+ var properlyBoxesContext = function properlyBoxed(method) {
+ // Check node 0.6.21 bug where third parameter is not boxed
+ var properlyBoxesNonStrict = true;
+ var properlyBoxesStrict = true;
+ if (method) {
+ method.call("foo", function(_, __, context) {
+ if (typeof context !== "object") {
+ properlyBoxesNonStrict = false;
+ }
+ });
+
+ method.call(
+ [1],
+ function() {
+ "use strict";
+ properlyBoxesStrict = typeof this === "string";
+ },
+ "x"
+ );
+ }
+ return !!method && properlyBoxesNonStrict && properlyBoxesStrict;
+ };
+
+ defineProperties(
+ ArrayPrototype,
+ {
+ forEach: function forEach(fun /*, thisp*/) {
+ var object = toObject(this),
+ self = splitString && isString(this) ? this.split("") : object,
+ thisp = arguments[1],
+ i = -1,
+ length = self.length >>> 0;
+
+ // If no callback function or if callback is not a callable function
+ if (!isFunction(fun)) {
+ throw new TypeError(); // TODO message
+ }
+
+ while (++i < length) {
+ if (i in self) {
+ // Invoke the callback function with call, passing arguments:
+ // context, property value, property key, thisArg object
+ // context
+ fun.call(thisp, self[i], i, object);
+ }
+ }
+ }
+ },
+ !properlyBoxesContext(ArrayPrototype.forEach)
+ );
+
+ // ES5 15.4.4.14
+ // http://es5.github.com/#x15.4.4.14
+ // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf
+ var hasFirefox2IndexOfBug =
+ Array.prototype.indexOf && [0, 1].indexOf(1, 2) !== -1;
+ defineProperties(
+ ArrayPrototype,
+ {
+ indexOf: function indexOf(sought /*, fromIndex */) {
+ var self =
+ splitString && isString(this)
+ ? this.split("")
+ : toObject(this),
+ length = self.length >>> 0;
+
+ if (!length) {
+ return -1;
+ }
+
+ var i = 0;
+ if (arguments.length > 1) {
+ i = toInteger(arguments[1]);
+ }
+
+ // handle negative indices
+ i = i >= 0 ? i : Math.max(0, length + i);
+ for (; i < length; i++) {
+ if (i in self && self[i] === sought) {
+ return i;
+ }
+ }
+ return -1;
+ }
+ },
+ hasFirefox2IndexOfBug
+ );
+
+ //
+ // String
+ // ======
+ //
+
+ // ES5 15.5.4.14
+ // http://es5.github.com/#x15.5.4.14
+
+ // [bugfix, IE lt 9, firefox 4, Konqueror, Opera, obscure browsers]
+ // Many browsers do not split properly with regular expressions or they
+ // do not perform the split correctly under obscure conditions.
+ // See http://blog.stevenlevithan.com/archives/cross-browser-split
+ // I've tested in many browsers and this seems to cover the deviant ones:
+ // 'ab'.split(/(?:ab)*/) should be ["", ""], not [""]
+ // '.'.split(/(.?)(.?)/) should be ["", ".", "", ""], not ["", ""]
+ // 'tesst'.split(/(s)*/) should be ["t", undefined, "e", "s", "t"], not
+ // [undefined, "t", undefined, "e", ...]
+ // ''.split(/.?/) should be [], not [""]
+ // '.'.split(/()()/) should be ["."], not ["", "", "."]
+
+ var string_split = StringPrototype.split;
+ if (
+ "ab".split(/(?:ab)*/).length !== 2 ||
+ ".".split(/(.?)(.?)/).length !== 4 ||
+ "tesst".split(/(s)*/)[1] === "t" ||
+ "test".split(/(?:)/, -1).length !== 4 ||
+ "".split(/.?/).length ||
+ ".".split(/()()/).length > 1
+ ) {
+ (function() {
+ var compliantExecNpcg = /()??/.exec("")[1] === void 0; // NPCG: nonparticipating capturing group
+
+ StringPrototype.split = function(separator, limit) {
+ var string = this;
+ if (separator === void 0 && limit === 0) {
+ return [];
+ }
+
+ // If `separator` is not a regex, use native split
+ if (_toString.call(separator) !== "[object RegExp]") {
+ return string_split.call(this, separator, limit);
+ }
+
+ var output = [],
+ flags =
+ (separator.ignoreCase ? "i" : "") +
+ (separator.multiline ? "m" : "") +
+ (separator.extended ? "x" : "") + // Proposed for ES6
+ (separator.sticky ? "y" : ""), // Firefox 3+
+ lastLastIndex = 0,
+ // Make `global` and avoid `lastIndex` issues by working with a copy
+ separator2,
+ match,
+ lastIndex,
+ lastLength;
+ separator = new RegExp(separator.source, flags + "g");
+ string += ""; // Type-convert
+ if (!compliantExecNpcg) {
+ // Doesn't need flags gy, but they don't hurt
+ separator2 = new RegExp(
+ "^" + separator.source + "$(?!\\s)",
+ flags
+ );
+ }
+ /* Values for `limit`, per the spec:
+ * If undefined: 4294967295 // Math.pow(2, 32) - 1
+ * If 0, Infinity, or NaN: 0
+ * If positive number: limit = Math.floor(limit); if (limit > 4294967295) limit -= 4294967296;
+ * If negative number: 4294967296 - Math.floor(Math.abs(limit))
+ * If other: Type-convert, then use the above rules
+ */
+ limit =
+ limit === void 0
+ ? -1 >>> 0 // Math.pow(2, 32) - 1
+ : ToUint32(limit);
+ while ((match = separator.exec(string))) {
+ // `separator.lastIndex` is not reliable cross-browser
+ lastIndex = match.index + match[0].length;
+ if (lastIndex > lastLastIndex) {
+ output.push(string.slice(lastLastIndex, match.index));
+ // Fix browsers whose `exec` methods don't consistently return `undefined` for
+ // nonparticipating capturing groups
+ if (!compliantExecNpcg && match.length > 1) {
+ match[0].replace(separator2, function() {
+ for (var i = 1; i < arguments.length - 2; i++) {
+ if (arguments[i] === void 0) {
+ match[i] = void 0;
+ }
+ }
+ });
+ }
+ if (match.length > 1 && match.index < string.length) {
+ ArrayPrototype.push.apply(output, match.slice(1));
+ }
+ lastLength = match[0].length;
+ lastLastIndex = lastIndex;
+ if (output.length >= limit) {
+ break;
+ }
+ }
+ if (separator.lastIndex === match.index) {
+ separator.lastIndex++; // Avoid an infinite loop
+ }
+ }
+ if (lastLastIndex === string.length) {
+ if (lastLength || !separator.test("")) {
+ output.push("");
+ }
+ } else {
+ output.push(string.slice(lastLastIndex));
+ }
+ return output.length > limit ? output.slice(0, limit) : output;
+ };
+ })();
+
+ // [bugfix, chrome]
+ // If separator is undefined, then the result array contains just one String,
+ // which is the this value (converted to a String). If limit is not undefined,
+ // then the output array is truncated so that it contains no more than limit
+ // elements.
+ // "0".split(undefined, 0) -> []
+ } else if ("0".split(void 0, 0).length) {
+ StringPrototype.split = function split(separator, limit) {
+ if (separator === void 0 && limit === 0) {
+ return [];
+ }
+ return string_split.call(this, separator, limit);
+ };
+ }
+
+ // ECMA-262, 3rd B.2.3
+ // Not an ECMAScript standard, although ECMAScript 3rd Edition has a
+ // non-normative section suggesting uniform semantics and it should be
+ // normalized across all browsers
+ // [bugfix, IE lt 9] IE < 9 substr() with negative value not working in IE
+ var string_substr = StringPrototype.substr;
+ var hasNegativeSubstrBug = "".substr && "0b".substr(-1) !== "b";
+ defineProperties(
+ StringPrototype,
+ {
+ substr: function substr(start, length) {
+ return string_substr.call(
+ this,
+ start < 0
+ ? (start = this.length + start) < 0 ? 0 : start
+ : start,
+ length
+ );
+ }
+ },
+ hasNegativeSubstrBug
+ );
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/transport-list.js":
+ /*!**********************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/transport-list.js ***!
+ \**********************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ module.exports = [
+ // streaming transports
+ __webpack_require__(
+ /*! ./transport/websocket */ "./node_modules/sockjs-client/lib/transport/websocket.js"
+ ),
+ __webpack_require__(
+ /*! ./transport/xhr-streaming */ "./node_modules/sockjs-client/lib/transport/xhr-streaming.js"
+ ),
+ __webpack_require__(
+ /*! ./transport/xdr-streaming */ "./node_modules/sockjs-client/lib/transport/xdr-streaming.js"
+ ),
+ __webpack_require__(
+ /*! ./transport/eventsource */ "./node_modules/sockjs-client/lib/transport/eventsource.js"
+ ),
+ __webpack_require__(
+ /*! ./transport/lib/iframe-wrap */ "./node_modules/sockjs-client/lib/transport/lib/iframe-wrap.js"
+ )(
+ __webpack_require__(
+ /*! ./transport/eventsource */ "./node_modules/sockjs-client/lib/transport/eventsource.js"
+ )
+ ),
+
+ // polling transports
+ __webpack_require__(
+ /*! ./transport/htmlfile */ "./node_modules/sockjs-client/lib/transport/htmlfile.js"
+ ),
+ __webpack_require__(
+ /*! ./transport/lib/iframe-wrap */ "./node_modules/sockjs-client/lib/transport/lib/iframe-wrap.js"
+ )(
+ __webpack_require__(
+ /*! ./transport/htmlfile */ "./node_modules/sockjs-client/lib/transport/htmlfile.js"
+ )
+ ),
+ __webpack_require__(
+ /*! ./transport/xhr-polling */ "./node_modules/sockjs-client/lib/transport/xhr-polling.js"
+ ),
+ __webpack_require__(
+ /*! ./transport/xdr-polling */ "./node_modules/sockjs-client/lib/transport/xdr-polling.js"
+ ),
+ __webpack_require__(
+ /*! ./transport/lib/iframe-wrap */ "./node_modules/sockjs-client/lib/transport/lib/iframe-wrap.js"
+ )(
+ __webpack_require__(
+ /*! ./transport/xhr-polling */ "./node_modules/sockjs-client/lib/transport/xhr-polling.js"
+ )
+ ),
+ __webpack_require__(
+ /*! ./transport/jsonp-polling */ "./node_modules/sockjs-client/lib/transport/jsonp-polling.js"
+ )
+ ];
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/transport/browser/abstract-xhr.js":
+ /*!**************************************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/transport/browser/abstract-xhr.js ***!
+ \**************************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /* WEBPACK VAR INJECTION */ (function(global) {
+ var EventEmitter = __webpack_require__(
+ /*! events */ "./node_modules/sockjs-client/lib/event/emitter.js"
+ ).EventEmitter,
+ inherits = __webpack_require__(
+ /*! inherits */ "./node_modules/inherits/inherits_browser.js"
+ ),
+ utils = __webpack_require__(
+ /*! ../../utils/event */ "./node_modules/sockjs-client/lib/utils/event.js"
+ ),
+ urlUtils = __webpack_require__(
+ /*! ../../utils/url */ "./node_modules/sockjs-client/lib/utils/url.js"
+ ),
+ XHR = global.XMLHttpRequest;
+
+ var debug = function() {};
+ if (true) {
+ debug = __webpack_require__(
+ /*! debug */ "./node_modules/sockjs-client/node_modules/debug/src/browser.js"
+ )("sockjs-client:browser:xhr");
+ }
+
+ function AbstractXHRObject(method, url, payload, opts) {
+ debug(method, url);
+ var self = this;
+ EventEmitter.call(this);
+
+ setTimeout(function() {
+ self._start(method, url, payload, opts);
+ }, 0);
+ }
+
+ inherits(AbstractXHRObject, EventEmitter);
+
+ AbstractXHRObject.prototype._start = function(
+ method,
+ url,
+ payload,
+ opts
+ ) {
+ var self = this;
+
+ try {
+ this.xhr = new XHR();
+ } catch (x) {
+ // intentionally empty
+ }
+
+ if (!this.xhr) {
+ debug("no xhr");
+ this.emit("finish", 0, "no xhr support");
+ this._cleanup();
+ return;
+ }
+
+ // several browsers cache POSTs
+ url = urlUtils.addQuery(url, "t=" + +new Date());
+
+ // Explorer tends to keep connection open, even after the
+ // tab gets closed: http://bugs.jquery.com/ticket/5280
+ this.unloadRef = utils.unloadAdd(function() {
+ debug("unload cleanup");
+ self._cleanup(true);
+ });
+ try {
+ this.xhr.open(method, url, true);
+ if (this.timeout && "timeout" in this.xhr) {
+ this.xhr.timeout = this.timeout;
+ this.xhr.ontimeout = function() {
+ debug("xhr timeout");
+ self.emit("finish", 0, "");
+ self._cleanup(false);
+ };
+ }
+ } catch (e) {
+ debug("exception", e);
+ // IE raises an exception on wrong port.
+ this.emit("finish", 0, "");
+ this._cleanup(false);
+ return;
+ }
+
+ if (
+ (!opts || !opts.noCredentials) &&
+ AbstractXHRObject.supportsCORS
+ ) {
+ debug("withCredentials");
+ // Mozilla docs says https://developer.mozilla.org/en/XMLHttpRequest :
+ // "This never affects same-site requests."
+
+ this.xhr.withCredentials = "true";
+ }
+ if (opts && opts.headers) {
+ for (var key in opts.headers) {
+ this.xhr.setRequestHeader(key, opts.headers[key]);
+ }
+ }
+
+ this.xhr.onreadystatechange = function() {
+ if (self.xhr) {
+ var x = self.xhr;
+ var text, status;
+ debug("readyState", x.readyState);
+ switch (x.readyState) {
+ case 3:
+ // IE doesn't like peeking into responseText or status
+ // on Microsoft.XMLHTTP and readystate=3
+ try {
+ status = x.status;
+ text = x.responseText;
+ } catch (e) {
+ // intentionally empty
+ }
+ debug("status", status);
+ // IE returns 1223 for 204: http://bugs.jquery.com/ticket/1450
+ if (status === 1223) {
+ status = 204;
+ }
+
+ // IE does return readystate == 3 for 404 answers.
+ if (status === 200 && text && text.length > 0) {
+ debug("chunk");
+ self.emit("chunk", status, text);
+ }
+ break;
+ case 4:
+ status = x.status;
+ debug("status", status);
+ // IE returns 1223 for 204: http://bugs.jquery.com/ticket/1450
+ if (status === 1223) {
+ status = 204;
+ }
+ // IE returns this for a bad port
+ // http://msdn.microsoft.com/en-us/library/windows/desktop/aa383770(v=vs.85).aspx
+ if (status === 12005 || status === 12029) {
+ status = 0;
+ }
+
+ debug("finish", status, x.responseText);
+ self.emit("finish", status, x.responseText);
+ self._cleanup(false);
+ break;
+ }
+ }
+ };
+
+ try {
+ self.xhr.send(payload);
+ } catch (e) {
+ self.emit("finish", 0, "");
+ self._cleanup(false);
+ }
+ };
+
+ AbstractXHRObject.prototype._cleanup = function(abort) {
+ debug("cleanup");
+ if (!this.xhr) {
+ return;
+ }
+ this.removeAllListeners();
+ utils.unloadDel(this.unloadRef);
+
+ // IE needs this field to be a function
+ this.xhr.onreadystatechange = function() {};
+ if (this.xhr.ontimeout) {
+ this.xhr.ontimeout = null;
+ }
+
+ if (abort) {
+ try {
+ this.xhr.abort();
+ } catch (x) {
+ // intentionally empty
+ }
+ }
+ this.unloadRef = this.xhr = null;
+ };
+
+ AbstractXHRObject.prototype.close = function() {
+ debug("close");
+ this._cleanup(true);
+ };
+
+ AbstractXHRObject.enabled = !!XHR;
+ // override XMLHttpRequest for IE6/7
+ // obfuscate to avoid firewalls
+ var axo = ["Active"].concat("Object").join("X");
+ if (!AbstractXHRObject.enabled && axo in global) {
+ debug("overriding xmlhttprequest");
+ XHR = function() {
+ try {
+ return new global[axo]("Microsoft.XMLHTTP");
+ } catch (e) {
+ return null;
+ }
+ };
+ AbstractXHRObject.enabled = !!new XHR();
+ }
+
+ var cors = false;
+ try {
+ cors = "withCredentials" in new XHR();
+ } catch (ignored) {
+ // intentionally empty
+ }
+
+ AbstractXHRObject.supportsCORS = cors;
+
+ module.exports = AbstractXHRObject;
+
+ /* WEBPACK VAR INJECTION */
+ }.call(
+ exports,
+ __webpack_require__(
+ /*! ./../../../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"
+ )
+ ));
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/transport/browser/eventsource.js":
+ /*!*************************************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/transport/browser/eventsource.js ***!
+ \*************************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ /* WEBPACK VAR INJECTION */ (function(global) {
+ module.exports = global.EventSource;
+
+ /* WEBPACK VAR INJECTION */
+ }.call(
+ exports,
+ __webpack_require__(
+ /*! ./../../../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"
+ )
+ ));
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/transport/browser/websocket.js":
+ /*!***********************************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/transport/browser/websocket.js ***!
+ \***********************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /* WEBPACK VAR INJECTION */ (function(global) {
+ var Driver = global.WebSocket || global.MozWebSocket;
+ if (Driver) {
+ module.exports = function WebSocketBrowserDriver(url) {
+ return new Driver(url);
+ };
+ } else {
+ module.exports = undefined;
+ }
+
+ /* WEBPACK VAR INJECTION */
+ }.call(
+ exports,
+ __webpack_require__(
+ /*! ./../../../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"
+ )
+ ));
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/transport/eventsource.js":
+ /*!*****************************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/transport/eventsource.js ***!
+ \*****************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ var inherits = __webpack_require__(
+ /*! inherits */ "./node_modules/inherits/inherits_browser.js"
+ ),
+ AjaxBasedTransport = __webpack_require__(
+ /*! ./lib/ajax-based */ "./node_modules/sockjs-client/lib/transport/lib/ajax-based.js"
+ ),
+ EventSourceReceiver = __webpack_require__(
+ /*! ./receiver/eventsource */ "./node_modules/sockjs-client/lib/transport/receiver/eventsource.js"
+ ),
+ XHRCorsObject = __webpack_require__(
+ /*! ./sender/xhr-cors */ "./node_modules/sockjs-client/lib/transport/sender/xhr-cors.js"
+ ),
+ EventSourceDriver = __webpack_require__(
+ /*! eventsource */ "./node_modules/sockjs-client/lib/transport/browser/eventsource.js"
+ );
+
+ function EventSourceTransport(transUrl) {
+ if (!EventSourceTransport.enabled()) {
+ throw new Error("Transport created when disabled");
+ }
+
+ AjaxBasedTransport.call(
+ this,
+ transUrl,
+ "/eventsource",
+ EventSourceReceiver,
+ XHRCorsObject
+ );
+ }
+
+ inherits(EventSourceTransport, AjaxBasedTransport);
+
+ EventSourceTransport.enabled = function() {
+ return !!EventSourceDriver;
+ };
+
+ EventSourceTransport.transportName = "eventsource";
+ EventSourceTransport.roundTrips = 2;
+
+ module.exports = EventSourceTransport;
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/transport/htmlfile.js":
+ /*!**************************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/transport/htmlfile.js ***!
+ \**************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ var inherits = __webpack_require__(
+ /*! inherits */ "./node_modules/inherits/inherits_browser.js"
+ ),
+ HtmlfileReceiver = __webpack_require__(
+ /*! ./receiver/htmlfile */ "./node_modules/sockjs-client/lib/transport/receiver/htmlfile.js"
+ ),
+ XHRLocalObject = __webpack_require__(
+ /*! ./sender/xhr-local */ "./node_modules/sockjs-client/lib/transport/sender/xhr-local.js"
+ ),
+ AjaxBasedTransport = __webpack_require__(
+ /*! ./lib/ajax-based */ "./node_modules/sockjs-client/lib/transport/lib/ajax-based.js"
+ );
+
+ function HtmlFileTransport(transUrl) {
+ if (!HtmlfileReceiver.enabled) {
+ throw new Error("Transport created when disabled");
+ }
+ AjaxBasedTransport.call(
+ this,
+ transUrl,
+ "/htmlfile",
+ HtmlfileReceiver,
+ XHRLocalObject
+ );
+ }
+
+ inherits(HtmlFileTransport, AjaxBasedTransport);
+
+ HtmlFileTransport.enabled = function(info) {
+ return HtmlfileReceiver.enabled && info.sameOrigin;
+ };
+
+ HtmlFileTransport.transportName = "htmlfile";
+ HtmlFileTransport.roundTrips = 2;
+
+ module.exports = HtmlFileTransport;
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/transport/iframe.js":
+ /*!************************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/transport/iframe.js ***!
+ \************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ // Few cool transports do work only for same-origin. In order to make
+ // them work cross-domain we shall use iframe, served from the
+ // remote domain. New browsers have capabilities to communicate with
+ // cross domain iframe using postMessage(). In IE it was implemented
+ // from IE 8+, but of course, IE got some details wrong:
+ // http://msdn.microsoft.com/en-us/library/cc197015(v=VS.85).aspx
+ // http://stevesouders.com/misc/test-postmessage.php
+
+ var inherits = __webpack_require__(
+ /*! inherits */ "./node_modules/inherits/inherits_browser.js"
+ ),
+ JSON3 = __webpack_require__(
+ /*! json3 */ "./node_modules/json3/lib/json3.js"
+ ),
+ EventEmitter = __webpack_require__(
+ /*! events */ "./node_modules/sockjs-client/lib/event/emitter.js"
+ ).EventEmitter,
+ version = __webpack_require__(
+ /*! ../version */ "./node_modules/sockjs-client/lib/version.js"
+ ),
+ urlUtils = __webpack_require__(
+ /*! ../utils/url */ "./node_modules/sockjs-client/lib/utils/url.js"
+ ),
+ iframeUtils = __webpack_require__(
+ /*! ../utils/iframe */ "./node_modules/sockjs-client/lib/utils/iframe.js"
+ ),
+ eventUtils = __webpack_require__(
+ /*! ../utils/event */ "./node_modules/sockjs-client/lib/utils/event.js"
+ ),
+ random = __webpack_require__(
+ /*! ../utils/random */ "./node_modules/sockjs-client/lib/utils/random.js"
+ );
+
+ var debug = function() {};
+ if (true) {
+ debug = __webpack_require__(
+ /*! debug */ "./node_modules/sockjs-client/node_modules/debug/src/browser.js"
+ )("sockjs-client:transport:iframe");
+ }
+
+ function IframeTransport(transport, transUrl, baseUrl) {
+ if (!IframeTransport.enabled()) {
+ throw new Error("Transport created when disabled");
+ }
+ EventEmitter.call(this);
+
+ var self = this;
+ this.origin = urlUtils.getOrigin(baseUrl);
+ this.baseUrl = baseUrl;
+ this.transUrl = transUrl;
+ this.transport = transport;
+ this.windowId = random.string(8);
+
+ var iframeUrl =
+ urlUtils.addPath(baseUrl, "/iframe.html") + "#" + this.windowId;
+ debug(transport, transUrl, iframeUrl);
+
+ this.iframeObj = iframeUtils.createIframe(iframeUrl, function(r) {
+ debug("err callback");
+ self.emit("close", 1006, "Unable to load an iframe (" + r + ")");
+ self.close();
+ });
+
+ this.onmessageCallback = this._message.bind(this);
+ eventUtils.attachEvent("message", this.onmessageCallback);
+ }
+
+ inherits(IframeTransport, EventEmitter);
+
+ IframeTransport.prototype.close = function() {
+ debug("close");
+ this.removeAllListeners();
+ if (this.iframeObj) {
+ eventUtils.detachEvent("message", this.onmessageCallback);
+ try {
+ // When the iframe is not loaded, IE raises an exception
+ // on 'contentWindow'.
+ this.postMessage("c");
+ } catch (x) {
+ // intentionally empty
+ }
+ this.iframeObj.cleanup();
+ this.iframeObj = null;
+ this.onmessageCallback = this.iframeObj = null;
+ }
+ };
+
+ IframeTransport.prototype._message = function(e) {
+ debug("message", e.data);
+ if (!urlUtils.isOriginEqual(e.origin, this.origin)) {
+ debug("not same origin", e.origin, this.origin);
+ return;
+ }
+
+ var iframeMessage;
+ try {
+ iframeMessage = JSON3.parse(e.data);
+ } catch (ignored) {
+ debug("bad json", e.data);
+ return;
+ }
+
+ if (iframeMessage.windowId !== this.windowId) {
+ debug(
+ "mismatched window id",
+ iframeMessage.windowId,
+ this.windowId
+ );
+ return;
+ }
+
+ switch (iframeMessage.type) {
+ case "s":
+ this.iframeObj.loaded();
+ // window global dependency
+ this.postMessage(
+ "s",
+ JSON3.stringify([
+ version,
+ this.transport,
+ this.transUrl,
+ this.baseUrl
+ ])
+ );
+ break;
+ case "t":
+ this.emit("message", iframeMessage.data);
+ break;
+ case "c":
+ var cdata;
+ try {
+ cdata = JSON3.parse(iframeMessage.data);
+ } catch (ignored) {
+ debug("bad json", iframeMessage.data);
+ return;
+ }
+ this.emit("close", cdata[0], cdata[1]);
+ this.close();
+ break;
+ }
+ };
+
+ IframeTransport.prototype.postMessage = function(type, data) {
+ debug("postMessage", type, data);
+ this.iframeObj.post(
+ JSON3.stringify({
+ windowId: this.windowId,
+ type: type,
+ data: data || ""
+ }),
+ this.origin
+ );
+ };
+
+ IframeTransport.prototype.send = function(message) {
+ debug("send", message);
+ this.postMessage("m", message);
+ };
+
+ IframeTransport.enabled = function() {
+ return iframeUtils.iframeEnabled;
+ };
+
+ IframeTransport.transportName = "iframe";
+ IframeTransport.roundTrips = 2;
+
+ module.exports = IframeTransport;
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/transport/jsonp-polling.js":
+ /*!*******************************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/transport/jsonp-polling.js ***!
+ \*******************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /* WEBPACK VAR INJECTION */ (function(global) {
+ // The simplest and most robust transport, using the well-know cross
+ // domain hack - JSONP. This transport is quite inefficient - one
+ // message could use up to one http request. But at least it works almost
+ // everywhere.
+ // Known limitations:
+ // o you will get a spinning cursor
+ // o for Konqueror a dumb timer is needed to detect errors
+
+ var inherits = __webpack_require__(
+ /*! inherits */ "./node_modules/inherits/inherits_browser.js"
+ ),
+ SenderReceiver = __webpack_require__(
+ /*! ./lib/sender-receiver */ "./node_modules/sockjs-client/lib/transport/lib/sender-receiver.js"
+ ),
+ JsonpReceiver = __webpack_require__(
+ /*! ./receiver/jsonp */ "./node_modules/sockjs-client/lib/transport/receiver/jsonp.js"
+ ),
+ jsonpSender = __webpack_require__(
+ /*! ./sender/jsonp */ "./node_modules/sockjs-client/lib/transport/sender/jsonp.js"
+ );
+
+ function JsonPTransport(transUrl) {
+ if (!JsonPTransport.enabled()) {
+ throw new Error("Transport created when disabled");
+ }
+ SenderReceiver.call(
+ this,
+ transUrl,
+ "/jsonp",
+ jsonpSender,
+ JsonpReceiver
+ );
+ }
+
+ inherits(JsonPTransport, SenderReceiver);
+
+ JsonPTransport.enabled = function() {
+ return !!global.document;
+ };
+
+ JsonPTransport.transportName = "jsonp-polling";
+ JsonPTransport.roundTrips = 1;
+ JsonPTransport.needBody = true;
+
+ module.exports = JsonPTransport;
+
+ /* WEBPACK VAR INJECTION */
+ }.call(
+ exports,
+ __webpack_require__(
+ /*! ./../../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"
+ )
+ ));
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/transport/lib/ajax-based.js":
+ /*!********************************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/transport/lib/ajax-based.js ***!
+ \********************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ var inherits = __webpack_require__(
+ /*! inherits */ "./node_modules/inherits/inherits_browser.js"
+ ),
+ urlUtils = __webpack_require__(
+ /*! ../../utils/url */ "./node_modules/sockjs-client/lib/utils/url.js"
+ ),
+ SenderReceiver = __webpack_require__(
+ /*! ./sender-receiver */ "./node_modules/sockjs-client/lib/transport/lib/sender-receiver.js"
+ );
+
+ var debug = function() {};
+ if (true) {
+ debug = __webpack_require__(
+ /*! debug */ "./node_modules/sockjs-client/node_modules/debug/src/browser.js"
+ )("sockjs-client:ajax-based");
+ }
+
+ function createAjaxSender(AjaxObject) {
+ return function(url, payload, callback) {
+ debug("create ajax sender", url, payload);
+ var opt = {};
+ if (typeof payload === "string") {
+ opt.headers = { "Content-type": "text/plain" };
+ }
+ var ajaxUrl = urlUtils.addPath(url, "/xhr_send");
+ var xo = new AjaxObject("POST", ajaxUrl, payload, opt);
+ xo.once("finish", function(status) {
+ debug("finish", status);
+ xo = null;
+
+ if (status !== 200 && status !== 204) {
+ return callback(new Error("http status " + status));
+ }
+ callback();
+ });
+ return function() {
+ debug("abort");
+ xo.close();
+ xo = null;
+
+ var err = new Error("Aborted");
+ err.code = 1000;
+ callback(err);
+ };
+ };
+ }
+
+ function AjaxBasedTransport(transUrl, urlSuffix, Receiver, AjaxObject) {
+ SenderReceiver.call(
+ this,
+ transUrl,
+ urlSuffix,
+ createAjaxSender(AjaxObject),
+ Receiver,
+ AjaxObject
+ );
+ }
+
+ inherits(AjaxBasedTransport, SenderReceiver);
+
+ module.exports = AjaxBasedTransport;
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/transport/lib/buffered-sender.js":
+ /*!*************************************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/transport/lib/buffered-sender.js ***!
+ \*************************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ var inherits = __webpack_require__(
+ /*! inherits */ "./node_modules/inherits/inherits_browser.js"
+ ),
+ EventEmitter = __webpack_require__(
+ /*! events */ "./node_modules/sockjs-client/lib/event/emitter.js"
+ ).EventEmitter;
+
+ var debug = function() {};
+ if (true) {
+ debug = __webpack_require__(
+ /*! debug */ "./node_modules/sockjs-client/node_modules/debug/src/browser.js"
+ )("sockjs-client:buffered-sender");
+ }
+
+ function BufferedSender(url, sender) {
+ debug(url);
+ EventEmitter.call(this);
+ this.sendBuffer = [];
+ this.sender = sender;
+ this.url = url;
+ }
+
+ inherits(BufferedSender, EventEmitter);
+
+ BufferedSender.prototype.send = function(message) {
+ debug("send", message);
+ this.sendBuffer.push(message);
+ if (!this.sendStop) {
+ this.sendSchedule();
+ }
+ };
+
+ // For polling transports in a situation when in the message callback,
+ // new message is being send. If the sending connection was started
+ // before receiving one, it is possible to saturate the network and
+ // timeout due to the lack of receiving socket. To avoid that we delay
+ // sending messages by some small time, in order to let receiving
+ // connection be started beforehand. This is only a halfmeasure and
+ // does not fix the big problem, but it does make the tests go more
+ // stable on slow networks.
+ BufferedSender.prototype.sendScheduleWait = function() {
+ debug("sendScheduleWait");
+ var self = this;
+ var tref;
+ this.sendStop = function() {
+ debug("sendStop");
+ self.sendStop = null;
+ clearTimeout(tref);
+ };
+ tref = setTimeout(function() {
+ debug("timeout");
+ self.sendStop = null;
+ self.sendSchedule();
+ }, 25);
+ };
+
+ BufferedSender.prototype.sendSchedule = function() {
+ debug("sendSchedule", this.sendBuffer.length);
+ var self = this;
+ if (this.sendBuffer.length > 0) {
+ var payload = "[" + this.sendBuffer.join(",") + "]";
+ this.sendStop = this.sender(this.url, payload, function(err) {
+ self.sendStop = null;
+ if (err) {
+ debug("error", err);
+ self.emit("close", err.code || 1006, "Sending error: " + err);
+ self.close();
+ } else {
+ self.sendScheduleWait();
+ }
+ });
+ this.sendBuffer = [];
+ }
+ };
+
+ BufferedSender.prototype._cleanup = function() {
+ debug("_cleanup");
+ this.removeAllListeners();
+ };
+
+ BufferedSender.prototype.close = function() {
+ debug("close");
+ this._cleanup();
+ if (this.sendStop) {
+ this.sendStop();
+ this.sendStop = null;
+ }
+ };
+
+ module.exports = BufferedSender;
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/transport/lib/iframe-wrap.js":
+ /*!*********************************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/transport/lib/iframe-wrap.js ***!
+ \*********************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /* WEBPACK VAR INJECTION */ (function(global) {
+ var inherits = __webpack_require__(
+ /*! inherits */ "./node_modules/inherits/inherits_browser.js"
+ ),
+ IframeTransport = __webpack_require__(
+ /*! ../iframe */ "./node_modules/sockjs-client/lib/transport/iframe.js"
+ ),
+ objectUtils = __webpack_require__(
+ /*! ../../utils/object */ "./node_modules/sockjs-client/lib/utils/object.js"
+ );
+
+ module.exports = function(transport) {
+ function IframeWrapTransport(transUrl, baseUrl) {
+ IframeTransport.call(
+ this,
+ transport.transportName,
+ transUrl,
+ baseUrl
+ );
+ }
+
+ inherits(IframeWrapTransport, IframeTransport);
+
+ IframeWrapTransport.enabled = function(url, info) {
+ if (!global.document) {
+ return false;
+ }
+
+ var iframeInfo = objectUtils.extend({}, info);
+ iframeInfo.sameOrigin = true;
+ return transport.enabled(iframeInfo) && IframeTransport.enabled();
+ };
+
+ IframeWrapTransport.transportName =
+ "iframe-" + transport.transportName;
+ IframeWrapTransport.needBody = true;
+ IframeWrapTransport.roundTrips =
+ IframeTransport.roundTrips + transport.roundTrips - 1; // html, javascript (2) + transport - no CORS (1)
+
+ IframeWrapTransport.facadeTransport = transport;
+
+ return IframeWrapTransport;
+ };
+
+ /* WEBPACK VAR INJECTION */
+ }.call(
+ exports,
+ __webpack_require__(
+ /*! ./../../../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"
+ )
+ ));
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/transport/lib/polling.js":
+ /*!*****************************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/transport/lib/polling.js ***!
+ \*****************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ var inherits = __webpack_require__(
+ /*! inherits */ "./node_modules/inherits/inherits_browser.js"
+ ),
+ EventEmitter = __webpack_require__(
+ /*! events */ "./node_modules/sockjs-client/lib/event/emitter.js"
+ ).EventEmitter;
+
+ var debug = function() {};
+ if (true) {
+ debug = __webpack_require__(
+ /*! debug */ "./node_modules/sockjs-client/node_modules/debug/src/browser.js"
+ )("sockjs-client:polling");
+ }
+
+ function Polling(Receiver, receiveUrl, AjaxObject) {
+ debug(receiveUrl);
+ EventEmitter.call(this);
+ this.Receiver = Receiver;
+ this.receiveUrl = receiveUrl;
+ this.AjaxObject = AjaxObject;
+ this._scheduleReceiver();
+ }
+
+ inherits(Polling, EventEmitter);
+
+ Polling.prototype._scheduleReceiver = function() {
+ debug("_scheduleReceiver");
+ var self = this;
+ var poll = (this.poll = new this.Receiver(
+ this.receiveUrl,
+ this.AjaxObject
+ ));
+
+ poll.on("message", function(msg) {
+ debug("message", msg);
+ self.emit("message", msg);
+ });
+
+ poll.once("close", function(code, reason) {
+ debug("close", code, reason, self.pollIsClosing);
+ self.poll = poll = null;
+
+ if (!self.pollIsClosing) {
+ if (reason === "network") {
+ self._scheduleReceiver();
+ } else {
+ self.emit("close", code || 1006, reason);
+ self.removeAllListeners();
+ }
+ }
+ });
+ };
+
+ Polling.prototype.abort = function() {
+ debug("abort");
+ this.removeAllListeners();
+ this.pollIsClosing = true;
+ if (this.poll) {
+ this.poll.abort();
+ }
+ };
+
+ module.exports = Polling;
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/transport/lib/sender-receiver.js":
+ /*!*************************************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/transport/lib/sender-receiver.js ***!
+ \*************************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ var inherits = __webpack_require__(
+ /*! inherits */ "./node_modules/inherits/inherits_browser.js"
+ ),
+ urlUtils = __webpack_require__(
+ /*! ../../utils/url */ "./node_modules/sockjs-client/lib/utils/url.js"
+ ),
+ BufferedSender = __webpack_require__(
+ /*! ./buffered-sender */ "./node_modules/sockjs-client/lib/transport/lib/buffered-sender.js"
+ ),
+ Polling = __webpack_require__(
+ /*! ./polling */ "./node_modules/sockjs-client/lib/transport/lib/polling.js"
+ );
+
+ var debug = function() {};
+ if (true) {
+ debug = __webpack_require__(
+ /*! debug */ "./node_modules/sockjs-client/node_modules/debug/src/browser.js"
+ )("sockjs-client:sender-receiver");
+ }
+
+ function SenderReceiver(
+ transUrl,
+ urlSuffix,
+ senderFunc,
+ Receiver,
+ AjaxObject
+ ) {
+ var pollUrl = urlUtils.addPath(transUrl, urlSuffix);
+ debug(pollUrl);
+ var self = this;
+ BufferedSender.call(this, transUrl, senderFunc);
+
+ this.poll = new Polling(Receiver, pollUrl, AjaxObject);
+ this.poll.on("message", function(msg) {
+ debug("poll message", msg);
+ self.emit("message", msg);
+ });
+ this.poll.once("close", function(code, reason) {
+ debug("poll close", code, reason);
+ self.poll = null;
+ self.emit("close", code, reason);
+ self.close();
+ });
+ }
+
+ inherits(SenderReceiver, BufferedSender);
+
+ SenderReceiver.prototype.close = function() {
+ BufferedSender.prototype.close.call(this);
+ debug("close");
+ this.removeAllListeners();
+ if (this.poll) {
+ this.poll.abort();
+ this.poll = null;
+ }
+ };
+
+ module.exports = SenderReceiver;
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/transport/receiver/eventsource.js":
+ /*!**************************************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/transport/receiver/eventsource.js ***!
+ \**************************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ var inherits = __webpack_require__(
+ /*! inherits */ "./node_modules/inherits/inherits_browser.js"
+ ),
+ EventEmitter = __webpack_require__(
+ /*! events */ "./node_modules/sockjs-client/lib/event/emitter.js"
+ ).EventEmitter,
+ EventSourceDriver = __webpack_require__(
+ /*! eventsource */ "./node_modules/sockjs-client/lib/transport/browser/eventsource.js"
+ );
+
+ var debug = function() {};
+ if (true) {
+ debug = __webpack_require__(
+ /*! debug */ "./node_modules/sockjs-client/node_modules/debug/src/browser.js"
+ )("sockjs-client:receiver:eventsource");
+ }
+
+ function EventSourceReceiver(url) {
+ debug(url);
+ EventEmitter.call(this);
+
+ var self = this;
+ var es = (this.es = new EventSourceDriver(url));
+ es.onmessage = function(e) {
+ debug("message", e.data);
+ self.emit("message", decodeURI(e.data));
+ };
+ es.onerror = function(e) {
+ debug("error", es.readyState, e);
+ // ES on reconnection has readyState = 0 or 1.
+ // on network error it's CLOSED = 2
+ var reason = es.readyState !== 2 ? "network" : "permanent";
+ self._cleanup();
+ self._close(reason);
+ };
+ }
+
+ inherits(EventSourceReceiver, EventEmitter);
+
+ EventSourceReceiver.prototype.abort = function() {
+ debug("abort");
+ this._cleanup();
+ this._close("user");
+ };
+
+ EventSourceReceiver.prototype._cleanup = function() {
+ debug("cleanup");
+ var es = this.es;
+ if (es) {
+ es.onmessage = es.onerror = null;
+ es.close();
+ this.es = null;
+ }
+ };
+
+ EventSourceReceiver.prototype._close = function(reason) {
+ debug("close", reason);
+ var self = this;
+ // Safari and chrome < 15 crash if we close window before
+ // waiting for ES cleanup. See:
+ // https://code.google.com/p/chromium/issues/detail?id=89155
+ setTimeout(function() {
+ self.emit("close", null, reason);
+ self.removeAllListeners();
+ }, 200);
+ };
+
+ module.exports = EventSourceReceiver;
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/transport/receiver/htmlfile.js":
+ /*!***********************************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/transport/receiver/htmlfile.js ***!
+ \***********************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /* WEBPACK VAR INJECTION */ (function(global) {
+ var inherits = __webpack_require__(
+ /*! inherits */ "./node_modules/inherits/inherits_browser.js"
+ ),
+ iframeUtils = __webpack_require__(
+ /*! ../../utils/iframe */ "./node_modules/sockjs-client/lib/utils/iframe.js"
+ ),
+ urlUtils = __webpack_require__(
+ /*! ../../utils/url */ "./node_modules/sockjs-client/lib/utils/url.js"
+ ),
+ EventEmitter = __webpack_require__(
+ /*! events */ "./node_modules/sockjs-client/lib/event/emitter.js"
+ ).EventEmitter,
+ random = __webpack_require__(
+ /*! ../../utils/random */ "./node_modules/sockjs-client/lib/utils/random.js"
+ );
+
+ var debug = function() {};
+ if (true) {
+ debug = __webpack_require__(
+ /*! debug */ "./node_modules/sockjs-client/node_modules/debug/src/browser.js"
+ )("sockjs-client:receiver:htmlfile");
+ }
+
+ function HtmlfileReceiver(url) {
+ debug(url);
+ EventEmitter.call(this);
+ var self = this;
+ iframeUtils.polluteGlobalNamespace();
+
+ this.id = "a" + random.string(6);
+ url = urlUtils.addQuery(
+ url,
+ "c=" + decodeURIComponent(iframeUtils.WPrefix + "." + this.id)
+ );
+
+ debug("using htmlfile", HtmlfileReceiver.htmlfileEnabled);
+ var constructFunc = HtmlfileReceiver.htmlfileEnabled
+ ? iframeUtils.createHtmlfile
+ : iframeUtils.createIframe;
+
+ global[iframeUtils.WPrefix][this.id] = {
+ start: function() {
+ debug("start");
+ self.iframeObj.loaded();
+ },
+ message: function(data) {
+ debug("message", data);
+ self.emit("message", data);
+ },
+ stop: function() {
+ debug("stop");
+ self._cleanup();
+ self._close("network");
+ }
+ };
+ this.iframeObj = constructFunc(url, function() {
+ debug("callback");
+ self._cleanup();
+ self._close("permanent");
+ });
+ }
+
+ inherits(HtmlfileReceiver, EventEmitter);
+
+ HtmlfileReceiver.prototype.abort = function() {
+ debug("abort");
+ this._cleanup();
+ this._close("user");
+ };
+
+ HtmlfileReceiver.prototype._cleanup = function() {
+ debug("_cleanup");
+ if (this.iframeObj) {
+ this.iframeObj.cleanup();
+ this.iframeObj = null;
+ }
+ delete global[iframeUtils.WPrefix][this.id];
+ };
+
+ HtmlfileReceiver.prototype._close = function(reason) {
+ debug("_close", reason);
+ this.emit("close", null, reason);
+ this.removeAllListeners();
+ };
+
+ HtmlfileReceiver.htmlfileEnabled = false;
+
+ // obfuscate to avoid firewalls
+ var axo = ["Active"].concat("Object").join("X");
+ if (axo in global) {
+ try {
+ HtmlfileReceiver.htmlfileEnabled = !!new global[axo]("htmlfile");
+ } catch (x) {
+ // intentionally empty
+ }
+ }
+
+ HtmlfileReceiver.enabled =
+ HtmlfileReceiver.htmlfileEnabled || iframeUtils.iframeEnabled;
+
+ module.exports = HtmlfileReceiver;
+
+ /* WEBPACK VAR INJECTION */
+ }.call(
+ exports,
+ __webpack_require__(
+ /*! ./../../../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"
+ )
+ ));
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/transport/receiver/jsonp.js":
+ /*!********************************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/transport/receiver/jsonp.js ***!
+ \********************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /* WEBPACK VAR INJECTION */ (function(global) {
+ var utils = __webpack_require__(
+ /*! ../../utils/iframe */ "./node_modules/sockjs-client/lib/utils/iframe.js"
+ ),
+ random = __webpack_require__(
+ /*! ../../utils/random */ "./node_modules/sockjs-client/lib/utils/random.js"
+ ),
+ browser = __webpack_require__(
+ /*! ../../utils/browser */ "./node_modules/sockjs-client/lib/utils/browser.js"
+ ),
+ urlUtils = __webpack_require__(
+ /*! ../../utils/url */ "./node_modules/sockjs-client/lib/utils/url.js"
+ ),
+ inherits = __webpack_require__(
+ /*! inherits */ "./node_modules/inherits/inherits_browser.js"
+ ),
+ EventEmitter = __webpack_require__(
+ /*! events */ "./node_modules/sockjs-client/lib/event/emitter.js"
+ ).EventEmitter;
+
+ var debug = function() {};
+ if (true) {
+ debug = __webpack_require__(
+ /*! debug */ "./node_modules/sockjs-client/node_modules/debug/src/browser.js"
+ )("sockjs-client:receiver:jsonp");
+ }
+
+ function JsonpReceiver(url) {
+ debug(url);
+ var self = this;
+ EventEmitter.call(this);
+
+ utils.polluteGlobalNamespace();
+
+ this.id = "a" + random.string(6);
+ var urlWithId = urlUtils.addQuery(
+ url,
+ "c=" + encodeURIComponent(utils.WPrefix + "." + this.id)
+ );
+
+ global[utils.WPrefix][this.id] = this._callback.bind(this);
+ this._createScript(urlWithId);
+
+ // Fallback mostly for Konqueror - stupid timer, 35 seconds shall be plenty.
+ this.timeoutId = setTimeout(function() {
+ debug("timeout");
+ self._abort(
+ new Error("JSONP script loaded abnormally (timeout)")
+ );
+ }, JsonpReceiver.timeout);
+ }
+
+ inherits(JsonpReceiver, EventEmitter);
+
+ JsonpReceiver.prototype.abort = function() {
+ debug("abort");
+ if (global[utils.WPrefix][this.id]) {
+ var err = new Error("JSONP user aborted read");
+ err.code = 1000;
+ this._abort(err);
+ }
+ };
+
+ JsonpReceiver.timeout = 35000;
+ JsonpReceiver.scriptErrorTimeout = 1000;
+
+ JsonpReceiver.prototype._callback = function(data) {
+ debug("_callback", data);
+ this._cleanup();
+
+ if (this.aborting) {
+ return;
+ }
+
+ if (data) {
+ debug("message", data);
+ this.emit("message", data);
+ }
+ this.emit("close", null, "network");
+ this.removeAllListeners();
+ };
+
+ JsonpReceiver.prototype._abort = function(err) {
+ debug("_abort", err);
+ this._cleanup();
+ this.aborting = true;
+ this.emit("close", err.code, err.message);
+ this.removeAllListeners();
+ };
+
+ JsonpReceiver.prototype._cleanup = function() {
+ debug("_cleanup");
+ clearTimeout(this.timeoutId);
+ if (this.script2) {
+ this.script2.parentNode.removeChild(this.script2);
+ this.script2 = null;
+ }
+ if (this.script) {
+ var script = this.script;
+ // Unfortunately, you can't really abort script loading of
+ // the script.
+ script.parentNode.removeChild(script);
+ script.onreadystatechange = script.onerror = script.onload = script.onclick = null;
+ this.script = null;
+ }
+ delete global[utils.WPrefix][this.id];
+ };
+
+ JsonpReceiver.prototype._scriptError = function() {
+ debug("_scriptError");
+ var self = this;
+ if (this.errorTimer) {
+ return;
+ }
+
+ this.errorTimer = setTimeout(function() {
+ if (!self.loadedOkay) {
+ self._abort(
+ new Error("JSONP script loaded abnormally (onerror)")
+ );
+ }
+ }, JsonpReceiver.scriptErrorTimeout);
+ };
+
+ JsonpReceiver.prototype._createScript = function(url) {
+ debug("_createScript", url);
+ var self = this;
+ var script = (this.script = global.document.createElement(
+ "script"
+ ));
+ var script2; // Opera synchronous load trick.
+
+ script.id = "a" + random.string(8);
+ script.src = url;
+ script.type = "text/javascript";
+ script.charset = "UTF-8";
+ script.onerror = this._scriptError.bind(this);
+ script.onload = function() {
+ debug("onload");
+ self._abort(new Error("JSONP script loaded abnormally (onload)"));
+ };
+
+ // IE9 fires 'error' event after onreadystatechange or before, in random order.
+ // Use loadedOkay to determine if actually errored
+ script.onreadystatechange = function() {
+ debug("onreadystatechange", script.readyState);
+ if (/loaded|closed/.test(script.readyState)) {
+ if (script && script.htmlFor && script.onclick) {
+ self.loadedOkay = true;
+ try {
+ // In IE, actually execute the script.
+ script.onclick();
+ } catch (x) {
+ // intentionally empty
+ }
+ }
+ if (script) {
+ self._abort(
+ new Error(
+ "JSONP script loaded abnormally (onreadystatechange)"
+ )
+ );
+ }
+ }
+ };
+ // IE: event/htmlFor/onclick trick.
+ // One can't rely on proper order for onreadystatechange. In order to
+ // make sure, set a 'htmlFor' and 'event' properties, so that
+ // script code will be installed as 'onclick' handler for the
+ // script object. Later, onreadystatechange, manually execute this
+ // code. FF and Chrome doesn't work with 'event' and 'htmlFor'
+ // set. For reference see:
+ // http://jaubourg.net/2010/07/loading-script-as-onclick-handler-of.html
+ // Also, read on that about script ordering:
+ // http://wiki.whatwg.org/wiki/Dynamic_Script_Execution_Order
+ if (
+ typeof script.async === "undefined" &&
+ global.document.attachEvent
+ ) {
+ // According to mozilla docs, in recent browsers script.async defaults
+ // to 'true', so we may use it to detect a good browser:
+ // https://developer.mozilla.org/en/HTML/Element/script
+ if (!browser.isOpera()) {
+ // Naively assume we're in IE
+ try {
+ script.htmlFor = script.id;
+ script.event = "onclick";
+ } catch (x) {
+ // intentionally empty
+ }
+ script.async = true;
+ } else {
+ // Opera, second sync script hack
+ script2 = this.script2 = global.document.createElement(
+ "script"
+ );
+ script2.text =
+ "try{var a = document.getElementById('" +
+ script.id +
+ "'); if(a)a.onerror();}catch(x){};";
+ script.async = script2.async = false;
+ }
+ }
+ if (typeof script.async !== "undefined") {
+ script.async = true;
+ }
+
+ var head = global.document.getElementsByTagName("head")[0];
+ head.insertBefore(script, head.firstChild);
+ if (script2) {
+ head.insertBefore(script2, head.firstChild);
+ }
+ };
+
+ module.exports = JsonpReceiver;
+
+ /* WEBPACK VAR INJECTION */
+ }.call(
+ exports,
+ __webpack_require__(
+ /*! ./../../../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"
+ )
+ ));
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/transport/receiver/xhr.js":
+ /*!******************************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/transport/receiver/xhr.js ***!
+ \******************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ var inherits = __webpack_require__(
+ /*! inherits */ "./node_modules/inherits/inherits_browser.js"
+ ),
+ EventEmitter = __webpack_require__(
+ /*! events */ "./node_modules/sockjs-client/lib/event/emitter.js"
+ ).EventEmitter;
+
+ var debug = function() {};
+ if (true) {
+ debug = __webpack_require__(
+ /*! debug */ "./node_modules/sockjs-client/node_modules/debug/src/browser.js"
+ )("sockjs-client:receiver:xhr");
+ }
+
+ function XhrReceiver(url, AjaxObject) {
+ debug(url);
+ EventEmitter.call(this);
+ var self = this;
+
+ this.bufferPosition = 0;
+
+ this.xo = new AjaxObject("POST", url, null);
+ this.xo.on("chunk", this._chunkHandler.bind(this));
+ this.xo.once("finish", function(status, text) {
+ debug("finish", status, text);
+ self._chunkHandler(status, text);
+ self.xo = null;
+ var reason = status === 200 ? "network" : "permanent";
+ debug("close", reason);
+ self.emit("close", null, reason);
+ self._cleanup();
+ });
+ }
+
+ inherits(XhrReceiver, EventEmitter);
+
+ XhrReceiver.prototype._chunkHandler = function(status, text) {
+ debug("_chunkHandler", status);
+ if (status !== 200 || !text) {
+ return;
+ }
+
+ for (var idx = -1; ; this.bufferPosition += idx + 1) {
+ var buf = text.slice(this.bufferPosition);
+ idx = buf.indexOf("\n");
+ if (idx === -1) {
+ break;
+ }
+ var msg = buf.slice(0, idx);
+ if (msg) {
+ debug("message", msg);
+ this.emit("message", msg);
+ }
+ }
+ };
+
+ XhrReceiver.prototype._cleanup = function() {
+ debug("_cleanup");
+ this.removeAllListeners();
+ };
+
+ XhrReceiver.prototype.abort = function() {
+ debug("abort");
+ if (this.xo) {
+ this.xo.close();
+ debug("close");
+ this.emit("close", null, "user");
+ this.xo = null;
+ }
+ this._cleanup();
+ };
+
+ module.exports = XhrReceiver;
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/transport/sender/jsonp.js":
+ /*!******************************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/transport/sender/jsonp.js ***!
+ \******************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /* WEBPACK VAR INJECTION */ (function(global) {
+ var random = __webpack_require__(
+ /*! ../../utils/random */ "./node_modules/sockjs-client/lib/utils/random.js"
+ ),
+ urlUtils = __webpack_require__(
+ /*! ../../utils/url */ "./node_modules/sockjs-client/lib/utils/url.js"
+ );
+
+ var debug = function() {};
+ if (true) {
+ debug = __webpack_require__(
+ /*! debug */ "./node_modules/sockjs-client/node_modules/debug/src/browser.js"
+ )("sockjs-client:sender:jsonp");
+ }
+
+ var form, area;
+
+ function createIframe(id) {
+ debug("createIframe", id);
+ try {
+ // ie6 dynamic iframes with target="" support (thanks Chris Lambacher)
+ return global.document.createElement(
+ '<iframe name="' + id + '">'
+ );
+ } catch (x) {
+ var iframe = global.document.createElement("iframe");
+ iframe.name = id;
+ return iframe;
+ }
+ }
+
+ function createForm() {
+ debug("createForm");
+ form = global.document.createElement("form");
+ form.style.display = "none";
+ form.style.position = "absolute";
+ form.method = "POST";
+ form.enctype = "application/x-www-form-urlencoded";
+ form.acceptCharset = "UTF-8";
+
+ area = global.document.createElement("textarea");
+ area.name = "d";
+ form.appendChild(area);
+
+ global.document.body.appendChild(form);
+ }
+
+ module.exports = function(url, payload, callback) {
+ debug(url, payload);
+ if (!form) {
+ createForm();
+ }
+ var id = "a" + random.string(8);
+ form.target = id;
+ form.action = urlUtils.addQuery(
+ urlUtils.addPath(url, "/jsonp_send"),
+ "i=" + id
+ );
+
+ var iframe = createIframe(id);
+ iframe.id = id;
+ iframe.style.display = "none";
+ form.appendChild(iframe);
+
+ try {
+ area.value = payload;
+ } catch (e) {
+ // seriously broken browsers get here
+ }
+ form.submit();
+
+ var completed = function(err) {
+ debug("completed", id, err);
+ if (!iframe.onerror) {
+ return;
+ }
+ iframe.onreadystatechange = iframe.onerror = iframe.onload = null;
+ // Opera mini doesn't like if we GC iframe
+ // immediately, thus this timeout.
+ setTimeout(function() {
+ debug("cleaning up", id);
+ iframe.parentNode.removeChild(iframe);
+ iframe = null;
+ }, 500);
+ area.value = "";
+ // It is not possible to detect if the iframe succeeded or
+ // failed to submit our form.
+ callback(err);
+ };
+ iframe.onerror = function() {
+ debug("onerror", id);
+ completed();
+ };
+ iframe.onload = function() {
+ debug("onload", id);
+ completed();
+ };
+ iframe.onreadystatechange = function(e) {
+ debug("onreadystatechange", id, iframe.readyState, e);
+ if (iframe.readyState === "complete") {
+ completed();
+ }
+ };
+ return function() {
+ debug("aborted", id);
+ completed(new Error("Aborted"));
+ };
+ };
+
+ /* WEBPACK VAR INJECTION */
+ }.call(
+ exports,
+ __webpack_require__(
+ /*! ./../../../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"
+ )
+ ));
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/transport/sender/xdr.js":
+ /*!****************************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/transport/sender/xdr.js ***!
+ \****************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /* WEBPACK VAR INJECTION */ (function(global) {
+ var EventEmitter = __webpack_require__(
+ /*! events */ "./node_modules/sockjs-client/lib/event/emitter.js"
+ ).EventEmitter,
+ inherits = __webpack_require__(
+ /*! inherits */ "./node_modules/inherits/inherits_browser.js"
+ ),
+ eventUtils = __webpack_require__(
+ /*! ../../utils/event */ "./node_modules/sockjs-client/lib/utils/event.js"
+ ),
+ browser = __webpack_require__(
+ /*! ../../utils/browser */ "./node_modules/sockjs-client/lib/utils/browser.js"
+ ),
+ urlUtils = __webpack_require__(
+ /*! ../../utils/url */ "./node_modules/sockjs-client/lib/utils/url.js"
+ );
+
+ var debug = function() {};
+ if (true) {
+ debug = __webpack_require__(
+ /*! debug */ "./node_modules/sockjs-client/node_modules/debug/src/browser.js"
+ )("sockjs-client:sender:xdr");
+ }
+
+ // References:
+ // http://ajaxian.com/archives/100-line-ajax-wrapper
+ // http://msdn.microsoft.com/en-us/library/cc288060(v=VS.85).aspx
+
+ function XDRObject(method, url, payload) {
+ debug(method, url);
+ var self = this;
+ EventEmitter.call(this);
+
+ setTimeout(function() {
+ self._start(method, url, payload);
+ }, 0);
+ }
+
+ inherits(XDRObject, EventEmitter);
+
+ XDRObject.prototype._start = function(method, url, payload) {
+ debug("_start");
+ var self = this;
+ var xdr = new global.XDomainRequest();
+ // IE caches even POSTs
+ url = urlUtils.addQuery(url, "t=" + +new Date());
+
+ xdr.onerror = function() {
+ debug("onerror");
+ self._error();
+ };
+ xdr.ontimeout = function() {
+ debug("ontimeout");
+ self._error();
+ };
+ xdr.onprogress = function() {
+ debug("progress", xdr.responseText);
+ self.emit("chunk", 200, xdr.responseText);
+ };
+ xdr.onload = function() {
+ debug("load");
+ self.emit("finish", 200, xdr.responseText);
+ self._cleanup(false);
+ };
+ this.xdr = xdr;
+ this.unloadRef = eventUtils.unloadAdd(function() {
+ self._cleanup(true);
+ });
+ try {
+ // Fails with AccessDenied if port number is bogus
+ this.xdr.open(method, url);
+ if (this.timeout) {
+ this.xdr.timeout = this.timeout;
+ }
+ this.xdr.send(payload);
+ } catch (x) {
+ this._error();
+ }
+ };
+
+ XDRObject.prototype._error = function() {
+ this.emit("finish", 0, "");
+ this._cleanup(false);
+ };
+
+ XDRObject.prototype._cleanup = function(abort) {
+ debug("cleanup", abort);
+ if (!this.xdr) {
+ return;
+ }
+ this.removeAllListeners();
+ eventUtils.unloadDel(this.unloadRef);
+
+ this.xdr.ontimeout = this.xdr.onerror = this.xdr.onprogress = this.xdr.onload = null;
+ if (abort) {
+ try {
+ this.xdr.abort();
+ } catch (x) {
+ // intentionally empty
+ }
+ }
+ this.unloadRef = this.xdr = null;
+ };
+
+ XDRObject.prototype.close = function() {
+ debug("close");
+ this._cleanup(true);
+ };
+
+ // IE 8/9 if the request target uses the same scheme - #79
+ XDRObject.enabled = !!(global.XDomainRequest && browser.hasDomain());
+
+ module.exports = XDRObject;
+
+ /* WEBPACK VAR INJECTION */
+ }.call(
+ exports,
+ __webpack_require__(
+ /*! ./../../../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"
+ )
+ ));
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/transport/sender/xhr-cors.js":
+ /*!*********************************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/transport/sender/xhr-cors.js ***!
+ \*********************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ var inherits = __webpack_require__(
+ /*! inherits */ "./node_modules/inherits/inherits_browser.js"
+ ),
+ XhrDriver = __webpack_require__(
+ /*! ../driver/xhr */ "./node_modules/sockjs-client/lib/transport/browser/abstract-xhr.js"
+ );
+
+ function XHRCorsObject(method, url, payload, opts) {
+ XhrDriver.call(this, method, url, payload, opts);
+ }
+
+ inherits(XHRCorsObject, XhrDriver);
+
+ XHRCorsObject.enabled = XhrDriver.enabled && XhrDriver.supportsCORS;
+
+ module.exports = XHRCorsObject;
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/transport/sender/xhr-fake.js":
+ /*!*********************************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/transport/sender/xhr-fake.js ***!
+ \*********************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ var EventEmitter = __webpack_require__(
+ /*! events */ "./node_modules/sockjs-client/lib/event/emitter.js"
+ ).EventEmitter,
+ inherits = __webpack_require__(
+ /*! inherits */ "./node_modules/inherits/inherits_browser.js"
+ );
+
+ function XHRFake(/* method, url, payload, opts */) {
+ var self = this;
+ EventEmitter.call(this);
+
+ this.to = setTimeout(function() {
+ self.emit("finish", 200, "{}");
+ }, XHRFake.timeout);
+ }
+
+ inherits(XHRFake, EventEmitter);
+
+ XHRFake.prototype.close = function() {
+ clearTimeout(this.to);
+ };
+
+ XHRFake.timeout = 2000;
+
+ module.exports = XHRFake;
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/transport/sender/xhr-local.js":
+ /*!**********************************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/transport/sender/xhr-local.js ***!
+ \**********************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ var inherits = __webpack_require__(
+ /*! inherits */ "./node_modules/inherits/inherits_browser.js"
+ ),
+ XhrDriver = __webpack_require__(
+ /*! ../driver/xhr */ "./node_modules/sockjs-client/lib/transport/browser/abstract-xhr.js"
+ );
+
+ function XHRLocalObject(method, url, payload /*, opts */) {
+ XhrDriver.call(this, method, url, payload, {
+ noCredentials: true
+ });
+ }
+
+ inherits(XHRLocalObject, XhrDriver);
+
+ XHRLocalObject.enabled = XhrDriver.enabled;
+
+ module.exports = XHRLocalObject;
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/transport/websocket.js":
+ /*!***************************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/transport/websocket.js ***!
+ \***************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ var utils = __webpack_require__(
+ /*! ../utils/event */ "./node_modules/sockjs-client/lib/utils/event.js"
+ ),
+ urlUtils = __webpack_require__(
+ /*! ../utils/url */ "./node_modules/sockjs-client/lib/utils/url.js"
+ ),
+ inherits = __webpack_require__(
+ /*! inherits */ "./node_modules/inherits/inherits_browser.js"
+ ),
+ EventEmitter = __webpack_require__(
+ /*! events */ "./node_modules/sockjs-client/lib/event/emitter.js"
+ ).EventEmitter,
+ WebsocketDriver = __webpack_require__(
+ /*! ./driver/websocket */ "./node_modules/sockjs-client/lib/transport/browser/websocket.js"
+ );
+
+ var debug = function() {};
+ if (true) {
+ debug = __webpack_require__(
+ /*! debug */ "./node_modules/sockjs-client/node_modules/debug/src/browser.js"
+ )("sockjs-client:websocket");
+ }
+
+ function WebSocketTransport(transUrl, ignore, options) {
+ if (!WebSocketTransport.enabled()) {
+ throw new Error("Transport created when disabled");
+ }
+
+ EventEmitter.call(this);
+ debug("constructor", transUrl);
+
+ var self = this;
+ var url = urlUtils.addPath(transUrl, "/websocket");
+ if (url.slice(0, 5) === "https") {
+ url = "wss" + url.slice(5);
+ } else {
+ url = "ws" + url.slice(4);
+ }
+ this.url = url;
+
+ this.ws = new WebsocketDriver(this.url, [], options);
+ this.ws.onmessage = function(e) {
+ debug("message event", e.data);
+ self.emit("message", e.data);
+ };
+ // Firefox has an interesting bug. If a websocket connection is
+ // created after onunload, it stays alive even when user
+ // navigates away from the page. In such situation let's lie -
+ // let's not open the ws connection at all. See:
+ // https://github.com/sockjs/sockjs-client/issues/28
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=696085
+ this.unloadRef = utils.unloadAdd(function() {
+ debug("unload");
+ self.ws.close();
+ });
+ this.ws.onclose = function(e) {
+ debug("close event", e.code, e.reason);
+ self.emit("close", e.code, e.reason);
+ self._cleanup();
+ };
+ this.ws.onerror = function(e) {
+ debug("error event", e);
+ self.emit("close", 1006, "WebSocket connection broken");
+ self._cleanup();
+ };
+ }
+
+ inherits(WebSocketTransport, EventEmitter);
+
+ WebSocketTransport.prototype.send = function(data) {
+ var msg = "[" + data + "]";
+ debug("send", msg);
+ this.ws.send(msg);
+ };
+
+ WebSocketTransport.prototype.close = function() {
+ debug("close");
+ var ws = this.ws;
+ this._cleanup();
+ if (ws) {
+ ws.close();
+ }
+ };
+
+ WebSocketTransport.prototype._cleanup = function() {
+ debug("_cleanup");
+ var ws = this.ws;
+ if (ws) {
+ ws.onmessage = ws.onclose = ws.onerror = null;
+ }
+ utils.unloadDel(this.unloadRef);
+ this.unloadRef = this.ws = null;
+ this.removeAllListeners();
+ };
+
+ WebSocketTransport.enabled = function() {
+ debug("enabled");
+ return !!WebsocketDriver;
+ };
+ WebSocketTransport.transportName = "websocket";
+
+ // In theory, ws should require 1 round trip. But in chrome, this is
+ // not very stable over SSL. Most likely a ws connection requires a
+ // separate SSL connection, in which case 2 round trips are an
+ // absolute minumum.
+ WebSocketTransport.roundTrips = 2;
+
+ module.exports = WebSocketTransport;
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/transport/xdr-polling.js":
+ /*!*****************************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/transport/xdr-polling.js ***!
+ \*****************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ var inherits = __webpack_require__(
+ /*! inherits */ "./node_modules/inherits/inherits_browser.js"
+ ),
+ AjaxBasedTransport = __webpack_require__(
+ /*! ./lib/ajax-based */ "./node_modules/sockjs-client/lib/transport/lib/ajax-based.js"
+ ),
+ XdrStreamingTransport = __webpack_require__(
+ /*! ./xdr-streaming */ "./node_modules/sockjs-client/lib/transport/xdr-streaming.js"
+ ),
+ XhrReceiver = __webpack_require__(
+ /*! ./receiver/xhr */ "./node_modules/sockjs-client/lib/transport/receiver/xhr.js"
+ ),
+ XDRObject = __webpack_require__(
+ /*! ./sender/xdr */ "./node_modules/sockjs-client/lib/transport/sender/xdr.js"
+ );
+
+ function XdrPollingTransport(transUrl) {
+ if (!XDRObject.enabled) {
+ throw new Error("Transport created when disabled");
+ }
+ AjaxBasedTransport.call(
+ this,
+ transUrl,
+ "/xhr",
+ XhrReceiver,
+ XDRObject
+ );
+ }
+
+ inherits(XdrPollingTransport, AjaxBasedTransport);
+
+ XdrPollingTransport.enabled = XdrStreamingTransport.enabled;
+ XdrPollingTransport.transportName = "xdr-polling";
+ XdrPollingTransport.roundTrips = 2; // preflight, ajax
+
+ module.exports = XdrPollingTransport;
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/transport/xdr-streaming.js":
+ /*!*******************************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/transport/xdr-streaming.js ***!
+ \*******************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ var inherits = __webpack_require__(
+ /*! inherits */ "./node_modules/inherits/inherits_browser.js"
+ ),
+ AjaxBasedTransport = __webpack_require__(
+ /*! ./lib/ajax-based */ "./node_modules/sockjs-client/lib/transport/lib/ajax-based.js"
+ ),
+ XhrReceiver = __webpack_require__(
+ /*! ./receiver/xhr */ "./node_modules/sockjs-client/lib/transport/receiver/xhr.js"
+ ),
+ XDRObject = __webpack_require__(
+ /*! ./sender/xdr */ "./node_modules/sockjs-client/lib/transport/sender/xdr.js"
+ );
+
+ // According to:
+ // http://stackoverflow.com/questions/1641507/detect-browser-support-for-cross-domain-xmlhttprequests
+ // http://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/
+
+ function XdrStreamingTransport(transUrl) {
+ if (!XDRObject.enabled) {
+ throw new Error("Transport created when disabled");
+ }
+ AjaxBasedTransport.call(
+ this,
+ transUrl,
+ "/xhr_streaming",
+ XhrReceiver,
+ XDRObject
+ );
+ }
+
+ inherits(XdrStreamingTransport, AjaxBasedTransport);
+
+ XdrStreamingTransport.enabled = function(info) {
+ if (info.cookie_needed || info.nullOrigin) {
+ return false;
+ }
+ return XDRObject.enabled && info.sameScheme;
+ };
+
+ XdrStreamingTransport.transportName = "xdr-streaming";
+ XdrStreamingTransport.roundTrips = 2; // preflight, ajax
+
+ module.exports = XdrStreamingTransport;
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/transport/xhr-polling.js":
+ /*!*****************************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/transport/xhr-polling.js ***!
+ \*****************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ var inherits = __webpack_require__(
+ /*! inherits */ "./node_modules/inherits/inherits_browser.js"
+ ),
+ AjaxBasedTransport = __webpack_require__(
+ /*! ./lib/ajax-based */ "./node_modules/sockjs-client/lib/transport/lib/ajax-based.js"
+ ),
+ XhrReceiver = __webpack_require__(
+ /*! ./receiver/xhr */ "./node_modules/sockjs-client/lib/transport/receiver/xhr.js"
+ ),
+ XHRCorsObject = __webpack_require__(
+ /*! ./sender/xhr-cors */ "./node_modules/sockjs-client/lib/transport/sender/xhr-cors.js"
+ ),
+ XHRLocalObject = __webpack_require__(
+ /*! ./sender/xhr-local */ "./node_modules/sockjs-client/lib/transport/sender/xhr-local.js"
+ );
+
+ function XhrPollingTransport(transUrl) {
+ if (!XHRLocalObject.enabled && !XHRCorsObject.enabled) {
+ throw new Error("Transport created when disabled");
+ }
+ AjaxBasedTransport.call(
+ this,
+ transUrl,
+ "/xhr",
+ XhrReceiver,
+ XHRCorsObject
+ );
+ }
+
+ inherits(XhrPollingTransport, AjaxBasedTransport);
+
+ XhrPollingTransport.enabled = function(info) {
+ if (info.nullOrigin) {
+ return false;
+ }
+
+ if (XHRLocalObject.enabled && info.sameOrigin) {
+ return true;
+ }
+ return XHRCorsObject.enabled;
+ };
+
+ XhrPollingTransport.transportName = "xhr-polling";
+ XhrPollingTransport.roundTrips = 2; // preflight, ajax
+
+ module.exports = XhrPollingTransport;
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/transport/xhr-streaming.js":
+ /*!*******************************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/transport/xhr-streaming.js ***!
+ \*******************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /* WEBPACK VAR INJECTION */ (function(global) {
+ var inherits = __webpack_require__(
+ /*! inherits */ "./node_modules/inherits/inherits_browser.js"
+ ),
+ AjaxBasedTransport = __webpack_require__(
+ /*! ./lib/ajax-based */ "./node_modules/sockjs-client/lib/transport/lib/ajax-based.js"
+ ),
+ XhrReceiver = __webpack_require__(
+ /*! ./receiver/xhr */ "./node_modules/sockjs-client/lib/transport/receiver/xhr.js"
+ ),
+ XHRCorsObject = __webpack_require__(
+ /*! ./sender/xhr-cors */ "./node_modules/sockjs-client/lib/transport/sender/xhr-cors.js"
+ ),
+ XHRLocalObject = __webpack_require__(
+ /*! ./sender/xhr-local */ "./node_modules/sockjs-client/lib/transport/sender/xhr-local.js"
+ ),
+ browser = __webpack_require__(
+ /*! ../utils/browser */ "./node_modules/sockjs-client/lib/utils/browser.js"
+ );
+
+ function XhrStreamingTransport(transUrl) {
+ if (!XHRLocalObject.enabled && !XHRCorsObject.enabled) {
+ throw new Error("Transport created when disabled");
+ }
+ AjaxBasedTransport.call(
+ this,
+ transUrl,
+ "/xhr_streaming",
+ XhrReceiver,
+ XHRCorsObject
+ );
+ }
+
+ inherits(XhrStreamingTransport, AjaxBasedTransport);
+
+ XhrStreamingTransport.enabled = function(info) {
+ if (info.nullOrigin) {
+ return false;
+ }
+ // Opera doesn't support xhr-streaming #60
+ // But it might be able to #92
+ if (browser.isOpera()) {
+ return false;
+ }
+
+ return XHRCorsObject.enabled;
+ };
+
+ XhrStreamingTransport.transportName = "xhr-streaming";
+ XhrStreamingTransport.roundTrips = 2; // preflight, ajax
+
+ // Safari gets confused when a streaming ajax request is started
+ // before onload. This causes the load indicator to spin indefinetely.
+ // Only require body when used in a browser
+ XhrStreamingTransport.needBody = !!global.document;
+
+ module.exports = XhrStreamingTransport;
+
+ /* WEBPACK VAR INJECTION */
+ }.call(
+ exports,
+ __webpack_require__(
+ /*! ./../../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"
+ )
+ ));
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/utils/browser-crypto.js":
+ /*!****************************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/utils/browser-crypto.js ***!
+ \****************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /* WEBPACK VAR INJECTION */ (function(global) {
+ if (global.crypto && global.crypto.getRandomValues) {
+ module.exports.randomBytes = function(length) {
+ var bytes = new Uint8Array(length);
+ global.crypto.getRandomValues(bytes);
+ return bytes;
+ };
+ } else {
+ module.exports.randomBytes = function(length) {
+ var bytes = new Array(length);
+ for (var i = 0; i < length; i++) {
+ bytes[i] = Math.floor(Math.random() * 256);
+ }
+ return bytes;
+ };
+ }
+
+ /* WEBPACK VAR INJECTION */
+ }.call(
+ exports,
+ __webpack_require__(
+ /*! ./../../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"
+ )
+ ));
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/utils/browser.js":
+ /*!*********************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/utils/browser.js ***!
+ \*********************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /* WEBPACK VAR INJECTION */ (function(global) {
+ module.exports = {
+ isOpera: function() {
+ return (
+ global.navigator && /opera/i.test(global.navigator.userAgent)
+ );
+ },
+
+ isKonqueror: function() {
+ return (
+ global.navigator &&
+ /konqueror/i.test(global.navigator.userAgent)
+ );
+ },
+
+ // #187 wrap document.domain in try/catch because of WP8 from file:///
+ hasDomain: function() {
+ // non-browser client always has a domain
+ if (!global.document) {
+ return true;
+ }
+
+ try {
+ return !!global.document.domain;
+ } catch (e) {
+ return false;
+ }
+ }
+ };
+
+ /* WEBPACK VAR INJECTION */
+ }.call(
+ exports,
+ __webpack_require__(
+ /*! ./../../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"
+ )
+ ));
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/utils/escape.js":
+ /*!********************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/utils/escape.js ***!
+ \********************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ var JSON3 = __webpack_require__(
+ /*! json3 */ "./node_modules/json3/lib/json3.js"
+ );
+
+ // Some extra characters that Chrome gets wrong, and substitutes with
+ // something else on the wire.
+ // eslint-disable-next-line no-control-regex
+ var extraEscapable = /[\x00-\x1f\ud800-\udfff\ufffe\uffff\u0300-\u0333\u033d-\u0346\u034a-\u034c\u0350-\u0352\u0357-\u0358\u035c-\u0362\u0374\u037e\u0387\u0591-\u05af\u05c4\u0610-\u0617\u0653-\u0654\u0657-\u065b\u065d-\u065e\u06df-\u06e2\u06eb-\u06ec\u0730\u0732-\u0733\u0735-\u0736\u073a\u073d\u073f-\u0741\u0743\u0745\u0747\u07eb-\u07f1\u0951\u0958-\u095f\u09dc-\u09dd\u09df\u0a33\u0a36\u0a59-\u0a5b\u0a5e\u0b5c-\u0b5d\u0e38-\u0e39\u0f43\u0f4d\u0f52\u0f57\u0f5c\u0f69\u0f72-\u0f76\u0f78\u0f80-\u0f83\u0f93\u0f9d\u0fa2\u0fa7\u0fac\u0fb9\u1939-\u193a\u1a17\u1b6b\u1cda-\u1cdb\u1dc0-\u1dcf\u1dfc\u1dfe\u1f71\u1f73\u1f75\u1f77\u1f79\u1f7b\u1f7d\u1fbb\u1fbe\u1fc9\u1fcb\u1fd3\u1fdb\u1fe3\u1feb\u1fee-\u1fef\u1ff9\u1ffb\u1ffd\u2000-\u2001\u20d0-\u20d1\u20d4-\u20d7\u20e7-\u20e9\u2126\u212a-\u212b\u2329-\u232a\u2adc\u302b-\u302c\uaab2-\uaab3\uf900-\ufa0d\ufa10\ufa12\ufa15-\ufa1e\ufa20\ufa22\ufa25-\ufa26\ufa2a-\ufa2d\ufa30-\ufa6d\ufa70-\ufad9\ufb1d\ufb1f\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40-\ufb41\ufb43-\ufb44\ufb46-\ufb4e\ufff0-\uffff]/g,
+ extraLookup;
+
+ // This may be quite slow, so let's delay until user actually uses bad
+ // characters.
+ var unrollLookup = function(escapable) {
+ var i;
+ var unrolled = {};
+ var c = [];
+ for (i = 0; i < 65536; i++) {
+ c.push(String.fromCharCode(i));
+ }
+ escapable.lastIndex = 0;
+ c.join("").replace(escapable, function(a) {
+ unrolled[a] =
+ "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
+ return "";
+ });
+ escapable.lastIndex = 0;
+ return unrolled;
+ };
+
+ // Quote string, also taking care of unicode characters that browsers
+ // often break. Especially, take care of unicode surrogates:
+ // http://en.wikipedia.org/wiki/Mapping_of_Unicode_characters#Surrogates
+ module.exports = {
+ quote: function(string) {
+ var quoted = JSON3.stringify(string);
+
+ // In most cases this should be very fast and good enough.
+ extraEscapable.lastIndex = 0;
+ if (!extraEscapable.test(quoted)) {
+ return quoted;
+ }
+
+ if (!extraLookup) {
+ extraLookup = unrollLookup(extraEscapable);
+ }
+
+ return quoted.replace(extraEscapable, function(a) {
+ return extraLookup[a];
+ });
+ }
+ };
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/utils/event.js":
+ /*!*******************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/utils/event.js ***!
+ \*******************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /* WEBPACK VAR INJECTION */ (function(global) {
+ var random = __webpack_require__(
+ /*! ./random */ "./node_modules/sockjs-client/lib/utils/random.js"
+ );
+
+ var onUnload = {},
+ afterUnload = false,
+ // detect google chrome packaged apps because they don't allow the 'unload' event
+ isChromePackagedApp =
+ global.chrome && global.chrome.app && global.chrome.app.runtime;
+
+ module.exports = {
+ attachEvent: function(event, listener) {
+ if (typeof global.addEventListener !== "undefined") {
+ global.addEventListener(event, listener, false);
+ } else if (global.document && global.attachEvent) {
+ // IE quirks.
+ // According to: http://stevesouders.com/misc/test-postmessage.php
+ // the message gets delivered only to 'document', not 'window'.
+ global.document.attachEvent("on" + event, listener);
+ // I get 'window' for ie8.
+ global.attachEvent("on" + event, listener);
+ }
+ },
+
+ detachEvent: function(event, listener) {
+ if (typeof global.addEventListener !== "undefined") {
+ global.removeEventListener(event, listener, false);
+ } else if (global.document && global.detachEvent) {
+ global.document.detachEvent("on" + event, listener);
+ global.detachEvent("on" + event, listener);
+ }
+ },
+
+ unloadAdd: function(listener) {
+ if (isChromePackagedApp) {
+ return null;
+ }
+
+ var ref = random.string(8);
+ onUnload[ref] = listener;
+ if (afterUnload) {
+ setTimeout(this.triggerUnloadCallbacks, 0);
+ }
+ return ref;
+ },
+
+ unloadDel: function(ref) {
+ if (ref in onUnload) {
+ delete onUnload[ref];
+ }
+ },
+
+ triggerUnloadCallbacks: function() {
+ for (var ref in onUnload) {
+ onUnload[ref]();
+ delete onUnload[ref];
+ }
+ }
+ };
+
+ var unloadTriggered = function() {
+ if (afterUnload) {
+ return;
+ }
+ afterUnload = true;
+ module.exports.triggerUnloadCallbacks();
+ };
+
+ // 'unload' alone is not reliable in opera within an iframe, but we
+ // can't use `beforeunload` as IE fires it on javascript: links.
+ if (!isChromePackagedApp) {
+ module.exports.attachEvent("unload", unloadTriggered);
+ }
+
+ /* WEBPACK VAR INJECTION */
+ }.call(
+ exports,
+ __webpack_require__(
+ /*! ./../../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"
+ )
+ ));
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/utils/iframe.js":
+ /*!********************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/utils/iframe.js ***!
+ \********************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /* WEBPACK VAR INJECTION */ (function(global) {
+ var eventUtils = __webpack_require__(
+ /*! ./event */ "./node_modules/sockjs-client/lib/utils/event.js"
+ ),
+ JSON3 = __webpack_require__(
+ /*! json3 */ "./node_modules/json3/lib/json3.js"
+ ),
+ browser = __webpack_require__(
+ /*! ./browser */ "./node_modules/sockjs-client/lib/utils/browser.js"
+ );
+
+ var debug = function() {};
+ if (true) {
+ debug = __webpack_require__(
+ /*! debug */ "./node_modules/sockjs-client/node_modules/debug/src/browser.js"
+ )("sockjs-client:utils:iframe");
+ }
+
+ module.exports = {
+ WPrefix: "_jp",
+ currentWindowId: null,
+
+ polluteGlobalNamespace: function() {
+ if (!(module.exports.WPrefix in global)) {
+ global[module.exports.WPrefix] = {};
+ }
+ },
+
+ postMessage: function(type, data) {
+ if (global.parent !== global) {
+ global.parent.postMessage(
+ JSON3.stringify({
+ windowId: module.exports.currentWindowId,
+ type: type,
+ data: data || ""
+ }),
+ "*"
+ );
+ } else {
+ debug("Cannot postMessage, no parent window.", type, data);
+ }
+ },
+
+ createIframe: function(iframeUrl, errorCallback) {
+ var iframe = global.document.createElement("iframe");
+ var tref, unloadRef;
+ var unattach = function() {
+ debug("unattach");
+ clearTimeout(tref);
+ // Explorer had problems with that.
+ try {
+ iframe.onload = null;
+ } catch (x) {
+ // intentionally empty
+ }
+ iframe.onerror = null;
+ };
+ var cleanup = function() {
+ debug("cleanup");
+ if (iframe) {
+ unattach();
+ // This timeout makes chrome fire onbeforeunload event
+ // within iframe. Without the timeout it goes straight to
+ // onunload.
+ setTimeout(function() {
+ if (iframe) {
+ iframe.parentNode.removeChild(iframe);
+ }
+ iframe = null;
+ }, 0);
+ eventUtils.unloadDel(unloadRef);
+ }
+ };
+ var onerror = function(err) {
+ debug("onerror", err);
+ if (iframe) {
+ cleanup();
+ errorCallback(err);
+ }
+ };
+ var post = function(msg, origin) {
+ debug("post", msg, origin);
+ try {
+ // When the iframe is not loaded, IE raises an exception
+ // on 'contentWindow'.
+ setTimeout(function() {
+ if (iframe && iframe.contentWindow) {
+ iframe.contentWindow.postMessage(msg, origin);
+ }
+ }, 0);
+ } catch (x) {
+ // intentionally empty
+ }
+ };
+
+ iframe.src = iframeUrl;
+ iframe.style.display = "none";
+ iframe.style.position = "absolute";
+ iframe.onerror = function() {
+ onerror("onerror");
+ };
+ iframe.onload = function() {
+ debug("onload");
+ // `onload` is triggered before scripts on the iframe are
+ // executed. Give it few seconds to actually load stuff.
+ clearTimeout(tref);
+ tref = setTimeout(function() {
+ onerror("onload timeout");
+ }, 2000);
+ };
+ global.document.body.appendChild(iframe);
+ tref = setTimeout(function() {
+ onerror("timeout");
+ }, 15000);
+ unloadRef = eventUtils.unloadAdd(cleanup);
+ return {
+ post: post,
+ cleanup: cleanup,
+ loaded: unattach
+ };
+ },
+
+ /* eslint no-undef: "off", new-cap: "off" */
+ createHtmlfile: function(iframeUrl, errorCallback) {
+ var axo = ["Active"].concat("Object").join("X");
+ var doc = new global[axo]("htmlfile");
+ var tref, unloadRef;
+ var iframe;
+ var unattach = function() {
+ clearTimeout(tref);
+ iframe.onerror = null;
+ };
+ var cleanup = function() {
+ if (doc) {
+ unattach();
+ eventUtils.unloadDel(unloadRef);
+ iframe.parentNode.removeChild(iframe);
+ iframe = doc = null;
+ CollectGarbage();
+ }
+ };
+ var onerror = function(r) {
+ debug("onerror", r);
+ if (doc) {
+ cleanup();
+ errorCallback(r);
+ }
+ };
+ var post = function(msg, origin) {
+ try {
+ // When the iframe is not loaded, IE raises an exception
+ // on 'contentWindow'.
+ setTimeout(function() {
+ if (iframe && iframe.contentWindow) {
+ iframe.contentWindow.postMessage(msg, origin);
+ }
+ }, 0);
+ } catch (x) {
+ // intentionally empty
+ }
+ };
+
+ doc.open();
+ doc.write(
+ "<html><s" +
+ "cript>" +
+ 'document.domain="' +
+ global.document.domain +
+ '";' +
+ "</s" +
+ "cript></html>"
+ );
+ doc.close();
+ doc.parentWindow[module.exports.WPrefix] =
+ global[module.exports.WPrefix];
+ var c = doc.createElement("div");
+ doc.body.appendChild(c);
+ iframe = doc.createElement("iframe");
+ c.appendChild(iframe);
+ iframe.src = iframeUrl;
+ iframe.onerror = function() {
+ onerror("onerror");
+ };
+ tref = setTimeout(function() {
+ onerror("timeout");
+ }, 15000);
+ unloadRef = eventUtils.unloadAdd(cleanup);
+ return {
+ post: post,
+ cleanup: cleanup,
+ loaded: unattach
+ };
+ }
+ };
+
+ module.exports.iframeEnabled = false;
+ if (global.document) {
+ // postMessage misbehaves in konqueror 4.6.5 - the messages are delivered with
+ // huge delay, or not at all.
+ module.exports.iframeEnabled =
+ (typeof global.postMessage === "function" ||
+ typeof global.postMessage === "object") &&
+ !browser.isKonqueror();
+ }
+
+ /* WEBPACK VAR INJECTION */
+ }.call(
+ exports,
+ __webpack_require__(
+ /*! ./../../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"
+ )
+ ));
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/utils/log.js":
+ /*!*****************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/utils/log.js ***!
+ \*****************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /* WEBPACK VAR INJECTION */ (function(global) {
+ var logObject = {};
+ ["log", "debug", "warn"].forEach(function(level) {
+ var levelExists;
+
+ try {
+ levelExists =
+ global.console &&
+ global.console[level] &&
+ global.console[level].apply;
+ } catch (e) {
+ // do nothing
+ }
+
+ logObject[level] = levelExists
+ ? function() {
+ return global.console[level].apply(global.console, arguments);
+ }
+ : level === "log" ? function() {} : logObject.log;
+ });
+
+ module.exports = logObject;
+
+ /* WEBPACK VAR INJECTION */
+ }.call(
+ exports,
+ __webpack_require__(
+ /*! ./../../../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"
+ )
+ ));
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/utils/object.js":
+ /*!********************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/utils/object.js ***!
+ \********************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ module.exports = {
+ isObject: function(obj) {
+ var type = typeof obj;
+ return type === "function" || (type === "object" && !!obj);
+ },
+
+ extend: function(obj) {
+ if (!this.isObject(obj)) {
+ return obj;
+ }
+ var source, prop;
+ for (var i = 1, length = arguments.length; i < length; i++) {
+ source = arguments[i];
+ for (prop in source) {
+ if (Object.prototype.hasOwnProperty.call(source, prop)) {
+ obj[prop] = source[prop];
+ }
+ }
+ }
+ return obj;
+ }
+ };
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/utils/random.js":
+ /*!********************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/utils/random.js ***!
+ \********************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ /* global crypto:true */
+ var crypto = __webpack_require__(
+ /*! crypto */ "./node_modules/sockjs-client/lib/utils/browser-crypto.js"
+ );
+
+ // This string has length 32, a power of 2, so the modulus doesn't introduce a
+ // bias.
+ var _randomStringChars = "abcdefghijklmnopqrstuvwxyz012345";
+ module.exports = {
+ string: function(length) {
+ var max = _randomStringChars.length;
+ var bytes = crypto.randomBytes(length);
+ var ret = [];
+ for (var i = 0; i < length; i++) {
+ ret.push(_randomStringChars.substr(bytes[i] % max, 1));
+ }
+ return ret.join("");
+ },
+
+ number: function(max) {
+ return Math.floor(Math.random() * max);
+ },
+
+ numberString: function(max) {
+ var t = ("" + (max - 1)).length;
+ var p = new Array(t + 1).join("0");
+ return (p + this.number(max)).slice(-t);
+ }
+ };
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/utils/transport.js":
+ /*!***********************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/utils/transport.js ***!
+ \***********************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ var debug = function() {};
+ if (true) {
+ debug = __webpack_require__(
+ /*! debug */ "./node_modules/sockjs-client/node_modules/debug/src/browser.js"
+ )("sockjs-client:utils:transport");
+ }
+
+ module.exports = function(availableTransports) {
+ return {
+ filterToEnabled: function(transportsWhitelist, info) {
+ var transports = {
+ main: [],
+ facade: []
+ };
+ if (!transportsWhitelist) {
+ transportsWhitelist = [];
+ } else if (typeof transportsWhitelist === "string") {
+ transportsWhitelist = [transportsWhitelist];
+ }
+
+ availableTransports.forEach(function(trans) {
+ if (!trans) {
+ return;
+ }
+
+ if (
+ trans.transportName === "websocket" &&
+ info.websocket === false
+ ) {
+ debug("disabled from server", "websocket");
+ return;
+ }
+
+ if (
+ transportsWhitelist.length &&
+ transportsWhitelist.indexOf(trans.transportName) === -1
+ ) {
+ debug("not in whitelist", trans.transportName);
+ return;
+ }
+
+ if (trans.enabled(info)) {
+ debug("enabled", trans.transportName);
+ transports.main.push(trans);
+ if (trans.facadeTransport) {
+ transports.facade.push(trans.facadeTransport);
+ }
+ } else {
+ debug("disabled", trans.transportName);
+ }
+ });
+ return transports;
+ }
+ };
+ };
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/utils/url.js":
+ /*!*****************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/utils/url.js ***!
+ \*****************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ var URL = __webpack_require__(
+ /*! url-parse */ "./node_modules/url-parse/index.js"
+ );
+
+ var debug = function() {};
+ if (true) {
+ debug = __webpack_require__(
+ /*! debug */ "./node_modules/sockjs-client/node_modules/debug/src/browser.js"
+ )("sockjs-client:utils:url");
+ }
+
+ module.exports = {
+ getOrigin: function(url) {
+ if (!url) {
+ return null;
+ }
+
+ var p = new URL(url);
+ if (p.protocol === "file:") {
+ return null;
+ }
+
+ var port = p.port;
+ if (!port) {
+ port = p.protocol === "https:" ? "443" : "80";
+ }
+
+ return p.protocol + "//" + p.hostname + ":" + port;
+ },
+
+ isOriginEqual: function(a, b) {
+ var res = this.getOrigin(a) === this.getOrigin(b);
+ debug("same", a, b, res);
+ return res;
+ },
+
+ isSchemeEqual: function(a, b) {
+ return a.split(":")[0] === b.split(":")[0];
+ },
+
+ addPath: function(url, path) {
+ var qs = url.split("?");
+ return qs[0] + path + (qs[1] ? "?" + qs[1] : "");
+ },
+
+ addQuery: function(url, q) {
+ return url + (url.indexOf("?") === -1 ? "?" + q : "&" + q);
+ }
+ };
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/lib/version.js":
+ /*!***************************************************!*\
+ !*** ./node_modules/sockjs-client/lib/version.js ***!
+ \***************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports) {
+ module.exports = "1.1.4";
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/node_modules/debug/src/browser.js":
+ /*!**********************************************************************!*\
+ !*** ./node_modules/sockjs-client/node_modules/debug/src/browser.js ***!
+ \**********************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ /* WEBPACK VAR INJECTION */ (function(process) {
+ /**
+ * This is the web browser implementation of `debug()`.
+ *
+ * Expose `debug()` as the module.
+ */
+
+ exports = module.exports = __webpack_require__(
+ /*! ./debug */ "./node_modules/sockjs-client/node_modules/debug/src/debug.js"
+ );
+ exports.log = log;
+ exports.formatArgs = formatArgs;
+ exports.save = save;
+ exports.load = load;
+ exports.useColors = useColors;
+ exports.storage =
+ "undefined" != typeof chrome && "undefined" != typeof chrome.storage
+ ? chrome.storage.local
+ : localstorage();
+
+ /**
+ * Colors.
+ */
+
+ exports.colors = [
+ "lightseagreen",
+ "forestgreen",
+ "goldenrod",
+ "dodgerblue",
+ "darkorchid",
+ "crimson"
+ ];
+
+ /**
+ * Currently only WebKit-based Web Inspectors, Firefox >= v31,
+ * and the Firebug extension (any Firefox version) are known
+ * to support "%c" CSS customizations.
+ *
+ * TODO: add a `localStorage` variable to explicitly enable/disable colors
+ */
+
+ function useColors() {
+ // NB: In an Electron preload script, document will be defined but not fully
+ // initialized. Since we know we're in Chrome, we'll just detect this case
+ // explicitly
+ if (
+ typeof window !== "undefined" &&
+ window.process &&
+ window.process.type === "renderer"
+ ) {
+ return true;
+ }
+
+ // is webkit? http://stackoverflow.com/a/16459606/376773
+ // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632
+ return (
+ (typeof document !== "undefined" &&
+ document.documentElement &&
+ document.documentElement.style &&
+ document.documentElement.style.WebkitAppearance) ||
+ // is firebug? http://stackoverflow.com/a/398120/376773
+ (typeof window !== "undefined" &&
+ window.console &&
+ (window.console.firebug ||
+ (window.console.exception && window.console.table))) ||
+ // is firefox >= v31?
+ // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages
+ (typeof navigator !== "undefined" &&
+ navigator.userAgent &&
+ navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) &&
+ parseInt(RegExp.$1, 10) >= 31) ||
+ // double check webkit in userAgent just in case we are in a worker
+ (typeof navigator !== "undefined" &&
+ navigator.userAgent &&
+ navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/))
+ );
+ }
+
+ /**
+ * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.
+ */
+
+ exports.formatters.j = function(v) {
+ try {
+ return JSON.stringify(v);
+ } catch (err) {
+ return "[UnexpectedJSONParseError]: " + err.message;
+ }
+ };
+
+ /**
+ * Colorize log arguments if enabled.
+ *
+ * @api public
+ */
+
+ function formatArgs(args) {
+ var useColors = this.useColors;
+
+ args[0] =
+ (useColors ? "%c" : "") +
+ this.namespace +
+ (useColors ? " %c" : " ") +
+ args[0] +
+ (useColors ? "%c " : " ") +
+ "+" +
+ exports.humanize(this.diff);
+
+ if (!useColors) return;
+
+ var c = "color: " + this.color;
+ args.splice(1, 0, c, "color: inherit");
+
+ // the final "%c" is somewhat tricky, because there could be other
+ // arguments passed either before or after the %c, so we need to
+ // figure out the correct index to insert the CSS into
+ var index = 0;
+ var lastC = 0;
+ args[0].replace(/%[a-zA-Z%]/g, function(match) {
+ if ("%%" === match) return;
+ index++;
+ if ("%c" === match) {
+ // we only are interested in the *last* %c
+ // (the user may have provided their own)
+ lastC = index;
+ }
+ });
+
+ args.splice(lastC, 0, c);
+ }
+
+ /**
+ * Invokes `console.log()` when available.
+ * No-op when `console.log` is not a "function".
+ *
+ * @api public
+ */
+
+ function log() {
+ // this hackery is required for IE8/9, where
+ // the `console.log` function doesn't have 'apply'
+ return (
+ "object" === typeof console &&
+ console.log &&
+ Function.prototype.apply.call(console.log, console, arguments)
+ );
+ }
+
+ /**
+ * Save `namespaces`.
+ *
+ * @param {String} namespaces
+ * @api private
+ */
+
+ function save(namespaces) {
+ try {
+ if (null == namespaces) {
+ exports.storage.removeItem("debug");
+ } else {
+ exports.storage.debug = namespaces;
+ }
+ } catch (e) {}
+ }
+
+ /**
+ * Load `namespaces`.
+ *
+ * @return {String} returns the previously persisted debug modes
+ * @api private
+ */
+
+ function load() {
+ var r;
+ try {
+ r = exports.storage.debug;
+ } catch (e) {}
+
+ // If debug isn't set in LS, and we're in Electron, try to load $DEBUG
+ if (!r && typeof process !== "undefined" && "env" in process) {
+ r = Object({ NODE_ENV: "development", PUBLIC_URL: "" }).DEBUG;
+ }
+
+ return r;
+ }
+
+ /**
+ * Enable namespaces listed in `localStorage.debug` initially.
+ */
+
+ exports.enable(load());
+
+ /**
+ * Localstorage attempts to return the localstorage.
+ *
+ * This is necessary because safari throws
+ * when a user disables cookies/localstorage
+ * and you attempt to access it.
+ *
+ * @return {LocalStorage}
+ * @api private
+ */
+
+ function localstorage() {
+ try {
+ return window.localStorage;
+ } catch (e) {}
+ }
+
+ /* WEBPACK VAR INJECTION */
+ }.call(
+ exports,
+ __webpack_require__(
+ /*! ./../../../../process/browser.js */ "./node_modules/process/browser.js"
+ )
+ ));
+
+ /***/
+ },
+
+ /***/ "./node_modules/sockjs-client/node_modules/debug/src/debug.js":
+ /*!********************************************************************!*\
+ !*** ./node_modules/sockjs-client/node_modules/debug/src/debug.js ***!
+ \********************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ /**
+ * This is the common logic for both the Node.js and web browser
+ * implementations of `debug()`.
+ *
+ * Expose `debug()` as the module.
+ */
+
+ exports = module.exports = createDebug.debug = createDebug[
+ "default"
+ ] = createDebug;
+ exports.coerce = coerce;
+ exports.disable = disable;
+ exports.enable = enable;
+ exports.enabled = enabled;
+ exports.humanize = __webpack_require__(
+ /*! ms */ "./node_modules/ms/index.js"
+ );
+
+ /**
+ * The currently active debug mode names, and names to skip.
+ */
+
+ exports.names = [];
+ exports.skips = [];
+
+ /**
+ * Map of special "%n" handling functions, for the debug "format" argument.
+ *
+ * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N".
+ */
+
+ exports.formatters = {};
+
+ /**
+ * Previous log timestamp.
+ */
+
+ var prevTime;
+
+ /**
+ * Select a color.
+ * @param {String} namespace
+ * @return {Number}
+ * @api private
+ */
+
+ function selectColor(namespace) {
+ var hash = 0,
+ i;
+
+ for (i in namespace) {
+ hash = (hash << 5) - hash + namespace.charCodeAt(i);
+ hash |= 0; // Convert to 32bit integer
+ }
+
+ return exports.colors[Math.abs(hash) % exports.colors.length];
+ }
+
+ /**
+ * Create a debugger with the given `namespace`.
+ *
+ * @param {String} namespace
+ * @return {Function}
+ * @api public
+ */
+
+ function createDebug(namespace) {
+ function debug() {
+ // disabled?
+ if (!debug.enabled) return;
+
+ var self = debug;
+
+ // set `diff` timestamp
+ var curr = +new Date();
+ var ms = curr - (prevTime || curr);
+ self.diff = ms;
+ self.prev = prevTime;
+ self.curr = curr;
+ prevTime = curr;
+
+ // turn the `arguments` into a proper Array
+ var args = new Array(arguments.length);
+ for (var i = 0; i < args.length; i++) {
+ args[i] = arguments[i];
+ }
+
+ args[0] = exports.coerce(args[0]);
+
+ if ("string" !== typeof args[0]) {
+ // anything else let's inspect with %O
+ args.unshift("%O");
+ }
+
+ // apply any `formatters` transformations
+ var index = 0;
+ args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) {
+ // if we encounter an escaped % then don't increase the array index
+ if (match === "%%") return match;
+ index++;
+ var formatter = exports.formatters[format];
+ if ("function" === typeof formatter) {
+ var val = args[index];
+ match = formatter.call(self, val);
+
+ // now we need to remove `args[index]` since it's inlined in the `format`
+ args.splice(index, 1);
+ index--;
+ }
+ return match;
+ });
+
+ // apply env-specific formatting (colors, etc.)
+ exports.formatArgs.call(self, args);
+
+ var logFn = debug.log || exports.log || console.log.bind(console);
+ logFn.apply(self, args);
+ }
+
+ debug.namespace = namespace;
+ debug.enabled = exports.enabled(namespace);
+ debug.useColors = exports.useColors();
+ debug.color = selectColor(namespace);
+
+ // env-specific initialization logic for debug instances
+ if ("function" === typeof exports.init) {
+ exports.init(debug);
+ }
+
+ return debug;
+ }
+
+ /**
+ * Enables a debug mode by namespaces. This can include modes
+ * separated by a colon and wildcards.
+ *
+ * @param {String} namespaces
+ * @api public
+ */
+
+ function enable(namespaces) {
+ exports.save(namespaces);
+
+ exports.names = [];
+ exports.skips = [];
+
+ var split = (typeof namespaces === "string" ? namespaces : "").split(
+ /[\s,]+/
+ );
+ var len = split.length;
+
+ for (var i = 0; i < len; i++) {
+ if (!split[i]) continue; // ignore empty strings
+ namespaces = split[i].replace(/\*/g, ".*?");
+ if (namespaces[0] === "-") {
+ exports.skips.push(new RegExp("^" + namespaces.substr(1) + "$"));
+ } else {
+ exports.names.push(new RegExp("^" + namespaces + "$"));
+ }
+ }
+ }
+
+ /**
+ * Disable debug output.
+ *
+ * @api public
+ */
+
+ function disable() {
+ exports.enable("");
+ }
+
+ /**
+ * Returns true if the given mode name is enabled, false otherwise.
+ *
+ * @param {String} name
+ * @return {Boolean}
+ * @api public
+ */
+
+ function enabled(name) {
+ var i, len;
+ for (i = 0, len = exports.skips.length; i < len; i++) {
+ if (exports.skips[i].test(name)) {
+ return false;
+ }
+ }
+ for (i = 0, len = exports.names.length; i < len; i++) {
+ if (exports.names[i].test(name)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Coerce `val`.
+ *
+ * @param {Mixed} val
+ * @return {Mixed}
+ * @api private
+ */
+
+ function coerce(val) {
+ if (val instanceof Error) return val.stack || val.message;
+ return val;
+ }
+
+ /***/
+ },
+
+ /***/ "./node_modules/supports-color/index.js":
+ /*!**********************************************!*\
+ !*** ./node_modules/supports-color/index.js ***!
+ \**********************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /* WEBPACK VAR INJECTION */ (function(process) {
+ var argv = process.argv;
+
+ var terminator = argv.indexOf("--");
+ var hasFlag = function(flag) {
+ flag = "--" + flag;
+ var pos = argv.indexOf(flag);
+ return pos !== -1 && (terminator !== -1 ? pos < terminator : true);
+ };
+
+ module.exports = (function() {
+ if (
+ "FORCE_COLOR" in
+ Object({ NODE_ENV: "development", PUBLIC_URL: "" })
+ ) {
+ return true;
+ }
+
+ if (
+ hasFlag("no-color") ||
+ hasFlag("no-colors") ||
+ hasFlag("color=false")
+ ) {
+ return false;
+ }
+
+ if (
+ hasFlag("color") ||
+ hasFlag("colors") ||
+ hasFlag("color=true") ||
+ hasFlag("color=always")
+ ) {
+ return true;
+ }
+
+ if (process.stdout && !process.stdout.isTTY) {
+ return false;
+ }
+
+ if (process.platform === "win32") {
+ return true;
+ }
+
+ if (
+ "COLORTERM" in Object({ NODE_ENV: "development", PUBLIC_URL: "" })
+ ) {
+ return true;
+ }
+
+ if (
+ Object({ NODE_ENV: "development", PUBLIC_URL: "" }).TERM ===
+ "dumb"
+ ) {
+ return false;
+ }
+
+ if (
+ /^screen|^xterm|^vt100|color|ansi|cygwin|linux/i.test(
+ Object({ NODE_ENV: "development", PUBLIC_URL: "" }).TERM
+ )
+ ) {
+ return true;
+ }
+
+ return false;
+ })();
+
+ /* WEBPACK VAR INJECTION */
+ }.call(
+ exports,
+ __webpack_require__(
+ /*! ./../process/browser.js */ "./node_modules/process/browser.js"
+ )
+ ));
+
+ /***/
+ },
+
+ /***/ "./node_modules/url-parse/index.js":
+ /*!*****************************************!*\
+ !*** ./node_modules/url-parse/index.js ***!
+ \*****************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ /* WEBPACK VAR INJECTION */ (function(global) {
+ var required = __webpack_require__(
+ /*! requires-port */ "./node_modules/requires-port/index.js"
+ ),
+ qs = __webpack_require__(
+ /*! querystringify */ "./node_modules/url-parse/node_modules/querystringify/index.js"
+ ),
+ protocolre = /^([a-z][a-z0-9.+-]*:)?(\/\/)?([\S\s]*)/i,
+ slashes = /^[A-Za-z][A-Za-z0-9+-.]*:\/\//;
+
+ /**
+ * These are the parse rules for the URL parser, it informs the parser
+ * about:
+ *
+ * 0. The char it Needs to parse, if it's a string it should be done using
+ * indexOf, RegExp using exec and NaN means set as current value.
+ * 1. The property we should set when parsing this value.
+ * 2. Indication if it's backwards or forward parsing, when set as number it's
+ * the value of extra chars that should be split off.
+ * 3. Inherit from location if non existing in the parser.
+ * 4. `toLowerCase` the resulting value.
+ */
+ var rules = [
+ ["#", "hash"], // Extract from the back.
+ ["?", "query"], // Extract from the back.
+ ["/", "pathname"], // Extract from the back.
+ ["@", "auth", 1], // Extract from the front.
+ [NaN, "host", undefined, 1, 1], // Set left over value.
+ [/:(\d+)$/, "port", undefined, 1], // RegExp the back.
+ [NaN, "hostname", undefined, 1, 1] // Set left over.
+ ];
+
+ /**
+ * These properties should not be copied or inherited from. This is only needed
+ * for all non blob URL's as a blob URL does not include a hash, only the
+ * origin.
+ *
+ * @type {Object}
+ * @private
+ */
+ var ignore = { hash: 1, query: 1 };
+
+ /**
+ * The location object differs when your code is loaded through a normal page,
+ * Worker or through a worker using a blob. And with the blobble begins the
+ * trouble as the location object will contain the URL of the blob, not the
+ * location of the page where our code is loaded in. The actual origin is
+ * encoded in the `pathname` so we can thankfully generate a good "default"
+ * location from it so we can generate proper relative URL's again.
+ *
+ * @param {Object|String} loc Optional default location object.
+ * @returns {Object} lolcation object.
+ * @api public
+ */
+ function lolcation(loc) {
+ loc = loc || global.location || {};
+
+ var finaldestination = {},
+ type = typeof loc,
+ key;
+
+ if ("blob:" === loc.protocol) {
+ finaldestination = new URL(unescape(loc.pathname), {});
+ } else if ("string" === type) {
+ finaldestination = new URL(loc, {});
+ for (key in ignore) delete finaldestination[key];
+ } else if ("object" === type) {
+ for (key in loc) {
+ if (key in ignore) continue;
+ finaldestination[key] = loc[key];
+ }
+
+ if (finaldestination.slashes === undefined) {
+ finaldestination.slashes = slashes.test(loc.href);
+ }
+ }
+
+ return finaldestination;
+ }
+
+ /**
+ * @typedef ProtocolExtract
+ * @type Object
+ * @property {String} protocol Protocol matched in the URL, in lowercase.
+ * @property {Boolean} slashes `true` if protocol is followed by "//", else `false`.
+ * @property {String} rest Rest of the URL that is not part of the protocol.
+ */
+
+ /**
+ * Extract protocol information from a URL with/without double slash ("//").
+ *
+ * @param {String} address URL we want to extract from.
+ * @return {ProtocolExtract} Extracted information.
+ * @api private
+ */
+ function extractProtocol(address) {
+ var match = protocolre.exec(address);
+
+ return {
+ protocol: match[1] ? match[1].toLowerCase() : "",
+ slashes: !!match[2],
+ rest: match[3]
+ };
+ }
+
+ /**
+ * Resolve a relative URL pathname against a base URL pathname.
+ *
+ * @param {String} relative Pathname of the relative URL.
+ * @param {String} base Pathname of the base URL.
+ * @return {String} Resolved pathname.
+ * @api private
+ */
+ function resolve(relative, base) {
+ var path = (base || "/")
+ .split("/")
+ .slice(0, -1)
+ .concat(relative.split("/")),
+ i = path.length,
+ last = path[i - 1],
+ unshift = false,
+ up = 0;
+
+ while (i--) {
+ if (path[i] === ".") {
+ path.splice(i, 1);
+ } else if (path[i] === "..") {
+ path.splice(i, 1);
+ up++;
+ } else if (up) {
+ if (i === 0) unshift = true;
+ path.splice(i, 1);
+ up--;
+ }
+ }
+
+ if (unshift) path.unshift("");
+ if (last === "." || last === "..") path.push("");
+
+ return path.join("/");
+ }
+
+ /**
+ * The actual URL instance. Instead of returning an object we've opted-in to
+ * create an actual constructor as it's much more memory efficient and
+ * faster and it pleases my OCD.
+ *
+ * @constructor
+ * @param {String} address URL we want to parse.
+ * @param {Object|String} location Location defaults for relative paths.
+ * @param {Boolean|Function} parser Parser for the query string.
+ * @api public
+ */
+ function URL(address, location, parser) {
+ if (!(this instanceof URL)) {
+ return new URL(address, location, parser);
+ }
+
+ var relative,
+ extracted,
+ parse,
+ instruction,
+ index,
+ key,
+ instructions = rules.slice(),
+ type = typeof location,
+ url = this,
+ i = 0;
+
+ //
+ // The following if statements allows this module two have compatibility with
+ // 2 different API:
+ //
+ // 1. Node.js's `url.parse` api which accepts a URL, boolean as arguments
+ // where the boolean indicates that the query string should also be parsed.
+ //
+ // 2. The `URL` interface of the browser which accepts a URL, object as
+ // arguments. The supplied object will be used as default values / fall-back
+ // for relative paths.
+ //
+ if ("object" !== type && "string" !== type) {
+ parser = location;
+ location = null;
+ }
+
+ if (parser && "function" !== typeof parser) parser = qs.parse;
+
+ location = lolcation(location);
+
+ //
+ // Extract protocol information before running the instructions.
+ //
+ extracted = extractProtocol(address || "");
+ relative = !extracted.protocol && !extracted.slashes;
+ url.slashes = extracted.slashes || (relative && location.slashes);
+ url.protocol = extracted.protocol || location.protocol || "";
+ address = extracted.rest;
+
+ //
+ // When the authority component is absent the URL starts with a path
+ // component.
+ //
+ if (!extracted.slashes) instructions[2] = [/(.*)/, "pathname"];
+
+ for (; i < instructions.length; i++) {
+ instruction = instructions[i];
+ parse = instruction[0];
+ key = instruction[1];
+
+ if (parse !== parse) {
+ url[key] = address;
+ } else if ("string" === typeof parse) {
+ if (~(index = address.indexOf(parse))) {
+ if ("number" === typeof instruction[2]) {
+ url[key] = address.slice(0, index);
+ address = address.slice(index + instruction[2]);
+ } else {
+ url[key] = address.slice(index);
+ address = address.slice(0, index);
+ }
+ }
+ } else if ((index = parse.exec(address))) {
+ url[key] = index[1];
+ address = address.slice(0, index.index);
+ }
+
+ url[key] =
+ url[key] ||
+ (relative && instruction[3] ? location[key] || "" : "");
+
+ //
+ // Hostname, host and protocol should be lowercased so they can be used to
+ // create a proper `origin`.
+ //
+ if (instruction[4]) url[key] = url[key].toLowerCase();
+ }
+
+ //
+ // Also parse the supplied query string in to an object. If we're supplied
+ // with a custom parser as function use that instead of the default build-in
+ // parser.
+ //
+ if (parser) url.query = parser(url.query);
+
+ //
+ // If the URL is relative, resolve the pathname against the base URL.
+ //
+ if (
+ relative &&
+ location.slashes &&
+ url.pathname.charAt(0) !== "/" &&
+ (url.pathname !== "" || location.pathname !== "")
+ ) {
+ url.pathname = resolve(url.pathname, location.pathname);
+ }
+
+ //
+ // We should not add port numbers if they are already the default port number
+ // for a given protocol. As the host also contains the port number we're going
+ // override it with the hostname which contains no port number.
+ //
+ if (!required(url.port, url.protocol)) {
+ url.host = url.hostname;
+ url.port = "";
+ }
+
+ //
+ // Parse down the `auth` for the username and password.
+ //
+ url.username = url.password = "";
+ if (url.auth) {
+ instruction = url.auth.split(":");
+ url.username = instruction[0] || "";
+ url.password = instruction[1] || "";
+ }
+
+ url.origin =
+ url.protocol && url.host && url.protocol !== "file:"
+ ? url.protocol + "//" + url.host
+ : "null";
+
+ //
+ // The href is just the compiled result.
+ //
+ url.href = url.toString();
+ }
+
+ /**
+ * This is convenience method for changing properties in the URL instance to
+ * insure that they all propagate correctly.
+ *
+ * @param {String} part Property we need to adjust.
+ * @param {Mixed} value The newly assigned value.
+ * @param {Boolean|Function} fn When setting the query, it will be the function
+ * used to parse the query.
+ * When setting the protocol, double slash will be
+ * removed from the final url if it is true.
+ * @returns {URL}
+ * @api public
+ */
+ function set(part, value, fn) {
+ var url = this;
+
+ switch (part) {
+ case "query":
+ if ("string" === typeof value && value.length) {
+ value = (fn || qs.parse)(value);
+ }
+
+ url[part] = value;
+ break;
+
+ case "port":
+ url[part] = value;
+
+ if (!required(value, url.protocol)) {
+ url.host = url.hostname;
+ url[part] = "";
+ } else if (value) {
+ url.host = url.hostname + ":" + value;
+ }
+
+ break;
+
+ case "hostname":
+ url[part] = value;
+
+ if (url.port) value += ":" + url.port;
+ url.host = value;
+ break;
+
+ case "host":
+ url[part] = value;
+
+ if (/:\d+$/.test(value)) {
+ value = value.split(":");
+ url.port = value.pop();
+ url.hostname = value.join(":");
+ } else {
+ url.hostname = value;
+ url.port = "";
+ }
+
+ break;
+
+ case "protocol":
+ url.protocol = value.toLowerCase();
+ url.slashes = !fn;
+ break;
+
+ case "pathname":
+ case "hash":
+ if (value) {
+ var char = part === "pathname" ? "/" : "#";
+ url[part] = value.charAt(0) !== char ? char + value : value;
+ } else {
+ url[part] = value;
+ }
+ break;
+
+ default:
+ url[part] = value;
+ }
+
+ for (var i = 0; i < rules.length; i++) {
+ var ins = rules[i];
+
+ if (ins[4]) url[ins[1]] = url[ins[1]].toLowerCase();
+ }
+
+ url.origin =
+ url.protocol && url.host && url.protocol !== "file:"
+ ? url.protocol + "//" + url.host
+ : "null";
+
+ url.href = url.toString();
+
+ return url;
+ }
+
+ /**
+ * Transform the properties back in to a valid and full URL string.
+ *
+ * @param {Function} stringify Optional query stringify function.
+ * @returns {String}
+ * @api public
+ */
+ function toString(stringify) {
+ if (!stringify || "function" !== typeof stringify)
+ stringify = qs.stringify;
+
+ var query,
+ url = this,
+ protocol = url.protocol;
+
+ if (protocol && protocol.charAt(protocol.length - 1) !== ":")
+ protocol += ":";
+
+ var result = protocol + (url.slashes ? "//" : "");
+
+ if (url.username) {
+ result += url.username;
+ if (url.password) result += ":" + url.password;
+ result += "@";
+ }
+
+ result += url.host + url.pathname;
+
+ query =
+ "object" === typeof url.query ? stringify(url.query) : url.query;
+ if (query) result += "?" !== query.charAt(0) ? "?" + query : query;
+
+ if (url.hash) result += url.hash;
+
+ return result;
+ }
+
+ URL.prototype = { set: set, toString: toString };
+
+ //
+ // Expose the URL parser and some additional properties that might be useful for
+ // others or testing.
+ //
+ URL.extractProtocol = extractProtocol;
+ URL.location = lolcation;
+ URL.qs = qs;
+
+ module.exports = URL;
+
+ /* WEBPACK VAR INJECTION */
+ }.call(
+ exports,
+ __webpack_require__(
+ /*! ./../webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js"
+ )
+ ));
+
+ /***/
+ },
+
+ /***/ "./node_modules/url-parse/node_modules/querystringify/index.js":
+ /*!*********************************************************************!*\
+ !*** ./node_modules/url-parse/node_modules/querystringify/index.js ***!
+ \*********************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ var has = Object.prototype.hasOwnProperty;
+
+ /**
+ * Decode a URI encoded string.
+ *
+ * @param {String} input The URI encoded string.
+ * @returns {String} The decoded string.
+ * @api private
+ */
+ function decode(input) {
+ return decodeURIComponent(input.replace(/\+/g, " "));
+ }
+
+ /**
+ * Simple query string parser.
+ *
+ * @param {String} query The query string that needs to be parsed.
+ * @returns {Object}
+ * @api public
+ */
+ function querystring(query) {
+ var parser = /([^=?&]+)=?([^&]*)/g,
+ result = {},
+ part;
+
+ //
+ // Little nifty parsing hack, leverage the fact that RegExp.exec increments
+ // the lastIndex property so we can continue executing this loop until we've
+ // parsed all results.
+ //
+ for (
+ ;
+ (part = parser.exec(query));
+ result[decode(part[1])] = decode(part[2])
+ );
+
+ return result;
+ }
+
+ /**
+ * Transform a query string to an object.
+ *
+ * @param {Object} obj Object that should be transformed.
+ * @param {String} prefix Optional prefix.
+ * @returns {String}
+ * @api public
+ */
+ function querystringify(obj, prefix) {
+ prefix = prefix || "";
+
+ var pairs = [];
+
+ //
+ // Optionally prefix with a '?' if needed
+ //
+ if ("string" !== typeof prefix) prefix = "?";
+
+ for (var key in obj) {
+ if (has.call(obj, key)) {
+ pairs.push(
+ encodeURIComponent(key) + "=" + encodeURIComponent(obj[key])
+ );
+ }
+ }
+
+ return pairs.length ? prefix + pairs.join("&") : "";
+ }
+
+ //
+ // Expose the module.
+ //
+ exports.stringify = querystringify;
+ exports.parse = querystring;
+
+ /***/
+ },
+
+ /***/ "./node_modules/url/url.js":
+ /*!*********************************!*\
+ !*** ./node_modules/url/url.js ***!
+ \*********************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+ // Copyright Joyent, Inc. and other Node contributors.
+ //
+ // 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.
+
+ var punycode = __webpack_require__(
+ /*! punycode */ "./node_modules/punycode/punycode.js"
+ );
+ var util = __webpack_require__(
+ /*! ./util */ "./node_modules/url/util.js"
+ );
+
+ exports.parse = urlParse;
+ exports.resolve = urlResolve;
+ exports.resolveObject = urlResolveObject;
+ exports.format = urlFormat;
+
+ exports.Url = Url;
+
+ function Url() {
+ this.protocol = null;
+ this.slashes = null;
+ this.auth = null;
+ this.host = null;
+ this.port = null;
+ this.hostname = null;
+ this.hash = null;
+ this.search = null;
+ this.query = null;
+ this.pathname = null;
+ this.path = null;
+ this.href = null;
+ }
+
+ // Reference: RFC 3986, RFC 1808, RFC 2396
+
+ // define these here so at least they only have to be
+ // compiled once on the first module load.
+ var protocolPattern = /^([a-z0-9.+-]+:)/i,
+ portPattern = /:[0-9]*$/,
+ // Special case for a simple path URL
+ simplePathPattern = /^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,
+ // RFC 2396: characters reserved for delimiting URLs.
+ // We actually just auto-escape these.
+ delims = ["<", ">", '"', "`", " ", "\r", "\n", "\t"],
+ // RFC 2396: characters not allowed for various reasons.
+ unwise = ["{", "}", "|", "\\", "^", "`"].concat(delims),
+ // Allowed by RFCs, but cause of XSS attacks. Always escape these.
+ autoEscape = ["'"].concat(unwise),
+ // Characters that are never ever allowed in a hostname.
+ // Note that any invalid chars are also handled, but these
+ // are the ones that are *expected* to be seen, so we fast-path
+ // them.
+ nonHostChars = ["%", "/", "?", ";", "#"].concat(autoEscape),
+ hostEndingChars = ["/", "?", "#"],
+ hostnameMaxLen = 255,
+ hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/,
+ hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/,
+ // protocols that can allow "unsafe" and "unwise" chars.
+ unsafeProtocol = {
+ javascript: true,
+ "javascript:": true
+ },
+ // protocols that never have a hostname.
+ hostlessProtocol = {
+ javascript: true,
+ "javascript:": true
+ },
+ // protocols that always contain a // bit.
+ slashedProtocol = {
+ http: true,
+ https: true,
+ ftp: true,
+ gopher: true,
+ file: true,
+ "http:": true,
+ "https:": true,
+ "ftp:": true,
+ "gopher:": true,
+ "file:": true
+ },
+ querystring = __webpack_require__(
+ /*! querystring */ "./node_modules/querystring-es3/index.js"
+ );
+
+ function urlParse(url, parseQueryString, slashesDenoteHost) {
+ if (url && util.isObject(url) && url instanceof Url) return url;
+
+ var u = new Url();
+ u.parse(url, parseQueryString, slashesDenoteHost);
+ return u;
+ }
+
+ Url.prototype.parse = function(
+ url,
+ parseQueryString,
+ slashesDenoteHost
+ ) {
+ if (!util.isString(url)) {
+ throw new TypeError(
+ "Parameter 'url' must be a string, not " + typeof url
+ );
+ }
+
+ // Copy chrome, IE, opera backslash-handling behavior.
+ // Back slashes before the query string get converted to forward slashes
+ // See: https://code.google.com/p/chromium/issues/detail?id=25916
+ var queryIndex = url.indexOf("?"),
+ splitter =
+ queryIndex !== -1 && queryIndex < url.indexOf("#") ? "?" : "#",
+ uSplit = url.split(splitter),
+ slashRegex = /\\/g;
+ uSplit[0] = uSplit[0].replace(slashRegex, "/");
+ url = uSplit.join(splitter);
+
+ var rest = url;
+
+ // trim before proceeding.
+ // This is to support parse stuff like " http://foo.com \n"
+ rest = rest.trim();
+
+ if (!slashesDenoteHost && url.split("#").length === 1) {
+ // Try fast path regexp
+ var simplePath = simplePathPattern.exec(rest);
+ if (simplePath) {
+ this.path = rest;
+ this.href = rest;
+ this.pathname = simplePath[1];
+ if (simplePath[2]) {
+ this.search = simplePath[2];
+ if (parseQueryString) {
+ this.query = querystring.parse(this.search.substr(1));
+ } else {
+ this.query = this.search.substr(1);
+ }
+ } else if (parseQueryString) {
+ this.search = "";
+ this.query = {};
+ }
+ return this;
+ }
+ }
+
+ var proto = protocolPattern.exec(rest);
+ if (proto) {
+ proto = proto[0];
+ var lowerProto = proto.toLowerCase();
+ this.protocol = lowerProto;
+ rest = rest.substr(proto.length);
+ }
+
+ // figure out if it's got a host
+ // user@server is *always* interpreted as a hostname, and url
+ // resolution will treat //foo/bar as host=foo,path=bar because that's
+ // how the browser resolves relative URLs.
+ if (
+ slashesDenoteHost ||
+ proto ||
+ rest.match(/^\/\/[^@\/]+@[^@\/]+/)
+ ) {
+ var slashes = rest.substr(0, 2) === "//";
+ if (slashes && !(proto && hostlessProtocol[proto])) {
+ rest = rest.substr(2);
+ this.slashes = true;
+ }
+ }
+
+ if (
+ !hostlessProtocol[proto] &&
+ (slashes || (proto && !slashedProtocol[proto]))
+ ) {
+ // there's a hostname.
+ // the first instance of /, ?, ;, or # ends the host.
+ //
+ // If there is an @ in the hostname, then non-host chars *are* allowed
+ // to the left of the last @ sign, unless some host-ending character
+ // comes *before* the @-sign.
+ // URLs are obnoxious.
+ //
+ // ex:
+ // http://a@b@c/ => user:a@b host:c
+ // http://a@b?@c => user:a host:c path:/?@c
+
+ // v0.12 TODO(isaacs): This is not quite how Chrome does things.
+ // Review our test case against browsers more comprehensively.
+
+ // find the first instance of any hostEndingChars
+ var hostEnd = -1;
+ for (var i = 0; i < hostEndingChars.length; i++) {
+ var hec = rest.indexOf(hostEndingChars[i]);
+ if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))
+ hostEnd = hec;
+ }
+
+ // at this point, either we have an explicit point where the
+ // auth portion cannot go past, or the last @ char is the decider.
+ var auth, atSign;
+ if (hostEnd === -1) {
+ // atSign can be anywhere.
+ atSign = rest.lastIndexOf("@");
+ } else {
+ // atSign must be in auth portion.
+ // http://a@b/c@d => host:b auth:a path:/c@d
+ atSign = rest.lastIndexOf("@", hostEnd);
+ }
+
+ // Now we have a portion which is definitely the auth.
+ // Pull that off.
+ if (atSign !== -1) {
+ auth = rest.slice(0, atSign);
+ rest = rest.slice(atSign + 1);
+ this.auth = decodeURIComponent(auth);
+ }
+
+ // the host is the remaining to the left of the first non-host char
+ hostEnd = -1;
+ for (var i = 0; i < nonHostChars.length; i++) {
+ var hec = rest.indexOf(nonHostChars[i]);
+ if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))
+ hostEnd = hec;
+ }
+ // if we still have not hit it, then the entire thing is a host.
+ if (hostEnd === -1) hostEnd = rest.length;
+
+ this.host = rest.slice(0, hostEnd);
+ rest = rest.slice(hostEnd);
+
+ // pull out port.
+ this.parseHost();
+
+ // we've indicated that there is a hostname,
+ // so even if it's empty, it has to be present.
+ this.hostname = this.hostname || "";
+
+ // if hostname begins with [ and ends with ]
+ // assume that it's an IPv6 address.
+ var ipv6Hostname =
+ this.hostname[0] === "[" &&
+ this.hostname[this.hostname.length - 1] === "]";
+
+ // validate a little.
+ if (!ipv6Hostname) {
+ var hostparts = this.hostname.split(/\./);
+ for (var i = 0, l = hostparts.length; i < l; i++) {
+ var part = hostparts[i];
+ if (!part) continue;
+ if (!part.match(hostnamePartPattern)) {
+ var newpart = "";
+ for (var j = 0, k = part.length; j < k; j++) {
+ if (part.charCodeAt(j) > 127) {
+ // we replace non-ASCII char with a temporary placeholder
+ // we need this to make sure size of hostname is not
+ // broken by replacing non-ASCII by nothing
+ newpart += "x";
+ } else {
+ newpart += part[j];
+ }
+ }
+ // we test again with ASCII char only
+ if (!newpart.match(hostnamePartPattern)) {
+ var validParts = hostparts.slice(0, i);
+ var notHost = hostparts.slice(i + 1);
+ var bit = part.match(hostnamePartStart);
+ if (bit) {
+ validParts.push(bit[1]);
+ notHost.unshift(bit[2]);
+ }
+ if (notHost.length) {
+ rest = "/" + notHost.join(".") + rest;
+ }
+ this.hostname = validParts.join(".");
+ break;
+ }
+ }
+ }
+ }
+
+ if (this.hostname.length > hostnameMaxLen) {
+ this.hostname = "";
+ } else {
+ // hostnames are always lower case.
+ this.hostname = this.hostname.toLowerCase();
+ }
+
+ if (!ipv6Hostname) {
+ // IDNA Support: Returns a punycoded representation of "domain".
+ // It only converts parts of the domain name that
+ // have non-ASCII characters, i.e. it doesn't matter if
+ // you call it with a domain that already is ASCII-only.
+ this.hostname = punycode.toASCII(this.hostname);
+ }
+
+ var p = this.port ? ":" + this.port : "";
+ var h = this.hostname || "";
+ this.host = h + p;
+ this.href += this.host;
+
+ // strip [ and ] from the hostname
+ // the host field still retains them, though
+ if (ipv6Hostname) {
+ this.hostname = this.hostname.substr(1, this.hostname.length - 2);
+ if (rest[0] !== "/") {
+ rest = "/" + rest;
+ }
+ }
+ }
+
+ // now rest is set to the post-host stuff.
+ // chop off any delim chars.
+ if (!unsafeProtocol[lowerProto]) {
+ // First, make 100% sure that any "autoEscape" chars get
+ // escaped, even if encodeURIComponent doesn't think they
+ // need to be.
+ for (var i = 0, l = autoEscape.length; i < l; i++) {
+ var ae = autoEscape[i];
+ if (rest.indexOf(ae) === -1) continue;
+ var esc = encodeURIComponent(ae);
+ if (esc === ae) {
+ esc = escape(ae);
+ }
+ rest = rest.split(ae).join(esc);
+ }
+ }
+
+ // chop off from the tail first.
+ var hash = rest.indexOf("#");
+ if (hash !== -1) {
+ // got a fragment string.
+ this.hash = rest.substr(hash);
+ rest = rest.slice(0, hash);
+ }
+ var qm = rest.indexOf("?");
+ if (qm !== -1) {
+ this.search = rest.substr(qm);
+ this.query = rest.substr(qm + 1);
+ if (parseQueryString) {
+ this.query = querystring.parse(this.query);
+ }
+ rest = rest.slice(0, qm);
+ } else if (parseQueryString) {
+ // no query string, but parseQueryString still requested
+ this.search = "";
+ this.query = {};
+ }
+ if (rest) this.pathname = rest;
+ if (slashedProtocol[lowerProto] && this.hostname && !this.pathname) {
+ this.pathname = "/";
+ }
+
+ //to support http.request
+ if (this.pathname || this.search) {
+ var p = this.pathname || "";
+ var s = this.search || "";
+ this.path = p + s;
+ }
+
+ // finally, reconstruct the href based on what has been validated.
+ this.href = this.format();
+ return this;
+ };
+
+ // format a parsed object into a url string
+ function urlFormat(obj) {
+ // ensure it's an object, and not a string url.
+ // If it's an obj, this is a no-op.
+ // this way, you can call url_format() on strings
+ // to clean up potentially wonky urls.
+ if (util.isString(obj)) obj = urlParse(obj);
+ if (!(obj instanceof Url)) return Url.prototype.format.call(obj);
+ return obj.format();
+ }
+
+ Url.prototype.format = function() {
+ var auth = this.auth || "";
+ if (auth) {
+ auth = encodeURIComponent(auth);
+ auth = auth.replace(/%3A/i, ":");
+ auth += "@";
+ }
+
+ var protocol = this.protocol || "",
+ pathname = this.pathname || "",
+ hash = this.hash || "",
+ host = false,
+ query = "";
+
+ if (this.host) {
+ host = auth + this.host;
+ } else if (this.hostname) {
+ host =
+ auth +
+ (this.hostname.indexOf(":") === -1
+ ? this.hostname
+ : "[" + this.hostname + "]");
+ if (this.port) {
+ host += ":" + this.port;
+ }
+ }
+
+ if (
+ this.query &&
+ util.isObject(this.query) &&
+ Object.keys(this.query).length
+ ) {
+ query = querystring.stringify(this.query);
+ }
+
+ var search = this.search || (query && "?" + query) || "";
+
+ if (protocol && protocol.substr(-1) !== ":") protocol += ":";
+
+ // only the slashedProtocols get the //. Not mailto:, xmpp:, etc.
+ // unless they had them to begin with.
+ if (
+ this.slashes ||
+ ((!protocol || slashedProtocol[protocol]) && host !== false)
+ ) {
+ host = "//" + (host || "");
+ if (pathname && pathname.charAt(0) !== "/")
+ pathname = "/" + pathname;
+ } else if (!host) {
+ host = "";
+ }
+
+ if (hash && hash.charAt(0) !== "#") hash = "#" + hash;
+ if (search && search.charAt(0) !== "?") search = "?" + search;
+
+ pathname = pathname.replace(/[?#]/g, function(match) {
+ return encodeURIComponent(match);
+ });
+ search = search.replace("#", "%23");
+
+ return protocol + host + pathname + search + hash;
+ };
+
+ function urlResolve(source, relative) {
+ return urlParse(source, false, true).resolve(relative);
+ }
+
+ Url.prototype.resolve = function(relative) {
+ return this.resolveObject(urlParse(relative, false, true)).format();
+ };
+
+ function urlResolveObject(source, relative) {
+ if (!source) return relative;
+ return urlParse(source, false, true).resolveObject(relative);
+ }
+
+ Url.prototype.resolveObject = function(relative) {
+ if (util.isString(relative)) {
+ var rel = new Url();
+ rel.parse(relative, false, true);
+ relative = rel;
+ }
+
+ var result = new Url();
+ var tkeys = Object.keys(this);
+ for (var tk = 0; tk < tkeys.length; tk++) {
+ var tkey = tkeys[tk];
+ result[tkey] = this[tkey];
+ }
+
+ // hash is always overridden, no matter what.
+ // even href="" will remove it.
+ result.hash = relative.hash;
+
+ // if the relative url is empty, then there's nothing left to do here.
+ if (relative.href === "") {
+ result.href = result.format();
+ return result;
+ }
+
+ // hrefs like //foo/bar always cut to the protocol.
+ if (relative.slashes && !relative.protocol) {
+ // take everything except the protocol from relative
+ var rkeys = Object.keys(relative);
+ for (var rk = 0; rk < rkeys.length; rk++) {
+ var rkey = rkeys[rk];
+ if (rkey !== "protocol") result[rkey] = relative[rkey];
+ }
+
+ //urlParse appends trailing / to urls like http://www.example.com
+ if (
+ slashedProtocol[result.protocol] &&
+ result.hostname &&
+ !result.pathname
+ ) {
+ result.path = result.pathname = "/";
+ }
+
+ result.href = result.format();
+ return result;
+ }
+
+ if (relative.protocol && relative.protocol !== result.protocol) {
+ // if it's a known url protocol, then changing
+ // the protocol does weird things
+ // first, if it's not file:, then we MUST have a host,
+ // and if there was a path
+ // to begin with, then we MUST have a path.
+ // if it is file:, then the host is dropped,
+ // because that's known to be hostless.
+ // anything else is assumed to be absolute.
+ if (!slashedProtocol[relative.protocol]) {
+ var keys = Object.keys(relative);
+ for (var v = 0; v < keys.length; v++) {
+ var k = keys[v];
+ result[k] = relative[k];
+ }
+ result.href = result.format();
+ return result;
+ }
+
+ result.protocol = relative.protocol;
+ if (!relative.host && !hostlessProtocol[relative.protocol]) {
+ var relPath = (relative.pathname || "").split("/");
+ while (relPath.length && !(relative.host = relPath.shift()));
+ if (!relative.host) relative.host = "";
+ if (!relative.hostname) relative.hostname = "";
+ if (relPath[0] !== "") relPath.unshift("");
+ if (relPath.length < 2) relPath.unshift("");
+ result.pathname = relPath.join("/");
+ } else {
+ result.pathname = relative.pathname;
+ }
+ result.search = relative.search;
+ result.query = relative.query;
+ result.host = relative.host || "";
+ result.auth = relative.auth;
+ result.hostname = relative.hostname || relative.host;
+ result.port = relative.port;
+ // to support http.request
+ if (result.pathname || result.search) {
+ var p = result.pathname || "";
+ var s = result.search || "";
+ result.path = p + s;
+ }
+ result.slashes = result.slashes || relative.slashes;
+ result.href = result.format();
+ return result;
+ }
+
+ var isSourceAbs =
+ result.pathname && result.pathname.charAt(0) === "/",
+ isRelAbs =
+ relative.host ||
+ (relative.pathname && relative.pathname.charAt(0) === "/"),
+ mustEndAbs =
+ isRelAbs || isSourceAbs || (result.host && relative.pathname),
+ removeAllDots = mustEndAbs,
+ srcPath = (result.pathname && result.pathname.split("/")) || [],
+ relPath = (relative.pathname && relative.pathname.split("/")) || [],
+ psychotic = result.protocol && !slashedProtocol[result.protocol];
+
+ // if the url is a non-slashed url, then relative
+ // links like ../.. should be able
+ // to crawl up to the hostname, as well. This is strange.
+ // result.protocol has already been set by now.
+ // Later on, put the first path part into the host field.
+ if (psychotic) {
+ result.hostname = "";
+ result.port = null;
+ if (result.host) {
+ if (srcPath[0] === "") srcPath[0] = result.host;
+ else srcPath.unshift(result.host);
+ }
+ result.host = "";
+ if (relative.protocol) {
+ relative.hostname = null;
+ relative.port = null;
+ if (relative.host) {
+ if (relPath[0] === "") relPath[0] = relative.host;
+ else relPath.unshift(relative.host);
+ }
+ relative.host = null;
+ }
+ mustEndAbs = mustEndAbs && (relPath[0] === "" || srcPath[0] === "");
+ }
+
+ if (isRelAbs) {
+ // it's absolute.
+ result.host =
+ relative.host || relative.host === ""
+ ? relative.host
+ : result.host;
+ result.hostname =
+ relative.hostname || relative.hostname === ""
+ ? relative.hostname
+ : result.hostname;
+ result.search = relative.search;
+ result.query = relative.query;
+ srcPath = relPath;
+ // fall through to the dot-handling below.
+ } else if (relPath.length) {
+ // it's relative
+ // throw away the existing file, and take the new path instead.
+ if (!srcPath) srcPath = [];
+ srcPath.pop();
+ srcPath = srcPath.concat(relPath);
+ result.search = relative.search;
+ result.query = relative.query;
+ } else if (!util.isNullOrUndefined(relative.search)) {
+ // just pull out the search.
+ // like href='?foo'.
+ // Put this after the other two cases because it simplifies the booleans
+ if (psychotic) {
+ result.hostname = result.host = srcPath.shift();
+ //occationaly the auth can get stuck only in host
+ //this especially happens in cases like
+ //url.resolveObject('mailto:local1@domain1', 'local2@domain2')
+ var authInHost =
+ result.host && result.host.indexOf("@") > 0
+ ? result.host.split("@")
+ : false;
+ if (authInHost) {
+ result.auth = authInHost.shift();
+ result.host = result.hostname = authInHost.shift();
+ }
+ }
+ result.search = relative.search;
+ result.query = relative.query;
+ //to support http.request
+ if (!util.isNull(result.pathname) || !util.isNull(result.search)) {
+ result.path =
+ (result.pathname ? result.pathname : "") +
+ (result.search ? result.search : "");
+ }
+ result.href = result.format();
+ return result;
+ }
+
+ if (!srcPath.length) {
+ // no path at all. easy.
+ // we've already handled the other stuff above.
+ result.pathname = null;
+ //to support http.request
+ if (result.search) {
+ result.path = "/" + result.search;
+ } else {
+ result.path = null;
+ }
+ result.href = result.format();
+ return result;
+ }
+
+ // if a url ENDs in . or .., then it must get a trailing slash.
+ // however, if it ends in anything else non-slashy,
+ // then it must NOT get a trailing slash.
+ var last = srcPath.slice(-1)[0];
+ var hasTrailingSlash =
+ ((result.host || relative.host || srcPath.length > 1) &&
+ (last === "." || last === "..")) ||
+ last === "";
+
+ // strip single dots, resolve double dots to parent dir
+ // if the path tries to go above the root, `up` ends up > 0
+ var up = 0;
+ for (var i = srcPath.length; i >= 0; i--) {
+ last = srcPath[i];
+ if (last === ".") {
+ srcPath.splice(i, 1);
+ } else if (last === "..") {
+ srcPath.splice(i, 1);
+ up++;
+ } else if (up) {
+ srcPath.splice(i, 1);
+ up--;
+ }
+ }
+
+ // if the path is allowed to go above the root, restore leading ..s
+ if (!mustEndAbs && !removeAllDots) {
+ for (; up--; up) {
+ srcPath.unshift("..");
+ }
+ }
+
+ if (
+ mustEndAbs &&
+ srcPath[0] !== "" &&
+ (!srcPath[0] || srcPath[0].charAt(0) !== "/")
+ ) {
+ srcPath.unshift("");
+ }
+
+ if (hasTrailingSlash && srcPath.join("/").substr(-1) !== "/") {
+ srcPath.push("");
+ }
+
+ var isAbsolute =
+ srcPath[0] === "" || (srcPath[0] && srcPath[0].charAt(0) === "/");
+
+ // put the host back
+ if (psychotic) {
+ result.hostname = result.host = isAbsolute
+ ? ""
+ : srcPath.length ? srcPath.shift() : "";
+ //occationaly the auth can get stuck only in host
+ //this especially happens in cases like
+ //url.resolveObject('mailto:local1@domain1', 'local2@domain2')
+ var authInHost =
+ result.host && result.host.indexOf("@") > 0
+ ? result.host.split("@")
+ : false;
+ if (authInHost) {
+ result.auth = authInHost.shift();
+ result.host = result.hostname = authInHost.shift();
+ }
+ }
+
+ mustEndAbs = mustEndAbs || (result.host && srcPath.length);
+
+ if (mustEndAbs && !isAbsolute) {
+ srcPath.unshift("");
+ }
+
+ if (!srcPath.length) {
+ result.pathname = null;
+ result.path = null;
+ } else {
+ result.pathname = srcPath.join("/");
+ }
+
+ //to support request.http
+ if (!util.isNull(result.pathname) || !util.isNull(result.search)) {
+ result.path =
+ (result.pathname ? result.pathname : "") +
+ (result.search ? result.search : "");
+ }
+ result.auth = relative.auth || result.auth;
+ result.slashes = result.slashes || relative.slashes;
+ result.href = result.format();
+ return result;
+ };
+
+ Url.prototype.parseHost = function() {
+ var host = this.host;
+ var port = portPattern.exec(host);
+ if (port) {
+ port = port[0];
+ if (port !== ":") {
+ this.port = port.substr(1);
+ }
+ host = host.substr(0, host.length - port.length);
+ }
+ if (host) this.hostname = host;
+ };
+
+ /***/
+ },
+
+ /***/ "./node_modules/url/util.js":
+ /*!**********************************!*\
+ !*** ./node_modules/url/util.js ***!
+ \**********************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ "use strict";
+
+ module.exports = {
+ isString: function(arg) {
+ return typeof arg === "string";
+ },
+ isObject: function(arg) {
+ return typeof arg === "object" && arg !== null;
+ },
+ isNull: function(arg) {
+ return arg === null;
+ },
+ isNullOrUndefined: function(arg) {
+ return arg == null;
+ }
+ };
+
+ /***/
+ },
+
+ /***/ "./node_modules/webpack/buildin/amd-options.js":
+ /*!****************************************!*\
+ !*** (webpack)/buildin/amd-options.js ***!
+ \****************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports) {
+ /* WEBPACK VAR INJECTION */ (function(__webpack_amd_options__) {
+ /* globals __webpack_amd_options__ */
+ module.exports = __webpack_amd_options__;
+
+ /* WEBPACK VAR INJECTION */
+ }.call(exports, {}));
+
+ /***/
+ },
+
+ /***/ "./node_modules/webpack/buildin/global.js":
+ /*!***********************************!*\
+ !*** (webpack)/buildin/global.js ***!
+ \***********************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports) {
+ var g;
+
+ // This works in non-strict mode
+ g = (function() {
+ return this;
+ })();
+
+ try {
+ // This works if eval is allowed (see CSP)
+ g = g || Function("return this")() || (1, eval)("this");
+ } catch (e) {
+ // This works if the window reference is available
+ if (typeof window === "object") g = window;
+ }
+
+ // g can still be undefined, but nothing to do about it...
+ // We return undefined, instead of nothing here, so it's
+ // easier to handle this case. if(!global) { ...}
+
+ module.exports = g;
+
+ /***/
+ },
+
+ /***/ "./node_modules/webpack/buildin/module.js":
+ /*!***********************************!*\
+ !*** (webpack)/buildin/module.js ***!
+ \***********************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports) {
+ module.exports = function(module) {
+ if (!module.webpackPolyfill) {
+ module.deprecate = function() {};
+ module.paths = [];
+ // module.parent = undefined by default
+ if (!module.children) module.children = [];
+ Object.defineProperty(module, "loaded", {
+ enumerable: true,
+ get: function() {
+ return module.l;
+ }
+ });
+ Object.defineProperty(module, "id", {
+ enumerable: true,
+ get: function() {
+ return module.i;
+ }
+ });
+ module.webpackPolyfill = 1;
+ }
+ return module;
+ };
+
+ /***/
+ },
+
+ /***/ "./node_modules/whatwg-fetch/fetch.js":
+ /*!********************************************!*\
+ !*** ./node_modules/whatwg-fetch/fetch.js ***!
+ \********************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports) {
+ (function(self) {
+ "use strict";
+
+ if (self.fetch) {
+ return;
+ }
+
+ var support = {
+ searchParams: "URLSearchParams" in self,
+ iterable: "Symbol" in self && "iterator" in Symbol,
+ blob:
+ "FileReader" in self &&
+ "Blob" in self &&
+ (function() {
+ try {
+ new Blob();
+ return true;
+ } catch (e) {
+ return false;
+ }
+ })(),
+ formData: "FormData" in self,
+ arrayBuffer: "ArrayBuffer" in self
+ };
+
+ if (support.arrayBuffer) {
+ var viewClasses = [
+ "[object Int8Array]",
+ "[object Uint8Array]",
+ "[object Uint8ClampedArray]",
+ "[object Int16Array]",
+ "[object Uint16Array]",
+ "[object Int32Array]",
+ "[object Uint32Array]",
+ "[object Float32Array]",
+ "[object Float64Array]"
+ ];
+
+ var isDataView = function(obj) {
+ return obj && DataView.prototype.isPrototypeOf(obj);
+ };
+
+ var isArrayBufferView =
+ ArrayBuffer.isView ||
+ function(obj) {
+ return (
+ obj &&
+ viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1
+ );
+ };
+ }
+
+ function normalizeName(name) {
+ if (typeof name !== "string") {
+ name = String(name);
+ }
+ if (/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name)) {
+ throw new TypeError("Invalid character in header field name");
+ }
+ return name.toLowerCase();
+ }
+
+ function normalizeValue(value) {
+ if (typeof value !== "string") {
+ value = String(value);
+ }
+ return value;
+ }
+
+ // Build a destructive iterator for the value list
+ function iteratorFor(items) {
+ var iterator = {
+ next: function() {
+ var value = items.shift();
+ return { done: value === undefined, value: value };
+ }
+ };
+
+ if (support.iterable) {
+ iterator[Symbol.iterator] = function() {
+ return iterator;
+ };
+ }
+
+ return iterator;
+ }
+
+ function Headers(headers) {
+ this.map = {};
+
+ if (headers instanceof Headers) {
+ headers.forEach(function(value, name) {
+ this.append(name, value);
+ }, this);
+ } else if (Array.isArray(headers)) {
+ headers.forEach(function(header) {
+ this.append(header[0], header[1]);
+ }, this);
+ } else if (headers) {
+ Object.getOwnPropertyNames(headers).forEach(function(name) {
+ this.append(name, headers[name]);
+ }, this);
+ }
+ }
+
+ Headers.prototype.append = function(name, value) {
+ name = normalizeName(name);
+ value = normalizeValue(value);
+ var oldValue = this.map[name];
+ this.map[name] = oldValue ? oldValue + "," + value : value;
+ };
+
+ Headers.prototype["delete"] = function(name) {
+ delete this.map[normalizeName(name)];
+ };
+
+ Headers.prototype.get = function(name) {
+ name = normalizeName(name);
+ return this.has(name) ? this.map[name] : null;
+ };
+
+ Headers.prototype.has = function(name) {
+ return this.map.hasOwnProperty(normalizeName(name));
+ };
+
+ Headers.prototype.set = function(name, value) {
+ this.map[normalizeName(name)] = normalizeValue(value);
+ };
+
+ Headers.prototype.forEach = function(callback, thisArg) {
+ for (var name in this.map) {
+ if (this.map.hasOwnProperty(name)) {
+ callback.call(thisArg, this.map[name], name, this);
+ }
+ }
+ };
+
+ Headers.prototype.keys = function() {
+ var items = [];
+ this.forEach(function(value, name) {
+ items.push(name);
+ });
+ return iteratorFor(items);
+ };
+
+ Headers.prototype.values = function() {
+ var items = [];
+ this.forEach(function(value) {
+ items.push(value);
+ });
+ return iteratorFor(items);
+ };
+
+ Headers.prototype.entries = function() {
+ var items = [];
+ this.forEach(function(value, name) {
+ items.push([name, value]);
+ });
+ return iteratorFor(items);
+ };
+
+ if (support.iterable) {
+ Headers.prototype[Symbol.iterator] = Headers.prototype.entries;
+ }
+
+ function consumed(body) {
+ if (body.bodyUsed) {
+ return Promise.reject(new TypeError("Already read"));
+ }
+ body.bodyUsed = true;
+ }
+
+ function fileReaderReady(reader) {
+ return new Promise(function(resolve, reject) {
+ reader.onload = function() {
+ resolve(reader.result);
+ };
+ reader.onerror = function() {
+ reject(reader.error);
+ };
+ });
+ }
+
+ function readBlobAsArrayBuffer(blob) {
+ var reader = new FileReader();
+ var promise = fileReaderReady(reader);
+ reader.readAsArrayBuffer(blob);
+ return promise;
+ }
+
+ function readBlobAsText(blob) {
+ var reader = new FileReader();
+ var promise = fileReaderReady(reader);
+ reader.readAsText(blob);
+ return promise;
+ }
+
+ function readArrayBufferAsText(buf) {
+ var view = new Uint8Array(buf);
+ var chars = new Array(view.length);
+
+ for (var i = 0; i < view.length; i++) {
+ chars[i] = String.fromCharCode(view[i]);
+ }
+ return chars.join("");
+ }
+
+ function bufferClone(buf) {
+ if (buf.slice) {
+ return buf.slice(0);
+ } else {
+ var view = new Uint8Array(buf.byteLength);
+ view.set(new Uint8Array(buf));
+ return view.buffer;
+ }
+ }
+
+ function Body() {
+ this.bodyUsed = false;
+
+ this._initBody = function(body) {
+ this._bodyInit = body;
+ if (!body) {
+ this._bodyText = "";
+ } else if (typeof body === "string") {
+ this._bodyText = body;
+ } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {
+ this._bodyBlob = body;
+ } else if (
+ support.formData &&
+ FormData.prototype.isPrototypeOf(body)
+ ) {
+ this._bodyFormData = body;
+ } else if (
+ support.searchParams &&
+ URLSearchParams.prototype.isPrototypeOf(body)
+ ) {
+ this._bodyText = body.toString();
+ } else if (
+ support.arrayBuffer &&
+ support.blob &&
+ isDataView(body)
+ ) {
+ this._bodyArrayBuffer = bufferClone(body.buffer);
+ // IE 10-11 can't handle a DataView body.
+ this._bodyInit = new Blob([this._bodyArrayBuffer]);
+ } else if (
+ support.arrayBuffer &&
+ (ArrayBuffer.prototype.isPrototypeOf(body) ||
+ isArrayBufferView(body))
+ ) {
+ this._bodyArrayBuffer = bufferClone(body);
+ } else {
+ throw new Error("unsupported BodyInit type");
+ }
+
+ if (!this.headers.get("content-type")) {
+ if (typeof body === "string") {
+ this.headers.set("content-type", "text/plain;charset=UTF-8");
+ } else if (this._bodyBlob && this._bodyBlob.type) {
+ this.headers.set("content-type", this._bodyBlob.type);
+ } else if (
+ support.searchParams &&
+ URLSearchParams.prototype.isPrototypeOf(body)
+ ) {
+ this.headers.set(
+ "content-type",
+ "application/x-www-form-urlencoded;charset=UTF-8"
+ );
+ }
+ }
+ };
+
+ if (support.blob) {
+ this.blob = function() {
+ var rejected = consumed(this);
+ if (rejected) {
+ return rejected;
+ }
+
+ if (this._bodyBlob) {
+ return Promise.resolve(this._bodyBlob);
+ } else if (this._bodyArrayBuffer) {
+ return Promise.resolve(new Blob([this._bodyArrayBuffer]));
+ } else if (this._bodyFormData) {
+ throw new Error("could not read FormData body as blob");
+ } else {
+ return Promise.resolve(new Blob([this._bodyText]));
+ }
+ };
+
+ this.arrayBuffer = function() {
+ if (this._bodyArrayBuffer) {
+ return (
+ consumed(this) || Promise.resolve(this._bodyArrayBuffer)
+ );
+ } else {
+ return this.blob().then(readBlobAsArrayBuffer);
+ }
+ };
+ }
+
+ this.text = function() {
+ var rejected = consumed(this);
+ if (rejected) {
+ return rejected;
+ }
+
+ if (this._bodyBlob) {
+ return readBlobAsText(this._bodyBlob);
+ } else if (this._bodyArrayBuffer) {
+ return Promise.resolve(
+ readArrayBufferAsText(this._bodyArrayBuffer)
+ );
+ } else if (this._bodyFormData) {
+ throw new Error("could not read FormData body as text");
+ } else {
+ return Promise.resolve(this._bodyText);
+ }
+ };
+
+ if (support.formData) {
+ this.formData = function() {
+ return this.text().then(decode);
+ };
+ }
+
+ this.json = function() {
+ return this.text().then(JSON.parse);
+ };
+
+ return this;
+ }
+
+ // HTTP methods whose capitalization should be normalized
+ var methods = ["DELETE", "GET", "HEAD", "OPTIONS", "POST", "PUT"];
+
+ function normalizeMethod(method) {
+ var upcased = method.toUpperCase();
+ return methods.indexOf(upcased) > -1 ? upcased : method;
+ }
+
+ function Request(input, options) {
+ options = options || {};
+ var body = options.body;
+
+ if (input instanceof Request) {
+ if (input.bodyUsed) {
+ throw new TypeError("Already read");
+ }
+ this.url = input.url;
+ this.credentials = input.credentials;
+ if (!options.headers) {
+ this.headers = new Headers(input.headers);
+ }
+ this.method = input.method;
+ this.mode = input.mode;
+ if (!body && input._bodyInit != null) {
+ body = input._bodyInit;
+ input.bodyUsed = true;
+ }
+ } else {
+ this.url = String(input);
+ }
+
+ this.credentials =
+ options.credentials || this.credentials || "omit";
+ if (options.headers || !this.headers) {
+ this.headers = new Headers(options.headers);
+ }
+ this.method = normalizeMethod(
+ options.method || this.method || "GET"
+ );
+ this.mode = options.mode || this.mode || null;
+ this.referrer = null;
+
+ if ((this.method === "GET" || this.method === "HEAD") && body) {
+ throw new TypeError("Body not allowed for GET or HEAD requests");
+ }
+ this._initBody(body);
+ }
+
+ Request.prototype.clone = function() {
+ return new Request(this, { body: this._bodyInit });
+ };
+
+ function decode(body) {
+ var form = new FormData();
+ body
+ .trim()
+ .split("&")
+ .forEach(function(bytes) {
+ if (bytes) {
+ var split = bytes.split("=");
+ var name = split.shift().replace(/\+/g, " ");
+ var value = split.join("=").replace(/\+/g, " ");
+ form.append(
+ decodeURIComponent(name),
+ decodeURIComponent(value)
+ );
+ }
+ });
+ return form;
+ }
+
+ function parseHeaders(rawHeaders) {
+ var headers = new Headers();
+ rawHeaders.split(/\r?\n/).forEach(function(line) {
+ var parts = line.split(":");
+ var key = parts.shift().trim();
+ if (key) {
+ var value = parts.join(":").trim();
+ headers.append(key, value);
+ }
+ });
+ return headers;
+ }
+
+ Body.call(Request.prototype);
+
+ function Response(bodyInit, options) {
+ if (!options) {
+ options = {};
+ }
+
+ this.type = "default";
+ this.status = "status" in options ? options.status : 200;
+ this.ok = this.status >= 200 && this.status < 300;
+ this.statusText =
+ "statusText" in options ? options.statusText : "OK";
+ this.headers = new Headers(options.headers);
+ this.url = options.url || "";
+ this._initBody(bodyInit);
+ }
+
+ Body.call(Response.prototype);
+
+ Response.prototype.clone = function() {
+ return new Response(this._bodyInit, {
+ status: this.status,
+ statusText: this.statusText,
+ headers: new Headers(this.headers),
+ url: this.url
+ });
+ };
+
+ Response.error = function() {
+ var response = new Response(null, { status: 0, statusText: "" });
+ response.type = "error";
+ return response;
+ };
+
+ var redirectStatuses = [301, 302, 303, 307, 308];
+
+ Response.redirect = function(url, status) {
+ if (redirectStatuses.indexOf(status) === -1) {
+ throw new RangeError("Invalid status code");
+ }
+
+ return new Response(null, {
+ status: status,
+ headers: { location: url }
+ });
+ };
+
+ self.Headers = Headers;
+ self.Request = Request;
+ self.Response = Response;
+
+ self.fetch = function(input, init) {
+ return new Promise(function(resolve, reject) {
+ var request = new Request(input, init);
+ var xhr = new XMLHttpRequest();
+
+ xhr.onload = function() {
+ var options = {
+ status: xhr.status,
+ statusText: xhr.statusText,
+ headers: parseHeaders(xhr.getAllResponseHeaders() || "")
+ };
+ options.url =
+ "responseURL" in xhr
+ ? xhr.responseURL
+ : options.headers.get("X-Request-URL");
+ var body = "response" in xhr ? xhr.response : xhr.responseText;
+ resolve(new Response(body, options));
+ };
+
+ xhr.onerror = function() {
+ reject(new TypeError("Network request failed"));
+ };
+
+ xhr.ontimeout = function() {
+ reject(new TypeError("Network request failed"));
+ };
+
+ xhr.open(request.method, request.url, true);
+
+ if (request.credentials === "include") {
+ xhr.withCredentials = true;
+ }
+
+ if ("responseType" in xhr && support.blob) {
+ xhr.responseType = "blob";
+ }
+
+ request.headers.forEach(function(value, name) {
+ xhr.setRequestHeader(name, value);
+ });
+
+ xhr.send(
+ typeof request._bodyInit === "undefined"
+ ? null
+ : request._bodyInit
+ );
+ });
+ };
+ self.fetch.polyfill = true;
+ })(typeof self !== "undefined" ? self : this);
+
+ /***/
+ },
+
+ /***/ "./src/App.js":
+ /*!********************!*\
+ !*** ./src/App.js ***!
+ \********************/
+ /*! exports provided: default */
+ /*! exports used: default */
+ /***/ function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(
+ /*! react */ "./node_modules/react/index.js"
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(
+ __WEBPACK_IMPORTED_MODULE_0_react__
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__step_in_test_js__ = __webpack_require__(
+ /*! ./step-in-test.js */ "./src/step-in-test.js"
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__step_over_test_js__ = __webpack_require__(
+ /*! ./step-over-test.js */ "./src/step-over-test.js"
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__step_out_test_js__ = __webpack_require__(
+ /*! ./step-out-test.js */ "./src/step-out-test.js"
+ );
+ var _jsxFileName =
+ "/Users/Ystartsev/Work/debugger-sourcemaps/src/App.js";
+
+ var _createClass = (function() {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || false;
+ descriptor.configurable = true;
+ if ("value" in descriptor) descriptor.writable = true;
+ Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+ return function(Constructor, protoProps, staticProps) {
+ if (protoProps) defineProperties(Constructor.prototype, protoProps);
+ if (staticProps) defineProperties(Constructor, staticProps);
+ return Constructor;
+ };
+ })();
+
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ function _possibleConstructorReturn(self, call) {
+ if (!self) {
+ throw new ReferenceError(
+ "this hasn't been initialised - super() hasn't been called"
+ );
+ }
+ return call &&
+ (typeof call === "object" || typeof call === "function")
+ ? call
+ : self;
+ }
+
+ function _inherits(subClass, superClass) {
+ if (typeof superClass !== "function" && superClass !== null) {
+ throw new TypeError(
+ "Super expression must either be null or a function, not " +
+ typeof superClass
+ );
+ }
+ subClass.prototype = Object.create(
+ superClass && superClass.prototype,
+ {
+ constructor: {
+ value: subClass,
+ enumerable: false,
+ writable: true,
+ configurable: true
+ }
+ }
+ );
+ if (superClass)
+ Object.setPrototypeOf
+ ? Object.setPrototypeOf(subClass, superClass)
+ : (subClass.__proto__ = superClass);
+ }
+
+ var App = (function(_Component) {
+ _inherits(App, _Component);
+
+ function App() {
+ _classCallCheck(this, App);
+
+ return _possibleConstructorReturn(
+ this,
+ (App.__proto__ || Object.getPrototypeOf(App)).apply(
+ this,
+ arguments
+ )
+ );
+ }
+
+ _createClass(App, [
+ {
+ key: "render",
+ value: function render() {
+ return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(
+ "div",
+ {
+ className: "App",
+ __source: {
+ fileName: _jsxFileName,
+ lineNumber: 9
+ },
+ __self: this
+ },
+ __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(
+ "header",
+ {
+ className: "App-header",
+ __source: {
+ fileName: _jsxFileName,
+ lineNumber: 10
+ },
+ __self: this
+ },
+ __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(
+ "h1",
+ {
+ className: "App-title",
+ __source: {
+ fileName: _jsxFileName,
+ lineNumber: 11
+ },
+ __self: this
+ },
+ "Welcome to React"
+ )
+ ),
+ __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(
+ "p",
+ {
+ className: "App-intro",
+ __source: {
+ fileName: _jsxFileName,
+ lineNumber: 13
+ },
+ __self: this
+ },
+ "To get started, edit ",
+ __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(
+ "code",
+ {
+ __source: {
+ fileName: _jsxFileName,
+ lineNumber: 14
+ },
+ __self: this
+ },
+ "src/App.js"
+ ),
+ " and save to reload."
+ )
+ );
+ }
+ }
+ ]);
+
+ return App;
+ })(__WEBPACK_IMPORTED_MODULE_0_react__["Component"]);
+
+ window.hitBreakpoint = function breakpoint() {
+ Object(
+ __WEBPACK_IMPORTED_MODULE_1__step_in_test_js__["b" /* stepInTest */]
+ )();
+ Object(
+ __WEBPACK_IMPORTED_MODULE_2__step_over_test_js__["a" /* default */]
+ )();
+ Object(
+ __WEBPACK_IMPORTED_MODULE_3__step_out_test_js__["a" /* default */]
+ )();
+ console.log("hitting a breakpoint");
+ return;
+ };
+
+ window.hitDebugStatement = function() {
+ Object(
+ __WEBPACK_IMPORTED_MODULE_1__step_in_test_js__[
+ "a" /* debugStatement */
+ ]
+ )();
+ console.log("hitting a debug statement");
+ return;
+ };
+
+ /* harmony default export */ __webpack_exports__["a"] = App;
+
+ /***/
+ },
+
+ /***/ "./src/index.js":
+ /*!**********************!*\
+ !*** ./src/index.js ***!
+ \**********************/
+ /*! no exports provided */
+ /*! all exports used */
+ /***/ function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ Object.defineProperty(__webpack_exports__, "__esModule", {
+ value: true
+ });
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(
+ /*! react */ "./node_modules/react/index.js"
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(
+ __WEBPACK_IMPORTED_MODULE_0_react__
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react_dom__ = __webpack_require__(
+ /*! react-dom */ "./node_modules/react-dom/index.js"
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react_dom___default = __webpack_require__.n(
+ __WEBPACK_IMPORTED_MODULE_1_react_dom__
+ );
+ /* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__App__ = __webpack_require__(
+ /*! ./App */ "./src/App.js"
+ );
+ var _jsxFileName =
+ "/Users/Ystartsev/Work/debugger-sourcemaps/src/index.js";
+
+ __WEBPACK_IMPORTED_MODULE_1_react_dom___default.a.render(
+ __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(
+ __WEBPACK_IMPORTED_MODULE_2__App__["a" /* default */],
+ {
+ __source: {
+ fileName: _jsxFileName,
+ lineNumber: 5
+ },
+ __self: this
+ }
+ ),
+ document.getElementById("root")
+ );
+
+ /***/
+ },
+
+ /***/ "./src/step-in-test.js":
+ /*!*****************************!*\
+ !*** ./src/step-in-test.js ***!
+ \*****************************/
+ /*! exports provided: stepInTest, debugStatement */
+ /*! exports used: debugStatement, stepInTest */
+ /***/ function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ /* harmony export (immutable) */ __webpack_exports__["b"] = stepInTest;
+ /* harmony export (immutable) */ __webpack_exports__[
+ "a"
+ ] = debugStatement;
+ // depth: 3, width: 12
+ // 2586 functions, 182225 characters generated
+
+ function f0_0_0_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_0_0_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_0_2() {
+ return Math.random();
+ }
+
+ function f0_0_0_3() {
+ return Math.random();
+ }
+
+ function f0_0_0_4() {
+ return isNaN(undefined);
+ }
+
+ function f0_0_0_5() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_0_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_0_7() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_0_0_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_0_9() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_0_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_0_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_0() {
+ f0_0_0_0();
+ f0_0_0_1();
+ f0_0_0_2();
+ f0_0_0_3();
+ f0_0_0_4();
+ f0_0_0_5();
+ f0_0_0_6();
+ f0_0_0_7();
+ f0_0_0_8();
+ f0_0_0_9();
+ f0_0_0_10();
+ f0_0_0_11();
+ }
+
+ function f0_0_1_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_1_1() {
+ return Math.random();
+ }
+
+ function f0_0_1_2() {
+ return Math.random();
+ }
+
+ function f0_0_1_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_1_4() {
+ return Math.random();
+ }
+
+ function f0_0_1_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_0_1_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_1_7() {
+ return isNaN(undefined);
+ }
+
+ function f0_0_1_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_1_9() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_1_10() {
+ return Math.random();
+ }
+
+ function f0_0_1_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_0_1() {
+ f0_0_1_0();
+ f0_0_1_1();
+ f0_0_1_2();
+ f0_0_1_3();
+ f0_0_1_4();
+ f0_0_1_5();
+ f0_0_1_6();
+ f0_0_1_7();
+ f0_0_1_8();
+ f0_0_1_9();
+ f0_0_1_10();
+ f0_0_1_11();
+ }
+
+ function f0_0_2_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_0_2_1() {
+ return isNaN(undefined);
+ }
+
+ function f0_0_2_2() {
+ return isNaN(undefined);
+ }
+
+ function f0_0_2_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_2_4() {
+ return Math.random();
+ }
+
+ function f0_0_2_5() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_2_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_2_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_2_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_0_2_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_0_2_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_0_2_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_0_2() {
+ f0_0_2_0();
+ f0_0_2_1();
+ f0_0_2_2();
+ f0_0_2_3();
+ f0_0_2_4();
+ f0_0_2_5();
+ f0_0_2_6();
+ f0_0_2_7();
+ f0_0_2_8();
+ f0_0_2_9();
+ f0_0_2_10();
+ f0_0_2_11();
+ }
+
+ function f0_0_3_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_3_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_3_2() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_3_3() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_0_3_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_0_3_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_0_3_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_0_3_7() {
+ return isNaN(undefined);
+ }
+
+ function f0_0_3_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_0_3_9() {
+ return Math.random();
+ }
+
+ function f0_0_3_10() {
+ return isNaN(undefined);
+ }
+
+ function f0_0_3_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_0_3() {
+ f0_0_3_0();
+ f0_0_3_1();
+ f0_0_3_2();
+ f0_0_3_3();
+ f0_0_3_4();
+ f0_0_3_5();
+ f0_0_3_6();
+ f0_0_3_7();
+ f0_0_3_8();
+ f0_0_3_9();
+ f0_0_3_10();
+ f0_0_3_11();
+ }
+
+ function f0_0_4_0() {
+ return isNaN(undefined);
+ }
+
+ function f0_0_4_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_4_2() {
+ return Math.random();
+ }
+
+ function f0_0_4_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_0_4_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_0_4_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_0_4_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_0_4_7() {
+ return isNaN(undefined);
+ }
+
+ function f0_0_4_8() {
+ return isNaN(undefined);
+ }
+
+ function f0_0_4_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_0_4_10() {
+ return Math.random();
+ }
+
+ function f0_0_4_11() {
+ return isNaN(undefined);
+ }
+
+ function f0_0_4() {
+ f0_0_4_0();
+ f0_0_4_1();
+ f0_0_4_2();
+ f0_0_4_3();
+ f0_0_4_4();
+ f0_0_4_5();
+ f0_0_4_6();
+ f0_0_4_7();
+ f0_0_4_8();
+ f0_0_4_9();
+ f0_0_4_10();
+ f0_0_4_11();
+ }
+
+ function f0_0_5_0() {
+ return Math.random();
+ }
+
+ function f0_0_5_1() {
+ return Math.random();
+ }
+
+ function f0_0_5_2() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_5_3() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_0_5_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_0_5_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_0_5_6() {
+ return Math.random();
+ }
+
+ function f0_0_5_7() {
+ return isNaN(undefined);
+ }
+
+ function f0_0_5_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_5_9() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_5_10() {
+ return isNaN(undefined);
+ }
+
+ function f0_0_5_11() {
+ return Math.random();
+ }
+
+ function f0_0_5() {
+ f0_0_5_0();
+ f0_0_5_1();
+ f0_0_5_2();
+ f0_0_5_3();
+ f0_0_5_4();
+ f0_0_5_5();
+ f0_0_5_6();
+ f0_0_5_7();
+ f0_0_5_8();
+ f0_0_5_9();
+ f0_0_5_10();
+ f0_0_5_11();
+ }
+
+ function f0_0_6_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_0_6_1() {
+ return Math.random();
+ }
+
+ function f0_0_6_2() {
+ return isNaN(undefined);
+ }
+
+ function f0_0_6_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_0_6_4() {
+ return isNaN(undefined);
+ }
+
+ function f0_0_6_5() {
+ return Math.random();
+ }
+
+ function f0_0_6_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_6_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_6_8() {
+ return Math.random();
+ }
+
+ function f0_0_6_9() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_6_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_0_6_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_6() {
+ f0_0_6_0();
+ f0_0_6_1();
+ f0_0_6_2();
+ f0_0_6_3();
+ f0_0_6_4();
+ f0_0_6_5();
+ f0_0_6_6();
+ f0_0_6_7();
+ f0_0_6_8();
+ f0_0_6_9();
+ f0_0_6_10();
+ f0_0_6_11();
+ }
+
+ function f0_0_7_0() {
+ return isNaN(undefined);
+ }
+
+ function f0_0_7_1() {
+ return Math.random();
+ }
+
+ function f0_0_7_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_0_7_3() {
+ return Math.random();
+ }
+
+ function f0_0_7_4() {
+ return Math.random();
+ }
+
+ function f0_0_7_5() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_7_6() {
+ return Math.random();
+ }
+
+ function f0_0_7_7() {
+ return Math.random();
+ }
+
+ function f0_0_7_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_7_9() {
+ return isNaN(undefined);
+ }
+
+ function f0_0_7_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_7_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_7() {
+ f0_0_7_0();
+ f0_0_7_1();
+ f0_0_7_2();
+ f0_0_7_3();
+ f0_0_7_4();
+ f0_0_7_5();
+ f0_0_7_6();
+ f0_0_7_7();
+ f0_0_7_8();
+ f0_0_7_9();
+ f0_0_7_10();
+ f0_0_7_11();
+ }
+
+ function f0_0_8_0() {
+ return Math.random();
+ }
+
+ function f0_0_8_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_0_8_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_0_8_3() {
+ return Math.random();
+ }
+
+ function f0_0_8_4() {
+ return isNaN(undefined);
+ }
+
+ function f0_0_8_5() {
+ return Math.random();
+ }
+
+ function f0_0_8_6() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_0_8_7() {
+ return Math.random();
+ }
+
+ function f0_0_8_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_8_9() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_8_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_8_11() {
+ return Math.random();
+ }
+
+ function f0_0_8() {
+ f0_0_8_0();
+ f0_0_8_1();
+ f0_0_8_2();
+ f0_0_8_3();
+ f0_0_8_4();
+ f0_0_8_5();
+ f0_0_8_6();
+ f0_0_8_7();
+ f0_0_8_8();
+ f0_0_8_9();
+ f0_0_8_10();
+ f0_0_8_11();
+ }
+
+ function f0_0_9_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_9_1() {
+ return Math.random();
+ }
+
+ function f0_0_9_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_0_9_3() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_0_9_4() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_9_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_0_9_6() {
+ return Math.random();
+ }
+
+ function f0_0_9_7() {
+ return Math.random();
+ }
+
+ function f0_0_9_8() {
+ return Math.random();
+ }
+
+ function f0_0_9_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_0_9_10() {
+ return Math.random();
+ }
+
+ function f0_0_9_11() {
+ return Math.random();
+ }
+
+ function f0_0_9() {
+ f0_0_9_0();
+ f0_0_9_1();
+ f0_0_9_2();
+ f0_0_9_3();
+ f0_0_9_4();
+ f0_0_9_5();
+ f0_0_9_6();
+ f0_0_9_7();
+ f0_0_9_8();
+ f0_0_9_9();
+ f0_0_9_10();
+ f0_0_9_11();
+ }
+
+ function f0_0_10_0() {
+ return Math.random();
+ }
+
+ function f0_0_10_1() {
+ return isNaN(undefined);
+ }
+
+ function f0_0_10_2() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_10_3() {
+ return Math.random();
+ }
+
+ function f0_0_10_4() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_10_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_0_10_6() {
+ return Math.random();
+ }
+
+ function f0_0_10_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_10_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_10_9() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_10_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_10_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_0_10() {
+ f0_0_10_0();
+ f0_0_10_1();
+ f0_0_10_2();
+ f0_0_10_3();
+ f0_0_10_4();
+ f0_0_10_5();
+ f0_0_10_6();
+ f0_0_10_7();
+ f0_0_10_8();
+ f0_0_10_9();
+ f0_0_10_10();
+ f0_0_10_11();
+ }
+
+ function f0_0_11_0() {
+ return Math.random();
+ }
+
+ function f0_0_11_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_11_2() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_11_3() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_0_11_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_0_11_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_0_11_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_0_11_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_0_11_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_0_11_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_0_11_10() {
+ return Math.random();
+ }
+
+ function f0_0_11_11() {
+ return Math.random();
+ }
+
+ function f0_0_11() {
+ f0_0_11_0();
+ f0_0_11_1();
+ f0_0_11_2();
+ f0_0_11_3();
+ f0_0_11_4();
+ f0_0_11_5();
+ f0_0_11_6();
+ f0_0_11_7();
+ f0_0_11_8();
+ f0_0_11_9();
+ f0_0_11_10();
+ f0_0_11_11();
+ }
+
+ function f0_0() {
+ f0_0_0();
+ f0_0_1();
+ f0_0_2();
+ f0_0_3();
+ f0_0_4();
+ f0_0_5();
+ f0_0_6();
+ f0_0_7();
+ f0_0_8();
+ f0_0_9();
+ f0_0_10();
+ f0_0_11();
+ }
+
+ function f0_1_0_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_1_0_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_1_0_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_1_0_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_1_0_4() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_1_0_5() {
+ return Math.random();
+ }
+
+ function f0_1_0_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_0_7() {
+ return Math.random();
+ }
+
+ function f0_1_0_8() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_0_9() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_1_0_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_1_0_11() {
+ return Math.random();
+ }
+
+ function f0_1_0() {
+ f0_1_0_0();
+ f0_1_0_1();
+ f0_1_0_2();
+ f0_1_0_3();
+ f0_1_0_4();
+ f0_1_0_5();
+ f0_1_0_6();
+ f0_1_0_7();
+ f0_1_0_8();
+ f0_1_0_9();
+ f0_1_0_10();
+ f0_1_0_11();
+ }
+
+ function f0_1_1_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_1_1_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_1_1_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_1_1_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_1_4() {
+ return Math.random();
+ }
+
+ function f0_1_1_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_1_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_1_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_1_1_8() {
+ return Math.random();
+ }
+
+ function f0_1_1_9() {
+ return Math.random();
+ }
+
+ function f0_1_1_10() {
+ return Math.random();
+ }
+
+ function f0_1_1_11() {
+ return Math.random();
+ }
+
+ function f0_1_1() {
+ f0_1_1_0();
+ f0_1_1_1();
+ f0_1_1_2();
+ f0_1_1_3();
+ f0_1_1_4();
+ f0_1_1_5();
+ f0_1_1_6();
+ f0_1_1_7();
+ f0_1_1_8();
+ f0_1_1_9();
+ f0_1_1_10();
+ f0_1_1_11();
+ }
+
+ function f0_1_2_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_1_2_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_1_2_2() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_1_2_3() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_1_2_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_1_2_5() {
+ return Math.random();
+ }
+
+ function f0_1_2_6() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_1_2_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_1_2_8() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_2_9() {
+ return Math.random();
+ }
+
+ function f0_1_2_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_1_2_11() {
+ return Math.random();
+ }
+
+ function f0_1_2() {
+ f0_1_2_0();
+ f0_1_2_1();
+ f0_1_2_2();
+ f0_1_2_3();
+ f0_1_2_4();
+ f0_1_2_5();
+ f0_1_2_6();
+ f0_1_2_7();
+ f0_1_2_8();
+ f0_1_2_9();
+ f0_1_2_10();
+ f0_1_2_11();
+ }
+
+ function f0_1_3_0() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_3_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_1_3_2() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_3_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_1_3_4() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_3_5() {
+ return Math.random();
+ }
+
+ function f0_1_3_6() {
+ return Math.random();
+ }
+
+ function f0_1_3_7() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_1_3_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_1_3_9() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_1_3_10() {
+ return Math.random();
+ }
+
+ function f0_1_3_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_1_3() {
+ f0_1_3_0();
+ f0_1_3_1();
+ f0_1_3_2();
+ f0_1_3_3();
+ f0_1_3_4();
+ f0_1_3_5();
+ f0_1_3_6();
+ f0_1_3_7();
+ f0_1_3_8();
+ f0_1_3_9();
+ f0_1_3_10();
+ f0_1_3_11();
+ }
+
+ function f0_1_4_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_1_4_1() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_4_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_1_4_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_4_4() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_4_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_4_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_4_7() {
+ return Math.random();
+ }
+
+ function f0_1_4_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_1_4_9() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_4_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_1_4_11() {
+ return Math.random();
+ }
+
+ function f0_1_4() {
+ f0_1_4_0();
+ f0_1_4_1();
+ f0_1_4_2();
+ f0_1_4_3();
+ f0_1_4_4();
+ f0_1_4_5();
+ f0_1_4_6();
+ f0_1_4_7();
+ f0_1_4_8();
+ f0_1_4_9();
+ f0_1_4_10();
+ f0_1_4_11();
+ }
+
+ function f0_1_5_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_1_5_1() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_5_2() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_1_5_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_1_5_4() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_1_5_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_1_5_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_1_5_7() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_5_8() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_5_9() {
+ return Math.random();
+ }
+
+ function f0_1_5_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_1_5_11() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_5() {
+ f0_1_5_0();
+ f0_1_5_1();
+ f0_1_5_2();
+ f0_1_5_3();
+ f0_1_5_4();
+ f0_1_5_5();
+ f0_1_5_6();
+ f0_1_5_7();
+ f0_1_5_8();
+ f0_1_5_9();
+ f0_1_5_10();
+ f0_1_5_11();
+ }
+
+ function f0_1_6_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_1_6_1() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_6_2() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_6_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_6_4() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_6_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_1_6_6() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_1_6_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_1_6_8() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_6_9() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_1_6_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_1_6_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_1_6() {
+ f0_1_6_0();
+ f0_1_6_1();
+ f0_1_6_2();
+ f0_1_6_3();
+ f0_1_6_4();
+ f0_1_6_5();
+ f0_1_6_6();
+ f0_1_6_7();
+ f0_1_6_8();
+ f0_1_6_9();
+ f0_1_6_10();
+ f0_1_6_11();
+ }
+
+ function f0_1_7_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_1_7_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_1_7_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_1_7_3() {
+ return Math.random();
+ }
+
+ function f0_1_7_4() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_1_7_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_7_6() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_1_7_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_1_7_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_1_7_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_1_7_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_1_7_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_1_7() {
+ f0_1_7_0();
+ f0_1_7_1();
+ f0_1_7_2();
+ f0_1_7_3();
+ f0_1_7_4();
+ f0_1_7_5();
+ f0_1_7_6();
+ f0_1_7_7();
+ f0_1_7_8();
+ f0_1_7_9();
+ f0_1_7_10();
+ f0_1_7_11();
+ }
+ function f0_1_8_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_1_8_1() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_8_2() {
+ return Math.random();
+ }
+
+ function f0_1_8_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_8_4() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_8_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_8_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_8_7() {
+ return Math.random();
+ }
+
+ function f0_1_8_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_1_8_9() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_8_10() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_8_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_1_8() {
+ f0_1_8_0();
+ f0_1_8_1();
+ f0_1_8_2();
+ f0_1_8_3();
+ f0_1_8_4();
+ f0_1_8_5();
+ f0_1_8_6();
+ f0_1_8_7();
+ f0_1_8_8();
+ f0_1_8_9();
+ f0_1_8_10();
+ f0_1_8_11();
+ }
+
+ function f0_1_9_0() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_9_1() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_9_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_1_9_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_9_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_1_9_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_9_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_1_9_7() {
+ return Math.random();
+ }
+
+ function f0_1_9_8() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_9_9() {
+ return Math.random();
+ }
+
+ function f0_1_9_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_1_9_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_1_9() {
+ f0_1_9_0();
+ f0_1_9_1();
+ f0_1_9_2();
+ f0_1_9_3();
+ f0_1_9_4();
+ f0_1_9_5();
+ f0_1_9_6();
+ f0_1_9_7();
+ f0_1_9_8();
+ f0_1_9_9();
+ f0_1_9_10();
+ f0_1_9_11();
+ }
+
+ function f0_1_10_0() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_10_1() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_10_2() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_1_10_3() {
+ return Math.random();
+ }
+
+ function f0_1_10_4() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_1_10_5() {
+ return Math.random();
+ }
+
+ function f0_1_10_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_1_10_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_1_10_8() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_10_9() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_10_10() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_10_11() {
+ return isNaN(undefined);
+ }
+
+ function f0_1_10() {
+ f0_1_10_0();
+ f0_1_10_1();
+ f0_1_10_2();
+ f0_1_10_3();
+ f0_1_10_4();
+ f0_1_10_5();
+ f0_1_10_6();
+ f0_1_10_7();
+ f0_1_10_8();
+ f0_1_10_9();
+ f0_1_10_10();
+ f0_1_10_11();
+ }
+
+ function f0_1_11_0() {
+ return Math.random();
+ }
+
+ function f0_1_11_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_1_11_2() {
+ return Math.random();
+ }
+
+ function f0_1_11_3() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_1_11_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_1_11_5() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_1_11_6() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_1_11_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_1_11_8() {
+ return Math.random();
+ }
+
+ function f0_1_11_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_1_11_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_1_11_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_1_11() {
+ f0_1_11_0();
+ f0_1_11_1();
+ f0_1_11_2();
+ f0_1_11_3();
+ f0_1_11_4();
+ f0_1_11_5();
+ f0_1_11_6();
+ f0_1_11_7();
+ f0_1_11_8();
+ f0_1_11_9();
+ f0_1_11_10();
+ f0_1_11_11();
+ }
+
+ function f0_1() {
+ f0_1_0();
+ f0_1_1();
+ f0_1_2();
+ f0_1_3();
+ f0_1_4();
+ f0_1_5();
+ f0_1_6();
+ f0_1_7();
+ f0_1_8();
+ f0_1_9();
+ f0_1_10();
+ f0_1_11();
+ }
+
+ function f0_2_0_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_2_0_1() {
+ return Math.random();
+ }
+
+ function f0_2_0_2() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_2_0_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_2_0_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_2_0_5() {
+ return Math.random();
+ }
+
+ function f0_2_0_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_2_0_7() {
+ return Math.random();
+ }
+
+ function f0_2_0_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_2_0_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_2_0_10() {
+ return isNaN(undefined);
+ }
+
+ function f0_2_0_11() {
+ return isNaN(undefined);
+ }
+
+ function f0_2_0() {
+ f0_2_0_0();
+ f0_2_0_1();
+ f0_2_0_2();
+ f0_2_0_3();
+ f0_2_0_4();
+ f0_2_0_5();
+ f0_2_0_6();
+ f0_2_0_7();
+ f0_2_0_8();
+ f0_2_0_9();
+ f0_2_0_10();
+ f0_2_0_11();
+ }
+
+ function f0_2_1_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_2_1_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_2_1_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_2_1_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_2_1_4() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_2_1_5() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_2_1_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_2_1_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_2_1_8() {
+ return isNaN(undefined);
+ }
+
+ function f0_2_1_9() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_2_1_10() {
+ return isNaN(undefined);
+ }
+
+ function f0_2_1_11() {
+ return isNaN(undefined);
+ }
+
+ function f0_2_1() {
+ f0_2_1_0();
+ f0_2_1_1();
+ f0_2_1_2();
+ f0_2_1_3();
+ f0_2_1_4();
+ f0_2_1_5();
+ f0_2_1_6();
+ f0_2_1_7();
+ f0_2_1_8();
+ f0_2_1_9();
+ f0_2_1_10();
+ f0_2_1_11();
+ }
+
+ function f0_2_2_0() {
+ return Math.random();
+ }
+
+ function f0_2_2_1() {
+ return Math.random();
+ }
+
+ function f0_2_2_2() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_2_2_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_2_2_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_2_2_5() {
+ return Math.random();
+ }
+
+ function f0_2_2_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_2_2_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_2_2_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_2_2_9() {
+ return Math.random();
+ }
+
+ function f0_2_2_10() {
+ return Math.random();
+ }
+
+ function f0_2_2_11() {
+ return isNaN(undefined);
+ }
+
+ function f0_2_2() {
+ f0_2_2_0();
+ f0_2_2_1();
+ f0_2_2_2();
+ f0_2_2_3();
+ f0_2_2_4();
+ f0_2_2_5();
+ f0_2_2_6();
+ f0_2_2_7();
+ f0_2_2_8();
+ f0_2_2_9();
+ f0_2_2_10();
+ f0_2_2_11();
+ }
+
+ function f0_2_3_0() {
+ return Math.random();
+ }
+
+ function f0_2_3_1() {
+ return Math.random();
+ }
+
+ function f0_2_3_2() {
+ return Math.random();
+ }
+
+ function f0_2_3_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_2_3_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_2_3_5() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_2_3_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_2_3_7() {
+ return isNaN(undefined);
+ }
+
+ function f0_2_3_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_2_3_9() {
+ return Math.random();
+ }
+
+ function f0_2_3_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_2_3_11() {
+ return isNaN(undefined);
+ }
+
+ function f0_2_3() {
+ f0_2_3_0();
+ f0_2_3_1();
+ f0_2_3_2();
+ f0_2_3_3();
+ f0_2_3_4();
+ f0_2_3_5();
+ f0_2_3_6();
+ f0_2_3_7();
+ f0_2_3_8();
+ f0_2_3_9();
+ f0_2_3_10();
+ f0_2_3_11();
+ }
+
+ function f0_2_4_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_2_4_1() {
+ return Math.random();
+ }
+
+ function f0_2_4_2() {
+ return Math.random();
+ }
+
+ function f0_2_4_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_2_4_4() {
+ return isNaN(undefined);
+ }
+
+ function f0_2_4_5() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_2_4_6() {
+ return Math.random();
+ }
+
+ function f0_2_4_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_2_4_8() {
+ return Math.random();
+ }
+
+ function f0_2_4_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_2_4_10() {
+ return isNaN(undefined);
+ }
+
+ function f0_2_4_11() {
+ return isNaN(undefined);
+ }
+
+ function f0_2_4() {
+ f0_2_4_0();
+ f0_2_4_1();
+ f0_2_4_2();
+ f0_2_4_3();
+ f0_2_4_4();
+ f0_2_4_5();
+ f0_2_4_6();
+ f0_2_4_7();
+ f0_2_4_8();
+ f0_2_4_9();
+ f0_2_4_10();
+ f0_2_4_11();
+ }
+
+ function f0_2_5_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_2_5_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_2_5_2() {
+ return Math.random();
+ }
+
+ function f0_2_5_3() {
+ return Math.random();
+ }
+
+ function f0_2_5_4() {
+ return isNaN(undefined);
+ }
+
+ function f0_2_5_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_2_5_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_2_5_7() {
+ return isNaN(undefined);
+ }
+
+ function f0_2_5_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_2_5_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_2_5_10() {
+ return Math.random();
+ }
+
+ function f0_2_5_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_2_5() {
+ f0_2_5_0();
+ f0_2_5_1();
+ f0_2_5_2();
+ f0_2_5_3();
+ f0_2_5_4();
+ f0_2_5_5();
+ f0_2_5_6();
+ f0_2_5_7();
+ f0_2_5_8();
+ f0_2_5_9();
+ f0_2_5_10();
+ f0_2_5_11();
+ }
+
+ function f0_2_6_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_2_6_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_2_6_2() {
+ return Math.random();
+ }
+
+ function f0_2_6_3() {
+ return Math.random();
+ }
+
+ function f0_2_6_4() {
+ return Math.random();
+ }
+
+ function f0_2_6_5() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_2_6_6() {
+ return Math.random();
+ }
+
+ function f0_2_6_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_2_6_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_2_6_9() {
+ return Math.random();
+ }
+
+ function f0_2_6_10() {
+ return isNaN(undefined);
+ }
+
+ function f0_2_6_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_2_6() {
+ f0_2_6_0();
+ f0_2_6_1();
+ f0_2_6_2();
+ f0_2_6_3();
+ f0_2_6_4();
+ f0_2_6_5();
+ f0_2_6_6();
+ f0_2_6_7();
+ f0_2_6_8();
+ f0_2_6_9();
+ f0_2_6_10();
+ f0_2_6_11();
+ }
+
+ function f0_2_7_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_2_7_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_2_7_2() {
+ return isNaN(undefined);
+ }
+
+ function f0_2_7_3() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_2_7_4() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_2_7_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_2_7_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_2_7_7() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_2_7_8() {
+ return isNaN(undefined);
+ }
+
+ function f0_2_7_9() {
+ return Math.random();
+ }
+
+ function f0_2_7_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_2_7_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_2_7() {
+ f0_2_7_0();
+ f0_2_7_1();
+ f0_2_7_2();
+ f0_2_7_3();
+ f0_2_7_4();
+ f0_2_7_5();
+ f0_2_7_6();
+ f0_2_7_7();
+ f0_2_7_8();
+ f0_2_7_9();
+ f0_2_7_10();
+ f0_2_7_11();
+ }
+
+ function f0_2_8_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_2_8_1() {
+ return Math.random();
+ }
+
+ function f0_2_8_2() {
+ return isNaN(undefined);
+ }
+
+ function f0_2_8_3() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_2_8_4() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_2_8_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_2_8_6() {
+ return Math.random();
+ }
+
+ function f0_2_8_7() {
+ return isNaN(undefined);
+ }
+
+ function f0_2_8_8() {
+ return Math.random();
+ }
+
+ function f0_2_8_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_2_8_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_2_8_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_2_8() {
+ f0_2_8_0();
+ f0_2_8_1();
+ f0_2_8_2();
+ f0_2_8_3();
+ f0_2_8_4();
+ f0_2_8_5();
+ f0_2_8_6();
+ f0_2_8_7();
+ f0_2_8_8();
+ f0_2_8_9();
+ f0_2_8_10();
+ f0_2_8_11();
+ }
+
+ function f0_2_9_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_2_9_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_2_9_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_2_9_3() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_2_9_4() {
+ return isNaN(undefined);
+ }
+
+ function f0_2_9_5() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_2_9_6() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_2_9_7() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_2_9_8() {
+ return Math.random();
+ }
+
+ function f0_2_9_9() {
+ return Math.random();
+ }
+
+ function f0_2_9_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_2_9_11() {
+ return isNaN(undefined);
+ }
+
+ function f0_2_9() {
+ f0_2_9_0();
+ f0_2_9_1();
+ f0_2_9_2();
+ f0_2_9_3();
+ f0_2_9_4();
+ f0_2_9_5();
+ f0_2_9_6();
+ f0_2_9_7();
+ f0_2_9_8();
+ f0_2_9_9();
+ f0_2_9_10();
+ f0_2_9_11();
+ }
+
+ function f0_2_10_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_2_10_1() {
+ return Math.random();
+ }
+
+ function f0_2_10_2() {
+ return isNaN(undefined);
+ }
+
+ function f0_2_10_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_2_10_4() {
+ return isNaN(undefined);
+ }
+
+ function f0_2_10_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_2_10_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_2_10_7() {
+ return Math.random();
+ }
+
+ function f0_2_10_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_2_10_9() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_2_10_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_2_10_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_2_10() {
+ f0_2_10_0();
+ f0_2_10_1();
+ f0_2_10_2();
+ f0_2_10_3();
+ f0_2_10_4();
+ f0_2_10_5();
+ f0_2_10_6();
+ f0_2_10_7();
+ f0_2_10_8();
+ f0_2_10_9();
+ f0_2_10_10();
+ f0_2_10_11();
+ }
+
+ function f0_2_11_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_2_11_1() {
+ return Math.random();
+ }
+
+ function f0_2_11_2() {
+ return Math.random();
+ }
+
+ function f0_2_11_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_2_11_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_2_11_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_2_11_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_2_11_7() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_2_11_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_2_11_9() {
+ return isNaN(undefined);
+ }
+
+ function f0_2_11_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_2_11_11() {
+ return isNaN(undefined);
+ }
+
+ function f0_2_11() {
+ f0_2_11_0();
+ f0_2_11_1();
+ f0_2_11_2();
+ f0_2_11_3();
+ f0_2_11_4();
+ f0_2_11_5();
+ f0_2_11_6();
+ f0_2_11_7();
+ f0_2_11_8();
+ f0_2_11_9();
+ f0_2_11_10();
+ f0_2_11_11();
+ }
+
+ function f0_2() {
+ f0_2_0();
+ f0_2_1();
+ f0_2_2();
+ f0_2_3();
+ f0_2_4();
+ f0_2_5();
+ f0_2_6();
+ f0_2_7();
+ f0_2_8();
+ f0_2_9();
+ f0_2_10();
+ f0_2_11();
+ }
+
+ function f0_3_0_0() {
+ return Math.random();
+ }
+
+ function f0_3_0_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_0_2() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_3_0_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_3_0_4() {
+ return Math.random();
+ }
+
+ function f0_3_0_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_0_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_3_0_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_3_0_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_3_0_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_0_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_0_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_0() {
+ f0_3_0_0();
+ f0_3_0_1();
+ f0_3_0_2();
+ f0_3_0_3();
+ f0_3_0_4();
+ f0_3_0_5();
+ f0_3_0_6();
+ f0_3_0_7();
+ f0_3_0_8();
+ f0_3_0_9();
+ f0_3_0_10();
+ f0_3_0_11();
+ }
+
+ function f0_3_1_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_1_1() {
+ return isNaN(undefined);
+ }
+
+ function f0_3_1_2() {
+ return Math.random();
+ }
+
+ function f0_3_1_3() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_1_4() {
+ return isNaN(undefined);
+ }
+
+ function f0_3_1_5() {
+ return Math.random();
+ }
+
+ function f0_3_1_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_3_1_7() {
+ return isNaN(undefined);
+ }
+
+ function f0_3_1_8() {
+ return Math.random();
+ }
+
+ function f0_3_1_9() {
+ return Math.random();
+ }
+
+ function f0_3_1_10() {
+ return Math.random();
+ }
+
+ function f0_3_1_11() {
+ return Math.random();
+ }
+
+ function f0_3_1() {
+ f0_3_1_0();
+ f0_3_1_1();
+ f0_3_1_2();
+ f0_3_1_3();
+ f0_3_1_4();
+ f0_3_1_5();
+ f0_3_1_6();
+ f0_3_1_7();
+ f0_3_1_8();
+ f0_3_1_9();
+ f0_3_1_10();
+ f0_3_1_11();
+ }
+
+ function f0_3_2_0() {
+ return Math.random();
+ }
+
+ function f0_3_2_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_3_2_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_2_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_3_2_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_2_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_2_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_3_2_7() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_2_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_3_2_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_2_10() {
+ return isNaN(undefined);
+ }
+
+ function f0_3_2_11() {
+ return Math.random();
+ }
+
+ function f0_3_2() {
+ f0_3_2_0();
+ f0_3_2_1();
+ f0_3_2_2();
+ f0_3_2_3();
+ f0_3_2_4();
+ f0_3_2_5();
+ f0_3_2_6();
+ f0_3_2_7();
+ f0_3_2_8();
+ f0_3_2_9();
+ f0_3_2_10();
+ f0_3_2_11();
+ }
+
+ function f0_3_3_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_3_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_3_3_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_3_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_3_3_4() {
+ return isNaN(undefined);
+ }
+
+ function f0_3_3_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_3_6() {
+ return Math.random();
+ }
+
+ function f0_3_3_7() {
+ return isNaN(undefined);
+ }
+
+ function f0_3_3_8() {
+ return isNaN(undefined);
+ }
+
+ function f0_3_3_9() {
+ return isNaN(undefined);
+ }
+
+ function f0_3_3_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_3_11() {
+ return Math.random();
+ }
+
+ function f0_3_3() {
+ f0_3_3_0();
+ f0_3_3_1();
+ f0_3_3_2();
+ f0_3_3_3();
+ f0_3_3_4();
+ f0_3_3_5();
+ f0_3_3_6();
+ f0_3_3_7();
+ f0_3_3_8();
+ f0_3_3_9();
+ f0_3_3_10();
+ f0_3_3_11();
+ }
+
+ function f0_3_4_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_4_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_4_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_4_3() {
+ return Math.random();
+ }
+
+ function f0_3_4_4() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_3_4_5() {
+ return Math.random();
+ }
+
+ function f0_3_4_6() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_4_7() {
+ return Math.random();
+ }
+
+ function f0_3_4_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_4_9() {
+ return Math.random();
+ }
+
+ function f0_3_4_10() {
+ return Math.random();
+ }
+
+ function f0_3_4_11() {
+ return Math.random();
+ }
+
+ function f0_3_4() {
+ f0_3_4_0();
+ f0_3_4_1();
+ f0_3_4_2();
+ f0_3_4_3();
+ f0_3_4_4();
+ f0_3_4_5();
+ f0_3_4_6();
+ f0_3_4_7();
+ f0_3_4_8();
+ f0_3_4_9();
+ f0_3_4_10();
+ f0_3_4_11();
+ }
+
+ function f0_3_5_0() {
+ return Math.random();
+ }
+
+ function f0_3_5_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_3_5_2() {
+ return isNaN(undefined);
+ }
+
+ function f0_3_5_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_3_5_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_5_5() {
+ return Math.random();
+ }
+
+ function f0_3_5_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_3_5_7() {
+ return Math.random();
+ }
+
+ function f0_3_5_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_5_9() {
+ return isNaN(undefined);
+ }
+
+ function f0_3_5_10() {
+ return Math.random();
+ }
+
+ function f0_3_5_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_3_5() {
+ f0_3_5_0();
+ f0_3_5_1();
+ f0_3_5_2();
+ f0_3_5_3();
+ f0_3_5_4();
+ f0_3_5_5();
+ f0_3_5_6();
+ f0_3_5_7();
+ f0_3_5_8();
+ f0_3_5_9();
+ f0_3_5_10();
+ f0_3_5_11();
+ }
+
+ function f0_3_6_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_3_6_1() {
+ return isNaN(undefined);
+ }
+
+ function f0_3_6_2() {
+ return Math.random();
+ }
+
+ function f0_3_6_3() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_6_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_6_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_6_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_3_6_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_3_6_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_6_9() {
+ return isNaN(undefined);
+ }
+
+ function f0_3_6_10() {
+ return Math.random();
+ }
+
+ function f0_3_6_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_3_6() {
+ f0_3_6_0();
+ f0_3_6_1();
+ f0_3_6_2();
+ f0_3_6_3();
+ f0_3_6_4();
+ f0_3_6_5();
+ f0_3_6_6();
+ f0_3_6_7();
+ f0_3_6_8();
+ f0_3_6_9();
+ f0_3_6_10();
+ f0_3_6_11();
+ }
+
+ function f0_3_7_0() {
+ return isNaN(undefined);
+ }
+
+ function f0_3_7_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_7_2() {
+ return Math.random();
+ }
+
+ function f0_3_7_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_3_7_4() {
+ return isNaN(undefined);
+ }
+
+ function f0_3_7_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_7_6() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_7_7() {
+ return isNaN(undefined);
+ }
+
+ function f0_3_7_8() {
+ return Math.random();
+ }
+
+ function f0_3_7_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_7_10() {
+ return isNaN(undefined);
+ }
+
+ function f0_3_7_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_7() {
+ f0_3_7_0();
+ f0_3_7_1();
+ f0_3_7_2();
+ f0_3_7_3();
+ f0_3_7_4();
+ f0_3_7_5();
+ f0_3_7_6();
+ f0_3_7_7();
+ f0_3_7_8();
+ f0_3_7_9();
+ f0_3_7_10();
+ f0_3_7_11();
+ }
+
+ function f0_3_8_0() {
+ return Math.random();
+ }
+
+ function f0_3_8_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_8_2() {
+ return isNaN(undefined);
+ }
+
+ function f0_3_8_3() {
+ return Math.random();
+ }
+
+ function f0_3_8_4() {
+ return Math.random();
+ }
+
+ function f0_3_8_5() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_3_8_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_3_8_7() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_8_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_8_9() {
+ return Math.random();
+ }
+
+ function f0_3_8_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_3_8_11() {
+ return Math.random();
+ }
+
+ function f0_3_8() {
+ f0_3_8_0();
+ f0_3_8_1();
+ f0_3_8_2();
+ f0_3_8_3();
+ f0_3_8_4();
+ f0_3_8_5();
+ f0_3_8_6();
+ f0_3_8_7();
+ f0_3_8_8();
+ f0_3_8_9();
+ f0_3_8_10();
+ f0_3_8_11();
+ }
+
+ function f0_3_9_0() {
+ return isNaN(undefined);
+ }
+
+ function f0_3_9_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_9_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_9_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_3_9_4() {
+ return isNaN(undefined);
+ }
+
+ function f0_3_9_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_9_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_3_9_7() {
+ return Math.random();
+ }
+
+ function f0_3_9_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_3_9_9() {
+ return Math.random();
+ }
+
+ function f0_3_9_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_9_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_9() {
+ f0_3_9_0();
+ f0_3_9_1();
+ f0_3_9_2();
+ f0_3_9_3();
+ f0_3_9_4();
+ f0_3_9_5();
+ f0_3_9_6();
+ f0_3_9_7();
+ f0_3_9_8();
+ f0_3_9_9();
+ f0_3_9_10();
+ f0_3_9_11();
+ }
+
+ function f0_3_10_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_3_10_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_3_10_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_10_3() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_10_4() {
+ return isNaN(undefined);
+ }
+
+ function f0_3_10_5() {
+ return Math.random();
+ }
+
+ function f0_3_10_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_3_10_7() {
+ return isNaN(undefined);
+ }
+
+ function f0_3_10_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_10_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_10_10() {
+ return isNaN(undefined);
+ }
+
+ function f0_3_10_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_3_10() {
+ f0_3_10_0();
+ f0_3_10_1();
+ f0_3_10_2();
+ f0_3_10_3();
+ f0_3_10_4();
+ f0_3_10_5();
+ f0_3_10_6();
+ f0_3_10_7();
+ f0_3_10_8();
+ f0_3_10_9();
+ f0_3_10_10();
+ f0_3_10_11();
+ }
+
+ function f0_3_11_0() {
+ return isNaN(undefined);
+ }
+
+ function f0_3_11_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_3_11_2() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_3_11_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_3_11_4() {
+ return isNaN(undefined);
+ }
+
+ function f0_3_11_5() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_3_11_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_3_11_7() {
+ return Math.random();
+ }
+
+ function f0_3_11_8() {
+ return Math.random();
+ }
+
+ function f0_3_11_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_3_11_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_3_11_11() {
+ return Math.random();
+ }
+
+ function f0_3_11() {
+ f0_3_11_0();
+ f0_3_11_1();
+ f0_3_11_2();
+ f0_3_11_3();
+ f0_3_11_4();
+ f0_3_11_5();
+ f0_3_11_6();
+ f0_3_11_7();
+ f0_3_11_8();
+ f0_3_11_9();
+ f0_3_11_10();
+ f0_3_11_11();
+ }
+
+ function f0_3() {
+ f0_3_0();
+ f0_3_1();
+ f0_3_2();
+ f0_3_3();
+ f0_3_4();
+ f0_3_5();
+ f0_3_6();
+ f0_3_7();
+ f0_3_8();
+ f0_3_9();
+ f0_3_10();
+ f0_3_11();
+ }
+
+ function f0_4_0_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_0_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_0_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_4_0_3() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_4_0_4() {
+ return Math.random();
+ }
+
+ function f0_4_0_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_4_0_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_4_0_7() {
+ return isNaN(undefined);
+ }
+
+ function f0_4_0_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_4_0_9() {
+ return Math.random();
+ }
+
+ function f0_4_0_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_0_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_0() {
+ f0_4_0_0();
+ f0_4_0_1();
+ f0_4_0_2();
+ f0_4_0_3();
+ f0_4_0_4();
+ f0_4_0_5();
+ f0_4_0_6();
+ f0_4_0_7();
+ f0_4_0_8();
+ f0_4_0_9();
+ f0_4_0_10();
+ f0_4_0_11();
+ }
+
+ function f0_4_1_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_1_1() {
+ return Math.random();
+ }
+
+ function f0_4_1_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_4_1_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_1_4() {
+ return isNaN(undefined);
+ }
+
+ function f0_4_1_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_4_1_6() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_4_1_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_1_8() {
+ return isNaN(undefined);
+ }
+
+ function f0_4_1_9() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_1_10() {
+ return isNaN(undefined);
+ }
+
+ function f0_4_1_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_1() {
+ f0_4_1_0();
+ f0_4_1_1();
+ f0_4_1_2();
+ f0_4_1_3();
+ f0_4_1_4();
+ f0_4_1_5();
+ f0_4_1_6();
+ f0_4_1_7();
+ f0_4_1_8();
+ f0_4_1_9();
+ f0_4_1_10();
+ f0_4_1_11();
+ }
+
+ function f0_4_2_0() {
+ return Math.random();
+ }
+
+ function f0_4_2_1() {
+ return Math.random();
+ }
+
+ function f0_4_2_2() {
+ return isNaN(undefined);
+ }
+
+ function f0_4_2_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_4_2_4() {
+ return isNaN(undefined);
+ }
+
+ function f0_4_2_5() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_2_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_2_7() {
+ return Math.random();
+ }
+
+ function f0_4_2_8() {
+ return Math.random();
+ }
+
+ function f0_4_2_9() {
+ return isNaN(undefined);
+ }
+
+ function f0_4_2_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_4_2_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_4_2() {
+ f0_4_2_0();
+ f0_4_2_1();
+ f0_4_2_2();
+ f0_4_2_3();
+ f0_4_2_4();
+ f0_4_2_5();
+ f0_4_2_6();
+ f0_4_2_7();
+ f0_4_2_8();
+ f0_4_2_9();
+ f0_4_2_10();
+ f0_4_2_11();
+ }
+
+ function f0_4_3_0() {
+ return isNaN(undefined);
+ }
+
+ function f0_4_3_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_3_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_4_3_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_4_3_4() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_3_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_4_3_6() {
+ return Math.random();
+ }
+
+ function f0_4_3_7() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_4_3_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_3_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_4_3_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_4_3_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_3() {
+ f0_4_3_0();
+ f0_4_3_1();
+ f0_4_3_2();
+ f0_4_3_3();
+ f0_4_3_4();
+ f0_4_3_5();
+ f0_4_3_6();
+ f0_4_3_7();
+ f0_4_3_8();
+ f0_4_3_9();
+ f0_4_3_10();
+ f0_4_3_11();
+ }
+
+ function f0_4_4_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_4_4_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_4_4_2() {
+ return isNaN(undefined);
+ }
+
+ function f0_4_4_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_4_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_4_4_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_4_4_6() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_4_4_7() {
+ return Math.random();
+ }
+
+ function f0_4_4_8() {
+ return isNaN(undefined);
+ }
+
+ function f0_4_4_9() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_4_10() {
+ return isNaN(undefined);
+ }
+
+ function f0_4_4_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_4_4() {
+ f0_4_4_0();
+ f0_4_4_1();
+ f0_4_4_2();
+ f0_4_4_3();
+ f0_4_4_4();
+ f0_4_4_5();
+ f0_4_4_6();
+ f0_4_4_7();
+ f0_4_4_8();
+ f0_4_4_9();
+ f0_4_4_10();
+ f0_4_4_11();
+ }
+
+ function f0_4_5_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_4_5_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_5_2() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_5_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_4_5_4() {
+ return Math.random();
+ }
+
+ function f0_4_5_5() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_5_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_4_5_7() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_4_5_8() {
+ return Math.random();
+ }
+
+ function f0_4_5_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_4_5_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_5_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_5() {
+ f0_4_5_0();
+ f0_4_5_1();
+ f0_4_5_2();
+ f0_4_5_3();
+ f0_4_5_4();
+ f0_4_5_5();
+ f0_4_5_6();
+ f0_4_5_7();
+ f0_4_5_8();
+ f0_4_5_9();
+ f0_4_5_10();
+ f0_4_5_11();
+ }
+
+ function f0_4_6_0() {
+ return Math.random();
+ }
+
+ function f0_4_6_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_6_2() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_6_3() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_4_6_4() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_6_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_4_6_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_6_7() {
+ return Math.random();
+ }
+
+ function f0_4_6_8() {
+ return isNaN(undefined);
+ }
+
+ function f0_4_6_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_4_6_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_6_11() {
+ return Math.random();
+ }
+
+ function f0_4_6() {
+ f0_4_6_0();
+ f0_4_6_1();
+ f0_4_6_2();
+ f0_4_6_3();
+ f0_4_6_4();
+ f0_4_6_5();
+ f0_4_6_6();
+ f0_4_6_7();
+ f0_4_6_8();
+ f0_4_6_9();
+ f0_4_6_10();
+ f0_4_6_11();
+ }
+
+ function f0_4_7_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_7_1() {
+ return Math.random();
+ }
+
+ function f0_4_7_2() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_7_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_4_7_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_4_7_5() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_7_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_7_7() {
+ return isNaN(undefined);
+ }
+
+ function f0_4_7_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_7_9() {
+ return Math.random();
+ }
+
+ function f0_4_7_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_4_7_11() {
+ return isNaN(undefined);
+ }
+
+ function f0_4_7() {
+ f0_4_7_0();
+ f0_4_7_1();
+ f0_4_7_2();
+ f0_4_7_3();
+ f0_4_7_4();
+ f0_4_7_5();
+ f0_4_7_6();
+ f0_4_7_7();
+ f0_4_7_8();
+ f0_4_7_9();
+ f0_4_7_10();
+ f0_4_7_11();
+ }
+
+ function f0_4_8_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_4_8_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_8_2() {
+ return Math.random();
+ }
+
+ function f0_4_8_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_8_4() {
+ return Math.random();
+ }
+
+ function f0_4_8_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_4_8_6() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_4_8_7() {
+ return Math.random();
+ }
+
+ function f0_4_8_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_8_9() {
+ return isNaN(undefined);
+ }
+
+ function f0_4_8_10() {
+ return Math.random();
+ }
+
+ function f0_4_8_11() {
+ return isNaN(undefined);
+ }
+
+ function f0_4_8() {
+ f0_4_8_0();
+ f0_4_8_1();
+ f0_4_8_2();
+ f0_4_8_3();
+ f0_4_8_4();
+ f0_4_8_5();
+ f0_4_8_6();
+ f0_4_8_7();
+ f0_4_8_8();
+ f0_4_8_9();
+ f0_4_8_10();
+ f0_4_8_11();
+ }
+
+ function f0_4_9_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_9_1() {
+ return Math.random();
+ }
+
+ function f0_4_9_2() {
+ return Math.random();
+ }
+
+ function f0_4_9_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_9_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_4_9_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_4_9_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_4_9_7() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_4_9_8() {
+ return Math.random();
+ }
+
+ function f0_4_9_9() {
+ return Math.random();
+ }
+
+ function f0_4_9_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_9_11() {
+ return Math.random();
+ }
+
+ function f0_4_9() {
+ f0_4_9_0();
+ f0_4_9_1();
+ f0_4_9_2();
+ f0_4_9_3();
+ f0_4_9_4();
+ f0_4_9_5();
+ f0_4_9_6();
+ f0_4_9_7();
+ f0_4_9_8();
+ f0_4_9_9();
+ f0_4_9_10();
+ f0_4_9_11();
+ }
+
+ function f0_4_10_0() {
+ return isNaN(undefined);
+ }
+
+ function f0_4_10_1() {
+ return isNaN(undefined);
+ }
+
+ function f0_4_10_2() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_10_3() {
+ return Math.random();
+ }
+
+ function f0_4_10_4() {
+ return Math.random();
+ }
+
+ function f0_4_10_5() {
+ return Math.random();
+ }
+
+ function f0_4_10_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_4_10_7() {
+ return isNaN(undefined);
+ }
+
+ function f0_4_10_8() {
+ return Math.random();
+ }
+
+ function f0_4_10_9() {
+ return Math.random();
+ }
+
+ function f0_4_10_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_4_10_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_4_10() {
+ f0_4_10_0();
+ f0_4_10_1();
+ f0_4_10_2();
+ f0_4_10_3();
+ f0_4_10_4();
+ f0_4_10_5();
+ f0_4_10_6();
+ f0_4_10_7();
+ f0_4_10_8();
+ f0_4_10_9();
+ f0_4_10_10();
+ f0_4_10_11();
+ }
+
+ function f0_4_11_0() {
+ return isNaN(undefined);
+ }
+
+ function f0_4_11_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_11_2() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_11_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_4_11_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_4_11_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_4_11_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_4_11_7() {
+ return isNaN(undefined);
+ }
+
+ function f0_4_11_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_4_11_9() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_4_11_10() {
+ return isNaN(undefined);
+ }
+
+ function f0_4_11_11() {
+ return isNaN(undefined);
+ }
+
+ function f0_4_11() {
+ f0_4_11_0();
+ f0_4_11_1();
+ f0_4_11_2();
+ f0_4_11_3();
+ f0_4_11_4();
+ f0_4_11_5();
+ f0_4_11_6();
+ f0_4_11_7();
+ f0_4_11_8();
+ f0_4_11_9();
+ f0_4_11_10();
+ f0_4_11_11();
+ }
+
+ function f0_4() {
+ f0_4_0();
+ f0_4_1();
+ f0_4_2();
+ f0_4_3();
+ f0_4_4();
+ f0_4_5();
+ f0_4_6();
+ f0_4_7();
+ f0_4_8();
+ f0_4_9();
+ f0_4_10();
+ f0_4_11();
+ }
+
+ function f0_5_0_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_5_0_1() {
+ return Math.random();
+ }
+
+ function f0_5_0_2() {
+ return isNaN(undefined);
+ }
+
+ function f0_5_0_3() {
+ return Math.random();
+ }
+
+ function f0_5_0_4() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_5_0_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_5_0_6() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_0_7() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_0_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_5_0_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_0_10() {
+ return Math.random();
+ }
+
+ function f0_5_0_11() {
+ return isNaN(undefined);
+ }
+
+ function f0_5_0() {
+ f0_5_0_0();
+ f0_5_0_1();
+ f0_5_0_2();
+ f0_5_0_3();
+ f0_5_0_4();
+ f0_5_0_5();
+ f0_5_0_6();
+ f0_5_0_7();
+ f0_5_0_8();
+ f0_5_0_9();
+ f0_5_0_10();
+ f0_5_0_11();
+ }
+
+ function f0_5_1_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_5_1_1() {
+ return isNaN(undefined);
+ }
+
+ function f0_5_1_2() {
+ return Math.random();
+ }
+
+ function f0_5_1_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_5_1_4() {
+ return Math.random();
+ }
+
+ function f0_5_1_5() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_5_1_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_5_1_7() {
+ return isNaN(undefined);
+ }
+
+ function f0_5_1_8() {
+ return Math.random();
+ }
+
+ function f0_5_1_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_1_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_5_1_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_5_1() {
+ f0_5_1_0();
+ f0_5_1_1();
+ f0_5_1_2();
+ f0_5_1_3();
+ f0_5_1_4();
+ f0_5_1_5();
+ f0_5_1_6();
+ f0_5_1_7();
+ f0_5_1_8();
+ f0_5_1_9();
+ f0_5_1_10();
+ f0_5_1_11();
+ }
+
+ function f0_5_2_0() {
+ return isNaN(undefined);
+ }
+
+ function f0_5_2_1() {
+ return isNaN(undefined);
+ }
+
+ function f0_5_2_2() {
+ return Math.random();
+ }
+
+ function f0_5_2_3() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_2_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_2_5() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_5_2_6() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_2_7() {
+ return Math.random();
+ }
+
+ function f0_5_2_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_5_2_9() {
+ return isNaN(undefined);
+ }
+
+ function f0_5_2_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_2_11() {
+ return isNaN(undefined);
+ }
+
+ function f0_5_2() {
+ f0_5_2_0();
+ f0_5_2_1();
+ f0_5_2_2();
+ f0_5_2_3();
+ f0_5_2_4();
+ f0_5_2_5();
+ f0_5_2_6();
+ f0_5_2_7();
+ f0_5_2_8();
+ f0_5_2_9();
+ f0_5_2_10();
+ f0_5_2_11();
+ }
+
+ function f0_5_3_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_3_1() {
+ return isNaN(undefined);
+ }
+
+ function f0_5_3_2() {
+ return Math.random();
+ }
+
+ function f0_5_3_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_5_3_4() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_5_3_5() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_5_3_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_5_3_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_5_3_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_3_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_3_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_5_3_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_3() {
+ f0_5_3_0();
+ f0_5_3_1();
+ f0_5_3_2();
+ f0_5_3_3();
+ f0_5_3_4();
+ f0_5_3_5();
+ f0_5_3_6();
+ f0_5_3_7();
+ f0_5_3_8();
+ f0_5_3_9();
+ f0_5_3_10();
+ f0_5_3_11();
+ }
+
+ function f0_5_4_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_4_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_4_2() {
+ return Math.random();
+ }
+
+ function f0_5_4_3() {
+ return Math.random();
+ }
+
+ function f0_5_4_4() {
+ return Math.random();
+ }
+
+ function f0_5_4_5() {
+ return Math.random();
+ }
+
+ function f0_5_4_6() {
+ return Math.random();
+ }
+
+ function f0_5_4_7() {
+ return Math.random();
+ }
+
+ function f0_5_4_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_4_9() {
+ return Math.random();
+ }
+
+ function f0_5_4_10() {
+ return isNaN(undefined);
+ }
+
+ function f0_5_4_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_5_4() {
+ f0_5_4_0();
+ f0_5_4_1();
+ f0_5_4_2();
+ f0_5_4_3();
+ f0_5_4_4();
+ f0_5_4_5();
+ f0_5_4_6();
+ f0_5_4_7();
+ f0_5_4_8();
+ f0_5_4_9();
+ f0_5_4_10();
+ f0_5_4_11();
+ }
+
+ function f0_5_5_0() {
+ return isNaN(undefined);
+ }
+
+ function f0_5_5_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_5_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_5_3() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_5_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_5_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_5_5_6() {
+ return Math.random();
+ }
+
+ function f0_5_5_7() {
+ return Math.random();
+ }
+
+ function f0_5_5_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_5_9() {
+ return Math.random();
+ }
+
+ function f0_5_5_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_5_11() {
+ return Math.random();
+ }
+
+ function f0_5_5() {
+ f0_5_5_0();
+ f0_5_5_1();
+ f0_5_5_2();
+ f0_5_5_3();
+ f0_5_5_4();
+ f0_5_5_5();
+ f0_5_5_6();
+ f0_5_5_7();
+ f0_5_5_8();
+ f0_5_5_9();
+ f0_5_5_10();
+ f0_5_5_11();
+ }
+
+ function f0_5_6_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_6_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_6_2() {
+ return Math.random();
+ }
+
+ function f0_5_6_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_5_6_4() {
+ return Math.random();
+ }
+
+ function f0_5_6_5() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_5_6_6() {
+ return Math.random();
+ }
+
+ function f0_5_6_7() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_6_8() {
+ return isNaN(undefined);
+ }
+
+ function f0_5_6_9() {
+ return isNaN(undefined);
+ }
+
+ function f0_5_6_10() {
+ return Math.random();
+ }
+
+ function f0_5_6_11() {
+ return Math.random();
+ }
+
+ function f0_5_6() {
+ f0_5_6_0();
+ f0_5_6_1();
+ f0_5_6_2();
+ f0_5_6_3();
+ f0_5_6_4();
+ f0_5_6_5();
+ f0_5_6_6();
+ f0_5_6_7();
+ f0_5_6_8();
+ f0_5_6_9();
+ f0_5_6_10();
+ f0_5_6_11();
+ }
+
+ function f0_5_7_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_5_7_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_5_7_2() {
+ return Math.random();
+ }
+
+ function f0_5_7_3() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_7_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_7_5() {
+ return Math.random();
+ }
+
+ function f0_5_7_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_5_7_7() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_7_8() {
+ return Math.random();
+ }
+
+ function f0_5_7_9() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_5_7_10() {
+ return Math.random();
+ }
+
+ function f0_5_7_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_7() {
+ f0_5_7_0();
+ f0_5_7_1();
+ f0_5_7_2();
+ f0_5_7_3();
+ f0_5_7_4();
+ f0_5_7_5();
+ f0_5_7_6();
+ f0_5_7_7();
+ f0_5_7_8();
+ f0_5_7_9();
+ f0_5_7_10();
+ f0_5_7_11();
+ }
+
+ function f0_5_8_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_8_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_5_8_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_8_3() {
+ return Math.random();
+ }
+
+ function f0_5_8_4() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_5_8_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_8_6() {
+ return Math.random();
+ }
+
+ function f0_5_8_7() {
+ return Math.random();
+ }
+
+ function f0_5_8_8() {
+ return isNaN(undefined);
+ }
+
+ function f0_5_8_9() {
+ return Math.random();
+ }
+
+ function f0_5_8_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_8_11() {
+ return isNaN(undefined);
+ }
+
+ function f0_5_8() {
+ f0_5_8_0();
+ f0_5_8_1();
+ f0_5_8_2();
+ f0_5_8_3();
+ f0_5_8_4();
+ f0_5_8_5();
+ f0_5_8_6();
+ f0_5_8_7();
+ f0_5_8_8();
+ f0_5_8_9();
+ f0_5_8_10();
+ f0_5_8_11();
+ }
+
+ function f0_5_9_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_9_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_9_2() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_5_9_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_5_9_4() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_5_9_5() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_5_9_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_5_9_7() {
+ return Math.random();
+ }
+
+ function f0_5_9_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_5_9_9() {
+ return Math.random();
+ }
+
+ function f0_5_9_10() {
+ return Math.random();
+ }
+
+ function f0_5_9_11() {
+ return isNaN(undefined);
+ }
+
+ function f0_5_9() {
+ f0_5_9_0();
+ f0_5_9_1();
+ f0_5_9_2();
+ f0_5_9_3();
+ f0_5_9_4();
+ f0_5_9_5();
+ f0_5_9_6();
+ f0_5_9_7();
+ f0_5_9_8();
+ f0_5_9_9();
+ f0_5_9_10();
+ f0_5_9_11();
+ }
+
+ function f0_5_10_0() {
+ return isNaN(undefined);
+ }
+
+ function f0_5_10_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_10_2() {
+ return isNaN(undefined);
+ }
+
+ function f0_5_10_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_5_10_4() {
+ return Math.random();
+ }
+
+ function f0_5_10_5() {
+ return Math.random();
+ }
+
+ function f0_5_10_6() {
+ return Math.random();
+ }
+
+ function f0_5_10_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_5_10_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_10_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_10_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_5_10_11() {
+ return Math.random();
+ }
+
+ function f0_5_10() {
+ f0_5_10_0();
+ f0_5_10_1();
+ f0_5_10_2();
+ f0_5_10_3();
+ f0_5_10_4();
+ f0_5_10_5();
+ f0_5_10_6();
+ f0_5_10_7();
+ f0_5_10_8();
+ f0_5_10_9();
+ f0_5_10_10();
+ f0_5_10_11();
+ }
+
+ function f0_5_11_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_11_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_5_11_2() {
+ return Math.random();
+ }
+
+ function f0_5_11_3() {
+ return Math.random();
+ }
+
+ function f0_5_11_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_5_11_5() {
+ return Math.random();
+ }
+
+ function f0_5_11_6() {
+ return Math.random();
+ }
+
+ function f0_5_11_7() {
+ return isNaN(undefined);
+ }
+
+ function f0_5_11_8() {
+ return isNaN(undefined);
+ }
+
+ function f0_5_11_9() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_5_11_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_5_11_11() {
+ return isNaN(undefined);
+ }
+
+ function f0_5_11() {
+ f0_5_11_0();
+ f0_5_11_1();
+ f0_5_11_2();
+ f0_5_11_3();
+ f0_5_11_4();
+ f0_5_11_5();
+ f0_5_11_6();
+ f0_5_11_7();
+ f0_5_11_8();
+ f0_5_11_9();
+ f0_5_11_10();
+ f0_5_11_11();
+ }
+
+ function f0_5() {
+ f0_5_0();
+ f0_5_1();
+ f0_5_2();
+ f0_5_3();
+ f0_5_4();
+ f0_5_5();
+ f0_5_6();
+ f0_5_7();
+ f0_5_8();
+ f0_5_9();
+ f0_5_10();
+ f0_5_11();
+ }
+
+ function f0_6_0_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_6_0_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_6_0_2() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_0_3() {
+ return Math.random();
+ }
+
+ function f0_6_0_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_6_0_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_0_6() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_6_0_7() {
+ return Math.random();
+ }
+
+ function f0_6_0_8() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_0_9() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_0_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_0_11() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_0() {
+ f0_6_0_0();
+ f0_6_0_1();
+ f0_6_0_2();
+ f0_6_0_3();
+ f0_6_0_4();
+ f0_6_0_5();
+ f0_6_0_6();
+ f0_6_0_7();
+ f0_6_0_8();
+ f0_6_0_9();
+ f0_6_0_10();
+ f0_6_0_11();
+ }
+
+ function f0_6_1_0() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_1_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_1_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_6_1_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_1_4() {
+ return Math.random();
+ }
+
+ function f0_6_1_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_1_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_1_7() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_1_8() {
+ return Math.random();
+ }
+
+ function f0_6_1_9() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_1_10() {
+ return Math.random();
+ }
+
+ function f0_6_1_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_6_1() {
+ f0_6_1_0();
+ f0_6_1_1();
+ f0_6_1_2();
+ f0_6_1_3();
+ f0_6_1_4();
+ f0_6_1_5();
+ f0_6_1_6();
+ f0_6_1_7();
+ f0_6_1_8();
+ f0_6_1_9();
+ f0_6_1_10();
+ f0_6_1_11();
+ }
+
+ function f0_6_2_0() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_2_1() {
+ return Math.random();
+ }
+
+ function f0_6_2_2() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_2_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_2_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_6_2_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_6_2_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_2_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_2_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_6_2_9() {
+ return Math.random();
+ }
+
+ function f0_6_2_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_2_11() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_2() {
+ f0_6_2_0();
+ f0_6_2_1();
+ f0_6_2_2();
+ f0_6_2_3();
+ f0_6_2_4();
+ f0_6_2_5();
+ f0_6_2_6();
+ f0_6_2_7();
+ f0_6_2_8();
+ f0_6_2_9();
+ f0_6_2_10();
+ f0_6_2_11();
+ }
+
+ function f0_6_3_0() {
+ return Math.random();
+ }
+
+ function f0_6_3_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_6_3_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_6_3_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_3_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_6_3_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_6_3_6() {
+ return Math.random();
+ }
+
+ function f0_6_3_7() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_3_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_3_9() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_3_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_3_11() {
+ return Math.random();
+ }
+
+ function f0_6_3() {
+ f0_6_3_0();
+ f0_6_3_1();
+ f0_6_3_2();
+ f0_6_3_3();
+ f0_6_3_4();
+ f0_6_3_5();
+ f0_6_3_6();
+ f0_6_3_7();
+ f0_6_3_8();
+ f0_6_3_9();
+ f0_6_3_10();
+ f0_6_3_11();
+ }
+
+ function f0_6_4_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_4_1() {
+ return Math.random();
+ }
+
+ function f0_6_4_2() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_4_3() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_6_4_4() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_4_5() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_4_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_4_7() {
+ return Math.random();
+ }
+
+ function f0_6_4_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_6_4_9() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_4_10() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_4_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_4() {
+ f0_6_4_0();
+ f0_6_4_1();
+ f0_6_4_2();
+ f0_6_4_3();
+ f0_6_4_4();
+ f0_6_4_5();
+ f0_6_4_6();
+ f0_6_4_7();
+ f0_6_4_8();
+ f0_6_4_9();
+ f0_6_4_10();
+ f0_6_4_11();
+ }
+
+ function f0_6_5_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_6_5_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_6_5_2() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_5_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_5_4() {
+ return Math.random();
+ }
+
+ function f0_6_5_5() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_5_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_5_7() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_6_5_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_6_5_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_6_5_10() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_5_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_5() {
+ f0_6_5_0();
+ f0_6_5_1();
+ f0_6_5_2();
+ f0_6_5_3();
+ f0_6_5_4();
+ f0_6_5_5();
+ f0_6_5_6();
+ f0_6_5_7();
+ f0_6_5_8();
+ f0_6_5_9();
+ f0_6_5_10();
+ f0_6_5_11();
+ }
+
+ function f0_6_6_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_6_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_6_2() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_6_3() {
+ return Math.random();
+ }
+
+ function f0_6_6_4() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_6_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_6_6() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_6_6_7() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_6_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_6_9() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_6_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_6_11() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_6() {
+ f0_6_6_0();
+ f0_6_6_1();
+ f0_6_6_2();
+ f0_6_6_3();
+ f0_6_6_4();
+ f0_6_6_5();
+ f0_6_6_6();
+ f0_6_6_7();
+ f0_6_6_8();
+ f0_6_6_9();
+ f0_6_6_10();
+ f0_6_6_11();
+ }
+
+ function f0_6_7_0() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_7_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_6_7_2() {
+ return Math.random();
+ }
+
+ function f0_6_7_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_7_4() {
+ return Math.random();
+ }
+
+ function f0_6_7_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_7_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_7_7() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_6_7_8() {
+ return Math.random();
+ }
+
+ function f0_6_7_9() {
+ return Math.random();
+ }
+
+ function f0_6_7_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_7_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_7() {
+ f0_6_7_0();
+ f0_6_7_1();
+ f0_6_7_2();
+ f0_6_7_3();
+ f0_6_7_4();
+ f0_6_7_5();
+ f0_6_7_6();
+ f0_6_7_7();
+ f0_6_7_8();
+ f0_6_7_9();
+ f0_6_7_10();
+ f0_6_7_11();
+ }
+
+ function f0_6_8_0() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_8_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_6_8_2() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_8_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_8_4() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_8_5() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_8_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_8_7() {
+ return Math.random();
+ }
+
+ function f0_6_8_8() {
+ return Math.random();
+ }
+
+ function f0_6_8_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_6_8_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_8_11() {
+ return Math.random();
+ }
+
+ function f0_6_8() {
+ f0_6_8_0();
+ f0_6_8_1();
+ f0_6_8_2();
+ f0_6_8_3();
+ f0_6_8_4();
+ f0_6_8_5();
+ f0_6_8_6();
+ f0_6_8_7();
+ f0_6_8_8();
+ f0_6_8_9();
+ f0_6_8_10();
+ f0_6_8_11();
+ }
+
+ function f0_6_9_0() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_9_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_9_2() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_9_3() {
+ return Math.random();
+ }
+
+ function f0_6_9_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_6_9_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_6_9_6() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_6_9_7() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_6_9_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_9_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_6_9_10() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_9_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_6_9() {
+ f0_6_9_0();
+ f0_6_9_1();
+ f0_6_9_2();
+ f0_6_9_3();
+ f0_6_9_4();
+ f0_6_9_5();
+ f0_6_9_6();
+ f0_6_9_7();
+ f0_6_9_8();
+ f0_6_9_9();
+ f0_6_9_10();
+ f0_6_9_11();
+ }
+
+ function f0_6_10_0() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_10_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_6_10_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_6_10_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_10_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_6_10_5() {
+ return Math.random();
+ }
+
+ function f0_6_10_6() {
+ return Math.random();
+ }
+
+ function f0_6_10_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_10_8() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_10_9() {
+ return Math.random();
+ }
+
+ function f0_6_10_10() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_10_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_10() {
+ f0_6_10_0();
+ f0_6_10_1();
+ f0_6_10_2();
+ f0_6_10_3();
+ f0_6_10_4();
+ f0_6_10_5();
+ f0_6_10_6();
+ f0_6_10_7();
+ f0_6_10_8();
+ f0_6_10_9();
+ f0_6_10_10();
+ f0_6_10_11();
+ }
+
+ function f0_6_11_0() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_11_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_11_2() {
+ return Math.random();
+ }
+
+ function f0_6_11_3() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_6_11_4() {
+ return Math.random();
+ }
+
+ function f0_6_11_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_6_11_6() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_6_11_7() {
+ return Math.random();
+ }
+
+ function f0_6_11_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_11_9() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_11_10() {
+ return Math.random();
+ }
+
+ function f0_6_11_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_6_11() {
+ f0_6_11_0();
+ f0_6_11_1();
+ f0_6_11_2();
+ f0_6_11_3();
+ f0_6_11_4();
+ f0_6_11_5();
+ f0_6_11_6();
+ f0_6_11_7();
+ f0_6_11_8();
+ f0_6_11_9();
+ f0_6_11_10();
+ f0_6_11_11();
+ }
+
+ function f0_6() {
+ f0_6_0();
+ f0_6_1();
+ f0_6_2();
+ f0_6_3();
+ f0_6_4();
+ f0_6_5();
+ f0_6_6();
+ f0_6_7();
+ f0_6_8();
+ f0_6_9();
+ f0_6_10();
+ f0_6_11();
+ }
+
+ function f0_7_0_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_7_0_1() {
+ return Math.random();
+ }
+
+ function f0_7_0_2() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_7_0_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_0_4() {
+ return Math.random();
+ }
+
+ function f0_7_0_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_0_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_0_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_7_0_8() {
+ return Math.random();
+ }
+
+ function f0_7_0_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_0_10() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_0_11() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_0() {
+ f0_7_0_0();
+ f0_7_0_1();
+ f0_7_0_2();
+ f0_7_0_3();
+ f0_7_0_4();
+ f0_7_0_5();
+ f0_7_0_6();
+ f0_7_0_7();
+ f0_7_0_8();
+ f0_7_0_9();
+ f0_7_0_10();
+ f0_7_0_11();
+ }
+
+ function f0_7_1_0() {
+ return Math.random();
+ }
+
+ function f0_7_1_1() {
+ return Math.random();
+ }
+
+ function f0_7_1_2() {
+ return Math.random();
+ }
+
+ function f0_7_1_3() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_1_4() {
+ return Math.random();
+ }
+
+ function f0_7_1_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_1_6() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_1_7() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_1_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_1_9() {
+ return Math.random();
+ }
+
+ function f0_7_1_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_7_1_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_1() {
+ f0_7_1_0();
+ f0_7_1_1();
+ f0_7_1_2();
+ f0_7_1_3();
+ f0_7_1_4();
+ f0_7_1_5();
+ f0_7_1_6();
+ f0_7_1_7();
+ f0_7_1_8();
+ f0_7_1_9();
+ f0_7_1_10();
+ f0_7_1_11();
+ }
+
+ function f0_7_2_0() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_2_1() {
+ return Math.random();
+ }
+
+ function f0_7_2_2() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_2_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_7_2_4() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_2_5() {
+ return Math.random();
+ }
+
+ function f0_7_2_6() {
+ return Math.random();
+ }
+
+ function f0_7_2_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_7_2_8() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_2_9() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_2_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_2_11() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_2() {
+ f0_7_2_0();
+ f0_7_2_1();
+ f0_7_2_2();
+ f0_7_2_3();
+ f0_7_2_4();
+ f0_7_2_5();
+ f0_7_2_6();
+ f0_7_2_7();
+ f0_7_2_8();
+ f0_7_2_9();
+ f0_7_2_10();
+ f0_7_2_11();
+ }
+
+ function f0_7_3_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_3_1() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_3_2() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_3_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_7_3_4() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_7_3_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_3_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_3_7() {
+ return Math.random();
+ }
+
+ function f0_7_3_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_7_3_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_3_10() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_3_11() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_3() {
+ f0_7_3_0();
+ f0_7_3_1();
+ f0_7_3_2();
+ f0_7_3_3();
+ f0_7_3_4();
+ f0_7_3_5();
+ f0_7_3_6();
+ f0_7_3_7();
+ f0_7_3_8();
+ f0_7_3_9();
+ f0_7_3_10();
+ f0_7_3_11();
+ }
+
+ function f0_7_4_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_7_4_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_7_4_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_4_3() {
+ return Math.random();
+ }
+
+ function f0_7_4_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_4_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_4_6() {
+ return Math.random();
+ }
+
+ function f0_7_4_7() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_4_8() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_4_9() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_7_4_10() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_4_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_4() {
+ f0_7_4_0();
+ f0_7_4_1();
+ f0_7_4_2();
+ f0_7_4_3();
+ f0_7_4_4();
+ f0_7_4_5();
+ f0_7_4_6();
+ f0_7_4_7();
+ f0_7_4_8();
+ f0_7_4_9();
+ f0_7_4_10();
+ f0_7_4_11();
+ }
+
+ function f0_7_5_0() {
+ return Math.random();
+ }
+
+ function f0_7_5_1() {
+ return Math.random();
+ }
+
+ function f0_7_5_2() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_5_3() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_5_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_5_5() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_7_5_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_5_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_7_5_8() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_5_9() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_5_10() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_5_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_5() {
+ f0_7_5_0();
+ f0_7_5_1();
+ f0_7_5_2();
+ f0_7_5_3();
+ f0_7_5_4();
+ f0_7_5_5();
+ f0_7_5_6();
+ f0_7_5_7();
+ f0_7_5_8();
+ f0_7_5_9();
+ f0_7_5_10();
+ f0_7_5_11();
+ }
+
+ function f0_7_6_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_7_6_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_7_6_2() {
+ return Math.random();
+ }
+
+ function f0_7_6_3() {
+ return Math.random();
+ }
+
+ function f0_7_6_4() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_6_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_6_6() {
+ return Math.random();
+ }
+
+ function f0_7_6_7() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_6_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_6_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_6_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_6_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_6() {
+ f0_7_6_0();
+ f0_7_6_1();
+ f0_7_6_2();
+ f0_7_6_3();
+ f0_7_6_4();
+ f0_7_6_5();
+ f0_7_6_6();
+ f0_7_6_7();
+ f0_7_6_8();
+ f0_7_6_9();
+ f0_7_6_10();
+ f0_7_6_11();
+ }
+
+ function f0_7_7_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_7_7_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_7_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_7_3() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_7_4() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_7_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_7_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_7_7_7() {
+ return Math.random();
+ }
+
+ function f0_7_7_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_7_7_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_7_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_7_11() {
+ return Math.random();
+ }
+
+ function f0_7_7() {
+ f0_7_7_0();
+ f0_7_7_1();
+ f0_7_7_2();
+ f0_7_7_3();
+ f0_7_7_4();
+ f0_7_7_5();
+ f0_7_7_6();
+ f0_7_7_7();
+ f0_7_7_8();
+ f0_7_7_9();
+ f0_7_7_10();
+ f0_7_7_11();
+ }
+
+ function f0_7_8_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_8_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_7_8_2() {
+ return Math.random();
+ }
+
+ function f0_7_8_3() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_8_4() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_8_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_8_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_7_8_7() {
+ return Math.random();
+ }
+
+ function f0_7_8_8() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_8_9() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_8_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_8_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_7_8() {
+ f0_7_8_0();
+ f0_7_8_1();
+ f0_7_8_2();
+ f0_7_8_3();
+ f0_7_8_4();
+ f0_7_8_5();
+ f0_7_8_6();
+ f0_7_8_7();
+ f0_7_8_8();
+ f0_7_8_9();
+ f0_7_8_10();
+ f0_7_8_11();
+ }
+
+ function f0_7_9_0() {
+ return Math.random();
+ }
+
+ function f0_7_9_1() {
+ return Math.random();
+ }
+
+ function f0_7_9_2() {
+ return Math.random();
+ }
+
+ function f0_7_9_3() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_9_4() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_7_9_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_9_6() {
+ return Math.random();
+ }
+
+ function f0_7_9_7() {
+ return Math.random();
+ }
+
+ function f0_7_9_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_7_9_9() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_9_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_7_9_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_7_9() {
+ f0_7_9_0();
+ f0_7_9_1();
+ f0_7_9_2();
+ f0_7_9_3();
+ f0_7_9_4();
+ f0_7_9_5();
+ f0_7_9_6();
+ f0_7_9_7();
+ f0_7_9_8();
+ f0_7_9_9();
+ f0_7_9_10();
+ f0_7_9_11();
+ }
+
+ function f0_7_10_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_7_10_1() {
+ return Math.random();
+ }
+
+ function f0_7_10_2() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_7_10_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_7_10_4() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_10_5() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_7_10_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_10_7() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_10_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_10_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_10_10() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_10_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_7_10() {
+ f0_7_10_0();
+ f0_7_10_1();
+ f0_7_10_2();
+ f0_7_10_3();
+ f0_7_10_4();
+ f0_7_10_5();
+ f0_7_10_6();
+ f0_7_10_7();
+ f0_7_10_8();
+ f0_7_10_9();
+ f0_7_10_10();
+ f0_7_10_11();
+ }
+
+ function f0_7_11_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_7_11_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_7_11_2() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_11_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_11_4() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_7_11_5() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_7_11_6() {
+ return Math.random();
+ }
+
+ function f0_7_11_7() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_11_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_11_9() {
+ return isNaN(undefined);
+ }
+
+ function f0_7_11_10() {
+ return Math.random();
+ }
+
+ function f0_7_11_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_7_11() {
+ f0_7_11_0();
+ f0_7_11_1();
+ f0_7_11_2();
+ f0_7_11_3();
+ f0_7_11_4();
+ f0_7_11_5();
+ f0_7_11_6();
+ f0_7_11_7();
+ f0_7_11_8();
+ f0_7_11_9();
+ f0_7_11_10();
+ f0_7_11_11();
+ }
+
+ function f0_7() {
+ f0_7_0();
+ f0_7_1();
+ f0_7_2();
+ f0_7_3();
+ f0_7_4();
+ f0_7_5();
+ f0_7_6();
+ f0_7_7();
+ f0_7_8();
+ f0_7_9();
+ f0_7_10();
+ f0_7_11();
+ }
+
+ function f0_8_0_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_8_0_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_8_0_2() {
+ return Math.random();
+ }
+
+ function f0_8_0_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_8_0_4() {
+ return Math.random();
+ }
+
+ function f0_8_0_5() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_8_0_6() {
+ return Math.random();
+ }
+
+ function f0_8_0_7() {
+ return Math.random();
+ }
+
+ function f0_8_0_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_8_0_9() {
+ return Math.random();
+ }
+
+ function f0_8_0_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_8_0_11() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_0() {
+ f0_8_0_0();
+ f0_8_0_1();
+ f0_8_0_2();
+ f0_8_0_3();
+ f0_8_0_4();
+ f0_8_0_5();
+ f0_8_0_6();
+ f0_8_0_7();
+ f0_8_0_8();
+ f0_8_0_9();
+ f0_8_0_10();
+ f0_8_0_11();
+ }
+
+ function f0_8_1_0() {
+ return Math.random();
+ }
+
+ function f0_8_1_1() {
+ return Math.random();
+ }
+
+ function f0_8_1_2() {
+ return Math.random();
+ }
+
+ function f0_8_1_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_1_4() {
+ return Math.random();
+ }
+
+ function f0_8_1_5() {
+ return Math.random();
+ }
+
+ function f0_8_1_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_1_7() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_8_1_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_8_1_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_8_1_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_8_1_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_8_1() {
+ f0_8_1_0();
+ f0_8_1_1();
+ f0_8_1_2();
+ f0_8_1_3();
+ f0_8_1_4();
+ f0_8_1_5();
+ f0_8_1_6();
+ f0_8_1_7();
+ f0_8_1_8();
+ f0_8_1_9();
+ f0_8_1_10();
+ f0_8_1_11();
+ }
+
+ function f0_8_2_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_8_2_1() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_2_2() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_2_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_8_2_4() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_8_2_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_2_6() {
+ return Math.random();
+ }
+
+ function f0_8_2_7() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_2_8() {
+ return Math.random();
+ }
+
+ function f0_8_2_9() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_2_10() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_2_11() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_2() {
+ f0_8_2_0();
+ f0_8_2_1();
+ f0_8_2_2();
+ f0_8_2_3();
+ f0_8_2_4();
+ f0_8_2_5();
+ f0_8_2_6();
+ f0_8_2_7();
+ f0_8_2_8();
+ f0_8_2_9();
+ f0_8_2_10();
+ f0_8_2_11();
+ }
+
+ function f0_8_3_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_8_3_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_8_3_2() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_3_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_3_4() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_8_3_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_8_3_6() {
+ return Math.random();
+ }
+
+ function f0_8_3_7() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_3_8() {
+ return Math.random();
+ }
+
+ function f0_8_3_9() {
+ return Math.random();
+ }
+
+ function f0_8_3_10() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_3_11() {
+ return Math.random();
+ }
+
+ function f0_8_3() {
+ f0_8_3_0();
+ f0_8_3_1();
+ f0_8_3_2();
+ f0_8_3_3();
+ f0_8_3_4();
+ f0_8_3_5();
+ f0_8_3_6();
+ f0_8_3_7();
+ f0_8_3_8();
+ f0_8_3_9();
+ f0_8_3_10();
+ f0_8_3_11();
+ }
+
+ function f0_8_4_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_8_4_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_8_4_2() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_8_4_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_8_4_4() {
+ return Math.random();
+ }
+
+ function f0_8_4_5() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_8_4_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_4_7() {
+ return Math.random();
+ }
+
+ function f0_8_4_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_8_4_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_8_4_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_8_4_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_8_4() {
+ f0_8_4_0();
+ f0_8_4_1();
+ f0_8_4_2();
+ f0_8_4_3();
+ f0_8_4_4();
+ f0_8_4_5();
+ f0_8_4_6();
+ f0_8_4_7();
+ f0_8_4_8();
+ f0_8_4_9();
+ f0_8_4_10();
+ f0_8_4_11();
+ }
+
+ function f0_8_5_0() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_5_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_8_5_2() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_5_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_5_4() {
+ return Math.random();
+ }
+
+ function f0_8_5_5() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_8_5_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_8_5_7() {
+ return Math.random();
+ }
+
+ function f0_8_5_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_8_5_9() {
+ return Math.random();
+ }
+
+ function f0_8_5_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_8_5_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_8_5() {
+ f0_8_5_0();
+ f0_8_5_1();
+ f0_8_5_2();
+ f0_8_5_3();
+ f0_8_5_4();
+ f0_8_5_5();
+ f0_8_5_6();
+ f0_8_5_7();
+ f0_8_5_8();
+ f0_8_5_9();
+ f0_8_5_10();
+ f0_8_5_11();
+ }
+
+ function f0_8_6_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_8_6_1() {
+ return Math.random();
+ }
+
+ function f0_8_6_2() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_6_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_8_6_4() {
+ return Math.random();
+ }
+
+ function f0_8_6_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_8_6_6() {
+ return Math.random();
+ }
+
+ function f0_8_6_7() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_8_6_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_8_6_9() {
+ return Math.random();
+ }
+
+ function f0_8_6_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_8_6_11() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_6() {
+ f0_8_6_0();
+ f0_8_6_1();
+ f0_8_6_2();
+ f0_8_6_3();
+ f0_8_6_4();
+ f0_8_6_5();
+ f0_8_6_6();
+ f0_8_6_7();
+ f0_8_6_8();
+ f0_8_6_9();
+ f0_8_6_10();
+ f0_8_6_11();
+ }
+
+ function f0_8_7_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_8_7_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_8_7_2() {
+ return Math.random();
+ }
+
+ function f0_8_7_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_7_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_8_7_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_8_7_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_8_7_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_8_7_8() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_7_9() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_7_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_8_7_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_8_7() {
+ f0_8_7_0();
+ f0_8_7_1();
+ f0_8_7_2();
+ f0_8_7_3();
+ f0_8_7_4();
+ f0_8_7_5();
+ f0_8_7_6();
+ f0_8_7_7();
+ f0_8_7_8();
+ f0_8_7_9();
+ f0_8_7_10();
+ f0_8_7_11();
+ }
+
+ function f0_8_8_0() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_8_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_8_8_2() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_8_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_8_8_4() {
+ return Math.random();
+ }
+
+ function f0_8_8_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_8_6() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_8_8_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_8_8_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_8_8_9() {
+ return Math.random();
+ }
+
+ function f0_8_8_10() {
+ return Math.random();
+ }
+
+ function f0_8_8_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_8_8() {
+ f0_8_8_0();
+ f0_8_8_1();
+ f0_8_8_2();
+ f0_8_8_3();
+ f0_8_8_4();
+ f0_8_8_5();
+ f0_8_8_6();
+ f0_8_8_7();
+ f0_8_8_8();
+ f0_8_8_9();
+ f0_8_8_10();
+ f0_8_8_11();
+ }
+
+ function f0_8_9_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_8_9_1() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_9_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_8_9_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_9_4() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_9_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_8_9_6() {
+ return Math.random();
+ }
+
+ function f0_8_9_7() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_9_8() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_9_9() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_9_10() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_9_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_8_9() {
+ f0_8_9_0();
+ f0_8_9_1();
+ f0_8_9_2();
+ f0_8_9_3();
+ f0_8_9_4();
+ f0_8_9_5();
+ f0_8_9_6();
+ f0_8_9_7();
+ f0_8_9_8();
+ f0_8_9_9();
+ f0_8_9_10();
+ f0_8_9_11();
+ }
+
+ function f0_8_10_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_8_10_1() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_10_2() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_10_3() {
+ return Math.random();
+ }
+
+ function f0_8_10_4() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_10_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_8_10_6() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_8_10_7() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_8_10_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_8_10_9() {
+ return Math.random();
+ }
+
+ function f0_8_10_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_8_10_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_8_10() {
+ f0_8_10_0();
+ f0_8_10_1();
+ f0_8_10_2();
+ f0_8_10_3();
+ f0_8_10_4();
+ f0_8_10_5();
+ f0_8_10_6();
+ f0_8_10_7();
+ f0_8_10_8();
+ f0_8_10_9();
+ f0_8_10_10();
+ f0_8_10_11();
+ }
+
+ function f0_8_11_0() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_11_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_8_11_2() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_8_11_3() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_8_11_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_8_11_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_11_6() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_8_11_7() {
+ return Math.random();
+ }
+
+ function f0_8_11_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_8_11_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_8_11_10() {
+ return Math.random();
+ }
+
+ function f0_8_11_11() {
+ return isNaN(undefined);
+ }
+
+ function f0_8_11() {
+ f0_8_11_0();
+ f0_8_11_1();
+ f0_8_11_2();
+ f0_8_11_3();
+ f0_8_11_4();
+ f0_8_11_5();
+ f0_8_11_6();
+ f0_8_11_7();
+ f0_8_11_8();
+ f0_8_11_9();
+ f0_8_11_10();
+ f0_8_11_11();
+ }
+
+ function f0_8() {
+ f0_8_0();
+ f0_8_1();
+ f0_8_2();
+ f0_8_3();
+ f0_8_4();
+ f0_8_5();
+ f0_8_6();
+ f0_8_7();
+ f0_8_8();
+ f0_8_9();
+ f0_8_10();
+ f0_8_11();
+ }
+
+ function f0_9_0_0() {
+ return Math.random();
+ }
+
+ function f0_9_0_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_0_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_9_0_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_0_4() {
+ return Math.random();
+ }
+
+ function f0_9_0_5() {
+ return Math.random();
+ }
+
+ function f0_9_0_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_0_7() {
+ return Math.random();
+ }
+
+ function f0_9_0_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_0_9() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_0_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_9_0_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_9_0() {
+ f0_9_0_0();
+ f0_9_0_1();
+ f0_9_0_2();
+ f0_9_0_3();
+ f0_9_0_4();
+ f0_9_0_5();
+ f0_9_0_6();
+ f0_9_0_7();
+ f0_9_0_8();
+ f0_9_0_9();
+ f0_9_0_10();
+ f0_9_0_11();
+ }
+
+ function f0_9_1_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_9_1_1() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_1_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_9_1_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_1_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_9_1_5() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_1_6() {
+ return Math.random();
+ }
+
+ function f0_9_1_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_1_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_9_1_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_9_1_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_1_11() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_1() {
+ f0_9_1_0();
+ f0_9_1_1();
+ f0_9_1_2();
+ f0_9_1_3();
+ f0_9_1_4();
+ f0_9_1_5();
+ f0_9_1_6();
+ f0_9_1_7();
+ f0_9_1_8();
+ f0_9_1_9();
+ f0_9_1_10();
+ f0_9_1_11();
+ }
+
+ function f0_9_2_0() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_2_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_9_2_2() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_2_3() {
+ return Math.random();
+ }
+
+ function f0_9_2_4() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_2_5() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_2_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_2_7() {
+ return Math.random();
+ }
+
+ function f0_9_2_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_9_2_9() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_2_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_2_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_9_2() {
+ f0_9_2_0();
+ f0_9_2_1();
+ f0_9_2_2();
+ f0_9_2_3();
+ f0_9_2_4();
+ f0_9_2_5();
+ f0_9_2_6();
+ f0_9_2_7();
+ f0_9_2_8();
+ f0_9_2_9();
+ f0_9_2_10();
+ f0_9_2_11();
+ }
+
+ function f0_9_3_0() {
+ return Math.random();
+ }
+
+ function f0_9_3_1() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_3_2() {
+ return Math.random();
+ }
+
+ function f0_9_3_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_3_4() {
+ return Math.random();
+ }
+
+ function f0_9_3_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_9_3_6() {
+ return Math.random();
+ }
+
+ function f0_9_3_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_3_8() {
+ return Math.random();
+ }
+
+ function f0_9_3_9() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_3_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_9_3_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_3() {
+ f0_9_3_0();
+ f0_9_3_1();
+ f0_9_3_2();
+ f0_9_3_3();
+ f0_9_3_4();
+ f0_9_3_5();
+ f0_9_3_6();
+ f0_9_3_7();
+ f0_9_3_8();
+ f0_9_3_9();
+ f0_9_3_10();
+ f0_9_3_11();
+ }
+
+ function f0_9_4_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_4_1() {
+ return Math.random();
+ }
+
+ function f0_9_4_2() {
+ return Math.random();
+ }
+
+ function f0_9_4_3() {
+ return Math.random();
+ }
+
+ function f0_9_4_4() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_4_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_4_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_4_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_4_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_4_9() {
+ return Math.random();
+ }
+
+ function f0_9_4_10() {
+ return Math.random();
+ }
+
+ function f0_9_4_11() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_4() {
+ f0_9_4_0();
+ f0_9_4_1();
+ f0_9_4_2();
+ f0_9_4_3();
+ f0_9_4_4();
+ f0_9_4_5();
+ f0_9_4_6();
+ f0_9_4_7();
+ f0_9_4_8();
+ f0_9_4_9();
+ f0_9_4_10();
+ f0_9_4_11();
+ }
+
+ function f0_9_5_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_5_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_5_2() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_5_3() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_9_5_4() {
+ return Math.random();
+ }
+
+ function f0_9_5_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_9_5_6() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_9_5_7() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_5_8() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_5_9() {
+ return Math.random();
+ }
+
+ function f0_9_5_10() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_5_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_5() {
+ f0_9_5_0();
+ f0_9_5_1();
+ f0_9_5_2();
+ f0_9_5_3();
+ f0_9_5_4();
+ f0_9_5_5();
+ f0_9_5_6();
+ f0_9_5_7();
+ f0_9_5_8();
+ f0_9_5_9();
+ f0_9_5_10();
+ f0_9_5_11();
+ }
+
+ function f0_9_6_0() {
+ return Math.random();
+ }
+
+ function f0_9_6_1() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_6_2() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_6_3() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_9_6_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_9_6_5() {
+ return Math.random();
+ }
+
+ function f0_9_6_6() {
+ return Math.random();
+ }
+
+ function f0_9_6_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_6_8() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_6_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_9_6_10() {
+ return Math.random();
+ }
+
+ function f0_9_6_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_6() {
+ f0_9_6_0();
+ f0_9_6_1();
+ f0_9_6_2();
+ f0_9_6_3();
+ f0_9_6_4();
+ f0_9_6_5();
+ f0_9_6_6();
+ f0_9_6_7();
+ f0_9_6_8();
+ f0_9_6_9();
+ f0_9_6_10();
+ f0_9_6_11();
+ }
+
+ function f0_9_7_0() {
+ return Math.random();
+ }
+
+ function f0_9_7_1() {
+ return Math.random();
+ }
+
+ function f0_9_7_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_9_7_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_7_4() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_7_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_7_6() {
+ return Math.random();
+ }
+
+ function f0_9_7_7() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_7_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_7_9() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_7_10() {
+ return Math.random();
+ }
+
+ function f0_9_7_11() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_7() {
+ f0_9_7_0();
+ f0_9_7_1();
+ f0_9_7_2();
+ f0_9_7_3();
+ f0_9_7_4();
+ f0_9_7_5();
+ f0_9_7_6();
+ f0_9_7_7();
+ f0_9_7_8();
+ f0_9_7_9();
+ f0_9_7_10();
+ f0_9_7_11();
+ }
+
+ function f0_9_8_0() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_8_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_8_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_9_8_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_8_4() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_8_5() {
+ return Math.random();
+ }
+
+ function f0_9_8_6() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_9_8_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_8_8() {
+ return Math.random();
+ }
+
+ function f0_9_8_9() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_8_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_8_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_8() {
+ f0_9_8_0();
+ f0_9_8_1();
+ f0_9_8_2();
+ f0_9_8_3();
+ f0_9_8_4();
+ f0_9_8_5();
+ f0_9_8_6();
+ f0_9_8_7();
+ f0_9_8_8();
+ f0_9_8_9();
+ f0_9_8_10();
+ f0_9_8_11();
+ }
+
+ function f0_9_9_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_9_1() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_9_2() {
+ return Math.random();
+ }
+
+ function f0_9_9_3() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_9_9_4() {
+ return Math.random();
+ }
+
+ function f0_9_9_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_9_6() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_9_9_7() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_9_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_9_9() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_9_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_9_9_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_9_9() {
+ f0_9_9_0();
+ f0_9_9_1();
+ f0_9_9_2();
+ f0_9_9_3();
+ f0_9_9_4();
+ f0_9_9_5();
+ f0_9_9_6();
+ f0_9_9_7();
+ f0_9_9_8();
+ f0_9_9_9();
+ f0_9_9_10();
+ f0_9_9_11();
+ }
+
+ function f0_9_10_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_10_1() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_10_2() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_10_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_10_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_9_10_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_10_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_10_7() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_10_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_9_10_9() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_10_10() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_10_11() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_10() {
+ f0_9_10_0();
+ f0_9_10_1();
+ f0_9_10_2();
+ f0_9_10_3();
+ f0_9_10_4();
+ f0_9_10_5();
+ f0_9_10_6();
+ f0_9_10_7();
+ f0_9_10_8();
+ f0_9_10_9();
+ f0_9_10_10();
+ f0_9_10_11();
+ }
+
+ function f0_9_11_0() {
+ return Math.random();
+ }
+
+ function f0_9_11_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_9_11_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_9_11_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_11_4() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_11_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_9_11_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_11_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_11_8() {
+ return Math.random();
+ }
+
+ function f0_9_11_9() {
+ return Math.random();
+ }
+
+ function f0_9_11_10() {
+ return isNaN(undefined);
+ }
+
+ function f0_9_11_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_9_11() {
+ f0_9_11_0();
+ f0_9_11_1();
+ f0_9_11_2();
+ f0_9_11_3();
+ f0_9_11_4();
+ f0_9_11_5();
+ f0_9_11_6();
+ f0_9_11_7();
+ f0_9_11_8();
+ f0_9_11_9();
+ f0_9_11_10();
+ f0_9_11_11();
+ }
+
+ function f0_9() {
+ f0_9_0();
+ f0_9_1();
+ f0_9_2();
+ f0_9_3();
+ f0_9_4();
+ f0_9_5();
+ f0_9_6();
+ f0_9_7();
+ f0_9_8();
+ f0_9_9();
+ f0_9_10();
+ f0_9_11();
+ }
+
+ function f0_10_0_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_0_1() {
+ return isNaN(undefined);
+ }
+
+ function f0_10_0_2() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_10_0_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_10_0_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_0_5() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_10_0_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_10_0_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_10_0_8() {
+ return Math.random();
+ }
+
+ function f0_10_0_9() {
+ return isNaN(undefined);
+ }
+
+ function f0_10_0_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_0_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_10_0() {
+ f0_10_0_0();
+ f0_10_0_1();
+ f0_10_0_2();
+ f0_10_0_3();
+ f0_10_0_4();
+ f0_10_0_5();
+ f0_10_0_6();
+ f0_10_0_7();
+ f0_10_0_8();
+ f0_10_0_9();
+ f0_10_0_10();
+ f0_10_0_11();
+ }
+
+ function f0_10_1_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_1_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_10_1_2() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_10_1_3() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_1_4() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_10_1_5() {
+ return Math.random();
+ }
+
+ function f0_10_1_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_10_1_7() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_1_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_1_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_1_10() {
+ return Math.random();
+ }
+
+ function f0_10_1_11() {
+ return isNaN(undefined);
+ }
+
+ function f0_10_1() {
+ f0_10_1_0();
+ f0_10_1_1();
+ f0_10_1_2();
+ f0_10_1_3();
+ f0_10_1_4();
+ f0_10_1_5();
+ f0_10_1_6();
+ f0_10_1_7();
+ f0_10_1_8();
+ f0_10_1_9();
+ f0_10_1_10();
+ f0_10_1_11();
+ }
+
+ function f0_10_2_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_2_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_2_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_2_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_10_2_4() {
+ return Math.random();
+ }
+
+ function f0_10_2_5() {
+ return Math.random();
+ }
+
+ function f0_10_2_6() {
+ return Math.random();
+ }
+
+ function f0_10_2_7() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_2_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_10_2_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_2_10() {
+ return Math.random();
+ }
+
+ function f0_10_2_11() {
+ return isNaN(undefined);
+ }
+
+ function f0_10_2() {
+ f0_10_2_0();
+ f0_10_2_1();
+ f0_10_2_2();
+ f0_10_2_3();
+ f0_10_2_4();
+ f0_10_2_5();
+ f0_10_2_6();
+ f0_10_2_7();
+ f0_10_2_8();
+ f0_10_2_9();
+ f0_10_2_10();
+ f0_10_2_11();
+ }
+
+ function f0_10_3_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_3_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_10_3_2() {
+ return isNaN(undefined);
+ }
+
+ function f0_10_3_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_10_3_4() {
+ return isNaN(undefined);
+ }
+
+ function f0_10_3_5() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_10_3_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_10_3_7() {
+ return Math.random();
+ }
+
+ function f0_10_3_8() {
+ return isNaN(undefined);
+ }
+
+ function f0_10_3_9() {
+ return isNaN(undefined);
+ }
+
+ function f0_10_3_10() {
+ return Math.random();
+ }
+
+ function f0_10_3_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_3() {
+ f0_10_3_0();
+ f0_10_3_1();
+ f0_10_3_2();
+ f0_10_3_3();
+ f0_10_3_4();
+ f0_10_3_5();
+ f0_10_3_6();
+ f0_10_3_7();
+ f0_10_3_8();
+ f0_10_3_9();
+ f0_10_3_10();
+ f0_10_3_11();
+ }
+
+ function f0_10_4_0() {
+ return Math.random();
+ }
+
+ function f0_10_4_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_4_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_4_3() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_4_4() {
+ return isNaN(undefined);
+ }
+
+ function f0_10_4_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_4_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_10_4_7() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_4_8() {
+ return isNaN(undefined);
+ }
+
+ function f0_10_4_9() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_10_4_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_4_11() {
+ return Math.random();
+ }
+
+ function f0_10_4() {
+ f0_10_4_0();
+ f0_10_4_1();
+ f0_10_4_2();
+ f0_10_4_3();
+ f0_10_4_4();
+ f0_10_4_5();
+ f0_10_4_6();
+ f0_10_4_7();
+ f0_10_4_8();
+ f0_10_4_9();
+ f0_10_4_10();
+ f0_10_4_11();
+ }
+
+ function f0_10_5_0() {
+ return Math.random();
+ }
+
+ function f0_10_5_1() {
+ return Math.random();
+ }
+
+ function f0_10_5_2() {
+ return isNaN(undefined);
+ }
+
+ function f0_10_5_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_10_5_4() {
+ return isNaN(undefined);
+ }
+
+ function f0_10_5_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_5_6() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_5_7() {
+ return isNaN(undefined);
+ }
+
+ function f0_10_5_8() {
+ return isNaN(undefined);
+ }
+
+ function f0_10_5_9() {
+ return Math.random();
+ }
+
+ function f0_10_5_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_5_11() {
+ return Math.random();
+ }
+
+ function f0_10_5() {
+ f0_10_5_0();
+ f0_10_5_1();
+ f0_10_5_2();
+ f0_10_5_3();
+ f0_10_5_4();
+ f0_10_5_5();
+ f0_10_5_6();
+ f0_10_5_7();
+ f0_10_5_8();
+ f0_10_5_9();
+ f0_10_5_10();
+ f0_10_5_11();
+ }
+
+ function f0_10_6_0() {
+ return Math.random();
+ }
+
+ function f0_10_6_1() {
+ return Math.random();
+ }
+
+ function f0_10_6_2() {
+ return Math.random();
+ }
+
+ function f0_10_6_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_10_6_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_6_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_10_6_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_10_6_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_10_6_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_6_9() {
+ return isNaN(undefined);
+ }
+
+ function f0_10_6_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_10_6_11() {
+ return Math.random();
+ }
+
+ function f0_10_6() {
+ f0_10_6_0();
+ f0_10_6_1();
+ f0_10_6_2();
+ f0_10_6_3();
+ f0_10_6_4();
+ f0_10_6_5();
+ f0_10_6_6();
+ f0_10_6_7();
+ f0_10_6_8();
+ f0_10_6_9();
+ f0_10_6_10();
+ f0_10_6_11();
+ }
+
+ function f0_10_7_0() {
+ return Math.random();
+ }
+
+ function f0_10_7_1() {
+ return Math.random();
+ }
+
+ function f0_10_7_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_7_3() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_7_4() {
+ return isNaN(undefined);
+ }
+
+ function f0_10_7_5() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_10_7_6() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_7_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_10_7_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_10_7_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_7_10() {
+ return isNaN(undefined);
+ }
+
+ function f0_10_7_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_7() {
+ f0_10_7_0();
+ f0_10_7_1();
+ f0_10_7_2();
+ f0_10_7_3();
+ f0_10_7_4();
+ f0_10_7_5();
+ f0_10_7_6();
+ f0_10_7_7();
+ f0_10_7_8();
+ f0_10_7_9();
+ f0_10_7_10();
+ f0_10_7_11();
+ }
+
+ function f0_10_8_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_10_8_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_8_2() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_10_8_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_10_8_4() {
+ return isNaN(undefined);
+ }
+
+ function f0_10_8_5() {
+ return Math.random();
+ }
+
+ function f0_10_8_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_10_8_7() {
+ return isNaN(undefined);
+ }
+
+ function f0_10_8_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_10_8_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_8_10() {
+ return isNaN(undefined);
+ }
+
+ function f0_10_8_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_8() {
+ f0_10_8_0();
+ f0_10_8_1();
+ f0_10_8_2();
+ f0_10_8_3();
+ f0_10_8_4();
+ f0_10_8_5();
+ f0_10_8_6();
+ f0_10_8_7();
+ f0_10_8_8();
+ f0_10_8_9();
+ f0_10_8_10();
+ f0_10_8_11();
+ }
+
+ function f0_10_9_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_9_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_10_9_2() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_10_9_3() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_9_4() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_10_9_5() {
+ return Math.random();
+ }
+
+ function f0_10_9_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_10_9_7() {
+ return isNaN(undefined);
+ }
+
+ function f0_10_9_8() {
+ return Math.random();
+ }
+
+ function f0_10_9_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_9_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_9_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_9() {
+ f0_10_9_0();
+ f0_10_9_1();
+ f0_10_9_2();
+ f0_10_9_3();
+ f0_10_9_4();
+ f0_10_9_5();
+ f0_10_9_6();
+ f0_10_9_7();
+ f0_10_9_8();
+ f0_10_9_9();
+ f0_10_9_10();
+ f0_10_9_11();
+ }
+
+ function f0_10_10_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_10_10_1() {
+ return Math.random();
+ }
+
+ function f0_10_10_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_10_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_10_10_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_10_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_10_10_6() {
+ return Math.random();
+ }
+
+ function f0_10_10_7() {
+ return Math.random();
+ }
+
+ function f0_10_10_8() {
+ return Math.random();
+ }
+
+ function f0_10_10_9() {
+ return isNaN(undefined);
+ }
+
+ function f0_10_10_10() {
+ return Math.random();
+ }
+
+ function f0_10_10_11() {
+ return isNaN(undefined);
+ }
+
+ function f0_10_10() {
+ f0_10_10_0();
+ f0_10_10_1();
+ f0_10_10_2();
+ f0_10_10_3();
+ f0_10_10_4();
+ f0_10_10_5();
+ f0_10_10_6();
+ f0_10_10_7();
+ f0_10_10_8();
+ f0_10_10_9();
+ f0_10_10_10();
+ f0_10_10_11();
+ }
+
+ function f0_10_11_0() {
+ return isNaN(undefined);
+ }
+
+ function f0_10_11_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_10_11_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_11_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_10_11_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_11_5() {
+ return Math.random();
+ }
+
+ function f0_10_11_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_10_11_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_10_11_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_10_11_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_11_10() {
+ return isNaN(undefined);
+ }
+
+ function f0_10_11_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_10_11() {
+ f0_10_11_0();
+ f0_10_11_1();
+ f0_10_11_2();
+ f0_10_11_3();
+ f0_10_11_4();
+ f0_10_11_5();
+ f0_10_11_6();
+ f0_10_11_7();
+ f0_10_11_8();
+ f0_10_11_9();
+ f0_10_11_10();
+ f0_10_11_11();
+ }
+
+ function f0_10() {
+ f0_10_0();
+ f0_10_1();
+ f0_10_2();
+ f0_10_3();
+ f0_10_4();
+ f0_10_5();
+ f0_10_6();
+ f0_10_7();
+ f0_10_8();
+ f0_10_9();
+ f0_10_10();
+ f0_10_11();
+ }
+
+ function f0_11_0_0() {
+ return Math.random();
+ }
+
+ function f0_11_0_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_11_0_2() {
+ return isNaN(undefined);
+ }
+
+ function f0_11_0_3() {
+ return Math.random();
+ }
+
+ function f0_11_0_4() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_11_0_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_11_0_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_11_0_7() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_11_0_8() {
+ return Math.random();
+ }
+
+ function f0_11_0_9() {
+ return Math.random();
+ }
+
+ function f0_11_0_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_11_0_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_11_0() {
+ f0_11_0_0();
+ f0_11_0_1();
+ f0_11_0_2();
+ f0_11_0_3();
+ f0_11_0_4();
+ f0_11_0_5();
+ f0_11_0_6();
+ f0_11_0_7();
+ f0_11_0_8();
+ f0_11_0_9();
+ f0_11_0_10();
+ f0_11_0_11();
+ }
+
+ function f0_11_1_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_11_1_1() {
+ return Math.random();
+ }
+
+ function f0_11_1_2() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_11_1_3() {
+ return Math.random();
+ }
+
+ function f0_11_1_4() {
+ return isNaN(undefined);
+ }
+
+ function f0_11_1_5() {
+ return Math.random();
+ }
+
+ function f0_11_1_6() {
+ return isNaN(undefined);
+ }
+
+ function f0_11_1_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_11_1_8() {
+ return Math.random();
+ }
+
+ function f0_11_1_9() {
+ return isNaN(undefined);
+ }
+
+ function f0_11_1_10() {
+ return isNaN(undefined);
+ }
+
+ function f0_11_1_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_11_1() {
+ f0_11_1_0();
+ f0_11_1_1();
+ f0_11_1_2();
+ f0_11_1_3();
+ f0_11_1_4();
+ f0_11_1_5();
+ f0_11_1_6();
+ f0_11_1_7();
+ f0_11_1_8();
+ f0_11_1_9();
+ f0_11_1_10();
+ f0_11_1_11();
+ }
+
+ function f0_11_2_0() {
+ return Math.random();
+ }
+
+ function f0_11_2_1() {
+ return isNaN(undefined);
+ }
+
+ function f0_11_2_2() {
+ return isNaN(undefined);
+ }
+
+ function f0_11_2_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_11_2_4() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_11_2_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_11_2_6() {
+ return Math.random();
+ }
+
+ function f0_11_2_7() {
+ return Math.random();
+ }
+
+ function f0_11_2_8() {
+ return Math.random();
+ }
+
+ function f0_11_2_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_11_2_10() {
+ return isNaN(undefined);
+ }
+
+ function f0_11_2_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_11_2() {
+ f0_11_2_0();
+ f0_11_2_1();
+ f0_11_2_2();
+ f0_11_2_3();
+ f0_11_2_4();
+ f0_11_2_5();
+ f0_11_2_6();
+ f0_11_2_7();
+ f0_11_2_8();
+ f0_11_2_9();
+ f0_11_2_10();
+ f0_11_2_11();
+ }
+
+ function f0_11_3_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_11_3_1() {
+ return Math.random();
+ }
+
+ function f0_11_3_2() {
+ return isNaN(undefined);
+ }
+
+ function f0_11_3_3() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_11_3_4() {
+ return Math.random();
+ }
+
+ function f0_11_3_5() {
+ return Math.random();
+ }
+
+ function f0_11_3_6() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_11_3_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_11_3_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_11_3_9() {
+ return Math.random();
+ }
+
+ function f0_11_3_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_11_3_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_11_3() {
+ f0_11_3_0();
+ f0_11_3_1();
+ f0_11_3_2();
+ f0_11_3_3();
+ f0_11_3_4();
+ f0_11_3_5();
+ f0_11_3_6();
+ f0_11_3_7();
+ f0_11_3_8();
+ f0_11_3_9();
+ f0_11_3_10();
+ f0_11_3_11();
+ }
+
+ function f0_11_4_0() {
+ return isNaN(undefined);
+ }
+
+ function f0_11_4_1() {
+ return Math.random();
+ }
+
+ function f0_11_4_2() {
+ return Math.random();
+ }
+
+ function f0_11_4_3() {
+ return Math.random();
+ }
+
+ function f0_11_4_4() {
+ return Math.random();
+ }
+
+ function f0_11_4_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_11_4_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_11_4_7() {
+ return Math.random();
+ }
+
+ function f0_11_4_8() {
+ return Math.random();
+ }
+
+ function f0_11_4_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_11_4_10() {
+ return Math.random();
+ }
+
+ function f0_11_4_11() {
+ return isNaN(undefined);
+ }
+
+ function f0_11_4() {
+ f0_11_4_0();
+ f0_11_4_1();
+ f0_11_4_2();
+ f0_11_4_3();
+ f0_11_4_4();
+ f0_11_4_5();
+ f0_11_4_6();
+ f0_11_4_7();
+ f0_11_4_8();
+ f0_11_4_9();
+ f0_11_4_10();
+ f0_11_4_11();
+ }
+
+ function f0_11_5_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_11_5_1() {
+ return Math.random();
+ }
+
+ function f0_11_5_2() {
+ return isNaN(undefined);
+ }
+
+ function f0_11_5_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_11_5_4() {
+ return Math.random();
+ }
+
+ function f0_11_5_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_11_5_6() {
+ return Math.random();
+ }
+
+ function f0_11_5_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_11_5_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_11_5_9() {
+ return Math.random();
+ }
+
+ function f0_11_5_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_11_5_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_11_5() {
+ f0_11_5_0();
+ f0_11_5_1();
+ f0_11_5_2();
+ f0_11_5_3();
+ f0_11_5_4();
+ f0_11_5_5();
+ f0_11_5_6();
+ f0_11_5_7();
+ f0_11_5_8();
+ f0_11_5_9();
+ f0_11_5_10();
+ f0_11_5_11();
+ }
+
+ function f0_11_6_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_11_6_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_11_6_2() {
+ return isNaN(undefined);
+ }
+
+ function f0_11_6_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_11_6_4() {
+ return isNaN(undefined);
+ }
+
+ function f0_11_6_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_11_6_6() {
+ return Math.random();
+ }
+
+ function f0_11_6_7() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_11_6_8() {
+ return Math.random();
+ }
+
+ function f0_11_6_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_11_6_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_11_6_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_11_6() {
+ f0_11_6_0();
+ f0_11_6_1();
+ f0_11_6_2();
+ f0_11_6_3();
+ f0_11_6_4();
+ f0_11_6_5();
+ f0_11_6_6();
+ f0_11_6_7();
+ f0_11_6_8();
+ f0_11_6_9();
+ f0_11_6_10();
+ f0_11_6_11();
+ }
+
+ function f0_11_7_0() {
+ return isNaN(undefined);
+ }
+
+ function f0_11_7_1() {
+ return Math.random();
+ }
+
+ function f0_11_7_2() {
+ return Math.random();
+ }
+
+ function f0_11_7_3() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_11_7_4() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_11_7_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_11_7_6() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_11_7_7() {
+ return Math.random();
+ }
+
+ function f0_11_7_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_11_7_9() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_11_7_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_11_7_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_11_7() {
+ f0_11_7_0();
+ f0_11_7_1();
+ f0_11_7_2();
+ f0_11_7_3();
+ f0_11_7_4();
+ f0_11_7_5();
+ f0_11_7_6();
+ f0_11_7_7();
+ f0_11_7_8();
+ f0_11_7_9();
+ f0_11_7_10();
+ f0_11_7_11();
+ }
+
+ function f0_11_8_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_11_8_1() {
+ return isNaN(undefined);
+ }
+
+ function f0_11_8_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_11_8_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_11_8_4() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_11_8_5() {
+ return Math.random();
+ }
+
+ function f0_11_8_6() {
+ return Math.random();
+ }
+
+ function f0_11_8_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_11_8_8() {
+ return isNaN(undefined);
+ }
+
+ function f0_11_8_9() {
+ return isNaN(undefined);
+ }
+
+ function f0_11_8_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_11_8_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_11_8() {
+ f0_11_8_0();
+ f0_11_8_1();
+ f0_11_8_2();
+ f0_11_8_3();
+ f0_11_8_4();
+ f0_11_8_5();
+ f0_11_8_6();
+ f0_11_8_7();
+ f0_11_8_8();
+ f0_11_8_9();
+ f0_11_8_10();
+ f0_11_8_11();
+ }
+
+ function f0_11_9_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_11_9_1() {
+ return Math.random();
+ }
+
+ function f0_11_9_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_11_9_3() {
+ return Math.random();
+ }
+
+ function f0_11_9_4() {
+ return isNaN(undefined);
+ }
+
+ function f0_11_9_5() {
+ return Math.random();
+ }
+
+ function f0_11_9_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_11_9_7() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_11_9_8() {
+ return Math.random();
+ }
+
+ function f0_11_9_9() {
+ return isNaN(undefined);
+ }
+
+ function f0_11_9_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_11_9_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_11_9() {
+ f0_11_9_0();
+ f0_11_9_1();
+ f0_11_9_2();
+ f0_11_9_3();
+ f0_11_9_4();
+ f0_11_9_5();
+ f0_11_9_6();
+ f0_11_9_7();
+ f0_11_9_8();
+ f0_11_9_9();
+ f0_11_9_10();
+ f0_11_9_11();
+ }
+
+ function f0_11_10_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_11_10_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_11_10_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_11_10_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_11_10_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_11_10_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_11_10_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_11_10_7() {
+ return isNaN(undefined);
+ }
+
+ function f0_11_10_8() {
+ return Math.random();
+ }
+
+ function f0_11_10_9() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_11_10_10() {
+ return isNaN(undefined);
+ }
+
+ function f0_11_10_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_11_10() {
+ f0_11_10_0();
+ f0_11_10_1();
+ f0_11_10_2();
+ f0_11_10_3();
+ f0_11_10_4();
+ f0_11_10_5();
+ f0_11_10_6();
+ f0_11_10_7();
+ f0_11_10_8();
+ f0_11_10_9();
+ f0_11_10_10();
+ f0_11_10_11();
+ }
+
+ function f0_11_11_0() {
+ return Math.random();
+ }
+
+ function f0_11_11_1() {
+ return isNaN(undefined);
+ }
+
+ function f0_11_11_2() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_11_11_3() {
+ return isNaN(undefined);
+ }
+
+ function f0_11_11_4() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_11_11_5() {
+ return isNaN(undefined);
+ }
+
+ function f0_11_11_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_11_11_7() {
+ return isNaN(undefined);
+ }
+
+ function f0_11_11_8() {
+ return Math.random();
+ }
+
+ function f0_11_11_9() {
+ return Math.random();
+ }
+
+ function f0_11_11_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f0_11_11_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f0_11_11() {
+ f0_11_11_0();
+ f0_11_11_1();
+ f0_11_11_2();
+ f0_11_11_3();
+ f0_11_11_4();
+ f0_11_11_5();
+ f0_11_11_6();
+ f0_11_11_7();
+ f0_11_11_8();
+ f0_11_11_9();
+ f0_11_11_10();
+ f0_11_11_11();
+ }
+
+ function f0_11() {
+ f0_11_0();
+ f0_11_1();
+ f0_11_2();
+ f0_11_3();
+ f0_11_4();
+ f0_11_5();
+ f0_11_6();
+ f0_11_7();
+ f0_11_8();
+ f0_11_9();
+ f0_11_10();
+ f0_11_11();
+ }
+
+ function f0() {
+ f0_0();
+ f0_1();
+ f0_2();
+ f0_3();
+ f0_4();
+ f0_5();
+ f0_6();
+ f0_7();
+ f0_8();
+ f0_9();
+ f0_10();
+ f0_11();
+ }
+
+ function f2_0() {
+ return Math.random();
+ }
+
+ function f2_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f2_2() {
+ return isNaN(undefined);
+ }
+
+ function f2_3() {
+ return isNaN(undefined);
+ }
+
+ function f2_4() {
+ return isNaN(undefined);
+ }
+
+ function f2_5() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f2_6() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f2_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f2_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f2_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f2_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f2_11() {
+ return isNaN(undefined);
+ }
+
+ function f1() {
+ f1_0();
+ f1_1();
+ f1_2();
+ f1_3();
+ f1_4();
+ f1_5();
+ f1_6();
+ f1_7();
+ f1_8();
+ f1_9();
+ f1_10();
+ f1_11();
+ }
+
+ function f1_0_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f1_0_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f1_0_2() {
+ return Math.random();
+ }
+
+ function f1_0_3() {
+ return isNaN(undefined);
+ }
+
+ function f1_0_4() {
+ return isNaN(undefined);
+ }
+
+ function f1_0_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_0_6() {
+ return isNaN(undefined);
+ }
+
+ function f1_0_7() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f1_0_8() {
+ return isNaN(undefined);
+ }
+
+ function f1_0_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_0_10() {
+ return Math.random();
+ }
+
+ function f1_0_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_0() {
+ f1_0_0();
+ f1_0_1();
+ f1_0_2();
+ f1_0_3();
+ f1_0_4();
+ f1_0_5();
+ f1_0_6();
+ f1_0_7();
+ f1_0_8();
+ f1_0_9();
+ f1_0_10();
+ f1_0_11();
+ }
+
+ function f1_1_0() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f1_1_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_1_2() {
+ return isNaN(undefined);
+ }
+
+ function f1_1_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f1_1_4() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f1_1_5() {
+ return Math.random();
+ }
+
+ function f1_1_6() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_1_7() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_1_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_1_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_1_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_1_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_1() {
+ f1_1_0();
+ f1_1_1();
+ f1_1_2();
+ f1_1_3();
+ f1_1_4();
+ f1_1_5();
+ f1_1_6();
+ f1_1_7();
+ f1_1_8();
+ f1_1_9();
+ f1_1_10();
+ f1_1_11();
+ }
+
+ function f1_2_0() {
+ return Math.random();
+ }
+
+ function f1_2_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_2_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_2_3() {
+ return isNaN(undefined);
+ }
+
+ function f1_2_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_2_5() {
+ return Math.random();
+ }
+
+ function f1_2_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f1_2_7() {
+ return isNaN(undefined);
+ }
+
+ function f1_2_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_2_9() {
+ return Math.random();
+ }
+
+ function f1_2_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f1_2_11() {
+ return Math.random();
+ }
+
+ function f1_2() {
+ f1_2_0();
+ f1_2_1();
+ f1_2_2();
+ f1_2_3();
+ f1_2_4();
+ f1_2_5();
+ f1_2_6();
+ f1_2_7();
+ f1_2_8();
+ f1_2_9();
+ f1_2_10();
+ f1_2_11();
+ }
+
+ function f1_3_0() {
+ return Math.random();
+ }
+
+ function f1_3_1() {
+ return isNaN(undefined);
+ }
+
+ function f1_3_2() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f1_3_3() {
+ return isNaN(undefined);
+ }
+
+ function f1_3_4() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f1_3_5() {
+ return isNaN(undefined);
+ }
+
+ function f1_3_6() {
+ return Math.random();
+ }
+
+ function f1_3_7() {
+ return Math.random();
+ }
+
+ function f1_3_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f1_3_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_3_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_3_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f1_3() {
+ f1_3_0();
+ f1_3_1();
+ f1_3_2();
+ f1_3_3();
+ f1_3_4();
+ f1_3_5();
+ f1_3_6();
+ f1_3_7();
+ f1_3_8();
+ f1_3_9();
+ f1_3_10();
+ f1_3_11();
+ }
+
+ function f1_4_0() {
+ return isNaN(undefined);
+ }
+
+ function f1_4_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_4_2() {
+ return isNaN(undefined);
+ }
+
+ function f1_4_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f1_4_4() {
+ return Math.random();
+ }
+
+ function f1_4_5() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f1_4_6() {
+ return isNaN(undefined);
+ }
+
+ function f1_4_7() {
+ return isNaN(undefined);
+ }
+
+ function f1_4_8() {
+ return Math.random();
+ }
+
+ function f1_4_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_4_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_4_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f1_4() {
+ f1_4_0();
+ f1_4_1();
+ f1_4_2();
+ f1_4_3();
+ f1_4_4();
+ f1_4_5();
+ f1_4_6();
+ f1_4_7();
+ f1_4_8();
+ f1_4_9();
+ f1_4_10();
+ f1_4_11();
+ }
+
+ function f1_5_0() {
+ return isNaN(undefined);
+ }
+
+ function f1_5_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_5_2() {
+ return Math.random();
+ }
+
+ function f1_5_3() {
+ return isNaN(undefined);
+ }
+
+ function f1_5_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_5_5() {
+ return isNaN(undefined);
+ }
+
+ function f1_5_6() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_5_7() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_5_8() {
+ return Math.random();
+ }
+
+ function f1_5_9() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f1_5_10() {
+ return isNaN(undefined);
+ }
+
+ function f1_5_11() {
+ return isNaN(undefined);
+ }
+
+ function f1_5() {
+ f1_5_0();
+ f1_5_1();
+ f1_5_2();
+ f1_5_3();
+ f1_5_4();
+ f1_5_5();
+ f1_5_6();
+ f1_5_7();
+ f1_5_8();
+ f1_5_9();
+ f1_5_10();
+ f1_5_11();
+ }
+
+ function f1_6_0() {
+ return Math.random();
+ }
+
+ function f1_6_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f1_6_2() {
+ return Math.random();
+ }
+
+ function f1_6_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f1_6_4() {
+ return Math.random();
+ }
+
+ function f1_6_5() {
+ return Math.random();
+ }
+
+ function f1_6_6() {
+ return Math.random();
+ }
+
+ function f1_6_7() {
+ return Math.random();
+ }
+
+ function f1_6_8() {
+ return isNaN(undefined);
+ }
+
+ function f1_6_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_6_10() {
+ return Math.random();
+ }
+
+ function f1_6_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f1_6() {
+ f1_6_0();
+ f1_6_1();
+ f1_6_2();
+ f1_6_3();
+ f1_6_4();
+ f1_6_5();
+ f1_6_6();
+ f1_6_7();
+ f1_6_8();
+ f1_6_9();
+ f1_6_10();
+ f1_6_11();
+ }
+
+ function f1_7_0() {
+ return Math.random();
+ }
+
+ function f1_7_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_7_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_7_3() {
+ return Math.random();
+ }
+
+ function f1_7_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_7_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_7_6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f1_7_7() {
+ return isNaN(undefined);
+ }
+
+ function f1_7_8() {
+ return isNaN(undefined);
+ }
+
+ function f1_7_9() {
+ return isNaN(undefined);
+ }
+
+ function f1_7_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f1_7_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f1_7() {
+ f1_7_0();
+ f1_7_1();
+ f1_7_2();
+ f1_7_3();
+ f1_7_4();
+ f1_7_5();
+ f1_7_6();
+ f1_7_7();
+ f1_7_8();
+ f1_7_9();
+ f1_7_10();
+ f1_7_11();
+ }
+
+ function f1_8_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_8_1() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f1_8_2() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_8_3() {
+ return isNaN(undefined);
+ }
+
+ function f1_8_4() {
+ return isNaN(undefined);
+ }
+
+ function f1_8_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_8_6() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_8_7() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_8_8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f1_8_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_8_10() {
+ return isNaN(undefined);
+ }
+
+ function f1_8_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_8() {
+ f1_8_0();
+ f1_8_1();
+ f1_8_2();
+ f1_8_3();
+ f1_8_4();
+ f1_8_5();
+ f1_8_6();
+ f1_8_7();
+ f1_8_8();
+ f1_8_9();
+ f1_8_10();
+ f1_8_11();
+ }
+
+ function f1_9_0() {
+ return Math.random();
+ }
+
+ function f1_9_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_9_2() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f1_9_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f1_9_4() {
+ return Math.random();
+ }
+
+ function f1_9_5() {
+ return isNaN(undefined);
+ }
+
+ function f1_9_6() {
+ return isNaN(undefined);
+ }
+
+ function f1_9_7() {
+ return Math.random();
+ }
+
+ function f1_9_8() {
+ return Math.random();
+ }
+
+ function f1_9_9() {
+ return Math.random();
+ }
+
+ function f1_9_10() {
+ return isNaN(undefined);
+ }
+
+ function f1_9_11() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f1_9() {
+ f1_9_0();
+ f1_9_1();
+ f1_9_2();
+ f1_9_3();
+ f1_9_4();
+ f1_9_5();
+ f1_9_6();
+ f1_9_7();
+ f1_9_8();
+ f1_9_9();
+ f1_9_10();
+ f1_9_11();
+ }
+
+ function f1_10_0() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_10_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_10_2() {
+ return Math.random();
+ }
+
+ function f1_10_3() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f1_10_4() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f1_10_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_10_6() {
+ return Math.random();
+ }
+
+ function f1_10_7() {
+ return Math.random();
+ }
+
+ function f1_10_8() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_10_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_10_10() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f1_10_11() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_10() {
+ f1_10_0();
+ f1_10_1();
+ f1_10_2();
+ f1_10_3();
+ f1_10_4();
+ f1_10_5();
+ f1_10_6();
+ f1_10_7();
+ f1_10_8();
+ f1_10_9();
+ f1_10_10();
+ f1_10_11();
+ }
+
+ function f1_11_0() {
+ return isNaN(undefined);
+ }
+
+ function f1_11_1() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_11_2() {
+ return isNaN(undefined);
+ }
+
+ function f1_11_3() {
+ return isNaN(undefined);
+ }
+
+ function f1_11_4() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_11_5() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_11_6() {
+ return Math.random();
+ }
+
+ function f1_11_7() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_11_8() {
+ return Math.random();
+ }
+
+ function f1_11_9() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_11_10() {
+ return encodeURIComponent(',45098#"¤#"&¤/%"Q"');
+ }
+
+ function f1_11_11() {
+ return Math.random();
+ }
+
+ function f1_11() {
+ f1_11_0();
+ f1_11_1();
+ f1_11_2();
+ f1_11_3();
+ f1_11_4();
+ f1_11_5();
+ f1_11_6();
+ f1_11_7();
+ f1_11_8();
+ f1_11_9();
+ f1_11_10();
+ f1_11_11();
+ }
+
+ function f2() {
+ f2_0();
+ f2_1();
+ f2_2();
+ f2_3();
+ f2_4();
+ f2_5();
+ f2_6();
+ f2_7();
+ f2_8();
+ f2_9();
+ f2_10();
+ f2_11();
+ }
+
+ function f3() {
+ return isNaN(undefined);
+ }
+
+ function f4() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f5() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f6() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f7() {
+ return isNaN(undefined);
+ }
+
+ function f8() {
+ return Math.max(Math.random(), Math.random());
+ }
+
+ function f9() {
+ return isNaN(undefined);
+ }
+
+ function f10() {
+ return isNaN(undefined);
+ }
+
+ function f11() {
+ return isNaN(undefined);
+ }
+
+ function stepInTest() {
+ f0();
+ f1();
+ f2();
+ f3();
+ f4();
+ f5();
+ f6();
+ f7();
+ f8();
+ f9();
+ f10();
+ f11();
+ console.log("Done!");
+ }
+
+ function debugStatement() {
+ debugger;
+ f0();
+ f1();
+ f2();
+ f3();
+ f4();
+ f5();
+ f6();
+ f7();
+ f8();
+ f9();
+ f10();
+ f11();
+ console.log("Done!");
+ }
+
+ /***/
+ },
+
+ /***/ "./src/step-out-test.js":
+ /*!******************************!*\
+ !*** ./src/step-out-test.js ***!
+ \******************************/
+ /*! exports provided: default */
+ /*! exports used: default */
+ /***/ function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function f0() {
+ f1();
+ return Math.random();
+ }
+
+ function f1() {
+ f2();
+ return Math.random();
+ }
+
+ function f2() {
+ f3();
+ return Math.random();
+ }
+
+ function f3() {
+ f4();
+ return Math.random();
+ }
+
+ function f4() {
+ f5();
+ return Math.random();
+ }
+
+ function f5() {
+ f6();
+ return Math.random();
+ }
+
+ function f6() {
+ f7();
+ return Math.random();
+ }
+
+ function f7() {
+ f8();
+ return Math.random();
+ }
+
+ function f8() {
+ f9();
+ return Math.random();
+ }
+
+ function f9() {
+ f10();
+ return Math.random();
+ }
+
+ function f10() {
+ f11();
+ return Math.random();
+ }
+
+ function f11() {
+ f12();
+ return Math.random();
+ }
+
+ function f12() {
+ f13();
+ return Math.random();
+ }
+
+ function f13() {
+ f14();
+ return Math.random();
+ }
+
+ function f14() {
+ f15();
+ return Math.random();
+ }
+
+ function f15() {
+ f16();
+ return Math.random();
+ }
+
+ function f16() {
+ f17();
+ return Math.random();
+ }
+
+ function f17() {
+ f18();
+ return Math.random();
+ }
+
+ function f18() {
+ f19();
+ return Math.random();
+ }
+
+ function f19() {
+ f20();
+ return Math.random();
+ }
+
+ function f20() {
+ f21();
+ return Math.random();
+ }
+
+ function f21() {
+ f22();
+ return Math.random();
+ }
+
+ function f22() {
+ f23();
+ return Math.random();
+ }
+
+ function f23() {
+ f24();
+ return Math.random();
+ }
+
+ function f24() {
+ f25();
+ return Math.random();
+ }
+
+ function f25() {
+ f26();
+ return Math.random();
+ }
+
+ function f26() {
+ f27();
+ return Math.random();
+ }
+
+ function f27() {
+ f28();
+ return Math.random();
+ }
+
+ function f28() {
+ f29();
+ return Math.random();
+ }
+
+ function f29() {
+ f30();
+ return Math.random();
+ }
+
+ function f30() {
+ f31();
+ return Math.random();
+ }
+
+ function f31() {
+ f32();
+ return Math.random();
+ }
+
+ function f32() {
+ f33();
+ return Math.random();
+ }
+
+ function f33() {
+ f34();
+ return Math.random();
+ }
+
+ function f34() {
+ f35();
+ return Math.random();
+ }
+
+ function f35() {
+ f36();
+ return Math.random();
+ }
+
+ function f36() {
+ f37();
+ return Math.random();
+ }
+
+ function f37() {
+ f38();
+ return Math.random();
+ }
+
+ function f38() {
+ f39();
+ return Math.random();
+ }
+
+ function f39() {
+ f40();
+ return Math.random();
+ }
+
+ function f40() {
+ f41();
+ return Math.random();
+ }
+
+ function f41() {
+ f42();
+ return Math.random();
+ }
+
+ function f42() {
+ f43();
+ return Math.random();
+ }
+
+ function f43() {
+ f44();
+ return Math.random();
+ }
+
+ function f44() {
+ f45();
+ return Math.random();
+ }
+
+ function f45() {
+ f46();
+ return Math.random();
+ }
+
+ function f46() {
+ f47();
+ return Math.random();
+ }
+
+ function f47() {
+ f48();
+ return Math.random();
+ }
+
+ function f48() {
+ f49();
+ return Math.random();
+ }
+
+ function f49() {
+ f50();
+ return Math.random();
+ }
+
+ function f50() {
+ f51();
+ return Math.random();
+ }
+
+ function f51() {
+ f52();
+ return Math.random();
+ }
+
+ function f52() {
+ f53();
+ return Math.random();
+ }
+
+ function f53() {
+ f54();
+ return Math.random();
+ }
+
+ function f54() {
+ f55();
+ return Math.random();
+ }
+
+ function f55() {
+ f56();
+ return Math.random();
+ }
+
+ function f56() {
+ f57();
+ return Math.random();
+ }
+
+ function f57() {
+ f58();
+ return Math.random();
+ }
+
+ function f58() {
+ f59();
+ return Math.random();
+ }
+
+ function f59() {
+ f60();
+ return Math.random();
+ }
+
+ function f60() {
+ f61();
+ return Math.random();
+ }
+
+ function f61() {
+ f62();
+ return Math.random();
+ }
+
+ function f62() {
+ f63();
+ return Math.random();
+ }
+
+ function f63() {
+ f64();
+ return Math.random();
+ }
+
+ function f64() {
+ f65();
+ return Math.random();
+ }
+
+ function f65() {
+ f66();
+ return Math.random();
+ }
+
+ function f66() {
+ f67();
+ return Math.random();
+ }
+
+ function f67() {
+ f68();
+ return Math.random();
+ }
+
+ function f68() {
+ f69();
+ return Math.random();
+ }
+
+ function f69() {
+ f70();
+ return Math.random();
+ }
+
+ function f70() {
+ f71();
+ return Math.random();
+ }
+
+ function f71() {
+ f72();
+ return Math.random();
+ }
+
+ function f72() {
+ f73();
+ return Math.random();
+ }
+
+ function f73() {
+ f74();
+ return Math.random();
+ }
+
+ function f74() {
+ f75();
+ return Math.random();
+ }
+
+ function f75() {
+ f76();
+ return Math.random();
+ }
+
+ function f76() {
+ f77();
+ return Math.random();
+ }
+
+ function f77() {
+ f78();
+ return Math.random();
+ }
+
+ function f78() {
+ f79();
+ return Math.random();
+ }
+
+ function f79() {
+ f80();
+ return Math.random();
+ }
+
+ function f80() {
+ f81();
+ return Math.random();
+ }
+
+ function f81() {
+ f82();
+ return Math.random();
+ }
+
+ function f82() {
+ f83();
+ return Math.random();
+ }
+
+ function f83() {
+ f84();
+ return Math.random();
+ }
+
+ function f84() {
+ f85();
+ return Math.random();
+ }
+
+ function f85() {
+ f86();
+ return Math.random();
+ }
+
+ function f86() {
+ f87();
+ return Math.random();
+ }
+
+ function f87() {
+ f88();
+ return Math.random();
+ }
+
+ function f88() {
+ f89();
+ return Math.random();
+ }
+
+ function f89() {
+ f90();
+ return Math.random();
+ }
+
+ function f90() {
+ f91();
+ return Math.random();
+ }
+
+ function f91() {
+ f92();
+ return Math.random();
+ }
+
+ function f92() {
+ f93();
+ return Math.random();
+ }
+
+ function f93() {
+ f94();
+ return Math.random();
+ }
+
+ function f94() {
+ f95();
+ return Math.random();
+ }
+
+ function f95() {
+ f96();
+ return Math.random();
+ }
+
+ function f96() {
+ f97();
+ return Math.random();
+ }
+
+ function f97() {
+ f98();
+ return Math.random();
+ }
+
+ function f98() {
+ f99();
+ return Math.random();
+ }
+
+ function f99() {
+ f100();
+ return Math.random();
+ }
+
+ function f100() {
+ f101();
+ return Math.random();
+ }
+
+ function f101() {
+ f102();
+ return Math.random();
+ }
+
+ function f102() {
+ f103();
+ return Math.random();
+ }
+
+ function f103() {
+ f104();
+ return Math.random();
+ }
+
+ function f104() {
+ f105();
+ return Math.random();
+ }
+
+ function f105() {
+ f106();
+ return Math.random();
+ }
+
+ function f106() {
+ f107();
+ return Math.random();
+ }
+
+ function f107() {
+ f108();
+ return Math.random();
+ }
+
+ function f108() {
+ f109();
+ return Math.random();
+ }
+
+ function f109() {
+ f110();
+ return Math.random();
+ }
+
+ function f110() {
+ f111();
+ return Math.random();
+ }
+
+ function f111() {
+ f112();
+ return Math.random();
+ }
+
+ function f112() {
+ f113();
+ return Math.random();
+ }
+
+ function f113() {
+ f114();
+ return Math.random();
+ }
+
+ function f114() {
+ f115();
+ return Math.random();
+ }
+
+ function f115() {
+ f116();
+ return Math.random();
+ }
+
+ function f116() {
+ f117();
+ return Math.random();
+ }
+
+ function f117() {
+ f118();
+ return Math.random();
+ }
+
+ function f118() {
+ f119();
+ return Math.random();
+ }
+
+ function f119() {
+ f120();
+ return Math.random();
+ }
+
+ function f120() {
+ f121();
+ return Math.random();
+ }
+
+ function f121() {
+ f122();
+ return Math.random();
+ }
+
+ function f122() {
+ f123();
+ return Math.random();
+ }
+
+ function f123() {
+ f124();
+ return Math.random();
+ }
+
+ function f124() {
+ f125();
+ return Math.random();
+ }
+
+ function f125() {
+ f126();
+ return Math.random();
+ }
+
+ function f126() {
+ f127();
+ return Math.random();
+ }
+
+ function f127() {
+ f128();
+ return Math.random();
+ }
+
+ function f128() {
+ f129();
+ return Math.random();
+ }
+
+ function f129() {
+ f130();
+ return Math.random();
+ }
+
+ function f130() {
+ f131();
+ return Math.random();
+ }
+
+ function f131() {
+ f132();
+ return Math.random();
+ }
+
+ function f132() {
+ f133();
+ return Math.random();
+ }
+
+ function f133() {
+ f134();
+ return Math.random();
+ }
+
+ function f134() {
+ f135();
+ return Math.random();
+ }
+
+ function f135() {
+ f136();
+ return Math.random();
+ }
+
+ function f136() {
+ f137();
+ return Math.random();
+ }
+
+ function f137() {
+ f138();
+ return Math.random();
+ }
+
+ function f138() {
+ f139();
+ return Math.random();
+ }
+
+ function f139() {
+ f140();
+ return Math.random();
+ }
+
+ function f140() {
+ f141();
+ return Math.random();
+ }
+
+ function f141() {
+ f142();
+ return Math.random();
+ }
+
+ function f142() {
+ f143();
+ return Math.random();
+ }
+
+ function f143() {
+ f144();
+ return Math.random();
+ }
+
+ function f144() {
+ f145();
+ return Math.random();
+ }
+
+ function f145() {
+ f146();
+ return Math.random();
+ }
+
+ function f146() {
+ f147();
+ return Math.random();
+ }
+
+ function f147() {
+ f148();
+ return Math.random();
+ }
+
+ function f148() {
+ f149();
+ return Math.random();
+ }
+
+ function f149() {
+ f150();
+ return Math.random();
+ }
+
+ function f150() {
+ f151();
+ return Math.random();
+ }
+
+ function f151() {
+ f152();
+ return Math.random();
+ }
+
+ function f152() {
+ f153();
+ return Math.random();
+ }
+
+ function f153() {
+ f154();
+ return Math.random();
+ }
+
+ function f154() {
+ f155();
+ return Math.random();
+ }
+
+ function f155() {
+ f156();
+ return Math.random();
+ }
+
+ function f156() {
+ f157();
+ return Math.random();
+ }
+
+ function f157() {
+ f158();
+ return Math.random();
+ }
+
+ function f158() {
+ f159();
+ return Math.random();
+ }
+
+ function f159() {
+ f160();
+ return Math.random();
+ }
+
+ function f160() {
+ f161();
+ return Math.random();
+ }
+
+ function f161() {
+ f162();
+ return Math.random();
+ }
+
+ function f162() {
+ f163();
+ return Math.random();
+ }
+
+ function f163() {
+ f164();
+ return Math.random();
+ }
+
+ function f164() {
+ f165();
+ return Math.random();
+ }
+
+ function f165() {
+ f166();
+ return Math.random();
+ }
+
+ function f166() {
+ f167();
+ return Math.random();
+ }
+
+ function f167() {
+ f168();
+ return Math.random();
+ }
+
+ function f168() {
+ f169();
+ return Math.random();
+ }
+
+ function f169() {
+ f170();
+ return Math.random();
+ }
+
+ function f170() {
+ f171();
+ return Math.random();
+ }
+
+ function f171() {
+ f172();
+ return Math.random();
+ }
+
+ function f172() {
+ f173();
+ return Math.random();
+ }
+
+ function f173() {
+ f174();
+ return Math.random();
+ }
+
+ function f174() {
+ f175();
+ return Math.random();
+ }
+
+ function f175() {
+ f176();
+ return Math.random();
+ }
+
+ function f176() {
+ f177();
+ return Math.random();
+ }
+
+ function f177() {
+ f178();
+ return Math.random();
+ }
+
+ function f178() {
+ f179();
+ return Math.random();
+ }
+
+ function f179() {
+ f180();
+ return Math.random();
+ }
+
+ function f180() {
+ f181();
+ return Math.random();
+ }
+
+ function f181() {
+ f182();
+ return Math.random();
+ }
+
+ function f182() {
+ f183();
+ return Math.random();
+ }
+
+ function f183() {
+ f184();
+ return Math.random();
+ }
+
+ function f184() {
+ f185();
+ return Math.random();
+ }
+
+ function f185() {
+ f186();
+ return Math.random();
+ }
+
+ function f186() {
+ f187();
+ return Math.random();
+ }
+
+ function f187() {
+ f188();
+ return Math.random();
+ }
+
+ function f188() {
+ f189();
+ return Math.random();
+ }
+
+ function f189() {
+ f190();
+ return Math.random();
+ }
+
+ function f190() {
+ f191();
+ return Math.random();
+ }
+
+ function f191() {
+ f192();
+ return Math.random();
+ }
+
+ function f192() {
+ f193();
+ return Math.random();
+ }
+
+ function f193() {
+ f194();
+ return Math.random();
+ }
+
+ function f194() {
+ f195();
+ return Math.random();
+ }
+
+ function f195() {
+ f196();
+ return Math.random();
+ }
+
+ function f196() {
+ f197();
+ return Math.random();
+ }
+
+ function f197() {
+ f198();
+ return Math.random();
+ }
+
+ function f198() {
+ f199();
+ return Math.random();
+ }
+
+ function f199() {
+ return Math.random();
+ }
+
+ /* harmony default export */ __webpack_exports__["a"] = f0;
+
+ /***/
+ },
+
+ /***/ "./src/step-over-test.js":
+ /*!*******************************!*\
+ !*** ./src/step-over-test.js ***!
+ \*******************************/
+ /*! exports provided: default */
+ /*! exports used: default */
+ /***/ function(module, __webpack_exports__, __webpack_require__) {
+ "use strict";
+ function squareAndOne(arg) {
+ return arg * arg + 1;
+ }
+ function squareUntil(arg, limit) {
+ if (arg * arg >= limit) {
+ return arg * arg;
+ } else {
+ return squareUntil(arg * arg, limit);
+ }
+ }
+
+ function addUntil(arg1, arg2, limit) {
+ if (arg1 + arg2 > limit) {
+ return arg1 + arg2;
+ } else {
+ return addUntil(arg1 + arg2, arg2, limit);
+ }
+ }
+
+ function testStart(aArg) {
+ var r = 10;
+ var a = squareAndOne(r);
+ var b = squareUntil(r, 99999999999); //recurses 3 times, returns on 4th call
+ var c = addUntil(r, 5, 1050); // recurses 208 times and returns on the 209th call
+ return a + b + c;
+ }
+
+ /* harmony default export */ __webpack_exports__["a"] = testStart;
+
+ /***/
+ },
+
+ /***/ 0:
+ /*!***********************************************************************************************************************************!*\
+ !*** multi ./node_modules/react-scripts/config/polyfills.js ./node_modules/react-dev-utils/webpackHotDevClient.js ./src/index.js ***!
+ \***********************************************************************************************************************************/
+ /*! dynamic exports provided */
+ /*! all exports used */
+ /***/ function(module, exports, __webpack_require__) {
+ __webpack_require__(
+ /*! /Users/Ystartsev/Work/debugger-sourcemaps/node_modules/react-scripts/config/polyfills.js */ "./node_modules/react-scripts/config/polyfills.js"
+ );
+ __webpack_require__(
+ /*! /Users/Ystartsev/Work/debugger-sourcemaps/node_modules/react-dev-utils/webpackHotDevClient.js */ "./node_modules/react-dev-utils/webpackHotDevClient.js"
+ );
+ module.exports = __webpack_require__(
+ /*! /Users/Ystartsev/Work/debugger-sourcemaps/src/index.js */ "./src/index.js"
+ );
+
+ /***/
+ }
+
+ /******/
+ }
+);
+//# sourceMappingURL=bundle.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/big-sourcemap_files/bundle.js.map b/devtools/client/debugger/test/mochitest/examples/big-sourcemap_files/bundle.js.map
new file mode 100644
index 0000000000..ee5e927a60
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/big-sourcemap_files/bundle.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"static/js/bundle.js","sources":["/Users/Ystartsev/Work/debugger-sourcemaps/webpack/bootstrap cbd3f28b2666e547679d","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/ansi-regex/index.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/ansi-styles/index.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/asap/browser-raw.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/escape-string-regexp/index.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/fbjs/lib/EventListener.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/fbjs/lib/ExecutionEnvironment.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/fbjs/lib/camelize.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/fbjs/lib/camelizeStyleName.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/fbjs/lib/containsNode.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/fbjs/lib/emptyFunction.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/fbjs/lib/emptyObject.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/fbjs/lib/focusNode.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/fbjs/lib/getActiveElement.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/fbjs/lib/hyphenate.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/fbjs/lib/hyphenateStyleName.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/fbjs/lib/invariant.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/fbjs/lib/isNode.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/fbjs/lib/isTextNode.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/fbjs/lib/shallowEqual.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/fbjs/lib/warning.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/has-ansi/index.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/inherits/inherits_browser.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/json3/lib/json3.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/ms/index.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/object-assign/index.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/process/browser.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/prop-types/checkPropTypes.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/prop-types/lib/ReactPropTypesSecret.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/punycode/punycode.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/querystring-es3/decode.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/querystring-es3/encode.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/querystring-es3/index.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/react-dev-utils/formatWebpackMessages.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/react-dev-utils/launchEditorEndpoint.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/react-dev-utils/node_modules/chalk/index.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/react-dev-utils/node_modules/strip-ansi/index.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/react-dev-utils/webpackHotDevClient.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/react-dom/cjs/react-dom.development.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/react-dom/index.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/react-error-overlay/lib/index.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/react-scripts/config/polyfills.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/react-scripts/node_modules/promise/lib/core.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/react-scripts/node_modules/promise/lib/es6-extensions.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/react-scripts/node_modules/promise/lib/rejection-tracking.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/react/cjs/react.development.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/react/index.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/requires-port/index.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/entry.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/event/close.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/event/emitter.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/event/event.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/event/eventtarget.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/event/trans-message.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/facade.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/iframe-bootstrap.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/info-ajax.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/info-iframe-receiver.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/info-iframe.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/info-receiver.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/location.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/main.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/shims.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/transport-list.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/transport/browser/abstract-xhr.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/transport/browser/eventsource.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/transport/browser/websocket.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/transport/eventsource.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/transport/htmlfile.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/transport/iframe.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/transport/jsonp-polling.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/transport/lib/ajax-based.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/transport/lib/buffered-sender.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/transport/lib/iframe-wrap.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/transport/lib/polling.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/transport/lib/sender-receiver.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/transport/receiver/eventsource.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/transport/receiver/htmlfile.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/transport/receiver/jsonp.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/transport/receiver/xhr.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/transport/sender/jsonp.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/transport/sender/xdr.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/transport/sender/xhr-cors.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/transport/sender/xhr-fake.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/transport/sender/xhr-local.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/transport/websocket.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/transport/xdr-polling.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/transport/xdr-streaming.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/transport/xhr-polling.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/transport/xhr-streaming.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/utils/browser-crypto.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/utils/browser.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/utils/escape.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/utils/event.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/utils/iframe.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/utils/log.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/utils/object.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/utils/random.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/utils/transport.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/utils/url.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/lib/version.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/node_modules/debug/src/browser.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/sockjs-client/node_modules/debug/src/debug.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/supports-color/index.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/url-parse/index.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/url-parse/node_modules/querystringify/index.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/url/url.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/url/util.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/webpack/buildin/amd-options.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/webpack/buildin/global.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/webpack/buildin/module.js","/Users/Ystartsev/Work/debugger-sourcemaps/node_modules/whatwg-fetch/fetch.js","/Users/Ystartsev/Work/debugger-sourcemaps/src/App.js","/Users/Ystartsev/Work/debugger-sourcemaps/src/index.js","/Users/Ystartsev/Work/debugger-sourcemaps/src/step-in-test.js","/Users/Ystartsev/Work/debugger-sourcemaps/src/step-out-test.js","/Users/Ystartsev/Work/debugger-sourcemaps/src/step-over-test.js"],"sourcesContent":[" \tfunction hotDisposeChunk(chunkId) {\n \t\tdelete installedChunks[chunkId];\n \t}\n \tvar parentHotUpdateCallback = this[\"webpackHotUpdate\"];\n \tthis[\"webpackHotUpdate\"] = \r\n \tfunction webpackHotUpdateCallback(chunkId, moreModules) { // eslint-disable-line no-unused-vars\r\n \t\thotAddUpdateChunk(chunkId, moreModules);\r\n \t\tif(parentHotUpdateCallback) parentHotUpdateCallback(chunkId, moreModules);\r\n \t} ;\r\n \t\r\n \tfunction hotDownloadUpdateChunk(chunkId) { // eslint-disable-line no-unused-vars\r\n \t\tvar head = document.getElementsByTagName(\"head\")[0];\r\n \t\tvar script = document.createElement(\"script\");\r\n \t\tscript.type = \"text/javascript\";\r\n \t\tscript.charset = \"utf-8\";\r\n \t\tscript.src = __webpack_require__.p + \"\" + chunkId + \".\" + hotCurrentHash + \".hot-update.js\";\r\n \t\t;\r\n \t\thead.appendChild(script);\r\n \t}\r\n \t\r\n \tfunction hotDownloadManifest(requestTimeout) { // eslint-disable-line no-unused-vars\r\n \t\trequestTimeout = requestTimeout || 10000;\r\n \t\treturn new Promise(function(resolve, reject) {\r\n \t\t\tif(typeof XMLHttpRequest === \"undefined\")\r\n \t\t\t\treturn reject(new Error(\"No browser support\"));\r\n \t\t\ttry {\r\n \t\t\t\tvar request = new XMLHttpRequest();\r\n \t\t\t\tvar requestPath = __webpack_require__.p + \"\" + hotCurrentHash + \".hot-update.json\";\r\n \t\t\t\trequest.open(\"GET\", requestPath, true);\r\n \t\t\t\trequest.timeout = requestTimeout;\r\n \t\t\t\trequest.send(null);\r\n \t\t\t} catch(err) {\r\n \t\t\t\treturn reject(err);\r\n \t\t\t}\r\n \t\t\trequest.onreadystatechange = function() {\r\n \t\t\t\tif(request.readyState !== 4) return;\r\n \t\t\t\tif(request.status === 0) {\r\n \t\t\t\t\t// timeout\r\n \t\t\t\t\treject(new Error(\"Manifest request to \" + requestPath + \" timed out.\"));\r\n \t\t\t\t} else if(request.status === 404) {\r\n \t\t\t\t\t// no update available\r\n \t\t\t\t\tresolve();\r\n \t\t\t\t} else if(request.status !== 200 && request.status !== 304) {\r\n \t\t\t\t\t// other failure\r\n \t\t\t\t\treject(new Error(\"Manifest request to \" + requestPath + \" failed.\"));\r\n \t\t\t\t} else {\r\n \t\t\t\t\t// success\r\n \t\t\t\t\ttry {\r\n \t\t\t\t\t\tvar update = JSON.parse(request.responseText);\r\n \t\t\t\t\t} catch(e) {\r\n \t\t\t\t\t\treject(e);\r\n \t\t\t\t\t\treturn;\r\n \t\t\t\t\t}\r\n \t\t\t\t\tresolve(update);\r\n \t\t\t\t}\r\n \t\t\t};\r\n \t\t});\r\n \t}\r\n\n \t\r\n \t\r\n \tvar hotApplyOnUpdate = true;\r\n \tvar hotCurrentHash = \"cbd3f28b2666e547679d\"; // eslint-disable-line no-unused-vars\r\n \tvar hotRequestTimeout = 10000;\r\n \tvar hotCurrentModuleData = {};\r\n \tvar hotCurrentChildModule; // eslint-disable-line no-unused-vars\r\n \tvar hotCurrentParents = []; // eslint-disable-line no-unused-vars\r\n \tvar hotCurrentParentsTemp = []; // eslint-disable-line no-unused-vars\r\n \t\r\n \tfunction hotCreateRequire(moduleId) { // eslint-disable-line no-unused-vars\r\n \t\tvar me = installedModules[moduleId];\r\n \t\tif(!me) return __webpack_require__;\r\n \t\tvar fn = function(request) {\r\n \t\t\tif(me.hot.active) {\r\n \t\t\t\tif(installedModules[request]) {\r\n \t\t\t\t\tif(installedModules[request].parents.indexOf(moduleId) < 0)\r\n \t\t\t\t\t\tinstalledModules[request].parents.push(moduleId);\r\n \t\t\t\t} else {\r\n \t\t\t\t\thotCurrentParents = [moduleId];\r\n \t\t\t\t\thotCurrentChildModule = request;\r\n \t\t\t\t}\r\n \t\t\t\tif(me.children.indexOf(request) < 0)\r\n \t\t\t\t\tme.children.push(request);\r\n \t\t\t} else {\r\n \t\t\t\tconsole.warn(\"[HMR] unexpected require(\" + request + \") from disposed module \" + moduleId);\r\n \t\t\t\thotCurrentParents = [];\r\n \t\t\t}\r\n \t\t\treturn __webpack_require__(request);\r\n \t\t};\r\n \t\tvar ObjectFactory = function ObjectFactory(name) {\r\n \t\t\treturn {\r\n \t\t\t\tconfigurable: true,\r\n \t\t\t\tenumerable: true,\r\n \t\t\t\tget: function() {\r\n \t\t\t\t\treturn __webpack_require__[name];\r\n \t\t\t\t},\r\n \t\t\t\tset: function(value) {\r\n \t\t\t\t\t__webpack_require__[name] = value;\r\n \t\t\t\t}\r\n \t\t\t};\r\n \t\t};\r\n \t\tfor(var name in __webpack_require__) {\r\n \t\t\tif(Object.prototype.hasOwnProperty.call(__webpack_require__, name) && name !== \"e\") {\r\n \t\t\t\tObject.defineProperty(fn, name, ObjectFactory(name));\r\n \t\t\t}\r\n \t\t}\r\n \t\tfn.e = function(chunkId) {\r\n \t\t\tif(hotStatus === \"ready\")\r\n \t\t\t\thotSetStatus(\"prepare\");\r\n \t\t\thotChunksLoading++;\r\n \t\t\treturn __webpack_require__.e(chunkId).then(finishChunkLoading, function(err) {\r\n \t\t\t\tfinishChunkLoading();\r\n \t\t\t\tthrow err;\r\n \t\t\t});\r\n \t\r\n \t\t\tfunction finishChunkLoading() {\r\n \t\t\t\thotChunksLoading--;\r\n \t\t\t\tif(hotStatus === \"prepare\") {\r\n \t\t\t\t\tif(!hotWaitingFilesMap[chunkId]) {\r\n \t\t\t\t\t\thotEnsureUpdateChunk(chunkId);\r\n \t\t\t\t\t}\r\n \t\t\t\t\tif(hotChunksLoading === 0 && hotWaitingFiles === 0) {\r\n \t\t\t\t\t\thotUpdateDownloaded();\r\n \t\t\t\t\t}\r\n \t\t\t\t}\r\n \t\t\t}\r\n \t\t};\r\n \t\treturn fn;\r\n \t}\r\n \t\r\n \tfunction hotCreateModule(moduleId) { // eslint-disable-line no-unused-vars\r\n \t\tvar hot = {\r\n \t\t\t// private stuff\r\n \t\t\t_acceptedDependencies: {},\r\n \t\t\t_declinedDependencies: {},\r\n \t\t\t_selfAccepted: false,\r\n \t\t\t_selfDeclined: false,\r\n \t\t\t_disposeHandlers: [],\r\n \t\t\t_main: hotCurrentChildModule !== moduleId,\r\n \t\r\n \t\t\t// Module API\r\n \t\t\tactive: true,\r\n \t\t\taccept: function(dep, callback) {\r\n \t\t\t\tif(typeof dep === \"undefined\")\r\n \t\t\t\t\thot._selfAccepted = true;\r\n \t\t\t\telse if(typeof dep === \"function\")\r\n \t\t\t\t\thot._selfAccepted = dep;\r\n \t\t\t\telse if(typeof dep === \"object\")\r\n \t\t\t\t\tfor(var i = 0; i < dep.length; i++)\r\n \t\t\t\t\t\thot._acceptedDependencies[dep[i]] = callback || function() {};\r\n \t\t\t\telse\r\n \t\t\t\t\thot._acceptedDependencies[dep] = callback || function() {};\r\n \t\t\t},\r\n \t\t\tdecline: function(dep) {\r\n \t\t\t\tif(typeof dep === \"undefined\")\r\n \t\t\t\t\thot._selfDeclined = true;\r\n \t\t\t\telse if(typeof dep === \"object\")\r\n \t\t\t\t\tfor(var i = 0; i < dep.length; i++)\r\n \t\t\t\t\t\thot._declinedDependencies[dep[i]] = true;\r\n \t\t\t\telse\r\n \t\t\t\t\thot._declinedDependencies[dep] = true;\r\n \t\t\t},\r\n \t\t\tdispose: function(callback) {\r\n \t\t\t\thot._disposeHandlers.push(callback);\r\n \t\t\t},\r\n \t\t\taddDisposeHandler: function(callback) {\r\n \t\t\t\thot._disposeHandlers.push(callback);\r\n \t\t\t},\r\n \t\t\tremoveDisposeHandler: function(callback) {\r\n \t\t\t\tvar idx = hot._disposeHandlers.indexOf(callback);\r\n \t\t\t\tif(idx >= 0) hot._disposeHandlers.splice(idx, 1);\r\n \t\t\t},\r\n \t\r\n \t\t\t// Management API\r\n \t\t\tcheck: hotCheck,\r\n \t\t\tapply: hotApply,\r\n \t\t\tstatus: function(l) {\r\n \t\t\t\tif(!l) return hotStatus;\r\n \t\t\t\thotStatusHandlers.push(l);\r\n \t\t\t},\r\n \t\t\taddStatusHandler: function(l) {\r\n \t\t\t\thotStatusHandlers.push(l);\r\n \t\t\t},\r\n \t\t\tremoveStatusHandler: function(l) {\r\n \t\t\t\tvar idx = hotStatusHandlers.indexOf(l);\r\n \t\t\t\tif(idx >= 0) hotStatusHandlers.splice(idx, 1);\r\n \t\t\t},\r\n \t\r\n \t\t\t//inherit from previous dispose call\r\n \t\t\tdata: hotCurrentModuleData[moduleId]\r\n \t\t};\r\n \t\thotCurrentChildModule = undefined;\r\n \t\treturn hot;\r\n \t}\r\n \t\r\n \tvar hotStatusHandlers = [];\r\n \tvar hotStatus = \"idle\";\r\n \t\r\n \tfunction hotSetStatus(newStatus) {\r\n \t\thotStatus = newStatus;\r\n \t\tfor(var i = 0; i < hotStatusHandlers.length; i++)\r\n \t\t\thotStatusHandlers[i].call(null, newStatus);\r\n \t}\r\n \t\r\n \t// while downloading\r\n \tvar hotWaitingFiles = 0;\r\n \tvar hotChunksLoading = 0;\r\n \tvar hotWaitingFilesMap = {};\r\n \tvar hotRequestedFilesMap = {};\r\n \tvar hotAvailableFilesMap = {};\r\n \tvar hotDeferred;\r\n \t\r\n \t// The update info\r\n \tvar hotUpdate, hotUpdateNewHash;\r\n \t\r\n \tfunction toModuleId(id) {\r\n \t\tvar isNumber = (+id) + \"\" === id;\r\n \t\treturn isNumber ? +id : id;\r\n \t}\r\n \t\r\n \tfunction hotCheck(apply) {\r\n \t\tif(hotStatus !== \"idle\") throw new Error(\"check() is only allowed in idle status\");\r\n \t\thotApplyOnUpdate = apply;\r\n \t\thotSetStatus(\"check\");\r\n \t\treturn hotDownloadManifest(hotRequestTimeout).then(function(update) {\r\n \t\t\tif(!update) {\r\n \t\t\t\thotSetStatus(\"idle\");\r\n \t\t\t\treturn null;\r\n \t\t\t}\r\n \t\t\thotRequestedFilesMap = {};\r\n \t\t\thotWaitingFilesMap = {};\r\n \t\t\thotAvailableFilesMap = update.c;\r\n \t\t\thotUpdateNewHash = update.h;\r\n \t\r\n \t\t\thotSetStatus(\"prepare\");\r\n \t\t\tvar promise = new Promise(function(resolve, reject) {\r\n \t\t\t\thotDeferred = {\r\n \t\t\t\t\tresolve: resolve,\r\n \t\t\t\t\treject: reject\r\n \t\t\t\t};\r\n \t\t\t});\r\n \t\t\thotUpdate = {};\r\n \t\t\tvar chunkId = 0;\r\n \t\t\t{ // eslint-disable-line no-lone-blocks\r\n \t\t\t\t/*globals chunkId */\r\n \t\t\t\thotEnsureUpdateChunk(chunkId);\r\n \t\t\t}\r\n \t\t\tif(hotStatus === \"prepare\" && hotChunksLoading === 0 && hotWaitingFiles === 0) {\r\n \t\t\t\thotUpdateDownloaded();\r\n \t\t\t}\r\n \t\t\treturn promise;\r\n \t\t});\r\n \t}\r\n \t\r\n \tfunction hotAddUpdateChunk(chunkId, moreModules) { // eslint-disable-line no-unused-vars\r\n \t\tif(!hotAvailableFilesMap[chunkId] || !hotRequestedFilesMap[chunkId])\r\n \t\t\treturn;\r\n \t\thotRequestedFilesMap[chunkId] = false;\r\n \t\tfor(var moduleId in moreModules) {\r\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\r\n \t\t\t\thotUpdate[moduleId] = moreModules[moduleId];\r\n \t\t\t}\r\n \t\t}\r\n \t\tif(--hotWaitingFiles === 0 && hotChunksLoading === 0) {\r\n \t\t\thotUpdateDownloaded();\r\n \t\t}\r\n \t}\r\n \t\r\n \tfunction hotEnsureUpdateChunk(chunkId) {\r\n \t\tif(!hotAvailableFilesMap[chunkId]) {\r\n \t\t\thotWaitingFilesMap[chunkId] = true;\r\n \t\t} else {\r\n \t\t\thotRequestedFilesMap[chunkId] = true;\r\n \t\t\thotWaitingFiles++;\r\n \t\t\thotDownloadUpdateChunk(chunkId);\r\n \t\t}\r\n \t}\r\n \t\r\n \tfunction hotUpdateDownloaded() {\r\n \t\thotSetStatus(\"ready\");\r\n \t\tvar deferred = hotDeferred;\r\n \t\thotDeferred = null;\r\n \t\tif(!deferred) return;\r\n \t\tif(hotApplyOnUpdate) {\r\n \t\t\t// Wrap deferred object in Promise to mark it as a well-handled Promise to\r\n \t\t\t// avoid triggering uncaught exception warning in Chrome.\r\n \t\t\t// See https://bugs.chromium.org/p/chromium/issues/detail?id=465666\r\n \t\t\tPromise.resolve().then(function() {\r\n \t\t\t\treturn hotApply(hotApplyOnUpdate);\r\n \t\t\t}).then(\r\n \t\t\t\tfunction(result) {\r\n \t\t\t\t\tdeferred.resolve(result);\r\n \t\t\t\t},\r\n \t\t\t\tfunction(err) {\r\n \t\t\t\t\tdeferred.reject(err);\r\n \t\t\t\t}\r\n \t\t\t);\r\n \t\t} else {\r\n \t\t\tvar outdatedModules = [];\r\n \t\t\tfor(var id in hotUpdate) {\r\n \t\t\t\tif(Object.prototype.hasOwnProperty.call(hotUpdate, id)) {\r\n \t\t\t\t\toutdatedModules.push(toModuleId(id));\r\n \t\t\t\t}\r\n \t\t\t}\r\n \t\t\tdeferred.resolve(outdatedModules);\r\n \t\t}\r\n \t}\r\n \t\r\n \tfunction hotApply(options) {\r\n \t\tif(hotStatus !== \"ready\") throw new Error(\"apply() is only allowed in ready status\");\r\n \t\toptions = options || {};\r\n \t\r\n \t\tvar cb;\r\n \t\tvar i;\r\n \t\tvar j;\r\n \t\tvar module;\r\n \t\tvar moduleId;\r\n \t\r\n \t\tfunction getAffectedStuff(updateModuleId) {\r\n \t\t\tvar outdatedModules = [updateModuleId];\r\n \t\t\tvar outdatedDependencies = {};\r\n \t\r\n \t\t\tvar queue = outdatedModules.slice().map(function(id) {\r\n \t\t\t\treturn {\r\n \t\t\t\t\tchain: [id],\r\n \t\t\t\t\tid: id\r\n \t\t\t\t};\r\n \t\t\t});\r\n \t\t\twhile(queue.length > 0) {\r\n \t\t\t\tvar queueItem = queue.pop();\r\n \t\t\t\tvar moduleId = queueItem.id;\r\n \t\t\t\tvar chain = queueItem.chain;\r\n \t\t\t\tmodule = installedModules[moduleId];\r\n \t\t\t\tif(!module || module.hot._selfAccepted)\r\n \t\t\t\t\tcontinue;\r\n \t\t\t\tif(module.hot._selfDeclined) {\r\n \t\t\t\t\treturn {\r\n \t\t\t\t\t\ttype: \"self-declined\",\r\n \t\t\t\t\t\tchain: chain,\r\n \t\t\t\t\t\tmoduleId: moduleId\r\n \t\t\t\t\t};\r\n \t\t\t\t}\r\n \t\t\t\tif(module.hot._main) {\r\n \t\t\t\t\treturn {\r\n \t\t\t\t\t\ttype: \"unaccepted\",\r\n \t\t\t\t\t\tchain: chain,\r\n \t\t\t\t\t\tmoduleId: moduleId\r\n \t\t\t\t\t};\r\n \t\t\t\t}\r\n \t\t\t\tfor(var i = 0; i < module.parents.length; i++) {\r\n \t\t\t\t\tvar parentId = module.parents[i];\r\n \t\t\t\t\tvar parent = installedModules[parentId];\r\n \t\t\t\t\tif(!parent) continue;\r\n \t\t\t\t\tif(parent.hot._declinedDependencies[moduleId]) {\r\n \t\t\t\t\t\treturn {\r\n \t\t\t\t\t\t\ttype: \"declined\",\r\n \t\t\t\t\t\t\tchain: chain.concat([parentId]),\r\n \t\t\t\t\t\t\tmoduleId: moduleId,\r\n \t\t\t\t\t\t\tparentId: parentId\r\n \t\t\t\t\t\t};\r\n \t\t\t\t\t}\r\n \t\t\t\t\tif(outdatedModules.indexOf(parentId) >= 0) continue;\r\n \t\t\t\t\tif(parent.hot._acceptedDependencies[moduleId]) {\r\n \t\t\t\t\t\tif(!outdatedDependencies[parentId])\r\n \t\t\t\t\t\t\toutdatedDependencies[parentId] = [];\r\n \t\t\t\t\t\taddAllToSet(outdatedDependencies[parentId], [moduleId]);\r\n \t\t\t\t\t\tcontinue;\r\n \t\t\t\t\t}\r\n \t\t\t\t\tdelete outdatedDependencies[parentId];\r\n \t\t\t\t\toutdatedModules.push(parentId);\r\n \t\t\t\t\tqueue.push({\r\n \t\t\t\t\t\tchain: chain.concat([parentId]),\r\n \t\t\t\t\t\tid: parentId\r\n \t\t\t\t\t});\r\n \t\t\t\t}\r\n \t\t\t}\r\n \t\r\n \t\t\treturn {\r\n \t\t\t\ttype: \"accepted\",\r\n \t\t\t\tmoduleId: updateModuleId,\r\n \t\t\t\toutdatedModules: outdatedModules,\r\n \t\t\t\toutdatedDependencies: outdatedDependencies\r\n \t\t\t};\r\n \t\t}\r\n \t\r\n \t\tfunction addAllToSet(a, b) {\r\n \t\t\tfor(var i = 0; i < b.length; i++) {\r\n \t\t\t\tvar item = b[i];\r\n \t\t\t\tif(a.indexOf(item) < 0)\r\n \t\t\t\t\ta.push(item);\r\n \t\t\t}\r\n \t\t}\r\n \t\r\n \t\t// at begin all updates modules are outdated\r\n \t\t// the \"outdated\" status can propagate to parents if they don't accept the children\r\n \t\tvar outdatedDependencies = {};\r\n \t\tvar outdatedModules = [];\r\n \t\tvar appliedUpdate = {};\r\n \t\r\n \t\tvar warnUnexpectedRequire = function warnUnexpectedRequire() {\r\n \t\t\tconsole.warn(\"[HMR] unexpected require(\" + result.moduleId + \") to disposed module\");\r\n \t\t};\r\n \t\r\n \t\tfor(var id in hotUpdate) {\r\n \t\t\tif(Object.prototype.hasOwnProperty.call(hotUpdate, id)) {\r\n \t\t\t\tmoduleId = toModuleId(id);\r\n \t\t\t\tvar result;\r\n \t\t\t\tif(hotUpdate[id]) {\r\n \t\t\t\t\tresult = getAffectedStuff(moduleId);\r\n \t\t\t\t} else {\r\n \t\t\t\t\tresult = {\r\n \t\t\t\t\t\ttype: \"disposed\",\r\n \t\t\t\t\t\tmoduleId: id\r\n \t\t\t\t\t};\r\n \t\t\t\t}\r\n \t\t\t\tvar abortError = false;\r\n \t\t\t\tvar doApply = false;\r\n \t\t\t\tvar doDispose = false;\r\n \t\t\t\tvar chainInfo = \"\";\r\n \t\t\t\tif(result.chain) {\r\n \t\t\t\t\tchainInfo = \"\\nUpdate propagation: \" + result.chain.join(\" -> \");\r\n \t\t\t\t}\r\n \t\t\t\tswitch(result.type) {\r\n \t\t\t\t\tcase \"self-declined\":\r\n \t\t\t\t\t\tif(options.onDeclined)\r\n \t\t\t\t\t\t\toptions.onDeclined(result);\r\n \t\t\t\t\t\tif(!options.ignoreDeclined)\r\n \t\t\t\t\t\t\tabortError = new Error(\"Aborted because of self decline: \" + result.moduleId + chainInfo);\r\n \t\t\t\t\t\tbreak;\r\n \t\t\t\t\tcase \"declined\":\r\n \t\t\t\t\t\tif(options.onDeclined)\r\n \t\t\t\t\t\t\toptions.onDeclined(result);\r\n \t\t\t\t\t\tif(!options.ignoreDeclined)\r\n \t\t\t\t\t\t\tabortError = new Error(\"Aborted because of declined dependency: \" + result.moduleId + \" in \" + result.parentId + chainInfo);\r\n \t\t\t\t\t\tbreak;\r\n \t\t\t\t\tcase \"unaccepted\":\r\n \t\t\t\t\t\tif(options.onUnaccepted)\r\n \t\t\t\t\t\t\toptions.onUnaccepted(result);\r\n \t\t\t\t\t\tif(!options.ignoreUnaccepted)\r\n \t\t\t\t\t\t\tabortError = new Error(\"Aborted because \" + moduleId + \" is not accepted\" + chainInfo);\r\n \t\t\t\t\t\tbreak;\r\n \t\t\t\t\tcase \"accepted\":\r\n \t\t\t\t\t\tif(options.onAccepted)\r\n \t\t\t\t\t\t\toptions.onAccepted(result);\r\n \t\t\t\t\t\tdoApply = true;\r\n \t\t\t\t\t\tbreak;\r\n \t\t\t\t\tcase \"disposed\":\r\n \t\t\t\t\t\tif(options.onDisposed)\r\n \t\t\t\t\t\t\toptions.onDisposed(result);\r\n \t\t\t\t\t\tdoDispose = true;\r\n \t\t\t\t\t\tbreak;\r\n \t\t\t\t\tdefault:\r\n \t\t\t\t\t\tthrow new Error(\"Unexception type \" + result.type);\r\n \t\t\t\t}\r\n \t\t\t\tif(abortError) {\r\n \t\t\t\t\thotSetStatus(\"abort\");\r\n \t\t\t\t\treturn Promise.reject(abortError);\r\n \t\t\t\t}\r\n \t\t\t\tif(doApply) {\r\n \t\t\t\t\tappliedUpdate[moduleId] = hotUpdate[moduleId];\r\n \t\t\t\t\taddAllToSet(outdatedModules, result.outdatedModules);\r\n \t\t\t\t\tfor(moduleId in result.outdatedDependencies) {\r\n \t\t\t\t\t\tif(Object.prototype.hasOwnProperty.call(result.outdatedDependencies, moduleId)) {\r\n \t\t\t\t\t\t\tif(!outdatedDependencies[moduleId])\r\n \t\t\t\t\t\t\t\toutdatedDependencies[moduleId] = [];\r\n \t\t\t\t\t\t\taddAllToSet(outdatedDependencies[moduleId], result.outdatedDependencies[moduleId]);\r\n \t\t\t\t\t\t}\r\n \t\t\t\t\t}\r\n \t\t\t\t}\r\n \t\t\t\tif(doDispose) {\r\n \t\t\t\t\taddAllToSet(outdatedModules, [result.moduleId]);\r\n \t\t\t\t\tappliedUpdate[moduleId] = warnUnexpectedRequire;\r\n \t\t\t\t}\r\n \t\t\t}\r\n \t\t}\r\n \t\r\n \t\t// Store self accepted outdated modules to require them later by the module system\r\n \t\tvar outdatedSelfAcceptedModules = [];\r\n \t\tfor(i = 0; i < outdatedModules.length; i++) {\r\n \t\t\tmoduleId = outdatedModules[i];\r\n \t\t\tif(installedModules[moduleId] && installedModules[moduleId].hot._selfAccepted)\r\n \t\t\t\toutdatedSelfAcceptedModules.push({\r\n \t\t\t\t\tmodule: moduleId,\r\n \t\t\t\t\terrorHandler: installedModules[moduleId].hot._selfAccepted\r\n \t\t\t\t});\r\n \t\t}\r\n \t\r\n \t\t// Now in \"dispose\" phase\r\n \t\thotSetStatus(\"dispose\");\r\n \t\tObject.keys(hotAvailableFilesMap).forEach(function(chunkId) {\r\n \t\t\tif(hotAvailableFilesMap[chunkId] === false) {\r\n \t\t\t\thotDisposeChunk(chunkId);\r\n \t\t\t}\r\n \t\t});\r\n \t\r\n \t\tvar idx;\r\n \t\tvar queue = outdatedModules.slice();\r\n \t\twhile(queue.length > 0) {\r\n \t\t\tmoduleId = queue.pop();\r\n \t\t\tmodule = installedModules[moduleId];\r\n \t\t\tif(!module) continue;\r\n \t\r\n \t\t\tvar data = {};\r\n \t\r\n \t\t\t// Call dispose handlers\r\n \t\t\tvar disposeHandlers = module.hot._disposeHandlers;\r\n \t\t\tfor(j = 0; j < disposeHandlers.length; j++) {\r\n \t\t\t\tcb = disposeHandlers[j];\r\n \t\t\t\tcb(data);\r\n \t\t\t}\r\n \t\t\thotCurrentModuleData[moduleId] = data;\r\n \t\r\n \t\t\t// disable module (this disables requires from this module)\r\n \t\t\tmodule.hot.active = false;\r\n \t\r\n \t\t\t// remove module from cache\r\n \t\t\tdelete installedModules[moduleId];\r\n \t\r\n \t\t\t// when disposing there is no need to call dispose handler\r\n \t\t\tdelete outdatedDependencies[moduleId];\r\n \t\r\n \t\t\t// remove \"parents\" references from all children\r\n \t\t\tfor(j = 0; j < module.children.length; j++) {\r\n \t\t\t\tvar child = installedModules[module.children[j]];\r\n \t\t\t\tif(!child) continue;\r\n \t\t\t\tidx = child.parents.indexOf(moduleId);\r\n \t\t\t\tif(idx >= 0) {\r\n \t\t\t\t\tchild.parents.splice(idx, 1);\r\n \t\t\t\t}\r\n \t\t\t}\r\n \t\t}\r\n \t\r\n \t\t// remove outdated dependency from module children\r\n \t\tvar dependency;\r\n \t\tvar moduleOutdatedDependencies;\r\n \t\tfor(moduleId in outdatedDependencies) {\r\n \t\t\tif(Object.prototype.hasOwnProperty.call(outdatedDependencies, moduleId)) {\r\n \t\t\t\tmodule = installedModules[moduleId];\r\n \t\t\t\tif(module) {\r\n \t\t\t\t\tmoduleOutdatedDependencies = outdatedDependencies[moduleId];\r\n \t\t\t\t\tfor(j = 0; j < moduleOutdatedDependencies.length; j++) {\r\n \t\t\t\t\t\tdependency = moduleOutdatedDependencies[j];\r\n \t\t\t\t\t\tidx = module.children.indexOf(dependency);\r\n \t\t\t\t\t\tif(idx >= 0) module.children.splice(idx, 1);\r\n \t\t\t\t\t}\r\n \t\t\t\t}\r\n \t\t\t}\r\n \t\t}\r\n \t\r\n \t\t// Not in \"apply\" phase\r\n \t\thotSetStatus(\"apply\");\r\n \t\r\n \t\thotCurrentHash = hotUpdateNewHash;\r\n \t\r\n \t\t// insert new code\r\n \t\tfor(moduleId in appliedUpdate) {\r\n \t\t\tif(Object.prototype.hasOwnProperty.call(appliedUpdate, moduleId)) {\r\n \t\t\t\tmodules[moduleId] = appliedUpdate[moduleId];\r\n \t\t\t}\r\n \t\t}\r\n \t\r\n \t\t// call accept handlers\r\n \t\tvar error = null;\r\n \t\tfor(moduleId in outdatedDependencies) {\r\n \t\t\tif(Object.prototype.hasOwnProperty.call(outdatedDependencies, moduleId)) {\r\n \t\t\t\tmodule = installedModules[moduleId];\r\n \t\t\t\tif(module) {\r\n \t\t\t\t\tmoduleOutdatedDependencies = outdatedDependencies[moduleId];\r\n \t\t\t\t\tvar callbacks = [];\r\n \t\t\t\t\tfor(i = 0; i < moduleOutdatedDependencies.length; i++) {\r\n \t\t\t\t\t\tdependency = moduleOutdatedDependencies[i];\r\n \t\t\t\t\t\tcb = module.hot._acceptedDependencies[dependency];\r\n \t\t\t\t\t\tif(cb) {\r\n \t\t\t\t\t\t\tif(callbacks.indexOf(cb) >= 0) continue;\r\n \t\t\t\t\t\t\tcallbacks.push(cb);\r\n \t\t\t\t\t\t}\r\n \t\t\t\t\t}\r\n \t\t\t\t\tfor(i = 0; i < callbacks.length; i++) {\r\n \t\t\t\t\t\tcb = callbacks[i];\r\n \t\t\t\t\t\ttry {\r\n \t\t\t\t\t\t\tcb(moduleOutdatedDependencies);\r\n \t\t\t\t\t\t} catch(err) {\r\n \t\t\t\t\t\t\tif(options.onErrored) {\r\n \t\t\t\t\t\t\t\toptions.onErrored({\r\n \t\t\t\t\t\t\t\t\ttype: \"accept-errored\",\r\n \t\t\t\t\t\t\t\t\tmoduleId: moduleId,\r\n \t\t\t\t\t\t\t\t\tdependencyId: moduleOutdatedDependencies[i],\r\n \t\t\t\t\t\t\t\t\terror: err\r\n \t\t\t\t\t\t\t\t});\r\n \t\t\t\t\t\t\t}\r\n \t\t\t\t\t\t\tif(!options.ignoreErrored) {\r\n \t\t\t\t\t\t\t\tif(!error)\r\n \t\t\t\t\t\t\t\t\terror = err;\r\n \t\t\t\t\t\t\t}\r\n \t\t\t\t\t\t}\r\n \t\t\t\t\t}\r\n \t\t\t\t}\r\n \t\t\t}\r\n \t\t}\r\n \t\r\n \t\t// Load self accepted modules\r\n \t\tfor(i = 0; i < outdatedSelfAcceptedModules.length; i++) {\r\n \t\t\tvar item = outdatedSelfAcceptedModules[i];\r\n \t\t\tmoduleId = item.module;\r\n \t\t\thotCurrentParents = [moduleId];\r\n \t\t\ttry {\r\n \t\t\t\t__webpack_require__(moduleId);\r\n \t\t\t} catch(err) {\r\n \t\t\t\tif(typeof item.errorHandler === \"function\") {\r\n \t\t\t\t\ttry {\r\n \t\t\t\t\t\titem.errorHandler(err);\r\n \t\t\t\t\t} catch(err2) {\r\n \t\t\t\t\t\tif(options.onErrored) {\r\n \t\t\t\t\t\t\toptions.onErrored({\r\n \t\t\t\t\t\t\t\ttype: \"self-accept-error-handler-errored\",\r\n \t\t\t\t\t\t\t\tmoduleId: moduleId,\r\n \t\t\t\t\t\t\t\terror: err2,\r\n \t\t\t\t\t\t\t\torginalError: err, // TODO remove in webpack 4\r\n \t\t\t\t\t\t\t\toriginalError: err\r\n \t\t\t\t\t\t\t});\r\n \t\t\t\t\t\t}\r\n \t\t\t\t\t\tif(!options.ignoreErrored) {\r\n \t\t\t\t\t\t\tif(!error)\r\n \t\t\t\t\t\t\t\terror = err2;\r\n \t\t\t\t\t\t}\r\n \t\t\t\t\t\tif(!error)\r\n \t\t\t\t\t\t\terror = err;\r\n \t\t\t\t\t}\r\n \t\t\t\t} else {\r\n \t\t\t\t\tif(options.onErrored) {\r\n \t\t\t\t\t\toptions.onErrored({\r\n \t\t\t\t\t\t\ttype: \"self-accept-errored\",\r\n \t\t\t\t\t\t\tmoduleId: moduleId,\r\n \t\t\t\t\t\t\terror: err\r\n \t\t\t\t\t\t});\r\n \t\t\t\t\t}\r\n \t\t\t\t\tif(!options.ignoreErrored) {\r\n \t\t\t\t\t\tif(!error)\r\n \t\t\t\t\t\t\terror = err;\r\n \t\t\t\t\t}\r\n \t\t\t\t}\r\n \t\t\t}\r\n \t\t}\r\n \t\r\n \t\t// handle errors in accept handlers and self accepted module load\r\n \t\tif(error) {\r\n \t\t\thotSetStatus(\"fail\");\r\n \t\t\treturn Promise.reject(error);\r\n \t\t}\r\n \t\r\n \t\thotSetStatus(\"idle\");\r\n \t\treturn new Promise(function(resolve) {\r\n \t\t\tresolve(outdatedModules);\r\n \t\t});\r\n \t}\r\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {},\n \t\t\thot: hotCreateModule(moduleId),\n \t\t\tparents: (hotCurrentParentsTemp = hotCurrentParents, hotCurrentParents = [], hotCurrentParentsTemp),\n \t\t\tchildren: []\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, hotCreateRequire(moduleId));\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \t// __webpack_hash__\n \t__webpack_require__.h = function() { return hotCurrentHash; };\n\n \t// Load entry module and return exports\n \treturn hotCreateRequire(0)(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap cbd3f28b2666e547679d","'use strict';\nmodule.exports = function () {\n\treturn /[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-PRZcf-nqry=><]/g;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/ansi-regex/index.js\n// module id = ./node_modules/ansi-regex/index.js\n// module chunks = 0","'use strict';\n\nfunction assembleStyles () {\n\tvar styles = {\n\t\tmodifiers: {\n\t\t\treset: [0, 0],\n\t\t\tbold: [1, 22], // 21 isn't widely supported and 22 does the same thing\n\t\t\tdim: [2, 22],\n\t\t\titalic: [3, 23],\n\t\t\tunderline: [4, 24],\n\t\t\tinverse: [7, 27],\n\t\t\thidden: [8, 28],\n\t\t\tstrikethrough: [9, 29]\n\t\t},\n\t\tcolors: {\n\t\t\tblack: [30, 39],\n\t\t\tred: [31, 39],\n\t\t\tgreen: [32, 39],\n\t\t\tyellow: [33, 39],\n\t\t\tblue: [34, 39],\n\t\t\tmagenta: [35, 39],\n\t\t\tcyan: [36, 39],\n\t\t\twhite: [37, 39],\n\t\t\tgray: [90, 39]\n\t\t},\n\t\tbgColors: {\n\t\t\tbgBlack: [40, 49],\n\t\t\tbgRed: [41, 49],\n\t\t\tbgGreen: [42, 49],\n\t\t\tbgYellow: [43, 49],\n\t\t\tbgBlue: [44, 49],\n\t\t\tbgMagenta: [45, 49],\n\t\t\tbgCyan: [46, 49],\n\t\t\tbgWhite: [47, 49]\n\t\t}\n\t};\n\n\t// fix humans\n\tstyles.colors.grey = styles.colors.gray;\n\n\tObject.keys(styles).forEach(function (groupName) {\n\t\tvar group = styles[groupName];\n\n\t\tObject.keys(group).forEach(function (styleName) {\n\t\t\tvar style = group[styleName];\n\n\t\t\tstyles[styleName] = group[styleName] = {\n\t\t\t\topen: '\\u001b[' + style[0] + 'm',\n\t\t\t\tclose: '\\u001b[' + style[1] + 'm'\n\t\t\t};\n\t\t});\n\n\t\tObject.defineProperty(styles, groupName, {\n\t\t\tvalue: group,\n\t\t\tenumerable: false\n\t\t});\n\t});\n\n\treturn styles;\n}\n\nObject.defineProperty(module, 'exports', {\n\tenumerable: true,\n\tget: assembleStyles\n});\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/ansi-styles/index.js\n// module id = ./node_modules/ansi-styles/index.js\n// module chunks = 0","\"use strict\";\n\n// Use the fastest means possible to execute a task in its own turn, with\n// priority over other events including IO, animation, reflow, and redraw\n// events in browsers.\n//\n// An exception thrown by a task will permanently interrupt the processing of\n// subsequent tasks. The higher level `asap` function ensures that if an\n// exception is thrown by a task, that the task queue will continue flushing as\n// soon as possible, but if you use `rawAsap` directly, you are responsible to\n// either ensure that no exceptions are thrown from your task, or to manually\n// call `rawAsap.requestFlush` if an exception is thrown.\nmodule.exports = rawAsap;\nfunction rawAsap(task) {\n if (!queue.length) {\n requestFlush();\n flushing = true;\n }\n // Equivalent to push, but avoids a function call.\n queue[queue.length] = task;\n}\n\nvar queue = [];\n// Once a flush has been requested, no further calls to `requestFlush` are\n// necessary until the next `flush` completes.\nvar flushing = false;\n// `requestFlush` is an implementation-specific method that attempts to kick\n// off a `flush` event as quickly as possible. `flush` will attempt to exhaust\n// the event queue before yielding to the browser's own event loop.\nvar requestFlush;\n// The position of the next task to execute in the task queue. This is\n// preserved between calls to `flush` so that it can be resumed if\n// a task throws an exception.\nvar index = 0;\n// If a task schedules additional tasks recursively, the task queue can grow\n// unbounded. To prevent memory exhaustion, the task queue will periodically\n// truncate already-completed tasks.\nvar capacity = 1024;\n\n// The flush function processes all tasks that have been scheduled with\n// `rawAsap` unless and until one of those tasks throws an exception.\n// If a task throws an exception, `flush` ensures that its state will remain\n// consistent and will resume where it left off when called again.\n// However, `flush` does not make any arrangements to be called again if an\n// exception is thrown.\nfunction flush() {\n while (index < queue.length) {\n var currentIndex = index;\n // Advance the index before calling the task. This ensures that we will\n // begin flushing on the next task the task throws an error.\n index = index + 1;\n queue[currentIndex].call();\n // Prevent leaking memory for long chains of recursive calls to `asap`.\n // If we call `asap` within tasks scheduled by `asap`, the queue will\n // grow, but to avoid an O(n) walk for every task we execute, we don't\n // shift tasks off the queue after they have been executed.\n // Instead, we periodically shift 1024 tasks off the queue.\n if (index > capacity) {\n // Manually shift all values starting at the index back to the\n // beginning of the queue.\n for (var scan = 0, newLength = queue.length - index; scan < newLength; scan++) {\n queue[scan] = queue[scan + index];\n }\n queue.length -= index;\n index = 0;\n }\n }\n queue.length = 0;\n index = 0;\n flushing = false;\n}\n\n// `requestFlush` is implemented using a strategy based on data collected from\n// every available SauceLabs Selenium web driver worker at time of writing.\n// https://docs.google.com/spreadsheets/d/1mG-5UYGup5qxGdEMWkhP6BWCz053NUb2E1QoUTU16uA/edit#gid=783724593\n\n// Safari 6 and 6.1 for desktop, iPad, and iPhone are the only browsers that\n// have WebKitMutationObserver but not un-prefixed MutationObserver.\n// Must use `global` or `self` instead of `window` to work in both frames and web\n// workers. `global` is a provision of Browserify, Mr, Mrs, or Mop.\n\n/* globals self */\nvar scope = typeof global !== \"undefined\" ? global : self;\nvar BrowserMutationObserver = scope.MutationObserver || scope.WebKitMutationObserver;\n\n// MutationObservers are desirable because they have high priority and work\n// reliably everywhere they are implemented.\n// They are implemented in all modern browsers.\n//\n// - Android 4-4.3\n// - Chrome 26-34\n// - Firefox 14-29\n// - Internet Explorer 11\n// - iPad Safari 6-7.1\n// - iPhone Safari 7-7.1\n// - Safari 6-7\nif (typeof BrowserMutationObserver === \"function\") {\n requestFlush = makeRequestCallFromMutationObserver(flush);\n\n// MessageChannels are desirable because they give direct access to the HTML\n// task queue, are implemented in Internet Explorer 10, Safari 5.0-1, and Opera\n// 11-12, and in web workers in many engines.\n// Although message channels yield to any queued rendering and IO tasks, they\n// would be better than imposing the 4ms delay of timers.\n// However, they do not work reliably in Internet Explorer or Safari.\n\n// Internet Explorer 10 is the only browser that has setImmediate but does\n// not have MutationObservers.\n// Although setImmediate yields to the browser's renderer, it would be\n// preferrable to falling back to setTimeout since it does not have\n// the minimum 4ms penalty.\n// Unfortunately there appears to be a bug in Internet Explorer 10 Mobile (and\n// Desktop to a lesser extent) that renders both setImmediate and\n// MessageChannel useless for the purposes of ASAP.\n// https://github.com/kriskowal/q/issues/396\n\n// Timers are implemented universally.\n// We fall back to timers in workers in most engines, and in foreground\n// contexts in the following browsers.\n// However, note that even this simple case requires nuances to operate in a\n// broad spectrum of browsers.\n//\n// - Firefox 3-13\n// - Internet Explorer 6-9\n// - iPad Safari 4.3\n// - Lynx 2.8.7\n} else {\n requestFlush = makeRequestCallFromTimer(flush);\n}\n\n// `requestFlush` requests that the high priority event queue be flushed as\n// soon as possible.\n// This is useful to prevent an error thrown in a task from stalling the event\n// queue if the exception handled by Node.js’s\n// `process.on(\"uncaughtException\")` or by a domain.\nrawAsap.requestFlush = requestFlush;\n\n// To request a high priority event, we induce a mutation observer by toggling\n// the text of a text node between \"1\" and \"-1\".\nfunction makeRequestCallFromMutationObserver(callback) {\n var toggle = 1;\n var observer = new BrowserMutationObserver(callback);\n var node = document.createTextNode(\"\");\n observer.observe(node, {characterData: true});\n return function requestCall() {\n toggle = -toggle;\n node.data = toggle;\n };\n}\n\n// The message channel technique was discovered by Malte Ubl and was the\n// original foundation for this library.\n// http://www.nonblocking.io/2011/06/windownexttick.html\n\n// Safari 6.0.5 (at least) intermittently fails to create message ports on a\n// page's first load. Thankfully, this version of Safari supports\n// MutationObservers, so we don't need to fall back in that case.\n\n// function makeRequestCallFromMessageChannel(callback) {\n// var channel = new MessageChannel();\n// channel.port1.onmessage = callback;\n// return function requestCall() {\n// channel.port2.postMessage(0);\n// };\n// }\n\n// For reasons explained above, we are also unable to use `setImmediate`\n// under any circumstances.\n// Even if we were, there is another bug in Internet Explorer 10.\n// It is not sufficient to assign `setImmediate` to `requestFlush` because\n// `setImmediate` must be called *by name* and therefore must be wrapped in a\n// closure.\n// Never forget.\n\n// function makeRequestCallFromSetImmediate(callback) {\n// return function requestCall() {\n// setImmediate(callback);\n// };\n// }\n\n// Safari 6.0 has a problem where timers will get lost while the user is\n// scrolling. This problem does not impact ASAP because Safari 6.0 supports\n// mutation observers, so that implementation is used instead.\n// However, if we ever elect to use timers in Safari, the prevalent work-around\n// is to add a scroll event listener that calls for a flush.\n\n// `setTimeout` does not call the passed callback if the delay is less than\n// approximately 7 in web workers in Firefox 8 through 18, and sometimes not\n// even then.\n\nfunction makeRequestCallFromTimer(callback) {\n return function requestCall() {\n // We dispatch a timeout with a specified delay of 0 for engines that\n // can reliably accommodate that request. This will usually be snapped\n // to a 4 milisecond delay, but once we're flushing, there's no delay\n // between events.\n var timeoutHandle = setTimeout(handleTimer, 0);\n // However, since this timer gets frequently dropped in Firefox\n // workers, we enlist an interval handle that will try to fire\n // an event 20 times per second until it succeeds.\n var intervalHandle = setInterval(handleTimer, 50);\n\n function handleTimer() {\n // Whichever timer succeeds will cancel both timers and\n // execute the callback.\n clearTimeout(timeoutHandle);\n clearInterval(intervalHandle);\n callback();\n }\n };\n}\n\n// This is for `asap.js` only.\n// Its name will be periodically randomized to break any code that depends on\n// its existence.\nrawAsap.makeRequestCallFromTimer = makeRequestCallFromTimer;\n\n// ASAP was originally a nextTick shim included in Q. This was factored out\n// into this ASAP package. It was later adapted to RSVP which made further\n// amendments. These decisions, particularly to marginalize MessageChannel and\n// to capture the MutationObserver implementation in a closure, were integrated\n// back into ASAP proper.\n// https://github.com/tildeio/rsvp.js/blob/cddf7232546a9cf858524b75cde6f9edf72620a7/lib/rsvp/asap.js\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/asap/browser-raw.js\n// module id = ./node_modules/asap/browser-raw.js\n// module chunks = 0","'use strict';\n\nvar matchOperatorsRe = /[|\\\\{}()[\\]^$+*?.]/g;\n\nmodule.exports = function (str) {\n\tif (typeof str !== 'string') {\n\t\tthrow new TypeError('Expected a string');\n\t}\n\n\treturn str.replace(matchOperatorsRe, '\\\\$&');\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/escape-string-regexp/index.js\n// module id = ./node_modules/escape-string-regexp/index.js\n// module chunks = 0","'use strict';\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @typechecks\n */\n\nvar emptyFunction = require('./emptyFunction');\n\n/**\n * Upstream version of event listener. Does not take into account specific\n * nature of platform.\n */\nvar EventListener = {\n /**\n * Listen to DOM events during the bubble phase.\n *\n * @param {DOMEventTarget} target DOM element to register listener on.\n * @param {string} eventType Event type, e.g. 'click' or 'mouseover'.\n * @param {function} callback Callback function.\n * @return {object} Object with a `remove` method.\n */\n listen: function listen(target, eventType, callback) {\n if (target.addEventListener) {\n target.addEventListener(eventType, callback, false);\n return {\n remove: function remove() {\n target.removeEventListener(eventType, callback, false);\n }\n };\n } else if (target.attachEvent) {\n target.attachEvent('on' + eventType, callback);\n return {\n remove: function remove() {\n target.detachEvent('on' + eventType, callback);\n }\n };\n }\n },\n\n /**\n * Listen to DOM events during the capture phase.\n *\n * @param {DOMEventTarget} target DOM element to register listener on.\n * @param {string} eventType Event type, e.g. 'click' or 'mouseover'.\n * @param {function} callback Callback function.\n * @return {object} Object with a `remove` method.\n */\n capture: function capture(target, eventType, callback) {\n if (target.addEventListener) {\n target.addEventListener(eventType, callback, true);\n return {\n remove: function remove() {\n target.removeEventListener(eventType, callback, true);\n }\n };\n } else {\n if (process.env.NODE_ENV !== 'production') {\n console.error('Attempted to listen to events during the capture phase on a ' + 'browser that does not support the capture phase. Your application ' + 'will not receive some events.');\n }\n return {\n remove: emptyFunction\n };\n }\n },\n\n registerDefault: function registerDefault() {}\n};\n\nmodule.exports = EventListener;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/fbjs/lib/EventListener.js\n// module id = ./node_modules/fbjs/lib/EventListener.js\n// module chunks = 0","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n'use strict';\n\nvar canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);\n\n/**\n * Simple, lightweight module assisting with the detection and context of\n * Worker. Helps avoid circular dependencies and allows code to reason about\n * whether or not they are in a Worker, even if they never include the main\n * `ReactWorker` dependency.\n */\nvar ExecutionEnvironment = {\n\n canUseDOM: canUseDOM,\n\n canUseWorkers: typeof Worker !== 'undefined',\n\n canUseEventListeners: canUseDOM && !!(window.addEventListener || window.attachEvent),\n\n canUseViewport: canUseDOM && !!window.screen,\n\n isInWorker: !canUseDOM // For now, this is true - might change in the future.\n\n};\n\nmodule.exports = ExecutionEnvironment;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/fbjs/lib/ExecutionEnvironment.js\n// module id = ./node_modules/fbjs/lib/ExecutionEnvironment.js\n// module chunks = 0","\"use strict\";\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @typechecks\n */\n\nvar _hyphenPattern = /-(.)/g;\n\n/**\n * Camelcases a hyphenated string, for example:\n *\n * > camelize('background-color')\n * < \"backgroundColor\"\n *\n * @param {string} string\n * @return {string}\n */\nfunction camelize(string) {\n return string.replace(_hyphenPattern, function (_, character) {\n return character.toUpperCase();\n });\n}\n\nmodule.exports = camelize;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/fbjs/lib/camelize.js\n// module id = ./node_modules/fbjs/lib/camelize.js\n// module chunks = 0","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @typechecks\n */\n\n'use strict';\n\nvar camelize = require('./camelize');\n\nvar msPattern = /^-ms-/;\n\n/**\n * Camelcases a hyphenated CSS property name, for example:\n *\n * > camelizeStyleName('background-color')\n * < \"backgroundColor\"\n * > camelizeStyleName('-moz-transition')\n * < \"MozTransition\"\n * > camelizeStyleName('-ms-transition')\n * < \"msTransition\"\n *\n * As Andi Smith suggests\n * (http://www.andismith.com/blog/2012/02/modernizr-prefixed/), an `-ms` prefix\n * is converted to lowercase `ms`.\n *\n * @param {string} string\n * @return {string}\n */\nfunction camelizeStyleName(string) {\n return camelize(string.replace(msPattern, 'ms-'));\n}\n\nmodule.exports = camelizeStyleName;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/fbjs/lib/camelizeStyleName.js\n// module id = ./node_modules/fbjs/lib/camelizeStyleName.js\n// module chunks = 0","'use strict';\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * \n */\n\nvar isTextNode = require('./isTextNode');\n\n/*eslint-disable no-bitwise */\n\n/**\n * Checks if a given DOM node contains or is another DOM node.\n */\nfunction containsNode(outerNode, innerNode) {\n if (!outerNode || !innerNode) {\n return false;\n } else if (outerNode === innerNode) {\n return true;\n } else if (isTextNode(outerNode)) {\n return false;\n } else if (isTextNode(innerNode)) {\n return containsNode(outerNode, innerNode.parentNode);\n } else if ('contains' in outerNode) {\n return outerNode.contains(innerNode);\n } else if (outerNode.compareDocumentPosition) {\n return !!(outerNode.compareDocumentPosition(innerNode) & 16);\n } else {\n return false;\n }\n}\n\nmodule.exports = containsNode;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/fbjs/lib/containsNode.js\n// module id = ./node_modules/fbjs/lib/containsNode.js\n// module chunks = 0","\"use strict\";\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * \n */\n\nfunction makeEmptyFunction(arg) {\n return function () {\n return arg;\n };\n}\n\n/**\n * This function accepts and discards inputs; it has no side effects. This is\n * primarily useful idiomatically for overridable function endpoints which\n * always need to be callable, since JS lacks a null-call idiom ala Cocoa.\n */\nvar emptyFunction = function emptyFunction() {};\n\nemptyFunction.thatReturns = makeEmptyFunction;\nemptyFunction.thatReturnsFalse = makeEmptyFunction(false);\nemptyFunction.thatReturnsTrue = makeEmptyFunction(true);\nemptyFunction.thatReturnsNull = makeEmptyFunction(null);\nemptyFunction.thatReturnsThis = function () {\n return this;\n};\nemptyFunction.thatReturnsArgument = function (arg) {\n return arg;\n};\n\nmodule.exports = emptyFunction;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/fbjs/lib/emptyFunction.js\n// module id = ./node_modules/fbjs/lib/emptyFunction.js\n// module chunks = 0","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n'use strict';\n\nvar emptyObject = {};\n\nif (process.env.NODE_ENV !== 'production') {\n Object.freeze(emptyObject);\n}\n\nmodule.exports = emptyObject;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/fbjs/lib/emptyObject.js\n// module id = ./node_modules/fbjs/lib/emptyObject.js\n// module chunks = 0","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n'use strict';\n\n/**\n * @param {DOMElement} node input/textarea to focus\n */\n\nfunction focusNode(node) {\n // IE8 can throw \"Can't move focus to the control because it is invisible,\n // not enabled, or of a type that does not accept the focus.\" for all kinds of\n // reasons that are too expensive and fragile to test.\n try {\n node.focus();\n } catch (e) {}\n}\n\nmodule.exports = focusNode;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/fbjs/lib/focusNode.js\n// module id = ./node_modules/fbjs/lib/focusNode.js\n// module chunks = 0","'use strict';\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @typechecks\n */\n\n/* eslint-disable fb-www/typeof-undefined */\n\n/**\n * Same as document.activeElement but wraps in a try-catch block. In IE it is\n * not safe to call document.activeElement if there is nothing focused.\n *\n * The activeElement will be null only if the document or document body is not\n * yet defined.\n *\n * @param {?DOMDocument} doc Defaults to current document.\n * @return {?DOMElement}\n */\nfunction getActiveElement(doc) /*?DOMElement*/{\n doc = doc || (typeof document !== 'undefined' ? document : undefined);\n if (typeof doc === 'undefined') {\n return null;\n }\n try {\n return doc.activeElement || doc.body;\n } catch (e) {\n return doc.body;\n }\n}\n\nmodule.exports = getActiveElement;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/fbjs/lib/getActiveElement.js\n// module id = ./node_modules/fbjs/lib/getActiveElement.js\n// module chunks = 0","'use strict';\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @typechecks\n */\n\nvar _uppercasePattern = /([A-Z])/g;\n\n/**\n * Hyphenates a camelcased string, for example:\n *\n * > hyphenate('backgroundColor')\n * < \"background-color\"\n *\n * For CSS style names, use `hyphenateStyleName` instead which works properly\n * with all vendor prefixes, including `ms`.\n *\n * @param {string} string\n * @return {string}\n */\nfunction hyphenate(string) {\n return string.replace(_uppercasePattern, '-$1').toLowerCase();\n}\n\nmodule.exports = hyphenate;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/fbjs/lib/hyphenate.js\n// module id = ./node_modules/fbjs/lib/hyphenate.js\n// module chunks = 0","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @typechecks\n */\n\n'use strict';\n\nvar hyphenate = require('./hyphenate');\n\nvar msPattern = /^ms-/;\n\n/**\n * Hyphenates a camelcased CSS property name, for example:\n *\n * > hyphenateStyleName('backgroundColor')\n * < \"background-color\"\n * > hyphenateStyleName('MozTransition')\n * < \"-moz-transition\"\n * > hyphenateStyleName('msTransition')\n * < \"-ms-transition\"\n *\n * As Modernizr suggests (http://modernizr.com/docs/#prefixed), an `ms` prefix\n * is converted to `-ms-`.\n *\n * @param {string} string\n * @return {string}\n */\nfunction hyphenateStyleName(string) {\n return hyphenate(string).replace(msPattern, '-ms-');\n}\n\nmodule.exports = hyphenateStyleName;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/fbjs/lib/hyphenateStyleName.js\n// module id = ./node_modules/fbjs/lib/hyphenateStyleName.js\n// module chunks = 0","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n'use strict';\n\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar validateFormat = function validateFormat(format) {};\n\nif (process.env.NODE_ENV !== 'production') {\n validateFormat = function validateFormat(format) {\n if (format === undefined) {\n throw new Error('invariant requires an error message argument');\n }\n };\n}\n\nfunction invariant(condition, format, a, b, c, d, e, f) {\n validateFormat(format);\n\n if (!condition) {\n var error;\n if (format === undefined) {\n error = new Error('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.');\n } else {\n var args = [a, b, c, d, e, f];\n var argIndex = 0;\n error = new Error(format.replace(/%s/g, function () {\n return args[argIndex++];\n }));\n error.name = 'Invariant Violation';\n }\n\n error.framesToPop = 1; // we don't care about invariant's own frame\n throw error;\n }\n}\n\nmodule.exports = invariant;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/fbjs/lib/invariant.js\n// module id = ./node_modules/fbjs/lib/invariant.js\n// module chunks = 0","'use strict';\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @typechecks\n */\n\n/**\n * @param {*} object The object to check.\n * @return {boolean} Whether or not the object is a DOM node.\n */\nfunction isNode(object) {\n var doc = object ? object.ownerDocument || object : document;\n var defaultView = doc.defaultView || window;\n return !!(object && (typeof defaultView.Node === 'function' ? object instanceof defaultView.Node : typeof object === 'object' && typeof object.nodeType === 'number' && typeof object.nodeName === 'string'));\n}\n\nmodule.exports = isNode;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/fbjs/lib/isNode.js\n// module id = ./node_modules/fbjs/lib/isNode.js\n// module chunks = 0","'use strict';\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @typechecks\n */\n\nvar isNode = require('./isNode');\n\n/**\n * @param {*} object The object to check.\n * @return {boolean} Whether or not the object is a DOM text node.\n */\nfunction isTextNode(object) {\n return isNode(object) && object.nodeType == 3;\n}\n\nmodule.exports = isTextNode;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/fbjs/lib/isTextNode.js\n// module id = ./node_modules/fbjs/lib/isTextNode.js\n// module chunks = 0","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @typechecks\n * \n */\n\n/*eslint-disable no-self-compare */\n\n'use strict';\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\n/**\n * inlined Object.is polyfill to avoid requiring consumers ship their own\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n */\nfunction is(x, y) {\n // SameValue algorithm\n if (x === y) {\n // Steps 1-5, 7-10\n // Steps 6.b-6.e: +0 != -0\n // Added the nonzero y check to make Flow happy, but it is redundant\n return x !== 0 || y !== 0 || 1 / x === 1 / y;\n } else {\n // Step 6.a: NaN == NaN\n return x !== x && y !== y;\n }\n}\n\n/**\n * Performs equality by iterating through keys on an object and returning false\n * when any key has values which are not strictly equal between the arguments.\n * Returns true when the values of all keys are strictly equal.\n */\nfunction shallowEqual(objA, objB) {\n if (is(objA, objB)) {\n return true;\n }\n\n if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {\n return false;\n }\n\n var keysA = Object.keys(objA);\n var keysB = Object.keys(objB);\n\n if (keysA.length !== keysB.length) {\n return false;\n }\n\n // Test for A's keys different from B.\n for (var i = 0; i < keysA.length; i++) {\n if (!hasOwnProperty.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) {\n return false;\n }\n }\n\n return true;\n}\n\nmodule.exports = shallowEqual;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/fbjs/lib/shallowEqual.js\n// module id = ./node_modules/fbjs/lib/shallowEqual.js\n// module chunks = 0","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n'use strict';\n\nvar emptyFunction = require('./emptyFunction');\n\n/**\n * Similar to invariant but only logs a warning if the condition is not met.\n * This can be used to log issues in development environments in critical\n * paths. Removing the logging code for production environments will keep the\n * same logic and follow the same code paths.\n */\n\nvar warning = emptyFunction;\n\nif (process.env.NODE_ENV !== 'production') {\n var printWarning = function printWarning(format) {\n for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n var argIndex = 0;\n var message = 'Warning: ' + format.replace(/%s/g, function () {\n return args[argIndex++];\n });\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) {}\n };\n\n warning = function warning(condition, format) {\n if (format === undefined) {\n throw new Error('`warning(condition, format, ...args)` requires a warning ' + 'message argument');\n }\n\n if (format.indexOf('Failed Composite propType: ') === 0) {\n return; // Ignore CompositeComponent proptype check.\n }\n\n if (!condition) {\n for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {\n args[_key2 - 2] = arguments[_key2];\n }\n\n printWarning.apply(undefined, [format].concat(args));\n }\n };\n}\n\nmodule.exports = warning;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/fbjs/lib/warning.js\n// module id = ./node_modules/fbjs/lib/warning.js\n// module chunks = 0","'use strict';\nvar ansiRegex = require('ansi-regex');\nvar re = new RegExp(ansiRegex().source); // remove the `g` flag\nmodule.exports = re.test.bind(re);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/has-ansi/index.js\n// module id = ./node_modules/has-ansi/index.js\n// module chunks = 0","if (typeof Object.create === 'function') {\n // implementation from standard node.js 'util' module\n module.exports = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n };\n} else {\n // old school shim for old browsers\n module.exports = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor\n var TempCtor = function () {}\n TempCtor.prototype = superCtor.prototype\n ctor.prototype = new TempCtor()\n ctor.prototype.constructor = ctor\n }\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/inherits/inherits_browser.js\n// module id = ./node_modules/inherits/inherits_browser.js\n// module chunks = 0","/*! JSON v3.3.2 | http://bestiejs.github.io/json3 | Copyright 2012-2014, Kit Cambridge | http://kit.mit-license.org */\n;(function () {\n // Detect the `define` function exposed by asynchronous module loaders. The\n // strict `define` check is necessary for compatibility with `r.js`.\n var isLoader = typeof define === \"function\" && define.amd;\n\n // A set of types used to distinguish objects from primitives.\n var objectTypes = {\n \"function\": true,\n \"object\": true\n };\n\n // Detect the `exports` object exposed by CommonJS implementations.\n var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports;\n\n // Use the `global` object exposed by Node (including Browserify via\n // `insert-module-globals`), Narwhal, and Ringo as the default context,\n // and the `window` object in browsers. Rhino exports a `global` function\n // instead.\n var root = objectTypes[typeof window] && window || this,\n freeGlobal = freeExports && objectTypes[typeof module] && module && !module.nodeType && typeof global == \"object\" && global;\n\n if (freeGlobal && (freeGlobal[\"global\"] === freeGlobal || freeGlobal[\"window\"] === freeGlobal || freeGlobal[\"self\"] === freeGlobal)) {\n root = freeGlobal;\n }\n\n // Public: Initializes JSON 3 using the given `context` object, attaching the\n // `stringify` and `parse` functions to the specified `exports` object.\n function runInContext(context, exports) {\n context || (context = root[\"Object\"]());\n exports || (exports = root[\"Object\"]());\n\n // Native constructor aliases.\n var Number = context[\"Number\"] || root[\"Number\"],\n String = context[\"String\"] || root[\"String\"],\n Object = context[\"Object\"] || root[\"Object\"],\n Date = context[\"Date\"] || root[\"Date\"],\n SyntaxError = context[\"SyntaxError\"] || root[\"SyntaxError\"],\n TypeError = context[\"TypeError\"] || root[\"TypeError\"],\n Math = context[\"Math\"] || root[\"Math\"],\n nativeJSON = context[\"JSON\"] || root[\"JSON\"];\n\n // Delegate to the native `stringify` and `parse` implementations.\n if (typeof nativeJSON == \"object\" && nativeJSON) {\n exports.stringify = nativeJSON.stringify;\n exports.parse = nativeJSON.parse;\n }\n\n // Convenience aliases.\n var objectProto = Object.prototype,\n getClass = objectProto.toString,\n isProperty, forEach, undef;\n\n // Test the `Date#getUTC*` methods. Based on work by @Yaffle.\n var isExtended = new Date(-3509827334573292);\n try {\n // The `getUTCFullYear`, `Month`, and `Date` methods return nonsensical\n // results for certain dates in Opera >= 10.53.\n isExtended = isExtended.getUTCFullYear() == -109252 && isExtended.getUTCMonth() === 0 && isExtended.getUTCDate() === 1 &&\n // Safari < 2.0.2 stores the internal millisecond time value correctly,\n // but clips the values returned by the date methods to the range of\n // signed 32-bit integers ([-2 ** 31, 2 ** 31 - 1]).\n isExtended.getUTCHours() == 10 && isExtended.getUTCMinutes() == 37 && isExtended.getUTCSeconds() == 6 && isExtended.getUTCMilliseconds() == 708;\n } catch (exception) {}\n\n // Internal: Determines whether the native `JSON.stringify` and `parse`\n // implementations are spec-compliant. Based on work by Ken Snyder.\n function has(name) {\n if (has[name] !== undef) {\n // Return cached feature test result.\n return has[name];\n }\n var isSupported;\n if (name == \"bug-string-char-index\") {\n // IE <= 7 doesn't support accessing string characters using square\n // bracket notation. IE 8 only supports this for primitives.\n isSupported = \"a\"[0] != \"a\";\n } else if (name == \"json\") {\n // Indicates whether both `JSON.stringify` and `JSON.parse` are\n // supported.\n isSupported = has(\"json-stringify\") && has(\"json-parse\");\n } else {\n var value, serialized = '{\"a\":[1,true,false,null,\"\\\\u0000\\\\b\\\\n\\\\f\\\\r\\\\t\"]}';\n // Test `JSON.stringify`.\n if (name == \"json-stringify\") {\n var stringify = exports.stringify, stringifySupported = typeof stringify == \"function\" && isExtended;\n if (stringifySupported) {\n // A test function object with a custom `toJSON` method.\n (value = function () {\n return 1;\n }).toJSON = value;\n try {\n stringifySupported =\n // Firefox 3.1b1 and b2 serialize string, number, and boolean\n // primitives as object literals.\n stringify(0) === \"0\" &&\n // FF 3.1b1, b2, and JSON 2 serialize wrapped primitives as object\n // literals.\n stringify(new Number()) === \"0\" &&\n stringify(new String()) == '\"\"' &&\n // FF 3.1b1, 2 throw an error if the value is `null`, `undefined`, or\n // does not define a canonical JSON representation (this applies to\n // objects with `toJSON` properties as well, *unless* they are nested\n // within an object or array).\n stringify(getClass) === undef &&\n // IE 8 serializes `undefined` as `\"undefined\"`. Safari <= 5.1.7 and\n // FF 3.1b3 pass this test.\n stringify(undef) === undef &&\n // Safari <= 5.1.7 and FF 3.1b3 throw `Error`s and `TypeError`s,\n // respectively, if the value is omitted entirely.\n stringify() === undef &&\n // FF 3.1b1, 2 throw an error if the given value is not a number,\n // string, array, object, Boolean, or `null` literal. This applies to\n // objects with custom `toJSON` methods as well, unless they are nested\n // inside object or array literals. YUI 3.0.0b1 ignores custom `toJSON`\n // methods entirely.\n stringify(value) === \"1\" &&\n stringify([value]) == \"[1]\" &&\n // Prototype <= 1.6.1 serializes `[undefined]` as `\"[]\"` instead of\n // `\"[null]\"`.\n stringify([undef]) == \"[null]\" &&\n // YUI 3.0.0b1 fails to serialize `null` literals.\n stringify(null) == \"null\" &&\n // FF 3.1b1, 2 halts serialization if an array contains a function:\n // `[1, true, getClass, 1]` serializes as \"[1,true,],\". FF 3.1b3\n // elides non-JSON values from objects and arrays, unless they\n // define custom `toJSON` methods.\n stringify([undef, getClass, null]) == \"[null,null,null]\" &&\n // Simple serialization test. FF 3.1b1 uses Unicode escape sequences\n // where character escape codes are expected (e.g., `\\b` => `\\u0008`).\n stringify({ \"a\": [value, true, false, null, \"\\x00\\b\\n\\f\\r\\t\"] }) == serialized &&\n // FF 3.1b1 and b2 ignore the `filter` and `width` arguments.\n stringify(null, value) === \"1\" &&\n stringify([1, 2], null, 1) == \"[\\n 1,\\n 2\\n]\" &&\n // JSON 2, Prototype <= 1.7, and older WebKit builds incorrectly\n // serialize extended years.\n stringify(new Date(-8.64e15)) == '\"-271821-04-20T00:00:00.000Z\"' &&\n // The milliseconds are optional in ES 5, but required in 5.1.\n stringify(new Date(8.64e15)) == '\"+275760-09-13T00:00:00.000Z\"' &&\n // Firefox <= 11.0 incorrectly serializes years prior to 0 as negative\n // four-digit years instead of six-digit years. Credits: @Yaffle.\n stringify(new Date(-621987552e5)) == '\"-000001-01-01T00:00:00.000Z\"' &&\n // Safari <= 5.1.5 and Opera >= 10.53 incorrectly serialize millisecond\n // values less than 1000. Credits: @Yaffle.\n stringify(new Date(-1)) == '\"1969-12-31T23:59:59.999Z\"';\n } catch (exception) {\n stringifySupported = false;\n }\n }\n isSupported = stringifySupported;\n }\n // Test `JSON.parse`.\n if (name == \"json-parse\") {\n var parse = exports.parse;\n if (typeof parse == \"function\") {\n try {\n // FF 3.1b1, b2 will throw an exception if a bare literal is provided.\n // Conforming implementations should also coerce the initial argument to\n // a string prior to parsing.\n if (parse(\"0\") === 0 && !parse(false)) {\n // Simple parsing test.\n value = parse(serialized);\n var parseSupported = value[\"a\"].length == 5 && value[\"a\"][0] === 1;\n if (parseSupported) {\n try {\n // Safari <= 5.1.2 and FF 3.1b1 allow unescaped tabs in strings.\n parseSupported = !parse('\"\\t\"');\n } catch (exception) {}\n if (parseSupported) {\n try {\n // FF 4.0 and 4.0.1 allow leading `+` signs and leading\n // decimal points. FF 4.0, 4.0.1, and IE 9-10 also allow\n // certain octal literals.\n parseSupported = parse(\"01\") !== 1;\n } catch (exception) {}\n }\n if (parseSupported) {\n try {\n // FF 4.0, 4.0.1, and Rhino 1.7R3-R4 allow trailing decimal\n // points. These environments, along with FF 3.1b1 and 2,\n // also allow trailing commas in JSON objects and arrays.\n parseSupported = parse(\"1.\") !== 1;\n } catch (exception) {}\n }\n }\n }\n } catch (exception) {\n parseSupported = false;\n }\n }\n isSupported = parseSupported;\n }\n }\n return has[name] = !!isSupported;\n }\n\n if (!has(\"json\")) {\n // Common `[[Class]]` name aliases.\n var functionClass = \"[object Function]\",\n dateClass = \"[object Date]\",\n numberClass = \"[object Number]\",\n stringClass = \"[object String]\",\n arrayClass = \"[object Array]\",\n booleanClass = \"[object Boolean]\";\n\n // Detect incomplete support for accessing string characters by index.\n var charIndexBuggy = has(\"bug-string-char-index\");\n\n // Define additional utility methods if the `Date` methods are buggy.\n if (!isExtended) {\n var floor = Math.floor;\n // A mapping between the months of the year and the number of days between\n // January 1st and the first of the respective month.\n var Months = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334];\n // Internal: Calculates the number of days between the Unix epoch and the\n // first day of the given month.\n var getDay = function (year, month) {\n return Months[month] + 365 * (year - 1970) + floor((year - 1969 + (month = +(month > 1))) / 4) - floor((year - 1901 + month) / 100) + floor((year - 1601 + month) / 400);\n };\n }\n\n // Internal: Determines if a property is a direct property of the given\n // object. Delegates to the native `Object#hasOwnProperty` method.\n if (!(isProperty = objectProto.hasOwnProperty)) {\n isProperty = function (property) {\n var members = {}, constructor;\n if ((members.__proto__ = null, members.__proto__ = {\n // The *proto* property cannot be set multiple times in recent\n // versions of Firefox and SeaMonkey.\n \"toString\": 1\n }, members).toString != getClass) {\n // Safari <= 2.0.3 doesn't implement `Object#hasOwnProperty`, but\n // supports the mutable *proto* property.\n isProperty = function (property) {\n // Capture and break the object's prototype chain (see section 8.6.2\n // of the ES 5.1 spec). The parenthesized expression prevents an\n // unsafe transformation by the Closure Compiler.\n var original = this.__proto__, result = property in (this.__proto__ = null, this);\n // Restore the original prototype chain.\n this.__proto__ = original;\n return result;\n };\n } else {\n // Capture a reference to the top-level `Object` constructor.\n constructor = members.constructor;\n // Use the `constructor` property to simulate `Object#hasOwnProperty` in\n // other environments.\n isProperty = function (property) {\n var parent = (this.constructor || constructor).prototype;\n return property in this && !(property in parent && this[property] === parent[property]);\n };\n }\n members = null;\n return isProperty.call(this, property);\n };\n }\n\n // Internal: Normalizes the `for...in` iteration algorithm across\n // environments. Each enumerated key is yielded to a `callback` function.\n forEach = function (object, callback) {\n var size = 0, Properties, members, property;\n\n // Tests for bugs in the current environment's `for...in` algorithm. The\n // `valueOf` property inherits the non-enumerable flag from\n // `Object.prototype` in older versions of IE, Netscape, and Mozilla.\n (Properties = function () {\n this.valueOf = 0;\n }).prototype.valueOf = 0;\n\n // Iterate over a new instance of the `Properties` class.\n members = new Properties();\n for (property in members) {\n // Ignore all properties inherited from `Object.prototype`.\n if (isProperty.call(members, property)) {\n size++;\n }\n }\n Properties = members = null;\n\n // Normalize the iteration algorithm.\n if (!size) {\n // A list of non-enumerable properties inherited from `Object.prototype`.\n members = [\"valueOf\", \"toString\", \"toLocaleString\", \"propertyIsEnumerable\", \"isPrototypeOf\", \"hasOwnProperty\", \"constructor\"];\n // IE <= 8, Mozilla 1.0, and Netscape 6.2 ignore shadowed non-enumerable\n // properties.\n forEach = function (object, callback) {\n var isFunction = getClass.call(object) == functionClass, property, length;\n var hasProperty = !isFunction && typeof object.constructor != \"function\" && objectTypes[typeof object.hasOwnProperty] && object.hasOwnProperty || isProperty;\n for (property in object) {\n // Gecko <= 1.0 enumerates the `prototype` property of functions under\n // certain conditions; IE does not.\n if (!(isFunction && property == \"prototype\") && hasProperty.call(object, property)) {\n callback(property);\n }\n }\n // Manually invoke the callback for each non-enumerable property.\n for (length = members.length; property = members[--length]; hasProperty.call(object, property) && callback(property));\n };\n } else if (size == 2) {\n // Safari <= 2.0.4 enumerates shadowed properties twice.\n forEach = function (object, callback) {\n // Create a set of iterated properties.\n var members = {}, isFunction = getClass.call(object) == functionClass, property;\n for (property in object) {\n // Store each property name to prevent double enumeration. The\n // `prototype` property of functions is not enumerated due to cross-\n // environment inconsistencies.\n if (!(isFunction && property == \"prototype\") && !isProperty.call(members, property) && (members[property] = 1) && isProperty.call(object, property)) {\n callback(property);\n }\n }\n };\n } else {\n // No bugs detected; use the standard `for...in` algorithm.\n forEach = function (object, callback) {\n var isFunction = getClass.call(object) == functionClass, property, isConstructor;\n for (property in object) {\n if (!(isFunction && property == \"prototype\") && isProperty.call(object, property) && !(isConstructor = property === \"constructor\")) {\n callback(property);\n }\n }\n // Manually invoke the callback for the `constructor` property due to\n // cross-environment inconsistencies.\n if (isConstructor || isProperty.call(object, (property = \"constructor\"))) {\n callback(property);\n }\n };\n }\n return forEach(object, callback);\n };\n\n // Public: Serializes a JavaScript `value` as a JSON string. The optional\n // `filter` argument may specify either a function that alters how object and\n // array members are serialized, or an array of strings and numbers that\n // indicates which properties should be serialized. The optional `width`\n // argument may be either a string or number that specifies the indentation\n // level of the output.\n if (!has(\"json-stringify\")) {\n // Internal: A map of control characters and their escaped equivalents.\n var Escapes = {\n 92: \"\\\\\\\\\",\n 34: '\\\\\"',\n 8: \"\\\\b\",\n 12: \"\\\\f\",\n 10: \"\\\\n\",\n 13: \"\\\\r\",\n 9: \"\\\\t\"\n };\n\n // Internal: Converts `value` into a zero-padded string such that its\n // length is at least equal to `width`. The `width` must be <= 6.\n var leadingZeroes = \"000000\";\n var toPaddedString = function (width, value) {\n // The `|| 0` expression is necessary to work around a bug in\n // Opera <= 7.54u2 where `0 == -0`, but `String(-0) !== \"0\"`.\n return (leadingZeroes + (value || 0)).slice(-width);\n };\n\n // Internal: Double-quotes a string `value`, replacing all ASCII control\n // characters (characters with code unit values between 0 and 31) with\n // their escaped equivalents. This is an implementation of the\n // `Quote(value)` operation defined in ES 5.1 section 15.12.3.\n var unicodePrefix = \"\\\\u00\";\n var quote = function (value) {\n var result = '\"', index = 0, length = value.length, useCharIndex = !charIndexBuggy || length > 10;\n var symbols = useCharIndex && (charIndexBuggy ? value.split(\"\") : value);\n for (; index < length; index++) {\n var charCode = value.charCodeAt(index);\n // If the character is a control character, append its Unicode or\n // shorthand escape sequence; otherwise, append the character as-is.\n switch (charCode) {\n case 8: case 9: case 10: case 12: case 13: case 34: case 92:\n result += Escapes[charCode];\n break;\n default:\n if (charCode < 32) {\n result += unicodePrefix + toPaddedString(2, charCode.toString(16));\n break;\n }\n result += useCharIndex ? symbols[index] : value.charAt(index);\n }\n }\n return result + '\"';\n };\n\n // Internal: Recursively serializes an object. Implements the\n // `Str(key, holder)`, `JO(value)`, and `JA(value)` operations.\n var serialize = function (property, object, callback, properties, whitespace, indentation, stack) {\n var value, className, year, month, date, time, hours, minutes, seconds, milliseconds, results, element, index, length, prefix, result;\n try {\n // Necessary for host object support.\n value = object[property];\n } catch (exception) {}\n if (typeof value == \"object\" && value) {\n className = getClass.call(value);\n if (className == dateClass && !isProperty.call(value, \"toJSON\")) {\n if (value > -1 / 0 && value < 1 / 0) {\n // Dates are serialized according to the `Date#toJSON` method\n // specified in ES 5.1 section 15.9.5.44. See section 15.9.1.15\n // for the ISO 8601 date time string format.\n if (getDay) {\n // Manually compute the year, month, date, hours, minutes,\n // seconds, and milliseconds if the `getUTC*` methods are\n // buggy. Adapted from @Yaffle's `date-shim` project.\n date = floor(value / 864e5);\n for (year = floor(date / 365.2425) + 1970 - 1; getDay(year + 1, 0) <= date; year++);\n for (month = floor((date - getDay(year, 0)) / 30.42); getDay(year, month + 1) <= date; month++);\n date = 1 + date - getDay(year, month);\n // The `time` value specifies the time within the day (see ES\n // 5.1 section 15.9.1.2). The formula `(A % B + B) % B` is used\n // to compute `A modulo B`, as the `%` operator does not\n // correspond to the `modulo` operation for negative numbers.\n time = (value % 864e5 + 864e5) % 864e5;\n // The hours, minutes, seconds, and milliseconds are obtained by\n // decomposing the time within the day. See section 15.9.1.10.\n hours = floor(time / 36e5) % 24;\n minutes = floor(time / 6e4) % 60;\n seconds = floor(time / 1e3) % 60;\n milliseconds = time % 1e3;\n } else {\n year = value.getUTCFullYear();\n month = value.getUTCMonth();\n date = value.getUTCDate();\n hours = value.getUTCHours();\n minutes = value.getUTCMinutes();\n seconds = value.getUTCSeconds();\n milliseconds = value.getUTCMilliseconds();\n }\n // Serialize extended years correctly.\n value = (year <= 0 || year >= 1e4 ? (year < 0 ? \"-\" : \"+\") + toPaddedString(6, year < 0 ? -year : year) : toPaddedString(4, year)) +\n \"-\" + toPaddedString(2, month + 1) + \"-\" + toPaddedString(2, date) +\n // Months, dates, hours, minutes, and seconds should have two\n // digits; milliseconds should have three.\n \"T\" + toPaddedString(2, hours) + \":\" + toPaddedString(2, minutes) + \":\" + toPaddedString(2, seconds) +\n // Milliseconds are optional in ES 5.0, but required in 5.1.\n \".\" + toPaddedString(3, milliseconds) + \"Z\";\n } else {\n value = null;\n }\n } else if (typeof value.toJSON == \"function\" && ((className != numberClass && className != stringClass && className != arrayClass) || isProperty.call(value, \"toJSON\"))) {\n // Prototype <= 1.6.1 adds non-standard `toJSON` methods to the\n // `Number`, `String`, `Date`, and `Array` prototypes. JSON 3\n // ignores all `toJSON` methods on these objects unless they are\n // defined directly on an instance.\n value = value.toJSON(property);\n }\n }\n if (callback) {\n // If a replacement function was provided, call it to obtain the value\n // for serialization.\n value = callback.call(object, property, value);\n }\n if (value === null) {\n return \"null\";\n }\n className = getClass.call(value);\n if (className == booleanClass) {\n // Booleans are represented literally.\n return \"\" + value;\n } else if (className == numberClass) {\n // JSON numbers must be finite. `Infinity` and `NaN` are serialized as\n // `\"null\"`.\n return value > -1 / 0 && value < 1 / 0 ? \"\" + value : \"null\";\n } else if (className == stringClass) {\n // Strings are double-quoted and escaped.\n return quote(\"\" + value);\n }\n // Recursively serialize objects and arrays.\n if (typeof value == \"object\") {\n // Check for cyclic structures. This is a linear search; performance\n // is inversely proportional to the number of unique nested objects.\n for (length = stack.length; length--;) {\n if (stack[length] === value) {\n // Cyclic structures cannot be serialized by `JSON.stringify`.\n throw TypeError();\n }\n }\n // Add the object to the stack of traversed objects.\n stack.push(value);\n results = [];\n // Save the current indentation level and indent one additional level.\n prefix = indentation;\n indentation += whitespace;\n if (className == arrayClass) {\n // Recursively serialize array elements.\n for (index = 0, length = value.length; index < length; index++) {\n element = serialize(index, value, callback, properties, whitespace, indentation, stack);\n results.push(element === undef ? \"null\" : element);\n }\n result = results.length ? (whitespace ? \"[\\n\" + indentation + results.join(\",\\n\" + indentation) + \"\\n\" + prefix + \"]\" : (\"[\" + results.join(\",\") + \"]\")) : \"[]\";\n } else {\n // Recursively serialize object members. Members are selected from\n // either a user-specified list of property names, or the object\n // itself.\n forEach(properties || value, function (property) {\n var element = serialize(property, value, callback, properties, whitespace, indentation, stack);\n if (element !== undef) {\n // According to ES 5.1 section 15.12.3: \"If `gap` {whitespace}\n // is not the empty string, let `member` {quote(property) + \":\"}\n // be the concatenation of `member` and the `space` character.\"\n // The \"`space` character\" refers to the literal space\n // character, not the `space` {width} argument provided to\n // `JSON.stringify`.\n results.push(quote(property) + \":\" + (whitespace ? \" \" : \"\") + element);\n }\n });\n result = results.length ? (whitespace ? \"{\\n\" + indentation + results.join(\",\\n\" + indentation) + \"\\n\" + prefix + \"}\" : (\"{\" + results.join(\",\") + \"}\")) : \"{}\";\n }\n // Remove the object from the traversed object stack.\n stack.pop();\n return result;\n }\n };\n\n // Public: `JSON.stringify`. See ES 5.1 section 15.12.3.\n exports.stringify = function (source, filter, width) {\n var whitespace, callback, properties, className;\n if (objectTypes[typeof filter] && filter) {\n if ((className = getClass.call(filter)) == functionClass) {\n callback = filter;\n } else if (className == arrayClass) {\n // Convert the property names array into a makeshift set.\n properties = {};\n for (var index = 0, length = filter.length, value; index < length; value = filter[index++], ((className = getClass.call(value)), className == stringClass || className == numberClass) && (properties[value] = 1));\n }\n }\n if (width) {\n if ((className = getClass.call(width)) == numberClass) {\n // Convert the `width` to an integer and create a string containing\n // `width` number of space characters.\n if ((width -= width % 1) > 0) {\n for (whitespace = \"\", width > 10 && (width = 10); whitespace.length < width; whitespace += \" \");\n }\n } else if (className == stringClass) {\n whitespace = width.length <= 10 ? width : width.slice(0, 10);\n }\n }\n // Opera <= 7.54u2 discards the values associated with empty string keys\n // (`\"\"`) only if they are used directly within an object member list\n // (e.g., `!(\"\" in { \"\": 1})`).\n return serialize(\"\", (value = {}, value[\"\"] = source, value), callback, properties, whitespace, \"\", []);\n };\n }\n\n // Public: Parses a JSON source string.\n if (!has(\"json-parse\")) {\n var fromCharCode = String.fromCharCode;\n\n // Internal: A map of escaped control characters and their unescaped\n // equivalents.\n var Unescapes = {\n 92: \"\\\\\",\n 34: '\"',\n 47: \"/\",\n 98: \"\\b\",\n 116: \"\\t\",\n 110: \"\\n\",\n 102: \"\\f\",\n 114: \"\\r\"\n };\n\n // Internal: Stores the parser state.\n var Index, Source;\n\n // Internal: Resets the parser state and throws a `SyntaxError`.\n var abort = function () {\n Index = Source = null;\n throw SyntaxError();\n };\n\n // Internal: Returns the next token, or `\"$\"` if the parser has reached\n // the end of the source string. A token may be a string, number, `null`\n // literal, or Boolean literal.\n var lex = function () {\n var source = Source, length = source.length, value, begin, position, isSigned, charCode;\n while (Index < length) {\n charCode = source.charCodeAt(Index);\n switch (charCode) {\n case 9: case 10: case 13: case 32:\n // Skip whitespace tokens, including tabs, carriage returns, line\n // feeds, and space characters.\n Index++;\n break;\n case 123: case 125: case 91: case 93: case 58: case 44:\n // Parse a punctuator token (`{`, `}`, `[`, `]`, `:`, or `,`) at\n // the current position.\n value = charIndexBuggy ? source.charAt(Index) : source[Index];\n Index++;\n return value;\n case 34:\n // `\"` delimits a JSON string; advance to the next character and\n // begin parsing the string. String tokens are prefixed with the\n // sentinel `@` character to distinguish them from punctuators and\n // end-of-string tokens.\n for (value = \"@\", Index++; Index < length;) {\n charCode = source.charCodeAt(Index);\n if (charCode < 32) {\n // Unescaped ASCII control characters (those with a code unit\n // less than the space character) are not permitted.\n abort();\n } else if (charCode == 92) {\n // A reverse solidus (`\\`) marks the beginning of an escaped\n // control character (including `\"`, `\\`, and `/`) or Unicode\n // escape sequence.\n charCode = source.charCodeAt(++Index);\n switch (charCode) {\n case 92: case 34: case 47: case 98: case 116: case 110: case 102: case 114:\n // Revive escaped control characters.\n value += Unescapes[charCode];\n Index++;\n break;\n case 117:\n // `\\u` marks the beginning of a Unicode escape sequence.\n // Advance to the first character and validate the\n // four-digit code point.\n begin = ++Index;\n for (position = Index + 4; Index < position; Index++) {\n charCode = source.charCodeAt(Index);\n // A valid sequence comprises four hexdigits (case-\n // insensitive) that form a single hexadecimal value.\n if (!(charCode >= 48 && charCode <= 57 || charCode >= 97 && charCode <= 102 || charCode >= 65 && charCode <= 70)) {\n // Invalid Unicode escape sequence.\n abort();\n }\n }\n // Revive the escaped character.\n value += fromCharCode(\"0x\" + source.slice(begin, Index));\n break;\n default:\n // Invalid escape sequence.\n abort();\n }\n } else {\n if (charCode == 34) {\n // An unescaped double-quote character marks the end of the\n // string.\n break;\n }\n charCode = source.charCodeAt(Index);\n begin = Index;\n // Optimize for the common case where a string is valid.\n while (charCode >= 32 && charCode != 92 && charCode != 34) {\n charCode = source.charCodeAt(++Index);\n }\n // Append the string as-is.\n value += source.slice(begin, Index);\n }\n }\n if (source.charCodeAt(Index) == 34) {\n // Advance to the next character and return the revived string.\n Index++;\n return value;\n }\n // Unterminated string.\n abort();\n default:\n // Parse numbers and literals.\n begin = Index;\n // Advance past the negative sign, if one is specified.\n if (charCode == 45) {\n isSigned = true;\n charCode = source.charCodeAt(++Index);\n }\n // Parse an integer or floating-point value.\n if (charCode >= 48 && charCode <= 57) {\n // Leading zeroes are interpreted as octal literals.\n if (charCode == 48 && ((charCode = source.charCodeAt(Index + 1)), charCode >= 48 && charCode <= 57)) {\n // Illegal octal literal.\n abort();\n }\n isSigned = false;\n // Parse the integer component.\n for (; Index < length && ((charCode = source.charCodeAt(Index)), charCode >= 48 && charCode <= 57); Index++);\n // Floats cannot contain a leading decimal point; however, this\n // case is already accounted for by the parser.\n if (source.charCodeAt(Index) == 46) {\n position = ++Index;\n // Parse the decimal component.\n for (; position < length && ((charCode = source.charCodeAt(position)), charCode >= 48 && charCode <= 57); position++);\n if (position == Index) {\n // Illegal trailing decimal.\n abort();\n }\n Index = position;\n }\n // Parse exponents. The `e` denoting the exponent is\n // case-insensitive.\n charCode = source.charCodeAt(Index);\n if (charCode == 101 || charCode == 69) {\n charCode = source.charCodeAt(++Index);\n // Skip past the sign following the exponent, if one is\n // specified.\n if (charCode == 43 || charCode == 45) {\n Index++;\n }\n // Parse the exponential component.\n for (position = Index; position < length && ((charCode = source.charCodeAt(position)), charCode >= 48 && charCode <= 57); position++);\n if (position == Index) {\n // Illegal empty exponent.\n abort();\n }\n Index = position;\n }\n // Coerce the parsed value to a JavaScript number.\n return +source.slice(begin, Index);\n }\n // A negative sign may only precede numbers.\n if (isSigned) {\n abort();\n }\n // `true`, `false`, and `null` literals.\n if (source.slice(Index, Index + 4) == \"true\") {\n Index += 4;\n return true;\n } else if (source.slice(Index, Index + 5) == \"false\") {\n Index += 5;\n return false;\n } else if (source.slice(Index, Index + 4) == \"null\") {\n Index += 4;\n return null;\n }\n // Unrecognized token.\n abort();\n }\n }\n // Return the sentinel `$` character if the parser has reached the end\n // of the source string.\n return \"$\";\n };\n\n // Internal: Parses a JSON `value` token.\n var get = function (value) {\n var results, hasMembers;\n if (value == \"$\") {\n // Unexpected end of input.\n abort();\n }\n if (typeof value == \"string\") {\n if ((charIndexBuggy ? value.charAt(0) : value[0]) == \"@\") {\n // Remove the sentinel `@` character.\n return value.slice(1);\n }\n // Parse object and array literals.\n if (value == \"[\") {\n // Parses a JSON array, returning a new JavaScript array.\n results = [];\n for (;; hasMembers || (hasMembers = true)) {\n value = lex();\n // A closing square bracket marks the end of the array literal.\n if (value == \"]\") {\n break;\n }\n // If the array literal contains elements, the current token\n // should be a comma separating the previous element from the\n // next.\n if (hasMembers) {\n if (value == \",\") {\n value = lex();\n if (value == \"]\") {\n // Unexpected trailing `,` in array literal.\n abort();\n }\n } else {\n // A `,` must separate each array element.\n abort();\n }\n }\n // Elisions and leading commas are not permitted.\n if (value == \",\") {\n abort();\n }\n results.push(get(value));\n }\n return results;\n } else if (value == \"{\") {\n // Parses a JSON object, returning a new JavaScript object.\n results = {};\n for (;; hasMembers || (hasMembers = true)) {\n value = lex();\n // A closing curly brace marks the end of the object literal.\n if (value == \"}\") {\n break;\n }\n // If the object literal contains members, the current token\n // should be a comma separator.\n if (hasMembers) {\n if (value == \",\") {\n value = lex();\n if (value == \"}\") {\n // Unexpected trailing `,` in object literal.\n abort();\n }\n } else {\n // A `,` must separate each object member.\n abort();\n }\n }\n // Leading commas are not permitted, object property names must be\n // double-quoted strings, and a `:` must separate each property\n // name and value.\n if (value == \",\" || typeof value != \"string\" || (charIndexBuggy ? value.charAt(0) : value[0]) != \"@\" || lex() != \":\") {\n abort();\n }\n results[value.slice(1)] = get(lex());\n }\n return results;\n }\n // Unexpected token encountered.\n abort();\n }\n return value;\n };\n\n // Internal: Updates a traversed object member.\n var update = function (source, property, callback) {\n var element = walk(source, property, callback);\n if (element === undef) {\n delete source[property];\n } else {\n source[property] = element;\n }\n };\n\n // Internal: Recursively traverses a parsed JSON object, invoking the\n // `callback` function for each value. This is an implementation of the\n // `Walk(holder, name)` operation defined in ES 5.1 section 15.12.2.\n var walk = function (source, property, callback) {\n var value = source[property], length;\n if (typeof value == \"object\" && value) {\n // `forEach` can't be used to traverse an array in Opera <= 8.54\n // because its `Object#hasOwnProperty` implementation returns `false`\n // for array indices (e.g., `![1, 2, 3].hasOwnProperty(\"0\")`).\n if (getClass.call(value) == arrayClass) {\n for (length = value.length; length--;) {\n update(value, length, callback);\n }\n } else {\n forEach(value, function (property) {\n update(value, property, callback);\n });\n }\n }\n return callback.call(source, property, value);\n };\n\n // Public: `JSON.parse`. See ES 5.1 section 15.12.2.\n exports.parse = function (source, callback) {\n var result, value;\n Index = 0;\n Source = \"\" + source;\n result = get(lex());\n // If a JSON string contains multiple tokens, it is invalid.\n if (lex() != \"$\") {\n abort();\n }\n // Reset the parser state.\n Index = Source = null;\n return callback && getClass.call(callback) == functionClass ? walk((value = {}, value[\"\"] = result, value), \"\", callback) : result;\n };\n }\n }\n\n exports[\"runInContext\"] = runInContext;\n return exports;\n }\n\n if (freeExports && !isLoader) {\n // Export for CommonJS environments.\n runInContext(root, freeExports);\n } else {\n // Export for web browsers and JavaScript engines.\n var nativeJSON = root.JSON,\n previousJSON = root[\"JSON3\"],\n isRestored = false;\n\n var JSON3 = runInContext(root, (root[\"JSON3\"] = {\n // Public: Restores the original value of the global `JSON` object and\n // returns a reference to the `JSON3` object.\n \"noConflict\": function () {\n if (!isRestored) {\n isRestored = true;\n root.JSON = nativeJSON;\n root[\"JSON3\"] = previousJSON;\n nativeJSON = previousJSON = null;\n }\n return JSON3;\n }\n }));\n\n root.JSON = {\n \"parse\": JSON3.parse,\n \"stringify\": JSON3.stringify\n };\n }\n\n // Export for asynchronous module loaders.\n if (isLoader) {\n define(function () {\n return JSON3;\n });\n }\n}).call(this);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/json3/lib/json3.js\n// module id = ./node_modules/json3/lib/json3.js\n// module chunks = 0","/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n * - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function(val, options) {\n options = options || {};\n var type = typeof val;\n if (type === 'string' && val.length > 0) {\n return parse(val);\n } else if (type === 'number' && isNaN(val) === false) {\n return options.long ? fmtLong(val) : fmtShort(val);\n }\n throw new Error(\n 'val is not a non-empty string or a valid number. val=' +\n JSON.stringify(val)\n );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n str = String(str);\n if (str.length > 100) {\n return;\n }\n var match = /^((?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(\n str\n );\n if (!match) {\n return;\n }\n var n = parseFloat(match[1]);\n var type = (match[2] || 'ms').toLowerCase();\n switch (type) {\n case 'years':\n case 'year':\n case 'yrs':\n case 'yr':\n case 'y':\n return n * y;\n case 'days':\n case 'day':\n case 'd':\n return n * d;\n case 'hours':\n case 'hour':\n case 'hrs':\n case 'hr':\n case 'h':\n return n * h;\n case 'minutes':\n case 'minute':\n case 'mins':\n case 'min':\n case 'm':\n return n * m;\n case 'seconds':\n case 'second':\n case 'secs':\n case 'sec':\n case 's':\n return n * s;\n case 'milliseconds':\n case 'millisecond':\n case 'msecs':\n case 'msec':\n case 'ms':\n return n;\n default:\n return undefined;\n }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n if (ms >= d) {\n return Math.round(ms / d) + 'd';\n }\n if (ms >= h) {\n return Math.round(ms / h) + 'h';\n }\n if (ms >= m) {\n return Math.round(ms / m) + 'm';\n }\n if (ms >= s) {\n return Math.round(ms / s) + 's';\n }\n return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n return plural(ms, d, 'day') ||\n plural(ms, h, 'hour') ||\n plural(ms, m, 'minute') ||\n plural(ms, s, 'second') ||\n ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, n, name) {\n if (ms < n) {\n return;\n }\n if (ms < n * 1.5) {\n return Math.floor(ms / n) + ' ' + name;\n }\n return Math.ceil(ms / n) + ' ' + name + 's';\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/ms/index.js\n// module id = ./node_modules/ms/index.js\n// module chunks = 0","/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n'use strict';\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/object-assign/index.js\n// module id = ./node_modules/object-assign/index.js\n// module chunks = 0","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/process/browser.js\n// module id = ./node_modules/process/browser.js\n// module chunks = 0","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nif (process.env.NODE_ENV !== 'production') {\n var invariant = require('fbjs/lib/invariant');\n var warning = require('fbjs/lib/warning');\n var ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n var loggedTypeFailures = {};\n}\n\n/**\n * Assert that the values match with the type specs.\n * Error messages are memorized and will only be shown once.\n *\n * @param {object} typeSpecs Map of name to a ReactPropType\n * @param {object} values Runtime values that need to be type-checked\n * @param {string} location e.g. \"prop\", \"context\", \"child context\"\n * @param {string} componentName Name of the component for error messages.\n * @param {?Function} getStack Returns the component stack.\n * @private\n */\nfunction checkPropTypes(typeSpecs, values, location, componentName, getStack) {\n if (process.env.NODE_ENV !== 'production') {\n for (var typeSpecName in typeSpecs) {\n if (typeSpecs.hasOwnProperty(typeSpecName)) {\n var error;\n // Prop type validation may throw. In case they do, we don't want to\n // fail the render phase where it didn't fail before. So we log it.\n // After these have been cleaned up, we'll let them throw.\n try {\n // This is intentionally an invariant that gets caught. It's the same\n // behavior as without this statement except with a better message.\n invariant(typeof typeSpecs[typeSpecName] === 'function', '%s: %s type `%s` is invalid; it must be a function, usually from ' + 'the `prop-types` package, but received `%s`.', componentName || 'React class', location, typeSpecName, typeof typeSpecs[typeSpecName]);\n error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret);\n } catch (ex) {\n error = ex;\n }\n warning(!error || error instanceof Error, '%s: type specification of %s `%s` is invalid; the type checker ' + 'function must return `null` or an `Error` but returned a %s. ' + 'You may have forgotten to pass an argument to the type checker ' + 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + 'shape all require an argument).', componentName || 'React class', location, typeSpecName, typeof error);\n if (error instanceof Error && !(error.message in loggedTypeFailures)) {\n // Only monitor this failure once because there tends to be a lot of the\n // same error.\n loggedTypeFailures[error.message] = true;\n\n var stack = getStack ? getStack() : '';\n\n warning(false, 'Failed %s type: %s%s', location, error.message, stack != null ? stack : '');\n }\n }\n }\n }\n}\n\nmodule.exports = checkPropTypes;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/prop-types/checkPropTypes.js\n// module id = ./node_modules/prop-types/checkPropTypes.js\n// module chunks = 0","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/prop-types/lib/ReactPropTypesSecret.js\n// module id = ./node_modules/prop-types/lib/ReactPropTypesSecret.js\n// module chunks = 0","/*! https://mths.be/punycode v1.4.1 by @mathias */\n;(function(root) {\n\n\t/** Detect free variables */\n\tvar freeExports = typeof exports == 'object' && exports &&\n\t\t!exports.nodeType && exports;\n\tvar freeModule = typeof module == 'object' && module &&\n\t\t!module.nodeType && module;\n\tvar freeGlobal = typeof global == 'object' && global;\n\tif (\n\t\tfreeGlobal.global === freeGlobal ||\n\t\tfreeGlobal.window === freeGlobal ||\n\t\tfreeGlobal.self === freeGlobal\n\t) {\n\t\troot = freeGlobal;\n\t}\n\n\t/**\n\t * The `punycode` object.\n\t * @name punycode\n\t * @type Object\n\t */\n\tvar punycode,\n\n\t/** Highest positive signed 32-bit float value */\n\tmaxInt = 2147483647, // aka. 0x7FFFFFFF or 2^31-1\n\n\t/** Bootstring parameters */\n\tbase = 36,\n\ttMin = 1,\n\ttMax = 26,\n\tskew = 38,\n\tdamp = 700,\n\tinitialBias = 72,\n\tinitialN = 128, // 0x80\n\tdelimiter = '-', // '\\x2D'\n\n\t/** Regular expressions */\n\tregexPunycode = /^xn--/,\n\tregexNonASCII = /[^\\x20-\\x7E]/, // unprintable ASCII chars + non-ASCII chars\n\tregexSeparators = /[\\x2E\\u3002\\uFF0E\\uFF61]/g, // RFC 3490 separators\n\n\t/** Error messages */\n\terrors = {\n\t\t'overflow': 'Overflow: input needs wider integers to process',\n\t\t'not-basic': 'Illegal input >= 0x80 (not a basic code point)',\n\t\t'invalid-input': 'Invalid input'\n\t},\n\n\t/** Convenience shortcuts */\n\tbaseMinusTMin = base - tMin,\n\tfloor = Math.floor,\n\tstringFromCharCode = String.fromCharCode,\n\n\t/** Temporary variable */\n\tkey;\n\n\t/*--------------------------------------------------------------------------*/\n\n\t/**\n\t * A generic error utility function.\n\t * @private\n\t * @param {String} type The error type.\n\t * @returns {Error} Throws a `RangeError` with the applicable error message.\n\t */\n\tfunction error(type) {\n\t\tthrow new RangeError(errors[type]);\n\t}\n\n\t/**\n\t * A generic `Array#map` utility function.\n\t * @private\n\t * @param {Array} array The array to iterate over.\n\t * @param {Function} callback The function that gets called for every array\n\t * item.\n\t * @returns {Array} A new array of values returned by the callback function.\n\t */\n\tfunction map(array, fn) {\n\t\tvar length = array.length;\n\t\tvar result = [];\n\t\twhile (length--) {\n\t\t\tresult[length] = fn(array[length]);\n\t\t}\n\t\treturn result;\n\t}\n\n\t/**\n\t * A simple `Array#map`-like wrapper to work with domain name strings or email\n\t * addresses.\n\t * @private\n\t * @param {String} domain The domain name or email address.\n\t * @param {Function} callback The function that gets called for every\n\t * character.\n\t * @returns {Array} A new string of characters returned by the callback\n\t * function.\n\t */\n\tfunction mapDomain(string, fn) {\n\t\tvar parts = string.split('@');\n\t\tvar result = '';\n\t\tif (parts.length > 1) {\n\t\t\t// In email addresses, only the domain name should be punycoded. Leave\n\t\t\t// the local part (i.e. everything up to `@`) intact.\n\t\t\tresult = parts[0] + '@';\n\t\t\tstring = parts[1];\n\t\t}\n\t\t// Avoid `split(regex)` for IE8 compatibility. See #17.\n\t\tstring = string.replace(regexSeparators, '\\x2E');\n\t\tvar labels = string.split('.');\n\t\tvar encoded = map(labels, fn).join('.');\n\t\treturn result + encoded;\n\t}\n\n\t/**\n\t * Creates an array containing the numeric code points of each Unicode\n\t * character in the string. While JavaScript uses UCS-2 internally,\n\t * this function will convert a pair of surrogate halves (each of which\n\t * UCS-2 exposes as separate characters) into a single code point,\n\t * matching UTF-16.\n\t * @see `punycode.ucs2.encode`\n\t * @see <https://mathiasbynens.be/notes/javascript-encoding>\n\t * @memberOf punycode.ucs2\n\t * @name decode\n\t * @param {String} string The Unicode input string (UCS-2).\n\t * @returns {Array} The new array of code points.\n\t */\n\tfunction ucs2decode(string) {\n\t\tvar output = [],\n\t\t counter = 0,\n\t\t length = string.length,\n\t\t value,\n\t\t extra;\n\t\twhile (counter < length) {\n\t\t\tvalue = string.charCodeAt(counter++);\n\t\t\tif (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t\t\t\t// high surrogate, and there is a next character\n\t\t\t\textra = string.charCodeAt(counter++);\n\t\t\t\tif ((extra & 0xFC00) == 0xDC00) { // low surrogate\n\t\t\t\t\toutput.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t\t\t\t} else {\n\t\t\t\t\t// unmatched surrogate; only append this code unit, in case the next\n\t\t\t\t\t// code unit is the high surrogate of a surrogate pair\n\t\t\t\t\toutput.push(value);\n\t\t\t\t\tcounter--;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\toutput.push(value);\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t}\n\n\t/**\n\t * Creates a string based on an array of numeric code points.\n\t * @see `punycode.ucs2.decode`\n\t * @memberOf punycode.ucs2\n\t * @name encode\n\t * @param {Array} codePoints The array of numeric code points.\n\t * @returns {String} The new Unicode string (UCS-2).\n\t */\n\tfunction ucs2encode(array) {\n\t\treturn map(array, function(value) {\n\t\t\tvar output = '';\n\t\t\tif (value > 0xFFFF) {\n\t\t\t\tvalue -= 0x10000;\n\t\t\t\toutput += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);\n\t\t\t\tvalue = 0xDC00 | value & 0x3FF;\n\t\t\t}\n\t\t\toutput += stringFromCharCode(value);\n\t\t\treturn output;\n\t\t}).join('');\n\t}\n\n\t/**\n\t * Converts a basic code point into a digit/integer.\n\t * @see `digitToBasic()`\n\t * @private\n\t * @param {Number} codePoint The basic numeric code point value.\n\t * @returns {Number} The numeric value of a basic code point (for use in\n\t * representing integers) in the range `0` to `base - 1`, or `base` if\n\t * the code point does not represent a value.\n\t */\n\tfunction basicToDigit(codePoint) {\n\t\tif (codePoint - 48 < 10) {\n\t\t\treturn codePoint - 22;\n\t\t}\n\t\tif (codePoint - 65 < 26) {\n\t\t\treturn codePoint - 65;\n\t\t}\n\t\tif (codePoint - 97 < 26) {\n\t\t\treturn codePoint - 97;\n\t\t}\n\t\treturn base;\n\t}\n\n\t/**\n\t * Converts a digit/integer into a basic code point.\n\t * @see `basicToDigit()`\n\t * @private\n\t * @param {Number} digit The numeric value of a basic code point.\n\t * @returns {Number} The basic code point whose value (when used for\n\t * representing integers) is `digit`, which needs to be in the range\n\t * `0` to `base - 1`. If `flag` is non-zero, the uppercase form is\n\t * used; else, the lowercase form is used. The behavior is undefined\n\t * if `flag` is non-zero and `digit` has no uppercase form.\n\t */\n\tfunction digitToBasic(digit, flag) {\n\t\t// 0..25 map to ASCII a..z or A..Z\n\t\t// 26..35 map to ASCII 0..9\n\t\treturn digit + 22 + 75 * (digit < 26) - ((flag != 0) << 5);\n\t}\n\n\t/**\n\t * Bias adaptation function as per section 3.4 of RFC 3492.\n\t * https://tools.ietf.org/html/rfc3492#section-3.4\n\t * @private\n\t */\n\tfunction adapt(delta, numPoints, firstTime) {\n\t\tvar k = 0;\n\t\tdelta = firstTime ? floor(delta / damp) : delta >> 1;\n\t\tdelta += floor(delta / numPoints);\n\t\tfor (/* no initialization */; delta > baseMinusTMin * tMax >> 1; k += base) {\n\t\t\tdelta = floor(delta / baseMinusTMin);\n\t\t}\n\t\treturn floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n\t}\n\n\t/**\n\t * Converts a Punycode string of ASCII-only symbols to a string of Unicode\n\t * symbols.\n\t * @memberOf punycode\n\t * @param {String} input The Punycode string of ASCII-only symbols.\n\t * @returns {String} The resulting string of Unicode symbols.\n\t */\n\tfunction decode(input) {\n\t\t// Don't use UCS-2\n\t\tvar output = [],\n\t\t inputLength = input.length,\n\t\t out,\n\t\t i = 0,\n\t\t n = initialN,\n\t\t bias = initialBias,\n\t\t basic,\n\t\t j,\n\t\t index,\n\t\t oldi,\n\t\t w,\n\t\t k,\n\t\t digit,\n\t\t t,\n\t\t /** Cached calculation results */\n\t\t baseMinusT;\n\n\t\t// Handle the basic code points: let `basic` be the number of input code\n\t\t// points before the last delimiter, or `0` if there is none, then copy\n\t\t// the first basic code points to the output.\n\n\t\tbasic = input.lastIndexOf(delimiter);\n\t\tif (basic < 0) {\n\t\t\tbasic = 0;\n\t\t}\n\n\t\tfor (j = 0; j < basic; ++j) {\n\t\t\t// if it's not a basic code point\n\t\t\tif (input.charCodeAt(j) >= 0x80) {\n\t\t\t\terror('not-basic');\n\t\t\t}\n\t\t\toutput.push(input.charCodeAt(j));\n\t\t}\n\n\t\t// Main decoding loop: start just after the last delimiter if any basic code\n\t\t// points were copied; start at the beginning otherwise.\n\n\t\tfor (index = basic > 0 ? basic + 1 : 0; index < inputLength; /* no final expression */) {\n\n\t\t\t// `index` is the index of the next character to be consumed.\n\t\t\t// Decode a generalized variable-length integer into `delta`,\n\t\t\t// which gets added to `i`. The overflow checking is easier\n\t\t\t// if we increase `i` as we go, then subtract off its starting\n\t\t\t// value at the end to obtain `delta`.\n\t\t\tfor (oldi = i, w = 1, k = base; /* no condition */; k += base) {\n\n\t\t\t\tif (index >= inputLength) {\n\t\t\t\t\terror('invalid-input');\n\t\t\t\t}\n\n\t\t\t\tdigit = basicToDigit(input.charCodeAt(index++));\n\n\t\t\t\tif (digit >= base || digit > floor((maxInt - i) / w)) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\ti += digit * w;\n\t\t\t\tt = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\n\t\t\t\tif (digit < t) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tbaseMinusT = base - t;\n\t\t\t\tif (w > floor(maxInt / baseMinusT)) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\tw *= baseMinusT;\n\n\t\t\t}\n\n\t\t\tout = output.length + 1;\n\t\t\tbias = adapt(i - oldi, out, oldi == 0);\n\n\t\t\t// `i` was supposed to wrap around from `out` to `0`,\n\t\t\t// incrementing `n` each time, so we'll fix that now:\n\t\t\tif (floor(i / out) > maxInt - n) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tn += floor(i / out);\n\t\t\ti %= out;\n\n\t\t\t// Insert `n` at position `i` of the output\n\t\t\toutput.splice(i++, 0, n);\n\n\t\t}\n\n\t\treturn ucs2encode(output);\n\t}\n\n\t/**\n\t * Converts a string of Unicode symbols (e.g. a domain name label) to a\n\t * Punycode string of ASCII-only symbols.\n\t * @memberOf punycode\n\t * @param {String} input The string of Unicode symbols.\n\t * @returns {String} The resulting Punycode string of ASCII-only symbols.\n\t */\n\tfunction encode(input) {\n\t\tvar n,\n\t\t delta,\n\t\t handledCPCount,\n\t\t basicLength,\n\t\t bias,\n\t\t j,\n\t\t m,\n\t\t q,\n\t\t k,\n\t\t t,\n\t\t currentValue,\n\t\t output = [],\n\t\t /** `inputLength` will hold the number of code points in `input`. */\n\t\t inputLength,\n\t\t /** Cached calculation results */\n\t\t handledCPCountPlusOne,\n\t\t baseMinusT,\n\t\t qMinusT;\n\n\t\t// Convert the input in UCS-2 to Unicode\n\t\tinput = ucs2decode(input);\n\n\t\t// Cache the length\n\t\tinputLength = input.length;\n\n\t\t// Initialize the state\n\t\tn = initialN;\n\t\tdelta = 0;\n\t\tbias = initialBias;\n\n\t\t// Handle the basic code points\n\t\tfor (j = 0; j < inputLength; ++j) {\n\t\t\tcurrentValue = input[j];\n\t\t\tif (currentValue < 0x80) {\n\t\t\t\toutput.push(stringFromCharCode(currentValue));\n\t\t\t}\n\t\t}\n\n\t\thandledCPCount = basicLength = output.length;\n\n\t\t// `handledCPCount` is the number of code points that have been handled;\n\t\t// `basicLength` is the number of basic code points.\n\n\t\t// Finish the basic string - if it is not empty - with a delimiter\n\t\tif (basicLength) {\n\t\t\toutput.push(delimiter);\n\t\t}\n\n\t\t// Main encoding loop:\n\t\twhile (handledCPCount < inputLength) {\n\n\t\t\t// All non-basic code points < n have been handled already. Find the next\n\t\t\t// larger one:\n\t\t\tfor (m = maxInt, j = 0; j < inputLength; ++j) {\n\t\t\t\tcurrentValue = input[j];\n\t\t\t\tif (currentValue >= n && currentValue < m) {\n\t\t\t\t\tm = currentValue;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Increase `delta` enough to advance the decoder's <n,i> state to <m,0>,\n\t\t\t// but guard against overflow\n\t\t\thandledCPCountPlusOne = handledCPCount + 1;\n\t\t\tif (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n\t\t\t\terror('overflow');\n\t\t\t}\n\n\t\t\tdelta += (m - n) * handledCPCountPlusOne;\n\t\t\tn = m;\n\n\t\t\tfor (j = 0; j < inputLength; ++j) {\n\t\t\t\tcurrentValue = input[j];\n\n\t\t\t\tif (currentValue < n && ++delta > maxInt) {\n\t\t\t\t\terror('overflow');\n\t\t\t\t}\n\n\t\t\t\tif (currentValue == n) {\n\t\t\t\t\t// Represent delta as a generalized variable-length integer\n\t\t\t\t\tfor (q = delta, k = base; /* no condition */; k += base) {\n\t\t\t\t\t\tt = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\t\t\t\t\t\tif (q < t) {\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tqMinusT = q - t;\n\t\t\t\t\t\tbaseMinusT = base - t;\n\t\t\t\t\t\toutput.push(\n\t\t\t\t\t\t\tstringFromCharCode(digitToBasic(t + qMinusT % baseMinusT, 0))\n\t\t\t\t\t\t);\n\t\t\t\t\t\tq = floor(qMinusT / baseMinusT);\n\t\t\t\t\t}\n\n\t\t\t\t\toutput.push(stringFromCharCode(digitToBasic(q, 0)));\n\t\t\t\t\tbias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n\t\t\t\t\tdelta = 0;\n\t\t\t\t\t++handledCPCount;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t++delta;\n\t\t\t++n;\n\n\t\t}\n\t\treturn output.join('');\n\t}\n\n\t/**\n\t * Converts a Punycode string representing a domain name or an email address\n\t * to Unicode. Only the Punycoded parts of the input will be converted, i.e.\n\t * it doesn't matter if you call it on a string that has already been\n\t * converted to Unicode.\n\t * @memberOf punycode\n\t * @param {String} input The Punycoded domain name or email address to\n\t * convert to Unicode.\n\t * @returns {String} The Unicode representation of the given Punycode\n\t * string.\n\t */\n\tfunction toUnicode(input) {\n\t\treturn mapDomain(input, function(string) {\n\t\t\treturn regexPunycode.test(string)\n\t\t\t\t? decode(string.slice(4).toLowerCase())\n\t\t\t\t: string;\n\t\t});\n\t}\n\n\t/**\n\t * Converts a Unicode string representing a domain name or an email address to\n\t * Punycode. Only the non-ASCII parts of the domain name will be converted,\n\t * i.e. it doesn't matter if you call it with a domain that's already in\n\t * ASCII.\n\t * @memberOf punycode\n\t * @param {String} input The domain name or email address to convert, as a\n\t * Unicode string.\n\t * @returns {String} The Punycode representation of the given domain name or\n\t * email address.\n\t */\n\tfunction toASCII(input) {\n\t\treturn mapDomain(input, function(string) {\n\t\t\treturn regexNonASCII.test(string)\n\t\t\t\t? 'xn--' + encode(string)\n\t\t\t\t: string;\n\t\t});\n\t}\n\n\t/*--------------------------------------------------------------------------*/\n\n\t/** Define the public API */\n\tpunycode = {\n\t\t/**\n\t\t * A string representing the current Punycode.js version number.\n\t\t * @memberOf punycode\n\t\t * @type String\n\t\t */\n\t\t'version': '1.4.1',\n\t\t/**\n\t\t * An object of methods to convert from JavaScript's internal character\n\t\t * representation (UCS-2) to Unicode code points, and back.\n\t\t * @see <https://mathiasbynens.be/notes/javascript-encoding>\n\t\t * @memberOf punycode\n\t\t * @type Object\n\t\t */\n\t\t'ucs2': {\n\t\t\t'decode': ucs2decode,\n\t\t\t'encode': ucs2encode\n\t\t},\n\t\t'decode': decode,\n\t\t'encode': encode,\n\t\t'toASCII': toASCII,\n\t\t'toUnicode': toUnicode\n\t};\n\n\t/** Expose `punycode` */\n\t// Some AMD build optimizers, like r.js, check for specific condition patterns\n\t// like the following:\n\tif (\n\t\ttypeof define == 'function' &&\n\t\ttypeof define.amd == 'object' &&\n\t\tdefine.amd\n\t) {\n\t\tdefine('punycode', function() {\n\t\t\treturn punycode;\n\t\t});\n\t} else if (freeExports && freeModule) {\n\t\tif (module.exports == freeExports) {\n\t\t\t// in Node.js, io.js, or RingoJS v0.8.0+\n\t\t\tfreeModule.exports = punycode;\n\t\t} else {\n\t\t\t// in Narwhal or RingoJS v0.7.0-\n\t\t\tfor (key in punycode) {\n\t\t\t\tpunycode.hasOwnProperty(key) && (freeExports[key] = punycode[key]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// in Rhino or a web browser\n\t\troot.punycode = punycode;\n\t}\n\n}(this));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/punycode/punycode.js\n// module id = ./node_modules/punycode/punycode.js\n// module chunks = 0","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\n// If obj.hasOwnProperty has been overridden, then calling\n// obj.hasOwnProperty(prop) will break.\n// See: https://github.com/joyent/node/issues/1707\nfunction hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nmodule.exports = function(qs, sep, eq, options) {\n sep = sep || '&';\n eq = eq || '=';\n var obj = {};\n\n if (typeof qs !== 'string' || qs.length === 0) {\n return obj;\n }\n\n var regexp = /\\+/g;\n qs = qs.split(sep);\n\n var maxKeys = 1000;\n if (options && typeof options.maxKeys === 'number') {\n maxKeys = options.maxKeys;\n }\n\n var len = qs.length;\n // maxKeys <= 0 means that we should not limit keys count\n if (maxKeys > 0 && len > maxKeys) {\n len = maxKeys;\n }\n\n for (var i = 0; i < len; ++i) {\n var x = qs[i].replace(regexp, '%20'),\n idx = x.indexOf(eq),\n kstr, vstr, k, v;\n\n if (idx >= 0) {\n kstr = x.substr(0, idx);\n vstr = x.substr(idx + 1);\n } else {\n kstr = x;\n vstr = '';\n }\n\n k = decodeURIComponent(kstr);\n v = decodeURIComponent(vstr);\n\n if (!hasOwnProperty(obj, k)) {\n obj[k] = v;\n } else if (isArray(obj[k])) {\n obj[k].push(v);\n } else {\n obj[k] = [obj[k], v];\n }\n }\n\n return obj;\n};\n\nvar isArray = Array.isArray || function (xs) {\n return Object.prototype.toString.call(xs) === '[object Array]';\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/querystring-es3/decode.js\n// module id = ./node_modules/querystring-es3/decode.js\n// module chunks = 0","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar stringifyPrimitive = function(v) {\n switch (typeof v) {\n case 'string':\n return v;\n\n case 'boolean':\n return v ? 'true' : 'false';\n\n case 'number':\n return isFinite(v) ? v : '';\n\n default:\n return '';\n }\n};\n\nmodule.exports = function(obj, sep, eq, name) {\n sep = sep || '&';\n eq = eq || '=';\n if (obj === null) {\n obj = undefined;\n }\n\n if (typeof obj === 'object') {\n return map(objectKeys(obj), function(k) {\n var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;\n if (isArray(obj[k])) {\n return map(obj[k], function(v) {\n return ks + encodeURIComponent(stringifyPrimitive(v));\n }).join(sep);\n } else {\n return ks + encodeURIComponent(stringifyPrimitive(obj[k]));\n }\n }).join(sep);\n\n }\n\n if (!name) return '';\n return encodeURIComponent(stringifyPrimitive(name)) + eq +\n encodeURIComponent(stringifyPrimitive(obj));\n};\n\nvar isArray = Array.isArray || function (xs) {\n return Object.prototype.toString.call(xs) === '[object Array]';\n};\n\nfunction map (xs, f) {\n if (xs.map) return xs.map(f);\n var res = [];\n for (var i = 0; i < xs.length; i++) {\n res.push(f(xs[i], i));\n }\n return res;\n}\n\nvar objectKeys = Object.keys || function (obj) {\n var res = [];\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key);\n }\n return res;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/querystring-es3/encode.js\n// module id = ./node_modules/querystring-es3/encode.js\n// module chunks = 0","'use strict';\n\nexports.decode = exports.parse = require('./decode');\nexports.encode = exports.stringify = require('./encode');\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/querystring-es3/index.js\n// module id = ./node_modules/querystring-es3/index.js\n// module chunks = 0","/**\n * Copyright (c) 2015-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\n// WARNING: this code is untranspiled and is used in browser too.\n// Please make sure any changes are in ES5 or contribute a Babel compile step.\n\n// Some custom utilities to prettify Webpack output.\n// This is quite hacky and hopefully won't be needed when Webpack fixes this.\n// https://github.com/webpack/webpack/issues/2878\n\nvar chalk = require('chalk');\nvar friendlySyntaxErrorLabel = 'Syntax error:';\n\nfunction isLikelyASyntaxError(message) {\n return message.indexOf(friendlySyntaxErrorLabel) !== -1;\n}\n\n// Cleans up webpack error messages.\n// eslint-disable-next-line no-unused-vars\nfunction formatMessage(message, isError) {\n var lines = message.split('\\n');\n\n if (lines.length > 2 && lines[1] === '') {\n // Remove extra newline.\n lines.splice(1, 1);\n }\n\n // Remove webpack-specific loader notation from filename.\n // Before:\n // ./~/css-loader!./~/postcss-loader!./src/App.css\n // After:\n // ./src/App.css\n if (lines[0].lastIndexOf('!') !== -1) {\n lines[0] = lines[0].substr(lines[0].lastIndexOf('!') + 1);\n }\n\n lines = lines.filter(function(line) {\n // Webpack adds a list of entry points to warning messages:\n // @ ./src/index.js\n // @ multi react-scripts/~/react-dev-utils/webpackHotDevClient.js ...\n // It is misleading (and unrelated to the warnings) so we clean it up.\n // It is only useful for syntax errors but we have beautiful frames for them.\n return line.indexOf(' @ ') !== 0;\n });\n\n // line #0 is filename\n // line #1 is the main error message\n if (!lines[0] || !lines[1]) {\n return lines.join('\\n');\n }\n\n // Cleans up verbose \"module not found\" messages for files and packages.\n if (lines[1].indexOf('Module not found: ') === 0) {\n lines = [\n lines[0],\n // Clean up message because \"Module not found: \" is descriptive enough.\n lines[1]\n .replace(\"Cannot resolve 'file' or 'directory' \", '')\n .replace('Cannot resolve module ', '')\n .replace('Error: ', '')\n .replace('[CaseSensitivePathsPlugin] ', ''),\n ];\n }\n\n // Cleans up syntax error messages.\n if (lines[1].indexOf('Module build failed: ') === 0) {\n lines[1] = lines[1].replace(\n 'Module build failed: SyntaxError:',\n friendlySyntaxErrorLabel\n );\n }\n\n // Clean up export errors.\n // TODO: we should really send a PR to Webpack for this.\n var exportError = /\\s*(.+?)\\s*(\")?export '(.+?)' was not found in '(.+?)'/;\n if (lines[1].match(exportError)) {\n lines[1] = lines[1].replace(\n exportError,\n \"$1 '$4' does not contain an export named '$3'.\"\n );\n }\n\n lines[0] = chalk.inverse(lines[0]);\n\n // Reassemble the message.\n message = lines.join('\\n');\n // Internal stacks are generally useless so we strip them... with the\n // exception of stacks containing `webpack:` because they're normally\n // from user code generated by WebPack. For more information see\n // https://github.com/facebookincubator/create-react-app/pull/1050\n message = message.replace(\n /^\\s*at\\s((?!webpack:).)*:\\d+:\\d+[\\s)]*(\\n|$)/gm,\n ''\n ); // at ... ...:x:y\n\n return message.trim();\n}\n\nfunction formatWebpackMessages(json) {\n var formattedErrors = json.errors.map(function(message) {\n return formatMessage(message, true);\n });\n var formattedWarnings = json.warnings.map(function(message) {\n return formatMessage(message, false);\n });\n var result = {\n errors: formattedErrors,\n warnings: formattedWarnings,\n };\n if (result.errors.some(isLikelyASyntaxError)) {\n // If there are any syntax errors, show just them.\n // This prevents a confusing ESLint parsing error\n // preceding a much more useful Babel syntax error.\n result.errors = result.errors.filter(isLikelyASyntaxError);\n }\n return result;\n}\n\nmodule.exports = formatWebpackMessages;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dev-utils/formatWebpackMessages.js\n// module id = ./node_modules/react-dev-utils/formatWebpackMessages.js\n// module chunks = 0","/**\n * Copyright (c) 2015-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';\n\n// TODO: we might want to make this injectable to support DEV-time non-root URLs.\nmodule.exports = '/__open-stack-frame-in-editor';\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dev-utils/launchEditorEndpoint.js\n// module id = ./node_modules/react-dev-utils/launchEditorEndpoint.js\n// module chunks = 0","'use strict';\nvar escapeStringRegexp = require('escape-string-regexp');\nvar ansiStyles = require('ansi-styles');\nvar stripAnsi = require('strip-ansi');\nvar hasAnsi = require('has-ansi');\nvar supportsColor = require('supports-color');\nvar defineProps = Object.defineProperties;\nvar isSimpleWindowsTerm = process.platform === 'win32' && !/^xterm/i.test(process.env.TERM);\n\nfunction Chalk(options) {\n\t// detect mode if not set manually\n\tthis.enabled = !options || options.enabled === undefined ? supportsColor : options.enabled;\n}\n\n// use bright blue on Windows as the normal blue color is illegible\nif (isSimpleWindowsTerm) {\n\tansiStyles.blue.open = '\\u001b[94m';\n}\n\nvar styles = (function () {\n\tvar ret = {};\n\n\tObject.keys(ansiStyles).forEach(function (key) {\n\t\tansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g');\n\n\t\tret[key] = {\n\t\t\tget: function () {\n\t\t\t\treturn build.call(this, this._styles.concat(key));\n\t\t\t}\n\t\t};\n\t});\n\n\treturn ret;\n})();\n\nvar proto = defineProps(function chalk() {}, styles);\n\nfunction build(_styles) {\n\tvar builder = function () {\n\t\treturn applyStyle.apply(builder, arguments);\n\t};\n\n\tbuilder._styles = _styles;\n\tbuilder.enabled = this.enabled;\n\t// __proto__ is used because we must return a function, but there is\n\t// no way to create a function with a different prototype.\n\t/* eslint-disable no-proto */\n\tbuilder.__proto__ = proto;\n\n\treturn builder;\n}\n\nfunction applyStyle() {\n\t// support varags, but simply cast to string in case there's only one arg\n\tvar args = arguments;\n\tvar argsLen = args.length;\n\tvar str = argsLen !== 0 && String(arguments[0]);\n\n\tif (argsLen > 1) {\n\t\t// don't slice `arguments`, it prevents v8 optimizations\n\t\tfor (var a = 1; a < argsLen; a++) {\n\t\t\tstr += ' ' + args[a];\n\t\t}\n\t}\n\n\tif (!this.enabled || !str) {\n\t\treturn str;\n\t}\n\n\tvar nestedStyles = this._styles;\n\tvar i = nestedStyles.length;\n\n\t// Turns out that on Windows dimmed gray text becomes invisible in cmd.exe,\n\t// see https://github.com/chalk/chalk/issues/58\n\t// If we're on Windows and we're dealing with a gray color, temporarily make 'dim' a noop.\n\tvar originalDim = ansiStyles.dim.open;\n\tif (isSimpleWindowsTerm && (nestedStyles.indexOf('gray') !== -1 || nestedStyles.indexOf('grey') !== -1)) {\n\t\tansiStyles.dim.open = '';\n\t}\n\n\twhile (i--) {\n\t\tvar code = ansiStyles[nestedStyles[i]];\n\n\t\t// Replace any instances already present with a re-opening code\n\t\t// otherwise only the part of the string until said closing code\n\t\t// will be colored, and the rest will simply be 'plain'.\n\t\tstr = code.open + str.replace(code.closeRe, code.open) + code.close;\n\t}\n\n\t// Reset the original 'dim' if we changed it to work around the Windows dimmed gray issue.\n\tansiStyles.dim.open = originalDim;\n\n\treturn str;\n}\n\nfunction init() {\n\tvar ret = {};\n\n\tObject.keys(styles).forEach(function (name) {\n\t\tret[name] = {\n\t\t\tget: function () {\n\t\t\t\treturn build.call(this, [name]);\n\t\t\t}\n\t\t};\n\t});\n\n\treturn ret;\n}\n\ndefineProps(Chalk.prototype, init());\n\nmodule.exports = new Chalk();\nmodule.exports.styles = ansiStyles;\nmodule.exports.hasColor = hasAnsi;\nmodule.exports.stripColor = stripAnsi;\nmodule.exports.supportsColor = supportsColor;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dev-utils/node_modules/chalk/index.js\n// module id = ./node_modules/react-dev-utils/node_modules/chalk/index.js\n// module chunks = 0","'use strict';\nvar ansiRegex = require('ansi-regex')();\n\nmodule.exports = function (str) {\n\treturn typeof str === 'string' ? str.replace(ansiRegex, '') : str;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dev-utils/node_modules/strip-ansi/index.js\n// module id = ./node_modules/react-dev-utils/node_modules/strip-ansi/index.js\n// module chunks = 0","/**\n * Copyright (c) 2015-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\n// This alternative WebpackDevServer combines the functionality of:\n// https://github.com/webpack/webpack-dev-server/blob/webpack-1/client/index.js\n// https://github.com/webpack/webpack/blob/webpack-1/hot/dev-server.js\n\n// It only supports their simplest configuration (hot updates on same server).\n// It makes some opinionated choices on top, like adding a syntax error overlay\n// that looks similar to our console output. The error overlay is inspired by:\n// https://github.com/glenjamin/webpack-hot-middleware\n\nvar SockJS = require('sockjs-client');\nvar stripAnsi = require('strip-ansi');\nvar url = require('url');\nvar launchEditorEndpoint = require('./launchEditorEndpoint');\nvar formatWebpackMessages = require('./formatWebpackMessages');\nvar ErrorOverlay = require('react-error-overlay');\n\nErrorOverlay.setEditorHandler(function editorHandler(errorLocation) {\n // Keep this sync with errorOverlayMiddleware.js\n fetch(\n launchEditorEndpoint +\n '?fileName=' +\n window.encodeURIComponent(errorLocation.fileName) +\n '&lineNumber=' +\n window.encodeURIComponent(errorLocation.lineNumber || 1)\n );\n});\n\n// We need to keep track of if there has been a runtime error.\n// Essentially, we cannot guarantee application state was not corrupted by the\n// runtime error. To prevent confusing behavior, we forcibly reload the entire\n// application. This is handled below when we are notified of a compile (code\n// change).\n// See https://github.com/facebookincubator/create-react-app/issues/3096\nvar hadRuntimeError = false;\nErrorOverlay.startReportingRuntimeErrors({\n onError: function() {\n hadRuntimeError = true;\n },\n filename: '/static/js/bundle.js',\n});\n\nif (module.hot && typeof module.hot.dispose === 'function') {\n module.hot.dispose(function() {\n // TODO: why do we need this?\n ErrorOverlay.stopReportingRuntimeErrors();\n });\n}\n\n// Connect to WebpackDevServer via a socket.\nvar connection = new SockJS(\n url.format({\n protocol: window.location.protocol,\n hostname: window.location.hostname,\n port: window.location.port,\n // Hardcoded in WebpackDevServer\n pathname: '/sockjs-node',\n })\n);\n\n// Unlike WebpackDevServer client, we won't try to reconnect\n// to avoid spamming the console. Disconnect usually happens\n// when developer stops the server.\nconnection.onclose = function() {\n if (typeof console !== 'undefined' && typeof console.info === 'function') {\n console.info(\n 'The development server has disconnected.\\nRefresh the page if necessary.'\n );\n }\n};\n\n// Remember some state related to hot module replacement.\nvar isFirstCompilation = true;\nvar mostRecentCompilationHash = null;\nvar hasCompileErrors = false;\n\nfunction clearOutdatedErrors() {\n // Clean up outdated compile errors, if any.\n if (typeof console !== 'undefined' && typeof console.clear === 'function') {\n if (hasCompileErrors) {\n console.clear();\n }\n }\n}\n\n// Successful compilation.\nfunction handleSuccess() {\n clearOutdatedErrors();\n\n var isHotUpdate = !isFirstCompilation;\n isFirstCompilation = false;\n hasCompileErrors = false;\n\n // Attempt to apply hot updates or reload.\n if (isHotUpdate) {\n tryApplyUpdates(function onHotUpdateSuccess() {\n // Only dismiss it when we're sure it's a hot update.\n // Otherwise it would flicker right before the reload.\n ErrorOverlay.dismissBuildError();\n });\n }\n}\n\n// Compilation with warnings (e.g. ESLint).\nfunction handleWarnings(warnings) {\n clearOutdatedErrors();\n\n var isHotUpdate = !isFirstCompilation;\n isFirstCompilation = false;\n hasCompileErrors = false;\n\n function printWarnings() {\n // Print warnings to the console.\n var formatted = formatWebpackMessages({\n warnings: warnings,\n errors: [],\n });\n\n if (typeof console !== 'undefined' && typeof console.warn === 'function') {\n for (var i = 0; i < formatted.warnings.length; i++) {\n if (i === 5) {\n console.warn(\n 'There were more warnings in other files.\\n' +\n 'You can find a complete log in the terminal.'\n );\n break;\n }\n console.warn(stripAnsi(formatted.warnings[i]));\n }\n }\n }\n\n // Attempt to apply hot updates or reload.\n if (isHotUpdate) {\n tryApplyUpdates(function onSuccessfulHotUpdate() {\n // Only print warnings if we aren't refreshing the page.\n // Otherwise they'll disappear right away anyway.\n printWarnings();\n // Only dismiss it when we're sure it's a hot update.\n // Otherwise it would flicker right before the reload.\n ErrorOverlay.dismissBuildError();\n });\n } else {\n // Print initial warnings immediately.\n printWarnings();\n }\n}\n\n// Compilation with errors (e.g. syntax error or missing modules).\nfunction handleErrors(errors) {\n clearOutdatedErrors();\n\n isFirstCompilation = false;\n hasCompileErrors = true;\n\n // \"Massage\" webpack messages.\n var formatted = formatWebpackMessages({\n errors: errors,\n warnings: [],\n });\n\n // Only show the first error.\n ErrorOverlay.reportBuildError(formatted.errors[0]);\n\n // Also log them to the console.\n if (typeof console !== 'undefined' && typeof console.error === 'function') {\n for (var i = 0; i < formatted.errors.length; i++) {\n console.error(stripAnsi(formatted.errors[i]));\n }\n }\n\n // Do not attempt to reload now.\n // We will reload on next success instead.\n}\n\n// There is a newer version of the code available.\nfunction handleAvailableHash(hash) {\n // Update last known compilation hash.\n mostRecentCompilationHash = hash;\n}\n\n// Handle messages from the server.\nconnection.onmessage = function(e) {\n var message = JSON.parse(e.data);\n switch (message.type) {\n case 'hash':\n handleAvailableHash(message.data);\n break;\n case 'still-ok':\n case 'ok':\n handleSuccess();\n break;\n case 'content-changed':\n // Triggered when a file from `contentBase` changed.\n window.location.reload();\n break;\n case 'warnings':\n handleWarnings(message.data);\n break;\n case 'errors':\n handleErrors(message.data);\n break;\n default:\n // Do nothing.\n }\n};\n\n// Is there a newer version of this code available?\nfunction isUpdateAvailable() {\n /* globals __webpack_hash__ */\n // __webpack_hash__ is the hash of the current compilation.\n // It's a global variable injected by Webpack.\n return mostRecentCompilationHash !== __webpack_hash__;\n}\n\n// Webpack disallows updates in other states.\nfunction canApplyUpdates() {\n return module.hot.status() === 'idle';\n}\n\n// Attempt to update code on the fly, fall back to a hard reload.\nfunction tryApplyUpdates(onHotUpdateSuccess) {\n if (!module.hot) {\n // HotModuleReplacementPlugin is not in Webpack configuration.\n window.location.reload();\n return;\n }\n\n if (!isUpdateAvailable() || !canApplyUpdates()) {\n return;\n }\n\n function handleApplyUpdates(err, updatedModules) {\n if (err || !updatedModules || hadRuntimeError) {\n window.location.reload();\n return;\n }\n\n if (typeof onHotUpdateSuccess === 'function') {\n // Maybe we want to do something.\n onHotUpdateSuccess();\n }\n\n if (isUpdateAvailable()) {\n // While we were updating, there was a new update! Do it again.\n tryApplyUpdates();\n }\n }\n\n // https://webpack.github.io/docs/hot-module-replacement.html#check\n var result = module.hot.check(/* autoApply */ true, handleApplyUpdates);\n\n // // Webpack 2 returns a Promise instead of invoking a callback\n if (result && result.then) {\n result.then(\n function(updatedModules) {\n handleApplyUpdates(null, updatedModules);\n },\n function(err) {\n handleApplyUpdates(err, null);\n }\n );\n }\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dev-utils/webpackHotDevClient.js\n// module id = ./node_modules/react-dev-utils/webpackHotDevClient.js\n// module chunks = 0","/** @license React v16.2.0\n * react-dom.development.js\n *\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\n\n\nif (process.env.NODE_ENV !== \"production\") {\n (function() {\n'use strict';\n\nvar React = require('react');\nvar invariant = require('fbjs/lib/invariant');\nvar warning = require('fbjs/lib/warning');\nvar ExecutionEnvironment = require('fbjs/lib/ExecutionEnvironment');\nvar _assign = require('object-assign');\nvar emptyFunction = require('fbjs/lib/emptyFunction');\nvar EventListener = require('fbjs/lib/EventListener');\nvar getActiveElement = require('fbjs/lib/getActiveElement');\nvar shallowEqual = require('fbjs/lib/shallowEqual');\nvar containsNode = require('fbjs/lib/containsNode');\nvar focusNode = require('fbjs/lib/focusNode');\nvar emptyObject = require('fbjs/lib/emptyObject');\nvar checkPropTypes = require('prop-types/checkPropTypes');\nvar hyphenateStyleName = require('fbjs/lib/hyphenateStyleName');\nvar camelizeStyleName = require('fbjs/lib/camelizeStyleName');\n\n/**\n * WARNING: DO NOT manually require this module.\n * This is a replacement for `invariant(...)` used by the error code system\n * and will _only_ be required by the corresponding babel pass.\n * It always throws.\n */\n\n!React ? invariant(false, 'ReactDOM was loaded before React. Make sure you load the React package before loading ReactDOM.') : void 0;\n\n// These attributes should be all lowercase to allow for\n// case insensitive checks\nvar RESERVED_PROPS = {\n children: true,\n dangerouslySetInnerHTML: true,\n defaultValue: true,\n defaultChecked: true,\n innerHTML: true,\n suppressContentEditableWarning: true,\n suppressHydrationWarning: true,\n style: true\n};\n\nfunction checkMask(value, bitmask) {\n return (value & bitmask) === bitmask;\n}\n\nvar DOMPropertyInjection = {\n /**\n * Mapping from normalized, camelcased property names to a configuration that\n * specifies how the associated DOM property should be accessed or rendered.\n */\n MUST_USE_PROPERTY: 0x1,\n HAS_BOOLEAN_VALUE: 0x4,\n HAS_NUMERIC_VALUE: 0x8,\n HAS_POSITIVE_NUMERIC_VALUE: 0x10 | 0x8,\n HAS_OVERLOADED_BOOLEAN_VALUE: 0x20,\n HAS_STRING_BOOLEAN_VALUE: 0x40,\n\n /**\n * Inject some specialized knowledge about the DOM. This takes a config object\n * with the following properties:\n *\n * Properties: object mapping DOM property name to one of the\n * DOMPropertyInjection constants or null. If your attribute isn't in here,\n * it won't get written to the DOM.\n *\n * DOMAttributeNames: object mapping React attribute name to the DOM\n * attribute name. Attribute names not specified use the **lowercase**\n * normalized name.\n *\n * DOMAttributeNamespaces: object mapping React attribute name to the DOM\n * attribute namespace URL. (Attribute names not specified use no namespace.)\n *\n * DOMPropertyNames: similar to DOMAttributeNames but for DOM properties.\n * Property names not specified use the normalized name.\n *\n * DOMMutationMethods: Properties that require special mutation methods. If\n * `value` is undefined, the mutation method should unset the property.\n *\n * @param {object} domPropertyConfig the config as described above.\n */\n injectDOMPropertyConfig: function (domPropertyConfig) {\n var Injection = DOMPropertyInjection;\n var Properties = domPropertyConfig.Properties || {};\n var DOMAttributeNamespaces = domPropertyConfig.DOMAttributeNamespaces || {};\n var DOMAttributeNames = domPropertyConfig.DOMAttributeNames || {};\n var DOMMutationMethods = domPropertyConfig.DOMMutationMethods || {};\n\n for (var propName in Properties) {\n !!properties.hasOwnProperty(propName) ? invariant(false, \"injectDOMPropertyConfig(...): You're trying to inject DOM property '%s' which has already been injected. You may be accidentally injecting the same DOM property config twice, or you may be injecting two configs that have conflicting property names.\", propName) : void 0;\n\n var lowerCased = propName.toLowerCase();\n var propConfig = Properties[propName];\n\n var propertyInfo = {\n attributeName: lowerCased,\n attributeNamespace: null,\n propertyName: propName,\n mutationMethod: null,\n\n mustUseProperty: checkMask(propConfig, Injection.MUST_USE_PROPERTY),\n hasBooleanValue: checkMask(propConfig, Injection.HAS_BOOLEAN_VALUE),\n hasNumericValue: checkMask(propConfig, Injection.HAS_NUMERIC_VALUE),\n hasPositiveNumericValue: checkMask(propConfig, Injection.HAS_POSITIVE_NUMERIC_VALUE),\n hasOverloadedBooleanValue: checkMask(propConfig, Injection.HAS_OVERLOADED_BOOLEAN_VALUE),\n hasStringBooleanValue: checkMask(propConfig, Injection.HAS_STRING_BOOLEAN_VALUE)\n };\n !(propertyInfo.hasBooleanValue + propertyInfo.hasNumericValue + propertyInfo.hasOverloadedBooleanValue <= 1) ? invariant(false, \"DOMProperty: Value can be one of boolean, overloaded boolean, or numeric value, but not a combination: %s\", propName) : void 0;\n\n if (DOMAttributeNames.hasOwnProperty(propName)) {\n var attributeName = DOMAttributeNames[propName];\n\n propertyInfo.attributeName = attributeName;\n }\n\n if (DOMAttributeNamespaces.hasOwnProperty(propName)) {\n propertyInfo.attributeNamespace = DOMAttributeNamespaces[propName];\n }\n\n if (DOMMutationMethods.hasOwnProperty(propName)) {\n propertyInfo.mutationMethod = DOMMutationMethods[propName];\n }\n\n // Downcase references to whitelist properties to check for membership\n // without case-sensitivity. This allows the whitelist to pick up\n // `allowfullscreen`, which should be written using the property configuration\n // for `allowFullscreen`\n properties[propName] = propertyInfo;\n }\n }\n};\n\n/* eslint-disable max-len */\nvar ATTRIBUTE_NAME_START_CHAR = \":A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD\";\n/* eslint-enable max-len */\nvar ATTRIBUTE_NAME_CHAR = ATTRIBUTE_NAME_START_CHAR + \"\\\\-.0-9\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040\";\n\n\nvar ROOT_ATTRIBUTE_NAME = 'data-reactroot';\n\n/**\n * Map from property \"standard name\" to an object with info about how to set\n * the property in the DOM. Each object contains:\n *\n * attributeName:\n * Used when rendering markup or with `*Attribute()`.\n * attributeNamespace\n * propertyName:\n * Used on DOM node instances. (This includes properties that mutate due to\n * external factors.)\n * mutationMethod:\n * If non-null, used instead of the property or `setAttribute()` after\n * initial render.\n * mustUseProperty:\n * Whether the property must be accessed and mutated as an object property.\n * hasBooleanValue:\n * Whether the property should be removed when set to a falsey value.\n * hasNumericValue:\n * Whether the property must be numeric or parse as a numeric and should be\n * removed when set to a falsey value.\n * hasPositiveNumericValue:\n * Whether the property must be positive numeric or parse as a positive\n * numeric and should be removed when set to a falsey value.\n * hasOverloadedBooleanValue:\n * Whether the property can be used as a flag as well as with a value.\n * Removed when strictly equal to false; present without a value when\n * strictly equal to true; present with a value otherwise.\n */\nvar properties = {};\n\n/**\n * Checks whether a property name is a writeable attribute.\n * @method\n */\nfunction shouldSetAttribute(name, value) {\n if (isReservedProp(name)) {\n return false;\n }\n if (name.length > 2 && (name[0] === 'o' || name[0] === 'O') && (name[1] === 'n' || name[1] === 'N')) {\n return false;\n }\n if (value === null) {\n return true;\n }\n switch (typeof value) {\n case 'boolean':\n return shouldAttributeAcceptBooleanValue(name);\n case 'undefined':\n case 'number':\n case 'string':\n case 'object':\n return true;\n default:\n // function, symbol\n return false;\n }\n}\n\nfunction getPropertyInfo(name) {\n return properties.hasOwnProperty(name) ? properties[name] : null;\n}\n\nfunction shouldAttributeAcceptBooleanValue(name) {\n if (isReservedProp(name)) {\n return true;\n }\n var propertyInfo = getPropertyInfo(name);\n if (propertyInfo) {\n return propertyInfo.hasBooleanValue || propertyInfo.hasStringBooleanValue || propertyInfo.hasOverloadedBooleanValue;\n }\n var prefix = name.toLowerCase().slice(0, 5);\n return prefix === 'data-' || prefix === 'aria-';\n}\n\n/**\n * Checks to see if a property name is within the list of properties\n * reserved for internal React operations. These properties should\n * not be set on an HTML element.\n *\n * @private\n * @param {string} name\n * @return {boolean} If the name is within reserved props\n */\nfunction isReservedProp(name) {\n return RESERVED_PROPS.hasOwnProperty(name);\n}\n\nvar injection = DOMPropertyInjection;\n\nvar MUST_USE_PROPERTY = injection.MUST_USE_PROPERTY;\nvar HAS_BOOLEAN_VALUE = injection.HAS_BOOLEAN_VALUE;\nvar HAS_NUMERIC_VALUE = injection.HAS_NUMERIC_VALUE;\nvar HAS_POSITIVE_NUMERIC_VALUE = injection.HAS_POSITIVE_NUMERIC_VALUE;\nvar HAS_OVERLOADED_BOOLEAN_VALUE = injection.HAS_OVERLOADED_BOOLEAN_VALUE;\nvar HAS_STRING_BOOLEAN_VALUE = injection.HAS_STRING_BOOLEAN_VALUE;\n\nvar HTMLDOMPropertyConfig = {\n // When adding attributes to this list, be sure to also add them to\n // the `possibleStandardNames` module to ensure casing and incorrect\n // name warnings.\n Properties: {\n allowFullScreen: HAS_BOOLEAN_VALUE,\n // specifies target context for links with `preload` type\n async: HAS_BOOLEAN_VALUE,\n // Note: there is a special case that prevents it from being written to the DOM\n // on the client side because the browsers are inconsistent. Instead we call focus().\n autoFocus: HAS_BOOLEAN_VALUE,\n autoPlay: HAS_BOOLEAN_VALUE,\n capture: HAS_OVERLOADED_BOOLEAN_VALUE,\n checked: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,\n cols: HAS_POSITIVE_NUMERIC_VALUE,\n contentEditable: HAS_STRING_BOOLEAN_VALUE,\n controls: HAS_BOOLEAN_VALUE,\n 'default': HAS_BOOLEAN_VALUE,\n defer: HAS_BOOLEAN_VALUE,\n disabled: HAS_BOOLEAN_VALUE,\n download: HAS_OVERLOADED_BOOLEAN_VALUE,\n draggable: HAS_STRING_BOOLEAN_VALUE,\n formNoValidate: HAS_BOOLEAN_VALUE,\n hidden: HAS_BOOLEAN_VALUE,\n loop: HAS_BOOLEAN_VALUE,\n // Caution; `option.selected` is not updated if `select.multiple` is\n // disabled with `removeAttribute`.\n multiple: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,\n muted: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,\n noValidate: HAS_BOOLEAN_VALUE,\n open: HAS_BOOLEAN_VALUE,\n playsInline: HAS_BOOLEAN_VALUE,\n readOnly: HAS_BOOLEAN_VALUE,\n required: HAS_BOOLEAN_VALUE,\n reversed: HAS_BOOLEAN_VALUE,\n rows: HAS_POSITIVE_NUMERIC_VALUE,\n rowSpan: HAS_NUMERIC_VALUE,\n scoped: HAS_BOOLEAN_VALUE,\n seamless: HAS_BOOLEAN_VALUE,\n selected: MUST_USE_PROPERTY | HAS_BOOLEAN_VALUE,\n size: HAS_POSITIVE_NUMERIC_VALUE,\n start: HAS_NUMERIC_VALUE,\n // support for projecting regular DOM Elements via V1 named slots ( shadow dom )\n span: HAS_POSITIVE_NUMERIC_VALUE,\n spellCheck: HAS_STRING_BOOLEAN_VALUE,\n // Style must be explicitly set in the attribute list. React components\n // expect a style object\n style: 0,\n // Keep it in the whitelist because it is case-sensitive for SVG.\n tabIndex: 0,\n // itemScope is for for Microdata support.\n // See http://schema.org/docs/gs.html\n itemScope: HAS_BOOLEAN_VALUE,\n // These attributes must stay in the white-list because they have\n // different attribute names (see DOMAttributeNames below)\n acceptCharset: 0,\n className: 0,\n htmlFor: 0,\n httpEquiv: 0,\n // Attributes with mutation methods must be specified in the whitelist\n // Set the string boolean flag to allow the behavior\n value: HAS_STRING_BOOLEAN_VALUE\n },\n DOMAttributeNames: {\n acceptCharset: 'accept-charset',\n className: 'class',\n htmlFor: 'for',\n httpEquiv: 'http-equiv'\n },\n DOMMutationMethods: {\n value: function (node, value) {\n if (value == null) {\n return node.removeAttribute('value');\n }\n\n // Number inputs get special treatment due to some edge cases in\n // Chrome. Let everything else assign the value attribute as normal.\n // https://github.com/facebook/react/issues/7253#issuecomment-236074326\n if (node.type !== 'number' || node.hasAttribute('value') === false) {\n node.setAttribute('value', '' + value);\n } else if (node.validity && !node.validity.badInput && node.ownerDocument.activeElement !== node) {\n // Don't assign an attribute if validation reports bad\n // input. Chrome will clear the value. Additionally, don't\n // operate on inputs that have focus, otherwise Chrome might\n // strip off trailing decimal places and cause the user's\n // cursor position to jump to the beginning of the input.\n //\n // In ReactDOMInput, we have an onBlur event that will trigger\n // this function again when focus is lost.\n node.setAttribute('value', '' + value);\n }\n }\n }\n};\n\nvar HAS_STRING_BOOLEAN_VALUE$1 = injection.HAS_STRING_BOOLEAN_VALUE;\n\n\nvar NS = {\n xlink: 'http://www.w3.org/1999/xlink',\n xml: 'http://www.w3.org/XML/1998/namespace'\n};\n\n/**\n * This is a list of all SVG attributes that need special casing,\n * namespacing, or boolean value assignment.\n *\n * When adding attributes to this list, be sure to also add them to\n * the `possibleStandardNames` module to ensure casing and incorrect\n * name warnings.\n *\n * SVG Attributes List:\n * https://www.w3.org/TR/SVG/attindex.html\n * SMIL Spec:\n * https://www.w3.org/TR/smil\n */\nvar ATTRS = ['accent-height', 'alignment-baseline', 'arabic-form', 'baseline-shift', 'cap-height', 'clip-path', 'clip-rule', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'dominant-baseline', 'enable-background', 'fill-opacity', 'fill-rule', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'glyph-name', 'glyph-orientation-horizontal', 'glyph-orientation-vertical', 'horiz-adv-x', 'horiz-origin-x', 'image-rendering', 'letter-spacing', 'lighting-color', 'marker-end', 'marker-mid', 'marker-start', 'overline-position', 'overline-thickness', 'paint-order', 'panose-1', 'pointer-events', 'rendering-intent', 'shape-rendering', 'stop-color', 'stop-opacity', 'strikethrough-position', 'strikethrough-thickness', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'text-anchor', 'text-decoration', 'text-rendering', 'underline-position', 'underline-thickness', 'unicode-bidi', 'unicode-range', 'units-per-em', 'v-alphabetic', 'v-hanging', 'v-ideographic', 'v-mathematical', 'vector-effect', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'word-spacing', 'writing-mode', 'x-height', 'xlink:actuate', 'xlink:arcrole', 'xlink:href', 'xlink:role', 'xlink:show', 'xlink:title', 'xlink:type', 'xml:base', 'xmlns:xlink', 'xml:lang', 'xml:space'];\n\nvar SVGDOMPropertyConfig = {\n Properties: {\n autoReverse: HAS_STRING_BOOLEAN_VALUE$1,\n externalResourcesRequired: HAS_STRING_BOOLEAN_VALUE$1,\n preserveAlpha: HAS_STRING_BOOLEAN_VALUE$1\n },\n DOMAttributeNames: {\n autoReverse: 'autoReverse',\n externalResourcesRequired: 'externalResourcesRequired',\n preserveAlpha: 'preserveAlpha'\n },\n DOMAttributeNamespaces: {\n xlinkActuate: NS.xlink,\n xlinkArcrole: NS.xlink,\n xlinkHref: NS.xlink,\n xlinkRole: NS.xlink,\n xlinkShow: NS.xlink,\n xlinkTitle: NS.xlink,\n xlinkType: NS.xlink,\n xmlBase: NS.xml,\n xmlLang: NS.xml,\n xmlSpace: NS.xml\n }\n};\n\nvar CAMELIZE = /[\\-\\:]([a-z])/g;\nvar capitalize = function (token) {\n return token[1].toUpperCase();\n};\n\nATTRS.forEach(function (original) {\n var reactName = original.replace(CAMELIZE, capitalize);\n\n SVGDOMPropertyConfig.Properties[reactName] = 0;\n SVGDOMPropertyConfig.DOMAttributeNames[reactName] = original;\n});\n\ninjection.injectDOMPropertyConfig(HTMLDOMPropertyConfig);\ninjection.injectDOMPropertyConfig(SVGDOMPropertyConfig);\n\nvar ReactErrorUtils = {\n // Used by Fiber to simulate a try-catch.\n _caughtError: null,\n _hasCaughtError: false,\n\n // Used by event system to capture/rethrow the first error.\n _rethrowError: null,\n _hasRethrowError: false,\n\n injection: {\n injectErrorUtils: function (injectedErrorUtils) {\n !(typeof injectedErrorUtils.invokeGuardedCallback === 'function') ? invariant(false, 'Injected invokeGuardedCallback() must be a function.') : void 0;\n invokeGuardedCallback = injectedErrorUtils.invokeGuardedCallback;\n }\n },\n\n /**\n * Call a function while guarding against errors that happens within it.\n * Returns an error if it throws, otherwise null.\n *\n * In production, this is implemented using a try-catch. The reason we don't\n * use a try-catch directly is so that we can swap out a different\n * implementation in DEV mode.\n *\n * @param {String} name of the guard to use for logging or debugging\n * @param {Function} func The function to invoke\n * @param {*} context The context to use when calling the function\n * @param {...*} args Arguments for function\n */\n invokeGuardedCallback: function (name, func, context, a, b, c, d, e, f) {\n invokeGuardedCallback.apply(ReactErrorUtils, arguments);\n },\n\n /**\n * Same as invokeGuardedCallback, but instead of returning an error, it stores\n * it in a global so it can be rethrown by `rethrowCaughtError` later.\n * TODO: See if _caughtError and _rethrowError can be unified.\n *\n * @param {String} name of the guard to use for logging or debugging\n * @param {Function} func The function to invoke\n * @param {*} context The context to use when calling the function\n * @param {...*} args Arguments for function\n */\n invokeGuardedCallbackAndCatchFirstError: function (name, func, context, a, b, c, d, e, f) {\n ReactErrorUtils.invokeGuardedCallback.apply(this, arguments);\n if (ReactErrorUtils.hasCaughtError()) {\n var error = ReactErrorUtils.clearCaughtError();\n if (!ReactErrorUtils._hasRethrowError) {\n ReactErrorUtils._hasRethrowError = true;\n ReactErrorUtils._rethrowError = error;\n }\n }\n },\n\n /**\n * During execution of guarded functions we will capture the first error which\n * we will rethrow to be handled by the top level error handler.\n */\n rethrowCaughtError: function () {\n return rethrowCaughtError.apply(ReactErrorUtils, arguments);\n },\n\n hasCaughtError: function () {\n return ReactErrorUtils._hasCaughtError;\n },\n\n clearCaughtError: function () {\n if (ReactErrorUtils._hasCaughtError) {\n var error = ReactErrorUtils._caughtError;\n ReactErrorUtils._caughtError = null;\n ReactErrorUtils._hasCaughtError = false;\n return error;\n } else {\n invariant(false, 'clearCaughtError was called but no error was captured. This error is likely caused by a bug in React. Please file an issue.');\n }\n }\n};\n\nvar invokeGuardedCallback = function (name, func, context, a, b, c, d, e, f) {\n ReactErrorUtils._hasCaughtError = false;\n ReactErrorUtils._caughtError = null;\n var funcArgs = Array.prototype.slice.call(arguments, 3);\n try {\n func.apply(context, funcArgs);\n } catch (error) {\n ReactErrorUtils._caughtError = error;\n ReactErrorUtils._hasCaughtError = true;\n }\n};\n\n{\n // In DEV mode, we swap out invokeGuardedCallback for a special version\n // that plays more nicely with the browser's DevTools. The idea is to preserve\n // \"Pause on exceptions\" behavior. Because React wraps all user-provided\n // functions in invokeGuardedCallback, and the production version of\n // invokeGuardedCallback uses a try-catch, all user exceptions are treated\n // like caught exceptions, and the DevTools won't pause unless the developer\n // takes the extra step of enabling pause on caught exceptions. This is\n // untintuitive, though, because even though React has caught the error, from\n // the developer's perspective, the error is uncaught.\n //\n // To preserve the expected \"Pause on exceptions\" behavior, we don't use a\n // try-catch in DEV. Instead, we synchronously dispatch a fake event to a fake\n // DOM node, and call the user-provided callback from inside an event handler\n // for that fake event. If the callback throws, the error is \"captured\" using\n // a global event handler. But because the error happens in a different\n // event loop context, it does not interrupt the normal program flow.\n // Effectively, this gives us try-catch behavior without actually using\n // try-catch. Neat!\n\n // Check that the browser supports the APIs we need to implement our special\n // DEV version of invokeGuardedCallback\n if (typeof window !== 'undefined' && typeof window.dispatchEvent === 'function' && typeof document !== 'undefined' && typeof document.createEvent === 'function') {\n var fakeNode = document.createElement('react');\n\n var invokeGuardedCallbackDev = function (name, func, context, a, b, c, d, e, f) {\n // Keeps track of whether the user-provided callback threw an error. We\n // set this to true at the beginning, then set it to false right after\n // calling the function. If the function errors, `didError` will never be\n // set to false. This strategy works even if the browser is flaky and\n // fails to call our global error handler, because it doesn't rely on\n // the error event at all.\n var didError = true;\n\n // Create an event handler for our fake event. We will synchronously\n // dispatch our fake event using `dispatchEvent`. Inside the handler, we\n // call the user-provided callback.\n var funcArgs = Array.prototype.slice.call(arguments, 3);\n function callCallback() {\n // We immediately remove the callback from event listeners so that\n // nested `invokeGuardedCallback` calls do not clash. Otherwise, a\n // nested call would trigger the fake event handlers of any call higher\n // in the stack.\n fakeNode.removeEventListener(evtType, callCallback, false);\n func.apply(context, funcArgs);\n didError = false;\n }\n\n // Create a global error event handler. We use this to capture the value\n // that was thrown. It's possible that this error handler will fire more\n // than once; for example, if non-React code also calls `dispatchEvent`\n // and a handler for that event throws. We should be resilient to most of\n // those cases. Even if our error event handler fires more than once, the\n // last error event is always used. If the callback actually does error,\n // we know that the last error event is the correct one, because it's not\n // possible for anything else to have happened in between our callback\n // erroring and the code that follows the `dispatchEvent` call below. If\n // the callback doesn't error, but the error event was fired, we know to\n // ignore it because `didError` will be false, as described above.\n var error = void 0;\n // Use this to track whether the error event is ever called.\n var didSetError = false;\n var isCrossOriginError = false;\n\n function onError(event) {\n error = event.error;\n didSetError = true;\n if (error === null && event.colno === 0 && event.lineno === 0) {\n isCrossOriginError = true;\n }\n }\n\n // Create a fake event type.\n var evtType = 'react-' + (name ? name : 'invokeguardedcallback');\n\n // Attach our event handlers\n window.addEventListener('error', onError);\n fakeNode.addEventListener(evtType, callCallback, false);\n\n // Synchronously dispatch our fake event. If the user-provided function\n // errors, it will trigger our global error handler.\n var evt = document.createEvent('Event');\n evt.initEvent(evtType, false, false);\n fakeNode.dispatchEvent(evt);\n\n if (didError) {\n if (!didSetError) {\n // The callback errored, but the error event never fired.\n error = new Error('An error was thrown inside one of your components, but React ' + \"doesn't know what it was. This is likely due to browser \" + 'flakiness. React does its best to preserve the \"Pause on ' + 'exceptions\" behavior of the DevTools, which requires some ' + \"DEV-mode only tricks. It's possible that these don't work in \" + 'your browser. Try triggering the error in production mode, ' + 'or switching to a modern browser. If you suspect that this is ' + 'actually an issue with React, please file an issue.');\n } else if (isCrossOriginError) {\n error = new Error(\"A cross-origin error was thrown. React doesn't have access to \" + 'the actual error object in development. ' + 'See https://fb.me/react-crossorigin-error for more information.');\n }\n ReactErrorUtils._hasCaughtError = true;\n ReactErrorUtils._caughtError = error;\n } else {\n ReactErrorUtils._hasCaughtError = false;\n ReactErrorUtils._caughtError = null;\n }\n\n // Remove our event listeners\n window.removeEventListener('error', onError);\n };\n\n invokeGuardedCallback = invokeGuardedCallbackDev;\n }\n}\n\nvar rethrowCaughtError = function () {\n if (ReactErrorUtils._hasRethrowError) {\n var error = ReactErrorUtils._rethrowError;\n ReactErrorUtils._rethrowError = null;\n ReactErrorUtils._hasRethrowError = false;\n throw error;\n }\n};\n\n/**\n * Injectable ordering of event plugins.\n */\nvar eventPluginOrder = null;\n\n/**\n * Injectable mapping from names to event plugin modules.\n */\nvar namesToPlugins = {};\n\n/**\n * Recomputes the plugin list using the injected plugins and plugin ordering.\n *\n * @private\n */\nfunction recomputePluginOrdering() {\n if (!eventPluginOrder) {\n // Wait until an `eventPluginOrder` is injected.\n return;\n }\n for (var pluginName in namesToPlugins) {\n var pluginModule = namesToPlugins[pluginName];\n var pluginIndex = eventPluginOrder.indexOf(pluginName);\n !(pluginIndex > -1) ? invariant(false, 'EventPluginRegistry: Cannot inject event plugins that do not exist in the plugin ordering, `%s`.', pluginName) : void 0;\n if (plugins[pluginIndex]) {\n continue;\n }\n !pluginModule.extractEvents ? invariant(false, 'EventPluginRegistry: Event plugins must implement an `extractEvents` method, but `%s` does not.', pluginName) : void 0;\n plugins[pluginIndex] = pluginModule;\n var publishedEvents = pluginModule.eventTypes;\n for (var eventName in publishedEvents) {\n !publishEventForPlugin(publishedEvents[eventName], pluginModule, eventName) ? invariant(false, 'EventPluginRegistry: Failed to publish event `%s` for plugin `%s`.', eventName, pluginName) : void 0;\n }\n }\n}\n\n/**\n * Publishes an event so that it can be dispatched by the supplied plugin.\n *\n * @param {object} dispatchConfig Dispatch configuration for the event.\n * @param {object} PluginModule Plugin publishing the event.\n * @return {boolean} True if the event was successfully published.\n * @private\n */\nfunction publishEventForPlugin(dispatchConfig, pluginModule, eventName) {\n !!eventNameDispatchConfigs.hasOwnProperty(eventName) ? invariant(false, 'EventPluginHub: More than one plugin attempted to publish the same event name, `%s`.', eventName) : void 0;\n eventNameDispatchConfigs[eventName] = dispatchConfig;\n\n var phasedRegistrationNames = dispatchConfig.phasedRegistrationNames;\n if (phasedRegistrationNames) {\n for (var phaseName in phasedRegistrationNames) {\n if (phasedRegistrationNames.hasOwnProperty(phaseName)) {\n var phasedRegistrationName = phasedRegistrationNames[phaseName];\n publishRegistrationName(phasedRegistrationName, pluginModule, eventName);\n }\n }\n return true;\n } else if (dispatchConfig.registrationName) {\n publishRegistrationName(dispatchConfig.registrationName, pluginModule, eventName);\n return true;\n }\n return false;\n}\n\n/**\n * Publishes a registration name that is used to identify dispatched events.\n *\n * @param {string} registrationName Registration name to add.\n * @param {object} PluginModule Plugin publishing the event.\n * @private\n */\nfunction publishRegistrationName(registrationName, pluginModule, eventName) {\n !!registrationNameModules[registrationName] ? invariant(false, 'EventPluginHub: More than one plugin attempted to publish the same registration name, `%s`.', registrationName) : void 0;\n registrationNameModules[registrationName] = pluginModule;\n registrationNameDependencies[registrationName] = pluginModule.eventTypes[eventName].dependencies;\n\n {\n var lowerCasedName = registrationName.toLowerCase();\n possibleRegistrationNames[lowerCasedName] = registrationName;\n\n if (registrationName === 'onDoubleClick') {\n possibleRegistrationNames.ondblclick = registrationName;\n }\n }\n}\n\n/**\n * Registers plugins so that they can extract and dispatch events.\n *\n * @see {EventPluginHub}\n */\n\n/**\n * Ordered list of injected plugins.\n */\nvar plugins = [];\n\n/**\n * Mapping from event name to dispatch config\n */\nvar eventNameDispatchConfigs = {};\n\n/**\n * Mapping from registration name to plugin module\n */\nvar registrationNameModules = {};\n\n/**\n * Mapping from registration name to event name\n */\nvar registrationNameDependencies = {};\n\n/**\n * Mapping from lowercase registration names to the properly cased version,\n * used to warn in the case of missing event handlers. Available\n * only in true.\n * @type {Object}\n */\nvar possibleRegistrationNames = {};\n// Trust the developer to only use possibleRegistrationNames in true\n\n/**\n * Injects an ordering of plugins (by plugin name). This allows the ordering\n * to be decoupled from injection of the actual plugins so that ordering is\n * always deterministic regardless of packaging, on-the-fly injection, etc.\n *\n * @param {array} InjectedEventPluginOrder\n * @internal\n * @see {EventPluginHub.injection.injectEventPluginOrder}\n */\nfunction injectEventPluginOrder(injectedEventPluginOrder) {\n !!eventPluginOrder ? invariant(false, 'EventPluginRegistry: Cannot inject event plugin ordering more than once. You are likely trying to load more than one copy of React.') : void 0;\n // Clone the ordering so it cannot be dynamically mutated.\n eventPluginOrder = Array.prototype.slice.call(injectedEventPluginOrder);\n recomputePluginOrdering();\n}\n\n/**\n * Injects plugins to be used by `EventPluginHub`. The plugin names must be\n * in the ordering injected by `injectEventPluginOrder`.\n *\n * Plugins can be injected as part of page initialization or on-the-fly.\n *\n * @param {object} injectedNamesToPlugins Map from names to plugin modules.\n * @internal\n * @see {EventPluginHub.injection.injectEventPluginsByName}\n */\nfunction injectEventPluginsByName(injectedNamesToPlugins) {\n var isOrderingDirty = false;\n for (var pluginName in injectedNamesToPlugins) {\n if (!injectedNamesToPlugins.hasOwnProperty(pluginName)) {\n continue;\n }\n var pluginModule = injectedNamesToPlugins[pluginName];\n if (!namesToPlugins.hasOwnProperty(pluginName) || namesToPlugins[pluginName] !== pluginModule) {\n !!namesToPlugins[pluginName] ? invariant(false, 'EventPluginRegistry: Cannot inject two different event plugins using the same name, `%s`.', pluginName) : void 0;\n namesToPlugins[pluginName] = pluginModule;\n isOrderingDirty = true;\n }\n }\n if (isOrderingDirty) {\n recomputePluginOrdering();\n }\n}\n\nvar EventPluginRegistry = Object.freeze({\n\tplugins: plugins,\n\teventNameDispatchConfigs: eventNameDispatchConfigs,\n\tregistrationNameModules: registrationNameModules,\n\tregistrationNameDependencies: registrationNameDependencies,\n\tpossibleRegistrationNames: possibleRegistrationNames,\n\tinjectEventPluginOrder: injectEventPluginOrder,\n\tinjectEventPluginsByName: injectEventPluginsByName\n});\n\nvar getFiberCurrentPropsFromNode = null;\nvar getInstanceFromNode = null;\nvar getNodeFromInstance = null;\n\nvar injection$2 = {\n injectComponentTree: function (Injected) {\n getFiberCurrentPropsFromNode = Injected.getFiberCurrentPropsFromNode;\n getInstanceFromNode = Injected.getInstanceFromNode;\n getNodeFromInstance = Injected.getNodeFromInstance;\n\n {\n warning(getNodeFromInstance && getInstanceFromNode, 'EventPluginUtils.injection.injectComponentTree(...): Injected ' + 'module is missing getNodeFromInstance or getInstanceFromNode.');\n }\n }\n};\n\n\n\n\n\n\nvar validateEventDispatches;\n{\n validateEventDispatches = function (event) {\n var dispatchListeners = event._dispatchListeners;\n var dispatchInstances = event._dispatchInstances;\n\n var listenersIsArr = Array.isArray(dispatchListeners);\n var listenersLen = listenersIsArr ? dispatchListeners.length : dispatchListeners ? 1 : 0;\n\n var instancesIsArr = Array.isArray(dispatchInstances);\n var instancesLen = instancesIsArr ? dispatchInstances.length : dispatchInstances ? 1 : 0;\n\n warning(instancesIsArr === listenersIsArr && instancesLen === listenersLen, 'EventPluginUtils: Invalid `event`.');\n };\n}\n\n/**\n * Dispatch the event to the listener.\n * @param {SyntheticEvent} event SyntheticEvent to handle\n * @param {boolean} simulated If the event is simulated (changes exn behavior)\n * @param {function} listener Application-level callback\n * @param {*} inst Internal component instance\n */\nfunction executeDispatch(event, simulated, listener, inst) {\n var type = event.type || 'unknown-event';\n event.currentTarget = getNodeFromInstance(inst);\n ReactErrorUtils.invokeGuardedCallbackAndCatchFirstError(type, listener, undefined, event);\n event.currentTarget = null;\n}\n\n/**\n * Standard/simple iteration through an event's collected dispatches.\n */\nfunction executeDispatchesInOrder(event, simulated) {\n var dispatchListeners = event._dispatchListeners;\n var dispatchInstances = event._dispatchInstances;\n {\n validateEventDispatches(event);\n }\n if (Array.isArray(dispatchListeners)) {\n for (var i = 0; i < dispatchListeners.length; i++) {\n if (event.isPropagationStopped()) {\n break;\n }\n // Listeners and Instances are two parallel arrays that are always in sync.\n executeDispatch(event, simulated, dispatchListeners[i], dispatchInstances[i]);\n }\n } else if (dispatchListeners) {\n executeDispatch(event, simulated, dispatchListeners, dispatchInstances);\n }\n event._dispatchListeners = null;\n event._dispatchInstances = null;\n}\n\n/**\n * @see executeDispatchesInOrderStopAtTrueImpl\n */\n\n\n/**\n * Execution of a \"direct\" dispatch - there must be at most one dispatch\n * accumulated on the event or it is considered an error. It doesn't really make\n * sense for an event with multiple dispatches (bubbled) to keep track of the\n * return values at each dispatch execution, but it does tend to make sense when\n * dealing with \"direct\" dispatches.\n *\n * @return {*} The return value of executing the single dispatch.\n */\n\n\n/**\n * @param {SyntheticEvent} event\n * @return {boolean} True iff number of dispatches accumulated is greater than 0.\n */\n\n/**\n * Accumulates items that must not be null or undefined into the first one. This\n * is used to conserve memory by avoiding array allocations, and thus sacrifices\n * API cleanness. Since `current` can be null before being passed in and not\n * null after this function, make sure to assign it back to `current`:\n *\n * `a = accumulateInto(a, b);`\n *\n * This API should be sparingly used. Try `accumulate` for something cleaner.\n *\n * @return {*|array<*>} An accumulation of items.\n */\n\nfunction accumulateInto(current, next) {\n !(next != null) ? invariant(false, 'accumulateInto(...): Accumulated items must not be null or undefined.') : void 0;\n\n if (current == null) {\n return next;\n }\n\n // Both are not empty. Warning: Never call x.concat(y) when you are not\n // certain that x is an Array (x could be a string with concat method).\n if (Array.isArray(current)) {\n if (Array.isArray(next)) {\n current.push.apply(current, next);\n return current;\n }\n current.push(next);\n return current;\n }\n\n if (Array.isArray(next)) {\n // A bit too dangerous to mutate `next`.\n return [current].concat(next);\n }\n\n return [current, next];\n}\n\n/**\n * @param {array} arr an \"accumulation\" of items which is either an Array or\n * a single item. Useful when paired with the `accumulate` module. This is a\n * simple utility that allows us to reason about a collection of items, but\n * handling the case when there is exactly one item (and we do not need to\n * allocate an array).\n * @param {function} cb Callback invoked with each element or a collection.\n * @param {?} [scope] Scope used as `this` in a callback.\n */\nfunction forEachAccumulated(arr, cb, scope) {\n if (Array.isArray(arr)) {\n arr.forEach(cb, scope);\n } else if (arr) {\n cb.call(scope, arr);\n }\n}\n\n/**\n * Internal queue of events that have accumulated their dispatches and are\n * waiting to have their dispatches executed.\n */\nvar eventQueue = null;\n\n/**\n * Dispatches an event and releases it back into the pool, unless persistent.\n *\n * @param {?object} event Synthetic event to be dispatched.\n * @param {boolean} simulated If the event is simulated (changes exn behavior)\n * @private\n */\nvar executeDispatchesAndRelease = function (event, simulated) {\n if (event) {\n executeDispatchesInOrder(event, simulated);\n\n if (!event.isPersistent()) {\n event.constructor.release(event);\n }\n }\n};\nvar executeDispatchesAndReleaseSimulated = function (e) {\n return executeDispatchesAndRelease(e, true);\n};\nvar executeDispatchesAndReleaseTopLevel = function (e) {\n return executeDispatchesAndRelease(e, false);\n};\n\nfunction isInteractive(tag) {\n return tag === 'button' || tag === 'input' || tag === 'select' || tag === 'textarea';\n}\n\nfunction shouldPreventMouseEvent(name, type, props) {\n switch (name) {\n case 'onClick':\n case 'onClickCapture':\n case 'onDoubleClick':\n case 'onDoubleClickCapture':\n case 'onMouseDown':\n case 'onMouseDownCapture':\n case 'onMouseMove':\n case 'onMouseMoveCapture':\n case 'onMouseUp':\n case 'onMouseUpCapture':\n return !!(props.disabled && isInteractive(type));\n default:\n return false;\n }\n}\n\n/**\n * This is a unified interface for event plugins to be installed and configured.\n *\n * Event plugins can implement the following properties:\n *\n * `extractEvents` {function(string, DOMEventTarget, string, object): *}\n * Required. When a top-level event is fired, this method is expected to\n * extract synthetic events that will in turn be queued and dispatched.\n *\n * `eventTypes` {object}\n * Optional, plugins that fire events must publish a mapping of registration\n * names that are used to register listeners. Values of this mapping must\n * be objects that contain `registrationName` or `phasedRegistrationNames`.\n *\n * `executeDispatch` {function(object, function, string)}\n * Optional, allows plugins to override how an event gets dispatched. By\n * default, the listener is simply invoked.\n *\n * Each plugin that is injected into `EventsPluginHub` is immediately operable.\n *\n * @public\n */\n\n/**\n * Methods for injecting dependencies.\n */\nvar injection$1 = {\n /**\n * @param {array} InjectedEventPluginOrder\n * @public\n */\n injectEventPluginOrder: injectEventPluginOrder,\n\n /**\n * @param {object} injectedNamesToPlugins Map from names to plugin modules.\n */\n injectEventPluginsByName: injectEventPluginsByName\n};\n\n/**\n * @param {object} inst The instance, which is the source of events.\n * @param {string} registrationName Name of listener (e.g. `onClick`).\n * @return {?function} The stored callback.\n */\nfunction getListener(inst, registrationName) {\n var listener;\n\n // TODO: shouldPreventMouseEvent is DOM-specific and definitely should not\n // live here; needs to be moved to a better place soon\n var stateNode = inst.stateNode;\n if (!stateNode) {\n // Work in progress (ex: onload events in incremental mode).\n return null;\n }\n var props = getFiberCurrentPropsFromNode(stateNode);\n if (!props) {\n // Work in progress.\n return null;\n }\n listener = props[registrationName];\n if (shouldPreventMouseEvent(registrationName, inst.type, props)) {\n return null;\n }\n !(!listener || typeof listener === 'function') ? invariant(false, 'Expected `%s` listener to be a function, instead got a value of `%s` type.', registrationName, typeof listener) : void 0;\n return listener;\n}\n\n/**\n * Allows registered plugins an opportunity to extract events from top-level\n * native browser events.\n *\n * @return {*} An accumulation of synthetic events.\n * @internal\n */\nfunction extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget) {\n var events;\n for (var i = 0; i < plugins.length; i++) {\n // Not every plugin in the ordering may be loaded at runtime.\n var possiblePlugin = plugins[i];\n if (possiblePlugin) {\n var extractedEvents = possiblePlugin.extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget);\n if (extractedEvents) {\n events = accumulateInto(events, extractedEvents);\n }\n }\n }\n return events;\n}\n\n/**\n * Enqueues a synthetic event that should be dispatched when\n * `processEventQueue` is invoked.\n *\n * @param {*} events An accumulation of synthetic events.\n * @internal\n */\nfunction enqueueEvents(events) {\n if (events) {\n eventQueue = accumulateInto(eventQueue, events);\n }\n}\n\n/**\n * Dispatches all synthetic events on the event queue.\n *\n * @internal\n */\nfunction processEventQueue(simulated) {\n // Set `eventQueue` to null before processing it so that we can tell if more\n // events get enqueued while processing.\n var processingEventQueue = eventQueue;\n eventQueue = null;\n\n if (!processingEventQueue) {\n return;\n }\n\n if (simulated) {\n forEachAccumulated(processingEventQueue, executeDispatchesAndReleaseSimulated);\n } else {\n forEachAccumulated(processingEventQueue, executeDispatchesAndReleaseTopLevel);\n }\n !!eventQueue ? invariant(false, 'processEventQueue(): Additional events were enqueued while processing an event queue. Support for this has not yet been implemented.') : void 0;\n // This would be a good time to rethrow if any of the event handlers threw.\n ReactErrorUtils.rethrowCaughtError();\n}\n\nvar EventPluginHub = Object.freeze({\n\tinjection: injection$1,\n\tgetListener: getListener,\n\textractEvents: extractEvents,\n\tenqueueEvents: enqueueEvents,\n\tprocessEventQueue: processEventQueue\n});\n\nvar IndeterminateComponent = 0; // Before we know whether it is functional or class\nvar FunctionalComponent = 1;\nvar ClassComponent = 2;\nvar HostRoot = 3; // Root of a host tree. Could be nested inside another node.\nvar HostPortal = 4; // A subtree. Could be an entry point to a different renderer.\nvar HostComponent = 5;\nvar HostText = 6;\nvar CallComponent = 7;\nvar CallHandlerPhase = 8;\nvar ReturnComponent = 9;\nvar Fragment = 10;\n\nvar randomKey = Math.random().toString(36).slice(2);\nvar internalInstanceKey = '__reactInternalInstance$' + randomKey;\nvar internalEventHandlersKey = '__reactEventHandlers$' + randomKey;\n\nfunction precacheFiberNode$1(hostInst, node) {\n node[internalInstanceKey] = hostInst;\n}\n\n/**\n * Given a DOM node, return the closest ReactDOMComponent or\n * ReactDOMTextComponent instance ancestor.\n */\nfunction getClosestInstanceFromNode(node) {\n if (node[internalInstanceKey]) {\n return node[internalInstanceKey];\n }\n\n // Walk up the tree until we find an ancestor whose instance we have cached.\n var parents = [];\n while (!node[internalInstanceKey]) {\n parents.push(node);\n if (node.parentNode) {\n node = node.parentNode;\n } else {\n // Top of the tree. This node must not be part of a React tree (or is\n // unmounted, potentially).\n return null;\n }\n }\n\n var closest = void 0;\n var inst = node[internalInstanceKey];\n if (inst.tag === HostComponent || inst.tag === HostText) {\n // In Fiber, this will always be the deepest root.\n return inst;\n }\n for (; node && (inst = node[internalInstanceKey]); node = parents.pop()) {\n closest = inst;\n }\n\n return closest;\n}\n\n/**\n * Given a DOM node, return the ReactDOMComponent or ReactDOMTextComponent\n * instance, or null if the node was not rendered by this React.\n */\nfunction getInstanceFromNode$1(node) {\n var inst = node[internalInstanceKey];\n if (inst) {\n if (inst.tag === HostComponent || inst.tag === HostText) {\n return inst;\n } else {\n return null;\n }\n }\n return null;\n}\n\n/**\n * Given a ReactDOMComponent or ReactDOMTextComponent, return the corresponding\n * DOM node.\n */\nfunction getNodeFromInstance$1(inst) {\n if (inst.tag === HostComponent || inst.tag === HostText) {\n // In Fiber this, is just the state node right now. We assume it will be\n // a host component or host text.\n return inst.stateNode;\n }\n\n // Without this first invariant, passing a non-DOM-component triggers the next\n // invariant for a missing parent, which is super confusing.\n invariant(false, 'getNodeFromInstance: Invalid argument.');\n}\n\nfunction getFiberCurrentPropsFromNode$1(node) {\n return node[internalEventHandlersKey] || null;\n}\n\nfunction updateFiberProps$1(node, props) {\n node[internalEventHandlersKey] = props;\n}\n\nvar ReactDOMComponentTree = Object.freeze({\n\tprecacheFiberNode: precacheFiberNode$1,\n\tgetClosestInstanceFromNode: getClosestInstanceFromNode,\n\tgetInstanceFromNode: getInstanceFromNode$1,\n\tgetNodeFromInstance: getNodeFromInstance$1,\n\tgetFiberCurrentPropsFromNode: getFiberCurrentPropsFromNode$1,\n\tupdateFiberProps: updateFiberProps$1\n});\n\nfunction getParent(inst) {\n do {\n inst = inst['return'];\n // TODO: If this is a HostRoot we might want to bail out.\n // That is depending on if we want nested subtrees (layers) to bubble\n // events to their parent. We could also go through parentNode on the\n // host node but that wouldn't work for React Native and doesn't let us\n // do the portal feature.\n } while (inst && inst.tag !== HostComponent);\n if (inst) {\n return inst;\n }\n return null;\n}\n\n/**\n * Return the lowest common ancestor of A and B, or null if they are in\n * different trees.\n */\nfunction getLowestCommonAncestor(instA, instB) {\n var depthA = 0;\n for (var tempA = instA; tempA; tempA = getParent(tempA)) {\n depthA++;\n }\n var depthB = 0;\n for (var tempB = instB; tempB; tempB = getParent(tempB)) {\n depthB++;\n }\n\n // If A is deeper, crawl up.\n while (depthA - depthB > 0) {\n instA = getParent(instA);\n depthA--;\n }\n\n // If B is deeper, crawl up.\n while (depthB - depthA > 0) {\n instB = getParent(instB);\n depthB--;\n }\n\n // Walk in lockstep until we find a match.\n var depth = depthA;\n while (depth--) {\n if (instA === instB || instA === instB.alternate) {\n return instA;\n }\n instA = getParent(instA);\n instB = getParent(instB);\n }\n return null;\n}\n\n/**\n * Return if A is an ancestor of B.\n */\n\n\n/**\n * Return the parent instance of the passed-in instance.\n */\nfunction getParentInstance(inst) {\n return getParent(inst);\n}\n\n/**\n * Simulates the traversal of a two-phase, capture/bubble event dispatch.\n */\nfunction traverseTwoPhase(inst, fn, arg) {\n var path = [];\n while (inst) {\n path.push(inst);\n inst = getParent(inst);\n }\n var i;\n for (i = path.length; i-- > 0;) {\n fn(path[i], 'captured', arg);\n }\n for (i = 0; i < path.length; i++) {\n fn(path[i], 'bubbled', arg);\n }\n}\n\n/**\n * Traverses the ID hierarchy and invokes the supplied `cb` on any IDs that\n * should would receive a `mouseEnter` or `mouseLeave` event.\n *\n * Does not invoke the callback on the nearest common ancestor because nothing\n * \"entered\" or \"left\" that element.\n */\nfunction traverseEnterLeave(from, to, fn, argFrom, argTo) {\n var common = from && to ? getLowestCommonAncestor(from, to) : null;\n var pathFrom = [];\n while (true) {\n if (!from) {\n break;\n }\n if (from === common) {\n break;\n }\n var alternate = from.alternate;\n if (alternate !== null && alternate === common) {\n break;\n }\n pathFrom.push(from);\n from = getParent(from);\n }\n var pathTo = [];\n while (true) {\n if (!to) {\n break;\n }\n if (to === common) {\n break;\n }\n var _alternate = to.alternate;\n if (_alternate !== null && _alternate === common) {\n break;\n }\n pathTo.push(to);\n to = getParent(to);\n }\n for (var i = 0; i < pathFrom.length; i++) {\n fn(pathFrom[i], 'bubbled', argFrom);\n }\n for (var _i = pathTo.length; _i-- > 0;) {\n fn(pathTo[_i], 'captured', argTo);\n }\n}\n\n/**\n * Some event types have a notion of different registration names for different\n * \"phases\" of propagation. This finds listeners by a given phase.\n */\nfunction listenerAtPhase(inst, event, propagationPhase) {\n var registrationName = event.dispatchConfig.phasedRegistrationNames[propagationPhase];\n return getListener(inst, registrationName);\n}\n\n/**\n * A small set of propagation patterns, each of which will accept a small amount\n * of information, and generate a set of \"dispatch ready event objects\" - which\n * are sets of events that have already been annotated with a set of dispatched\n * listener functions/ids. The API is designed this way to discourage these\n * propagation strategies from actually executing the dispatches, since we\n * always want to collect the entire set of dispatches before executing even a\n * single one.\n */\n\n/**\n * Tags a `SyntheticEvent` with dispatched listeners. Creating this function\n * here, allows us to not have to bind or create functions for each event.\n * Mutating the event's members allows us to not have to create a wrapping\n * \"dispatch\" object that pairs the event with the listener.\n */\nfunction accumulateDirectionalDispatches(inst, phase, event) {\n {\n warning(inst, 'Dispatching inst must not be null');\n }\n var listener = listenerAtPhase(inst, event, phase);\n if (listener) {\n event._dispatchListeners = accumulateInto(event._dispatchListeners, listener);\n event._dispatchInstances = accumulateInto(event._dispatchInstances, inst);\n }\n}\n\n/**\n * Collect dispatches (must be entirely collected before dispatching - see unit\n * tests). Lazily allocate the array to conserve memory. We must loop through\n * each event and perform the traversal for each one. We cannot perform a\n * single traversal for the entire collection of events because each event may\n * have a different target.\n */\nfunction accumulateTwoPhaseDispatchesSingle(event) {\n if (event && event.dispatchConfig.phasedRegistrationNames) {\n traverseTwoPhase(event._targetInst, accumulateDirectionalDispatches, event);\n }\n}\n\n/**\n * Same as `accumulateTwoPhaseDispatchesSingle`, but skips over the targetID.\n */\nfunction accumulateTwoPhaseDispatchesSingleSkipTarget(event) {\n if (event && event.dispatchConfig.phasedRegistrationNames) {\n var targetInst = event._targetInst;\n var parentInst = targetInst ? getParentInstance(targetInst) : null;\n traverseTwoPhase(parentInst, accumulateDirectionalDispatches, event);\n }\n}\n\n/**\n * Accumulates without regard to direction, does not look for phased\n * registration names. Same as `accumulateDirectDispatchesSingle` but without\n * requiring that the `dispatchMarker` be the same as the dispatched ID.\n */\nfunction accumulateDispatches(inst, ignoredDirection, event) {\n if (inst && event && event.dispatchConfig.registrationName) {\n var registrationName = event.dispatchConfig.registrationName;\n var listener = getListener(inst, registrationName);\n if (listener) {\n event._dispatchListeners = accumulateInto(event._dispatchListeners, listener);\n event._dispatchInstances = accumulateInto(event._dispatchInstances, inst);\n }\n }\n}\n\n/**\n * Accumulates dispatches on an `SyntheticEvent`, but only for the\n * `dispatchMarker`.\n * @param {SyntheticEvent} event\n */\nfunction accumulateDirectDispatchesSingle(event) {\n if (event && event.dispatchConfig.registrationName) {\n accumulateDispatches(event._targetInst, null, event);\n }\n}\n\nfunction accumulateTwoPhaseDispatches(events) {\n forEachAccumulated(events, accumulateTwoPhaseDispatchesSingle);\n}\n\nfunction accumulateTwoPhaseDispatchesSkipTarget(events) {\n forEachAccumulated(events, accumulateTwoPhaseDispatchesSingleSkipTarget);\n}\n\nfunction accumulateEnterLeaveDispatches(leave, enter, from, to) {\n traverseEnterLeave(from, to, accumulateDispatches, leave, enter);\n}\n\nfunction accumulateDirectDispatches(events) {\n forEachAccumulated(events, accumulateDirectDispatchesSingle);\n}\n\nvar EventPropagators = Object.freeze({\n\taccumulateTwoPhaseDispatches: accumulateTwoPhaseDispatches,\n\taccumulateTwoPhaseDispatchesSkipTarget: accumulateTwoPhaseDispatchesSkipTarget,\n\taccumulateEnterLeaveDispatches: accumulateEnterLeaveDispatches,\n\taccumulateDirectDispatches: accumulateDirectDispatches\n});\n\nvar contentKey = null;\n\n/**\n * Gets the key used to access text content on a DOM node.\n *\n * @return {?string} Key used to access text content.\n * @internal\n */\nfunction getTextContentAccessor() {\n if (!contentKey && ExecutionEnvironment.canUseDOM) {\n // Prefer textContent to innerText because many browsers support both but\n // SVG <text> elements don't support innerText even when <div> does.\n contentKey = 'textContent' in document.documentElement ? 'textContent' : 'innerText';\n }\n return contentKey;\n}\n\n/**\n * This helper object stores information about text content of a target node,\n * allowing comparison of content before and after a given event.\n *\n * Identify the node where selection currently begins, then observe\n * both its text content and its current position in the DOM. Since the\n * browser may natively replace the target node during composition, we can\n * use its position to find its replacement.\n *\n *\n */\nvar compositionState = {\n _root: null,\n _startText: null,\n _fallbackText: null\n};\n\nfunction initialize(nativeEventTarget) {\n compositionState._root = nativeEventTarget;\n compositionState._startText = getText();\n return true;\n}\n\nfunction reset() {\n compositionState._root = null;\n compositionState._startText = null;\n compositionState._fallbackText = null;\n}\n\nfunction getData() {\n if (compositionState._fallbackText) {\n return compositionState._fallbackText;\n }\n\n var start;\n var startValue = compositionState._startText;\n var startLength = startValue.length;\n var end;\n var endValue = getText();\n var endLength = endValue.length;\n\n for (start = 0; start < startLength; start++) {\n if (startValue[start] !== endValue[start]) {\n break;\n }\n }\n\n var minEnd = startLength - start;\n for (end = 1; end <= minEnd; end++) {\n if (startValue[startLength - end] !== endValue[endLength - end]) {\n break;\n }\n }\n\n var sliceTail = end > 1 ? 1 - end : undefined;\n compositionState._fallbackText = endValue.slice(start, sliceTail);\n return compositionState._fallbackText;\n}\n\nfunction getText() {\n if ('value' in compositionState._root) {\n return compositionState._root.value;\n }\n return compositionState._root[getTextContentAccessor()];\n}\n\n/* eslint valid-typeof: 0 */\n\nvar didWarnForAddedNewProperty = false;\nvar isProxySupported = typeof Proxy === 'function';\nvar EVENT_POOL_SIZE = 10;\n\nvar shouldBeReleasedProperties = ['dispatchConfig', '_targetInst', 'nativeEvent', 'isDefaultPrevented', 'isPropagationStopped', '_dispatchListeners', '_dispatchInstances'];\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\nvar EventInterface = {\n type: null,\n target: null,\n // currentTarget is set when dispatching; no use in copying it here\n currentTarget: emptyFunction.thatReturnsNull,\n eventPhase: null,\n bubbles: null,\n cancelable: null,\n timeStamp: function (event) {\n return event.timeStamp || Date.now();\n },\n defaultPrevented: null,\n isTrusted: null\n};\n\n/**\n * Synthetic events are dispatched by event plugins, typically in response to a\n * top-level event delegation handler.\n *\n * These systems should generally use pooling to reduce the frequency of garbage\n * collection. The system should check `isPersistent` to determine whether the\n * event should be released into the pool after being dispatched. Users that\n * need a persisted event should invoke `persist`.\n *\n * Synthetic events (and subclasses) implement the DOM Level 3 Events API by\n * normalizing browser quirks. Subclasses do not necessarily have to implement a\n * DOM interface; custom application-specific events can also subclass this.\n *\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {*} targetInst Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @param {DOMEventTarget} nativeEventTarget Target node.\n */\nfunction SyntheticEvent(dispatchConfig, targetInst, nativeEvent, nativeEventTarget) {\n {\n // these have a getter/setter for warnings\n delete this.nativeEvent;\n delete this.preventDefault;\n delete this.stopPropagation;\n }\n\n this.dispatchConfig = dispatchConfig;\n this._targetInst = targetInst;\n this.nativeEvent = nativeEvent;\n\n var Interface = this.constructor.Interface;\n for (var propName in Interface) {\n if (!Interface.hasOwnProperty(propName)) {\n continue;\n }\n {\n delete this[propName]; // this has a getter/setter for warnings\n }\n var normalize = Interface[propName];\n if (normalize) {\n this[propName] = normalize(nativeEvent);\n } else {\n if (propName === 'target') {\n this.target = nativeEventTarget;\n } else {\n this[propName] = nativeEvent[propName];\n }\n }\n }\n\n var defaultPrevented = nativeEvent.defaultPrevented != null ? nativeEvent.defaultPrevented : nativeEvent.returnValue === false;\n if (defaultPrevented) {\n this.isDefaultPrevented = emptyFunction.thatReturnsTrue;\n } else {\n this.isDefaultPrevented = emptyFunction.thatReturnsFalse;\n }\n this.isPropagationStopped = emptyFunction.thatReturnsFalse;\n return this;\n}\n\n_assign(SyntheticEvent.prototype, {\n preventDefault: function () {\n this.defaultPrevented = true;\n var event = this.nativeEvent;\n if (!event) {\n return;\n }\n\n if (event.preventDefault) {\n event.preventDefault();\n } else if (typeof event.returnValue !== 'unknown') {\n event.returnValue = false;\n }\n this.isDefaultPrevented = emptyFunction.thatReturnsTrue;\n },\n\n stopPropagation: function () {\n var event = this.nativeEvent;\n if (!event) {\n return;\n }\n\n if (event.stopPropagation) {\n event.stopPropagation();\n } else if (typeof event.cancelBubble !== 'unknown') {\n // The ChangeEventPlugin registers a \"propertychange\" event for\n // IE. This event does not support bubbling or cancelling, and\n // any references to cancelBubble throw \"Member not found\". A\n // typeof check of \"unknown\" circumvents this issue (and is also\n // IE specific).\n event.cancelBubble = true;\n }\n\n this.isPropagationStopped = emptyFunction.thatReturnsTrue;\n },\n\n /**\n * We release all dispatched `SyntheticEvent`s after each event loop, adding\n * them back into the pool. This allows a way to hold onto a reference that\n * won't be added back into the pool.\n */\n persist: function () {\n this.isPersistent = emptyFunction.thatReturnsTrue;\n },\n\n /**\n * Checks if this event should be released back into the pool.\n *\n * @return {boolean} True if this should not be released, false otherwise.\n */\n isPersistent: emptyFunction.thatReturnsFalse,\n\n /**\n * `PooledClass` looks for `destructor` on each instance it releases.\n */\n destructor: function () {\n var Interface = this.constructor.Interface;\n for (var propName in Interface) {\n {\n Object.defineProperty(this, propName, getPooledWarningPropertyDefinition(propName, Interface[propName]));\n }\n }\n for (var i = 0; i < shouldBeReleasedProperties.length; i++) {\n this[shouldBeReleasedProperties[i]] = null;\n }\n {\n Object.defineProperty(this, 'nativeEvent', getPooledWarningPropertyDefinition('nativeEvent', null));\n Object.defineProperty(this, 'preventDefault', getPooledWarningPropertyDefinition('preventDefault', emptyFunction));\n Object.defineProperty(this, 'stopPropagation', getPooledWarningPropertyDefinition('stopPropagation', emptyFunction));\n }\n }\n});\n\nSyntheticEvent.Interface = EventInterface;\n\n/**\n * Helper to reduce boilerplate when creating subclasses.\n *\n * @param {function} Class\n * @param {?object} Interface\n */\nSyntheticEvent.augmentClass = function (Class, Interface) {\n var Super = this;\n\n var E = function () {};\n E.prototype = Super.prototype;\n var prototype = new E();\n\n _assign(prototype, Class.prototype);\n Class.prototype = prototype;\n Class.prototype.constructor = Class;\n\n Class.Interface = _assign({}, Super.Interface, Interface);\n Class.augmentClass = Super.augmentClass;\n addEventPoolingTo(Class);\n};\n\n/** Proxying after everything set on SyntheticEvent\n * to resolve Proxy issue on some WebKit browsers\n * in which some Event properties are set to undefined (GH#10010)\n */\n{\n if (isProxySupported) {\n /*eslint-disable no-func-assign */\n SyntheticEvent = new Proxy(SyntheticEvent, {\n construct: function (target, args) {\n return this.apply(target, Object.create(target.prototype), args);\n },\n apply: function (constructor, that, args) {\n return new Proxy(constructor.apply(that, args), {\n set: function (target, prop, value) {\n if (prop !== 'isPersistent' && !target.constructor.Interface.hasOwnProperty(prop) && shouldBeReleasedProperties.indexOf(prop) === -1) {\n warning(didWarnForAddedNewProperty || target.isPersistent(), \"This synthetic event is reused for performance reasons. If you're \" + \"seeing this, you're adding a new property in the synthetic event object. \" + 'The property is never released. See ' + 'https://fb.me/react-event-pooling for more information.');\n didWarnForAddedNewProperty = true;\n }\n target[prop] = value;\n return true;\n }\n });\n }\n });\n /*eslint-enable no-func-assign */\n }\n}\n\naddEventPoolingTo(SyntheticEvent);\n\n/**\n * Helper to nullify syntheticEvent instance properties when destructing\n *\n * @param {String} propName\n * @param {?object} getVal\n * @return {object} defineProperty object\n */\nfunction getPooledWarningPropertyDefinition(propName, getVal) {\n var isFunction = typeof getVal === 'function';\n return {\n configurable: true,\n set: set,\n get: get\n };\n\n function set(val) {\n var action = isFunction ? 'setting the method' : 'setting the property';\n warn(action, 'This is effectively a no-op');\n return val;\n }\n\n function get() {\n var action = isFunction ? 'accessing the method' : 'accessing the property';\n var result = isFunction ? 'This is a no-op function' : 'This is set to null';\n warn(action, result);\n return getVal;\n }\n\n function warn(action, result) {\n var warningCondition = false;\n warning(warningCondition, \"This synthetic event is reused for performance reasons. If you're seeing this, \" + \"you're %s `%s` on a released/nullified synthetic event. %s. \" + 'If you must keep the original synthetic event around, use event.persist(). ' + 'See https://fb.me/react-event-pooling for more information.', action, propName, result);\n }\n}\n\nfunction getPooledEvent(dispatchConfig, targetInst, nativeEvent, nativeInst) {\n var EventConstructor = this;\n if (EventConstructor.eventPool.length) {\n var instance = EventConstructor.eventPool.pop();\n EventConstructor.call(instance, dispatchConfig, targetInst, nativeEvent, nativeInst);\n return instance;\n }\n return new EventConstructor(dispatchConfig, targetInst, nativeEvent, nativeInst);\n}\n\nfunction releasePooledEvent(event) {\n var EventConstructor = this;\n !(event instanceof EventConstructor) ? invariant(false, 'Trying to release an event instance into a pool of a different type.') : void 0;\n event.destructor();\n if (EventConstructor.eventPool.length < EVENT_POOL_SIZE) {\n EventConstructor.eventPool.push(event);\n }\n}\n\nfunction addEventPoolingTo(EventConstructor) {\n EventConstructor.eventPool = [];\n EventConstructor.getPooled = getPooledEvent;\n EventConstructor.release = releasePooledEvent;\n}\n\nvar SyntheticEvent$1 = SyntheticEvent;\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/DOM-Level-3-Events/#events-compositionevents\n */\nvar CompositionEventInterface = {\n data: null\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticEvent}\n */\nfunction SyntheticCompositionEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n return SyntheticEvent$1.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticEvent$1.augmentClass(SyntheticCompositionEvent, CompositionEventInterface);\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105\n * /#events-inputevents\n */\nvar InputEventInterface = {\n data: null\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticEvent}\n */\nfunction SyntheticInputEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n return SyntheticEvent$1.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticEvent$1.augmentClass(SyntheticInputEvent, InputEventInterface);\n\nvar END_KEYCODES = [9, 13, 27, 32]; // Tab, Return, Esc, Space\nvar START_KEYCODE = 229;\n\nvar canUseCompositionEvent = ExecutionEnvironment.canUseDOM && 'CompositionEvent' in window;\n\nvar documentMode = null;\nif (ExecutionEnvironment.canUseDOM && 'documentMode' in document) {\n documentMode = document.documentMode;\n}\n\n// Webkit offers a very useful `textInput` event that can be used to\n// directly represent `beforeInput`. The IE `textinput` event is not as\n// useful, so we don't use it.\nvar canUseTextInputEvent = ExecutionEnvironment.canUseDOM && 'TextEvent' in window && !documentMode && !isPresto();\n\n// In IE9+, we have access to composition events, but the data supplied\n// by the native compositionend event may be incorrect. Japanese ideographic\n// spaces, for instance (\\u3000) are not recorded correctly.\nvar useFallbackCompositionData = ExecutionEnvironment.canUseDOM && (!canUseCompositionEvent || documentMode && documentMode > 8 && documentMode <= 11);\n\n/**\n * Opera <= 12 includes TextEvent in window, but does not fire\n * text input events. Rely on keypress instead.\n */\nfunction isPresto() {\n var opera = window.opera;\n return typeof opera === 'object' && typeof opera.version === 'function' && parseInt(opera.version(), 10) <= 12;\n}\n\nvar SPACEBAR_CODE = 32;\nvar SPACEBAR_CHAR = String.fromCharCode(SPACEBAR_CODE);\n\n// Events and their corresponding property names.\nvar eventTypes = {\n beforeInput: {\n phasedRegistrationNames: {\n bubbled: 'onBeforeInput',\n captured: 'onBeforeInputCapture'\n },\n dependencies: ['topCompositionEnd', 'topKeyPress', 'topTextInput', 'topPaste']\n },\n compositionEnd: {\n phasedRegistrationNames: {\n bubbled: 'onCompositionEnd',\n captured: 'onCompositionEndCapture'\n },\n dependencies: ['topBlur', 'topCompositionEnd', 'topKeyDown', 'topKeyPress', 'topKeyUp', 'topMouseDown']\n },\n compositionStart: {\n phasedRegistrationNames: {\n bubbled: 'onCompositionStart',\n captured: 'onCompositionStartCapture'\n },\n dependencies: ['topBlur', 'topCompositionStart', 'topKeyDown', 'topKeyPress', 'topKeyUp', 'topMouseDown']\n },\n compositionUpdate: {\n phasedRegistrationNames: {\n bubbled: 'onCompositionUpdate',\n captured: 'onCompositionUpdateCapture'\n },\n dependencies: ['topBlur', 'topCompositionUpdate', 'topKeyDown', 'topKeyPress', 'topKeyUp', 'topMouseDown']\n }\n};\n\n// Track whether we've ever handled a keypress on the space key.\nvar hasSpaceKeypress = false;\n\n/**\n * Return whether a native keypress event is assumed to be a command.\n * This is required because Firefox fires `keypress` events for key commands\n * (cut, copy, select-all, etc.) even though no character is inserted.\n */\nfunction isKeypressCommand(nativeEvent) {\n return (nativeEvent.ctrlKey || nativeEvent.altKey || nativeEvent.metaKey) &&\n // ctrlKey && altKey is equivalent to AltGr, and is not a command.\n !(nativeEvent.ctrlKey && nativeEvent.altKey);\n}\n\n/**\n * Translate native top level events into event types.\n *\n * @param {string} topLevelType\n * @return {object}\n */\nfunction getCompositionEventType(topLevelType) {\n switch (topLevelType) {\n case 'topCompositionStart':\n return eventTypes.compositionStart;\n case 'topCompositionEnd':\n return eventTypes.compositionEnd;\n case 'topCompositionUpdate':\n return eventTypes.compositionUpdate;\n }\n}\n\n/**\n * Does our fallback best-guess model think this event signifies that\n * composition has begun?\n *\n * @param {string} topLevelType\n * @param {object} nativeEvent\n * @return {boolean}\n */\nfunction isFallbackCompositionStart(topLevelType, nativeEvent) {\n return topLevelType === 'topKeyDown' && nativeEvent.keyCode === START_KEYCODE;\n}\n\n/**\n * Does our fallback mode think that this event is the end of composition?\n *\n * @param {string} topLevelType\n * @param {object} nativeEvent\n * @return {boolean}\n */\nfunction isFallbackCompositionEnd(topLevelType, nativeEvent) {\n switch (topLevelType) {\n case 'topKeyUp':\n // Command keys insert or clear IME input.\n return END_KEYCODES.indexOf(nativeEvent.keyCode) !== -1;\n case 'topKeyDown':\n // Expect IME keyCode on each keydown. If we get any other\n // code we must have exited earlier.\n return nativeEvent.keyCode !== START_KEYCODE;\n case 'topKeyPress':\n case 'topMouseDown':\n case 'topBlur':\n // Events are not possible without cancelling IME.\n return true;\n default:\n return false;\n }\n}\n\n/**\n * Google Input Tools provides composition data via a CustomEvent,\n * with the `data` property populated in the `detail` object. If this\n * is available on the event object, use it. If not, this is a plain\n * composition event and we have nothing special to extract.\n *\n * @param {object} nativeEvent\n * @return {?string}\n */\nfunction getDataFromCustomEvent(nativeEvent) {\n var detail = nativeEvent.detail;\n if (typeof detail === 'object' && 'data' in detail) {\n return detail.data;\n }\n return null;\n}\n\n// Track the current IME composition status, if any.\nvar isComposing = false;\n\n/**\n * @return {?object} A SyntheticCompositionEvent.\n */\nfunction extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) {\n var eventType;\n var fallbackData;\n\n if (canUseCompositionEvent) {\n eventType = getCompositionEventType(topLevelType);\n } else if (!isComposing) {\n if (isFallbackCompositionStart(topLevelType, nativeEvent)) {\n eventType = eventTypes.compositionStart;\n }\n } else if (isFallbackCompositionEnd(topLevelType, nativeEvent)) {\n eventType = eventTypes.compositionEnd;\n }\n\n if (!eventType) {\n return null;\n }\n\n if (useFallbackCompositionData) {\n // The current composition is stored statically and must not be\n // overwritten while composition continues.\n if (!isComposing && eventType === eventTypes.compositionStart) {\n isComposing = initialize(nativeEventTarget);\n } else if (eventType === eventTypes.compositionEnd) {\n if (isComposing) {\n fallbackData = getData();\n }\n }\n }\n\n var event = SyntheticCompositionEvent.getPooled(eventType, targetInst, nativeEvent, nativeEventTarget);\n\n if (fallbackData) {\n // Inject data generated from fallback path into the synthetic event.\n // This matches the property of native CompositionEventInterface.\n event.data = fallbackData;\n } else {\n var customData = getDataFromCustomEvent(nativeEvent);\n if (customData !== null) {\n event.data = customData;\n }\n }\n\n accumulateTwoPhaseDispatches(event);\n return event;\n}\n\n/**\n * @param {TopLevelTypes} topLevelType Record from `BrowserEventConstants`.\n * @param {object} nativeEvent Native browser event.\n * @return {?string} The string corresponding to this `beforeInput` event.\n */\nfunction getNativeBeforeInputChars(topLevelType, nativeEvent) {\n switch (topLevelType) {\n case 'topCompositionEnd':\n return getDataFromCustomEvent(nativeEvent);\n case 'topKeyPress':\n /**\n * If native `textInput` events are available, our goal is to make\n * use of them. However, there is a special case: the spacebar key.\n * In Webkit, preventing default on a spacebar `textInput` event\n * cancels character insertion, but it *also* causes the browser\n * to fall back to its default spacebar behavior of scrolling the\n * page.\n *\n * Tracking at:\n * https://code.google.com/p/chromium/issues/detail?id=355103\n *\n * To avoid this issue, use the keypress event as if no `textInput`\n * event is available.\n */\n var which = nativeEvent.which;\n if (which !== SPACEBAR_CODE) {\n return null;\n }\n\n hasSpaceKeypress = true;\n return SPACEBAR_CHAR;\n\n case 'topTextInput':\n // Record the characters to be added to the DOM.\n var chars = nativeEvent.data;\n\n // If it's a spacebar character, assume that we have already handled\n // it at the keypress level and bail immediately. Android Chrome\n // doesn't give us keycodes, so we need to blacklist it.\n if (chars === SPACEBAR_CHAR && hasSpaceKeypress) {\n return null;\n }\n\n return chars;\n\n default:\n // For other native event types, do nothing.\n return null;\n }\n}\n\n/**\n * For browsers that do not provide the `textInput` event, extract the\n * appropriate string to use for SyntheticInputEvent.\n *\n * @param {string} topLevelType Record from `BrowserEventConstants`.\n * @param {object} nativeEvent Native browser event.\n * @return {?string} The fallback string for this `beforeInput` event.\n */\nfunction getFallbackBeforeInputChars(topLevelType, nativeEvent) {\n // If we are currently composing (IME) and using a fallback to do so,\n // try to extract the composed characters from the fallback object.\n // If composition event is available, we extract a string only at\n // compositionevent, otherwise extract it at fallback events.\n if (isComposing) {\n if (topLevelType === 'topCompositionEnd' || !canUseCompositionEvent && isFallbackCompositionEnd(topLevelType, nativeEvent)) {\n var chars = getData();\n reset();\n isComposing = false;\n return chars;\n }\n return null;\n }\n\n switch (topLevelType) {\n case 'topPaste':\n // If a paste event occurs after a keypress, throw out the input\n // chars. Paste events should not lead to BeforeInput events.\n return null;\n case 'topKeyPress':\n /**\n * As of v27, Firefox may fire keypress events even when no character\n * will be inserted. A few possibilities:\n *\n * - `which` is `0`. Arrow keys, Esc key, etc.\n *\n * - `which` is the pressed key code, but no char is available.\n * Ex: 'AltGr + d` in Polish. There is no modified character for\n * this key combination and no character is inserted into the\n * document, but FF fires the keypress for char code `100` anyway.\n * No `input` event will occur.\n *\n * - `which` is the pressed key code, but a command combination is\n * being used. Ex: `Cmd+C`. No character is inserted, and no\n * `input` event will occur.\n */\n if (!isKeypressCommand(nativeEvent)) {\n // IE fires the `keypress` event when a user types an emoji via\n // Touch keyboard of Windows. In such a case, the `char` property\n // holds an emoji character like `\\uD83D\\uDE0A`. Because its length\n // is 2, the property `which` does not represent an emoji correctly.\n // In such a case, we directly return the `char` property instead of\n // using `which`.\n if (nativeEvent.char && nativeEvent.char.length > 1) {\n return nativeEvent.char;\n } else if (nativeEvent.which) {\n return String.fromCharCode(nativeEvent.which);\n }\n }\n return null;\n case 'topCompositionEnd':\n return useFallbackCompositionData ? null : nativeEvent.data;\n default:\n return null;\n }\n}\n\n/**\n * Extract a SyntheticInputEvent for `beforeInput`, based on either native\n * `textInput` or fallback behavior.\n *\n * @return {?object} A SyntheticInputEvent.\n */\nfunction extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget) {\n var chars;\n\n if (canUseTextInputEvent) {\n chars = getNativeBeforeInputChars(topLevelType, nativeEvent);\n } else {\n chars = getFallbackBeforeInputChars(topLevelType, nativeEvent);\n }\n\n // If no characters are being inserted, no BeforeInput event should\n // be fired.\n if (!chars) {\n return null;\n }\n\n var event = SyntheticInputEvent.getPooled(eventTypes.beforeInput, targetInst, nativeEvent, nativeEventTarget);\n\n event.data = chars;\n accumulateTwoPhaseDispatches(event);\n return event;\n}\n\n/**\n * Create an `onBeforeInput` event to match\n * http://www.w3.org/TR/2013/WD-DOM-Level-3-Events-20131105/#events-inputevents.\n *\n * This event plugin is based on the native `textInput` event\n * available in Chrome, Safari, Opera, and IE. This event fires after\n * `onKeyPress` and `onCompositionEnd`, but before `onInput`.\n *\n * `beforeInput` is spec'd but not implemented in any browsers, and\n * the `input` event does not provide any useful information about what has\n * actually been added, contrary to the spec. Thus, `textInput` is the best\n * available event to identify the characters that have actually been inserted\n * into the target node.\n *\n * This plugin is also responsible for emitting `composition` events, thus\n * allowing us to share composition fallback code for both `beforeInput` and\n * `composition` event types.\n */\nvar BeforeInputEventPlugin = {\n eventTypes: eventTypes,\n\n extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) {\n return [extractCompositionEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget), extractBeforeInputEvent(topLevelType, targetInst, nativeEvent, nativeEventTarget)];\n }\n};\n\n// Use to restore controlled state after a change event has fired.\n\nvar fiberHostComponent = null;\n\nvar ReactControlledComponentInjection = {\n injectFiberControlledHostComponent: function (hostComponentImpl) {\n // The fiber implementation doesn't use dynamic dispatch so we need to\n // inject the implementation.\n fiberHostComponent = hostComponentImpl;\n }\n};\n\nvar restoreTarget = null;\nvar restoreQueue = null;\n\nfunction restoreStateOfTarget(target) {\n // We perform this translation at the end of the event loop so that we\n // always receive the correct fiber here\n var internalInstance = getInstanceFromNode(target);\n if (!internalInstance) {\n // Unmounted\n return;\n }\n !(fiberHostComponent && typeof fiberHostComponent.restoreControlledState === 'function') ? invariant(false, 'Fiber needs to be injected to handle a fiber target for controlled events. This error is likely caused by a bug in React. Please file an issue.') : void 0;\n var props = getFiberCurrentPropsFromNode(internalInstance.stateNode);\n fiberHostComponent.restoreControlledState(internalInstance.stateNode, internalInstance.type, props);\n}\n\nvar injection$3 = ReactControlledComponentInjection;\n\nfunction enqueueStateRestore(target) {\n if (restoreTarget) {\n if (restoreQueue) {\n restoreQueue.push(target);\n } else {\n restoreQueue = [target];\n }\n } else {\n restoreTarget = target;\n }\n}\n\nfunction restoreStateIfNeeded() {\n if (!restoreTarget) {\n return;\n }\n var target = restoreTarget;\n var queuedTargets = restoreQueue;\n restoreTarget = null;\n restoreQueue = null;\n\n restoreStateOfTarget(target);\n if (queuedTargets) {\n for (var i = 0; i < queuedTargets.length; i++) {\n restoreStateOfTarget(queuedTargets[i]);\n }\n }\n}\n\nvar ReactControlledComponent = Object.freeze({\n\tinjection: injection$3,\n\tenqueueStateRestore: enqueueStateRestore,\n\trestoreStateIfNeeded: restoreStateIfNeeded\n});\n\n// Used as a way to call batchedUpdates when we don't have a reference to\n// the renderer. Such as when we're dispatching events or if third party\n// libraries need to call batchedUpdates. Eventually, this API will go away when\n// everything is batched by default. We'll then have a similar API to opt-out of\n// scheduled work and instead do synchronous work.\n\n// Defaults\nvar fiberBatchedUpdates = function (fn, bookkeeping) {\n return fn(bookkeeping);\n};\n\nvar isNestingBatched = false;\nfunction batchedUpdates(fn, bookkeeping) {\n if (isNestingBatched) {\n // If we are currently inside another batch, we need to wait until it\n // fully completes before restoring state. Therefore, we add the target to\n // a queue of work.\n return fiberBatchedUpdates(fn, bookkeeping);\n }\n isNestingBatched = true;\n try {\n return fiberBatchedUpdates(fn, bookkeeping);\n } finally {\n // Here we wait until all updates have propagated, which is important\n // when using controlled components within layers:\n // https://github.com/facebook/react/issues/1698\n // Then we restore state of any controlled component.\n isNestingBatched = false;\n restoreStateIfNeeded();\n }\n}\n\nvar ReactGenericBatchingInjection = {\n injectFiberBatchedUpdates: function (_batchedUpdates) {\n fiberBatchedUpdates = _batchedUpdates;\n }\n};\n\nvar injection$4 = ReactGenericBatchingInjection;\n\n/**\n * @see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#input-type-attr-summary\n */\nvar supportedInputTypes = {\n color: true,\n date: true,\n datetime: true,\n 'datetime-local': true,\n email: true,\n month: true,\n number: true,\n password: true,\n range: true,\n search: true,\n tel: true,\n text: true,\n time: true,\n url: true,\n week: true\n};\n\nfunction isTextInputElement(elem) {\n var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();\n\n if (nodeName === 'input') {\n return !!supportedInputTypes[elem.type];\n }\n\n if (nodeName === 'textarea') {\n return true;\n }\n\n return false;\n}\n\n/**\n * HTML nodeType values that represent the type of the node\n */\n\nvar ELEMENT_NODE = 1;\nvar TEXT_NODE = 3;\nvar COMMENT_NODE = 8;\nvar DOCUMENT_NODE = 9;\nvar DOCUMENT_FRAGMENT_NODE = 11;\n\n/**\n * Gets the target node from a native browser event by accounting for\n * inconsistencies in browser DOM APIs.\n *\n * @param {object} nativeEvent Native browser event.\n * @return {DOMEventTarget} Target node.\n */\nfunction getEventTarget(nativeEvent) {\n var target = nativeEvent.target || nativeEvent.srcElement || window;\n\n // Normalize SVG <use> element events #4963\n if (target.correspondingUseElement) {\n target = target.correspondingUseElement;\n }\n\n // Safari may fire events on text nodes (Node.TEXT_NODE is 3).\n // @see http://www.quirksmode.org/js/events_properties.html\n return target.nodeType === TEXT_NODE ? target.parentNode : target;\n}\n\nvar useHasFeature;\nif (ExecutionEnvironment.canUseDOM) {\n useHasFeature = document.implementation && document.implementation.hasFeature &&\n // always returns true in newer browsers as per the standard.\n // @see http://dom.spec.whatwg.org/#dom-domimplementation-hasfeature\n document.implementation.hasFeature('', '') !== true;\n}\n\n/**\n * Checks if an event is supported in the current execution environment.\n *\n * NOTE: This will not work correctly for non-generic events such as `change`,\n * `reset`, `load`, `error`, and `select`.\n *\n * Borrows from Modernizr.\n *\n * @param {string} eventNameSuffix Event name, e.g. \"click\".\n * @param {?boolean} capture Check if the capture phase is supported.\n * @return {boolean} True if the event is supported.\n * @internal\n * @license Modernizr 3.0.0pre (Custom Build) | MIT\n */\nfunction isEventSupported(eventNameSuffix, capture) {\n if (!ExecutionEnvironment.canUseDOM || capture && !('addEventListener' in document)) {\n return false;\n }\n\n var eventName = 'on' + eventNameSuffix;\n var isSupported = eventName in document;\n\n if (!isSupported) {\n var element = document.createElement('div');\n element.setAttribute(eventName, 'return;');\n isSupported = typeof element[eventName] === 'function';\n }\n\n if (!isSupported && useHasFeature && eventNameSuffix === 'wheel') {\n // This is the only way to test support for the `wheel` event in IE9+.\n isSupported = document.implementation.hasFeature('Events.wheel', '3.0');\n }\n\n return isSupported;\n}\n\nfunction isCheckable(elem) {\n var type = elem.type;\n var nodeName = elem.nodeName;\n return nodeName && nodeName.toLowerCase() === 'input' && (type === 'checkbox' || type === 'radio');\n}\n\nfunction getTracker(node) {\n return node._valueTracker;\n}\n\nfunction detachTracker(node) {\n node._valueTracker = null;\n}\n\nfunction getValueFromNode(node) {\n var value = '';\n if (!node) {\n return value;\n }\n\n if (isCheckable(node)) {\n value = node.checked ? 'true' : 'false';\n } else {\n value = node.value;\n }\n\n return value;\n}\n\nfunction trackValueOnNode(node) {\n var valueField = isCheckable(node) ? 'checked' : 'value';\n var descriptor = Object.getOwnPropertyDescriptor(node.constructor.prototype, valueField);\n\n var currentValue = '' + node[valueField];\n\n // if someone has already defined a value or Safari, then bail\n // and don't track value will cause over reporting of changes,\n // but it's better then a hard failure\n // (needed for certain tests that spyOn input values and Safari)\n if (node.hasOwnProperty(valueField) || typeof descriptor.get !== 'function' || typeof descriptor.set !== 'function') {\n return;\n }\n\n Object.defineProperty(node, valueField, {\n enumerable: descriptor.enumerable,\n configurable: true,\n get: function () {\n return descriptor.get.call(this);\n },\n set: function (value) {\n currentValue = '' + value;\n descriptor.set.call(this, value);\n }\n });\n\n var tracker = {\n getValue: function () {\n return currentValue;\n },\n setValue: function (value) {\n currentValue = '' + value;\n },\n stopTracking: function () {\n detachTracker(node);\n delete node[valueField];\n }\n };\n return tracker;\n}\n\nfunction track(node) {\n if (getTracker(node)) {\n return;\n }\n\n // TODO: Once it's just Fiber we can move this to node._wrapperState\n node._valueTracker = trackValueOnNode(node);\n}\n\nfunction updateValueIfChanged(node) {\n if (!node) {\n return false;\n }\n\n var tracker = getTracker(node);\n // if there is no tracker at this point it's unlikely\n // that trying again will succeed\n if (!tracker) {\n return true;\n }\n\n var lastValue = tracker.getValue();\n var nextValue = getValueFromNode(node);\n if (nextValue !== lastValue) {\n tracker.setValue(nextValue);\n return true;\n }\n return false;\n}\n\nvar eventTypes$1 = {\n change: {\n phasedRegistrationNames: {\n bubbled: 'onChange',\n captured: 'onChangeCapture'\n },\n dependencies: ['topBlur', 'topChange', 'topClick', 'topFocus', 'topInput', 'topKeyDown', 'topKeyUp', 'topSelectionChange']\n }\n};\n\nfunction createAndAccumulateChangeEvent(inst, nativeEvent, target) {\n var event = SyntheticEvent$1.getPooled(eventTypes$1.change, inst, nativeEvent, target);\n event.type = 'change';\n // Flag this event loop as needing state restore.\n enqueueStateRestore(target);\n accumulateTwoPhaseDispatches(event);\n return event;\n}\n/**\n * For IE shims\n */\nvar activeElement = null;\nvar activeElementInst = null;\n\n/**\n * SECTION: handle `change` event\n */\nfunction shouldUseChangeEvent(elem) {\n var nodeName = elem.nodeName && elem.nodeName.toLowerCase();\n return nodeName === 'select' || nodeName === 'input' && elem.type === 'file';\n}\n\nfunction manualDispatchChangeEvent(nativeEvent) {\n var event = createAndAccumulateChangeEvent(activeElementInst, nativeEvent, getEventTarget(nativeEvent));\n\n // If change and propertychange bubbled, we'd just bind to it like all the\n // other events and have it go through ReactBrowserEventEmitter. Since it\n // doesn't, we manually listen for the events and so we have to enqueue and\n // process the abstract event manually.\n //\n // Batching is necessary here in order to ensure that all event handlers run\n // before the next rerender (including event handlers attached to ancestor\n // elements instead of directly on the input). Without this, controlled\n // components don't work properly in conjunction with event bubbling because\n // the component is rerendered and the value reverted before all the event\n // handlers can run. See https://github.com/facebook/react/issues/708.\n batchedUpdates(runEventInBatch, event);\n}\n\nfunction runEventInBatch(event) {\n enqueueEvents(event);\n processEventQueue(false);\n}\n\nfunction getInstIfValueChanged(targetInst) {\n var targetNode = getNodeFromInstance$1(targetInst);\n if (updateValueIfChanged(targetNode)) {\n return targetInst;\n }\n}\n\nfunction getTargetInstForChangeEvent(topLevelType, targetInst) {\n if (topLevelType === 'topChange') {\n return targetInst;\n }\n}\n\n/**\n * SECTION: handle `input` event\n */\nvar isInputEventSupported = false;\nif (ExecutionEnvironment.canUseDOM) {\n // IE9 claims to support the input event but fails to trigger it when\n // deleting text, so we ignore its input events.\n isInputEventSupported = isEventSupported('input') && (!document.documentMode || document.documentMode > 9);\n}\n\n/**\n * (For IE <=9) Starts tracking propertychange events on the passed-in element\n * and override the value property so that we can distinguish user events from\n * value changes in JS.\n */\nfunction startWatchingForValueChange(target, targetInst) {\n activeElement = target;\n activeElementInst = targetInst;\n activeElement.attachEvent('onpropertychange', handlePropertyChange);\n}\n\n/**\n * (For IE <=9) Removes the event listeners from the currently-tracked element,\n * if any exists.\n */\nfunction stopWatchingForValueChange() {\n if (!activeElement) {\n return;\n }\n activeElement.detachEvent('onpropertychange', handlePropertyChange);\n activeElement = null;\n activeElementInst = null;\n}\n\n/**\n * (For IE <=9) Handles a propertychange event, sending a `change` event if\n * the value of the active element has changed.\n */\nfunction handlePropertyChange(nativeEvent) {\n if (nativeEvent.propertyName !== 'value') {\n return;\n }\n if (getInstIfValueChanged(activeElementInst)) {\n manualDispatchChangeEvent(nativeEvent);\n }\n}\n\nfunction handleEventsForInputEventPolyfill(topLevelType, target, targetInst) {\n if (topLevelType === 'topFocus') {\n // In IE9, propertychange fires for most input events but is buggy and\n // doesn't fire when text is deleted, but conveniently, selectionchange\n // appears to fire in all of the remaining cases so we catch those and\n // forward the event if the value has changed\n // In either case, we don't want to call the event handler if the value\n // is changed from JS so we redefine a setter for `.value` that updates\n // our activeElementValue variable, allowing us to ignore those changes\n //\n // stopWatching() should be a noop here but we call it just in case we\n // missed a blur event somehow.\n stopWatchingForValueChange();\n startWatchingForValueChange(target, targetInst);\n } else if (topLevelType === 'topBlur') {\n stopWatchingForValueChange();\n }\n}\n\n// For IE8 and IE9.\nfunction getTargetInstForInputEventPolyfill(topLevelType, targetInst) {\n if (topLevelType === 'topSelectionChange' || topLevelType === 'topKeyUp' || topLevelType === 'topKeyDown') {\n // On the selectionchange event, the target is just document which isn't\n // helpful for us so just check activeElement instead.\n //\n // 99% of the time, keydown and keyup aren't necessary. IE8 fails to fire\n // propertychange on the first input event after setting `value` from a\n // script and fires only keydown, keypress, keyup. Catching keyup usually\n // gets it and catching keydown lets us fire an event for the first\n // keystroke if user does a key repeat (it'll be a little delayed: right\n // before the second keystroke). Other input methods (e.g., paste) seem to\n // fire selectionchange normally.\n return getInstIfValueChanged(activeElementInst);\n }\n}\n\n/**\n * SECTION: handle `click` event\n */\nfunction shouldUseClickEvent(elem) {\n // Use the `click` event to detect changes to checkbox and radio inputs.\n // This approach works across all browsers, whereas `change` does not fire\n // until `blur` in IE8.\n var nodeName = elem.nodeName;\n return nodeName && nodeName.toLowerCase() === 'input' && (elem.type === 'checkbox' || elem.type === 'radio');\n}\n\nfunction getTargetInstForClickEvent(topLevelType, targetInst) {\n if (topLevelType === 'topClick') {\n return getInstIfValueChanged(targetInst);\n }\n}\n\nfunction getTargetInstForInputOrChangeEvent(topLevelType, targetInst) {\n if (topLevelType === 'topInput' || topLevelType === 'topChange') {\n return getInstIfValueChanged(targetInst);\n }\n}\n\nfunction handleControlledInputBlur(inst, node) {\n // TODO: In IE, inst is occasionally null. Why?\n if (inst == null) {\n return;\n }\n\n // Fiber and ReactDOM keep wrapper state in separate places\n var state = inst._wrapperState || node._wrapperState;\n\n if (!state || !state.controlled || node.type !== 'number') {\n return;\n }\n\n // If controlled, assign the value attribute to the current value on blur\n var value = '' + node.value;\n if (node.getAttribute('value') !== value) {\n node.setAttribute('value', value);\n }\n}\n\n/**\n * This plugin creates an `onChange` event that normalizes change events\n * across form elements. This event fires at a time when it's possible to\n * change the element's value without seeing a flicker.\n *\n * Supported elements are:\n * - input (see `isTextInputElement`)\n * - textarea\n * - select\n */\nvar ChangeEventPlugin = {\n eventTypes: eventTypes$1,\n\n _isInputEventSupported: isInputEventSupported,\n\n extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) {\n var targetNode = targetInst ? getNodeFromInstance$1(targetInst) : window;\n\n var getTargetInstFunc, handleEventFunc;\n if (shouldUseChangeEvent(targetNode)) {\n getTargetInstFunc = getTargetInstForChangeEvent;\n } else if (isTextInputElement(targetNode)) {\n if (isInputEventSupported) {\n getTargetInstFunc = getTargetInstForInputOrChangeEvent;\n } else {\n getTargetInstFunc = getTargetInstForInputEventPolyfill;\n handleEventFunc = handleEventsForInputEventPolyfill;\n }\n } else if (shouldUseClickEvent(targetNode)) {\n getTargetInstFunc = getTargetInstForClickEvent;\n }\n\n if (getTargetInstFunc) {\n var inst = getTargetInstFunc(topLevelType, targetInst);\n if (inst) {\n var event = createAndAccumulateChangeEvent(inst, nativeEvent, nativeEventTarget);\n return event;\n }\n }\n\n if (handleEventFunc) {\n handleEventFunc(topLevelType, targetNode, targetInst);\n }\n\n // When blurring, set the value attribute for number inputs\n if (topLevelType === 'topBlur') {\n handleControlledInputBlur(targetInst, targetNode);\n }\n }\n};\n\n/**\n * Module that is injectable into `EventPluginHub`, that specifies a\n * deterministic ordering of `EventPlugin`s. A convenient way to reason about\n * plugins, without having to package every one of them. This is better than\n * having plugins be ordered in the same order that they are injected because\n * that ordering would be influenced by the packaging order.\n * `ResponderEventPlugin` must occur before `SimpleEventPlugin` so that\n * preventing default on events is convenient in `SimpleEventPlugin` handlers.\n */\nvar DOMEventPluginOrder = ['ResponderEventPlugin', 'SimpleEventPlugin', 'TapEventPlugin', 'EnterLeaveEventPlugin', 'ChangeEventPlugin', 'SelectEventPlugin', 'BeforeInputEventPlugin'];\n\n/**\n * @interface UIEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\nvar UIEventInterface = {\n view: null,\n detail: null\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticEvent}\n */\nfunction SyntheticUIEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n return SyntheticEvent$1.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticEvent$1.augmentClass(SyntheticUIEvent, UIEventInterface);\n\n/**\n * Translation from modifier key to the associated property in the event.\n * @see http://www.w3.org/TR/DOM-Level-3-Events/#keys-Modifiers\n */\n\nvar modifierKeyToProp = {\n Alt: 'altKey',\n Control: 'ctrlKey',\n Meta: 'metaKey',\n Shift: 'shiftKey'\n};\n\n// IE8 does not implement getModifierState so we simply map it to the only\n// modifier keys exposed by the event itself, does not support Lock-keys.\n// Currently, all major browsers except Chrome seems to support Lock-keys.\nfunction modifierStateGetter(keyArg) {\n var syntheticEvent = this;\n var nativeEvent = syntheticEvent.nativeEvent;\n if (nativeEvent.getModifierState) {\n return nativeEvent.getModifierState(keyArg);\n }\n var keyProp = modifierKeyToProp[keyArg];\n return keyProp ? !!nativeEvent[keyProp] : false;\n}\n\nfunction getEventModifierState(nativeEvent) {\n return modifierStateGetter;\n}\n\n/**\n * @interface MouseEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\nvar MouseEventInterface = {\n screenX: null,\n screenY: null,\n clientX: null,\n clientY: null,\n pageX: null,\n pageY: null,\n ctrlKey: null,\n shiftKey: null,\n altKey: null,\n metaKey: null,\n getModifierState: getEventModifierState,\n button: null,\n buttons: null,\n relatedTarget: function (event) {\n return event.relatedTarget || (event.fromElement === event.srcElement ? event.toElement : event.fromElement);\n }\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticUIEvent}\n */\nfunction SyntheticMouseEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n return SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticUIEvent.augmentClass(SyntheticMouseEvent, MouseEventInterface);\n\nvar eventTypes$2 = {\n mouseEnter: {\n registrationName: 'onMouseEnter',\n dependencies: ['topMouseOut', 'topMouseOver']\n },\n mouseLeave: {\n registrationName: 'onMouseLeave',\n dependencies: ['topMouseOut', 'topMouseOver']\n }\n};\n\nvar EnterLeaveEventPlugin = {\n eventTypes: eventTypes$2,\n\n /**\n * For almost every interaction we care about, there will be both a top-level\n * `mouseover` and `mouseout` event that occurs. Only use `mouseout` so that\n * we do not extract duplicate events. However, moving the mouse into the\n * browser from outside will not fire a `mouseout` event. In this case, we use\n * the `mouseover` top-level event.\n */\n extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) {\n if (topLevelType === 'topMouseOver' && (nativeEvent.relatedTarget || nativeEvent.fromElement)) {\n return null;\n }\n if (topLevelType !== 'topMouseOut' && topLevelType !== 'topMouseOver') {\n // Must not be a mouse in or mouse out - ignoring.\n return null;\n }\n\n var win;\n if (nativeEventTarget.window === nativeEventTarget) {\n // `nativeEventTarget` is probably a window object.\n win = nativeEventTarget;\n } else {\n // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8.\n var doc = nativeEventTarget.ownerDocument;\n if (doc) {\n win = doc.defaultView || doc.parentWindow;\n } else {\n win = window;\n }\n }\n\n var from;\n var to;\n if (topLevelType === 'topMouseOut') {\n from = targetInst;\n var related = nativeEvent.relatedTarget || nativeEvent.toElement;\n to = related ? getClosestInstanceFromNode(related) : null;\n } else {\n // Moving to a node from outside the window.\n from = null;\n to = targetInst;\n }\n\n if (from === to) {\n // Nothing pertains to our managed components.\n return null;\n }\n\n var fromNode = from == null ? win : getNodeFromInstance$1(from);\n var toNode = to == null ? win : getNodeFromInstance$1(to);\n\n var leave = SyntheticMouseEvent.getPooled(eventTypes$2.mouseLeave, from, nativeEvent, nativeEventTarget);\n leave.type = 'mouseleave';\n leave.target = fromNode;\n leave.relatedTarget = toNode;\n\n var enter = SyntheticMouseEvent.getPooled(eventTypes$2.mouseEnter, to, nativeEvent, nativeEventTarget);\n enter.type = 'mouseenter';\n enter.target = toNode;\n enter.relatedTarget = fromNode;\n\n accumulateEnterLeaveDispatches(leave, enter, from, to);\n\n return [leave, enter];\n }\n};\n\n/**\n * `ReactInstanceMap` maintains a mapping from a public facing stateful\n * instance (key) and the internal representation (value). This allows public\n * methods to accept the user facing instance as an argument and map them back\n * to internal methods.\n *\n * Note that this module is currently shared and assumed to be stateless.\n * If this becomes an actual Map, that will break.\n */\n\n/**\n * This API should be called `delete` but we'd have to make sure to always\n * transform these to strings for IE support. When this transform is fully\n * supported we can rename it.\n */\n\n\nfunction get(key) {\n return key._reactInternalFiber;\n}\n\nfunction has(key) {\n return key._reactInternalFiber !== undefined;\n}\n\nfunction set(key, value) {\n key._reactInternalFiber = value;\n}\n\nvar ReactInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n\nvar ReactCurrentOwner = ReactInternals.ReactCurrentOwner;\nvar ReactDebugCurrentFrame = ReactInternals.ReactDebugCurrentFrame;\n\nfunction getComponentName(fiber) {\n var type = fiber.type;\n\n if (typeof type === 'string') {\n return type;\n }\n if (typeof type === 'function') {\n return type.displayName || type.name;\n }\n return null;\n}\n\n// Don't change these two values:\nvar NoEffect = 0; // 0b00000000\nvar PerformedWork = 1; // 0b00000001\n\n// You can change the rest (and add more).\nvar Placement = 2; // 0b00000010\nvar Update = 4; // 0b00000100\nvar PlacementAndUpdate = 6; // 0b00000110\nvar Deletion = 8; // 0b00001000\nvar ContentReset = 16; // 0b00010000\nvar Callback = 32; // 0b00100000\nvar Err = 64; // 0b01000000\nvar Ref = 128; // 0b10000000\n\nvar MOUNTING = 1;\nvar MOUNTED = 2;\nvar UNMOUNTED = 3;\n\nfunction isFiberMountedImpl(fiber) {\n var node = fiber;\n if (!fiber.alternate) {\n // If there is no alternate, this might be a new tree that isn't inserted\n // yet. If it is, then it will have a pending insertion effect on it.\n if ((node.effectTag & Placement) !== NoEffect) {\n return MOUNTING;\n }\n while (node['return']) {\n node = node['return'];\n if ((node.effectTag & Placement) !== NoEffect) {\n return MOUNTING;\n }\n }\n } else {\n while (node['return']) {\n node = node['return'];\n }\n }\n if (node.tag === HostRoot) {\n // TODO: Check if this was a nested HostRoot when used with\n // renderContainerIntoSubtree.\n return MOUNTED;\n }\n // If we didn't hit the root, that means that we're in an disconnected tree\n // that has been unmounted.\n return UNMOUNTED;\n}\n\nfunction isFiberMounted(fiber) {\n return isFiberMountedImpl(fiber) === MOUNTED;\n}\n\nfunction isMounted(component) {\n {\n var owner = ReactCurrentOwner.current;\n if (owner !== null && owner.tag === ClassComponent) {\n var ownerFiber = owner;\n var instance = ownerFiber.stateNode;\n warning(instance._warnedAboutRefsInRender, '%s is accessing isMounted inside its render() function. ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', getComponentName(ownerFiber) || 'A component');\n instance._warnedAboutRefsInRender = true;\n }\n }\n\n var fiber = get(component);\n if (!fiber) {\n return false;\n }\n return isFiberMountedImpl(fiber) === MOUNTED;\n}\n\nfunction assertIsMounted(fiber) {\n !(isFiberMountedImpl(fiber) === MOUNTED) ? invariant(false, 'Unable to find node on an unmounted component.') : void 0;\n}\n\nfunction findCurrentFiberUsingSlowPath(fiber) {\n var alternate = fiber.alternate;\n if (!alternate) {\n // If there is no alternate, then we only need to check if it is mounted.\n var state = isFiberMountedImpl(fiber);\n !(state !== UNMOUNTED) ? invariant(false, 'Unable to find node on an unmounted component.') : void 0;\n if (state === MOUNTING) {\n return null;\n }\n return fiber;\n }\n // If we have two possible branches, we'll walk backwards up to the root\n // to see what path the root points to. On the way we may hit one of the\n // special cases and we'll deal with them.\n var a = fiber;\n var b = alternate;\n while (true) {\n var parentA = a['return'];\n var parentB = parentA ? parentA.alternate : null;\n if (!parentA || !parentB) {\n // We're at the root.\n break;\n }\n\n // If both copies of the parent fiber point to the same child, we can\n // assume that the child is current. This happens when we bailout on low\n // priority: the bailed out fiber's child reuses the current child.\n if (parentA.child === parentB.child) {\n var child = parentA.child;\n while (child) {\n if (child === a) {\n // We've determined that A is the current branch.\n assertIsMounted(parentA);\n return fiber;\n }\n if (child === b) {\n // We've determined that B is the current branch.\n assertIsMounted(parentA);\n return alternate;\n }\n child = child.sibling;\n }\n // We should never have an alternate for any mounting node. So the only\n // way this could possibly happen is if this was unmounted, if at all.\n invariant(false, 'Unable to find node on an unmounted component.');\n }\n\n if (a['return'] !== b['return']) {\n // The return pointer of A and the return pointer of B point to different\n // fibers. We assume that return pointers never criss-cross, so A must\n // belong to the child set of A.return, and B must belong to the child\n // set of B.return.\n a = parentA;\n b = parentB;\n } else {\n // The return pointers point to the same fiber. We'll have to use the\n // default, slow path: scan the child sets of each parent alternate to see\n // which child belongs to which set.\n //\n // Search parent A's child set\n var didFindChild = false;\n var _child = parentA.child;\n while (_child) {\n if (_child === a) {\n didFindChild = true;\n a = parentA;\n b = parentB;\n break;\n }\n if (_child === b) {\n didFindChild = true;\n b = parentA;\n a = parentB;\n break;\n }\n _child = _child.sibling;\n }\n if (!didFindChild) {\n // Search parent B's child set\n _child = parentB.child;\n while (_child) {\n if (_child === a) {\n didFindChild = true;\n a = parentB;\n b = parentA;\n break;\n }\n if (_child === b) {\n didFindChild = true;\n b = parentB;\n a = parentA;\n break;\n }\n _child = _child.sibling;\n }\n !didFindChild ? invariant(false, 'Child was not found in either parent set. This indicates a bug in React related to the return pointer. Please file an issue.') : void 0;\n }\n }\n\n !(a.alternate === b) ? invariant(false, 'Return fibers should always be each others\\' alternates. This error is likely caused by a bug in React. Please file an issue.') : void 0;\n }\n // If the root is not a host container, we're in a disconnected tree. I.e.\n // unmounted.\n !(a.tag === HostRoot) ? invariant(false, 'Unable to find node on an unmounted component.') : void 0;\n if (a.stateNode.current === a) {\n // We've determined that A is the current branch.\n return fiber;\n }\n // Otherwise B has to be current branch.\n return alternate;\n}\n\nfunction findCurrentHostFiber(parent) {\n var currentParent = findCurrentFiberUsingSlowPath(parent);\n if (!currentParent) {\n return null;\n }\n\n // Next we'll drill down this component to find the first HostComponent/Text.\n var node = currentParent;\n while (true) {\n if (node.tag === HostComponent || node.tag === HostText) {\n return node;\n } else if (node.child) {\n node.child['return'] = node;\n node = node.child;\n continue;\n }\n if (node === currentParent) {\n return null;\n }\n while (!node.sibling) {\n if (!node['return'] || node['return'] === currentParent) {\n return null;\n }\n node = node['return'];\n }\n node.sibling['return'] = node['return'];\n node = node.sibling;\n }\n // Flow needs the return null here, but ESLint complains about it.\n // eslint-disable-next-line no-unreachable\n return null;\n}\n\nfunction findCurrentHostFiberWithNoPortals(parent) {\n var currentParent = findCurrentFiberUsingSlowPath(parent);\n if (!currentParent) {\n return null;\n }\n\n // Next we'll drill down this component to find the first HostComponent/Text.\n var node = currentParent;\n while (true) {\n if (node.tag === HostComponent || node.tag === HostText) {\n return node;\n } else if (node.child && node.tag !== HostPortal) {\n node.child['return'] = node;\n node = node.child;\n continue;\n }\n if (node === currentParent) {\n return null;\n }\n while (!node.sibling) {\n if (!node['return'] || node['return'] === currentParent) {\n return null;\n }\n node = node['return'];\n }\n node.sibling['return'] = node['return'];\n node = node.sibling;\n }\n // Flow needs the return null here, but ESLint complains about it.\n // eslint-disable-next-line no-unreachable\n return null;\n}\n\nvar CALLBACK_BOOKKEEPING_POOL_SIZE = 10;\nvar callbackBookkeepingPool = [];\n\n/**\n * Find the deepest React component completely containing the root of the\n * passed-in instance (for use when entire React trees are nested within each\n * other). If React trees are not nested, returns null.\n */\nfunction findRootContainerNode(inst) {\n // TODO: It may be a good idea to cache this to prevent unnecessary DOM\n // traversal, but caching is difficult to do correctly without using a\n // mutation observer to listen for all DOM changes.\n while (inst['return']) {\n inst = inst['return'];\n }\n if (inst.tag !== HostRoot) {\n // This can happen if we're in a detached tree.\n return null;\n }\n return inst.stateNode.containerInfo;\n}\n\n// Used to store ancestor hierarchy in top level callback\nfunction getTopLevelCallbackBookKeeping(topLevelType, nativeEvent, targetInst) {\n if (callbackBookkeepingPool.length) {\n var instance = callbackBookkeepingPool.pop();\n instance.topLevelType = topLevelType;\n instance.nativeEvent = nativeEvent;\n instance.targetInst = targetInst;\n return instance;\n }\n return {\n topLevelType: topLevelType,\n nativeEvent: nativeEvent,\n targetInst: targetInst,\n ancestors: []\n };\n}\n\nfunction releaseTopLevelCallbackBookKeeping(instance) {\n instance.topLevelType = null;\n instance.nativeEvent = null;\n instance.targetInst = null;\n instance.ancestors.length = 0;\n if (callbackBookkeepingPool.length < CALLBACK_BOOKKEEPING_POOL_SIZE) {\n callbackBookkeepingPool.push(instance);\n }\n}\n\nfunction handleTopLevelImpl(bookKeeping) {\n var targetInst = bookKeeping.targetInst;\n\n // Loop through the hierarchy, in case there's any nested components.\n // It's important that we build the array of ancestors before calling any\n // event handlers, because event handlers can modify the DOM, leading to\n // inconsistencies with ReactMount's node cache. See #1105.\n var ancestor = targetInst;\n do {\n if (!ancestor) {\n bookKeeping.ancestors.push(ancestor);\n break;\n }\n var root = findRootContainerNode(ancestor);\n if (!root) {\n break;\n }\n bookKeeping.ancestors.push(ancestor);\n ancestor = getClosestInstanceFromNode(root);\n } while (ancestor);\n\n for (var i = 0; i < bookKeeping.ancestors.length; i++) {\n targetInst = bookKeeping.ancestors[i];\n _handleTopLevel(bookKeeping.topLevelType, targetInst, bookKeeping.nativeEvent, getEventTarget(bookKeeping.nativeEvent));\n }\n}\n\n// TODO: can we stop exporting these?\nvar _enabled = true;\nvar _handleTopLevel = void 0;\n\nfunction setHandleTopLevel(handleTopLevel) {\n _handleTopLevel = handleTopLevel;\n}\n\nfunction setEnabled(enabled) {\n _enabled = !!enabled;\n}\n\nfunction isEnabled() {\n return _enabled;\n}\n\n/**\n * Traps top-level events by using event bubbling.\n *\n * @param {string} topLevelType Record from `BrowserEventConstants`.\n * @param {string} handlerBaseName Event name (e.g. \"click\").\n * @param {object} element Element on which to attach listener.\n * @return {?object} An object with a remove function which will forcefully\n * remove the listener.\n * @internal\n */\nfunction trapBubbledEvent(topLevelType, handlerBaseName, element) {\n if (!element) {\n return null;\n }\n return EventListener.listen(element, handlerBaseName, dispatchEvent.bind(null, topLevelType));\n}\n\n/**\n * Traps a top-level event by using event capturing.\n *\n * @param {string} topLevelType Record from `BrowserEventConstants`.\n * @param {string} handlerBaseName Event name (e.g. \"click\").\n * @param {object} element Element on which to attach listener.\n * @return {?object} An object with a remove function which will forcefully\n * remove the listener.\n * @internal\n */\nfunction trapCapturedEvent(topLevelType, handlerBaseName, element) {\n if (!element) {\n return null;\n }\n return EventListener.capture(element, handlerBaseName, dispatchEvent.bind(null, topLevelType));\n}\n\nfunction dispatchEvent(topLevelType, nativeEvent) {\n if (!_enabled) {\n return;\n }\n\n var nativeEventTarget = getEventTarget(nativeEvent);\n var targetInst = getClosestInstanceFromNode(nativeEventTarget);\n if (targetInst !== null && typeof targetInst.tag === 'number' && !isFiberMounted(targetInst)) {\n // If we get an event (ex: img onload) before committing that\n // component's mount, ignore it for now (that is, treat it as if it was an\n // event on a non-React tree). We might also consider queueing events and\n // dispatching them after the mount.\n targetInst = null;\n }\n\n var bookKeeping = getTopLevelCallbackBookKeeping(topLevelType, nativeEvent, targetInst);\n\n try {\n // Event queue being processed in the same cycle allows\n // `preventDefault`.\n batchedUpdates(handleTopLevelImpl, bookKeeping);\n } finally {\n releaseTopLevelCallbackBookKeeping(bookKeeping);\n }\n}\n\nvar ReactDOMEventListener = Object.freeze({\n\tget _enabled () { return _enabled; },\n\tget _handleTopLevel () { return _handleTopLevel; },\n\tsetHandleTopLevel: setHandleTopLevel,\n\tsetEnabled: setEnabled,\n\tisEnabled: isEnabled,\n\ttrapBubbledEvent: trapBubbledEvent,\n\ttrapCapturedEvent: trapCapturedEvent,\n\tdispatchEvent: dispatchEvent\n});\n\n/**\n * Generate a mapping of standard vendor prefixes using the defined style property and event name.\n *\n * @param {string} styleProp\n * @param {string} eventName\n * @returns {object}\n */\nfunction makePrefixMap(styleProp, eventName) {\n var prefixes = {};\n\n prefixes[styleProp.toLowerCase()] = eventName.toLowerCase();\n prefixes['Webkit' + styleProp] = 'webkit' + eventName;\n prefixes['Moz' + styleProp] = 'moz' + eventName;\n prefixes['ms' + styleProp] = 'MS' + eventName;\n prefixes['O' + styleProp] = 'o' + eventName.toLowerCase();\n\n return prefixes;\n}\n\n/**\n * A list of event names to a configurable list of vendor prefixes.\n */\nvar vendorPrefixes = {\n animationend: makePrefixMap('Animation', 'AnimationEnd'),\n animationiteration: makePrefixMap('Animation', 'AnimationIteration'),\n animationstart: makePrefixMap('Animation', 'AnimationStart'),\n transitionend: makePrefixMap('Transition', 'TransitionEnd')\n};\n\n/**\n * Event names that have already been detected and prefixed (if applicable).\n */\nvar prefixedEventNames = {};\n\n/**\n * Element to check for prefixes on.\n */\nvar style = {};\n\n/**\n * Bootstrap if a DOM exists.\n */\nif (ExecutionEnvironment.canUseDOM) {\n style = document.createElement('div').style;\n\n // On some platforms, in particular some releases of Android 4.x,\n // the un-prefixed \"animation\" and \"transition\" properties are defined on the\n // style object but the events that fire will still be prefixed, so we need\n // to check if the un-prefixed events are usable, and if not remove them from the map.\n if (!('AnimationEvent' in window)) {\n delete vendorPrefixes.animationend.animation;\n delete vendorPrefixes.animationiteration.animation;\n delete vendorPrefixes.animationstart.animation;\n }\n\n // Same as above\n if (!('TransitionEvent' in window)) {\n delete vendorPrefixes.transitionend.transition;\n }\n}\n\n/**\n * Attempts to determine the correct vendor prefixed event name.\n *\n * @param {string} eventName\n * @returns {string}\n */\nfunction getVendorPrefixedEventName(eventName) {\n if (prefixedEventNames[eventName]) {\n return prefixedEventNames[eventName];\n } else if (!vendorPrefixes[eventName]) {\n return eventName;\n }\n\n var prefixMap = vendorPrefixes[eventName];\n\n for (var styleProp in prefixMap) {\n if (prefixMap.hasOwnProperty(styleProp) && styleProp in style) {\n return prefixedEventNames[eventName] = prefixMap[styleProp];\n }\n }\n\n return '';\n}\n\n/**\n * Types of raw signals from the browser caught at the top level.\n *\n * For events like 'submit' which don't consistently bubble (which we\n * trap at a lower node than `document`), binding at `document` would\n * cause duplicate events so we don't include them here.\n */\nvar topLevelTypes$1 = {\n topAbort: 'abort',\n topAnimationEnd: getVendorPrefixedEventName('animationend') || 'animationend',\n topAnimationIteration: getVendorPrefixedEventName('animationiteration') || 'animationiteration',\n topAnimationStart: getVendorPrefixedEventName('animationstart') || 'animationstart',\n topBlur: 'blur',\n topCancel: 'cancel',\n topCanPlay: 'canplay',\n topCanPlayThrough: 'canplaythrough',\n topChange: 'change',\n topClick: 'click',\n topClose: 'close',\n topCompositionEnd: 'compositionend',\n topCompositionStart: 'compositionstart',\n topCompositionUpdate: 'compositionupdate',\n topContextMenu: 'contextmenu',\n topCopy: 'copy',\n topCut: 'cut',\n topDoubleClick: 'dblclick',\n topDrag: 'drag',\n topDragEnd: 'dragend',\n topDragEnter: 'dragenter',\n topDragExit: 'dragexit',\n topDragLeave: 'dragleave',\n topDragOver: 'dragover',\n topDragStart: 'dragstart',\n topDrop: 'drop',\n topDurationChange: 'durationchange',\n topEmptied: 'emptied',\n topEncrypted: 'encrypted',\n topEnded: 'ended',\n topError: 'error',\n topFocus: 'focus',\n topInput: 'input',\n topKeyDown: 'keydown',\n topKeyPress: 'keypress',\n topKeyUp: 'keyup',\n topLoadedData: 'loadeddata',\n topLoad: 'load',\n topLoadedMetadata: 'loadedmetadata',\n topLoadStart: 'loadstart',\n topMouseDown: 'mousedown',\n topMouseMove: 'mousemove',\n topMouseOut: 'mouseout',\n topMouseOver: 'mouseover',\n topMouseUp: 'mouseup',\n topPaste: 'paste',\n topPause: 'pause',\n topPlay: 'play',\n topPlaying: 'playing',\n topProgress: 'progress',\n topRateChange: 'ratechange',\n topScroll: 'scroll',\n topSeeked: 'seeked',\n topSeeking: 'seeking',\n topSelectionChange: 'selectionchange',\n topStalled: 'stalled',\n topSuspend: 'suspend',\n topTextInput: 'textInput',\n topTimeUpdate: 'timeupdate',\n topToggle: 'toggle',\n topTouchCancel: 'touchcancel',\n topTouchEnd: 'touchend',\n topTouchMove: 'touchmove',\n topTouchStart: 'touchstart',\n topTransitionEnd: getVendorPrefixedEventName('transitionend') || 'transitionend',\n topVolumeChange: 'volumechange',\n topWaiting: 'waiting',\n topWheel: 'wheel'\n};\n\nvar BrowserEventConstants = {\n topLevelTypes: topLevelTypes$1\n};\n\nfunction runEventQueueInBatch(events) {\n enqueueEvents(events);\n processEventQueue(false);\n}\n\n/**\n * Streams a fired top-level event to `EventPluginHub` where plugins have the\n * opportunity to create `ReactEvent`s to be dispatched.\n */\nfunction handleTopLevel(topLevelType, targetInst, nativeEvent, nativeEventTarget) {\n var events = extractEvents(topLevelType, targetInst, nativeEvent, nativeEventTarget);\n runEventQueueInBatch(events);\n}\n\nvar topLevelTypes = BrowserEventConstants.topLevelTypes;\n\n/**\n * Summary of `ReactBrowserEventEmitter` event handling:\n *\n * - Top-level delegation is used to trap most native browser events. This\n * may only occur in the main thread and is the responsibility of\n * ReactDOMEventListener, which is injected and can therefore support\n * pluggable event sources. This is the only work that occurs in the main\n * thread.\n *\n * - We normalize and de-duplicate events to account for browser quirks. This\n * may be done in the worker thread.\n *\n * - Forward these native events (with the associated top-level type used to\n * trap it) to `EventPluginHub`, which in turn will ask plugins if they want\n * to extract any synthetic events.\n *\n * - The `EventPluginHub` will then process each event by annotating them with\n * \"dispatches\", a sequence of listeners and IDs that care about that event.\n *\n * - The `EventPluginHub` then dispatches the events.\n *\n * Overview of React and the event system:\n *\n * +------------+ .\n * | DOM | .\n * +------------+ .\n * | .\n * v .\n * +------------+ .\n * | ReactEvent | .\n * | Listener | .\n * +------------+ . +-----------+\n * | . +--------+|SimpleEvent|\n * | . | |Plugin |\n * +-----|------+ . v +-----------+\n * | | | . +--------------+ +------------+\n * | +-----------.--->|EventPluginHub| | Event |\n * | | . | | +-----------+ | Propagators|\n * | ReactEvent | . | | |TapEvent | |------------|\n * | Emitter | . | |<---+|Plugin | |other plugin|\n * | | . | | +-----------+ | utilities |\n * | +-----------.--->| | +------------+\n * | | | . +--------------+\n * +-----|------+ . ^ +-----------+\n * | . | |Enter/Leave|\n * + . +-------+|Plugin |\n * +-------------+ . +-----------+\n * | application | .\n * |-------------| .\n * | | .\n * | | .\n * +-------------+ .\n * .\n * React Core . General Purpose Event Plugin System\n */\n\nvar alreadyListeningTo = {};\nvar reactTopListenersCounter = 0;\n\n/**\n * To ensure no conflicts with other potential React instances on the page\n */\nvar topListenersIDKey = '_reactListenersID' + ('' + Math.random()).slice(2);\n\nfunction getListeningForDocument(mountAt) {\n // In IE8, `mountAt` is a host object and doesn't have `hasOwnProperty`\n // directly.\n if (!Object.prototype.hasOwnProperty.call(mountAt, topListenersIDKey)) {\n mountAt[topListenersIDKey] = reactTopListenersCounter++;\n alreadyListeningTo[mountAt[topListenersIDKey]] = {};\n }\n return alreadyListeningTo[mountAt[topListenersIDKey]];\n}\n\n/**\n * We listen for bubbled touch events on the document object.\n *\n * Firefox v8.01 (and possibly others) exhibited strange behavior when\n * mounting `onmousemove` events at some node that was not the document\n * element. The symptoms were that if your mouse is not moving over something\n * contained within that mount point (for example on the background) the\n * top-level listeners for `onmousemove` won't be called. However, if you\n * register the `mousemove` on the document object, then it will of course\n * catch all `mousemove`s. This along with iOS quirks, justifies restricting\n * top-level listeners to the document object only, at least for these\n * movement types of events and possibly all events.\n *\n * @see http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html\n *\n * Also, `keyup`/`keypress`/`keydown` do not bubble to the window on IE, but\n * they bubble to document.\n *\n * @param {string} registrationName Name of listener (e.g. `onClick`).\n * @param {object} contentDocumentHandle Document which owns the container\n */\nfunction listenTo(registrationName, contentDocumentHandle) {\n var mountAt = contentDocumentHandle;\n var isListening = getListeningForDocument(mountAt);\n var dependencies = registrationNameDependencies[registrationName];\n\n for (var i = 0; i < dependencies.length; i++) {\n var dependency = dependencies[i];\n if (!(isListening.hasOwnProperty(dependency) && isListening[dependency])) {\n if (dependency === 'topScroll') {\n trapCapturedEvent('topScroll', 'scroll', mountAt);\n } else if (dependency === 'topFocus' || dependency === 'topBlur') {\n trapCapturedEvent('topFocus', 'focus', mountAt);\n trapCapturedEvent('topBlur', 'blur', mountAt);\n\n // to make sure blur and focus event listeners are only attached once\n isListening.topBlur = true;\n isListening.topFocus = true;\n } else if (dependency === 'topCancel') {\n if (isEventSupported('cancel', true)) {\n trapCapturedEvent('topCancel', 'cancel', mountAt);\n }\n isListening.topCancel = true;\n } else if (dependency === 'topClose') {\n if (isEventSupported('close', true)) {\n trapCapturedEvent('topClose', 'close', mountAt);\n }\n isListening.topClose = true;\n } else if (topLevelTypes.hasOwnProperty(dependency)) {\n trapBubbledEvent(dependency, topLevelTypes[dependency], mountAt);\n }\n\n isListening[dependency] = true;\n }\n }\n}\n\nfunction isListeningToAllDependencies(registrationName, mountAt) {\n var isListening = getListeningForDocument(mountAt);\n var dependencies = registrationNameDependencies[registrationName];\n for (var i = 0; i < dependencies.length; i++) {\n var dependency = dependencies[i];\n if (!(isListening.hasOwnProperty(dependency) && isListening[dependency])) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Given any node return the first leaf node without children.\n *\n * @param {DOMElement|DOMTextNode} node\n * @return {DOMElement|DOMTextNode}\n */\nfunction getLeafNode(node) {\n while (node && node.firstChild) {\n node = node.firstChild;\n }\n return node;\n}\n\n/**\n * Get the next sibling within a container. This will walk up the\n * DOM if a node's siblings have been exhausted.\n *\n * @param {DOMElement|DOMTextNode} node\n * @return {?DOMElement|DOMTextNode}\n */\nfunction getSiblingNode(node) {\n while (node) {\n if (node.nextSibling) {\n return node.nextSibling;\n }\n node = node.parentNode;\n }\n}\n\n/**\n * Get object describing the nodes which contain characters at offset.\n *\n * @param {DOMElement|DOMTextNode} root\n * @param {number} offset\n * @return {?object}\n */\nfunction getNodeForCharacterOffset(root, offset) {\n var node = getLeafNode(root);\n var nodeStart = 0;\n var nodeEnd = 0;\n\n while (node) {\n if (node.nodeType === TEXT_NODE) {\n nodeEnd = nodeStart + node.textContent.length;\n\n if (nodeStart <= offset && nodeEnd >= offset) {\n return {\n node: node,\n offset: offset - nodeStart\n };\n }\n\n nodeStart = nodeEnd;\n }\n\n node = getLeafNode(getSiblingNode(node));\n }\n}\n\n/**\n * @param {DOMElement} outerNode\n * @return {?object}\n */\nfunction getOffsets(outerNode) {\n var selection = window.getSelection && window.getSelection();\n\n if (!selection || selection.rangeCount === 0) {\n return null;\n }\n\n var anchorNode = selection.anchorNode,\n anchorOffset = selection.anchorOffset,\n focusNode$$1 = selection.focusNode,\n focusOffset = selection.focusOffset;\n\n // In Firefox, anchorNode and focusNode can be \"anonymous divs\", e.g. the\n // up/down buttons on an <input type=\"number\">. Anonymous divs do not seem to\n // expose properties, triggering a \"Permission denied error\" if any of its\n // properties are accessed. The only seemingly possible way to avoid erroring\n // is to access a property that typically works for non-anonymous divs and\n // catch any error that may otherwise arise. See\n // https://bugzilla.mozilla.org/show_bug.cgi?id=208427\n\n try {\n /* eslint-disable no-unused-expressions */\n anchorNode.nodeType;\n focusNode$$1.nodeType;\n /* eslint-enable no-unused-expressions */\n } catch (e) {\n return null;\n }\n\n return getModernOffsetsFromPoints(outerNode, anchorNode, anchorOffset, focusNode$$1, focusOffset);\n}\n\n/**\n * Returns {start, end} where `start` is the character/codepoint index of\n * (anchorNode, anchorOffset) within the textContent of `outerNode`, and\n * `end` is the index of (focusNode, focusOffset).\n *\n * Returns null if you pass in garbage input but we should probably just crash.\n *\n * Exported only for testing.\n */\nfunction getModernOffsetsFromPoints(outerNode, anchorNode, anchorOffset, focusNode$$1, focusOffset) {\n var length = 0;\n var start = -1;\n var end = -1;\n var indexWithinAnchor = 0;\n var indexWithinFocus = 0;\n var node = outerNode;\n var parentNode = null;\n\n outer: while (true) {\n var next = null;\n\n while (true) {\n if (node === anchorNode && (anchorOffset === 0 || node.nodeType === TEXT_NODE)) {\n start = length + anchorOffset;\n }\n if (node === focusNode$$1 && (focusOffset === 0 || node.nodeType === TEXT_NODE)) {\n end = length + focusOffset;\n }\n\n if (node.nodeType === TEXT_NODE) {\n length += node.nodeValue.length;\n }\n\n if ((next = node.firstChild) === null) {\n break;\n }\n // Moving from `node` to its first child `next`.\n parentNode = node;\n node = next;\n }\n\n while (true) {\n if (node === outerNode) {\n // If `outerNode` has children, this is always the second time visiting\n // it. If it has no children, this is still the first loop, and the only\n // valid selection is anchorNode and focusNode both equal to this node\n // and both offsets 0, in which case we will have handled above.\n break outer;\n }\n if (parentNode === anchorNode && ++indexWithinAnchor === anchorOffset) {\n start = length;\n }\n if (parentNode === focusNode$$1 && ++indexWithinFocus === focusOffset) {\n end = length;\n }\n if ((next = node.nextSibling) !== null) {\n break;\n }\n node = parentNode;\n parentNode = node.parentNode;\n }\n\n // Moving from `node` to its next sibling `next`.\n node = next;\n }\n\n if (start === -1 || end === -1) {\n // This should never happen. (Would happen if the anchor/focus nodes aren't\n // actually inside the passed-in node.)\n return null;\n }\n\n return {\n start: start,\n end: end\n };\n}\n\n/**\n * In modern non-IE browsers, we can support both forward and backward\n * selections.\n *\n * Note: IE10+ supports the Selection object, but it does not support\n * the `extend` method, which means that even in modern IE, it's not possible\n * to programmatically create a backward selection. Thus, for all IE\n * versions, we use the old IE API to create our selections.\n *\n * @param {DOMElement|DOMTextNode} node\n * @param {object} offsets\n */\nfunction setOffsets(node, offsets) {\n if (!window.getSelection) {\n return;\n }\n\n var selection = window.getSelection();\n var length = node[getTextContentAccessor()].length;\n var start = Math.min(offsets.start, length);\n var end = offsets.end === undefined ? start : Math.min(offsets.end, length);\n\n // IE 11 uses modern selection, but doesn't support the extend method.\n // Flip backward selections, so we can set with a single range.\n if (!selection.extend && start > end) {\n var temp = end;\n end = start;\n start = temp;\n }\n\n var startMarker = getNodeForCharacterOffset(node, start);\n var endMarker = getNodeForCharacterOffset(node, end);\n\n if (startMarker && endMarker) {\n if (selection.rangeCount === 1 && selection.anchorNode === startMarker.node && selection.anchorOffset === startMarker.offset && selection.focusNode === endMarker.node && selection.focusOffset === endMarker.offset) {\n return;\n }\n var range = document.createRange();\n range.setStart(startMarker.node, startMarker.offset);\n selection.removeAllRanges();\n\n if (start > end) {\n selection.addRange(range);\n selection.extend(endMarker.node, endMarker.offset);\n } else {\n range.setEnd(endMarker.node, endMarker.offset);\n selection.addRange(range);\n }\n }\n}\n\nfunction isInDocument(node) {\n return containsNode(document.documentElement, node);\n}\n\n/**\n * @ReactInputSelection: React input selection module. Based on Selection.js,\n * but modified to be suitable for react and has a couple of bug fixes (doesn't\n * assume buttons have range selections allowed).\n * Input selection module for React.\n */\n\nfunction hasSelectionCapabilities(elem) {\n var nodeName = elem && elem.nodeName && elem.nodeName.toLowerCase();\n return nodeName && (nodeName === 'input' && elem.type === 'text' || nodeName === 'textarea' || elem.contentEditable === 'true');\n}\n\nfunction getSelectionInformation() {\n var focusedElem = getActiveElement();\n return {\n focusedElem: focusedElem,\n selectionRange: hasSelectionCapabilities(focusedElem) ? getSelection$1(focusedElem) : null\n };\n}\n\n/**\n * @restoreSelection: If any selection information was potentially lost,\n * restore it. This is useful when performing operations that could remove dom\n * nodes and place them back in, resulting in focus being lost.\n */\nfunction restoreSelection(priorSelectionInformation) {\n var curFocusedElem = getActiveElement();\n var priorFocusedElem = priorSelectionInformation.focusedElem;\n var priorSelectionRange = priorSelectionInformation.selectionRange;\n if (curFocusedElem !== priorFocusedElem && isInDocument(priorFocusedElem)) {\n if (hasSelectionCapabilities(priorFocusedElem)) {\n setSelection(priorFocusedElem, priorSelectionRange);\n }\n\n // Focusing a node can change the scroll position, which is undesirable\n var ancestors = [];\n var ancestor = priorFocusedElem;\n while (ancestor = ancestor.parentNode) {\n if (ancestor.nodeType === ELEMENT_NODE) {\n ancestors.push({\n element: ancestor,\n left: ancestor.scrollLeft,\n top: ancestor.scrollTop\n });\n }\n }\n\n focusNode(priorFocusedElem);\n\n for (var i = 0; i < ancestors.length; i++) {\n var info = ancestors[i];\n info.element.scrollLeft = info.left;\n info.element.scrollTop = info.top;\n }\n }\n}\n\n/**\n * @getSelection: Gets the selection bounds of a focused textarea, input or\n * contentEditable node.\n * -@input: Look up selection bounds of this input\n * -@return {start: selectionStart, end: selectionEnd}\n */\nfunction getSelection$1(input) {\n var selection = void 0;\n\n if ('selectionStart' in input) {\n // Modern browser with input or textarea.\n selection = {\n start: input.selectionStart,\n end: input.selectionEnd\n };\n } else {\n // Content editable or old IE textarea.\n selection = getOffsets(input);\n }\n\n return selection || { start: 0, end: 0 };\n}\n\n/**\n * @setSelection: Sets the selection bounds of a textarea or input and focuses\n * the input.\n * -@input Set selection bounds of this input or textarea\n * -@offsets Object of same form that is returned from get*\n */\nfunction setSelection(input, offsets) {\n var start = offsets.start,\n end = offsets.end;\n\n if (end === undefined) {\n end = start;\n }\n\n if ('selectionStart' in input) {\n input.selectionStart = start;\n input.selectionEnd = Math.min(end, input.value.length);\n } else {\n setOffsets(input, offsets);\n }\n}\n\nvar skipSelectionChangeEvent = ExecutionEnvironment.canUseDOM && 'documentMode' in document && document.documentMode <= 11;\n\nvar eventTypes$3 = {\n select: {\n phasedRegistrationNames: {\n bubbled: 'onSelect',\n captured: 'onSelectCapture'\n },\n dependencies: ['topBlur', 'topContextMenu', 'topFocus', 'topKeyDown', 'topKeyUp', 'topMouseDown', 'topMouseUp', 'topSelectionChange']\n }\n};\n\nvar activeElement$1 = null;\nvar activeElementInst$1 = null;\nvar lastSelection = null;\nvar mouseDown = false;\n\n/**\n * Get an object which is a unique representation of the current selection.\n *\n * The return value will not be consistent across nodes or browsers, but\n * two identical selections on the same node will return identical objects.\n *\n * @param {DOMElement} node\n * @return {object}\n */\nfunction getSelection(node) {\n if ('selectionStart' in node && hasSelectionCapabilities(node)) {\n return {\n start: node.selectionStart,\n end: node.selectionEnd\n };\n } else if (window.getSelection) {\n var selection = window.getSelection();\n return {\n anchorNode: selection.anchorNode,\n anchorOffset: selection.anchorOffset,\n focusNode: selection.focusNode,\n focusOffset: selection.focusOffset\n };\n }\n}\n\n/**\n * Poll selection to see whether it's changed.\n *\n * @param {object} nativeEvent\n * @return {?SyntheticEvent}\n */\nfunction constructSelectEvent(nativeEvent, nativeEventTarget) {\n // Ensure we have the right element, and that the user is not dragging a\n // selection (this matches native `select` event behavior). In HTML5, select\n // fires only on input and textarea thus if there's no focused element we\n // won't dispatch.\n if (mouseDown || activeElement$1 == null || activeElement$1 !== getActiveElement()) {\n return null;\n }\n\n // Only fire when selection has actually changed.\n var currentSelection = getSelection(activeElement$1);\n if (!lastSelection || !shallowEqual(lastSelection, currentSelection)) {\n lastSelection = currentSelection;\n\n var syntheticEvent = SyntheticEvent$1.getPooled(eventTypes$3.select, activeElementInst$1, nativeEvent, nativeEventTarget);\n\n syntheticEvent.type = 'select';\n syntheticEvent.target = activeElement$1;\n\n accumulateTwoPhaseDispatches(syntheticEvent);\n\n return syntheticEvent;\n }\n\n return null;\n}\n\n/**\n * This plugin creates an `onSelect` event that normalizes select events\n * across form elements.\n *\n * Supported elements are:\n * - input (see `isTextInputElement`)\n * - textarea\n * - contentEditable\n *\n * This differs from native browser implementations in the following ways:\n * - Fires on contentEditable fields as well as inputs.\n * - Fires for collapsed selection.\n * - Fires after user input.\n */\nvar SelectEventPlugin = {\n eventTypes: eventTypes$3,\n\n extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) {\n var doc = nativeEventTarget.window === nativeEventTarget ? nativeEventTarget.document : nativeEventTarget.nodeType === DOCUMENT_NODE ? nativeEventTarget : nativeEventTarget.ownerDocument;\n // Track whether all listeners exists for this plugin. If none exist, we do\n // not extract events. See #3639.\n if (!doc || !isListeningToAllDependencies('onSelect', doc)) {\n return null;\n }\n\n var targetNode = targetInst ? getNodeFromInstance$1(targetInst) : window;\n\n switch (topLevelType) {\n // Track the input node that has focus.\n case 'topFocus':\n if (isTextInputElement(targetNode) || targetNode.contentEditable === 'true') {\n activeElement$1 = targetNode;\n activeElementInst$1 = targetInst;\n lastSelection = null;\n }\n break;\n case 'topBlur':\n activeElement$1 = null;\n activeElementInst$1 = null;\n lastSelection = null;\n break;\n // Don't fire the event while the user is dragging. This matches the\n // semantics of the native select event.\n case 'topMouseDown':\n mouseDown = true;\n break;\n case 'topContextMenu':\n case 'topMouseUp':\n mouseDown = false;\n return constructSelectEvent(nativeEvent, nativeEventTarget);\n // Chrome and IE fire non-standard event when selection is changed (and\n // sometimes when it hasn't). IE's event fires out of order with respect\n // to key and input events on deletion, so we discard it.\n //\n // Firefox doesn't support selectionchange, so check selection status\n // after each key entry. The selection changes after keydown and before\n // keyup, but we check on keydown as well in the case of holding down a\n // key, when multiple keydown events are fired but only one keyup is.\n // This is also our approach for IE handling, for the reason above.\n case 'topSelectionChange':\n if (skipSelectionChangeEvent) {\n break;\n }\n // falls through\n case 'topKeyDown':\n case 'topKeyUp':\n return constructSelectEvent(nativeEvent, nativeEventTarget);\n }\n\n return null;\n }\n};\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/css3-animations/#AnimationEvent-interface\n * @see https://developer.mozilla.org/en-US/docs/Web/API/AnimationEvent\n */\nvar AnimationEventInterface = {\n animationName: null,\n elapsedTime: null,\n pseudoElement: null\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticEvent}\n */\nfunction SyntheticAnimationEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n return SyntheticEvent$1.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticEvent$1.augmentClass(SyntheticAnimationEvent, AnimationEventInterface);\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/clipboard-apis/\n */\nvar ClipboardEventInterface = {\n clipboardData: function (event) {\n return 'clipboardData' in event ? event.clipboardData : window.clipboardData;\n }\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticEvent}\n */\nfunction SyntheticClipboardEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n return SyntheticEvent$1.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticEvent$1.augmentClass(SyntheticClipboardEvent, ClipboardEventInterface);\n\n/**\n * @interface FocusEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\nvar FocusEventInterface = {\n relatedTarget: null\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticUIEvent}\n */\nfunction SyntheticFocusEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n return SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticUIEvent.augmentClass(SyntheticFocusEvent, FocusEventInterface);\n\n/**\n * `charCode` represents the actual \"character code\" and is safe to use with\n * `String.fromCharCode`. As such, only keys that correspond to printable\n * characters produce a valid `charCode`, the only exception to this is Enter.\n * The Tab-key is considered non-printable and does not have a `charCode`,\n * presumably because it does not produce a tab-character in browsers.\n *\n * @param {object} nativeEvent Native browser event.\n * @return {number} Normalized `charCode` property.\n */\nfunction getEventCharCode(nativeEvent) {\n var charCode;\n var keyCode = nativeEvent.keyCode;\n\n if ('charCode' in nativeEvent) {\n charCode = nativeEvent.charCode;\n\n // FF does not set `charCode` for the Enter-key, check against `keyCode`.\n if (charCode === 0 && keyCode === 13) {\n charCode = 13;\n }\n } else {\n // IE8 does not implement `charCode`, but `keyCode` has the correct value.\n charCode = keyCode;\n }\n\n // Some non-printable keys are reported in `charCode`/`keyCode`, discard them.\n // Must not discard the (non-)printable Enter-key.\n if (charCode >= 32 || charCode === 13) {\n return charCode;\n }\n\n return 0;\n}\n\n/**\n * Normalization of deprecated HTML5 `key` values\n * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names\n */\nvar normalizeKey = {\n Esc: 'Escape',\n Spacebar: ' ',\n Left: 'ArrowLeft',\n Up: 'ArrowUp',\n Right: 'ArrowRight',\n Down: 'ArrowDown',\n Del: 'Delete',\n Win: 'OS',\n Menu: 'ContextMenu',\n Apps: 'ContextMenu',\n Scroll: 'ScrollLock',\n MozPrintableKey: 'Unidentified'\n};\n\n/**\n * Translation from legacy `keyCode` to HTML5 `key`\n * Only special keys supported, all others depend on keyboard layout or browser\n * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names\n */\nvar translateToKey = {\n '8': 'Backspace',\n '9': 'Tab',\n '12': 'Clear',\n '13': 'Enter',\n '16': 'Shift',\n '17': 'Control',\n '18': 'Alt',\n '19': 'Pause',\n '20': 'CapsLock',\n '27': 'Escape',\n '32': ' ',\n '33': 'PageUp',\n '34': 'PageDown',\n '35': 'End',\n '36': 'Home',\n '37': 'ArrowLeft',\n '38': 'ArrowUp',\n '39': 'ArrowRight',\n '40': 'ArrowDown',\n '45': 'Insert',\n '46': 'Delete',\n '112': 'F1',\n '113': 'F2',\n '114': 'F3',\n '115': 'F4',\n '116': 'F5',\n '117': 'F6',\n '118': 'F7',\n '119': 'F8',\n '120': 'F9',\n '121': 'F10',\n '122': 'F11',\n '123': 'F12',\n '144': 'NumLock',\n '145': 'ScrollLock',\n '224': 'Meta'\n};\n\n/**\n * @param {object} nativeEvent Native browser event.\n * @return {string} Normalized `key` property.\n */\nfunction getEventKey(nativeEvent) {\n if (nativeEvent.key) {\n // Normalize inconsistent values reported by browsers due to\n // implementations of a working draft specification.\n\n // FireFox implements `key` but returns `MozPrintableKey` for all\n // printable characters (normalized to `Unidentified`), ignore it.\n var key = normalizeKey[nativeEvent.key] || nativeEvent.key;\n if (key !== 'Unidentified') {\n return key;\n }\n }\n\n // Browser does not implement `key`, polyfill as much of it as we can.\n if (nativeEvent.type === 'keypress') {\n var charCode = getEventCharCode(nativeEvent);\n\n // The enter-key is technically both printable and non-printable and can\n // thus be captured by `keypress`, no other non-printable key should.\n return charCode === 13 ? 'Enter' : String.fromCharCode(charCode);\n }\n if (nativeEvent.type === 'keydown' || nativeEvent.type === 'keyup') {\n // While user keyboard layout determines the actual meaning of each\n // `keyCode` value, almost all function keys have a universal value.\n return translateToKey[nativeEvent.keyCode] || 'Unidentified';\n }\n return '';\n}\n\n/**\n * @interface KeyboardEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\nvar KeyboardEventInterface = {\n key: getEventKey,\n location: null,\n ctrlKey: null,\n shiftKey: null,\n altKey: null,\n metaKey: null,\n repeat: null,\n locale: null,\n getModifierState: getEventModifierState,\n // Legacy Interface\n charCode: function (event) {\n // `charCode` is the result of a KeyPress event and represents the value of\n // the actual printable character.\n\n // KeyPress is deprecated, but its replacement is not yet final and not\n // implemented in any major browser. Only KeyPress has charCode.\n if (event.type === 'keypress') {\n return getEventCharCode(event);\n }\n return 0;\n },\n keyCode: function (event) {\n // `keyCode` is the result of a KeyDown/Up event and represents the value of\n // physical keyboard key.\n\n // The actual meaning of the value depends on the users' keyboard layout\n // which cannot be detected. Assuming that it is a US keyboard layout\n // provides a surprisingly accurate mapping for US and European users.\n // Due to this, it is left to the user to implement at this time.\n if (event.type === 'keydown' || event.type === 'keyup') {\n return event.keyCode;\n }\n return 0;\n },\n which: function (event) {\n // `which` is an alias for either `keyCode` or `charCode` depending on the\n // type of the event.\n if (event.type === 'keypress') {\n return getEventCharCode(event);\n }\n if (event.type === 'keydown' || event.type === 'keyup') {\n return event.keyCode;\n }\n return 0;\n }\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticUIEvent}\n */\nfunction SyntheticKeyboardEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n return SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticUIEvent.augmentClass(SyntheticKeyboardEvent, KeyboardEventInterface);\n\n/**\n * @interface DragEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\nvar DragEventInterface = {\n dataTransfer: null\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticMouseEvent}\n */\nfunction SyntheticDragEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n return SyntheticMouseEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticMouseEvent.augmentClass(SyntheticDragEvent, DragEventInterface);\n\n/**\n * @interface TouchEvent\n * @see http://www.w3.org/TR/touch-events/\n */\nvar TouchEventInterface = {\n touches: null,\n targetTouches: null,\n changedTouches: null,\n altKey: null,\n metaKey: null,\n ctrlKey: null,\n shiftKey: null,\n getModifierState: getEventModifierState\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticUIEvent}\n */\nfunction SyntheticTouchEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n return SyntheticUIEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticUIEvent.augmentClass(SyntheticTouchEvent, TouchEventInterface);\n\n/**\n * @interface Event\n * @see http://www.w3.org/TR/2009/WD-css3-transitions-20090320/#transition-events-\n * @see https://developer.mozilla.org/en-US/docs/Web/API/TransitionEvent\n */\nvar TransitionEventInterface = {\n propertyName: null,\n elapsedTime: null,\n pseudoElement: null\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticEvent}\n */\nfunction SyntheticTransitionEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n return SyntheticEvent$1.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticEvent$1.augmentClass(SyntheticTransitionEvent, TransitionEventInterface);\n\n/**\n * @interface WheelEvent\n * @see http://www.w3.org/TR/DOM-Level-3-Events/\n */\nvar WheelEventInterface = {\n deltaX: function (event) {\n return 'deltaX' in event ? event.deltaX : // Fallback to `wheelDeltaX` for Webkit and normalize (right is positive).\n 'wheelDeltaX' in event ? -event.wheelDeltaX : 0;\n },\n deltaY: function (event) {\n return 'deltaY' in event ? event.deltaY : // Fallback to `wheelDeltaY` for Webkit and normalize (down is positive).\n 'wheelDeltaY' in event ? -event.wheelDeltaY : // Fallback to `wheelDelta` for IE<9 and normalize (down is positive).\n 'wheelDelta' in event ? -event.wheelDelta : 0;\n },\n deltaZ: null,\n\n // Browsers without \"deltaMode\" is reporting in raw wheel delta where one\n // notch on the scroll is always +/- 120, roughly equivalent to pixels.\n // A good approximation of DOM_DELTA_LINE (1) is 5% of viewport size or\n // ~40 pixels, for DOM_DELTA_SCREEN (2) it is 87.5% of viewport size.\n deltaMode: null\n};\n\n/**\n * @param {object} dispatchConfig Configuration used to dispatch this event.\n * @param {string} dispatchMarker Marker identifying the event target.\n * @param {object} nativeEvent Native browser event.\n * @extends {SyntheticMouseEvent}\n */\nfunction SyntheticWheelEvent(dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget) {\n return SyntheticMouseEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent, nativeEventTarget);\n}\n\nSyntheticMouseEvent.augmentClass(SyntheticWheelEvent, WheelEventInterface);\n\n/**\n * Turns\n * ['abort', ...]\n * into\n * eventTypes = {\n * 'abort': {\n * phasedRegistrationNames: {\n * bubbled: 'onAbort',\n * captured: 'onAbortCapture',\n * },\n * dependencies: ['topAbort'],\n * },\n * ...\n * };\n * topLevelEventsToDispatchConfig = {\n * 'topAbort': { sameConfig }\n * };\n */\nvar eventTypes$4 = {};\nvar topLevelEventsToDispatchConfig = {};\n['abort', 'animationEnd', 'animationIteration', 'animationStart', 'blur', 'cancel', 'canPlay', 'canPlayThrough', 'click', 'close', 'contextMenu', 'copy', 'cut', 'doubleClick', 'drag', 'dragEnd', 'dragEnter', 'dragExit', 'dragLeave', 'dragOver', 'dragStart', 'drop', 'durationChange', 'emptied', 'encrypted', 'ended', 'error', 'focus', 'input', 'invalid', 'keyDown', 'keyPress', 'keyUp', 'load', 'loadedData', 'loadedMetadata', 'loadStart', 'mouseDown', 'mouseMove', 'mouseOut', 'mouseOver', 'mouseUp', 'paste', 'pause', 'play', 'playing', 'progress', 'rateChange', 'reset', 'scroll', 'seeked', 'seeking', 'stalled', 'submit', 'suspend', 'timeUpdate', 'toggle', 'touchCancel', 'touchEnd', 'touchMove', 'touchStart', 'transitionEnd', 'volumeChange', 'waiting', 'wheel'].forEach(function (event) {\n var capitalizedEvent = event[0].toUpperCase() + event.slice(1);\n var onEvent = 'on' + capitalizedEvent;\n var topEvent = 'top' + capitalizedEvent;\n\n var type = {\n phasedRegistrationNames: {\n bubbled: onEvent,\n captured: onEvent + 'Capture'\n },\n dependencies: [topEvent]\n };\n eventTypes$4[event] = type;\n topLevelEventsToDispatchConfig[topEvent] = type;\n});\n\n// Only used in DEV for exhaustiveness validation.\nvar knownHTMLTopLevelTypes = ['topAbort', 'topCancel', 'topCanPlay', 'topCanPlayThrough', 'topClose', 'topDurationChange', 'topEmptied', 'topEncrypted', 'topEnded', 'topError', 'topInput', 'topInvalid', 'topLoad', 'topLoadedData', 'topLoadedMetadata', 'topLoadStart', 'topPause', 'topPlay', 'topPlaying', 'topProgress', 'topRateChange', 'topReset', 'topSeeked', 'topSeeking', 'topStalled', 'topSubmit', 'topSuspend', 'topTimeUpdate', 'topToggle', 'topVolumeChange', 'topWaiting'];\n\nvar SimpleEventPlugin = {\n eventTypes: eventTypes$4,\n\n extractEvents: function (topLevelType, targetInst, nativeEvent, nativeEventTarget) {\n var dispatchConfig = topLevelEventsToDispatchConfig[topLevelType];\n if (!dispatchConfig) {\n return null;\n }\n var EventConstructor;\n switch (topLevelType) {\n case 'topKeyPress':\n // Firefox creates a keypress event for function keys too. This removes\n // the unwanted keypress events. Enter is however both printable and\n // non-printable. One would expect Tab to be as well (but it isn't).\n if (getEventCharCode(nativeEvent) === 0) {\n return null;\n }\n /* falls through */\n case 'topKeyDown':\n case 'topKeyUp':\n EventConstructor = SyntheticKeyboardEvent;\n break;\n case 'topBlur':\n case 'topFocus':\n EventConstructor = SyntheticFocusEvent;\n break;\n case 'topClick':\n // Firefox creates a click event on right mouse clicks. This removes the\n // unwanted click events.\n if (nativeEvent.button === 2) {\n return null;\n }\n /* falls through */\n case 'topDoubleClick':\n case 'topMouseDown':\n case 'topMouseMove':\n case 'topMouseUp':\n // TODO: Disabled elements should not respond to mouse events\n /* falls through */\n case 'topMouseOut':\n case 'topMouseOver':\n case 'topContextMenu':\n EventConstructor = SyntheticMouseEvent;\n break;\n case 'topDrag':\n case 'topDragEnd':\n case 'topDragEnter':\n case 'topDragExit':\n case 'topDragLeave':\n case 'topDragOver':\n case 'topDragStart':\n case 'topDrop':\n EventConstructor = SyntheticDragEvent;\n break;\n case 'topTouchCancel':\n case 'topTouchEnd':\n case 'topTouchMove':\n case 'topTouchStart':\n EventConstructor = SyntheticTouchEvent;\n break;\n case 'topAnimationEnd':\n case 'topAnimationIteration':\n case 'topAnimationStart':\n EventConstructor = SyntheticAnimationEvent;\n break;\n case 'topTransitionEnd':\n EventConstructor = SyntheticTransitionEvent;\n break;\n case 'topScroll':\n EventConstructor = SyntheticUIEvent;\n break;\n case 'topWheel':\n EventConstructor = SyntheticWheelEvent;\n break;\n case 'topCopy':\n case 'topCut':\n case 'topPaste':\n EventConstructor = SyntheticClipboardEvent;\n break;\n default:\n {\n if (knownHTMLTopLevelTypes.indexOf(topLevelType) === -1) {\n warning(false, 'SimpleEventPlugin: Unhandled event type, `%s`. This warning ' + 'is likely caused by a bug in React. Please file an issue.', topLevelType);\n }\n }\n // HTML Events\n // @see http://www.w3.org/TR/html5/index.html#events-0\n EventConstructor = SyntheticEvent$1;\n break;\n }\n var event = EventConstructor.getPooled(dispatchConfig, targetInst, nativeEvent, nativeEventTarget);\n accumulateTwoPhaseDispatches(event);\n return event;\n }\n};\n\nsetHandleTopLevel(handleTopLevel);\n\n/**\n * Inject modules for resolving DOM hierarchy and plugin ordering.\n */\ninjection$1.injectEventPluginOrder(DOMEventPluginOrder);\ninjection$2.injectComponentTree(ReactDOMComponentTree);\n\n/**\n * Some important event plugins included by default (without having to require\n * them).\n */\ninjection$1.injectEventPluginsByName({\n SimpleEventPlugin: SimpleEventPlugin,\n EnterLeaveEventPlugin: EnterLeaveEventPlugin,\n ChangeEventPlugin: ChangeEventPlugin,\n SelectEventPlugin: SelectEventPlugin,\n BeforeInputEventPlugin: BeforeInputEventPlugin\n});\n\nvar enableAsyncSubtreeAPI = true;\nvar enableAsyncSchedulingByDefaultInReactDOM = false;\n// Exports ReactDOM.createRoot\nvar enableCreateRoot = false;\nvar enableUserTimingAPI = true;\n\n// Mutating mode (React DOM, React ART, React Native):\nvar enableMutatingReconciler = true;\n// Experimental noop mode (currently unused):\nvar enableNoopReconciler = false;\n// Experimental persistent mode (CS):\nvar enablePersistentReconciler = false;\n\n// Helps identify side effects in begin-phase lifecycle hooks and setState reducers:\nvar debugRenderPhaseSideEffects = false;\n\n// Only used in www builds.\n\nvar valueStack = [];\n\n{\n var fiberStack = [];\n}\n\nvar index = -1;\n\nfunction createCursor(defaultValue) {\n return {\n current: defaultValue\n };\n}\n\n\n\nfunction pop(cursor, fiber) {\n if (index < 0) {\n {\n warning(false, 'Unexpected pop.');\n }\n return;\n }\n\n {\n if (fiber !== fiberStack[index]) {\n warning(false, 'Unexpected Fiber popped.');\n }\n }\n\n cursor.current = valueStack[index];\n\n valueStack[index] = null;\n\n {\n fiberStack[index] = null;\n }\n\n index--;\n}\n\nfunction push(cursor, value, fiber) {\n index++;\n\n valueStack[index] = cursor.current;\n\n {\n fiberStack[index] = fiber;\n }\n\n cursor.current = value;\n}\n\nfunction reset$1() {\n while (index > -1) {\n valueStack[index] = null;\n\n {\n fiberStack[index] = null;\n }\n\n index--;\n }\n}\n\nvar describeComponentFrame = function (name, source, ownerName) {\n return '\\n in ' + (name || 'Unknown') + (source ? ' (at ' + source.fileName.replace(/^.*[\\\\\\/]/, '') + ':' + source.lineNumber + ')' : ownerName ? ' (created by ' + ownerName + ')' : '');\n};\n\nfunction describeFiber(fiber) {\n switch (fiber.tag) {\n case IndeterminateComponent:\n case FunctionalComponent:\n case ClassComponent:\n case HostComponent:\n var owner = fiber._debugOwner;\n var source = fiber._debugSource;\n var name = getComponentName(fiber);\n var ownerName = null;\n if (owner) {\n ownerName = getComponentName(owner);\n }\n return describeComponentFrame(name, source, ownerName);\n default:\n return '';\n }\n}\n\n// This function can only be called with a work-in-progress fiber and\n// only during begin or complete phase. Do not call it under any other\n// circumstances.\nfunction getStackAddendumByWorkInProgressFiber(workInProgress) {\n var info = '';\n var node = workInProgress;\n do {\n info += describeFiber(node);\n // Otherwise this return pointer might point to the wrong tree:\n node = node['return'];\n } while (node);\n return info;\n}\n\nfunction getCurrentFiberOwnerName() {\n {\n var fiber = ReactDebugCurrentFiber.current;\n if (fiber === null) {\n return null;\n }\n var owner = fiber._debugOwner;\n if (owner !== null && typeof owner !== 'undefined') {\n return getComponentName(owner);\n }\n }\n return null;\n}\n\nfunction getCurrentFiberStackAddendum() {\n {\n var fiber = ReactDebugCurrentFiber.current;\n if (fiber === null) {\n return null;\n }\n // Safe because if current fiber exists, we are reconciling,\n // and it is guaranteed to be the work-in-progress version.\n return getStackAddendumByWorkInProgressFiber(fiber);\n }\n return null;\n}\n\nfunction resetCurrentFiber() {\n ReactDebugCurrentFrame.getCurrentStack = null;\n ReactDebugCurrentFiber.current = null;\n ReactDebugCurrentFiber.phase = null;\n}\n\nfunction setCurrentFiber(fiber) {\n ReactDebugCurrentFrame.getCurrentStack = getCurrentFiberStackAddendum;\n ReactDebugCurrentFiber.current = fiber;\n ReactDebugCurrentFiber.phase = null;\n}\n\nfunction setCurrentPhase(phase) {\n ReactDebugCurrentFiber.phase = phase;\n}\n\nvar ReactDebugCurrentFiber = {\n current: null,\n phase: null,\n resetCurrentFiber: resetCurrentFiber,\n setCurrentFiber: setCurrentFiber,\n setCurrentPhase: setCurrentPhase,\n getCurrentFiberOwnerName: getCurrentFiberOwnerName,\n getCurrentFiberStackAddendum: getCurrentFiberStackAddendum\n};\n\n// Prefix measurements so that it's possible to filter them.\n// Longer prefixes are hard to read in DevTools.\nvar reactEmoji = '\\u269B';\nvar warningEmoji = '\\u26D4';\nvar supportsUserTiming = typeof performance !== 'undefined' && typeof performance.mark === 'function' && typeof performance.clearMarks === 'function' && typeof performance.measure === 'function' && typeof performance.clearMeasures === 'function';\n\n// Keep track of current fiber so that we know the path to unwind on pause.\n// TODO: this looks the same as nextUnitOfWork in scheduler. Can we unify them?\nvar currentFiber = null;\n// If we're in the middle of user code, which fiber and method is it?\n// Reusing `currentFiber` would be confusing for this because user code fiber\n// can change during commit phase too, but we don't need to unwind it (since\n// lifecycles in the commit phase don't resemble a tree).\nvar currentPhase = null;\nvar currentPhaseFiber = null;\n// Did lifecycle hook schedule an update? This is often a performance problem,\n// so we will keep track of it, and include it in the report.\n// Track commits caused by cascading updates.\nvar isCommitting = false;\nvar hasScheduledUpdateInCurrentCommit = false;\nvar hasScheduledUpdateInCurrentPhase = false;\nvar commitCountInCurrentWorkLoop = 0;\nvar effectCountInCurrentCommit = 0;\nvar isWaitingForCallback = false;\n// During commits, we only show a measurement once per method name\n// to avoid stretch the commit phase with measurement overhead.\nvar labelsInCurrentCommit = new Set();\n\nvar formatMarkName = function (markName) {\n return reactEmoji + ' ' + markName;\n};\n\nvar formatLabel = function (label, warning$$1) {\n var prefix = warning$$1 ? warningEmoji + ' ' : reactEmoji + ' ';\n var suffix = warning$$1 ? ' Warning: ' + warning$$1 : '';\n return '' + prefix + label + suffix;\n};\n\nvar beginMark = function (markName) {\n performance.mark(formatMarkName(markName));\n};\n\nvar clearMark = function (markName) {\n performance.clearMarks(formatMarkName(markName));\n};\n\nvar endMark = function (label, markName, warning$$1) {\n var formattedMarkName = formatMarkName(markName);\n var formattedLabel = formatLabel(label, warning$$1);\n try {\n performance.measure(formattedLabel, formattedMarkName);\n } catch (err) {}\n // If previous mark was missing for some reason, this will throw.\n // This could only happen if React crashed in an unexpected place earlier.\n // Don't pile on with more errors.\n\n // Clear marks immediately to avoid growing buffer.\n performance.clearMarks(formattedMarkName);\n performance.clearMeasures(formattedLabel);\n};\n\nvar getFiberMarkName = function (label, debugID) {\n return label + ' (#' + debugID + ')';\n};\n\nvar getFiberLabel = function (componentName, isMounted, phase) {\n if (phase === null) {\n // These are composite component total time measurements.\n return componentName + ' [' + (isMounted ? 'update' : 'mount') + ']';\n } else {\n // Composite component methods.\n return componentName + '.' + phase;\n }\n};\n\nvar beginFiberMark = function (fiber, phase) {\n var componentName = getComponentName(fiber) || 'Unknown';\n var debugID = fiber._debugID;\n var isMounted = fiber.alternate !== null;\n var label = getFiberLabel(componentName, isMounted, phase);\n\n if (isCommitting && labelsInCurrentCommit.has(label)) {\n // During the commit phase, we don't show duplicate labels because\n // there is a fixed overhead for every measurement, and we don't\n // want to stretch the commit phase beyond necessary.\n return false;\n }\n labelsInCurrentCommit.add(label);\n\n var markName = getFiberMarkName(label, debugID);\n beginMark(markName);\n return true;\n};\n\nvar clearFiberMark = function (fiber, phase) {\n var componentName = getComponentName(fiber) || 'Unknown';\n var debugID = fiber._debugID;\n var isMounted = fiber.alternate !== null;\n var label = getFiberLabel(componentName, isMounted, phase);\n var markName = getFiberMarkName(label, debugID);\n clearMark(markName);\n};\n\nvar endFiberMark = function (fiber, phase, warning$$1) {\n var componentName = getComponentName(fiber) || 'Unknown';\n var debugID = fiber._debugID;\n var isMounted = fiber.alternate !== null;\n var label = getFiberLabel(componentName, isMounted, phase);\n var markName = getFiberMarkName(label, debugID);\n endMark(label, markName, warning$$1);\n};\n\nvar shouldIgnoreFiber = function (fiber) {\n // Host components should be skipped in the timeline.\n // We could check typeof fiber.type, but does this work with RN?\n switch (fiber.tag) {\n case HostRoot:\n case HostComponent:\n case HostText:\n case HostPortal:\n case ReturnComponent:\n case Fragment:\n return true;\n default:\n return false;\n }\n};\n\nvar clearPendingPhaseMeasurement = function () {\n if (currentPhase !== null && currentPhaseFiber !== null) {\n clearFiberMark(currentPhaseFiber, currentPhase);\n }\n currentPhaseFiber = null;\n currentPhase = null;\n hasScheduledUpdateInCurrentPhase = false;\n};\n\nvar pauseTimers = function () {\n // Stops all currently active measurements so that they can be resumed\n // if we continue in a later deferred loop from the same unit of work.\n var fiber = currentFiber;\n while (fiber) {\n if (fiber._debugIsCurrentlyTiming) {\n endFiberMark(fiber, null, null);\n }\n fiber = fiber['return'];\n }\n};\n\nvar resumeTimersRecursively = function (fiber) {\n if (fiber['return'] !== null) {\n resumeTimersRecursively(fiber['return']);\n }\n if (fiber._debugIsCurrentlyTiming) {\n beginFiberMark(fiber, null);\n }\n};\n\nvar resumeTimers = function () {\n // Resumes all measurements that were active during the last deferred loop.\n if (currentFiber !== null) {\n resumeTimersRecursively(currentFiber);\n }\n};\n\nfunction recordEffect() {\n if (enableUserTimingAPI) {\n effectCountInCurrentCommit++;\n }\n}\n\nfunction recordScheduleUpdate() {\n if (enableUserTimingAPI) {\n if (isCommitting) {\n hasScheduledUpdateInCurrentCommit = true;\n }\n if (currentPhase !== null && currentPhase !== 'componentWillMount' && currentPhase !== 'componentWillReceiveProps') {\n hasScheduledUpdateInCurrentPhase = true;\n }\n }\n}\n\nfunction startRequestCallbackTimer() {\n if (enableUserTimingAPI) {\n if (supportsUserTiming && !isWaitingForCallback) {\n isWaitingForCallback = true;\n beginMark('(Waiting for async callback...)');\n }\n }\n}\n\nfunction stopRequestCallbackTimer(didExpire) {\n if (enableUserTimingAPI) {\n if (supportsUserTiming) {\n isWaitingForCallback = false;\n var warning$$1 = didExpire ? 'React was blocked by main thread' : null;\n endMark('(Waiting for async callback...)', '(Waiting for async callback...)', warning$$1);\n }\n }\n}\n\nfunction startWorkTimer(fiber) {\n if (enableUserTimingAPI) {\n if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {\n return;\n }\n // If we pause, this is the fiber to unwind from.\n currentFiber = fiber;\n if (!beginFiberMark(fiber, null)) {\n return;\n }\n fiber._debugIsCurrentlyTiming = true;\n }\n}\n\nfunction cancelWorkTimer(fiber) {\n if (enableUserTimingAPI) {\n if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {\n return;\n }\n // Remember we shouldn't complete measurement for this fiber.\n // Otherwise flamechart will be deep even for small updates.\n fiber._debugIsCurrentlyTiming = false;\n clearFiberMark(fiber, null);\n }\n}\n\nfunction stopWorkTimer(fiber) {\n if (enableUserTimingAPI) {\n if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {\n return;\n }\n // If we pause, its parent is the fiber to unwind from.\n currentFiber = fiber['return'];\n if (!fiber._debugIsCurrentlyTiming) {\n return;\n }\n fiber._debugIsCurrentlyTiming = false;\n endFiberMark(fiber, null, null);\n }\n}\n\nfunction stopFailedWorkTimer(fiber) {\n if (enableUserTimingAPI) {\n if (!supportsUserTiming || shouldIgnoreFiber(fiber)) {\n return;\n }\n // If we pause, its parent is the fiber to unwind from.\n currentFiber = fiber['return'];\n if (!fiber._debugIsCurrentlyTiming) {\n return;\n }\n fiber._debugIsCurrentlyTiming = false;\n var warning$$1 = 'An error was thrown inside this error boundary';\n endFiberMark(fiber, null, warning$$1);\n }\n}\n\nfunction startPhaseTimer(fiber, phase) {\n if (enableUserTimingAPI) {\n if (!supportsUserTiming) {\n return;\n }\n clearPendingPhaseMeasurement();\n if (!beginFiberMark(fiber, phase)) {\n return;\n }\n currentPhaseFiber = fiber;\n currentPhase = phase;\n }\n}\n\nfunction stopPhaseTimer() {\n if (enableUserTimingAPI) {\n if (!supportsUserTiming) {\n return;\n }\n if (currentPhase !== null && currentPhaseFiber !== null) {\n var warning$$1 = hasScheduledUpdateInCurrentPhase ? 'Scheduled a cascading update' : null;\n endFiberMark(currentPhaseFiber, currentPhase, warning$$1);\n }\n currentPhase = null;\n currentPhaseFiber = null;\n }\n}\n\nfunction startWorkLoopTimer(nextUnitOfWork) {\n if (enableUserTimingAPI) {\n currentFiber = nextUnitOfWork;\n if (!supportsUserTiming) {\n return;\n }\n commitCountInCurrentWorkLoop = 0;\n // This is top level call.\n // Any other measurements are performed within.\n beginMark('(React Tree Reconciliation)');\n // Resume any measurements that were in progress during the last loop.\n resumeTimers();\n }\n}\n\nfunction stopWorkLoopTimer(interruptedBy) {\n if (enableUserTimingAPI) {\n if (!supportsUserTiming) {\n return;\n }\n var warning$$1 = null;\n if (interruptedBy !== null) {\n if (interruptedBy.tag === HostRoot) {\n warning$$1 = 'A top-level update interrupted the previous render';\n } else {\n var componentName = getComponentName(interruptedBy) || 'Unknown';\n warning$$1 = 'An update to ' + componentName + ' interrupted the previous render';\n }\n } else if (commitCountInCurrentWorkLoop > 1) {\n warning$$1 = 'There were cascading updates';\n }\n commitCountInCurrentWorkLoop = 0;\n // Pause any measurements until the next loop.\n pauseTimers();\n endMark('(React Tree Reconciliation)', '(React Tree Reconciliation)', warning$$1);\n }\n}\n\nfunction startCommitTimer() {\n if (enableUserTimingAPI) {\n if (!supportsUserTiming) {\n return;\n }\n isCommitting = true;\n hasScheduledUpdateInCurrentCommit = false;\n labelsInCurrentCommit.clear();\n beginMark('(Committing Changes)');\n }\n}\n\nfunction stopCommitTimer() {\n if (enableUserTimingAPI) {\n if (!supportsUserTiming) {\n return;\n }\n\n var warning$$1 = null;\n if (hasScheduledUpdateInCurrentCommit) {\n warning$$1 = 'Lifecycle hook scheduled a cascading update';\n } else if (commitCountInCurrentWorkLoop > 0) {\n warning$$1 = 'Caused by a cascading update in earlier commit';\n }\n hasScheduledUpdateInCurrentCommit = false;\n commitCountInCurrentWorkLoop++;\n isCommitting = false;\n labelsInCurrentCommit.clear();\n\n endMark('(Committing Changes)', '(Committing Changes)', warning$$1);\n }\n}\n\nfunction startCommitHostEffectsTimer() {\n if (enableUserTimingAPI) {\n if (!supportsUserTiming) {\n return;\n }\n effectCountInCurrentCommit = 0;\n beginMark('(Committing Host Effects)');\n }\n}\n\nfunction stopCommitHostEffectsTimer() {\n if (enableUserTimingAPI) {\n if (!supportsUserTiming) {\n return;\n }\n var count = effectCountInCurrentCommit;\n effectCountInCurrentCommit = 0;\n endMark('(Committing Host Effects: ' + count + ' Total)', '(Committing Host Effects)', null);\n }\n}\n\nfunction startCommitLifeCyclesTimer() {\n if (enableUserTimingAPI) {\n if (!supportsUserTiming) {\n return;\n }\n effectCountInCurrentCommit = 0;\n beginMark('(Calling Lifecycle Methods)');\n }\n}\n\nfunction stopCommitLifeCyclesTimer() {\n if (enableUserTimingAPI) {\n if (!supportsUserTiming) {\n return;\n }\n var count = effectCountInCurrentCommit;\n effectCountInCurrentCommit = 0;\n endMark('(Calling Lifecycle Methods: ' + count + ' Total)', '(Calling Lifecycle Methods)', null);\n }\n}\n\n{\n var warnedAboutMissingGetChildContext = {};\n}\n\n// A cursor to the current merged context object on the stack.\nvar contextStackCursor = createCursor(emptyObject);\n// A cursor to a boolean indicating whether the context has changed.\nvar didPerformWorkStackCursor = createCursor(false);\n// Keep track of the previous context object that was on the stack.\n// We use this to get access to the parent context after we have already\n// pushed the next context provider, and now need to merge their contexts.\nvar previousContext = emptyObject;\n\nfunction getUnmaskedContext(workInProgress) {\n var hasOwnContext = isContextProvider(workInProgress);\n if (hasOwnContext) {\n // If the fiber is a context provider itself, when we read its context\n // we have already pushed its own child context on the stack. A context\n // provider should not \"see\" its own child context. Therefore we read the\n // previous (parent) context instead for a context provider.\n return previousContext;\n }\n return contextStackCursor.current;\n}\n\nfunction cacheContext(workInProgress, unmaskedContext, maskedContext) {\n var instance = workInProgress.stateNode;\n instance.__reactInternalMemoizedUnmaskedChildContext = unmaskedContext;\n instance.__reactInternalMemoizedMaskedChildContext = maskedContext;\n}\n\nfunction getMaskedContext(workInProgress, unmaskedContext) {\n var type = workInProgress.type;\n var contextTypes = type.contextTypes;\n if (!contextTypes) {\n return emptyObject;\n }\n\n // Avoid recreating masked context unless unmasked context has changed.\n // Failing to do this will result in unnecessary calls to componentWillReceiveProps.\n // This may trigger infinite loops if componentWillReceiveProps calls setState.\n var instance = workInProgress.stateNode;\n if (instance && instance.__reactInternalMemoizedUnmaskedChildContext === unmaskedContext) {\n return instance.__reactInternalMemoizedMaskedChildContext;\n }\n\n var context = {};\n for (var key in contextTypes) {\n context[key] = unmaskedContext[key];\n }\n\n {\n var name = getComponentName(workInProgress) || 'Unknown';\n checkPropTypes(contextTypes, context, 'context', name, ReactDebugCurrentFiber.getCurrentFiberStackAddendum);\n }\n\n // Cache unmasked context so we can avoid recreating masked context unless necessary.\n // Context is created before the class component is instantiated so check for instance.\n if (instance) {\n cacheContext(workInProgress, unmaskedContext, context);\n }\n\n return context;\n}\n\nfunction hasContextChanged() {\n return didPerformWorkStackCursor.current;\n}\n\nfunction isContextConsumer(fiber) {\n return fiber.tag === ClassComponent && fiber.type.contextTypes != null;\n}\n\nfunction isContextProvider(fiber) {\n return fiber.tag === ClassComponent && fiber.type.childContextTypes != null;\n}\n\nfunction popContextProvider(fiber) {\n if (!isContextProvider(fiber)) {\n return;\n }\n\n pop(didPerformWorkStackCursor, fiber);\n pop(contextStackCursor, fiber);\n}\n\nfunction popTopLevelContextObject(fiber) {\n pop(didPerformWorkStackCursor, fiber);\n pop(contextStackCursor, fiber);\n}\n\nfunction pushTopLevelContextObject(fiber, context, didChange) {\n !(contextStackCursor.cursor == null) ? invariant(false, 'Unexpected context found on stack. This error is likely caused by a bug in React. Please file an issue.') : void 0;\n\n push(contextStackCursor, context, fiber);\n push(didPerformWorkStackCursor, didChange, fiber);\n}\n\nfunction processChildContext(fiber, parentContext) {\n var instance = fiber.stateNode;\n var childContextTypes = fiber.type.childContextTypes;\n\n // TODO (bvaughn) Replace this behavior with an invariant() in the future.\n // It has only been added in Fiber to match the (unintentional) behavior in Stack.\n if (typeof instance.getChildContext !== 'function') {\n {\n var componentName = getComponentName(fiber) || 'Unknown';\n\n if (!warnedAboutMissingGetChildContext[componentName]) {\n warnedAboutMissingGetChildContext[componentName] = true;\n warning(false, '%s.childContextTypes is specified but there is no getChildContext() method ' + 'on the instance. You can either define getChildContext() on %s or remove ' + 'childContextTypes from it.', componentName, componentName);\n }\n }\n return parentContext;\n }\n\n var childContext = void 0;\n {\n ReactDebugCurrentFiber.setCurrentPhase('getChildContext');\n }\n startPhaseTimer(fiber, 'getChildContext');\n childContext = instance.getChildContext();\n stopPhaseTimer();\n {\n ReactDebugCurrentFiber.setCurrentPhase(null);\n }\n for (var contextKey in childContext) {\n !(contextKey in childContextTypes) ? invariant(false, '%s.getChildContext(): key \"%s\" is not defined in childContextTypes.', getComponentName(fiber) || 'Unknown', contextKey) : void 0;\n }\n {\n var name = getComponentName(fiber) || 'Unknown';\n checkPropTypes(childContextTypes, childContext, 'child context', name,\n // In practice, there is one case in which we won't get a stack. It's when\n // somebody calls unstable_renderSubtreeIntoContainer() and we process\n // context from the parent component instance. The stack will be missing\n // because it's outside of the reconciliation, and so the pointer has not\n // been set. This is rare and doesn't matter. We'll also remove that API.\n ReactDebugCurrentFiber.getCurrentFiberStackAddendum);\n }\n\n return _assign({}, parentContext, childContext);\n}\n\nfunction pushContextProvider(workInProgress) {\n if (!isContextProvider(workInProgress)) {\n return false;\n }\n\n var instance = workInProgress.stateNode;\n // We push the context as early as possible to ensure stack integrity.\n // If the instance does not exist yet, we will push null at first,\n // and replace it on the stack later when invalidating the context.\n var memoizedMergedChildContext = instance && instance.__reactInternalMemoizedMergedChildContext || emptyObject;\n\n // Remember the parent context so we can merge with it later.\n // Inherit the parent's did-perform-work value to avoid inadvertently blocking updates.\n previousContext = contextStackCursor.current;\n push(contextStackCursor, memoizedMergedChildContext, workInProgress);\n push(didPerformWorkStackCursor, didPerformWorkStackCursor.current, workInProgress);\n\n return true;\n}\n\nfunction invalidateContextProvider(workInProgress, didChange) {\n var instance = workInProgress.stateNode;\n !instance ? invariant(false, 'Expected to have an instance by this point. This error is likely caused by a bug in React. Please file an issue.') : void 0;\n\n if (didChange) {\n // Merge parent and own context.\n // Skip this if we're not updating due to sCU.\n // This avoids unnecessarily recomputing memoized values.\n var mergedContext = processChildContext(workInProgress, previousContext);\n instance.__reactInternalMemoizedMergedChildContext = mergedContext;\n\n // Replace the old (or empty) context with the new one.\n // It is important to unwind the context in the reverse order.\n pop(didPerformWorkStackCursor, workInProgress);\n pop(contextStackCursor, workInProgress);\n // Now push the new context and mark that it has changed.\n push(contextStackCursor, mergedContext, workInProgress);\n push(didPerformWorkStackCursor, didChange, workInProgress);\n } else {\n pop(didPerformWorkStackCursor, workInProgress);\n push(didPerformWorkStackCursor, didChange, workInProgress);\n }\n}\n\nfunction resetContext() {\n previousContext = emptyObject;\n contextStackCursor.current = emptyObject;\n didPerformWorkStackCursor.current = false;\n}\n\nfunction findCurrentUnmaskedContext(fiber) {\n // Currently this is only used with renderSubtreeIntoContainer; not sure if it\n // makes sense elsewhere\n !(isFiberMounted(fiber) && fiber.tag === ClassComponent) ? invariant(false, 'Expected subtree parent to be a mounted class component. This error is likely caused by a bug in React. Please file an issue.') : void 0;\n\n var node = fiber;\n while (node.tag !== HostRoot) {\n if (isContextProvider(node)) {\n return node.stateNode.__reactInternalMemoizedMergedChildContext;\n }\n var parent = node['return'];\n !parent ? invariant(false, 'Found unexpected detached subtree parent. This error is likely caused by a bug in React. Please file an issue.') : void 0;\n node = parent;\n }\n return node.stateNode.context;\n}\n\nvar NoWork = 0; // TODO: Use an opaque type once ESLint et al support the syntax\n\nvar Sync = 1;\nvar Never = 2147483647; // Max int32: Math.pow(2, 31) - 1\n\nvar UNIT_SIZE = 10;\nvar MAGIC_NUMBER_OFFSET = 2;\n\n// 1 unit of expiration time represents 10ms.\nfunction msToExpirationTime(ms) {\n // Always add an offset so that we don't clash with the magic number for NoWork.\n return (ms / UNIT_SIZE | 0) + MAGIC_NUMBER_OFFSET;\n}\n\nfunction expirationTimeToMs(expirationTime) {\n return (expirationTime - MAGIC_NUMBER_OFFSET) * UNIT_SIZE;\n}\n\nfunction ceiling(num, precision) {\n return ((num / precision | 0) + 1) * precision;\n}\n\nfunction computeExpirationBucket(currentTime, expirationInMs, bucketSizeMs) {\n return ceiling(currentTime + expirationInMs / UNIT_SIZE, bucketSizeMs / UNIT_SIZE);\n}\n\nvar NoContext = 0;\nvar AsyncUpdates = 1;\n\n{\n var hasBadMapPolyfill = false;\n try {\n var nonExtensibleObject = Object.preventExtensions({});\n /* eslint-disable no-new */\n \n /* eslint-enable no-new */\n } catch (e) {\n // TODO: Consider warning about bad polyfills\n hasBadMapPolyfill = true;\n }\n}\n\n// A Fiber is work on a Component that needs to be done or was done. There can\n// be more than one per component.\n\n\n{\n var debugCounter = 1;\n}\n\nfunction FiberNode(tag, key, internalContextTag) {\n // Instance\n this.tag = tag;\n this.key = key;\n this.type = null;\n this.stateNode = null;\n\n // Fiber\n this['return'] = null;\n this.child = null;\n this.sibling = null;\n this.index = 0;\n\n this.ref = null;\n\n this.pendingProps = null;\n this.memoizedProps = null;\n this.updateQueue = null;\n this.memoizedState = null;\n\n this.internalContextTag = internalContextTag;\n\n // Effects\n this.effectTag = NoEffect;\n this.nextEffect = null;\n\n this.firstEffect = null;\n this.lastEffect = null;\n\n this.expirationTime = NoWork;\n\n this.alternate = null;\n\n {\n this._debugID = debugCounter++;\n this._debugSource = null;\n this._debugOwner = null;\n this._debugIsCurrentlyTiming = false;\n if (!hasBadMapPolyfill && typeof Object.preventExtensions === 'function') {\n Object.preventExtensions(this);\n }\n }\n}\n\n// This is a constructor function, rather than a POJO constructor, still\n// please ensure we do the following:\n// 1) Nobody should add any instance methods on this. Instance methods can be\n// more difficult to predict when they get optimized and they are almost\n// never inlined properly in static compilers.\n// 2) Nobody should rely on `instanceof Fiber` for type testing. We should\n// always know when it is a fiber.\n// 3) We might want to experiment with using numeric keys since they are easier\n// to optimize in a non-JIT environment.\n// 4) We can easily go from a constructor to a createFiber object literal if that\n// is faster.\n// 5) It should be easy to port this to a C struct and keep a C implementation\n// compatible.\nvar createFiber = function (tag, key, internalContextTag) {\n // $FlowFixMe: the shapes are exact here but Flow doesn't like constructors\n return new FiberNode(tag, key, internalContextTag);\n};\n\nfunction shouldConstruct(Component) {\n return !!(Component.prototype && Component.prototype.isReactComponent);\n}\n\n// This is used to create an alternate fiber to do work on.\nfunction createWorkInProgress(current, pendingProps, expirationTime) {\n var workInProgress = current.alternate;\n if (workInProgress === null) {\n // We use a double buffering pooling technique because we know that we'll\n // only ever need at most two versions of a tree. We pool the \"other\" unused\n // node that we're free to reuse. This is lazily created to avoid allocating\n // extra objects for things that are never updated. It also allow us to\n // reclaim the extra memory if needed.\n workInProgress = createFiber(current.tag, current.key, current.internalContextTag);\n workInProgress.type = current.type;\n workInProgress.stateNode = current.stateNode;\n\n {\n // DEV-only fields\n workInProgress._debugID = current._debugID;\n workInProgress._debugSource = current._debugSource;\n workInProgress._debugOwner = current._debugOwner;\n }\n\n workInProgress.alternate = current;\n current.alternate = workInProgress;\n } else {\n // We already have an alternate.\n // Reset the effect tag.\n workInProgress.effectTag = NoEffect;\n\n // The effect list is no longer valid.\n workInProgress.nextEffect = null;\n workInProgress.firstEffect = null;\n workInProgress.lastEffect = null;\n }\n\n workInProgress.expirationTime = expirationTime;\n workInProgress.pendingProps = pendingProps;\n\n workInProgress.child = current.child;\n workInProgress.memoizedProps = current.memoizedProps;\n workInProgress.memoizedState = current.memoizedState;\n workInProgress.updateQueue = current.updateQueue;\n\n // These will be overridden during the parent's reconciliation\n workInProgress.sibling = current.sibling;\n workInProgress.index = current.index;\n workInProgress.ref = current.ref;\n\n return workInProgress;\n}\n\nfunction createHostRootFiber() {\n var fiber = createFiber(HostRoot, null, NoContext);\n return fiber;\n}\n\nfunction createFiberFromElement(element, internalContextTag, expirationTime) {\n var owner = null;\n {\n owner = element._owner;\n }\n\n var fiber = void 0;\n var type = element.type,\n key = element.key;\n\n if (typeof type === 'function') {\n fiber = shouldConstruct(type) ? createFiber(ClassComponent, key, internalContextTag) : createFiber(IndeterminateComponent, key, internalContextTag);\n fiber.type = type;\n fiber.pendingProps = element.props;\n } else if (typeof type === 'string') {\n fiber = createFiber(HostComponent, key, internalContextTag);\n fiber.type = type;\n fiber.pendingProps = element.props;\n } else if (typeof type === 'object' && type !== null && typeof type.tag === 'number') {\n // Currently assumed to be a continuation and therefore is a fiber already.\n // TODO: The yield system is currently broken for updates in some cases.\n // The reified yield stores a fiber, but we don't know which fiber that is;\n // the current or a workInProgress? When the continuation gets rendered here\n // we don't know if we can reuse that fiber or if we need to clone it.\n // There is probably a clever way to restructure this.\n fiber = type;\n fiber.pendingProps = element.props;\n } else {\n var info = '';\n {\n if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {\n info += ' You likely forgot to export your component from the file ' + \"it's defined in, or you might have mixed up default and named imports.\";\n }\n var ownerName = owner ? getComponentName(owner) : null;\n if (ownerName) {\n info += '\\n\\nCheck the render method of `' + ownerName + '`.';\n }\n }\n invariant(false, 'Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s', type == null ? type : typeof type, info);\n }\n\n {\n fiber._debugSource = element._source;\n fiber._debugOwner = element._owner;\n }\n\n fiber.expirationTime = expirationTime;\n\n return fiber;\n}\n\nfunction createFiberFromFragment(elements, internalContextTag, expirationTime, key) {\n var fiber = createFiber(Fragment, key, internalContextTag);\n fiber.pendingProps = elements;\n fiber.expirationTime = expirationTime;\n return fiber;\n}\n\nfunction createFiberFromText(content, internalContextTag, expirationTime) {\n var fiber = createFiber(HostText, null, internalContextTag);\n fiber.pendingProps = content;\n fiber.expirationTime = expirationTime;\n return fiber;\n}\n\nfunction createFiberFromHostInstanceForDeletion() {\n var fiber = createFiber(HostComponent, null, NoContext);\n fiber.type = 'DELETED';\n return fiber;\n}\n\nfunction createFiberFromCall(call, internalContextTag, expirationTime) {\n var fiber = createFiber(CallComponent, call.key, internalContextTag);\n fiber.type = call.handler;\n fiber.pendingProps = call;\n fiber.expirationTime = expirationTime;\n return fiber;\n}\n\nfunction createFiberFromReturn(returnNode, internalContextTag, expirationTime) {\n var fiber = createFiber(ReturnComponent, null, internalContextTag);\n fiber.expirationTime = expirationTime;\n return fiber;\n}\n\nfunction createFiberFromPortal(portal, internalContextTag, expirationTime) {\n var fiber = createFiber(HostPortal, portal.key, internalContextTag);\n fiber.pendingProps = portal.children || [];\n fiber.expirationTime = expirationTime;\n fiber.stateNode = {\n containerInfo: portal.containerInfo,\n pendingChildren: null, // Used by persistent updates\n implementation: portal.implementation\n };\n return fiber;\n}\n\nfunction createFiberRoot(containerInfo, hydrate) {\n // Cyclic construction. This cheats the type system right now because\n // stateNode is any.\n var uninitializedFiber = createHostRootFiber();\n var root = {\n current: uninitializedFiber,\n containerInfo: containerInfo,\n pendingChildren: null,\n remainingExpirationTime: NoWork,\n isReadyForCommit: false,\n finishedWork: null,\n context: null,\n pendingContext: null,\n hydrate: hydrate,\n nextScheduledRoot: null\n };\n uninitializedFiber.stateNode = root;\n return root;\n}\n\nvar onCommitFiberRoot = null;\nvar onCommitFiberUnmount = null;\nvar hasLoggedError = false;\n\nfunction catchErrors(fn) {\n return function (arg) {\n try {\n return fn(arg);\n } catch (err) {\n if (true && !hasLoggedError) {\n hasLoggedError = true;\n warning(false, 'React DevTools encountered an error: %s', err);\n }\n }\n };\n}\n\nfunction injectInternals(internals) {\n if (typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined') {\n // No DevTools\n return false;\n }\n var hook = __REACT_DEVTOOLS_GLOBAL_HOOK__;\n if (hook.isDisabled) {\n // This isn't a real property on the hook, but it can be set to opt out\n // of DevTools integration and associated warnings and logs.\n // https://github.com/facebook/react/issues/3877\n return true;\n }\n if (!hook.supportsFiber) {\n {\n warning(false, 'The installed version of React DevTools is too old and will not work ' + 'with the current version of React. Please update React DevTools. ' + 'https://fb.me/react-devtools');\n }\n // DevTools exists, even though it doesn't support Fiber.\n return true;\n }\n try {\n var rendererID = hook.inject(internals);\n // We have successfully injected, so now it is safe to set up hooks.\n onCommitFiberRoot = catchErrors(function (root) {\n return hook.onCommitFiberRoot(rendererID, root);\n });\n onCommitFiberUnmount = catchErrors(function (fiber) {\n return hook.onCommitFiberUnmount(rendererID, fiber);\n });\n } catch (err) {\n // Catch all errors because it is unsafe to throw during initialization.\n {\n warning(false, 'React DevTools encountered an error: %s.', err);\n }\n }\n // DevTools exists\n return true;\n}\n\nfunction onCommitRoot(root) {\n if (typeof onCommitFiberRoot === 'function') {\n onCommitFiberRoot(root);\n }\n}\n\nfunction onCommitUnmount(fiber) {\n if (typeof onCommitFiberUnmount === 'function') {\n onCommitFiberUnmount(fiber);\n }\n}\n\n{\n var didWarnUpdateInsideUpdate = false;\n}\n\n// Callbacks are not validated until invocation\n\n\n// Singly linked-list of updates. When an update is scheduled, it is added to\n// the queue of the current fiber and the work-in-progress fiber. The two queues\n// are separate but they share a persistent structure.\n//\n// During reconciliation, updates are removed from the work-in-progress fiber,\n// but they remain on the current fiber. That ensures that if a work-in-progress\n// is aborted, the aborted updates are recovered by cloning from current.\n//\n// The work-in-progress queue is always a subset of the current queue.\n//\n// When the tree is committed, the work-in-progress becomes the current.\n\n\nfunction createUpdateQueue(baseState) {\n var queue = {\n baseState: baseState,\n expirationTime: NoWork,\n first: null,\n last: null,\n callbackList: null,\n hasForceUpdate: false,\n isInitialized: false\n };\n {\n queue.isProcessing = false;\n }\n return queue;\n}\n\nfunction insertUpdateIntoQueue(queue, update) {\n // Append the update to the end of the list.\n if (queue.last === null) {\n // Queue is empty\n queue.first = queue.last = update;\n } else {\n queue.last.next = update;\n queue.last = update;\n }\n if (queue.expirationTime === NoWork || queue.expirationTime > update.expirationTime) {\n queue.expirationTime = update.expirationTime;\n }\n}\n\nfunction insertUpdateIntoFiber(fiber, update) {\n // We'll have at least one and at most two distinct update queues.\n var alternateFiber = fiber.alternate;\n var queue1 = fiber.updateQueue;\n if (queue1 === null) {\n // TODO: We don't know what the base state will be until we begin work.\n // It depends on which fiber is the next current. Initialize with an empty\n // base state, then set to the memoizedState when rendering. Not super\n // happy with this approach.\n queue1 = fiber.updateQueue = createUpdateQueue(null);\n }\n\n var queue2 = void 0;\n if (alternateFiber !== null) {\n queue2 = alternateFiber.updateQueue;\n if (queue2 === null) {\n queue2 = alternateFiber.updateQueue = createUpdateQueue(null);\n }\n } else {\n queue2 = null;\n }\n queue2 = queue2 !== queue1 ? queue2 : null;\n\n // Warn if an update is scheduled from inside an updater function.\n {\n if ((queue1.isProcessing || queue2 !== null && queue2.isProcessing) && !didWarnUpdateInsideUpdate) {\n warning(false, 'An update (setState, replaceState, or forceUpdate) was scheduled ' + 'from inside an update function. Update functions should be pure, ' + 'with zero side-effects. Consider using componentDidUpdate or a ' + 'callback.');\n didWarnUpdateInsideUpdate = true;\n }\n }\n\n // If there's only one queue, add the update to that queue and exit.\n if (queue2 === null) {\n insertUpdateIntoQueue(queue1, update);\n return;\n }\n\n // If either queue is empty, we need to add to both queues.\n if (queue1.last === null || queue2.last === null) {\n insertUpdateIntoQueue(queue1, update);\n insertUpdateIntoQueue(queue2, update);\n return;\n }\n\n // If both lists are not empty, the last update is the same for both lists\n // because of structural sharing. So, we should only append to one of\n // the lists.\n insertUpdateIntoQueue(queue1, update);\n // But we still need to update the `last` pointer of queue2.\n queue2.last = update;\n}\n\nfunction getUpdateExpirationTime(fiber) {\n if (fiber.tag !== ClassComponent && fiber.tag !== HostRoot) {\n return NoWork;\n }\n var updateQueue = fiber.updateQueue;\n if (updateQueue === null) {\n return NoWork;\n }\n return updateQueue.expirationTime;\n}\n\nfunction getStateFromUpdate(update, instance, prevState, props) {\n var partialState = update.partialState;\n if (typeof partialState === 'function') {\n var updateFn = partialState;\n\n // Invoke setState callback an extra time to help detect side-effects.\n if (debugRenderPhaseSideEffects) {\n updateFn.call(instance, prevState, props);\n }\n\n return updateFn.call(instance, prevState, props);\n } else {\n return partialState;\n }\n}\n\nfunction processUpdateQueue(current, workInProgress, queue, instance, props, renderExpirationTime) {\n if (current !== null && current.updateQueue === queue) {\n // We need to create a work-in-progress queue, by cloning the current queue.\n var currentQueue = queue;\n queue = workInProgress.updateQueue = {\n baseState: currentQueue.baseState,\n expirationTime: currentQueue.expirationTime,\n first: currentQueue.first,\n last: currentQueue.last,\n isInitialized: currentQueue.isInitialized,\n // These fields are no longer valid because they were already committed.\n // Reset them.\n callbackList: null,\n hasForceUpdate: false\n };\n }\n\n {\n // Set this flag so we can warn if setState is called inside the update\n // function of another setState.\n queue.isProcessing = true;\n }\n\n // Reset the remaining expiration time. If we skip over any updates, we'll\n // increase this accordingly.\n queue.expirationTime = NoWork;\n\n // TODO: We don't know what the base state will be until we begin work.\n // It depends on which fiber is the next current. Initialize with an empty\n // base state, then set to the memoizedState when rendering. Not super\n // happy with this approach.\n var state = void 0;\n if (queue.isInitialized) {\n state = queue.baseState;\n } else {\n state = queue.baseState = workInProgress.memoizedState;\n queue.isInitialized = true;\n }\n var dontMutatePrevState = true;\n var update = queue.first;\n var didSkip = false;\n while (update !== null) {\n var updateExpirationTime = update.expirationTime;\n if (updateExpirationTime > renderExpirationTime) {\n // This update does not have sufficient priority. Skip it.\n var remainingExpirationTime = queue.expirationTime;\n if (remainingExpirationTime === NoWork || remainingExpirationTime > updateExpirationTime) {\n // Update the remaining expiration time.\n queue.expirationTime = updateExpirationTime;\n }\n if (!didSkip) {\n didSkip = true;\n queue.baseState = state;\n }\n // Continue to the next update.\n update = update.next;\n continue;\n }\n\n // This update does have sufficient priority.\n\n // If no previous updates were skipped, drop this update from the queue by\n // advancing the head of the list.\n if (!didSkip) {\n queue.first = update.next;\n if (queue.first === null) {\n queue.last = null;\n }\n }\n\n // Process the update\n var _partialState = void 0;\n if (update.isReplace) {\n state = getStateFromUpdate(update, instance, state, props);\n dontMutatePrevState = true;\n } else {\n _partialState = getStateFromUpdate(update, instance, state, props);\n if (_partialState) {\n if (dontMutatePrevState) {\n // $FlowFixMe: Idk how to type this properly.\n state = _assign({}, state, _partialState);\n } else {\n state = _assign(state, _partialState);\n }\n dontMutatePrevState = false;\n }\n }\n if (update.isForced) {\n queue.hasForceUpdate = true;\n }\n if (update.callback !== null) {\n // Append to list of callbacks.\n var _callbackList = queue.callbackList;\n if (_callbackList === null) {\n _callbackList = queue.callbackList = [];\n }\n _callbackList.push(update);\n }\n update = update.next;\n }\n\n if (queue.callbackList !== null) {\n workInProgress.effectTag |= Callback;\n } else if (queue.first === null && !queue.hasForceUpdate) {\n // The queue is empty. We can reset it.\n workInProgress.updateQueue = null;\n }\n\n if (!didSkip) {\n didSkip = true;\n queue.baseState = state;\n }\n\n {\n // No longer processing.\n queue.isProcessing = false;\n }\n\n return state;\n}\n\nfunction commitCallbacks(queue, context) {\n var callbackList = queue.callbackList;\n if (callbackList === null) {\n return;\n }\n // Set the list to null to make sure they don't get called more than once.\n queue.callbackList = null;\n for (var i = 0; i < callbackList.length; i++) {\n var update = callbackList[i];\n var _callback = update.callback;\n // This update might be processed again. Clear the callback so it's only\n // called once.\n update.callback = null;\n !(typeof _callback === 'function') ? invariant(false, 'Invalid argument passed as callback. Expected a function. Instead received: %s', _callback) : void 0;\n _callback.call(context);\n }\n}\n\nvar fakeInternalInstance = {};\nvar isArray = Array.isArray;\n\n{\n var didWarnAboutStateAssignmentForComponent = {};\n\n var warnOnInvalidCallback = function (callback, callerName) {\n warning(callback === null || typeof callback === 'function', '%s(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callerName, callback);\n };\n\n // This is so gross but it's at least non-critical and can be removed if\n // it causes problems. This is meant to give a nicer error message for\n // ReactDOM15.unstable_renderSubtreeIntoContainer(reactDOM16Component,\n // ...)) which otherwise throws a \"_processChildContext is not a function\"\n // exception.\n Object.defineProperty(fakeInternalInstance, '_processChildContext', {\n enumerable: false,\n value: function () {\n invariant(false, '_processChildContext is not available in React 16+. This likely means you have multiple copies of React and are attempting to nest a React 15 tree inside a React 16 tree using unstable_renderSubtreeIntoContainer, which isn\\'t supported. Try to make sure you have only one copy of React (and ideally, switch to ReactDOM.createPortal).');\n }\n });\n Object.freeze(fakeInternalInstance);\n}\n\nvar ReactFiberClassComponent = function (scheduleWork, computeExpirationForFiber, memoizeProps, memoizeState) {\n // Class component state updater\n var updater = {\n isMounted: isMounted,\n enqueueSetState: function (instance, partialState, callback) {\n var fiber = get(instance);\n callback = callback === undefined ? null : callback;\n {\n warnOnInvalidCallback(callback, 'setState');\n }\n var expirationTime = computeExpirationForFiber(fiber);\n var update = {\n expirationTime: expirationTime,\n partialState: partialState,\n callback: callback,\n isReplace: false,\n isForced: false,\n nextCallback: null,\n next: null\n };\n insertUpdateIntoFiber(fiber, update);\n scheduleWork(fiber, expirationTime);\n },\n enqueueReplaceState: function (instance, state, callback) {\n var fiber = get(instance);\n callback = callback === undefined ? null : callback;\n {\n warnOnInvalidCallback(callback, 'replaceState');\n }\n var expirationTime = computeExpirationForFiber(fiber);\n var update = {\n expirationTime: expirationTime,\n partialState: state,\n callback: callback,\n isReplace: true,\n isForced: false,\n nextCallback: null,\n next: null\n };\n insertUpdateIntoFiber(fiber, update);\n scheduleWork(fiber, expirationTime);\n },\n enqueueForceUpdate: function (instance, callback) {\n var fiber = get(instance);\n callback = callback === undefined ? null : callback;\n {\n warnOnInvalidCallback(callback, 'forceUpdate');\n }\n var expirationTime = computeExpirationForFiber(fiber);\n var update = {\n expirationTime: expirationTime,\n partialState: null,\n callback: callback,\n isReplace: false,\n isForced: true,\n nextCallback: null,\n next: null\n };\n insertUpdateIntoFiber(fiber, update);\n scheduleWork(fiber, expirationTime);\n }\n };\n\n function checkShouldComponentUpdate(workInProgress, oldProps, newProps, oldState, newState, newContext) {\n if (oldProps === null || workInProgress.updateQueue !== null && workInProgress.updateQueue.hasForceUpdate) {\n // If the workInProgress already has an Update effect, return true\n return true;\n }\n\n var instance = workInProgress.stateNode;\n var type = workInProgress.type;\n if (typeof instance.shouldComponentUpdate === 'function') {\n startPhaseTimer(workInProgress, 'shouldComponentUpdate');\n var shouldUpdate = instance.shouldComponentUpdate(newProps, newState, newContext);\n stopPhaseTimer();\n\n // Simulate an async bailout/interruption by invoking lifecycle twice.\n if (debugRenderPhaseSideEffects) {\n instance.shouldComponentUpdate(newProps, newState, newContext);\n }\n\n {\n warning(shouldUpdate !== undefined, '%s.shouldComponentUpdate(): Returned undefined instead of a ' + 'boolean value. Make sure to return true or false.', getComponentName(workInProgress) || 'Unknown');\n }\n\n return shouldUpdate;\n }\n\n if (type.prototype && type.prototype.isPureReactComponent) {\n return !shallowEqual(oldProps, newProps) || !shallowEqual(oldState, newState);\n }\n\n return true;\n }\n\n function checkClassInstance(workInProgress) {\n var instance = workInProgress.stateNode;\n var type = workInProgress.type;\n {\n var name = getComponentName(workInProgress);\n var renderPresent = instance.render;\n\n if (!renderPresent) {\n if (type.prototype && typeof type.prototype.render === 'function') {\n warning(false, '%s(...): No `render` method found on the returned component ' + 'instance: did you accidentally return an object from the constructor?', name);\n } else {\n warning(false, '%s(...): No `render` method found on the returned component ' + 'instance: you may have forgotten to define `render`.', name);\n }\n }\n\n var noGetInitialStateOnES6 = !instance.getInitialState || instance.getInitialState.isReactClassApproved || instance.state;\n warning(noGetInitialStateOnES6, 'getInitialState was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Did you mean to define a state property instead?', name);\n var noGetDefaultPropsOnES6 = !instance.getDefaultProps || instance.getDefaultProps.isReactClassApproved;\n warning(noGetDefaultPropsOnES6, 'getDefaultProps was defined on %s, a plain JavaScript class. ' + 'This is only supported for classes created using React.createClass. ' + 'Use a static property to define defaultProps instead.', name);\n var noInstancePropTypes = !instance.propTypes;\n warning(noInstancePropTypes, 'propTypes was defined as an instance property on %s. Use a static ' + 'property to define propTypes instead.', name);\n var noInstanceContextTypes = !instance.contextTypes;\n warning(noInstanceContextTypes, 'contextTypes was defined as an instance property on %s. Use a static ' + 'property to define contextTypes instead.', name);\n var noComponentShouldUpdate = typeof instance.componentShouldUpdate !== 'function';\n warning(noComponentShouldUpdate, '%s has a method called ' + 'componentShouldUpdate(). Did you mean shouldComponentUpdate()? ' + 'The name is phrased as a question because the function is ' + 'expected to return a value.', name);\n if (type.prototype && type.prototype.isPureReactComponent && typeof instance.shouldComponentUpdate !== 'undefined') {\n warning(false, '%s has a method called shouldComponentUpdate(). ' + 'shouldComponentUpdate should not be used when extending React.PureComponent. ' + 'Please extend React.Component if shouldComponentUpdate is used.', getComponentName(workInProgress) || 'A pure component');\n }\n var noComponentDidUnmount = typeof instance.componentDidUnmount !== 'function';\n warning(noComponentDidUnmount, '%s has a method called ' + 'componentDidUnmount(). But there is no such lifecycle method. ' + 'Did you mean componentWillUnmount()?', name);\n var noComponentDidReceiveProps = typeof instance.componentDidReceiveProps !== 'function';\n warning(noComponentDidReceiveProps, '%s has a method called ' + 'componentDidReceiveProps(). But there is no such lifecycle method. ' + 'If you meant to update the state in response to changing props, ' + 'use componentWillReceiveProps(). If you meant to fetch data or ' + 'run side-effects or mutations after React has updated the UI, use componentDidUpdate().', name);\n var noComponentWillRecieveProps = typeof instance.componentWillRecieveProps !== 'function';\n warning(noComponentWillRecieveProps, '%s has a method called ' + 'componentWillRecieveProps(). Did you mean componentWillReceiveProps()?', name);\n var hasMutatedProps = instance.props !== workInProgress.pendingProps;\n warning(instance.props === undefined || !hasMutatedProps, '%s(...): When calling super() in `%s`, make sure to pass ' + \"up the same props that your component's constructor was passed.\", name, name);\n var noInstanceDefaultProps = !instance.defaultProps;\n warning(noInstanceDefaultProps, 'Setting defaultProps as an instance property on %s is not supported and will be ignored.' + ' Instead, define defaultProps as a static property on %s.', name, name);\n }\n\n var state = instance.state;\n if (state && (typeof state !== 'object' || isArray(state))) {\n warning(false, '%s.state: must be set to an object or null', getComponentName(workInProgress));\n }\n if (typeof instance.getChildContext === 'function') {\n warning(typeof workInProgress.type.childContextTypes === 'object', '%s.getChildContext(): childContextTypes must be defined in order to ' + 'use getChildContext().', getComponentName(workInProgress));\n }\n }\n\n function resetInputPointers(workInProgress, instance) {\n instance.props = workInProgress.memoizedProps;\n instance.state = workInProgress.memoizedState;\n }\n\n function adoptClassInstance(workInProgress, instance) {\n instance.updater = updater;\n workInProgress.stateNode = instance;\n // The instance needs access to the fiber so that it can schedule updates\n set(instance, workInProgress);\n {\n instance._reactInternalInstance = fakeInternalInstance;\n }\n }\n\n function constructClassInstance(workInProgress, props) {\n var ctor = workInProgress.type;\n var unmaskedContext = getUnmaskedContext(workInProgress);\n var needsContext = isContextConsumer(workInProgress);\n var context = needsContext ? getMaskedContext(workInProgress, unmaskedContext) : emptyObject;\n var instance = new ctor(props, context);\n adoptClassInstance(workInProgress, instance);\n\n // Cache unmasked context so we can avoid recreating masked context unless necessary.\n // ReactFiberContext usually updates this cache but can't for newly-created instances.\n if (needsContext) {\n cacheContext(workInProgress, unmaskedContext, context);\n }\n\n return instance;\n }\n\n function callComponentWillMount(workInProgress, instance) {\n startPhaseTimer(workInProgress, 'componentWillMount');\n var oldState = instance.state;\n instance.componentWillMount();\n stopPhaseTimer();\n\n // Simulate an async bailout/interruption by invoking lifecycle twice.\n if (debugRenderPhaseSideEffects) {\n instance.componentWillMount();\n }\n\n if (oldState !== instance.state) {\n {\n warning(false, '%s.componentWillMount(): Assigning directly to this.state is ' + \"deprecated (except inside a component's \" + 'constructor). Use setState instead.', getComponentName(workInProgress));\n }\n updater.enqueueReplaceState(instance, instance.state, null);\n }\n }\n\n function callComponentWillReceiveProps(workInProgress, instance, newProps, newContext) {\n startPhaseTimer(workInProgress, 'componentWillReceiveProps');\n var oldState = instance.state;\n instance.componentWillReceiveProps(newProps, newContext);\n stopPhaseTimer();\n\n // Simulate an async bailout/interruption by invoking lifecycle twice.\n if (debugRenderPhaseSideEffects) {\n instance.componentWillReceiveProps(newProps, newContext);\n }\n\n if (instance.state !== oldState) {\n {\n var componentName = getComponentName(workInProgress) || 'Component';\n if (!didWarnAboutStateAssignmentForComponent[componentName]) {\n warning(false, '%s.componentWillReceiveProps(): Assigning directly to ' + \"this.state is deprecated (except inside a component's \" + 'constructor). Use setState instead.', componentName);\n didWarnAboutStateAssignmentForComponent[componentName] = true;\n }\n }\n updater.enqueueReplaceState(instance, instance.state, null);\n }\n }\n\n // Invokes the mount life-cycles on a previously never rendered instance.\n function mountClassInstance(workInProgress, renderExpirationTime) {\n var current = workInProgress.alternate;\n\n {\n checkClassInstance(workInProgress);\n }\n\n var instance = workInProgress.stateNode;\n var state = instance.state || null;\n\n var props = workInProgress.pendingProps;\n !props ? invariant(false, 'There must be pending props for an initial mount. This error is likely caused by a bug in React. Please file an issue.') : void 0;\n\n var unmaskedContext = getUnmaskedContext(workInProgress);\n\n instance.props = props;\n instance.state = workInProgress.memoizedState = state;\n instance.refs = emptyObject;\n instance.context = getMaskedContext(workInProgress, unmaskedContext);\n\n if (enableAsyncSubtreeAPI && workInProgress.type != null && workInProgress.type.prototype != null && workInProgress.type.prototype.unstable_isAsyncReactComponent === true) {\n workInProgress.internalContextTag |= AsyncUpdates;\n }\n\n if (typeof instance.componentWillMount === 'function') {\n callComponentWillMount(workInProgress, instance);\n // If we had additional state updates during this life-cycle, let's\n // process them now.\n var updateQueue = workInProgress.updateQueue;\n if (updateQueue !== null) {\n instance.state = processUpdateQueue(current, workInProgress, updateQueue, instance, props, renderExpirationTime);\n }\n }\n if (typeof instance.componentDidMount === 'function') {\n workInProgress.effectTag |= Update;\n }\n }\n\n // Called on a preexisting class instance. Returns false if a resumed render\n // could be reused.\n // function resumeMountClassInstance(\n // workInProgress: Fiber,\n // priorityLevel: PriorityLevel,\n // ): boolean {\n // const instance = workInProgress.stateNode;\n // resetInputPointers(workInProgress, instance);\n\n // let newState = workInProgress.memoizedState;\n // let newProps = workInProgress.pendingProps;\n // if (!newProps) {\n // // If there isn't any new props, then we'll reuse the memoized props.\n // // This could be from already completed work.\n // newProps = workInProgress.memoizedProps;\n // invariant(\n // newProps != null,\n // 'There should always be pending or memoized props. This error is ' +\n // 'likely caused by a bug in React. Please file an issue.',\n // );\n // }\n // const newUnmaskedContext = getUnmaskedContext(workInProgress);\n // const newContext = getMaskedContext(workInProgress, newUnmaskedContext);\n\n // const oldContext = instance.context;\n // const oldProps = workInProgress.memoizedProps;\n\n // if (\n // typeof instance.componentWillReceiveProps === 'function' &&\n // (oldProps !== newProps || oldContext !== newContext)\n // ) {\n // callComponentWillReceiveProps(\n // workInProgress,\n // instance,\n // newProps,\n // newContext,\n // );\n // }\n\n // // Process the update queue before calling shouldComponentUpdate\n // const updateQueue = workInProgress.updateQueue;\n // if (updateQueue !== null) {\n // newState = processUpdateQueue(\n // workInProgress,\n // updateQueue,\n // instance,\n // newState,\n // newProps,\n // priorityLevel,\n // );\n // }\n\n // // TODO: Should we deal with a setState that happened after the last\n // // componentWillMount and before this componentWillMount? Probably\n // // unsupported anyway.\n\n // if (\n // !checkShouldComponentUpdate(\n // workInProgress,\n // workInProgress.memoizedProps,\n // newProps,\n // workInProgress.memoizedState,\n // newState,\n // newContext,\n // )\n // ) {\n // // Update the existing instance's state, props, and context pointers even\n // // though we're bailing out.\n // instance.props = newProps;\n // instance.state = newState;\n // instance.context = newContext;\n // return false;\n // }\n\n // // Update the input pointers now so that they are correct when we call\n // // componentWillMount\n // instance.props = newProps;\n // instance.state = newState;\n // instance.context = newContext;\n\n // if (typeof instance.componentWillMount === 'function') {\n // callComponentWillMount(workInProgress, instance);\n // // componentWillMount may have called setState. Process the update queue.\n // const newUpdateQueue = workInProgress.updateQueue;\n // if (newUpdateQueue !== null) {\n // newState = processUpdateQueue(\n // workInProgress,\n // newUpdateQueue,\n // instance,\n // newState,\n // newProps,\n // priorityLevel,\n // );\n // }\n // }\n\n // if (typeof instance.componentDidMount === 'function') {\n // workInProgress.effectTag |= Update;\n // }\n\n // instance.state = newState;\n\n // return true;\n // }\n\n // Invokes the update life-cycles and returns false if it shouldn't rerender.\n function updateClassInstance(current, workInProgress, renderExpirationTime) {\n var instance = workInProgress.stateNode;\n resetInputPointers(workInProgress, instance);\n\n var oldProps = workInProgress.memoizedProps;\n var newProps = workInProgress.pendingProps;\n if (!newProps) {\n // If there aren't any new props, then we'll reuse the memoized props.\n // This could be from already completed work.\n newProps = oldProps;\n !(newProps != null) ? invariant(false, 'There should always be pending or memoized props. This error is likely caused by a bug in React. Please file an issue.') : void 0;\n }\n var oldContext = instance.context;\n var newUnmaskedContext = getUnmaskedContext(workInProgress);\n var newContext = getMaskedContext(workInProgress, newUnmaskedContext);\n\n // Note: During these life-cycles, instance.props/instance.state are what\n // ever the previously attempted to render - not the \"current\". However,\n // during componentDidUpdate we pass the \"current\" props.\n\n if (typeof instance.componentWillReceiveProps === 'function' && (oldProps !== newProps || oldContext !== newContext)) {\n callComponentWillReceiveProps(workInProgress, instance, newProps, newContext);\n }\n\n // Compute the next state using the memoized state and the update queue.\n var oldState = workInProgress.memoizedState;\n // TODO: Previous state can be null.\n var newState = void 0;\n if (workInProgress.updateQueue !== null) {\n newState = processUpdateQueue(current, workInProgress, workInProgress.updateQueue, instance, newProps, renderExpirationTime);\n } else {\n newState = oldState;\n }\n\n if (oldProps === newProps && oldState === newState && !hasContextChanged() && !(workInProgress.updateQueue !== null && workInProgress.updateQueue.hasForceUpdate)) {\n // If an update was already in progress, we should schedule an Update\n // effect even though we're bailing out, so that cWU/cDU are called.\n if (typeof instance.componentDidUpdate === 'function') {\n if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {\n workInProgress.effectTag |= Update;\n }\n }\n return false;\n }\n\n var shouldUpdate = checkShouldComponentUpdate(workInProgress, oldProps, newProps, oldState, newState, newContext);\n\n if (shouldUpdate) {\n if (typeof instance.componentWillUpdate === 'function') {\n startPhaseTimer(workInProgress, 'componentWillUpdate');\n instance.componentWillUpdate(newProps, newState, newContext);\n stopPhaseTimer();\n\n // Simulate an async bailout/interruption by invoking lifecycle twice.\n if (debugRenderPhaseSideEffects) {\n instance.componentWillUpdate(newProps, newState, newContext);\n }\n }\n if (typeof instance.componentDidUpdate === 'function') {\n workInProgress.effectTag |= Update;\n }\n } else {\n // If an update was already in progress, we should schedule an Update\n // effect even though we're bailing out, so that cWU/cDU are called.\n if (typeof instance.componentDidUpdate === 'function') {\n if (oldProps !== current.memoizedProps || oldState !== current.memoizedState) {\n workInProgress.effectTag |= Update;\n }\n }\n\n // If shouldComponentUpdate returned false, we should still update the\n // memoized props/state to indicate that this work can be reused.\n memoizeProps(workInProgress, newProps);\n memoizeState(workInProgress, newState);\n }\n\n // Update the existing instance's state, props, and context pointers even\n // if shouldComponentUpdate returns false.\n instance.props = newProps;\n instance.state = newState;\n instance.context = newContext;\n\n return shouldUpdate;\n }\n\n return {\n adoptClassInstance: adoptClassInstance,\n constructClassInstance: constructClassInstance,\n mountClassInstance: mountClassInstance,\n // resumeMountClassInstance,\n updateClassInstance: updateClassInstance\n };\n};\n\n// The Symbol used to tag the ReactElement-like types. If there is no native Symbol\n// nor polyfill, then a plain number is used for performance.\nvar hasSymbol = typeof Symbol === 'function' && Symbol['for'];\n\nvar REACT_ELEMENT_TYPE = hasSymbol ? Symbol['for']('react.element') : 0xeac7;\nvar REACT_CALL_TYPE = hasSymbol ? Symbol['for']('react.call') : 0xeac8;\nvar REACT_RETURN_TYPE = hasSymbol ? Symbol['for']('react.return') : 0xeac9;\nvar REACT_PORTAL_TYPE = hasSymbol ? Symbol['for']('react.portal') : 0xeaca;\nvar REACT_FRAGMENT_TYPE = hasSymbol ? Symbol['for']('react.fragment') : 0xeacb;\n\nvar MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\nvar FAUX_ITERATOR_SYMBOL = '@@iterator';\n\nfunction getIteratorFn(maybeIterable) {\n if (maybeIterable === null || typeof maybeIterable === 'undefined') {\n return null;\n }\n var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];\n if (typeof maybeIterator === 'function') {\n return maybeIterator;\n }\n return null;\n}\n\nvar getCurrentFiberStackAddendum$1 = ReactDebugCurrentFiber.getCurrentFiberStackAddendum;\n\n\n{\n var didWarnAboutMaps = false;\n /**\n * Warn if there's no key explicitly set on dynamic arrays of children or\n * object keys are not valid. This allows us to keep track of children between\n * updates.\n */\n var ownerHasKeyUseWarning = {};\n var ownerHasFunctionTypeWarning = {};\n\n var warnForMissingKey = function (child) {\n if (child === null || typeof child !== 'object') {\n return;\n }\n if (!child._store || child._store.validated || child.key != null) {\n return;\n }\n !(typeof child._store === 'object') ? invariant(false, 'React Component in warnForMissingKey should have a _store. This error is likely caused by a bug in React. Please file an issue.') : void 0;\n child._store.validated = true;\n\n var currentComponentErrorInfo = 'Each child in an array or iterator should have a unique ' + '\"key\" prop. See https://fb.me/react-warning-keys for ' + 'more information.' + (getCurrentFiberStackAddendum$1() || '');\n if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {\n return;\n }\n ownerHasKeyUseWarning[currentComponentErrorInfo] = true;\n\n warning(false, 'Each child in an array or iterator should have a unique ' + '\"key\" prop. See https://fb.me/react-warning-keys for ' + 'more information.%s', getCurrentFiberStackAddendum$1());\n };\n}\n\nvar isArray$1 = Array.isArray;\n\nfunction coerceRef(current, element) {\n var mixedRef = element.ref;\n if (mixedRef !== null && typeof mixedRef !== 'function') {\n if (element._owner) {\n var owner = element._owner;\n var inst = void 0;\n if (owner) {\n var ownerFiber = owner;\n !(ownerFiber.tag === ClassComponent) ? invariant(false, 'Stateless function components cannot have refs.') : void 0;\n inst = ownerFiber.stateNode;\n }\n !inst ? invariant(false, 'Missing owner for string ref %s. This error is likely caused by a bug in React. Please file an issue.', mixedRef) : void 0;\n var stringRef = '' + mixedRef;\n // Check if previous string ref matches new string ref\n if (current !== null && current.ref !== null && current.ref._stringRef === stringRef) {\n return current.ref;\n }\n var ref = function (value) {\n var refs = inst.refs === emptyObject ? inst.refs = {} : inst.refs;\n if (value === null) {\n delete refs[stringRef];\n } else {\n refs[stringRef] = value;\n }\n };\n ref._stringRef = stringRef;\n return ref;\n } else {\n !(typeof mixedRef === 'string') ? invariant(false, 'Expected ref to be a function or a string.') : void 0;\n !element._owner ? invariant(false, 'Element ref was specified as a string (%s) but no owner was set. You may have multiple copies of React loaded. (details: https://fb.me/react-refs-must-have-owner).', mixedRef) : void 0;\n }\n }\n return mixedRef;\n}\n\nfunction throwOnInvalidObjectType(returnFiber, newChild) {\n if (returnFiber.type !== 'textarea') {\n var addendum = '';\n {\n addendum = ' If you meant to render a collection of children, use an array ' + 'instead.' + (getCurrentFiberStackAddendum$1() || '');\n }\n invariant(false, 'Objects are not valid as a React child (found: %s).%s', Object.prototype.toString.call(newChild) === '[object Object]' ? 'object with keys {' + Object.keys(newChild).join(', ') + '}' : newChild, addendum);\n }\n}\n\nfunction warnOnFunctionType() {\n var currentComponentErrorInfo = 'Functions are not valid as a React child. This may happen if ' + 'you return a Component instead of <Component /> from render. ' + 'Or maybe you meant to call this function rather than return it.' + (getCurrentFiberStackAddendum$1() || '');\n\n if (ownerHasFunctionTypeWarning[currentComponentErrorInfo]) {\n return;\n }\n ownerHasFunctionTypeWarning[currentComponentErrorInfo] = true;\n\n warning(false, 'Functions are not valid as a React child. This may happen if ' + 'you return a Component instead of <Component /> from render. ' + 'Or maybe you meant to call this function rather than return it.%s', getCurrentFiberStackAddendum$1() || '');\n}\n\n// This wrapper function exists because I expect to clone the code in each path\n// to be able to optimize each path individually by branching early. This needs\n// a compiler or we can do it manually. Helpers that don't need this branching\n// live outside of this function.\nfunction ChildReconciler(shouldTrackSideEffects) {\n function deleteChild(returnFiber, childToDelete) {\n if (!shouldTrackSideEffects) {\n // Noop.\n return;\n }\n // Deletions are added in reversed order so we add it to the front.\n // At this point, the return fiber's effect list is empty except for\n // deletions, so we can just append the deletion to the list. The remaining\n // effects aren't added until the complete phase. Once we implement\n // resuming, this may not be true.\n var last = returnFiber.lastEffect;\n if (last !== null) {\n last.nextEffect = childToDelete;\n returnFiber.lastEffect = childToDelete;\n } else {\n returnFiber.firstEffect = returnFiber.lastEffect = childToDelete;\n }\n childToDelete.nextEffect = null;\n childToDelete.effectTag = Deletion;\n }\n\n function deleteRemainingChildren(returnFiber, currentFirstChild) {\n if (!shouldTrackSideEffects) {\n // Noop.\n return null;\n }\n\n // TODO: For the shouldClone case, this could be micro-optimized a bit by\n // assuming that after the first child we've already added everything.\n var childToDelete = currentFirstChild;\n while (childToDelete !== null) {\n deleteChild(returnFiber, childToDelete);\n childToDelete = childToDelete.sibling;\n }\n return null;\n }\n\n function mapRemainingChildren(returnFiber, currentFirstChild) {\n // Add the remaining children to a temporary map so that we can find them by\n // keys quickly. Implicit (null) keys get added to this set with their index\n var existingChildren = new Map();\n\n var existingChild = currentFirstChild;\n while (existingChild !== null) {\n if (existingChild.key !== null) {\n existingChildren.set(existingChild.key, existingChild);\n } else {\n existingChildren.set(existingChild.index, existingChild);\n }\n existingChild = existingChild.sibling;\n }\n return existingChildren;\n }\n\n function useFiber(fiber, pendingProps, expirationTime) {\n // We currently set sibling to null and index to 0 here because it is easy\n // to forget to do before returning it. E.g. for the single child case.\n var clone = createWorkInProgress(fiber, pendingProps, expirationTime);\n clone.index = 0;\n clone.sibling = null;\n return clone;\n }\n\n function placeChild(newFiber, lastPlacedIndex, newIndex) {\n newFiber.index = newIndex;\n if (!shouldTrackSideEffects) {\n // Noop.\n return lastPlacedIndex;\n }\n var current = newFiber.alternate;\n if (current !== null) {\n var oldIndex = current.index;\n if (oldIndex < lastPlacedIndex) {\n // This is a move.\n newFiber.effectTag = Placement;\n return lastPlacedIndex;\n } else {\n // This item can stay in place.\n return oldIndex;\n }\n } else {\n // This is an insertion.\n newFiber.effectTag = Placement;\n return lastPlacedIndex;\n }\n }\n\n function placeSingleChild(newFiber) {\n // This is simpler for the single child case. We only need to do a\n // placement for inserting new children.\n if (shouldTrackSideEffects && newFiber.alternate === null) {\n newFiber.effectTag = Placement;\n }\n return newFiber;\n }\n\n function updateTextNode(returnFiber, current, textContent, expirationTime) {\n if (current === null || current.tag !== HostText) {\n // Insert\n var created = createFiberFromText(textContent, returnFiber.internalContextTag, expirationTime);\n created['return'] = returnFiber;\n return created;\n } else {\n // Update\n var existing = useFiber(current, textContent, expirationTime);\n existing['return'] = returnFiber;\n return existing;\n }\n }\n\n function updateElement(returnFiber, current, element, expirationTime) {\n if (current !== null && current.type === element.type) {\n // Move based on index\n var existing = useFiber(current, element.props, expirationTime);\n existing.ref = coerceRef(current, element);\n existing['return'] = returnFiber;\n {\n existing._debugSource = element._source;\n existing._debugOwner = element._owner;\n }\n return existing;\n } else {\n // Insert\n var created = createFiberFromElement(element, returnFiber.internalContextTag, expirationTime);\n created.ref = coerceRef(current, element);\n created['return'] = returnFiber;\n return created;\n }\n }\n\n function updateCall(returnFiber, current, call, expirationTime) {\n // TODO: Should this also compare handler to determine whether to reuse?\n if (current === null || current.tag !== CallComponent) {\n // Insert\n var created = createFiberFromCall(call, returnFiber.internalContextTag, expirationTime);\n created['return'] = returnFiber;\n return created;\n } else {\n // Move based on index\n var existing = useFiber(current, call, expirationTime);\n existing['return'] = returnFiber;\n return existing;\n }\n }\n\n function updateReturn(returnFiber, current, returnNode, expirationTime) {\n if (current === null || current.tag !== ReturnComponent) {\n // Insert\n var created = createFiberFromReturn(returnNode, returnFiber.internalContextTag, expirationTime);\n created.type = returnNode.value;\n created['return'] = returnFiber;\n return created;\n } else {\n // Move based on index\n var existing = useFiber(current, null, expirationTime);\n existing.type = returnNode.value;\n existing['return'] = returnFiber;\n return existing;\n }\n }\n\n function updatePortal(returnFiber, current, portal, expirationTime) {\n if (current === null || current.tag !== HostPortal || current.stateNode.containerInfo !== portal.containerInfo || current.stateNode.implementation !== portal.implementation) {\n // Insert\n var created = createFiberFromPortal(portal, returnFiber.internalContextTag, expirationTime);\n created['return'] = returnFiber;\n return created;\n } else {\n // Update\n var existing = useFiber(current, portal.children || [], expirationTime);\n existing['return'] = returnFiber;\n return existing;\n }\n }\n\n function updateFragment(returnFiber, current, fragment, expirationTime, key) {\n if (current === null || current.tag !== Fragment) {\n // Insert\n var created = createFiberFromFragment(fragment, returnFiber.internalContextTag, expirationTime, key);\n created['return'] = returnFiber;\n return created;\n } else {\n // Update\n var existing = useFiber(current, fragment, expirationTime);\n existing['return'] = returnFiber;\n return existing;\n }\n }\n\n function createChild(returnFiber, newChild, expirationTime) {\n if (typeof newChild === 'string' || typeof newChild === 'number') {\n // Text nodes don't have keys. If the previous node is implicitly keyed\n // we can continue to replace it without aborting even if it is not a text\n // node.\n var created = createFiberFromText('' + newChild, returnFiber.internalContextTag, expirationTime);\n created['return'] = returnFiber;\n return created;\n }\n\n if (typeof newChild === 'object' && newChild !== null) {\n switch (newChild.$$typeof) {\n case REACT_ELEMENT_TYPE:\n {\n if (newChild.type === REACT_FRAGMENT_TYPE) {\n var _created = createFiberFromFragment(newChild.props.children, returnFiber.internalContextTag, expirationTime, newChild.key);\n _created['return'] = returnFiber;\n return _created;\n } else {\n var _created2 = createFiberFromElement(newChild, returnFiber.internalContextTag, expirationTime);\n _created2.ref = coerceRef(null, newChild);\n _created2['return'] = returnFiber;\n return _created2;\n }\n }\n\n case REACT_CALL_TYPE:\n {\n var _created3 = createFiberFromCall(newChild, returnFiber.internalContextTag, expirationTime);\n _created3['return'] = returnFiber;\n return _created3;\n }\n\n case REACT_RETURN_TYPE:\n {\n var _created4 = createFiberFromReturn(newChild, returnFiber.internalContextTag, expirationTime);\n _created4.type = newChild.value;\n _created4['return'] = returnFiber;\n return _created4;\n }\n\n case REACT_PORTAL_TYPE:\n {\n var _created5 = createFiberFromPortal(newChild, returnFiber.internalContextTag, expirationTime);\n _created5['return'] = returnFiber;\n return _created5;\n }\n }\n\n if (isArray$1(newChild) || getIteratorFn(newChild)) {\n var _created6 = createFiberFromFragment(newChild, returnFiber.internalContextTag, expirationTime, null);\n _created6['return'] = returnFiber;\n return _created6;\n }\n\n throwOnInvalidObjectType(returnFiber, newChild);\n }\n\n {\n if (typeof newChild === 'function') {\n warnOnFunctionType();\n }\n }\n\n return null;\n }\n\n function updateSlot(returnFiber, oldFiber, newChild, expirationTime) {\n // Update the fiber if the keys match, otherwise return null.\n\n var key = oldFiber !== null ? oldFiber.key : null;\n\n if (typeof newChild === 'string' || typeof newChild === 'number') {\n // Text nodes don't have keys. If the previous node is implicitly keyed\n // we can continue to replace it without aborting even if it is not a text\n // node.\n if (key !== null) {\n return null;\n }\n return updateTextNode(returnFiber, oldFiber, '' + newChild, expirationTime);\n }\n\n if (typeof newChild === 'object' && newChild !== null) {\n switch (newChild.$$typeof) {\n case REACT_ELEMENT_TYPE:\n {\n if (newChild.key === key) {\n if (newChild.type === REACT_FRAGMENT_TYPE) {\n return updateFragment(returnFiber, oldFiber, newChild.props.children, expirationTime, key);\n }\n return updateElement(returnFiber, oldFiber, newChild, expirationTime);\n } else {\n return null;\n }\n }\n\n case REACT_CALL_TYPE:\n {\n if (newChild.key === key) {\n return updateCall(returnFiber, oldFiber, newChild, expirationTime);\n } else {\n return null;\n }\n }\n\n case REACT_RETURN_TYPE:\n {\n // Returns don't have keys. If the previous node is implicitly keyed\n // we can continue to replace it without aborting even if it is not a\n // yield.\n if (key === null) {\n return updateReturn(returnFiber, oldFiber, newChild, expirationTime);\n } else {\n return null;\n }\n }\n\n case REACT_PORTAL_TYPE:\n {\n if (newChild.key === key) {\n return updatePortal(returnFiber, oldFiber, newChild, expirationTime);\n } else {\n return null;\n }\n }\n }\n\n if (isArray$1(newChild) || getIteratorFn(newChild)) {\n if (key !== null) {\n return null;\n }\n\n return updateFragment(returnFiber, oldFiber, newChild, expirationTime, null);\n }\n\n throwOnInvalidObjectType(returnFiber, newChild);\n }\n\n {\n if (typeof newChild === 'function') {\n warnOnFunctionType();\n }\n }\n\n return null;\n }\n\n function updateFromMap(existingChildren, returnFiber, newIdx, newChild, expirationTime) {\n if (typeof newChild === 'string' || typeof newChild === 'number') {\n // Text nodes don't have keys, so we neither have to check the old nor\n // new node for the key. If both are text nodes, they match.\n var matchedFiber = existingChildren.get(newIdx) || null;\n return updateTextNode(returnFiber, matchedFiber, '' + newChild, expirationTime);\n }\n\n if (typeof newChild === 'object' && newChild !== null) {\n switch (newChild.$$typeof) {\n case REACT_ELEMENT_TYPE:\n {\n var _matchedFiber = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null;\n if (newChild.type === REACT_FRAGMENT_TYPE) {\n return updateFragment(returnFiber, _matchedFiber, newChild.props.children, expirationTime, newChild.key);\n }\n return updateElement(returnFiber, _matchedFiber, newChild, expirationTime);\n }\n\n case REACT_CALL_TYPE:\n {\n var _matchedFiber2 = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null;\n return updateCall(returnFiber, _matchedFiber2, newChild, expirationTime);\n }\n\n case REACT_RETURN_TYPE:\n {\n // Returns don't have keys, so we neither have to check the old nor\n // new node for the key. If both are returns, they match.\n var _matchedFiber3 = existingChildren.get(newIdx) || null;\n return updateReturn(returnFiber, _matchedFiber3, newChild, expirationTime);\n }\n\n case REACT_PORTAL_TYPE:\n {\n var _matchedFiber4 = existingChildren.get(newChild.key === null ? newIdx : newChild.key) || null;\n return updatePortal(returnFiber, _matchedFiber4, newChild, expirationTime);\n }\n }\n\n if (isArray$1(newChild) || getIteratorFn(newChild)) {\n var _matchedFiber5 = existingChildren.get(newIdx) || null;\n return updateFragment(returnFiber, _matchedFiber5, newChild, expirationTime, null);\n }\n\n throwOnInvalidObjectType(returnFiber, newChild);\n }\n\n {\n if (typeof newChild === 'function') {\n warnOnFunctionType();\n }\n }\n\n return null;\n }\n\n /**\n * Warns if there is a duplicate or missing key\n */\n function warnOnInvalidKey(child, knownKeys) {\n {\n if (typeof child !== 'object' || child === null) {\n return knownKeys;\n }\n switch (child.$$typeof) {\n case REACT_ELEMENT_TYPE:\n case REACT_CALL_TYPE:\n case REACT_PORTAL_TYPE:\n warnForMissingKey(child);\n var key = child.key;\n if (typeof key !== 'string') {\n break;\n }\n if (knownKeys === null) {\n knownKeys = new Set();\n knownKeys.add(key);\n break;\n }\n if (!knownKeys.has(key)) {\n knownKeys.add(key);\n break;\n }\n warning(false, 'Encountered two children with the same key, `%s`. ' + 'Keys should be unique so that components maintain their identity ' + 'across updates. Non-unique keys may cause children to be ' + 'duplicated and/or omitted — the behavior is unsupported and ' + 'could change in a future version.%s', key, getCurrentFiberStackAddendum$1());\n break;\n default:\n break;\n }\n }\n return knownKeys;\n }\n\n function reconcileChildrenArray(returnFiber, currentFirstChild, newChildren, expirationTime) {\n // This algorithm can't optimize by searching from boths ends since we\n // don't have backpointers on fibers. I'm trying to see how far we can get\n // with that model. If it ends up not being worth the tradeoffs, we can\n // add it later.\n\n // Even with a two ended optimization, we'd want to optimize for the case\n // where there are few changes and brute force the comparison instead of\n // going for the Map. It'd like to explore hitting that path first in\n // forward-only mode and only go for the Map once we notice that we need\n // lots of look ahead. This doesn't handle reversal as well as two ended\n // search but that's unusual. Besides, for the two ended optimization to\n // work on Iterables, we'd need to copy the whole set.\n\n // In this first iteration, we'll just live with hitting the bad case\n // (adding everything to a Map) in for every insert/move.\n\n // If you change this code, also update reconcileChildrenIterator() which\n // uses the same algorithm.\n\n {\n // First, validate keys.\n var knownKeys = null;\n for (var i = 0; i < newChildren.length; i++) {\n var child = newChildren[i];\n knownKeys = warnOnInvalidKey(child, knownKeys);\n }\n }\n\n var resultingFirstChild = null;\n var previousNewFiber = null;\n\n var oldFiber = currentFirstChild;\n var lastPlacedIndex = 0;\n var newIdx = 0;\n var nextOldFiber = null;\n for (; oldFiber !== null && newIdx < newChildren.length; newIdx++) {\n if (oldFiber.index > newIdx) {\n nextOldFiber = oldFiber;\n oldFiber = null;\n } else {\n nextOldFiber = oldFiber.sibling;\n }\n var newFiber = updateSlot(returnFiber, oldFiber, newChildren[newIdx], expirationTime);\n if (newFiber === null) {\n // TODO: This breaks on empty slots like null children. That's\n // unfortunate because it triggers the slow path all the time. We need\n // a better way to communicate whether this was a miss or null,\n // boolean, undefined, etc.\n if (oldFiber === null) {\n oldFiber = nextOldFiber;\n }\n break;\n }\n if (shouldTrackSideEffects) {\n if (oldFiber && newFiber.alternate === null) {\n // We matched the slot, but we didn't reuse the existing fiber, so we\n // need to delete the existing child.\n deleteChild(returnFiber, oldFiber);\n }\n }\n lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx);\n if (previousNewFiber === null) {\n // TODO: Move out of the loop. This only happens for the first run.\n resultingFirstChild = newFiber;\n } else {\n // TODO: Defer siblings if we're not at the right index for this slot.\n // I.e. if we had null values before, then we want to defer this\n // for each null value. However, we also don't want to call updateSlot\n // with the previous one.\n previousNewFiber.sibling = newFiber;\n }\n previousNewFiber = newFiber;\n oldFiber = nextOldFiber;\n }\n\n if (newIdx === newChildren.length) {\n // We've reached the end of the new children. We can delete the rest.\n deleteRemainingChildren(returnFiber, oldFiber);\n return resultingFirstChild;\n }\n\n if (oldFiber === null) {\n // If we don't have any more existing children we can choose a fast path\n // since the rest will all be insertions.\n for (; newIdx < newChildren.length; newIdx++) {\n var _newFiber = createChild(returnFiber, newChildren[newIdx], expirationTime);\n if (!_newFiber) {\n continue;\n }\n lastPlacedIndex = placeChild(_newFiber, lastPlacedIndex, newIdx);\n if (previousNewFiber === null) {\n // TODO: Move out of the loop. This only happens for the first run.\n resultingFirstChild = _newFiber;\n } else {\n previousNewFiber.sibling = _newFiber;\n }\n previousNewFiber = _newFiber;\n }\n return resultingFirstChild;\n }\n\n // Add all children to a key map for quick lookups.\n var existingChildren = mapRemainingChildren(returnFiber, oldFiber);\n\n // Keep scanning and use the map to restore deleted items as moves.\n for (; newIdx < newChildren.length; newIdx++) {\n var _newFiber2 = updateFromMap(existingChildren, returnFiber, newIdx, newChildren[newIdx], expirationTime);\n if (_newFiber2) {\n if (shouldTrackSideEffects) {\n if (_newFiber2.alternate !== null) {\n // The new fiber is a work in progress, but if there exists a\n // current, that means that we reused the fiber. We need to delete\n // it from the child list so that we don't add it to the deletion\n // list.\n existingChildren['delete'](_newFiber2.key === null ? newIdx : _newFiber2.key);\n }\n }\n lastPlacedIndex = placeChild(_newFiber2, lastPlacedIndex, newIdx);\n if (previousNewFiber === null) {\n resultingFirstChild = _newFiber2;\n } else {\n previousNewFiber.sibling = _newFiber2;\n }\n previousNewFiber = _newFiber2;\n }\n }\n\n if (shouldTrackSideEffects) {\n // Any existing children that weren't consumed above were deleted. We need\n // to add them to the deletion list.\n existingChildren.forEach(function (child) {\n return deleteChild(returnFiber, child);\n });\n }\n\n return resultingFirstChild;\n }\n\n function reconcileChildrenIterator(returnFiber, currentFirstChild, newChildrenIterable, expirationTime) {\n // This is the same implementation as reconcileChildrenArray(),\n // but using the iterator instead.\n\n var iteratorFn = getIteratorFn(newChildrenIterable);\n !(typeof iteratorFn === 'function') ? invariant(false, 'An object is not an iterable. This error is likely caused by a bug in React. Please file an issue.') : void 0;\n\n {\n // Warn about using Maps as children\n if (typeof newChildrenIterable.entries === 'function') {\n var possibleMap = newChildrenIterable;\n if (possibleMap.entries === iteratorFn) {\n warning(didWarnAboutMaps, 'Using Maps as children is unsupported and will likely yield ' + 'unexpected results. Convert it to a sequence/iterable of keyed ' + 'ReactElements instead.%s', getCurrentFiberStackAddendum$1());\n didWarnAboutMaps = true;\n }\n }\n\n // First, validate keys.\n // We'll get a different iterator later for the main pass.\n var _newChildren = iteratorFn.call(newChildrenIterable);\n if (_newChildren) {\n var knownKeys = null;\n var _step = _newChildren.next();\n for (; !_step.done; _step = _newChildren.next()) {\n var child = _step.value;\n knownKeys = warnOnInvalidKey(child, knownKeys);\n }\n }\n }\n\n var newChildren = iteratorFn.call(newChildrenIterable);\n !(newChildren != null) ? invariant(false, 'An iterable object provided no iterator.') : void 0;\n\n var resultingFirstChild = null;\n var previousNewFiber = null;\n\n var oldFiber = currentFirstChild;\n var lastPlacedIndex = 0;\n var newIdx = 0;\n var nextOldFiber = null;\n\n var step = newChildren.next();\n for (; oldFiber !== null && !step.done; newIdx++, step = newChildren.next()) {\n if (oldFiber.index > newIdx) {\n nextOldFiber = oldFiber;\n oldFiber = null;\n } else {\n nextOldFiber = oldFiber.sibling;\n }\n var newFiber = updateSlot(returnFiber, oldFiber, step.value, expirationTime);\n if (newFiber === null) {\n // TODO: This breaks on empty slots like null children. That's\n // unfortunate because it triggers the slow path all the time. We need\n // a better way to communicate whether this was a miss or null,\n // boolean, undefined, etc.\n if (!oldFiber) {\n oldFiber = nextOldFiber;\n }\n break;\n }\n if (shouldTrackSideEffects) {\n if (oldFiber && newFiber.alternate === null) {\n // We matched the slot, but we didn't reuse the existing fiber, so we\n // need to delete the existing child.\n deleteChild(returnFiber, oldFiber);\n }\n }\n lastPlacedIndex = placeChild(newFiber, lastPlacedIndex, newIdx);\n if (previousNewFiber === null) {\n // TODO: Move out of the loop. This only happens for the first run.\n resultingFirstChild = newFiber;\n } else {\n // TODO: Defer siblings if we're not at the right index for this slot.\n // I.e. if we had null values before, then we want to defer this\n // for each null value. However, we also don't want to call updateSlot\n // with the previous one.\n previousNewFiber.sibling = newFiber;\n }\n previousNewFiber = newFiber;\n oldFiber = nextOldFiber;\n }\n\n if (step.done) {\n // We've reached the end of the new children. We can delete the rest.\n deleteRemainingChildren(returnFiber, oldFiber);\n return resultingFirstChild;\n }\n\n if (oldFiber === null) {\n // If we don't have any more existing children we can choose a fast path\n // since the rest will all be insertions.\n for (; !step.done; newIdx++, step = newChildren.next()) {\n var _newFiber3 = createChild(returnFiber, step.value, expirationTime);\n if (_newFiber3 === null) {\n continue;\n }\n lastPlacedIndex = placeChild(_newFiber3, lastPlacedIndex, newIdx);\n if (previousNewFiber === null) {\n // TODO: Move out of the loop. This only happens for the first run.\n resultingFirstChild = _newFiber3;\n } else {\n previousNewFiber.sibling = _newFiber3;\n }\n previousNewFiber = _newFiber3;\n }\n return resultingFirstChild;\n }\n\n // Add all children to a key map for quick lookups.\n var existingChildren = mapRemainingChildren(returnFiber, oldFiber);\n\n // Keep scanning and use the map to restore deleted items as moves.\n for (; !step.done; newIdx++, step = newChildren.next()) {\n var _newFiber4 = updateFromMap(existingChildren, returnFiber, newIdx, step.value, expirationTime);\n if (_newFiber4 !== null) {\n if (shouldTrackSideEffects) {\n if (_newFiber4.alternate !== null) {\n // The new fiber is a work in progress, but if there exists a\n // current, that means that we reused the fiber. We need to delete\n // it from the child list so that we don't add it to the deletion\n // list.\n existingChildren['delete'](_newFiber4.key === null ? newIdx : _newFiber4.key);\n }\n }\n lastPlacedIndex = placeChild(_newFiber4, lastPlacedIndex, newIdx);\n if (previousNewFiber === null) {\n resultingFirstChild = _newFiber4;\n } else {\n previousNewFiber.sibling = _newFiber4;\n }\n previousNewFiber = _newFiber4;\n }\n }\n\n if (shouldTrackSideEffects) {\n // Any existing children that weren't consumed above were deleted. We need\n // to add them to the deletion list.\n existingChildren.forEach(function (child) {\n return deleteChild(returnFiber, child);\n });\n }\n\n return resultingFirstChild;\n }\n\n function reconcileSingleTextNode(returnFiber, currentFirstChild, textContent, expirationTime) {\n // There's no need to check for keys on text nodes since we don't have a\n // way to define them.\n if (currentFirstChild !== null && currentFirstChild.tag === HostText) {\n // We already have an existing node so let's just update it and delete\n // the rest.\n deleteRemainingChildren(returnFiber, currentFirstChild.sibling);\n var existing = useFiber(currentFirstChild, textContent, expirationTime);\n existing['return'] = returnFiber;\n return existing;\n }\n // The existing first child is not a text node so we need to create one\n // and delete the existing ones.\n deleteRemainingChildren(returnFiber, currentFirstChild);\n var created = createFiberFromText(textContent, returnFiber.internalContextTag, expirationTime);\n created['return'] = returnFiber;\n return created;\n }\n\n function reconcileSingleElement(returnFiber, currentFirstChild, element, expirationTime) {\n var key = element.key;\n var child = currentFirstChild;\n while (child !== null) {\n // TODO: If key === null and child.key === null, then this only applies to\n // the first item in the list.\n if (child.key === key) {\n if (child.tag === Fragment ? element.type === REACT_FRAGMENT_TYPE : child.type === element.type) {\n deleteRemainingChildren(returnFiber, child.sibling);\n var existing = useFiber(child, element.type === REACT_FRAGMENT_TYPE ? element.props.children : element.props, expirationTime);\n existing.ref = coerceRef(child, element);\n existing['return'] = returnFiber;\n {\n existing._debugSource = element._source;\n existing._debugOwner = element._owner;\n }\n return existing;\n } else {\n deleteRemainingChildren(returnFiber, child);\n break;\n }\n } else {\n deleteChild(returnFiber, child);\n }\n child = child.sibling;\n }\n\n if (element.type === REACT_FRAGMENT_TYPE) {\n var created = createFiberFromFragment(element.props.children, returnFiber.internalContextTag, expirationTime, element.key);\n created['return'] = returnFiber;\n return created;\n } else {\n var _created7 = createFiberFromElement(element, returnFiber.internalContextTag, expirationTime);\n _created7.ref = coerceRef(currentFirstChild, element);\n _created7['return'] = returnFiber;\n return _created7;\n }\n }\n\n function reconcileSingleCall(returnFiber, currentFirstChild, call, expirationTime) {\n var key = call.key;\n var child = currentFirstChild;\n while (child !== null) {\n // TODO: If key === null and child.key === null, then this only applies to\n // the first item in the list.\n if (child.key === key) {\n if (child.tag === CallComponent) {\n deleteRemainingChildren(returnFiber, child.sibling);\n var existing = useFiber(child, call, expirationTime);\n existing['return'] = returnFiber;\n return existing;\n } else {\n deleteRemainingChildren(returnFiber, child);\n break;\n }\n } else {\n deleteChild(returnFiber, child);\n }\n child = child.sibling;\n }\n\n var created = createFiberFromCall(call, returnFiber.internalContextTag, expirationTime);\n created['return'] = returnFiber;\n return created;\n }\n\n function reconcileSingleReturn(returnFiber, currentFirstChild, returnNode, expirationTime) {\n // There's no need to check for keys on yields since they're stateless.\n var child = currentFirstChild;\n if (child !== null) {\n if (child.tag === ReturnComponent) {\n deleteRemainingChildren(returnFiber, child.sibling);\n var existing = useFiber(child, null, expirationTime);\n existing.type = returnNode.value;\n existing['return'] = returnFiber;\n return existing;\n } else {\n deleteRemainingChildren(returnFiber, child);\n }\n }\n\n var created = createFiberFromReturn(returnNode, returnFiber.internalContextTag, expirationTime);\n created.type = returnNode.value;\n created['return'] = returnFiber;\n return created;\n }\n\n function reconcileSinglePortal(returnFiber, currentFirstChild, portal, expirationTime) {\n var key = portal.key;\n var child = currentFirstChild;\n while (child !== null) {\n // TODO: If key === null and child.key === null, then this only applies to\n // the first item in the list.\n if (child.key === key) {\n if (child.tag === HostPortal && child.stateNode.containerInfo === portal.containerInfo && child.stateNode.implementation === portal.implementation) {\n deleteRemainingChildren(returnFiber, child.sibling);\n var existing = useFiber(child, portal.children || [], expirationTime);\n existing['return'] = returnFiber;\n return existing;\n } else {\n deleteRemainingChildren(returnFiber, child);\n break;\n }\n } else {\n deleteChild(returnFiber, child);\n }\n child = child.sibling;\n }\n\n var created = createFiberFromPortal(portal, returnFiber.internalContextTag, expirationTime);\n created['return'] = returnFiber;\n return created;\n }\n\n // This API will tag the children with the side-effect of the reconciliation\n // itself. They will be added to the side-effect list as we pass through the\n // children and the parent.\n function reconcileChildFibers(returnFiber, currentFirstChild, newChild, expirationTime) {\n // This function is not recursive.\n // If the top level item is an array, we treat it as a set of children,\n // not as a fragment. Nested arrays on the other hand will be treated as\n // fragment nodes. Recursion happens at the normal flow.\n\n // Handle top level unkeyed fragments as if they were arrays.\n // This leads to an ambiguity between <>{[...]}</> and <>...</>.\n // We treat the ambiguous cases above the same.\n if (typeof newChild === 'object' && newChild !== null && newChild.type === REACT_FRAGMENT_TYPE && newChild.key === null) {\n newChild = newChild.props.children;\n }\n\n // Handle object types\n var isObject = typeof newChild === 'object' && newChild !== null;\n\n if (isObject) {\n switch (newChild.$$typeof) {\n case REACT_ELEMENT_TYPE:\n return placeSingleChild(reconcileSingleElement(returnFiber, currentFirstChild, newChild, expirationTime));\n\n case REACT_CALL_TYPE:\n return placeSingleChild(reconcileSingleCall(returnFiber, currentFirstChild, newChild, expirationTime));\n case REACT_RETURN_TYPE:\n return placeSingleChild(reconcileSingleReturn(returnFiber, currentFirstChild, newChild, expirationTime));\n case REACT_PORTAL_TYPE:\n return placeSingleChild(reconcileSinglePortal(returnFiber, currentFirstChild, newChild, expirationTime));\n }\n }\n\n if (typeof newChild === 'string' || typeof newChild === 'number') {\n return placeSingleChild(reconcileSingleTextNode(returnFiber, currentFirstChild, '' + newChild, expirationTime));\n }\n\n if (isArray$1(newChild)) {\n return reconcileChildrenArray(returnFiber, currentFirstChild, newChild, expirationTime);\n }\n\n if (getIteratorFn(newChild)) {\n return reconcileChildrenIterator(returnFiber, currentFirstChild, newChild, expirationTime);\n }\n\n if (isObject) {\n throwOnInvalidObjectType(returnFiber, newChild);\n }\n\n {\n if (typeof newChild === 'function') {\n warnOnFunctionType();\n }\n }\n if (typeof newChild === 'undefined') {\n // If the new child is undefined, and the return fiber is a composite\n // component, throw an error. If Fiber return types are disabled,\n // we already threw above.\n switch (returnFiber.tag) {\n case ClassComponent:\n {\n {\n var instance = returnFiber.stateNode;\n if (instance.render._isMockFunction) {\n // We allow auto-mocks to proceed as if they're returning null.\n break;\n }\n }\n }\n // Intentionally fall through to the next case, which handles both\n // functions and classes\n // eslint-disable-next-lined no-fallthrough\n case FunctionalComponent:\n {\n var Component = returnFiber.type;\n invariant(false, '%s(...): Nothing was returned from render. This usually means a return statement is missing. Or, to render nothing, return null.', Component.displayName || Component.name || 'Component');\n }\n }\n }\n\n // Remaining cases are all treated as empty.\n return deleteRemainingChildren(returnFiber, currentFirstChild);\n }\n\n return reconcileChildFibers;\n}\n\nvar reconcileChildFibers = ChildReconciler(true);\nvar mountChildFibers = ChildReconciler(false);\n\nfunction cloneChildFibers(current, workInProgress) {\n !(current === null || workInProgress.child === current.child) ? invariant(false, 'Resuming work not yet implemented.') : void 0;\n\n if (workInProgress.child === null) {\n return;\n }\n\n var currentChild = workInProgress.child;\n var newChild = createWorkInProgress(currentChild, currentChild.pendingProps, currentChild.expirationTime);\n workInProgress.child = newChild;\n\n newChild['return'] = workInProgress;\n while (currentChild.sibling !== null) {\n currentChild = currentChild.sibling;\n newChild = newChild.sibling = createWorkInProgress(currentChild, currentChild.pendingProps, currentChild.expirationTime);\n newChild['return'] = workInProgress;\n }\n newChild.sibling = null;\n}\n\n{\n var warnedAboutStatelessRefs = {};\n}\n\nvar ReactFiberBeginWork = function (config, hostContext, hydrationContext, scheduleWork, computeExpirationForFiber) {\n var shouldSetTextContent = config.shouldSetTextContent,\n useSyncScheduling = config.useSyncScheduling,\n shouldDeprioritizeSubtree = config.shouldDeprioritizeSubtree;\n var pushHostContext = hostContext.pushHostContext,\n pushHostContainer = hostContext.pushHostContainer;\n var enterHydrationState = hydrationContext.enterHydrationState,\n resetHydrationState = hydrationContext.resetHydrationState,\n tryToClaimNextHydratableInstance = hydrationContext.tryToClaimNextHydratableInstance;\n\n var _ReactFiberClassCompo = ReactFiberClassComponent(scheduleWork, computeExpirationForFiber, memoizeProps, memoizeState),\n adoptClassInstance = _ReactFiberClassCompo.adoptClassInstance,\n constructClassInstance = _ReactFiberClassCompo.constructClassInstance,\n mountClassInstance = _ReactFiberClassCompo.mountClassInstance,\n updateClassInstance = _ReactFiberClassCompo.updateClassInstance;\n\n // TODO: Remove this and use reconcileChildrenAtExpirationTime directly.\n\n\n function reconcileChildren(current, workInProgress, nextChildren) {\n reconcileChildrenAtExpirationTime(current, workInProgress, nextChildren, workInProgress.expirationTime);\n }\n\n function reconcileChildrenAtExpirationTime(current, workInProgress, nextChildren, renderExpirationTime) {\n if (current === null) {\n // If this is a fresh new component that hasn't been rendered yet, we\n // won't update its child set by applying minimal side-effects. Instead,\n // we will add them all to the child before it gets rendered. That means\n // we can optimize this reconciliation pass by not tracking side-effects.\n workInProgress.child = mountChildFibers(workInProgress, null, nextChildren, renderExpirationTime);\n } else {\n // If the current child is the same as the work in progress, it means that\n // we haven't yet started any work on these children. Therefore, we use\n // the clone algorithm to create a copy of all the current children.\n\n // If we had any progressed work already, that is invalid at this point so\n // let's throw it out.\n workInProgress.child = reconcileChildFibers(workInProgress, current.child, nextChildren, renderExpirationTime);\n }\n }\n\n function updateFragment(current, workInProgress) {\n var nextChildren = workInProgress.pendingProps;\n if (hasContextChanged()) {\n // Normally we can bail out on props equality but if context has changed\n // we don't do the bailout and we have to reuse existing props instead.\n if (nextChildren === null) {\n nextChildren = workInProgress.memoizedProps;\n }\n } else if (nextChildren === null || workInProgress.memoizedProps === nextChildren) {\n return bailoutOnAlreadyFinishedWork(current, workInProgress);\n }\n reconcileChildren(current, workInProgress, nextChildren);\n memoizeProps(workInProgress, nextChildren);\n return workInProgress.child;\n }\n\n function markRef(current, workInProgress) {\n var ref = workInProgress.ref;\n if (ref !== null && (!current || current.ref !== ref)) {\n // Schedule a Ref effect\n workInProgress.effectTag |= Ref;\n }\n }\n\n function updateFunctionalComponent(current, workInProgress) {\n var fn = workInProgress.type;\n var nextProps = workInProgress.pendingProps;\n\n var memoizedProps = workInProgress.memoizedProps;\n if (hasContextChanged()) {\n // Normally we can bail out on props equality but if context has changed\n // we don't do the bailout and we have to reuse existing props instead.\n if (nextProps === null) {\n nextProps = memoizedProps;\n }\n } else {\n if (nextProps === null || memoizedProps === nextProps) {\n return bailoutOnAlreadyFinishedWork(current, workInProgress);\n }\n // TODO: consider bringing fn.shouldComponentUpdate() back.\n // It used to be here.\n }\n\n var unmaskedContext = getUnmaskedContext(workInProgress);\n var context = getMaskedContext(workInProgress, unmaskedContext);\n\n var nextChildren;\n\n {\n ReactCurrentOwner.current = workInProgress;\n ReactDebugCurrentFiber.setCurrentPhase('render');\n nextChildren = fn(nextProps, context);\n ReactDebugCurrentFiber.setCurrentPhase(null);\n }\n // React DevTools reads this flag.\n workInProgress.effectTag |= PerformedWork;\n reconcileChildren(current, workInProgress, nextChildren);\n memoizeProps(workInProgress, nextProps);\n return workInProgress.child;\n }\n\n function updateClassComponent(current, workInProgress, renderExpirationTime) {\n // Push context providers early to prevent context stack mismatches.\n // During mounting we don't know the child context yet as the instance doesn't exist.\n // We will invalidate the child context in finishClassComponent() right after rendering.\n var hasContext = pushContextProvider(workInProgress);\n\n var shouldUpdate = void 0;\n if (current === null) {\n if (!workInProgress.stateNode) {\n // In the initial pass we might need to construct the instance.\n constructClassInstance(workInProgress, workInProgress.pendingProps);\n mountClassInstance(workInProgress, renderExpirationTime);\n shouldUpdate = true;\n } else {\n invariant(false, 'Resuming work not yet implemented.');\n // In a resume, we'll already have an instance we can reuse.\n // shouldUpdate = resumeMountClassInstance(workInProgress, renderExpirationTime);\n }\n } else {\n shouldUpdate = updateClassInstance(current, workInProgress, renderExpirationTime);\n }\n return finishClassComponent(current, workInProgress, shouldUpdate, hasContext);\n }\n\n function finishClassComponent(current, workInProgress, shouldUpdate, hasContext) {\n // Refs should update even if shouldComponentUpdate returns false\n markRef(current, workInProgress);\n\n if (!shouldUpdate) {\n // Context providers should defer to sCU for rendering\n if (hasContext) {\n invalidateContextProvider(workInProgress, false);\n }\n\n return bailoutOnAlreadyFinishedWork(current, workInProgress);\n }\n\n var instance = workInProgress.stateNode;\n\n // Rerender\n ReactCurrentOwner.current = workInProgress;\n var nextChildren = void 0;\n {\n ReactDebugCurrentFiber.setCurrentPhase('render');\n nextChildren = instance.render();\n if (debugRenderPhaseSideEffects) {\n instance.render();\n }\n ReactDebugCurrentFiber.setCurrentPhase(null);\n }\n // React DevTools reads this flag.\n workInProgress.effectTag |= PerformedWork;\n reconcileChildren(current, workInProgress, nextChildren);\n // Memoize props and state using the values we just used to render.\n // TODO: Restructure so we never read values from the instance.\n memoizeState(workInProgress, instance.state);\n memoizeProps(workInProgress, instance.props);\n\n // The context might have changed so we need to recalculate it.\n if (hasContext) {\n invalidateContextProvider(workInProgress, true);\n }\n\n return workInProgress.child;\n }\n\n function pushHostRootContext(workInProgress) {\n var root = workInProgress.stateNode;\n if (root.pendingContext) {\n pushTopLevelContextObject(workInProgress, root.pendingContext, root.pendingContext !== root.context);\n } else if (root.context) {\n // Should always be set\n pushTopLevelContextObject(workInProgress, root.context, false);\n }\n pushHostContainer(workInProgress, root.containerInfo);\n }\n\n function updateHostRoot(current, workInProgress, renderExpirationTime) {\n pushHostRootContext(workInProgress);\n var updateQueue = workInProgress.updateQueue;\n if (updateQueue !== null) {\n var prevState = workInProgress.memoizedState;\n var state = processUpdateQueue(current, workInProgress, updateQueue, null, null, renderExpirationTime);\n if (prevState === state) {\n // If the state is the same as before, that's a bailout because we had\n // no work that expires at this time.\n resetHydrationState();\n return bailoutOnAlreadyFinishedWork(current, workInProgress);\n }\n var element = state.element;\n var root = workInProgress.stateNode;\n if ((current === null || current.child === null) && root.hydrate && enterHydrationState(workInProgress)) {\n // If we don't have any current children this might be the first pass.\n // We always try to hydrate. If this isn't a hydration pass there won't\n // be any children to hydrate which is effectively the same thing as\n // not hydrating.\n\n // This is a bit of a hack. We track the host root as a placement to\n // know that we're currently in a mounting state. That way isMounted\n // works as expected. We must reset this before committing.\n // TODO: Delete this when we delete isMounted and findDOMNode.\n workInProgress.effectTag |= Placement;\n\n // Ensure that children mount into this root without tracking\n // side-effects. This ensures that we don't store Placement effects on\n // nodes that will be hydrated.\n workInProgress.child = mountChildFibers(workInProgress, null, element, renderExpirationTime);\n } else {\n // Otherwise reset hydration state in case we aborted and resumed another\n // root.\n resetHydrationState();\n reconcileChildren(current, workInProgress, element);\n }\n memoizeState(workInProgress, state);\n return workInProgress.child;\n }\n resetHydrationState();\n // If there is no update queue, that's a bailout because the root has no props.\n return bailoutOnAlreadyFinishedWork(current, workInProgress);\n }\n\n function updateHostComponent(current, workInProgress, renderExpirationTime) {\n pushHostContext(workInProgress);\n\n if (current === null) {\n tryToClaimNextHydratableInstance(workInProgress);\n }\n\n var type = workInProgress.type;\n var memoizedProps = workInProgress.memoizedProps;\n var nextProps = workInProgress.pendingProps;\n if (nextProps === null) {\n nextProps = memoizedProps;\n !(nextProps !== null) ? invariant(false, 'We should always have pending or current props. This error is likely caused by a bug in React. Please file an issue.') : void 0;\n }\n var prevProps = current !== null ? current.memoizedProps : null;\n\n if (hasContextChanged()) {\n // Normally we can bail out on props equality but if context has changed\n // we don't do the bailout and we have to reuse existing props instead.\n } else if (nextProps === null || memoizedProps === nextProps) {\n return bailoutOnAlreadyFinishedWork(current, workInProgress);\n }\n\n var nextChildren = nextProps.children;\n var isDirectTextChild = shouldSetTextContent(type, nextProps);\n\n if (isDirectTextChild) {\n // We special case a direct text child of a host node. This is a common\n // case. We won't handle it as a reified child. We will instead handle\n // this in the host environment that also have access to this prop. That\n // avoids allocating another HostText fiber and traversing it.\n nextChildren = null;\n } else if (prevProps && shouldSetTextContent(type, prevProps)) {\n // If we're switching from a direct text child to a normal child, or to\n // empty, we need to schedule the text content to be reset.\n workInProgress.effectTag |= ContentReset;\n }\n\n markRef(current, workInProgress);\n\n // Check the host config to see if the children are offscreen/hidden.\n if (renderExpirationTime !== Never && !useSyncScheduling && shouldDeprioritizeSubtree(type, nextProps)) {\n // Down-prioritize the children.\n workInProgress.expirationTime = Never;\n // Bailout and come back to this fiber later.\n return null;\n }\n\n reconcileChildren(current, workInProgress, nextChildren);\n memoizeProps(workInProgress, nextProps);\n return workInProgress.child;\n }\n\n function updateHostText(current, workInProgress) {\n if (current === null) {\n tryToClaimNextHydratableInstance(workInProgress);\n }\n var nextProps = workInProgress.pendingProps;\n if (nextProps === null) {\n nextProps = workInProgress.memoizedProps;\n }\n memoizeProps(workInProgress, nextProps);\n // Nothing to do here. This is terminal. We'll do the completion step\n // immediately after.\n return null;\n }\n\n function mountIndeterminateComponent(current, workInProgress, renderExpirationTime) {\n !(current === null) ? invariant(false, 'An indeterminate component should never have mounted. This error is likely caused by a bug in React. Please file an issue.') : void 0;\n var fn = workInProgress.type;\n var props = workInProgress.pendingProps;\n var unmaskedContext = getUnmaskedContext(workInProgress);\n var context = getMaskedContext(workInProgress, unmaskedContext);\n\n var value;\n\n {\n if (fn.prototype && typeof fn.prototype.render === 'function') {\n var componentName = getComponentName(workInProgress);\n warning(false, \"The <%s /> component appears to have a render method, but doesn't extend React.Component. \" + 'This is likely to cause errors. Change %s to extend React.Component instead.', componentName, componentName);\n }\n ReactCurrentOwner.current = workInProgress;\n value = fn(props, context);\n }\n // React DevTools reads this flag.\n workInProgress.effectTag |= PerformedWork;\n\n if (typeof value === 'object' && value !== null && typeof value.render === 'function') {\n // Proceed under the assumption that this is a class instance\n workInProgress.tag = ClassComponent;\n\n // Push context providers early to prevent context stack mismatches.\n // During mounting we don't know the child context yet as the instance doesn't exist.\n // We will invalidate the child context in finishClassComponent() right after rendering.\n var hasContext = pushContextProvider(workInProgress);\n adoptClassInstance(workInProgress, value);\n mountClassInstance(workInProgress, renderExpirationTime);\n return finishClassComponent(current, workInProgress, true, hasContext);\n } else {\n // Proceed under the assumption that this is a functional component\n workInProgress.tag = FunctionalComponent;\n {\n var Component = workInProgress.type;\n\n if (Component) {\n warning(!Component.childContextTypes, '%s(...): childContextTypes cannot be defined on a functional component.', Component.displayName || Component.name || 'Component');\n }\n if (workInProgress.ref !== null) {\n var info = '';\n var ownerName = ReactDebugCurrentFiber.getCurrentFiberOwnerName();\n if (ownerName) {\n info += '\\n\\nCheck the render method of `' + ownerName + '`.';\n }\n\n var warningKey = ownerName || workInProgress._debugID || '';\n var debugSource = workInProgress._debugSource;\n if (debugSource) {\n warningKey = debugSource.fileName + ':' + debugSource.lineNumber;\n }\n if (!warnedAboutStatelessRefs[warningKey]) {\n warnedAboutStatelessRefs[warningKey] = true;\n warning(false, 'Stateless function components cannot be given refs. ' + 'Attempts to access this ref will fail.%s%s', info, ReactDebugCurrentFiber.getCurrentFiberStackAddendum());\n }\n }\n }\n reconcileChildren(current, workInProgress, value);\n memoizeProps(workInProgress, props);\n return workInProgress.child;\n }\n }\n\n function updateCallComponent(current, workInProgress, renderExpirationTime) {\n var nextCall = workInProgress.pendingProps;\n if (hasContextChanged()) {\n // Normally we can bail out on props equality but if context has changed\n // we don't do the bailout and we have to reuse existing props instead.\n if (nextCall === null) {\n nextCall = current && current.memoizedProps;\n !(nextCall !== null) ? invariant(false, 'We should always have pending or current props. This error is likely caused by a bug in React. Please file an issue.') : void 0;\n }\n } else if (nextCall === null || workInProgress.memoizedProps === nextCall) {\n nextCall = workInProgress.memoizedProps;\n // TODO: When bailing out, we might need to return the stateNode instead\n // of the child. To check it for work.\n // return bailoutOnAlreadyFinishedWork(current, workInProgress);\n }\n\n var nextChildren = nextCall.children;\n\n // The following is a fork of reconcileChildrenAtExpirationTime but using\n // stateNode to store the child.\n if (current === null) {\n workInProgress.stateNode = mountChildFibers(workInProgress, workInProgress.stateNode, nextChildren, renderExpirationTime);\n } else {\n workInProgress.stateNode = reconcileChildFibers(workInProgress, workInProgress.stateNode, nextChildren, renderExpirationTime);\n }\n\n memoizeProps(workInProgress, nextCall);\n // This doesn't take arbitrary time so we could synchronously just begin\n // eagerly do the work of workInProgress.child as an optimization.\n return workInProgress.stateNode;\n }\n\n function updatePortalComponent(current, workInProgress, renderExpirationTime) {\n pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);\n var nextChildren = workInProgress.pendingProps;\n if (hasContextChanged()) {\n // Normally we can bail out on props equality but if context has changed\n // we don't do the bailout and we have to reuse existing props instead.\n if (nextChildren === null) {\n nextChildren = current && current.memoizedProps;\n !(nextChildren != null) ? invariant(false, 'We should always have pending or current props. This error is likely caused by a bug in React. Please file an issue.') : void 0;\n }\n } else if (nextChildren === null || workInProgress.memoizedProps === nextChildren) {\n return bailoutOnAlreadyFinishedWork(current, workInProgress);\n }\n\n if (current === null) {\n // Portals are special because we don't append the children during mount\n // but at commit. Therefore we need to track insertions which the normal\n // flow doesn't do during mount. This doesn't happen at the root because\n // the root always starts with a \"current\" with a null child.\n // TODO: Consider unifying this with how the root works.\n workInProgress.child = reconcileChildFibers(workInProgress, null, nextChildren, renderExpirationTime);\n memoizeProps(workInProgress, nextChildren);\n } else {\n reconcileChildren(current, workInProgress, nextChildren);\n memoizeProps(workInProgress, nextChildren);\n }\n return workInProgress.child;\n }\n\n /*\n function reuseChildrenEffects(returnFiber : Fiber, firstChild : Fiber) {\n let child = firstChild;\n do {\n // Ensure that the first and last effect of the parent corresponds\n // to the children's first and last effect.\n if (!returnFiber.firstEffect) {\n returnFiber.firstEffect = child.firstEffect;\n }\n if (child.lastEffect) {\n if (returnFiber.lastEffect) {\n returnFiber.lastEffect.nextEffect = child.firstEffect;\n }\n returnFiber.lastEffect = child.lastEffect;\n }\n } while (child = child.sibling);\n }\n */\n\n function bailoutOnAlreadyFinishedWork(current, workInProgress) {\n cancelWorkTimer(workInProgress);\n\n // TODO: We should ideally be able to bail out early if the children have no\n // more work to do. However, since we don't have a separation of this\n // Fiber's priority and its children yet - we don't know without doing lots\n // of the same work we do anyway. Once we have that separation we can just\n // bail out here if the children has no more work at this priority level.\n // if (workInProgress.priorityOfChildren <= priorityLevel) {\n // // If there are side-effects in these children that have not yet been\n // // committed we need to ensure that they get properly transferred up.\n // if (current && current.child !== workInProgress.child) {\n // reuseChildrenEffects(workInProgress, child);\n // }\n // return null;\n // }\n\n cloneChildFibers(current, workInProgress);\n return workInProgress.child;\n }\n\n function bailoutOnLowPriority(current, workInProgress) {\n cancelWorkTimer(workInProgress);\n\n // TODO: Handle HostComponent tags here as well and call pushHostContext()?\n // See PR 8590 discussion for context\n switch (workInProgress.tag) {\n case HostRoot:\n pushHostRootContext(workInProgress);\n break;\n case ClassComponent:\n pushContextProvider(workInProgress);\n break;\n case HostPortal:\n pushHostContainer(workInProgress, workInProgress.stateNode.containerInfo);\n break;\n }\n // TODO: What if this is currently in progress?\n // How can that happen? How is this not being cloned?\n return null;\n }\n\n // TODO: Delete memoizeProps/State and move to reconcile/bailout instead\n function memoizeProps(workInProgress, nextProps) {\n workInProgress.memoizedProps = nextProps;\n }\n\n function memoizeState(workInProgress, nextState) {\n workInProgress.memoizedState = nextState;\n // Don't reset the updateQueue, in case there are pending updates. Resetting\n // is handled by processUpdateQueue.\n }\n\n function beginWork(current, workInProgress, renderExpirationTime) {\n if (workInProgress.expirationTime === NoWork || workInProgress.expirationTime > renderExpirationTime) {\n return bailoutOnLowPriority(current, workInProgress);\n }\n\n switch (workInProgress.tag) {\n case IndeterminateComponent:\n return mountIndeterminateComponent(current, workInProgress, renderExpirationTime);\n case FunctionalComponent:\n return updateFunctionalComponent(current, workInProgress);\n case ClassComponent:\n return updateClassComponent(current, workInProgress, renderExpirationTime);\n case HostRoot:\n return updateHostRoot(current, workInProgress, renderExpirationTime);\n case HostComponent:\n return updateHostComponent(current, workInProgress, renderExpirationTime);\n case HostText:\n return updateHostText(current, workInProgress);\n case CallHandlerPhase:\n // This is a restart. Reset the tag to the initial phase.\n workInProgress.tag = CallComponent;\n // Intentionally fall through since this is now the same.\n case CallComponent:\n return updateCallComponent(current, workInProgress, renderExpirationTime);\n case ReturnComponent:\n // A return component is just a placeholder, we can just run through the\n // next one immediately.\n return null;\n case HostPortal:\n return updatePortalComponent(current, workInProgress, renderExpirationTime);\n case Fragment:\n return updateFragment(current, workInProgress);\n default:\n invariant(false, 'Unknown unit of work tag. This error is likely caused by a bug in React. Please file an issue.');\n }\n }\n\n function beginFailedWork(current, workInProgress, renderExpirationTime) {\n // Push context providers here to avoid a push/pop context mismatch.\n switch (workInProgress.tag) {\n case ClassComponent:\n pushContextProvider(workInProgress);\n break;\n case HostRoot:\n pushHostRootContext(workInProgress);\n break;\n default:\n invariant(false, 'Invalid type of work. This error is likely caused by a bug in React. Please file an issue.');\n }\n\n // Add an error effect so we can handle the error during the commit phase\n workInProgress.effectTag |= Err;\n\n // This is a weird case where we do \"resume\" work — work that failed on\n // our first attempt. Because we no longer have a notion of \"progressed\n // deletions,\" reset the child to the current child to make sure we delete\n // it again. TODO: Find a better way to handle this, perhaps during a more\n // general overhaul of error handling.\n if (current === null) {\n workInProgress.child = null;\n } else if (workInProgress.child !== current.child) {\n workInProgress.child = current.child;\n }\n\n if (workInProgress.expirationTime === NoWork || workInProgress.expirationTime > renderExpirationTime) {\n return bailoutOnLowPriority(current, workInProgress);\n }\n\n // If we don't bail out, we're going be recomputing our children so we need\n // to drop our effect list.\n workInProgress.firstEffect = null;\n workInProgress.lastEffect = null;\n\n // Unmount the current children as if the component rendered null\n var nextChildren = null;\n reconcileChildrenAtExpirationTime(current, workInProgress, nextChildren, renderExpirationTime);\n\n if (workInProgress.tag === ClassComponent) {\n var instance = workInProgress.stateNode;\n workInProgress.memoizedProps = instance.props;\n workInProgress.memoizedState = instance.state;\n }\n\n return workInProgress.child;\n }\n\n return {\n beginWork: beginWork,\n beginFailedWork: beginFailedWork\n };\n};\n\nvar ReactFiberCompleteWork = function (config, hostContext, hydrationContext) {\n var createInstance = config.createInstance,\n createTextInstance = config.createTextInstance,\n appendInitialChild = config.appendInitialChild,\n finalizeInitialChildren = config.finalizeInitialChildren,\n prepareUpdate = config.prepareUpdate,\n mutation = config.mutation,\n persistence = config.persistence;\n var getRootHostContainer = hostContext.getRootHostContainer,\n popHostContext = hostContext.popHostContext,\n getHostContext = hostContext.getHostContext,\n popHostContainer = hostContext.popHostContainer;\n var prepareToHydrateHostInstance = hydrationContext.prepareToHydrateHostInstance,\n prepareToHydrateHostTextInstance = hydrationContext.prepareToHydrateHostTextInstance,\n popHydrationState = hydrationContext.popHydrationState;\n\n\n function markUpdate(workInProgress) {\n // Tag the fiber with an update effect. This turns a Placement into\n // an UpdateAndPlacement.\n workInProgress.effectTag |= Update;\n }\n\n function markRef(workInProgress) {\n workInProgress.effectTag |= Ref;\n }\n\n function appendAllReturns(returns, workInProgress) {\n var node = workInProgress.stateNode;\n if (node) {\n node['return'] = workInProgress;\n }\n while (node !== null) {\n if (node.tag === HostComponent || node.tag === HostText || node.tag === HostPortal) {\n invariant(false, 'A call cannot have host component children.');\n } else if (node.tag === ReturnComponent) {\n returns.push(node.type);\n } else if (node.child !== null) {\n node.child['return'] = node;\n node = node.child;\n continue;\n }\n while (node.sibling === null) {\n if (node['return'] === null || node['return'] === workInProgress) {\n return;\n }\n node = node['return'];\n }\n node.sibling['return'] = node['return'];\n node = node.sibling;\n }\n }\n\n function moveCallToHandlerPhase(current, workInProgress, renderExpirationTime) {\n var call = workInProgress.memoizedProps;\n !call ? invariant(false, 'Should be resolved by now. This error is likely caused by a bug in React. Please file an issue.') : void 0;\n\n // First step of the call has completed. Now we need to do the second.\n // TODO: It would be nice to have a multi stage call represented by a\n // single component, or at least tail call optimize nested ones. Currently\n // that requires additional fields that we don't want to add to the fiber.\n // So this requires nested handlers.\n // Note: This doesn't mutate the alternate node. I don't think it needs to\n // since this stage is reset for every pass.\n workInProgress.tag = CallHandlerPhase;\n\n // Build up the returns.\n // TODO: Compare this to a generator or opaque helpers like Children.\n var returns = [];\n appendAllReturns(returns, workInProgress);\n var fn = call.handler;\n var props = call.props;\n var nextChildren = fn(props, returns);\n\n var currentFirstChild = current !== null ? current.child : null;\n workInProgress.child = reconcileChildFibers(workInProgress, currentFirstChild, nextChildren, renderExpirationTime);\n return workInProgress.child;\n }\n\n function appendAllChildren(parent, workInProgress) {\n // We only have the top Fiber that was created but we need recurse down its\n // children to find all the terminal nodes.\n var node = workInProgress.child;\n while (node !== null) {\n if (node.tag === HostComponent || node.tag === HostText) {\n appendInitialChild(parent, node.stateNode);\n } else if (node.tag === HostPortal) {\n // If we have a portal child, then we don't want to traverse\n // down its children. Instead, we'll get insertions from each child in\n // the portal directly.\n } else if (node.child !== null) {\n node.child['return'] = node;\n node = node.child;\n continue;\n }\n if (node === workInProgress) {\n return;\n }\n while (node.sibling === null) {\n if (node['return'] === null || node['return'] === workInProgress) {\n return;\n }\n node = node['return'];\n }\n node.sibling['return'] = node['return'];\n node = node.sibling;\n }\n }\n\n var updateHostContainer = void 0;\n var updateHostComponent = void 0;\n var updateHostText = void 0;\n if (mutation) {\n if (enableMutatingReconciler) {\n // Mutation mode\n updateHostContainer = function (workInProgress) {\n // Noop\n };\n updateHostComponent = function (current, workInProgress, updatePayload, type, oldProps, newProps, rootContainerInstance) {\n // TODO: Type this specific to this type of component.\n workInProgress.updateQueue = updatePayload;\n // If the update payload indicates that there is a change or if there\n // is a new ref we mark this as an update. All the work is done in commitWork.\n if (updatePayload) {\n markUpdate(workInProgress);\n }\n };\n updateHostText = function (current, workInProgress, oldText, newText) {\n // If the text differs, mark it as an update. All the work in done in commitWork.\n if (oldText !== newText) {\n markUpdate(workInProgress);\n }\n };\n } else {\n invariant(false, 'Mutating reconciler is disabled.');\n }\n } else if (persistence) {\n if (enablePersistentReconciler) {\n // Persistent host tree mode\n var cloneInstance = persistence.cloneInstance,\n createContainerChildSet = persistence.createContainerChildSet,\n appendChildToContainerChildSet = persistence.appendChildToContainerChildSet,\n finalizeContainerChildren = persistence.finalizeContainerChildren;\n\n // An unfortunate fork of appendAllChildren because we have two different parent types.\n\n var appendAllChildrenToContainer = function (containerChildSet, workInProgress) {\n // We only have the top Fiber that was created but we need recurse down its\n // children to find all the terminal nodes.\n var node = workInProgress.child;\n while (node !== null) {\n if (node.tag === HostComponent || node.tag === HostText) {\n appendChildToContainerChildSet(containerChildSet, node.stateNode);\n } else if (node.tag === HostPortal) {\n // If we have a portal child, then we don't want to traverse\n // down its children. Instead, we'll get insertions from each child in\n // the portal directly.\n } else if (node.child !== null) {\n node.child['return'] = node;\n node = node.child;\n continue;\n }\n if (node === workInProgress) {\n return;\n }\n while (node.sibling === null) {\n if (node['return'] === null || node['return'] === workInProgress) {\n return;\n }\n node = node['return'];\n }\n node.sibling['return'] = node['return'];\n node = node.sibling;\n }\n };\n updateHostContainer = function (workInProgress) {\n var portalOrRoot = workInProgress.stateNode;\n var childrenUnchanged = workInProgress.firstEffect === null;\n if (childrenUnchanged) {\n // No changes, just reuse the existing instance.\n } else {\n var container = portalOrRoot.containerInfo;\n var newChildSet = createContainerChildSet(container);\n if (finalizeContainerChildren(container, newChildSet)) {\n markUpdate(workInProgress);\n }\n portalOrRoot.pendingChildren = newChildSet;\n // If children might have changed, we have to add them all to the set.\n appendAllChildrenToContainer(newChildSet, workInProgress);\n // Schedule an update on the container to swap out the container.\n markUpdate(workInProgress);\n }\n };\n updateHostComponent = function (current, workInProgress, updatePayload, type, oldProps, newProps, rootContainerInstance) {\n // If there are no effects associated with this node, then none of our children had any updates.\n // This guarantees that we can reuse all of them.\n var childrenUnchanged = workInProgress.firstEffect === null;\n var currentInstance = current.stateNode;\n if (childrenUnchanged && updatePayload === null) {\n // No changes, just reuse the existing instance.\n // Note that this might release a previous clone.\n workInProgress.stateNode = currentInstance;\n } else {\n var recyclableInstance = workInProgress.stateNode;\n var newInstance = cloneInstance(currentInstance, updatePayload, type, oldProps, newProps, workInProgress, childrenUnchanged, recyclableInstance);\n if (finalizeInitialChildren(newInstance, type, newProps, rootContainerInstance)) {\n markUpdate(workInProgress);\n }\n workInProgress.stateNode = newInstance;\n if (childrenUnchanged) {\n // If there are no other effects in this tree, we need to flag this node as having one.\n // Even though we're not going to use it for anything.\n // Otherwise parents won't know that there are new children to propagate upwards.\n markUpdate(workInProgress);\n } else {\n // If children might have changed, we have to add them all to the set.\n appendAllChildren(newInstance, workInProgress);\n }\n }\n };\n updateHostText = function (current, workInProgress, oldText, newText) {\n if (oldText !== newText) {\n // If the text content differs, we'll create a new text instance for it.\n var rootContainerInstance = getRootHostContainer();\n var currentHostContext = getHostContext();\n workInProgress.stateNode = createTextInstance(newText, rootContainerInstance, currentHostContext, workInProgress);\n // We'll have to mark it as having an effect, even though we won't use the effect for anything.\n // This lets the parents know that at least one of their children has changed.\n markUpdate(workInProgress);\n }\n };\n } else {\n invariant(false, 'Persistent reconciler is disabled.');\n }\n } else {\n if (enableNoopReconciler) {\n // No host operations\n updateHostContainer = function (workInProgress) {\n // Noop\n };\n updateHostComponent = function (current, workInProgress, updatePayload, type, oldProps, newProps, rootContainerInstance) {\n // Noop\n };\n updateHostText = function (current, workInProgress, oldText, newText) {\n // Noop\n };\n } else {\n invariant(false, 'Noop reconciler is disabled.');\n }\n }\n\n function completeWork(current, workInProgress, renderExpirationTime) {\n // Get the latest props.\n var newProps = workInProgress.pendingProps;\n if (newProps === null) {\n newProps = workInProgress.memoizedProps;\n } else if (workInProgress.expirationTime !== Never || renderExpirationTime === Never) {\n // Reset the pending props, unless this was a down-prioritization.\n workInProgress.pendingProps = null;\n }\n\n switch (workInProgress.tag) {\n case FunctionalComponent:\n return null;\n case ClassComponent:\n {\n // We are leaving this subtree, so pop context if any.\n popContextProvider(workInProgress);\n return null;\n }\n case HostRoot:\n {\n popHostContainer(workInProgress);\n popTopLevelContextObject(workInProgress);\n var fiberRoot = workInProgress.stateNode;\n if (fiberRoot.pendingContext) {\n fiberRoot.context = fiberRoot.pendingContext;\n fiberRoot.pendingContext = null;\n }\n\n if (current === null || current.child === null) {\n // If we hydrated, pop so that we can delete any remaining children\n // that weren't hydrated.\n popHydrationState(workInProgress);\n // This resets the hacky state to fix isMounted before committing.\n // TODO: Delete this when we delete isMounted and findDOMNode.\n workInProgress.effectTag &= ~Placement;\n }\n updateHostContainer(workInProgress);\n return null;\n }\n case HostComponent:\n {\n popHostContext(workInProgress);\n var rootContainerInstance = getRootHostContainer();\n var type = workInProgress.type;\n if (current !== null && workInProgress.stateNode != null) {\n // If we have an alternate, that means this is an update and we need to\n // schedule a side-effect to do the updates.\n var oldProps = current.memoizedProps;\n // If we get updated because one of our children updated, we don't\n // have newProps so we'll have to reuse them.\n // TODO: Split the update API as separate for the props vs. children.\n // Even better would be if children weren't special cased at all tho.\n var instance = workInProgress.stateNode;\n var currentHostContext = getHostContext();\n var updatePayload = prepareUpdate(instance, type, oldProps, newProps, rootContainerInstance, currentHostContext);\n\n updateHostComponent(current, workInProgress, updatePayload, type, oldProps, newProps, rootContainerInstance);\n\n if (current.ref !== workInProgress.ref) {\n markRef(workInProgress);\n }\n } else {\n if (!newProps) {\n !(workInProgress.stateNode !== null) ? invariant(false, 'We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue.') : void 0;\n // This can happen when we abort work.\n return null;\n }\n\n var _currentHostContext = getHostContext();\n // TODO: Move createInstance to beginWork and keep it on a context\n // \"stack\" as the parent. Then append children as we go in beginWork\n // or completeWork depending on we want to add then top->down or\n // bottom->up. Top->down is faster in IE11.\n var wasHydrated = popHydrationState(workInProgress);\n if (wasHydrated) {\n // TODO: Move this and createInstance step into the beginPhase\n // to consolidate.\n if (prepareToHydrateHostInstance(workInProgress, rootContainerInstance, _currentHostContext)) {\n // If changes to the hydrated node needs to be applied at the\n // commit-phase we mark this as such.\n markUpdate(workInProgress);\n }\n } else {\n var _instance = createInstance(type, newProps, rootContainerInstance, _currentHostContext, workInProgress);\n\n appendAllChildren(_instance, workInProgress);\n\n // Certain renderers require commit-time effects for initial mount.\n // (eg DOM renderer supports auto-focus for certain elements).\n // Make sure such renderers get scheduled for later work.\n if (finalizeInitialChildren(_instance, type, newProps, rootContainerInstance)) {\n markUpdate(workInProgress);\n }\n workInProgress.stateNode = _instance;\n }\n\n if (workInProgress.ref !== null) {\n // If there is a ref on a host node we need to schedule a callback\n markRef(workInProgress);\n }\n }\n return null;\n }\n case HostText:\n {\n var newText = newProps;\n if (current && workInProgress.stateNode != null) {\n var oldText = current.memoizedProps;\n // If we have an alternate, that means this is an update and we need\n // to schedule a side-effect to do the updates.\n updateHostText(current, workInProgress, oldText, newText);\n } else {\n if (typeof newText !== 'string') {\n !(workInProgress.stateNode !== null) ? invariant(false, 'We must have new props for new mounts. This error is likely caused by a bug in React. Please file an issue.') : void 0;\n // This can happen when we abort work.\n return null;\n }\n var _rootContainerInstance = getRootHostContainer();\n var _currentHostContext2 = getHostContext();\n var _wasHydrated = popHydrationState(workInProgress);\n if (_wasHydrated) {\n if (prepareToHydrateHostTextInstance(workInProgress)) {\n markUpdate(workInProgress);\n }\n } else {\n workInProgress.stateNode = createTextInstance(newText, _rootContainerInstance, _currentHostContext2, workInProgress);\n }\n }\n return null;\n }\n case CallComponent:\n return moveCallToHandlerPhase(current, workInProgress, renderExpirationTime);\n case CallHandlerPhase:\n // Reset the tag to now be a first phase call.\n workInProgress.tag = CallComponent;\n return null;\n case ReturnComponent:\n // Does nothing.\n return null;\n case Fragment:\n return null;\n case HostPortal:\n popHostContainer(workInProgress);\n updateHostContainer(workInProgress);\n return null;\n // Error cases\n case IndeterminateComponent:\n invariant(false, 'An indeterminate component should have become determinate before completing. This error is likely caused by a bug in React. Please file an issue.');\n // eslint-disable-next-line no-fallthrough\n default:\n invariant(false, 'Unknown unit of work tag. This error is likely caused by a bug in React. Please file an issue.');\n }\n }\n\n return {\n completeWork: completeWork\n };\n};\n\nvar invokeGuardedCallback$2 = ReactErrorUtils.invokeGuardedCallback;\nvar hasCaughtError$1 = ReactErrorUtils.hasCaughtError;\nvar clearCaughtError$1 = ReactErrorUtils.clearCaughtError;\n\n\nvar ReactFiberCommitWork = function (config, captureError) {\n var getPublicInstance = config.getPublicInstance,\n mutation = config.mutation,\n persistence = config.persistence;\n\n\n var callComponentWillUnmountWithTimer = function (current, instance) {\n startPhaseTimer(current, 'componentWillUnmount');\n instance.props = current.memoizedProps;\n instance.state = current.memoizedState;\n instance.componentWillUnmount();\n stopPhaseTimer();\n };\n\n // Capture errors so they don't interrupt unmounting.\n function safelyCallComponentWillUnmount(current, instance) {\n {\n invokeGuardedCallback$2(null, callComponentWillUnmountWithTimer, null, current, instance);\n if (hasCaughtError$1()) {\n var unmountError = clearCaughtError$1();\n captureError(current, unmountError);\n }\n }\n }\n\n function safelyDetachRef(current) {\n var ref = current.ref;\n if (ref !== null) {\n {\n invokeGuardedCallback$2(null, ref, null, null);\n if (hasCaughtError$1()) {\n var refError = clearCaughtError$1();\n captureError(current, refError);\n }\n }\n }\n }\n\n function commitLifeCycles(current, finishedWork) {\n switch (finishedWork.tag) {\n case ClassComponent:\n {\n var instance = finishedWork.stateNode;\n if (finishedWork.effectTag & Update) {\n if (current === null) {\n startPhaseTimer(finishedWork, 'componentDidMount');\n instance.props = finishedWork.memoizedProps;\n instance.state = finishedWork.memoizedState;\n instance.componentDidMount();\n stopPhaseTimer();\n } else {\n var prevProps = current.memoizedProps;\n var prevState = current.memoizedState;\n startPhaseTimer(finishedWork, 'componentDidUpdate');\n instance.props = finishedWork.memoizedProps;\n instance.state = finishedWork.memoizedState;\n instance.componentDidUpdate(prevProps, prevState);\n stopPhaseTimer();\n }\n }\n var updateQueue = finishedWork.updateQueue;\n if (updateQueue !== null) {\n commitCallbacks(updateQueue, instance);\n }\n return;\n }\n case HostRoot:\n {\n var _updateQueue = finishedWork.updateQueue;\n if (_updateQueue !== null) {\n var _instance = finishedWork.child !== null ? finishedWork.child.stateNode : null;\n commitCallbacks(_updateQueue, _instance);\n }\n return;\n }\n case HostComponent:\n {\n var _instance2 = finishedWork.stateNode;\n\n // Renderers may schedule work to be done after host components are mounted\n // (eg DOM renderer may schedule auto-focus for inputs and form controls).\n // These effects should only be committed when components are first mounted,\n // aka when there is no current/alternate.\n if (current === null && finishedWork.effectTag & Update) {\n var type = finishedWork.type;\n var props = finishedWork.memoizedProps;\n commitMount(_instance2, type, props, finishedWork);\n }\n\n return;\n }\n case HostText:\n {\n // We have no life-cycles associated with text.\n return;\n }\n case HostPortal:\n {\n // We have no life-cycles associated with portals.\n return;\n }\n default:\n {\n invariant(false, 'This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue.');\n }\n }\n }\n\n function commitAttachRef(finishedWork) {\n var ref = finishedWork.ref;\n if (ref !== null) {\n var instance = finishedWork.stateNode;\n switch (finishedWork.tag) {\n case HostComponent:\n ref(getPublicInstance(instance));\n break;\n default:\n ref(instance);\n }\n }\n }\n\n function commitDetachRef(current) {\n var currentRef = current.ref;\n if (currentRef !== null) {\n currentRef(null);\n }\n }\n\n // User-originating errors (lifecycles and refs) should not interrupt\n // deletion, so don't let them throw. Host-originating errors should\n // interrupt deletion, so it's okay\n function commitUnmount(current) {\n if (typeof onCommitUnmount === 'function') {\n onCommitUnmount(current);\n }\n\n switch (current.tag) {\n case ClassComponent:\n {\n safelyDetachRef(current);\n var instance = current.stateNode;\n if (typeof instance.componentWillUnmount === 'function') {\n safelyCallComponentWillUnmount(current, instance);\n }\n return;\n }\n case HostComponent:\n {\n safelyDetachRef(current);\n return;\n }\n case CallComponent:\n {\n commitNestedUnmounts(current.stateNode);\n return;\n }\n case HostPortal:\n {\n // TODO: this is recursive.\n // We are also not using this parent because\n // the portal will get pushed immediately.\n if (enableMutatingReconciler && mutation) {\n unmountHostComponents(current);\n } else if (enablePersistentReconciler && persistence) {\n emptyPortalContainer(current);\n }\n return;\n }\n }\n }\n\n function commitNestedUnmounts(root) {\n // While we're inside a removed host node we don't want to call\n // removeChild on the inner nodes because they're removed by the top\n // call anyway. We also want to call componentWillUnmount on all\n // composites before this host node is removed from the tree. Therefore\n var node = root;\n while (true) {\n commitUnmount(node);\n // Visit children because they may contain more composite or host nodes.\n // Skip portals because commitUnmount() currently visits them recursively.\n if (node.child !== null && (\n // If we use mutation we drill down into portals using commitUnmount above.\n // If we don't use mutation we drill down into portals here instead.\n !mutation || node.tag !== HostPortal)) {\n node.child['return'] = node;\n node = node.child;\n continue;\n }\n if (node === root) {\n return;\n }\n while (node.sibling === null) {\n if (node['return'] === null || node['return'] === root) {\n return;\n }\n node = node['return'];\n }\n node.sibling['return'] = node['return'];\n node = node.sibling;\n }\n }\n\n function detachFiber(current) {\n // Cut off the return pointers to disconnect it from the tree. Ideally, we\n // should clear the child pointer of the parent alternate to let this\n // get GC:ed but we don't know which for sure which parent is the current\n // one so we'll settle for GC:ing the subtree of this child. This child\n // itself will be GC:ed when the parent updates the next time.\n current['return'] = null;\n current.child = null;\n if (current.alternate) {\n current.alternate.child = null;\n current.alternate['return'] = null;\n }\n }\n\n if (!mutation) {\n var commitContainer = void 0;\n if (persistence) {\n var replaceContainerChildren = persistence.replaceContainerChildren,\n createContainerChildSet = persistence.createContainerChildSet;\n\n var emptyPortalContainer = function (current) {\n var portal = current.stateNode;\n var containerInfo = portal.containerInfo;\n\n var emptyChildSet = createContainerChildSet(containerInfo);\n replaceContainerChildren(containerInfo, emptyChildSet);\n };\n commitContainer = function (finishedWork) {\n switch (finishedWork.tag) {\n case ClassComponent:\n {\n return;\n }\n case HostComponent:\n {\n return;\n }\n case HostText:\n {\n return;\n }\n case HostRoot:\n case HostPortal:\n {\n var portalOrRoot = finishedWork.stateNode;\n var containerInfo = portalOrRoot.containerInfo,\n _pendingChildren = portalOrRoot.pendingChildren;\n\n replaceContainerChildren(containerInfo, _pendingChildren);\n return;\n }\n default:\n {\n invariant(false, 'This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue.');\n }\n }\n };\n } else {\n commitContainer = function (finishedWork) {\n // Noop\n };\n }\n if (enablePersistentReconciler || enableNoopReconciler) {\n return {\n commitResetTextContent: function (finishedWork) {},\n commitPlacement: function (finishedWork) {},\n commitDeletion: function (current) {\n // Detach refs and call componentWillUnmount() on the whole subtree.\n commitNestedUnmounts(current);\n detachFiber(current);\n },\n commitWork: function (current, finishedWork) {\n commitContainer(finishedWork);\n },\n\n commitLifeCycles: commitLifeCycles,\n commitAttachRef: commitAttachRef,\n commitDetachRef: commitDetachRef\n };\n } else if (persistence) {\n invariant(false, 'Persistent reconciler is disabled.');\n } else {\n invariant(false, 'Noop reconciler is disabled.');\n }\n }\n var commitMount = mutation.commitMount,\n commitUpdate = mutation.commitUpdate,\n resetTextContent = mutation.resetTextContent,\n commitTextUpdate = mutation.commitTextUpdate,\n appendChild = mutation.appendChild,\n appendChildToContainer = mutation.appendChildToContainer,\n insertBefore = mutation.insertBefore,\n insertInContainerBefore = mutation.insertInContainerBefore,\n removeChild = mutation.removeChild,\n removeChildFromContainer = mutation.removeChildFromContainer;\n\n\n function getHostParentFiber(fiber) {\n var parent = fiber['return'];\n while (parent !== null) {\n if (isHostParent(parent)) {\n return parent;\n }\n parent = parent['return'];\n }\n invariant(false, 'Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue.');\n }\n\n function isHostParent(fiber) {\n return fiber.tag === HostComponent || fiber.tag === HostRoot || fiber.tag === HostPortal;\n }\n\n function getHostSibling(fiber) {\n // We're going to search forward into the tree until we find a sibling host\n // node. Unfortunately, if multiple insertions are done in a row we have to\n // search past them. This leads to exponential search for the next sibling.\n var node = fiber;\n siblings: while (true) {\n // If we didn't find anything, let's try the next sibling.\n while (node.sibling === null) {\n if (node['return'] === null || isHostParent(node['return'])) {\n // If we pop out of the root or hit the parent the fiber we are the\n // last sibling.\n return null;\n }\n node = node['return'];\n }\n node.sibling['return'] = node['return'];\n node = node.sibling;\n while (node.tag !== HostComponent && node.tag !== HostText) {\n // If it is not host node and, we might have a host node inside it.\n // Try to search down until we find one.\n if (node.effectTag & Placement) {\n // If we don't have a child, try the siblings instead.\n continue siblings;\n }\n // If we don't have a child, try the siblings instead.\n // We also skip portals because they are not part of this host tree.\n if (node.child === null || node.tag === HostPortal) {\n continue siblings;\n } else {\n node.child['return'] = node;\n node = node.child;\n }\n }\n // Check if this host node is stable or about to be placed.\n if (!(node.effectTag & Placement)) {\n // Found it!\n return node.stateNode;\n }\n }\n }\n\n function commitPlacement(finishedWork) {\n // Recursively insert all host nodes into the parent.\n var parentFiber = getHostParentFiber(finishedWork);\n var parent = void 0;\n var isContainer = void 0;\n switch (parentFiber.tag) {\n case HostComponent:\n parent = parentFiber.stateNode;\n isContainer = false;\n break;\n case HostRoot:\n parent = parentFiber.stateNode.containerInfo;\n isContainer = true;\n break;\n case HostPortal:\n parent = parentFiber.stateNode.containerInfo;\n isContainer = true;\n break;\n default:\n invariant(false, 'Invalid host parent fiber. This error is likely caused by a bug in React. Please file an issue.');\n }\n if (parentFiber.effectTag & ContentReset) {\n // Reset the text content of the parent before doing any insertions\n resetTextContent(parent);\n // Clear ContentReset from the effect tag\n parentFiber.effectTag &= ~ContentReset;\n }\n\n var before = getHostSibling(finishedWork);\n // We only have the top Fiber that was inserted but we need recurse down its\n // children to find all the terminal nodes.\n var node = finishedWork;\n while (true) {\n if (node.tag === HostComponent || node.tag === HostText) {\n if (before) {\n if (isContainer) {\n insertInContainerBefore(parent, node.stateNode, before);\n } else {\n insertBefore(parent, node.stateNode, before);\n }\n } else {\n if (isContainer) {\n appendChildToContainer(parent, node.stateNode);\n } else {\n appendChild(parent, node.stateNode);\n }\n }\n } else if (node.tag === HostPortal) {\n // If the insertion itself is a portal, then we don't want to traverse\n // down its children. Instead, we'll get insertions from each child in\n // the portal directly.\n } else if (node.child !== null) {\n node.child['return'] = node;\n node = node.child;\n continue;\n }\n if (node === finishedWork) {\n return;\n }\n while (node.sibling === null) {\n if (node['return'] === null || node['return'] === finishedWork) {\n return;\n }\n node = node['return'];\n }\n node.sibling['return'] = node['return'];\n node = node.sibling;\n }\n }\n\n function unmountHostComponents(current) {\n // We only have the top Fiber that was inserted but we need recurse down its\n var node = current;\n\n // Each iteration, currentParent is populated with node's host parent if not\n // currentParentIsValid.\n var currentParentIsValid = false;\n var currentParent = void 0;\n var currentParentIsContainer = void 0;\n\n while (true) {\n if (!currentParentIsValid) {\n var parent = node['return'];\n findParent: while (true) {\n !(parent !== null) ? invariant(false, 'Expected to find a host parent. This error is likely caused by a bug in React. Please file an issue.') : void 0;\n switch (parent.tag) {\n case HostComponent:\n currentParent = parent.stateNode;\n currentParentIsContainer = false;\n break findParent;\n case HostRoot:\n currentParent = parent.stateNode.containerInfo;\n currentParentIsContainer = true;\n break findParent;\n case HostPortal:\n currentParent = parent.stateNode.containerInfo;\n currentParentIsContainer = true;\n break findParent;\n }\n parent = parent['return'];\n }\n currentParentIsValid = true;\n }\n\n if (node.tag === HostComponent || node.tag === HostText) {\n commitNestedUnmounts(node);\n // After all the children have unmounted, it is now safe to remove the\n // node from the tree.\n if (currentParentIsContainer) {\n removeChildFromContainer(currentParent, node.stateNode);\n } else {\n removeChild(currentParent, node.stateNode);\n }\n // Don't visit children because we already visited them.\n } else if (node.tag === HostPortal) {\n // When we go into a portal, it becomes the parent to remove from.\n // We will reassign it back when we pop the portal on the way up.\n currentParent = node.stateNode.containerInfo;\n // Visit children because portals might contain host components.\n if (node.child !== null) {\n node.child['return'] = node;\n node = node.child;\n continue;\n }\n } else {\n commitUnmount(node);\n // Visit children because we may find more host components below.\n if (node.child !== null) {\n node.child['return'] = node;\n node = node.child;\n continue;\n }\n }\n if (node === current) {\n return;\n }\n while (node.sibling === null) {\n if (node['return'] === null || node['return'] === current) {\n return;\n }\n node = node['return'];\n if (node.tag === HostPortal) {\n // When we go out of the portal, we need to restore the parent.\n // Since we don't keep a stack of them, we will search for it.\n currentParentIsValid = false;\n }\n }\n node.sibling['return'] = node['return'];\n node = node.sibling;\n }\n }\n\n function commitDeletion(current) {\n // Recursively delete all host nodes from the parent.\n // Detach refs and call componentWillUnmount() on the whole subtree.\n unmountHostComponents(current);\n detachFiber(current);\n }\n\n function commitWork(current, finishedWork) {\n switch (finishedWork.tag) {\n case ClassComponent:\n {\n return;\n }\n case HostComponent:\n {\n var instance = finishedWork.stateNode;\n if (instance != null) {\n // Commit the work prepared earlier.\n var newProps = finishedWork.memoizedProps;\n // For hydration we reuse the update path but we treat the oldProps\n // as the newProps. The updatePayload will contain the real change in\n // this case.\n var oldProps = current !== null ? current.memoizedProps : newProps;\n var type = finishedWork.type;\n // TODO: Type the updateQueue to be specific to host components.\n var updatePayload = finishedWork.updateQueue;\n finishedWork.updateQueue = null;\n if (updatePayload !== null) {\n commitUpdate(instance, updatePayload, type, oldProps, newProps, finishedWork);\n }\n }\n return;\n }\n case HostText:\n {\n !(finishedWork.stateNode !== null) ? invariant(false, 'This should have a text node initialized. This error is likely caused by a bug in React. Please file an issue.') : void 0;\n var textInstance = finishedWork.stateNode;\n var newText = finishedWork.memoizedProps;\n // For hydration we reuse the update path but we treat the oldProps\n // as the newProps. The updatePayload will contain the real change in\n // this case.\n var oldText = current !== null ? current.memoizedProps : newText;\n commitTextUpdate(textInstance, oldText, newText);\n return;\n }\n case HostRoot:\n {\n return;\n }\n default:\n {\n invariant(false, 'This unit of work tag should not have side-effects. This error is likely caused by a bug in React. Please file an issue.');\n }\n }\n }\n\n function commitResetTextContent(current) {\n resetTextContent(current.stateNode);\n }\n\n if (enableMutatingReconciler) {\n return {\n commitResetTextContent: commitResetTextContent,\n commitPlacement: commitPlacement,\n commitDeletion: commitDeletion,\n commitWork: commitWork,\n commitLifeCycles: commitLifeCycles,\n commitAttachRef: commitAttachRef,\n commitDetachRef: commitDetachRef\n };\n } else {\n invariant(false, 'Mutating reconciler is disabled.');\n }\n};\n\nvar NO_CONTEXT = {};\n\nvar ReactFiberHostContext = function (config) {\n var getChildHostContext = config.getChildHostContext,\n getRootHostContext = config.getRootHostContext;\n\n\n var contextStackCursor = createCursor(NO_CONTEXT);\n var contextFiberStackCursor = createCursor(NO_CONTEXT);\n var rootInstanceStackCursor = createCursor(NO_CONTEXT);\n\n function requiredContext(c) {\n !(c !== NO_CONTEXT) ? invariant(false, 'Expected host context to exist. This error is likely caused by a bug in React. Please file an issue.') : void 0;\n return c;\n }\n\n function getRootHostContainer() {\n var rootInstance = requiredContext(rootInstanceStackCursor.current);\n return rootInstance;\n }\n\n function pushHostContainer(fiber, nextRootInstance) {\n // Push current root instance onto the stack;\n // This allows us to reset root when portals are popped.\n push(rootInstanceStackCursor, nextRootInstance, fiber);\n\n var nextRootContext = getRootHostContext(nextRootInstance);\n\n // Track the context and the Fiber that provided it.\n // This enables us to pop only Fibers that provide unique contexts.\n push(contextFiberStackCursor, fiber, fiber);\n push(contextStackCursor, nextRootContext, fiber);\n }\n\n function popHostContainer(fiber) {\n pop(contextStackCursor, fiber);\n pop(contextFiberStackCursor, fiber);\n pop(rootInstanceStackCursor, fiber);\n }\n\n function getHostContext() {\n var context = requiredContext(contextStackCursor.current);\n return context;\n }\n\n function pushHostContext(fiber) {\n var rootInstance = requiredContext(rootInstanceStackCursor.current);\n var context = requiredContext(contextStackCursor.current);\n var nextContext = getChildHostContext(context, fiber.type, rootInstance);\n\n // Don't push this Fiber's context unless it's unique.\n if (context === nextContext) {\n return;\n }\n\n // Track the context and the Fiber that provided it.\n // This enables us to pop only Fibers that provide unique contexts.\n push(contextFiberStackCursor, fiber, fiber);\n push(contextStackCursor, nextContext, fiber);\n }\n\n function popHostContext(fiber) {\n // Do not pop unless this Fiber provided the current context.\n // pushHostContext() only pushes Fibers that provide unique contexts.\n if (contextFiberStackCursor.current !== fiber) {\n return;\n }\n\n pop(contextStackCursor, fiber);\n pop(contextFiberStackCursor, fiber);\n }\n\n function resetHostContainer() {\n contextStackCursor.current = NO_CONTEXT;\n rootInstanceStackCursor.current = NO_CONTEXT;\n }\n\n return {\n getHostContext: getHostContext,\n getRootHostContainer: getRootHostContainer,\n popHostContainer: popHostContainer,\n popHostContext: popHostContext,\n pushHostContainer: pushHostContainer,\n pushHostContext: pushHostContext,\n resetHostContainer: resetHostContainer\n };\n};\n\nvar ReactFiberHydrationContext = function (config) {\n var shouldSetTextContent = config.shouldSetTextContent,\n hydration = config.hydration;\n\n // If this doesn't have hydration mode.\n\n if (!hydration) {\n return {\n enterHydrationState: function () {\n return false;\n },\n resetHydrationState: function () {},\n tryToClaimNextHydratableInstance: function () {},\n prepareToHydrateHostInstance: function () {\n invariant(false, 'Expected prepareToHydrateHostInstance() to never be called. This error is likely caused by a bug in React. Please file an issue.');\n },\n prepareToHydrateHostTextInstance: function () {\n invariant(false, 'Expected prepareToHydrateHostTextInstance() to never be called. This error is likely caused by a bug in React. Please file an issue.');\n },\n popHydrationState: function (fiber) {\n return false;\n }\n };\n }\n\n var canHydrateInstance = hydration.canHydrateInstance,\n canHydrateTextInstance = hydration.canHydrateTextInstance,\n getNextHydratableSibling = hydration.getNextHydratableSibling,\n getFirstHydratableChild = hydration.getFirstHydratableChild,\n hydrateInstance = hydration.hydrateInstance,\n hydrateTextInstance = hydration.hydrateTextInstance,\n didNotMatchHydratedContainerTextInstance = hydration.didNotMatchHydratedContainerTextInstance,\n didNotMatchHydratedTextInstance = hydration.didNotMatchHydratedTextInstance,\n didNotHydrateContainerInstance = hydration.didNotHydrateContainerInstance,\n didNotHydrateInstance = hydration.didNotHydrateInstance,\n didNotFindHydratableContainerInstance = hydration.didNotFindHydratableContainerInstance,\n didNotFindHydratableContainerTextInstance = hydration.didNotFindHydratableContainerTextInstance,\n didNotFindHydratableInstance = hydration.didNotFindHydratableInstance,\n didNotFindHydratableTextInstance = hydration.didNotFindHydratableTextInstance;\n\n // The deepest Fiber on the stack involved in a hydration context.\n // This may have been an insertion or a hydration.\n\n var hydrationParentFiber = null;\n var nextHydratableInstance = null;\n var isHydrating = false;\n\n function enterHydrationState(fiber) {\n var parentInstance = fiber.stateNode.containerInfo;\n nextHydratableInstance = getFirstHydratableChild(parentInstance);\n hydrationParentFiber = fiber;\n isHydrating = true;\n return true;\n }\n\n function deleteHydratableInstance(returnFiber, instance) {\n {\n switch (returnFiber.tag) {\n case HostRoot:\n didNotHydrateContainerInstance(returnFiber.stateNode.containerInfo, instance);\n break;\n case HostComponent:\n didNotHydrateInstance(returnFiber.type, returnFiber.memoizedProps, returnFiber.stateNode, instance);\n break;\n }\n }\n\n var childToDelete = createFiberFromHostInstanceForDeletion();\n childToDelete.stateNode = instance;\n childToDelete['return'] = returnFiber;\n childToDelete.effectTag = Deletion;\n\n // This might seem like it belongs on progressedFirstDeletion. However,\n // these children are not part of the reconciliation list of children.\n // Even if we abort and rereconcile the children, that will try to hydrate\n // again and the nodes are still in the host tree so these will be\n // recreated.\n if (returnFiber.lastEffect !== null) {\n returnFiber.lastEffect.nextEffect = childToDelete;\n returnFiber.lastEffect = childToDelete;\n } else {\n returnFiber.firstEffect = returnFiber.lastEffect = childToDelete;\n }\n }\n\n function insertNonHydratedInstance(returnFiber, fiber) {\n fiber.effectTag |= Placement;\n {\n switch (returnFiber.tag) {\n case HostRoot:\n {\n var parentContainer = returnFiber.stateNode.containerInfo;\n switch (fiber.tag) {\n case HostComponent:\n var type = fiber.type;\n var props = fiber.pendingProps;\n didNotFindHydratableContainerInstance(parentContainer, type, props);\n break;\n case HostText:\n var text = fiber.pendingProps;\n didNotFindHydratableContainerTextInstance(parentContainer, text);\n break;\n }\n break;\n }\n case HostComponent:\n {\n var parentType = returnFiber.type;\n var parentProps = returnFiber.memoizedProps;\n var parentInstance = returnFiber.stateNode;\n switch (fiber.tag) {\n case HostComponent:\n var _type = fiber.type;\n var _props = fiber.pendingProps;\n didNotFindHydratableInstance(parentType, parentProps, parentInstance, _type, _props);\n break;\n case HostText:\n var _text = fiber.pendingProps;\n didNotFindHydratableTextInstance(parentType, parentProps, parentInstance, _text);\n break;\n }\n break;\n }\n default:\n return;\n }\n }\n }\n\n function tryHydrate(fiber, nextInstance) {\n switch (fiber.tag) {\n case HostComponent:\n {\n var type = fiber.type;\n var props = fiber.pendingProps;\n var instance = canHydrateInstance(nextInstance, type, props);\n if (instance !== null) {\n fiber.stateNode = instance;\n return true;\n }\n return false;\n }\n case HostText:\n {\n var text = fiber.pendingProps;\n var textInstance = canHydrateTextInstance(nextInstance, text);\n if (textInstance !== null) {\n fiber.stateNode = textInstance;\n return true;\n }\n return false;\n }\n default:\n return false;\n }\n }\n\n function tryToClaimNextHydratableInstance(fiber) {\n if (!isHydrating) {\n return;\n }\n var nextInstance = nextHydratableInstance;\n if (!nextInstance) {\n // Nothing to hydrate. Make it an insertion.\n insertNonHydratedInstance(hydrationParentFiber, fiber);\n isHydrating = false;\n hydrationParentFiber = fiber;\n return;\n }\n if (!tryHydrate(fiber, nextInstance)) {\n // If we can't hydrate this instance let's try the next one.\n // We use this as a heuristic. It's based on intuition and not data so it\n // might be flawed or unnecessary.\n nextInstance = getNextHydratableSibling(nextInstance);\n if (!nextInstance || !tryHydrate(fiber, nextInstance)) {\n // Nothing to hydrate. Make it an insertion.\n insertNonHydratedInstance(hydrationParentFiber, fiber);\n isHydrating = false;\n hydrationParentFiber = fiber;\n return;\n }\n // We matched the next one, we'll now assume that the first one was\n // superfluous and we'll delete it. Since we can't eagerly delete it\n // we'll have to schedule a deletion. To do that, this node needs a dummy\n // fiber associated with it.\n deleteHydratableInstance(hydrationParentFiber, nextHydratableInstance);\n }\n hydrationParentFiber = fiber;\n nextHydratableInstance = getFirstHydratableChild(nextInstance);\n }\n\n function prepareToHydrateHostInstance(fiber, rootContainerInstance, hostContext) {\n var instance = fiber.stateNode;\n var updatePayload = hydrateInstance(instance, fiber.type, fiber.memoizedProps, rootContainerInstance, hostContext, fiber);\n // TODO: Type this specific to this type of component.\n fiber.updateQueue = updatePayload;\n // If the update payload indicates that there is a change or if there\n // is a new ref we mark this as an update.\n if (updatePayload !== null) {\n return true;\n }\n return false;\n }\n\n function prepareToHydrateHostTextInstance(fiber) {\n var textInstance = fiber.stateNode;\n var textContent = fiber.memoizedProps;\n var shouldUpdate = hydrateTextInstance(textInstance, textContent, fiber);\n {\n if (shouldUpdate) {\n // We assume that prepareToHydrateHostTextInstance is called in a context where the\n // hydration parent is the parent host component of this host text.\n var returnFiber = hydrationParentFiber;\n if (returnFiber !== null) {\n switch (returnFiber.tag) {\n case HostRoot:\n {\n var parentContainer = returnFiber.stateNode.containerInfo;\n didNotMatchHydratedContainerTextInstance(parentContainer, textInstance, textContent);\n break;\n }\n case HostComponent:\n {\n var parentType = returnFiber.type;\n var parentProps = returnFiber.memoizedProps;\n var parentInstance = returnFiber.stateNode;\n didNotMatchHydratedTextInstance(parentType, parentProps, parentInstance, textInstance, textContent);\n break;\n }\n }\n }\n }\n }\n return shouldUpdate;\n }\n\n function popToNextHostParent(fiber) {\n var parent = fiber['return'];\n while (parent !== null && parent.tag !== HostComponent && parent.tag !== HostRoot) {\n parent = parent['return'];\n }\n hydrationParentFiber = parent;\n }\n\n function popHydrationState(fiber) {\n if (fiber !== hydrationParentFiber) {\n // We're deeper than the current hydration context, inside an inserted\n // tree.\n return false;\n }\n if (!isHydrating) {\n // If we're not currently hydrating but we're in a hydration context, then\n // we were an insertion and now need to pop up reenter hydration of our\n // siblings.\n popToNextHostParent(fiber);\n isHydrating = true;\n return false;\n }\n\n var type = fiber.type;\n\n // If we have any remaining hydratable nodes, we need to delete them now.\n // We only do this deeper than head and body since they tend to have random\n // other nodes in them. We also ignore components with pure text content in\n // side of them.\n // TODO: Better heuristic.\n if (fiber.tag !== HostComponent || type !== 'head' && type !== 'body' && !shouldSetTextContent(type, fiber.memoizedProps)) {\n var nextInstance = nextHydratableInstance;\n while (nextInstance) {\n deleteHydratableInstance(fiber, nextInstance);\n nextInstance = getNextHydratableSibling(nextInstance);\n }\n }\n\n popToNextHostParent(fiber);\n nextHydratableInstance = hydrationParentFiber ? getNextHydratableSibling(fiber.stateNode) : null;\n return true;\n }\n\n function resetHydrationState() {\n hydrationParentFiber = null;\n nextHydratableInstance = null;\n isHydrating = false;\n }\n\n return {\n enterHydrationState: enterHydrationState,\n resetHydrationState: resetHydrationState,\n tryToClaimNextHydratableInstance: tryToClaimNextHydratableInstance,\n prepareToHydrateHostInstance: prepareToHydrateHostInstance,\n prepareToHydrateHostTextInstance: prepareToHydrateHostTextInstance,\n popHydrationState: popHydrationState\n };\n};\n\n// This lets us hook into Fiber to debug what it's doing.\n// See https://github.com/facebook/react/pull/8033.\n// This is not part of the public API, not even for React DevTools.\n// You may only inject a debugTool if you work on React Fiber itself.\nvar ReactFiberInstrumentation = {\n debugTool: null\n};\n\nvar ReactFiberInstrumentation_1 = ReactFiberInstrumentation;\n\nvar defaultShowDialog = function (capturedError) {\n return true;\n};\n\nvar showDialog = defaultShowDialog;\n\nfunction logCapturedError(capturedError) {\n var logError = showDialog(capturedError);\n\n // Allow injected showDialog() to prevent default console.error logging.\n // This enables renderers like ReactNative to better manage redbox behavior.\n if (logError === false) {\n return;\n }\n\n var error = capturedError.error;\n var suppressLogging = error && error.suppressReactErrorLogging;\n if (suppressLogging) {\n return;\n }\n\n {\n var componentName = capturedError.componentName,\n componentStack = capturedError.componentStack,\n errorBoundaryName = capturedError.errorBoundaryName,\n errorBoundaryFound = capturedError.errorBoundaryFound,\n willRetry = capturedError.willRetry;\n\n\n var componentNameMessage = componentName ? 'The above error occurred in the <' + componentName + '> component:' : 'The above error occurred in one of your React components:';\n\n var errorBoundaryMessage = void 0;\n // errorBoundaryFound check is sufficient; errorBoundaryName check is to satisfy Flow.\n if (errorBoundaryFound && errorBoundaryName) {\n if (willRetry) {\n errorBoundaryMessage = 'React will try to recreate this component tree from scratch ' + ('using the error boundary you provided, ' + errorBoundaryName + '.');\n } else {\n errorBoundaryMessage = 'This error was initially handled by the error boundary ' + errorBoundaryName + '.\\n' + 'Recreating the tree from scratch failed so React will unmount the tree.';\n }\n } else {\n errorBoundaryMessage = 'Consider adding an error boundary to your tree to customize error handling behavior.\\n' + 'Visit https://fb.me/react-error-boundaries to learn more about error boundaries.';\n }\n var combinedMessage = '' + componentNameMessage + componentStack + '\\n\\n' + ('' + errorBoundaryMessage);\n\n // In development, we provide our own message with just the component stack.\n // We don't include the original error message and JS stack because the browser\n // has already printed it. Even if the application swallows the error, it is still\n // displayed by the browser thanks to the DEV-only fake event trick in ReactErrorUtils.\n console.error(combinedMessage);\n }\n}\n\nvar invokeGuardedCallback$1 = ReactErrorUtils.invokeGuardedCallback;\nvar hasCaughtError = ReactErrorUtils.hasCaughtError;\nvar clearCaughtError = ReactErrorUtils.clearCaughtError;\n\n\n{\n var didWarnAboutStateTransition = false;\n var didWarnSetStateChildContext = false;\n var didWarnStateUpdateForUnmountedComponent = {};\n\n var warnAboutUpdateOnUnmounted = function (fiber) {\n var componentName = getComponentName(fiber) || 'ReactClass';\n if (didWarnStateUpdateForUnmountedComponent[componentName]) {\n return;\n }\n warning(false, 'Can only update a mounted or mounting ' + 'component. This usually means you called setState, replaceState, ' + 'or forceUpdate on an unmounted component. This is a no-op.\\n\\nPlease ' + 'check the code for the %s component.', componentName);\n didWarnStateUpdateForUnmountedComponent[componentName] = true;\n };\n\n var warnAboutInvalidUpdates = function (instance) {\n switch (ReactDebugCurrentFiber.phase) {\n case 'getChildContext':\n if (didWarnSetStateChildContext) {\n return;\n }\n warning(false, 'setState(...): Cannot call setState() inside getChildContext()');\n didWarnSetStateChildContext = true;\n break;\n case 'render':\n if (didWarnAboutStateTransition) {\n return;\n }\n warning(false, 'Cannot update during an existing state transition (such as within ' + \"`render` or another component's constructor). Render methods should \" + 'be a pure function of props and state; constructor side-effects are ' + 'an anti-pattern, but can be moved to `componentWillMount`.');\n didWarnAboutStateTransition = true;\n break;\n }\n };\n}\n\nvar ReactFiberScheduler = function (config) {\n var hostContext = ReactFiberHostContext(config);\n var hydrationContext = ReactFiberHydrationContext(config);\n var popHostContainer = hostContext.popHostContainer,\n popHostContext = hostContext.popHostContext,\n resetHostContainer = hostContext.resetHostContainer;\n\n var _ReactFiberBeginWork = ReactFiberBeginWork(config, hostContext, hydrationContext, scheduleWork, computeExpirationForFiber),\n beginWork = _ReactFiberBeginWork.beginWork,\n beginFailedWork = _ReactFiberBeginWork.beginFailedWork;\n\n var _ReactFiberCompleteWo = ReactFiberCompleteWork(config, hostContext, hydrationContext),\n completeWork = _ReactFiberCompleteWo.completeWork;\n\n var _ReactFiberCommitWork = ReactFiberCommitWork(config, captureError),\n commitResetTextContent = _ReactFiberCommitWork.commitResetTextContent,\n commitPlacement = _ReactFiberCommitWork.commitPlacement,\n commitDeletion = _ReactFiberCommitWork.commitDeletion,\n commitWork = _ReactFiberCommitWork.commitWork,\n commitLifeCycles = _ReactFiberCommitWork.commitLifeCycles,\n commitAttachRef = _ReactFiberCommitWork.commitAttachRef,\n commitDetachRef = _ReactFiberCommitWork.commitDetachRef;\n\n var now = config.now,\n scheduleDeferredCallback = config.scheduleDeferredCallback,\n cancelDeferredCallback = config.cancelDeferredCallback,\n useSyncScheduling = config.useSyncScheduling,\n prepareForCommit = config.prepareForCommit,\n resetAfterCommit = config.resetAfterCommit;\n\n // Represents the current time in ms.\n\n var startTime = now();\n var mostRecentCurrentTime = msToExpirationTime(0);\n\n // Represents the expiration time that incoming updates should use. (If this\n // is NoWork, use the default strategy: async updates in async mode, sync\n // updates in sync mode.)\n var expirationContext = NoWork;\n\n var isWorking = false;\n\n // The next work in progress fiber that we're currently working on.\n var nextUnitOfWork = null;\n var nextRoot = null;\n // The time at which we're currently rendering work.\n var nextRenderExpirationTime = NoWork;\n\n // The next fiber with an effect that we're currently committing.\n var nextEffect = null;\n\n // Keep track of which fibers have captured an error that need to be handled.\n // Work is removed from this collection after componentDidCatch is called.\n var capturedErrors = null;\n // Keep track of which fibers have failed during the current batch of work.\n // This is a different set than capturedErrors, because it is not reset until\n // the end of the batch. This is needed to propagate errors correctly if a\n // subtree fails more than once.\n var failedBoundaries = null;\n // Error boundaries that captured an error during the current commit.\n var commitPhaseBoundaries = null;\n var firstUncaughtError = null;\n var didFatal = false;\n\n var isCommitting = false;\n var isUnmounting = false;\n\n // Used for performance tracking.\n var interruptedBy = null;\n\n function resetContextStack() {\n // Reset the stack\n reset$1();\n // Reset the cursors\n resetContext();\n resetHostContainer();\n }\n\n function commitAllHostEffects() {\n while (nextEffect !== null) {\n {\n ReactDebugCurrentFiber.setCurrentFiber(nextEffect);\n }\n recordEffect();\n\n var effectTag = nextEffect.effectTag;\n if (effectTag & ContentReset) {\n commitResetTextContent(nextEffect);\n }\n\n if (effectTag & Ref) {\n var current = nextEffect.alternate;\n if (current !== null) {\n commitDetachRef(current);\n }\n }\n\n // The following switch statement is only concerned about placement,\n // updates, and deletions. To avoid needing to add a case for every\n // possible bitmap value, we remove the secondary effects from the\n // effect tag and switch on that value.\n var primaryEffectTag = effectTag & ~(Callback | Err | ContentReset | Ref | PerformedWork);\n switch (primaryEffectTag) {\n case Placement:\n {\n commitPlacement(nextEffect);\n // Clear the \"placement\" from effect tag so that we know that this is inserted, before\n // any life-cycles like componentDidMount gets called.\n // TODO: findDOMNode doesn't rely on this any more but isMounted\n // does and isMounted is deprecated anyway so we should be able\n // to kill this.\n nextEffect.effectTag &= ~Placement;\n break;\n }\n case PlacementAndUpdate:\n {\n // Placement\n commitPlacement(nextEffect);\n // Clear the \"placement\" from effect tag so that we know that this is inserted, before\n // any life-cycles like componentDidMount gets called.\n nextEffect.effectTag &= ~Placement;\n\n // Update\n var _current = nextEffect.alternate;\n commitWork(_current, nextEffect);\n break;\n }\n case Update:\n {\n var _current2 = nextEffect.alternate;\n commitWork(_current2, nextEffect);\n break;\n }\n case Deletion:\n {\n isUnmounting = true;\n commitDeletion(nextEffect);\n isUnmounting = false;\n break;\n }\n }\n nextEffect = nextEffect.nextEffect;\n }\n\n {\n ReactDebugCurrentFiber.resetCurrentFiber();\n }\n }\n\n function commitAllLifeCycles() {\n while (nextEffect !== null) {\n var effectTag = nextEffect.effectTag;\n\n if (effectTag & (Update | Callback)) {\n recordEffect();\n var current = nextEffect.alternate;\n commitLifeCycles(current, nextEffect);\n }\n\n if (effectTag & Ref) {\n recordEffect();\n commitAttachRef(nextEffect);\n }\n\n if (effectTag & Err) {\n recordEffect();\n commitErrorHandling(nextEffect);\n }\n\n var next = nextEffect.nextEffect;\n // Ensure that we clean these up so that we don't accidentally keep them.\n // I'm not actually sure this matters because we can't reset firstEffect\n // and lastEffect since they're on every node, not just the effectful\n // ones. So we have to clean everything as we reuse nodes anyway.\n nextEffect.nextEffect = null;\n // Ensure that we reset the effectTag here so that we can rely on effect\n // tags to reason about the current life-cycle.\n nextEffect = next;\n }\n }\n\n function commitRoot(finishedWork) {\n // We keep track of this so that captureError can collect any boundaries\n // that capture an error during the commit phase. The reason these aren't\n // local to this function is because errors that occur during cWU are\n // captured elsewhere, to prevent the unmount from being interrupted.\n isWorking = true;\n isCommitting = true;\n startCommitTimer();\n\n var root = finishedWork.stateNode;\n !(root.current !== finishedWork) ? invariant(false, 'Cannot commit the same tree as before. This is probably a bug related to the return field. This error is likely caused by a bug in React. Please file an issue.') : void 0;\n root.isReadyForCommit = false;\n\n // Reset this to null before calling lifecycles\n ReactCurrentOwner.current = null;\n\n var firstEffect = void 0;\n if (finishedWork.effectTag > PerformedWork) {\n // A fiber's effect list consists only of its children, not itself. So if\n // the root has an effect, we need to add it to the end of the list. The\n // resulting list is the set that would belong to the root's parent, if\n // it had one; that is, all the effects in the tree including the root.\n if (finishedWork.lastEffect !== null) {\n finishedWork.lastEffect.nextEffect = finishedWork;\n firstEffect = finishedWork.firstEffect;\n } else {\n firstEffect = finishedWork;\n }\n } else {\n // There is no effect on the root.\n firstEffect = finishedWork.firstEffect;\n }\n\n prepareForCommit();\n\n // Commit all the side-effects within a tree. We'll do this in two passes.\n // The first pass performs all the host insertions, updates, deletions and\n // ref unmounts.\n nextEffect = firstEffect;\n startCommitHostEffectsTimer();\n while (nextEffect !== null) {\n var didError = false;\n var _error = void 0;\n {\n invokeGuardedCallback$1(null, commitAllHostEffects, null);\n if (hasCaughtError()) {\n didError = true;\n _error = clearCaughtError();\n }\n }\n if (didError) {\n !(nextEffect !== null) ? invariant(false, 'Should have next effect. This error is likely caused by a bug in React. Please file an issue.') : void 0;\n captureError(nextEffect, _error);\n // Clean-up\n if (nextEffect !== null) {\n nextEffect = nextEffect.nextEffect;\n }\n }\n }\n stopCommitHostEffectsTimer();\n\n resetAfterCommit();\n\n // The work-in-progress tree is now the current tree. This must come after\n // the first pass of the commit phase, so that the previous tree is still\n // current during componentWillUnmount, but before the second pass, so that\n // the finished work is current during componentDidMount/Update.\n root.current = finishedWork;\n\n // In the second pass we'll perform all life-cycles and ref callbacks.\n // Life-cycles happen as a separate pass so that all placements, updates,\n // and deletions in the entire tree have already been invoked.\n // This pass also triggers any renderer-specific initial effects.\n nextEffect = firstEffect;\n startCommitLifeCyclesTimer();\n while (nextEffect !== null) {\n var _didError = false;\n var _error2 = void 0;\n {\n invokeGuardedCallback$1(null, commitAllLifeCycles, null);\n if (hasCaughtError()) {\n _didError = true;\n _error2 = clearCaughtError();\n }\n }\n if (_didError) {\n !(nextEffect !== null) ? invariant(false, 'Should have next effect. This error is likely caused by a bug in React. Please file an issue.') : void 0;\n captureError(nextEffect, _error2);\n if (nextEffect !== null) {\n nextEffect = nextEffect.nextEffect;\n }\n }\n }\n\n isCommitting = false;\n isWorking = false;\n stopCommitLifeCyclesTimer();\n stopCommitTimer();\n if (typeof onCommitRoot === 'function') {\n onCommitRoot(finishedWork.stateNode);\n }\n if (true && ReactFiberInstrumentation_1.debugTool) {\n ReactFiberInstrumentation_1.debugTool.onCommitWork(finishedWork);\n }\n\n // If we caught any errors during this commit, schedule their boundaries\n // to update.\n if (commitPhaseBoundaries) {\n commitPhaseBoundaries.forEach(scheduleErrorRecovery);\n commitPhaseBoundaries = null;\n }\n\n if (firstUncaughtError !== null) {\n var _error3 = firstUncaughtError;\n firstUncaughtError = null;\n onUncaughtError(_error3);\n }\n\n var remainingTime = root.current.expirationTime;\n\n if (remainingTime === NoWork) {\n capturedErrors = null;\n failedBoundaries = null;\n }\n\n return remainingTime;\n }\n\n function resetExpirationTime(workInProgress, renderTime) {\n if (renderTime !== Never && workInProgress.expirationTime === Never) {\n // The children of this component are hidden. Don't bubble their\n // expiration times.\n return;\n }\n\n // Check for pending updates.\n var newExpirationTime = getUpdateExpirationTime(workInProgress);\n\n // TODO: Calls need to visit stateNode\n\n // Bubble up the earliest expiration time.\n var child = workInProgress.child;\n while (child !== null) {\n if (child.expirationTime !== NoWork && (newExpirationTime === NoWork || newExpirationTime > child.expirationTime)) {\n newExpirationTime = child.expirationTime;\n }\n child = child.sibling;\n }\n workInProgress.expirationTime = newExpirationTime;\n }\n\n function completeUnitOfWork(workInProgress) {\n while (true) {\n // The current, flushed, state of this fiber is the alternate.\n // Ideally nothing should rely on this, but relying on it here\n // means that we don't need an additional field on the work in\n // progress.\n var current = workInProgress.alternate;\n {\n ReactDebugCurrentFiber.setCurrentFiber(workInProgress);\n }\n var next = completeWork(current, workInProgress, nextRenderExpirationTime);\n {\n ReactDebugCurrentFiber.resetCurrentFiber();\n }\n\n var returnFiber = workInProgress['return'];\n var siblingFiber = workInProgress.sibling;\n\n resetExpirationTime(workInProgress, nextRenderExpirationTime);\n\n if (next !== null) {\n stopWorkTimer(workInProgress);\n if (true && ReactFiberInstrumentation_1.debugTool) {\n ReactFiberInstrumentation_1.debugTool.onCompleteWork(workInProgress);\n }\n // If completing this work spawned new work, do that next. We'll come\n // back here again.\n return next;\n }\n\n if (returnFiber !== null) {\n // Append all the effects of the subtree and this fiber onto the effect\n // list of the parent. The completion order of the children affects the\n // side-effect order.\n if (returnFiber.firstEffect === null) {\n returnFiber.firstEffect = workInProgress.firstEffect;\n }\n if (workInProgress.lastEffect !== null) {\n if (returnFiber.lastEffect !== null) {\n returnFiber.lastEffect.nextEffect = workInProgress.firstEffect;\n }\n returnFiber.lastEffect = workInProgress.lastEffect;\n }\n\n // If this fiber had side-effects, we append it AFTER the children's\n // side-effects. We can perform certain side-effects earlier if\n // needed, by doing multiple passes over the effect list. We don't want\n // to schedule our own side-effect on our own list because if end up\n // reusing children we'll schedule this effect onto itself since we're\n // at the end.\n var effectTag = workInProgress.effectTag;\n // Skip both NoWork and PerformedWork tags when creating the effect list.\n // PerformedWork effect is read by React DevTools but shouldn't be committed.\n if (effectTag > PerformedWork) {\n if (returnFiber.lastEffect !== null) {\n returnFiber.lastEffect.nextEffect = workInProgress;\n } else {\n returnFiber.firstEffect = workInProgress;\n }\n returnFiber.lastEffect = workInProgress;\n }\n }\n\n stopWorkTimer(workInProgress);\n if (true && ReactFiberInstrumentation_1.debugTool) {\n ReactFiberInstrumentation_1.debugTool.onCompleteWork(workInProgress);\n }\n\n if (siblingFiber !== null) {\n // If there is more work to do in this returnFiber, do that next.\n return siblingFiber;\n } else if (returnFiber !== null) {\n // If there's no more work in this returnFiber. Complete the returnFiber.\n workInProgress = returnFiber;\n continue;\n } else {\n // We've reached the root.\n var root = workInProgress.stateNode;\n root.isReadyForCommit = true;\n return null;\n }\n }\n\n // Without this explicit null return Flow complains of invalid return type\n // TODO Remove the above while(true) loop\n // eslint-disable-next-line no-unreachable\n return null;\n }\n\n function performUnitOfWork(workInProgress) {\n // The current, flushed, state of this fiber is the alternate.\n // Ideally nothing should rely on this, but relying on it here\n // means that we don't need an additional field on the work in\n // progress.\n var current = workInProgress.alternate;\n\n // See if beginning this work spawns more work.\n startWorkTimer(workInProgress);\n {\n ReactDebugCurrentFiber.setCurrentFiber(workInProgress);\n }\n\n var next = beginWork(current, workInProgress, nextRenderExpirationTime);\n {\n ReactDebugCurrentFiber.resetCurrentFiber();\n }\n if (true && ReactFiberInstrumentation_1.debugTool) {\n ReactFiberInstrumentation_1.debugTool.onBeginWork(workInProgress);\n }\n\n if (next === null) {\n // If this doesn't spawn new work, complete the current work.\n next = completeUnitOfWork(workInProgress);\n }\n\n ReactCurrentOwner.current = null;\n\n return next;\n }\n\n function performFailedUnitOfWork(workInProgress) {\n // The current, flushed, state of this fiber is the alternate.\n // Ideally nothing should rely on this, but relying on it here\n // means that we don't need an additional field on the work in\n // progress.\n var current = workInProgress.alternate;\n\n // See if beginning this work spawns more work.\n startWorkTimer(workInProgress);\n {\n ReactDebugCurrentFiber.setCurrentFiber(workInProgress);\n }\n var next = beginFailedWork(current, workInProgress, nextRenderExpirationTime);\n {\n ReactDebugCurrentFiber.resetCurrentFiber();\n }\n if (true && ReactFiberInstrumentation_1.debugTool) {\n ReactFiberInstrumentation_1.debugTool.onBeginWork(workInProgress);\n }\n\n if (next === null) {\n // If this doesn't spawn new work, complete the current work.\n next = completeUnitOfWork(workInProgress);\n }\n\n ReactCurrentOwner.current = null;\n\n return next;\n }\n\n function workLoop(expirationTime) {\n if (capturedErrors !== null) {\n // If there are unhandled errors, switch to the slow work loop.\n // TODO: How to avoid this check in the fast path? Maybe the renderer\n // could keep track of which roots have unhandled errors and call a\n // forked version of renderRoot.\n slowWorkLoopThatChecksForFailedWork(expirationTime);\n return;\n }\n if (nextRenderExpirationTime === NoWork || nextRenderExpirationTime > expirationTime) {\n return;\n }\n\n if (nextRenderExpirationTime <= mostRecentCurrentTime) {\n // Flush all expired work.\n while (nextUnitOfWork !== null) {\n nextUnitOfWork = performUnitOfWork(nextUnitOfWork);\n }\n } else {\n // Flush asynchronous work until the deadline runs out of time.\n while (nextUnitOfWork !== null && !shouldYield()) {\n nextUnitOfWork = performUnitOfWork(nextUnitOfWork);\n }\n }\n }\n\n function slowWorkLoopThatChecksForFailedWork(expirationTime) {\n if (nextRenderExpirationTime === NoWork || nextRenderExpirationTime > expirationTime) {\n return;\n }\n\n if (nextRenderExpirationTime <= mostRecentCurrentTime) {\n // Flush all expired work.\n while (nextUnitOfWork !== null) {\n if (hasCapturedError(nextUnitOfWork)) {\n // Use a forked version of performUnitOfWork\n nextUnitOfWork = performFailedUnitOfWork(nextUnitOfWork);\n } else {\n nextUnitOfWork = performUnitOfWork(nextUnitOfWork);\n }\n }\n } else {\n // Flush asynchronous work until the deadline runs out of time.\n while (nextUnitOfWork !== null && !shouldYield()) {\n if (hasCapturedError(nextUnitOfWork)) {\n // Use a forked version of performUnitOfWork\n nextUnitOfWork = performFailedUnitOfWork(nextUnitOfWork);\n } else {\n nextUnitOfWork = performUnitOfWork(nextUnitOfWork);\n }\n }\n }\n }\n\n function renderRootCatchBlock(root, failedWork, boundary, expirationTime) {\n // We're going to restart the error boundary that captured the error.\n // Conceptually, we're unwinding the stack. We need to unwind the\n // context stack, too.\n unwindContexts(failedWork, boundary);\n\n // Restart the error boundary using a forked version of\n // performUnitOfWork that deletes the boundary's children. The entire\n // failed subree will be unmounted. During the commit phase, a special\n // lifecycle method is called on the error boundary, which triggers\n // a re-render.\n nextUnitOfWork = performFailedUnitOfWork(boundary);\n\n // Continue working.\n workLoop(expirationTime);\n }\n\n function renderRoot(root, expirationTime) {\n !!isWorking ? invariant(false, 'renderRoot was called recursively. This error is likely caused by a bug in React. Please file an issue.') : void 0;\n isWorking = true;\n\n // We're about to mutate the work-in-progress tree. If the root was pending\n // commit, it no longer is: we'll need to complete it again.\n root.isReadyForCommit = false;\n\n // Check if we're starting from a fresh stack, or if we're resuming from\n // previously yielded work.\n if (root !== nextRoot || expirationTime !== nextRenderExpirationTime || nextUnitOfWork === null) {\n // Reset the stack and start working from the root.\n resetContextStack();\n nextRoot = root;\n nextRenderExpirationTime = expirationTime;\n nextUnitOfWork = createWorkInProgress(nextRoot.current, null, expirationTime);\n }\n\n startWorkLoopTimer(nextUnitOfWork);\n\n var didError = false;\n var error = null;\n {\n invokeGuardedCallback$1(null, workLoop, null, expirationTime);\n if (hasCaughtError()) {\n didError = true;\n error = clearCaughtError();\n }\n }\n\n // An error was thrown during the render phase.\n while (didError) {\n if (didFatal) {\n // This was a fatal error. Don't attempt to recover from it.\n firstUncaughtError = error;\n break;\n }\n\n var failedWork = nextUnitOfWork;\n if (failedWork === null) {\n // An error was thrown but there's no current unit of work. This can\n // happen during the commit phase if there's a bug in the renderer.\n didFatal = true;\n continue;\n }\n\n // \"Capture\" the error by finding the nearest boundary. If there is no\n // error boundary, we use the root.\n var boundary = captureError(failedWork, error);\n !(boundary !== null) ? invariant(false, 'Should have found an error boundary. This error is likely caused by a bug in React. Please file an issue.') : void 0;\n\n if (didFatal) {\n // The error we just captured was a fatal error. This happens\n // when the error propagates to the root more than once.\n continue;\n }\n\n didError = false;\n error = null;\n {\n invokeGuardedCallback$1(null, renderRootCatchBlock, null, root, failedWork, boundary, expirationTime);\n if (hasCaughtError()) {\n didError = true;\n error = clearCaughtError();\n continue;\n }\n }\n // We're finished working. Exit the error loop.\n break;\n }\n\n var uncaughtError = firstUncaughtError;\n\n // We're done performing work. Time to clean up.\n stopWorkLoopTimer(interruptedBy);\n interruptedBy = null;\n isWorking = false;\n didFatal = false;\n firstUncaughtError = null;\n\n if (uncaughtError !== null) {\n onUncaughtError(uncaughtError);\n }\n\n return root.isReadyForCommit ? root.current.alternate : null;\n }\n\n // Returns the boundary that captured the error, or null if the error is ignored\n function captureError(failedWork, error) {\n // It is no longer valid because we exited the user code.\n ReactCurrentOwner.current = null;\n {\n ReactDebugCurrentFiber.resetCurrentFiber();\n }\n\n // Search for the nearest error boundary.\n var boundary = null;\n\n // Passed to logCapturedError()\n var errorBoundaryFound = false;\n var willRetry = false;\n var errorBoundaryName = null;\n\n // Host containers are a special case. If the failed work itself is a host\n // container, then it acts as its own boundary. In all other cases, we\n // ignore the work itself and only search through the parents.\n if (failedWork.tag === HostRoot) {\n boundary = failedWork;\n\n if (isFailedBoundary(failedWork)) {\n // If this root already failed, there must have been an error when\n // attempting to unmount it. This is a worst-case scenario and\n // should only be possible if there's a bug in the renderer.\n didFatal = true;\n }\n } else {\n var node = failedWork['return'];\n while (node !== null && boundary === null) {\n if (node.tag === ClassComponent) {\n var instance = node.stateNode;\n if (typeof instance.componentDidCatch === 'function') {\n errorBoundaryFound = true;\n errorBoundaryName = getComponentName(node);\n\n // Found an error boundary!\n boundary = node;\n willRetry = true;\n }\n } else if (node.tag === HostRoot) {\n // Treat the root like a no-op error boundary\n boundary = node;\n }\n\n if (isFailedBoundary(node)) {\n // This boundary is already in a failed state.\n\n // If we're currently unmounting, that means this error was\n // thrown while unmounting a failed subtree. We should ignore\n // the error.\n if (isUnmounting) {\n return null;\n }\n\n // If we're in the commit phase, we should check to see if\n // this boundary already captured an error during this commit.\n // This case exists because multiple errors can be thrown during\n // a single commit without interruption.\n if (commitPhaseBoundaries !== null && (commitPhaseBoundaries.has(node) || node.alternate !== null && commitPhaseBoundaries.has(node.alternate))) {\n // If so, we should ignore this error.\n return null;\n }\n\n // The error should propagate to the next boundary -— we keep looking.\n boundary = null;\n willRetry = false;\n }\n\n node = node['return'];\n }\n }\n\n if (boundary !== null) {\n // Add to the collection of failed boundaries. This lets us know that\n // subsequent errors in this subtree should propagate to the next boundary.\n if (failedBoundaries === null) {\n failedBoundaries = new Set();\n }\n failedBoundaries.add(boundary);\n\n // This method is unsafe outside of the begin and complete phases.\n // We might be in the commit phase when an error is captured.\n // The risk is that the return path from this Fiber may not be accurate.\n // That risk is acceptable given the benefit of providing users more context.\n var _componentStack = getStackAddendumByWorkInProgressFiber(failedWork);\n var _componentName = getComponentName(failedWork);\n\n // Add to the collection of captured errors. This is stored as a global\n // map of errors and their component stack location keyed by the boundaries\n // that capture them. We mostly use this Map as a Set; it's a Map only to\n // avoid adding a field to Fiber to store the error.\n if (capturedErrors === null) {\n capturedErrors = new Map();\n }\n\n var capturedError = {\n componentName: _componentName,\n componentStack: _componentStack,\n error: error,\n errorBoundary: errorBoundaryFound ? boundary.stateNode : null,\n errorBoundaryFound: errorBoundaryFound,\n errorBoundaryName: errorBoundaryName,\n willRetry: willRetry\n };\n\n capturedErrors.set(boundary, capturedError);\n\n try {\n logCapturedError(capturedError);\n } catch (e) {\n // Prevent cycle if logCapturedError() throws.\n // A cycle may still occur if logCapturedError renders a component that throws.\n var suppressLogging = e && e.suppressReactErrorLogging;\n if (!suppressLogging) {\n console.error(e);\n }\n }\n\n // If we're in the commit phase, defer scheduling an update on the\n // boundary until after the commit is complete\n if (isCommitting) {\n if (commitPhaseBoundaries === null) {\n commitPhaseBoundaries = new Set();\n }\n commitPhaseBoundaries.add(boundary);\n } else {\n // Otherwise, schedule an update now.\n // TODO: Is this actually necessary during the render phase? Is it\n // possible to unwind and continue rendering at the same priority,\n // without corrupting internal state?\n scheduleErrorRecovery(boundary);\n }\n return boundary;\n } else if (firstUncaughtError === null) {\n // If no boundary is found, we'll need to throw the error\n firstUncaughtError = error;\n }\n return null;\n }\n\n function hasCapturedError(fiber) {\n // TODO: capturedErrors should store the boundary instance, to avoid needing\n // to check the alternate.\n return capturedErrors !== null && (capturedErrors.has(fiber) || fiber.alternate !== null && capturedErrors.has(fiber.alternate));\n }\n\n function isFailedBoundary(fiber) {\n // TODO: failedBoundaries should store the boundary instance, to avoid\n // needing to check the alternate.\n return failedBoundaries !== null && (failedBoundaries.has(fiber) || fiber.alternate !== null && failedBoundaries.has(fiber.alternate));\n }\n\n function commitErrorHandling(effectfulFiber) {\n var capturedError = void 0;\n if (capturedErrors !== null) {\n capturedError = capturedErrors.get(effectfulFiber);\n capturedErrors['delete'](effectfulFiber);\n if (capturedError == null) {\n if (effectfulFiber.alternate !== null) {\n effectfulFiber = effectfulFiber.alternate;\n capturedError = capturedErrors.get(effectfulFiber);\n capturedErrors['delete'](effectfulFiber);\n }\n }\n }\n\n !(capturedError != null) ? invariant(false, 'No error for given unit of work. This error is likely caused by a bug in React. Please file an issue.') : void 0;\n\n switch (effectfulFiber.tag) {\n case ClassComponent:\n var instance = effectfulFiber.stateNode;\n\n var info = {\n componentStack: capturedError.componentStack\n };\n\n // Allow the boundary to handle the error, usually by scheduling\n // an update to itself\n instance.componentDidCatch(capturedError.error, info);\n return;\n case HostRoot:\n if (firstUncaughtError === null) {\n firstUncaughtError = capturedError.error;\n }\n return;\n default:\n invariant(false, 'Invalid type of work. This error is likely caused by a bug in React. Please file an issue.');\n }\n }\n\n function unwindContexts(from, to) {\n var node = from;\n while (node !== null) {\n switch (node.tag) {\n case ClassComponent:\n popContextProvider(node);\n break;\n case HostComponent:\n popHostContext(node);\n break;\n case HostRoot:\n popHostContainer(node);\n break;\n case HostPortal:\n popHostContainer(node);\n break;\n }\n if (node === to || node.alternate === to) {\n stopFailedWorkTimer(node);\n break;\n } else {\n stopWorkTimer(node);\n }\n node = node['return'];\n }\n }\n\n function computeAsyncExpiration() {\n // Given the current clock time, returns an expiration time. We use rounding\n // to batch like updates together.\n // Should complete within ~1000ms. 1200ms max.\n var currentTime = recalculateCurrentTime();\n var expirationMs = 1000;\n var bucketSizeMs = 200;\n return computeExpirationBucket(currentTime, expirationMs, bucketSizeMs);\n }\n\n function computeExpirationForFiber(fiber) {\n var expirationTime = void 0;\n if (expirationContext !== NoWork) {\n // An explicit expiration context was set;\n expirationTime = expirationContext;\n } else if (isWorking) {\n if (isCommitting) {\n // Updates that occur during the commit phase should have sync priority\n // by default.\n expirationTime = Sync;\n } else {\n // Updates during the render phase should expire at the same time as\n // the work that is being rendered.\n expirationTime = nextRenderExpirationTime;\n }\n } else {\n // No explicit expiration context was set, and we're not currently\n // performing work. Calculate a new expiration time.\n if (useSyncScheduling && !(fiber.internalContextTag & AsyncUpdates)) {\n // This is a sync update\n expirationTime = Sync;\n } else {\n // This is an async update\n expirationTime = computeAsyncExpiration();\n }\n }\n return expirationTime;\n }\n\n function scheduleWork(fiber, expirationTime) {\n return scheduleWorkImpl(fiber, expirationTime, false);\n }\n\n function checkRootNeedsClearing(root, fiber, expirationTime) {\n if (!isWorking && root === nextRoot && expirationTime < nextRenderExpirationTime) {\n // Restart the root from the top.\n if (nextUnitOfWork !== null) {\n // This is an interruption. (Used for performance tracking.)\n interruptedBy = fiber;\n }\n nextRoot = null;\n nextUnitOfWork = null;\n nextRenderExpirationTime = NoWork;\n }\n }\n\n function scheduleWorkImpl(fiber, expirationTime, isErrorRecovery) {\n recordScheduleUpdate();\n\n {\n if (!isErrorRecovery && fiber.tag === ClassComponent) {\n var instance = fiber.stateNode;\n warnAboutInvalidUpdates(instance);\n }\n }\n\n var node = fiber;\n while (node !== null) {\n // Walk the parent path to the root and update each node's\n // expiration time.\n if (node.expirationTime === NoWork || node.expirationTime > expirationTime) {\n node.expirationTime = expirationTime;\n }\n if (node.alternate !== null) {\n if (node.alternate.expirationTime === NoWork || node.alternate.expirationTime > expirationTime) {\n node.alternate.expirationTime = expirationTime;\n }\n }\n if (node['return'] === null) {\n if (node.tag === HostRoot) {\n var root = node.stateNode;\n\n checkRootNeedsClearing(root, fiber, expirationTime);\n requestWork(root, expirationTime);\n checkRootNeedsClearing(root, fiber, expirationTime);\n } else {\n {\n if (!isErrorRecovery && fiber.tag === ClassComponent) {\n warnAboutUpdateOnUnmounted(fiber);\n }\n }\n return;\n }\n }\n node = node['return'];\n }\n }\n\n function scheduleErrorRecovery(fiber) {\n scheduleWorkImpl(fiber, Sync, true);\n }\n\n function recalculateCurrentTime() {\n // Subtract initial time so it fits inside 32bits\n var ms = now() - startTime;\n mostRecentCurrentTime = msToExpirationTime(ms);\n return mostRecentCurrentTime;\n }\n\n function deferredUpdates(fn) {\n var previousExpirationContext = expirationContext;\n expirationContext = computeAsyncExpiration();\n try {\n return fn();\n } finally {\n expirationContext = previousExpirationContext;\n }\n }\n\n function syncUpdates(fn) {\n var previousExpirationContext = expirationContext;\n expirationContext = Sync;\n try {\n return fn();\n } finally {\n expirationContext = previousExpirationContext;\n }\n }\n\n // TODO: Everything below this is written as if it has been lifted to the\n // renderers. I'll do this in a follow-up.\n\n // Linked-list of roots\n var firstScheduledRoot = null;\n var lastScheduledRoot = null;\n\n var callbackExpirationTime = NoWork;\n var callbackID = -1;\n var isRendering = false;\n var nextFlushedRoot = null;\n var nextFlushedExpirationTime = NoWork;\n var deadlineDidExpire = false;\n var hasUnhandledError = false;\n var unhandledError = null;\n var deadline = null;\n\n var isBatchingUpdates = false;\n var isUnbatchingUpdates = false;\n\n // Use these to prevent an infinite loop of nested updates\n var NESTED_UPDATE_LIMIT = 1000;\n var nestedUpdateCount = 0;\n\n var timeHeuristicForUnitOfWork = 1;\n\n function scheduleCallbackWithExpiration(expirationTime) {\n if (callbackExpirationTime !== NoWork) {\n // A callback is already scheduled. Check its expiration time (timeout).\n if (expirationTime > callbackExpirationTime) {\n // Existing callback has sufficient timeout. Exit.\n return;\n } else {\n // Existing callback has insufficient timeout. Cancel and schedule a\n // new one.\n cancelDeferredCallback(callbackID);\n }\n // The request callback timer is already running. Don't start a new one.\n } else {\n startRequestCallbackTimer();\n }\n\n // Compute a timeout for the given expiration time.\n var currentMs = now() - startTime;\n var expirationMs = expirationTimeToMs(expirationTime);\n var timeout = expirationMs - currentMs;\n\n callbackExpirationTime = expirationTime;\n callbackID = scheduleDeferredCallback(performAsyncWork, { timeout: timeout });\n }\n\n // requestWork is called by the scheduler whenever a root receives an update.\n // It's up to the renderer to call renderRoot at some point in the future.\n function requestWork(root, expirationTime) {\n if (nestedUpdateCount > NESTED_UPDATE_LIMIT) {\n invariant(false, 'Maximum update depth exceeded. This can happen when a component repeatedly calls setState inside componentWillUpdate or componentDidUpdate. React limits the number of nested updates to prevent infinite loops.');\n }\n\n // Add the root to the schedule.\n // Check if this root is already part of the schedule.\n if (root.nextScheduledRoot === null) {\n // This root is not already scheduled. Add it.\n root.remainingExpirationTime = expirationTime;\n if (lastScheduledRoot === null) {\n firstScheduledRoot = lastScheduledRoot = root;\n root.nextScheduledRoot = root;\n } else {\n lastScheduledRoot.nextScheduledRoot = root;\n lastScheduledRoot = root;\n lastScheduledRoot.nextScheduledRoot = firstScheduledRoot;\n }\n } else {\n // This root is already scheduled, but its priority may have increased.\n var remainingExpirationTime = root.remainingExpirationTime;\n if (remainingExpirationTime === NoWork || expirationTime < remainingExpirationTime) {\n // Update the priority.\n root.remainingExpirationTime = expirationTime;\n }\n }\n\n if (isRendering) {\n // Prevent reentrancy. Remaining work will be scheduled at the end of\n // the currently rendering batch.\n return;\n }\n\n if (isBatchingUpdates) {\n // Flush work at the end of the batch.\n if (isUnbatchingUpdates) {\n // ...unless we're inside unbatchedUpdates, in which case we should\n // flush it now.\n nextFlushedRoot = root;\n nextFlushedExpirationTime = Sync;\n performWorkOnRoot(nextFlushedRoot, nextFlushedExpirationTime);\n }\n return;\n }\n\n // TODO: Get rid of Sync and use current time?\n if (expirationTime === Sync) {\n performWork(Sync, null);\n } else {\n scheduleCallbackWithExpiration(expirationTime);\n }\n }\n\n function findHighestPriorityRoot() {\n var highestPriorityWork = NoWork;\n var highestPriorityRoot = null;\n\n if (lastScheduledRoot !== null) {\n var previousScheduledRoot = lastScheduledRoot;\n var root = firstScheduledRoot;\n while (root !== null) {\n var remainingExpirationTime = root.remainingExpirationTime;\n if (remainingExpirationTime === NoWork) {\n // This root no longer has work. Remove it from the scheduler.\n\n // TODO: This check is redudant, but Flow is confused by the branch\n // below where we set lastScheduledRoot to null, even though we break\n // from the loop right after.\n !(previousScheduledRoot !== null && lastScheduledRoot !== null) ? invariant(false, 'Should have a previous and last root. This error is likely caused by a bug in React. Please file an issue.') : void 0;\n if (root === root.nextScheduledRoot) {\n // This is the only root in the list.\n root.nextScheduledRoot = null;\n firstScheduledRoot = lastScheduledRoot = null;\n break;\n } else if (root === firstScheduledRoot) {\n // This is the first root in the list.\n var next = root.nextScheduledRoot;\n firstScheduledRoot = next;\n lastScheduledRoot.nextScheduledRoot = next;\n root.nextScheduledRoot = null;\n } else if (root === lastScheduledRoot) {\n // This is the last root in the list.\n lastScheduledRoot = previousScheduledRoot;\n lastScheduledRoot.nextScheduledRoot = firstScheduledRoot;\n root.nextScheduledRoot = null;\n break;\n } else {\n previousScheduledRoot.nextScheduledRoot = root.nextScheduledRoot;\n root.nextScheduledRoot = null;\n }\n root = previousScheduledRoot.nextScheduledRoot;\n } else {\n if (highestPriorityWork === NoWork || remainingExpirationTime < highestPriorityWork) {\n // Update the priority, if it's higher\n highestPriorityWork = remainingExpirationTime;\n highestPriorityRoot = root;\n }\n if (root === lastScheduledRoot) {\n break;\n }\n previousScheduledRoot = root;\n root = root.nextScheduledRoot;\n }\n }\n }\n\n // If the next root is the same as the previous root, this is a nested\n // update. To prevent an infinite loop, increment the nested update count.\n var previousFlushedRoot = nextFlushedRoot;\n if (previousFlushedRoot !== null && previousFlushedRoot === highestPriorityRoot) {\n nestedUpdateCount++;\n } else {\n // Reset whenever we switch roots.\n nestedUpdateCount = 0;\n }\n nextFlushedRoot = highestPriorityRoot;\n nextFlushedExpirationTime = highestPriorityWork;\n }\n\n function performAsyncWork(dl) {\n performWork(NoWork, dl);\n }\n\n function performWork(minExpirationTime, dl) {\n deadline = dl;\n\n // Keep working on roots until there's no more work, or until the we reach\n // the deadline.\n findHighestPriorityRoot();\n\n if (enableUserTimingAPI && deadline !== null) {\n var didExpire = nextFlushedExpirationTime < recalculateCurrentTime();\n stopRequestCallbackTimer(didExpire);\n }\n\n while (nextFlushedRoot !== null && nextFlushedExpirationTime !== NoWork && (minExpirationTime === NoWork || nextFlushedExpirationTime <= minExpirationTime) && !deadlineDidExpire) {\n performWorkOnRoot(nextFlushedRoot, nextFlushedExpirationTime);\n // Find the next highest priority work.\n findHighestPriorityRoot();\n }\n\n // We're done flushing work. Either we ran out of time in this callback,\n // or there's no more work left with sufficient priority.\n\n // If we're inside a callback, set this to false since we just completed it.\n if (deadline !== null) {\n callbackExpirationTime = NoWork;\n callbackID = -1;\n }\n // If there's work left over, schedule a new callback.\n if (nextFlushedExpirationTime !== NoWork) {\n scheduleCallbackWithExpiration(nextFlushedExpirationTime);\n }\n\n // Clean-up.\n deadline = null;\n deadlineDidExpire = false;\n nestedUpdateCount = 0;\n\n if (hasUnhandledError) {\n var _error4 = unhandledError;\n unhandledError = null;\n hasUnhandledError = false;\n throw _error4;\n }\n }\n\n function performWorkOnRoot(root, expirationTime) {\n !!isRendering ? invariant(false, 'performWorkOnRoot was called recursively. This error is likely caused by a bug in React. Please file an issue.') : void 0;\n\n isRendering = true;\n\n // Check if this is async work or sync/expired work.\n // TODO: Pass current time as argument to renderRoot, commitRoot\n if (expirationTime <= recalculateCurrentTime()) {\n // Flush sync work.\n var finishedWork = root.finishedWork;\n if (finishedWork !== null) {\n // This root is already complete. We can commit it.\n root.finishedWork = null;\n root.remainingExpirationTime = commitRoot(finishedWork);\n } else {\n root.finishedWork = null;\n finishedWork = renderRoot(root, expirationTime);\n if (finishedWork !== null) {\n // We've completed the root. Commit it.\n root.remainingExpirationTime = commitRoot(finishedWork);\n }\n }\n } else {\n // Flush async work.\n var _finishedWork = root.finishedWork;\n if (_finishedWork !== null) {\n // This root is already complete. We can commit it.\n root.finishedWork = null;\n root.remainingExpirationTime = commitRoot(_finishedWork);\n } else {\n root.finishedWork = null;\n _finishedWork = renderRoot(root, expirationTime);\n if (_finishedWork !== null) {\n // We've completed the root. Check the deadline one more time\n // before committing.\n if (!shouldYield()) {\n // Still time left. Commit the root.\n root.remainingExpirationTime = commitRoot(_finishedWork);\n } else {\n // There's no time left. Mark this root as complete. We'll come\n // back and commit it later.\n root.finishedWork = _finishedWork;\n }\n }\n }\n }\n\n isRendering = false;\n }\n\n // When working on async work, the reconciler asks the renderer if it should\n // yield execution. For DOM, we implement this with requestIdleCallback.\n function shouldYield() {\n if (deadline === null) {\n return false;\n }\n if (deadline.timeRemaining() > timeHeuristicForUnitOfWork) {\n // Disregard deadline.didTimeout. Only expired work should be flushed\n // during a timeout. This path is only hit for non-expired work.\n return false;\n }\n deadlineDidExpire = true;\n return true;\n }\n\n // TODO: Not happy about this hook. Conceptually, renderRoot should return a\n // tuple of (isReadyForCommit, didError, error)\n function onUncaughtError(error) {\n !(nextFlushedRoot !== null) ? invariant(false, 'Should be working on a root. This error is likely caused by a bug in React. Please file an issue.') : void 0;\n // Unschedule this root so we don't work on it again until there's\n // another update.\n nextFlushedRoot.remainingExpirationTime = NoWork;\n if (!hasUnhandledError) {\n hasUnhandledError = true;\n unhandledError = error;\n }\n }\n\n // TODO: Batching should be implemented at the renderer level, not inside\n // the reconciler.\n function batchedUpdates(fn, a) {\n var previousIsBatchingUpdates = isBatchingUpdates;\n isBatchingUpdates = true;\n try {\n return fn(a);\n } finally {\n isBatchingUpdates = previousIsBatchingUpdates;\n if (!isBatchingUpdates && !isRendering) {\n performWork(Sync, null);\n }\n }\n }\n\n // TODO: Batching should be implemented at the renderer level, not inside\n // the reconciler.\n function unbatchedUpdates(fn) {\n if (isBatchingUpdates && !isUnbatchingUpdates) {\n isUnbatchingUpdates = true;\n try {\n return fn();\n } finally {\n isUnbatchingUpdates = false;\n }\n }\n return fn();\n }\n\n // TODO: Batching should be implemented at the renderer level, not within\n // the reconciler.\n function flushSync(fn) {\n var previousIsBatchingUpdates = isBatchingUpdates;\n isBatchingUpdates = true;\n try {\n return syncUpdates(fn);\n } finally {\n isBatchingUpdates = previousIsBatchingUpdates;\n !!isRendering ? invariant(false, 'flushSync was called from inside a lifecycle method. It cannot be called when React is already rendering.') : void 0;\n performWork(Sync, null);\n }\n }\n\n return {\n computeAsyncExpiration: computeAsyncExpiration,\n computeExpirationForFiber: computeExpirationForFiber,\n scheduleWork: scheduleWork,\n batchedUpdates: batchedUpdates,\n unbatchedUpdates: unbatchedUpdates,\n flushSync: flushSync,\n deferredUpdates: deferredUpdates\n };\n};\n\n{\n var didWarnAboutNestedUpdates = false;\n}\n\n// 0 is PROD, 1 is DEV.\n// Might add PROFILE later.\n\n\nfunction getContextForSubtree(parentComponent) {\n if (!parentComponent) {\n return emptyObject;\n }\n\n var fiber = get(parentComponent);\n var parentContext = findCurrentUnmaskedContext(fiber);\n return isContextProvider(fiber) ? processChildContext(fiber, parentContext) : parentContext;\n}\n\nvar ReactFiberReconciler$1 = function (config) {\n var getPublicInstance = config.getPublicInstance;\n\n var _ReactFiberScheduler = ReactFiberScheduler(config),\n computeAsyncExpiration = _ReactFiberScheduler.computeAsyncExpiration,\n computeExpirationForFiber = _ReactFiberScheduler.computeExpirationForFiber,\n scheduleWork = _ReactFiberScheduler.scheduleWork,\n batchedUpdates = _ReactFiberScheduler.batchedUpdates,\n unbatchedUpdates = _ReactFiberScheduler.unbatchedUpdates,\n flushSync = _ReactFiberScheduler.flushSync,\n deferredUpdates = _ReactFiberScheduler.deferredUpdates;\n\n function scheduleTopLevelUpdate(current, element, callback) {\n {\n if (ReactDebugCurrentFiber.phase === 'render' && ReactDebugCurrentFiber.current !== null && !didWarnAboutNestedUpdates) {\n didWarnAboutNestedUpdates = true;\n warning(false, 'Render methods should be a pure function of props and state; ' + 'triggering nested component updates from render is not allowed. ' + 'If necessary, trigger nested updates in componentDidUpdate.\\n\\n' + 'Check the render method of %s.', getComponentName(ReactDebugCurrentFiber.current) || 'Unknown');\n }\n }\n\n callback = callback === undefined ? null : callback;\n {\n warning(callback === null || typeof callback === 'function', 'render(...): Expected the last optional `callback` argument to be a ' + 'function. Instead received: %s.', callback);\n }\n\n var expirationTime = void 0;\n // Check if the top-level element is an async wrapper component. If so,\n // treat updates to the root as async. This is a bit weird but lets us\n // avoid a separate `renderAsync` API.\n if (enableAsyncSubtreeAPI && element != null && element.type != null && element.type.prototype != null && element.type.prototype.unstable_isAsyncReactComponent === true) {\n expirationTime = computeAsyncExpiration();\n } else {\n expirationTime = computeExpirationForFiber(current);\n }\n\n var update = {\n expirationTime: expirationTime,\n partialState: { element: element },\n callback: callback,\n isReplace: false,\n isForced: false,\n nextCallback: null,\n next: null\n };\n insertUpdateIntoFiber(current, update);\n scheduleWork(current, expirationTime);\n }\n\n function findHostInstance(fiber) {\n var hostFiber = findCurrentHostFiber(fiber);\n if (hostFiber === null) {\n return null;\n }\n return hostFiber.stateNode;\n }\n\n return {\n createContainer: function (containerInfo, hydrate) {\n return createFiberRoot(containerInfo, hydrate);\n },\n updateContainer: function (element, container, parentComponent, callback) {\n // TODO: If this is a nested container, this won't be the root.\n var current = container.current;\n\n {\n if (ReactFiberInstrumentation_1.debugTool) {\n if (current.alternate === null) {\n ReactFiberInstrumentation_1.debugTool.onMountContainer(container);\n } else if (element === null) {\n ReactFiberInstrumentation_1.debugTool.onUnmountContainer(container);\n } else {\n ReactFiberInstrumentation_1.debugTool.onUpdateContainer(container);\n }\n }\n }\n\n var context = getContextForSubtree(parentComponent);\n if (container.context === null) {\n container.context = context;\n } else {\n container.pendingContext = context;\n }\n\n scheduleTopLevelUpdate(current, element, callback);\n },\n\n\n batchedUpdates: batchedUpdates,\n\n unbatchedUpdates: unbatchedUpdates,\n\n deferredUpdates: deferredUpdates,\n\n flushSync: flushSync,\n\n getPublicRootInstance: function (container) {\n var containerFiber = container.current;\n if (!containerFiber.child) {\n return null;\n }\n switch (containerFiber.child.tag) {\n case HostComponent:\n return getPublicInstance(containerFiber.child.stateNode);\n default:\n return containerFiber.child.stateNode;\n }\n },\n\n\n findHostInstance: findHostInstance,\n\n findHostInstanceWithNoPortals: function (fiber) {\n var hostFiber = findCurrentHostFiberWithNoPortals(fiber);\n if (hostFiber === null) {\n return null;\n }\n return hostFiber.stateNode;\n },\n injectIntoDevTools: function (devToolsConfig) {\n var findFiberByHostInstance = devToolsConfig.findFiberByHostInstance;\n\n return injectInternals(_assign({}, devToolsConfig, {\n findHostInstanceByFiber: function (fiber) {\n return findHostInstance(fiber);\n },\n findFiberByHostInstance: function (instance) {\n if (!findFiberByHostInstance) {\n // Might not be implemented by the renderer.\n return null;\n }\n return findFiberByHostInstance(instance);\n }\n }));\n }\n };\n};\n\nvar ReactFiberReconciler$2 = Object.freeze({\n\tdefault: ReactFiberReconciler$1\n});\n\nvar ReactFiberReconciler$3 = ( ReactFiberReconciler$2 && ReactFiberReconciler$1 ) || ReactFiberReconciler$2;\n\n// TODO: bundle Flow types with the package.\n\n\n\n// TODO: decide on the top-level export form.\n// This is hacky but makes it work with both Rollup and Jest.\nvar reactReconciler = ReactFiberReconciler$3['default'] ? ReactFiberReconciler$3['default'] : ReactFiberReconciler$3;\n\nfunction createPortal$1(children, containerInfo,\n// TODO: figure out the API for cross-renderer implementation.\nimplementation) {\n var key = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n\n return {\n // This tag allow us to uniquely identify this as a React Portal\n $$typeof: REACT_PORTAL_TYPE,\n key: key == null ? null : '' + key,\n children: children,\n containerInfo: containerInfo,\n implementation: implementation\n };\n}\n\n// TODO: this is special because it gets imported during build.\n\nvar ReactVersion = '16.2.0';\n\n// a requestAnimationFrame, storing the time for the start of the frame, then\n// scheduling a postMessage which gets scheduled after paint. Within the\n// postMessage handler do as much work as possible until time + frame rate.\n// By separating the idle call into a separate event tick we ensure that\n// layout, paint and other browser work is counted against the available time.\n// The frame rate is dynamically adjusted.\n\n{\n if (ExecutionEnvironment.canUseDOM && typeof requestAnimationFrame !== 'function') {\n warning(false, 'React depends on requestAnimationFrame. Make sure that you load a ' + 'polyfill in older browsers. http://fb.me/react-polyfills');\n }\n}\n\nvar hasNativePerformanceNow = typeof performance === 'object' && typeof performance.now === 'function';\n\nvar now = void 0;\nif (hasNativePerformanceNow) {\n now = function () {\n return performance.now();\n };\n} else {\n now = function () {\n return Date.now();\n };\n}\n\n// TODO: There's no way to cancel, because Fiber doesn't atm.\nvar rIC = void 0;\nvar cIC = void 0;\n\nif (!ExecutionEnvironment.canUseDOM) {\n rIC = function (frameCallback) {\n return setTimeout(function () {\n frameCallback({\n timeRemaining: function () {\n return Infinity;\n }\n });\n });\n };\n cIC = function (timeoutID) {\n clearTimeout(timeoutID);\n };\n} else if (typeof requestIdleCallback !== 'function' || typeof cancelIdleCallback !== 'function') {\n // Polyfill requestIdleCallback and cancelIdleCallback\n\n var scheduledRICCallback = null;\n var isIdleScheduled = false;\n var timeoutTime = -1;\n\n var isAnimationFrameScheduled = false;\n\n var frameDeadline = 0;\n // We start out assuming that we run at 30fps but then the heuristic tracking\n // will adjust this value to a faster fps if we get more frequent animation\n // frames.\n var previousFrameTime = 33;\n var activeFrameTime = 33;\n\n var frameDeadlineObject;\n if (hasNativePerformanceNow) {\n frameDeadlineObject = {\n didTimeout: false,\n timeRemaining: function () {\n // We assume that if we have a performance timer that the rAF callback\n // gets a performance timer value. Not sure if this is always true.\n var remaining = frameDeadline - performance.now();\n return remaining > 0 ? remaining : 0;\n }\n };\n } else {\n frameDeadlineObject = {\n didTimeout: false,\n timeRemaining: function () {\n // Fallback to Date.now()\n var remaining = frameDeadline - Date.now();\n return remaining > 0 ? remaining : 0;\n }\n };\n }\n\n // We use the postMessage trick to defer idle work until after the repaint.\n var messageKey = '__reactIdleCallback$' + Math.random().toString(36).slice(2);\n var idleTick = function (event) {\n if (event.source !== window || event.data !== messageKey) {\n return;\n }\n\n isIdleScheduled = false;\n\n var currentTime = now();\n if (frameDeadline - currentTime <= 0) {\n // There's no time left in this idle period. Check if the callback has\n // a timeout and whether it's been exceeded.\n if (timeoutTime !== -1 && timeoutTime <= currentTime) {\n // Exceeded the timeout. Invoke the callback even though there's no\n // time left.\n frameDeadlineObject.didTimeout = true;\n } else {\n // No timeout.\n if (!isAnimationFrameScheduled) {\n // Schedule another animation callback so we retry later.\n isAnimationFrameScheduled = true;\n requestAnimationFrame(animationTick);\n }\n // Exit without invoking the callback.\n return;\n }\n } else {\n // There's still time left in this idle period.\n frameDeadlineObject.didTimeout = false;\n }\n\n timeoutTime = -1;\n var callback = scheduledRICCallback;\n scheduledRICCallback = null;\n if (callback !== null) {\n callback(frameDeadlineObject);\n }\n };\n // Assumes that we have addEventListener in this environment. Might need\n // something better for old IE.\n window.addEventListener('message', idleTick, false);\n\n var animationTick = function (rafTime) {\n isAnimationFrameScheduled = false;\n var nextFrameTime = rafTime - frameDeadline + activeFrameTime;\n if (nextFrameTime < activeFrameTime && previousFrameTime < activeFrameTime) {\n if (nextFrameTime < 8) {\n // Defensive coding. We don't support higher frame rates than 120hz.\n // If we get lower than that, it is probably a bug.\n nextFrameTime = 8;\n }\n // If one frame goes long, then the next one can be short to catch up.\n // If two frames are short in a row, then that's an indication that we\n // actually have a higher frame rate than what we're currently optimizing.\n // We adjust our heuristic dynamically accordingly. For example, if we're\n // running on 120hz display or 90hz VR display.\n // Take the max of the two in case one of them was an anomaly due to\n // missed frame deadlines.\n activeFrameTime = nextFrameTime < previousFrameTime ? previousFrameTime : nextFrameTime;\n } else {\n previousFrameTime = nextFrameTime;\n }\n frameDeadline = rafTime + activeFrameTime;\n if (!isIdleScheduled) {\n isIdleScheduled = true;\n window.postMessage(messageKey, '*');\n }\n };\n\n rIC = function (callback, options) {\n // This assumes that we only schedule one callback at a time because that's\n // how Fiber uses it.\n scheduledRICCallback = callback;\n if (options != null && typeof options.timeout === 'number') {\n timeoutTime = now() + options.timeout;\n }\n if (!isAnimationFrameScheduled) {\n // If rAF didn't already schedule one, we need to schedule a frame.\n // TODO: If this rAF doesn't materialize because the browser throttles, we\n // might want to still have setTimeout trigger rIC as a backup to ensure\n // that we keep performing work.\n isAnimationFrameScheduled = true;\n requestAnimationFrame(animationTick);\n }\n return 0;\n };\n\n cIC = function () {\n scheduledRICCallback = null;\n isIdleScheduled = false;\n timeoutTime = -1;\n };\n} else {\n rIC = window.requestIdleCallback;\n cIC = window.cancelIdleCallback;\n}\n\n/**\n * Forked from fbjs/warning:\n * https://github.com/facebook/fbjs/blob/e66ba20ad5be433eb54423f2b097d829324d9de6/packages/fbjs/src/__forks__/warning.js\n *\n * Only change is we use console.warn instead of console.error,\n * and do nothing when 'console' is not supported.\n * This really simplifies the code.\n * ---\n * Similar to invariant but only logs a warning if the condition is not met.\n * This can be used to log issues in development environments in critical\n * paths. Removing the logging code for production environments will keep the\n * same logic and follow the same code paths.\n */\n\nvar lowPriorityWarning = function () {};\n\n{\n var printWarning = function (format) {\n for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n var argIndex = 0;\n var message = 'Warning: ' + format.replace(/%s/g, function () {\n return args[argIndex++];\n });\n if (typeof console !== 'undefined') {\n console.warn(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) {}\n };\n\n lowPriorityWarning = function (condition, format) {\n if (format === undefined) {\n throw new Error('`warning(condition, format, ...args)` requires a warning ' + 'message argument');\n }\n if (!condition) {\n for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {\n args[_key2 - 2] = arguments[_key2];\n }\n\n printWarning.apply(undefined, [format].concat(args));\n }\n };\n}\n\nvar lowPriorityWarning$1 = lowPriorityWarning;\n\n// isAttributeNameSafe() is currently duplicated in DOMMarkupOperations.\n// TODO: Find a better place for this.\nvar VALID_ATTRIBUTE_NAME_REGEX = new RegExp('^[' + ATTRIBUTE_NAME_START_CHAR + '][' + ATTRIBUTE_NAME_CHAR + ']*$');\nvar illegalAttributeNameCache = {};\nvar validatedAttributeNameCache = {};\nfunction isAttributeNameSafe(attributeName) {\n if (validatedAttributeNameCache.hasOwnProperty(attributeName)) {\n return true;\n }\n if (illegalAttributeNameCache.hasOwnProperty(attributeName)) {\n return false;\n }\n if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) {\n validatedAttributeNameCache[attributeName] = true;\n return true;\n }\n illegalAttributeNameCache[attributeName] = true;\n {\n warning(false, 'Invalid attribute name: `%s`', attributeName);\n }\n return false;\n}\n\n// shouldIgnoreValue() is currently duplicated in DOMMarkupOperations.\n// TODO: Find a better place for this.\nfunction shouldIgnoreValue(propertyInfo, value) {\n return value == null || propertyInfo.hasBooleanValue && !value || propertyInfo.hasNumericValue && isNaN(value) || propertyInfo.hasPositiveNumericValue && value < 1 || propertyInfo.hasOverloadedBooleanValue && value === false;\n}\n\n/**\n * Operations for dealing with DOM properties.\n */\n\n\n\n\n\n/**\n * Get the value for a property on a node. Only used in DEV for SSR validation.\n * The \"expected\" argument is used as a hint of what the expected value is.\n * Some properties have multiple equivalent values.\n */\nfunction getValueForProperty(node, name, expected) {\n {\n var propertyInfo = getPropertyInfo(name);\n if (propertyInfo) {\n var mutationMethod = propertyInfo.mutationMethod;\n if (mutationMethod || propertyInfo.mustUseProperty) {\n return node[propertyInfo.propertyName];\n } else {\n var attributeName = propertyInfo.attributeName;\n\n var stringValue = null;\n\n if (propertyInfo.hasOverloadedBooleanValue) {\n if (node.hasAttribute(attributeName)) {\n var value = node.getAttribute(attributeName);\n if (value === '') {\n return true;\n }\n if (shouldIgnoreValue(propertyInfo, expected)) {\n return value;\n }\n if (value === '' + expected) {\n return expected;\n }\n return value;\n }\n } else if (node.hasAttribute(attributeName)) {\n if (shouldIgnoreValue(propertyInfo, expected)) {\n // We had an attribute but shouldn't have had one, so read it\n // for the error message.\n return node.getAttribute(attributeName);\n }\n if (propertyInfo.hasBooleanValue) {\n // If this was a boolean, it doesn't matter what the value is\n // the fact that we have it is the same as the expected.\n return expected;\n }\n // Even if this property uses a namespace we use getAttribute\n // because we assume its namespaced name is the same as our config.\n // To use getAttributeNS we need the local name which we don't have\n // in our config atm.\n stringValue = node.getAttribute(attributeName);\n }\n\n if (shouldIgnoreValue(propertyInfo, expected)) {\n return stringValue === null ? expected : stringValue;\n } else if (stringValue === '' + expected) {\n return expected;\n } else {\n return stringValue;\n }\n }\n }\n }\n}\n\n/**\n * Get the value for a attribute on a node. Only used in DEV for SSR validation.\n * The third argument is used as a hint of what the expected value is. Some\n * attributes have multiple equivalent values.\n */\nfunction getValueForAttribute(node, name, expected) {\n {\n if (!isAttributeNameSafe(name)) {\n return;\n }\n if (!node.hasAttribute(name)) {\n return expected === undefined ? undefined : null;\n }\n var value = node.getAttribute(name);\n if (value === '' + expected) {\n return expected;\n }\n return value;\n }\n}\n\n/**\n * Sets the value for a property on a node.\n *\n * @param {DOMElement} node\n * @param {string} name\n * @param {*} value\n */\nfunction setValueForProperty(node, name, value) {\n var propertyInfo = getPropertyInfo(name);\n\n if (propertyInfo && shouldSetAttribute(name, value)) {\n var mutationMethod = propertyInfo.mutationMethod;\n if (mutationMethod) {\n mutationMethod(node, value);\n } else if (shouldIgnoreValue(propertyInfo, value)) {\n deleteValueForProperty(node, name);\n return;\n } else if (propertyInfo.mustUseProperty) {\n // Contrary to `setAttribute`, object properties are properly\n // `toString`ed by IE8/9.\n node[propertyInfo.propertyName] = value;\n } else {\n var attributeName = propertyInfo.attributeName;\n var namespace = propertyInfo.attributeNamespace;\n // `setAttribute` with objects becomes only `[object]` in IE8/9,\n // ('' + value) makes it output the correct toString()-value.\n if (namespace) {\n node.setAttributeNS(namespace, attributeName, '' + value);\n } else if (propertyInfo.hasBooleanValue || propertyInfo.hasOverloadedBooleanValue && value === true) {\n node.setAttribute(attributeName, '');\n } else {\n node.setAttribute(attributeName, '' + value);\n }\n }\n } else {\n setValueForAttribute(node, name, shouldSetAttribute(name, value) ? value : null);\n return;\n }\n\n {\n \n }\n}\n\nfunction setValueForAttribute(node, name, value) {\n if (!isAttributeNameSafe(name)) {\n return;\n }\n if (value == null) {\n node.removeAttribute(name);\n } else {\n node.setAttribute(name, '' + value);\n }\n\n {\n \n }\n}\n\n/**\n * Deletes an attributes from a node.\n *\n * @param {DOMElement} node\n * @param {string} name\n */\nfunction deleteValueForAttribute(node, name) {\n node.removeAttribute(name);\n}\n\n/**\n * Deletes the value for a property on a node.\n *\n * @param {DOMElement} node\n * @param {string} name\n */\nfunction deleteValueForProperty(node, name) {\n var propertyInfo = getPropertyInfo(name);\n if (propertyInfo) {\n var mutationMethod = propertyInfo.mutationMethod;\n if (mutationMethod) {\n mutationMethod(node, undefined);\n } else if (propertyInfo.mustUseProperty) {\n var propName = propertyInfo.propertyName;\n if (propertyInfo.hasBooleanValue) {\n node[propName] = false;\n } else {\n node[propName] = '';\n }\n } else {\n node.removeAttribute(propertyInfo.attributeName);\n }\n } else {\n node.removeAttribute(name);\n }\n}\n\nvar ReactControlledValuePropTypes = {\n checkPropTypes: null\n};\n\n{\n var hasReadOnlyValue = {\n button: true,\n checkbox: true,\n image: true,\n hidden: true,\n radio: true,\n reset: true,\n submit: true\n };\n\n var propTypes = {\n value: function (props, propName, componentName) {\n if (!props[propName] || hasReadOnlyValue[props.type] || props.onChange || props.readOnly || props.disabled) {\n return null;\n }\n return new Error('You provided a `value` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultValue`. Otherwise, ' + 'set either `onChange` or `readOnly`.');\n },\n checked: function (props, propName, componentName) {\n if (!props[propName] || props.onChange || props.readOnly || props.disabled) {\n return null;\n }\n return new Error('You provided a `checked` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultChecked`. Otherwise, ' + 'set either `onChange` or `readOnly`.');\n }\n };\n\n /**\n * Provide a linked `value` attribute for controlled forms. You should not use\n * this outside of the ReactDOM controlled form components.\n */\n ReactControlledValuePropTypes.checkPropTypes = function (tagName, props, getStack) {\n checkPropTypes(propTypes, props, 'prop', tagName, getStack);\n };\n}\n\n// TODO: direct imports like some-package/src/* are bad. Fix me.\nvar getCurrentFiberOwnerName$2 = ReactDebugCurrentFiber.getCurrentFiberOwnerName;\nvar getCurrentFiberStackAddendum$3 = ReactDebugCurrentFiber.getCurrentFiberStackAddendum;\n\nvar didWarnValueDefaultValue = false;\nvar didWarnCheckedDefaultChecked = false;\nvar didWarnControlledToUncontrolled = false;\nvar didWarnUncontrolledToControlled = false;\n\nfunction isControlled(props) {\n var usesChecked = props.type === 'checkbox' || props.type === 'radio';\n return usesChecked ? props.checked != null : props.value != null;\n}\n\n/**\n * Implements an <input> host component that allows setting these optional\n * props: `checked`, `value`, `defaultChecked`, and `defaultValue`.\n *\n * If `checked` or `value` are not supplied (or null/undefined), user actions\n * that affect the checked state or value will trigger updates to the element.\n *\n * If they are supplied (and not null/undefined), the rendered element will not\n * trigger updates to the element. Instead, the props must change in order for\n * the rendered element to be updated.\n *\n * The rendered element will be initialized as unchecked (or `defaultChecked`)\n * with an empty value (or `defaultValue`).\n *\n * See http://www.w3.org/TR/2012/WD-html5-20121025/the-input-element.html\n */\n\nfunction getHostProps(element, props) {\n var node = element;\n var value = props.value;\n var checked = props.checked;\n\n var hostProps = _assign({\n // Make sure we set .type before any other properties (setting .value\n // before .type means .value is lost in IE11 and below)\n type: undefined,\n // Make sure we set .step before .value (setting .value before .step\n // means .value is rounded on mount, based upon step precision)\n step: undefined,\n // Make sure we set .min & .max before .value (to ensure proper order\n // in corner cases such as min or max deriving from value, e.g. Issue #7170)\n min: undefined,\n max: undefined\n }, props, {\n defaultChecked: undefined,\n defaultValue: undefined,\n value: value != null ? value : node._wrapperState.initialValue,\n checked: checked != null ? checked : node._wrapperState.initialChecked\n });\n\n return hostProps;\n}\n\nfunction initWrapperState(element, props) {\n {\n ReactControlledValuePropTypes.checkPropTypes('input', props, getCurrentFiberStackAddendum$3);\n\n if (props.checked !== undefined && props.defaultChecked !== undefined && !didWarnCheckedDefaultChecked) {\n warning(false, '%s contains an input of type %s with both checked and defaultChecked props. ' + 'Input elements must be either controlled or uncontrolled ' + '(specify either the checked prop, or the defaultChecked prop, but not ' + 'both). Decide between using a controlled or uncontrolled input ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components', getCurrentFiberOwnerName$2() || 'A component', props.type);\n didWarnCheckedDefaultChecked = true;\n }\n if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValueDefaultValue) {\n warning(false, '%s contains an input of type %s with both value and defaultValue props. ' + 'Input elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled input ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components', getCurrentFiberOwnerName$2() || 'A component', props.type);\n didWarnValueDefaultValue = true;\n }\n }\n\n var defaultValue = props.defaultValue;\n var node = element;\n node._wrapperState = {\n initialChecked: props.checked != null ? props.checked : props.defaultChecked,\n initialValue: props.value != null ? props.value : defaultValue,\n controlled: isControlled(props)\n };\n}\n\nfunction updateChecked(element, props) {\n var node = element;\n var checked = props.checked;\n if (checked != null) {\n setValueForProperty(node, 'checked', checked);\n }\n}\n\nfunction updateWrapper(element, props) {\n var node = element;\n {\n var controlled = isControlled(props);\n\n if (!node._wrapperState.controlled && controlled && !didWarnUncontrolledToControlled) {\n warning(false, 'A component is changing an uncontrolled input of type %s to be controlled. ' + 'Input elements should not switch from uncontrolled to controlled (or vice versa). ' + 'Decide between using a controlled or uncontrolled input ' + 'element for the lifetime of the component. More info: https://fb.me/react-controlled-components%s', props.type, getCurrentFiberStackAddendum$3());\n didWarnUncontrolledToControlled = true;\n }\n if (node._wrapperState.controlled && !controlled && !didWarnControlledToUncontrolled) {\n warning(false, 'A component is changing a controlled input of type %s to be uncontrolled. ' + 'Input elements should not switch from controlled to uncontrolled (or vice versa). ' + 'Decide between using a controlled or uncontrolled input ' + 'element for the lifetime of the component. More info: https://fb.me/react-controlled-components%s', props.type, getCurrentFiberStackAddendum$3());\n didWarnControlledToUncontrolled = true;\n }\n }\n\n updateChecked(element, props);\n\n var value = props.value;\n if (value != null) {\n if (value === 0 && node.value === '') {\n node.value = '0';\n // Note: IE9 reports a number inputs as 'text', so check props instead.\n } else if (props.type === 'number') {\n // Simulate `input.valueAsNumber`. IE9 does not support it\n var valueAsNumber = parseFloat(node.value) || 0;\n\n if (\n // eslint-disable-next-line\n value != valueAsNumber ||\n // eslint-disable-next-line\n value == valueAsNumber && node.value != value) {\n // Cast `value` to a string to ensure the value is set correctly. While\n // browsers typically do this as necessary, jsdom doesn't.\n node.value = '' + value;\n }\n } else if (node.value !== '' + value) {\n // Cast `value` to a string to ensure the value is set correctly. While\n // browsers typically do this as necessary, jsdom doesn't.\n node.value = '' + value;\n }\n } else {\n if (props.value == null && props.defaultValue != null) {\n // In Chrome, assigning defaultValue to certain input types triggers input validation.\n // For number inputs, the display value loses trailing decimal points. For email inputs,\n // Chrome raises \"The specified value <x> is not a valid email address\".\n //\n // Here we check to see if the defaultValue has actually changed, avoiding these problems\n // when the user is inputting text\n //\n // https://github.com/facebook/react/issues/7253\n if (node.defaultValue !== '' + props.defaultValue) {\n node.defaultValue = '' + props.defaultValue;\n }\n }\n if (props.checked == null && props.defaultChecked != null) {\n node.defaultChecked = !!props.defaultChecked;\n }\n }\n}\n\nfunction postMountWrapper(element, props) {\n var node = element;\n\n // Detach value from defaultValue. We won't do anything if we're working on\n // submit or reset inputs as those values & defaultValues are linked. They\n // are not resetable nodes so this operation doesn't matter and actually\n // removes browser-default values (eg \"Submit Query\") when no value is\n // provided.\n\n switch (props.type) {\n case 'submit':\n case 'reset':\n break;\n case 'color':\n case 'date':\n case 'datetime':\n case 'datetime-local':\n case 'month':\n case 'time':\n case 'week':\n // This fixes the no-show issue on iOS Safari and Android Chrome:\n // https://github.com/facebook/react/issues/7233\n node.value = '';\n node.value = node.defaultValue;\n break;\n default:\n node.value = node.value;\n break;\n }\n\n // Normally, we'd just do `node.checked = node.checked` upon initial mount, less this bug\n // this is needed to work around a chrome bug where setting defaultChecked\n // will sometimes influence the value of checked (even after detachment).\n // Reference: https://bugs.chromium.org/p/chromium/issues/detail?id=608416\n // We need to temporarily unset name to avoid disrupting radio button groups.\n var name = node.name;\n if (name !== '') {\n node.name = '';\n }\n node.defaultChecked = !node.defaultChecked;\n node.defaultChecked = !node.defaultChecked;\n if (name !== '') {\n node.name = name;\n }\n}\n\nfunction restoreControlledState$1(element, props) {\n var node = element;\n updateWrapper(node, props);\n updateNamedCousins(node, props);\n}\n\nfunction updateNamedCousins(rootNode, props) {\n var name = props.name;\n if (props.type === 'radio' && name != null) {\n var queryRoot = rootNode;\n\n while (queryRoot.parentNode) {\n queryRoot = queryRoot.parentNode;\n }\n\n // If `rootNode.form` was non-null, then we could try `form.elements`,\n // but that sometimes behaves strangely in IE8. We could also try using\n // `form.getElementsByName`, but that will only return direct children\n // and won't include inputs that use the HTML5 `form=` attribute. Since\n // the input might not even be in a form. It might not even be in the\n // document. Let's just use the local `querySelectorAll` to ensure we don't\n // miss anything.\n var group = queryRoot.querySelectorAll('input[name=' + JSON.stringify('' + name) + '][type=\"radio\"]');\n\n for (var i = 0; i < group.length; i++) {\n var otherNode = group[i];\n if (otherNode === rootNode || otherNode.form !== rootNode.form) {\n continue;\n }\n // This will throw if radio buttons rendered by different copies of React\n // and the same name are rendered into the same form (same as #1939).\n // That's probably okay; we don't support it just as we don't support\n // mixing React radio buttons with non-React ones.\n var otherProps = getFiberCurrentPropsFromNode$1(otherNode);\n !otherProps ? invariant(false, 'ReactDOMInput: Mixing React and non-React radio inputs with the same `name` is not supported.') : void 0;\n\n // We need update the tracked value on the named cousin since the value\n // was changed but the input saw no event or value set\n updateValueIfChanged(otherNode);\n\n // If this is a controlled radio button group, forcing the input that\n // was previously checked to update will cause it to be come re-checked\n // as appropriate.\n updateWrapper(otherNode, otherProps);\n }\n }\n}\n\nfunction flattenChildren(children) {\n var content = '';\n\n // Flatten children and warn if they aren't strings or numbers;\n // invalid types are ignored.\n // We can silently skip them because invalid DOM nesting warning\n // catches these cases in Fiber.\n React.Children.forEach(children, function (child) {\n if (child == null) {\n return;\n }\n if (typeof child === 'string' || typeof child === 'number') {\n content += child;\n }\n });\n\n return content;\n}\n\n/**\n * Implements an <option> host component that warns when `selected` is set.\n */\n\nfunction validateProps(element, props) {\n // TODO (yungsters): Remove support for `selected` in <option>.\n {\n warning(props.selected == null, 'Use the `defaultValue` or `value` props on <select> instead of ' + 'setting `selected` on <option>.');\n }\n}\n\nfunction postMountWrapper$1(element, props) {\n // value=\"\" should make a value attribute (#6219)\n if (props.value != null) {\n element.setAttribute('value', props.value);\n }\n}\n\nfunction getHostProps$1(element, props) {\n var hostProps = _assign({ children: undefined }, props);\n var content = flattenChildren(props.children);\n\n if (content) {\n hostProps.children = content;\n }\n\n return hostProps;\n}\n\n// TODO: direct imports like some-package/src/* are bad. Fix me.\nvar getCurrentFiberOwnerName$3 = ReactDebugCurrentFiber.getCurrentFiberOwnerName;\nvar getCurrentFiberStackAddendum$4 = ReactDebugCurrentFiber.getCurrentFiberStackAddendum;\n\n\n{\n var didWarnValueDefaultValue$1 = false;\n}\n\nfunction getDeclarationErrorAddendum() {\n var ownerName = getCurrentFiberOwnerName$3();\n if (ownerName) {\n return '\\n\\nCheck the render method of `' + ownerName + '`.';\n }\n return '';\n}\n\nvar valuePropNames = ['value', 'defaultValue'];\n\n/**\n * Validation function for `value` and `defaultValue`.\n */\nfunction checkSelectPropTypes(props) {\n ReactControlledValuePropTypes.checkPropTypes('select', props, getCurrentFiberStackAddendum$4);\n\n for (var i = 0; i < valuePropNames.length; i++) {\n var propName = valuePropNames[i];\n if (props[propName] == null) {\n continue;\n }\n var isArray = Array.isArray(props[propName]);\n if (props.multiple && !isArray) {\n warning(false, 'The `%s` prop supplied to <select> must be an array if ' + '`multiple` is true.%s', propName, getDeclarationErrorAddendum());\n } else if (!props.multiple && isArray) {\n warning(false, 'The `%s` prop supplied to <select> must be a scalar ' + 'value if `multiple` is false.%s', propName, getDeclarationErrorAddendum());\n }\n }\n}\n\nfunction updateOptions(node, multiple, propValue, setDefaultSelected) {\n var options = node.options;\n\n if (multiple) {\n var selectedValues = propValue;\n var selectedValue = {};\n for (var i = 0; i < selectedValues.length; i++) {\n // Prefix to avoid chaos with special keys.\n selectedValue['$' + selectedValues[i]] = true;\n }\n for (var _i = 0; _i < options.length; _i++) {\n var selected = selectedValue.hasOwnProperty('$' + options[_i].value);\n if (options[_i].selected !== selected) {\n options[_i].selected = selected;\n }\n if (selected && setDefaultSelected) {\n options[_i].defaultSelected = true;\n }\n }\n } else {\n // Do not set `select.value` as exact behavior isn't consistent across all\n // browsers for all cases.\n var _selectedValue = '' + propValue;\n var defaultSelected = null;\n for (var _i2 = 0; _i2 < options.length; _i2++) {\n if (options[_i2].value === _selectedValue) {\n options[_i2].selected = true;\n if (setDefaultSelected) {\n options[_i2].defaultSelected = true;\n }\n return;\n }\n if (defaultSelected === null && !options[_i2].disabled) {\n defaultSelected = options[_i2];\n }\n }\n if (defaultSelected !== null) {\n defaultSelected.selected = true;\n }\n }\n}\n\n/**\n * Implements a <select> host component that allows optionally setting the\n * props `value` and `defaultValue`. If `multiple` is false, the prop must be a\n * stringable. If `multiple` is true, the prop must be an array of stringables.\n *\n * If `value` is not supplied (or null/undefined), user actions that change the\n * selected option will trigger updates to the rendered options.\n *\n * If it is supplied (and not null/undefined), the rendered options will not\n * update in response to user actions. Instead, the `value` prop must change in\n * order for the rendered options to update.\n *\n * If `defaultValue` is provided, any options with the supplied values will be\n * selected.\n */\n\nfunction getHostProps$2(element, props) {\n return _assign({}, props, {\n value: undefined\n });\n}\n\nfunction initWrapperState$1(element, props) {\n var node = element;\n {\n checkSelectPropTypes(props);\n }\n\n var value = props.value;\n node._wrapperState = {\n initialValue: value != null ? value : props.defaultValue,\n wasMultiple: !!props.multiple\n };\n\n {\n if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValueDefaultValue$1) {\n warning(false, 'Select elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled select ' + 'element and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components');\n didWarnValueDefaultValue$1 = true;\n }\n }\n}\n\nfunction postMountWrapper$2(element, props) {\n var node = element;\n node.multiple = !!props.multiple;\n var value = props.value;\n if (value != null) {\n updateOptions(node, !!props.multiple, value, false);\n } else if (props.defaultValue != null) {\n updateOptions(node, !!props.multiple, props.defaultValue, true);\n }\n}\n\nfunction postUpdateWrapper(element, props) {\n var node = element;\n // After the initial mount, we control selected-ness manually so don't pass\n // this value down\n node._wrapperState.initialValue = undefined;\n\n var wasMultiple = node._wrapperState.wasMultiple;\n node._wrapperState.wasMultiple = !!props.multiple;\n\n var value = props.value;\n if (value != null) {\n updateOptions(node, !!props.multiple, value, false);\n } else if (wasMultiple !== !!props.multiple) {\n // For simplicity, reapply `defaultValue` if `multiple` is toggled.\n if (props.defaultValue != null) {\n updateOptions(node, !!props.multiple, props.defaultValue, true);\n } else {\n // Revert the select back to its default unselected state.\n updateOptions(node, !!props.multiple, props.multiple ? [] : '', false);\n }\n }\n}\n\nfunction restoreControlledState$2(element, props) {\n var node = element;\n var value = props.value;\n\n if (value != null) {\n updateOptions(node, !!props.multiple, value, false);\n }\n}\n\n// TODO: direct imports like some-package/src/* are bad. Fix me.\nvar getCurrentFiberStackAddendum$5 = ReactDebugCurrentFiber.getCurrentFiberStackAddendum;\n\nvar didWarnValDefaultVal = false;\n\n/**\n * Implements a <textarea> host component that allows setting `value`, and\n * `defaultValue`. This differs from the traditional DOM API because value is\n * usually set as PCDATA children.\n *\n * If `value` is not supplied (or null/undefined), user actions that affect the\n * value will trigger updates to the element.\n *\n * If `value` is supplied (and not null/undefined), the rendered element will\n * not trigger updates to the element. Instead, the `value` prop must change in\n * order for the rendered element to be updated.\n *\n * The rendered element will be initialized with an empty value, the prop\n * `defaultValue` if specified, or the children content (deprecated).\n */\n\nfunction getHostProps$3(element, props) {\n var node = element;\n !(props.dangerouslySetInnerHTML == null) ? invariant(false, '`dangerouslySetInnerHTML` does not make sense on <textarea>.') : void 0;\n\n // Always set children to the same thing. In IE9, the selection range will\n // get reset if `textContent` is mutated. We could add a check in setTextContent\n // to only set the value if/when the value differs from the node value (which would\n // completely solve this IE9 bug), but Sebastian+Sophie seemed to like this\n // solution. The value can be a boolean or object so that's why it's forced\n // to be a string.\n var hostProps = _assign({}, props, {\n value: undefined,\n defaultValue: undefined,\n children: '' + node._wrapperState.initialValue\n });\n\n return hostProps;\n}\n\nfunction initWrapperState$2(element, props) {\n var node = element;\n {\n ReactControlledValuePropTypes.checkPropTypes('textarea', props, getCurrentFiberStackAddendum$5);\n if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValDefaultVal) {\n warning(false, 'Textarea elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled textarea ' + 'and remove one of these props. More info: ' + 'https://fb.me/react-controlled-components');\n didWarnValDefaultVal = true;\n }\n }\n\n var initialValue = props.value;\n\n // Only bother fetching default value if we're going to use it\n if (initialValue == null) {\n var defaultValue = props.defaultValue;\n // TODO (yungsters): Remove support for children content in <textarea>.\n var children = props.children;\n if (children != null) {\n {\n warning(false, 'Use the `defaultValue` or `value` props instead of setting ' + 'children on <textarea>.');\n }\n !(defaultValue == null) ? invariant(false, 'If you supply `defaultValue` on a <textarea>, do not pass children.') : void 0;\n if (Array.isArray(children)) {\n !(children.length <= 1) ? invariant(false, '<textarea> can only have at most one child.') : void 0;\n children = children[0];\n }\n\n defaultValue = '' + children;\n }\n if (defaultValue == null) {\n defaultValue = '';\n }\n initialValue = defaultValue;\n }\n\n node._wrapperState = {\n initialValue: '' + initialValue\n };\n}\n\nfunction updateWrapper$1(element, props) {\n var node = element;\n var value = props.value;\n if (value != null) {\n // Cast `value` to a string to ensure the value is set correctly. While\n // browsers typically do this as necessary, jsdom doesn't.\n var newValue = '' + value;\n\n // To avoid side effects (such as losing text selection), only set value if changed\n if (newValue !== node.value) {\n node.value = newValue;\n }\n if (props.defaultValue == null) {\n node.defaultValue = newValue;\n }\n }\n if (props.defaultValue != null) {\n node.defaultValue = props.defaultValue;\n }\n}\n\nfunction postMountWrapper$3(element, props) {\n var node = element;\n // This is in postMount because we need access to the DOM node, which is not\n // available until after the component has mounted.\n var textContent = node.textContent;\n\n // Only set node.value if textContent is equal to the expected\n // initial value. In IE10/IE11 there is a bug where the placeholder attribute\n // will populate textContent as well.\n // https://developer.microsoft.com/microsoft-edge/platform/issues/101525/\n if (textContent === node._wrapperState.initialValue) {\n node.value = textContent;\n }\n}\n\nfunction restoreControlledState$3(element, props) {\n // DOM component is still mounted; update\n updateWrapper$1(element, props);\n}\n\nvar HTML_NAMESPACE$1 = 'http://www.w3.org/1999/xhtml';\nvar MATH_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\nvar SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n\nvar Namespaces = {\n html: HTML_NAMESPACE$1,\n mathml: MATH_NAMESPACE,\n svg: SVG_NAMESPACE\n};\n\n// Assumes there is no parent namespace.\nfunction getIntrinsicNamespace(type) {\n switch (type) {\n case 'svg':\n return SVG_NAMESPACE;\n case 'math':\n return MATH_NAMESPACE;\n default:\n return HTML_NAMESPACE$1;\n }\n}\n\nfunction getChildNamespace(parentNamespace, type) {\n if (parentNamespace == null || parentNamespace === HTML_NAMESPACE$1) {\n // No (or default) parent namespace: potential entry point.\n return getIntrinsicNamespace(type);\n }\n if (parentNamespace === SVG_NAMESPACE && type === 'foreignObject') {\n // We're leaving SVG.\n return HTML_NAMESPACE$1;\n }\n // By default, pass namespace below.\n return parentNamespace;\n}\n\n/* globals MSApp */\n\n/**\n * Create a function which has 'unsafe' privileges (required by windows8 apps)\n */\nvar createMicrosoftUnsafeLocalFunction = function (func) {\n if (typeof MSApp !== 'undefined' && MSApp.execUnsafeLocalFunction) {\n return function (arg0, arg1, arg2, arg3) {\n MSApp.execUnsafeLocalFunction(function () {\n return func(arg0, arg1, arg2, arg3);\n });\n };\n } else {\n return func;\n }\n};\n\n// SVG temp container for IE lacking innerHTML\nvar reusableSVGContainer = void 0;\n\n/**\n * Set the innerHTML property of a node\n *\n * @param {DOMElement} node\n * @param {string} html\n * @internal\n */\nvar setInnerHTML = createMicrosoftUnsafeLocalFunction(function (node, html) {\n // IE does not have innerHTML for SVG nodes, so instead we inject the\n // new markup in a temp node and then move the child nodes across into\n // the target node\n\n if (node.namespaceURI === Namespaces.svg && !('innerHTML' in node)) {\n reusableSVGContainer = reusableSVGContainer || document.createElement('div');\n reusableSVGContainer.innerHTML = '<svg>' + html + '</svg>';\n var svgNode = reusableSVGContainer.firstChild;\n while (node.firstChild) {\n node.removeChild(node.firstChild);\n }\n while (svgNode.firstChild) {\n node.appendChild(svgNode.firstChild);\n }\n } else {\n node.innerHTML = html;\n }\n});\n\n/**\n * Set the textContent property of a node, ensuring that whitespace is preserved\n * even in IE8. innerText is a poor substitute for textContent and, among many\n * issues, inserts <br> instead of the literal newline chars. innerHTML behaves\n * as it should.\n *\n * @param {DOMElement} node\n * @param {string} text\n * @internal\n */\nvar setTextContent = function (node, text) {\n if (text) {\n var firstChild = node.firstChild;\n\n if (firstChild && firstChild === node.lastChild && firstChild.nodeType === TEXT_NODE) {\n firstChild.nodeValue = text;\n return;\n }\n }\n node.textContent = text;\n};\n\n/**\n * CSS properties which accept numbers but are not in units of \"px\".\n */\nvar isUnitlessNumber = {\n animationIterationCount: true,\n borderImageOutset: true,\n borderImageSlice: true,\n borderImageWidth: true,\n boxFlex: true,\n boxFlexGroup: true,\n boxOrdinalGroup: true,\n columnCount: true,\n columns: true,\n flex: true,\n flexGrow: true,\n flexPositive: true,\n flexShrink: true,\n flexNegative: true,\n flexOrder: true,\n gridRow: true,\n gridRowEnd: true,\n gridRowSpan: true,\n gridRowStart: true,\n gridColumn: true,\n gridColumnEnd: true,\n gridColumnSpan: true,\n gridColumnStart: true,\n fontWeight: true,\n lineClamp: true,\n lineHeight: true,\n opacity: true,\n order: true,\n orphans: true,\n tabSize: true,\n widows: true,\n zIndex: true,\n zoom: true,\n\n // SVG-related properties\n fillOpacity: true,\n floodOpacity: true,\n stopOpacity: true,\n strokeDasharray: true,\n strokeDashoffset: true,\n strokeMiterlimit: true,\n strokeOpacity: true,\n strokeWidth: true\n};\n\n/**\n * @param {string} prefix vendor-specific prefix, eg: Webkit\n * @param {string} key style name, eg: transitionDuration\n * @return {string} style name prefixed with `prefix`, properly camelCased, eg:\n * WebkitTransitionDuration\n */\nfunction prefixKey(prefix, key) {\n return prefix + key.charAt(0).toUpperCase() + key.substring(1);\n}\n\n/**\n * Support style names that may come passed in prefixed by adding permutations\n * of vendor prefixes.\n */\nvar prefixes = ['Webkit', 'ms', 'Moz', 'O'];\n\n// Using Object.keys here, or else the vanilla for-in loop makes IE8 go into an\n// infinite loop, because it iterates over the newly added props too.\nObject.keys(isUnitlessNumber).forEach(function (prop) {\n prefixes.forEach(function (prefix) {\n isUnitlessNumber[prefixKey(prefix, prop)] = isUnitlessNumber[prop];\n });\n});\n\n/**\n * Convert a value into the proper css writable value. The style name `name`\n * should be logical (no hyphens), as specified\n * in `CSSProperty.isUnitlessNumber`.\n *\n * @param {string} name CSS property name such as `topMargin`.\n * @param {*} value CSS property value such as `10px`.\n * @return {string} Normalized style value with dimensions applied.\n */\nfunction dangerousStyleValue(name, value, isCustomProperty) {\n // Note that we've removed escapeTextForBrowser() calls here since the\n // whole string will be escaped when the attribute is injected into\n // the markup. If you provide unsafe user data here they can inject\n // arbitrary CSS which may be problematic (I couldn't repro this):\n // https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet\n // http://www.thespanner.co.uk/2007/11/26/ultimate-xss-css-injection/\n // This is not an XSS hole but instead a potential CSS injection issue\n // which has lead to a greater discussion about how we're going to\n // trust URLs moving forward. See #2115901\n\n var isEmpty = value == null || typeof value === 'boolean' || value === '';\n if (isEmpty) {\n return '';\n }\n\n if (!isCustomProperty && typeof value === 'number' && value !== 0 && !(isUnitlessNumber.hasOwnProperty(name) && isUnitlessNumber[name])) {\n return value + 'px'; // Presumes implicit 'px' suffix for unitless numbers\n }\n\n return ('' + value).trim();\n}\n\nvar warnValidStyle = emptyFunction;\n\n{\n // 'msTransform' is correct, but the other prefixes should be capitalized\n var badVendoredStyleNamePattern = /^(?:webkit|moz|o)[A-Z]/;\n\n // style values shouldn't contain a semicolon\n var badStyleValueWithSemicolonPattern = /;\\s*$/;\n\n var warnedStyleNames = {};\n var warnedStyleValues = {};\n var warnedForNaNValue = false;\n var warnedForInfinityValue = false;\n\n var warnHyphenatedStyleName = function (name, getStack) {\n if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {\n return;\n }\n\n warnedStyleNames[name] = true;\n warning(false, 'Unsupported style property %s. Did you mean %s?%s', name, camelizeStyleName(name), getStack());\n };\n\n var warnBadVendoredStyleName = function (name, getStack) {\n if (warnedStyleNames.hasOwnProperty(name) && warnedStyleNames[name]) {\n return;\n }\n\n warnedStyleNames[name] = true;\n warning(false, 'Unsupported vendor-prefixed style property %s. Did you mean %s?%s', name, name.charAt(0).toUpperCase() + name.slice(1), getStack());\n };\n\n var warnStyleValueWithSemicolon = function (name, value, getStack) {\n if (warnedStyleValues.hasOwnProperty(value) && warnedStyleValues[value]) {\n return;\n }\n\n warnedStyleValues[value] = true;\n warning(false, \"Style property values shouldn't contain a semicolon. \" + 'Try \"%s: %s\" instead.%s', name, value.replace(badStyleValueWithSemicolonPattern, ''), getStack());\n };\n\n var warnStyleValueIsNaN = function (name, value, getStack) {\n if (warnedForNaNValue) {\n return;\n }\n\n warnedForNaNValue = true;\n warning(false, '`NaN` is an invalid value for the `%s` css style property.%s', name, getStack());\n };\n\n var warnStyleValueIsInfinity = function (name, value, getStack) {\n if (warnedForInfinityValue) {\n return;\n }\n\n warnedForInfinityValue = true;\n warning(false, '`Infinity` is an invalid value for the `%s` css style property.%s', name, getStack());\n };\n\n warnValidStyle = function (name, value, getStack) {\n if (name.indexOf('-') > -1) {\n warnHyphenatedStyleName(name, getStack);\n } else if (badVendoredStyleNamePattern.test(name)) {\n warnBadVendoredStyleName(name, getStack);\n } else if (badStyleValueWithSemicolonPattern.test(value)) {\n warnStyleValueWithSemicolon(name, value, getStack);\n }\n\n if (typeof value === 'number') {\n if (isNaN(value)) {\n warnStyleValueIsNaN(name, value, getStack);\n } else if (!isFinite(value)) {\n warnStyleValueIsInfinity(name, value, getStack);\n }\n }\n };\n}\n\nvar warnValidStyle$1 = warnValidStyle;\n\n/**\n * Operations for dealing with CSS properties.\n */\n\n/**\n * This creates a string that is expected to be equivalent to the style\n * attribute generated by server-side rendering. It by-passes warnings and\n * security checks so it's not safe to use this value for anything other than\n * comparison. It is only used in DEV for SSR validation.\n */\nfunction createDangerousStringForStyles(styles) {\n {\n var serialized = '';\n var delimiter = '';\n for (var styleName in styles) {\n if (!styles.hasOwnProperty(styleName)) {\n continue;\n }\n var styleValue = styles[styleName];\n if (styleValue != null) {\n var isCustomProperty = styleName.indexOf('--') === 0;\n serialized += delimiter + hyphenateStyleName(styleName) + ':';\n serialized += dangerousStyleValue(styleName, styleValue, isCustomProperty);\n\n delimiter = ';';\n }\n }\n return serialized || null;\n }\n}\n\n/**\n * Sets the value for multiple styles on a node. If a value is specified as\n * '' (empty string), the corresponding style property will be unset.\n *\n * @param {DOMElement} node\n * @param {object} styles\n */\nfunction setValueForStyles(node, styles, getStack) {\n var style = node.style;\n for (var styleName in styles) {\n if (!styles.hasOwnProperty(styleName)) {\n continue;\n }\n var isCustomProperty = styleName.indexOf('--') === 0;\n {\n if (!isCustomProperty) {\n warnValidStyle$1(styleName, styles[styleName], getStack);\n }\n }\n var styleValue = dangerousStyleValue(styleName, styles[styleName], isCustomProperty);\n if (styleName === 'float') {\n styleName = 'cssFloat';\n }\n if (isCustomProperty) {\n style.setProperty(styleName, styleValue);\n } else {\n style[styleName] = styleValue;\n }\n }\n}\n\n// For HTML, certain tags should omit their close tag. We keep a whitelist for\n// those special-case tags.\n\nvar omittedCloseTags = {\n area: true,\n base: true,\n br: true,\n col: true,\n embed: true,\n hr: true,\n img: true,\n input: true,\n keygen: true,\n link: true,\n meta: true,\n param: true,\n source: true,\n track: true,\n wbr: true\n};\n\n// For HTML, certain tags cannot have children. This has the same purpose as\n// `omittedCloseTags` except that `menuitem` should still have its closing tag.\n\nvar voidElementTags = _assign({\n menuitem: true\n}, omittedCloseTags);\n\nvar HTML$1 = '__html';\n\nfunction assertValidProps(tag, props, getStack) {\n if (!props) {\n return;\n }\n // Note the use of `==` which checks for null or undefined.\n if (voidElementTags[tag]) {\n !(props.children == null && props.dangerouslySetInnerHTML == null) ? invariant(false, '%s is a void element tag and must neither have `children` nor use `dangerouslySetInnerHTML`.%s', tag, getStack()) : void 0;\n }\n if (props.dangerouslySetInnerHTML != null) {\n !(props.children == null) ? invariant(false, 'Can only set one of `children` or `props.dangerouslySetInnerHTML`.') : void 0;\n !(typeof props.dangerouslySetInnerHTML === 'object' && HTML$1 in props.dangerouslySetInnerHTML) ? invariant(false, '`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. Please visit https://fb.me/react-invariant-dangerously-set-inner-html for more information.') : void 0;\n }\n {\n warning(props.suppressContentEditableWarning || !props.contentEditable || props.children == null, 'A component is `contentEditable` and contains `children` managed by ' + 'React. It is now your responsibility to guarantee that none of ' + 'those nodes are unexpectedly modified or duplicated. This is ' + 'probably not intentional.%s', getStack());\n }\n !(props.style == null || typeof props.style === 'object') ? invariant(false, 'The `style` prop expects a mapping from style properties to values, not a string. For example, style={{marginRight: spacing + \\'em\\'}} when using JSX.%s', getStack()) : void 0;\n}\n\nfunction isCustomComponent(tagName, props) {\n if (tagName.indexOf('-') === -1) {\n return typeof props.is === 'string';\n }\n switch (tagName) {\n // These are reserved SVG and MathML elements.\n // We don't mind this whitelist too much because we expect it to never grow.\n // The alternative is to track the namespace in a few places which is convoluted.\n // https://w3c.github.io/webcomponents/spec/custom/#custom-elements-core-concepts\n case 'annotation-xml':\n case 'color-profile':\n case 'font-face':\n case 'font-face-src':\n case 'font-face-uri':\n case 'font-face-format':\n case 'font-face-name':\n case 'missing-glyph':\n return false;\n default:\n return true;\n }\n}\n\nvar ariaProperties = {\n 'aria-current': 0, // state\n 'aria-details': 0,\n 'aria-disabled': 0, // state\n 'aria-hidden': 0, // state\n 'aria-invalid': 0, // state\n 'aria-keyshortcuts': 0,\n 'aria-label': 0,\n 'aria-roledescription': 0,\n // Widget Attributes\n 'aria-autocomplete': 0,\n 'aria-checked': 0,\n 'aria-expanded': 0,\n 'aria-haspopup': 0,\n 'aria-level': 0,\n 'aria-modal': 0,\n 'aria-multiline': 0,\n 'aria-multiselectable': 0,\n 'aria-orientation': 0,\n 'aria-placeholder': 0,\n 'aria-pressed': 0,\n 'aria-readonly': 0,\n 'aria-required': 0,\n 'aria-selected': 0,\n 'aria-sort': 0,\n 'aria-valuemax': 0,\n 'aria-valuemin': 0,\n 'aria-valuenow': 0,\n 'aria-valuetext': 0,\n // Live Region Attributes\n 'aria-atomic': 0,\n 'aria-busy': 0,\n 'aria-live': 0,\n 'aria-relevant': 0,\n // Drag-and-Drop Attributes\n 'aria-dropeffect': 0,\n 'aria-grabbed': 0,\n // Relationship Attributes\n 'aria-activedescendant': 0,\n 'aria-colcount': 0,\n 'aria-colindex': 0,\n 'aria-colspan': 0,\n 'aria-controls': 0,\n 'aria-describedby': 0,\n 'aria-errormessage': 0,\n 'aria-flowto': 0,\n 'aria-labelledby': 0,\n 'aria-owns': 0,\n 'aria-posinset': 0,\n 'aria-rowcount': 0,\n 'aria-rowindex': 0,\n 'aria-rowspan': 0,\n 'aria-setsize': 0\n};\n\nvar warnedProperties = {};\nvar rARIA = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$');\nvar rARIACamel = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$');\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nfunction getStackAddendum() {\n var stack = ReactDebugCurrentFrame.getStackAddendum();\n return stack != null ? stack : '';\n}\n\nfunction validateProperty(tagName, name) {\n if (hasOwnProperty.call(warnedProperties, name) && warnedProperties[name]) {\n return true;\n }\n\n if (rARIACamel.test(name)) {\n var ariaName = 'aria-' + name.slice(4).toLowerCase();\n var correctName = ariaProperties.hasOwnProperty(ariaName) ? ariaName : null;\n\n // If this is an aria-* attribute, but is not listed in the known DOM\n // DOM properties, then it is an invalid aria-* attribute.\n if (correctName == null) {\n warning(false, 'Invalid ARIA attribute `%s`. ARIA attributes follow the pattern aria-* and must be lowercase.%s', name, getStackAddendum());\n warnedProperties[name] = true;\n return true;\n }\n // aria-* attributes should be lowercase; suggest the lowercase version.\n if (name !== correctName) {\n warning(false, 'Invalid ARIA attribute `%s`. Did you mean `%s`?%s', name, correctName, getStackAddendum());\n warnedProperties[name] = true;\n return true;\n }\n }\n\n if (rARIA.test(name)) {\n var lowerCasedName = name.toLowerCase();\n var standardName = ariaProperties.hasOwnProperty(lowerCasedName) ? lowerCasedName : null;\n\n // If this is an aria-* attribute, but is not listed in the known DOM\n // DOM properties, then it is an invalid aria-* attribute.\n if (standardName == null) {\n warnedProperties[name] = true;\n return false;\n }\n // aria-* attributes should be lowercase; suggest the lowercase version.\n if (name !== standardName) {\n warning(false, 'Unknown ARIA attribute `%s`. Did you mean `%s`?%s', name, standardName, getStackAddendum());\n warnedProperties[name] = true;\n return true;\n }\n }\n\n return true;\n}\n\nfunction warnInvalidARIAProps(type, props) {\n var invalidProps = [];\n\n for (var key in props) {\n var isValid = validateProperty(type, key);\n if (!isValid) {\n invalidProps.push(key);\n }\n }\n\n var unknownPropString = invalidProps.map(function (prop) {\n return '`' + prop + '`';\n }).join(', ');\n\n if (invalidProps.length === 1) {\n warning(false, 'Invalid aria prop %s on <%s> tag. ' + 'For details, see https://fb.me/invalid-aria-prop%s', unknownPropString, type, getStackAddendum());\n } else if (invalidProps.length > 1) {\n warning(false, 'Invalid aria props %s on <%s> tag. ' + 'For details, see https://fb.me/invalid-aria-prop%s', unknownPropString, type, getStackAddendum());\n }\n}\n\nfunction validateProperties(type, props) {\n if (isCustomComponent(type, props)) {\n return;\n }\n warnInvalidARIAProps(type, props);\n}\n\nvar didWarnValueNull = false;\n\nfunction getStackAddendum$1() {\n var stack = ReactDebugCurrentFrame.getStackAddendum();\n return stack != null ? stack : '';\n}\n\nfunction validateProperties$1(type, props) {\n if (type !== 'input' && type !== 'textarea' && type !== 'select') {\n return;\n }\n\n if (props != null && props.value === null && !didWarnValueNull) {\n didWarnValueNull = true;\n if (type === 'select' && props.multiple) {\n warning(false, '`value` prop on `%s` should not be null. ' + 'Consider using an empty array when `multiple` is set to `true` ' + 'to clear the component or `undefined` for uncontrolled components.%s', type, getStackAddendum$1());\n } else {\n warning(false, '`value` prop on `%s` should not be null. ' + 'Consider using an empty string to clear the component or `undefined` ' + 'for uncontrolled components.%s', type, getStackAddendum$1());\n }\n }\n}\n\n// When adding attributes to the HTML or SVG whitelist, be sure to\n// also add them to this module to ensure casing and incorrect name\n// warnings.\nvar possibleStandardNames = {\n // HTML\n accept: 'accept',\n acceptcharset: 'acceptCharset',\n 'accept-charset': 'acceptCharset',\n accesskey: 'accessKey',\n action: 'action',\n allowfullscreen: 'allowFullScreen',\n alt: 'alt',\n as: 'as',\n async: 'async',\n autocapitalize: 'autoCapitalize',\n autocomplete: 'autoComplete',\n autocorrect: 'autoCorrect',\n autofocus: 'autoFocus',\n autoplay: 'autoPlay',\n autosave: 'autoSave',\n capture: 'capture',\n cellpadding: 'cellPadding',\n cellspacing: 'cellSpacing',\n challenge: 'challenge',\n charset: 'charSet',\n checked: 'checked',\n children: 'children',\n cite: 'cite',\n 'class': 'className',\n classid: 'classID',\n classname: 'className',\n cols: 'cols',\n colspan: 'colSpan',\n content: 'content',\n contenteditable: 'contentEditable',\n contextmenu: 'contextMenu',\n controls: 'controls',\n controlslist: 'controlsList',\n coords: 'coords',\n crossorigin: 'crossOrigin',\n dangerouslysetinnerhtml: 'dangerouslySetInnerHTML',\n data: 'data',\n datetime: 'dateTime',\n 'default': 'default',\n defaultchecked: 'defaultChecked',\n defaultvalue: 'defaultValue',\n defer: 'defer',\n dir: 'dir',\n disabled: 'disabled',\n download: 'download',\n draggable: 'draggable',\n enctype: 'encType',\n 'for': 'htmlFor',\n form: 'form',\n formmethod: 'formMethod',\n formaction: 'formAction',\n formenctype: 'formEncType',\n formnovalidate: 'formNoValidate',\n formtarget: 'formTarget',\n frameborder: 'frameBorder',\n headers: 'headers',\n height: 'height',\n hidden: 'hidden',\n high: 'high',\n href: 'href',\n hreflang: 'hrefLang',\n htmlfor: 'htmlFor',\n httpequiv: 'httpEquiv',\n 'http-equiv': 'httpEquiv',\n icon: 'icon',\n id: 'id',\n innerhtml: 'innerHTML',\n inputmode: 'inputMode',\n integrity: 'integrity',\n is: 'is',\n itemid: 'itemID',\n itemprop: 'itemProp',\n itemref: 'itemRef',\n itemscope: 'itemScope',\n itemtype: 'itemType',\n keyparams: 'keyParams',\n keytype: 'keyType',\n kind: 'kind',\n label: 'label',\n lang: 'lang',\n list: 'list',\n loop: 'loop',\n low: 'low',\n manifest: 'manifest',\n marginwidth: 'marginWidth',\n marginheight: 'marginHeight',\n max: 'max',\n maxlength: 'maxLength',\n media: 'media',\n mediagroup: 'mediaGroup',\n method: 'method',\n min: 'min',\n minlength: 'minLength',\n multiple: 'multiple',\n muted: 'muted',\n name: 'name',\n nonce: 'nonce',\n novalidate: 'noValidate',\n open: 'open',\n optimum: 'optimum',\n pattern: 'pattern',\n placeholder: 'placeholder',\n playsinline: 'playsInline',\n poster: 'poster',\n preload: 'preload',\n profile: 'profile',\n radiogroup: 'radioGroup',\n readonly: 'readOnly',\n referrerpolicy: 'referrerPolicy',\n rel: 'rel',\n required: 'required',\n reversed: 'reversed',\n role: 'role',\n rows: 'rows',\n rowspan: 'rowSpan',\n sandbox: 'sandbox',\n scope: 'scope',\n scoped: 'scoped',\n scrolling: 'scrolling',\n seamless: 'seamless',\n selected: 'selected',\n shape: 'shape',\n size: 'size',\n sizes: 'sizes',\n span: 'span',\n spellcheck: 'spellCheck',\n src: 'src',\n srcdoc: 'srcDoc',\n srclang: 'srcLang',\n srcset: 'srcSet',\n start: 'start',\n step: 'step',\n style: 'style',\n summary: 'summary',\n tabindex: 'tabIndex',\n target: 'target',\n title: 'title',\n type: 'type',\n usemap: 'useMap',\n value: 'value',\n width: 'width',\n wmode: 'wmode',\n wrap: 'wrap',\n\n // SVG\n about: 'about',\n accentheight: 'accentHeight',\n 'accent-height': 'accentHeight',\n accumulate: 'accumulate',\n additive: 'additive',\n alignmentbaseline: 'alignmentBaseline',\n 'alignment-baseline': 'alignmentBaseline',\n allowreorder: 'allowReorder',\n alphabetic: 'alphabetic',\n amplitude: 'amplitude',\n arabicform: 'arabicForm',\n 'arabic-form': 'arabicForm',\n ascent: 'ascent',\n attributename: 'attributeName',\n attributetype: 'attributeType',\n autoreverse: 'autoReverse',\n azimuth: 'azimuth',\n basefrequency: 'baseFrequency',\n baselineshift: 'baselineShift',\n 'baseline-shift': 'baselineShift',\n baseprofile: 'baseProfile',\n bbox: 'bbox',\n begin: 'begin',\n bias: 'bias',\n by: 'by',\n calcmode: 'calcMode',\n capheight: 'capHeight',\n 'cap-height': 'capHeight',\n clip: 'clip',\n clippath: 'clipPath',\n 'clip-path': 'clipPath',\n clippathunits: 'clipPathUnits',\n cliprule: 'clipRule',\n 'clip-rule': 'clipRule',\n color: 'color',\n colorinterpolation: 'colorInterpolation',\n 'color-interpolation': 'colorInterpolation',\n colorinterpolationfilters: 'colorInterpolationFilters',\n 'color-interpolation-filters': 'colorInterpolationFilters',\n colorprofile: 'colorProfile',\n 'color-profile': 'colorProfile',\n colorrendering: 'colorRendering',\n 'color-rendering': 'colorRendering',\n contentscripttype: 'contentScriptType',\n contentstyletype: 'contentStyleType',\n cursor: 'cursor',\n cx: 'cx',\n cy: 'cy',\n d: 'd',\n datatype: 'datatype',\n decelerate: 'decelerate',\n descent: 'descent',\n diffuseconstant: 'diffuseConstant',\n direction: 'direction',\n display: 'display',\n divisor: 'divisor',\n dominantbaseline: 'dominantBaseline',\n 'dominant-baseline': 'dominantBaseline',\n dur: 'dur',\n dx: 'dx',\n dy: 'dy',\n edgemode: 'edgeMode',\n elevation: 'elevation',\n enablebackground: 'enableBackground',\n 'enable-background': 'enableBackground',\n end: 'end',\n exponent: 'exponent',\n externalresourcesrequired: 'externalResourcesRequired',\n fill: 'fill',\n fillopacity: 'fillOpacity',\n 'fill-opacity': 'fillOpacity',\n fillrule: 'fillRule',\n 'fill-rule': 'fillRule',\n filter: 'filter',\n filterres: 'filterRes',\n filterunits: 'filterUnits',\n floodopacity: 'floodOpacity',\n 'flood-opacity': 'floodOpacity',\n floodcolor: 'floodColor',\n 'flood-color': 'floodColor',\n focusable: 'focusable',\n fontfamily: 'fontFamily',\n 'font-family': 'fontFamily',\n fontsize: 'fontSize',\n 'font-size': 'fontSize',\n fontsizeadjust: 'fontSizeAdjust',\n 'font-size-adjust': 'fontSizeAdjust',\n fontstretch: 'fontStretch',\n 'font-stretch': 'fontStretch',\n fontstyle: 'fontStyle',\n 'font-style': 'fontStyle',\n fontvariant: 'fontVariant',\n 'font-variant': 'fontVariant',\n fontweight: 'fontWeight',\n 'font-weight': 'fontWeight',\n format: 'format',\n from: 'from',\n fx: 'fx',\n fy: 'fy',\n g1: 'g1',\n g2: 'g2',\n glyphname: 'glyphName',\n 'glyph-name': 'glyphName',\n glyphorientationhorizontal: 'glyphOrientationHorizontal',\n 'glyph-orientation-horizontal': 'glyphOrientationHorizontal',\n glyphorientationvertical: 'glyphOrientationVertical',\n 'glyph-orientation-vertical': 'glyphOrientationVertical',\n glyphref: 'glyphRef',\n gradienttransform: 'gradientTransform',\n gradientunits: 'gradientUnits',\n hanging: 'hanging',\n horizadvx: 'horizAdvX',\n 'horiz-adv-x': 'horizAdvX',\n horizoriginx: 'horizOriginX',\n 'horiz-origin-x': 'horizOriginX',\n ideographic: 'ideographic',\n imagerendering: 'imageRendering',\n 'image-rendering': 'imageRendering',\n in2: 'in2',\n 'in': 'in',\n inlist: 'inlist',\n intercept: 'intercept',\n k1: 'k1',\n k2: 'k2',\n k3: 'k3',\n k4: 'k4',\n k: 'k',\n kernelmatrix: 'kernelMatrix',\n kernelunitlength: 'kernelUnitLength',\n kerning: 'kerning',\n keypoints: 'keyPoints',\n keysplines: 'keySplines',\n keytimes: 'keyTimes',\n lengthadjust: 'lengthAdjust',\n letterspacing: 'letterSpacing',\n 'letter-spacing': 'letterSpacing',\n lightingcolor: 'lightingColor',\n 'lighting-color': 'lightingColor',\n limitingconeangle: 'limitingConeAngle',\n local: 'local',\n markerend: 'markerEnd',\n 'marker-end': 'markerEnd',\n markerheight: 'markerHeight',\n markermid: 'markerMid',\n 'marker-mid': 'markerMid',\n markerstart: 'markerStart',\n 'marker-start': 'markerStart',\n markerunits: 'markerUnits',\n markerwidth: 'markerWidth',\n mask: 'mask',\n maskcontentunits: 'maskContentUnits',\n maskunits: 'maskUnits',\n mathematical: 'mathematical',\n mode: 'mode',\n numoctaves: 'numOctaves',\n offset: 'offset',\n opacity: 'opacity',\n operator: 'operator',\n order: 'order',\n orient: 'orient',\n orientation: 'orientation',\n origin: 'origin',\n overflow: 'overflow',\n overlineposition: 'overlinePosition',\n 'overline-position': 'overlinePosition',\n overlinethickness: 'overlineThickness',\n 'overline-thickness': 'overlineThickness',\n paintorder: 'paintOrder',\n 'paint-order': 'paintOrder',\n panose1: 'panose1',\n 'panose-1': 'panose1',\n pathlength: 'pathLength',\n patterncontentunits: 'patternContentUnits',\n patterntransform: 'patternTransform',\n patternunits: 'patternUnits',\n pointerevents: 'pointerEvents',\n 'pointer-events': 'pointerEvents',\n points: 'points',\n pointsatx: 'pointsAtX',\n pointsaty: 'pointsAtY',\n pointsatz: 'pointsAtZ',\n prefix: 'prefix',\n preservealpha: 'preserveAlpha',\n preserveaspectratio: 'preserveAspectRatio',\n primitiveunits: 'primitiveUnits',\n property: 'property',\n r: 'r',\n radius: 'radius',\n refx: 'refX',\n refy: 'refY',\n renderingintent: 'renderingIntent',\n 'rendering-intent': 'renderingIntent',\n repeatcount: 'repeatCount',\n repeatdur: 'repeatDur',\n requiredextensions: 'requiredExtensions',\n requiredfeatures: 'requiredFeatures',\n resource: 'resource',\n restart: 'restart',\n result: 'result',\n results: 'results',\n rotate: 'rotate',\n rx: 'rx',\n ry: 'ry',\n scale: 'scale',\n security: 'security',\n seed: 'seed',\n shaperendering: 'shapeRendering',\n 'shape-rendering': 'shapeRendering',\n slope: 'slope',\n spacing: 'spacing',\n specularconstant: 'specularConstant',\n specularexponent: 'specularExponent',\n speed: 'speed',\n spreadmethod: 'spreadMethod',\n startoffset: 'startOffset',\n stddeviation: 'stdDeviation',\n stemh: 'stemh',\n stemv: 'stemv',\n stitchtiles: 'stitchTiles',\n stopcolor: 'stopColor',\n 'stop-color': 'stopColor',\n stopopacity: 'stopOpacity',\n 'stop-opacity': 'stopOpacity',\n strikethroughposition: 'strikethroughPosition',\n 'strikethrough-position': 'strikethroughPosition',\n strikethroughthickness: 'strikethroughThickness',\n 'strikethrough-thickness': 'strikethroughThickness',\n string: 'string',\n stroke: 'stroke',\n strokedasharray: 'strokeDasharray',\n 'stroke-dasharray': 'strokeDasharray',\n strokedashoffset: 'strokeDashoffset',\n 'stroke-dashoffset': 'strokeDashoffset',\n strokelinecap: 'strokeLinecap',\n 'stroke-linecap': 'strokeLinecap',\n strokelinejoin: 'strokeLinejoin',\n 'stroke-linejoin': 'strokeLinejoin',\n strokemiterlimit: 'strokeMiterlimit',\n 'stroke-miterlimit': 'strokeMiterlimit',\n strokewidth: 'strokeWidth',\n 'stroke-width': 'strokeWidth',\n strokeopacity: 'strokeOpacity',\n 'stroke-opacity': 'strokeOpacity',\n suppresscontenteditablewarning: 'suppressContentEditableWarning',\n suppresshydrationwarning: 'suppressHydrationWarning',\n surfacescale: 'surfaceScale',\n systemlanguage: 'systemLanguage',\n tablevalues: 'tableValues',\n targetx: 'targetX',\n targety: 'targetY',\n textanchor: 'textAnchor',\n 'text-anchor': 'textAnchor',\n textdecoration: 'textDecoration',\n 'text-decoration': 'textDecoration',\n textlength: 'textLength',\n textrendering: 'textRendering',\n 'text-rendering': 'textRendering',\n to: 'to',\n transform: 'transform',\n 'typeof': 'typeof',\n u1: 'u1',\n u2: 'u2',\n underlineposition: 'underlinePosition',\n 'underline-position': 'underlinePosition',\n underlinethickness: 'underlineThickness',\n 'underline-thickness': 'underlineThickness',\n unicode: 'unicode',\n unicodebidi: 'unicodeBidi',\n 'unicode-bidi': 'unicodeBidi',\n unicoderange: 'unicodeRange',\n 'unicode-range': 'unicodeRange',\n unitsperem: 'unitsPerEm',\n 'units-per-em': 'unitsPerEm',\n unselectable: 'unselectable',\n valphabetic: 'vAlphabetic',\n 'v-alphabetic': 'vAlphabetic',\n values: 'values',\n vectoreffect: 'vectorEffect',\n 'vector-effect': 'vectorEffect',\n version: 'version',\n vertadvy: 'vertAdvY',\n 'vert-adv-y': 'vertAdvY',\n vertoriginx: 'vertOriginX',\n 'vert-origin-x': 'vertOriginX',\n vertoriginy: 'vertOriginY',\n 'vert-origin-y': 'vertOriginY',\n vhanging: 'vHanging',\n 'v-hanging': 'vHanging',\n videographic: 'vIdeographic',\n 'v-ideographic': 'vIdeographic',\n viewbox: 'viewBox',\n viewtarget: 'viewTarget',\n visibility: 'visibility',\n vmathematical: 'vMathematical',\n 'v-mathematical': 'vMathematical',\n vocab: 'vocab',\n widths: 'widths',\n wordspacing: 'wordSpacing',\n 'word-spacing': 'wordSpacing',\n writingmode: 'writingMode',\n 'writing-mode': 'writingMode',\n x1: 'x1',\n x2: 'x2',\n x: 'x',\n xchannelselector: 'xChannelSelector',\n xheight: 'xHeight',\n 'x-height': 'xHeight',\n xlinkactuate: 'xlinkActuate',\n 'xlink:actuate': 'xlinkActuate',\n xlinkarcrole: 'xlinkArcrole',\n 'xlink:arcrole': 'xlinkArcrole',\n xlinkhref: 'xlinkHref',\n 'xlink:href': 'xlinkHref',\n xlinkrole: 'xlinkRole',\n 'xlink:role': 'xlinkRole',\n xlinkshow: 'xlinkShow',\n 'xlink:show': 'xlinkShow',\n xlinktitle: 'xlinkTitle',\n 'xlink:title': 'xlinkTitle',\n xlinktype: 'xlinkType',\n 'xlink:type': 'xlinkType',\n xmlbase: 'xmlBase',\n 'xml:base': 'xmlBase',\n xmllang: 'xmlLang',\n 'xml:lang': 'xmlLang',\n xmlns: 'xmlns',\n 'xml:space': 'xmlSpace',\n xmlnsxlink: 'xmlnsXlink',\n 'xmlns:xlink': 'xmlnsXlink',\n xmlspace: 'xmlSpace',\n y1: 'y1',\n y2: 'y2',\n y: 'y',\n ychannelselector: 'yChannelSelector',\n z: 'z',\n zoomandpan: 'zoomAndPan'\n};\n\nfunction getStackAddendum$2() {\n var stack = ReactDebugCurrentFrame.getStackAddendum();\n return stack != null ? stack : '';\n}\n\n{\n var warnedProperties$1 = {};\n var hasOwnProperty$1 = Object.prototype.hasOwnProperty;\n var EVENT_NAME_REGEX = /^on./;\n var INVALID_EVENT_NAME_REGEX = /^on[^A-Z]/;\n var rARIA$1 = new RegExp('^(aria)-[' + ATTRIBUTE_NAME_CHAR + ']*$');\n var rARIACamel$1 = new RegExp('^(aria)[A-Z][' + ATTRIBUTE_NAME_CHAR + ']*$');\n\n var validateProperty$1 = function (tagName, name, value, canUseEventSystem) {\n if (hasOwnProperty$1.call(warnedProperties$1, name) && warnedProperties$1[name]) {\n return true;\n }\n\n var lowerCasedName = name.toLowerCase();\n if (lowerCasedName === 'onfocusin' || lowerCasedName === 'onfocusout') {\n warning(false, 'React uses onFocus and onBlur instead of onFocusIn and onFocusOut. ' + 'All React events are normalized to bubble, so onFocusIn and onFocusOut ' + 'are not needed/supported by React.');\n warnedProperties$1[name] = true;\n return true;\n }\n\n // We can't rely on the event system being injected on the server.\n if (canUseEventSystem) {\n if (registrationNameModules.hasOwnProperty(name)) {\n return true;\n }\n var registrationName = possibleRegistrationNames.hasOwnProperty(lowerCasedName) ? possibleRegistrationNames[lowerCasedName] : null;\n if (registrationName != null) {\n warning(false, 'Invalid event handler property `%s`. Did you mean `%s`?%s', name, registrationName, getStackAddendum$2());\n warnedProperties$1[name] = true;\n return true;\n }\n if (EVENT_NAME_REGEX.test(name)) {\n warning(false, 'Unknown event handler property `%s`. It will be ignored.%s', name, getStackAddendum$2());\n warnedProperties$1[name] = true;\n return true;\n }\n } else if (EVENT_NAME_REGEX.test(name)) {\n // If no event plugins have been injected, we are in a server environment.\n // So we can't tell if the event name is correct for sure, but we can filter\n // out known bad ones like `onclick`. We can't suggest a specific replacement though.\n if (INVALID_EVENT_NAME_REGEX.test(name)) {\n warning(false, 'Invalid event handler property `%s`. ' + 'React events use the camelCase naming convention, for example `onClick`.%s', name, getStackAddendum$2());\n }\n warnedProperties$1[name] = true;\n return true;\n }\n\n // Let the ARIA attribute hook validate ARIA attributes\n if (rARIA$1.test(name) || rARIACamel$1.test(name)) {\n return true;\n }\n\n if (lowerCasedName === 'innerhtml') {\n warning(false, 'Directly setting property `innerHTML` is not permitted. ' + 'For more information, lookup documentation on `dangerouslySetInnerHTML`.');\n warnedProperties$1[name] = true;\n return true;\n }\n\n if (lowerCasedName === 'aria') {\n warning(false, 'The `aria` attribute is reserved for future use in React. ' + 'Pass individual `aria-` attributes instead.');\n warnedProperties$1[name] = true;\n return true;\n }\n\n if (lowerCasedName === 'is' && value !== null && value !== undefined && typeof value !== 'string') {\n warning(false, 'Received a `%s` for a string attribute `is`. If this is expected, cast ' + 'the value to a string.%s', typeof value, getStackAddendum$2());\n warnedProperties$1[name] = true;\n return true;\n }\n\n if (typeof value === 'number' && isNaN(value)) {\n warning(false, 'Received NaN for the `%s` attribute. If this is expected, cast ' + 'the value to a string.%s', name, getStackAddendum$2());\n warnedProperties$1[name] = true;\n return true;\n }\n\n var isReserved = isReservedProp(name);\n\n // Known attributes should match the casing specified in the property config.\n if (possibleStandardNames.hasOwnProperty(lowerCasedName)) {\n var standardName = possibleStandardNames[lowerCasedName];\n if (standardName !== name) {\n warning(false, 'Invalid DOM property `%s`. Did you mean `%s`?%s', name, standardName, getStackAddendum$2());\n warnedProperties$1[name] = true;\n return true;\n }\n } else if (!isReserved && name !== lowerCasedName) {\n // Unknown attributes should have lowercase casing since that's how they\n // will be cased anyway with server rendering.\n warning(false, 'React does not recognize the `%s` prop on a DOM element. If you ' + 'intentionally want it to appear in the DOM as a custom ' + 'attribute, spell it as lowercase `%s` instead. ' + 'If you accidentally passed it from a parent component, remove ' + 'it from the DOM element.%s', name, lowerCasedName, getStackAddendum$2());\n warnedProperties$1[name] = true;\n return true;\n }\n\n if (typeof value === 'boolean' && !shouldAttributeAcceptBooleanValue(name)) {\n if (value) {\n warning(false, 'Received `%s` for a non-boolean attribute `%s`.\\n\\n' + 'If you want to write it to the DOM, pass a string instead: ' + '%s=\"%s\" or %s={value.toString()}.%s', value, name, name, value, name, getStackAddendum$2());\n } else {\n warning(false, 'Received `%s` for a non-boolean attribute `%s`.\\n\\n' + 'If you want to write it to the DOM, pass a string instead: ' + '%s=\"%s\" or %s={value.toString()}.\\n\\n' + 'If you used to conditionally omit it with %s={condition && value}, ' + 'pass %s={condition ? value : undefined} instead.%s', value, name, name, value, name, name, name, getStackAddendum$2());\n }\n warnedProperties$1[name] = true;\n return true;\n }\n\n // Now that we've validated casing, do not validate\n // data types for reserved props\n if (isReserved) {\n return true;\n }\n\n // Warn when a known attribute is a bad type\n if (!shouldSetAttribute(name, value)) {\n warnedProperties$1[name] = true;\n return false;\n }\n\n return true;\n };\n}\n\nvar warnUnknownProperties = function (type, props, canUseEventSystem) {\n var unknownProps = [];\n for (var key in props) {\n var isValid = validateProperty$1(type, key, props[key], canUseEventSystem);\n if (!isValid) {\n unknownProps.push(key);\n }\n }\n\n var unknownPropString = unknownProps.map(function (prop) {\n return '`' + prop + '`';\n }).join(', ');\n if (unknownProps.length === 1) {\n warning(false, 'Invalid value for prop %s on <%s> tag. Either remove it from the element, ' + 'or pass a string or number value to keep it in the DOM. ' + 'For details, see https://fb.me/react-attribute-behavior%s', unknownPropString, type, getStackAddendum$2());\n } else if (unknownProps.length > 1) {\n warning(false, 'Invalid values for props %s on <%s> tag. Either remove them from the element, ' + 'or pass a string or number value to keep them in the DOM. ' + 'For details, see https://fb.me/react-attribute-behavior%s', unknownPropString, type, getStackAddendum$2());\n }\n};\n\nfunction validateProperties$2(type, props, canUseEventSystem) {\n if (isCustomComponent(type, props)) {\n return;\n }\n warnUnknownProperties(type, props, canUseEventSystem);\n}\n\n// TODO: direct imports like some-package/src/* are bad. Fix me.\nvar getCurrentFiberOwnerName$1 = ReactDebugCurrentFiber.getCurrentFiberOwnerName;\nvar getCurrentFiberStackAddendum$2 = ReactDebugCurrentFiber.getCurrentFiberStackAddendum;\n\nvar didWarnInvalidHydration = false;\nvar didWarnShadyDOM = false;\n\nvar DANGEROUSLY_SET_INNER_HTML = 'dangerouslySetInnerHTML';\nvar SUPPRESS_CONTENT_EDITABLE_WARNING = 'suppressContentEditableWarning';\nvar SUPPRESS_HYDRATION_WARNING$1 = 'suppressHydrationWarning';\nvar AUTOFOCUS = 'autoFocus';\nvar CHILDREN = 'children';\nvar STYLE = 'style';\nvar HTML = '__html';\n\nvar HTML_NAMESPACE = Namespaces.html;\n\n\nvar getStack = emptyFunction.thatReturns('');\n\n{\n getStack = getCurrentFiberStackAddendum$2;\n\n var warnedUnknownTags = {\n // Chrome is the only major browser not shipping <time>. But as of July\n // 2017 it intends to ship it due to widespread usage. We intentionally\n // *don't* warn for <time> even if it's unrecognized by Chrome because\n // it soon will be, and many apps have been using it anyway.\n time: true,\n // There are working polyfills for <dialog>. Let people use it.\n dialog: true\n };\n\n var validatePropertiesInDevelopment = function (type, props) {\n validateProperties(type, props);\n validateProperties$1(type, props);\n validateProperties$2(type, props, /* canUseEventSystem */true);\n };\n\n // HTML parsing normalizes CR and CRLF to LF.\n // It also can turn \\u0000 into \\uFFFD inside attributes.\n // https://www.w3.org/TR/html5/single-page.html#preprocessing-the-input-stream\n // If we have a mismatch, it might be caused by that.\n // We will still patch up in this case but not fire the warning.\n var NORMALIZE_NEWLINES_REGEX = /\\r\\n?/g;\n var NORMALIZE_NULL_AND_REPLACEMENT_REGEX = /\\u0000|\\uFFFD/g;\n\n var normalizeMarkupForTextOrAttribute = function (markup) {\n var markupString = typeof markup === 'string' ? markup : '' + markup;\n return markupString.replace(NORMALIZE_NEWLINES_REGEX, '\\n').replace(NORMALIZE_NULL_AND_REPLACEMENT_REGEX, '');\n };\n\n var warnForTextDifference = function (serverText, clientText) {\n if (didWarnInvalidHydration) {\n return;\n }\n var normalizedClientText = normalizeMarkupForTextOrAttribute(clientText);\n var normalizedServerText = normalizeMarkupForTextOrAttribute(serverText);\n if (normalizedServerText === normalizedClientText) {\n return;\n }\n didWarnInvalidHydration = true;\n warning(false, 'Text content did not match. Server: \"%s\" Client: \"%s\"', normalizedServerText, normalizedClientText);\n };\n\n var warnForPropDifference = function (propName, serverValue, clientValue) {\n if (didWarnInvalidHydration) {\n return;\n }\n var normalizedClientValue = normalizeMarkupForTextOrAttribute(clientValue);\n var normalizedServerValue = normalizeMarkupForTextOrAttribute(serverValue);\n if (normalizedServerValue === normalizedClientValue) {\n return;\n }\n didWarnInvalidHydration = true;\n warning(false, 'Prop `%s` did not match. Server: %s Client: %s', propName, JSON.stringify(normalizedServerValue), JSON.stringify(normalizedClientValue));\n };\n\n var warnForExtraAttributes = function (attributeNames) {\n if (didWarnInvalidHydration) {\n return;\n }\n didWarnInvalidHydration = true;\n var names = [];\n attributeNames.forEach(function (name) {\n names.push(name);\n });\n warning(false, 'Extra attributes from the server: %s', names);\n };\n\n var warnForInvalidEventListener = function (registrationName, listener) {\n if (listener === false) {\n warning(false, 'Expected `%s` listener to be a function, instead got `false`.\\n\\n' + 'If you used to conditionally omit it with %s={condition && value}, ' + 'pass %s={condition ? value : undefined} instead.%s', registrationName, registrationName, registrationName, getCurrentFiberStackAddendum$2());\n } else {\n warning(false, 'Expected `%s` listener to be a function, instead got a value of `%s` type.%s', registrationName, typeof listener, getCurrentFiberStackAddendum$2());\n }\n };\n\n // Parse the HTML and read it back to normalize the HTML string so that it\n // can be used for comparison.\n var normalizeHTML = function (parent, html) {\n // We could have created a separate document here to avoid\n // re-initializing custom elements if they exist. But this breaks\n // how <noscript> is being handled. So we use the same document.\n // See the discussion in https://github.com/facebook/react/pull/11157.\n var testElement = parent.namespaceURI === HTML_NAMESPACE ? parent.ownerDocument.createElement(parent.tagName) : parent.ownerDocument.createElementNS(parent.namespaceURI, parent.tagName);\n testElement.innerHTML = html;\n return testElement.innerHTML;\n };\n}\n\nfunction ensureListeningTo(rootContainerElement, registrationName) {\n var isDocumentOrFragment = rootContainerElement.nodeType === DOCUMENT_NODE || rootContainerElement.nodeType === DOCUMENT_FRAGMENT_NODE;\n var doc = isDocumentOrFragment ? rootContainerElement : rootContainerElement.ownerDocument;\n listenTo(registrationName, doc);\n}\n\nfunction getOwnerDocumentFromRootContainer(rootContainerElement) {\n return rootContainerElement.nodeType === DOCUMENT_NODE ? rootContainerElement : rootContainerElement.ownerDocument;\n}\n\n// There are so many media events, it makes sense to just\n// maintain a list rather than create a `trapBubbledEvent` for each\nvar mediaEvents = {\n topAbort: 'abort',\n topCanPlay: 'canplay',\n topCanPlayThrough: 'canplaythrough',\n topDurationChange: 'durationchange',\n topEmptied: 'emptied',\n topEncrypted: 'encrypted',\n topEnded: 'ended',\n topError: 'error',\n topLoadedData: 'loadeddata',\n topLoadedMetadata: 'loadedmetadata',\n topLoadStart: 'loadstart',\n topPause: 'pause',\n topPlay: 'play',\n topPlaying: 'playing',\n topProgress: 'progress',\n topRateChange: 'ratechange',\n topSeeked: 'seeked',\n topSeeking: 'seeking',\n topStalled: 'stalled',\n topSuspend: 'suspend',\n topTimeUpdate: 'timeupdate',\n topVolumeChange: 'volumechange',\n topWaiting: 'waiting'\n};\n\nfunction trapClickOnNonInteractiveElement(node) {\n // Mobile Safari does not fire properly bubble click events on\n // non-interactive elements, which means delegated click listeners do not\n // fire. The workaround for this bug involves attaching an empty click\n // listener on the target node.\n // http://www.quirksmode.org/blog/archives/2010/09/click_event_del.html\n // Just set it using the onclick property so that we don't have to manage any\n // bookkeeping for it. Not sure if we need to clear it when the listener is\n // removed.\n // TODO: Only do this for the relevant Safaris maybe?\n node.onclick = emptyFunction;\n}\n\nfunction setInitialDOMProperties(tag, domElement, rootContainerElement, nextProps, isCustomComponentTag) {\n for (var propKey in nextProps) {\n if (!nextProps.hasOwnProperty(propKey)) {\n continue;\n }\n var nextProp = nextProps[propKey];\n if (propKey === STYLE) {\n {\n if (nextProp) {\n // Freeze the next style object so that we can assume it won't be\n // mutated. We have already warned for this in the past.\n Object.freeze(nextProp);\n }\n }\n // Relies on `updateStylesByID` not mutating `styleUpdates`.\n setValueForStyles(domElement, nextProp, getStack);\n } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {\n var nextHtml = nextProp ? nextProp[HTML] : undefined;\n if (nextHtml != null) {\n setInnerHTML(domElement, nextHtml);\n }\n } else if (propKey === CHILDREN) {\n if (typeof nextProp === 'string') {\n // Avoid setting initial textContent when the text is empty. In IE11 setting\n // textContent on a <textarea> will cause the placeholder to not\n // show within the <textarea> until it has been focused and blurred again.\n // https://github.com/facebook/react/issues/6731#issuecomment-254874553\n var canSetTextContent = tag !== 'textarea' || nextProp !== '';\n if (canSetTextContent) {\n setTextContent(domElement, nextProp);\n }\n } else if (typeof nextProp === 'number') {\n setTextContent(domElement, '' + nextProp);\n }\n } else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING$1) {\n // Noop\n } else if (propKey === AUTOFOCUS) {\n // We polyfill it separately on the client during commit.\n // We blacklist it here rather than in the property list because we emit it in SSR.\n } else if (registrationNameModules.hasOwnProperty(propKey)) {\n if (nextProp != null) {\n if (true && typeof nextProp !== 'function') {\n warnForInvalidEventListener(propKey, nextProp);\n }\n ensureListeningTo(rootContainerElement, propKey);\n }\n } else if (isCustomComponentTag) {\n setValueForAttribute(domElement, propKey, nextProp);\n } else if (nextProp != null) {\n // If we're updating to null or undefined, we should remove the property\n // from the DOM node instead of inadvertently setting to a string. This\n // brings us in line with the same behavior we have on initial render.\n setValueForProperty(domElement, propKey, nextProp);\n }\n }\n}\n\nfunction updateDOMProperties(domElement, updatePayload, wasCustomComponentTag, isCustomComponentTag) {\n // TODO: Handle wasCustomComponentTag\n for (var i = 0; i < updatePayload.length; i += 2) {\n var propKey = updatePayload[i];\n var propValue = updatePayload[i + 1];\n if (propKey === STYLE) {\n setValueForStyles(domElement, propValue, getStack);\n } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {\n setInnerHTML(domElement, propValue);\n } else if (propKey === CHILDREN) {\n setTextContent(domElement, propValue);\n } else if (isCustomComponentTag) {\n if (propValue != null) {\n setValueForAttribute(domElement, propKey, propValue);\n } else {\n deleteValueForAttribute(domElement, propKey);\n }\n } else if (propValue != null) {\n setValueForProperty(domElement, propKey, propValue);\n } else {\n // If we're updating to null or undefined, we should remove the property\n // from the DOM node instead of inadvertently setting to a string. This\n // brings us in line with the same behavior we have on initial render.\n deleteValueForProperty(domElement, propKey);\n }\n }\n}\n\nfunction createElement$1(type, props, rootContainerElement, parentNamespace) {\n // We create tags in the namespace of their parent container, except HTML\n var ownerDocument = getOwnerDocumentFromRootContainer(rootContainerElement);\n var domElement;\n var namespaceURI = parentNamespace;\n if (namespaceURI === HTML_NAMESPACE) {\n namespaceURI = getIntrinsicNamespace(type);\n }\n if (namespaceURI === HTML_NAMESPACE) {\n {\n var isCustomComponentTag = isCustomComponent(type, props);\n // Should this check be gated by parent namespace? Not sure we want to\n // allow <SVG> or <mATH>.\n warning(isCustomComponentTag || type === type.toLowerCase(), '<%s /> is using uppercase HTML. Always use lowercase HTML tags ' + 'in React.', type);\n }\n\n if (type === 'script') {\n // Create the script via .innerHTML so its \"parser-inserted\" flag is\n // set to true and it does not execute\n var div = ownerDocument.createElement('div');\n div.innerHTML = '<script><' + '/script>'; // eslint-disable-line\n // This is guaranteed to yield a script element.\n var firstChild = div.firstChild;\n domElement = div.removeChild(firstChild);\n } else if (typeof props.is === 'string') {\n // $FlowIssue `createElement` should be updated for Web Components\n domElement = ownerDocument.createElement(type, { is: props.is });\n } else {\n // Separate else branch instead of using `props.is || undefined` above because of a Firefox bug.\n // See discussion in https://github.com/facebook/react/pull/6896\n // and discussion in https://bugzilla.mozilla.org/show_bug.cgi?id=1276240\n domElement = ownerDocument.createElement(type);\n }\n } else {\n domElement = ownerDocument.createElementNS(namespaceURI, type);\n }\n\n {\n if (namespaceURI === HTML_NAMESPACE) {\n if (!isCustomComponentTag && Object.prototype.toString.call(domElement) === '[object HTMLUnknownElement]' && !Object.prototype.hasOwnProperty.call(warnedUnknownTags, type)) {\n warnedUnknownTags[type] = true;\n warning(false, 'The tag <%s> is unrecognized in this browser. ' + 'If you meant to render a React component, start its name with ' + 'an uppercase letter.', type);\n }\n }\n }\n\n return domElement;\n}\n\nfunction createTextNode$1(text, rootContainerElement) {\n return getOwnerDocumentFromRootContainer(rootContainerElement).createTextNode(text);\n}\n\nfunction setInitialProperties$1(domElement, tag, rawProps, rootContainerElement) {\n var isCustomComponentTag = isCustomComponent(tag, rawProps);\n {\n validatePropertiesInDevelopment(tag, rawProps);\n if (isCustomComponentTag && !didWarnShadyDOM && domElement.shadyRoot) {\n warning(false, '%s is using shady DOM. Using shady DOM with React can ' + 'cause things to break subtly.', getCurrentFiberOwnerName$1() || 'A component');\n didWarnShadyDOM = true;\n }\n }\n\n // TODO: Make sure that we check isMounted before firing any of these events.\n var props;\n switch (tag) {\n case 'iframe':\n case 'object':\n trapBubbledEvent('topLoad', 'load', domElement);\n props = rawProps;\n break;\n case 'video':\n case 'audio':\n // Create listener for each media event\n for (var event in mediaEvents) {\n if (mediaEvents.hasOwnProperty(event)) {\n trapBubbledEvent(event, mediaEvents[event], domElement);\n }\n }\n props = rawProps;\n break;\n case 'source':\n trapBubbledEvent('topError', 'error', domElement);\n props = rawProps;\n break;\n case 'img':\n case 'image':\n trapBubbledEvent('topError', 'error', domElement);\n trapBubbledEvent('topLoad', 'load', domElement);\n props = rawProps;\n break;\n case 'form':\n trapBubbledEvent('topReset', 'reset', domElement);\n trapBubbledEvent('topSubmit', 'submit', domElement);\n props = rawProps;\n break;\n case 'details':\n trapBubbledEvent('topToggle', 'toggle', domElement);\n props = rawProps;\n break;\n case 'input':\n initWrapperState(domElement, rawProps);\n props = getHostProps(domElement, rawProps);\n trapBubbledEvent('topInvalid', 'invalid', domElement);\n // For controlled components we always need to ensure we're listening\n // to onChange. Even if there is no listener.\n ensureListeningTo(rootContainerElement, 'onChange');\n break;\n case 'option':\n validateProps(domElement, rawProps);\n props = getHostProps$1(domElement, rawProps);\n break;\n case 'select':\n initWrapperState$1(domElement, rawProps);\n props = getHostProps$2(domElement, rawProps);\n trapBubbledEvent('topInvalid', 'invalid', domElement);\n // For controlled components we always need to ensure we're listening\n // to onChange. Even if there is no listener.\n ensureListeningTo(rootContainerElement, 'onChange');\n break;\n case 'textarea':\n initWrapperState$2(domElement, rawProps);\n props = getHostProps$3(domElement, rawProps);\n trapBubbledEvent('topInvalid', 'invalid', domElement);\n // For controlled components we always need to ensure we're listening\n // to onChange. Even if there is no listener.\n ensureListeningTo(rootContainerElement, 'onChange');\n break;\n default:\n props = rawProps;\n }\n\n assertValidProps(tag, props, getStack);\n\n setInitialDOMProperties(tag, domElement, rootContainerElement, props, isCustomComponentTag);\n\n switch (tag) {\n case 'input':\n // TODO: Make sure we check if this is still unmounted or do any clean\n // up necessary since we never stop tracking anymore.\n track(domElement);\n postMountWrapper(domElement, rawProps);\n break;\n case 'textarea':\n // TODO: Make sure we check if this is still unmounted or do any clean\n // up necessary since we never stop tracking anymore.\n track(domElement);\n postMountWrapper$3(domElement, rawProps);\n break;\n case 'option':\n postMountWrapper$1(domElement, rawProps);\n break;\n case 'select':\n postMountWrapper$2(domElement, rawProps);\n break;\n default:\n if (typeof props.onClick === 'function') {\n // TODO: This cast may not be sound for SVG, MathML or custom elements.\n trapClickOnNonInteractiveElement(domElement);\n }\n break;\n }\n}\n\n// Calculate the diff between the two objects.\nfunction diffProperties$1(domElement, tag, lastRawProps, nextRawProps, rootContainerElement) {\n {\n validatePropertiesInDevelopment(tag, nextRawProps);\n }\n\n var updatePayload = null;\n\n var lastProps;\n var nextProps;\n switch (tag) {\n case 'input':\n lastProps = getHostProps(domElement, lastRawProps);\n nextProps = getHostProps(domElement, nextRawProps);\n updatePayload = [];\n break;\n case 'option':\n lastProps = getHostProps$1(domElement, lastRawProps);\n nextProps = getHostProps$1(domElement, nextRawProps);\n updatePayload = [];\n break;\n case 'select':\n lastProps = getHostProps$2(domElement, lastRawProps);\n nextProps = getHostProps$2(domElement, nextRawProps);\n updatePayload = [];\n break;\n case 'textarea':\n lastProps = getHostProps$3(domElement, lastRawProps);\n nextProps = getHostProps$3(domElement, nextRawProps);\n updatePayload = [];\n break;\n default:\n lastProps = lastRawProps;\n nextProps = nextRawProps;\n if (typeof lastProps.onClick !== 'function' && typeof nextProps.onClick === 'function') {\n // TODO: This cast may not be sound for SVG, MathML or custom elements.\n trapClickOnNonInteractiveElement(domElement);\n }\n break;\n }\n\n assertValidProps(tag, nextProps, getStack);\n\n var propKey;\n var styleName;\n var styleUpdates = null;\n for (propKey in lastProps) {\n if (nextProps.hasOwnProperty(propKey) || !lastProps.hasOwnProperty(propKey) || lastProps[propKey] == null) {\n continue;\n }\n if (propKey === STYLE) {\n var lastStyle = lastProps[propKey];\n for (styleName in lastStyle) {\n if (lastStyle.hasOwnProperty(styleName)) {\n if (!styleUpdates) {\n styleUpdates = {};\n }\n styleUpdates[styleName] = '';\n }\n }\n } else if (propKey === DANGEROUSLY_SET_INNER_HTML || propKey === CHILDREN) {\n // Noop. This is handled by the clear text mechanism.\n } else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING$1) {\n // Noop\n } else if (propKey === AUTOFOCUS) {\n // Noop. It doesn't work on updates anyway.\n } else if (registrationNameModules.hasOwnProperty(propKey)) {\n // This is a special case. If any listener updates we need to ensure\n // that the \"current\" fiber pointer gets updated so we need a commit\n // to update this element.\n if (!updatePayload) {\n updatePayload = [];\n }\n } else {\n // For all other deleted properties we add it to the queue. We use\n // the whitelist in the commit phase instead.\n (updatePayload = updatePayload || []).push(propKey, null);\n }\n }\n for (propKey in nextProps) {\n var nextProp = nextProps[propKey];\n var lastProp = lastProps != null ? lastProps[propKey] : undefined;\n if (!nextProps.hasOwnProperty(propKey) || nextProp === lastProp || nextProp == null && lastProp == null) {\n continue;\n }\n if (propKey === STYLE) {\n {\n if (nextProp) {\n // Freeze the next style object so that we can assume it won't be\n // mutated. We have already warned for this in the past.\n Object.freeze(nextProp);\n }\n }\n if (lastProp) {\n // Unset styles on `lastProp` but not on `nextProp`.\n for (styleName in lastProp) {\n if (lastProp.hasOwnProperty(styleName) && (!nextProp || !nextProp.hasOwnProperty(styleName))) {\n if (!styleUpdates) {\n styleUpdates = {};\n }\n styleUpdates[styleName] = '';\n }\n }\n // Update styles that changed since `lastProp`.\n for (styleName in nextProp) {\n if (nextProp.hasOwnProperty(styleName) && lastProp[styleName] !== nextProp[styleName]) {\n if (!styleUpdates) {\n styleUpdates = {};\n }\n styleUpdates[styleName] = nextProp[styleName];\n }\n }\n } else {\n // Relies on `updateStylesByID` not mutating `styleUpdates`.\n if (!styleUpdates) {\n if (!updatePayload) {\n updatePayload = [];\n }\n updatePayload.push(propKey, styleUpdates);\n }\n styleUpdates = nextProp;\n }\n } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {\n var nextHtml = nextProp ? nextProp[HTML] : undefined;\n var lastHtml = lastProp ? lastProp[HTML] : undefined;\n if (nextHtml != null) {\n if (lastHtml !== nextHtml) {\n (updatePayload = updatePayload || []).push(propKey, '' + nextHtml);\n }\n } else {\n // TODO: It might be too late to clear this if we have children\n // inserted already.\n }\n } else if (propKey === CHILDREN) {\n if (lastProp !== nextProp && (typeof nextProp === 'string' || typeof nextProp === 'number')) {\n (updatePayload = updatePayload || []).push(propKey, '' + nextProp);\n }\n } else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING$1) {\n // Noop\n } else if (registrationNameModules.hasOwnProperty(propKey)) {\n if (nextProp != null) {\n // We eagerly listen to this even though we haven't committed yet.\n if (true && typeof nextProp !== 'function') {\n warnForInvalidEventListener(propKey, nextProp);\n }\n ensureListeningTo(rootContainerElement, propKey);\n }\n if (!updatePayload && lastProp !== nextProp) {\n // This is a special case. If any listener updates we need to ensure\n // that the \"current\" props pointer gets updated so we need a commit\n // to update this element.\n updatePayload = [];\n }\n } else {\n // For any other property we always add it to the queue and then we\n // filter it out using the whitelist during the commit.\n (updatePayload = updatePayload || []).push(propKey, nextProp);\n }\n }\n if (styleUpdates) {\n (updatePayload = updatePayload || []).push(STYLE, styleUpdates);\n }\n return updatePayload;\n}\n\n// Apply the diff.\nfunction updateProperties$1(domElement, updatePayload, tag, lastRawProps, nextRawProps) {\n // Update checked *before* name.\n // In the middle of an update, it is possible to have multiple checked.\n // When a checked radio tries to change name, browser makes another radio's checked false.\n if (tag === 'input' && nextRawProps.type === 'radio' && nextRawProps.name != null) {\n updateChecked(domElement, nextRawProps);\n }\n\n var wasCustomComponentTag = isCustomComponent(tag, lastRawProps);\n var isCustomComponentTag = isCustomComponent(tag, nextRawProps);\n // Apply the diff.\n updateDOMProperties(domElement, updatePayload, wasCustomComponentTag, isCustomComponentTag);\n\n // TODO: Ensure that an update gets scheduled if any of the special props\n // changed.\n switch (tag) {\n case 'input':\n // Update the wrapper around inputs *after* updating props. This has to\n // happen after `updateDOMProperties`. Otherwise HTML5 input validations\n // raise warnings and prevent the new value from being assigned.\n updateWrapper(domElement, nextRawProps);\n break;\n case 'textarea':\n updateWrapper$1(domElement, nextRawProps);\n break;\n case 'select':\n // <select> value update needs to occur after <option> children\n // reconciliation\n postUpdateWrapper(domElement, nextRawProps);\n break;\n }\n}\n\nfunction diffHydratedProperties$1(domElement, tag, rawProps, parentNamespace, rootContainerElement) {\n {\n var suppressHydrationWarning = rawProps[SUPPRESS_HYDRATION_WARNING$1] === true;\n var isCustomComponentTag = isCustomComponent(tag, rawProps);\n validatePropertiesInDevelopment(tag, rawProps);\n if (isCustomComponentTag && !didWarnShadyDOM && domElement.shadyRoot) {\n warning(false, '%s is using shady DOM. Using shady DOM with React can ' + 'cause things to break subtly.', getCurrentFiberOwnerName$1() || 'A component');\n didWarnShadyDOM = true;\n }\n }\n\n // TODO: Make sure that we check isMounted before firing any of these events.\n switch (tag) {\n case 'iframe':\n case 'object':\n trapBubbledEvent('topLoad', 'load', domElement);\n break;\n case 'video':\n case 'audio':\n // Create listener for each media event\n for (var event in mediaEvents) {\n if (mediaEvents.hasOwnProperty(event)) {\n trapBubbledEvent(event, mediaEvents[event], domElement);\n }\n }\n break;\n case 'source':\n trapBubbledEvent('topError', 'error', domElement);\n break;\n case 'img':\n case 'image':\n trapBubbledEvent('topError', 'error', domElement);\n trapBubbledEvent('topLoad', 'load', domElement);\n break;\n case 'form':\n trapBubbledEvent('topReset', 'reset', domElement);\n trapBubbledEvent('topSubmit', 'submit', domElement);\n break;\n case 'details':\n trapBubbledEvent('topToggle', 'toggle', domElement);\n break;\n case 'input':\n initWrapperState(domElement, rawProps);\n trapBubbledEvent('topInvalid', 'invalid', domElement);\n // For controlled components we always need to ensure we're listening\n // to onChange. Even if there is no listener.\n ensureListeningTo(rootContainerElement, 'onChange');\n break;\n case 'option':\n validateProps(domElement, rawProps);\n break;\n case 'select':\n initWrapperState$1(domElement, rawProps);\n trapBubbledEvent('topInvalid', 'invalid', domElement);\n // For controlled components we always need to ensure we're listening\n // to onChange. Even if there is no listener.\n ensureListeningTo(rootContainerElement, 'onChange');\n break;\n case 'textarea':\n initWrapperState$2(domElement, rawProps);\n trapBubbledEvent('topInvalid', 'invalid', domElement);\n // For controlled components we always need to ensure we're listening\n // to onChange. Even if there is no listener.\n ensureListeningTo(rootContainerElement, 'onChange');\n break;\n }\n\n assertValidProps(tag, rawProps, getStack);\n\n {\n var extraAttributeNames = new Set();\n var attributes = domElement.attributes;\n for (var i = 0; i < attributes.length; i++) {\n var name = attributes[i].name.toLowerCase();\n switch (name) {\n // Built-in SSR attribute is whitelisted\n case 'data-reactroot':\n break;\n // Controlled attributes are not validated\n // TODO: Only ignore them on controlled tags.\n case 'value':\n break;\n case 'checked':\n break;\n case 'selected':\n break;\n default:\n // Intentionally use the original name.\n // See discussion in https://github.com/facebook/react/pull/10676.\n extraAttributeNames.add(attributes[i].name);\n }\n }\n }\n\n var updatePayload = null;\n for (var propKey in rawProps) {\n if (!rawProps.hasOwnProperty(propKey)) {\n continue;\n }\n var nextProp = rawProps[propKey];\n if (propKey === CHILDREN) {\n // For text content children we compare against textContent. This\n // might match additional HTML that is hidden when we read it using\n // textContent. E.g. \"foo\" will match \"f<span>oo</span>\" but that still\n // satisfies our requirement. Our requirement is not to produce perfect\n // HTML and attributes. Ideally we should preserve structure but it's\n // ok not to if the visible content is still enough to indicate what\n // even listeners these nodes might be wired up to.\n // TODO: Warn if there is more than a single textNode as a child.\n // TODO: Should we use domElement.firstChild.nodeValue to compare?\n if (typeof nextProp === 'string') {\n if (domElement.textContent !== nextProp) {\n if (true && !suppressHydrationWarning) {\n warnForTextDifference(domElement.textContent, nextProp);\n }\n updatePayload = [CHILDREN, nextProp];\n }\n } else if (typeof nextProp === 'number') {\n if (domElement.textContent !== '' + nextProp) {\n if (true && !suppressHydrationWarning) {\n warnForTextDifference(domElement.textContent, nextProp);\n }\n updatePayload = [CHILDREN, '' + nextProp];\n }\n }\n } else if (registrationNameModules.hasOwnProperty(propKey)) {\n if (nextProp != null) {\n if (true && typeof nextProp !== 'function') {\n warnForInvalidEventListener(propKey, nextProp);\n }\n ensureListeningTo(rootContainerElement, propKey);\n }\n } else {\n // Validate that the properties correspond to their expected values.\n var serverValue;\n var propertyInfo;\n if (suppressHydrationWarning) {\n // Don't bother comparing. We're ignoring all these warnings.\n } else if (propKey === SUPPRESS_CONTENT_EDITABLE_WARNING || propKey === SUPPRESS_HYDRATION_WARNING$1 ||\n // Controlled attributes are not validated\n // TODO: Only ignore them on controlled tags.\n propKey === 'value' || propKey === 'checked' || propKey === 'selected') {\n // Noop\n } else if (propKey === DANGEROUSLY_SET_INNER_HTML) {\n var rawHtml = nextProp ? nextProp[HTML] || '' : '';\n var serverHTML = domElement.innerHTML;\n var expectedHTML = normalizeHTML(domElement, rawHtml);\n if (expectedHTML !== serverHTML) {\n warnForPropDifference(propKey, serverHTML, expectedHTML);\n }\n } else if (propKey === STYLE) {\n // $FlowFixMe - Should be inferred as not undefined.\n extraAttributeNames['delete'](propKey);\n var expectedStyle = createDangerousStringForStyles(nextProp);\n serverValue = domElement.getAttribute('style');\n if (expectedStyle !== serverValue) {\n warnForPropDifference(propKey, serverValue, expectedStyle);\n }\n } else if (isCustomComponentTag) {\n // $FlowFixMe - Should be inferred as not undefined.\n extraAttributeNames['delete'](propKey.toLowerCase());\n serverValue = getValueForAttribute(domElement, propKey, nextProp);\n\n if (nextProp !== serverValue) {\n warnForPropDifference(propKey, serverValue, nextProp);\n }\n } else if (shouldSetAttribute(propKey, nextProp)) {\n if (propertyInfo = getPropertyInfo(propKey)) {\n // $FlowFixMe - Should be inferred as not undefined.\n extraAttributeNames['delete'](propertyInfo.attributeName);\n serverValue = getValueForProperty(domElement, propKey, nextProp);\n } else {\n var ownNamespace = parentNamespace;\n if (ownNamespace === HTML_NAMESPACE) {\n ownNamespace = getIntrinsicNamespace(tag);\n }\n if (ownNamespace === HTML_NAMESPACE) {\n // $FlowFixMe - Should be inferred as not undefined.\n extraAttributeNames['delete'](propKey.toLowerCase());\n } else {\n // $FlowFixMe - Should be inferred as not undefined.\n extraAttributeNames['delete'](propKey);\n }\n serverValue = getValueForAttribute(domElement, propKey, nextProp);\n }\n\n if (nextProp !== serverValue) {\n warnForPropDifference(propKey, serverValue, nextProp);\n }\n }\n }\n }\n\n {\n // $FlowFixMe - Should be inferred as not undefined.\n if (extraAttributeNames.size > 0 && !suppressHydrationWarning) {\n // $FlowFixMe - Should be inferred as not undefined.\n warnForExtraAttributes(extraAttributeNames);\n }\n }\n\n switch (tag) {\n case 'input':\n // TODO: Make sure we check if this is still unmounted or do any clean\n // up necessary since we never stop tracking anymore.\n track(domElement);\n postMountWrapper(domElement, rawProps);\n break;\n case 'textarea':\n // TODO: Make sure we check if this is still unmounted or do any clean\n // up necessary since we never stop tracking anymore.\n track(domElement);\n postMountWrapper$3(domElement, rawProps);\n break;\n case 'select':\n case 'option':\n // For input and textarea we current always set the value property at\n // post mount to force it to diverge from attributes. However, for\n // option and select we don't quite do the same thing and select\n // is not resilient to the DOM state changing so we don't do that here.\n // TODO: Consider not doing this for input and textarea.\n break;\n default:\n if (typeof rawProps.onClick === 'function') {\n // TODO: This cast may not be sound for SVG, MathML or custom elements.\n trapClickOnNonInteractiveElement(domElement);\n }\n break;\n }\n\n return updatePayload;\n}\n\nfunction diffHydratedText$1(textNode, text) {\n var isDifferent = textNode.nodeValue !== text;\n return isDifferent;\n}\n\nfunction warnForUnmatchedText$1(textNode, text) {\n {\n warnForTextDifference(textNode.nodeValue, text);\n }\n}\n\nfunction warnForDeletedHydratableElement$1(parentNode, child) {\n {\n if (didWarnInvalidHydration) {\n return;\n }\n didWarnInvalidHydration = true;\n warning(false, 'Did not expect server HTML to contain a <%s> in <%s>.', child.nodeName.toLowerCase(), parentNode.nodeName.toLowerCase());\n }\n}\n\nfunction warnForDeletedHydratableText$1(parentNode, child) {\n {\n if (didWarnInvalidHydration) {\n return;\n }\n didWarnInvalidHydration = true;\n warning(false, 'Did not expect server HTML to contain the text node \"%s\" in <%s>.', child.nodeValue, parentNode.nodeName.toLowerCase());\n }\n}\n\nfunction warnForInsertedHydratedElement$1(parentNode, tag, props) {\n {\n if (didWarnInvalidHydration) {\n return;\n }\n didWarnInvalidHydration = true;\n warning(false, 'Expected server HTML to contain a matching <%s> in <%s>.', tag, parentNode.nodeName.toLowerCase());\n }\n}\n\nfunction warnForInsertedHydratedText$1(parentNode, text) {\n {\n if (text === '') {\n // We expect to insert empty text nodes since they're not represented in\n // the HTML.\n // TODO: Remove this special case if we can just avoid inserting empty\n // text nodes.\n return;\n }\n if (didWarnInvalidHydration) {\n return;\n }\n didWarnInvalidHydration = true;\n warning(false, 'Expected server HTML to contain a matching text node for \"%s\" in <%s>.', text, parentNode.nodeName.toLowerCase());\n }\n}\n\nfunction restoreControlledState(domElement, tag, props) {\n switch (tag) {\n case 'input':\n restoreControlledState$1(domElement, props);\n return;\n case 'textarea':\n restoreControlledState$3(domElement, props);\n return;\n case 'select':\n restoreControlledState$2(domElement, props);\n return;\n }\n}\n\nvar ReactDOMFiberComponent = Object.freeze({\n\tcreateElement: createElement$1,\n\tcreateTextNode: createTextNode$1,\n\tsetInitialProperties: setInitialProperties$1,\n\tdiffProperties: diffProperties$1,\n\tupdateProperties: updateProperties$1,\n\tdiffHydratedProperties: diffHydratedProperties$1,\n\tdiffHydratedText: diffHydratedText$1,\n\twarnForUnmatchedText: warnForUnmatchedText$1,\n\twarnForDeletedHydratableElement: warnForDeletedHydratableElement$1,\n\twarnForDeletedHydratableText: warnForDeletedHydratableText$1,\n\twarnForInsertedHydratedElement: warnForInsertedHydratedElement$1,\n\twarnForInsertedHydratedText: warnForInsertedHydratedText$1,\n\trestoreControlledState: restoreControlledState\n});\n\n// TODO: direct imports like some-package/src/* are bad. Fix me.\nvar getCurrentFiberStackAddendum$6 = ReactDebugCurrentFiber.getCurrentFiberStackAddendum;\n\nvar validateDOMNesting = emptyFunction;\n\n{\n // This validation code was written based on the HTML5 parsing spec:\n // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope\n //\n // Note: this does not catch all invalid nesting, nor does it try to (as it's\n // not clear what practical benefit doing so provides); instead, we warn only\n // for cases where the parser will give a parse tree differing from what React\n // intended. For example, <b><div></div></b> is invalid but we don't warn\n // because it still parses correctly; we do warn for other cases like nested\n // <p> tags where the beginning of the second element implicitly closes the\n // first, causing a confusing mess.\n\n // https://html.spec.whatwg.org/multipage/syntax.html#special\n var specialTags = ['address', 'applet', 'area', 'article', 'aside', 'base', 'basefont', 'bgsound', 'blockquote', 'body', 'br', 'button', 'caption', 'center', 'col', 'colgroup', 'dd', 'details', 'dir', 'div', 'dl', 'dt', 'embed', 'fieldset', 'figcaption', 'figure', 'footer', 'form', 'frame', 'frameset', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'iframe', 'img', 'input', 'isindex', 'li', 'link', 'listing', 'main', 'marquee', 'menu', 'menuitem', 'meta', 'nav', 'noembed', 'noframes', 'noscript', 'object', 'ol', 'p', 'param', 'plaintext', 'pre', 'script', 'section', 'select', 'source', 'style', 'summary', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'title', 'tr', 'track', 'ul', 'wbr', 'xmp'];\n\n // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope\n var inScopeTags = ['applet', 'caption', 'html', 'table', 'td', 'th', 'marquee', 'object', 'template',\n\n // https://html.spec.whatwg.org/multipage/syntax.html#html-integration-point\n // TODO: Distinguish by namespace here -- for <title>, including it here\n // errs on the side of fewer warnings\n 'foreignObject', 'desc', 'title'];\n\n // https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-button-scope\n var buttonScopeTags = inScopeTags.concat(['button']);\n\n // https://html.spec.whatwg.org/multipage/syntax.html#generate-implied-end-tags\n var impliedEndTags = ['dd', 'dt', 'li', 'option', 'optgroup', 'p', 'rp', 'rt'];\n\n var emptyAncestorInfo = {\n current: null,\n\n formTag: null,\n aTagInScope: null,\n buttonTagInScope: null,\n nobrTagInScope: null,\n pTagInButtonScope: null,\n\n listItemTagAutoclosing: null,\n dlItemTagAutoclosing: null\n };\n\n var updatedAncestorInfo$1 = function (oldInfo, tag, instance) {\n var ancestorInfo = _assign({}, oldInfo || emptyAncestorInfo);\n var info = { tag: tag, instance: instance };\n\n if (inScopeTags.indexOf(tag) !== -1) {\n ancestorInfo.aTagInScope = null;\n ancestorInfo.buttonTagInScope = null;\n ancestorInfo.nobrTagInScope = null;\n }\n if (buttonScopeTags.indexOf(tag) !== -1) {\n ancestorInfo.pTagInButtonScope = null;\n }\n\n // See rules for 'li', 'dd', 'dt' start tags in\n // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody\n if (specialTags.indexOf(tag) !== -1 && tag !== 'address' && tag !== 'div' && tag !== 'p') {\n ancestorInfo.listItemTagAutoclosing = null;\n ancestorInfo.dlItemTagAutoclosing = null;\n }\n\n ancestorInfo.current = info;\n\n if (tag === 'form') {\n ancestorInfo.formTag = info;\n }\n if (tag === 'a') {\n ancestorInfo.aTagInScope = info;\n }\n if (tag === 'button') {\n ancestorInfo.buttonTagInScope = info;\n }\n if (tag === 'nobr') {\n ancestorInfo.nobrTagInScope = info;\n }\n if (tag === 'p') {\n ancestorInfo.pTagInButtonScope = info;\n }\n if (tag === 'li') {\n ancestorInfo.listItemTagAutoclosing = info;\n }\n if (tag === 'dd' || tag === 'dt') {\n ancestorInfo.dlItemTagAutoclosing = info;\n }\n\n return ancestorInfo;\n };\n\n /**\n * Returns whether\n */\n var isTagValidWithParent = function (tag, parentTag) {\n // First, let's check if we're in an unusual parsing mode...\n switch (parentTag) {\n // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inselect\n case 'select':\n return tag === 'option' || tag === 'optgroup' || tag === '#text';\n case 'optgroup':\n return tag === 'option' || tag === '#text';\n // Strictly speaking, seeing an <option> doesn't mean we're in a <select>\n // but\n case 'option':\n return tag === '#text';\n // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intd\n // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incaption\n // No special behavior since these rules fall back to \"in body\" mode for\n // all except special table nodes which cause bad parsing behavior anyway.\n\n // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intr\n case 'tr':\n return tag === 'th' || tag === 'td' || tag === 'style' || tag === 'script' || tag === 'template';\n // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intbody\n case 'tbody':\n case 'thead':\n case 'tfoot':\n return tag === 'tr' || tag === 'style' || tag === 'script' || tag === 'template';\n // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-incolgroup\n case 'colgroup':\n return tag === 'col' || tag === 'template';\n // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-intable\n case 'table':\n return tag === 'caption' || tag === 'colgroup' || tag === 'tbody' || tag === 'tfoot' || tag === 'thead' || tag === 'style' || tag === 'script' || tag === 'template';\n // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inhead\n case 'head':\n return tag === 'base' || tag === 'basefont' || tag === 'bgsound' || tag === 'link' || tag === 'meta' || tag === 'title' || tag === 'noscript' || tag === 'noframes' || tag === 'style' || tag === 'script' || tag === 'template';\n // https://html.spec.whatwg.org/multipage/semantics.html#the-html-element\n case 'html':\n return tag === 'head' || tag === 'body';\n case '#document':\n return tag === 'html';\n }\n\n // Probably in the \"in body\" parsing mode, so we outlaw only tag combos\n // where the parsing rules cause implicit opens or closes to be added.\n // https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inbody\n switch (tag) {\n case 'h1':\n case 'h2':\n case 'h3':\n case 'h4':\n case 'h5':\n case 'h6':\n return parentTag !== 'h1' && parentTag !== 'h2' && parentTag !== 'h3' && parentTag !== 'h4' && parentTag !== 'h5' && parentTag !== 'h6';\n\n case 'rp':\n case 'rt':\n return impliedEndTags.indexOf(parentTag) === -1;\n\n case 'body':\n case 'caption':\n case 'col':\n case 'colgroup':\n case 'frame':\n case 'head':\n case 'html':\n case 'tbody':\n case 'td':\n case 'tfoot':\n case 'th':\n case 'thead':\n case 'tr':\n // These tags are only valid with a few parents that have special child\n // parsing rules -- if we're down here, then none of those matched and\n // so we allow it only if we don't know what the parent is, as all other\n // cases are invalid.\n return parentTag == null;\n }\n\n return true;\n };\n\n /**\n * Returns whether\n */\n var findInvalidAncestorForTag = function (tag, ancestorInfo) {\n switch (tag) {\n case 'address':\n case 'article':\n case 'aside':\n case 'blockquote':\n case 'center':\n case 'details':\n case 'dialog':\n case 'dir':\n case 'div':\n case 'dl':\n case 'fieldset':\n case 'figcaption':\n case 'figure':\n case 'footer':\n case 'header':\n case 'hgroup':\n case 'main':\n case 'menu':\n case 'nav':\n case 'ol':\n case 'p':\n case 'section':\n case 'summary':\n case 'ul':\n case 'pre':\n case 'listing':\n case 'table':\n case 'hr':\n case 'xmp':\n case 'h1':\n case 'h2':\n case 'h3':\n case 'h4':\n case 'h5':\n case 'h6':\n return ancestorInfo.pTagInButtonScope;\n\n case 'form':\n return ancestorInfo.formTag || ancestorInfo.pTagInButtonScope;\n\n case 'li':\n return ancestorInfo.listItemTagAutoclosing;\n\n case 'dd':\n case 'dt':\n return ancestorInfo.dlItemTagAutoclosing;\n\n case 'button':\n return ancestorInfo.buttonTagInScope;\n\n case 'a':\n // Spec says something about storing a list of markers, but it sounds\n // equivalent to this check.\n return ancestorInfo.aTagInScope;\n\n case 'nobr':\n return ancestorInfo.nobrTagInScope;\n }\n\n return null;\n };\n\n var didWarn = {};\n\n validateDOMNesting = function (childTag, childText, ancestorInfo) {\n ancestorInfo = ancestorInfo || emptyAncestorInfo;\n var parentInfo = ancestorInfo.current;\n var parentTag = parentInfo && parentInfo.tag;\n\n if (childText != null) {\n warning(childTag == null, 'validateDOMNesting: when childText is passed, childTag should be null');\n childTag = '#text';\n }\n\n var invalidParent = isTagValidWithParent(childTag, parentTag) ? null : parentInfo;\n var invalidAncestor = invalidParent ? null : findInvalidAncestorForTag(childTag, ancestorInfo);\n var invalidParentOrAncestor = invalidParent || invalidAncestor;\n if (!invalidParentOrAncestor) {\n return;\n }\n\n var ancestorTag = invalidParentOrAncestor.tag;\n var addendum = getCurrentFiberStackAddendum$6();\n\n var warnKey = !!invalidParent + '|' + childTag + '|' + ancestorTag + '|' + addendum;\n if (didWarn[warnKey]) {\n return;\n }\n didWarn[warnKey] = true;\n\n var tagDisplayName = childTag;\n var whitespaceInfo = '';\n if (childTag === '#text') {\n if (/\\S/.test(childText)) {\n tagDisplayName = 'Text nodes';\n } else {\n tagDisplayName = 'Whitespace text nodes';\n whitespaceInfo = \" Make sure you don't have any extra whitespace between tags on \" + 'each line of your source code.';\n }\n } else {\n tagDisplayName = '<' + childTag + '>';\n }\n\n if (invalidParent) {\n var info = '';\n if (ancestorTag === 'table' && childTag === 'tr') {\n info += ' Add a <tbody> to your code to match the DOM tree generated by ' + 'the browser.';\n }\n warning(false, 'validateDOMNesting(...): %s cannot appear as a child of <%s>.%s%s%s', tagDisplayName, ancestorTag, whitespaceInfo, info, addendum);\n } else {\n warning(false, 'validateDOMNesting(...): %s cannot appear as a descendant of ' + '<%s>.%s', tagDisplayName, ancestorTag, addendum);\n }\n };\n\n // TODO: turn this into a named export\n validateDOMNesting.updatedAncestorInfo = updatedAncestorInfo$1;\n\n // For testing\n validateDOMNesting.isTagValidInContext = function (tag, ancestorInfo) {\n ancestorInfo = ancestorInfo || emptyAncestorInfo;\n var parentInfo = ancestorInfo.current;\n var parentTag = parentInfo && parentInfo.tag;\n return isTagValidWithParent(tag, parentTag) && !findInvalidAncestorForTag(tag, ancestorInfo);\n };\n}\n\nvar validateDOMNesting$1 = validateDOMNesting;\n\n// TODO: direct imports like some-package/src/* are bad. Fix me.\nvar createElement = createElement$1;\nvar createTextNode = createTextNode$1;\nvar setInitialProperties = setInitialProperties$1;\nvar diffProperties = diffProperties$1;\nvar updateProperties = updateProperties$1;\nvar diffHydratedProperties = diffHydratedProperties$1;\nvar diffHydratedText = diffHydratedText$1;\nvar warnForUnmatchedText = warnForUnmatchedText$1;\nvar warnForDeletedHydratableElement = warnForDeletedHydratableElement$1;\nvar warnForDeletedHydratableText = warnForDeletedHydratableText$1;\nvar warnForInsertedHydratedElement = warnForInsertedHydratedElement$1;\nvar warnForInsertedHydratedText = warnForInsertedHydratedText$1;\nvar updatedAncestorInfo = validateDOMNesting$1.updatedAncestorInfo;\nvar precacheFiberNode = precacheFiberNode$1;\nvar updateFiberProps = updateFiberProps$1;\n\n\n{\n var SUPPRESS_HYDRATION_WARNING = 'suppressHydrationWarning';\n if (typeof Map !== 'function' || Map.prototype == null || typeof Map.prototype.forEach !== 'function' || typeof Set !== 'function' || Set.prototype == null || typeof Set.prototype.clear !== 'function' || typeof Set.prototype.forEach !== 'function') {\n warning(false, 'React depends on Map and Set built-in types. Make sure that you load a ' + 'polyfill in older browsers. http://fb.me/react-polyfills');\n }\n}\n\ninjection$3.injectFiberControlledHostComponent(ReactDOMFiberComponent);\n\nvar eventsEnabled = null;\nvar selectionInformation = null;\n\n/**\n * True if the supplied DOM node is a valid node element.\n *\n * @param {?DOMElement} node The candidate DOM node.\n * @return {boolean} True if the DOM is a valid DOM node.\n * @internal\n */\nfunction isValidContainer(node) {\n return !!(node && (node.nodeType === ELEMENT_NODE || node.nodeType === DOCUMENT_NODE || node.nodeType === DOCUMENT_FRAGMENT_NODE || node.nodeType === COMMENT_NODE && node.nodeValue === ' react-mount-point-unstable '));\n}\n\nfunction getReactRootElementInContainer(container) {\n if (!container) {\n return null;\n }\n\n if (container.nodeType === DOCUMENT_NODE) {\n return container.documentElement;\n } else {\n return container.firstChild;\n }\n}\n\nfunction shouldHydrateDueToLegacyHeuristic(container) {\n var rootElement = getReactRootElementInContainer(container);\n return !!(rootElement && rootElement.nodeType === ELEMENT_NODE && rootElement.hasAttribute(ROOT_ATTRIBUTE_NAME));\n}\n\nfunction shouldAutoFocusHostComponent(type, props) {\n switch (type) {\n case 'button':\n case 'input':\n case 'select':\n case 'textarea':\n return !!props.autoFocus;\n }\n return false;\n}\n\nvar DOMRenderer = reactReconciler({\n getRootHostContext: function (rootContainerInstance) {\n var type = void 0;\n var namespace = void 0;\n var nodeType = rootContainerInstance.nodeType;\n switch (nodeType) {\n case DOCUMENT_NODE:\n case DOCUMENT_FRAGMENT_NODE:\n {\n type = nodeType === DOCUMENT_NODE ? '#document' : '#fragment';\n var root = rootContainerInstance.documentElement;\n namespace = root ? root.namespaceURI : getChildNamespace(null, '');\n break;\n }\n default:\n {\n var container = nodeType === COMMENT_NODE ? rootContainerInstance.parentNode : rootContainerInstance;\n var ownNamespace = container.namespaceURI || null;\n type = container.tagName;\n namespace = getChildNamespace(ownNamespace, type);\n break;\n }\n }\n {\n var validatedTag = type.toLowerCase();\n var _ancestorInfo = updatedAncestorInfo(null, validatedTag, null);\n return { namespace: namespace, ancestorInfo: _ancestorInfo };\n }\n return namespace;\n },\n getChildHostContext: function (parentHostContext, type) {\n {\n var parentHostContextDev = parentHostContext;\n var _namespace = getChildNamespace(parentHostContextDev.namespace, type);\n var _ancestorInfo2 = updatedAncestorInfo(parentHostContextDev.ancestorInfo, type, null);\n return { namespace: _namespace, ancestorInfo: _ancestorInfo2 };\n }\n var parentNamespace = parentHostContext;\n return getChildNamespace(parentNamespace, type);\n },\n getPublicInstance: function (instance) {\n return instance;\n },\n prepareForCommit: function () {\n eventsEnabled = isEnabled();\n selectionInformation = getSelectionInformation();\n setEnabled(false);\n },\n resetAfterCommit: function () {\n restoreSelection(selectionInformation);\n selectionInformation = null;\n setEnabled(eventsEnabled);\n eventsEnabled = null;\n },\n createInstance: function (type, props, rootContainerInstance, hostContext, internalInstanceHandle) {\n var parentNamespace = void 0;\n {\n // TODO: take namespace into account when validating.\n var hostContextDev = hostContext;\n validateDOMNesting$1(type, null, hostContextDev.ancestorInfo);\n if (typeof props.children === 'string' || typeof props.children === 'number') {\n var string = '' + props.children;\n var ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type, null);\n validateDOMNesting$1(null, string, ownAncestorInfo);\n }\n parentNamespace = hostContextDev.namespace;\n }\n var domElement = createElement(type, props, rootContainerInstance, parentNamespace);\n precacheFiberNode(internalInstanceHandle, domElement);\n updateFiberProps(domElement, props);\n return domElement;\n },\n appendInitialChild: function (parentInstance, child) {\n parentInstance.appendChild(child);\n },\n finalizeInitialChildren: function (domElement, type, props, rootContainerInstance) {\n setInitialProperties(domElement, type, props, rootContainerInstance);\n return shouldAutoFocusHostComponent(type, props);\n },\n prepareUpdate: function (domElement, type, oldProps, newProps, rootContainerInstance, hostContext) {\n {\n var hostContextDev = hostContext;\n if (typeof newProps.children !== typeof oldProps.children && (typeof newProps.children === 'string' || typeof newProps.children === 'number')) {\n var string = '' + newProps.children;\n var ownAncestorInfo = updatedAncestorInfo(hostContextDev.ancestorInfo, type, null);\n validateDOMNesting$1(null, string, ownAncestorInfo);\n }\n }\n return diffProperties(domElement, type, oldProps, newProps, rootContainerInstance);\n },\n shouldSetTextContent: function (type, props) {\n return type === 'textarea' || typeof props.children === 'string' || typeof props.children === 'number' || typeof props.dangerouslySetInnerHTML === 'object' && props.dangerouslySetInnerHTML !== null && typeof props.dangerouslySetInnerHTML.__html === 'string';\n },\n shouldDeprioritizeSubtree: function (type, props) {\n return !!props.hidden;\n },\n createTextInstance: function (text, rootContainerInstance, hostContext, internalInstanceHandle) {\n {\n var hostContextDev = hostContext;\n validateDOMNesting$1(null, text, hostContextDev.ancestorInfo);\n }\n var textNode = createTextNode(text, rootContainerInstance);\n precacheFiberNode(internalInstanceHandle, textNode);\n return textNode;\n },\n\n\n now: now,\n\n mutation: {\n commitMount: function (domElement, type, newProps, internalInstanceHandle) {\n domElement.focus();\n },\n commitUpdate: function (domElement, updatePayload, type, oldProps, newProps, internalInstanceHandle) {\n // Update the props handle so that we know which props are the ones with\n // with current event handlers.\n updateFiberProps(domElement, newProps);\n // Apply the diff to the DOM node.\n updateProperties(domElement, updatePayload, type, oldProps, newProps);\n },\n resetTextContent: function (domElement) {\n domElement.textContent = '';\n },\n commitTextUpdate: function (textInstance, oldText, newText) {\n textInstance.nodeValue = newText;\n },\n appendChild: function (parentInstance, child) {\n parentInstance.appendChild(child);\n },\n appendChildToContainer: function (container, child) {\n if (container.nodeType === COMMENT_NODE) {\n container.parentNode.insertBefore(child, container);\n } else {\n container.appendChild(child);\n }\n },\n insertBefore: function (parentInstance, child, beforeChild) {\n parentInstance.insertBefore(child, beforeChild);\n },\n insertInContainerBefore: function (container, child, beforeChild) {\n if (container.nodeType === COMMENT_NODE) {\n container.parentNode.insertBefore(child, beforeChild);\n } else {\n container.insertBefore(child, beforeChild);\n }\n },\n removeChild: function (parentInstance, child) {\n parentInstance.removeChild(child);\n },\n removeChildFromContainer: function (container, child) {\n if (container.nodeType === COMMENT_NODE) {\n container.parentNode.removeChild(child);\n } else {\n container.removeChild(child);\n }\n }\n },\n\n hydration: {\n canHydrateInstance: function (instance, type, props) {\n if (instance.nodeType !== ELEMENT_NODE || type.toLowerCase() !== instance.nodeName.toLowerCase()) {\n return null;\n }\n // This has now been refined to an element node.\n return instance;\n },\n canHydrateTextInstance: function (instance, text) {\n if (text === '' || instance.nodeType !== TEXT_NODE) {\n // Empty strings are not parsed by HTML so there won't be a correct match here.\n return null;\n }\n // This has now been refined to a text node.\n return instance;\n },\n getNextHydratableSibling: function (instance) {\n var node = instance.nextSibling;\n // Skip non-hydratable nodes.\n while (node && node.nodeType !== ELEMENT_NODE && node.nodeType !== TEXT_NODE) {\n node = node.nextSibling;\n }\n return node;\n },\n getFirstHydratableChild: function (parentInstance) {\n var next = parentInstance.firstChild;\n // Skip non-hydratable nodes.\n while (next && next.nodeType !== ELEMENT_NODE && next.nodeType !== TEXT_NODE) {\n next = next.nextSibling;\n }\n return next;\n },\n hydrateInstance: function (instance, type, props, rootContainerInstance, hostContext, internalInstanceHandle) {\n precacheFiberNode(internalInstanceHandle, instance);\n // TODO: Possibly defer this until the commit phase where all the events\n // get attached.\n updateFiberProps(instance, props);\n var parentNamespace = void 0;\n {\n var hostContextDev = hostContext;\n parentNamespace = hostContextDev.namespace;\n }\n return diffHydratedProperties(instance, type, props, parentNamespace, rootContainerInstance);\n },\n hydrateTextInstance: function (textInstance, text, internalInstanceHandle) {\n precacheFiberNode(internalInstanceHandle, textInstance);\n return diffHydratedText(textInstance, text);\n },\n didNotMatchHydratedContainerTextInstance: function (parentContainer, textInstance, text) {\n {\n warnForUnmatchedText(textInstance, text);\n }\n },\n didNotMatchHydratedTextInstance: function (parentType, parentProps, parentInstance, textInstance, text) {\n if (true && parentProps[SUPPRESS_HYDRATION_WARNING] !== true) {\n warnForUnmatchedText(textInstance, text);\n }\n },\n didNotHydrateContainerInstance: function (parentContainer, instance) {\n {\n if (instance.nodeType === 1) {\n warnForDeletedHydratableElement(parentContainer, instance);\n } else {\n warnForDeletedHydratableText(parentContainer, instance);\n }\n }\n },\n didNotHydrateInstance: function (parentType, parentProps, parentInstance, instance) {\n if (true && parentProps[SUPPRESS_HYDRATION_WARNING] !== true) {\n if (instance.nodeType === 1) {\n warnForDeletedHydratableElement(parentInstance, instance);\n } else {\n warnForDeletedHydratableText(parentInstance, instance);\n }\n }\n },\n didNotFindHydratableContainerInstance: function (parentContainer, type, props) {\n {\n warnForInsertedHydratedElement(parentContainer, type, props);\n }\n },\n didNotFindHydratableContainerTextInstance: function (parentContainer, text) {\n {\n warnForInsertedHydratedText(parentContainer, text);\n }\n },\n didNotFindHydratableInstance: function (parentType, parentProps, parentInstance, type, props) {\n if (true && parentProps[SUPPRESS_HYDRATION_WARNING] !== true) {\n warnForInsertedHydratedElement(parentInstance, type, props);\n }\n },\n didNotFindHydratableTextInstance: function (parentType, parentProps, parentInstance, text) {\n if (true && parentProps[SUPPRESS_HYDRATION_WARNING] !== true) {\n warnForInsertedHydratedText(parentInstance, text);\n }\n }\n },\n\n scheduleDeferredCallback: rIC,\n cancelDeferredCallback: cIC,\n\n useSyncScheduling: !enableAsyncSchedulingByDefaultInReactDOM\n});\n\ninjection$4.injectFiberBatchedUpdates(DOMRenderer.batchedUpdates);\n\nvar warnedAboutHydrateAPI = false;\n\nfunction renderSubtreeIntoContainer(parentComponent, children, container, forceHydrate, callback) {\n !isValidContainer(container) ? invariant(false, 'Target container is not a DOM element.') : void 0;\n\n {\n if (container._reactRootContainer && container.nodeType !== COMMENT_NODE) {\n var hostInstance = DOMRenderer.findHostInstanceWithNoPortals(container._reactRootContainer.current);\n if (hostInstance) {\n warning(hostInstance.parentNode === container, 'render(...): It looks like the React-rendered content of this ' + 'container was removed without using React. This is not ' + 'supported and will cause errors. Instead, call ' + 'ReactDOM.unmountComponentAtNode to empty a container.');\n }\n }\n\n var isRootRenderedBySomeReact = !!container._reactRootContainer;\n var rootEl = getReactRootElementInContainer(container);\n var hasNonRootReactChild = !!(rootEl && getInstanceFromNode$1(rootEl));\n\n warning(!hasNonRootReactChild || isRootRenderedBySomeReact, 'render(...): Replacing React-rendered children with a new root ' + 'component. If you intended to update the children of this node, ' + 'you should instead have the existing children update their state ' + 'and render the new components instead of calling ReactDOM.render.');\n\n warning(container.nodeType !== ELEMENT_NODE || !container.tagName || container.tagName.toUpperCase() !== 'BODY', 'render(): Rendering components directly into document.body is ' + 'discouraged, since its children are often manipulated by third-party ' + 'scripts and browser extensions. This may lead to subtle ' + 'reconciliation issues. Try rendering into a container element created ' + 'for your app.');\n }\n\n var root = container._reactRootContainer;\n if (!root) {\n var shouldHydrate = forceHydrate || shouldHydrateDueToLegacyHeuristic(container);\n // First clear any existing content.\n if (!shouldHydrate) {\n var warned = false;\n var rootSibling = void 0;\n while (rootSibling = container.lastChild) {\n {\n if (!warned && rootSibling.nodeType === ELEMENT_NODE && rootSibling.hasAttribute(ROOT_ATTRIBUTE_NAME)) {\n warned = true;\n warning(false, 'render(): Target node has markup rendered by React, but there ' + 'are unrelated nodes as well. This is most commonly caused by ' + 'white-space inserted around server-rendered markup.');\n }\n }\n container.removeChild(rootSibling);\n }\n }\n {\n if (shouldHydrate && !forceHydrate && !warnedAboutHydrateAPI) {\n warnedAboutHydrateAPI = true;\n lowPriorityWarning$1(false, 'render(): Calling ReactDOM.render() to hydrate server-rendered markup ' + 'will stop working in React v17. Replace the ReactDOM.render() call ' + 'with ReactDOM.hydrate() if you want React to attach to the server HTML.');\n }\n }\n var newRoot = DOMRenderer.createContainer(container, shouldHydrate);\n root = container._reactRootContainer = newRoot;\n // Initial mount should not be batched.\n DOMRenderer.unbatchedUpdates(function () {\n DOMRenderer.updateContainer(children, newRoot, parentComponent, callback);\n });\n } else {\n DOMRenderer.updateContainer(children, root, parentComponent, callback);\n }\n return DOMRenderer.getPublicRootInstance(root);\n}\n\nfunction createPortal(children, container) {\n var key = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n !isValidContainer(container) ? invariant(false, 'Target container is not a DOM element.') : void 0;\n // TODO: pass ReactDOM portal implementation as third argument\n return createPortal$1(children, container, null, key);\n}\n\nfunction ReactRoot(container, hydrate) {\n var root = DOMRenderer.createContainer(container, hydrate);\n this._reactRootContainer = root;\n}\nReactRoot.prototype.render = function (children, callback) {\n var root = this._reactRootContainer;\n DOMRenderer.updateContainer(children, root, null, callback);\n};\nReactRoot.prototype.unmount = function (callback) {\n var root = this._reactRootContainer;\n DOMRenderer.updateContainer(null, root, null, callback);\n};\n\nvar ReactDOM = {\n createPortal: createPortal,\n\n findDOMNode: function (componentOrElement) {\n {\n var owner = ReactCurrentOwner.current;\n if (owner !== null) {\n var warnedAboutRefsInRender = owner.stateNode._warnedAboutRefsInRender;\n warning(warnedAboutRefsInRender, '%s is accessing findDOMNode inside its render(). ' + 'render() should be a pure function of props and state. It should ' + 'never access something that requires stale data from the previous ' + 'render, such as refs. Move this logic to componentDidMount and ' + 'componentDidUpdate instead.', getComponentName(owner) || 'A component');\n owner.stateNode._warnedAboutRefsInRender = true;\n }\n }\n if (componentOrElement == null) {\n return null;\n }\n if (componentOrElement.nodeType === ELEMENT_NODE) {\n return componentOrElement;\n }\n\n var inst = get(componentOrElement);\n if (inst) {\n return DOMRenderer.findHostInstance(inst);\n }\n\n if (typeof componentOrElement.render === 'function') {\n invariant(false, 'Unable to find node on an unmounted component.');\n } else {\n invariant(false, 'Element appears to be neither ReactComponent nor DOMNode. Keys: %s', Object.keys(componentOrElement));\n }\n },\n hydrate: function (element, container, callback) {\n // TODO: throw or warn if we couldn't hydrate?\n return renderSubtreeIntoContainer(null, element, container, true, callback);\n },\n render: function (element, container, callback) {\n return renderSubtreeIntoContainer(null, element, container, false, callback);\n },\n unstable_renderSubtreeIntoContainer: function (parentComponent, element, containerNode, callback) {\n !(parentComponent != null && has(parentComponent)) ? invariant(false, 'parentComponent must be a valid React Component') : void 0;\n return renderSubtreeIntoContainer(parentComponent, element, containerNode, false, callback);\n },\n unmountComponentAtNode: function (container) {\n !isValidContainer(container) ? invariant(false, 'unmountComponentAtNode(...): Target container is not a DOM element.') : void 0;\n\n if (container._reactRootContainer) {\n {\n var rootEl = getReactRootElementInContainer(container);\n var renderedByDifferentReact = rootEl && !getInstanceFromNode$1(rootEl);\n warning(!renderedByDifferentReact, \"unmountComponentAtNode(): The node you're attempting to unmount \" + 'was rendered by another copy of React.');\n }\n\n // Unmount should not be batched.\n DOMRenderer.unbatchedUpdates(function () {\n renderSubtreeIntoContainer(null, null, container, false, function () {\n container._reactRootContainer = null;\n });\n });\n // If you call unmountComponentAtNode twice in quick succession, you'll\n // get `true` twice. That's probably fine?\n return true;\n } else {\n {\n var _rootEl = getReactRootElementInContainer(container);\n var hasNonRootReactChild = !!(_rootEl && getInstanceFromNode$1(_rootEl));\n\n // Check if the container itself is a React root node.\n var isContainerReactRoot = container.nodeType === 1 && isValidContainer(container.parentNode) && !!container.parentNode._reactRootContainer;\n\n warning(!hasNonRootReactChild, \"unmountComponentAtNode(): The node you're attempting to unmount \" + 'was rendered by React and is not a top-level container. %s', isContainerReactRoot ? 'You may have accidentally passed in a React root node instead ' + 'of its container.' : 'Instead, have the parent component update its state and ' + 'rerender in order to remove this component.');\n }\n\n return false;\n }\n },\n\n\n // Temporary alias since we already shipped React 16 RC with it.\n // TODO: remove in React 17.\n unstable_createPortal: createPortal,\n\n unstable_batchedUpdates: batchedUpdates,\n\n unstable_deferredUpdates: DOMRenderer.deferredUpdates,\n\n flushSync: DOMRenderer.flushSync,\n\n __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: {\n // For TapEventPlugin which is popular in open source\n EventPluginHub: EventPluginHub,\n // Used by test-utils\n EventPluginRegistry: EventPluginRegistry,\n EventPropagators: EventPropagators,\n ReactControlledComponent: ReactControlledComponent,\n ReactDOMComponentTree: ReactDOMComponentTree,\n ReactDOMEventListener: ReactDOMEventListener\n }\n};\n\nif (enableCreateRoot) {\n ReactDOM.createRoot = function createRoot(container, options) {\n var hydrate = options != null && options.hydrate === true;\n return new ReactRoot(container, hydrate);\n };\n}\n\nvar foundDevTools = DOMRenderer.injectIntoDevTools({\n findFiberByHostInstance: getClosestInstanceFromNode,\n bundleType: 1,\n version: ReactVersion,\n rendererPackageName: 'react-dom'\n});\n\n{\n if (!foundDevTools && ExecutionEnvironment.canUseDOM && window.top === window.self) {\n // If we're in Chrome or Firefox, provide a download link if not installed.\n if (navigator.userAgent.indexOf('Chrome') > -1 && navigator.userAgent.indexOf('Edge') === -1 || navigator.userAgent.indexOf('Firefox') > -1) {\n var protocol = window.location.protocol;\n // Don't warn in exotic cases like chrome-extension://.\n if (/^(https?|file):$/.test(protocol)) {\n console.info('%cDownload the React DevTools ' + 'for a better development experience: ' + 'https://fb.me/react-devtools' + (protocol === 'file:' ? '\\nYou might need to use a local HTTP server (instead of file://): ' + 'https://fb.me/react-devtools-faq' : ''), 'font-weight:bold');\n }\n }\n }\n}\n\n\n\nvar ReactDOM$2 = Object.freeze({\n\tdefault: ReactDOM\n});\n\nvar ReactDOM$3 = ( ReactDOM$2 && ReactDOM ) || ReactDOM$2;\n\n// TODO: decide on the top-level export form.\n// This is hacky but makes it work with both Rollup and Jest.\nvar reactDom = ReactDOM$3['default'] ? ReactDOM$3['default'] : ReactDOM$3;\n\nmodule.exports = reactDom;\n })();\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dom/cjs/react-dom.development.js\n// module id = ./node_modules/react-dom/cjs/react-dom.development.js\n// module chunks = 0","'use strict';\n\nfunction checkDCE() {\n /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\n if (\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' ||\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function'\n ) {\n return;\n }\n if (process.env.NODE_ENV !== 'production') {\n // This branch is unreachable because this function is only called\n // in production, but the condition is true only in development.\n // Therefore if the branch is still here, dead code elimination wasn't\n // properly applied.\n // Don't change the message. React DevTools relies on it. Also make sure\n // this message doesn't occur elsewhere in this function, or it will cause\n // a false positive.\n throw new Error('^_^');\n }\n try {\n // Verify that the code above has been dead code eliminated (DCE'd).\n __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);\n } catch (err) {\n // DevTools shouldn't crash React, no matter what.\n // We should still report in case we break this code.\n console.error(err);\n }\n}\n\nif (process.env.NODE_ENV === 'production') {\n // DCE check should happen before ReactDOM bundle executes so that\n // DevTools can report bad minification during injection.\n checkDCE();\n module.exports = require('./cjs/react-dom.production.min.js');\n} else {\n module.exports = require('./cjs/react-dom.development.js');\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dom/index.js\n// module id = ./node_modules/react-dom/index.js\n// module chunks = 0","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ReactErrorOverlay\"] = factory();\n\telse\n\t\troot[\"ReactErrorOverlay\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 9);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\n/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\n/**\n * This is a helper function for getting values from parameter/options\n * objects.\n *\n * @param args The object we are extracting values from\n * @param name The name of the property we are getting.\n * @param defaultValue An optional value to return if the property is missing\n * from the object. If this is not specified and the property is missing, an\n * error will be thrown.\n */\nfunction getArg(aArgs, aName, aDefaultValue) {\n if (aName in aArgs) {\n return aArgs[aName];\n } else if (arguments.length === 3) {\n return aDefaultValue;\n } else {\n throw new Error('\"' + aName + '\" is a required argument.');\n }\n}\nexports.getArg = getArg;\n\nvar urlRegexp = /^(?:([\\w+\\-.]+):)?\\/\\/(?:(\\w+:\\w+)@)?([\\w.]*)(?::(\\d+))?(\\S*)$/;\nvar dataUrlRegexp = /^data:.+\\,.+$/;\n\nfunction urlParse(aUrl) {\n var match = aUrl.match(urlRegexp);\n if (!match) {\n return null;\n }\n return {\n scheme: match[1],\n auth: match[2],\n host: match[3],\n port: match[4],\n path: match[5]\n };\n}\nexports.urlParse = urlParse;\n\nfunction urlGenerate(aParsedUrl) {\n var url = '';\n if (aParsedUrl.scheme) {\n url += aParsedUrl.scheme + ':';\n }\n url += '//';\n if (aParsedUrl.auth) {\n url += aParsedUrl.auth + '@';\n }\n if (aParsedUrl.host) {\n url += aParsedUrl.host;\n }\n if (aParsedUrl.port) {\n url += \":\" + aParsedUrl.port\n }\n if (aParsedUrl.path) {\n url += aParsedUrl.path;\n }\n return url;\n}\nexports.urlGenerate = urlGenerate;\n\n/**\n * Normalizes a path, or the path portion of a URL:\n *\n * - Replaces consecutive slashes with one slash.\n * - Removes unnecessary '.' parts.\n * - Removes unnecessary '<dir>/..' parts.\n *\n * Based on code in the Node.js 'path' core module.\n *\n * @param aPath The path or url to normalize.\n */\nfunction normalize(aPath) {\n var path = aPath;\n var url = urlParse(aPath);\n if (url) {\n if (!url.path) {\n return aPath;\n }\n path = url.path;\n }\n var isAbsolute = exports.isAbsolute(path);\n\n var parts = path.split(/\\/+/);\n for (var part, up = 0, i = parts.length - 1; i >= 0; i--) {\n part = parts[i];\n if (part === '.') {\n parts.splice(i, 1);\n } else if (part === '..') {\n up++;\n } else if (up > 0) {\n if (part === '') {\n // The first part is blank if the path is absolute. Trying to go\n // above the root is a no-op. Therefore we can remove all '..' parts\n // directly after the root.\n parts.splice(i + 1, up);\n up = 0;\n } else {\n parts.splice(i, 2);\n up--;\n }\n }\n }\n path = parts.join('/');\n\n if (path === '') {\n path = isAbsolute ? '/' : '.';\n }\n\n if (url) {\n url.path = path;\n return urlGenerate(url);\n }\n return path;\n}\nexports.normalize = normalize;\n\n/**\n * Joins two paths/URLs.\n *\n * @param aRoot The root path or URL.\n * @param aPath The path or URL to be joined with the root.\n *\n * - If aPath is a URL or a data URI, aPath is returned, unless aPath is a\n * scheme-relative URL: Then the scheme of aRoot, if any, is prepended\n * first.\n * - Otherwise aPath is a path. If aRoot is a URL, then its path portion\n * is updated with the result and aRoot is returned. Otherwise the result\n * is returned.\n * - If aPath is absolute, the result is aPath.\n * - Otherwise the two paths are joined with a slash.\n * - Joining for example 'http://' and 'www.example.com' is also supported.\n */\nfunction join(aRoot, aPath) {\n if (aRoot === \"\") {\n aRoot = \".\";\n }\n if (aPath === \"\") {\n aPath = \".\";\n }\n var aPathUrl = urlParse(aPath);\n var aRootUrl = urlParse(aRoot);\n if (aRootUrl) {\n aRoot = aRootUrl.path || '/';\n }\n\n // `join(foo, '//www.example.org')`\n if (aPathUrl && !aPathUrl.scheme) {\n if (aRootUrl) {\n aPathUrl.scheme = aRootUrl.scheme;\n }\n return urlGenerate(aPathUrl);\n }\n\n if (aPathUrl || aPath.match(dataUrlRegexp)) {\n return aPath;\n }\n\n // `join('http://', 'www.example.com')`\n if (aRootUrl && !aRootUrl.host && !aRootUrl.path) {\n aRootUrl.host = aPath;\n return urlGenerate(aRootUrl);\n }\n\n var joined = aPath.charAt(0) === '/'\n ? aPath\n : normalize(aRoot.replace(/\\/+$/, '') + '/' + aPath);\n\n if (aRootUrl) {\n aRootUrl.path = joined;\n return urlGenerate(aRootUrl);\n }\n return joined;\n}\nexports.join = join;\n\nexports.isAbsolute = function (aPath) {\n return aPath.charAt(0) === '/' || !!aPath.match(urlRegexp);\n};\n\n/**\n * Make a path relative to a URL or another path.\n *\n * @param aRoot The root path or URL.\n * @param aPath The path or URL to be made relative to aRoot.\n */\nfunction relative(aRoot, aPath) {\n if (aRoot === \"\") {\n aRoot = \".\";\n }\n\n aRoot = aRoot.replace(/\\/$/, '');\n\n // It is possible for the path to be above the root. In this case, simply\n // checking whether the root is a prefix of the path won't work. Instead, we\n // need to remove components from the root one by one, until either we find\n // a prefix that fits, or we run out of components to remove.\n var level = 0;\n while (aPath.indexOf(aRoot + '/') !== 0) {\n var index = aRoot.lastIndexOf(\"/\");\n if (index < 0) {\n return aPath;\n }\n\n // If the only part of the root that is left is the scheme (i.e. http://,\n // file:///, etc.), one or more slashes (/), or simply nothing at all, we\n // have exhausted all components, so the path is not relative to the root.\n aRoot = aRoot.slice(0, index);\n if (aRoot.match(/^([^\\/]+:\\/)?\\/*$/)) {\n return aPath;\n }\n\n ++level;\n }\n\n // Make sure we add a \"../\" for each component we removed from the root.\n return Array(level + 1).join(\"../\") + aPath.substr(aRoot.length + 1);\n}\nexports.relative = relative;\n\nvar supportsNullProto = (function () {\n var obj = Object.create(null);\n return !('__proto__' in obj);\n}());\n\nfunction identity (s) {\n return s;\n}\n\n/**\n * Because behavior goes wacky when you set `__proto__` on objects, we\n * have to prefix all the strings in our set with an arbitrary character.\n *\n * See https://github.com/mozilla/source-map/pull/31 and\n * https://github.com/mozilla/source-map/issues/30\n *\n * @param String aStr\n */\nfunction toSetString(aStr) {\n if (isProtoString(aStr)) {\n return '$' + aStr;\n }\n\n return aStr;\n}\nexports.toSetString = supportsNullProto ? identity : toSetString;\n\nfunction fromSetString(aStr) {\n if (isProtoString(aStr)) {\n return aStr.slice(1);\n }\n\n return aStr;\n}\nexports.fromSetString = supportsNullProto ? identity : fromSetString;\n\nfunction isProtoString(s) {\n if (!s) {\n return false;\n }\n\n var length = s.length;\n\n if (length < 9 /* \"__proto__\".length */) {\n return false;\n }\n\n if (s.charCodeAt(length - 1) !== 95 /* '_' */ ||\n s.charCodeAt(length - 2) !== 95 /* '_' */ ||\n s.charCodeAt(length - 3) !== 111 /* 'o' */ ||\n s.charCodeAt(length - 4) !== 116 /* 't' */ ||\n s.charCodeAt(length - 5) !== 111 /* 'o' */ ||\n s.charCodeAt(length - 6) !== 114 /* 'r' */ ||\n s.charCodeAt(length - 7) !== 112 /* 'p' */ ||\n s.charCodeAt(length - 8) !== 95 /* '_' */ ||\n s.charCodeAt(length - 9) !== 95 /* '_' */) {\n return false;\n }\n\n for (var i = length - 10; i >= 0; i--) {\n if (s.charCodeAt(i) !== 36 /* '$' */) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Comparator between two mappings where the original positions are compared.\n *\n * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n * mappings with the same original source/line/column, but different generated\n * line and column the same. Useful when searching for a mapping with a\n * stubbed out mapping.\n */\nfunction compareByOriginalPositions(mappingA, mappingB, onlyCompareOriginal) {\n var cmp = mappingA.source - mappingB.source;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp !== 0 || onlyCompareOriginal) {\n return cmp;\n }\n\n cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.generatedLine - mappingB.generatedLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n return mappingA.name - mappingB.name;\n}\nexports.compareByOriginalPositions = compareByOriginalPositions;\n\n/**\n * Comparator between two mappings with deflated source and name indices where\n * the generated positions are compared.\n *\n * Optionally pass in `true` as `onlyCompareGenerated` to consider two\n * mappings with the same generated line and column, but different\n * source/name/original line and column the same. Useful when searching for a\n * mapping with a stubbed out mapping.\n */\nfunction compareByGeneratedPositionsDeflated(mappingA, mappingB, onlyCompareGenerated) {\n var cmp = mappingA.generatedLine - mappingB.generatedLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n if (cmp !== 0 || onlyCompareGenerated) {\n return cmp;\n }\n\n cmp = mappingA.source - mappingB.source;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n return mappingA.name - mappingB.name;\n}\nexports.compareByGeneratedPositionsDeflated = compareByGeneratedPositionsDeflated;\n\nfunction strcmp(aStr1, aStr2) {\n if (aStr1 === aStr2) {\n return 0;\n }\n\n if (aStr1 > aStr2) {\n return 1;\n }\n\n return -1;\n}\n\n/**\n * Comparator between two mappings with inflated source and name strings where\n * the generated positions are compared.\n */\nfunction compareByGeneratedPositionsInflated(mappingA, mappingB) {\n var cmp = mappingA.generatedLine - mappingB.generatedLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.generatedColumn - mappingB.generatedColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = strcmp(mappingA.source, mappingB.source);\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalLine - mappingB.originalLine;\n if (cmp !== 0) {\n return cmp;\n }\n\n cmp = mappingA.originalColumn - mappingB.originalColumn;\n if (cmp !== 0) {\n return cmp;\n }\n\n return strcmp(mappingA.name, mappingB.name);\n}\nexports.compareByGeneratedPositionsInflated = compareByGeneratedPositionsInflated;\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* unused harmony export StackFrame */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return ScriptLine; });\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Copyright (c) 2015-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/** A container holding a script line. */\nvar ScriptLine =\n/** The content (or value) of this line of source. */\nfunction ScriptLine(lineNumber, content) {\n var highlight = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n _classCallCheck(this, ScriptLine);\n\n this.lineNumber = lineNumber;\n this.content = content;\n this.highlight = highlight;\n}\n/** Whether or not this line should be highlighted. Particularly useful for error reporting with context. */\n\n/** The line number of this line of source. */\n;\n\n/**\n * A representation of a stack frame.\n */\n\n\nvar StackFrame = function () {\n function StackFrame() {\n var functionName = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var fileName = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n var lineNumber = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n var columnNumber = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;\n var scriptCode = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;\n var sourceFunctionName = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : null;\n var sourceFileName = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : null;\n var sourceLineNumber = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : null;\n var sourceColumnNumber = arguments.length > 8 && arguments[8] !== undefined ? arguments[8] : null;\n var sourceScriptCode = arguments.length > 9 && arguments[9] !== undefined ? arguments[9] : null;\n\n _classCallCheck(this, StackFrame);\n\n if (functionName && functionName.indexOf('Object.') === 0) {\n functionName = functionName.slice('Object.'.length);\n }\n if (\n // Chrome has a bug with inferring function.name:\n // https://github.com/facebookincubator/create-react-app/issues/2097\n // Let's ignore a meaningless name we get for top-level modules.\n functionName === 'friendlySyntaxErrorLabel' || functionName === 'exports.__esModule' || functionName === '<anonymous>' || !functionName) {\n functionName = null;\n }\n this.functionName = functionName;\n\n this.fileName = fileName;\n this.lineNumber = lineNumber;\n this.columnNumber = columnNumber;\n\n this._originalFunctionName = sourceFunctionName;\n this._originalFileName = sourceFileName;\n this._originalLineNumber = sourceLineNumber;\n this._originalColumnNumber = sourceColumnNumber;\n\n this._scriptCode = scriptCode;\n this._originalScriptCode = sourceScriptCode;\n }\n\n /**\n * Returns the name of this function.\n */\n\n\n _createClass(StackFrame, [{\n key: 'getFunctionName',\n value: function getFunctionName() {\n return this.functionName || '(anonymous function)';\n }\n\n /**\n * Returns the source of the frame.\n * This contains the file name, line number, and column number when available.\n */\n\n }, {\n key: 'getSource',\n value: function getSource() {\n var str = '';\n if (this.fileName != null) {\n str += this.fileName + ':';\n }\n if (this.lineNumber != null) {\n str += this.lineNumber + ':';\n }\n if (this.columnNumber != null) {\n str += this.columnNumber + ':';\n }\n return str.slice(0, -1);\n }\n\n /**\n * Returns a pretty version of this stack frame.\n */\n\n }, {\n key: 'toString',\n value: function toString() {\n var functionName = this.getFunctionName();\n var source = this.getSource();\n return '' + functionName + (source ? ' (' + source + ')' : '');\n }\n }]);\n\n return StackFrame;\n}();\n\n\n/* harmony default export */ __webpack_exports__[\"b\"] = (StackFrame);\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(19);\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports) {\n\n// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* unused harmony export extractSourceMapUrl */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return getSourceMap; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_source_map__ = __webpack_require__(21);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_source_map___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_source_map__);\n\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\n/**\n * Returns an instance of <code>{@link SourceMap}</code> for a given fileUri and fileContents.\n * @param {string} fileUri The URI of the source file.\n * @param {string} fileContents The contents of the source file.\n */\nvar getSourceMap = function () {\n var _ref = _asyncToGenerator( /*#__PURE__*/__WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.mark(function _callee(fileUri, fileContents) {\n var sm, base64, match2, index, url, obj;\n return __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _context.next = 2;\n return extractSourceMapUrl(fileUri, fileContents);\n\n case 2:\n sm = _context.sent;\n\n if (!(sm.indexOf('data:') === 0)) {\n _context.next = 14;\n break;\n }\n\n base64 = /^data:application\\/json;([\\w=:\"-]+;)*base64,/;\n match2 = sm.match(base64);\n\n if (match2) {\n _context.next = 8;\n break;\n }\n\n throw new Error('Sorry, non-base64 inline source-map encoding is not supported.');\n\n case 8:\n sm = sm.substring(match2[0].length);\n sm = window.atob(sm);\n sm = JSON.parse(sm);\n return _context.abrupt('return', new SourceMap(new __WEBPACK_IMPORTED_MODULE_1_source_map__[\"SourceMapConsumer\"](sm)));\n\n case 14:\n index = fileUri.lastIndexOf('/');\n url = fileUri.substring(0, index + 1) + sm;\n _context.next = 18;\n return fetch(url).then(function (res) {\n return res.json();\n });\n\n case 18:\n obj = _context.sent;\n return _context.abrupt('return', new SourceMap(new __WEBPACK_IMPORTED_MODULE_1_source_map__[\"SourceMapConsumer\"](obj)));\n\n case 20:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n return function getSourceMap(_x, _x2) {\n return _ref.apply(this, arguments);\n };\n}();\n\nfunction _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step(\"next\", value); }, function (err) { step(\"throw\", err); }); } } return step(\"next\"); }); }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Copyright (c) 2015-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\n/**\n * A wrapped instance of a <code>{@link https://github.com/mozilla/source-map SourceMapConsumer}</code>.\n *\n * This exposes methods which will be indifferent to changes made in <code>{@link https://github.com/mozilla/source-map source-map}</code>.\n */\n\nvar SourceMap = function () {\n function SourceMap(sourceMap) {\n _classCallCheck(this, SourceMap);\n\n this.__source_map = sourceMap;\n }\n\n /**\n * Returns the original code position for a generated code position.\n * @param {number} line The line of the generated code position.\n * @param {number} column The column of the generated code position.\n */\n\n\n _createClass(SourceMap, [{\n key: 'getOriginalPosition',\n value: function getOriginalPosition(line, column) {\n var _source_map$original = this.__source_map.originalPositionFor({\n line: line,\n column: column\n }),\n l = _source_map$original.line,\n c = _source_map$original.column,\n s = _source_map$original.source;\n\n return { line: l, column: c, source: s };\n }\n\n /**\n * Returns the generated code position for an original position.\n * @param {string} source The source file of the original code position.\n * @param {number} line The line of the original code position.\n * @param {number} column The column of the original code position.\n */\n\n }, {\n key: 'getGeneratedPosition',\n value: function getGeneratedPosition(source, line, column) {\n var _source_map$generate = this.__source_map.generatedPositionFor({\n source: source,\n line: line,\n column: column\n }),\n l = _source_map$generate.line,\n c = _source_map$generate.column;\n\n return {\n line: l,\n column: c\n };\n }\n\n /**\n * Returns the code for a given source file name.\n * @param {string} sourceName The name of the source file.\n */\n\n }, {\n key: 'getSource',\n value: function getSource(sourceName) {\n return this.__source_map.sourceContentFor(sourceName);\n }\n }, {\n key: 'getSources',\n value: function getSources() {\n return this.__source_map.sources;\n }\n }]);\n\n return SourceMap;\n}();\n\nfunction extractSourceMapUrl(fileUri, fileContents) {\n var regex = /\\/\\/[#@] ?sourceMappingURL=([^\\s'\"]+)\\s*$/gm;\n var match = null;\n for (;;) {\n var next = regex.exec(fileContents);\n if (next == null) {\n break;\n }\n match = next;\n }\n if (!(match && match[1])) {\n return Promise.reject('Cannot find a source map directive for ' + fileUri + '.');\n }\n return Promise.resolve(match[1].toString());\n}\n\n\n/* unused harmony default export */ var _unused_webpack_default_export = (getSourceMap);\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar base64VLQ = __webpack_require__(6);\nvar util = __webpack_require__(0);\nvar ArraySet = __webpack_require__(7).ArraySet;\nvar MappingList = __webpack_require__(23).MappingList;\n\n/**\n * An instance of the SourceMapGenerator represents a source map which is\n * being built incrementally. You may pass an object with the following\n * properties:\n *\n * - file: The filename of the generated source.\n * - sourceRoot: A root for all relative URLs in this source map.\n */\nfunction SourceMapGenerator(aArgs) {\n if (!aArgs) {\n aArgs = {};\n }\n this._file = util.getArg(aArgs, 'file', null);\n this._sourceRoot = util.getArg(aArgs, 'sourceRoot', null);\n this._skipValidation = util.getArg(aArgs, 'skipValidation', false);\n this._sources = new ArraySet();\n this._names = new ArraySet();\n this._mappings = new MappingList();\n this._sourcesContents = null;\n}\n\nSourceMapGenerator.prototype._version = 3;\n\n/**\n * Creates a new SourceMapGenerator based on a SourceMapConsumer\n *\n * @param aSourceMapConsumer The SourceMap.\n */\nSourceMapGenerator.fromSourceMap =\n function SourceMapGenerator_fromSourceMap(aSourceMapConsumer) {\n var sourceRoot = aSourceMapConsumer.sourceRoot;\n var generator = new SourceMapGenerator({\n file: aSourceMapConsumer.file,\n sourceRoot: sourceRoot\n });\n aSourceMapConsumer.eachMapping(function (mapping) {\n var newMapping = {\n generated: {\n line: mapping.generatedLine,\n column: mapping.generatedColumn\n }\n };\n\n if (mapping.source != null) {\n newMapping.source = mapping.source;\n if (sourceRoot != null) {\n newMapping.source = util.relative(sourceRoot, newMapping.source);\n }\n\n newMapping.original = {\n line: mapping.originalLine,\n column: mapping.originalColumn\n };\n\n if (mapping.name != null) {\n newMapping.name = mapping.name;\n }\n }\n\n generator.addMapping(newMapping);\n });\n aSourceMapConsumer.sources.forEach(function (sourceFile) {\n var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n if (content != null) {\n generator.setSourceContent(sourceFile, content);\n }\n });\n return generator;\n };\n\n/**\n * Add a single mapping from original source line and column to the generated\n * source's line and column for this source map being created. The mapping\n * object should have the following properties:\n *\n * - generated: An object with the generated line and column positions.\n * - original: An object with the original line and column positions.\n * - source: The original source file (relative to the sourceRoot).\n * - name: An optional original token name for this mapping.\n */\nSourceMapGenerator.prototype.addMapping =\n function SourceMapGenerator_addMapping(aArgs) {\n var generated = util.getArg(aArgs, 'generated');\n var original = util.getArg(aArgs, 'original', null);\n var source = util.getArg(aArgs, 'source', null);\n var name = util.getArg(aArgs, 'name', null);\n\n if (!this._skipValidation) {\n this._validateMapping(generated, original, source, name);\n }\n\n if (source != null) {\n source = String(source);\n if (!this._sources.has(source)) {\n this._sources.add(source);\n }\n }\n\n if (name != null) {\n name = String(name);\n if (!this._names.has(name)) {\n this._names.add(name);\n }\n }\n\n this._mappings.add({\n generatedLine: generated.line,\n generatedColumn: generated.column,\n originalLine: original != null && original.line,\n originalColumn: original != null && original.column,\n source: source,\n name: name\n });\n };\n\n/**\n * Set the source content for a source file.\n */\nSourceMapGenerator.prototype.setSourceContent =\n function SourceMapGenerator_setSourceContent(aSourceFile, aSourceContent) {\n var source = aSourceFile;\n if (this._sourceRoot != null) {\n source = util.relative(this._sourceRoot, source);\n }\n\n if (aSourceContent != null) {\n // Add the source content to the _sourcesContents map.\n // Create a new _sourcesContents map if the property is null.\n if (!this._sourcesContents) {\n this._sourcesContents = Object.create(null);\n }\n this._sourcesContents[util.toSetString(source)] = aSourceContent;\n } else if (this._sourcesContents) {\n // Remove the source file from the _sourcesContents map.\n // If the _sourcesContents map is empty, set the property to null.\n delete this._sourcesContents[util.toSetString(source)];\n if (Object.keys(this._sourcesContents).length === 0) {\n this._sourcesContents = null;\n }\n }\n };\n\n/**\n * Applies the mappings of a sub-source-map for a specific source file to the\n * source map being generated. Each mapping to the supplied source file is\n * rewritten using the supplied source map. Note: The resolution for the\n * resulting mappings is the minimium of this map and the supplied map.\n *\n * @param aSourceMapConsumer The source map to be applied.\n * @param aSourceFile Optional. The filename of the source file.\n * If omitted, SourceMapConsumer's file property will be used.\n * @param aSourceMapPath Optional. The dirname of the path to the source map\n * to be applied. If relative, it is relative to the SourceMapConsumer.\n * This parameter is needed when the two source maps aren't in the same\n * directory, and the source map to be applied contains relative source\n * paths. If so, those relative source paths need to be rewritten\n * relative to the SourceMapGenerator.\n */\nSourceMapGenerator.prototype.applySourceMap =\n function SourceMapGenerator_applySourceMap(aSourceMapConsumer, aSourceFile, aSourceMapPath) {\n var sourceFile = aSourceFile;\n // If aSourceFile is omitted, we will use the file property of the SourceMap\n if (aSourceFile == null) {\n if (aSourceMapConsumer.file == null) {\n throw new Error(\n 'SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, ' +\n 'or the source map\\'s \"file\" property. Both were omitted.'\n );\n }\n sourceFile = aSourceMapConsumer.file;\n }\n var sourceRoot = this._sourceRoot;\n // Make \"sourceFile\" relative if an absolute Url is passed.\n if (sourceRoot != null) {\n sourceFile = util.relative(sourceRoot, sourceFile);\n }\n // Applying the SourceMap can add and remove items from the sources and\n // the names array.\n var newSources = new ArraySet();\n var newNames = new ArraySet();\n\n // Find mappings for the \"sourceFile\"\n this._mappings.unsortedForEach(function (mapping) {\n if (mapping.source === sourceFile && mapping.originalLine != null) {\n // Check if it can be mapped by the source map, then update the mapping.\n var original = aSourceMapConsumer.originalPositionFor({\n line: mapping.originalLine,\n column: mapping.originalColumn\n });\n if (original.source != null) {\n // Copy mapping\n mapping.source = original.source;\n if (aSourceMapPath != null) {\n mapping.source = util.join(aSourceMapPath, mapping.source)\n }\n if (sourceRoot != null) {\n mapping.source = util.relative(sourceRoot, mapping.source);\n }\n mapping.originalLine = original.line;\n mapping.originalColumn = original.column;\n if (original.name != null) {\n mapping.name = original.name;\n }\n }\n }\n\n var source = mapping.source;\n if (source != null && !newSources.has(source)) {\n newSources.add(source);\n }\n\n var name = mapping.name;\n if (name != null && !newNames.has(name)) {\n newNames.add(name);\n }\n\n }, this);\n this._sources = newSources;\n this._names = newNames;\n\n // Copy sourcesContents of applied map.\n aSourceMapConsumer.sources.forEach(function (sourceFile) {\n var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n if (content != null) {\n if (aSourceMapPath != null) {\n sourceFile = util.join(aSourceMapPath, sourceFile);\n }\n if (sourceRoot != null) {\n sourceFile = util.relative(sourceRoot, sourceFile);\n }\n this.setSourceContent(sourceFile, content);\n }\n }, this);\n };\n\n/**\n * A mapping can have one of the three levels of data:\n *\n * 1. Just the generated position.\n * 2. The Generated position, original position, and original source.\n * 3. Generated and original position, original source, as well as a name\n * token.\n *\n * To maintain consistency, we validate that any new mapping being added falls\n * in to one of these categories.\n */\nSourceMapGenerator.prototype._validateMapping =\n function SourceMapGenerator_validateMapping(aGenerated, aOriginal, aSource,\n aName) {\n if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n && aGenerated.line > 0 && aGenerated.column >= 0\n && !aOriginal && !aSource && !aName) {\n // Case 1.\n return;\n }\n else if (aGenerated && 'line' in aGenerated && 'column' in aGenerated\n && aOriginal && 'line' in aOriginal && 'column' in aOriginal\n && aGenerated.line > 0 && aGenerated.column >= 0\n && aOriginal.line > 0 && aOriginal.column >= 0\n && aSource) {\n // Cases 2 and 3.\n return;\n }\n else {\n throw new Error('Invalid mapping: ' + JSON.stringify({\n generated: aGenerated,\n source: aSource,\n original: aOriginal,\n name: aName\n }));\n }\n };\n\n/**\n * Serialize the accumulated mappings in to the stream of base 64 VLQs\n * specified by the source map format.\n */\nSourceMapGenerator.prototype._serializeMappings =\n function SourceMapGenerator_serializeMappings() {\n var previousGeneratedColumn = 0;\n var previousGeneratedLine = 1;\n var previousOriginalColumn = 0;\n var previousOriginalLine = 0;\n var previousName = 0;\n var previousSource = 0;\n var result = '';\n var next;\n var mapping;\n var nameIdx;\n var sourceIdx;\n\n var mappings = this._mappings.toArray();\n for (var i = 0, len = mappings.length; i < len; i++) {\n mapping = mappings[i];\n next = ''\n\n if (mapping.generatedLine !== previousGeneratedLine) {\n previousGeneratedColumn = 0;\n while (mapping.generatedLine !== previousGeneratedLine) {\n next += ';';\n previousGeneratedLine++;\n }\n }\n else {\n if (i > 0) {\n if (!util.compareByGeneratedPositionsInflated(mapping, mappings[i - 1])) {\n continue;\n }\n next += ',';\n }\n }\n\n next += base64VLQ.encode(mapping.generatedColumn\n - previousGeneratedColumn);\n previousGeneratedColumn = mapping.generatedColumn;\n\n if (mapping.source != null) {\n sourceIdx = this._sources.indexOf(mapping.source);\n next += base64VLQ.encode(sourceIdx - previousSource);\n previousSource = sourceIdx;\n\n // lines are stored 0-based in SourceMap spec version 3\n next += base64VLQ.encode(mapping.originalLine - 1\n - previousOriginalLine);\n previousOriginalLine = mapping.originalLine - 1;\n\n next += base64VLQ.encode(mapping.originalColumn\n - previousOriginalColumn);\n previousOriginalColumn = mapping.originalColumn;\n\n if (mapping.name != null) {\n nameIdx = this._names.indexOf(mapping.name);\n next += base64VLQ.encode(nameIdx - previousName);\n previousName = nameIdx;\n }\n }\n\n result += next;\n }\n\n return result;\n };\n\nSourceMapGenerator.prototype._generateSourcesContent =\n function SourceMapGenerator_generateSourcesContent(aSources, aSourceRoot) {\n return aSources.map(function (source) {\n if (!this._sourcesContents) {\n return null;\n }\n if (aSourceRoot != null) {\n source = util.relative(aSourceRoot, source);\n }\n var key = util.toSetString(source);\n return Object.prototype.hasOwnProperty.call(this._sourcesContents, key)\n ? this._sourcesContents[key]\n : null;\n }, this);\n };\n\n/**\n * Externalize the source map.\n */\nSourceMapGenerator.prototype.toJSON =\n function SourceMapGenerator_toJSON() {\n var map = {\n version: this._version,\n sources: this._sources.toArray(),\n names: this._names.toArray(),\n mappings: this._serializeMappings()\n };\n if (this._file != null) {\n map.file = this._file;\n }\n if (this._sourceRoot != null) {\n map.sourceRoot = this._sourceRoot;\n }\n if (this._sourcesContents) {\n map.sourcesContent = this._generateSourcesContent(map.sources, map.sourceRoot);\n }\n\n return map;\n };\n\n/**\n * Render the source map being generated to a string.\n */\nSourceMapGenerator.prototype.toString =\n function SourceMapGenerator_toString() {\n return JSON.stringify(this.toJSON());\n };\n\nexports.SourceMapGenerator = SourceMapGenerator;\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n *\n * Based on the Base 64 VLQ implementation in Closure Compiler:\n * https://code.google.com/p/closure-compiler/source/browse/trunk/src/com/google/debugging/sourcemap/Base64VLQ.java\n *\n * Copyright 2011 The Closure Compiler Authors. All rights reserved.\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n * * Redistributions of source code must retain the above copyright\n * notice, this list of conditions and the following disclaimer.\n * * Redistributions in binary form must reproduce the above\n * copyright notice, this list of conditions and the following\n * disclaimer in the documentation and/or other materials provided\n * with the distribution.\n * * Neither the name of Google Inc. nor the names of its\n * contributors may be used to endorse or promote products derived\n * from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\nvar base64 = __webpack_require__(22);\n\n// A single base 64 digit can contain 6 bits of data. For the base 64 variable\n// length quantities we use in the source map spec, the first bit is the sign,\n// the next four bits are the actual value, and the 6th bit is the\n// continuation bit. The continuation bit tells us whether there are more\n// digits in this value following this digit.\n//\n// Continuation\n// | Sign\n// | |\n// V V\n// 101011\n\nvar VLQ_BASE_SHIFT = 5;\n\n// binary: 100000\nvar VLQ_BASE = 1 << VLQ_BASE_SHIFT;\n\n// binary: 011111\nvar VLQ_BASE_MASK = VLQ_BASE - 1;\n\n// binary: 100000\nvar VLQ_CONTINUATION_BIT = VLQ_BASE;\n\n/**\n * Converts from a two-complement value to a value where the sign bit is\n * placed in the least significant bit. For example, as decimals:\n * 1 becomes 2 (10 binary), -1 becomes 3 (11 binary)\n * 2 becomes 4 (100 binary), -2 becomes 5 (101 binary)\n */\nfunction toVLQSigned(aValue) {\n return aValue < 0\n ? ((-aValue) << 1) + 1\n : (aValue << 1) + 0;\n}\n\n/**\n * Converts to a two-complement value from a value where the sign bit is\n * placed in the least significant bit. For example, as decimals:\n * 2 (10 binary) becomes 1, 3 (11 binary) becomes -1\n * 4 (100 binary) becomes 2, 5 (101 binary) becomes -2\n */\nfunction fromVLQSigned(aValue) {\n var isNegative = (aValue & 1) === 1;\n var shifted = aValue >> 1;\n return isNegative\n ? -shifted\n : shifted;\n}\n\n/**\n * Returns the base 64 VLQ encoded value.\n */\nexports.encode = function base64VLQ_encode(aValue) {\n var encoded = \"\";\n var digit;\n\n var vlq = toVLQSigned(aValue);\n\n do {\n digit = vlq & VLQ_BASE_MASK;\n vlq >>>= VLQ_BASE_SHIFT;\n if (vlq > 0) {\n // There are still more digits in this value, so we must make sure the\n // continuation bit is marked.\n digit |= VLQ_CONTINUATION_BIT;\n }\n encoded += base64.encode(digit);\n } while (vlq > 0);\n\n return encoded;\n};\n\n/**\n * Decodes the next base 64 VLQ value from the given string and returns the\n * value and the rest of the string via the out parameter.\n */\nexports.decode = function base64VLQ_decode(aStr, aIndex, aOutParam) {\n var strLen = aStr.length;\n var result = 0;\n var shift = 0;\n var continuation, digit;\n\n do {\n if (aIndex >= strLen) {\n throw new Error(\"Expected more digits in base 64 VLQ value.\");\n }\n\n digit = base64.decode(aStr.charCodeAt(aIndex++));\n if (digit === -1) {\n throw new Error(\"Invalid base64 digit: \" + aStr.charAt(aIndex - 1));\n }\n\n continuation = !!(digit & VLQ_CONTINUATION_BIT);\n digit &= VLQ_BASE_MASK;\n result = result + (digit << shift);\n shift += VLQ_BASE_SHIFT;\n } while (continuation);\n\n aOutParam.value = fromVLQSigned(result);\n aOutParam.rest = aIndex;\n};\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar util = __webpack_require__(0);\nvar has = Object.prototype.hasOwnProperty;\n\n/**\n * A data structure which is a combination of an array and a set. Adding a new\n * member is O(1), testing for membership is O(1), and finding the index of an\n * element is O(1). Removing elements from the set is not supported. Only\n * strings are supported for membership.\n */\nfunction ArraySet() {\n this._array = [];\n this._set = Object.create(null);\n}\n\n/**\n * Static method for creating ArraySet instances from an existing array.\n */\nArraySet.fromArray = function ArraySet_fromArray(aArray, aAllowDuplicates) {\n var set = new ArraySet();\n for (var i = 0, len = aArray.length; i < len; i++) {\n set.add(aArray[i], aAllowDuplicates);\n }\n return set;\n};\n\n/**\n * Return how many unique items are in this ArraySet. If duplicates have been\n * added, than those do not count towards the size.\n *\n * @returns Number\n */\nArraySet.prototype.size = function ArraySet_size() {\n return Object.getOwnPropertyNames(this._set).length;\n};\n\n/**\n * Add the given string to this set.\n *\n * @param String aStr\n */\nArraySet.prototype.add = function ArraySet_add(aStr, aAllowDuplicates) {\n var sStr = util.toSetString(aStr);\n var isDuplicate = has.call(this._set, sStr);\n var idx = this._array.length;\n if (!isDuplicate || aAllowDuplicates) {\n this._array.push(aStr);\n }\n if (!isDuplicate) {\n this._set[sStr] = idx;\n }\n};\n\n/**\n * Is the given string a member of this set?\n *\n * @param String aStr\n */\nArraySet.prototype.has = function ArraySet_has(aStr) {\n var sStr = util.toSetString(aStr);\n return has.call(this._set, sStr);\n};\n\n/**\n * What is the index of the given string in the array?\n *\n * @param String aStr\n */\nArraySet.prototype.indexOf = function ArraySet_indexOf(aStr) {\n var sStr = util.toSetString(aStr);\n if (has.call(this._set, sStr)) {\n return this._set[sStr];\n }\n throw new Error('\"' + aStr + '\" is not in the set.');\n};\n\n/**\n * What is the element at the given index?\n *\n * @param Number aIdx\n */\nArraySet.prototype.at = function ArraySet_at(aIdx) {\n if (aIdx >= 0 && aIdx < this._array.length) {\n return this._array[aIdx];\n }\n throw new Error('No element indexed by ' + aIdx);\n};\n\n/**\n * Returns the array representation of this set (which has the proper indices\n * indicated by indexOf). Note that this is a copy of the internal array used\n * for storing the members so that no one can mess with internal state.\n */\nArraySet.prototype.toArray = function ArraySet_toArray() {\n return this._array.slice();\n};\n\nexports.ArraySet = ArraySet;\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return getLinesAround; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__stack_frame__ = __webpack_require__(1);\n/**\n * Copyright (c) 2015-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\n/**\n *\n * @param {number} line The line number to provide context around.\n * @param {number} count The number of lines you'd like for context.\n * @param {string[] | string} lines The source code.\n */\nfunction getLinesAround(line, count, lines) {\n if (typeof lines === 'string') {\n lines = lines.split('\\n');\n }\n var result = [];\n for (var index = Math.max(0, line - 1 - count); index <= Math.min(lines.length - 1, line - 1 + count); ++index) {\n result.push(new __WEBPACK_IMPORTED_MODULE_0__stack_frame__[\"a\" /* ScriptLine */](index + 1, lines[index], index === line - 1));\n }\n return result;\n}\n\n\n/* unused harmony default export */ var _unused_webpack_default_export = (getLinesAround);\n\n/***/ }),\n/* 9 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* WEBPACK VAR INJECTION */(function(process) {/* harmony export (immutable) */ __webpack_exports__[\"setEditorHandler\"] = setEditorHandler;\n/* harmony export (immutable) */ __webpack_exports__[\"reportBuildError\"] = reportBuildError;\n/* harmony export (immutable) */ __webpack_exports__[\"dismissBuildError\"] = dismissBuildError;\n/* harmony export (immutable) */ __webpack_exports__[\"startReportingRuntimeErrors\"] = startReportingRuntimeErrors;\n/* harmony export (immutable) */ __webpack_exports__[\"stopReportingRuntimeErrors\"] = stopReportingRuntimeErrors;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__listenToRuntimeErrors__ = __webpack_require__(10);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__styles__ = __webpack_require__(31);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__utils_dom_css__ = __webpack_require__(32);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_iframeScript__ = __webpack_require__(33);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_iframeScript___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_iframeScript__);\n/**\n * Copyright (c) 2015-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\n\n\n// Importing iframe-bundle generated in the pre build step as\n// a text using webpack raw-loader. See webpack.config.js file.\n// $FlowFixMe\n\n\nvar iframe = null;\nvar isLoadingIframe = false;\nvar isIframeReady = false;\n\nvar editorHandler = null;\nvar currentBuildError = null;\nvar currentRuntimeErrorRecords = [];\nvar currentRuntimeErrorOptions = null;\nvar stopListeningToRuntimeErrors = null;\n\nfunction setEditorHandler(handler) {\n editorHandler = handler;\n if (iframe) {\n update();\n }\n}\n\nfunction reportBuildError(error) {\n currentBuildError = error;\n update();\n}\n\nfunction dismissBuildError() {\n currentBuildError = null;\n update();\n}\n\nfunction startReportingRuntimeErrors(options) {\n if (stopListeningToRuntimeErrors !== null) {\n throw new Error('Already listening');\n }\n if (options.launchEditorEndpoint) {\n console.warn('Warning: `startReportingRuntimeErrors` doesn’t accept ' + '`launchEditorEndpoint` argument anymore. Use `listenToOpenInEditor` ' + 'instead with your own implementation to open errors in editor ');\n }\n currentRuntimeErrorOptions = options;\n Object(__WEBPACK_IMPORTED_MODULE_0__listenToRuntimeErrors__[\"a\" /* listenToRuntimeErrors */])(function (errorRecord) {\n try {\n if (typeof options.onError === 'function') {\n options.onError.call(null);\n }\n } finally {\n handleRuntimeError(errorRecord);\n }\n }, options.filename);\n}\n\nfunction handleRuntimeError(errorRecord) {\n if (currentRuntimeErrorRecords.some(function (_ref) {\n var error = _ref.error;\n return error === errorRecord.error;\n })) {\n // Deduplicate identical errors.\n // This fixes https://github.com/facebookincubator/create-react-app/issues/3011.\n return;\n }\n currentRuntimeErrorRecords = currentRuntimeErrorRecords.concat([errorRecord]);\n update();\n}\n\nfunction dismissRuntimeErrors() {\n currentRuntimeErrorRecords = [];\n update();\n}\n\nfunction stopReportingRuntimeErrors() {\n if (stopListeningToRuntimeErrors === null) {\n throw new Error('Not currently listening');\n }\n currentRuntimeErrorOptions = null;\n try {\n stopListeningToRuntimeErrors();\n } finally {\n stopListeningToRuntimeErrors = null;\n }\n}\n\nfunction update() {\n // Loading iframe can be either sync or async depending on the browser.\n if (isLoadingIframe) {\n // Iframe is loading.\n // First render will happen soon--don't need to do anything.\n return;\n }\n if (isIframeReady) {\n // Iframe is ready.\n // Just update it.\n updateIframeContent();\n return;\n }\n // We need to schedule the first render.\n isLoadingIframe = true;\n var loadingIframe = window.document.createElement('iframe');\n Object(__WEBPACK_IMPORTED_MODULE_2__utils_dom_css__[\"a\" /* applyStyles */])(loadingIframe, __WEBPACK_IMPORTED_MODULE_1__styles__[\"a\" /* iframeStyle */]);\n loadingIframe.onload = function () {\n var iframeDocument = loadingIframe.contentDocument;\n if (iframeDocument != null && iframeDocument.body != null) {\n iframe = loadingIframe;\n var script = loadingIframe.contentWindow.document.createElement('script');\n script.type = 'text/javascript';\n script.innerHTML = __WEBPACK_IMPORTED_MODULE_3_iframeScript___default.a;\n iframeDocument.body.appendChild(script);\n }\n };\n var appDocument = window.document;\n appDocument.body.appendChild(loadingIframe);\n}\n\nfunction updateIframeContent() {\n if (!currentRuntimeErrorOptions) {\n throw new Error('Expected options to be injected.');\n }\n\n if (!iframe) {\n throw new Error('Iframe has not been created yet.');\n }\n\n var isRendered = iframe.contentWindow.updateContent({\n currentBuildError: currentBuildError,\n currentRuntimeErrorRecords: currentRuntimeErrorRecords,\n dismissRuntimeErrors: dismissRuntimeErrors,\n editorHandler: editorHandler\n });\n\n if (!isRendered) {\n window.document.body.removeChild(iframe);\n iframe = null;\n isIframeReady = false;\n }\n}\n\nwindow.__REACT_ERROR_OVERLAY_GLOBAL_HOOK__ = window.__REACT_ERROR_OVERLAY_GLOBAL_HOOK__ || {};\nwindow.__REACT_ERROR_OVERLAY_GLOBAL_HOOK__.iframeReady = function iframeReady() {\n isIframeReady = true;\n isLoadingIframe = false;\n updateIframeContent();\n};\n\nif (process.env.NODE_ENV === 'production') {\n console.warn('react-error-overlay is not meant for use in production. You should ' + 'ensure it is not included in your build to reduce bundle size.');\n}\n/* WEBPACK VAR INJECTION */}.call(__webpack_exports__, __webpack_require__(3)))\n\n/***/ }),\n/* 10 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (immutable) */ __webpack_exports__[\"a\"] = listenToRuntimeErrors;\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__effects_unhandledError__ = __webpack_require__(11);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__effects_unhandledRejection__ = __webpack_require__(12);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__effects_stackTraceLimit__ = __webpack_require__(13);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__effects_proxyConsole__ = __webpack_require__(14);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__utils_warnings__ = __webpack_require__(15);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__utils_getStackFrames__ = __webpack_require__(16);\n/**\n * Copyright (c) 2015-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\n\n\n\n\n\nvar CONTEXT_SIZE = 3;\n\nfunction listenToRuntimeErrors(crash) {\n var filename = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '/static/js/bundle.js';\n\n function crashWithFrames(error) {\n var unhandledRejection = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n Object(__WEBPACK_IMPORTED_MODULE_5__utils_getStackFrames__[\"a\" /* default */])(error, unhandledRejection, CONTEXT_SIZE).then(function (stackFrames) {\n if (stackFrames == null) {\n return;\n }\n crash({\n error: error,\n unhandledRejection: unhandledRejection,\n contextSize: CONTEXT_SIZE,\n stackFrames: stackFrames\n });\n }).catch(function (e) {\n console.log('Could not get the stack frames of error:', e);\n });\n }\n Object(__WEBPACK_IMPORTED_MODULE_0__effects_unhandledError__[\"a\" /* register */])(window, function (error) {\n return crashWithFrames(error, false);\n });\n Object(__WEBPACK_IMPORTED_MODULE_1__effects_unhandledRejection__[\"a\" /* register */])(window, function (error) {\n return crashWithFrames(error, true);\n });\n Object(__WEBPACK_IMPORTED_MODULE_2__effects_stackTraceLimit__[\"a\" /* register */])();\n Object(__WEBPACK_IMPORTED_MODULE_3__effects_proxyConsole__[\"b\" /* registerReactStack */])();\n Object(__WEBPACK_IMPORTED_MODULE_3__effects_proxyConsole__[\"a\" /* permanentRegister */])('error', function (warning, stack) {\n var data = Object(__WEBPACK_IMPORTED_MODULE_4__utils_warnings__[\"a\" /* massage */])(warning, stack);\n crashWithFrames(\n // $FlowFixMe\n {\n message: data.message,\n stack: data.stack,\n __unmap_source: filename\n }, false);\n });\n\n return function stopListening() {\n Object(__WEBPACK_IMPORTED_MODULE_2__effects_stackTraceLimit__[\"b\" /* unregister */])();\n Object(__WEBPACK_IMPORTED_MODULE_1__effects_unhandledRejection__[\"b\" /* unregister */])(window);\n Object(__WEBPACK_IMPORTED_MODULE_0__effects_unhandledError__[\"b\" /* unregister */])(window);\n Object(__WEBPACK_IMPORTED_MODULE_3__effects_proxyConsole__[\"c\" /* unregisterReactStack */])();\n };\n}\n\n/***/ }),\n/* 11 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return registerUnhandledError; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return unregisterUnhandledError; });\n/**\n * Copyright (c) 2015-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar boundErrorHandler = null;\n\nfunction errorHandler(callback, e) {\n if (!e.error) {\n return;\n }\n // $FlowFixMe\n var error = e.error;\n\n if (error instanceof Error) {\n callback(error);\n } else {\n // A non-error was thrown, we don't have a trace. :(\n // Look in your browser's devtools for more information\n callback(new Error(error));\n }\n}\n\nfunction registerUnhandledError(target, callback) {\n if (boundErrorHandler !== null) {\n return;\n }\n boundErrorHandler = errorHandler.bind(undefined, callback);\n target.addEventListener('error', boundErrorHandler);\n}\n\nfunction unregisterUnhandledError(target) {\n if (boundErrorHandler === null) {\n return;\n }\n target.removeEventListener('error', boundErrorHandler);\n boundErrorHandler = null;\n}\n\n\n\n/***/ }),\n/* 12 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return registerUnhandledRejection; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return unregisterUnhandledRejection; });\n/**\n * Copyright (c) 2015-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar boundRejectionHandler = null;\n\nfunction rejectionHandler(callback, e) {\n if (e == null || e.reason == null) {\n return callback(new Error('Unknown'));\n }\n var reason = e.reason;\n\n if (reason instanceof Error) {\n return callback(reason);\n }\n // A non-error was rejected, we don't have a trace :(\n // Look in your browser's devtools for more information\n return callback(new Error(reason));\n}\n\nfunction registerUnhandledRejection(target, callback) {\n if (boundRejectionHandler !== null) {\n return;\n }\n boundRejectionHandler = rejectionHandler.bind(undefined, callback);\n // $FlowFixMe\n target.addEventListener('unhandledrejection', boundRejectionHandler);\n}\n\nfunction unregisterUnhandledRejection(target) {\n if (boundRejectionHandler === null) {\n return;\n }\n // $FlowFixMe\n target.removeEventListener('unhandledrejection', boundRejectionHandler);\n boundRejectionHandler = null;\n}\n\n\n\n/***/ }),\n/* 13 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return registerStackTraceLimit; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return unregisterStackTraceLimit; });\n/**\n * Copyright (c) 2015-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar stackTraceRegistered = false;\n// Default: https://docs.microsoft.com/en-us/scripting/javascript/reference/stacktracelimit-property-error-javascript\nvar restoreStackTraceValue = 10;\n\nvar MAX_STACK_LENGTH = 50;\n\nfunction registerStackTraceLimit() {\n var limit = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : MAX_STACK_LENGTH;\n\n if (stackTraceRegistered) {\n return;\n }\n try {\n restoreStackTraceValue = Error.stackTraceLimit;\n Error.stackTraceLimit = limit;\n stackTraceRegistered = true;\n } catch (e) {\n // Not all browsers support this so we don't care if it errors\n }\n}\n\nfunction unregisterStackTraceLimit() {\n if (!stackTraceRegistered) {\n return;\n }\n try {\n Error.stackTraceLimit = restoreStackTraceValue;\n stackTraceRegistered = false;\n } catch (e) {\n // Not all browsers support this so we don't care if it errors\n }\n}\n\n\n\n/***/ }),\n/* 14 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return permanentRegister; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"b\", function() { return registerReactStack; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"c\", function() { return unregisterReactStack; });\n\nvar reactFrameStack = []; /**\n * Copyright (c) 2015-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n// This is a stripped down barebones version of this proposal:\n// https://gist.github.com/sebmarkbage/bdefa100f19345229d526d0fdd22830f\n// We're implementing just enough to get the invalid element type warnings\n// to display the component stack in React 15.6+:\n// https://github.com/facebook/react/pull/9679\n/// TODO: a more comprehensive implementation.\n\nvar registerReactStack = function registerReactStack() {\n if (typeof console !== 'undefined') {\n // $FlowFixMe\n console.reactStack = function (frames) {\n return reactFrameStack.push(frames);\n };\n // $FlowFixMe\n console.reactStackEnd = function (frames) {\n return reactFrameStack.pop();\n };\n }\n};\n\nvar unregisterReactStack = function unregisterReactStack() {\n if (typeof console !== 'undefined') {\n // $FlowFixMe\n console.reactStack = undefined;\n // $FlowFixMe\n console.reactStackEnd = undefined;\n }\n};\n\nvar permanentRegister = function proxyConsole(type, callback) {\n if (typeof console !== 'undefined') {\n var orig = console[type];\n if (typeof orig === 'function') {\n console[type] = function __stack_frame_overlay_proxy_console__() {\n try {\n var _message = arguments[0];\n if (typeof _message === 'string' && reactFrameStack.length > 0) {\n callback(_message, reactFrameStack[reactFrameStack.length - 1]);\n }\n } catch (err) {\n // Warnings must never crash. Rethrow with a clean stack.\n setTimeout(function () {\n throw err;\n });\n }\n return orig.apply(this, arguments);\n };\n }\n }\n};\n\n\n\n/***/ }),\n/* 15 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return massage; });\n\n\nfunction stripInlineStacktrace(message) {\n return message.split('\\n').filter(function (line) {\n return !line.match(/^\\s*in/);\n }).join('\\n'); // \" in Foo\"\n} /**\n * Copyright (c) 2015-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nfunction massage(warning, frames) {\n var message = stripInlineStacktrace(warning);\n\n // Reassemble the stack with full filenames provided by React\n var stack = '';\n var lastFilename = void 0;\n var lastLineNumber = void 0;\n for (var index = 0; index < frames.length; ++index) {\n var _frames$index = frames[index],\n fileName = _frames$index.fileName,\n lineNumber = _frames$index.lineNumber;\n\n if (fileName == null || lineNumber == null) {\n continue;\n }\n\n // TODO: instead, collapse them in the UI\n if (fileName === lastFilename && typeof lineNumber === 'number' && typeof lastLineNumber === 'number' && Math.abs(lineNumber - lastLineNumber) < 3) {\n continue;\n }\n lastFilename = fileName;\n lastLineNumber = lineNumber;\n\n var name = frames[index].name;\n\n name = name || '(anonymous function)';\n stack += 'in ' + name + ' (at ' + fileName + ':' + lineNumber + ')\\n';\n }\n\n return { message: message, stack: stack };\n}\n\n\n\n/***/ }),\n/* 16 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* unused harmony export getStackFrames */\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__parser__ = __webpack_require__(17);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__mapper__ = __webpack_require__(18);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__unmapper__ = __webpack_require__(29);\n\n /**\n * Copyright (c) 2015-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\n\nfunction getStackFrames(error) {\n var unhandledRejection = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var contextSize = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 3;\n\n var parsedFrames = Object(__WEBPACK_IMPORTED_MODULE_0__parser__[\"a\" /* parse */])(error);\n var enhancedFramesPromise = void 0;\n if (error.__unmap_source) {\n enhancedFramesPromise = Object(__WEBPACK_IMPORTED_MODULE_2__unmapper__[\"a\" /* unmap */])(\n // $FlowFixMe\n error.__unmap_source, parsedFrames, contextSize);\n } else {\n enhancedFramesPromise = Object(__WEBPACK_IMPORTED_MODULE_1__mapper__[\"a\" /* map */])(parsedFrames, contextSize);\n }\n return enhancedFramesPromise.then(function (enhancedFrames) {\n if (enhancedFrames.map(function (f) {\n return f._originalFileName;\n }).filter(function (f) {\n return f != null && f.indexOf('node_modules') === -1;\n }).length === 0) {\n return null;\n }\n return enhancedFrames.filter(function (_ref) {\n var functionName = _ref.functionName;\n return functionName == null || functionName.indexOf('__stack_frame_overlay_proxy_console__') === -1;\n });\n });\n}\n\n/* harmony default export */ __webpack_exports__[\"a\"] = (getStackFrames);\n\n\n/***/ }),\n/* 17 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return parseError; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__stack_frame__ = __webpack_require__(1);\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\n/**\n * Copyright (c) 2015-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\nvar regexExtractLocation = /\\(?(.+?)(?::(\\d+))?(?::(\\d+))?\\)?$/;\n\nfunction extractLocation(token) {\n return regexExtractLocation.exec(token).slice(1).map(function (v) {\n var p = Number(v);\n if (!isNaN(p)) {\n return p;\n }\n return v;\n });\n}\n\nvar regexValidFrame_Chrome = /^\\s*(at|in)\\s.+(:\\d+)/;\nvar regexValidFrame_FireFox = /(^|@)\\S+:\\d+|.+line\\s+\\d+\\s+>\\s+(eval|Function).+/;\n\nfunction parseStack(stack) {\n var frames = stack.filter(function (e) {\n return regexValidFrame_Chrome.test(e) || regexValidFrame_FireFox.test(e);\n }).map(function (e) {\n if (regexValidFrame_FireFox.test(e)) {\n // Strip eval, we don't care about it\n var isEval = false;\n if (/ > (eval|Function)/.test(e)) {\n e = e.replace(/ line (\\d+)(?: > eval line \\d+)* > (eval|Function):\\d+:\\d+/g, ':$1');\n isEval = true;\n }\n var data = e.split(/[@]/g);\n var last = data.pop();\n return new (Function.prototype.bind.apply(__WEBPACK_IMPORTED_MODULE_0__stack_frame__[\"b\" /* default */], [null].concat([data.join('@') || (isEval ? 'eval' : null)], _toConsumableArray(extractLocation(last)))))();\n } else {\n // Strip eval, we don't care about it\n if (e.indexOf('(eval ') !== -1) {\n e = e.replace(/(\\(eval at [^()]*)|(\\),.*$)/g, '');\n }\n if (e.indexOf('(at ') !== -1) {\n e = e.replace(/\\(at /, '(');\n }\n var _data = e.trim().split(/\\s+/g).slice(1);\n var _last = _data.pop();\n return new (Function.prototype.bind.apply(__WEBPACK_IMPORTED_MODULE_0__stack_frame__[\"b\" /* default */], [null].concat([_data.join(' ') || null], _toConsumableArray(extractLocation(_last)))))();\n }\n });\n return frames;\n}\n\n/**\n * Turns an <code>Error</code>, or similar object, into a set of <code>StackFrame</code>s.\n * @alias parse\n */\nfunction parseError(error) {\n if (error == null) {\n throw new Error('You cannot pass a null object.');\n }\n if (typeof error === 'string') {\n return parseStack(error.split('\\n'));\n }\n if (Array.isArray(error)) {\n return parseStack(error);\n }\n if (typeof error.stack === 'string') {\n return parseStack(error.stack.split('\\n'));\n }\n throw new Error('The error you provided does not contain a stack trace.');\n}\n\n\n/* unused harmony default export */ var _unused_webpack_default_export = (parseError);\n\n/***/ }),\n/* 18 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return map; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__stack_frame__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__getSourceMap__ = __webpack_require__(4);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__getLinesAround__ = __webpack_require__(8);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_settle_promise__ = __webpack_require__(28);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_settle_promise___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_settle_promise__);\n\n\n/**\n * Enhances a set of <code>StackFrame</code>s with their original positions and code (when available).\n * @param {StackFrame[]} frames A set of <code>StackFrame</code>s which contain (generated) code positions.\n * @param {number} [contextLines=3] The number of lines to provide before and after the line specified in the <code>StackFrame</code>.\n */\nvar map = function () {\n var _ref = _asyncToGenerator( /*#__PURE__*/__WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.mark(function _callee2(frames) {\n var _this = this;\n\n var contextLines = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 3;\n var cache, files;\n return __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n cache = {};\n files = [];\n\n frames.forEach(function (frame) {\n var fileName = frame.fileName;\n\n if (fileName == null) {\n return;\n }\n if (files.indexOf(fileName) !== -1) {\n return;\n }\n files.push(fileName);\n });\n _context2.next = 5;\n return Object(__WEBPACK_IMPORTED_MODULE_4_settle_promise__[\"settle\"])(files.map(function () {\n var _ref2 = _asyncToGenerator( /*#__PURE__*/__WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.mark(function _callee(fileName) {\n var fileSource, map;\n return __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _context.next = 2;\n return fetch(fileName).then(function (r) {\n return r.text();\n });\n\n case 2:\n fileSource = _context.sent;\n _context.next = 5;\n return Object(__WEBPACK_IMPORTED_MODULE_2__getSourceMap__[\"a\" /* getSourceMap */])(fileName, fileSource);\n\n case 5:\n map = _context.sent;\n\n cache[fileName] = { fileSource: fileSource, map: map };\n\n case 7:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, _this);\n }));\n\n return function (_x3) {\n return _ref2.apply(this, arguments);\n };\n }()));\n\n case 5:\n return _context2.abrupt('return', frames.map(function (frame) {\n var functionName = frame.functionName,\n fileName = frame.fileName,\n lineNumber = frame.lineNumber,\n columnNumber = frame.columnNumber;\n\n var _ref3 = cache[fileName] || {},\n map = _ref3.map,\n fileSource = _ref3.fileSource;\n\n if (map == null || lineNumber == null) {\n return frame;\n }\n\n var _map$getOriginalPosit = map.getOriginalPosition(lineNumber, columnNumber),\n source = _map$getOriginalPosit.source,\n line = _map$getOriginalPosit.line,\n column = _map$getOriginalPosit.column;\n\n var originalSource = source == null ? [] : map.getSource(source);\n return new __WEBPACK_IMPORTED_MODULE_1__stack_frame__[\"b\" /* default */](functionName, fileName, lineNumber, columnNumber, Object(__WEBPACK_IMPORTED_MODULE_3__getLinesAround__[\"a\" /* getLinesAround */])(lineNumber, contextLines, fileSource), functionName, source, line, column, Object(__WEBPACK_IMPORTED_MODULE_3__getLinesAround__[\"a\" /* getLinesAround */])(line, contextLines, originalSource));\n }));\n\n case 6:\n case 'end':\n return _context2.stop();\n }\n }\n }, _callee2, this);\n }));\n\n return function map(_x2) {\n return _ref.apply(this, arguments);\n };\n}();\n\nfunction _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step(\"next\", value); }, function (err) { step(\"throw\", err); }); } } return step(\"next\"); }); }; }\n\n/**\n * Copyright (c) 2015-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\n\n\n\n\n/* unused harmony default export */ var _unused_webpack_default_export = (map);\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports, __webpack_require__) {\n\n// This method of obtaining a reference to the global object needs to be\n// kept identical to the way it is obtained in runtime.js\nvar g = (function() { return this })() || Function(\"return this\")();\n\n// Use `getOwnPropertyNames` because not all browsers support calling\n// `hasOwnProperty` on the global `self` object in a worker. See #183.\nvar hadRuntime = g.regeneratorRuntime &&\n Object.getOwnPropertyNames(g).indexOf(\"regeneratorRuntime\") >= 0;\n\n// Save the old regeneratorRuntime in case it needs to be restored later.\nvar oldRuntime = hadRuntime && g.regeneratorRuntime;\n\n// Force reevalutation of runtime.js.\ng.regeneratorRuntime = undefined;\n\nmodule.exports = __webpack_require__(20);\n\nif (hadRuntime) {\n // Restore the original runtime.\n g.regeneratorRuntime = oldRuntime;\n} else {\n // Remove the global property added by runtime.js.\n try {\n delete g.regeneratorRuntime;\n } catch(e) {\n g.regeneratorRuntime = undefined;\n }\n}\n\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports) {\n\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * https://raw.github.com/facebook/regenerator/master/LICENSE file. An\n * additional grant of patent rights can be found in the PATENTS file in\n * the same directory.\n */\n\n!(function(global) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n var inModule = typeof module === \"object\";\n var runtime = global.regeneratorRuntime;\n if (runtime) {\n if (inModule) {\n // If regeneratorRuntime is defined globally and we're in a module,\n // make the exports object identical to regeneratorRuntime.\n module.exports = runtime;\n }\n // Don't bother evaluating the rest of this file if the runtime was\n // already defined globally.\n return;\n }\n\n // Define the runtime globally (as expected by generated code) as either\n // module.exports (if we're in a module) or a new, empty object.\n runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n runtime.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunctionPrototype[toStringTagSymbol] =\n GeneratorFunction.displayName = \"GeneratorFunction\";\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n prototype[method] = function(arg) {\n return this._invoke(method, arg);\n };\n });\n }\n\n runtime.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n runtime.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n if (!(toStringTagSymbol in genFun)) {\n genFun[toStringTagSymbol] = \"GeneratorFunction\";\n }\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n runtime.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return Promise.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return Promise.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration. If the Promise is rejected, however, the\n // result for this iteration will be rejected with the same\n // reason. Note that rejections of yielded Promises are not\n // thrown back into the generator function, as is the case\n // when an awaited Promise is rejected. This difference in\n // behavior between yield and await is important, because it\n // allows the consumer to decide what to do with the yielded\n // rejection (swallow it and continue, manually .throw it back\n // into the generator, abandon iteration, whatever). With\n // await, by contrast, there is no opportunity to examine the\n // rejection reason outside the generator function, so the\n // only option is to throw it from the await expression, and\n // let the generator function handle the exception.\n result.value = unwrapped;\n resolve(result);\n }, reject);\n }\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new Promise(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n runtime.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n runtime.async = function(innerFn, outerFn, self, tryLocsList) {\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList)\n );\n\n return runtime.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n if (delegate.iterator.return) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n Gp[toStringTagSymbol] = \"Generator\";\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n runtime.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n runtime.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n})(\n // In sloppy mode, unbound `this` refers to the global object, fallback to\n // Function constructor if we're in global strict mode. That is sadly a form\n // of indirect eval which violates Content Security Policy.\n (function() { return this })() || Function(\"return this\")()\n);\n\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*\n * Copyright 2009-2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE.txt or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\nexports.SourceMapGenerator = __webpack_require__(5).SourceMapGenerator;\nexports.SourceMapConsumer = __webpack_require__(24).SourceMapConsumer;\nexports.SourceNode = __webpack_require__(27).SourceNode;\n\n\n/***/ }),\n/* 22 */\n/***/ (function(module, exports) {\n\n/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar intToCharMap = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split('');\n\n/**\n * Encode an integer in the range of 0 to 63 to a single base 64 digit.\n */\nexports.encode = function (number) {\n if (0 <= number && number < intToCharMap.length) {\n return intToCharMap[number];\n }\n throw new TypeError(\"Must be between 0 and 63: \" + number);\n};\n\n/**\n * Decode a single base 64 character code digit to an integer. Returns -1 on\n * failure.\n */\nexports.decode = function (charCode) {\n var bigA = 65; // 'A'\n var bigZ = 90; // 'Z'\n\n var littleA = 97; // 'a'\n var littleZ = 122; // 'z'\n\n var zero = 48; // '0'\n var nine = 57; // '9'\n\n var plus = 43; // '+'\n var slash = 47; // '/'\n\n var littleOffset = 26;\n var numberOffset = 52;\n\n // 0 - 25: ABCDEFGHIJKLMNOPQRSTUVWXYZ\n if (bigA <= charCode && charCode <= bigZ) {\n return (charCode - bigA);\n }\n\n // 26 - 51: abcdefghijklmnopqrstuvwxyz\n if (littleA <= charCode && charCode <= littleZ) {\n return (charCode - littleA + littleOffset);\n }\n\n // 52 - 61: 0123456789\n if (zero <= charCode && charCode <= nine) {\n return (charCode - zero + numberOffset);\n }\n\n // 62: +\n if (charCode == plus) {\n return 62;\n }\n\n // 63: /\n if (charCode == slash) {\n return 63;\n }\n\n // Invalid base64 digit.\n return -1;\n};\n\n\n/***/ }),\n/* 23 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2014 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar util = __webpack_require__(0);\n\n/**\n * Determine whether mappingB is after mappingA with respect to generated\n * position.\n */\nfunction generatedPositionAfter(mappingA, mappingB) {\n // Optimized for most common case\n var lineA = mappingA.generatedLine;\n var lineB = mappingB.generatedLine;\n var columnA = mappingA.generatedColumn;\n var columnB = mappingB.generatedColumn;\n return lineB > lineA || lineB == lineA && columnB >= columnA ||\n util.compareByGeneratedPositionsInflated(mappingA, mappingB) <= 0;\n}\n\n/**\n * A data structure to provide a sorted view of accumulated mappings in a\n * performance conscious manner. It trades a neglibable overhead in general\n * case for a large speedup in case of mappings being added in order.\n */\nfunction MappingList() {\n this._array = [];\n this._sorted = true;\n // Serves as infimum\n this._last = {generatedLine: -1, generatedColumn: 0};\n}\n\n/**\n * Iterate through internal items. This method takes the same arguments that\n * `Array.prototype.forEach` takes.\n *\n * NOTE: The order of the mappings is NOT guaranteed.\n */\nMappingList.prototype.unsortedForEach =\n function MappingList_forEach(aCallback, aThisArg) {\n this._array.forEach(aCallback, aThisArg);\n };\n\n/**\n * Add the given source mapping.\n *\n * @param Object aMapping\n */\nMappingList.prototype.add = function MappingList_add(aMapping) {\n if (generatedPositionAfter(this._last, aMapping)) {\n this._last = aMapping;\n this._array.push(aMapping);\n } else {\n this._sorted = false;\n this._array.push(aMapping);\n }\n};\n\n/**\n * Returns the flat, sorted array of mappings. The mappings are sorted by\n * generated position.\n *\n * WARNING: This method returns internal data without copying, for\n * performance. The return value must NOT be mutated, and should be treated as\n * an immutable borrow. If you want to take ownership, you must make your own\n * copy.\n */\nMappingList.prototype.toArray = function MappingList_toArray() {\n if (!this._sorted) {\n this._array.sort(util.compareByGeneratedPositionsInflated);\n this._sorted = true;\n }\n return this._array;\n};\n\nexports.MappingList = MappingList;\n\n\n/***/ }),\n/* 24 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar util = __webpack_require__(0);\nvar binarySearch = __webpack_require__(25);\nvar ArraySet = __webpack_require__(7).ArraySet;\nvar base64VLQ = __webpack_require__(6);\nvar quickSort = __webpack_require__(26).quickSort;\n\nfunction SourceMapConsumer(aSourceMap) {\n var sourceMap = aSourceMap;\n if (typeof aSourceMap === 'string') {\n sourceMap = JSON.parse(aSourceMap.replace(/^\\)\\]\\}'/, ''));\n }\n\n return sourceMap.sections != null\n ? new IndexedSourceMapConsumer(sourceMap)\n : new BasicSourceMapConsumer(sourceMap);\n}\n\nSourceMapConsumer.fromSourceMap = function(aSourceMap) {\n return BasicSourceMapConsumer.fromSourceMap(aSourceMap);\n}\n\n/**\n * The version of the source mapping spec that we are consuming.\n */\nSourceMapConsumer.prototype._version = 3;\n\n// `__generatedMappings` and `__originalMappings` are arrays that hold the\n// parsed mapping coordinates from the source map's \"mappings\" attribute. They\n// are lazily instantiated, accessed via the `_generatedMappings` and\n// `_originalMappings` getters respectively, and we only parse the mappings\n// and create these arrays once queried for a source location. We jump through\n// these hoops because there can be many thousands of mappings, and parsing\n// them is expensive, so we only want to do it if we must.\n//\n// Each object in the arrays is of the form:\n//\n// {\n// generatedLine: The line number in the generated code,\n// generatedColumn: The column number in the generated code,\n// source: The path to the original source file that generated this\n// chunk of code,\n// originalLine: The line number in the original source that\n// corresponds to this chunk of generated code,\n// originalColumn: The column number in the original source that\n// corresponds to this chunk of generated code,\n// name: The name of the original symbol which generated this chunk of\n// code.\n// }\n//\n// All properties except for `generatedLine` and `generatedColumn` can be\n// `null`.\n//\n// `_generatedMappings` is ordered by the generated positions.\n//\n// `_originalMappings` is ordered by the original positions.\n\nSourceMapConsumer.prototype.__generatedMappings = null;\nObject.defineProperty(SourceMapConsumer.prototype, '_generatedMappings', {\n get: function () {\n if (!this.__generatedMappings) {\n this._parseMappings(this._mappings, this.sourceRoot);\n }\n\n return this.__generatedMappings;\n }\n});\n\nSourceMapConsumer.prototype.__originalMappings = null;\nObject.defineProperty(SourceMapConsumer.prototype, '_originalMappings', {\n get: function () {\n if (!this.__originalMappings) {\n this._parseMappings(this._mappings, this.sourceRoot);\n }\n\n return this.__originalMappings;\n }\n});\n\nSourceMapConsumer.prototype._charIsMappingSeparator =\n function SourceMapConsumer_charIsMappingSeparator(aStr, index) {\n var c = aStr.charAt(index);\n return c === \";\" || c === \",\";\n };\n\n/**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\nSourceMapConsumer.prototype._parseMappings =\n function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n throw new Error(\"Subclasses must implement _parseMappings\");\n };\n\nSourceMapConsumer.GENERATED_ORDER = 1;\nSourceMapConsumer.ORIGINAL_ORDER = 2;\n\nSourceMapConsumer.GREATEST_LOWER_BOUND = 1;\nSourceMapConsumer.LEAST_UPPER_BOUND = 2;\n\n/**\n * Iterate over each mapping between an original source/line/column and a\n * generated line/column in this source map.\n *\n * @param Function aCallback\n * The function that is called with each mapping.\n * @param Object aContext\n * Optional. If specified, this object will be the value of `this` every\n * time that `aCallback` is called.\n * @param aOrder\n * Either `SourceMapConsumer.GENERATED_ORDER` or\n * `SourceMapConsumer.ORIGINAL_ORDER`. Specifies whether you want to\n * iterate over the mappings sorted by the generated file's line/column\n * order or the original's source/line/column order, respectively. Defaults to\n * `SourceMapConsumer.GENERATED_ORDER`.\n */\nSourceMapConsumer.prototype.eachMapping =\n function SourceMapConsumer_eachMapping(aCallback, aContext, aOrder) {\n var context = aContext || null;\n var order = aOrder || SourceMapConsumer.GENERATED_ORDER;\n\n var mappings;\n switch (order) {\n case SourceMapConsumer.GENERATED_ORDER:\n mappings = this._generatedMappings;\n break;\n case SourceMapConsumer.ORIGINAL_ORDER:\n mappings = this._originalMappings;\n break;\n default:\n throw new Error(\"Unknown order of iteration.\");\n }\n\n var sourceRoot = this.sourceRoot;\n mappings.map(function (mapping) {\n var source = mapping.source === null ? null : this._sources.at(mapping.source);\n if (source != null && sourceRoot != null) {\n source = util.join(sourceRoot, source);\n }\n return {\n source: source,\n generatedLine: mapping.generatedLine,\n generatedColumn: mapping.generatedColumn,\n originalLine: mapping.originalLine,\n originalColumn: mapping.originalColumn,\n name: mapping.name === null ? null : this._names.at(mapping.name)\n };\n }, this).forEach(aCallback, context);\n };\n\n/**\n * Returns all generated line and column information for the original source,\n * line, and column provided. If no column is provided, returns all mappings\n * corresponding to a either the line we are searching for or the next\n * closest line that has any mappings. Otherwise, returns all mappings\n * corresponding to the given line and either the column we are searching for\n * or the next closest column that has any offsets.\n *\n * The only argument is an object with the following properties:\n *\n * - source: The filename of the original source.\n * - line: The line number in the original source.\n * - column: Optional. the column number in the original source.\n *\n * and an array of objects is returned, each with the following properties:\n *\n * - line: The line number in the generated source, or null.\n * - column: The column number in the generated source, or null.\n */\nSourceMapConsumer.prototype.allGeneratedPositionsFor =\n function SourceMapConsumer_allGeneratedPositionsFor(aArgs) {\n var line = util.getArg(aArgs, 'line');\n\n // When there is no exact match, BasicSourceMapConsumer.prototype._findMapping\n // returns the index of the closest mapping less than the needle. By\n // setting needle.originalColumn to 0, we thus find the last mapping for\n // the given line, provided such a mapping exists.\n var needle = {\n source: util.getArg(aArgs, 'source'),\n originalLine: line,\n originalColumn: util.getArg(aArgs, 'column', 0)\n };\n\n if (this.sourceRoot != null) {\n needle.source = util.relative(this.sourceRoot, needle.source);\n }\n if (!this._sources.has(needle.source)) {\n return [];\n }\n needle.source = this._sources.indexOf(needle.source);\n\n var mappings = [];\n\n var index = this._findMapping(needle,\n this._originalMappings,\n \"originalLine\",\n \"originalColumn\",\n util.compareByOriginalPositions,\n binarySearch.LEAST_UPPER_BOUND);\n if (index >= 0) {\n var mapping = this._originalMappings[index];\n\n if (aArgs.column === undefined) {\n var originalLine = mapping.originalLine;\n\n // Iterate until either we run out of mappings, or we run into\n // a mapping for a different line than the one we found. Since\n // mappings are sorted, this is guaranteed to find all mappings for\n // the line we found.\n while (mapping && mapping.originalLine === originalLine) {\n mappings.push({\n line: util.getArg(mapping, 'generatedLine', null),\n column: util.getArg(mapping, 'generatedColumn', null),\n lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n });\n\n mapping = this._originalMappings[++index];\n }\n } else {\n var originalColumn = mapping.originalColumn;\n\n // Iterate until either we run out of mappings, or we run into\n // a mapping for a different line than the one we were searching for.\n // Since mappings are sorted, this is guaranteed to find all mappings for\n // the line we are searching for.\n while (mapping &&\n mapping.originalLine === line &&\n mapping.originalColumn == originalColumn) {\n mappings.push({\n line: util.getArg(mapping, 'generatedLine', null),\n column: util.getArg(mapping, 'generatedColumn', null),\n lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n });\n\n mapping = this._originalMappings[++index];\n }\n }\n }\n\n return mappings;\n };\n\nexports.SourceMapConsumer = SourceMapConsumer;\n\n/**\n * A BasicSourceMapConsumer instance represents a parsed source map which we can\n * query for information about the original file positions by giving it a file\n * position in the generated source.\n *\n * The only parameter is the raw source map (either as a JSON string, or\n * already parsed to an object). According to the spec, source maps have the\n * following attributes:\n *\n * - version: Which version of the source map spec this map is following.\n * - sources: An array of URLs to the original source files.\n * - names: An array of identifiers which can be referrenced by individual mappings.\n * - sourceRoot: Optional. The URL root from which all sources are relative.\n * - sourcesContent: Optional. An array of contents of the original source files.\n * - mappings: A string of base64 VLQs which contain the actual mappings.\n * - file: Optional. The generated file this source map is associated with.\n *\n * Here is an example source map, taken from the source map spec[0]:\n *\n * {\n * version : 3,\n * file: \"out.js\",\n * sourceRoot : \"\",\n * sources: [\"foo.js\", \"bar.js\"],\n * names: [\"src\", \"maps\", \"are\", \"fun\"],\n * mappings: \"AA,AB;;ABCDE;\"\n * }\n *\n * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit?pli=1#\n */\nfunction BasicSourceMapConsumer(aSourceMap) {\n var sourceMap = aSourceMap;\n if (typeof aSourceMap === 'string') {\n sourceMap = JSON.parse(aSourceMap.replace(/^\\)\\]\\}'/, ''));\n }\n\n var version = util.getArg(sourceMap, 'version');\n var sources = util.getArg(sourceMap, 'sources');\n // Sass 3.3 leaves out the 'names' array, so we deviate from the spec (which\n // requires the array) to play nice here.\n var names = util.getArg(sourceMap, 'names', []);\n var sourceRoot = util.getArg(sourceMap, 'sourceRoot', null);\n var sourcesContent = util.getArg(sourceMap, 'sourcesContent', null);\n var mappings = util.getArg(sourceMap, 'mappings');\n var file = util.getArg(sourceMap, 'file', null);\n\n // Once again, Sass deviates from the spec and supplies the version as a\n // string rather than a number, so we use loose equality checking here.\n if (version != this._version) {\n throw new Error('Unsupported version: ' + version);\n }\n\n sources = sources\n .map(String)\n // Some source maps produce relative source paths like \"./foo.js\" instead of\n // \"foo.js\". Normalize these first so that future comparisons will succeed.\n // See bugzil.la/1090768.\n .map(util.normalize)\n // Always ensure that absolute sources are internally stored relative to\n // the source root, if the source root is absolute. Not doing this would\n // be particularly problematic when the source root is a prefix of the\n // source (valid, but why??). See github issue #199 and bugzil.la/1188982.\n .map(function (source) {\n return sourceRoot && util.isAbsolute(sourceRoot) && util.isAbsolute(source)\n ? util.relative(sourceRoot, source)\n : source;\n });\n\n // Pass `true` below to allow duplicate names and sources. While source maps\n // are intended to be compressed and deduplicated, the TypeScript compiler\n // sometimes generates source maps with duplicates in them. See Github issue\n // #72 and bugzil.la/889492.\n this._names = ArraySet.fromArray(names.map(String), true);\n this._sources = ArraySet.fromArray(sources, true);\n\n this.sourceRoot = sourceRoot;\n this.sourcesContent = sourcesContent;\n this._mappings = mappings;\n this.file = file;\n}\n\nBasicSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\nBasicSourceMapConsumer.prototype.consumer = SourceMapConsumer;\n\n/**\n * Create a BasicSourceMapConsumer from a SourceMapGenerator.\n *\n * @param SourceMapGenerator aSourceMap\n * The source map that will be consumed.\n * @returns BasicSourceMapConsumer\n */\nBasicSourceMapConsumer.fromSourceMap =\n function SourceMapConsumer_fromSourceMap(aSourceMap) {\n var smc = Object.create(BasicSourceMapConsumer.prototype);\n\n var names = smc._names = ArraySet.fromArray(aSourceMap._names.toArray(), true);\n var sources = smc._sources = ArraySet.fromArray(aSourceMap._sources.toArray(), true);\n smc.sourceRoot = aSourceMap._sourceRoot;\n smc.sourcesContent = aSourceMap._generateSourcesContent(smc._sources.toArray(),\n smc.sourceRoot);\n smc.file = aSourceMap._file;\n\n // Because we are modifying the entries (by converting string sources and\n // names to indices into the sources and names ArraySets), we have to make\n // a copy of the entry or else bad things happen. Shared mutable state\n // strikes again! See github issue #191.\n\n var generatedMappings = aSourceMap._mappings.toArray().slice();\n var destGeneratedMappings = smc.__generatedMappings = [];\n var destOriginalMappings = smc.__originalMappings = [];\n\n for (var i = 0, length = generatedMappings.length; i < length; i++) {\n var srcMapping = generatedMappings[i];\n var destMapping = new Mapping;\n destMapping.generatedLine = srcMapping.generatedLine;\n destMapping.generatedColumn = srcMapping.generatedColumn;\n\n if (srcMapping.source) {\n destMapping.source = sources.indexOf(srcMapping.source);\n destMapping.originalLine = srcMapping.originalLine;\n destMapping.originalColumn = srcMapping.originalColumn;\n\n if (srcMapping.name) {\n destMapping.name = names.indexOf(srcMapping.name);\n }\n\n destOriginalMappings.push(destMapping);\n }\n\n destGeneratedMappings.push(destMapping);\n }\n\n quickSort(smc.__originalMappings, util.compareByOriginalPositions);\n\n return smc;\n };\n\n/**\n * The version of the source mapping spec that we are consuming.\n */\nBasicSourceMapConsumer.prototype._version = 3;\n\n/**\n * The list of original sources.\n */\nObject.defineProperty(BasicSourceMapConsumer.prototype, 'sources', {\n get: function () {\n return this._sources.toArray().map(function (s) {\n return this.sourceRoot != null ? util.join(this.sourceRoot, s) : s;\n }, this);\n }\n});\n\n/**\n * Provide the JIT with a nice shape / hidden class.\n */\nfunction Mapping() {\n this.generatedLine = 0;\n this.generatedColumn = 0;\n this.source = null;\n this.originalLine = null;\n this.originalColumn = null;\n this.name = null;\n}\n\n/**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\nBasicSourceMapConsumer.prototype._parseMappings =\n function SourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n var generatedLine = 1;\n var previousGeneratedColumn = 0;\n var previousOriginalLine = 0;\n var previousOriginalColumn = 0;\n var previousSource = 0;\n var previousName = 0;\n var length = aStr.length;\n var index = 0;\n var cachedSegments = {};\n var temp = {};\n var originalMappings = [];\n var generatedMappings = [];\n var mapping, str, segment, end, value;\n\n while (index < length) {\n if (aStr.charAt(index) === ';') {\n generatedLine++;\n index++;\n previousGeneratedColumn = 0;\n }\n else if (aStr.charAt(index) === ',') {\n index++;\n }\n else {\n mapping = new Mapping();\n mapping.generatedLine = generatedLine;\n\n // Because each offset is encoded relative to the previous one,\n // many segments often have the same encoding. We can exploit this\n // fact by caching the parsed variable length fields of each segment,\n // allowing us to avoid a second parse if we encounter the same\n // segment again.\n for (end = index; end < length; end++) {\n if (this._charIsMappingSeparator(aStr, end)) {\n break;\n }\n }\n str = aStr.slice(index, end);\n\n segment = cachedSegments[str];\n if (segment) {\n index += str.length;\n } else {\n segment = [];\n while (index < end) {\n base64VLQ.decode(aStr, index, temp);\n value = temp.value;\n index = temp.rest;\n segment.push(value);\n }\n\n if (segment.length === 2) {\n throw new Error('Found a source, but no line and column');\n }\n\n if (segment.length === 3) {\n throw new Error('Found a source and line, but no column');\n }\n\n cachedSegments[str] = segment;\n }\n\n // Generated column.\n mapping.generatedColumn = previousGeneratedColumn + segment[0];\n previousGeneratedColumn = mapping.generatedColumn;\n\n if (segment.length > 1) {\n // Original source.\n mapping.source = previousSource + segment[1];\n previousSource += segment[1];\n\n // Original line.\n mapping.originalLine = previousOriginalLine + segment[2];\n previousOriginalLine = mapping.originalLine;\n // Lines are stored 0-based\n mapping.originalLine += 1;\n\n // Original column.\n mapping.originalColumn = previousOriginalColumn + segment[3];\n previousOriginalColumn = mapping.originalColumn;\n\n if (segment.length > 4) {\n // Original name.\n mapping.name = previousName + segment[4];\n previousName += segment[4];\n }\n }\n\n generatedMappings.push(mapping);\n if (typeof mapping.originalLine === 'number') {\n originalMappings.push(mapping);\n }\n }\n }\n\n quickSort(generatedMappings, util.compareByGeneratedPositionsDeflated);\n this.__generatedMappings = generatedMappings;\n\n quickSort(originalMappings, util.compareByOriginalPositions);\n this.__originalMappings = originalMappings;\n };\n\n/**\n * Find the mapping that best matches the hypothetical \"needle\" mapping that\n * we are searching for in the given \"haystack\" of mappings.\n */\nBasicSourceMapConsumer.prototype._findMapping =\n function SourceMapConsumer_findMapping(aNeedle, aMappings, aLineName,\n aColumnName, aComparator, aBias) {\n // To return the position we are searching for, we must first find the\n // mapping for the given position and then return the opposite position it\n // points to. Because the mappings are sorted, we can use binary search to\n // find the best mapping.\n\n if (aNeedle[aLineName] <= 0) {\n throw new TypeError('Line must be greater than or equal to 1, got '\n + aNeedle[aLineName]);\n }\n if (aNeedle[aColumnName] < 0) {\n throw new TypeError('Column must be greater than or equal to 0, got '\n + aNeedle[aColumnName]);\n }\n\n return binarySearch.search(aNeedle, aMappings, aComparator, aBias);\n };\n\n/**\n * Compute the last column for each generated mapping. The last column is\n * inclusive.\n */\nBasicSourceMapConsumer.prototype.computeColumnSpans =\n function SourceMapConsumer_computeColumnSpans() {\n for (var index = 0; index < this._generatedMappings.length; ++index) {\n var mapping = this._generatedMappings[index];\n\n // Mappings do not contain a field for the last generated columnt. We\n // can come up with an optimistic estimate, however, by assuming that\n // mappings are contiguous (i.e. given two consecutive mappings, the\n // first mapping ends where the second one starts).\n if (index + 1 < this._generatedMappings.length) {\n var nextMapping = this._generatedMappings[index + 1];\n\n if (mapping.generatedLine === nextMapping.generatedLine) {\n mapping.lastGeneratedColumn = nextMapping.generatedColumn - 1;\n continue;\n }\n }\n\n // The last mapping for each line spans the entire line.\n mapping.lastGeneratedColumn = Infinity;\n }\n };\n\n/**\n * Returns the original source, line, and column information for the generated\n * source's line and column positions provided. The only argument is an object\n * with the following properties:\n *\n * - line: The line number in the generated source.\n * - column: The column number in the generated source.\n * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n *\n * and an object is returned with the following properties:\n *\n * - source: The original source file, or null.\n * - line: The line number in the original source, or null.\n * - column: The column number in the original source, or null.\n * - name: The original identifier, or null.\n */\nBasicSourceMapConsumer.prototype.originalPositionFor =\n function SourceMapConsumer_originalPositionFor(aArgs) {\n var needle = {\n generatedLine: util.getArg(aArgs, 'line'),\n generatedColumn: util.getArg(aArgs, 'column')\n };\n\n var index = this._findMapping(\n needle,\n this._generatedMappings,\n \"generatedLine\",\n \"generatedColumn\",\n util.compareByGeneratedPositionsDeflated,\n util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n );\n\n if (index >= 0) {\n var mapping = this._generatedMappings[index];\n\n if (mapping.generatedLine === needle.generatedLine) {\n var source = util.getArg(mapping, 'source', null);\n if (source !== null) {\n source = this._sources.at(source);\n if (this.sourceRoot != null) {\n source = util.join(this.sourceRoot, source);\n }\n }\n var name = util.getArg(mapping, 'name', null);\n if (name !== null) {\n name = this._names.at(name);\n }\n return {\n source: source,\n line: util.getArg(mapping, 'originalLine', null),\n column: util.getArg(mapping, 'originalColumn', null),\n name: name\n };\n }\n }\n\n return {\n source: null,\n line: null,\n column: null,\n name: null\n };\n };\n\n/**\n * Return true if we have the source content for every source in the source\n * map, false otherwise.\n */\nBasicSourceMapConsumer.prototype.hasContentsOfAllSources =\n function BasicSourceMapConsumer_hasContentsOfAllSources() {\n if (!this.sourcesContent) {\n return false;\n }\n return this.sourcesContent.length >= this._sources.size() &&\n !this.sourcesContent.some(function (sc) { return sc == null; });\n };\n\n/**\n * Returns the original source content. The only argument is the url of the\n * original source file. Returns null if no original source content is\n * available.\n */\nBasicSourceMapConsumer.prototype.sourceContentFor =\n function SourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n if (!this.sourcesContent) {\n return null;\n }\n\n if (this.sourceRoot != null) {\n aSource = util.relative(this.sourceRoot, aSource);\n }\n\n if (this._sources.has(aSource)) {\n return this.sourcesContent[this._sources.indexOf(aSource)];\n }\n\n var url;\n if (this.sourceRoot != null\n && (url = util.urlParse(this.sourceRoot))) {\n // XXX: file:// URIs and absolute paths lead to unexpected behavior for\n // many users. We can help them out when they expect file:// URIs to\n // behave like it would if they were running a local HTTP server. See\n // https://bugzilla.mozilla.org/show_bug.cgi?id=885597.\n var fileUriAbsPath = aSource.replace(/^file:\\/\\//, \"\");\n if (url.scheme == \"file\"\n && this._sources.has(fileUriAbsPath)) {\n return this.sourcesContent[this._sources.indexOf(fileUriAbsPath)]\n }\n\n if ((!url.path || url.path == \"/\")\n && this._sources.has(\"/\" + aSource)) {\n return this.sourcesContent[this._sources.indexOf(\"/\" + aSource)];\n }\n }\n\n // This function is used recursively from\n // IndexedSourceMapConsumer.prototype.sourceContentFor. In that case, we\n // don't want to throw if we can't find the source - we just want to\n // return null, so we provide a flag to exit gracefully.\n if (nullOnMissing) {\n return null;\n }\n else {\n throw new Error('\"' + aSource + '\" is not in the SourceMap.');\n }\n };\n\n/**\n * Returns the generated line and column information for the original source,\n * line, and column positions provided. The only argument is an object with\n * the following properties:\n *\n * - source: The filename of the original source.\n * - line: The line number in the original source.\n * - column: The column number in the original source.\n * - bias: Either 'SourceMapConsumer.GREATEST_LOWER_BOUND' or\n * 'SourceMapConsumer.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n * Defaults to 'SourceMapConsumer.GREATEST_LOWER_BOUND'.\n *\n * and an object is returned with the following properties:\n *\n * - line: The line number in the generated source, or null.\n * - column: The column number in the generated source, or null.\n */\nBasicSourceMapConsumer.prototype.generatedPositionFor =\n function SourceMapConsumer_generatedPositionFor(aArgs) {\n var source = util.getArg(aArgs, 'source');\n if (this.sourceRoot != null) {\n source = util.relative(this.sourceRoot, source);\n }\n if (!this._sources.has(source)) {\n return {\n line: null,\n column: null,\n lastColumn: null\n };\n }\n source = this._sources.indexOf(source);\n\n var needle = {\n source: source,\n originalLine: util.getArg(aArgs, 'line'),\n originalColumn: util.getArg(aArgs, 'column')\n };\n\n var index = this._findMapping(\n needle,\n this._originalMappings,\n \"originalLine\",\n \"originalColumn\",\n util.compareByOriginalPositions,\n util.getArg(aArgs, 'bias', SourceMapConsumer.GREATEST_LOWER_BOUND)\n );\n\n if (index >= 0) {\n var mapping = this._originalMappings[index];\n\n if (mapping.source === needle.source) {\n return {\n line: util.getArg(mapping, 'generatedLine', null),\n column: util.getArg(mapping, 'generatedColumn', null),\n lastColumn: util.getArg(mapping, 'lastGeneratedColumn', null)\n };\n }\n }\n\n return {\n line: null,\n column: null,\n lastColumn: null\n };\n };\n\nexports.BasicSourceMapConsumer = BasicSourceMapConsumer;\n\n/**\n * An IndexedSourceMapConsumer instance represents a parsed source map which\n * we can query for information. It differs from BasicSourceMapConsumer in\n * that it takes \"indexed\" source maps (i.e. ones with a \"sections\" field) as\n * input.\n *\n * The only parameter is a raw source map (either as a JSON string, or already\n * parsed to an object). According to the spec for indexed source maps, they\n * have the following attributes:\n *\n * - version: Which version of the source map spec this map is following.\n * - file: Optional. The generated file this source map is associated with.\n * - sections: A list of section definitions.\n *\n * Each value under the \"sections\" field has two fields:\n * - offset: The offset into the original specified at which this section\n * begins to apply, defined as an object with a \"line\" and \"column\"\n * field.\n * - map: A source map definition. This source map could also be indexed,\n * but doesn't have to be.\n *\n * Instead of the \"map\" field, it's also possible to have a \"url\" field\n * specifying a URL to retrieve a source map from, but that's currently\n * unsupported.\n *\n * Here's an example source map, taken from the source map spec[0], but\n * modified to omit a section which uses the \"url\" field.\n *\n * {\n * version : 3,\n * file: \"app.js\",\n * sections: [{\n * offset: {line:100, column:10},\n * map: {\n * version : 3,\n * file: \"section.js\",\n * sources: [\"foo.js\", \"bar.js\"],\n * names: [\"src\", \"maps\", \"are\", \"fun\"],\n * mappings: \"AAAA,E;;ABCDE;\"\n * }\n * }],\n * }\n *\n * [0]: https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.535es3xeprgt\n */\nfunction IndexedSourceMapConsumer(aSourceMap) {\n var sourceMap = aSourceMap;\n if (typeof aSourceMap === 'string') {\n sourceMap = JSON.parse(aSourceMap.replace(/^\\)\\]\\}'/, ''));\n }\n\n var version = util.getArg(sourceMap, 'version');\n var sections = util.getArg(sourceMap, 'sections');\n\n if (version != this._version) {\n throw new Error('Unsupported version: ' + version);\n }\n\n this._sources = new ArraySet();\n this._names = new ArraySet();\n\n var lastOffset = {\n line: -1,\n column: 0\n };\n this._sections = sections.map(function (s) {\n if (s.url) {\n // The url field will require support for asynchronicity.\n // See https://github.com/mozilla/source-map/issues/16\n throw new Error('Support for url field in sections not implemented.');\n }\n var offset = util.getArg(s, 'offset');\n var offsetLine = util.getArg(offset, 'line');\n var offsetColumn = util.getArg(offset, 'column');\n\n if (offsetLine < lastOffset.line ||\n (offsetLine === lastOffset.line && offsetColumn < lastOffset.column)) {\n throw new Error('Section offsets must be ordered and non-overlapping.');\n }\n lastOffset = offset;\n\n return {\n generatedOffset: {\n // The offset fields are 0-based, but we use 1-based indices when\n // encoding/decoding from VLQ.\n generatedLine: offsetLine + 1,\n generatedColumn: offsetColumn + 1\n },\n consumer: new SourceMapConsumer(util.getArg(s, 'map'))\n }\n });\n}\n\nIndexedSourceMapConsumer.prototype = Object.create(SourceMapConsumer.prototype);\nIndexedSourceMapConsumer.prototype.constructor = SourceMapConsumer;\n\n/**\n * The version of the source mapping spec that we are consuming.\n */\nIndexedSourceMapConsumer.prototype._version = 3;\n\n/**\n * The list of original sources.\n */\nObject.defineProperty(IndexedSourceMapConsumer.prototype, 'sources', {\n get: function () {\n var sources = [];\n for (var i = 0; i < this._sections.length; i++) {\n for (var j = 0; j < this._sections[i].consumer.sources.length; j++) {\n sources.push(this._sections[i].consumer.sources[j]);\n }\n }\n return sources;\n }\n});\n\n/**\n * Returns the original source, line, and column information for the generated\n * source's line and column positions provided. The only argument is an object\n * with the following properties:\n *\n * - line: The line number in the generated source.\n * - column: The column number in the generated source.\n *\n * and an object is returned with the following properties:\n *\n * - source: The original source file, or null.\n * - line: The line number in the original source, or null.\n * - column: The column number in the original source, or null.\n * - name: The original identifier, or null.\n */\nIndexedSourceMapConsumer.prototype.originalPositionFor =\n function IndexedSourceMapConsumer_originalPositionFor(aArgs) {\n var needle = {\n generatedLine: util.getArg(aArgs, 'line'),\n generatedColumn: util.getArg(aArgs, 'column')\n };\n\n // Find the section containing the generated position we're trying to map\n // to an original position.\n var sectionIndex = binarySearch.search(needle, this._sections,\n function(needle, section) {\n var cmp = needle.generatedLine - section.generatedOffset.generatedLine;\n if (cmp) {\n return cmp;\n }\n\n return (needle.generatedColumn -\n section.generatedOffset.generatedColumn);\n });\n var section = this._sections[sectionIndex];\n\n if (!section) {\n return {\n source: null,\n line: null,\n column: null,\n name: null\n };\n }\n\n return section.consumer.originalPositionFor({\n line: needle.generatedLine -\n (section.generatedOffset.generatedLine - 1),\n column: needle.generatedColumn -\n (section.generatedOffset.generatedLine === needle.generatedLine\n ? section.generatedOffset.generatedColumn - 1\n : 0),\n bias: aArgs.bias\n });\n };\n\n/**\n * Return true if we have the source content for every source in the source\n * map, false otherwise.\n */\nIndexedSourceMapConsumer.prototype.hasContentsOfAllSources =\n function IndexedSourceMapConsumer_hasContentsOfAllSources() {\n return this._sections.every(function (s) {\n return s.consumer.hasContentsOfAllSources();\n });\n };\n\n/**\n * Returns the original source content. The only argument is the url of the\n * original source file. Returns null if no original source content is\n * available.\n */\nIndexedSourceMapConsumer.prototype.sourceContentFor =\n function IndexedSourceMapConsumer_sourceContentFor(aSource, nullOnMissing) {\n for (var i = 0; i < this._sections.length; i++) {\n var section = this._sections[i];\n\n var content = section.consumer.sourceContentFor(aSource, true);\n if (content) {\n return content;\n }\n }\n if (nullOnMissing) {\n return null;\n }\n else {\n throw new Error('\"' + aSource + '\" is not in the SourceMap.');\n }\n };\n\n/**\n * Returns the generated line and column information for the original source,\n * line, and column positions provided. The only argument is an object with\n * the following properties:\n *\n * - source: The filename of the original source.\n * - line: The line number in the original source.\n * - column: The column number in the original source.\n *\n * and an object is returned with the following properties:\n *\n * - line: The line number in the generated source, or null.\n * - column: The column number in the generated source, or null.\n */\nIndexedSourceMapConsumer.prototype.generatedPositionFor =\n function IndexedSourceMapConsumer_generatedPositionFor(aArgs) {\n for (var i = 0; i < this._sections.length; i++) {\n var section = this._sections[i];\n\n // Only consider this section if the requested source is in the list of\n // sources of the consumer.\n if (section.consumer.sources.indexOf(util.getArg(aArgs, 'source')) === -1) {\n continue;\n }\n var generatedPosition = section.consumer.generatedPositionFor(aArgs);\n if (generatedPosition) {\n var ret = {\n line: generatedPosition.line +\n (section.generatedOffset.generatedLine - 1),\n column: generatedPosition.column +\n (section.generatedOffset.generatedLine === generatedPosition.line\n ? section.generatedOffset.generatedColumn - 1\n : 0)\n };\n return ret;\n }\n }\n\n return {\n line: null,\n column: null\n };\n };\n\n/**\n * Parse the mappings in a string in to a data structure which we can easily\n * query (the ordered arrays in the `this.__generatedMappings` and\n * `this.__originalMappings` properties).\n */\nIndexedSourceMapConsumer.prototype._parseMappings =\n function IndexedSourceMapConsumer_parseMappings(aStr, aSourceRoot) {\n this.__generatedMappings = [];\n this.__originalMappings = [];\n for (var i = 0; i < this._sections.length; i++) {\n var section = this._sections[i];\n var sectionMappings = section.consumer._generatedMappings;\n for (var j = 0; j < sectionMappings.length; j++) {\n var mapping = sectionMappings[j];\n\n var source = section.consumer._sources.at(mapping.source);\n if (section.consumer.sourceRoot !== null) {\n source = util.join(section.consumer.sourceRoot, source);\n }\n this._sources.add(source);\n source = this._sources.indexOf(source);\n\n var name = section.consumer._names.at(mapping.name);\n this._names.add(name);\n name = this._names.indexOf(name);\n\n // The mappings coming from the consumer for the section have\n // generated positions relative to the start of the section, so we\n // need to offset them to be relative to the start of the concatenated\n // generated file.\n var adjustedMapping = {\n source: source,\n generatedLine: mapping.generatedLine +\n (section.generatedOffset.generatedLine - 1),\n generatedColumn: mapping.generatedColumn +\n (section.generatedOffset.generatedLine === mapping.generatedLine\n ? section.generatedOffset.generatedColumn - 1\n : 0),\n originalLine: mapping.originalLine,\n originalColumn: mapping.originalColumn,\n name: name\n };\n\n this.__generatedMappings.push(adjustedMapping);\n if (typeof adjustedMapping.originalLine === 'number') {\n this.__originalMappings.push(adjustedMapping);\n }\n }\n }\n\n quickSort(this.__generatedMappings, util.compareByGeneratedPositionsDeflated);\n quickSort(this.__originalMappings, util.compareByOriginalPositions);\n };\n\nexports.IndexedSourceMapConsumer = IndexedSourceMapConsumer;\n\n\n/***/ }),\n/* 25 */\n/***/ (function(module, exports) {\n\n/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nexports.GREATEST_LOWER_BOUND = 1;\nexports.LEAST_UPPER_BOUND = 2;\n\n/**\n * Recursive implementation of binary search.\n *\n * @param aLow Indices here and lower do not contain the needle.\n * @param aHigh Indices here and higher do not contain the needle.\n * @param aNeedle The element being searched for.\n * @param aHaystack The non-empty array being searched.\n * @param aCompare Function which takes two elements and returns -1, 0, or 1.\n * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n */\nfunction recursiveSearch(aLow, aHigh, aNeedle, aHaystack, aCompare, aBias) {\n // This function terminates when one of the following is true:\n //\n // 1. We find the exact element we are looking for.\n //\n // 2. We did not find the exact element, but we can return the index of\n // the next-closest element.\n //\n // 3. We did not find the exact element, and there is no next-closest\n // element than the one we are searching for, so we return -1.\n var mid = Math.floor((aHigh - aLow) / 2) + aLow;\n var cmp = aCompare(aNeedle, aHaystack[mid], true);\n if (cmp === 0) {\n // Found the element we are looking for.\n return mid;\n }\n else if (cmp > 0) {\n // Our needle is greater than aHaystack[mid].\n if (aHigh - mid > 1) {\n // The element is in the upper half.\n return recursiveSearch(mid, aHigh, aNeedle, aHaystack, aCompare, aBias);\n }\n\n // The exact needle element was not found in this haystack. Determine if\n // we are in termination case (3) or (2) and return the appropriate thing.\n if (aBias == exports.LEAST_UPPER_BOUND) {\n return aHigh < aHaystack.length ? aHigh : -1;\n } else {\n return mid;\n }\n }\n else {\n // Our needle is less than aHaystack[mid].\n if (mid - aLow > 1) {\n // The element is in the lower half.\n return recursiveSearch(aLow, mid, aNeedle, aHaystack, aCompare, aBias);\n }\n\n // we are in termination case (3) or (2) and return the appropriate thing.\n if (aBias == exports.LEAST_UPPER_BOUND) {\n return mid;\n } else {\n return aLow < 0 ? -1 : aLow;\n }\n }\n}\n\n/**\n * This is an implementation of binary search which will always try and return\n * the index of the closest element if there is no exact hit. This is because\n * mappings between original and generated line/col pairs are single points,\n * and there is an implicit region between each of them, so a miss just means\n * that you aren't on the very start of a region.\n *\n * @param aNeedle The element you are looking for.\n * @param aHaystack The array that is being searched.\n * @param aCompare A function which takes the needle and an element in the\n * array and returns -1, 0, or 1 depending on whether the needle is less\n * than, equal to, or greater than the element, respectively.\n * @param aBias Either 'binarySearch.GREATEST_LOWER_BOUND' or\n * 'binarySearch.LEAST_UPPER_BOUND'. Specifies whether to return the\n * closest element that is smaller than or greater than the one we are\n * searching for, respectively, if the exact element cannot be found.\n * Defaults to 'binarySearch.GREATEST_LOWER_BOUND'.\n */\nexports.search = function search(aNeedle, aHaystack, aCompare, aBias) {\n if (aHaystack.length === 0) {\n return -1;\n }\n\n var index = recursiveSearch(-1, aHaystack.length, aNeedle, aHaystack,\n aCompare, aBias || exports.GREATEST_LOWER_BOUND);\n if (index < 0) {\n return -1;\n }\n\n // We have found either the exact element, or the next-closest element than\n // the one we are searching for. However, there may be more than one such\n // element. Make sure we always return the smallest of these.\n while (index - 1 >= 0) {\n if (aCompare(aHaystack[index], aHaystack[index - 1], true) !== 0) {\n break;\n }\n --index;\n }\n\n return index;\n};\n\n\n/***/ }),\n/* 26 */\n/***/ (function(module, exports) {\n\n/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\n// It turns out that some (most?) JavaScript engines don't self-host\n// `Array.prototype.sort`. This makes sense because C++ will likely remain\n// faster than JS when doing raw CPU-intensive sorting. However, when using a\n// custom comparator function, calling back and forth between the VM's C++ and\n// JIT'd JS is rather slow *and* loses JIT type information, resulting in\n// worse generated code for the comparator function than would be optimal. In\n// fact, when sorting with a comparator, these costs outweigh the benefits of\n// sorting in C++. By using our own JS-implemented Quick Sort (below), we get\n// a ~3500ms mean speed-up in `bench/bench.html`.\n\n/**\n * Swap the elements indexed by `x` and `y` in the array `ary`.\n *\n * @param {Array} ary\n * The array.\n * @param {Number} x\n * The index of the first item.\n * @param {Number} y\n * The index of the second item.\n */\nfunction swap(ary, x, y) {\n var temp = ary[x];\n ary[x] = ary[y];\n ary[y] = temp;\n}\n\n/**\n * Returns a random integer within the range `low .. high` inclusive.\n *\n * @param {Number} low\n * The lower bound on the range.\n * @param {Number} high\n * The upper bound on the range.\n */\nfunction randomIntInRange(low, high) {\n return Math.round(low + (Math.random() * (high - low)));\n}\n\n/**\n * The Quick Sort algorithm.\n *\n * @param {Array} ary\n * An array to sort.\n * @param {function} comparator\n * Function to use to compare two items.\n * @param {Number} p\n * Start index of the array\n * @param {Number} r\n * End index of the array\n */\nfunction doQuickSort(ary, comparator, p, r) {\n // If our lower bound is less than our upper bound, we (1) partition the\n // array into two pieces and (2) recurse on each half. If it is not, this is\n // the empty array and our base case.\n\n if (p < r) {\n // (1) Partitioning.\n //\n // The partitioning chooses a pivot between `p` and `r` and moves all\n // elements that are less than or equal to the pivot to the before it, and\n // all the elements that are greater than it after it. The effect is that\n // once partition is done, the pivot is in the exact place it will be when\n // the array is put in sorted order, and it will not need to be moved\n // again. This runs in O(n) time.\n\n // Always choose a random pivot so that an input array which is reverse\n // sorted does not cause O(n^2) running time.\n var pivotIndex = randomIntInRange(p, r);\n var i = p - 1;\n\n swap(ary, pivotIndex, r);\n var pivot = ary[r];\n\n // Immediately after `j` is incremented in this loop, the following hold\n // true:\n //\n // * Every element in `ary[p .. i]` is less than or equal to the pivot.\n //\n // * Every element in `ary[i+1 .. j-1]` is greater than the pivot.\n for (var j = p; j < r; j++) {\n if (comparator(ary[j], pivot) <= 0) {\n i += 1;\n swap(ary, i, j);\n }\n }\n\n swap(ary, i + 1, j);\n var q = i + 1;\n\n // (2) Recurse on each half.\n\n doQuickSort(ary, comparator, p, q - 1);\n doQuickSort(ary, comparator, q + 1, r);\n }\n}\n\n/**\n * Sort the given array in-place with the given comparator function.\n *\n * @param {Array} ary\n * An array to sort.\n * @param {function} comparator\n * Function to use to compare two items.\n */\nexports.quickSort = function (ary, comparator) {\n doQuickSort(ary, comparator, 0, ary.length - 1);\n};\n\n\n/***/ }),\n/* 27 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* -*- Mode: js; js-indent-level: 2; -*- */\n/*\n * Copyright 2011 Mozilla Foundation and contributors\n * Licensed under the New BSD license. See LICENSE or:\n * http://opensource.org/licenses/BSD-3-Clause\n */\n\nvar SourceMapGenerator = __webpack_require__(5).SourceMapGenerator;\nvar util = __webpack_require__(0);\n\n// Matches a Windows-style `\\r\\n` newline or a `\\n` newline used by all other\n// operating systems these days (capturing the result).\nvar REGEX_NEWLINE = /(\\r?\\n)/;\n\n// Newline character code for charCodeAt() comparisons\nvar NEWLINE_CODE = 10;\n\n// Private symbol for identifying `SourceNode`s when multiple versions of\n// the source-map library are loaded. This MUST NOT CHANGE across\n// versions!\nvar isSourceNode = \"$$$isSourceNode$$$\";\n\n/**\n * SourceNodes provide a way to abstract over interpolating/concatenating\n * snippets of generated JavaScript source code while maintaining the line and\n * column information associated with the original source code.\n *\n * @param aLine The original line number.\n * @param aColumn The original column number.\n * @param aSource The original source's filename.\n * @param aChunks Optional. An array of strings which are snippets of\n * generated JS, or other SourceNodes.\n * @param aName The original identifier.\n */\nfunction SourceNode(aLine, aColumn, aSource, aChunks, aName) {\n this.children = [];\n this.sourceContents = {};\n this.line = aLine == null ? null : aLine;\n this.column = aColumn == null ? null : aColumn;\n this.source = aSource == null ? null : aSource;\n this.name = aName == null ? null : aName;\n this[isSourceNode] = true;\n if (aChunks != null) this.add(aChunks);\n}\n\n/**\n * Creates a SourceNode from generated code and a SourceMapConsumer.\n *\n * @param aGeneratedCode The generated code\n * @param aSourceMapConsumer The SourceMap for the generated code\n * @param aRelativePath Optional. The path that relative sources in the\n * SourceMapConsumer should be relative to.\n */\nSourceNode.fromStringWithSourceMap =\n function SourceNode_fromStringWithSourceMap(aGeneratedCode, aSourceMapConsumer, aRelativePath) {\n // The SourceNode we want to fill with the generated code\n // and the SourceMap\n var node = new SourceNode();\n\n // All even indices of this array are one line of the generated code,\n // while all odd indices are the newlines between two adjacent lines\n // (since `REGEX_NEWLINE` captures its match).\n // Processed fragments are removed from this array, by calling `shiftNextLine`.\n var remainingLines = aGeneratedCode.split(REGEX_NEWLINE);\n var shiftNextLine = function() {\n var lineContents = remainingLines.shift();\n // The last line of a file might not have a newline.\n var newLine = remainingLines.shift() || \"\";\n return lineContents + newLine;\n };\n\n // We need to remember the position of \"remainingLines\"\n var lastGeneratedLine = 1, lastGeneratedColumn = 0;\n\n // The generate SourceNodes we need a code range.\n // To extract it current and last mapping is used.\n // Here we store the last mapping.\n var lastMapping = null;\n\n aSourceMapConsumer.eachMapping(function (mapping) {\n if (lastMapping !== null) {\n // We add the code from \"lastMapping\" to \"mapping\":\n // First check if there is a new line in between.\n if (lastGeneratedLine < mapping.generatedLine) {\n // Associate first line with \"lastMapping\"\n addMappingWithCode(lastMapping, shiftNextLine());\n lastGeneratedLine++;\n lastGeneratedColumn = 0;\n // The remaining code is added without mapping\n } else {\n // There is no new line in between.\n // Associate the code between \"lastGeneratedColumn\" and\n // \"mapping.generatedColumn\" with \"lastMapping\"\n var nextLine = remainingLines[0];\n var code = nextLine.substr(0, mapping.generatedColumn -\n lastGeneratedColumn);\n remainingLines[0] = nextLine.substr(mapping.generatedColumn -\n lastGeneratedColumn);\n lastGeneratedColumn = mapping.generatedColumn;\n addMappingWithCode(lastMapping, code);\n // No more remaining code, continue\n lastMapping = mapping;\n return;\n }\n }\n // We add the generated code until the first mapping\n // to the SourceNode without any mapping.\n // Each line is added as separate string.\n while (lastGeneratedLine < mapping.generatedLine) {\n node.add(shiftNextLine());\n lastGeneratedLine++;\n }\n if (lastGeneratedColumn < mapping.generatedColumn) {\n var nextLine = remainingLines[0];\n node.add(nextLine.substr(0, mapping.generatedColumn));\n remainingLines[0] = nextLine.substr(mapping.generatedColumn);\n lastGeneratedColumn = mapping.generatedColumn;\n }\n lastMapping = mapping;\n }, this);\n // We have processed all mappings.\n if (remainingLines.length > 0) {\n if (lastMapping) {\n // Associate the remaining code in the current line with \"lastMapping\"\n addMappingWithCode(lastMapping, shiftNextLine());\n }\n // and add the remaining lines without any mapping\n node.add(remainingLines.join(\"\"));\n }\n\n // Copy sourcesContent into SourceNode\n aSourceMapConsumer.sources.forEach(function (sourceFile) {\n var content = aSourceMapConsumer.sourceContentFor(sourceFile);\n if (content != null) {\n if (aRelativePath != null) {\n sourceFile = util.join(aRelativePath, sourceFile);\n }\n node.setSourceContent(sourceFile, content);\n }\n });\n\n return node;\n\n function addMappingWithCode(mapping, code) {\n if (mapping === null || mapping.source === undefined) {\n node.add(code);\n } else {\n var source = aRelativePath\n ? util.join(aRelativePath, mapping.source)\n : mapping.source;\n node.add(new SourceNode(mapping.originalLine,\n mapping.originalColumn,\n source,\n code,\n mapping.name));\n }\n }\n };\n\n/**\n * Add a chunk of generated JS to this source node.\n *\n * @param aChunk A string snippet of generated JS code, another instance of\n * SourceNode, or an array where each member is one of those things.\n */\nSourceNode.prototype.add = function SourceNode_add(aChunk) {\n if (Array.isArray(aChunk)) {\n aChunk.forEach(function (chunk) {\n this.add(chunk);\n }, this);\n }\n else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n if (aChunk) {\n this.children.push(aChunk);\n }\n }\n else {\n throw new TypeError(\n \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n );\n }\n return this;\n};\n\n/**\n * Add a chunk of generated JS to the beginning of this source node.\n *\n * @param aChunk A string snippet of generated JS code, another instance of\n * SourceNode, or an array where each member is one of those things.\n */\nSourceNode.prototype.prepend = function SourceNode_prepend(aChunk) {\n if (Array.isArray(aChunk)) {\n for (var i = aChunk.length-1; i >= 0; i--) {\n this.prepend(aChunk[i]);\n }\n }\n else if (aChunk[isSourceNode] || typeof aChunk === \"string\") {\n this.children.unshift(aChunk);\n }\n else {\n throw new TypeError(\n \"Expected a SourceNode, string, or an array of SourceNodes and strings. Got \" + aChunk\n );\n }\n return this;\n};\n\n/**\n * Walk over the tree of JS snippets in this node and its children. The\n * walking function is called once for each snippet of JS and is passed that\n * snippet and the its original associated source's line/column location.\n *\n * @param aFn The traversal function.\n */\nSourceNode.prototype.walk = function SourceNode_walk(aFn) {\n var chunk;\n for (var i = 0, len = this.children.length; i < len; i++) {\n chunk = this.children[i];\n if (chunk[isSourceNode]) {\n chunk.walk(aFn);\n }\n else {\n if (chunk !== '') {\n aFn(chunk, { source: this.source,\n line: this.line,\n column: this.column,\n name: this.name });\n }\n }\n }\n};\n\n/**\n * Like `String.prototype.join` except for SourceNodes. Inserts `aStr` between\n * each of `this.children`.\n *\n * @param aSep The separator.\n */\nSourceNode.prototype.join = function SourceNode_join(aSep) {\n var newChildren;\n var i;\n var len = this.children.length;\n if (len > 0) {\n newChildren = [];\n for (i = 0; i < len-1; i++) {\n newChildren.push(this.children[i]);\n newChildren.push(aSep);\n }\n newChildren.push(this.children[i]);\n this.children = newChildren;\n }\n return this;\n};\n\n/**\n * Call String.prototype.replace on the very right-most source snippet. Useful\n * for trimming whitespace from the end of a source node, etc.\n *\n * @param aPattern The pattern to replace.\n * @param aReplacement The thing to replace the pattern with.\n */\nSourceNode.prototype.replaceRight = function SourceNode_replaceRight(aPattern, aReplacement) {\n var lastChild = this.children[this.children.length - 1];\n if (lastChild[isSourceNode]) {\n lastChild.replaceRight(aPattern, aReplacement);\n }\n else if (typeof lastChild === 'string') {\n this.children[this.children.length - 1] = lastChild.replace(aPattern, aReplacement);\n }\n else {\n this.children.push(''.replace(aPattern, aReplacement));\n }\n return this;\n};\n\n/**\n * Set the source content for a source file. This will be added to the SourceMapGenerator\n * in the sourcesContent field.\n *\n * @param aSourceFile The filename of the source file\n * @param aSourceContent The content of the source file\n */\nSourceNode.prototype.setSourceContent =\n function SourceNode_setSourceContent(aSourceFile, aSourceContent) {\n this.sourceContents[util.toSetString(aSourceFile)] = aSourceContent;\n };\n\n/**\n * Walk over the tree of SourceNodes. The walking function is called for each\n * source file content and is passed the filename and source content.\n *\n * @param aFn The traversal function.\n */\nSourceNode.prototype.walkSourceContents =\n function SourceNode_walkSourceContents(aFn) {\n for (var i = 0, len = this.children.length; i < len; i++) {\n if (this.children[i][isSourceNode]) {\n this.children[i].walkSourceContents(aFn);\n }\n }\n\n var sources = Object.keys(this.sourceContents);\n for (var i = 0, len = sources.length; i < len; i++) {\n aFn(util.fromSetString(sources[i]), this.sourceContents[sources[i]]);\n }\n };\n\n/**\n * Return the string representation of this source node. Walks over the tree\n * and concatenates all the various snippets together to one string.\n */\nSourceNode.prototype.toString = function SourceNode_toString() {\n var str = \"\";\n this.walk(function (chunk) {\n str += chunk;\n });\n return str;\n};\n\n/**\n * Returns the string representation of this source node along with a source\n * map.\n */\nSourceNode.prototype.toStringWithSourceMap = function SourceNode_toStringWithSourceMap(aArgs) {\n var generated = {\n code: \"\",\n line: 1,\n column: 0\n };\n var map = new SourceMapGenerator(aArgs);\n var sourceMappingActive = false;\n var lastOriginalSource = null;\n var lastOriginalLine = null;\n var lastOriginalColumn = null;\n var lastOriginalName = null;\n this.walk(function (chunk, original) {\n generated.code += chunk;\n if (original.source !== null\n && original.line !== null\n && original.column !== null) {\n if(lastOriginalSource !== original.source\n || lastOriginalLine !== original.line\n || lastOriginalColumn !== original.column\n || lastOriginalName !== original.name) {\n map.addMapping({\n source: original.source,\n original: {\n line: original.line,\n column: original.column\n },\n generated: {\n line: generated.line,\n column: generated.column\n },\n name: original.name\n });\n }\n lastOriginalSource = original.source;\n lastOriginalLine = original.line;\n lastOriginalColumn = original.column;\n lastOriginalName = original.name;\n sourceMappingActive = true;\n } else if (sourceMappingActive) {\n map.addMapping({\n generated: {\n line: generated.line,\n column: generated.column\n }\n });\n lastOriginalSource = null;\n sourceMappingActive = false;\n }\n for (var idx = 0, length = chunk.length; idx < length; idx++) {\n if (chunk.charCodeAt(idx) === NEWLINE_CODE) {\n generated.line++;\n generated.column = 0;\n // Mappings end at eol\n if (idx + 1 === length) {\n lastOriginalSource = null;\n sourceMappingActive = false;\n } else if (sourceMappingActive) {\n map.addMapping({\n source: original.source,\n original: {\n line: original.line,\n column: original.column\n },\n generated: {\n line: generated.line,\n column: generated.column\n },\n name: original.name\n });\n }\n } else {\n generated.column++;\n }\n }\n });\n this.walkSourceContents(function (sourceFile, sourceContent) {\n map.setSourceContent(sourceFile, sourceContent);\n });\n\n return { code: generated.code, map: map };\n};\n\nexports.SourceNode = SourceNode;\n\n\n/***/ }),\n/* 28 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nfunction settle(val) {\n if (!Array.isArray(val)) val = [val];\n return Promise.all(val.map(function (p) {\n return p.then(function (value) {\n return {\n isFulfilled: true,\n isRejected: false,\n value: value\n };\n }).catch(function (reason) {\n return {\n isFulfilled: false,\n isRejected: true,\n reason: reason\n };\n });\n }));\n}\n\nexports.settle = settle;\nexports.default = settle;\n\n/***/ }),\n/* 29 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return unmap; });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator__ = __webpack_require__(2);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__stack_frame__ = __webpack_require__(1);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__getSourceMap__ = __webpack_require__(4);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__getLinesAround__ = __webpack_require__(8);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_path__ = __webpack_require__(30);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_path___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_path__);\n\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\n/**\n * Turns a set of mapped <code>StackFrame</code>s back into their generated code position and enhances them with code.\n * @param {string} fileUri The URI of the <code>bundle.js</code> file.\n * @param {StackFrame[]} frames A set of <code>StackFrame</code>s which are already mapped and missing their generated positions.\n * @param {number} [fileContents=3] The number of lines to provide before and after the line specified in the <code>StackFrame</code>.\n */\nvar unmap = function () {\n var _ref = _asyncToGenerator( /*#__PURE__*/__WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.mark(function _callee(_fileUri, frames) {\n var contextLines = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 3;\n var fileContents, fileUri, map;\n return __WEBPACK_IMPORTED_MODULE_0_babel_runtime_regenerator___default.a.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n fileContents = (typeof _fileUri === 'undefined' ? 'undefined' : _typeof(_fileUri)) === 'object' ? _fileUri.contents : null;\n fileUri = (typeof _fileUri === 'undefined' ? 'undefined' : _typeof(_fileUri)) === 'object' ? _fileUri.uri : _fileUri;\n\n if (!(fileContents == null)) {\n _context.next = 6;\n break;\n }\n\n _context.next = 5;\n return fetch(fileUri).then(function (res) {\n return res.text();\n });\n\n case 5:\n fileContents = _context.sent;\n\n case 6:\n _context.next = 8;\n return Object(__WEBPACK_IMPORTED_MODULE_2__getSourceMap__[\"a\" /* getSourceMap */])(fileUri, fileContents);\n\n case 8:\n map = _context.sent;\n return _context.abrupt('return', frames.map(function (frame) {\n var functionName = frame.functionName,\n lineNumber = frame.lineNumber,\n columnNumber = frame.columnNumber,\n _originalLineNumber = frame._originalLineNumber;\n\n if (_originalLineNumber != null) {\n return frame;\n }\n var fileName = frame.fileName;\n\n if (fileName) {\n // The web version of this module only provides POSIX support, so Windows\n // paths like C:\\foo\\\\baz\\..\\\\bar\\ cannot be normalized.\n // A simple solution to this is to replace all `\\` with `/`, then\n // normalize afterwards.\n fileName = __WEBPACK_IMPORTED_MODULE_4_path___default.a.normalize(fileName.replace(/[\\\\]+/g, '/'));\n }\n if (fileName == null) {\n return frame;\n }\n var fN = fileName;\n var source = map.getSources()\n // Prepare path for normalization; see comment above for reasoning.\n .map(function (s) {\n return s.replace(/[\\\\]+/g, '/');\n }).filter(function (p) {\n p = __WEBPACK_IMPORTED_MODULE_4_path___default.a.normalize(p);\n var i = p.lastIndexOf(fN);\n return i !== -1 && i === p.length - fN.length;\n }).map(function (p) {\n return {\n token: p,\n seps: count(__WEBPACK_IMPORTED_MODULE_4_path___default.a.sep, __WEBPACK_IMPORTED_MODULE_4_path___default.a.normalize(p)),\n penalties: count('node_modules', p) + count('~', p)\n };\n }).sort(function (a, b) {\n var s = Math.sign(a.seps - b.seps);\n if (s !== 0) {\n return s;\n }\n return Math.sign(a.penalties - b.penalties);\n });\n if (source.length < 1 || lineNumber == null) {\n return new __WEBPACK_IMPORTED_MODULE_1__stack_frame__[\"b\" /* default */](null, null, null, null, null, functionName, fN, lineNumber, columnNumber, null);\n }\n var sourceT = source[0].token;\n\n var _map$getGeneratedPosi = map.getGeneratedPosition(sourceT, lineNumber,\n // $FlowFixMe\n columnNumber),\n line = _map$getGeneratedPosi.line,\n column = _map$getGeneratedPosi.column;\n\n var originalSource = map.getSource(sourceT);\n return new __WEBPACK_IMPORTED_MODULE_1__stack_frame__[\"b\" /* default */](functionName, fileUri, line, column || null, Object(__WEBPACK_IMPORTED_MODULE_3__getLinesAround__[\"a\" /* getLinesAround */])(line, contextLines, fileContents || []), functionName, fN, lineNumber, columnNumber, Object(__WEBPACK_IMPORTED_MODULE_3__getLinesAround__[\"a\" /* getLinesAround */])(lineNumber, contextLines, originalSource));\n }));\n\n case 10:\n case 'end':\n return _context.stop();\n }\n }\n }, _callee, this);\n }));\n\n return function unmap(_x2, _x3) {\n return _ref.apply(this, arguments);\n };\n}();\n\nfunction _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step(\"next\", value); }, function (err) { step(\"throw\", err); }); } } return step(\"next\"); }); }; }\n\n/**\n * Copyright (c) 2015-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\n\n\n\n\nfunction count(search, string) {\n // Count starts at -1 becuse a do-while loop always runs at least once\n var count = -1,\n index = -1;\n do {\n // First call or the while case evaluated true, meaning we have to make\n // count 0 or we found a character\n ++count;\n // Find the index of our search string, starting after the previous index\n index = string.indexOf(search, index + 1);\n } while (index !== -1);\n return count;\n}\n\n\n/* unused harmony default export */ var _unused_webpack_default_export = (unmap);\n\n/***/ }),\n/* 30 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(process) {// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n// resolves . and .. elements in a path array with directory names there\n// must be no slashes, empty elements, or device names (c:\\) in the array\n// (so also no leading and trailing slashes - it does not distinguish\n// relative and absolute paths)\nfunction normalizeArray(parts, allowAboveRoot) {\n // if the path tries to go above the root, `up` ends up > 0\n var up = 0;\n for (var i = parts.length - 1; i >= 0; i--) {\n var last = parts[i];\n if (last === '.') {\n parts.splice(i, 1);\n } else if (last === '..') {\n parts.splice(i, 1);\n up++;\n } else if (up) {\n parts.splice(i, 1);\n up--;\n }\n }\n\n // if the path is allowed to go above the root, restore leading ..s\n if (allowAboveRoot) {\n for (; up--; up) {\n parts.unshift('..');\n }\n }\n\n return parts;\n}\n\n// Split a filename into [root, dir, basename, ext], unix version\n// 'root' is just a slash, or nothing.\nvar splitPathRe =\n /^(\\/?|)([\\s\\S]*?)((?:\\.{1,2}|[^\\/]+?|)(\\.[^.\\/]*|))(?:[\\/]*)$/;\nvar splitPath = function(filename) {\n return splitPathRe.exec(filename).slice(1);\n};\n\n// path.resolve([from ...], to)\n// posix version\nexports.resolve = function() {\n var resolvedPath = '',\n resolvedAbsolute = false;\n\n for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n var path = (i >= 0) ? arguments[i] : process.cwd();\n\n // Skip empty and invalid entries\n if (typeof path !== 'string') {\n throw new TypeError('Arguments to path.resolve must be strings');\n } else if (!path) {\n continue;\n }\n\n resolvedPath = path + '/' + resolvedPath;\n resolvedAbsolute = path.charAt(0) === '/';\n }\n\n // At this point the path should be resolved to a full absolute path, but\n // handle relative paths to be safe (might happen when process.cwd() fails)\n\n // Normalize the path\n resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {\n return !!p;\n }), !resolvedAbsolute).join('/');\n\n return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';\n};\n\n// path.normalize(path)\n// posix version\nexports.normalize = function(path) {\n var isAbsolute = exports.isAbsolute(path),\n trailingSlash = substr(path, -1) === '/';\n\n // Normalize the path\n path = normalizeArray(filter(path.split('/'), function(p) {\n return !!p;\n }), !isAbsolute).join('/');\n\n if (!path && !isAbsolute) {\n path = '.';\n }\n if (path && trailingSlash) {\n path += '/';\n }\n\n return (isAbsolute ? '/' : '') + path;\n};\n\n// posix version\nexports.isAbsolute = function(path) {\n return path.charAt(0) === '/';\n};\n\n// posix version\nexports.join = function() {\n var paths = Array.prototype.slice.call(arguments, 0);\n return exports.normalize(filter(paths, function(p, index) {\n if (typeof p !== 'string') {\n throw new TypeError('Arguments to path.join must be strings');\n }\n return p;\n }).join('/'));\n};\n\n\n// path.relative(from, to)\n// posix version\nexports.relative = function(from, to) {\n from = exports.resolve(from).substr(1);\n to = exports.resolve(to).substr(1);\n\n function trim(arr) {\n var start = 0;\n for (; start < arr.length; start++) {\n if (arr[start] !== '') break;\n }\n\n var end = arr.length - 1;\n for (; end >= 0; end--) {\n if (arr[end] !== '') break;\n }\n\n if (start > end) return [];\n return arr.slice(start, end - start + 1);\n }\n\n var fromParts = trim(from.split('/'));\n var toParts = trim(to.split('/'));\n\n var length = Math.min(fromParts.length, toParts.length);\n var samePartsLength = length;\n for (var i = 0; i < length; i++) {\n if (fromParts[i] !== toParts[i]) {\n samePartsLength = i;\n break;\n }\n }\n\n var outputParts = [];\n for (var i = samePartsLength; i < fromParts.length; i++) {\n outputParts.push('..');\n }\n\n outputParts = outputParts.concat(toParts.slice(samePartsLength));\n\n return outputParts.join('/');\n};\n\nexports.sep = '/';\nexports.delimiter = ':';\n\nexports.dirname = function(path) {\n var result = splitPath(path),\n root = result[0],\n dir = result[1];\n\n if (!root && !dir) {\n // No dirname whatsoever\n return '.';\n }\n\n if (dir) {\n // It has a dirname, strip trailing slash\n dir = dir.substr(0, dir.length - 1);\n }\n\n return root + dir;\n};\n\n\nexports.basename = function(path, ext) {\n var f = splitPath(path)[2];\n // TODO: make this comparison case-insensitive on windows?\n if (ext && f.substr(-1 * ext.length) === ext) {\n f = f.substr(0, f.length - ext.length);\n }\n return f;\n};\n\n\nexports.extname = function(path) {\n return splitPath(path)[3];\n};\n\nfunction filter (xs, f) {\n if (xs.filter) return xs.filter(f);\n var res = [];\n for (var i = 0; i < xs.length; i++) {\n if (f(xs[i], i, xs)) res.push(xs[i]);\n }\n return res;\n}\n\n// String.prototype.substr - negative index don't work in IE8\nvar substr = 'ab'.substr(-1) === 'b'\n ? function (str, start, len) { return str.substr(start, len) }\n : function (str, start, len) {\n if (start < 0) start = str.length + start;\n return str.substr(start, len);\n }\n;\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(3)))\n\n/***/ }),\n/* 31 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return iframeStyle; });\n/* unused harmony export overlayStyle */\n/* unused harmony export primaryErrorStyle */\n/* unused harmony export secondaryErrorStyle */\n/* unused harmony export black */\n/* unused harmony export darkGray */\n/* unused harmony export red */\n/* unused harmony export redTransparent */\n/* unused harmony export yellowTransparent */\n/**\n * Copyright (c) 2015-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar black = '#293238',\n darkGray = '#878e91',\n red = '#ce1126',\n redTransparent = 'rgba(206, 17, 38, 0.05)',\n lightRed = '#fccfcf',\n yellow = '#fbf5b4',\n yellowTransparent = 'rgba(251, 245, 180, 0.3)',\n white = '#ffffff';\n\nvar iframeStyle = {\n position: 'fixed',\n top: '0',\n left: '0',\n width: '100%',\n height: '100%',\n border: 'none',\n 'z-index': 2147483647\n};\n\nvar overlayStyle = {\n width: '100%',\n height: '100%',\n 'box-sizing': 'border-box',\n 'text-align': 'center',\n 'background-color': white\n};\n\nvar primaryErrorStyle = {\n 'background-color': lightRed\n};\n\nvar secondaryErrorStyle = {\n 'background-color': yellow\n};\n\n\n\n/***/ }),\n/* 32 */\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n/* unused harmony export getHead */\n/* unused harmony export injectCss */\n/* unused harmony export removeCss */\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"a\", function() { return applyStyles; });\n/**\n * Copyright (c) 2015-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar injectedCount = 0;\nvar injectedCache = {};\n\nfunction getHead(document) {\n return document.head || document.getElementsByTagName('head')[0];\n}\n\nfunction injectCss(document, css) {\n var head = getHead(document);\n var style = document.createElement('style');\n style.type = 'text/css';\n style.appendChild(document.createTextNode(css));\n head.appendChild(style);\n\n injectedCache[++injectedCount] = style;\n return injectedCount;\n}\n\nfunction removeCss(document, ref) {\n if (injectedCache[ref] == null) {\n return;\n }\n var head = getHead(document);\n head.removeChild(injectedCache[ref]);\n delete injectedCache[ref];\n}\n\nfunction applyStyles(element, styles) {\n element.setAttribute('style', '');\n for (var key in styles) {\n if (!styles.hasOwnProperty(key)) {\n continue;\n }\n // $FlowFixMe\n element.style[key] = styles[key];\n }\n}\n\n\n\n/***/ }),\n/* 33 */\n/***/ (function(module, exports) {\n\nmodule.exports = \"!function(e){function t(r){if(n[r])return n[r].exports;var u=n[r]={i:r,l:!1,exports:{}};return e[r].call(u.exports,u,u.exports,t),u.l=!0,u.exports}var n={};t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,\\\"a\\\",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p=\\\"\\\",t(t.s=18)}([function(e,t,n){\\\"use strict\\\";e.exports=n(24)},function(e,t,n){\\\"use strict\\\";n.d(t,\\\"c\\\",function(){return l}),n.d(t,\\\"d\\\",function(){return s}),n.d(t,\\\"g\\\",function(){return c}),n.d(t,\\\"a\\\",function(){return r}),n.d(t,\\\"b\\\",function(){return u}),n.d(t,\\\"e\\\",function(){return o}),n.d(t,\\\"f\\\",function(){return a}),n.d(t,\\\"h\\\",function(){return i});var r=\\\"#293238\\\",u=\\\"#878e91\\\",o=\\\"#ce1126\\\",a=\\\"rgba(206, 17, 38, 0.05)\\\",i=\\\"rgba(251, 245, 180, 0.3)\\\",l={width:\\\"100%\\\",height:\\\"100%\\\",\\\"box-sizing\\\":\\\"border-box\\\",\\\"text-align\\\":\\\"center\\\",\\\"background-color\\\":\\\"#ffffff\\\"},s={\\\"background-color\\\":\\\"#fccfcf\\\"},c={\\\"background-color\\\":\\\"#fbf5b4\\\"}},function(e,t,n){\\\"use strict\\\";function r(e){if(null===e||void 0===e)throw new TypeError(\\\"Object.assign cannot be called with null or undefined\\\");return Object(e)}var u=Object.getOwnPropertySymbols,o=Object.prototype.hasOwnProperty,a=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var e=new String(\\\"abc\\\");if(e[5]=\\\"de\\\",\\\"5\\\"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t[\\\"_\\\"+String.fromCharCode(n)]=n;if(\\\"0123456789\\\"!==Object.getOwnPropertyNames(t).map(function(e){return t[e]}).join(\\\"\\\"))return!1;var r={};return\\\"abcdefghijklmnopqrst\\\".split(\\\"\\\").forEach(function(e){r[e]=e}),\\\"abcdefghijklmnopqrst\\\"===Object.keys(Object.assign({},r)).join(\\\"\\\")}catch(e){return!1}}()?Object.assign:function(e,t){for(var n,i,l=r(e),s=1;s<arguments.length;s++){n=Object(arguments[s]);for(var c in n)o.call(n,c)&&(l[c]=n[c]);if(u){i=u(n);for(var p=0;p<i.length;p++)a.call(n,i[p])&&(l[i[p]]=n[i[p]])}}return l}},function(e,t,n){\\\"use strict\\\";function r(e){return function(){return e}}var u=function(){};u.thatReturns=r,u.thatReturnsFalse=r(!1),u.thatReturnsTrue=r(!0),u.thatReturnsNull=r(null),u.thatReturnsThis=function(){return this},u.thatReturnsArgument=function(e){return e},e.exports=u},function(e,t,n){\\\"use strict\\\";function r(){}function u(e){try{return e.then}catch(e){return m=e,C}}function o(e,t){try{return e(t)}catch(e){return m=e,C}}function a(e,t,n){try{e(t,n)}catch(e){return m=e,C}}function i(e){if(\\\"object\\\"!==typeof this)throw new TypeError(\\\"Promises must be constructed via new\\\");if(\\\"function\\\"!==typeof e)throw new TypeError(\\\"Promise constructor's argument is not a function\\\");this._75=0,this._83=0,this._18=null,this._38=null,e!==r&&h(e,this)}function l(e,t,n){return new e.constructor(function(u,o){var a=new i(r);a.then(u,o),s(e,new D(t,n,a))})}function s(e,t){for(;3===e._83;)e=e._18;if(i._47&&i._47(e),0===e._83)return 0===e._75?(e._75=1,void(e._38=t)):1===e._75?(e._75=2,void(e._38=[e._38,t])):void e._38.push(t);c(e,t)}function c(e,t){g(function(){var n=1===e._83?t.onFulfilled:t.onRejected;if(null===n)return void(1===e._83?p(t.promise,e._18):f(t.promise,e._18));var r=o(n,e._18);r===C?f(t.promise,m):p(t.promise,r)})}function p(e,t){if(t===e)return f(e,new TypeError(\\\"A promise cannot be resolved with itself.\\\"));if(t&&(\\\"object\\\"===typeof t||\\\"function\\\"===typeof t)){var n=u(t);if(n===C)return f(e,m);if(n===e.then&&t instanceof i)return e._83=3,e._18=t,void d(e);if(\\\"function\\\"===typeof n)return void h(n.bind(t),e)}e._83=1,e._18=t,d(e)}function f(e,t){e._83=2,e._18=t,i._71&&i._71(e,t),d(e)}function d(e){if(1===e._75&&(s(e,e._38),e._38=null),2===e._75){for(var t=0;t<e._38.length;t++)s(e,e._38[t]);e._38=null}}function D(e,t,n){this.onFulfilled=\\\"function\\\"===typeof e?e:null,this.onRejected=\\\"function\\\"===typeof t?t:null,this.promise=n}function h(e,t){var n=!1,r=a(e,function(e){n||(n=!0,p(t,e))},function(e){n||(n=!0,f(t,e))});n||r!==C||(n=!0,f(t,m))}var g=n(21),m=null,C={};e.exports=i,i._47=null,i._71=null,i._44=r,i.prototype.then=function(e,t){if(this.constructor!==i)return l(this,e,t);var n=new i(r);return s(this,new D(e,t,n)),n}},function(e,t,n){\\\"use strict\\\";var r={};e.exports=r},function(e,t,n){\\\"use strict\\\";function r(e,t,n,r,o,a,i,l){if(u(t),!e){var s;if(void 0===t)s=new Error(\\\"Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.\\\");else{var c=[n,r,o,a,i,l],p=0;s=new Error(t.replace(/%s/g,function(){return c[p++]})),s.name=\\\"Invariant Violation\\\"}throw s.framesToPop=1,s}}var u=function(e){};e.exports=r},function(e,t,n){\\\"use strict\\\";function r(e,t){if(!(e instanceof t))throw new TypeError(\\\"Cannot call a class as a function\\\")}function u(e,t){if(!e)throw new ReferenceError(\\\"this hasn't been initialised - super() hasn't been called\\\");return!t||\\\"object\\\"!==typeof t&&\\\"function\\\"!==typeof t?e:t}function o(e,t){if(\\\"function\\\"!==typeof t&&null!==t)throw new TypeError(\\\"Super expression must either be null or a function, not \\\"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var a=n(0),i=n.n(a),l=n(1),s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\\\"value\\\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),c={position:\\\"relative\\\",display:\\\"inline-flex\\\",flexDirection:\\\"column\\\",height:\\\"100%\\\",width:\\\"1024px\\\",maxWidth:\\\"100%\\\",overflowX:\\\"hidden\\\",overflowY:\\\"auto\\\",padding:\\\"0.5rem\\\",boxSizing:\\\"border-box\\\",textAlign:\\\"left\\\",fontFamily:\\\"Consolas, Menlo, monospace\\\",fontSize:\\\"11px\\\",whiteSpace:\\\"pre-wrap\\\",wordBreak:\\\"break-word\\\",lineHeight:1.5,color:l.a},p=function(e){function t(){var e,n,o,a;r(this,t);for(var i=arguments.length,l=Array(i),s=0;s<i;s++)l[s]=arguments[s];return n=o=u(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(l))),o.iframeWindow=null,o.getIframeWindow=function(e){if(e){var t=e.ownerDocument;o.iframeWindow=t.defaultView}},o.onKeyDown=function(e){var t=o.props.shortcutHandler;t&&t(e.key)},a=n,u(o,a)}return o(t,e),s(t,[{key:\\\"componentDidMount\\\",value:function(){window.addEventListener(\\\"keydown\\\",this.onKeyDown),this.iframeWindow&&this.iframeWindow.addEventListener(\\\"keydown\\\",this.onKeyDown)}},{key:\\\"componentWillUnmount\\\",value:function(){window.removeEventListener(\\\"keydown\\\",this.onKeyDown),this.iframeWindow&&this.iframeWindow.removeEventListener(\\\"keydown\\\",this.onKeyDown)}},{key:\\\"render\\\",value:function(){return i.a.createElement(\\\"div\\\",{style:c,ref:this.getIframeWindow},this.props.children)}}]),t}(a.Component);t.a=p},function(e,t,n){\\\"use strict\\\";function r(e){return o.a.createElement(\\\"div\\\",{style:i},e.line1,o.a.createElement(\\\"br\\\",null),e.line2)}var u=n(0),o=n.n(u),a=n(1),i={fontFamily:\\\"sans-serif\\\",color:a.b,marginTop:\\\"0.5rem\\\",flex:\\\"0 0 auto\\\"};t.a=r},function(e,t,n){\\\"use strict\\\";function r(e){return o.a.createElement(\\\"div\\\",{style:i},e.headerText)}var u=n(0),o=n.n(u),a=n(1),i={fontSize:\\\"2em\\\",fontFamily:\\\"sans-serif\\\",color:a.e,whiteSpace:\\\"pre-wrap\\\",margin:\\\"0 2rem 0.75rem 0\\\",flex:\\\"0 0 auto\\\",maxHeight:\\\"50%\\\",overflow:\\\"auto\\\"};t.a=r},function(e,t,n){\\\"use strict\\\";function r(e){var t=e.main?l:s,n={__html:e.codeHTML};return o.a.createElement(\\\"pre\\\",{style:t},o.a.createElement(\\\"code\\\",{style:c,dangerouslySetInnerHTML:n}))}var u=n(0),o=n.n(u),a=n(1),i={display:\\\"block\\\",padding:\\\"0.5em\\\",marginTop:\\\"0.5em\\\",marginBottom:\\\"0.5em\\\",overflowX:\\\"auto\\\",whiteSpace:\\\"pre-wrap\\\",borderRadius:\\\"0.25rem\\\"},l=Object.assign({},i,{backgroundColor:a.f}),s=Object.assign({},i,{backgroundColor:a.h}),c={fontFamily:\\\"Consolas, Menlo, monospace\\\"};t.a=r},function(e,t,n){\\\"use strict\\\";function r(e){for(var t=(new o.a).ansiToJson(i.encode(e),{use_classes:!0}),n=\\\"\\\",r=!1,u=0;u<t.length;++u)for(var a=t[u],c=a.content,p=a.fg,f=c.split(\\\"\\\\n\\\"),d=0;d<f.length;++d){r||(n+='<span data-ansi-line=\\\"true\\\">',r=!0);var D=f[d].replace(\\\"\\\\r\\\",\\\"\\\"),h=l[s[p]];null!=h?n+='<span style=\\\"color: #'+h+';\\\">'+D+\\\"</span>\\\":(null!=p&&console.log(\\\"Missing color mapping: \\\",p),n+=\\\"<span>\\\"+D+\\\"</span>\\\"),d<f.length-1&&(n+=\\\"</span>\\\",r=!1,n+=\\\"<br/>\\\")}return r&&(n+=\\\"</span>\\\",r=!1),n}var u=n(12),o=n.n(u),a=n(36),i=(n.n(a),new a.AllHtmlEntities),l={reset:[\\\"333333\\\",\\\"transparent\\\"],black:\\\"333333\\\",red:\\\"881280\\\",green:\\\"1155cc\\\",yellow:\\\"881280\\\",blue:\\\"994500\\\",magenta:\\\"994500\\\",cyan:\\\"c80000\\\",gray:\\\"6e6e6e\\\",lightgrey:\\\"f5f5f5\\\",darkgrey:\\\"6e6e6e\\\"},s={\\\"ansi-bright-black\\\":\\\"black\\\",\\\"ansi-bright-yellow\\\":\\\"yellow\\\",\\\"ansi-yellow\\\":\\\"yellow\\\",\\\"ansi-bright-green\\\":\\\"green\\\",\\\"ansi-green\\\":\\\"green\\\",\\\"ansi-bright-cyan\\\":\\\"cyan\\\",\\\"ansi-cyan\\\":\\\"cyan\\\",\\\"ansi-bright-red\\\":\\\"red\\\",\\\"ansi-red\\\":\\\"red\\\",\\\"ansi-bright-magenta\\\":\\\"magenta\\\",\\\"ansi-magenta\\\":\\\"magenta\\\",\\\"ansi-white\\\":\\\"darkgrey\\\"};t.a=r},function(e,t,n){\\\"use strict\\\";function r(e,t){if(!(e instanceof t))throw new TypeError(\\\"Cannot call a class as a function\\\")}var u=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\\\"value\\\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),o=[[{color:\\\"0, 0, 0\\\",class:\\\"ansi-black\\\"},{color:\\\"187, 0, 0\\\",class:\\\"ansi-red\\\"},{color:\\\"0, 187, 0\\\",class:\\\"ansi-green\\\"},{color:\\\"187, 187, 0\\\",class:\\\"ansi-yellow\\\"},{color:\\\"0, 0, 187\\\",class:\\\"ansi-blue\\\"},{color:\\\"187, 0, 187\\\",class:\\\"ansi-magenta\\\"},{color:\\\"0, 187, 187\\\",class:\\\"ansi-cyan\\\"},{color:\\\"255,255,255\\\",class:\\\"ansi-white\\\"}],[{color:\\\"85, 85, 85\\\",class:\\\"ansi-bright-black\\\"},{color:\\\"255, 85, 85\\\",class:\\\"ansi-bright-red\\\"},{color:\\\"0, 255, 0\\\",class:\\\"ansi-bright-green\\\"},{color:\\\"255, 255, 85\\\",class:\\\"ansi-bright-yellow\\\"},{color:\\\"85, 85, 255\\\",class:\\\"ansi-bright-blue\\\"},{color:\\\"255, 85, 255\\\",class:\\\"ansi-bright-magenta\\\"},{color:\\\"85, 255, 255\\\",class:\\\"ansi-bright-cyan\\\"},{color:\\\"255, 255, 255\\\",class:\\\"ansi-bright-white\\\"}]],a=function(){function e(){r(this,e),this.fg=this.bg=this.fg_truecolor=this.bg_truecolor=null,this.bright=0}return u(e,null,[{key:\\\"escapeForHtml\\\",value:function(t){return(new e).escapeForHtml(t)}},{key:\\\"linkify\\\",value:function(t){return(new e).linkify(t)}},{key:\\\"ansiToHtml\\\",value:function(t,n){return(new e).ansiToHtml(t,n)}},{key:\\\"ansiToJson\\\",value:function(t,n){return(new e).ansiToJson(t,n)}},{key:\\\"ansiToText\\\",value:function(t){return(new e).ansiToText(t)}}]),u(e,[{key:\\\"setupPalette\\\",value:function(){this.PALETTE_COLORS=[];for(var e=0;e<2;++e)for(var t=0;t<8;++t)this.PALETTE_COLORS.push(o[e][t].color);for(var n=[0,95,135,175,215,255],r=function(e,t,r){return n[e]+\\\", \\\"+n[t]+\\\", \\\"+n[r]},u=0;u<6;++u)for(var a=0;a<6;++a)for(var i=0;i<6;++i)this.PALETTE_COLORS.push(r(u,a,i));for(var l=8,s=0;s<24;++s,l+=10)this.PALETTE_COLORS.push(r(l,l,l))}},{key:\\\"escapeForHtml\\\",value:function(e){return e.replace(/[&<>]/gm,function(e){return\\\"&\\\"==e?\\\"&amp;\\\":\\\"<\\\"==e?\\\"&lt;\\\":\\\">\\\"==e?\\\"&gt;\\\":\\\"\\\"})}},{key:\\\"linkify\\\",value:function(e){return e.replace(/(https?:\\\\/\\\\/[^\\\\s]+)/gm,function(e){return'<a href=\\\"'+e+'\\\">'+e+\\\"</a>\\\"})}},{key:\\\"ansiToHtml\\\",value:function(e,t){return this.process(e,t,!0)}},{key:\\\"ansiToJson\\\",value:function(e,t){return t=t||{},t.json=!0,t.clearLine=!1,this.process(e,t,!0)}},{key:\\\"ansiToText\\\",value:function(e){return this.process(e,{},!1)}},{key:\\\"process\\\",value:function(e,t,n){var r=this,u=this,o=e.split(/\\\\033\\\\[/),a=o.shift();void 0!==t&&null!==t||(t={}),t.clearLine=/\\\\r/.test(e);var i=o.map(function(e){return r.processChunk(e,t,n)});if(t&&t.json){var l=u.processChunkJson(\\\"\\\");return l.content=a,l.clearLine=t.clearLine,i.unshift(l),t.remove_empty&&(i=i.filter(function(e){return!e.isEmpty()})),i}return i.unshift(a),i.join(\\\"\\\")}},{key:\\\"processChunkJson\\\",value:function(e,t,n){t=\\\"undefined\\\"==typeof t?{}:t;var r=t.use_classes=\\\"undefined\\\"!=typeof t.use_classes&&t.use_classes,u=t.key=r?\\\"class\\\":\\\"color\\\",a={content:e,fg:null,bg:null,fg_truecolor:null,bg_truecolor:null,clearLine:t.clearLine,decoration:null,was_processed:!1,isEmpty:function(){return!a.content}},i=e.match(/^([!\\\\x3c-\\\\x3f]*)([\\\\d;]*)([\\\\x20-\\\\x2c]*[\\\\x40-\\\\x7e])([\\\\s\\\\S]*)/m);if(!i)return a;var l=(a.content=i[4],i[2].split(\\\";\\\"));if(\\\"\\\"!==i[1]||\\\"m\\\"!==i[3])return a;if(!n)return a;var s=this;for(s.decoration=null;l.length>0;){var c=l.shift(),p=parseInt(c);if(isNaN(p)||0===p)s.fg=s.bg=s.decoration=null;else if(1===p)s.decoration=\\\"bold\\\";else if(2===p)s.decoration=\\\"dim\\\";else if(3==p)s.decoration=\\\"italic\\\";else if(4==p)s.decoration=\\\"underline\\\";else if(5==p)s.decoration=\\\"blink\\\";else if(7===p)s.decoration=\\\"reverse\\\";else if(8===p)s.decoration=\\\"hidden\\\";else if(9===p)s.decoration=\\\"strikethrough\\\";else if(39==p)s.fg=null;else if(49==p)s.bg=null;else if(p>=30&&p<38)s.fg=o[0][p%10][u];else if(p>=90&&p<98)s.fg=o[1][p%10][u];else if(p>=40&&p<48)s.bg=o[0][p%10][u];else if(p>=100&&p<108)s.bg=o[1][p%10][u];else if(38===p||48===p){var f=38===p;if(l.length>=1){var d=l.shift();if(\\\"5\\\"===d&&l.length>=1){var D=parseInt(l.shift());if(D>=0&&D<=255)if(r){var h=D>=16?\\\"ansi-palette-\\\"+D:o[D>7?1:0][D%8].class;f?s.fg=h:s.bg=h}else this.PALETTE_COLORS||s.setupPalette(),f?s.fg=this.PALETTE_COLORS[D]:s.bg=this.PALETTE_COLORS[D]}else if(\\\"2\\\"===d&&l.length>=3){var g=parseInt(l.shift()),m=parseInt(l.shift()),C=parseInt(l.shift());if(g>=0&&g<=255&&m>=0&&m<=255&&C>=0&&C<=255){var E=g+\\\", \\\"+m+\\\", \\\"+C;r?f?(s.fg=\\\"ansi-truecolor\\\",s.fg_truecolor=E):(s.bg=\\\"ansi-truecolor\\\",s.bg_truecolor=E):f?s.fg=E:s.bg=E}}}}}if(null===s.fg&&null===s.bg&&null===s.decoration)return a;return a.fg=s.fg,a.bg=s.bg,a.fg_truecolor=s.fg_truecolor,a.bg_truecolor=s.bg_truecolor,a.decoration=s.decoration,a.was_processed=!0,a}},{key:\\\"processChunk\\\",value:function(e,t,n){var r=this;t=t||{};var u=this.processChunkJson(e,t,n);if(t.json)return u;if(u.isEmpty())return\\\"\\\";if(!u.was_processed)return u.content;var o=t.use_classes,a=[],i=[],l={},s=function(e){var t=[],n=void 0;for(n in e)e.hasOwnProperty(n)&&t.push(\\\"data-\\\"+n+'=\\\"'+r.escapeForHtml(e[n])+'\\\"');return t.length>0?\\\" \\\"+t.join(\\\" \\\"):\\\"\\\"};return u.fg&&(o?(i.push(u.fg+\\\"-fg\\\"),null!==u.fg_truecolor&&(l[\\\"ansi-truecolor-fg\\\"]=u.fg_truecolor,u.fg_truecolor=null)):a.push(\\\"color:rgb(\\\"+u.fg+\\\")\\\")),u.bg&&(o?(i.push(u.bg+\\\"-bg\\\"),null!==u.bg_truecolor&&(l[\\\"ansi-truecolor-bg\\\"]=u.bg_truecolor,u.bg_truecolor=null)):a.push(\\\"background-color:rgb(\\\"+u.bg+\\\")\\\")),u.decoration&&(o?i.push(\\\"ansi-\\\"+u.decoration):\\\"bold\\\"===u.decoration?a.push(\\\"font-weight:bold\\\"):\\\"dim\\\"===u.decoration?a.push(\\\"opacity:0.5\\\"):\\\"italic\\\"===u.decoration?a.push(\\\"font-style:italic\\\"):\\\"reverse\\\"===u.decoration?a.push(\\\"filter:invert(100%)\\\"):\\\"hidden\\\"===u.decoration?a.push(\\\"visibility:hidden\\\"):\\\"strikethrough\\\"===u.decoration?a.push(\\\"text-decoration:line-through\\\"):a.push(\\\"text-decoration:\\\"+u.decoration)),o?'<span class=\\\"'+i.join(\\\" \\\")+'\\\"'+s(l)+\\\">\\\"+u.content+\\\"</span>\\\":'<span style=\\\"'+a.join(\\\";\\\")+'\\\"'+s(l)+\\\">\\\"+u.content+\\\"</span>\\\"}}]),e}();e.exports=a},function(e,t){function n(){}var r=[[\\\"Aacute\\\",[193]],[\\\"aacute\\\",[225]],[\\\"Abreve\\\",[258]],[\\\"abreve\\\",[259]],[\\\"ac\\\",[8766]],[\\\"acd\\\",[8767]],[\\\"acE\\\",[8766,819]],[\\\"Acirc\\\",[194]],[\\\"acirc\\\",[226]],[\\\"acute\\\",[180]],[\\\"Acy\\\",[1040]],[\\\"acy\\\",[1072]],[\\\"AElig\\\",[198]],[\\\"aelig\\\",[230]],[\\\"af\\\",[8289]],[\\\"Afr\\\",[120068]],[\\\"afr\\\",[120094]],[\\\"Agrave\\\",[192]],[\\\"agrave\\\",[224]],[\\\"alefsym\\\",[8501]],[\\\"aleph\\\",[8501]],[\\\"Alpha\\\",[913]],[\\\"alpha\\\",[945]],[\\\"Amacr\\\",[256]],[\\\"amacr\\\",[257]],[\\\"amalg\\\",[10815]],[\\\"amp\\\",[38]],[\\\"AMP\\\",[38]],[\\\"andand\\\",[10837]],[\\\"And\\\",[10835]],[\\\"and\\\",[8743]],[\\\"andd\\\",[10844]],[\\\"andslope\\\",[10840]],[\\\"andv\\\",[10842]],[\\\"ang\\\",[8736]],[\\\"ange\\\",[10660]],[\\\"angle\\\",[8736]],[\\\"angmsdaa\\\",[10664]],[\\\"angmsdab\\\",[10665]],[\\\"angmsdac\\\",[10666]],[\\\"angmsdad\\\",[10667]],[\\\"angmsdae\\\",[10668]],[\\\"angmsdaf\\\",[10669]],[\\\"angmsdag\\\",[10670]],[\\\"angmsdah\\\",[10671]],[\\\"angmsd\\\",[8737]],[\\\"angrt\\\",[8735]],[\\\"angrtvb\\\",[8894]],[\\\"angrtvbd\\\",[10653]],[\\\"angsph\\\",[8738]],[\\\"angst\\\",[197]],[\\\"angzarr\\\",[9084]],[\\\"Aogon\\\",[260]],[\\\"aogon\\\",[261]],[\\\"Aopf\\\",[120120]],[\\\"aopf\\\",[120146]],[\\\"apacir\\\",[10863]],[\\\"ap\\\",[8776]],[\\\"apE\\\",[10864]],[\\\"ape\\\",[8778]],[\\\"apid\\\",[8779]],[\\\"apos\\\",[39]],[\\\"ApplyFunction\\\",[8289]],[\\\"approx\\\",[8776]],[\\\"approxeq\\\",[8778]],[\\\"Aring\\\",[197]],[\\\"aring\\\",[229]],[\\\"Ascr\\\",[119964]],[\\\"ascr\\\",[119990]],[\\\"Assign\\\",[8788]],[\\\"ast\\\",[42]],[\\\"asymp\\\",[8776]],[\\\"asympeq\\\",[8781]],[\\\"Atilde\\\",[195]],[\\\"atilde\\\",[227]],[\\\"Auml\\\",[196]],[\\\"auml\\\",[228]],[\\\"awconint\\\",[8755]],[\\\"awint\\\",[10769]],[\\\"backcong\\\",[8780]],[\\\"backepsilon\\\",[1014]],[\\\"backprime\\\",[8245]],[\\\"backsim\\\",[8765]],[\\\"backsimeq\\\",[8909]],[\\\"Backslash\\\",[8726]],[\\\"Barv\\\",[10983]],[\\\"barvee\\\",[8893]],[\\\"barwed\\\",[8965]],[\\\"Barwed\\\",[8966]],[\\\"barwedge\\\",[8965]],[\\\"bbrk\\\",[9141]],[\\\"bbrktbrk\\\",[9142]],[\\\"bcong\\\",[8780]],[\\\"Bcy\\\",[1041]],[\\\"bcy\\\",[1073]],[\\\"bdquo\\\",[8222]],[\\\"becaus\\\",[8757]],[\\\"because\\\",[8757]],[\\\"Because\\\",[8757]],[\\\"bemptyv\\\",[10672]],[\\\"bepsi\\\",[1014]],[\\\"bernou\\\",[8492]],[\\\"Bernoullis\\\",[8492]],[\\\"Beta\\\",[914]],[\\\"beta\\\",[946]],[\\\"beth\\\",[8502]],[\\\"between\\\",[8812]],[\\\"Bfr\\\",[120069]],[\\\"bfr\\\",[120095]],[\\\"bigcap\\\",[8898]],[\\\"bigcirc\\\",[9711]],[\\\"bigcup\\\",[8899]],[\\\"bigodot\\\",[10752]],[\\\"bigoplus\\\",[10753]],[\\\"bigotimes\\\",[10754]],[\\\"bigsqcup\\\",[10758]],[\\\"bigstar\\\",[9733]],[\\\"bigtriangledown\\\",[9661]],[\\\"bigtriangleup\\\",[9651]],[\\\"biguplus\\\",[10756]],[\\\"bigvee\\\",[8897]],[\\\"bigwedge\\\",[8896]],[\\\"bkarow\\\",[10509]],[\\\"blacklozenge\\\",[10731]],[\\\"blacksquare\\\",[9642]],[\\\"blacktriangle\\\",[9652]],[\\\"blacktriangledown\\\",[9662]],[\\\"blacktriangleleft\\\",[9666]],[\\\"blacktriangleright\\\",[9656]],[\\\"blank\\\",[9251]],[\\\"blk12\\\",[9618]],[\\\"blk14\\\",[9617]],[\\\"blk34\\\",[9619]],[\\\"block\\\",[9608]],[\\\"bne\\\",[61,8421]],[\\\"bnequiv\\\",[8801,8421]],[\\\"bNot\\\",[10989]],[\\\"bnot\\\",[8976]],[\\\"Bopf\\\",[120121]],[\\\"bopf\\\",[120147]],[\\\"bot\\\",[8869]],[\\\"bottom\\\",[8869]],[\\\"bowtie\\\",[8904]],[\\\"boxbox\\\",[10697]],[\\\"boxdl\\\",[9488]],[\\\"boxdL\\\",[9557]],[\\\"boxDl\\\",[9558]],[\\\"boxDL\\\",[9559]],[\\\"boxdr\\\",[9484]],[\\\"boxdR\\\",[9554]],[\\\"boxDr\\\",[9555]],[\\\"boxDR\\\",[9556]],[\\\"boxh\\\",[9472]],[\\\"boxH\\\",[9552]],[\\\"boxhd\\\",[9516]],[\\\"boxHd\\\",[9572]],[\\\"boxhD\\\",[9573]],[\\\"boxHD\\\",[9574]],[\\\"boxhu\\\",[9524]],[\\\"boxHu\\\",[9575]],[\\\"boxhU\\\",[9576]],[\\\"boxHU\\\",[9577]],[\\\"boxminus\\\",[8863]],[\\\"boxplus\\\",[8862]],[\\\"boxtimes\\\",[8864]],[\\\"boxul\\\",[9496]],[\\\"boxuL\\\",[9563]],[\\\"boxUl\\\",[9564]],[\\\"boxUL\\\",[9565]],[\\\"boxur\\\",[9492]],[\\\"boxuR\\\",[9560]],[\\\"boxUr\\\",[9561]],[\\\"boxUR\\\",[9562]],[\\\"boxv\\\",[9474]],[\\\"boxV\\\",[9553]],[\\\"boxvh\\\",[9532]],[\\\"boxvH\\\",[9578]],[\\\"boxVh\\\",[9579]],[\\\"boxVH\\\",[9580]],[\\\"boxvl\\\",[9508]],[\\\"boxvL\\\",[9569]],[\\\"boxVl\\\",[9570]],[\\\"boxVL\\\",[9571]],[\\\"boxvr\\\",[9500]],[\\\"boxvR\\\",[9566]],[\\\"boxVr\\\",[9567]],[\\\"boxVR\\\",[9568]],[\\\"bprime\\\",[8245]],[\\\"breve\\\",[728]],[\\\"Breve\\\",[728]],[\\\"brvbar\\\",[166]],[\\\"bscr\\\",[119991]],[\\\"Bscr\\\",[8492]],[\\\"bsemi\\\",[8271]],[\\\"bsim\\\",[8765]],[\\\"bsime\\\",[8909]],[\\\"bsolb\\\",[10693]],[\\\"bsol\\\",[92]],[\\\"bsolhsub\\\",[10184]],[\\\"bull\\\",[8226]],[\\\"bullet\\\",[8226]],[\\\"bump\\\",[8782]],[\\\"bumpE\\\",[10926]],[\\\"bumpe\\\",[8783]],[\\\"Bumpeq\\\",[8782]],[\\\"bumpeq\\\",[8783]],[\\\"Cacute\\\",[262]],[\\\"cacute\\\",[263]],[\\\"capand\\\",[10820]],[\\\"capbrcup\\\",[10825]],[\\\"capcap\\\",[10827]],[\\\"cap\\\",[8745]],[\\\"Cap\\\",[8914]],[\\\"capcup\\\",[10823]],[\\\"capdot\\\",[10816]],[\\\"CapitalDifferentialD\\\",[8517]],[\\\"caps\\\",[8745,65024]],[\\\"caret\\\",[8257]],[\\\"caron\\\",[711]],[\\\"Cayleys\\\",[8493]],[\\\"ccaps\\\",[10829]],[\\\"Ccaron\\\",[268]],[\\\"ccaron\\\",[269]],[\\\"Ccedil\\\",[199]],[\\\"ccedil\\\",[231]],[\\\"Ccirc\\\",[264]],[\\\"ccirc\\\",[265]],[\\\"Cconint\\\",[8752]],[\\\"ccups\\\",[10828]],[\\\"ccupssm\\\",[10832]],[\\\"Cdot\\\",[266]],[\\\"cdot\\\",[267]],[\\\"cedil\\\",[184]],[\\\"Cedilla\\\",[184]],[\\\"cemptyv\\\",[10674]],[\\\"cent\\\",[162]],[\\\"centerdot\\\",[183]],[\\\"CenterDot\\\",[183]],[\\\"cfr\\\",[120096]],[\\\"Cfr\\\",[8493]],[\\\"CHcy\\\",[1063]],[\\\"chcy\\\",[1095]],[\\\"check\\\",[10003]],[\\\"checkmark\\\",[10003]],[\\\"Chi\\\",[935]],[\\\"chi\\\",[967]],[\\\"circ\\\",[710]],[\\\"circeq\\\",[8791]],[\\\"circlearrowleft\\\",[8634]],[\\\"circlearrowright\\\",[8635]],[\\\"circledast\\\",[8859]],[\\\"circledcirc\\\",[8858]],[\\\"circleddash\\\",[8861]],[\\\"CircleDot\\\",[8857]],[\\\"circledR\\\",[174]],[\\\"circledS\\\",[9416]],[\\\"CircleMinus\\\",[8854]],[\\\"CirclePlus\\\",[8853]],[\\\"CircleTimes\\\",[8855]],[\\\"cir\\\",[9675]],[\\\"cirE\\\",[10691]],[\\\"cire\\\",[8791]],[\\\"cirfnint\\\",[10768]],[\\\"cirmid\\\",[10991]],[\\\"cirscir\\\",[10690]],[\\\"ClockwiseContourIntegral\\\",[8754]],[\\\"clubs\\\",[9827]],[\\\"clubsuit\\\",[9827]],[\\\"colon\\\",[58]],[\\\"Colon\\\",[8759]],[\\\"Colone\\\",[10868]],[\\\"colone\\\",[8788]],[\\\"coloneq\\\",[8788]],[\\\"comma\\\",[44]],[\\\"commat\\\",[64]],[\\\"comp\\\",[8705]],[\\\"compfn\\\",[8728]],[\\\"complement\\\",[8705]],[\\\"complexes\\\",[8450]],[\\\"cong\\\",[8773]],[\\\"congdot\\\",[10861]],[\\\"Congruent\\\",[8801]],[\\\"conint\\\",[8750]],[\\\"Conint\\\",[8751]],[\\\"ContourIntegral\\\",[8750]],[\\\"copf\\\",[120148]],[\\\"Copf\\\",[8450]],[\\\"coprod\\\",[8720]],[\\\"Coproduct\\\",[8720]],[\\\"copy\\\",[169]],[\\\"COPY\\\",[169]],[\\\"copysr\\\",[8471]],[\\\"CounterClockwiseContourIntegral\\\",[8755]],[\\\"crarr\\\",[8629]],[\\\"cross\\\",[10007]],[\\\"Cross\\\",[10799]],[\\\"Cscr\\\",[119966]],[\\\"cscr\\\",[119992]],[\\\"csub\\\",[10959]],[\\\"csube\\\",[10961]],[\\\"csup\\\",[10960]],[\\\"csupe\\\",[10962]],[\\\"ctdot\\\",[8943]],[\\\"cudarrl\\\",[10552]],[\\\"cudarrr\\\",[10549]],[\\\"cuepr\\\",[8926]],[\\\"cuesc\\\",[8927]],[\\\"cularr\\\",[8630]],[\\\"cularrp\\\",[10557]],[\\\"cupbrcap\\\",[10824]],[\\\"cupcap\\\",[10822]],[\\\"CupCap\\\",[8781]],[\\\"cup\\\",[8746]],[\\\"Cup\\\",[8915]],[\\\"cupcup\\\",[10826]],[\\\"cupdot\\\",[8845]],[\\\"cupor\\\",[10821]],[\\\"cups\\\",[8746,65024]],[\\\"curarr\\\",[8631]],[\\\"curarrm\\\",[10556]],[\\\"curlyeqprec\\\",[8926]],[\\\"curlyeqsucc\\\",[8927]],[\\\"curlyvee\\\",[8910]],[\\\"curlywedge\\\",[8911]],[\\\"curren\\\",[164]],[\\\"curvearrowleft\\\",[8630]],[\\\"curvearrowright\\\",[8631]],[\\\"cuvee\\\",[8910]],[\\\"cuwed\\\",[8911]],[\\\"cwconint\\\",[8754]],[\\\"cwint\\\",[8753]],[\\\"cylcty\\\",[9005]],[\\\"dagger\\\",[8224]],[\\\"Dagger\\\",[8225]],[\\\"daleth\\\",[8504]],[\\\"darr\\\",[8595]],[\\\"Darr\\\",[8609]],[\\\"dArr\\\",[8659]],[\\\"dash\\\",[8208]],[\\\"Dashv\\\",[10980]],[\\\"dashv\\\",[8867]],[\\\"dbkarow\\\",[10511]],[\\\"dblac\\\",[733]],[\\\"Dcaron\\\",[270]],[\\\"dcaron\\\",[271]],[\\\"Dcy\\\",[1044]],[\\\"dcy\\\",[1076]],[\\\"ddagger\\\",[8225]],[\\\"ddarr\\\",[8650]],[\\\"DD\\\",[8517]],[\\\"dd\\\",[8518]],[\\\"DDotrahd\\\",[10513]],[\\\"ddotseq\\\",[10871]],[\\\"deg\\\",[176]],[\\\"Del\\\",[8711]],[\\\"Delta\\\",[916]],[\\\"delta\\\",[948]],[\\\"demptyv\\\",[10673]],[\\\"dfisht\\\",[10623]],[\\\"Dfr\\\",[120071]],[\\\"dfr\\\",[120097]],[\\\"dHar\\\",[10597]],[\\\"dharl\\\",[8643]],[\\\"dharr\\\",[8642]],[\\\"DiacriticalAcute\\\",[180]],[\\\"DiacriticalDot\\\",[729]],[\\\"DiacriticalDoubleAcute\\\",[733]],[\\\"DiacriticalGrave\\\",[96]],[\\\"DiacriticalTilde\\\",[732]],[\\\"diam\\\",[8900]],[\\\"diamond\\\",[8900]],[\\\"Diamond\\\",[8900]],[\\\"diamondsuit\\\",[9830]],[\\\"diams\\\",[9830]],[\\\"die\\\",[168]],[\\\"DifferentialD\\\",[8518]],[\\\"digamma\\\",[989]],[\\\"disin\\\",[8946]],[\\\"div\\\",[247]],[\\\"divide\\\",[247]],[\\\"divideontimes\\\",[8903]],[\\\"divonx\\\",[8903]],[\\\"DJcy\\\",[1026]],[\\\"djcy\\\",[1106]],[\\\"dlcorn\\\",[8990]],[\\\"dlcrop\\\",[8973]],[\\\"dollar\\\",[36]],[\\\"Dopf\\\",[120123]],[\\\"dopf\\\",[120149]],[\\\"Dot\\\",[168]],[\\\"dot\\\",[729]],[\\\"DotDot\\\",[8412]],[\\\"doteq\\\",[8784]],[\\\"doteqdot\\\",[8785]],[\\\"DotEqual\\\",[8784]],[\\\"dotminus\\\",[8760]],[\\\"dotplus\\\",[8724]],[\\\"dotsquare\\\",[8865]],[\\\"doublebarwedge\\\",[8966]],[\\\"DoubleContourIntegral\\\",[8751]],[\\\"DoubleDot\\\",[168]],[\\\"DoubleDownArrow\\\",[8659]],[\\\"DoubleLeftArrow\\\",[8656]],[\\\"DoubleLeftRightArrow\\\",[8660]],[\\\"DoubleLeftTee\\\",[10980]],[\\\"DoubleLongLeftArrow\\\",[10232]],[\\\"DoubleLongLeftRightArrow\\\",[10234]],[\\\"DoubleLongRightArrow\\\",[10233]],[\\\"DoubleRightArrow\\\",[8658]],[\\\"DoubleRightTee\\\",[8872]],[\\\"DoubleUpArrow\\\",[8657]],[\\\"DoubleUpDownArrow\\\",[8661]],[\\\"DoubleVerticalBar\\\",[8741]],[\\\"DownArrowBar\\\",[10515]],[\\\"downarrow\\\",[8595]],[\\\"DownArrow\\\",[8595]],[\\\"Downarrow\\\",[8659]],[\\\"DownArrowUpArrow\\\",[8693]],[\\\"DownBreve\\\",[785]],[\\\"downdownarrows\\\",[8650]],[\\\"downharpoonleft\\\",[8643]],[\\\"downharpoonright\\\",[8642]],[\\\"DownLeftRightVector\\\",[10576]],[\\\"DownLeftTeeVector\\\",[10590]],[\\\"DownLeftVectorBar\\\",[10582]],[\\\"DownLeftVector\\\",[8637]],[\\\"DownRightTeeVector\\\",[10591]],[\\\"DownRightVectorBar\\\",[10583]],[\\\"DownRightVector\\\",[8641]],[\\\"DownTeeArrow\\\",[8615]],[\\\"DownTee\\\",[8868]],[\\\"drbkarow\\\",[10512]],[\\\"drcorn\\\",[8991]],[\\\"drcrop\\\",[8972]],[\\\"Dscr\\\",[119967]],[\\\"dscr\\\",[119993]],[\\\"DScy\\\",[1029]],[\\\"dscy\\\",[1109]],[\\\"dsol\\\",[10742]],[\\\"Dstrok\\\",[272]],[\\\"dstrok\\\",[273]],[\\\"dtdot\\\",[8945]],[\\\"dtri\\\",[9663]],[\\\"dtrif\\\",[9662]],[\\\"duarr\\\",[8693]],[\\\"duhar\\\",[10607]],[\\\"dwangle\\\",[10662]],[\\\"DZcy\\\",[1039]],[\\\"dzcy\\\",[1119]],[\\\"dzigrarr\\\",[10239]],[\\\"Eacute\\\",[201]],[\\\"eacute\\\",[233]],[\\\"easter\\\",[10862]],[\\\"Ecaron\\\",[282]],[\\\"ecaron\\\",[283]],[\\\"Ecirc\\\",[202]],[\\\"ecirc\\\",[234]],[\\\"ecir\\\",[8790]],[\\\"ecolon\\\",[8789]],[\\\"Ecy\\\",[1069]],[\\\"ecy\\\",[1101]],[\\\"eDDot\\\",[10871]],[\\\"Edot\\\",[278]],[\\\"edot\\\",[279]],[\\\"eDot\\\",[8785]],[\\\"ee\\\",[8519]],[\\\"efDot\\\",[8786]],[\\\"Efr\\\",[120072]],[\\\"efr\\\",[120098]],[\\\"eg\\\",[10906]],[\\\"Egrave\\\",[200]],[\\\"egrave\\\",[232]],[\\\"egs\\\",[10902]],[\\\"egsdot\\\",[10904]],[\\\"el\\\",[10905]],[\\\"Element\\\",[8712]],[\\\"elinters\\\",[9191]],[\\\"ell\\\",[8467]],[\\\"els\\\",[10901]],[\\\"elsdot\\\",[10903]],[\\\"Emacr\\\",[274]],[\\\"emacr\\\",[275]],[\\\"empty\\\",[8709]],[\\\"emptyset\\\",[8709]],[\\\"EmptySmallSquare\\\",[9723]],[\\\"emptyv\\\",[8709]],[\\\"EmptyVerySmallSquare\\\",[9643]],[\\\"emsp13\\\",[8196]],[\\\"emsp14\\\",[8197]],[\\\"emsp\\\",[8195]],[\\\"ENG\\\",[330]],[\\\"eng\\\",[331]],[\\\"ensp\\\",[8194]],[\\\"Eogon\\\",[280]],[\\\"eogon\\\",[281]],[\\\"Eopf\\\",[120124]],[\\\"eopf\\\",[120150]],[\\\"epar\\\",[8917]],[\\\"eparsl\\\",[10723]],[\\\"eplus\\\",[10865]],[\\\"epsi\\\",[949]],[\\\"Epsilon\\\",[917]],[\\\"epsilon\\\",[949]],[\\\"epsiv\\\",[1013]],[\\\"eqcirc\\\",[8790]],[\\\"eqcolon\\\",[8789]],[\\\"eqsim\\\",[8770]],[\\\"eqslantgtr\\\",[10902]],[\\\"eqslantless\\\",[10901]],[\\\"Equal\\\",[10869]],[\\\"equals\\\",[61]],[\\\"EqualTilde\\\",[8770]],[\\\"equest\\\",[8799]],[\\\"Equilibrium\\\",[8652]],[\\\"equiv\\\",[8801]],[\\\"equivDD\\\",[10872]],[\\\"eqvparsl\\\",[10725]],[\\\"erarr\\\",[10609]],[\\\"erDot\\\",[8787]],[\\\"escr\\\",[8495]],[\\\"Escr\\\",[8496]],[\\\"esdot\\\",[8784]],[\\\"Esim\\\",[10867]],[\\\"esim\\\",[8770]],[\\\"Eta\\\",[919]],[\\\"eta\\\",[951]],[\\\"ETH\\\",[208]],[\\\"eth\\\",[240]],[\\\"Euml\\\",[203]],[\\\"euml\\\",[235]],[\\\"euro\\\",[8364]],[\\\"excl\\\",[33]],[\\\"exist\\\",[8707]],[\\\"Exists\\\",[8707]],[\\\"expectation\\\",[8496]],[\\\"exponentiale\\\",[8519]],[\\\"ExponentialE\\\",[8519]],[\\\"fallingdotseq\\\",[8786]],[\\\"Fcy\\\",[1060]],[\\\"fcy\\\",[1092]],[\\\"female\\\",[9792]],[\\\"ffilig\\\",[64259]],[\\\"fflig\\\",[64256]],[\\\"ffllig\\\",[64260]],[\\\"Ffr\\\",[120073]],[\\\"ffr\\\",[120099]],[\\\"filig\\\",[64257]],[\\\"FilledSmallSquare\\\",[9724]],[\\\"FilledVerySmallSquare\\\",[9642]],[\\\"fjlig\\\",[102,106]],[\\\"flat\\\",[9837]],[\\\"fllig\\\",[64258]],[\\\"fltns\\\",[9649]],[\\\"fnof\\\",[402]],[\\\"Fopf\\\",[120125]],[\\\"fopf\\\",[120151]],[\\\"forall\\\",[8704]],[\\\"ForAll\\\",[8704]],[\\\"fork\\\",[8916]],[\\\"forkv\\\",[10969]],[\\\"Fouriertrf\\\",[8497]],[\\\"fpartint\\\",[10765]],[\\\"frac12\\\",[189]],[\\\"frac13\\\",[8531]],[\\\"frac14\\\",[188]],[\\\"frac15\\\",[8533]],[\\\"frac16\\\",[8537]],[\\\"frac18\\\",[8539]],[\\\"frac23\\\",[8532]],[\\\"frac25\\\",[8534]],[\\\"frac34\\\",[190]],[\\\"frac35\\\",[8535]],[\\\"frac38\\\",[8540]],[\\\"frac45\\\",[8536]],[\\\"frac56\\\",[8538]],[\\\"frac58\\\",[8541]],[\\\"frac78\\\",[8542]],[\\\"frasl\\\",[8260]],[\\\"frown\\\",[8994]],[\\\"fscr\\\",[119995]],[\\\"Fscr\\\",[8497]],[\\\"gacute\\\",[501]],[\\\"Gamma\\\",[915]],[\\\"gamma\\\",[947]],[\\\"Gammad\\\",[988]],[\\\"gammad\\\",[989]],[\\\"gap\\\",[10886]],[\\\"Gbreve\\\",[286]],[\\\"gbreve\\\",[287]],[\\\"Gcedil\\\",[290]],[\\\"Gcirc\\\",[284]],[\\\"gcirc\\\",[285]],[\\\"Gcy\\\",[1043]],[\\\"gcy\\\",[1075]],[\\\"Gdot\\\",[288]],[\\\"gdot\\\",[289]],[\\\"ge\\\",[8805]],[\\\"gE\\\",[8807]],[\\\"gEl\\\",[10892]],[\\\"gel\\\",[8923]],[\\\"geq\\\",[8805]],[\\\"geqq\\\",[8807]],[\\\"geqslant\\\",[10878]],[\\\"gescc\\\",[10921]],[\\\"ges\\\",[10878]],[\\\"gesdot\\\",[10880]],[\\\"gesdoto\\\",[10882]],[\\\"gesdotol\\\",[10884]],[\\\"gesl\\\",[8923,65024]],[\\\"gesles\\\",[10900]],[\\\"Gfr\\\",[120074]],[\\\"gfr\\\",[120100]],[\\\"gg\\\",[8811]],[\\\"Gg\\\",[8921]],[\\\"ggg\\\",[8921]],[\\\"gimel\\\",[8503]],[\\\"GJcy\\\",[1027]],[\\\"gjcy\\\",[1107]],[\\\"gla\\\",[10917]],[\\\"gl\\\",[8823]],[\\\"glE\\\",[10898]],[\\\"glj\\\",[10916]],[\\\"gnap\\\",[10890]],[\\\"gnapprox\\\",[10890]],[\\\"gne\\\",[10888]],[\\\"gnE\\\",[8809]],[\\\"gneq\\\",[10888]],[\\\"gneqq\\\",[8809]],[\\\"gnsim\\\",[8935]],[\\\"Gopf\\\",[120126]],[\\\"gopf\\\",[120152]],[\\\"grave\\\",[96]],[\\\"GreaterEqual\\\",[8805]],[\\\"GreaterEqualLess\\\",[8923]],[\\\"GreaterFullEqual\\\",[8807]],[\\\"GreaterGreater\\\",[10914]],[\\\"GreaterLess\\\",[8823]],[\\\"GreaterSlantEqual\\\",[10878]],[\\\"GreaterTilde\\\",[8819]],[\\\"Gscr\\\",[119970]],[\\\"gscr\\\",[8458]],[\\\"gsim\\\",[8819]],[\\\"gsime\\\",[10894]],[\\\"gsiml\\\",[10896]],[\\\"gtcc\\\",[10919]],[\\\"gtcir\\\",[10874]],[\\\"gt\\\",[62]],[\\\"GT\\\",[62]],[\\\"Gt\\\",[8811]],[\\\"gtdot\\\",[8919]],[\\\"gtlPar\\\",[10645]],[\\\"gtquest\\\",[10876]],[\\\"gtrapprox\\\",[10886]],[\\\"gtrarr\\\",[10616]],[\\\"gtrdot\\\",[8919]],[\\\"gtreqless\\\",[8923]],[\\\"gtreqqless\\\",[10892]],[\\\"gtrless\\\",[8823]],[\\\"gtrsim\\\",[8819]],[\\\"gvertneqq\\\",[8809,65024]],[\\\"gvnE\\\",[8809,65024]],[\\\"Hacek\\\",[711]],[\\\"hairsp\\\",[8202]],[\\\"half\\\",[189]],[\\\"hamilt\\\",[8459]],[\\\"HARDcy\\\",[1066]],[\\\"hardcy\\\",[1098]],[\\\"harrcir\\\",[10568]],[\\\"harr\\\",[8596]],[\\\"hArr\\\",[8660]],[\\\"harrw\\\",[8621]],[\\\"Hat\\\",[94]],[\\\"hbar\\\",[8463]],[\\\"Hcirc\\\",[292]],[\\\"hcirc\\\",[293]],[\\\"hearts\\\",[9829]],[\\\"heartsuit\\\",[9829]],[\\\"hellip\\\",[8230]],[\\\"hercon\\\",[8889]],[\\\"hfr\\\",[120101]],[\\\"Hfr\\\",[8460]],[\\\"HilbertSpace\\\",[8459]],[\\\"hksearow\\\",[10533]],[\\\"hkswarow\\\",[10534]],[\\\"hoarr\\\",[8703]],[\\\"homtht\\\",[8763]],[\\\"hookleftarrow\\\",[8617]],[\\\"hookrightarrow\\\",[8618]],[\\\"hopf\\\",[120153]],[\\\"Hopf\\\",[8461]],[\\\"horbar\\\",[8213]],[\\\"HorizontalLine\\\",[9472]],[\\\"hscr\\\",[119997]],[\\\"Hscr\\\",[8459]],[\\\"hslash\\\",[8463]],[\\\"Hstrok\\\",[294]],[\\\"hstrok\\\",[295]],[\\\"HumpDownHump\\\",[8782]],[\\\"HumpEqual\\\",[8783]],[\\\"hybull\\\",[8259]],[\\\"hyphen\\\",[8208]],[\\\"Iacute\\\",[205]],[\\\"iacute\\\",[237]],[\\\"ic\\\",[8291]],[\\\"Icirc\\\",[206]],[\\\"icirc\\\",[238]],[\\\"Icy\\\",[1048]],[\\\"icy\\\",[1080]],[\\\"Idot\\\",[304]],[\\\"IEcy\\\",[1045]],[\\\"iecy\\\",[1077]],[\\\"iexcl\\\",[161]],[\\\"iff\\\",[8660]],[\\\"ifr\\\",[120102]],[\\\"Ifr\\\",[8465]],[\\\"Igrave\\\",[204]],[\\\"igrave\\\",[236]],[\\\"ii\\\",[8520]],[\\\"iiiint\\\",[10764]],[\\\"iiint\\\",[8749]],[\\\"iinfin\\\",[10716]],[\\\"iiota\\\",[8489]],[\\\"IJlig\\\",[306]],[\\\"ijlig\\\",[307]],[\\\"Imacr\\\",[298]],[\\\"imacr\\\",[299]],[\\\"image\\\",[8465]],[\\\"ImaginaryI\\\",[8520]],[\\\"imagline\\\",[8464]],[\\\"imagpart\\\",[8465]],[\\\"imath\\\",[305]],[\\\"Im\\\",[8465]],[\\\"imof\\\",[8887]],[\\\"imped\\\",[437]],[\\\"Implies\\\",[8658]],[\\\"incare\\\",[8453]],[\\\"in\\\",[8712]],[\\\"infin\\\",[8734]],[\\\"infintie\\\",[10717]],[\\\"inodot\\\",[305]],[\\\"intcal\\\",[8890]],[\\\"int\\\",[8747]],[\\\"Int\\\",[8748]],[\\\"integers\\\",[8484]],[\\\"Integral\\\",[8747]],[\\\"intercal\\\",[8890]],[\\\"Intersection\\\",[8898]],[\\\"intlarhk\\\",[10775]],[\\\"intprod\\\",[10812]],[\\\"InvisibleComma\\\",[8291]],[\\\"InvisibleTimes\\\",[8290]],[\\\"IOcy\\\",[1025]],[\\\"iocy\\\",[1105]],[\\\"Iogon\\\",[302]],[\\\"iogon\\\",[303]],[\\\"Iopf\\\",[120128]],[\\\"iopf\\\",[120154]],[\\\"Iota\\\",[921]],[\\\"iota\\\",[953]],[\\\"iprod\\\",[10812]],[\\\"iquest\\\",[191]],[\\\"iscr\\\",[119998]],[\\\"Iscr\\\",[8464]],[\\\"isin\\\",[8712]],[\\\"isindot\\\",[8949]],[\\\"isinE\\\",[8953]],[\\\"isins\\\",[8948]],[\\\"isinsv\\\",[8947]],[\\\"isinv\\\",[8712]],[\\\"it\\\",[8290]],[\\\"Itilde\\\",[296]],[\\\"itilde\\\",[297]],[\\\"Iukcy\\\",[1030]],[\\\"iukcy\\\",[1110]],[\\\"Iuml\\\",[207]],[\\\"iuml\\\",[239]],[\\\"Jcirc\\\",[308]],[\\\"jcirc\\\",[309]],[\\\"Jcy\\\",[1049]],[\\\"jcy\\\",[1081]],[\\\"Jfr\\\",[120077]],[\\\"jfr\\\",[120103]],[\\\"jmath\\\",[567]],[\\\"Jopf\\\",[120129]],[\\\"jopf\\\",[120155]],[\\\"Jscr\\\",[119973]],[\\\"jscr\\\",[119999]],[\\\"Jsercy\\\",[1032]],[\\\"jsercy\\\",[1112]],[\\\"Jukcy\\\",[1028]],[\\\"jukcy\\\",[1108]],[\\\"Kappa\\\",[922]],[\\\"kappa\\\",[954]],[\\\"kappav\\\",[1008]],[\\\"Kcedil\\\",[310]],[\\\"kcedil\\\",[311]],[\\\"Kcy\\\",[1050]],[\\\"kcy\\\",[1082]],[\\\"Kfr\\\",[120078]],[\\\"kfr\\\",[120104]],[\\\"kgreen\\\",[312]],[\\\"KHcy\\\",[1061]],[\\\"khcy\\\",[1093]],[\\\"KJcy\\\",[1036]],[\\\"kjcy\\\",[1116]],[\\\"Kopf\\\",[120130]],[\\\"kopf\\\",[120156]],[\\\"Kscr\\\",[119974]],[\\\"kscr\\\",[12e4]],[\\\"lAarr\\\",[8666]],[\\\"Lacute\\\",[313]],[\\\"lacute\\\",[314]],[\\\"laemptyv\\\",[10676]],[\\\"lagran\\\",[8466]],[\\\"Lambda\\\",[923]],[\\\"lambda\\\",[955]],[\\\"lang\\\",[10216]],[\\\"Lang\\\",[10218]],[\\\"langd\\\",[10641]],[\\\"langle\\\",[10216]],[\\\"lap\\\",[10885]],[\\\"Laplacetrf\\\",[8466]],[\\\"laquo\\\",[171]],[\\\"larrb\\\",[8676]],[\\\"larrbfs\\\",[10527]],[\\\"larr\\\",[8592]],[\\\"Larr\\\",[8606]],[\\\"lArr\\\",[8656]],[\\\"larrfs\\\",[10525]],[\\\"larrhk\\\",[8617]],[\\\"larrlp\\\",[8619]],[\\\"larrpl\\\",[10553]],[\\\"larrsim\\\",[10611]],[\\\"larrtl\\\",[8610]],[\\\"latail\\\",[10521]],[\\\"lAtail\\\",[10523]],[\\\"lat\\\",[10923]],[\\\"late\\\",[10925]],[\\\"lates\\\",[10925,65024]],[\\\"lbarr\\\",[10508]],[\\\"lBarr\\\",[10510]],[\\\"lbbrk\\\",[10098]],[\\\"lbrace\\\",[123]],[\\\"lbrack\\\",[91]],[\\\"lbrke\\\",[10635]],[\\\"lbrksld\\\",[10639]],[\\\"lbrkslu\\\",[10637]],[\\\"Lcaron\\\",[317]],[\\\"lcaron\\\",[318]],[\\\"Lcedil\\\",[315]],[\\\"lcedil\\\",[316]],[\\\"lceil\\\",[8968]],[\\\"lcub\\\",[123]],[\\\"Lcy\\\",[1051]],[\\\"lcy\\\",[1083]],[\\\"ldca\\\",[10550]],[\\\"ldquo\\\",[8220]],[\\\"ldquor\\\",[8222]],[\\\"ldrdhar\\\",[10599]],[\\\"ldrushar\\\",[10571]],[\\\"ldsh\\\",[8626]],[\\\"le\\\",[8804]],[\\\"lE\\\",[8806]],[\\\"LeftAngleBracket\\\",[10216]],[\\\"LeftArrowBar\\\",[8676]],[\\\"leftarrow\\\",[8592]],[\\\"LeftArrow\\\",[8592]],[\\\"Leftarrow\\\",[8656]],[\\\"LeftArrowRightArrow\\\",[8646]],[\\\"leftarrowtail\\\",[8610]],[\\\"LeftCeiling\\\",[8968]],[\\\"LeftDoubleBracket\\\",[10214]],[\\\"LeftDownTeeVector\\\",[10593]],[\\\"LeftDownVectorBar\\\",[10585]],[\\\"LeftDownVector\\\",[8643]],[\\\"LeftFloor\\\",[8970]],[\\\"leftharpoondown\\\",[8637]],[\\\"leftharpoonup\\\",[8636]],[\\\"leftleftarrows\\\",[8647]],[\\\"leftrightarrow\\\",[8596]],[\\\"LeftRightArrow\\\",[8596]],[\\\"Leftrightarrow\\\",[8660]],[\\\"leftrightarrows\\\",[8646]],[\\\"leftrightharpoons\\\",[8651]],[\\\"leftrightsquigarrow\\\",[8621]],[\\\"LeftRightVector\\\",[10574]],[\\\"LeftTeeArrow\\\",[8612]],[\\\"LeftTee\\\",[8867]],[\\\"LeftTeeVector\\\",[10586]],[\\\"leftthreetimes\\\",[8907]],[\\\"LeftTriangleBar\\\",[10703]],[\\\"LeftTriangle\\\",[8882]],[\\\"LeftTriangleEqual\\\",[8884]],[\\\"LeftUpDownVector\\\",[10577]],[\\\"LeftUpTeeVector\\\",[10592]],[\\\"LeftUpVectorBar\\\",[10584]],[\\\"LeftUpVector\\\",[8639]],[\\\"LeftVectorBar\\\",[10578]],[\\\"LeftVector\\\",[8636]],[\\\"lEg\\\",[10891]],[\\\"leg\\\",[8922]],[\\\"leq\\\",[8804]],[\\\"leqq\\\",[8806]],[\\\"leqslant\\\",[10877]],[\\\"lescc\\\",[10920]],[\\\"les\\\",[10877]],[\\\"lesdot\\\",[10879]],[\\\"lesdoto\\\",[10881]],[\\\"lesdotor\\\",[10883]],[\\\"lesg\\\",[8922,65024]],[\\\"lesges\\\",[10899]],[\\\"lessapprox\\\",[10885]],[\\\"lessdot\\\",[8918]],[\\\"lesseqgtr\\\",[8922]],[\\\"lesseqqgtr\\\",[10891]],[\\\"LessEqualGreater\\\",[8922]],[\\\"LessFullEqual\\\",[8806]],[\\\"LessGreater\\\",[8822]],[\\\"lessgtr\\\",[8822]],[\\\"LessLess\\\",[10913]],[\\\"lesssim\\\",[8818]],[\\\"LessSlantEqual\\\",[10877]],[\\\"LessTilde\\\",[8818]],[\\\"lfisht\\\",[10620]],[\\\"lfloor\\\",[8970]],[\\\"Lfr\\\",[120079]],[\\\"lfr\\\",[120105]],[\\\"lg\\\",[8822]],[\\\"lgE\\\",[10897]],[\\\"lHar\\\",[10594]],[\\\"lhard\\\",[8637]],[\\\"lharu\\\",[8636]],[\\\"lharul\\\",[10602]],[\\\"lhblk\\\",[9604]],[\\\"LJcy\\\",[1033]],[\\\"ljcy\\\",[1113]],[\\\"llarr\\\",[8647]],[\\\"ll\\\",[8810]],[\\\"Ll\\\",[8920]],[\\\"llcorner\\\",[8990]],[\\\"Lleftarrow\\\",[8666]],[\\\"llhard\\\",[10603]],[\\\"lltri\\\",[9722]],[\\\"Lmidot\\\",[319]],[\\\"lmidot\\\",[320]],[\\\"lmoustache\\\",[9136]],[\\\"lmoust\\\",[9136]],[\\\"lnap\\\",[10889]],[\\\"lnapprox\\\",[10889]],[\\\"lne\\\",[10887]],[\\\"lnE\\\",[8808]],[\\\"lneq\\\",[10887]],[\\\"lneqq\\\",[8808]],[\\\"lnsim\\\",[8934]],[\\\"loang\\\",[10220]],[\\\"loarr\\\",[8701]],[\\\"lobrk\\\",[10214]],[\\\"longleftarrow\\\",[10229]],[\\\"LongLeftArrow\\\",[10229]],[\\\"Longleftarrow\\\",[10232]],[\\\"longleftrightarrow\\\",[10231]],[\\\"LongLeftRightArrow\\\",[10231]],[\\\"Longleftrightarrow\\\",[10234]],[\\\"longmapsto\\\",[10236]],[\\\"longrightarrow\\\",[10230]],[\\\"LongRightArrow\\\",[10230]],[\\\"Longrightarrow\\\",[10233]],[\\\"looparrowleft\\\",[8619]],[\\\"looparrowright\\\",[8620]],[\\\"lopar\\\",[10629]],[\\\"Lopf\\\",[120131]],[\\\"lopf\\\",[120157]],[\\\"loplus\\\",[10797]],[\\\"lotimes\\\",[10804]],[\\\"lowast\\\",[8727]],[\\\"lowbar\\\",[95]],[\\\"LowerLeftArrow\\\",[8601]],[\\\"LowerRightArrow\\\",[8600]],[\\\"loz\\\",[9674]],[\\\"lozenge\\\",[9674]],[\\\"lozf\\\",[10731]],[\\\"lpar\\\",[40]],[\\\"lparlt\\\",[10643]],[\\\"lrarr\\\",[8646]],[\\\"lrcorner\\\",[8991]],[\\\"lrhar\\\",[8651]],[\\\"lrhard\\\",[10605]],[\\\"lrm\\\",[8206]],[\\\"lrtri\\\",[8895]],[\\\"lsaquo\\\",[8249]],[\\\"lscr\\\",[120001]],[\\\"Lscr\\\",[8466]],[\\\"lsh\\\",[8624]],[\\\"Lsh\\\",[8624]],[\\\"lsim\\\",[8818]],[\\\"lsime\\\",[10893]],[\\\"lsimg\\\",[10895]],[\\\"lsqb\\\",[91]],[\\\"lsquo\\\",[8216]],[\\\"lsquor\\\",[8218]],[\\\"Lstrok\\\",[321]],[\\\"lstrok\\\",[322]],[\\\"ltcc\\\",[10918]],[\\\"ltcir\\\",[10873]],[\\\"lt\\\",[60]],[\\\"LT\\\",[60]],[\\\"Lt\\\",[8810]],[\\\"ltdot\\\",[8918]],[\\\"lthree\\\",[8907]],[\\\"ltimes\\\",[8905]],[\\\"ltlarr\\\",[10614]],[\\\"ltquest\\\",[10875]],[\\\"ltri\\\",[9667]],[\\\"ltrie\\\",[8884]],[\\\"ltrif\\\",[9666]],[\\\"ltrPar\\\",[10646]],[\\\"lurdshar\\\",[10570]],[\\\"luruhar\\\",[10598]],[\\\"lvertneqq\\\",[8808,65024]],[\\\"lvnE\\\",[8808,65024]],[\\\"macr\\\",[175]],[\\\"male\\\",[9794]],[\\\"malt\\\",[10016]],[\\\"maltese\\\",[10016]],[\\\"Map\\\",[10501]],[\\\"map\\\",[8614]],[\\\"mapsto\\\",[8614]],[\\\"mapstodown\\\",[8615]],[\\\"mapstoleft\\\",[8612]],[\\\"mapstoup\\\",[8613]],[\\\"marker\\\",[9646]],[\\\"mcomma\\\",[10793]],[\\\"Mcy\\\",[1052]],[\\\"mcy\\\",[1084]],[\\\"mdash\\\",[8212]],[\\\"mDDot\\\",[8762]],[\\\"measuredangle\\\",[8737]],[\\\"MediumSpace\\\",[8287]],[\\\"Mellintrf\\\",[8499]],[\\\"Mfr\\\",[120080]],[\\\"mfr\\\",[120106]],[\\\"mho\\\",[8487]],[\\\"micro\\\",[181]],[\\\"midast\\\",[42]],[\\\"midcir\\\",[10992]],[\\\"mid\\\",[8739]],[\\\"middot\\\",[183]],[\\\"minusb\\\",[8863]],[\\\"minus\\\",[8722]],[\\\"minusd\\\",[8760]],[\\\"minusdu\\\",[10794]],[\\\"MinusPlus\\\",[8723]],[\\\"mlcp\\\",[10971]],[\\\"mldr\\\",[8230]],[\\\"mnplus\\\",[8723]],[\\\"models\\\",[8871]],[\\\"Mopf\\\",[120132]],[\\\"mopf\\\",[120158]],[\\\"mp\\\",[8723]],[\\\"mscr\\\",[120002]],[\\\"Mscr\\\",[8499]],[\\\"mstpos\\\",[8766]],[\\\"Mu\\\",[924]],[\\\"mu\\\",[956]],[\\\"multimap\\\",[8888]],[\\\"mumap\\\",[8888]],[\\\"nabla\\\",[8711]],[\\\"Nacute\\\",[323]],[\\\"nacute\\\",[324]],[\\\"nang\\\",[8736,8402]],[\\\"nap\\\",[8777]],[\\\"napE\\\",[10864,824]],[\\\"napid\\\",[8779,824]],[\\\"napos\\\",[329]],[\\\"napprox\\\",[8777]],[\\\"natural\\\",[9838]],[\\\"naturals\\\",[8469]],[\\\"natur\\\",[9838]],[\\\"nbsp\\\",[160]],[\\\"nbump\\\",[8782,824]],[\\\"nbumpe\\\",[8783,824]],[\\\"ncap\\\",[10819]],[\\\"Ncaron\\\",[327]],[\\\"ncaron\\\",[328]],[\\\"Ncedil\\\",[325]],[\\\"ncedil\\\",[326]],[\\\"ncong\\\",[8775]],[\\\"ncongdot\\\",[10861,824]],[\\\"ncup\\\",[10818]],[\\\"Ncy\\\",[1053]],[\\\"ncy\\\",[1085]],[\\\"ndash\\\",[8211]],[\\\"nearhk\\\",[10532]],[\\\"nearr\\\",[8599]],[\\\"neArr\\\",[8663]],[\\\"nearrow\\\",[8599]],[\\\"ne\\\",[8800]],[\\\"nedot\\\",[8784,824]],[\\\"NegativeMediumSpace\\\",[8203]],[\\\"NegativeThickSpace\\\",[8203]],[\\\"NegativeThinSpace\\\",[8203]],[\\\"NegativeVeryThinSpace\\\",[8203]],[\\\"nequiv\\\",[8802]],[\\\"nesear\\\",[10536]],[\\\"nesim\\\",[8770,824]],[\\\"NestedGreaterGreater\\\",[8811]],[\\\"NestedLessLess\\\",[8810]],[\\\"nexist\\\",[8708]],[\\\"nexists\\\",[8708]],[\\\"Nfr\\\",[120081]],[\\\"nfr\\\",[120107]],[\\\"ngE\\\",[8807,824]],[\\\"nge\\\",[8817]],[\\\"ngeq\\\",[8817]],[\\\"ngeqq\\\",[8807,824]],[\\\"ngeqslant\\\",[10878,824]],[\\\"nges\\\",[10878,824]],[\\\"nGg\\\",[8921,824]],[\\\"ngsim\\\",[8821]],[\\\"nGt\\\",[8811,8402]],[\\\"ngt\\\",[8815]],[\\\"ngtr\\\",[8815]],[\\\"nGtv\\\",[8811,824]],[\\\"nharr\\\",[8622]],[\\\"nhArr\\\",[8654]],[\\\"nhpar\\\",[10994]],[\\\"ni\\\",[8715]],[\\\"nis\\\",[8956]],[\\\"nisd\\\",[8954]],[\\\"niv\\\",[8715]],[\\\"NJcy\\\",[1034]],[\\\"njcy\\\",[1114]],[\\\"nlarr\\\",[8602]],[\\\"nlArr\\\",[8653]],[\\\"nldr\\\",[8229]],[\\\"nlE\\\",[8806,824]],[\\\"nle\\\",[8816]],[\\\"nleftarrow\\\",[8602]],[\\\"nLeftarrow\\\",[8653]],[\\\"nleftrightarrow\\\",[8622]],[\\\"nLeftrightarrow\\\",[8654]],[\\\"nleq\\\",[8816]],[\\\"nleqq\\\",[8806,824]],[\\\"nleqslant\\\",[10877,824]],[\\\"nles\\\",[10877,824]],[\\\"nless\\\",[8814]],[\\\"nLl\\\",[8920,824]],[\\\"nlsim\\\",[8820]],[\\\"nLt\\\",[8810,8402]],[\\\"nlt\\\",[8814]],[\\\"nltri\\\",[8938]],[\\\"nltrie\\\",[8940]],[\\\"nLtv\\\",[8810,824]],[\\\"nmid\\\",[8740]],[\\\"NoBreak\\\",[8288]],[\\\"NonBreakingSpace\\\",[160]],[\\\"nopf\\\",[120159]],[\\\"Nopf\\\",[8469]],[\\\"Not\\\",[10988]],[\\\"not\\\",[172]],[\\\"NotCongruent\\\",[8802]],[\\\"NotCupCap\\\",[8813]],[\\\"NotDoubleVerticalBar\\\",[8742]],[\\\"NotElement\\\",[8713]],[\\\"NotEqual\\\",[8800]],[\\\"NotEqualTilde\\\",[8770,824]],[\\\"NotExists\\\",[8708]],[\\\"NotGreater\\\",[8815]],[\\\"NotGreaterEqual\\\",[8817]],[\\\"NotGreaterFullEqual\\\",[8807,824]],[\\\"NotGreaterGreater\\\",[8811,824]],[\\\"NotGreaterLess\\\",[8825]],[\\\"NotGreaterSlantEqual\\\",[10878,824]],[\\\"NotGreaterTilde\\\",[8821]],[\\\"NotHumpDownHump\\\",[8782,824]],[\\\"NotHumpEqual\\\",[8783,824]],[\\\"notin\\\",[8713]],[\\\"notindot\\\",[8949,824]],[\\\"notinE\\\",[8953,824]],[\\\"notinva\\\",[8713]],[\\\"notinvb\\\",[8951]],[\\\"notinvc\\\",[8950]],[\\\"NotLeftTriangleBar\\\",[10703,824]],[\\\"NotLeftTriangle\\\",[8938]],[\\\"NotLeftTriangleEqual\\\",[8940]],[\\\"NotLess\\\",[8814]],[\\\"NotLessEqual\\\",[8816]],[\\\"NotLessGreater\\\",[8824]],[\\\"NotLessLess\\\",[8810,824]],[\\\"NotLessSlantEqual\\\",[10877,824]],[\\\"NotLessTilde\\\",[8820]],[\\\"NotNestedGreaterGreater\\\",[10914,824]],[\\\"NotNestedLessLess\\\",[10913,824]],[\\\"notni\\\",[8716]],[\\\"notniva\\\",[8716]],[\\\"notnivb\\\",[8958]],[\\\"notnivc\\\",[8957]],[\\\"NotPrecedes\\\",[8832]],[\\\"NotPrecedesEqual\\\",[10927,824]],[\\\"NotPrecedesSlantEqual\\\",[8928]],[\\\"NotReverseElement\\\",[8716]],[\\\"NotRightTriangleBar\\\",[10704,824]],[\\\"NotRightTriangle\\\",[8939]],[\\\"NotRightTriangleEqual\\\",[8941]],[\\\"NotSquareSubset\\\",[8847,824]],[\\\"NotSquareSubsetEqual\\\",[8930]],[\\\"NotSquareSuperset\\\",[8848,824]],[\\\"NotSquareSupersetEqual\\\",[8931]],[\\\"NotSubset\\\",[8834,8402]],[\\\"NotSubsetEqual\\\",[8840]],[\\\"NotSucceeds\\\",[8833]],[\\\"NotSucceedsEqual\\\",[10928,824]],[\\\"NotSucceedsSlantEqual\\\",[8929]],[\\\"NotSucceedsTilde\\\",[8831,824]],[\\\"NotSuperset\\\",[8835,8402]],[\\\"NotSupersetEqual\\\",[8841]],[\\\"NotTilde\\\",[8769]],[\\\"NotTildeEqual\\\",[8772]],[\\\"NotTildeFullEqual\\\",[8775]],[\\\"NotTildeTilde\\\",[8777]],[\\\"NotVerticalBar\\\",[8740]],[\\\"nparallel\\\",[8742]],[\\\"npar\\\",[8742]],[\\\"nparsl\\\",[11005,8421]],[\\\"npart\\\",[8706,824]],[\\\"npolint\\\",[10772]],[\\\"npr\\\",[8832]],[\\\"nprcue\\\",[8928]],[\\\"nprec\\\",[8832]],[\\\"npreceq\\\",[10927,824]],[\\\"npre\\\",[10927,824]],[\\\"nrarrc\\\",[10547,824]],[\\\"nrarr\\\",[8603]],[\\\"nrArr\\\",[8655]],[\\\"nrarrw\\\",[8605,824]],[\\\"nrightarrow\\\",[8603]],[\\\"nRightarrow\\\",[8655]],[\\\"nrtri\\\",[8939]],[\\\"nrtrie\\\",[8941]],[\\\"nsc\\\",[8833]],[\\\"nsccue\\\",[8929]],[\\\"nsce\\\",[10928,824]],[\\\"Nscr\\\",[119977]],[\\\"nscr\\\",[120003]],[\\\"nshortmid\\\",[8740]],[\\\"nshortparallel\\\",[8742]],[\\\"nsim\\\",[8769]],[\\\"nsime\\\",[8772]],[\\\"nsimeq\\\",[8772]],[\\\"nsmid\\\",[8740]],[\\\"nspar\\\",[8742]],[\\\"nsqsube\\\",[8930]],[\\\"nsqsupe\\\",[8931]],[\\\"nsub\\\",[8836]],[\\\"nsubE\\\",[10949,824]],[\\\"nsube\\\",[8840]],[\\\"nsubset\\\",[8834,8402]],[\\\"nsubseteq\\\",[8840]],[\\\"nsubseteqq\\\",[10949,824]],[\\\"nsucc\\\",[8833]],[\\\"nsucceq\\\",[10928,824]],[\\\"nsup\\\",[8837]],[\\\"nsupE\\\",[10950,824]],[\\\"nsupe\\\",[8841]],[\\\"nsupset\\\",[8835,8402]],[\\\"nsupseteq\\\",[8841]],[\\\"nsupseteqq\\\",[10950,824]],[\\\"ntgl\\\",[8825]],[\\\"Ntilde\\\",[209]],[\\\"ntilde\\\",[241]],[\\\"ntlg\\\",[8824]],[\\\"ntriangleleft\\\",[8938]],[\\\"ntrianglelefteq\\\",[8940]],[\\\"ntriangleright\\\",[8939]],[\\\"ntrianglerighteq\\\",[8941]],[\\\"Nu\\\",[925]],[\\\"nu\\\",[957]],[\\\"num\\\",[35]],[\\\"numero\\\",[8470]],[\\\"numsp\\\",[8199]],[\\\"nvap\\\",[8781,8402]],[\\\"nvdash\\\",[8876]],[\\\"nvDash\\\",[8877]],[\\\"nVdash\\\",[8878]],[\\\"nVDash\\\",[8879]],[\\\"nvge\\\",[8805,8402]],[\\\"nvgt\\\",[62,8402]],[\\\"nvHarr\\\",[10500]],[\\\"nvinfin\\\",[10718]],[\\\"nvlArr\\\",[10498]],[\\\"nvle\\\",[8804,8402]],[\\\"nvlt\\\",[60,8402]],[\\\"nvltrie\\\",[8884,8402]],[\\\"nvrArr\\\",[10499]],[\\\"nvrtrie\\\",[8885,8402]],[\\\"nvsim\\\",[8764,8402]],[\\\"nwarhk\\\",[10531]],[\\\"nwarr\\\",[8598]],[\\\"nwArr\\\",[8662]],[\\\"nwarrow\\\",[8598]],[\\\"nwnear\\\",[10535]],[\\\"Oacute\\\",[211]],[\\\"oacute\\\",[243]],[\\\"oast\\\",[8859]],[\\\"Ocirc\\\",[212]],[\\\"ocirc\\\",[244]],[\\\"ocir\\\",[8858]],[\\\"Ocy\\\",[1054]],[\\\"ocy\\\",[1086]],[\\\"odash\\\",[8861]],[\\\"Odblac\\\",[336]],[\\\"odblac\\\",[337]],[\\\"odiv\\\",[10808]],[\\\"odot\\\",[8857]],[\\\"odsold\\\",[10684]],[\\\"OElig\\\",[338]],[\\\"oelig\\\",[339]],[\\\"ofcir\\\",[10687]],[\\\"Ofr\\\",[120082]],[\\\"ofr\\\",[120108]],[\\\"ogon\\\",[731]],[\\\"Ograve\\\",[210]],[\\\"ograve\\\",[242]],[\\\"ogt\\\",[10689]],[\\\"ohbar\\\",[10677]],[\\\"ohm\\\",[937]],[\\\"oint\\\",[8750]],[\\\"olarr\\\",[8634]],[\\\"olcir\\\",[10686]],[\\\"olcross\\\",[10683]],[\\\"oline\\\",[8254]],[\\\"olt\\\",[10688]],[\\\"Omacr\\\",[332]],[\\\"omacr\\\",[333]],[\\\"Omega\\\",[937]],[\\\"omega\\\",[969]],[\\\"Omicron\\\",[927]],[\\\"omicron\\\",[959]],[\\\"omid\\\",[10678]],[\\\"ominus\\\",[8854]],[\\\"Oopf\\\",[120134]],[\\\"oopf\\\",[120160]],[\\\"opar\\\",[10679]],[\\\"OpenCurlyDoubleQuote\\\",[8220]],[\\\"OpenCurlyQuote\\\",[8216]],[\\\"operp\\\",[10681]],[\\\"oplus\\\",[8853]],[\\\"orarr\\\",[8635]],[\\\"Or\\\",[10836]],[\\\"or\\\",[8744]],[\\\"ord\\\",[10845]],[\\\"order\\\",[8500]],[\\\"orderof\\\",[8500]],[\\\"ordf\\\",[170]],[\\\"ordm\\\",[186]],[\\\"origof\\\",[8886]],[\\\"oror\\\",[10838]],[\\\"orslope\\\",[10839]],[\\\"orv\\\",[10843]],[\\\"oS\\\",[9416]],[\\\"Oscr\\\",[119978]],[\\\"oscr\\\",[8500]],[\\\"Oslash\\\",[216]],[\\\"oslash\\\",[248]],[\\\"osol\\\",[8856]],[\\\"Otilde\\\",[213]],[\\\"otilde\\\",[245]],[\\\"otimesas\\\",[10806]],[\\\"Otimes\\\",[10807]],[\\\"otimes\\\",[8855]],[\\\"Ouml\\\",[214]],[\\\"ouml\\\",[246]],[\\\"ovbar\\\",[9021]],[\\\"OverBar\\\",[8254]],[\\\"OverBrace\\\",[9182]],[\\\"OverBracket\\\",[9140]],[\\\"OverParenthesis\\\",[9180]],[\\\"para\\\",[182]],[\\\"parallel\\\",[8741]],[\\\"par\\\",[8741]],[\\\"parsim\\\",[10995]],[\\\"parsl\\\",[11005]],[\\\"part\\\",[8706]],[\\\"PartialD\\\",[8706]],[\\\"Pcy\\\",[1055]],[\\\"pcy\\\",[1087]],[\\\"percnt\\\",[37]],[\\\"period\\\",[46]],[\\\"permil\\\",[8240]],[\\\"perp\\\",[8869]],[\\\"pertenk\\\",[8241]],[\\\"Pfr\\\",[120083]],[\\\"pfr\\\",[120109]],[\\\"Phi\\\",[934]],[\\\"phi\\\",[966]],[\\\"phiv\\\",[981]],[\\\"phmmat\\\",[8499]],[\\\"phone\\\",[9742]],[\\\"Pi\\\",[928]],[\\\"pi\\\",[960]],[\\\"pitchfork\\\",[8916]],[\\\"piv\\\",[982]],[\\\"planck\\\",[8463]],[\\\"planckh\\\",[8462]],[\\\"plankv\\\",[8463]],[\\\"plusacir\\\",[10787]],[\\\"plusb\\\",[8862]],[\\\"pluscir\\\",[10786]],[\\\"plus\\\",[43]],[\\\"plusdo\\\",[8724]],[\\\"plusdu\\\",[10789]],[\\\"pluse\\\",[10866]],[\\\"PlusMinus\\\",[177]],[\\\"plusmn\\\",[177]],[\\\"plussim\\\",[10790]],[\\\"plustwo\\\",[10791]],[\\\"pm\\\",[177]],[\\\"Poincareplane\\\",[8460]],[\\\"pointint\\\",[10773]],[\\\"popf\\\",[120161]],[\\\"Popf\\\",[8473]],[\\\"pound\\\",[163]],[\\\"prap\\\",[10935]],[\\\"Pr\\\",[10939]],[\\\"pr\\\",[8826]],[\\\"prcue\\\",[8828]],[\\\"precapprox\\\",[10935]],[\\\"prec\\\",[8826]],[\\\"preccurlyeq\\\",[8828]],[\\\"Precedes\\\",[8826]],[\\\"PrecedesEqual\\\",[10927]],[\\\"PrecedesSlantEqual\\\",[8828]],[\\\"PrecedesTilde\\\",[8830]],[\\\"preceq\\\",[10927]],[\\\"precnapprox\\\",[10937]],[\\\"precneqq\\\",[10933]],[\\\"precnsim\\\",[8936]],[\\\"pre\\\",[10927]],[\\\"prE\\\",[10931]],[\\\"precsim\\\",[8830]],[\\\"prime\\\",[8242]],[\\\"Prime\\\",[8243]],[\\\"primes\\\",[8473]],[\\\"prnap\\\",[10937]],[\\\"prnE\\\",[10933]],[\\\"prnsim\\\",[8936]],[\\\"prod\\\",[8719]],[\\\"Product\\\",[8719]],[\\\"profalar\\\",[9006]],[\\\"profline\\\",[8978]],[\\\"profsurf\\\",[8979]],[\\\"prop\\\",[8733]],[\\\"Proportional\\\",[8733]],[\\\"Proportion\\\",[8759]],[\\\"propto\\\",[8733]],[\\\"prsim\\\",[8830]],[\\\"prurel\\\",[8880]],[\\\"Pscr\\\",[119979]],[\\\"pscr\\\",[120005]],[\\\"Psi\\\",[936]],[\\\"psi\\\",[968]],[\\\"puncsp\\\",[8200]],[\\\"Qfr\\\",[120084]],[\\\"qfr\\\",[120110]],[\\\"qint\\\",[10764]],[\\\"qopf\\\",[120162]],[\\\"Qopf\\\",[8474]],[\\\"qprime\\\",[8279]],[\\\"Qscr\\\",[119980]],[\\\"qscr\\\",[120006]],[\\\"quaternions\\\",[8461]],[\\\"quatint\\\",[10774]],[\\\"quest\\\",[63]],[\\\"questeq\\\",[8799]],[\\\"quot\\\",[34]],[\\\"QUOT\\\",[34]],[\\\"rAarr\\\",[8667]],[\\\"race\\\",[8765,817]],[\\\"Racute\\\",[340]],[\\\"racute\\\",[341]],[\\\"radic\\\",[8730]],[\\\"raemptyv\\\",[10675]],[\\\"rang\\\",[10217]],[\\\"Rang\\\",[10219]],[\\\"rangd\\\",[10642]],[\\\"range\\\",[10661]],[\\\"rangle\\\",[10217]],[\\\"raquo\\\",[187]],[\\\"rarrap\\\",[10613]],[\\\"rarrb\\\",[8677]],[\\\"rarrbfs\\\",[10528]],[\\\"rarrc\\\",[10547]],[\\\"rarr\\\",[8594]],[\\\"Rarr\\\",[8608]],[\\\"rArr\\\",[8658]],[\\\"rarrfs\\\",[10526]],[\\\"rarrhk\\\",[8618]],[\\\"rarrlp\\\",[8620]],[\\\"rarrpl\\\",[10565]],[\\\"rarrsim\\\",[10612]],[\\\"Rarrtl\\\",[10518]],[\\\"rarrtl\\\",[8611]],[\\\"rarrw\\\",[8605]],[\\\"ratail\\\",[10522]],[\\\"rAtail\\\",[10524]],[\\\"ratio\\\",[8758]],[\\\"rationals\\\",[8474]],[\\\"rbarr\\\",[10509]],[\\\"rBarr\\\",[10511]],[\\\"RBarr\\\",[10512]],[\\\"rbbrk\\\",[10099]],[\\\"rbrace\\\",[125]],[\\\"rbrack\\\",[93]],[\\\"rbrke\\\",[10636]],[\\\"rbrksld\\\",[10638]],[\\\"rbrkslu\\\",[10640]],[\\\"Rcaron\\\",[344]],[\\\"rcaron\\\",[345]],[\\\"Rcedil\\\",[342]],[\\\"rcedil\\\",[343]],[\\\"rceil\\\",[8969]],[\\\"rcub\\\",[125]],[\\\"Rcy\\\",[1056]],[\\\"rcy\\\",[1088]],[\\\"rdca\\\",[10551]],[\\\"rdldhar\\\",[10601]],[\\\"rdquo\\\",[8221]],[\\\"rdquor\\\",[8221]],[\\\"CloseCurlyDoubleQuote\\\",[8221]],[\\\"rdsh\\\",[8627]],[\\\"real\\\",[8476]],[\\\"realine\\\",[8475]],[\\\"realpart\\\",[8476]],[\\\"reals\\\",[8477]],[\\\"Re\\\",[8476]],[\\\"rect\\\",[9645]],[\\\"reg\\\",[174]],[\\\"REG\\\",[174]],[\\\"ReverseElement\\\",[8715]],[\\\"ReverseEquilibrium\\\",[8651]],[\\\"ReverseUpEquilibrium\\\",[10607]],[\\\"rfisht\\\",[10621]],[\\\"rfloor\\\",[8971]],[\\\"rfr\\\",[120111]],[\\\"Rfr\\\",[8476]],[\\\"rHar\\\",[10596]],[\\\"rhard\\\",[8641]],[\\\"rharu\\\",[8640]],[\\\"rharul\\\",[10604]],[\\\"Rho\\\",[929]],[\\\"rho\\\",[961]],[\\\"rhov\\\",[1009]],[\\\"RightAngleBracket\\\",[10217]],[\\\"RightArrowBar\\\",[8677]],[\\\"rightarrow\\\",[8594]],[\\\"RightArrow\\\",[8594]],[\\\"Rightarrow\\\",[8658]],[\\\"RightArrowLeftArrow\\\",[8644]],[\\\"rightarrowtail\\\",[8611]],[\\\"RightCeiling\\\",[8969]],[\\\"RightDoubleBracket\\\",[10215]],[\\\"RightDownTeeVector\\\",[10589]],[\\\"RightDownVectorBar\\\",[10581]],[\\\"RightDownVector\\\",[8642]],[\\\"RightFloor\\\",[8971]],[\\\"rightharpoondown\\\",[8641]],[\\\"rightharpoonup\\\",[8640]],[\\\"rightleftarrows\\\",[8644]],[\\\"rightleftharpoons\\\",[8652]],[\\\"rightrightarrows\\\",[8649]],[\\\"rightsquigarrow\\\",[8605]],[\\\"RightTeeArrow\\\",[8614]],[\\\"RightTee\\\",[8866]],[\\\"RightTeeVector\\\",[10587]],[\\\"rightthreetimes\\\",[8908]],[\\\"RightTriangleBar\\\",[10704]],[\\\"RightTriangle\\\",[8883]],[\\\"RightTriangleEqual\\\",[8885]],[\\\"RightUpDownVector\\\",[10575]],[\\\"RightUpTeeVector\\\",[10588]],[\\\"RightUpVectorBar\\\",[10580]],[\\\"RightUpVector\\\",[8638]],[\\\"RightVectorBar\\\",[10579]],[\\\"RightVector\\\",[8640]],[\\\"ring\\\",[730]],[\\\"risingdotseq\\\",[8787]],[\\\"rlarr\\\",[8644]],[\\\"rlhar\\\",[8652]],[\\\"rlm\\\",[8207]],[\\\"rmoustache\\\",[9137]],[\\\"rmoust\\\",[9137]],[\\\"rnmid\\\",[10990]],[\\\"roang\\\",[10221]],[\\\"roarr\\\",[8702]],[\\\"robrk\\\",[10215]],[\\\"ropar\\\",[10630]],[\\\"ropf\\\",[120163]],[\\\"Ropf\\\",[8477]],[\\\"roplus\\\",[10798]],[\\\"rotimes\\\",[10805]],[\\\"RoundImplies\\\",[10608]],[\\\"rpar\\\",[41]],[\\\"rpargt\\\",[10644]],[\\\"rppolint\\\",[10770]],[\\\"rrarr\\\",[8649]],[\\\"Rrightarrow\\\",[8667]],[\\\"rsaquo\\\",[8250]],[\\\"rscr\\\",[120007]],[\\\"Rscr\\\",[8475]],[\\\"rsh\\\",[8625]],[\\\"Rsh\\\",[8625]],[\\\"rsqb\\\",[93]],[\\\"rsquo\\\",[8217]],[\\\"rsquor\\\",[8217]],[\\\"CloseCurlyQuote\\\",[8217]],[\\\"rthree\\\",[8908]],[\\\"rtimes\\\",[8906]],[\\\"rtri\\\",[9657]],[\\\"rtrie\\\",[8885]],[\\\"rtrif\\\",[9656]],[\\\"rtriltri\\\",[10702]],[\\\"RuleDelayed\\\",[10740]],[\\\"ruluhar\\\",[10600]],[\\\"rx\\\",[8478]],[\\\"Sacute\\\",[346]],[\\\"sacute\\\",[347]],[\\\"sbquo\\\",[8218]],[\\\"scap\\\",[10936]],[\\\"Scaron\\\",[352]],[\\\"scaron\\\",[353]],[\\\"Sc\\\",[10940]],[\\\"sc\\\",[8827]],[\\\"sccue\\\",[8829]],[\\\"sce\\\",[10928]],[\\\"scE\\\",[10932]],[\\\"Scedil\\\",[350]],[\\\"scedil\\\",[351]],[\\\"Scirc\\\",[348]],[\\\"scirc\\\",[349]],[\\\"scnap\\\",[10938]],[\\\"scnE\\\",[10934]],[\\\"scnsim\\\",[8937]],[\\\"scpolint\\\",[10771]],[\\\"scsim\\\",[8831]],[\\\"Scy\\\",[1057]],[\\\"scy\\\",[1089]],[\\\"sdotb\\\",[8865]],[\\\"sdot\\\",[8901]],[\\\"sdote\\\",[10854]],[\\\"searhk\\\",[10533]],[\\\"searr\\\",[8600]],[\\\"seArr\\\",[8664]],[\\\"searrow\\\",[8600]],[\\\"sect\\\",[167]],[\\\"semi\\\",[59]],[\\\"seswar\\\",[10537]],[\\\"setminus\\\",[8726]],[\\\"setmn\\\",[8726]],[\\\"sext\\\",[10038]],[\\\"Sfr\\\",[120086]],[\\\"sfr\\\",[120112]],[\\\"sfrown\\\",[8994]],[\\\"sharp\\\",[9839]],[\\\"SHCHcy\\\",[1065]],[\\\"shchcy\\\",[1097]],[\\\"SHcy\\\",[1064]],[\\\"shcy\\\",[1096]],[\\\"ShortDownArrow\\\",[8595]],[\\\"ShortLeftArrow\\\",[8592]],[\\\"shortmid\\\",[8739]],[\\\"shortparallel\\\",[8741]],[\\\"ShortRightArrow\\\",[8594]],[\\\"ShortUpArrow\\\",[8593]],[\\\"shy\\\",[173]],[\\\"Sigma\\\",[931]],[\\\"sigma\\\",[963]],[\\\"sigmaf\\\",[962]],[\\\"sigmav\\\",[962]],[\\\"sim\\\",[8764]],[\\\"simdot\\\",[10858]],[\\\"sime\\\",[8771]],[\\\"simeq\\\",[8771]],[\\\"simg\\\",[10910]],[\\\"simgE\\\",[10912]],[\\\"siml\\\",[10909]],[\\\"simlE\\\",[10911]],[\\\"simne\\\",[8774]],[\\\"simplus\\\",[10788]],[\\\"simrarr\\\",[10610]],[\\\"slarr\\\",[8592]],[\\\"SmallCircle\\\",[8728]],[\\\"smallsetminus\\\",[8726]],[\\\"smashp\\\",[10803]],[\\\"smeparsl\\\",[10724]],[\\\"smid\\\",[8739]],[\\\"smile\\\",[8995]],[\\\"smt\\\",[10922]],[\\\"smte\\\",[10924]],[\\\"smtes\\\",[10924,65024]],[\\\"SOFTcy\\\",[1068]],[\\\"softcy\\\",[1100]],[\\\"solbar\\\",[9023]],[\\\"solb\\\",[10692]],[\\\"sol\\\",[47]],[\\\"Sopf\\\",[120138]],[\\\"sopf\\\",[120164]],[\\\"spades\\\",[9824]],[\\\"spadesuit\\\",[9824]],[\\\"spar\\\",[8741]],[\\\"sqcap\\\",[8851]],[\\\"sqcaps\\\",[8851,65024]],[\\\"sqcup\\\",[8852]],[\\\"sqcups\\\",[8852,65024]],[\\\"Sqrt\\\",[8730]],[\\\"sqsub\\\",[8847]],[\\\"sqsube\\\",[8849]],[\\\"sqsubset\\\",[8847]],[\\\"sqsubseteq\\\",[8849]],[\\\"sqsup\\\",[8848]],[\\\"sqsupe\\\",[8850]],[\\\"sqsupset\\\",[8848]],[\\\"sqsupseteq\\\",[8850]],[\\\"square\\\",[9633]],[\\\"Square\\\",[9633]],[\\\"SquareIntersection\\\",[8851]],[\\\"SquareSubset\\\",[8847]],[\\\"SquareSubsetEqual\\\",[8849]],[\\\"SquareSuperset\\\",[8848]],[\\\"SquareSupersetEqual\\\",[8850]],[\\\"SquareUnion\\\",[8852]],[\\\"squarf\\\",[9642]],[\\\"squ\\\",[9633]],[\\\"squf\\\",[9642]],[\\\"srarr\\\",[8594]],[\\\"Sscr\\\",[119982]],[\\\"sscr\\\",[120008]],[\\\"ssetmn\\\",[8726]],[\\\"ssmile\\\",[8995]],[\\\"sstarf\\\",[8902]],[\\\"Star\\\",[8902]],[\\\"star\\\",[9734]],[\\\"starf\\\",[9733]],[\\\"straightepsilon\\\",[1013]],[\\\"straightphi\\\",[981]],[\\\"strns\\\",[175]],[\\\"sub\\\",[8834]],[\\\"Sub\\\",[8912]],[\\\"subdot\\\",[10941]],[\\\"subE\\\",[10949]],[\\\"sube\\\",[8838]],[\\\"subedot\\\",[10947]],[\\\"submult\\\",[10945]],[\\\"subnE\\\",[10955]],[\\\"subne\\\",[8842]],[\\\"subplus\\\",[10943]],[\\\"subrarr\\\",[10617]],[\\\"subset\\\",[8834]],[\\\"Subset\\\",[8912]],[\\\"subseteq\\\",[8838]],[\\\"subseteqq\\\",[10949]],[\\\"SubsetEqual\\\",[8838]],[\\\"subsetneq\\\",[8842]],[\\\"subsetneqq\\\",[10955]],[\\\"subsim\\\",[10951]],[\\\"subsub\\\",[10965]],[\\\"subsup\\\",[10963]],[\\\"succapprox\\\",[10936]],[\\\"succ\\\",[8827]],[\\\"succcurlyeq\\\",[8829]],[\\\"Succeeds\\\",[8827]],[\\\"SucceedsEqual\\\",[10928]],[\\\"SucceedsSlantEqual\\\",[8829]],[\\\"SucceedsTilde\\\",[8831]],[\\\"succeq\\\",[10928]],[\\\"succnapprox\\\",[10938]],[\\\"succneqq\\\",[10934]],[\\\"succnsim\\\",[8937]],[\\\"succsim\\\",[8831]],[\\\"SuchThat\\\",[8715]],[\\\"sum\\\",[8721]],[\\\"Sum\\\",[8721]],[\\\"sung\\\",[9834]],[\\\"sup1\\\",[185]],[\\\"sup2\\\",[178]],[\\\"sup3\\\",[179]],[\\\"sup\\\",[8835]],[\\\"Sup\\\",[8913]],[\\\"supdot\\\",[10942]],[\\\"supdsub\\\",[10968]],[\\\"supE\\\",[10950]],[\\\"supe\\\",[8839]],[\\\"supedot\\\",[10948]],[\\\"Superset\\\",[8835]],[\\\"SupersetEqual\\\",[8839]],[\\\"suphsol\\\",[10185]],[\\\"suphsub\\\",[10967]],[\\\"suplarr\\\",[10619]],[\\\"supmult\\\",[10946]],[\\\"supnE\\\",[10956]],[\\\"supne\\\",[8843]],[\\\"supplus\\\",[10944]],[\\\"supset\\\",[8835]],[\\\"Supset\\\",[8913]],[\\\"supseteq\\\",[8839]],[\\\"supseteqq\\\",[10950]],[\\\"supsetneq\\\",[8843]],[\\\"supsetneqq\\\",[10956]],[\\\"supsim\\\",[10952]],[\\\"supsub\\\",[10964]],[\\\"supsup\\\",[10966]],[\\\"swarhk\\\",[10534]],[\\\"swarr\\\",[8601]],[\\\"swArr\\\",[8665]],[\\\"swarrow\\\",[8601]],[\\\"swnwar\\\",[10538]],[\\\"szlig\\\",[223]],[\\\"Tab\\\",[9]],[\\\"target\\\",[8982]],[\\\"Tau\\\",[932]],[\\\"tau\\\",[964]],[\\\"tbrk\\\",[9140]],[\\\"Tcaron\\\",[356]],[\\\"tcaron\\\",[357]],[\\\"Tcedil\\\",[354]],[\\\"tcedil\\\",[355]],[\\\"Tcy\\\",[1058]],[\\\"tcy\\\",[1090]],[\\\"tdot\\\",[8411]],[\\\"telrec\\\",[8981]],[\\\"Tfr\\\",[120087]],[\\\"tfr\\\",[120113]],[\\\"there4\\\",[8756]],[\\\"therefore\\\",[8756]],[\\\"Therefore\\\",[8756]],[\\\"Theta\\\",[920]],[\\\"theta\\\",[952]],[\\\"thetasym\\\",[977]],[\\\"thetav\\\",[977]],[\\\"thickapprox\\\",[8776]],[\\\"thicksim\\\",[8764]],[\\\"ThickSpace\\\",[8287,8202]],[\\\"ThinSpace\\\",[8201]],[\\\"thinsp\\\",[8201]],[\\\"thkap\\\",[8776]],[\\\"thksim\\\",[8764]],[\\\"THORN\\\",[222]],[\\\"thorn\\\",[254]],[\\\"tilde\\\",[732]],[\\\"Tilde\\\",[8764]],[\\\"TildeEqual\\\",[8771]],[\\\"TildeFullEqual\\\",[8773]],[\\\"TildeTilde\\\",[8776]],[\\\"timesbar\\\",[10801]],[\\\"timesb\\\",[8864]],[\\\"times\\\",[215]],[\\\"timesd\\\",[10800]],[\\\"tint\\\",[8749]],[\\\"toea\\\",[10536]],[\\\"topbot\\\",[9014]],[\\\"topcir\\\",[10993]],[\\\"top\\\",[8868]],[\\\"Topf\\\",[120139]],[\\\"topf\\\",[120165]],[\\\"topfork\\\",[10970]],[\\\"tosa\\\",[10537]],[\\\"tprime\\\",[8244]],[\\\"trade\\\",[8482]],[\\\"TRADE\\\",[8482]],[\\\"triangle\\\",[9653]],[\\\"triangledown\\\",[9663]],[\\\"triangleleft\\\",[9667]],[\\\"trianglelefteq\\\",[8884]],[\\\"triangleq\\\",[8796]],[\\\"triangleright\\\",[9657]],[\\\"trianglerighteq\\\",[8885]],[\\\"tridot\\\",[9708]],[\\\"trie\\\",[8796]],[\\\"triminus\\\",[10810]],[\\\"TripleDot\\\",[8411]],[\\\"triplus\\\",[10809]],[\\\"trisb\\\",[10701]],[\\\"tritime\\\",[10811]],[\\\"trpezium\\\",[9186]],[\\\"Tscr\\\",[119983]],[\\\"tscr\\\",[120009]],[\\\"TScy\\\",[1062]],[\\\"tscy\\\",[1094]],[\\\"TSHcy\\\",[1035]],[\\\"tshcy\\\",[1115]],[\\\"Tstrok\\\",[358]],[\\\"tstrok\\\",[359]],[\\\"twixt\\\",[8812]],[\\\"twoheadleftarrow\\\",[8606]],[\\\"twoheadrightarrow\\\",[8608]],[\\\"Uacute\\\",[218]],[\\\"uacute\\\",[250]],[\\\"uarr\\\",[8593]],[\\\"Uarr\\\",[8607]],[\\\"uArr\\\",[8657]],[\\\"Uarrocir\\\",[10569]],[\\\"Ubrcy\\\",[1038]],[\\\"ubrcy\\\",[1118]],[\\\"Ubreve\\\",[364]],[\\\"ubreve\\\",[365]],[\\\"Ucirc\\\",[219]],[\\\"ucirc\\\",[251]],[\\\"Ucy\\\",[1059]],[\\\"ucy\\\",[1091]],[\\\"udarr\\\",[8645]],[\\\"Udblac\\\",[368]],[\\\"udblac\\\",[369]],[\\\"udhar\\\",[10606]],[\\\"ufisht\\\",[10622]],[\\\"Ufr\\\",[120088]],[\\\"ufr\\\",[120114]],[\\\"Ugrave\\\",[217]],[\\\"ugrave\\\",[249]],[\\\"uHar\\\",[10595]],[\\\"uharl\\\",[8639]],[\\\"uharr\\\",[8638]],[\\\"uhblk\\\",[9600]],[\\\"ulcorn\\\",[8988]],[\\\"ulcorner\\\",[8988]],[\\\"ulcrop\\\",[8975]],[\\\"ultri\\\",[9720]],[\\\"Umacr\\\",[362]],[\\\"umacr\\\",[363]],[\\\"uml\\\",[168]],[\\\"UnderBar\\\",[95]],[\\\"UnderBrace\\\",[9183]],[\\\"UnderBracket\\\",[9141]],[\\\"UnderParenthesis\\\",[9181]],[\\\"Union\\\",[8899]],[\\\"UnionPlus\\\",[8846]],[\\\"Uogon\\\",[370]],[\\\"uogon\\\",[371]],[\\\"Uopf\\\",[120140]],[\\\"uopf\\\",[120166]],[\\\"UpArrowBar\\\",[10514]],[\\\"uparrow\\\",[8593]],[\\\"UpArrow\\\",[8593]],[\\\"Uparrow\\\",[8657]],[\\\"UpArrowDownArrow\\\",[8645]],[\\\"updownarrow\\\",[8597]],[\\\"UpDownArrow\\\",[8597]],[\\\"Updownarrow\\\",[8661]],[\\\"UpEquilibrium\\\",[10606]],[\\\"upharpoonleft\\\",[8639]],[\\\"upharpoonright\\\",[8638]],[\\\"uplus\\\",[8846]],[\\\"UpperLeftArrow\\\",[8598]],[\\\"UpperRightArrow\\\",[8599]],[\\\"upsi\\\",[965]],[\\\"Upsi\\\",[978]],[\\\"upsih\\\",[978]],[\\\"Upsilon\\\",[933]],[\\\"upsilon\\\",[965]],[\\\"UpTeeArrow\\\",[8613]],[\\\"UpTee\\\",[8869]],[\\\"upuparrows\\\",[8648]],[\\\"urcorn\\\",[8989]],[\\\"urcorner\\\",[8989]],[\\\"urcrop\\\",[8974]],[\\\"Uring\\\",[366]],[\\\"uring\\\",[367]],[\\\"urtri\\\",[9721]],[\\\"Uscr\\\",[119984]],[\\\"uscr\\\",[120010]],[\\\"utdot\\\",[8944]],[\\\"Utilde\\\",[360]],[\\\"utilde\\\",[361]],[\\\"utri\\\",[9653]],[\\\"utrif\\\",[9652]],[\\\"uuarr\\\",[8648]],[\\\"Uuml\\\",[220]],[\\\"uuml\\\",[252]],[\\\"uwangle\\\",[10663]],[\\\"vangrt\\\",[10652]],[\\\"varepsilon\\\",[1013]],[\\\"varkappa\\\",[1008]],[\\\"varnothing\\\",[8709]],[\\\"varphi\\\",[981]],[\\\"varpi\\\",[982]],[\\\"varpropto\\\",[8733]],[\\\"varr\\\",[8597]],[\\\"vArr\\\",[8661]],[\\\"varrho\\\",[1009]],[\\\"varsigma\\\",[962]],[\\\"varsubsetneq\\\",[8842,65024]],[\\\"varsubsetneqq\\\",[10955,65024]],[\\\"varsupsetneq\\\",[8843,65024]],[\\\"varsupsetneqq\\\",[10956,65024]],[\\\"vartheta\\\",[977]],[\\\"vartriangleleft\\\",[8882]],[\\\"vartriangleright\\\",[8883]],[\\\"vBar\\\",[10984]],[\\\"Vbar\\\",[10987]],[\\\"vBarv\\\",[10985]],[\\\"Vcy\\\",[1042]],[\\\"vcy\\\",[1074]],[\\\"vdash\\\",[8866]],[\\\"vDash\\\",[8872]],[\\\"Vdash\\\",[8873]],[\\\"VDash\\\",[8875]],[\\\"Vdashl\\\",[10982]],[\\\"veebar\\\",[8891]],[\\\"vee\\\",[8744]],[\\\"Vee\\\",[8897]],[\\\"veeeq\\\",[8794]],[\\\"vellip\\\",[8942]],[\\\"verbar\\\",[124]],[\\\"Verbar\\\",[8214]],[\\\"vert\\\",[124]],[\\\"Vert\\\",[8214]],[\\\"VerticalBar\\\",[8739]],[\\\"VerticalLine\\\",[124]],[\\\"VerticalSeparator\\\",[10072]],[\\\"VerticalTilde\\\",[8768]],[\\\"VeryThinSpace\\\",[8202]],[\\\"Vfr\\\",[120089]],[\\\"vfr\\\",[120115]],[\\\"vltri\\\",[8882]],[\\\"vnsub\\\",[8834,8402]],[\\\"vnsup\\\",[8835,8402]],[\\\"Vopf\\\",[120141]],[\\\"vopf\\\",[120167]],[\\\"vprop\\\",[8733]],[\\\"vrtri\\\",[8883]],[\\\"Vscr\\\",[119985]],[\\\"vscr\\\",[120011]],[\\\"vsubnE\\\",[10955,65024]],[\\\"vsubne\\\",[8842,65024]],[\\\"vsupnE\\\",[10956,65024]],[\\\"vsupne\\\",[8843,65024]],[\\\"Vvdash\\\",[8874]],[\\\"vzigzag\\\",[10650]],[\\\"Wcirc\\\",[372]],[\\\"wcirc\\\",[373]],[\\\"wedbar\\\",[10847]],[\\\"wedge\\\",[8743]],[\\\"Wedge\\\",[8896]],[\\\"wedgeq\\\",[8793]],[\\\"weierp\\\",[8472]],[\\\"Wfr\\\",[120090]],[\\\"wfr\\\",[120116]],[\\\"Wopf\\\",[120142]],[\\\"wopf\\\",[120168]],[\\\"wp\\\",[8472]],[\\\"wr\\\",[8768]],[\\\"wreath\\\",[8768]],[\\\"Wscr\\\",[119986]],[\\\"wscr\\\",[120012]],[\\\"xcap\\\",[8898]],[\\\"xcirc\\\",[9711]],[\\\"xcup\\\",[8899]],[\\\"xdtri\\\",[9661]],[\\\"Xfr\\\",[120091]],[\\\"xfr\\\",[120117]],[\\\"xharr\\\",[10231]],[\\\"xhArr\\\",[10234]],[\\\"Xi\\\",[926]],[\\\"xi\\\",[958]],[\\\"xlarr\\\",[10229]],[\\\"xlArr\\\",[10232]],[\\\"xmap\\\",[10236]],[\\\"xnis\\\",[8955]],[\\\"xodot\\\",[10752]],[\\\"Xopf\\\",[120143]],[\\\"xopf\\\",[120169]],[\\\"xoplus\\\",[10753]],[\\\"xotime\\\",[10754]],[\\\"xrarr\\\",[10230]],[\\\"xrArr\\\",[10233]],[\\\"Xscr\\\",[119987]],[\\\"xscr\\\",[120013]],[\\\"xsqcup\\\",[10758]],[\\\"xuplus\\\",[10756]],[\\\"xutri\\\",[9651]],[\\\"xvee\\\",[8897]],[\\\"xwedge\\\",[8896]],[\\\"Yacute\\\",[221]],[\\\"yacute\\\",[253]],[\\\"YAcy\\\",[1071]],[\\\"yacy\\\",[1103]],[\\\"Ycirc\\\",[374]],[\\\"ycirc\\\",[375]],[\\\"Ycy\\\",[1067]],[\\\"ycy\\\",[1099]],[\\\"yen\\\",[165]],[\\\"Yfr\\\",[120092]],[\\\"yfr\\\",[120118]],[\\\"YIcy\\\",[1031]],[\\\"yicy\\\",[1111]],[\\\"Yopf\\\",[120144]],[\\\"yopf\\\",[120170]],[\\\"Yscr\\\",[119988]],[\\\"yscr\\\",[120014]],[\\\"YUcy\\\",[1070]],[\\\"yucy\\\",[1102]],[\\\"yuml\\\",[255]],[\\\"Yuml\\\",[376]],[\\\"Zacute\\\",[377]],[\\\"zacute\\\",[378]],[\\\"Zcaron\\\",[381]],[\\\"zcaron\\\",[382]],[\\\"Zcy\\\",[1047]],[\\\"zcy\\\",[1079]],[\\\"Zdot\\\",[379]],[\\\"zdot\\\",[380]],[\\\"zeetrf\\\",[8488]],[\\\"ZeroWidthSpace\\\",[8203]],[\\\"Zeta\\\",[918]],[\\\"zeta\\\",[950]],[\\\"zfr\\\",[120119]],[\\\"Zfr\\\",[8488]],[\\\"ZHcy\\\",[1046]],[\\\"zhcy\\\",[1078]],[\\\"zigrarr\\\",[8669]],[\\\"zopf\\\",[120171]],[\\\"Zopf\\\",[8484]],[\\\"Zscr\\\",[119989]],[\\\"zscr\\\",[120015]],[\\\"zwj\\\",[8205]],[\\\"zwnj\\\",[8204]]],u={},o={};!function(e,t){for(var n=r.length,u=[];n--;){var o,a=r[n],i=a[0],l=a[1],s=l[0],c=s<32||s>126||62===s||60===s||38===s||34===s||39===s;if(c&&(o=t[s]=t[s]||{}),l[1]){var p=l[1];e[i]=String.fromCharCode(s)+String.fromCharCode(p),u.push(c&&(o[p]=i))}else e[i]=String.fromCharCode(s),u.push(c&&(o[\\\"\\\"]=i))}}(u,o),n.prototype.decode=function(e){return e&&e.length?e.replace(/&(#?[\\\\w\\\\d]+);?/g,function(e,t){var n;if(\\\"#\\\"===t.charAt(0)){var r=\\\"x\\\"===t.charAt(1)?parseInt(t.substr(2).toLowerCase(),16):parseInt(t.substr(1));isNaN(r)||r<-32768||r>65535||(n=String.fromCharCode(r))}else n=u[t];return n||e}):\\\"\\\"},n.decode=function(e){return(new n).decode(e)},n.prototype.encode=function(e){if(!e||!e.length)return\\\"\\\";for(var t=e.length,n=\\\"\\\",r=0;r<t;){var u=o[e.charCodeAt(r)];if(u){var a=u[e.charCodeAt(r+1)];if(a?r++:a=u[\\\"\\\"],a){n+=\\\"&\\\"+a+\\\";\\\",r++;continue}}n+=e.charAt(r),r++}return n},n.encode=function(e){return(new n).encode(e)},n.prototype.encodeNonUTF=function(e){if(!e||!e.length)return\\\"\\\";for(var t=e.length,n=\\\"\\\",r=0;r<t;){var u=e.charCodeAt(r),a=o[u];if(a){var i=a[e.charCodeAt(r+1)];if(i?r++:i=a[\\\"\\\"],i){n+=\\\"&\\\"+i+\\\";\\\",r++;continue}}n+=u<32||u>126?\\\"&#\\\"+u+\\\";\\\":e.charAt(r),r++}return n},n.encodeNonUTF=function(e){return(new n).encodeNonUTF(e)},n.prototype.encodeNonASCII=function(e){if(!e||!e.length)return\\\"\\\";for(var t=e.length,n=\\\"\\\",r=0;r<t;){var u=e.charCodeAt(r);u<=255?n+=e[r++]:(n+=\\\"&#\\\"+u+\\\";\\\",r++)}return n},n.encodeNonASCII=function(e){return(new n).encodeNonASCII(e)},e.exports=n},function(e,t,n){\\\"use strict\\\";function r(e,t){e.setAttribute(\\\"style\\\",\\\"\\\");for(var n in t)t.hasOwnProperty(n)&&(e.style[n]=t[n])}n.d(t,\\\"a\\\",function(){return r})},function(e,t){!function(){\\\"use strict\\\";function t(e){return 48<=e&&e<=57}function n(e){return 48<=e&&e<=57||97<=e&&e<=102||65<=e&&e<=70}function r(e){return e>=48&&e<=55}function u(e){return 32===e||9===e||11===e||12===e||160===e||e>=5760&&d.indexOf(e)>=0}function o(e){return 10===e||13===e||8232===e||8233===e}function a(e){return e<=65535?String.fromCharCode(e):String.fromCharCode(Math.floor((e-65536)/1024)+55296)+String.fromCharCode((e-65536)%1024+56320)}function i(e){return e<128?D[e]:f.NonAsciiIdentifierStart.test(a(e))}function l(e){return e<128?h[e]:f.NonAsciiIdentifierPart.test(a(e))}function s(e){return e<128?D[e]:p.NonAsciiIdentifierStart.test(a(e))}function c(e){return e<128?h[e]:p.NonAsciiIdentifierPart.test(a(e))}var p,f,d,D,h,g;for(f={NonAsciiIdentifierStart:/[\\\\xAA\\\\xB5\\\\xBA\\\\xC0-\\\\xD6\\\\xD8-\\\\xF6\\\\xF8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0370-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u037F\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u048A-\\\\u052F\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0620-\\\\u064A\\\\u066E\\\\u066F\\\\u0671-\\\\u06D3\\\\u06D5\\\\u06E5\\\\u06E6\\\\u06EE\\\\u06EF\\\\u06FA-\\\\u06FC\\\\u06FF\\\\u0710\\\\u0712-\\\\u072F\\\\u074D-\\\\u07A5\\\\u07B1\\\\u07CA-\\\\u07EA\\\\u07F4\\\\u07F5\\\\u07FA\\\\u0800-\\\\u0815\\\\u081A\\\\u0824\\\\u0828\\\\u0840-\\\\u0858\\\\u08A0-\\\\u08B2\\\\u0904-\\\\u0939\\\\u093D\\\\u0950\\\\u0958-\\\\u0961\\\\u0971-\\\\u0980\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BD\\\\u09CE\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E1\\\\u09F0\\\\u09F1\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A72-\\\\u0A74\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABD\\\\u0AD0\\\\u0AE0\\\\u0AE1\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3D\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B61\\\\u0B71\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BD0\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C39\\\\u0C3D\\\\u0C58\\\\u0C59\\\\u0C60\\\\u0C61\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBD\\\\u0CDE\\\\u0CE0\\\\u0CE1\\\\u0CF1\\\\u0CF2\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D3A\\\\u0D3D\\\\u0D4E\\\\u0D60\\\\u0D61\\\\u0D7A-\\\\u0D7F\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0E01-\\\\u0E30\\\\u0E32\\\\u0E33\\\\u0E40-\\\\u0E46\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB0\\\\u0EB2\\\\u0EB3\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EDC-\\\\u0EDF\\\\u0F00\\\\u0F40-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F88-\\\\u0F8C\\\\u1000-\\\\u102A\\\\u103F\\\\u1050-\\\\u1055\\\\u105A-\\\\u105D\\\\u1061\\\\u1065\\\\u1066\\\\u106E-\\\\u1070\\\\u1075-\\\\u1081\\\\u108E\\\\u10A0-\\\\u10C5\\\\u10C7\\\\u10CD\\\\u10D0-\\\\u10FA\\\\u10FC-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F4\\\\u1401-\\\\u166C\\\\u166F-\\\\u167F\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u16EE-\\\\u16F8\\\\u1700-\\\\u170C\\\\u170E-\\\\u1711\\\\u1720-\\\\u1731\\\\u1740-\\\\u1751\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1780-\\\\u17B3\\\\u17D7\\\\u17DC\\\\u1820-\\\\u1877\\\\u1880-\\\\u18A8\\\\u18AA\\\\u18B0-\\\\u18F5\\\\u1900-\\\\u191E\\\\u1950-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19AB\\\\u19C1-\\\\u19C7\\\\u1A00-\\\\u1A16\\\\u1A20-\\\\u1A54\\\\u1AA7\\\\u1B05-\\\\u1B33\\\\u1B45-\\\\u1B4B\\\\u1B83-\\\\u1BA0\\\\u1BAE\\\\u1BAF\\\\u1BBA-\\\\u1BE5\\\\u1C00-\\\\u1C23\\\\u1C4D-\\\\u1C4F\\\\u1C5A-\\\\u1C7D\\\\u1CE9-\\\\u1CEC\\\\u1CEE-\\\\u1CF1\\\\u1CF5\\\\u1CF6\\\\u1D00-\\\\u1DBF\\\\u1E00-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u2071\\\\u207F\\\\u2090-\\\\u209C\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2160-\\\\u2188\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2CE4\\\\u2CEB-\\\\u2CEE\\\\u2CF2\\\\u2CF3\\\\u2D00-\\\\u2D25\\\\u2D27\\\\u2D2D\\\\u2D30-\\\\u2D67\\\\u2D6F\\\\u2D80-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2E2F\\\\u3005-\\\\u3007\\\\u3021-\\\\u3029\\\\u3031-\\\\u3035\\\\u3038-\\\\u303C\\\\u3041-\\\\u3096\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31BA\\\\u31F0-\\\\u31FF\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FCC\\\\uA000-\\\\uA48C\\\\uA4D0-\\\\uA4FD\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA61F\\\\uA62A\\\\uA62B\\\\uA640-\\\\uA66E\\\\uA67F-\\\\uA69D\\\\uA6A0-\\\\uA6EF\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B-\\\\uA78E\\\\uA790-\\\\uA7AD\\\\uA7B0\\\\uA7B1\\\\uA7F7-\\\\uA801\\\\uA803-\\\\uA805\\\\uA807-\\\\uA80A\\\\uA80C-\\\\uA822\\\\uA840-\\\\uA873\\\\uA882-\\\\uA8B3\\\\uA8F2-\\\\uA8F7\\\\uA8FB\\\\uA90A-\\\\uA925\\\\uA930-\\\\uA946\\\\uA960-\\\\uA97C\\\\uA984-\\\\uA9B2\\\\uA9CF\\\\uA9E0-\\\\uA9E4\\\\uA9E6-\\\\uA9EF\\\\uA9FA-\\\\uA9FE\\\\uAA00-\\\\uAA28\\\\uAA40-\\\\uAA42\\\\uAA44-\\\\uAA4B\\\\uAA60-\\\\uAA76\\\\uAA7A\\\\uAA7E-\\\\uAAAF\\\\uAAB1\\\\uAAB5\\\\uAAB6\\\\uAAB9-\\\\uAABD\\\\uAAC0\\\\uAAC2\\\\uAADB-\\\\uAADD\\\\uAAE0-\\\\uAAEA\\\\uAAF2-\\\\uAAF4\\\\uAB01-\\\\uAB06\\\\uAB09-\\\\uAB0E\\\\uAB11-\\\\uAB16\\\\uAB20-\\\\uAB26\\\\uAB28-\\\\uAB2E\\\\uAB30-\\\\uAB5A\\\\uAB5C-\\\\uAB5F\\\\uAB64\\\\uAB65\\\\uABC0-\\\\uABE2\\\\uAC00-\\\\uD7A3\\\\uD7B0-\\\\uD7C6\\\\uD7CB-\\\\uD7FB\\\\uF900-\\\\uFA6D\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D\\\\uFB1F-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF21-\\\\uFF3A\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC]/,NonAsciiIdentifierPart:/[\\\\xAA\\\\xB5\\\\xBA\\\\xC0-\\\\xD6\\\\xD8-\\\\xF6\\\\xF8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0300-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u037F\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u0483-\\\\u0487\\\\u048A-\\\\u052F\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u0591-\\\\u05BD\\\\u05BF\\\\u05C1\\\\u05C2\\\\u05C4\\\\u05C5\\\\u05C7\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0610-\\\\u061A\\\\u0620-\\\\u0669\\\\u066E-\\\\u06D3\\\\u06D5-\\\\u06DC\\\\u06DF-\\\\u06E8\\\\u06EA-\\\\u06FC\\\\u06FF\\\\u0710-\\\\u074A\\\\u074D-\\\\u07B1\\\\u07C0-\\\\u07F5\\\\u07FA\\\\u0800-\\\\u082D\\\\u0840-\\\\u085B\\\\u08A0-\\\\u08B2\\\\u08E4-\\\\u0963\\\\u0966-\\\\u096F\\\\u0971-\\\\u0983\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BC-\\\\u09C4\\\\u09C7\\\\u09C8\\\\u09CB-\\\\u09CE\\\\u09D7\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E3\\\\u09E6-\\\\u09F1\\\\u0A01-\\\\u0A03\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A3C\\\\u0A3E-\\\\u0A42\\\\u0A47\\\\u0A48\\\\u0A4B-\\\\u0A4D\\\\u0A51\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A66-\\\\u0A75\\\\u0A81-\\\\u0A83\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABC-\\\\u0AC5\\\\u0AC7-\\\\u0AC9\\\\u0ACB-\\\\u0ACD\\\\u0AD0\\\\u0AE0-\\\\u0AE3\\\\u0AE6-\\\\u0AEF\\\\u0B01-\\\\u0B03\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3C-\\\\u0B44\\\\u0B47\\\\u0B48\\\\u0B4B-\\\\u0B4D\\\\u0B56\\\\u0B57\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B63\\\\u0B66-\\\\u0B6F\\\\u0B71\\\\u0B82\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BBE-\\\\u0BC2\\\\u0BC6-\\\\u0BC8\\\\u0BCA-\\\\u0BCD\\\\u0BD0\\\\u0BD7\\\\u0BE6-\\\\u0BEF\\\\u0C00-\\\\u0C03\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C39\\\\u0C3D-\\\\u0C44\\\\u0C46-\\\\u0C48\\\\u0C4A-\\\\u0C4D\\\\u0C55\\\\u0C56\\\\u0C58\\\\u0C59\\\\u0C60-\\\\u0C63\\\\u0C66-\\\\u0C6F\\\\u0C81-\\\\u0C83\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBC-\\\\u0CC4\\\\u0CC6-\\\\u0CC8\\\\u0CCA-\\\\u0CCD\\\\u0CD5\\\\u0CD6\\\\u0CDE\\\\u0CE0-\\\\u0CE3\\\\u0CE6-\\\\u0CEF\\\\u0CF1\\\\u0CF2\\\\u0D01-\\\\u0D03\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D3A\\\\u0D3D-\\\\u0D44\\\\u0D46-\\\\u0D48\\\\u0D4A-\\\\u0D4E\\\\u0D57\\\\u0D60-\\\\u0D63\\\\u0D66-\\\\u0D6F\\\\u0D7A-\\\\u0D7F\\\\u0D82\\\\u0D83\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0DCA\\\\u0DCF-\\\\u0DD4\\\\u0DD6\\\\u0DD8-\\\\u0DDF\\\\u0DE6-\\\\u0DEF\\\\u0DF2\\\\u0DF3\\\\u0E01-\\\\u0E3A\\\\u0E40-\\\\u0E4E\\\\u0E50-\\\\u0E59\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB9\\\\u0EBB-\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EC8-\\\\u0ECD\\\\u0ED0-\\\\u0ED9\\\\u0EDC-\\\\u0EDF\\\\u0F00\\\\u0F18\\\\u0F19\\\\u0F20-\\\\u0F29\\\\u0F35\\\\u0F37\\\\u0F39\\\\u0F3E-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F71-\\\\u0F84\\\\u0F86-\\\\u0F97\\\\u0F99-\\\\u0FBC\\\\u0FC6\\\\u1000-\\\\u1049\\\\u1050-\\\\u109D\\\\u10A0-\\\\u10C5\\\\u10C7\\\\u10CD\\\\u10D0-\\\\u10FA\\\\u10FC-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u135D-\\\\u135F\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F4\\\\u1401-\\\\u166C\\\\u166F-\\\\u167F\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u16EE-\\\\u16F8\\\\u1700-\\\\u170C\\\\u170E-\\\\u1714\\\\u1720-\\\\u1734\\\\u1740-\\\\u1753\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1772\\\\u1773\\\\u1780-\\\\u17D3\\\\u17D7\\\\u17DC\\\\u17DD\\\\u17E0-\\\\u17E9\\\\u180B-\\\\u180D\\\\u1810-\\\\u1819\\\\u1820-\\\\u1877\\\\u1880-\\\\u18AA\\\\u18B0-\\\\u18F5\\\\u1900-\\\\u191E\\\\u1920-\\\\u192B\\\\u1930-\\\\u193B\\\\u1946-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19AB\\\\u19B0-\\\\u19C9\\\\u19D0-\\\\u19D9\\\\u1A00-\\\\u1A1B\\\\u1A20-\\\\u1A5E\\\\u1A60-\\\\u1A7C\\\\u1A7F-\\\\u1A89\\\\u1A90-\\\\u1A99\\\\u1AA7\\\\u1AB0-\\\\u1ABD\\\\u1B00-\\\\u1B4B\\\\u1B50-\\\\u1B59\\\\u1B6B-\\\\u1B73\\\\u1B80-\\\\u1BF3\\\\u1C00-\\\\u1C37\\\\u1C40-\\\\u1C49\\\\u1C4D-\\\\u1C7D\\\\u1CD0-\\\\u1CD2\\\\u1CD4-\\\\u1CF6\\\\u1CF8\\\\u1CF9\\\\u1D00-\\\\u1DF5\\\\u1DFC-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u200C\\\\u200D\\\\u203F\\\\u2040\\\\u2054\\\\u2071\\\\u207F\\\\u2090-\\\\u209C\\\\u20D0-\\\\u20DC\\\\u20E1\\\\u20E5-\\\\u20F0\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2160-\\\\u2188\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2CE4\\\\u2CEB-\\\\u2CF3\\\\u2D00-\\\\u2D25\\\\u2D27\\\\u2D2D\\\\u2D30-\\\\u2D67\\\\u2D6F\\\\u2D7F-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2DE0-\\\\u2DFF\\\\u2E2F\\\\u3005-\\\\u3007\\\\u3021-\\\\u302F\\\\u3031-\\\\u3035\\\\u3038-\\\\u303C\\\\u3041-\\\\u3096\\\\u3099\\\\u309A\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31BA\\\\u31F0-\\\\u31FF\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FCC\\\\uA000-\\\\uA48C\\\\uA4D0-\\\\uA4FD\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA62B\\\\uA640-\\\\uA66F\\\\uA674-\\\\uA67D\\\\uA67F-\\\\uA69D\\\\uA69F-\\\\uA6F1\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B-\\\\uA78E\\\\uA790-\\\\uA7AD\\\\uA7B0\\\\uA7B1\\\\uA7F7-\\\\uA827\\\\uA840-\\\\uA873\\\\uA880-\\\\uA8C4\\\\uA8D0-\\\\uA8D9\\\\uA8E0-\\\\uA8F7\\\\uA8FB\\\\uA900-\\\\uA92D\\\\uA930-\\\\uA953\\\\uA960-\\\\uA97C\\\\uA980-\\\\uA9C0\\\\uA9CF-\\\\uA9D9\\\\uA9E0-\\\\uA9FE\\\\uAA00-\\\\uAA36\\\\uAA40-\\\\uAA4D\\\\uAA50-\\\\uAA59\\\\uAA60-\\\\uAA76\\\\uAA7A-\\\\uAAC2\\\\uAADB-\\\\uAADD\\\\uAAE0-\\\\uAAEF\\\\uAAF2-\\\\uAAF6\\\\uAB01-\\\\uAB06\\\\uAB09-\\\\uAB0E\\\\uAB11-\\\\uAB16\\\\uAB20-\\\\uAB26\\\\uAB28-\\\\uAB2E\\\\uAB30-\\\\uAB5A\\\\uAB5C-\\\\uAB5F\\\\uAB64\\\\uAB65\\\\uABC0-\\\\uABEA\\\\uABEC\\\\uABED\\\\uABF0-\\\\uABF9\\\\uAC00-\\\\uD7A3\\\\uD7B0-\\\\uD7C6\\\\uD7CB-\\\\uD7FB\\\\uF900-\\\\uFA6D\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE00-\\\\uFE0F\\\\uFE20-\\\\uFE2D\\\\uFE33\\\\uFE34\\\\uFE4D-\\\\uFE4F\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF10-\\\\uFF19\\\\uFF21-\\\\uFF3A\\\\uFF3F\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC]/},p={NonAsciiIdentifierStart:/[\\\\xAA\\\\xB5\\\\xBA\\\\xC0-\\\\xD6\\\\xD8-\\\\xF6\\\\xF8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0370-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u037F\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u048A-\\\\u052F\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0620-\\\\u064A\\\\u066E\\\\u066F\\\\u0671-\\\\u06D3\\\\u06D5\\\\u06E5\\\\u06E6\\\\u06EE\\\\u06EF\\\\u06FA-\\\\u06FC\\\\u06FF\\\\u0710\\\\u0712-\\\\u072F\\\\u074D-\\\\u07A5\\\\u07B1\\\\u07CA-\\\\u07EA\\\\u07F4\\\\u07F5\\\\u07FA\\\\u0800-\\\\u0815\\\\u081A\\\\u0824\\\\u0828\\\\u0840-\\\\u0858\\\\u08A0-\\\\u08B2\\\\u0904-\\\\u0939\\\\u093D\\\\u0950\\\\u0958-\\\\u0961\\\\u0971-\\\\u0980\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BD\\\\u09CE\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E1\\\\u09F0\\\\u09F1\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A72-\\\\u0A74\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABD\\\\u0AD0\\\\u0AE0\\\\u0AE1\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3D\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B61\\\\u0B71\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BD0\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C39\\\\u0C3D\\\\u0C58\\\\u0C59\\\\u0C60\\\\u0C61\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBD\\\\u0CDE\\\\u0CE0\\\\u0CE1\\\\u0CF1\\\\u0CF2\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D3A\\\\u0D3D\\\\u0D4E\\\\u0D60\\\\u0D61\\\\u0D7A-\\\\u0D7F\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0E01-\\\\u0E30\\\\u0E32\\\\u0E33\\\\u0E40-\\\\u0E46\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB0\\\\u0EB2\\\\u0EB3\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EDC-\\\\u0EDF\\\\u0F00\\\\u0F40-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F88-\\\\u0F8C\\\\u1000-\\\\u102A\\\\u103F\\\\u1050-\\\\u1055\\\\u105A-\\\\u105D\\\\u1061\\\\u1065\\\\u1066\\\\u106E-\\\\u1070\\\\u1075-\\\\u1081\\\\u108E\\\\u10A0-\\\\u10C5\\\\u10C7\\\\u10CD\\\\u10D0-\\\\u10FA\\\\u10FC-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F4\\\\u1401-\\\\u166C\\\\u166F-\\\\u167F\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u16EE-\\\\u16F8\\\\u1700-\\\\u170C\\\\u170E-\\\\u1711\\\\u1720-\\\\u1731\\\\u1740-\\\\u1751\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1780-\\\\u17B3\\\\u17D7\\\\u17DC\\\\u1820-\\\\u1877\\\\u1880-\\\\u18A8\\\\u18AA\\\\u18B0-\\\\u18F5\\\\u1900-\\\\u191E\\\\u1950-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19AB\\\\u19C1-\\\\u19C7\\\\u1A00-\\\\u1A16\\\\u1A20-\\\\u1A54\\\\u1AA7\\\\u1B05-\\\\u1B33\\\\u1B45-\\\\u1B4B\\\\u1B83-\\\\u1BA0\\\\u1BAE\\\\u1BAF\\\\u1BBA-\\\\u1BE5\\\\u1C00-\\\\u1C23\\\\u1C4D-\\\\u1C4F\\\\u1C5A-\\\\u1C7D\\\\u1CE9-\\\\u1CEC\\\\u1CEE-\\\\u1CF1\\\\u1CF5\\\\u1CF6\\\\u1D00-\\\\u1DBF\\\\u1E00-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u2071\\\\u207F\\\\u2090-\\\\u209C\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2118-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2160-\\\\u2188\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2CE4\\\\u2CEB-\\\\u2CEE\\\\u2CF2\\\\u2CF3\\\\u2D00-\\\\u2D25\\\\u2D27\\\\u2D2D\\\\u2D30-\\\\u2D67\\\\u2D6F\\\\u2D80-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u3005-\\\\u3007\\\\u3021-\\\\u3029\\\\u3031-\\\\u3035\\\\u3038-\\\\u303C\\\\u3041-\\\\u3096\\\\u309B-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31BA\\\\u31F0-\\\\u31FF\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FCC\\\\uA000-\\\\uA48C\\\\uA4D0-\\\\uA4FD\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA61F\\\\uA62A\\\\uA62B\\\\uA640-\\\\uA66E\\\\uA67F-\\\\uA69D\\\\uA6A0-\\\\uA6EF\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B-\\\\uA78E\\\\uA790-\\\\uA7AD\\\\uA7B0\\\\uA7B1\\\\uA7F7-\\\\uA801\\\\uA803-\\\\uA805\\\\uA807-\\\\uA80A\\\\uA80C-\\\\uA822\\\\uA840-\\\\uA873\\\\uA882-\\\\uA8B3\\\\uA8F2-\\\\uA8F7\\\\uA8FB\\\\uA90A-\\\\uA925\\\\uA930-\\\\uA946\\\\uA960-\\\\uA97C\\\\uA984-\\\\uA9B2\\\\uA9CF\\\\uA9E0-\\\\uA9E4\\\\uA9E6-\\\\uA9EF\\\\uA9FA-\\\\uA9FE\\\\uAA00-\\\\uAA28\\\\uAA40-\\\\uAA42\\\\uAA44-\\\\uAA4B\\\\uAA60-\\\\uAA76\\\\uAA7A\\\\uAA7E-\\\\uAAAF\\\\uAAB1\\\\uAAB5\\\\uAAB6\\\\uAAB9-\\\\uAABD\\\\uAAC0\\\\uAAC2\\\\uAADB-\\\\uAADD\\\\uAAE0-\\\\uAAEA\\\\uAAF2-\\\\uAAF4\\\\uAB01-\\\\uAB06\\\\uAB09-\\\\uAB0E\\\\uAB11-\\\\uAB16\\\\uAB20-\\\\uAB26\\\\uAB28-\\\\uAB2E\\\\uAB30-\\\\uAB5A\\\\uAB5C-\\\\uAB5F\\\\uAB64\\\\uAB65\\\\uABC0-\\\\uABE2\\\\uAC00-\\\\uD7A3\\\\uD7B0-\\\\uD7C6\\\\uD7CB-\\\\uD7FB\\\\uF900-\\\\uFA6D\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D\\\\uFB1F-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF21-\\\\uFF3A\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC]|\\\\uD800[\\\\uDC00-\\\\uDC0B\\\\uDC0D-\\\\uDC26\\\\uDC28-\\\\uDC3A\\\\uDC3C\\\\uDC3D\\\\uDC3F-\\\\uDC4D\\\\uDC50-\\\\uDC5D\\\\uDC80-\\\\uDCFA\\\\uDD40-\\\\uDD74\\\\uDE80-\\\\uDE9C\\\\uDEA0-\\\\uDED0\\\\uDF00-\\\\uDF1F\\\\uDF30-\\\\uDF4A\\\\uDF50-\\\\uDF75\\\\uDF80-\\\\uDF9D\\\\uDFA0-\\\\uDFC3\\\\uDFC8-\\\\uDFCF\\\\uDFD1-\\\\uDFD5]|\\\\uD801[\\\\uDC00-\\\\uDC9D\\\\uDD00-\\\\uDD27\\\\uDD30-\\\\uDD63\\\\uDE00-\\\\uDF36\\\\uDF40-\\\\uDF55\\\\uDF60-\\\\uDF67]|\\\\uD802[\\\\uDC00-\\\\uDC05\\\\uDC08\\\\uDC0A-\\\\uDC35\\\\uDC37\\\\uDC38\\\\uDC3C\\\\uDC3F-\\\\uDC55\\\\uDC60-\\\\uDC76\\\\uDC80-\\\\uDC9E\\\\uDD00-\\\\uDD15\\\\uDD20-\\\\uDD39\\\\uDD80-\\\\uDDB7\\\\uDDBE\\\\uDDBF\\\\uDE00\\\\uDE10-\\\\uDE13\\\\uDE15-\\\\uDE17\\\\uDE19-\\\\uDE33\\\\uDE60-\\\\uDE7C\\\\uDE80-\\\\uDE9C\\\\uDEC0-\\\\uDEC7\\\\uDEC9-\\\\uDEE4\\\\uDF00-\\\\uDF35\\\\uDF40-\\\\uDF55\\\\uDF60-\\\\uDF72\\\\uDF80-\\\\uDF91]|\\\\uD803[\\\\uDC00-\\\\uDC48]|\\\\uD804[\\\\uDC03-\\\\uDC37\\\\uDC83-\\\\uDCAF\\\\uDCD0-\\\\uDCE8\\\\uDD03-\\\\uDD26\\\\uDD50-\\\\uDD72\\\\uDD76\\\\uDD83-\\\\uDDB2\\\\uDDC1-\\\\uDDC4\\\\uDDDA\\\\uDE00-\\\\uDE11\\\\uDE13-\\\\uDE2B\\\\uDEB0-\\\\uDEDE\\\\uDF05-\\\\uDF0C\\\\uDF0F\\\\uDF10\\\\uDF13-\\\\uDF28\\\\uDF2A-\\\\uDF30\\\\uDF32\\\\uDF33\\\\uDF35-\\\\uDF39\\\\uDF3D\\\\uDF5D-\\\\uDF61]|\\\\uD805[\\\\uDC80-\\\\uDCAF\\\\uDCC4\\\\uDCC5\\\\uDCC7\\\\uDD80-\\\\uDDAE\\\\uDE00-\\\\uDE2F\\\\uDE44\\\\uDE80-\\\\uDEAA]|\\\\uD806[\\\\uDCA0-\\\\uDCDF\\\\uDCFF\\\\uDEC0-\\\\uDEF8]|\\\\uD808[\\\\uDC00-\\\\uDF98]|\\\\uD809[\\\\uDC00-\\\\uDC6E]|[\\\\uD80C\\\\uD840-\\\\uD868\\\\uD86A-\\\\uD86C][\\\\uDC00-\\\\uDFFF]|\\\\uD80D[\\\\uDC00-\\\\uDC2E]|\\\\uD81A[\\\\uDC00-\\\\uDE38\\\\uDE40-\\\\uDE5E\\\\uDED0-\\\\uDEED\\\\uDF00-\\\\uDF2F\\\\uDF40-\\\\uDF43\\\\uDF63-\\\\uDF77\\\\uDF7D-\\\\uDF8F]|\\\\uD81B[\\\\uDF00-\\\\uDF44\\\\uDF50\\\\uDF93-\\\\uDF9F]|\\\\uD82C[\\\\uDC00\\\\uDC01]|\\\\uD82F[\\\\uDC00-\\\\uDC6A\\\\uDC70-\\\\uDC7C\\\\uDC80-\\\\uDC88\\\\uDC90-\\\\uDC99]|\\\\uD835[\\\\uDC00-\\\\uDC54\\\\uDC56-\\\\uDC9C\\\\uDC9E\\\\uDC9F\\\\uDCA2\\\\uDCA5\\\\uDCA6\\\\uDCA9-\\\\uDCAC\\\\uDCAE-\\\\uDCB9\\\\uDCBB\\\\uDCBD-\\\\uDCC3\\\\uDCC5-\\\\uDD05\\\\uDD07-\\\\uDD0A\\\\uDD0D-\\\\uDD14\\\\uDD16-\\\\uDD1C\\\\uDD1E-\\\\uDD39\\\\uDD3B-\\\\uDD3E\\\\uDD40-\\\\uDD44\\\\uDD46\\\\uDD4A-\\\\uDD50\\\\uDD52-\\\\uDEA5\\\\uDEA8-\\\\uDEC0\\\\uDEC2-\\\\uDEDA\\\\uDEDC-\\\\uDEFA\\\\uDEFC-\\\\uDF14\\\\uDF16-\\\\uDF34\\\\uDF36-\\\\uDF4E\\\\uDF50-\\\\uDF6E\\\\uDF70-\\\\uDF88\\\\uDF8A-\\\\uDFA8\\\\uDFAA-\\\\uDFC2\\\\uDFC4-\\\\uDFCB]|\\\\uD83A[\\\\uDC00-\\\\uDCC4]|\\\\uD83B[\\\\uDE00-\\\\uDE03\\\\uDE05-\\\\uDE1F\\\\uDE21\\\\uDE22\\\\uDE24\\\\uDE27\\\\uDE29-\\\\uDE32\\\\uDE34-\\\\uDE37\\\\uDE39\\\\uDE3B\\\\uDE42\\\\uDE47\\\\uDE49\\\\uDE4B\\\\uDE4D-\\\\uDE4F\\\\uDE51\\\\uDE52\\\\uDE54\\\\uDE57\\\\uDE59\\\\uDE5B\\\\uDE5D\\\\uDE5F\\\\uDE61\\\\uDE62\\\\uDE64\\\\uDE67-\\\\uDE6A\\\\uDE6C-\\\\uDE72\\\\uDE74-\\\\uDE77\\\\uDE79-\\\\uDE7C\\\\uDE7E\\\\uDE80-\\\\uDE89\\\\uDE8B-\\\\uDE9B\\\\uDEA1-\\\\uDEA3\\\\uDEA5-\\\\uDEA9\\\\uDEAB-\\\\uDEBB]|\\\\uD869[\\\\uDC00-\\\\uDED6\\\\uDF00-\\\\uDFFF]|\\\\uD86D[\\\\uDC00-\\\\uDF34\\\\uDF40-\\\\uDFFF]|\\\\uD86E[\\\\uDC00-\\\\uDC1D]|\\\\uD87E[\\\\uDC00-\\\\uDE1D]/,NonAsciiIdentifierPart:/[\\\\xAA\\\\xB5\\\\xB7\\\\xBA\\\\xC0-\\\\xD6\\\\xD8-\\\\xF6\\\\xF8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0300-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u037F\\\\u0386-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u0483-\\\\u0487\\\\u048A-\\\\u052F\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u0591-\\\\u05BD\\\\u05BF\\\\u05C1\\\\u05C2\\\\u05C4\\\\u05C5\\\\u05C7\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0610-\\\\u061A\\\\u0620-\\\\u0669\\\\u066E-\\\\u06D3\\\\u06D5-\\\\u06DC\\\\u06DF-\\\\u06E8\\\\u06EA-\\\\u06FC\\\\u06FF\\\\u0710-\\\\u074A\\\\u074D-\\\\u07B1\\\\u07C0-\\\\u07F5\\\\u07FA\\\\u0800-\\\\u082D\\\\u0840-\\\\u085B\\\\u08A0-\\\\u08B2\\\\u08E4-\\\\u0963\\\\u0966-\\\\u096F\\\\u0971-\\\\u0983\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BC-\\\\u09C4\\\\u09C7\\\\u09C8\\\\u09CB-\\\\u09CE\\\\u09D7\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E3\\\\u09E6-\\\\u09F1\\\\u0A01-\\\\u0A03\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A3C\\\\u0A3E-\\\\u0A42\\\\u0A47\\\\u0A48\\\\u0A4B-\\\\u0A4D\\\\u0A51\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A66-\\\\u0A75\\\\u0A81-\\\\u0A83\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABC-\\\\u0AC5\\\\u0AC7-\\\\u0AC9\\\\u0ACB-\\\\u0ACD\\\\u0AD0\\\\u0AE0-\\\\u0AE3\\\\u0AE6-\\\\u0AEF\\\\u0B01-\\\\u0B03\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3C-\\\\u0B44\\\\u0B47\\\\u0B48\\\\u0B4B-\\\\u0B4D\\\\u0B56\\\\u0B57\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B63\\\\u0B66-\\\\u0B6F\\\\u0B71\\\\u0B82\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BBE-\\\\u0BC2\\\\u0BC6-\\\\u0BC8\\\\u0BCA-\\\\u0BCD\\\\u0BD0\\\\u0BD7\\\\u0BE6-\\\\u0BEF\\\\u0C00-\\\\u0C03\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C39\\\\u0C3D-\\\\u0C44\\\\u0C46-\\\\u0C48\\\\u0C4A-\\\\u0C4D\\\\u0C55\\\\u0C56\\\\u0C58\\\\u0C59\\\\u0C60-\\\\u0C63\\\\u0C66-\\\\u0C6F\\\\u0C81-\\\\u0C83\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBC-\\\\u0CC4\\\\u0CC6-\\\\u0CC8\\\\u0CCA-\\\\u0CCD\\\\u0CD5\\\\u0CD6\\\\u0CDE\\\\u0CE0-\\\\u0CE3\\\\u0CE6-\\\\u0CEF\\\\u0CF1\\\\u0CF2\\\\u0D01-\\\\u0D03\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D3A\\\\u0D3D-\\\\u0D44\\\\u0D46-\\\\u0D48\\\\u0D4A-\\\\u0D4E\\\\u0D57\\\\u0D60-\\\\u0D63\\\\u0D66-\\\\u0D6F\\\\u0D7A-\\\\u0D7F\\\\u0D82\\\\u0D83\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0DCA\\\\u0DCF-\\\\u0DD4\\\\u0DD6\\\\u0DD8-\\\\u0DDF\\\\u0DE6-\\\\u0DEF\\\\u0DF2\\\\u0DF3\\\\u0E01-\\\\u0E3A\\\\u0E40-\\\\u0E4E\\\\u0E50-\\\\u0E59\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB9\\\\u0EBB-\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EC8-\\\\u0ECD\\\\u0ED0-\\\\u0ED9\\\\u0EDC-\\\\u0EDF\\\\u0F00\\\\u0F18\\\\u0F19\\\\u0F20-\\\\u0F29\\\\u0F35\\\\u0F37\\\\u0F39\\\\u0F3E-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F71-\\\\u0F84\\\\u0F86-\\\\u0F97\\\\u0F99-\\\\u0FBC\\\\u0FC6\\\\u1000-\\\\u1049\\\\u1050-\\\\u109D\\\\u10A0-\\\\u10C5\\\\u10C7\\\\u10CD\\\\u10D0-\\\\u10FA\\\\u10FC-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u135D-\\\\u135F\\\\u1369-\\\\u1371\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F4\\\\u1401-\\\\u166C\\\\u166F-\\\\u167F\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u16EE-\\\\u16F8\\\\u1700-\\\\u170C\\\\u170E-\\\\u1714\\\\u1720-\\\\u1734\\\\u1740-\\\\u1753\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1772\\\\u1773\\\\u1780-\\\\u17D3\\\\u17D7\\\\u17DC\\\\u17DD\\\\u17E0-\\\\u17E9\\\\u180B-\\\\u180D\\\\u1810-\\\\u1819\\\\u1820-\\\\u1877\\\\u1880-\\\\u18AA\\\\u18B0-\\\\u18F5\\\\u1900-\\\\u191E\\\\u1920-\\\\u192B\\\\u1930-\\\\u193B\\\\u1946-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19AB\\\\u19B0-\\\\u19C9\\\\u19D0-\\\\u19DA\\\\u1A00-\\\\u1A1B\\\\u1A20-\\\\u1A5E\\\\u1A60-\\\\u1A7C\\\\u1A7F-\\\\u1A89\\\\u1A90-\\\\u1A99\\\\u1AA7\\\\u1AB0-\\\\u1ABD\\\\u1B00-\\\\u1B4B\\\\u1B50-\\\\u1B59\\\\u1B6B-\\\\u1B73\\\\u1B80-\\\\u1BF3\\\\u1C00-\\\\u1C37\\\\u1C40-\\\\u1C49\\\\u1C4D-\\\\u1C7D\\\\u1CD0-\\\\u1CD2\\\\u1CD4-\\\\u1CF6\\\\u1CF8\\\\u1CF9\\\\u1D00-\\\\u1DF5\\\\u1DFC-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u200C\\\\u200D\\\\u203F\\\\u2040\\\\u2054\\\\u2071\\\\u207F\\\\u2090-\\\\u209C\\\\u20D0-\\\\u20DC\\\\u20E1\\\\u20E5-\\\\u20F0\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2118-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2160-\\\\u2188\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2CE4\\\\u2CEB-\\\\u2CF3\\\\u2D00-\\\\u2D25\\\\u2D27\\\\u2D2D\\\\u2D30-\\\\u2D67\\\\u2D6F\\\\u2D7F-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2DE0-\\\\u2DFF\\\\u3005-\\\\u3007\\\\u3021-\\\\u302F\\\\u3031-\\\\u3035\\\\u3038-\\\\u303C\\\\u3041-\\\\u3096\\\\u3099-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31BA\\\\u31F0-\\\\u31FF\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FCC\\\\uA000-\\\\uA48C\\\\uA4D0-\\\\uA4FD\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA62B\\\\uA640-\\\\uA66F\\\\uA674-\\\\uA67D\\\\uA67F-\\\\uA69D\\\\uA69F-\\\\uA6F1\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B-\\\\uA78E\\\\uA790-\\\\uA7AD\\\\uA7B0\\\\uA7B1\\\\uA7F7-\\\\uA827\\\\uA840-\\\\uA873\\\\uA880-\\\\uA8C4\\\\uA8D0-\\\\uA8D9\\\\uA8E0-\\\\uA8F7\\\\uA8FB\\\\uA900-\\\\uA92D\\\\uA930-\\\\uA953\\\\uA960-\\\\uA97C\\\\uA980-\\\\uA9C0\\\\uA9CF-\\\\uA9D9\\\\uA9E0-\\\\uA9FE\\\\uAA00-\\\\uAA36\\\\uAA40-\\\\uAA4D\\\\uAA50-\\\\uAA59\\\\uAA60-\\\\uAA76\\\\uAA7A-\\\\uAAC2\\\\uAADB-\\\\uAADD\\\\uAAE0-\\\\uAAEF\\\\uAAF2-\\\\uAAF6\\\\uAB01-\\\\uAB06\\\\uAB09-\\\\uAB0E\\\\uAB11-\\\\uAB16\\\\uAB20-\\\\uAB26\\\\uAB28-\\\\uAB2E\\\\uAB30-\\\\uAB5A\\\\uAB5C-\\\\uAB5F\\\\uAB64\\\\uAB65\\\\uABC0-\\\\uABEA\\\\uABEC\\\\uABED\\\\uABF0-\\\\uABF9\\\\uAC00-\\\\uD7A3\\\\uD7B0-\\\\uD7C6\\\\uD7CB-\\\\uD7FB\\\\uF900-\\\\uFA6D\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE00-\\\\uFE0F\\\\uFE20-\\\\uFE2D\\\\uFE33\\\\uFE34\\\\uFE4D-\\\\uFE4F\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF10-\\\\uFF19\\\\uFF21-\\\\uFF3A\\\\uFF3F\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC]|\\\\uD800[\\\\uDC00-\\\\uDC0B\\\\uDC0D-\\\\uDC26\\\\uDC28-\\\\uDC3A\\\\uDC3C\\\\uDC3D\\\\uDC3F-\\\\uDC4D\\\\uDC50-\\\\uDC5D\\\\uDC80-\\\\uDCFA\\\\uDD40-\\\\uDD74\\\\uDDFD\\\\uDE80-\\\\uDE9C\\\\uDEA0-\\\\uDED0\\\\uDEE0\\\\uDF00-\\\\uDF1F\\\\uDF30-\\\\uDF4A\\\\uDF50-\\\\uDF7A\\\\uDF80-\\\\uDF9D\\\\uDFA0-\\\\uDFC3\\\\uDFC8-\\\\uDFCF\\\\uDFD1-\\\\uDFD5]|\\\\uD801[\\\\uDC00-\\\\uDC9D\\\\uDCA0-\\\\uDCA9\\\\uDD00-\\\\uDD27\\\\uDD30-\\\\uDD63\\\\uDE00-\\\\uDF36\\\\uDF40-\\\\uDF55\\\\uDF60-\\\\uDF67]|\\\\uD802[\\\\uDC00-\\\\uDC05\\\\uDC08\\\\uDC0A-\\\\uDC35\\\\uDC37\\\\uDC38\\\\uDC3C\\\\uDC3F-\\\\uDC55\\\\uDC60-\\\\uDC76\\\\uDC80-\\\\uDC9E\\\\uDD00-\\\\uDD15\\\\uDD20-\\\\uDD39\\\\uDD80-\\\\uDDB7\\\\uDDBE\\\\uDDBF\\\\uDE00-\\\\uDE03\\\\uDE05\\\\uDE06\\\\uDE0C-\\\\uDE13\\\\uDE15-\\\\uDE17\\\\uDE19-\\\\uDE33\\\\uDE38-\\\\uDE3A\\\\uDE3F\\\\uDE60-\\\\uDE7C\\\\uDE80-\\\\uDE9C\\\\uDEC0-\\\\uDEC7\\\\uDEC9-\\\\uDEE6\\\\uDF00-\\\\uDF35\\\\uDF40-\\\\uDF55\\\\uDF60-\\\\uDF72\\\\uDF80-\\\\uDF91]|\\\\uD803[\\\\uDC00-\\\\uDC48]|\\\\uD804[\\\\uDC00-\\\\uDC46\\\\uDC66-\\\\uDC6F\\\\uDC7F-\\\\uDCBA\\\\uDCD0-\\\\uDCE8\\\\uDCF0-\\\\uDCF9\\\\uDD00-\\\\uDD34\\\\uDD36-\\\\uDD3F\\\\uDD50-\\\\uDD73\\\\uDD76\\\\uDD80-\\\\uDDC4\\\\uDDD0-\\\\uDDDA\\\\uDE00-\\\\uDE11\\\\uDE13-\\\\uDE37\\\\uDEB0-\\\\uDEEA\\\\uDEF0-\\\\uDEF9\\\\uDF01-\\\\uDF03\\\\uDF05-\\\\uDF0C\\\\uDF0F\\\\uDF10\\\\uDF13-\\\\uDF28\\\\uDF2A-\\\\uDF30\\\\uDF32\\\\uDF33\\\\uDF35-\\\\uDF39\\\\uDF3C-\\\\uDF44\\\\uDF47\\\\uDF48\\\\uDF4B-\\\\uDF4D\\\\uDF57\\\\uDF5D-\\\\uDF63\\\\uDF66-\\\\uDF6C\\\\uDF70-\\\\uDF74]|\\\\uD805[\\\\uDC80-\\\\uDCC5\\\\uDCC7\\\\uDCD0-\\\\uDCD9\\\\uDD80-\\\\uDDB5\\\\uDDB8-\\\\uDDC0\\\\uDE00-\\\\uDE40\\\\uDE44\\\\uDE50-\\\\uDE59\\\\uDE80-\\\\uDEB7\\\\uDEC0-\\\\uDEC9]|\\\\uD806[\\\\uDCA0-\\\\uDCE9\\\\uDCFF\\\\uDEC0-\\\\uDEF8]|\\\\uD808[\\\\uDC00-\\\\uDF98]|\\\\uD809[\\\\uDC00-\\\\uDC6E]|[\\\\uD80C\\\\uD840-\\\\uD868\\\\uD86A-\\\\uD86C][\\\\uDC00-\\\\uDFFF]|\\\\uD80D[\\\\uDC00-\\\\uDC2E]|\\\\uD81A[\\\\uDC00-\\\\uDE38\\\\uDE40-\\\\uDE5E\\\\uDE60-\\\\uDE69\\\\uDED0-\\\\uDEED\\\\uDEF0-\\\\uDEF4\\\\uDF00-\\\\uDF36\\\\uDF40-\\\\uDF43\\\\uDF50-\\\\uDF59\\\\uDF63-\\\\uDF77\\\\uDF7D-\\\\uDF8F]|\\\\uD81B[\\\\uDF00-\\\\uDF44\\\\uDF50-\\\\uDF7E\\\\uDF8F-\\\\uDF9F]|\\\\uD82C[\\\\uDC00\\\\uDC01]|\\\\uD82F[\\\\uDC00-\\\\uDC6A\\\\uDC70-\\\\uDC7C\\\\uDC80-\\\\uDC88\\\\uDC90-\\\\uDC99\\\\uDC9D\\\\uDC9E]|\\\\uD834[\\\\uDD65-\\\\uDD69\\\\uDD6D-\\\\uDD72\\\\uDD7B-\\\\uDD82\\\\uDD85-\\\\uDD8B\\\\uDDAA-\\\\uDDAD\\\\uDE42-\\\\uDE44]|\\\\uD835[\\\\uDC00-\\\\uDC54\\\\uDC56-\\\\uDC9C\\\\uDC9E\\\\uDC9F\\\\uDCA2\\\\uDCA5\\\\uDCA6\\\\uDCA9-\\\\uDCAC\\\\uDCAE-\\\\uDCB9\\\\uDCBB\\\\uDCBD-\\\\uDCC3\\\\uDCC5-\\\\uDD05\\\\uDD07-\\\\uDD0A\\\\uDD0D-\\\\uDD14\\\\uDD16-\\\\uDD1C\\\\uDD1E-\\\\uDD39\\\\uDD3B-\\\\uDD3E\\\\uDD40-\\\\uDD44\\\\uDD46\\\\uDD4A-\\\\uDD50\\\\uDD52-\\\\uDEA5\\\\uDEA8-\\\\uDEC0\\\\uDEC2-\\\\uDEDA\\\\uDEDC-\\\\uDEFA\\\\uDEFC-\\\\uDF14\\\\uDF16-\\\\uDF34\\\\uDF36-\\\\uDF4E\\\\uDF50-\\\\uDF6E\\\\uDF70-\\\\uDF88\\\\uDF8A-\\\\uDFA8\\\\uDFAA-\\\\uDFC2\\\\uDFC4-\\\\uDFCB\\\\uDFCE-\\\\uDFFF]|\\\\uD83A[\\\\uDC00-\\\\uDCC4\\\\uDCD0-\\\\uDCD6]|\\\\uD83B[\\\\uDE00-\\\\uDE03\\\\uDE05-\\\\uDE1F\\\\uDE21\\\\uDE22\\\\uDE24\\\\uDE27\\\\uDE29-\\\\uDE32\\\\uDE34-\\\\uDE37\\\\uDE39\\\\uDE3B\\\\uDE42\\\\uDE47\\\\uDE49\\\\uDE4B\\\\uDE4D-\\\\uDE4F\\\\uDE51\\\\uDE52\\\\uDE54\\\\uDE57\\\\uDE59\\\\uDE5B\\\\uDE5D\\\\uDE5F\\\\uDE61\\\\uDE62\\\\uDE64\\\\uDE67-\\\\uDE6A\\\\uDE6C-\\\\uDE72\\\\uDE74-\\\\uDE77\\\\uDE79-\\\\uDE7C\\\\uDE7E\\\\uDE80-\\\\uDE89\\\\uDE8B-\\\\uDE9B\\\\uDEA1-\\\\uDEA3\\\\uDEA5-\\\\uDEA9\\\\uDEAB-\\\\uDEBB]|\\\\uD869[\\\\uDC00-\\\\uDED6\\\\uDF00-\\\\uDFFF]|\\\\uD86D[\\\\uDC00-\\\\uDF34\\\\uDF40-\\\\uDFFF]|\\\\uD86E[\\\\uDC00-\\\\uDC1D]|\\\\uD87E[\\\\uDC00-\\\\uDE1D]|\\\\uDB40[\\\\uDD00-\\\\uDDEF]/},d=[5760,6158,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8239,8287,12288,65279],D=new Array(128),g=0;g<128;++g)D[g]=g>=97&&g<=122||g>=65&&g<=90||36===g||95===g;for(h=new Array(128),g=0;g<128;++g)h[g]=g>=97&&g<=122||g>=65&&g<=90||g>=48&&g<=57||36===g||95===g;e.exports={isDecimalDigit:t,isHexDigit:n,isOctalDigit:r,isWhiteSpace:u,isLineTerminator:o,isIdentifierStartES5:i,isIdentifierPartES5:l,isIdentifierStartES6:s,isIdentifierPartES6:c}}()},function(e,t){function n(){throw new Error(\\\"setTimeout has not been defined\\\")}function r(){throw new Error(\\\"clearTimeout has not been defined\\\")}function u(e){if(c===setTimeout)return setTimeout(e,0);if((c===n||!c)&&setTimeout)return c=setTimeout,setTimeout(e,0);try{return c(e,0)}catch(t){try{return c.call(null,e,0)}catch(t){return c.call(this,e,0)}}}function o(e){if(p===clearTimeout)return clearTimeout(e);if((p===r||!p)&&clearTimeout)return p=clearTimeout,clearTimeout(e);try{return p(e)}catch(t){try{return p.call(null,e)}catch(t){return p.call(this,e)}}}function a(){h&&d&&(h=!1,d.length?D=d.concat(D):g=-1,D.length&&i())}function i(){if(!h){var e=u(a);h=!0;for(var t=D.length;t;){for(d=D,D=[];++g<t;)d&&d[g].run();g=-1,t=D.length}d=null,h=!1,o(e)}}function l(e,t){this.fun=e,this.array=t}function s(){}var c,p,f=e.exports={};!function(){try{c=\\\"function\\\"===typeof setTimeout?setTimeout:n}catch(e){c=n}try{p=\\\"function\\\"===typeof clearTimeout?clearTimeout:r}catch(e){p=r}}();var d,D=[],h=!1,g=-1;f.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];D.push(new l(e,t)),1!==D.length||h||u(i)},l.prototype.run=function(){this.fun.apply(null,this.array)},f.title=\\\"browser\\\",f.browser=!0,f.env={},f.argv=[],f.version=\\\"\\\",f.versions={},f.on=s,f.addListener=s,f.once=s,f.off=s,f.removeListener=s,f.removeAllListeners=s,f.emit=s,f.prependListener=s,f.prependOnceListener=s,f.listeners=function(e){return[]},f.binding=function(e){throw new Error(\\\"process.binding is not supported\\\")},f.cwd=function(){return\\\"/\\\"},f.chdir=function(e){throw new Error(\\\"process.chdir is not supported\\\")},f.umask=function(){return 0}},function(e,t,n){\\\"use strict\\\";e.exports=function(){return/[\\\\u001b\\\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-PRZcf-nqry=><]/g}},function(e,t,n){\\\"use strict\\\";function r(e){var t=e.currentBuildError,n=e.currentRuntimeErrorRecords,r=e.dismissRuntimeErrors,u=e.editorHandler;return t?a.a.createElement(s.a,{error:t,editorHandler:u}):n.length>0?a.a.createElement(c.a,{errorRecords:n,close:r,editorHandler:u}):null}Object.defineProperty(t,\\\"__esModule\\\",{value:!0});var u=n(19),o=(n.n(u),n(0)),a=n.n(o),i=n(25),l=n.n(i),s=n(35),c=n(40),p=n(1),f=n(14),d=null;window.updateContent=function(e){var t=r(e);return null===t?(l.a.unmountComponentAtNode(d),!1):(l.a.render(t,d),!0)},document.body.style.margin=\\\"0\\\",document.body.style[\\\"max-width\\\"]=\\\"100vw\\\",d=document.createElement(\\\"div\\\"),Object(f.a)(d,p.c),document.body.appendChild(d),window.parent.__REACT_ERROR_OVERLAY_GLOBAL_HOOK__.iframeReady()},function(e,t,n){\\\"undefined\\\"===typeof Promise&&(n(20).enable(),window.Promise=n(23)),Object.assign=n(2)},function(e,t,n){\\\"use strict\\\";function r(){s=!1,i._47=null,i._71=null}function u(e){function t(t){(e.allRejections||a(p[t].error,e.whitelist||l))&&(p[t].displayId=c++,e.onUnhandled?(p[t].logged=!0,e.onUnhandled(p[t].displayId,p[t].error)):(p[t].logged=!0,o(p[t].displayId,p[t].error)))}function n(t){p[t].logged&&(e.onHandled?e.onHandled(p[t].displayId,p[t].error):p[t].onUnhandled||(console.warn(\\\"Promise Rejection Handled (id: \\\"+p[t].displayId+\\\"):\\\"),console.warn(' This means you can ignore any previous messages of the form \\\"Possible Unhandled Promise Rejection\\\" with id '+p[t].displayId+\\\".\\\")))}e=e||{},s&&r(),s=!0;var u=0,c=0,p={};i._47=function(e){2===e._83&&p[e._56]&&(p[e._56].logged?n(e._56):clearTimeout(p[e._56].timeout),delete p[e._56])},i._71=function(e,n){0===e._75&&(e._56=u++,p[e._56]={displayId:null,error:n,timeout:setTimeout(t.bind(null,e._56),a(n,l)?100:2e3),logged:!1})}}function o(e,t){console.warn(\\\"Possible Unhandled Promise Rejection (id: \\\"+e+\\\"):\\\"),((t&&(t.stack||t))+\\\"\\\").split(\\\"\\\\n\\\").forEach(function(e){console.warn(\\\" \\\"+e)})}function a(e,t){return t.some(function(t){return e instanceof t})}var i=n(4),l=[ReferenceError,TypeError,RangeError],s=!1;t.disable=r,t.enable=u},function(e,t,n){\\\"use strict\\\";(function(t){function n(e){a.length||(o(),i=!0),a[a.length]=e}function r(){for(;l<a.length;){var e=l;if(l+=1,a[e].call(),l>s){for(var t=0,n=a.length-l;t<n;t++)a[t]=a[t+l];a.length-=l,l=0}}a.length=0,l=0,i=!1}function u(e){return function(){function t(){clearTimeout(n),clearInterval(r),e()}var n=setTimeout(t,0),r=setInterval(t,50)}}e.exports=n;var o,a=[],i=!1,l=0,s=1024,c=\\\"undefined\\\"!==typeof t?t:self,p=c.MutationObserver||c.WebKitMutationObserver;o=\\\"function\\\"===typeof p?function(e){var t=1,n=new p(e),r=document.createTextNode(\\\"\\\");return n.observe(r,{characterData:!0}),function(){t=-t,r.data=t}}(r):u(r),n.requestFlush=o,n.makeRequestCallFromTimer=u}).call(t,n(22))},function(e,t){var n;n=function(){return this}();try{n=n||Function(\\\"return this\\\")()||(0,eval)(\\\"this\\\")}catch(e){\\\"object\\\"===typeof window&&(n=window)}e.exports=n},function(e,t,n){\\\"use strict\\\";function r(e){var t=new u(u._44);return t._83=1,t._18=e,t}var u=n(4);e.exports=u;var o=r(!0),a=r(!1),i=r(null),l=r(void 0),s=r(0),c=r(\\\"\\\");u.resolve=function(e){if(e instanceof u)return e;if(null===e)return i;if(void 0===e)return l;if(!0===e)return o;if(!1===e)return a;if(0===e)return s;if(\\\"\\\"===e)return c;if(\\\"object\\\"===typeof e||\\\"function\\\"===typeof e)try{var t=e.then;if(\\\"function\\\"===typeof t)return new u(t.bind(e))}catch(e){return new u(function(t,n){n(e)})}return r(e)},u.all=function(e){var t=Array.prototype.slice.call(e);return new u(function(e,n){function r(a,i){if(i&&(\\\"object\\\"===typeof i||\\\"function\\\"===typeof i)){if(i instanceof u&&i.then===u.prototype.then){for(;3===i._83;)i=i._18;return 1===i._83?r(a,i._18):(2===i._83&&n(i._18),void i.then(function(e){r(a,e)},n))}var l=i.then;if(\\\"function\\\"===typeof l){return void new u(l.bind(i)).then(function(e){r(a,e)},n)}}t[a]=i,0===--o&&e(t)}if(0===t.length)return e([]);for(var o=t.length,a=0;a<t.length;a++)r(a,t[a])})},u.reject=function(e){return new u(function(t,n){n(e)})},u.race=function(e){return new u(function(t,n){e.forEach(function(e){u.resolve(e).then(t,n)})})},u.prototype.catch=function(e){return this.then(null,e)}},function(e,t,n){\\\"use strict\\\";function r(e){for(var t=arguments.length-1,n=\\\"Minified React error #\\\"+e+\\\"; visit http://facebook.github.io/react/docs/error-decoder.html?invariant=\\\"+e,r=0;r<t;r++)n+=\\\"&args[]=\\\"+encodeURIComponent(arguments[r+1]);throw t=Error(n+\\\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\\\"),t.name=\\\"Invariant Violation\\\",t.framesToPop=1,t}function u(e,t,n){this.props=e,this.context=t,this.refs=C,this.updater=n||A}function o(e,t,n){this.props=e,this.context=t,this.refs=C,this.updater=n||A}function a(){}function i(e,t,n){this.props=e,this.context=t,this.refs=C,this.updater=n||A}function l(e,t,n,r,u,o,a){return{$$typeof:w,type:e,key:t,ref:n,props:a,_owner:o}}function s(e){var t={\\\"=\\\":\\\"=0\\\",\\\":\\\":\\\"=2\\\"};return\\\"$\\\"+(\\\"\\\"+e).replace(/[=:]/g,function(e){return t[e]})}function c(e,t,n,r){if(P.length){var u=P.pop();return u.result=e,u.keyPrefix=t,u.func=n,u.context=r,u.count=0,u}return{result:e,keyPrefix:t,func:n,context:r,count:0}}function p(e){e.result=null,e.keyPrefix=null,e.func=null,e.context=null,e.count=0,10>P.length&&P.push(e)}function f(e,t,n,u){var o=typeof e;if(\\\"undefined\\\"!==o&&\\\"boolean\\\"!==o||(e=null),null===e||\\\"string\\\"===o||\\\"number\\\"===o||\\\"object\\\"===o&&e.$$typeof===T)return n(u,e,\\\"\\\"===t?\\\".\\\"+d(e,0):t),1;var a=0;if(t=\\\"\\\"===t?\\\".\\\":t+\\\":\\\",Array.isArray(e))for(var i=0;i<e.length;i++){o=e[i];var l=t+d(o,i);a+=f(o,l,n,u)}else if(\\\"function\\\"===typeof(l=x&&e[x]||e[\\\"@@iterator\\\"]))for(e=l.call(e),i=0;!(o=e.next()).done;)o=o.value,l=t+d(o,i++),a+=f(o,l,n,u);else\\\"object\\\"===o&&(n=\\\"\\\"+e,r(\\\"31\\\",\\\"[object Object]\\\"===n?\\\"object with keys {\\\"+Object.keys(e).join(\\\", \\\")+\\\"}\\\":n,\\\"\\\"));return a}function d(e,t){return\\\"object\\\"===typeof e&&null!==e&&null!=e.key?s(e.key):t.toString(36)}function D(e,t){e.func.call(e.context,t,e.count++)}function h(e,t,n){var r=e.result,u=e.keyPrefix;e=e.func.call(e.context,t,e.count++),Array.isArray(e)?g(e,r,n,E.thatReturnsArgument):null!=e&&(l.isValidElement(e)&&(e=l.cloneAndReplaceKey(e,u+(!e.key||t&&t.key===e.key?\\\"\\\":(\\\"\\\"+e.key).replace(S,\\\"$&/\\\")+\\\"/\\\")+n)),r.push(e))}function g(e,t,n,r,u){var o=\\\"\\\";null!=n&&(o=(\\\"\\\"+n).replace(S,\\\"$&/\\\")+\\\"/\\\"),t=c(t,o,r,u),null==e||f(e,\\\"\\\",h,t),p(t)}var m=n(2),C=n(5);n(6);var E=n(3),A={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}};u.prototype.isReactComponent={},u.prototype.setState=function(e,t){\\\"object\\\"!==typeof e&&\\\"function\\\"!==typeof e&&null!=e&&r(\\\"85\\\"),this.updater.enqueueSetState(this,e,t,\\\"setState\\\")},u.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,\\\"forceUpdate\\\")},a.prototype=u.prototype;var F=o.prototype=new a;F.constructor=o,m(F,u.prototype),F.isPureReactComponent=!0;var b=i.prototype=new a;b.constructor=i,m(b,u.prototype),b.unstable_isAsyncReactComponent=!0,b.render=function(){return this.props.children};var y={Component:u,PureComponent:o,AsyncComponent:i},v={current:null},B=Object.prototype.hasOwnProperty,w=\\\"function\\\"===typeof Symbol&&Symbol.for&&Symbol.for(\\\"react.element\\\")||60103,k={key:!0,ref:!0,__self:!0,__source:!0};l.createElement=function(e,t,n){var r,u={},o=null,a=null,i=null,s=null;if(null!=t)for(r in void 0!==t.ref&&(a=t.ref),void 0!==t.key&&(o=\\\"\\\"+t.key),i=void 0===t.__self?null:t.__self,s=void 0===t.__source?null:t.__source,t)B.call(t,r)&&!k.hasOwnProperty(r)&&(u[r]=t[r]);var c=arguments.length-2;if(1===c)u.children=n;else if(1<c){for(var p=Array(c),f=0;f<c;f++)p[f]=arguments[f+2];u.children=p}if(e&&e.defaultProps)for(r in c=e.defaultProps)void 0===u[r]&&(u[r]=c[r]);return l(e,o,a,i,s,v.current,u)},l.createFactory=function(e){var t=l.createElement.bind(null,e);return t.type=e,t},l.cloneAndReplaceKey=function(e,t){return l(e.type,t,e.ref,e._self,e._source,e._owner,e.props)},l.cloneElement=function(e,t,n){var r=m({},e.props),u=e.key,o=e.ref,a=e._self,i=e._source,s=e._owner;if(null!=t){if(void 0!==t.ref&&(o=t.ref,s=v.current),void 0!==t.key&&(u=\\\"\\\"+t.key),e.type&&e.type.defaultProps)var c=e.type.defaultProps;for(p in t)B.call(t,p)&&!k.hasOwnProperty(p)&&(r[p]=void 0===t[p]&&void 0!==c?c[p]:t[p])}var p=arguments.length-2;if(1===p)r.children=n;else if(1<p){c=Array(p);for(var f=0;f<p;f++)c[f]=arguments[f+2];r.children=c}return l(e.type,u,o,a,i,s,r)},l.isValidElement=function(e){return\\\"object\\\"===typeof e&&null!==e&&e.$$typeof===w};var x=\\\"function\\\"===typeof Symbol&&Symbol.iterator,T=\\\"function\\\"===typeof Symbol&&Symbol.for&&Symbol.for(\\\"react.element\\\")||60103,S=/\\\\/+/g,P=[],N={forEach:function(e,t,n){if(null==e)return e;t=c(null,null,t,n),null==e||f(e,\\\"\\\",D,t),p(t)},map:function(e,t,n){if(null==e)return e;var r=[];return g(e,r,null,t,n),r},count:function(e){return null==e?0:f(e,\\\"\\\",E.thatReturnsNull,null)},toArray:function(e){var t=[];return g(e,t,null,E.thatReturnsArgument),t}};e.exports={Children:{map:N.map,forEach:N.forEach,count:N.count,toArray:N.toArray,only:function(e){return l.isValidElement(e)||r(\\\"143\\\"),e}},Component:y.Component,PureComponent:y.PureComponent,unstable_AsyncComponent:y.AsyncComponent,createElement:l.createElement,cloneElement:l.cloneElement,isValidElement:l.isValidElement,createFactory:l.createFactory,version:\\\"16.0.0\\\",__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:{ReactCurrentOwner:v,assign:m}}},function(e,t,n){\\\"use strict\\\";function r(){if(\\\"undefined\\\"!==typeof{}&&\\\"function\\\"===typeof{}.checkDCE)try{({}).checkDCE(r)}catch(e){console.error(e)}}r(),e.exports=n(26)},function(e,t,n){\\\"use strict\\\";function r(e){for(var t=arguments.length-1,n=\\\"Minified React error #\\\"+e+\\\"; visit http://facebook.github.io/react/docs/error-decoder.html?invariant=\\\"+e,r=0;r<t;r++)n+=\\\"&args[]=\\\"+encodeURIComponent(arguments[r+1]);throw t=Error(n+\\\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\\\"),t.name=\\\"Invariant Violation\\\",t.framesToPop=1,t}function u(e){switch(e){case\\\"svg\\\":return\\\"http://www.w3.org/2000/svg\\\";case\\\"math\\\":return\\\"http://www.w3.org/1998/Math/MathML\\\";default:return\\\"http://www.w3.org/1999/xhtml\\\"}}function o(){if(xt)for(var e in Tt){var t=Tt[e],n=xt.indexOf(e);if(-1<n||r(\\\"96\\\",e),!St.plugins[n]){t.extractEvents||r(\\\"97\\\",e),St.plugins[n]=t,n=t.eventTypes;for(var u in n){var o=void 0,i=n[u],l=t,s=u;St.eventNameDispatchConfigs.hasOwnProperty(s)&&r(\\\"99\\\",s),St.eventNameDispatchConfigs[s]=i;var c=i.phasedRegistrationNames;if(c){for(o in c)c.hasOwnProperty(o)&&a(c[o],l,s);o=!0}else i.registrationName?(a(i.registrationName,l,s),o=!0):o=!1;o||r(\\\"98\\\",u,e)}}}}function a(e,t,n){St.registrationNameModules[e]&&r(\\\"100\\\",e),St.registrationNameModules[e]=t,St.registrationNameDependencies[e]=t.eventTypes[n].dependencies}function i(e,t){return(e&t)===t}function l(e){for(var t;t=e._renderedComponent;)e=t;return e}function s(e,t){e=l(e),e._hostNode=t,t[zt]=e}function c(e,t){if(!(e._flags&Vt.hasCachedChildNodes)){var n=e._renderedChildren;t=t.firstChild;var u;e:for(u in n)if(n.hasOwnProperty(u)){var o=n[u],a=l(o)._domID;if(0!==a){for(;null!==t;t=t.nextSibling){var i=t,c=a;if(i.nodeType===Ht&&i.getAttribute(jt)===\\\"\\\"+c||i.nodeType===qt&&i.nodeValue===\\\" react-text: \\\"+c+\\\" \\\"||i.nodeType===qt&&i.nodeValue===\\\" react-empty: \\\"+c+\\\" \\\"){s(o,t);continue e}}r(\\\"32\\\",a)}}e._flags|=Vt.hasCachedChildNodes}}function p(e){if(e[zt])return e[zt];for(var t=[];!e[zt];){if(t.push(e),!e.parentNode)return null;e=e.parentNode}var n=e[zt];if(n.tag===Ut||n.tag===Mt)return n;for(;e&&(n=e[zt]);e=t.pop()){var r=n;t.length&&c(n,e)}return r}function f(e){if(\\\"function\\\"===typeof e.getName)return e.getName();if(\\\"number\\\"===typeof e.tag){if(\\\"string\\\"===typeof(e=e.type))return e;if(\\\"function\\\"===typeof e)return e.displayName||e.name}return null}function d(e){var t=e;if(e.alternate)for(;t.return;)t=t.return;else{if((t.effectTag&nn)!==tn)return 1;for(;t.return;)if(t=t.return,(t.effectTag&nn)!==tn)return 1}return t.tag===Jt?2:3}function D(e){2!==d(e)&&r(\\\"188\\\")}function h(e){var t=e.alternate;if(!t)return t=d(e),3===t&&r(\\\"188\\\"),1===t?null:e;for(var n=e,u=t;;){var o=n.return,a=o?o.alternate:null;if(!o||!a)break;if(o.child===a.child){for(var i=o.child;i;){if(i===n)return D(o),e;if(i===u)return D(o),t;i=i.sibling}r(\\\"188\\\")}if(n.return!==u.return)n=o,u=a;else{i=!1;for(var l=o.child;l;){if(l===n){i=!0,n=o,u=a;break}if(l===u){i=!0,u=o,n=a;break}l=l.sibling}if(!i){for(l=a.child;l;){if(l===n){i=!0,n=a,u=o;break}if(l===u){i=!0,u=a,n=o;break}l=l.sibling}i||r(\\\"189\\\")}}n.alternate!==u&&r(\\\"190\\\")}return n.tag!==Jt&&r(\\\"188\\\"),n.stateNode.current===n?e:t}function g(e,t,n,r,u,o,a,i,l){un._hasCaughtError=!1,un._caughtError=null;var s=Array.prototype.slice.call(arguments,3);try{t.apply(n,s)}catch(e){un._caughtError=e,un._hasCaughtError=!0}}function m(){if(un._hasRethrowError){var e=un._rethrowError;throw un._rethrowError=null,un._hasRethrowError=!1,e}}function C(e,t,n,r){t=e.type||\\\"unknown-event\\\",e.currentTarget=an.getNodeFromInstance(r),on.invokeGuardedCallbackAndCatchFirstError(t,n,void 0,e),e.currentTarget=null}function E(e){if(e=ln.getInstanceFromNode(e))if(\\\"number\\\"===typeof e.tag){sn&&\\\"function\\\"===typeof sn.restoreControlledState||r(\\\"194\\\");var t=ln.getFiberCurrentPropsFromNode(e.stateNode);sn.restoreControlledState(e.stateNode,e.type,t)}else\\\"function\\\"!==typeof e.restoreControlledState&&r(\\\"195\\\"),e.restoreControlledState()}function A(e,t,n,r,u,o){return e(t,n,r,u,o)}function F(e,t){return e(t)}function b(e,t){return F(e,t)}function y(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===hn?e.parentNode:e}function v(e){var t=e.targetInst;do{if(!t){e.ancestors.push(t);break}var n=t;if(\\\"number\\\"===typeof n.tag){for(;n.return;)n=n.return;n=n.tag!==gn?null:n.stateNode.containerInfo}else{for(;n._hostParent;)n=n._hostParent;n=Gt.getNodeFromInstance(n).parentNode}if(!n)break;e.ancestors.push(t),t=Gt.getClosestInstanceFromNode(n)}while(t);for(n=0;n<e.ancestors.length;n++)t=e.ancestors[n],Cn._handleTopLevel(e.topLevelType,t,e.nativeEvent,y(e.nativeEvent))}function B(e,t){return null==t&&r(\\\"30\\\"),null==e?t:Array.isArray(e)?Array.isArray(t)?(e.push.apply(e,t),e):(e.push(t),e):Array.isArray(t)?[e].concat(t):[e,t]}function w(e,t,n){Array.isArray(e)?e.forEach(t,n):e&&t.call(n,e)}function k(e,t){e&&(ln.executeDispatchesInOrder(e,t),e.isPersistent()||e.constructor.release(e))}function x(e){return k(e,!0)}function T(e){return k(e,!1)}function S(e,t,n){switch(e){case\\\"onClick\\\":case\\\"onClickCapture\\\":case\\\"onDoubleClick\\\":case\\\"onDoubleClickCapture\\\":case\\\"onMouseDown\\\":case\\\"onMouseDownCapture\\\":case\\\"onMouseMove\\\":case\\\"onMouseMoveCapture\\\":case\\\"onMouseUp\\\":case\\\"onMouseUpCapture\\\":return!(!n.disabled||\\\"button\\\"!==t&&\\\"input\\\"!==t&&\\\"select\\\"!==t&&\\\"textarea\\\"!==t);default:return!1}}function P(e,t){if(!gt.canUseDOM||t&&!(\\\"addEventListener\\\"in document))return!1;t=\\\"on\\\"+e;var n=t in document;return n||(n=document.createElement(\\\"div\\\"),n.setAttribute(t,\\\"return;\\\"),n=\\\"function\\\"===typeof n[t]),!n&&wt&&\\\"wheel\\\"===e&&(n=document.implementation.hasFeature(\\\"Events.wheel\\\",\\\"3.0\\\")),n}function N(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n[\\\"Webkit\\\"+e]=\\\"webkit\\\"+t,n[\\\"Moz\\\"+e]=\\\"moz\\\"+t,n[\\\"ms\\\"+e]=\\\"MS\\\"+t,n[\\\"O\\\"+e]=\\\"o\\\"+t.toLowerCase(),n}function _(e){if(yn[e])return yn[e];if(!bn[e])return e;var t,n=bn[e];for(t in n)if(n.hasOwnProperty(t)&&t in vn)return yn[e]=n[t];return\\\"\\\"}function O(e){return Object.prototype.hasOwnProperty.call(e,xn)||(e[xn]=kn++,wn[e[xn]]={}),wn[e[xn]]}function I(e){return!!Hn.hasOwnProperty(e)||!Mn.hasOwnProperty(e)&&(Un.test(e)?Hn[e]=!0:(Mn[e]=!0,!1))}function R(){return null}function L(e){var t=\\\"\\\";return ht.Children.forEach(e,function(e){null==e||\\\"string\\\"!==typeof e&&\\\"number\\\"!==typeof e||(t+=e)}),t}function U(e,t,n){if(e=e.options,t){t={};for(var r=0;r<n.length;r++)t[\\\"$\\\"+n[r]]=!0;for(n=0;n<e.length;n++)r=t.hasOwnProperty(\\\"$\\\"+e[n].value),e[n].selected!==r&&(e[n].selected=r)}else{for(n=\\\"\\\"+n,t=null,r=0;r<e.length;r++){if(e[r].value===n)return void(e[r].selected=!0);null!==t||e[r].disabled||(t=e[r])}null!==t&&(t.selected=!0)}}function M(e,t){t&&(Jn[e]&&(null!=t.children||null!=t.dangerouslySetInnerHTML)&&r(\\\"137\\\",e,\\\"\\\"),null!=t.dangerouslySetInnerHTML&&(null!=t.children&&r(\\\"60\\\"),\\\"object\\\"===typeof t.dangerouslySetInnerHTML&&\\\"__html\\\"in t.dangerouslySetInnerHTML||r(\\\"61\\\")),null!=t.style&&\\\"object\\\"!==typeof t.style&&r(\\\"62\\\",\\\"\\\"))}function H(e){var t=e.type;return(e=e.nodeName)&&\\\"input\\\"===e.toLowerCase()&&(\\\"checkbox\\\"===t||\\\"radio\\\"===t)}function q(e){var t=H(e)?\\\"checked\\\":\\\"value\\\",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=\\\"\\\"+e[t];if(!e.hasOwnProperty(t)&&\\\"function\\\"===typeof n.get&&\\\"function\\\"===typeof n.set)return Object.defineProperty(e,t,{enumerable:n.enumerable,configurable:!0,get:function(){return n.get.call(this)},set:function(e){r=\\\"\\\"+e,n.set.call(this,e)}}),{getValue:function(){return r},setValue:function(e){r=\\\"\\\"+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}function j(e,t){if(-1===e.indexOf(\\\"-\\\"))return\\\"string\\\"===typeof t.is;switch(e){case\\\"annotation-xml\\\":case\\\"color-profile\\\":case\\\"font-face\\\":case\\\"font-face-src\\\":case\\\"font-face-uri\\\":case\\\"font-face-format\\\":case\\\"font-face-name\\\":case\\\"missing-glyph\\\":return!1;default:return!0}}function V(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===rr)return void(n.nodeValue=t)}e.textContent=t}function W(e,t){ir(t,e.nodeType===or||e.nodeType===ar?e:e.ownerDocument)}function z(e,t){return e!==Nr&&e!==Pr||t!==Nr&&t!==Pr?e===Sr&&t!==Sr?-255:e!==Sr&&t===Sr?255:e-t:0}function K(){return{first:null,last:null,hasForceUpdate:!1,callbackList:null}}function G(e,t,n,r){null!==n?n.next=t:(t.next=e.first,e.first=t),null!==r?t.next=r:e.last=t}function Y(e,t){t=t.priorityLevel;var n=null;if(null!==e.last&&0>=z(e.last.priorityLevel,t))n=e.last;else for(e=e.first;null!==e&&0>=z(e.priorityLevel,t);)n=e,e=e.next;return n}function $(e,t){var n=e.alternate,r=e.updateQueue;null===r&&(r=e.updateQueue=K()),null!==n?null===(e=n.updateQueue)&&(e=n.updateQueue=K()):e=null,Ir=r,Rr=e!==r?e:null;var u=Ir;n=Rr;var o=Y(u,t),a=null!==o?o.next:u.first;return null===n?(G(u,t,o,a),null):(r=Y(n,t),e=null!==r?r.next:n.first,G(u,t,o,a),a===e&&null!==a||o===r&&null!==o?(null===r&&(n.first=t),null===e&&(n.last=null),null):(t={priorityLevel:t.priorityLevel,partialState:t.partialState,callback:t.callback,isReplace:t.isReplace,isForced:t.isForced,isTopLevelUnmount:t.isTopLevelUnmount,next:null},G(n,t,r,e),t))}function Q(e,t,n,r){return e=e.partialState,\\\"function\\\"===typeof e?e.call(t,n,r):e}function X(e,t,n){e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=n}function J(e){return e.tag===jr&&null!=e.type.childContextTypes}function Z(e,t){var n=e.stateNode,u=e.type.childContextTypes;if(\\\"function\\\"!==typeof n.getChildContext)return t;n=n.getChildContext();for(var o in n)o in u||r(\\\"108\\\",f(e)||\\\"Unknown\\\",o);return mt({},t,n)}function ee(e,t,n){this.tag=e,this.key=t,this.stateNode=this.type=null,this.sibling=this.child=this.return=null,this.index=0,this.memoizedState=this.updateQueue=this.memoizedProps=this.pendingProps=this.ref=null,this.internalContextTag=n,this.effectTag=su,this.lastEffect=this.firstEffect=this.nextEffect=null,this.pendingWorkPriority=iu,this.alternate=null}function te(e,t,n){var u=void 0;return\\\"function\\\"===typeof e?(u=e.prototype&&e.prototype.isReactComponent?new ee(Zr,t,n):new ee(Jr,t,n),u.type=e):\\\"string\\\"===typeof e?(u=new ee(tu,t,n),u.type=e):\\\"object\\\"===typeof e&&null!==e&&\\\"number\\\"===typeof e.tag?u=e:r(\\\"130\\\",null==e?e:typeof e,\\\"\\\"),u}function ne(e){return null===e||\\\"undefined\\\"===typeof e?null:(e=Hu&&e[Hu]||e[\\\"@@iterator\\\"],\\\"function\\\"===typeof e?e:null)}function re(e,t){var n=t.ref;if(null!==n&&\\\"function\\\"!==typeof n){if(t._owner){t=t._owner;var u=void 0;t&&(\\\"number\\\"===typeof t.tag?(t.tag!==Pu&&r(\\\"110\\\"),u=t.stateNode):u=t.getPublicInstance()),u||r(\\\"147\\\",n);var o=\\\"\\\"+n;return null!==e&&null!==e.ref&&e.ref._stringRef===o?e.ref:(e=function(e){var t=u.refs===At?u.refs={}:u.refs;null===e?delete t[o]:t[o]=e},e._stringRef=o,e)}\\\"string\\\"!==typeof n&&r(\\\"148\\\"),t._owner||r(\\\"149\\\",n)}return n}function ue(e,t){\\\"textarea\\\"!==e.type&&r(\\\"31\\\",\\\"[object Object]\\\"===Object.prototype.toString.call(t)?\\\"object with keys {\\\"+Object.keys(t).join(\\\", \\\")+\\\"}\\\":t,\\\"\\\")}function oe(e,t){function n(n,r){if(t){if(!e){if(null===r.alternate)return;r=r.alternate}var u=n.lastEffect;null!==u?(u.nextEffect=r,n.lastEffect=r):n.firstEffect=n.lastEffect=r,r.nextEffect=null,r.effectTag=Mu}}function u(e,r){if(!t)return null;for(;null!==r;)n(e,r),r=r.sibling;return null}function o(e,t){for(e=new Map;null!==t;)null!==t.key?e.set(t.key,t):e.set(t.index,t),t=t.sibling;return e}function a(t,n){return e?(t=bu(t,n),t.index=0,t.sibling=null,t):(t.pendingWorkPriority=n,t.effectTag=Lu,t.index=0,t.sibling=null,t)}function i(e,n,r){return e.index=r,t?null!==(r=e.alternate)?(r=r.index,r<n?(e.effectTag=Uu,n):r):(e.effectTag=Uu,n):n}function l(e){return t&&null===e.alternate&&(e.effectTag=Uu),e}function s(e,t,n,r){return null===t||t.tag!==Nu?(n=Bu(n,e.internalContextTag,r),n.return=e,n):(t=a(t,r),t.pendingProps=n,t.return=e,t)}function c(e,t,n,r){return null===t||t.type!==n.type?(r=yu(n,e.internalContextTag,r),r.ref=re(t,n),r.return=e,r):(r=a(t,r),r.ref=re(t,n),r.pendingProps=n.props,r.return=e,r)}function p(e,t,n,r){return null===t||t.tag!==Ou?(n=wu(n,e.internalContextTag,r),n.return=e,n):(t=a(t,r),t.pendingProps=n,t.return=e,t)}function f(e,t,n,r){return null===t||t.tag!==Iu?(t=ku(n,e.internalContextTag,r),t.type=n.value,t.return=e,t):(t=a(t,r),t.type=n.value,t.return=e,t)}function d(e,t,n,r){return null===t||t.tag!==_u||t.stateNode.containerInfo!==n.containerInfo||t.stateNode.implementation!==n.implementation?(n=xu(n,e.internalContextTag,r),n.return=e,n):(t=a(t,r),t.pendingProps=n.children||[],t.return=e,t)}function D(e,t,n,r){return null===t||t.tag!==Ru?(n=vu(n,e.internalContextTag,r),n.return=e,n):(t=a(t,r),t.pendingProps=n,t.return=e,t)}function h(e,t,n){if(\\\"string\\\"===typeof t||\\\"number\\\"===typeof t)return t=Bu(\\\"\\\"+t,e.internalContextTag,n),t.return=e,t;if(\\\"object\\\"===typeof t&&null!==t){switch(t.$$typeof){case qu:return n=yu(t,e.internalContextTag,n),n.ref=re(null,t),n.return=e,n;case Eu:return t=wu(t,e.internalContextTag,n),t.return=e,t;case Au:return n=ku(t,e.internalContextTag,n),n.type=t.value,n.return=e,n;case Fu:return t=xu(t,e.internalContextTag,n),t.return=e,t}if(Tu(t)||ne(t))return t=vu(t,e.internalContextTag,n),t.return=e,t;ue(e,t)}return null}function g(e,t,n,r){var u=null!==t?t.key:null;if(\\\"string\\\"===typeof n||\\\"number\\\"===typeof n)return null!==u?null:s(e,t,\\\"\\\"+n,r);if(\\\"object\\\"===typeof n&&null!==n){switch(n.$$typeof){case qu:return n.key===u?c(e,t,n,r):null;case Eu:return n.key===u?p(e,t,n,r):null;case Au:return null===u?f(e,t,n,r):null;case Fu:return n.key===u?d(e,t,n,r):null}if(Tu(n)||ne(n))return null!==u?null:D(e,t,n,r);ue(e,n)}return null}function m(e,t,n,r,u){if(\\\"string\\\"===typeof r||\\\"number\\\"===typeof r)return e=e.get(n)||null,s(t,e,\\\"\\\"+r,u);if(\\\"object\\\"===typeof r&&null!==r){switch(r.$$typeof){case qu:return e=e.get(null===r.key?n:r.key)||null,c(t,e,r,u);case Eu:return e=e.get(null===r.key?n:r.key)||null,p(t,e,r,u);case Au:return e=e.get(n)||null,f(t,e,r,u);case Fu:return e=e.get(null===r.key?n:r.key)||null,d(t,e,r,u)}if(Tu(r)||ne(r))return e=e.get(n)||null,D(t,e,r,u);ue(t,r)}return null}function C(e,r,a,l){for(var s=null,c=null,p=r,f=r=0,d=null;null!==p&&f<a.length;f++){p.index>f?(d=p,p=null):d=p.sibling;var D=g(e,p,a[f],l);if(null===D){null===p&&(p=d);break}t&&p&&null===D.alternate&&n(e,p),r=i(D,r,f),null===c?s=D:c.sibling=D,c=D,p=d}if(f===a.length)return u(e,p),s;if(null===p){for(;f<a.length;f++)(p=h(e,a[f],l))&&(r=i(p,r,f),null===c?s=p:c.sibling=p,c=p);return s}for(p=o(e,p);f<a.length;f++)(d=m(p,e,f,a[f],l))&&(t&&null!==d.alternate&&p.delete(null===d.key?f:d.key),r=i(d,r,f),null===c?s=d:c.sibling=d,c=d);return t&&p.forEach(function(t){return n(e,t)}),s}function E(e,a,l,s){var c=ne(l);\\\"function\\\"!==typeof c&&r(\\\"150\\\"),null==(l=c.call(l))&&r(\\\"151\\\");for(var p=c=null,f=a,d=a=0,D=null,C=l.next();null!==f&&!C.done;d++,C=l.next()){f.index>d?(D=f,f=null):D=f.sibling;var E=g(e,f,C.value,s);if(null===E){f||(f=D);break}t&&f&&null===E.alternate&&n(e,f),a=i(E,a,d),null===p?c=E:p.sibling=E,p=E,f=D}if(C.done)return u(e,f),c;if(null===f){for(;!C.done;d++,C=l.next())null!==(C=h(e,C.value,s))&&(a=i(C,a,d),null===p?c=C:p.sibling=C,p=C);return c}for(f=o(e,f);!C.done;d++,C=l.next())null!==(C=m(f,e,d,C.value,s))&&(t&&null!==C.alternate&&f.delete(null===C.key?d:C.key),a=i(C,a,d),null===p?c=C:p.sibling=C,p=C);return t&&f.forEach(function(t){return n(e,t)}),c}return function(e,t,o,i){var s=\\\"object\\\"===typeof o&&null!==o;if(s)switch(o.$$typeof){case qu:e:{var c=o.key;for(s=t;null!==s;){if(s.key===c){if(s.type===o.type){u(e,s.sibling),t=a(s,i),t.ref=re(s,o),t.pendingProps=o.props,t.return=e,e=t;break e}u(e,s);break}n(e,s),s=s.sibling}i=yu(o,e.internalContextTag,i),i.ref=re(t,o),i.return=e,e=i}return l(e);case Eu:e:{for(s=o.key;null!==t;){if(t.key===s){if(t.tag===Ou){u(e,t.sibling),t=a(t,i),t.pendingProps=o,t.return=e,e=t;break e}u(e,t);break}n(e,t),t=t.sibling}o=wu(o,e.internalContextTag,i),o.return=e,e=o}return l(e);case Au:e:{if(null!==t){if(t.tag===Iu){u(e,t.sibling),t=a(t,i),t.type=o.value,t.return=e,e=t;break e}u(e,t)}t=ku(o,e.internalContextTag,i),t.type=o.value,t.return=e,e=t}return l(e);case Fu:e:{for(s=o.key;null!==t;){if(t.key===s){if(t.tag===_u&&t.stateNode.containerInfo===o.containerInfo&&t.stateNode.implementation===o.implementation){u(e,t.sibling),t=a(t,i),t.pendingProps=o.children||[],t.return=e,e=t;break e}u(e,t);break}n(e,t),t=t.sibling}o=xu(o,e.internalContextTag,i),o.return=e,e=o}return l(e)}if(\\\"string\\\"===typeof o||\\\"number\\\"===typeof o)return o=\\\"\\\"+o,null!==t&&t.tag===Nu?(u(e,t.sibling),t=a(t,i),t.pendingProps=o,t.return=e,e=t):(u(e,t),o=Bu(o,e.internalContextTag,i),o.return=e,e=o),l(e);if(Tu(o))return C(e,t,o,i);if(ne(o))return E(e,t,o,i);if(s&&ue(e,o),\\\"undefined\\\"===typeof o)switch(e.tag){case Pu:case Su:o=e.type,r(\\\"152\\\",o.displayName||o.name||\\\"Component\\\")}return u(e,t)}}function ae(e,t,n,u){function o(e,t){t.updater=a,e.stateNode=t,Yt.set(t,e)}var a={isMounted:ro,enqueueSetState:function(n,r,u){n=Yt.get(n);var o=t(n,!1);Ju(n,r,void 0===u?null:u,o),e(n,o)},enqueueReplaceState:function(n,r,u){n=Yt.get(n);var o=t(n,!1);Zu(n,r,void 0===u?null:u,o),e(n,o)},enqueueForceUpdate:function(n,r){n=Yt.get(n);var u=t(n,!1);eo(n,void 0===r?null:r,u),e(n,u)}};return{adoptClassInstance:o,constructClassInstance:function(e,t){var n=e.type,r=Qu(e),u=Xu(e),a=u?$u(e,r):At;return t=new n(t,a),o(e,t),u&&Yu(e,r,a),t},mountClassInstance:function(e,t){var n=e.alternate,u=e.stateNode,o=u.state||null,i=e.pendingProps;i||r(\\\"158\\\");var l=Qu(e);u.props=i,u.state=o,u.refs=At,u.context=$u(e,l),kr.enableAsyncSubtreeAPI&&null!=e.type&&null!=e.type.prototype&&!0===e.type.prototype.unstable_isAsyncReactComponent&&(e.internalContextTag|=Gu),\\\"function\\\"===typeof u.componentWillMount&&(l=u.state,u.componentWillMount(),l!==u.state&&a.enqueueReplaceState(u,u.state,null),null!==(l=e.updateQueue)&&(u.state=to(n,e,l,u,o,i,t))),\\\"function\\\"===typeof u.componentDidMount&&(e.effectTag|=Ku)},updateClassInstance:function(e,t,o){var i=t.stateNode;i.props=t.memoizedProps,i.state=t.memoizedState;var l=t.memoizedProps,s=t.pendingProps;s||null==(s=l)&&r(\\\"159\\\");var c=i.context,p=Qu(t);if(p=$u(t,p),\\\"function\\\"!==typeof i.componentWillReceiveProps||l===s&&c===p||(c=i.state,i.componentWillReceiveProps(s,p),i.state!==c&&a.enqueueReplaceState(i,i.state,null)),c=t.memoizedState,o=null!==t.updateQueue?to(e,t,t.updateQueue,i,c,s,o):c,!(l!==s||c!==o||no()||null!==t.updateQueue&&t.updateQueue.hasForceUpdate))return\\\"function\\\"!==typeof i.componentDidUpdate||l===e.memoizedProps&&c===e.memoizedState||(t.effectTag|=Ku),!1;var f=s;if(null===l||null!==t.updateQueue&&t.updateQueue.hasForceUpdate)f=!0;else{var d=t.stateNode,D=t.type;f=\\\"function\\\"===typeof d.shouldComponentUpdate?d.shouldComponentUpdate(f,o,p):!D.prototype||!D.prototype.isPureReactComponent||(!Ft(l,f)||!Ft(c,o))}return f?(\\\"function\\\"===typeof i.componentWillUpdate&&i.componentWillUpdate(s,o,p),\\\"function\\\"===typeof i.componentDidUpdate&&(t.effectTag|=Ku)):(\\\"function\\\"!==typeof i.componentDidUpdate||l===e.memoizedProps&&c===e.memoizedState||(t.effectTag|=Ku),n(t,s),u(t,o)),i.props=s,i.state=o,i.context=p,f}}}function ie(e,t,n,u,o){function a(e,t,n){i(e,t,n,t.pendingWorkPriority)}function i(e,t,n,r){t.child=null===e?uo(t,t.child,n,r):e.child===t.child?oo(t,t.child,n,r):ao(t,t.child,n,r)}function l(e,t){var n=t.ref;null===n||e&&e.ref===n||(t.effectTag|=_o)}function s(e,t,n,r){if(l(e,t),!n)return r&&ho(t,!1),p(e,t);n=t.stateNode,Oo.current=t;var u=n.render();return t.effectTag|=To,a(e,t,u),t.memoizedState=n.state,t.memoizedProps=n.props,r&&ho(t,!0),t.child}function c(e){var t=e.stateNode;t.pendingContext?Do(e,t.pendingContext,t.pendingContext!==t.context):t.context&&Do(e,t.context,!1),m(e,t.containerInfo)}function p(e,t){return io(e,t),t.child}function f(e,t){switch(t.tag){case Eo:c(t);break;case Co:fo(t);break;case bo:m(t,t.stateNode.containerInfo)}return null}var d=e.shouldSetTextContent,D=e.useSyncScheduling,h=e.shouldDeprioritizeSubtree,g=t.pushHostContext,m=t.pushHostContainer,C=n.enterHydrationState,E=n.resetHydrationState,A=n.tryToClaimNextHydratableInstance;e=ae(u,o,function(e,t){e.memoizedProps=t},function(e,t){e.memoizedState=t});var F=e.adoptClassInstance,b=e.constructClassInstance,y=e.mountClassInstance,v=e.updateClassInstance;return{beginWork:function(e,t,n){if(t.pendingWorkPriority===ko||t.pendingWorkPriority>n)return f(e,t);switch(t.tag){case go:null!==e&&r(\\\"155\\\");var u=t.type,o=t.pendingProps,i=co(t);return i=so(t,i),u=u(o,i),t.effectTag|=To,\\\"object\\\"===typeof u&&null!==u&&\\\"function\\\"===typeof u.render?(t.tag=Co,o=fo(t),F(t,u),y(t,n),t=s(e,t,!0,o)):(t.tag=mo,a(e,t,u),t.memoizedProps=o,t=t.child),t;case mo:e:{if(o=t.type,n=t.pendingProps,u=t.memoizedProps,po())null===n&&(n=u);else if(null===n||u===n){t=p(e,t);break e}u=co(t),u=so(t,u),o=o(n,u),t.effectTag|=To,a(e,t,o),t.memoizedProps=n,t=t.child}return t;case Co:return o=fo(t),u=void 0,null===e?t.stateNode?r(\\\"153\\\"):(b(t,t.pendingProps),y(t,n),u=!0):u=v(e,t,n),s(e,t,u,o);case Eo:return c(t),u=t.updateQueue,null!==u?(o=t.memoizedState,u=lo(e,t,u,null,o,null,n),o===u?(E(),t=p(e,t)):(o=u.element,null!==e&&null!==e.child||!C(t)?(E(),a(e,t,o)):(t.effectTag|=So,t.child=uo(t,t.child,o,n)),t.memoizedState=u,t=t.child)):(E(),t=p(e,t)),t;case Ao:g(t),null===e&&A(t),o=t.type;var B=t.memoizedProps;return u=t.pendingProps,null===u&&null===(u=B)&&r(\\\"154\\\"),i=null!==e?e.memoizedProps:null,po()||null!==u&&B!==u?(B=u.children,d(o,u)?B=null:i&&d(o,i)&&(t.effectTag|=Po),l(e,t),n!==xo&&!D&&h(o,u)?(t.pendingWorkPriority=xo,t=null):(a(e,t,B),t.memoizedProps=u,t=t.child)):t=p(e,t),t;case Fo:return null===e&&A(t),e=t.pendingProps,null===e&&(e=t.memoizedProps),t.memoizedProps=e,null;case vo:t.tag=yo;case yo:return n=t.pendingProps,po()?null===n&&null===(n=e&&e.memoizedProps)&&r(\\\"154\\\"):null!==n&&t.memoizedProps!==n||(n=t.memoizedProps),o=n.children,u=t.pendingWorkPriority,t.stateNode=null===e?uo(t,t.stateNode,o,u):e.child===t.child?oo(t,t.stateNode,o,u):ao(t,t.stateNode,o,u),t.memoizedProps=n,t.stateNode;case Bo:return null;case bo:e:{if(m(t,t.stateNode.containerInfo),n=t.pendingWorkPriority,o=t.pendingProps,po())null===o&&null==(o=e&&e.memoizedProps)&&r(\\\"154\\\");else if(null===o||t.memoizedProps===o){t=p(e,t);break e}null===e?t.child=ao(t,t.child,o,n):a(e,t,o),t.memoizedProps=o,t=t.child}return t;case wo:e:{if(n=t.pendingProps,po())null===n&&(n=t.memoizedProps);else if(null===n||t.memoizedProps===n){t=p(e,t);break e}a(e,t,n),t.memoizedProps=n,t=t.child}return t;default:r(\\\"156\\\")}},beginFailedWork:function(e,t,n){switch(t.tag){case Co:fo(t);break;case Eo:c(t);break;default:r(\\\"157\\\")}return t.effectTag|=No,null===e?t.child=null:t.child!==e.child&&(t.child=e.child),t.pendingWorkPriority===ko||t.pendingWorkPriority>n?f(e,t):(t.firstEffect=null,t.lastEffect=null,i(e,t,null,n),t.tag===Co&&(e=t.stateNode,t.memoizedProps=e.props,t.memoizedState=e.state),t.child)}}}function le(e,t,n){var u=e.createInstance,o=e.createTextInstance,a=e.appendInitialChild,i=e.finalizeInitialChildren,l=e.prepareUpdate,s=t.getRootHostContainer,c=t.popHostContext,p=t.getHostContext,f=t.popHostContainer,d=n.prepareToHydrateHostInstance,D=n.prepareToHydrateHostTextInstance,h=n.popHydrationState;return{completeWork:function(e,t,n){var g=t.pendingProps;switch(null===g?g=t.memoizedProps:t.pendingWorkPriority===Jo&&n!==Jo||(t.pendingProps=null),t.tag){case Mo:return null;case Ho:return Ro(t),null;case qo:return f(t),Lo(t),g=t.stateNode,g.pendingContext&&(g.context=g.pendingContext,g.pendingContext=null),null!==e&&null!==e.child||(h(t),t.effectTag&=~$o),null;case jo:c(t),n=s();var m=t.type;if(null!==e&&null!=t.stateNode){var C=e.memoizedProps,E=t.stateNode,A=p();g=l(E,m,C,g,n,A),(t.updateQueue=g)&&(t.effectTag|=Xo),e.ref!==t.ref&&(t.effectTag|=Qo)}else{if(!g)return null===t.stateNode&&r(\\\"166\\\"),null;if(e=p(),h(t))d(t,n,e)&&(t.effectTag|=Xo);else{e=u(m,g,n,e,t);e:for(C=t.child;null!==C;){if(C.tag===jo||C.tag===Vo)a(e,C.stateNode);else if(C.tag!==Wo&&null!==C.child){C=C.child;continue}if(C===t)break e;for(;null===C.sibling;){if(null===C.return||C.return===t)break e;C=C.return}C=C.sibling}i(e,m,g,n)&&(t.effectTag|=Xo),t.stateNode=e}null!==t.ref&&(t.effectTag|=Qo)}return null;case Vo:if(e&&null!=t.stateNode)e.memoizedProps!==g&&(t.effectTag|=Xo);else{if(\\\"string\\\"!==typeof g)return null===t.stateNode&&r(\\\"166\\\"),null;e=s(),n=p(),h(t)?D(t)&&(t.effectTag|=Xo):t.stateNode=o(g,e,n,t)}return null;case zo:(g=t.memoizedProps)||r(\\\"165\\\"),t.tag=Ko,n=[];e:for((m=t.stateNode)&&(m.return=t);null!==m;){if(m.tag===jo||m.tag===Vo||m.tag===Wo)r(\\\"164\\\");else if(m.tag===Go)n.push(m.type);else if(null!==m.child){m.child.return=m,m=m.child;continue}for(;null===m.sibling;){if(null===m.return||m.return===t)break e;m=m.return}m.sibling.return=m.return,m=m.sibling}return m=g.handler,g=m(g.props,n),t.child=Io(t,null!==e?e.child:null,g,t.pendingWorkPriority),t.child;case Ko:return t.tag=zo,null;case Go:case Yo:return null;case Wo:return t.effectTag|=Xo,f(t),null;case Uo:r(\\\"167\\\");default:r(\\\"156\\\")}}}}function se(e){return function(t){try{return e(t)}catch(e){}}}function ce(e,t){function n(e){var n=e.ref;if(null!==n)try{n(null)}catch(n){t(e,n)}}function u(e){return e.tag===ua||e.tag===ra||e.tag===aa}function o(e){for(var t=e;;)if(i(t),null!==t.child&&t.tag!==aa)t.child.return=t,t=t.child;else{if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return;t=t.return}t.sibling.return=t.return,t=t.sibling}}function a(e){for(var t=e,n=!1,u=void 0,a=void 0;;){if(!n){n=t.return;e:for(;;){switch(null===n&&r(\\\"160\\\"),n.tag){case ua:u=n.stateNode,a=!1;break e;case ra:case aa:u=n.stateNode.containerInfo,a=!0;break e}n=n.return}n=!0}if(t.tag===ua||t.tag===oa)o(t),a?m(u,t.stateNode):g(u,t.stateNode);else if(t.tag===aa?u=t.stateNode.containerInfo:i(t),null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return;t=t.return,t.tag===aa&&(n=!1)}t.sibling.return=t.return,t=t.sibling}}function i(e){switch(\\\"function\\\"===typeof sa&&sa(e),e.tag){case na:n(e);var r=e.stateNode;if(\\\"function\\\"===typeof r.componentWillUnmount)try{r.props=e.memoizedProps,r.state=e.memoizedState,r.componentWillUnmount()}catch(n){t(e,n)}break;case ua:n(e);break;case ia:o(e.stateNode);break;case aa:a(e)}}var l=e.commitMount,s=e.commitUpdate,c=e.resetTextContent,p=e.commitTextUpdate,f=e.appendChild,d=e.appendChildToContainer,D=e.insertBefore,h=e.insertInContainerBefore,g=e.removeChild,m=e.removeChildFromContainer,C=e.getPublicInstance;return{commitPlacement:function(e){e:{for(var t=e.return;null!==t;){if(u(t)){var n=t;break e}t=t.return}r(\\\"160\\\"),n=void 0}var o=t=void 0;switch(n.tag){case ua:t=n.stateNode,o=!1;break;case ra:case aa:t=n.stateNode.containerInfo,o=!0;break;default:r(\\\"161\\\")}n.effectTag&da&&(c(t),n.effectTag&=~da);e:t:for(n=e;;){for(;null===n.sibling;){if(null===n.return||u(n.return)){n=null;break e}n=n.return}for(n.sibling.return=n.return,n=n.sibling;n.tag!==ua&&n.tag!==oa;){if(n.effectTag&ca)continue t;if(null===n.child||n.tag===aa)continue t;n.child.return=n,n=n.child}if(!(n.effectTag&ca)){n=n.stateNode;break e}}for(var a=e;;){if(a.tag===ua||a.tag===oa)n?o?h(t,a.stateNode,n):D(t,a.stateNode,n):o?d(t,a.stateNode):f(t,a.stateNode);else if(a.tag!==aa&&null!==a.child){a.child.return=a,a=a.child;continue}if(a===e)break;for(;null===a.sibling;){if(null===a.return||a.return===e)return;a=a.return}a.sibling.return=a.return,a=a.sibling}},commitDeletion:function(e){a(e),e.return=null,e.child=null,e.alternate&&(e.alternate.child=null,e.alternate.return=null)},commitWork:function(e,t){switch(t.tag){case na:break;case ua:var n=t.stateNode;if(null!=n){var u=t.memoizedProps;e=null!==e?e.memoizedProps:u;var o=t.type,a=t.updateQueue;t.updateQueue=null,null!==a&&s(n,a,o,e,u,t)}break;case oa:null===t.stateNode&&r(\\\"162\\\"),n=t.memoizedProps,p(t.stateNode,null!==e?e.memoizedProps:n,n);break;case ra:case aa:break;default:r(\\\"163\\\")}},commitLifeCycles:function(e,t){switch(t.tag){case na:var n=t.stateNode;if(t.effectTag&pa)if(null===e)n.props=t.memoizedProps,n.state=t.memoizedState,n.componentDidMount();else{var u=e.memoizedProps;e=e.memoizedState,n.props=t.memoizedProps,n.state=t.memoizedState,n.componentDidUpdate(u,e)}t.effectTag&fa&&null!==t.updateQueue&&la(t,t.updateQueue,n);break;case ra:e=t.updateQueue,null!==e&&la(t,e,t.child&&t.child.stateNode);break;case ua:n=t.stateNode,null===e&&t.effectTag&pa&&l(n,t.type,t.memoizedProps,t);break;case oa:case aa:break;default:r(\\\"163\\\")}},commitAttachRef:function(e){var t=e.ref;if(null!==t){var n=e.stateNode;switch(e.tag){case ua:t(C(n));break;default:t(n)}}},commitDetachRef:function(e){null!==(e=e.ref)&&e(null)}}}function pe(e){function t(e){return e===ma&&r(\\\"174\\\"),e}var n=e.getChildHostContext,u=e.getRootHostContext,o=Da(ma),a=Da(ma),i=Da(ma);return{getHostContext:function(){return t(o.current)},getRootHostContainer:function(){return t(i.current)},popHostContainer:function(e){ha(o,e),ha(a,e),ha(i,e)},popHostContext:function(e){a.current===e&&(ha(o,e),ha(a,e))},pushHostContainer:function(e,t){ga(i,t,e),t=u(t),ga(a,e,e),ga(o,t,e)},pushHostContext:function(e){var r=t(i.current),u=t(o.current);r=n(u,e.type,r),u!==r&&(ga(a,e,e),ga(o,r,e))},resetHostContainer:function(){o.current=ma,i.current=ma}}}function fe(e){function t(e,t){var n=ya();n.stateNode=t,n.return=e,n.effectTag=Fa,null!==e.lastEffect?(e.lastEffect.nextEffect=n,e.lastEffect=n):e.firstEffect=e.lastEffect=n}function n(e,t){switch(e.tag){case Ca:return a(t,e.type,e.pendingProps);case Ea:return i(t,e.pendingProps);default:return!1}}function u(e){for(e=e.return;null!==e&&e.tag!==Ca&&e.tag!==Aa;)e=e.return;D=e}var o=e.shouldSetTextContent,a=e.canHydrateInstance,i=e.canHydrateTextInstance,l=e.getNextHydratableSibling,s=e.getFirstHydratableChild,c=e.hydrateInstance,p=e.hydrateTextInstance,f=e.didNotHydrateInstance,d=e.didNotFindHydratableInstance;if(e=e.didNotFindHydratableTextInstance,!(a&&i&&l&&s&&c&&p&&f&&d&&e))return{enterHydrationState:function(){return!1},resetHydrationState:function(){},tryToClaimNextHydratableInstance:function(){},prepareToHydrateHostInstance:function(){r(\\\"175\\\")},prepareToHydrateHostTextInstance:function(){r(\\\"176\\\")},popHydrationState:function(){return!1}};var D=null,h=null,g=!1;return{enterHydrationState:function(e){return h=s(e.stateNode.containerInfo),D=e,g=!0},resetHydrationState:function(){h=D=null,g=!1},tryToClaimNextHydratableInstance:function(e){if(g){var r=h;if(r){if(!n(e,r)){if(!(r=l(r))||!n(e,r))return e.effectTag|=ba,g=!1,void(D=e);t(D,h)}e.stateNode=r,D=e,h=s(r)}else e.effectTag|=ba,g=!1,D=e}},prepareToHydrateHostInstance:function(e,t,n){return t=c(e.stateNode,e.type,e.memoizedProps,t,n,e),e.updateQueue=t,null!==t},prepareToHydrateHostTextInstance:function(e){return p(e.stateNode,e.memoizedProps,e)},popHydrationState:function(e){if(e!==D)return!1;if(!g)return u(e),g=!0,!1;var n=e.type;if(e.tag!==Ca||\\\"head\\\"!==n&&\\\"body\\\"!==n&&!o(n,e.memoizedProps))for(n=h;n;)t(e,n),n=l(n);return u(e),h=D?l(e.stateNode):null,!0}}}function de(e){function t(){for(;null!==K&&K.current.pendingWorkPriority===Sa;){K.isScheduled=!1;var e=K.nextScheduledRoot;if(K.nextScheduledRoot=null,K===G)return G=K=null,V=Sa,null;K=e}e=K;for(var t=null,n=Sa;null!==e;)e.current.pendingWorkPriority!==Sa&&(n===Sa||n>e.current.pendingWorkPriority)&&(n=e.current.pendingWorkPriority,t=e),e=e.nextScheduledRoot;null!==t?(V=n,Ba(),Xa(),b(),j=ka(t.current,n),t!==ue&&(re=0,ue=t)):(V=Sa,ue=j=null)}function n(n){ee=!0,z=null;var u=n.stateNode;if(u.current===n&&r(\\\"177\\\"),V!==Pa&&V!==Na||re++,wa.current=null,n.effectTag>La)if(null!==n.lastEffect){n.lastEffect.nextEffect=n;var o=n.firstEffect}else o=n;else o=n.firstEffect;for(I(),W=o;null!==W;){var a=!1,i=void 0;try{for(;null!==W;){var l=W.effectTag;if(l&ja&&e.resetTextContent(W.stateNode),l&za){var s=W.alternate;null!==s&&N(s)}switch(l&~(Va|Wa|ja|za|La)){case Ua:k(W),W.effectTag&=~Ua;break;case Ha:k(W),W.effectTag&=~Ua,T(W.alternate,W);break;case Ma:T(W.alternate,W);break;case qa:te=!0,x(W),te=!1}W=W.nextEffect}}catch(e){a=!0,i=e}a&&(null===W&&r(\\\"178\\\"),p(W,i),null!==W&&(W=W.nextEffect))}for(R(),u.current=n,W=o;null!==W;){u=!1,o=void 0;try{for(;null!==W;){var c=W.effectTag;if(c&(Ma|Va)&&S(W.alternate,W),c&za&&P(W),c&Wa)switch(a=W,i=void 0,null!==$&&(i=$.get(a),$.delete(a),null==i&&null!==a.alternate&&(a=a.alternate,i=$.get(a),$.delete(a))),null==i&&r(\\\"184\\\"),a.tag){case $a:a.stateNode.componentDidCatch(i.error,{componentStack:i.componentStack});break;case Ka:null===J&&(J=i.error);break;default:r(\\\"157\\\")}var f=W.nextEffect;W.nextEffect=null,W=f}}catch(e){u=!0,o=e}u&&(null===W&&r(\\\"178\\\"),p(W,o),null!==W&&(W=W.nextEffect))}ee=!1,\\\"function\\\"===typeof Ta&&Ta(n.stateNode),X&&(X.forEach(m),X=null),t()}function u(e){for(;;){var t=w(e.alternate,e,V),n=e.return,r=e.sibling,u=e;if(!(u.pendingWorkPriority!==Sa&&u.pendingWorkPriority>V)){for(var o=Qa(u),a=u.child;null!==a;)o=xa(o,a.pendingWorkPriority),a=a.sibling;u.pendingWorkPriority=o}if(null!==t)return t;if(null!==n&&(null===n.firstEffect&&(n.firstEffect=e.firstEffect),null!==e.lastEffect&&(null!==n.lastEffect&&(n.lastEffect.nextEffect=e.firstEffect),n.lastEffect=e.lastEffect),e.effectTag>La&&(null!==n.lastEffect?n.lastEffect.nextEffect=e:n.firstEffect=e,n.lastEffect=e)),null!==r)return r;if(null===n){z=e;break}e=n}return null}function o(e){var t=v(e.alternate,e,V);return null===t&&(t=u(e)),wa.current=null,t}function a(e){var t=B(e.alternate,e,V);return null===t&&(t=u(e)),wa.current=null,t}function i(e){c(Ia,e)}function l(){if(null!==$&&0<$.size&&V===Na)for(;null!==j;){var e=j;if(null===(j=null!==$&&($.has(e)||null!==e.alternate&&$.has(e.alternate))?a(j):o(j))&&(null===z&&r(\\\"179\\\"),L=Na,n(z),L=V,null===$||0===$.size||V!==Na))break}}function s(e,u){if(null!==z?(L=Na,n(z),l()):null===j&&t(),!(V===Sa||V>e)){L=V;e:for(;;){if(V<=Na)for(;null!==j&&!(null===(j=o(j))&&(null===z&&r(\\\"179\\\"),L=Na,n(z),L=V,l(),V===Sa||V>e||V>Na)););else if(null!==u)for(;null!==j&&!M;)if(1<u.timeRemaining()){if(null===(j=o(j)))if(null===z&&r(\\\"179\\\"),1<u.timeRemaining()){if(L=Na,n(z),L=V,l(),V===Sa||V>e||V<_a)break}else M=!0}else M=!0;switch(V){case Pa:case Na:if(V<=e)continue e;break e;case _a:case Oa:case Ia:if(null===u)break e;if(!M&&V<=e)continue e;break e;case Sa:break e;default:r(\\\"181\\\")}}}}function c(e,t){U&&r(\\\"182\\\"),U=!0;var n=L,u=!1,o=null;try{s(e,t)}catch(e){u=!0,o=e}for(;u;){if(Z){J=o;break}var l=j;if(null===l)Z=!0;else{var c=p(l,o);if(null===c&&r(\\\"183\\\"),!Z){try{u=c,o=e,c=t;for(var f=u;null!==l;){switch(l.tag){case $a:va(l);break;case Ga:F(l);break;case Ka:A(l);break;case Ya:A(l)}if(l===f||l.alternate===f)break;l=l.return}j=a(u),s(o,c)}catch(e){u=!0,o=e;continue}break}}}if(L=n,null!==t&&(Y=!1),V>Na&&!Y&&(_(i),Y=!0),e=J,Z=M=U=!1,ue=Q=$=J=null,re=0,null!==e)throw e}function p(e,t){var n=wa.current=null,r=!1,u=!1,o=null;if(e.tag===Ka)n=e,d(e)&&(Z=!0);else for(var a=e.return;null!==a&&null===n;){if(a.tag===$a?\\\"function\\\"===typeof a.stateNode.componentDidCatch&&(r=!0,o=f(a),n=a,u=!0):a.tag===Ka&&(n=a),d(a)){if(te||null!==X&&(X.has(a)||null!==a.alternate&&X.has(a.alternate)))return null;n=null,u=!1}a=a.return}if(null!==n){null===Q&&(Q=new Set),Q.add(n);var i=\\\"\\\";a=e;do{e:switch(a.tag){case fu:case du:case Du:case hu:var l=a._debugOwner,s=a._debugSource,c=f(a),p=null;l&&(p=f(l)),l=s,c=\\\"\\\\n in \\\"+(c||\\\"Unknown\\\")+(l?\\\" (at \\\"+l.fileName.replace(/^.*[\\\\\\\\\\\\/]/,\\\"\\\")+\\\":\\\"+l.lineNumber+\\\")\\\":p?\\\" (created by \\\"+p+\\\")\\\":\\\"\\\");break e;default:c=\\\"\\\"}i+=c,a=a.return}while(a);a=i,e=f(e),null===$&&($=new Map),t={componentName:e,componentStack:a,error:t,errorBoundary:r?n.stateNode:null,errorBoundaryFound:r,errorBoundaryName:o,willRetry:u},$.set(n,t);try{console.error(t.error)}catch(e){console.error(e)}return ee?(null===X&&(X=new Set),X.add(n)):m(n),n}return null===J&&(J=t),null}function d(e){return null!==Q&&(Q.has(e)||null!==e.alternate&&Q.has(e.alternate))}function D(e,t){return h(e,t,!1)}function h(e,t){re>ne&&(Z=!0,r(\\\"185\\\")),!U&&t<=V&&(j=null);for(var n=!0;null!==e&&n;){if(n=!1,(e.pendingWorkPriority===Sa||e.pendingWorkPriority>t)&&(n=!0,e.pendingWorkPriority=t),null!==e.alternate&&(e.alternate.pendingWorkPriority===Sa||e.alternate.pendingWorkPriority>t)&&(n=!0,e.alternate.pendingWorkPriority=t),null===e.return){if(e.tag!==Ka)break;var u=e.stateNode;if(t===Sa||u.isScheduled||(u.isScheduled=!0,G?G.nextScheduledRoot=u:K=u,G=u),!U)switch(t){case Pa:q?c(Pa,null):c(Na,null);break;case Na:H||r(\\\"186\\\");break;default:Y||(_(i),Y=!0)}}e=e.return}}function g(e,t){var n=L;return n===Sa&&(n=!O||e.internalContextTag&Ra||t?Oa:Pa),n===Pa&&(U||H)?Na:n}function m(e){h(e,Na,!0)}var C=pe(e),E=fe(e),A=C.popHostContainer,F=C.popHostContext,b=C.resetHostContainer,y=ie(e,C,E,D,g),v=y.beginWork,B=y.beginFailedWork,w=le(e,C,E).completeWork;C=ce(e,p);var k=C.commitPlacement,x=C.commitDeletion,T=C.commitWork,S=C.commitLifeCycles,P=C.commitAttachRef,N=C.commitDetachRef,_=e.scheduleDeferredCallback,O=e.useSyncScheduling,I=e.prepareForCommit,R=e.resetAfterCommit,L=Sa,U=!1,M=!1,H=!1,q=!1,j=null,V=Sa,W=null,z=null,K=null,G=null,Y=!1,$=null,Q=null,X=null,J=null,Z=!1,ee=!1,te=!1,ne=1e3,re=0,ue=null;return{scheduleUpdate:D,getPriorityContext:g,batchedUpdates:function(e,t){var n=H;H=!0;try{return e(t)}finally{H=n,U||H||c(Na,null)}},unbatchedUpdates:function(e){var t=q,n=H;q=H,H=!1;try{return e()}finally{H=n,q=t}},flushSync:function(e){var t=H,n=L;H=!0,L=Pa;try{return e()}finally{H=t,L=n,U&&r(\\\"187\\\"),c(Na,null)}},deferredUpdates:function(e){var t=L;L=Oa;try{return e()}finally{L=t}}}}function De(){r(\\\"196\\\")}function he(e){return e?(e=Yt.get(e),\\\"number\\\"===typeof e.tag?De(e):e._processChildContext(e._context)):At}function ge(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function me(e,t){var n=ge(e);e=0;for(var r;n;){if(n.nodeType===oi){if(r=e+n.textContent.length,e<=t&&r>=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=ge(n)}}function Ce(){return!ai&&gt.canUseDOM&&(ai=\\\"textContent\\\"in document.documentElement?\\\"textContent\\\":\\\"innerText\\\"),ai}function Ee(){r(\\\"211\\\")}function Ae(){r(\\\"212\\\")}function Fe(e){if(null==e)return null;if(e.nodeType===pi)return e;var t=Yt.get(e);if(t)return\\\"number\\\"===typeof t.tag?Ee(t):Ae(t);\\\"function\\\"===typeof e.render?r(\\\"188\\\"):r(\\\"213\\\",Object.keys(e))}function be(e){if(void 0!==e._hostParent)return e._hostParent;if(\\\"number\\\"===typeof e.tag){do{e=e.return}while(e&&e.tag!==fi);if(e)return e}return null}function ye(e,t){for(var n=0,r=e;r;r=be(r))n++;r=0;for(var u=t;u;u=be(u))r++;for(;0<n-r;)e=be(e),n--;for(;0<r-n;)t=be(t),r--;for(;n--;){if(e===t||e===t.alternate)return e;e=be(e),t=be(t)}return null}function ve(e,t,n){(t=Di(e,n.dispatchConfig.phasedRegistrationNames[t]))&&(n._dispatchListeners=B(n._dispatchListeners,t),n._dispatchInstances=B(n._dispatchInstances,e))}function Be(e){e&&e.dispatchConfig.phasedRegistrationNames&&di.traverseTwoPhase(e._targetInst,ve,e)}function we(e){if(e&&e.dispatchConfig.phasedRegistrationNames){var t=e._targetInst;t=t?di.getParentInstance(t):null,di.traverseTwoPhase(t,ve,e)}}function ke(e,t,n){e&&n&&n.dispatchConfig.registrationName&&(t=Di(e,n.dispatchConfig.registrationName))&&(n._dispatchListeners=B(n._dispatchListeners,t),n._dispatchInstances=B(n._dispatchInstances,e))}function xe(e){e&&e.dispatchConfig.registrationName&&ke(e._targetInst,null,e)}function Te(e,t,n,r){this.dispatchConfig=e,this._targetInst=t,this.nativeEvent=n,e=this.constructor.Interface;for(var u in e)e.hasOwnProperty(u)&&((t=e[u])?this[u]=t(n):\\\"target\\\"===u?this.target=r:this[u]=n[u]);return this.isDefaultPrevented=(null!=n.defaultPrevented?n.defaultPrevented:!1===n.returnValue)?Et.thatReturnsTrue:Et.thatReturnsFalse,this.isPropagationStopped=Et.thatReturnsFalse,this}function Se(e,t,n,r){if(this.eventPool.length){var u=this.eventPool.pop();return this.call(u,e,t,n,r),u}return new this(e,t,n,r)}function Pe(e){e instanceof this||r(\\\"223\\\"),e.destructor(),10>this.eventPool.length&&this.eventPool.push(e)}function Ne(e){e.eventPool=[],e.getPooled=Se,e.release=Pe}function _e(e,t,n,r){return Te.call(this,e,t,n,r)}function Oe(e,t,n,r){return Te.call(this,e,t,n,r)}function Ie(e,t){switch(e){case\\\"topKeyUp\\\":return-1!==Fi.indexOf(t.keyCode);case\\\"topKeyDown\\\":return 229!==t.keyCode;case\\\"topKeyPress\\\":case\\\"topMouseDown\\\":case\\\"topBlur\\\":return!0;default:return!1}}function Re(e){return e=e.detail,\\\"object\\\"===typeof e&&\\\"data\\\"in e?e.data:null}function Le(e,t){switch(e){case\\\"topCompositionEnd\\\":return Re(t);case\\\"topKeyPress\\\":return 32!==t.which?null:(Si=!0,xi);case\\\"topTextInput\\\":return e=t.data,e===xi&&Si?null:e;default:return null}}function Ue(e,t){if(Pi)return\\\"topCompositionEnd\\\"===e||!bi&&Ie(e,t)?(e=Ci.getData(),Ci.reset(),Pi=!1,e):null;switch(e){case\\\"topPaste\\\":return null;case\\\"topKeyPress\\\":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case\\\"topCompositionEnd\\\":return ki?null:t.data;default:return null}}function Me(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return\\\"input\\\"===t?!!_i[e.type]:\\\"textarea\\\"===t}function He(e,t,n){return e=Te.getPooled(Oi.change,e,t,n),e.type=\\\"change\\\",fn.enqueueStateRestore(n),hi.accumulateTwoPhaseDispatches(e),e}function qe(e){Fn.enqueueEvents(e),Fn.processEventQueue(!1)}function je(e){var t=Gt.getNodeFromInstance(e);if(Zn.updateValueIfChanged(t))return e}function Ve(e,t){if(\\\"topChange\\\"===e)return t}function We(){Ii&&(Ii.detachEvent(\\\"onpropertychange\\\",ze),Ri=Ii=null)}function ze(e){\\\"value\\\"===e.propertyName&&je(Ri)&&(e=He(Ri,e,y(e)),Dn.batchedUpdates(qe,e))}function Ke(e,t,n){\\\"topFocus\\\"===e?(We(),Ii=t,Ri=n,Ii.attachEvent(\\\"onpropertychange\\\",ze)):\\\"topBlur\\\"===e&&We()}function Ge(e){if(\\\"topSelectionChange\\\"===e||\\\"topKeyUp\\\"===e||\\\"topKeyDown\\\"===e)return je(Ri)}function Ye(e,t){if(\\\"topClick\\\"===e)return je(t)}function $e(e,t){if(\\\"topInput\\\"===e||\\\"topChange\\\"===e)return je(t)}function Qe(e,t,n,r){return Te.call(this,e,t,n,r)}function Xe(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=Mi[e])&&!!t[e]}function Je(){return Xe}function Ze(e,t,n,r){return Te.call(this,e,t,n,r)}function et(e,t){if(Yi||null==zi||zi!==vt())return null;var n=zi;return\\\"selectionStart\\\"in n&&ci.hasSelectionCapabilities(n)?n={start:n.selectionStart,end:n.selectionEnd}:window.getSelection?(n=window.getSelection(),n={anchorNode:n.anchorNode,anchorOffset:n.anchorOffset,focusNode:n.focusNode,focusOffset:n.focusOffset}):n=void 0,Gi&&Ft(Gi,n)?null:(Gi=n,e=Te.getPooled(Wi.select,Ki,e,t),e.type=\\\"select\\\",e.target=zi,hi.accumulateTwoPhaseDispatches(e),e)}function tt(e,t,n,r){return Te.call(this,e,t,n,r)}function nt(e,t,n,r){return Te.call(this,e,t,n,r)}function rt(e,t,n,r){return Te.call(this,e,t,n,r)}function ut(e){var t=e.keyCode;return\\\"charCode\\\"in e?0===(e=e.charCode)&&13===t&&(e=13):e=t,32<=e||13===e?e:0}function ot(e,t,n,r){return Te.call(this,e,t,n,r)}function at(e,t,n,r){return Te.call(this,e,t,n,r)}function it(e,t,n,r){return Te.call(this,e,t,n,r)}function lt(e,t,n,r){return Te.call(this,e,t,n,r)}function st(e,t,n,r){return Te.call(this,e,t,n,r)}function ct(e){return e[1].toUpperCase()}function pt(e){return!(!e||e.nodeType!==dl&&e.nodeType!==gl&&e.nodeType!==ml&&(e.nodeType!==hl||\\\" react-mount-point-unstable \\\"!==e.nodeValue))}function ft(e){return!(!(e=e?e.nodeType===gl?e.documentElement:e.firstChild:null)||e.nodeType!==dl||!e.hasAttribute(Cl))}function dt(e,t,n,u,o){pt(n)||r(\\\"200\\\");var a=n._reactRootContainer;if(a)Il.updateContainer(t,a,e,o);else{if(!u&&!ft(n))for(u=void 0;u=n.lastChild;)n.removeChild(u);var i=Il.createContainer(n);a=n._reactRootContainer=i,Il.unbatchedUpdates(function(){Il.updateContainer(t,i,e,o)})}return Il.getPublicRootInstance(a)}function Dt(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;return pt(t)||r(\\\"200\\\"),Cu.createPortal(e,t,null,n)}var ht=n(0);n(6);var gt=n(27),mt=n(2),Ct=n(28),Et=n(3),At=n(5),Ft=n(29),bt=n(30),yt=n(33),vt=n(34);ht||r(\\\"227\\\");var Bt,wt,kt={Namespaces:{html:\\\"http://www.w3.org/1999/xhtml\\\",mathml:\\\"http://www.w3.org/1998/Math/MathML\\\",svg:\\\"http://www.w3.org/2000/svg\\\"},getIntrinsicNamespace:u,getChildNamespace:function(e,t){return null==e||\\\"http://www.w3.org/1999/xhtml\\\"===e?u(t):\\\"http://www.w3.org/2000/svg\\\"===e&&\\\"foreignObject\\\"===t?\\\"http://www.w3.org/1999/xhtml\\\":e}},xt=null,Tt={},St={plugins:[],eventNameDispatchConfigs:{},registrationNameModules:{},registrationNameDependencies:{},possibleRegistrationNames:null,injectEventPluginOrder:function(e){xt&&r(\\\"101\\\"),xt=Array.prototype.slice.call(e),o()},injectEventPluginsByName:function(e){var t,n=!1;for(t in e)if(e.hasOwnProperty(t)){var u=e[t];Tt.hasOwnProperty(t)&&Tt[t]===u||(Tt[t]&&r(\\\"102\\\",t),Tt[t]=u,n=!0)}n&&o()}},Pt=St,Nt={children:!0,dangerouslySetInnerHTML:!0,autoFocus:!0,defaultValue:!0,defaultChecked:!0,innerHTML:!0,suppressContentEditableWarning:!0,style:!0},_t={MUST_USE_PROPERTY:1,HAS_BOOLEAN_VALUE:4,HAS_NUMERIC_VALUE:8,HAS_POSITIVE_NUMERIC_VALUE:24,HAS_OVERLOADED_BOOLEAN_VALUE:32,HAS_STRING_BOOLEAN_VALUE:64,injectDOMPropertyConfig:function(e){var t=_t,n=e.Properties||{},u=e.DOMAttributeNamespaces||{},o=e.DOMAttributeNames||{};e=e.DOMMutationMethods||{};for(var a in n){Ot.properties.hasOwnProperty(a)&&r(\\\"48\\\",a);var l=a.toLowerCase(),s=n[a];l={attributeName:l,attributeNamespace:null,propertyName:a,mutationMethod:null,mustUseProperty:i(s,t.MUST_USE_PROPERTY),hasBooleanValue:i(s,t.HAS_BOOLEAN_VALUE),hasNumericValue:i(s,t.HAS_NUMERIC_VALUE),hasPositiveNumericValue:i(s,t.HAS_POSITIVE_NUMERIC_VALUE),hasOverloadedBooleanValue:i(s,t.HAS_OVERLOADED_BOOLEAN_VALUE),hasStringBooleanValue:i(s,t.HAS_STRING_BOOLEAN_VALUE)},1>=l.hasBooleanValue+l.hasNumericValue+l.hasOverloadedBooleanValue||r(\\\"50\\\",a),o.hasOwnProperty(a)&&(l.attributeName=o[a]),u.hasOwnProperty(a)&&(l.attributeNamespace=u[a]),e.hasOwnProperty(a)&&(l.mutationMethod=e[a]),Ot.properties[a]=l}}},Ot={ID_ATTRIBUTE_NAME:\\\"data-reactid\\\",ROOT_ATTRIBUTE_NAME:\\\"data-reactroot\\\",ATTRIBUTE_NAME_START_CHAR:\\\":A-Z_a-z\\\\\\\\u00C0-\\\\\\\\u00D6\\\\\\\\u00D8-\\\\\\\\u00F6\\\\\\\\u00F8-\\\\\\\\u02FF\\\\\\\\u0370-\\\\\\\\u037D\\\\\\\\u037F-\\\\\\\\u1FFF\\\\\\\\u200C-\\\\\\\\u200D\\\\\\\\u2070-\\\\\\\\u218F\\\\\\\\u2C00-\\\\\\\\u2FEF\\\\\\\\u3001-\\\\\\\\uD7FF\\\\\\\\uF900-\\\\\\\\uFDCF\\\\\\\\uFDF0-\\\\\\\\uFFFD\\\",ATTRIBUTE_NAME_CHAR:\\\":A-Z_a-z\\\\\\\\u00C0-\\\\\\\\u00D6\\\\\\\\u00D8-\\\\\\\\u00F6\\\\\\\\u00F8-\\\\\\\\u02FF\\\\\\\\u0370-\\\\\\\\u037D\\\\\\\\u037F-\\\\\\\\u1FFF\\\\\\\\u200C-\\\\\\\\u200D\\\\\\\\u2070-\\\\\\\\u218F\\\\\\\\u2C00-\\\\\\\\u2FEF\\\\\\\\u3001-\\\\\\\\uD7FF\\\\\\\\uF900-\\\\\\\\uFDCF\\\\\\\\uFDF0-\\\\\\\\uFFFD\\\\\\\\-.0-9\\\\\\\\u00B7\\\\\\\\u0300-\\\\\\\\u036F\\\\\\\\u203F-\\\\\\\\u2040\\\",properties:{},shouldSetAttribute:function(e,t){if(Ot.isReservedProp(e)||!(\\\"o\\\"!==e[0]&&\\\"O\\\"!==e[0]||\\\"n\\\"!==e[1]&&\\\"N\\\"!==e[1]))return!1;if(null===t)return!0;switch(typeof t){case\\\"boolean\\\":return Ot.shouldAttributeAcceptBooleanValue(e);case\\\"undefined\\\":case\\\"number\\\":case\\\"string\\\":case\\\"object\\\":return!0;default:return!1}},getPropertyInfo:function(e){return Ot.properties.hasOwnProperty(e)?Ot.properties[e]:null},shouldAttributeAcceptBooleanValue:function(e){if(Ot.isReservedProp(e))return!0;var t=Ot.getPropertyInfo(e);return t?t.hasBooleanValue||t.hasStringBooleanValue||t.hasOverloadedBooleanValue:\\\"data-\\\"===(e=e.toLowerCase().slice(0,5))||\\\"aria-\\\"===e},isReservedProp:function(e){return Nt.hasOwnProperty(e)},injection:_t},It=Ot,Rt={IndeterminateComponent:0,FunctionalComponent:1,ClassComponent:2,HostRoot:3,HostPortal:4,HostComponent:5,HostText:6,CoroutineComponent:7,CoroutineHandlerPhase:8,YieldComponent:9,Fragment:10},Lt={ELEMENT_NODE:1,TEXT_NODE:3,COMMENT_NODE:8,DOCUMENT_NODE:9,DOCUMENT_FRAGMENT_NODE:11},Ut=Rt.HostComponent,Mt=Rt.HostText,Ht=Lt.ELEMENT_NODE,qt=Lt.COMMENT_NODE,jt=It.ID_ATTRIBUTE_NAME,Vt={hasCachedChildNodes:1},Wt=Math.random().toString(36).slice(2),zt=\\\"__reactInternalInstance$\\\"+Wt,Kt=\\\"__reactEventHandlers$\\\"+Wt,Gt={getClosestInstanceFromNode:p,getInstanceFromNode:function(e){var t=e[zt];return t?t.tag===Ut||t.tag===Mt?t:t._hostNode===e?t:null:(t=p(e),null!=t&&t._hostNode===e?t:null)},getNodeFromInstance:function(e){if(e.tag===Ut||e.tag===Mt)return e.stateNode;if(void 0===e._hostNode&&r(\\\"33\\\"),e._hostNode)return e._hostNode;for(var t=[];!e._hostNode;)t.push(e),e._hostParent||r(\\\"34\\\"),e=e._hostParent;for(;t.length;e=t.pop())c(e,e._hostNode);return e._hostNode},precacheChildNodes:c,precacheNode:s,uncacheNode:function(e){var t=e._hostNode;t&&(delete t[zt],e._hostNode=null)},precacheFiberNode:function(e,t){t[zt]=e},getFiberCurrentPropsFromNode:function(e){return e[Kt]||null},updateFiberProps:function(e,t){e[Kt]=t}},Yt={remove:function(e){e._reactInternalFiber=void 0},get:function(e){return e._reactInternalFiber},has:function(e){return void 0!==e._reactInternalFiber},set:function(e,t){e._reactInternalFiber=t}},$t={ReactCurrentOwner:ht.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner},Qt={NoEffect:0,PerformedWork:1,Placement:2,Update:4,PlacementAndUpdate:6,Deletion:8,ContentReset:16,Callback:32,Err:64,Ref:128},Xt=Rt.HostComponent,Jt=Rt.HostRoot,Zt=Rt.HostPortal,en=Rt.HostText,tn=Qt.NoEffect,nn=Qt.Placement,rn={isFiberMounted:function(e){return 2===d(e)},isMounted:function(e){return!!(e=Yt.get(e))&&2===d(e)},findCurrentFiberUsingSlowPath:h,findCurrentHostFiber:function(e){if(!(e=h(e)))return null;for(var t=e;;){if(t.tag===Xt||t.tag===en)return t;if(t.child)t.child.return=t,t=t.child;else{if(t===e)break;for(;!t.sibling;){if(!t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}}return null},findCurrentHostFiberWithNoPortals:function(e){if(!(e=h(e)))return null;for(var t=e;;){if(t.tag===Xt||t.tag===en)return t;if(t.child&&t.tag!==Zt)t.child.return=t,t=t.child;else{if(t===e)break;for(;!t.sibling;){if(!t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}}return null}},un={_caughtError:null,_hasCaughtError:!1,_rethrowError:null,_hasRethrowError:!1,injection:{injectErrorUtils:function(e){\\\"function\\\"!==typeof e.invokeGuardedCallback&&r(\\\"197\\\"),g=e.invokeGuardedCallback}},invokeGuardedCallback:function(e,t,n,r,u,o,a,i,l){g.apply(un,arguments)},invokeGuardedCallbackAndCatchFirstError:function(e,t,n,r,u,o,a,i,l){if(un.invokeGuardedCallback.apply(this,arguments),un.hasCaughtError()){var s=un.clearCaughtError();un._hasRethrowError||(un._hasRethrowError=!0,un._rethrowError=s)}},rethrowCaughtError:function(){return m.apply(un,arguments)},hasCaughtError:function(){return un._hasCaughtError},clearCaughtError:function(){if(un._hasCaughtError){var e=un._caughtError;return un._caughtError=null,un._hasCaughtError=!1,e}r(\\\"198\\\")}},on=un,an={isEndish:function(e){return\\\"topMouseUp\\\"===e||\\\"topTouchEnd\\\"===e||\\\"topTouchCancel\\\"===e},isMoveish:function(e){return\\\"topMouseMove\\\"===e||\\\"topTouchMove\\\"===e},isStartish:function(e){return\\\"topMouseDown\\\"===e||\\\"topTouchStart\\\"===e},executeDirectDispatch:function(e){var t=e._dispatchListeners,n=e._dispatchInstances;return Array.isArray(t)&&r(\\\"103\\\"),e.currentTarget=t?an.getNodeFromInstance(n):null,t=t?t(e):null,e.currentTarget=null,e._dispatchListeners=null,e._dispatchInstances=null,t},executeDispatchesInOrder:function(e,t){var n=e._dispatchListeners,r=e._dispatchInstances;if(Array.isArray(n))for(var u=0;u<n.length&&!e.isPropagationStopped();u++)C(e,t,n[u],r[u]);else n&&C(e,t,n,r);e._dispatchListeners=null,e._dispatchInstances=null},executeDispatchesInOrderStopAtTrue:function(e){e:{var t=e._dispatchListeners,n=e._dispatchInstances;if(Array.isArray(t)){for(var r=0;r<t.length&&!e.isPropagationStopped();r++)if(t[r](e,n[r])){t=n[r];break e}}else if(t&&t(e,n)){t=n;break e}t=null}return e._dispatchInstances=null,e._dispatchListeners=null,t},hasDispatches:function(e){return!!e._dispatchListeners},getFiberCurrentPropsFromNode:function(e){return Bt.getFiberCurrentPropsFromNode(e)},getInstanceFromNode:function(e){return Bt.getInstanceFromNode(e)},getNodeFromInstance:function(e){return Bt.getNodeFromInstance(e)},injection:{injectComponentTree:function(e){Bt=e}}},ln=an,sn=null,cn=null,pn=null,fn={injection:{injectFiberControlledHostComponent:function(e){sn=e}},enqueueStateRestore:function(e){cn?pn?pn.push(e):pn=[e]:cn=e},restoreStateIfNeeded:function(){if(cn){var e=cn,t=pn;if(pn=cn=null,E(e),t)for(e=0;e<t.length;e++)E(t[e])}}},dn=!1,Dn={batchedUpdates:function(e,t){if(dn)return A(b,e,t);dn=!0;try{return A(b,e,t)}finally{dn=!1,fn.restoreStateIfNeeded()}},injection:{injectStackBatchedUpdates:function(e){A=e},injectFiberBatchedUpdates:function(e){F=e}}},hn=Lt.TEXT_NODE,gn=Rt.HostRoot,mn=[],Cn={_enabled:!0,_handleTopLevel:null,setHandleTopLevel:function(e){Cn._handleTopLevel=e},setEnabled:function(e){Cn._enabled=!!e},isEnabled:function(){return Cn._enabled},trapBubbledEvent:function(e,t,n){return n?Ct.listen(n,t,Cn.dispatchEvent.bind(null,e)):null},trapCapturedEvent:function(e,t,n){return n?Ct.capture(n,t,Cn.dispatchEvent.bind(null,e)):null},dispatchEvent:function(e,t){if(Cn._enabled){var n=y(t);if(n=Gt.getClosestInstanceFromNode(n),null===n||\\\"number\\\"!==typeof n.tag||rn.isFiberMounted(n)||(n=null),mn.length){var r=mn.pop();r.topLevelType=e,r.nativeEvent=t,r.targetInst=n,e=r}else e={topLevelType:e,nativeEvent:t,targetInst:n,ancestors:[]};try{Dn.batchedUpdates(v,e)}finally{e.topLevelType=null,e.nativeEvent=null,e.targetInst=null,e.ancestors.length=0,10>mn.length&&mn.push(e)}}}},En=Cn,An=null,Fn={injection:{injectEventPluginOrder:Pt.injectEventPluginOrder,injectEventPluginsByName:Pt.injectEventPluginsByName},getListener:function(e,t){if(\\\"number\\\"===typeof e.tag){var n=e.stateNode;if(!n)return null;var u=ln.getFiberCurrentPropsFromNode(n);if(!u)return null;if(n=u[t],S(t,e.type,u))return null}else{if(\\\"string\\\"===typeof(u=e._currentElement)||\\\"number\\\"===typeof u||!e._rootNodeID)return null;if(e=u.props,n=e[t],S(t,u.type,e))return null}return n&&\\\"function\\\"!==typeof n&&r(\\\"231\\\",t,typeof n),n},extractEvents:function(e,t,n,r){for(var u,o=Pt.plugins,a=0;a<o.length;a++){var i=o[a];i&&(i=i.extractEvents(e,t,n,r))&&(u=B(u,i))}return u},enqueueEvents:function(e){e&&(An=B(An,e))},processEventQueue:function(e){var t=An;An=null,e?w(t,x):w(t,T),An&&r(\\\"95\\\"),on.rethrowCaughtError()}};gt.canUseDOM&&(wt=document.implementation&&document.implementation.hasFeature&&!0!==document.implementation.hasFeature(\\\"\\\",\\\"\\\"));var bn={animationend:N(\\\"Animation\\\",\\\"AnimationEnd\\\"),animationiteration:N(\\\"Animation\\\",\\\"AnimationIteration\\\"),animationstart:N(\\\"Animation\\\",\\\"AnimationStart\\\"),transitionend:N(\\\"Transition\\\",\\\"TransitionEnd\\\")},yn={},vn={};gt.canUseDOM&&(vn=document.createElement(\\\"div\\\").style,\\\"AnimationEvent\\\"in window||(delete bn.animationend.animation,delete bn.animationiteration.animation,delete bn.animationstart.animation),\\\"TransitionEvent\\\"in window||delete bn.transitionend.transition);var Bn={topAbort:\\\"abort\\\",topAnimationEnd:_(\\\"animationend\\\")||\\\"animationend\\\",topAnimationIteration:_(\\\"animationiteration\\\")||\\\"animationiteration\\\",topAnimationStart:_(\\\"animationstart\\\")||\\\"animationstart\\\",topBlur:\\\"blur\\\",topCancel:\\\"cancel\\\",topCanPlay:\\\"canplay\\\",topCanPlayThrough:\\\"canplaythrough\\\",topChange:\\\"change\\\",topClick:\\\"click\\\",topClose:\\\"close\\\",topCompositionEnd:\\\"compositionend\\\",topCompositionStart:\\\"compositionstart\\\",topCompositionUpdate:\\\"compositionupdate\\\",topContextMenu:\\\"contextmenu\\\",topCopy:\\\"copy\\\",topCut:\\\"cut\\\",topDoubleClick:\\\"dblclick\\\",topDrag:\\\"drag\\\",topDragEnd:\\\"dragend\\\",topDragEnter:\\\"dragenter\\\",topDragExit:\\\"dragexit\\\",topDragLeave:\\\"dragleave\\\",topDragOver:\\\"dragover\\\",topDragStart:\\\"dragstart\\\",topDrop:\\\"drop\\\",topDurationChange:\\\"durationchange\\\",topEmptied:\\\"emptied\\\",topEncrypted:\\\"encrypted\\\",topEnded:\\\"ended\\\",topError:\\\"error\\\",topFocus:\\\"focus\\\",topInput:\\\"input\\\",topKeyDown:\\\"keydown\\\",topKeyPress:\\\"keypress\\\",topKeyUp:\\\"keyup\\\",topLoadedData:\\\"loadeddata\\\",topLoad:\\\"load\\\",topLoadedMetadata:\\\"loadedmetadata\\\",topLoadStart:\\\"loadstart\\\",topMouseDown:\\\"mousedown\\\",topMouseMove:\\\"mousemove\\\",topMouseOut:\\\"mouseout\\\",topMouseOver:\\\"mouseover\\\",topMouseUp:\\\"mouseup\\\",topPaste:\\\"paste\\\",topPause:\\\"pause\\\",topPlay:\\\"play\\\",topPlaying:\\\"playing\\\",topProgress:\\\"progress\\\",topRateChange:\\\"ratechange\\\",topScroll:\\\"scroll\\\",topSeeked:\\\"seeked\\\",topSeeking:\\\"seeking\\\",topSelectionChange:\\\"selectionchange\\\",topStalled:\\\"stalled\\\",topSuspend:\\\"suspend\\\",topTextInput:\\\"textInput\\\",topTimeUpdate:\\\"timeupdate\\\",topToggle:\\\"toggle\\\",topTouchCancel:\\\"touchcancel\\\",topTouchEnd:\\\"touchend\\\",topTouchMove:\\\"touchmove\\\",topTouchStart:\\\"touchstart\\\",topTransitionEnd:_(\\\"transitionend\\\")||\\\"transitionend\\\",topVolumeChange:\\\"volumechange\\\",topWaiting:\\\"waiting\\\",topWheel:\\\"wheel\\\"},wn={},kn=0,xn=\\\"_reactListenersID\\\"+(\\\"\\\"+Math.random()).slice(2),Tn=mt({},{handleTopLevel:function(e,t,n,r){e=Fn.extractEvents(e,t,n,r),Fn.enqueueEvents(e),Fn.processEventQueue(!1)}},{setEnabled:function(e){En&&En.setEnabled(e)},isEnabled:function(){return!(!En||!En.isEnabled())},listenTo:function(e,t){var n=O(t);e=Pt.registrationNameDependencies[e];for(var r=0;r<e.length;r++){var u=e[r];n.hasOwnProperty(u)&&n[u]||(\\\"topWheel\\\"===u?P(\\\"wheel\\\")?En.trapBubbledEvent(\\\"topWheel\\\",\\\"wheel\\\",t):P(\\\"mousewheel\\\")?En.trapBubbledEvent(\\\"topWheel\\\",\\\"mousewheel\\\",t):En.trapBubbledEvent(\\\"topWheel\\\",\\\"DOMMouseScroll\\\",t):\\\"topScroll\\\"===u?En.trapCapturedEvent(\\\"topScroll\\\",\\\"scroll\\\",t):\\\"topFocus\\\"===u||\\\"topBlur\\\"===u?(En.trapCapturedEvent(\\\"topFocus\\\",\\\"focus\\\",t),En.trapCapturedEvent(\\\"topBlur\\\",\\\"blur\\\",t),n.topBlur=!0,n.topFocus=!0):\\\"topCancel\\\"===u?(P(\\\"cancel\\\",!0)&&En.trapCapturedEvent(\\\"topCancel\\\",\\\"cancel\\\",t),n.topCancel=!0):\\\"topClose\\\"===u?(P(\\\"close\\\",!0)&&En.trapCapturedEvent(\\\"topClose\\\",\\\"close\\\",t),n.topClose=!0):Bn.hasOwnProperty(u)&&En.trapBubbledEvent(u,Bn[u],t),n[u]=!0)}},isListeningToAllDependencies:function(e,t){t=O(t),e=Pt.registrationNameDependencies[e];for(var n=0;n<e.length;n++){var r=e[n];if(!t.hasOwnProperty(r)||!t[r])return!1}return!0},trapBubbledEvent:function(e,t,n){return En.trapBubbledEvent(e,t,n)},trapCapturedEvent:function(e,t,n){return En.trapCapturedEvent(e,t,n)}}),Sn={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},Pn=[\\\"Webkit\\\",\\\"ms\\\",\\\"Moz\\\",\\\"O\\\"];Object.keys(Sn).forEach(function(e){Pn.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Sn[t]=Sn[e]})});var Nn={isUnitlessNumber:Sn,shorthandPropertyExpansions:{background:{backgroundAttachment:!0,backgroundColor:!0,backgroundImage:!0,backgroundPositionX:!0,backgroundPositionY:!0,backgroundRepeat:!0},backgroundPosition:{backgroundPositionX:!0,backgroundPositionY:!0},border:{borderWidth:!0,borderStyle:!0,borderColor:!0},borderBottom:{borderBottomWidth:!0,borderBottomStyle:!0,borderBottomColor:!0},borderLeft:{borderLeftWidth:!0,borderLeftStyle:!0,borderLeftColor:!0},borderRight:{borderRightWidth:!0,borderRightStyle:!0,borderRightColor:!0},borderTop:{borderTopWidth:!0,borderTopStyle:!0,borderTopColor:!0},font:{fontStyle:!0,fontVariant:!0,fontWeight:!0,fontSize:!0,lineHeight:!0,fontFamily:!0},outline:{outlineWidth:!0,outlineStyle:!0,outlineColor:!0}}},_n=Nn.isUnitlessNumber,On=!1;if(gt.canUseDOM){var In=document.createElement(\\\"div\\\").style;try{In.font=\\\"\\\"}catch(e){On=!0}}var Rn,Ln={createDangerousStringForStyles:function(){},setValueForStyles:function(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=0===n.indexOf(\\\"--\\\"),u=n,o=t[n];if(u=null==o||\\\"boolean\\\"===typeof o||\\\"\\\"===o?\\\"\\\":r||\\\"number\\\"!==typeof o||0===o||_n.hasOwnProperty(u)&&_n[u]?(\\\"\\\"+o).trim():o+\\\"px\\\",\\\"float\\\"===n&&(n=\\\"cssFloat\\\"),r)e.setProperty(n,u);else if(u)e[n]=u;else if(r=On&&Nn.shorthandPropertyExpansions[n])for(var a in r)e[a]=\\\"\\\";else e[n]=\\\"\\\"}}},Un=new RegExp(\\\"^[\\\"+It.ATTRIBUTE_NAME_START_CHAR+\\\"][\\\"+It.ATTRIBUTE_NAME_CHAR+\\\"]*$\\\"),Mn={},Hn={},qn={setAttributeForID:function(e,t){e.setAttribute(It.ID_ATTRIBUTE_NAME,t)},setAttributeForRoot:function(e){e.setAttribute(It.ROOT_ATTRIBUTE_NAME,\\\"\\\")},getValueForProperty:function(){},getValueForAttribute:function(){},setValueForProperty:function(e,t,n){var r=It.getPropertyInfo(t);if(r&&It.shouldSetAttribute(t,n)){var u=r.mutationMethod;u?u(e,n):null==n||r.hasBooleanValue&&!n||r.hasNumericValue&&isNaN(n)||r.hasPositiveNumericValue&&1>n||r.hasOverloadedBooleanValue&&!1===n?qn.deleteValueForProperty(e,t):r.mustUseProperty?e[r.propertyName]=n:(t=r.attributeName,(u=r.attributeNamespace)?e.setAttributeNS(u,t,\\\"\\\"+n):r.hasBooleanValue||r.hasOverloadedBooleanValue&&!0===n?e.setAttribute(t,\\\"\\\"):e.setAttribute(t,\\\"\\\"+n))}else qn.setValueForAttribute(e,t,It.shouldSetAttribute(t,n)?n:null)},setValueForAttribute:function(e,t,n){I(t)&&(null==n?e.removeAttribute(t):e.setAttribute(t,\\\"\\\"+n))},deleteValueForAttribute:function(e,t){e.removeAttribute(t)},deleteValueForProperty:function(e,t){var n=It.getPropertyInfo(t);n?(t=n.mutationMethod)?t(e,void 0):n.mustUseProperty?e[n.propertyName]=!n.hasBooleanValue&&\\\"\\\":e.removeAttribute(n.attributeName):e.removeAttribute(t)}},jn=qn,Vn=$t.ReactDebugCurrentFrame,Wn={current:null,phase:null,resetCurrentFiber:function(){Vn.getCurrentStack=null,Wn.current=null,Wn.phase=null},setCurrentFiber:function(e,t){Vn.getCurrentStack=R,Wn.current=e,Wn.phase=t},getCurrentFiberOwnerName:function(){return null},getCurrentFiberStackAddendum:R},zn=Wn,Kn={getHostProps:function(e,t){var n=t.value,r=t.checked;return mt({type:void 0,step:void 0,min:void 0,max:void 0},t,{defaultChecked:void 0,defaultValue:void 0,value:null!=n?n:e._wrapperState.initialValue,checked:null!=r?r:e._wrapperState.initialChecked})},initWrapperState:function(e,t){var n=t.defaultValue;e._wrapperState={initialChecked:null!=t.checked?t.checked:t.defaultChecked,initialValue:null!=t.value?t.value:n,controlled:\\\"checkbox\\\"===t.type||\\\"radio\\\"===t.type?null!=t.checked:null!=t.value}},updateWrapper:function(e,t){var n=t.checked;null!=n&&jn.setValueForProperty(e,\\\"checked\\\",n||!1),n=t.value,null!=n?0===n&&\\\"\\\"===e.value?e.value=\\\"0\\\":\\\"number\\\"===t.type?(t=parseFloat(e.value)||0,(n!=t||n==t&&e.value!=n)&&(e.value=\\\"\\\"+n)):e.value!==\\\"\\\"+n&&(e.value=\\\"\\\"+n):(null==t.value&&null!=t.defaultValue&&e.defaultValue!==\\\"\\\"+t.defaultValue&&(e.defaultValue=\\\"\\\"+t.defaultValue),null==t.checked&&null!=t.defaultChecked&&(e.defaultChecked=!!t.defaultChecked))},postMountWrapper:function(e,t){switch(t.type){case\\\"submit\\\":case\\\"reset\\\":break;case\\\"color\\\":case\\\"date\\\":case\\\"datetime\\\":case\\\"datetime-local\\\":case\\\"month\\\":case\\\"time\\\":case\\\"week\\\":e.value=\\\"\\\",e.value=e.defaultValue;break;default:e.value=e.value}t=e.name,\\\"\\\"!==t&&(e.name=\\\"\\\"),e.defaultChecked=!e.defaultChecked,e.defaultChecked=!e.defaultChecked,\\\"\\\"!==t&&(e.name=t)},restoreControlledState:function(e,t){Kn.updateWrapper(e,t);var n=t.name;if(\\\"radio\\\"===t.type&&null!=n){for(t=e;t.parentNode;)t=t.parentNode;for(n=t.querySelectorAll(\\\"input[name=\\\"+JSON.stringify(\\\"\\\"+n)+'][type=\\\"radio\\\"]'),t=0;t<n.length;t++){var u=n[t];if(u!==e&&u.form===e.form){var o=Gt.getFiberCurrentPropsFromNode(u);o||r(\\\"90\\\"),Kn.updateWrapper(u,o)}}}}},Gn=Kn,Yn={validateProps:function(){},postMountWrapper:function(e,t){null!=t.value&&e.setAttribute(\\\"value\\\",t.value)},getHostProps:function(e,t){return e=mt({children:void 0},t),(t=L(t.children))&&(e.children=t),e}},$n={getHostProps:function(e,t){return mt({},t,{value:void 0})},initWrapperState:function(e,t){var n=t.value;e._wrapperState={initialValue:null!=n?n:t.defaultValue,wasMultiple:!!t.multiple}},postMountWrapper:function(e,t){e.multiple=!!t.multiple;var n=t.value;null!=n?U(e,!!t.multiple,n):null!=t.defaultValue&&U(e,!!t.multiple,t.defaultValue)},postUpdateWrapper:function(e,t){e._wrapperState.initialValue=void 0;var n=e._wrapperState.wasMultiple;e._wrapperState.wasMultiple=!!t.multiple;var r=t.value;null!=r?U(e,!!t.multiple,r):n!==!!t.multiple&&(null!=t.defaultValue?U(e,!!t.multiple,t.defaultValue):U(e,!!t.multiple,t.multiple?[]:\\\"\\\"))},restoreControlledState:function(e,t){var n=t.value;null!=n&&U(e,!!t.multiple,n)}},Qn={getHostProps:function(e,t){return null!=t.dangerouslySetInnerHTML&&r(\\\"91\\\"),mt({},t,{value:void 0,defaultValue:void 0,children:\\\"\\\"+e._wrapperState.initialValue})},initWrapperState:function(e,t){var n=t.value,u=n;null==n&&(n=t.defaultValue,t=t.children,null!=t&&(null!=n&&r(\\\"92\\\"),Array.isArray(t)&&(1>=t.length||r(\\\"93\\\"),t=t[0]),n=\\\"\\\"+t),null==n&&(n=\\\"\\\"),u=n),e._wrapperState={initialValue:\\\"\\\"+u}},updateWrapper:function(e,t){var n=t.value;null!=n&&(n=\\\"\\\"+n,n!==e.value&&(e.value=n),null==t.defaultValue&&(e.defaultValue=n)),null!=t.defaultValue&&(e.defaultValue=t.defaultValue)},postMountWrapper:function(e){var t=e.textContent;t===e._wrapperState.initialValue&&(e.value=t)},restoreControlledState:function(e,t){Qn.updateWrapper(e,t)}},Xn=Qn,Jn=mt({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0}),Zn={_getTrackerFromNode:function(e){return e._valueTracker},track:function(e){e._valueTracker||(e._valueTracker=q(e))},updateValueIfChanged:function(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r=\\\"\\\";return e&&(r=H(e)?e.checked?\\\"true\\\":\\\"false\\\":e.value),(e=r)!==n&&(t.setValue(e),!0)},stopTracking:function(e){(e=e._valueTracker)&&e.stopTracking()}},er=kt.Namespaces,tr=function(e){return\\\"undefined\\\"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(t,n,r,u){MSApp.execUnsafeLocalFunction(function(){return e(t,n)})}:e}(function(e,t){if(e.namespaceURI!==er.svg||\\\"innerHTML\\\"in e)e.innerHTML=t;else for(Rn=Rn||document.createElement(\\\"div\\\"),Rn.innerHTML=\\\"<svg>\\\"+t+\\\"</svg>\\\",t=Rn.firstChild;t.firstChild;)e.appendChild(t.firstChild)}),nr=/[\\\"'&<>]/,rr=Lt.TEXT_NODE;gt.canUseDOM&&(\\\"textContent\\\"in document.documentElement||(V=function(e,t){if(e.nodeType===rr)e.nodeValue=t;else{if(\\\"boolean\\\"===typeof t||\\\"number\\\"===typeof t)t=\\\"\\\"+t;else{t=\\\"\\\"+t;var n=nr.exec(t);if(n){var r,u=\\\"\\\",o=0;for(r=n.index;r<t.length;r++){switch(t.charCodeAt(r)){case 34:n=\\\"&quot;\\\";break;case 38:n=\\\"&amp;\\\";break;case 39:n=\\\"&#x27;\\\";break;case 60:n=\\\"&lt;\\\";break;case 62:n=\\\"&gt;\\\";break;default:continue}o!==r&&(u+=t.substring(o,r)),o=r+1,u+=n}t=o!==r?u+t.substring(o,r):u}}tr(e,t)}}));var ur=V,or=(zn.getCurrentFiberOwnerName,Lt.DOCUMENT_NODE),ar=Lt.DOCUMENT_FRAGMENT_NODE,ir=Tn.listenTo,lr=Pt.registrationNameModules,sr=kt.Namespaces.html,cr=kt.getIntrinsicNamespace,pr={topAbort:\\\"abort\\\",topCanPlay:\\\"canplay\\\",topCanPlayThrough:\\\"canplaythrough\\\",topDurationChange:\\\"durationchange\\\",topEmptied:\\\"emptied\\\",topEncrypted:\\\"encrypted\\\",topEnded:\\\"ended\\\",topError:\\\"error\\\",topLoadedData:\\\"loadeddata\\\",topLoadedMetadata:\\\"loadedmetadata\\\",topLoadStart:\\\"loadstart\\\",topPause:\\\"pause\\\",topPlay:\\\"play\\\",topPlaying:\\\"playing\\\",topProgress:\\\"progress\\\",topRateChange:\\\"ratechange\\\",topSeeked:\\\"seeked\\\",topSeeking:\\\"seeking\\\",topStalled:\\\"stalled\\\",topSuspend:\\\"suspend\\\",topTimeUpdate:\\\"timeupdate\\\",topVolumeChange:\\\"volumechange\\\",topWaiting:\\\"waiting\\\"},fr={createElement:function(e,t,n,r){return n=n.nodeType===or?n:n.ownerDocument,r===sr&&(r=cr(e)),r===sr?\\\"script\\\"===e?(e=n.createElement(\\\"div\\\"),e.innerHTML=\\\"<script><\\\\/script>\\\",e=e.removeChild(e.firstChild)):e=\\\"string\\\"===typeof t.is?n.createElement(e,{is:t.is}):n.createElement(e):e=n.createElementNS(r,e),e},createTextNode:function(e,t){return(t.nodeType===or?t:t.ownerDocument).createTextNode(e)},setInitialProperties:function(e,t,n,r){var u=j(t,n);switch(t){case\\\"iframe\\\":case\\\"object\\\":Tn.trapBubbledEvent(\\\"topLoad\\\",\\\"load\\\",e);var o=n;break;case\\\"video\\\":case\\\"audio\\\":for(o in pr)pr.hasOwnProperty(o)&&Tn.trapBubbledEvent(o,pr[o],e);o=n;break;case\\\"source\\\":Tn.trapBubbledEvent(\\\"topError\\\",\\\"error\\\",e),o=n;break;case\\\"img\\\":case\\\"image\\\":Tn.trapBubbledEvent(\\\"topError\\\",\\\"error\\\",e),Tn.trapBubbledEvent(\\\"topLoad\\\",\\\"load\\\",e),o=n;break;case\\\"form\\\":Tn.trapBubbledEvent(\\\"topReset\\\",\\\"reset\\\",e),Tn.trapBubbledEvent(\\\"topSubmit\\\",\\\"submit\\\",e),o=n;break;case\\\"details\\\":Tn.trapBubbledEvent(\\\"topToggle\\\",\\\"toggle\\\",e),o=n;break;case\\\"input\\\":Gn.initWrapperState(e,n),o=Gn.getHostProps(e,n),Tn.trapBubbledEvent(\\\"topInvalid\\\",\\\"invalid\\\",e),W(r,\\\"onChange\\\");break;case\\\"option\\\":Yn.validateProps(e,n),o=Yn.getHostProps(e,n);break;case\\\"select\\\":$n.initWrapperState(e,n),o=$n.getHostProps(e,n),Tn.trapBubbledEvent(\\\"topInvalid\\\",\\\"invalid\\\",e),W(r,\\\"onChange\\\");break;case\\\"textarea\\\":Xn.initWrapperState(e,n),o=Xn.getHostProps(e,n),Tn.trapBubbledEvent(\\\"topInvalid\\\",\\\"invalid\\\",e),W(r,\\\"onChange\\\");break;default:o=n}M(t,o);var a,i=o;for(a in i)if(i.hasOwnProperty(a)){var l=i[a];\\\"style\\\"===a?Ln.setValueForStyles(e,l):\\\"dangerouslySetInnerHTML\\\"===a?null!=(l=l?l.__html:void 0)&&tr(e,l):\\\"children\\\"===a?\\\"string\\\"===typeof l?ur(e,l):\\\"number\\\"===typeof l&&ur(e,\\\"\\\"+l):\\\"suppressContentEditableWarning\\\"!==a&&(lr.hasOwnProperty(a)?null!=l&&W(r,a):u?jn.setValueForAttribute(e,a,l):null!=l&&jn.setValueForProperty(e,a,l))}switch(t){case\\\"input\\\":Zn.track(e),Gn.postMountWrapper(e,n);break;case\\\"textarea\\\":Zn.track(e),Xn.postMountWrapper(e,n);break;case\\\"option\\\":Yn.postMountWrapper(e,n);break;case\\\"select\\\":$n.postMountWrapper(e,n);break;default:\\\"function\\\"===typeof o.onClick&&(e.onclick=Et)}},diffProperties:function(e,t,n,r,u){var o=null;switch(t){case\\\"input\\\":n=Gn.getHostProps(e,n),r=Gn.getHostProps(e,r),o=[];break;case\\\"option\\\":n=Yn.getHostProps(e,n),r=Yn.getHostProps(e,r),o=[];break;case\\\"select\\\":n=$n.getHostProps(e,n),r=$n.getHostProps(e,r),o=[];break;case\\\"textarea\\\":n=Xn.getHostProps(e,n),r=Xn.getHostProps(e,r),o=[];break;default:\\\"function\\\"!==typeof n.onClick&&\\\"function\\\"===typeof r.onClick&&(e.onclick=Et)}M(t,r);var a,i;e=null;for(a in n)if(!r.hasOwnProperty(a)&&n.hasOwnProperty(a)&&null!=n[a])if(\\\"style\\\"===a)for(i in t=n[a])t.hasOwnProperty(i)&&(e||(e={}),e[i]=\\\"\\\");else\\\"dangerouslySetInnerHTML\\\"!==a&&\\\"children\\\"!==a&&\\\"suppressContentEditableWarning\\\"!==a&&(lr.hasOwnProperty(a)?o||(o=[]):(o=o||[]).push(a,null));for(a in r){var l=r[a];if(t=null!=n?n[a]:void 0,r.hasOwnProperty(a)&&l!==t&&(null!=l||null!=t))if(\\\"style\\\"===a)if(t){for(i in t)!t.hasOwnProperty(i)||l&&l.hasOwnProperty(i)||(e||(e={}),e[i]=\\\"\\\");for(i in l)l.hasOwnProperty(i)&&t[i]!==l[i]&&(e||(e={}),e[i]=l[i])}else e||(o||(o=[]),o.push(a,e)),e=l;else\\\"dangerouslySetInnerHTML\\\"===a?(l=l?l.__html:void 0,t=t?t.__html:void 0,null!=l&&t!==l&&(o=o||[]).push(a,\\\"\\\"+l)):\\\"children\\\"===a?t===l||\\\"string\\\"!==typeof l&&\\\"number\\\"!==typeof l||(o=o||[]).push(a,\\\"\\\"+l):\\\"suppressContentEditableWarning\\\"!==a&&(lr.hasOwnProperty(a)?(null!=l&&W(u,a),o||t===l||(o=[])):(o=o||[]).push(a,l))}return e&&(o=o||[]).push(\\\"style\\\",e),o},updateProperties:function(e,t,n,r,u){j(n,r),r=j(n,u);for(var o=0;o<t.length;o+=2){var a=t[o],i=t[o+1];\\\"style\\\"===a?Ln.setValueForStyles(e,i):\\\"dangerouslySetInnerHTML\\\"===a?tr(e,i):\\\"children\\\"===a?ur(e,i):r?null!=i?jn.setValueForAttribute(e,a,i):jn.deleteValueForAttribute(e,a):null!=i?jn.setValueForProperty(e,a,i):jn.deleteValueForProperty(e,a)}switch(n){case\\\"input\\\":Gn.updateWrapper(e,u),Zn.updateValueIfChanged(e);break;case\\\"textarea\\\":Xn.updateWrapper(e,u);break;case\\\"select\\\":$n.postUpdateWrapper(e,u)}},diffHydratedProperties:function(e,t,n,r,u){switch(t){case\\\"iframe\\\":case\\\"object\\\":Tn.trapBubbledEvent(\\\"topLoad\\\",\\\"load\\\",e);break;case\\\"video\\\":case\\\"audio\\\":for(var o in pr)pr.hasOwnProperty(o)&&Tn.trapBubbledEvent(o,pr[o],e);break;case\\\"source\\\":Tn.trapBubbledEvent(\\\"topError\\\",\\\"error\\\",e);break;case\\\"img\\\":case\\\"image\\\":Tn.trapBubbledEvent(\\\"topError\\\",\\\"error\\\",e),Tn.trapBubbledEvent(\\\"topLoad\\\",\\\"load\\\",e);break;case\\\"form\\\":Tn.trapBubbledEvent(\\\"topReset\\\",\\\"reset\\\",e),Tn.trapBubbledEvent(\\\"topSubmit\\\",\\\"submit\\\",e);break;case\\\"details\\\":Tn.trapBubbledEvent(\\\"topToggle\\\",\\\"toggle\\\",e);break;case\\\"input\\\":Gn.initWrapperState(e,n),Tn.trapBubbledEvent(\\\"topInvalid\\\",\\\"invalid\\\",e),W(u,\\\"onChange\\\");break;case\\\"option\\\":Yn.validateProps(e,n);break;case\\\"select\\\":$n.initWrapperState(e,n),Tn.trapBubbledEvent(\\\"topInvalid\\\",\\\"invalid\\\",e),W(u,\\\"onChange\\\");break;case\\\"textarea\\\":Xn.initWrapperState(e,n),Tn.trapBubbledEvent(\\\"topInvalid\\\",\\\"invalid\\\",e),W(u,\\\"onChange\\\")}M(t,n),r=null;for(var a in n)n.hasOwnProperty(a)&&(o=n[a],\\\"children\\\"===a?\\\"string\\\"===typeof o?e.textContent!==o&&(r=[\\\"children\\\",o]):\\\"number\\\"===typeof o&&e.textContent!==\\\"\\\"+o&&(r=[\\\"children\\\",\\\"\\\"+o]):lr.hasOwnProperty(a)&&null!=o&&W(u,a));switch(t){case\\\"input\\\":Zn.track(e),Gn.postMountWrapper(e,n);break;case\\\"textarea\\\":Zn.track(e),Xn.postMountWrapper(e,n);break;case\\\"select\\\":case\\\"option\\\":break;default:\\\"function\\\"===typeof n.onClick&&(e.onclick=Et)}return r},diffHydratedText:function(e,t){return e.nodeValue!==t},warnForDeletedHydratableElement:function(){},warnForDeletedHydratableText:function(){},warnForInsertedHydratedElement:function(){},warnForInsertedHydratedText:function(){},restoreControlledState:function(e,t,n){switch(t){case\\\"input\\\":Gn.restoreControlledState(e,n);break;case\\\"textarea\\\":Xn.restoreControlledState(e,n);break;case\\\"select\\\":$n.restoreControlledState(e,n)}}},dr=void 0;if(gt.canUseDOM)if(\\\"function\\\"!==typeof requestIdleCallback){var Dr=null,hr=null,gr=!1,mr=!1,Cr=0,Er=33,Ar=33,Fr={timeRemaining:\\\"object\\\"===typeof performance&&\\\"function\\\"===typeof performance.now?function(){return Cr-performance.now()}:function(){return Cr-Date.now()}},br=\\\"__reactIdleCallback$\\\"+Math.random().toString(36).slice(2);window.addEventListener(\\\"message\\\",function(e){e.source===window&&e.data===br&&(gr=!1,e=hr,hr=null,null!==e&&e(Fr))},!1);var yr=function(e){mr=!1;var t=e-Cr+Ar;t<Ar&&Er<Ar?(8>t&&(t=8),Ar=t<Er?Er:t):Er=t,Cr=e+Ar,gr||(gr=!0,window.postMessage(br,\\\"*\\\")),t=Dr,Dr=null,null!==t&&t(e)};dr=function(e){return hr=e,mr||(mr=!0,requestAnimationFrame(yr)),0}}else dr=requestIdleCallback;else dr=function(e){return setTimeout(function(){e({timeRemaining:function(){return 1/0}})}),0};var vr,Br,wr={rIC:dr},kr={enableAsyncSubtreeAPI:!0},xr={NoWork:0,SynchronousPriority:1,TaskPriority:2,HighPriority:3,LowPriority:4,OffscreenPriority:5},Tr=Qt.Callback,Sr=xr.NoWork,Pr=xr.SynchronousPriority,Nr=xr.TaskPriority,_r=Rt.ClassComponent,Or=Rt.HostRoot,Ir=void 0,Rr=void 0,Lr={addUpdate:function(e,t,n,r){$(e,{priorityLevel:r,partialState:t,callback:n,isReplace:!1,isForced:!1,isTopLevelUnmount:!1,next:null})},addReplaceUpdate:function(e,t,n,r){$(e,{priorityLevel:r,partialState:t,callback:n,isReplace:!0,isForced:!1,isTopLevelUnmount:!1,next:null})},addForceUpdate:function(e,t,n){$(e,{priorityLevel:n,partialState:null,callback:t,isReplace:!1,isForced:!0,isTopLevelUnmount:!1,next:null})},getUpdatePriority:function(e){var t=e.updateQueue;return null===t||e.tag!==_r&&e.tag!==Or?Sr:null!==t.first?t.first.priorityLevel:Sr},addTopLevelUpdate:function(e,t,n,r){var u=null===t.element;t={priorityLevel:r,partialState:t,callback:n,isReplace:!1,isForced:!1,isTopLevelUnmount:u,next:null},e=$(e,t),u&&(u=Ir,n=Rr,null!==u&&null!==t.next&&(t.next=null,u.last=t),null!==n&&null!==e&&null!==e.next&&(e.next=null,n.last=t))},beginUpdateQueue:function(e,t,n,r,u,o,a){null!==e&&e.updateQueue===n&&(n=t.updateQueue={first:n.first,last:n.last,callbackList:null,hasForceUpdate:!1}),e=n.callbackList;for(var i=n.hasForceUpdate,l=!0,s=n.first;null!==s&&0>=z(s.priorityLevel,a);){n.first=s.next,null===n.first&&(n.last=null);var c;s.isReplace?(u=Q(s,r,u,o),l=!0):(c=Q(s,r,u,o))&&(u=l?mt({},u,c):mt(u,c),l=!1),s.isForced&&(i=!0),null===s.callback||s.isTopLevelUnmount&&null!==s.next||(e=null!==e?e:[],e.push(s.callback),t.effectTag|=Tr),s=s.next}return n.callbackList=e,n.hasForceUpdate=i,null!==n.first||null!==e||i||(t.updateQueue=null),u},commitCallbacks:function(e,t,n){if(null!==(e=t.callbackList))for(t.callbackList=null,t=0;t<e.length;t++){var u=e[t];\\\"function\\\"!==typeof u&&r(\\\"191\\\",u),u.call(n)}}},Ur=[],Mr=-1,Hr={createCursor:function(e){return{current:e}},isEmpty:function(){return-1===Mr},pop:function(e){0>Mr||(e.current=Ur[Mr],Ur[Mr]=null,Mr--)},push:function(e,t){Mr++,Ur[Mr]=e.current,e.current=t},reset:function(){for(;-1<Mr;)Ur[Mr]=null,Mr--}},qr=rn.isFiberMounted,jr=Rt.ClassComponent,Vr=Rt.HostRoot,Wr=Hr.createCursor,zr=Hr.pop,Kr=Hr.push,Gr=Wr(At),Yr=Wr(!1),$r=At,Qr={getUnmaskedContext:function(e){return J(e)?$r:Gr.current},cacheContext:X,getMaskedContext:function(e,t){var n=e.type.contextTypes;if(!n)return At;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var u,o={};for(u in n)o[u]=t[u];return r&&X(e,t,o),o},hasContextChanged:function(){return Yr.current},isContextConsumer:function(e){return e.tag===jr&&null!=e.type.contextTypes},isContextProvider:J,popContextProvider:function(e){J(e)&&(zr(Yr,e),zr(Gr,e))},popTopLevelContextObject:function(e){zr(Yr,e),zr(Gr,e)},pushTopLevelContextObject:function(e,t,n){null!=Gr.cursor&&r(\\\"168\\\"),Kr(Gr,t,e),Kr(Yr,n,e)},processChildContext:Z,pushContextProvider:function(e){if(!J(e))return!1;var t=e.stateNode;return t=t&&t.__reactInternalMemoizedMergedChildContext||At,$r=Gr.current,Kr(Gr,t,e),Kr(Yr,Yr.current,e),!0},invalidateContextProvider:function(e,t){var n=e.stateNode;if(n||r(\\\"169\\\"),t){var u=Z(e,$r);n.__reactInternalMemoizedMergedChildContext=u,zr(Yr,e),zr(Gr,e),Kr(Gr,u,e)}else zr(Yr,e);Kr(Yr,t,e)},resetContext:function(){$r=At,Gr.current=At,Yr.current=!1},findCurrentUnmaskedContext:function(e){for(qr(e)&&e.tag===jr?void 0:r(\\\"170\\\");e.tag!==Vr;){if(J(e))return e.stateNode.__reactInternalMemoizedMergedChildContext;(e=e.return)||r(\\\"171\\\")}return e.stateNode.context}},Xr={NoContext:0,AsyncUpdates:1},Jr=Rt.IndeterminateComponent,Zr=Rt.ClassComponent,eu=Rt.HostRoot,tu=Rt.HostComponent,nu=Rt.HostText,ru=Rt.HostPortal,uu=Rt.CoroutineComponent,ou=Rt.YieldComponent,au=Rt.Fragment,iu=xr.NoWork,lu=Xr.NoContext,su=Qt.NoEffect,cu={createWorkInProgress:function(e,t){var n=e.alternate;return null===n?(n=new ee(e.tag,e.key,e.internalContextTag),n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.effectTag=su,n.nextEffect=null,n.firstEffect=null,n.lastEffect=null),n.pendingWorkPriority=t,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n},createHostRootFiber:function(){return new ee(eu,null,lu)},createFiberFromElement:function(e,t,n){return t=te(e.type,e.key,t),t.pendingProps=e.props,t.pendingWorkPriority=n,t},createFiberFromFragment:function(e,t,n){return t=new ee(au,null,t),t.pendingProps=e,t.pendingWorkPriority=n,t},createFiberFromText:function(e,t,n){return t=new ee(nu,null,t),t.pendingProps=e,t.pendingWorkPriority=n,t},createFiberFromElementType:te,createFiberFromHostInstanceForDeletion:function(){var e=new ee(tu,null,lu);return e.type=\\\"DELETED\\\",e},createFiberFromCoroutine:function(e,t,n){return t=new ee(uu,e.key,t),t.type=e.handler,t.pendingProps=e,t.pendingWorkPriority=n,t},createFiberFromYield:function(e,t){return new ee(ou,null,t)},createFiberFromPortal:function(e,t,n){return t=new ee(ru,e.key,t),t.pendingProps=e.children||[],t.pendingWorkPriority=n,t.stateNode={containerInfo:e.containerInfo,implementation:e.implementation},t},largerPriority:function(e,t){return e!==iu&&(t===iu||t>e)?e:t}},pu=cu.createHostRootFiber,fu=Rt.IndeterminateComponent,du=Rt.FunctionalComponent,Du=Rt.ClassComponent,hu=Rt.HostComponent;\\\"function\\\"===typeof Symbol&&Symbol.for?(vr=Symbol.for(\\\"react.coroutine\\\"),Br=Symbol.for(\\\"react.yield\\\")):(vr=60104,Br=60105);var gu={createCoroutine:function(e,t,n){var r=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:vr,key:null==r?null:\\\"\\\"+r,children:e,handler:t,props:n}},createYield:function(e){return{$$typeof:Br,value:e}},isCoroutine:function(e){return\\\"object\\\"===typeof e&&null!==e&&e.$$typeof===vr},isYield:function(e){return\\\"object\\\"===typeof e&&null!==e&&e.$$typeof===Br},REACT_YIELD_TYPE:Br,REACT_COROUTINE_TYPE:vr},mu=\\\"function\\\"===typeof Symbol&&Symbol.for&&Symbol.for(\\\"react.portal\\\")||60106,Cu={createPortal:function(e,t,n){var r=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:mu,key:null==r?null:\\\"\\\"+r,children:e,containerInfo:t,implementation:n}},isPortal:function(e){return\\\"object\\\"===typeof e&&null!==e&&e.$$typeof===mu},REACT_PORTAL_TYPE:mu},Eu=gu.REACT_COROUTINE_TYPE,Au=gu.REACT_YIELD_TYPE,Fu=Cu.REACT_PORTAL_TYPE,bu=cu.createWorkInProgress,yu=cu.createFiberFromElement,vu=cu.createFiberFromFragment,Bu=cu.createFiberFromText,wu=cu.createFiberFromCoroutine,ku=cu.createFiberFromYield,xu=cu.createFiberFromPortal,Tu=Array.isArray,Su=Rt.FunctionalComponent,Pu=Rt.ClassComponent,Nu=Rt.HostText,_u=Rt.HostPortal,Ou=Rt.CoroutineComponent,Iu=Rt.YieldComponent,Ru=Rt.Fragment,Lu=Qt.NoEffect,Uu=Qt.Placement,Mu=Qt.Deletion,Hu=\\\"function\\\"===typeof Symbol&&Symbol.iterator,qu=\\\"function\\\"===typeof Symbol&&Symbol.for&&Symbol.for(\\\"react.element\\\")||60103,ju=oe(!0,!0),Vu=oe(!1,!0),Wu=oe(!1,!1),zu={reconcileChildFibers:ju,reconcileChildFibersInPlace:Vu,mountChildFibersInPlace:Wu,cloneChildFibers:function(e,t){if(null!==e&&t.child!==e.child&&r(\\\"153\\\"),null!==t.child){e=t.child;var n=bu(e,e.pendingWorkPriority);for(n.pendingProps=e.pendingProps,t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,n=n.sibling=bu(e,e.pendingWorkPriority),n.pendingProps=e.pendingProps,n.return=t;n.sibling=null}}},Ku=Qt.Update,Gu=Xr.AsyncUpdates,Yu=Qr.cacheContext,$u=Qr.getMaskedContext,Qu=Qr.getUnmaskedContext,Xu=Qr.isContextConsumer,Ju=Lr.addUpdate,Zu=Lr.addReplaceUpdate,eo=Lr.addForceUpdate,to=Lr.beginUpdateQueue,no=Qr.hasContextChanged,ro=rn.isMounted,uo=zu.mountChildFibersInPlace,oo=zu.reconcileChildFibers,ao=zu.reconcileChildFibersInPlace,io=zu.cloneChildFibers,lo=Lr.beginUpdateQueue,so=Qr.getMaskedContext,co=Qr.getUnmaskedContext,po=Qr.hasContextChanged,fo=Qr.pushContextProvider,Do=Qr.pushTopLevelContextObject,ho=Qr.invalidateContextProvider,go=Rt.IndeterminateComponent,mo=Rt.FunctionalComponent,Co=Rt.ClassComponent,Eo=Rt.HostRoot,Ao=Rt.HostComponent,Fo=Rt.HostText,bo=Rt.HostPortal,yo=Rt.CoroutineComponent,vo=Rt.CoroutineHandlerPhase,Bo=Rt.YieldComponent,wo=Rt.Fragment,ko=xr.NoWork,xo=xr.OffscreenPriority,To=Qt.PerformedWork,So=Qt.Placement,Po=Qt.ContentReset,No=Qt.Err,_o=Qt.Ref,Oo=$t.ReactCurrentOwner,Io=zu.reconcileChildFibers,Ro=Qr.popContextProvider,Lo=Qr.popTopLevelContextObject,Uo=Rt.IndeterminateComponent,Mo=Rt.FunctionalComponent,Ho=Rt.ClassComponent,qo=Rt.HostRoot,jo=Rt.HostComponent,Vo=Rt.HostText,Wo=Rt.HostPortal,zo=Rt.CoroutineComponent,Ko=Rt.CoroutineHandlerPhase,Go=Rt.YieldComponent,Yo=Rt.Fragment,$o=Qt.Placement,Qo=Qt.Ref,Xo=Qt.Update,Jo=xr.OffscreenPriority,Zo=null,ea=null,ta={injectInternals:function(e){if(\\\"undefined\\\"===typeof{})return!1;var t={};if(!t.supportsFiber)return!0;try{var n=t.inject(e);Zo=se(function(e){return t.onCommitFiberRoot(n,e)}),ea=se(function(e){return t.onCommitFiberUnmount(n,e)})}catch(e){}return!0},onCommitRoot:function(e){\\\"function\\\"===typeof Zo&&Zo(e)},onCommitUnmount:function(e){\\\"function\\\"===typeof ea&&ea(e)}},na=Rt.ClassComponent,ra=Rt.HostRoot,ua=Rt.HostComponent,oa=Rt.HostText,aa=Rt.HostPortal,ia=Rt.CoroutineComponent,la=Lr.commitCallbacks,sa=ta.onCommitUnmount,ca=Qt.Placement,pa=Qt.Update,fa=Qt.Callback,da=Qt.ContentReset,Da=Hr.createCursor,ha=Hr.pop,ga=Hr.push,ma={},Ca=Rt.HostComponent,Ea=Rt.HostText,Aa=Rt.HostRoot,Fa=Qt.Deletion,ba=Qt.Placement,ya=cu.createFiberFromHostInstanceForDeletion,va=Qr.popContextProvider,Ba=Hr.reset,wa=$t.ReactCurrentOwner,ka=cu.createWorkInProgress,xa=cu.largerPriority,Ta=ta.onCommitRoot,Sa=xr.NoWork,Pa=xr.SynchronousPriority,Na=xr.TaskPriority,_a=xr.HighPriority,Oa=xr.LowPriority,Ia=xr.OffscreenPriority,Ra=Xr.AsyncUpdates,La=Qt.PerformedWork,Ua=Qt.Placement,Ma=Qt.Update,Ha=Qt.PlacementAndUpdate,qa=Qt.Deletion,ja=Qt.ContentReset,Va=Qt.Callback,Wa=Qt.Err,za=Qt.Ref,Ka=Rt.HostRoot,Ga=Rt.HostComponent,Ya=Rt.HostPortal,$a=Rt.ClassComponent,Qa=Lr.getUpdatePriority,Xa=Qr.resetContext;he._injectFiber=function(e){De=e};var Ja=Lr.addTopLevelUpdate,Za=Qr.findCurrentUnmaskedContext,ei=Qr.isContextProvider,ti=Qr.processChildContext,ni=Rt.HostComponent,ri=rn.findCurrentHostFiber,ui=rn.findCurrentHostFiberWithNoPortals;he._injectFiber(function(e){var t=Za(e);return ei(e)?ti(e,t,!1):t});var oi=Lt.TEXT_NODE,ai=null,ii={getOffsets:function(e){var t=window.getSelection&&window.getSelection();if(!t||0===t.rangeCount)return null;var n=t.anchorNode,r=t.anchorOffset,u=t.focusNode,o=t.focusOffset,a=t.getRangeAt(0);try{a.startContainer.nodeType,a.endContainer.nodeType}catch(e){return null}t=t.anchorNode===t.focusNode&&t.anchorOffset===t.focusOffset?0:a.toString().length;var i=a.cloneRange();return i.selectNodeContents(e),i.setEnd(a.startContainer,a.startOffset),e=i.startContainer===i.endContainer&&i.startOffset===i.endOffset?0:i.toString().length,a=e+t,t=document.createRange(),t.setStart(n,r),t.setEnd(u,o),n=t.collapsed,{start:n?a:e,end:n?e:a}},setOffsets:function(e,t){if(window.getSelection){var n=window.getSelection(),r=e[Ce()].length,u=Math.min(t.start,r);if(t=void 0===t.end?u:Math.min(t.end,r),!n.extend&&u>t&&(r=t,t=u,u=r),r=me(e,u),e=me(e,t),r&&e){var o=document.createRange();o.setStart(r.node,r.offset),n.removeAllRanges(),u>t?(n.addRange(o),n.extend(e.node,e.offset)):(o.setEnd(e.node,e.offset),n.addRange(o))}}}},li=Lt.ELEMENT_NODE,si={hasSelectionCapabilities:function(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(\\\"input\\\"===t&&\\\"text\\\"===e.type||\\\"textarea\\\"===t||\\\"true\\\"===e.contentEditable)},getSelectionInformation:function(){var e=vt();return{focusedElem:e,selectionRange:si.hasSelectionCapabilities(e)?si.getSelection(e):null}},restoreSelection:function(e){var t=vt(),n=e.focusedElem;if(e=e.selectionRange,t!==n&&bt(document.documentElement,n)){for(si.hasSelectionCapabilities(n)&&si.setSelection(n,e),t=[],e=n;e=e.parentNode;)e.nodeType===li&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(yt(n),n=0;n<t.length;n++)e=t[n],e.element.scrollLeft=e.left,e.element.scrollTop=e.top}},getSelection:function(e){return(\\\"selectionStart\\\"in e?{start:e.selectionStart,end:e.selectionEnd}:ii.getOffsets(e))||{start:0,end:0}},setSelection:function(e,t){var n=t.start,r=t.end;void 0===r&&(r=n),\\\"selectionStart\\\"in e?(e.selectionStart=n,e.selectionEnd=Math.min(r,e.value.length)):ii.setOffsets(e,t)}},ci=si,pi=Lt.ELEMENT_NODE;Fe._injectFiber=function(e){Ee=e},Fe._injectStack=function(e){Ae=e};var fi=Rt.HostComponent,di={isAncestor:function(e,t){for(;t;){if(e===t||e===t.alternate)return!0;t=be(t)}return!1},getLowestCommonAncestor:ye,getParentInstance:function(e){return be(e)},traverseTwoPhase:function(e,t,n){for(var r=[];e;)r.push(e),e=be(e);for(e=r.length;0<e--;)t(r[e],\\\"captured\\\",n);for(e=0;e<r.length;e++)t(r[e],\\\"bubbled\\\",n)},traverseEnterLeave:function(e,t,n,r,u){for(var o=e&&t?ye(e,t):null,a=[];e&&e!==o;)a.push(e),e=be(e);for(e=[];t&&t!==o;)e.push(t),t=be(t);for(t=0;t<a.length;t++)n(a[t],\\\"bubbled\\\",r);for(t=e.length;0<t--;)n(e[t],\\\"captured\\\",u)}},Di=Fn.getListener,hi={accumulateTwoPhaseDispatches:function(e){w(e,Be)},accumulateTwoPhaseDispatchesSkipTarget:function(e){w(e,we)},accumulateDirectDispatches:function(e){w(e,xe)},accumulateEnterLeaveDispatches:function(e,t,n,r){di.traverseEnterLeave(n,r,ke,e,t)}},gi={_root:null,_startText:null,_fallbackText:null},mi={initialize:function(e){return gi._root=e,gi._startText=mi.getText(),!0},reset:function(){gi._root=null,gi._startText=null,gi._fallbackText=null},getData:function(){if(gi._fallbackText)return gi._fallbackText;var e,t,n=gi._startText,r=n.length,u=mi.getText(),o=u.length;for(e=0;e<r&&n[e]===u[e];e++);var a=r-e;for(t=1;t<=a&&n[r-t]===u[o-t];t++);return gi._fallbackText=u.slice(e,1<t?1-t:void 0),gi._fallbackText},getText:function(){return\\\"value\\\"in gi._root?gi._root.value:gi._root[Ce()]}},Ci=mi,Ei=\\\"dispatchConfig _targetInst nativeEvent isDefaultPrevented isPropagationStopped _dispatchListeners _dispatchInstances\\\".split(\\\" \\\"),Ai={type:null,target:null,currentTarget:Et.thatReturnsNull,eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null};mt(Te.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():\\\"unknown\\\"!==typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=Et.thatReturnsTrue)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():\\\"unknown\\\"!==typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=Et.thatReturnsTrue)},persist:function(){this.isPersistent=Et.thatReturnsTrue},isPersistent:Et.thatReturnsFalse,destructor:function(){var e,t=this.constructor.Interface;for(e in t)this[e]=null;for(t=0;t<Ei.length;t++)this[Ei[t]]=null}}),Te.Interface=Ai,Te.augmentClass=function(e,t){function n(){}n.prototype=this.prototype;var r=new n;mt(r,e.prototype),e.prototype=r,e.prototype.constructor=e,e.Interface=mt({},this.Interface,t),e.augmentClass=this.augmentClass,Ne(e)},Ne(Te),Te.augmentClass(_e,{data:null}),Te.augmentClass(Oe,{data:null});var Fi=[9,13,27,32],bi=gt.canUseDOM&&\\\"CompositionEvent\\\"in window,yi=null;gt.canUseDOM&&\\\"documentMode\\\"in document&&(yi=document.documentMode);var vi;if(vi=gt.canUseDOM&&\\\"TextEvent\\\"in window&&!yi){var Bi=window.opera;vi=!(\\\"object\\\"===typeof Bi&&\\\"function\\\"===typeof Bi.version&&12>=parseInt(Bi.version(),10))}var wi=vi,ki=gt.canUseDOM&&(!bi||yi&&8<yi&&11>=yi),xi=String.fromCharCode(32),Ti={beforeInput:{phasedRegistrationNames:{bubbled:\\\"onBeforeInput\\\",captured:\\\"onBeforeInputCapture\\\"},dependencies:[\\\"topCompositionEnd\\\",\\\"topKeyPress\\\",\\\"topTextInput\\\",\\\"topPaste\\\"]},compositionEnd:{phasedRegistrationNames:{bubbled:\\\"onCompositionEnd\\\",captured:\\\"onCompositionEndCapture\\\"},dependencies:\\\"topBlur topCompositionEnd topKeyDown topKeyPress topKeyUp topMouseDown\\\".split(\\\" \\\")},compositionStart:{phasedRegistrationNames:{bubbled:\\\"onCompositionStart\\\",captured:\\\"onCompositionStartCapture\\\"},dependencies:\\\"topBlur topCompositionStart topKeyDown topKeyPress topKeyUp topMouseDown\\\".split(\\\" \\\")},compositionUpdate:{phasedRegistrationNames:{bubbled:\\\"onCompositionUpdate\\\",captured:\\\"onCompositionUpdateCapture\\\"},dependencies:\\\"topBlur topCompositionUpdate topKeyDown topKeyPress topKeyUp topMouseDown\\\".split(\\\" \\\")}},Si=!1,Pi=!1,Ni={eventTypes:Ti,extractEvents:function(e,t,n,r){var u;if(bi)e:{switch(e){case\\\"topCompositionStart\\\":var o=Ti.compositionStart;break e;case\\\"topCompositionEnd\\\":o=Ti.compositionEnd;break e;case\\\"topCompositionUpdate\\\":o=Ti.compositionUpdate;break e}o=void 0}else Pi?Ie(e,n)&&(o=Ti.compositionEnd):\\\"topKeyDown\\\"===e&&229===n.keyCode&&(o=Ti.compositionStart);return o?(ki&&(Pi||o!==Ti.compositionStart?o===Ti.compositionEnd&&Pi&&(u=Ci.getData()):Pi=Ci.initialize(r)),o=_e.getPooled(o,t,n,r),u?o.data=u:null!==(u=Re(n))&&(o.data=u),hi.accumulateTwoPhaseDispatches(o),u=o):u=null,(e=wi?Le(e,n):Ue(e,n))?(t=Oe.getPooled(Ti.beforeInput,t,n,r),t.data=e,hi.accumulateTwoPhaseDispatches(t)):t=null,[u,t]}},_i={color:!0,date:!0,datetime:!0,\\\"datetime-local\\\":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0},Oi={change:{phasedRegistrationNames:{bubbled:\\\"onChange\\\",captured:\\\"onChangeCapture\\\"},dependencies:\\\"topBlur topChange topClick topFocus topInput topKeyDown topKeyUp topSelectionChange\\\".split(\\\" \\\")}},Ii=null,Ri=null,Li=!1;gt.canUseDOM&&(Li=P(\\\"input\\\")&&(!document.documentMode||9<document.documentMode));var Ui={eventTypes:Oi,_isInputEventSupported:Li,extractEvents:function(e,t,n,r){var u=t?Gt.getNodeFromInstance(t):window,o=u.nodeName&&u.nodeName.toLowerCase();if(\\\"select\\\"===o||\\\"input\\\"===o&&\\\"file\\\"===u.type)var a=Ve;else if(Me(u))if(Li)a=$e;else{a=Ge;var i=Ke}else!(o=u.nodeName)||\\\"input\\\"!==o.toLowerCase()||\\\"checkbox\\\"!==u.type&&\\\"radio\\\"!==u.type||(a=Ye);if(a&&(a=a(e,t)))return He(a,n,r);i&&i(e,u,t),\\\"topBlur\\\"===e&&null!=t&&(e=t._wrapperState||u._wrapperState)&&e.controlled&&\\\"number\\\"===u.type&&(e=\\\"\\\"+u.value,u.getAttribute(\\\"value\\\")!==e&&u.setAttribute(\\\"value\\\",e))}};Te.augmentClass(Qe,{view:function(e){return e.view?e.view:(e=y(e),e.window===e?e:(e=e.ownerDocument)?e.defaultView||e.parentWindow:window)},detail:function(e){return e.detail||0}});var Mi={Alt:\\\"altKey\\\",Control:\\\"ctrlKey\\\",Meta:\\\"metaKey\\\",Shift:\\\"shiftKey\\\"};Qe.augmentClass(Ze,{screenX:null,screenY:null,clientX:null,clientY:null,pageX:null,pageY:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,getModifierState:Je,button:null,buttons:null,relatedTarget:function(e){return e.relatedTarget||(e.fromElement===e.srcElement?e.toElement:e.fromElement)}});var Hi={mouseEnter:{registrationName:\\\"onMouseEnter\\\",dependencies:[\\\"topMouseOut\\\",\\\"topMouseOver\\\"]},mouseLeave:{registrationName:\\\"onMouseLeave\\\",dependencies:[\\\"topMouseOut\\\",\\\"topMouseOver\\\"]}},qi={eventTypes:Hi,extractEvents:function(e,t,n,r){if(\\\"topMouseOver\\\"===e&&(n.relatedTarget||n.fromElement)||\\\"topMouseOut\\\"!==e&&\\\"topMouseOver\\\"!==e)return null;var u=r.window===r?r:(u=r.ownerDocument)?u.defaultView||u.parentWindow:window;if(\\\"topMouseOut\\\"===e?(e=t,t=(t=n.relatedTarget||n.toElement)?Gt.getClosestInstanceFromNode(t):null):e=null,e===t)return null;var o=null==e?u:Gt.getNodeFromInstance(e);u=null==t?u:Gt.getNodeFromInstance(t);var a=Ze.getPooled(Hi.mouseLeave,e,n,r);return a.type=\\\"mouseleave\\\",a.target=o,a.relatedTarget=u,n=Ze.getPooled(Hi.mouseEnter,t,n,r),n.type=\\\"mouseenter\\\",n.target=u,n.relatedTarget=o,hi.accumulateEnterLeaveDispatches(a,n,e,t),[a,n]}},ji=Lt.DOCUMENT_NODE,Vi=gt.canUseDOM&&\\\"documentMode\\\"in document&&11>=document.documentMode,Wi={select:{phasedRegistrationNames:{bubbled:\\\"onSelect\\\",captured:\\\"onSelectCapture\\\"},dependencies:\\\"topBlur topContextMenu topFocus topKeyDown topKeyUp topMouseDown topMouseUp topSelectionChange\\\".split(\\\" \\\")}},zi=null,Ki=null,Gi=null,Yi=!1,$i=Tn.isListeningToAllDependencies,Qi={eventTypes:Wi,extractEvents:function(e,t,n,r){var u=r.window===r?r.document:r.nodeType===ji?r:r.ownerDocument;if(!u||!$i(\\\"onSelect\\\",u))return null;switch(u=t?Gt.getNodeFromInstance(t):window,e){case\\\"topFocus\\\":(Me(u)||\\\"true\\\"===u.contentEditable)&&(zi=u,Ki=t,Gi=null);break;case\\\"topBlur\\\":Gi=Ki=zi=null;break;case\\\"topMouseDown\\\":Yi=!0;break;case\\\"topContextMenu\\\":case\\\"topMouseUp\\\":return Yi=!1,et(n,r);case\\\"topSelectionChange\\\":if(Vi)break;case\\\"topKeyDown\\\":case\\\"topKeyUp\\\":return et(n,r)}return null}};Te.augmentClass(tt,{animationName:null,elapsedTime:null,pseudoElement:null}),Te.augmentClass(nt,{clipboardData:function(e){return\\\"clipboardData\\\"in e?e.clipboardData:window.clipboardData}}),Qe.augmentClass(rt,{relatedTarget:null});var Xi={Esc:\\\"Escape\\\",Spacebar:\\\" \\\",Left:\\\"ArrowLeft\\\",Up:\\\"ArrowUp\\\",Right:\\\"ArrowRight\\\",Down:\\\"ArrowDown\\\",Del:\\\"Delete\\\",Win:\\\"OS\\\",Menu:\\\"ContextMenu\\\",Apps:\\\"ContextMenu\\\",Scroll:\\\"ScrollLock\\\",MozPrintableKey:\\\"Unidentified\\\"},Ji={8:\\\"Backspace\\\",9:\\\"Tab\\\",12:\\\"Clear\\\",13:\\\"Enter\\\",16:\\\"Shift\\\",17:\\\"Control\\\",18:\\\"Alt\\\",19:\\\"Pause\\\",20:\\\"CapsLock\\\",27:\\\"Escape\\\",32:\\\" \\\",33:\\\"PageUp\\\",34:\\\"PageDown\\\",35:\\\"End\\\",36:\\\"Home\\\",37:\\\"ArrowLeft\\\",38:\\\"ArrowUp\\\",39:\\\"ArrowRight\\\",40:\\\"ArrowDown\\\",45:\\\"Insert\\\",46:\\\"Delete\\\",112:\\\"F1\\\",113:\\\"F2\\\",114:\\\"F3\\\",115:\\\"F4\\\",116:\\\"F5\\\",117:\\\"F6\\\",118:\\\"F7\\\",119:\\\"F8\\\",120:\\\"F9\\\",121:\\\"F10\\\",122:\\\"F11\\\",123:\\\"F12\\\",144:\\\"NumLock\\\",145:\\\"ScrollLock\\\",224:\\\"Meta\\\"};Qe.augmentClass(ot,{key:function(e){if(e.key){var t=Xi[e.key]||e.key;if(\\\"Unidentified\\\"!==t)return t}return\\\"keypress\\\"===e.type?(e=ut(e),13===e?\\\"Enter\\\":String.fromCharCode(e)):\\\"keydown\\\"===e.type||\\\"keyup\\\"===e.type?Ji[e.keyCode]||\\\"Unidentified\\\":\\\"\\\"},location:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,repeat:null,locale:null,getModifierState:Je,charCode:function(e){return\\\"keypress\\\"===e.type?ut(e):0},keyCode:function(e){return\\\"keydown\\\"===e.type||\\\"keyup\\\"===e.type?e.keyCode:0},which:function(e){return\\\"keypress\\\"===e.type?ut(e):\\\"keydown\\\"===e.type||\\\"keyup\\\"===e.type?e.keyCode:0}}),Ze.augmentClass(at,{dataTransfer:null}),Qe.augmentClass(it,{touches:null,targetTouches:null,changedTouches:null,altKey:null,metaKey:null,ctrlKey:null,shiftKey:null,getModifierState:Je}),Te.augmentClass(lt,{propertyName:null,elapsedTime:null,pseudoElement:null}),Ze.augmentClass(st,{deltaX:function(e){return\\\"deltaX\\\"in e?e.deltaX:\\\"wheelDeltaX\\\"in e?-e.wheelDeltaX:0},deltaY:function(e){return\\\"deltaY\\\"in e?e.deltaY:\\\"wheelDeltaY\\\"in e?-e.wheelDeltaY:\\\"wheelDelta\\\"in e?-e.wheelDelta:0},deltaZ:null,deltaMode:null});var Zi={},el={};\\\"abort animationEnd animationIteration animationStart blur cancel canPlay canPlayThrough click close contextMenu copy cut doubleClick drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error focus input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing progress rateChange reset scroll seeked seeking stalled submit suspend timeUpdate toggle touchCancel touchEnd touchMove touchStart transitionEnd volumeChange waiting wheel\\\".split(\\\" \\\").forEach(function(e){var t=e[0].toUpperCase()+e.slice(1),n=\\\"on\\\"+t;t=\\\"top\\\"+t,n={phasedRegistrationNames:{bubbled:n,captured:n+\\\"Capture\\\"},dependencies:[t]},Zi[e]=n,el[t]=n});var tl={eventTypes:Zi,extractEvents:function(e,t,n,u){var o=el[e];if(!o)return null;switch(e){case\\\"topAbort\\\":case\\\"topCancel\\\":case\\\"topCanPlay\\\":case\\\"topCanPlayThrough\\\":case\\\"topClose\\\":case\\\"topDurationChange\\\":case\\\"topEmptied\\\":case\\\"topEncrypted\\\":case\\\"topEnded\\\":case\\\"topError\\\":case\\\"topInput\\\":case\\\"topInvalid\\\":case\\\"topLoad\\\":case\\\"topLoadedData\\\":case\\\"topLoadedMetadata\\\":case\\\"topLoadStart\\\":case\\\"topPause\\\":case\\\"topPlay\\\":case\\\"topPlaying\\\":case\\\"topProgress\\\":case\\\"topRateChange\\\":case\\\"topReset\\\":case\\\"topSeeked\\\":case\\\"topSeeking\\\":case\\\"topStalled\\\":case\\\"topSubmit\\\":case\\\"topSuspend\\\":case\\\"topTimeUpdate\\\":case\\\"topToggle\\\":case\\\"topVolumeChange\\\":case\\\"topWaiting\\\":var a=Te;break;case\\\"topKeyPress\\\":if(0===ut(n))return null;case\\\"topKeyDown\\\":case\\\"topKeyUp\\\":a=ot;break;case\\\"topBlur\\\":case\\\"topFocus\\\":a=rt;break;case\\\"topClick\\\":if(2===n.button)return null;case\\\"topDoubleClick\\\":case\\\"topMouseDown\\\":case\\\"topMouseMove\\\":case\\\"topMouseUp\\\":case\\\"topMouseOut\\\":case\\\"topMouseOver\\\":case\\\"topContextMenu\\\":a=Ze;break;case\\\"topDrag\\\":case\\\"topDragEnd\\\":case\\\"topDragEnter\\\":case\\\"topDragExit\\\":case\\\"topDragLeave\\\":case\\\"topDragOver\\\":case\\\"topDragStart\\\":case\\\"topDrop\\\":a=at;break;case\\\"topTouchCancel\\\":case\\\"topTouchEnd\\\":case\\\"topTouchMove\\\":case\\\"topTouchStart\\\":a=it;break;case\\\"topAnimationEnd\\\":case\\\"topAnimationIteration\\\":case\\\"topAnimationStart\\\":a=tt;break;case\\\"topTransitionEnd\\\":a=lt;break;case\\\"topScroll\\\":a=Qe;break;case\\\"topWheel\\\":a=st;break;case\\\"topCopy\\\":case\\\"topCut\\\":case\\\"topPaste\\\":a=nt}return a||r(\\\"86\\\",e),e=a.getPooled(o,t,n,u),hi.accumulateTwoPhaseDispatches(e),e}};En.setHandleTopLevel(Tn.handleTopLevel),Fn.injection.injectEventPluginOrder(\\\"ResponderEventPlugin SimpleEventPlugin TapEventPlugin EnterLeaveEventPlugin ChangeEventPlugin SelectEventPlugin BeforeInputEventPlugin\\\".split(\\\" \\\")),ln.injection.injectComponentTree(Gt),Fn.injection.injectEventPluginsByName({SimpleEventPlugin:tl,EnterLeaveEventPlugin:qi,ChangeEventPlugin:Ui,SelectEventPlugin:Qi,BeforeInputEventPlugin:Ni});var nl=It.injection.MUST_USE_PROPERTY,rl=It.injection.HAS_BOOLEAN_VALUE,ul=It.injection.HAS_NUMERIC_VALUE,ol=It.injection.HAS_POSITIVE_NUMERIC_VALUE,al=It.injection.HAS_STRING_BOOLEAN_VALUE,il={Properties:{allowFullScreen:rl,allowTransparency:al,async:rl,autoPlay:rl,capture:rl,checked:nl|rl,cols:ol,contentEditable:al,controls:rl,default:rl,defer:rl,disabled:rl,download:It.injection.HAS_OVERLOADED_BOOLEAN_VALUE,draggable:al,formNoValidate:rl,hidden:rl,loop:rl,multiple:nl|rl,muted:nl|rl,noValidate:rl,open:rl,playsInline:rl,readOnly:rl,required:rl,reversed:rl,rows:ol,rowSpan:ul,scoped:rl,seamless:rl,selected:nl|rl,size:ol,start:ul,span:ol,spellCheck:al,style:0,itemScope:rl,acceptCharset:0,className:0,htmlFor:0,httpEquiv:0,value:al},DOMAttributeNames:{acceptCharset:\\\"accept-charset\\\",className:\\\"class\\\",htmlFor:\\\"for\\\",httpEquiv:\\\"http-equiv\\\"},DOMMutationMethods:{value:function(e,t){if(null==t)return e.removeAttribute(\\\"value\\\");\\\"number\\\"!==e.type||!1===e.hasAttribute(\\\"value\\\")?e.setAttribute(\\\"value\\\",\\\"\\\"+t):e.validity&&!e.validity.badInput&&e.ownerDocument.activeElement!==e&&e.setAttribute(\\\"value\\\",\\\"\\\"+t)}}},ll=It.injection.HAS_STRING_BOOLEAN_VALUE,sl={xlink:\\\"http://www.w3.org/1999/xlink\\\",xml:\\\"http://www.w3.org/XML/1998/namespace\\\"},cl={Properties:{autoReverse:ll,externalResourcesRequired:ll,preserveAlpha:ll},DOMAttributeNames:{autoReverse:\\\"autoReverse\\\",externalResourcesRequired:\\\"externalResourcesRequired\\\",preserveAlpha:\\\"preserveAlpha\\\"},DOMAttributeNamespaces:{xlinkActuate:sl.xlink,xlinkArcrole:sl.xlink,xlinkHref:sl.xlink,xlinkRole:sl.xlink,xlinkShow:sl.xlink,xlinkTitle:sl.xlink,xlinkType:sl.xlink,xmlBase:sl.xml,xmlLang:sl.xml,xmlSpace:sl.xml}},pl=/[\\\\-\\\\:]([a-z])/g;\\\"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode x-height xlink:actuate xlink:arcrole xlink:href xlink:role xlink:show xlink:title xlink:type xml:base xmlns:xlink xml:lang xml:space\\\".split(\\\" \\\").forEach(function(e){var t=e.replace(pl,ct);cl.Properties[t]=0,cl.DOMAttributeNames[t]=e}),It.injection.injectDOMPropertyConfig(il),It.injection.injectDOMPropertyConfig(cl);var fl=ta.injectInternals,dl=Lt.ELEMENT_NODE,Dl=Lt.TEXT_NODE,hl=Lt.COMMENT_NODE,gl=Lt.DOCUMENT_NODE,ml=Lt.DOCUMENT_FRAGMENT_NODE,Cl=It.ROOT_ATTRIBUTE_NAME,El=kt.getChildNamespace,Al=fr.createElement,Fl=fr.createTextNode,bl=fr.setInitialProperties,yl=fr.diffProperties,vl=fr.updateProperties,Bl=fr.diffHydratedProperties,wl=fr.diffHydratedText,kl=fr.warnForDeletedHydratableElement,xl=fr.warnForDeletedHydratableText,Tl=fr.warnForInsertedHydratedElement,Sl=fr.warnForInsertedHydratedText,Pl=Gt.precacheFiberNode,Nl=Gt.updateFiberProps;fn.injection.injectFiberControlledHostComponent(fr),Fe._injectFiber(function(e){return Il.findHostInstance(e)});var _l=null,Ol=null,Il=function(e){var t=e.getPublicInstance;e=de(e);var n=e.scheduleUpdate,r=e.getPriorityContext;return{createContainer:function(e){var t=pu();return e={current:t,containerInfo:e,isScheduled:!1,nextScheduledRoot:null,context:null,pendingContext:null},t.stateNode=e},updateContainer:function(e,t,u,o){var a=t.current;u=he(u),null===t.context?t.context=u:t.pendingContext=u,t=o,o=r(a,kr.enableAsyncSubtreeAPI&&null!=e&&null!=e.type&&null!=e.type.prototype&&!0===e.type.prototype.unstable_isAsyncReactComponent),e={element:e},Ja(a,e,void 0===t?null:t,o),n(a,o)},batchedUpdates:e.batchedUpdates,unbatchedUpdates:e.unbatchedUpdates,deferredUpdates:e.deferredUpdates,flushSync:e.flushSync,getPublicRootInstance:function(e){if(e=e.current,!e.child)return null;switch(e.child.tag){case ni:return t(e.child.stateNode);default:return e.child.stateNode}},findHostInstance:function(e){return e=ri(e),null===e?null:e.stateNode},findHostInstanceWithNoPortals:function(e){return e=ui(e),null===e?null:e.stateNode}}}({getRootHostContext:function(e){if(e.nodeType===gl)e=(e=e.documentElement)?e.namespaceURI:El(null,\\\"\\\");else{var t=e.nodeType===hl?e.parentNode:e;e=t.namespaceURI||null,t=t.tagName,e=El(e,t)}return e},getChildHostContext:function(e,t){return El(e,t)},getPublicInstance:function(e){return e},prepareForCommit:function(){_l=Tn.isEnabled(),Ol=ci.getSelectionInformation(),Tn.setEnabled(!1)},resetAfterCommit:function(){ci.restoreSelection(Ol),Ol=null,Tn.setEnabled(_l),_l=null},createInstance:function(e,t,n,r,u){return e=Al(e,t,n,r),Pl(u,e),Nl(e,t),e},appendInitialChild:function(e,t){e.appendChild(t)},finalizeInitialChildren:function(e,t,n,r){bl(e,t,n,r);e:{switch(t){case\\\"button\\\":case\\\"input\\\":case\\\"select\\\":case\\\"textarea\\\":e=!!n.autoFocus;break e}e=!1}return e},prepareUpdate:function(e,t,n,r,u){return yl(e,t,n,r,u)},commitMount:function(e){e.focus()},commitUpdate:function(e,t,n,r,u){Nl(e,u),vl(e,t,n,r,u)},shouldSetTextContent:function(e,t){return\\\"textarea\\\"===e||\\\"string\\\"===typeof t.children||\\\"number\\\"===typeof t.children||\\\"object\\\"===typeof t.dangerouslySetInnerHTML&&null!==t.dangerouslySetInnerHTML&&\\\"string\\\"===typeof t.dangerouslySetInnerHTML.__html},resetTextContent:function(e){e.textContent=\\\"\\\"},shouldDeprioritizeSubtree:function(e,t){return!!t.hidden},createTextInstance:function(e,t,n,r){return e=Fl(e,t),Pl(r,e),e},commitTextUpdate:function(e,t,n){e.nodeValue=n},appendChild:function(e,t){e.appendChild(t)},appendChildToContainer:function(e,t){e.nodeType===hl?e.parentNode.insertBefore(t,e):e.appendChild(t)},insertBefore:function(e,t,n){e.insertBefore(t,n)},insertInContainerBefore:function(e,t,n){e.nodeType===hl?e.parentNode.insertBefore(t,n):e.insertBefore(t,n)},removeChild:function(e,t){e.removeChild(t)},removeChildFromContainer:function(e,t){e.nodeType===hl?e.parentNode.removeChild(t):e.removeChild(t)},canHydrateInstance:function(e,t){return e.nodeType===dl&&t===e.nodeName.toLowerCase()},canHydrateTextInstance:function(e,t){return\\\"\\\"!==t&&e.nodeType===Dl},getNextHydratableSibling:function(e){for(e=e.nextSibling;e&&e.nodeType!==dl&&e.nodeType!==Dl;)e=e.nextSibling;return e},getFirstHydratableChild:function(e){for(e=e.firstChild;e&&e.nodeType!==dl&&e.nodeType!==Dl;)e=e.nextSibling;return e},hydrateInstance:function(e,t,n,r,u,o){return Pl(o,e),Nl(e,n),Bl(e,t,n,u,r)},hydrateTextInstance:function(e,t,n){return Pl(n,e),wl(e,t)},didNotHydrateInstance:function(e,t){1===t.nodeType?kl(e,t):xl(e,t)},didNotFindHydratableInstance:function(e,t,n){Tl(e,t,n)},didNotFindHydratableTextInstance:function(e,t){Sl(e,t)},scheduleDeferredCallback:wr.rIC,useSyncScheduling:!0});Dn.injection.injectFiberBatchedUpdates(Il.batchedUpdates);var Rl={createPortal:Dt,hydrate:function(e,t,n){return dt(null,e,t,!0,n)},render:function(e,t,n){return dt(null,e,t,!1,n)},unstable_renderSubtreeIntoContainer:function(e,t,n,u){return null!=e&&Yt.has(e)||r(\\\"38\\\"),dt(e,t,n,!1,u)},unmountComponentAtNode:function(e){return pt(e)||r(\\\"40\\\"),!!e._reactRootContainer&&(Il.unbatchedUpdates(function(){dt(null,null,e,!1,function(){e._reactRootContainer=null})}),!0)},findDOMNode:Fe,unstable_createPortal:Dt,unstable_batchedUpdates:Dn.batchedUpdates,unstable_deferredUpdates:Il.deferredUpdates,flushSync:Il.flushSync,__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:{EventPluginHub:Fn,EventPluginRegistry:Pt,EventPropagators:hi,ReactControlledComponent:fn,ReactDOMComponentTree:Gt,ReactDOMEventListener:En}};fl({findFiberByHostInstance:Gt.getClosestInstanceFromNode,findHostInstanceByFiber:Il.findHostInstance,bundleType:0,version:\\\"16.0.0\\\",rendererPackageName:\\\"react-dom\\\"}),e.exports=Rl},function(e,t,n){\\\"use strict\\\";var r=!(\\\"undefined\\\"===typeof window||!window.document||!window.document.createElement),u={canUseDOM:r,canUseWorkers:\\\"undefined\\\"!==typeof Worker,canUseEventListeners:r&&!(!window.addEventListener&&!window.attachEvent),canUseViewport:r&&!!window.screen,isInWorker:!r};e.exports=u},function(e,t,n){\\\"use strict\\\";var r=n(3),u={listen:function(e,t,n){return e.addEventListener?(e.addEventListener(t,n,!1),{remove:function(){e.removeEventListener(t,n,!1)}}):e.attachEvent?(e.attachEvent(\\\"on\\\"+t,n),{remove:function(){e.detachEvent(\\\"on\\\"+t,n)}}):void 0},capture:function(e,t,n){return e.addEventListener?(e.addEventListener(t,n,!0),{remove:function(){e.removeEventListener(t,n,!0)}}):{remove:r}},registerDefault:function(){}};e.exports=u},function(e,t,n){\\\"use strict\\\";function r(e,t){return e===t?0!==e||0!==t||1/e===1/t:e!==e&&t!==t}function u(e,t){if(r(e,t))return!0;if(\\\"object\\\"!==typeof e||null===e||\\\"object\\\"!==typeof t||null===t)return!1;var n=Object.keys(e),u=Object.keys(t);if(n.length!==u.length)return!1;for(var a=0;a<n.length;a++)if(!o.call(t,n[a])||!r(e[n[a]],t[n[a]]))return!1;return!0}var o=Object.prototype.hasOwnProperty;e.exports=u},function(e,t,n){\\\"use strict\\\";function r(e,t){return!(!e||!t)&&(e===t||!u(e)&&(u(t)?r(e,t.parentNode):\\\"contains\\\"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}var u=n(31);e.exports=r},function(e,t,n){\\\"use strict\\\";function r(e){return u(e)&&3==e.nodeType}var u=n(32);e.exports=r},function(e,t,n){\\\"use strict\\\";function r(e){var t=e?e.ownerDocument||e:document,n=t.defaultView||window;return!(!e||!(\\\"function\\\"===typeof n.Node?e instanceof n.Node:\\\"object\\\"===typeof e&&\\\"number\\\"===typeof e.nodeType&&\\\"string\\\"===typeof e.nodeName))}e.exports=r},function(e,t,n){\\\"use strict\\\";function r(e){try{e.focus()}catch(e){}}e.exports=r},function(e,t,n){\\\"use strict\\\";function r(e){if(\\\"undefined\\\"===typeof(e=e||(\\\"undefined\\\"!==typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}e.exports=r},function(e,t,n){\\\"use strict\\\";function r(e,t){if(!(e instanceof t))throw new TypeError(\\\"Cannot call a class as a function\\\")}function u(e,t){if(!e)throw new ReferenceError(\\\"this hasn't been initialised - super() hasn't been called\\\");return!t||\\\"object\\\"!==typeof t&&\\\"function\\\"!==typeof t?e:t}function o(e,t){if(\\\"function\\\"!==typeof t&&null!==t)throw new TypeError(\\\"Super expression must either be null or a function, not \\\"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var a=n(0),i=n.n(a),l=n(7),s=n(8),c=n(9),p=n(10),f=n(11),d=n(39),D=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\\\"value\\\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),h={cursor:\\\"pointer\\\"},g=function(e){function t(){return r(this,t),u(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return o(t,e),D(t,[{key:\\\"render\\\",value:function(){var e=this.props,t=e.error,n=e.editorHandler,r=Object(d.a)(t),u=null!==r&&null!==n;return i.a.createElement(l.a,null,i.a.createElement(c.a,{headerText:\\\"Failed to compile\\\"}),i.a.createElement(\\\"a\\\",{onClick:u&&r?function(){return n(r)}:null,style:u?h:null},i.a.createElement(p.a,{main:!0,codeHTML:Object(f.a)(t)})),i.a.createElement(s.a,{line1:\\\"This error occurred during the build time and cannot be dismissed.\\\"}))}}]),t}(a.PureComponent);t.a=g},function(e,t,n){e.exports={XmlEntities:n(37),Html4Entities:n(38),Html5Entities:n(13),AllHtmlEntities:n(13)}},function(e,t){function n(){}var r={\\\"&lt\\\":\\\"<\\\",\\\"&gt\\\":\\\">\\\",\\\"&quot\\\":'\\\"',\\\"&apos\\\":\\\"'\\\",\\\"&amp\\\":\\\"&\\\",\\\"&lt;\\\":\\\"<\\\",\\\"&gt;\\\":\\\">\\\",\\\"&quot;\\\":'\\\"',\\\"&apos;\\\":\\\"'\\\",\\\"&amp;\\\":\\\"&\\\"},u={60:\\\"lt\\\",62:\\\"gt\\\",34:\\\"quot\\\",39:\\\"apos\\\",38:\\\"amp\\\"},o={\\\"<\\\":\\\"&lt;\\\",\\\">\\\":\\\"&gt;\\\",'\\\"':\\\"&quot;\\\",\\\"'\\\":\\\"&apos;\\\",\\\"&\\\":\\\"&amp;\\\"};n.prototype.encode=function(e){return e&&e.length?e.replace(/<|>|\\\"|'|&/g,function(e){return o[e]}):\\\"\\\"},n.encode=function(e){return(new n).encode(e)},n.prototype.decode=function(e){return e&&e.length?e.replace(/&#?[0-9a-zA-Z]+;?/g,function(e){if(\\\"#\\\"===e.charAt(1)){var t=\\\"x\\\"===e.charAt(2).toLowerCase()?parseInt(e.substr(3),16):parseInt(e.substr(2));return isNaN(t)||t<-32768||t>65535?\\\"\\\":String.fromCharCode(t)}return r[e]||e}):\\\"\\\"},n.decode=function(e){return(new n).decode(e)},n.prototype.encodeNonUTF=function(e){if(!e||!e.length)return\\\"\\\";for(var t=e.length,n=\\\"\\\",r=0;r<t;){var o=e.charCodeAt(r),a=u[o];a?(n+=\\\"&\\\"+a+\\\";\\\",r++):(n+=o<32||o>126?\\\"&#\\\"+o+\\\";\\\":e.charAt(r),r++)}return n},n.encodeNonUTF=function(e){return(new n).encodeNonUTF(e)},n.prototype.encodeNonASCII=function(e){if(!e||!e.length)return\\\"\\\";for(var t=e.length,n=\\\"\\\",r=0;r<t;){var u=e.charCodeAt(r);u<=255?n+=e[r++]:(n+=\\\"&#\\\"+u+\\\";\\\",r++)}return n},n.encodeNonASCII=function(e){return(new n).encodeNonASCII(e)},e.exports=n},function(e,t){function n(){}for(var r=[\\\"apos\\\",\\\"nbsp\\\",\\\"iexcl\\\",\\\"cent\\\",\\\"pound\\\",\\\"curren\\\",\\\"yen\\\",\\\"brvbar\\\",\\\"sect\\\",\\\"uml\\\",\\\"copy\\\",\\\"ordf\\\",\\\"laquo\\\",\\\"not\\\",\\\"shy\\\",\\\"reg\\\",\\\"macr\\\",\\\"deg\\\",\\\"plusmn\\\",\\\"sup2\\\",\\\"sup3\\\",\\\"acute\\\",\\\"micro\\\",\\\"para\\\",\\\"middot\\\",\\\"cedil\\\",\\\"sup1\\\",\\\"ordm\\\",\\\"raquo\\\",\\\"frac14\\\",\\\"frac12\\\",\\\"frac34\\\",\\\"iquest\\\",\\\"Agrave\\\",\\\"Aacute\\\",\\\"Acirc\\\",\\\"Atilde\\\",\\\"Auml\\\",\\\"Aring\\\",\\\"Aelig\\\",\\\"Ccedil\\\",\\\"Egrave\\\",\\\"Eacute\\\",\\\"Ecirc\\\",\\\"Euml\\\",\\\"Igrave\\\",\\\"Iacute\\\",\\\"Icirc\\\",\\\"Iuml\\\",\\\"ETH\\\",\\\"Ntilde\\\",\\\"Ograve\\\",\\\"Oacute\\\",\\\"Ocirc\\\",\\\"Otilde\\\",\\\"Ouml\\\",\\\"times\\\",\\\"Oslash\\\",\\\"Ugrave\\\",\\\"Uacute\\\",\\\"Ucirc\\\",\\\"Uuml\\\",\\\"Yacute\\\",\\\"THORN\\\",\\\"szlig\\\",\\\"agrave\\\",\\\"aacute\\\",\\\"acirc\\\",\\\"atilde\\\",\\\"auml\\\",\\\"aring\\\",\\\"aelig\\\",\\\"ccedil\\\",\\\"egrave\\\",\\\"eacute\\\",\\\"ecirc\\\",\\\"euml\\\",\\\"igrave\\\",\\\"iacute\\\",\\\"icirc\\\",\\\"iuml\\\",\\\"eth\\\",\\\"ntilde\\\",\\\"ograve\\\",\\\"oacute\\\",\\\"ocirc\\\",\\\"otilde\\\",\\\"ouml\\\",\\\"divide\\\",\\\"oslash\\\",\\\"ugrave\\\",\\\"uacute\\\",\\\"ucirc\\\",\\\"uuml\\\",\\\"yacute\\\",\\\"thorn\\\",\\\"yuml\\\",\\\"quot\\\",\\\"amp\\\",\\\"lt\\\",\\\"gt\\\",\\\"OElig\\\",\\\"oelig\\\",\\\"Scaron\\\",\\\"scaron\\\",\\\"Yuml\\\",\\\"circ\\\",\\\"tilde\\\",\\\"ensp\\\",\\\"emsp\\\",\\\"thinsp\\\",\\\"zwnj\\\",\\\"zwj\\\",\\\"lrm\\\",\\\"rlm\\\",\\\"ndash\\\",\\\"mdash\\\",\\\"lsquo\\\",\\\"rsquo\\\",\\\"sbquo\\\",\\\"ldquo\\\",\\\"rdquo\\\",\\\"bdquo\\\",\\\"dagger\\\",\\\"Dagger\\\",\\\"permil\\\",\\\"lsaquo\\\",\\\"rsaquo\\\",\\\"euro\\\",\\\"fnof\\\",\\\"Alpha\\\",\\\"Beta\\\",\\\"Gamma\\\",\\\"Delta\\\",\\\"Epsilon\\\",\\\"Zeta\\\",\\\"Eta\\\",\\\"Theta\\\",\\\"Iota\\\",\\\"Kappa\\\",\\\"Lambda\\\",\\\"Mu\\\",\\\"Nu\\\",\\\"Xi\\\",\\\"Omicron\\\",\\\"Pi\\\",\\\"Rho\\\",\\\"Sigma\\\",\\\"Tau\\\",\\\"Upsilon\\\",\\\"Phi\\\",\\\"Chi\\\",\\\"Psi\\\",\\\"Omega\\\",\\\"alpha\\\",\\\"beta\\\",\\\"gamma\\\",\\\"delta\\\",\\\"epsilon\\\",\\\"zeta\\\",\\\"eta\\\",\\\"theta\\\",\\\"iota\\\",\\\"kappa\\\",\\\"lambda\\\",\\\"mu\\\",\\\"nu\\\",\\\"xi\\\",\\\"omicron\\\",\\\"pi\\\",\\\"rho\\\",\\\"sigmaf\\\",\\\"sigma\\\",\\\"tau\\\",\\\"upsilon\\\",\\\"phi\\\",\\\"chi\\\",\\\"psi\\\",\\\"omega\\\",\\\"thetasym\\\",\\\"upsih\\\",\\\"piv\\\",\\\"bull\\\",\\\"hellip\\\",\\\"prime\\\",\\\"Prime\\\",\\\"oline\\\",\\\"frasl\\\",\\\"weierp\\\",\\\"image\\\",\\\"real\\\",\\\"trade\\\",\\\"alefsym\\\",\\\"larr\\\",\\\"uarr\\\",\\\"rarr\\\",\\\"darr\\\",\\\"harr\\\",\\\"crarr\\\",\\\"lArr\\\",\\\"uArr\\\",\\\"rArr\\\",\\\"dArr\\\",\\\"hArr\\\",\\\"forall\\\",\\\"part\\\",\\\"exist\\\",\\\"empty\\\",\\\"nabla\\\",\\\"isin\\\",\\\"notin\\\",\\\"ni\\\",\\\"prod\\\",\\\"sum\\\",\\\"minus\\\",\\\"lowast\\\",\\\"radic\\\",\\\"prop\\\",\\\"infin\\\",\\\"ang\\\",\\\"and\\\",\\\"or\\\",\\\"cap\\\",\\\"cup\\\",\\\"int\\\",\\\"there4\\\",\\\"sim\\\",\\\"cong\\\",\\\"asymp\\\",\\\"ne\\\",\\\"equiv\\\",\\\"le\\\",\\\"ge\\\",\\\"sub\\\",\\\"sup\\\",\\\"nsub\\\",\\\"sube\\\",\\\"supe\\\",\\\"oplus\\\",\\\"otimes\\\",\\\"perp\\\",\\\"sdot\\\",\\\"lceil\\\",\\\"rceil\\\",\\\"lfloor\\\",\\\"rfloor\\\",\\\"lang\\\",\\\"rang\\\",\\\"loz\\\",\\\"spades\\\",\\\"clubs\\\",\\\"hearts\\\",\\\"diams\\\"],u=[39,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,34,38,60,62,338,339,352,353,376,710,732,8194,8195,8201,8204,8205,8206,8207,8211,8212,8216,8217,8218,8220,8221,8222,8224,8225,8240,8249,8250,8364,402,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,977,978,982,8226,8230,8242,8243,8254,8260,8472,8465,8476,8482,8501,8592,8593,8594,8595,8596,8629,8656,8657,8658,8659,8660,8704,8706,8707,8709,8711,8712,8713,8715,8719,8721,8722,8727,8730,8733,8734,8736,8743,8744,8745,8746,8747,8756,8764,8773,8776,8800,8801,8804,8805,8834,8835,8836,8838,8839,8853,8855,8869,8901,8968,8969,8970,8971,9001,9002,9674,9824,9827,9829,9830],o={},a={},i=0,l=r.length;i<l;){var s=r[i],c=u[i];o[s]=String.fromCharCode(c),a[c]=s,i++}n.prototype.decode=function(e){return e&&e.length?e.replace(/&(#?[\\\\w\\\\d]+);?/g,function(e,t){var n;if(\\\"#\\\"===t.charAt(0)){var r=\\\"x\\\"===t.charAt(1).toLowerCase()?parseInt(t.substr(2),16):parseInt(t.substr(1));isNaN(r)||r<-32768||r>65535||(n=String.fromCharCode(r))}else n=o[t];return n||e}):\\\"\\\"},n.decode=function(e){return(new n).decode(e)},n.prototype.encode=function(e){if(!e||!e.length)return\\\"\\\";for(var t=e.length,n=\\\"\\\",r=0;r<t;){var u=a[e.charCodeAt(r)];n+=u?\\\"&\\\"+u+\\\";\\\":e.charAt(r),r++}return n},n.encode=function(e){return(new n).encode(e)},n.prototype.encodeNonUTF=function(e){if(!e||!e.length)return\\\"\\\";for(var t=e.length,n=\\\"\\\",r=0;r<t;){var u=e.charCodeAt(r),o=a[u];n+=o?\\\"&\\\"+o+\\\";\\\":u<32||u>126?\\\"&#\\\"+u+\\\";\\\":e.charAt(r),r++}return n},n.encodeNonUTF=function(e){return(new n).encodeNonUTF(e)},n.prototype.encodeNonASCII=function(e){if(!e||!e.length)return\\\"\\\";for(var t=e.length,n=\\\"\\\",r=0;r<t;){var u=e.charCodeAt(r);u<=255?n+=e[r++]:(n+=\\\"&#\\\"+u+\\\";\\\",r++)}return n},n.encodeNonASCII=function(e){return(new n).encodeNonASCII(e)},e.exports=n},function(e,t,n){\\\"use strict\\\";function r(e){for(var t=e.split(\\\"\\\\n\\\"),n=\\\"\\\",r=0,u=0;u<t.length;u++){var l=o.a.ansiToText(t[u]).trim();if(l){!n&&l.match(a)&&(n=l);for(var s=0;s<i.length;){var c=l.match(i[s]);if(c){r=parseInt(c[1],10);break}s++}if(n&&r)break}}return n&&r?{fileName:n,lineNumber:r}:null}var u=n(12),o=n.n(u),a=/^\\\\.(\\\\/[^\\\\/\\\\n ]+)+\\\\.[^\\\\/\\\\n ]+$/,i=[/^.*\\\\((\\\\d+):(\\\\d+)\\\\)$/,/^Line (\\\\d+):.+$/];t.a=r},function(e,t,n){\\\"use strict\\\";function r(e,t){if(!(e instanceof t))throw new TypeError(\\\"Cannot call a class as a function\\\")}function u(e,t){if(!e)throw new ReferenceError(\\\"this hasn't been initialised - super() hasn't been called\\\");return!t||\\\"object\\\"!==typeof t&&\\\"function\\\"!==typeof t?e:t}function o(e,t){if(\\\"function\\\"!==typeof t&&null!==t)throw new TypeError(\\\"Super expression must either be null or a function, not \\\"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var a=n(0),i=n.n(a),l=n(7),s=n(41),c=n(42),p=n(43),f=n(8),d=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\\\"value\\\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),D=function(e){function t(){var e,n,o,a;r(this,t);for(var i=arguments.length,l=Array(i),s=0;s<i;s++)l[s]=arguments[s];return n=o=u(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(l))),o.state={currentIndex:0},o.previous=function(){o.setState(function(e,t){return{currentIndex:e.currentIndex>0?e.currentIndex-1:t.errorRecords.length-1}})},o.next=function(){o.setState(function(e,t){return{currentIndex:e.currentIndex<t.errorRecords.length-1?e.currentIndex+1:0}})},o.shortcutHandler=function(e){\\\"Escape\\\"===e?o.props.close():\\\"ArrowLeft\\\"===e?o.previous():\\\"ArrowRight\\\"===e&&o.next()},a=n,u(o,a)}return o(t,e),d(t,[{key:\\\"render\\\",value:function(){var e=this.props,t=e.errorRecords,n=e.close,r=t.length;return i.a.createElement(l.a,{shortcutHandler:this.shortcutHandler},i.a.createElement(s.a,{close:n}),r>1&&i.a.createElement(c.a,{currentError:this.state.currentIndex+1,totalErrors:r,previous:this.previous,next:this.next}),i.a.createElement(p.a,{errorRecord:t[this.state.currentIndex],editorHandler:this.props.editorHandler}),i.a.createElement(f.a,{line1:\\\"This screen is visible only in development. It will not appear if the app crashes in production.\\\",line2:\\\"Open your browser’s developer console to further inspect this error.\\\"}))}}]),t}(a.PureComponent);t.a=D},function(e,t,n){\\\"use strict\\\";function r(e){var t=e.close;return o.a.createElement(\\\"span\\\",{title:\\\"Click or press Escape to dismiss.\\\",onClick:t,style:i},\\\"×\\\")}var u=n(0),o=n.n(u),a=n(1),i={color:a.a,lineHeight:\\\"1rem\\\",fontSize:\\\"1.5rem\\\",padding:\\\"1rem\\\",cursor:\\\"pointer\\\",position:\\\"absolute\\\",right:0,top:0};t.a=r},function(e,t,n){\\\"use strict\\\";function r(e){var t=e.currentError,n=e.totalErrors,r=e.previous,u=e.next;return o.a.createElement(\\\"div\\\",{style:i},o.a.createElement(\\\"span\\\",{style:l},o.a.createElement(\\\"button\\\",{onClick:r,style:c},\\\"←\\\"),o.a.createElement(\\\"button\\\",{onClick:u,style:p},\\\"→\\\")),t+\\\" of \\\"+n+\\\" errors on the page\\\")}var u=n(0),o=n.n(u),a=n(1),i={marginBottom:\\\"0.5rem\\\"},l={marginRight:\\\"1em\\\"},s={backgroundColor:a.f,color:a.e,border:\\\"none\\\",borderRadius:\\\"4px\\\",padding:\\\"3px 6px\\\",cursor:\\\"pointer\\\"},c=Object.assign({},s,{borderTopRightRadius:\\\"0px\\\",borderBottomRightRadius:\\\"0px\\\",marginRight:\\\"1px\\\"}),p=Object.assign({},s,{borderTopLeftRadius:\\\"0px\\\",borderBottomLeftRadius:\\\"0px\\\"});t.a=r},function(e,t,n){\\\"use strict\\\";function r(e){var t=e.errorRecord,n=e.editorHandler,r=t.error,u=t.unhandledRejection,s=t.contextSize,c=t.stackFrames,p=u?\\\"Unhandled Rejection (\\\"+r.name+\\\")\\\":r.name,f=r.message,d=f.match(/^\\\\w*:/)||!p?f:p+\\\": \\\"+f;return d=d.replace(/^Invariant Violation:\\\\s*/,\\\"\\\").replace(/^Warning:\\\\s*/,\\\"\\\").replace(\\\" Check the render method\\\",\\\"\\\\n\\\\nCheck the render method\\\").replace(\\\" Check your code at\\\",\\\"\\\\n\\\\nCheck your code at\\\"),o.a.createElement(\\\"div\\\",{style:l},o.a.createElement(a.a,{headerText:d}),o.a.createElement(i.a,{stackFrames:c,errorName:p,contextSize:s,editorHandler:n}))}var u=n(0),o=n.n(u),a=n(9),i=n(44),l={display:\\\"flex\\\",flexDirection:\\\"column\\\"};t.a=r},function(e,t,n){\\\"use strict\\\";function r(e,t){if(!(e instanceof t))throw new TypeError(\\\"Cannot call a class as a function\\\")}function u(e,t){if(!e)throw new ReferenceError(\\\"this hasn't been initialised - super() hasn't been called\\\");return!t||\\\"object\\\"!==typeof t&&\\\"function\\\"!==typeof t?e:t}function o(e,t){if(\\\"function\\\"!==typeof t&&null!==t)throw new TypeError(\\\"Super expression must either be null or a function, not \\\"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var a=n(0),i=n.n(a),l=n(45),s=n(61),c=n(62),p=n(63),f=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\\\"value\\\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),d={fontSize:\\\"1em\\\",flex:\\\"0 1 auto\\\",minHeight:\\\"0px\\\",overflow:\\\"auto\\\"},D=function(e){function t(){return r(this,t),u(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return o(t,e),f(t,[{key:\\\"renderFrames\\\",value:function(){var e=this.props,t=e.stackFrames,n=e.errorName,r=e.contextSize,u=e.editorHandler,o=[],a=!1,f=[],d=0;return t.forEach(function(e,D){var h=e.fileName,g=e._originalFileName,m=Object(c.a)(g,h),C=!Object(p.a)(n),E=m&&(C||a);m||(a=!0);var A=i.a.createElement(l.a,{key:\\\"frame-\\\"+D,frame:e,contextSize:r,critical:0===D,showCode:!E,editorHandler:u}),F=D===t.length-1;E&&f.push(A),E&&!F||(1===f.length?o.push(f[0]):f.length>1&&(d++,o.push(i.a.createElement(s.a,{key:\\\"bundle-\\\"+d},f))),f=[]),E||o.push(A)}),o}},{key:\\\"render\\\",value:function(){return i.a.createElement(\\\"div\\\",{style:d},this.renderFrames())}}]),t}(a.Component);t.a=D},function(e,t,n){\\\"use strict\\\";function r(e,t){if(!(e instanceof t))throw new TypeError(\\\"Cannot call a class as a function\\\")}function u(e,t){if(!e)throw new ReferenceError(\\\"this hasn't been initialised - super() hasn't been called\\\");return!t||\\\"object\\\"!==typeof t&&\\\"function\\\"!==typeof t?e:t}function o(e,t){if(\\\"function\\\"!==typeof t&&null!==t)throw new TypeError(\\\"Super expression must either be null or a function, not \\\"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var a=n(0),i=n.n(a),l=n(46),s=n(60),c=n(1),p=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\\\"value\\\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),f={fontSize:\\\"0.9em\\\",marginBottom:\\\"0.9em\\\"},d={textDecoration:\\\"none\\\",color:c.b,cursor:\\\"pointer\\\"},D={cursor:\\\"pointer\\\"},h={marginBottom:\\\"1.5em\\\",color:c.b,cursor:\\\"pointer\\\",border:\\\"none\\\",display:\\\"block\\\",width:\\\"100%\\\",textAlign:\\\"left\\\",background:\\\"#fff\\\",fontFamily:\\\"Consolas, Menlo, monospace\\\",fontSize:\\\"1em\\\",padding:\\\"0px\\\",lineHeight:\\\"1.5\\\"},g=function(e){function t(){var e,n,o,a;r(this,t);for(var i=arguments.length,l=Array(i),s=0;s<i;s++)l[s]=arguments[s];return n=o=u(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(l))),o.state={compiled:!1},o.toggleCompiled=function(){o.setState(function(e){return{compiled:!e.compiled}})},o.editorHandler=function(){var e=o.getErrorLocation();e&&o.props.editorHandler(e)},o.onKeyDown=function(e){\\\"Enter\\\"===e.key&&o.editorHandler()},a=n,u(o,a)}return o(t,e),p(t,[{key:\\\"getErrorLocation\\\",value:function(){var e=this.props.frame,t=e._originalFileName,n=e._originalLineNumber;return t?-1!==t.trim().indexOf(\\\" \\\")?null:{fileName:t,lineNumber:n||1}:null}},{key:\\\"render\\\",value:function(){var e=this.props,t=e.frame,n=e.contextSize,r=e.critical,u=e.showCode,o=t.fileName,a=t.lineNumber,c=t.columnNumber,p=t._scriptCode,g=t._originalFileName,m=t._originalLineNumber,C=t._originalColumnNumber,E=t._originalScriptCode,A=t.getFunctionName(),F=this.state.compiled,b=Object(s.a)(g,m,C,o,a,c,F),y=null;u&&(F&&p&&0!==p.length&&null!=a?y={lines:p,lineNum:a,columnNum:c,contextSize:n,main:r}:!F&&E&&0!==E.length&&null!=m&&(y={lines:E,lineNum:m,columnNum:C,contextSize:n,main:r}));var v=null!==this.getErrorLocation()&&null!==this.props.editorHandler;return i.a.createElement(\\\"div\\\",null,i.a.createElement(\\\"div\\\",null,A),i.a.createElement(\\\"div\\\",{style:f},i.a.createElement(\\\"a\\\",{style:v?d:null,onClick:v?this.editorHandler:null,onKeyDown:v?this.onKeyDown:null,tabIndex:v?\\\"0\\\":null},b)),y&&i.a.createElement(\\\"span\\\",null,i.a.createElement(\\\"a\\\",{onClick:v?this.editorHandler:null,style:v?D:null},i.a.createElement(l.a,y)),i.a.createElement(\\\"button\\\",{style:h,onClick:this.toggleCompiled},\\\"View \\\"+(F?\\\"source\\\":\\\"compiled\\\"))))}}]),t}(a.Component);t.a=g},function(e,t,n){\\\"use strict\\\";function r(e){var t=e.lines,n=e.lineNum,r=e.columnNum,u=e.contextSize,p=e.main,d=[],D=1/0;t.forEach(function(e){var t=e.content,n=t.match(/^\\\\s*/);\\\"\\\"!==t&&(D=n&&n[0]?Math.min(D,n[0].length):0)}),t.forEach(function(e){var t=e.content,n=e.lineNumber;isFinite(D)&&(t=t.substring(D)),d[n-1]=t});var h=f()(d.join(\\\"\\\\n\\\"),n,null==r?0:r-(isFinite(D)?D:0),{forceColor:!0,linesAbove:u,linesBelow:u}),g=Object(c.a)(h),m=document.createElement(\\\"code\\\");m.innerHTML=g,Object(l.a)(m);var C=m.childNodes;e:for(var E=0;E<C.length;++E)for(var A=C[E],F=A.childNodes,b=0;b<F.length;++b){var y=F[b],v=y.innerText;if(null!=v&&-1!==v.indexOf(\\\" \\\"+n+\\\" |\\\")){Object(i.a)(A,p?s.d:s.g);break e}}return o.a.createElement(a.a,{main:p,codeHTML:m.innerHTML})}var u=n(0),o=n.n(u),a=n(10),i=n(14),l=n(47),s=n(1),c=n(11),p=n(48),f=n.n(p);t.a=r},function(e,t,n){\\\"use strict\\\";function r(e,t){for(;null!=t&&\\\"br\\\"!==t.tagName.toLowerCase();)t=t.nextElementSibling;null!=t&&e.removeChild(t)}function u(e){for(var t=e.childNodes,n=0;n<t.length;++n){var u=t[n];if(\\\"span\\\"===u.tagName.toLowerCase()){var o=u.innerText;if(null!=o){\\\"|^\\\"===o.replace(/\\\\s/g,\\\"\\\")&&(u.style.position=\\\"absolute\\\",r(e,u))}}}}n.d(t,\\\"a\\\",function(){return u})},function(e,t,n){\\\"use strict\\\";function r(e){return e&&e.__esModule?e:{default:e}}function u(e){return{keyword:e.cyan,capitalized:e.yellow,jsx_tag:e.yellow,punctuator:e.yellow,number:e.magenta,string:e.green,regex:e.magenta,comment:e.grey,invalid:e.white.bgRed.bold,gutter:e.grey,marker:e.red.bold}}function o(e){var t=e.slice(-2),n=t[0],r=t[1],u=(0,i.matchToToken)(e);if(\\\"name\\\"===u.type){if(c.default.keyword.isReservedWordES6(u.value))return\\\"keyword\\\";if(D.test(u.value)&&(\\\"<\\\"===r[n-1]||\\\"</\\\"==r.substr(n-2,2)))return\\\"jsx_tag\\\";if(u.value[0]!==u.value[0].toLowerCase())return\\\"capitalized\\\"}return\\\"punctuator\\\"===u.type&&h.test(u.value)?\\\"bracket\\\":u.type}function a(e,t){return t.replace(l.default,function(){for(var t=arguments.length,n=Array(t),r=0;r<t;r++)n[r]=arguments[r];var u=o(n),a=e[u];return a?n[0].split(d).map(function(e){return a(e)}).join(\\\"\\\\n\\\"):n[0]})}t.__esModule=!0,t.default=function(e,t,n){var r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};n=Math.max(n,0);var o=r.highlightCode&&f.default.supportsColor||r.forceColor,i=f.default;r.forceColor&&(i=new f.default.constructor({enabled:!0}));var l=function(e,t){return o?e(t):t},s=u(i);o&&(e=a(s,e));var c=r.linesAbove||2,p=r.linesBelow||3,D=e.split(d),h=Math.max(t-(c+1),0),g=Math.min(D.length,t+p);t||n||(h=0,g=D.length);var m=String(g).length,C=D.slice(h,g).map(function(e,r){var u=h+1+r,o=(\\\" \\\"+u).slice(-m),a=\\\" \\\"+o+\\\" | \\\";if(u===t){var i=\\\"\\\";if(n){var c=e.slice(0,n-1).replace(/[^\\\\t]/g,\\\" \\\");i=[\\\"\\\\n \\\",l(s.gutter,a.replace(/\\\\d/g,\\\" \\\")),c,l(s.marker,\\\"^\\\")].join(\\\"\\\")}return[l(s.marker,\\\">\\\"),l(s.gutter,a),e,i].join(\\\"\\\")}return\\\" \\\"+l(s.gutter,a)+e}).join(\\\"\\\\n\\\");return o?i.reset(C):C};var i=n(49),l=r(i),s=n(50),c=r(s),p=n(53),f=r(p),d=/\\\\r\\\\n|[\\\\n\\\\r\\\\u2028\\\\u2029]/,D=/^[a-z][\\\\w-]*$/i,h=/^[()\\\\[\\\\]{}]$/;e.exports=t.default},function(e,t){Object.defineProperty(t,\\\"__esModule\\\",{value:!0}),t.default=/((['\\\"])(?:(?!\\\\2|\\\\\\\\).|\\\\\\\\(?:\\\\r\\\\n|[\\\\s\\\\S]))*(\\\\2)?|`(?:[^`\\\\\\\\$]|\\\\\\\\[\\\\s\\\\S]|\\\\$(?!\\\\{)|\\\\$\\\\{(?:[^{}]|\\\\{[^}]*\\\\}?)*\\\\}?)*(`)?)|(\\\\/\\\\/.*)|(\\\\/\\\\*(?:[^*]|\\\\*(?!\\\\/))*(\\\\*\\\\/)?)|(\\\\/(?!\\\\*)(?:\\\\[(?:(?![\\\\]\\\\\\\\]).|\\\\\\\\.)*\\\\]|(?![\\\\/\\\\]\\\\\\\\]).|\\\\\\\\.)+\\\\/(?:(?!\\\\s*(?:\\\\b|[\\\\u0080-\\\\uFFFF$\\\\\\\\'\\\"~({]|[+\\\\-!](?!=)|\\\\.?\\\\d))|[gmiyu]{1,5}\\\\b(?![\\\\u0080-\\\\uFFFF$\\\\\\\\]|\\\\s*(?:[+\\\\-*%&|^<>!=?({]|\\\\/(?![\\\\/*])))))|(0[xX][\\\\da-fA-F]+|0[oO][0-7]+|0[bB][01]+|(?:\\\\d*\\\\.\\\\d+|\\\\d+\\\\.?)(?:[eE][+-]?\\\\d+)?)|((?!\\\\d)(?:(?!\\\\s)[$\\\\w\\\\u0080-\\\\uFFFF]|\\\\\\\\u[\\\\da-fA-F]{4}|\\\\\\\\u\\\\{[\\\\da-fA-F]+\\\\})+)|(--|\\\\+\\\\+|&&|\\\\|\\\\||=>|\\\\.{3}|(?:[+\\\\-\\\\/%&|^]|\\\\*{1,2}|<{1,2}|>{1,3}|!=?|={1,2})=?|[?~.,:;[\\\\](){}])|(\\\\s+)|(^$|[\\\\s\\\\S])/g,t.matchToToken=function(e){var t={type:\\\"invalid\\\",value:e[0]};return e[1]?(t.type=\\\"string\\\",t.closed=!(!e[3]&&!e[4])):e[5]?t.type=\\\"comment\\\":e[6]?(t.type=\\\"comment\\\",t.closed=!!e[7]):e[8]?t.type=\\\"regex\\\":e[9]?t.type=\\\"number\\\":e[10]?t.type=\\\"name\\\":e[11]?t.type=\\\"punctuator\\\":e[12]&&(t.type=\\\"whitespace\\\"),t}},function(e,t,n){!function(){\\\"use strict\\\";t.ast=n(51),t.code=n(15),t.keyword=n(52)}()},function(e,t){!function(){\\\"use strict\\\";function t(e){if(null==e)return!1;switch(e.type){case\\\"ArrayExpression\\\":case\\\"AssignmentExpression\\\":case\\\"BinaryExpression\\\":case\\\"CallExpression\\\":case\\\"ConditionalExpression\\\":case\\\"FunctionExpression\\\":case\\\"Identifier\\\":case\\\"Literal\\\":case\\\"LogicalExpression\\\":case\\\"MemberExpression\\\":case\\\"NewExpression\\\":case\\\"ObjectExpression\\\":case\\\"SequenceExpression\\\":case\\\"ThisExpression\\\":case\\\"UnaryExpression\\\":case\\\"UpdateExpression\\\":return!0}return!1}function n(e){if(null==e)return!1;switch(e.type){case\\\"DoWhileStatement\\\":case\\\"ForInStatement\\\":case\\\"ForStatement\\\":case\\\"WhileStatement\\\":return!0}return!1}function r(e){if(null==e)return!1;switch(e.type){case\\\"BlockStatement\\\":case\\\"BreakStatement\\\":case\\\"ContinueStatement\\\":case\\\"DebuggerStatement\\\":case\\\"DoWhileStatement\\\":case\\\"EmptyStatement\\\":case\\\"ExpressionStatement\\\":case\\\"ForInStatement\\\":case\\\"ForStatement\\\":case\\\"IfStatement\\\":case\\\"LabeledStatement\\\":case\\\"ReturnStatement\\\":case\\\"SwitchStatement\\\":case\\\"ThrowStatement\\\":case\\\"TryStatement\\\":case\\\"VariableDeclaration\\\":case\\\"WhileStatement\\\":case\\\"WithStatement\\\":return!0}return!1}function u(e){return r(e)||null!=e&&\\\"FunctionDeclaration\\\"===e.type}function o(e){switch(e.type){case\\\"IfStatement\\\":return null!=e.alternate?e.alternate:e.consequent;case\\\"LabeledStatement\\\":case\\\"ForStatement\\\":case\\\"ForInStatement\\\":case\\\"WhileStatement\\\":case\\\"WithStatement\\\":return e.body}return null}function a(e){var t;if(\\\"IfStatement\\\"!==e.type)return!1;if(null==e.alternate)return!1;t=e.consequent;do{if(\\\"IfStatement\\\"===t.type&&null==t.alternate)return!0;t=o(t)}while(t);return!1}e.exports={isExpression:t,isStatement:r,isIterationStatement:n,isSourceElement:u,isProblematicIfStatement:a,trailingStatement:o}}()},function(e,t,n){!function(){\\\"use strict\\\";function t(e){switch(e){case\\\"implements\\\":case\\\"interface\\\":case\\\"package\\\":case\\\"private\\\":case\\\"protected\\\":case\\\"public\\\":case\\\"static\\\":case\\\"let\\\":return!0;default:return!1}}function r(e,t){return!(!t&&\\\"yield\\\"===e)&&u(e,t)}function u(e,n){if(n&&t(e))return!0;switch(e.length){case 2:return\\\"if\\\"===e||\\\"in\\\"===e||\\\"do\\\"===e;case 3:return\\\"var\\\"===e||\\\"for\\\"===e||\\\"new\\\"===e||\\\"try\\\"===e;case 4:return\\\"this\\\"===e||\\\"else\\\"===e||\\\"case\\\"===e||\\\"void\\\"===e||\\\"with\\\"===e||\\\"enum\\\"===e;case 5:return\\\"while\\\"===e||\\\"break\\\"===e||\\\"catch\\\"===e||\\\"throw\\\"===e||\\\"const\\\"===e||\\\"yield\\\"===e||\\\"class\\\"===e||\\\"super\\\"===e;case 6:return\\\"return\\\"===e||\\\"typeof\\\"===e||\\\"delete\\\"===e||\\\"switch\\\"===e||\\\"export\\\"===e||\\\"import\\\"===e;case 7:return\\\"default\\\"===e||\\\"finally\\\"===e||\\\"extends\\\"===e;case 8:return\\\"function\\\"===e||\\\"continue\\\"===e||\\\"debugger\\\"===e;case 10:return\\\"instanceof\\\"===e;default:return!1}}function o(e,t){return\\\"null\\\"===e||\\\"true\\\"===e||\\\"false\\\"===e||r(e,t)}function a(e,t){return\\\"null\\\"===e||\\\"true\\\"===e||\\\"false\\\"===e||u(e,t)}function i(e){return\\\"eval\\\"===e||\\\"arguments\\\"===e}function l(e){var t,n,r;if(0===e.length)return!1;if(r=e.charCodeAt(0),!d.isIdentifierStartES5(r))return!1;for(t=1,n=e.length;t<n;++t)if(r=e.charCodeAt(t),!d.isIdentifierPartES5(r))return!1;return!0}function s(e,t){return 1024*(e-55296)+(t-56320)+65536}function c(e){var t,n,r,u,o;if(0===e.length)return!1;for(o=d.isIdentifierStartES6,t=0,n=e.length;t<n;++t){if(55296<=(r=e.charCodeAt(t))&&r<=56319){if(++t>=n)return!1;if(!(56320<=(u=e.charCodeAt(t))&&u<=57343))return!1;r=s(r,u)}if(!o(r))return!1;o=d.isIdentifierPartES6}return!0}function p(e,t){return l(e)&&!o(e,t)}function f(e,t){return c(e)&&!a(e,t)}var d=n(15);e.exports={isKeywordES5:r,isKeywordES6:u,isReservedWordES5:o,isReservedWordES6:a,isRestrictedWord:i,isIdentifierNameES5:l,isIdentifierNameES6:c,isIdentifierES5:p,isIdentifierES6:f}}()},function(e,t,n){\\\"use strict\\\";(function(t){function r(e){this.enabled=e&&void 0!==e.enabled?e.enabled:c}function u(e){var t=function(){return o.apply(t,arguments)};return t._styles=e,t.enabled=this.enabled,t.__proto__=D,t}function o(){var e=arguments,t=e.length,n=0!==t&&String(arguments[0]);if(t>1)for(var r=1;r<t;r++)n+=\\\" \\\"+e[r];if(!this.enabled||!n)return n;var u=this._styles,o=u.length,a=i.dim.open;for(!f||-1===u.indexOf(\\\"gray\\\")&&-1===u.indexOf(\\\"grey\\\")||(i.dim.open=\\\"\\\");o--;){var l=i[u[o]];n=l.open+n.replace(l.closeRe,l.open)+l.close}return i.dim.open=a,n}var a=n(54),i=n(55),l=n(57),s=n(58),c=n(59),p=Object.defineProperties,f=\\\"win32\\\"===t.platform&&!/^xterm/i.test(Object({NODE_ENV:\\\"production\\\"}).TERM);f&&(i.blue.open=\\\"\\u001b[94m\\\");var d=function(){var e={};return Object.keys(i).forEach(function(t){i[t].closeRe=new RegExp(a(i[t].close),\\\"g\\\"),e[t]={get:function(){return u.call(this,this._styles.concat(t))}}}),e}(),D=p(function(){},d);p(r.prototype,function(){var e={};return Object.keys(d).forEach(function(t){e[t]={get:function(){return u.call(this,[t])}}}),e}()),e.exports=new r,e.exports.styles=i,e.exports.hasColor=s,e.exports.stripColor=l,e.exports.supportsColor=c}).call(t,n(16))},function(e,t,n){\\\"use strict\\\";var r=/[|\\\\\\\\{}()[\\\\]^$+*?.]/g;e.exports=function(e){if(\\\"string\\\"!==typeof e)throw new TypeError(\\\"Expected a string\\\");return e.replace(r,\\\"\\\\\\\\$&\\\")}},function(e,t,n){\\\"use strict\\\";(function(e){function t(){var e={modifiers:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},colors:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],gray:[90,39]},bgColors:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49]}};return e.colors.grey=e.colors.gray,Object.keys(e).forEach(function(t){var n=e[t];Object.keys(n).forEach(function(t){var r=n[t];e[t]=n[t]={open:\\\"\\u001b[\\\"+r[0]+\\\"m\\\",close:\\\"\\u001b[\\\"+r[1]+\\\"m\\\"}}),Object.defineProperty(e,t,{value:n,enumerable:!1})}),e}Object.defineProperty(e,\\\"exports\\\",{enumerable:!0,get:t})}).call(t,n(56)(e))},function(e,t){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,\\\"loaded\\\",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,\\\"id\\\",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}},function(e,t,n){\\\"use strict\\\";var r=n(17)();e.exports=function(e){return\\\"string\\\"===typeof e?e.replace(r,\\\"\\\"):e}},function(e,t,n){\\\"use strict\\\";var r=n(17),u=new RegExp(r().source);e.exports=u.test.bind(u)},function(e,t,n){\\\"use strict\\\";(function(t){var n=t.argv,r=n.indexOf(\\\"--\\\"),u=function(e){e=\\\"--\\\"+e;var t=n.indexOf(e);return-1!==t&&(-1===r||t<r)};e.exports=function(){return\\\"FORCE_COLOR\\\"in Object({NODE_ENV:\\\"production\\\"})||!(u(\\\"no-color\\\")||u(\\\"no-colors\\\")||u(\\\"color=false\\\"))&&(!!(u(\\\"color\\\")||u(\\\"colors\\\")||u(\\\"color=true\\\")||u(\\\"color=always\\\"))||!(t.stdout&&!t.stdout.isTTY)&&(\\\"win32\\\"===t.platform||(\\\"COLORTERM\\\"in Object({NODE_ENV:\\\"production\\\"})||\\\"dumb\\\"!==Object({NODE_ENV:\\\"production\\\"}).TERM&&!!/^screen|^xterm|^vt100|color|ansi|cygwin|linux/i.test(Object({NODE_ENV:\\\"production\\\"}).TERM))))}()}).call(t,n(16))},function(e,t,n){\\\"use strict\\\";function r(e,t,n,r,u,o,a){var i=void 0;if(!a&&e&&\\\"number\\\"===typeof t){var l=/^[\\\\/|\\\\\\\\].*?[\\\\/|\\\\\\\\]((src|node_modules)[\\\\/|\\\\\\\\].*)/.exec(e);i=l&&l[1]?l[1]:e,i+=\\\":\\\"+t,n&&(i+=\\\":\\\"+n)}else r&&\\\"number\\\"===typeof u?(i=r+\\\":\\\"+u,o&&(i+=\\\":\\\"+o)):i=\\\"unknown\\\";return i.replace(\\\"webpack://\\\",\\\".\\\")}n.d(t,\\\"a\\\",function(){return r})},function(e,t,n){\\\"use strict\\\";function r(e,t){if(!(e instanceof t))throw new TypeError(\\\"Cannot call a class as a function\\\")}function u(e,t){if(!e)throw new ReferenceError(\\\"this hasn't been initialised - super() hasn't been called\\\");return!t||\\\"object\\\"!==typeof t&&\\\"function\\\"!==typeof t?e:t}function o(e,t){if(\\\"function\\\"!==typeof t&&null!==t)throw new TypeError(\\\"Super expression must either be null or a function, not \\\"+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}var a=n(0),i=n.n(a),l=n(1),s=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\\\"value\\\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),c={color:l.a,cursor:\\\"pointer\\\",border:\\\"none\\\",display:\\\"block\\\",width:\\\"100%\\\",textAlign:\\\"left\\\",background:\\\"#fff\\\",fontFamily:\\\"Consolas, Menlo, monospace\\\",fontSize:\\\"1em\\\",padding:\\\"0px\\\",lineHeight:\\\"1.5\\\"},p=Object.assign({},c,{marginBottom:\\\"1.5em\\\"}),f=Object.assign({},c,{marginBottom:\\\"0.6em\\\"}),d=function(e){function t(){var e,n,o,a;r(this,t);for(var i=arguments.length,l=Array(i),s=0;s<i;s++)l[s]=arguments[s];return n=o=u(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(l))),o.state={collapsed:!0},o.toggleCollaped=function(){o.setState(function(e){return{collapsed:!e.collapsed}})},a=n,u(o,a)}return o(t,e),s(t,[{key:\\\"render\\\",value:function(){var e=this.props.children.length,t=this.state.collapsed;return i.a.createElement(\\\"div\\\",null,i.a.createElement(\\\"button\\\",{onClick:this.toggleCollaped,style:t?p:f},(t?\\\"▶\\\":\\\"▼\\\")+\\\" \\\"+e+\\\" stack frames were \\\"+(t?\\\"collapsed.\\\":\\\"expanded.\\\")),i.a.createElement(\\\"div\\\",{style:{display:t?\\\"none\\\":\\\"block\\\"}},this.props.children,i.a.createElement(\\\"button\\\",{onClick:this.toggleCollaped,style:f},\\\"▲ \\\"+e+\\\" stack frames were expanded.\\\")))}}]),t}(a.Component);t.a=d},function(e,t,n){\\\"use strict\\\";function r(e,t){return null==e||\\\"\\\"===e||-1!==e.indexOf(\\\"/~/\\\")||-1!==e.indexOf(\\\"/node_modules/\\\")||-1!==e.trim().indexOf(\\\" \\\")||null==t||\\\"\\\"===t}n.d(t,\\\"a\\\",function(){return r})},function(e,t,n){\\\"use strict\\\";function r(e){switch(e){case\\\"EvalError\\\":case\\\"InternalError\\\":case\\\"RangeError\\\":case\\\"ReferenceError\\\":case\\\"SyntaxError\\\":case\\\"TypeError\\\":case\\\"URIError\\\":return!0;default:return!1}}n.d(t,\\\"a\\\",function(){return r})}]);\"\n\n/***/ })\n/******/ ]);\n});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-error-overlay/lib/index.js\n// module id = ./node_modules/react-error-overlay/lib/index.js\n// module chunks = 0","// @remove-on-eject-begin\n/**\n * Copyright (c) 2015-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n// @remove-on-eject-end\n'use strict';\n\nif (typeof Promise === 'undefined') {\n // Rejection tracking prevents a common issue where React gets into an\n // inconsistent state due to an error, but it gets swallowed by a Promise,\n // and the user has no idea what causes React's erratic future behavior.\n require('promise/lib/rejection-tracking').enable();\n window.Promise = require('promise/lib/es6-extensions.js');\n}\n\n// fetch() polyfill for making API calls.\nrequire('whatwg-fetch');\n\n// Object.assign() is commonly used with React.\n// It will use the native implementation if it's present and isn't buggy.\nObject.assign = require('object-assign');\n\n// In tests, polyfill requestAnimationFrame since jsdom doesn't provide it yet.\n// We don't polyfill it in the browser--this is user's responsibility.\nif (process.env.NODE_ENV === 'test') {\n require('raf').polyfill(global);\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-scripts/config/polyfills.js\n// module id = ./node_modules/react-scripts/config/polyfills.js\n// module chunks = 0","'use strict';\n\nvar asap = require('asap/raw');\n\nfunction noop() {}\n\n// States:\n//\n// 0 - pending\n// 1 - fulfilled with _value\n// 2 - rejected with _value\n// 3 - adopted the state of another promise, _value\n//\n// once the state is no longer pending (0) it is immutable\n\n// All `_` prefixed properties will be reduced to `_{random number}`\n// at build time to obfuscate them and discourage their use.\n// We don't use symbols or Object.defineProperty to fully hide them\n// because the performance isn't good enough.\n\n\n// to avoid using try/catch inside critical functions, we\n// extract them to here.\nvar LAST_ERROR = null;\nvar IS_ERROR = {};\nfunction getThen(obj) {\n try {\n return obj.then;\n } catch (ex) {\n LAST_ERROR = ex;\n return IS_ERROR;\n }\n}\n\nfunction tryCallOne(fn, a) {\n try {\n return fn(a);\n } catch (ex) {\n LAST_ERROR = ex;\n return IS_ERROR;\n }\n}\nfunction tryCallTwo(fn, a, b) {\n try {\n fn(a, b);\n } catch (ex) {\n LAST_ERROR = ex;\n return IS_ERROR;\n }\n}\n\nmodule.exports = Promise;\n\nfunction Promise(fn) {\n if (typeof this !== 'object') {\n throw new TypeError('Promises must be constructed via new');\n }\n if (typeof fn !== 'function') {\n throw new TypeError('Promise constructor\\'s argument is not a function');\n }\n this._75 = 0;\n this._83 = 0;\n this._18 = null;\n this._38 = null;\n if (fn === noop) return;\n doResolve(fn, this);\n}\nPromise._47 = null;\nPromise._71 = null;\nPromise._44 = noop;\n\nPromise.prototype.then = function(onFulfilled, onRejected) {\n if (this.constructor !== Promise) {\n return safeThen(this, onFulfilled, onRejected);\n }\n var res = new Promise(noop);\n handle(this, new Handler(onFulfilled, onRejected, res));\n return res;\n};\n\nfunction safeThen(self, onFulfilled, onRejected) {\n return new self.constructor(function (resolve, reject) {\n var res = new Promise(noop);\n res.then(resolve, reject);\n handle(self, new Handler(onFulfilled, onRejected, res));\n });\n}\nfunction handle(self, deferred) {\n while (self._83 === 3) {\n self = self._18;\n }\n if (Promise._47) {\n Promise._47(self);\n }\n if (self._83 === 0) {\n if (self._75 === 0) {\n self._75 = 1;\n self._38 = deferred;\n return;\n }\n if (self._75 === 1) {\n self._75 = 2;\n self._38 = [self._38, deferred];\n return;\n }\n self._38.push(deferred);\n return;\n }\n handleResolved(self, deferred);\n}\n\nfunction handleResolved(self, deferred) {\n asap(function() {\n var cb = self._83 === 1 ? deferred.onFulfilled : deferred.onRejected;\n if (cb === null) {\n if (self._83 === 1) {\n resolve(deferred.promise, self._18);\n } else {\n reject(deferred.promise, self._18);\n }\n return;\n }\n var ret = tryCallOne(cb, self._18);\n if (ret === IS_ERROR) {\n reject(deferred.promise, LAST_ERROR);\n } else {\n resolve(deferred.promise, ret);\n }\n });\n}\nfunction resolve(self, newValue) {\n // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\n if (newValue === self) {\n return reject(\n self,\n new TypeError('A promise cannot be resolved with itself.')\n );\n }\n if (\n newValue &&\n (typeof newValue === 'object' || typeof newValue === 'function')\n ) {\n var then = getThen(newValue);\n if (then === IS_ERROR) {\n return reject(self, LAST_ERROR);\n }\n if (\n then === self.then &&\n newValue instanceof Promise\n ) {\n self._83 = 3;\n self._18 = newValue;\n finale(self);\n return;\n } else if (typeof then === 'function') {\n doResolve(then.bind(newValue), self);\n return;\n }\n }\n self._83 = 1;\n self._18 = newValue;\n finale(self);\n}\n\nfunction reject(self, newValue) {\n self._83 = 2;\n self._18 = newValue;\n if (Promise._71) {\n Promise._71(self, newValue);\n }\n finale(self);\n}\nfunction finale(self) {\n if (self._75 === 1) {\n handle(self, self._38);\n self._38 = null;\n }\n if (self._75 === 2) {\n for (var i = 0; i < self._38.length; i++) {\n handle(self, self._38[i]);\n }\n self._38 = null;\n }\n}\n\nfunction Handler(onFulfilled, onRejected, promise){\n this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n this.promise = promise;\n}\n\n/**\n * Take a potentially misbehaving resolver function and make sure\n * onFulfilled and onRejected are only called once.\n *\n * Makes no guarantees about asynchrony.\n */\nfunction doResolve(fn, promise) {\n var done = false;\n var res = tryCallTwo(fn, function (value) {\n if (done) return;\n done = true;\n resolve(promise, value);\n }, function (reason) {\n if (done) return;\n done = true;\n reject(promise, reason);\n });\n if (!done && res === IS_ERROR) {\n done = true;\n reject(promise, LAST_ERROR);\n }\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-scripts/node_modules/promise/lib/core.js\n// module id = ./node_modules/react-scripts/node_modules/promise/lib/core.js\n// module chunks = 0","'use strict';\n\n//This file contains the ES6 extensions to the core Promises/A+ API\n\nvar Promise = require('./core.js');\n\nmodule.exports = Promise;\n\n/* Static Functions */\n\nvar TRUE = valuePromise(true);\nvar FALSE = valuePromise(false);\nvar NULL = valuePromise(null);\nvar UNDEFINED = valuePromise(undefined);\nvar ZERO = valuePromise(0);\nvar EMPTYSTRING = valuePromise('');\n\nfunction valuePromise(value) {\n var p = new Promise(Promise._44);\n p._83 = 1;\n p._18 = value;\n return p;\n}\nPromise.resolve = function (value) {\n if (value instanceof Promise) return value;\n\n if (value === null) return NULL;\n if (value === undefined) return UNDEFINED;\n if (value === true) return TRUE;\n if (value === false) return FALSE;\n if (value === 0) return ZERO;\n if (value === '') return EMPTYSTRING;\n\n if (typeof value === 'object' || typeof value === 'function') {\n try {\n var then = value.then;\n if (typeof then === 'function') {\n return new Promise(then.bind(value));\n }\n } catch (ex) {\n return new Promise(function (resolve, reject) {\n reject(ex);\n });\n }\n }\n return valuePromise(value);\n};\n\nPromise.all = function (arr) {\n var args = Array.prototype.slice.call(arr);\n\n return new Promise(function (resolve, reject) {\n if (args.length === 0) return resolve([]);\n var remaining = args.length;\n function res(i, val) {\n if (val && (typeof val === 'object' || typeof val === 'function')) {\n if (val instanceof Promise && val.then === Promise.prototype.then) {\n while (val._83 === 3) {\n val = val._18;\n }\n if (val._83 === 1) return res(i, val._18);\n if (val._83 === 2) reject(val._18);\n val.then(function (val) {\n res(i, val);\n }, reject);\n return;\n } else {\n var then = val.then;\n if (typeof then === 'function') {\n var p = new Promise(then.bind(val));\n p.then(function (val) {\n res(i, val);\n }, reject);\n return;\n }\n }\n }\n args[i] = val;\n if (--remaining === 0) {\n resolve(args);\n }\n }\n for (var i = 0; i < args.length; i++) {\n res(i, args[i]);\n }\n });\n};\n\nPromise.reject = function (value) {\n return new Promise(function (resolve, reject) {\n reject(value);\n });\n};\n\nPromise.race = function (values) {\n return new Promise(function (resolve, reject) {\n values.forEach(function(value){\n Promise.resolve(value).then(resolve, reject);\n });\n });\n};\n\n/* Prototype Methods */\n\nPromise.prototype['catch'] = function (onRejected) {\n return this.then(null, onRejected);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-scripts/node_modules/promise/lib/es6-extensions.js\n// module id = ./node_modules/react-scripts/node_modules/promise/lib/es6-extensions.js\n// module chunks = 0","'use strict';\n\nvar Promise = require('./core');\n\nvar DEFAULT_WHITELIST = [\n ReferenceError,\n TypeError,\n RangeError\n];\n\nvar enabled = false;\nexports.disable = disable;\nfunction disable() {\n enabled = false;\n Promise._47 = null;\n Promise._71 = null;\n}\n\nexports.enable = enable;\nfunction enable(options) {\n options = options || {};\n if (enabled) disable();\n enabled = true;\n var id = 0;\n var displayId = 0;\n var rejections = {};\n Promise._47 = function (promise) {\n if (\n promise._83 === 2 && // IS REJECTED\n rejections[promise._56]\n ) {\n if (rejections[promise._56].logged) {\n onHandled(promise._56);\n } else {\n clearTimeout(rejections[promise._56].timeout);\n }\n delete rejections[promise._56];\n }\n };\n Promise._71 = function (promise, err) {\n if (promise._75 === 0) { // not yet handled\n promise._56 = id++;\n rejections[promise._56] = {\n displayId: null,\n error: err,\n timeout: setTimeout(\n onUnhandled.bind(null, promise._56),\n // For reference errors and type errors, this almost always\n // means the programmer made a mistake, so log them after just\n // 100ms\n // otherwise, wait 2 seconds to see if they get handled\n matchWhitelist(err, DEFAULT_WHITELIST)\n ? 100\n : 2000\n ),\n logged: false\n };\n }\n };\n function onUnhandled(id) {\n if (\n options.allRejections ||\n matchWhitelist(\n rejections[id].error,\n options.whitelist || DEFAULT_WHITELIST\n )\n ) {\n rejections[id].displayId = displayId++;\n if (options.onUnhandled) {\n rejections[id].logged = true;\n options.onUnhandled(\n rejections[id].displayId,\n rejections[id].error\n );\n } else {\n rejections[id].logged = true;\n logError(\n rejections[id].displayId,\n rejections[id].error\n );\n }\n }\n }\n function onHandled(id) {\n if (rejections[id].logged) {\n if (options.onHandled) {\n options.onHandled(rejections[id].displayId, rejections[id].error);\n } else if (!rejections[id].onUnhandled) {\n console.warn(\n 'Promise Rejection Handled (id: ' + rejections[id].displayId + '):'\n );\n console.warn(\n ' This means you can ignore any previous messages of the form \"Possible Unhandled Promise Rejection\" with id ' +\n rejections[id].displayId + '.'\n );\n }\n }\n }\n}\n\nfunction logError(id, error) {\n console.warn('Possible Unhandled Promise Rejection (id: ' + id + '):');\n var errStr = (error && (error.stack || error)) + '';\n errStr.split('\\n').forEach(function (line) {\n console.warn(' ' + line);\n });\n}\n\nfunction matchWhitelist(error, list) {\n return list.some(function (cls) {\n return error instanceof cls;\n });\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-scripts/node_modules/promise/lib/rejection-tracking.js\n// module id = ./node_modules/react-scripts/node_modules/promise/lib/rejection-tracking.js\n// module chunks = 0","/** @license React v16.2.0\n * react.development.js\n *\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\n\n\nif (process.env.NODE_ENV !== \"production\") {\n (function() {\n'use strict';\n\nvar _assign = require('object-assign');\nvar emptyObject = require('fbjs/lib/emptyObject');\nvar invariant = require('fbjs/lib/invariant');\nvar warning = require('fbjs/lib/warning');\nvar emptyFunction = require('fbjs/lib/emptyFunction');\nvar checkPropTypes = require('prop-types/checkPropTypes');\n\n// TODO: this is special because it gets imported during build.\n\nvar ReactVersion = '16.2.0';\n\n// The Symbol used to tag the ReactElement-like types. If there is no native Symbol\n// nor polyfill, then a plain number is used for performance.\nvar hasSymbol = typeof Symbol === 'function' && Symbol['for'];\n\nvar REACT_ELEMENT_TYPE = hasSymbol ? Symbol['for']('react.element') : 0xeac7;\nvar REACT_CALL_TYPE = hasSymbol ? Symbol['for']('react.call') : 0xeac8;\nvar REACT_RETURN_TYPE = hasSymbol ? Symbol['for']('react.return') : 0xeac9;\nvar REACT_PORTAL_TYPE = hasSymbol ? Symbol['for']('react.portal') : 0xeaca;\nvar REACT_FRAGMENT_TYPE = hasSymbol ? Symbol['for']('react.fragment') : 0xeacb;\n\nvar MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\nvar FAUX_ITERATOR_SYMBOL = '@@iterator';\n\nfunction getIteratorFn(maybeIterable) {\n if (maybeIterable === null || typeof maybeIterable === 'undefined') {\n return null;\n }\n var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];\n if (typeof maybeIterator === 'function') {\n return maybeIterator;\n }\n return null;\n}\n\n/**\n * WARNING: DO NOT manually require this module.\n * This is a replacement for `invariant(...)` used by the error code system\n * and will _only_ be required by the corresponding babel pass.\n * It always throws.\n */\n\n/**\n * Forked from fbjs/warning:\n * https://github.com/facebook/fbjs/blob/e66ba20ad5be433eb54423f2b097d829324d9de6/packages/fbjs/src/__forks__/warning.js\n *\n * Only change is we use console.warn instead of console.error,\n * and do nothing when 'console' is not supported.\n * This really simplifies the code.\n * ---\n * Similar to invariant but only logs a warning if the condition is not met.\n * This can be used to log issues in development environments in critical\n * paths. Removing the logging code for production environments will keep the\n * same logic and follow the same code paths.\n */\n\nvar lowPriorityWarning = function () {};\n\n{\n var printWarning = function (format) {\n for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n var argIndex = 0;\n var message = 'Warning: ' + format.replace(/%s/g, function () {\n return args[argIndex++];\n });\n if (typeof console !== 'undefined') {\n console.warn(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) {}\n };\n\n lowPriorityWarning = function (condition, format) {\n if (format === undefined) {\n throw new Error('`warning(condition, format, ...args)` requires a warning ' + 'message argument');\n }\n if (!condition) {\n for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {\n args[_key2 - 2] = arguments[_key2];\n }\n\n printWarning.apply(undefined, [format].concat(args));\n }\n };\n}\n\nvar lowPriorityWarning$1 = lowPriorityWarning;\n\nvar didWarnStateUpdateForUnmountedComponent = {};\n\nfunction warnNoop(publicInstance, callerName) {\n {\n var constructor = publicInstance.constructor;\n var componentName = constructor && (constructor.displayName || constructor.name) || 'ReactClass';\n var warningKey = componentName + '.' + callerName;\n if (didWarnStateUpdateForUnmountedComponent[warningKey]) {\n return;\n }\n warning(false, '%s(...): Can only update a mounted or mounting component. ' + 'This usually means you called %s() on an unmounted component. ' + 'This is a no-op.\\n\\nPlease check the code for the %s component.', callerName, callerName, componentName);\n didWarnStateUpdateForUnmountedComponent[warningKey] = true;\n }\n}\n\n/**\n * This is the abstract API for an update queue.\n */\nvar ReactNoopUpdateQueue = {\n /**\n * Checks whether or not this composite component is mounted.\n * @param {ReactClass} publicInstance The instance we want to test.\n * @return {boolean} True if mounted, false otherwise.\n * @protected\n * @final\n */\n isMounted: function (publicInstance) {\n return false;\n },\n\n /**\n * Forces an update. This should only be invoked when it is known with\n * certainty that we are **not** in a DOM transaction.\n *\n * You may want to call this when you know that some deeper aspect of the\n * component's state has changed but `setState` was not called.\n *\n * This will not invoke `shouldComponentUpdate`, but it will invoke\n * `componentWillUpdate` and `componentDidUpdate`.\n *\n * @param {ReactClass} publicInstance The instance that should rerender.\n * @param {?function} callback Called after component is updated.\n * @param {?string} callerName name of the calling function in the public API.\n * @internal\n */\n enqueueForceUpdate: function (publicInstance, callback, callerName) {\n warnNoop(publicInstance, 'forceUpdate');\n },\n\n /**\n * Replaces all of the state. Always use this or `setState` to mutate state.\n * You should treat `this.state` as immutable.\n *\n * There is no guarantee that `this.state` will be immediately updated, so\n * accessing `this.state` after calling this method may return the old value.\n *\n * @param {ReactClass} publicInstance The instance that should rerender.\n * @param {object} completeState Next state.\n * @param {?function} callback Called after component is updated.\n * @param {?string} callerName name of the calling function in the public API.\n * @internal\n */\n enqueueReplaceState: function (publicInstance, completeState, callback, callerName) {\n warnNoop(publicInstance, 'replaceState');\n },\n\n /**\n * Sets a subset of the state. This only exists because _pendingState is\n * internal. This provides a merging strategy that is not available to deep\n * properties which is confusing. TODO: Expose pendingState or don't use it\n * during the merge.\n *\n * @param {ReactClass} publicInstance The instance that should rerender.\n * @param {object} partialState Next partial state to be merged with state.\n * @param {?function} callback Called after component is updated.\n * @param {?string} Name of the calling function in the public API.\n * @internal\n */\n enqueueSetState: function (publicInstance, partialState, callback, callerName) {\n warnNoop(publicInstance, 'setState');\n }\n};\n\n/**\n * Base class helpers for the updating state of a component.\n */\nfunction Component(props, context, updater) {\n this.props = props;\n this.context = context;\n this.refs = emptyObject;\n // We initialize the default updater but the real one gets injected by the\n // renderer.\n this.updater = updater || ReactNoopUpdateQueue;\n}\n\nComponent.prototype.isReactComponent = {};\n\n/**\n * Sets a subset of the state. Always use this to mutate\n * state. You should treat `this.state` as immutable.\n *\n * There is no guarantee that `this.state` will be immediately updated, so\n * accessing `this.state` after calling this method may return the old value.\n *\n * There is no guarantee that calls to `setState` will run synchronously,\n * as they may eventually be batched together. You can provide an optional\n * callback that will be executed when the call to setState is actually\n * completed.\n *\n * When a function is provided to setState, it will be called at some point in\n * the future (not synchronously). It will be called with the up to date\n * component arguments (state, props, context). These values can be different\n * from this.* because your function may be called after receiveProps but before\n * shouldComponentUpdate, and this new state, props, and context will not yet be\n * assigned to this.\n *\n * @param {object|function} partialState Next partial state or function to\n * produce next partial state to be merged with current state.\n * @param {?function} callback Called after state is updated.\n * @final\n * @protected\n */\nComponent.prototype.setState = function (partialState, callback) {\n !(typeof partialState === 'object' || typeof partialState === 'function' || partialState == null) ? invariant(false, 'setState(...): takes an object of state variables to update or a function which returns an object of state variables.') : void 0;\n this.updater.enqueueSetState(this, partialState, callback, 'setState');\n};\n\n/**\n * Forces an update. This should only be invoked when it is known with\n * certainty that we are **not** in a DOM transaction.\n *\n * You may want to call this when you know that some deeper aspect of the\n * component's state has changed but `setState` was not called.\n *\n * This will not invoke `shouldComponentUpdate`, but it will invoke\n * `componentWillUpdate` and `componentDidUpdate`.\n *\n * @param {?function} callback Called after update is complete.\n * @final\n * @protected\n */\nComponent.prototype.forceUpdate = function (callback) {\n this.updater.enqueueForceUpdate(this, callback, 'forceUpdate');\n};\n\n/**\n * Deprecated APIs. These APIs used to exist on classic React classes but since\n * we would like to deprecate them, we're not going to move them over to this\n * modern base class. Instead, we define a getter that warns if it's accessed.\n */\n{\n var deprecatedAPIs = {\n isMounted: ['isMounted', 'Instead, make sure to clean up subscriptions and pending requests in ' + 'componentWillUnmount to prevent memory leaks.'],\n replaceState: ['replaceState', 'Refactor your code to use setState instead (see ' + 'https://github.com/facebook/react/issues/3236).']\n };\n var defineDeprecationWarning = function (methodName, info) {\n Object.defineProperty(Component.prototype, methodName, {\n get: function () {\n lowPriorityWarning$1(false, '%s(...) is deprecated in plain JavaScript React classes. %s', info[0], info[1]);\n return undefined;\n }\n });\n };\n for (var fnName in deprecatedAPIs) {\n if (deprecatedAPIs.hasOwnProperty(fnName)) {\n defineDeprecationWarning(fnName, deprecatedAPIs[fnName]);\n }\n }\n}\n\n/**\n * Base class helpers for the updating state of a component.\n */\nfunction PureComponent(props, context, updater) {\n // Duplicated from Component.\n this.props = props;\n this.context = context;\n this.refs = emptyObject;\n // We initialize the default updater but the real one gets injected by the\n // renderer.\n this.updater = updater || ReactNoopUpdateQueue;\n}\n\nfunction ComponentDummy() {}\nComponentDummy.prototype = Component.prototype;\nvar pureComponentPrototype = PureComponent.prototype = new ComponentDummy();\npureComponentPrototype.constructor = PureComponent;\n// Avoid an extra prototype jump for these methods.\n_assign(pureComponentPrototype, Component.prototype);\npureComponentPrototype.isPureReactComponent = true;\n\nfunction AsyncComponent(props, context, updater) {\n // Duplicated from Component.\n this.props = props;\n this.context = context;\n this.refs = emptyObject;\n // We initialize the default updater but the real one gets injected by the\n // renderer.\n this.updater = updater || ReactNoopUpdateQueue;\n}\n\nvar asyncComponentPrototype = AsyncComponent.prototype = new ComponentDummy();\nasyncComponentPrototype.constructor = AsyncComponent;\n// Avoid an extra prototype jump for these methods.\n_assign(asyncComponentPrototype, Component.prototype);\nasyncComponentPrototype.unstable_isAsyncReactComponent = true;\nasyncComponentPrototype.render = function () {\n return this.props.children;\n};\n\n/**\n * Keeps track of the current owner.\n *\n * The current owner is the component who should own any components that are\n * currently being constructed.\n */\nvar ReactCurrentOwner = {\n /**\n * @internal\n * @type {ReactComponent}\n */\n current: null\n};\n\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n\nvar RESERVED_PROPS = {\n key: true,\n ref: true,\n __self: true,\n __source: true\n};\n\nvar specialPropKeyWarningShown;\nvar specialPropRefWarningShown;\n\nfunction hasValidRef(config) {\n {\n if (hasOwnProperty.call(config, 'ref')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'ref').get;\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n return config.ref !== undefined;\n}\n\nfunction hasValidKey(config) {\n {\n if (hasOwnProperty.call(config, 'key')) {\n var getter = Object.getOwnPropertyDescriptor(config, 'key').get;\n if (getter && getter.isReactWarning) {\n return false;\n }\n }\n }\n return config.key !== undefined;\n}\n\nfunction defineKeyPropWarningGetter(props, displayName) {\n var warnAboutAccessingKey = function () {\n if (!specialPropKeyWarningShown) {\n specialPropKeyWarningShown = true;\n warning(false, '%s: `key` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://fb.me/react-special-props)', displayName);\n }\n };\n warnAboutAccessingKey.isReactWarning = true;\n Object.defineProperty(props, 'key', {\n get: warnAboutAccessingKey,\n configurable: true\n });\n}\n\nfunction defineRefPropWarningGetter(props, displayName) {\n var warnAboutAccessingRef = function () {\n if (!specialPropRefWarningShown) {\n specialPropRefWarningShown = true;\n warning(false, '%s: `ref` is not a prop. Trying to access it will result ' + 'in `undefined` being returned. If you need to access the same ' + 'value within the child component, you should pass it as a different ' + 'prop. (https://fb.me/react-special-props)', displayName);\n }\n };\n warnAboutAccessingRef.isReactWarning = true;\n Object.defineProperty(props, 'ref', {\n get: warnAboutAccessingRef,\n configurable: true\n });\n}\n\n/**\n * Factory method to create a new React element. This no longer adheres to\n * the class pattern, so do not use new to call it. Also, no instanceof check\n * will work. Instead test $$typeof field against Symbol.for('react.element') to check\n * if something is a React Element.\n *\n * @param {*} type\n * @param {*} key\n * @param {string|object} ref\n * @param {*} self A *temporary* helper to detect places where `this` is\n * different from the `owner` when React.createElement is called, so that we\n * can warn. We want to get rid of owner and replace string `ref`s with arrow\n * functions, and as long as `this` and owner are the same, there will be no\n * change in behavior.\n * @param {*} source An annotation object (added by a transpiler or otherwise)\n * indicating filename, line number, and/or other information.\n * @param {*} owner\n * @param {*} props\n * @internal\n */\nvar ReactElement = function (type, key, ref, self, source, owner, props) {\n var element = {\n // This tag allow us to uniquely identify this as a React Element\n $$typeof: REACT_ELEMENT_TYPE,\n\n // Built-in properties that belong on the element\n type: type,\n key: key,\n ref: ref,\n props: props,\n\n // Record the component responsible for creating this element.\n _owner: owner\n };\n\n {\n // The validation flag is currently mutative. We put it on\n // an external backing store so that we can freeze the whole object.\n // This can be replaced with a WeakMap once they are implemented in\n // commonly used development environments.\n element._store = {};\n\n // To make comparing ReactElements easier for testing purposes, we make\n // the validation flag non-enumerable (where possible, which should\n // include every environment we run tests in), so the test framework\n // ignores it.\n Object.defineProperty(element._store, 'validated', {\n configurable: false,\n enumerable: false,\n writable: true,\n value: false\n });\n // self and source are DEV only properties.\n Object.defineProperty(element, '_self', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: self\n });\n // Two elements created in two different places should be considered\n // equal for testing purposes and therefore we hide it from enumeration.\n Object.defineProperty(element, '_source', {\n configurable: false,\n enumerable: false,\n writable: false,\n value: source\n });\n if (Object.freeze) {\n Object.freeze(element.props);\n Object.freeze(element);\n }\n }\n\n return element;\n};\n\n/**\n * Create and return a new ReactElement of the given type.\n * See https://reactjs.org/docs/react-api.html#createelement\n */\nfunction createElement(type, config, children) {\n var propName;\n\n // Reserved names are extracted\n var props = {};\n\n var key = null;\n var ref = null;\n var self = null;\n var source = null;\n\n if (config != null) {\n if (hasValidRef(config)) {\n ref = config.ref;\n }\n if (hasValidKey(config)) {\n key = '' + config.key;\n }\n\n self = config.__self === undefined ? null : config.__self;\n source = config.__source === undefined ? null : config.__source;\n // Remaining properties are added to a new props object\n for (propName in config) {\n if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {\n props[propName] = config[propName];\n }\n }\n }\n\n // Children can be more than one argument, and those are transferred onto\n // the newly allocated props object.\n var childrenLength = arguments.length - 2;\n if (childrenLength === 1) {\n props.children = children;\n } else if (childrenLength > 1) {\n var childArray = Array(childrenLength);\n for (var i = 0; i < childrenLength; i++) {\n childArray[i] = arguments[i + 2];\n }\n {\n if (Object.freeze) {\n Object.freeze(childArray);\n }\n }\n props.children = childArray;\n }\n\n // Resolve default props\n if (type && type.defaultProps) {\n var defaultProps = type.defaultProps;\n for (propName in defaultProps) {\n if (props[propName] === undefined) {\n props[propName] = defaultProps[propName];\n }\n }\n }\n {\n if (key || ref) {\n if (typeof props.$$typeof === 'undefined' || props.$$typeof !== REACT_ELEMENT_TYPE) {\n var displayName = typeof type === 'function' ? type.displayName || type.name || 'Unknown' : type;\n if (key) {\n defineKeyPropWarningGetter(props, displayName);\n }\n if (ref) {\n defineRefPropWarningGetter(props, displayName);\n }\n }\n }\n }\n return ReactElement(type, key, ref, self, source, ReactCurrentOwner.current, props);\n}\n\n/**\n * Return a function that produces ReactElements of a given type.\n * See https://reactjs.org/docs/react-api.html#createfactory\n */\n\n\nfunction cloneAndReplaceKey(oldElement, newKey) {\n var newElement = ReactElement(oldElement.type, newKey, oldElement.ref, oldElement._self, oldElement._source, oldElement._owner, oldElement.props);\n\n return newElement;\n}\n\n/**\n * Clone and return a new ReactElement using element as the starting point.\n * See https://reactjs.org/docs/react-api.html#cloneelement\n */\nfunction cloneElement(element, config, children) {\n var propName;\n\n // Original props are copied\n var props = _assign({}, element.props);\n\n // Reserved names are extracted\n var key = element.key;\n var ref = element.ref;\n // Self is preserved since the owner is preserved.\n var self = element._self;\n // Source is preserved since cloneElement is unlikely to be targeted by a\n // transpiler, and the original source is probably a better indicator of the\n // true owner.\n var source = element._source;\n\n // Owner will be preserved, unless ref is overridden\n var owner = element._owner;\n\n if (config != null) {\n if (hasValidRef(config)) {\n // Silently steal the ref from the parent.\n ref = config.ref;\n owner = ReactCurrentOwner.current;\n }\n if (hasValidKey(config)) {\n key = '' + config.key;\n }\n\n // Remaining properties override existing props\n var defaultProps;\n if (element.type && element.type.defaultProps) {\n defaultProps = element.type.defaultProps;\n }\n for (propName in config) {\n if (hasOwnProperty.call(config, propName) && !RESERVED_PROPS.hasOwnProperty(propName)) {\n if (config[propName] === undefined && defaultProps !== undefined) {\n // Resolve default props\n props[propName] = defaultProps[propName];\n } else {\n props[propName] = config[propName];\n }\n }\n }\n }\n\n // Children can be more than one argument, and those are transferred onto\n // the newly allocated props object.\n var childrenLength = arguments.length - 2;\n if (childrenLength === 1) {\n props.children = children;\n } else if (childrenLength > 1) {\n var childArray = Array(childrenLength);\n for (var i = 0; i < childrenLength; i++) {\n childArray[i] = arguments[i + 2];\n }\n props.children = childArray;\n }\n\n return ReactElement(element.type, key, ref, self, source, owner, props);\n}\n\n/**\n * Verifies the object is a ReactElement.\n * See https://reactjs.org/docs/react-api.html#isvalidelement\n * @param {?object} object\n * @return {boolean} True if `object` is a valid component.\n * @final\n */\nfunction isValidElement(object) {\n return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n}\n\nvar ReactDebugCurrentFrame = {};\n\n{\n // Component that is being worked on\n ReactDebugCurrentFrame.getCurrentStack = null;\n\n ReactDebugCurrentFrame.getStackAddendum = function () {\n var impl = ReactDebugCurrentFrame.getCurrentStack;\n if (impl) {\n return impl();\n }\n return null;\n };\n}\n\nvar SEPARATOR = '.';\nvar SUBSEPARATOR = ':';\n\n/**\n * Escape and wrap key so it is safe to use as a reactid\n *\n * @param {string} key to be escaped.\n * @return {string} the escaped key.\n */\nfunction escape(key) {\n var escapeRegex = /[=:]/g;\n var escaperLookup = {\n '=': '=0',\n ':': '=2'\n };\n var escapedString = ('' + key).replace(escapeRegex, function (match) {\n return escaperLookup[match];\n });\n\n return '$' + escapedString;\n}\n\n/**\n * TODO: Test that a single child and an array with one item have the same key\n * pattern.\n */\n\nvar didWarnAboutMaps = false;\n\nvar userProvidedKeyEscapeRegex = /\\/+/g;\nfunction escapeUserProvidedKey(text) {\n return ('' + text).replace(userProvidedKeyEscapeRegex, '$&/');\n}\n\nvar POOL_SIZE = 10;\nvar traverseContextPool = [];\nfunction getPooledTraverseContext(mapResult, keyPrefix, mapFunction, mapContext) {\n if (traverseContextPool.length) {\n var traverseContext = traverseContextPool.pop();\n traverseContext.result = mapResult;\n traverseContext.keyPrefix = keyPrefix;\n traverseContext.func = mapFunction;\n traverseContext.context = mapContext;\n traverseContext.count = 0;\n return traverseContext;\n } else {\n return {\n result: mapResult,\n keyPrefix: keyPrefix,\n func: mapFunction,\n context: mapContext,\n count: 0\n };\n }\n}\n\nfunction releaseTraverseContext(traverseContext) {\n traverseContext.result = null;\n traverseContext.keyPrefix = null;\n traverseContext.func = null;\n traverseContext.context = null;\n traverseContext.count = 0;\n if (traverseContextPool.length < POOL_SIZE) {\n traverseContextPool.push(traverseContext);\n }\n}\n\n/**\n * @param {?*} children Children tree container.\n * @param {!string} nameSoFar Name of the key path so far.\n * @param {!function} callback Callback to invoke with each child found.\n * @param {?*} traverseContext Used to pass information throughout the traversal\n * process.\n * @return {!number} The number of children in this subtree.\n */\nfunction traverseAllChildrenImpl(children, nameSoFar, callback, traverseContext) {\n var type = typeof children;\n\n if (type === 'undefined' || type === 'boolean') {\n // All of the above are perceived as null.\n children = null;\n }\n\n var invokeCallback = false;\n\n if (children === null) {\n invokeCallback = true;\n } else {\n switch (type) {\n case 'string':\n case 'number':\n invokeCallback = true;\n break;\n case 'object':\n switch (children.$$typeof) {\n case REACT_ELEMENT_TYPE:\n case REACT_CALL_TYPE:\n case REACT_RETURN_TYPE:\n case REACT_PORTAL_TYPE:\n invokeCallback = true;\n }\n }\n }\n\n if (invokeCallback) {\n callback(traverseContext, children,\n // If it's the only child, treat the name as if it was wrapped in an array\n // so that it's consistent if the number of children grows.\n nameSoFar === '' ? SEPARATOR + getComponentKey(children, 0) : nameSoFar);\n return 1;\n }\n\n var child;\n var nextName;\n var subtreeCount = 0; // Count of children found in the current subtree.\n var nextNamePrefix = nameSoFar === '' ? SEPARATOR : nameSoFar + SUBSEPARATOR;\n\n if (Array.isArray(children)) {\n for (var i = 0; i < children.length; i++) {\n child = children[i];\n nextName = nextNamePrefix + getComponentKey(child, i);\n subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);\n }\n } else {\n var iteratorFn = getIteratorFn(children);\n if (typeof iteratorFn === 'function') {\n {\n // Warn about using Maps as children\n if (iteratorFn === children.entries) {\n warning(didWarnAboutMaps, 'Using Maps as children is unsupported and will likely yield ' + 'unexpected results. Convert it to a sequence/iterable of keyed ' + 'ReactElements instead.%s', ReactDebugCurrentFrame.getStackAddendum());\n didWarnAboutMaps = true;\n }\n }\n\n var iterator = iteratorFn.call(children);\n var step;\n var ii = 0;\n while (!(step = iterator.next()).done) {\n child = step.value;\n nextName = nextNamePrefix + getComponentKey(child, ii++);\n subtreeCount += traverseAllChildrenImpl(child, nextName, callback, traverseContext);\n }\n } else if (type === 'object') {\n var addendum = '';\n {\n addendum = ' If you meant to render a collection of children, use an array ' + 'instead.' + ReactDebugCurrentFrame.getStackAddendum();\n }\n var childrenString = '' + children;\n invariant(false, 'Objects are not valid as a React child (found: %s).%s', childrenString === '[object Object]' ? 'object with keys {' + Object.keys(children).join(', ') + '}' : childrenString, addendum);\n }\n }\n\n return subtreeCount;\n}\n\n/**\n * Traverses children that are typically specified as `props.children`, but\n * might also be specified through attributes:\n *\n * - `traverseAllChildren(this.props.children, ...)`\n * - `traverseAllChildren(this.props.leftPanelChildren, ...)`\n *\n * The `traverseContext` is an optional argument that is passed through the\n * entire traversal. It can be used to store accumulations or anything else that\n * the callback might find relevant.\n *\n * @param {?*} children Children tree object.\n * @param {!function} callback To invoke upon traversing each child.\n * @param {?*} traverseContext Context for traversal.\n * @return {!number} The number of children in this subtree.\n */\nfunction traverseAllChildren(children, callback, traverseContext) {\n if (children == null) {\n return 0;\n }\n\n return traverseAllChildrenImpl(children, '', callback, traverseContext);\n}\n\n/**\n * Generate a key string that identifies a component within a set.\n *\n * @param {*} component A component that could contain a manual key.\n * @param {number} index Index that is used if a manual key is not provided.\n * @return {string}\n */\nfunction getComponentKey(component, index) {\n // Do some typechecking here since we call this blindly. We want to ensure\n // that we don't block potential future ES APIs.\n if (typeof component === 'object' && component !== null && component.key != null) {\n // Explicit key\n return escape(component.key);\n }\n // Implicit key determined by the index in the set\n return index.toString(36);\n}\n\nfunction forEachSingleChild(bookKeeping, child, name) {\n var func = bookKeeping.func,\n context = bookKeeping.context;\n\n func.call(context, child, bookKeeping.count++);\n}\n\n/**\n * Iterates through children that are typically specified as `props.children`.\n *\n * See https://reactjs.org/docs/react-api.html#react.children.foreach\n *\n * The provided forEachFunc(child, index) will be called for each\n * leaf child.\n *\n * @param {?*} children Children tree container.\n * @param {function(*, int)} forEachFunc\n * @param {*} forEachContext Context for forEachContext.\n */\nfunction forEachChildren(children, forEachFunc, forEachContext) {\n if (children == null) {\n return children;\n }\n var traverseContext = getPooledTraverseContext(null, null, forEachFunc, forEachContext);\n traverseAllChildren(children, forEachSingleChild, traverseContext);\n releaseTraverseContext(traverseContext);\n}\n\nfunction mapSingleChildIntoContext(bookKeeping, child, childKey) {\n var result = bookKeeping.result,\n keyPrefix = bookKeeping.keyPrefix,\n func = bookKeeping.func,\n context = bookKeeping.context;\n\n\n var mappedChild = func.call(context, child, bookKeeping.count++);\n if (Array.isArray(mappedChild)) {\n mapIntoWithKeyPrefixInternal(mappedChild, result, childKey, emptyFunction.thatReturnsArgument);\n } else if (mappedChild != null) {\n if (isValidElement(mappedChild)) {\n mappedChild = cloneAndReplaceKey(mappedChild,\n // Keep both the (mapped) and old keys if they differ, just as\n // traverseAllChildren used to do for objects as children\n keyPrefix + (mappedChild.key && (!child || child.key !== mappedChild.key) ? escapeUserProvidedKey(mappedChild.key) + '/' : '') + childKey);\n }\n result.push(mappedChild);\n }\n}\n\nfunction mapIntoWithKeyPrefixInternal(children, array, prefix, func, context) {\n var escapedPrefix = '';\n if (prefix != null) {\n escapedPrefix = escapeUserProvidedKey(prefix) + '/';\n }\n var traverseContext = getPooledTraverseContext(array, escapedPrefix, func, context);\n traverseAllChildren(children, mapSingleChildIntoContext, traverseContext);\n releaseTraverseContext(traverseContext);\n}\n\n/**\n * Maps children that are typically specified as `props.children`.\n *\n * See https://reactjs.org/docs/react-api.html#react.children.map\n *\n * The provided mapFunction(child, key, index) will be called for each\n * leaf child.\n *\n * @param {?*} children Children tree container.\n * @param {function(*, int)} func The map function.\n * @param {*} context Context for mapFunction.\n * @return {object} Object containing the ordered map of results.\n */\nfunction mapChildren(children, func, context) {\n if (children == null) {\n return children;\n }\n var result = [];\n mapIntoWithKeyPrefixInternal(children, result, null, func, context);\n return result;\n}\n\n/**\n * Count the number of children that are typically specified as\n * `props.children`.\n *\n * See https://reactjs.org/docs/react-api.html#react.children.count\n *\n * @param {?*} children Children tree container.\n * @return {number} The number of children.\n */\nfunction countChildren(children, context) {\n return traverseAllChildren(children, emptyFunction.thatReturnsNull, null);\n}\n\n/**\n * Flatten a children object (typically specified as `props.children`) and\n * return an array with appropriately re-keyed children.\n *\n * See https://reactjs.org/docs/react-api.html#react.children.toarray\n */\nfunction toArray(children) {\n var result = [];\n mapIntoWithKeyPrefixInternal(children, result, null, emptyFunction.thatReturnsArgument);\n return result;\n}\n\n/**\n * Returns the first child in a collection of children and verifies that there\n * is only one child in the collection.\n *\n * See https://reactjs.org/docs/react-api.html#react.children.only\n *\n * The current implementation of this function assumes that a single child gets\n * passed without a wrapper, but the purpose of this helper function is to\n * abstract away the particular structure of children.\n *\n * @param {?object} children Child collection structure.\n * @return {ReactElement} The first and only `ReactElement` contained in the\n * structure.\n */\nfunction onlyChild(children) {\n !isValidElement(children) ? invariant(false, 'React.Children.only expected to receive a single React element child.') : void 0;\n return children;\n}\n\nvar describeComponentFrame = function (name, source, ownerName) {\n return '\\n in ' + (name || 'Unknown') + (source ? ' (at ' + source.fileName.replace(/^.*[\\\\\\/]/, '') + ':' + source.lineNumber + ')' : ownerName ? ' (created by ' + ownerName + ')' : '');\n};\n\nfunction getComponentName(fiber) {\n var type = fiber.type;\n\n if (typeof type === 'string') {\n return type;\n }\n if (typeof type === 'function') {\n return type.displayName || type.name;\n }\n return null;\n}\n\n/**\n * ReactElementValidator provides a wrapper around a element factory\n * which validates the props passed to the element. This is intended to be\n * used only in DEV and could be replaced by a static type checker for languages\n * that support it.\n */\n\n{\n var currentlyValidatingElement = null;\n\n var propTypesMisspellWarningShown = false;\n\n var getDisplayName = function (element) {\n if (element == null) {\n return '#empty';\n } else if (typeof element === 'string' || typeof element === 'number') {\n return '#text';\n } else if (typeof element.type === 'string') {\n return element.type;\n } else if (element.type === REACT_FRAGMENT_TYPE) {\n return 'React.Fragment';\n } else {\n return element.type.displayName || element.type.name || 'Unknown';\n }\n };\n\n var getStackAddendum = function () {\n var stack = '';\n if (currentlyValidatingElement) {\n var name = getDisplayName(currentlyValidatingElement);\n var owner = currentlyValidatingElement._owner;\n stack += describeComponentFrame(name, currentlyValidatingElement._source, owner && getComponentName(owner));\n }\n stack += ReactDebugCurrentFrame.getStackAddendum() || '';\n return stack;\n };\n\n var VALID_FRAGMENT_PROPS = new Map([['children', true], ['key', true]]);\n}\n\nfunction getDeclarationErrorAddendum() {\n if (ReactCurrentOwner.current) {\n var name = getComponentName(ReactCurrentOwner.current);\n if (name) {\n return '\\n\\nCheck the render method of `' + name + '`.';\n }\n }\n return '';\n}\n\nfunction getSourceInfoErrorAddendum(elementProps) {\n if (elementProps !== null && elementProps !== undefined && elementProps.__source !== undefined) {\n var source = elementProps.__source;\n var fileName = source.fileName.replace(/^.*[\\\\\\/]/, '');\n var lineNumber = source.lineNumber;\n return '\\n\\nCheck your code at ' + fileName + ':' + lineNumber + '.';\n }\n return '';\n}\n\n/**\n * Warn if there's no key explicitly set on dynamic arrays of children or\n * object keys are not valid. This allows us to keep track of children between\n * updates.\n */\nvar ownerHasKeyUseWarning = {};\n\nfunction getCurrentComponentErrorInfo(parentType) {\n var info = getDeclarationErrorAddendum();\n\n if (!info) {\n var parentName = typeof parentType === 'string' ? parentType : parentType.displayName || parentType.name;\n if (parentName) {\n info = '\\n\\nCheck the top-level render call using <' + parentName + '>.';\n }\n }\n return info;\n}\n\n/**\n * Warn if the element doesn't have an explicit key assigned to it.\n * This element is in an array. The array could grow and shrink or be\n * reordered. All children that haven't already been validated are required to\n * have a \"key\" property assigned to it. Error statuses are cached so a warning\n * will only be shown once.\n *\n * @internal\n * @param {ReactElement} element Element that requires a key.\n * @param {*} parentType element's parent's type.\n */\nfunction validateExplicitKey(element, parentType) {\n if (!element._store || element._store.validated || element.key != null) {\n return;\n }\n element._store.validated = true;\n\n var currentComponentErrorInfo = getCurrentComponentErrorInfo(parentType);\n if (ownerHasKeyUseWarning[currentComponentErrorInfo]) {\n return;\n }\n ownerHasKeyUseWarning[currentComponentErrorInfo] = true;\n\n // Usually the current owner is the offender, but if it accepts children as a\n // property, it may be the creator of the child that's responsible for\n // assigning it a key.\n var childOwner = '';\n if (element && element._owner && element._owner !== ReactCurrentOwner.current) {\n // Give the component that originally created this child.\n childOwner = ' It was passed a child from ' + getComponentName(element._owner) + '.';\n }\n\n currentlyValidatingElement = element;\n {\n warning(false, 'Each child in an array or iterator should have a unique \"key\" prop.' + '%s%s See https://fb.me/react-warning-keys for more information.%s', currentComponentErrorInfo, childOwner, getStackAddendum());\n }\n currentlyValidatingElement = null;\n}\n\n/**\n * Ensure that every element either is passed in a static location, in an\n * array with an explicit keys property defined, or in an object literal\n * with valid key property.\n *\n * @internal\n * @param {ReactNode} node Statically passed child of any type.\n * @param {*} parentType node's parent's type.\n */\nfunction validateChildKeys(node, parentType) {\n if (typeof node !== 'object') {\n return;\n }\n if (Array.isArray(node)) {\n for (var i = 0; i < node.length; i++) {\n var child = node[i];\n if (isValidElement(child)) {\n validateExplicitKey(child, parentType);\n }\n }\n } else if (isValidElement(node)) {\n // This element was passed in a valid location.\n if (node._store) {\n node._store.validated = true;\n }\n } else if (node) {\n var iteratorFn = getIteratorFn(node);\n if (typeof iteratorFn === 'function') {\n // Entry iterators used to provide implicit keys,\n // but now we print a separate warning for them later.\n if (iteratorFn !== node.entries) {\n var iterator = iteratorFn.call(node);\n var step;\n while (!(step = iterator.next()).done) {\n if (isValidElement(step.value)) {\n validateExplicitKey(step.value, parentType);\n }\n }\n }\n }\n }\n}\n\n/**\n * Given an element, validate that its props follow the propTypes definition,\n * provided by the type.\n *\n * @param {ReactElement} element\n */\nfunction validatePropTypes(element) {\n var componentClass = element.type;\n if (typeof componentClass !== 'function') {\n return;\n }\n var name = componentClass.displayName || componentClass.name;\n var propTypes = componentClass.propTypes;\n if (propTypes) {\n currentlyValidatingElement = element;\n checkPropTypes(propTypes, element.props, 'prop', name, getStackAddendum);\n currentlyValidatingElement = null;\n } else if (componentClass.PropTypes !== undefined && !propTypesMisspellWarningShown) {\n propTypesMisspellWarningShown = true;\n warning(false, 'Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', name || 'Unknown');\n }\n if (typeof componentClass.getDefaultProps === 'function') {\n warning(componentClass.getDefaultProps.isReactClassApproved, 'getDefaultProps is only used on classic React.createClass ' + 'definitions. Use a static property named `defaultProps` instead.');\n }\n}\n\n/**\n * Given a fragment, validate that it can only be provided with fragment props\n * @param {ReactElement} fragment\n */\nfunction validateFragmentProps(fragment) {\n currentlyValidatingElement = fragment;\n\n var _iteratorNormalCompletion = true;\n var _didIteratorError = false;\n var _iteratorError = undefined;\n\n try {\n for (var _iterator = Object.keys(fragment.props)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n var key = _step.value;\n\n if (!VALID_FRAGMENT_PROPS.has(key)) {\n warning(false, 'Invalid prop `%s` supplied to `React.Fragment`. ' + 'React.Fragment can only have `key` and `children` props.%s', key, getStackAddendum());\n break;\n }\n }\n } catch (err) {\n _didIteratorError = true;\n _iteratorError = err;\n } finally {\n try {\n if (!_iteratorNormalCompletion && _iterator['return']) {\n _iterator['return']();\n }\n } finally {\n if (_didIteratorError) {\n throw _iteratorError;\n }\n }\n }\n\n if (fragment.ref !== null) {\n warning(false, 'Invalid attribute `ref` supplied to `React.Fragment`.%s', getStackAddendum());\n }\n\n currentlyValidatingElement = null;\n}\n\nfunction createElementWithValidation(type, props, children) {\n var validType = typeof type === 'string' || typeof type === 'function' || typeof type === 'symbol' || typeof type === 'number';\n // We warn in this case but don't throw. We expect the element creation to\n // succeed and there will likely be errors in render.\n if (!validType) {\n var info = '';\n if (type === undefined || typeof type === 'object' && type !== null && Object.keys(type).length === 0) {\n info += ' You likely forgot to export your component from the file ' + \"it's defined in, or you might have mixed up default and named imports.\";\n }\n\n var sourceInfo = getSourceInfoErrorAddendum(props);\n if (sourceInfo) {\n info += sourceInfo;\n } else {\n info += getDeclarationErrorAddendum();\n }\n\n info += getStackAddendum() || '';\n\n warning(false, 'React.createElement: type is invalid -- expected a string (for ' + 'built-in components) or a class/function (for composite ' + 'components) but got: %s.%s', type == null ? type : typeof type, info);\n }\n\n var element = createElement.apply(this, arguments);\n\n // The result can be nullish if a mock or a custom function is used.\n // TODO: Drop this when these are no longer allowed as the type argument.\n if (element == null) {\n return element;\n }\n\n // Skip key warning if the type isn't valid since our key validation logic\n // doesn't expect a non-string/function type and can throw confusing errors.\n // We don't want exception behavior to differ between dev and prod.\n // (Rendering will throw with a helpful message and as soon as the type is\n // fixed, the key warnings will appear.)\n if (validType) {\n for (var i = 2; i < arguments.length; i++) {\n validateChildKeys(arguments[i], type);\n }\n }\n\n if (typeof type === 'symbol' && type === REACT_FRAGMENT_TYPE) {\n validateFragmentProps(element);\n } else {\n validatePropTypes(element);\n }\n\n return element;\n}\n\nfunction createFactoryWithValidation(type) {\n var validatedFactory = createElementWithValidation.bind(null, type);\n // Legacy hook TODO: Warn if this is accessed\n validatedFactory.type = type;\n\n {\n Object.defineProperty(validatedFactory, 'type', {\n enumerable: false,\n get: function () {\n lowPriorityWarning$1(false, 'Factory.type is deprecated. Access the class directly ' + 'before passing it to createFactory.');\n Object.defineProperty(this, 'type', {\n value: type\n });\n return type;\n }\n });\n }\n\n return validatedFactory;\n}\n\nfunction cloneElementWithValidation(element, props, children) {\n var newElement = cloneElement.apply(this, arguments);\n for (var i = 2; i < arguments.length; i++) {\n validateChildKeys(arguments[i], newElement.type);\n }\n validatePropTypes(newElement);\n return newElement;\n}\n\nvar React = {\n Children: {\n map: mapChildren,\n forEach: forEachChildren,\n count: countChildren,\n toArray: toArray,\n only: onlyChild\n },\n\n Component: Component,\n PureComponent: PureComponent,\n unstable_AsyncComponent: AsyncComponent,\n\n Fragment: REACT_FRAGMENT_TYPE,\n\n createElement: createElementWithValidation,\n cloneElement: cloneElementWithValidation,\n createFactory: createFactoryWithValidation,\n isValidElement: isValidElement,\n\n version: ReactVersion,\n\n __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: {\n ReactCurrentOwner: ReactCurrentOwner,\n // Used by renderers to avoid bundling object-assign twice in UMD bundles:\n assign: _assign\n }\n};\n\n{\n _assign(React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED, {\n // These should not be included in production.\n ReactDebugCurrentFrame: ReactDebugCurrentFrame,\n // Shim for React DOM 16.0.0 which still destructured (but not used) this.\n // TODO: remove in React 17.0.\n ReactComponentTreeHook: {}\n });\n}\n\n\n\nvar React$2 = Object.freeze({\n\tdefault: React\n});\n\nvar React$3 = ( React$2 && React ) || React$2;\n\n// TODO: decide on the top-level export form.\n// This is hacky but makes it work with both Rollup and Jest.\nvar react = React$3['default'] ? React$3['default'] : React$3;\n\nmodule.exports = react;\n })();\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react/cjs/react.development.js\n// module id = ./node_modules/react/cjs/react.development.js\n// module chunks = 0","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react.production.min.js');\n} else {\n module.exports = require('./cjs/react.development.js');\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react/index.js\n// module id = ./node_modules/react/index.js\n// module chunks = 0","'use strict';\n\n/**\n * Check if we're required to add a port number.\n *\n * @see https://url.spec.whatwg.org/#default-port\n * @param {Number|String} port Port number we need to check\n * @param {String} protocol Protocol we need to check against.\n * @returns {Boolean} Is it a default port for the given protocol\n * @api private\n */\nmodule.exports = function required(port, protocol) {\n protocol = protocol.split(':')[0];\n port = +port;\n\n if (!port) return false;\n\n switch (protocol) {\n case 'http':\n case 'ws':\n return port !== 80;\n\n case 'https':\n case 'wss':\n return port !== 443;\n\n case 'ftp':\n return port !== 21;\n\n case 'gopher':\n return port !== 70;\n\n case 'file':\n return false;\n }\n\n return port !== 0;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/requires-port/index.js\n// module id = ./node_modules/requires-port/index.js\n// module chunks = 0","'use strict';\n\nvar transportList = require('./transport-list');\n\nmodule.exports = require('./main')(transportList);\n\n// TODO can't get rid of this until all servers do\nif ('_sockjs_onload' in global) {\n setTimeout(global._sockjs_onload, 1);\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/entry.js\n// module id = ./node_modules/sockjs-client/lib/entry.js\n// module chunks = 0","'use strict';\n\nvar inherits = require('inherits')\n , Event = require('./event')\n ;\n\nfunction CloseEvent() {\n Event.call(this);\n this.initEvent('close', false, false);\n this.wasClean = false;\n this.code = 0;\n this.reason = '';\n}\n\ninherits(CloseEvent, Event);\n\nmodule.exports = CloseEvent;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/event/close.js\n// module id = ./node_modules/sockjs-client/lib/event/close.js\n// module chunks = 0","'use strict';\n\nvar inherits = require('inherits')\n , EventTarget = require('./eventtarget')\n ;\n\nfunction EventEmitter() {\n EventTarget.call(this);\n}\n\ninherits(EventEmitter, EventTarget);\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n if (type) {\n delete this._listeners[type];\n } else {\n this._listeners = {};\n }\n};\n\nEventEmitter.prototype.once = function(type, listener) {\n var self = this\n , fired = false;\n\n function g() {\n self.removeListener(type, g);\n\n if (!fired) {\n fired = true;\n listener.apply(this, arguments);\n }\n }\n\n this.on(type, g);\n};\n\nEventEmitter.prototype.emit = function() {\n var type = arguments[0];\n var listeners = this._listeners[type];\n if (!listeners) {\n return;\n }\n // equivalent of Array.prototype.slice.call(arguments, 1);\n var l = arguments.length;\n var args = new Array(l - 1);\n for (var ai = 1; ai < l; ai++) {\n args[ai - 1] = arguments[ai];\n }\n for (var i = 0; i < listeners.length; i++) {\n listeners[i].apply(this, args);\n }\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener = EventTarget.prototype.addEventListener;\nEventEmitter.prototype.removeListener = EventTarget.prototype.removeEventListener;\n\nmodule.exports.EventEmitter = EventEmitter;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/event/emitter.js\n// module id = ./node_modules/sockjs-client/lib/event/emitter.js\n// module chunks = 0","'use strict';\n\nfunction Event(eventType) {\n this.type = eventType;\n}\n\nEvent.prototype.initEvent = function(eventType, canBubble, cancelable) {\n this.type = eventType;\n this.bubbles = canBubble;\n this.cancelable = cancelable;\n this.timeStamp = +new Date();\n return this;\n};\n\nEvent.prototype.stopPropagation = function() {};\nEvent.prototype.preventDefault = function() {};\n\nEvent.CAPTURING_PHASE = 1;\nEvent.AT_TARGET = 2;\nEvent.BUBBLING_PHASE = 3;\n\nmodule.exports = Event;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/event/event.js\n// module id = ./node_modules/sockjs-client/lib/event/event.js\n// module chunks = 0","'use strict';\n\n/* Simplified implementation of DOM2 EventTarget.\n * http://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-EventTarget\n */\n\nfunction EventTarget() {\n this._listeners = {};\n}\n\nEventTarget.prototype.addEventListener = function(eventType, listener) {\n if (!(eventType in this._listeners)) {\n this._listeners[eventType] = [];\n }\n var arr = this._listeners[eventType];\n // #4\n if (arr.indexOf(listener) === -1) {\n // Make a copy so as not to interfere with a current dispatchEvent.\n arr = arr.concat([listener]);\n }\n this._listeners[eventType] = arr;\n};\n\nEventTarget.prototype.removeEventListener = function(eventType, listener) {\n var arr = this._listeners[eventType];\n if (!arr) {\n return;\n }\n var idx = arr.indexOf(listener);\n if (idx !== -1) {\n if (arr.length > 1) {\n // Make a copy so as not to interfere with a current dispatchEvent.\n this._listeners[eventType] = arr.slice(0, idx).concat(arr.slice(idx + 1));\n } else {\n delete this._listeners[eventType];\n }\n return;\n }\n};\n\nEventTarget.prototype.dispatchEvent = function() {\n var event = arguments[0];\n var t = event.type;\n // equivalent of Array.prototype.slice.call(arguments, 0);\n var args = arguments.length === 1 ? [event] : Array.apply(null, arguments);\n // TODO: This doesn't match the real behavior; per spec, onfoo get\n // their place in line from the /first/ time they're set from\n // non-null. Although WebKit bumps it to the end every time it's\n // set.\n if (this['on' + t]) {\n this['on' + t].apply(this, args);\n }\n if (t in this._listeners) {\n // Grab a reference to the listeners list. removeEventListener may alter the list.\n var listeners = this._listeners[t];\n for (var i = 0; i < listeners.length; i++) {\n listeners[i].apply(this, args);\n }\n }\n};\n\nmodule.exports = EventTarget;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/event/eventtarget.js\n// module id = ./node_modules/sockjs-client/lib/event/eventtarget.js\n// module chunks = 0","'use strict';\n\nvar inherits = require('inherits')\n , Event = require('./event')\n ;\n\nfunction TransportMessageEvent(data) {\n Event.call(this);\n this.initEvent('message', false, false);\n this.data = data;\n}\n\ninherits(TransportMessageEvent, Event);\n\nmodule.exports = TransportMessageEvent;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/event/trans-message.js\n// module id = ./node_modules/sockjs-client/lib/event/trans-message.js\n// module chunks = 0","'use strict';\n\nvar JSON3 = require('json3')\n , iframeUtils = require('./utils/iframe')\n ;\n\nfunction FacadeJS(transport) {\n this._transport = transport;\n transport.on('message', this._transportMessage.bind(this));\n transport.on('close', this._transportClose.bind(this));\n}\n\nFacadeJS.prototype._transportClose = function(code, reason) {\n iframeUtils.postMessage('c', JSON3.stringify([code, reason]));\n};\nFacadeJS.prototype._transportMessage = function(frame) {\n iframeUtils.postMessage('t', frame);\n};\nFacadeJS.prototype._send = function(data) {\n this._transport.send(data);\n};\nFacadeJS.prototype._close = function() {\n this._transport.close();\n this._transport.removeAllListeners();\n};\n\nmodule.exports = FacadeJS;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/facade.js\n// module id = ./node_modules/sockjs-client/lib/facade.js\n// module chunks = 0","'use strict';\n\nvar urlUtils = require('./utils/url')\n , eventUtils = require('./utils/event')\n , JSON3 = require('json3')\n , FacadeJS = require('./facade')\n , InfoIframeReceiver = require('./info-iframe-receiver')\n , iframeUtils = require('./utils/iframe')\n , loc = require('./location')\n ;\n\nvar debug = function() {};\nif (process.env.NODE_ENV !== 'production') {\n debug = require('debug')('sockjs-client:iframe-bootstrap');\n}\n\nmodule.exports = function(SockJS, availableTransports) {\n var transportMap = {};\n availableTransports.forEach(function(at) {\n if (at.facadeTransport) {\n transportMap[at.facadeTransport.transportName] = at.facadeTransport;\n }\n });\n\n // hard-coded for the info iframe\n // TODO see if we can make this more dynamic\n transportMap[InfoIframeReceiver.transportName] = InfoIframeReceiver;\n var parentOrigin;\n\n /* eslint-disable camelcase */\n SockJS.bootstrap_iframe = function() {\n /* eslint-enable camelcase */\n var facade;\n iframeUtils.currentWindowId = loc.hash.slice(1);\n var onMessage = function(e) {\n if (e.source !== parent) {\n return;\n }\n if (typeof parentOrigin === 'undefined') {\n parentOrigin = e.origin;\n }\n if (e.origin !== parentOrigin) {\n return;\n }\n\n var iframeMessage;\n try {\n iframeMessage = JSON3.parse(e.data);\n } catch (ignored) {\n debug('bad json', e.data);\n return;\n }\n\n if (iframeMessage.windowId !== iframeUtils.currentWindowId) {\n return;\n }\n switch (iframeMessage.type) {\n case 's':\n var p;\n try {\n p = JSON3.parse(iframeMessage.data);\n } catch (ignored) {\n debug('bad json', iframeMessage.data);\n break;\n }\n var version = p[0];\n var transport = p[1];\n var transUrl = p[2];\n var baseUrl = p[3];\n debug(version, transport, transUrl, baseUrl);\n // change this to semver logic\n if (version !== SockJS.version) {\n throw new Error('Incompatible SockJS! Main site uses:' +\n ' \"' + version + '\", the iframe:' +\n ' \"' + SockJS.version + '\".');\n }\n\n if (!urlUtils.isOriginEqual(transUrl, loc.href) ||\n !urlUtils.isOriginEqual(baseUrl, loc.href)) {\n throw new Error('Can\\'t connect to different domain from within an ' +\n 'iframe. (' + loc.href + ', ' + transUrl + ', ' + baseUrl + ')');\n }\n facade = new FacadeJS(new transportMap[transport](transUrl, baseUrl));\n break;\n case 'm':\n facade._send(iframeMessage.data);\n break;\n case 'c':\n if (facade) {\n facade._close();\n }\n facade = null;\n break;\n }\n };\n\n eventUtils.attachEvent('message', onMessage);\n\n // Start\n iframeUtils.postMessage('s');\n };\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/iframe-bootstrap.js\n// module id = ./node_modules/sockjs-client/lib/iframe-bootstrap.js\n// module chunks = 0","'use strict';\n\nvar EventEmitter = require('events').EventEmitter\n , inherits = require('inherits')\n , JSON3 = require('json3')\n , objectUtils = require('./utils/object')\n ;\n\nvar debug = function() {};\nif (process.env.NODE_ENV !== 'production') {\n debug = require('debug')('sockjs-client:info-ajax');\n}\n\nfunction InfoAjax(url, AjaxObject) {\n EventEmitter.call(this);\n\n var self = this;\n var t0 = +new Date();\n this.xo = new AjaxObject('GET', url);\n\n this.xo.once('finish', function(status, text) {\n var info, rtt;\n if (status === 200) {\n rtt = (+new Date()) - t0;\n if (text) {\n try {\n info = JSON3.parse(text);\n } catch (e) {\n debug('bad json', text);\n }\n }\n\n if (!objectUtils.isObject(info)) {\n info = {};\n }\n }\n self.emit('finish', info, rtt);\n self.removeAllListeners();\n });\n}\n\ninherits(InfoAjax, EventEmitter);\n\nInfoAjax.prototype.close = function() {\n this.removeAllListeners();\n this.xo.close();\n};\n\nmodule.exports = InfoAjax;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/info-ajax.js\n// module id = ./node_modules/sockjs-client/lib/info-ajax.js\n// module chunks = 0","'use strict';\n\nvar inherits = require('inherits')\n , EventEmitter = require('events').EventEmitter\n , JSON3 = require('json3')\n , XHRLocalObject = require('./transport/sender/xhr-local')\n , InfoAjax = require('./info-ajax')\n ;\n\nfunction InfoReceiverIframe(transUrl) {\n var self = this;\n EventEmitter.call(this);\n\n this.ir = new InfoAjax(transUrl, XHRLocalObject);\n this.ir.once('finish', function(info, rtt) {\n self.ir = null;\n self.emit('message', JSON3.stringify([info, rtt]));\n });\n}\n\ninherits(InfoReceiverIframe, EventEmitter);\n\nInfoReceiverIframe.transportName = 'iframe-info-receiver';\n\nInfoReceiverIframe.prototype.close = function() {\n if (this.ir) {\n this.ir.close();\n this.ir = null;\n }\n this.removeAllListeners();\n};\n\nmodule.exports = InfoReceiverIframe;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/info-iframe-receiver.js\n// module id = ./node_modules/sockjs-client/lib/info-iframe-receiver.js\n// module chunks = 0","'use strict';\n\nvar EventEmitter = require('events').EventEmitter\n , inherits = require('inherits')\n , JSON3 = require('json3')\n , utils = require('./utils/event')\n , IframeTransport = require('./transport/iframe')\n , InfoReceiverIframe = require('./info-iframe-receiver')\n ;\n\nvar debug = function() {};\nif (process.env.NODE_ENV !== 'production') {\n debug = require('debug')('sockjs-client:info-iframe');\n}\n\nfunction InfoIframe(baseUrl, url) {\n var self = this;\n EventEmitter.call(this);\n\n var go = function() {\n var ifr = self.ifr = new IframeTransport(InfoReceiverIframe.transportName, url, baseUrl);\n\n ifr.once('message', function(msg) {\n if (msg) {\n var d;\n try {\n d = JSON3.parse(msg);\n } catch (e) {\n debug('bad json', msg);\n self.emit('finish');\n self.close();\n return;\n }\n\n var info = d[0], rtt = d[1];\n self.emit('finish', info, rtt);\n }\n self.close();\n });\n\n ifr.once('close', function() {\n self.emit('finish');\n self.close();\n });\n };\n\n // TODO this seems the same as the 'needBody' from transports\n if (!global.document.body) {\n utils.attachEvent('load', go);\n } else {\n go();\n }\n}\n\ninherits(InfoIframe, EventEmitter);\n\nInfoIframe.enabled = function() {\n return IframeTransport.enabled();\n};\n\nInfoIframe.prototype.close = function() {\n if (this.ifr) {\n this.ifr.close();\n }\n this.removeAllListeners();\n this.ifr = null;\n};\n\nmodule.exports = InfoIframe;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/info-iframe.js\n// module id = ./node_modules/sockjs-client/lib/info-iframe.js\n// module chunks = 0","'use strict';\n\nvar EventEmitter = require('events').EventEmitter\n , inherits = require('inherits')\n , urlUtils = require('./utils/url')\n , XDR = require('./transport/sender/xdr')\n , XHRCors = require('./transport/sender/xhr-cors')\n , XHRLocal = require('./transport/sender/xhr-local')\n , XHRFake = require('./transport/sender/xhr-fake')\n , InfoIframe = require('./info-iframe')\n , InfoAjax = require('./info-ajax')\n ;\n\nvar debug = function() {};\nif (process.env.NODE_ENV !== 'production') {\n debug = require('debug')('sockjs-client:info-receiver');\n}\n\nfunction InfoReceiver(baseUrl, urlInfo) {\n debug(baseUrl);\n var self = this;\n EventEmitter.call(this);\n\n setTimeout(function() {\n self.doXhr(baseUrl, urlInfo);\n }, 0);\n}\n\ninherits(InfoReceiver, EventEmitter);\n\n// TODO this is currently ignoring the list of available transports and the whitelist\n\nInfoReceiver._getReceiver = function(baseUrl, url, urlInfo) {\n // determine method of CORS support (if needed)\n if (urlInfo.sameOrigin) {\n return new InfoAjax(url, XHRLocal);\n }\n if (XHRCors.enabled) {\n return new InfoAjax(url, XHRCors);\n }\n if (XDR.enabled && urlInfo.sameScheme) {\n return new InfoAjax(url, XDR);\n }\n if (InfoIframe.enabled()) {\n return new InfoIframe(baseUrl, url);\n }\n return new InfoAjax(url, XHRFake);\n};\n\nInfoReceiver.prototype.doXhr = function(baseUrl, urlInfo) {\n var self = this\n , url = urlUtils.addPath(baseUrl, '/info')\n ;\n debug('doXhr', url);\n\n this.xo = InfoReceiver._getReceiver(baseUrl, url, urlInfo);\n\n this.timeoutRef = setTimeout(function() {\n debug('timeout');\n self._cleanup(false);\n self.emit('finish');\n }, InfoReceiver.timeout);\n\n this.xo.once('finish', function(info, rtt) {\n debug('finish', info, rtt);\n self._cleanup(true);\n self.emit('finish', info, rtt);\n });\n};\n\nInfoReceiver.prototype._cleanup = function(wasClean) {\n debug('_cleanup');\n clearTimeout(this.timeoutRef);\n this.timeoutRef = null;\n if (!wasClean && this.xo) {\n this.xo.close();\n }\n this.xo = null;\n};\n\nInfoReceiver.prototype.close = function() {\n debug('close');\n this.removeAllListeners();\n this._cleanup(false);\n};\n\nInfoReceiver.timeout = 8000;\n\nmodule.exports = InfoReceiver;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/info-receiver.js\n// module id = ./node_modules/sockjs-client/lib/info-receiver.js\n// module chunks = 0","'use strict';\n\nmodule.exports = global.location || {\n origin: 'http://localhost:80'\n, protocol: 'http'\n, host: 'localhost'\n, port: 80\n, href: 'http://localhost/'\n, hash: ''\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/location.js\n// module id = ./node_modules/sockjs-client/lib/location.js\n// module chunks = 0","'use strict';\n\nrequire('./shims');\n\nvar URL = require('url-parse')\n , inherits = require('inherits')\n , JSON3 = require('json3')\n , random = require('./utils/random')\n , escape = require('./utils/escape')\n , urlUtils = require('./utils/url')\n , eventUtils = require('./utils/event')\n , transport = require('./utils/transport')\n , objectUtils = require('./utils/object')\n , browser = require('./utils/browser')\n , log = require('./utils/log')\n , Event = require('./event/event')\n , EventTarget = require('./event/eventtarget')\n , loc = require('./location')\n , CloseEvent = require('./event/close')\n , TransportMessageEvent = require('./event/trans-message')\n , InfoReceiver = require('./info-receiver')\n ;\n\nvar debug = function() {};\nif (process.env.NODE_ENV !== 'production') {\n debug = require('debug')('sockjs-client:main');\n}\n\nvar transports;\n\n// follow constructor steps defined at http://dev.w3.org/html5/websockets/#the-websocket-interface\nfunction SockJS(url, protocols, options) {\n if (!(this instanceof SockJS)) {\n return new SockJS(url, protocols, options);\n }\n if (arguments.length < 1) {\n throw new TypeError(\"Failed to construct 'SockJS: 1 argument required, but only 0 present\");\n }\n EventTarget.call(this);\n\n this.readyState = SockJS.CONNECTING;\n this.extensions = '';\n this.protocol = '';\n\n // non-standard extension\n options = options || {};\n if (options.protocols_whitelist) {\n log.warn(\"'protocols_whitelist' is DEPRECATED. Use 'transports' instead.\");\n }\n this._transportsWhitelist = options.transports;\n this._transportOptions = options.transportOptions || {};\n\n var sessionId = options.sessionId || 8;\n if (typeof sessionId === 'function') {\n this._generateSessionId = sessionId;\n } else if (typeof sessionId === 'number') {\n this._generateSessionId = function() {\n return random.string(sessionId);\n };\n } else {\n throw new TypeError('If sessionId is used in the options, it needs to be a number or a function.');\n }\n\n this._server = options.server || random.numberString(1000);\n\n // Step 1 of WS spec - parse and validate the url. Issue #8\n var parsedUrl = new URL(url);\n if (!parsedUrl.host || !parsedUrl.protocol) {\n throw new SyntaxError(\"The URL '\" + url + \"' is invalid\");\n } else if (parsedUrl.hash) {\n throw new SyntaxError('The URL must not contain a fragment');\n } else if (parsedUrl.protocol !== 'http:' && parsedUrl.protocol !== 'https:') {\n throw new SyntaxError(\"The URL's scheme must be either 'http:' or 'https:'. '\" + parsedUrl.protocol + \"' is not allowed.\");\n }\n\n var secure = parsedUrl.protocol === 'https:';\n // Step 2 - don't allow secure origin with an insecure protocol\n if (loc.protocol === 'https' && !secure) {\n throw new Error('SecurityError: An insecure SockJS connection may not be initiated from a page loaded over HTTPS');\n }\n\n // Step 3 - check port access - no need here\n // Step 4 - parse protocols argument\n if (!protocols) {\n protocols = [];\n } else if (!Array.isArray(protocols)) {\n protocols = [protocols];\n }\n\n // Step 5 - check protocols argument\n var sortedProtocols = protocols.sort();\n sortedProtocols.forEach(function(proto, i) {\n if (!proto) {\n throw new SyntaxError(\"The protocols entry '\" + proto + \"' is invalid.\");\n }\n if (i < (sortedProtocols.length - 1) && proto === sortedProtocols[i + 1]) {\n throw new SyntaxError(\"The protocols entry '\" + proto + \"' is duplicated.\");\n }\n });\n\n // Step 6 - convert origin\n var o = urlUtils.getOrigin(loc.href);\n this._origin = o ? o.toLowerCase() : null;\n\n // remove the trailing slash\n parsedUrl.set('pathname', parsedUrl.pathname.replace(/\\/+$/, ''));\n\n // store the sanitized url\n this.url = parsedUrl.href;\n debug('using url', this.url);\n\n // Step 7 - start connection in background\n // obtain server info\n // http://sockjs.github.io/sockjs-protocol/sockjs-protocol-0.3.3.html#section-26\n this._urlInfo = {\n nullOrigin: !browser.hasDomain()\n , sameOrigin: urlUtils.isOriginEqual(this.url, loc.href)\n , sameScheme: urlUtils.isSchemeEqual(this.url, loc.href)\n };\n\n this._ir = new InfoReceiver(this.url, this._urlInfo);\n this._ir.once('finish', this._receiveInfo.bind(this));\n}\n\ninherits(SockJS, EventTarget);\n\nfunction userSetCode(code) {\n return code === 1000 || (code >= 3000 && code <= 4999);\n}\n\nSockJS.prototype.close = function(code, reason) {\n // Step 1\n if (code && !userSetCode(code)) {\n throw new Error('InvalidAccessError: Invalid code');\n }\n // Step 2.4 states the max is 123 bytes, but we are just checking length\n if (reason && reason.length > 123) {\n throw new SyntaxError('reason argument has an invalid length');\n }\n\n // Step 3.1\n if (this.readyState === SockJS.CLOSING || this.readyState === SockJS.CLOSED) {\n return;\n }\n\n // TODO look at docs to determine how to set this\n var wasClean = true;\n this._close(code || 1000, reason || 'Normal closure', wasClean);\n};\n\nSockJS.prototype.send = function(data) {\n // #13 - convert anything non-string to string\n // TODO this currently turns objects into [object Object]\n if (typeof data !== 'string') {\n data = '' + data;\n }\n if (this.readyState === SockJS.CONNECTING) {\n throw new Error('InvalidStateError: The connection has not been established yet');\n }\n if (this.readyState !== SockJS.OPEN) {\n return;\n }\n this._transport.send(escape.quote(data));\n};\n\nSockJS.version = require('./version');\n\nSockJS.CONNECTING = 0;\nSockJS.OPEN = 1;\nSockJS.CLOSING = 2;\nSockJS.CLOSED = 3;\n\nSockJS.prototype._receiveInfo = function(info, rtt) {\n debug('_receiveInfo', rtt);\n this._ir = null;\n if (!info) {\n this._close(1002, 'Cannot connect to server');\n return;\n }\n\n // establish a round-trip timeout (RTO) based on the\n // round-trip time (RTT)\n this._rto = this.countRTO(rtt);\n // allow server to override url used for the actual transport\n this._transUrl = info.base_url ? info.base_url : this.url;\n info = objectUtils.extend(info, this._urlInfo);\n debug('info', info);\n // determine list of desired and supported transports\n var enabledTransports = transports.filterToEnabled(this._transportsWhitelist, info);\n this._transports = enabledTransports.main;\n debug(this._transports.length + ' enabled transports');\n\n this._connect();\n};\n\nSockJS.prototype._connect = function() {\n for (var Transport = this._transports.shift(); Transport; Transport = this._transports.shift()) {\n debug('attempt', Transport.transportName);\n if (Transport.needBody) {\n if (!global.document.body ||\n (typeof global.document.readyState !== 'undefined' &&\n global.document.readyState !== 'complete' &&\n global.document.readyState !== 'interactive')) {\n debug('waiting for body');\n this._transports.unshift(Transport);\n eventUtils.attachEvent('load', this._connect.bind(this));\n return;\n }\n }\n\n // calculate timeout based on RTO and round trips. Default to 5s\n var timeoutMs = (this._rto * Transport.roundTrips) || 5000;\n this._transportTimeoutId = setTimeout(this._transportTimeout.bind(this), timeoutMs);\n debug('using timeout', timeoutMs);\n\n var transportUrl = urlUtils.addPath(this._transUrl, '/' + this._server + '/' + this._generateSessionId());\n var options = this._transportOptions[Transport.transportName];\n debug('transport url', transportUrl);\n var transportObj = new Transport(transportUrl, this._transUrl, options);\n transportObj.on('message', this._transportMessage.bind(this));\n transportObj.once('close', this._transportClose.bind(this));\n transportObj.transportName = Transport.transportName;\n this._transport = transportObj;\n\n return;\n }\n this._close(2000, 'All transports failed', false);\n};\n\nSockJS.prototype._transportTimeout = function() {\n debug('_transportTimeout');\n if (this.readyState === SockJS.CONNECTING) {\n this._transportClose(2007, 'Transport timed out');\n }\n};\n\nSockJS.prototype._transportMessage = function(msg) {\n debug('_transportMessage', msg);\n var self = this\n , type = msg.slice(0, 1)\n , content = msg.slice(1)\n , payload\n ;\n\n // first check for messages that don't need a payload\n switch (type) {\n case 'o':\n this._open();\n return;\n case 'h':\n this.dispatchEvent(new Event('heartbeat'));\n debug('heartbeat', this.transport);\n return;\n }\n\n if (content) {\n try {\n payload = JSON3.parse(content);\n } catch (e) {\n debug('bad json', content);\n }\n }\n\n if (typeof payload === 'undefined') {\n debug('empty payload', content);\n return;\n }\n\n switch (type) {\n case 'a':\n if (Array.isArray(payload)) {\n payload.forEach(function(p) {\n debug('message', self.transport, p);\n self.dispatchEvent(new TransportMessageEvent(p));\n });\n }\n break;\n case 'm':\n debug('message', this.transport, payload);\n this.dispatchEvent(new TransportMessageEvent(payload));\n break;\n case 'c':\n if (Array.isArray(payload) && payload.length === 2) {\n this._close(payload[0], payload[1], true);\n }\n break;\n }\n};\n\nSockJS.prototype._transportClose = function(code, reason) {\n debug('_transportClose', this.transport, code, reason);\n if (this._transport) {\n this._transport.removeAllListeners();\n this._transport = null;\n this.transport = null;\n }\n\n if (!userSetCode(code) && code !== 2000 && this.readyState === SockJS.CONNECTING) {\n this._connect();\n return;\n }\n\n this._close(code, reason);\n};\n\nSockJS.prototype._open = function() {\n debug('_open', this._transport.transportName, this.readyState);\n if (this.readyState === SockJS.CONNECTING) {\n if (this._transportTimeoutId) {\n clearTimeout(this._transportTimeoutId);\n this._transportTimeoutId = null;\n }\n this.readyState = SockJS.OPEN;\n this.transport = this._transport.transportName;\n this.dispatchEvent(new Event('open'));\n debug('connected', this.transport);\n } else {\n // The server might have been restarted, and lost track of our\n // connection.\n this._close(1006, 'Server lost session');\n }\n};\n\nSockJS.prototype._close = function(code, reason, wasClean) {\n debug('_close', this.transport, code, reason, wasClean, this.readyState);\n var forceFail = false;\n\n if (this._ir) {\n forceFail = true;\n this._ir.close();\n this._ir = null;\n }\n if (this._transport) {\n this._transport.close();\n this._transport = null;\n this.transport = null;\n }\n\n if (this.readyState === SockJS.CLOSED) {\n throw new Error('InvalidStateError: SockJS has already been closed');\n }\n\n this.readyState = SockJS.CLOSING;\n setTimeout(function() {\n this.readyState = SockJS.CLOSED;\n\n if (forceFail) {\n this.dispatchEvent(new Event('error'));\n }\n\n var e = new CloseEvent('close');\n e.wasClean = wasClean || false;\n e.code = code || 1000;\n e.reason = reason;\n\n this.dispatchEvent(e);\n this.onmessage = this.onclose = this.onerror = null;\n debug('disconnected');\n }.bind(this), 0);\n};\n\n// See: http://www.erg.abdn.ac.uk/~gerrit/dccp/notes/ccid2/rto_estimator/\n// and RFC 2988.\nSockJS.prototype.countRTO = function(rtt) {\n // In a local environment, when using IE8/9 and the `jsonp-polling`\n // transport the time needed to establish a connection (the time that pass\n // from the opening of the transport to the call of `_dispatchOpen`) is\n // around 200msec (the lower bound used in the article above) and this\n // causes spurious timeouts. For this reason we calculate a value slightly\n // larger than that used in the article.\n if (rtt > 100) {\n return 4 * rtt; // rto > 400msec\n }\n return 300 + rtt; // 300msec < rto <= 400msec\n};\n\nmodule.exports = function(availableTransports) {\n transports = transport(availableTransports);\n require('./iframe-bootstrap')(SockJS, availableTransports);\n return SockJS;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/main.js\n// module id = ./node_modules/sockjs-client/lib/main.js\n// module chunks = 0","/* eslint-disable */\n/* jscs: disable */\n'use strict';\n\n// pulled specific shims from https://github.com/es-shims/es5-shim\n\nvar ArrayPrototype = Array.prototype;\nvar ObjectPrototype = Object.prototype;\nvar FunctionPrototype = Function.prototype;\nvar StringPrototype = String.prototype;\nvar array_slice = ArrayPrototype.slice;\n\nvar _toString = ObjectPrototype.toString;\nvar isFunction = function (val) {\n return ObjectPrototype.toString.call(val) === '[object Function]';\n};\nvar isArray = function isArray(obj) {\n return _toString.call(obj) === '[object Array]';\n};\nvar isString = function isString(obj) {\n return _toString.call(obj) === '[object String]';\n};\n\nvar supportsDescriptors = Object.defineProperty && (function () {\n try {\n Object.defineProperty({}, 'x', {});\n return true;\n } catch (e) { /* this is ES3 */\n return false;\n }\n}());\n\n// Define configurable, writable and non-enumerable props\n// if they don't exist.\nvar defineProperty;\nif (supportsDescriptors) {\n defineProperty = function (object, name, method, forceAssign) {\n if (!forceAssign && (name in object)) { return; }\n Object.defineProperty(object, name, {\n configurable: true,\n enumerable: false,\n writable: true,\n value: method\n });\n };\n} else {\n defineProperty = function (object, name, method, forceAssign) {\n if (!forceAssign && (name in object)) { return; }\n object[name] = method;\n };\n}\nvar defineProperties = function (object, map, forceAssign) {\n for (var name in map) {\n if (ObjectPrototype.hasOwnProperty.call(map, name)) {\n defineProperty(object, name, map[name], forceAssign);\n }\n }\n};\n\nvar toObject = function (o) {\n if (o == null) { // this matches both null and undefined\n throw new TypeError(\"can't convert \" + o + ' to object');\n }\n return Object(o);\n};\n\n//\n// Util\n// ======\n//\n\n// ES5 9.4\n// http://es5.github.com/#x9.4\n// http://jsperf.com/to-integer\n\nfunction toInteger(num) {\n var n = +num;\n if (n !== n) { // isNaN\n n = 0;\n } else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) {\n n = (n > 0 || -1) * Math.floor(Math.abs(n));\n }\n return n;\n}\n\nfunction ToUint32(x) {\n return x >>> 0;\n}\n\n//\n// Function\n// ========\n//\n\n// ES-5 15.3.4.5\n// http://es5.github.com/#x15.3.4.5\n\nfunction Empty() {}\n\ndefineProperties(FunctionPrototype, {\n bind: function bind(that) { // .length is 1\n // 1. Let Target be the this value.\n var target = this;\n // 2. If IsCallable(Target) is false, throw a TypeError exception.\n if (!isFunction(target)) {\n throw new TypeError('Function.prototype.bind called on incompatible ' + target);\n }\n // 3. Let A be a new (possibly empty) internal list of all of the\n // argument values provided after thisArg (arg1, arg2 etc), in order.\n // XXX slicedArgs will stand in for \"A\" if used\n var args = array_slice.call(arguments, 1); // for normal call\n // 4. Let F be a new native ECMAScript object.\n // 11. Set the [[Prototype]] internal property of F to the standard\n // built-in Function prototype object as specified in 15.3.3.1.\n // 12. Set the [[Call]] internal property of F as described in\n // 15.3.4.5.1.\n // 13. Set the [[Construct]] internal property of F as described in\n // 15.3.4.5.2.\n // 14. Set the [[HasInstance]] internal property of F as described in\n // 15.3.4.5.3.\n var binder = function () {\n\n if (this instanceof bound) {\n // 15.3.4.5.2 [[Construct]]\n // When the [[Construct]] internal method of a function object,\n // F that was created using the bind function is called with a\n // list of arguments ExtraArgs, the following steps are taken:\n // 1. Let target be the value of F's [[TargetFunction]]\n // internal property.\n // 2. If target has no [[Construct]] internal method, a\n // TypeError exception is thrown.\n // 3. Let boundArgs be the value of F's [[BoundArgs]] internal\n // property.\n // 4. Let args be a new list containing the same values as the\n // list boundArgs in the same order followed by the same\n // values as the list ExtraArgs in the same order.\n // 5. Return the result of calling the [[Construct]] internal\n // method of target providing args as the arguments.\n\n var result = target.apply(\n this,\n args.concat(array_slice.call(arguments))\n );\n if (Object(result) === result) {\n return result;\n }\n return this;\n\n } else {\n // 15.3.4.5.1 [[Call]]\n // When the [[Call]] internal method of a function object, F,\n // which was created using the bind function is called with a\n // this value and a list of arguments ExtraArgs, the following\n // steps are taken:\n // 1. Let boundArgs be the value of F's [[BoundArgs]] internal\n // property.\n // 2. Let boundThis be the value of F's [[BoundThis]] internal\n // property.\n // 3. Let target be the value of F's [[TargetFunction]] internal\n // property.\n // 4. Let args be a new list containing the same values as the\n // list boundArgs in the same order followed by the same\n // values as the list ExtraArgs in the same order.\n // 5. Return the result of calling the [[Call]] internal method\n // of target providing boundThis as the this value and\n // providing args as the arguments.\n\n // equiv: target.call(this, ...boundArgs, ...args)\n return target.apply(\n that,\n args.concat(array_slice.call(arguments))\n );\n\n }\n\n };\n\n // 15. If the [[Class]] internal property of Target is \"Function\", then\n // a. Let L be the length property of Target minus the length of A.\n // b. Set the length own property of F to either 0 or L, whichever is\n // larger.\n // 16. Else set the length own property of F to 0.\n\n var boundLength = Math.max(0, target.length - args.length);\n\n // 17. Set the attributes of the length own property of F to the values\n // specified in 15.3.5.1.\n var boundArgs = [];\n for (var i = 0; i < boundLength; i++) {\n boundArgs.push('$' + i);\n }\n\n // XXX Build a dynamic function with desired amount of arguments is the only\n // way to set the length property of a function.\n // In environments where Content Security Policies enabled (Chrome extensions,\n // for ex.) all use of eval or Function costructor throws an exception.\n // However in all of these environments Function.prototype.bind exists\n // and so this code will never be executed.\n var bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this, arguments); }')(binder);\n\n if (target.prototype) {\n Empty.prototype = target.prototype;\n bound.prototype = new Empty();\n // Clean up dangling references.\n Empty.prototype = null;\n }\n\n // TODO\n // 18. Set the [[Extensible]] internal property of F to true.\n\n // TODO\n // 19. Let thrower be the [[ThrowTypeError]] function Object (13.2.3).\n // 20. Call the [[DefineOwnProperty]] internal method of F with\n // arguments \"caller\", PropertyDescriptor {[[Get]]: thrower, [[Set]]:\n // thrower, [[Enumerable]]: false, [[Configurable]]: false}, and\n // false.\n // 21. Call the [[DefineOwnProperty]] internal method of F with\n // arguments \"arguments\", PropertyDescriptor {[[Get]]: thrower,\n // [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false},\n // and false.\n\n // TODO\n // NOTE Function objects created using Function.prototype.bind do not\n // have a prototype property or the [[Code]], [[FormalParameters]], and\n // [[Scope]] internal properties.\n // XXX can't delete prototype in pure-js.\n\n // 22. Return F.\n return bound;\n }\n});\n\n//\n// Array\n// =====\n//\n\n// ES5 15.4.3.2\n// http://es5.github.com/#x15.4.3.2\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray\ndefineProperties(Array, { isArray: isArray });\n\n\nvar boxedString = Object('a');\nvar splitString = boxedString[0] !== 'a' || !(0 in boxedString);\n\nvar properlyBoxesContext = function properlyBoxed(method) {\n // Check node 0.6.21 bug where third parameter is not boxed\n var properlyBoxesNonStrict = true;\n var properlyBoxesStrict = true;\n if (method) {\n method.call('foo', function (_, __, context) {\n if (typeof context !== 'object') { properlyBoxesNonStrict = false; }\n });\n\n method.call([1], function () {\n 'use strict';\n properlyBoxesStrict = typeof this === 'string';\n }, 'x');\n }\n return !!method && properlyBoxesNonStrict && properlyBoxesStrict;\n};\n\ndefineProperties(ArrayPrototype, {\n forEach: function forEach(fun /*, thisp*/) {\n var object = toObject(this),\n self = splitString && isString(this) ? this.split('') : object,\n thisp = arguments[1],\n i = -1,\n length = self.length >>> 0;\n\n // If no callback function or if callback is not a callable function\n if (!isFunction(fun)) {\n throw new TypeError(); // TODO message\n }\n\n while (++i < length) {\n if (i in self) {\n // Invoke the callback function with call, passing arguments:\n // context, property value, property key, thisArg object\n // context\n fun.call(thisp, self[i], i, object);\n }\n }\n }\n}, !properlyBoxesContext(ArrayPrototype.forEach));\n\n// ES5 15.4.4.14\n// http://es5.github.com/#x15.4.4.14\n// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf\nvar hasFirefox2IndexOfBug = Array.prototype.indexOf && [0, 1].indexOf(1, 2) !== -1;\ndefineProperties(ArrayPrototype, {\n indexOf: function indexOf(sought /*, fromIndex */ ) {\n var self = splitString && isString(this) ? this.split('') : toObject(this),\n length = self.length >>> 0;\n\n if (!length) {\n return -1;\n }\n\n var i = 0;\n if (arguments.length > 1) {\n i = toInteger(arguments[1]);\n }\n\n // handle negative indices\n i = i >= 0 ? i : Math.max(0, length + i);\n for (; i < length; i++) {\n if (i in self && self[i] === sought) {\n return i;\n }\n }\n return -1;\n }\n}, hasFirefox2IndexOfBug);\n\n//\n// String\n// ======\n//\n\n// ES5 15.5.4.14\n// http://es5.github.com/#x15.5.4.14\n\n// [bugfix, IE lt 9, firefox 4, Konqueror, Opera, obscure browsers]\n// Many browsers do not split properly with regular expressions or they\n// do not perform the split correctly under obscure conditions.\n// See http://blog.stevenlevithan.com/archives/cross-browser-split\n// I've tested in many browsers and this seems to cover the deviant ones:\n// 'ab'.split(/(?:ab)*/) should be [\"\", \"\"], not [\"\"]\n// '.'.split(/(.?)(.?)/) should be [\"\", \".\", \"\", \"\"], not [\"\", \"\"]\n// 'tesst'.split(/(s)*/) should be [\"t\", undefined, \"e\", \"s\", \"t\"], not\n// [undefined, \"t\", undefined, \"e\", ...]\n// ''.split(/.?/) should be [], not [\"\"]\n// '.'.split(/()()/) should be [\".\"], not [\"\", \"\", \".\"]\n\nvar string_split = StringPrototype.split;\nif (\n 'ab'.split(/(?:ab)*/).length !== 2 ||\n '.'.split(/(.?)(.?)/).length !== 4 ||\n 'tesst'.split(/(s)*/)[1] === 't' ||\n 'test'.split(/(?:)/, -1).length !== 4 ||\n ''.split(/.?/).length ||\n '.'.split(/()()/).length > 1\n) {\n (function () {\n var compliantExecNpcg = /()??/.exec('')[1] === void 0; // NPCG: nonparticipating capturing group\n\n StringPrototype.split = function (separator, limit) {\n var string = this;\n if (separator === void 0 && limit === 0) {\n return [];\n }\n\n // If `separator` is not a regex, use native split\n if (_toString.call(separator) !== '[object RegExp]') {\n return string_split.call(this, separator, limit);\n }\n\n var output = [],\n flags = (separator.ignoreCase ? 'i' : '') +\n (separator.multiline ? 'm' : '') +\n (separator.extended ? 'x' : '') + // Proposed for ES6\n (separator.sticky ? 'y' : ''), // Firefox 3+\n lastLastIndex = 0,\n // Make `global` and avoid `lastIndex` issues by working with a copy\n separator2, match, lastIndex, lastLength;\n separator = new RegExp(separator.source, flags + 'g');\n string += ''; // Type-convert\n if (!compliantExecNpcg) {\n // Doesn't need flags gy, but they don't hurt\n separator2 = new RegExp('^' + separator.source + '$(?!\\\\s)', flags);\n }\n /* Values for `limit`, per the spec:\n * If undefined: 4294967295 // Math.pow(2, 32) - 1\n * If 0, Infinity, or NaN: 0\n * If positive number: limit = Math.floor(limit); if (limit > 4294967295) limit -= 4294967296;\n * If negative number: 4294967296 - Math.floor(Math.abs(limit))\n * If other: Type-convert, then use the above rules\n */\n limit = limit === void 0 ?\n -1 >>> 0 : // Math.pow(2, 32) - 1\n ToUint32(limit);\n while (match = separator.exec(string)) {\n // `separator.lastIndex` is not reliable cross-browser\n lastIndex = match.index + match[0].length;\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n // Fix browsers whose `exec` methods don't consistently return `undefined` for\n // nonparticipating capturing groups\n if (!compliantExecNpcg && match.length > 1) {\n match[0].replace(separator2, function () {\n for (var i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === void 0) {\n match[i] = void 0;\n }\n }\n });\n }\n if (match.length > 1 && match.index < string.length) {\n ArrayPrototype.push.apply(output, match.slice(1));\n }\n lastLength = match[0].length;\n lastLastIndex = lastIndex;\n if (output.length >= limit) {\n break;\n }\n }\n if (separator.lastIndex === match.index) {\n separator.lastIndex++; // Avoid an infinite loop\n }\n }\n if (lastLastIndex === string.length) {\n if (lastLength || !separator.test('')) {\n output.push('');\n }\n } else {\n output.push(string.slice(lastLastIndex));\n }\n return output.length > limit ? output.slice(0, limit) : output;\n };\n }());\n\n// [bugfix, chrome]\n// If separator is undefined, then the result array contains just one String,\n// which is the this value (converted to a String). If limit is not undefined,\n// then the output array is truncated so that it contains no more than limit\n// elements.\n// \"0\".split(undefined, 0) -> []\n} else if ('0'.split(void 0, 0).length) {\n StringPrototype.split = function split(separator, limit) {\n if (separator === void 0 && limit === 0) { return []; }\n return string_split.call(this, separator, limit);\n };\n}\n\n// ECMA-262, 3rd B.2.3\n// Not an ECMAScript standard, although ECMAScript 3rd Edition has a\n// non-normative section suggesting uniform semantics and it should be\n// normalized across all browsers\n// [bugfix, IE lt 9] IE < 9 substr() with negative value not working in IE\nvar string_substr = StringPrototype.substr;\nvar hasNegativeSubstrBug = ''.substr && '0b'.substr(-1) !== 'b';\ndefineProperties(StringPrototype, {\n substr: function substr(start, length) {\n return string_substr.call(\n this,\n start < 0 ? ((start = this.length + start) < 0 ? 0 : start) : start,\n length\n );\n }\n}, hasNegativeSubstrBug);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/shims.js\n// module id = ./node_modules/sockjs-client/lib/shims.js\n// module chunks = 0","'use strict';\n\nmodule.exports = [\n // streaming transports\n require('./transport/websocket')\n, require('./transport/xhr-streaming')\n, require('./transport/xdr-streaming')\n, require('./transport/eventsource')\n, require('./transport/lib/iframe-wrap')(require('./transport/eventsource'))\n\n // polling transports\n, require('./transport/htmlfile')\n, require('./transport/lib/iframe-wrap')(require('./transport/htmlfile'))\n, require('./transport/xhr-polling')\n, require('./transport/xdr-polling')\n, require('./transport/lib/iframe-wrap')(require('./transport/xhr-polling'))\n, require('./transport/jsonp-polling')\n];\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/transport-list.js\n// module id = ./node_modules/sockjs-client/lib/transport-list.js\n// module chunks = 0","'use strict';\n\nvar EventEmitter = require('events').EventEmitter\n , inherits = require('inherits')\n , utils = require('../../utils/event')\n , urlUtils = require('../../utils/url')\n , XHR = global.XMLHttpRequest\n ;\n\nvar debug = function() {};\nif (process.env.NODE_ENV !== 'production') {\n debug = require('debug')('sockjs-client:browser:xhr');\n}\n\nfunction AbstractXHRObject(method, url, payload, opts) {\n debug(method, url);\n var self = this;\n EventEmitter.call(this);\n\n setTimeout(function () {\n self._start(method, url, payload, opts);\n }, 0);\n}\n\ninherits(AbstractXHRObject, EventEmitter);\n\nAbstractXHRObject.prototype._start = function(method, url, payload, opts) {\n var self = this;\n\n try {\n this.xhr = new XHR();\n } catch (x) {\n // intentionally empty\n }\n\n if (!this.xhr) {\n debug('no xhr');\n this.emit('finish', 0, 'no xhr support');\n this._cleanup();\n return;\n }\n\n // several browsers cache POSTs\n url = urlUtils.addQuery(url, 't=' + (+new Date()));\n\n // Explorer tends to keep connection open, even after the\n // tab gets closed: http://bugs.jquery.com/ticket/5280\n this.unloadRef = utils.unloadAdd(function() {\n debug('unload cleanup');\n self._cleanup(true);\n });\n try {\n this.xhr.open(method, url, true);\n if (this.timeout && 'timeout' in this.xhr) {\n this.xhr.timeout = this.timeout;\n this.xhr.ontimeout = function() {\n debug('xhr timeout');\n self.emit('finish', 0, '');\n self._cleanup(false);\n };\n }\n } catch (e) {\n debug('exception', e);\n // IE raises an exception on wrong port.\n this.emit('finish', 0, '');\n this._cleanup(false);\n return;\n }\n\n if ((!opts || !opts.noCredentials) && AbstractXHRObject.supportsCORS) {\n debug('withCredentials');\n // Mozilla docs says https://developer.mozilla.org/en/XMLHttpRequest :\n // \"This never affects same-site requests.\"\n\n this.xhr.withCredentials = 'true';\n }\n if (opts && opts.headers) {\n for (var key in opts.headers) {\n this.xhr.setRequestHeader(key, opts.headers[key]);\n }\n }\n\n this.xhr.onreadystatechange = function() {\n if (self.xhr) {\n var x = self.xhr;\n var text, status;\n debug('readyState', x.readyState);\n switch (x.readyState) {\n case 3:\n // IE doesn't like peeking into responseText or status\n // on Microsoft.XMLHTTP and readystate=3\n try {\n status = x.status;\n text = x.responseText;\n } catch (e) {\n // intentionally empty\n }\n debug('status', status);\n // IE returns 1223 for 204: http://bugs.jquery.com/ticket/1450\n if (status === 1223) {\n status = 204;\n }\n\n // IE does return readystate == 3 for 404 answers.\n if (status === 200 && text && text.length > 0) {\n debug('chunk');\n self.emit('chunk', status, text);\n }\n break;\n case 4:\n status = x.status;\n debug('status', status);\n // IE returns 1223 for 204: http://bugs.jquery.com/ticket/1450\n if (status === 1223) {\n status = 204;\n }\n // IE returns this for a bad port\n // http://msdn.microsoft.com/en-us/library/windows/desktop/aa383770(v=vs.85).aspx\n if (status === 12005 || status === 12029) {\n status = 0;\n }\n\n debug('finish', status, x.responseText);\n self.emit('finish', status, x.responseText);\n self._cleanup(false);\n break;\n }\n }\n };\n\n try {\n self.xhr.send(payload);\n } catch (e) {\n self.emit('finish', 0, '');\n self._cleanup(false);\n }\n};\n\nAbstractXHRObject.prototype._cleanup = function(abort) {\n debug('cleanup');\n if (!this.xhr) {\n return;\n }\n this.removeAllListeners();\n utils.unloadDel(this.unloadRef);\n\n // IE needs this field to be a function\n this.xhr.onreadystatechange = function() {};\n if (this.xhr.ontimeout) {\n this.xhr.ontimeout = null;\n }\n\n if (abort) {\n try {\n this.xhr.abort();\n } catch (x) {\n // intentionally empty\n }\n }\n this.unloadRef = this.xhr = null;\n};\n\nAbstractXHRObject.prototype.close = function() {\n debug('close');\n this._cleanup(true);\n};\n\nAbstractXHRObject.enabled = !!XHR;\n// override XMLHttpRequest for IE6/7\n// obfuscate to avoid firewalls\nvar axo = ['Active'].concat('Object').join('X');\nif (!AbstractXHRObject.enabled && (axo in global)) {\n debug('overriding xmlhttprequest');\n XHR = function() {\n try {\n return new global[axo]('Microsoft.XMLHTTP');\n } catch (e) {\n return null;\n }\n };\n AbstractXHRObject.enabled = !!new XHR();\n}\n\nvar cors = false;\ntry {\n cors = 'withCredentials' in new XHR();\n} catch (ignored) {\n // intentionally empty\n}\n\nAbstractXHRObject.supportsCORS = cors;\n\nmodule.exports = AbstractXHRObject;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/transport/browser/abstract-xhr.js\n// module id = ./node_modules/sockjs-client/lib/transport/browser/abstract-xhr.js\n// module chunks = 0","module.exports = global.EventSource;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/transport/browser/eventsource.js\n// module id = ./node_modules/sockjs-client/lib/transport/browser/eventsource.js\n// module chunks = 0","'use strict';\n\nvar Driver = global.WebSocket || global.MozWebSocket;\nif (Driver) {\n\tmodule.exports = function WebSocketBrowserDriver(url) {\n\t\treturn new Driver(url);\n\t};\n} else {\n\tmodule.exports = undefined;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/transport/browser/websocket.js\n// module id = ./node_modules/sockjs-client/lib/transport/browser/websocket.js\n// module chunks = 0","'use strict';\n\nvar inherits = require('inherits')\n , AjaxBasedTransport = require('./lib/ajax-based')\n , EventSourceReceiver = require('./receiver/eventsource')\n , XHRCorsObject = require('./sender/xhr-cors')\n , EventSourceDriver = require('eventsource')\n ;\n\nfunction EventSourceTransport(transUrl) {\n if (!EventSourceTransport.enabled()) {\n throw new Error('Transport created when disabled');\n }\n\n AjaxBasedTransport.call(this, transUrl, '/eventsource', EventSourceReceiver, XHRCorsObject);\n}\n\ninherits(EventSourceTransport, AjaxBasedTransport);\n\nEventSourceTransport.enabled = function() {\n return !!EventSourceDriver;\n};\n\nEventSourceTransport.transportName = 'eventsource';\nEventSourceTransport.roundTrips = 2;\n\nmodule.exports = EventSourceTransport;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/transport/eventsource.js\n// module id = ./node_modules/sockjs-client/lib/transport/eventsource.js\n// module chunks = 0","'use strict';\n\nvar inherits = require('inherits')\n , HtmlfileReceiver = require('./receiver/htmlfile')\n , XHRLocalObject = require('./sender/xhr-local')\n , AjaxBasedTransport = require('./lib/ajax-based')\n ;\n\nfunction HtmlFileTransport(transUrl) {\n if (!HtmlfileReceiver.enabled) {\n throw new Error('Transport created when disabled');\n }\n AjaxBasedTransport.call(this, transUrl, '/htmlfile', HtmlfileReceiver, XHRLocalObject);\n}\n\ninherits(HtmlFileTransport, AjaxBasedTransport);\n\nHtmlFileTransport.enabled = function(info) {\n return HtmlfileReceiver.enabled && info.sameOrigin;\n};\n\nHtmlFileTransport.transportName = 'htmlfile';\nHtmlFileTransport.roundTrips = 2;\n\nmodule.exports = HtmlFileTransport;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/transport/htmlfile.js\n// module id = ./node_modules/sockjs-client/lib/transport/htmlfile.js\n// module chunks = 0","'use strict';\n\n// Few cool transports do work only for same-origin. In order to make\n// them work cross-domain we shall use iframe, served from the\n// remote domain. New browsers have capabilities to communicate with\n// cross domain iframe using postMessage(). In IE it was implemented\n// from IE 8+, but of course, IE got some details wrong:\n// http://msdn.microsoft.com/en-us/library/cc197015(v=VS.85).aspx\n// http://stevesouders.com/misc/test-postmessage.php\n\nvar inherits = require('inherits')\n , JSON3 = require('json3')\n , EventEmitter = require('events').EventEmitter\n , version = require('../version')\n , urlUtils = require('../utils/url')\n , iframeUtils = require('../utils/iframe')\n , eventUtils = require('../utils/event')\n , random = require('../utils/random')\n ;\n\nvar debug = function() {};\nif (process.env.NODE_ENV !== 'production') {\n debug = require('debug')('sockjs-client:transport:iframe');\n}\n\nfunction IframeTransport(transport, transUrl, baseUrl) {\n if (!IframeTransport.enabled()) {\n throw new Error('Transport created when disabled');\n }\n EventEmitter.call(this);\n\n var self = this;\n this.origin = urlUtils.getOrigin(baseUrl);\n this.baseUrl = baseUrl;\n this.transUrl = transUrl;\n this.transport = transport;\n this.windowId = random.string(8);\n\n var iframeUrl = urlUtils.addPath(baseUrl, '/iframe.html') + '#' + this.windowId;\n debug(transport, transUrl, iframeUrl);\n\n this.iframeObj = iframeUtils.createIframe(iframeUrl, function(r) {\n debug('err callback');\n self.emit('close', 1006, 'Unable to load an iframe (' + r + ')');\n self.close();\n });\n\n this.onmessageCallback = this._message.bind(this);\n eventUtils.attachEvent('message', this.onmessageCallback);\n}\n\ninherits(IframeTransport, EventEmitter);\n\nIframeTransport.prototype.close = function() {\n debug('close');\n this.removeAllListeners();\n if (this.iframeObj) {\n eventUtils.detachEvent('message', this.onmessageCallback);\n try {\n // When the iframe is not loaded, IE raises an exception\n // on 'contentWindow'.\n this.postMessage('c');\n } catch (x) {\n // intentionally empty\n }\n this.iframeObj.cleanup();\n this.iframeObj = null;\n this.onmessageCallback = this.iframeObj = null;\n }\n};\n\nIframeTransport.prototype._message = function(e) {\n debug('message', e.data);\n if (!urlUtils.isOriginEqual(e.origin, this.origin)) {\n debug('not same origin', e.origin, this.origin);\n return;\n }\n\n var iframeMessage;\n try {\n iframeMessage = JSON3.parse(e.data);\n } catch (ignored) {\n debug('bad json', e.data);\n return;\n }\n\n if (iframeMessage.windowId !== this.windowId) {\n debug('mismatched window id', iframeMessage.windowId, this.windowId);\n return;\n }\n\n switch (iframeMessage.type) {\n case 's':\n this.iframeObj.loaded();\n // window global dependency\n this.postMessage('s', JSON3.stringify([\n version\n , this.transport\n , this.transUrl\n , this.baseUrl\n ]));\n break;\n case 't':\n this.emit('message', iframeMessage.data);\n break;\n case 'c':\n var cdata;\n try {\n cdata = JSON3.parse(iframeMessage.data);\n } catch (ignored) {\n debug('bad json', iframeMessage.data);\n return;\n }\n this.emit('close', cdata[0], cdata[1]);\n this.close();\n break;\n }\n};\n\nIframeTransport.prototype.postMessage = function(type, data) {\n debug('postMessage', type, data);\n this.iframeObj.post(JSON3.stringify({\n windowId: this.windowId\n , type: type\n , data: data || ''\n }), this.origin);\n};\n\nIframeTransport.prototype.send = function(message) {\n debug('send', message);\n this.postMessage('m', message);\n};\n\nIframeTransport.enabled = function() {\n return iframeUtils.iframeEnabled;\n};\n\nIframeTransport.transportName = 'iframe';\nIframeTransport.roundTrips = 2;\n\nmodule.exports = IframeTransport;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/transport/iframe.js\n// module id = ./node_modules/sockjs-client/lib/transport/iframe.js\n// module chunks = 0","'use strict';\n\n// The simplest and most robust transport, using the well-know cross\n// domain hack - JSONP. This transport is quite inefficient - one\n// message could use up to one http request. But at least it works almost\n// everywhere.\n// Known limitations:\n// o you will get a spinning cursor\n// o for Konqueror a dumb timer is needed to detect errors\n\nvar inherits = require('inherits')\n , SenderReceiver = require('./lib/sender-receiver')\n , JsonpReceiver = require('./receiver/jsonp')\n , jsonpSender = require('./sender/jsonp')\n ;\n\nfunction JsonPTransport(transUrl) {\n if (!JsonPTransport.enabled()) {\n throw new Error('Transport created when disabled');\n }\n SenderReceiver.call(this, transUrl, '/jsonp', jsonpSender, JsonpReceiver);\n}\n\ninherits(JsonPTransport, SenderReceiver);\n\nJsonPTransport.enabled = function() {\n return !!global.document;\n};\n\nJsonPTransport.transportName = 'jsonp-polling';\nJsonPTransport.roundTrips = 1;\nJsonPTransport.needBody = true;\n\nmodule.exports = JsonPTransport;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/transport/jsonp-polling.js\n// module id = ./node_modules/sockjs-client/lib/transport/jsonp-polling.js\n// module chunks = 0","'use strict';\n\nvar inherits = require('inherits')\n , urlUtils = require('../../utils/url')\n , SenderReceiver = require('./sender-receiver')\n ;\n\nvar debug = function() {};\nif (process.env.NODE_ENV !== 'production') {\n debug = require('debug')('sockjs-client:ajax-based');\n}\n\nfunction createAjaxSender(AjaxObject) {\n return function(url, payload, callback) {\n debug('create ajax sender', url, payload);\n var opt = {};\n if (typeof payload === 'string') {\n opt.headers = {'Content-type': 'text/plain'};\n }\n var ajaxUrl = urlUtils.addPath(url, '/xhr_send');\n var xo = new AjaxObject('POST', ajaxUrl, payload, opt);\n xo.once('finish', function(status) {\n debug('finish', status);\n xo = null;\n\n if (status !== 200 && status !== 204) {\n return callback(new Error('http status ' + status));\n }\n callback();\n });\n return function() {\n debug('abort');\n xo.close();\n xo = null;\n\n var err = new Error('Aborted');\n err.code = 1000;\n callback(err);\n };\n };\n}\n\nfunction AjaxBasedTransport(transUrl, urlSuffix, Receiver, AjaxObject) {\n SenderReceiver.call(this, transUrl, urlSuffix, createAjaxSender(AjaxObject), Receiver, AjaxObject);\n}\n\ninherits(AjaxBasedTransport, SenderReceiver);\n\nmodule.exports = AjaxBasedTransport;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/transport/lib/ajax-based.js\n// module id = ./node_modules/sockjs-client/lib/transport/lib/ajax-based.js\n// module chunks = 0","'use strict';\n\nvar inherits = require('inherits')\n , EventEmitter = require('events').EventEmitter\n ;\n\nvar debug = function() {};\nif (process.env.NODE_ENV !== 'production') {\n debug = require('debug')('sockjs-client:buffered-sender');\n}\n\nfunction BufferedSender(url, sender) {\n debug(url);\n EventEmitter.call(this);\n this.sendBuffer = [];\n this.sender = sender;\n this.url = url;\n}\n\ninherits(BufferedSender, EventEmitter);\n\nBufferedSender.prototype.send = function(message) {\n debug('send', message);\n this.sendBuffer.push(message);\n if (!this.sendStop) {\n this.sendSchedule();\n }\n};\n\n// For polling transports in a situation when in the message callback,\n// new message is being send. If the sending connection was started\n// before receiving one, it is possible to saturate the network and\n// timeout due to the lack of receiving socket. To avoid that we delay\n// sending messages by some small time, in order to let receiving\n// connection be started beforehand. This is only a halfmeasure and\n// does not fix the big problem, but it does make the tests go more\n// stable on slow networks.\nBufferedSender.prototype.sendScheduleWait = function() {\n debug('sendScheduleWait');\n var self = this;\n var tref;\n this.sendStop = function() {\n debug('sendStop');\n self.sendStop = null;\n clearTimeout(tref);\n };\n tref = setTimeout(function() {\n debug('timeout');\n self.sendStop = null;\n self.sendSchedule();\n }, 25);\n};\n\nBufferedSender.prototype.sendSchedule = function() {\n debug('sendSchedule', this.sendBuffer.length);\n var self = this;\n if (this.sendBuffer.length > 0) {\n var payload = '[' + this.sendBuffer.join(',') + ']';\n this.sendStop = this.sender(this.url, payload, function(err) {\n self.sendStop = null;\n if (err) {\n debug('error', err);\n self.emit('close', err.code || 1006, 'Sending error: ' + err);\n self.close();\n } else {\n self.sendScheduleWait();\n }\n });\n this.sendBuffer = [];\n }\n};\n\nBufferedSender.prototype._cleanup = function() {\n debug('_cleanup');\n this.removeAllListeners();\n};\n\nBufferedSender.prototype.close = function() {\n debug('close');\n this._cleanup();\n if (this.sendStop) {\n this.sendStop();\n this.sendStop = null;\n }\n};\n\nmodule.exports = BufferedSender;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/transport/lib/buffered-sender.js\n// module id = ./node_modules/sockjs-client/lib/transport/lib/buffered-sender.js\n// module chunks = 0","'use strict';\n\nvar inherits = require('inherits')\n , IframeTransport = require('../iframe')\n , objectUtils = require('../../utils/object')\n ;\n\nmodule.exports = function(transport) {\n\n function IframeWrapTransport(transUrl, baseUrl) {\n IframeTransport.call(this, transport.transportName, transUrl, baseUrl);\n }\n\n inherits(IframeWrapTransport, IframeTransport);\n\n IframeWrapTransport.enabled = function(url, info) {\n if (!global.document) {\n return false;\n }\n\n var iframeInfo = objectUtils.extend({}, info);\n iframeInfo.sameOrigin = true;\n return transport.enabled(iframeInfo) && IframeTransport.enabled();\n };\n\n IframeWrapTransport.transportName = 'iframe-' + transport.transportName;\n IframeWrapTransport.needBody = true;\n IframeWrapTransport.roundTrips = IframeTransport.roundTrips + transport.roundTrips - 1; // html, javascript (2) + transport - no CORS (1)\n\n IframeWrapTransport.facadeTransport = transport;\n\n return IframeWrapTransport;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/transport/lib/iframe-wrap.js\n// module id = ./node_modules/sockjs-client/lib/transport/lib/iframe-wrap.js\n// module chunks = 0","'use strict';\n\nvar inherits = require('inherits')\n , EventEmitter = require('events').EventEmitter\n ;\n\nvar debug = function() {};\nif (process.env.NODE_ENV !== 'production') {\n debug = require('debug')('sockjs-client:polling');\n}\n\nfunction Polling(Receiver, receiveUrl, AjaxObject) {\n debug(receiveUrl);\n EventEmitter.call(this);\n this.Receiver = Receiver;\n this.receiveUrl = receiveUrl;\n this.AjaxObject = AjaxObject;\n this._scheduleReceiver();\n}\n\ninherits(Polling, EventEmitter);\n\nPolling.prototype._scheduleReceiver = function() {\n debug('_scheduleReceiver');\n var self = this;\n var poll = this.poll = new this.Receiver(this.receiveUrl, this.AjaxObject);\n\n poll.on('message', function(msg) {\n debug('message', msg);\n self.emit('message', msg);\n });\n\n poll.once('close', function(code, reason) {\n debug('close', code, reason, self.pollIsClosing);\n self.poll = poll = null;\n\n if (!self.pollIsClosing) {\n if (reason === 'network') {\n self._scheduleReceiver();\n } else {\n self.emit('close', code || 1006, reason);\n self.removeAllListeners();\n }\n }\n });\n};\n\nPolling.prototype.abort = function() {\n debug('abort');\n this.removeAllListeners();\n this.pollIsClosing = true;\n if (this.poll) {\n this.poll.abort();\n }\n};\n\nmodule.exports = Polling;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/transport/lib/polling.js\n// module id = ./node_modules/sockjs-client/lib/transport/lib/polling.js\n// module chunks = 0","'use strict';\n\nvar inherits = require('inherits')\n , urlUtils = require('../../utils/url')\n , BufferedSender = require('./buffered-sender')\n , Polling = require('./polling')\n ;\n\nvar debug = function() {};\nif (process.env.NODE_ENV !== 'production') {\n debug = require('debug')('sockjs-client:sender-receiver');\n}\n\nfunction SenderReceiver(transUrl, urlSuffix, senderFunc, Receiver, AjaxObject) {\n var pollUrl = urlUtils.addPath(transUrl, urlSuffix);\n debug(pollUrl);\n var self = this;\n BufferedSender.call(this, transUrl, senderFunc);\n\n this.poll = new Polling(Receiver, pollUrl, AjaxObject);\n this.poll.on('message', function(msg) {\n debug('poll message', msg);\n self.emit('message', msg);\n });\n this.poll.once('close', function(code, reason) {\n debug('poll close', code, reason);\n self.poll = null;\n self.emit('close', code, reason);\n self.close();\n });\n}\n\ninherits(SenderReceiver, BufferedSender);\n\nSenderReceiver.prototype.close = function() {\n BufferedSender.prototype.close.call(this);\n debug('close');\n this.removeAllListeners();\n if (this.poll) {\n this.poll.abort();\n this.poll = null;\n }\n};\n\nmodule.exports = SenderReceiver;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/transport/lib/sender-receiver.js\n// module id = ./node_modules/sockjs-client/lib/transport/lib/sender-receiver.js\n// module chunks = 0","'use strict';\n\nvar inherits = require('inherits')\n , EventEmitter = require('events').EventEmitter\n , EventSourceDriver = require('eventsource')\n ;\n\nvar debug = function() {};\nif (process.env.NODE_ENV !== 'production') {\n debug = require('debug')('sockjs-client:receiver:eventsource');\n}\n\nfunction EventSourceReceiver(url) {\n debug(url);\n EventEmitter.call(this);\n\n var self = this;\n var es = this.es = new EventSourceDriver(url);\n es.onmessage = function(e) {\n debug('message', e.data);\n self.emit('message', decodeURI(e.data));\n };\n es.onerror = function(e) {\n debug('error', es.readyState, e);\n // ES on reconnection has readyState = 0 or 1.\n // on network error it's CLOSED = 2\n var reason = (es.readyState !== 2 ? 'network' : 'permanent');\n self._cleanup();\n self._close(reason);\n };\n}\n\ninherits(EventSourceReceiver, EventEmitter);\n\nEventSourceReceiver.prototype.abort = function() {\n debug('abort');\n this._cleanup();\n this._close('user');\n};\n\nEventSourceReceiver.prototype._cleanup = function() {\n debug('cleanup');\n var es = this.es;\n if (es) {\n es.onmessage = es.onerror = null;\n es.close();\n this.es = null;\n }\n};\n\nEventSourceReceiver.prototype._close = function(reason) {\n debug('close', reason);\n var self = this;\n // Safari and chrome < 15 crash if we close window before\n // waiting for ES cleanup. See:\n // https://code.google.com/p/chromium/issues/detail?id=89155\n setTimeout(function() {\n self.emit('close', null, reason);\n self.removeAllListeners();\n }, 200);\n};\n\nmodule.exports = EventSourceReceiver;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/transport/receiver/eventsource.js\n// module id = ./node_modules/sockjs-client/lib/transport/receiver/eventsource.js\n// module chunks = 0","'use strict';\n\nvar inherits = require('inherits')\n , iframeUtils = require('../../utils/iframe')\n , urlUtils = require('../../utils/url')\n , EventEmitter = require('events').EventEmitter\n , random = require('../../utils/random')\n ;\n\nvar debug = function() {};\nif (process.env.NODE_ENV !== 'production') {\n debug = require('debug')('sockjs-client:receiver:htmlfile');\n}\n\nfunction HtmlfileReceiver(url) {\n debug(url);\n EventEmitter.call(this);\n var self = this;\n iframeUtils.polluteGlobalNamespace();\n\n this.id = 'a' + random.string(6);\n url = urlUtils.addQuery(url, 'c=' + decodeURIComponent(iframeUtils.WPrefix + '.' + this.id));\n\n debug('using htmlfile', HtmlfileReceiver.htmlfileEnabled);\n var constructFunc = HtmlfileReceiver.htmlfileEnabled ?\n iframeUtils.createHtmlfile : iframeUtils.createIframe;\n\n global[iframeUtils.WPrefix][this.id] = {\n start: function() {\n debug('start');\n self.iframeObj.loaded();\n }\n , message: function(data) {\n debug('message', data);\n self.emit('message', data);\n }\n , stop: function() {\n debug('stop');\n self._cleanup();\n self._close('network');\n }\n };\n this.iframeObj = constructFunc(url, function() {\n debug('callback');\n self._cleanup();\n self._close('permanent');\n });\n}\n\ninherits(HtmlfileReceiver, EventEmitter);\n\nHtmlfileReceiver.prototype.abort = function() {\n debug('abort');\n this._cleanup();\n this._close('user');\n};\n\nHtmlfileReceiver.prototype._cleanup = function() {\n debug('_cleanup');\n if (this.iframeObj) {\n this.iframeObj.cleanup();\n this.iframeObj = null;\n }\n delete global[iframeUtils.WPrefix][this.id];\n};\n\nHtmlfileReceiver.prototype._close = function(reason) {\n debug('_close', reason);\n this.emit('close', null, reason);\n this.removeAllListeners();\n};\n\nHtmlfileReceiver.htmlfileEnabled = false;\n\n// obfuscate to avoid firewalls\nvar axo = ['Active'].concat('Object').join('X');\nif (axo in global) {\n try {\n HtmlfileReceiver.htmlfileEnabled = !!new global[axo]('htmlfile');\n } catch (x) {\n // intentionally empty\n }\n}\n\nHtmlfileReceiver.enabled = HtmlfileReceiver.htmlfileEnabled || iframeUtils.iframeEnabled;\n\nmodule.exports = HtmlfileReceiver;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/transport/receiver/htmlfile.js\n// module id = ./node_modules/sockjs-client/lib/transport/receiver/htmlfile.js\n// module chunks = 0","'use strict';\n\nvar utils = require('../../utils/iframe')\n , random = require('../../utils/random')\n , browser = require('../../utils/browser')\n , urlUtils = require('../../utils/url')\n , inherits = require('inherits')\n , EventEmitter = require('events').EventEmitter\n ;\n\nvar debug = function() {};\nif (process.env.NODE_ENV !== 'production') {\n debug = require('debug')('sockjs-client:receiver:jsonp');\n}\n\nfunction JsonpReceiver(url) {\n debug(url);\n var self = this;\n EventEmitter.call(this);\n\n utils.polluteGlobalNamespace();\n\n this.id = 'a' + random.string(6);\n var urlWithId = urlUtils.addQuery(url, 'c=' + encodeURIComponent(utils.WPrefix + '.' + this.id));\n\n global[utils.WPrefix][this.id] = this._callback.bind(this);\n this._createScript(urlWithId);\n\n // Fallback mostly for Konqueror - stupid timer, 35 seconds shall be plenty.\n this.timeoutId = setTimeout(function() {\n debug('timeout');\n self._abort(new Error('JSONP script loaded abnormally (timeout)'));\n }, JsonpReceiver.timeout);\n}\n\ninherits(JsonpReceiver, EventEmitter);\n\nJsonpReceiver.prototype.abort = function() {\n debug('abort');\n if (global[utils.WPrefix][this.id]) {\n var err = new Error('JSONP user aborted read');\n err.code = 1000;\n this._abort(err);\n }\n};\n\nJsonpReceiver.timeout = 35000;\nJsonpReceiver.scriptErrorTimeout = 1000;\n\nJsonpReceiver.prototype._callback = function(data) {\n debug('_callback', data);\n this._cleanup();\n\n if (this.aborting) {\n return;\n }\n\n if (data) {\n debug('message', data);\n this.emit('message', data);\n }\n this.emit('close', null, 'network');\n this.removeAllListeners();\n};\n\nJsonpReceiver.prototype._abort = function(err) {\n debug('_abort', err);\n this._cleanup();\n this.aborting = true;\n this.emit('close', err.code, err.message);\n this.removeAllListeners();\n};\n\nJsonpReceiver.prototype._cleanup = function() {\n debug('_cleanup');\n clearTimeout(this.timeoutId);\n if (this.script2) {\n this.script2.parentNode.removeChild(this.script2);\n this.script2 = null;\n }\n if (this.script) {\n var script = this.script;\n // Unfortunately, you can't really abort script loading of\n // the script.\n script.parentNode.removeChild(script);\n script.onreadystatechange = script.onerror =\n script.onload = script.onclick = null;\n this.script = null;\n }\n delete global[utils.WPrefix][this.id];\n};\n\nJsonpReceiver.prototype._scriptError = function() {\n debug('_scriptError');\n var self = this;\n if (this.errorTimer) {\n return;\n }\n\n this.errorTimer = setTimeout(function() {\n if (!self.loadedOkay) {\n self._abort(new Error('JSONP script loaded abnormally (onerror)'));\n }\n }, JsonpReceiver.scriptErrorTimeout);\n};\n\nJsonpReceiver.prototype._createScript = function(url) {\n debug('_createScript', url);\n var self = this;\n var script = this.script = global.document.createElement('script');\n var script2; // Opera synchronous load trick.\n\n script.id = 'a' + random.string(8);\n script.src = url;\n script.type = 'text/javascript';\n script.charset = 'UTF-8';\n script.onerror = this._scriptError.bind(this);\n script.onload = function() {\n debug('onload');\n self._abort(new Error('JSONP script loaded abnormally (onload)'));\n };\n\n // IE9 fires 'error' event after onreadystatechange or before, in random order.\n // Use loadedOkay to determine if actually errored\n script.onreadystatechange = function() {\n debug('onreadystatechange', script.readyState);\n if (/loaded|closed/.test(script.readyState)) {\n if (script && script.htmlFor && script.onclick) {\n self.loadedOkay = true;\n try {\n // In IE, actually execute the script.\n script.onclick();\n } catch (x) {\n // intentionally empty\n }\n }\n if (script) {\n self._abort(new Error('JSONP script loaded abnormally (onreadystatechange)'));\n }\n }\n };\n // IE: event/htmlFor/onclick trick.\n // One can't rely on proper order for onreadystatechange. In order to\n // make sure, set a 'htmlFor' and 'event' properties, so that\n // script code will be installed as 'onclick' handler for the\n // script object. Later, onreadystatechange, manually execute this\n // code. FF and Chrome doesn't work with 'event' and 'htmlFor'\n // set. For reference see:\n // http://jaubourg.net/2010/07/loading-script-as-onclick-handler-of.html\n // Also, read on that about script ordering:\n // http://wiki.whatwg.org/wiki/Dynamic_Script_Execution_Order\n if (typeof script.async === 'undefined' && global.document.attachEvent) {\n // According to mozilla docs, in recent browsers script.async defaults\n // to 'true', so we may use it to detect a good browser:\n // https://developer.mozilla.org/en/HTML/Element/script\n if (!browser.isOpera()) {\n // Naively assume we're in IE\n try {\n script.htmlFor = script.id;\n script.event = 'onclick';\n } catch (x) {\n // intentionally empty\n }\n script.async = true;\n } else {\n // Opera, second sync script hack\n script2 = this.script2 = global.document.createElement('script');\n script2.text = \"try{var a = document.getElementById('\" + script.id + \"'); if(a)a.onerror();}catch(x){};\";\n script.async = script2.async = false;\n }\n }\n if (typeof script.async !== 'undefined') {\n script.async = true;\n }\n\n var head = global.document.getElementsByTagName('head')[0];\n head.insertBefore(script, head.firstChild);\n if (script2) {\n head.insertBefore(script2, head.firstChild);\n }\n};\n\nmodule.exports = JsonpReceiver;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/transport/receiver/jsonp.js\n// module id = ./node_modules/sockjs-client/lib/transport/receiver/jsonp.js\n// module chunks = 0","'use strict';\n\nvar inherits = require('inherits')\n , EventEmitter = require('events').EventEmitter\n ;\n\nvar debug = function() {};\nif (process.env.NODE_ENV !== 'production') {\n debug = require('debug')('sockjs-client:receiver:xhr');\n}\n\nfunction XhrReceiver(url, AjaxObject) {\n debug(url);\n EventEmitter.call(this);\n var self = this;\n\n this.bufferPosition = 0;\n\n this.xo = new AjaxObject('POST', url, null);\n this.xo.on('chunk', this._chunkHandler.bind(this));\n this.xo.once('finish', function(status, text) {\n debug('finish', status, text);\n self._chunkHandler(status, text);\n self.xo = null;\n var reason = status === 200 ? 'network' : 'permanent';\n debug('close', reason);\n self.emit('close', null, reason);\n self._cleanup();\n });\n}\n\ninherits(XhrReceiver, EventEmitter);\n\nXhrReceiver.prototype._chunkHandler = function(status, text) {\n debug('_chunkHandler', status);\n if (status !== 200 || !text) {\n return;\n }\n\n for (var idx = -1; ; this.bufferPosition += idx + 1) {\n var buf = text.slice(this.bufferPosition);\n idx = buf.indexOf('\\n');\n if (idx === -1) {\n break;\n }\n var msg = buf.slice(0, idx);\n if (msg) {\n debug('message', msg);\n this.emit('message', msg);\n }\n }\n};\n\nXhrReceiver.prototype._cleanup = function() {\n debug('_cleanup');\n this.removeAllListeners();\n};\n\nXhrReceiver.prototype.abort = function() {\n debug('abort');\n if (this.xo) {\n this.xo.close();\n debug('close');\n this.emit('close', null, 'user');\n this.xo = null;\n }\n this._cleanup();\n};\n\nmodule.exports = XhrReceiver;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/transport/receiver/xhr.js\n// module id = ./node_modules/sockjs-client/lib/transport/receiver/xhr.js\n// module chunks = 0","'use strict';\n\nvar random = require('../../utils/random')\n , urlUtils = require('../../utils/url')\n ;\n\nvar debug = function() {};\nif (process.env.NODE_ENV !== 'production') {\n debug = require('debug')('sockjs-client:sender:jsonp');\n}\n\nvar form, area;\n\nfunction createIframe(id) {\n debug('createIframe', id);\n try {\n // ie6 dynamic iframes with target=\"\" support (thanks Chris Lambacher)\n return global.document.createElement('<iframe name=\"' + id + '\">');\n } catch (x) {\n var iframe = global.document.createElement('iframe');\n iframe.name = id;\n return iframe;\n }\n}\n\nfunction createForm() {\n debug('createForm');\n form = global.document.createElement('form');\n form.style.display = 'none';\n form.style.position = 'absolute';\n form.method = 'POST';\n form.enctype = 'application/x-www-form-urlencoded';\n form.acceptCharset = 'UTF-8';\n\n area = global.document.createElement('textarea');\n area.name = 'd';\n form.appendChild(area);\n\n global.document.body.appendChild(form);\n}\n\nmodule.exports = function(url, payload, callback) {\n debug(url, payload);\n if (!form) {\n createForm();\n }\n var id = 'a' + random.string(8);\n form.target = id;\n form.action = urlUtils.addQuery(urlUtils.addPath(url, '/jsonp_send'), 'i=' + id);\n\n var iframe = createIframe(id);\n iframe.id = id;\n iframe.style.display = 'none';\n form.appendChild(iframe);\n\n try {\n area.value = payload;\n } catch (e) {\n // seriously broken browsers get here\n }\n form.submit();\n\n var completed = function(err) {\n debug('completed', id, err);\n if (!iframe.onerror) {\n return;\n }\n iframe.onreadystatechange = iframe.onerror = iframe.onload = null;\n // Opera mini doesn't like if we GC iframe\n // immediately, thus this timeout.\n setTimeout(function() {\n debug('cleaning up', id);\n iframe.parentNode.removeChild(iframe);\n iframe = null;\n }, 500);\n area.value = '';\n // It is not possible to detect if the iframe succeeded or\n // failed to submit our form.\n callback(err);\n };\n iframe.onerror = function() {\n debug('onerror', id);\n completed();\n };\n iframe.onload = function() {\n debug('onload', id);\n completed();\n };\n iframe.onreadystatechange = function(e) {\n debug('onreadystatechange', id, iframe.readyState, e);\n if (iframe.readyState === 'complete') {\n completed();\n }\n };\n return function() {\n debug('aborted', id);\n completed(new Error('Aborted'));\n };\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/transport/sender/jsonp.js\n// module id = ./node_modules/sockjs-client/lib/transport/sender/jsonp.js\n// module chunks = 0","'use strict';\n\nvar EventEmitter = require('events').EventEmitter\n , inherits = require('inherits')\n , eventUtils = require('../../utils/event')\n , browser = require('../../utils/browser')\n , urlUtils = require('../../utils/url')\n ;\n\nvar debug = function() {};\nif (process.env.NODE_ENV !== 'production') {\n debug = require('debug')('sockjs-client:sender:xdr');\n}\n\n// References:\n// http://ajaxian.com/archives/100-line-ajax-wrapper\n// http://msdn.microsoft.com/en-us/library/cc288060(v=VS.85).aspx\n\nfunction XDRObject(method, url, payload) {\n debug(method, url);\n var self = this;\n EventEmitter.call(this);\n\n setTimeout(function() {\n self._start(method, url, payload);\n }, 0);\n}\n\ninherits(XDRObject, EventEmitter);\n\nXDRObject.prototype._start = function(method, url, payload) {\n debug('_start');\n var self = this;\n var xdr = new global.XDomainRequest();\n // IE caches even POSTs\n url = urlUtils.addQuery(url, 't=' + (+new Date()));\n\n xdr.onerror = function() {\n debug('onerror');\n self._error();\n };\n xdr.ontimeout = function() {\n debug('ontimeout');\n self._error();\n };\n xdr.onprogress = function() {\n debug('progress', xdr.responseText);\n self.emit('chunk', 200, xdr.responseText);\n };\n xdr.onload = function() {\n debug('load');\n self.emit('finish', 200, xdr.responseText);\n self._cleanup(false);\n };\n this.xdr = xdr;\n this.unloadRef = eventUtils.unloadAdd(function() {\n self._cleanup(true);\n });\n try {\n // Fails with AccessDenied if port number is bogus\n this.xdr.open(method, url);\n if (this.timeout) {\n this.xdr.timeout = this.timeout;\n }\n this.xdr.send(payload);\n } catch (x) {\n this._error();\n }\n};\n\nXDRObject.prototype._error = function() {\n this.emit('finish', 0, '');\n this._cleanup(false);\n};\n\nXDRObject.prototype._cleanup = function(abort) {\n debug('cleanup', abort);\n if (!this.xdr) {\n return;\n }\n this.removeAllListeners();\n eventUtils.unloadDel(this.unloadRef);\n\n this.xdr.ontimeout = this.xdr.onerror = this.xdr.onprogress = this.xdr.onload = null;\n if (abort) {\n try {\n this.xdr.abort();\n } catch (x) {\n // intentionally empty\n }\n }\n this.unloadRef = this.xdr = null;\n};\n\nXDRObject.prototype.close = function() {\n debug('close');\n this._cleanup(true);\n};\n\n// IE 8/9 if the request target uses the same scheme - #79\nXDRObject.enabled = !!(global.XDomainRequest && browser.hasDomain());\n\nmodule.exports = XDRObject;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/transport/sender/xdr.js\n// module id = ./node_modules/sockjs-client/lib/transport/sender/xdr.js\n// module chunks = 0","'use strict';\n\nvar inherits = require('inherits')\n , XhrDriver = require('../driver/xhr')\n ;\n\nfunction XHRCorsObject(method, url, payload, opts) {\n XhrDriver.call(this, method, url, payload, opts);\n}\n\ninherits(XHRCorsObject, XhrDriver);\n\nXHRCorsObject.enabled = XhrDriver.enabled && XhrDriver.supportsCORS;\n\nmodule.exports = XHRCorsObject;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/transport/sender/xhr-cors.js\n// module id = ./node_modules/sockjs-client/lib/transport/sender/xhr-cors.js\n// module chunks = 0","'use strict';\n\nvar EventEmitter = require('events').EventEmitter\n , inherits = require('inherits')\n ;\n\nfunction XHRFake(/* method, url, payload, opts */) {\n var self = this;\n EventEmitter.call(this);\n\n this.to = setTimeout(function() {\n self.emit('finish', 200, '{}');\n }, XHRFake.timeout);\n}\n\ninherits(XHRFake, EventEmitter);\n\nXHRFake.prototype.close = function() {\n clearTimeout(this.to);\n};\n\nXHRFake.timeout = 2000;\n\nmodule.exports = XHRFake;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/transport/sender/xhr-fake.js\n// module id = ./node_modules/sockjs-client/lib/transport/sender/xhr-fake.js\n// module chunks = 0","'use strict';\n\nvar inherits = require('inherits')\n , XhrDriver = require('../driver/xhr')\n ;\n\nfunction XHRLocalObject(method, url, payload /*, opts */) {\n XhrDriver.call(this, method, url, payload, {\n noCredentials: true\n });\n}\n\ninherits(XHRLocalObject, XhrDriver);\n\nXHRLocalObject.enabled = XhrDriver.enabled;\n\nmodule.exports = XHRLocalObject;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/transport/sender/xhr-local.js\n// module id = ./node_modules/sockjs-client/lib/transport/sender/xhr-local.js\n// module chunks = 0","'use strict';\n\nvar utils = require('../utils/event')\n , urlUtils = require('../utils/url')\n , inherits = require('inherits')\n , EventEmitter = require('events').EventEmitter\n , WebsocketDriver = require('./driver/websocket')\n ;\n\nvar debug = function() {};\nif (process.env.NODE_ENV !== 'production') {\n debug = require('debug')('sockjs-client:websocket');\n}\n\nfunction WebSocketTransport(transUrl, ignore, options) {\n if (!WebSocketTransport.enabled()) {\n throw new Error('Transport created when disabled');\n }\n\n EventEmitter.call(this);\n debug('constructor', transUrl);\n\n var self = this;\n var url = urlUtils.addPath(transUrl, '/websocket');\n if (url.slice(0, 5) === 'https') {\n url = 'wss' + url.slice(5);\n } else {\n url = 'ws' + url.slice(4);\n }\n this.url = url;\n\n this.ws = new WebsocketDriver(this.url, [], options);\n this.ws.onmessage = function(e) {\n debug('message event', e.data);\n self.emit('message', e.data);\n };\n // Firefox has an interesting bug. If a websocket connection is\n // created after onunload, it stays alive even when user\n // navigates away from the page. In such situation let's lie -\n // let's not open the ws connection at all. See:\n // https://github.com/sockjs/sockjs-client/issues/28\n // https://bugzilla.mozilla.org/show_bug.cgi?id=696085\n this.unloadRef = utils.unloadAdd(function() {\n debug('unload');\n self.ws.close();\n });\n this.ws.onclose = function(e) {\n debug('close event', e.code, e.reason);\n self.emit('close', e.code, e.reason);\n self._cleanup();\n };\n this.ws.onerror = function(e) {\n debug('error event', e);\n self.emit('close', 1006, 'WebSocket connection broken');\n self._cleanup();\n };\n}\n\ninherits(WebSocketTransport, EventEmitter);\n\nWebSocketTransport.prototype.send = function(data) {\n var msg = '[' + data + ']';\n debug('send', msg);\n this.ws.send(msg);\n};\n\nWebSocketTransport.prototype.close = function() {\n debug('close');\n var ws = this.ws;\n this._cleanup();\n if (ws) {\n ws.close();\n }\n};\n\nWebSocketTransport.prototype._cleanup = function() {\n debug('_cleanup');\n var ws = this.ws;\n if (ws) {\n ws.onmessage = ws.onclose = ws.onerror = null;\n }\n utils.unloadDel(this.unloadRef);\n this.unloadRef = this.ws = null;\n this.removeAllListeners();\n};\n\nWebSocketTransport.enabled = function() {\n debug('enabled');\n return !!WebsocketDriver;\n};\nWebSocketTransport.transportName = 'websocket';\n\n// In theory, ws should require 1 round trip. But in chrome, this is\n// not very stable over SSL. Most likely a ws connection requires a\n// separate SSL connection, in which case 2 round trips are an\n// absolute minumum.\nWebSocketTransport.roundTrips = 2;\n\nmodule.exports = WebSocketTransport;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/transport/websocket.js\n// module id = ./node_modules/sockjs-client/lib/transport/websocket.js\n// module chunks = 0","'use strict';\n\nvar inherits = require('inherits')\n , AjaxBasedTransport = require('./lib/ajax-based')\n , XdrStreamingTransport = require('./xdr-streaming')\n , XhrReceiver = require('./receiver/xhr')\n , XDRObject = require('./sender/xdr')\n ;\n\nfunction XdrPollingTransport(transUrl) {\n if (!XDRObject.enabled) {\n throw new Error('Transport created when disabled');\n }\n AjaxBasedTransport.call(this, transUrl, '/xhr', XhrReceiver, XDRObject);\n}\n\ninherits(XdrPollingTransport, AjaxBasedTransport);\n\nXdrPollingTransport.enabled = XdrStreamingTransport.enabled;\nXdrPollingTransport.transportName = 'xdr-polling';\nXdrPollingTransport.roundTrips = 2; // preflight, ajax\n\nmodule.exports = XdrPollingTransport;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/transport/xdr-polling.js\n// module id = ./node_modules/sockjs-client/lib/transport/xdr-polling.js\n// module chunks = 0","'use strict';\n\nvar inherits = require('inherits')\n , AjaxBasedTransport = require('./lib/ajax-based')\n , XhrReceiver = require('./receiver/xhr')\n , XDRObject = require('./sender/xdr')\n ;\n\n// According to:\n// http://stackoverflow.com/questions/1641507/detect-browser-support-for-cross-domain-xmlhttprequests\n// http://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/\n\nfunction XdrStreamingTransport(transUrl) {\n if (!XDRObject.enabled) {\n throw new Error('Transport created when disabled');\n }\n AjaxBasedTransport.call(this, transUrl, '/xhr_streaming', XhrReceiver, XDRObject);\n}\n\ninherits(XdrStreamingTransport, AjaxBasedTransport);\n\nXdrStreamingTransport.enabled = function(info) {\n if (info.cookie_needed || info.nullOrigin) {\n return false;\n }\n return XDRObject.enabled && info.sameScheme;\n};\n\nXdrStreamingTransport.transportName = 'xdr-streaming';\nXdrStreamingTransport.roundTrips = 2; // preflight, ajax\n\nmodule.exports = XdrStreamingTransport;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/transport/xdr-streaming.js\n// module id = ./node_modules/sockjs-client/lib/transport/xdr-streaming.js\n// module chunks = 0","'use strict';\n\nvar inherits = require('inherits')\n , AjaxBasedTransport = require('./lib/ajax-based')\n , XhrReceiver = require('./receiver/xhr')\n , XHRCorsObject = require('./sender/xhr-cors')\n , XHRLocalObject = require('./sender/xhr-local')\n ;\n\nfunction XhrPollingTransport(transUrl) {\n if (!XHRLocalObject.enabled && !XHRCorsObject.enabled) {\n throw new Error('Transport created when disabled');\n }\n AjaxBasedTransport.call(this, transUrl, '/xhr', XhrReceiver, XHRCorsObject);\n}\n\ninherits(XhrPollingTransport, AjaxBasedTransport);\n\nXhrPollingTransport.enabled = function(info) {\n if (info.nullOrigin) {\n return false;\n }\n\n if (XHRLocalObject.enabled && info.sameOrigin) {\n return true;\n }\n return XHRCorsObject.enabled;\n};\n\nXhrPollingTransport.transportName = 'xhr-polling';\nXhrPollingTransport.roundTrips = 2; // preflight, ajax\n\nmodule.exports = XhrPollingTransport;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/transport/xhr-polling.js\n// module id = ./node_modules/sockjs-client/lib/transport/xhr-polling.js\n// module chunks = 0","'use strict';\n\nvar inherits = require('inherits')\n , AjaxBasedTransport = require('./lib/ajax-based')\n , XhrReceiver = require('./receiver/xhr')\n , XHRCorsObject = require('./sender/xhr-cors')\n , XHRLocalObject = require('./sender/xhr-local')\n , browser = require('../utils/browser')\n ;\n\nfunction XhrStreamingTransport(transUrl) {\n if (!XHRLocalObject.enabled && !XHRCorsObject.enabled) {\n throw new Error('Transport created when disabled');\n }\n AjaxBasedTransport.call(this, transUrl, '/xhr_streaming', XhrReceiver, XHRCorsObject);\n}\n\ninherits(XhrStreamingTransport, AjaxBasedTransport);\n\nXhrStreamingTransport.enabled = function(info) {\n if (info.nullOrigin) {\n return false;\n }\n // Opera doesn't support xhr-streaming #60\n // But it might be able to #92\n if (browser.isOpera()) {\n return false;\n }\n\n return XHRCorsObject.enabled;\n};\n\nXhrStreamingTransport.transportName = 'xhr-streaming';\nXhrStreamingTransport.roundTrips = 2; // preflight, ajax\n\n// Safari gets confused when a streaming ajax request is started\n// before onload. This causes the load indicator to spin indefinetely.\n// Only require body when used in a browser\nXhrStreamingTransport.needBody = !!global.document;\n\nmodule.exports = XhrStreamingTransport;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/transport/xhr-streaming.js\n// module id = ./node_modules/sockjs-client/lib/transport/xhr-streaming.js\n// module chunks = 0","'use strict';\n\nif (global.crypto && global.crypto.getRandomValues) {\n module.exports.randomBytes = function(length) {\n var bytes = new Uint8Array(length);\n global.crypto.getRandomValues(bytes);\n return bytes;\n };\n} else {\n module.exports.randomBytes = function(length) {\n var bytes = new Array(length);\n for (var i = 0; i < length; i++) {\n bytes[i] = Math.floor(Math.random() * 256);\n }\n return bytes;\n };\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/utils/browser-crypto.js\n// module id = ./node_modules/sockjs-client/lib/utils/browser-crypto.js\n// module chunks = 0","'use strict';\n\nmodule.exports = {\n isOpera: function() {\n return global.navigator &&\n /opera/i.test(global.navigator.userAgent);\n }\n\n, isKonqueror: function() {\n return global.navigator &&\n /konqueror/i.test(global.navigator.userAgent);\n }\n\n // #187 wrap document.domain in try/catch because of WP8 from file:///\n, hasDomain: function () {\n // non-browser client always has a domain\n if (!global.document) {\n return true;\n }\n\n try {\n return !!global.document.domain;\n } catch (e) {\n return false;\n }\n }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/utils/browser.js\n// module id = ./node_modules/sockjs-client/lib/utils/browser.js\n// module chunks = 0","'use strict';\n\nvar JSON3 = require('json3');\n\n// Some extra characters that Chrome gets wrong, and substitutes with\n// something else on the wire.\n// eslint-disable-next-line no-control-regex\nvar extraEscapable = /[\\x00-\\x1f\\ud800-\\udfff\\ufffe\\uffff\\u0300-\\u0333\\u033d-\\u0346\\u034a-\\u034c\\u0350-\\u0352\\u0357-\\u0358\\u035c-\\u0362\\u0374\\u037e\\u0387\\u0591-\\u05af\\u05c4\\u0610-\\u0617\\u0653-\\u0654\\u0657-\\u065b\\u065d-\\u065e\\u06df-\\u06e2\\u06eb-\\u06ec\\u0730\\u0732-\\u0733\\u0735-\\u0736\\u073a\\u073d\\u073f-\\u0741\\u0743\\u0745\\u0747\\u07eb-\\u07f1\\u0951\\u0958-\\u095f\\u09dc-\\u09dd\\u09df\\u0a33\\u0a36\\u0a59-\\u0a5b\\u0a5e\\u0b5c-\\u0b5d\\u0e38-\\u0e39\\u0f43\\u0f4d\\u0f52\\u0f57\\u0f5c\\u0f69\\u0f72-\\u0f76\\u0f78\\u0f80-\\u0f83\\u0f93\\u0f9d\\u0fa2\\u0fa7\\u0fac\\u0fb9\\u1939-\\u193a\\u1a17\\u1b6b\\u1cda-\\u1cdb\\u1dc0-\\u1dcf\\u1dfc\\u1dfe\\u1f71\\u1f73\\u1f75\\u1f77\\u1f79\\u1f7b\\u1f7d\\u1fbb\\u1fbe\\u1fc9\\u1fcb\\u1fd3\\u1fdb\\u1fe3\\u1feb\\u1fee-\\u1fef\\u1ff9\\u1ffb\\u1ffd\\u2000-\\u2001\\u20d0-\\u20d1\\u20d4-\\u20d7\\u20e7-\\u20e9\\u2126\\u212a-\\u212b\\u2329-\\u232a\\u2adc\\u302b-\\u302c\\uaab2-\\uaab3\\uf900-\\ufa0d\\ufa10\\ufa12\\ufa15-\\ufa1e\\ufa20\\ufa22\\ufa25-\\ufa26\\ufa2a-\\ufa2d\\ufa30-\\ufa6d\\ufa70-\\ufad9\\ufb1d\\ufb1f\\ufb2a-\\ufb36\\ufb38-\\ufb3c\\ufb3e\\ufb40-\\ufb41\\ufb43-\\ufb44\\ufb46-\\ufb4e\\ufff0-\\uffff]/g\n , extraLookup;\n\n// This may be quite slow, so let's delay until user actually uses bad\n// characters.\nvar unrollLookup = function(escapable) {\n var i;\n var unrolled = {};\n var c = [];\n for (i = 0; i < 65536; i++) {\n c.push( String.fromCharCode(i) );\n }\n escapable.lastIndex = 0;\n c.join('').replace(escapable, function(a) {\n unrolled[ a ] = '\\\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n return '';\n });\n escapable.lastIndex = 0;\n return unrolled;\n};\n\n// Quote string, also taking care of unicode characters that browsers\n// often break. Especially, take care of unicode surrogates:\n// http://en.wikipedia.org/wiki/Mapping_of_Unicode_characters#Surrogates\nmodule.exports = {\n quote: function(string) {\n var quoted = JSON3.stringify(string);\n\n // In most cases this should be very fast and good enough.\n extraEscapable.lastIndex = 0;\n if (!extraEscapable.test(quoted)) {\n return quoted;\n }\n\n if (!extraLookup) {\n extraLookup = unrollLookup(extraEscapable);\n }\n\n return quoted.replace(extraEscapable, function(a) {\n return extraLookup[a];\n });\n }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/utils/escape.js\n// module id = ./node_modules/sockjs-client/lib/utils/escape.js\n// module chunks = 0","'use strict';\n\nvar random = require('./random');\n\nvar onUnload = {}\n , afterUnload = false\n // detect google chrome packaged apps because they don't allow the 'unload' event\n , isChromePackagedApp = global.chrome && global.chrome.app && global.chrome.app.runtime\n ;\n\nmodule.exports = {\n attachEvent: function(event, listener) {\n if (typeof global.addEventListener !== 'undefined') {\n global.addEventListener(event, listener, false);\n } else if (global.document && global.attachEvent) {\n // IE quirks.\n // According to: http://stevesouders.com/misc/test-postmessage.php\n // the message gets delivered only to 'document', not 'window'.\n global.document.attachEvent('on' + event, listener);\n // I get 'window' for ie8.\n global.attachEvent('on' + event, listener);\n }\n }\n\n, detachEvent: function(event, listener) {\n if (typeof global.addEventListener !== 'undefined') {\n global.removeEventListener(event, listener, false);\n } else if (global.document && global.detachEvent) {\n global.document.detachEvent('on' + event, listener);\n global.detachEvent('on' + event, listener);\n }\n }\n\n, unloadAdd: function(listener) {\n if (isChromePackagedApp) {\n return null;\n }\n\n var ref = random.string(8);\n onUnload[ref] = listener;\n if (afterUnload) {\n setTimeout(this.triggerUnloadCallbacks, 0);\n }\n return ref;\n }\n\n, unloadDel: function(ref) {\n if (ref in onUnload) {\n delete onUnload[ref];\n }\n }\n\n, triggerUnloadCallbacks: function() {\n for (var ref in onUnload) {\n onUnload[ref]();\n delete onUnload[ref];\n }\n }\n};\n\nvar unloadTriggered = function() {\n if (afterUnload) {\n return;\n }\n afterUnload = true;\n module.exports.triggerUnloadCallbacks();\n};\n\n// 'unload' alone is not reliable in opera within an iframe, but we\n// can't use `beforeunload` as IE fires it on javascript: links.\nif (!isChromePackagedApp) {\n module.exports.attachEvent('unload', unloadTriggered);\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/utils/event.js\n// module id = ./node_modules/sockjs-client/lib/utils/event.js\n// module chunks = 0","'use strict';\n\nvar eventUtils = require('./event')\n , JSON3 = require('json3')\n , browser = require('./browser')\n ;\n\nvar debug = function() {};\nif (process.env.NODE_ENV !== 'production') {\n debug = require('debug')('sockjs-client:utils:iframe');\n}\n\nmodule.exports = {\n WPrefix: '_jp'\n, currentWindowId: null\n\n, polluteGlobalNamespace: function() {\n if (!(module.exports.WPrefix in global)) {\n global[module.exports.WPrefix] = {};\n }\n }\n\n, postMessage: function(type, data) {\n if (global.parent !== global) {\n global.parent.postMessage(JSON3.stringify({\n windowId: module.exports.currentWindowId\n , type: type\n , data: data || ''\n }), '*');\n } else {\n debug('Cannot postMessage, no parent window.', type, data);\n }\n }\n\n, createIframe: function(iframeUrl, errorCallback) {\n var iframe = global.document.createElement('iframe');\n var tref, unloadRef;\n var unattach = function() {\n debug('unattach');\n clearTimeout(tref);\n // Explorer had problems with that.\n try {\n iframe.onload = null;\n } catch (x) {\n // intentionally empty\n }\n iframe.onerror = null;\n };\n var cleanup = function() {\n debug('cleanup');\n if (iframe) {\n unattach();\n // This timeout makes chrome fire onbeforeunload event\n // within iframe. Without the timeout it goes straight to\n // onunload.\n setTimeout(function() {\n if (iframe) {\n iframe.parentNode.removeChild(iframe);\n }\n iframe = null;\n }, 0);\n eventUtils.unloadDel(unloadRef);\n }\n };\n var onerror = function(err) {\n debug('onerror', err);\n if (iframe) {\n cleanup();\n errorCallback(err);\n }\n };\n var post = function(msg, origin) {\n debug('post', msg, origin);\n try {\n // When the iframe is not loaded, IE raises an exception\n // on 'contentWindow'.\n setTimeout(function() {\n if (iframe && iframe.contentWindow) {\n iframe.contentWindow.postMessage(msg, origin);\n }\n }, 0);\n } catch (x) {\n // intentionally empty\n }\n };\n\n iframe.src = iframeUrl;\n iframe.style.display = 'none';\n iframe.style.position = 'absolute';\n iframe.onerror = function() {\n onerror('onerror');\n };\n iframe.onload = function() {\n debug('onload');\n // `onload` is triggered before scripts on the iframe are\n // executed. Give it few seconds to actually load stuff.\n clearTimeout(tref);\n tref = setTimeout(function() {\n onerror('onload timeout');\n }, 2000);\n };\n global.document.body.appendChild(iframe);\n tref = setTimeout(function() {\n onerror('timeout');\n }, 15000);\n unloadRef = eventUtils.unloadAdd(cleanup);\n return {\n post: post\n , cleanup: cleanup\n , loaded: unattach\n };\n }\n\n/* eslint no-undef: \"off\", new-cap: \"off\" */\n, createHtmlfile: function(iframeUrl, errorCallback) {\n var axo = ['Active'].concat('Object').join('X');\n var doc = new global[axo]('htmlfile');\n var tref, unloadRef;\n var iframe;\n var unattach = function() {\n clearTimeout(tref);\n iframe.onerror = null;\n };\n var cleanup = function() {\n if (doc) {\n unattach();\n eventUtils.unloadDel(unloadRef);\n iframe.parentNode.removeChild(iframe);\n iframe = doc = null;\n CollectGarbage();\n }\n };\n var onerror = function(r) {\n debug('onerror', r);\n if (doc) {\n cleanup();\n errorCallback(r);\n }\n };\n var post = function(msg, origin) {\n try {\n // When the iframe is not loaded, IE raises an exception\n // on 'contentWindow'.\n setTimeout(function() {\n if (iframe && iframe.contentWindow) {\n iframe.contentWindow.postMessage(msg, origin);\n }\n }, 0);\n } catch (x) {\n // intentionally empty\n }\n };\n\n doc.open();\n doc.write('<html><s' + 'cript>' +\n 'document.domain=\"' + global.document.domain + '\";' +\n '</s' + 'cript></html>');\n doc.close();\n doc.parentWindow[module.exports.WPrefix] = global[module.exports.WPrefix];\n var c = doc.createElement('div');\n doc.body.appendChild(c);\n iframe = doc.createElement('iframe');\n c.appendChild(iframe);\n iframe.src = iframeUrl;\n iframe.onerror = function() {\n onerror('onerror');\n };\n tref = setTimeout(function() {\n onerror('timeout');\n }, 15000);\n unloadRef = eventUtils.unloadAdd(cleanup);\n return {\n post: post\n , cleanup: cleanup\n , loaded: unattach\n };\n }\n};\n\nmodule.exports.iframeEnabled = false;\nif (global.document) {\n // postMessage misbehaves in konqueror 4.6.5 - the messages are delivered with\n // huge delay, or not at all.\n module.exports.iframeEnabled = (typeof global.postMessage === 'function' ||\n typeof global.postMessage === 'object') && (!browser.isKonqueror());\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/utils/iframe.js\n// module id = ./node_modules/sockjs-client/lib/utils/iframe.js\n// module chunks = 0","'use strict';\n\nvar logObject = {};\n['log', 'debug', 'warn'].forEach(function (level) {\n var levelExists;\n\n try {\n levelExists = global.console && global.console[level] && global.console[level].apply;\n } catch(e) {\n // do nothing\n }\n\n logObject[level] = levelExists ? function () {\n return global.console[level].apply(global.console, arguments);\n } : (level === 'log' ? function () {} : logObject.log);\n});\n\nmodule.exports = logObject;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/utils/log.js\n// module id = ./node_modules/sockjs-client/lib/utils/log.js\n// module chunks = 0","'use strict';\n\nmodule.exports = {\n isObject: function(obj) {\n var type = typeof obj;\n return type === 'function' || type === 'object' && !!obj;\n }\n\n, extend: function(obj) {\n if (!this.isObject(obj)) {\n return obj;\n }\n var source, prop;\n for (var i = 1, length = arguments.length; i < length; i++) {\n source = arguments[i];\n for (prop in source) {\n if (Object.prototype.hasOwnProperty.call(source, prop)) {\n obj[prop] = source[prop];\n }\n }\n }\n return obj;\n }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/utils/object.js\n// module id = ./node_modules/sockjs-client/lib/utils/object.js\n// module chunks = 0","'use strict';\n\n/* global crypto:true */\nvar crypto = require('crypto');\n\n// This string has length 32, a power of 2, so the modulus doesn't introduce a\n// bias.\nvar _randomStringChars = 'abcdefghijklmnopqrstuvwxyz012345';\nmodule.exports = {\n string: function(length) {\n var max = _randomStringChars.length;\n var bytes = crypto.randomBytes(length);\n var ret = [];\n for (var i = 0; i < length; i++) {\n ret.push(_randomStringChars.substr(bytes[i] % max, 1));\n }\n return ret.join('');\n }\n\n, number: function(max) {\n return Math.floor(Math.random() * max);\n }\n\n, numberString: function(max) {\n var t = ('' + (max - 1)).length;\n var p = new Array(t + 1).join('0');\n return (p + this.number(max)).slice(-t);\n }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/utils/random.js\n// module id = ./node_modules/sockjs-client/lib/utils/random.js\n// module chunks = 0","'use strict';\n\nvar debug = function() {};\nif (process.env.NODE_ENV !== 'production') {\n debug = require('debug')('sockjs-client:utils:transport');\n}\n\nmodule.exports = function(availableTransports) {\n return {\n filterToEnabled: function(transportsWhitelist, info) {\n var transports = {\n main: []\n , facade: []\n };\n if (!transportsWhitelist) {\n transportsWhitelist = [];\n } else if (typeof transportsWhitelist === 'string') {\n transportsWhitelist = [transportsWhitelist];\n }\n\n availableTransports.forEach(function(trans) {\n if (!trans) {\n return;\n }\n\n if (trans.transportName === 'websocket' && info.websocket === false) {\n debug('disabled from server', 'websocket');\n return;\n }\n\n if (transportsWhitelist.length &&\n transportsWhitelist.indexOf(trans.transportName) === -1) {\n debug('not in whitelist', trans.transportName);\n return;\n }\n\n if (trans.enabled(info)) {\n debug('enabled', trans.transportName);\n transports.main.push(trans);\n if (trans.facadeTransport) {\n transports.facade.push(trans.facadeTransport);\n }\n } else {\n debug('disabled', trans.transportName);\n }\n });\n return transports;\n }\n };\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/utils/transport.js\n// module id = ./node_modules/sockjs-client/lib/utils/transport.js\n// module chunks = 0","'use strict';\n\nvar URL = require('url-parse');\n\nvar debug = function() {};\nif (process.env.NODE_ENV !== 'production') {\n debug = require('debug')('sockjs-client:utils:url');\n}\n\nmodule.exports = {\n getOrigin: function(url) {\n if (!url) {\n return null;\n }\n\n var p = new URL(url);\n if (p.protocol === 'file:') {\n return null;\n }\n\n var port = p.port;\n if (!port) {\n port = (p.protocol === 'https:') ? '443' : '80';\n }\n\n return p.protocol + '//' + p.hostname + ':' + port;\n }\n\n, isOriginEqual: function(a, b) {\n var res = this.getOrigin(a) === this.getOrigin(b);\n debug('same', a, b, res);\n return res;\n }\n\n, isSchemeEqual: function(a, b) {\n return (a.split(':')[0] === b.split(':')[0]);\n }\n\n, addPath: function (url, path) {\n var qs = url.split('?');\n return qs[0] + path + (qs[1] ? '?' + qs[1] : '');\n }\n\n, addQuery: function (url, q) {\n return url + (url.indexOf('?') === -1 ? ('?' + q) : ('&' + q));\n }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/utils/url.js\n// module id = ./node_modules/sockjs-client/lib/utils/url.js\n// module chunks = 0","module.exports = '1.1.4';\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/lib/version.js\n// module id = ./node_modules/sockjs-client/lib/version.js\n// module chunks = 0","/**\n * This is the web browser implementation of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = require('./debug');\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = 'undefined' != typeof chrome\n && 'undefined' != typeof chrome.storage\n ? chrome.storage.local\n : localstorage();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n 'lightseagreen',\n 'forestgreen',\n 'goldenrod',\n 'dodgerblue',\n 'darkorchid',\n 'crimson'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\nfunction useColors() {\n // NB: In an Electron preload script, document will be defined but not fully\n // initialized. Since we know we're in Chrome, we'll just detect this case\n // explicitly\n if (typeof window !== 'undefined' && window.process && window.process.type === 'renderer') {\n return true;\n }\n\n // is webkit? http://stackoverflow.com/a/16459606/376773\n // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n // is firebug? http://stackoverflow.com/a/398120/376773\n (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n // is firefox >= v31?\n // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31) ||\n // double check webkit in userAgent just in case we are in a worker\n (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nexports.formatters.j = function(v) {\n try {\n return JSON.stringify(v);\n } catch (err) {\n return '[UnexpectedJSONParseError]: ' + err.message;\n }\n};\n\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n var useColors = this.useColors;\n\n args[0] = (useColors ? '%c' : '')\n + this.namespace\n + (useColors ? ' %c' : ' ')\n + args[0]\n + (useColors ? '%c ' : ' ')\n + '+' + exports.humanize(this.diff);\n\n if (!useColors) return;\n\n var c = 'color: ' + this.color;\n args.splice(1, 0, c, 'color: inherit')\n\n // the final \"%c\" is somewhat tricky, because there could be other\n // arguments passed either before or after the %c, so we need to\n // figure out the correct index to insert the CSS into\n var index = 0;\n var lastC = 0;\n args[0].replace(/%[a-zA-Z%]/g, function(match) {\n if ('%%' === match) return;\n index++;\n if ('%c' === match) {\n // we only are interested in the *last* %c\n // (the user may have provided their own)\n lastC = index;\n }\n });\n\n args.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.log()` when available.\n * No-op when `console.log` is not a \"function\".\n *\n * @api public\n */\n\nfunction log() {\n // this hackery is required for IE8/9, where\n // the `console.log` function doesn't have 'apply'\n return 'object' === typeof console\n && console.log\n && Function.prototype.apply.call(console.log, console, arguments);\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\n\nfunction save(namespaces) {\n try {\n if (null == namespaces) {\n exports.storage.removeItem('debug');\n } else {\n exports.storage.debug = namespaces;\n }\n } catch(e) {}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n var r;\n try {\n r = exports.storage.debug;\n } catch(e) {}\n\n // If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n if (!r && typeof process !== 'undefined' && 'env' in process) {\n r = process.env.DEBUG;\n }\n\n return r;\n}\n\n/**\n * Enable namespaces listed in `localStorage.debug` initially.\n */\n\nexports.enable(load());\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n try {\n return window.localStorage;\n } catch (e) {}\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/node_modules/debug/src/browser.js\n// module id = ./node_modules/sockjs-client/node_modules/debug/src/browser.js\n// module chunks = 0","\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n *\n * Expose `debug()` as the module.\n */\n\nexports = module.exports = createDebug.debug = createDebug['default'] = createDebug;\nexports.coerce = coerce;\nexports.disable = disable;\nexports.enable = enable;\nexports.enabled = enabled;\nexports.humanize = require('ms');\n\n/**\n * The currently active debug mode names, and names to skip.\n */\n\nexports.names = [];\nexports.skips = [];\n\n/**\n * Map of special \"%n\" handling functions, for the debug \"format\" argument.\n *\n * Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n */\n\nexports.formatters = {};\n\n/**\n * Previous log timestamp.\n */\n\nvar prevTime;\n\n/**\n * Select a color.\n * @param {String} namespace\n * @return {Number}\n * @api private\n */\n\nfunction selectColor(namespace) {\n var hash = 0, i;\n\n for (i in namespace) {\n hash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n hash |= 0; // Convert to 32bit integer\n }\n\n return exports.colors[Math.abs(hash) % exports.colors.length];\n}\n\n/**\n * Create a debugger with the given `namespace`.\n *\n * @param {String} namespace\n * @return {Function}\n * @api public\n */\n\nfunction createDebug(namespace) {\n\n function debug() {\n // disabled?\n if (!debug.enabled) return;\n\n var self = debug;\n\n // set `diff` timestamp\n var curr = +new Date();\n var ms = curr - (prevTime || curr);\n self.diff = ms;\n self.prev = prevTime;\n self.curr = curr;\n prevTime = curr;\n\n // turn the `arguments` into a proper Array\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i];\n }\n\n args[0] = exports.coerce(args[0]);\n\n if ('string' !== typeof args[0]) {\n // anything else let's inspect with %O\n args.unshift('%O');\n }\n\n // apply any `formatters` transformations\n var index = 0;\n args[0] = args[0].replace(/%([a-zA-Z%])/g, function(match, format) {\n // if we encounter an escaped % then don't increase the array index\n if (match === '%%') return match;\n index++;\n var formatter = exports.formatters[format];\n if ('function' === typeof formatter) {\n var val = args[index];\n match = formatter.call(self, val);\n\n // now we need to remove `args[index]` since it's inlined in the `format`\n args.splice(index, 1);\n index--;\n }\n return match;\n });\n\n // apply env-specific formatting (colors, etc.)\n exports.formatArgs.call(self, args);\n\n var logFn = debug.log || exports.log || console.log.bind(console);\n logFn.apply(self, args);\n }\n\n debug.namespace = namespace;\n debug.enabled = exports.enabled(namespace);\n debug.useColors = exports.useColors();\n debug.color = selectColor(namespace);\n\n // env-specific initialization logic for debug instances\n if ('function' === typeof exports.init) {\n exports.init(debug);\n }\n\n return debug;\n}\n\n/**\n * Enables a debug mode by namespaces. This can include modes\n * separated by a colon and wildcards.\n *\n * @param {String} namespaces\n * @api public\n */\n\nfunction enable(namespaces) {\n exports.save(namespaces);\n\n exports.names = [];\n exports.skips = [];\n\n var split = (typeof namespaces === 'string' ? namespaces : '').split(/[\\s,]+/);\n var len = split.length;\n\n for (var i = 0; i < len; i++) {\n if (!split[i]) continue; // ignore empty strings\n namespaces = split[i].replace(/\\*/g, '.*?');\n if (namespaces[0] === '-') {\n exports.skips.push(new RegExp('^' + namespaces.substr(1) + '$'));\n } else {\n exports.names.push(new RegExp('^' + namespaces + '$'));\n }\n }\n}\n\n/**\n * Disable debug output.\n *\n * @api public\n */\n\nfunction disable() {\n exports.enable('');\n}\n\n/**\n * Returns true if the given mode name is enabled, false otherwise.\n *\n * @param {String} name\n * @return {Boolean}\n * @api public\n */\n\nfunction enabled(name) {\n var i, len;\n for (i = 0, len = exports.skips.length; i < len; i++) {\n if (exports.skips[i].test(name)) {\n return false;\n }\n }\n for (i = 0, len = exports.names.length; i < len; i++) {\n if (exports.names[i].test(name)) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Coerce `val`.\n *\n * @param {Mixed} val\n * @return {Mixed}\n * @api private\n */\n\nfunction coerce(val) {\n if (val instanceof Error) return val.stack || val.message;\n return val;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/sockjs-client/node_modules/debug/src/debug.js\n// module id = ./node_modules/sockjs-client/node_modules/debug/src/debug.js\n// module chunks = 0","'use strict';\nvar argv = process.argv;\n\nvar terminator = argv.indexOf('--');\nvar hasFlag = function (flag) {\n\tflag = '--' + flag;\n\tvar pos = argv.indexOf(flag);\n\treturn pos !== -1 && (terminator !== -1 ? pos < terminator : true);\n};\n\nmodule.exports = (function () {\n\tif ('FORCE_COLOR' in process.env) {\n\t\treturn true;\n\t}\n\n\tif (hasFlag('no-color') ||\n\t\thasFlag('no-colors') ||\n\t\thasFlag('color=false')) {\n\t\treturn false;\n\t}\n\n\tif (hasFlag('color') ||\n\t\thasFlag('colors') ||\n\t\thasFlag('color=true') ||\n\t\thasFlag('color=always')) {\n\t\treturn true;\n\t}\n\n\tif (process.stdout && !process.stdout.isTTY) {\n\t\treturn false;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\treturn true;\n\t}\n\n\tif ('COLORTERM' in process.env) {\n\t\treturn true;\n\t}\n\n\tif (process.env.TERM === 'dumb') {\n\t\treturn false;\n\t}\n\n\tif (/^screen|^xterm|^vt100|color|ansi|cygwin|linux/i.test(process.env.TERM)) {\n\t\treturn true;\n\t}\n\n\treturn false;\n})();\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/supports-color/index.js\n// module id = ./node_modules/supports-color/index.js\n// module chunks = 0","'use strict';\n\nvar required = require('requires-port')\n , qs = require('querystringify')\n , protocolre = /^([a-z][a-z0-9.+-]*:)?(\\/\\/)?([\\S\\s]*)/i\n , slashes = /^[A-Za-z][A-Za-z0-9+-.]*:\\/\\//;\n\n/**\n * These are the parse rules for the URL parser, it informs the parser\n * about:\n *\n * 0. The char it Needs to parse, if it's a string it should be done using\n * indexOf, RegExp using exec and NaN means set as current value.\n * 1. The property we should set when parsing this value.\n * 2. Indication if it's backwards or forward parsing, when set as number it's\n * the value of extra chars that should be split off.\n * 3. Inherit from location if non existing in the parser.\n * 4. `toLowerCase` the resulting value.\n */\nvar rules = [\n ['#', 'hash'], // Extract from the back.\n ['?', 'query'], // Extract from the back.\n ['/', 'pathname'], // Extract from the back.\n ['@', 'auth', 1], // Extract from the front.\n [NaN, 'host', undefined, 1, 1], // Set left over value.\n [/:(\\d+)$/, 'port', undefined, 1], // RegExp the back.\n [NaN, 'hostname', undefined, 1, 1] // Set left over.\n];\n\n/**\n * These properties should not be copied or inherited from. This is only needed\n * for all non blob URL's as a blob URL does not include a hash, only the\n * origin.\n *\n * @type {Object}\n * @private\n */\nvar ignore = { hash: 1, query: 1 };\n\n/**\n * The location object differs when your code is loaded through a normal page,\n * Worker or through a worker using a blob. And with the blobble begins the\n * trouble as the location object will contain the URL of the blob, not the\n * location of the page where our code is loaded in. The actual origin is\n * encoded in the `pathname` so we can thankfully generate a good \"default\"\n * location from it so we can generate proper relative URL's again.\n *\n * @param {Object|String} loc Optional default location object.\n * @returns {Object} lolcation object.\n * @api public\n */\nfunction lolcation(loc) {\n loc = loc || global.location || {};\n\n var finaldestination = {}\n , type = typeof loc\n , key;\n\n if ('blob:' === loc.protocol) {\n finaldestination = new URL(unescape(loc.pathname), {});\n } else if ('string' === type) {\n finaldestination = new URL(loc, {});\n for (key in ignore) delete finaldestination[key];\n } else if ('object' === type) {\n for (key in loc) {\n if (key in ignore) continue;\n finaldestination[key] = loc[key];\n }\n\n if (finaldestination.slashes === undefined) {\n finaldestination.slashes = slashes.test(loc.href);\n }\n }\n\n return finaldestination;\n}\n\n/**\n * @typedef ProtocolExtract\n * @type Object\n * @property {String} protocol Protocol matched in the URL, in lowercase.\n * @property {Boolean} slashes `true` if protocol is followed by \"//\", else `false`.\n * @property {String} rest Rest of the URL that is not part of the protocol.\n */\n\n/**\n * Extract protocol information from a URL with/without double slash (\"//\").\n *\n * @param {String} address URL we want to extract from.\n * @return {ProtocolExtract} Extracted information.\n * @api private\n */\nfunction extractProtocol(address) {\n var match = protocolre.exec(address);\n\n return {\n protocol: match[1] ? match[1].toLowerCase() : '',\n slashes: !!match[2],\n rest: match[3]\n };\n}\n\n/**\n * Resolve a relative URL pathname against a base URL pathname.\n *\n * @param {String} relative Pathname of the relative URL.\n * @param {String} base Pathname of the base URL.\n * @return {String} Resolved pathname.\n * @api private\n */\nfunction resolve(relative, base) {\n var path = (base || '/').split('/').slice(0, -1).concat(relative.split('/'))\n , i = path.length\n , last = path[i - 1]\n , unshift = false\n , up = 0;\n\n while (i--) {\n if (path[i] === '.') {\n path.splice(i, 1);\n } else if (path[i] === '..') {\n path.splice(i, 1);\n up++;\n } else if (up) {\n if (i === 0) unshift = true;\n path.splice(i, 1);\n up--;\n }\n }\n\n if (unshift) path.unshift('');\n if (last === '.' || last === '..') path.push('');\n\n return path.join('/');\n}\n\n/**\n * The actual URL instance. Instead of returning an object we've opted-in to\n * create an actual constructor as it's much more memory efficient and\n * faster and it pleases my OCD.\n *\n * @constructor\n * @param {String} address URL we want to parse.\n * @param {Object|String} location Location defaults for relative paths.\n * @param {Boolean|Function} parser Parser for the query string.\n * @api public\n */\nfunction URL(address, location, parser) {\n if (!(this instanceof URL)) {\n return new URL(address, location, parser);\n }\n\n var relative, extracted, parse, instruction, index, key\n , instructions = rules.slice()\n , type = typeof location\n , url = this\n , i = 0;\n\n //\n // The following if statements allows this module two have compatibility with\n // 2 different API:\n //\n // 1. Node.js's `url.parse` api which accepts a URL, boolean as arguments\n // where the boolean indicates that the query string should also be parsed.\n //\n // 2. The `URL` interface of the browser which accepts a URL, object as\n // arguments. The supplied object will be used as default values / fall-back\n // for relative paths.\n //\n if ('object' !== type && 'string' !== type) {\n parser = location;\n location = null;\n }\n\n if (parser && 'function' !== typeof parser) parser = qs.parse;\n\n location = lolcation(location);\n\n //\n // Extract protocol information before running the instructions.\n //\n extracted = extractProtocol(address || '');\n relative = !extracted.protocol && !extracted.slashes;\n url.slashes = extracted.slashes || relative && location.slashes;\n url.protocol = extracted.protocol || location.protocol || '';\n address = extracted.rest;\n\n //\n // When the authority component is absent the URL starts with a path\n // component.\n //\n if (!extracted.slashes) instructions[2] = [/(.*)/, 'pathname'];\n\n for (; i < instructions.length; i++) {\n instruction = instructions[i];\n parse = instruction[0];\n key = instruction[1];\n\n if (parse !== parse) {\n url[key] = address;\n } else if ('string' === typeof parse) {\n if (~(index = address.indexOf(parse))) {\n if ('number' === typeof instruction[2]) {\n url[key] = address.slice(0, index);\n address = address.slice(index + instruction[2]);\n } else {\n url[key] = address.slice(index);\n address = address.slice(0, index);\n }\n }\n } else if ((index = parse.exec(address))) {\n url[key] = index[1];\n address = address.slice(0, index.index);\n }\n\n url[key] = url[key] || (\n relative && instruction[3] ? location[key] || '' : ''\n );\n\n //\n // Hostname, host and protocol should be lowercased so they can be used to\n // create a proper `origin`.\n //\n if (instruction[4]) url[key] = url[key].toLowerCase();\n }\n\n //\n // Also parse the supplied query string in to an object. If we're supplied\n // with a custom parser as function use that instead of the default build-in\n // parser.\n //\n if (parser) url.query = parser(url.query);\n\n //\n // If the URL is relative, resolve the pathname against the base URL.\n //\n if (\n relative\n && location.slashes\n && url.pathname.charAt(0) !== '/'\n && (url.pathname !== '' || location.pathname !== '')\n ) {\n url.pathname = resolve(url.pathname, location.pathname);\n }\n\n //\n // We should not add port numbers if they are already the default port number\n // for a given protocol. As the host also contains the port number we're going\n // override it with the hostname which contains no port number.\n //\n if (!required(url.port, url.protocol)) {\n url.host = url.hostname;\n url.port = '';\n }\n\n //\n // Parse down the `auth` for the username and password.\n //\n url.username = url.password = '';\n if (url.auth) {\n instruction = url.auth.split(':');\n url.username = instruction[0] || '';\n url.password = instruction[1] || '';\n }\n\n url.origin = url.protocol && url.host && url.protocol !== 'file:'\n ? url.protocol +'//'+ url.host\n : 'null';\n\n //\n // The href is just the compiled result.\n //\n url.href = url.toString();\n}\n\n/**\n * This is convenience method for changing properties in the URL instance to\n * insure that they all propagate correctly.\n *\n * @param {String} part Property we need to adjust.\n * @param {Mixed} value The newly assigned value.\n * @param {Boolean|Function} fn When setting the query, it will be the function\n * used to parse the query.\n * When setting the protocol, double slash will be\n * removed from the final url if it is true.\n * @returns {URL}\n * @api public\n */\nfunction set(part, value, fn) {\n var url = this;\n\n switch (part) {\n case 'query':\n if ('string' === typeof value && value.length) {\n value = (fn || qs.parse)(value);\n }\n\n url[part] = value;\n break;\n\n case 'port':\n url[part] = value;\n\n if (!required(value, url.protocol)) {\n url.host = url.hostname;\n url[part] = '';\n } else if (value) {\n url.host = url.hostname +':'+ value;\n }\n\n break;\n\n case 'hostname':\n url[part] = value;\n\n if (url.port) value += ':'+ url.port;\n url.host = value;\n break;\n\n case 'host':\n url[part] = value;\n\n if (/:\\d+$/.test(value)) {\n value = value.split(':');\n url.port = value.pop();\n url.hostname = value.join(':');\n } else {\n url.hostname = value;\n url.port = '';\n }\n\n break;\n\n case 'protocol':\n url.protocol = value.toLowerCase();\n url.slashes = !fn;\n break;\n\n case 'pathname':\n case 'hash':\n if (value) {\n var char = part === 'pathname' ? '/' : '#';\n url[part] = value.charAt(0) !== char ? char + value : value;\n } else {\n url[part] = value;\n }\n break;\n\n default:\n url[part] = value;\n }\n\n for (var i = 0; i < rules.length; i++) {\n var ins = rules[i];\n\n if (ins[4]) url[ins[1]] = url[ins[1]].toLowerCase();\n }\n\n url.origin = url.protocol && url.host && url.protocol !== 'file:'\n ? url.protocol +'//'+ url.host\n : 'null';\n\n url.href = url.toString();\n\n return url;\n}\n\n/**\n * Transform the properties back in to a valid and full URL string.\n *\n * @param {Function} stringify Optional query stringify function.\n * @returns {String}\n * @api public\n */\nfunction toString(stringify) {\n if (!stringify || 'function' !== typeof stringify) stringify = qs.stringify;\n\n var query\n , url = this\n , protocol = url.protocol;\n\n if (protocol && protocol.charAt(protocol.length - 1) !== ':') protocol += ':';\n\n var result = protocol + (url.slashes ? '//' : '');\n\n if (url.username) {\n result += url.username;\n if (url.password) result += ':'+ url.password;\n result += '@';\n }\n\n result += url.host + url.pathname;\n\n query = 'object' === typeof url.query ? stringify(url.query) : url.query;\n if (query) result += '?' !== query.charAt(0) ? '?'+ query : query;\n\n if (url.hash) result += url.hash;\n\n return result;\n}\n\nURL.prototype = { set: set, toString: toString };\n\n//\n// Expose the URL parser and some additional properties that might be useful for\n// others or testing.\n//\nURL.extractProtocol = extractProtocol;\nURL.location = lolcation;\nURL.qs = qs;\n\nmodule.exports = URL;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/url-parse/index.js\n// module id = ./node_modules/url-parse/index.js\n// module chunks = 0","'use strict';\n\nvar has = Object.prototype.hasOwnProperty;\n\n/**\n * Decode a URI encoded string.\n *\n * @param {String} input The URI encoded string.\n * @returns {String} The decoded string.\n * @api private\n */\nfunction decode(input) {\n return decodeURIComponent(input.replace(/\\+/g, ' '));\n}\n\n/**\n * Simple query string parser.\n *\n * @param {String} query The query string that needs to be parsed.\n * @returns {Object}\n * @api public\n */\nfunction querystring(query) {\n var parser = /([^=?&]+)=?([^&]*)/g\n , result = {}\n , part;\n\n //\n // Little nifty parsing hack, leverage the fact that RegExp.exec increments\n // the lastIndex property so we can continue executing this loop until we've\n // parsed all results.\n //\n for (;\n part = parser.exec(query);\n result[decode(part[1])] = decode(part[2])\n );\n\n return result;\n}\n\n/**\n * Transform a query string to an object.\n *\n * @param {Object} obj Object that should be transformed.\n * @param {String} prefix Optional prefix.\n * @returns {String}\n * @api public\n */\nfunction querystringify(obj, prefix) {\n prefix = prefix || '';\n\n var pairs = [];\n\n //\n // Optionally prefix with a '?' if needed\n //\n if ('string' !== typeof prefix) prefix = '?';\n\n for (var key in obj) {\n if (has.call(obj, key)) {\n pairs.push(encodeURIComponent(key) +'='+ encodeURIComponent(obj[key]));\n }\n }\n\n return pairs.length ? prefix + pairs.join('&') : '';\n}\n\n//\n// Expose the module.\n//\nexports.stringify = querystringify;\nexports.parse = querystring;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/url-parse/node_modules/querystringify/index.js\n// module id = ./node_modules/url-parse/node_modules/querystringify/index.js\n// module chunks = 0","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar punycode = require('punycode');\nvar util = require('./util');\n\nexports.parse = urlParse;\nexports.resolve = urlResolve;\nexports.resolveObject = urlResolveObject;\nexports.format = urlFormat;\n\nexports.Url = Url;\n\nfunction Url() {\n this.protocol = null;\n this.slashes = null;\n this.auth = null;\n this.host = null;\n this.port = null;\n this.hostname = null;\n this.hash = null;\n this.search = null;\n this.query = null;\n this.pathname = null;\n this.path = null;\n this.href = null;\n}\n\n// Reference: RFC 3986, RFC 1808, RFC 2396\n\n// define these here so at least they only have to be\n// compiled once on the first module load.\nvar protocolPattern = /^([a-z0-9.+-]+:)/i,\n portPattern = /:[0-9]*$/,\n\n // Special case for a simple path URL\n simplePathPattern = /^(\\/\\/?(?!\\/)[^\\?\\s]*)(\\?[^\\s]*)?$/,\n\n // RFC 2396: characters reserved for delimiting URLs.\n // We actually just auto-escape these.\n delims = ['<', '>', '\"', '`', ' ', '\\r', '\\n', '\\t'],\n\n // RFC 2396: characters not allowed for various reasons.\n unwise = ['{', '}', '|', '\\\\', '^', '`'].concat(delims),\n\n // Allowed by RFCs, but cause of XSS attacks. Always escape these.\n autoEscape = ['\\''].concat(unwise),\n // Characters that are never ever allowed in a hostname.\n // Note that any invalid chars are also handled, but these\n // are the ones that are *expected* to be seen, so we fast-path\n // them.\n nonHostChars = ['%', '/', '?', ';', '#'].concat(autoEscape),\n hostEndingChars = ['/', '?', '#'],\n hostnameMaxLen = 255,\n hostnamePartPattern = /^[+a-z0-9A-Z_-]{0,63}$/,\n hostnamePartStart = /^([+a-z0-9A-Z_-]{0,63})(.*)$/,\n // protocols that can allow \"unsafe\" and \"unwise\" chars.\n unsafeProtocol = {\n 'javascript': true,\n 'javascript:': true\n },\n // protocols that never have a hostname.\n hostlessProtocol = {\n 'javascript': true,\n 'javascript:': true\n },\n // protocols that always contain a // bit.\n slashedProtocol = {\n 'http': true,\n 'https': true,\n 'ftp': true,\n 'gopher': true,\n 'file': true,\n 'http:': true,\n 'https:': true,\n 'ftp:': true,\n 'gopher:': true,\n 'file:': true\n },\n querystring = require('querystring');\n\nfunction urlParse(url, parseQueryString, slashesDenoteHost) {\n if (url && util.isObject(url) && url instanceof Url) return url;\n\n var u = new Url;\n u.parse(url, parseQueryString, slashesDenoteHost);\n return u;\n}\n\nUrl.prototype.parse = function(url, parseQueryString, slashesDenoteHost) {\n if (!util.isString(url)) {\n throw new TypeError(\"Parameter 'url' must be a string, not \" + typeof url);\n }\n\n // Copy chrome, IE, opera backslash-handling behavior.\n // Back slashes before the query string get converted to forward slashes\n // See: https://code.google.com/p/chromium/issues/detail?id=25916\n var queryIndex = url.indexOf('?'),\n splitter =\n (queryIndex !== -1 && queryIndex < url.indexOf('#')) ? '?' : '#',\n uSplit = url.split(splitter),\n slashRegex = /\\\\/g;\n uSplit[0] = uSplit[0].replace(slashRegex, '/');\n url = uSplit.join(splitter);\n\n var rest = url;\n\n // trim before proceeding.\n // This is to support parse stuff like \" http://foo.com \\n\"\n rest = rest.trim();\n\n if (!slashesDenoteHost && url.split('#').length === 1) {\n // Try fast path regexp\n var simplePath = simplePathPattern.exec(rest);\n if (simplePath) {\n this.path = rest;\n this.href = rest;\n this.pathname = simplePath[1];\n if (simplePath[2]) {\n this.search = simplePath[2];\n if (parseQueryString) {\n this.query = querystring.parse(this.search.substr(1));\n } else {\n this.query = this.search.substr(1);\n }\n } else if (parseQueryString) {\n this.search = '';\n this.query = {};\n }\n return this;\n }\n }\n\n var proto = protocolPattern.exec(rest);\n if (proto) {\n proto = proto[0];\n var lowerProto = proto.toLowerCase();\n this.protocol = lowerProto;\n rest = rest.substr(proto.length);\n }\n\n // figure out if it's got a host\n // user@server is *always* interpreted as a hostname, and url\n // resolution will treat //foo/bar as host=foo,path=bar because that's\n // how the browser resolves relative URLs.\n if (slashesDenoteHost || proto || rest.match(/^\\/\\/[^@\\/]+@[^@\\/]+/)) {\n var slashes = rest.substr(0, 2) === '//';\n if (slashes && !(proto && hostlessProtocol[proto])) {\n rest = rest.substr(2);\n this.slashes = true;\n }\n }\n\n if (!hostlessProtocol[proto] &&\n (slashes || (proto && !slashedProtocol[proto]))) {\n\n // there's a hostname.\n // the first instance of /, ?, ;, or # ends the host.\n //\n // If there is an @ in the hostname, then non-host chars *are* allowed\n // to the left of the last @ sign, unless some host-ending character\n // comes *before* the @-sign.\n // URLs are obnoxious.\n //\n // ex:\n // http://a@b@c/ => user:a@b host:c\n // http://a@b?@c => user:a host:c path:/?@c\n\n // v0.12 TODO(isaacs): This is not quite how Chrome does things.\n // Review our test case against browsers more comprehensively.\n\n // find the first instance of any hostEndingChars\n var hostEnd = -1;\n for (var i = 0; i < hostEndingChars.length; i++) {\n var hec = rest.indexOf(hostEndingChars[i]);\n if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))\n hostEnd = hec;\n }\n\n // at this point, either we have an explicit point where the\n // auth portion cannot go past, or the last @ char is the decider.\n var auth, atSign;\n if (hostEnd === -1) {\n // atSign can be anywhere.\n atSign = rest.lastIndexOf('@');\n } else {\n // atSign must be in auth portion.\n // http://a@b/c@d => host:b auth:a path:/c@d\n atSign = rest.lastIndexOf('@', hostEnd);\n }\n\n // Now we have a portion which is definitely the auth.\n // Pull that off.\n if (atSign !== -1) {\n auth = rest.slice(0, atSign);\n rest = rest.slice(atSign + 1);\n this.auth = decodeURIComponent(auth);\n }\n\n // the host is the remaining to the left of the first non-host char\n hostEnd = -1;\n for (var i = 0; i < nonHostChars.length; i++) {\n var hec = rest.indexOf(nonHostChars[i]);\n if (hec !== -1 && (hostEnd === -1 || hec < hostEnd))\n hostEnd = hec;\n }\n // if we still have not hit it, then the entire thing is a host.\n if (hostEnd === -1)\n hostEnd = rest.length;\n\n this.host = rest.slice(0, hostEnd);\n rest = rest.slice(hostEnd);\n\n // pull out port.\n this.parseHost();\n\n // we've indicated that there is a hostname,\n // so even if it's empty, it has to be present.\n this.hostname = this.hostname || '';\n\n // if hostname begins with [ and ends with ]\n // assume that it's an IPv6 address.\n var ipv6Hostname = this.hostname[0] === '[' &&\n this.hostname[this.hostname.length - 1] === ']';\n\n // validate a little.\n if (!ipv6Hostname) {\n var hostparts = this.hostname.split(/\\./);\n for (var i = 0, l = hostparts.length; i < l; i++) {\n var part = hostparts[i];\n if (!part) continue;\n if (!part.match(hostnamePartPattern)) {\n var newpart = '';\n for (var j = 0, k = part.length; j < k; j++) {\n if (part.charCodeAt(j) > 127) {\n // we replace non-ASCII char with a temporary placeholder\n // we need this to make sure size of hostname is not\n // broken by replacing non-ASCII by nothing\n newpart += 'x';\n } else {\n newpart += part[j];\n }\n }\n // we test again with ASCII char only\n if (!newpart.match(hostnamePartPattern)) {\n var validParts = hostparts.slice(0, i);\n var notHost = hostparts.slice(i + 1);\n var bit = part.match(hostnamePartStart);\n if (bit) {\n validParts.push(bit[1]);\n notHost.unshift(bit[2]);\n }\n if (notHost.length) {\n rest = '/' + notHost.join('.') + rest;\n }\n this.hostname = validParts.join('.');\n break;\n }\n }\n }\n }\n\n if (this.hostname.length > hostnameMaxLen) {\n this.hostname = '';\n } else {\n // hostnames are always lower case.\n this.hostname = this.hostname.toLowerCase();\n }\n\n if (!ipv6Hostname) {\n // IDNA Support: Returns a punycoded representation of \"domain\".\n // It only converts parts of the domain name that\n // have non-ASCII characters, i.e. it doesn't matter if\n // you call it with a domain that already is ASCII-only.\n this.hostname = punycode.toASCII(this.hostname);\n }\n\n var p = this.port ? ':' + this.port : '';\n var h = this.hostname || '';\n this.host = h + p;\n this.href += this.host;\n\n // strip [ and ] from the hostname\n // the host field still retains them, though\n if (ipv6Hostname) {\n this.hostname = this.hostname.substr(1, this.hostname.length - 2);\n if (rest[0] !== '/') {\n rest = '/' + rest;\n }\n }\n }\n\n // now rest is set to the post-host stuff.\n // chop off any delim chars.\n if (!unsafeProtocol[lowerProto]) {\n\n // First, make 100% sure that any \"autoEscape\" chars get\n // escaped, even if encodeURIComponent doesn't think they\n // need to be.\n for (var i = 0, l = autoEscape.length; i < l; i++) {\n var ae = autoEscape[i];\n if (rest.indexOf(ae) === -1)\n continue;\n var esc = encodeURIComponent(ae);\n if (esc === ae) {\n esc = escape(ae);\n }\n rest = rest.split(ae).join(esc);\n }\n }\n\n\n // chop off from the tail first.\n var hash = rest.indexOf('#');\n if (hash !== -1) {\n // got a fragment string.\n this.hash = rest.substr(hash);\n rest = rest.slice(0, hash);\n }\n var qm = rest.indexOf('?');\n if (qm !== -1) {\n this.search = rest.substr(qm);\n this.query = rest.substr(qm + 1);\n if (parseQueryString) {\n this.query = querystring.parse(this.query);\n }\n rest = rest.slice(0, qm);\n } else if (parseQueryString) {\n // no query string, but parseQueryString still requested\n this.search = '';\n this.query = {};\n }\n if (rest) this.pathname = rest;\n if (slashedProtocol[lowerProto] &&\n this.hostname && !this.pathname) {\n this.pathname = '/';\n }\n\n //to support http.request\n if (this.pathname || this.search) {\n var p = this.pathname || '';\n var s = this.search || '';\n this.path = p + s;\n }\n\n // finally, reconstruct the href based on what has been validated.\n this.href = this.format();\n return this;\n};\n\n// format a parsed object into a url string\nfunction urlFormat(obj) {\n // ensure it's an object, and not a string url.\n // If it's an obj, this is a no-op.\n // this way, you can call url_format() on strings\n // to clean up potentially wonky urls.\n if (util.isString(obj)) obj = urlParse(obj);\n if (!(obj instanceof Url)) return Url.prototype.format.call(obj);\n return obj.format();\n}\n\nUrl.prototype.format = function() {\n var auth = this.auth || '';\n if (auth) {\n auth = encodeURIComponent(auth);\n auth = auth.replace(/%3A/i, ':');\n auth += '@';\n }\n\n var protocol = this.protocol || '',\n pathname = this.pathname || '',\n hash = this.hash || '',\n host = false,\n query = '';\n\n if (this.host) {\n host = auth + this.host;\n } else if (this.hostname) {\n host = auth + (this.hostname.indexOf(':') === -1 ?\n this.hostname :\n '[' + this.hostname + ']');\n if (this.port) {\n host += ':' + this.port;\n }\n }\n\n if (this.query &&\n util.isObject(this.query) &&\n Object.keys(this.query).length) {\n query = querystring.stringify(this.query);\n }\n\n var search = this.search || (query && ('?' + query)) || '';\n\n if (protocol && protocol.substr(-1) !== ':') protocol += ':';\n\n // only the slashedProtocols get the //. Not mailto:, xmpp:, etc.\n // unless they had them to begin with.\n if (this.slashes ||\n (!protocol || slashedProtocol[protocol]) && host !== false) {\n host = '//' + (host || '');\n if (pathname && pathname.charAt(0) !== '/') pathname = '/' + pathname;\n } else if (!host) {\n host = '';\n }\n\n if (hash && hash.charAt(0) !== '#') hash = '#' + hash;\n if (search && search.charAt(0) !== '?') search = '?' + search;\n\n pathname = pathname.replace(/[?#]/g, function(match) {\n return encodeURIComponent(match);\n });\n search = search.replace('#', '%23');\n\n return protocol + host + pathname + search + hash;\n};\n\nfunction urlResolve(source, relative) {\n return urlParse(source, false, true).resolve(relative);\n}\n\nUrl.prototype.resolve = function(relative) {\n return this.resolveObject(urlParse(relative, false, true)).format();\n};\n\nfunction urlResolveObject(source, relative) {\n if (!source) return relative;\n return urlParse(source, false, true).resolveObject(relative);\n}\n\nUrl.prototype.resolveObject = function(relative) {\n if (util.isString(relative)) {\n var rel = new Url();\n rel.parse(relative, false, true);\n relative = rel;\n }\n\n var result = new Url();\n var tkeys = Object.keys(this);\n for (var tk = 0; tk < tkeys.length; tk++) {\n var tkey = tkeys[tk];\n result[tkey] = this[tkey];\n }\n\n // hash is always overridden, no matter what.\n // even href=\"\" will remove it.\n result.hash = relative.hash;\n\n // if the relative url is empty, then there's nothing left to do here.\n if (relative.href === '') {\n result.href = result.format();\n return result;\n }\n\n // hrefs like //foo/bar always cut to the protocol.\n if (relative.slashes && !relative.protocol) {\n // take everything except the protocol from relative\n var rkeys = Object.keys(relative);\n for (var rk = 0; rk < rkeys.length; rk++) {\n var rkey = rkeys[rk];\n if (rkey !== 'protocol')\n result[rkey] = relative[rkey];\n }\n\n //urlParse appends trailing / to urls like http://www.example.com\n if (slashedProtocol[result.protocol] &&\n result.hostname && !result.pathname) {\n result.path = result.pathname = '/';\n }\n\n result.href = result.format();\n return result;\n }\n\n if (relative.protocol && relative.protocol !== result.protocol) {\n // if it's a known url protocol, then changing\n // the protocol does weird things\n // first, if it's not file:, then we MUST have a host,\n // and if there was a path\n // to begin with, then we MUST have a path.\n // if it is file:, then the host is dropped,\n // because that's known to be hostless.\n // anything else is assumed to be absolute.\n if (!slashedProtocol[relative.protocol]) {\n var keys = Object.keys(relative);\n for (var v = 0; v < keys.length; v++) {\n var k = keys[v];\n result[k] = relative[k];\n }\n result.href = result.format();\n return result;\n }\n\n result.protocol = relative.protocol;\n if (!relative.host && !hostlessProtocol[relative.protocol]) {\n var relPath = (relative.pathname || '').split('/');\n while (relPath.length && !(relative.host = relPath.shift()));\n if (!relative.host) relative.host = '';\n if (!relative.hostname) relative.hostname = '';\n if (relPath[0] !== '') relPath.unshift('');\n if (relPath.length < 2) relPath.unshift('');\n result.pathname = relPath.join('/');\n } else {\n result.pathname = relative.pathname;\n }\n result.search = relative.search;\n result.query = relative.query;\n result.host = relative.host || '';\n result.auth = relative.auth;\n result.hostname = relative.hostname || relative.host;\n result.port = relative.port;\n // to support http.request\n if (result.pathname || result.search) {\n var p = result.pathname || '';\n var s = result.search || '';\n result.path = p + s;\n }\n result.slashes = result.slashes || relative.slashes;\n result.href = result.format();\n return result;\n }\n\n var isSourceAbs = (result.pathname && result.pathname.charAt(0) === '/'),\n isRelAbs = (\n relative.host ||\n relative.pathname && relative.pathname.charAt(0) === '/'\n ),\n mustEndAbs = (isRelAbs || isSourceAbs ||\n (result.host && relative.pathname)),\n removeAllDots = mustEndAbs,\n srcPath = result.pathname && result.pathname.split('/') || [],\n relPath = relative.pathname && relative.pathname.split('/') || [],\n psychotic = result.protocol && !slashedProtocol[result.protocol];\n\n // if the url is a non-slashed url, then relative\n // links like ../.. should be able\n // to crawl up to the hostname, as well. This is strange.\n // result.protocol has already been set by now.\n // Later on, put the first path part into the host field.\n if (psychotic) {\n result.hostname = '';\n result.port = null;\n if (result.host) {\n if (srcPath[0] === '') srcPath[0] = result.host;\n else srcPath.unshift(result.host);\n }\n result.host = '';\n if (relative.protocol) {\n relative.hostname = null;\n relative.port = null;\n if (relative.host) {\n if (relPath[0] === '') relPath[0] = relative.host;\n else relPath.unshift(relative.host);\n }\n relative.host = null;\n }\n mustEndAbs = mustEndAbs && (relPath[0] === '' || srcPath[0] === '');\n }\n\n if (isRelAbs) {\n // it's absolute.\n result.host = (relative.host || relative.host === '') ?\n relative.host : result.host;\n result.hostname = (relative.hostname || relative.hostname === '') ?\n relative.hostname : result.hostname;\n result.search = relative.search;\n result.query = relative.query;\n srcPath = relPath;\n // fall through to the dot-handling below.\n } else if (relPath.length) {\n // it's relative\n // throw away the existing file, and take the new path instead.\n if (!srcPath) srcPath = [];\n srcPath.pop();\n srcPath = srcPath.concat(relPath);\n result.search = relative.search;\n result.query = relative.query;\n } else if (!util.isNullOrUndefined(relative.search)) {\n // just pull out the search.\n // like href='?foo'.\n // Put this after the other two cases because it simplifies the booleans\n if (psychotic) {\n result.hostname = result.host = srcPath.shift();\n //occationaly the auth can get stuck only in host\n //this especially happens in cases like\n //url.resolveObject('mailto:local1@domain1', 'local2@domain2')\n var authInHost = result.host && result.host.indexOf('@') > 0 ?\n result.host.split('@') : false;\n if (authInHost) {\n result.auth = authInHost.shift();\n result.host = result.hostname = authInHost.shift();\n }\n }\n result.search = relative.search;\n result.query = relative.query;\n //to support http.request\n if (!util.isNull(result.pathname) || !util.isNull(result.search)) {\n result.path = (result.pathname ? result.pathname : '') +\n (result.search ? result.search : '');\n }\n result.href = result.format();\n return result;\n }\n\n if (!srcPath.length) {\n // no path at all. easy.\n // we've already handled the other stuff above.\n result.pathname = null;\n //to support http.request\n if (result.search) {\n result.path = '/' + result.search;\n } else {\n result.path = null;\n }\n result.href = result.format();\n return result;\n }\n\n // if a url ENDs in . or .., then it must get a trailing slash.\n // however, if it ends in anything else non-slashy,\n // then it must NOT get a trailing slash.\n var last = srcPath.slice(-1)[0];\n var hasTrailingSlash = (\n (result.host || relative.host || srcPath.length > 1) &&\n (last === '.' || last === '..') || last === '');\n\n // strip single dots, resolve double dots to parent dir\n // if the path tries to go above the root, `up` ends up > 0\n var up = 0;\n for (var i = srcPath.length; i >= 0; i--) {\n last = srcPath[i];\n if (last === '.') {\n srcPath.splice(i, 1);\n } else if (last === '..') {\n srcPath.splice(i, 1);\n up++;\n } else if (up) {\n srcPath.splice(i, 1);\n up--;\n }\n }\n\n // if the path is allowed to go above the root, restore leading ..s\n if (!mustEndAbs && !removeAllDots) {\n for (; up--; up) {\n srcPath.unshift('..');\n }\n }\n\n if (mustEndAbs && srcPath[0] !== '' &&\n (!srcPath[0] || srcPath[0].charAt(0) !== '/')) {\n srcPath.unshift('');\n }\n\n if (hasTrailingSlash && (srcPath.join('/').substr(-1) !== '/')) {\n srcPath.push('');\n }\n\n var isAbsolute = srcPath[0] === '' ||\n (srcPath[0] && srcPath[0].charAt(0) === '/');\n\n // put the host back\n if (psychotic) {\n result.hostname = result.host = isAbsolute ? '' :\n srcPath.length ? srcPath.shift() : '';\n //occationaly the auth can get stuck only in host\n //this especially happens in cases like\n //url.resolveObject('mailto:local1@domain1', 'local2@domain2')\n var authInHost = result.host && result.host.indexOf('@') > 0 ?\n result.host.split('@') : false;\n if (authInHost) {\n result.auth = authInHost.shift();\n result.host = result.hostname = authInHost.shift();\n }\n }\n\n mustEndAbs = mustEndAbs || (result.host && srcPath.length);\n\n if (mustEndAbs && !isAbsolute) {\n srcPath.unshift('');\n }\n\n if (!srcPath.length) {\n result.pathname = null;\n result.path = null;\n } else {\n result.pathname = srcPath.join('/');\n }\n\n //to support request.http\n if (!util.isNull(result.pathname) || !util.isNull(result.search)) {\n result.path = (result.pathname ? result.pathname : '') +\n (result.search ? result.search : '');\n }\n result.auth = relative.auth || result.auth;\n result.slashes = result.slashes || relative.slashes;\n result.href = result.format();\n return result;\n};\n\nUrl.prototype.parseHost = function() {\n var host = this.host;\n var port = portPattern.exec(host);\n if (port) {\n port = port[0];\n if (port !== ':') {\n this.port = port.substr(1);\n }\n host = host.substr(0, host.length - port.length);\n }\n if (host) this.hostname = host;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/url/url.js\n// module id = ./node_modules/url/url.js\n// module chunks = 0","'use strict';\n\nmodule.exports = {\n isString: function(arg) {\n return typeof(arg) === 'string';\n },\n isObject: function(arg) {\n return typeof(arg) === 'object' && arg !== null;\n },\n isNull: function(arg) {\n return arg === null;\n },\n isNullOrUndefined: function(arg) {\n return arg == null;\n }\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/url/util.js\n// module id = ./node_modules/url/util.js\n// module chunks = 0","/* globals __webpack_amd_options__ */\nmodule.exports = __webpack_amd_options__;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/amd-options.js\n// module id = ./node_modules/webpack/buildin/amd-options.js\n// module chunks = 0","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\n} catch(e) {\n\t// This works if the window reference is available\n\tif(typeof window === \"object\")\n\t\tg = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/global.js\n// module id = ./node_modules/webpack/buildin/global.js\n// module chunks = 0","module.exports = function(module) {\n\tif(!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif(!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/module.js\n// module id = ./node_modules/webpack/buildin/module.js\n// module chunks = 0","(function(self) {\n 'use strict';\n\n if (self.fetch) {\n return\n }\n\n var support = {\n searchParams: 'URLSearchParams' in self,\n iterable: 'Symbol' in self && 'iterator' in Symbol,\n blob: 'FileReader' in self && 'Blob' in self && (function() {\n try {\n new Blob()\n return true\n } catch(e) {\n return false\n }\n })(),\n formData: 'FormData' in self,\n arrayBuffer: 'ArrayBuffer' in self\n }\n\n if (support.arrayBuffer) {\n var viewClasses = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]'\n ]\n\n var isDataView = function(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj)\n }\n\n var isArrayBufferView = ArrayBuffer.isView || function(obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n }\n }\n\n function normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n throw new TypeError('Invalid character in header field name')\n }\n return name.toLowerCase()\n }\n\n function normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value)\n }\n return value\n }\n\n // Build a destructive iterator for the value list\n function iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift()\n return {done: value === undefined, value: value}\n }\n }\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n }\n }\n\n return iterator\n }\n\n function Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n } else if (Array.isArray(headers)) {\n headers.forEach(function(header) {\n this.append(header[0], header[1])\n }, this)\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n }\n\n Headers.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var oldValue = this.map[name]\n this.map[name] = oldValue ? oldValue+','+value : value\n }\n\n Headers.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)]\n }\n\n Headers.prototype.get = function(name) {\n name = normalizeName(name)\n return this.has(name) ? this.map[name] : null\n }\n\n Headers.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n }\n\n Headers.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value)\n }\n\n Headers.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this)\n }\n }\n }\n\n Headers.prototype.keys = function() {\n var items = []\n this.forEach(function(value, name) { items.push(name) })\n return iteratorFor(items)\n }\n\n Headers.prototype.values = function() {\n var items = []\n this.forEach(function(value) { items.push(value) })\n return iteratorFor(items)\n }\n\n Headers.prototype.entries = function() {\n var items = []\n this.forEach(function(value, name) { items.push([name, value]) })\n return iteratorFor(items)\n }\n\n if (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n }\n\n function consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true\n }\n\n function fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n }\n\n function readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsArrayBuffer(blob)\n return promise\n }\n\n function readBlobAsText(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsText(blob)\n return promise\n }\n\n function readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf)\n var chars = new Array(view.length)\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i])\n }\n return chars.join('')\n }\n\n function bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength)\n view.set(new Uint8Array(buf))\n return view.buffer\n }\n }\n\n function Body() {\n this.bodyUsed = false\n\n this._initBody = function(body) {\n this._bodyInit = body\n if (!body) {\n this._bodyText = ''\n } else if (typeof body === 'string') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString()\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer)\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer])\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body)\n } else {\n throw new Error('unsupported BodyInit type')\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8')\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type)\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n }\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\n } else {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n }\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n }\n\n // HTTP methods whose capitalization should be normalized\n var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\n function normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return (methods.indexOf(upcased) > -1) ? upcased : method\n }\n\n function Request(input, options) {\n options = options || {}\n var body = options.body\n\n if (input instanceof Request) {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n if (!body && input._bodyInit != null) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n } else {\n this.url = String(input)\n }\n\n this.credentials = options.credentials || this.credentials || 'omit'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || 'GET')\n this.mode = options.mode || this.mode || null\n this.referrer = null\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body)\n }\n\n Request.prototype.clone = function() {\n return new Request(this, { body: this._bodyInit })\n }\n\n function decode(body) {\n var form = new FormData()\n body.trim().split('&').forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=')\n var name = split.shift().replace(/\\+/g, ' ')\n var value = split.join('=').replace(/\\+/g, ' ')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n }\n\n function parseHeaders(rawHeaders) {\n var headers = new Headers()\n rawHeaders.split(/\\r?\\n/).forEach(function(line) {\n var parts = line.split(':')\n var key = parts.shift().trim()\n if (key) {\n var value = parts.join(':').trim()\n headers.append(key, value)\n }\n })\n return headers\n }\n\n Body.call(Request.prototype)\n\n function Response(bodyInit, options) {\n if (!options) {\n options = {}\n }\n\n this.type = 'default'\n this.status = 'status' in options ? options.status : 200\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = 'statusText' in options ? options.statusText : 'OK'\n this.headers = new Headers(options.headers)\n this.url = options.url || ''\n this._initBody(bodyInit)\n }\n\n Body.call(Response.prototype)\n\n Response.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n }\n\n Response.error = function() {\n var response = new Response(null, {status: 0, statusText: ''})\n response.type = 'error'\n return response\n }\n\n var redirectStatuses = [301, 302, 303, 307, 308]\n\n Response.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n }\n\n self.Headers = Headers\n self.Request = Request\n self.Response = Response\n\n self.fetch = function(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init)\n var xhr = new XMLHttpRequest()\n\n xhr.onload = function() {\n var options = {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n }\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')\n var body = 'response' in xhr ? xhr.response : xhr.responseText\n resolve(new Response(body, options))\n }\n\n xhr.onerror = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.ontimeout = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.open(request.method, request.url, true)\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true\n }\n\n if ('responseType' in xhr && support.blob) {\n xhr.responseType = 'blob'\n }\n\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n })\n }\n self.fetch.polyfill = true\n})(typeof self !== 'undefined' ? self : this);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/whatwg-fetch/fetch.js\n// module id = ./node_modules/whatwg-fetch/fetch.js\n// module chunks = 0","import React, { Component } from 'react';\nimport { stepInTest, debugStatement } from './step-in-test.js';\nimport stepOverTest from './step-over-test.js';\nimport stepOutTest from './step-out-test.js';\n\nclass App extends Component {\n render() {\n return (\n <div className=\"App\">\n <header className=\"App-header\">\n <h1 className=\"App-title\">Welcome to React</h1>\n </header>\n <p className=\"App-intro\">\n To get started, edit <code>src/App.js</code> and save to reload.\n </p>\n </div>\n );\n }\n}\n\nwindow.hitBreakpoint = function breakpoint() {\n stepInTest();\n stepOverTest();\n stepOutTest();\n console.log('hitting a breakpoint');\n return;\n}\n\nwindow.hitDebugStatement = function() {\n debugStatement();\n console.log('hitting a debug statement');\n return;\n}\n\nexport default App;\n\n\n\n// WEBPACK FOOTER //\n// src/App.js","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './App';\n\nReactDOM.render(<App />, document.getElementById('root'));\n\n\n\n// WEBPACK FOOTER //\n// src/index.js","// depth: 3, width: 12\n// 2586 functions, 182225 characters generated\n\nfunction f0_0_0_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_0_0_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_0_2(){\n return Math.random()\n}\n\nfunction f0_0_0_3(){\n return Math.random()\n}\n\nfunction f0_0_0_4(){\n return isNaN(undefined)\n}\n\nfunction f0_0_0_5(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_0_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_0_7(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_0_0_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_0_9(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_0_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_0_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_0(){\n f0_0_0_0();\n f0_0_0_1();\n f0_0_0_2();\n f0_0_0_3();\n f0_0_0_4();\n f0_0_0_5();\n f0_0_0_6();\n f0_0_0_7();\n f0_0_0_8();\n f0_0_0_9();\n f0_0_0_10();\n f0_0_0_11();\n\n}\n\nfunction f0_0_1_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_1_1(){\n return Math.random()\n}\n\nfunction f0_0_1_2(){\n return Math.random()\n}\n\nfunction f0_0_1_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_1_4(){\n return Math.random()\n}\n\nfunction f0_0_1_5(){\n return isNaN(undefined)\n}\n\nfunction f0_0_1_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_1_7(){\n return isNaN(undefined)\n}\n\nfunction f0_0_1_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_1_9(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_1_10(){\n return Math.random()\n}\n\nfunction f0_0_1_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_0_1(){\n f0_0_1_0();\n f0_0_1_1();\n f0_0_1_2();\n f0_0_1_3();\n f0_0_1_4();\n f0_0_1_5();\n f0_0_1_6();\n f0_0_1_7();\n f0_0_1_8();\n f0_0_1_9();\n f0_0_1_10();\n f0_0_1_11();\n\n}\n\nfunction f0_0_2_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_0_2_1(){\n return isNaN(undefined)\n}\n\nfunction f0_0_2_2(){\n return isNaN(undefined)\n}\n\nfunction f0_0_2_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_2_4(){\n return Math.random()\n}\n\nfunction f0_0_2_5(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_2_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_2_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_2_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_0_2_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_0_2_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_0_2_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_0_2(){\n f0_0_2_0();\n f0_0_2_1();\n f0_0_2_2();\n f0_0_2_3();\n f0_0_2_4();\n f0_0_2_5();\n f0_0_2_6();\n f0_0_2_7();\n f0_0_2_8();\n f0_0_2_9();\n f0_0_2_10();\n f0_0_2_11();\n\n}\n\nfunction f0_0_3_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_3_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_3_2(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_3_3(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_0_3_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_0_3_5(){\n return isNaN(undefined)\n}\n\nfunction f0_0_3_6(){\n return isNaN(undefined)\n}\n\nfunction f0_0_3_7(){\n return isNaN(undefined)\n}\n\nfunction f0_0_3_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_0_3_9(){\n return Math.random()\n}\n\nfunction f0_0_3_10(){\n return isNaN(undefined)\n}\n\nfunction f0_0_3_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_0_3(){\n f0_0_3_0();\n f0_0_3_1();\n f0_0_3_2();\n f0_0_3_3();\n f0_0_3_4();\n f0_0_3_5();\n f0_0_3_6();\n f0_0_3_7();\n f0_0_3_8();\n f0_0_3_9();\n f0_0_3_10();\n f0_0_3_11();\n\n}\n\nfunction f0_0_4_0(){\n return isNaN(undefined)\n}\n\nfunction f0_0_4_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_4_2(){\n return Math.random()\n}\n\nfunction f0_0_4_3(){\n return isNaN(undefined)\n}\n\nfunction f0_0_4_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_0_4_5(){\n return isNaN(undefined)\n}\n\nfunction f0_0_4_6(){\n return isNaN(undefined)\n}\n\nfunction f0_0_4_7(){\n return isNaN(undefined)\n}\n\nfunction f0_0_4_8(){\n return isNaN(undefined)\n}\n\nfunction f0_0_4_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_0_4_10(){\n return Math.random()\n}\n\nfunction f0_0_4_11(){\n return isNaN(undefined)\n}\n\nfunction f0_0_4(){\n f0_0_4_0();\n f0_0_4_1();\n f0_0_4_2();\n f0_0_4_3();\n f0_0_4_4();\n f0_0_4_5();\n f0_0_4_6();\n f0_0_4_7();\n f0_0_4_8();\n f0_0_4_9();\n f0_0_4_10();\n f0_0_4_11();\n\n}\n\nfunction f0_0_5_0(){\n return Math.random()\n}\n\nfunction f0_0_5_1(){\n return Math.random()\n}\n\nfunction f0_0_5_2(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_5_3(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_0_5_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_0_5_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_0_5_6(){\n return Math.random()\n}\n\nfunction f0_0_5_7(){\n return isNaN(undefined)\n}\n\nfunction f0_0_5_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_5_9(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_5_10(){\n return isNaN(undefined)\n}\n\nfunction f0_0_5_11(){\n return Math.random()\n}\n\nfunction f0_0_5(){\n f0_0_5_0();\n f0_0_5_1();\n f0_0_5_2();\n f0_0_5_3();\n f0_0_5_4();\n f0_0_5_5();\n f0_0_5_6();\n f0_0_5_7();\n f0_0_5_8();\n f0_0_5_9();\n f0_0_5_10();\n f0_0_5_11();\n\n}\n\nfunction f0_0_6_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_0_6_1(){\n return Math.random()\n}\n\nfunction f0_0_6_2(){\n return isNaN(undefined)\n}\n\nfunction f0_0_6_3(){\n return isNaN(undefined)\n}\n\nfunction f0_0_6_4(){\n return isNaN(undefined)\n}\n\nfunction f0_0_6_5(){\n return Math.random()\n}\n\nfunction f0_0_6_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_6_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_6_8(){\n return Math.random()\n}\n\nfunction f0_0_6_9(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_6_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_0_6_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_6(){\n f0_0_6_0();\n f0_0_6_1();\n f0_0_6_2();\n f0_0_6_3();\n f0_0_6_4();\n f0_0_6_5();\n f0_0_6_6();\n f0_0_6_7();\n f0_0_6_8();\n f0_0_6_9();\n f0_0_6_10();\n f0_0_6_11();\n\n}\n\nfunction f0_0_7_0(){\n return isNaN(undefined)\n}\n\nfunction f0_0_7_1(){\n return Math.random()\n}\n\nfunction f0_0_7_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_0_7_3(){\n return Math.random()\n}\n\nfunction f0_0_7_4(){\n return Math.random()\n}\n\nfunction f0_0_7_5(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_7_6(){\n return Math.random()\n}\n\nfunction f0_0_7_7(){\n return Math.random()\n}\n\nfunction f0_0_7_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_7_9(){\n return isNaN(undefined)\n}\n\nfunction f0_0_7_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_7_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_7(){\n f0_0_7_0();\n f0_0_7_1();\n f0_0_7_2();\n f0_0_7_3();\n f0_0_7_4();\n f0_0_7_5();\n f0_0_7_6();\n f0_0_7_7();\n f0_0_7_8();\n f0_0_7_9();\n f0_0_7_10();\n f0_0_7_11();\n\n}\n\nfunction f0_0_8_0(){\n return Math.random()\n}\n\nfunction f0_0_8_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_0_8_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_0_8_3(){\n return Math.random()\n}\n\nfunction f0_0_8_4(){\n return isNaN(undefined)\n}\n\nfunction f0_0_8_5(){\n return Math.random()\n}\n\nfunction f0_0_8_6(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_0_8_7(){\n return Math.random()\n}\n\nfunction f0_0_8_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_8_9(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_8_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_8_11(){\n return Math.random()\n}\n\nfunction f0_0_8(){\n f0_0_8_0();\n f0_0_8_1();\n f0_0_8_2();\n f0_0_8_3();\n f0_0_8_4();\n f0_0_8_5();\n f0_0_8_6();\n f0_0_8_7();\n f0_0_8_8();\n f0_0_8_9();\n f0_0_8_10();\n f0_0_8_11();\n\n}\n\nfunction f0_0_9_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_9_1(){\n return Math.random()\n}\n\nfunction f0_0_9_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_0_9_3(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_0_9_4(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_9_5(){\n return isNaN(undefined)\n}\n\nfunction f0_0_9_6(){\n return Math.random()\n}\n\nfunction f0_0_9_7(){\n return Math.random()\n}\n\nfunction f0_0_9_8(){\n return Math.random()\n}\n\nfunction f0_0_9_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_0_9_10(){\n return Math.random()\n}\n\nfunction f0_0_9_11(){\n return Math.random()\n}\n\nfunction f0_0_9(){\n f0_0_9_0();\n f0_0_9_1();\n f0_0_9_2();\n f0_0_9_3();\n f0_0_9_4();\n f0_0_9_5();\n f0_0_9_6();\n f0_0_9_7();\n f0_0_9_8();\n f0_0_9_9();\n f0_0_9_10();\n f0_0_9_11();\n\n}\n\nfunction f0_0_10_0(){\n return Math.random()\n}\n\nfunction f0_0_10_1(){\n return isNaN(undefined)\n}\n\nfunction f0_0_10_2(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_10_3(){\n return Math.random()\n}\n\nfunction f0_0_10_4(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_10_5(){\n return isNaN(undefined)\n}\n\nfunction f0_0_10_6(){\n return Math.random()\n}\n\nfunction f0_0_10_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_10_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_10_9(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_10_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_10_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_0_10(){\n f0_0_10_0();\n f0_0_10_1();\n f0_0_10_2();\n f0_0_10_3();\n f0_0_10_4();\n f0_0_10_5();\n f0_0_10_6();\n f0_0_10_7();\n f0_0_10_8();\n f0_0_10_9();\n f0_0_10_10();\n f0_0_10_11();\n\n}\n\nfunction f0_0_11_0(){\n return Math.random()\n}\n\nfunction f0_0_11_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_11_2(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_11_3(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_0_11_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_0_11_5(){\n return isNaN(undefined)\n}\n\nfunction f0_0_11_6(){\n return isNaN(undefined)\n}\n\nfunction f0_0_11_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_0_11_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_0_11_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_0_11_10(){\n return Math.random()\n}\n\nfunction f0_0_11_11(){\n return Math.random()\n}\n\nfunction f0_0_11(){\n f0_0_11_0();\n f0_0_11_1();\n f0_0_11_2();\n f0_0_11_3();\n f0_0_11_4();\n f0_0_11_5();\n f0_0_11_6();\n f0_0_11_7();\n f0_0_11_8();\n f0_0_11_9();\n f0_0_11_10();\n f0_0_11_11();\n\n}\n\nfunction f0_0(){\n f0_0_0();\n f0_0_1();\n f0_0_2();\n f0_0_3();\n f0_0_4();\n f0_0_5();\n f0_0_6();\n f0_0_7();\n f0_0_8();\n f0_0_9();\n f0_0_10();\n f0_0_11();\n\n}\n\nfunction f0_1_0_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_1_0_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_1_0_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_1_0_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_1_0_4(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_1_0_5(){\n return Math.random()\n}\n\nfunction f0_1_0_6(){\n return isNaN(undefined)\n}\n\nfunction f0_1_0_7(){\n return Math.random()\n}\n\nfunction f0_1_0_8(){\n return isNaN(undefined)\n}\n\nfunction f0_1_0_9(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_1_0_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_1_0_11(){\n return Math.random()\n}\n\nfunction f0_1_0(){\n f0_1_0_0();\n f0_1_0_1();\n f0_1_0_2();\n f0_1_0_3();\n f0_1_0_4();\n f0_1_0_5();\n f0_1_0_6();\n f0_1_0_7();\n f0_1_0_8();\n f0_1_0_9();\n f0_1_0_10();\n f0_1_0_11();\n\n}\n\nfunction f0_1_1_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_1_1_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_1_1_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_1_1_3(){\n return isNaN(undefined)\n}\n\nfunction f0_1_1_4(){\n return Math.random()\n}\n\nfunction f0_1_1_5(){\n return isNaN(undefined)\n}\n\nfunction f0_1_1_6(){\n return isNaN(undefined)\n}\n\nfunction f0_1_1_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_1_1_8(){\n return Math.random()\n}\n\nfunction f0_1_1_9(){\n return Math.random()\n}\n\nfunction f0_1_1_10(){\n return Math.random()\n}\n\nfunction f0_1_1_11(){\n return Math.random()\n}\n\nfunction f0_1_1(){\n f0_1_1_0();\n f0_1_1_1();\n f0_1_1_2();\n f0_1_1_3();\n f0_1_1_4();\n f0_1_1_5();\n f0_1_1_6();\n f0_1_1_7();\n f0_1_1_8();\n f0_1_1_9();\n f0_1_1_10();\n f0_1_1_11();\n\n}\n\nfunction f0_1_2_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_1_2_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_1_2_2(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_1_2_3(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_1_2_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_1_2_5(){\n return Math.random()\n}\n\nfunction f0_1_2_6(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_1_2_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_1_2_8(){\n return isNaN(undefined)\n}\n\nfunction f0_1_2_9(){\n return Math.random()\n}\n\nfunction f0_1_2_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_1_2_11(){\n return Math.random()\n}\n\nfunction f0_1_2(){\n f0_1_2_0();\n f0_1_2_1();\n f0_1_2_2();\n f0_1_2_3();\n f0_1_2_4();\n f0_1_2_5();\n f0_1_2_6();\n f0_1_2_7();\n f0_1_2_8();\n f0_1_2_9();\n f0_1_2_10();\n f0_1_2_11();\n\n}\n\nfunction f0_1_3_0(){\n return isNaN(undefined)\n}\n\nfunction f0_1_3_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_1_3_2(){\n return isNaN(undefined)\n}\n\nfunction f0_1_3_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_1_3_4(){\n return isNaN(undefined)\n}\n\nfunction f0_1_3_5(){\n return Math.random()\n}\n\nfunction f0_1_3_6(){\n return Math.random()\n}\n\nfunction f0_1_3_7(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_1_3_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_1_3_9(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_1_3_10(){\n return Math.random()\n}\n\nfunction f0_1_3_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_1_3(){\n f0_1_3_0();\n f0_1_3_1();\n f0_1_3_2();\n f0_1_3_3();\n f0_1_3_4();\n f0_1_3_5();\n f0_1_3_6();\n f0_1_3_7();\n f0_1_3_8();\n f0_1_3_9();\n f0_1_3_10();\n f0_1_3_11();\n\n}\n\nfunction f0_1_4_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_1_4_1(){\n return isNaN(undefined)\n}\n\nfunction f0_1_4_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_1_4_3(){\n return isNaN(undefined)\n}\n\nfunction f0_1_4_4(){\n return isNaN(undefined)\n}\n\nfunction f0_1_4_5(){\n return isNaN(undefined)\n}\n\nfunction f0_1_4_6(){\n return isNaN(undefined)\n}\n\nfunction f0_1_4_7(){\n return Math.random()\n}\n\nfunction f0_1_4_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_1_4_9(){\n return isNaN(undefined)\n}\n\nfunction f0_1_4_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_1_4_11(){\n return Math.random()\n}\n\nfunction f0_1_4(){\n f0_1_4_0();\n f0_1_4_1();\n f0_1_4_2();\n f0_1_4_3();\n f0_1_4_4();\n f0_1_4_5();\n f0_1_4_6();\n f0_1_4_7();\n f0_1_4_8();\n f0_1_4_9();\n f0_1_4_10();\n f0_1_4_11();\n\n}\n\nfunction f0_1_5_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_1_5_1(){\n return isNaN(undefined)\n}\n\nfunction f0_1_5_2(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_1_5_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_1_5_4(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_1_5_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_1_5_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_1_5_7(){\n return isNaN(undefined)\n}\n\nfunction f0_1_5_8(){\n return isNaN(undefined)\n}\n\nfunction f0_1_5_9(){\n return Math.random()\n}\n\nfunction f0_1_5_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_1_5_11(){\n return isNaN(undefined)\n}\n\nfunction f0_1_5(){\n f0_1_5_0();\n f0_1_5_1();\n f0_1_5_2();\n f0_1_5_3();\n f0_1_5_4();\n f0_1_5_5();\n f0_1_5_6();\n f0_1_5_7();\n f0_1_5_8();\n f0_1_5_9();\n f0_1_5_10();\n f0_1_5_11();\n\n}\n\nfunction f0_1_6_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_1_6_1(){\n return isNaN(undefined)\n}\n\nfunction f0_1_6_2(){\n return isNaN(undefined)\n}\n\nfunction f0_1_6_3(){\n return isNaN(undefined)\n}\n\nfunction f0_1_6_4(){\n return isNaN(undefined)\n}\n\nfunction f0_1_6_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_1_6_6(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_1_6_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_1_6_8(){\n return isNaN(undefined)\n}\n\nfunction f0_1_6_9(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_1_6_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_1_6_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_1_6(){\n f0_1_6_0();\n f0_1_6_1();\n f0_1_6_2();\n f0_1_6_3();\n f0_1_6_4();\n f0_1_6_5();\n f0_1_6_6();\n f0_1_6_7();\n f0_1_6_8();\n f0_1_6_9();\n f0_1_6_10();\n f0_1_6_11();\n\n}\n\nfunction f0_1_7_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_1_7_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_1_7_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_1_7_3(){\n return Math.random()\n}\n\nfunction f0_1_7_4(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_1_7_5(){\n return isNaN(undefined)\n}\n\nfunction f0_1_7_6(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_1_7_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_1_7_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_1_7_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_1_7_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_1_7_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_1_7(){\n f0_1_7_0();\n f0_1_7_1();\n f0_1_7_2();\n f0_1_7_3();\n f0_1_7_4();\n f0_1_7_5();\n f0_1_7_6();\n f0_1_7_7();\n f0_1_7_8();\n f0_1_7_9();\n f0_1_7_10();\n f0_1_7_11();\n\n}\nfunction f0_1_8_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_1_8_1(){\n return isNaN(undefined)\n}\n\nfunction f0_1_8_2(){\n return Math.random()\n}\n\nfunction f0_1_8_3(){\n return isNaN(undefined)\n}\n\nfunction f0_1_8_4(){\n return isNaN(undefined)\n}\n\nfunction f0_1_8_5(){\n return isNaN(undefined)\n}\n\nfunction f0_1_8_6(){\n return isNaN(undefined)\n}\n\nfunction f0_1_8_7(){\n return Math.random()\n}\n\nfunction f0_1_8_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_1_8_9(){\n return isNaN(undefined)\n}\n\nfunction f0_1_8_10(){\n return isNaN(undefined)\n}\n\nfunction f0_1_8_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_1_8(){\n f0_1_8_0();\n f0_1_8_1();\n f0_1_8_2();\n f0_1_8_3();\n f0_1_8_4();\n f0_1_8_5();\n f0_1_8_6();\n f0_1_8_7();\n f0_1_8_8();\n f0_1_8_9();\n f0_1_8_10();\n f0_1_8_11();\n\n}\n\nfunction f0_1_9_0(){\n return isNaN(undefined)\n}\n\nfunction f0_1_9_1(){\n return isNaN(undefined)\n}\n\nfunction f0_1_9_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_1_9_3(){\n return isNaN(undefined)\n}\n\nfunction f0_1_9_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_1_9_5(){\n return isNaN(undefined)\n}\n\nfunction f0_1_9_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_1_9_7(){\n return Math.random()\n}\n\nfunction f0_1_9_8(){\n return isNaN(undefined)\n}\n\nfunction f0_1_9_9(){\n return Math.random()\n}\n\nfunction f0_1_9_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_1_9_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_1_9(){\n f0_1_9_0();\n f0_1_9_1();\n f0_1_9_2();\n f0_1_9_3();\n f0_1_9_4();\n f0_1_9_5();\n f0_1_9_6();\n f0_1_9_7();\n f0_1_9_8();\n f0_1_9_9();\n f0_1_9_10();\n f0_1_9_11();\n\n}\n\nfunction f0_1_10_0(){\n return isNaN(undefined)\n}\n\nfunction f0_1_10_1(){\n return isNaN(undefined)\n}\n\nfunction f0_1_10_2(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_1_10_3(){\n return Math.random()\n}\n\nfunction f0_1_10_4(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_1_10_5(){\n return Math.random()\n}\n\nfunction f0_1_10_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_1_10_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_1_10_8(){\n return isNaN(undefined)\n}\n\nfunction f0_1_10_9(){\n return isNaN(undefined)\n}\n\nfunction f0_1_10_10(){\n return isNaN(undefined)\n}\n\nfunction f0_1_10_11(){\n return isNaN(undefined)\n}\n\nfunction f0_1_10(){\n f0_1_10_0();\n f0_1_10_1();\n f0_1_10_2();\n f0_1_10_3();\n f0_1_10_4();\n f0_1_10_5();\n f0_1_10_6();\n f0_1_10_7();\n f0_1_10_8();\n f0_1_10_9();\n f0_1_10_10();\n f0_1_10_11();\n\n}\n\nfunction f0_1_11_0(){\n return Math.random()\n}\n\nfunction f0_1_11_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_1_11_2(){\n return Math.random()\n}\n\nfunction f0_1_11_3(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_1_11_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_1_11_5(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_1_11_6(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_1_11_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_1_11_8(){\n return Math.random()\n}\n\nfunction f0_1_11_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_1_11_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_1_11_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_1_11(){\n f0_1_11_0();\n f0_1_11_1();\n f0_1_11_2();\n f0_1_11_3();\n f0_1_11_4();\n f0_1_11_5();\n f0_1_11_6();\n f0_1_11_7();\n f0_1_11_8();\n f0_1_11_9();\n f0_1_11_10();\n f0_1_11_11();\n\n}\n\nfunction f0_1(){\n f0_1_0();\n f0_1_1();\n f0_1_2();\n f0_1_3();\n f0_1_4();\n f0_1_5();\n f0_1_6();\n f0_1_7();\n f0_1_8();\n f0_1_9();\n f0_1_10();\n f0_1_11();\n\n}\n\nfunction f0_2_0_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_2_0_1(){\n return Math.random()\n}\n\nfunction f0_2_0_2(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_2_0_3(){\n return isNaN(undefined)\n}\n\nfunction f0_2_0_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_2_0_5(){\n return Math.random()\n}\n\nfunction f0_2_0_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_2_0_7(){\n return Math.random()\n}\n\nfunction f0_2_0_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_2_0_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_2_0_10(){\n return isNaN(undefined)\n}\n\nfunction f0_2_0_11(){\n return isNaN(undefined)\n}\n\nfunction f0_2_0(){\n f0_2_0_0();\n f0_2_0_1();\n f0_2_0_2();\n f0_2_0_3();\n f0_2_0_4();\n f0_2_0_5();\n f0_2_0_6();\n f0_2_0_7();\n f0_2_0_8();\n f0_2_0_9();\n f0_2_0_10();\n f0_2_0_11();\n\n}\n\nfunction f0_2_1_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_2_1_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_2_1_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_2_1_3(){\n return isNaN(undefined)\n}\n\nfunction f0_2_1_4(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_2_1_5(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_2_1_6(){\n return isNaN(undefined)\n}\n\nfunction f0_2_1_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_2_1_8(){\n return isNaN(undefined)\n}\n\nfunction f0_2_1_9(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_2_1_10(){\n return isNaN(undefined)\n}\n\nfunction f0_2_1_11(){\n return isNaN(undefined)\n}\n\nfunction f0_2_1(){\n f0_2_1_0();\n f0_2_1_1();\n f0_2_1_2();\n f0_2_1_3();\n f0_2_1_4();\n f0_2_1_5();\n f0_2_1_6();\n f0_2_1_7();\n f0_2_1_8();\n f0_2_1_9();\n f0_2_1_10();\n f0_2_1_11();\n\n}\n\nfunction f0_2_2_0(){\n return Math.random()\n}\n\nfunction f0_2_2_1(){\n return Math.random()\n}\n\nfunction f0_2_2_2(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_2_2_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_2_2_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_2_2_5(){\n return Math.random()\n}\n\nfunction f0_2_2_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_2_2_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_2_2_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_2_2_9(){\n return Math.random()\n}\n\nfunction f0_2_2_10(){\n return Math.random()\n}\n\nfunction f0_2_2_11(){\n return isNaN(undefined)\n}\n\nfunction f0_2_2(){\n f0_2_2_0();\n f0_2_2_1();\n f0_2_2_2();\n f0_2_2_3();\n f0_2_2_4();\n f0_2_2_5();\n f0_2_2_6();\n f0_2_2_7();\n f0_2_2_8();\n f0_2_2_9();\n f0_2_2_10();\n f0_2_2_11();\n\n}\n\nfunction f0_2_3_0(){\n return Math.random()\n}\n\nfunction f0_2_3_1(){\n return Math.random()\n}\n\nfunction f0_2_3_2(){\n return Math.random()\n}\n\nfunction f0_2_3_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_2_3_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_2_3_5(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_2_3_6(){\n return isNaN(undefined)\n}\n\nfunction f0_2_3_7(){\n return isNaN(undefined)\n}\n\nfunction f0_2_3_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_2_3_9(){\n return Math.random()\n}\n\nfunction f0_2_3_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_2_3_11(){\n return isNaN(undefined)\n}\n\nfunction f0_2_3(){\n f0_2_3_0();\n f0_2_3_1();\n f0_2_3_2();\n f0_2_3_3();\n f0_2_3_4();\n f0_2_3_5();\n f0_2_3_6();\n f0_2_3_7();\n f0_2_3_8();\n f0_2_3_9();\n f0_2_3_10();\n f0_2_3_11();\n}\n\nfunction f0_2_4_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_2_4_1(){\n return Math.random()\n}\n\nfunction f0_2_4_2(){\n return Math.random()\n}\n\nfunction f0_2_4_3(){\n return isNaN(undefined)\n}\n\nfunction f0_2_4_4(){\n return isNaN(undefined)\n}\n\nfunction f0_2_4_5(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_2_4_6(){\n return Math.random()\n}\n\nfunction f0_2_4_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_2_4_8(){\n return Math.random()\n}\n\nfunction f0_2_4_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_2_4_10(){\n return isNaN(undefined)\n}\n\nfunction f0_2_4_11(){\n return isNaN(undefined)\n}\n\nfunction f0_2_4(){\n f0_2_4_0();\n f0_2_4_1();\n f0_2_4_2();\n f0_2_4_3();\n f0_2_4_4();\n f0_2_4_5();\n f0_2_4_6();\n f0_2_4_7();\n f0_2_4_8();\n f0_2_4_9();\n f0_2_4_10();\n f0_2_4_11();\n}\n\nfunction f0_2_5_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_2_5_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_2_5_2(){\n return Math.random()\n}\n\nfunction f0_2_5_3(){\n return Math.random()\n}\n\nfunction f0_2_5_4(){\n return isNaN(undefined)\n}\n\nfunction f0_2_5_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_2_5_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_2_5_7(){\n return isNaN(undefined)\n}\n\nfunction f0_2_5_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_2_5_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_2_5_10(){\n return Math.random()\n}\n\nfunction f0_2_5_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_2_5(){\n f0_2_5_0();\n f0_2_5_1();\n f0_2_5_2();\n f0_2_5_3();\n f0_2_5_4();\n f0_2_5_5();\n f0_2_5_6();\n f0_2_5_7();\n f0_2_5_8();\n f0_2_5_9();\n f0_2_5_10();\n f0_2_5_11();\n}\n\nfunction f0_2_6_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_2_6_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_2_6_2(){\n return Math.random()\n}\n\nfunction f0_2_6_3(){\n return Math.random()\n}\n\nfunction f0_2_6_4(){\n return Math.random()\n}\n\nfunction f0_2_6_5(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_2_6_6(){\n return Math.random()\n}\n\nfunction f0_2_6_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_2_6_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_2_6_9(){\n return Math.random()\n}\n\nfunction f0_2_6_10(){\n return isNaN(undefined)\n}\n\nfunction f0_2_6_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_2_6(){\n f0_2_6_0();\n f0_2_6_1();\n f0_2_6_2();\n f0_2_6_3();\n f0_2_6_4();\n f0_2_6_5();\n f0_2_6_6();\n f0_2_6_7();\n f0_2_6_8();\n f0_2_6_9();\n f0_2_6_10();\n f0_2_6_11();\n}\n\nfunction f0_2_7_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_2_7_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_2_7_2(){\n return isNaN(undefined)\n}\n\nfunction f0_2_7_3(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_2_7_4(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_2_7_5(){\n return isNaN(undefined)\n}\n\nfunction f0_2_7_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_2_7_7(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_2_7_8(){\n return isNaN(undefined)\n}\n\nfunction f0_2_7_9(){\n return Math.random()\n}\n\nfunction f0_2_7_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_2_7_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_2_7(){\n f0_2_7_0();\n f0_2_7_1();\n f0_2_7_2();\n f0_2_7_3();\n f0_2_7_4();\n f0_2_7_5();\n f0_2_7_6();\n f0_2_7_7();\n f0_2_7_8();\n f0_2_7_9();\n f0_2_7_10();\n f0_2_7_11();\n}\n\nfunction f0_2_8_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_2_8_1(){\n return Math.random()\n}\n\nfunction f0_2_8_2(){\n return isNaN(undefined)\n}\n\nfunction f0_2_8_3(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_2_8_4(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_2_8_5(){\n return isNaN(undefined)\n}\n\nfunction f0_2_8_6(){\n return Math.random()\n}\n\nfunction f0_2_8_7(){\n return isNaN(undefined)\n}\n\nfunction f0_2_8_8(){\n return Math.random()\n}\n\nfunction f0_2_8_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_2_8_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_2_8_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_2_8(){\n f0_2_8_0();\n f0_2_8_1();\n f0_2_8_2();\n f0_2_8_3();\n f0_2_8_4();\n f0_2_8_5();\n f0_2_8_6();\n f0_2_8_7();\n f0_2_8_8();\n f0_2_8_9();\n f0_2_8_10();\n f0_2_8_11();\n}\n\nfunction f0_2_9_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_2_9_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_2_9_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_2_9_3(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_2_9_4(){\n return isNaN(undefined)\n}\n\nfunction f0_2_9_5(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_2_9_6(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_2_9_7(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_2_9_8(){\n return Math.random()\n}\n\nfunction f0_2_9_9(){\n return Math.random()\n}\n\nfunction f0_2_9_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_2_9_11(){\n return isNaN(undefined)\n}\n\nfunction f0_2_9(){\n f0_2_9_0();\n f0_2_9_1();\n f0_2_9_2();\n f0_2_9_3();\n f0_2_9_4();\n f0_2_9_5();\n f0_2_9_6();\n f0_2_9_7();\n f0_2_9_8();\n f0_2_9_9();\n f0_2_9_10();\n f0_2_9_11();\n}\n\nfunction f0_2_10_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_2_10_1(){\n return Math.random()\n}\n\nfunction f0_2_10_2(){\n return isNaN(undefined)\n}\n\nfunction f0_2_10_3(){\n return isNaN(undefined)\n}\n\nfunction f0_2_10_4(){\n return isNaN(undefined)\n}\n\nfunction f0_2_10_5(){\n return isNaN(undefined)\n}\n\nfunction f0_2_10_6(){\n return isNaN(undefined)\n}\n\nfunction f0_2_10_7(){\n return Math.random()\n}\n\nfunction f0_2_10_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_2_10_9(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_2_10_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_2_10_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_2_10(){\n f0_2_10_0();\n f0_2_10_1();\n f0_2_10_2();\n f0_2_10_3();\n f0_2_10_4();\n f0_2_10_5();\n f0_2_10_6();\n f0_2_10_7();\n f0_2_10_8();\n f0_2_10_9();\n f0_2_10_10();\n f0_2_10_11();\n}\n\nfunction f0_2_11_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_2_11_1(){\n return Math.random()\n}\n\nfunction f0_2_11_2(){\n return Math.random()\n}\n\nfunction f0_2_11_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_2_11_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_2_11_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_2_11_6(){\n return isNaN(undefined)\n}\n\nfunction f0_2_11_7(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_2_11_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_2_11_9(){\n return isNaN(undefined)\n}\n\nfunction f0_2_11_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_2_11_11(){\n return isNaN(undefined)\n}\n\nfunction f0_2_11(){\n f0_2_11_0();\n f0_2_11_1();\n f0_2_11_2();\n f0_2_11_3();\n f0_2_11_4();\n f0_2_11_5();\n f0_2_11_6();\n f0_2_11_7();\n f0_2_11_8();\n f0_2_11_9();\n f0_2_11_10();\n f0_2_11_11();\n}\n\nfunction f0_2(){\n f0_2_0();\n f0_2_1();\n f0_2_2();\n f0_2_3();\n f0_2_4();\n f0_2_5();\n f0_2_6();\n f0_2_7();\n f0_2_8();\n f0_2_9();\n f0_2_10();\n f0_2_11();\n\n}\n\nfunction f0_3_0_0(){\n return Math.random()\n}\n\nfunction f0_3_0_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_0_2(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_3_0_3(){\n return isNaN(undefined)\n}\n\nfunction f0_3_0_4(){\n return Math.random()\n}\n\nfunction f0_3_0_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_0_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_3_0_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_3_0_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_3_0_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_0_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_0_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_0(){\n f0_3_0_0();\n f0_3_0_1();\n f0_3_0_2();\n f0_3_0_3();\n f0_3_0_4();\n f0_3_0_5();\n f0_3_0_6();\n f0_3_0_7();\n f0_3_0_8();\n f0_3_0_9();\n f0_3_0_10();\n f0_3_0_11();\n}\n\nfunction f0_3_1_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_1_1(){\n return isNaN(undefined)\n}\n\nfunction f0_3_1_2(){\n return Math.random()\n}\n\nfunction f0_3_1_3(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_1_4(){\n return isNaN(undefined)\n}\n\nfunction f0_3_1_5(){\n return Math.random()\n}\n\nfunction f0_3_1_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_3_1_7(){\n return isNaN(undefined)\n}\n\nfunction f0_3_1_8(){\n return Math.random()\n}\n\nfunction f0_3_1_9(){\n return Math.random()\n}\n\nfunction f0_3_1_10(){\n return Math.random()\n}\n\nfunction f0_3_1_11(){\n return Math.random()\n}\n\nfunction f0_3_1(){\n f0_3_1_0();\n f0_3_1_1();\n f0_3_1_2();\n f0_3_1_3();\n f0_3_1_4();\n f0_3_1_5();\n f0_3_1_6();\n f0_3_1_7();\n f0_3_1_8();\n f0_3_1_9();\n f0_3_1_10();\n f0_3_1_11();\n}\n\nfunction f0_3_2_0(){\n return Math.random()\n}\n\nfunction f0_3_2_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_3_2_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_2_3(){\n return isNaN(undefined)\n}\n\nfunction f0_3_2_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_2_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_2_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_3_2_7(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_2_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_3_2_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_2_10(){\n return isNaN(undefined)\n}\n\nfunction f0_3_2_11(){\n return Math.random()\n}\n\nfunction f0_3_2(){\n f0_3_2_0();\n f0_3_2_1();\n f0_3_2_2();\n f0_3_2_3();\n f0_3_2_4();\n f0_3_2_5();\n f0_3_2_6();\n f0_3_2_7();\n f0_3_2_8();\n f0_3_2_9();\n f0_3_2_10();\n f0_3_2_11();\n}\n\nfunction f0_3_3_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_3_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_3_3_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_3_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_3_3_4(){\n return isNaN(undefined)\n}\n\nfunction f0_3_3_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_3_6(){\n return Math.random()\n}\n\nfunction f0_3_3_7(){\n return isNaN(undefined)\n}\n\nfunction f0_3_3_8(){\n return isNaN(undefined)\n}\n\nfunction f0_3_3_9(){\n return isNaN(undefined)\n}\n\nfunction f0_3_3_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_3_11(){\n return Math.random()\n}\n\nfunction f0_3_3(){\n f0_3_3_0();\n f0_3_3_1();\n f0_3_3_2();\n f0_3_3_3();\n f0_3_3_4();\n f0_3_3_5();\n f0_3_3_6();\n f0_3_3_7();\n f0_3_3_8();\n f0_3_3_9();\n f0_3_3_10();\n f0_3_3_11();\n}\n\nfunction f0_3_4_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_4_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_4_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_4_3(){\n return Math.random()\n}\n\nfunction f0_3_4_4(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_3_4_5(){\n return Math.random()\n}\n\nfunction f0_3_4_6(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_4_7(){\n return Math.random()\n}\n\nfunction f0_3_4_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_4_9(){\n return Math.random()\n}\n\nfunction f0_3_4_10(){\n return Math.random()\n}\n\nfunction f0_3_4_11(){\n return Math.random()\n}\n\nfunction f0_3_4(){\n f0_3_4_0();\n f0_3_4_1();\n f0_3_4_2();\n f0_3_4_3();\n f0_3_4_4();\n f0_3_4_5();\n f0_3_4_6();\n f0_3_4_7();\n f0_3_4_8();\n f0_3_4_9();\n f0_3_4_10();\n f0_3_4_11();\n}\n\nfunction f0_3_5_0(){\n return Math.random()\n}\n\nfunction f0_3_5_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_3_5_2(){\n return isNaN(undefined)\n}\n\nfunction f0_3_5_3(){\n return isNaN(undefined)\n}\n\nfunction f0_3_5_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_5_5(){\n return Math.random()\n}\n\nfunction f0_3_5_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_3_5_7(){\n return Math.random()\n}\n\nfunction f0_3_5_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_5_9(){\n return isNaN(undefined)\n}\n\nfunction f0_3_5_10(){\n return Math.random()\n}\n\nfunction f0_3_5_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_3_5(){\n f0_3_5_0();\n f0_3_5_1();\n f0_3_5_2();\n f0_3_5_3();\n f0_3_5_4();\n f0_3_5_5();\n f0_3_5_6();\n f0_3_5_7();\n f0_3_5_8();\n f0_3_5_9();\n f0_3_5_10();\n f0_3_5_11();\n}\n\nfunction f0_3_6_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_3_6_1(){\n return isNaN(undefined)\n}\n\nfunction f0_3_6_2(){\n return Math.random()\n}\n\nfunction f0_3_6_3(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_6_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_6_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_6_6(){\n return isNaN(undefined)\n}\n\nfunction f0_3_6_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_3_6_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_6_9(){\n return isNaN(undefined)\n}\n\nfunction f0_3_6_10(){\n return Math.random()\n}\n\nfunction f0_3_6_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_3_6(){\n f0_3_6_0();\n f0_3_6_1();\n f0_3_6_2();\n f0_3_6_3();\n f0_3_6_4();\n f0_3_6_5();\n f0_3_6_6();\n f0_3_6_7();\n f0_3_6_8();\n f0_3_6_9();\n f0_3_6_10();\n f0_3_6_11();\n}\n\nfunction f0_3_7_0(){\n return isNaN(undefined)\n}\n\nfunction f0_3_7_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_7_2(){\n return Math.random()\n}\n\nfunction f0_3_7_3(){\n return isNaN(undefined)\n}\n\nfunction f0_3_7_4(){\n return isNaN(undefined)\n}\n\nfunction f0_3_7_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_7_6(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_7_7(){\n return isNaN(undefined)\n}\n\nfunction f0_3_7_8(){\n return Math.random()\n}\n\nfunction f0_3_7_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_7_10(){\n return isNaN(undefined)\n}\n\nfunction f0_3_7_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_7(){\n f0_3_7_0();\n f0_3_7_1();\n f0_3_7_2();\n f0_3_7_3();\n f0_3_7_4();\n f0_3_7_5();\n f0_3_7_6();\n f0_3_7_7();\n f0_3_7_8();\n f0_3_7_9();\n f0_3_7_10();\n f0_3_7_11();\n}\n\nfunction f0_3_8_0(){\n return Math.random()\n}\n\nfunction f0_3_8_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_8_2(){\n return isNaN(undefined)\n}\n\nfunction f0_3_8_3(){\n return Math.random()\n}\n\nfunction f0_3_8_4(){\n return Math.random()\n}\n\nfunction f0_3_8_5(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_3_8_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_3_8_7(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_8_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_8_9(){\n return Math.random()\n}\n\nfunction f0_3_8_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_3_8_11(){\n return Math.random()\n}\n\nfunction f0_3_8(){\n f0_3_8_0();\n f0_3_8_1();\n f0_3_8_2();\n f0_3_8_3();\n f0_3_8_4();\n f0_3_8_5();\n f0_3_8_6();\n f0_3_8_7();\n f0_3_8_8();\n f0_3_8_9();\n f0_3_8_10();\n f0_3_8_11();\n}\n\nfunction f0_3_9_0(){\n return isNaN(undefined)\n}\n\nfunction f0_3_9_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_9_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_9_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_3_9_4(){\n return isNaN(undefined)\n}\n\nfunction f0_3_9_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_9_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_3_9_7(){\n return Math.random()\n}\n\nfunction f0_3_9_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_3_9_9(){\n return Math.random()\n}\n\nfunction f0_3_9_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_9_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_9(){\n f0_3_9_0();\n f0_3_9_1();\n f0_3_9_2();\n f0_3_9_3();\n f0_3_9_4();\n f0_3_9_5();\n f0_3_9_6();\n f0_3_9_7();\n f0_3_9_8();\n f0_3_9_9();\n f0_3_9_10();\n f0_3_9_11();\n}\n\nfunction f0_3_10_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_3_10_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_3_10_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_10_3(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_10_4(){\n return isNaN(undefined)\n}\n\nfunction f0_3_10_5(){\n return Math.random()\n}\n\nfunction f0_3_10_6(){\n return isNaN(undefined)\n}\n\nfunction f0_3_10_7(){\n return isNaN(undefined)\n}\n\nfunction f0_3_10_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_10_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_10_10(){\n return isNaN(undefined)\n}\n\nfunction f0_3_10_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_3_10(){\n f0_3_10_0();\n f0_3_10_1();\n f0_3_10_2();\n f0_3_10_3();\n f0_3_10_4();\n f0_3_10_5();\n f0_3_10_6();\n f0_3_10_7();\n f0_3_10_8();\n f0_3_10_9();\n f0_3_10_10();\n f0_3_10_11();\n}\n\nfunction f0_3_11_0(){\n return isNaN(undefined)\n}\n\nfunction f0_3_11_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_3_11_2(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_3_11_3(){\n return isNaN(undefined)\n}\n\nfunction f0_3_11_4(){\n return isNaN(undefined)\n}\n\nfunction f0_3_11_5(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_3_11_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_3_11_7(){\n return Math.random()\n}\n\nfunction f0_3_11_8(){\n return Math.random()\n}\n\nfunction f0_3_11_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_3_11_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_3_11_11(){\n return Math.random()\n}\n\nfunction f0_3_11(){\n f0_3_11_0();\n f0_3_11_1();\n f0_3_11_2();\n f0_3_11_3();\n f0_3_11_4();\n f0_3_11_5();\n f0_3_11_6();\n f0_3_11_7();\n f0_3_11_8();\n f0_3_11_9();\n f0_3_11_10();\n f0_3_11_11();\n}\n\nfunction f0_3(){\n f0_3_0();\n f0_3_1();\n f0_3_2();\n f0_3_3();\n f0_3_4();\n f0_3_5();\n f0_3_6();\n f0_3_7();\n f0_3_8();\n f0_3_9();\n f0_3_10();\n f0_3_11();\n\n}\n\nfunction f0_4_0_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_0_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_0_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_4_0_3(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_4_0_4(){\n return Math.random()\n}\n\nfunction f0_4_0_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_4_0_6(){\n return isNaN(undefined)\n}\n\nfunction f0_4_0_7(){\n return isNaN(undefined)\n}\n\nfunction f0_4_0_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_4_0_9(){\n return Math.random()\n}\n\nfunction f0_4_0_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_0_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_0(){\n f0_4_0_0();\n f0_4_0_1();\n f0_4_0_2();\n f0_4_0_3();\n f0_4_0_4();\n f0_4_0_5();\n f0_4_0_6();\n f0_4_0_7();\n f0_4_0_8();\n f0_4_0_9();\n f0_4_0_10();\n f0_4_0_11();\n}\n\nfunction f0_4_1_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_1_1(){\n return Math.random()\n}\n\nfunction f0_4_1_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_4_1_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_1_4(){\n return isNaN(undefined)\n}\n\nfunction f0_4_1_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_4_1_6(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_4_1_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_1_8(){\n return isNaN(undefined)\n}\n\nfunction f0_4_1_9(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_1_10(){\n return isNaN(undefined)\n}\n\nfunction f0_4_1_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_1(){\n f0_4_1_0();\n f0_4_1_1();\n f0_4_1_2();\n f0_4_1_3();\n f0_4_1_4();\n f0_4_1_5();\n f0_4_1_6();\n f0_4_1_7();\n f0_4_1_8();\n f0_4_1_9();\n f0_4_1_10();\n f0_4_1_11();\n}\n\nfunction f0_4_2_0(){\n return Math.random()\n}\n\nfunction f0_4_2_1(){\n return Math.random()\n}\n\nfunction f0_4_2_2(){\n return isNaN(undefined)\n}\n\nfunction f0_4_2_3(){\n return isNaN(undefined)\n}\n\nfunction f0_4_2_4(){\n return isNaN(undefined)\n}\n\nfunction f0_4_2_5(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_2_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_2_7(){\n return Math.random()\n}\n\nfunction f0_4_2_8(){\n return Math.random()\n}\n\nfunction f0_4_2_9(){\n return isNaN(undefined)\n}\n\nfunction f0_4_2_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_4_2_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_4_2(){\n f0_4_2_0();\n f0_4_2_1();\n f0_4_2_2();\n f0_4_2_3();\n f0_4_2_4();\n f0_4_2_5();\n f0_4_2_6();\n f0_4_2_7();\n f0_4_2_8();\n f0_4_2_9();\n f0_4_2_10();\n f0_4_2_11();\n}\n\nfunction f0_4_3_0(){\n return isNaN(undefined)\n}\n\nfunction f0_4_3_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_3_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_4_3_3(){\n return isNaN(undefined)\n}\n\nfunction f0_4_3_4(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_3_5(){\n return isNaN(undefined)\n}\n\nfunction f0_4_3_6(){\n return Math.random()\n}\n\nfunction f0_4_3_7(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_4_3_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_3_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_4_3_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_4_3_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_3(){\n f0_4_3_0();\n f0_4_3_1();\n f0_4_3_2();\n f0_4_3_3();\n f0_4_3_4();\n f0_4_3_5();\n f0_4_3_6();\n f0_4_3_7();\n f0_4_3_8();\n f0_4_3_9();\n f0_4_3_10();\n f0_4_3_11();\n}\n\nfunction f0_4_4_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_4_4_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_4_4_2(){\n return isNaN(undefined)\n}\n\nfunction f0_4_4_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_4_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_4_4_5(){\n return isNaN(undefined)\n}\n\nfunction f0_4_4_6(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_4_4_7(){\n return Math.random()\n}\n\nfunction f0_4_4_8(){\n return isNaN(undefined)\n}\n\nfunction f0_4_4_9(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_4_10(){\n return isNaN(undefined)\n}\n\nfunction f0_4_4_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_4_4(){\n f0_4_4_0();\n f0_4_4_1();\n f0_4_4_2();\n f0_4_4_3();\n f0_4_4_4();\n f0_4_4_5();\n f0_4_4_6();\n f0_4_4_7();\n f0_4_4_8();\n f0_4_4_9();\n f0_4_4_10();\n f0_4_4_11();\n}\n\nfunction f0_4_5_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_4_5_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_5_2(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_5_3(){\n return isNaN(undefined)\n}\n\nfunction f0_4_5_4(){\n return Math.random()\n}\n\nfunction f0_4_5_5(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_5_6(){\n return isNaN(undefined)\n}\n\nfunction f0_4_5_7(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_4_5_8(){\n return Math.random()\n}\n\nfunction f0_4_5_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_4_5_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_5_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_5(){\n f0_4_5_0();\n f0_4_5_1();\n f0_4_5_2();\n f0_4_5_3();\n f0_4_5_4();\n f0_4_5_5();\n f0_4_5_6();\n f0_4_5_7();\n f0_4_5_8();\n f0_4_5_9();\n f0_4_5_10();\n f0_4_5_11();\n}\n\nfunction f0_4_6_0(){\n return Math.random()\n}\n\nfunction f0_4_6_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_6_2(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_6_3(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_4_6_4(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_6_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_4_6_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_6_7(){\n return Math.random()\n}\n\nfunction f0_4_6_8(){\n return isNaN(undefined)\n}\n\nfunction f0_4_6_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_4_6_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_6_11(){\n return Math.random()\n}\n\nfunction f0_4_6(){\n f0_4_6_0();\n f0_4_6_1();\n f0_4_6_2();\n f0_4_6_3();\n f0_4_6_4();\n f0_4_6_5();\n f0_4_6_6();\n f0_4_6_7();\n f0_4_6_8();\n f0_4_6_9();\n f0_4_6_10();\n f0_4_6_11();\n}\n\nfunction f0_4_7_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_7_1(){\n return Math.random()\n}\n\nfunction f0_4_7_2(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_7_3(){\n return isNaN(undefined)\n}\n\nfunction f0_4_7_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_4_7_5(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_7_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_7_7(){\n return isNaN(undefined)\n}\n\nfunction f0_4_7_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_7_9(){\n return Math.random()\n}\n\nfunction f0_4_7_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_4_7_11(){\n return isNaN(undefined)\n}\n\nfunction f0_4_7(){\n f0_4_7_0();\n f0_4_7_1();\n f0_4_7_2();\n f0_4_7_3();\n f0_4_7_4();\n f0_4_7_5();\n f0_4_7_6();\n f0_4_7_7();\n f0_4_7_8();\n f0_4_7_9();\n f0_4_7_10();\n f0_4_7_11();\n}\n\nfunction f0_4_8_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_4_8_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_8_2(){\n return Math.random()\n}\n\nfunction f0_4_8_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_8_4(){\n return Math.random()\n}\n\nfunction f0_4_8_5(){\n return isNaN(undefined)\n}\n\nfunction f0_4_8_6(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_4_8_7(){\n return Math.random()\n}\n\nfunction f0_4_8_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_8_9(){\n return isNaN(undefined)\n}\n\nfunction f0_4_8_10(){\n return Math.random()\n}\n\nfunction f0_4_8_11(){\n return isNaN(undefined)\n}\n\nfunction f0_4_8(){\n f0_4_8_0();\n f0_4_8_1();\n f0_4_8_2();\n f0_4_8_3();\n f0_4_8_4();\n f0_4_8_5();\n f0_4_8_6();\n f0_4_8_7();\n f0_4_8_8();\n f0_4_8_9();\n f0_4_8_10();\n f0_4_8_11();\n}\n\nfunction f0_4_9_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_9_1(){\n return Math.random()\n}\n\nfunction f0_4_9_2(){\n return Math.random()\n}\n\nfunction f0_4_9_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_9_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_4_9_5(){\n return isNaN(undefined)\n}\n\nfunction f0_4_9_6(){\n return isNaN(undefined)\n}\n\nfunction f0_4_9_7(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_4_9_8(){\n return Math.random()\n}\n\nfunction f0_4_9_9(){\n return Math.random()\n}\n\nfunction f0_4_9_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_9_11(){\n return Math.random()\n}\n\nfunction f0_4_9(){\n f0_4_9_0();\n f0_4_9_1();\n f0_4_9_2();\n f0_4_9_3();\n f0_4_9_4();\n f0_4_9_5();\n f0_4_9_6();\n f0_4_9_7();\n f0_4_9_8();\n f0_4_9_9();\n f0_4_9_10();\n f0_4_9_11();\n}\n\nfunction f0_4_10_0(){\n return isNaN(undefined)\n}\n\nfunction f0_4_10_1(){\n return isNaN(undefined)\n}\n\nfunction f0_4_10_2(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_10_3(){\n return Math.random()\n}\n\nfunction f0_4_10_4(){\n return Math.random()\n}\n\nfunction f0_4_10_5(){\n return Math.random()\n}\n\nfunction f0_4_10_6(){\n return isNaN(undefined)\n}\n\nfunction f0_4_10_7(){\n return isNaN(undefined)\n}\n\nfunction f0_4_10_8(){\n return Math.random()\n}\n\nfunction f0_4_10_9(){\n return Math.random()\n}\n\nfunction f0_4_10_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_4_10_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_4_10(){\n f0_4_10_0();\n f0_4_10_1();\n f0_4_10_2();\n f0_4_10_3();\n f0_4_10_4();\n f0_4_10_5();\n f0_4_10_6();\n f0_4_10_7();\n f0_4_10_8();\n f0_4_10_9();\n f0_4_10_10();\n f0_4_10_11();\n}\n\nfunction f0_4_11_0(){\n return isNaN(undefined)\n}\n\nfunction f0_4_11_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_11_2(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_11_3(){\n return isNaN(undefined)\n}\n\nfunction f0_4_11_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_4_11_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_4_11_6(){\n return isNaN(undefined)\n}\n\nfunction f0_4_11_7(){\n return isNaN(undefined)\n}\n\nfunction f0_4_11_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_4_11_9(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_4_11_10(){\n return isNaN(undefined)\n}\n\nfunction f0_4_11_11(){\n return isNaN(undefined)\n}\n\nfunction f0_4_11(){\n f0_4_11_0();\n f0_4_11_1();\n f0_4_11_2();\n f0_4_11_3();\n f0_4_11_4();\n f0_4_11_5();\n f0_4_11_6();\n f0_4_11_7();\n f0_4_11_8();\n f0_4_11_9();\n f0_4_11_10();\n f0_4_11_11();\n}\n\nfunction f0_4(){\n f0_4_0();\n f0_4_1();\n f0_4_2();\n f0_4_3();\n f0_4_4();\n f0_4_5();\n f0_4_6();\n f0_4_7();\n f0_4_8();\n f0_4_9();\n f0_4_10();\n f0_4_11();\n\n}\n\nfunction f0_5_0_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_5_0_1(){\n return Math.random()\n}\n\nfunction f0_5_0_2(){\n return isNaN(undefined)\n}\n\nfunction f0_5_0_3(){\n return Math.random()\n}\n\nfunction f0_5_0_4(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_5_0_5(){\n return isNaN(undefined)\n}\n\nfunction f0_5_0_6(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_0_7(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_0_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_5_0_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_0_10(){\n return Math.random()\n}\n\nfunction f0_5_0_11(){\n return isNaN(undefined)\n}\n\nfunction f0_5_0(){\n f0_5_0_0();\n f0_5_0_1();\n f0_5_0_2();\n f0_5_0_3();\n f0_5_0_4();\n f0_5_0_5();\n f0_5_0_6();\n f0_5_0_7();\n f0_5_0_8();\n f0_5_0_9();\n f0_5_0_10();\n f0_5_0_11();\n}\n\nfunction f0_5_1_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_5_1_1(){\n return isNaN(undefined)\n}\n\nfunction f0_5_1_2(){\n return Math.random()\n}\n\nfunction f0_5_1_3(){\n return isNaN(undefined)\n}\n\nfunction f0_5_1_4(){\n return Math.random()\n}\n\nfunction f0_5_1_5(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_5_1_6(){\n return isNaN(undefined)\n}\n\nfunction f0_5_1_7(){\n return isNaN(undefined)\n}\n\nfunction f0_5_1_8(){\n return Math.random()\n}\n\nfunction f0_5_1_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_1_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_5_1_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_5_1(){\n f0_5_1_0();\n f0_5_1_1();\n f0_5_1_2();\n f0_5_1_3();\n f0_5_1_4();\n f0_5_1_5();\n f0_5_1_6();\n f0_5_1_7();\n f0_5_1_8();\n f0_5_1_9();\n f0_5_1_10();\n f0_5_1_11();\n}\n\nfunction f0_5_2_0(){\n return isNaN(undefined)\n}\n\nfunction f0_5_2_1(){\n return isNaN(undefined)\n}\n\nfunction f0_5_2_2(){\n return Math.random()\n}\n\nfunction f0_5_2_3(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_2_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_2_5(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_5_2_6(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_2_7(){\n return Math.random()\n}\n\nfunction f0_5_2_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_5_2_9(){\n return isNaN(undefined)\n}\n\nfunction f0_5_2_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_2_11(){\n return isNaN(undefined)\n}\n\nfunction f0_5_2(){\n f0_5_2_0();\n f0_5_2_1();\n f0_5_2_2();\n f0_5_2_3();\n f0_5_2_4();\n f0_5_2_5();\n f0_5_2_6();\n f0_5_2_7();\n f0_5_2_8();\n f0_5_2_9();\n f0_5_2_10();\n f0_5_2_11();\n}\n\nfunction f0_5_3_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_3_1(){\n return isNaN(undefined)\n}\n\nfunction f0_5_3_2(){\n return Math.random()\n}\n\nfunction f0_5_3_3(){\n return isNaN(undefined)\n}\n\nfunction f0_5_3_4(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_5_3_5(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_5_3_6(){\n return isNaN(undefined)\n}\n\nfunction f0_5_3_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_5_3_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_3_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_3_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_5_3_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_3(){\n f0_5_3_0();\n f0_5_3_1();\n f0_5_3_2();\n f0_5_3_3();\n f0_5_3_4();\n f0_5_3_5();\n f0_5_3_6();\n f0_5_3_7();\n f0_5_3_8();\n f0_5_3_9();\n f0_5_3_10();\n f0_5_3_11();\n}\n\nfunction f0_5_4_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_4_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_4_2(){\n return Math.random()\n}\n\nfunction f0_5_4_3(){\n return Math.random()\n}\n\nfunction f0_5_4_4(){\n return Math.random()\n}\n\nfunction f0_5_4_5(){\n return Math.random()\n}\n\nfunction f0_5_4_6(){\n return Math.random()\n}\n\nfunction f0_5_4_7(){\n return Math.random()\n}\n\nfunction f0_5_4_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_4_9(){\n return Math.random()\n}\n\nfunction f0_5_4_10(){\n return isNaN(undefined)\n}\n\nfunction f0_5_4_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_5_4(){\n f0_5_4_0();\n f0_5_4_1();\n f0_5_4_2();\n f0_5_4_3();\n f0_5_4_4();\n f0_5_4_5();\n f0_5_4_6();\n f0_5_4_7();\n f0_5_4_8();\n f0_5_4_9();\n f0_5_4_10();\n f0_5_4_11();\n}\n\nfunction f0_5_5_0(){\n return isNaN(undefined)\n}\n\nfunction f0_5_5_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_5_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_5_3(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_5_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_5_5(){\n return isNaN(undefined)\n}\n\nfunction f0_5_5_6(){\n return Math.random()\n}\n\nfunction f0_5_5_7(){\n return Math.random()\n}\n\nfunction f0_5_5_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_5_9(){\n return Math.random()\n}\n\nfunction f0_5_5_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_5_11(){\n return Math.random()\n}\n\nfunction f0_5_5(){\n f0_5_5_0();\n f0_5_5_1();\n f0_5_5_2();\n f0_5_5_3();\n f0_5_5_4();\n f0_5_5_5();\n f0_5_5_6();\n f0_5_5_7();\n f0_5_5_8();\n f0_5_5_9();\n f0_5_5_10();\n f0_5_5_11();\n}\n\nfunction f0_5_6_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_6_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_6_2(){\n return Math.random()\n}\n\nfunction f0_5_6_3(){\n return isNaN(undefined)\n}\n\nfunction f0_5_6_4(){\n return Math.random()\n}\n\nfunction f0_5_6_5(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_5_6_6(){\n return Math.random()\n}\n\nfunction f0_5_6_7(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_6_8(){\n return isNaN(undefined)\n}\n\nfunction f0_5_6_9(){\n return isNaN(undefined)\n}\n\nfunction f0_5_6_10(){\n return Math.random()\n}\n\nfunction f0_5_6_11(){\n return Math.random()\n}\n\nfunction f0_5_6(){\n f0_5_6_0();\n f0_5_6_1();\n f0_5_6_2();\n f0_5_6_3();\n f0_5_6_4();\n f0_5_6_5();\n f0_5_6_6();\n f0_5_6_7();\n f0_5_6_8();\n f0_5_6_9();\n f0_5_6_10();\n f0_5_6_11();\n}\n\nfunction f0_5_7_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_5_7_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_5_7_2(){\n return Math.random()\n}\n\nfunction f0_5_7_3(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_7_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_7_5(){\n return Math.random()\n}\n\nfunction f0_5_7_6(){\n return isNaN(undefined)\n}\n\nfunction f0_5_7_7(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_7_8(){\n return Math.random()\n}\n\nfunction f0_5_7_9(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_5_7_10(){\n return Math.random()\n}\n\nfunction f0_5_7_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_7(){\n f0_5_7_0();\n f0_5_7_1();\n f0_5_7_2();\n f0_5_7_3();\n f0_5_7_4();\n f0_5_7_5();\n f0_5_7_6();\n f0_5_7_7();\n f0_5_7_8();\n f0_5_7_9();\n f0_5_7_10();\n f0_5_7_11();\n}\n\nfunction f0_5_8_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_8_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_5_8_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_8_3(){\n return Math.random()\n}\n\nfunction f0_5_8_4(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_5_8_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_8_6(){\n return Math.random()\n}\n\nfunction f0_5_8_7(){\n return Math.random()\n}\n\nfunction f0_5_8_8(){\n return isNaN(undefined)\n}\n\nfunction f0_5_8_9(){\n return Math.random()\n}\n\nfunction f0_5_8_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_8_11(){\n return isNaN(undefined)\n}\n\nfunction f0_5_8(){\n f0_5_8_0();\n f0_5_8_1();\n f0_5_8_2();\n f0_5_8_3();\n f0_5_8_4();\n f0_5_8_5();\n f0_5_8_6();\n f0_5_8_7();\n f0_5_8_8();\n f0_5_8_9();\n f0_5_8_10();\n f0_5_8_11();\n}\n\nfunction f0_5_9_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_9_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_9_2(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_5_9_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_5_9_4(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_5_9_5(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_5_9_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_5_9_7(){\n return Math.random()\n}\n\nfunction f0_5_9_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_5_9_9(){\n return Math.random()\n}\n\nfunction f0_5_9_10(){\n return Math.random()\n}\n\nfunction f0_5_9_11(){\n return isNaN(undefined)\n}\n\nfunction f0_5_9(){\n f0_5_9_0();\n f0_5_9_1();\n f0_5_9_2();\n f0_5_9_3();\n f0_5_9_4();\n f0_5_9_5();\n f0_5_9_6();\n f0_5_9_7();\n f0_5_9_8();\n f0_5_9_9();\n f0_5_9_10();\n f0_5_9_11();\n}\n\nfunction f0_5_10_0(){\n return isNaN(undefined)\n}\n\nfunction f0_5_10_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_10_2(){\n return isNaN(undefined)\n}\n\nfunction f0_5_10_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_5_10_4(){\n return Math.random()\n}\n\nfunction f0_5_10_5(){\n return Math.random()\n}\n\nfunction f0_5_10_6(){\n return Math.random()\n}\n\nfunction f0_5_10_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_5_10_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_10_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_10_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_5_10_11(){\n return Math.random()\n}\n\nfunction f0_5_10(){\n f0_5_10_0();\n f0_5_10_1();\n f0_5_10_2();\n f0_5_10_3();\n f0_5_10_4();\n f0_5_10_5();\n f0_5_10_6();\n f0_5_10_7();\n f0_5_10_8();\n f0_5_10_9();\n f0_5_10_10();\n f0_5_10_11();\n}\n\nfunction f0_5_11_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_11_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_5_11_2(){\n return Math.random()\n}\n\nfunction f0_5_11_3(){\n return Math.random()\n}\n\nfunction f0_5_11_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_5_11_5(){\n return Math.random()\n}\n\nfunction f0_5_11_6(){\n return Math.random()\n}\n\nfunction f0_5_11_7(){\n return isNaN(undefined)\n}\n\nfunction f0_5_11_8(){\n return isNaN(undefined)\n}\n\nfunction f0_5_11_9(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_5_11_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_5_11_11(){\n return isNaN(undefined)\n}\n\nfunction f0_5_11(){\n f0_5_11_0();\n f0_5_11_1();\n f0_5_11_2();\n f0_5_11_3();\n f0_5_11_4();\n f0_5_11_5();\n f0_5_11_6();\n f0_5_11_7();\n f0_5_11_8();\n f0_5_11_9();\n f0_5_11_10();\n f0_5_11_11();\n}\n\nfunction f0_5(){\n f0_5_0();\n f0_5_1();\n f0_5_2();\n f0_5_3();\n f0_5_4();\n f0_5_5();\n f0_5_6();\n f0_5_7();\n f0_5_8();\n f0_5_9();\n f0_5_10();\n f0_5_11();\n\n}\n\nfunction f0_6_0_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_6_0_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_6_0_2(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_0_3(){\n return Math.random()\n}\n\nfunction f0_6_0_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_6_0_5(){\n return isNaN(undefined)\n}\n\nfunction f0_6_0_6(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_6_0_7(){\n return Math.random()\n}\n\nfunction f0_6_0_8(){\n return isNaN(undefined)\n}\n\nfunction f0_6_0_9(){\n return isNaN(undefined)\n}\n\nfunction f0_6_0_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_0_11(){\n return isNaN(undefined)\n}\n\nfunction f0_6_0(){\n f0_6_0_0();\n f0_6_0_1();\n f0_6_0_2();\n f0_6_0_3();\n f0_6_0_4();\n f0_6_0_5();\n f0_6_0_6();\n f0_6_0_7();\n f0_6_0_8();\n f0_6_0_9();\n f0_6_0_10();\n f0_6_0_11();\n}\n\nfunction f0_6_1_0(){\n return isNaN(undefined)\n}\n\nfunction f0_6_1_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_1_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_6_1_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_1_4(){\n return Math.random()\n}\n\nfunction f0_6_1_5(){\n return isNaN(undefined)\n}\n\nfunction f0_6_1_6(){\n return isNaN(undefined)\n}\n\nfunction f0_6_1_7(){\n return isNaN(undefined)\n}\n\nfunction f0_6_1_8(){\n return Math.random()\n}\n\nfunction f0_6_1_9(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_1_10(){\n return Math.random()\n}\n\nfunction f0_6_1_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_6_1(){\n f0_6_1_0();\n f0_6_1_1();\n f0_6_1_2();\n f0_6_1_3();\n f0_6_1_4();\n f0_6_1_5();\n f0_6_1_6();\n f0_6_1_7();\n f0_6_1_8();\n f0_6_1_9();\n f0_6_1_10();\n f0_6_1_11();\n}\n\nfunction f0_6_2_0(){\n return isNaN(undefined)\n}\n\nfunction f0_6_2_1(){\n return Math.random()\n}\n\nfunction f0_6_2_2(){\n return isNaN(undefined)\n}\n\nfunction f0_6_2_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_2_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_6_2_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_6_2_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_2_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_2_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_6_2_9(){\n return Math.random()\n}\n\nfunction f0_6_2_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_2_11(){\n return isNaN(undefined)\n}\n\nfunction f0_6_2(){\n f0_6_2_0();\n f0_6_2_1();\n f0_6_2_2();\n f0_6_2_3();\n f0_6_2_4();\n f0_6_2_5();\n f0_6_2_6();\n f0_6_2_7();\n f0_6_2_8();\n f0_6_2_9();\n f0_6_2_10();\n f0_6_2_11();\n}\n\nfunction f0_6_3_0(){\n return Math.random()\n}\n\nfunction f0_6_3_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_6_3_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_6_3_3(){\n return isNaN(undefined)\n}\n\nfunction f0_6_3_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_6_3_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_6_3_6(){\n return Math.random()\n}\n\nfunction f0_6_3_7(){\n return isNaN(undefined)\n}\n\nfunction f0_6_3_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_3_9(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_3_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_3_11(){\n return Math.random()\n}\n\nfunction f0_6_3(){\n f0_6_3_0();\n f0_6_3_1();\n f0_6_3_2();\n f0_6_3_3();\n f0_6_3_4();\n f0_6_3_5();\n f0_6_3_6();\n f0_6_3_7();\n f0_6_3_8();\n f0_6_3_9();\n f0_6_3_10();\n f0_6_3_11();\n}\n\nfunction f0_6_4_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_4_1(){\n return Math.random()\n}\n\nfunction f0_6_4_2(){\n return isNaN(undefined)\n}\n\nfunction f0_6_4_3(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_6_4_4(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_4_5(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_4_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_4_7(){\n return Math.random()\n}\n\nfunction f0_6_4_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_6_4_9(){\n return isNaN(undefined)\n}\n\nfunction f0_6_4_10(){\n return isNaN(undefined)\n}\n\nfunction f0_6_4_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_4(){\n f0_6_4_0();\n f0_6_4_1();\n f0_6_4_2();\n f0_6_4_3();\n f0_6_4_4();\n f0_6_4_5();\n f0_6_4_6();\n f0_6_4_7();\n f0_6_4_8();\n f0_6_4_9();\n f0_6_4_10();\n f0_6_4_11();\n}\n\nfunction f0_6_5_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_6_5_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_6_5_2(){\n return isNaN(undefined)\n}\n\nfunction f0_6_5_3(){\n return isNaN(undefined)\n}\n\nfunction f0_6_5_4(){\n return Math.random()\n}\n\nfunction f0_6_5_5(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_5_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_5_7(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_6_5_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_6_5_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_6_5_10(){\n return isNaN(undefined)\n}\n\nfunction f0_6_5_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_5(){\n f0_6_5_0();\n f0_6_5_1();\n f0_6_5_2();\n f0_6_5_3();\n f0_6_5_4();\n f0_6_5_5();\n f0_6_5_6();\n f0_6_5_7();\n f0_6_5_8();\n f0_6_5_9();\n f0_6_5_10();\n f0_6_5_11();\n}\n\nfunction f0_6_6_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_6_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_6_2(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_6_3(){\n return Math.random()\n}\n\nfunction f0_6_6_4(){\n return isNaN(undefined)\n}\n\nfunction f0_6_6_5(){\n return isNaN(undefined)\n}\n\nfunction f0_6_6_6(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_6_6_7(){\n return isNaN(undefined)\n}\n\nfunction f0_6_6_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_6_9(){\n return isNaN(undefined)\n}\n\nfunction f0_6_6_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_6_11(){\n return isNaN(undefined)\n}\n\nfunction f0_6_6(){\n f0_6_6_0();\n f0_6_6_1();\n f0_6_6_2();\n f0_6_6_3();\n f0_6_6_4();\n f0_6_6_5();\n f0_6_6_6();\n f0_6_6_7();\n f0_6_6_8();\n f0_6_6_9();\n f0_6_6_10();\n f0_6_6_11();\n}\n\nfunction f0_6_7_0(){\n return isNaN(undefined)\n}\n\nfunction f0_6_7_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_6_7_2(){\n return Math.random()\n}\n\nfunction f0_6_7_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_7_4(){\n return Math.random()\n}\n\nfunction f0_6_7_5(){\n return isNaN(undefined)\n}\n\nfunction f0_6_7_6(){\n return isNaN(undefined)\n}\n\nfunction f0_6_7_7(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_6_7_8(){\n return Math.random()\n}\n\nfunction f0_6_7_9(){\n return Math.random()\n}\n\nfunction f0_6_7_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_7_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_7(){\n f0_6_7_0();\n f0_6_7_1();\n f0_6_7_2();\n f0_6_7_3();\n f0_6_7_4();\n f0_6_7_5();\n f0_6_7_6();\n f0_6_7_7();\n f0_6_7_8();\n f0_6_7_9();\n f0_6_7_10();\n f0_6_7_11();\n}\n\nfunction f0_6_8_0(){\n return isNaN(undefined)\n}\n\nfunction f0_6_8_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_6_8_2(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_8_3(){\n return isNaN(undefined)\n}\n\nfunction f0_6_8_4(){\n return isNaN(undefined)\n}\n\nfunction f0_6_8_5(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_8_6(){\n return isNaN(undefined)\n}\n\nfunction f0_6_8_7(){\n return Math.random()\n}\n\nfunction f0_6_8_8(){\n return Math.random()\n}\n\nfunction f0_6_8_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_6_8_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_8_11(){\n return Math.random()\n}\n\nfunction f0_6_8(){\n f0_6_8_0();\n f0_6_8_1();\n f0_6_8_2();\n f0_6_8_3();\n f0_6_8_4();\n f0_6_8_5();\n f0_6_8_6();\n f0_6_8_7();\n f0_6_8_8();\n f0_6_8_9();\n f0_6_8_10();\n f0_6_8_11();\n}\n\nfunction f0_6_9_0(){\n return isNaN(undefined)\n}\n\nfunction f0_6_9_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_9_2(){\n return isNaN(undefined)\n}\n\nfunction f0_6_9_3(){\n return Math.random()\n}\n\nfunction f0_6_9_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_6_9_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_6_9_6(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_6_9_7(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_6_9_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_9_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_6_9_10(){\n return isNaN(undefined)\n}\n\nfunction f0_6_9_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_6_9(){\n f0_6_9_0();\n f0_6_9_1();\n f0_6_9_2();\n f0_6_9_3();\n f0_6_9_4();\n f0_6_9_5();\n f0_6_9_6();\n f0_6_9_7();\n f0_6_9_8();\n f0_6_9_9();\n f0_6_9_10();\n f0_6_9_11();\n}\n\nfunction f0_6_10_0(){\n return isNaN(undefined)\n}\n\nfunction f0_6_10_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_6_10_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_6_10_3(){\n return isNaN(undefined)\n}\n\nfunction f0_6_10_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_6_10_5(){\n return Math.random()\n}\n\nfunction f0_6_10_6(){\n return Math.random()\n}\n\nfunction f0_6_10_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_10_8(){\n return isNaN(undefined)\n}\n\nfunction f0_6_10_9(){\n return Math.random()\n}\n\nfunction f0_6_10_10(){\n return isNaN(undefined)\n}\n\nfunction f0_6_10_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_10(){\n f0_6_10_0();\n f0_6_10_1();\n f0_6_10_2();\n f0_6_10_3();\n f0_6_10_4();\n f0_6_10_5();\n f0_6_10_6();\n f0_6_10_7();\n f0_6_10_8();\n f0_6_10_9();\n f0_6_10_10();\n f0_6_10_11();\n}\n\nfunction f0_6_11_0(){\n return isNaN(undefined)\n}\n\nfunction f0_6_11_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_11_2(){\n return Math.random()\n}\n\nfunction f0_6_11_3(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_6_11_4(){\n return Math.random()\n}\n\nfunction f0_6_11_5(){\n return isNaN(undefined)\n}\n\nfunction f0_6_11_6(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_6_11_7(){\n return Math.random()\n}\n\nfunction f0_6_11_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_11_9(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_11_10(){\n return Math.random()\n}\n\nfunction f0_6_11_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_6_11(){\n f0_6_11_0();\n f0_6_11_1();\n f0_6_11_2();\n f0_6_11_3();\n f0_6_11_4();\n f0_6_11_5();\n f0_6_11_6();\n f0_6_11_7();\n f0_6_11_8();\n f0_6_11_9();\n f0_6_11_10();\n f0_6_11_11();\n}\n\nfunction f0_6(){\n f0_6_0();\n f0_6_1();\n f0_6_2();\n f0_6_3();\n f0_6_4();\n f0_6_5();\n f0_6_6();\n f0_6_7();\n f0_6_8();\n f0_6_9();\n f0_6_10();\n f0_6_11();\n\n}\n\nfunction f0_7_0_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_7_0_1(){\n return Math.random()\n}\n\nfunction f0_7_0_2(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_7_0_3(){\n return isNaN(undefined)\n}\n\nfunction f0_7_0_4(){\n return Math.random()\n}\n\nfunction f0_7_0_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_0_6(){\n return isNaN(undefined)\n}\n\nfunction f0_7_0_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_7_0_8(){\n return Math.random()\n}\n\nfunction f0_7_0_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_0_10(){\n return isNaN(undefined)\n}\n\nfunction f0_7_0_11(){\n return isNaN(undefined)\n}\n\nfunction f0_7_0(){\n f0_7_0_0();\n f0_7_0_1();\n f0_7_0_2();\n f0_7_0_3();\n f0_7_0_4();\n f0_7_0_5();\n f0_7_0_6();\n f0_7_0_7();\n f0_7_0_8();\n f0_7_0_9();\n f0_7_0_10();\n f0_7_0_11();\n}\n\nfunction f0_7_1_0(){\n return Math.random()\n}\n\nfunction f0_7_1_1(){\n return Math.random()\n}\n\nfunction f0_7_1_2(){\n return Math.random()\n}\n\nfunction f0_7_1_3(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_1_4(){\n return Math.random()\n}\n\nfunction f0_7_1_5(){\n return isNaN(undefined)\n}\n\nfunction f0_7_1_6(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_1_7(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_1_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_1_9(){\n return Math.random()\n}\n\nfunction f0_7_1_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_7_1_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_1(){\n f0_7_1_0();\n f0_7_1_1();\n f0_7_1_2();\n f0_7_1_3();\n f0_7_1_4();\n f0_7_1_5();\n f0_7_1_6();\n f0_7_1_7();\n f0_7_1_8();\n f0_7_1_9();\n f0_7_1_10();\n f0_7_1_11();\n}\n\nfunction f0_7_2_0(){\n return isNaN(undefined)\n}\n\nfunction f0_7_2_1(){\n return Math.random()\n}\n\nfunction f0_7_2_2(){\n return isNaN(undefined)\n}\n\nfunction f0_7_2_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_7_2_4(){\n return isNaN(undefined)\n}\n\nfunction f0_7_2_5(){\n return Math.random()\n}\n\nfunction f0_7_2_6(){\n return Math.random()\n}\n\nfunction f0_7_2_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_7_2_8(){\n return isNaN(undefined)\n}\n\nfunction f0_7_2_9(){\n return isNaN(undefined)\n}\n\nfunction f0_7_2_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_2_11(){\n return isNaN(undefined)\n}\n\nfunction f0_7_2(){\n f0_7_2_0();\n f0_7_2_1();\n f0_7_2_2();\n f0_7_2_3();\n f0_7_2_4();\n f0_7_2_5();\n f0_7_2_6();\n f0_7_2_7();\n f0_7_2_8();\n f0_7_2_9();\n f0_7_2_10();\n f0_7_2_11();\n}\n\nfunction f0_7_3_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_3_1(){\n return isNaN(undefined)\n}\n\nfunction f0_7_3_2(){\n return isNaN(undefined)\n}\n\nfunction f0_7_3_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_7_3_4(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_7_3_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_3_6(){\n return isNaN(undefined)\n}\n\nfunction f0_7_3_7(){\n return Math.random()\n}\n\nfunction f0_7_3_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_7_3_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_3_10(){\n return isNaN(undefined)\n}\n\nfunction f0_7_3_11(){\n return isNaN(undefined)\n}\n\nfunction f0_7_3(){\n f0_7_3_0();\n f0_7_3_1();\n f0_7_3_2();\n f0_7_3_3();\n f0_7_3_4();\n f0_7_3_5();\n f0_7_3_6();\n f0_7_3_7();\n f0_7_3_8();\n f0_7_3_9();\n f0_7_3_10();\n f0_7_3_11();\n}\n\nfunction f0_7_4_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_7_4_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_7_4_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_4_3(){\n return Math.random()\n}\n\nfunction f0_7_4_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_4_5(){\n return isNaN(undefined)\n}\n\nfunction f0_7_4_6(){\n return Math.random()\n}\n\nfunction f0_7_4_7(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_4_8(){\n return isNaN(undefined)\n}\n\nfunction f0_7_4_9(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_7_4_10(){\n return isNaN(undefined)\n}\n\nfunction f0_7_4_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_4(){\n f0_7_4_0();\n f0_7_4_1();\n f0_7_4_2();\n f0_7_4_3();\n f0_7_4_4();\n f0_7_4_5();\n f0_7_4_6();\n f0_7_4_7();\n f0_7_4_8();\n f0_7_4_9();\n f0_7_4_10();\n f0_7_4_11();\n}\n\nfunction f0_7_5_0(){\n return Math.random()\n}\n\nfunction f0_7_5_1(){\n return Math.random()\n}\n\nfunction f0_7_5_2(){\n return isNaN(undefined)\n}\n\nfunction f0_7_5_3(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_5_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_5_5(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_7_5_6(){\n return isNaN(undefined)\n}\n\nfunction f0_7_5_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_7_5_8(){\n return isNaN(undefined)\n}\n\nfunction f0_7_5_9(){\n return isNaN(undefined)\n}\n\nfunction f0_7_5_10(){\n return isNaN(undefined)\n}\n\nfunction f0_7_5_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_5(){\n f0_7_5_0();\n f0_7_5_1();\n f0_7_5_2();\n f0_7_5_3();\n f0_7_5_4();\n f0_7_5_5();\n f0_7_5_6();\n f0_7_5_7();\n f0_7_5_8();\n f0_7_5_9();\n f0_7_5_10();\n f0_7_5_11();\n}\n\nfunction f0_7_6_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_7_6_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_7_6_2(){\n return Math.random()\n}\n\nfunction f0_7_6_3(){\n return Math.random()\n}\n\nfunction f0_7_6_4(){\n return isNaN(undefined)\n}\n\nfunction f0_7_6_5(){\n return isNaN(undefined)\n}\n\nfunction f0_7_6_6(){\n return Math.random()\n}\n\nfunction f0_7_6_7(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_6_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_6_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_6_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_6_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_6(){\n f0_7_6_0();\n f0_7_6_1();\n f0_7_6_2();\n f0_7_6_3();\n f0_7_6_4();\n f0_7_6_5();\n f0_7_6_6();\n f0_7_6_7();\n f0_7_6_8();\n f0_7_6_9();\n f0_7_6_10();\n f0_7_6_11();\n}\n\nfunction f0_7_7_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_7_7_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_7_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_7_3(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_7_4(){\n return isNaN(undefined)\n}\n\nfunction f0_7_7_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_7_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_7_7_7(){\n return Math.random()\n}\n\nfunction f0_7_7_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_7_7_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_7_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_7_11(){\n return Math.random()\n}\n\nfunction f0_7_7(){\n f0_7_7_0();\n f0_7_7_1();\n f0_7_7_2();\n f0_7_7_3();\n f0_7_7_4();\n f0_7_7_5();\n f0_7_7_6();\n f0_7_7_7();\n f0_7_7_8();\n f0_7_7_9();\n f0_7_7_10();\n f0_7_7_11();\n}\n\nfunction f0_7_8_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_8_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_7_8_2(){\n return Math.random()\n}\n\nfunction f0_7_8_3(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_8_4(){\n return isNaN(undefined)\n}\n\nfunction f0_7_8_5(){\n return isNaN(undefined)\n}\n\nfunction f0_7_8_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_7_8_7(){\n return Math.random()\n}\n\nfunction f0_7_8_8(){\n return isNaN(undefined)\n}\n\nfunction f0_7_8_9(){\n return isNaN(undefined)\n}\n\nfunction f0_7_8_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_8_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_7_8(){\n f0_7_8_0();\n f0_7_8_1();\n f0_7_8_2();\n f0_7_8_3();\n f0_7_8_4();\n f0_7_8_5();\n f0_7_8_6();\n f0_7_8_7();\n f0_7_8_8();\n f0_7_8_9();\n f0_7_8_10();\n f0_7_8_11();\n}\n\nfunction f0_7_9_0(){\n return Math.random()\n}\n\nfunction f0_7_9_1(){\n return Math.random()\n}\n\nfunction f0_7_9_2(){\n return Math.random()\n}\n\nfunction f0_7_9_3(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_9_4(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_7_9_5(){\n return isNaN(undefined)\n}\n\nfunction f0_7_9_6(){\n return Math.random()\n}\n\nfunction f0_7_9_7(){\n return Math.random()\n}\n\nfunction f0_7_9_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_7_9_9(){\n return isNaN(undefined)\n}\n\nfunction f0_7_9_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_7_9_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_7_9(){\n f0_7_9_0();\n f0_7_9_1();\n f0_7_9_2();\n f0_7_9_3();\n f0_7_9_4();\n f0_7_9_5();\n f0_7_9_6();\n f0_7_9_7();\n f0_7_9_8();\n f0_7_9_9();\n f0_7_9_10();\n f0_7_9_11();\n}\n\nfunction f0_7_10_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_7_10_1(){\n return Math.random()\n}\n\nfunction f0_7_10_2(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_7_10_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_7_10_4(){\n return isNaN(undefined)\n}\n\nfunction f0_7_10_5(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_7_10_6(){\n return isNaN(undefined)\n}\n\nfunction f0_7_10_7(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_10_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_10_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_10_10(){\n return isNaN(undefined)\n}\n\nfunction f0_7_10_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_7_10(){\n f0_7_10_0();\n f0_7_10_1();\n f0_7_10_2();\n f0_7_10_3();\n f0_7_10_4();\n f0_7_10_5();\n f0_7_10_6();\n f0_7_10_7();\n f0_7_10_8();\n f0_7_10_9();\n f0_7_10_10();\n f0_7_10_11();\n}\n\nfunction f0_7_11_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_7_11_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_7_11_2(){\n return isNaN(undefined)\n}\n\nfunction f0_7_11_3(){\n return isNaN(undefined)\n}\n\nfunction f0_7_11_4(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_7_11_5(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_7_11_6(){\n return Math.random()\n}\n\nfunction f0_7_11_7(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_11_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_11_9(){\n return isNaN(undefined)\n}\n\nfunction f0_7_11_10(){\n return Math.random()\n}\n\nfunction f0_7_11_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_7_11(){\n f0_7_11_0();\n f0_7_11_1();\n f0_7_11_2();\n f0_7_11_3();\n f0_7_11_4();\n f0_7_11_5();\n f0_7_11_6();\n f0_7_11_7();\n f0_7_11_8();\n f0_7_11_9();\n f0_7_11_10();\n f0_7_11_11();\n}\n\nfunction f0_7(){\n f0_7_0();\n f0_7_1();\n f0_7_2();\n f0_7_3();\n f0_7_4();\n f0_7_5();\n f0_7_6();\n f0_7_7();\n f0_7_8();\n f0_7_9();\n f0_7_10();\n f0_7_11();\n\n}\n\nfunction f0_8_0_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_8_0_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_8_0_2(){\n return Math.random()\n}\n\nfunction f0_8_0_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_8_0_4(){\n return Math.random()\n}\n\nfunction f0_8_0_5(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_8_0_6(){\n return Math.random()\n}\n\nfunction f0_8_0_7(){\n return Math.random()\n}\n\nfunction f0_8_0_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_8_0_9(){\n return Math.random()\n}\n\nfunction f0_8_0_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_8_0_11(){\n return isNaN(undefined)\n}\n\nfunction f0_8_0(){\n f0_8_0_0();\n f0_8_0_1();\n f0_8_0_2();\n f0_8_0_3();\n f0_8_0_4();\n f0_8_0_5();\n f0_8_0_6();\n f0_8_0_7();\n f0_8_0_8();\n f0_8_0_9();\n f0_8_0_10();\n f0_8_0_11();\n}\n\nfunction f0_8_1_0(){\n return Math.random()\n}\n\nfunction f0_8_1_1(){\n return Math.random()\n}\n\nfunction f0_8_1_2(){\n return Math.random()\n}\n\nfunction f0_8_1_3(){\n return isNaN(undefined)\n}\n\nfunction f0_8_1_4(){\n return Math.random()\n}\n\nfunction f0_8_1_5(){\n return Math.random()\n}\n\nfunction f0_8_1_6(){\n return isNaN(undefined)\n}\n\nfunction f0_8_1_7(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_8_1_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_8_1_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_8_1_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_8_1_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_8_1(){\n f0_8_1_0();\n f0_8_1_1();\n f0_8_1_2();\n f0_8_1_3();\n f0_8_1_4();\n f0_8_1_5();\n f0_8_1_6();\n f0_8_1_7();\n f0_8_1_8();\n f0_8_1_9();\n f0_8_1_10();\n f0_8_1_11();\n}\n\nfunction f0_8_2_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_8_2_1(){\n return isNaN(undefined)\n}\n\nfunction f0_8_2_2(){\n return isNaN(undefined)\n}\n\nfunction f0_8_2_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_8_2_4(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_8_2_5(){\n return isNaN(undefined)\n}\n\nfunction f0_8_2_6(){\n return Math.random()\n}\n\nfunction f0_8_2_7(){\n return isNaN(undefined)\n}\n\nfunction f0_8_2_8(){\n return Math.random()\n}\n\nfunction f0_8_2_9(){\n return isNaN(undefined)\n}\n\nfunction f0_8_2_10(){\n return isNaN(undefined)\n}\n\nfunction f0_8_2_11(){\n return isNaN(undefined)\n}\n\nfunction f0_8_2(){\n f0_8_2_0();\n f0_8_2_1();\n f0_8_2_2();\n f0_8_2_3();\n f0_8_2_4();\n f0_8_2_5();\n f0_8_2_6();\n f0_8_2_7();\n f0_8_2_8();\n f0_8_2_9();\n f0_8_2_10();\n f0_8_2_11();\n}\n\nfunction f0_8_3_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_8_3_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_8_3_2(){\n return isNaN(undefined)\n}\n\nfunction f0_8_3_3(){\n return isNaN(undefined)\n}\n\nfunction f0_8_3_4(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_8_3_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_8_3_6(){\n return Math.random()\n}\n\nfunction f0_8_3_7(){\n return isNaN(undefined)\n}\n\nfunction f0_8_3_8(){\n return Math.random()\n}\n\nfunction f0_8_3_9(){\n return Math.random()\n}\n\nfunction f0_8_3_10(){\n return isNaN(undefined)\n}\n\nfunction f0_8_3_11(){\n return Math.random()\n}\n\nfunction f0_8_3(){\n f0_8_3_0();\n f0_8_3_1();\n f0_8_3_2();\n f0_8_3_3();\n f0_8_3_4();\n f0_8_3_5();\n f0_8_3_6();\n f0_8_3_7();\n f0_8_3_8();\n f0_8_3_9();\n f0_8_3_10();\n f0_8_3_11();\n}\n\nfunction f0_8_4_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_8_4_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_8_4_2(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_8_4_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_8_4_4(){\n return Math.random()\n}\n\nfunction f0_8_4_5(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_8_4_6(){\n return isNaN(undefined)\n}\n\nfunction f0_8_4_7(){\n return Math.random()\n}\n\nfunction f0_8_4_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_8_4_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_8_4_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_8_4_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_8_4(){\n f0_8_4_0();\n f0_8_4_1();\n f0_8_4_2();\n f0_8_4_3();\n f0_8_4_4();\n f0_8_4_5();\n f0_8_4_6();\n f0_8_4_7();\n f0_8_4_8();\n f0_8_4_9();\n f0_8_4_10();\n f0_8_4_11();\n}\n\nfunction f0_8_5_0(){\n return isNaN(undefined)\n}\n\nfunction f0_8_5_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_8_5_2(){\n return isNaN(undefined)\n}\n\nfunction f0_8_5_3(){\n return isNaN(undefined)\n}\n\nfunction f0_8_5_4(){\n return Math.random()\n}\n\nfunction f0_8_5_5(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_8_5_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_8_5_7(){\n return Math.random()\n}\n\nfunction f0_8_5_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_8_5_9(){\n return Math.random()\n}\n\nfunction f0_8_5_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_8_5_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_8_5(){\n f0_8_5_0();\n f0_8_5_1();\n f0_8_5_2();\n f0_8_5_3();\n f0_8_5_4();\n f0_8_5_5();\n f0_8_5_6();\n f0_8_5_7();\n f0_8_5_8();\n f0_8_5_9();\n f0_8_5_10();\n f0_8_5_11();\n}\n\nfunction f0_8_6_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_8_6_1(){\n return Math.random()\n}\n\nfunction f0_8_6_2(){\n return isNaN(undefined)\n}\n\nfunction f0_8_6_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_8_6_4(){\n return Math.random()\n}\n\nfunction f0_8_6_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_8_6_6(){\n return Math.random()\n}\n\nfunction f0_8_6_7(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_8_6_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_8_6_9(){\n return Math.random()\n}\n\nfunction f0_8_6_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_8_6_11(){\n return isNaN(undefined)\n}\n\nfunction f0_8_6(){\n f0_8_6_0();\n f0_8_6_1();\n f0_8_6_2();\n f0_8_6_3();\n f0_8_6_4();\n f0_8_6_5();\n f0_8_6_6();\n f0_8_6_7();\n f0_8_6_8();\n f0_8_6_9();\n f0_8_6_10();\n f0_8_6_11();\n}\n\nfunction f0_8_7_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_8_7_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_8_7_2(){\n return Math.random()\n}\n\nfunction f0_8_7_3(){\n return isNaN(undefined)\n}\n\nfunction f0_8_7_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_8_7_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_8_7_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_8_7_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_8_7_8(){\n return isNaN(undefined)\n}\n\nfunction f0_8_7_9(){\n return isNaN(undefined)\n}\n\nfunction f0_8_7_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_8_7_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_8_7(){\n f0_8_7_0();\n f0_8_7_1();\n f0_8_7_2();\n f0_8_7_3();\n f0_8_7_4();\n f0_8_7_5();\n f0_8_7_6();\n f0_8_7_7();\n f0_8_7_8();\n f0_8_7_9();\n f0_8_7_10();\n f0_8_7_11();\n}\n\nfunction f0_8_8_0(){\n return isNaN(undefined)\n}\n\nfunction f0_8_8_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_8_8_2(){\n return isNaN(undefined)\n}\n\nfunction f0_8_8_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_8_8_4(){\n return Math.random()\n}\n\nfunction f0_8_8_5(){\n return isNaN(undefined)\n}\n\nfunction f0_8_8_6(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_8_8_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_8_8_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_8_8_9(){\n return Math.random()\n}\n\nfunction f0_8_8_10(){\n return Math.random()\n}\n\nfunction f0_8_8_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_8_8(){\n f0_8_8_0();\n f0_8_8_1();\n f0_8_8_2();\n f0_8_8_3();\n f0_8_8_4();\n f0_8_8_5();\n f0_8_8_6();\n f0_8_8_7();\n f0_8_8_8();\n f0_8_8_9();\n f0_8_8_10();\n f0_8_8_11();\n}\n\nfunction f0_8_9_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_8_9_1(){\n return isNaN(undefined)\n}\n\nfunction f0_8_9_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_8_9_3(){\n return isNaN(undefined)\n}\n\nfunction f0_8_9_4(){\n return isNaN(undefined)\n}\n\nfunction f0_8_9_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_8_9_6(){\n return Math.random()\n}\n\nfunction f0_8_9_7(){\n return isNaN(undefined)\n}\n\nfunction f0_8_9_8(){\n return isNaN(undefined)\n}\n\nfunction f0_8_9_9(){\n return isNaN(undefined)\n}\n\nfunction f0_8_9_10(){\n return isNaN(undefined)\n}\n\nfunction f0_8_9_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_8_9(){\n f0_8_9_0();\n f0_8_9_1();\n f0_8_9_2();\n f0_8_9_3();\n f0_8_9_4();\n f0_8_9_5();\n f0_8_9_6();\n f0_8_9_7();\n f0_8_9_8();\n f0_8_9_9();\n f0_8_9_10();\n f0_8_9_11();\n}\n\nfunction f0_8_10_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_8_10_1(){\n return isNaN(undefined)\n}\n\nfunction f0_8_10_2(){\n return isNaN(undefined)\n}\n\nfunction f0_8_10_3(){\n return Math.random()\n}\n\nfunction f0_8_10_4(){\n return isNaN(undefined)\n}\n\nfunction f0_8_10_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_8_10_6(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_8_10_7(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_8_10_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_8_10_9(){\n return Math.random()\n}\n\nfunction f0_8_10_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_8_10_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_8_10(){\n f0_8_10_0();\n f0_8_10_1();\n f0_8_10_2();\n f0_8_10_3();\n f0_8_10_4();\n f0_8_10_5();\n f0_8_10_6();\n f0_8_10_7();\n f0_8_10_8();\n f0_8_10_9();\n f0_8_10_10();\n f0_8_10_11();\n}\n\nfunction f0_8_11_0(){\n return isNaN(undefined)\n}\n\nfunction f0_8_11_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_8_11_2(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_8_11_3(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_8_11_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_8_11_5(){\n return isNaN(undefined)\n}\n\nfunction f0_8_11_6(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_8_11_7(){\n return Math.random()\n}\n\nfunction f0_8_11_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_8_11_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_8_11_10(){\n return Math.random()\n}\n\nfunction f0_8_11_11(){\n return isNaN(undefined)\n}\n\nfunction f0_8_11(){\n f0_8_11_0();\n f0_8_11_1();\n f0_8_11_2();\n f0_8_11_3();\n f0_8_11_4();\n f0_8_11_5();\n f0_8_11_6();\n f0_8_11_7();\n f0_8_11_8();\n f0_8_11_9();\n f0_8_11_10();\n f0_8_11_11();\n}\n\nfunction f0_8(){\n f0_8_0();\n f0_8_1();\n f0_8_2();\n f0_8_3();\n f0_8_4();\n f0_8_5();\n f0_8_6();\n f0_8_7();\n f0_8_8();\n f0_8_9();\n f0_8_10();\n f0_8_11();\n\n}\n\nfunction f0_9_0_0(){\n return Math.random()\n}\n\nfunction f0_9_0_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_0_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_9_0_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_0_4(){\n return Math.random()\n}\n\nfunction f0_9_0_5(){\n return Math.random()\n}\n\nfunction f0_9_0_6(){\n return isNaN(undefined)\n}\n\nfunction f0_9_0_7(){\n return Math.random()\n}\n\nfunction f0_9_0_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_0_9(){\n return isNaN(undefined)\n}\n\nfunction f0_9_0_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_9_0_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_9_0(){\n f0_9_0_0();\n f0_9_0_1();\n f0_9_0_2();\n f0_9_0_3();\n f0_9_0_4();\n f0_9_0_5();\n f0_9_0_6();\n f0_9_0_7();\n f0_9_0_8();\n f0_9_0_9();\n f0_9_0_10();\n f0_9_0_11();\n}\n\nfunction f0_9_1_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_9_1_1(){\n return isNaN(undefined)\n}\n\nfunction f0_9_1_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_9_1_3(){\n return isNaN(undefined)\n}\n\nfunction f0_9_1_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_9_1_5(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_1_6(){\n return Math.random()\n}\n\nfunction f0_9_1_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_1_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_9_1_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_9_1_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_1_11(){\n return isNaN(undefined)\n}\n\nfunction f0_9_1(){\n f0_9_1_0();\n f0_9_1_1();\n f0_9_1_2();\n f0_9_1_3();\n f0_9_1_4();\n f0_9_1_5();\n f0_9_1_6();\n f0_9_1_7();\n f0_9_1_8();\n f0_9_1_9();\n f0_9_1_10();\n f0_9_1_11();\n}\n\nfunction f0_9_2_0(){\n return isNaN(undefined)\n}\n\nfunction f0_9_2_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_9_2_2(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_2_3(){\n return Math.random()\n}\n\nfunction f0_9_2_4(){\n return isNaN(undefined)\n}\n\nfunction f0_9_2_5(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_2_6(){\n return isNaN(undefined)\n}\n\nfunction f0_9_2_7(){\n return Math.random()\n}\n\nfunction f0_9_2_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_9_2_9(){\n return isNaN(undefined)\n}\n\nfunction f0_9_2_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_2_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_9_2(){\n f0_9_2_0();\n f0_9_2_1();\n f0_9_2_2();\n f0_9_2_3();\n f0_9_2_4();\n f0_9_2_5();\n f0_9_2_6();\n f0_9_2_7();\n f0_9_2_8();\n f0_9_2_9();\n f0_9_2_10();\n f0_9_2_11();\n}\n\nfunction f0_9_3_0(){\n return Math.random()\n}\n\nfunction f0_9_3_1(){\n return isNaN(undefined)\n}\n\nfunction f0_9_3_2(){\n return Math.random()\n}\n\nfunction f0_9_3_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_3_4(){\n return Math.random()\n}\n\nfunction f0_9_3_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_9_3_6(){\n return Math.random()\n}\n\nfunction f0_9_3_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_3_8(){\n return Math.random()\n}\n\nfunction f0_9_3_9(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_3_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_9_3_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_3(){\n f0_9_3_0();\n f0_9_3_1();\n f0_9_3_2();\n f0_9_3_3();\n f0_9_3_4();\n f0_9_3_5();\n f0_9_3_6();\n f0_9_3_7();\n f0_9_3_8();\n f0_9_3_9();\n f0_9_3_10();\n f0_9_3_11();\n}\n\nfunction f0_9_4_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_4_1(){\n return Math.random()\n}\n\nfunction f0_9_4_2(){\n return Math.random()\n}\n\nfunction f0_9_4_3(){\n return Math.random()\n}\n\nfunction f0_9_4_4(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_4_5(){\n return isNaN(undefined)\n}\n\nfunction f0_9_4_6(){\n return isNaN(undefined)\n}\n\nfunction f0_9_4_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_4_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_4_9(){\n return Math.random()\n}\n\nfunction f0_9_4_10(){\n return Math.random()\n}\n\nfunction f0_9_4_11(){\n return isNaN(undefined)\n}\n\nfunction f0_9_4(){\n f0_9_4_0();\n f0_9_4_1();\n f0_9_4_2();\n f0_9_4_3();\n f0_9_4_4();\n f0_9_4_5();\n f0_9_4_6();\n f0_9_4_7();\n f0_9_4_8();\n f0_9_4_9();\n f0_9_4_10();\n f0_9_4_11();\n}\n\nfunction f0_9_5_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_5_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_5_2(){\n return isNaN(undefined)\n}\n\nfunction f0_9_5_3(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_9_5_4(){\n return Math.random()\n}\n\nfunction f0_9_5_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_9_5_6(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_9_5_7(){\n return isNaN(undefined)\n}\n\nfunction f0_9_5_8(){\n return isNaN(undefined)\n}\n\nfunction f0_9_5_9(){\n return Math.random()\n}\n\nfunction f0_9_5_10(){\n return isNaN(undefined)\n}\n\nfunction f0_9_5_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_5(){\n f0_9_5_0();\n f0_9_5_1();\n f0_9_5_2();\n f0_9_5_3();\n f0_9_5_4();\n f0_9_5_5();\n f0_9_5_6();\n f0_9_5_7();\n f0_9_5_8();\n f0_9_5_9();\n f0_9_5_10();\n f0_9_5_11();\n}\n\nfunction f0_9_6_0(){\n return Math.random()\n}\n\nfunction f0_9_6_1(){\n return isNaN(undefined)\n}\n\nfunction f0_9_6_2(){\n return isNaN(undefined)\n}\n\nfunction f0_9_6_3(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_9_6_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_9_6_5(){\n return Math.random()\n}\n\nfunction f0_9_6_6(){\n return Math.random()\n}\n\nfunction f0_9_6_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_6_8(){\n return isNaN(undefined)\n}\n\nfunction f0_9_6_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_9_6_10(){\n return Math.random()\n}\n\nfunction f0_9_6_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_6(){\n f0_9_6_0();\n f0_9_6_1();\n f0_9_6_2();\n f0_9_6_3();\n f0_9_6_4();\n f0_9_6_5();\n f0_9_6_6();\n f0_9_6_7();\n f0_9_6_8();\n f0_9_6_9();\n f0_9_6_10();\n f0_9_6_11();\n}\n\nfunction f0_9_7_0(){\n return Math.random()\n}\n\nfunction f0_9_7_1(){\n return Math.random()\n}\n\nfunction f0_9_7_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_9_7_3(){\n return isNaN(undefined)\n}\n\nfunction f0_9_7_4(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_7_5(){\n return isNaN(undefined)\n}\n\nfunction f0_9_7_6(){\n return Math.random()\n}\n\nfunction f0_9_7_7(){\n return isNaN(undefined)\n}\n\nfunction f0_9_7_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_7_9(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_7_10(){\n return Math.random()\n}\n\nfunction f0_9_7_11(){\n return isNaN(undefined)\n}\n\nfunction f0_9_7(){\n f0_9_7_0();\n f0_9_7_1();\n f0_9_7_2();\n f0_9_7_3();\n f0_9_7_4();\n f0_9_7_5();\n f0_9_7_6();\n f0_9_7_7();\n f0_9_7_8();\n f0_9_7_9();\n f0_9_7_10();\n f0_9_7_11();\n}\n\nfunction f0_9_8_0(){\n return isNaN(undefined)\n}\n\nfunction f0_9_8_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_8_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_9_8_3(){\n return isNaN(undefined)\n}\n\nfunction f0_9_8_4(){\n return isNaN(undefined)\n}\n\nfunction f0_9_8_5(){\n return Math.random()\n}\n\nfunction f0_9_8_6(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_9_8_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_8_8(){\n return Math.random()\n}\n\nfunction f0_9_8_9(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_8_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_8_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_8(){\n f0_9_8_0();\n f0_9_8_1();\n f0_9_8_2();\n f0_9_8_3();\n f0_9_8_4();\n f0_9_8_5();\n f0_9_8_6();\n f0_9_8_7();\n f0_9_8_8();\n f0_9_8_9();\n f0_9_8_10();\n f0_9_8_11();\n}\n\nfunction f0_9_9_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_9_1(){\n return isNaN(undefined)\n}\n\nfunction f0_9_9_2(){\n return Math.random()\n}\n\nfunction f0_9_9_3(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_9_9_4(){\n return Math.random()\n}\n\nfunction f0_9_9_5(){\n return isNaN(undefined)\n}\n\nfunction f0_9_9_6(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_9_9_7(){\n return isNaN(undefined)\n}\n\nfunction f0_9_9_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_9_9(){\n return isNaN(undefined)\n}\n\nfunction f0_9_9_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_9_9_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_9_9(){\n f0_9_9_0();\n f0_9_9_1();\n f0_9_9_2();\n f0_9_9_3();\n f0_9_9_4();\n f0_9_9_5();\n f0_9_9_6();\n f0_9_9_7();\n f0_9_9_8();\n f0_9_9_9();\n f0_9_9_10();\n f0_9_9_11();\n}\n\nfunction f0_9_10_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_10_1(){\n return isNaN(undefined)\n}\n\nfunction f0_9_10_2(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_10_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_10_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_9_10_5(){\n return isNaN(undefined)\n}\n\nfunction f0_9_10_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_10_7(){\n return isNaN(undefined)\n}\n\nfunction f0_9_10_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_9_10_9(){\n return isNaN(undefined)\n}\n\nfunction f0_9_10_10(){\n return isNaN(undefined)\n}\n\nfunction f0_9_10_11(){\n return isNaN(undefined)\n}\n\nfunction f0_9_10(){\n f0_9_10_0();\n f0_9_10_1();\n f0_9_10_2();\n f0_9_10_3();\n f0_9_10_4();\n f0_9_10_5();\n f0_9_10_6();\n f0_9_10_7();\n f0_9_10_8();\n f0_9_10_9();\n f0_9_10_10();\n f0_9_10_11();\n}\n\nfunction f0_9_11_0(){\n return Math.random()\n}\n\nfunction f0_9_11_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_9_11_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_9_11_3(){\n return isNaN(undefined)\n}\n\nfunction f0_9_11_4(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_11_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_9_11_6(){\n return isNaN(undefined)\n}\n\nfunction f0_9_11_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_11_8(){\n return Math.random()\n}\n\nfunction f0_9_11_9(){\n return Math.random()\n}\n\nfunction f0_9_11_10(){\n return isNaN(undefined)\n}\n\nfunction f0_9_11_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_9_11(){\n f0_9_11_0();\n f0_9_11_1();\n f0_9_11_2();\n f0_9_11_3();\n f0_9_11_4();\n f0_9_11_5();\n f0_9_11_6();\n f0_9_11_7();\n f0_9_11_8();\n f0_9_11_9();\n f0_9_11_10();\n f0_9_11_11();\n}\n\nfunction f0_9(){\n f0_9_0();\n f0_9_1();\n f0_9_2();\n f0_9_3();\n f0_9_4();\n f0_9_5();\n f0_9_6();\n f0_9_7();\n f0_9_8();\n f0_9_9();\n f0_9_10();\n f0_9_11();\n\n}\n\nfunction f0_10_0_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_0_1(){\n return isNaN(undefined)\n}\n\nfunction f0_10_0_2(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_10_0_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_10_0_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_0_5(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_10_0_6(){\n return isNaN(undefined)\n}\n\nfunction f0_10_0_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_10_0_8(){\n return Math.random()\n}\n\nfunction f0_10_0_9(){\n return isNaN(undefined)\n}\n\nfunction f0_10_0_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_0_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_10_0(){\n f0_10_0_0();\n f0_10_0_1();\n f0_10_0_2();\n f0_10_0_3();\n f0_10_0_4();\n f0_10_0_5();\n f0_10_0_6();\n f0_10_0_7();\n f0_10_0_8();\n f0_10_0_9();\n f0_10_0_10();\n f0_10_0_11();\n}\n\nfunction f0_10_1_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_1_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_10_1_2(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_10_1_3(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_1_4(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_10_1_5(){\n return Math.random()\n}\n\nfunction f0_10_1_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_10_1_7(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_1_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_1_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_1_10(){\n return Math.random()\n}\n\nfunction f0_10_1_11(){\n return isNaN(undefined)\n}\n\nfunction f0_10_1(){\n f0_10_1_0();\n f0_10_1_1();\n f0_10_1_2();\n f0_10_1_3();\n f0_10_1_4();\n f0_10_1_5();\n f0_10_1_6();\n f0_10_1_7();\n f0_10_1_8();\n f0_10_1_9();\n f0_10_1_10();\n f0_10_1_11();\n}\n\nfunction f0_10_2_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_2_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_2_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_2_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_10_2_4(){\n return Math.random()\n}\n\nfunction f0_10_2_5(){\n return Math.random()\n}\n\nfunction f0_10_2_6(){\n return Math.random()\n}\n\nfunction f0_10_2_7(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_2_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_10_2_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_2_10(){\n return Math.random()\n}\n\nfunction f0_10_2_11(){\n return isNaN(undefined)\n}\n\nfunction f0_10_2(){\n f0_10_2_0();\n f0_10_2_1();\n f0_10_2_2();\n f0_10_2_3();\n f0_10_2_4();\n f0_10_2_5();\n f0_10_2_6();\n f0_10_2_7();\n f0_10_2_8();\n f0_10_2_9();\n f0_10_2_10();\n f0_10_2_11();\n}\n\nfunction f0_10_3_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_3_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_10_3_2(){\n return isNaN(undefined)\n}\n\nfunction f0_10_3_3(){\n return isNaN(undefined)\n}\n\nfunction f0_10_3_4(){\n return isNaN(undefined)\n}\n\nfunction f0_10_3_5(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_10_3_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_10_3_7(){\n return Math.random()\n}\n\nfunction f0_10_3_8(){\n return isNaN(undefined)\n}\n\nfunction f0_10_3_9(){\n return isNaN(undefined)\n}\n\nfunction f0_10_3_10(){\n return Math.random()\n}\n\nfunction f0_10_3_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_3(){\n f0_10_3_0();\n f0_10_3_1();\n f0_10_3_2();\n f0_10_3_3();\n f0_10_3_4();\n f0_10_3_5();\n f0_10_3_6();\n f0_10_3_7();\n f0_10_3_8();\n f0_10_3_9();\n f0_10_3_10();\n f0_10_3_11();\n}\n\nfunction f0_10_4_0(){\n return Math.random()\n}\n\nfunction f0_10_4_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_4_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_4_3(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_4_4(){\n return isNaN(undefined)\n}\n\nfunction f0_10_4_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_4_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_10_4_7(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_4_8(){\n return isNaN(undefined)\n}\n\nfunction f0_10_4_9(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_10_4_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_4_11(){\n return Math.random()\n}\n\nfunction f0_10_4(){\n f0_10_4_0();\n f0_10_4_1();\n f0_10_4_2();\n f0_10_4_3();\n f0_10_4_4();\n f0_10_4_5();\n f0_10_4_6();\n f0_10_4_7();\n f0_10_4_8();\n f0_10_4_9();\n f0_10_4_10();\n f0_10_4_11();\n}\n\nfunction f0_10_5_0(){\n return Math.random()\n}\n\nfunction f0_10_5_1(){\n return Math.random()\n}\n\nfunction f0_10_5_2(){\n return isNaN(undefined)\n}\n\nfunction f0_10_5_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_10_5_4(){\n return isNaN(undefined)\n}\n\nfunction f0_10_5_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_5_6(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_5_7(){\n return isNaN(undefined)\n}\n\nfunction f0_10_5_8(){\n return isNaN(undefined)\n}\n\nfunction f0_10_5_9(){\n return Math.random()\n}\n\nfunction f0_10_5_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_5_11(){\n return Math.random()\n}\n\nfunction f0_10_5(){\n f0_10_5_0();\n f0_10_5_1();\n f0_10_5_2();\n f0_10_5_3();\n f0_10_5_4();\n f0_10_5_5();\n f0_10_5_6();\n f0_10_5_7();\n f0_10_5_8();\n f0_10_5_9();\n f0_10_5_10();\n f0_10_5_11();\n}\n\nfunction f0_10_6_0(){\n return Math.random()\n}\n\nfunction f0_10_6_1(){\n return Math.random()\n}\n\nfunction f0_10_6_2(){\n return Math.random()\n}\n\nfunction f0_10_6_3(){\n return isNaN(undefined)\n}\n\nfunction f0_10_6_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_6_5(){\n return isNaN(undefined)\n}\n\nfunction f0_10_6_6(){\n return isNaN(undefined)\n}\n\nfunction f0_10_6_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_10_6_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_6_9(){\n return isNaN(undefined)\n}\n\nfunction f0_10_6_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_10_6_11(){\n return Math.random()\n}\n\nfunction f0_10_6(){\n f0_10_6_0();\n f0_10_6_1();\n f0_10_6_2();\n f0_10_6_3();\n f0_10_6_4();\n f0_10_6_5();\n f0_10_6_6();\n f0_10_6_7();\n f0_10_6_8();\n f0_10_6_9();\n f0_10_6_10();\n f0_10_6_11();\n}\n\nfunction f0_10_7_0(){\n return Math.random()\n}\n\nfunction f0_10_7_1(){\n return Math.random()\n}\n\nfunction f0_10_7_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_7_3(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_7_4(){\n return isNaN(undefined)\n}\n\nfunction f0_10_7_5(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_10_7_6(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_7_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_10_7_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_10_7_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_7_10(){\n return isNaN(undefined)\n}\n\nfunction f0_10_7_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_7(){\n f0_10_7_0();\n f0_10_7_1();\n f0_10_7_2();\n f0_10_7_3();\n f0_10_7_4();\n f0_10_7_5();\n f0_10_7_6();\n f0_10_7_7();\n f0_10_7_8();\n f0_10_7_9();\n f0_10_7_10();\n f0_10_7_11();\n}\n\nfunction f0_10_8_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_10_8_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_8_2(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_10_8_3(){\n return isNaN(undefined)\n}\n\nfunction f0_10_8_4(){\n return isNaN(undefined)\n}\n\nfunction f0_10_8_5(){\n return Math.random()\n}\n\nfunction f0_10_8_6(){\n return isNaN(undefined)\n}\n\nfunction f0_10_8_7(){\n return isNaN(undefined)\n}\n\nfunction f0_10_8_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_10_8_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_8_10(){\n return isNaN(undefined)\n}\n\nfunction f0_10_8_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_8(){\n f0_10_8_0();\n f0_10_8_1();\n f0_10_8_2();\n f0_10_8_3();\n f0_10_8_4();\n f0_10_8_5();\n f0_10_8_6();\n f0_10_8_7();\n f0_10_8_8();\n f0_10_8_9();\n f0_10_8_10();\n f0_10_8_11();\n}\n\nfunction f0_10_9_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_9_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_10_9_2(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_10_9_3(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_9_4(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_10_9_5(){\n return Math.random()\n}\n\nfunction f0_10_9_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_10_9_7(){\n return isNaN(undefined)\n}\n\nfunction f0_10_9_8(){\n return Math.random()\n}\n\nfunction f0_10_9_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_9_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_9_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_9(){\n f0_10_9_0();\n f0_10_9_1();\n f0_10_9_2();\n f0_10_9_3();\n f0_10_9_4();\n f0_10_9_5();\n f0_10_9_6();\n f0_10_9_7();\n f0_10_9_8();\n f0_10_9_9();\n f0_10_9_10();\n f0_10_9_11();\n}\n\nfunction f0_10_10_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_10_10_1(){\n return Math.random()\n}\n\nfunction f0_10_10_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_10_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_10_10_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_10_5(){\n return isNaN(undefined)\n}\n\nfunction f0_10_10_6(){\n return Math.random()\n}\n\nfunction f0_10_10_7(){\n return Math.random()\n}\n\nfunction f0_10_10_8(){\n return Math.random()\n}\n\nfunction f0_10_10_9(){\n return isNaN(undefined)\n}\n\nfunction f0_10_10_10(){\n return Math.random()\n}\n\nfunction f0_10_10_11(){\n return isNaN(undefined)\n}\n\nfunction f0_10_10(){\n f0_10_10_0();\n f0_10_10_1();\n f0_10_10_2();\n f0_10_10_3();\n f0_10_10_4();\n f0_10_10_5();\n f0_10_10_6();\n f0_10_10_7();\n f0_10_10_8();\n f0_10_10_9();\n f0_10_10_10();\n f0_10_10_11();\n}\n\nfunction f0_10_11_0(){\n return isNaN(undefined)\n}\n\nfunction f0_10_11_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_10_11_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_11_3(){\n return isNaN(undefined)\n}\n\nfunction f0_10_11_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_11_5(){\n return Math.random()\n}\n\nfunction f0_10_11_6(){\n return isNaN(undefined)\n}\n\nfunction f0_10_11_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_10_11_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_10_11_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_11_10(){\n return isNaN(undefined)\n}\n\nfunction f0_10_11_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_10_11(){\n f0_10_11_0();\n f0_10_11_1();\n f0_10_11_2();\n f0_10_11_3();\n f0_10_11_4();\n f0_10_11_5();\n f0_10_11_6();\n f0_10_11_7();\n f0_10_11_8();\n f0_10_11_9();\n f0_10_11_10();\n f0_10_11_11();\n}\n\nfunction f0_10(){\n f0_10_0();\n f0_10_1();\n f0_10_2();\n f0_10_3();\n f0_10_4();\n f0_10_5();\n f0_10_6();\n f0_10_7();\n f0_10_8();\n f0_10_9();\n f0_10_10();\n f0_10_11();\n\n}\n\nfunction f0_11_0_0(){\n return Math.random()\n}\n\nfunction f0_11_0_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_11_0_2(){\n return isNaN(undefined)\n}\n\nfunction f0_11_0_3(){\n return Math.random()\n}\n\nfunction f0_11_0_4(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_11_0_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_11_0_6(){\n return isNaN(undefined)\n}\n\nfunction f0_11_0_7(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_11_0_8(){\n return Math.random()\n}\n\nfunction f0_11_0_9(){\n return Math.random()\n}\n\nfunction f0_11_0_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_11_0_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_11_0(){\n f0_11_0_0();\n f0_11_0_1();\n f0_11_0_2();\n f0_11_0_3();\n f0_11_0_4();\n f0_11_0_5();\n f0_11_0_6();\n f0_11_0_7();\n f0_11_0_8();\n f0_11_0_9();\n f0_11_0_10();\n f0_11_0_11();\n}\n\nfunction f0_11_1_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_11_1_1(){\n return Math.random()\n}\n\nfunction f0_11_1_2(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_11_1_3(){\n return Math.random()\n}\n\nfunction f0_11_1_4(){\n return isNaN(undefined)\n}\n\nfunction f0_11_1_5(){\n return Math.random()\n}\n\nfunction f0_11_1_6(){\n return isNaN(undefined)\n}\n\nfunction f0_11_1_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_11_1_8(){\n return Math.random()\n}\n\nfunction f0_11_1_9(){\n return isNaN(undefined)\n}\n\nfunction f0_11_1_10(){\n return isNaN(undefined)\n}\n\nfunction f0_11_1_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_11_1(){\n f0_11_1_0();\n f0_11_1_1();\n f0_11_1_2();\n f0_11_1_3();\n f0_11_1_4();\n f0_11_1_5();\n f0_11_1_6();\n f0_11_1_7();\n f0_11_1_8();\n f0_11_1_9();\n f0_11_1_10();\n f0_11_1_11();\n}\n\nfunction f0_11_2_0(){\n return Math.random()\n}\n\nfunction f0_11_2_1(){\n return isNaN(undefined)\n}\n\nfunction f0_11_2_2(){\n return isNaN(undefined)\n}\n\nfunction f0_11_2_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_11_2_4(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_11_2_5(){\n return isNaN(undefined)\n}\n\nfunction f0_11_2_6(){\n return Math.random()\n}\n\nfunction f0_11_2_7(){\n return Math.random()\n}\n\nfunction f0_11_2_8(){\n return Math.random()\n}\n\nfunction f0_11_2_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_11_2_10(){\n return isNaN(undefined)\n}\n\nfunction f0_11_2_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_11_2(){\n f0_11_2_0();\n f0_11_2_1();\n f0_11_2_2();\n f0_11_2_3();\n f0_11_2_4();\n f0_11_2_5();\n f0_11_2_6();\n f0_11_2_7();\n f0_11_2_8();\n f0_11_2_9();\n f0_11_2_10();\n f0_11_2_11();\n}\n\nfunction f0_11_3_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_11_3_1(){\n return Math.random()\n}\n\nfunction f0_11_3_2(){\n return isNaN(undefined)\n}\n\nfunction f0_11_3_3(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_11_3_4(){\n return Math.random()\n}\n\nfunction f0_11_3_5(){\n return Math.random()\n}\n\nfunction f0_11_3_6(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_11_3_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_11_3_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_11_3_9(){\n return Math.random()\n}\n\nfunction f0_11_3_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_11_3_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_11_3(){\n f0_11_3_0();\n f0_11_3_1();\n f0_11_3_2();\n f0_11_3_3();\n f0_11_3_4();\n f0_11_3_5();\n f0_11_3_6();\n f0_11_3_7();\n f0_11_3_8();\n f0_11_3_9();\n f0_11_3_10();\n f0_11_3_11();\n}\n\nfunction f0_11_4_0(){\n return isNaN(undefined)\n}\n\nfunction f0_11_4_1(){\n return Math.random()\n}\n\nfunction f0_11_4_2(){\n return Math.random()\n}\n\nfunction f0_11_4_3(){\n return Math.random()\n}\n\nfunction f0_11_4_4(){\n return Math.random()\n}\n\nfunction f0_11_4_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_11_4_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_11_4_7(){\n return Math.random()\n}\n\nfunction f0_11_4_8(){\n return Math.random()\n}\n\nfunction f0_11_4_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_11_4_10(){\n return Math.random()\n}\n\nfunction f0_11_4_11(){\n return isNaN(undefined)\n}\n\nfunction f0_11_4(){\n f0_11_4_0();\n f0_11_4_1();\n f0_11_4_2();\n f0_11_4_3();\n f0_11_4_4();\n f0_11_4_5();\n f0_11_4_6();\n f0_11_4_7();\n f0_11_4_8();\n f0_11_4_9();\n f0_11_4_10();\n f0_11_4_11();\n}\n\nfunction f0_11_5_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_11_5_1(){\n return Math.random()\n}\n\nfunction f0_11_5_2(){\n return isNaN(undefined)\n}\n\nfunction f0_11_5_3(){\n return isNaN(undefined)\n}\n\nfunction f0_11_5_4(){\n return Math.random()\n}\n\nfunction f0_11_5_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_11_5_6(){\n return Math.random()\n}\n\nfunction f0_11_5_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_11_5_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_11_5_9(){\n return Math.random()\n}\n\nfunction f0_11_5_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_11_5_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_11_5(){\n f0_11_5_0();\n f0_11_5_1();\n f0_11_5_2();\n f0_11_5_3();\n f0_11_5_4();\n f0_11_5_5();\n f0_11_5_6();\n f0_11_5_7();\n f0_11_5_8();\n f0_11_5_9();\n f0_11_5_10();\n f0_11_5_11();\n}\n\nfunction f0_11_6_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_11_6_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_11_6_2(){\n return isNaN(undefined)\n}\n\nfunction f0_11_6_3(){\n return isNaN(undefined)\n}\n\nfunction f0_11_6_4(){\n return isNaN(undefined)\n}\n\nfunction f0_11_6_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_11_6_6(){\n return Math.random()\n}\n\nfunction f0_11_6_7(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_11_6_8(){\n return Math.random()\n}\n\nfunction f0_11_6_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_11_6_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_11_6_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_11_6(){\n f0_11_6_0();\n f0_11_6_1();\n f0_11_6_2();\n f0_11_6_3();\n f0_11_6_4();\n f0_11_6_5();\n f0_11_6_6();\n f0_11_6_7();\n f0_11_6_8();\n f0_11_6_9();\n f0_11_6_10();\n f0_11_6_11();\n}\n\nfunction f0_11_7_0(){\n return isNaN(undefined)\n}\n\nfunction f0_11_7_1(){\n return Math.random()\n}\n\nfunction f0_11_7_2(){\n return Math.random()\n}\n\nfunction f0_11_7_3(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_11_7_4(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_11_7_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_11_7_6(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_11_7_7(){\n return Math.random()\n}\n\nfunction f0_11_7_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_11_7_9(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_11_7_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_11_7_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_11_7(){\n f0_11_7_0();\n f0_11_7_1();\n f0_11_7_2();\n f0_11_7_3();\n f0_11_7_4();\n f0_11_7_5();\n f0_11_7_6();\n f0_11_7_7();\n f0_11_7_8();\n f0_11_7_9();\n f0_11_7_10();\n f0_11_7_11();\n}\n\nfunction f0_11_8_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_11_8_1(){\n return isNaN(undefined)\n}\n\nfunction f0_11_8_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_11_8_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_11_8_4(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_11_8_5(){\n return Math.random()\n}\n\nfunction f0_11_8_6(){\n return Math.random()\n}\n\nfunction f0_11_8_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_11_8_8(){\n return isNaN(undefined)\n}\n\nfunction f0_11_8_9(){\n return isNaN(undefined)\n}\n\nfunction f0_11_8_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_11_8_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_11_8(){\n f0_11_8_0();\n f0_11_8_1();\n f0_11_8_2();\n f0_11_8_3();\n f0_11_8_4();\n f0_11_8_5();\n f0_11_8_6();\n f0_11_8_7();\n f0_11_8_8();\n f0_11_8_9();\n f0_11_8_10();\n f0_11_8_11();\n}\n\nfunction f0_11_9_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_11_9_1(){\n return Math.random()\n}\n\nfunction f0_11_9_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_11_9_3(){\n return Math.random()\n}\n\nfunction f0_11_9_4(){\n return isNaN(undefined)\n}\n\nfunction f0_11_9_5(){\n return Math.random()\n}\n\nfunction f0_11_9_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_11_9_7(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_11_9_8(){\n return Math.random()\n}\n\nfunction f0_11_9_9(){\n return isNaN(undefined)\n}\n\nfunction f0_11_9_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_11_9_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_11_9(){\n f0_11_9_0();\n f0_11_9_1();\n f0_11_9_2();\n f0_11_9_3();\n f0_11_9_4();\n f0_11_9_5();\n f0_11_9_6();\n f0_11_9_7();\n f0_11_9_8();\n f0_11_9_9();\n f0_11_9_10();\n f0_11_9_11();\n}\n\nfunction f0_11_10_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_11_10_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_11_10_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_11_10_3(){\n return isNaN(undefined)\n}\n\nfunction f0_11_10_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_11_10_5(){\n return isNaN(undefined)\n}\n\nfunction f0_11_10_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_11_10_7(){\n return isNaN(undefined)\n}\n\nfunction f0_11_10_8(){\n return Math.random()\n}\n\nfunction f0_11_10_9(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_11_10_10(){\n return isNaN(undefined)\n}\n\nfunction f0_11_10_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_11_10(){\n f0_11_10_0();\n f0_11_10_1();\n f0_11_10_2();\n f0_11_10_3();\n f0_11_10_4();\n f0_11_10_5();\n f0_11_10_6();\n f0_11_10_7();\n f0_11_10_8();\n f0_11_10_9();\n f0_11_10_10();\n f0_11_10_11();\n}\n\nfunction f0_11_11_0(){\n return Math.random()\n}\n\nfunction f0_11_11_1(){\n return isNaN(undefined)\n}\n\nfunction f0_11_11_2(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_11_11_3(){\n return isNaN(undefined)\n}\n\nfunction f0_11_11_4(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_11_11_5(){\n return isNaN(undefined)\n}\n\nfunction f0_11_11_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_11_11_7(){\n return isNaN(undefined)\n}\n\nfunction f0_11_11_8(){\n return Math.random()\n}\n\nfunction f0_11_11_9(){\n return Math.random()\n}\n\nfunction f0_11_11_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f0_11_11_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f0_11_11(){\n f0_11_11_0();\n f0_11_11_1();\n f0_11_11_2();\n f0_11_11_3();\n f0_11_11_4();\n f0_11_11_5();\n f0_11_11_6();\n f0_11_11_7();\n f0_11_11_8();\n f0_11_11_9();\n f0_11_11_10();\n f0_11_11_11();\n}\n\nfunction f0_11(){\n f0_11_0();\n f0_11_1();\n f0_11_2();\n f0_11_3();\n f0_11_4();\n f0_11_5();\n f0_11_6();\n f0_11_7();\n f0_11_8();\n f0_11_9();\n f0_11_10();\n f0_11_11();\n\n}\n\nfunction f0(){\n f0_0();\n f0_1();\n f0_2();\n f0_3();\n f0_4();\n f0_5();\n f0_6();\n f0_7();\n f0_8();\n f0_9();\n f0_10();\n f0_11();\n\n}\n\nfunction f2_0(){\n return Math.random()\n}\n\nfunction f2_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f2_2(){\n return isNaN(undefined)\n}\n\nfunction f2_3(){\n return isNaN(undefined)\n}\n\nfunction f2_4(){\n return isNaN(undefined)\n}\n\nfunction f2_5(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f2_6(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f2_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f2_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f2_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f2_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f2_11(){\n return isNaN(undefined)\n}\n\nfunction f1(){\n f1_0();\n f1_1();\n f1_2();\n f1_3();\n f1_4();\n f1_5();\n f1_6();\n f1_7();\n f1_8();\n f1_9();\n f1_10();\n f1_11();\n\n}\n\nfunction f1_0_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f1_0_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f1_0_2(){\n return Math.random()\n}\n\nfunction f1_0_3(){\n return isNaN(undefined)\n}\n\nfunction f1_0_4(){\n return isNaN(undefined)\n}\n\nfunction f1_0_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_0_6(){\n return isNaN(undefined)\n}\n\nfunction f1_0_7(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f1_0_8(){\n return isNaN(undefined)\n}\n\nfunction f1_0_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_0_10(){\n return Math.random()\n}\n\nfunction f1_0_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_0(){\n f1_0_0();\n f1_0_1();\n f1_0_2();\n f1_0_3();\n f1_0_4();\n f1_0_5();\n f1_0_6();\n f1_0_7();\n f1_0_8();\n f1_0_9();\n f1_0_10();\n f1_0_11();\n\n}\n\nfunction f1_1_0(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f1_1_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_1_2(){\n return isNaN(undefined)\n}\n\nfunction f1_1_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f1_1_4(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f1_1_5(){\n return Math.random()\n}\n\nfunction f1_1_6(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_1_7(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_1_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_1_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_1_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_1_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_1(){\n f1_1_0();\n f1_1_1();\n f1_1_2();\n f1_1_3();\n f1_1_4();\n f1_1_5();\n f1_1_6();\n f1_1_7();\n f1_1_8();\n f1_1_9();\n f1_1_10();\n f1_1_11();\n}\n\nfunction f1_2_0(){\n return Math.random()\n}\n\nfunction f1_2_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_2_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_2_3(){\n return isNaN(undefined)\n}\n\nfunction f1_2_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_2_5(){\n return Math.random()\n}\n\nfunction f1_2_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f1_2_7(){\n return isNaN(undefined)\n}\n\nfunction f1_2_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_2_9(){\n return Math.random()\n}\n\nfunction f1_2_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f1_2_11(){\n return Math.random()\n}\n\nfunction f1_2(){\n f1_2_0();\n f1_2_1();\n f1_2_2();\n f1_2_3();\n f1_2_4();\n f1_2_5();\n f1_2_6();\n f1_2_7();\n f1_2_8();\n f1_2_9();\n f1_2_10();\n f1_2_11();\n\n}\n\nfunction f1_3_0(){\n return Math.random()\n}\n\nfunction f1_3_1(){\n return isNaN(undefined)\n}\n\nfunction f1_3_2(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f1_3_3(){\n return isNaN(undefined)\n}\n\nfunction f1_3_4(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f1_3_5(){\n return isNaN(undefined)\n}\n\nfunction f1_3_6(){\n return Math.random()\n}\n\nfunction f1_3_7(){\n return Math.random()\n}\n\nfunction f1_3_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f1_3_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_3_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_3_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f1_3(){\n f1_3_0();\n f1_3_1();\n f1_3_2();\n f1_3_3();\n f1_3_4();\n f1_3_5();\n f1_3_6();\n f1_3_7();\n f1_3_8();\n f1_3_9();\n f1_3_10();\n f1_3_11();\n\n}\n\nfunction f1_4_0(){\n return isNaN(undefined)\n}\n\nfunction f1_4_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_4_2(){\n return isNaN(undefined)\n}\n\nfunction f1_4_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f1_4_4(){\n return Math.random()\n}\n\nfunction f1_4_5(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f1_4_6(){\n return isNaN(undefined)\n}\n\nfunction f1_4_7(){\n return isNaN(undefined)\n}\n\nfunction f1_4_8(){\n return Math.random()\n}\n\nfunction f1_4_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_4_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_4_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f1_4(){\n f1_4_0();\n f1_4_1();\n f1_4_2();\n f1_4_3();\n f1_4_4();\n f1_4_5();\n f1_4_6();\n f1_4_7();\n f1_4_8();\n f1_4_9();\n f1_4_10();\n f1_4_11();\n\n}\n\nfunction f1_5_0(){\n return isNaN(undefined)\n}\n\nfunction f1_5_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_5_2(){\n return Math.random()\n}\n\nfunction f1_5_3(){\n return isNaN(undefined)\n}\n\nfunction f1_5_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_5_5(){\n return isNaN(undefined)\n}\n\nfunction f1_5_6(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_5_7(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_5_8(){\n return Math.random()\n}\n\nfunction f1_5_9(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f1_5_10(){\n return isNaN(undefined)\n}\n\nfunction f1_5_11(){\n return isNaN(undefined)\n}\n\nfunction f1_5(){\n f1_5_0();\n f1_5_1();\n f1_5_2();\n f1_5_3();\n f1_5_4();\n f1_5_5();\n f1_5_6();\n f1_5_7();\n f1_5_8();\n f1_5_9();\n f1_5_10();\n f1_5_11();\n\n}\n\nfunction f1_6_0(){\n return Math.random()\n}\n\nfunction f1_6_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f1_6_2(){\n return Math.random()\n}\n\nfunction f1_6_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f1_6_4(){\n return Math.random()\n}\n\nfunction f1_6_5(){\n return Math.random()\n}\n\nfunction f1_6_6(){\n return Math.random()\n}\n\nfunction f1_6_7(){\n return Math.random()\n}\n\nfunction f1_6_8(){\n return isNaN(undefined)\n}\n\nfunction f1_6_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_6_10(){\n return Math.random()\n}\n\nfunction f1_6_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f1_6(){\n f1_6_0();\n f1_6_1();\n f1_6_2();\n f1_6_3();\n f1_6_4();\n f1_6_5();\n f1_6_6();\n f1_6_7();\n f1_6_8();\n f1_6_9();\n f1_6_10();\n f1_6_11();\n\n}\n\nfunction f1_7_0(){\n return Math.random()\n}\n\nfunction f1_7_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_7_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_7_3(){\n return Math.random()\n}\n\nfunction f1_7_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_7_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_7_6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f1_7_7(){\n return isNaN(undefined)\n}\n\nfunction f1_7_8(){\n return isNaN(undefined)\n}\n\nfunction f1_7_9(){\n return isNaN(undefined)\n}\n\nfunction f1_7_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f1_7_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f1_7(){\n f1_7_0();\n f1_7_1();\n f1_7_2();\n f1_7_3();\n f1_7_4();\n f1_7_5();\n f1_7_6();\n f1_7_7();\n f1_7_8();\n f1_7_9();\n f1_7_10();\n f1_7_11();\n\n}\n\nfunction f1_8_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_8_1(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f1_8_2(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_8_3(){\n return isNaN(undefined)\n}\n\nfunction f1_8_4(){\n return isNaN(undefined)\n}\n\nfunction f1_8_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_8_6(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_8_7(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_8_8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f1_8_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_8_10(){\n return isNaN(undefined)\n}\n\nfunction f1_8_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_8(){\n f1_8_0();\n f1_8_1();\n f1_8_2();\n f1_8_3();\n f1_8_4();\n f1_8_5();\n f1_8_6();\n f1_8_7();\n f1_8_8();\n f1_8_9();\n f1_8_10();\n f1_8_11();\n\n}\n\nfunction f1_9_0(){\n return Math.random()\n}\n\nfunction f1_9_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_9_2(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f1_9_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f1_9_4(){\n return Math.random()\n}\n\nfunction f1_9_5(){\n return isNaN(undefined)\n}\n\nfunction f1_9_6(){\n return isNaN(undefined)\n}\n\nfunction f1_9_7(){\n return Math.random()\n}\n\nfunction f1_9_8(){\n return Math.random()\n}\n\nfunction f1_9_9(){\n return Math.random()\n}\n\nfunction f1_9_10(){\n return isNaN(undefined)\n}\n\nfunction f1_9_11(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f1_9(){\n f1_9_0();\n f1_9_1();\n f1_9_2();\n f1_9_3();\n f1_9_4();\n f1_9_5();\n f1_9_6();\n f1_9_7();\n f1_9_8();\n f1_9_9();\n f1_9_10();\n f1_9_11();\n\n}\n\nfunction f1_10_0(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_10_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_10_2(){\n return Math.random()\n}\n\nfunction f1_10_3(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f1_10_4(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f1_10_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_10_6(){\n return Math.random()\n}\n\nfunction f1_10_7(){\n return Math.random()\n}\n\nfunction f1_10_8(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_10_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_10_10(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f1_10_11(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_10(){\n f1_10_0();\n f1_10_1();\n f1_10_2();\n f1_10_3();\n f1_10_4();\n f1_10_5();\n f1_10_6();\n f1_10_7();\n f1_10_8();\n f1_10_9();\n f1_10_10();\n f1_10_11();\n\n}\n\nfunction f1_11_0(){\n return isNaN(undefined)\n}\n\nfunction f1_11_1(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_11_2(){\n return isNaN(undefined)\n}\n\nfunction f1_11_3(){\n return isNaN(undefined)\n}\n\nfunction f1_11_4(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_11_5(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_11_6(){\n return Math.random()\n}\n\nfunction f1_11_7(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_11_8(){\n return Math.random()\n}\n\nfunction f1_11_9(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_11_10(){\n return encodeURIComponent(\",45098#\\\"¤#\\\"&¤/%\\\"Q\\\"\")\n}\n\nfunction f1_11_11(){\n return Math.random()\n}\n\nfunction f1_11(){\n f1_11_0();\n f1_11_1();\n f1_11_2();\n f1_11_3();\n f1_11_4();\n f1_11_5();\n f1_11_6();\n f1_11_7();\n f1_11_8();\n f1_11_9();\n f1_11_10();\n f1_11_11();\n}\n\nfunction f2(){\n f2_0();\n f2_1();\n f2_2();\n f2_3();\n f2_4();\n f2_5();\n f2_6();\n f2_7();\n f2_8();\n f2_9();\n f2_10();\n f2_11();\n\n}\n\nfunction f3(){\n return isNaN(undefined)\n}\n\nfunction f4(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f5(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f6(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f7(){\n return isNaN(undefined)\n}\n\nfunction f8(){\n return Math.max(Math.random(), Math.random())\n}\n\nfunction f9(){\n return isNaN(undefined)\n}\n\nfunction f10(){\n return isNaN(undefined)\n}\n\nfunction f11(){\n return isNaN(undefined)\n}\n\nexport function stepInTest(){\n\n f0();\n f1();\n f2();\n f3();\n f4();\n f5();\n f6();\n f7();\n f8();\n f9();\n f10();\n f11();\n console.log('Done!');\n\n}\n\nexport function debugStatement(){\n\n debugger;\n f0();\n f1();\n f2();\n f3();\n f4();\n f5();\n f6();\n f7();\n f8();\n f9();\n f10();\n f11();\n console.log('Done!');\n\n}\n\n\n\n\n// WEBPACK FOOTER //\n// src/step-in-test.js","function f0() {\n f1();\n return Math.random();\n}\n\nfunction f1() {\n f2();\n return Math.random();\n}\n\nfunction f2() {\n f3();\n return Math.random();\n}\n\nfunction f3() {\n f4();\n return Math.random();\n}\n\nfunction f4() {\n f5();\n return Math.random();\n}\n\nfunction f5() {\n f6();\n return Math.random();\n}\n\nfunction f6() {\n f7();\n return Math.random();\n}\n\nfunction f7() {\n f8();\n return Math.random();\n}\n\nfunction f8() {\n f9();\n return Math.random();\n}\n\nfunction f9() {\n f10();\n return Math.random();\n}\n\nfunction f10() {\n f11();\n return Math.random();\n}\n\nfunction f11() {\n f12();\n return Math.random();\n}\n\nfunction f12() {\n f13();\n return Math.random();\n}\n\nfunction f13() {\n f14();\n return Math.random();\n}\n\nfunction f14() {\n f15();\n return Math.random();\n}\n\nfunction f15() {\n f16();\n return Math.random();\n}\n\nfunction f16() {\n f17();\n return Math.random();\n}\n\nfunction f17() {\n f18();\n return Math.random();\n}\n\nfunction f18() {\n f19();\n return Math.random();\n}\n\nfunction f19() {\n f20();\n return Math.random();\n}\n\nfunction f20() {\n f21();\n return Math.random();\n}\n\nfunction f21() {\n f22();\n return Math.random();\n}\n\nfunction f22() {\n f23();\n return Math.random();\n}\n\nfunction f23() {\n f24();\n return Math.random();\n}\n\nfunction f24() {\n f25();\n return Math.random();\n}\n\nfunction f25() {\n f26();\n return Math.random();\n}\n\nfunction f26() {\n f27();\n return Math.random();\n}\n\nfunction f27() {\n f28();\n return Math.random();\n}\n\nfunction f28() {\n f29();\n return Math.random();\n}\n\nfunction f29() {\n f30();\n return Math.random();\n}\n\nfunction f30() {\n f31();\n return Math.random();\n}\n\nfunction f31() {\n f32();\n return Math.random();\n}\n\nfunction f32() {\n f33();\n return Math.random();\n}\n\nfunction f33() {\n f34();\n return Math.random();\n}\n\nfunction f34() {\n f35();\n return Math.random();\n}\n\nfunction f35() {\n f36();\n return Math.random();\n}\n\nfunction f36() {\n f37();\n return Math.random();\n}\n\nfunction f37() {\n f38();\n return Math.random();\n}\n\nfunction f38() {\n f39();\n return Math.random();\n}\n\nfunction f39() {\n f40();\n return Math.random();\n}\n\nfunction f40() {\n f41();\n return Math.random();\n}\n\nfunction f41() {\n f42();\n return Math.random();\n}\n\nfunction f42() {\n f43();\n return Math.random();\n}\n\nfunction f43() {\n f44();\n return Math.random();\n}\n\nfunction f44() {\n f45();\n return Math.random();\n}\n\nfunction f45() {\n f46();\n return Math.random();\n}\n\nfunction f46() {\n f47();\n return Math.random();\n}\n\nfunction f47() {\n f48();\n return Math.random();\n}\n\nfunction f48() {\n f49();\n return Math.random();\n}\n\nfunction f49() {\n f50();\n return Math.random();\n}\n\nfunction f50() {\n f51();\n return Math.random();\n}\n\nfunction f51() {\n f52();\n return Math.random();\n}\n\nfunction f52() {\n f53();\n return Math.random();\n}\n\nfunction f53() {\n f54();\n return Math.random();\n}\n\nfunction f54() {\n f55();\n return Math.random();\n}\n\nfunction f55() {\n f56();\n return Math.random();\n}\n\nfunction f56() {\n f57();\n return Math.random();\n}\n\nfunction f57() {\n f58();\n return Math.random();\n}\n\nfunction f58() {\n f59();\n return Math.random();\n}\n\nfunction f59() {\n f60();\n return Math.random();\n}\n\nfunction f60() {\n f61();\n return Math.random();\n}\n\nfunction f61() {\n f62();\n return Math.random();\n}\n\nfunction f62() {\n f63();\n return Math.random();\n}\n\nfunction f63() {\n f64();\n return Math.random();\n}\n\nfunction f64() {\n f65();\n return Math.random();\n}\n\nfunction f65() {\n f66();\n return Math.random();\n}\n\nfunction f66() {\n f67();\n return Math.random();\n}\n\nfunction f67() {\n f68();\n return Math.random();\n}\n\nfunction f68() {\n f69();\n return Math.random();\n}\n\nfunction f69() {\n f70();\n return Math.random();\n}\n\nfunction f70() {\n f71();\n return Math.random();\n}\n\nfunction f71() {\n f72();\n return Math.random();\n}\n\nfunction f72() {\n f73();\n return Math.random();\n}\n\nfunction f73() {\n f74();\n return Math.random();\n}\n\nfunction f74() {\n f75();\n return Math.random();\n}\n\nfunction f75() {\n f76();\n return Math.random();\n}\n\nfunction f76() {\n f77();\n return Math.random();\n}\n\nfunction f77() {\n f78();\n return Math.random();\n}\n\nfunction f78() {\n f79();\n return Math.random();\n}\n\nfunction f79() {\n f80();\n return Math.random();\n}\n\nfunction f80() {\n f81();\n return Math.random();\n}\n\nfunction f81() {\n f82();\n return Math.random();\n}\n\nfunction f82() {\n f83();\n return Math.random();\n}\n\nfunction f83() {\n f84();\n return Math.random();\n}\n\nfunction f84() {\n f85();\n return Math.random();\n}\n\nfunction f85() {\n f86();\n return Math.random();\n}\n\nfunction f86() {\n f87();\n return Math.random();\n}\n\nfunction f87() {\n f88();\n return Math.random();\n}\n\nfunction f88() {\n f89();\n return Math.random();\n}\n\nfunction f89() {\n f90();\n return Math.random();\n}\n\nfunction f90() {\n f91();\n return Math.random();\n}\n\nfunction f91() {\n f92();\n return Math.random();\n}\n\nfunction f92() {\n f93();\n return Math.random();\n}\n\nfunction f93() {\n f94();\n return Math.random();\n}\n\nfunction f94() {\n f95();\n return Math.random();\n}\n\nfunction f95() {\n f96();\n return Math.random();\n}\n\nfunction f96() {\n f97();\n return Math.random();\n}\n\nfunction f97() {\n f98();\n return Math.random();\n}\n\nfunction f98() {\n f99();\n return Math.random();\n}\n\nfunction f99() {\n f100();\n return Math.random();\n}\n\n\nfunction f100() {\n f101();\n return Math.random();\n}\n\nfunction f101() {\n f102();\n return Math.random();\n}\n\nfunction f102() {\n f103();\n return Math.random();\n}\n\nfunction f103() {\n f104();\n return Math.random();\n}\n\nfunction f104() {\n f105();\n return Math.random();\n}\n\nfunction f105() {\n f106();\n return Math.random();\n}\n\nfunction f106() {\n f107();\n return Math.random();\n}\n\nfunction f107() {\n f108();\n return Math.random();\n}\n\nfunction f108() {\n f109();\n return Math.random();\n}\n\nfunction f109() {\n f110();\n return Math.random();\n}\n\nfunction f110() {\n f111();\n return Math.random();\n}\n\nfunction f111() {\n f112();\n return Math.random();\n}\n\nfunction f112() {\n f113();\n return Math.random();\n}\n\nfunction f113() {\n f114();\n return Math.random();\n}\n\nfunction f114() {\n f115();\n return Math.random();\n}\n\nfunction f115() {\n f116();\n return Math.random();\n}\n\nfunction f116() {\n f117();\n return Math.random();\n}\n\nfunction f117() {\n f118();\n return Math.random();\n}\n\nfunction f118() {\n f119();\n return Math.random();\n}\n\nfunction f119() {\n f120();\n return Math.random();\n}\n\nfunction f120() {\n f121();\n return Math.random();\n}\n\nfunction f121() {\n f122();\n return Math.random();\n}\n\nfunction f122() {\n f123();\n return Math.random();\n}\n\nfunction f123() {\n f124();\n return Math.random();\n}\n\nfunction f124() {\n f125();\n return Math.random();\n}\n\nfunction f125() {\n f126();\n return Math.random();\n}\n\nfunction f126() {\n f127();\n return Math.random();\n}\n\nfunction f127() {\n f128();\n return Math.random();\n}\n\nfunction f128() {\n f129();\n return Math.random();\n}\n\nfunction f129() {\n f130();\n return Math.random();\n}\n\nfunction f130() {\n f131();\n return Math.random();\n}\n\nfunction f131() {\n f132();\n return Math.random();\n}\n\nfunction f132() {\n f133();\n return Math.random();\n}\n\nfunction f133() {\n f134();\n return Math.random();\n}\n\nfunction f134() {\n f135();\n return Math.random();\n}\n\nfunction f135() {\n f136();\n return Math.random();\n}\n\nfunction f136() {\n f137();\n return Math.random();\n}\n\nfunction f137() {\n f138();\n return Math.random();\n}\n\nfunction f138() {\n f139();\n return Math.random();\n}\n\nfunction f139() {\n f140();\n return Math.random();\n}\n\nfunction f140() {\n f141();\n return Math.random();\n}\n\nfunction f141() {\n f142();\n return Math.random();\n}\n\nfunction f142() {\n f143();\n return Math.random();\n}\n\nfunction f143() {\n f144();\n return Math.random();\n}\n\nfunction f144() {\n f145();\n return Math.random();\n}\n\nfunction f145() {\n f146();\n return Math.random();\n}\n\nfunction f146() {\n f147();\n return Math.random();\n}\n\nfunction f147() {\n f148();\n return Math.random();\n}\n\nfunction f148() {\n f149();\n return Math.random();\n}\n\nfunction f149() {\n f150();\n return Math.random();\n}\n\nfunction f150() {\n f151();\n return Math.random();\n}\n\nfunction f151() {\n f152();\n return Math.random();\n}\n\nfunction f152() {\n f153();\n return Math.random();\n}\n\nfunction f153() {\n f154();\n return Math.random();\n}\n\nfunction f154() {\n f155();\n return Math.random();\n}\n\nfunction f155() {\n f156();\n return Math.random();\n}\n\nfunction f156() {\n f157();\n return Math.random();\n}\n\nfunction f157() {\n f158();\n return Math.random();\n}\n\nfunction f158() {\n f159();\n return Math.random();\n}\n\nfunction f159() {\n f160();\n return Math.random();\n}\n\nfunction f160() {\n f161();\n return Math.random();\n}\n\nfunction f161() {\n f162();\n return Math.random();\n}\n\nfunction f162() {\n f163();\n return Math.random();\n}\n\nfunction f163() {\n f164();\n return Math.random();\n}\n\nfunction f164() {\n f165();\n return Math.random();\n}\n\nfunction f165() {\n f166();\n return Math.random();\n}\n\nfunction f166() {\n f167();\n return Math.random();\n}\n\nfunction f167() {\n f168();\n return Math.random();\n}\n\nfunction f168() {\n f169();\n return Math.random();\n}\n\nfunction f169() {\n f170();\n return Math.random();\n}\n\nfunction f170() {\n f171();\n return Math.random();\n}\n\nfunction f171() {\n f172();\n return Math.random();\n}\n\nfunction f172() {\n f173();\n return Math.random();\n}\n\nfunction f173() {\n f174();\n return Math.random();\n}\n\nfunction f174() {\n f175();\n return Math.random();\n}\n\nfunction f175() {\n f176();\n return Math.random();\n}\n\nfunction f176() {\n f177();\n return Math.random();\n}\n\nfunction f177() {\n f178();\n return Math.random();\n}\n\nfunction f178() {\n f179();\n return Math.random();\n}\n\nfunction f179() {\n f180();\n return Math.random();\n}\n\nfunction f180() {\n f181();\n return Math.random();\n}\n\nfunction f181() {\n f182();\n return Math.random();\n}\n\nfunction f182() {\n f183();\n return Math.random();\n}\n\nfunction f183() {\n f184();\n return Math.random();\n}\n\nfunction f184() {\n f185();\n return Math.random();\n}\n\nfunction f185() {\n f186();\n return Math.random();\n}\n\nfunction f186() {\n f187();\n return Math.random();\n}\n\nfunction f187() {\n f188();\n return Math.random();\n}\n\nfunction f188() {\n f189();\n return Math.random();\n}\n\nfunction f189() {\n f190();\n return Math.random();\n}\n\nfunction f190() {\n f191();\n return Math.random();\n}\n\nfunction f191() {\n f192();\n return Math.random();\n}\n\nfunction f192() {\n f193();\n return Math.random();\n}\n\nfunction f193() {\n f194();\n return Math.random();\n}\n\nfunction f194() {\n f195();\n return Math.random();\n}\n\nfunction f195() {\n f196();\n return Math.random();\n}\n\nfunction f196() {\n f197();\n return Math.random();\n}\n\nfunction f197() {\n f198();\n return Math.random();\n}\n\nfunction f198() {\n f199();\n return Math.random();\n}\n\nfunction f199() {\n return Math.random();\n}\n\nexport default f0;\n\n\n\n// WEBPACK FOOTER //\n// src/step-out-test.js","function squareAndOne(arg){\n return (arg * arg) + 1;\n}\nfunction squareUntil(arg, limit){\n if(arg * arg >= limit){\n return arg * arg;\n }else{\n return squareUntil(arg * arg, limit);\n }\n}\n\nfunction addUntil(arg1, arg2, limit){\n if(arg1 + arg2 > limit){\n return arg1 + arg2;\n }else{\n return addUntil(arg1 + arg2, arg2, limit);\n }\n}\n\nfunction testStart(aArg) {\n var r = 10;\n var a = squareAndOne(r);\n var b = squareUntil(r, 99999999999); //recurses 3 times, returns on 4th call\n var c = addUntil(r, 5, 1050); // recurses 208 times and returns on the 209th call\n return a + b + c;\n}\n\nexport default testStart;\n\n\n\n// WEBPACK FOOTER //\n// src/step-over-test.js"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;ACntBA;AACA;AACA;AACA;;;;;;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;AC9NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACzEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;AC7DA;AACA;AACA;AACA;;;;;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;;;;;;;;;;;;;;ACr4BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;ACvJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACzFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;ACvLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;ACphBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;ACnFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;ACpFA;AACA;AACA;AACA;;;;;;;;;;;;;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;AC5HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;ACnHA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;AC/QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;ACjieA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;AChmLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;ACpNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;AC1GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;AChHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;AC50CA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;ACrGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;ACxFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;AC5XA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;ACncA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;AChMA;;;;;;;;;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;AC5IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;ACtFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;AC9DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;ACtFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;ACtLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;AClGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;ACtGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;AClGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;ACzLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;AC9CA;;;;;;;;;;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;ACxLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;ACzMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;AC3ZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;ACvEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;AC3tBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACfA;AACA;;;;;;;;;;;;;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC5cA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AADA;AAGA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AADA;AAAA;AAJA;AASA;;;;AAZA;AACA;AAcA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;AClCA;AACA;AACA;AACA;AACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;;;;;;;;;;;ACJA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;;;;;;;;;;;;;ACl/TA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;ACx+BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;A","sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/collected-bundle.js b/devtools/client/debugger/test/mochitest/examples/collected-bundle.js
new file mode 100644
index 0000000000..299e8b8317
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/collected-bundle.js
@@ -0,0 +1,76 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports) {
+
+// No breakpoint on this line!
+console.log("This script is about to be collected.");
+
+
+/***/ })
+/******/ ]);
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgMDdiYThkZmMzNTRiYjMwNGFlY2IiLCJ3ZWJwYWNrOi8vLy4vc3JjL2NvbGxlY3RlZC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQUs7QUFDTDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLG1DQUEyQiwwQkFBMEIsRUFBRTtBQUN2RCx5Q0FBaUMsZUFBZTtBQUNoRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw4REFBc0QsK0RBQStEOztBQUVySDtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7QUM3REE7QUFDQSIsImZpbGUiOiJjb2xsZWN0ZWQtYnVuZGxlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgMDdiYThkZmMzNTRiYjMwNGFlY2IiLCIvLyBObyBicmVha3BvaW50IG9uIHRoaXMgbGluZSFcbmNvbnNvbGUubG9nKFwiVGhpcyBzY3JpcHQgaXMgYWJvdXQgdG8gYmUgY29sbGVjdGVkLlwiKTtcblxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gV0VCUEFDSyBGT09URVJcbi8vIC4vc3JjL2NvbGxlY3RlZC5qc1xuLy8gbW9kdWxlIGlkID0gMFxuLy8gbW9kdWxlIGNodW5rcyA9IDAiXSwic291cmNlUm9vdCI6IiJ9
diff --git a/devtools/client/debugger/test/mochitest/examples/collected-bundle2.js b/devtools/client/debugger/test/mochitest/examples/collected-bundle2.js
new file mode 100644
index 0000000000..b8eb6c82c8
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/collected-bundle2.js
@@ -0,0 +1,75 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports) {
+
+// No breakpoint on this line!
+console.log("This script is also about to be collected.");
+
+
+/***/ })
+/******/ ]);
diff --git a/devtools/client/debugger/test/mochitest/examples/collected-bundle2.js.map b/devtools/client/debugger/test/mochitest/examples/collected-bundle2.js.map
new file mode 100644
index 0000000000..735797601a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/collected-bundle2.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack:///webpack/bootstrap 574e3fc6c6da90548983","webpack:///./src/collected2.js"],"names":[],"mappings":";AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;AC7DA;AACA","file":"collected-bundle2.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 574e3fc6c6da90548983","// No breakpoint on this line!\nconsole.log(\"This script is also about to be collected.\");\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/collected2.js\n// module id = 0\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/collected-bundle2.js^headers^ b/devtools/client/debugger/test/mochitest/examples/collected-bundle2.js^headers^
new file mode 100644
index 0000000000..a7553240ed
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/collected-bundle2.js^headers^
@@ -0,0 +1 @@
+SourceMap: collected-bundle2.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/different_html.sjs b/devtools/client/debugger/test/mochitest/examples/different_html.sjs
new file mode 100644
index 0000000000..ca4b061f05
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/different_html.sjs
@@ -0,0 +1,31 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+const contents = `
+<div>Hello COUNTER</div>
+<script>
+function f() {
+ console.log("First Inline Script " + COUNTER);
+}
+setInterval(f, 1000);
+</script>
+<script>
+function f() {
+ console.log("Second Inline Script " + COUNTER);
+}
+setInterval(f, 1000);
+</script>
+`;
+
+function handleRequest(request, response) {
+ response.setHeader("Cache-Control", "no-store");
+ response.setHeader("Content-Type", "text/html");
+
+ let counter = 1 + (+getState("counter") % 4);
+ setState("counter", "" + counter);
+
+ response.write(contents.replace(/COUNTER/g, counter));
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-all-workers.html b/devtools/client/debugger/test/mochitest/examples/doc-all-workers.html
new file mode 100644
index 0000000000..bf6fa24262
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-all-workers.html
@@ -0,0 +1,32 @@
+<script>
+var worker1 = new Worker("simple-worker.js");
+var worker2 = new SharedWorker("shared-worker.js");
+
+registerServiceWorker();
+
+async function registerServiceWorker() {
+ const sw = navigator.serviceWorker;
+ const swr = await sw.register("service-worker.sjs", { scope: "" });
+
+ await new Promise(resolve => {
+ const worker = swr.installing || swr.waiting || swr.active;
+ if (worker.state === 'activated') {
+ return resolve();
+ }
+
+ worker.addEventListener('statechange', () => {
+ if (worker.state === 'activated') {
+ return resolve();
+ }
+ });
+ });
+
+ await fetch("whatever");
+}
+
+async function unregisterServiceWorker() {
+ const sw = navigator.serviceWorker;
+ const swr = await sw.register("service-worker.sjs", { scope: "" });
+ return swr.unregister();
+}
+</script>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-asm.html b/devtools/client/debugger/test/mochitest/examples/doc-asm.html
new file mode 100644
index 0000000000..8819dd9d73
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-asm.html
@@ -0,0 +1,20 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Asm.js</title>
+ <script src="asm.js"></script>
+ <script>
+ function runAsm() {
+ console.log(asmjs.f());
+ }
+ </script>
+ </head>
+
+ <body>
+ <button onclick="runAsm()">test</button>
+ </body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-async.html b/devtools/client/debugger/test/mochitest/examples/doc-async.html
new file mode 100644
index 0000000000..1271bcf794
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-async.html
@@ -0,0 +1,16 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Async</title>
+ <script src="async.js"></script>
+ </head>
+
+ <body>
+
+ <button onclick="main()">Main</button>
+ </body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-audiocontext.html b/devtools/client/debugger/test/mochitest/examples/doc-audiocontext.html
new file mode 100644
index 0000000000..6c90ce9695
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-audiocontext.html
@@ -0,0 +1,49 @@
+<!-- Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ -->
+<!doctype html>
+
+<html>
+<head>
+<meta charset="utf-8"/>
+<title>Debugger test page</title>
+</head>
+
+<body>
+<button id="start" onclick="myFunction()">start ac</button>
+<button id="suspend" onclick="suspendAC()">suspend ac</button>
+<button id="break" onclick="debuggerStatement()">break</button>
+<button id="check" onclick="checkACState()">check ac state</button>
+<script type="text/javascript">
+var ac = null;
+async function suspendAC() {
+ await ac.suspend();
+}
+
+function debuggerStatement() {
+ debugger;
+}
+
+function checkACState() {
+ if (ac.state != "suspended") {
+ throw "AudioContext should be suspended.";
+ }
+}
+
+async function myFunction() {
+ await new Promise((resolve) => {
+ ac = new AudioContext();
+ function statechange_suspend() {
+ ac.onstatechange = statechange_fail;
+ }
+ function statechange_fail() {
+ throw "No state change should occur when paused in the debugger.";
+ }
+ ac.onstatechange = function() {
+ ac.onstatechange = statechange_suspend;
+ resolve();
+ }
+ });
+}
+</script>
+</body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-bfcache1.html b/devtools/client/debugger/test/mochitest/examples/doc-bfcache1.html
new file mode 100644
index 0000000000..25420a4f61
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-bfcache1.html
@@ -0,0 +1,7 @@
+<body>
+First Page!
+<script>
+console.log("First Page!");
+function goForward() { history.go(1); }
+</script>
+</body>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-bfcache2.html b/devtools/client/debugger/test/mochitest/examples/doc-bfcache2.html
new file mode 100644
index 0000000000..87396f91d2
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-bfcache2.html
@@ -0,0 +1,6 @@
+<body>
+Second Page!
+<script>
+function goBack() { history.go(-1); }
+</script>
+</body>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-blackbox-all.html b/devtools/client/debugger/test/mochitest/examples/doc-blackbox-all.html
new file mode 100644
index 0000000000..ff8e40e6b1
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-blackbox-all.html
@@ -0,0 +1,15 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Blackbox All</title>
+ </head>
+
+ <body>
+ <script type="text/javascript" src="./nested/nested-source.js"></script>
+ <script type="text/javascript" src="./reload/code_reload_1.js"></script>
+ </body>
+</html> \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-command-click.html b/devtools/client/debugger/test/mochitest/examples/doc-command-click.html
new file mode 100644
index 0000000000..a53bb9be2b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-command-click.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Command Click</title>
+ </head>
+
+ <body>
+ <script src="simple2.js"></script>
+ <script src="simple4.js"></script>
+ </body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-content-script-sources.html b/devtools/client/debugger/test/mochitest/examples/doc-content-script-sources.html
new file mode 100644
index 0000000000..1cd5a0ee28
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-content-script-sources.html
@@ -0,0 +1,13 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Debugger test page</title>
+ </head>
+
+ <body>
+ </body>
+
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-debugger-statements.html b/devtools/client/debugger/test/mochitest/examples/doc-debugger-statements.html
new file mode 100644
index 0000000000..d3772ac01f
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-debugger-statements.html
@@ -0,0 +1,31 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<html>
+ <head>
+ <title>Debugger Statements</title>
+ </head>
+
+ <body>
+ <script>
+ debugger;
+ test();
+ console.log('done!');
+
+ function test() {
+ debugger;
+ stepIntoMe();
+ }
+
+ function stepIntoMe() {
+ // step in
+ stepOverMe();
+ // step out
+ }
+
+ function stepOverMe() {
+ }
+ </script>
+ </body>
+
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-dom-mutation.html b/devtools/client/debugger/test/mochitest/examples/doc-dom-mutation.html
new file mode 100644
index 0000000000..e7ff809457
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-dom-mutation.html
@@ -0,0 +1,21 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Debugger test page</title>
+ </head>
+
+ <body>
+ <button title="Hello" id="attribute" onclick="changeAttribute()">Click me!</button>
+ <button id="style-attribute" onclick="changeStyleAttribute()">Click me!</button>
+ <button id="shadow-attribute" onclick="changeAttributeInShadow()">remove attr in shadow</button>
+ <button id="add-in-subtree" onclick="addDivToBody()">add div to body</button>
+ <button id="remove-in-subtree" onclick="removeDivInBody()">remove div in body</button>
+ <button id="blackbox" onclick="changeAttribute();&#xA;debugger;&#xA;//# sourceURL=click.js">Click me!</button>
+ <div id="host"></div>
+ <script src="dom-mutation.js"></script>
+ </body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-duplicate-functions.html b/devtools/client/debugger/test/mochitest/examples/doc-duplicate-functions.html
new file mode 100644
index 0000000000..00e5835f21
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-duplicate-functions.html
@@ -0,0 +1,27 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<html>
+ <head>
+ <title>Debugger test page</title>
+ </head>
+ <body>
+ <h1> debugger test page2</h1>
+ <script type="text/javascript">
+ var func;
+ function a() {
+ function render() {
+ console.log('a');
+ }
+ func = render;
+ }
+
+ function b() {
+ function render() {
+ console.log('b');
+ }
+ func = render;
+ }
+ </script>
+ </body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-early-xhr.html b/devtools/client/debugger/test/mochitest/examples/doc-early-xhr.html
new file mode 100644
index 0000000000..8aa102bf88
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-early-xhr.html
@@ -0,0 +1,16 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Debugger test page</title>
+ <script>
+ fetch("doc-xhr.html").then(console.log);
+ </script>
+ </head>
+
+ <body></body>
+</html>
+
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-editor-scroll.html b/devtools/client/debugger/test/mochitest/examples/doc-editor-scroll.html
new file mode 100644
index 0000000000..e2992988e6
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-editor-scroll.html
@@ -0,0 +1,17 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Debugger test page</title>
+ </head>
+
+ <body>
+ <button onclick="doNamedEval()">Click me!</button>
+ <script src="simple1.js"></script>
+ <script src="long.js"></script>
+ <script src="frames.js"></script>
+ </body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-eval-throw.html b/devtools/client/debugger/test/mochitest/examples/doc-eval-throw.html
new file mode 100644
index 0000000000..2345369dc9
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-eval-throw.html
@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<meta charset=UTF-8>
+<script>
+function evaluateException() {
+ try {
+ eval("throw new Error()");
+ } catch (e) {}
+}
+</script>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-event-breakpoints-fission.html b/devtools/client/debugger/test/mochitest/examples/doc-event-breakpoints-fission.html
new file mode 100644
index 0000000000..ae40fc3c22
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-event-breakpoints-fission.html
@@ -0,0 +1,23 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Debugger event bp fission test page</title>
+ <script>
+ function reloadIframe() {
+ return new Promise(resolve => {
+ const iframe = document.querySelector("iframe");
+ iframe.addEventListener("load", () => resolve(), { once: true });
+ iframe.setAttribute("src", iframe.getAttribute("src"));
+ });
+ }
+ setTimeout(() => console.log("timeout fired"), 0)
+ </script>
+ </head>
+ <body>
+ <iframe src="https://example.org/browser/devtools/client/debugger/test/mochitest/examples/doc-event-breakpoints.html"></iframe>
+ </body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-event-breakpoints.html b/devtools/client/debugger/test/mochitest/examples/doc-event-breakpoints.html
new file mode 100644
index 0000000000..b8e6a9f6b8
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-event-breakpoints.html
@@ -0,0 +1,31 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Debugger event bp test page</title>
+ <style>
+ body {
+ height: 200vh;
+ }
+ </style>
+ </head>
+
+ <body>
+ <input type="text" id="focus-text" value="Text">
+ <button id="click-button">Run Click Handler</button>
+ <button id="xhr-button">Run XHR Handler</button>
+ <button id="timer-button">Run Timer Handler</button>
+ <button id="eval-button">Run Eval</button>
+ <div id="click-target" style="margin: 50px; background-color: green;">
+ Click Target
+ </div>
+ <button id="invoker" invoketarget="invokee">Invoke</button>
+ <div id="invokee"></div>
+ <button id="popover-toggle" popovertarget="popover">Show popover</button>
+ <div id="popover" popover>Popped!</div>
+ <script src="event-breakpoints.js"></script>
+ </body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-event-handler.html b/devtools/client/debugger/test/mochitest/examples/doc-event-handler.html
new file mode 100644
index 0000000000..928f4ef74c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-event-handler.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<meta charset=UTF-8>
+<script>
+function synthesizeClick() {
+const elem = document.getElementById("clicky");
+const event = new MouseEvent("click", {});
+elem.dispatchEvent(event);
+}
+</script>
+<span onclick="debugger" id="clicky">click me</span>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-exception-position.html b/devtools/client/debugger/test/mochitest/examples/doc-exception-position.html
new file mode 100644
index 0000000000..00f7cbcd75
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-exception-position.html
@@ -0,0 +1,13 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<html>
+ <head>
+ <title>Debugger test page</title>
+ <script type="text/javascript" src="exception-position-1.js"></script>
+ <script type="text/javascript" src="exception-position-2.js"></script>
+ <script type="text/javascript" src="exception-position-3.js"></script>
+ <script type="text/javascript" src="exception-position-4.js"></script>
+ </head>
+ <body></body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-exceptions-inline-script.html b/devtools/client/debugger/test/mochitest/examples/doc-exceptions-inline-script.html
new file mode 100644
index 0000000000..379a7fe688
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-exceptions-inline-script.html
@@ -0,0 +1,10 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<html>
+ <head>
+ <title>Debugger test page</title>
+ <script type="text/javascript">[].plop()</script>
+ </head>
+ <body></body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-exceptions.html b/devtools/client/debugger/test/mochitest/examples/doc-exceptions.html
new file mode 100644
index 0000000000..49ecc8e098
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-exceptions.html
@@ -0,0 +1,10 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<html>
+ <head>
+ <title>Debugger test page</title>
+ <script type="text/javascript" src="exceptions.js"></script>
+ </head>
+ <body></body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-frames-async.html b/devtools/client/debugger/test/mochitest/examples/doc-frames-async.html
new file mode 100644
index 0000000000..e17498ecfd
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-frames-async.html
@@ -0,0 +1,21 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<html>
+ <head>
+ <title>Frames</title>
+ </head>
+
+ <body>
+ <script>
+ async function sleep() {
+ await new Promise(r => setTimeout(r, 10));
+ debugger;
+ }
+
+ async function main() {
+ await sleep();
+ }
+ </script>
+ </body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-frames.html b/devtools/client/debugger/test/mochitest/examples/doc-frames.html
new file mode 100644
index 0000000000..e111f53e43
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-frames.html
@@ -0,0 +1,21 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<html>
+ <head>
+ <title>Frames</title>
+ </head>
+
+ <body>
+ <script>
+ debugger;
+
+ // This inline script allows this HTML page to show up as a
+ // source. It also needs to introduce a new global variable so
+ // it's not immediately garbage collected.
+ function inline_script() { var x = 5; }
+ </script>
+ <script type="text/javascript" src="frames.js"></script>
+ </body>
+
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-gc-breakpoint-positions.html b/devtools/client/debugger/test/mochitest/examples/doc-gc-breakpoint-positions.html
new file mode 100644
index 0000000000..aca36fc369
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-gc-breakpoint-positions.html
@@ -0,0 +1,23 @@
+<div>
+ Here
+ is
+ some
+ stuff
+ so
+ that
+ the
+ source's
+ start
+ line
+ is
+ not
+ one
+</div>
+<script>
+// Make sure the source stays alive.
+function foo() {
+}
+// After the outer script has been GC'ed, breakpoints can't be set here.
+var x = null;
+setTimeout(() => SpecialPowers.gc(), 0);
+</script>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-gc-sources.html b/devtools/client/debugger/test/mochitest/examples/doc-gc-sources.html
new file mode 100644
index 0000000000..183c34038b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-gc-sources.html
@@ -0,0 +1,26 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<!-- Note: This file contains \r\n newlines, so be careful to preserve them when editing. -->
+<div>
+ Here
+ is
+ some
+ stuff
+ so
+ that
+ the
+ source's
+ start
+ line
+ is
+ not
+ one
+</div>
+<ScRiPt type="text/javascript">
+// No breakpoint here.
+console.log("Hello World");
+</sCrIpT>
+<script src="collected-bundle.js"></script>
+<script src="collected-bundle2.js"></script>
+<script src="trigger-gc.js"></script>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-html-breakpoints.html b/devtools/client/debugger/test/mochitest/examples/doc-html-breakpoints.html
new file mode 100644
index 0000000000..98c9909173
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-html-breakpoints.html
@@ -0,0 +1,25 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<html>
+ <head>
+ <script>
+ function test1() {
+ console.log("test1");
+ }
+ </script>
+ <script src="simple2.js"></script>
+ <script src="sjs_slow-load.sjs?file=html-breakpoints-slow.js"></script>
+ <script>
+ function test3() {
+ console.log("test3");
+ }
+ </script>
+ <script>
+ function test4() {
+ console.log("test4");
+ }
+ </script>
+ <body>
+ </body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-idb-run-to-completion.html b/devtools/client/debugger/test/mochitest/examples/doc-idb-run-to-completion.html
new file mode 100644
index 0000000000..a18161f6ad
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-idb-run-to-completion.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+function test() {
+ var DBOpenRequest = window.indexedDB.open("toDoList", 5);
+ DBOpenRequest.onupgradeneeded = function(event) {
+ var db = DBOpenRequest.result;
+ db.createObjectStore("toDoList");
+ };
+
+ DBOpenRequest.onsuccess = function(event) {
+ var db = DBOpenRequest.result;
+ var transaction = db.transaction(["toDoList"], "readwrite");
+
+ // This will trigger the debugger's onNewScript which will save the
+ // microtask queue and perform one or more microtask checkpoints.
+ eval("var newScript;");
+
+ // If IDB transactions were processed by the debugger's microtask
+ // checkpoints then this store will throw an exception.
+ transaction.objectStore("toDoList");
+
+ debugger;
+ };
+}
+ </script>
+ </head>
+ <body>loading...</body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-iframes.html b/devtools/client/debugger/test/mochitest/examples/doc-iframes.html
new file mode 100644
index 0000000000..73f1be3f73
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-iframes.html
@@ -0,0 +1,20 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<html>
+ <head>
+ <title>Iframe</title>
+ </head>
+
+ <body>
+ <script>
+ debugger;
+ // This inline script allows this HTML page to show up as a
+ // source. It also needs to introduce a new global variable so
+ // it's not immediately garbage collected.
+ function inline_script() { var x = 5; }
+ </script>
+ <iframe src="doc-debugger-statements.html"></iframe>
+ </body>
+
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-inline-preview.html b/devtools/client/debugger/test/mochitest/examples/doc-inline-preview.html
new file mode 100644
index 0000000000..81d1deac23
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-inline-preview.html
@@ -0,0 +1,25 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Debugger Inline Preview</title>
+ </head>
+
+ <body>
+ <button onclick="onBtnClick(event)">Click me!</button>
+
+ <script src="inline-preview.js"></script>
+ <script type="module">
+ window.runInModule = function() {
+ bar(4);
+ }
+ function bar(val) {
+ console.log(val);
+ debugger;
+ }
+ </script>
+ </body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-inline-script-offset.html b/devtools/client/debugger/test/mochitest/examples/doc-inline-script-offset.html
new file mode 100644
index 0000000000..be0836c433
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-inline-script-offset.html
@@ -0,0 +1,15 @@
+<script>
+function f() {
+ return { g: () => {} };
+}
+</script>
+<!-- evaluate the same long script to slow down the page load and more easily cause race condition in inline script code -->
+<script src="long.js"></script><script src="long.js"></script><script src="long.js"></script><script src="long.js"></script>
+
+<script>
+function j() {
+ return 42;
+}
+</script>
+
+<span>Here is some random stuff</span><script>function z() { this.f().g() } z();</script>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-merge-scopes.html b/devtools/client/debugger/test/mochitest/examples/doc-merge-scopes.html
new file mode 100644
index 0000000000..905d4fdfc5
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-merge-scopes.html
@@ -0,0 +1,29 @@
+<script>
+function run() {
+ setTimeout(first);
+ setTimeout(second);
+ setTimeout(third);
+}
+
+function first(x) {
+ let y = 0;
+ var z = 1;
+ debugger;
+}
+
+function second(x) {
+ if (second) {
+ let y = 0;
+ debugger;
+ }
+}
+
+function third(x) {
+ let y = 1;
+ if (y) {
+ let z = 0;
+ var v = 2;
+ debugger;
+ }
+}
+</script>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-message-run-to-completion-frame.html b/devtools/client/debugger/test/mochitest/examples/doc-message-run-to-completion-frame.html
new file mode 100644
index 0000000000..471a3d1f92
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-message-run-to-completion-frame.html
@@ -0,0 +1 @@
+<span>HELLO</span>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-message-run-to-completion.html b/devtools/client/debugger/test/mochitest/examples/doc-message-run-to-completion.html
new file mode 100644
index 0000000000..db6aa0b0a0
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-message-run-to-completion.html
@@ -0,0 +1,19 @@
+<iframe id="iframe" src="doc-message-run-to-completion-frame.html"></iframe>
+<script>
+function test() {
+ var messageName = "test-message";
+
+ function handleMessage(event) {
+ // While paused here, the additional posted messages should not be delivered.
+ // The debugger should pause three times.
+ debugger;
+ }
+
+ window.addEventListener("message", handleMessage, true);
+ document.getElementById("iframe").contentWindow.addEventListener("message", handleMessage, true);
+
+ window.postMessage("first", "*");
+ document.getElementById("iframe").contentWindow.postMessage("second", "*");
+ window.postMessage("third", "*");
+}
+</script>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-minified.html b/devtools/client/debugger/test/mochitest/examples/doc-minified.html
new file mode 100644
index 0000000000..313eb0ba5f
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-minified.html
@@ -0,0 +1,20 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!doctype html>
+
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Debugger test page</title>
+ </head>
+
+ <body>
+ <script src="math.min.js"></script>
+ <script>
+ // This method will be called via invokeInTab.
+ function breakInNewFunction() {
+ new Function(`debugger;document.addEventListener("click", function(){debugger;})`)();
+ }</script>
+ </body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-minified2.html b/devtools/client/debugger/test/mochitest/examples/doc-minified2.html
new file mode 100644
index 0000000000..0a934ce523
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-minified2.html
@@ -0,0 +1,21 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!doctype html>
+
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Debugger test page</title>
+ <script src="sum/sum.min.js"></script>
+ </head>
+
+ <body>
+ <script>
+ function test() {
+ console.log(sum(40, 2));
+ }
+ </script>
+ <button onclick="test()">test</button>
+ </body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-module-worker.html b/devtools/client/debugger/test/mochitest/examples/doc-module-worker.html
new file mode 100644
index 0000000000..56bbeca921
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-module-worker.html
@@ -0,0 +1,10 @@
+<!DOCTYPE HTML>
+<html>
+<script>
+new Worker("data:text/javascript;charset=UTF-8,postMessage('HELLO')", {type: "module"});
+</script>
+<body>
+Hello World!
+</body>
+</html>
+
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-navigation-when-paused.html b/devtools/client/debugger/test/mochitest/examples/doc-navigation-when-paused.html
new file mode 100644
index 0000000000..2375a40b68
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-navigation-when-paused.html
@@ -0,0 +1,17 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<html>
+ <head>
+ <script>
+ window.onclick = () => {
+ Promise.resolve().then(() => {
+ throw new Error("Second");
+ });
+
+ throw new Error("First");
+ };
+ </script>
+ </head>
+ <body></body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-nested-worker.html b/devtools/client/debugger/test/mochitest/examples/doc-nested-worker.html
new file mode 100644
index 0000000000..8ea593098b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-nested-worker.html
@@ -0,0 +1,11 @@
+<!DOCTYPE HTML>
+<html>
+
+<script>
+var w = new Worker("outer-worker.js");
+</script>
+
+<body>
+Hello World!
+</body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-on-load.html b/devtools/client/debugger/test/mochitest/examples/doc-on-load.html
new file mode 100644
index 0000000000..d5114a5d23
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-on-load.html
@@ -0,0 +1,21 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Debugger test page</title>
+ </head>
+
+ <body>
+
+ <script src="top-level.js"></script>
+ <script>
+ // This inline script allows this HTML page to show up as a
+ // source. It also needs to introduce a new global variable so
+ // it's not immediately garbage collected.
+ inline_script = function () { var x = 5; };
+ </script>
+ </body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-pause-points.html b/devtools/client/debugger/test/mochitest/examples/doc-pause-points.html
new file mode 100644
index 0000000000..5967b0809e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-pause-points.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+ <head></head>
+ <body>
+ <header>
+ <h1>
+ Debugger Pause Points
+ </h1>
+ <button onclick="statements()">statements</button>
+ <button id="sequences" onclick="sequences()">sequences</button>
+ <button onclick="expressions()">expressions</button>
+ <button onclick="flow()">flow</button>
+ </header>
+ <script src="./pause-points.js"></script>
+ </body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-pretty-print-inline-scripts.html b/devtools/client/debugger/test/mochitest/examples/doc-pretty-print-inline-scripts.html
new file mode 100644
index 0000000000..de2144286d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-pretty-print-inline-scripts.html
@@ -0,0 +1,44 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!doctype html>
+
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Debugger test page</title>
+ <!-- Added to check we don't handle non js scripts -->
+ <script id="json-data" type="application/json">
+ { "foo": "bar" }
+ </script>
+
+ <!-- the unusual formatting is wanted to check inline scripts pretty printing -->
+ <script id="inline" type="application/javascript">
+
+
+
+ const userInfo = JSON.parse(document.getElementById("json-data").text); console.log("User information: %o", userInfo);
+ document.addEventListener("click", function onClick(e){console.log("in inline script");
+ // this is
+ // something
+ e.target;
+ });
+
+
+
+ </script>
+ </head>
+
+ <body>
+ <h1>Minified</h1>
+ <!-- Checking that having empty inline scripts doesn't throw off pretty printing -->
+ <script></script>
+ <!-- Single line "minified" script -->
+ <script id="minified" type="module">for (const x of [42]){ if(x > 0){console.log(x,"yay")} else {console.log(x,"booh")} }</script>
+ <!-- Multiple line "minified" script, with content on the first line -->
+ <script>{"use strict";document.querySelector("h1").addEventListener(
+ "mousedown", e => {console.log("mousedown on h1")})
+ }</script>
+ <hr><script>const x = {a:1, b:2};</script><hr><!-- multiple scripts on same line --><script>const y = [1,2,3];y.map(i => i*2)</script>
+ </body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-pretty.html b/devtools/client/debugger/test/mochitest/examples/doc-pretty.html
new file mode 100644
index 0000000000..99db330793
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-pretty.html
@@ -0,0 +1,14 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Test a file that changes when pretty printed</title>
+ </head>
+
+ <body>
+ <script src="./pretty.js"></script>
+ </body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-preview-getter.html b/devtools/client/debugger/test/mochitest/examples/doc-preview-getter.html
new file mode 100644
index 0000000000..a10085918e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-preview-getter.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Preview Getter</title>
+ </head>
+
+ <body>
+ <script src="preview-getter.js"></script>
+ </body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-preview.html b/devtools/client/debugger/test/mochitest/examples/doc-preview.html
new file mode 100644
index 0000000000..91c19ba0b5
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-preview.html
@@ -0,0 +1,27 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Debugger Preview</title>
+ </head>
+
+ <body>
+ <script src="preview.js"></script>
+ <script>
+
+ function testInline() {
+ const obj = {prop: 2}
+ obj?.prop
+ debugger;
+ }
+
+ // This inline script allows this HTML page to show up as a
+ // source. It also needs to introduce a new global variable so
+ // it's not immediately garbage collected.
+ inline_script = function () { var x = 5; };
+ </script>
+ </body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-react-jsx.html b/devtools/client/debugger/test/mochitest/examples/doc-react-jsx.html
new file mode 100644
index 0000000000..0740f284eb
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-react-jsx.html
@@ -0,0 +1,111 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<html>
+ <head>
+ <title>Iframe</title>
+ </head>
+
+ <body>
+ <script type="text/plain">
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports) {
+
+function foo() {
+ console.log("HELLO WORLD!");
+}
+
+window.foo = foo;
+
+
+/***/ })
+/******/ ]);
+//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAgOTJkOTBkNjA2OTAyNmRhZDBlNmIiLCJ3ZWJwYWNrOi8vLy4vc3JjL21haW4uanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxtQ0FBMkIsMEJBQTBCLEVBQUU7QUFDdkQseUNBQWlDLGVBQWU7QUFDaEQ7QUFDQTtBQUNBOztBQUVBO0FBQ0EsOERBQXNELCtEQUErRDs7QUFFckg7QUFDQTs7QUFFQTtBQUNBOzs7Ozs7OztBQzVEQTtBQUNBO0FBQ0E7O0FBRUEiLCJmaWxlIjoiYnVuZGxlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7XG4gXHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxuIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbiBcdFx0XHRcdGdldDogZ2V0dGVyXG4gXHRcdFx0fSk7XG4gXHRcdH1cbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cbiBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuIFx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18oX193ZWJwYWNrX3JlcXVpcmVfXy5zID0gMCk7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8gd2VicGFjay9ib290c3RyYXAgOTJkOTBkNjA2OTAyNmRhZDBlNmIiLCJcbmZ1bmN0aW9uIGZvbygpIHtcbiAgY29uc29sZS5sb2coXCJIRUxMTyBXT1JMRCFcIik7XG59XG5cbndpbmRvdy5mb28gPSBmb287XG5cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy9cbi8vIFdFQlBBQ0sgRk9PVEVSXG4vLyAuL3NyYy9tYWluLmpzXG4vLyBtb2R1bGUgaWQgPSAwXG4vLyBtb2R1bGUgY2h1bmtzID0gMCJdLCJzb3VyY2VSb290IjoiIn0=
+ </script>
+
+ <script>
+
+ function injectScript() {
+ const jsxScript = document.querySelector("script[type='text/plain']");
+
+ const text = "";
+ const newScript = document.createElement("script");
+
+ newScript.text = jsxScript.text;
+ document.body.appendChild(newScript);
+ }
+
+ // This inline script allows this HTML page to show up as a
+ // source. It also needs to introduce a new global variable so
+ // it's not immediately garbage collected.
+ function inline_script() { var x = 5; }
+ </script>
+ </body>
+
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-react.html b/devtools/client/debugger/test/mochitest/examples/doc-react.html
new file mode 100644
index 0000000000..ebb2b2f117
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-react.html
@@ -0,0 +1,10 @@
+<!doctype html>
+<html lang="en">
+ <head>
+ <title>React App</title>
+ </head>
+ <body>
+ <div id="root"></div>
+ <script type="text/javascript" src="react/build/main.js"></script>
+ </body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-reload-link.html b/devtools/client/debugger/test/mochitest/examples/doc-reload-link.html
new file mode 100644
index 0000000000..41c9ee9e57
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-reload-link.html
@@ -0,0 +1,5 @@
+<meta charset="UTF-8">
+<script>
+ dump("dump\n");
+</script>
+<a href="doc-reload-link.html">reload via link</a>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-remember-expanded-scopes.html b/devtools/client/debugger/test/mochitest/examples/doc-remember-expanded-scopes.html
new file mode 100644
index 0000000000..7648b1841c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-remember-expanded-scopes.html
@@ -0,0 +1,7 @@
+<script>
+function main() {
+ var object = { a:0, b:1, innerObject: { innerData: 0 } };
+ debugger;
+ return 0;
+}
+</script>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-return-values.html b/devtools/client/debugger/test/mochitest/examples/doc-return-values.html
new file mode 100644
index 0000000000..d7e5344b69
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-return-values.html
@@ -0,0 +1,50 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<html>
+ <head>
+ <title>Return Values</title>
+ </head>
+
+ <body>
+ <script>
+ function return_something(x) {
+ debugger;
+ return x;
+ }
+
+ function callee(x) {
+ throw x;
+ }
+
+ function throw_something(x) {
+ try {
+ callee(x);
+ } catch (e) {
+ // Ignore.
+ }
+ }
+ </script>
+
+ <h3>Returns</h3>
+ <button onclick="return_something(2)">return(2)</button>
+ <button onclick="return_something(new Error('blah'))">return(error)</button>
+ <button onclick="return_something(undefined)">return(undefined)</button>
+ <button onclick="return_something(false)">return(false)</button>
+ <button onclick="return_something(null)">return(null)</button>
+ <button onclick="return_something(0)">return(0)</button>
+ <button onclick="return_something('yay')">return('yay')</button>
+
+
+ <h3>Throws</h3>
+ <button onclick="throw_something(2)">throw(2)</button>
+ <button onclick="throw_something(new Error('blah'))">throw(error)</button>
+ <button onclick="throw_something(undefined)">throw(undefined)</button>
+ <button onclick="throw_something(false)">throw(false)</button>
+ <button onclick="throw_something(0)">throw(0)</button>
+ <button onclick="throw_something(null)">throw(null)</button>
+ <button onclick="throw_something('yay')">throw('yay')</button>
+
+ </body>
+
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-scopes-xrays.html b/devtools/client/debugger/test/mochitest/examples/doc-scopes-xrays.html
new file mode 100644
index 0000000000..80f986ffee
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-scopes-xrays.html
@@ -0,0 +1,11 @@
+<script>
+function start() {
+ var weak1 = { a: 2 }, weak2 = { a: 5 };
+
+ var set = new Set([{a: 1}]);
+ var weakset = new WeakSet([weak1]);
+ var map = new Map([[{a: 3},{a:4}]]);
+ var weakmap = new WeakMap([[weak2,{a:6}]]);
+ debugger;
+}
+</script>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-script-mutate.html b/devtools/client/debugger/test/mochitest/examples/doc-script-mutate.html
new file mode 100644
index 0000000000..b7f62bc3de
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-script-mutate.html
@@ -0,0 +1,18 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!doctype html>
+
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Debugger test page - Mutate object</title>
+ </head>
+
+ <body>
+ <button onclick="mutate()">Click me!</button>
+
+ <script type="text/javascript" src="script-mutate.js"></script>
+ </body>
+
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-script-switching.html b/devtools/client/debugger/test/mochitest/examples/doc-script-switching.html
new file mode 100644
index 0000000000..6e5a5fb1ad
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-script-switching.html
@@ -0,0 +1,19 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!doctype html>
+
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Debugger test page</title>
+ </head>
+
+ <body>
+ <button onclick="firstCall()">Click me!</button>
+
+ <script type="text/javascript" src="script-switching-01.js"></script>
+ <script type="text/javascript" src="script-switching-02.js"></script>
+ </body>
+
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-scripts-debugger.html b/devtools/client/debugger/test/mochitest/examples/doc-scripts-debugger.html
new file mode 100644
index 0000000000..c38cb932d5
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-scripts-debugger.html
@@ -0,0 +1,20 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Debugger test page</title>
+ </head>
+
+ <body>
+ <script>
+ debugger;
+ // This inline script allows this HTML page to show up as a
+ // source. It also needs to introduce a new global variable so
+ // it's not immediately garbage collected.
+ inline_script = function () { var x = 5; };
+ </script>
+ </body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-scripts.html b/devtools/client/debugger/test/mochitest/examples/doc-scripts.html
new file mode 100644
index 0000000000..e2c8b5346d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-scripts.html
@@ -0,0 +1,35 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Debugger test page</title>
+ </head>
+
+ <body>
+ <button onclick="simple()">Click me!</button>
+ <script src="simple1.js"></script>
+ <script src="simple2.js"></script>
+ <script src="simple3.js"></script>
+ <script src="long.js"></script>
+ <script>
+ // This inline script allows this HTML page to show up as a
+ // source. It also needs to introduce a new global variable so
+ // it's not immediately garbage collected.
+ inline_script = function () { var x = 5; };
+ inline_script();
+ </script>
+ <script>
+ // This is a second inline script element whose breakpoints won't be
+ // known until after the script element has been added.
+ var x = 3;
+ // XXX: This second inline script is only here to avoid intermittent
+ // failures on browser_dbg-breakpoints-reloading.js which occur when we
+ // try to set a breakpoint on the line `var x = 3;` above.
+ // See Bug 1592839.
+ inline_script2 = function () { var x = 5; };
+ </script>
+ </body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-scroll-run-to-completion.html b/devtools/client/debugger/test/mochitest/examples/doc-scroll-run-to-completion.html
new file mode 100644
index 0000000000..6cc7f123ab
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-scroll-run-to-completion.html
@@ -0,0 +1,27 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!DOCTYPE html>
+<meta charset=UTF-8>
+<body></body>
+<script>
+const cpmm = SpecialPowers.Services.cpmm;
+var result;
+
+for (var i = 0; i < 100; i++) {
+var div = document.createElement("div");
+div.innerHTML = "Hello World!";
+document.body.insertBefore(div, document.body.firstChild);
+}
+
+async function pauseOnce() {
+ window.addEventListener('scroll', done);
+ result = "test failed";
+ debugger;
+ result = "test passed";
+}
+
+function done() {
+ cpmm.sendAsyncMessage(result);
+}
+</script>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-service-workers.html b/devtools/client/debugger/test/mochitest/examples/doc-service-workers.html
new file mode 100644
index 0000000000..2e43aafded
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-service-workers.html
@@ -0,0 +1,33 @@
+<script>
+async function registerWorker() {
+ const sw = navigator.serviceWorker;
+ const swr = await sw.register("service-worker.sjs", { scope: "" });
+ dump(`Registered, scope is: ${swr.scope}\n`);
+
+ await new Promise(resolve => {
+ const worker = swr.installing || swr.waiting || swr.active;
+ if (worker.state === 'activated') {
+ return resolve();
+ }
+
+ worker.addEventListener('statechange', () => {
+ if (worker.state === 'activated') {
+ return resolve();
+ }
+ });
+ });
+}
+
+async function fetchFromWorker() {
+ const response = await fetch("whatever");
+ const text = await response.text();
+ console.log(`Response ${text}`);
+}
+
+async function registerAndFetchFromWorker() {
+ await registerWorker();
+ await fetchFromWorker();
+}
+
+fetchFromWorker();
+</script>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-slow-script.html b/devtools/client/debugger/test/mochitest/examples/doc-slow-script.html
new file mode 100644
index 0000000000..b09d75adaf
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-slow-script.html
@@ -0,0 +1,18 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Test page with an infinite loop</title>
+ </head>
+
+ <body>
+ <script>
+ function infiniteLoop() {
+ while(true) {}
+ }
+ </script>
+ </body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-source-pragma.html b/devtools/client/debugger/test/mochitest/examples/doc-source-pragma.html
new file mode 100644
index 0000000000..6b6f98941c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-source-pragma.html
@@ -0,0 +1,7 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="UTF-8" />
+ <script src="source-pragma.js"></script>
+ </head>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-sourceURL-breakpoint.html b/devtools/client/debugger/test/mochitest/examples/doc-sourceURL-breakpoint.html
new file mode 100644
index 0000000000..9d39bdf180
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-sourceURL-breakpoint.html
@@ -0,0 +1,9 @@
+<body>
+<script>
+var script = `function foo() {
+ console.log('called foo');
+ }
+ //# sourceURL=my-foo.js`;
+eval(script);
+</script>
+</body>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-sourcemap-bogus.html b/devtools/client/debugger/test/mochitest/examples/doc-sourcemap-bogus.html
new file mode 100644
index 0000000000..3f420b5be2
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-sourcemap-bogus.html
@@ -0,0 +1,16 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Debugger test page</title>
+ </head>
+
+ <body>
+ <script src="non-existant-map.js"></script>
+ <script src="map-with-failed-original-request.js"></script>
+ <script src="invalid-json-map.js"></script>
+ </body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-sourcemapped.html b/devtools/client/debugger/test/mochitest/examples/doc-sourcemapped.html
new file mode 100644
index 0000000000..b51b8b55f4
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-sourcemapped.html
@@ -0,0 +1,574 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="UTF-8">
+ <script src="sourcemapped/polyfill-bundle.js"></script>
+ </head>
+ <body>
+ <!-- INJECTED-START -->
+ <!--
+ Content generated by examples/sourcemapped/build.js.
+ Run "yarn build" to update.
+ -->
+ <h2>parcel</h2>
+ <script src="sourcemapped/output/parcel/babel-bindings-with-flow.js"></script>
+ <button onclick="parcelBabelBindingsWithFlow()">Run babel-bindings-with-flow</button>
+ <script src="sourcemapped/output/parcel/babel-classes.js"></script>
+ <button onclick="parcelBabelClasses()">Run babel-classes</button>
+ <script src="sourcemapped/output/parcel/babel-flowtype-bindings.js"></script>
+ <button onclick="parcelBabelFlowtypeBindings()">Run babel-flowtype-bindings</button>
+ <script src="sourcemapped/output/parcel/classes.js"></script>
+ <button onclick="parcelClasses()">Run classes</button>
+ <script src="sourcemapped/output/parcel/esmodules.js"></script>
+ <button onclick="parcelEsmodules()">Run esmodules</button>
+ <script src="sourcemapped/output/parcel/esmodules-cjs.js"></script>
+ <button onclick="parcelEsmodulesCjs()">Run esmodules-cjs</button>
+ <script src="sourcemapped/output/parcel/esmodules-es6.js"></script>
+ <button onclick="parcelEsmodulesEs6()">Run esmodules-es6</button>
+ <script src="sourcemapped/output/parcel/eval-maps.js"></script>
+ <button onclick="parcelEvalMaps()">Run eval-maps</button>
+ <script src="sourcemapped/output/parcel/for-loops.js"></script>
+ <button onclick="parcelForLoops()">Run for-loops</button>
+ <script src="sourcemapped/output/parcel/for-of.js"></script>
+ <button onclick="parcelForOf()">Run for-of</button>
+ <script src="sourcemapped/output/parcel/functions.js"></script>
+ <button onclick="parcelFunctions()">Run functions</button>
+ <script src="sourcemapped/output/parcel/lex-and-nonlex.js"></script>
+ <button onclick="parcelLexAndNonlex()">Run lex-and-nonlex</button>
+ <script src="sourcemapped/output/parcel/line-start-bindings-es6.js"></script>
+ <button onclick="parcelLineStartBindingsEs6()">Run line-start-bindings-es6</button>
+ <script src="sourcemapped/output/parcel/modules-cjs.js"></script>
+ <button onclick="parcelModulesCjs()">Run modules-cjs</button>
+ <script src="sourcemapped/output/parcel/out-of-order-declarations-cjs.js"></script>
+ <button onclick="parcelOutOfOrderDeclarationsCjs()">Run out-of-order-declarations-cjs</button>
+ <script src="sourcemapped/output/parcel/shadowed-vars.js"></script>
+ <button onclick="parcelShadowedVars()">Run shadowed-vars</button>
+ <script src="sourcemapped/output/parcel/step-over-for-of.js"></script>
+ <button onclick="parcelStepOverForOf()">Run step-over-for-of</button>
+ <script src="sourcemapped/output/parcel/step-over-for-of-array.js"></script>
+ <button onclick="parcelStepOverForOfArray()">Run step-over-for-of-array</button>
+ <script src="sourcemapped/output/parcel/step-over-for-of-array-closure.js"></script>
+ <button onclick="parcelStepOverForOfArrayClosure()">Run step-over-for-of-array-closure</button>
+ <script src="sourcemapped/output/parcel/step-over-for-of-closure.js"></script>
+ <button onclick="parcelStepOverForOfClosure()">Run step-over-for-of-closure</button>
+ <script src="sourcemapped/output/parcel/step-over-function-params.js"></script>
+ <button onclick="parcelStepOverFunctionParams()">Run step-over-function-params</button>
+ <script src="sourcemapped/output/parcel/step-over-regenerator-await.js"></script>
+ <button onclick="parcelStepOverRegeneratorAwait()">Run step-over-regenerator-await</button>
+ <script src="sourcemapped/output/parcel/switches.js"></script>
+ <button onclick="parcelSwitches()">Run switches</button>
+ <script src="sourcemapped/output/parcel/this-arguments-bindings.js"></script>
+ <button onclick="parcelThisArgumentsBindings()">Run this-arguments-bindings</button>
+ <script src="sourcemapped/output/parcel/try-catches.js"></script>
+ <button onclick="parcelTryCatches()">Run try-catches</button>
+ <script src="sourcemapped/output/parcel/type-module.js"></script>
+ <button onclick="parcelTypeModule()">Run type-module</button>
+ <script src="sourcemapped/output/parcel/type-script-cjs.js"></script>
+ <button onclick="parcelTypeScriptCjs()">Run type-script-cjs</button>
+ <script src="sourcemapped/output/parcel/typescript-classes.js"></script>
+ <button onclick="parcelTypescriptClasses()">Run typescript-classes</button>
+ <script src="sourcemapped/output/parcel/webpack-functions.js"></script>
+ <button onclick="parcelWebpackFunctions()">Run webpack-functions</button>
+ <script src="sourcemapped/output/parcel/webpack-line-mappings.js"></script>
+ <button onclick="parcelWebpackLineMappings()">Run webpack-line-mappings</button>
+ <h2>webpack3</h2>
+ <script src="sourcemapped/output/webpack3/classes.js"></script>
+ <button onclick="webpack3Classes()">Run classes</button>
+ <script src="sourcemapped/output/webpack3/esmodules.js"></script>
+ <button onclick="webpack3Esmodules()">Run esmodules</button>
+ <script src="sourcemapped/output/webpack3/esmodules-cjs.js"></script>
+ <button onclick="webpack3EsmodulesCjs()">Run esmodules-cjs</button>
+ <script src="sourcemapped/output/webpack3/esmodules-es6.js"></script>
+ <button onclick="webpack3EsmodulesEs6()">Run esmodules-es6</button>
+ <script src="sourcemapped/output/webpack3/eval-maps.js"></script>
+ <button onclick="webpack3EvalMaps()">Run eval-maps</button>
+ <script src="sourcemapped/output/webpack3/for-loops.js"></script>
+ <button onclick="webpack3ForLoops()">Run for-loops</button>
+ <script src="sourcemapped/output/webpack3/for-of.js"></script>
+ <button onclick="webpack3ForOf()">Run for-of</button>
+ <script src="sourcemapped/output/webpack3/functions.js"></script>
+ <button onclick="webpack3Functions()">Run functions</button>
+ <script src="sourcemapped/output/webpack3/lex-and-nonlex.js"></script>
+ <button onclick="webpack3LexAndNonlex()">Run lex-and-nonlex</button>
+ <script src="sourcemapped/output/webpack3/line-start-bindings-es6.js"></script>
+ <button onclick="webpack3LineStartBindingsEs6()">Run line-start-bindings-es6</button>
+ <script src="sourcemapped/output/webpack3/modules-cjs.js"></script>
+ <button onclick="webpack3ModulesCjs()">Run modules-cjs</button>
+ <script src="sourcemapped/output/webpack3/out-of-order-declarations-cjs.js"></script>
+ <button onclick="webpack3OutOfOrderDeclarationsCjs()">Run out-of-order-declarations-cjs</button>
+ <script src="sourcemapped/output/webpack3/shadowed-vars.js"></script>
+ <button onclick="webpack3ShadowedVars()">Run shadowed-vars</button>
+ <script src="sourcemapped/output/webpack3/step-over-for-of.js"></script>
+ <button onclick="webpack3StepOverForOf()">Run step-over-for-of</button>
+ <script src="sourcemapped/output/webpack3/step-over-for-of-array.js"></script>
+ <button onclick="webpack3StepOverForOfArray()">Run step-over-for-of-array</button>
+ <script src="sourcemapped/output/webpack3/step-over-for-of-array-closure.js"></script>
+ <button onclick="webpack3StepOverForOfArrayClosure()">Run step-over-for-of-array-closure</button>
+ <script src="sourcemapped/output/webpack3/step-over-for-of-closure.js"></script>
+ <button onclick="webpack3StepOverForOfClosure()">Run step-over-for-of-closure</button>
+ <script src="sourcemapped/output/webpack3/step-over-function-params.js"></script>
+ <button onclick="webpack3StepOverFunctionParams()">Run step-over-function-params</button>
+ <script src="sourcemapped/output/webpack3/step-over-regenerator-await.js"></script>
+ <button onclick="webpack3StepOverRegeneratorAwait()">Run step-over-regenerator-await</button>
+ <script src="sourcemapped/output/webpack3/switches.js"></script>
+ <button onclick="webpack3Switches()">Run switches</button>
+ <script src="sourcemapped/output/webpack3/this-arguments-bindings.js"></script>
+ <button onclick="webpack3ThisArgumentsBindings()">Run this-arguments-bindings</button>
+ <script src="sourcemapped/output/webpack3/try-catches.js"></script>
+ <button onclick="webpack3TryCatches()">Run try-catches</button>
+ <script src="sourcemapped/output/webpack3/type-module.js"></script>
+ <button onclick="webpack3TypeModule()">Run type-module</button>
+ <script src="sourcemapped/output/webpack3/type-script-cjs.js"></script>
+ <button onclick="webpack3TypeScriptCjs()">Run type-script-cjs</button>
+ <script src="sourcemapped/output/webpack3/typescript-classes.js"></script>
+ <button onclick="webpack3TypescriptClasses()">Run typescript-classes</button>
+ <script src="sourcemapped/output/webpack3/webpack-functions.js"></script>
+ <button onclick="webpack3WebpackFunctions()">Run webpack-functions</button>
+ <script src="sourcemapped/output/webpack3/webpack-line-mappings.js"></script>
+ <button onclick="webpack3WebpackLineMappings()">Run webpack-line-mappings</button>
+ <h2>webpack3-babel6</h2>
+ <script src="sourcemapped/output/webpack3-babel6/babel-bindings-with-flow.js"></script>
+ <button onclick="webpack3Babel6BabelBindingsWithFlow()">Run babel-bindings-with-flow</button>
+ <script src="sourcemapped/output/webpack3-babel6/babel-classes.js"></script>
+ <button onclick="webpack3Babel6BabelClasses()">Run babel-classes</button>
+ <script src="sourcemapped/output/webpack3-babel6/babel-flowtype-bindings.js"></script>
+ <button onclick="webpack3Babel6BabelFlowtypeBindings()">Run babel-flowtype-bindings</button>
+ <script src="sourcemapped/output/webpack3-babel6/classes.js"></script>
+ <button onclick="webpack3Babel6Classes()">Run classes</button>
+ <script src="sourcemapped/output/webpack3-babel6/esmodules.js"></script>
+ <button onclick="webpack3Babel6Esmodules()">Run esmodules</button>
+ <script src="sourcemapped/output/webpack3-babel6/esmodules-cjs.js"></script>
+ <button onclick="webpack3Babel6EsmodulesCjs()">Run esmodules-cjs</button>
+ <script src="sourcemapped/output/webpack3-babel6/esmodules-es6.js"></script>
+ <button onclick="webpack3Babel6EsmodulesEs6()">Run esmodules-es6</button>
+ <script src="sourcemapped/output/webpack3-babel6/eval-maps.js"></script>
+ <button onclick="webpack3Babel6EvalMaps()">Run eval-maps</button>
+ <script src="sourcemapped/output/webpack3-babel6/for-loops.js"></script>
+ <button onclick="webpack3Babel6ForLoops()">Run for-loops</button>
+ <script src="sourcemapped/output/webpack3-babel6/for-of.js"></script>
+ <button onclick="webpack3Babel6ForOf()">Run for-of</button>
+ <script src="sourcemapped/output/webpack3-babel6/functions.js"></script>
+ <button onclick="webpack3Babel6Functions()">Run functions</button>
+ <script src="sourcemapped/output/webpack3-babel6/lex-and-nonlex.js"></script>
+ <button onclick="webpack3Babel6LexAndNonlex()">Run lex-and-nonlex</button>
+ <script src="sourcemapped/output/webpack3-babel6/line-start-bindings-es6.js"></script>
+ <button onclick="webpack3Babel6LineStartBindingsEs6()">Run line-start-bindings-es6</button>
+ <script src="sourcemapped/output/webpack3-babel6/modules-cjs.js"></script>
+ <button onclick="webpack3Babel6ModulesCjs()">Run modules-cjs</button>
+ <script src="sourcemapped/output/webpack3-babel6/out-of-order-declarations-cjs.js"></script>
+ <button onclick="webpack3Babel6OutOfOrderDeclarationsCjs()">Run out-of-order-declarations-cjs</button>
+ <script src="sourcemapped/output/webpack3-babel6/shadowed-vars.js"></script>
+ <button onclick="webpack3Babel6ShadowedVars()">Run shadowed-vars</button>
+ <script src="sourcemapped/output/webpack3-babel6/step-over-for-of.js"></script>
+ <button onclick="webpack3Babel6StepOverForOf()">Run step-over-for-of</button>
+ <script src="sourcemapped/output/webpack3-babel6/step-over-for-of-array.js"></script>
+ <button onclick="webpack3Babel6StepOverForOfArray()">Run step-over-for-of-array</button>
+ <script src="sourcemapped/output/webpack3-babel6/step-over-for-of-array-closure.js"></script>
+ <button onclick="webpack3Babel6StepOverForOfArrayClosure()">Run step-over-for-of-array-closure</button>
+ <script src="sourcemapped/output/webpack3-babel6/step-over-for-of-closure.js"></script>
+ <button onclick="webpack3Babel6StepOverForOfClosure()">Run step-over-for-of-closure</button>
+ <script src="sourcemapped/output/webpack3-babel6/step-over-function-params.js"></script>
+ <button onclick="webpack3Babel6StepOverFunctionParams()">Run step-over-function-params</button>
+ <script src="sourcemapped/output/webpack3-babel6/step-over-regenerator-await.js"></script>
+ <button onclick="webpack3Babel6StepOverRegeneratorAwait()">Run step-over-regenerator-await</button>
+ <script src="sourcemapped/output/webpack3-babel6/switches.js"></script>
+ <button onclick="webpack3Babel6Switches()">Run switches</button>
+ <script src="sourcemapped/output/webpack3-babel6/this-arguments-bindings.js"></script>
+ <button onclick="webpack3Babel6ThisArgumentsBindings()">Run this-arguments-bindings</button>
+ <script src="sourcemapped/output/webpack3-babel6/try-catches.js"></script>
+ <button onclick="webpack3Babel6TryCatches()">Run try-catches</button>
+ <script src="sourcemapped/output/webpack3-babel6/type-module.js"></script>
+ <button onclick="webpack3Babel6TypeModule()">Run type-module</button>
+ <script src="sourcemapped/output/webpack3-babel6/type-script-cjs.js"></script>
+ <button onclick="webpack3Babel6TypeScriptCjs()">Run type-script-cjs</button>
+ <script src="sourcemapped/output/webpack3-babel6/webpack-functions.js"></script>
+ <button onclick="webpack3Babel6WebpackFunctions()">Run webpack-functions</button>
+ <script src="sourcemapped/output/webpack3-babel6/webpack-line-mappings.js"></script>
+ <button onclick="webpack3Babel6WebpackLineMappings()">Run webpack-line-mappings</button>
+ <h2>webpack3-babel7</h2>
+ <script src="sourcemapped/output/webpack3-babel7/babel-bindings-with-flow.js"></script>
+ <button onclick="webpack3Babel7BabelBindingsWithFlow()">Run babel-bindings-with-flow</button>
+ <script src="sourcemapped/output/webpack3-babel7/babel-classes.js"></script>
+ <button onclick="webpack3Babel7BabelClasses()">Run babel-classes</button>
+ <script src="sourcemapped/output/webpack3-babel7/babel-flowtype-bindings.js"></script>
+ <button onclick="webpack3Babel7BabelFlowtypeBindings()">Run babel-flowtype-bindings</button>
+ <script src="sourcemapped/output/webpack3-babel7/classes.js"></script>
+ <button onclick="webpack3Babel7Classes()">Run classes</button>
+ <script src="sourcemapped/output/webpack3-babel7/esmodules.js"></script>
+ <button onclick="webpack3Babel7Esmodules()">Run esmodules</button>
+ <script src="sourcemapped/output/webpack3-babel7/esmodules-cjs.js"></script>
+ <button onclick="webpack3Babel7EsmodulesCjs()">Run esmodules-cjs</button>
+ <script src="sourcemapped/output/webpack3-babel7/esmodules-es6.js"></script>
+ <button onclick="webpack3Babel7EsmodulesEs6()">Run esmodules-es6</button>
+ <script src="sourcemapped/output/webpack3-babel7/eval-maps.js"></script>
+ <button onclick="webpack3Babel7EvalMaps()">Run eval-maps</button>
+ <script src="sourcemapped/output/webpack3-babel7/for-loops.js"></script>
+ <button onclick="webpack3Babel7ForLoops()">Run for-loops</button>
+ <script src="sourcemapped/output/webpack3-babel7/for-of.js"></script>
+ <button onclick="webpack3Babel7ForOf()">Run for-of</button>
+ <script src="sourcemapped/output/webpack3-babel7/functions.js"></script>
+ <button onclick="webpack3Babel7Functions()">Run functions</button>
+ <script src="sourcemapped/output/webpack3-babel7/lex-and-nonlex.js"></script>
+ <button onclick="webpack3Babel7LexAndNonlex()">Run lex-and-nonlex</button>
+ <script src="sourcemapped/output/webpack3-babel7/line-start-bindings-es6.js"></script>
+ <button onclick="webpack3Babel7LineStartBindingsEs6()">Run line-start-bindings-es6</button>
+ <script src="sourcemapped/output/webpack3-babel7/modules-cjs.js"></script>
+ <button onclick="webpack3Babel7ModulesCjs()">Run modules-cjs</button>
+ <script src="sourcemapped/output/webpack3-babel7/out-of-order-declarations-cjs.js"></script>
+ <button onclick="webpack3Babel7OutOfOrderDeclarationsCjs()">Run out-of-order-declarations-cjs</button>
+ <script src="sourcemapped/output/webpack3-babel7/shadowed-vars.js"></script>
+ <button onclick="webpack3Babel7ShadowedVars()">Run shadowed-vars</button>
+ <script src="sourcemapped/output/webpack3-babel7/step-over-for-of.js"></script>
+ <button onclick="webpack3Babel7StepOverForOf()">Run step-over-for-of</button>
+ <script src="sourcemapped/output/webpack3-babel7/step-over-for-of-array.js"></script>
+ <button onclick="webpack3Babel7StepOverForOfArray()">Run step-over-for-of-array</button>
+ <script src="sourcemapped/output/webpack3-babel7/step-over-for-of-array-closure.js"></script>
+ <button onclick="webpack3Babel7StepOverForOfArrayClosure()">Run step-over-for-of-array-closure</button>
+ <script src="sourcemapped/output/webpack3-babel7/step-over-for-of-closure.js"></script>
+ <button onclick="webpack3Babel7StepOverForOfClosure()">Run step-over-for-of-closure</button>
+ <script src="sourcemapped/output/webpack3-babel7/step-over-function-params.js"></script>
+ <button onclick="webpack3Babel7StepOverFunctionParams()">Run step-over-function-params</button>
+ <script src="sourcemapped/output/webpack3-babel7/step-over-regenerator-await.js"></script>
+ <button onclick="webpack3Babel7StepOverRegeneratorAwait()">Run step-over-regenerator-await</button>
+ <script src="sourcemapped/output/webpack3-babel7/switches.js"></script>
+ <button onclick="webpack3Babel7Switches()">Run switches</button>
+ <script src="sourcemapped/output/webpack3-babel7/this-arguments-bindings.js"></script>
+ <button onclick="webpack3Babel7ThisArgumentsBindings()">Run this-arguments-bindings</button>
+ <script src="sourcemapped/output/webpack3-babel7/try-catches.js"></script>
+ <button onclick="webpack3Babel7TryCatches()">Run try-catches</button>
+ <script src="sourcemapped/output/webpack3-babel7/type-module.js"></script>
+ <button onclick="webpack3Babel7TypeModule()">Run type-module</button>
+ <script src="sourcemapped/output/webpack3-babel7/type-script-cjs.js"></script>
+ <button onclick="webpack3Babel7TypeScriptCjs()">Run type-script-cjs</button>
+ <script src="sourcemapped/output/webpack3-babel7/webpack-functions.js"></script>
+ <button onclick="webpack3Babel7WebpackFunctions()">Run webpack-functions</button>
+ <script src="sourcemapped/output/webpack3-babel7/webpack-line-mappings.js"></script>
+ <button onclick="webpack3Babel7WebpackLineMappings()">Run webpack-line-mappings</button>
+ <h2>webpack4</h2>
+ <script src="sourcemapped/output/webpack4/classes.js"></script>
+ <button onclick="webpack4Classes()">Run classes</button>
+ <script src="sourcemapped/output/webpack4/esmodules.js"></script>
+ <button onclick="webpack4Esmodules()">Run esmodules</button>
+ <script src="sourcemapped/output/webpack4/esmodules-cjs.js"></script>
+ <button onclick="webpack4EsmodulesCjs()">Run esmodules-cjs</button>
+ <script src="sourcemapped/output/webpack4/esmodules-es6.js"></script>
+ <button onclick="webpack4EsmodulesEs6()">Run esmodules-es6</button>
+ <script src="sourcemapped/output/webpack4/eval-maps.js"></script>
+ <button onclick="webpack4EvalMaps()">Run eval-maps</button>
+ <script src="sourcemapped/output/webpack4/for-loops.js"></script>
+ <button onclick="webpack4ForLoops()">Run for-loops</button>
+ <script src="sourcemapped/output/webpack4/for-of.js"></script>
+ <button onclick="webpack4ForOf()">Run for-of</button>
+ <script src="sourcemapped/output/webpack4/functions.js"></script>
+ <button onclick="webpack4Functions()">Run functions</button>
+ <script src="sourcemapped/output/webpack4/lex-and-nonlex.js"></script>
+ <button onclick="webpack4LexAndNonlex()">Run lex-and-nonlex</button>
+ <script src="sourcemapped/output/webpack4/line-start-bindings-es6.js"></script>
+ <button onclick="webpack4LineStartBindingsEs6()">Run line-start-bindings-es6</button>
+ <script src="sourcemapped/output/webpack4/modules-cjs.js"></script>
+ <button onclick="webpack4ModulesCjs()">Run modules-cjs</button>
+ <script src="sourcemapped/output/webpack4/out-of-order-declarations-cjs.js"></script>
+ <button onclick="webpack4OutOfOrderDeclarationsCjs()">Run out-of-order-declarations-cjs</button>
+ <script src="sourcemapped/output/webpack4/shadowed-vars.js"></script>
+ <button onclick="webpack4ShadowedVars()">Run shadowed-vars</button>
+ <script src="sourcemapped/output/webpack4/step-over-for-of.js"></script>
+ <button onclick="webpack4StepOverForOf()">Run step-over-for-of</button>
+ <script src="sourcemapped/output/webpack4/step-over-for-of-array.js"></script>
+ <button onclick="webpack4StepOverForOfArray()">Run step-over-for-of-array</button>
+ <script src="sourcemapped/output/webpack4/step-over-for-of-array-closure.js"></script>
+ <button onclick="webpack4StepOverForOfArrayClosure()">Run step-over-for-of-array-closure</button>
+ <script src="sourcemapped/output/webpack4/step-over-for-of-closure.js"></script>
+ <button onclick="webpack4StepOverForOfClosure()">Run step-over-for-of-closure</button>
+ <script src="sourcemapped/output/webpack4/step-over-function-params.js"></script>
+ <button onclick="webpack4StepOverFunctionParams()">Run step-over-function-params</button>
+ <script src="sourcemapped/output/webpack4/step-over-regenerator-await.js"></script>
+ <button onclick="webpack4StepOverRegeneratorAwait()">Run step-over-regenerator-await</button>
+ <script src="sourcemapped/output/webpack4/switches.js"></script>
+ <button onclick="webpack4Switches()">Run switches</button>
+ <script src="sourcemapped/output/webpack4/this-arguments-bindings.js"></script>
+ <button onclick="webpack4ThisArgumentsBindings()">Run this-arguments-bindings</button>
+ <script src="sourcemapped/output/webpack4/try-catches.js"></script>
+ <button onclick="webpack4TryCatches()">Run try-catches</button>
+ <script src="sourcemapped/output/webpack4/type-module.js"></script>
+ <button onclick="webpack4TypeModule()">Run type-module</button>
+ <script src="sourcemapped/output/webpack4/type-script-cjs.js"></script>
+ <button onclick="webpack4TypeScriptCjs()">Run type-script-cjs</button>
+ <script src="sourcemapped/output/webpack4/typescript-classes.js"></script>
+ <button onclick="webpack4TypescriptClasses()">Run typescript-classes</button>
+ <script src="sourcemapped/output/webpack4/webpack-functions.js"></script>
+ <button onclick="webpack4WebpackFunctions()">Run webpack-functions</button>
+ <script src="sourcemapped/output/webpack4/webpack-line-mappings.js"></script>
+ <button onclick="webpack4WebpackLineMappings()">Run webpack-line-mappings</button>
+ <h2>webpack4-babel6</h2>
+ <script src="sourcemapped/output/webpack4-babel6/babel-bindings-with-flow.js"></script>
+ <button onclick="webpack4Babel6BabelBindingsWithFlow()">Run babel-bindings-with-flow</button>
+ <script src="sourcemapped/output/webpack4-babel6/babel-classes.js"></script>
+ <button onclick="webpack4Babel6BabelClasses()">Run babel-classes</button>
+ <script src="sourcemapped/output/webpack4-babel6/babel-flowtype-bindings.js"></script>
+ <button onclick="webpack4Babel6BabelFlowtypeBindings()">Run babel-flowtype-bindings</button>
+ <script src="sourcemapped/output/webpack4-babel6/classes.js"></script>
+ <button onclick="webpack4Babel6Classes()">Run classes</button>
+ <script src="sourcemapped/output/webpack4-babel6/esmodules.js"></script>
+ <button onclick="webpack4Babel6Esmodules()">Run esmodules</button>
+ <script src="sourcemapped/output/webpack4-babel6/esmodules-cjs.js"></script>
+ <button onclick="webpack4Babel6EsmodulesCjs()">Run esmodules-cjs</button>
+ <script src="sourcemapped/output/webpack4-babel6/esmodules-es6.js"></script>
+ <button onclick="webpack4Babel6EsmodulesEs6()">Run esmodules-es6</button>
+ <script src="sourcemapped/output/webpack4-babel6/eval-maps.js"></script>
+ <button onclick="webpack4Babel6EvalMaps()">Run eval-maps</button>
+ <script src="sourcemapped/output/webpack4-babel6/for-loops.js"></script>
+ <button onclick="webpack4Babel6ForLoops()">Run for-loops</button>
+ <script src="sourcemapped/output/webpack4-babel6/for-of.js"></script>
+ <button onclick="webpack4Babel6ForOf()">Run for-of</button>
+ <script src="sourcemapped/output/webpack4-babel6/functions.js"></script>
+ <button onclick="webpack4Babel6Functions()">Run functions</button>
+ <script src="sourcemapped/output/webpack4-babel6/lex-and-nonlex.js"></script>
+ <button onclick="webpack4Babel6LexAndNonlex()">Run lex-and-nonlex</button>
+ <script src="sourcemapped/output/webpack4-babel6/line-start-bindings-es6.js"></script>
+ <button onclick="webpack4Babel6LineStartBindingsEs6()">Run line-start-bindings-es6</button>
+ <script src="sourcemapped/output/webpack4-babel6/modules-cjs.js"></script>
+ <button onclick="webpack4Babel6ModulesCjs()">Run modules-cjs</button>
+ <script src="sourcemapped/output/webpack4-babel6/out-of-order-declarations-cjs.js"></script>
+ <button onclick="webpack4Babel6OutOfOrderDeclarationsCjs()">Run out-of-order-declarations-cjs</button>
+ <script src="sourcemapped/output/webpack4-babel6/shadowed-vars.js"></script>
+ <button onclick="webpack4Babel6ShadowedVars()">Run shadowed-vars</button>
+ <script src="sourcemapped/output/webpack4-babel6/step-over-for-of.js"></script>
+ <button onclick="webpack4Babel6StepOverForOf()">Run step-over-for-of</button>
+ <script src="sourcemapped/output/webpack4-babel6/step-over-for-of-array.js"></script>
+ <button onclick="webpack4Babel6StepOverForOfArray()">Run step-over-for-of-array</button>
+ <script src="sourcemapped/output/webpack4-babel6/step-over-for-of-array-closure.js"></script>
+ <button onclick="webpack4Babel6StepOverForOfArrayClosure()">Run step-over-for-of-array-closure</button>
+ <script src="sourcemapped/output/webpack4-babel6/step-over-for-of-closure.js"></script>
+ <button onclick="webpack4Babel6StepOverForOfClosure()">Run step-over-for-of-closure</button>
+ <script src="sourcemapped/output/webpack4-babel6/step-over-function-params.js"></script>
+ <button onclick="webpack4Babel6StepOverFunctionParams()">Run step-over-function-params</button>
+ <script src="sourcemapped/output/webpack4-babel6/step-over-regenerator-await.js"></script>
+ <button onclick="webpack4Babel6StepOverRegeneratorAwait()">Run step-over-regenerator-await</button>
+ <script src="sourcemapped/output/webpack4-babel6/switches.js"></script>
+ <button onclick="webpack4Babel6Switches()">Run switches</button>
+ <script src="sourcemapped/output/webpack4-babel6/this-arguments-bindings.js"></script>
+ <button onclick="webpack4Babel6ThisArgumentsBindings()">Run this-arguments-bindings</button>
+ <script src="sourcemapped/output/webpack4-babel6/try-catches.js"></script>
+ <button onclick="webpack4Babel6TryCatches()">Run try-catches</button>
+ <script src="sourcemapped/output/webpack4-babel6/type-module.js"></script>
+ <button onclick="webpack4Babel6TypeModule()">Run type-module</button>
+ <script src="sourcemapped/output/webpack4-babel6/type-script-cjs.js"></script>
+ <button onclick="webpack4Babel6TypeScriptCjs()">Run type-script-cjs</button>
+ <script src="sourcemapped/output/webpack4-babel6/webpack-functions.js"></script>
+ <button onclick="webpack4Babel6WebpackFunctions()">Run webpack-functions</button>
+ <script src="sourcemapped/output/webpack4-babel6/webpack-line-mappings.js"></script>
+ <button onclick="webpack4Babel6WebpackLineMappings()">Run webpack-line-mappings</button>
+ <h2>webpack4-babel7</h2>
+ <script src="sourcemapped/output/webpack4-babel7/babel-bindings-with-flow.js"></script>
+ <button onclick="webpack4Babel7BabelBindingsWithFlow()">Run babel-bindings-with-flow</button>
+ <script src="sourcemapped/output/webpack4-babel7/babel-classes.js"></script>
+ <button onclick="webpack4Babel7BabelClasses()">Run babel-classes</button>
+ <script src="sourcemapped/output/webpack4-babel7/babel-flowtype-bindings.js"></script>
+ <button onclick="webpack4Babel7BabelFlowtypeBindings()">Run babel-flowtype-bindings</button>
+ <script src="sourcemapped/output/webpack4-babel7/classes.js"></script>
+ <button onclick="webpack4Babel7Classes()">Run classes</button>
+ <script src="sourcemapped/output/webpack4-babel7/esmodules.js"></script>
+ <button onclick="webpack4Babel7Esmodules()">Run esmodules</button>
+ <script src="sourcemapped/output/webpack4-babel7/esmodules-cjs.js"></script>
+ <button onclick="webpack4Babel7EsmodulesCjs()">Run esmodules-cjs</button>
+ <script src="sourcemapped/output/webpack4-babel7/esmodules-es6.js"></script>
+ <button onclick="webpack4Babel7EsmodulesEs6()">Run esmodules-es6</button>
+ <script src="sourcemapped/output/webpack4-babel7/eval-maps.js"></script>
+ <button onclick="webpack4Babel7EvalMaps()">Run eval-maps</button>
+ <script src="sourcemapped/output/webpack4-babel7/for-loops.js"></script>
+ <button onclick="webpack4Babel7ForLoops()">Run for-loops</button>
+ <script src="sourcemapped/output/webpack4-babel7/for-of.js"></script>
+ <button onclick="webpack4Babel7ForOf()">Run for-of</button>
+ <script src="sourcemapped/output/webpack4-babel7/functions.js"></script>
+ <button onclick="webpack4Babel7Functions()">Run functions</button>
+ <script src="sourcemapped/output/webpack4-babel7/lex-and-nonlex.js"></script>
+ <button onclick="webpack4Babel7LexAndNonlex()">Run lex-and-nonlex</button>
+ <script src="sourcemapped/output/webpack4-babel7/line-start-bindings-es6.js"></script>
+ <button onclick="webpack4Babel7LineStartBindingsEs6()">Run line-start-bindings-es6</button>
+ <script src="sourcemapped/output/webpack4-babel7/modules-cjs.js"></script>
+ <button onclick="webpack4Babel7ModulesCjs()">Run modules-cjs</button>
+ <script src="sourcemapped/output/webpack4-babel7/out-of-order-declarations-cjs.js"></script>
+ <button onclick="webpack4Babel7OutOfOrderDeclarationsCjs()">Run out-of-order-declarations-cjs</button>
+ <script src="sourcemapped/output/webpack4-babel7/shadowed-vars.js"></script>
+ <button onclick="webpack4Babel7ShadowedVars()">Run shadowed-vars</button>
+ <script src="sourcemapped/output/webpack4-babel7/step-over-for-of.js"></script>
+ <button onclick="webpack4Babel7StepOverForOf()">Run step-over-for-of</button>
+ <script src="sourcemapped/output/webpack4-babel7/step-over-for-of-array.js"></script>
+ <button onclick="webpack4Babel7StepOverForOfArray()">Run step-over-for-of-array</button>
+ <script src="sourcemapped/output/webpack4-babel7/step-over-for-of-array-closure.js"></script>
+ <button onclick="webpack4Babel7StepOverForOfArrayClosure()">Run step-over-for-of-array-closure</button>
+ <script src="sourcemapped/output/webpack4-babel7/step-over-for-of-closure.js"></script>
+ <button onclick="webpack4Babel7StepOverForOfClosure()">Run step-over-for-of-closure</button>
+ <script src="sourcemapped/output/webpack4-babel7/step-over-function-params.js"></script>
+ <button onclick="webpack4Babel7StepOverFunctionParams()">Run step-over-function-params</button>
+ <script src="sourcemapped/output/webpack4-babel7/step-over-regenerator-await.js"></script>
+ <button onclick="webpack4Babel7StepOverRegeneratorAwait()">Run step-over-regenerator-await</button>
+ <script src="sourcemapped/output/webpack4-babel7/switches.js"></script>
+ <button onclick="webpack4Babel7Switches()">Run switches</button>
+ <script src="sourcemapped/output/webpack4-babel7/this-arguments-bindings.js"></script>
+ <button onclick="webpack4Babel7ThisArgumentsBindings()">Run this-arguments-bindings</button>
+ <script src="sourcemapped/output/webpack4-babel7/try-catches.js"></script>
+ <button onclick="webpack4Babel7TryCatches()">Run try-catches</button>
+ <script src="sourcemapped/output/webpack4-babel7/type-module.js"></script>
+ <button onclick="webpack4Babel7TypeModule()">Run type-module</button>
+ <script src="sourcemapped/output/webpack4-babel7/type-script-cjs.js"></script>
+ <button onclick="webpack4Babel7TypeScriptCjs()">Run type-script-cjs</button>
+ <script src="sourcemapped/output/webpack4-babel7/webpack-functions.js"></script>
+ <button onclick="webpack4Babel7WebpackFunctions()">Run webpack-functions</button>
+ <script src="sourcemapped/output/webpack4-babel7/webpack-line-mappings.js"></script>
+ <button onclick="webpack4Babel7WebpackLineMappings()">Run webpack-line-mappings</button>
+ <h2>rollup</h2>
+ <script src="sourcemapped/output/rollup/classes.js"></script>
+ <button onclick="rollupClasses()">Run classes</button>
+ <script src="sourcemapped/output/rollup/esmodules.js"></script>
+ <button onclick="rollupEsmodules()">Run esmodules</button>
+ <script src="sourcemapped/output/rollup/esmodules-es6.js"></script>
+ <button onclick="rollupEsmodulesEs6()">Run esmodules-es6</button>
+ <script src="sourcemapped/output/rollup/eval-maps.js"></script>
+ <button onclick="rollupEvalMaps()">Run eval-maps</button>
+ <script src="sourcemapped/output/rollup/for-loops.js"></script>
+ <button onclick="rollupForLoops()">Run for-loops</button>
+ <script src="sourcemapped/output/rollup/for-of.js"></script>
+ <button onclick="rollupForOf()">Run for-of</button>
+ <script src="sourcemapped/output/rollup/functions.js"></script>
+ <button onclick="rollupFunctions()">Run functions</button>
+ <script src="sourcemapped/output/rollup/lex-and-nonlex.js"></script>
+ <button onclick="rollupLexAndNonlex()">Run lex-and-nonlex</button>
+ <script src="sourcemapped/output/rollup/line-start-bindings-es6.js"></script>
+ <button onclick="rollupLineStartBindingsEs6()">Run line-start-bindings-es6</button>
+ <script src="sourcemapped/output/rollup/shadowed-vars.js"></script>
+ <button onclick="rollupShadowedVars()">Run shadowed-vars</button>
+ <script src="sourcemapped/output/rollup/step-over-for-of.js"></script>
+ <button onclick="rollupStepOverForOf()">Run step-over-for-of</button>
+ <script src="sourcemapped/output/rollup/step-over-for-of-array.js"></script>
+ <button onclick="rollupStepOverForOfArray()">Run step-over-for-of-array</button>
+ <script src="sourcemapped/output/rollup/step-over-for-of-array-closure.js"></script>
+ <button onclick="rollupStepOverForOfArrayClosure()">Run step-over-for-of-array-closure</button>
+ <script src="sourcemapped/output/rollup/step-over-for-of-closure.js"></script>
+ <button onclick="rollupStepOverForOfClosure()">Run step-over-for-of-closure</button>
+ <script src="sourcemapped/output/rollup/step-over-function-params.js"></script>
+ <button onclick="rollupStepOverFunctionParams()">Run step-over-function-params</button>
+ <script src="sourcemapped/output/rollup/step-over-regenerator-await.js"></script>
+ <button onclick="rollupStepOverRegeneratorAwait()">Run step-over-regenerator-await</button>
+ <script src="sourcemapped/output/rollup/switches.js"></script>
+ <button onclick="rollupSwitches()">Run switches</button>
+ <script src="sourcemapped/output/rollup/this-arguments-bindings.js"></script>
+ <button onclick="rollupThisArgumentsBindings()">Run this-arguments-bindings</button>
+ <script src="sourcemapped/output/rollup/try-catches.js"></script>
+ <button onclick="rollupTryCatches()">Run try-catches</button>
+ <script src="sourcemapped/output/rollup/type-module.js"></script>
+ <button onclick="rollupTypeModule()">Run type-module</button>
+ <script src="sourcemapped/output/rollup/typescript-classes.js"></script>
+ <button onclick="rollupTypescriptClasses()">Run typescript-classes</button>
+ <script src="sourcemapped/output/rollup/webpack-functions.js"></script>
+ <button onclick="rollupWebpackFunctions()">Run webpack-functions</button>
+ <script src="sourcemapped/output/rollup/webpack-line-mappings.js"></script>
+ <button onclick="rollupWebpackLineMappings()">Run webpack-line-mappings</button>
+ <h2>rollup-babel6</h2>
+ <script src="sourcemapped/output/rollup-babel6/babel-bindings-with-flow.js"></script>
+ <button onclick="rollupBabel6BabelBindingsWithFlow()">Run babel-bindings-with-flow</button>
+ <script src="sourcemapped/output/rollup-babel6/babel-classes.js"></script>
+ <button onclick="rollupBabel6BabelClasses()">Run babel-classes</button>
+ <script src="sourcemapped/output/rollup-babel6/babel-flowtype-bindings.js"></script>
+ <button onclick="rollupBabel6BabelFlowtypeBindings()">Run babel-flowtype-bindings</button>
+ <script src="sourcemapped/output/rollup-babel6/classes.js"></script>
+ <button onclick="rollupBabel6Classes()">Run classes</button>
+ <script src="sourcemapped/output/rollup-babel6/esmodules.js"></script>
+ <button onclick="rollupBabel6Esmodules()">Run esmodules</button>
+ <script src="sourcemapped/output/rollup-babel6/esmodules-es6.js"></script>
+ <button onclick="rollupBabel6EsmodulesEs6()">Run esmodules-es6</button>
+ <script src="sourcemapped/output/rollup-babel6/eval-maps.js"></script>
+ <button onclick="rollupBabel6EvalMaps()">Run eval-maps</button>
+ <script src="sourcemapped/output/rollup-babel6/for-loops.js"></script>
+ <button onclick="rollupBabel6ForLoops()">Run for-loops</button>
+ <script src="sourcemapped/output/rollup-babel6/for-of.js"></script>
+ <button onclick="rollupBabel6ForOf()">Run for-of</button>
+ <script src="sourcemapped/output/rollup-babel6/functions.js"></script>
+ <button onclick="rollupBabel6Functions()">Run functions</button>
+ <script src="sourcemapped/output/rollup-babel6/lex-and-nonlex.js"></script>
+ <button onclick="rollupBabel6LexAndNonlex()">Run lex-and-nonlex</button>
+ <script src="sourcemapped/output/rollup-babel6/line-start-bindings-es6.js"></script>
+ <button onclick="rollupBabel6LineStartBindingsEs6()">Run line-start-bindings-es6</button>
+ <script src="sourcemapped/output/rollup-babel6/shadowed-vars.js"></script>
+ <button onclick="rollupBabel6ShadowedVars()">Run shadowed-vars</button>
+ <script src="sourcemapped/output/rollup-babel6/step-over-for-of.js"></script>
+ <button onclick="rollupBabel6StepOverForOf()">Run step-over-for-of</button>
+ <script src="sourcemapped/output/rollup-babel6/step-over-for-of-array.js"></script>
+ <button onclick="rollupBabel6StepOverForOfArray()">Run step-over-for-of-array</button>
+ <script src="sourcemapped/output/rollup-babel6/step-over-for-of-array-closure.js"></script>
+ <button onclick="rollupBabel6StepOverForOfArrayClosure()">Run step-over-for-of-array-closure</button>
+ <script src="sourcemapped/output/rollup-babel6/step-over-for-of-closure.js"></script>
+ <button onclick="rollupBabel6StepOverForOfClosure()">Run step-over-for-of-closure</button>
+ <script src="sourcemapped/output/rollup-babel6/step-over-function-params.js"></script>
+ <button onclick="rollupBabel6StepOverFunctionParams()">Run step-over-function-params</button>
+ <script src="sourcemapped/output/rollup-babel6/step-over-regenerator-await.js"></script>
+ <button onclick="rollupBabel6StepOverRegeneratorAwait()">Run step-over-regenerator-await</button>
+ <script src="sourcemapped/output/rollup-babel6/switches.js"></script>
+ <button onclick="rollupBabel6Switches()">Run switches</button>
+ <script src="sourcemapped/output/rollup-babel6/this-arguments-bindings.js"></script>
+ <button onclick="rollupBabel6ThisArgumentsBindings()">Run this-arguments-bindings</button>
+ <script src="sourcemapped/output/rollup-babel6/try-catches.js"></script>
+ <button onclick="rollupBabel6TryCatches()">Run try-catches</button>
+ <script src="sourcemapped/output/rollup-babel6/type-module.js"></script>
+ <button onclick="rollupBabel6TypeModule()">Run type-module</button>
+ <script src="sourcemapped/output/rollup-babel6/webpack-functions.js"></script>
+ <button onclick="rollupBabel6WebpackFunctions()">Run webpack-functions</button>
+ <script src="sourcemapped/output/rollup-babel6/webpack-line-mappings.js"></script>
+ <button onclick="rollupBabel6WebpackLineMappings()">Run webpack-line-mappings</button>
+ <h2>rollup-babel7</h2>
+ <script src="sourcemapped/output/rollup-babel7/babel-bindings-with-flow.js"></script>
+ <button onclick="rollupBabel7BabelBindingsWithFlow()">Run babel-bindings-with-flow</button>
+ <script src="sourcemapped/output/rollup-babel7/babel-classes.js"></script>
+ <button onclick="rollupBabel7BabelClasses()">Run babel-classes</button>
+ <script src="sourcemapped/output/rollup-babel7/babel-flowtype-bindings.js"></script>
+ <button onclick="rollupBabel7BabelFlowtypeBindings()">Run babel-flowtype-bindings</button>
+ <script src="sourcemapped/output/rollup-babel7/classes.js"></script>
+ <button onclick="rollupBabel7Classes()">Run classes</button>
+ <script src="sourcemapped/output/rollup-babel7/esmodules.js"></script>
+ <button onclick="rollupBabel7Esmodules()">Run esmodules</button>
+ <script src="sourcemapped/output/rollup-babel7/esmodules-es6.js"></script>
+ <button onclick="rollupBabel7EsmodulesEs6()">Run esmodules-es6</button>
+ <script src="sourcemapped/output/rollup-babel7/eval-maps.js"></script>
+ <button onclick="rollupBabel7EvalMaps()">Run eval-maps</button>
+ <script src="sourcemapped/output/rollup-babel7/for-loops.js"></script>
+ <button onclick="rollupBabel7ForLoops()">Run for-loops</button>
+ <script src="sourcemapped/output/rollup-babel7/for-of.js"></script>
+ <button onclick="rollupBabel7ForOf()">Run for-of</button>
+ <script src="sourcemapped/output/rollup-babel7/functions.js"></script>
+ <button onclick="rollupBabel7Functions()">Run functions</button>
+ <script src="sourcemapped/output/rollup-babel7/lex-and-nonlex.js"></script>
+ <button onclick="rollupBabel7LexAndNonlex()">Run lex-and-nonlex</button>
+ <script src="sourcemapped/output/rollup-babel7/line-start-bindings-es6.js"></script>
+ <button onclick="rollupBabel7LineStartBindingsEs6()">Run line-start-bindings-es6</button>
+ <script src="sourcemapped/output/rollup-babel7/shadowed-vars.js"></script>
+ <button onclick="rollupBabel7ShadowedVars()">Run shadowed-vars</button>
+ <script src="sourcemapped/output/rollup-babel7/step-over-for-of.js"></script>
+ <button onclick="rollupBabel7StepOverForOf()">Run step-over-for-of</button>
+ <script src="sourcemapped/output/rollup-babel7/step-over-for-of-array.js"></script>
+ <button onclick="rollupBabel7StepOverForOfArray()">Run step-over-for-of-array</button>
+ <script src="sourcemapped/output/rollup-babel7/step-over-for-of-array-closure.js"></script>
+ <button onclick="rollupBabel7StepOverForOfArrayClosure()">Run step-over-for-of-array-closure</button>
+ <script src="sourcemapped/output/rollup-babel7/step-over-for-of-closure.js"></script>
+ <button onclick="rollupBabel7StepOverForOfClosure()">Run step-over-for-of-closure</button>
+ <script src="sourcemapped/output/rollup-babel7/step-over-function-params.js"></script>
+ <button onclick="rollupBabel7StepOverFunctionParams()">Run step-over-function-params</button>
+ <script src="sourcemapped/output/rollup-babel7/step-over-regenerator-await.js"></script>
+ <button onclick="rollupBabel7StepOverRegeneratorAwait()">Run step-over-regenerator-await</button>
+ <script src="sourcemapped/output/rollup-babel7/switches.js"></script>
+ <button onclick="rollupBabel7Switches()">Run switches</button>
+ <script src="sourcemapped/output/rollup-babel7/this-arguments-bindings.js"></script>
+ <button onclick="rollupBabel7ThisArgumentsBindings()">Run this-arguments-bindings</button>
+ <script src="sourcemapped/output/rollup-babel7/try-catches.js"></script>
+ <button onclick="rollupBabel7TryCatches()">Run try-catches</button>
+ <script src="sourcemapped/output/rollup-babel7/type-module.js"></script>
+ <button onclick="rollupBabel7TypeModule()">Run type-module</button>
+ <script src="sourcemapped/output/rollup-babel7/webpack-functions.js"></script>
+ <button onclick="rollupBabel7WebpackFunctions()">Run webpack-functions</button>
+ <script src="sourcemapped/output/rollup-babel7/webpack-line-mappings.js"></script>
+ <button onclick="rollupBabel7WebpackLineMappings()">Run webpack-line-mappings</button>
+ <!-- INJECTED-END -->
+ </body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-sourcemaps-ignorelist.html b/devtools/client/debugger/test/mochitest/examples/doc-sourcemaps-ignorelist.html
new file mode 100644
index 0000000000..d5cd2804ba
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-sourcemaps-ignorelist.html
@@ -0,0 +1,14 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Debugger test page</title>
+ </head>
+
+ <body>
+ <script src="sourcemaps-with-ignorelist/bundle.js"></script>
+ </body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-sourcemaps-indexed.html b/devtools/client/debugger/test/mochitest/examples/doc-sourcemaps-indexed.html
new file mode 100644
index 0000000000..2bb943ad9e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-sourcemaps-indexed.html
@@ -0,0 +1,21 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="UTF-8">
+ </head>
+
+<body>
+
+ <section id="example">
+ <input id="message" type="text" name="submitButton" value="" />
+ <input id="log-message" type="button" name="submitButton" value="Log message!" />
+ </section>
+
+ <script type="text/javascript" src="sourcemaps-indexed/main.min.js"></script>
+
+</body>
+
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-sourcemaps.html b/devtools/client/debugger/test/mochitest/examples/doc-sourcemaps.html
new file mode 100644
index 0000000000..a71641f3d7
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-sourcemaps.html
@@ -0,0 +1,15 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Debugger test page</title>
+ </head>
+
+ <body>
+ <script src="sourcemaps/bundle.js"></script>
+ <script src="sourcemaps-with-sections/xbundle.js"></script>
+ </body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-sourcemaps2.html b/devtools/client/debugger/test/mochitest/examples/doc-sourcemaps2.html
new file mode 100644
index 0000000000..4a4937a839
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-sourcemaps2.html
@@ -0,0 +1,21 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="UTF-8">
+ </head>
+
+<body>
+
+ <section id="example">
+ <input id ="message" type="text" name="submitButton" value="" />
+ <input id ="log-message" type="button" name="submitButton" value="Log message!" />
+ </section>
+
+ <script type="text/javascript" src="sourcemaps2/main.min.js"></script>
+
+</body>
+
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-sourcemaps3.html b/devtools/client/debugger/test/mochitest/examples/doc-sourcemaps3.html
new file mode 100644
index 0000000000..393947c663
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-sourcemaps3.html
@@ -0,0 +1,16 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="UTF-8">
+ </head>
+
+<body>
+
+ <script type="text/javascript" src="sourcemaps3/bundle.js"></script>
+ <button onclick="test()">Test</button>
+</body>
+
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-sources.html b/devtools/client/debugger/test/mochitest/examples/doc-sources.html
new file mode 100644
index 0000000000..cf661abf31
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-sources.html
@@ -0,0 +1,25 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Debugger test page</title>
+ </head>
+
+ <body>
+ <script src="simple1.js"></script>
+ <script src="simple2.js"></script>
+ <script src="long.js"></script>
+ <script>
+ function loadScript() {
+ const script = document.createElement("script");
+ script.src = "math.min.js";
+ document.body.appendChild(script);
+ }
+ </script>
+ <script src="nested/nested-source.js"></script>
+ <script src="nested/deeper/deeper-source.js"></script>
+ </body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-step-in-uninitialized.html b/devtools/client/debugger/test/mochitest/examples/doc-step-in-uninitialized.html
new file mode 100644
index 0000000000..7f0e6a56a5
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-step-in-uninitialized.html
@@ -0,0 +1,11 @@
+<script>
+function main() {
+ debugger;
+ foo();
+}
+function foo() {
+ let x;
+ let y = 3;
+ return 0;
+}
+</script>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-strict.html b/devtools/client/debugger/test/mochitest/examples/doc-strict.html
new file mode 100644
index 0000000000..c322d3b248
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-strict.html
@@ -0,0 +1,21 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <title>Debugger test page</title>
+ </head>
+
+ <body>
+ <script>
+ function strict(a) {
+ "use strict";
+ var b = 2;
+ debugger;
+ return 3;
+ }
+ </script>
+ </body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-wasm-sourcemaps.html b/devtools/client/debugger/test/mochitest/examples/doc-wasm-sourcemaps.html
new file mode 100644
index 0000000000..6e66065151
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-wasm-sourcemaps.html
@@ -0,0 +1,23 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Wasm+sourcemaps</title>
+ <script>
+ // Immediately load the WASM file
+ const wasmInstancePromise = WebAssembly.instantiateStreaming(fetch("wasm-sourcemaps/fib.wasm"));
+
+ async function runWasm() {
+ const { instance } = await wasmInstancePromise;
+ const result = instance .exports.fib(5);
+ return result;
+ }
+ </script>
+ </head>
+
+ <body>
+ </body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-watchpoints.html b/devtools/client/debugger/test/mochitest/examples/doc-watchpoints.html
new file mode 100644
index 0000000000..eb21d7c8f4
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-watchpoints.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html>
+ <script>
+ function getB(obj) {
+ debugger;
+ obj.b;
+ }
+ </script>
+ <script>
+ const obj = { a: { b: 2, c: 3 }, b: 2 };
+ debugger;
+ obj.b = 3;
+
+ obj.a.b = 3;
+ obj.a.b = 4;
+
+ console.log(obj.b);
+ obj.b = 4;
+ obj.b;
+ obj.b;
+ debugger;
+
+ getB(obj);
+ debugger;
+ obj.b;
+ </script>
+
+ <body>
+ Hello World!
+ </body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-windowless-workers-early-breakpoint.html b/devtools/client/debugger/test/mochitest/examples/doc-windowless-workers-early-breakpoint.html
new file mode 100644
index 0000000000..cb4936a150
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-windowless-workers-early-breakpoint.html
@@ -0,0 +1,19 @@
+<!DOCTYPE HTML>
+<html>
+
+<script>
+startWorker();
+
+function startWorker() {
+ new Worker("simple-worker.js");
+}
+function startWorkerWithMessage() {
+ var w = new Worker("simple-worker.js");
+ w.postMessage({yo: 'yo'})
+}
+</script>
+
+<body>
+Hello World!
+</body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-windowless-workers.html b/devtools/client/debugger/test/mochitest/examples/doc-windowless-workers.html
new file mode 100644
index 0000000000..8349260875
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-windowless-workers.html
@@ -0,0 +1,25 @@
+<!DOCTYPE HTML>
+<html>
+
+<script>
+var worker1 = new Worker("simple-worker.js");
+var worker2 = new Worker("simple-worker.js");
+
+var count = 0;
+function timer() {
+ var n = ++count;
+ console.log("MAIN THREAD SAYS HELLO! " + n);
+}
+
+setInterval(timer, 1000);
+
+window.sayHello = () => {
+ worker1.postMessage({yo: 'yo 1'})
+ worker2.postMessage({yo: 'yo 2'})
+}
+</script>
+
+<body>
+Hello World!
+</body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-worker-exception.html b/devtools/client/debugger/test/mochitest/examples/doc-worker-exception.html
new file mode 100644
index 0000000000..5bd4ca136c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-worker-exception.html
@@ -0,0 +1,10 @@
+<script>
+var worker;
+window.startWorker = () => {
+ worker = new Worker("worker-exception.js");
+}
+
+window.messageWorker = () => {
+ worker.postMessage({yo: 'yo'});
+}
+</script>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-worker-scopes.html b/devtools/client/debugger/test/mochitest/examples/doc-worker-scopes.html
new file mode 100644
index 0000000000..2e1f3c4376
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-worker-scopes.html
@@ -0,0 +1,15 @@
+<!DOCTYPE HTML>
+<html>
+
+<script>
+startWorker();
+
+function startWorker() {
+ w = new Worker("scopes-worker.js");
+}
+</script>
+
+<body>
+Hello World!
+</body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-xhr-run-to-completion.html b/devtools/client/debugger/test/mochitest/examples/doc-xhr-run-to-completion.html
new file mode 100644
index 0000000000..d22c73bbb6
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-xhr-run-to-completion.html
@@ -0,0 +1,41 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!DOCTYPE html>
+<meta charset=UTF-8>
+<script>
+const cpmm = SpecialPowers.Services.cpmm;
+var result;
+
+function newXHR() {
+ var xhr = new XMLHttpRequest();
+ xhr.open('GET', 'doc-xhr-run-to-completion.html', true);
+ xhr.onload = done;
+ xhr.onerror = done;
+ xhr.onreadystatechange = done;
+ xhr.ontimeout = done;
+ xhr.send();
+}
+
+function singleRequest() {
+ result = "test failed";
+ newXHR();
+ debugger;
+ result = "test passed";
+}
+
+function multipleRequests() {
+ result = "test failed";
+ newXHR();
+ newXHR();
+ debugger;
+ newXHR();
+ debugger;
+ debugger;
+ result = "test passed";
+}
+
+function done() {
+ cpmm.sendAsyncMessage(result);
+}
+</script>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc-xhr.html b/devtools/client/debugger/test/mochitest/examples/doc-xhr.html
new file mode 100644
index 0000000000..9f69c026b6
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc-xhr.html
@@ -0,0 +1,14 @@
+ <!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Debugger test page</title>
+ </head>
+
+ <body>
+ <script src="fetch.js"></script>
+ </body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc_dbg-custom-formatters.html b/devtools/client/debugger/test/mochitest/examples/doc_dbg-custom-formatters.html
new file mode 100644
index 0000000000..d7ddb97d4e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc_dbg-custom-formatters.html
@@ -0,0 +1,31 @@
+
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8"/>
+ <title>Debugger custom formatters test page</title>
+ </head>
+ <body>
+ <p>Custom formatters test page</p>
+ <script>
+ "use strict";
+
+ window.devtoolsFormatters = [
+ {
+ header: obj => {
+ if (obj.hasOwnProperty("customFormatHeaderAndBody")) {
+ return ["span", {"style": "font-style: italic;"}, "CUSTOM"];
+ }
+ return null;
+ },
+ hasBody: obj => true,
+ body: obj => ["span", {"style": "font-family: serif; font-size: 2rem;"}, obj.customFormatHeaderAndBody]
+ }];
+
+ function pauseWithCustomFormattedObject() {
+ const xyz = {customFormatHeaderAndBody: "customFormattedBody"};
+ debugger;
+ }
+ </script>
+ </body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc_dbg-fission-frame-pause-exceptions.html b/devtools/client/debugger/test/mochitest/examples/doc_dbg-fission-frame-pause-exceptions.html
new file mode 100644
index 0000000000..b29818c7b7
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc_dbg-fission-frame-pause-exceptions.html
@@ -0,0 +1,20 @@
+<!-- Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ -->
+<!doctype html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8">
+ <title>Test pause on exceptions in remote frame</title>
+ </head>
+ <body>
+ <h2>Test pause on exceptions in remote frame (Child frame)</h2>
+ <script type="text/javascript">
+ try {
+ adf();
+ } catch (err) {
+ console.error(err);
+ }
+ adf();
+ </script>
+ </body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc_dbg-fission-frame-sources-frame.html b/devtools/client/debugger/test/mochitest/examples/doc_dbg-fission-frame-sources-frame.html
new file mode 100644
index 0000000000..8ef82449e6
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc_dbg-fission-frame-sources-frame.html
@@ -0,0 +1,12 @@
+<!-- Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ -->
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <title>Test remote frame sources</title>
+</head>
+<body>
+ <script src="simple2.js"></script>
+</body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc_dbg-fission-frame-sources.html b/devtools/client/debugger/test/mochitest/examples/doc_dbg-fission-frame-sources.html
new file mode 100644
index 0000000000..2bb3acff6e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc_dbg-fission-frame-sources.html
@@ -0,0 +1,13 @@
+<!-- Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ -->
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <title>Test remote frame sources</title>
+</head>
+<body>
+ <iframe src='https://example.org/browser/devtools/client/debugger/test/mochitest/examples/doc_dbg-fission-frame-sources-frame.html'></iframe>
+ <script src="simple1.js"></script>
+</body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc_dbg-fission-pause-exceptions.html b/devtools/client/debugger/test/mochitest/examples/doc_dbg-fission-pause-exceptions.html
new file mode 100644
index 0000000000..d54121c925
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc_dbg-fission-pause-exceptions.html
@@ -0,0 +1,13 @@
+<!-- Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ -->
+<!doctype html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8">
+ <title>Test pause on exceptions in remote frames</title>
+ </head>
+ <body>
+ <h2>Test pause on exceptions in remote frames (Top level)</h2>
+ <iframe src='https://example.org/browser/devtools/client/debugger/test/mochitest/examples/doc_dbg-fission-frame-pause-exceptions.html'></iframe>
+ </body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/doc_dbg-same-source-distinct-threads-frame.html b/devtools/client/debugger/test/mochitest/examples/doc_dbg-same-source-distinct-threads-frame.html
new file mode 100644
index 0000000000..2620ee5edb
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc_dbg-same-source-distinct-threads-frame.html
@@ -0,0 +1,13 @@
+<!-- Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ -->
+<!doctype html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8">
+ <title>Iframe test page</title>
+ </head>
+ <body>
+ <script type="text/javascript" src='https://example.com/browser/devtools/client/debugger/test/mochitest/examples/same-script.js'></script>
+ </body>
+</html>
+
diff --git a/devtools/client/debugger/test/mochitest/examples/doc_dbg-same-source-distinct-threads.html b/devtools/client/debugger/test/mochitest/examples/doc_dbg-same-source-distinct-threads.html
new file mode 100644
index 0000000000..0a704d9278
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/doc_dbg-same-source-distinct-threads.html
@@ -0,0 +1,21 @@
+<!-- Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ -->
+<!doctype html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8">
+ <title>Top level test page</title>
+ <script src="same-script.js"></script>
+ </head>
+ <body>
+ <iframe src='https://example.org/browser/devtools/client/debugger/test/mochitest/examples/doc_dbg-same-source-distinct-threads-frame.html'></iframe>
+ <script>
+ // Same script in worker
+ const worker = new Worker("same-script.js");
+ function postMessageToWorker() {
+ worker.postMessage("");
+ }
+ </script>
+ </body>
+</html>
+
diff --git a/devtools/client/debugger/test/mochitest/examples/dom-mutation.js b/devtools/client/debugger/test/mochitest/examples/dom-mutation.js
new file mode 100644
index 0000000000..7de3ca72eb
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/dom-mutation.js
@@ -0,0 +1,26 @@
+function changeAttribute() {
+ const title = document.body.title === "Goodbye" ? "Hello" : "Goodbye";
+ document.body.setAttribute("title", title);
+}
+
+function changeStyleAttribute() {
+ document.body.style.color = "blue";
+}
+
+function addDivToBody() {
+ let div = document.createElement("div");
+ div.id = "dynamic";
+ document.body.appendChild(div);
+}
+
+function removeDivInBody() {
+ document.body.querySelector("#dynamic").remove();
+}
+
+function changeAttributeInShadow() {
+ document.getElementById("host").shadowRoot.querySelector("div").classList.toggle("red");
+}
+
+document.getElementById("host").attachShadow({ mode: "open" }).innerHTML = `<div></div>`;
+
+//# sourceMappingURL=dom-mutation.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/dom-mutation.js.map b/devtools/client/debugger/test/mochitest/examples/dom-mutation.js.map
new file mode 100644
index 0000000000..5e1e252b46
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/dom-mutation.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["dom-mutation.original.js"],"names":[],"mappings":"AAAA,QAAQ,CAAC,eAAe,IAAI;EAC1B,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,MAAM,OAAO,KAAK,KAAK,KAAK,OAAO,EAAE;EACtE,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,GAAG,KAAK,EAAE;CAC5C;AACD;AACA,QAAQ,CAAC,aAAa,IAAI;EACxB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,aAAa,EAAE,GAAG,IAAI;CAC1D;IACG,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG;AACxC","file":"dom-mutation.js","sourcesContent":["function changeAttribute() {\n const title = document.body.title === \"Goodbye\" ? \"Hello\" : \"Goodbye\";\n document.body.setAttribute(\"title\", title);\n}\n\nfunction changeSubtree() {\n document.body.appendChild(document.createElement(\"div\"));\n}\n"]} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/ember/quickstart/.editorconfig b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/.editorconfig
new file mode 100644
index 0000000000..219985c228
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/.editorconfig
@@ -0,0 +1,20 @@
+# EditorConfig helps developers define and maintain consistent
+# coding styles between different editors and IDEs
+# editorconfig.org
+
+root = true
+
+
+[*]
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+indent_style = space
+indent_size = 2
+
+[*.hbs]
+insert_final_newline = false
+
+[*.{diff,md}]
+trim_trailing_whitespace = false
diff --git a/devtools/client/debugger/test/mochitest/examples/ember/quickstart/.ember-cli b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/.ember-cli
new file mode 100644
index 0000000000..ee64cfed2a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/.ember-cli
@@ -0,0 +1,9 @@
+{
+ /**
+ Ember CLI sends analytics information by default. The data is completely
+ anonymous, but there are times when you might want to disable this behavior.
+
+ Setting `disableAnalytics` to true will prevent any data from being sent.
+ */
+ "disableAnalytics": false
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/ember/quickstart/.eslintrc.js b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/.eslintrc.js
new file mode 100644
index 0000000000..99f9d257b8
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/.eslintrc.js
@@ -0,0 +1,38 @@
+module.exports = {
+ root: true,
+ parserOptions: {
+ ecmaVersion: 2017,
+ sourceType: 'module'
+ },
+ plugins: [
+ 'ember'
+ ],
+ extends: [
+ 'eslint:recommended',
+ 'plugin:ember/recommended'
+ ],
+ env: {
+ browser: true
+ },
+ rules: {
+ },
+ overrides: [
+ // node files
+ {
+ files: [
+ 'testem.js',
+ 'ember-cli-build.js',
+ 'config/**/*.js',
+ 'lib/*/index.js'
+ ],
+ parserOptions: {
+ sourceType: 'script',
+ ecmaVersion: 2015
+ },
+ env: {
+ browser: false,
+ node: true
+ }
+ }
+ ]
+};
diff --git a/devtools/client/debugger/test/mochitest/examples/ember/quickstart/.gitignore b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/.gitignore
new file mode 100644
index 0000000000..6274b8aa72
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/.gitignore
@@ -0,0 +1,23 @@
+# See https://help.github.com/ignore-files/ for more about ignoring files.
+
+# compiled output
+# /dist # not ignored because we want to load the static files
+/tmp
+
+# dependencies
+/node_modules
+/bower_components
+
+# misc
+/.sass-cache
+/connect.lock
+/coverage/*
+/libpeerconnection.log
+npm-debug.log*
+yarn-error.log
+testem.log
+
+# ember-try
+.node_modules.ember-try/
+bower.json.ember-try
+package.json.ember-try
diff --git a/devtools/client/debugger/test/mochitest/examples/ember/quickstart/.travis.yml b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/.travis.yml
new file mode 100644
index 0000000000..54dcdb2ab1
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/.travis.yml
@@ -0,0 +1,26 @@
+---
+language: node_js
+node_js:
+ - "6"
+
+sudo: false
+dist: trusty
+
+addons:
+ chrome: stable
+
+cache:
+ directories:
+ - $HOME/.npm
+
+env:
+ global:
+ # See https://git.io/vdao3 for details.
+ - JOBS=1
+
+before_install:
+ - npm config set spin false
+
+script:
+ - npm run lint:js
+ - npm test
diff --git a/devtools/client/debugger/test/mochitest/examples/ember/quickstart/.watchmanconfig b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/.watchmanconfig
new file mode 100644
index 0000000000..e7834e3e4f
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/.watchmanconfig
@@ -0,0 +1,3 @@
+{
+ "ignore_dirs": ["tmp", "dist"]
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/quickstart.css b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/quickstart.css
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/quickstart.css
diff --git a/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/quickstart.js b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/quickstart.js
new file mode 100644
index 0000000000..1519b1d857
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/quickstart.js
@@ -0,0 +1,277 @@
+"use strict";
+
+
+
+define('quickstart/app', ['exports', 'quickstart/resolver', 'ember-load-initializers', 'quickstart/config/environment'], function (exports, _resolver, _emberLoadInitializers, _environment) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+
+
+ const App = Ember.Application.extend({
+ modulePrefix: _environment.default.modulePrefix,
+ podModulePrefix: _environment.default.podModulePrefix,
+ Resolver: _resolver.default
+ });
+
+ (0, _emberLoadInitializers.default)(App, _environment.default.modulePrefix);
+
+ exports.default = App;
+});
+
+define('quickstart/components/welcome-page', ['exports', 'ember-welcome-page/components/welcome-page'], function (exports, _welcomePage) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function () {
+ return _welcomePage.default;
+ }
+ });
+});
+
+define('quickstart/helpers/app-version', ['exports', 'quickstart/config/environment', 'ember-cli-app-version/utils/regexp'], function (exports, _environment, _regexp) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.appVersion = appVersion;
+
+
+ const {
+ APP: {
+ version
+ }
+ } = _environment.default;
+
+ function appVersion(_, hash = {}) {
+ if (hash.hideSha) {
+ return version.match(_regexp.versionRegExp)[0];
+ }
+
+ if (hash.hideVersion) {
+ return version.match(_regexp.shaRegExp)[0];
+ }
+
+ return version;
+ }
+
+ exports.default = Ember.Helper.helper(appVersion);
+});
+
+define('quickstart/helpers/pluralize', ['exports', 'ember-inflector/lib/helpers/pluralize'], function (exports, _pluralize) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = _pluralize.default;
+});
+
+define('quickstart/helpers/singularize', ['exports', 'ember-inflector/lib/helpers/singularize'], function (exports, _singularize) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = _singularize.default;
+});
+
+define('quickstart/initializers/app-version', ['exports', 'ember-cli-app-version/initializer-factory', 'quickstart/config/environment'], function (exports, _initializerFactory, _environment) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+
+
+ let name, version;
+ if (_environment.default.APP) {
+ name = _environment.default.APP.name;
+ version = _environment.default.APP.version;
+ }
+
+ exports.default = {
+ name: 'App Version',
+ initialize: (0, _initializerFactory.default)(name, version)
+ };
+});
+
+define('quickstart/initializers/container-debug-adapter', ['exports', 'ember-resolver/resolvers/classic/container-debug-adapter'], function (exports, _containerDebugAdapter) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = {
+ name: 'container-debug-adapter',
+
+ initialize() {
+ let app = arguments[1] || arguments[0];
+
+ app.register('container-debug-adapter:main', _containerDebugAdapter.default);
+ app.inject('container-debug-adapter:main', 'namespace', 'application:main');
+ }
+ };
+});
+
+define('quickstart/initializers/ember-data', ['exports', 'ember-data/setup-container', 'ember-data'], function (exports, _setupContainer) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = {
+ name: 'ember-data',
+ initialize: _setupContainer.default
+ };
+});
+
+define('quickstart/initializers/export-application-global', ['exports', 'quickstart/config/environment'], function (exports, _environment) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.initialize = initialize;
+ function initialize() {
+ var application = arguments[1] || arguments[0];
+ if (_environment.default.exportApplicationGlobal !== false) {
+ var theGlobal;
+ if (typeof window !== 'undefined') {
+ theGlobal = window;
+ } else if (typeof global !== 'undefined') {
+ theGlobal = global;
+ } else if (typeof self !== 'undefined') {
+ theGlobal = self;
+ } else {
+ // no reasonable global, just bail
+ return;
+ }
+
+ var value = _environment.default.exportApplicationGlobal;
+ var globalName;
+
+ if (typeof value === 'string') {
+ globalName = value;
+ } else {
+ globalName = Ember.String.classify(_environment.default.modulePrefix);
+ }
+
+ if (!theGlobal[globalName]) {
+ theGlobal[globalName] = application;
+
+ application.reopen({
+ willDestroy: function () {
+ this._super.apply(this, arguments);
+ delete theGlobal[globalName];
+ }
+ });
+ }
+ }
+ }
+
+ exports.default = {
+ name: 'export-application-global',
+
+ initialize: initialize
+ };
+});
+
+define("quickstart/instance-initializers/ember-data", ["exports", "ember-data/initialize-store-service"], function (exports, _initializeStoreService) {
+ "use strict";
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = {
+ name: "ember-data",
+ initialize: _initializeStoreService.default
+ };
+});
+
+define('quickstart/resolver', ['exports', 'ember-resolver'], function (exports, _emberResolver) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = _emberResolver.default;
+});
+
+define('quickstart/router', ['exports', 'quickstart/config/environment'], function (exports, _environment) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+
+
+ const Router = Ember.Router.extend({
+ location: _environment.default.locationType,
+ rootURL: _environment.default.rootURL
+ });
+
+ Router.map(function () {});
+
+ window.mapTestFunction = () => {
+ window.console.log("pause here", _environment.default, Router);
+ };
+
+ exports.default = Router;
+});
+
+define('quickstart/services/ajax', ['exports', 'ember-ajax/services/ajax'], function (exports, _ajax) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function () {
+ return _ajax.default;
+ }
+ });
+});
+
+define("quickstart/templates/application", ["exports"], function (exports) {
+ "use strict";
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = Ember.HTMLBars.template({ "id": "d4rGKf2G", "block": "{\"symbols\":[],\"statements\":[[1,[18,\"welcome-page\"],false],[0,\"\\n\"],[0,\"\\n\"],[1,[18,\"outlet\"],false]],\"hasEval\":false}", "meta": { "moduleName": "quickstart/templates/application.hbs" } });
+});
+
+
+
+define('quickstart/config/environment', [], function() {
+ var prefix = 'quickstart';
+try {
+ var metaName = prefix + '/config/environment';
+ var rawConfig = document.querySelector('meta[name="' + metaName + '"]').getAttribute('content');
+ var config = JSON.parse(unescape(rawConfig));
+
+ var exports = { 'default': config };
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+ return exports;
+}
+catch(err) {
+ throw new Error('Could not read config from meta tag with name "' + metaName + '".');
+}
+
+});
+
+if (!runningTests) {
+ require("quickstart/app")["default"].create({"name":"quickstart","version":"0.0.0+1dde1d7f"});
+}
+//# sourceMappingURL=quickstart.map
diff --git a/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/quickstart.map b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/quickstart.map
new file mode 100644
index 0000000000..e017fd6f7c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/quickstart.map
@@ -0,0 +1 @@
+{"version":3,"sources":["vendor/ember-cli/app-prefix.js","quickstart/app.js","quickstart/components/welcome-page.js","quickstart/helpers/app-version.js","quickstart/helpers/pluralize.js","quickstart/helpers/singularize.js","quickstart/initializers/app-version.js","quickstart/initializers/container-debug-adapter.js","quickstart/initializers/ember-data.js","quickstart/initializers/export-application-global.js","quickstart/instance-initializers/ember-data.js","quickstart/resolver.js","quickstart/router.js","quickstart/services/ajax.js","quickstart/templates/application.js","vendor/ember-cli/app-suffix.js","vendor/ember-cli/app-config.js","vendor/ember-cli/app-boot.js"],"sourcesContent":["\"use strict\";\n\n\n","import Application from '@ember/application';\nimport Resolver from './resolver';\nimport loadInitializers from 'ember-load-initializers';\nimport config from './config/environment';\n\nconst App = Application.extend({\n modulePrefix: config.modulePrefix,\n podModulePrefix: config.podModulePrefix,\n Resolver\n});\n\nloadInitializers(App, config.modulePrefix);\n\nexport default App;\n","export { default } from 'ember-welcome-page/components/welcome-page';","import Ember from 'ember';\nimport config from '../config/environment';\nimport { shaRegExp, versionRegExp } from 'ember-cli-app-version/utils/regexp';\n\nconst {\n APP: {\n version\n }\n} = config;\n\nexport function appVersion(_, hash = {}) {\n if (hash.hideSha) {\n return version.match(versionRegExp)[0];\n }\n\n if (hash.hideVersion) {\n return version.match(shaRegExp)[0];\n }\n\n return version;\n}\n\nexport default Ember.Helper.helper(appVersion);\n","define('quickstart/helpers/pluralize', ['exports', 'ember-inflector/lib/helpers/pluralize'], function (exports, _pluralize) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = _pluralize.default;\n});\n","define('quickstart/helpers/singularize', ['exports', 'ember-inflector/lib/helpers/singularize'], function (exports, _singularize) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = _singularize.default;\n});\n","import initializerFactory from 'ember-cli-app-version/initializer-factory';\nimport config from '../config/environment';\n\nlet name, version;\nif (config.APP) {\n name = config.APP.name;\n version = config.APP.version;\n}\n\nexport default {\n name: 'App Version',\n initialize: initializerFactory(name, version)\n};\n","import ContainerDebugAdapter from 'ember-resolver/resolvers/classic/container-debug-adapter';\n\nexport default {\n name: 'container-debug-adapter',\n\n initialize() {\n let app = arguments[1] || arguments[0];\n\n app.register('container-debug-adapter:main', ContainerDebugAdapter);\n app.inject('container-debug-adapter:main', 'namespace', 'application:main');\n }\n};\n","import setupContainer from 'ember-data/setup-container';\nimport 'ember-data';\n\n/*\n\n This code initializes Ember-Data onto an Ember application.\n\n If an Ember.js developer defines a subclass of DS.Store on their application,\n as `App.StoreService` (or via a module system that resolves to `service:store`)\n this code will automatically instantiate it and make it available on the\n router.\n\n Additionally, after an application's controllers have been injected, they will\n each have the store made available to them.\n\n For example, imagine an Ember.js application with the following classes:\n\n ```app/services/store.js\n import DS from 'ember-data';\n\n export default DS.Store.extend({\n adapter: 'custom'\n });\n ```\n\n ```app/controllers/posts.js\n import { Controller } from '@ember/controller';\n\n export default Controller.extend({\n // ...\n });\n\n When the application is initialized, `ApplicationStore` will automatically be\n instantiated, and the instance of `PostsController` will have its `store`\n property set to that instance.\n\n Note that this code will only be run if the `ember-application` package is\n loaded. If Ember Data is being used in an environment other than a\n typical application (e.g., node.js where only `ember-runtime` is available),\n this code will be ignored.\n*/\n\nexport default {\n name: 'ember-data',\n initialize: setupContainer\n};\n","import Ember from 'ember';\nimport config from '../config/environment';\n\nexport function initialize() {\n var application = arguments[1] || arguments[0];\n if (config.exportApplicationGlobal !== false) {\n var theGlobal;\n if (typeof window !== 'undefined') {\n theGlobal = window;\n } else if (typeof global !== 'undefined') {\n theGlobal = global\n } else if (typeof self !== 'undefined') {\n theGlobal = self;\n } else {\n // no reasonable global, just bail\n return;\n }\n\n var value = config.exportApplicationGlobal;\n var globalName;\n\n if (typeof value === 'string') {\n globalName = value;\n } else {\n globalName = Ember.String.classify(config.modulePrefix);\n }\n\n if (!theGlobal[globalName]) {\n theGlobal[globalName] = application;\n\n application.reopen({\n willDestroy: function() {\n this._super.apply(this, arguments);\n delete theGlobal[globalName];\n }\n });\n }\n }\n}\n\nexport default {\n name: 'export-application-global',\n\n initialize: initialize\n};\n","import initializeStoreService from 'ember-data/initialize-store-service';\n\nexport default {\n name: \"ember-data\",\n initialize: initializeStoreService\n};\n","define('quickstart/resolver', ['exports', 'ember-resolver'], function (exports, _emberResolver) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = _emberResolver.default;\n});\n","import EmberRouter from '@ember/routing/router';\nimport config from './config/environment';\n\nconst Router = EmberRouter.extend({\n location: config.locationType,\n rootURL: config.rootURL\n});\n\nRouter.map(function() {\n});\n\nwindow.mapTestFunction = () => {\n window.console.log(\"pause here\", config, Router);\n};\n\nexport default Router;\n","export { default } from 'ember-ajax/services/ajax';\n","export default Ember.HTMLBars.template({\"id\":\"d4rGKf2G\",\"block\":\"{\\\"symbols\\\":[],\\\"statements\\\":[[1,[18,\\\"welcome-page\\\"],false],[0,\\\"\\\\n\\\"],[0,\\\"\\\\n\\\"],[1,[18,\\\"outlet\\\"],false]],\\\"hasEval\\\":false}\",\"meta\":{\"moduleName\":\"quickstart/templates/application.hbs\"}});","\n","define('quickstart/config/environment', [], function() {\n var prefix = 'quickstart';\ntry {\n var metaName = prefix + '/config/environment';\n var rawConfig = document.querySelector('meta[name=\"' + metaName + '\"]').getAttribute('content');\n var config = JSON.parse(unescape(rawConfig));\n\n var exports = { 'default': config };\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n return exports;\n}\ncatch(err) {\n throw new Error('Could not read config from meta tag with name \"' + metaName + '\".');\n}\n\n});\n","if (!runningTests) {\n require(\"quickstart/app\")[\"default\"].create({\"name\":\"quickstart\",\"version\":\"0.0.0+1dde1d7f\"});\n}\n"],"names":["App","Application","extend","modulePrefix","podModulePrefix","Resolver","default","appVersion","APP","version","_","hash","hideSha","match","hideVersion","Ember","Helper","helper","name","version","APP","initialize","name","initialize","app","arguments","register","inject","name","initialize","initialize","application","arguments","exportApplicationGlobal","theGlobal","window","global","self","value","globalName","Ember","String","classify","modulePrefix","reopen","willDestroy","_super","apply","name","name","initialize","Router","EmberRouter","extend","location","locationType","rootURL","map","window","mapTestFunction","console","log","default","Ember","HTMLBars","template"],"mappings":"AAAA;AACA;AACA;;;;;;;;;;ACGA,QAAMA,MAAMC,kBAAYC,MAAZ,CAAmB;AAC7BC,kBAAc,qBAAOA,YADQ;AAE7BC,qBAAiB,qBAAOA,eAFK;AAG7BC;AAH6B,GAAnB,CAAZ;;AAMA,sCAAiBL,GAAjB,EAAsB,qBAAOG,YAA7B;;oBAEeH,G;;;;;;;;;;;;0BCbNM,O;;;;;;;;;;;UCUOC,U,GAAAA,U;;;AANhB,QAAM;AACJC,SAAK;AACHC;AADG;AADD,0BAAN;;AAMO,WAASF,UAAT,CAAoBG,CAApB,EAAuBC,OAAO,EAA9B,EAAkC;AACvC,QAAIA,KAAKC,OAAT,EAAkB;AAChB,aAAOH,QAAQI,KAAR,wBAA6B,CAA7B,CAAP;AACD;;AAED,QAAIF,KAAKG,WAAT,EAAsB;AACpB,aAAOL,QAAQI,KAAR,oBAAyB,CAAzB,CAAP;AACD;;AAED,WAAOJ,OAAP;AACD;;oBAEcM,MAAMC,MAAN,CAAaC,MAAb,CAAoBV,UAApB,C;;;ACtBf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;ACJA,MAAIW,IAAJ,EAAUC,OAAV;AACA,MAAI,qBAAOC,GAAX,EAAgB;AACdF,WAAO,qBAAOE,GAAP,CAAWF,IAAlB;AACAC,cAAU,qBAAOC,GAAP,CAAWD,OAArB;AACD;;oBAEc;AACbD,UAAM,aADO;AAEbG,gBAAY,iCAAmBH,IAAnB,EAAyBC,OAAzB;AAFC,G;;;;;;;;;oBCPA;AACbG,UAAM,yBADO;;AAGbC,iBAAa;AACX,UAAIC,MAAMC,UAAU,CAAV,KAAgBA,UAAU,CAAV,CAA1B;;AAEAD,UAAIE,QAAJ,CAAa,8BAAb;AACAF,UAAIG,MAAJ,CAAW,8BAAX,EAA2C,WAA3C,EAAwD,kBAAxD;AACD;AARY,G;;;;;;;;;oBCwCA;AACbC,UAAM,YADO;AAEbC;AAFa,G;;;;;;;;;UCvCCC,U,GAAAA,U;AAAT,WAASA,UAAT,GAAsB;AAC3B,QAAIC,cAAcC,UAAU,CAAV,KAAgBA,UAAU,CAAV,CAAlC;AACA,QAAI,qBAAOC,uBAAP,KAAmC,KAAvC,EAA8C;AAC5C,UAAIC,SAAJ;AACA,UAAI,OAAOC,MAAP,KAAkB,WAAtB,EAAmC;AAC/BD,oBAAYC,MAAZ;AACH,OAFD,MAEO,IAAI,OAAOC,MAAP,KAAkB,WAAtB,EAAmC;AACtCF,oBAAYE,MAAZ;AACH,OAFM,MAEA,IAAI,OAAOC,IAAP,KAAgB,WAApB,EAAiC;AACpCH,oBAAYG,IAAZ;AACH,OAFM,MAEA;AACJ;AACA;AACF;;AAED,UAAIC,QAAQ,qBAAOL,uBAAnB;AACA,UAAIM,UAAJ;;AAEA,UAAI,OAAOD,KAAP,KAAiB,QAArB,EAA+B;AAC7BC,qBAAaD,KAAb;AACD,OAFD,MAEO;AACLC,qBAAaC,MAAMC,MAAN,CAAaC,QAAb,CAAsB,qBAAOC,YAA7B,CAAb;AACD;;AAED,UAAI,CAACT,UAAUK,UAAV,CAAL,EAA4B;AAC1BL,kBAAUK,UAAV,IAAwBR,WAAxB;;AAEAA,oBAAYa,MAAZ,CAAmB;AACjBC,uBAAa,YAAW;AACtB,iBAAKC,MAAL,CAAYC,KAAZ,CAAkB,IAAlB,EAAwBf,SAAxB;AACA,mBAAOE,UAAUK,UAAV,CAAP;AACD;AAJgB,SAAnB;AAMD;AACF;AACF;;oBAEc;AACbS,UAAM,2BADO;;AAGblB,gBAAYA;AAHC,G;;;;;;;;;oBCtCA;AACbmB,UAAM,YADO;AAEbC;AAFa,G;;;ACFf;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;ACJA,QAAMC,SAASC,aAAYC,MAAZ,CAAmB;AAChCC,cAAU,qBAAOC,YADe;AAEhCC,aAAS,qBAAOA;AAFgB,GAAnB,CAAf;;AAKAL,SAAOM,GAAP,CAAW,YAAW,CACrB,CADD;;AAGAC,SAAOC,eAAP,GAAyB,MAAM;AAC7BD,WAAOE,OAAP,CAAeC,GAAf,CAAmB,YAAnB,wBAAyCV,MAAzC;AACD,GAFD;;oBAIeA,M;;;;;;;;;;;;mBCfNW,O;;;;;;;;;;;oBCAMC,MAAMC,QAAN,CAAeC,QAAf,CAAwB,EAAC,MAAK,UAAN,EAAiB,SAAQ,uIAAzB,EAAiK,QAAO,EAAC,cAAa,sCAAd,EAAxK,EAAxB,C;;;ACAf;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;","file":"quickstart.js"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/test-support.css b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/test-support.css
new file mode 100644
index 0000000000..65461785ae
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/test-support.css
@@ -0,0 +1,471 @@
+/*!
+ * QUnit 2.5.1
+ * https://qunitjs.com/
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license
+ * https://jquery.org/license
+ *
+ * Date: 2018-02-28T01:37Z
+ */
+
+/** Font Family and Sizes */
+
+#qunit-tests, #qunit-header, #qunit-banner, #qunit-testrunner-toolbar, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult {
+ font-family: "Helvetica Neue Light", "HelveticaNeue-Light", "Helvetica Neue", Calibri, Helvetica, Arial, sans-serif;
+}
+
+#qunit-testrunner-toolbar, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult, #qunit-tests li { font-size: small; }
+#qunit-tests { font-size: smaller; }
+
+
+/** Resets */
+
+#qunit-tests, #qunit-header, #qunit-banner, #qunit-filteredTest, #qunit-userAgent, #qunit-testresult, #qunit-modulefilter {
+ margin: 0;
+ padding: 0;
+}
+
+
+/** Header (excluding toolbar) */
+
+#qunit-header {
+ padding: 0.5em 0 0.5em 1em;
+
+ color: #8699A4;
+ background-color: #0D3349;
+
+ font-size: 1.5em;
+ line-height: 1em;
+ font-weight: 400;
+
+ border-radius: 5px 5px 0 0;
+}
+
+#qunit-header a {
+ text-decoration: none;
+ color: #C2CCD1;
+}
+
+#qunit-header a:hover,
+#qunit-header a:focus {
+ color: #FFF;
+}
+
+#qunit-banner {
+ height: 5px;
+}
+
+#qunit-filteredTest {
+ padding: 0.5em 1em 0.5em 1em;
+ color: #366097;
+ background-color: #F4FF77;
+}
+
+#qunit-userAgent {
+ padding: 0.5em 1em 0.5em 1em;
+ color: #FFF;
+ background-color: #2B81AF;
+ text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px;
+}
+
+
+/** Toolbar */
+
+#qunit-testrunner-toolbar {
+ padding: 0.5em 1em 0.5em 1em;
+ color: #5E740B;
+ background-color: #EEE;
+}
+
+#qunit-testrunner-toolbar .clearfix {
+ height: 0;
+ clear: both;
+}
+
+#qunit-testrunner-toolbar label {
+ display: inline-block;
+}
+
+#qunit-testrunner-toolbar input[type=checkbox],
+#qunit-testrunner-toolbar input[type=radio] {
+ margin: 3px;
+ vertical-align: -2px;
+}
+
+#qunit-testrunner-toolbar input[type=text] {
+ box-sizing: border-box;
+ height: 1.6em;
+}
+
+.qunit-url-config,
+.qunit-filter,
+#qunit-modulefilter {
+ display: inline-block;
+ line-height: 2.1em;
+}
+
+.qunit-filter,
+#qunit-modulefilter {
+ float: right;
+ position: relative;
+ margin-left: 1em;
+}
+
+.qunit-url-config label {
+ margin-right: 0.5em;
+}
+
+#qunit-modulefilter-search {
+ box-sizing: border-box;
+ width: 400px;
+}
+
+#qunit-modulefilter-search-container:after {
+ position: absolute;
+ right: 0.3em;
+ content: "\25bc";
+ color: black;
+}
+
+#qunit-modulefilter-dropdown {
+ /* align with #qunit-modulefilter-search */
+ box-sizing: border-box;
+ width: 400px;
+ position: absolute;
+ right: 0;
+ top: 50%;
+ margin-top: 0.8em;
+
+ border: 1px solid #D3D3D3;
+ border-top: none;
+ border-radius: 0 0 .25em .25em;
+ color: #000;
+ background-color: #F5F5F5;
+ z-index: 99;
+}
+
+#qunit-modulefilter-dropdown a {
+ color: inherit;
+ text-decoration: none;
+}
+
+#qunit-modulefilter-dropdown .clickable.checked {
+ font-weight: bold;
+ color: #000;
+ background-color: #D2E0E6;
+}
+
+#qunit-modulefilter-dropdown .clickable:hover {
+ color: #FFF;
+ background-color: #0D3349;
+}
+
+#qunit-modulefilter-actions {
+ display: block;
+ overflow: auto;
+
+ /* align with #qunit-modulefilter-dropdown-list */
+ font: smaller/1.5em sans-serif;
+}
+
+#qunit-modulefilter-dropdown #qunit-modulefilter-actions > * {
+ box-sizing: border-box;
+ max-height: 2.8em;
+ display: block;
+ padding: 0.4em;
+}
+
+#qunit-modulefilter-dropdown #qunit-modulefilter-actions > button {
+ float: right;
+ font: inherit;
+}
+
+#qunit-modulefilter-dropdown #qunit-modulefilter-actions > :last-child {
+ /* insert padding to align with checkbox margins */
+ padding-left: 3px;
+}
+
+#qunit-modulefilter-dropdown-list {
+ max-height: 200px;
+ overflow-y: auto;
+ margin: 0;
+ border-top: 2px groove threedhighlight;
+ padding: 0.4em 0 0;
+ font: smaller/1.5em sans-serif;
+}
+
+#qunit-modulefilter-dropdown-list li {
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+#qunit-modulefilter-dropdown-list .clickable {
+ display: block;
+ padding-left: 0.15em;
+}
+
+
+/** Tests: Pass/Fail */
+
+#qunit-tests {
+ list-style-position: inside;
+}
+
+#qunit-tests li {
+ padding: 0.4em 1em 0.4em 1em;
+ border-bottom: 1px solid #FFF;
+ list-style-position: inside;
+}
+
+#qunit-tests > li {
+ display: none;
+}
+
+#qunit-tests li.running,
+#qunit-tests li.pass,
+#qunit-tests li.fail,
+#qunit-tests li.skipped,
+#qunit-tests li.aborted {
+ display: list-item;
+}
+
+#qunit-tests.hidepass {
+ position: relative;
+}
+
+#qunit-tests.hidepass li.running,
+#qunit-tests.hidepass li.pass:not(.todo) {
+ visibility: hidden;
+ position: absolute;
+ width: 0;
+ height: 0;
+ padding: 0;
+ border: 0;
+ margin: 0;
+}
+
+#qunit-tests li strong {
+ cursor: pointer;
+}
+
+#qunit-tests li.skipped strong {
+ cursor: default;
+}
+
+#qunit-tests li a {
+ padding: 0.5em;
+ color: #C2CCD1;
+ text-decoration: none;
+}
+
+#qunit-tests li p a {
+ padding: 0.25em;
+ color: #6B6464;
+}
+#qunit-tests li a:hover,
+#qunit-tests li a:focus {
+ color: #000;
+}
+
+#qunit-tests li .runtime {
+ float: right;
+ font-size: smaller;
+}
+
+.qunit-assert-list {
+ margin-top: 0.5em;
+ padding: 0.5em;
+
+ background-color: #FFF;
+
+ border-radius: 5px;
+}
+
+.qunit-source {
+ margin: 0.6em 0 0.3em;
+}
+
+.qunit-collapsed {
+ display: none;
+}
+
+#qunit-tests table {
+ border-collapse: collapse;
+ margin-top: 0.2em;
+}
+
+#qunit-tests th {
+ text-align: right;
+ vertical-align: top;
+ padding: 0 0.5em 0 0;
+}
+
+#qunit-tests td {
+ vertical-align: top;
+}
+
+#qunit-tests pre {
+ margin: 0;
+ white-space: pre-wrap;
+ word-wrap: break-word;
+}
+
+#qunit-tests del {
+ color: #374E0C;
+ background-color: #E0F2BE;
+ text-decoration: none;
+}
+
+#qunit-tests ins {
+ color: #500;
+ background-color: #FFCACA;
+ text-decoration: none;
+}
+
+/*** Test Counts */
+
+#qunit-tests b.counts { color: #000; }
+#qunit-tests b.passed { color: #5E740B; }
+#qunit-tests b.failed { color: #710909; }
+
+#qunit-tests li li {
+ padding: 5px;
+ background-color: #FFF;
+ border-bottom: none;
+ list-style-position: inside;
+}
+
+/*** Passing Styles */
+
+#qunit-tests li li.pass {
+ color: #3C510C;
+ background-color: #FFF;
+ border-left: 10px solid #C6E746;
+}
+
+#qunit-tests .pass { color: #528CE0; background-color: #D2E0E6; }
+#qunit-tests .pass .test-name { color: #366097; }
+
+#qunit-tests .pass .test-actual,
+#qunit-tests .pass .test-expected { color: #999; }
+
+#qunit-banner.qunit-pass { background-color: #C6E746; }
+
+/*** Failing Styles */
+
+#qunit-tests li li.fail {
+ color: #710909;
+ background-color: #FFF;
+ border-left: 10px solid #EE5757;
+ white-space: pre;
+}
+
+#qunit-tests > li:last-child {
+ border-radius: 0 0 5px 5px;
+}
+
+#qunit-tests .fail { color: #000; background-color: #EE5757; }
+#qunit-tests .fail .test-name,
+#qunit-tests .fail .module-name { color: #000; }
+
+#qunit-tests .fail .test-actual { color: #EE5757; }
+#qunit-tests .fail .test-expected { color: #008000; }
+
+#qunit-banner.qunit-fail { background-color: #EE5757; }
+
+
+/*** Aborted tests */
+#qunit-tests .aborted { color: #000; background-color: orange; }
+/*** Skipped tests */
+
+#qunit-tests .skipped {
+ background-color: #EBECE9;
+}
+
+#qunit-tests .qunit-todo-label,
+#qunit-tests .qunit-skipped-label {
+ background-color: #F4FF77;
+ display: inline-block;
+ font-style: normal;
+ color: #366097;
+ line-height: 1.8em;
+ padding: 0 0.5em;
+ margin: -0.4em 0.4em -0.4em 0;
+}
+
+#qunit-tests .qunit-todo-label {
+ background-color: #EEE;
+}
+
+/** Result */
+
+#qunit-testresult {
+ color: #2B81AF;
+ background-color: #D2E0E6;
+
+ border-bottom: 1px solid #FFF;
+}
+#qunit-testresult .clearfix {
+ height: 0;
+ clear: both;
+}
+#qunit-testresult .module-name {
+ font-weight: 700;
+}
+#qunit-testresult-display {
+ padding: 0.5em 1em 0.5em 1em;
+ width: 85%;
+ float:left;
+}
+#qunit-testresult-controls {
+ padding: 0.5em 1em 0.5em 1em;
+ width: 10%;
+ float:left;
+}
+
+/** Fixture */
+
+#qunit-fixture {
+ position: absolute;
+ top: -10000px;
+ left: -10000px;
+ width: 1000px;
+ height: 1000px;
+}
+
+#ember-testing-container {
+ position: relative;
+ background: white;
+ bottom: 0;
+ right: 0;
+ width: 640px;
+ height: 384px;
+ overflow: auto;
+ z-index: 98;
+ border: 1px solid #ccc;
+ margin: 0 auto;
+}
+
+#ember-testing-container.full-screen {
+ width: 100%;
+ height: 100%;
+ overflow: auto;
+ z-index: 98;
+ border: none;
+}
+
+#ember-testing {
+ width: 200%;
+ height: 200%;
+ transform: scale(0.5);
+ transform-origin: top left;
+}
+
+.full-screen #ember-testing {
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ transform: scale(1);
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/test-support.js b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/test-support.js
new file mode 100644
index 0000000000..f1ba91781e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/test-support.js
@@ -0,0 +1,12050 @@
+
+
+(function() {
+/*!
+ * @overview Ember - JavaScript Application Framework
+ * @copyright Copyright 2011-2018 Tilde Inc. and contributors
+ * Portions Copyright 2006-2011 Strobe Inc.
+ * Portions Copyright 2008-2011 Apple Inc. All rights reserved.
+ * @license Licensed under MIT license
+ * See https://raw.github.com/emberjs/ember.js/master/LICENSE
+ * @version 3.0.0
+ */
+
+/*globals process */
+var enifed, requireModule, Ember;
+
+// Used in ember-environment/lib/global.js
+mainContext = this; // eslint-disable-line no-undef
+
+(function() {
+ function missingModule(name, referrerName) {
+ if (referrerName) {
+ throw new Error('Could not find module ' + name + ' required by: ' + referrerName);
+ } else {
+ throw new Error('Could not find module ' + name);
+ }
+ }
+
+ function internalRequire(_name, referrerName) {
+ var name = _name;
+ var mod = registry[name];
+
+ if (!mod) {
+ name = name + '/index';
+ mod = registry[name];
+ }
+
+ var exports = seen[name];
+
+ if (exports !== undefined) {
+ return exports;
+ }
+
+ exports = seen[name] = {};
+
+ if (!mod) {
+ missingModule(_name, referrerName);
+ }
+
+ var deps = mod.deps;
+ var callback = mod.callback;
+ var reified = new Array(deps.length);
+
+ for (var i = 0; i < deps.length; i++) {
+ if (deps[i] === 'exports') {
+ reified[i] = exports;
+ } else if (deps[i] === 'require') {
+ reified[i] = requireModule;
+ } else {
+ reified[i] = internalRequire(deps[i], name);
+ }
+ }
+
+ callback.apply(this, reified);
+
+ return exports;
+ }
+
+ var isNode = typeof window === 'undefined' &&
+ typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';
+
+ if (!isNode) {
+ Ember = this.Ember = this.Ember || {};
+ }
+
+ if (typeof Ember === 'undefined') { Ember = {}; }
+
+ if (typeof Ember.__loader === 'undefined') {
+ var registry = {};
+ var seen = {};
+
+ enifed = function(name, deps, callback) {
+ var value = { };
+
+ if (!callback) {
+ value.deps = [];
+ value.callback = deps;
+ } else {
+ value.deps = deps;
+ value.callback = callback;
+ }
+
+ registry[name] = value;
+ };
+
+ requireModule = function(name) {
+ return internalRequire(name, null);
+ };
+
+ // setup `require` module
+ requireModule['default'] = requireModule;
+
+ requireModule.has = function registryHas(moduleName) {
+ return !!registry[moduleName] || !!registry[moduleName + '/index'];
+ };
+
+ requireModule._eak_seen = registry;
+
+ Ember.__loader = {
+ define: enifed,
+ require: requireModule,
+ registry: registry
+ };
+ } else {
+ enifed = Ember.__loader.define;
+ requireModule = Ember.__loader.require;
+ }
+})();
+
+enifed('ember-babel', ['exports'], function (exports) {
+ 'use strict';
+
+ exports.classCallCheck = classCallCheck;
+ exports.inherits = inherits;
+ exports.taggedTemplateLiteralLoose = taggedTemplateLiteralLoose;
+ exports.createClass = createClass;
+ exports.defaults = defaults;
+ function classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError('Cannot call a class as a function');
+ }
+ }
+
+ function inherits(subClass, superClass) {
+ if (typeof superClass !== 'function' && superClass !== null) {
+ throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass);
+ }
+
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: false,
+ writable: true,
+ configurable: true
+ }
+ });
+
+ if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : defaults(subClass, superClass);
+ }
+
+ function taggedTemplateLiteralLoose(strings, raw) {
+ strings.raw = raw;
+ return strings;
+ }
+
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || false;
+ descriptor.configurable = true;
+ if ('value' in descriptor) descriptor.writable = true;
+ Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+
+ function createClass(Constructor, protoProps, staticProps) {
+ if (protoProps) defineProperties(Constructor.prototype, protoProps);
+ if (staticProps) defineProperties(Constructor, staticProps);
+ return Constructor;
+ }
+
+ function defaults(obj, defaults) {
+ var keys = Object.getOwnPropertyNames(defaults);
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];
+ var value = Object.getOwnPropertyDescriptor(defaults, key);
+ if (value && value.configurable && obj[key] === undefined) {
+ Object.defineProperty(obj, key, value);
+ }
+ }
+ return obj;
+ }
+
+ var possibleConstructorReturn = exports.possibleConstructorReturn = function (self, call) {
+ if (!self) {
+ throw new ReferenceError('this hasn\'t been initialized - super() hasn\'t been called');
+ }
+ return call && (typeof call === 'object' || typeof call === 'function') ? call : self;
+ };
+
+ var slice = exports.slice = Array.prototype.slice;
+});
+enifed('ember-debug/deprecate', ['exports', 'ember-debug/error', 'ember-console', 'ember-environment', 'ember-debug/index', 'ember-debug/handlers'], function (exports, _error, _emberConsole, _emberEnvironment, _index, _handlers) {
+ 'use strict';
+
+ exports.missingOptionsUntilDeprecation = exports.missingOptionsIdDeprecation = exports.missingOptionsDeprecation = exports.registerHandler = undefined;
+
+ /**
+ @module @ember/debug
+ @public
+ */
+ /**
+ Allows for runtime registration of handler functions that override the default deprecation behavior.
+ Deprecations are invoked by calls to [@ember/application/deprecations/deprecate](https://emberjs.com/api/ember/release/classes/@ember%2Fapplication%2Fdeprecations/methods/deprecate?anchor=deprecate).
+ The following example demonstrates its usage by registering a handler that throws an error if the
+ message contains the word "should", otherwise defers to the default handler.
+
+ ```javascript
+ import { registerDeprecationHandler } from '@ember/debug';
+
+ registerDeprecationHandler((message, options, next) => {
+ if (message.indexOf('should') !== -1) {
+ throw new Error(`Deprecation message with should: ${message}`);
+ } else {
+ // defer to whatever handler was registered before this one
+ next(message, options);
+ }
+ });
+ ```
+
+ The handler function takes the following arguments:
+
+ <ul>
+ <li> <code>message</code> - The message received from the deprecation call.</li>
+ <li> <code>options</code> - An object passed in with the deprecation call containing additional information including:</li>
+ <ul>
+ <li> <code>id</code> - An id of the deprecation in the form of <code>package-name.specific-deprecation</code>.</li>
+ <li> <code>until</code> - The Ember version number the feature and deprecation will be removed in.</li>
+ </ul>
+ <li> <code>next</code> - A function that calls into the previously registered handler.</li>
+ </ul>
+
+ @public
+ @static
+ @method registerDeprecationHandler
+ @for @ember/debug
+ @param handler {Function} A function to handle deprecation calls.
+ @since 2.1.0
+ */
+ /*global __fail__*/
+ var registerHandler = function () {};
+ var missingOptionsDeprecation = void 0,
+ missingOptionsIdDeprecation = void 0,
+ missingOptionsUntilDeprecation = void 0,
+ deprecate = void 0;
+
+ if (true) {
+ exports.registerHandler = registerHandler = function registerHandler(handler) {
+ (0, _handlers.registerHandler)('deprecate', handler);
+ };
+
+ var formatMessage = function formatMessage(_message, options) {
+ var message = _message;
+
+ if (options && options.id) {
+ message = message + (' [deprecation id: ' + options.id + ']');
+ }
+
+ if (options && options.url) {
+ message += ' See ' + options.url + ' for more details.';
+ }
+
+ return message;
+ };
+
+ registerHandler(function logDeprecationToConsole(message, options) {
+ var updatedMessage = formatMessage(message, options);
+
+ _emberConsole.default.warn('DEPRECATION: ' + updatedMessage);
+ });
+
+ var captureErrorForStack = void 0;
+
+ if (new Error().stack) {
+ captureErrorForStack = function () {
+ return new Error();
+ };
+ } else {
+ captureErrorForStack = function () {
+ try {
+ __fail__.fail();
+ } catch (e) {
+ return e;
+ }
+ };
+ }
+
+ registerHandler(function logDeprecationStackTrace(message, options, next) {
+ if (_emberEnvironment.ENV.LOG_STACKTRACE_ON_DEPRECATION) {
+ var stackStr = '';
+ var error = captureErrorForStack();
+ var stack = void 0;
+
+ if (error.stack) {
+ if (error['arguments']) {
+ // Chrome
+ stack = error.stack.replace(/^\s+at\s+/gm, '').replace(/^([^\(]+?)([\n$])/gm, '{anonymous}($1)$2').replace(/^Object.<anonymous>\s*\(([^\)]+)\)/gm, '{anonymous}($1)').split('\n');
+ stack.shift();
+ } else {
+ // Firefox
+ stack = error.stack.replace(/(?:\n@:0)?\s+$/m, '').replace(/^\(/gm, '{anonymous}(').split('\n');
+ }
+
+ stackStr = '\n ' + stack.slice(2).join('\n ');
+ }
+
+ var updatedMessage = formatMessage(message, options);
+
+ _emberConsole.default.warn('DEPRECATION: ' + updatedMessage + stackStr);
+ } else {
+ next.apply(undefined, arguments);
+ }
+ });
+
+ registerHandler(function raiseOnDeprecation(message, options, next) {
+ if (_emberEnvironment.ENV.RAISE_ON_DEPRECATION) {
+ var updatedMessage = formatMessage(message);
+
+ throw new _error.default(updatedMessage);
+ } else {
+ next.apply(undefined, arguments);
+ }
+ });
+
+ exports.missingOptionsDeprecation = missingOptionsDeprecation = 'When calling `deprecate` you ' + 'must provide an `options` hash as the third parameter. ' + '`options` should include `id` and `until` properties.';
+ exports.missingOptionsIdDeprecation = missingOptionsIdDeprecation = 'When calling `deprecate` you must provide `id` in options.';
+ exports.missingOptionsUntilDeprecation = missingOptionsUntilDeprecation = 'When calling `deprecate` you must provide `until` in options.';
+ /**
+ @module @ember/application
+ @public
+ */
+ /**
+ Display a deprecation warning with the provided message and a stack trace
+ (Chrome and Firefox only).
+ * In a production build, this method is defined as an empty function (NOP).
+ Uses of this method in Ember itself are stripped from the ember.prod.js build.
+ @method deprecate
+ @for @ember/application/deprecations
+ @param {String} message A description of the deprecation.
+ @param {Boolean} test A boolean. If falsy, the deprecation will be displayed.
+ @param {Object} options
+ @param {String} options.id A unique id for this deprecation. The id can be
+ used by Ember debugging tools to change the behavior (raise, log or silence)
+ for that specific deprecation. The id should be namespaced by dots, e.g.
+ "view.helper.select".
+ @param {string} options.until The version of Ember when this deprecation
+ warning will be removed.
+ @param {String} [options.url] An optional url to the transition guide on the
+ emberjs.com website.
+ @static
+ @public
+ @since 1.0.0
+ */
+ deprecate = function deprecate(message, test, options) {
+ if (_emberEnvironment.ENV._ENABLE_DEPRECATION_OPTIONS_SUPPORT !== true) {
+ (0, _index.assert)(missingOptionsDeprecation, options && (options.id || options.until));
+ (0, _index.assert)(missingOptionsIdDeprecation, options.id);
+ (0, _index.assert)(missingOptionsUntilDeprecation, options.until);
+ }
+
+ if ((!options || !options.id && !options.until) && _emberEnvironment.ENV._ENABLE_DEPRECATION_OPTIONS_SUPPORT === true) {
+ deprecate(missingOptionsDeprecation, false, {
+ id: 'ember-debug.deprecate-options-missing',
+ until: '3.0.0',
+ url: 'https://emberjs.com/deprecations/v2.x/#toc_ember-debug-function-options'
+ });
+ }
+
+ if (options && !options.id && _emberEnvironment.ENV._ENABLE_DEPRECATION_OPTIONS_SUPPORT === true) {
+ deprecate(missingOptionsIdDeprecation, false, {
+ id: 'ember-debug.deprecate-id-missing',
+ until: '3.0.0',
+ url: 'https://emberjs.com/deprecations/v2.x/#toc_ember-debug-function-options'
+ });
+ }
+
+ if (options && !options.until && _emberEnvironment.ENV._ENABLE_DEPRECATION_OPTIONS_SUPPORT === true) {
+ deprecate(missingOptionsUntilDeprecation, options && options.until, {
+ id: 'ember-debug.deprecate-until-missing',
+ until: '3.0.0',
+ url: 'https://emberjs.com/deprecations/v2.x/#toc_ember-debug-function-options'
+ });
+ }
+
+ _handlers.invoke.apply(undefined, ['deprecate'].concat(Array.prototype.slice.call(arguments)));
+ };
+ }
+
+ exports.default = deprecate;
+ exports.registerHandler = registerHandler;
+ exports.missingOptionsDeprecation = missingOptionsDeprecation;
+ exports.missingOptionsIdDeprecation = missingOptionsIdDeprecation;
+ exports.missingOptionsUntilDeprecation = missingOptionsUntilDeprecation;
+});
+enifed("ember-debug/error", ["exports", "ember-babel"], function (exports, _emberBabel) {
+ "use strict";
+
+ /**
+ @module @ember/error
+ */
+ function ExtendBuiltin(klass) {
+ function ExtendableBuiltin() {
+ klass.apply(this, arguments);
+ }
+
+ ExtendableBuiltin.prototype = Object.create(klass.prototype);
+ ExtendableBuiltin.prototype.constructor = ExtendableBuiltin;
+ return ExtendableBuiltin;
+ }
+
+ /**
+ A subclass of the JavaScript Error object for use in Ember.
+
+ @class EmberError
+ @extends Error
+ @constructor
+ @public
+ */
+
+ var EmberError = function (_ExtendBuiltin) {
+ (0, _emberBabel.inherits)(EmberError, _ExtendBuiltin);
+
+ function EmberError(message) {
+ (0, _emberBabel.classCallCheck)(this, EmberError);
+
+ var _this = (0, _emberBabel.possibleConstructorReturn)(this, _ExtendBuiltin.call(this));
+
+ if (!(_this instanceof EmberError)) {
+ var _ret;
+
+ return _ret = new EmberError(message), (0, _emberBabel.possibleConstructorReturn)(_this, _ret);
+ }
+
+ var error = Error.call(_this, message);
+ _this.stack = error.stack;
+ _this.description = error.description;
+ _this.fileName = error.fileName;
+ _this.lineNumber = error.lineNumber;
+ _this.message = error.message;
+ _this.name = error.name;
+ _this.number = error.number;
+ _this.code = error.code;
+ return _this;
+ }
+
+ return EmberError;
+ }(ExtendBuiltin(Error));
+
+ exports.default = EmberError;
+});
+enifed('ember-debug/features', ['exports', 'ember-environment', 'ember/features'], function (exports, _emberEnvironment, _features) {
+ 'use strict';
+
+ exports.default = isEnabled;
+ var FEATURES = _features.FEATURES;
+
+
+ /**
+ @module ember
+ */
+
+ /**
+ The hash of enabled Canary features. Add to this, any canary features
+ before creating your application.
+
+ Alternatively (and recommended), you can also define `EmberENV.FEATURES`
+ if you need to enable features flagged at runtime.
+
+ @class FEATURES
+ @namespace Ember
+ @static
+ @since 1.1.0
+ @public
+ */
+
+ // Auto-generated
+
+ /**
+ Determine whether the specified `feature` is enabled. Used by Ember's
+ build tools to exclude experimental features from beta/stable builds.
+
+ You can define the following configuration options:
+
+ * `EmberENV.ENABLE_OPTIONAL_FEATURES` - enable any features that have not been explicitly
+ enabled/disabled.
+
+ @method isEnabled
+ @param {String} feature The feature to check
+ @return {Boolean}
+ @for Ember.FEATURES
+ @since 1.1.0
+ @public
+ */
+ function isEnabled(feature) {
+ var featureValue = FEATURES[feature];
+
+ if (featureValue === true || featureValue === false || featureValue === undefined) {
+ return featureValue;
+ } else if (_emberEnvironment.ENV.ENABLE_OPTIONAL_FEATURES) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+});
+enifed('ember-debug/handlers', ['exports'], function (exports) {
+ 'use strict';
+
+ var HANDLERS = exports.HANDLERS = {};
+
+ var registerHandler = function () {};
+ var invoke = function () {};
+
+ if (true) {
+ exports.registerHandler = registerHandler = function registerHandler(type, callback) {
+ var nextHandler = HANDLERS[type] || function () {};
+
+ HANDLERS[type] = function (message, options) {
+ callback(message, options, nextHandler);
+ };
+ };
+
+ exports.invoke = invoke = function invoke(type, message, test, options) {
+ if (test) {
+ return;
+ }
+
+ var handlerForType = HANDLERS[type];
+
+ if (handlerForType) {
+ handlerForType(message, options);
+ }
+ };
+ }
+
+ exports.registerHandler = registerHandler;
+ exports.invoke = invoke;
+});
+enifed('ember-debug/index', ['exports', 'ember-debug/warn', 'ember-debug/deprecate', 'ember-debug/features', 'ember-debug/error', 'ember-debug/testing', 'ember-environment', 'ember-console', 'ember/features'], function (exports, _warn2, _deprecate2, _features, _error, _testing, _emberEnvironment, _emberConsole, _features2) {
+ 'use strict';
+
+ exports._warnIfUsingStrippedFeatureFlags = exports.getDebugFunction = exports.setDebugFunction = exports.deprecateFunc = exports.runInDebug = exports.debugFreeze = exports.debugSeal = exports.deprecate = exports.debug = exports.warn = exports.info = exports.assert = exports.setTesting = exports.isTesting = exports.Error = exports.isFeatureEnabled = exports.registerDeprecationHandler = exports.registerWarnHandler = undefined;
+ Object.defineProperty(exports, 'registerWarnHandler', {
+ enumerable: true,
+ get: function () {
+ return _warn2.registerHandler;
+ }
+ });
+ Object.defineProperty(exports, 'registerDeprecationHandler', {
+ enumerable: true,
+ get: function () {
+ return _deprecate2.registerHandler;
+ }
+ });
+ Object.defineProperty(exports, 'isFeatureEnabled', {
+ enumerable: true,
+ get: function () {
+ return _features.default;
+ }
+ });
+ Object.defineProperty(exports, 'Error', {
+ enumerable: true,
+ get: function () {
+ return _error.default;
+ }
+ });
+ Object.defineProperty(exports, 'isTesting', {
+ enumerable: true,
+ get: function () {
+ return _testing.isTesting;
+ }
+ });
+ Object.defineProperty(exports, 'setTesting', {
+ enumerable: true,
+ get: function () {
+ return _testing.setTesting;
+ }
+ });
+ var DEFAULT_FEATURES = _features2.DEFAULT_FEATURES,
+ FEATURES = _features2.FEATURES;
+
+
+ // These are the default production build versions:
+ var noop = function () {};
+
+ var assert = noop;
+ var info = noop;
+ var warn = noop;
+ var debug = noop;
+ var deprecate = noop;
+ var debugSeal = noop;
+ var debugFreeze = noop;
+ var runInDebug = noop;
+ var setDebugFunction = noop;
+ var getDebugFunction = noop;
+
+ var deprecateFunc = function () {
+ return arguments[arguments.length - 1];
+ };
+
+ if (true) {
+ exports.setDebugFunction = setDebugFunction = function (type, callback) {
+ switch (type) {
+ case 'assert':
+ return exports.assert = assert = callback;
+ case 'info':
+ return exports.info = info = callback;
+ case 'warn':
+ return exports.warn = warn = callback;
+ case 'debug':
+ return exports.debug = debug = callback;
+ case 'deprecate':
+ return exports.deprecate = deprecate = callback;
+ case 'debugSeal':
+ return exports.debugSeal = debugSeal = callback;
+ case 'debugFreeze':
+ return exports.debugFreeze = debugFreeze = callback;
+ case 'runInDebug':
+ return exports.runInDebug = runInDebug = callback;
+ case 'deprecateFunc':
+ return exports.deprecateFunc = deprecateFunc = callback;
+ }
+ };
+
+ exports.getDebugFunction = getDebugFunction = function (type) {
+ switch (type) {
+ case 'assert':
+ return assert;
+ case 'info':
+ return info;
+ case 'warn':
+ return warn;
+ case 'debug':
+ return debug;
+ case 'deprecate':
+ return deprecate;
+ case 'debugSeal':
+ return debugSeal;
+ case 'debugFreeze':
+ return debugFreeze;
+ case 'runInDebug':
+ return runInDebug;
+ case 'deprecateFunc':
+ return deprecateFunc;
+ }
+ };
+ }
+
+ /**
+ @module @ember/debug
+ */
+
+ if (true) {
+ /**
+ Define an assertion that will throw an exception if the condition is not met.
+ * In a production build, this method is defined as an empty function (NOP).
+ Uses of this method in Ember itself are stripped from the ember.prod.js build.
+ ```javascript
+ import { assert } from '@ember/debug';
+ // Test for truthiness
+ assert('Must pass a valid object', obj);
+ // Fail unconditionally
+ assert('This code path should never be run');
+ ```
+ @method assert
+ @static
+ @for @ember/debug
+ @param {String} desc A description of the assertion. This will become
+ the text of the Error thrown if the assertion fails.
+ @param {Boolean} test Must be truthy for the assertion to pass. If
+ falsy, an exception will be thrown.
+ @public
+ @since 1.0.0
+ */
+ setDebugFunction('assert', function assert(desc, test) {
+ if (!test) {
+ throw new _error.default('Assertion Failed: ' + desc);
+ }
+ });
+
+ /**
+ Display a debug notice.
+ * In a production build, this method is defined as an empty function (NOP).
+ Uses of this method in Ember itself are stripped from the ember.prod.js build.
+ ```javascript
+ import { debug } from '@ember/debug';
+ debug('I\'m a debug notice!');
+ ```
+ @method debug
+ @for @ember/debug
+ @static
+ @param {String} message A debug message to display.
+ @public
+ */
+ setDebugFunction('debug', function debug(message) {
+ _emberConsole.default.debug('DEBUG: ' + message);
+ });
+
+ /**
+ Display an info notice.
+ * In a production build, this method is defined as an empty function (NOP).
+ Uses of this method in Ember itself are stripped from the ember.prod.js build.
+ @method info
+ @private
+ */
+ setDebugFunction('info', function info() {
+ _emberConsole.default.info.apply(undefined, arguments);
+ });
+
+ /**
+ @module @ember/application
+ @public
+ */
+
+ /**
+ Alias an old, deprecated method with its new counterpart.
+ Display a deprecation warning with the provided message and a stack trace
+ (Chrome and Firefox only) when the assigned method is called.
+ * In a production build, this method is defined as an empty function (NOP).
+ ```javascript
+ import { deprecateFunc } from '@ember/application/deprecations';
+ Ember.oldMethod = deprecateFunc('Please use the new, updated method', options, Ember.newMethod);
+ ```
+ @method deprecateFunc
+ @static
+ @for @ember/application/deprecations
+ @param {String} message A description of the deprecation.
+ @param {Object} [options] The options object for `deprecate`.
+ @param {Function} func The new function called to replace its deprecated counterpart.
+ @return {Function} A new function that wraps the original function with a deprecation warning
+ @private
+ */
+ setDebugFunction('deprecateFunc', function deprecateFunc() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ if (args.length === 3) {
+ var message = args[0],
+ options = args[1],
+ func = args[2];
+
+ return function () {
+ deprecate(message, false, options);
+ return func.apply(this, arguments);
+ };
+ } else {
+ var _message = args[0],
+ _func = args[1];
+
+ return function () {
+ deprecate(_message);
+ return _func.apply(this, arguments);
+ };
+ }
+ });
+
+ /**
+ @module @ember/debug
+ @public
+ */
+ /**
+ Run a function meant for debugging.
+ * In a production build, this method is defined as an empty function (NOP).
+ Uses of this method in Ember itself are stripped from the ember.prod.js build.
+ ```javascript
+ import Component from '@ember/component';
+ import { runInDebug } from '@ember/debug';
+ runInDebug(() => {
+ Component.reopen({
+ didInsertElement() {
+ console.log("I'm happy");
+ }
+ });
+ });
+ ```
+ @method runInDebug
+ @for @ember/debug
+ @static
+ @param {Function} func The function to be executed.
+ @since 1.5.0
+ @public
+ */
+ setDebugFunction('runInDebug', function runInDebug(func) {
+ func();
+ });
+
+ setDebugFunction('debugSeal', function debugSeal(obj) {
+ Object.seal(obj);
+ });
+
+ setDebugFunction('debugFreeze', function debugFreeze(obj) {
+ Object.freeze(obj);
+ });
+
+ setDebugFunction('deprecate', _deprecate2.default);
+
+ setDebugFunction('warn', _warn2.default);
+ }
+
+ var _warnIfUsingStrippedFeatureFlags = void 0;
+
+ if (true && !(0, _testing.isTesting)()) {
+ /**
+ Will call `warn()` if ENABLE_OPTIONAL_FEATURES or
+ any specific FEATURES flag is truthy.
+ This method is called automatically in debug canary builds.
+ @private
+ @method _warnIfUsingStrippedFeatureFlags
+ @return {void}
+ */
+ exports._warnIfUsingStrippedFeatureFlags = _warnIfUsingStrippedFeatureFlags = function _warnIfUsingStrippedFeatureFlags(FEATURES, knownFeatures, featuresWereStripped) {
+ if (featuresWereStripped) {
+ warn('Ember.ENV.ENABLE_OPTIONAL_FEATURES is only available in canary builds.', !_emberEnvironment.ENV.ENABLE_OPTIONAL_FEATURES, { id: 'ember-debug.feature-flag-with-features-stripped' });
+
+ var keys = Object.keys(FEATURES || {});
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];
+ if (key === 'isEnabled' || !(key in knownFeatures)) {
+ continue;
+ }
+
+ warn('FEATURE["' + key + '"] is set as enabled, but FEATURE flags are only available in canary builds.', !FEATURES[key], { id: 'ember-debug.feature-flag-with-features-stripped' });
+ }
+ }
+ };
+
+ // Complain if they're using FEATURE flags in builds other than canary
+ FEATURES['features-stripped-test'] = true;
+ var featuresWereStripped = true;
+
+ if ((0, _features.default)('features-stripped-test')) {
+ featuresWereStripped = false;
+ }
+
+ delete FEATURES['features-stripped-test'];
+ _warnIfUsingStrippedFeatureFlags(_emberEnvironment.ENV.FEATURES, DEFAULT_FEATURES, featuresWereStripped);
+
+ // Inform the developer about the Ember Inspector if not installed.
+ var isFirefox = _emberEnvironment.environment.isFirefox;
+ var isChrome = _emberEnvironment.environment.isChrome;
+
+ if (typeof window !== 'undefined' && (isFirefox || isChrome) && window.addEventListener) {
+ window.addEventListener('load', function () {
+ if (document.documentElement && document.documentElement.dataset && !document.documentElement.dataset.emberExtension) {
+ var downloadURL = void 0;
+
+ if (isChrome) {
+ downloadURL = 'https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi';
+ } else if (isFirefox) {
+ downloadURL = 'https://addons.mozilla.org/en-US/firefox/addon/ember-inspector/';
+ }
+
+ debug('For more advanced debugging, install the Ember Inspector from ' + downloadURL);
+ }
+ }, false);
+ }
+ }
+
+ exports.assert = assert;
+ exports.info = info;
+ exports.warn = warn;
+ exports.debug = debug;
+ exports.deprecate = deprecate;
+ exports.debugSeal = debugSeal;
+ exports.debugFreeze = debugFreeze;
+ exports.runInDebug = runInDebug;
+ exports.deprecateFunc = deprecateFunc;
+ exports.setDebugFunction = setDebugFunction;
+ exports.getDebugFunction = getDebugFunction;
+ exports._warnIfUsingStrippedFeatureFlags = _warnIfUsingStrippedFeatureFlags;
+});
+enifed("ember-debug/testing", ["exports"], function (exports) {
+ "use strict";
+
+ exports.isTesting = isTesting;
+ exports.setTesting = setTesting;
+ var testing = false;
+
+ function isTesting() {
+ return testing;
+ }
+
+ function setTesting(value) {
+ testing = !!value;
+ }
+});
+enifed('ember-debug/warn', ['exports', 'ember-environment', 'ember-console', 'ember-debug/deprecate', 'ember-debug/index', 'ember-debug/handlers'], function (exports, _emberEnvironment, _emberConsole, _deprecate, _index, _handlers) {
+ 'use strict';
+
+ exports.missingOptionsDeprecation = exports.missingOptionsIdDeprecation = exports.registerHandler = undefined;
+
+
+ var registerHandler = function () {};
+ var warn = function () {};
+ var missingOptionsDeprecation = void 0,
+ missingOptionsIdDeprecation = void 0;
+
+ /**
+ @module @ember/debug
+ */
+
+ if (true) {
+ /**
+ Allows for runtime registration of handler functions that override the default warning behavior.
+ Warnings are invoked by calls made to [@ember/debug/warn](https://emberjs.com/api/ember/release/classes/@ember%2Fdebug/methods/warn?anchor=warn).
+ The following example demonstrates its usage by registering a handler that does nothing overriding Ember's
+ default warning behavior.
+ ```javascript
+ import { registerWarnHandler } from '@ember/debug';
+ // next is not called, so no warnings get the default behavior
+ registerWarnHandler(() => {});
+ ```
+ The handler function takes the following arguments:
+ <ul>
+ <li> <code>message</code> - The message received from the warn call. </li>
+ <li> <code>options</code> - An object passed in with the warn call containing additional information including:</li>
+ <ul>
+ <li> <code>id</code> - An id of the warning in the form of <code>package-name.specific-warning</code>.</li>
+ </ul>
+ <li> <code>next</code> - A function that calls into the previously registered handler.</li>
+ </ul>
+ @public
+ @static
+ @method registerWarnHandler
+ @for @ember/debug
+ @param handler {Function} A function to handle warnings.
+ @since 2.1.0
+ */
+ exports.registerHandler = registerHandler = function registerHandler(handler) {
+ (0, _handlers.registerHandler)('warn', handler);
+ };
+
+ registerHandler(function logWarning(message) {
+ _emberConsole.default.warn('WARNING: ' + message);
+ if ('trace' in _emberConsole.default) {
+ _emberConsole.default.trace();
+ }
+ });
+
+ exports.missingOptionsDeprecation = missingOptionsDeprecation = 'When calling `warn` you ' + 'must provide an `options` hash as the third parameter. ' + '`options` should include an `id` property.';
+ exports.missingOptionsIdDeprecation = missingOptionsIdDeprecation = 'When calling `warn` you must provide `id` in options.';
+
+ /**
+ Display a warning with the provided message.
+ * In a production build, this method is defined as an empty function (NOP).
+ Uses of this method in Ember itself are stripped from the ember.prod.js build.
+ @method warn
+ @for @ember/debug
+ @static
+ @param {String} message A warning to display.
+ @param {Boolean} test An optional boolean. If falsy, the warning
+ will be displayed.
+ @param {Object} options An object that can be used to pass a unique
+ `id` for this warning. The `id` can be used by Ember debugging tools
+ to change the behavior (raise, log, or silence) for that specific warning.
+ The `id` should be namespaced by dots, e.g. "ember-debug.feature-flag-with-features-stripped"
+ @public
+ @since 1.0.0
+ */
+ warn = function warn(message, test, options) {
+ if (arguments.length === 2 && typeof test === 'object') {
+ options = test;
+ test = false;
+ }
+
+ if (_emberEnvironment.ENV._ENABLE_WARN_OPTIONS_SUPPORT !== true) {
+ (0, _index.assert)(missingOptionsDeprecation, options);
+ (0, _index.assert)(missingOptionsIdDeprecation, options && options.id);
+ }
+
+ if (!options && _emberEnvironment.ENV._ENABLE_WARN_OPTIONS_SUPPORT === true) {
+ (0, _deprecate.default)(missingOptionsDeprecation, false, {
+ id: 'ember-debug.warn-options-missing',
+ until: '3.0.0',
+ url: 'https://emberjs.com/deprecations/v2.x/#toc_ember-debug-function-options'
+ });
+ }
+
+ if (options && !options.id && _emberEnvironment.ENV._ENABLE_WARN_OPTIONS_SUPPORT === true) {
+ (0, _deprecate.default)(missingOptionsIdDeprecation, false, {
+ id: 'ember-debug.warn-id-missing',
+ until: '3.0.0',
+ url: 'https://emberjs.com/deprecations/v2.x/#toc_ember-debug-function-options'
+ });
+ }
+
+ (0, _handlers.invoke)('warn', message, test, options);
+ };
+ }
+
+ exports.default = warn;
+ exports.registerHandler = registerHandler;
+ exports.missingOptionsIdDeprecation = missingOptionsIdDeprecation;
+ exports.missingOptionsDeprecation = missingOptionsDeprecation;
+});
+enifed('ember-testing/adapters/adapter', ['exports', 'ember-runtime'], function (exports, _emberRuntime) {
+ 'use strict';
+
+ function K() {
+ return this;
+ }
+
+ /**
+ @module @ember/test
+ */
+
+ /**
+ The primary purpose of this class is to create hooks that can be implemented
+ by an adapter for various test frameworks.
+
+ @class TestAdapter
+ @public
+ */
+ exports.default = _emberRuntime.Object.extend({
+ /**
+ This callback will be called whenever an async operation is about to start.
+ Override this to call your framework's methods that handle async
+ operations.
+ @public
+ @method asyncStart
+ */
+ asyncStart: K,
+
+ /**
+ This callback will be called whenever an async operation has completed.
+ @public
+ @method asyncEnd
+ */
+ asyncEnd: K,
+
+ /**
+ Override this method with your testing framework's false assertion.
+ This function is called whenever an exception occurs causing the testing
+ promise to fail.
+ QUnit example:
+ ```javascript
+ exception: function(error) {
+ ok(false, error);
+ };
+ ```
+ @public
+ @method exception
+ @param {String} error The exception to be raised.
+ */
+ exception: function (error) {
+ throw error;
+ }
+ });
+});
+enifed('ember-testing/adapters/qunit', ['exports', 'ember-utils', 'ember-testing/adapters/adapter'], function (exports, _emberUtils, _adapter) {
+ 'use strict';
+
+ exports.default = _adapter.default.extend({
+ asyncStart: function () {
+ QUnit.stop();
+ },
+ asyncEnd: function () {
+ QUnit.start();
+ },
+ exception: function (error) {
+ QUnit.config.current.assert.ok(false, (0, _emberUtils.inspect)(error));
+ }
+ });
+});
+enifed('ember-testing/events', ['exports', 'ember-views', 'ember-metal'], function (exports, _emberViews, _emberMetal) {
+ 'use strict';
+
+ exports.focus = focus;
+ exports.fireEvent = fireEvent;
+
+
+ var DEFAULT_EVENT_OPTIONS = { canBubble: true, cancelable: true };
+ var KEYBOARD_EVENT_TYPES = ['keydown', 'keypress', 'keyup'];
+ var MOUSE_EVENT_TYPES = ['click', 'mousedown', 'mouseup', 'dblclick', 'mouseenter', 'mouseleave', 'mousemove', 'mouseout', 'mouseover'];
+
+ function focus(el) {
+ if (!el) {
+ return;
+ }
+ var $el = (0, _emberViews.jQuery)(el);
+ if ($el.is(':input, [contenteditable=true]')) {
+ var type = $el.prop('type');
+ if (type !== 'checkbox' && type !== 'radio' && type !== 'hidden') {
+ (0, _emberMetal.run)(null, function () {
+ // Firefox does not trigger the `focusin` event if the window
+ // does not have focus. If the document doesn't have focus just
+ // use trigger('focusin') instead.
+
+ if (!document.hasFocus || document.hasFocus()) {
+ el.focus();
+ } else {
+ $el.trigger('focusin');
+ }
+ });
+ }
+ }
+ }
+
+ function fireEvent(element, type) {
+ var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
+
+ if (!element) {
+ return;
+ }
+ var event = void 0;
+ if (KEYBOARD_EVENT_TYPES.indexOf(type) > -1) {
+ event = buildKeyboardEvent(type, options);
+ } else if (MOUSE_EVENT_TYPES.indexOf(type) > -1) {
+ var rect = element.getBoundingClientRect();
+ var x = rect.left + 1;
+ var y = rect.top + 1;
+ var simulatedCoordinates = {
+ screenX: x + 5,
+ screenY: y + 95,
+ clientX: x,
+ clientY: y
+ };
+ event = buildMouseEvent(type, _emberViews.jQuery.extend(simulatedCoordinates, options));
+ } else {
+ event = buildBasicEvent(type, options);
+ }
+ element.dispatchEvent(event);
+ }
+
+ function buildBasicEvent(type) {
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ var event = document.createEvent('Events');
+ event.initEvent(type, true, true);
+ _emberViews.jQuery.extend(event, options);
+ return event;
+ }
+
+ function buildMouseEvent(type) {
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ var event = void 0;
+ try {
+ event = document.createEvent('MouseEvents');
+ var eventOpts = _emberViews.jQuery.extend({}, DEFAULT_EVENT_OPTIONS, options);
+ event.initMouseEvent(type, eventOpts.canBubble, eventOpts.cancelable, window, eventOpts.detail, eventOpts.screenX, eventOpts.screenY, eventOpts.clientX, eventOpts.clientY, eventOpts.ctrlKey, eventOpts.altKey, eventOpts.shiftKey, eventOpts.metaKey, eventOpts.button, eventOpts.relatedTarget);
+ } catch (e) {
+ event = buildBasicEvent(type, options);
+ }
+ return event;
+ }
+
+ function buildKeyboardEvent(type) {
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ var event = void 0;
+ try {
+ event = document.createEvent('KeyEvents');
+ var eventOpts = _emberViews.jQuery.extend({}, DEFAULT_EVENT_OPTIONS, options);
+ event.initKeyEvent(type, eventOpts.canBubble, eventOpts.cancelable, window, eventOpts.ctrlKey, eventOpts.altKey, eventOpts.shiftKey, eventOpts.metaKey, eventOpts.keyCode, eventOpts.charCode);
+ } catch (e) {
+ event = buildBasicEvent(type, options);
+ }
+ return event;
+ }
+});
+enifed('ember-testing/ext/application', ['ember-application', 'ember-testing/setup_for_testing', 'ember-testing/test/helpers', 'ember-testing/test/promise', 'ember-testing/test/run', 'ember-testing/test/on_inject_helpers', 'ember-testing/test/adapter'], function (_emberApplication, _setup_for_testing, _helpers, _promise, _run, _on_inject_helpers, _adapter) {
+ 'use strict';
+
+ _emberApplication.Application.reopen({
+ /**
+ This property contains the testing helpers for the current application. These
+ are created once you call `injectTestHelpers` on your `Application`
+ instance. The included helpers are also available on the `window` object by
+ default, but can be used from this object on the individual application also.
+ @property testHelpers
+ @type {Object}
+ @default {}
+ @public
+ */
+ testHelpers: {},
+
+ /**
+ This property will contain the original methods that were registered
+ on the `helperContainer` before `injectTestHelpers` is called.
+ When `removeTestHelpers` is called, these methods are restored to the
+ `helperContainer`.
+ @property originalMethods
+ @type {Object}
+ @default {}
+ @private
+ @since 1.3.0
+ */
+ originalMethods: {},
+
+ /**
+ This property indicates whether or not this application is currently in
+ testing mode. This is set when `setupForTesting` is called on the current
+ application.
+ @property testing
+ @type {Boolean}
+ @default false
+ @since 1.3.0
+ @public
+ */
+ testing: false,
+
+ setupForTesting: function () {
+ (0, _setup_for_testing.default)();
+
+ this.testing = true;
+
+ this.resolveRegistration('router:main').reopen({
+ location: 'none'
+ });
+ },
+
+
+ /**
+ This will be used as the container to inject the test helpers into. By
+ default the helpers are injected into `window`.
+ @property helperContainer
+ @type {Object} The object to be used for test helpers.
+ @default window
+ @since 1.2.0
+ @private
+ */
+ helperContainer: null,
+
+ injectTestHelpers: function (helperContainer) {
+ if (helperContainer) {
+ this.helperContainer = helperContainer;
+ } else {
+ this.helperContainer = window;
+ }
+
+ this.reopen({
+ willDestroy: function () {
+ this._super.apply(this, arguments);
+ this.removeTestHelpers();
+ }
+ });
+
+ this.testHelpers = {};
+ for (var name in _helpers.helpers) {
+ this.originalMethods[name] = this.helperContainer[name];
+ this.testHelpers[name] = this.helperContainer[name] = helper(this, name);
+ protoWrap(_promise.default.prototype, name, helper(this, name), _helpers.helpers[name].meta.wait);
+ }
+
+ (0, _on_inject_helpers.invokeInjectHelpersCallbacks)(this);
+ },
+ removeTestHelpers: function () {
+ if (!this.helperContainer) {
+ return;
+ }
+
+ for (var name in _helpers.helpers) {
+ this.helperContainer[name] = this.originalMethods[name];
+ delete _promise.default.prototype[name];
+ delete this.testHelpers[name];
+ delete this.originalMethods[name];
+ }
+ }
+ });
+
+ // This method is no longer needed
+ // But still here for backwards compatibility
+ // of helper chaining
+ function protoWrap(proto, name, callback, isAsync) {
+ proto[name] = function () {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ if (isAsync) {
+ return callback.apply(this, args);
+ } else {
+ return this.then(function () {
+ return callback.apply(this, args);
+ });
+ }
+ };
+ }
+
+ function helper(app, name) {
+ var fn = _helpers.helpers[name].method;
+ var meta = _helpers.helpers[name].meta;
+ if (!meta.wait) {
+ return function () {
+ for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+ args[_key2] = arguments[_key2];
+ }
+
+ return fn.apply(app, [app].concat(args));
+ };
+ }
+
+ return function () {
+ for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
+ args[_key3] = arguments[_key3];
+ }
+
+ var lastPromise = (0, _run.default)(function () {
+ return (0, _promise.resolve)((0, _promise.getLastPromise)());
+ });
+
+ // wait for last helper's promise to resolve and then
+ // execute. To be safe, we need to tell the adapter we're going
+ // asynchronous here, because fn may not be invoked before we
+ // return.
+ (0, _adapter.asyncStart)();
+ return lastPromise.then(function () {
+ return fn.apply(app, [app].concat(args));
+ }).finally(_adapter.asyncEnd);
+ };
+ }
+});
+enifed('ember-testing/ext/rsvp', ['exports', 'ember-runtime', 'ember-metal', 'ember-debug', 'ember-testing/test/adapter'], function (exports, _emberRuntime, _emberMetal, _emberDebug, _adapter) {
+ 'use strict';
+
+ _emberRuntime.RSVP.configure('async', function (callback, promise) {
+ // if schedule will cause autorun, we need to inform adapter
+ if ((0, _emberDebug.isTesting)() && !_emberMetal.run.backburner.currentInstance) {
+ (0, _adapter.asyncStart)();
+ _emberMetal.run.backburner.schedule('actions', function () {
+ (0, _adapter.asyncEnd)();
+ callback(promise);
+ });
+ } else {
+ _emberMetal.run.backburner.schedule('actions', function () {
+ return callback(promise);
+ });
+ }
+ });
+
+ exports.default = _emberRuntime.RSVP;
+});
+enifed('ember-testing/helpers', ['ember-testing/test/helpers', 'ember-testing/helpers/and_then', 'ember-testing/helpers/click', 'ember-testing/helpers/current_path', 'ember-testing/helpers/current_route_name', 'ember-testing/helpers/current_url', 'ember-testing/helpers/fill_in', 'ember-testing/helpers/find', 'ember-testing/helpers/find_with_assert', 'ember-testing/helpers/key_event', 'ember-testing/helpers/pause_test', 'ember-testing/helpers/trigger_event', 'ember-testing/helpers/visit', 'ember-testing/helpers/wait'], function (_helpers, _and_then, _click, _current_path, _current_route_name, _current_url, _fill_in, _find, _find_with_assert, _key_event, _pause_test, _trigger_event, _visit, _wait) {
+ 'use strict';
+
+ (0, _helpers.registerAsyncHelper)('visit', _visit.default);
+ (0, _helpers.registerAsyncHelper)('click', _click.default);
+ (0, _helpers.registerAsyncHelper)('keyEvent', _key_event.default);
+ (0, _helpers.registerAsyncHelper)('fillIn', _fill_in.default);
+ (0, _helpers.registerAsyncHelper)('wait', _wait.default);
+ (0, _helpers.registerAsyncHelper)('andThen', _and_then.default);
+ (0, _helpers.registerAsyncHelper)('pauseTest', _pause_test.pauseTest);
+ (0, _helpers.registerAsyncHelper)('triggerEvent', _trigger_event.default);
+
+ (0, _helpers.registerHelper)('find', _find.default);
+ (0, _helpers.registerHelper)('findWithAssert', _find_with_assert.default);
+ (0, _helpers.registerHelper)('currentRouteName', _current_route_name.default);
+ (0, _helpers.registerHelper)('currentPath', _current_path.default);
+ (0, _helpers.registerHelper)('currentURL', _current_url.default);
+ (0, _helpers.registerHelper)('resumeTest', _pause_test.resumeTest);
+});
+enifed("ember-testing/helpers/and_then", ["exports"], function (exports) {
+ "use strict";
+
+ exports.default = andThen;
+ function andThen(app, callback) {
+ return app.testHelpers.wait(callback(app));
+ }
+});
+enifed('ember-testing/helpers/click', ['exports', 'ember-testing/events'], function (exports, _events) {
+ 'use strict';
+
+ exports.default = click;
+
+
+ /**
+ Clicks an element and triggers any actions triggered by the element's `click`
+ event.
+
+ Example:
+
+ ```javascript
+ click('.some-jQuery-selector').then(function() {
+ // assert something
+ });
+ ```
+
+ @method click
+ @param {String} selector jQuery selector for finding element on the DOM
+ @param {Object} context A DOM Element, Document, or jQuery to use as context
+ @return {RSVP.Promise<undefined>}
+ @public
+ */
+ function click(app, selector, context) {
+ var $el = app.testHelpers.findWithAssert(selector, context);
+ var el = $el[0];
+
+ (0, _events.fireEvent)(el, 'mousedown');
+
+ (0, _events.focus)(el);
+
+ (0, _events.fireEvent)(el, 'mouseup');
+ (0, _events.fireEvent)(el, 'click');
+
+ return app.testHelpers.wait();
+ } /**
+ @module ember
+ */
+});
+enifed('ember-testing/helpers/current_path', ['exports', 'ember-metal'], function (exports, _emberMetal) {
+ 'use strict';
+
+ exports.default = currentPath;
+
+
+ /**
+ Returns the current path.
+
+ Example:
+
+ ```javascript
+ function validateURL() {
+ equal(currentPath(), 'some.path.index', "correct path was transitioned into.");
+ }
+
+ click('#some-link-id').then(validateURL);
+ ```
+
+ @method currentPath
+ @return {Object} The currently active path.
+ @since 1.5.0
+ @public
+ */
+ function currentPath(app) {
+ var routingService = app.__container__.lookup('service:-routing');
+ return (0, _emberMetal.get)(routingService, 'currentPath');
+ } /**
+ @module ember
+ */
+});
+enifed('ember-testing/helpers/current_route_name', ['exports', 'ember-metal'], function (exports, _emberMetal) {
+ 'use strict';
+
+ exports.default = currentRouteName;
+
+ /**
+ Returns the currently active route name.
+
+ Example:
+
+ ```javascript
+ function validateRouteName() {
+ equal(currentRouteName(), 'some.path', "correct route was transitioned into.");
+ }
+ visit('/some/path').then(validateRouteName)
+ ```
+
+ @method currentRouteName
+ @return {Object} The name of the currently active route.
+ @since 1.5.0
+ @public
+ */
+ function currentRouteName(app) {
+ var routingService = app.__container__.lookup('service:-routing');
+ return (0, _emberMetal.get)(routingService, 'currentRouteName');
+ } /**
+ @module ember
+ */
+});
+enifed('ember-testing/helpers/current_url', ['exports', 'ember-metal'], function (exports, _emberMetal) {
+ 'use strict';
+
+ exports.default = currentURL;
+
+
+ /**
+ Returns the current URL.
+
+ Example:
+
+ ```javascript
+ function validateURL() {
+ equal(currentURL(), '/some/path', "correct URL was transitioned into.");
+ }
+
+ click('#some-link-id').then(validateURL);
+ ```
+
+ @method currentURL
+ @return {Object} The currently active URL.
+ @since 1.5.0
+ @public
+ */
+ function currentURL(app) {
+ var router = app.__container__.lookup('router:main');
+ return (0, _emberMetal.get)(router, 'location').getURL();
+ } /**
+ @module ember
+ */
+});
+enifed('ember-testing/helpers/fill_in', ['exports', 'ember-testing/events'], function (exports, _events) {
+ 'use strict';
+
+ exports.default = fillIn;
+
+
+ /**
+ Fills in an input element with some text.
+
+ Example:
+
+ ```javascript
+ fillIn('#email', 'you@example.com').then(function() {
+ // assert something
+ });
+ ```
+
+ @method fillIn
+ @param {String} selector jQuery selector finding an input element on the DOM
+ to fill text with
+ @param {String} text text to place inside the input element
+ @return {RSVP.Promise<undefined>}
+ @public
+ */
+ function fillIn(app, selector, contextOrText, text) {
+ var $el = void 0,
+ el = void 0,
+ context = void 0;
+ if (text === undefined) {
+ text = contextOrText;
+ } else {
+ context = contextOrText;
+ }
+ $el = app.testHelpers.findWithAssert(selector, context);
+ el = $el[0];
+ (0, _events.focus)(el);
+
+ $el.eq(0).val(text);
+ (0, _events.fireEvent)(el, 'input');
+ (0, _events.fireEvent)(el, 'change');
+
+ return app.testHelpers.wait();
+ } /**
+ @module ember
+ */
+});
+enifed('ember-testing/helpers/find', ['exports', 'ember-metal'], function (exports, _emberMetal) {
+ 'use strict';
+
+ exports.default = find;
+
+
+ /**
+ Finds an element in the context of the app's container element. A simple alias
+ for `app.$(selector)`.
+
+ Example:
+
+ ```javascript
+ var $el = find('.my-selector');
+ ```
+
+ With the `context` param:
+
+ ```javascript
+ var $el = find('.my-selector', '.parent-element-class');
+ ```
+
+ @method find
+ @param {String} selector jQuery string selector for element lookup
+ @param {String} [context] (optional) jQuery selector that will limit the selector
+ argument to find only within the context's children
+ @return {Object} jQuery object representing the results of the query
+ @public
+ */
+ function find(app, selector, context) {
+ var $el = void 0;
+ context = context || (0, _emberMetal.get)(app, 'rootElement');
+ $el = app.$(selector, context);
+ return $el;
+ } /**
+ @module ember
+ */
+});
+enifed('ember-testing/helpers/find_with_assert', ['exports'], function (exports) {
+ 'use strict';
+
+ exports.default = findWithAssert;
+ /**
+ @module ember
+ */
+ /**
+ Like `find`, but throws an error if the element selector returns no results.
+
+ Example:
+
+ ```javascript
+ var $el = findWithAssert('.doesnt-exist'); // throws error
+ ```
+
+ With the `context` param:
+
+ ```javascript
+ var $el = findWithAssert('.selector-id', '.parent-element-class'); // assert will pass
+ ```
+
+ @method findWithAssert
+ @param {String} selector jQuery selector string for finding an element within
+ the DOM
+ @param {String} [context] (optional) jQuery selector that will limit the
+ selector argument to find only within the context's children
+ @return {Object} jQuery object representing the results of the query
+ @throws {Error} throws error if jQuery object returned has a length of 0
+ @public
+ */
+ function findWithAssert(app, selector, context) {
+ var $el = app.testHelpers.find(selector, context);
+ if ($el.length === 0) {
+ throw new Error('Element ' + selector + ' not found.');
+ }
+ return $el;
+ }
+});
+enifed("ember-testing/helpers/key_event", ["exports"], function (exports) {
+ "use strict";
+
+ exports.default = keyEvent;
+ /**
+ @module ember
+ */
+ /**
+ Simulates a key event, e.g. `keypress`, `keydown`, `keyup` with the desired keyCode
+ Example:
+ ```javascript
+ keyEvent('.some-jQuery-selector', 'keypress', 13).then(function() {
+ // assert something
+ });
+ ```
+ @method keyEvent
+ @param {String} selector jQuery selector for finding element on the DOM
+ @param {String} type the type of key event, e.g. `keypress`, `keydown`, `keyup`
+ @param {Number} keyCode the keyCode of the simulated key event
+ @return {RSVP.Promise<undefined>}
+ @since 1.5.0
+ @public
+ */
+ function keyEvent(app, selector, contextOrType, typeOrKeyCode, keyCode) {
+ var context = void 0,
+ type = void 0;
+
+ if (keyCode === undefined) {
+ context = null;
+ keyCode = typeOrKeyCode;
+ type = contextOrType;
+ } else {
+ context = contextOrType;
+ type = typeOrKeyCode;
+ }
+
+ return app.testHelpers.triggerEvent(selector, context, type, { keyCode: keyCode, which: keyCode });
+ }
+});
+enifed('ember-testing/helpers/pause_test', ['exports', 'ember-runtime', 'ember-console', 'ember-debug'], function (exports, _emberRuntime, _emberConsole, _emberDebug) {
+ 'use strict';
+
+ exports.resumeTest = resumeTest;
+ exports.pauseTest = pauseTest;
+
+
+ var resume = void 0;
+
+ /**
+ Resumes a test paused by `pauseTest`.
+
+ @method resumeTest
+ @return {void}
+ @public
+ */
+ /**
+ @module ember
+ */
+ function resumeTest() {
+ (true && !(resume) && (0, _emberDebug.assert)('Testing has not been paused. There is nothing to resume.', resume));
+
+ resume();
+ resume = undefined;
+ }
+
+ /**
+ Pauses the current test - this is useful for debugging while testing or for test-driving.
+ It allows you to inspect the state of your application at any point.
+ Example (The test will pause before clicking the button):
+
+ ```javascript
+ visit('/')
+ return pauseTest();
+ click('.btn');
+ ```
+
+ You may want to turn off the timeout before pausing.
+
+ qunit (as of 2.4.0):
+
+ ```
+ visit('/');
+ assert.timeout(0);
+ return pauseTest();
+ click('.btn');
+ ```
+
+ mocha:
+
+ ```
+ visit('/');
+ this.timeout(0);
+ return pauseTest();
+ click('.btn');
+ ```
+
+
+ @since 1.9.0
+ @method pauseTest
+ @return {Object} A promise that will never resolve
+ @public
+ */
+ function pauseTest() {
+ _emberConsole.default.info('Testing paused. Use `resumeTest()` to continue.');
+
+ return new _emberRuntime.RSVP.Promise(function (resolve) {
+ resume = resolve;
+ }, 'TestAdapter paused promise');
+ }
+});
+enifed('ember-testing/helpers/trigger_event', ['exports', 'ember-testing/events'], function (exports, _events) {
+ 'use strict';
+
+ exports.default = triggerEvent;
+
+ /**
+ Triggers the given DOM event on the element identified by the provided selector.
+ Example:
+ ```javascript
+ triggerEvent('#some-elem-id', 'blur');
+ ```
+ This is actually used internally by the `keyEvent` helper like so:
+ ```javascript
+ triggerEvent('#some-elem-id', 'keypress', { keyCode: 13 });
+ ```
+ @method triggerEvent
+ @param {String} selector jQuery selector for finding element on the DOM
+ @param {String} [context] jQuery selector that will limit the selector
+ argument to find only within the context's children
+ @param {String} type The event type to be triggered.
+ @param {Object} [options] The options to be passed to jQuery.Event.
+ @return {RSVP.Promise<undefined>}
+ @since 1.5.0
+ @public
+ */
+ function triggerEvent(app, selector, contextOrType, typeOrOptions, possibleOptions) {
+ var arity = arguments.length;
+ var context = void 0,
+ type = void 0,
+ options = void 0;
+
+ if (arity === 3) {
+ // context and options are optional, so this is
+ // app, selector, type
+ context = null;
+ type = contextOrType;
+ options = {};
+ } else if (arity === 4) {
+ // context and options are optional, so this is
+ if (typeof typeOrOptions === 'object') {
+ // either
+ // app, selector, type, options
+ context = null;
+ type = contextOrType;
+ options = typeOrOptions;
+ } else {
+ // or
+ // app, selector, context, type
+ context = contextOrType;
+ type = typeOrOptions;
+ options = {};
+ }
+ } else {
+ context = contextOrType;
+ type = typeOrOptions;
+ options = possibleOptions;
+ }
+
+ var $el = app.testHelpers.findWithAssert(selector, context);
+ var el = $el[0];
+
+ (0, _events.fireEvent)(el, type, options);
+
+ return app.testHelpers.wait();
+ } /**
+ @module ember
+ */
+});
+enifed('ember-testing/helpers/visit', ['exports', 'ember-metal'], function (exports, _emberMetal) {
+ 'use strict';
+
+ exports.default = visit;
+
+
+ /**
+ Loads a route, sets up any controllers, and renders any templates associated
+ with the route as though a real user had triggered the route change while
+ using your app.
+
+ Example:
+
+ ```javascript
+ visit('posts/index').then(function() {
+ // assert something
+ });
+ ```
+
+ @method visit
+ @param {String} url the name of the route
+ @return {RSVP.Promise<undefined>}
+ @public
+ */
+ function visit(app, url) {
+ var router = app.__container__.lookup('router:main');
+ var shouldHandleURL = false;
+
+ app.boot().then(function () {
+ router.location.setURL(url);
+
+ if (shouldHandleURL) {
+ (0, _emberMetal.run)(app.__deprecatedInstance__, 'handleURL', url);
+ }
+ });
+
+ if (app._readinessDeferrals > 0) {
+ router['initialURL'] = url;
+ (0, _emberMetal.run)(app, 'advanceReadiness');
+ delete router['initialURL'];
+ } else {
+ shouldHandleURL = true;
+ }
+
+ return app.testHelpers.wait();
+ } /**
+ @module ember
+ */
+});
+enifed('ember-testing/helpers/wait', ['exports', 'ember-testing/test/waiters', 'ember-runtime', 'ember-metal', 'ember-testing/test/pending_requests'], function (exports, _waiters, _emberRuntime, _emberMetal, _pending_requests) {
+ 'use strict';
+
+ exports.default = wait;
+
+
+ /**
+ Causes the run loop to process any pending events. This is used to ensure that
+ any async operations from other helpers (or your assertions) have been processed.
+
+ This is most often used as the return value for the helper functions (see 'click',
+ 'fillIn','visit',etc). However, there is a method to register a test helper which
+ utilizes this method without the need to actually call `wait()` in your helpers.
+
+ The `wait` helper is built into `registerAsyncHelper` by default. You will not need
+ to `return app.testHelpers.wait();` - the wait behavior is provided for you.
+
+ Example:
+
+ ```javascript
+ import { registerAsyncHelper } from '@ember/test';
+
+ registerAsyncHelper('loginUser', function(app, username, password) {
+ visit('secured/path/here')
+ .fillIn('#username', username)
+ .fillIn('#password', password)
+ .click('.submit');
+ });
+ ```
+
+ @method wait
+ @param {Object} value The value to be returned.
+ @return {RSVP.Promise<any>} Promise that resolves to the passed value.
+ @public
+ @since 1.0.0
+ */
+ /**
+ @module ember
+ */
+ function wait(app, value) {
+ return new _emberRuntime.RSVP.Promise(function (resolve) {
+ var router = app.__container__.lookup('router:main');
+
+ // Every 10ms, poll for the async thing to have finished
+ var watcher = setInterval(function () {
+ // 1. If the router is loading, keep polling
+ var routerIsLoading = router._routerMicrolib && !!router._routerMicrolib.activeTransition;
+ if (routerIsLoading) {
+ return;
+ }
+
+ // 2. If there are pending Ajax requests, keep polling
+ if ((0, _pending_requests.pendingRequests)()) {
+ return;
+ }
+
+ // 3. If there are scheduled timers or we are inside of a run loop, keep polling
+ if (_emberMetal.run.hasScheduledTimers() || _emberMetal.run.currentRunLoop) {
+ return;
+ }
+
+ if ((0, _waiters.checkWaiters)()) {
+ return;
+ }
+
+ // Stop polling
+ clearInterval(watcher);
+
+ // Synchronously resolve the promise
+ (0, _emberMetal.run)(null, resolve, value);
+ }, 10);
+ });
+ }
+});
+enifed('ember-testing/index', ['exports', 'ember-testing/test', 'ember-testing/adapters/adapter', 'ember-testing/setup_for_testing', 'ember-testing/adapters/qunit', 'ember-testing/support', 'ember-testing/ext/application', 'ember-testing/ext/rsvp', 'ember-testing/helpers', 'ember-testing/initializers'], function (exports, _test, _adapter, _setup_for_testing, _qunit) {
+ 'use strict';
+
+ exports.QUnitAdapter = exports.setupForTesting = exports.Adapter = exports.Test = undefined;
+ Object.defineProperty(exports, 'Test', {
+ enumerable: true,
+ get: function () {
+ return _test.default;
+ }
+ });
+ Object.defineProperty(exports, 'Adapter', {
+ enumerable: true,
+ get: function () {
+ return _adapter.default;
+ }
+ });
+ Object.defineProperty(exports, 'setupForTesting', {
+ enumerable: true,
+ get: function () {
+ return _setup_for_testing.default;
+ }
+ });
+ Object.defineProperty(exports, 'QUnitAdapter', {
+ enumerable: true,
+ get: function () {
+ return _qunit.default;
+ }
+ });
+});
+enifed('ember-testing/initializers', ['ember-runtime'], function (_emberRuntime) {
+ 'use strict';
+
+ var name = 'deferReadiness in `testing` mode';
+
+ (0, _emberRuntime.onLoad)('Ember.Application', function (Application) {
+ if (!Application.initializers[name]) {
+ Application.initializer({
+ name: name,
+
+ initialize: function (application) {
+ if (application.testing) {
+ application.deferReadiness();
+ }
+ }
+ });
+ }
+ });
+});
+enifed('ember-testing/setup_for_testing', ['exports', 'ember-debug', 'ember-views', 'ember-testing/test/adapter', 'ember-testing/test/pending_requests', 'ember-testing/adapters/adapter', 'ember-testing/adapters/qunit'], function (exports, _emberDebug, _emberViews, _adapter, _pending_requests, _adapter2, _qunit) {
+ 'use strict';
+
+ exports.default = setupForTesting;
+
+
+ /**
+ Sets Ember up for testing. This is useful to perform
+ basic setup steps in order to unit test.
+
+ Use `App.setupForTesting` to perform integration tests (full
+ application testing).
+
+ @method setupForTesting
+ @namespace Ember
+ @since 1.5.0
+ @private
+ */
+ /* global self */
+
+ function setupForTesting() {
+ (0, _emberDebug.setTesting)(true);
+
+ var adapter = (0, _adapter.getAdapter)();
+ // if adapter is not manually set default to QUnit
+ if (!adapter) {
+ (0, _adapter.setAdapter)(typeof self.QUnit === 'undefined' ? new _adapter2.default() : new _qunit.default());
+ }
+
+ if (_emberViews.jQuery) {
+ (0, _emberViews.jQuery)(document).off('ajaxSend', _pending_requests.incrementPendingRequests);
+ (0, _emberViews.jQuery)(document).off('ajaxComplete', _pending_requests.decrementPendingRequests);
+
+ (0, _pending_requests.clearPendingRequests)();
+
+ (0, _emberViews.jQuery)(document).on('ajaxSend', _pending_requests.incrementPendingRequests);
+ (0, _emberViews.jQuery)(document).on('ajaxComplete', _pending_requests.decrementPendingRequests);
+ }
+ }
+});
+enifed('ember-testing/support', ['ember-debug', 'ember-views', 'ember-environment'], function (_emberDebug, _emberViews, _emberEnvironment) {
+ 'use strict';
+
+ /**
+ @module ember
+ */
+
+ var $ = _emberViews.jQuery;
+
+ /**
+ This method creates a checkbox and triggers the click event to fire the
+ passed in handler. It is used to correct for a bug in older versions
+ of jQuery (e.g 1.8.3).
+
+ @private
+ @method testCheckboxClick
+ */
+ function testCheckboxClick(handler) {
+ var input = document.createElement('input');
+ $(input).attr('type', 'checkbox').css({ position: 'absolute', left: '-1000px', top: '-1000px' }).appendTo('body').on('click', handler).trigger('click').remove();
+ }
+
+ if (_emberEnvironment.environment.hasDOM && typeof $ === 'function') {
+ $(function () {
+ /*
+ Determine whether a checkbox checked using jQuery's "click" method will have
+ the correct value for its checked property.
+ If we determine that the current jQuery version exhibits this behavior,
+ patch it to work correctly as in the commit for the actual fix:
+ https://github.com/jquery/jquery/commit/1fb2f92.
+ */
+ testCheckboxClick(function () {
+ if (!this.checked && !$.event.special.click) {
+ $.event.special.click = {
+ trigger: function () {
+ if ($.nodeName(this, 'input') && this.type === 'checkbox' && this.click) {
+ this.click();
+ return false;
+ }
+ }
+ };
+ }
+ });
+
+ // Try again to verify that the patch took effect or blow up.
+ testCheckboxClick(function () {
+ (true && (0, _emberDebug.warn)('clicked checkboxes should be checked! the jQuery patch didn\'t work', this.checked, { id: 'ember-testing.test-checkbox-click' }));
+ });
+ });
+ }
+});
+enifed('ember-testing/test', ['exports', 'ember-testing/test/helpers', 'ember-testing/test/on_inject_helpers', 'ember-testing/test/promise', 'ember-testing/test/waiters', 'ember-testing/test/adapter'], function (exports, _helpers, _on_inject_helpers, _promise, _waiters, _adapter) {
+ 'use strict';
+
+ /**
+ This is a container for an assortment of testing related functionality:
+
+ * Choose your default test adapter (for your framework of choice).
+ * Register/Unregister additional test helpers.
+ * Setup callbacks to be fired when the test helpers are injected into
+ your application.
+
+ @class Test
+ @namespace Ember
+ @public
+ */
+ var Test = {
+ /**
+ Hash containing all known test helpers.
+ @property _helpers
+ @private
+ @since 1.7.0
+ */
+ _helpers: _helpers.helpers,
+
+ registerHelper: _helpers.registerHelper,
+ registerAsyncHelper: _helpers.registerAsyncHelper,
+ unregisterHelper: _helpers.unregisterHelper,
+ onInjectHelpers: _on_inject_helpers.onInjectHelpers,
+ Promise: _promise.default,
+ promise: _promise.promise,
+ resolve: _promise.resolve,
+ registerWaiter: _waiters.registerWaiter,
+ unregisterWaiter: _waiters.unregisterWaiter,
+ checkWaiters: _waiters.checkWaiters
+ };
+
+ /**
+ Used to allow ember-testing to communicate with a specific testing
+ framework.
+
+ You can manually set it before calling `App.setupForTesting()`.
+
+ Example:
+
+ ```javascript
+ Ember.Test.adapter = MyCustomAdapter.create()
+ ```
+
+ If you do not set it, ember-testing will default to `Ember.Test.QUnitAdapter`.
+
+ @public
+ @for Ember.Test
+ @property adapter
+ @type {Class} The adapter to be used.
+ @default Ember.Test.QUnitAdapter
+ */
+ /**
+ @module ember
+ */
+ Object.defineProperty(Test, 'adapter', {
+ get: _adapter.getAdapter,
+ set: _adapter.setAdapter
+ });
+
+ exports.default = Test;
+});
+enifed('ember-testing/test/adapter', ['exports', 'ember-console', 'ember-metal'], function (exports, _emberConsole, _emberMetal) {
+ 'use strict';
+
+ exports.getAdapter = getAdapter;
+ exports.setAdapter = setAdapter;
+ exports.asyncStart = asyncStart;
+ exports.asyncEnd = asyncEnd;
+
+
+ var adapter = void 0;
+ function getAdapter() {
+ return adapter;
+ }
+
+ function setAdapter(value) {
+ adapter = value;
+ if (value && typeof value.exception === 'function') {
+ (0, _emberMetal.setDispatchOverride)(adapterDispatch);
+ } else {
+ (0, _emberMetal.setDispatchOverride)(null);
+ }
+ }
+
+ function asyncStart() {
+ if (adapter) {
+ adapter.asyncStart();
+ }
+ }
+
+ function asyncEnd() {
+ if (adapter) {
+ adapter.asyncEnd();
+ }
+ }
+
+ function adapterDispatch(error) {
+ adapter.exception(error);
+ _emberConsole.default.error(error.stack);
+ }
+});
+enifed('ember-testing/test/helpers', ['exports', 'ember-testing/test/promise'], function (exports, _promise) {
+ 'use strict';
+
+ exports.helpers = undefined;
+ exports.registerHelper = registerHelper;
+ exports.registerAsyncHelper = registerAsyncHelper;
+ exports.unregisterHelper = unregisterHelper;
+ var helpers = exports.helpers = {};
+ /**
+ @module @ember/test
+ */
+
+ /**
+ `registerHelper` is used to register a test helper that will be injected
+ when `App.injectTestHelpers` is called.
+
+ The helper method will always be called with the current Application as
+ the first parameter.
+
+ For example:
+
+ ```javascript
+ import { registerHelper } from '@ember/test';
+ import { run } from '@ember/runloop';
+
+ registerHelper('boot', function(app) {
+ run(app, app.advanceReadiness);
+ });
+ ```
+
+ This helper can later be called without arguments because it will be
+ called with `app` as the first parameter.
+
+ ```javascript
+ import Application from '@ember/application';
+
+ App = Application.create();
+ App.injectTestHelpers();
+ boot();
+ ```
+
+ @public
+ @for @ember/test
+ @static
+ @method registerHelper
+ @param {String} name The name of the helper method to add.
+ @param {Function} helperMethod
+ @param options {Object}
+ */
+ function registerHelper(name, helperMethod) {
+ helpers[name] = {
+ method: helperMethod,
+ meta: { wait: false }
+ };
+ }
+
+ /**
+ `registerAsyncHelper` is used to register an async test helper that will be injected
+ when `App.injectTestHelpers` is called.
+
+ The helper method will always be called with the current Application as
+ the first parameter.
+
+ For example:
+
+ ```javascript
+ import { registerAsyncHelper } from '@ember/test';
+ import { run } from '@ember/runloop';
+
+ registerAsyncHelper('boot', function(app) {
+ run(app, app.advanceReadiness);
+ });
+ ```
+
+ The advantage of an async helper is that it will not run
+ until the last async helper has completed. All async helpers
+ after it will wait for it complete before running.
+
+
+ For example:
+
+ ```javascript
+ import { registerAsyncHelper } from '@ember/test';
+
+ registerAsyncHelper('deletePost', function(app, postId) {
+ click('.delete-' + postId);
+ });
+
+ // ... in your test
+ visit('/post/2');
+ deletePost(2);
+ visit('/post/3');
+ deletePost(3);
+ ```
+
+ @public
+ @for @ember/test
+ @method registerAsyncHelper
+ @param {String} name The name of the helper method to add.
+ @param {Function} helperMethod
+ @since 1.2.0
+ */
+ function registerAsyncHelper(name, helperMethod) {
+ helpers[name] = {
+ method: helperMethod,
+ meta: { wait: true }
+ };
+ }
+
+ /**
+ Remove a previously added helper method.
+
+ Example:
+
+ ```javascript
+ import { unregisterHelper } from '@ember/test';
+
+ unregisterHelper('wait');
+ ```
+
+ @public
+ @method unregisterHelper
+ @static
+ @for @ember/test
+ @param {String} name The helper to remove.
+ */
+ function unregisterHelper(name) {
+ delete helpers[name];
+ delete _promise.default.prototype[name];
+ }
+});
+enifed("ember-testing/test/on_inject_helpers", ["exports"], function (exports) {
+ "use strict";
+
+ exports.onInjectHelpers = onInjectHelpers;
+ exports.invokeInjectHelpersCallbacks = invokeInjectHelpersCallbacks;
+ var callbacks = exports.callbacks = [];
+
+ /**
+ Used to register callbacks to be fired whenever `App.injectTestHelpers`
+ is called.
+
+ The callback will receive the current application as an argument.
+
+ Example:
+
+ ```javascript
+ import $ from 'jquery';
+
+ Ember.Test.onInjectHelpers(function() {
+ $(document).ajaxSend(function() {
+ Test.pendingRequests++;
+ });
+
+ $(document).ajaxComplete(function() {
+ Test.pendingRequests--;
+ });
+ });
+ ```
+
+ @public
+ @for Ember.Test
+ @method onInjectHelpers
+ @param {Function} callback The function to be called.
+ */
+ function onInjectHelpers(callback) {
+ callbacks.push(callback);
+ }
+
+ function invokeInjectHelpersCallbacks(app) {
+ for (var i = 0; i < callbacks.length; i++) {
+ callbacks[i](app);
+ }
+ }
+});
+enifed("ember-testing/test/pending_requests", ["exports"], function (exports) {
+ "use strict";
+
+ exports.pendingRequests = pendingRequests;
+ exports.clearPendingRequests = clearPendingRequests;
+ exports.incrementPendingRequests = incrementPendingRequests;
+ exports.decrementPendingRequests = decrementPendingRequests;
+ var requests = [];
+
+ function pendingRequests() {
+ return requests.length;
+ }
+
+ function clearPendingRequests() {
+ requests.length = 0;
+ }
+
+ function incrementPendingRequests(_, xhr) {
+ requests.push(xhr);
+ }
+
+ function decrementPendingRequests(_, xhr) {
+ for (var i = 0; i < requests.length; i++) {
+ if (xhr === requests[i]) {
+ requests.splice(i, 1);
+ break;
+ }
+ }
+ }
+});
+enifed('ember-testing/test/promise', ['exports', 'ember-babel', 'ember-runtime', 'ember-testing/test/run'], function (exports, _emberBabel, _emberRuntime, _run) {
+ 'use strict';
+
+ exports.promise = promise;
+ exports.resolve = resolve;
+ exports.getLastPromise = getLastPromise;
+
+
+ var lastPromise = void 0;
+
+ var TestPromise = function (_RSVP$Promise) {
+ (0, _emberBabel.inherits)(TestPromise, _RSVP$Promise);
+
+ function TestPromise() {
+ (0, _emberBabel.classCallCheck)(this, TestPromise);
+
+ var _this = (0, _emberBabel.possibleConstructorReturn)(this, _RSVP$Promise.apply(this, arguments));
+
+ lastPromise = _this;
+ return _this;
+ }
+
+ TestPromise.prototype.then = function then(_onFulfillment) {
+ var _RSVP$Promise$prototy;
+
+ var onFulfillment = typeof _onFulfillment === 'function' ? function (result) {
+ return isolate(_onFulfillment, result);
+ } : undefined;
+
+ for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ args[_key - 1] = arguments[_key];
+ }
+
+ return (_RSVP$Promise$prototy = _RSVP$Promise.prototype.then).call.apply(_RSVP$Promise$prototy, [this, onFulfillment].concat(args));
+ };
+
+ return TestPromise;
+ }(_emberRuntime.RSVP.Promise);
+
+ exports.default = TestPromise;
+
+
+ /**
+ This returns a thenable tailored for testing. It catches failed
+ `onSuccess` callbacks and invokes the `Ember.Test.adapter.exception`
+ callback in the last chained then.
+
+ This method should be returned by async helpers such as `wait`.
+
+ @public
+ @for Ember.Test
+ @method promise
+ @param {Function} resolver The function used to resolve the promise.
+ @param {String} label An optional string for identifying the promise.
+ */
+ function promise(resolver, label) {
+ var fullLabel = 'Ember.Test.promise: ' + (label || '<Unknown Promise>');
+ return new TestPromise(resolver, fullLabel);
+ }
+
+ /**
+ Replacement for `Ember.RSVP.resolve`
+ The only difference is this uses
+ an instance of `Ember.Test.Promise`
+
+ @public
+ @for Ember.Test
+ @method resolve
+ @param {Mixed} The value to resolve
+ @since 1.2.0
+ */
+ function resolve(result, label) {
+ return TestPromise.resolve(result, label);
+ }
+
+ function getLastPromise() {
+ return lastPromise;
+ }
+
+ // This method isolates nested async methods
+ // so that they don't conflict with other last promises.
+ //
+ // 1. Set `Ember.Test.lastPromise` to null
+ // 2. Invoke method
+ // 3. Return the last promise created during method
+ function isolate(onFulfillment, result) {
+ // Reset lastPromise for nested helpers
+ lastPromise = null;
+
+ var value = onFulfillment(result);
+
+ var promise = lastPromise;
+ lastPromise = null;
+
+ // If the method returned a promise
+ // return that promise. If not,
+ // return the last async helper's promise
+ if (value && value instanceof TestPromise || !promise) {
+ return value;
+ } else {
+ return (0, _run.default)(function () {
+ return resolve(promise).then(function () {
+ return value;
+ });
+ });
+ }
+ }
+});
+enifed('ember-testing/test/run', ['exports', 'ember-metal'], function (exports, _emberMetal) {
+ 'use strict';
+
+ exports.default = run;
+ function run(fn) {
+ if (!_emberMetal.run.currentRunLoop) {
+ return (0, _emberMetal.run)(fn);
+ } else {
+ return fn();
+ }
+ }
+});
+enifed("ember-testing/test/waiters", ["exports"], function (exports) {
+ "use strict";
+
+ exports.registerWaiter = registerWaiter;
+ exports.unregisterWaiter = unregisterWaiter;
+ exports.checkWaiters = checkWaiters;
+ /**
+ @module @ember/test
+ */
+ var contexts = [];
+ var callbacks = [];
+
+ /**
+ This allows ember-testing to play nicely with other asynchronous
+ events, such as an application that is waiting for a CSS3
+ transition or an IndexDB transaction. The waiter runs periodically
+ after each async helper (i.e. `click`, `andThen`, `visit`, etc) has executed,
+ until the returning result is truthy. After the waiters finish, the next async helper
+ is executed and the process repeats.
+
+ For example:
+
+ ```javascript
+ import { registerWaiter } from '@ember/test';
+
+ registerWaiter(function() {
+ return myPendingTransactions() == 0;
+ });
+ ```
+ The `context` argument allows you to optionally specify the `this`
+ with which your callback will be invoked.
+
+ For example:
+
+ ```javascript
+ import { registerWaiter } from '@ember/test';
+
+ registerWaiter(MyDB, MyDB.hasPendingTransactions);
+ ```
+
+ @public
+ @for @ember/test
+ @static
+ @method registerWaiter
+ @param {Object} context (optional)
+ @param {Function} callback
+ @since 1.2.0
+ */
+ function registerWaiter(context, callback) {
+ if (arguments.length === 1) {
+ callback = context;
+ context = null;
+ }
+ if (indexOf(context, callback) > -1) {
+ return;
+ }
+ contexts.push(context);
+ callbacks.push(callback);
+ }
+
+ /**
+ `unregisterWaiter` is used to unregister a callback that was
+ registered with `registerWaiter`.
+
+ @public
+ @for @ember/test
+ @static
+ @method unregisterWaiter
+ @param {Object} context (optional)
+ @param {Function} callback
+ @since 1.2.0
+ */
+ function unregisterWaiter(context, callback) {
+ if (!callbacks.length) {
+ return;
+ }
+ if (arguments.length === 1) {
+ callback = context;
+ context = null;
+ }
+ var i = indexOf(context, callback);
+ if (i === -1) {
+ return;
+ }
+ contexts.splice(i, 1);
+ callbacks.splice(i, 1);
+ }
+
+ /**
+ Iterates through each registered test waiter, and invokes
+ its callback. If any waiter returns false, this method will return
+ true indicating that the waiters have not settled yet.
+
+ This is generally used internally from the acceptance/integration test
+ infrastructure.
+
+ @public
+ @for @ember/test
+ @static
+ @method checkWaiters
+ */
+ function checkWaiters() {
+ if (!callbacks.length) {
+ return false;
+ }
+ for (var i = 0; i < callbacks.length; i++) {
+ var context = contexts[i];
+ var callback = callbacks[i];
+ if (!callback.call(context)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ function indexOf(context, callback) {
+ for (var i = 0; i < callbacks.length; i++) {
+ if (callbacks[i] === callback && contexts[i] === context) {
+ return i;
+ }
+ }
+ return -1;
+ }
+});
+/*global enifed */
+enifed('node-module', ['exports'], function(_exports) {
+ var IS_NODE = typeof module === 'object' && typeof module.require === 'function';
+ if (IS_NODE) {
+ _exports.require = module.require;
+ _exports.module = module;
+ _exports.IS_NODE = IS_NODE;
+ } else {
+ _exports.require = null;
+ _exports.module = null;
+ _exports.IS_NODE = IS_NODE;
+ }
+});
+var testing = requireModule('ember-testing');
+Ember.Test = testing.Test;
+Ember.Test.Adapter = testing.Adapter;
+Ember.Test.QUnitAdapter = testing.QUnitAdapter;
+Ember.setupForTesting = testing.setupForTesting;
+}());
+
+/* globals require, Ember, jQuery */
+
+(() => {
+ if (typeof jQuery !== 'undefined') {
+ let _Ember;
+ if (typeof Ember !== 'undefined') {
+ _Ember = Ember;
+ } else {
+ _Ember = require('ember').default;
+ }
+
+ let pendingRequests;
+ if (Ember.__loader.registry['ember-testing/test/pending_requests']) {
+ pendingRequests = Ember.__loader.require('ember-testing/test/pending_requests');
+ }
+
+ if (pendingRequests) {
+ // This exists to ensure that the AJAX listeners setup by Ember itself
+ // (which as of 2.17 are not properly torn down) get cleared and released
+ // when the application is destroyed. Without this, any AJAX requests
+ // that happen _between_ acceptance tests will always share
+ // `pendingRequests`.
+ _Ember.Application.reopen({
+ willDestroy() {
+ jQuery(document).off('ajaxSend', pendingRequests.incrementPendingRequests);
+ jQuery(document).off('ajaxComplete', pendingRequests.decrementPendingRequests);
+
+ pendingRequests.clearPendingRequests();
+
+ this._super(...arguments);
+ }
+ });
+ }
+ }
+})();
+/*!
+ * QUnit 2.5.1
+ * https://qunitjs.com/
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license
+ * https://jquery.org/license
+ *
+ * Date: 2018-02-28T01:37Z
+ */
+(function (global$1) {
+ 'use strict';
+
+ global$1 = global$1 && global$1.hasOwnProperty('default') ? global$1['default'] : global$1;
+
+ var window = global$1.window;
+ var self$1 = global$1.self;
+ var console = global$1.console;
+ var setTimeout = global$1.setTimeout;
+ var clearTimeout = global$1.clearTimeout;
+
+ var document = window && window.document;
+ var navigator = window && window.navigator;
+
+ var localSessionStorage = function () {
+ var x = "qunit-test-string";
+ try {
+ global$1.sessionStorage.setItem(x, x);
+ global$1.sessionStorage.removeItem(x);
+ return global$1.sessionStorage;
+ } catch (e) {
+ return undefined;
+ }
+ }();
+
+ var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) {
+ return typeof obj;
+ } : function (obj) {
+ return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
+ };
+
+
+
+
+
+
+
+
+
+
+
+ var classCallCheck = function (instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ };
+
+ var createClass = function () {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || false;
+ descriptor.configurable = true;
+ if ("value" in descriptor) descriptor.writable = true;
+ Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+
+ return function (Constructor, protoProps, staticProps) {
+ if (protoProps) defineProperties(Constructor.prototype, protoProps);
+ if (staticProps) defineProperties(Constructor, staticProps);
+ return Constructor;
+ };
+ }();
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ var toConsumableArray = function (arr) {
+ if (Array.isArray(arr)) {
+ for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
+
+ return arr2;
+ } else {
+ return Array.from(arr);
+ }
+ };
+
+ var toString = Object.prototype.toString;
+ var hasOwn = Object.prototype.hasOwnProperty;
+ var now = Date.now || function () {
+ return new Date().getTime();
+ };
+
+ var defined = {
+ document: window && window.document !== undefined,
+ setTimeout: setTimeout !== undefined
+ };
+
+ // Returns a new Array with the elements that are in a but not in b
+ function diff(a, b) {
+ var i,
+ j,
+ result = a.slice();
+
+ for (i = 0; i < result.length; i++) {
+ for (j = 0; j < b.length; j++) {
+ if (result[i] === b[j]) {
+ result.splice(i, 1);
+ i--;
+ break;
+ }
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Determines whether an element exists in a given array or not.
+ *
+ * @method inArray
+ * @param {Any} elem
+ * @param {Array} array
+ * @return {Boolean}
+ */
+ function inArray(elem, array) {
+ return array.indexOf(elem) !== -1;
+ }
+
+ /**
+ * Makes a clone of an object using only Array or Object as base,
+ * and copies over the own enumerable properties.
+ *
+ * @param {Object} obj
+ * @return {Object} New object with only the own properties (recursively).
+ */
+ function objectValues(obj) {
+ var key,
+ val,
+ vals = is("array", obj) ? [] : {};
+ for (key in obj) {
+ if (hasOwn.call(obj, key)) {
+ val = obj[key];
+ vals[key] = val === Object(val) ? objectValues(val) : val;
+ }
+ }
+ return vals;
+ }
+
+ function extend(a, b, undefOnly) {
+ for (var prop in b) {
+ if (hasOwn.call(b, prop)) {
+ if (b[prop] === undefined) {
+ delete a[prop];
+ } else if (!(undefOnly && typeof a[prop] !== "undefined")) {
+ a[prop] = b[prop];
+ }
+ }
+ }
+
+ return a;
+ }
+
+ function objectType(obj) {
+ if (typeof obj === "undefined") {
+ return "undefined";
+ }
+
+ // Consider: typeof null === object
+ if (obj === null) {
+ return "null";
+ }
+
+ var match = toString.call(obj).match(/^\[object\s(.*)\]$/),
+ type = match && match[1];
+
+ switch (type) {
+ case "Number":
+ if (isNaN(obj)) {
+ return "nan";
+ }
+ return "number";
+ case "String":
+ case "Boolean":
+ case "Array":
+ case "Set":
+ case "Map":
+ case "Date":
+ case "RegExp":
+ case "Function":
+ case "Symbol":
+ return type.toLowerCase();
+ default:
+ return typeof obj === "undefined" ? "undefined" : _typeof(obj);
+ }
+ }
+
+ // Safe object type checking
+ function is(type, obj) {
+ return objectType(obj) === type;
+ }
+
+ // Based on Java's String.hashCode, a simple but not
+ // rigorously collision resistant hashing function
+ function generateHash(module, testName) {
+ var str = module + "\x1C" + testName;
+ var hash = 0;
+
+ for (var i = 0; i < str.length; i++) {
+ hash = (hash << 5) - hash + str.charCodeAt(i);
+ hash |= 0;
+ }
+
+ // Convert the possibly negative integer hash code into an 8 character hex string, which isn't
+ // strictly necessary but increases user understanding that the id is a SHA-like hash
+ var hex = (0x100000000 + hash).toString(16);
+ if (hex.length < 8) {
+ hex = "0000000" + hex;
+ }
+
+ return hex.slice(-8);
+ }
+
+ // Test for equality any JavaScript type.
+ // Authors: Philippe Rathé <prathe@gmail.com>, David Chan <david@troi.org>
+ var equiv = (function () {
+
+ // Value pairs queued for comparison. Used for breadth-first processing order, recursion
+ // detection and avoiding repeated comparison (see below for details).
+ // Elements are { a: val, b: val }.
+ var pairs = [];
+
+ var getProto = Object.getPrototypeOf || function (obj) {
+ return obj.__proto__;
+ };
+
+ function useStrictEquality(a, b) {
+
+ // This only gets called if a and b are not strict equal, and is used to compare on
+ // the primitive values inside object wrappers. For example:
+ // `var i = 1;`
+ // `var j = new Number(1);`
+ // Neither a nor b can be null, as a !== b and they have the same type.
+ if ((typeof a === "undefined" ? "undefined" : _typeof(a)) === "object") {
+ a = a.valueOf();
+ }
+ if ((typeof b === "undefined" ? "undefined" : _typeof(b)) === "object") {
+ b = b.valueOf();
+ }
+
+ return a === b;
+ }
+
+ function compareConstructors(a, b) {
+ var protoA = getProto(a);
+ var protoB = getProto(b);
+
+ // Comparing constructors is more strict than using `instanceof`
+ if (a.constructor === b.constructor) {
+ return true;
+ }
+
+ // Ref #851
+ // If the obj prototype descends from a null constructor, treat it
+ // as a null prototype.
+ if (protoA && protoA.constructor === null) {
+ protoA = null;
+ }
+ if (protoB && protoB.constructor === null) {
+ protoB = null;
+ }
+
+ // Allow objects with no prototype to be equivalent to
+ // objects with Object as their constructor.
+ if (protoA === null && protoB === Object.prototype || protoB === null && protoA === Object.prototype) {
+ return true;
+ }
+
+ return false;
+ }
+
+ function getRegExpFlags(regexp) {
+ return "flags" in regexp ? regexp.flags : regexp.toString().match(/[gimuy]*$/)[0];
+ }
+
+ function isContainer(val) {
+ return ["object", "array", "map", "set"].indexOf(objectType(val)) !== -1;
+ }
+
+ function breadthFirstCompareChild(a, b) {
+
+ // If a is a container not reference-equal to b, postpone the comparison to the
+ // end of the pairs queue -- unless (a, b) has been seen before, in which case skip
+ // over the pair.
+ if (a === b) {
+ return true;
+ }
+ if (!isContainer(a)) {
+ return typeEquiv(a, b);
+ }
+ if (pairs.every(function (pair) {
+ return pair.a !== a || pair.b !== b;
+ })) {
+
+ // Not yet started comparing this pair
+ pairs.push({ a: a, b: b });
+ }
+ return true;
+ }
+
+ var callbacks = {
+ "string": useStrictEquality,
+ "boolean": useStrictEquality,
+ "number": useStrictEquality,
+ "null": useStrictEquality,
+ "undefined": useStrictEquality,
+ "symbol": useStrictEquality,
+ "date": useStrictEquality,
+
+ "nan": function nan() {
+ return true;
+ },
+
+ "regexp": function regexp(a, b) {
+ return a.source === b.source &&
+
+ // Include flags in the comparison
+ getRegExpFlags(a) === getRegExpFlags(b);
+ },
+
+ // abort (identical references / instance methods were skipped earlier)
+ "function": function _function() {
+ return false;
+ },
+
+ "array": function array(a, b) {
+ var i, len;
+
+ len = a.length;
+ if (len !== b.length) {
+
+ // Safe and faster
+ return false;
+ }
+
+ for (i = 0; i < len; i++) {
+
+ // Compare non-containers; queue non-reference-equal containers
+ if (!breadthFirstCompareChild(a[i], b[i])) {
+ return false;
+ }
+ }
+ return true;
+ },
+
+ // Define sets a and b to be equivalent if for each element aVal in a, there
+ // is some element bVal in b such that aVal and bVal are equivalent. Element
+ // repetitions are not counted, so these are equivalent:
+ // a = new Set( [ {}, [], [] ] );
+ // b = new Set( [ {}, {}, [] ] );
+ "set": function set$$1(a, b) {
+ var innerEq,
+ outerEq = true;
+
+ if (a.size !== b.size) {
+
+ // This optimization has certain quirks because of the lack of
+ // repetition counting. For instance, adding the same
+ // (reference-identical) element to two equivalent sets can
+ // make them non-equivalent.
+ return false;
+ }
+
+ a.forEach(function (aVal) {
+
+ // Short-circuit if the result is already known. (Using for...of
+ // with a break clause would be cleaner here, but it would cause
+ // a syntax error on older Javascript implementations even if
+ // Set is unused)
+ if (!outerEq) {
+ return;
+ }
+
+ innerEq = false;
+
+ b.forEach(function (bVal) {
+ var parentPairs;
+
+ // Likewise, short-circuit if the result is already known
+ if (innerEq) {
+ return;
+ }
+
+ // Swap out the global pairs list, as the nested call to
+ // innerEquiv will clobber its contents
+ parentPairs = pairs;
+ if (innerEquiv(bVal, aVal)) {
+ innerEq = true;
+ }
+
+ // Replace the global pairs list
+ pairs = parentPairs;
+ });
+
+ if (!innerEq) {
+ outerEq = false;
+ }
+ });
+
+ return outerEq;
+ },
+
+ // Define maps a and b to be equivalent if for each key-value pair (aKey, aVal)
+ // in a, there is some key-value pair (bKey, bVal) in b such that
+ // [ aKey, aVal ] and [ bKey, bVal ] are equivalent. Key repetitions are not
+ // counted, so these are equivalent:
+ // a = new Map( [ [ {}, 1 ], [ {}, 1 ], [ [], 1 ] ] );
+ // b = new Map( [ [ {}, 1 ], [ [], 1 ], [ [], 1 ] ] );
+ "map": function map(a, b) {
+ var innerEq,
+ outerEq = true;
+
+ if (a.size !== b.size) {
+
+ // This optimization has certain quirks because of the lack of
+ // repetition counting. For instance, adding the same
+ // (reference-identical) key-value pair to two equivalent maps
+ // can make them non-equivalent.
+ return false;
+ }
+
+ a.forEach(function (aVal, aKey) {
+
+ // Short-circuit if the result is already known. (Using for...of
+ // with a break clause would be cleaner here, but it would cause
+ // a syntax error on older Javascript implementations even if
+ // Map is unused)
+ if (!outerEq) {
+ return;
+ }
+
+ innerEq = false;
+
+ b.forEach(function (bVal, bKey) {
+ var parentPairs;
+
+ // Likewise, short-circuit if the result is already known
+ if (innerEq) {
+ return;
+ }
+
+ // Swap out the global pairs list, as the nested call to
+ // innerEquiv will clobber its contents
+ parentPairs = pairs;
+ if (innerEquiv([bVal, bKey], [aVal, aKey])) {
+ innerEq = true;
+ }
+
+ // Replace the global pairs list
+ pairs = parentPairs;
+ });
+
+ if (!innerEq) {
+ outerEq = false;
+ }
+ });
+
+ return outerEq;
+ },
+
+ "object": function object(a, b) {
+ var i,
+ aProperties = [],
+ bProperties = [];
+
+ if (compareConstructors(a, b) === false) {
+ return false;
+ }
+
+ // Be strict: don't ensure hasOwnProperty and go deep
+ for (i in a) {
+
+ // Collect a's properties
+ aProperties.push(i);
+
+ // Skip OOP methods that look the same
+ if (a.constructor !== Object && typeof a.constructor !== "undefined" && typeof a[i] === "function" && typeof b[i] === "function" && a[i].toString() === b[i].toString()) {
+ continue;
+ }
+
+ // Compare non-containers; queue non-reference-equal containers
+ if (!breadthFirstCompareChild(a[i], b[i])) {
+ return false;
+ }
+ }
+
+ for (i in b) {
+
+ // Collect b's properties
+ bProperties.push(i);
+ }
+
+ // Ensures identical properties name
+ return typeEquiv(aProperties.sort(), bProperties.sort());
+ }
+ };
+
+ function typeEquiv(a, b) {
+ var type = objectType(a);
+
+ // Callbacks for containers will append to the pairs queue to achieve breadth-first
+ // search order. The pairs queue is also used to avoid reprocessing any pair of
+ // containers that are reference-equal to a previously visited pair (a special case
+ // this being recursion detection).
+ //
+ // Because of this approach, once typeEquiv returns a false value, it should not be
+ // called again without clearing the pair queue else it may wrongly report a visited
+ // pair as being equivalent.
+ return objectType(b) === type && callbacks[type](a, b);
+ }
+
+ function innerEquiv(a, b) {
+ var i, pair;
+
+ // We're done when there's nothing more to compare
+ if (arguments.length < 2) {
+ return true;
+ }
+
+ // Clear the global pair queue and add the top-level values being compared
+ pairs = [{ a: a, b: b }];
+
+ for (i = 0; i < pairs.length; i++) {
+ pair = pairs[i];
+
+ // Perform type-specific comparison on any pairs that are not strictly
+ // equal. For container types, that comparison will postpone comparison
+ // of any sub-container pair to the end of the pair queue. This gives
+ // breadth-first search order. It also avoids the reprocessing of
+ // reference-equal siblings, cousins etc, which can have a significant speed
+ // impact when comparing a container of small objects each of which has a
+ // reference to the same (singleton) large object.
+ if (pair.a !== pair.b && !typeEquiv(pair.a, pair.b)) {
+ return false;
+ }
+ }
+
+ // ...across all consecutive argument pairs
+ return arguments.length === 2 || innerEquiv.apply(this, [].slice.call(arguments, 1));
+ }
+
+ return function () {
+ var result = innerEquiv.apply(undefined, arguments);
+
+ // Release any retained objects
+ pairs.length = 0;
+ return result;
+ };
+ })();
+
+ /**
+ * Config object: Maintain internal state
+ * Later exposed as QUnit.config
+ * `config` initialized at top of scope
+ */
+ var config = {
+
+ // The queue of tests to run
+ queue: [],
+
+ // Block until document ready
+ blocking: true,
+
+ // By default, run previously failed tests first
+ // very useful in combination with "Hide passed tests" checked
+ reorder: true,
+
+ // By default, modify document.title when suite is done
+ altertitle: true,
+
+ // HTML Reporter: collapse every test except the first failing test
+ // If false, all failing tests will be expanded
+ collapse: true,
+
+ // By default, scroll to top of the page when suite is done
+ scrolltop: true,
+
+ // Depth up-to which object will be dumped
+ maxDepth: 5,
+
+ // When enabled, all tests must call expect()
+ requireExpects: false,
+
+ // Placeholder for user-configurable form-exposed URL parameters
+ urlConfig: [],
+
+ // Set of all modules.
+ modules: [],
+
+ // The first unnamed module
+ currentModule: {
+ name: "",
+ tests: [],
+ childModules: [],
+ testsRun: 0,
+ unskippedTestsRun: 0,
+ hooks: {
+ before: [],
+ beforeEach: [],
+ afterEach: [],
+ after: []
+ }
+ },
+
+ callbacks: {},
+
+ // The storage module to use for reordering tests
+ storage: localSessionStorage
+ };
+
+ // take a predefined QUnit.config and extend the defaults
+ var globalConfig = window && window.QUnit && window.QUnit.config;
+
+ // only extend the global config if there is no QUnit overload
+ if (window && window.QUnit && !window.QUnit.version) {
+ extend(config, globalConfig);
+ }
+
+ // Push a loose unnamed module to the modules collection
+ config.modules.push(config.currentModule);
+
+ // Based on jsDump by Ariel Flesler
+ // http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html
+ var dump = (function () {
+ function quote(str) {
+ return "\"" + str.toString().replace(/\\/g, "\\\\").replace(/"/g, "\\\"") + "\"";
+ }
+ function literal(o) {
+ return o + "";
+ }
+ function join(pre, arr, post) {
+ var s = dump.separator(),
+ base = dump.indent(),
+ inner = dump.indent(1);
+ if (arr.join) {
+ arr = arr.join("," + s + inner);
+ }
+ if (!arr) {
+ return pre + post;
+ }
+ return [pre, inner + arr, base + post].join(s);
+ }
+ function array(arr, stack) {
+ var i = arr.length,
+ ret = new Array(i);
+
+ if (dump.maxDepth && dump.depth > dump.maxDepth) {
+ return "[object Array]";
+ }
+
+ this.up();
+ while (i--) {
+ ret[i] = this.parse(arr[i], undefined, stack);
+ }
+ this.down();
+ return join("[", ret, "]");
+ }
+
+ function isArray(obj) {
+ return (
+
+ //Native Arrays
+ toString.call(obj) === "[object Array]" ||
+
+ // NodeList objects
+ typeof obj.length === "number" && obj.item !== undefined && (obj.length ? obj.item(0) === obj[0] : obj.item(0) === null && obj[0] === undefined)
+ );
+ }
+
+ var reName = /^function (\w+)/,
+ dump = {
+
+ // The objType is used mostly internally, you can fix a (custom) type in advance
+ parse: function parse(obj, objType, stack) {
+ stack = stack || [];
+ var res,
+ parser,
+ parserType,
+ objIndex = stack.indexOf(obj);
+
+ if (objIndex !== -1) {
+ return "recursion(" + (objIndex - stack.length) + ")";
+ }
+
+ objType = objType || this.typeOf(obj);
+ parser = this.parsers[objType];
+ parserType = typeof parser === "undefined" ? "undefined" : _typeof(parser);
+
+ if (parserType === "function") {
+ stack.push(obj);
+ res = parser.call(this, obj, stack);
+ stack.pop();
+ return res;
+ }
+ return parserType === "string" ? parser : this.parsers.error;
+ },
+ typeOf: function typeOf(obj) {
+ var type;
+
+ if (obj === null) {
+ type = "null";
+ } else if (typeof obj === "undefined") {
+ type = "undefined";
+ } else if (is("regexp", obj)) {
+ type = "regexp";
+ } else if (is("date", obj)) {
+ type = "date";
+ } else if (is("function", obj)) {
+ type = "function";
+ } else if (obj.setInterval !== undefined && obj.document !== undefined && obj.nodeType === undefined) {
+ type = "window";
+ } else if (obj.nodeType === 9) {
+ type = "document";
+ } else if (obj.nodeType) {
+ type = "node";
+ } else if (isArray(obj)) {
+ type = "array";
+ } else if (obj.constructor === Error.prototype.constructor) {
+ type = "error";
+ } else {
+ type = typeof obj === "undefined" ? "undefined" : _typeof(obj);
+ }
+ return type;
+ },
+
+ separator: function separator() {
+ if (this.multiline) {
+ return this.HTML ? "<br />" : "\n";
+ } else {
+ return this.HTML ? "&#160;" : " ";
+ }
+ },
+
+ // Extra can be a number, shortcut for increasing-calling-decreasing
+ indent: function indent(extra) {
+ if (!this.multiline) {
+ return "";
+ }
+ var chr = this.indentChar;
+ if (this.HTML) {
+ chr = chr.replace(/\t/g, " ").replace(/ /g, "&#160;");
+ }
+ return new Array(this.depth + (extra || 0)).join(chr);
+ },
+ up: function up(a) {
+ this.depth += a || 1;
+ },
+ down: function down(a) {
+ this.depth -= a || 1;
+ },
+ setParser: function setParser(name, parser) {
+ this.parsers[name] = parser;
+ },
+
+ // The next 3 are exposed so you can use them
+ quote: quote,
+ literal: literal,
+ join: join,
+ depth: 1,
+ maxDepth: config.maxDepth,
+
+ // This is the list of parsers, to modify them, use dump.setParser
+ parsers: {
+ window: "[Window]",
+ document: "[Document]",
+ error: function error(_error) {
+ return "Error(\"" + _error.message + "\")";
+ },
+ unknown: "[Unknown]",
+ "null": "null",
+ "undefined": "undefined",
+ "function": function _function(fn) {
+ var ret = "function",
+
+
+ // Functions never have name in IE
+ name = "name" in fn ? fn.name : (reName.exec(fn) || [])[1];
+
+ if (name) {
+ ret += " " + name;
+ }
+ ret += "(";
+
+ ret = [ret, dump.parse(fn, "functionArgs"), "){"].join("");
+ return join(ret, dump.parse(fn, "functionCode"), "}");
+ },
+ array: array,
+ nodelist: array,
+ "arguments": array,
+ object: function object(map, stack) {
+ var keys,
+ key,
+ val,
+ i,
+ nonEnumerableProperties,
+ ret = [];
+
+ if (dump.maxDepth && dump.depth > dump.maxDepth) {
+ return "[object Object]";
+ }
+
+ dump.up();
+ keys = [];
+ for (key in map) {
+ keys.push(key);
+ }
+
+ // Some properties are not always enumerable on Error objects.
+ nonEnumerableProperties = ["message", "name"];
+ for (i in nonEnumerableProperties) {
+ key = nonEnumerableProperties[i];
+ if (key in map && !inArray(key, keys)) {
+ keys.push(key);
+ }
+ }
+ keys.sort();
+ for (i = 0; i < keys.length; i++) {
+ key = keys[i];
+ val = map[key];
+ ret.push(dump.parse(key, "key") + ": " + dump.parse(val, undefined, stack));
+ }
+ dump.down();
+ return join("{", ret, "}");
+ },
+ node: function node(_node) {
+ var len,
+ i,
+ val,
+ open = dump.HTML ? "&lt;" : "<",
+ close = dump.HTML ? "&gt;" : ">",
+ tag = _node.nodeName.toLowerCase(),
+ ret = open + tag,
+ attrs = _node.attributes;
+
+ if (attrs) {
+ for (i = 0, len = attrs.length; i < len; i++) {
+ val = attrs[i].nodeValue;
+
+ // IE6 includes all attributes in .attributes, even ones not explicitly
+ // set. Those have values like undefined, null, 0, false, "" or
+ // "inherit".
+ if (val && val !== "inherit") {
+ ret += " " + attrs[i].nodeName + "=" + dump.parse(val, "attribute");
+ }
+ }
+ }
+ ret += close;
+
+ // Show content of TextNode or CDATASection
+ if (_node.nodeType === 3 || _node.nodeType === 4) {
+ ret += _node.nodeValue;
+ }
+
+ return ret + open + "/" + tag + close;
+ },
+
+ // Function calls it internally, it's the arguments part of the function
+ functionArgs: function functionArgs(fn) {
+ var args,
+ l = fn.length;
+
+ if (!l) {
+ return "";
+ }
+
+ args = new Array(l);
+ while (l--) {
+
+ // 97 is 'a'
+ args[l] = String.fromCharCode(97 + l);
+ }
+ return " " + args.join(", ") + " ";
+ },
+
+ // Object calls it internally, the key part of an item in a map
+ key: quote,
+
+ // Function calls it internally, it's the content of the function
+ functionCode: "[code]",
+
+ // Node calls it internally, it's a html attribute value
+ attribute: quote,
+ string: quote,
+ date: quote,
+ regexp: literal,
+ number: literal,
+ "boolean": literal,
+ symbol: function symbol(sym) {
+ return sym.toString();
+ }
+ },
+
+ // If true, entities are escaped ( <, >, \t, space and \n )
+ HTML: false,
+
+ // Indentation unit
+ indentChar: " ",
+
+ // If true, items in a collection, are separated by a \n, else just a space.
+ multiline: true
+ };
+
+ return dump;
+ })();
+
+ var LISTENERS = Object.create(null);
+ var SUPPORTED_EVENTS = ["runStart", "suiteStart", "testStart", "assertion", "testEnd", "suiteEnd", "runEnd"];
+
+ /**
+ * Emits an event with the specified data to all currently registered listeners.
+ * Callbacks will fire in the order in which they are registered (FIFO). This
+ * function is not exposed publicly; it is used by QUnit internals to emit
+ * logging events.
+ *
+ * @private
+ * @method emit
+ * @param {String} eventName
+ * @param {Object} data
+ * @return {Void}
+ */
+ function emit(eventName, data) {
+ if (objectType(eventName) !== "string") {
+ throw new TypeError("eventName must be a string when emitting an event");
+ }
+
+ // Clone the callbacks in case one of them registers a new callback
+ var originalCallbacks = LISTENERS[eventName];
+ var callbacks = originalCallbacks ? [].concat(toConsumableArray(originalCallbacks)) : [];
+
+ for (var i = 0; i < callbacks.length; i++) {
+ callbacks[i](data);
+ }
+ }
+
+ /**
+ * Registers a callback as a listener to the specified event.
+ *
+ * @public
+ * @method on
+ * @param {String} eventName
+ * @param {Function} callback
+ * @return {Void}
+ */
+ function on(eventName, callback) {
+ if (objectType(eventName) !== "string") {
+ throw new TypeError("eventName must be a string when registering a listener");
+ } else if (!inArray(eventName, SUPPORTED_EVENTS)) {
+ var events = SUPPORTED_EVENTS.join(", ");
+ throw new Error("\"" + eventName + "\" is not a valid event; must be one of: " + events + ".");
+ } else if (objectType(callback) !== "function") {
+ throw new TypeError("callback must be a function when registering a listener");
+ }
+
+ if (!LISTENERS[eventName]) {
+ LISTENERS[eventName] = [];
+ }
+
+ // Don't register the same callback more than once
+ if (!inArray(callback, LISTENERS[eventName])) {
+ LISTENERS[eventName].push(callback);
+ }
+ }
+
+ // Register logging callbacks
+ function registerLoggingCallbacks(obj) {
+ var i,
+ l,
+ key,
+ callbackNames = ["begin", "done", "log", "testStart", "testDone", "moduleStart", "moduleDone"];
+
+ function registerLoggingCallback(key) {
+ var loggingCallback = function loggingCallback(callback) {
+ if (objectType(callback) !== "function") {
+ throw new Error("QUnit logging methods require a callback function as their first parameters.");
+ }
+
+ config.callbacks[key].push(callback);
+ };
+
+ return loggingCallback;
+ }
+
+ for (i = 0, l = callbackNames.length; i < l; i++) {
+ key = callbackNames[i];
+
+ // Initialize key collection of logging callback
+ if (objectType(config.callbacks[key]) === "undefined") {
+ config.callbacks[key] = [];
+ }
+
+ obj[key] = registerLoggingCallback(key);
+ }
+ }
+
+ function runLoggingCallbacks(key, args) {
+ var i, l, callbacks;
+
+ callbacks = config.callbacks[key];
+ for (i = 0, l = callbacks.length; i < l; i++) {
+ callbacks[i](args);
+ }
+ }
+
+ // Doesn't support IE9, it will return undefined on these browsers
+ // See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack
+ var fileName = (sourceFromStacktrace(0) || "").replace(/(:\d+)+\)?/, "").replace(/.+\//, "");
+
+ function extractStacktrace(e, offset) {
+ offset = offset === undefined ? 4 : offset;
+
+ var stack, include, i;
+
+ if (e && e.stack) {
+ stack = e.stack.split("\n");
+ if (/^error$/i.test(stack[0])) {
+ stack.shift();
+ }
+ if (fileName) {
+ include = [];
+ for (i = offset; i < stack.length; i++) {
+ if (stack[i].indexOf(fileName) !== -1) {
+ break;
+ }
+ include.push(stack[i]);
+ }
+ if (include.length) {
+ return include.join("\n");
+ }
+ }
+ return stack[offset];
+ }
+ }
+
+ function sourceFromStacktrace(offset) {
+ var error = new Error();
+
+ // Support: Safari <=7 only, IE <=10 - 11 only
+ // Not all browsers generate the `stack` property for `new Error()`, see also #636
+ if (!error.stack) {
+ try {
+ throw error;
+ } catch (err) {
+ error = err;
+ }
+ }
+
+ return extractStacktrace(error, offset);
+ }
+
+ var priorityCount = 0;
+ var unitSampler = void 0;
+
+ /**
+ * Advances the ProcessingQueue to the next item if it is ready.
+ * @param {Boolean} last
+ */
+ function advance() {
+ var start = now();
+ config.depth = (config.depth || 0) + 1;
+
+ while (config.queue.length && !config.blocking) {
+ var elapsedTime = now() - start;
+
+ if (!defined.setTimeout || config.updateRate <= 0 || elapsedTime < config.updateRate) {
+ if (priorityCount > 0) {
+ priorityCount--;
+ }
+
+ config.queue.shift()();
+ } else {
+ setTimeout(advance);
+ break;
+ }
+ }
+
+ config.depth--;
+
+ if (!config.blocking && !config.queue.length && config.depth === 0) {
+ done();
+ }
+ }
+
+ function addToQueueImmediate(callback) {
+ if (objectType(callback) === "array") {
+ while (callback.length) {
+ addToQueueImmediate(callback.pop());
+ }
+
+ return;
+ }
+
+ config.queue.unshift(callback);
+ priorityCount++;
+ }
+
+ /**
+ * Adds a function to the ProcessingQueue for execution.
+ * @param {Function|Array} callback
+ * @param {Boolean} priority
+ * @param {String} seed
+ */
+ function addToQueue(callback, prioritize, seed) {
+ if (prioritize) {
+ config.queue.splice(priorityCount++, 0, callback);
+ } else if (seed) {
+ if (!unitSampler) {
+ unitSampler = unitSamplerGenerator(seed);
+ }
+
+ // Insert into a random position after all prioritized items
+ var index = Math.floor(unitSampler() * (config.queue.length - priorityCount + 1));
+ config.queue.splice(priorityCount + index, 0, callback);
+ } else {
+ config.queue.push(callback);
+ }
+ }
+
+ /**
+ * Creates a seeded "sample" generator which is used for randomizing tests.
+ */
+ function unitSamplerGenerator(seed) {
+
+ // 32-bit xorshift, requires only a nonzero seed
+ // http://excamera.com/sphinx/article-xorshift.html
+ var sample = parseInt(generateHash(seed), 16) || -1;
+ return function () {
+ sample ^= sample << 13;
+ sample ^= sample >>> 17;
+ sample ^= sample << 5;
+
+ // ECMAScript has no unsigned number type
+ if (sample < 0) {
+ sample += 0x100000000;
+ }
+
+ return sample / 0x100000000;
+ };
+ }
+
+ /**
+ * This function is called when the ProcessingQueue is done processing all
+ * items. It handles emitting the final run events.
+ */
+ function done() {
+ var storage = config.storage;
+
+ ProcessingQueue.finished = true;
+
+ var runtime = now() - config.started;
+ var passed = config.stats.all - config.stats.bad;
+
+ emit("runEnd", globalSuite.end(true));
+ runLoggingCallbacks("done", {
+ passed: passed,
+ failed: config.stats.bad,
+ total: config.stats.all,
+ runtime: runtime
+ });
+
+ // Clear own storage items if all tests passed
+ if (storage && config.stats.bad === 0) {
+ for (var i = storage.length - 1; i >= 0; i--) {
+ var key = storage.key(i);
+
+ if (key.indexOf("qunit-test-") === 0) {
+ storage.removeItem(key);
+ }
+ }
+ }
+ }
+
+ var ProcessingQueue = {
+ finished: false,
+ add: addToQueue,
+ addImmediate: addToQueueImmediate,
+ advance: advance
+ };
+
+ var TestReport = function () {
+ function TestReport(name, suite, options) {
+ classCallCheck(this, TestReport);
+
+ this.name = name;
+ this.suiteName = suite.name;
+ this.fullName = suite.fullName.concat(name);
+ this.runtime = 0;
+ this.assertions = [];
+
+ this.skipped = !!options.skip;
+ this.todo = !!options.todo;
+
+ this.valid = options.valid;
+
+ this._startTime = 0;
+ this._endTime = 0;
+
+ suite.pushTest(this);
+ }
+
+ createClass(TestReport, [{
+ key: "start",
+ value: function start(recordTime) {
+ if (recordTime) {
+ this._startTime = Date.now();
+ }
+
+ return {
+ name: this.name,
+ suiteName: this.suiteName,
+ fullName: this.fullName.slice()
+ };
+ }
+ }, {
+ key: "end",
+ value: function end(recordTime) {
+ if (recordTime) {
+ this._endTime = Date.now();
+ }
+
+ return extend(this.start(), {
+ runtime: this.getRuntime(),
+ status: this.getStatus(),
+ errors: this.getFailedAssertions(),
+ assertions: this.getAssertions()
+ });
+ }
+ }, {
+ key: "pushAssertion",
+ value: function pushAssertion(assertion) {
+ this.assertions.push(assertion);
+ }
+ }, {
+ key: "getRuntime",
+ value: function getRuntime() {
+ return this._endTime - this._startTime;
+ }
+ }, {
+ key: "getStatus",
+ value: function getStatus() {
+ if (this.skipped) {
+ return "skipped";
+ }
+
+ var testPassed = this.getFailedAssertions().length > 0 ? this.todo : !this.todo;
+
+ if (!testPassed) {
+ return "failed";
+ } else if (this.todo) {
+ return "todo";
+ } else {
+ return "passed";
+ }
+ }
+ }, {
+ key: "getFailedAssertions",
+ value: function getFailedAssertions() {
+ return this.assertions.filter(function (assertion) {
+ return !assertion.passed;
+ });
+ }
+ }, {
+ key: "getAssertions",
+ value: function getAssertions() {
+ return this.assertions.slice();
+ }
+
+ // Remove actual and expected values from assertions. This is to prevent
+ // leaking memory throughout a test suite.
+
+ }, {
+ key: "slimAssertions",
+ value: function slimAssertions() {
+ this.assertions = this.assertions.map(function (assertion) {
+ delete assertion.actual;
+ delete assertion.expected;
+ return assertion;
+ });
+ }
+ }]);
+ return TestReport;
+ }();
+
+ var focused$1 = false;
+
+ function Test(settings) {
+ var i, l;
+
+ ++Test.count;
+
+ this.expected = null;
+ this.assertions = [];
+ this.semaphore = 0;
+ this.module = config.currentModule;
+ this.stack = sourceFromStacktrace(3);
+ this.steps = [];
+ this.timeout = undefined;
+
+ // If a module is skipped, all its tests and the tests of the child suites
+ // should be treated as skipped even if they are defined as `only` or `todo`.
+ // As for `todo` module, all its tests will be treated as `todo` except for
+ // tests defined as `skip` which will be left intact.
+ //
+ // So, if a test is defined as `todo` and is inside a skipped module, we should
+ // then treat that test as if was defined as `skip`.
+ if (this.module.skip) {
+ settings.skip = true;
+ settings.todo = false;
+
+ // Skipped tests should be left intact
+ } else if (this.module.todo && !settings.skip) {
+ settings.todo = true;
+ }
+
+ extend(this, settings);
+
+ this.testReport = new TestReport(settings.testName, this.module.suiteReport, {
+ todo: settings.todo,
+ skip: settings.skip,
+ valid: this.valid()
+ });
+
+ // Register unique strings
+ for (i = 0, l = this.module.tests; i < l.length; i++) {
+ if (this.module.tests[i].name === this.testName) {
+ this.testName += " ";
+ }
+ }
+
+ this.testId = generateHash(this.module.name, this.testName);
+
+ this.module.tests.push({
+ name: this.testName,
+ testId: this.testId,
+ skip: !!settings.skip
+ });
+
+ if (settings.skip) {
+
+ // Skipped tests will fully ignore any sent callback
+ this.callback = function () {};
+ this.async = false;
+ this.expected = 0;
+ } else {
+ if (typeof this.callback !== "function") {
+ var method = this.todo ? "todo" : "test";
+
+ // eslint-disable-next-line max-len
+ throw new TypeError("You must provide a function as a test callback to QUnit." + method + "(\"" + settings.testName + "\")");
+ }
+
+ this.assert = new Assert(this);
+ }
+ }
+
+ Test.count = 0;
+
+ function getNotStartedModules(startModule) {
+ var module = startModule,
+ modules = [];
+
+ while (module && module.testsRun === 0) {
+ modules.push(module);
+ module = module.parentModule;
+ }
+
+ return modules;
+ }
+
+ Test.prototype = {
+ before: function before() {
+ var i,
+ startModule,
+ module = this.module,
+ notStartedModules = getNotStartedModules(module);
+
+ for (i = notStartedModules.length - 1; i >= 0; i--) {
+ startModule = notStartedModules[i];
+ startModule.stats = { all: 0, bad: 0, started: now() };
+ emit("suiteStart", startModule.suiteReport.start(true));
+ runLoggingCallbacks("moduleStart", {
+ name: startModule.name,
+ tests: startModule.tests
+ });
+ }
+
+ config.current = this;
+
+ this.testEnvironment = extend({}, module.testEnvironment);
+
+ this.started = now();
+ emit("testStart", this.testReport.start(true));
+ runLoggingCallbacks("testStart", {
+ name: this.testName,
+ module: module.name,
+ testId: this.testId,
+ previousFailure: this.previousFailure
+ });
+
+ if (!config.pollution) {
+ saveGlobal();
+ }
+ },
+
+ run: function run() {
+ var promise;
+
+ config.current = this;
+
+ this.callbackStarted = now();
+
+ if (config.notrycatch) {
+ runTest(this);
+ return;
+ }
+
+ try {
+ runTest(this);
+ } catch (e) {
+ this.pushFailure("Died on test #" + (this.assertions.length + 1) + " " + this.stack + ": " + (e.message || e), extractStacktrace(e, 0));
+
+ // Else next test will carry the responsibility
+ saveGlobal();
+
+ // Restart the tests if they're blocking
+ if (config.blocking) {
+ internalRecover(this);
+ }
+ }
+
+ function runTest(test) {
+ promise = test.callback.call(test.testEnvironment, test.assert);
+ test.resolvePromise(promise);
+
+ // If the test has a "lock" on it, but the timeout is 0, then we push a
+ // failure as the test should be synchronous.
+ if (test.timeout === 0 && test.semaphore !== 0) {
+ pushFailure("Test did not finish synchronously even though assert.timeout( 0 ) was used.", sourceFromStacktrace(2));
+ }
+ }
+ },
+
+ after: function after() {
+ checkPollution();
+ },
+
+ queueHook: function queueHook(hook, hookName, hookOwner) {
+ var _this = this;
+
+ var callHook = function callHook() {
+ var promise = hook.call(_this.testEnvironment, _this.assert);
+ _this.resolvePromise(promise, hookName);
+ };
+
+ var runHook = function runHook() {
+ if (hookName === "before") {
+ if (hookOwner.unskippedTestsRun !== 0) {
+ return;
+ }
+
+ _this.preserveEnvironment = true;
+ }
+
+ if (hookName === "after" && hookOwner.unskippedTestsRun !== numberOfUnskippedTests(hookOwner) - 1 && config.queue.length > 2) {
+ return;
+ }
+
+ config.current = _this;
+ if (config.notrycatch) {
+ callHook();
+ return;
+ }
+ try {
+ callHook();
+ } catch (error) {
+ _this.pushFailure(hookName + " failed on " + _this.testName + ": " + (error.message || error), extractStacktrace(error, 0));
+ }
+ };
+
+ return runHook;
+ },
+
+
+ // Currently only used for module level hooks, can be used to add global level ones
+ hooks: function hooks(handler) {
+ var hooks = [];
+
+ function processHooks(test, module) {
+ if (module.parentModule) {
+ processHooks(test, module.parentModule);
+ }
+
+ if (module.hooks[handler].length) {
+ for (var i = 0; i < module.hooks[handler].length; i++) {
+ hooks.push(test.queueHook(module.hooks[handler][i], handler, module));
+ }
+ }
+ }
+
+ // Hooks are ignored on skipped tests
+ if (!this.skip) {
+ processHooks(this, this.module);
+ }
+
+ return hooks;
+ },
+
+
+ finish: function finish() {
+ config.current = this;
+
+ if (this.steps.length) {
+ var stepsList = this.steps.join(", ");
+ this.pushFailure("Expected assert.verifySteps() to be called before end of test " + ("after using assert.step(). Unverified steps: " + stepsList), this.stack);
+ }
+
+ if (config.requireExpects && this.expected === null) {
+ this.pushFailure("Expected number of assertions to be defined, but expect() was " + "not called.", this.stack);
+ } else if (this.expected !== null && this.expected !== this.assertions.length) {
+ this.pushFailure("Expected " + this.expected + " assertions, but " + this.assertions.length + " were run", this.stack);
+ } else if (this.expected === null && !this.assertions.length) {
+ this.pushFailure("Expected at least one assertion, but none were run - call " + "expect(0) to accept zero assertions.", this.stack);
+ }
+
+ var i,
+ module = this.module,
+ moduleName = module.name,
+ testName = this.testName,
+ skipped = !!this.skip,
+ todo = !!this.todo,
+ bad = 0,
+ storage = config.storage;
+
+ this.runtime = now() - this.started;
+
+ config.stats.all += this.assertions.length;
+ module.stats.all += this.assertions.length;
+
+ for (i = 0; i < this.assertions.length; i++) {
+ if (!this.assertions[i].result) {
+ bad++;
+ config.stats.bad++;
+ module.stats.bad++;
+ }
+ }
+
+ notifyTestsRan(module, skipped);
+
+ // Store result when possible
+ if (storage) {
+ if (bad) {
+ storage.setItem("qunit-test-" + moduleName + "-" + testName, bad);
+ } else {
+ storage.removeItem("qunit-test-" + moduleName + "-" + testName);
+ }
+ }
+
+ // After emitting the js-reporters event we cleanup the assertion data to
+ // avoid leaking it. It is not used by the legacy testDone callbacks.
+ emit("testEnd", this.testReport.end(true));
+ this.testReport.slimAssertions();
+
+ runLoggingCallbacks("testDone", {
+ name: testName,
+ module: moduleName,
+ skipped: skipped,
+ todo: todo,
+ failed: bad,
+ passed: this.assertions.length - bad,
+ total: this.assertions.length,
+ runtime: skipped ? 0 : this.runtime,
+
+ // HTML Reporter use
+ assertions: this.assertions,
+ testId: this.testId,
+
+ // Source of Test
+ source: this.stack
+ });
+
+ if (module.testsRun === numberOfTests(module)) {
+ logSuiteEnd(module);
+
+ // Check if the parent modules, iteratively, are done. If that the case,
+ // we emit the `suiteEnd` event and trigger `moduleDone` callback.
+ var parent = module.parentModule;
+ while (parent && parent.testsRun === numberOfTests(parent)) {
+ logSuiteEnd(parent);
+ parent = parent.parentModule;
+ }
+ }
+
+ config.current = undefined;
+
+ function logSuiteEnd(module) {
+ emit("suiteEnd", module.suiteReport.end(true));
+ runLoggingCallbacks("moduleDone", {
+ name: module.name,
+ tests: module.tests,
+ failed: module.stats.bad,
+ passed: module.stats.all - module.stats.bad,
+ total: module.stats.all,
+ runtime: now() - module.stats.started
+ });
+ }
+ },
+
+ preserveTestEnvironment: function preserveTestEnvironment() {
+ if (this.preserveEnvironment) {
+ this.module.testEnvironment = this.testEnvironment;
+ this.testEnvironment = extend({}, this.module.testEnvironment);
+ }
+ },
+
+ queue: function queue() {
+ var test = this;
+
+ if (!this.valid()) {
+ return;
+ }
+
+ function runTest() {
+
+ // Each of these can by async
+ ProcessingQueue.addImmediate([function () {
+ test.before();
+ }, test.hooks("before"), function () {
+ test.preserveTestEnvironment();
+ }, test.hooks("beforeEach"), function () {
+ test.run();
+ }, test.hooks("afterEach").reverse(), test.hooks("after").reverse(), function () {
+ test.after();
+ }, function () {
+ test.finish();
+ }]);
+ }
+
+ var previousFailCount = config.storage && +config.storage.getItem("qunit-test-" + this.module.name + "-" + this.testName);
+
+ // Prioritize previously failed tests, detected from storage
+ var prioritize = config.reorder && !!previousFailCount;
+
+ this.previousFailure = !!previousFailCount;
+
+ ProcessingQueue.add(runTest, prioritize, config.seed);
+
+ // If the queue has already finished, we manually process the new test
+ if (ProcessingQueue.finished) {
+ ProcessingQueue.advance();
+ }
+ },
+
+
+ pushResult: function pushResult(resultInfo) {
+ if (this !== config.current) {
+ throw new Error("Assertion occurred after test had finished.");
+ }
+
+ // Destructure of resultInfo = { result, actual, expected, message, negative }
+ var source,
+ details = {
+ module: this.module.name,
+ name: this.testName,
+ result: resultInfo.result,
+ message: resultInfo.message,
+ actual: resultInfo.actual,
+ testId: this.testId,
+ negative: resultInfo.negative || false,
+ runtime: now() - this.started,
+ todo: !!this.todo
+ };
+
+ if (hasOwn.call(resultInfo, "expected")) {
+ details.expected = resultInfo.expected;
+ }
+
+ if (!resultInfo.result) {
+ source = resultInfo.source || sourceFromStacktrace();
+
+ if (source) {
+ details.source = source;
+ }
+ }
+
+ this.logAssertion(details);
+
+ this.assertions.push({
+ result: !!resultInfo.result,
+ message: resultInfo.message
+ });
+ },
+
+ pushFailure: function pushFailure(message, source, actual) {
+ if (!(this instanceof Test)) {
+ throw new Error("pushFailure() assertion outside test context, was " + sourceFromStacktrace(2));
+ }
+
+ this.pushResult({
+ result: false,
+ message: message || "error",
+ actual: actual || null,
+ source: source
+ });
+ },
+
+ /**
+ * Log assertion details using both the old QUnit.log interface and
+ * QUnit.on( "assertion" ) interface.
+ *
+ * @private
+ */
+ logAssertion: function logAssertion(details) {
+ runLoggingCallbacks("log", details);
+
+ var assertion = {
+ passed: details.result,
+ actual: details.actual,
+ expected: details.expected,
+ message: details.message,
+ stack: details.source,
+ todo: details.todo
+ };
+ this.testReport.pushAssertion(assertion);
+ emit("assertion", assertion);
+ },
+
+
+ resolvePromise: function resolvePromise(promise, phase) {
+ var then,
+ resume,
+ message,
+ test = this;
+ if (promise != null) {
+ then = promise.then;
+ if (objectType(then) === "function") {
+ resume = internalStop(test);
+ if (config.notrycatch) {
+ then.call(promise, function () {
+ resume();
+ });
+ } else {
+ then.call(promise, function () {
+ resume();
+ }, function (error) {
+ message = "Promise rejected " + (!phase ? "during" : phase.replace(/Each$/, "")) + " \"" + test.testName + "\": " + (error && error.message || error);
+ test.pushFailure(message, extractStacktrace(error, 0));
+
+ // Else next test will carry the responsibility
+ saveGlobal();
+
+ // Unblock
+ internalRecover(test);
+ });
+ }
+ }
+ }
+ },
+
+ valid: function valid() {
+ var filter = config.filter,
+ regexFilter = /^(!?)\/([\w\W]*)\/(i?$)/.exec(filter),
+ module = config.module && config.module.toLowerCase(),
+ fullName = this.module.name + ": " + this.testName;
+
+ function moduleChainNameMatch(testModule) {
+ var testModuleName = testModule.name ? testModule.name.toLowerCase() : null;
+ if (testModuleName === module) {
+ return true;
+ } else if (testModule.parentModule) {
+ return moduleChainNameMatch(testModule.parentModule);
+ } else {
+ return false;
+ }
+ }
+
+ function moduleChainIdMatch(testModule) {
+ return inArray(testModule.moduleId, config.moduleId) || testModule.parentModule && moduleChainIdMatch(testModule.parentModule);
+ }
+
+ // Internally-generated tests are always valid
+ if (this.callback && this.callback.validTest) {
+ return true;
+ }
+
+ if (config.moduleId && config.moduleId.length > 0 && !moduleChainIdMatch(this.module)) {
+
+ return false;
+ }
+
+ if (config.testId && config.testId.length > 0 && !inArray(this.testId, config.testId)) {
+
+ return false;
+ }
+
+ if (module && !moduleChainNameMatch(this.module)) {
+ return false;
+ }
+
+ if (!filter) {
+ return true;
+ }
+
+ return regexFilter ? this.regexFilter(!!regexFilter[1], regexFilter[2], regexFilter[3], fullName) : this.stringFilter(filter, fullName);
+ },
+
+ regexFilter: function regexFilter(exclude, pattern, flags, fullName) {
+ var regex = new RegExp(pattern, flags);
+ var match = regex.test(fullName);
+
+ return match !== exclude;
+ },
+
+ stringFilter: function stringFilter(filter, fullName) {
+ filter = filter.toLowerCase();
+ fullName = fullName.toLowerCase();
+
+ var include = filter.charAt(0) !== "!";
+ if (!include) {
+ filter = filter.slice(1);
+ }
+
+ // If the filter matches, we need to honour include
+ if (fullName.indexOf(filter) !== -1) {
+ return include;
+ }
+
+ // Otherwise, do the opposite
+ return !include;
+ }
+ };
+
+ function pushFailure() {
+ if (!config.current) {
+ throw new Error("pushFailure() assertion outside test context, in " + sourceFromStacktrace(2));
+ }
+
+ // Gets current test obj
+ var currentTest = config.current;
+
+ return currentTest.pushFailure.apply(currentTest, arguments);
+ }
+
+ function saveGlobal() {
+ config.pollution = [];
+
+ if (config.noglobals) {
+ for (var key in global$1) {
+ if (hasOwn.call(global$1, key)) {
+
+ // In Opera sometimes DOM element ids show up here, ignore them
+ if (/^qunit-test-output/.test(key)) {
+ continue;
+ }
+ config.pollution.push(key);
+ }
+ }
+ }
+ }
+
+ function checkPollution() {
+ var newGlobals,
+ deletedGlobals,
+ old = config.pollution;
+
+ saveGlobal();
+
+ newGlobals = diff(config.pollution, old);
+ if (newGlobals.length > 0) {
+ pushFailure("Introduced global variable(s): " + newGlobals.join(", "));
+ }
+
+ deletedGlobals = diff(old, config.pollution);
+ if (deletedGlobals.length > 0) {
+ pushFailure("Deleted global variable(s): " + deletedGlobals.join(", "));
+ }
+ }
+
+ // Will be exposed as QUnit.test
+ function test(testName, callback) {
+ if (focused$1) {
+ return;
+ }
+
+ var newTest = new Test({
+ testName: testName,
+ callback: callback
+ });
+
+ newTest.queue();
+ }
+
+ function todo(testName, callback) {
+ if (focused$1) {
+ return;
+ }
+
+ var newTest = new Test({
+ testName: testName,
+ callback: callback,
+ todo: true
+ });
+
+ newTest.queue();
+ }
+
+ // Will be exposed as QUnit.skip
+ function skip(testName) {
+ if (focused$1) {
+ return;
+ }
+
+ var test = new Test({
+ testName: testName,
+ skip: true
+ });
+
+ test.queue();
+ }
+
+ // Will be exposed as QUnit.only
+ function only(testName, callback) {
+ if (focused$1) {
+ return;
+ }
+
+ config.queue.length = 0;
+ focused$1 = true;
+
+ var newTest = new Test({
+ testName: testName,
+ callback: callback
+ });
+
+ newTest.queue();
+ }
+
+ // Put a hold on processing and return a function that will release it.
+ function internalStop(test) {
+ test.semaphore += 1;
+ config.blocking = true;
+
+ // Set a recovery timeout, if so configured.
+ if (defined.setTimeout) {
+ var timeoutDuration = void 0;
+
+ if (typeof test.timeout === "number") {
+ timeoutDuration = test.timeout;
+ } else if (typeof config.testTimeout === "number") {
+ timeoutDuration = config.testTimeout;
+ }
+
+ if (typeof timeoutDuration === "number" && timeoutDuration > 0) {
+ clearTimeout(config.timeout);
+ config.timeout = setTimeout(function () {
+ pushFailure("Test took longer than " + timeoutDuration + "ms; test timed out.", sourceFromStacktrace(2));
+ internalRecover(test);
+ }, timeoutDuration);
+ }
+ }
+
+ var released = false;
+ return function resume() {
+ if (released) {
+ return;
+ }
+
+ released = true;
+ test.semaphore -= 1;
+ internalStart(test);
+ };
+ }
+
+ // Forcefully release all processing holds.
+ function internalRecover(test) {
+ test.semaphore = 0;
+ internalStart(test);
+ }
+
+ // Release a processing hold, scheduling a resumption attempt if no holds remain.
+ function internalStart(test) {
+
+ // If semaphore is non-numeric, throw error
+ if (isNaN(test.semaphore)) {
+ test.semaphore = 0;
+
+ pushFailure("Invalid value on test.semaphore", sourceFromStacktrace(2));
+ return;
+ }
+
+ // Don't start until equal number of stop-calls
+ if (test.semaphore > 0) {
+ return;
+ }
+
+ // Throw an Error if start is called more often than stop
+ if (test.semaphore < 0) {
+ test.semaphore = 0;
+
+ pushFailure("Tried to restart test while already started (test's semaphore was 0 already)", sourceFromStacktrace(2));
+ return;
+ }
+
+ // Add a slight delay to allow more assertions etc.
+ if (defined.setTimeout) {
+ if (config.timeout) {
+ clearTimeout(config.timeout);
+ }
+ config.timeout = setTimeout(function () {
+ if (test.semaphore > 0) {
+ return;
+ }
+
+ if (config.timeout) {
+ clearTimeout(config.timeout);
+ }
+
+ begin();
+ });
+ } else {
+ begin();
+ }
+ }
+
+ function collectTests(module) {
+ var tests = [].concat(module.tests);
+ var modules = [].concat(toConsumableArray(module.childModules));
+
+ // Do a breadth-first traversal of the child modules
+ while (modules.length) {
+ var nextModule = modules.shift();
+ tests.push.apply(tests, nextModule.tests);
+ modules.push.apply(modules, toConsumableArray(nextModule.childModules));
+ }
+
+ return tests;
+ }
+
+ function numberOfTests(module) {
+ return collectTests(module).length;
+ }
+
+ function numberOfUnskippedTests(module) {
+ return collectTests(module).filter(function (test) {
+ return !test.skip;
+ }).length;
+ }
+
+ function notifyTestsRan(module, skipped) {
+ module.testsRun++;
+ if (!skipped) {
+ module.unskippedTestsRun++;
+ }
+ while (module = module.parentModule) {
+ module.testsRun++;
+ if (!skipped) {
+ module.unskippedTestsRun++;
+ }
+ }
+ }
+
+ /**
+ * Returns a function that proxies to the given method name on the globals
+ * console object. The proxy will also detect if the console doesn't exist and
+ * will appropriately no-op. This allows support for IE9, which doesn't have a
+ * console if the developer tools are not open.
+ */
+ function consoleProxy(method) {
+ return function () {
+ if (console) {
+ console[method].apply(console, arguments);
+ }
+ };
+ }
+
+ var Logger = {
+ warn: consoleProxy("warn")
+ };
+
+ var Assert = function () {
+ function Assert(testContext) {
+ classCallCheck(this, Assert);
+
+ this.test = testContext;
+ }
+
+ // Assert helpers
+
+ createClass(Assert, [{
+ key: "timeout",
+ value: function timeout(duration) {
+ if (typeof duration !== "number") {
+ throw new Error("You must pass a number as the duration to assert.timeout");
+ }
+
+ this.test.timeout = duration;
+ }
+
+ // Documents a "step", which is a string value, in a test as a passing assertion
+
+ }, {
+ key: "step",
+ value: function step(message) {
+ var result = !!message;
+
+ this.test.steps.push(message);
+
+ return this.pushResult({
+ result: result,
+ message: message || "You must provide a message to assert.step"
+ });
+ }
+
+ // Verifies the steps in a test match a given array of string values
+
+ }, {
+ key: "verifySteps",
+ value: function verifySteps(steps, message) {
+ this.deepEqual(this.test.steps, steps, message);
+ this.test.steps.length = 0;
+ }
+
+ // Specify the number of expected assertions to guarantee that failed test
+ // (no assertions are run at all) don't slip through.
+
+ }, {
+ key: "expect",
+ value: function expect(asserts) {
+ if (arguments.length === 1) {
+ this.test.expected = asserts;
+ } else {
+ return this.test.expected;
+ }
+ }
+
+ // Put a hold on processing and return a function that will release it a maximum of once.
+
+ }, {
+ key: "async",
+ value: function async(count) {
+ var test$$1 = this.test;
+
+ var popped = false,
+ acceptCallCount = count;
+
+ if (typeof acceptCallCount === "undefined") {
+ acceptCallCount = 1;
+ }
+
+ var resume = internalStop(test$$1);
+
+ return function done() {
+ if (config.current !== test$$1) {
+ throw Error("assert.async callback called after test finished.");
+ }
+
+ if (popped) {
+ test$$1.pushFailure("Too many calls to the `assert.async` callback", sourceFromStacktrace(2));
+ return;
+ }
+
+ acceptCallCount -= 1;
+ if (acceptCallCount > 0) {
+ return;
+ }
+
+ popped = true;
+ resume();
+ };
+ }
+
+ // Exports test.push() to the user API
+ // Alias of pushResult.
+
+ }, {
+ key: "push",
+ value: function push(result, actual, expected, message, negative) {
+ Logger.warn("assert.push is deprecated and will be removed in QUnit 3.0." + " Please use assert.pushResult instead (https://api.qunitjs.com/assert/pushResult).");
+
+ var currentAssert = this instanceof Assert ? this : config.current.assert;
+ return currentAssert.pushResult({
+ result: result,
+ actual: actual,
+ expected: expected,
+ message: message,
+ negative: negative
+ });
+ }
+ }, {
+ key: "pushResult",
+ value: function pushResult(resultInfo) {
+
+ // Destructure of resultInfo = { result, actual, expected, message, negative }
+ var assert = this;
+ var currentTest = assert instanceof Assert && assert.test || config.current;
+
+ // Backwards compatibility fix.
+ // Allows the direct use of global exported assertions and QUnit.assert.*
+ // Although, it's use is not recommended as it can leak assertions
+ // to other tests from async tests, because we only get a reference to the current test,
+ // not exactly the test where assertion were intended to be called.
+ if (!currentTest) {
+ throw new Error("assertion outside test context, in " + sourceFromStacktrace(2));
+ }
+
+ if (!(assert instanceof Assert)) {
+ assert = currentTest.assert;
+ }
+
+ return assert.test.pushResult(resultInfo);
+ }
+ }, {
+ key: "ok",
+ value: function ok(result, message) {
+ if (!message) {
+ message = result ? "okay" : "failed, expected argument to be truthy, was: " + dump.parse(result);
+ }
+
+ this.pushResult({
+ result: !!result,
+ actual: result,
+ expected: true,
+ message: message
+ });
+ }
+ }, {
+ key: "notOk",
+ value: function notOk(result, message) {
+ if (!message) {
+ message = !result ? "okay" : "failed, expected argument to be falsy, was: " + dump.parse(result);
+ }
+
+ this.pushResult({
+ result: !result,
+ actual: result,
+ expected: false,
+ message: message
+ });
+ }
+ }, {
+ key: "equal",
+ value: function equal(actual, expected, message) {
+
+ // eslint-disable-next-line eqeqeq
+ var result = expected == actual;
+
+ this.pushResult({
+ result: result,
+ actual: actual,
+ expected: expected,
+ message: message
+ });
+ }
+ }, {
+ key: "notEqual",
+ value: function notEqual(actual, expected, message) {
+
+ // eslint-disable-next-line eqeqeq
+ var result = expected != actual;
+
+ this.pushResult({
+ result: result,
+ actual: actual,
+ expected: expected,
+ message: message,
+ negative: true
+ });
+ }
+ }, {
+ key: "propEqual",
+ value: function propEqual(actual, expected, message) {
+ actual = objectValues(actual);
+ expected = objectValues(expected);
+
+ this.pushResult({
+ result: equiv(actual, expected),
+ actual: actual,
+ expected: expected,
+ message: message
+ });
+ }
+ }, {
+ key: "notPropEqual",
+ value: function notPropEqual(actual, expected, message) {
+ actual = objectValues(actual);
+ expected = objectValues(expected);
+
+ this.pushResult({
+ result: !equiv(actual, expected),
+ actual: actual,
+ expected: expected,
+ message: message,
+ negative: true
+ });
+ }
+ }, {
+ key: "deepEqual",
+ value: function deepEqual(actual, expected, message) {
+ this.pushResult({
+ result: equiv(actual, expected),
+ actual: actual,
+ expected: expected,
+ message: message
+ });
+ }
+ }, {
+ key: "notDeepEqual",
+ value: function notDeepEqual(actual, expected, message) {
+ this.pushResult({
+ result: !equiv(actual, expected),
+ actual: actual,
+ expected: expected,
+ message: message,
+ negative: true
+ });
+ }
+ }, {
+ key: "strictEqual",
+ value: function strictEqual(actual, expected, message) {
+ this.pushResult({
+ result: expected === actual,
+ actual: actual,
+ expected: expected,
+ message: message
+ });
+ }
+ }, {
+ key: "notStrictEqual",
+ value: function notStrictEqual(actual, expected, message) {
+ this.pushResult({
+ result: expected !== actual,
+ actual: actual,
+ expected: expected,
+ message: message,
+ negative: true
+ });
+ }
+ }, {
+ key: "throws",
+ value: function throws(block, expected, message) {
+ var actual = void 0,
+ result = false;
+
+ var currentTest = this instanceof Assert && this.test || config.current;
+
+ // 'expected' is optional unless doing string comparison
+ if (objectType(expected) === "string") {
+ if (message == null) {
+ message = expected;
+ expected = null;
+ } else {
+ throw new Error("throws/raises does not accept a string value for the expected argument.\n" + "Use a non-string object value (e.g. regExp) instead if it's necessary.");
+ }
+ }
+
+ currentTest.ignoreGlobalErrors = true;
+ try {
+ block.call(currentTest.testEnvironment);
+ } catch (e) {
+ actual = e;
+ }
+ currentTest.ignoreGlobalErrors = false;
+
+ if (actual) {
+ var expectedType = objectType(expected);
+
+ // We don't want to validate thrown error
+ if (!expected) {
+ result = true;
+ expected = null;
+
+ // Expected is a regexp
+ } else if (expectedType === "regexp") {
+ result = expected.test(errorString(actual));
+
+ // Expected is a constructor, maybe an Error constructor
+ } else if (expectedType === "function" && actual instanceof expected) {
+ result = true;
+
+ // Expected is an Error object
+ } else if (expectedType === "object") {
+ result = actual instanceof expected.constructor && actual.name === expected.name && actual.message === expected.message;
+
+ // Expected is a validation function which returns true if validation passed
+ } else if (expectedType === "function" && expected.call({}, actual) === true) {
+ expected = null;
+ result = true;
+ }
+ }
+
+ currentTest.assert.pushResult({
+ result: result,
+ actual: actual,
+ expected: expected,
+ message: message
+ });
+ }
+ }, {
+ key: "rejects",
+ value: function rejects(promise, expected, message) {
+ var result = false;
+
+ var currentTest = this instanceof Assert && this.test || config.current;
+
+ // 'expected' is optional unless doing string comparison
+ if (objectType(expected) === "string") {
+ if (message === undefined) {
+ message = expected;
+ expected = undefined;
+ } else {
+ message = "assert.rejects does not accept a string value for the expected " + "argument.\nUse a non-string object value (e.g. validator function) instead " + "if necessary.";
+
+ currentTest.assert.pushResult({
+ result: false,
+ message: message
+ });
+
+ return;
+ }
+ }
+
+ var then = promise && promise.then;
+ if (objectType(then) !== "function") {
+ var _message = "The value provided to `assert.rejects` in " + "\"" + currentTest.testName + "\" was not a promise.";
+
+ currentTest.assert.pushResult({
+ result: false,
+ message: _message,
+ actual: promise
+ });
+
+ return;
+ }
+
+ var done = this.async();
+
+ return then.call(promise, function handleFulfillment() {
+ var message = "The promise returned by the `assert.rejects` callback in " + "\"" + currentTest.testName + "\" did not reject.";
+
+ currentTest.assert.pushResult({
+ result: false,
+ message: message,
+ actual: promise
+ });
+
+ done();
+ }, function handleRejection(actual) {
+ if (actual) {
+ var expectedType = objectType(expected);
+
+ // We don't want to validate
+ if (expected === undefined) {
+ result = true;
+ expected = null;
+
+ // Expected is a regexp
+ } else if (expectedType === "regexp") {
+ result = expected.test(errorString(actual));
+
+ // Expected is a constructor, maybe an Error constructor
+ } else if (expectedType === "function" && actual instanceof expected) {
+ result = true;
+
+ // Expected is an Error object
+ } else if (expectedType === "object") {
+ result = actual instanceof expected.constructor && actual.name === expected.name && actual.message === expected.message;
+
+ // Expected is a validation function which returns true if validation passed
+ } else {
+ if (expectedType === "function") {
+ result = expected.call({}, actual) === true;
+ expected = null;
+
+ // Expected is some other invalid type
+ } else {
+ result = false;
+ message = "invalid expected value provided to `assert.rejects` " + "callback in \"" + currentTest.testName + "\": " + expectedType + ".";
+ }
+ }
+ }
+
+ currentTest.assert.pushResult({
+ result: result,
+ actual: actual,
+ expected: expected,
+ message: message
+ });
+
+ done();
+ });
+ }
+ }]);
+ return Assert;
+ }();
+
+ // Provide an alternative to assert.throws(), for environments that consider throws a reserved word
+ // Known to us are: Closure Compiler, Narwhal
+ // eslint-disable-next-line dot-notation
+
+
+ Assert.prototype.raises = Assert.prototype["throws"];
+
+ /**
+ * Converts an error into a simple string for comparisons.
+ *
+ * @param {Error} error
+ * @return {String}
+ */
+ function errorString(error) {
+ var resultErrorString = error.toString();
+
+ if (resultErrorString.substring(0, 7) === "[object") {
+ var name = error.name ? error.name.toString() : "Error";
+ var message = error.message ? error.message.toString() : "";
+
+ if (name && message) {
+ return name + ": " + message;
+ } else if (name) {
+ return name;
+ } else if (message) {
+ return message;
+ } else {
+ return "Error";
+ }
+ } else {
+ return resultErrorString;
+ }
+ }
+
+ /* global module, exports, define */
+ function exportQUnit(QUnit) {
+
+ if (defined.document) {
+
+ // QUnit may be defined when it is preconfigured but then only QUnit and QUnit.config may be defined.
+ if (window.QUnit && window.QUnit.version) {
+ throw new Error("QUnit has already been defined.");
+ }
+
+ window.QUnit = QUnit;
+ }
+
+ // For nodejs
+ if (typeof module !== "undefined" && module && module.exports) {
+ module.exports = QUnit;
+
+ // For consistency with CommonJS environments' exports
+ module.exports.QUnit = QUnit;
+ }
+
+ // For CommonJS with exports, but without module.exports, like Rhino
+ if (typeof exports !== "undefined" && exports) {
+ exports.QUnit = QUnit;
+ }
+
+ if (typeof define === "function" && define.amd) {
+ define(function () {
+ return QUnit;
+ });
+ QUnit.config.autostart = false;
+ }
+
+ // For Web/Service Workers
+ if (self$1 && self$1.WorkerGlobalScope && self$1 instanceof self$1.WorkerGlobalScope) {
+ self$1.QUnit = QUnit;
+ }
+ }
+
+ var SuiteReport = function () {
+ function SuiteReport(name, parentSuite) {
+ classCallCheck(this, SuiteReport);
+
+ this.name = name;
+ this.fullName = parentSuite ? parentSuite.fullName.concat(name) : [];
+
+ this.tests = [];
+ this.childSuites = [];
+
+ if (parentSuite) {
+ parentSuite.pushChildSuite(this);
+ }
+ }
+
+ createClass(SuiteReport, [{
+ key: "start",
+ value: function start(recordTime) {
+ if (recordTime) {
+ this._startTime = Date.now();
+ }
+
+ return {
+ name: this.name,
+ fullName: this.fullName.slice(),
+ tests: this.tests.map(function (test) {
+ return test.start();
+ }),
+ childSuites: this.childSuites.map(function (suite) {
+ return suite.start();
+ }),
+ testCounts: {
+ total: this.getTestCounts().total
+ }
+ };
+ }
+ }, {
+ key: "end",
+ value: function end(recordTime) {
+ if (recordTime) {
+ this._endTime = Date.now();
+ }
+
+ return {
+ name: this.name,
+ fullName: this.fullName.slice(),
+ tests: this.tests.map(function (test) {
+ return test.end();
+ }),
+ childSuites: this.childSuites.map(function (suite) {
+ return suite.end();
+ }),
+ testCounts: this.getTestCounts(),
+ runtime: this.getRuntime(),
+ status: this.getStatus()
+ };
+ }
+ }, {
+ key: "pushChildSuite",
+ value: function pushChildSuite(suite) {
+ this.childSuites.push(suite);
+ }
+ }, {
+ key: "pushTest",
+ value: function pushTest(test) {
+ this.tests.push(test);
+ }
+ }, {
+ key: "getRuntime",
+ value: function getRuntime() {
+ return this._endTime - this._startTime;
+ }
+ }, {
+ key: "getTestCounts",
+ value: function getTestCounts() {
+ var counts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { passed: 0, failed: 0, skipped: 0, todo: 0, total: 0 };
+
+ counts = this.tests.reduce(function (counts, test) {
+ if (test.valid) {
+ counts[test.getStatus()]++;
+ counts.total++;
+ }
+
+ return counts;
+ }, counts);
+
+ return this.childSuites.reduce(function (counts, suite) {
+ return suite.getTestCounts(counts);
+ }, counts);
+ }
+ }, {
+ key: "getStatus",
+ value: function getStatus() {
+ var _getTestCounts = this.getTestCounts(),
+ total = _getTestCounts.total,
+ failed = _getTestCounts.failed,
+ skipped = _getTestCounts.skipped,
+ todo = _getTestCounts.todo;
+
+ if (failed) {
+ return "failed";
+ } else {
+ if (skipped === total) {
+ return "skipped";
+ } else if (todo === total) {
+ return "todo";
+ } else {
+ return "passed";
+ }
+ }
+ }
+ }]);
+ return SuiteReport;
+ }();
+
+ // Handle an unhandled exception. By convention, returns true if further
+ // error handling should be suppressed and false otherwise.
+ // In this case, we will only suppress further error handling if the
+ // "ignoreGlobalErrors" configuration option is enabled.
+ function onError(error) {
+ for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ args[_key - 1] = arguments[_key];
+ }
+
+ if (config.current) {
+ if (config.current.ignoreGlobalErrors) {
+ return true;
+ }
+ pushFailure.apply(undefined, [error.message, error.fileName + ":" + error.lineNumber].concat(args));
+ } else {
+ test("global failure", extend(function () {
+ pushFailure.apply(undefined, [error.message, error.fileName + ":" + error.lineNumber].concat(args));
+ }, { validTest: true }));
+ }
+
+ return false;
+ }
+
+ // Handle an unhandled rejection
+ function onUnhandledRejection(reason) {
+ var resultInfo = {
+ result: false,
+ message: reason.message || "error",
+ actual: reason,
+ source: reason.stack || sourceFromStacktrace(3)
+ };
+
+ var currentTest = config.current;
+ if (currentTest) {
+ currentTest.assert.pushResult(resultInfo);
+ } else {
+ test("global failure", extend(function (assert) {
+ assert.pushResult(resultInfo);
+ }, { validTest: true }));
+ }
+ }
+
+ var focused = false;
+ var QUnit = {};
+ var globalSuite = new SuiteReport();
+
+ // The initial "currentModule" represents the global (or top-level) module that
+ // is not explicitly defined by the user, therefore we add the "globalSuite" to
+ // it since each module has a suiteReport associated with it.
+ config.currentModule.suiteReport = globalSuite;
+
+ var moduleStack = [];
+ var globalStartCalled = false;
+ var runStarted = false;
+
+ // Figure out if we're running the tests from a server or not
+ QUnit.isLocal = !(defined.document && window.location.protocol !== "file:");
+
+ // Expose the current QUnit version
+ QUnit.version = "2.5.1";
+
+ function createModule(name, testEnvironment, modifiers) {
+ var parentModule = moduleStack.length ? moduleStack.slice(-1)[0] : null;
+ var moduleName = parentModule !== null ? [parentModule.name, name].join(" > ") : name;
+ var parentSuite = parentModule ? parentModule.suiteReport : globalSuite;
+
+ var skip$$1 = parentModule !== null && parentModule.skip || modifiers.skip;
+ var todo$$1 = parentModule !== null && parentModule.todo || modifiers.todo;
+
+ var module = {
+ name: moduleName,
+ parentModule: parentModule,
+ tests: [],
+ moduleId: generateHash(moduleName),
+ testsRun: 0,
+ unskippedTestsRun: 0,
+ childModules: [],
+ suiteReport: new SuiteReport(name, parentSuite),
+
+ // Pass along `skip` and `todo` properties from parent module, in case
+ // there is one, to childs. And use own otherwise.
+ // This property will be used to mark own tests and tests of child suites
+ // as either `skipped` or `todo`.
+ skip: skip$$1,
+ todo: skip$$1 ? false : todo$$1
+ };
+
+ var env = {};
+ if (parentModule) {
+ parentModule.childModules.push(module);
+ extend(env, parentModule.testEnvironment);
+ }
+ extend(env, testEnvironment);
+ module.testEnvironment = env;
+
+ config.modules.push(module);
+ return module;
+ }
+
+ function processModule(name, options, executeNow) {
+ var modifiers = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
+
+ var module = createModule(name, options, modifiers);
+
+ // Move any hooks to a 'hooks' object
+ var testEnvironment = module.testEnvironment;
+ var hooks = module.hooks = {};
+
+ setHookFromEnvironment(hooks, testEnvironment, "before");
+ setHookFromEnvironment(hooks, testEnvironment, "beforeEach");
+ setHookFromEnvironment(hooks, testEnvironment, "afterEach");
+ setHookFromEnvironment(hooks, testEnvironment, "after");
+
+ function setHookFromEnvironment(hooks, environment, name) {
+ var potentialHook = environment[name];
+ hooks[name] = typeof potentialHook === "function" ? [potentialHook] : [];
+ delete environment[name];
+ }
+
+ var moduleFns = {
+ before: setHookFunction(module, "before"),
+ beforeEach: setHookFunction(module, "beforeEach"),
+ afterEach: setHookFunction(module, "afterEach"),
+ after: setHookFunction(module, "after")
+ };
+
+ var currentModule = config.currentModule;
+ if (objectType(executeNow) === "function") {
+ moduleStack.push(module);
+ config.currentModule = module;
+ executeNow.call(module.testEnvironment, moduleFns);
+ moduleStack.pop();
+ module = module.parentModule || currentModule;
+ }
+
+ config.currentModule = module;
+ }
+
+ // TODO: extract this to a new file alongside its related functions
+ function module$1(name, options, executeNow) {
+ if (focused) {
+ return;
+ }
+
+ if (arguments.length === 2) {
+ if (objectType(options) === "function") {
+ executeNow = options;
+ options = undefined;
+ }
+ }
+
+ processModule(name, options, executeNow);
+ }
+
+ module$1.only = function () {
+ if (focused) {
+ return;
+ }
+
+ config.modules.length = 0;
+ config.queue.length = 0;
+
+ module$1.apply(undefined, arguments);
+
+ focused = true;
+ };
+
+ module$1.skip = function (name, options, executeNow) {
+ if (focused) {
+ return;
+ }
+
+ if (arguments.length === 2) {
+ if (objectType(options) === "function") {
+ executeNow = options;
+ options = undefined;
+ }
+ }
+
+ processModule(name, options, executeNow, { skip: true });
+ };
+
+ module$1.todo = function (name, options, executeNow) {
+ if (focused) {
+ return;
+ }
+
+ if (arguments.length === 2) {
+ if (objectType(options) === "function") {
+ executeNow = options;
+ options = undefined;
+ }
+ }
+
+ processModule(name, options, executeNow, { todo: true });
+ };
+
+ extend(QUnit, {
+ on: on,
+
+ module: module$1,
+
+ test: test,
+
+ todo: todo,
+
+ skip: skip,
+
+ only: only,
+
+ start: function start(count) {
+ var globalStartAlreadyCalled = globalStartCalled;
+
+ if (!config.current) {
+ globalStartCalled = true;
+
+ if (runStarted) {
+ throw new Error("Called start() while test already started running");
+ } else if (globalStartAlreadyCalled || count > 1) {
+ throw new Error("Called start() outside of a test context too many times");
+ } else if (config.autostart) {
+ throw new Error("Called start() outside of a test context when " + "QUnit.config.autostart was true");
+ } else if (!config.pageLoaded) {
+
+ // The page isn't completely loaded yet, so we set autostart and then
+ // load if we're in Node or wait for the browser's load event.
+ config.autostart = true;
+
+ // Starts from Node even if .load was not previously called. We still return
+ // early otherwise we'll wind up "beginning" twice.
+ if (!defined.document) {
+ QUnit.load();
+ }
+
+ return;
+ }
+ } else {
+ throw new Error("QUnit.start cannot be called inside a test context.");
+ }
+
+ scheduleBegin();
+ },
+
+ config: config,
+
+ is: is,
+
+ objectType: objectType,
+
+ extend: extend,
+
+ load: function load() {
+ config.pageLoaded = true;
+
+ // Initialize the configuration options
+ extend(config, {
+ stats: { all: 0, bad: 0 },
+ started: 0,
+ updateRate: 1000,
+ autostart: true,
+ filter: ""
+ }, true);
+
+ if (!runStarted) {
+ config.blocking = false;
+
+ if (config.autostart) {
+ scheduleBegin();
+ }
+ }
+ },
+
+ stack: function stack(offset) {
+ offset = (offset || 0) + 2;
+ return sourceFromStacktrace(offset);
+ },
+
+ onError: onError,
+
+ onUnhandledRejection: onUnhandledRejection
+ });
+
+ QUnit.pushFailure = pushFailure;
+ QUnit.assert = Assert.prototype;
+ QUnit.equiv = equiv;
+ QUnit.dump = dump;
+
+ registerLoggingCallbacks(QUnit);
+
+ function scheduleBegin() {
+
+ runStarted = true;
+
+ // Add a slight delay to allow definition of more modules and tests.
+ if (defined.setTimeout) {
+ setTimeout(function () {
+ begin();
+ });
+ } else {
+ begin();
+ }
+ }
+
+ function begin() {
+ var i,
+ l,
+ modulesLog = [];
+
+ // If the test run hasn't officially begun yet
+ if (!config.started) {
+
+ // Record the time of the test run's beginning
+ config.started = now();
+
+ // Delete the loose unnamed module if unused.
+ if (config.modules[0].name === "" && config.modules[0].tests.length === 0) {
+ config.modules.shift();
+ }
+
+ // Avoid unnecessary information by not logging modules' test environments
+ for (i = 0, l = config.modules.length; i < l; i++) {
+ modulesLog.push({
+ name: config.modules[i].name,
+ tests: config.modules[i].tests
+ });
+ }
+
+ // The test run is officially beginning now
+ emit("runStart", globalSuite.start(true));
+ runLoggingCallbacks("begin", {
+ totalTests: Test.count,
+ modules: modulesLog
+ });
+ }
+
+ config.blocking = false;
+ ProcessingQueue.advance();
+ }
+
+ function setHookFunction(module, hookName) {
+ return function setHook(callback) {
+ module.hooks[hookName].push(callback);
+ };
+ }
+
+ exportQUnit(QUnit);
+
+ (function () {
+
+ if (typeof window === "undefined" || typeof document === "undefined") {
+ return;
+ }
+
+ var config = QUnit.config,
+ hasOwn = Object.prototype.hasOwnProperty;
+
+ // Stores fixture HTML for resetting later
+ function storeFixture() {
+
+ // Avoid overwriting user-defined values
+ if (hasOwn.call(config, "fixture")) {
+ return;
+ }
+
+ var fixture = document.getElementById("qunit-fixture");
+ if (fixture) {
+ config.fixture = fixture.cloneNode(true);
+ }
+ }
+
+ QUnit.begin(storeFixture);
+
+ // Resets the fixture DOM element if available.
+ function resetFixture() {
+ if (config.fixture == null) {
+ return;
+ }
+
+ var fixture = document.getElementById("qunit-fixture");
+ var resetFixtureType = _typeof(config.fixture);
+ if (resetFixtureType === "string") {
+
+ // support user defined values for `config.fixture`
+ var newFixture = document.createElement("div");
+ newFixture.setAttribute("id", "qunit-fixture");
+ newFixture.innerHTML = config.fixture;
+ fixture.parentNode.replaceChild(newFixture, fixture);
+ } else {
+ var clonedFixture = config.fixture.cloneNode(true);
+ fixture.parentNode.replaceChild(clonedFixture, fixture);
+ }
+ }
+
+ QUnit.testStart(resetFixture);
+ })();
+
+ (function () {
+
+ // Only interact with URLs via window.location
+ var location = typeof window !== "undefined" && window.location;
+ if (!location) {
+ return;
+ }
+
+ var urlParams = getUrlParams();
+
+ QUnit.urlParams = urlParams;
+
+ // Match module/test by inclusion in an array
+ QUnit.config.moduleId = [].concat(urlParams.moduleId || []);
+ QUnit.config.testId = [].concat(urlParams.testId || []);
+
+ // Exact case-insensitive match of the module name
+ QUnit.config.module = urlParams.module;
+
+ // Regular expression or case-insenstive substring match against "moduleName: testName"
+ QUnit.config.filter = urlParams.filter;
+
+ // Test order randomization
+ if (urlParams.seed === true) {
+
+ // Generate a random seed if the option is specified without a value
+ QUnit.config.seed = Math.random().toString(36).slice(2);
+ } else if (urlParams.seed) {
+ QUnit.config.seed = urlParams.seed;
+ }
+
+ // Add URL-parameter-mapped config values with UI form rendering data
+ QUnit.config.urlConfig.push({
+ id: "hidepassed",
+ label: "Hide passed tests",
+ tooltip: "Only show tests and assertions that fail. Stored as query-strings."
+ }, {
+ id: "noglobals",
+ label: "Check for Globals",
+ tooltip: "Enabling this will test if any test introduces new properties on the " + "global object (`window` in Browsers). Stored as query-strings."
+ }, {
+ id: "notrycatch",
+ label: "No try-catch",
+ tooltip: "Enabling this will run tests outside of a try-catch block. Makes debugging " + "exceptions in IE reasonable. Stored as query-strings."
+ });
+
+ QUnit.begin(function () {
+ var i,
+ option,
+ urlConfig = QUnit.config.urlConfig;
+
+ for (i = 0; i < urlConfig.length; i++) {
+
+ // Options can be either strings or objects with nonempty "id" properties
+ option = QUnit.config.urlConfig[i];
+ if (typeof option !== "string") {
+ option = option.id;
+ }
+
+ if (QUnit.config[option] === undefined) {
+ QUnit.config[option] = urlParams[option];
+ }
+ }
+ });
+
+ function getUrlParams() {
+ var i, param, name, value;
+ var urlParams = Object.create(null);
+ var params = location.search.slice(1).split("&");
+ var length = params.length;
+
+ for (i = 0; i < length; i++) {
+ if (params[i]) {
+ param = params[i].split("=");
+ name = decodeQueryParam(param[0]);
+
+ // Allow just a key to turn on a flag, e.g., test.html?noglobals
+ value = param.length === 1 || decodeQueryParam(param.slice(1).join("="));
+ if (name in urlParams) {
+ urlParams[name] = [].concat(urlParams[name], value);
+ } else {
+ urlParams[name] = value;
+ }
+ }
+ }
+
+ return urlParams;
+ }
+
+ function decodeQueryParam(param) {
+ return decodeURIComponent(param.replace(/\+/g, "%20"));
+ }
+ })();
+
+ var stats = {
+ passedTests: 0,
+ failedTests: 0,
+ skippedTests: 0,
+ todoTests: 0
+ };
+
+ // Escape text for attribute or text content.
+ function escapeText(s) {
+ if (!s) {
+ return "";
+ }
+ s = s + "";
+
+ // Both single quotes and double quotes (for attributes)
+ return s.replace(/['"<>&]/g, function (s) {
+ switch (s) {
+ case "'":
+ return "&#039;";
+ case "\"":
+ return "&quot;";
+ case "<":
+ return "&lt;";
+ case ">":
+ return "&gt;";
+ case "&":
+ return "&amp;";
+ }
+ });
+ }
+
+ (function () {
+
+ // Don't load the HTML Reporter on non-browser environments
+ if (typeof window === "undefined" || !window.document) {
+ return;
+ }
+
+ var config = QUnit.config,
+ document$$1 = window.document,
+ collapseNext = false,
+ hasOwn = Object.prototype.hasOwnProperty,
+ unfilteredUrl = setUrl({ filter: undefined, module: undefined,
+ moduleId: undefined, testId: undefined }),
+ modulesList = [];
+
+ function addEvent(elem, type, fn) {
+ elem.addEventListener(type, fn, false);
+ }
+
+ function removeEvent(elem, type, fn) {
+ elem.removeEventListener(type, fn, false);
+ }
+
+ function addEvents(elems, type, fn) {
+ var i = elems.length;
+ while (i--) {
+ addEvent(elems[i], type, fn);
+ }
+ }
+
+ function hasClass(elem, name) {
+ return (" " + elem.className + " ").indexOf(" " + name + " ") >= 0;
+ }
+
+ function addClass(elem, name) {
+ if (!hasClass(elem, name)) {
+ elem.className += (elem.className ? " " : "") + name;
+ }
+ }
+
+ function toggleClass(elem, name, force) {
+ if (force || typeof force === "undefined" && !hasClass(elem, name)) {
+ addClass(elem, name);
+ } else {
+ removeClass(elem, name);
+ }
+ }
+
+ function removeClass(elem, name) {
+ var set = " " + elem.className + " ";
+
+ // Class name may appear multiple times
+ while (set.indexOf(" " + name + " ") >= 0) {
+ set = set.replace(" " + name + " ", " ");
+ }
+
+ // Trim for prettiness
+ elem.className = typeof set.trim === "function" ? set.trim() : set.replace(/^\s+|\s+$/g, "");
+ }
+
+ function id(name) {
+ return document$$1.getElementById && document$$1.getElementById(name);
+ }
+
+ function abortTests() {
+ var abortButton = id("qunit-abort-tests-button");
+ if (abortButton) {
+ abortButton.disabled = true;
+ abortButton.innerHTML = "Aborting...";
+ }
+ QUnit.config.queue.length = 0;
+ return false;
+ }
+
+ function interceptNavigation(ev) {
+ applyUrlParams();
+
+ if (ev && ev.preventDefault) {
+ ev.preventDefault();
+ }
+
+ return false;
+ }
+
+ function getUrlConfigHtml() {
+ var i,
+ j,
+ val,
+ escaped,
+ escapedTooltip,
+ selection = false,
+ urlConfig = config.urlConfig,
+ urlConfigHtml = "";
+
+ for (i = 0; i < urlConfig.length; i++) {
+
+ // Options can be either strings or objects with nonempty "id" properties
+ val = config.urlConfig[i];
+ if (typeof val === "string") {
+ val = {
+ id: val,
+ label: val
+ };
+ }
+
+ escaped = escapeText(val.id);
+ escapedTooltip = escapeText(val.tooltip);
+
+ if (!val.value || typeof val.value === "string") {
+ urlConfigHtml += "<label for='qunit-urlconfig-" + escaped + "' title='" + escapedTooltip + "'><input id='qunit-urlconfig-" + escaped + "' name='" + escaped + "' type='checkbox'" + (val.value ? " value='" + escapeText(val.value) + "'" : "") + (config[val.id] ? " checked='checked'" : "") + " title='" + escapedTooltip + "' />" + escapeText(val.label) + "</label>";
+ } else {
+ urlConfigHtml += "<label for='qunit-urlconfig-" + escaped + "' title='" + escapedTooltip + "'>" + val.label + ": </label><select id='qunit-urlconfig-" + escaped + "' name='" + escaped + "' title='" + escapedTooltip + "'><option></option>";
+
+ if (QUnit.is("array", val.value)) {
+ for (j = 0; j < val.value.length; j++) {
+ escaped = escapeText(val.value[j]);
+ urlConfigHtml += "<option value='" + escaped + "'" + (config[val.id] === val.value[j] ? (selection = true) && " selected='selected'" : "") + ">" + escaped + "</option>";
+ }
+ } else {
+ for (j in val.value) {
+ if (hasOwn.call(val.value, j)) {
+ urlConfigHtml += "<option value='" + escapeText(j) + "'" + (config[val.id] === j ? (selection = true) && " selected='selected'" : "") + ">" + escapeText(val.value[j]) + "</option>";
+ }
+ }
+ }
+ if (config[val.id] && !selection) {
+ escaped = escapeText(config[val.id]);
+ urlConfigHtml += "<option value='" + escaped + "' selected='selected' disabled='disabled'>" + escaped + "</option>";
+ }
+ urlConfigHtml += "</select>";
+ }
+ }
+
+ return urlConfigHtml;
+ }
+
+ // Handle "click" events on toolbar checkboxes and "change" for select menus.
+ // Updates the URL with the new state of `config.urlConfig` values.
+ function toolbarChanged() {
+ var updatedUrl,
+ value,
+ tests,
+ field = this,
+ params = {};
+
+ // Detect if field is a select menu or a checkbox
+ if ("selectedIndex" in field) {
+ value = field.options[field.selectedIndex].value || undefined;
+ } else {
+ value = field.checked ? field.defaultValue || true : undefined;
+ }
+
+ params[field.name] = value;
+ updatedUrl = setUrl(params);
+
+ // Check if we can apply the change without a page refresh
+ if ("hidepassed" === field.name && "replaceState" in window.history) {
+ QUnit.urlParams[field.name] = value;
+ config[field.name] = value || false;
+ tests = id("qunit-tests");
+ if (tests) {
+ toggleClass(tests, "hidepass", value || false);
+ }
+ window.history.replaceState(null, "", updatedUrl);
+ } else {
+ window.location = updatedUrl;
+ }
+ }
+
+ function setUrl(params) {
+ var key,
+ arrValue,
+ i,
+ querystring = "?",
+ location = window.location;
+
+ params = QUnit.extend(QUnit.extend({}, QUnit.urlParams), params);
+
+ for (key in params) {
+
+ // Skip inherited or undefined properties
+ if (hasOwn.call(params, key) && params[key] !== undefined) {
+
+ // Output a parameter for each value of this key
+ // (but usually just one)
+ arrValue = [].concat(params[key]);
+ for (i = 0; i < arrValue.length; i++) {
+ querystring += encodeURIComponent(key);
+ if (arrValue[i] !== true) {
+ querystring += "=" + encodeURIComponent(arrValue[i]);
+ }
+ querystring += "&";
+ }
+ }
+ }
+ return location.protocol + "//" + location.host + location.pathname + querystring.slice(0, -1);
+ }
+
+ function applyUrlParams() {
+ var i,
+ selectedModules = [],
+ modulesList = id("qunit-modulefilter-dropdown-list").getElementsByTagName("input"),
+ filter = id("qunit-filter-input").value;
+
+ for (i = 0; i < modulesList.length; i++) {
+ if (modulesList[i].checked) {
+ selectedModules.push(modulesList[i].value);
+ }
+ }
+
+ window.location = setUrl({
+ filter: filter === "" ? undefined : filter,
+ moduleId: selectedModules.length === 0 ? undefined : selectedModules,
+
+ // Remove module and testId filter
+ module: undefined,
+ testId: undefined
+ });
+ }
+
+ function toolbarUrlConfigContainer() {
+ var urlConfigContainer = document$$1.createElement("span");
+
+ urlConfigContainer.innerHTML = getUrlConfigHtml();
+ addClass(urlConfigContainer, "qunit-url-config");
+
+ addEvents(urlConfigContainer.getElementsByTagName("input"), "change", toolbarChanged);
+ addEvents(urlConfigContainer.getElementsByTagName("select"), "change", toolbarChanged);
+
+ return urlConfigContainer;
+ }
+
+ function abortTestsButton() {
+ var button = document$$1.createElement("button");
+ button.id = "qunit-abort-tests-button";
+ button.innerHTML = "Abort";
+ addEvent(button, "click", abortTests);
+ return button;
+ }
+
+ function toolbarLooseFilter() {
+ var filter = document$$1.createElement("form"),
+ label = document$$1.createElement("label"),
+ input = document$$1.createElement("input"),
+ button = document$$1.createElement("button");
+
+ addClass(filter, "qunit-filter");
+
+ label.innerHTML = "Filter: ";
+
+ input.type = "text";
+ input.value = config.filter || "";
+ input.name = "filter";
+ input.id = "qunit-filter-input";
+
+ button.innerHTML = "Go";
+
+ label.appendChild(input);
+
+ filter.appendChild(label);
+ filter.appendChild(document$$1.createTextNode(" "));
+ filter.appendChild(button);
+ addEvent(filter, "submit", interceptNavigation);
+
+ return filter;
+ }
+
+ function moduleListHtml() {
+ var i,
+ checked,
+ html = "";
+
+ for (i = 0; i < config.modules.length; i++) {
+ if (config.modules[i].name !== "") {
+ checked = config.moduleId.indexOf(config.modules[i].moduleId) > -1;
+ html += "<li><label class='clickable" + (checked ? " checked" : "") + "'><input type='checkbox' " + "value='" + config.modules[i].moduleId + "'" + (checked ? " checked='checked'" : "") + " />" + escapeText(config.modules[i].name) + "</label></li>";
+ }
+ }
+
+ return html;
+ }
+
+ function toolbarModuleFilter() {
+ var allCheckbox,
+ commit,
+ reset,
+ moduleFilter = document$$1.createElement("form"),
+ label = document$$1.createElement("label"),
+ moduleSearch = document$$1.createElement("input"),
+ dropDown = document$$1.createElement("div"),
+ actions = document$$1.createElement("span"),
+ dropDownList = document$$1.createElement("ul"),
+ dirty = false;
+
+ moduleSearch.id = "qunit-modulefilter-search";
+ addEvent(moduleSearch, "input", searchInput);
+ addEvent(moduleSearch, "input", searchFocus);
+ addEvent(moduleSearch, "focus", searchFocus);
+ addEvent(moduleSearch, "click", searchFocus);
+
+ label.id = "qunit-modulefilter-search-container";
+ label.innerHTML = "Module: ";
+ label.appendChild(moduleSearch);
+
+ actions.id = "qunit-modulefilter-actions";
+ actions.innerHTML = "<button style='display:none'>Apply</button>" + "<button type='reset' style='display:none'>Reset</button>" + "<label class='clickable" + (config.moduleId.length ? "" : " checked") + "'><input type='checkbox'" + (config.moduleId.length ? "" : " checked='checked'") + ">All modules</label>";
+ allCheckbox = actions.lastChild.firstChild;
+ commit = actions.firstChild;
+ reset = commit.nextSibling;
+ addEvent(commit, "click", applyUrlParams);
+
+ dropDownList.id = "qunit-modulefilter-dropdown-list";
+ dropDownList.innerHTML = moduleListHtml();
+
+ dropDown.id = "qunit-modulefilter-dropdown";
+ dropDown.style.display = "none";
+ dropDown.appendChild(actions);
+ dropDown.appendChild(dropDownList);
+ addEvent(dropDown, "change", selectionChange);
+ selectionChange();
+
+ moduleFilter.id = "qunit-modulefilter";
+ moduleFilter.appendChild(label);
+ moduleFilter.appendChild(dropDown);
+ addEvent(moduleFilter, "submit", interceptNavigation);
+ addEvent(moduleFilter, "reset", function () {
+
+ // Let the reset happen, then update styles
+ window.setTimeout(selectionChange);
+ });
+
+ // Enables show/hide for the dropdown
+ function searchFocus() {
+ if (dropDown.style.display !== "none") {
+ return;
+ }
+
+ dropDown.style.display = "block";
+ addEvent(document$$1, "click", hideHandler);
+ addEvent(document$$1, "keydown", hideHandler);
+
+ // Hide on Escape keydown or outside-container click
+ function hideHandler(e) {
+ var inContainer = moduleFilter.contains(e.target);
+
+ if (e.keyCode === 27 || !inContainer) {
+ if (e.keyCode === 27 && inContainer) {
+ moduleSearch.focus();
+ }
+ dropDown.style.display = "none";
+ removeEvent(document$$1, "click", hideHandler);
+ removeEvent(document$$1, "keydown", hideHandler);
+ moduleSearch.value = "";
+ searchInput();
+ }
+ }
+ }
+
+ // Processes module search box input
+ function searchInput() {
+ var i,
+ item,
+ searchText = moduleSearch.value.toLowerCase(),
+ listItems = dropDownList.children;
+
+ for (i = 0; i < listItems.length; i++) {
+ item = listItems[i];
+ if (!searchText || item.textContent.toLowerCase().indexOf(searchText) > -1) {
+ item.style.display = "";
+ } else {
+ item.style.display = "none";
+ }
+ }
+ }
+
+ // Processes selection changes
+ function selectionChange(evt) {
+ var i,
+ item,
+ checkbox = evt && evt.target || allCheckbox,
+ modulesList = dropDownList.getElementsByTagName("input"),
+ selectedNames = [];
+
+ toggleClass(checkbox.parentNode, "checked", checkbox.checked);
+
+ dirty = false;
+ if (checkbox.checked && checkbox !== allCheckbox) {
+ allCheckbox.checked = false;
+ removeClass(allCheckbox.parentNode, "checked");
+ }
+ for (i = 0; i < modulesList.length; i++) {
+ item = modulesList[i];
+ if (!evt) {
+ toggleClass(item.parentNode, "checked", item.checked);
+ } else if (checkbox === allCheckbox && checkbox.checked) {
+ item.checked = false;
+ removeClass(item.parentNode, "checked");
+ }
+ dirty = dirty || item.checked !== item.defaultChecked;
+ if (item.checked) {
+ selectedNames.push(item.parentNode.textContent);
+ }
+ }
+
+ commit.style.display = reset.style.display = dirty ? "" : "none";
+ moduleSearch.placeholder = selectedNames.join(", ") || allCheckbox.parentNode.textContent;
+ moduleSearch.title = "Type to filter list. Current selection:\n" + (selectedNames.join("\n") || allCheckbox.parentNode.textContent);
+ }
+
+ return moduleFilter;
+ }
+
+ function appendToolbar() {
+ var toolbar = id("qunit-testrunner-toolbar");
+
+ if (toolbar) {
+ toolbar.appendChild(toolbarUrlConfigContainer());
+ toolbar.appendChild(toolbarModuleFilter());
+ toolbar.appendChild(toolbarLooseFilter());
+ toolbar.appendChild(document$$1.createElement("div")).className = "clearfix";
+ }
+ }
+
+ function appendHeader() {
+ var header = id("qunit-header");
+
+ if (header) {
+ header.innerHTML = "<a href='" + escapeText(unfilteredUrl) + "'>" + header.innerHTML + "</a> ";
+ }
+ }
+
+ function appendBanner() {
+ var banner = id("qunit-banner");
+
+ if (banner) {
+ banner.className = "";
+ }
+ }
+
+ function appendTestResults() {
+ var tests = id("qunit-tests"),
+ result = id("qunit-testresult"),
+ controls;
+
+ if (result) {
+ result.parentNode.removeChild(result);
+ }
+
+ if (tests) {
+ tests.innerHTML = "";
+ result = document$$1.createElement("p");
+ result.id = "qunit-testresult";
+ result.className = "result";
+ tests.parentNode.insertBefore(result, tests);
+ result.innerHTML = "<div id=\"qunit-testresult-display\">Running...<br />&#160;</div>" + "<div id=\"qunit-testresult-controls\"></div>" + "<div class=\"clearfix\"></div>";
+ controls = id("qunit-testresult-controls");
+ }
+
+ if (controls) {
+ controls.appendChild(abortTestsButton());
+ }
+ }
+
+ function appendFilteredTest() {
+ var testId = QUnit.config.testId;
+ if (!testId || testId.length <= 0) {
+ return "";
+ }
+ return "<div id='qunit-filteredTest'>Rerunning selected tests: " + escapeText(testId.join(", ")) + " <a id='qunit-clearFilter' href='" + escapeText(unfilteredUrl) + "'>Run all tests</a></div>";
+ }
+
+ function appendUserAgent() {
+ var userAgent = id("qunit-userAgent");
+
+ if (userAgent) {
+ userAgent.innerHTML = "";
+ userAgent.appendChild(document$$1.createTextNode("QUnit " + QUnit.version + "; " + navigator.userAgent));
+ }
+ }
+
+ function appendInterface() {
+ var qunit = id("qunit");
+
+ if (qunit) {
+ qunit.innerHTML = "<h1 id='qunit-header'>" + escapeText(document$$1.title) + "</h1>" + "<h2 id='qunit-banner'></h2>" + "<div id='qunit-testrunner-toolbar'></div>" + appendFilteredTest() + "<h2 id='qunit-userAgent'></h2>" + "<ol id='qunit-tests'></ol>";
+ }
+
+ appendHeader();
+ appendBanner();
+ appendTestResults();
+ appendUserAgent();
+ appendToolbar();
+ }
+
+ function appendTestsList(modules) {
+ var i, l, x, z, test, moduleObj;
+
+ for (i = 0, l = modules.length; i < l; i++) {
+ moduleObj = modules[i];
+
+ for (x = 0, z = moduleObj.tests.length; x < z; x++) {
+ test = moduleObj.tests[x];
+
+ appendTest(test.name, test.testId, moduleObj.name);
+ }
+ }
+ }
+
+ function appendTest(name, testId, moduleName) {
+ var title,
+ rerunTrigger,
+ testBlock,
+ assertList,
+ tests = id("qunit-tests");
+
+ if (!tests) {
+ return;
+ }
+
+ title = document$$1.createElement("strong");
+ title.innerHTML = getNameHtml(name, moduleName);
+
+ rerunTrigger = document$$1.createElement("a");
+ rerunTrigger.innerHTML = "Rerun";
+ rerunTrigger.href = setUrl({ testId: testId });
+
+ testBlock = document$$1.createElement("li");
+ testBlock.appendChild(title);
+ testBlock.appendChild(rerunTrigger);
+ testBlock.id = "qunit-test-output-" + testId;
+
+ assertList = document$$1.createElement("ol");
+ assertList.className = "qunit-assert-list";
+
+ testBlock.appendChild(assertList);
+
+ tests.appendChild(testBlock);
+ }
+
+ // HTML Reporter initialization and load
+ QUnit.begin(function (details) {
+ var i, moduleObj, tests;
+
+ // Sort modules by name for the picker
+ for (i = 0; i < details.modules.length; i++) {
+ moduleObj = details.modules[i];
+ if (moduleObj.name) {
+ modulesList.push(moduleObj.name);
+ }
+ }
+ modulesList.sort(function (a, b) {
+ return a.localeCompare(b);
+ });
+
+ // Initialize QUnit elements
+ appendInterface();
+ appendTestsList(details.modules);
+ tests = id("qunit-tests");
+ if (tests && config.hidepassed) {
+ addClass(tests, "hidepass");
+ }
+ });
+
+ QUnit.done(function (details) {
+ var banner = id("qunit-banner"),
+ tests = id("qunit-tests"),
+ abortButton = id("qunit-abort-tests-button"),
+ totalTests = stats.passedTests + stats.skippedTests + stats.todoTests + stats.failedTests,
+ html = [totalTests, " tests completed in ", details.runtime, " milliseconds, with ", stats.failedTests, " failed, ", stats.skippedTests, " skipped, and ", stats.todoTests, " todo.<br />", "<span class='passed'>", details.passed, "</span> assertions of <span class='total'>", details.total, "</span> passed, <span class='failed'>", details.failed, "</span> failed."].join(""),
+ test,
+ assertLi,
+ assertList;
+
+ // Update remaing tests to aborted
+ if (abortButton && abortButton.disabled) {
+ html = "Tests aborted after " + details.runtime + " milliseconds.";
+
+ for (var i = 0; i < tests.children.length; i++) {
+ test = tests.children[i];
+ if (test.className === "" || test.className === "running") {
+ test.className = "aborted";
+ assertList = test.getElementsByTagName("ol")[0];
+ assertLi = document$$1.createElement("li");
+ assertLi.className = "fail";
+ assertLi.innerHTML = "Test aborted.";
+ assertList.appendChild(assertLi);
+ }
+ }
+ }
+
+ if (banner && (!abortButton || abortButton.disabled === false)) {
+ banner.className = stats.failedTests ? "qunit-fail" : "qunit-pass";
+ }
+
+ if (abortButton) {
+ abortButton.parentNode.removeChild(abortButton);
+ }
+
+ if (tests) {
+ id("qunit-testresult-display").innerHTML = html;
+ }
+
+ if (config.altertitle && document$$1.title) {
+
+ // Show ✖ for good, ✔ for bad suite result in title
+ // use escape sequences in case file gets loaded with non-utf-8
+ // charset
+ document$$1.title = [stats.failedTests ? "\u2716" : "\u2714", document$$1.title.replace(/^[\u2714\u2716] /i, "")].join(" ");
+ }
+
+ // Scroll back to top to show results
+ if (config.scrolltop && window.scrollTo) {
+ window.scrollTo(0, 0);
+ }
+ });
+
+ function getNameHtml(name, module) {
+ var nameHtml = "";
+
+ if (module) {
+ nameHtml = "<span class='module-name'>" + escapeText(module) + "</span>: ";
+ }
+
+ nameHtml += "<span class='test-name'>" + escapeText(name) + "</span>";
+
+ return nameHtml;
+ }
+
+ QUnit.testStart(function (details) {
+ var running, testBlock, bad;
+
+ testBlock = id("qunit-test-output-" + details.testId);
+ if (testBlock) {
+ testBlock.className = "running";
+ } else {
+
+ // Report later registered tests
+ appendTest(details.name, details.testId, details.module);
+ }
+
+ running = id("qunit-testresult-display");
+ if (running) {
+ bad = QUnit.config.reorder && details.previousFailure;
+
+ running.innerHTML = [bad ? "Rerunning previously failed test: <br />" : "Running: <br />", getNameHtml(details.name, details.module)].join("");
+ }
+ });
+
+ function stripHtml(string) {
+
+ // Strip tags, html entity and whitespaces
+ return string.replace(/<\/?[^>]+(>|$)/g, "").replace(/\&quot;/g, "").replace(/\s+/g, "");
+ }
+
+ QUnit.log(function (details) {
+ var assertList,
+ assertLi,
+ message,
+ expected,
+ actual,
+ diff,
+ showDiff = false,
+ testItem = id("qunit-test-output-" + details.testId);
+
+ if (!testItem) {
+ return;
+ }
+
+ message = escapeText(details.message) || (details.result ? "okay" : "failed");
+ message = "<span class='test-message'>" + message + "</span>";
+ message += "<span class='runtime'>@ " + details.runtime + " ms</span>";
+
+ // The pushFailure doesn't provide details.expected
+ // when it calls, it's implicit to also not show expected and diff stuff
+ // Also, we need to check details.expected existence, as it can exist and be undefined
+ if (!details.result && hasOwn.call(details, "expected")) {
+ if (details.negative) {
+ expected = "NOT " + QUnit.dump.parse(details.expected);
+ } else {
+ expected = QUnit.dump.parse(details.expected);
+ }
+
+ actual = QUnit.dump.parse(details.actual);
+ message += "<table><tr class='test-expected'><th>Expected: </th><td><pre>" + escapeText(expected) + "</pre></td></tr>";
+
+ if (actual !== expected) {
+
+ message += "<tr class='test-actual'><th>Result: </th><td><pre>" + escapeText(actual) + "</pre></td></tr>";
+
+ if (typeof details.actual === "number" && typeof details.expected === "number") {
+ if (!isNaN(details.actual) && !isNaN(details.expected)) {
+ showDiff = true;
+ diff = details.actual - details.expected;
+ diff = (diff > 0 ? "+" : "") + diff;
+ }
+ } else if (typeof details.actual !== "boolean" && typeof details.expected !== "boolean") {
+ diff = QUnit.diff(expected, actual);
+
+ // don't show diff if there is zero overlap
+ showDiff = stripHtml(diff).length !== stripHtml(expected).length + stripHtml(actual).length;
+ }
+
+ if (showDiff) {
+ message += "<tr class='test-diff'><th>Diff: </th><td><pre>" + diff + "</pre></td></tr>";
+ }
+ } else if (expected.indexOf("[object Array]") !== -1 || expected.indexOf("[object Object]") !== -1) {
+ message += "<tr class='test-message'><th>Message: </th><td>" + "Diff suppressed as the depth of object is more than current max depth (" + QUnit.config.maxDepth + ").<p>Hint: Use <code>QUnit.dump.maxDepth</code> to " + " run with a higher max depth or <a href='" + escapeText(setUrl({ maxDepth: -1 })) + "'>" + "Rerun</a> without max depth.</p></td></tr>";
+ } else {
+ message += "<tr class='test-message'><th>Message: </th><td>" + "Diff suppressed as the expected and actual results have an equivalent" + " serialization</td></tr>";
+ }
+
+ if (details.source) {
+ message += "<tr class='test-source'><th>Source: </th><td><pre>" + escapeText(details.source) + "</pre></td></tr>";
+ }
+
+ message += "</table>";
+
+ // This occurs when pushFailure is set and we have an extracted stack trace
+ } else if (!details.result && details.source) {
+ message += "<table>" + "<tr class='test-source'><th>Source: </th><td><pre>" + escapeText(details.source) + "</pre></td></tr>" + "</table>";
+ }
+
+ assertList = testItem.getElementsByTagName("ol")[0];
+
+ assertLi = document$$1.createElement("li");
+ assertLi.className = details.result ? "pass" : "fail";
+ assertLi.innerHTML = message;
+ assertList.appendChild(assertLi);
+ });
+
+ QUnit.testDone(function (details) {
+ var testTitle,
+ time,
+ testItem,
+ assertList,
+ good,
+ bad,
+ testCounts,
+ skipped,
+ sourceName,
+ tests = id("qunit-tests");
+
+ if (!tests) {
+ return;
+ }
+
+ testItem = id("qunit-test-output-" + details.testId);
+
+ assertList = testItem.getElementsByTagName("ol")[0];
+
+ good = details.passed;
+ bad = details.failed;
+
+ // This test passed if it has no unexpected failed assertions
+ var testPassed = details.failed > 0 ? details.todo : !details.todo;
+
+ if (testPassed) {
+
+ // Collapse the passing tests
+ addClass(assertList, "qunit-collapsed");
+ } else if (config.collapse) {
+ if (!collapseNext) {
+
+ // Skip collapsing the first failing test
+ collapseNext = true;
+ } else {
+
+ // Collapse remaining tests
+ addClass(assertList, "qunit-collapsed");
+ }
+ }
+
+ // The testItem.firstChild is the test name
+ testTitle = testItem.firstChild;
+
+ testCounts = bad ? "<b class='failed'>" + bad + "</b>, " + "<b class='passed'>" + good + "</b>, " : "";
+
+ testTitle.innerHTML += " <b class='counts'>(" + testCounts + details.assertions.length + ")</b>";
+
+ if (details.skipped) {
+ stats.skippedTests++;
+
+ testItem.className = "skipped";
+ skipped = document$$1.createElement("em");
+ skipped.className = "qunit-skipped-label";
+ skipped.innerHTML = "skipped";
+ testItem.insertBefore(skipped, testTitle);
+ } else {
+ addEvent(testTitle, "click", function () {
+ toggleClass(assertList, "qunit-collapsed");
+ });
+
+ testItem.className = testPassed ? "pass" : "fail";
+
+ if (details.todo) {
+ var todoLabel = document$$1.createElement("em");
+ todoLabel.className = "qunit-todo-label";
+ todoLabel.innerHTML = "todo";
+ testItem.className += " todo";
+ testItem.insertBefore(todoLabel, testTitle);
+ }
+
+ time = document$$1.createElement("span");
+ time.className = "runtime";
+ time.innerHTML = details.runtime + " ms";
+ testItem.insertBefore(time, assertList);
+
+ if (!testPassed) {
+ stats.failedTests++;
+ } else if (details.todo) {
+ stats.todoTests++;
+ } else {
+ stats.passedTests++;
+ }
+ }
+
+ // Show the source of the test when showing assertions
+ if (details.source) {
+ sourceName = document$$1.createElement("p");
+ sourceName.innerHTML = "<strong>Source: </strong>" + details.source;
+ addClass(sourceName, "qunit-source");
+ if (testPassed) {
+ addClass(sourceName, "qunit-collapsed");
+ }
+ addEvent(testTitle, "click", function () {
+ toggleClass(sourceName, "qunit-collapsed");
+ });
+ testItem.appendChild(sourceName);
+ }
+ });
+
+ // Avoid readyState issue with phantomjs
+ // Ref: #818
+ var notPhantom = function (p) {
+ return !(p && p.version && p.version.major > 0);
+ }(window.phantom);
+
+ if (notPhantom && document$$1.readyState === "complete") {
+ QUnit.load();
+ } else {
+ addEvent(window, "load", QUnit.load);
+ }
+
+ // Wrap window.onerror. We will call the original window.onerror to see if
+ // the existing handler fully handles the error; if not, we will call the
+ // QUnit.onError function.
+ var originalWindowOnError = window.onerror;
+
+ // Cover uncaught exceptions
+ // Returning true will suppress the default browser handler,
+ // returning false will let it run.
+ window.onerror = function (message, fileName, lineNumber) {
+ var ret = false;
+ if (originalWindowOnError) {
+ for (var _len = arguments.length, args = Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {
+ args[_key - 3] = arguments[_key];
+ }
+
+ ret = originalWindowOnError.call.apply(originalWindowOnError, [this, message, fileName, lineNumber].concat(args));
+ }
+
+ // Treat return value as window.onerror itself does,
+ // Only do our handling if not suppressed.
+ if (ret !== true) {
+ var error = {
+ message: message,
+ fileName: fileName,
+ lineNumber: lineNumber
+ };
+
+ ret = QUnit.onError(error);
+ }
+
+ return ret;
+ };
+
+ // Listen for unhandled rejections, and call QUnit.onUnhandledRejection
+ window.addEventListener("unhandledrejection", function (event) {
+ QUnit.onUnhandledRejection(event.reason);
+ });
+ })();
+
+ /*
+ * This file is a modified version of google-diff-match-patch's JavaScript implementation
+ * (https://code.google.com/p/google-diff-match-patch/source/browse/trunk/javascript/diff_match_patch_uncompressed.js),
+ * modifications are licensed as more fully set forth in LICENSE.txt.
+ *
+ * The original source of google-diff-match-patch is attributable and licensed as follows:
+ *
+ * Copyright 2006 Google Inc.
+ * https://code.google.com/p/google-diff-match-patch/
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * More Info:
+ * https://code.google.com/p/google-diff-match-patch/
+ *
+ * Usage: QUnit.diff(expected, actual)
+ *
+ */
+ QUnit.diff = function () {
+ function DiffMatchPatch() {}
+
+ // DIFF FUNCTIONS
+
+ /**
+ * The data structure representing a diff is an array of tuples:
+ * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]
+ * which means: delete 'Hello', add 'Goodbye' and keep ' world.'
+ */
+ var DIFF_DELETE = -1,
+ DIFF_INSERT = 1,
+ DIFF_EQUAL = 0;
+
+ /**
+ * Find the differences between two texts. Simplifies the problem by stripping
+ * any common prefix or suffix off the texts before diffing.
+ * @param {string} text1 Old string to be diffed.
+ * @param {string} text2 New string to be diffed.
+ * @param {boolean=} optChecklines Optional speedup flag. If present and false,
+ * then don't run a line-level diff first to identify the changed areas.
+ * Defaults to true, which does a faster, slightly less optimal diff.
+ * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
+ */
+ DiffMatchPatch.prototype.DiffMain = function (text1, text2, optChecklines) {
+ var deadline, checklines, commonlength, commonprefix, commonsuffix, diffs;
+
+ // The diff must be complete in up to 1 second.
+ deadline = new Date().getTime() + 1000;
+
+ // Check for null inputs.
+ if (text1 === null || text2 === null) {
+ throw new Error("Null input. (DiffMain)");
+ }
+
+ // Check for equality (speedup).
+ if (text1 === text2) {
+ if (text1) {
+ return [[DIFF_EQUAL, text1]];
+ }
+ return [];
+ }
+
+ if (typeof optChecklines === "undefined") {
+ optChecklines = true;
+ }
+
+ checklines = optChecklines;
+
+ // Trim off common prefix (speedup).
+ commonlength = this.diffCommonPrefix(text1, text2);
+ commonprefix = text1.substring(0, commonlength);
+ text1 = text1.substring(commonlength);
+ text2 = text2.substring(commonlength);
+
+ // Trim off common suffix (speedup).
+ commonlength = this.diffCommonSuffix(text1, text2);
+ commonsuffix = text1.substring(text1.length - commonlength);
+ text1 = text1.substring(0, text1.length - commonlength);
+ text2 = text2.substring(0, text2.length - commonlength);
+
+ // Compute the diff on the middle block.
+ diffs = this.diffCompute(text1, text2, checklines, deadline);
+
+ // Restore the prefix and suffix.
+ if (commonprefix) {
+ diffs.unshift([DIFF_EQUAL, commonprefix]);
+ }
+ if (commonsuffix) {
+ diffs.push([DIFF_EQUAL, commonsuffix]);
+ }
+ this.diffCleanupMerge(diffs);
+ return diffs;
+ };
+
+ /**
+ * Reduce the number of edits by eliminating operationally trivial equalities.
+ * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
+ */
+ DiffMatchPatch.prototype.diffCleanupEfficiency = function (diffs) {
+ var changes, equalities, equalitiesLength, lastequality, pointer, preIns, preDel, postIns, postDel;
+ changes = false;
+ equalities = []; // Stack of indices where equalities are found.
+ equalitiesLength = 0; // Keeping our own length var is faster in JS.
+ /** @type {?string} */
+ lastequality = null;
+
+ // Always equal to diffs[equalities[equalitiesLength - 1]][1]
+ pointer = 0; // Index of current position.
+
+ // Is there an insertion operation before the last equality.
+ preIns = false;
+
+ // Is there a deletion operation before the last equality.
+ preDel = false;
+
+ // Is there an insertion operation after the last equality.
+ postIns = false;
+
+ // Is there a deletion operation after the last equality.
+ postDel = false;
+ while (pointer < diffs.length) {
+
+ // Equality found.
+ if (diffs[pointer][0] === DIFF_EQUAL) {
+ if (diffs[pointer][1].length < 4 && (postIns || postDel)) {
+
+ // Candidate found.
+ equalities[equalitiesLength++] = pointer;
+ preIns = postIns;
+ preDel = postDel;
+ lastequality = diffs[pointer][1];
+ } else {
+
+ // Not a candidate, and can never become one.
+ equalitiesLength = 0;
+ lastequality = null;
+ }
+ postIns = postDel = false;
+
+ // An insertion or deletion.
+ } else {
+
+ if (diffs[pointer][0] === DIFF_DELETE) {
+ postDel = true;
+ } else {
+ postIns = true;
+ }
+
+ /*
+ * Five types to be split:
+ * <ins>A</ins><del>B</del>XY<ins>C</ins><del>D</del>
+ * <ins>A</ins>X<ins>C</ins><del>D</del>
+ * <ins>A</ins><del>B</del>X<ins>C</ins>
+ * <ins>A</del>X<ins>C</ins><del>D</del>
+ * <ins>A</ins><del>B</del>X<del>C</del>
+ */
+ if (lastequality && (preIns && preDel && postIns && postDel || lastequality.length < 2 && preIns + preDel + postIns + postDel === 3)) {
+
+ // Duplicate record.
+ diffs.splice(equalities[equalitiesLength - 1], 0, [DIFF_DELETE, lastequality]);
+
+ // Change second copy to insert.
+ diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;
+ equalitiesLength--; // Throw away the equality we just deleted;
+ lastequality = null;
+ if (preIns && preDel) {
+
+ // No changes made which could affect previous entry, keep going.
+ postIns = postDel = true;
+ equalitiesLength = 0;
+ } else {
+ equalitiesLength--; // Throw away the previous equality.
+ pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;
+ postIns = postDel = false;
+ }
+ changes = true;
+ }
+ }
+ pointer++;
+ }
+
+ if (changes) {
+ this.diffCleanupMerge(diffs);
+ }
+ };
+
+ /**
+ * Convert a diff array into a pretty HTML report.
+ * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
+ * @param {integer} string to be beautified.
+ * @return {string} HTML representation.
+ */
+ DiffMatchPatch.prototype.diffPrettyHtml = function (diffs) {
+ var op,
+ data,
+ x,
+ html = [];
+ for (x = 0; x < diffs.length; x++) {
+ op = diffs[x][0]; // Operation (insert, delete, equal)
+ data = diffs[x][1]; // Text of change.
+ switch (op) {
+ case DIFF_INSERT:
+ html[x] = "<ins>" + escapeText(data) + "</ins>";
+ break;
+ case DIFF_DELETE:
+ html[x] = "<del>" + escapeText(data) + "</del>";
+ break;
+ case DIFF_EQUAL:
+ html[x] = "<span>" + escapeText(data) + "</span>";
+ break;
+ }
+ }
+ return html.join("");
+ };
+
+ /**
+ * Determine the common prefix of two strings.
+ * @param {string} text1 First string.
+ * @param {string} text2 Second string.
+ * @return {number} The number of characters common to the start of each
+ * string.
+ */
+ DiffMatchPatch.prototype.diffCommonPrefix = function (text1, text2) {
+ var pointermid, pointermax, pointermin, pointerstart;
+
+ // Quick check for common null cases.
+ if (!text1 || !text2 || text1.charAt(0) !== text2.charAt(0)) {
+ return 0;
+ }
+
+ // Binary search.
+ // Performance analysis: https://neil.fraser.name/news/2007/10/09/
+ pointermin = 0;
+ pointermax = Math.min(text1.length, text2.length);
+ pointermid = pointermax;
+ pointerstart = 0;
+ while (pointermin < pointermid) {
+ if (text1.substring(pointerstart, pointermid) === text2.substring(pointerstart, pointermid)) {
+ pointermin = pointermid;
+ pointerstart = pointermin;
+ } else {
+ pointermax = pointermid;
+ }
+ pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);
+ }
+ return pointermid;
+ };
+
+ /**
+ * Determine the common suffix of two strings.
+ * @param {string} text1 First string.
+ * @param {string} text2 Second string.
+ * @return {number} The number of characters common to the end of each string.
+ */
+ DiffMatchPatch.prototype.diffCommonSuffix = function (text1, text2) {
+ var pointermid, pointermax, pointermin, pointerend;
+
+ // Quick check for common null cases.
+ if (!text1 || !text2 || text1.charAt(text1.length - 1) !== text2.charAt(text2.length - 1)) {
+ return 0;
+ }
+
+ // Binary search.
+ // Performance analysis: https://neil.fraser.name/news/2007/10/09/
+ pointermin = 0;
+ pointermax = Math.min(text1.length, text2.length);
+ pointermid = pointermax;
+ pointerend = 0;
+ while (pointermin < pointermid) {
+ if (text1.substring(text1.length - pointermid, text1.length - pointerend) === text2.substring(text2.length - pointermid, text2.length - pointerend)) {
+ pointermin = pointermid;
+ pointerend = pointermin;
+ } else {
+ pointermax = pointermid;
+ }
+ pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);
+ }
+ return pointermid;
+ };
+
+ /**
+ * Find the differences between two texts. Assumes that the texts do not
+ * have any common prefix or suffix.
+ * @param {string} text1 Old string to be diffed.
+ * @param {string} text2 New string to be diffed.
+ * @param {boolean} checklines Speedup flag. If false, then don't run a
+ * line-level diff first to identify the changed areas.
+ * If true, then run a faster, slightly less optimal diff.
+ * @param {number} deadline Time when the diff should be complete by.
+ * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
+ * @private
+ */
+ DiffMatchPatch.prototype.diffCompute = function (text1, text2, checklines, deadline) {
+ var diffs, longtext, shorttext, i, hm, text1A, text2A, text1B, text2B, midCommon, diffsA, diffsB;
+
+ if (!text1) {
+
+ // Just add some text (speedup).
+ return [[DIFF_INSERT, text2]];
+ }
+
+ if (!text2) {
+
+ // Just delete some text (speedup).
+ return [[DIFF_DELETE, text1]];
+ }
+
+ longtext = text1.length > text2.length ? text1 : text2;
+ shorttext = text1.length > text2.length ? text2 : text1;
+ i = longtext.indexOf(shorttext);
+ if (i !== -1) {
+
+ // Shorter text is inside the longer text (speedup).
+ diffs = [[DIFF_INSERT, longtext.substring(0, i)], [DIFF_EQUAL, shorttext], [DIFF_INSERT, longtext.substring(i + shorttext.length)]];
+
+ // Swap insertions for deletions if diff is reversed.
+ if (text1.length > text2.length) {
+ diffs[0][0] = diffs[2][0] = DIFF_DELETE;
+ }
+ return diffs;
+ }
+
+ if (shorttext.length === 1) {
+
+ // Single character string.
+ // After the previous speedup, the character can't be an equality.
+ return [[DIFF_DELETE, text1], [DIFF_INSERT, text2]];
+ }
+
+ // Check to see if the problem can be split in two.
+ hm = this.diffHalfMatch(text1, text2);
+ if (hm) {
+
+ // A half-match was found, sort out the return data.
+ text1A = hm[0];
+ text1B = hm[1];
+ text2A = hm[2];
+ text2B = hm[3];
+ midCommon = hm[4];
+
+ // Send both pairs off for separate processing.
+ diffsA = this.DiffMain(text1A, text2A, checklines, deadline);
+ diffsB = this.DiffMain(text1B, text2B, checklines, deadline);
+
+ // Merge the results.
+ return diffsA.concat([[DIFF_EQUAL, midCommon]], diffsB);
+ }
+
+ if (checklines && text1.length > 100 && text2.length > 100) {
+ return this.diffLineMode(text1, text2, deadline);
+ }
+
+ return this.diffBisect(text1, text2, deadline);
+ };
+
+ /**
+ * Do the two texts share a substring which is at least half the length of the
+ * longer text?
+ * This speedup can produce non-minimal diffs.
+ * @param {string} text1 First string.
+ * @param {string} text2 Second string.
+ * @return {Array.<string>} Five element Array, containing the prefix of
+ * text1, the suffix of text1, the prefix of text2, the suffix of
+ * text2 and the common middle. Or null if there was no match.
+ * @private
+ */
+ DiffMatchPatch.prototype.diffHalfMatch = function (text1, text2) {
+ var longtext, shorttext, dmp, text1A, text2B, text2A, text1B, midCommon, hm1, hm2, hm;
+
+ longtext = text1.length > text2.length ? text1 : text2;
+ shorttext = text1.length > text2.length ? text2 : text1;
+ if (longtext.length < 4 || shorttext.length * 2 < longtext.length) {
+ return null; // Pointless.
+ }
+ dmp = this; // 'this' becomes 'window' in a closure.
+
+ /**
+ * Does a substring of shorttext exist within longtext such that the substring
+ * is at least half the length of longtext?
+ * Closure, but does not reference any external variables.
+ * @param {string} longtext Longer string.
+ * @param {string} shorttext Shorter string.
+ * @param {number} i Start index of quarter length substring within longtext.
+ * @return {Array.<string>} Five element Array, containing the prefix of
+ * longtext, the suffix of longtext, the prefix of shorttext, the suffix
+ * of shorttext and the common middle. Or null if there was no match.
+ * @private
+ */
+ function diffHalfMatchI(longtext, shorttext, i) {
+ var seed, j, bestCommon, prefixLength, suffixLength, bestLongtextA, bestLongtextB, bestShorttextA, bestShorttextB;
+
+ // Start with a 1/4 length substring at position i as a seed.
+ seed = longtext.substring(i, i + Math.floor(longtext.length / 4));
+ j = -1;
+ bestCommon = "";
+ while ((j = shorttext.indexOf(seed, j + 1)) !== -1) {
+ prefixLength = dmp.diffCommonPrefix(longtext.substring(i), shorttext.substring(j));
+ suffixLength = dmp.diffCommonSuffix(longtext.substring(0, i), shorttext.substring(0, j));
+ if (bestCommon.length < suffixLength + prefixLength) {
+ bestCommon = shorttext.substring(j - suffixLength, j) + shorttext.substring(j, j + prefixLength);
+ bestLongtextA = longtext.substring(0, i - suffixLength);
+ bestLongtextB = longtext.substring(i + prefixLength);
+ bestShorttextA = shorttext.substring(0, j - suffixLength);
+ bestShorttextB = shorttext.substring(j + prefixLength);
+ }
+ }
+ if (bestCommon.length * 2 >= longtext.length) {
+ return [bestLongtextA, bestLongtextB, bestShorttextA, bestShorttextB, bestCommon];
+ } else {
+ return null;
+ }
+ }
+
+ // First check if the second quarter is the seed for a half-match.
+ hm1 = diffHalfMatchI(longtext, shorttext, Math.ceil(longtext.length / 4));
+
+ // Check again based on the third quarter.
+ hm2 = diffHalfMatchI(longtext, shorttext, Math.ceil(longtext.length / 2));
+ if (!hm1 && !hm2) {
+ return null;
+ } else if (!hm2) {
+ hm = hm1;
+ } else if (!hm1) {
+ hm = hm2;
+ } else {
+
+ // Both matched. Select the longest.
+ hm = hm1[4].length > hm2[4].length ? hm1 : hm2;
+ }
+
+ // A half-match was found, sort out the return data.
+ if (text1.length > text2.length) {
+ text1A = hm[0];
+ text1B = hm[1];
+ text2A = hm[2];
+ text2B = hm[3];
+ } else {
+ text2A = hm[0];
+ text2B = hm[1];
+ text1A = hm[2];
+ text1B = hm[3];
+ }
+ midCommon = hm[4];
+ return [text1A, text1B, text2A, text2B, midCommon];
+ };
+
+ /**
+ * Do a quick line-level diff on both strings, then rediff the parts for
+ * greater accuracy.
+ * This speedup can produce non-minimal diffs.
+ * @param {string} text1 Old string to be diffed.
+ * @param {string} text2 New string to be diffed.
+ * @param {number} deadline Time when the diff should be complete by.
+ * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
+ * @private
+ */
+ DiffMatchPatch.prototype.diffLineMode = function (text1, text2, deadline) {
+ var a, diffs, linearray, pointer, countInsert, countDelete, textInsert, textDelete, j;
+
+ // Scan the text on a line-by-line basis first.
+ a = this.diffLinesToChars(text1, text2);
+ text1 = a.chars1;
+ text2 = a.chars2;
+ linearray = a.lineArray;
+
+ diffs = this.DiffMain(text1, text2, false, deadline);
+
+ // Convert the diff back to original text.
+ this.diffCharsToLines(diffs, linearray);
+
+ // Eliminate freak matches (e.g. blank lines)
+ this.diffCleanupSemantic(diffs);
+
+ // Rediff any replacement blocks, this time character-by-character.
+ // Add a dummy entry at the end.
+ diffs.push([DIFF_EQUAL, ""]);
+ pointer = 0;
+ countDelete = 0;
+ countInsert = 0;
+ textDelete = "";
+ textInsert = "";
+ while (pointer < diffs.length) {
+ switch (diffs[pointer][0]) {
+ case DIFF_INSERT:
+ countInsert++;
+ textInsert += diffs[pointer][1];
+ break;
+ case DIFF_DELETE:
+ countDelete++;
+ textDelete += diffs[pointer][1];
+ break;
+ case DIFF_EQUAL:
+
+ // Upon reaching an equality, check for prior redundancies.
+ if (countDelete >= 1 && countInsert >= 1) {
+
+ // Delete the offending records and add the merged ones.
+ diffs.splice(pointer - countDelete - countInsert, countDelete + countInsert);
+ pointer = pointer - countDelete - countInsert;
+ a = this.DiffMain(textDelete, textInsert, false, deadline);
+ for (j = a.length - 1; j >= 0; j--) {
+ diffs.splice(pointer, 0, a[j]);
+ }
+ pointer = pointer + a.length;
+ }
+ countInsert = 0;
+ countDelete = 0;
+ textDelete = "";
+ textInsert = "";
+ break;
+ }
+ pointer++;
+ }
+ diffs.pop(); // Remove the dummy entry at the end.
+
+ return diffs;
+ };
+
+ /**
+ * Find the 'middle snake' of a diff, split the problem in two
+ * and return the recursively constructed diff.
+ * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.
+ * @param {string} text1 Old string to be diffed.
+ * @param {string} text2 New string to be diffed.
+ * @param {number} deadline Time at which to bail if not yet complete.
+ * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
+ * @private
+ */
+ DiffMatchPatch.prototype.diffBisect = function (text1, text2, deadline) {
+ var text1Length, text2Length, maxD, vOffset, vLength, v1, v2, x, delta, front, k1start, k1end, k2start, k2end, k2Offset, k1Offset, x1, x2, y1, y2, d, k1, k2;
+
+ // Cache the text lengths to prevent multiple calls.
+ text1Length = text1.length;
+ text2Length = text2.length;
+ maxD = Math.ceil((text1Length + text2Length) / 2);
+ vOffset = maxD;
+ vLength = 2 * maxD;
+ v1 = new Array(vLength);
+ v2 = new Array(vLength);
+
+ // Setting all elements to -1 is faster in Chrome & Firefox than mixing
+ // integers and undefined.
+ for (x = 0; x < vLength; x++) {
+ v1[x] = -1;
+ v2[x] = -1;
+ }
+ v1[vOffset + 1] = 0;
+ v2[vOffset + 1] = 0;
+ delta = text1Length - text2Length;
+
+ // If the total number of characters is odd, then the front path will collide
+ // with the reverse path.
+ front = delta % 2 !== 0;
+
+ // Offsets for start and end of k loop.
+ // Prevents mapping of space beyond the grid.
+ k1start = 0;
+ k1end = 0;
+ k2start = 0;
+ k2end = 0;
+ for (d = 0; d < maxD; d++) {
+
+ // Bail out if deadline is reached.
+ if (new Date().getTime() > deadline) {
+ break;
+ }
+
+ // Walk the front path one step.
+ for (k1 = -d + k1start; k1 <= d - k1end; k1 += 2) {
+ k1Offset = vOffset + k1;
+ if (k1 === -d || k1 !== d && v1[k1Offset - 1] < v1[k1Offset + 1]) {
+ x1 = v1[k1Offset + 1];
+ } else {
+ x1 = v1[k1Offset - 1] + 1;
+ }
+ y1 = x1 - k1;
+ while (x1 < text1Length && y1 < text2Length && text1.charAt(x1) === text2.charAt(y1)) {
+ x1++;
+ y1++;
+ }
+ v1[k1Offset] = x1;
+ if (x1 > text1Length) {
+
+ // Ran off the right of the graph.
+ k1end += 2;
+ } else if (y1 > text2Length) {
+
+ // Ran off the bottom of the graph.
+ k1start += 2;
+ } else if (front) {
+ k2Offset = vOffset + delta - k1;
+ if (k2Offset >= 0 && k2Offset < vLength && v2[k2Offset] !== -1) {
+
+ // Mirror x2 onto top-left coordinate system.
+ x2 = text1Length - v2[k2Offset];
+ if (x1 >= x2) {
+
+ // Overlap detected.
+ return this.diffBisectSplit(text1, text2, x1, y1, deadline);
+ }
+ }
+ }
+ }
+
+ // Walk the reverse path one step.
+ for (k2 = -d + k2start; k2 <= d - k2end; k2 += 2) {
+ k2Offset = vOffset + k2;
+ if (k2 === -d || k2 !== d && v2[k2Offset - 1] < v2[k2Offset + 1]) {
+ x2 = v2[k2Offset + 1];
+ } else {
+ x2 = v2[k2Offset - 1] + 1;
+ }
+ y2 = x2 - k2;
+ while (x2 < text1Length && y2 < text2Length && text1.charAt(text1Length - x2 - 1) === text2.charAt(text2Length - y2 - 1)) {
+ x2++;
+ y2++;
+ }
+ v2[k2Offset] = x2;
+ if (x2 > text1Length) {
+
+ // Ran off the left of the graph.
+ k2end += 2;
+ } else if (y2 > text2Length) {
+
+ // Ran off the top of the graph.
+ k2start += 2;
+ } else if (!front) {
+ k1Offset = vOffset + delta - k2;
+ if (k1Offset >= 0 && k1Offset < vLength && v1[k1Offset] !== -1) {
+ x1 = v1[k1Offset];
+ y1 = vOffset + x1 - k1Offset;
+
+ // Mirror x2 onto top-left coordinate system.
+ x2 = text1Length - x2;
+ if (x1 >= x2) {
+
+ // Overlap detected.
+ return this.diffBisectSplit(text1, text2, x1, y1, deadline);
+ }
+ }
+ }
+ }
+ }
+
+ // Diff took too long and hit the deadline or
+ // number of diffs equals number of characters, no commonality at all.
+ return [[DIFF_DELETE, text1], [DIFF_INSERT, text2]];
+ };
+
+ /**
+ * Given the location of the 'middle snake', split the diff in two parts
+ * and recurse.
+ * @param {string} text1 Old string to be diffed.
+ * @param {string} text2 New string to be diffed.
+ * @param {number} x Index of split point in text1.
+ * @param {number} y Index of split point in text2.
+ * @param {number} deadline Time at which to bail if not yet complete.
+ * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
+ * @private
+ */
+ DiffMatchPatch.prototype.diffBisectSplit = function (text1, text2, x, y, deadline) {
+ var text1a, text1b, text2a, text2b, diffs, diffsb;
+ text1a = text1.substring(0, x);
+ text2a = text2.substring(0, y);
+ text1b = text1.substring(x);
+ text2b = text2.substring(y);
+
+ // Compute both diffs serially.
+ diffs = this.DiffMain(text1a, text2a, false, deadline);
+ diffsb = this.DiffMain(text1b, text2b, false, deadline);
+
+ return diffs.concat(diffsb);
+ };
+
+ /**
+ * Reduce the number of edits by eliminating semantically trivial equalities.
+ * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
+ */
+ DiffMatchPatch.prototype.diffCleanupSemantic = function (diffs) {
+ var changes, equalities, equalitiesLength, lastequality, pointer, lengthInsertions2, lengthDeletions2, lengthInsertions1, lengthDeletions1, deletion, insertion, overlapLength1, overlapLength2;
+ changes = false;
+ equalities = []; // Stack of indices where equalities are found.
+ equalitiesLength = 0; // Keeping our own length var is faster in JS.
+ /** @type {?string} */
+ lastequality = null;
+
+ // Always equal to diffs[equalities[equalitiesLength - 1]][1]
+ pointer = 0; // Index of current position.
+
+ // Number of characters that changed prior to the equality.
+ lengthInsertions1 = 0;
+ lengthDeletions1 = 0;
+
+ // Number of characters that changed after the equality.
+ lengthInsertions2 = 0;
+ lengthDeletions2 = 0;
+ while (pointer < diffs.length) {
+ if (diffs[pointer][0] === DIFF_EQUAL) {
+ // Equality found.
+ equalities[equalitiesLength++] = pointer;
+ lengthInsertions1 = lengthInsertions2;
+ lengthDeletions1 = lengthDeletions2;
+ lengthInsertions2 = 0;
+ lengthDeletions2 = 0;
+ lastequality = diffs[pointer][1];
+ } else {
+ // An insertion or deletion.
+ if (diffs[pointer][0] === DIFF_INSERT) {
+ lengthInsertions2 += diffs[pointer][1].length;
+ } else {
+ lengthDeletions2 += diffs[pointer][1].length;
+ }
+
+ // Eliminate an equality that is smaller or equal to the edits on both
+ // sides of it.
+ if (lastequality && lastequality.length <= Math.max(lengthInsertions1, lengthDeletions1) && lastequality.length <= Math.max(lengthInsertions2, lengthDeletions2)) {
+
+ // Duplicate record.
+ diffs.splice(equalities[equalitiesLength - 1], 0, [DIFF_DELETE, lastequality]);
+
+ // Change second copy to insert.
+ diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;
+
+ // Throw away the equality we just deleted.
+ equalitiesLength--;
+
+ // Throw away the previous equality (it needs to be reevaluated).
+ equalitiesLength--;
+ pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;
+
+ // Reset the counters.
+ lengthInsertions1 = 0;
+ lengthDeletions1 = 0;
+ lengthInsertions2 = 0;
+ lengthDeletions2 = 0;
+ lastequality = null;
+ changes = true;
+ }
+ }
+ pointer++;
+ }
+
+ // Normalize the diff.
+ if (changes) {
+ this.diffCleanupMerge(diffs);
+ }
+
+ // Find any overlaps between deletions and insertions.
+ // e.g: <del>abcxxx</del><ins>xxxdef</ins>
+ // -> <del>abc</del>xxx<ins>def</ins>
+ // e.g: <del>xxxabc</del><ins>defxxx</ins>
+ // -> <ins>def</ins>xxx<del>abc</del>
+ // Only extract an overlap if it is as big as the edit ahead or behind it.
+ pointer = 1;
+ while (pointer < diffs.length) {
+ if (diffs[pointer - 1][0] === DIFF_DELETE && diffs[pointer][0] === DIFF_INSERT) {
+ deletion = diffs[pointer - 1][1];
+ insertion = diffs[pointer][1];
+ overlapLength1 = this.diffCommonOverlap(deletion, insertion);
+ overlapLength2 = this.diffCommonOverlap(insertion, deletion);
+ if (overlapLength1 >= overlapLength2) {
+ if (overlapLength1 >= deletion.length / 2 || overlapLength1 >= insertion.length / 2) {
+
+ // Overlap found. Insert an equality and trim the surrounding edits.
+ diffs.splice(pointer, 0, [DIFF_EQUAL, insertion.substring(0, overlapLength1)]);
+ diffs[pointer - 1][1] = deletion.substring(0, deletion.length - overlapLength1);
+ diffs[pointer + 1][1] = insertion.substring(overlapLength1);
+ pointer++;
+ }
+ } else {
+ if (overlapLength2 >= deletion.length / 2 || overlapLength2 >= insertion.length / 2) {
+
+ // Reverse overlap found.
+ // Insert an equality and swap and trim the surrounding edits.
+ diffs.splice(pointer, 0, [DIFF_EQUAL, deletion.substring(0, overlapLength2)]);
+
+ diffs[pointer - 1][0] = DIFF_INSERT;
+ diffs[pointer - 1][1] = insertion.substring(0, insertion.length - overlapLength2);
+ diffs[pointer + 1][0] = DIFF_DELETE;
+ diffs[pointer + 1][1] = deletion.substring(overlapLength2);
+ pointer++;
+ }
+ }
+ pointer++;
+ }
+ pointer++;
+ }
+ };
+
+ /**
+ * Determine if the suffix of one string is the prefix of another.
+ * @param {string} text1 First string.
+ * @param {string} text2 Second string.
+ * @return {number} The number of characters common to the end of the first
+ * string and the start of the second string.
+ * @private
+ */
+ DiffMatchPatch.prototype.diffCommonOverlap = function (text1, text2) {
+ var text1Length, text2Length, textLength, best, length, pattern, found;
+
+ // Cache the text lengths to prevent multiple calls.
+ text1Length = text1.length;
+ text2Length = text2.length;
+
+ // Eliminate the null case.
+ if (text1Length === 0 || text2Length === 0) {
+ return 0;
+ }
+
+ // Truncate the longer string.
+ if (text1Length > text2Length) {
+ text1 = text1.substring(text1Length - text2Length);
+ } else if (text1Length < text2Length) {
+ text2 = text2.substring(0, text1Length);
+ }
+ textLength = Math.min(text1Length, text2Length);
+
+ // Quick check for the worst case.
+ if (text1 === text2) {
+ return textLength;
+ }
+
+ // Start by looking for a single character match
+ // and increase length until no match is found.
+ // Performance analysis: https://neil.fraser.name/news/2010/11/04/
+ best = 0;
+ length = 1;
+ while (true) {
+ pattern = text1.substring(textLength - length);
+ found = text2.indexOf(pattern);
+ if (found === -1) {
+ return best;
+ }
+ length += found;
+ if (found === 0 || text1.substring(textLength - length) === text2.substring(0, length)) {
+ best = length;
+ length++;
+ }
+ }
+ };
+
+ /**
+ * Split two texts into an array of strings. Reduce the texts to a string of
+ * hashes where each Unicode character represents one line.
+ * @param {string} text1 First string.
+ * @param {string} text2 Second string.
+ * @return {{chars1: string, chars2: string, lineArray: !Array.<string>}}
+ * An object containing the encoded text1, the encoded text2 and
+ * the array of unique strings.
+ * The zeroth element of the array of unique strings is intentionally blank.
+ * @private
+ */
+ DiffMatchPatch.prototype.diffLinesToChars = function (text1, text2) {
+ var lineArray, lineHash, chars1, chars2;
+ lineArray = []; // E.g. lineArray[4] === 'Hello\n'
+ lineHash = {}; // E.g. lineHash['Hello\n'] === 4
+
+ // '\x00' is a valid character, but various debuggers don't like it.
+ // So we'll insert a junk entry to avoid generating a null character.
+ lineArray[0] = "";
+
+ /**
+ * Split a text into an array of strings. Reduce the texts to a string of
+ * hashes where each Unicode character represents one line.
+ * Modifies linearray and linehash through being a closure.
+ * @param {string} text String to encode.
+ * @return {string} Encoded string.
+ * @private
+ */
+ function diffLinesToCharsMunge(text) {
+ var chars, lineStart, lineEnd, lineArrayLength, line;
+ chars = "";
+
+ // Walk the text, pulling out a substring for each line.
+ // text.split('\n') would would temporarily double our memory footprint.
+ // Modifying text would create many large strings to garbage collect.
+ lineStart = 0;
+ lineEnd = -1;
+
+ // Keeping our own length variable is faster than looking it up.
+ lineArrayLength = lineArray.length;
+ while (lineEnd < text.length - 1) {
+ lineEnd = text.indexOf("\n", lineStart);
+ if (lineEnd === -1) {
+ lineEnd = text.length - 1;
+ }
+ line = text.substring(lineStart, lineEnd + 1);
+ lineStart = lineEnd + 1;
+
+ var lineHashExists = lineHash.hasOwnProperty ? lineHash.hasOwnProperty(line) : lineHash[line] !== undefined;
+
+ if (lineHashExists) {
+ chars += String.fromCharCode(lineHash[line]);
+ } else {
+ chars += String.fromCharCode(lineArrayLength);
+ lineHash[line] = lineArrayLength;
+ lineArray[lineArrayLength++] = line;
+ }
+ }
+ return chars;
+ }
+
+ chars1 = diffLinesToCharsMunge(text1);
+ chars2 = diffLinesToCharsMunge(text2);
+ return {
+ chars1: chars1,
+ chars2: chars2,
+ lineArray: lineArray
+ };
+ };
+
+ /**
+ * Rehydrate the text in a diff from a string of line hashes to real lines of
+ * text.
+ * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
+ * @param {!Array.<string>} lineArray Array of unique strings.
+ * @private
+ */
+ DiffMatchPatch.prototype.diffCharsToLines = function (diffs, lineArray) {
+ var x, chars, text, y;
+ for (x = 0; x < diffs.length; x++) {
+ chars = diffs[x][1];
+ text = [];
+ for (y = 0; y < chars.length; y++) {
+ text[y] = lineArray[chars.charCodeAt(y)];
+ }
+ diffs[x][1] = text.join("");
+ }
+ };
+
+ /**
+ * Reorder and merge like edit sections. Merge equalities.
+ * Any edit section can move as long as it doesn't cross an equality.
+ * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
+ */
+ DiffMatchPatch.prototype.diffCleanupMerge = function (diffs) {
+ var pointer, countDelete, countInsert, textInsert, textDelete, commonlength, changes, diffPointer, position;
+ diffs.push([DIFF_EQUAL, ""]); // Add a dummy entry at the end.
+ pointer = 0;
+ countDelete = 0;
+ countInsert = 0;
+ textDelete = "";
+ textInsert = "";
+
+ while (pointer < diffs.length) {
+ switch (diffs[pointer][0]) {
+ case DIFF_INSERT:
+ countInsert++;
+ textInsert += diffs[pointer][1];
+ pointer++;
+ break;
+ case DIFF_DELETE:
+ countDelete++;
+ textDelete += diffs[pointer][1];
+ pointer++;
+ break;
+ case DIFF_EQUAL:
+
+ // Upon reaching an equality, check for prior redundancies.
+ if (countDelete + countInsert > 1) {
+ if (countDelete !== 0 && countInsert !== 0) {
+
+ // Factor out any common prefixes.
+ commonlength = this.diffCommonPrefix(textInsert, textDelete);
+ if (commonlength !== 0) {
+ if (pointer - countDelete - countInsert > 0 && diffs[pointer - countDelete - countInsert - 1][0] === DIFF_EQUAL) {
+ diffs[pointer - countDelete - countInsert - 1][1] += textInsert.substring(0, commonlength);
+ } else {
+ diffs.splice(0, 0, [DIFF_EQUAL, textInsert.substring(0, commonlength)]);
+ pointer++;
+ }
+ textInsert = textInsert.substring(commonlength);
+ textDelete = textDelete.substring(commonlength);
+ }
+
+ // Factor out any common suffixies.
+ commonlength = this.diffCommonSuffix(textInsert, textDelete);
+ if (commonlength !== 0) {
+ diffs[pointer][1] = textInsert.substring(textInsert.length - commonlength) + diffs[pointer][1];
+ textInsert = textInsert.substring(0, textInsert.length - commonlength);
+ textDelete = textDelete.substring(0, textDelete.length - commonlength);
+ }
+ }
+
+ // Delete the offending records and add the merged ones.
+ if (countDelete === 0) {
+ diffs.splice(pointer - countInsert, countDelete + countInsert, [DIFF_INSERT, textInsert]);
+ } else if (countInsert === 0) {
+ diffs.splice(pointer - countDelete, countDelete + countInsert, [DIFF_DELETE, textDelete]);
+ } else {
+ diffs.splice(pointer - countDelete - countInsert, countDelete + countInsert, [DIFF_DELETE, textDelete], [DIFF_INSERT, textInsert]);
+ }
+ pointer = pointer - countDelete - countInsert + (countDelete ? 1 : 0) + (countInsert ? 1 : 0) + 1;
+ } else if (pointer !== 0 && diffs[pointer - 1][0] === DIFF_EQUAL) {
+
+ // Merge this equality with the previous one.
+ diffs[pointer - 1][1] += diffs[pointer][1];
+ diffs.splice(pointer, 1);
+ } else {
+ pointer++;
+ }
+ countInsert = 0;
+ countDelete = 0;
+ textDelete = "";
+ textInsert = "";
+ break;
+ }
+ }
+ if (diffs[diffs.length - 1][1] === "") {
+ diffs.pop(); // Remove the dummy entry at the end.
+ }
+
+ // Second pass: look for single edits surrounded on both sides by equalities
+ // which can be shifted sideways to eliminate an equality.
+ // e.g: A<ins>BA</ins>C -> <ins>AB</ins>AC
+ changes = false;
+ pointer = 1;
+
+ // Intentionally ignore the first and last element (don't need checking).
+ while (pointer < diffs.length - 1) {
+ if (diffs[pointer - 1][0] === DIFF_EQUAL && diffs[pointer + 1][0] === DIFF_EQUAL) {
+
+ diffPointer = diffs[pointer][1];
+ position = diffPointer.substring(diffPointer.length - diffs[pointer - 1][1].length);
+
+ // This is a single edit surrounded by equalities.
+ if (position === diffs[pointer - 1][1]) {
+
+ // Shift the edit over the previous equality.
+ diffs[pointer][1] = diffs[pointer - 1][1] + diffs[pointer][1].substring(0, diffs[pointer][1].length - diffs[pointer - 1][1].length);
+ diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1];
+ diffs.splice(pointer - 1, 1);
+ changes = true;
+ } else if (diffPointer.substring(0, diffs[pointer + 1][1].length) === diffs[pointer + 1][1]) {
+
+ // Shift the edit over the next equality.
+ diffs[pointer - 1][1] += diffs[pointer + 1][1];
+ diffs[pointer][1] = diffs[pointer][1].substring(diffs[pointer + 1][1].length) + diffs[pointer + 1][1];
+ diffs.splice(pointer + 1, 1);
+ changes = true;
+ }
+ }
+ pointer++;
+ }
+
+ // If shifts were made, the diff needs reordering and another shift sweep.
+ if (changes) {
+ this.diffCleanupMerge(diffs);
+ }
+ };
+
+ return function (o, n) {
+ var diff, output, text;
+ diff = new DiffMatchPatch();
+ output = diff.DiffMain(o, n);
+ diff.diffCleanupEfficiency(output);
+ text = diff.diffPrettyHtml(output);
+
+ return text;
+ };
+ }();
+
+}((function() { return this; }())));
+
+/* globals QUnit */
+
+(function() {
+ QUnit.config.autostart = false;
+ QUnit.config.urlConfig.push({ id: 'nocontainer', label: 'Hide container' });
+ QUnit.config.urlConfig.push({ id: 'nolint', label: 'Disable Linting' });
+ QUnit.config.urlConfig.push({ id: 'dockcontainer', label: 'Dock container' });
+ QUnit.config.urlConfig.push({ id: 'devmode', label: 'Development mode' });
+
+ QUnit.config.testTimeout = QUnit.urlParams.devmode ? null : 60000; //Default Test Timeout 60 Seconds
+})();
+
+define('@ember/test-helpers/-utils', ['exports'], function (exports) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.nextTickPromise = nextTickPromise;
+ exports.runDestroyablesFor = runDestroyablesFor;
+ const nextTick = exports.nextTick = setTimeout;
+ const futureTick = exports.futureTick = setTimeout;
+
+ /**
+ @private
+ @returns {Promise<void>} promise which resolves on the next turn of the event loop
+ */
+ function nextTickPromise() {
+ return new Ember.RSVP.Promise(resolve => {
+ nextTick(resolve);
+ });
+ }
+
+ /**
+ Retrieves an array of destroyables from the specified property on the object
+ provided, iterates that array invoking each function, then deleting the
+ property (clearing the array).
+
+ @private
+ @param {Object} object an object to search for the destroyable array within
+ @param {string} property the property on the object that contains the destroyable array
+ */
+ function runDestroyablesFor(object, property) {
+ let destroyables = object[property];
+
+ if (!destroyables) {
+ return;
+ }
+
+ for (let i = 0; i < destroyables.length; i++) {
+ destroyables[i]();
+ }
+
+ delete object[property];
+ }
+});
+define('@ember/test-helpers/application', ['exports', '@ember/test-helpers/resolver'], function (exports, _resolver) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.setApplication = setApplication;
+ exports.getApplication = getApplication;
+
+
+ var __application__;
+
+ /**
+ Stores the provided application instance so that tests being ran will be aware of the application under test.
+
+ - Required by `setupApplicationContext` method.
+ - Used by `setupContext` and `setupRenderingContext` when present.
+
+ @public
+ @param {Ember.Application} application the application that will be tested
+ */
+ function setApplication(application) {
+ __application__ = application;
+
+ if (!(0, _resolver.getResolver)()) {
+ let Resolver = application.Resolver;
+ let resolver = Resolver.create({ namespace: application });
+
+ (0, _resolver.setResolver)(resolver);
+ }
+ }
+
+ /**
+ Retrieve the application instance stored by `setApplication`.
+
+ @public
+ @returns {Ember.Application} the previously stored application instance under test
+ */
+ function getApplication() {
+ return __application__;
+ }
+});
+define('@ember/test-helpers/build-owner', ['exports', 'ember-test-helpers/legacy-0-6-x/build-registry'], function (exports, _buildRegistry) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = buildOwner;
+
+
+ /**
+ Creates an "owner" (an object that either _is_ or duck-types like an
+ `Ember.ApplicationInstance`) from the provided options.
+
+ If `options.application` is present (e.g. setup by an earlier call to
+ `setApplication`) an `Ember.ApplicationInstance` is built via
+ `application.buildInstance()`.
+
+ If `options.application` is not present, we fall back to using
+ `options.resolver` instead (setup via `setResolver`). This creates a mock
+ "owner" by using a custom created combination of `Ember.Registry`,
+ `Ember.Container`, `Ember._ContainerProxyMixin`, and
+ `Ember._RegistryProxyMixin`.
+
+ @private
+ @param {Ember.Application} [application] the Ember.Application to build an instance from
+ @param {Ember.Resolver} [resolver] the resolver to use to back a "mock owner"
+ @returns {Promise<Ember.ApplicationInstance>} a promise resolving to the generated "owner"
+ */
+ function buildOwner(application, resolver) {
+ if (application) {
+ return application.boot().then(app => app.buildInstance().boot());
+ }
+
+ if (!resolver) {
+ throw new Error('You must set up the ember-test-helpers environment with either `setResolver` or `setApplication` before running any tests.');
+ }
+
+ let { owner } = (0, _buildRegistry.default)(resolver);
+ return Ember.RSVP.Promise.resolve(owner);
+ }
+});
+define('@ember/test-helpers/dom/-get-element', ['exports', '@ember/test-helpers/dom/get-root-element'], function (exports, _getRootElement) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = getElement;
+
+
+ /**
+ Used internally by the DOM interaction helpers to find one element.
+
+ @private
+ @param {string|Element} target the element or selector to retrieve
+ @returns {Element} the target or selector
+ */
+ function getElement(target) {
+ if (target.nodeType === Node.ELEMENT_NODE || target.nodeType === Node.DOCUMENT_NODE || target instanceof Window) {
+ return target;
+ } else if (typeof target === 'string') {
+ let rootElement = (0, _getRootElement.default)();
+
+ return rootElement.querySelector(target);
+ } else {
+ throw new Error('Must use an element or a selector string');
+ }
+ }
+});
+define('@ember/test-helpers/dom/-get-elements', ['exports', '@ember/test-helpers/dom/get-root-element'], function (exports, _getRootElement) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = getElements;
+
+
+ /**
+ Used internally by the DOM interaction helpers to find multiple elements.
+
+ @private
+ @param {string} target the selector to retrieve
+ @returns {NodeList} the matched elements
+ */
+ function getElements(target) {
+ if (typeof target === 'string') {
+ let rootElement = (0, _getRootElement.default)();
+
+ return rootElement.querySelectorAll(target);
+ } else {
+ throw new Error('Must use a selector string');
+ }
+ }
+});
+define('@ember/test-helpers/dom/-is-focusable', ['exports', '@ember/test-helpers/dom/-is-form-control'], function (exports, _isFormControl) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = isFocusable;
+
+
+ const FOCUSABLE_TAGS = ['A'];
+
+ /**
+ @private
+ @param {Element} element the element to check
+ @returns {boolean} `true` when the element is focusable, `false` otherwise
+ */
+ function isFocusable(element) {
+ if ((0, _isFormControl.default)(element) || element.isContentEditable || FOCUSABLE_TAGS.indexOf(element.tagName) > -1) {
+ return true;
+ }
+
+ return element.hasAttribute('tabindex');
+ }
+});
+define('@ember/test-helpers/dom/-is-form-control', ['exports'], function (exports) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = isFormControl;
+ const FORM_CONTROL_TAGS = ['INPUT', 'BUTTON', 'SELECT', 'TEXTAREA'];
+
+ /**
+ @private
+ @param {Element} element the element to check
+ @returns {boolean} `true` when the element is a form control, `false` otherwise
+ */
+ function isFormControl(element) {
+ let { tagName, type } = element;
+
+ if (type === 'hidden') {
+ return false;
+ }
+
+ return FORM_CONTROL_TAGS.indexOf(tagName) > -1;
+ }
+});
+define("@ember/test-helpers/dom/-to-array", ["exports"], function (exports) {
+ "use strict";
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = toArray;
+ /**
+ @private
+ @param {NodeList} nodelist the nodelist to convert to an array
+ @returns {Array} an array
+ */
+ function toArray(nodelist) {
+ let array = new Array(nodelist.length);
+ for (let i = 0; i < nodelist.length; i++) {
+ array[i] = nodelist[i];
+ }
+
+ return array;
+ }
+});
+define('@ember/test-helpers/dom/blur', ['exports', '@ember/test-helpers/dom/-get-element', '@ember/test-helpers/dom/fire-event', '@ember/test-helpers/settled', '@ember/test-helpers/dom/-is-focusable', '@ember/test-helpers/-utils'], function (exports, _getElement, _fireEvent, _settled, _isFocusable, _utils) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.__blur__ = __blur__;
+ exports.default = blur;
+
+
+ /**
+ @private
+ @param {Element} element the element to trigger events on
+ */
+ function __blur__(element) {
+ let browserIsNotFocused = document.hasFocus && !document.hasFocus();
+
+ // makes `document.activeElement` be `body`.
+ // If the browser is focused, it also fires a blur event
+ element.blur();
+
+ // Chrome/Firefox does not trigger the `blur` event if the window
+ // does not have focus. If the document does not have focus then
+ // fire `blur` event via native event.
+ if (browserIsNotFocused) {
+ (0, _fireEvent.default)(element, 'blur', { bubbles: false });
+ (0, _fireEvent.default)(element, 'focusout');
+ }
+ }
+
+ /**
+ Unfocus the specified target.
+
+ Sends a number of events intending to simulate a "real" user unfocusing an
+ element.
+
+ The following events are triggered (in order):
+
+ - `blur`
+ - `focusout`
+
+ The exact listing of events that are triggered may change over time as needed
+ to continue to emulate how actual browsers handle unfocusing a given element.
+
+ @public
+ @param {string|Element} [target=document.activeElement] the element or selector to unfocus
+ @return {Promise<void>} resolves when settled
+ */
+ function blur(target = document.activeElement) {
+ return (0, _utils.nextTickPromise)().then(() => {
+ let element = (0, _getElement.default)(target);
+ if (!element) {
+ throw new Error(`Element not found when calling \`blur('${target}')\`.`);
+ }
+
+ if (!(0, _isFocusable.default)(element)) {
+ throw new Error(`${target} is not focusable`);
+ }
+
+ __blur__(element);
+
+ return (0, _settled.default)();
+ });
+ }
+});
+define('@ember/test-helpers/dom/click', ['exports', '@ember/test-helpers/dom/-get-element', '@ember/test-helpers/dom/fire-event', '@ember/test-helpers/dom/focus', '@ember/test-helpers/settled', '@ember/test-helpers/dom/-is-focusable', '@ember/test-helpers/-utils'], function (exports, _getElement, _fireEvent, _focus, _settled, _isFocusable, _utils) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.__click__ = __click__;
+ exports.default = click;
+
+
+ /**
+ @private
+ @param {Element} element the element to click on
+ */
+ function __click__(element) {
+ (0, _fireEvent.default)(element, 'mousedown');
+
+ if ((0, _isFocusable.default)(element)) {
+ (0, _focus.__focus__)(element);
+ }
+
+ (0, _fireEvent.default)(element, 'mouseup');
+ (0, _fireEvent.default)(element, 'click');
+ }
+
+ /**
+ Clicks on the specified target.
+
+ Sends a number of events intending to simulate a "real" user clicking on an
+ element.
+
+ For non-focusable elements the following events are triggered (in order):
+
+ - `mousedown`
+ - `mouseup`
+ - `click`
+
+ For focusable (e.g. form control) elements the following events are triggered
+ (in order):
+
+ - `mousedown`
+ - `focus`
+ - `focusin`
+ - `mouseup`
+ - `click`
+
+ The exact listing of events that are triggered may change over time as needed
+ to continue to emulate how actual browsers handle clicking a given element.
+
+ @public
+ @param {string|Element} target the element or selector to click on
+ @return {Promise<void>} resolves when settled
+ */
+ function click(target) {
+ return (0, _utils.nextTickPromise)().then(() => {
+ if (!target) {
+ throw new Error('Must pass an element or selector to `click`.');
+ }
+
+ let element = (0, _getElement.default)(target);
+ if (!element) {
+ throw new Error(`Element not found when calling \`click('${target}')\`.`);
+ }
+
+ __click__(element);
+ return (0, _settled.default)();
+ });
+ }
+});
+define('@ember/test-helpers/dom/fill-in', ['exports', '@ember/test-helpers/dom/-get-element', '@ember/test-helpers/dom/-is-form-control', '@ember/test-helpers/dom/focus', '@ember/test-helpers/settled', '@ember/test-helpers/dom/fire-event', '@ember/test-helpers/-utils'], function (exports, _getElement, _isFormControl, _focus, _settled, _fireEvent, _utils) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = fillIn;
+
+
+ /**
+ Fill the provided text into the `value` property (or set `.innerHTML` when
+ the target is a content editable element) then trigger `change` and `input`
+ events on the specified target.
+
+ @public
+ @param {string|Element} target the element or selector to enter text into
+ @param {string} text the text to fill into the target element
+ @return {Promise<void>} resolves when the application is settled
+ */
+ function fillIn(target, text) {
+ return (0, _utils.nextTickPromise)().then(() => {
+ if (!target) {
+ throw new Error('Must pass an element or selector to `fillIn`.');
+ }
+
+ let element = (0, _getElement.default)(target);
+ if (!element) {
+ throw new Error(`Element not found when calling \`fillIn('${target}')\`.`);
+ }
+ let isControl = (0, _isFormControl.default)(element);
+ if (!isControl && !element.isContentEditable) {
+ throw new Error('`fillIn` is only usable on form controls or contenteditable elements.');
+ }
+
+ if (typeof text === 'undefined' || text === null) {
+ throw new Error('Must provide `text` when calling `fillIn`.');
+ }
+
+ (0, _focus.__focus__)(element);
+
+ if (isControl) {
+ element.value = text;
+ } else {
+ element.innerHTML = text;
+ }
+
+ (0, _fireEvent.default)(element, 'input');
+ (0, _fireEvent.default)(element, 'change');
+
+ return (0, _settled.default)();
+ });
+ }
+});
+define('@ember/test-helpers/dom/find-all', ['exports', '@ember/test-helpers/dom/-get-elements', '@ember/test-helpers/dom/-to-array'], function (exports, _getElements, _toArray) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = find;
+
+
+ /**
+ Find all elements matched by the given selector. Equivalent to calling
+ `querySelectorAll()` on the test root element.
+
+ @public
+ @param {string} selector the selector to search for
+ @return {Array} array of matched elements
+ */
+ function find(selector) {
+ if (!selector) {
+ throw new Error('Must pass a selector to `findAll`.');
+ }
+
+ return (0, _toArray.default)((0, _getElements.default)(selector));
+ }
+});
+define('@ember/test-helpers/dom/find', ['exports', '@ember/test-helpers/dom/-get-element'], function (exports, _getElement) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = find;
+
+
+ /**
+ Find the first element matched by the given selector. Equivalent to calling
+ `querySelector()` on the test root element.
+
+ @public
+ @param {string} selector the selector to search for
+ @return {Element} matched element or null
+ */
+ function find(selector) {
+ if (!selector) {
+ throw new Error('Must pass a selector to `find`.');
+ }
+
+ return (0, _getElement.default)(selector);
+ }
+});
+define('@ember/test-helpers/dom/fire-event', ['exports'], function (exports) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = fireEvent;
+
+
+ const DEFAULT_EVENT_OPTIONS = { bubbles: true, cancelable: true };
+ const KEYBOARD_EVENT_TYPES = exports.KEYBOARD_EVENT_TYPES = Object.freeze(['keydown', 'keypress', 'keyup']);
+ const MOUSE_EVENT_TYPES = ['click', 'mousedown', 'mouseup', 'dblclick', 'mouseenter', 'mouseleave', 'mousemove', 'mouseout', 'mouseover'];
+ const FILE_SELECTION_EVENT_TYPES = ['change'];
+
+ /**
+ Internal helper used to build and dispatch events throughout the other DOM helpers.
+
+ @private
+ @param {Element} element the element to dispatch the event to
+ @param {string} eventType the type of event
+ @param {Object} [options] additional properties to be set on the event
+ @returns {Event} the event that was dispatched
+ */
+ function fireEvent(element, eventType, options = {}) {
+ if (!element) {
+ throw new Error('Must pass an element to `fireEvent`');
+ }
+
+ let event;
+ if (KEYBOARD_EVENT_TYPES.indexOf(eventType) > -1) {
+ event = buildKeyboardEvent(eventType, options);
+ } else if (MOUSE_EVENT_TYPES.indexOf(eventType) > -1) {
+ let rect;
+ if (element instanceof Window) {
+ rect = element.document.documentElement.getBoundingClientRect();
+ } else if (element.nodeType === Node.DOCUMENT_NODE) {
+ rect = element.documentElement.getBoundingClientRect();
+ } else if (element.nodeType === Node.ELEMENT_NODE) {
+ rect = element.getBoundingClientRect();
+ } else {
+ return;
+ }
+
+ let x = rect.left + 1;
+ let y = rect.top + 1;
+ let simulatedCoordinates = {
+ screenX: x + 5, // Those numbers don't really mean anything.
+ screenY: y + 95, // They're just to make the screenX/Y be different of clientX/Y..
+ clientX: x,
+ clientY: y
+ };
+
+ event = buildMouseEvent(eventType, Ember.merge(simulatedCoordinates, options));
+ } else if (FILE_SELECTION_EVENT_TYPES.indexOf(eventType) > -1 && element.files) {
+ event = buildFileEvent(eventType, element, options);
+ } else {
+ event = buildBasicEvent(eventType, options);
+ }
+
+ element.dispatchEvent(event);
+ return event;
+ }
+
+ // eslint-disable-next-line require-jsdoc
+ function buildBasicEvent(type, options = {}) {
+ let event = document.createEvent('Events');
+
+ let bubbles = options.bubbles !== undefined ? options.bubbles : true;
+ let cancelable = options.cancelable !== undefined ? options.cancelable : true;
+
+ delete options.bubbles;
+ delete options.cancelable;
+
+ // bubbles and cancelable are readonly, so they can be
+ // set when initializing event
+ event.initEvent(type, bubbles, cancelable);
+ Ember.merge(event, options);
+ return event;
+ }
+
+ // eslint-disable-next-line require-jsdoc
+ function buildMouseEvent(type, options = {}) {
+ let event;
+ try {
+ event = document.createEvent('MouseEvents');
+ let eventOpts = Ember.merge(Ember.merge({}, DEFAULT_EVENT_OPTIONS), options);
+ event.initMouseEvent(type, eventOpts.bubbles, eventOpts.cancelable, window, eventOpts.detail, eventOpts.screenX, eventOpts.screenY, eventOpts.clientX, eventOpts.clientY, eventOpts.ctrlKey, eventOpts.altKey, eventOpts.shiftKey, eventOpts.metaKey, eventOpts.button, eventOpts.relatedTarget);
+ } catch (e) {
+ event = buildBasicEvent(type, options);
+ }
+ return event;
+ }
+
+ // eslint-disable-next-line require-jsdoc
+ function buildKeyboardEvent(type, options = {}) {
+ let eventOpts = Ember.merge(Ember.merge({}, DEFAULT_EVENT_OPTIONS), options);
+ let event, eventMethodName;
+
+ try {
+ event = new KeyboardEvent(type, eventOpts);
+
+ // Property definitions are required for B/C for keyboard event usage
+ // If this properties are not defined, when listening for key events
+ // keyCode/which will be 0. Also, keyCode and which now are string
+ // and if app compare it with === with integer key definitions,
+ // there will be a fail.
+ //
+ // https://w3c.github.io/uievents/#interface-keyboardevent
+ // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent
+ Object.defineProperty(event, 'keyCode', {
+ get() {
+ return parseInt(this.key);
+ }
+ });
+
+ Object.defineProperty(event, 'which', {
+ get() {
+ return parseInt(this.key);
+ }
+ });
+
+ return event;
+ } catch (e) {
+ // left intentionally blank
+ }
+
+ try {
+ event = document.createEvent('KeyboardEvents');
+ eventMethodName = 'initKeyboardEvent';
+ } catch (e) {
+ // left intentionally blank
+ }
+
+ if (!event) {
+ try {
+ event = document.createEvent('KeyEvents');
+ eventMethodName = 'initKeyEvent';
+ } catch (e) {
+ // left intentionally blank
+ }
+ }
+
+ if (event) {
+ event[eventMethodName](type, eventOpts.bubbles, eventOpts.cancelable, window, eventOpts.ctrlKey, eventOpts.altKey, eventOpts.shiftKey, eventOpts.metaKey, eventOpts.keyCode, eventOpts.charCode);
+ } else {
+ event = buildBasicEvent(type, options);
+ }
+
+ return event;
+ }
+
+ // eslint-disable-next-line require-jsdoc
+ function buildFileEvent(type, element, files = []) {
+ let event = buildBasicEvent(type);
+
+ if (files.length > 0) {
+ Object.defineProperty(files, 'item', {
+ value(index) {
+ return typeof index === 'number' ? this[index] : null;
+ }
+ });
+ Object.defineProperty(element, 'files', {
+ value: files,
+ configurable: true
+ });
+ }
+
+ Object.defineProperty(event, 'target', {
+ value: element
+ });
+
+ return event;
+ }
+});
+define('@ember/test-helpers/dom/focus', ['exports', '@ember/test-helpers/dom/-get-element', '@ember/test-helpers/dom/fire-event', '@ember/test-helpers/settled', '@ember/test-helpers/dom/-is-focusable', '@ember/test-helpers/-utils'], function (exports, _getElement, _fireEvent, _settled, _isFocusable, _utils) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.__focus__ = __focus__;
+ exports.default = focus;
+
+
+ /**
+ @private
+ @param {Element} element the element to trigger events on
+ */
+ function __focus__(element) {
+ let browserIsNotFocused = document.hasFocus && !document.hasFocus();
+
+ // makes `document.activeElement` be `element`. If the browser is focused, it also fires a focus event
+ element.focus();
+
+ // Firefox does not trigger the `focusin` event if the window
+ // does not have focus. If the document does not have focus then
+ // fire `focusin` event as well.
+ if (browserIsNotFocused) {
+ // if the browser is not focused the previous `el.focus()` didn't fire an event, so we simulate it
+ (0, _fireEvent.default)(element, 'focus', {
+ bubbles: false
+ });
+
+ (0, _fireEvent.default)(element, 'focusin');
+ }
+ }
+
+ /**
+ Focus the specified target.
+
+ Sends a number of events intending to simulate a "real" user focusing an
+ element.
+
+ The following events are triggered (in order):
+
+ - `focus`
+ - `focusin`
+
+ The exact listing of events that are triggered may change over time as needed
+ to continue to emulate how actual browsers handle focusing a given element.
+
+ @public
+ @param {string|Element} target the element or selector to focus
+ @return {Promise<void>} resolves when the application is settled
+ */
+ function focus(target) {
+ return (0, _utils.nextTickPromise)().then(() => {
+ if (!target) {
+ throw new Error('Must pass an element or selector to `focus`.');
+ }
+
+ let element = (0, _getElement.default)(target);
+ if (!element) {
+ throw new Error(`Element not found when calling \`focus('${target}')\`.`);
+ }
+
+ if (!(0, _isFocusable.default)(element)) {
+ throw new Error(`${target} is not focusable`);
+ }
+
+ __focus__(element);
+
+ return (0, _settled.default)();
+ });
+ }
+});
+define('@ember/test-helpers/dom/get-root-element', ['exports', '@ember/test-helpers/setup-context'], function (exports, _setupContext) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = getRootElement;
+
+
+ /**
+ Get the root element of the application under test (usually `#ember-testing`)
+
+ @public
+ @returns {Element} the root element
+ */
+ function getRootElement() {
+ let context = (0, _setupContext.getContext)();
+ let owner = context && context.owner;
+
+ if (!owner) {
+ throw new Error('Must setup rendering context before attempting to interact with elements.');
+ }
+
+ let rootElementSelector;
+ // When the host app uses `setApplication` (instead of `setResolver`) the owner has
+ // a `rootElement` set on it with the element id to be used
+ if (owner && owner._emberTestHelpersMockOwner === undefined) {
+ rootElementSelector = owner.rootElement;
+ } else {
+ rootElementSelector = '#ember-testing';
+ }
+
+ let rootElement = document.querySelector(rootElementSelector);
+
+ return rootElement;
+ }
+});
+define('@ember/test-helpers/dom/tap', ['exports', '@ember/test-helpers/dom/-get-element', '@ember/test-helpers/dom/fire-event', '@ember/test-helpers/dom/click', '@ember/test-helpers/settled', '@ember/test-helpers/-utils'], function (exports, _getElement, _fireEvent, _click, _settled, _utils) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = tap;
+
+
+ /**
+ Taps on the specified target.
+
+ Sends a number of events intending to simulate a "real" user tapping on an
+ element.
+
+ For non-focusable elements the following events are triggered (in order):
+
+ - `touchstart`
+ - `touchend`
+ - `mousedown`
+ - `mouseup`
+ - `click`
+
+ For focusable (e.g. form control) elements the following events are triggered
+ (in order):
+
+ - `touchstart`
+ - `touchend`
+ - `mousedown`
+ - `focus`
+ - `focusin`
+ - `mouseup`
+ - `click`
+
+ The exact listing of events that are triggered may change over time as needed
+ to continue to emulate how actual browsers handle tapping on a given element.
+
+ @public
+ @param {string|Element} target the element or selector to tap on
+ @param {Object} options the options to be provided to the touch events
+ @return {Promise<void>} resolves when settled
+ */
+ function tap(target, options = {}) {
+ return (0, _utils.nextTickPromise)().then(() => {
+ if (!target) {
+ throw new Error('Must pass an element or selector to `tap`.');
+ }
+
+ let element = (0, _getElement.default)(target);
+ if (!element) {
+ throw new Error(`Element not found when calling \`tap('${target}')\`.`);
+ }
+
+ let touchstartEv = (0, _fireEvent.default)(element, 'touchstart', options);
+ let touchendEv = (0, _fireEvent.default)(element, 'touchend', options);
+
+ if (!touchstartEv.defaultPrevented && !touchendEv.defaultPrevented) {
+ (0, _click.__click__)(element);
+ }
+
+ return (0, _settled.default)();
+ });
+ }
+});
+define('@ember/test-helpers/dom/trigger-event', ['exports', '@ember/test-helpers/dom/-get-element', '@ember/test-helpers/dom/fire-event', '@ember/test-helpers/settled', '@ember/test-helpers/-utils'], function (exports, _getElement, _fireEvent, _settled, _utils) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = triggerEvent;
+
+
+ /**
+ Triggers an event on the specified target.
+
+ @public
+ @param {string|Element} target the element or selector to trigger the event on
+ @param {string} eventType the type of event to trigger
+ @param {Object} options additional properties to be set on the event
+ @return {Promise<void>} resolves when the application is settled
+ */
+ function triggerEvent(target, eventType, options) {
+ return (0, _utils.nextTickPromise)().then(() => {
+ if (!target) {
+ throw new Error('Must pass an element or selector to `triggerEvent`.');
+ }
+
+ let element = (0, _getElement.default)(target);
+ if (!element) {
+ throw new Error(`Element not found when calling \`triggerEvent('${target}', ...)\`.`);
+ }
+
+ if (!eventType) {
+ throw new Error(`Must provide an \`eventType\` to \`triggerEvent\``);
+ }
+
+ (0, _fireEvent.default)(element, eventType, options);
+
+ return (0, _settled.default)();
+ });
+ }
+});
+define('@ember/test-helpers/dom/trigger-key-event', ['exports', '@ember/test-helpers/dom/-get-element', '@ember/test-helpers/dom/fire-event', '@ember/test-helpers/settled', '@ember/test-helpers/-utils'], function (exports, _getElement, _fireEvent, _settled, _utils) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = triggerKeyEvent;
+
+
+ const DEFAULT_MODIFIERS = Object.freeze({
+ ctrlKey: false,
+ altKey: false,
+ shiftKey: false,
+ metaKey: false
+ });
+
+ /**
+ Triggers a keyboard event on the specified target.
+
+ @public
+ @param {string|Element} target the element or selector to trigger the event on
+ @param {'keydown' | 'keyup' | 'keypress'} eventType the type of event to trigger
+ @param {string} keyCode the keyCode of the event being triggered
+ @param {Object} [modifiers] the state of various modifier keys
+ @param {boolean} [modifiers.ctrlKey=false] if true the generated event will indicate the control key was pressed during the key event
+ @param {boolean} [modifiers.altKey=false] if true the generated event will indicate the alt key was pressed during the key event
+ @param {boolean} [modifiers.shiftKey=false] if true the generated event will indicate the shift key was pressed during the key event
+ @param {boolean} [modifiers.metaKey=false] if true the generated event will indicate the meta key was pressed during the key event
+ @return {Promise<void>} resolves when the application is settled
+ */
+ function triggerKeyEvent(target, eventType, keyCode, modifiers = DEFAULT_MODIFIERS) {
+ return (0, _utils.nextTickPromise)().then(() => {
+ if (!target) {
+ throw new Error('Must pass an element or selector to `triggerKeyEvent`.');
+ }
+
+ let element = (0, _getElement.default)(target);
+ if (!element) {
+ throw new Error(`Element not found when calling \`triggerKeyEvent('${target}', ...)\`.`);
+ }
+
+ if (!eventType) {
+ throw new Error(`Must provide an \`eventType\` to \`triggerKeyEvent\``);
+ }
+
+ if (_fireEvent.KEYBOARD_EVENT_TYPES.indexOf(eventType) === -1) {
+ let validEventTypes = _fireEvent.KEYBOARD_EVENT_TYPES.join(', ');
+ throw new Error(`Must provide an \`eventType\` of ${validEventTypes} to \`triggerKeyEvent\` but you passed \`${eventType}\`.`);
+ }
+
+ if (!keyCode) {
+ throw new Error(`Must provide a \`keyCode\` to \`triggerKeyEvent\``);
+ }
+
+ let options = Ember.merge({ keyCode, which: keyCode, key: keyCode }, modifiers);
+
+ (0, _fireEvent.default)(element, eventType, options);
+
+ return (0, _settled.default)();
+ });
+ }
+});
+define('@ember/test-helpers/dom/wait-for', ['exports', '@ember/test-helpers/wait-until', '@ember/test-helpers/dom/-get-element', '@ember/test-helpers/dom/-get-elements', '@ember/test-helpers/dom/-to-array', '@ember/test-helpers/-utils'], function (exports, _waitUntil, _getElement, _getElements, _toArray, _utils) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = waitFor;
+
+
+ /**
+ Used to wait for a particular selector to appear in the DOM. Due to the fact
+ that it does not wait for general settledness, this is quite useful for testing
+ interim DOM states (e.g. loading states, pending promises, etc).
+
+ @param {string} selector the selector to wait for
+ @param {Object} [options] the options to be used
+ @param {number} [options.timeout=1000] the time to wait (in ms) for a match
+ @param {number} [options.count=1] the number of elements that should match the provided selector
+ @returns {Element|Array<Element>} the element (or array of elements) that were being waited upon
+ */
+ function waitFor(selector, { timeout = 1000, count = null } = {}) {
+ return (0, _utils.nextTickPromise)().then(() => {
+ if (!selector) {
+ throw new Error('Must pass a selector to `waitFor`.');
+ }
+
+ let callback;
+ if (count !== null) {
+ callback = () => {
+ let elements = (0, _getElements.default)(selector);
+ if (elements.length === count) {
+ return (0, _toArray.default)(elements);
+ }
+ };
+ } else {
+ callback = () => (0, _getElement.default)(selector);
+ }
+ return (0, _waitUntil.default)(callback, { timeout });
+ });
+ }
+});
+define('@ember/test-helpers/global', ['exports'], function (exports) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+
+ exports.default = (() => {
+ if (typeof self !== 'undefined') {
+ return self;
+ } else if (typeof window !== 'undefined') {
+ return window;
+ } else if (typeof global !== 'undefined') {
+ return global;
+ } else {
+ return Function('return this')();
+ }
+ })();
+});
+define('@ember/test-helpers/has-ember-version', ['exports'], function (exports) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = hasEmberVersion;
+
+
+ /**
+ Checks if the currently running Ember version is greater than or equal to the
+ specified major and minor version numbers.
+
+ @private
+ @param {number} major the major version number to compare
+ @param {number} minor the minor version number to compare
+ @returns {boolean} true if the Ember version is >= MAJOR.MINOR specified, false otherwise
+ */
+ function hasEmberVersion(major, minor) {
+ var numbers = Ember.VERSION.split('-')[0].split('.');
+ var actualMajor = parseInt(numbers[0], 10);
+ var actualMinor = parseInt(numbers[1], 10);
+ return actualMajor > major || actualMajor === major && actualMinor >= minor;
+ }
+});
+define('@ember/test-helpers/index', ['exports', '@ember/test-helpers/resolver', '@ember/test-helpers/application', '@ember/test-helpers/setup-context', '@ember/test-helpers/teardown-context', '@ember/test-helpers/setup-rendering-context', '@ember/test-helpers/teardown-rendering-context', '@ember/test-helpers/setup-application-context', '@ember/test-helpers/teardown-application-context', '@ember/test-helpers/settled', '@ember/test-helpers/wait-until', '@ember/test-helpers/validate-error-handler', '@ember/test-helpers/dom/click', '@ember/test-helpers/dom/tap', '@ember/test-helpers/dom/focus', '@ember/test-helpers/dom/blur', '@ember/test-helpers/dom/trigger-event', '@ember/test-helpers/dom/trigger-key-event', '@ember/test-helpers/dom/fill-in', '@ember/test-helpers/dom/wait-for', '@ember/test-helpers/dom/get-root-element', '@ember/test-helpers/dom/find', '@ember/test-helpers/dom/find-all'], function (exports, _resolver, _application, _setupContext, _teardownContext, _setupRenderingContext, _teardownRenderingContext, _setupApplicationContext, _teardownApplicationContext, _settled, _waitUntil, _validateErrorHandler, _click, _tap, _focus, _blur, _triggerEvent, _triggerKeyEvent, _fillIn, _waitFor, _getRootElement, _find, _findAll) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ Object.defineProperty(exports, 'setResolver', {
+ enumerable: true,
+ get: function () {
+ return _resolver.setResolver;
+ }
+ });
+ Object.defineProperty(exports, 'getResolver', {
+ enumerable: true,
+ get: function () {
+ return _resolver.getResolver;
+ }
+ });
+ Object.defineProperty(exports, 'getApplication', {
+ enumerable: true,
+ get: function () {
+ return _application.getApplication;
+ }
+ });
+ Object.defineProperty(exports, 'setApplication', {
+ enumerable: true,
+ get: function () {
+ return _application.setApplication;
+ }
+ });
+ Object.defineProperty(exports, 'setupContext', {
+ enumerable: true,
+ get: function () {
+ return _setupContext.default;
+ }
+ });
+ Object.defineProperty(exports, 'getContext', {
+ enumerable: true,
+ get: function () {
+ return _setupContext.getContext;
+ }
+ });
+ Object.defineProperty(exports, 'setContext', {
+ enumerable: true,
+ get: function () {
+ return _setupContext.setContext;
+ }
+ });
+ Object.defineProperty(exports, 'unsetContext', {
+ enumerable: true,
+ get: function () {
+ return _setupContext.unsetContext;
+ }
+ });
+ Object.defineProperty(exports, 'pauseTest', {
+ enumerable: true,
+ get: function () {
+ return _setupContext.pauseTest;
+ }
+ });
+ Object.defineProperty(exports, 'resumeTest', {
+ enumerable: true,
+ get: function () {
+ return _setupContext.resumeTest;
+ }
+ });
+ Object.defineProperty(exports, 'teardownContext', {
+ enumerable: true,
+ get: function () {
+ return _teardownContext.default;
+ }
+ });
+ Object.defineProperty(exports, 'setupRenderingContext', {
+ enumerable: true,
+ get: function () {
+ return _setupRenderingContext.default;
+ }
+ });
+ Object.defineProperty(exports, 'render', {
+ enumerable: true,
+ get: function () {
+ return _setupRenderingContext.render;
+ }
+ });
+ Object.defineProperty(exports, 'clearRender', {
+ enumerable: true,
+ get: function () {
+ return _setupRenderingContext.clearRender;
+ }
+ });
+ Object.defineProperty(exports, 'teardownRenderingContext', {
+ enumerable: true,
+ get: function () {
+ return _teardownRenderingContext.default;
+ }
+ });
+ Object.defineProperty(exports, 'setupApplicationContext', {
+ enumerable: true,
+ get: function () {
+ return _setupApplicationContext.default;
+ }
+ });
+ Object.defineProperty(exports, 'visit', {
+ enumerable: true,
+ get: function () {
+ return _setupApplicationContext.visit;
+ }
+ });
+ Object.defineProperty(exports, 'currentRouteName', {
+ enumerable: true,
+ get: function () {
+ return _setupApplicationContext.currentRouteName;
+ }
+ });
+ Object.defineProperty(exports, 'currentURL', {
+ enumerable: true,
+ get: function () {
+ return _setupApplicationContext.currentURL;
+ }
+ });
+ Object.defineProperty(exports, 'teardownApplicationContext', {
+ enumerable: true,
+ get: function () {
+ return _teardownApplicationContext.default;
+ }
+ });
+ Object.defineProperty(exports, 'settled', {
+ enumerable: true,
+ get: function () {
+ return _settled.default;
+ }
+ });
+ Object.defineProperty(exports, 'isSettled', {
+ enumerable: true,
+ get: function () {
+ return _settled.isSettled;
+ }
+ });
+ Object.defineProperty(exports, 'getSettledState', {
+ enumerable: true,
+ get: function () {
+ return _settled.getSettledState;
+ }
+ });
+ Object.defineProperty(exports, 'waitUntil', {
+ enumerable: true,
+ get: function () {
+ return _waitUntil.default;
+ }
+ });
+ Object.defineProperty(exports, 'validateErrorHandler', {
+ enumerable: true,
+ get: function () {
+ return _validateErrorHandler.default;
+ }
+ });
+ Object.defineProperty(exports, 'click', {
+ enumerable: true,
+ get: function () {
+ return _click.default;
+ }
+ });
+ Object.defineProperty(exports, 'tap', {
+ enumerable: true,
+ get: function () {
+ return _tap.default;
+ }
+ });
+ Object.defineProperty(exports, 'focus', {
+ enumerable: true,
+ get: function () {
+ return _focus.default;
+ }
+ });
+ Object.defineProperty(exports, 'blur', {
+ enumerable: true,
+ get: function () {
+ return _blur.default;
+ }
+ });
+ Object.defineProperty(exports, 'triggerEvent', {
+ enumerable: true,
+ get: function () {
+ return _triggerEvent.default;
+ }
+ });
+ Object.defineProperty(exports, 'triggerKeyEvent', {
+ enumerable: true,
+ get: function () {
+ return _triggerKeyEvent.default;
+ }
+ });
+ Object.defineProperty(exports, 'fillIn', {
+ enumerable: true,
+ get: function () {
+ return _fillIn.default;
+ }
+ });
+ Object.defineProperty(exports, 'waitFor', {
+ enumerable: true,
+ get: function () {
+ return _waitFor.default;
+ }
+ });
+ Object.defineProperty(exports, 'getRootElement', {
+ enumerable: true,
+ get: function () {
+ return _getRootElement.default;
+ }
+ });
+ Object.defineProperty(exports, 'find', {
+ enumerable: true,
+ get: function () {
+ return _find.default;
+ }
+ });
+ Object.defineProperty(exports, 'findAll', {
+ enumerable: true,
+ get: function () {
+ return _findAll.default;
+ }
+ });
+});
+define("@ember/test-helpers/resolver", ["exports"], function (exports) {
+ "use strict";
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.setResolver = setResolver;
+ exports.getResolver = getResolver;
+ var __resolver__;
+
+ /**
+ Stores the provided resolver instance so that tests being ran can resolve
+ objects in the same way as a normal application.
+
+ Used by `setupContext` and `setupRenderingContext` as a fallback when `setApplication` was _not_ used.
+
+ @public
+ @param {Ember.Resolver} resolver the resolver to be used for testing
+ */
+ function setResolver(resolver) {
+ __resolver__ = resolver;
+ }
+
+ /**
+ Retrieve the resolver instance stored by `setResolver`.
+
+ @public
+ @returns {Ember.Resolver} the previously stored resolver
+ */
+ function getResolver() {
+ return __resolver__;
+ }
+});
+define('@ember/test-helpers/settled', ['exports', '@ember/test-helpers/-utils', '@ember/test-helpers/wait-until'], function (exports, _utils, _waitUntil) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports._teardownAJAXHooks = _teardownAJAXHooks;
+ exports._setupAJAXHooks = _setupAJAXHooks;
+ exports.getSettledState = getSettledState;
+ exports.isSettled = isSettled;
+ exports.default = settled;
+
+
+ // Ember internally tracks AJAX requests in the same way that we do here for
+ // legacy style "acceptance" tests using the `ember-testing.js` asset provided
+ // by emberjs/ember.js itself. When `@ember/test-helpers`'s `settled` utility
+ // is used in a legacy acceptance test context any pending AJAX requests are
+ // not properly considered during the `isSettled` check below.
+ //
+ // This utilizes a local utility method present in Ember since around 2.8.0 to
+ // properly consider pending AJAX requests done within legacy acceptance tests.
+ const _internalPendingRequests = (() => {
+ if (Ember.__loader.registry['ember-testing/test/pending_requests']) {
+ return Ember.__loader.require('ember-testing/test/pending_requests').pendingRequests;
+ }
+
+ return () => 0;
+ })();
+
+ let requests;
+
+ /**
+ @private
+ @returns {number} the count of pending requests
+ */
+ function pendingRequests() {
+ let localRequestsPending = requests !== undefined ? requests.length : 0;
+ let internalRequestsPending = _internalPendingRequests();
+
+ return localRequestsPending + internalRequestsPending;
+ }
+
+ /**
+ @private
+ @param {Event} event (unused)
+ @param {XMLHTTPRequest} xhr the XHR that has initiated a request
+ */
+ function incrementAjaxPendingRequests(event, xhr) {
+ requests.push(xhr);
+ }
+
+ /**
+ @private
+ @param {Event} event (unused)
+ @param {XMLHTTPRequest} xhr the XHR that has initiated a request
+ */
+ function decrementAjaxPendingRequests(event, xhr) {
+ // In most Ember versions to date (current version is 2.16) RSVP promises are
+ // configured to flush in the actions queue of the Ember run loop, however it
+ // is possible that in the future this changes to use "true" micro-task
+ // queues.
+ //
+ // The entire point here, is that _whenever_ promises are resolved will be
+ // before the next run of the JS event loop. Then in the next event loop this
+ // counter will decrement. In the specific case of AJAX, this means that any
+ // promises chained off of `$.ajax` will properly have their `.then` called
+ // _before_ this is decremented (and testing continues)
+ (0, _utils.nextTick)(() => {
+ for (let i = 0; i < requests.length; i++) {
+ if (xhr === requests[i]) {
+ requests.splice(i, 1);
+ }
+ }
+ }, 0);
+ }
+
+ /**
+ Clears listeners that were previously setup for `ajaxSend` and `ajaxComplete`.
+
+ @private
+ */
+ function _teardownAJAXHooks() {
+ if (!Ember.$) {
+ return;
+ }
+
+ Ember.$(document).off('ajaxSend', incrementAjaxPendingRequests);
+ Ember.$(document).off('ajaxComplete', decrementAjaxPendingRequests);
+ }
+
+ /**
+ Sets up listeners for `ajaxSend` and `ajaxComplete`.
+
+ @private
+ */
+ function _setupAJAXHooks() {
+ requests = [];
+
+ if (!Ember.$) {
+ return;
+ }
+
+ Ember.$(document).on('ajaxSend', incrementAjaxPendingRequests);
+ Ember.$(document).on('ajaxComplete', decrementAjaxPendingRequests);
+ }
+
+ let _internalCheckWaiters;
+ if (Ember.__loader.registry['ember-testing/test/waiters']) {
+ _internalCheckWaiters = Ember.__loader.require('ember-testing/test/waiters').checkWaiters;
+ }
+
+ /**
+ @private
+ @returns {boolean} true if waiters are still pending
+ */
+ function checkWaiters() {
+ if (_internalCheckWaiters) {
+ return _internalCheckWaiters();
+ } else if (Ember.Test.waiters) {
+ if (Ember.Test.waiters.any(([context, callback]) => !callback.call(context))) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ Check various settledness metrics, and return an object with the following properties:
+
+ * `hasRunLoop` - Checks if a run-loop has been started. If it has, this will
+ be `true` otherwise it will be `false`.
+ * `hasPendingTimers` - Checks if there are scheduled timers in the run-loop.
+ These pending timers are primarily registered by `Ember.run.schedule`. If
+ there are pending timers, this will be `true`, otherwise `false`.
+ * `hasPendingWaiters` - Checks if any registered test waiters are still
+ pending (e.g. the waiter returns `true`). If there are pending waiters,
+ this will be `true`, otherwise `false`.
+ * `hasPendingRequests` - Checks if there are pending AJAX requests (based on
+ `ajaxSend` / `ajaxComplete` events triggered by `jQuery.ajax`). If there
+ are pending requests, this will be `true`, otherwise `false`.
+ * `pendingRequestCount` - The count of pending AJAX requests.
+
+ @public
+ @returns {Object} object with properties for each of the metrics used to determine settledness
+ */
+ function getSettledState() {
+ let pendingRequestCount = pendingRequests();
+
+ return {
+ hasPendingTimers: Boolean(Ember.run.hasScheduledTimers()),
+ hasRunLoop: Boolean(Ember.run.currentRunLoop),
+ hasPendingWaiters: checkWaiters(),
+ hasPendingRequests: pendingRequestCount > 0,
+ pendingRequestCount
+ };
+ }
+
+ /**
+ Checks various settledness metrics (via `getSettledState()`) to determine if things are settled or not.
+
+ Settled generally means that there are no pending timers, no pending waiters,
+ no pending AJAX requests, and no current run loop. However, new settledness
+ metrics may be added and used as they become available.
+
+ @public
+ @returns {boolean} `true` if settled, `false` otherwise
+ */
+ function isSettled() {
+ let { hasPendingTimers, hasRunLoop, hasPendingRequests, hasPendingWaiters } = getSettledState();
+
+ if (hasPendingTimers || hasRunLoop || hasPendingRequests || hasPendingWaiters) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ Returns a promise that resolves when in a settled state (see `isSettled` for
+ a definition of "settled state").
+
+ @public
+ @returns {Promise<void>} resolves when settled
+ */
+ function settled() {
+ return (0, _waitUntil.default)(isSettled, { timeout: Infinity });
+ }
+});
+define('@ember/test-helpers/setup-application-context', ['exports', '@ember/test-helpers/-utils', '@ember/test-helpers/setup-context', '@ember/test-helpers/has-ember-version', '@ember/test-helpers/settled'], function (exports, _utils, _setupContext, _hasEmberVersion, _settled) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.visit = visit;
+ exports.currentRouteName = currentRouteName;
+ exports.currentURL = currentURL;
+ exports.default = setupApplicationContext;
+
+
+ /**
+ Navigate the application to the provided URL.
+
+ @public
+ @returns {Promise<void>} resolves when settled
+ */
+ function visit() {
+ let context = (0, _setupContext.getContext)();
+ let { owner } = context;
+
+ return (0, _utils.nextTickPromise)().then(() => {
+ return owner.visit(...arguments);
+ }).then(() => {
+ if (EmberENV._APPLICATION_TEMPLATE_WRAPPER !== false) {
+ context.element = document.querySelector('#ember-testing > .ember-view');
+ } else {
+ context.element = document.querySelector('#ember-testing');
+ }
+ }).then(_settled.default);
+ }
+
+ /**
+ @public
+ @returns {string} the currently active route name
+ */
+ /* globals EmberENV */
+ function currentRouteName() {
+ let { owner } = (0, _setupContext.getContext)();
+ let router = owner.lookup('router:main');
+ return Ember.get(router, 'currentRouteName');
+ }
+
+ const HAS_CURRENT_URL_ON_ROUTER = (0, _hasEmberVersion.default)(2, 13);
+
+ /**
+ @public
+ @returns {string} the applications current url
+ */
+ function currentURL() {
+ let { owner } = (0, _setupContext.getContext)();
+ let router = owner.lookup('router:main');
+
+ if (HAS_CURRENT_URL_ON_ROUTER) {
+ return Ember.get(router, 'currentURL');
+ } else {
+ return Ember.get(router, 'location').getURL();
+ }
+ }
+
+ /**
+ Used by test framework addons to setup the provided context for working with
+ an application (e.g. routing).
+
+ `setupContext` must have been ran on the provided context prior to calling
+ `setupApplicatinContext`.
+
+ Sets up the basic framework used by application tests.
+
+ @public
+ @param {Object} context the context to setup
+ @returns {Promise<Object>} resolves with the context that was setup
+ */
+ function setupApplicationContext() {
+ return (0, _utils.nextTickPromise)();
+ }
+});
+define('@ember/test-helpers/setup-context', ['exports', '@ember/test-helpers/build-owner', '@ember/test-helpers/settled', '@ember/test-helpers/global', '@ember/test-helpers/resolver', '@ember/test-helpers/application', '@ember/test-helpers/-utils'], function (exports, _buildOwner, _settled, _global, _resolver, _application, _utils) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.CLEANUP = undefined;
+ exports.setContext = setContext;
+ exports.getContext = getContext;
+ exports.unsetContext = unsetContext;
+ exports.pauseTest = pauseTest;
+ exports.resumeTest = resumeTest;
+
+ exports.default = function (context, options = {}) {
+ Ember.testing = true;
+ setContext(context);
+
+ let contextGuid = Ember.guidFor(context);
+ CLEANUP[contextGuid] = [];
+
+ return (0, _utils.nextTickPromise)().then(() => {
+ let application = (0, _application.getApplication)();
+ if (application) {
+ return application.boot();
+ }
+ }).then(() => {
+ let testElementContainer = document.getElementById('ember-testing-container');
+ let fixtureResetValue = testElementContainer.innerHTML;
+
+ // push this into the final cleanup bucket, to be ran _after_ the owner
+ // is destroyed and settled (e.g. flushed run loops, etc)
+ CLEANUP[contextGuid].push(() => {
+ testElementContainer.innerHTML = fixtureResetValue;
+ });
+
+ let { resolver } = options;
+
+ // This handles precendence, specifying a specific option of
+ // resolver always trumps whatever is auto-detected, then we fallback to
+ // the suite-wide registrations
+ //
+ // At some later time this can be extended to support specifying a custom
+ // engine or application...
+ if (resolver) {
+ return (0, _buildOwner.default)(null, resolver);
+ }
+
+ return (0, _buildOwner.default)((0, _application.getApplication)(), (0, _resolver.getResolver)());
+ }).then(owner => {
+ context.owner = owner;
+
+ context.set = function (key, value) {
+ let ret = Ember.run(function () {
+ return Ember.set(context, key, value);
+ });
+
+ return ret;
+ };
+
+ context.setProperties = function (hash) {
+ let ret = Ember.run(function () {
+ return Ember.setProperties(context, hash);
+ });
+
+ return ret;
+ };
+
+ context.get = function (key) {
+ return Ember.get(context, key);
+ };
+
+ context.getProperties = function (...args) {
+ return Ember.getProperties(context, args);
+ };
+
+ let resume;
+ context.resumeTest = function resumeTest() {
+ (true && !(resume) && Ember.assert('Testing has not been paused. There is nothing to resume.', resume));
+
+ resume();
+ _global.default.resumeTest = resume = undefined;
+ };
+
+ context.pauseTest = function pauseTest() {
+ console.info('Testing paused. Use `resumeTest()` to continue.'); // eslint-disable-line no-console
+
+ return new Ember.RSVP.Promise(resolve => {
+ resume = resolve;
+ _global.default.resumeTest = resumeTest;
+ }, 'TestAdapter paused promise');
+ };
+
+ (0, _settled._setupAJAXHooks)();
+
+ return context;
+ });
+ };
+
+ let __test_context__;
+
+ /**
+ Stores the provided context as the "global testing context".
+
+ Generally setup automatically by `setupContext`.
+
+ @public
+ @param {Object} context the context to use
+ */
+ function setContext(context) {
+ __test_context__ = context;
+ }
+
+ /**
+ Retrive the "global testing context" as stored by `setContext`.
+
+ @public
+ @returns {Object} the previously stored testing context
+ */
+ function getContext() {
+ return __test_context__;
+ }
+
+ /**
+ Clear the "global testing context".
+
+ Generally invoked from `teardownContext`.
+
+ @public
+ */
+ function unsetContext() {
+ __test_context__ = undefined;
+ }
+
+ /**
+ * Returns a promise to be used to pauses the current test (due to being
+ * returned from the test itself). This is useful for debugging while testing
+ * or for test-driving. It allows you to inspect the state of your application
+ * at any point.
+ *
+ * The test framework wrapper (e.g. `ember-qunit` or `ember-mocha`) should
+ * ensure that when `pauseTest()` is used, any framework specific test timeouts
+ * are disabled.
+ *
+ * @public
+ * @returns {Promise<void>} resolves _only_ when `resumeTest()` is invoked
+ * @example <caption>Usage via ember-qunit</caption>
+ *
+ * import { setupRenderingTest } from 'ember-qunit';
+ * import { render, click, pauseTest } from '@ember/test-helpers';
+ *
+ *
+ * module('awesome-sauce', function(hooks) {
+ * setupRenderingTest(hooks);
+ *
+ * test('does something awesome', async function(assert) {
+ * await render(hbs`{{awesome-sauce}}`);
+ *
+ * // added here to visualize / interact with the DOM prior
+ * // to the interaction below
+ * await pauseTest();
+ *
+ * click('.some-selector');
+ *
+ * assert.equal(this.element.textContent, 'this sauce is awesome!');
+ * });
+ * });
+ */
+ function pauseTest() {
+ let context = getContext();
+
+ if (!context || typeof context.pauseTest !== 'function') {
+ throw new Error('Cannot call `pauseTest` without having first called `setupTest` or `setupRenderingTest`.');
+ }
+
+ return context.pauseTest();
+ }
+
+ /**
+ Resumes a test previously paused by `await pauseTest()`.
+
+ @public
+ */
+ function resumeTest() {
+ let context = getContext();
+
+ if (!context || typeof context.resumeTest !== 'function') {
+ throw new Error('Cannot call `resumeTest` without having first called `setupTest` or `setupRenderingTest`.');
+ }
+
+ context.resumeTest();
+ }
+
+ const CLEANUP = exports.CLEANUP = Object.create(null);
+
+ /**
+ Used by test framework addons to setup the provided context for testing.
+
+ Responsible for:
+
+ - sets the "global testing context" to the provided context (`setContext`)
+ - create an owner object and set it on the provided context (e.g. `this.owner`)
+ - setup `this.set`, `this.setProperties`, `this.get`, and `this.getProperties` to the provided context
+ - setting up AJAX listeners
+ - setting up `pauseTest` (also available as `this.pauseTest()`) and `resumeTest` helpers
+
+ @public
+ @param {Object} context the context to setup
+ @param {Object} [options] options used to override defaults
+ @param {Resolver} [options.resolver] a resolver to use for customizing normal resolution
+ @returns {Promise<Object>} resolves with the context that was setup
+ */
+});
+define('@ember/test-helpers/setup-rendering-context', ['exports', '@ember/test-helpers/global', '@ember/test-helpers/setup-context', '@ember/test-helpers/-utils', '@ember/test-helpers/settled', '@ember/test-helpers/dom/get-root-element'], function (exports, _global, _setupContext, _utils, _settled, _getRootElement) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.RENDERING_CLEANUP = undefined;
+ exports.render = render;
+ exports.clearRender = clearRender;
+ exports.default = setupRenderingContext;
+ /* globals EmberENV */
+ const RENDERING_CLEANUP = exports.RENDERING_CLEANUP = Object.create(null);
+ const OUTLET_TEMPLATE = Ember.HTMLBars.template({
+ "id": "gc40spmP",
+ "block": "{\"symbols\":[],\"statements\":[[1,[18,\"outlet\"],false]],\"hasEval\":false}",
+ "meta": {}
+ });
+ const EMPTY_TEMPLATE = Ember.HTMLBars.template({
+ "id": "xOcW61lH",
+ "block": "{\"symbols\":[],\"statements\":[],\"hasEval\":false}",
+ "meta": {}
+ });
+
+ /**
+ @private
+ @param {Ember.ApplicationInstance} owner the current owner instance
+ @returns {Template} a template representing {{outlet}}
+ */
+ function lookupOutletTemplate(owner) {
+ let OutletTemplate = owner.lookup('template:-outlet');
+ if (!OutletTemplate) {
+ owner.register('template:-outlet', OUTLET_TEMPLATE);
+ OutletTemplate = owner.lookup('template:-outlet');
+ }
+
+ return OutletTemplate;
+ }
+
+ /**
+ @private
+ @param {string} [selector] the selector to search for relative to element
+ @returns {jQuery} a jQuery object representing the selector (or element itself if no selector)
+ */
+ function jQuerySelector(selector) {
+ let { element } = (0, _setupContext.getContext)();
+
+ // emulates Ember internal behavor of `this.$` in a component
+ // https://github.com/emberjs/ember.js/blob/v2.5.1/packages/ember-views/lib/views/states/has_element.js#L18
+ return selector ? _global.default.jQuery(selector, element) : _global.default.jQuery(element);
+ }
+
+ let templateId = 0;
+ /**
+ Renders the provided template and appends it to the DOM.
+
+ @public
+ @param {CompiledTemplate} template the template to render
+ @returns {Promise<void>} resolves when settled
+ */
+ function render(template) {
+ let context = (0, _setupContext.getContext)();
+
+ if (!template) {
+ throw new Error('you must pass a template to `render()`');
+ }
+
+ return (0, _utils.nextTickPromise)().then(() => {
+ let { owner } = context;
+
+ let toplevelView = owner.lookup('-top-level-view:main');
+ let OutletTemplate = lookupOutletTemplate(owner);
+ templateId += 1;
+ let templateFullName = `template:-undertest-${templateId}`;
+ owner.register(templateFullName, template);
+
+ let outletState = {
+ render: {
+ owner,
+ into: undefined,
+ outlet: 'main',
+ name: 'application',
+ controller: undefined,
+ ViewClass: undefined,
+ template: OutletTemplate
+ },
+
+ outlets: {
+ main: {
+ render: {
+ owner,
+ into: undefined,
+ outlet: 'main',
+ name: 'index',
+ controller: context,
+ ViewClass: undefined,
+ template: owner.lookup(templateFullName),
+ outlets: {}
+ },
+ outlets: {}
+ }
+ }
+ };
+ toplevelView.setOutletState(outletState);
+
+ // returning settled here because the actual rendering does not happen until
+ // the renderer detects it is dirty (which happens on backburner's end
+ // hook), see the following implementation details:
+ //
+ // * [view:outlet](https://github.com/emberjs/ember.js/blob/f94a4b6aef5b41b96ef2e481f35e07608df01440/packages/ember-glimmer/lib/views/outlet.js#L129-L145) manually dirties its own tag upon `setOutletState`
+ // * [backburner's custom end hook](https://github.com/emberjs/ember.js/blob/f94a4b6aef5b41b96ef2e481f35e07608df01440/packages/ember-glimmer/lib/renderer.js#L145-L159) detects that the current revision of the root is no longer the latest, and triggers a new rendering transaction
+ return (0, _settled.default)();
+ });
+ }
+
+ /**
+ Clears any templates previously rendered. This is commonly used for
+ confirming behavior that is triggered by teardown (e.g.
+ `willDestroyElement`).
+
+ @public
+ @returns {Promise<void>} resolves when settled
+ */
+ function clearRender() {
+ let context = (0, _setupContext.getContext)();
+
+ if (!context || typeof context.clearRender !== 'function') {
+ throw new Error('Cannot call `clearRender` without having first called `setupRenderingContext`.');
+ }
+
+ return render(EMPTY_TEMPLATE);
+ }
+
+ /**
+ Used by test framework addons to setup the provided context for rendering.
+
+ `setupContext` must have been ran on the provided context
+ prior to calling `setupRenderingContext`.
+
+ Responsible for:
+
+ - Setup the basic framework used for rendering by the
+ `render` helper.
+ - Ensuring the event dispatcher is properly setup.
+ - Setting `this.element` to the root element of the testing
+ container (things rendered via `render` will go _into_ this
+ element).
+
+ @public
+ @param {Object} context the context to setup for rendering
+ @returns {Promise<Object>} resolves with the context that was setup
+ */
+ function setupRenderingContext(context) {
+ let contextGuid = Ember.guidFor(context);
+ RENDERING_CLEANUP[contextGuid] = [];
+
+ return (0, _utils.nextTickPromise)().then(() => {
+ let { owner } = context;
+
+ // these methods being placed on the context itself will be deprecated in
+ // a future version (no giant rush) to remove some confusion about which
+ // is the "right" way to things...
+ context.render = render;
+ context.clearRender = clearRender;
+
+ if (_global.default.jQuery) {
+ context.$ = jQuerySelector;
+ }
+
+ // When the host app uses `setApplication` (instead of `setResolver`) the event dispatcher has
+ // already been setup via `applicationInstance.boot()` in `./build-owner`. If using
+ // `setResolver` (instead of `setApplication`) a "mock owner" is created by extending
+ // `Ember._ContainerProxyMixin` and `Ember._RegistryProxyMixin` in this scenario we need to
+ // manually start the event dispatcher.
+ if (owner._emberTestHelpersMockOwner) {
+ let dispatcher = owner.lookup('event_dispatcher:main') || Ember.EventDispatcher.create();
+ dispatcher.setup({}, '#ember-testing');
+ }
+
+ let OutletView = owner.factoryFor ? owner.factoryFor('view:-outlet') : owner._lookupFactory('view:-outlet');
+ let toplevelView = OutletView.create();
+
+ owner.register('-top-level-view:main', {
+ create() {
+ return toplevelView;
+ }
+ });
+
+ // initially render a simple empty template
+ return render(EMPTY_TEMPLATE).then(() => {
+ Ember.run(toplevelView, 'appendTo', (0, _getRootElement.default)());
+
+ return (0, _settled.default)();
+ });
+ }).then(() => {
+ // ensure the element is based on the wrapping toplevel view
+ // Ember still wraps the main application template with a
+ // normal tagged view
+ //
+ // In older Ember versions (2.4) the element itself is not stable,
+ // and therefore we cannot update the `this.element` until after the
+ // rendering is completed
+ if (EmberENV._APPLICATION_TEMPLATE_WRAPPER !== false) {
+ context.element = (0, _getRootElement.default)().querySelector('.ember-view');
+ } else {
+ context.element = (0, _getRootElement.default)();
+ }
+
+ return context;
+ });
+ }
+});
+define('@ember/test-helpers/teardown-application-context', ['exports', '@ember/test-helpers/settled'], function (exports, _settled) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+
+ exports.default = function () {
+ return (0, _settled.default)();
+ };
+});
+define('@ember/test-helpers/teardown-context', ['exports', '@ember/test-helpers/settled', '@ember/test-helpers/setup-context', '@ember/test-helpers/-utils'], function (exports, _settled, _setupContext, _utils) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = teardownContext;
+
+
+ /**
+ Used by test framework addons to tear down the provided context after testing is completed.
+
+ Responsible for:
+
+ - un-setting the "global testing context" (`unsetContext`)
+ - destroy the contexts owner object
+ - remove AJAX listeners
+
+ @public
+ @param {Object} context the context to setup
+ @returns {Promise<void>} resolves when settled
+ */
+ function teardownContext(context) {
+ return (0, _utils.nextTickPromise)().then(() => {
+ let { owner } = context;
+
+ (0, _settled._teardownAJAXHooks)();
+
+ Ember.run(owner, 'destroy');
+ Ember.testing = false;
+
+ (0, _setupContext.unsetContext)();
+
+ return (0, _settled.default)();
+ }).finally(() => {
+ let contextGuid = Ember.guidFor(context);
+
+ (0, _utils.runDestroyablesFor)(_setupContext.CLEANUP, contextGuid);
+
+ return (0, _settled.default)();
+ });
+ }
+});
+define('@ember/test-helpers/teardown-rendering-context', ['exports', '@ember/test-helpers/setup-rendering-context', '@ember/test-helpers/-utils', '@ember/test-helpers/settled'], function (exports, _setupRenderingContext, _utils, _settled) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = teardownRenderingContext;
+
+
+ /**
+ Used by test framework addons to tear down the provided context after testing is completed.
+
+ Responsible for:
+
+ - resetting the `ember-testing-container` to its original state (the value
+ when `setupRenderingContext` was called).
+
+ @public
+ @param {Object} context the context to setup
+ @returns {Promise<void>} resolves when settled
+ */
+ function teardownRenderingContext(context) {
+ return (0, _utils.nextTickPromise)().then(() => {
+ let contextGuid = Ember.guidFor(context);
+
+ (0, _utils.runDestroyablesFor)(_setupRenderingContext.RENDERING_CLEANUP, contextGuid);
+
+ return (0, _settled.default)();
+ });
+ }
+});
+define('@ember/test-helpers/validate-error-handler', ['exports'], function (exports) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = validateErrorHandler;
+
+ const VALID = Object.freeze({ isValid: true, message: null });
+ const INVALID = Object.freeze({
+ isValid: false,
+ message: 'error handler should have re-thrown the provided error'
+ });
+
+ /**
+ * Validate the provided error handler to confirm that it properly re-throws
+ * errors when `Ember.testing` is true.
+ *
+ * This is intended to be used by test framework hosts (or other libraries) to
+ * ensure that `Ember.onerror` is properly configured. Without a check like
+ * this, `Ember.onerror` could _easily_ swallow all errors and make it _seem_
+ * like everything is just fine (and have green tests) when in reality
+ * everything is on fire...
+ *
+ * @public
+ * @param {Function} [callback=Ember.onerror] the callback to validate
+ * @returns {Object} object with `isValid` and `message`
+ *
+ * @example <caption>Example implementation for `ember-qunit`</caption>
+ *
+ * import { validateErrorHandler } from '@ember/test-helpers';
+ *
+ * test('Ember.onerror is functioning properly', function(assert) {
+ * let result = validateErrorHandler();
+ * assert.ok(result.isValid, result.message);
+ * });
+ */
+ function validateErrorHandler(callback = Ember.onerror) {
+ if (callback === undefined || callback === null) {
+ return VALID;
+ }
+
+ let error = new Error('Error handler validation error!');
+
+ let originalEmberTesting = Ember.testing;
+ Ember.testing = true;
+ try {
+ callback(error);
+ } catch (e) {
+ if (e === error) {
+ return VALID;
+ }
+ } finally {
+ Ember.testing = originalEmberTesting;
+ }
+
+ return INVALID;
+ }
+});
+define('@ember/test-helpers/wait-until', ['exports', '@ember/test-helpers/-utils'], function (exports, _utils) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = waitUntil;
+
+
+ const TIMEOUTS = [0, 1, 2, 5, 7];
+ const MAX_TIMEOUT = 10;
+
+ /**
+ Wait for the provided callback to return a truthy value.
+
+ This does not leverage `settled()`, and as such can be used to manage async
+ while _not_ settled (e.g. "loading" or "pending" states).
+
+ @public
+ @param {Function} callback the callback to use for testing when waiting should stop
+ @param {Object} [options] options used to override defaults
+ @param {number} [options.timeout=1000] the maximum amount of time to wait
+ @returns {Promise} resolves with the callback value when it returns a truthy value
+ */
+ function waitUntil(callback, options = {}) {
+ let timeout = 'timeout' in options ? options.timeout : 1000;
+
+ // creating this error eagerly so it has the proper invocation stack
+ let waitUntilTimedOut = new Error('waitUntil timed out');
+
+ return new Ember.RSVP.Promise(function (resolve, reject) {
+ let time = 0;
+
+ // eslint-disable-next-line require-jsdoc
+ function scheduleCheck(timeoutsIndex) {
+ let interval = TIMEOUTS[timeoutsIndex];
+ if (interval === undefined) {
+ interval = MAX_TIMEOUT;
+ }
+
+ (0, _utils.futureTick)(function () {
+ time += interval;
+
+ let value;
+ try {
+ value = callback();
+ } catch (error) {
+ reject(error);
+ }
+
+ if (value) {
+ resolve(value);
+ } else if (time < timeout) {
+ scheduleCheck(timeoutsIndex + 1);
+ } else {
+ reject(waitUntilTimedOut);
+ }
+ }, interval);
+ }
+
+ scheduleCheck(0);
+ });
+ }
+});
+define('ember-cli-qunit', ['exports', 'ember-qunit'], function (exports, _emberQunit) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ Object.defineProperty(exports, 'TestLoader', {
+ enumerable: true,
+ get: function () {
+ return _emberQunit.TestLoader;
+ }
+ });
+ Object.defineProperty(exports, 'setupTestContainer', {
+ enumerable: true,
+ get: function () {
+ return _emberQunit.setupTestContainer;
+ }
+ });
+ Object.defineProperty(exports, 'loadTests', {
+ enumerable: true,
+ get: function () {
+ return _emberQunit.loadTests;
+ }
+ });
+ Object.defineProperty(exports, 'startTests', {
+ enumerable: true,
+ get: function () {
+ return _emberQunit.startTests;
+ }
+ });
+ Object.defineProperty(exports, 'setupTestAdapter', {
+ enumerable: true,
+ get: function () {
+ return _emberQunit.setupTestAdapter;
+ }
+ });
+ Object.defineProperty(exports, 'start', {
+ enumerable: true,
+ get: function () {
+ return _emberQunit.start;
+ }
+ });
+});
+define('ember-cli-test-loader/test-support/index', ['exports'], function (exports) {
+ /* globals requirejs, require */
+ "use strict";
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.addModuleIncludeMatcher = addModuleIncludeMatcher;
+ exports.addModuleExcludeMatcher = addModuleExcludeMatcher;
+ let moduleIncludeMatchers = [];
+ let moduleExcludeMatchers = [];
+
+ function addModuleIncludeMatcher(fn) {
+ moduleIncludeMatchers.push(fn);
+ }
+
+ function addModuleExcludeMatcher(fn) {
+ moduleExcludeMatchers.push(fn);
+ }
+
+ function checkMatchers(matchers, moduleName) {
+ return matchers.some(matcher => matcher(moduleName));
+ }
+
+ class TestLoader {
+ static load() {
+ new TestLoader().loadModules();
+ }
+
+ constructor() {
+ this._didLogMissingUnsee = false;
+ }
+
+ shouldLoadModule(moduleName) {
+ return moduleName.match(/[-_]test$/);
+ }
+
+ listModules() {
+ return Object.keys(requirejs.entries);
+ }
+
+ listTestModules() {
+ let moduleNames = this.listModules();
+ let testModules = [];
+ let moduleName;
+
+ for (let i = 0; i < moduleNames.length; i++) {
+ moduleName = moduleNames[i];
+
+ if (checkMatchers(moduleExcludeMatchers, moduleName)) {
+ continue;
+ }
+
+ if (checkMatchers(moduleIncludeMatchers, moduleName) || this.shouldLoadModule(moduleName)) {
+ testModules.push(moduleName);
+ }
+ }
+
+ return testModules;
+ }
+
+ loadModules() {
+ let testModules = this.listTestModules();
+ let testModule;
+
+ for (let i = 0; i < testModules.length; i++) {
+ testModule = testModules[i];
+ this.require(testModule);
+ this.unsee(testModule);
+ }
+ }
+
+ require(moduleName) {
+ try {
+ require(moduleName);
+ } catch (e) {
+ this.moduleLoadFailure(moduleName, e);
+ }
+ }
+
+ unsee(moduleName) {
+ if (typeof require.unsee === 'function') {
+ require.unsee(moduleName);
+ } else if (!this._didLogMissingUnsee) {
+ this._didLogMissingUnsee = true;
+ if (typeof console !== 'undefined') {
+ console.warn('unable to require.unsee, please upgrade loader.js to >= v3.3.0');
+ }
+ }
+ }
+
+ moduleLoadFailure(moduleName, error) {
+ console.error('Error loading: ' + moduleName, error.stack);
+ }
+ }exports.default = TestLoader;
+ ;
+});
+define('ember-qunit/adapter', ['exports', 'qunit', '@ember/test-helpers/has-ember-version'], function (exports, _qunit, _hasEmberVersion) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+
+
+ function unhandledRejectionAssertion(current, error) {
+ let message, source;
+
+ if (typeof error === 'object' && error !== null) {
+ message = error.message;
+ source = error.stack;
+ } else if (typeof error === 'string') {
+ message = error;
+ source = 'unknown source';
+ } else {
+ message = 'unhandledRejection occured, but it had no message';
+ source = 'unknown source';
+ }
+
+ current.assert.pushResult({
+ result: false,
+ actual: false,
+ expected: true,
+ message: message,
+ source: source
+ });
+ }
+
+ let Adapter = Ember.Test.Adapter.extend({
+ init() {
+ this.doneCallbacks = [];
+ },
+
+ asyncStart() {
+ this.doneCallbacks.push(_qunit.default.config.current ? _qunit.default.config.current.assert.async() : null);
+ },
+
+ asyncEnd() {
+ let done = this.doneCallbacks.pop();
+ // This can be null if asyncStart() was called outside of a test
+ if (done) {
+ done();
+ }
+ },
+
+ // clobber default implementation of `exception` will be added back for Ember
+ // < 2.17 just below...
+ exception: null
+ });
+
+ // Ember 2.17 and higher do not require the test adapter to have an `exception`
+ // method When `exception` is not present, the unhandled rejection is
+ // automatically re-thrown and will therefore hit QUnit's own global error
+ // handler (therefore appropriately causing test failure)
+ if (!(0, _hasEmberVersion.default)(2, 17)) {
+ Adapter = Adapter.extend({
+ exception(error) {
+ unhandledRejectionAssertion(_qunit.default.config.current, error);
+ }
+ });
+ }
+
+ exports.default = Adapter;
+});
+define('ember-qunit/index', ['exports', 'ember-qunit/legacy-2-x/module-for', 'ember-qunit/legacy-2-x/module-for-component', 'ember-qunit/legacy-2-x/module-for-model', 'ember-qunit/adapter', 'qunit', 'ember-qunit/test-loader', '@ember/test-helpers'], function (exports, _moduleFor, _moduleForComponent, _moduleForModel, _adapter, _qunit, _testLoader, _testHelpers) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.loadTests = exports.todo = exports.only = exports.skip = exports.test = exports.module = exports.QUnitAdapter = exports.moduleForModel = exports.moduleForComponent = exports.moduleFor = undefined;
+ Object.defineProperty(exports, 'moduleFor', {
+ enumerable: true,
+ get: function () {
+ return _moduleFor.default;
+ }
+ });
+ Object.defineProperty(exports, 'moduleForComponent', {
+ enumerable: true,
+ get: function () {
+ return _moduleForComponent.default;
+ }
+ });
+ Object.defineProperty(exports, 'moduleForModel', {
+ enumerable: true,
+ get: function () {
+ return _moduleForModel.default;
+ }
+ });
+ Object.defineProperty(exports, 'QUnitAdapter', {
+ enumerable: true,
+ get: function () {
+ return _adapter.default;
+ }
+ });
+ Object.defineProperty(exports, 'module', {
+ enumerable: true,
+ get: function () {
+ return _qunit.module;
+ }
+ });
+ Object.defineProperty(exports, 'test', {
+ enumerable: true,
+ get: function () {
+ return _qunit.test;
+ }
+ });
+ Object.defineProperty(exports, 'skip', {
+ enumerable: true,
+ get: function () {
+ return _qunit.skip;
+ }
+ });
+ Object.defineProperty(exports, 'only', {
+ enumerable: true,
+ get: function () {
+ return _qunit.only;
+ }
+ });
+ Object.defineProperty(exports, 'todo', {
+ enumerable: true,
+ get: function () {
+ return _qunit.todo;
+ }
+ });
+ Object.defineProperty(exports, 'loadTests', {
+ enumerable: true,
+ get: function () {
+ return _testLoader.loadTests;
+ }
+ });
+ exports.setResolver = setResolver;
+ exports.render = render;
+ exports.clearRender = clearRender;
+ exports.settled = settled;
+ exports.pauseTest = pauseTest;
+ exports.resumeTest = resumeTest;
+ exports.setupTest = setupTest;
+ exports.setupRenderingTest = setupRenderingTest;
+ exports.setupApplicationTest = setupApplicationTest;
+ exports.setupTestContainer = setupTestContainer;
+ exports.startTests = startTests;
+ exports.setupTestAdapter = setupTestAdapter;
+ exports.setupEmberTesting = setupEmberTesting;
+ exports.setupEmberOnerrorValidation = setupEmberOnerrorValidation;
+ exports.start = start;
+ function setResolver() {
+ (true && !(false) && Ember.deprecate('`setResolver` should be imported from `@ember/test-helpers`, but was imported from `ember-qunit`', false, {
+ id: 'ember-qunit.deprecated-reexports.setResolver',
+ until: '4.0.0'
+ }));
+
+
+ return (0, _testHelpers.setResolver)(...arguments);
+ }
+
+ function render() {
+ (true && !(false) && Ember.deprecate('`render` should be imported from `@ember/test-helpers`, but was imported from `ember-qunit`', false, {
+ id: 'ember-qunit.deprecated-reexports.render',
+ until: '4.0.0'
+ }));
+
+
+ return (0, _testHelpers.render)(...arguments);
+ }
+
+ function clearRender() {
+ (true && !(false) && Ember.deprecate('`clearRender` should be imported from `@ember/test-helpers`, but was imported from `ember-qunit`', false, {
+ id: 'ember-qunit.deprecated-reexports.clearRender',
+ until: '4.0.0'
+ }));
+
+
+ return (0, _testHelpers.clearRender)(...arguments);
+ }
+
+ function settled() {
+ (true && !(false) && Ember.deprecate('`settled` should be imported from `@ember/test-helpers`, but was imported from `ember-qunit`', false, {
+ id: 'ember-qunit.deprecated-reexports.settled',
+ until: '4.0.0'
+ }));
+
+
+ return (0, _testHelpers.settled)(...arguments);
+ }
+
+ function pauseTest() {
+ (true && !(false) && Ember.deprecate('`pauseTest` should be imported from `@ember/test-helpers`, but was imported from `ember-qunit`', false, {
+ id: 'ember-qunit.deprecated-reexports.pauseTest',
+ until: '4.0.0'
+ }));
+
+
+ return (0, _testHelpers.pauseTest)(...arguments);
+ }
+
+ function resumeTest() {
+ (true && !(false) && Ember.deprecate('`resumeTest` should be imported from `@ember/test-helpers`, but was imported from `ember-qunit`', false, {
+ id: 'ember-qunit.deprecated-reexports.resumeTest',
+ until: '4.0.0'
+ }));
+
+
+ return (0, _testHelpers.resumeTest)(...arguments);
+ }
+
+ function setupTest(hooks, options) {
+ hooks.beforeEach(function (assert) {
+ return (0, _testHelpers.setupContext)(this, options).then(() => {
+ let originalPauseTest = this.pauseTest;
+ this.pauseTest = function QUnit_pauseTest() {
+ assert.timeout(-1); // prevent the test from timing out
+
+ return originalPauseTest.call(this);
+ };
+ });
+ });
+
+ hooks.afterEach(function () {
+ return (0, _testHelpers.teardownContext)(this);
+ });
+ }
+
+ function setupRenderingTest(hooks, options) {
+ setupTest(hooks, options);
+
+ hooks.beforeEach(function () {
+ return (0, _testHelpers.setupRenderingContext)(this);
+ });
+
+ hooks.afterEach(function () {
+ return (0, _testHelpers.teardownRenderingContext)(this);
+ });
+ }
+
+ function setupApplicationTest(hooks, options) {
+ setupTest(hooks, options);
+
+ hooks.beforeEach(function () {
+ return (0, _testHelpers.setupApplicationContext)(this);
+ });
+
+ hooks.afterEach(function () {
+ return (0, _testHelpers.teardownApplicationContext)(this);
+ });
+ }
+
+ /**
+ Uses current URL configuration to setup the test container.
+
+ * If `?nocontainer` is set, the test container will be hidden.
+ * If `?dockcontainer` or `?devmode` are set the test container will be
+ absolutely positioned.
+ * If `?devmode` is set, the test container will be made full screen.
+
+ @method setupTestContainer
+ */
+ function setupTestContainer() {
+ let testContainer = document.getElementById('ember-testing-container');
+ if (!testContainer) {
+ return;
+ }
+
+ let params = _qunit.default.urlParams;
+
+ let containerVisibility = params.nocontainer ? 'hidden' : 'visible';
+ let containerPosition = params.dockcontainer || params.devmode ? 'fixed' : 'relative';
+
+ if (params.devmode) {
+ testContainer.className = ' full-screen';
+ }
+
+ testContainer.style.visibility = containerVisibility;
+ testContainer.style.position = containerPosition;
+
+ let qunitContainer = document.getElementById('qunit');
+ if (params.dockcontainer) {
+ qunitContainer.style.marginBottom = window.getComputedStyle(testContainer).height;
+ }
+ }
+
+ /**
+ Instruct QUnit to start the tests.
+ @method startTests
+ */
+ function startTests() {
+ _qunit.default.start();
+ }
+
+ /**
+ Sets up the `Ember.Test` adapter for usage with QUnit 2.x.
+
+ @method setupTestAdapter
+ */
+ function setupTestAdapter() {
+ Ember.Test.adapter = _adapter.default.create();
+ }
+
+ /**
+ Ensures that `Ember.testing` is set to `true` before each test begins
+ (including `before` / `beforeEach`), and reset to `false` after each test is
+ completed. This is done via `QUnit.testStart` and `QUnit.testDone`.
+
+ */
+ function setupEmberTesting() {
+ _qunit.default.testStart(() => {
+ Ember.testing = true;
+ });
+
+ _qunit.default.testDone(() => {
+ Ember.testing = false;
+ });
+ }
+
+ /**
+ Ensures that `Ember.onerror` (if present) is properly configured to re-throw
+ errors that occur while `Ember.testing` is `true`.
+ */
+ function setupEmberOnerrorValidation() {
+ _qunit.default.module('ember-qunit: Ember.onerror validation', function () {
+ _qunit.default.test('Ember.onerror is functioning properly', function (assert) {
+ assert.expect(1);
+ let result = (0, _testHelpers.validateErrorHandler)();
+ assert.ok(result.isValid, `Ember.onerror handler with invalid testing behavior detected. An Ember.onerror handler _must_ rethrow exceptions when \`Ember.testing\` is \`true\` or the test suite is unreliable. See https://git.io/vbine for more details.`);
+ });
+ });
+ }
+
+ /**
+ @method start
+ @param {Object} [options] Options to be used for enabling/disabling behaviors
+ @param {Boolean} [options.loadTests] If `false` tests will not be loaded automatically.
+ @param {Boolean} [options.setupTestContainer] If `false` the test container will not
+ be setup based on `devmode`, `dockcontainer`, or `nocontainer` URL params.
+ @param {Boolean} [options.startTests] If `false` tests will not be automatically started
+ (you must run `QUnit.start()` to kick them off).
+ @param {Boolean} [options.setupTestAdapter] If `false` the default Ember.Test adapter will
+ not be updated.
+ @param {Boolean} [options.setupEmberTesting] `false` opts out of the
+ default behavior of setting `Ember.testing` to `true` before all tests and
+ back to `false` after each test will.
+ @param {Boolean} [options.setupEmberOnerrorValidation] If `false` validation
+ of `Ember.onerror` will be disabled.
+ */
+ function start(options = {}) {
+ if (options.loadTests !== false) {
+ (0, _testLoader.loadTests)();
+ }
+
+ if (options.setupTestContainer !== false) {
+ setupTestContainer();
+ }
+
+ if (options.setupTestAdapter !== false) {
+ setupTestAdapter();
+ }
+
+ if (options.setupEmberTesting !== false) {
+ setupEmberTesting();
+ }
+
+ if (options.setupEmberOnerrorValidation !== false) {
+ setupEmberOnerrorValidation();
+ }
+
+ if (options.startTests !== false) {
+ startTests();
+ }
+ }
+});
+define('ember-qunit/legacy-2-x/module-for-component', ['exports', 'ember-qunit/legacy-2-x/qunit-module', 'ember-test-helpers'], function (exports, _qunitModule, _emberTestHelpers) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = moduleForComponent;
+ function moduleForComponent(name, description, callbacks) {
+ (0, _qunitModule.createModule)(_emberTestHelpers.TestModuleForComponent, name, description, callbacks);
+ }
+});
+define('ember-qunit/legacy-2-x/module-for-model', ['exports', 'ember-qunit/legacy-2-x/qunit-module', 'ember-test-helpers'], function (exports, _qunitModule, _emberTestHelpers) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = moduleForModel;
+ function moduleForModel(name, description, callbacks) {
+ (0, _qunitModule.createModule)(_emberTestHelpers.TestModuleForModel, name, description, callbacks);
+ }
+});
+define('ember-qunit/legacy-2-x/module-for', ['exports', 'ember-qunit/legacy-2-x/qunit-module', 'ember-test-helpers'], function (exports, _qunitModule, _emberTestHelpers) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = moduleFor;
+ function moduleFor(name, description, callbacks) {
+ (0, _qunitModule.createModule)(_emberTestHelpers.TestModule, name, description, callbacks);
+ }
+});
+define('ember-qunit/legacy-2-x/qunit-module', ['exports', 'qunit'], function (exports, _qunit) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.createModule = createModule;
+
+
+ function noop() {}
+
+ function callbackFor(name, callbacks) {
+ if (typeof callbacks !== 'object') {
+ return noop;
+ }
+ if (!callbacks) {
+ return noop;
+ }
+
+ var callback = noop;
+
+ if (callbacks[name]) {
+ callback = callbacks[name];
+ delete callbacks[name];
+ }
+
+ return callback;
+ }
+
+ function createModule(Constructor, name, description, callbacks) {
+ if (!callbacks && typeof description === 'object') {
+ callbacks = description;
+ description = name;
+ }
+
+ var before = callbackFor('before', callbacks);
+ var beforeEach = callbackFor('beforeEach', callbacks);
+ var afterEach = callbackFor('afterEach', callbacks);
+ var after = callbackFor('after', callbacks);
+
+ var module;
+ var moduleName = typeof description === 'string' ? description : name;
+
+ (0, _qunit.module)(moduleName, {
+ before() {
+ // storing this in closure scope to avoid exposing these
+ // private internals to the test context
+ module = new Constructor(name, description, callbacks);
+ return before.apply(this, arguments);
+ },
+
+ beforeEach() {
+ // provide the test context to the underlying module
+ module.setContext(this);
+
+ return module.setup(...arguments).then(() => {
+ return beforeEach.apply(this, arguments);
+ });
+ },
+
+ afterEach() {
+ let result = afterEach.apply(this, arguments);
+ return Ember.RSVP.resolve(result).then(() => module.teardown(...arguments));
+ },
+
+ after() {
+ try {
+ return after.apply(this, arguments);
+ } finally {
+ after = afterEach = before = beforeEach = callbacks = module = null;
+ }
+ }
+ });
+ }
+});
+define('ember-qunit/test-loader', ['exports', 'qunit', 'ember-cli-test-loader/test-support/index'], function (exports, _qunit, _index) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.TestLoader = undefined;
+ exports.loadTests = loadTests;
+
+
+ (0, _index.addModuleExcludeMatcher)(function (moduleName) {
+ return _qunit.default.urlParams.nolint && moduleName.match(/\.(jshint|lint-test)$/);
+ });
+
+ (0, _index.addModuleIncludeMatcher)(function (moduleName) {
+ return moduleName.match(/\.jshint$/);
+ });
+
+ let moduleLoadFailures = [];
+
+ _qunit.default.done(function () {
+ if (moduleLoadFailures.length) {
+ throw new Error('\n' + moduleLoadFailures.join('\n'));
+ }
+ });
+
+ class TestLoader extends _index.default {
+ moduleLoadFailure(moduleName, error) {
+ moduleLoadFailures.push(error);
+
+ _qunit.default.module('TestLoader Failures');
+ _qunit.default.test(moduleName + ': could not be loaded', function () {
+ throw error;
+ });
+ }
+ }
+
+ exports.TestLoader = TestLoader;
+ /**
+ Load tests following the default patterns:
+
+ * The module name ends with `-test`
+ * The module name ends with `.jshint`
+
+ Excludes tests that match the following
+ patterns when `?nolint` URL param is set:
+
+ * The module name ends with `.jshint`
+ * The module name ends with `-lint-test`
+
+ @method loadTests
+ */
+ function loadTests() {
+ new TestLoader().loadModules();
+ }
+});
+define('ember-test-helpers/has-ember-version', ['exports', '@ember/test-helpers/has-ember-version'], function (exports, _hasEmberVersion) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function () {
+ return _hasEmberVersion.default;
+ }
+ });
+});
+define('ember-test-helpers/index', ['exports', '@ember/test-helpers', 'ember-test-helpers/legacy-0-6-x/test-module', 'ember-test-helpers/legacy-0-6-x/test-module-for-acceptance', 'ember-test-helpers/legacy-0-6-x/test-module-for-component', 'ember-test-helpers/legacy-0-6-x/test-module-for-model'], function (exports, _testHelpers, _testModule, _testModuleForAcceptance, _testModuleForComponent, _testModuleForModel) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ Object.keys(_testHelpers).forEach(function (key) {
+ if (key === "default" || key === "__esModule") return;
+ Object.defineProperty(exports, key, {
+ enumerable: true,
+ get: function () {
+ return _testHelpers[key];
+ }
+ });
+ });
+ Object.defineProperty(exports, 'TestModule', {
+ enumerable: true,
+ get: function () {
+ return _testModule.default;
+ }
+ });
+ Object.defineProperty(exports, 'TestModuleForAcceptance', {
+ enumerable: true,
+ get: function () {
+ return _testModuleForAcceptance.default;
+ }
+ });
+ Object.defineProperty(exports, 'TestModuleForComponent', {
+ enumerable: true,
+ get: function () {
+ return _testModuleForComponent.default;
+ }
+ });
+ Object.defineProperty(exports, 'TestModuleForModel', {
+ enumerable: true,
+ get: function () {
+ return _testModuleForModel.default;
+ }
+ });
+});
+define('ember-test-helpers/legacy-0-6-x/-legacy-overrides', ['exports', 'ember-test-helpers/has-ember-version'], function (exports, _hasEmberVersion) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.preGlimmerSetupIntegrationForComponent = preGlimmerSetupIntegrationForComponent;
+ function preGlimmerSetupIntegrationForComponent() {
+ var module = this;
+ var context = this.context;
+
+ this.actionHooks = {};
+
+ context.dispatcher = this.container.lookup('event_dispatcher:main') || Ember.EventDispatcher.create();
+ context.dispatcher.setup({}, '#ember-testing');
+ context.actions = module.actionHooks;
+
+ (this.registry || this.container).register('component:-test-holder', Ember.Component.extend());
+
+ context.render = function (template) {
+ // in case `this.render` is called twice, make sure to teardown the first invocation
+ module.teardownComponent();
+
+ if (!template) {
+ throw new Error('in a component integration test you must pass a template to `render()`');
+ }
+ if (Ember.isArray(template)) {
+ template = template.join('');
+ }
+ if (typeof template === 'string') {
+ template = Ember.Handlebars.compile(template);
+ }
+ module.component = module.container.lookupFactory('component:-test-holder').create({
+ layout: template
+ });
+
+ module.component.set('context', context);
+ module.component.set('controller', context);
+
+ Ember.run(function () {
+ module.component.appendTo('#ember-testing');
+ });
+
+ context._element = module.component.element;
+ };
+
+ context.$ = function () {
+ return module.component.$.apply(module.component, arguments);
+ };
+
+ context.set = function (key, value) {
+ var ret = Ember.run(function () {
+ return Ember.set(context, key, value);
+ });
+
+ if ((0, _hasEmberVersion.default)(2, 0)) {
+ return ret;
+ }
+ };
+
+ context.setProperties = function (hash) {
+ var ret = Ember.run(function () {
+ return Ember.setProperties(context, hash);
+ });
+
+ if ((0, _hasEmberVersion.default)(2, 0)) {
+ return ret;
+ }
+ };
+
+ context.get = function (key) {
+ return Ember.get(context, key);
+ };
+
+ context.getProperties = function () {
+ var args = Array.prototype.slice.call(arguments);
+ return Ember.getProperties(context, args);
+ };
+
+ context.on = function (actionName, handler) {
+ module.actionHooks[actionName] = handler;
+ };
+
+ context.send = function (actionName) {
+ var hook = module.actionHooks[actionName];
+ if (!hook) {
+ throw new Error('integration testing template received unexpected action ' + actionName);
+ }
+ hook.apply(module, Array.prototype.slice.call(arguments, 1));
+ };
+
+ context.clearRender = function () {
+ module.teardownComponent();
+ };
+ }
+});
+define('ember-test-helpers/legacy-0-6-x/abstract-test-module', ['exports', 'ember-test-helpers/legacy-0-6-x/ext/rsvp', '@ember/test-helpers/settled', '@ember/test-helpers'], function (exports, _rsvp, _settled, _testHelpers) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+
+
+ // calling this `merge` here because we cannot
+ // actually assume it is like `Object.assign`
+ // with > 2 args
+ const merge = Ember.assign || Ember.merge;
+
+ exports.default = class {
+ constructor(name, options) {
+ this.context = undefined;
+ this.name = name;
+ this.callbacks = options || {};
+
+ this.initSetupSteps();
+ this.initTeardownSteps();
+ }
+
+ setup(assert) {
+ Ember.testing = true;
+ return this.invokeSteps(this.setupSteps, this, assert).then(() => {
+ this.contextualizeCallbacks();
+ return this.invokeSteps(this.contextualizedSetupSteps, this.context, assert);
+ });
+ }
+
+ teardown(assert) {
+ return this.invokeSteps(this.contextualizedTeardownSteps, this.context, assert).then(() => {
+ return this.invokeSteps(this.teardownSteps, this, assert);
+ }).then(() => {
+ this.cache = null;
+ this.cachedCalls = null;
+ }).finally(function () {
+ Ember.testing = false;
+ });
+ }
+
+ initSetupSteps() {
+ this.setupSteps = [];
+ this.contextualizedSetupSteps = [];
+
+ if (this.callbacks.beforeSetup) {
+ this.setupSteps.push(this.callbacks.beforeSetup);
+ delete this.callbacks.beforeSetup;
+ }
+
+ this.setupSteps.push(this.setupContext);
+ this.setupSteps.push(this.setupTestElements);
+ this.setupSteps.push(this.setupAJAXListeners);
+ this.setupSteps.push(this.setupPromiseListeners);
+
+ if (this.callbacks.setup) {
+ this.contextualizedSetupSteps.push(this.callbacks.setup);
+ delete this.callbacks.setup;
+ }
+ }
+
+ invokeSteps(steps, context, assert) {
+ steps = steps.slice();
+
+ function nextStep() {
+ var step = steps.shift();
+ if (step) {
+ // guard against exceptions, for example missing components referenced from needs.
+ return new Ember.RSVP.Promise(resolve => {
+ resolve(step.call(context, assert));
+ }).then(nextStep);
+ } else {
+ return Ember.RSVP.resolve();
+ }
+ }
+ return nextStep();
+ }
+
+ contextualizeCallbacks() {}
+
+ initTeardownSteps() {
+ this.teardownSteps = [];
+ this.contextualizedTeardownSteps = [];
+
+ if (this.callbacks.teardown) {
+ this.contextualizedTeardownSteps.push(this.callbacks.teardown);
+ delete this.callbacks.teardown;
+ }
+
+ this.teardownSteps.push(this.teardownContext);
+ this.teardownSteps.push(this.teardownTestElements);
+ this.teardownSteps.push(this.teardownAJAXListeners);
+ this.teardownSteps.push(this.teardownPromiseListeners);
+
+ if (this.callbacks.afterTeardown) {
+ this.teardownSteps.push(this.callbacks.afterTeardown);
+ delete this.callbacks.afterTeardown;
+ }
+ }
+
+ setupTestElements() {
+ let testElementContainer = document.querySelector('#ember-testing-container');
+ if (!testElementContainer) {
+ testElementContainer = document.createElement('div');
+ testElementContainer.setAttribute('id', 'ember-testing-container');
+ document.body.appendChild(testElementContainer);
+ }
+
+ let testEl = document.querySelector('#ember-testing');
+ if (!testEl) {
+ let element = document.createElement('div');
+ element.setAttribute('id', 'ember-testing');
+
+ testElementContainer.appendChild(element);
+ this.fixtureResetValue = '';
+ } else {
+ this.fixtureResetValue = testElementContainer.innerHTML;
+ }
+ }
+
+ setupContext(options) {
+ let context = this.getContext();
+
+ merge(context, {
+ dispatcher: null,
+ inject: {}
+ });
+ merge(context, options);
+
+ this.setToString();
+ (0, _testHelpers.setContext)(context);
+ this.context = context;
+ }
+
+ setContext(context) {
+ this.context = context;
+ }
+
+ getContext() {
+ if (this.context) {
+ return this.context;
+ }
+
+ return this.context = (0, _testHelpers.getContext)() || {};
+ }
+
+ setToString() {
+ this.context.toString = () => {
+ if (this.subjectName) {
+ return `test context for: ${this.subjectName}`;
+ }
+
+ if (this.name) {
+ return `test context for: ${this.name}`;
+ }
+ };
+ }
+
+ setupAJAXListeners() {
+ (0, _settled._setupAJAXHooks)();
+ }
+
+ teardownAJAXListeners() {
+ (0, _settled._teardownAJAXHooks)();
+ }
+
+ setupPromiseListeners() {
+ (0, _rsvp._setupPromiseListeners)();
+ }
+
+ teardownPromiseListeners() {
+ (0, _rsvp._teardownPromiseListeners)();
+ }
+
+ teardownTestElements() {
+ document.getElementById('ember-testing-container').innerHTML = this.fixtureResetValue;
+
+ // Ember 2.0.0 removed Ember.View as public API, so only do this when
+ // Ember.View is present
+ if (Ember.View && Ember.View.views) {
+ Ember.View.views = {};
+ }
+ }
+
+ teardownContext() {
+ var context = this.context;
+ this.context = undefined;
+ (0, _testHelpers.unsetContext)();
+
+ if (context && context.dispatcher && !context.dispatcher.isDestroyed) {
+ Ember.run(function () {
+ context.dispatcher.destroy();
+ });
+ }
+ }
+ };
+});
+define('ember-test-helpers/legacy-0-6-x/build-registry', ['exports', 'require'], function (exports, _require2) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+
+ exports.default = function (resolver) {
+ var fallbackRegistry, registry, container;
+ var namespace = Ember.Object.create({
+ Resolver: {
+ create() {
+ return resolver;
+ }
+ }
+ });
+
+ function register(name, factory) {
+ var thingToRegisterWith = registry || container;
+
+ if (!(container.factoryFor ? container.factoryFor(name) : container.lookupFactory(name))) {
+ thingToRegisterWith.register(name, factory);
+ }
+ }
+
+ if (Ember.Application.buildRegistry) {
+ fallbackRegistry = Ember.Application.buildRegistry(namespace);
+ fallbackRegistry.register('component-lookup:main', Ember.ComponentLookup);
+
+ registry = new Ember.Registry({
+ fallback: fallbackRegistry
+ });
+
+ if (Ember.ApplicationInstance && Ember.ApplicationInstance.setupRegistry) {
+ Ember.ApplicationInstance.setupRegistry(registry);
+ }
+
+ // these properties are set on the fallback registry by `buildRegistry`
+ // and on the primary registry within the ApplicationInstance constructor
+ // but we need to manually recreate them since ApplicationInstance's are not
+ // exposed externally
+ registry.normalizeFullName = fallbackRegistry.normalizeFullName;
+ registry.makeToString = fallbackRegistry.makeToString;
+ registry.describe = fallbackRegistry.describe;
+
+ var owner = Owner.create({
+ __registry__: registry,
+ __container__: null
+ });
+
+ container = registry.container({ owner: owner });
+ owner.__container__ = container;
+
+ exposeRegistryMethodsWithoutDeprecations(container);
+ } else {
+ container = Ember.Application.buildContainer(namespace);
+ container.register('component-lookup:main', Ember.ComponentLookup);
+ }
+
+ // Ember 1.10.0 did not properly add `view:toplevel` or `view:default`
+ // to the registry in Ember.Application.buildRegistry :(
+ //
+ // Ember 2.0.0 removed Ember.View as public API, so only do this when
+ // Ember.View is present
+ if (Ember.View) {
+ register('view:toplevel', Ember.View.extend());
+ }
+
+ // Ember 2.0.0 removed Ember._MetamorphView from the Ember global, so only
+ // do this when present
+ if (Ember._MetamorphView) {
+ register('view:default', Ember._MetamorphView);
+ }
+
+ var globalContext = typeof global === 'object' && global || self;
+ if (requirejs.entries['ember-data/setup-container']) {
+ // ember-data is a proper ember-cli addon since 2.3; if no 'import
+ // 'ember-data'' is present somewhere in the tests, there is also no `DS`
+ // available on the globalContext and hence ember-data wouldn't be setup
+ // correctly for the tests; that's why we import and call setupContainer
+ // here; also see https://github.com/emberjs/data/issues/4071 for context
+ var setupContainer = (0, _require2.default)('ember-data/setup-container')['default'];
+ setupContainer(registry || container);
+ } else if (globalContext.DS) {
+ var DS = globalContext.DS;
+ if (DS._setupContainer) {
+ DS._setupContainer(registry || container);
+ } else {
+ register('transform:boolean', DS.BooleanTransform);
+ register('transform:date', DS.DateTransform);
+ register('transform:number', DS.NumberTransform);
+ register('transform:string', DS.StringTransform);
+ register('serializer:-default', DS.JSONSerializer);
+ register('serializer:-rest', DS.RESTSerializer);
+ register('adapter:-rest', DS.RESTAdapter);
+ }
+ }
+
+ return {
+ registry,
+ container,
+ owner
+ };
+ };
+
+ /* globals global, self, requirejs */
+
+ function exposeRegistryMethodsWithoutDeprecations(container) {
+ var methods = ['register', 'unregister', 'resolve', 'normalize', 'typeInjection', 'injection', 'factoryInjection', 'factoryTypeInjection', 'has', 'options', 'optionsForType'];
+
+ function exposeRegistryMethod(container, method) {
+ if (method in container) {
+ container[method] = function () {
+ return container._registry[method].apply(container._registry, arguments);
+ };
+ }
+ }
+
+ for (var i = 0, l = methods.length; i < l; i++) {
+ exposeRegistryMethod(container, methods[i]);
+ }
+ }
+
+ var Owner = function () {
+ if (Ember._RegistryProxyMixin && Ember._ContainerProxyMixin) {
+ return Ember.Object.extend(Ember._RegistryProxyMixin, Ember._ContainerProxyMixin, {
+ _emberTestHelpersMockOwner: true
+ });
+ }
+
+ return Ember.Object.extend({
+ _emberTestHelpersMockOwner: true
+ });
+ }();
+});
+define('ember-test-helpers/legacy-0-6-x/ext/rsvp', ['exports'], function (exports) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports._setupPromiseListeners = _setupPromiseListeners;
+ exports._teardownPromiseListeners = _teardownPromiseListeners;
+
+
+ let originalAsync;
+
+ /**
+ Configures `RSVP` to resolve promises on the run-loop's action queue. This is
+ done by Ember internally since Ember 1.7 and it is only needed to
+ provide a consistent testing experience for users of Ember < 1.7.
+
+ @private
+ */
+ function _setupPromiseListeners() {
+ originalAsync = Ember.RSVP.configure('async');
+
+ Ember.RSVP.configure('async', function (callback, promise) {
+ Ember.run.backburner.schedule('actions', () => {
+ callback(promise);
+ });
+ });
+ }
+
+ /**
+ Resets `RSVP`'s `async` to its prior value.
+
+ @private
+ */
+ function _teardownPromiseListeners() {
+ Ember.RSVP.configure('async', originalAsync);
+ }
+});
+define('ember-test-helpers/legacy-0-6-x/test-module-for-acceptance', ['exports', 'ember-test-helpers/legacy-0-6-x/abstract-test-module', '@ember/test-helpers'], function (exports, _abstractTestModule, _testHelpers) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = class extends _abstractTestModule.default {
+ setupContext() {
+ super.setupContext({ application: this.createApplication() });
+ }
+
+ teardownContext() {
+ Ember.run(() => {
+ (0, _testHelpers.getContext)().application.destroy();
+ });
+
+ super.teardownContext();
+ }
+
+ createApplication() {
+ let { Application, config } = this.callbacks;
+ let application;
+
+ Ember.run(() => {
+ application = Application.create(config);
+ application.setupForTesting();
+ application.injectTestHelpers();
+ });
+
+ return application;
+ }
+ };
+});
+define('ember-test-helpers/legacy-0-6-x/test-module-for-component', ['exports', 'ember-test-helpers/legacy-0-6-x/test-module', 'ember-test-helpers/has-ember-version', 'ember-test-helpers/legacy-0-6-x/-legacy-overrides'], function (exports, _testModule, _hasEmberVersion, _legacyOverrides) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.setupComponentIntegrationTest = setupComponentIntegrationTest;
+ /* globals EmberENV */
+ let ACTION_KEY;
+ if ((0, _hasEmberVersion.default)(2, 0)) {
+ ACTION_KEY = 'actions';
+ } else {
+ ACTION_KEY = '_actions';
+ }
+
+ const isPreGlimmer = !(0, _hasEmberVersion.default)(1, 13);
+
+ exports.default = class extends _testModule.default {
+ constructor(componentName, description, callbacks) {
+ // Allow `description` to be omitted
+ if (!callbacks && typeof description === 'object') {
+ callbacks = description;
+ description = null;
+ } else if (!callbacks) {
+ callbacks = {};
+ }
+
+ let integrationOption = callbacks.integration;
+ let hasNeeds = Array.isArray(callbacks.needs);
+
+ super('component:' + componentName, description, callbacks);
+
+ this.componentName = componentName;
+
+ if (hasNeeds || callbacks.unit || integrationOption === false) {
+ this.isUnitTest = true;
+ } else if (integrationOption) {
+ this.isUnitTest = false;
+ } else {
+ Ember.deprecate('the component:' + componentName + ' test module is implicitly running in unit test mode, ' + 'which will change to integration test mode by default in an upcoming version of ' + 'ember-test-helpers. Add `unit: true` or a `needs:[]` list to explicitly opt in to unit ' + 'test mode.', false, {
+ id: 'ember-test-helpers.test-module-for-component.test-type',
+ until: '0.6.0'
+ });
+ this.isUnitTest = true;
+ }
+
+ if (!this.isUnitTest && !this.isLegacy) {
+ callbacks.integration = true;
+ }
+
+ if (this.isUnitTest || this.isLegacy) {
+ this.setupSteps.push(this.setupComponentUnitTest);
+ } else {
+ this.callbacks.subject = function () {
+ throw new Error("component integration tests do not support `subject()`. Instead, render the component as if it were HTML: `this.render('<my-component foo=true>');`. For more information, read: http://guides.emberjs.com/v2.2.0/testing/testing-components/");
+ };
+ this.setupSteps.push(this.setupComponentIntegrationTest);
+ this.teardownSteps.unshift(this.teardownComponent);
+ }
+
+ if (Ember.View && Ember.View.views) {
+ this.setupSteps.push(this._aliasViewRegistry);
+ this.teardownSteps.unshift(this._resetViewRegistry);
+ }
+ }
+
+ initIntegration(options) {
+ this.isLegacy = options.integration === 'legacy';
+ this.isIntegration = options.integration !== 'legacy';
+ }
+
+ _aliasViewRegistry() {
+ this._originalGlobalViewRegistry = Ember.View.views;
+ var viewRegistry = this.container.lookup('-view-registry:main');
+
+ if (viewRegistry) {
+ Ember.View.views = viewRegistry;
+ }
+ }
+
+ _resetViewRegistry() {
+ Ember.View.views = this._originalGlobalViewRegistry;
+ }
+
+ setupComponentUnitTest() {
+ var _this = this;
+ var resolver = this.resolver;
+ var context = this.context;
+
+ var layoutName = 'template:components/' + this.componentName;
+
+ var layout = resolver.resolve(layoutName);
+
+ var thingToRegisterWith = this.registry || this.container;
+ if (layout) {
+ thingToRegisterWith.register(layoutName, layout);
+ thingToRegisterWith.injection(this.subjectName, 'layout', layoutName);
+ }
+ var eventDispatcher = resolver.resolve('event_dispatcher:main');
+ if (eventDispatcher) {
+ thingToRegisterWith.register('event_dispatcher:main', eventDispatcher);
+ }
+
+ context.dispatcher = this.container.lookup('event_dispatcher:main') || Ember.EventDispatcher.create();
+ context.dispatcher.setup({}, '#ember-testing');
+
+ context._element = null;
+
+ this.callbacks.render = function () {
+ var subject;
+
+ Ember.run(function () {
+ subject = context.subject();
+ subject.appendTo('#ember-testing');
+ });
+
+ context._element = subject.element;
+
+ _this.teardownSteps.unshift(function () {
+ Ember.run(function () {
+ Ember.tryInvoke(subject, 'destroy');
+ });
+ });
+ };
+
+ this.callbacks.append = function () {
+ Ember.deprecate('this.append() is deprecated. Please use this.render() or this.$() instead.', false, {
+ id: 'ember-test-helpers.test-module-for-component.append',
+ until: '0.6.0'
+ });
+ return context.$();
+ };
+
+ context.$ = function () {
+ this.render();
+ var subject = this.subject();
+
+ return subject.$.apply(subject, arguments);
+ };
+ }
+
+ setupComponentIntegrationTest() {
+ if (isPreGlimmer) {
+ return _legacyOverrides.preGlimmerSetupIntegrationForComponent.apply(this, arguments);
+ } else {
+ return setupComponentIntegrationTest.apply(this, arguments);
+ }
+ }
+
+ setupContext() {
+ super.setupContext();
+
+ // only setup the injection if we are running against a version
+ // of Ember that has `-view-registry:main` (Ember >= 1.12)
+ if (this.container.factoryFor ? this.container.factoryFor('-view-registry:main') : this.container.lookupFactory('-view-registry:main')) {
+ (this.registry || this.container).injection('component', '_viewRegistry', '-view-registry:main');
+ }
+
+ if (!this.isUnitTest && !this.isLegacy) {
+ this.context.factory = function () {};
+ }
+ }
+
+ teardownComponent() {
+ var component = this.component;
+ if (component) {
+ Ember.run(component, 'destroy');
+ this.component = null;
+ }
+ }
+ };
+ function setupComponentIntegrationTest() {
+ var module = this;
+ var context = this.context;
+
+ this.actionHooks = context[ACTION_KEY] = {};
+ context.dispatcher = this.container.lookup('event_dispatcher:main') || Ember.EventDispatcher.create();
+ context.dispatcher.setup({}, '#ember-testing');
+
+ var hasRendered = false;
+ var OutletView = module.container.factoryFor ? module.container.factoryFor('view:-outlet') : module.container.lookupFactory('view:-outlet');
+ var OutletTemplate = module.container.lookup('template:-outlet');
+ var toplevelView = module.component = OutletView.create();
+ var hasOutletTemplate = !!OutletTemplate;
+ var outletState = {
+ render: {
+ owner: Ember.getOwner ? Ember.getOwner(module.container) : undefined,
+ into: undefined,
+ outlet: 'main',
+ name: 'application',
+ controller: module.context,
+ ViewClass: undefined,
+ template: OutletTemplate
+ },
+
+ outlets: {}
+ };
+
+ var element = document.getElementById('ember-testing');
+ var templateId = 0;
+
+ if (hasOutletTemplate) {
+ Ember.run(() => {
+ toplevelView.setOutletState(outletState);
+ });
+ }
+
+ context.render = function (template) {
+ if (!template) {
+ throw new Error('in a component integration test you must pass a template to `render()`');
+ }
+ if (Ember.isArray(template)) {
+ template = template.join('');
+ }
+ if (typeof template === 'string') {
+ template = Ember.Handlebars.compile(template);
+ }
+
+ var templateFullName = 'template:-undertest-' + ++templateId;
+ this.registry.register(templateFullName, template);
+ var stateToRender = {
+ owner: Ember.getOwner ? Ember.getOwner(module.container) : undefined,
+ into: undefined,
+ outlet: 'main',
+ name: 'index',
+ controller: module.context,
+ ViewClass: undefined,
+ template: module.container.lookup(templateFullName),
+ outlets: {}
+ };
+
+ if (hasOutletTemplate) {
+ stateToRender.name = 'index';
+ outletState.outlets.main = { render: stateToRender, outlets: {} };
+ } else {
+ stateToRender.name = 'application';
+ outletState = { render: stateToRender, outlets: {} };
+ }
+
+ Ember.run(() => {
+ toplevelView.setOutletState(outletState);
+ });
+
+ if (!hasRendered) {
+ Ember.run(module.component, 'appendTo', '#ember-testing');
+ hasRendered = true;
+ }
+
+ if (EmberENV._APPLICATION_TEMPLATE_WRAPPER !== false) {
+ // ensure the element is based on the wrapping toplevel view
+ // Ember still wraps the main application template with a
+ // normal tagged view
+ context._element = element = document.querySelector('#ember-testing > .ember-view');
+ } else {
+ context._element = element = document.querySelector('#ember-testing');
+ }
+ };
+
+ context.$ = function (selector) {
+ // emulates Ember internal behavor of `this.$` in a component
+ // https://github.com/emberjs/ember.js/blob/v2.5.1/packages/ember-views/lib/views/states/has_element.js#L18
+ return selector ? Ember.$(selector, element) : Ember.$(element);
+ };
+
+ context.set = function (key, value) {
+ var ret = Ember.run(function () {
+ return Ember.set(context, key, value);
+ });
+
+ if ((0, _hasEmberVersion.default)(2, 0)) {
+ return ret;
+ }
+ };
+
+ context.setProperties = function (hash) {
+ var ret = Ember.run(function () {
+ return Ember.setProperties(context, hash);
+ });
+
+ if ((0, _hasEmberVersion.default)(2, 0)) {
+ return ret;
+ }
+ };
+
+ context.get = function (key) {
+ return Ember.get(context, key);
+ };
+
+ context.getProperties = function () {
+ var args = Array.prototype.slice.call(arguments);
+ return Ember.getProperties(context, args);
+ };
+
+ context.on = function (actionName, handler) {
+ module.actionHooks[actionName] = handler;
+ };
+
+ context.send = function (actionName) {
+ var hook = module.actionHooks[actionName];
+ if (!hook) {
+ throw new Error('integration testing template received unexpected action ' + actionName);
+ }
+ hook.apply(module.context, Array.prototype.slice.call(arguments, 1));
+ };
+
+ context.clearRender = function () {
+ Ember.run(function () {
+ toplevelView.setOutletState({
+ render: {
+ owner: module.container,
+ into: undefined,
+ outlet: 'main',
+ name: 'application',
+ controller: module.context,
+ ViewClass: undefined,
+ template: undefined
+ },
+ outlets: {}
+ });
+ });
+ };
+ }
+});
+define('ember-test-helpers/legacy-0-6-x/test-module-for-model', ['exports', 'require', 'ember-test-helpers/legacy-0-6-x/test-module'], function (exports, _require2, _testModule) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = class extends _testModule.default {
+ constructor(modelName, description, callbacks) {
+ super('model:' + modelName, description, callbacks);
+
+ this.modelName = modelName;
+
+ this.setupSteps.push(this.setupModel);
+ }
+
+ setupModel() {
+ var container = this.container;
+ var defaultSubject = this.defaultSubject;
+ var callbacks = this.callbacks;
+ var modelName = this.modelName;
+
+ var adapterFactory = container.factoryFor ? container.factoryFor('adapter:application') : container.lookupFactory('adapter:application');
+ if (!adapterFactory) {
+ if (requirejs.entries['ember-data/adapters/json-api']) {
+ adapterFactory = (0, _require2.default)('ember-data/adapters/json-api')['default'];
+ }
+
+ // when ember-data/adapters/json-api is provided via ember-cli shims
+ // using Ember Data 1.x the actual JSONAPIAdapter isn't found, but the
+ // above require statement returns a bizzaro object with only a `default`
+ // property (circular reference actually)
+ if (!adapterFactory || !adapterFactory.create) {
+ adapterFactory = DS.JSONAPIAdapter || DS.FixtureAdapter;
+ }
+
+ var thingToRegisterWith = this.registry || this.container;
+ thingToRegisterWith.register('adapter:application', adapterFactory);
+ }
+
+ callbacks.store = function () {
+ var container = this.container;
+ return container.lookup('service:store') || container.lookup('store:main');
+ };
+
+ if (callbacks.subject === defaultSubject) {
+ callbacks.subject = function (options) {
+ var container = this.container;
+
+ return Ember.run(function () {
+ var store = container.lookup('service:store') || container.lookup('store:main');
+ return store.createRecord(modelName, options);
+ });
+ };
+ }
+ }
+ };
+});
+define('ember-test-helpers/legacy-0-6-x/test-module', ['exports', 'ember-test-helpers/legacy-0-6-x/abstract-test-module', '@ember/test-helpers', 'ember-test-helpers/legacy-0-6-x/build-registry', '@ember/test-helpers/has-ember-version'], function (exports, _abstractTestModule, _testHelpers, _buildRegistry, _hasEmberVersion) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = class extends _abstractTestModule.default {
+ constructor(subjectName, description, callbacks) {
+ // Allow `description` to be omitted, in which case it should
+ // default to `subjectName`
+ if (!callbacks && typeof description === 'object') {
+ callbacks = description;
+ description = subjectName;
+ }
+
+ super(description || subjectName, callbacks);
+
+ this.subjectName = subjectName;
+ this.description = description || subjectName;
+ this.resolver = this.callbacks.resolver || (0, _testHelpers.getResolver)();
+
+ if (this.callbacks.integration && this.callbacks.needs) {
+ throw new Error("cannot declare 'integration: true' and 'needs' in the same module");
+ }
+
+ if (this.callbacks.integration) {
+ this.initIntegration(callbacks);
+ delete callbacks.integration;
+ }
+
+ this.initSubject();
+ this.initNeeds();
+ }
+
+ initIntegration(options) {
+ if (options.integration === 'legacy') {
+ throw new Error("`integration: 'legacy'` is only valid for component tests.");
+ }
+ this.isIntegration = true;
+ }
+
+ initSubject() {
+ this.callbacks.subject = this.callbacks.subject || this.defaultSubject;
+ }
+
+ initNeeds() {
+ this.needs = [this.subjectName];
+ if (this.callbacks.needs) {
+ this.needs = this.needs.concat(this.callbacks.needs);
+ delete this.callbacks.needs;
+ }
+ }
+
+ initSetupSteps() {
+ this.setupSteps = [];
+ this.contextualizedSetupSteps = [];
+
+ if (this.callbacks.beforeSetup) {
+ this.setupSteps.push(this.callbacks.beforeSetup);
+ delete this.callbacks.beforeSetup;
+ }
+
+ this.setupSteps.push(this.setupContainer);
+ this.setupSteps.push(this.setupContext);
+ this.setupSteps.push(this.setupTestElements);
+ this.setupSteps.push(this.setupAJAXListeners);
+ this.setupSteps.push(this.setupPromiseListeners);
+
+ if (this.callbacks.setup) {
+ this.contextualizedSetupSteps.push(this.callbacks.setup);
+ delete this.callbacks.setup;
+ }
+ }
+
+ initTeardownSteps() {
+ this.teardownSteps = [];
+ this.contextualizedTeardownSteps = [];
+
+ if (this.callbacks.teardown) {
+ this.contextualizedTeardownSteps.push(this.callbacks.teardown);
+ delete this.callbacks.teardown;
+ }
+
+ this.teardownSteps.push(this.teardownSubject);
+ this.teardownSteps.push(this.teardownContainer);
+ this.teardownSteps.push(this.teardownContext);
+ this.teardownSteps.push(this.teardownTestElements);
+ this.teardownSteps.push(this.teardownAJAXListeners);
+ this.teardownSteps.push(this.teardownPromiseListeners);
+
+ if (this.callbacks.afterTeardown) {
+ this.teardownSteps.push(this.callbacks.afterTeardown);
+ delete this.callbacks.afterTeardown;
+ }
+ }
+
+ setupContainer() {
+ if (this.isIntegration || this.isLegacy) {
+ this._setupIntegratedContainer();
+ } else {
+ this._setupIsolatedContainer();
+ }
+ }
+
+ setupContext() {
+ var subjectName = this.subjectName;
+ var container = this.container;
+
+ var factory = function () {
+ return container.factoryFor ? container.factoryFor(subjectName) : container.lookupFactory(subjectName);
+ };
+
+ super.setupContext({
+ container: this.container,
+ registry: this.registry,
+ factory: factory,
+ register() {
+ var target = this.registry || this.container;
+ return target.register.apply(target, arguments);
+ }
+ });
+
+ if (Ember.setOwner) {
+ Ember.setOwner(this.context, this.container.owner);
+ }
+
+ this.setupInject();
+ }
+
+ setupInject() {
+ var module = this;
+ var context = this.context;
+
+ if (Ember.inject) {
+ var keys = (Object.keys || keys)(Ember.inject);
+
+ keys.forEach(function (typeName) {
+ context.inject[typeName] = function (name, opts) {
+ var alias = opts && opts.as || name;
+ Ember.run(function () {
+ Ember.set(context, alias, module.container.lookup(typeName + ':' + name));
+ });
+ };
+ });
+ }
+ }
+
+ teardownSubject() {
+ var subject = this.cache.subject;
+
+ if (subject) {
+ Ember.run(function () {
+ Ember.tryInvoke(subject, 'destroy');
+ });
+ }
+ }
+
+ teardownContainer() {
+ var container = this.container;
+ Ember.run(function () {
+ container.destroy();
+ });
+ }
+
+ defaultSubject(options, factory) {
+ return factory.create(options);
+ }
+
+ // allow arbitrary named factories, like rspec let
+ contextualizeCallbacks() {
+ var callbacks = this.callbacks;
+ var context = this.context;
+
+ this.cache = this.cache || {};
+ this.cachedCalls = this.cachedCalls || {};
+
+ var keys = (Object.keys || keys)(callbacks);
+ var keysLength = keys.length;
+
+ if (keysLength) {
+ var deprecatedContext = this._buildDeprecatedContext(this, context);
+ for (var i = 0; i < keysLength; i++) {
+ this._contextualizeCallback(context, keys[i], deprecatedContext);
+ }
+ }
+ }
+
+ _contextualizeCallback(context, key, callbackContext) {
+ var _this = this;
+ var callbacks = this.callbacks;
+ var factory = context.factory;
+
+ context[key] = function (options) {
+ if (_this.cachedCalls[key]) {
+ return _this.cache[key];
+ }
+
+ var result = callbacks[key].call(callbackContext, options, factory());
+
+ _this.cache[key] = result;
+ _this.cachedCalls[key] = true;
+
+ return result;
+ };
+ }
+
+ /*
+ Builds a version of the passed in context that contains deprecation warnings
+ for accessing properties that exist on the module.
+ */
+ _buildDeprecatedContext(module, context) {
+ var deprecatedContext = Object.create(context);
+
+ var keysForDeprecation = Object.keys(module);
+
+ for (var i = 0, l = keysForDeprecation.length; i < l; i++) {
+ this._proxyDeprecation(module, deprecatedContext, keysForDeprecation[i]);
+ }
+
+ return deprecatedContext;
+ }
+
+ /*
+ Defines a key on an object to act as a proxy for deprecating the original.
+ */
+ _proxyDeprecation(obj, proxy, key) {
+ if (typeof proxy[key] === 'undefined') {
+ Object.defineProperty(proxy, key, {
+ get() {
+ Ember.deprecate('Accessing the test module property "' + key + '" from a callback is deprecated.', false, {
+ id: 'ember-test-helpers.test-module.callback-context',
+ until: '0.6.0'
+ });
+ return obj[key];
+ }
+ });
+ }
+ }
+
+ _setupContainer(isolated) {
+ var resolver = this.resolver;
+
+ var items = (0, _buildRegistry.default)(!isolated ? resolver : Object.create(resolver, {
+ resolve: {
+ value() {}
+ }
+ }));
+
+ this.container = items.container;
+ this.registry = items.registry;
+
+ if ((0, _hasEmberVersion.default)(1, 13)) {
+ var thingToRegisterWith = this.registry || this.container;
+ var router = resolver.resolve('router:main');
+ router = router || Ember.Router.extend();
+ thingToRegisterWith.register('router:main', router);
+ }
+ }
+
+ _setupIsolatedContainer() {
+ var resolver = this.resolver;
+ this._setupContainer(true);
+
+ var thingToRegisterWith = this.registry || this.container;
+
+ for (var i = this.needs.length; i > 0; i--) {
+ var fullName = this.needs[i - 1];
+ var normalizedFullName = resolver.normalize(fullName);
+ thingToRegisterWith.register(fullName, resolver.resolve(normalizedFullName));
+ }
+
+ if (!this.registry) {
+ this.container.resolver = function () {};
+ }
+ }
+
+ _setupIntegratedContainer() {
+ this._setupContainer();
+ }
+ };
+});
+define('ember-test-helpers/wait', ['exports', '@ember/test-helpers/settled', '@ember/test-helpers'], function (exports, _settled, _testHelpers) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports._teardownPromiseListeners = exports._teardownAJAXHooks = exports._setupPromiseListeners = exports._setupAJAXHooks = undefined;
+ Object.defineProperty(exports, '_setupAJAXHooks', {
+ enumerable: true,
+ get: function () {
+ return _settled._setupAJAXHooks;
+ }
+ });
+ Object.defineProperty(exports, '_setupPromiseListeners', {
+ enumerable: true,
+ get: function () {
+ return _settled._setupPromiseListeners;
+ }
+ });
+ Object.defineProperty(exports, '_teardownAJAXHooks', {
+ enumerable: true,
+ get: function () {
+ return _settled._teardownAJAXHooks;
+ }
+ });
+ Object.defineProperty(exports, '_teardownPromiseListeners', {
+ enumerable: true,
+ get: function () {
+ return _settled._teardownPromiseListeners;
+ }
+ });
+ exports.default = wait;
+
+
+ /**
+ Returns a promise that resolves when in a settled state (see `isSettled` for
+ a definition of "settled state").
+
+ @private
+ @deprecated
+ @param {Object} [options={}] the options to be used for waiting
+ @param {boolean} [options.waitForTimers=true] should timers be waited upon
+ @param {boolean} [options.waitForAjax=true] should $.ajax requests be waited upon
+ @param {boolean} [options.waitForWaiters=true] should test waiters be waited upon
+ @returns {Promise<void>} resolves when settled
+ */
+ function wait(options = {}) {
+ if (typeof options !== 'object' || options === null) {
+ options = {};
+ }
+
+ return (0, _testHelpers.waitUntil)(() => {
+ let waitForTimers = 'waitForTimers' in options ? options.waitForTimers : true;
+ let waitForAJAX = 'waitForAJAX' in options ? options.waitForAJAX : true;
+ let waitForWaiters = 'waitForWaiters' in options ? options.waitForWaiters : true;
+
+ let {
+ hasPendingTimers,
+ hasRunLoop,
+ hasPendingRequests,
+ hasPendingWaiters
+ } = (0, _testHelpers.getSettledState)();
+
+ if (waitForTimers && (hasPendingTimers || hasRunLoop)) {
+ return false;
+ }
+
+ if (waitForAJAX && hasPendingRequests) {
+ return false;
+ }
+
+ if (waitForWaiters && hasPendingWaiters) {
+ return false;
+ }
+
+ return true;
+ }, { timeout: Infinity });
+ }
+});
+define("qunit/index", ["exports"], function (exports) {
+ "use strict";
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ /* globals QUnit */
+
+ var _module = QUnit.module;
+ exports.module = _module;
+ var test = exports.test = QUnit.test;
+ var skip = exports.skip = QUnit.skip;
+ var only = exports.only = QUnit.only;
+ var todo = exports.todo = QUnit.todo;
+
+ exports.default = QUnit;
+});
+runningTests = true;
+
+if (window.Testem) {
+ window.Testem.hookIntoTestFramework();
+}
+
+
+//# sourceMappingURL=test-support.map
diff --git a/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/test-support.map b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/test-support.map
new file mode 100644
index 0000000000..40a1a42864
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/test-support.map
@@ -0,0 +1 @@
+{"version":3,"sources":["vendor/ember-cli/test-support-prefix.js","license.js","loader.js","ember-babel.js","ember-debug/deprecate.js","ember-debug/error.js","ember-debug/features.js","ember-debug/handlers.js","ember-debug/index.js","ember-debug/testing.js","ember-debug/warn.js","ember-testing/adapters/adapter.js","ember-testing/adapters/qunit.js","ember-testing/events.js","ember-testing/ext/application.js","ember-testing/ext/rsvp.js","ember-testing/helpers.js","ember-testing/helpers/and_then.js","ember-testing/helpers/click.js","ember-testing/helpers/current_path.js","ember-testing/helpers/current_route_name.js","ember-testing/helpers/current_url.js","ember-testing/helpers/fill_in.js","ember-testing/helpers/find.js","ember-testing/helpers/find_with_assert.js","ember-testing/helpers/key_event.js","ember-testing/helpers/pause_test.js","ember-testing/helpers/trigger_event.js","ember-testing/helpers/visit.js","ember-testing/helpers/wait.js","ember-testing/index.js","ember-testing/initializers.js","ember-testing/setup_for_testing.js","ember-testing/support.js","ember-testing/test.js","ember-testing/test/adapter.js","ember-testing/test/helpers.js","ember-testing/test/on_inject_helpers.js","ember-testing/test/pending_requests.js","ember-testing/test/promise.js","ember-testing/test/run.js","ember-testing/test/waiters.js","node-module.js","vendor/monkey-patches.js","vendor/qunit/qunit.js","vendor/ember-qunit/qunit-configuration.js","addon-test-support/@ember/test-helpers/-utils.js","addon-test-support/@ember/test-helpers/application.js","addon-test-support/@ember/test-helpers/build-owner.js","addon-test-support/@ember/test-helpers/dom/-get-element.js","addon-test-support/@ember/test-helpers/dom/-get-elements.js","addon-test-support/@ember/test-helpers/dom/-is-focusable.js","addon-test-support/@ember/test-helpers/dom/-is-form-control.js","addon-test-support/@ember/test-helpers/dom/-to-array.js","addon-test-support/@ember/test-helpers/dom/blur.js","addon-test-support/@ember/test-helpers/dom/click.js","addon-test-support/@ember/test-helpers/dom/fill-in.js","addon-test-support/@ember/test-helpers/dom/find-all.js","addon-test-support/@ember/test-helpers/dom/find.js","addon-test-support/@ember/test-helpers/dom/fire-event.js","addon-test-support/@ember/test-helpers/dom/focus.js","addon-test-support/@ember/test-helpers/dom/get-root-element.js","addon-test-support/@ember/test-helpers/dom/tap.js","addon-test-support/@ember/test-helpers/dom/trigger-event.js","addon-test-support/@ember/test-helpers/dom/trigger-key-event.js","addon-test-support/@ember/test-helpers/dom/wait-for.js","addon-test-support/@ember/test-helpers/global.js","addon-test-support/@ember/test-helpers/has-ember-version.js","addon-test-support/@ember/test-helpers/index.js","addon-test-support/@ember/test-helpers/resolver.js","addon-test-support/@ember/test-helpers/settled.js","addon-test-support/@ember/test-helpers/setup-application-context.js","addon-test-support/@ember/test-helpers/setup-context.js","addon-test-support/@ember/test-helpers/setup-rendering-context.js","addon-test-support/@ember/test-helpers/teardown-application-context.js","addon-test-support/@ember/test-helpers/teardown-context.js","addon-test-support/@ember/test-helpers/teardown-rendering-context.js","addon-test-support/@ember/test-helpers/validate-error-handler.js","addon-test-support/@ember/test-helpers/wait-until.js","addon-test-support/ember-cli-qunit.js","addon-test-support/ember-cli-test-loader/test-support/index.js","addon-test-support/ember-qunit/adapter.js","addon-test-support/ember-qunit/index.js","addon-test-support/ember-qunit/legacy-2-x/module-for-component.js","addon-test-support/ember-qunit/legacy-2-x/module-for-model.js","addon-test-support/ember-qunit/legacy-2-x/module-for.js","addon-test-support/ember-qunit/legacy-2-x/qunit-module.js","addon-test-support/ember-qunit/test-loader.js","addon-test-support/ember-test-helpers/has-ember-version.js","addon-test-support/ember-test-helpers/index.js","addon-test-support/ember-test-helpers/legacy-0-6-x/-legacy-overrides.js","addon-test-support/ember-test-helpers/legacy-0-6-x/abstract-test-module.js","addon-test-support/ember-test-helpers/legacy-0-6-x/build-registry.js","addon-test-support/ember-test-helpers/legacy-0-6-x/ext/rsvp.js","addon-test-support/ember-test-helpers/legacy-0-6-x/test-module-for-acceptance.js","addon-test-support/ember-test-helpers/legacy-0-6-x/test-module-for-component.js","addon-test-support/ember-test-helpers/legacy-0-6-x/test-module-for-model.js","addon-test-support/ember-test-helpers/legacy-0-6-x/test-module.js","addon-test-support/ember-test-helpers/wait.js","addon-test-support/qunit/index.js","vendor/ember-cli/test-support-suffix.js"],"sourcesContent":["\n","/*!\n * @overview Ember - JavaScript Application Framework\n * @copyright Copyright 2011-2018 Tilde Inc. and contributors\n * Portions Copyright 2006-2011 Strobe Inc.\n * Portions Copyright 2008-2011 Apple Inc. All rights reserved.\n * @license Licensed under MIT license\n * See https://raw.github.com/emberjs/ember.js/master/LICENSE\n * @version 3.0.0\n */\n","/*globals process */\nvar enifed, requireModule, Ember;\n\n// Used in ember-environment/lib/global.js\nmainContext = this; // eslint-disable-line no-undef\n\n(function() {\n function missingModule(name, referrerName) {\n if (referrerName) {\n throw new Error('Could not find module ' + name + ' required by: ' + referrerName);\n } else {\n throw new Error('Could not find module ' + name);\n }\n }\n\n function internalRequire(_name, referrerName) {\n var name = _name;\n var mod = registry[name];\n\n if (!mod) {\n name = name + '/index';\n mod = registry[name];\n }\n\n var exports = seen[name];\n\n if (exports !== undefined) {\n return exports;\n }\n\n exports = seen[name] = {};\n\n if (!mod) {\n missingModule(_name, referrerName);\n }\n\n var deps = mod.deps;\n var callback = mod.callback;\n var reified = new Array(deps.length);\n\n for (var i = 0; i < deps.length; i++) {\n if (deps[i] === 'exports') {\n reified[i] = exports;\n } else if (deps[i] === 'require') {\n reified[i] = requireModule;\n } else {\n reified[i] = internalRequire(deps[i], name);\n }\n }\n\n callback.apply(this, reified);\n\n return exports;\n }\n\n var isNode = typeof window === 'undefined' &&\n typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n if (!isNode) {\n Ember = this.Ember = this.Ember || {};\n }\n\n if (typeof Ember === 'undefined') { Ember = {}; }\n\n if (typeof Ember.__loader === 'undefined') {\n var registry = {};\n var seen = {};\n\n enifed = function(name, deps, callback) {\n var value = { };\n\n if (!callback) {\n value.deps = [];\n value.callback = deps;\n } else {\n value.deps = deps;\n value.callback = callback;\n }\n\n registry[name] = value;\n };\n\n requireModule = function(name) {\n return internalRequire(name, null);\n };\n\n // setup `require` module\n requireModule['default'] = requireModule;\n\n requireModule.has = function registryHas(moduleName) {\n return !!registry[moduleName] || !!registry[moduleName + '/index'];\n };\n\n requireModule._eak_seen = registry;\n\n Ember.__loader = {\n define: enifed,\n require: requireModule,\n registry: registry\n };\n } else {\n enifed = Ember.__loader.define;\n requireModule = Ember.__loader.require;\n }\n})();\n","enifed('ember-babel', ['exports'], function (exports) {\n 'use strict';\n\n exports.classCallCheck = classCallCheck;\n exports.inherits = inherits;\n exports.taggedTemplateLiteralLoose = taggedTemplateLiteralLoose;\n exports.createClass = createClass;\n exports.defaults = defaults;\n function classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError('Cannot call a class as a function');\n }\n }\n\n function inherits(subClass, superClass) {\n if (typeof superClass !== 'function' && superClass !== null) {\n throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass);\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : defaults(subClass, superClass);\n }\n\n function taggedTemplateLiteralLoose(strings, raw) {\n strings.raw = raw;\n return strings;\n }\n\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if ('value' in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n function createClass(Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n }\n\n function defaults(obj, defaults) {\n var keys = Object.getOwnPropertyNames(defaults);\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n var value = Object.getOwnPropertyDescriptor(defaults, key);\n if (value && value.configurable && obj[key] === undefined) {\n Object.defineProperty(obj, key, value);\n }\n }\n return obj;\n }\n\n var possibleConstructorReturn = exports.possibleConstructorReturn = function (self, call) {\n if (!self) {\n throw new ReferenceError('this hasn\\'t been initialized - super() hasn\\'t been called');\n }\n return call && (typeof call === 'object' || typeof call === 'function') ? call : self;\n };\n\n var slice = exports.slice = Array.prototype.slice;\n});","enifed('ember-debug/deprecate', ['exports', 'ember-debug/error', 'ember-console', 'ember-environment', 'ember-debug/index', 'ember-debug/handlers'], function (exports, _error, _emberConsole, _emberEnvironment, _index, _handlers) {\n 'use strict';\n\n exports.missingOptionsUntilDeprecation = exports.missingOptionsIdDeprecation = exports.missingOptionsDeprecation = exports.registerHandler = undefined;\n\n /**\n @module @ember/debug\n @public\n */\n /**\n Allows for runtime registration of handler functions that override the default deprecation behavior.\n Deprecations are invoked by calls to [@ember/application/deprecations/deprecate](https://emberjs.com/api/ember/release/classes/@ember%2Fapplication%2Fdeprecations/methods/deprecate?anchor=deprecate).\n The following example demonstrates its usage by registering a handler that throws an error if the\n message contains the word \"should\", otherwise defers to the default handler.\n \n ```javascript\n import { registerDeprecationHandler } from '@ember/debug';\n \n registerDeprecationHandler((message, options, next) => {\n if (message.indexOf('should') !== -1) {\n throw new Error(`Deprecation message with should: ${message}`);\n } else {\n // defer to whatever handler was registered before this one\n next(message, options);\n }\n });\n ```\n \n The handler function takes the following arguments:\n \n <ul>\n <li> <code>message</code> - The message received from the deprecation call.</li>\n <li> <code>options</code> - An object passed in with the deprecation call containing additional information including:</li>\n <ul>\n <li> <code>id</code> - An id of the deprecation in the form of <code>package-name.specific-deprecation</code>.</li>\n <li> <code>until</code> - The Ember version number the feature and deprecation will be removed in.</li>\n </ul>\n <li> <code>next</code> - A function that calls into the previously registered handler.</li>\n </ul>\n \n @public\n @static\n @method registerDeprecationHandler\n @for @ember/debug\n @param handler {Function} A function to handle deprecation calls.\n @since 2.1.0\n */\n /*global __fail__*/\n var registerHandler = function () {};\n var missingOptionsDeprecation = void 0,\n missingOptionsIdDeprecation = void 0,\n missingOptionsUntilDeprecation = void 0,\n deprecate = void 0;\n\n if (true) {\n exports.registerHandler = registerHandler = function registerHandler(handler) {\n (0, _handlers.registerHandler)('deprecate', handler);\n };\n\n var formatMessage = function formatMessage(_message, options) {\n var message = _message;\n\n if (options && options.id) {\n message = message + (' [deprecation id: ' + options.id + ']');\n }\n\n if (options && options.url) {\n message += ' See ' + options.url + ' for more details.';\n }\n\n return message;\n };\n\n registerHandler(function logDeprecationToConsole(message, options) {\n var updatedMessage = formatMessage(message, options);\n\n _emberConsole.default.warn('DEPRECATION: ' + updatedMessage);\n });\n\n var captureErrorForStack = void 0;\n\n if (new Error().stack) {\n captureErrorForStack = function () {\n return new Error();\n };\n } else {\n captureErrorForStack = function () {\n try {\n __fail__.fail();\n } catch (e) {\n return e;\n }\n };\n }\n\n registerHandler(function logDeprecationStackTrace(message, options, next) {\n if (_emberEnvironment.ENV.LOG_STACKTRACE_ON_DEPRECATION) {\n var stackStr = '';\n var error = captureErrorForStack();\n var stack = void 0;\n\n if (error.stack) {\n if (error['arguments']) {\n // Chrome\n stack = error.stack.replace(/^\\s+at\\s+/gm, '').replace(/^([^\\(]+?)([\\n$])/gm, '{anonymous}($1)$2').replace(/^Object.<anonymous>\\s*\\(([^\\)]+)\\)/gm, '{anonymous}($1)').split('\\n');\n stack.shift();\n } else {\n // Firefox\n stack = error.stack.replace(/(?:\\n@:0)?\\s+$/m, '').replace(/^\\(/gm, '{anonymous}(').split('\\n');\n }\n\n stackStr = '\\n ' + stack.slice(2).join('\\n ');\n }\n\n var updatedMessage = formatMessage(message, options);\n\n _emberConsole.default.warn('DEPRECATION: ' + updatedMessage + stackStr);\n } else {\n next.apply(undefined, arguments);\n }\n });\n\n registerHandler(function raiseOnDeprecation(message, options, next) {\n if (_emberEnvironment.ENV.RAISE_ON_DEPRECATION) {\n var updatedMessage = formatMessage(message);\n\n throw new _error.default(updatedMessage);\n } else {\n next.apply(undefined, arguments);\n }\n });\n\n exports.missingOptionsDeprecation = missingOptionsDeprecation = 'When calling `deprecate` you ' + 'must provide an `options` hash as the third parameter. ' + '`options` should include `id` and `until` properties.';\n exports.missingOptionsIdDeprecation = missingOptionsIdDeprecation = 'When calling `deprecate` you must provide `id` in options.';\n exports.missingOptionsUntilDeprecation = missingOptionsUntilDeprecation = 'When calling `deprecate` you must provide `until` in options.';\n /**\n @module @ember/application\n @public\n */\n /**\n Display a deprecation warning with the provided message and a stack trace\n (Chrome and Firefox only).\n * In a production build, this method is defined as an empty function (NOP).\n Uses of this method in Ember itself are stripped from the ember.prod.js build.\n @method deprecate\n @for @ember/application/deprecations\n @param {String} message A description of the deprecation.\n @param {Boolean} test A boolean. If falsy, the deprecation will be displayed.\n @param {Object} options\n @param {String} options.id A unique id for this deprecation. The id can be\n used by Ember debugging tools to change the behavior (raise, log or silence)\n for that specific deprecation. The id should be namespaced by dots, e.g.\n \"view.helper.select\".\n @param {string} options.until The version of Ember when this deprecation\n warning will be removed.\n @param {String} [options.url] An optional url to the transition guide on the\n emberjs.com website.\n @static\n @public\n @since 1.0.0\n */\n deprecate = function deprecate(message, test, options) {\n if (_emberEnvironment.ENV._ENABLE_DEPRECATION_OPTIONS_SUPPORT !== true) {\n (0, _index.assert)(missingOptionsDeprecation, options && (options.id || options.until));\n (0, _index.assert)(missingOptionsIdDeprecation, options.id);\n (0, _index.assert)(missingOptionsUntilDeprecation, options.until);\n }\n\n if ((!options || !options.id && !options.until) && _emberEnvironment.ENV._ENABLE_DEPRECATION_OPTIONS_SUPPORT === true) {\n deprecate(missingOptionsDeprecation, false, {\n id: 'ember-debug.deprecate-options-missing',\n until: '3.0.0',\n url: 'https://emberjs.com/deprecations/v2.x/#toc_ember-debug-function-options'\n });\n }\n\n if (options && !options.id && _emberEnvironment.ENV._ENABLE_DEPRECATION_OPTIONS_SUPPORT === true) {\n deprecate(missingOptionsIdDeprecation, false, {\n id: 'ember-debug.deprecate-id-missing',\n until: '3.0.0',\n url: 'https://emberjs.com/deprecations/v2.x/#toc_ember-debug-function-options'\n });\n }\n\n if (options && !options.until && _emberEnvironment.ENV._ENABLE_DEPRECATION_OPTIONS_SUPPORT === true) {\n deprecate(missingOptionsUntilDeprecation, options && options.until, {\n id: 'ember-debug.deprecate-until-missing',\n until: '3.0.0',\n url: 'https://emberjs.com/deprecations/v2.x/#toc_ember-debug-function-options'\n });\n }\n\n _handlers.invoke.apply(undefined, ['deprecate'].concat(Array.prototype.slice.call(arguments)));\n };\n }\n\n exports.default = deprecate;\n exports.registerHandler = registerHandler;\n exports.missingOptionsDeprecation = missingOptionsDeprecation;\n exports.missingOptionsIdDeprecation = missingOptionsIdDeprecation;\n exports.missingOptionsUntilDeprecation = missingOptionsUntilDeprecation;\n});","enifed(\"ember-debug/error\", [\"exports\", \"ember-babel\"], function (exports, _emberBabel) {\n \"use strict\";\n\n /**\n @module @ember/error\n */\n function ExtendBuiltin(klass) {\n function ExtendableBuiltin() {\n klass.apply(this, arguments);\n }\n\n ExtendableBuiltin.prototype = Object.create(klass.prototype);\n ExtendableBuiltin.prototype.constructor = ExtendableBuiltin;\n return ExtendableBuiltin;\n }\n\n /**\n A subclass of the JavaScript Error object for use in Ember.\n \n @class EmberError\n @extends Error\n @constructor\n @public\n */\n\n var EmberError = function (_ExtendBuiltin) {\n (0, _emberBabel.inherits)(EmberError, _ExtendBuiltin);\n\n function EmberError(message) {\n (0, _emberBabel.classCallCheck)(this, EmberError);\n\n var _this = (0, _emberBabel.possibleConstructorReturn)(this, _ExtendBuiltin.call(this));\n\n if (!(_this instanceof EmberError)) {\n var _ret;\n\n return _ret = new EmberError(message), (0, _emberBabel.possibleConstructorReturn)(_this, _ret);\n }\n\n var error = Error.call(_this, message);\n _this.stack = error.stack;\n _this.description = error.description;\n _this.fileName = error.fileName;\n _this.lineNumber = error.lineNumber;\n _this.message = error.message;\n _this.name = error.name;\n _this.number = error.number;\n _this.code = error.code;\n return _this;\n }\n\n return EmberError;\n }(ExtendBuiltin(Error));\n\n exports.default = EmberError;\n});","enifed('ember-debug/features', ['exports', 'ember-environment', 'ember/features'], function (exports, _emberEnvironment, _features) {\n 'use strict';\n\n exports.default = isEnabled;\n var FEATURES = _features.FEATURES;\n\n\n /**\n @module ember\n */\n\n /**\n The hash of enabled Canary features. Add to this, any canary features\n before creating your application.\n \n Alternatively (and recommended), you can also define `EmberENV.FEATURES`\n if you need to enable features flagged at runtime.\n \n @class FEATURES\n @namespace Ember\n @static\n @since 1.1.0\n @public\n */\n\n // Auto-generated\n\n /**\n Determine whether the specified `feature` is enabled. Used by Ember's\n build tools to exclude experimental features from beta/stable builds.\n \n You can define the following configuration options:\n \n * `EmberENV.ENABLE_OPTIONAL_FEATURES` - enable any features that have not been explicitly\n enabled/disabled.\n \n @method isEnabled\n @param {String} feature The feature to check\n @return {Boolean}\n @for Ember.FEATURES\n @since 1.1.0\n @public\n */\n function isEnabled(feature) {\n var featureValue = FEATURES[feature];\n\n if (featureValue === true || featureValue === false || featureValue === undefined) {\n return featureValue;\n } else if (_emberEnvironment.ENV.ENABLE_OPTIONAL_FEATURES) {\n return true;\n } else {\n return false;\n }\n }\n});","enifed('ember-debug/handlers', ['exports'], function (exports) {\n 'use strict';\n\n var HANDLERS = exports.HANDLERS = {};\n\n var registerHandler = function () {};\n var invoke = function () {};\n\n if (true) {\n exports.registerHandler = registerHandler = function registerHandler(type, callback) {\n var nextHandler = HANDLERS[type] || function () {};\n\n HANDLERS[type] = function (message, options) {\n callback(message, options, nextHandler);\n };\n };\n\n exports.invoke = invoke = function invoke(type, message, test, options) {\n if (test) {\n return;\n }\n\n var handlerForType = HANDLERS[type];\n\n if (handlerForType) {\n handlerForType(message, options);\n }\n };\n }\n\n exports.registerHandler = registerHandler;\n exports.invoke = invoke;\n});","enifed('ember-debug/index', ['exports', 'ember-debug/warn', 'ember-debug/deprecate', 'ember-debug/features', 'ember-debug/error', 'ember-debug/testing', 'ember-environment', 'ember-console', 'ember/features'], function (exports, _warn2, _deprecate2, _features, _error, _testing, _emberEnvironment, _emberConsole, _features2) {\n 'use strict';\n\n exports._warnIfUsingStrippedFeatureFlags = exports.getDebugFunction = exports.setDebugFunction = exports.deprecateFunc = exports.runInDebug = exports.debugFreeze = exports.debugSeal = exports.deprecate = exports.debug = exports.warn = exports.info = exports.assert = exports.setTesting = exports.isTesting = exports.Error = exports.isFeatureEnabled = exports.registerDeprecationHandler = exports.registerWarnHandler = undefined;\n Object.defineProperty(exports, 'registerWarnHandler', {\n enumerable: true,\n get: function () {\n return _warn2.registerHandler;\n }\n });\n Object.defineProperty(exports, 'registerDeprecationHandler', {\n enumerable: true,\n get: function () {\n return _deprecate2.registerHandler;\n }\n });\n Object.defineProperty(exports, 'isFeatureEnabled', {\n enumerable: true,\n get: function () {\n return _features.default;\n }\n });\n Object.defineProperty(exports, 'Error', {\n enumerable: true,\n get: function () {\n return _error.default;\n }\n });\n Object.defineProperty(exports, 'isTesting', {\n enumerable: true,\n get: function () {\n return _testing.isTesting;\n }\n });\n Object.defineProperty(exports, 'setTesting', {\n enumerable: true,\n get: function () {\n return _testing.setTesting;\n }\n });\n var DEFAULT_FEATURES = _features2.DEFAULT_FEATURES,\n FEATURES = _features2.FEATURES;\n\n\n // These are the default production build versions:\n var noop = function () {};\n\n var assert = noop;\n var info = noop;\n var warn = noop;\n var debug = noop;\n var deprecate = noop;\n var debugSeal = noop;\n var debugFreeze = noop;\n var runInDebug = noop;\n var setDebugFunction = noop;\n var getDebugFunction = noop;\n\n var deprecateFunc = function () {\n return arguments[arguments.length - 1];\n };\n\n if (true) {\n exports.setDebugFunction = setDebugFunction = function (type, callback) {\n switch (type) {\n case 'assert':\n return exports.assert = assert = callback;\n case 'info':\n return exports.info = info = callback;\n case 'warn':\n return exports.warn = warn = callback;\n case 'debug':\n return exports.debug = debug = callback;\n case 'deprecate':\n return exports.deprecate = deprecate = callback;\n case 'debugSeal':\n return exports.debugSeal = debugSeal = callback;\n case 'debugFreeze':\n return exports.debugFreeze = debugFreeze = callback;\n case 'runInDebug':\n return exports.runInDebug = runInDebug = callback;\n case 'deprecateFunc':\n return exports.deprecateFunc = deprecateFunc = callback;\n }\n };\n\n exports.getDebugFunction = getDebugFunction = function (type) {\n switch (type) {\n case 'assert':\n return assert;\n case 'info':\n return info;\n case 'warn':\n return warn;\n case 'debug':\n return debug;\n case 'deprecate':\n return deprecate;\n case 'debugSeal':\n return debugSeal;\n case 'debugFreeze':\n return debugFreeze;\n case 'runInDebug':\n return runInDebug;\n case 'deprecateFunc':\n return deprecateFunc;\n }\n };\n }\n\n /**\n @module @ember/debug\n */\n\n if (true) {\n /**\n Define an assertion that will throw an exception if the condition is not met.\n * In a production build, this method is defined as an empty function (NOP).\n Uses of this method in Ember itself are stripped from the ember.prod.js build.\n ```javascript\n import { assert } from '@ember/debug';\n // Test for truthiness\n assert('Must pass a valid object', obj);\n // Fail unconditionally\n assert('This code path should never be run');\n ```\n @method assert\n @static\n @for @ember/debug\n @param {String} desc A description of the assertion. This will become\n the text of the Error thrown if the assertion fails.\n @param {Boolean} test Must be truthy for the assertion to pass. If\n falsy, an exception will be thrown.\n @public\n @since 1.0.0\n */\n setDebugFunction('assert', function assert(desc, test) {\n if (!test) {\n throw new _error.default('Assertion Failed: ' + desc);\n }\n });\n\n /**\n Display a debug notice.\n * In a production build, this method is defined as an empty function (NOP).\n Uses of this method in Ember itself are stripped from the ember.prod.js build.\n ```javascript\n import { debug } from '@ember/debug';\n debug('I\\'m a debug notice!');\n ```\n @method debug\n @for @ember/debug\n @static\n @param {String} message A debug message to display.\n @public\n */\n setDebugFunction('debug', function debug(message) {\n _emberConsole.default.debug('DEBUG: ' + message);\n });\n\n /**\n Display an info notice.\n * In a production build, this method is defined as an empty function (NOP).\n Uses of this method in Ember itself are stripped from the ember.prod.js build.\n @method info\n @private\n */\n setDebugFunction('info', function info() {\n _emberConsole.default.info.apply(undefined, arguments);\n });\n\n /**\n @module @ember/application\n @public\n */\n\n /**\n Alias an old, deprecated method with its new counterpart.\n Display a deprecation warning with the provided message and a stack trace\n (Chrome and Firefox only) when the assigned method is called.\n * In a production build, this method is defined as an empty function (NOP).\n ```javascript\n import { deprecateFunc } from '@ember/application/deprecations';\n Ember.oldMethod = deprecateFunc('Please use the new, updated method', options, Ember.newMethod);\n ```\n @method deprecateFunc\n @static\n @for @ember/application/deprecations\n @param {String} message A description of the deprecation.\n @param {Object} [options] The options object for `deprecate`.\n @param {Function} func The new function called to replace its deprecated counterpart.\n @return {Function} A new function that wraps the original function with a deprecation warning\n @private\n */\n setDebugFunction('deprecateFunc', function deprecateFunc() {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n if (args.length === 3) {\n var message = args[0],\n options = args[1],\n func = args[2];\n\n return function () {\n deprecate(message, false, options);\n return func.apply(this, arguments);\n };\n } else {\n var _message = args[0],\n _func = args[1];\n\n return function () {\n deprecate(_message);\n return _func.apply(this, arguments);\n };\n }\n });\n\n /**\n @module @ember/debug\n @public\n */\n /**\n Run a function meant for debugging.\n * In a production build, this method is defined as an empty function (NOP).\n Uses of this method in Ember itself are stripped from the ember.prod.js build.\n ```javascript\n import Component from '@ember/component';\n import { runInDebug } from '@ember/debug';\n runInDebug(() => {\n Component.reopen({\n didInsertElement() {\n console.log(\"I'm happy\");\n }\n });\n });\n ```\n @method runInDebug\n @for @ember/debug\n @static\n @param {Function} func The function to be executed.\n @since 1.5.0\n @public\n */\n setDebugFunction('runInDebug', function runInDebug(func) {\n func();\n });\n\n setDebugFunction('debugSeal', function debugSeal(obj) {\n Object.seal(obj);\n });\n\n setDebugFunction('debugFreeze', function debugFreeze(obj) {\n Object.freeze(obj);\n });\n\n setDebugFunction('deprecate', _deprecate2.default);\n\n setDebugFunction('warn', _warn2.default);\n }\n\n var _warnIfUsingStrippedFeatureFlags = void 0;\n\n if (true && !(0, _testing.isTesting)()) {\n /**\n Will call `warn()` if ENABLE_OPTIONAL_FEATURES or\n any specific FEATURES flag is truthy.\n This method is called automatically in debug canary builds.\n @private\n @method _warnIfUsingStrippedFeatureFlags\n @return {void}\n */\n exports._warnIfUsingStrippedFeatureFlags = _warnIfUsingStrippedFeatureFlags = function _warnIfUsingStrippedFeatureFlags(FEATURES, knownFeatures, featuresWereStripped) {\n if (featuresWereStripped) {\n warn('Ember.ENV.ENABLE_OPTIONAL_FEATURES is only available in canary builds.', !_emberEnvironment.ENV.ENABLE_OPTIONAL_FEATURES, { id: 'ember-debug.feature-flag-with-features-stripped' });\n\n var keys = Object.keys(FEATURES || {});\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (key === 'isEnabled' || !(key in knownFeatures)) {\n continue;\n }\n\n warn('FEATURE[\"' + key + '\"] is set as enabled, but FEATURE flags are only available in canary builds.', !FEATURES[key], { id: 'ember-debug.feature-flag-with-features-stripped' });\n }\n }\n };\n\n // Complain if they're using FEATURE flags in builds other than canary\n FEATURES['features-stripped-test'] = true;\n var featuresWereStripped = true;\n\n if ((0, _features.default)('features-stripped-test')) {\n featuresWereStripped = false;\n }\n\n delete FEATURES['features-stripped-test'];\n _warnIfUsingStrippedFeatureFlags(_emberEnvironment.ENV.FEATURES, DEFAULT_FEATURES, featuresWereStripped);\n\n // Inform the developer about the Ember Inspector if not installed.\n var isFirefox = _emberEnvironment.environment.isFirefox;\n var isChrome = _emberEnvironment.environment.isChrome;\n\n if (typeof window !== 'undefined' && (isFirefox || isChrome) && window.addEventListener) {\n window.addEventListener('load', function () {\n if (document.documentElement && document.documentElement.dataset && !document.documentElement.dataset.emberExtension) {\n var downloadURL = void 0;\n\n if (isChrome) {\n downloadURL = 'https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi';\n } else if (isFirefox) {\n downloadURL = 'https://addons.mozilla.org/en-US/firefox/addon/ember-inspector/';\n }\n\n debug('For more advanced debugging, install the Ember Inspector from ' + downloadURL);\n }\n }, false);\n }\n }\n\n exports.assert = assert;\n exports.info = info;\n exports.warn = warn;\n exports.debug = debug;\n exports.deprecate = deprecate;\n exports.debugSeal = debugSeal;\n exports.debugFreeze = debugFreeze;\n exports.runInDebug = runInDebug;\n exports.deprecateFunc = deprecateFunc;\n exports.setDebugFunction = setDebugFunction;\n exports.getDebugFunction = getDebugFunction;\n exports._warnIfUsingStrippedFeatureFlags = _warnIfUsingStrippedFeatureFlags;\n});","enifed(\"ember-debug/testing\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.isTesting = isTesting;\n exports.setTesting = setTesting;\n var testing = false;\n\n function isTesting() {\n return testing;\n }\n\n function setTesting(value) {\n testing = !!value;\n }\n});","enifed('ember-debug/warn', ['exports', 'ember-environment', 'ember-console', 'ember-debug/deprecate', 'ember-debug/index', 'ember-debug/handlers'], function (exports, _emberEnvironment, _emberConsole, _deprecate, _index, _handlers) {\n 'use strict';\n\n exports.missingOptionsDeprecation = exports.missingOptionsIdDeprecation = exports.registerHandler = undefined;\n\n\n var registerHandler = function () {};\n var warn = function () {};\n var missingOptionsDeprecation = void 0,\n missingOptionsIdDeprecation = void 0;\n\n /**\n @module @ember/debug\n */\n\n if (true) {\n /**\n Allows for runtime registration of handler functions that override the default warning behavior.\n Warnings are invoked by calls made to [@ember/debug/warn](https://emberjs.com/api/ember/release/classes/@ember%2Fdebug/methods/warn?anchor=warn).\n The following example demonstrates its usage by registering a handler that does nothing overriding Ember's\n default warning behavior.\n ```javascript\n import { registerWarnHandler } from '@ember/debug';\n // next is not called, so no warnings get the default behavior\n registerWarnHandler(() => {});\n ```\n The handler function takes the following arguments:\n <ul>\n <li> <code>message</code> - The message received from the warn call. </li>\n <li> <code>options</code> - An object passed in with the warn call containing additional information including:</li>\n <ul>\n <li> <code>id</code> - An id of the warning in the form of <code>package-name.specific-warning</code>.</li>\n </ul>\n <li> <code>next</code> - A function that calls into the previously registered handler.</li>\n </ul>\n @public\n @static\n @method registerWarnHandler\n @for @ember/debug\n @param handler {Function} A function to handle warnings.\n @since 2.1.0\n */\n exports.registerHandler = registerHandler = function registerHandler(handler) {\n (0, _handlers.registerHandler)('warn', handler);\n };\n\n registerHandler(function logWarning(message) {\n _emberConsole.default.warn('WARNING: ' + message);\n if ('trace' in _emberConsole.default) {\n _emberConsole.default.trace();\n }\n });\n\n exports.missingOptionsDeprecation = missingOptionsDeprecation = 'When calling `warn` you ' + 'must provide an `options` hash as the third parameter. ' + '`options` should include an `id` property.';\n exports.missingOptionsIdDeprecation = missingOptionsIdDeprecation = 'When calling `warn` you must provide `id` in options.';\n\n /**\n Display a warning with the provided message.\n * In a production build, this method is defined as an empty function (NOP).\n Uses of this method in Ember itself are stripped from the ember.prod.js build.\n @method warn\n @for @ember/debug\n @static\n @param {String} message A warning to display.\n @param {Boolean} test An optional boolean. If falsy, the warning\n will be displayed.\n @param {Object} options An object that can be used to pass a unique\n `id` for this warning. The `id` can be used by Ember debugging tools\n to change the behavior (raise, log, or silence) for that specific warning.\n The `id` should be namespaced by dots, e.g. \"ember-debug.feature-flag-with-features-stripped\"\n @public\n @since 1.0.0\n */\n warn = function warn(message, test, options) {\n if (arguments.length === 2 && typeof test === 'object') {\n options = test;\n test = false;\n }\n\n if (_emberEnvironment.ENV._ENABLE_WARN_OPTIONS_SUPPORT !== true) {\n (0, _index.assert)(missingOptionsDeprecation, options);\n (0, _index.assert)(missingOptionsIdDeprecation, options && options.id);\n }\n\n if (!options && _emberEnvironment.ENV._ENABLE_WARN_OPTIONS_SUPPORT === true) {\n (0, _deprecate.default)(missingOptionsDeprecation, false, {\n id: 'ember-debug.warn-options-missing',\n until: '3.0.0',\n url: 'https://emberjs.com/deprecations/v2.x/#toc_ember-debug-function-options'\n });\n }\n\n if (options && !options.id && _emberEnvironment.ENV._ENABLE_WARN_OPTIONS_SUPPORT === true) {\n (0, _deprecate.default)(missingOptionsIdDeprecation, false, {\n id: 'ember-debug.warn-id-missing',\n until: '3.0.0',\n url: 'https://emberjs.com/deprecations/v2.x/#toc_ember-debug-function-options'\n });\n }\n\n (0, _handlers.invoke)('warn', message, test, options);\n };\n }\n\n exports.default = warn;\n exports.registerHandler = registerHandler;\n exports.missingOptionsIdDeprecation = missingOptionsIdDeprecation;\n exports.missingOptionsDeprecation = missingOptionsDeprecation;\n});","enifed('ember-testing/adapters/adapter', ['exports', 'ember-runtime'], function (exports, _emberRuntime) {\n 'use strict';\n\n function K() {\n return this;\n }\n\n /**\n @module @ember/test\n */\n\n /**\n The primary purpose of this class is to create hooks that can be implemented\n by an adapter for various test frameworks.\n \n @class TestAdapter\n @public\n */\n exports.default = _emberRuntime.Object.extend({\n /**\n This callback will be called whenever an async operation is about to start.\n Override this to call your framework's methods that handle async\n operations.\n @public\n @method asyncStart\n */\n asyncStart: K,\n\n /**\n This callback will be called whenever an async operation has completed.\n @public\n @method asyncEnd\n */\n asyncEnd: K,\n\n /**\n Override this method with your testing framework's false assertion.\n This function is called whenever an exception occurs causing the testing\n promise to fail.\n QUnit example:\n ```javascript\n exception: function(error) {\n ok(false, error);\n };\n ```\n @public\n @method exception\n @param {String} error The exception to be raised.\n */\n exception: function (error) {\n throw error;\n }\n });\n});","enifed('ember-testing/adapters/qunit', ['exports', 'ember-utils', 'ember-testing/adapters/adapter'], function (exports, _emberUtils, _adapter) {\n 'use strict';\n\n exports.default = _adapter.default.extend({\n asyncStart: function () {\n QUnit.stop();\n },\n asyncEnd: function () {\n QUnit.start();\n },\n exception: function (error) {\n QUnit.config.current.assert.ok(false, (0, _emberUtils.inspect)(error));\n }\n });\n});","enifed('ember-testing/events', ['exports', 'ember-views', 'ember-metal'], function (exports, _emberViews, _emberMetal) {\n 'use strict';\n\n exports.focus = focus;\n exports.fireEvent = fireEvent;\n\n\n var DEFAULT_EVENT_OPTIONS = { canBubble: true, cancelable: true };\n var KEYBOARD_EVENT_TYPES = ['keydown', 'keypress', 'keyup'];\n var MOUSE_EVENT_TYPES = ['click', 'mousedown', 'mouseup', 'dblclick', 'mouseenter', 'mouseleave', 'mousemove', 'mouseout', 'mouseover'];\n\n function focus(el) {\n if (!el) {\n return;\n }\n var $el = (0, _emberViews.jQuery)(el);\n if ($el.is(':input, [contenteditable=true]')) {\n var type = $el.prop('type');\n if (type !== 'checkbox' && type !== 'radio' && type !== 'hidden') {\n (0, _emberMetal.run)(null, function () {\n // Firefox does not trigger the `focusin` event if the window\n // does not have focus. If the document doesn't have focus just\n // use trigger('focusin') instead.\n\n if (!document.hasFocus || document.hasFocus()) {\n el.focus();\n } else {\n $el.trigger('focusin');\n }\n });\n }\n }\n }\n\n function fireEvent(element, type) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n if (!element) {\n return;\n }\n var event = void 0;\n if (KEYBOARD_EVENT_TYPES.indexOf(type) > -1) {\n event = buildKeyboardEvent(type, options);\n } else if (MOUSE_EVENT_TYPES.indexOf(type) > -1) {\n var rect = element.getBoundingClientRect();\n var x = rect.left + 1;\n var y = rect.top + 1;\n var simulatedCoordinates = {\n screenX: x + 5,\n screenY: y + 95,\n clientX: x,\n clientY: y\n };\n event = buildMouseEvent(type, _emberViews.jQuery.extend(simulatedCoordinates, options));\n } else {\n event = buildBasicEvent(type, options);\n }\n element.dispatchEvent(event);\n }\n\n function buildBasicEvent(type) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n var event = document.createEvent('Events');\n event.initEvent(type, true, true);\n _emberViews.jQuery.extend(event, options);\n return event;\n }\n\n function buildMouseEvent(type) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n var event = void 0;\n try {\n event = document.createEvent('MouseEvents');\n var eventOpts = _emberViews.jQuery.extend({}, DEFAULT_EVENT_OPTIONS, options);\n event.initMouseEvent(type, eventOpts.canBubble, eventOpts.cancelable, window, eventOpts.detail, eventOpts.screenX, eventOpts.screenY, eventOpts.clientX, eventOpts.clientY, eventOpts.ctrlKey, eventOpts.altKey, eventOpts.shiftKey, eventOpts.metaKey, eventOpts.button, eventOpts.relatedTarget);\n } catch (e) {\n event = buildBasicEvent(type, options);\n }\n return event;\n }\n\n function buildKeyboardEvent(type) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n var event = void 0;\n try {\n event = document.createEvent('KeyEvents');\n var eventOpts = _emberViews.jQuery.extend({}, DEFAULT_EVENT_OPTIONS, options);\n event.initKeyEvent(type, eventOpts.canBubble, eventOpts.cancelable, window, eventOpts.ctrlKey, eventOpts.altKey, eventOpts.shiftKey, eventOpts.metaKey, eventOpts.keyCode, eventOpts.charCode);\n } catch (e) {\n event = buildBasicEvent(type, options);\n }\n return event;\n }\n});","enifed('ember-testing/ext/application', ['ember-application', 'ember-testing/setup_for_testing', 'ember-testing/test/helpers', 'ember-testing/test/promise', 'ember-testing/test/run', 'ember-testing/test/on_inject_helpers', 'ember-testing/test/adapter'], function (_emberApplication, _setup_for_testing, _helpers, _promise, _run, _on_inject_helpers, _adapter) {\n 'use strict';\n\n _emberApplication.Application.reopen({\n /**\n This property contains the testing helpers for the current application. These\n are created once you call `injectTestHelpers` on your `Application`\n instance. The included helpers are also available on the `window` object by\n default, but can be used from this object on the individual application also.\n @property testHelpers\n @type {Object}\n @default {}\n @public\n */\n testHelpers: {},\n\n /**\n This property will contain the original methods that were registered\n on the `helperContainer` before `injectTestHelpers` is called.\n When `removeTestHelpers` is called, these methods are restored to the\n `helperContainer`.\n @property originalMethods\n @type {Object}\n @default {}\n @private\n @since 1.3.0\n */\n originalMethods: {},\n\n /**\n This property indicates whether or not this application is currently in\n testing mode. This is set when `setupForTesting` is called on the current\n application.\n @property testing\n @type {Boolean}\n @default false\n @since 1.3.0\n @public\n */\n testing: false,\n\n setupForTesting: function () {\n (0, _setup_for_testing.default)();\n\n this.testing = true;\n\n this.resolveRegistration('router:main').reopen({\n location: 'none'\n });\n },\n\n\n /**\n This will be used as the container to inject the test helpers into. By\n default the helpers are injected into `window`.\n @property helperContainer\n @type {Object} The object to be used for test helpers.\n @default window\n @since 1.2.0\n @private\n */\n helperContainer: null,\n\n injectTestHelpers: function (helperContainer) {\n if (helperContainer) {\n this.helperContainer = helperContainer;\n } else {\n this.helperContainer = window;\n }\n\n this.reopen({\n willDestroy: function () {\n this._super.apply(this, arguments);\n this.removeTestHelpers();\n }\n });\n\n this.testHelpers = {};\n for (var name in _helpers.helpers) {\n this.originalMethods[name] = this.helperContainer[name];\n this.testHelpers[name] = this.helperContainer[name] = helper(this, name);\n protoWrap(_promise.default.prototype, name, helper(this, name), _helpers.helpers[name].meta.wait);\n }\n\n (0, _on_inject_helpers.invokeInjectHelpersCallbacks)(this);\n },\n removeTestHelpers: function () {\n if (!this.helperContainer) {\n return;\n }\n\n for (var name in _helpers.helpers) {\n this.helperContainer[name] = this.originalMethods[name];\n delete _promise.default.prototype[name];\n delete this.testHelpers[name];\n delete this.originalMethods[name];\n }\n }\n });\n\n // This method is no longer needed\n // But still here for backwards compatibility\n // of helper chaining\n function protoWrap(proto, name, callback, isAsync) {\n proto[name] = function () {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n if (isAsync) {\n return callback.apply(this, args);\n } else {\n return this.then(function () {\n return callback.apply(this, args);\n });\n }\n };\n }\n\n function helper(app, name) {\n var fn = _helpers.helpers[name].method;\n var meta = _helpers.helpers[name].meta;\n if (!meta.wait) {\n return function () {\n for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n return fn.apply(app, [app].concat(args));\n };\n }\n\n return function () {\n for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n args[_key3] = arguments[_key3];\n }\n\n var lastPromise = (0, _run.default)(function () {\n return (0, _promise.resolve)((0, _promise.getLastPromise)());\n });\n\n // wait for last helper's promise to resolve and then\n // execute. To be safe, we need to tell the adapter we're going\n // asynchronous here, because fn may not be invoked before we\n // return.\n (0, _adapter.asyncStart)();\n return lastPromise.then(function () {\n return fn.apply(app, [app].concat(args));\n }).finally(_adapter.asyncEnd);\n };\n }\n});","enifed('ember-testing/ext/rsvp', ['exports', 'ember-runtime', 'ember-metal', 'ember-debug', 'ember-testing/test/adapter'], function (exports, _emberRuntime, _emberMetal, _emberDebug, _adapter) {\n 'use strict';\n\n _emberRuntime.RSVP.configure('async', function (callback, promise) {\n // if schedule will cause autorun, we need to inform adapter\n if ((0, _emberDebug.isTesting)() && !_emberMetal.run.backburner.currentInstance) {\n (0, _adapter.asyncStart)();\n _emberMetal.run.backburner.schedule('actions', function () {\n (0, _adapter.asyncEnd)();\n callback(promise);\n });\n } else {\n _emberMetal.run.backburner.schedule('actions', function () {\n return callback(promise);\n });\n }\n });\n\n exports.default = _emberRuntime.RSVP;\n});","enifed('ember-testing/helpers', ['ember-testing/test/helpers', 'ember-testing/helpers/and_then', 'ember-testing/helpers/click', 'ember-testing/helpers/current_path', 'ember-testing/helpers/current_route_name', 'ember-testing/helpers/current_url', 'ember-testing/helpers/fill_in', 'ember-testing/helpers/find', 'ember-testing/helpers/find_with_assert', 'ember-testing/helpers/key_event', 'ember-testing/helpers/pause_test', 'ember-testing/helpers/trigger_event', 'ember-testing/helpers/visit', 'ember-testing/helpers/wait'], function (_helpers, _and_then, _click, _current_path, _current_route_name, _current_url, _fill_in, _find, _find_with_assert, _key_event, _pause_test, _trigger_event, _visit, _wait) {\n 'use strict';\n\n (0, _helpers.registerAsyncHelper)('visit', _visit.default);\n (0, _helpers.registerAsyncHelper)('click', _click.default);\n (0, _helpers.registerAsyncHelper)('keyEvent', _key_event.default);\n (0, _helpers.registerAsyncHelper)('fillIn', _fill_in.default);\n (0, _helpers.registerAsyncHelper)('wait', _wait.default);\n (0, _helpers.registerAsyncHelper)('andThen', _and_then.default);\n (0, _helpers.registerAsyncHelper)('pauseTest', _pause_test.pauseTest);\n (0, _helpers.registerAsyncHelper)('triggerEvent', _trigger_event.default);\n\n (0, _helpers.registerHelper)('find', _find.default);\n (0, _helpers.registerHelper)('findWithAssert', _find_with_assert.default);\n (0, _helpers.registerHelper)('currentRouteName', _current_route_name.default);\n (0, _helpers.registerHelper)('currentPath', _current_path.default);\n (0, _helpers.registerHelper)('currentURL', _current_url.default);\n (0, _helpers.registerHelper)('resumeTest', _pause_test.resumeTest);\n});","enifed(\"ember-testing/helpers/and_then\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.default = andThen;\n function andThen(app, callback) {\n return app.testHelpers.wait(callback(app));\n }\n});","enifed('ember-testing/helpers/click', ['exports', 'ember-testing/events'], function (exports, _events) {\n 'use strict';\n\n exports.default = click;\n\n\n /**\n Clicks an element and triggers any actions triggered by the element's `click`\n event.\n \n Example:\n \n ```javascript\n click('.some-jQuery-selector').then(function() {\n // assert something\n });\n ```\n \n @method click\n @param {String} selector jQuery selector for finding element on the DOM\n @param {Object} context A DOM Element, Document, or jQuery to use as context\n @return {RSVP.Promise<undefined>}\n @public\n */\n function click(app, selector, context) {\n var $el = app.testHelpers.findWithAssert(selector, context);\n var el = $el[0];\n\n (0, _events.fireEvent)(el, 'mousedown');\n\n (0, _events.focus)(el);\n\n (0, _events.fireEvent)(el, 'mouseup');\n (0, _events.fireEvent)(el, 'click');\n\n return app.testHelpers.wait();\n } /**\n @module ember\n */\n});","enifed('ember-testing/helpers/current_path', ['exports', 'ember-metal'], function (exports, _emberMetal) {\n 'use strict';\n\n exports.default = currentPath;\n\n\n /**\n Returns the current path.\n \n Example:\n \n ```javascript\n function validateURL() {\n equal(currentPath(), 'some.path.index', \"correct path was transitioned into.\");\n }\n \n click('#some-link-id').then(validateURL);\n ```\n \n @method currentPath\n @return {Object} The currently active path.\n @since 1.5.0\n @public\n */\n function currentPath(app) {\n var routingService = app.__container__.lookup('service:-routing');\n return (0, _emberMetal.get)(routingService, 'currentPath');\n } /**\n @module ember\n */\n});","enifed('ember-testing/helpers/current_route_name', ['exports', 'ember-metal'], function (exports, _emberMetal) {\n 'use strict';\n\n exports.default = currentRouteName;\n\n /**\n Returns the currently active route name.\n \n Example:\n \n ```javascript\n function validateRouteName() {\n equal(currentRouteName(), 'some.path', \"correct route was transitioned into.\");\n }\n visit('/some/path').then(validateRouteName)\n ```\n \n @method currentRouteName\n @return {Object} The name of the currently active route.\n @since 1.5.0\n @public\n */\n function currentRouteName(app) {\n var routingService = app.__container__.lookup('service:-routing');\n return (0, _emberMetal.get)(routingService, 'currentRouteName');\n } /**\n @module ember\n */\n});","enifed('ember-testing/helpers/current_url', ['exports', 'ember-metal'], function (exports, _emberMetal) {\n 'use strict';\n\n exports.default = currentURL;\n\n\n /**\n Returns the current URL.\n \n Example:\n \n ```javascript\n function validateURL() {\n equal(currentURL(), '/some/path', \"correct URL was transitioned into.\");\n }\n \n click('#some-link-id').then(validateURL);\n ```\n \n @method currentURL\n @return {Object} The currently active URL.\n @since 1.5.0\n @public\n */\n function currentURL(app) {\n var router = app.__container__.lookup('router:main');\n return (0, _emberMetal.get)(router, 'location').getURL();\n } /**\n @module ember\n */\n});","enifed('ember-testing/helpers/fill_in', ['exports', 'ember-testing/events'], function (exports, _events) {\n 'use strict';\n\n exports.default = fillIn;\n\n\n /**\n Fills in an input element with some text.\n \n Example:\n \n ```javascript\n fillIn('#email', 'you@example.com').then(function() {\n // assert something\n });\n ```\n \n @method fillIn\n @param {String} selector jQuery selector finding an input element on the DOM\n to fill text with\n @param {String} text text to place inside the input element\n @return {RSVP.Promise<undefined>}\n @public\n */\n function fillIn(app, selector, contextOrText, text) {\n var $el = void 0,\n el = void 0,\n context = void 0;\n if (text === undefined) {\n text = contextOrText;\n } else {\n context = contextOrText;\n }\n $el = app.testHelpers.findWithAssert(selector, context);\n el = $el[0];\n (0, _events.focus)(el);\n\n $el.eq(0).val(text);\n (0, _events.fireEvent)(el, 'input');\n (0, _events.fireEvent)(el, 'change');\n\n return app.testHelpers.wait();\n } /**\n @module ember\n */\n});","enifed('ember-testing/helpers/find', ['exports', 'ember-metal'], function (exports, _emberMetal) {\n 'use strict';\n\n exports.default = find;\n\n\n /**\n Finds an element in the context of the app's container element. A simple alias\n for `app.$(selector)`.\n \n Example:\n \n ```javascript\n var $el = find('.my-selector');\n ```\n \n With the `context` param:\n \n ```javascript\n var $el = find('.my-selector', '.parent-element-class');\n ```\n \n @method find\n @param {String} selector jQuery string selector for element lookup\n @param {String} [context] (optional) jQuery selector that will limit the selector\n argument to find only within the context's children\n @return {Object} jQuery object representing the results of the query\n @public\n */\n function find(app, selector, context) {\n var $el = void 0;\n context = context || (0, _emberMetal.get)(app, 'rootElement');\n $el = app.$(selector, context);\n return $el;\n } /**\n @module ember\n */\n});","enifed('ember-testing/helpers/find_with_assert', ['exports'], function (exports) {\n 'use strict';\n\n exports.default = findWithAssert;\n /**\n @module ember\n */\n /**\n Like `find`, but throws an error if the element selector returns no results.\n \n Example:\n \n ```javascript\n var $el = findWithAssert('.doesnt-exist'); // throws error\n ```\n \n With the `context` param:\n \n ```javascript\n var $el = findWithAssert('.selector-id', '.parent-element-class'); // assert will pass\n ```\n \n @method findWithAssert\n @param {String} selector jQuery selector string for finding an element within\n the DOM\n @param {String} [context] (optional) jQuery selector that will limit the\n selector argument to find only within the context's children\n @return {Object} jQuery object representing the results of the query\n @throws {Error} throws error if jQuery object returned has a length of 0\n @public\n */\n function findWithAssert(app, selector, context) {\n var $el = app.testHelpers.find(selector, context);\n if ($el.length === 0) {\n throw new Error('Element ' + selector + ' not found.');\n }\n return $el;\n }\n});","enifed(\"ember-testing/helpers/key_event\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.default = keyEvent;\n /**\n @module ember\n */\n /**\n Simulates a key event, e.g. `keypress`, `keydown`, `keyup` with the desired keyCode\n Example:\n ```javascript\n keyEvent('.some-jQuery-selector', 'keypress', 13).then(function() {\n // assert something\n });\n ```\n @method keyEvent\n @param {String} selector jQuery selector for finding element on the DOM\n @param {String} type the type of key event, e.g. `keypress`, `keydown`, `keyup`\n @param {Number} keyCode the keyCode of the simulated key event\n @return {RSVP.Promise<undefined>}\n @since 1.5.0\n @public\n */\n function keyEvent(app, selector, contextOrType, typeOrKeyCode, keyCode) {\n var context = void 0,\n type = void 0;\n\n if (keyCode === undefined) {\n context = null;\n keyCode = typeOrKeyCode;\n type = contextOrType;\n } else {\n context = contextOrType;\n type = typeOrKeyCode;\n }\n\n return app.testHelpers.triggerEvent(selector, context, type, { keyCode: keyCode, which: keyCode });\n }\n});","enifed('ember-testing/helpers/pause_test', ['exports', 'ember-runtime', 'ember-console', 'ember-debug'], function (exports, _emberRuntime, _emberConsole, _emberDebug) {\n 'use strict';\n\n exports.resumeTest = resumeTest;\n exports.pauseTest = pauseTest;\n\n\n var resume = void 0;\n\n /**\n Resumes a test paused by `pauseTest`.\n \n @method resumeTest\n @return {void}\n @public\n */\n /**\n @module ember\n */\n function resumeTest() {\n (true && !(resume) && (0, _emberDebug.assert)('Testing has not been paused. There is nothing to resume.', resume));\n\n resume();\n resume = undefined;\n }\n\n /**\n Pauses the current test - this is useful for debugging while testing or for test-driving.\n It allows you to inspect the state of your application at any point.\n Example (The test will pause before clicking the button):\n \n ```javascript\n visit('/')\n return pauseTest();\n click('.btn');\n ```\n \n You may want to turn off the timeout before pausing.\n \n qunit (as of 2.4.0):\n \n ```\n visit('/');\n assert.timeout(0);\n return pauseTest();\n click('.btn');\n ```\n \n mocha:\n \n ```\n visit('/');\n this.timeout(0);\n return pauseTest();\n click('.btn');\n ```\n \n \n @since 1.9.0\n @method pauseTest\n @return {Object} A promise that will never resolve\n @public\n */\n function pauseTest() {\n _emberConsole.default.info('Testing paused. Use `resumeTest()` to continue.');\n\n return new _emberRuntime.RSVP.Promise(function (resolve) {\n resume = resolve;\n }, 'TestAdapter paused promise');\n }\n});","enifed('ember-testing/helpers/trigger_event', ['exports', 'ember-testing/events'], function (exports, _events) {\n 'use strict';\n\n exports.default = triggerEvent;\n\n /**\n Triggers the given DOM event on the element identified by the provided selector.\n Example:\n ```javascript\n triggerEvent('#some-elem-id', 'blur');\n ```\n This is actually used internally by the `keyEvent` helper like so:\n ```javascript\n triggerEvent('#some-elem-id', 'keypress', { keyCode: 13 });\n ```\n @method triggerEvent\n @param {String} selector jQuery selector for finding element on the DOM\n @param {String} [context] jQuery selector that will limit the selector\n argument to find only within the context's children\n @param {String} type The event type to be triggered.\n @param {Object} [options] The options to be passed to jQuery.Event.\n @return {RSVP.Promise<undefined>}\n @since 1.5.0\n @public\n */\n function triggerEvent(app, selector, contextOrType, typeOrOptions, possibleOptions) {\n var arity = arguments.length;\n var context = void 0,\n type = void 0,\n options = void 0;\n\n if (arity === 3) {\n // context and options are optional, so this is\n // app, selector, type\n context = null;\n type = contextOrType;\n options = {};\n } else if (arity === 4) {\n // context and options are optional, so this is\n if (typeof typeOrOptions === 'object') {\n // either\n // app, selector, type, options\n context = null;\n type = contextOrType;\n options = typeOrOptions;\n } else {\n // or\n // app, selector, context, type\n context = contextOrType;\n type = typeOrOptions;\n options = {};\n }\n } else {\n context = contextOrType;\n type = typeOrOptions;\n options = possibleOptions;\n }\n\n var $el = app.testHelpers.findWithAssert(selector, context);\n var el = $el[0];\n\n (0, _events.fireEvent)(el, type, options);\n\n return app.testHelpers.wait();\n } /**\n @module ember\n */\n});","enifed('ember-testing/helpers/visit', ['exports', 'ember-metal'], function (exports, _emberMetal) {\n 'use strict';\n\n exports.default = visit;\n\n\n /**\n Loads a route, sets up any controllers, and renders any templates associated\n with the route as though a real user had triggered the route change while\n using your app.\n \n Example:\n \n ```javascript\n visit('posts/index').then(function() {\n // assert something\n });\n ```\n \n @method visit\n @param {String} url the name of the route\n @return {RSVP.Promise<undefined>}\n @public\n */\n function visit(app, url) {\n var router = app.__container__.lookup('router:main');\n var shouldHandleURL = false;\n\n app.boot().then(function () {\n router.location.setURL(url);\n\n if (shouldHandleURL) {\n (0, _emberMetal.run)(app.__deprecatedInstance__, 'handleURL', url);\n }\n });\n\n if (app._readinessDeferrals > 0) {\n router['initialURL'] = url;\n (0, _emberMetal.run)(app, 'advanceReadiness');\n delete router['initialURL'];\n } else {\n shouldHandleURL = true;\n }\n\n return app.testHelpers.wait();\n } /**\n @module ember\n */\n});","enifed('ember-testing/helpers/wait', ['exports', 'ember-testing/test/waiters', 'ember-runtime', 'ember-metal', 'ember-testing/test/pending_requests'], function (exports, _waiters, _emberRuntime, _emberMetal, _pending_requests) {\n 'use strict';\n\n exports.default = wait;\n\n\n /**\n Causes the run loop to process any pending events. This is used to ensure that\n any async operations from other helpers (or your assertions) have been processed.\n \n This is most often used as the return value for the helper functions (see 'click',\n 'fillIn','visit',etc). However, there is a method to register a test helper which\n utilizes this method without the need to actually call `wait()` in your helpers.\n \n The `wait` helper is built into `registerAsyncHelper` by default. You will not need\n to `return app.testHelpers.wait();` - the wait behavior is provided for you.\n \n Example:\n \n ```javascript\n import { registerAsyncHelper } from '@ember/test';\n \n registerAsyncHelper('loginUser', function(app, username, password) {\n visit('secured/path/here')\n .fillIn('#username', username)\n .fillIn('#password', password)\n .click('.submit');\n });\n ```\n \n @method wait\n @param {Object} value The value to be returned.\n @return {RSVP.Promise<any>} Promise that resolves to the passed value.\n @public\n @since 1.0.0\n */\n /**\n @module ember\n */\n function wait(app, value) {\n return new _emberRuntime.RSVP.Promise(function (resolve) {\n var router = app.__container__.lookup('router:main');\n\n // Every 10ms, poll for the async thing to have finished\n var watcher = setInterval(function () {\n // 1. If the router is loading, keep polling\n var routerIsLoading = router._routerMicrolib && !!router._routerMicrolib.activeTransition;\n if (routerIsLoading) {\n return;\n }\n\n // 2. If there are pending Ajax requests, keep polling\n if ((0, _pending_requests.pendingRequests)()) {\n return;\n }\n\n // 3. If there are scheduled timers or we are inside of a run loop, keep polling\n if (_emberMetal.run.hasScheduledTimers() || _emberMetal.run.currentRunLoop) {\n return;\n }\n\n if ((0, _waiters.checkWaiters)()) {\n return;\n }\n\n // Stop polling\n clearInterval(watcher);\n\n // Synchronously resolve the promise\n (0, _emberMetal.run)(null, resolve, value);\n }, 10);\n });\n }\n});","enifed('ember-testing/index', ['exports', 'ember-testing/test', 'ember-testing/adapters/adapter', 'ember-testing/setup_for_testing', 'ember-testing/adapters/qunit', 'ember-testing/support', 'ember-testing/ext/application', 'ember-testing/ext/rsvp', 'ember-testing/helpers', 'ember-testing/initializers'], function (exports, _test, _adapter, _setup_for_testing, _qunit) {\n 'use strict';\n\n exports.QUnitAdapter = exports.setupForTesting = exports.Adapter = exports.Test = undefined;\n Object.defineProperty(exports, 'Test', {\n enumerable: true,\n get: function () {\n return _test.default;\n }\n });\n Object.defineProperty(exports, 'Adapter', {\n enumerable: true,\n get: function () {\n return _adapter.default;\n }\n });\n Object.defineProperty(exports, 'setupForTesting', {\n enumerable: true,\n get: function () {\n return _setup_for_testing.default;\n }\n });\n Object.defineProperty(exports, 'QUnitAdapter', {\n enumerable: true,\n get: function () {\n return _qunit.default;\n }\n });\n});","enifed('ember-testing/initializers', ['ember-runtime'], function (_emberRuntime) {\n 'use strict';\n\n var name = 'deferReadiness in `testing` mode';\n\n (0, _emberRuntime.onLoad)('Ember.Application', function (Application) {\n if (!Application.initializers[name]) {\n Application.initializer({\n name: name,\n\n initialize: function (application) {\n if (application.testing) {\n application.deferReadiness();\n }\n }\n });\n }\n });\n});","enifed('ember-testing/setup_for_testing', ['exports', 'ember-debug', 'ember-views', 'ember-testing/test/adapter', 'ember-testing/test/pending_requests', 'ember-testing/adapters/adapter', 'ember-testing/adapters/qunit'], function (exports, _emberDebug, _emberViews, _adapter, _pending_requests, _adapter2, _qunit) {\n 'use strict';\n\n exports.default = setupForTesting;\n\n\n /**\n Sets Ember up for testing. This is useful to perform\n basic setup steps in order to unit test.\n \n Use `App.setupForTesting` to perform integration tests (full\n application testing).\n \n @method setupForTesting\n @namespace Ember\n @since 1.5.0\n @private\n */\n /* global self */\n\n function setupForTesting() {\n (0, _emberDebug.setTesting)(true);\n\n var adapter = (0, _adapter.getAdapter)();\n // if adapter is not manually set default to QUnit\n if (!adapter) {\n (0, _adapter.setAdapter)(typeof self.QUnit === 'undefined' ? new _adapter2.default() : new _qunit.default());\n }\n\n if (_emberViews.jQuery) {\n (0, _emberViews.jQuery)(document).off('ajaxSend', _pending_requests.incrementPendingRequests);\n (0, _emberViews.jQuery)(document).off('ajaxComplete', _pending_requests.decrementPendingRequests);\n\n (0, _pending_requests.clearPendingRequests)();\n\n (0, _emberViews.jQuery)(document).on('ajaxSend', _pending_requests.incrementPendingRequests);\n (0, _emberViews.jQuery)(document).on('ajaxComplete', _pending_requests.decrementPendingRequests);\n }\n }\n});","enifed('ember-testing/support', ['ember-debug', 'ember-views', 'ember-environment'], function (_emberDebug, _emberViews, _emberEnvironment) {\n 'use strict';\n\n /**\n @module ember\n */\n\n var $ = _emberViews.jQuery;\n\n /**\n This method creates a checkbox and triggers the click event to fire the\n passed in handler. It is used to correct for a bug in older versions\n of jQuery (e.g 1.8.3).\n \n @private\n @method testCheckboxClick\n */\n function testCheckboxClick(handler) {\n var input = document.createElement('input');\n $(input).attr('type', 'checkbox').css({ position: 'absolute', left: '-1000px', top: '-1000px' }).appendTo('body').on('click', handler).trigger('click').remove();\n }\n\n if (_emberEnvironment.environment.hasDOM && typeof $ === 'function') {\n $(function () {\n /*\n Determine whether a checkbox checked using jQuery's \"click\" method will have\n the correct value for its checked property.\n If we determine that the current jQuery version exhibits this behavior,\n patch it to work correctly as in the commit for the actual fix:\n https://github.com/jquery/jquery/commit/1fb2f92.\n */\n testCheckboxClick(function () {\n if (!this.checked && !$.event.special.click) {\n $.event.special.click = {\n trigger: function () {\n if ($.nodeName(this, 'input') && this.type === 'checkbox' && this.click) {\n this.click();\n return false;\n }\n }\n };\n }\n });\n\n // Try again to verify that the patch took effect or blow up.\n testCheckboxClick(function () {\n (true && (0, _emberDebug.warn)('clicked checkboxes should be checked! the jQuery patch didn\\'t work', this.checked, { id: 'ember-testing.test-checkbox-click' }));\n });\n });\n }\n});","enifed('ember-testing/test', ['exports', 'ember-testing/test/helpers', 'ember-testing/test/on_inject_helpers', 'ember-testing/test/promise', 'ember-testing/test/waiters', 'ember-testing/test/adapter'], function (exports, _helpers, _on_inject_helpers, _promise, _waiters, _adapter) {\n 'use strict';\n\n /**\n This is a container for an assortment of testing related functionality:\n \n * Choose your default test adapter (for your framework of choice).\n * Register/Unregister additional test helpers.\n * Setup callbacks to be fired when the test helpers are injected into\n your application.\n \n @class Test\n @namespace Ember\n @public\n */\n var Test = {\n /**\n Hash containing all known test helpers.\n @property _helpers\n @private\n @since 1.7.0\n */\n _helpers: _helpers.helpers,\n\n registerHelper: _helpers.registerHelper,\n registerAsyncHelper: _helpers.registerAsyncHelper,\n unregisterHelper: _helpers.unregisterHelper,\n onInjectHelpers: _on_inject_helpers.onInjectHelpers,\n Promise: _promise.default,\n promise: _promise.promise,\n resolve: _promise.resolve,\n registerWaiter: _waiters.registerWaiter,\n unregisterWaiter: _waiters.unregisterWaiter,\n checkWaiters: _waiters.checkWaiters\n };\n\n /**\n Used to allow ember-testing to communicate with a specific testing\n framework.\n \n You can manually set it before calling `App.setupForTesting()`.\n \n Example:\n \n ```javascript\n Ember.Test.adapter = MyCustomAdapter.create()\n ```\n \n If you do not set it, ember-testing will default to `Ember.Test.QUnitAdapter`.\n \n @public\n @for Ember.Test\n @property adapter\n @type {Class} The adapter to be used.\n @default Ember.Test.QUnitAdapter\n */\n /**\n @module ember\n */\n Object.defineProperty(Test, 'adapter', {\n get: _adapter.getAdapter,\n set: _adapter.setAdapter\n });\n\n exports.default = Test;\n});","enifed('ember-testing/test/adapter', ['exports', 'ember-console', 'ember-metal'], function (exports, _emberConsole, _emberMetal) {\n 'use strict';\n\n exports.getAdapter = getAdapter;\n exports.setAdapter = setAdapter;\n exports.asyncStart = asyncStart;\n exports.asyncEnd = asyncEnd;\n\n\n var adapter = void 0;\n function getAdapter() {\n return adapter;\n }\n\n function setAdapter(value) {\n adapter = value;\n if (value && typeof value.exception === 'function') {\n (0, _emberMetal.setDispatchOverride)(adapterDispatch);\n } else {\n (0, _emberMetal.setDispatchOverride)(null);\n }\n }\n\n function asyncStart() {\n if (adapter) {\n adapter.asyncStart();\n }\n }\n\n function asyncEnd() {\n if (adapter) {\n adapter.asyncEnd();\n }\n }\n\n function adapterDispatch(error) {\n adapter.exception(error);\n _emberConsole.default.error(error.stack);\n }\n});","enifed('ember-testing/test/helpers', ['exports', 'ember-testing/test/promise'], function (exports, _promise) {\n 'use strict';\n\n exports.helpers = undefined;\n exports.registerHelper = registerHelper;\n exports.registerAsyncHelper = registerAsyncHelper;\n exports.unregisterHelper = unregisterHelper;\n var helpers = exports.helpers = {};\n /**\n @module @ember/test\n */\n\n /**\n `registerHelper` is used to register a test helper that will be injected\n when `App.injectTestHelpers` is called.\n \n The helper method will always be called with the current Application as\n the first parameter.\n \n For example:\n \n ```javascript\n import { registerHelper } from '@ember/test';\n import { run } from '@ember/runloop';\n \n registerHelper('boot', function(app) {\n run(app, app.advanceReadiness);\n });\n ```\n \n This helper can later be called without arguments because it will be\n called with `app` as the first parameter.\n \n ```javascript\n import Application from '@ember/application';\n \n App = Application.create();\n App.injectTestHelpers();\n boot();\n ```\n \n @public\n @for @ember/test\n @static\n @method registerHelper\n @param {String} name The name of the helper method to add.\n @param {Function} helperMethod\n @param options {Object}\n */\n function registerHelper(name, helperMethod) {\n helpers[name] = {\n method: helperMethod,\n meta: { wait: false }\n };\n }\n\n /**\n `registerAsyncHelper` is used to register an async test helper that will be injected\n when `App.injectTestHelpers` is called.\n \n The helper method will always be called with the current Application as\n the first parameter.\n \n For example:\n \n ```javascript\n import { registerAsyncHelper } from '@ember/test';\n import { run } from '@ember/runloop';\n \n registerAsyncHelper('boot', function(app) {\n run(app, app.advanceReadiness);\n });\n ```\n \n The advantage of an async helper is that it will not run\n until the last async helper has completed. All async helpers\n after it will wait for it complete before running.\n \n \n For example:\n \n ```javascript\n import { registerAsyncHelper } from '@ember/test';\n \n registerAsyncHelper('deletePost', function(app, postId) {\n click('.delete-' + postId);\n });\n \n // ... in your test\n visit('/post/2');\n deletePost(2);\n visit('/post/3');\n deletePost(3);\n ```\n \n @public\n @for @ember/test\n @method registerAsyncHelper\n @param {String} name The name of the helper method to add.\n @param {Function} helperMethod\n @since 1.2.0\n */\n function registerAsyncHelper(name, helperMethod) {\n helpers[name] = {\n method: helperMethod,\n meta: { wait: true }\n };\n }\n\n /**\n Remove a previously added helper method.\n \n Example:\n \n ```javascript\n import { unregisterHelper } from '@ember/test';\n \n unregisterHelper('wait');\n ```\n \n @public\n @method unregisterHelper\n @static\n @for @ember/test\n @param {String} name The helper to remove.\n */\n function unregisterHelper(name) {\n delete helpers[name];\n delete _promise.default.prototype[name];\n }\n});","enifed(\"ember-testing/test/on_inject_helpers\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.onInjectHelpers = onInjectHelpers;\n exports.invokeInjectHelpersCallbacks = invokeInjectHelpersCallbacks;\n var callbacks = exports.callbacks = [];\n\n /**\n Used to register callbacks to be fired whenever `App.injectTestHelpers`\n is called.\n \n The callback will receive the current application as an argument.\n \n Example:\n \n ```javascript\n import $ from 'jquery';\n \n Ember.Test.onInjectHelpers(function() {\n $(document).ajaxSend(function() {\n Test.pendingRequests++;\n });\n \n $(document).ajaxComplete(function() {\n Test.pendingRequests--;\n });\n });\n ```\n \n @public\n @for Ember.Test\n @method onInjectHelpers\n @param {Function} callback The function to be called.\n */\n function onInjectHelpers(callback) {\n callbacks.push(callback);\n }\n\n function invokeInjectHelpersCallbacks(app) {\n for (var i = 0; i < callbacks.length; i++) {\n callbacks[i](app);\n }\n }\n});","enifed(\"ember-testing/test/pending_requests\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.pendingRequests = pendingRequests;\n exports.clearPendingRequests = clearPendingRequests;\n exports.incrementPendingRequests = incrementPendingRequests;\n exports.decrementPendingRequests = decrementPendingRequests;\n var requests = [];\n\n function pendingRequests() {\n return requests.length;\n }\n\n function clearPendingRequests() {\n requests.length = 0;\n }\n\n function incrementPendingRequests(_, xhr) {\n requests.push(xhr);\n }\n\n function decrementPendingRequests(_, xhr) {\n for (var i = 0; i < requests.length; i++) {\n if (xhr === requests[i]) {\n requests.splice(i, 1);\n break;\n }\n }\n }\n});","enifed('ember-testing/test/promise', ['exports', 'ember-babel', 'ember-runtime', 'ember-testing/test/run'], function (exports, _emberBabel, _emberRuntime, _run) {\n 'use strict';\n\n exports.promise = promise;\n exports.resolve = resolve;\n exports.getLastPromise = getLastPromise;\n\n\n var lastPromise = void 0;\n\n var TestPromise = function (_RSVP$Promise) {\n (0, _emberBabel.inherits)(TestPromise, _RSVP$Promise);\n\n function TestPromise() {\n (0, _emberBabel.classCallCheck)(this, TestPromise);\n\n var _this = (0, _emberBabel.possibleConstructorReturn)(this, _RSVP$Promise.apply(this, arguments));\n\n lastPromise = _this;\n return _this;\n }\n\n TestPromise.prototype.then = function then(_onFulfillment) {\n var _RSVP$Promise$prototy;\n\n var onFulfillment = typeof _onFulfillment === 'function' ? function (result) {\n return isolate(_onFulfillment, result);\n } : undefined;\n\n for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n return (_RSVP$Promise$prototy = _RSVP$Promise.prototype.then).call.apply(_RSVP$Promise$prototy, [this, onFulfillment].concat(args));\n };\n\n return TestPromise;\n }(_emberRuntime.RSVP.Promise);\n\n exports.default = TestPromise;\n\n\n /**\n This returns a thenable tailored for testing. It catches failed\n `onSuccess` callbacks and invokes the `Ember.Test.adapter.exception`\n callback in the last chained then.\n \n This method should be returned by async helpers such as `wait`.\n \n @public\n @for Ember.Test\n @method promise\n @param {Function} resolver The function used to resolve the promise.\n @param {String} label An optional string for identifying the promise.\n */\n function promise(resolver, label) {\n var fullLabel = 'Ember.Test.promise: ' + (label || '<Unknown Promise>');\n return new TestPromise(resolver, fullLabel);\n }\n\n /**\n Replacement for `Ember.RSVP.resolve`\n The only difference is this uses\n an instance of `Ember.Test.Promise`\n \n @public\n @for Ember.Test\n @method resolve\n @param {Mixed} The value to resolve\n @since 1.2.0\n */\n function resolve(result, label) {\n return TestPromise.resolve(result, label);\n }\n\n function getLastPromise() {\n return lastPromise;\n }\n\n // This method isolates nested async methods\n // so that they don't conflict with other last promises.\n //\n // 1. Set `Ember.Test.lastPromise` to null\n // 2. Invoke method\n // 3. Return the last promise created during method\n function isolate(onFulfillment, result) {\n // Reset lastPromise for nested helpers\n lastPromise = null;\n\n var value = onFulfillment(result);\n\n var promise = lastPromise;\n lastPromise = null;\n\n // If the method returned a promise\n // return that promise. If not,\n // return the last async helper's promise\n if (value && value instanceof TestPromise || !promise) {\n return value;\n } else {\n return (0, _run.default)(function () {\n return resolve(promise).then(function () {\n return value;\n });\n });\n }\n }\n});","enifed('ember-testing/test/run', ['exports', 'ember-metal'], function (exports, _emberMetal) {\n 'use strict';\n\n exports.default = run;\n function run(fn) {\n if (!_emberMetal.run.currentRunLoop) {\n return (0, _emberMetal.run)(fn);\n } else {\n return fn();\n }\n }\n});","enifed(\"ember-testing/test/waiters\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.registerWaiter = registerWaiter;\n exports.unregisterWaiter = unregisterWaiter;\n exports.checkWaiters = checkWaiters;\n /**\n @module @ember/test\n */\n var contexts = [];\n var callbacks = [];\n\n /**\n This allows ember-testing to play nicely with other asynchronous\n events, such as an application that is waiting for a CSS3\n transition or an IndexDB transaction. The waiter runs periodically\n after each async helper (i.e. `click`, `andThen`, `visit`, etc) has executed,\n until the returning result is truthy. After the waiters finish, the next async helper\n is executed and the process repeats.\n \n For example:\n \n ```javascript\n import { registerWaiter } from '@ember/test';\n \n registerWaiter(function() {\n return myPendingTransactions() == 0;\n });\n ```\n The `context` argument allows you to optionally specify the `this`\n with which your callback will be invoked.\n \n For example:\n \n ```javascript\n import { registerWaiter } from '@ember/test';\n \n registerWaiter(MyDB, MyDB.hasPendingTransactions);\n ```\n \n @public\n @for @ember/test\n @static\n @method registerWaiter\n @param {Object} context (optional)\n @param {Function} callback\n @since 1.2.0\n */\n function registerWaiter(context, callback) {\n if (arguments.length === 1) {\n callback = context;\n context = null;\n }\n if (indexOf(context, callback) > -1) {\n return;\n }\n contexts.push(context);\n callbacks.push(callback);\n }\n\n /**\n `unregisterWaiter` is used to unregister a callback that was\n registered with `registerWaiter`.\n \n @public\n @for @ember/test\n @static\n @method unregisterWaiter\n @param {Object} context (optional)\n @param {Function} callback\n @since 1.2.0\n */\n function unregisterWaiter(context, callback) {\n if (!callbacks.length) {\n return;\n }\n if (arguments.length === 1) {\n callback = context;\n context = null;\n }\n var i = indexOf(context, callback);\n if (i === -1) {\n return;\n }\n contexts.splice(i, 1);\n callbacks.splice(i, 1);\n }\n\n /**\n Iterates through each registered test waiter, and invokes\n its callback. If any waiter returns false, this method will return\n true indicating that the waiters have not settled yet.\n \n This is generally used internally from the acceptance/integration test\n infrastructure.\n \n @public\n @for @ember/test\n @static\n @method checkWaiters\n */\n function checkWaiters() {\n if (!callbacks.length) {\n return false;\n }\n for (var i = 0; i < callbacks.length; i++) {\n var context = contexts[i];\n var callback = callbacks[i];\n if (!callback.call(context)) {\n return true;\n }\n }\n return false;\n }\n\n function indexOf(context, callback) {\n for (var i = 0; i < callbacks.length; i++) {\n if (callbacks[i] === callback && contexts[i] === context) {\n return i;\n }\n }\n return -1;\n }\n});","/*global enifed */\nenifed('node-module', ['exports'], function(_exports) {\n var IS_NODE = typeof module === 'object' && typeof module.require === 'function';\n if (IS_NODE) {\n _exports.require = module.require;\n _exports.module = module;\n _exports.IS_NODE = IS_NODE;\n } else {\n _exports.require = null;\n _exports.module = null;\n _exports.IS_NODE = IS_NODE;\n }\n});","/* globals require, Ember, jQuery */\n\n(() => {\n if (typeof jQuery !== 'undefined') {\n let _Ember;\n if (typeof Ember !== 'undefined') {\n _Ember = Ember;\n } else {\n _Ember = require('ember').default;\n }\n\n let pendingRequests;\n if (Ember.__loader.registry['ember-testing/test/pending_requests']) {\n pendingRequests = Ember.__loader.require('ember-testing/test/pending_requests');\n }\n\n if (pendingRequests) {\n // This exists to ensure that the AJAX listeners setup by Ember itself\n // (which as of 2.17 are not properly torn down) get cleared and released\n // when the application is destroyed. Without this, any AJAX requests\n // that happen _between_ acceptance tests will always share\n // `pendingRequests`.\n _Ember.Application.reopen({\n willDestroy() {\n jQuery(document).off('ajaxSend', pendingRequests.incrementPendingRequests);\n jQuery(document).off('ajaxComplete', pendingRequests.decrementPendingRequests);\n\n pendingRequests.clearPendingRequests();\n\n this._super(...arguments);\n }\n });\n }\n }\n})();","/*!\n * QUnit 2.5.1\n * https://qunitjs.com/\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2018-02-28T01:37Z\n */\n(function (global$1) {\n 'use strict';\n\n global$1 = global$1 && global$1.hasOwnProperty('default') ? global$1['default'] : global$1;\n\n var window = global$1.window;\n var self$1 = global$1.self;\n var console = global$1.console;\n var setTimeout = global$1.setTimeout;\n var clearTimeout = global$1.clearTimeout;\n\n var document = window && window.document;\n var navigator = window && window.navigator;\n\n var localSessionStorage = function () {\n \tvar x = \"qunit-test-string\";\n \ttry {\n \t\tglobal$1.sessionStorage.setItem(x, x);\n \t\tglobal$1.sessionStorage.removeItem(x);\n \t\treturn global$1.sessionStorage;\n \t} catch (e) {\n \t\treturn undefined;\n \t}\n }();\n\n var _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n\n\n\n\n\n\n\n\n\n\n\n var classCallCheck = function (instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n };\n\n var createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n }();\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n var toConsumableArray = function (arr) {\n if (Array.isArray(arr)) {\n for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];\n\n return arr2;\n } else {\n return Array.from(arr);\n }\n };\n\n var toString = Object.prototype.toString;\n var hasOwn = Object.prototype.hasOwnProperty;\n var now = Date.now || function () {\n \treturn new Date().getTime();\n };\n\n var defined = {\n \tdocument: window && window.document !== undefined,\n \tsetTimeout: setTimeout !== undefined\n };\n\n // Returns a new Array with the elements that are in a but not in b\n function diff(a, b) {\n \tvar i,\n \t j,\n \t result = a.slice();\n\n \tfor (i = 0; i < result.length; i++) {\n \t\tfor (j = 0; j < b.length; j++) {\n \t\t\tif (result[i] === b[j]) {\n \t\t\t\tresult.splice(i, 1);\n \t\t\t\ti--;\n \t\t\t\tbreak;\n \t\t\t}\n \t\t}\n \t}\n \treturn result;\n }\n\n /**\n * Determines whether an element exists in a given array or not.\n *\n * @method inArray\n * @param {Any} elem\n * @param {Array} array\n * @return {Boolean}\n */\n function inArray(elem, array) {\n \treturn array.indexOf(elem) !== -1;\n }\n\n /**\n * Makes a clone of an object using only Array or Object as base,\n * and copies over the own enumerable properties.\n *\n * @param {Object} obj\n * @return {Object} New object with only the own properties (recursively).\n */\n function objectValues(obj) {\n \tvar key,\n \t val,\n \t vals = is(\"array\", obj) ? [] : {};\n \tfor (key in obj) {\n \t\tif (hasOwn.call(obj, key)) {\n \t\t\tval = obj[key];\n \t\t\tvals[key] = val === Object(val) ? objectValues(val) : val;\n \t\t}\n \t}\n \treturn vals;\n }\n\n function extend(a, b, undefOnly) {\n \tfor (var prop in b) {\n \t\tif (hasOwn.call(b, prop)) {\n \t\t\tif (b[prop] === undefined) {\n \t\t\t\tdelete a[prop];\n \t\t\t} else if (!(undefOnly && typeof a[prop] !== \"undefined\")) {\n \t\t\t\ta[prop] = b[prop];\n \t\t\t}\n \t\t}\n \t}\n\n \treturn a;\n }\n\n function objectType(obj) {\n \tif (typeof obj === \"undefined\") {\n \t\treturn \"undefined\";\n \t}\n\n \t// Consider: typeof null === object\n \tif (obj === null) {\n \t\treturn \"null\";\n \t}\n\n \tvar match = toString.call(obj).match(/^\\[object\\s(.*)\\]$/),\n \t type = match && match[1];\n\n \tswitch (type) {\n \t\tcase \"Number\":\n \t\t\tif (isNaN(obj)) {\n \t\t\t\treturn \"nan\";\n \t\t\t}\n \t\t\treturn \"number\";\n \t\tcase \"String\":\n \t\tcase \"Boolean\":\n \t\tcase \"Array\":\n \t\tcase \"Set\":\n \t\tcase \"Map\":\n \t\tcase \"Date\":\n \t\tcase \"RegExp\":\n \t\tcase \"Function\":\n \t\tcase \"Symbol\":\n \t\t\treturn type.toLowerCase();\n \t\tdefault:\n \t\t\treturn typeof obj === \"undefined\" ? \"undefined\" : _typeof(obj);\n \t}\n }\n\n // Safe object type checking\n function is(type, obj) {\n \treturn objectType(obj) === type;\n }\n\n // Based on Java's String.hashCode, a simple but not\n // rigorously collision resistant hashing function\n function generateHash(module, testName) {\n \tvar str = module + \"\\x1C\" + testName;\n \tvar hash = 0;\n\n \tfor (var i = 0; i < str.length; i++) {\n \t\thash = (hash << 5) - hash + str.charCodeAt(i);\n \t\thash |= 0;\n \t}\n\n \t// Convert the possibly negative integer hash code into an 8 character hex string, which isn't\n \t// strictly necessary but increases user understanding that the id is a SHA-like hash\n \tvar hex = (0x100000000 + hash).toString(16);\n \tif (hex.length < 8) {\n \t\thex = \"0000000\" + hex;\n \t}\n\n \treturn hex.slice(-8);\n }\n\n // Test for equality any JavaScript type.\n // Authors: Philippe Rathé <prathe@gmail.com>, David Chan <david@troi.org>\n var equiv = (function () {\n\n \t// Value pairs queued for comparison. Used for breadth-first processing order, recursion\n \t// detection and avoiding repeated comparison (see below for details).\n \t// Elements are { a: val, b: val }.\n \tvar pairs = [];\n\n \tvar getProto = Object.getPrototypeOf || function (obj) {\n \t\treturn obj.__proto__;\n \t};\n\n \tfunction useStrictEquality(a, b) {\n\n \t\t// This only gets called if a and b are not strict equal, and is used to compare on\n \t\t// the primitive values inside object wrappers. For example:\n \t\t// `var i = 1;`\n \t\t// `var j = new Number(1);`\n \t\t// Neither a nor b can be null, as a !== b and they have the same type.\n \t\tif ((typeof a === \"undefined\" ? \"undefined\" : _typeof(a)) === \"object\") {\n \t\t\ta = a.valueOf();\n \t\t}\n \t\tif ((typeof b === \"undefined\" ? \"undefined\" : _typeof(b)) === \"object\") {\n \t\t\tb = b.valueOf();\n \t\t}\n\n \t\treturn a === b;\n \t}\n\n \tfunction compareConstructors(a, b) {\n \t\tvar protoA = getProto(a);\n \t\tvar protoB = getProto(b);\n\n \t\t// Comparing constructors is more strict than using `instanceof`\n \t\tif (a.constructor === b.constructor) {\n \t\t\treturn true;\n \t\t}\n\n \t\t// Ref #851\n \t\t// If the obj prototype descends from a null constructor, treat it\n \t\t// as a null prototype.\n \t\tif (protoA && protoA.constructor === null) {\n \t\t\tprotoA = null;\n \t\t}\n \t\tif (protoB && protoB.constructor === null) {\n \t\t\tprotoB = null;\n \t\t}\n\n \t\t// Allow objects with no prototype to be equivalent to\n \t\t// objects with Object as their constructor.\n \t\tif (protoA === null && protoB === Object.prototype || protoB === null && protoA === Object.prototype) {\n \t\t\treturn true;\n \t\t}\n\n \t\treturn false;\n \t}\n\n \tfunction getRegExpFlags(regexp) {\n \t\treturn \"flags\" in regexp ? regexp.flags : regexp.toString().match(/[gimuy]*$/)[0];\n \t}\n\n \tfunction isContainer(val) {\n \t\treturn [\"object\", \"array\", \"map\", \"set\"].indexOf(objectType(val)) !== -1;\n \t}\n\n \tfunction breadthFirstCompareChild(a, b) {\n\n \t\t// If a is a container not reference-equal to b, postpone the comparison to the\n \t\t// end of the pairs queue -- unless (a, b) has been seen before, in which case skip\n \t\t// over the pair.\n \t\tif (a === b) {\n \t\t\treturn true;\n \t\t}\n \t\tif (!isContainer(a)) {\n \t\t\treturn typeEquiv(a, b);\n \t\t}\n \t\tif (pairs.every(function (pair) {\n \t\t\treturn pair.a !== a || pair.b !== b;\n \t\t})) {\n\n \t\t\t// Not yet started comparing this pair\n \t\t\tpairs.push({ a: a, b: b });\n \t\t}\n \t\treturn true;\n \t}\n\n \tvar callbacks = {\n \t\t\"string\": useStrictEquality,\n \t\t\"boolean\": useStrictEquality,\n \t\t\"number\": useStrictEquality,\n \t\t\"null\": useStrictEquality,\n \t\t\"undefined\": useStrictEquality,\n \t\t\"symbol\": useStrictEquality,\n \t\t\"date\": useStrictEquality,\n\n \t\t\"nan\": function nan() {\n \t\t\treturn true;\n \t\t},\n\n \t\t\"regexp\": function regexp(a, b) {\n \t\t\treturn a.source === b.source &&\n\n \t\t\t// Include flags in the comparison\n \t\t\tgetRegExpFlags(a) === getRegExpFlags(b);\n \t\t},\n\n \t\t// abort (identical references / instance methods were skipped earlier)\n \t\t\"function\": function _function() {\n \t\t\treturn false;\n \t\t},\n\n \t\t\"array\": function array(a, b) {\n \t\t\tvar i, len;\n\n \t\t\tlen = a.length;\n \t\t\tif (len !== b.length) {\n\n \t\t\t\t// Safe and faster\n \t\t\t\treturn false;\n \t\t\t}\n\n \t\t\tfor (i = 0; i < len; i++) {\n\n \t\t\t\t// Compare non-containers; queue non-reference-equal containers\n \t\t\t\tif (!breadthFirstCompareChild(a[i], b[i])) {\n \t\t\t\t\treturn false;\n \t\t\t\t}\n \t\t\t}\n \t\t\treturn true;\n \t\t},\n\n \t\t// Define sets a and b to be equivalent if for each element aVal in a, there\n \t\t// is some element bVal in b such that aVal and bVal are equivalent. Element\n \t\t// repetitions are not counted, so these are equivalent:\n \t\t// a = new Set( [ {}, [], [] ] );\n \t\t// b = new Set( [ {}, {}, [] ] );\n \t\t\"set\": function set$$1(a, b) {\n \t\t\tvar innerEq,\n \t\t\t outerEq = true;\n\n \t\t\tif (a.size !== b.size) {\n\n \t\t\t\t// This optimization has certain quirks because of the lack of\n \t\t\t\t// repetition counting. For instance, adding the same\n \t\t\t\t// (reference-identical) element to two equivalent sets can\n \t\t\t\t// make them non-equivalent.\n \t\t\t\treturn false;\n \t\t\t}\n\n \t\t\ta.forEach(function (aVal) {\n\n \t\t\t\t// Short-circuit if the result is already known. (Using for...of\n \t\t\t\t// with a break clause would be cleaner here, but it would cause\n \t\t\t\t// a syntax error on older Javascript implementations even if\n \t\t\t\t// Set is unused)\n \t\t\t\tif (!outerEq) {\n \t\t\t\t\treturn;\n \t\t\t\t}\n\n \t\t\t\tinnerEq = false;\n\n \t\t\t\tb.forEach(function (bVal) {\n \t\t\t\t\tvar parentPairs;\n\n \t\t\t\t\t// Likewise, short-circuit if the result is already known\n \t\t\t\t\tif (innerEq) {\n \t\t\t\t\t\treturn;\n \t\t\t\t\t}\n\n \t\t\t\t\t// Swap out the global pairs list, as the nested call to\n \t\t\t\t\t// innerEquiv will clobber its contents\n \t\t\t\t\tparentPairs = pairs;\n \t\t\t\t\tif (innerEquiv(bVal, aVal)) {\n \t\t\t\t\t\tinnerEq = true;\n \t\t\t\t\t}\n\n \t\t\t\t\t// Replace the global pairs list\n \t\t\t\t\tpairs = parentPairs;\n \t\t\t\t});\n\n \t\t\t\tif (!innerEq) {\n \t\t\t\t\touterEq = false;\n \t\t\t\t}\n \t\t\t});\n\n \t\t\treturn outerEq;\n \t\t},\n\n \t\t// Define maps a and b to be equivalent if for each key-value pair (aKey, aVal)\n \t\t// in a, there is some key-value pair (bKey, bVal) in b such that\n \t\t// [ aKey, aVal ] and [ bKey, bVal ] are equivalent. Key repetitions are not\n \t\t// counted, so these are equivalent:\n \t\t// a = new Map( [ [ {}, 1 ], [ {}, 1 ], [ [], 1 ] ] );\n \t\t// b = new Map( [ [ {}, 1 ], [ [], 1 ], [ [], 1 ] ] );\n \t\t\"map\": function map(a, b) {\n \t\t\tvar innerEq,\n \t\t\t outerEq = true;\n\n \t\t\tif (a.size !== b.size) {\n\n \t\t\t\t// This optimization has certain quirks because of the lack of\n \t\t\t\t// repetition counting. For instance, adding the same\n \t\t\t\t// (reference-identical) key-value pair to two equivalent maps\n \t\t\t\t// can make them non-equivalent.\n \t\t\t\treturn false;\n \t\t\t}\n\n \t\t\ta.forEach(function (aVal, aKey) {\n\n \t\t\t\t// Short-circuit if the result is already known. (Using for...of\n \t\t\t\t// with a break clause would be cleaner here, but it would cause\n \t\t\t\t// a syntax error on older Javascript implementations even if\n \t\t\t\t// Map is unused)\n \t\t\t\tif (!outerEq) {\n \t\t\t\t\treturn;\n \t\t\t\t}\n\n \t\t\t\tinnerEq = false;\n\n \t\t\t\tb.forEach(function (bVal, bKey) {\n \t\t\t\t\tvar parentPairs;\n\n \t\t\t\t\t// Likewise, short-circuit if the result is already known\n \t\t\t\t\tif (innerEq) {\n \t\t\t\t\t\treturn;\n \t\t\t\t\t}\n\n \t\t\t\t\t// Swap out the global pairs list, as the nested call to\n \t\t\t\t\t// innerEquiv will clobber its contents\n \t\t\t\t\tparentPairs = pairs;\n \t\t\t\t\tif (innerEquiv([bVal, bKey], [aVal, aKey])) {\n \t\t\t\t\t\tinnerEq = true;\n \t\t\t\t\t}\n\n \t\t\t\t\t// Replace the global pairs list\n \t\t\t\t\tpairs = parentPairs;\n \t\t\t\t});\n\n \t\t\t\tif (!innerEq) {\n \t\t\t\t\touterEq = false;\n \t\t\t\t}\n \t\t\t});\n\n \t\t\treturn outerEq;\n \t\t},\n\n \t\t\"object\": function object(a, b) {\n \t\t\tvar i,\n \t\t\t aProperties = [],\n \t\t\t bProperties = [];\n\n \t\t\tif (compareConstructors(a, b) === false) {\n \t\t\t\treturn false;\n \t\t\t}\n\n \t\t\t// Be strict: don't ensure hasOwnProperty and go deep\n \t\t\tfor (i in a) {\n\n \t\t\t\t// Collect a's properties\n \t\t\t\taProperties.push(i);\n\n \t\t\t\t// Skip OOP methods that look the same\n \t\t\t\tif (a.constructor !== Object && typeof a.constructor !== \"undefined\" && typeof a[i] === \"function\" && typeof b[i] === \"function\" && a[i].toString() === b[i].toString()) {\n \t\t\t\t\tcontinue;\n \t\t\t\t}\n\n \t\t\t\t// Compare non-containers; queue non-reference-equal containers\n \t\t\t\tif (!breadthFirstCompareChild(a[i], b[i])) {\n \t\t\t\t\treturn false;\n \t\t\t\t}\n \t\t\t}\n\n \t\t\tfor (i in b) {\n\n \t\t\t\t// Collect b's properties\n \t\t\t\tbProperties.push(i);\n \t\t\t}\n\n \t\t\t// Ensures identical properties name\n \t\t\treturn typeEquiv(aProperties.sort(), bProperties.sort());\n \t\t}\n \t};\n\n \tfunction typeEquiv(a, b) {\n \t\tvar type = objectType(a);\n\n \t\t// Callbacks for containers will append to the pairs queue to achieve breadth-first\n \t\t// search order. The pairs queue is also used to avoid reprocessing any pair of\n \t\t// containers that are reference-equal to a previously visited pair (a special case\n \t\t// this being recursion detection).\n \t\t//\n \t\t// Because of this approach, once typeEquiv returns a false value, it should not be\n \t\t// called again without clearing the pair queue else it may wrongly report a visited\n \t\t// pair as being equivalent.\n \t\treturn objectType(b) === type && callbacks[type](a, b);\n \t}\n\n \tfunction innerEquiv(a, b) {\n \t\tvar i, pair;\n\n \t\t// We're done when there's nothing more to compare\n \t\tif (arguments.length < 2) {\n \t\t\treturn true;\n \t\t}\n\n \t\t// Clear the global pair queue and add the top-level values being compared\n \t\tpairs = [{ a: a, b: b }];\n\n \t\tfor (i = 0; i < pairs.length; i++) {\n \t\t\tpair = pairs[i];\n\n \t\t\t// Perform type-specific comparison on any pairs that are not strictly\n \t\t\t// equal. For container types, that comparison will postpone comparison\n \t\t\t// of any sub-container pair to the end of the pair queue. This gives\n \t\t\t// breadth-first search order. It also avoids the reprocessing of\n \t\t\t// reference-equal siblings, cousins etc, which can have a significant speed\n \t\t\t// impact when comparing a container of small objects each of which has a\n \t\t\t// reference to the same (singleton) large object.\n \t\t\tif (pair.a !== pair.b && !typeEquiv(pair.a, pair.b)) {\n \t\t\t\treturn false;\n \t\t\t}\n \t\t}\n\n \t\t// ...across all consecutive argument pairs\n \t\treturn arguments.length === 2 || innerEquiv.apply(this, [].slice.call(arguments, 1));\n \t}\n\n \treturn function () {\n \t\tvar result = innerEquiv.apply(undefined, arguments);\n\n \t\t// Release any retained objects\n \t\tpairs.length = 0;\n \t\treturn result;\n \t};\n })();\n\n /**\n * Config object: Maintain internal state\n * Later exposed as QUnit.config\n * `config` initialized at top of scope\n */\n var config = {\n\n \t// The queue of tests to run\n \tqueue: [],\n\n \t// Block until document ready\n \tblocking: true,\n\n \t// By default, run previously failed tests first\n \t// very useful in combination with \"Hide passed tests\" checked\n \treorder: true,\n\n \t// By default, modify document.title when suite is done\n \taltertitle: true,\n\n \t// HTML Reporter: collapse every test except the first failing test\n \t// If false, all failing tests will be expanded\n \tcollapse: true,\n\n \t// By default, scroll to top of the page when suite is done\n \tscrolltop: true,\n\n \t// Depth up-to which object will be dumped\n \tmaxDepth: 5,\n\n \t// When enabled, all tests must call expect()\n \trequireExpects: false,\n\n \t// Placeholder for user-configurable form-exposed URL parameters\n \turlConfig: [],\n\n \t// Set of all modules.\n \tmodules: [],\n\n \t// The first unnamed module\n \tcurrentModule: {\n \t\tname: \"\",\n \t\ttests: [],\n \t\tchildModules: [],\n \t\ttestsRun: 0,\n \t\tunskippedTestsRun: 0,\n \t\thooks: {\n \t\t\tbefore: [],\n \t\t\tbeforeEach: [],\n \t\t\tafterEach: [],\n \t\t\tafter: []\n \t\t}\n \t},\n\n \tcallbacks: {},\n\n \t// The storage module to use for reordering tests\n \tstorage: localSessionStorage\n };\n\n // take a predefined QUnit.config and extend the defaults\n var globalConfig = window && window.QUnit && window.QUnit.config;\n\n // only extend the global config if there is no QUnit overload\n if (window && window.QUnit && !window.QUnit.version) {\n \textend(config, globalConfig);\n }\n\n // Push a loose unnamed module to the modules collection\n config.modules.push(config.currentModule);\n\n // Based on jsDump by Ariel Flesler\n // http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html\n var dump = (function () {\n \tfunction quote(str) {\n \t\treturn \"\\\"\" + str.toString().replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, \"\\\\\\\"\") + \"\\\"\";\n \t}\n \tfunction literal(o) {\n \t\treturn o + \"\";\n \t}\n \tfunction join(pre, arr, post) {\n \t\tvar s = dump.separator(),\n \t\t base = dump.indent(),\n \t\t inner = dump.indent(1);\n \t\tif (arr.join) {\n \t\t\tarr = arr.join(\",\" + s + inner);\n \t\t}\n \t\tif (!arr) {\n \t\t\treturn pre + post;\n \t\t}\n \t\treturn [pre, inner + arr, base + post].join(s);\n \t}\n \tfunction array(arr, stack) {\n \t\tvar i = arr.length,\n \t\t ret = new Array(i);\n\n \t\tif (dump.maxDepth && dump.depth > dump.maxDepth) {\n \t\t\treturn \"[object Array]\";\n \t\t}\n\n \t\tthis.up();\n \t\twhile (i--) {\n \t\t\tret[i] = this.parse(arr[i], undefined, stack);\n \t\t}\n \t\tthis.down();\n \t\treturn join(\"[\", ret, \"]\");\n \t}\n\n \tfunction isArray(obj) {\n \t\treturn (\n\n \t\t\t//Native Arrays\n \t\t\ttoString.call(obj) === \"[object Array]\" ||\n\n \t\t\t// NodeList objects\n \t\t\ttypeof obj.length === \"number\" && obj.item !== undefined && (obj.length ? obj.item(0) === obj[0] : obj.item(0) === null && obj[0] === undefined)\n \t\t);\n \t}\n\n \tvar reName = /^function (\\w+)/,\n \t dump = {\n\n \t\t// The objType is used mostly internally, you can fix a (custom) type in advance\n \t\tparse: function parse(obj, objType, stack) {\n \t\t\tstack = stack || [];\n \t\t\tvar res,\n \t\t\t parser,\n \t\t\t parserType,\n \t\t\t objIndex = stack.indexOf(obj);\n\n \t\t\tif (objIndex !== -1) {\n \t\t\t\treturn \"recursion(\" + (objIndex - stack.length) + \")\";\n \t\t\t}\n\n \t\t\tobjType = objType || this.typeOf(obj);\n \t\t\tparser = this.parsers[objType];\n \t\t\tparserType = typeof parser === \"undefined\" ? \"undefined\" : _typeof(parser);\n\n \t\t\tif (parserType === \"function\") {\n \t\t\t\tstack.push(obj);\n \t\t\t\tres = parser.call(this, obj, stack);\n \t\t\t\tstack.pop();\n \t\t\t\treturn res;\n \t\t\t}\n \t\t\treturn parserType === \"string\" ? parser : this.parsers.error;\n \t\t},\n \t\ttypeOf: function typeOf(obj) {\n \t\t\tvar type;\n\n \t\t\tif (obj === null) {\n \t\t\t\ttype = \"null\";\n \t\t\t} else if (typeof obj === \"undefined\") {\n \t\t\t\ttype = \"undefined\";\n \t\t\t} else if (is(\"regexp\", obj)) {\n \t\t\t\ttype = \"regexp\";\n \t\t\t} else if (is(\"date\", obj)) {\n \t\t\t\ttype = \"date\";\n \t\t\t} else if (is(\"function\", obj)) {\n \t\t\t\ttype = \"function\";\n \t\t\t} else if (obj.setInterval !== undefined && obj.document !== undefined && obj.nodeType === undefined) {\n \t\t\t\ttype = \"window\";\n \t\t\t} else if (obj.nodeType === 9) {\n \t\t\t\ttype = \"document\";\n \t\t\t} else if (obj.nodeType) {\n \t\t\t\ttype = \"node\";\n \t\t\t} else if (isArray(obj)) {\n \t\t\t\ttype = \"array\";\n \t\t\t} else if (obj.constructor === Error.prototype.constructor) {\n \t\t\t\ttype = \"error\";\n \t\t\t} else {\n \t\t\t\ttype = typeof obj === \"undefined\" ? \"undefined\" : _typeof(obj);\n \t\t\t}\n \t\t\treturn type;\n \t\t},\n\n \t\tseparator: function separator() {\n \t\t\tif (this.multiline) {\n \t\t\t\treturn this.HTML ? \"<br />\" : \"\\n\";\n \t\t\t} else {\n \t\t\t\treturn this.HTML ? \"&#160;\" : \" \";\n \t\t\t}\n \t\t},\n\n \t\t// Extra can be a number, shortcut for increasing-calling-decreasing\n \t\tindent: function indent(extra) {\n \t\t\tif (!this.multiline) {\n \t\t\t\treturn \"\";\n \t\t\t}\n \t\t\tvar chr = this.indentChar;\n \t\t\tif (this.HTML) {\n \t\t\t\tchr = chr.replace(/\\t/g, \" \").replace(/ /g, \"&#160;\");\n \t\t\t}\n \t\t\treturn new Array(this.depth + (extra || 0)).join(chr);\n \t\t},\n \t\tup: function up(a) {\n \t\t\tthis.depth += a || 1;\n \t\t},\n \t\tdown: function down(a) {\n \t\t\tthis.depth -= a || 1;\n \t\t},\n \t\tsetParser: function setParser(name, parser) {\n \t\t\tthis.parsers[name] = parser;\n \t\t},\n\n \t\t// The next 3 are exposed so you can use them\n \t\tquote: quote,\n \t\tliteral: literal,\n \t\tjoin: join,\n \t\tdepth: 1,\n \t\tmaxDepth: config.maxDepth,\n\n \t\t// This is the list of parsers, to modify them, use dump.setParser\n \t\tparsers: {\n \t\t\twindow: \"[Window]\",\n \t\t\tdocument: \"[Document]\",\n \t\t\terror: function error(_error) {\n \t\t\t\treturn \"Error(\\\"\" + _error.message + \"\\\")\";\n \t\t\t},\n \t\t\tunknown: \"[Unknown]\",\n \t\t\t\"null\": \"null\",\n \t\t\t\"undefined\": \"undefined\",\n \t\t\t\"function\": function _function(fn) {\n \t\t\t\tvar ret = \"function\",\n\n\n \t\t\t\t// Functions never have name in IE\n \t\t\t\tname = \"name\" in fn ? fn.name : (reName.exec(fn) || [])[1];\n\n \t\t\t\tif (name) {\n \t\t\t\t\tret += \" \" + name;\n \t\t\t\t}\n \t\t\t\tret += \"(\";\n\n \t\t\t\tret = [ret, dump.parse(fn, \"functionArgs\"), \"){\"].join(\"\");\n \t\t\t\treturn join(ret, dump.parse(fn, \"functionCode\"), \"}\");\n \t\t\t},\n \t\t\tarray: array,\n \t\t\tnodelist: array,\n \t\t\t\"arguments\": array,\n \t\t\tobject: function object(map, stack) {\n \t\t\t\tvar keys,\n \t\t\t\t key,\n \t\t\t\t val,\n \t\t\t\t i,\n \t\t\t\t nonEnumerableProperties,\n \t\t\t\t ret = [];\n\n \t\t\t\tif (dump.maxDepth && dump.depth > dump.maxDepth) {\n \t\t\t\t\treturn \"[object Object]\";\n \t\t\t\t}\n\n \t\t\t\tdump.up();\n \t\t\t\tkeys = [];\n \t\t\t\tfor (key in map) {\n \t\t\t\t\tkeys.push(key);\n \t\t\t\t}\n\n \t\t\t\t// Some properties are not always enumerable on Error objects.\n \t\t\t\tnonEnumerableProperties = [\"message\", \"name\"];\n \t\t\t\tfor (i in nonEnumerableProperties) {\n \t\t\t\t\tkey = nonEnumerableProperties[i];\n \t\t\t\t\tif (key in map && !inArray(key, keys)) {\n \t\t\t\t\t\tkeys.push(key);\n \t\t\t\t\t}\n \t\t\t\t}\n \t\t\t\tkeys.sort();\n \t\t\t\tfor (i = 0; i < keys.length; i++) {\n \t\t\t\t\tkey = keys[i];\n \t\t\t\t\tval = map[key];\n \t\t\t\t\tret.push(dump.parse(key, \"key\") + \": \" + dump.parse(val, undefined, stack));\n \t\t\t\t}\n \t\t\t\tdump.down();\n \t\t\t\treturn join(\"{\", ret, \"}\");\n \t\t\t},\n \t\t\tnode: function node(_node) {\n \t\t\t\tvar len,\n \t\t\t\t i,\n \t\t\t\t val,\n \t\t\t\t open = dump.HTML ? \"&lt;\" : \"<\",\n \t\t\t\t close = dump.HTML ? \"&gt;\" : \">\",\n \t\t\t\t tag = _node.nodeName.toLowerCase(),\n \t\t\t\t ret = open + tag,\n \t\t\t\t attrs = _node.attributes;\n\n \t\t\t\tif (attrs) {\n \t\t\t\t\tfor (i = 0, len = attrs.length; i < len; i++) {\n \t\t\t\t\t\tval = attrs[i].nodeValue;\n\n \t\t\t\t\t\t// IE6 includes all attributes in .attributes, even ones not explicitly\n \t\t\t\t\t\t// set. Those have values like undefined, null, 0, false, \"\" or\n \t\t\t\t\t\t// \"inherit\".\n \t\t\t\t\t\tif (val && val !== \"inherit\") {\n \t\t\t\t\t\t\tret += \" \" + attrs[i].nodeName + \"=\" + dump.parse(val, \"attribute\");\n \t\t\t\t\t\t}\n \t\t\t\t\t}\n \t\t\t\t}\n \t\t\t\tret += close;\n\n \t\t\t\t// Show content of TextNode or CDATASection\n \t\t\t\tif (_node.nodeType === 3 || _node.nodeType === 4) {\n \t\t\t\t\tret += _node.nodeValue;\n \t\t\t\t}\n\n \t\t\t\treturn ret + open + \"/\" + tag + close;\n \t\t\t},\n\n \t\t\t// Function calls it internally, it's the arguments part of the function\n \t\t\tfunctionArgs: function functionArgs(fn) {\n \t\t\t\tvar args,\n \t\t\t\t l = fn.length;\n\n \t\t\t\tif (!l) {\n \t\t\t\t\treturn \"\";\n \t\t\t\t}\n\n \t\t\t\targs = new Array(l);\n \t\t\t\twhile (l--) {\n\n \t\t\t\t\t// 97 is 'a'\n \t\t\t\t\targs[l] = String.fromCharCode(97 + l);\n \t\t\t\t}\n \t\t\t\treturn \" \" + args.join(\", \") + \" \";\n \t\t\t},\n\n \t\t\t// Object calls it internally, the key part of an item in a map\n \t\t\tkey: quote,\n\n \t\t\t// Function calls it internally, it's the content of the function\n \t\t\tfunctionCode: \"[code]\",\n\n \t\t\t// Node calls it internally, it's a html attribute value\n \t\t\tattribute: quote,\n \t\t\tstring: quote,\n \t\t\tdate: quote,\n \t\t\tregexp: literal,\n \t\t\tnumber: literal,\n \t\t\t\"boolean\": literal,\n \t\t\tsymbol: function symbol(sym) {\n \t\t\t\treturn sym.toString();\n \t\t\t}\n \t\t},\n\n \t\t// If true, entities are escaped ( <, >, \\t, space and \\n )\n \t\tHTML: false,\n\n \t\t// Indentation unit\n \t\tindentChar: \" \",\n\n \t\t// If true, items in a collection, are separated by a \\n, else just a space.\n \t\tmultiline: true\n \t};\n\n \treturn dump;\n })();\n\n var LISTENERS = Object.create(null);\n var SUPPORTED_EVENTS = [\"runStart\", \"suiteStart\", \"testStart\", \"assertion\", \"testEnd\", \"suiteEnd\", \"runEnd\"];\n\n /**\n * Emits an event with the specified data to all currently registered listeners.\n * Callbacks will fire in the order in which they are registered (FIFO). This\n * function is not exposed publicly; it is used by QUnit internals to emit\n * logging events.\n *\n * @private\n * @method emit\n * @param {String} eventName\n * @param {Object} data\n * @return {Void}\n */\n function emit(eventName, data) {\n \tif (objectType(eventName) !== \"string\") {\n \t\tthrow new TypeError(\"eventName must be a string when emitting an event\");\n \t}\n\n \t// Clone the callbacks in case one of them registers a new callback\n \tvar originalCallbacks = LISTENERS[eventName];\n \tvar callbacks = originalCallbacks ? [].concat(toConsumableArray(originalCallbacks)) : [];\n\n \tfor (var i = 0; i < callbacks.length; i++) {\n \t\tcallbacks[i](data);\n \t}\n }\n\n /**\n * Registers a callback as a listener to the specified event.\n *\n * @public\n * @method on\n * @param {String} eventName\n * @param {Function} callback\n * @return {Void}\n */\n function on(eventName, callback) {\n \tif (objectType(eventName) !== \"string\") {\n \t\tthrow new TypeError(\"eventName must be a string when registering a listener\");\n \t} else if (!inArray(eventName, SUPPORTED_EVENTS)) {\n \t\tvar events = SUPPORTED_EVENTS.join(\", \");\n \t\tthrow new Error(\"\\\"\" + eventName + \"\\\" is not a valid event; must be one of: \" + events + \".\");\n \t} else if (objectType(callback) !== \"function\") {\n \t\tthrow new TypeError(\"callback must be a function when registering a listener\");\n \t}\n\n \tif (!LISTENERS[eventName]) {\n \t\tLISTENERS[eventName] = [];\n \t}\n\n \t// Don't register the same callback more than once\n \tif (!inArray(callback, LISTENERS[eventName])) {\n \t\tLISTENERS[eventName].push(callback);\n \t}\n }\n\n // Register logging callbacks\n function registerLoggingCallbacks(obj) {\n \tvar i,\n \t l,\n \t key,\n \t callbackNames = [\"begin\", \"done\", \"log\", \"testStart\", \"testDone\", \"moduleStart\", \"moduleDone\"];\n\n \tfunction registerLoggingCallback(key) {\n \t\tvar loggingCallback = function loggingCallback(callback) {\n \t\t\tif (objectType(callback) !== \"function\") {\n \t\t\t\tthrow new Error(\"QUnit logging methods require a callback function as their first parameters.\");\n \t\t\t}\n\n \t\t\tconfig.callbacks[key].push(callback);\n \t\t};\n\n \t\treturn loggingCallback;\n \t}\n\n \tfor (i = 0, l = callbackNames.length; i < l; i++) {\n \t\tkey = callbackNames[i];\n\n \t\t// Initialize key collection of logging callback\n \t\tif (objectType(config.callbacks[key]) === \"undefined\") {\n \t\t\tconfig.callbacks[key] = [];\n \t\t}\n\n \t\tobj[key] = registerLoggingCallback(key);\n \t}\n }\n\n function runLoggingCallbacks(key, args) {\n \tvar i, l, callbacks;\n\n \tcallbacks = config.callbacks[key];\n \tfor (i = 0, l = callbacks.length; i < l; i++) {\n \t\tcallbacks[i](args);\n \t}\n }\n\n // Doesn't support IE9, it will return undefined on these browsers\n // See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack\n var fileName = (sourceFromStacktrace(0) || \"\").replace(/(:\\d+)+\\)?/, \"\").replace(/.+\\//, \"\");\n\n function extractStacktrace(e, offset) {\n \toffset = offset === undefined ? 4 : offset;\n\n \tvar stack, include, i;\n\n \tif (e && e.stack) {\n \t\tstack = e.stack.split(\"\\n\");\n \t\tif (/^error$/i.test(stack[0])) {\n \t\t\tstack.shift();\n \t\t}\n \t\tif (fileName) {\n \t\t\tinclude = [];\n \t\t\tfor (i = offset; i < stack.length; i++) {\n \t\t\t\tif (stack[i].indexOf(fileName) !== -1) {\n \t\t\t\t\tbreak;\n \t\t\t\t}\n \t\t\t\tinclude.push(stack[i]);\n \t\t\t}\n \t\t\tif (include.length) {\n \t\t\t\treturn include.join(\"\\n\");\n \t\t\t}\n \t\t}\n \t\treturn stack[offset];\n \t}\n }\n\n function sourceFromStacktrace(offset) {\n \tvar error = new Error();\n\n \t// Support: Safari <=7 only, IE <=10 - 11 only\n \t// Not all browsers generate the `stack` property for `new Error()`, see also #636\n \tif (!error.stack) {\n \t\ttry {\n \t\t\tthrow error;\n \t\t} catch (err) {\n \t\t\terror = err;\n \t\t}\n \t}\n\n \treturn extractStacktrace(error, offset);\n }\n\n var priorityCount = 0;\n var unitSampler = void 0;\n\n /**\n * Advances the ProcessingQueue to the next item if it is ready.\n * @param {Boolean} last\n */\n function advance() {\n \tvar start = now();\n \tconfig.depth = (config.depth || 0) + 1;\n\n \twhile (config.queue.length && !config.blocking) {\n \t\tvar elapsedTime = now() - start;\n\n \t\tif (!defined.setTimeout || config.updateRate <= 0 || elapsedTime < config.updateRate) {\n \t\t\tif (priorityCount > 0) {\n \t\t\t\tpriorityCount--;\n \t\t\t}\n\n \t\t\tconfig.queue.shift()();\n \t\t} else {\n \t\t\tsetTimeout(advance);\n \t\t\tbreak;\n \t\t}\n \t}\n\n \tconfig.depth--;\n\n \tif (!config.blocking && !config.queue.length && config.depth === 0) {\n \t\tdone();\n \t}\n }\n\n function addToQueueImmediate(callback) {\n \tif (objectType(callback) === \"array\") {\n \t\twhile (callback.length) {\n \t\t\taddToQueueImmediate(callback.pop());\n \t\t}\n\n \t\treturn;\n \t}\n\n \tconfig.queue.unshift(callback);\n \tpriorityCount++;\n }\n\n /**\n * Adds a function to the ProcessingQueue for execution.\n * @param {Function|Array} callback\n * @param {Boolean} priority\n * @param {String} seed\n */\n function addToQueue(callback, prioritize, seed) {\n \tif (prioritize) {\n \t\tconfig.queue.splice(priorityCount++, 0, callback);\n \t} else if (seed) {\n \t\tif (!unitSampler) {\n \t\t\tunitSampler = unitSamplerGenerator(seed);\n \t\t}\n\n \t\t// Insert into a random position after all prioritized items\n \t\tvar index = Math.floor(unitSampler() * (config.queue.length - priorityCount + 1));\n \t\tconfig.queue.splice(priorityCount + index, 0, callback);\n \t} else {\n \t\tconfig.queue.push(callback);\n \t}\n }\n\n /**\n * Creates a seeded \"sample\" generator which is used for randomizing tests.\n */\n function unitSamplerGenerator(seed) {\n\n \t// 32-bit xorshift, requires only a nonzero seed\n \t// http://excamera.com/sphinx/article-xorshift.html\n \tvar sample = parseInt(generateHash(seed), 16) || -1;\n \treturn function () {\n \t\tsample ^= sample << 13;\n \t\tsample ^= sample >>> 17;\n \t\tsample ^= sample << 5;\n\n \t\t// ECMAScript has no unsigned number type\n \t\tif (sample < 0) {\n \t\t\tsample += 0x100000000;\n \t\t}\n\n \t\treturn sample / 0x100000000;\n \t};\n }\n\n /**\n * This function is called when the ProcessingQueue is done processing all\n * items. It handles emitting the final run events.\n */\n function done() {\n \tvar storage = config.storage;\n\n \tProcessingQueue.finished = true;\n\n \tvar runtime = now() - config.started;\n \tvar passed = config.stats.all - config.stats.bad;\n\n \temit(\"runEnd\", globalSuite.end(true));\n \trunLoggingCallbacks(\"done\", {\n \t\tpassed: passed,\n \t\tfailed: config.stats.bad,\n \t\ttotal: config.stats.all,\n \t\truntime: runtime\n \t});\n\n \t// Clear own storage items if all tests passed\n \tif (storage && config.stats.bad === 0) {\n \t\tfor (var i = storage.length - 1; i >= 0; i--) {\n \t\t\tvar key = storage.key(i);\n\n \t\t\tif (key.indexOf(\"qunit-test-\") === 0) {\n \t\t\t\tstorage.removeItem(key);\n \t\t\t}\n \t\t}\n \t}\n }\n\n var ProcessingQueue = {\n \tfinished: false,\n \tadd: addToQueue,\n \taddImmediate: addToQueueImmediate,\n \tadvance: advance\n };\n\n var TestReport = function () {\n \tfunction TestReport(name, suite, options) {\n \t\tclassCallCheck(this, TestReport);\n\n \t\tthis.name = name;\n \t\tthis.suiteName = suite.name;\n \t\tthis.fullName = suite.fullName.concat(name);\n \t\tthis.runtime = 0;\n \t\tthis.assertions = [];\n\n \t\tthis.skipped = !!options.skip;\n \t\tthis.todo = !!options.todo;\n\n \t\tthis.valid = options.valid;\n\n \t\tthis._startTime = 0;\n \t\tthis._endTime = 0;\n\n \t\tsuite.pushTest(this);\n \t}\n\n \tcreateClass(TestReport, [{\n \t\tkey: \"start\",\n \t\tvalue: function start(recordTime) {\n \t\t\tif (recordTime) {\n \t\t\t\tthis._startTime = Date.now();\n \t\t\t}\n\n \t\t\treturn {\n \t\t\t\tname: this.name,\n \t\t\t\tsuiteName: this.suiteName,\n \t\t\t\tfullName: this.fullName.slice()\n \t\t\t};\n \t\t}\n \t}, {\n \t\tkey: \"end\",\n \t\tvalue: function end(recordTime) {\n \t\t\tif (recordTime) {\n \t\t\t\tthis._endTime = Date.now();\n \t\t\t}\n\n \t\t\treturn extend(this.start(), {\n \t\t\t\truntime: this.getRuntime(),\n \t\t\t\tstatus: this.getStatus(),\n \t\t\t\terrors: this.getFailedAssertions(),\n \t\t\t\tassertions: this.getAssertions()\n \t\t\t});\n \t\t}\n \t}, {\n \t\tkey: \"pushAssertion\",\n \t\tvalue: function pushAssertion(assertion) {\n \t\t\tthis.assertions.push(assertion);\n \t\t}\n \t}, {\n \t\tkey: \"getRuntime\",\n \t\tvalue: function getRuntime() {\n \t\t\treturn this._endTime - this._startTime;\n \t\t}\n \t}, {\n \t\tkey: \"getStatus\",\n \t\tvalue: function getStatus() {\n \t\t\tif (this.skipped) {\n \t\t\t\treturn \"skipped\";\n \t\t\t}\n\n \t\t\tvar testPassed = this.getFailedAssertions().length > 0 ? this.todo : !this.todo;\n\n \t\t\tif (!testPassed) {\n \t\t\t\treturn \"failed\";\n \t\t\t} else if (this.todo) {\n \t\t\t\treturn \"todo\";\n \t\t\t} else {\n \t\t\t\treturn \"passed\";\n \t\t\t}\n \t\t}\n \t}, {\n \t\tkey: \"getFailedAssertions\",\n \t\tvalue: function getFailedAssertions() {\n \t\t\treturn this.assertions.filter(function (assertion) {\n \t\t\t\treturn !assertion.passed;\n \t\t\t});\n \t\t}\n \t}, {\n \t\tkey: \"getAssertions\",\n \t\tvalue: function getAssertions() {\n \t\t\treturn this.assertions.slice();\n \t\t}\n\n \t\t// Remove actual and expected values from assertions. This is to prevent\n \t\t// leaking memory throughout a test suite.\n\n \t}, {\n \t\tkey: \"slimAssertions\",\n \t\tvalue: function slimAssertions() {\n \t\t\tthis.assertions = this.assertions.map(function (assertion) {\n \t\t\t\tdelete assertion.actual;\n \t\t\t\tdelete assertion.expected;\n \t\t\t\treturn assertion;\n \t\t\t});\n \t\t}\n \t}]);\n \treturn TestReport;\n }();\n\n var focused$1 = false;\n\n function Test(settings) {\n \tvar i, l;\n\n \t++Test.count;\n\n \tthis.expected = null;\n \tthis.assertions = [];\n \tthis.semaphore = 0;\n \tthis.module = config.currentModule;\n \tthis.stack = sourceFromStacktrace(3);\n \tthis.steps = [];\n \tthis.timeout = undefined;\n\n \t// If a module is skipped, all its tests and the tests of the child suites\n \t// should be treated as skipped even if they are defined as `only` or `todo`.\n \t// As for `todo` module, all its tests will be treated as `todo` except for\n \t// tests defined as `skip` which will be left intact.\n \t//\n \t// So, if a test is defined as `todo` and is inside a skipped module, we should\n \t// then treat that test as if was defined as `skip`.\n \tif (this.module.skip) {\n \t\tsettings.skip = true;\n \t\tsettings.todo = false;\n\n \t\t// Skipped tests should be left intact\n \t} else if (this.module.todo && !settings.skip) {\n \t\tsettings.todo = true;\n \t}\n\n \textend(this, settings);\n\n \tthis.testReport = new TestReport(settings.testName, this.module.suiteReport, {\n \t\ttodo: settings.todo,\n \t\tskip: settings.skip,\n \t\tvalid: this.valid()\n \t});\n\n \t// Register unique strings\n \tfor (i = 0, l = this.module.tests; i < l.length; i++) {\n \t\tif (this.module.tests[i].name === this.testName) {\n \t\t\tthis.testName += \" \";\n \t\t}\n \t}\n\n \tthis.testId = generateHash(this.module.name, this.testName);\n\n \tthis.module.tests.push({\n \t\tname: this.testName,\n \t\ttestId: this.testId,\n \t\tskip: !!settings.skip\n \t});\n\n \tif (settings.skip) {\n\n \t\t// Skipped tests will fully ignore any sent callback\n \t\tthis.callback = function () {};\n \t\tthis.async = false;\n \t\tthis.expected = 0;\n \t} else {\n \t\tif (typeof this.callback !== \"function\") {\n \t\t\tvar method = this.todo ? \"todo\" : \"test\";\n\n \t\t\t// eslint-disable-next-line max-len\n \t\t\tthrow new TypeError(\"You must provide a function as a test callback to QUnit.\" + method + \"(\\\"\" + settings.testName + \"\\\")\");\n \t\t}\n\n \t\tthis.assert = new Assert(this);\n \t}\n }\n\n Test.count = 0;\n\n function getNotStartedModules(startModule) {\n \tvar module = startModule,\n \t modules = [];\n\n \twhile (module && module.testsRun === 0) {\n \t\tmodules.push(module);\n \t\tmodule = module.parentModule;\n \t}\n\n \treturn modules;\n }\n\n Test.prototype = {\n \tbefore: function before() {\n \t\tvar i,\n \t\t startModule,\n \t\t module = this.module,\n \t\t notStartedModules = getNotStartedModules(module);\n\n \t\tfor (i = notStartedModules.length - 1; i >= 0; i--) {\n \t\t\tstartModule = notStartedModules[i];\n \t\t\tstartModule.stats = { all: 0, bad: 0, started: now() };\n \t\t\temit(\"suiteStart\", startModule.suiteReport.start(true));\n \t\t\trunLoggingCallbacks(\"moduleStart\", {\n \t\t\t\tname: startModule.name,\n \t\t\t\ttests: startModule.tests\n \t\t\t});\n \t\t}\n\n \t\tconfig.current = this;\n\n \t\tthis.testEnvironment = extend({}, module.testEnvironment);\n\n \t\tthis.started = now();\n \t\temit(\"testStart\", this.testReport.start(true));\n \t\trunLoggingCallbacks(\"testStart\", {\n \t\t\tname: this.testName,\n \t\t\tmodule: module.name,\n \t\t\ttestId: this.testId,\n \t\t\tpreviousFailure: this.previousFailure\n \t\t});\n\n \t\tif (!config.pollution) {\n \t\t\tsaveGlobal();\n \t\t}\n \t},\n\n \trun: function run() {\n \t\tvar promise;\n\n \t\tconfig.current = this;\n\n \t\tthis.callbackStarted = now();\n\n \t\tif (config.notrycatch) {\n \t\t\trunTest(this);\n \t\t\treturn;\n \t\t}\n\n \t\ttry {\n \t\t\trunTest(this);\n \t\t} catch (e) {\n \t\t\tthis.pushFailure(\"Died on test #\" + (this.assertions.length + 1) + \" \" + this.stack + \": \" + (e.message || e), extractStacktrace(e, 0));\n\n \t\t\t// Else next test will carry the responsibility\n \t\t\tsaveGlobal();\n\n \t\t\t// Restart the tests if they're blocking\n \t\t\tif (config.blocking) {\n \t\t\t\tinternalRecover(this);\n \t\t\t}\n \t\t}\n\n \t\tfunction runTest(test) {\n \t\t\tpromise = test.callback.call(test.testEnvironment, test.assert);\n \t\t\ttest.resolvePromise(promise);\n\n \t\t\t// If the test has a \"lock\" on it, but the timeout is 0, then we push a\n \t\t\t// failure as the test should be synchronous.\n \t\t\tif (test.timeout === 0 && test.semaphore !== 0) {\n \t\t\t\tpushFailure(\"Test did not finish synchronously even though assert.timeout( 0 ) was used.\", sourceFromStacktrace(2));\n \t\t\t}\n \t\t}\n \t},\n\n \tafter: function after() {\n \t\tcheckPollution();\n \t},\n\n \tqueueHook: function queueHook(hook, hookName, hookOwner) {\n \t\tvar _this = this;\n\n \t\tvar callHook = function callHook() {\n \t\t\tvar promise = hook.call(_this.testEnvironment, _this.assert);\n \t\t\t_this.resolvePromise(promise, hookName);\n \t\t};\n\n \t\tvar runHook = function runHook() {\n \t\t\tif (hookName === \"before\") {\n \t\t\t\tif (hookOwner.unskippedTestsRun !== 0) {\n \t\t\t\t\treturn;\n \t\t\t\t}\n\n \t\t\t\t_this.preserveEnvironment = true;\n \t\t\t}\n\n \t\t\tif (hookName === \"after\" && hookOwner.unskippedTestsRun !== numberOfUnskippedTests(hookOwner) - 1 && config.queue.length > 2) {\n \t\t\t\treturn;\n \t\t\t}\n\n \t\t\tconfig.current = _this;\n \t\t\tif (config.notrycatch) {\n \t\t\t\tcallHook();\n \t\t\t\treturn;\n \t\t\t}\n \t\t\ttry {\n \t\t\t\tcallHook();\n \t\t\t} catch (error) {\n \t\t\t\t_this.pushFailure(hookName + \" failed on \" + _this.testName + \": \" + (error.message || error), extractStacktrace(error, 0));\n \t\t\t}\n \t\t};\n\n \t\treturn runHook;\n \t},\n\n\n \t// Currently only used for module level hooks, can be used to add global level ones\n \thooks: function hooks(handler) {\n \t\tvar hooks = [];\n\n \t\tfunction processHooks(test, module) {\n \t\t\tif (module.parentModule) {\n \t\t\t\tprocessHooks(test, module.parentModule);\n \t\t\t}\n\n \t\t\tif (module.hooks[handler].length) {\n \t\t\t\tfor (var i = 0; i < module.hooks[handler].length; i++) {\n \t\t\t\t\thooks.push(test.queueHook(module.hooks[handler][i], handler, module));\n \t\t\t\t}\n \t\t\t}\n \t\t}\n\n \t\t// Hooks are ignored on skipped tests\n \t\tif (!this.skip) {\n \t\t\tprocessHooks(this, this.module);\n \t\t}\n\n \t\treturn hooks;\n \t},\n\n\n \tfinish: function finish() {\n \t\tconfig.current = this;\n\n \t\tif (this.steps.length) {\n \t\t\tvar stepsList = this.steps.join(\", \");\n \t\t\tthis.pushFailure(\"Expected assert.verifySteps() to be called before end of test \" + (\"after using assert.step(). Unverified steps: \" + stepsList), this.stack);\n \t\t}\n\n \t\tif (config.requireExpects && this.expected === null) {\n \t\t\tthis.pushFailure(\"Expected number of assertions to be defined, but expect() was \" + \"not called.\", this.stack);\n \t\t} else if (this.expected !== null && this.expected !== this.assertions.length) {\n \t\t\tthis.pushFailure(\"Expected \" + this.expected + \" assertions, but \" + this.assertions.length + \" were run\", this.stack);\n \t\t} else if (this.expected === null && !this.assertions.length) {\n \t\t\tthis.pushFailure(\"Expected at least one assertion, but none were run - call \" + \"expect(0) to accept zero assertions.\", this.stack);\n \t\t}\n\n \t\tvar i,\n \t\t module = this.module,\n \t\t moduleName = module.name,\n \t\t testName = this.testName,\n \t\t skipped = !!this.skip,\n \t\t todo = !!this.todo,\n \t\t bad = 0,\n \t\t storage = config.storage;\n\n \t\tthis.runtime = now() - this.started;\n\n \t\tconfig.stats.all += this.assertions.length;\n \t\tmodule.stats.all += this.assertions.length;\n\n \t\tfor (i = 0; i < this.assertions.length; i++) {\n \t\t\tif (!this.assertions[i].result) {\n \t\t\t\tbad++;\n \t\t\t\tconfig.stats.bad++;\n \t\t\t\tmodule.stats.bad++;\n \t\t\t}\n \t\t}\n\n \t\tnotifyTestsRan(module, skipped);\n\n \t\t// Store result when possible\n \t\tif (storage) {\n \t\t\tif (bad) {\n \t\t\t\tstorage.setItem(\"qunit-test-\" + moduleName + \"-\" + testName, bad);\n \t\t\t} else {\n \t\t\t\tstorage.removeItem(\"qunit-test-\" + moduleName + \"-\" + testName);\n \t\t\t}\n \t\t}\n\n \t\t// After emitting the js-reporters event we cleanup the assertion data to\n \t\t// avoid leaking it. It is not used by the legacy testDone callbacks.\n \t\temit(\"testEnd\", this.testReport.end(true));\n \t\tthis.testReport.slimAssertions();\n\n \t\trunLoggingCallbacks(\"testDone\", {\n \t\t\tname: testName,\n \t\t\tmodule: moduleName,\n \t\t\tskipped: skipped,\n \t\t\ttodo: todo,\n \t\t\tfailed: bad,\n \t\t\tpassed: this.assertions.length - bad,\n \t\t\ttotal: this.assertions.length,\n \t\t\truntime: skipped ? 0 : this.runtime,\n\n \t\t\t// HTML Reporter use\n \t\t\tassertions: this.assertions,\n \t\t\ttestId: this.testId,\n\n \t\t\t// Source of Test\n \t\t\tsource: this.stack\n \t\t});\n\n \t\tif (module.testsRun === numberOfTests(module)) {\n \t\t\tlogSuiteEnd(module);\n\n \t\t\t// Check if the parent modules, iteratively, are done. If that the case,\n \t\t\t// we emit the `suiteEnd` event and trigger `moduleDone` callback.\n \t\t\tvar parent = module.parentModule;\n \t\t\twhile (parent && parent.testsRun === numberOfTests(parent)) {\n \t\t\t\tlogSuiteEnd(parent);\n \t\t\t\tparent = parent.parentModule;\n \t\t\t}\n \t\t}\n\n \t\tconfig.current = undefined;\n\n \t\tfunction logSuiteEnd(module) {\n \t\t\temit(\"suiteEnd\", module.suiteReport.end(true));\n \t\t\trunLoggingCallbacks(\"moduleDone\", {\n \t\t\t\tname: module.name,\n \t\t\t\ttests: module.tests,\n \t\t\t\tfailed: module.stats.bad,\n \t\t\t\tpassed: module.stats.all - module.stats.bad,\n \t\t\t\ttotal: module.stats.all,\n \t\t\t\truntime: now() - module.stats.started\n \t\t\t});\n \t\t}\n \t},\n\n \tpreserveTestEnvironment: function preserveTestEnvironment() {\n \t\tif (this.preserveEnvironment) {\n \t\t\tthis.module.testEnvironment = this.testEnvironment;\n \t\t\tthis.testEnvironment = extend({}, this.module.testEnvironment);\n \t\t}\n \t},\n\n \tqueue: function queue() {\n \t\tvar test = this;\n\n \t\tif (!this.valid()) {\n \t\t\treturn;\n \t\t}\n\n \t\tfunction runTest() {\n\n \t\t\t// Each of these can by async\n \t\t\tProcessingQueue.addImmediate([function () {\n \t\t\t\ttest.before();\n \t\t\t}, test.hooks(\"before\"), function () {\n \t\t\t\ttest.preserveTestEnvironment();\n \t\t\t}, test.hooks(\"beforeEach\"), function () {\n \t\t\t\ttest.run();\n \t\t\t}, test.hooks(\"afterEach\").reverse(), test.hooks(\"after\").reverse(), function () {\n \t\t\t\ttest.after();\n \t\t\t}, function () {\n \t\t\t\ttest.finish();\n \t\t\t}]);\n \t\t}\n\n \t\tvar previousFailCount = config.storage && +config.storage.getItem(\"qunit-test-\" + this.module.name + \"-\" + this.testName);\n\n \t\t// Prioritize previously failed tests, detected from storage\n \t\tvar prioritize = config.reorder && !!previousFailCount;\n\n \t\tthis.previousFailure = !!previousFailCount;\n\n \t\tProcessingQueue.add(runTest, prioritize, config.seed);\n\n \t\t// If the queue has already finished, we manually process the new test\n \t\tif (ProcessingQueue.finished) {\n \t\t\tProcessingQueue.advance();\n \t\t}\n \t},\n\n\n \tpushResult: function pushResult(resultInfo) {\n \t\tif (this !== config.current) {\n \t\t\tthrow new Error(\"Assertion occurred after test had finished.\");\n \t\t}\n\n \t\t// Destructure of resultInfo = { result, actual, expected, message, negative }\n \t\tvar source,\n \t\t details = {\n \t\t\tmodule: this.module.name,\n \t\t\tname: this.testName,\n \t\t\tresult: resultInfo.result,\n \t\t\tmessage: resultInfo.message,\n \t\t\tactual: resultInfo.actual,\n \t\t\ttestId: this.testId,\n \t\t\tnegative: resultInfo.negative || false,\n \t\t\truntime: now() - this.started,\n \t\t\ttodo: !!this.todo\n \t\t};\n\n \t\tif (hasOwn.call(resultInfo, \"expected\")) {\n \t\t\tdetails.expected = resultInfo.expected;\n \t\t}\n\n \t\tif (!resultInfo.result) {\n \t\t\tsource = resultInfo.source || sourceFromStacktrace();\n\n \t\t\tif (source) {\n \t\t\t\tdetails.source = source;\n \t\t\t}\n \t\t}\n\n \t\tthis.logAssertion(details);\n\n \t\tthis.assertions.push({\n \t\t\tresult: !!resultInfo.result,\n \t\t\tmessage: resultInfo.message\n \t\t});\n \t},\n\n \tpushFailure: function pushFailure(message, source, actual) {\n \t\tif (!(this instanceof Test)) {\n \t\t\tthrow new Error(\"pushFailure() assertion outside test context, was \" + sourceFromStacktrace(2));\n \t\t}\n\n \t\tthis.pushResult({\n \t\t\tresult: false,\n \t\t\tmessage: message || \"error\",\n \t\t\tactual: actual || null,\n \t\t\tsource: source\n \t\t});\n \t},\n\n \t/**\n * Log assertion details using both the old QUnit.log interface and\n * QUnit.on( \"assertion\" ) interface.\n *\n * @private\n */\n \tlogAssertion: function logAssertion(details) {\n \t\trunLoggingCallbacks(\"log\", details);\n\n \t\tvar assertion = {\n \t\t\tpassed: details.result,\n \t\t\tactual: details.actual,\n \t\t\texpected: details.expected,\n \t\t\tmessage: details.message,\n \t\t\tstack: details.source,\n \t\t\ttodo: details.todo\n \t\t};\n \t\tthis.testReport.pushAssertion(assertion);\n \t\temit(\"assertion\", assertion);\n \t},\n\n\n \tresolvePromise: function resolvePromise(promise, phase) {\n \t\tvar then,\n \t\t resume,\n \t\t message,\n \t\t test = this;\n \t\tif (promise != null) {\n \t\t\tthen = promise.then;\n \t\t\tif (objectType(then) === \"function\") {\n \t\t\t\tresume = internalStop(test);\n \t\t\t\tif (config.notrycatch) {\n \t\t\t\t\tthen.call(promise, function () {\n \t\t\t\t\t\tresume();\n \t\t\t\t\t});\n \t\t\t\t} else {\n \t\t\t\t\tthen.call(promise, function () {\n \t\t\t\t\t\tresume();\n \t\t\t\t\t}, function (error) {\n \t\t\t\t\t\tmessage = \"Promise rejected \" + (!phase ? \"during\" : phase.replace(/Each$/, \"\")) + \" \\\"\" + test.testName + \"\\\": \" + (error && error.message || error);\n \t\t\t\t\t\ttest.pushFailure(message, extractStacktrace(error, 0));\n\n \t\t\t\t\t\t// Else next test will carry the responsibility\n \t\t\t\t\t\tsaveGlobal();\n\n \t\t\t\t\t\t// Unblock\n \t\t\t\t\t\tinternalRecover(test);\n \t\t\t\t\t});\n \t\t\t\t}\n \t\t\t}\n \t\t}\n \t},\n\n \tvalid: function valid() {\n \t\tvar filter = config.filter,\n \t\t regexFilter = /^(!?)\\/([\\w\\W]*)\\/(i?$)/.exec(filter),\n \t\t module = config.module && config.module.toLowerCase(),\n \t\t fullName = this.module.name + \": \" + this.testName;\n\n \t\tfunction moduleChainNameMatch(testModule) {\n \t\t\tvar testModuleName = testModule.name ? testModule.name.toLowerCase() : null;\n \t\t\tif (testModuleName === module) {\n \t\t\t\treturn true;\n \t\t\t} else if (testModule.parentModule) {\n \t\t\t\treturn moduleChainNameMatch(testModule.parentModule);\n \t\t\t} else {\n \t\t\t\treturn false;\n \t\t\t}\n \t\t}\n\n \t\tfunction moduleChainIdMatch(testModule) {\n \t\t\treturn inArray(testModule.moduleId, config.moduleId) || testModule.parentModule && moduleChainIdMatch(testModule.parentModule);\n \t\t}\n\n \t\t// Internally-generated tests are always valid\n \t\tif (this.callback && this.callback.validTest) {\n \t\t\treturn true;\n \t\t}\n\n \t\tif (config.moduleId && config.moduleId.length > 0 && !moduleChainIdMatch(this.module)) {\n\n \t\t\treturn false;\n \t\t}\n\n \t\tif (config.testId && config.testId.length > 0 && !inArray(this.testId, config.testId)) {\n\n \t\t\treturn false;\n \t\t}\n\n \t\tif (module && !moduleChainNameMatch(this.module)) {\n \t\t\treturn false;\n \t\t}\n\n \t\tif (!filter) {\n \t\t\treturn true;\n \t\t}\n\n \t\treturn regexFilter ? this.regexFilter(!!regexFilter[1], regexFilter[2], regexFilter[3], fullName) : this.stringFilter(filter, fullName);\n \t},\n\n \tregexFilter: function regexFilter(exclude, pattern, flags, fullName) {\n \t\tvar regex = new RegExp(pattern, flags);\n \t\tvar match = regex.test(fullName);\n\n \t\treturn match !== exclude;\n \t},\n\n \tstringFilter: function stringFilter(filter, fullName) {\n \t\tfilter = filter.toLowerCase();\n \t\tfullName = fullName.toLowerCase();\n\n \t\tvar include = filter.charAt(0) !== \"!\";\n \t\tif (!include) {\n \t\t\tfilter = filter.slice(1);\n \t\t}\n\n \t\t// If the filter matches, we need to honour include\n \t\tif (fullName.indexOf(filter) !== -1) {\n \t\t\treturn include;\n \t\t}\n\n \t\t// Otherwise, do the opposite\n \t\treturn !include;\n \t}\n };\n\n function pushFailure() {\n \tif (!config.current) {\n \t\tthrow new Error(\"pushFailure() assertion outside test context, in \" + sourceFromStacktrace(2));\n \t}\n\n \t// Gets current test obj\n \tvar currentTest = config.current;\n\n \treturn currentTest.pushFailure.apply(currentTest, arguments);\n }\n\n function saveGlobal() {\n \tconfig.pollution = [];\n\n \tif (config.noglobals) {\n \t\tfor (var key in global$1) {\n \t\t\tif (hasOwn.call(global$1, key)) {\n\n \t\t\t\t// In Opera sometimes DOM element ids show up here, ignore them\n \t\t\t\tif (/^qunit-test-output/.test(key)) {\n \t\t\t\t\tcontinue;\n \t\t\t\t}\n \t\t\t\tconfig.pollution.push(key);\n \t\t\t}\n \t\t}\n \t}\n }\n\n function checkPollution() {\n \tvar newGlobals,\n \t deletedGlobals,\n \t old = config.pollution;\n\n \tsaveGlobal();\n\n \tnewGlobals = diff(config.pollution, old);\n \tif (newGlobals.length > 0) {\n \t\tpushFailure(\"Introduced global variable(s): \" + newGlobals.join(\", \"));\n \t}\n\n \tdeletedGlobals = diff(old, config.pollution);\n \tif (deletedGlobals.length > 0) {\n \t\tpushFailure(\"Deleted global variable(s): \" + deletedGlobals.join(\", \"));\n \t}\n }\n\n // Will be exposed as QUnit.test\n function test(testName, callback) {\n \tif (focused$1) {\n \t\treturn;\n \t}\n\n \tvar newTest = new Test({\n \t\ttestName: testName,\n \t\tcallback: callback\n \t});\n\n \tnewTest.queue();\n }\n\n function todo(testName, callback) {\n \tif (focused$1) {\n \t\treturn;\n \t}\n\n \tvar newTest = new Test({\n \t\ttestName: testName,\n \t\tcallback: callback,\n \t\ttodo: true\n \t});\n\n \tnewTest.queue();\n }\n\n // Will be exposed as QUnit.skip\n function skip(testName) {\n \tif (focused$1) {\n \t\treturn;\n \t}\n\n \tvar test = new Test({\n \t\ttestName: testName,\n \t\tskip: true\n \t});\n\n \ttest.queue();\n }\n\n // Will be exposed as QUnit.only\n function only(testName, callback) {\n \tif (focused$1) {\n \t\treturn;\n \t}\n\n \tconfig.queue.length = 0;\n \tfocused$1 = true;\n\n \tvar newTest = new Test({\n \t\ttestName: testName,\n \t\tcallback: callback\n \t});\n\n \tnewTest.queue();\n }\n\n // Put a hold on processing and return a function that will release it.\n function internalStop(test) {\n \ttest.semaphore += 1;\n \tconfig.blocking = true;\n\n \t// Set a recovery timeout, if so configured.\n \tif (defined.setTimeout) {\n \t\tvar timeoutDuration = void 0;\n\n \t\tif (typeof test.timeout === \"number\") {\n \t\t\ttimeoutDuration = test.timeout;\n \t\t} else if (typeof config.testTimeout === \"number\") {\n \t\t\ttimeoutDuration = config.testTimeout;\n \t\t}\n\n \t\tif (typeof timeoutDuration === \"number\" && timeoutDuration > 0) {\n \t\t\tclearTimeout(config.timeout);\n \t\t\tconfig.timeout = setTimeout(function () {\n \t\t\t\tpushFailure(\"Test took longer than \" + timeoutDuration + \"ms; test timed out.\", sourceFromStacktrace(2));\n \t\t\t\tinternalRecover(test);\n \t\t\t}, timeoutDuration);\n \t\t}\n \t}\n\n \tvar released = false;\n \treturn function resume() {\n \t\tif (released) {\n \t\t\treturn;\n \t\t}\n\n \t\treleased = true;\n \t\ttest.semaphore -= 1;\n \t\tinternalStart(test);\n \t};\n }\n\n // Forcefully release all processing holds.\n function internalRecover(test) {\n \ttest.semaphore = 0;\n \tinternalStart(test);\n }\n\n // Release a processing hold, scheduling a resumption attempt if no holds remain.\n function internalStart(test) {\n\n \t// If semaphore is non-numeric, throw error\n \tif (isNaN(test.semaphore)) {\n \t\ttest.semaphore = 0;\n\n \t\tpushFailure(\"Invalid value on test.semaphore\", sourceFromStacktrace(2));\n \t\treturn;\n \t}\n\n \t// Don't start until equal number of stop-calls\n \tif (test.semaphore > 0) {\n \t\treturn;\n \t}\n\n \t// Throw an Error if start is called more often than stop\n \tif (test.semaphore < 0) {\n \t\ttest.semaphore = 0;\n\n \t\tpushFailure(\"Tried to restart test while already started (test's semaphore was 0 already)\", sourceFromStacktrace(2));\n \t\treturn;\n \t}\n\n \t// Add a slight delay to allow more assertions etc.\n \tif (defined.setTimeout) {\n \t\tif (config.timeout) {\n \t\t\tclearTimeout(config.timeout);\n \t\t}\n \t\tconfig.timeout = setTimeout(function () {\n \t\t\tif (test.semaphore > 0) {\n \t\t\t\treturn;\n \t\t\t}\n\n \t\t\tif (config.timeout) {\n \t\t\t\tclearTimeout(config.timeout);\n \t\t\t}\n\n \t\t\tbegin();\n \t\t});\n \t} else {\n \t\tbegin();\n \t}\n }\n\n function collectTests(module) {\n \tvar tests = [].concat(module.tests);\n \tvar modules = [].concat(toConsumableArray(module.childModules));\n\n \t// Do a breadth-first traversal of the child modules\n \twhile (modules.length) {\n \t\tvar nextModule = modules.shift();\n \t\ttests.push.apply(tests, nextModule.tests);\n \t\tmodules.push.apply(modules, toConsumableArray(nextModule.childModules));\n \t}\n\n \treturn tests;\n }\n\n function numberOfTests(module) {\n \treturn collectTests(module).length;\n }\n\n function numberOfUnskippedTests(module) {\n \treturn collectTests(module).filter(function (test) {\n \t\treturn !test.skip;\n \t}).length;\n }\n\n function notifyTestsRan(module, skipped) {\n \tmodule.testsRun++;\n \tif (!skipped) {\n \t\tmodule.unskippedTestsRun++;\n \t}\n \twhile (module = module.parentModule) {\n \t\tmodule.testsRun++;\n \t\tif (!skipped) {\n \t\t\tmodule.unskippedTestsRun++;\n \t\t}\n \t}\n }\n\n /**\n * Returns a function that proxies to the given method name on the globals\n * console object. The proxy will also detect if the console doesn't exist and\n * will appropriately no-op. This allows support for IE9, which doesn't have a\n * console if the developer tools are not open.\n */\n function consoleProxy(method) {\n \treturn function () {\n \t\tif (console) {\n \t\t\tconsole[method].apply(console, arguments);\n \t\t}\n \t};\n }\n\n var Logger = {\n \twarn: consoleProxy(\"warn\")\n };\n\n var Assert = function () {\n \tfunction Assert(testContext) {\n \t\tclassCallCheck(this, Assert);\n\n \t\tthis.test = testContext;\n \t}\n\n \t// Assert helpers\n\n \tcreateClass(Assert, [{\n \t\tkey: \"timeout\",\n \t\tvalue: function timeout(duration) {\n \t\t\tif (typeof duration !== \"number\") {\n \t\t\t\tthrow new Error(\"You must pass a number as the duration to assert.timeout\");\n \t\t\t}\n\n \t\t\tthis.test.timeout = duration;\n \t\t}\n\n \t\t// Documents a \"step\", which is a string value, in a test as a passing assertion\n\n \t}, {\n \t\tkey: \"step\",\n \t\tvalue: function step(message) {\n \t\t\tvar result = !!message;\n\n \t\t\tthis.test.steps.push(message);\n\n \t\t\treturn this.pushResult({\n \t\t\t\tresult: result,\n \t\t\t\tmessage: message || \"You must provide a message to assert.step\"\n \t\t\t});\n \t\t}\n\n \t\t// Verifies the steps in a test match a given array of string values\n\n \t}, {\n \t\tkey: \"verifySteps\",\n \t\tvalue: function verifySteps(steps, message) {\n \t\t\tthis.deepEqual(this.test.steps, steps, message);\n \t\t\tthis.test.steps.length = 0;\n \t\t}\n\n \t\t// Specify the number of expected assertions to guarantee that failed test\n \t\t// (no assertions are run at all) don't slip through.\n\n \t}, {\n \t\tkey: \"expect\",\n \t\tvalue: function expect(asserts) {\n \t\t\tif (arguments.length === 1) {\n \t\t\t\tthis.test.expected = asserts;\n \t\t\t} else {\n \t\t\t\treturn this.test.expected;\n \t\t\t}\n \t\t}\n\n \t\t// Put a hold on processing and return a function that will release it a maximum of once.\n\n \t}, {\n \t\tkey: \"async\",\n \t\tvalue: function async(count) {\n \t\t\tvar test$$1 = this.test;\n\n \t\t\tvar popped = false,\n \t\t\t acceptCallCount = count;\n\n \t\t\tif (typeof acceptCallCount === \"undefined\") {\n \t\t\t\tacceptCallCount = 1;\n \t\t\t}\n\n \t\t\tvar resume = internalStop(test$$1);\n\n \t\t\treturn function done() {\n \t\t\t\tif (config.current !== test$$1) {\n \t\t\t\t\tthrow Error(\"assert.async callback called after test finished.\");\n \t\t\t\t}\n\n \t\t\t\tif (popped) {\n \t\t\t\t\ttest$$1.pushFailure(\"Too many calls to the `assert.async` callback\", sourceFromStacktrace(2));\n \t\t\t\t\treturn;\n \t\t\t\t}\n\n \t\t\t\tacceptCallCount -= 1;\n \t\t\t\tif (acceptCallCount > 0) {\n \t\t\t\t\treturn;\n \t\t\t\t}\n\n \t\t\t\tpopped = true;\n \t\t\t\tresume();\n \t\t\t};\n \t\t}\n\n \t\t// Exports test.push() to the user API\n \t\t// Alias of pushResult.\n\n \t}, {\n \t\tkey: \"push\",\n \t\tvalue: function push(result, actual, expected, message, negative) {\n \t\t\tLogger.warn(\"assert.push is deprecated and will be removed in QUnit 3.0.\" + \" Please use assert.pushResult instead (https://api.qunitjs.com/assert/pushResult).\");\n\n \t\t\tvar currentAssert = this instanceof Assert ? this : config.current.assert;\n \t\t\treturn currentAssert.pushResult({\n \t\t\t\tresult: result,\n \t\t\t\tactual: actual,\n \t\t\t\texpected: expected,\n \t\t\t\tmessage: message,\n \t\t\t\tnegative: negative\n \t\t\t});\n \t\t}\n \t}, {\n \t\tkey: \"pushResult\",\n \t\tvalue: function pushResult(resultInfo) {\n\n \t\t\t// Destructure of resultInfo = { result, actual, expected, message, negative }\n \t\t\tvar assert = this;\n \t\t\tvar currentTest = assert instanceof Assert && assert.test || config.current;\n\n \t\t\t// Backwards compatibility fix.\n \t\t\t// Allows the direct use of global exported assertions and QUnit.assert.*\n \t\t\t// Although, it's use is not recommended as it can leak assertions\n \t\t\t// to other tests from async tests, because we only get a reference to the current test,\n \t\t\t// not exactly the test where assertion were intended to be called.\n \t\t\tif (!currentTest) {\n \t\t\t\tthrow new Error(\"assertion outside test context, in \" + sourceFromStacktrace(2));\n \t\t\t}\n\n \t\t\tif (!(assert instanceof Assert)) {\n \t\t\t\tassert = currentTest.assert;\n \t\t\t}\n\n \t\t\treturn assert.test.pushResult(resultInfo);\n \t\t}\n \t}, {\n \t\tkey: \"ok\",\n \t\tvalue: function ok(result, message) {\n \t\t\tif (!message) {\n \t\t\t\tmessage = result ? \"okay\" : \"failed, expected argument to be truthy, was: \" + dump.parse(result);\n \t\t\t}\n\n \t\t\tthis.pushResult({\n \t\t\t\tresult: !!result,\n \t\t\t\tactual: result,\n \t\t\t\texpected: true,\n \t\t\t\tmessage: message\n \t\t\t});\n \t\t}\n \t}, {\n \t\tkey: \"notOk\",\n \t\tvalue: function notOk(result, message) {\n \t\t\tif (!message) {\n \t\t\t\tmessage = !result ? \"okay\" : \"failed, expected argument to be falsy, was: \" + dump.parse(result);\n \t\t\t}\n\n \t\t\tthis.pushResult({\n \t\t\t\tresult: !result,\n \t\t\t\tactual: result,\n \t\t\t\texpected: false,\n \t\t\t\tmessage: message\n \t\t\t});\n \t\t}\n \t}, {\n \t\tkey: \"equal\",\n \t\tvalue: function equal(actual, expected, message) {\n\n \t\t\t// eslint-disable-next-line eqeqeq\n \t\t\tvar result = expected == actual;\n\n \t\t\tthis.pushResult({\n \t\t\t\tresult: result,\n \t\t\t\tactual: actual,\n \t\t\t\texpected: expected,\n \t\t\t\tmessage: message\n \t\t\t});\n \t\t}\n \t}, {\n \t\tkey: \"notEqual\",\n \t\tvalue: function notEqual(actual, expected, message) {\n\n \t\t\t// eslint-disable-next-line eqeqeq\n \t\t\tvar result = expected != actual;\n\n \t\t\tthis.pushResult({\n \t\t\t\tresult: result,\n \t\t\t\tactual: actual,\n \t\t\t\texpected: expected,\n \t\t\t\tmessage: message,\n \t\t\t\tnegative: true\n \t\t\t});\n \t\t}\n \t}, {\n \t\tkey: \"propEqual\",\n \t\tvalue: function propEqual(actual, expected, message) {\n \t\t\tactual = objectValues(actual);\n \t\t\texpected = objectValues(expected);\n\n \t\t\tthis.pushResult({\n \t\t\t\tresult: equiv(actual, expected),\n \t\t\t\tactual: actual,\n \t\t\t\texpected: expected,\n \t\t\t\tmessage: message\n \t\t\t});\n \t\t}\n \t}, {\n \t\tkey: \"notPropEqual\",\n \t\tvalue: function notPropEqual(actual, expected, message) {\n \t\t\tactual = objectValues(actual);\n \t\t\texpected = objectValues(expected);\n\n \t\t\tthis.pushResult({\n \t\t\t\tresult: !equiv(actual, expected),\n \t\t\t\tactual: actual,\n \t\t\t\texpected: expected,\n \t\t\t\tmessage: message,\n \t\t\t\tnegative: true\n \t\t\t});\n \t\t}\n \t}, {\n \t\tkey: \"deepEqual\",\n \t\tvalue: function deepEqual(actual, expected, message) {\n \t\t\tthis.pushResult({\n \t\t\t\tresult: equiv(actual, expected),\n \t\t\t\tactual: actual,\n \t\t\t\texpected: expected,\n \t\t\t\tmessage: message\n \t\t\t});\n \t\t}\n \t}, {\n \t\tkey: \"notDeepEqual\",\n \t\tvalue: function notDeepEqual(actual, expected, message) {\n \t\t\tthis.pushResult({\n \t\t\t\tresult: !equiv(actual, expected),\n \t\t\t\tactual: actual,\n \t\t\t\texpected: expected,\n \t\t\t\tmessage: message,\n \t\t\t\tnegative: true\n \t\t\t});\n \t\t}\n \t}, {\n \t\tkey: \"strictEqual\",\n \t\tvalue: function strictEqual(actual, expected, message) {\n \t\t\tthis.pushResult({\n \t\t\t\tresult: expected === actual,\n \t\t\t\tactual: actual,\n \t\t\t\texpected: expected,\n \t\t\t\tmessage: message\n \t\t\t});\n \t\t}\n \t}, {\n \t\tkey: \"notStrictEqual\",\n \t\tvalue: function notStrictEqual(actual, expected, message) {\n \t\t\tthis.pushResult({\n \t\t\t\tresult: expected !== actual,\n \t\t\t\tactual: actual,\n \t\t\t\texpected: expected,\n \t\t\t\tmessage: message,\n \t\t\t\tnegative: true\n \t\t\t});\n \t\t}\n \t}, {\n \t\tkey: \"throws\",\n \t\tvalue: function throws(block, expected, message) {\n \t\t\tvar actual = void 0,\n \t\t\t result = false;\n\n \t\t\tvar currentTest = this instanceof Assert && this.test || config.current;\n\n \t\t\t// 'expected' is optional unless doing string comparison\n \t\t\tif (objectType(expected) === \"string\") {\n \t\t\t\tif (message == null) {\n \t\t\t\t\tmessage = expected;\n \t\t\t\t\texpected = null;\n \t\t\t\t} else {\n \t\t\t\t\tthrow new Error(\"throws/raises does not accept a string value for the expected argument.\\n\" + \"Use a non-string object value (e.g. regExp) instead if it's necessary.\");\n \t\t\t\t}\n \t\t\t}\n\n \t\t\tcurrentTest.ignoreGlobalErrors = true;\n \t\t\ttry {\n \t\t\t\tblock.call(currentTest.testEnvironment);\n \t\t\t} catch (e) {\n \t\t\t\tactual = e;\n \t\t\t}\n \t\t\tcurrentTest.ignoreGlobalErrors = false;\n\n \t\t\tif (actual) {\n \t\t\t\tvar expectedType = objectType(expected);\n\n \t\t\t\t// We don't want to validate thrown error\n \t\t\t\tif (!expected) {\n \t\t\t\t\tresult = true;\n \t\t\t\t\texpected = null;\n\n \t\t\t\t\t// Expected is a regexp\n \t\t\t\t} else if (expectedType === \"regexp\") {\n \t\t\t\t\tresult = expected.test(errorString(actual));\n\n \t\t\t\t\t// Expected is a constructor, maybe an Error constructor\n \t\t\t\t} else if (expectedType === \"function\" && actual instanceof expected) {\n \t\t\t\t\tresult = true;\n\n \t\t\t\t\t// Expected is an Error object\n \t\t\t\t} else if (expectedType === \"object\") {\n \t\t\t\t\tresult = actual instanceof expected.constructor && actual.name === expected.name && actual.message === expected.message;\n\n \t\t\t\t\t// Expected is a validation function which returns true if validation passed\n \t\t\t\t} else if (expectedType === \"function\" && expected.call({}, actual) === true) {\n \t\t\t\t\texpected = null;\n \t\t\t\t\tresult = true;\n \t\t\t\t}\n \t\t\t}\n\n \t\t\tcurrentTest.assert.pushResult({\n \t\t\t\tresult: result,\n \t\t\t\tactual: actual,\n \t\t\t\texpected: expected,\n \t\t\t\tmessage: message\n \t\t\t});\n \t\t}\n \t}, {\n \t\tkey: \"rejects\",\n \t\tvalue: function rejects(promise, expected, message) {\n \t\t\tvar result = false;\n\n \t\t\tvar currentTest = this instanceof Assert && this.test || config.current;\n\n \t\t\t// 'expected' is optional unless doing string comparison\n \t\t\tif (objectType(expected) === \"string\") {\n \t\t\t\tif (message === undefined) {\n \t\t\t\t\tmessage = expected;\n \t\t\t\t\texpected = undefined;\n \t\t\t\t} else {\n \t\t\t\t\tmessage = \"assert.rejects does not accept a string value for the expected \" + \"argument.\\nUse a non-string object value (e.g. validator function) instead \" + \"if necessary.\";\n\n \t\t\t\t\tcurrentTest.assert.pushResult({\n \t\t\t\t\t\tresult: false,\n \t\t\t\t\t\tmessage: message\n \t\t\t\t\t});\n\n \t\t\t\t\treturn;\n \t\t\t\t}\n \t\t\t}\n\n \t\t\tvar then = promise && promise.then;\n \t\t\tif (objectType(then) !== \"function\") {\n \t\t\t\tvar _message = \"The value provided to `assert.rejects` in \" + \"\\\"\" + currentTest.testName + \"\\\" was not a promise.\";\n\n \t\t\t\tcurrentTest.assert.pushResult({\n \t\t\t\t\tresult: false,\n \t\t\t\t\tmessage: _message,\n \t\t\t\t\tactual: promise\n \t\t\t\t});\n\n \t\t\t\treturn;\n \t\t\t}\n\n \t\t\tvar done = this.async();\n\n \t\t\treturn then.call(promise, function handleFulfillment() {\n \t\t\t\tvar message = \"The promise returned by the `assert.rejects` callback in \" + \"\\\"\" + currentTest.testName + \"\\\" did not reject.\";\n\n \t\t\t\tcurrentTest.assert.pushResult({\n \t\t\t\t\tresult: false,\n \t\t\t\t\tmessage: message,\n \t\t\t\t\tactual: promise\n \t\t\t\t});\n\n \t\t\t\tdone();\n \t\t\t}, function handleRejection(actual) {\n \t\t\t\tif (actual) {\n \t\t\t\t\tvar expectedType = objectType(expected);\n\n \t\t\t\t\t// We don't want to validate\n \t\t\t\t\tif (expected === undefined) {\n \t\t\t\t\t\tresult = true;\n \t\t\t\t\t\texpected = null;\n\n \t\t\t\t\t\t// Expected is a regexp\n \t\t\t\t\t} else if (expectedType === \"regexp\") {\n \t\t\t\t\t\tresult = expected.test(errorString(actual));\n\n \t\t\t\t\t\t// Expected is a constructor, maybe an Error constructor\n \t\t\t\t\t} else if (expectedType === \"function\" && actual instanceof expected) {\n \t\t\t\t\t\tresult = true;\n\n \t\t\t\t\t\t// Expected is an Error object\n \t\t\t\t\t} else if (expectedType === \"object\") {\n \t\t\t\t\t\tresult = actual instanceof expected.constructor && actual.name === expected.name && actual.message === expected.message;\n\n \t\t\t\t\t\t// Expected is a validation function which returns true if validation passed\n \t\t\t\t\t} else {\n \t\t\t\t\t\tif (expectedType === \"function\") {\n \t\t\t\t\t\t\tresult = expected.call({}, actual) === true;\n \t\t\t\t\t\t\texpected = null;\n\n \t\t\t\t\t\t\t// Expected is some other invalid type\n \t\t\t\t\t\t} else {\n \t\t\t\t\t\t\tresult = false;\n \t\t\t\t\t\t\tmessage = \"invalid expected value provided to `assert.rejects` \" + \"callback in \\\"\" + currentTest.testName + \"\\\": \" + expectedType + \".\";\n \t\t\t\t\t\t}\n \t\t\t\t\t}\n \t\t\t\t}\n\n \t\t\t\tcurrentTest.assert.pushResult({\n \t\t\t\t\tresult: result,\n \t\t\t\t\tactual: actual,\n \t\t\t\t\texpected: expected,\n \t\t\t\t\tmessage: message\n \t\t\t\t});\n\n \t\t\t\tdone();\n \t\t\t});\n \t\t}\n \t}]);\n \treturn Assert;\n }();\n\n // Provide an alternative to assert.throws(), for environments that consider throws a reserved word\n // Known to us are: Closure Compiler, Narwhal\n // eslint-disable-next-line dot-notation\n\n\n Assert.prototype.raises = Assert.prototype[\"throws\"];\n\n /**\n * Converts an error into a simple string for comparisons.\n *\n * @param {Error} error\n * @return {String}\n */\n function errorString(error) {\n \tvar resultErrorString = error.toString();\n\n \tif (resultErrorString.substring(0, 7) === \"[object\") {\n \t\tvar name = error.name ? error.name.toString() : \"Error\";\n \t\tvar message = error.message ? error.message.toString() : \"\";\n\n \t\tif (name && message) {\n \t\t\treturn name + \": \" + message;\n \t\t} else if (name) {\n \t\t\treturn name;\n \t\t} else if (message) {\n \t\t\treturn message;\n \t\t} else {\n \t\t\treturn \"Error\";\n \t\t}\n \t} else {\n \t\treturn resultErrorString;\n \t}\n }\n\n /* global module, exports, define */\n function exportQUnit(QUnit) {\n\n \tif (defined.document) {\n\n \t\t// QUnit may be defined when it is preconfigured but then only QUnit and QUnit.config may be defined.\n \t\tif (window.QUnit && window.QUnit.version) {\n \t\t\tthrow new Error(\"QUnit has already been defined.\");\n \t\t}\n\n \t\twindow.QUnit = QUnit;\n \t}\n\n \t// For nodejs\n \tif (typeof module !== \"undefined\" && module && module.exports) {\n \t\tmodule.exports = QUnit;\n\n \t\t// For consistency with CommonJS environments' exports\n \t\tmodule.exports.QUnit = QUnit;\n \t}\n\n \t// For CommonJS with exports, but without module.exports, like Rhino\n \tif (typeof exports !== \"undefined\" && exports) {\n \t\texports.QUnit = QUnit;\n \t}\n\n \tif (typeof define === \"function\" && define.amd) {\n \t\tdefine(function () {\n \t\t\treturn QUnit;\n \t\t});\n \t\tQUnit.config.autostart = false;\n \t}\n\n \t// For Web/Service Workers\n \tif (self$1 && self$1.WorkerGlobalScope && self$1 instanceof self$1.WorkerGlobalScope) {\n \t\tself$1.QUnit = QUnit;\n \t}\n }\n\n var SuiteReport = function () {\n \tfunction SuiteReport(name, parentSuite) {\n \t\tclassCallCheck(this, SuiteReport);\n\n \t\tthis.name = name;\n \t\tthis.fullName = parentSuite ? parentSuite.fullName.concat(name) : [];\n\n \t\tthis.tests = [];\n \t\tthis.childSuites = [];\n\n \t\tif (parentSuite) {\n \t\t\tparentSuite.pushChildSuite(this);\n \t\t}\n \t}\n\n \tcreateClass(SuiteReport, [{\n \t\tkey: \"start\",\n \t\tvalue: function start(recordTime) {\n \t\t\tif (recordTime) {\n \t\t\t\tthis._startTime = Date.now();\n \t\t\t}\n\n \t\t\treturn {\n \t\t\t\tname: this.name,\n \t\t\t\tfullName: this.fullName.slice(),\n \t\t\t\ttests: this.tests.map(function (test) {\n \t\t\t\t\treturn test.start();\n \t\t\t\t}),\n \t\t\t\tchildSuites: this.childSuites.map(function (suite) {\n \t\t\t\t\treturn suite.start();\n \t\t\t\t}),\n \t\t\t\ttestCounts: {\n \t\t\t\t\ttotal: this.getTestCounts().total\n \t\t\t\t}\n \t\t\t};\n \t\t}\n \t}, {\n \t\tkey: \"end\",\n \t\tvalue: function end(recordTime) {\n \t\t\tif (recordTime) {\n \t\t\t\tthis._endTime = Date.now();\n \t\t\t}\n\n \t\t\treturn {\n \t\t\t\tname: this.name,\n \t\t\t\tfullName: this.fullName.slice(),\n \t\t\t\ttests: this.tests.map(function (test) {\n \t\t\t\t\treturn test.end();\n \t\t\t\t}),\n \t\t\t\tchildSuites: this.childSuites.map(function (suite) {\n \t\t\t\t\treturn suite.end();\n \t\t\t\t}),\n \t\t\t\ttestCounts: this.getTestCounts(),\n \t\t\t\truntime: this.getRuntime(),\n \t\t\t\tstatus: this.getStatus()\n \t\t\t};\n \t\t}\n \t}, {\n \t\tkey: \"pushChildSuite\",\n \t\tvalue: function pushChildSuite(suite) {\n \t\t\tthis.childSuites.push(suite);\n \t\t}\n \t}, {\n \t\tkey: \"pushTest\",\n \t\tvalue: function pushTest(test) {\n \t\t\tthis.tests.push(test);\n \t\t}\n \t}, {\n \t\tkey: \"getRuntime\",\n \t\tvalue: function getRuntime() {\n \t\t\treturn this._endTime - this._startTime;\n \t\t}\n \t}, {\n \t\tkey: \"getTestCounts\",\n \t\tvalue: function getTestCounts() {\n \t\t\tvar counts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { passed: 0, failed: 0, skipped: 0, todo: 0, total: 0 };\n\n \t\t\tcounts = this.tests.reduce(function (counts, test) {\n \t\t\t\tif (test.valid) {\n \t\t\t\t\tcounts[test.getStatus()]++;\n \t\t\t\t\tcounts.total++;\n \t\t\t\t}\n\n \t\t\t\treturn counts;\n \t\t\t}, counts);\n\n \t\t\treturn this.childSuites.reduce(function (counts, suite) {\n \t\t\t\treturn suite.getTestCounts(counts);\n \t\t\t}, counts);\n \t\t}\n \t}, {\n \t\tkey: \"getStatus\",\n \t\tvalue: function getStatus() {\n \t\t\tvar _getTestCounts = this.getTestCounts(),\n \t\t\t total = _getTestCounts.total,\n \t\t\t failed = _getTestCounts.failed,\n \t\t\t skipped = _getTestCounts.skipped,\n \t\t\t todo = _getTestCounts.todo;\n\n \t\t\tif (failed) {\n \t\t\t\treturn \"failed\";\n \t\t\t} else {\n \t\t\t\tif (skipped === total) {\n \t\t\t\t\treturn \"skipped\";\n \t\t\t\t} else if (todo === total) {\n \t\t\t\t\treturn \"todo\";\n \t\t\t\t} else {\n \t\t\t\t\treturn \"passed\";\n \t\t\t\t}\n \t\t\t}\n \t\t}\n \t}]);\n \treturn SuiteReport;\n }();\n\n // Handle an unhandled exception. By convention, returns true if further\n // error handling should be suppressed and false otherwise.\n // In this case, we will only suppress further error handling if the\n // \"ignoreGlobalErrors\" configuration option is enabled.\n function onError(error) {\n \tfor (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n \t\targs[_key - 1] = arguments[_key];\n \t}\n\n \tif (config.current) {\n \t\tif (config.current.ignoreGlobalErrors) {\n \t\t\treturn true;\n \t\t}\n \t\tpushFailure.apply(undefined, [error.message, error.fileName + \":\" + error.lineNumber].concat(args));\n \t} else {\n \t\ttest(\"global failure\", extend(function () {\n \t\t\tpushFailure.apply(undefined, [error.message, error.fileName + \":\" + error.lineNumber].concat(args));\n \t\t}, { validTest: true }));\n \t}\n\n \treturn false;\n }\n\n // Handle an unhandled rejection\n function onUnhandledRejection(reason) {\n \tvar resultInfo = {\n \t\tresult: false,\n \t\tmessage: reason.message || \"error\",\n \t\tactual: reason,\n \t\tsource: reason.stack || sourceFromStacktrace(3)\n \t};\n\n \tvar currentTest = config.current;\n \tif (currentTest) {\n \t\tcurrentTest.assert.pushResult(resultInfo);\n \t} else {\n \t\ttest(\"global failure\", extend(function (assert) {\n \t\t\tassert.pushResult(resultInfo);\n \t\t}, { validTest: true }));\n \t}\n }\n\n var focused = false;\n var QUnit = {};\n var globalSuite = new SuiteReport();\n\n // The initial \"currentModule\" represents the global (or top-level) module that\n // is not explicitly defined by the user, therefore we add the \"globalSuite\" to\n // it since each module has a suiteReport associated with it.\n config.currentModule.suiteReport = globalSuite;\n\n var moduleStack = [];\n var globalStartCalled = false;\n var runStarted = false;\n\n // Figure out if we're running the tests from a server or not\n QUnit.isLocal = !(defined.document && window.location.protocol !== \"file:\");\n\n // Expose the current QUnit version\n QUnit.version = \"2.5.1\";\n\n function createModule(name, testEnvironment, modifiers) {\n \tvar parentModule = moduleStack.length ? moduleStack.slice(-1)[0] : null;\n \tvar moduleName = parentModule !== null ? [parentModule.name, name].join(\" > \") : name;\n \tvar parentSuite = parentModule ? parentModule.suiteReport : globalSuite;\n\n \tvar skip$$1 = parentModule !== null && parentModule.skip || modifiers.skip;\n \tvar todo$$1 = parentModule !== null && parentModule.todo || modifiers.todo;\n\n \tvar module = {\n \t\tname: moduleName,\n \t\tparentModule: parentModule,\n \t\ttests: [],\n \t\tmoduleId: generateHash(moduleName),\n \t\ttestsRun: 0,\n \t\tunskippedTestsRun: 0,\n \t\tchildModules: [],\n \t\tsuiteReport: new SuiteReport(name, parentSuite),\n\n \t\t// Pass along `skip` and `todo` properties from parent module, in case\n \t\t// there is one, to childs. And use own otherwise.\n \t\t// This property will be used to mark own tests and tests of child suites\n \t\t// as either `skipped` or `todo`.\n \t\tskip: skip$$1,\n \t\ttodo: skip$$1 ? false : todo$$1\n \t};\n\n \tvar env = {};\n \tif (parentModule) {\n \t\tparentModule.childModules.push(module);\n \t\textend(env, parentModule.testEnvironment);\n \t}\n \textend(env, testEnvironment);\n \tmodule.testEnvironment = env;\n\n \tconfig.modules.push(module);\n \treturn module;\n }\n\n function processModule(name, options, executeNow) {\n \tvar modifiers = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n\n \tvar module = createModule(name, options, modifiers);\n\n \t// Move any hooks to a 'hooks' object\n \tvar testEnvironment = module.testEnvironment;\n \tvar hooks = module.hooks = {};\n\n \tsetHookFromEnvironment(hooks, testEnvironment, \"before\");\n \tsetHookFromEnvironment(hooks, testEnvironment, \"beforeEach\");\n \tsetHookFromEnvironment(hooks, testEnvironment, \"afterEach\");\n \tsetHookFromEnvironment(hooks, testEnvironment, \"after\");\n\n \tfunction setHookFromEnvironment(hooks, environment, name) {\n \t\tvar potentialHook = environment[name];\n \t\thooks[name] = typeof potentialHook === \"function\" ? [potentialHook] : [];\n \t\tdelete environment[name];\n \t}\n\n \tvar moduleFns = {\n \t\tbefore: setHookFunction(module, \"before\"),\n \t\tbeforeEach: setHookFunction(module, \"beforeEach\"),\n \t\tafterEach: setHookFunction(module, \"afterEach\"),\n \t\tafter: setHookFunction(module, \"after\")\n \t};\n\n \tvar currentModule = config.currentModule;\n \tif (objectType(executeNow) === \"function\") {\n \t\tmoduleStack.push(module);\n \t\tconfig.currentModule = module;\n \t\texecuteNow.call(module.testEnvironment, moduleFns);\n \t\tmoduleStack.pop();\n \t\tmodule = module.parentModule || currentModule;\n \t}\n\n \tconfig.currentModule = module;\n }\n\n // TODO: extract this to a new file alongside its related functions\n function module$1(name, options, executeNow) {\n \tif (focused) {\n \t\treturn;\n \t}\n\n \tif (arguments.length === 2) {\n \t\tif (objectType(options) === \"function\") {\n \t\t\texecuteNow = options;\n \t\t\toptions = undefined;\n \t\t}\n \t}\n\n \tprocessModule(name, options, executeNow);\n }\n\n module$1.only = function () {\n \tif (focused) {\n \t\treturn;\n \t}\n\n \tconfig.modules.length = 0;\n \tconfig.queue.length = 0;\n\n \tmodule$1.apply(undefined, arguments);\n\n \tfocused = true;\n };\n\n module$1.skip = function (name, options, executeNow) {\n \tif (focused) {\n \t\treturn;\n \t}\n\n \tif (arguments.length === 2) {\n \t\tif (objectType(options) === \"function\") {\n \t\t\texecuteNow = options;\n \t\t\toptions = undefined;\n \t\t}\n \t}\n\n \tprocessModule(name, options, executeNow, { skip: true });\n };\n\n module$1.todo = function (name, options, executeNow) {\n \tif (focused) {\n \t\treturn;\n \t}\n\n \tif (arguments.length === 2) {\n \t\tif (objectType(options) === \"function\") {\n \t\t\texecuteNow = options;\n \t\t\toptions = undefined;\n \t\t}\n \t}\n\n \tprocessModule(name, options, executeNow, { todo: true });\n };\n\n extend(QUnit, {\n \ton: on,\n\n \tmodule: module$1,\n\n \ttest: test,\n\n \ttodo: todo,\n\n \tskip: skip,\n\n \tonly: only,\n\n \tstart: function start(count) {\n \t\tvar globalStartAlreadyCalled = globalStartCalled;\n\n \t\tif (!config.current) {\n \t\t\tglobalStartCalled = true;\n\n \t\t\tif (runStarted) {\n \t\t\t\tthrow new Error(\"Called start() while test already started running\");\n \t\t\t} else if (globalStartAlreadyCalled || count > 1) {\n \t\t\t\tthrow new Error(\"Called start() outside of a test context too many times\");\n \t\t\t} else if (config.autostart) {\n \t\t\t\tthrow new Error(\"Called start() outside of a test context when \" + \"QUnit.config.autostart was true\");\n \t\t\t} else if (!config.pageLoaded) {\n\n \t\t\t\t// The page isn't completely loaded yet, so we set autostart and then\n \t\t\t\t// load if we're in Node or wait for the browser's load event.\n \t\t\t\tconfig.autostart = true;\n\n \t\t\t\t// Starts from Node even if .load was not previously called. We still return\n \t\t\t\t// early otherwise we'll wind up \"beginning\" twice.\n \t\t\t\tif (!defined.document) {\n \t\t\t\t\tQUnit.load();\n \t\t\t\t}\n\n \t\t\t\treturn;\n \t\t\t}\n \t\t} else {\n \t\t\tthrow new Error(\"QUnit.start cannot be called inside a test context.\");\n \t\t}\n\n \t\tscheduleBegin();\n \t},\n\n \tconfig: config,\n\n \tis: is,\n\n \tobjectType: objectType,\n\n \textend: extend,\n\n \tload: function load() {\n \t\tconfig.pageLoaded = true;\n\n \t\t// Initialize the configuration options\n \t\textend(config, {\n \t\t\tstats: { all: 0, bad: 0 },\n \t\t\tstarted: 0,\n \t\t\tupdateRate: 1000,\n \t\t\tautostart: true,\n \t\t\tfilter: \"\"\n \t\t}, true);\n\n \t\tif (!runStarted) {\n \t\t\tconfig.blocking = false;\n\n \t\t\tif (config.autostart) {\n \t\t\t\tscheduleBegin();\n \t\t\t}\n \t\t}\n \t},\n\n \tstack: function stack(offset) {\n \t\toffset = (offset || 0) + 2;\n \t\treturn sourceFromStacktrace(offset);\n \t},\n\n \tonError: onError,\n\n \tonUnhandledRejection: onUnhandledRejection\n });\n\n QUnit.pushFailure = pushFailure;\n QUnit.assert = Assert.prototype;\n QUnit.equiv = equiv;\n QUnit.dump = dump;\n\n registerLoggingCallbacks(QUnit);\n\n function scheduleBegin() {\n\n \trunStarted = true;\n\n \t// Add a slight delay to allow definition of more modules and tests.\n \tif (defined.setTimeout) {\n \t\tsetTimeout(function () {\n \t\t\tbegin();\n \t\t});\n \t} else {\n \t\tbegin();\n \t}\n }\n\n function begin() {\n \tvar i,\n \t l,\n \t modulesLog = [];\n\n \t// If the test run hasn't officially begun yet\n \tif (!config.started) {\n\n \t\t// Record the time of the test run's beginning\n \t\tconfig.started = now();\n\n \t\t// Delete the loose unnamed module if unused.\n \t\tif (config.modules[0].name === \"\" && config.modules[0].tests.length === 0) {\n \t\t\tconfig.modules.shift();\n \t\t}\n\n \t\t// Avoid unnecessary information by not logging modules' test environments\n \t\tfor (i = 0, l = config.modules.length; i < l; i++) {\n \t\t\tmodulesLog.push({\n \t\t\t\tname: config.modules[i].name,\n \t\t\t\ttests: config.modules[i].tests\n \t\t\t});\n \t\t}\n\n \t\t// The test run is officially beginning now\n \t\temit(\"runStart\", globalSuite.start(true));\n \t\trunLoggingCallbacks(\"begin\", {\n \t\t\ttotalTests: Test.count,\n \t\t\tmodules: modulesLog\n \t\t});\n \t}\n\n \tconfig.blocking = false;\n \tProcessingQueue.advance();\n }\n\n function setHookFunction(module, hookName) {\n \treturn function setHook(callback) {\n \t\tmodule.hooks[hookName].push(callback);\n \t};\n }\n\n exportQUnit(QUnit);\n\n (function () {\n\n \tif (typeof window === \"undefined\" || typeof document === \"undefined\") {\n \t\treturn;\n \t}\n\n \tvar config = QUnit.config,\n \t hasOwn = Object.prototype.hasOwnProperty;\n\n \t// Stores fixture HTML for resetting later\n \tfunction storeFixture() {\n\n \t\t// Avoid overwriting user-defined values\n \t\tif (hasOwn.call(config, \"fixture\")) {\n \t\t\treturn;\n \t\t}\n\n \t\tvar fixture = document.getElementById(\"qunit-fixture\");\n \t\tif (fixture) {\n \t\t\tconfig.fixture = fixture.cloneNode(true);\n \t\t}\n \t}\n\n \tQUnit.begin(storeFixture);\n\n \t// Resets the fixture DOM element if available.\n \tfunction resetFixture() {\n \t\tif (config.fixture == null) {\n \t\t\treturn;\n \t\t}\n\n \t\tvar fixture = document.getElementById(\"qunit-fixture\");\n \t\tvar resetFixtureType = _typeof(config.fixture);\n \t\tif (resetFixtureType === \"string\") {\n\n \t\t\t// support user defined values for `config.fixture`\n \t\t\tvar newFixture = document.createElement(\"div\");\n \t\t\tnewFixture.setAttribute(\"id\", \"qunit-fixture\");\n \t\t\tnewFixture.innerHTML = config.fixture;\n \t\t\tfixture.parentNode.replaceChild(newFixture, fixture);\n \t\t} else {\n \t\t\tvar clonedFixture = config.fixture.cloneNode(true);\n \t\t\tfixture.parentNode.replaceChild(clonedFixture, fixture);\n \t\t}\n \t}\n\n \tQUnit.testStart(resetFixture);\n })();\n\n (function () {\n\n \t// Only interact with URLs via window.location\n \tvar location = typeof window !== \"undefined\" && window.location;\n \tif (!location) {\n \t\treturn;\n \t}\n\n \tvar urlParams = getUrlParams();\n\n \tQUnit.urlParams = urlParams;\n\n \t// Match module/test by inclusion in an array\n \tQUnit.config.moduleId = [].concat(urlParams.moduleId || []);\n \tQUnit.config.testId = [].concat(urlParams.testId || []);\n\n \t// Exact case-insensitive match of the module name\n \tQUnit.config.module = urlParams.module;\n\n \t// Regular expression or case-insenstive substring match against \"moduleName: testName\"\n \tQUnit.config.filter = urlParams.filter;\n\n \t// Test order randomization\n \tif (urlParams.seed === true) {\n\n \t\t// Generate a random seed if the option is specified without a value\n \t\tQUnit.config.seed = Math.random().toString(36).slice(2);\n \t} else if (urlParams.seed) {\n \t\tQUnit.config.seed = urlParams.seed;\n \t}\n\n \t// Add URL-parameter-mapped config values with UI form rendering data\n \tQUnit.config.urlConfig.push({\n \t\tid: \"hidepassed\",\n \t\tlabel: \"Hide passed tests\",\n \t\ttooltip: \"Only show tests and assertions that fail. Stored as query-strings.\"\n \t}, {\n \t\tid: \"noglobals\",\n \t\tlabel: \"Check for Globals\",\n \t\ttooltip: \"Enabling this will test if any test introduces new properties on the \" + \"global object (`window` in Browsers). Stored as query-strings.\"\n \t}, {\n \t\tid: \"notrycatch\",\n \t\tlabel: \"No try-catch\",\n \t\ttooltip: \"Enabling this will run tests outside of a try-catch block. Makes debugging \" + \"exceptions in IE reasonable. Stored as query-strings.\"\n \t});\n\n \tQUnit.begin(function () {\n \t\tvar i,\n \t\t option,\n \t\t urlConfig = QUnit.config.urlConfig;\n\n \t\tfor (i = 0; i < urlConfig.length; i++) {\n\n \t\t\t// Options can be either strings or objects with nonempty \"id\" properties\n \t\t\toption = QUnit.config.urlConfig[i];\n \t\t\tif (typeof option !== \"string\") {\n \t\t\t\toption = option.id;\n \t\t\t}\n\n \t\t\tif (QUnit.config[option] === undefined) {\n \t\t\t\tQUnit.config[option] = urlParams[option];\n \t\t\t}\n \t\t}\n \t});\n\n \tfunction getUrlParams() {\n \t\tvar i, param, name, value;\n \t\tvar urlParams = Object.create(null);\n \t\tvar params = location.search.slice(1).split(\"&\");\n \t\tvar length = params.length;\n\n \t\tfor (i = 0; i < length; i++) {\n \t\t\tif (params[i]) {\n \t\t\t\tparam = params[i].split(\"=\");\n \t\t\t\tname = decodeQueryParam(param[0]);\n\n \t\t\t\t// Allow just a key to turn on a flag, e.g., test.html?noglobals\n \t\t\t\tvalue = param.length === 1 || decodeQueryParam(param.slice(1).join(\"=\"));\n \t\t\t\tif (name in urlParams) {\n \t\t\t\t\turlParams[name] = [].concat(urlParams[name], value);\n \t\t\t\t} else {\n \t\t\t\t\turlParams[name] = value;\n \t\t\t\t}\n \t\t\t}\n \t\t}\n\n \t\treturn urlParams;\n \t}\n\n \tfunction decodeQueryParam(param) {\n \t\treturn decodeURIComponent(param.replace(/\\+/g, \"%20\"));\n \t}\n })();\n\n var stats = {\n \tpassedTests: 0,\n \tfailedTests: 0,\n \tskippedTests: 0,\n \ttodoTests: 0\n };\n\n // Escape text for attribute or text content.\n function escapeText(s) {\n \tif (!s) {\n \t\treturn \"\";\n \t}\n \ts = s + \"\";\n\n \t// Both single quotes and double quotes (for attributes)\n \treturn s.replace(/['\"<>&]/g, function (s) {\n \t\tswitch (s) {\n \t\t\tcase \"'\":\n \t\t\t\treturn \"&#039;\";\n \t\t\tcase \"\\\"\":\n \t\t\t\treturn \"&quot;\";\n \t\t\tcase \"<\":\n \t\t\t\treturn \"&lt;\";\n \t\t\tcase \">\":\n \t\t\t\treturn \"&gt;\";\n \t\t\tcase \"&\":\n \t\t\t\treturn \"&amp;\";\n \t\t}\n \t});\n }\n\n (function () {\n\n \t// Don't load the HTML Reporter on non-browser environments\n \tif (typeof window === \"undefined\" || !window.document) {\n \t\treturn;\n \t}\n\n \tvar config = QUnit.config,\n \t document$$1 = window.document,\n \t collapseNext = false,\n \t hasOwn = Object.prototype.hasOwnProperty,\n \t unfilteredUrl = setUrl({ filter: undefined, module: undefined,\n \t\tmoduleId: undefined, testId: undefined }),\n \t modulesList = [];\n\n \tfunction addEvent(elem, type, fn) {\n \t\telem.addEventListener(type, fn, false);\n \t}\n\n \tfunction removeEvent(elem, type, fn) {\n \t\telem.removeEventListener(type, fn, false);\n \t}\n\n \tfunction addEvents(elems, type, fn) {\n \t\tvar i = elems.length;\n \t\twhile (i--) {\n \t\t\taddEvent(elems[i], type, fn);\n \t\t}\n \t}\n\n \tfunction hasClass(elem, name) {\n \t\treturn (\" \" + elem.className + \" \").indexOf(\" \" + name + \" \") >= 0;\n \t}\n\n \tfunction addClass(elem, name) {\n \t\tif (!hasClass(elem, name)) {\n \t\t\telem.className += (elem.className ? \" \" : \"\") + name;\n \t\t}\n \t}\n\n \tfunction toggleClass(elem, name, force) {\n \t\tif (force || typeof force === \"undefined\" && !hasClass(elem, name)) {\n \t\t\taddClass(elem, name);\n \t\t} else {\n \t\t\tremoveClass(elem, name);\n \t\t}\n \t}\n\n \tfunction removeClass(elem, name) {\n \t\tvar set = \" \" + elem.className + \" \";\n\n \t\t// Class name may appear multiple times\n \t\twhile (set.indexOf(\" \" + name + \" \") >= 0) {\n \t\t\tset = set.replace(\" \" + name + \" \", \" \");\n \t\t}\n\n \t\t// Trim for prettiness\n \t\telem.className = typeof set.trim === \"function\" ? set.trim() : set.replace(/^\\s+|\\s+$/g, \"\");\n \t}\n\n \tfunction id(name) {\n \t\treturn document$$1.getElementById && document$$1.getElementById(name);\n \t}\n\n \tfunction abortTests() {\n \t\tvar abortButton = id(\"qunit-abort-tests-button\");\n \t\tif (abortButton) {\n \t\t\tabortButton.disabled = true;\n \t\t\tabortButton.innerHTML = \"Aborting...\";\n \t\t}\n \t\tQUnit.config.queue.length = 0;\n \t\treturn false;\n \t}\n\n \tfunction interceptNavigation(ev) {\n \t\tapplyUrlParams();\n\n \t\tif (ev && ev.preventDefault) {\n \t\t\tev.preventDefault();\n \t\t}\n\n \t\treturn false;\n \t}\n\n \tfunction getUrlConfigHtml() {\n \t\tvar i,\n \t\t j,\n \t\t val,\n \t\t escaped,\n \t\t escapedTooltip,\n \t\t selection = false,\n \t\t urlConfig = config.urlConfig,\n \t\t urlConfigHtml = \"\";\n\n \t\tfor (i = 0; i < urlConfig.length; i++) {\n\n \t\t\t// Options can be either strings or objects with nonempty \"id\" properties\n \t\t\tval = config.urlConfig[i];\n \t\t\tif (typeof val === \"string\") {\n \t\t\t\tval = {\n \t\t\t\t\tid: val,\n \t\t\t\t\tlabel: val\n \t\t\t\t};\n \t\t\t}\n\n \t\t\tescaped = escapeText(val.id);\n \t\t\tescapedTooltip = escapeText(val.tooltip);\n\n \t\t\tif (!val.value || typeof val.value === \"string\") {\n \t\t\t\turlConfigHtml += \"<label for='qunit-urlconfig-\" + escaped + \"' title='\" + escapedTooltip + \"'><input id='qunit-urlconfig-\" + escaped + \"' name='\" + escaped + \"' type='checkbox'\" + (val.value ? \" value='\" + escapeText(val.value) + \"'\" : \"\") + (config[val.id] ? \" checked='checked'\" : \"\") + \" title='\" + escapedTooltip + \"' />\" + escapeText(val.label) + \"</label>\";\n \t\t\t} else {\n \t\t\t\turlConfigHtml += \"<label for='qunit-urlconfig-\" + escaped + \"' title='\" + escapedTooltip + \"'>\" + val.label + \": </label><select id='qunit-urlconfig-\" + escaped + \"' name='\" + escaped + \"' title='\" + escapedTooltip + \"'><option></option>\";\n\n \t\t\t\tif (QUnit.is(\"array\", val.value)) {\n \t\t\t\t\tfor (j = 0; j < val.value.length; j++) {\n \t\t\t\t\t\tescaped = escapeText(val.value[j]);\n \t\t\t\t\t\turlConfigHtml += \"<option value='\" + escaped + \"'\" + (config[val.id] === val.value[j] ? (selection = true) && \" selected='selected'\" : \"\") + \">\" + escaped + \"</option>\";\n \t\t\t\t\t}\n \t\t\t\t} else {\n \t\t\t\t\tfor (j in val.value) {\n \t\t\t\t\t\tif (hasOwn.call(val.value, j)) {\n \t\t\t\t\t\t\turlConfigHtml += \"<option value='\" + escapeText(j) + \"'\" + (config[val.id] === j ? (selection = true) && \" selected='selected'\" : \"\") + \">\" + escapeText(val.value[j]) + \"</option>\";\n \t\t\t\t\t\t}\n \t\t\t\t\t}\n \t\t\t\t}\n \t\t\t\tif (config[val.id] && !selection) {\n \t\t\t\t\tescaped = escapeText(config[val.id]);\n \t\t\t\t\turlConfigHtml += \"<option value='\" + escaped + \"' selected='selected' disabled='disabled'>\" + escaped + \"</option>\";\n \t\t\t\t}\n \t\t\t\turlConfigHtml += \"</select>\";\n \t\t\t}\n \t\t}\n\n \t\treturn urlConfigHtml;\n \t}\n\n \t// Handle \"click\" events on toolbar checkboxes and \"change\" for select menus.\n \t// Updates the URL with the new state of `config.urlConfig` values.\n \tfunction toolbarChanged() {\n \t\tvar updatedUrl,\n \t\t value,\n \t\t tests,\n \t\t field = this,\n \t\t params = {};\n\n \t\t// Detect if field is a select menu or a checkbox\n \t\tif (\"selectedIndex\" in field) {\n \t\t\tvalue = field.options[field.selectedIndex].value || undefined;\n \t\t} else {\n \t\t\tvalue = field.checked ? field.defaultValue || true : undefined;\n \t\t}\n\n \t\tparams[field.name] = value;\n \t\tupdatedUrl = setUrl(params);\n\n \t\t// Check if we can apply the change without a page refresh\n \t\tif (\"hidepassed\" === field.name && \"replaceState\" in window.history) {\n \t\t\tQUnit.urlParams[field.name] = value;\n \t\t\tconfig[field.name] = value || false;\n \t\t\ttests = id(\"qunit-tests\");\n \t\t\tif (tests) {\n \t\t\t\ttoggleClass(tests, \"hidepass\", value || false);\n \t\t\t}\n \t\t\twindow.history.replaceState(null, \"\", updatedUrl);\n \t\t} else {\n \t\t\twindow.location = updatedUrl;\n \t\t}\n \t}\n\n \tfunction setUrl(params) {\n \t\tvar key,\n \t\t arrValue,\n \t\t i,\n \t\t querystring = \"?\",\n \t\t location = window.location;\n\n \t\tparams = QUnit.extend(QUnit.extend({}, QUnit.urlParams), params);\n\n \t\tfor (key in params) {\n\n \t\t\t// Skip inherited or undefined properties\n \t\t\tif (hasOwn.call(params, key) && params[key] !== undefined) {\n\n \t\t\t\t// Output a parameter for each value of this key\n \t\t\t\t// (but usually just one)\n \t\t\t\tarrValue = [].concat(params[key]);\n \t\t\t\tfor (i = 0; i < arrValue.length; i++) {\n \t\t\t\t\tquerystring += encodeURIComponent(key);\n \t\t\t\t\tif (arrValue[i] !== true) {\n \t\t\t\t\t\tquerystring += \"=\" + encodeURIComponent(arrValue[i]);\n \t\t\t\t\t}\n \t\t\t\t\tquerystring += \"&\";\n \t\t\t\t}\n \t\t\t}\n \t\t}\n \t\treturn location.protocol + \"//\" + location.host + location.pathname + querystring.slice(0, -1);\n \t}\n\n \tfunction applyUrlParams() {\n \t\tvar i,\n \t\t selectedModules = [],\n \t\t modulesList = id(\"qunit-modulefilter-dropdown-list\").getElementsByTagName(\"input\"),\n \t\t filter = id(\"qunit-filter-input\").value;\n\n \t\tfor (i = 0; i < modulesList.length; i++) {\n \t\t\tif (modulesList[i].checked) {\n \t\t\t\tselectedModules.push(modulesList[i].value);\n \t\t\t}\n \t\t}\n\n \t\twindow.location = setUrl({\n \t\t\tfilter: filter === \"\" ? undefined : filter,\n \t\t\tmoduleId: selectedModules.length === 0 ? undefined : selectedModules,\n\n \t\t\t// Remove module and testId filter\n \t\t\tmodule: undefined,\n \t\t\ttestId: undefined\n \t\t});\n \t}\n\n \tfunction toolbarUrlConfigContainer() {\n \t\tvar urlConfigContainer = document$$1.createElement(\"span\");\n\n \t\turlConfigContainer.innerHTML = getUrlConfigHtml();\n \t\taddClass(urlConfigContainer, \"qunit-url-config\");\n\n \t\taddEvents(urlConfigContainer.getElementsByTagName(\"input\"), \"change\", toolbarChanged);\n \t\taddEvents(urlConfigContainer.getElementsByTagName(\"select\"), \"change\", toolbarChanged);\n\n \t\treturn urlConfigContainer;\n \t}\n\n \tfunction abortTestsButton() {\n \t\tvar button = document$$1.createElement(\"button\");\n \t\tbutton.id = \"qunit-abort-tests-button\";\n \t\tbutton.innerHTML = \"Abort\";\n \t\taddEvent(button, \"click\", abortTests);\n \t\treturn button;\n \t}\n\n \tfunction toolbarLooseFilter() {\n \t\tvar filter = document$$1.createElement(\"form\"),\n \t\t label = document$$1.createElement(\"label\"),\n \t\t input = document$$1.createElement(\"input\"),\n \t\t button = document$$1.createElement(\"button\");\n\n \t\taddClass(filter, \"qunit-filter\");\n\n \t\tlabel.innerHTML = \"Filter: \";\n\n \t\tinput.type = \"text\";\n \t\tinput.value = config.filter || \"\";\n \t\tinput.name = \"filter\";\n \t\tinput.id = \"qunit-filter-input\";\n\n \t\tbutton.innerHTML = \"Go\";\n\n \t\tlabel.appendChild(input);\n\n \t\tfilter.appendChild(label);\n \t\tfilter.appendChild(document$$1.createTextNode(\" \"));\n \t\tfilter.appendChild(button);\n \t\taddEvent(filter, \"submit\", interceptNavigation);\n\n \t\treturn filter;\n \t}\n\n \tfunction moduleListHtml() {\n \t\tvar i,\n \t\t checked,\n \t\t html = \"\";\n\n \t\tfor (i = 0; i < config.modules.length; i++) {\n \t\t\tif (config.modules[i].name !== \"\") {\n \t\t\t\tchecked = config.moduleId.indexOf(config.modules[i].moduleId) > -1;\n \t\t\t\thtml += \"<li><label class='clickable\" + (checked ? \" checked\" : \"\") + \"'><input type='checkbox' \" + \"value='\" + config.modules[i].moduleId + \"'\" + (checked ? \" checked='checked'\" : \"\") + \" />\" + escapeText(config.modules[i].name) + \"</label></li>\";\n \t\t\t}\n \t\t}\n\n \t\treturn html;\n \t}\n\n \tfunction toolbarModuleFilter() {\n \t\tvar allCheckbox,\n \t\t commit,\n \t\t reset,\n \t\t moduleFilter = document$$1.createElement(\"form\"),\n \t\t label = document$$1.createElement(\"label\"),\n \t\t moduleSearch = document$$1.createElement(\"input\"),\n \t\t dropDown = document$$1.createElement(\"div\"),\n \t\t actions = document$$1.createElement(\"span\"),\n \t\t dropDownList = document$$1.createElement(\"ul\"),\n \t\t dirty = false;\n\n \t\tmoduleSearch.id = \"qunit-modulefilter-search\";\n \t\taddEvent(moduleSearch, \"input\", searchInput);\n \t\taddEvent(moduleSearch, \"input\", searchFocus);\n \t\taddEvent(moduleSearch, \"focus\", searchFocus);\n \t\taddEvent(moduleSearch, \"click\", searchFocus);\n\n \t\tlabel.id = \"qunit-modulefilter-search-container\";\n \t\tlabel.innerHTML = \"Module: \";\n \t\tlabel.appendChild(moduleSearch);\n\n \t\tactions.id = \"qunit-modulefilter-actions\";\n \t\tactions.innerHTML = \"<button style='display:none'>Apply</button>\" + \"<button type='reset' style='display:none'>Reset</button>\" + \"<label class='clickable\" + (config.moduleId.length ? \"\" : \" checked\") + \"'><input type='checkbox'\" + (config.moduleId.length ? \"\" : \" checked='checked'\") + \">All modules</label>\";\n \t\tallCheckbox = actions.lastChild.firstChild;\n \t\tcommit = actions.firstChild;\n \t\treset = commit.nextSibling;\n \t\taddEvent(commit, \"click\", applyUrlParams);\n\n \t\tdropDownList.id = \"qunit-modulefilter-dropdown-list\";\n \t\tdropDownList.innerHTML = moduleListHtml();\n\n \t\tdropDown.id = \"qunit-modulefilter-dropdown\";\n \t\tdropDown.style.display = \"none\";\n \t\tdropDown.appendChild(actions);\n \t\tdropDown.appendChild(dropDownList);\n \t\taddEvent(dropDown, \"change\", selectionChange);\n \t\tselectionChange();\n\n \t\tmoduleFilter.id = \"qunit-modulefilter\";\n \t\tmoduleFilter.appendChild(label);\n \t\tmoduleFilter.appendChild(dropDown);\n \t\taddEvent(moduleFilter, \"submit\", interceptNavigation);\n \t\taddEvent(moduleFilter, \"reset\", function () {\n\n \t\t\t// Let the reset happen, then update styles\n \t\t\twindow.setTimeout(selectionChange);\n \t\t});\n\n \t\t// Enables show/hide for the dropdown\n \t\tfunction searchFocus() {\n \t\t\tif (dropDown.style.display !== \"none\") {\n \t\t\t\treturn;\n \t\t\t}\n\n \t\t\tdropDown.style.display = \"block\";\n \t\t\taddEvent(document$$1, \"click\", hideHandler);\n \t\t\taddEvent(document$$1, \"keydown\", hideHandler);\n\n \t\t\t// Hide on Escape keydown or outside-container click\n \t\t\tfunction hideHandler(e) {\n \t\t\t\tvar inContainer = moduleFilter.contains(e.target);\n\n \t\t\t\tif (e.keyCode === 27 || !inContainer) {\n \t\t\t\t\tif (e.keyCode === 27 && inContainer) {\n \t\t\t\t\t\tmoduleSearch.focus();\n \t\t\t\t\t}\n \t\t\t\t\tdropDown.style.display = \"none\";\n \t\t\t\t\tremoveEvent(document$$1, \"click\", hideHandler);\n \t\t\t\t\tremoveEvent(document$$1, \"keydown\", hideHandler);\n \t\t\t\t\tmoduleSearch.value = \"\";\n \t\t\t\t\tsearchInput();\n \t\t\t\t}\n \t\t\t}\n \t\t}\n\n \t\t// Processes module search box input\n \t\tfunction searchInput() {\n \t\t\tvar i,\n \t\t\t item,\n \t\t\t searchText = moduleSearch.value.toLowerCase(),\n \t\t\t listItems = dropDownList.children;\n\n \t\t\tfor (i = 0; i < listItems.length; i++) {\n \t\t\t\titem = listItems[i];\n \t\t\t\tif (!searchText || item.textContent.toLowerCase().indexOf(searchText) > -1) {\n \t\t\t\t\titem.style.display = \"\";\n \t\t\t\t} else {\n \t\t\t\t\titem.style.display = \"none\";\n \t\t\t\t}\n \t\t\t}\n \t\t}\n\n \t\t// Processes selection changes\n \t\tfunction selectionChange(evt) {\n \t\t\tvar i,\n \t\t\t item,\n \t\t\t checkbox = evt && evt.target || allCheckbox,\n \t\t\t modulesList = dropDownList.getElementsByTagName(\"input\"),\n \t\t\t selectedNames = [];\n\n \t\t\ttoggleClass(checkbox.parentNode, \"checked\", checkbox.checked);\n\n \t\t\tdirty = false;\n \t\t\tif (checkbox.checked && checkbox !== allCheckbox) {\n \t\t\t\tallCheckbox.checked = false;\n \t\t\t\tremoveClass(allCheckbox.parentNode, \"checked\");\n \t\t\t}\n \t\t\tfor (i = 0; i < modulesList.length; i++) {\n \t\t\t\titem = modulesList[i];\n \t\t\t\tif (!evt) {\n \t\t\t\t\ttoggleClass(item.parentNode, \"checked\", item.checked);\n \t\t\t\t} else if (checkbox === allCheckbox && checkbox.checked) {\n \t\t\t\t\titem.checked = false;\n \t\t\t\t\tremoveClass(item.parentNode, \"checked\");\n \t\t\t\t}\n \t\t\t\tdirty = dirty || item.checked !== item.defaultChecked;\n \t\t\t\tif (item.checked) {\n \t\t\t\t\tselectedNames.push(item.parentNode.textContent);\n \t\t\t\t}\n \t\t\t}\n\n \t\t\tcommit.style.display = reset.style.display = dirty ? \"\" : \"none\";\n \t\t\tmoduleSearch.placeholder = selectedNames.join(\", \") || allCheckbox.parentNode.textContent;\n \t\t\tmoduleSearch.title = \"Type to filter list. Current selection:\\n\" + (selectedNames.join(\"\\n\") || allCheckbox.parentNode.textContent);\n \t\t}\n\n \t\treturn moduleFilter;\n \t}\n\n \tfunction appendToolbar() {\n \t\tvar toolbar = id(\"qunit-testrunner-toolbar\");\n\n \t\tif (toolbar) {\n \t\t\ttoolbar.appendChild(toolbarUrlConfigContainer());\n \t\t\ttoolbar.appendChild(toolbarModuleFilter());\n \t\t\ttoolbar.appendChild(toolbarLooseFilter());\n \t\t\ttoolbar.appendChild(document$$1.createElement(\"div\")).className = \"clearfix\";\n \t\t}\n \t}\n\n \tfunction appendHeader() {\n \t\tvar header = id(\"qunit-header\");\n\n \t\tif (header) {\n \t\t\theader.innerHTML = \"<a href='\" + escapeText(unfilteredUrl) + \"'>\" + header.innerHTML + \"</a> \";\n \t\t}\n \t}\n\n \tfunction appendBanner() {\n \t\tvar banner = id(\"qunit-banner\");\n\n \t\tif (banner) {\n \t\t\tbanner.className = \"\";\n \t\t}\n \t}\n\n \tfunction appendTestResults() {\n \t\tvar tests = id(\"qunit-tests\"),\n \t\t result = id(\"qunit-testresult\"),\n \t\t controls;\n\n \t\tif (result) {\n \t\t\tresult.parentNode.removeChild(result);\n \t\t}\n\n \t\tif (tests) {\n \t\t\ttests.innerHTML = \"\";\n \t\t\tresult = document$$1.createElement(\"p\");\n \t\t\tresult.id = \"qunit-testresult\";\n \t\t\tresult.className = \"result\";\n \t\t\ttests.parentNode.insertBefore(result, tests);\n \t\t\tresult.innerHTML = \"<div id=\\\"qunit-testresult-display\\\">Running...<br />&#160;</div>\" + \"<div id=\\\"qunit-testresult-controls\\\"></div>\" + \"<div class=\\\"clearfix\\\"></div>\";\n \t\t\tcontrols = id(\"qunit-testresult-controls\");\n \t\t}\n\n \t\tif (controls) {\n \t\t\tcontrols.appendChild(abortTestsButton());\n \t\t}\n \t}\n\n \tfunction appendFilteredTest() {\n \t\tvar testId = QUnit.config.testId;\n \t\tif (!testId || testId.length <= 0) {\n \t\t\treturn \"\";\n \t\t}\n \t\treturn \"<div id='qunit-filteredTest'>Rerunning selected tests: \" + escapeText(testId.join(\", \")) + \" <a id='qunit-clearFilter' href='\" + escapeText(unfilteredUrl) + \"'>Run all tests</a></div>\";\n \t}\n\n \tfunction appendUserAgent() {\n \t\tvar userAgent = id(\"qunit-userAgent\");\n\n \t\tif (userAgent) {\n \t\t\tuserAgent.innerHTML = \"\";\n \t\t\tuserAgent.appendChild(document$$1.createTextNode(\"QUnit \" + QUnit.version + \"; \" + navigator.userAgent));\n \t\t}\n \t}\n\n \tfunction appendInterface() {\n \t\tvar qunit = id(\"qunit\");\n\n \t\tif (qunit) {\n \t\t\tqunit.innerHTML = \"<h1 id='qunit-header'>\" + escapeText(document$$1.title) + \"</h1>\" + \"<h2 id='qunit-banner'></h2>\" + \"<div id='qunit-testrunner-toolbar'></div>\" + appendFilteredTest() + \"<h2 id='qunit-userAgent'></h2>\" + \"<ol id='qunit-tests'></ol>\";\n \t\t}\n\n \t\tappendHeader();\n \t\tappendBanner();\n \t\tappendTestResults();\n \t\tappendUserAgent();\n \t\tappendToolbar();\n \t}\n\n \tfunction appendTestsList(modules) {\n \t\tvar i, l, x, z, test, moduleObj;\n\n \t\tfor (i = 0, l = modules.length; i < l; i++) {\n \t\t\tmoduleObj = modules[i];\n\n \t\t\tfor (x = 0, z = moduleObj.tests.length; x < z; x++) {\n \t\t\t\ttest = moduleObj.tests[x];\n\n \t\t\t\tappendTest(test.name, test.testId, moduleObj.name);\n \t\t\t}\n \t\t}\n \t}\n\n \tfunction appendTest(name, testId, moduleName) {\n \t\tvar title,\n \t\t rerunTrigger,\n \t\t testBlock,\n \t\t assertList,\n \t\t tests = id(\"qunit-tests\");\n\n \t\tif (!tests) {\n \t\t\treturn;\n \t\t}\n\n \t\ttitle = document$$1.createElement(\"strong\");\n \t\ttitle.innerHTML = getNameHtml(name, moduleName);\n\n \t\trerunTrigger = document$$1.createElement(\"a\");\n \t\trerunTrigger.innerHTML = \"Rerun\";\n \t\trerunTrigger.href = setUrl({ testId: testId });\n\n \t\ttestBlock = document$$1.createElement(\"li\");\n \t\ttestBlock.appendChild(title);\n \t\ttestBlock.appendChild(rerunTrigger);\n \t\ttestBlock.id = \"qunit-test-output-\" + testId;\n\n \t\tassertList = document$$1.createElement(\"ol\");\n \t\tassertList.className = \"qunit-assert-list\";\n\n \t\ttestBlock.appendChild(assertList);\n\n \t\ttests.appendChild(testBlock);\n \t}\n\n \t// HTML Reporter initialization and load\n \tQUnit.begin(function (details) {\n \t\tvar i, moduleObj, tests;\n\n \t\t// Sort modules by name for the picker\n \t\tfor (i = 0; i < details.modules.length; i++) {\n \t\t\tmoduleObj = details.modules[i];\n \t\t\tif (moduleObj.name) {\n \t\t\t\tmodulesList.push(moduleObj.name);\n \t\t\t}\n \t\t}\n \t\tmodulesList.sort(function (a, b) {\n \t\t\treturn a.localeCompare(b);\n \t\t});\n\n \t\t// Initialize QUnit elements\n \t\tappendInterface();\n \t\tappendTestsList(details.modules);\n \t\ttests = id(\"qunit-tests\");\n \t\tif (tests && config.hidepassed) {\n \t\t\taddClass(tests, \"hidepass\");\n \t\t}\n \t});\n\n \tQUnit.done(function (details) {\n \t\tvar banner = id(\"qunit-banner\"),\n \t\t tests = id(\"qunit-tests\"),\n \t\t abortButton = id(\"qunit-abort-tests-button\"),\n \t\t totalTests = stats.passedTests + stats.skippedTests + stats.todoTests + stats.failedTests,\n \t\t html = [totalTests, \" tests completed in \", details.runtime, \" milliseconds, with \", stats.failedTests, \" failed, \", stats.skippedTests, \" skipped, and \", stats.todoTests, \" todo.<br />\", \"<span class='passed'>\", details.passed, \"</span> assertions of <span class='total'>\", details.total, \"</span> passed, <span class='failed'>\", details.failed, \"</span> failed.\"].join(\"\"),\n \t\t test,\n \t\t assertLi,\n \t\t assertList;\n\n \t\t// Update remaing tests to aborted\n \t\tif (abortButton && abortButton.disabled) {\n \t\t\thtml = \"Tests aborted after \" + details.runtime + \" milliseconds.\";\n\n \t\t\tfor (var i = 0; i < tests.children.length; i++) {\n \t\t\t\ttest = tests.children[i];\n \t\t\t\tif (test.className === \"\" || test.className === \"running\") {\n \t\t\t\t\ttest.className = \"aborted\";\n \t\t\t\t\tassertList = test.getElementsByTagName(\"ol\")[0];\n \t\t\t\t\tassertLi = document$$1.createElement(\"li\");\n \t\t\t\t\tassertLi.className = \"fail\";\n \t\t\t\t\tassertLi.innerHTML = \"Test aborted.\";\n \t\t\t\t\tassertList.appendChild(assertLi);\n \t\t\t\t}\n \t\t\t}\n \t\t}\n\n \t\tif (banner && (!abortButton || abortButton.disabled === false)) {\n \t\t\tbanner.className = stats.failedTests ? \"qunit-fail\" : \"qunit-pass\";\n \t\t}\n\n \t\tif (abortButton) {\n \t\t\tabortButton.parentNode.removeChild(abortButton);\n \t\t}\n\n \t\tif (tests) {\n \t\t\tid(\"qunit-testresult-display\").innerHTML = html;\n \t\t}\n\n \t\tif (config.altertitle && document$$1.title) {\n\n \t\t\t// Show ✖ for good, ✔ for bad suite result in title\n \t\t\t// use escape sequences in case file gets loaded with non-utf-8\n \t\t\t// charset\n \t\t\tdocument$$1.title = [stats.failedTests ? \"\\u2716\" : \"\\u2714\", document$$1.title.replace(/^[\\u2714\\u2716] /i, \"\")].join(\" \");\n \t\t}\n\n \t\t// Scroll back to top to show results\n \t\tif (config.scrolltop && window.scrollTo) {\n \t\t\twindow.scrollTo(0, 0);\n \t\t}\n \t});\n\n \tfunction getNameHtml(name, module) {\n \t\tvar nameHtml = \"\";\n\n \t\tif (module) {\n \t\t\tnameHtml = \"<span class='module-name'>\" + escapeText(module) + \"</span>: \";\n \t\t}\n\n \t\tnameHtml += \"<span class='test-name'>\" + escapeText(name) + \"</span>\";\n\n \t\treturn nameHtml;\n \t}\n\n \tQUnit.testStart(function (details) {\n \t\tvar running, testBlock, bad;\n\n \t\ttestBlock = id(\"qunit-test-output-\" + details.testId);\n \t\tif (testBlock) {\n \t\t\ttestBlock.className = \"running\";\n \t\t} else {\n\n \t\t\t// Report later registered tests\n \t\t\tappendTest(details.name, details.testId, details.module);\n \t\t}\n\n \t\trunning = id(\"qunit-testresult-display\");\n \t\tif (running) {\n \t\t\tbad = QUnit.config.reorder && details.previousFailure;\n\n \t\t\trunning.innerHTML = [bad ? \"Rerunning previously failed test: <br />\" : \"Running: <br />\", getNameHtml(details.name, details.module)].join(\"\");\n \t\t}\n \t});\n\n \tfunction stripHtml(string) {\n\n \t\t// Strip tags, html entity and whitespaces\n \t\treturn string.replace(/<\\/?[^>]+(>|$)/g, \"\").replace(/\\&quot;/g, \"\").replace(/\\s+/g, \"\");\n \t}\n\n \tQUnit.log(function (details) {\n \t\tvar assertList,\n \t\t assertLi,\n \t\t message,\n \t\t expected,\n \t\t actual,\n \t\t diff,\n \t\t showDiff = false,\n \t\t testItem = id(\"qunit-test-output-\" + details.testId);\n\n \t\tif (!testItem) {\n \t\t\treturn;\n \t\t}\n\n \t\tmessage = escapeText(details.message) || (details.result ? \"okay\" : \"failed\");\n \t\tmessage = \"<span class='test-message'>\" + message + \"</span>\";\n \t\tmessage += \"<span class='runtime'>@ \" + details.runtime + \" ms</span>\";\n\n \t\t// The pushFailure doesn't provide details.expected\n \t\t// when it calls, it's implicit to also not show expected and diff stuff\n \t\t// Also, we need to check details.expected existence, as it can exist and be undefined\n \t\tif (!details.result && hasOwn.call(details, \"expected\")) {\n \t\t\tif (details.negative) {\n \t\t\t\texpected = \"NOT \" + QUnit.dump.parse(details.expected);\n \t\t\t} else {\n \t\t\t\texpected = QUnit.dump.parse(details.expected);\n \t\t\t}\n\n \t\t\tactual = QUnit.dump.parse(details.actual);\n \t\t\tmessage += \"<table><tr class='test-expected'><th>Expected: </th><td><pre>\" + escapeText(expected) + \"</pre></td></tr>\";\n\n \t\t\tif (actual !== expected) {\n\n \t\t\t\tmessage += \"<tr class='test-actual'><th>Result: </th><td><pre>\" + escapeText(actual) + \"</pre></td></tr>\";\n\n \t\t\t\tif (typeof details.actual === \"number\" && typeof details.expected === \"number\") {\n \t\t\t\t\tif (!isNaN(details.actual) && !isNaN(details.expected)) {\n \t\t\t\t\t\tshowDiff = true;\n \t\t\t\t\t\tdiff = details.actual - details.expected;\n \t\t\t\t\t\tdiff = (diff > 0 ? \"+\" : \"\") + diff;\n \t\t\t\t\t}\n \t\t\t\t} else if (typeof details.actual !== \"boolean\" && typeof details.expected !== \"boolean\") {\n \t\t\t\t\tdiff = QUnit.diff(expected, actual);\n\n \t\t\t\t\t// don't show diff if there is zero overlap\n \t\t\t\t\tshowDiff = stripHtml(diff).length !== stripHtml(expected).length + stripHtml(actual).length;\n \t\t\t\t}\n\n \t\t\t\tif (showDiff) {\n \t\t\t\t\tmessage += \"<tr class='test-diff'><th>Diff: </th><td><pre>\" + diff + \"</pre></td></tr>\";\n \t\t\t\t}\n \t\t\t} else if (expected.indexOf(\"[object Array]\") !== -1 || expected.indexOf(\"[object Object]\") !== -1) {\n \t\t\t\tmessage += \"<tr class='test-message'><th>Message: </th><td>\" + \"Diff suppressed as the depth of object is more than current max depth (\" + QUnit.config.maxDepth + \").<p>Hint: Use <code>QUnit.dump.maxDepth</code> to \" + \" run with a higher max depth or <a href='\" + escapeText(setUrl({ maxDepth: -1 })) + \"'>\" + \"Rerun</a> without max depth.</p></td></tr>\";\n \t\t\t} else {\n \t\t\t\tmessage += \"<tr class='test-message'><th>Message: </th><td>\" + \"Diff suppressed as the expected and actual results have an equivalent\" + \" serialization</td></tr>\";\n \t\t\t}\n\n \t\t\tif (details.source) {\n \t\t\t\tmessage += \"<tr class='test-source'><th>Source: </th><td><pre>\" + escapeText(details.source) + \"</pre></td></tr>\";\n \t\t\t}\n\n \t\t\tmessage += \"</table>\";\n\n \t\t\t// This occurs when pushFailure is set and we have an extracted stack trace\n \t\t} else if (!details.result && details.source) {\n \t\t\tmessage += \"<table>\" + \"<tr class='test-source'><th>Source: </th><td><pre>\" + escapeText(details.source) + \"</pre></td></tr>\" + \"</table>\";\n \t\t}\n\n \t\tassertList = testItem.getElementsByTagName(\"ol\")[0];\n\n \t\tassertLi = document$$1.createElement(\"li\");\n \t\tassertLi.className = details.result ? \"pass\" : \"fail\";\n \t\tassertLi.innerHTML = message;\n \t\tassertList.appendChild(assertLi);\n \t});\n\n \tQUnit.testDone(function (details) {\n \t\tvar testTitle,\n \t\t time,\n \t\t testItem,\n \t\t assertList,\n \t\t good,\n \t\t bad,\n \t\t testCounts,\n \t\t skipped,\n \t\t sourceName,\n \t\t tests = id(\"qunit-tests\");\n\n \t\tif (!tests) {\n \t\t\treturn;\n \t\t}\n\n \t\ttestItem = id(\"qunit-test-output-\" + details.testId);\n\n \t\tassertList = testItem.getElementsByTagName(\"ol\")[0];\n\n \t\tgood = details.passed;\n \t\tbad = details.failed;\n\n \t\t// This test passed if it has no unexpected failed assertions\n \t\tvar testPassed = details.failed > 0 ? details.todo : !details.todo;\n\n \t\tif (testPassed) {\n\n \t\t\t// Collapse the passing tests\n \t\t\taddClass(assertList, \"qunit-collapsed\");\n \t\t} else if (config.collapse) {\n \t\t\tif (!collapseNext) {\n\n \t\t\t\t// Skip collapsing the first failing test\n \t\t\t\tcollapseNext = true;\n \t\t\t} else {\n\n \t\t\t\t// Collapse remaining tests\n \t\t\t\taddClass(assertList, \"qunit-collapsed\");\n \t\t\t}\n \t\t}\n\n \t\t// The testItem.firstChild is the test name\n \t\ttestTitle = testItem.firstChild;\n\n \t\ttestCounts = bad ? \"<b class='failed'>\" + bad + \"</b>, \" + \"<b class='passed'>\" + good + \"</b>, \" : \"\";\n\n \t\ttestTitle.innerHTML += \" <b class='counts'>(\" + testCounts + details.assertions.length + \")</b>\";\n\n \t\tif (details.skipped) {\n \t\t\tstats.skippedTests++;\n\n \t\t\ttestItem.className = \"skipped\";\n \t\t\tskipped = document$$1.createElement(\"em\");\n \t\t\tskipped.className = \"qunit-skipped-label\";\n \t\t\tskipped.innerHTML = \"skipped\";\n \t\t\ttestItem.insertBefore(skipped, testTitle);\n \t\t} else {\n \t\t\taddEvent(testTitle, \"click\", function () {\n \t\t\t\ttoggleClass(assertList, \"qunit-collapsed\");\n \t\t\t});\n\n \t\t\ttestItem.className = testPassed ? \"pass\" : \"fail\";\n\n \t\t\tif (details.todo) {\n \t\t\t\tvar todoLabel = document$$1.createElement(\"em\");\n \t\t\t\ttodoLabel.className = \"qunit-todo-label\";\n \t\t\t\ttodoLabel.innerHTML = \"todo\";\n \t\t\t\ttestItem.className += \" todo\";\n \t\t\t\ttestItem.insertBefore(todoLabel, testTitle);\n \t\t\t}\n\n \t\t\ttime = document$$1.createElement(\"span\");\n \t\t\ttime.className = \"runtime\";\n \t\t\ttime.innerHTML = details.runtime + \" ms\";\n \t\t\ttestItem.insertBefore(time, assertList);\n\n \t\t\tif (!testPassed) {\n \t\t\t\tstats.failedTests++;\n \t\t\t} else if (details.todo) {\n \t\t\t\tstats.todoTests++;\n \t\t\t} else {\n \t\t\t\tstats.passedTests++;\n \t\t\t}\n \t\t}\n\n \t\t// Show the source of the test when showing assertions\n \t\tif (details.source) {\n \t\t\tsourceName = document$$1.createElement(\"p\");\n \t\t\tsourceName.innerHTML = \"<strong>Source: </strong>\" + details.source;\n \t\t\taddClass(sourceName, \"qunit-source\");\n \t\t\tif (testPassed) {\n \t\t\t\taddClass(sourceName, \"qunit-collapsed\");\n \t\t\t}\n \t\t\taddEvent(testTitle, \"click\", function () {\n \t\t\t\ttoggleClass(sourceName, \"qunit-collapsed\");\n \t\t\t});\n \t\t\ttestItem.appendChild(sourceName);\n \t\t}\n \t});\n\n \t// Avoid readyState issue with phantomjs\n \t// Ref: #818\n \tvar notPhantom = function (p) {\n \t\treturn !(p && p.version && p.version.major > 0);\n \t}(window.phantom);\n\n \tif (notPhantom && document$$1.readyState === \"complete\") {\n \t\tQUnit.load();\n \t} else {\n \t\taddEvent(window, \"load\", QUnit.load);\n \t}\n\n \t// Wrap window.onerror. We will call the original window.onerror to see if\n \t// the existing handler fully handles the error; if not, we will call the\n \t// QUnit.onError function.\n \tvar originalWindowOnError = window.onerror;\n\n \t// Cover uncaught exceptions\n \t// Returning true will suppress the default browser handler,\n \t// returning false will let it run.\n \twindow.onerror = function (message, fileName, lineNumber) {\n \t\tvar ret = false;\n \t\tif (originalWindowOnError) {\n \t\t\tfor (var _len = arguments.length, args = Array(_len > 3 ? _len - 3 : 0), _key = 3; _key < _len; _key++) {\n \t\t\t\targs[_key - 3] = arguments[_key];\n \t\t\t}\n\n \t\t\tret = originalWindowOnError.call.apply(originalWindowOnError, [this, message, fileName, lineNumber].concat(args));\n \t\t}\n\n \t\t// Treat return value as window.onerror itself does,\n \t\t// Only do our handling if not suppressed.\n \t\tif (ret !== true) {\n \t\t\tvar error = {\n \t\t\t\tmessage: message,\n \t\t\t\tfileName: fileName,\n \t\t\t\tlineNumber: lineNumber\n \t\t\t};\n\n \t\t\tret = QUnit.onError(error);\n \t\t}\n\n \t\treturn ret;\n \t};\n\n \t// Listen for unhandled rejections, and call QUnit.onUnhandledRejection\n \twindow.addEventListener(\"unhandledrejection\", function (event) {\n \t\tQUnit.onUnhandledRejection(event.reason);\n \t});\n })();\n\n /*\n * This file is a modified version of google-diff-match-patch's JavaScript implementation\n * (https://code.google.com/p/google-diff-match-patch/source/browse/trunk/javascript/diff_match_patch_uncompressed.js),\n * modifications are licensed as more fully set forth in LICENSE.txt.\n *\n * The original source of google-diff-match-patch is attributable and licensed as follows:\n *\n * Copyright 2006 Google Inc.\n * https://code.google.com/p/google-diff-match-patch/\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * More Info:\n * https://code.google.com/p/google-diff-match-patch/\n *\n * Usage: QUnit.diff(expected, actual)\n *\n */\n QUnit.diff = function () {\n \tfunction DiffMatchPatch() {}\n\n \t// DIFF FUNCTIONS\n\n \t/**\n * The data structure representing a diff is an array of tuples:\n * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]\n * which means: delete 'Hello', add 'Goodbye' and keep ' world.'\n */\n \tvar DIFF_DELETE = -1,\n \t DIFF_INSERT = 1,\n \t DIFF_EQUAL = 0;\n\n \t/**\n * Find the differences between two texts. Simplifies the problem by stripping\n * any common prefix or suffix off the texts before diffing.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {boolean=} optChecklines Optional speedup flag. If present and false,\n * then don't run a line-level diff first to identify the changed areas.\n * Defaults to true, which does a faster, slightly less optimal diff.\n * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.\n */\n \tDiffMatchPatch.prototype.DiffMain = function (text1, text2, optChecklines) {\n \t\tvar deadline, checklines, commonlength, commonprefix, commonsuffix, diffs;\n\n \t\t// The diff must be complete in up to 1 second.\n \t\tdeadline = new Date().getTime() + 1000;\n\n \t\t// Check for null inputs.\n \t\tif (text1 === null || text2 === null) {\n \t\t\tthrow new Error(\"Null input. (DiffMain)\");\n \t\t}\n\n \t\t// Check for equality (speedup).\n \t\tif (text1 === text2) {\n \t\t\tif (text1) {\n \t\t\t\treturn [[DIFF_EQUAL, text1]];\n \t\t\t}\n \t\t\treturn [];\n \t\t}\n\n \t\tif (typeof optChecklines === \"undefined\") {\n \t\t\toptChecklines = true;\n \t\t}\n\n \t\tchecklines = optChecklines;\n\n \t\t// Trim off common prefix (speedup).\n \t\tcommonlength = this.diffCommonPrefix(text1, text2);\n \t\tcommonprefix = text1.substring(0, commonlength);\n \t\ttext1 = text1.substring(commonlength);\n \t\ttext2 = text2.substring(commonlength);\n\n \t\t// Trim off common suffix (speedup).\n \t\tcommonlength = this.diffCommonSuffix(text1, text2);\n \t\tcommonsuffix = text1.substring(text1.length - commonlength);\n \t\ttext1 = text1.substring(0, text1.length - commonlength);\n \t\ttext2 = text2.substring(0, text2.length - commonlength);\n\n \t\t// Compute the diff on the middle block.\n \t\tdiffs = this.diffCompute(text1, text2, checklines, deadline);\n\n \t\t// Restore the prefix and suffix.\n \t\tif (commonprefix) {\n \t\t\tdiffs.unshift([DIFF_EQUAL, commonprefix]);\n \t\t}\n \t\tif (commonsuffix) {\n \t\t\tdiffs.push([DIFF_EQUAL, commonsuffix]);\n \t\t}\n \t\tthis.diffCleanupMerge(diffs);\n \t\treturn diffs;\n \t};\n\n \t/**\n * Reduce the number of edits by eliminating operationally trivial equalities.\n * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.\n */\n \tDiffMatchPatch.prototype.diffCleanupEfficiency = function (diffs) {\n \t\tvar changes, equalities, equalitiesLength, lastequality, pointer, preIns, preDel, postIns, postDel;\n \t\tchanges = false;\n \t\tequalities = []; // Stack of indices where equalities are found.\n \t\tequalitiesLength = 0; // Keeping our own length var is faster in JS.\n \t\t/** @type {?string} */\n \t\tlastequality = null;\n\n \t\t// Always equal to diffs[equalities[equalitiesLength - 1]][1]\n \t\tpointer = 0; // Index of current position.\n\n \t\t// Is there an insertion operation before the last equality.\n \t\tpreIns = false;\n\n \t\t// Is there a deletion operation before the last equality.\n \t\tpreDel = false;\n\n \t\t// Is there an insertion operation after the last equality.\n \t\tpostIns = false;\n\n \t\t// Is there a deletion operation after the last equality.\n \t\tpostDel = false;\n \t\twhile (pointer < diffs.length) {\n\n \t\t\t// Equality found.\n \t\t\tif (diffs[pointer][0] === DIFF_EQUAL) {\n \t\t\t\tif (diffs[pointer][1].length < 4 && (postIns || postDel)) {\n\n \t\t\t\t\t// Candidate found.\n \t\t\t\t\tequalities[equalitiesLength++] = pointer;\n \t\t\t\t\tpreIns = postIns;\n \t\t\t\t\tpreDel = postDel;\n \t\t\t\t\tlastequality = diffs[pointer][1];\n \t\t\t\t} else {\n\n \t\t\t\t\t// Not a candidate, and can never become one.\n \t\t\t\t\tequalitiesLength = 0;\n \t\t\t\t\tlastequality = null;\n \t\t\t\t}\n \t\t\t\tpostIns = postDel = false;\n\n \t\t\t\t// An insertion or deletion.\n \t\t\t} else {\n\n \t\t\t\tif (diffs[pointer][0] === DIFF_DELETE) {\n \t\t\t\t\tpostDel = true;\n \t\t\t\t} else {\n \t\t\t\t\tpostIns = true;\n \t\t\t\t}\n\n \t\t\t\t/*\n * Five types to be split:\n * <ins>A</ins><del>B</del>XY<ins>C</ins><del>D</del>\n * <ins>A</ins>X<ins>C</ins><del>D</del>\n * <ins>A</ins><del>B</del>X<ins>C</ins>\n * <ins>A</del>X<ins>C</ins><del>D</del>\n * <ins>A</ins><del>B</del>X<del>C</del>\n */\n \t\t\t\tif (lastequality && (preIns && preDel && postIns && postDel || lastequality.length < 2 && preIns + preDel + postIns + postDel === 3)) {\n\n \t\t\t\t\t// Duplicate record.\n \t\t\t\t\tdiffs.splice(equalities[equalitiesLength - 1], 0, [DIFF_DELETE, lastequality]);\n\n \t\t\t\t\t// Change second copy to insert.\n \t\t\t\t\tdiffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n \t\t\t\t\tequalitiesLength--; // Throw away the equality we just deleted;\n \t\t\t\t\tlastequality = null;\n \t\t\t\t\tif (preIns && preDel) {\n\n \t\t\t\t\t\t// No changes made which could affect previous entry, keep going.\n \t\t\t\t\t\tpostIns = postDel = true;\n \t\t\t\t\t\tequalitiesLength = 0;\n \t\t\t\t\t} else {\n \t\t\t\t\t\tequalitiesLength--; // Throw away the previous equality.\n \t\t\t\t\t\tpointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;\n \t\t\t\t\t\tpostIns = postDel = false;\n \t\t\t\t\t}\n \t\t\t\t\tchanges = true;\n \t\t\t\t}\n \t\t\t}\n \t\t\tpointer++;\n \t\t}\n\n \t\tif (changes) {\n \t\t\tthis.diffCleanupMerge(diffs);\n \t\t}\n \t};\n\n \t/**\n * Convert a diff array into a pretty HTML report.\n * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.\n * @param {integer} string to be beautified.\n * @return {string} HTML representation.\n */\n \tDiffMatchPatch.prototype.diffPrettyHtml = function (diffs) {\n \t\tvar op,\n \t\t data,\n \t\t x,\n \t\t html = [];\n \t\tfor (x = 0; x < diffs.length; x++) {\n \t\t\top = diffs[x][0]; // Operation (insert, delete, equal)\n \t\t\tdata = diffs[x][1]; // Text of change.\n \t\t\tswitch (op) {\n \t\t\t\tcase DIFF_INSERT:\n \t\t\t\t\thtml[x] = \"<ins>\" + escapeText(data) + \"</ins>\";\n \t\t\t\t\tbreak;\n \t\t\t\tcase DIFF_DELETE:\n \t\t\t\t\thtml[x] = \"<del>\" + escapeText(data) + \"</del>\";\n \t\t\t\t\tbreak;\n \t\t\t\tcase DIFF_EQUAL:\n \t\t\t\t\thtml[x] = \"<span>\" + escapeText(data) + \"</span>\";\n \t\t\t\t\tbreak;\n \t\t\t}\n \t\t}\n \t\treturn html.join(\"\");\n \t};\n\n \t/**\n * Determine the common prefix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the start of each\n * string.\n */\n \tDiffMatchPatch.prototype.diffCommonPrefix = function (text1, text2) {\n \t\tvar pointermid, pointermax, pointermin, pointerstart;\n\n \t\t// Quick check for common null cases.\n \t\tif (!text1 || !text2 || text1.charAt(0) !== text2.charAt(0)) {\n \t\t\treturn 0;\n \t\t}\n\n \t\t// Binary search.\n \t\t// Performance analysis: https://neil.fraser.name/news/2007/10/09/\n \t\tpointermin = 0;\n \t\tpointermax = Math.min(text1.length, text2.length);\n \t\tpointermid = pointermax;\n \t\tpointerstart = 0;\n \t\twhile (pointermin < pointermid) {\n \t\t\tif (text1.substring(pointerstart, pointermid) === text2.substring(pointerstart, pointermid)) {\n \t\t\t\tpointermin = pointermid;\n \t\t\t\tpointerstart = pointermin;\n \t\t\t} else {\n \t\t\t\tpointermax = pointermid;\n \t\t\t}\n \t\t\tpointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n \t\t}\n \t\treturn pointermid;\n \t};\n\n \t/**\n * Determine the common suffix of two strings.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the end of each string.\n */\n \tDiffMatchPatch.prototype.diffCommonSuffix = function (text1, text2) {\n \t\tvar pointermid, pointermax, pointermin, pointerend;\n\n \t\t// Quick check for common null cases.\n \t\tif (!text1 || !text2 || text1.charAt(text1.length - 1) !== text2.charAt(text2.length - 1)) {\n \t\t\treturn 0;\n \t\t}\n\n \t\t// Binary search.\n \t\t// Performance analysis: https://neil.fraser.name/news/2007/10/09/\n \t\tpointermin = 0;\n \t\tpointermax = Math.min(text1.length, text2.length);\n \t\tpointermid = pointermax;\n \t\tpointerend = 0;\n \t\twhile (pointermin < pointermid) {\n \t\t\tif (text1.substring(text1.length - pointermid, text1.length - pointerend) === text2.substring(text2.length - pointermid, text2.length - pointerend)) {\n \t\t\t\tpointermin = pointermid;\n \t\t\t\tpointerend = pointermin;\n \t\t\t} else {\n \t\t\t\tpointermax = pointermid;\n \t\t\t}\n \t\t\tpointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);\n \t\t}\n \t\treturn pointermid;\n \t};\n\n \t/**\n * Find the differences between two texts. Assumes that the texts do not\n * have any common prefix or suffix.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {boolean} checklines Speedup flag. If false, then don't run a\n * line-level diff first to identify the changed areas.\n * If true, then run a faster, slightly less optimal diff.\n * @param {number} deadline Time when the diff should be complete by.\n * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.\n * @private\n */\n \tDiffMatchPatch.prototype.diffCompute = function (text1, text2, checklines, deadline) {\n \t\tvar diffs, longtext, shorttext, i, hm, text1A, text2A, text1B, text2B, midCommon, diffsA, diffsB;\n\n \t\tif (!text1) {\n\n \t\t\t// Just add some text (speedup).\n \t\t\treturn [[DIFF_INSERT, text2]];\n \t\t}\n\n \t\tif (!text2) {\n\n \t\t\t// Just delete some text (speedup).\n \t\t\treturn [[DIFF_DELETE, text1]];\n \t\t}\n\n \t\tlongtext = text1.length > text2.length ? text1 : text2;\n \t\tshorttext = text1.length > text2.length ? text2 : text1;\n \t\ti = longtext.indexOf(shorttext);\n \t\tif (i !== -1) {\n\n \t\t\t// Shorter text is inside the longer text (speedup).\n \t\t\tdiffs = [[DIFF_INSERT, longtext.substring(0, i)], [DIFF_EQUAL, shorttext], [DIFF_INSERT, longtext.substring(i + shorttext.length)]];\n\n \t\t\t// Swap insertions for deletions if diff is reversed.\n \t\t\tif (text1.length > text2.length) {\n \t\t\t\tdiffs[0][0] = diffs[2][0] = DIFF_DELETE;\n \t\t\t}\n \t\t\treturn diffs;\n \t\t}\n\n \t\tif (shorttext.length === 1) {\n\n \t\t\t// Single character string.\n \t\t\t// After the previous speedup, the character can't be an equality.\n \t\t\treturn [[DIFF_DELETE, text1], [DIFF_INSERT, text2]];\n \t\t}\n\n \t\t// Check to see if the problem can be split in two.\n \t\thm = this.diffHalfMatch(text1, text2);\n \t\tif (hm) {\n\n \t\t\t// A half-match was found, sort out the return data.\n \t\t\ttext1A = hm[0];\n \t\t\ttext1B = hm[1];\n \t\t\ttext2A = hm[2];\n \t\t\ttext2B = hm[3];\n \t\t\tmidCommon = hm[4];\n\n \t\t\t// Send both pairs off for separate processing.\n \t\t\tdiffsA = this.DiffMain(text1A, text2A, checklines, deadline);\n \t\t\tdiffsB = this.DiffMain(text1B, text2B, checklines, deadline);\n\n \t\t\t// Merge the results.\n \t\t\treturn diffsA.concat([[DIFF_EQUAL, midCommon]], diffsB);\n \t\t}\n\n \t\tif (checklines && text1.length > 100 && text2.length > 100) {\n \t\t\treturn this.diffLineMode(text1, text2, deadline);\n \t\t}\n\n \t\treturn this.diffBisect(text1, text2, deadline);\n \t};\n\n \t/**\n * Do the two texts share a substring which is at least half the length of the\n * longer text?\n * This speedup can produce non-minimal diffs.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {Array.<string>} Five element Array, containing the prefix of\n * text1, the suffix of text1, the prefix of text2, the suffix of\n * text2 and the common middle. Or null if there was no match.\n * @private\n */\n \tDiffMatchPatch.prototype.diffHalfMatch = function (text1, text2) {\n \t\tvar longtext, shorttext, dmp, text1A, text2B, text2A, text1B, midCommon, hm1, hm2, hm;\n\n \t\tlongtext = text1.length > text2.length ? text1 : text2;\n \t\tshorttext = text1.length > text2.length ? text2 : text1;\n \t\tif (longtext.length < 4 || shorttext.length * 2 < longtext.length) {\n \t\t\treturn null; // Pointless.\n \t\t}\n \t\tdmp = this; // 'this' becomes 'window' in a closure.\n\n \t\t/**\n * Does a substring of shorttext exist within longtext such that the substring\n * is at least half the length of longtext?\n * Closure, but does not reference any external variables.\n * @param {string} longtext Longer string.\n * @param {string} shorttext Shorter string.\n * @param {number} i Start index of quarter length substring within longtext.\n * @return {Array.<string>} Five element Array, containing the prefix of\n * longtext, the suffix of longtext, the prefix of shorttext, the suffix\n * of shorttext and the common middle. Or null if there was no match.\n * @private\n */\n \t\tfunction diffHalfMatchI(longtext, shorttext, i) {\n \t\t\tvar seed, j, bestCommon, prefixLength, suffixLength, bestLongtextA, bestLongtextB, bestShorttextA, bestShorttextB;\n\n \t\t\t// Start with a 1/4 length substring at position i as a seed.\n \t\t\tseed = longtext.substring(i, i + Math.floor(longtext.length / 4));\n \t\t\tj = -1;\n \t\t\tbestCommon = \"\";\n \t\t\twhile ((j = shorttext.indexOf(seed, j + 1)) !== -1) {\n \t\t\t\tprefixLength = dmp.diffCommonPrefix(longtext.substring(i), shorttext.substring(j));\n \t\t\t\tsuffixLength = dmp.diffCommonSuffix(longtext.substring(0, i), shorttext.substring(0, j));\n \t\t\t\tif (bestCommon.length < suffixLength + prefixLength) {\n \t\t\t\t\tbestCommon = shorttext.substring(j - suffixLength, j) + shorttext.substring(j, j + prefixLength);\n \t\t\t\t\tbestLongtextA = longtext.substring(0, i - suffixLength);\n \t\t\t\t\tbestLongtextB = longtext.substring(i + prefixLength);\n \t\t\t\t\tbestShorttextA = shorttext.substring(0, j - suffixLength);\n \t\t\t\t\tbestShorttextB = shorttext.substring(j + prefixLength);\n \t\t\t\t}\n \t\t\t}\n \t\t\tif (bestCommon.length * 2 >= longtext.length) {\n \t\t\t\treturn [bestLongtextA, bestLongtextB, bestShorttextA, bestShorttextB, bestCommon];\n \t\t\t} else {\n \t\t\t\treturn null;\n \t\t\t}\n \t\t}\n\n \t\t// First check if the second quarter is the seed for a half-match.\n \t\thm1 = diffHalfMatchI(longtext, shorttext, Math.ceil(longtext.length / 4));\n\n \t\t// Check again based on the third quarter.\n \t\thm2 = diffHalfMatchI(longtext, shorttext, Math.ceil(longtext.length / 2));\n \t\tif (!hm1 && !hm2) {\n \t\t\treturn null;\n \t\t} else if (!hm2) {\n \t\t\thm = hm1;\n \t\t} else if (!hm1) {\n \t\t\thm = hm2;\n \t\t} else {\n\n \t\t\t// Both matched. Select the longest.\n \t\t\thm = hm1[4].length > hm2[4].length ? hm1 : hm2;\n \t\t}\n\n \t\t// A half-match was found, sort out the return data.\n \t\tif (text1.length > text2.length) {\n \t\t\ttext1A = hm[0];\n \t\t\ttext1B = hm[1];\n \t\t\ttext2A = hm[2];\n \t\t\ttext2B = hm[3];\n \t\t} else {\n \t\t\ttext2A = hm[0];\n \t\t\ttext2B = hm[1];\n \t\t\ttext1A = hm[2];\n \t\t\ttext1B = hm[3];\n \t\t}\n \t\tmidCommon = hm[4];\n \t\treturn [text1A, text1B, text2A, text2B, midCommon];\n \t};\n\n \t/**\n * Do a quick line-level diff on both strings, then rediff the parts for\n * greater accuracy.\n * This speedup can produce non-minimal diffs.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} deadline Time when the diff should be complete by.\n * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.\n * @private\n */\n \tDiffMatchPatch.prototype.diffLineMode = function (text1, text2, deadline) {\n \t\tvar a, diffs, linearray, pointer, countInsert, countDelete, textInsert, textDelete, j;\n\n \t\t// Scan the text on a line-by-line basis first.\n \t\ta = this.diffLinesToChars(text1, text2);\n \t\ttext1 = a.chars1;\n \t\ttext2 = a.chars2;\n \t\tlinearray = a.lineArray;\n\n \t\tdiffs = this.DiffMain(text1, text2, false, deadline);\n\n \t\t// Convert the diff back to original text.\n \t\tthis.diffCharsToLines(diffs, linearray);\n\n \t\t// Eliminate freak matches (e.g. blank lines)\n \t\tthis.diffCleanupSemantic(diffs);\n\n \t\t// Rediff any replacement blocks, this time character-by-character.\n \t\t// Add a dummy entry at the end.\n \t\tdiffs.push([DIFF_EQUAL, \"\"]);\n \t\tpointer = 0;\n \t\tcountDelete = 0;\n \t\tcountInsert = 0;\n \t\ttextDelete = \"\";\n \t\ttextInsert = \"\";\n \t\twhile (pointer < diffs.length) {\n \t\t\tswitch (diffs[pointer][0]) {\n \t\t\t\tcase DIFF_INSERT:\n \t\t\t\t\tcountInsert++;\n \t\t\t\t\ttextInsert += diffs[pointer][1];\n \t\t\t\t\tbreak;\n \t\t\t\tcase DIFF_DELETE:\n \t\t\t\t\tcountDelete++;\n \t\t\t\t\ttextDelete += diffs[pointer][1];\n \t\t\t\t\tbreak;\n \t\t\t\tcase DIFF_EQUAL:\n\n \t\t\t\t\t// Upon reaching an equality, check for prior redundancies.\n \t\t\t\t\tif (countDelete >= 1 && countInsert >= 1) {\n\n \t\t\t\t\t\t// Delete the offending records and add the merged ones.\n \t\t\t\t\t\tdiffs.splice(pointer - countDelete - countInsert, countDelete + countInsert);\n \t\t\t\t\t\tpointer = pointer - countDelete - countInsert;\n \t\t\t\t\t\ta = this.DiffMain(textDelete, textInsert, false, deadline);\n \t\t\t\t\t\tfor (j = a.length - 1; j >= 0; j--) {\n \t\t\t\t\t\t\tdiffs.splice(pointer, 0, a[j]);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tpointer = pointer + a.length;\n \t\t\t\t\t}\n \t\t\t\t\tcountInsert = 0;\n \t\t\t\t\tcountDelete = 0;\n \t\t\t\t\ttextDelete = \"\";\n \t\t\t\t\ttextInsert = \"\";\n \t\t\t\t\tbreak;\n \t\t\t}\n \t\t\tpointer++;\n \t\t}\n \t\tdiffs.pop(); // Remove the dummy entry at the end.\n\n \t\treturn diffs;\n \t};\n\n \t/**\n * Find the 'middle snake' of a diff, split the problem in two\n * and return the recursively constructed diff.\n * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} deadline Time at which to bail if not yet complete.\n * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.\n * @private\n */\n \tDiffMatchPatch.prototype.diffBisect = function (text1, text2, deadline) {\n \t\tvar text1Length, text2Length, maxD, vOffset, vLength, v1, v2, x, delta, front, k1start, k1end, k2start, k2end, k2Offset, k1Offset, x1, x2, y1, y2, d, k1, k2;\n\n \t\t// Cache the text lengths to prevent multiple calls.\n \t\ttext1Length = text1.length;\n \t\ttext2Length = text2.length;\n \t\tmaxD = Math.ceil((text1Length + text2Length) / 2);\n \t\tvOffset = maxD;\n \t\tvLength = 2 * maxD;\n \t\tv1 = new Array(vLength);\n \t\tv2 = new Array(vLength);\n\n \t\t// Setting all elements to -1 is faster in Chrome & Firefox than mixing\n \t\t// integers and undefined.\n \t\tfor (x = 0; x < vLength; x++) {\n \t\t\tv1[x] = -1;\n \t\t\tv2[x] = -1;\n \t\t}\n \t\tv1[vOffset + 1] = 0;\n \t\tv2[vOffset + 1] = 0;\n \t\tdelta = text1Length - text2Length;\n\n \t\t// If the total number of characters is odd, then the front path will collide\n \t\t// with the reverse path.\n \t\tfront = delta % 2 !== 0;\n\n \t\t// Offsets for start and end of k loop.\n \t\t// Prevents mapping of space beyond the grid.\n \t\tk1start = 0;\n \t\tk1end = 0;\n \t\tk2start = 0;\n \t\tk2end = 0;\n \t\tfor (d = 0; d < maxD; d++) {\n\n \t\t\t// Bail out if deadline is reached.\n \t\t\tif (new Date().getTime() > deadline) {\n \t\t\t\tbreak;\n \t\t\t}\n\n \t\t\t// Walk the front path one step.\n \t\t\tfor (k1 = -d + k1start; k1 <= d - k1end; k1 += 2) {\n \t\t\t\tk1Offset = vOffset + k1;\n \t\t\t\tif (k1 === -d || k1 !== d && v1[k1Offset - 1] < v1[k1Offset + 1]) {\n \t\t\t\t\tx1 = v1[k1Offset + 1];\n \t\t\t\t} else {\n \t\t\t\t\tx1 = v1[k1Offset - 1] + 1;\n \t\t\t\t}\n \t\t\t\ty1 = x1 - k1;\n \t\t\t\twhile (x1 < text1Length && y1 < text2Length && text1.charAt(x1) === text2.charAt(y1)) {\n \t\t\t\t\tx1++;\n \t\t\t\t\ty1++;\n \t\t\t\t}\n \t\t\t\tv1[k1Offset] = x1;\n \t\t\t\tif (x1 > text1Length) {\n\n \t\t\t\t\t// Ran off the right of the graph.\n \t\t\t\t\tk1end += 2;\n \t\t\t\t} else if (y1 > text2Length) {\n\n \t\t\t\t\t// Ran off the bottom of the graph.\n \t\t\t\t\tk1start += 2;\n \t\t\t\t} else if (front) {\n \t\t\t\t\tk2Offset = vOffset + delta - k1;\n \t\t\t\t\tif (k2Offset >= 0 && k2Offset < vLength && v2[k2Offset] !== -1) {\n\n \t\t\t\t\t\t// Mirror x2 onto top-left coordinate system.\n \t\t\t\t\t\tx2 = text1Length - v2[k2Offset];\n \t\t\t\t\t\tif (x1 >= x2) {\n\n \t\t\t\t\t\t\t// Overlap detected.\n \t\t\t\t\t\t\treturn this.diffBisectSplit(text1, text2, x1, y1, deadline);\n \t\t\t\t\t\t}\n \t\t\t\t\t}\n \t\t\t\t}\n \t\t\t}\n\n \t\t\t// Walk the reverse path one step.\n \t\t\tfor (k2 = -d + k2start; k2 <= d - k2end; k2 += 2) {\n \t\t\t\tk2Offset = vOffset + k2;\n \t\t\t\tif (k2 === -d || k2 !== d && v2[k2Offset - 1] < v2[k2Offset + 1]) {\n \t\t\t\t\tx2 = v2[k2Offset + 1];\n \t\t\t\t} else {\n \t\t\t\t\tx2 = v2[k2Offset - 1] + 1;\n \t\t\t\t}\n \t\t\t\ty2 = x2 - k2;\n \t\t\t\twhile (x2 < text1Length && y2 < text2Length && text1.charAt(text1Length - x2 - 1) === text2.charAt(text2Length - y2 - 1)) {\n \t\t\t\t\tx2++;\n \t\t\t\t\ty2++;\n \t\t\t\t}\n \t\t\t\tv2[k2Offset] = x2;\n \t\t\t\tif (x2 > text1Length) {\n\n \t\t\t\t\t// Ran off the left of the graph.\n \t\t\t\t\tk2end += 2;\n \t\t\t\t} else if (y2 > text2Length) {\n\n \t\t\t\t\t// Ran off the top of the graph.\n \t\t\t\t\tk2start += 2;\n \t\t\t\t} else if (!front) {\n \t\t\t\t\tk1Offset = vOffset + delta - k2;\n \t\t\t\t\tif (k1Offset >= 0 && k1Offset < vLength && v1[k1Offset] !== -1) {\n \t\t\t\t\t\tx1 = v1[k1Offset];\n \t\t\t\t\t\ty1 = vOffset + x1 - k1Offset;\n\n \t\t\t\t\t\t// Mirror x2 onto top-left coordinate system.\n \t\t\t\t\t\tx2 = text1Length - x2;\n \t\t\t\t\t\tif (x1 >= x2) {\n\n \t\t\t\t\t\t\t// Overlap detected.\n \t\t\t\t\t\t\treturn this.diffBisectSplit(text1, text2, x1, y1, deadline);\n \t\t\t\t\t\t}\n \t\t\t\t\t}\n \t\t\t\t}\n \t\t\t}\n \t\t}\n\n \t\t// Diff took too long and hit the deadline or\n \t\t// number of diffs equals number of characters, no commonality at all.\n \t\treturn [[DIFF_DELETE, text1], [DIFF_INSERT, text2]];\n \t};\n\n \t/**\n * Given the location of the 'middle snake', split the diff in two parts\n * and recurse.\n * @param {string} text1 Old string to be diffed.\n * @param {string} text2 New string to be diffed.\n * @param {number} x Index of split point in text1.\n * @param {number} y Index of split point in text2.\n * @param {number} deadline Time at which to bail if not yet complete.\n * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.\n * @private\n */\n \tDiffMatchPatch.prototype.diffBisectSplit = function (text1, text2, x, y, deadline) {\n \t\tvar text1a, text1b, text2a, text2b, diffs, diffsb;\n \t\ttext1a = text1.substring(0, x);\n \t\ttext2a = text2.substring(0, y);\n \t\ttext1b = text1.substring(x);\n \t\ttext2b = text2.substring(y);\n\n \t\t// Compute both diffs serially.\n \t\tdiffs = this.DiffMain(text1a, text2a, false, deadline);\n \t\tdiffsb = this.DiffMain(text1b, text2b, false, deadline);\n\n \t\treturn diffs.concat(diffsb);\n \t};\n\n \t/**\n * Reduce the number of edits by eliminating semantically trivial equalities.\n * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.\n */\n \tDiffMatchPatch.prototype.diffCleanupSemantic = function (diffs) {\n \t\tvar changes, equalities, equalitiesLength, lastequality, pointer, lengthInsertions2, lengthDeletions2, lengthInsertions1, lengthDeletions1, deletion, insertion, overlapLength1, overlapLength2;\n \t\tchanges = false;\n \t\tequalities = []; // Stack of indices where equalities are found.\n \t\tequalitiesLength = 0; // Keeping our own length var is faster in JS.\n \t\t/** @type {?string} */\n \t\tlastequality = null;\n\n \t\t// Always equal to diffs[equalities[equalitiesLength - 1]][1]\n \t\tpointer = 0; // Index of current position.\n\n \t\t// Number of characters that changed prior to the equality.\n \t\tlengthInsertions1 = 0;\n \t\tlengthDeletions1 = 0;\n\n \t\t// Number of characters that changed after the equality.\n \t\tlengthInsertions2 = 0;\n \t\tlengthDeletions2 = 0;\n \t\twhile (pointer < diffs.length) {\n \t\t\tif (diffs[pointer][0] === DIFF_EQUAL) {\n \t\t\t\t// Equality found.\n \t\t\t\tequalities[equalitiesLength++] = pointer;\n \t\t\t\tlengthInsertions1 = lengthInsertions2;\n \t\t\t\tlengthDeletions1 = lengthDeletions2;\n \t\t\t\tlengthInsertions2 = 0;\n \t\t\t\tlengthDeletions2 = 0;\n \t\t\t\tlastequality = diffs[pointer][1];\n \t\t\t} else {\n \t\t\t\t// An insertion or deletion.\n \t\t\t\tif (diffs[pointer][0] === DIFF_INSERT) {\n \t\t\t\t\tlengthInsertions2 += diffs[pointer][1].length;\n \t\t\t\t} else {\n \t\t\t\t\tlengthDeletions2 += diffs[pointer][1].length;\n \t\t\t\t}\n\n \t\t\t\t// Eliminate an equality that is smaller or equal to the edits on both\n \t\t\t\t// sides of it.\n \t\t\t\tif (lastequality && lastequality.length <= Math.max(lengthInsertions1, lengthDeletions1) && lastequality.length <= Math.max(lengthInsertions2, lengthDeletions2)) {\n\n \t\t\t\t\t// Duplicate record.\n \t\t\t\t\tdiffs.splice(equalities[equalitiesLength - 1], 0, [DIFF_DELETE, lastequality]);\n\n \t\t\t\t\t// Change second copy to insert.\n \t\t\t\t\tdiffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT;\n\n \t\t\t\t\t// Throw away the equality we just deleted.\n \t\t\t\t\tequalitiesLength--;\n\n \t\t\t\t\t// Throw away the previous equality (it needs to be reevaluated).\n \t\t\t\t\tequalitiesLength--;\n \t\t\t\t\tpointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1;\n\n \t\t\t\t\t// Reset the counters.\n \t\t\t\t\tlengthInsertions1 = 0;\n \t\t\t\t\tlengthDeletions1 = 0;\n \t\t\t\t\tlengthInsertions2 = 0;\n \t\t\t\t\tlengthDeletions2 = 0;\n \t\t\t\t\tlastequality = null;\n \t\t\t\t\tchanges = true;\n \t\t\t\t}\n \t\t\t}\n \t\t\tpointer++;\n \t\t}\n\n \t\t// Normalize the diff.\n \t\tif (changes) {\n \t\t\tthis.diffCleanupMerge(diffs);\n \t\t}\n\n \t\t// Find any overlaps between deletions and insertions.\n \t\t// e.g: <del>abcxxx</del><ins>xxxdef</ins>\n \t\t// -> <del>abc</del>xxx<ins>def</ins>\n \t\t// e.g: <del>xxxabc</del><ins>defxxx</ins>\n \t\t// -> <ins>def</ins>xxx<del>abc</del>\n \t\t// Only extract an overlap if it is as big as the edit ahead or behind it.\n \t\tpointer = 1;\n \t\twhile (pointer < diffs.length) {\n \t\t\tif (diffs[pointer - 1][0] === DIFF_DELETE && diffs[pointer][0] === DIFF_INSERT) {\n \t\t\t\tdeletion = diffs[pointer - 1][1];\n \t\t\t\tinsertion = diffs[pointer][1];\n \t\t\t\toverlapLength1 = this.diffCommonOverlap(deletion, insertion);\n \t\t\t\toverlapLength2 = this.diffCommonOverlap(insertion, deletion);\n \t\t\t\tif (overlapLength1 >= overlapLength2) {\n \t\t\t\t\tif (overlapLength1 >= deletion.length / 2 || overlapLength1 >= insertion.length / 2) {\n\n \t\t\t\t\t\t// Overlap found. Insert an equality and trim the surrounding edits.\n \t\t\t\t\t\tdiffs.splice(pointer, 0, [DIFF_EQUAL, insertion.substring(0, overlapLength1)]);\n \t\t\t\t\t\tdiffs[pointer - 1][1] = deletion.substring(0, deletion.length - overlapLength1);\n \t\t\t\t\t\tdiffs[pointer + 1][1] = insertion.substring(overlapLength1);\n \t\t\t\t\t\tpointer++;\n \t\t\t\t\t}\n \t\t\t\t} else {\n \t\t\t\t\tif (overlapLength2 >= deletion.length / 2 || overlapLength2 >= insertion.length / 2) {\n\n \t\t\t\t\t\t// Reverse overlap found.\n \t\t\t\t\t\t// Insert an equality and swap and trim the surrounding edits.\n \t\t\t\t\t\tdiffs.splice(pointer, 0, [DIFF_EQUAL, deletion.substring(0, overlapLength2)]);\n\n \t\t\t\t\t\tdiffs[pointer - 1][0] = DIFF_INSERT;\n \t\t\t\t\t\tdiffs[pointer - 1][1] = insertion.substring(0, insertion.length - overlapLength2);\n \t\t\t\t\t\tdiffs[pointer + 1][0] = DIFF_DELETE;\n \t\t\t\t\t\tdiffs[pointer + 1][1] = deletion.substring(overlapLength2);\n \t\t\t\t\t\tpointer++;\n \t\t\t\t\t}\n \t\t\t\t}\n \t\t\t\tpointer++;\n \t\t\t}\n \t\t\tpointer++;\n \t\t}\n \t};\n\n \t/**\n * Determine if the suffix of one string is the prefix of another.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {number} The number of characters common to the end of the first\n * string and the start of the second string.\n * @private\n */\n \tDiffMatchPatch.prototype.diffCommonOverlap = function (text1, text2) {\n \t\tvar text1Length, text2Length, textLength, best, length, pattern, found;\n\n \t\t// Cache the text lengths to prevent multiple calls.\n \t\ttext1Length = text1.length;\n \t\ttext2Length = text2.length;\n\n \t\t// Eliminate the null case.\n \t\tif (text1Length === 0 || text2Length === 0) {\n \t\t\treturn 0;\n \t\t}\n\n \t\t// Truncate the longer string.\n \t\tif (text1Length > text2Length) {\n \t\t\ttext1 = text1.substring(text1Length - text2Length);\n \t\t} else if (text1Length < text2Length) {\n \t\t\ttext2 = text2.substring(0, text1Length);\n \t\t}\n \t\ttextLength = Math.min(text1Length, text2Length);\n\n \t\t// Quick check for the worst case.\n \t\tif (text1 === text2) {\n \t\t\treturn textLength;\n \t\t}\n\n \t\t// Start by looking for a single character match\n \t\t// and increase length until no match is found.\n \t\t// Performance analysis: https://neil.fraser.name/news/2010/11/04/\n \t\tbest = 0;\n \t\tlength = 1;\n \t\twhile (true) {\n \t\t\tpattern = text1.substring(textLength - length);\n \t\t\tfound = text2.indexOf(pattern);\n \t\t\tif (found === -1) {\n \t\t\t\treturn best;\n \t\t\t}\n \t\t\tlength += found;\n \t\t\tif (found === 0 || text1.substring(textLength - length) === text2.substring(0, length)) {\n \t\t\t\tbest = length;\n \t\t\t\tlength++;\n \t\t\t}\n \t\t}\n \t};\n\n \t/**\n * Split two texts into an array of strings. Reduce the texts to a string of\n * hashes where each Unicode character represents one line.\n * @param {string} text1 First string.\n * @param {string} text2 Second string.\n * @return {{chars1: string, chars2: string, lineArray: !Array.<string>}}\n * An object containing the encoded text1, the encoded text2 and\n * the array of unique strings.\n * The zeroth element of the array of unique strings is intentionally blank.\n * @private\n */\n \tDiffMatchPatch.prototype.diffLinesToChars = function (text1, text2) {\n \t\tvar lineArray, lineHash, chars1, chars2;\n \t\tlineArray = []; // E.g. lineArray[4] === 'Hello\\n'\n \t\tlineHash = {}; // E.g. lineHash['Hello\\n'] === 4\n\n \t\t// '\\x00' is a valid character, but various debuggers don't like it.\n \t\t// So we'll insert a junk entry to avoid generating a null character.\n \t\tlineArray[0] = \"\";\n\n \t\t/**\n * Split a text into an array of strings. Reduce the texts to a string of\n * hashes where each Unicode character represents one line.\n * Modifies linearray and linehash through being a closure.\n * @param {string} text String to encode.\n * @return {string} Encoded string.\n * @private\n */\n \t\tfunction diffLinesToCharsMunge(text) {\n \t\t\tvar chars, lineStart, lineEnd, lineArrayLength, line;\n \t\t\tchars = \"\";\n\n \t\t\t// Walk the text, pulling out a substring for each line.\n \t\t\t// text.split('\\n') would would temporarily double our memory footprint.\n \t\t\t// Modifying text would create many large strings to garbage collect.\n \t\t\tlineStart = 0;\n \t\t\tlineEnd = -1;\n\n \t\t\t// Keeping our own length variable is faster than looking it up.\n \t\t\tlineArrayLength = lineArray.length;\n \t\t\twhile (lineEnd < text.length - 1) {\n \t\t\t\tlineEnd = text.indexOf(\"\\n\", lineStart);\n \t\t\t\tif (lineEnd === -1) {\n \t\t\t\t\tlineEnd = text.length - 1;\n \t\t\t\t}\n \t\t\t\tline = text.substring(lineStart, lineEnd + 1);\n \t\t\t\tlineStart = lineEnd + 1;\n\n \t\t\t\tvar lineHashExists = lineHash.hasOwnProperty ? lineHash.hasOwnProperty(line) : lineHash[line] !== undefined;\n\n \t\t\t\tif (lineHashExists) {\n \t\t\t\t\tchars += String.fromCharCode(lineHash[line]);\n \t\t\t\t} else {\n \t\t\t\t\tchars += String.fromCharCode(lineArrayLength);\n \t\t\t\t\tlineHash[line] = lineArrayLength;\n \t\t\t\t\tlineArray[lineArrayLength++] = line;\n \t\t\t\t}\n \t\t\t}\n \t\t\treturn chars;\n \t\t}\n\n \t\tchars1 = diffLinesToCharsMunge(text1);\n \t\tchars2 = diffLinesToCharsMunge(text2);\n \t\treturn {\n \t\t\tchars1: chars1,\n \t\t\tchars2: chars2,\n \t\t\tlineArray: lineArray\n \t\t};\n \t};\n\n \t/**\n * Rehydrate the text in a diff from a string of line hashes to real lines of\n * text.\n * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.\n * @param {!Array.<string>} lineArray Array of unique strings.\n * @private\n */\n \tDiffMatchPatch.prototype.diffCharsToLines = function (diffs, lineArray) {\n \t\tvar x, chars, text, y;\n \t\tfor (x = 0; x < diffs.length; x++) {\n \t\t\tchars = diffs[x][1];\n \t\t\ttext = [];\n \t\t\tfor (y = 0; y < chars.length; y++) {\n \t\t\t\ttext[y] = lineArray[chars.charCodeAt(y)];\n \t\t\t}\n \t\t\tdiffs[x][1] = text.join(\"\");\n \t\t}\n \t};\n\n \t/**\n * Reorder and merge like edit sections. Merge equalities.\n * Any edit section can move as long as it doesn't cross an equality.\n * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.\n */\n \tDiffMatchPatch.prototype.diffCleanupMerge = function (diffs) {\n \t\tvar pointer, countDelete, countInsert, textInsert, textDelete, commonlength, changes, diffPointer, position;\n \t\tdiffs.push([DIFF_EQUAL, \"\"]); // Add a dummy entry at the end.\n \t\tpointer = 0;\n \t\tcountDelete = 0;\n \t\tcountInsert = 0;\n \t\ttextDelete = \"\";\n \t\ttextInsert = \"\";\n\n \t\twhile (pointer < diffs.length) {\n \t\t\tswitch (diffs[pointer][0]) {\n \t\t\t\tcase DIFF_INSERT:\n \t\t\t\t\tcountInsert++;\n \t\t\t\t\ttextInsert += diffs[pointer][1];\n \t\t\t\t\tpointer++;\n \t\t\t\t\tbreak;\n \t\t\t\tcase DIFF_DELETE:\n \t\t\t\t\tcountDelete++;\n \t\t\t\t\ttextDelete += diffs[pointer][1];\n \t\t\t\t\tpointer++;\n \t\t\t\t\tbreak;\n \t\t\t\tcase DIFF_EQUAL:\n\n \t\t\t\t\t// Upon reaching an equality, check for prior redundancies.\n \t\t\t\t\tif (countDelete + countInsert > 1) {\n \t\t\t\t\t\tif (countDelete !== 0 && countInsert !== 0) {\n\n \t\t\t\t\t\t\t// Factor out any common prefixes.\n \t\t\t\t\t\t\tcommonlength = this.diffCommonPrefix(textInsert, textDelete);\n \t\t\t\t\t\t\tif (commonlength !== 0) {\n \t\t\t\t\t\t\t\tif (pointer - countDelete - countInsert > 0 && diffs[pointer - countDelete - countInsert - 1][0] === DIFF_EQUAL) {\n \t\t\t\t\t\t\t\t\tdiffs[pointer - countDelete - countInsert - 1][1] += textInsert.substring(0, commonlength);\n \t\t\t\t\t\t\t\t} else {\n \t\t\t\t\t\t\t\t\tdiffs.splice(0, 0, [DIFF_EQUAL, textInsert.substring(0, commonlength)]);\n \t\t\t\t\t\t\t\t\tpointer++;\n \t\t\t\t\t\t\t\t}\n \t\t\t\t\t\t\t\ttextInsert = textInsert.substring(commonlength);\n \t\t\t\t\t\t\t\ttextDelete = textDelete.substring(commonlength);\n \t\t\t\t\t\t\t}\n\n \t\t\t\t\t\t\t// Factor out any common suffixies.\n \t\t\t\t\t\t\tcommonlength = this.diffCommonSuffix(textInsert, textDelete);\n \t\t\t\t\t\t\tif (commonlength !== 0) {\n \t\t\t\t\t\t\t\tdiffs[pointer][1] = textInsert.substring(textInsert.length - commonlength) + diffs[pointer][1];\n \t\t\t\t\t\t\t\ttextInsert = textInsert.substring(0, textInsert.length - commonlength);\n \t\t\t\t\t\t\t\ttextDelete = textDelete.substring(0, textDelete.length - commonlength);\n \t\t\t\t\t\t\t}\n \t\t\t\t\t\t}\n\n \t\t\t\t\t\t// Delete the offending records and add the merged ones.\n \t\t\t\t\t\tif (countDelete === 0) {\n \t\t\t\t\t\t\tdiffs.splice(pointer - countInsert, countDelete + countInsert, [DIFF_INSERT, textInsert]);\n \t\t\t\t\t\t} else if (countInsert === 0) {\n \t\t\t\t\t\t\tdiffs.splice(pointer - countDelete, countDelete + countInsert, [DIFF_DELETE, textDelete]);\n \t\t\t\t\t\t} else {\n \t\t\t\t\t\t\tdiffs.splice(pointer - countDelete - countInsert, countDelete + countInsert, [DIFF_DELETE, textDelete], [DIFF_INSERT, textInsert]);\n \t\t\t\t\t\t}\n \t\t\t\t\t\tpointer = pointer - countDelete - countInsert + (countDelete ? 1 : 0) + (countInsert ? 1 : 0) + 1;\n \t\t\t\t\t} else if (pointer !== 0 && diffs[pointer - 1][0] === DIFF_EQUAL) {\n\n \t\t\t\t\t\t// Merge this equality with the previous one.\n \t\t\t\t\t\tdiffs[pointer - 1][1] += diffs[pointer][1];\n \t\t\t\t\t\tdiffs.splice(pointer, 1);\n \t\t\t\t\t} else {\n \t\t\t\t\t\tpointer++;\n \t\t\t\t\t}\n \t\t\t\t\tcountInsert = 0;\n \t\t\t\t\tcountDelete = 0;\n \t\t\t\t\ttextDelete = \"\";\n \t\t\t\t\ttextInsert = \"\";\n \t\t\t\t\tbreak;\n \t\t\t}\n \t\t}\n \t\tif (diffs[diffs.length - 1][1] === \"\") {\n \t\t\tdiffs.pop(); // Remove the dummy entry at the end.\n \t\t}\n\n \t\t// Second pass: look for single edits surrounded on both sides by equalities\n \t\t// which can be shifted sideways to eliminate an equality.\n \t\t// e.g: A<ins>BA</ins>C -> <ins>AB</ins>AC\n \t\tchanges = false;\n \t\tpointer = 1;\n\n \t\t// Intentionally ignore the first and last element (don't need checking).\n \t\twhile (pointer < diffs.length - 1) {\n \t\t\tif (diffs[pointer - 1][0] === DIFF_EQUAL && diffs[pointer + 1][0] === DIFF_EQUAL) {\n\n \t\t\t\tdiffPointer = diffs[pointer][1];\n \t\t\t\tposition = diffPointer.substring(diffPointer.length - diffs[pointer - 1][1].length);\n\n \t\t\t\t// This is a single edit surrounded by equalities.\n \t\t\t\tif (position === diffs[pointer - 1][1]) {\n\n \t\t\t\t\t// Shift the edit over the previous equality.\n \t\t\t\t\tdiffs[pointer][1] = diffs[pointer - 1][1] + diffs[pointer][1].substring(0, diffs[pointer][1].length - diffs[pointer - 1][1].length);\n \t\t\t\t\tdiffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1];\n \t\t\t\t\tdiffs.splice(pointer - 1, 1);\n \t\t\t\t\tchanges = true;\n \t\t\t\t} else if (diffPointer.substring(0, diffs[pointer + 1][1].length) === diffs[pointer + 1][1]) {\n\n \t\t\t\t\t// Shift the edit over the next equality.\n \t\t\t\t\tdiffs[pointer - 1][1] += diffs[pointer + 1][1];\n \t\t\t\t\tdiffs[pointer][1] = diffs[pointer][1].substring(diffs[pointer + 1][1].length) + diffs[pointer + 1][1];\n \t\t\t\t\tdiffs.splice(pointer + 1, 1);\n \t\t\t\t\tchanges = true;\n \t\t\t\t}\n \t\t\t}\n \t\t\tpointer++;\n \t\t}\n\n \t\t// If shifts were made, the diff needs reordering and another shift sweep.\n \t\tif (changes) {\n \t\t\tthis.diffCleanupMerge(diffs);\n \t\t}\n \t};\n\n \treturn function (o, n) {\n \t\tvar diff, output, text;\n \t\tdiff = new DiffMatchPatch();\n \t\toutput = diff.DiffMain(o, n);\n \t\tdiff.diffCleanupEfficiency(output);\n \t\ttext = diff.diffPrettyHtml(output);\n\n \t\treturn text;\n \t};\n }();\n\n}((function() { return this; }())));\n","/* globals QUnit */\n\n(function() {\n QUnit.config.autostart = false;\n QUnit.config.urlConfig.push({ id: 'nocontainer', label: 'Hide container' });\n QUnit.config.urlConfig.push({ id: 'nolint', label: 'Disable Linting' });\n QUnit.config.urlConfig.push({ id: 'dockcontainer', label: 'Dock container' });\n QUnit.config.urlConfig.push({ id: 'devmode', label: 'Development mode' });\n\n QUnit.config.testTimeout = QUnit.urlParams.devmode ? null : 60000; //Default Test Timeout 60 Seconds\n})();\n","define('@ember/test-helpers/-utils', ['exports'], function (exports) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.nextTickPromise = nextTickPromise;\n exports.runDestroyablesFor = runDestroyablesFor;\n const nextTick = exports.nextTick = setTimeout;\n const futureTick = exports.futureTick = setTimeout;\n\n /**\n @private\n @returns {Promise<void>} promise which resolves on the next turn of the event loop\n */\n function nextTickPromise() {\n return new Ember.RSVP.Promise(resolve => {\n nextTick(resolve);\n });\n }\n\n /**\n Retrieves an array of destroyables from the specified property on the object\n provided, iterates that array invoking each function, then deleting the\n property (clearing the array).\n \n @private\n @param {Object} object an object to search for the destroyable array within\n @param {string} property the property on the object that contains the destroyable array\n */\n function runDestroyablesFor(object, property) {\n let destroyables = object[property];\n\n if (!destroyables) {\n return;\n }\n\n for (let i = 0; i < destroyables.length; i++) {\n destroyables[i]();\n }\n\n delete object[property];\n }\n});","define('@ember/test-helpers/application', ['exports', '@ember/test-helpers/resolver'], function (exports, _resolver) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.setApplication = setApplication;\n exports.getApplication = getApplication;\n\n\n var __application__;\n\n /**\n Stores the provided application instance so that tests being ran will be aware of the application under test.\n \n - Required by `setupApplicationContext` method.\n - Used by `setupContext` and `setupRenderingContext` when present.\n \n @public\n @param {Ember.Application} application the application that will be tested\n */\n function setApplication(application) {\n __application__ = application;\n\n if (!(0, _resolver.getResolver)()) {\n let Resolver = application.Resolver;\n let resolver = Resolver.create({ namespace: application });\n\n (0, _resolver.setResolver)(resolver);\n }\n }\n\n /**\n Retrieve the application instance stored by `setApplication`.\n \n @public\n @returns {Ember.Application} the previously stored application instance under test\n */\n function getApplication() {\n return __application__;\n }\n});","define('@ember/test-helpers/build-owner', ['exports', 'ember-test-helpers/legacy-0-6-x/build-registry'], function (exports, _buildRegistry) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = buildOwner;\n\n\n /**\n Creates an \"owner\" (an object that either _is_ or duck-types like an\n `Ember.ApplicationInstance`) from the provided options.\n \n If `options.application` is present (e.g. setup by an earlier call to\n `setApplication`) an `Ember.ApplicationInstance` is built via\n `application.buildInstance()`.\n \n If `options.application` is not present, we fall back to using\n `options.resolver` instead (setup via `setResolver`). This creates a mock\n \"owner\" by using a custom created combination of `Ember.Registry`,\n `Ember.Container`, `Ember._ContainerProxyMixin`, and\n `Ember._RegistryProxyMixin`.\n \n @private\n @param {Ember.Application} [application] the Ember.Application to build an instance from\n @param {Ember.Resolver} [resolver] the resolver to use to back a \"mock owner\"\n @returns {Promise<Ember.ApplicationInstance>} a promise resolving to the generated \"owner\"\n */\n function buildOwner(application, resolver) {\n if (application) {\n return application.boot().then(app => app.buildInstance().boot());\n }\n\n if (!resolver) {\n throw new Error('You must set up the ember-test-helpers environment with either `setResolver` or `setApplication` before running any tests.');\n }\n\n let { owner } = (0, _buildRegistry.default)(resolver);\n return Ember.RSVP.Promise.resolve(owner);\n }\n});","define('@ember/test-helpers/dom/-get-element', ['exports', '@ember/test-helpers/dom/get-root-element'], function (exports, _getRootElement) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = getElement;\n\n\n /**\n Used internally by the DOM interaction helpers to find one element.\n \n @private\n @param {string|Element} target the element or selector to retrieve\n @returns {Element} the target or selector\n */\n function getElement(target) {\n if (target.nodeType === Node.ELEMENT_NODE || target.nodeType === Node.DOCUMENT_NODE || target instanceof Window) {\n return target;\n } else if (typeof target === 'string') {\n let rootElement = (0, _getRootElement.default)();\n\n return rootElement.querySelector(target);\n } else {\n throw new Error('Must use an element or a selector string');\n }\n }\n});","define('@ember/test-helpers/dom/-get-elements', ['exports', '@ember/test-helpers/dom/get-root-element'], function (exports, _getRootElement) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = getElements;\n\n\n /**\n Used internally by the DOM interaction helpers to find multiple elements.\n \n @private\n @param {string} target the selector to retrieve\n @returns {NodeList} the matched elements\n */\n function getElements(target) {\n if (typeof target === 'string') {\n let rootElement = (0, _getRootElement.default)();\n\n return rootElement.querySelectorAll(target);\n } else {\n throw new Error('Must use a selector string');\n }\n }\n});","define('@ember/test-helpers/dom/-is-focusable', ['exports', '@ember/test-helpers/dom/-is-form-control'], function (exports, _isFormControl) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = isFocusable;\n\n\n const FOCUSABLE_TAGS = ['A'];\n\n /**\n @private\n @param {Element} element the element to check\n @returns {boolean} `true` when the element is focusable, `false` otherwise\n */\n function isFocusable(element) {\n if ((0, _isFormControl.default)(element) || element.isContentEditable || FOCUSABLE_TAGS.indexOf(element.tagName) > -1) {\n return true;\n }\n\n return element.hasAttribute('tabindex');\n }\n});","define('@ember/test-helpers/dom/-is-form-control', ['exports'], function (exports) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = isFormControl;\n const FORM_CONTROL_TAGS = ['INPUT', 'BUTTON', 'SELECT', 'TEXTAREA'];\n\n /**\n @private\n @param {Element} element the element to check\n @returns {boolean} `true` when the element is a form control, `false` otherwise\n */\n function isFormControl(element) {\n let { tagName, type } = element;\n\n if (type === 'hidden') {\n return false;\n }\n\n return FORM_CONTROL_TAGS.indexOf(tagName) > -1;\n }\n});","define(\"@ember/test-helpers/dom/-to-array\", [\"exports\"], function (exports) {\n \"use strict\";\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = toArray;\n /**\n @private\n @param {NodeList} nodelist the nodelist to convert to an array\n @returns {Array} an array\n */\n function toArray(nodelist) {\n let array = new Array(nodelist.length);\n for (let i = 0; i < nodelist.length; i++) {\n array[i] = nodelist[i];\n }\n\n return array;\n }\n});","define('@ember/test-helpers/dom/blur', ['exports', '@ember/test-helpers/dom/-get-element', '@ember/test-helpers/dom/fire-event', '@ember/test-helpers/settled', '@ember/test-helpers/dom/-is-focusable', '@ember/test-helpers/-utils'], function (exports, _getElement, _fireEvent, _settled, _isFocusable, _utils) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.__blur__ = __blur__;\n exports.default = blur;\n\n\n /**\n @private\n @param {Element} element the element to trigger events on\n */\n function __blur__(element) {\n let browserIsNotFocused = document.hasFocus && !document.hasFocus();\n\n // makes `document.activeElement` be `body`.\n // If the browser is focused, it also fires a blur event\n element.blur();\n\n // Chrome/Firefox does not trigger the `blur` event if the window\n // does not have focus. If the document does not have focus then\n // fire `blur` event via native event.\n if (browserIsNotFocused) {\n (0, _fireEvent.default)(element, 'blur', { bubbles: false });\n (0, _fireEvent.default)(element, 'focusout');\n }\n }\n\n /**\n Unfocus the specified target.\n \n Sends a number of events intending to simulate a \"real\" user unfocusing an\n element.\n \n The following events are triggered (in order):\n \n - `blur`\n - `focusout`\n \n The exact listing of events that are triggered may change over time as needed\n to continue to emulate how actual browsers handle unfocusing a given element.\n \n @public\n @param {string|Element} [target=document.activeElement] the element or selector to unfocus\n @return {Promise<void>} resolves when settled\n */\n function blur(target = document.activeElement) {\n return (0, _utils.nextTickPromise)().then(() => {\n let element = (0, _getElement.default)(target);\n if (!element) {\n throw new Error(`Element not found when calling \\`blur('${target}')\\`.`);\n }\n\n if (!(0, _isFocusable.default)(element)) {\n throw new Error(`${target} is not focusable`);\n }\n\n __blur__(element);\n\n return (0, _settled.default)();\n });\n }\n});","define('@ember/test-helpers/dom/click', ['exports', '@ember/test-helpers/dom/-get-element', '@ember/test-helpers/dom/fire-event', '@ember/test-helpers/dom/focus', '@ember/test-helpers/settled', '@ember/test-helpers/dom/-is-focusable', '@ember/test-helpers/-utils'], function (exports, _getElement, _fireEvent, _focus, _settled, _isFocusable, _utils) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.__click__ = __click__;\n exports.default = click;\n\n\n /**\n @private\n @param {Element} element the element to click on\n */\n function __click__(element) {\n (0, _fireEvent.default)(element, 'mousedown');\n\n if ((0, _isFocusable.default)(element)) {\n (0, _focus.__focus__)(element);\n }\n\n (0, _fireEvent.default)(element, 'mouseup');\n (0, _fireEvent.default)(element, 'click');\n }\n\n /**\n Clicks on the specified target.\n \n Sends a number of events intending to simulate a \"real\" user clicking on an\n element.\n \n For non-focusable elements the following events are triggered (in order):\n \n - `mousedown`\n - `mouseup`\n - `click`\n \n For focusable (e.g. form control) elements the following events are triggered\n (in order):\n \n - `mousedown`\n - `focus`\n - `focusin`\n - `mouseup`\n - `click`\n \n The exact listing of events that are triggered may change over time as needed\n to continue to emulate how actual browsers handle clicking a given element.\n \n @public\n @param {string|Element} target the element or selector to click on\n @return {Promise<void>} resolves when settled\n */\n function click(target) {\n return (0, _utils.nextTickPromise)().then(() => {\n if (!target) {\n throw new Error('Must pass an element or selector to `click`.');\n }\n\n let element = (0, _getElement.default)(target);\n if (!element) {\n throw new Error(`Element not found when calling \\`click('${target}')\\`.`);\n }\n\n __click__(element);\n return (0, _settled.default)();\n });\n }\n});","define('@ember/test-helpers/dom/fill-in', ['exports', '@ember/test-helpers/dom/-get-element', '@ember/test-helpers/dom/-is-form-control', '@ember/test-helpers/dom/focus', '@ember/test-helpers/settled', '@ember/test-helpers/dom/fire-event', '@ember/test-helpers/-utils'], function (exports, _getElement, _isFormControl, _focus, _settled, _fireEvent, _utils) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = fillIn;\n\n\n /**\n Fill the provided text into the `value` property (or set `.innerHTML` when\n the target is a content editable element) then trigger `change` and `input`\n events on the specified target.\n \n @public\n @param {string|Element} target the element or selector to enter text into\n @param {string} text the text to fill into the target element\n @return {Promise<void>} resolves when the application is settled\n */\n function fillIn(target, text) {\n return (0, _utils.nextTickPromise)().then(() => {\n if (!target) {\n throw new Error('Must pass an element or selector to `fillIn`.');\n }\n\n let element = (0, _getElement.default)(target);\n if (!element) {\n throw new Error(`Element not found when calling \\`fillIn('${target}')\\`.`);\n }\n let isControl = (0, _isFormControl.default)(element);\n if (!isControl && !element.isContentEditable) {\n throw new Error('`fillIn` is only usable on form controls or contenteditable elements.');\n }\n\n if (typeof text === 'undefined' || text === null) {\n throw new Error('Must provide `text` when calling `fillIn`.');\n }\n\n (0, _focus.__focus__)(element);\n\n if (isControl) {\n element.value = text;\n } else {\n element.innerHTML = text;\n }\n\n (0, _fireEvent.default)(element, 'input');\n (0, _fireEvent.default)(element, 'change');\n\n return (0, _settled.default)();\n });\n }\n});","define('@ember/test-helpers/dom/find-all', ['exports', '@ember/test-helpers/dom/-get-elements', '@ember/test-helpers/dom/-to-array'], function (exports, _getElements, _toArray) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = find;\n\n\n /**\n Find all elements matched by the given selector. Equivalent to calling\n `querySelectorAll()` on the test root element.\n \n @public\n @param {string} selector the selector to search for\n @return {Array} array of matched elements\n */\n function find(selector) {\n if (!selector) {\n throw new Error('Must pass a selector to `findAll`.');\n }\n\n return (0, _toArray.default)((0, _getElements.default)(selector));\n }\n});","define('@ember/test-helpers/dom/find', ['exports', '@ember/test-helpers/dom/-get-element'], function (exports, _getElement) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = find;\n\n\n /**\n Find the first element matched by the given selector. Equivalent to calling\n `querySelector()` on the test root element.\n \n @public\n @param {string} selector the selector to search for\n @return {Element} matched element or null\n */\n function find(selector) {\n if (!selector) {\n throw new Error('Must pass a selector to `find`.');\n }\n\n return (0, _getElement.default)(selector);\n }\n});","define('@ember/test-helpers/dom/fire-event', ['exports'], function (exports) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = fireEvent;\n\n\n const DEFAULT_EVENT_OPTIONS = { bubbles: true, cancelable: true };\n const KEYBOARD_EVENT_TYPES = exports.KEYBOARD_EVENT_TYPES = Object.freeze(['keydown', 'keypress', 'keyup']);\n const MOUSE_EVENT_TYPES = ['click', 'mousedown', 'mouseup', 'dblclick', 'mouseenter', 'mouseleave', 'mousemove', 'mouseout', 'mouseover'];\n const FILE_SELECTION_EVENT_TYPES = ['change'];\n\n /**\n Internal helper used to build and dispatch events throughout the other DOM helpers.\n \n @private\n @param {Element} element the element to dispatch the event to\n @param {string} eventType the type of event\n @param {Object} [options] additional properties to be set on the event\n @returns {Event} the event that was dispatched\n */\n function fireEvent(element, eventType, options = {}) {\n if (!element) {\n throw new Error('Must pass an element to `fireEvent`');\n }\n\n let event;\n if (KEYBOARD_EVENT_TYPES.indexOf(eventType) > -1) {\n event = buildKeyboardEvent(eventType, options);\n } else if (MOUSE_EVENT_TYPES.indexOf(eventType) > -1) {\n let rect;\n if (element instanceof Window) {\n rect = element.document.documentElement.getBoundingClientRect();\n } else if (element.nodeType === Node.DOCUMENT_NODE) {\n rect = element.documentElement.getBoundingClientRect();\n } else if (element.nodeType === Node.ELEMENT_NODE) {\n rect = element.getBoundingClientRect();\n } else {\n return;\n }\n\n let x = rect.left + 1;\n let y = rect.top + 1;\n let simulatedCoordinates = {\n screenX: x + 5, // Those numbers don't really mean anything.\n screenY: y + 95, // They're just to make the screenX/Y be different of clientX/Y..\n clientX: x,\n clientY: y\n };\n\n event = buildMouseEvent(eventType, Ember.merge(simulatedCoordinates, options));\n } else if (FILE_SELECTION_EVENT_TYPES.indexOf(eventType) > -1 && element.files) {\n event = buildFileEvent(eventType, element, options);\n } else {\n event = buildBasicEvent(eventType, options);\n }\n\n element.dispatchEvent(event);\n return event;\n }\n\n // eslint-disable-next-line require-jsdoc\n function buildBasicEvent(type, options = {}) {\n let event = document.createEvent('Events');\n\n let bubbles = options.bubbles !== undefined ? options.bubbles : true;\n let cancelable = options.cancelable !== undefined ? options.cancelable : true;\n\n delete options.bubbles;\n delete options.cancelable;\n\n // bubbles and cancelable are readonly, so they can be\n // set when initializing event\n event.initEvent(type, bubbles, cancelable);\n Ember.merge(event, options);\n return event;\n }\n\n // eslint-disable-next-line require-jsdoc\n function buildMouseEvent(type, options = {}) {\n let event;\n try {\n event = document.createEvent('MouseEvents');\n let eventOpts = Ember.merge(Ember.merge({}, DEFAULT_EVENT_OPTIONS), options);\n event.initMouseEvent(type, eventOpts.bubbles, eventOpts.cancelable, window, eventOpts.detail, eventOpts.screenX, eventOpts.screenY, eventOpts.clientX, eventOpts.clientY, eventOpts.ctrlKey, eventOpts.altKey, eventOpts.shiftKey, eventOpts.metaKey, eventOpts.button, eventOpts.relatedTarget);\n } catch (e) {\n event = buildBasicEvent(type, options);\n }\n return event;\n }\n\n // eslint-disable-next-line require-jsdoc\n function buildKeyboardEvent(type, options = {}) {\n let eventOpts = Ember.merge(Ember.merge({}, DEFAULT_EVENT_OPTIONS), options);\n let event, eventMethodName;\n\n try {\n event = new KeyboardEvent(type, eventOpts);\n\n // Property definitions are required for B/C for keyboard event usage\n // If this properties are not defined, when listening for key events\n // keyCode/which will be 0. Also, keyCode and which now are string\n // and if app compare it with === with integer key definitions,\n // there will be a fail.\n //\n // https://w3c.github.io/uievents/#interface-keyboardevent\n // https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent\n Object.defineProperty(event, 'keyCode', {\n get() {\n return parseInt(this.key);\n }\n });\n\n Object.defineProperty(event, 'which', {\n get() {\n return parseInt(this.key);\n }\n });\n\n return event;\n } catch (e) {\n // left intentionally blank\n }\n\n try {\n event = document.createEvent('KeyboardEvents');\n eventMethodName = 'initKeyboardEvent';\n } catch (e) {\n // left intentionally blank\n }\n\n if (!event) {\n try {\n event = document.createEvent('KeyEvents');\n eventMethodName = 'initKeyEvent';\n } catch (e) {\n // left intentionally blank\n }\n }\n\n if (event) {\n event[eventMethodName](type, eventOpts.bubbles, eventOpts.cancelable, window, eventOpts.ctrlKey, eventOpts.altKey, eventOpts.shiftKey, eventOpts.metaKey, eventOpts.keyCode, eventOpts.charCode);\n } else {\n event = buildBasicEvent(type, options);\n }\n\n return event;\n }\n\n // eslint-disable-next-line require-jsdoc\n function buildFileEvent(type, element, files = []) {\n let event = buildBasicEvent(type);\n\n if (files.length > 0) {\n Object.defineProperty(files, 'item', {\n value(index) {\n return typeof index === 'number' ? this[index] : null;\n }\n });\n Object.defineProperty(element, 'files', {\n value: files,\n configurable: true\n });\n }\n\n Object.defineProperty(event, 'target', {\n value: element\n });\n\n return event;\n }\n});","define('@ember/test-helpers/dom/focus', ['exports', '@ember/test-helpers/dom/-get-element', '@ember/test-helpers/dom/fire-event', '@ember/test-helpers/settled', '@ember/test-helpers/dom/-is-focusable', '@ember/test-helpers/-utils'], function (exports, _getElement, _fireEvent, _settled, _isFocusable, _utils) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.__focus__ = __focus__;\n exports.default = focus;\n\n\n /**\n @private\n @param {Element} element the element to trigger events on\n */\n function __focus__(element) {\n let browserIsNotFocused = document.hasFocus && !document.hasFocus();\n\n // makes `document.activeElement` be `element`. If the browser is focused, it also fires a focus event\n element.focus();\n\n // Firefox does not trigger the `focusin` event if the window\n // does not have focus. If the document does not have focus then\n // fire `focusin` event as well.\n if (browserIsNotFocused) {\n // if the browser is not focused the previous `el.focus()` didn't fire an event, so we simulate it\n (0, _fireEvent.default)(element, 'focus', {\n bubbles: false\n });\n\n (0, _fireEvent.default)(element, 'focusin');\n }\n }\n\n /**\n Focus the specified target.\n \n Sends a number of events intending to simulate a \"real\" user focusing an\n element.\n \n The following events are triggered (in order):\n \n - `focus`\n - `focusin`\n \n The exact listing of events that are triggered may change over time as needed\n to continue to emulate how actual browsers handle focusing a given element.\n \n @public\n @param {string|Element} target the element or selector to focus\n @return {Promise<void>} resolves when the application is settled\n */\n function focus(target) {\n return (0, _utils.nextTickPromise)().then(() => {\n if (!target) {\n throw new Error('Must pass an element or selector to `focus`.');\n }\n\n let element = (0, _getElement.default)(target);\n if (!element) {\n throw new Error(`Element not found when calling \\`focus('${target}')\\`.`);\n }\n\n if (!(0, _isFocusable.default)(element)) {\n throw new Error(`${target} is not focusable`);\n }\n\n __focus__(element);\n\n return (0, _settled.default)();\n });\n }\n});","define('@ember/test-helpers/dom/get-root-element', ['exports', '@ember/test-helpers/setup-context'], function (exports, _setupContext) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = getRootElement;\n\n\n /**\n Get the root element of the application under test (usually `#ember-testing`)\n \n @public\n @returns {Element} the root element\n */\n function getRootElement() {\n let context = (0, _setupContext.getContext)();\n let owner = context && context.owner;\n\n if (!owner) {\n throw new Error('Must setup rendering context before attempting to interact with elements.');\n }\n\n let rootElementSelector;\n // When the host app uses `setApplication` (instead of `setResolver`) the owner has\n // a `rootElement` set on it with the element id to be used\n if (owner && owner._emberTestHelpersMockOwner === undefined) {\n rootElementSelector = owner.rootElement;\n } else {\n rootElementSelector = '#ember-testing';\n }\n\n let rootElement = document.querySelector(rootElementSelector);\n\n return rootElement;\n }\n});","define('@ember/test-helpers/dom/tap', ['exports', '@ember/test-helpers/dom/-get-element', '@ember/test-helpers/dom/fire-event', '@ember/test-helpers/dom/click', '@ember/test-helpers/settled', '@ember/test-helpers/-utils'], function (exports, _getElement, _fireEvent, _click, _settled, _utils) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = tap;\n\n\n /**\n Taps on the specified target.\n \n Sends a number of events intending to simulate a \"real\" user tapping on an\n element.\n \n For non-focusable elements the following events are triggered (in order):\n \n - `touchstart`\n - `touchend`\n - `mousedown`\n - `mouseup`\n - `click`\n \n For focusable (e.g. form control) elements the following events are triggered\n (in order):\n \n - `touchstart`\n - `touchend`\n - `mousedown`\n - `focus`\n - `focusin`\n - `mouseup`\n - `click`\n \n The exact listing of events that are triggered may change over time as needed\n to continue to emulate how actual browsers handle tapping on a given element.\n \n @public\n @param {string|Element} target the element or selector to tap on\n @param {Object} options the options to be provided to the touch events\n @return {Promise<void>} resolves when settled\n */\n function tap(target, options = {}) {\n return (0, _utils.nextTickPromise)().then(() => {\n if (!target) {\n throw new Error('Must pass an element or selector to `tap`.');\n }\n\n let element = (0, _getElement.default)(target);\n if (!element) {\n throw new Error(`Element not found when calling \\`tap('${target}')\\`.`);\n }\n\n let touchstartEv = (0, _fireEvent.default)(element, 'touchstart', options);\n let touchendEv = (0, _fireEvent.default)(element, 'touchend', options);\n\n if (!touchstartEv.defaultPrevented && !touchendEv.defaultPrevented) {\n (0, _click.__click__)(element);\n }\n\n return (0, _settled.default)();\n });\n }\n});","define('@ember/test-helpers/dom/trigger-event', ['exports', '@ember/test-helpers/dom/-get-element', '@ember/test-helpers/dom/fire-event', '@ember/test-helpers/settled', '@ember/test-helpers/-utils'], function (exports, _getElement, _fireEvent, _settled, _utils) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = triggerEvent;\n\n\n /**\n Triggers an event on the specified target.\n \n @public\n @param {string|Element} target the element or selector to trigger the event on\n @param {string} eventType the type of event to trigger\n @param {Object} options additional properties to be set on the event\n @return {Promise<void>} resolves when the application is settled\n */\n function triggerEvent(target, eventType, options) {\n return (0, _utils.nextTickPromise)().then(() => {\n if (!target) {\n throw new Error('Must pass an element or selector to `triggerEvent`.');\n }\n\n let element = (0, _getElement.default)(target);\n if (!element) {\n throw new Error(`Element not found when calling \\`triggerEvent('${target}', ...)\\`.`);\n }\n\n if (!eventType) {\n throw new Error(`Must provide an \\`eventType\\` to \\`triggerEvent\\``);\n }\n\n (0, _fireEvent.default)(element, eventType, options);\n\n return (0, _settled.default)();\n });\n }\n});","define('@ember/test-helpers/dom/trigger-key-event', ['exports', '@ember/test-helpers/dom/-get-element', '@ember/test-helpers/dom/fire-event', '@ember/test-helpers/settled', '@ember/test-helpers/-utils'], function (exports, _getElement, _fireEvent, _settled, _utils) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = triggerKeyEvent;\n\n\n const DEFAULT_MODIFIERS = Object.freeze({\n ctrlKey: false,\n altKey: false,\n shiftKey: false,\n metaKey: false\n });\n\n /**\n Triggers a keyboard event on the specified target.\n \n @public\n @param {string|Element} target the element or selector to trigger the event on\n @param {'keydown' | 'keyup' | 'keypress'} eventType the type of event to trigger\n @param {string} keyCode the keyCode of the event being triggered\n @param {Object} [modifiers] the state of various modifier keys\n @param {boolean} [modifiers.ctrlKey=false] if true the generated event will indicate the control key was pressed during the key event\n @param {boolean} [modifiers.altKey=false] if true the generated event will indicate the alt key was pressed during the key event\n @param {boolean} [modifiers.shiftKey=false] if true the generated event will indicate the shift key was pressed during the key event\n @param {boolean} [modifiers.metaKey=false] if true the generated event will indicate the meta key was pressed during the key event\n @return {Promise<void>} resolves when the application is settled\n */\n function triggerKeyEvent(target, eventType, keyCode, modifiers = DEFAULT_MODIFIERS) {\n return (0, _utils.nextTickPromise)().then(() => {\n if (!target) {\n throw new Error('Must pass an element or selector to `triggerKeyEvent`.');\n }\n\n let element = (0, _getElement.default)(target);\n if (!element) {\n throw new Error(`Element not found when calling \\`triggerKeyEvent('${target}', ...)\\`.`);\n }\n\n if (!eventType) {\n throw new Error(`Must provide an \\`eventType\\` to \\`triggerKeyEvent\\``);\n }\n\n if (_fireEvent.KEYBOARD_EVENT_TYPES.indexOf(eventType) === -1) {\n let validEventTypes = _fireEvent.KEYBOARD_EVENT_TYPES.join(', ');\n throw new Error(`Must provide an \\`eventType\\` of ${validEventTypes} to \\`triggerKeyEvent\\` but you passed \\`${eventType}\\`.`);\n }\n\n if (!keyCode) {\n throw new Error(`Must provide a \\`keyCode\\` to \\`triggerKeyEvent\\``);\n }\n\n let options = Ember.merge({ keyCode, which: keyCode, key: keyCode }, modifiers);\n\n (0, _fireEvent.default)(element, eventType, options);\n\n return (0, _settled.default)();\n });\n }\n});","define('@ember/test-helpers/dom/wait-for', ['exports', '@ember/test-helpers/wait-until', '@ember/test-helpers/dom/-get-element', '@ember/test-helpers/dom/-get-elements', '@ember/test-helpers/dom/-to-array', '@ember/test-helpers/-utils'], function (exports, _waitUntil, _getElement, _getElements, _toArray, _utils) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = waitFor;\n\n\n /**\n Used to wait for a particular selector to appear in the DOM. Due to the fact\n that it does not wait for general settledness, this is quite useful for testing\n interim DOM states (e.g. loading states, pending promises, etc).\n \n @param {string} selector the selector to wait for\n @param {Object} [options] the options to be used\n @param {number} [options.timeout=1000] the time to wait (in ms) for a match\n @param {number} [options.count=1] the number of elements that should match the provided selector\n @returns {Element|Array<Element>} the element (or array of elements) that were being waited upon\n */\n function waitFor(selector, { timeout = 1000, count = null } = {}) {\n return (0, _utils.nextTickPromise)().then(() => {\n if (!selector) {\n throw new Error('Must pass a selector to `waitFor`.');\n }\n\n let callback;\n if (count !== null) {\n callback = () => {\n let elements = (0, _getElements.default)(selector);\n if (elements.length === count) {\n return (0, _toArray.default)(elements);\n }\n };\n } else {\n callback = () => (0, _getElement.default)(selector);\n }\n return (0, _waitUntil.default)(callback, { timeout });\n });\n }\n});","define('@ember/test-helpers/global', ['exports'], function (exports) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n exports.default = (() => {\n if (typeof self !== 'undefined') {\n return self;\n } else if (typeof window !== 'undefined') {\n return window;\n } else if (typeof global !== 'undefined') {\n return global;\n } else {\n return Function('return this')();\n }\n })();\n});","define('@ember/test-helpers/has-ember-version', ['exports'], function (exports) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = hasEmberVersion;\n\n\n /**\n Checks if the currently running Ember version is greater than or equal to the\n specified major and minor version numbers.\n \n @private\n @param {number} major the major version number to compare\n @param {number} minor the minor version number to compare\n @returns {boolean} true if the Ember version is >= MAJOR.MINOR specified, false otherwise\n */\n function hasEmberVersion(major, minor) {\n var numbers = Ember.VERSION.split('-')[0].split('.');\n var actualMajor = parseInt(numbers[0], 10);\n var actualMinor = parseInt(numbers[1], 10);\n return actualMajor > major || actualMajor === major && actualMinor >= minor;\n }\n});","define('@ember/test-helpers/index', ['exports', '@ember/test-helpers/resolver', '@ember/test-helpers/application', '@ember/test-helpers/setup-context', '@ember/test-helpers/teardown-context', '@ember/test-helpers/setup-rendering-context', '@ember/test-helpers/teardown-rendering-context', '@ember/test-helpers/setup-application-context', '@ember/test-helpers/teardown-application-context', '@ember/test-helpers/settled', '@ember/test-helpers/wait-until', '@ember/test-helpers/validate-error-handler', '@ember/test-helpers/dom/click', '@ember/test-helpers/dom/tap', '@ember/test-helpers/dom/focus', '@ember/test-helpers/dom/blur', '@ember/test-helpers/dom/trigger-event', '@ember/test-helpers/dom/trigger-key-event', '@ember/test-helpers/dom/fill-in', '@ember/test-helpers/dom/wait-for', '@ember/test-helpers/dom/get-root-element', '@ember/test-helpers/dom/find', '@ember/test-helpers/dom/find-all'], function (exports, _resolver, _application, _setupContext, _teardownContext, _setupRenderingContext, _teardownRenderingContext, _setupApplicationContext, _teardownApplicationContext, _settled, _waitUntil, _validateErrorHandler, _click, _tap, _focus, _blur, _triggerEvent, _triggerKeyEvent, _fillIn, _waitFor, _getRootElement, _find, _findAll) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n Object.defineProperty(exports, 'setResolver', {\n enumerable: true,\n get: function () {\n return _resolver.setResolver;\n }\n });\n Object.defineProperty(exports, 'getResolver', {\n enumerable: true,\n get: function () {\n return _resolver.getResolver;\n }\n });\n Object.defineProperty(exports, 'getApplication', {\n enumerable: true,\n get: function () {\n return _application.getApplication;\n }\n });\n Object.defineProperty(exports, 'setApplication', {\n enumerable: true,\n get: function () {\n return _application.setApplication;\n }\n });\n Object.defineProperty(exports, 'setupContext', {\n enumerable: true,\n get: function () {\n return _setupContext.default;\n }\n });\n Object.defineProperty(exports, 'getContext', {\n enumerable: true,\n get: function () {\n return _setupContext.getContext;\n }\n });\n Object.defineProperty(exports, 'setContext', {\n enumerable: true,\n get: function () {\n return _setupContext.setContext;\n }\n });\n Object.defineProperty(exports, 'unsetContext', {\n enumerable: true,\n get: function () {\n return _setupContext.unsetContext;\n }\n });\n Object.defineProperty(exports, 'pauseTest', {\n enumerable: true,\n get: function () {\n return _setupContext.pauseTest;\n }\n });\n Object.defineProperty(exports, 'resumeTest', {\n enumerable: true,\n get: function () {\n return _setupContext.resumeTest;\n }\n });\n Object.defineProperty(exports, 'teardownContext', {\n enumerable: true,\n get: function () {\n return _teardownContext.default;\n }\n });\n Object.defineProperty(exports, 'setupRenderingContext', {\n enumerable: true,\n get: function () {\n return _setupRenderingContext.default;\n }\n });\n Object.defineProperty(exports, 'render', {\n enumerable: true,\n get: function () {\n return _setupRenderingContext.render;\n }\n });\n Object.defineProperty(exports, 'clearRender', {\n enumerable: true,\n get: function () {\n return _setupRenderingContext.clearRender;\n }\n });\n Object.defineProperty(exports, 'teardownRenderingContext', {\n enumerable: true,\n get: function () {\n return _teardownRenderingContext.default;\n }\n });\n Object.defineProperty(exports, 'setupApplicationContext', {\n enumerable: true,\n get: function () {\n return _setupApplicationContext.default;\n }\n });\n Object.defineProperty(exports, 'visit', {\n enumerable: true,\n get: function () {\n return _setupApplicationContext.visit;\n }\n });\n Object.defineProperty(exports, 'currentRouteName', {\n enumerable: true,\n get: function () {\n return _setupApplicationContext.currentRouteName;\n }\n });\n Object.defineProperty(exports, 'currentURL', {\n enumerable: true,\n get: function () {\n return _setupApplicationContext.currentURL;\n }\n });\n Object.defineProperty(exports, 'teardownApplicationContext', {\n enumerable: true,\n get: function () {\n return _teardownApplicationContext.default;\n }\n });\n Object.defineProperty(exports, 'settled', {\n enumerable: true,\n get: function () {\n return _settled.default;\n }\n });\n Object.defineProperty(exports, 'isSettled', {\n enumerable: true,\n get: function () {\n return _settled.isSettled;\n }\n });\n Object.defineProperty(exports, 'getSettledState', {\n enumerable: true,\n get: function () {\n return _settled.getSettledState;\n }\n });\n Object.defineProperty(exports, 'waitUntil', {\n enumerable: true,\n get: function () {\n return _waitUntil.default;\n }\n });\n Object.defineProperty(exports, 'validateErrorHandler', {\n enumerable: true,\n get: function () {\n return _validateErrorHandler.default;\n }\n });\n Object.defineProperty(exports, 'click', {\n enumerable: true,\n get: function () {\n return _click.default;\n }\n });\n Object.defineProperty(exports, 'tap', {\n enumerable: true,\n get: function () {\n return _tap.default;\n }\n });\n Object.defineProperty(exports, 'focus', {\n enumerable: true,\n get: function () {\n return _focus.default;\n }\n });\n Object.defineProperty(exports, 'blur', {\n enumerable: true,\n get: function () {\n return _blur.default;\n }\n });\n Object.defineProperty(exports, 'triggerEvent', {\n enumerable: true,\n get: function () {\n return _triggerEvent.default;\n }\n });\n Object.defineProperty(exports, 'triggerKeyEvent', {\n enumerable: true,\n get: function () {\n return _triggerKeyEvent.default;\n }\n });\n Object.defineProperty(exports, 'fillIn', {\n enumerable: true,\n get: function () {\n return _fillIn.default;\n }\n });\n Object.defineProperty(exports, 'waitFor', {\n enumerable: true,\n get: function () {\n return _waitFor.default;\n }\n });\n Object.defineProperty(exports, 'getRootElement', {\n enumerable: true,\n get: function () {\n return _getRootElement.default;\n }\n });\n Object.defineProperty(exports, 'find', {\n enumerable: true,\n get: function () {\n return _find.default;\n }\n });\n Object.defineProperty(exports, 'findAll', {\n enumerable: true,\n get: function () {\n return _findAll.default;\n }\n });\n});","define(\"@ember/test-helpers/resolver\", [\"exports\"], function (exports) {\n \"use strict\";\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.setResolver = setResolver;\n exports.getResolver = getResolver;\n var __resolver__;\n\n /**\n Stores the provided resolver instance so that tests being ran can resolve\n objects in the same way as a normal application.\n \n Used by `setupContext` and `setupRenderingContext` as a fallback when `setApplication` was _not_ used.\n \n @public\n @param {Ember.Resolver} resolver the resolver to be used for testing\n */\n function setResolver(resolver) {\n __resolver__ = resolver;\n }\n\n /**\n Retrieve the resolver instance stored by `setResolver`.\n \n @public\n @returns {Ember.Resolver} the previously stored resolver\n */\n function getResolver() {\n return __resolver__;\n }\n});","define('@ember/test-helpers/settled', ['exports', '@ember/test-helpers/-utils', '@ember/test-helpers/wait-until'], function (exports, _utils, _waitUntil) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports._teardownAJAXHooks = _teardownAJAXHooks;\n exports._setupAJAXHooks = _setupAJAXHooks;\n exports.getSettledState = getSettledState;\n exports.isSettled = isSettled;\n exports.default = settled;\n\n\n // Ember internally tracks AJAX requests in the same way that we do here for\n // legacy style \"acceptance\" tests using the `ember-testing.js` asset provided\n // by emberjs/ember.js itself. When `@ember/test-helpers`'s `settled` utility\n // is used in a legacy acceptance test context any pending AJAX requests are\n // not properly considered during the `isSettled` check below.\n //\n // This utilizes a local utility method present in Ember since around 2.8.0 to\n // properly consider pending AJAX requests done within legacy acceptance tests.\n const _internalPendingRequests = (() => {\n if (Ember.__loader.registry['ember-testing/test/pending_requests']) {\n return Ember.__loader.require('ember-testing/test/pending_requests').pendingRequests;\n }\n\n return () => 0;\n })();\n\n let requests;\n\n /**\n @private\n @returns {number} the count of pending requests\n */\n function pendingRequests() {\n let localRequestsPending = requests !== undefined ? requests.length : 0;\n let internalRequestsPending = _internalPendingRequests();\n\n return localRequestsPending + internalRequestsPending;\n }\n\n /**\n @private\n @param {Event} event (unused)\n @param {XMLHTTPRequest} xhr the XHR that has initiated a request\n */\n function incrementAjaxPendingRequests(event, xhr) {\n requests.push(xhr);\n }\n\n /**\n @private\n @param {Event} event (unused)\n @param {XMLHTTPRequest} xhr the XHR that has initiated a request\n */\n function decrementAjaxPendingRequests(event, xhr) {\n // In most Ember versions to date (current version is 2.16) RSVP promises are\n // configured to flush in the actions queue of the Ember run loop, however it\n // is possible that in the future this changes to use \"true\" micro-task\n // queues.\n //\n // The entire point here, is that _whenever_ promises are resolved will be\n // before the next run of the JS event loop. Then in the next event loop this\n // counter will decrement. In the specific case of AJAX, this means that any\n // promises chained off of `$.ajax` will properly have their `.then` called\n // _before_ this is decremented (and testing continues)\n (0, _utils.nextTick)(() => {\n for (let i = 0; i < requests.length; i++) {\n if (xhr === requests[i]) {\n requests.splice(i, 1);\n }\n }\n }, 0);\n }\n\n /**\n Clears listeners that were previously setup for `ajaxSend` and `ajaxComplete`.\n \n @private\n */\n function _teardownAJAXHooks() {\n if (!Ember.$) {\n return;\n }\n\n Ember.$(document).off('ajaxSend', incrementAjaxPendingRequests);\n Ember.$(document).off('ajaxComplete', decrementAjaxPendingRequests);\n }\n\n /**\n Sets up listeners for `ajaxSend` and `ajaxComplete`.\n \n @private\n */\n function _setupAJAXHooks() {\n requests = [];\n\n if (!Ember.$) {\n return;\n }\n\n Ember.$(document).on('ajaxSend', incrementAjaxPendingRequests);\n Ember.$(document).on('ajaxComplete', decrementAjaxPendingRequests);\n }\n\n let _internalCheckWaiters;\n if (Ember.__loader.registry['ember-testing/test/waiters']) {\n _internalCheckWaiters = Ember.__loader.require('ember-testing/test/waiters').checkWaiters;\n }\n\n /**\n @private\n @returns {boolean} true if waiters are still pending\n */\n function checkWaiters() {\n if (_internalCheckWaiters) {\n return _internalCheckWaiters();\n } else if (Ember.Test.waiters) {\n if (Ember.Test.waiters.any(([context, callback]) => !callback.call(context))) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n Check various settledness metrics, and return an object with the following properties:\n \n * `hasRunLoop` - Checks if a run-loop has been started. If it has, this will\n be `true` otherwise it will be `false`.\n * `hasPendingTimers` - Checks if there are scheduled timers in the run-loop.\n These pending timers are primarily registered by `Ember.run.schedule`. If\n there are pending timers, this will be `true`, otherwise `false`.\n * `hasPendingWaiters` - Checks if any registered test waiters are still\n pending (e.g. the waiter returns `true`). If there are pending waiters,\n this will be `true`, otherwise `false`.\n * `hasPendingRequests` - Checks if there are pending AJAX requests (based on\n `ajaxSend` / `ajaxComplete` events triggered by `jQuery.ajax`). If there\n are pending requests, this will be `true`, otherwise `false`.\n * `pendingRequestCount` - The count of pending AJAX requests.\n \n @public\n @returns {Object} object with properties for each of the metrics used to determine settledness\n */\n function getSettledState() {\n let pendingRequestCount = pendingRequests();\n\n return {\n hasPendingTimers: Boolean(Ember.run.hasScheduledTimers()),\n hasRunLoop: Boolean(Ember.run.currentRunLoop),\n hasPendingWaiters: checkWaiters(),\n hasPendingRequests: pendingRequestCount > 0,\n pendingRequestCount\n };\n }\n\n /**\n Checks various settledness metrics (via `getSettledState()`) to determine if things are settled or not.\n \n Settled generally means that there are no pending timers, no pending waiters,\n no pending AJAX requests, and no current run loop. However, new settledness\n metrics may be added and used as they become available.\n \n @public\n @returns {boolean} `true` if settled, `false` otherwise\n */\n function isSettled() {\n let { hasPendingTimers, hasRunLoop, hasPendingRequests, hasPendingWaiters } = getSettledState();\n\n if (hasPendingTimers || hasRunLoop || hasPendingRequests || hasPendingWaiters) {\n return false;\n }\n\n return true;\n }\n\n /**\n Returns a promise that resolves when in a settled state (see `isSettled` for\n a definition of \"settled state\").\n \n @public\n @returns {Promise<void>} resolves when settled\n */\n function settled() {\n return (0, _waitUntil.default)(isSettled, { timeout: Infinity });\n }\n});","define('@ember/test-helpers/setup-application-context', ['exports', '@ember/test-helpers/-utils', '@ember/test-helpers/setup-context', '@ember/test-helpers/has-ember-version', '@ember/test-helpers/settled'], function (exports, _utils, _setupContext, _hasEmberVersion, _settled) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.visit = visit;\n exports.currentRouteName = currentRouteName;\n exports.currentURL = currentURL;\n exports.default = setupApplicationContext;\n\n\n /**\n Navigate the application to the provided URL.\n \n @public\n @returns {Promise<void>} resolves when settled\n */\n function visit() {\n let context = (0, _setupContext.getContext)();\n let { owner } = context;\n\n return (0, _utils.nextTickPromise)().then(() => {\n return owner.visit(...arguments);\n }).then(() => {\n if (EmberENV._APPLICATION_TEMPLATE_WRAPPER !== false) {\n context.element = document.querySelector('#ember-testing > .ember-view');\n } else {\n context.element = document.querySelector('#ember-testing');\n }\n }).then(_settled.default);\n }\n\n /**\n @public\n @returns {string} the currently active route name\n */\n /* globals EmberENV */\n function currentRouteName() {\n let { owner } = (0, _setupContext.getContext)();\n let router = owner.lookup('router:main');\n return Ember.get(router, 'currentRouteName');\n }\n\n const HAS_CURRENT_URL_ON_ROUTER = (0, _hasEmberVersion.default)(2, 13);\n\n /**\n @public\n @returns {string} the applications current url\n */\n function currentURL() {\n let { owner } = (0, _setupContext.getContext)();\n let router = owner.lookup('router:main');\n\n if (HAS_CURRENT_URL_ON_ROUTER) {\n return Ember.get(router, 'currentURL');\n } else {\n return Ember.get(router, 'location').getURL();\n }\n }\n\n /**\n Used by test framework addons to setup the provided context for working with\n an application (e.g. routing).\n \n `setupContext` must have been ran on the provided context prior to calling\n `setupApplicatinContext`.\n \n Sets up the basic framework used by application tests.\n \n @public\n @param {Object} context the context to setup\n @returns {Promise<Object>} resolves with the context that was setup\n */\n function setupApplicationContext() {\n return (0, _utils.nextTickPromise)();\n }\n});","define('@ember/test-helpers/setup-context', ['exports', '@ember/test-helpers/build-owner', '@ember/test-helpers/settled', '@ember/test-helpers/global', '@ember/test-helpers/resolver', '@ember/test-helpers/application', '@ember/test-helpers/-utils'], function (exports, _buildOwner, _settled, _global, _resolver, _application, _utils) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.CLEANUP = undefined;\n exports.setContext = setContext;\n exports.getContext = getContext;\n exports.unsetContext = unsetContext;\n exports.pauseTest = pauseTest;\n exports.resumeTest = resumeTest;\n\n exports.default = function (context, options = {}) {\n Ember.testing = true;\n setContext(context);\n\n let contextGuid = Ember.guidFor(context);\n CLEANUP[contextGuid] = [];\n\n return (0, _utils.nextTickPromise)().then(() => {\n let application = (0, _application.getApplication)();\n if (application) {\n return application.boot();\n }\n }).then(() => {\n let testElementContainer = document.getElementById('ember-testing-container');\n let fixtureResetValue = testElementContainer.innerHTML;\n\n // push this into the final cleanup bucket, to be ran _after_ the owner\n // is destroyed and settled (e.g. flushed run loops, etc)\n CLEANUP[contextGuid].push(() => {\n testElementContainer.innerHTML = fixtureResetValue;\n });\n\n let { resolver } = options;\n\n // This handles precendence, specifying a specific option of\n // resolver always trumps whatever is auto-detected, then we fallback to\n // the suite-wide registrations\n //\n // At some later time this can be extended to support specifying a custom\n // engine or application...\n if (resolver) {\n return (0, _buildOwner.default)(null, resolver);\n }\n\n return (0, _buildOwner.default)((0, _application.getApplication)(), (0, _resolver.getResolver)());\n }).then(owner => {\n context.owner = owner;\n\n context.set = function (key, value) {\n let ret = Ember.run(function () {\n return Ember.set(context, key, value);\n });\n\n return ret;\n };\n\n context.setProperties = function (hash) {\n let ret = Ember.run(function () {\n return Ember.setProperties(context, hash);\n });\n\n return ret;\n };\n\n context.get = function (key) {\n return Ember.get(context, key);\n };\n\n context.getProperties = function (...args) {\n return Ember.getProperties(context, args);\n };\n\n let resume;\n context.resumeTest = function resumeTest() {\n (true && !(resume) && Ember.assert('Testing has not been paused. There is nothing to resume.', resume));\n\n resume();\n _global.default.resumeTest = resume = undefined;\n };\n\n context.pauseTest = function pauseTest() {\n console.info('Testing paused. Use `resumeTest()` to continue.'); // eslint-disable-line no-console\n\n return new Ember.RSVP.Promise(resolve => {\n resume = resolve;\n _global.default.resumeTest = resumeTest;\n }, 'TestAdapter paused promise');\n };\n\n (0, _settled._setupAJAXHooks)();\n\n return context;\n });\n };\n\n let __test_context__;\n\n /**\n Stores the provided context as the \"global testing context\".\n \n Generally setup automatically by `setupContext`.\n \n @public\n @param {Object} context the context to use\n */\n function setContext(context) {\n __test_context__ = context;\n }\n\n /**\n Retrive the \"global testing context\" as stored by `setContext`.\n \n @public\n @returns {Object} the previously stored testing context\n */\n function getContext() {\n return __test_context__;\n }\n\n /**\n Clear the \"global testing context\".\n \n Generally invoked from `teardownContext`.\n \n @public\n */\n function unsetContext() {\n __test_context__ = undefined;\n }\n\n /**\n * Returns a promise to be used to pauses the current test (due to being\n * returned from the test itself). This is useful for debugging while testing\n * or for test-driving. It allows you to inspect the state of your application\n * at any point.\n *\n * The test framework wrapper (e.g. `ember-qunit` or `ember-mocha`) should\n * ensure that when `pauseTest()` is used, any framework specific test timeouts\n * are disabled.\n *\n * @public\n * @returns {Promise<void>} resolves _only_ when `resumeTest()` is invoked\n * @example <caption>Usage via ember-qunit</caption>\n *\n * import { setupRenderingTest } from 'ember-qunit';\n * import { render, click, pauseTest } from '@ember/test-helpers';\n *\n *\n * module('awesome-sauce', function(hooks) {\n * setupRenderingTest(hooks);\n *\n * test('does something awesome', async function(assert) {\n * await render(hbs`{{awesome-sauce}}`);\n *\n * // added here to visualize / interact with the DOM prior\n * // to the interaction below\n * await pauseTest();\n *\n * click('.some-selector');\n *\n * assert.equal(this.element.textContent, 'this sauce is awesome!');\n * });\n * });\n */\n function pauseTest() {\n let context = getContext();\n\n if (!context || typeof context.pauseTest !== 'function') {\n throw new Error('Cannot call `pauseTest` without having first called `setupTest` or `setupRenderingTest`.');\n }\n\n return context.pauseTest();\n }\n\n /**\n Resumes a test previously paused by `await pauseTest()`.\n \n @public\n */\n function resumeTest() {\n let context = getContext();\n\n if (!context || typeof context.resumeTest !== 'function') {\n throw new Error('Cannot call `resumeTest` without having first called `setupTest` or `setupRenderingTest`.');\n }\n\n context.resumeTest();\n }\n\n const CLEANUP = exports.CLEANUP = Object.create(null);\n\n /**\n Used by test framework addons to setup the provided context for testing.\n \n Responsible for:\n \n - sets the \"global testing context\" to the provided context (`setContext`)\n - create an owner object and set it on the provided context (e.g. `this.owner`)\n - setup `this.set`, `this.setProperties`, `this.get`, and `this.getProperties` to the provided context\n - setting up AJAX listeners\n - setting up `pauseTest` (also available as `this.pauseTest()`) and `resumeTest` helpers\n \n @public\n @param {Object} context the context to setup\n @param {Object} [options] options used to override defaults\n @param {Resolver} [options.resolver] a resolver to use for customizing normal resolution\n @returns {Promise<Object>} resolves with the context that was setup\n */\n});","define('@ember/test-helpers/setup-rendering-context', ['exports', '@ember/test-helpers/global', '@ember/test-helpers/setup-context', '@ember/test-helpers/-utils', '@ember/test-helpers/settled', '@ember/test-helpers/dom/get-root-element'], function (exports, _global, _setupContext, _utils, _settled, _getRootElement) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.RENDERING_CLEANUP = undefined;\n exports.render = render;\n exports.clearRender = clearRender;\n exports.default = setupRenderingContext;\n /* globals EmberENV */\n const RENDERING_CLEANUP = exports.RENDERING_CLEANUP = Object.create(null);\n const OUTLET_TEMPLATE = Ember.HTMLBars.template({\n \"id\": \"gc40spmP\",\n \"block\": \"{\\\"symbols\\\":[],\\\"statements\\\":[[1,[18,\\\"outlet\\\"],false]],\\\"hasEval\\\":false}\",\n \"meta\": {}\n });\n const EMPTY_TEMPLATE = Ember.HTMLBars.template({\n \"id\": \"xOcW61lH\",\n \"block\": \"{\\\"symbols\\\":[],\\\"statements\\\":[],\\\"hasEval\\\":false}\",\n \"meta\": {}\n });\n\n /**\n @private\n @param {Ember.ApplicationInstance} owner the current owner instance\n @returns {Template} a template representing {{outlet}}\n */\n function lookupOutletTemplate(owner) {\n let OutletTemplate = owner.lookup('template:-outlet');\n if (!OutletTemplate) {\n owner.register('template:-outlet', OUTLET_TEMPLATE);\n OutletTemplate = owner.lookup('template:-outlet');\n }\n\n return OutletTemplate;\n }\n\n /**\n @private\n @param {string} [selector] the selector to search for relative to element\n @returns {jQuery} a jQuery object representing the selector (or element itself if no selector)\n */\n function jQuerySelector(selector) {\n let { element } = (0, _setupContext.getContext)();\n\n // emulates Ember internal behavor of `this.$` in a component\n // https://github.com/emberjs/ember.js/blob/v2.5.1/packages/ember-views/lib/views/states/has_element.js#L18\n return selector ? _global.default.jQuery(selector, element) : _global.default.jQuery(element);\n }\n\n let templateId = 0;\n /**\n Renders the provided template and appends it to the DOM.\n \n @public\n @param {CompiledTemplate} template the template to render\n @returns {Promise<void>} resolves when settled\n */\n function render(template) {\n let context = (0, _setupContext.getContext)();\n\n if (!template) {\n throw new Error('you must pass a template to `render()`');\n }\n\n return (0, _utils.nextTickPromise)().then(() => {\n let { owner } = context;\n\n let toplevelView = owner.lookup('-top-level-view:main');\n let OutletTemplate = lookupOutletTemplate(owner);\n templateId += 1;\n let templateFullName = `template:-undertest-${templateId}`;\n owner.register(templateFullName, template);\n\n let outletState = {\n render: {\n owner,\n into: undefined,\n outlet: 'main',\n name: 'application',\n controller: undefined,\n ViewClass: undefined,\n template: OutletTemplate\n },\n\n outlets: {\n main: {\n render: {\n owner,\n into: undefined,\n outlet: 'main',\n name: 'index',\n controller: context,\n ViewClass: undefined,\n template: owner.lookup(templateFullName),\n outlets: {}\n },\n outlets: {}\n }\n }\n };\n toplevelView.setOutletState(outletState);\n\n // returning settled here because the actual rendering does not happen until\n // the renderer detects it is dirty (which happens on backburner's end\n // hook), see the following implementation details:\n //\n // * [view:outlet](https://github.com/emberjs/ember.js/blob/f94a4b6aef5b41b96ef2e481f35e07608df01440/packages/ember-glimmer/lib/views/outlet.js#L129-L145) manually dirties its own tag upon `setOutletState`\n // * [backburner's custom end hook](https://github.com/emberjs/ember.js/blob/f94a4b6aef5b41b96ef2e481f35e07608df01440/packages/ember-glimmer/lib/renderer.js#L145-L159) detects that the current revision of the root is no longer the latest, and triggers a new rendering transaction\n return (0, _settled.default)();\n });\n }\n\n /**\n Clears any templates previously rendered. This is commonly used for\n confirming behavior that is triggered by teardown (e.g.\n `willDestroyElement`).\n \n @public\n @returns {Promise<void>} resolves when settled\n */\n function clearRender() {\n let context = (0, _setupContext.getContext)();\n\n if (!context || typeof context.clearRender !== 'function') {\n throw new Error('Cannot call `clearRender` without having first called `setupRenderingContext`.');\n }\n\n return render(EMPTY_TEMPLATE);\n }\n\n /**\n Used by test framework addons to setup the provided context for rendering.\n \n `setupContext` must have been ran on the provided context\n prior to calling `setupRenderingContext`.\n \n Responsible for:\n \n - Setup the basic framework used for rendering by the\n `render` helper.\n - Ensuring the event dispatcher is properly setup.\n - Setting `this.element` to the root element of the testing\n container (things rendered via `render` will go _into_ this\n element).\n \n @public\n @param {Object} context the context to setup for rendering\n @returns {Promise<Object>} resolves with the context that was setup\n */\n function setupRenderingContext(context) {\n let contextGuid = Ember.guidFor(context);\n RENDERING_CLEANUP[contextGuid] = [];\n\n return (0, _utils.nextTickPromise)().then(() => {\n let { owner } = context;\n\n // these methods being placed on the context itself will be deprecated in\n // a future version (no giant rush) to remove some confusion about which\n // is the \"right\" way to things...\n context.render = render;\n context.clearRender = clearRender;\n\n if (_global.default.jQuery) {\n context.$ = jQuerySelector;\n }\n\n // When the host app uses `setApplication` (instead of `setResolver`) the event dispatcher has\n // already been setup via `applicationInstance.boot()` in `./build-owner`. If using\n // `setResolver` (instead of `setApplication`) a \"mock owner\" is created by extending\n // `Ember._ContainerProxyMixin` and `Ember._RegistryProxyMixin` in this scenario we need to\n // manually start the event dispatcher.\n if (owner._emberTestHelpersMockOwner) {\n let dispatcher = owner.lookup('event_dispatcher:main') || Ember.EventDispatcher.create();\n dispatcher.setup({}, '#ember-testing');\n }\n\n let OutletView = owner.factoryFor ? owner.factoryFor('view:-outlet') : owner._lookupFactory('view:-outlet');\n let toplevelView = OutletView.create();\n\n owner.register('-top-level-view:main', {\n create() {\n return toplevelView;\n }\n });\n\n // initially render a simple empty template\n return render(EMPTY_TEMPLATE).then(() => {\n Ember.run(toplevelView, 'appendTo', (0, _getRootElement.default)());\n\n return (0, _settled.default)();\n });\n }).then(() => {\n // ensure the element is based on the wrapping toplevel view\n // Ember still wraps the main application template with a\n // normal tagged view\n //\n // In older Ember versions (2.4) the element itself is not stable,\n // and therefore we cannot update the `this.element` until after the\n // rendering is completed\n if (EmberENV._APPLICATION_TEMPLATE_WRAPPER !== false) {\n context.element = (0, _getRootElement.default)().querySelector('.ember-view');\n } else {\n context.element = (0, _getRootElement.default)();\n }\n\n return context;\n });\n }\n});","define('@ember/test-helpers/teardown-application-context', ['exports', '@ember/test-helpers/settled'], function (exports, _settled) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n exports.default = function () {\n return (0, _settled.default)();\n };\n});","define('@ember/test-helpers/teardown-context', ['exports', '@ember/test-helpers/settled', '@ember/test-helpers/setup-context', '@ember/test-helpers/-utils'], function (exports, _settled, _setupContext, _utils) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = teardownContext;\n\n\n /**\n Used by test framework addons to tear down the provided context after testing is completed.\n \n Responsible for:\n \n - un-setting the \"global testing context\" (`unsetContext`)\n - destroy the contexts owner object\n - remove AJAX listeners\n \n @public\n @param {Object} context the context to setup\n @returns {Promise<void>} resolves when settled\n */\n function teardownContext(context) {\n return (0, _utils.nextTickPromise)().then(() => {\n let { owner } = context;\n\n (0, _settled._teardownAJAXHooks)();\n\n Ember.run(owner, 'destroy');\n Ember.testing = false;\n\n (0, _setupContext.unsetContext)();\n\n return (0, _settled.default)();\n }).finally(() => {\n let contextGuid = Ember.guidFor(context);\n\n (0, _utils.runDestroyablesFor)(_setupContext.CLEANUP, contextGuid);\n\n return (0, _settled.default)();\n });\n }\n});","define('@ember/test-helpers/teardown-rendering-context', ['exports', '@ember/test-helpers/setup-rendering-context', '@ember/test-helpers/-utils', '@ember/test-helpers/settled'], function (exports, _setupRenderingContext, _utils, _settled) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = teardownRenderingContext;\n\n\n /**\n Used by test framework addons to tear down the provided context after testing is completed.\n \n Responsible for:\n \n - resetting the `ember-testing-container` to its original state (the value\n when `setupRenderingContext` was called).\n \n @public\n @param {Object} context the context to setup\n @returns {Promise<void>} resolves when settled\n */\n function teardownRenderingContext(context) {\n return (0, _utils.nextTickPromise)().then(() => {\n let contextGuid = Ember.guidFor(context);\n\n (0, _utils.runDestroyablesFor)(_setupRenderingContext.RENDERING_CLEANUP, contextGuid);\n\n return (0, _settled.default)();\n });\n }\n});","define('@ember/test-helpers/validate-error-handler', ['exports'], function (exports) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = validateErrorHandler;\n\n const VALID = Object.freeze({ isValid: true, message: null });\n const INVALID = Object.freeze({\n isValid: false,\n message: 'error handler should have re-thrown the provided error'\n });\n\n /**\n * Validate the provided error handler to confirm that it properly re-throws\n * errors when `Ember.testing` is true.\n *\n * This is intended to be used by test framework hosts (or other libraries) to\n * ensure that `Ember.onerror` is properly configured. Without a check like\n * this, `Ember.onerror` could _easily_ swallow all errors and make it _seem_\n * like everything is just fine (and have green tests) when in reality\n * everything is on fire...\n *\n * @public\n * @param {Function} [callback=Ember.onerror] the callback to validate\n * @returns {Object} object with `isValid` and `message`\n *\n * @example <caption>Example implementation for `ember-qunit`</caption>\n *\n * import { validateErrorHandler } from '@ember/test-helpers';\n *\n * test('Ember.onerror is functioning properly', function(assert) {\n * let result = validateErrorHandler();\n * assert.ok(result.isValid, result.message);\n * });\n */\n function validateErrorHandler(callback = Ember.onerror) {\n if (callback === undefined || callback === null) {\n return VALID;\n }\n\n let error = new Error('Error handler validation error!');\n\n let originalEmberTesting = Ember.testing;\n Ember.testing = true;\n try {\n callback(error);\n } catch (e) {\n if (e === error) {\n return VALID;\n }\n } finally {\n Ember.testing = originalEmberTesting;\n }\n\n return INVALID;\n }\n});","define('@ember/test-helpers/wait-until', ['exports', '@ember/test-helpers/-utils'], function (exports, _utils) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = waitUntil;\n\n\n const TIMEOUTS = [0, 1, 2, 5, 7];\n const MAX_TIMEOUT = 10;\n\n /**\n Wait for the provided callback to return a truthy value.\n \n This does not leverage `settled()`, and as such can be used to manage async\n while _not_ settled (e.g. \"loading\" or \"pending\" states).\n \n @public\n @param {Function} callback the callback to use for testing when waiting should stop\n @param {Object} [options] options used to override defaults\n @param {number} [options.timeout=1000] the maximum amount of time to wait\n @returns {Promise} resolves with the callback value when it returns a truthy value\n */\n function waitUntil(callback, options = {}) {\n let timeout = 'timeout' in options ? options.timeout : 1000;\n\n // creating this error eagerly so it has the proper invocation stack\n let waitUntilTimedOut = new Error('waitUntil timed out');\n\n return new Ember.RSVP.Promise(function (resolve, reject) {\n let time = 0;\n\n // eslint-disable-next-line require-jsdoc\n function scheduleCheck(timeoutsIndex) {\n let interval = TIMEOUTS[timeoutsIndex];\n if (interval === undefined) {\n interval = MAX_TIMEOUT;\n }\n\n (0, _utils.futureTick)(function () {\n time += interval;\n\n let value;\n try {\n value = callback();\n } catch (error) {\n reject(error);\n }\n\n if (value) {\n resolve(value);\n } else if (time < timeout) {\n scheduleCheck(timeoutsIndex + 1);\n } else {\n reject(waitUntilTimedOut);\n }\n }, interval);\n }\n\n scheduleCheck(0);\n });\n }\n});","define('ember-cli-qunit', ['exports', 'ember-qunit'], function (exports, _emberQunit) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n Object.defineProperty(exports, 'TestLoader', {\n enumerable: true,\n get: function () {\n return _emberQunit.TestLoader;\n }\n });\n Object.defineProperty(exports, 'setupTestContainer', {\n enumerable: true,\n get: function () {\n return _emberQunit.setupTestContainer;\n }\n });\n Object.defineProperty(exports, 'loadTests', {\n enumerable: true,\n get: function () {\n return _emberQunit.loadTests;\n }\n });\n Object.defineProperty(exports, 'startTests', {\n enumerable: true,\n get: function () {\n return _emberQunit.startTests;\n }\n });\n Object.defineProperty(exports, 'setupTestAdapter', {\n enumerable: true,\n get: function () {\n return _emberQunit.setupTestAdapter;\n }\n });\n Object.defineProperty(exports, 'start', {\n enumerable: true,\n get: function () {\n return _emberQunit.start;\n }\n });\n});","define('ember-cli-test-loader/test-support/index', ['exports'], function (exports) {\n /* globals requirejs, require */\n \"use strict\";\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.addModuleIncludeMatcher = addModuleIncludeMatcher;\n exports.addModuleExcludeMatcher = addModuleExcludeMatcher;\n let moduleIncludeMatchers = [];\n let moduleExcludeMatchers = [];\n\n function addModuleIncludeMatcher(fn) {\n moduleIncludeMatchers.push(fn);\n }\n\n function addModuleExcludeMatcher(fn) {\n moduleExcludeMatchers.push(fn);\n }\n\n function checkMatchers(matchers, moduleName) {\n return matchers.some(matcher => matcher(moduleName));\n }\n\n class TestLoader {\n static load() {\n new TestLoader().loadModules();\n }\n\n constructor() {\n this._didLogMissingUnsee = false;\n }\n\n shouldLoadModule(moduleName) {\n return moduleName.match(/[-_]test$/);\n }\n\n listModules() {\n return Object.keys(requirejs.entries);\n }\n\n listTestModules() {\n let moduleNames = this.listModules();\n let testModules = [];\n let moduleName;\n\n for (let i = 0; i < moduleNames.length; i++) {\n moduleName = moduleNames[i];\n\n if (checkMatchers(moduleExcludeMatchers, moduleName)) {\n continue;\n }\n\n if (checkMatchers(moduleIncludeMatchers, moduleName) || this.shouldLoadModule(moduleName)) {\n testModules.push(moduleName);\n }\n }\n\n return testModules;\n }\n\n loadModules() {\n let testModules = this.listTestModules();\n let testModule;\n\n for (let i = 0; i < testModules.length; i++) {\n testModule = testModules[i];\n this.require(testModule);\n this.unsee(testModule);\n }\n }\n\n require(moduleName) {\n try {\n require(moduleName);\n } catch (e) {\n this.moduleLoadFailure(moduleName, e);\n }\n }\n\n unsee(moduleName) {\n if (typeof require.unsee === 'function') {\n require.unsee(moduleName);\n } else if (!this._didLogMissingUnsee) {\n this._didLogMissingUnsee = true;\n if (typeof console !== 'undefined') {\n console.warn('unable to require.unsee, please upgrade loader.js to >= v3.3.0');\n }\n }\n }\n\n moduleLoadFailure(moduleName, error) {\n console.error('Error loading: ' + moduleName, error.stack);\n }\n }exports.default = TestLoader;\n ;\n});","define('ember-qunit/adapter', ['exports', 'qunit', '@ember/test-helpers/has-ember-version'], function (exports, _qunit, _hasEmberVersion) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n\n function unhandledRejectionAssertion(current, error) {\n let message, source;\n\n if (typeof error === 'object' && error !== null) {\n message = error.message;\n source = error.stack;\n } else if (typeof error === 'string') {\n message = error;\n source = 'unknown source';\n } else {\n message = 'unhandledRejection occured, but it had no message';\n source = 'unknown source';\n }\n\n current.assert.pushResult({\n result: false,\n actual: false,\n expected: true,\n message: message,\n source: source\n });\n }\n\n let Adapter = Ember.Test.Adapter.extend({\n init() {\n this.doneCallbacks = [];\n },\n\n asyncStart() {\n this.doneCallbacks.push(_qunit.default.config.current ? _qunit.default.config.current.assert.async() : null);\n },\n\n asyncEnd() {\n let done = this.doneCallbacks.pop();\n // This can be null if asyncStart() was called outside of a test\n if (done) {\n done();\n }\n },\n\n // clobber default implementation of `exception` will be added back for Ember\n // < 2.17 just below...\n exception: null\n });\n\n // Ember 2.17 and higher do not require the test adapter to have an `exception`\n // method When `exception` is not present, the unhandled rejection is\n // automatically re-thrown and will therefore hit QUnit's own global error\n // handler (therefore appropriately causing test failure)\n if (!(0, _hasEmberVersion.default)(2, 17)) {\n Adapter = Adapter.extend({\n exception(error) {\n unhandledRejectionAssertion(_qunit.default.config.current, error);\n }\n });\n }\n\n exports.default = Adapter;\n});","define('ember-qunit/index', ['exports', 'ember-qunit/legacy-2-x/module-for', 'ember-qunit/legacy-2-x/module-for-component', 'ember-qunit/legacy-2-x/module-for-model', 'ember-qunit/adapter', 'qunit', 'ember-qunit/test-loader', '@ember/test-helpers'], function (exports, _moduleFor, _moduleForComponent, _moduleForModel, _adapter, _qunit, _testLoader, _testHelpers) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.loadTests = exports.todo = exports.only = exports.skip = exports.test = exports.module = exports.QUnitAdapter = exports.moduleForModel = exports.moduleForComponent = exports.moduleFor = undefined;\n Object.defineProperty(exports, 'moduleFor', {\n enumerable: true,\n get: function () {\n return _moduleFor.default;\n }\n });\n Object.defineProperty(exports, 'moduleForComponent', {\n enumerable: true,\n get: function () {\n return _moduleForComponent.default;\n }\n });\n Object.defineProperty(exports, 'moduleForModel', {\n enumerable: true,\n get: function () {\n return _moduleForModel.default;\n }\n });\n Object.defineProperty(exports, 'QUnitAdapter', {\n enumerable: true,\n get: function () {\n return _adapter.default;\n }\n });\n Object.defineProperty(exports, 'module', {\n enumerable: true,\n get: function () {\n return _qunit.module;\n }\n });\n Object.defineProperty(exports, 'test', {\n enumerable: true,\n get: function () {\n return _qunit.test;\n }\n });\n Object.defineProperty(exports, 'skip', {\n enumerable: true,\n get: function () {\n return _qunit.skip;\n }\n });\n Object.defineProperty(exports, 'only', {\n enumerable: true,\n get: function () {\n return _qunit.only;\n }\n });\n Object.defineProperty(exports, 'todo', {\n enumerable: true,\n get: function () {\n return _qunit.todo;\n }\n });\n Object.defineProperty(exports, 'loadTests', {\n enumerable: true,\n get: function () {\n return _testLoader.loadTests;\n }\n });\n exports.setResolver = setResolver;\n exports.render = render;\n exports.clearRender = clearRender;\n exports.settled = settled;\n exports.pauseTest = pauseTest;\n exports.resumeTest = resumeTest;\n exports.setupTest = setupTest;\n exports.setupRenderingTest = setupRenderingTest;\n exports.setupApplicationTest = setupApplicationTest;\n exports.setupTestContainer = setupTestContainer;\n exports.startTests = startTests;\n exports.setupTestAdapter = setupTestAdapter;\n exports.setupEmberTesting = setupEmberTesting;\n exports.setupEmberOnerrorValidation = setupEmberOnerrorValidation;\n exports.start = start;\n function setResolver() {\n (true && !(false) && Ember.deprecate('`setResolver` should be imported from `@ember/test-helpers`, but was imported from `ember-qunit`', false, {\n id: 'ember-qunit.deprecated-reexports.setResolver',\n until: '4.0.0'\n }));\n\n\n return (0, _testHelpers.setResolver)(...arguments);\n }\n\n function render() {\n (true && !(false) && Ember.deprecate('`render` should be imported from `@ember/test-helpers`, but was imported from `ember-qunit`', false, {\n id: 'ember-qunit.deprecated-reexports.render',\n until: '4.0.0'\n }));\n\n\n return (0, _testHelpers.render)(...arguments);\n }\n\n function clearRender() {\n (true && !(false) && Ember.deprecate('`clearRender` should be imported from `@ember/test-helpers`, but was imported from `ember-qunit`', false, {\n id: 'ember-qunit.deprecated-reexports.clearRender',\n until: '4.0.0'\n }));\n\n\n return (0, _testHelpers.clearRender)(...arguments);\n }\n\n function settled() {\n (true && !(false) && Ember.deprecate('`settled` should be imported from `@ember/test-helpers`, but was imported from `ember-qunit`', false, {\n id: 'ember-qunit.deprecated-reexports.settled',\n until: '4.0.0'\n }));\n\n\n return (0, _testHelpers.settled)(...arguments);\n }\n\n function pauseTest() {\n (true && !(false) && Ember.deprecate('`pauseTest` should be imported from `@ember/test-helpers`, but was imported from `ember-qunit`', false, {\n id: 'ember-qunit.deprecated-reexports.pauseTest',\n until: '4.0.0'\n }));\n\n\n return (0, _testHelpers.pauseTest)(...arguments);\n }\n\n function resumeTest() {\n (true && !(false) && Ember.deprecate('`resumeTest` should be imported from `@ember/test-helpers`, but was imported from `ember-qunit`', false, {\n id: 'ember-qunit.deprecated-reexports.resumeTest',\n until: '4.0.0'\n }));\n\n\n return (0, _testHelpers.resumeTest)(...arguments);\n }\n\n function setupTest(hooks, options) {\n hooks.beforeEach(function (assert) {\n return (0, _testHelpers.setupContext)(this, options).then(() => {\n let originalPauseTest = this.pauseTest;\n this.pauseTest = function QUnit_pauseTest() {\n assert.timeout(-1); // prevent the test from timing out\n\n return originalPauseTest.call(this);\n };\n });\n });\n\n hooks.afterEach(function () {\n return (0, _testHelpers.teardownContext)(this);\n });\n }\n\n function setupRenderingTest(hooks, options) {\n setupTest(hooks, options);\n\n hooks.beforeEach(function () {\n return (0, _testHelpers.setupRenderingContext)(this);\n });\n\n hooks.afterEach(function () {\n return (0, _testHelpers.teardownRenderingContext)(this);\n });\n }\n\n function setupApplicationTest(hooks, options) {\n setupTest(hooks, options);\n\n hooks.beforeEach(function () {\n return (0, _testHelpers.setupApplicationContext)(this);\n });\n\n hooks.afterEach(function () {\n return (0, _testHelpers.teardownApplicationContext)(this);\n });\n }\n\n /**\n Uses current URL configuration to setup the test container.\n \n * If `?nocontainer` is set, the test container will be hidden.\n * If `?dockcontainer` or `?devmode` are set the test container will be\n absolutely positioned.\n * If `?devmode` is set, the test container will be made full screen.\n \n @method setupTestContainer\n */\n function setupTestContainer() {\n let testContainer = document.getElementById('ember-testing-container');\n if (!testContainer) {\n return;\n }\n\n let params = _qunit.default.urlParams;\n\n let containerVisibility = params.nocontainer ? 'hidden' : 'visible';\n let containerPosition = params.dockcontainer || params.devmode ? 'fixed' : 'relative';\n\n if (params.devmode) {\n testContainer.className = ' full-screen';\n }\n\n testContainer.style.visibility = containerVisibility;\n testContainer.style.position = containerPosition;\n\n let qunitContainer = document.getElementById('qunit');\n if (params.dockcontainer) {\n qunitContainer.style.marginBottom = window.getComputedStyle(testContainer).height;\n }\n }\n\n /**\n Instruct QUnit to start the tests.\n @method startTests\n */\n function startTests() {\n _qunit.default.start();\n }\n\n /**\n Sets up the `Ember.Test` adapter for usage with QUnit 2.x.\n \n @method setupTestAdapter\n */\n function setupTestAdapter() {\n Ember.Test.adapter = _adapter.default.create();\n }\n\n /**\n Ensures that `Ember.testing` is set to `true` before each test begins\n (including `before` / `beforeEach`), and reset to `false` after each test is\n completed. This is done via `QUnit.testStart` and `QUnit.testDone`.\n \n */\n function setupEmberTesting() {\n _qunit.default.testStart(() => {\n Ember.testing = true;\n });\n\n _qunit.default.testDone(() => {\n Ember.testing = false;\n });\n }\n\n /**\n Ensures that `Ember.onerror` (if present) is properly configured to re-throw\n errors that occur while `Ember.testing` is `true`.\n */\n function setupEmberOnerrorValidation() {\n _qunit.default.module('ember-qunit: Ember.onerror validation', function () {\n _qunit.default.test('Ember.onerror is functioning properly', function (assert) {\n assert.expect(1);\n let result = (0, _testHelpers.validateErrorHandler)();\n assert.ok(result.isValid, `Ember.onerror handler with invalid testing behavior detected. An Ember.onerror handler _must_ rethrow exceptions when \\`Ember.testing\\` is \\`true\\` or the test suite is unreliable. See https://git.io/vbine for more details.`);\n });\n });\n }\n\n /**\n @method start\n @param {Object} [options] Options to be used for enabling/disabling behaviors\n @param {Boolean} [options.loadTests] If `false` tests will not be loaded automatically.\n @param {Boolean} [options.setupTestContainer] If `false` the test container will not\n be setup based on `devmode`, `dockcontainer`, or `nocontainer` URL params.\n @param {Boolean} [options.startTests] If `false` tests will not be automatically started\n (you must run `QUnit.start()` to kick them off).\n @param {Boolean} [options.setupTestAdapter] If `false` the default Ember.Test adapter will\n not be updated.\n @param {Boolean} [options.setupEmberTesting] `false` opts out of the\n default behavior of setting `Ember.testing` to `true` before all tests and\n back to `false` after each test will.\n @param {Boolean} [options.setupEmberOnerrorValidation] If `false` validation\n of `Ember.onerror` will be disabled.\n */\n function start(options = {}) {\n if (options.loadTests !== false) {\n (0, _testLoader.loadTests)();\n }\n\n if (options.setupTestContainer !== false) {\n setupTestContainer();\n }\n\n if (options.setupTestAdapter !== false) {\n setupTestAdapter();\n }\n\n if (options.setupEmberTesting !== false) {\n setupEmberTesting();\n }\n\n if (options.setupEmberOnerrorValidation !== false) {\n setupEmberOnerrorValidation();\n }\n\n if (options.startTests !== false) {\n startTests();\n }\n }\n});","define('ember-qunit/legacy-2-x/module-for-component', ['exports', 'ember-qunit/legacy-2-x/qunit-module', 'ember-test-helpers'], function (exports, _qunitModule, _emberTestHelpers) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = moduleForComponent;\n function moduleForComponent(name, description, callbacks) {\n (0, _qunitModule.createModule)(_emberTestHelpers.TestModuleForComponent, name, description, callbacks);\n }\n});","define('ember-qunit/legacy-2-x/module-for-model', ['exports', 'ember-qunit/legacy-2-x/qunit-module', 'ember-test-helpers'], function (exports, _qunitModule, _emberTestHelpers) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = moduleForModel;\n function moduleForModel(name, description, callbacks) {\n (0, _qunitModule.createModule)(_emberTestHelpers.TestModuleForModel, name, description, callbacks);\n }\n});","define('ember-qunit/legacy-2-x/module-for', ['exports', 'ember-qunit/legacy-2-x/qunit-module', 'ember-test-helpers'], function (exports, _qunitModule, _emberTestHelpers) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = moduleFor;\n function moduleFor(name, description, callbacks) {\n (0, _qunitModule.createModule)(_emberTestHelpers.TestModule, name, description, callbacks);\n }\n});","define('ember-qunit/legacy-2-x/qunit-module', ['exports', 'qunit'], function (exports, _qunit) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.createModule = createModule;\n\n\n function noop() {}\n\n function callbackFor(name, callbacks) {\n if (typeof callbacks !== 'object') {\n return noop;\n }\n if (!callbacks) {\n return noop;\n }\n\n var callback = noop;\n\n if (callbacks[name]) {\n callback = callbacks[name];\n delete callbacks[name];\n }\n\n return callback;\n }\n\n function createModule(Constructor, name, description, callbacks) {\n if (!callbacks && typeof description === 'object') {\n callbacks = description;\n description = name;\n }\n\n var before = callbackFor('before', callbacks);\n var beforeEach = callbackFor('beforeEach', callbacks);\n var afterEach = callbackFor('afterEach', callbacks);\n var after = callbackFor('after', callbacks);\n\n var module;\n var moduleName = typeof description === 'string' ? description : name;\n\n (0, _qunit.module)(moduleName, {\n before() {\n // storing this in closure scope to avoid exposing these\n // private internals to the test context\n module = new Constructor(name, description, callbacks);\n return before.apply(this, arguments);\n },\n\n beforeEach() {\n // provide the test context to the underlying module\n module.setContext(this);\n\n return module.setup(...arguments).then(() => {\n return beforeEach.apply(this, arguments);\n });\n },\n\n afterEach() {\n let result = afterEach.apply(this, arguments);\n return Ember.RSVP.resolve(result).then(() => module.teardown(...arguments));\n },\n\n after() {\n try {\n return after.apply(this, arguments);\n } finally {\n after = afterEach = before = beforeEach = callbacks = module = null;\n }\n }\n });\n }\n});","define('ember-qunit/test-loader', ['exports', 'qunit', 'ember-cli-test-loader/test-support/index'], function (exports, _qunit, _index) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.TestLoader = undefined;\n exports.loadTests = loadTests;\n\n\n (0, _index.addModuleExcludeMatcher)(function (moduleName) {\n return _qunit.default.urlParams.nolint && moduleName.match(/\\.(jshint|lint-test)$/);\n });\n\n (0, _index.addModuleIncludeMatcher)(function (moduleName) {\n return moduleName.match(/\\.jshint$/);\n });\n\n let moduleLoadFailures = [];\n\n _qunit.default.done(function () {\n if (moduleLoadFailures.length) {\n throw new Error('\\n' + moduleLoadFailures.join('\\n'));\n }\n });\n\n class TestLoader extends _index.default {\n moduleLoadFailure(moduleName, error) {\n moduleLoadFailures.push(error);\n\n _qunit.default.module('TestLoader Failures');\n _qunit.default.test(moduleName + ': could not be loaded', function () {\n throw error;\n });\n }\n }\n\n exports.TestLoader = TestLoader;\n /**\n Load tests following the default patterns:\n \n * The module name ends with `-test`\n * The module name ends with `.jshint`\n \n Excludes tests that match the following\n patterns when `?nolint` URL param is set:\n \n * The module name ends with `.jshint`\n * The module name ends with `-lint-test`\n \n @method loadTests\n */\n function loadTests() {\n new TestLoader().loadModules();\n }\n});","define('ember-test-helpers/has-ember-version', ['exports', '@ember/test-helpers/has-ember-version'], function (exports, _hasEmberVersion) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n Object.defineProperty(exports, 'default', {\n enumerable: true,\n get: function () {\n return _hasEmberVersion.default;\n }\n });\n});","define('ember-test-helpers/index', ['exports', '@ember/test-helpers', 'ember-test-helpers/legacy-0-6-x/test-module', 'ember-test-helpers/legacy-0-6-x/test-module-for-acceptance', 'ember-test-helpers/legacy-0-6-x/test-module-for-component', 'ember-test-helpers/legacy-0-6-x/test-module-for-model'], function (exports, _testHelpers, _testModule, _testModuleForAcceptance, _testModuleForComponent, _testModuleForModel) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n Object.keys(_testHelpers).forEach(function (key) {\n if (key === \"default\" || key === \"__esModule\") return;\n Object.defineProperty(exports, key, {\n enumerable: true,\n get: function () {\n return _testHelpers[key];\n }\n });\n });\n Object.defineProperty(exports, 'TestModule', {\n enumerable: true,\n get: function () {\n return _testModule.default;\n }\n });\n Object.defineProperty(exports, 'TestModuleForAcceptance', {\n enumerable: true,\n get: function () {\n return _testModuleForAcceptance.default;\n }\n });\n Object.defineProperty(exports, 'TestModuleForComponent', {\n enumerable: true,\n get: function () {\n return _testModuleForComponent.default;\n }\n });\n Object.defineProperty(exports, 'TestModuleForModel', {\n enumerable: true,\n get: function () {\n return _testModuleForModel.default;\n }\n });\n});","define('ember-test-helpers/legacy-0-6-x/-legacy-overrides', ['exports', 'ember-test-helpers/has-ember-version'], function (exports, _hasEmberVersion) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.preGlimmerSetupIntegrationForComponent = preGlimmerSetupIntegrationForComponent;\n function preGlimmerSetupIntegrationForComponent() {\n var module = this;\n var context = this.context;\n\n this.actionHooks = {};\n\n context.dispatcher = this.container.lookup('event_dispatcher:main') || Ember.EventDispatcher.create();\n context.dispatcher.setup({}, '#ember-testing');\n context.actions = module.actionHooks;\n\n (this.registry || this.container).register('component:-test-holder', Ember.Component.extend());\n\n context.render = function (template) {\n // in case `this.render` is called twice, make sure to teardown the first invocation\n module.teardownComponent();\n\n if (!template) {\n throw new Error('in a component integration test you must pass a template to `render()`');\n }\n if (Ember.isArray(template)) {\n template = template.join('');\n }\n if (typeof template === 'string') {\n template = Ember.Handlebars.compile(template);\n }\n module.component = module.container.lookupFactory('component:-test-holder').create({\n layout: template\n });\n\n module.component.set('context', context);\n module.component.set('controller', context);\n\n Ember.run(function () {\n module.component.appendTo('#ember-testing');\n });\n\n context._element = module.component.element;\n };\n\n context.$ = function () {\n return module.component.$.apply(module.component, arguments);\n };\n\n context.set = function (key, value) {\n var ret = Ember.run(function () {\n return Ember.set(context, key, value);\n });\n\n if ((0, _hasEmberVersion.default)(2, 0)) {\n return ret;\n }\n };\n\n context.setProperties = function (hash) {\n var ret = Ember.run(function () {\n return Ember.setProperties(context, hash);\n });\n\n if ((0, _hasEmberVersion.default)(2, 0)) {\n return ret;\n }\n };\n\n context.get = function (key) {\n return Ember.get(context, key);\n };\n\n context.getProperties = function () {\n var args = Array.prototype.slice.call(arguments);\n return Ember.getProperties(context, args);\n };\n\n context.on = function (actionName, handler) {\n module.actionHooks[actionName] = handler;\n };\n\n context.send = function (actionName) {\n var hook = module.actionHooks[actionName];\n if (!hook) {\n throw new Error('integration testing template received unexpected action ' + actionName);\n }\n hook.apply(module, Array.prototype.slice.call(arguments, 1));\n };\n\n context.clearRender = function () {\n module.teardownComponent();\n };\n }\n});","define('ember-test-helpers/legacy-0-6-x/abstract-test-module', ['exports', 'ember-test-helpers/legacy-0-6-x/ext/rsvp', '@ember/test-helpers/settled', '@ember/test-helpers'], function (exports, _rsvp, _settled, _testHelpers) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n\n // calling this `merge` here because we cannot\n // actually assume it is like `Object.assign`\n // with > 2 args\n const merge = Ember.assign || Ember.merge;\n\n exports.default = class {\n constructor(name, options) {\n this.context = undefined;\n this.name = name;\n this.callbacks = options || {};\n\n this.initSetupSteps();\n this.initTeardownSteps();\n }\n\n setup(assert) {\n Ember.testing = true;\n return this.invokeSteps(this.setupSteps, this, assert).then(() => {\n this.contextualizeCallbacks();\n return this.invokeSteps(this.contextualizedSetupSteps, this.context, assert);\n });\n }\n\n teardown(assert) {\n return this.invokeSteps(this.contextualizedTeardownSteps, this.context, assert).then(() => {\n return this.invokeSteps(this.teardownSteps, this, assert);\n }).then(() => {\n this.cache = null;\n this.cachedCalls = null;\n }).finally(function () {\n Ember.testing = false;\n });\n }\n\n initSetupSteps() {\n this.setupSteps = [];\n this.contextualizedSetupSteps = [];\n\n if (this.callbacks.beforeSetup) {\n this.setupSteps.push(this.callbacks.beforeSetup);\n delete this.callbacks.beforeSetup;\n }\n\n this.setupSteps.push(this.setupContext);\n this.setupSteps.push(this.setupTestElements);\n this.setupSteps.push(this.setupAJAXListeners);\n this.setupSteps.push(this.setupPromiseListeners);\n\n if (this.callbacks.setup) {\n this.contextualizedSetupSteps.push(this.callbacks.setup);\n delete this.callbacks.setup;\n }\n }\n\n invokeSteps(steps, context, assert) {\n steps = steps.slice();\n\n function nextStep() {\n var step = steps.shift();\n if (step) {\n // guard against exceptions, for example missing components referenced from needs.\n return new Ember.RSVP.Promise(resolve => {\n resolve(step.call(context, assert));\n }).then(nextStep);\n } else {\n return Ember.RSVP.resolve();\n }\n }\n return nextStep();\n }\n\n contextualizeCallbacks() {}\n\n initTeardownSteps() {\n this.teardownSteps = [];\n this.contextualizedTeardownSteps = [];\n\n if (this.callbacks.teardown) {\n this.contextualizedTeardownSteps.push(this.callbacks.teardown);\n delete this.callbacks.teardown;\n }\n\n this.teardownSteps.push(this.teardownContext);\n this.teardownSteps.push(this.teardownTestElements);\n this.teardownSteps.push(this.teardownAJAXListeners);\n this.teardownSteps.push(this.teardownPromiseListeners);\n\n if (this.callbacks.afterTeardown) {\n this.teardownSteps.push(this.callbacks.afterTeardown);\n delete this.callbacks.afterTeardown;\n }\n }\n\n setupTestElements() {\n let testElementContainer = document.querySelector('#ember-testing-container');\n if (!testElementContainer) {\n testElementContainer = document.createElement('div');\n testElementContainer.setAttribute('id', 'ember-testing-container');\n document.body.appendChild(testElementContainer);\n }\n\n let testEl = document.querySelector('#ember-testing');\n if (!testEl) {\n let element = document.createElement('div');\n element.setAttribute('id', 'ember-testing');\n\n testElementContainer.appendChild(element);\n this.fixtureResetValue = '';\n } else {\n this.fixtureResetValue = testElementContainer.innerHTML;\n }\n }\n\n setupContext(options) {\n let context = this.getContext();\n\n merge(context, {\n dispatcher: null,\n inject: {}\n });\n merge(context, options);\n\n this.setToString();\n (0, _testHelpers.setContext)(context);\n this.context = context;\n }\n\n setContext(context) {\n this.context = context;\n }\n\n getContext() {\n if (this.context) {\n return this.context;\n }\n\n return this.context = (0, _testHelpers.getContext)() || {};\n }\n\n setToString() {\n this.context.toString = () => {\n if (this.subjectName) {\n return `test context for: ${this.subjectName}`;\n }\n\n if (this.name) {\n return `test context for: ${this.name}`;\n }\n };\n }\n\n setupAJAXListeners() {\n (0, _settled._setupAJAXHooks)();\n }\n\n teardownAJAXListeners() {\n (0, _settled._teardownAJAXHooks)();\n }\n\n setupPromiseListeners() {\n (0, _rsvp._setupPromiseListeners)();\n }\n\n teardownPromiseListeners() {\n (0, _rsvp._teardownPromiseListeners)();\n }\n\n teardownTestElements() {\n document.getElementById('ember-testing-container').innerHTML = this.fixtureResetValue;\n\n // Ember 2.0.0 removed Ember.View as public API, so only do this when\n // Ember.View is present\n if (Ember.View && Ember.View.views) {\n Ember.View.views = {};\n }\n }\n\n teardownContext() {\n var context = this.context;\n this.context = undefined;\n (0, _testHelpers.unsetContext)();\n\n if (context && context.dispatcher && !context.dispatcher.isDestroyed) {\n Ember.run(function () {\n context.dispatcher.destroy();\n });\n }\n }\n };\n});","define('ember-test-helpers/legacy-0-6-x/build-registry', ['exports', 'require'], function (exports, _require2) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n exports.default = function (resolver) {\n var fallbackRegistry, registry, container;\n var namespace = Ember.Object.create({\n Resolver: {\n create() {\n return resolver;\n }\n }\n });\n\n function register(name, factory) {\n var thingToRegisterWith = registry || container;\n\n if (!(container.factoryFor ? container.factoryFor(name) : container.lookupFactory(name))) {\n thingToRegisterWith.register(name, factory);\n }\n }\n\n if (Ember.Application.buildRegistry) {\n fallbackRegistry = Ember.Application.buildRegistry(namespace);\n fallbackRegistry.register('component-lookup:main', Ember.ComponentLookup);\n\n registry = new Ember.Registry({\n fallback: fallbackRegistry\n });\n\n if (Ember.ApplicationInstance && Ember.ApplicationInstance.setupRegistry) {\n Ember.ApplicationInstance.setupRegistry(registry);\n }\n\n // these properties are set on the fallback registry by `buildRegistry`\n // and on the primary registry within the ApplicationInstance constructor\n // but we need to manually recreate them since ApplicationInstance's are not\n // exposed externally\n registry.normalizeFullName = fallbackRegistry.normalizeFullName;\n registry.makeToString = fallbackRegistry.makeToString;\n registry.describe = fallbackRegistry.describe;\n\n var owner = Owner.create({\n __registry__: registry,\n __container__: null\n });\n\n container = registry.container({ owner: owner });\n owner.__container__ = container;\n\n exposeRegistryMethodsWithoutDeprecations(container);\n } else {\n container = Ember.Application.buildContainer(namespace);\n container.register('component-lookup:main', Ember.ComponentLookup);\n }\n\n // Ember 1.10.0 did not properly add `view:toplevel` or `view:default`\n // to the registry in Ember.Application.buildRegistry :(\n //\n // Ember 2.0.0 removed Ember.View as public API, so only do this when\n // Ember.View is present\n if (Ember.View) {\n register('view:toplevel', Ember.View.extend());\n }\n\n // Ember 2.0.0 removed Ember._MetamorphView from the Ember global, so only\n // do this when present\n if (Ember._MetamorphView) {\n register('view:default', Ember._MetamorphView);\n }\n\n var globalContext = typeof global === 'object' && global || self;\n if (requirejs.entries['ember-data/setup-container']) {\n // ember-data is a proper ember-cli addon since 2.3; if no 'import\n // 'ember-data'' is present somewhere in the tests, there is also no `DS`\n // available on the globalContext and hence ember-data wouldn't be setup\n // correctly for the tests; that's why we import and call setupContainer\n // here; also see https://github.com/emberjs/data/issues/4071 for context\n var setupContainer = (0, _require2.default)('ember-data/setup-container')['default'];\n setupContainer(registry || container);\n } else if (globalContext.DS) {\n var DS = globalContext.DS;\n if (DS._setupContainer) {\n DS._setupContainer(registry || container);\n } else {\n register('transform:boolean', DS.BooleanTransform);\n register('transform:date', DS.DateTransform);\n register('transform:number', DS.NumberTransform);\n register('transform:string', DS.StringTransform);\n register('serializer:-default', DS.JSONSerializer);\n register('serializer:-rest', DS.RESTSerializer);\n register('adapter:-rest', DS.RESTAdapter);\n }\n }\n\n return {\n registry,\n container,\n owner\n };\n };\n\n /* globals global, self, requirejs */\n\n function exposeRegistryMethodsWithoutDeprecations(container) {\n var methods = ['register', 'unregister', 'resolve', 'normalize', 'typeInjection', 'injection', 'factoryInjection', 'factoryTypeInjection', 'has', 'options', 'optionsForType'];\n\n function exposeRegistryMethod(container, method) {\n if (method in container) {\n container[method] = function () {\n return container._registry[method].apply(container._registry, arguments);\n };\n }\n }\n\n for (var i = 0, l = methods.length; i < l; i++) {\n exposeRegistryMethod(container, methods[i]);\n }\n }\n\n var Owner = function () {\n if (Ember._RegistryProxyMixin && Ember._ContainerProxyMixin) {\n return Ember.Object.extend(Ember._RegistryProxyMixin, Ember._ContainerProxyMixin, {\n _emberTestHelpersMockOwner: true\n });\n }\n\n return Ember.Object.extend({\n _emberTestHelpersMockOwner: true\n });\n }();\n});","define('ember-test-helpers/legacy-0-6-x/ext/rsvp', ['exports'], function (exports) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports._setupPromiseListeners = _setupPromiseListeners;\n exports._teardownPromiseListeners = _teardownPromiseListeners;\n\n\n let originalAsync;\n\n /**\n Configures `RSVP` to resolve promises on the run-loop's action queue. This is\n done by Ember internally since Ember 1.7 and it is only needed to\n provide a consistent testing experience for users of Ember < 1.7.\n \n @private\n */\n function _setupPromiseListeners() {\n originalAsync = Ember.RSVP.configure('async');\n\n Ember.RSVP.configure('async', function (callback, promise) {\n Ember.run.backburner.schedule('actions', () => {\n callback(promise);\n });\n });\n }\n\n /**\n Resets `RSVP`'s `async` to its prior value.\n \n @private\n */\n function _teardownPromiseListeners() {\n Ember.RSVP.configure('async', originalAsync);\n }\n});","define('ember-test-helpers/legacy-0-6-x/test-module-for-acceptance', ['exports', 'ember-test-helpers/legacy-0-6-x/abstract-test-module', '@ember/test-helpers'], function (exports, _abstractTestModule, _testHelpers) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = class extends _abstractTestModule.default {\n setupContext() {\n super.setupContext({ application: this.createApplication() });\n }\n\n teardownContext() {\n Ember.run(() => {\n (0, _testHelpers.getContext)().application.destroy();\n });\n\n super.teardownContext();\n }\n\n createApplication() {\n let { Application, config } = this.callbacks;\n let application;\n\n Ember.run(() => {\n application = Application.create(config);\n application.setupForTesting();\n application.injectTestHelpers();\n });\n\n return application;\n }\n };\n});","define('ember-test-helpers/legacy-0-6-x/test-module-for-component', ['exports', 'ember-test-helpers/legacy-0-6-x/test-module', 'ember-test-helpers/has-ember-version', 'ember-test-helpers/legacy-0-6-x/-legacy-overrides'], function (exports, _testModule, _hasEmberVersion, _legacyOverrides) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.setupComponentIntegrationTest = setupComponentIntegrationTest;\n /* globals EmberENV */\n let ACTION_KEY;\n if ((0, _hasEmberVersion.default)(2, 0)) {\n ACTION_KEY = 'actions';\n } else {\n ACTION_KEY = '_actions';\n }\n\n const isPreGlimmer = !(0, _hasEmberVersion.default)(1, 13);\n\n exports.default = class extends _testModule.default {\n constructor(componentName, description, callbacks) {\n // Allow `description` to be omitted\n if (!callbacks && typeof description === 'object') {\n callbacks = description;\n description = null;\n } else if (!callbacks) {\n callbacks = {};\n }\n\n let integrationOption = callbacks.integration;\n let hasNeeds = Array.isArray(callbacks.needs);\n\n super('component:' + componentName, description, callbacks);\n\n this.componentName = componentName;\n\n if (hasNeeds || callbacks.unit || integrationOption === false) {\n this.isUnitTest = true;\n } else if (integrationOption) {\n this.isUnitTest = false;\n } else {\n Ember.deprecate('the component:' + componentName + ' test module is implicitly running in unit test mode, ' + 'which will change to integration test mode by default in an upcoming version of ' + 'ember-test-helpers. Add `unit: true` or a `needs:[]` list to explicitly opt in to unit ' + 'test mode.', false, {\n id: 'ember-test-helpers.test-module-for-component.test-type',\n until: '0.6.0'\n });\n this.isUnitTest = true;\n }\n\n if (!this.isUnitTest && !this.isLegacy) {\n callbacks.integration = true;\n }\n\n if (this.isUnitTest || this.isLegacy) {\n this.setupSteps.push(this.setupComponentUnitTest);\n } else {\n this.callbacks.subject = function () {\n throw new Error(\"component integration tests do not support `subject()`. Instead, render the component as if it were HTML: `this.render('<my-component foo=true>');`. For more information, read: http://guides.emberjs.com/v2.2.0/testing/testing-components/\");\n };\n this.setupSteps.push(this.setupComponentIntegrationTest);\n this.teardownSteps.unshift(this.teardownComponent);\n }\n\n if (Ember.View && Ember.View.views) {\n this.setupSteps.push(this._aliasViewRegistry);\n this.teardownSteps.unshift(this._resetViewRegistry);\n }\n }\n\n initIntegration(options) {\n this.isLegacy = options.integration === 'legacy';\n this.isIntegration = options.integration !== 'legacy';\n }\n\n _aliasViewRegistry() {\n this._originalGlobalViewRegistry = Ember.View.views;\n var viewRegistry = this.container.lookup('-view-registry:main');\n\n if (viewRegistry) {\n Ember.View.views = viewRegistry;\n }\n }\n\n _resetViewRegistry() {\n Ember.View.views = this._originalGlobalViewRegistry;\n }\n\n setupComponentUnitTest() {\n var _this = this;\n var resolver = this.resolver;\n var context = this.context;\n\n var layoutName = 'template:components/' + this.componentName;\n\n var layout = resolver.resolve(layoutName);\n\n var thingToRegisterWith = this.registry || this.container;\n if (layout) {\n thingToRegisterWith.register(layoutName, layout);\n thingToRegisterWith.injection(this.subjectName, 'layout', layoutName);\n }\n var eventDispatcher = resolver.resolve('event_dispatcher:main');\n if (eventDispatcher) {\n thingToRegisterWith.register('event_dispatcher:main', eventDispatcher);\n }\n\n context.dispatcher = this.container.lookup('event_dispatcher:main') || Ember.EventDispatcher.create();\n context.dispatcher.setup({}, '#ember-testing');\n\n context._element = null;\n\n this.callbacks.render = function () {\n var subject;\n\n Ember.run(function () {\n subject = context.subject();\n subject.appendTo('#ember-testing');\n });\n\n context._element = subject.element;\n\n _this.teardownSteps.unshift(function () {\n Ember.run(function () {\n Ember.tryInvoke(subject, 'destroy');\n });\n });\n };\n\n this.callbacks.append = function () {\n Ember.deprecate('this.append() is deprecated. Please use this.render() or this.$() instead.', false, {\n id: 'ember-test-helpers.test-module-for-component.append',\n until: '0.6.0'\n });\n return context.$();\n };\n\n context.$ = function () {\n this.render();\n var subject = this.subject();\n\n return subject.$.apply(subject, arguments);\n };\n }\n\n setupComponentIntegrationTest() {\n if (isPreGlimmer) {\n return _legacyOverrides.preGlimmerSetupIntegrationForComponent.apply(this, arguments);\n } else {\n return setupComponentIntegrationTest.apply(this, arguments);\n }\n }\n\n setupContext() {\n super.setupContext();\n\n // only setup the injection if we are running against a version\n // of Ember that has `-view-registry:main` (Ember >= 1.12)\n if (this.container.factoryFor ? this.container.factoryFor('-view-registry:main') : this.container.lookupFactory('-view-registry:main')) {\n (this.registry || this.container).injection('component', '_viewRegistry', '-view-registry:main');\n }\n\n if (!this.isUnitTest && !this.isLegacy) {\n this.context.factory = function () {};\n }\n }\n\n teardownComponent() {\n var component = this.component;\n if (component) {\n Ember.run(component, 'destroy');\n this.component = null;\n }\n }\n };\n function setupComponentIntegrationTest() {\n var module = this;\n var context = this.context;\n\n this.actionHooks = context[ACTION_KEY] = {};\n context.dispatcher = this.container.lookup('event_dispatcher:main') || Ember.EventDispatcher.create();\n context.dispatcher.setup({}, '#ember-testing');\n\n var hasRendered = false;\n var OutletView = module.container.factoryFor ? module.container.factoryFor('view:-outlet') : module.container.lookupFactory('view:-outlet');\n var OutletTemplate = module.container.lookup('template:-outlet');\n var toplevelView = module.component = OutletView.create();\n var hasOutletTemplate = !!OutletTemplate;\n var outletState = {\n render: {\n owner: Ember.getOwner ? Ember.getOwner(module.container) : undefined,\n into: undefined,\n outlet: 'main',\n name: 'application',\n controller: module.context,\n ViewClass: undefined,\n template: OutletTemplate\n },\n\n outlets: {}\n };\n\n var element = document.getElementById('ember-testing');\n var templateId = 0;\n\n if (hasOutletTemplate) {\n Ember.run(() => {\n toplevelView.setOutletState(outletState);\n });\n }\n\n context.render = function (template) {\n if (!template) {\n throw new Error('in a component integration test you must pass a template to `render()`');\n }\n if (Ember.isArray(template)) {\n template = template.join('');\n }\n if (typeof template === 'string') {\n template = Ember.Handlebars.compile(template);\n }\n\n var templateFullName = 'template:-undertest-' + ++templateId;\n this.registry.register(templateFullName, template);\n var stateToRender = {\n owner: Ember.getOwner ? Ember.getOwner(module.container) : undefined,\n into: undefined,\n outlet: 'main',\n name: 'index',\n controller: module.context,\n ViewClass: undefined,\n template: module.container.lookup(templateFullName),\n outlets: {}\n };\n\n if (hasOutletTemplate) {\n stateToRender.name = 'index';\n outletState.outlets.main = { render: stateToRender, outlets: {} };\n } else {\n stateToRender.name = 'application';\n outletState = { render: stateToRender, outlets: {} };\n }\n\n Ember.run(() => {\n toplevelView.setOutletState(outletState);\n });\n\n if (!hasRendered) {\n Ember.run(module.component, 'appendTo', '#ember-testing');\n hasRendered = true;\n }\n\n if (EmberENV._APPLICATION_TEMPLATE_WRAPPER !== false) {\n // ensure the element is based on the wrapping toplevel view\n // Ember still wraps the main application template with a\n // normal tagged view\n context._element = element = document.querySelector('#ember-testing > .ember-view');\n } else {\n context._element = element = document.querySelector('#ember-testing');\n }\n };\n\n context.$ = function (selector) {\n // emulates Ember internal behavor of `this.$` in a component\n // https://github.com/emberjs/ember.js/blob/v2.5.1/packages/ember-views/lib/views/states/has_element.js#L18\n return selector ? Ember.$(selector, element) : Ember.$(element);\n };\n\n context.set = function (key, value) {\n var ret = Ember.run(function () {\n return Ember.set(context, key, value);\n });\n\n if ((0, _hasEmberVersion.default)(2, 0)) {\n return ret;\n }\n };\n\n context.setProperties = function (hash) {\n var ret = Ember.run(function () {\n return Ember.setProperties(context, hash);\n });\n\n if ((0, _hasEmberVersion.default)(2, 0)) {\n return ret;\n }\n };\n\n context.get = function (key) {\n return Ember.get(context, key);\n };\n\n context.getProperties = function () {\n var args = Array.prototype.slice.call(arguments);\n return Ember.getProperties(context, args);\n };\n\n context.on = function (actionName, handler) {\n module.actionHooks[actionName] = handler;\n };\n\n context.send = function (actionName) {\n var hook = module.actionHooks[actionName];\n if (!hook) {\n throw new Error('integration testing template received unexpected action ' + actionName);\n }\n hook.apply(module.context, Array.prototype.slice.call(arguments, 1));\n };\n\n context.clearRender = function () {\n Ember.run(function () {\n toplevelView.setOutletState({\n render: {\n owner: module.container,\n into: undefined,\n outlet: 'main',\n name: 'application',\n controller: module.context,\n ViewClass: undefined,\n template: undefined\n },\n outlets: {}\n });\n });\n };\n }\n});","define('ember-test-helpers/legacy-0-6-x/test-module-for-model', ['exports', 'require', 'ember-test-helpers/legacy-0-6-x/test-module'], function (exports, _require2, _testModule) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = class extends _testModule.default {\n constructor(modelName, description, callbacks) {\n super('model:' + modelName, description, callbacks);\n\n this.modelName = modelName;\n\n this.setupSteps.push(this.setupModel);\n }\n\n setupModel() {\n var container = this.container;\n var defaultSubject = this.defaultSubject;\n var callbacks = this.callbacks;\n var modelName = this.modelName;\n\n var adapterFactory = container.factoryFor ? container.factoryFor('adapter:application') : container.lookupFactory('adapter:application');\n if (!adapterFactory) {\n if (requirejs.entries['ember-data/adapters/json-api']) {\n adapterFactory = (0, _require2.default)('ember-data/adapters/json-api')['default'];\n }\n\n // when ember-data/adapters/json-api is provided via ember-cli shims\n // using Ember Data 1.x the actual JSONAPIAdapter isn't found, but the\n // above require statement returns a bizzaro object with only a `default`\n // property (circular reference actually)\n if (!adapterFactory || !adapterFactory.create) {\n adapterFactory = DS.JSONAPIAdapter || DS.FixtureAdapter;\n }\n\n var thingToRegisterWith = this.registry || this.container;\n thingToRegisterWith.register('adapter:application', adapterFactory);\n }\n\n callbacks.store = function () {\n var container = this.container;\n return container.lookup('service:store') || container.lookup('store:main');\n };\n\n if (callbacks.subject === defaultSubject) {\n callbacks.subject = function (options) {\n var container = this.container;\n\n return Ember.run(function () {\n var store = container.lookup('service:store') || container.lookup('store:main');\n return store.createRecord(modelName, options);\n });\n };\n }\n }\n };\n});","define('ember-test-helpers/legacy-0-6-x/test-module', ['exports', 'ember-test-helpers/legacy-0-6-x/abstract-test-module', '@ember/test-helpers', 'ember-test-helpers/legacy-0-6-x/build-registry', '@ember/test-helpers/has-ember-version'], function (exports, _abstractTestModule, _testHelpers, _buildRegistry, _hasEmberVersion) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = class extends _abstractTestModule.default {\n constructor(subjectName, description, callbacks) {\n // Allow `description` to be omitted, in which case it should\n // default to `subjectName`\n if (!callbacks && typeof description === 'object') {\n callbacks = description;\n description = subjectName;\n }\n\n super(description || subjectName, callbacks);\n\n this.subjectName = subjectName;\n this.description = description || subjectName;\n this.resolver = this.callbacks.resolver || (0, _testHelpers.getResolver)();\n\n if (this.callbacks.integration && this.callbacks.needs) {\n throw new Error(\"cannot declare 'integration: true' and 'needs' in the same module\");\n }\n\n if (this.callbacks.integration) {\n this.initIntegration(callbacks);\n delete callbacks.integration;\n }\n\n this.initSubject();\n this.initNeeds();\n }\n\n initIntegration(options) {\n if (options.integration === 'legacy') {\n throw new Error(\"`integration: 'legacy'` is only valid for component tests.\");\n }\n this.isIntegration = true;\n }\n\n initSubject() {\n this.callbacks.subject = this.callbacks.subject || this.defaultSubject;\n }\n\n initNeeds() {\n this.needs = [this.subjectName];\n if (this.callbacks.needs) {\n this.needs = this.needs.concat(this.callbacks.needs);\n delete this.callbacks.needs;\n }\n }\n\n initSetupSteps() {\n this.setupSteps = [];\n this.contextualizedSetupSteps = [];\n\n if (this.callbacks.beforeSetup) {\n this.setupSteps.push(this.callbacks.beforeSetup);\n delete this.callbacks.beforeSetup;\n }\n\n this.setupSteps.push(this.setupContainer);\n this.setupSteps.push(this.setupContext);\n this.setupSteps.push(this.setupTestElements);\n this.setupSteps.push(this.setupAJAXListeners);\n this.setupSteps.push(this.setupPromiseListeners);\n\n if (this.callbacks.setup) {\n this.contextualizedSetupSteps.push(this.callbacks.setup);\n delete this.callbacks.setup;\n }\n }\n\n initTeardownSteps() {\n this.teardownSteps = [];\n this.contextualizedTeardownSteps = [];\n\n if (this.callbacks.teardown) {\n this.contextualizedTeardownSteps.push(this.callbacks.teardown);\n delete this.callbacks.teardown;\n }\n\n this.teardownSteps.push(this.teardownSubject);\n this.teardownSteps.push(this.teardownContainer);\n this.teardownSteps.push(this.teardownContext);\n this.teardownSteps.push(this.teardownTestElements);\n this.teardownSteps.push(this.teardownAJAXListeners);\n this.teardownSteps.push(this.teardownPromiseListeners);\n\n if (this.callbacks.afterTeardown) {\n this.teardownSteps.push(this.callbacks.afterTeardown);\n delete this.callbacks.afterTeardown;\n }\n }\n\n setupContainer() {\n if (this.isIntegration || this.isLegacy) {\n this._setupIntegratedContainer();\n } else {\n this._setupIsolatedContainer();\n }\n }\n\n setupContext() {\n var subjectName = this.subjectName;\n var container = this.container;\n\n var factory = function () {\n return container.factoryFor ? container.factoryFor(subjectName) : container.lookupFactory(subjectName);\n };\n\n super.setupContext({\n container: this.container,\n registry: this.registry,\n factory: factory,\n register() {\n var target = this.registry || this.container;\n return target.register.apply(target, arguments);\n }\n });\n\n if (Ember.setOwner) {\n Ember.setOwner(this.context, this.container.owner);\n }\n\n this.setupInject();\n }\n\n setupInject() {\n var module = this;\n var context = this.context;\n\n if (Ember.inject) {\n var keys = (Object.keys || keys)(Ember.inject);\n\n keys.forEach(function (typeName) {\n context.inject[typeName] = function (name, opts) {\n var alias = opts && opts.as || name;\n Ember.run(function () {\n Ember.set(context, alias, module.container.lookup(typeName + ':' + name));\n });\n };\n });\n }\n }\n\n teardownSubject() {\n var subject = this.cache.subject;\n\n if (subject) {\n Ember.run(function () {\n Ember.tryInvoke(subject, 'destroy');\n });\n }\n }\n\n teardownContainer() {\n var container = this.container;\n Ember.run(function () {\n container.destroy();\n });\n }\n\n defaultSubject(options, factory) {\n return factory.create(options);\n }\n\n // allow arbitrary named factories, like rspec let\n contextualizeCallbacks() {\n var callbacks = this.callbacks;\n var context = this.context;\n\n this.cache = this.cache || {};\n this.cachedCalls = this.cachedCalls || {};\n\n var keys = (Object.keys || keys)(callbacks);\n var keysLength = keys.length;\n\n if (keysLength) {\n var deprecatedContext = this._buildDeprecatedContext(this, context);\n for (var i = 0; i < keysLength; i++) {\n this._contextualizeCallback(context, keys[i], deprecatedContext);\n }\n }\n }\n\n _contextualizeCallback(context, key, callbackContext) {\n var _this = this;\n var callbacks = this.callbacks;\n var factory = context.factory;\n\n context[key] = function (options) {\n if (_this.cachedCalls[key]) {\n return _this.cache[key];\n }\n\n var result = callbacks[key].call(callbackContext, options, factory());\n\n _this.cache[key] = result;\n _this.cachedCalls[key] = true;\n\n return result;\n };\n }\n\n /*\n Builds a version of the passed in context that contains deprecation warnings\n for accessing properties that exist on the module.\n */\n _buildDeprecatedContext(module, context) {\n var deprecatedContext = Object.create(context);\n\n var keysForDeprecation = Object.keys(module);\n\n for (var i = 0, l = keysForDeprecation.length; i < l; i++) {\n this._proxyDeprecation(module, deprecatedContext, keysForDeprecation[i]);\n }\n\n return deprecatedContext;\n }\n\n /*\n Defines a key on an object to act as a proxy for deprecating the original.\n */\n _proxyDeprecation(obj, proxy, key) {\n if (typeof proxy[key] === 'undefined') {\n Object.defineProperty(proxy, key, {\n get() {\n Ember.deprecate('Accessing the test module property \"' + key + '\" from a callback is deprecated.', false, {\n id: 'ember-test-helpers.test-module.callback-context',\n until: '0.6.0'\n });\n return obj[key];\n }\n });\n }\n }\n\n _setupContainer(isolated) {\n var resolver = this.resolver;\n\n var items = (0, _buildRegistry.default)(!isolated ? resolver : Object.create(resolver, {\n resolve: {\n value() {}\n }\n }));\n\n this.container = items.container;\n this.registry = items.registry;\n\n if ((0, _hasEmberVersion.default)(1, 13)) {\n var thingToRegisterWith = this.registry || this.container;\n var router = resolver.resolve('router:main');\n router = router || Ember.Router.extend();\n thingToRegisterWith.register('router:main', router);\n }\n }\n\n _setupIsolatedContainer() {\n var resolver = this.resolver;\n this._setupContainer(true);\n\n var thingToRegisterWith = this.registry || this.container;\n\n for (var i = this.needs.length; i > 0; i--) {\n var fullName = this.needs[i - 1];\n var normalizedFullName = resolver.normalize(fullName);\n thingToRegisterWith.register(fullName, resolver.resolve(normalizedFullName));\n }\n\n if (!this.registry) {\n this.container.resolver = function () {};\n }\n }\n\n _setupIntegratedContainer() {\n this._setupContainer();\n }\n };\n});","define('ember-test-helpers/wait', ['exports', '@ember/test-helpers/settled', '@ember/test-helpers'], function (exports, _settled, _testHelpers) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports._teardownPromiseListeners = exports._teardownAJAXHooks = exports._setupPromiseListeners = exports._setupAJAXHooks = undefined;\n Object.defineProperty(exports, '_setupAJAXHooks', {\n enumerable: true,\n get: function () {\n return _settled._setupAJAXHooks;\n }\n });\n Object.defineProperty(exports, '_setupPromiseListeners', {\n enumerable: true,\n get: function () {\n return _settled._setupPromiseListeners;\n }\n });\n Object.defineProperty(exports, '_teardownAJAXHooks', {\n enumerable: true,\n get: function () {\n return _settled._teardownAJAXHooks;\n }\n });\n Object.defineProperty(exports, '_teardownPromiseListeners', {\n enumerable: true,\n get: function () {\n return _settled._teardownPromiseListeners;\n }\n });\n exports.default = wait;\n\n\n /**\n Returns a promise that resolves when in a settled state (see `isSettled` for\n a definition of \"settled state\").\n \n @private\n @deprecated\n @param {Object} [options={}] the options to be used for waiting\n @param {boolean} [options.waitForTimers=true] should timers be waited upon\n @param {boolean} [options.waitForAjax=true] should $.ajax requests be waited upon\n @param {boolean} [options.waitForWaiters=true] should test waiters be waited upon\n @returns {Promise<void>} resolves when settled\n */\n function wait(options = {}) {\n if (typeof options !== 'object' || options === null) {\n options = {};\n }\n\n return (0, _testHelpers.waitUntil)(() => {\n let waitForTimers = 'waitForTimers' in options ? options.waitForTimers : true;\n let waitForAJAX = 'waitForAJAX' in options ? options.waitForAJAX : true;\n let waitForWaiters = 'waitForWaiters' in options ? options.waitForWaiters : true;\n\n let {\n hasPendingTimers,\n hasRunLoop,\n hasPendingRequests,\n hasPendingWaiters\n } = (0, _testHelpers.getSettledState)();\n\n if (waitForTimers && (hasPendingTimers || hasRunLoop)) {\n return false;\n }\n\n if (waitForAJAX && hasPendingRequests) {\n return false;\n }\n\n if (waitForWaiters && hasPendingWaiters) {\n return false;\n }\n\n return true;\n }, { timeout: Infinity });\n }\n});","define(\"qunit/index\", [\"exports\"], function (exports) {\n \"use strict\";\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n /* globals QUnit */\n\n var _module = QUnit.module;\n exports.module = _module;\n var test = exports.test = QUnit.test;\n var skip = exports.skip = QUnit.skip;\n var only = exports.only = QUnit.only;\n var todo = exports.todo = QUnit.todo;\n\n exports.default = QUnit;\n});","runningTests = true;\n\nif (window.Testem) {\n window.Testem.hookIntoTestFramework();\n}\n\n\n"],"names":[],"mappings":"AAAA;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5UA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACllKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;","file":"test-support.js"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/tests.js b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/tests.js
new file mode 100644
index 0000000000..3843eebfa8
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/tests.js
@@ -0,0 +1,62 @@
+'use strict';
+
+define('quickstart/tests/app.lint-test', [], function () {
+ 'use strict';
+
+ QUnit.module('ESLint | app');
+
+ QUnit.test('app.js', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'app.js should pass ESLint\n\n');
+ });
+
+ QUnit.test('resolver.js', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'resolver.js should pass ESLint\n\n');
+ });
+
+ QUnit.test('router.js', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'router.js should pass ESLint\n\n');
+ });
+});
+define('quickstart/tests/test-helper', ['quickstart/app', 'quickstart/config/environment', '@ember/test-helpers', 'ember-qunit'], function (_app, _environment, _testHelpers, _emberQunit) {
+ 'use strict';
+
+ (0, _testHelpers.setApplication)(_app.default.create(_environment.default.APP));
+
+ (0, _emberQunit.start)();
+});
+
+define('quickstart/tests/tests.lint-test', [], function () {
+ 'use strict';
+
+ QUnit.module('ESLint | tests');
+
+ QUnit.test('test-helper.js', function (assert) {
+ assert.expect(1);
+ assert.ok(true, 'test-helper.js should pass ESLint\n\n');
+ });
+});
+define('quickstart/config/environment', [], function() {
+ var prefix = 'quickstart';
+try {
+ var metaName = prefix + '/config/environment';
+ var rawConfig = document.querySelector('meta[name="' + metaName + '"]').getAttribute('content');
+ var config = JSON.parse(unescape(rawConfig));
+
+ var exports = { 'default': config };
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+
+ return exports;
+}
+catch(err) {
+ throw new Error('Could not read config from meta tag with name "' + metaName + '".');
+}
+
+});
+
+require('quickstart/tests/test-helper');
+EmberENV.TESTS_FILE_LOADED = true;
+//# sourceMappingURL=tests.map
diff --git a/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/tests.map b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/tests.map
new file mode 100644
index 0000000000..dbfe1e9fc2
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/tests.map
@@ -0,0 +1 @@
+{"version":3,"sources":["vendor/ember-cli/tests-prefix.js","quickstart/tests/app.lint-test.js","quickstart/tests/test-helper.js","quickstart/tests/tests.lint-test.js","vendor/ember-cli/app-config.js","vendor/ember-cli/tests-suffix.js"],"sourcesContent":["'use strict';\n","define('quickstart/tests/app.lint-test', [], function () {\n 'use strict';\n\n QUnit.module('ESLint | app');\n\n QUnit.test('app.js', function (assert) {\n assert.expect(1);\n assert.ok(true, 'app.js should pass ESLint\\n\\n');\n });\n\n QUnit.test('resolver.js', function (assert) {\n assert.expect(1);\n assert.ok(true, 'resolver.js should pass ESLint\\n\\n');\n });\n\n QUnit.test('router.js', function (assert) {\n assert.expect(1);\n assert.ok(true, 'router.js should pass ESLint\\n\\n');\n });\n});","import Application from '../app';\nimport config from '../config/environment';\nimport { setApplication } from '@ember/test-helpers';\nimport { start } from 'ember-qunit';\n\nsetApplication(Application.create(config.APP));\n\nstart();\n","define('quickstart/tests/tests.lint-test', [], function () {\n 'use strict';\n\n QUnit.module('ESLint | tests');\n\n QUnit.test('test-helper.js', function (assert) {\n assert.expect(1);\n assert.ok(true, 'test-helper.js should pass ESLint\\n\\n');\n });\n});","define('quickstart/config/environment', [], function() {\n var prefix = 'quickstart';\ntry {\n var metaName = prefix + '/config/environment';\n var rawConfig = document.querySelector('meta[name=\"' + metaName + '\"]').getAttribute('content');\n var config = JSON.parse(unescape(rawConfig));\n\n var exports = { 'default': config };\n\n Object.defineProperty(exports, '__esModule', { value: true });\n\n return exports;\n}\ncatch(err) {\n throw new Error('Could not read config from meta tag with name \"' + metaName + '\".');\n}\n\n});\n","require('quickstart/tests/test-helper');\nEmberENV.TESTS_FILE_LOADED = true;\n"],"names":["create","APP"],"mappings":"AAAA;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;ACbA,mCAAe,aAAYA,MAAZ,CAAmB,qBAAOC,GAA1B,CAAf;;AAEA;;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;","file":"tests.js"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/vendor.css b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/vendor.css
new file mode 100644
index 0000000000..abac03bcdd
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/vendor.css
@@ -0,0 +1,97 @@
+#ember-welcome-page-id-selector {
+ padding: 2em;
+ box-shadow: 0 0 0px 10px #FFFBF5;
+ font-family: "Helvetica Neue", "Helvetica", "Roboto", "Arial", sans-serif;
+ font-size: 16px;
+ line-height: 1.35em;
+ background: #FFFBF5;
+ color: #865931;
+ height: 100vh;
+}
+#ember-welcome-page-id-selector img {
+ max-width: 100%;
+}
+#ember-welcome-page-id-selector p {
+ margin: 0 0 .75em;
+}
+#ember-welcome-page-id-selector h2 {
+ color: #dd6a58;
+ margin-top: 1em;
+ font-size: 1.75em;
+ line-height: 1.2
+}
+#ember-welcome-page-id-selector a:link,
+#ember-welcome-page-id-selector a:visited {
+ color: #dd6a58;
+ text-decoration: none;
+}
+#ember-welcome-page-id-selector a:hover,
+#ember-welcome-page-id-selector a:active {
+ color: #c13c27;
+}
+#ember-welcome-page-id-selector .tomster {
+ flex: 2;
+}
+#ember-welcome-page-id-selector .welcome {
+ flex: 3;
+}
+#ember-welcome-page-id-selector .columns {
+ display: flex;
+ max-width: 960px;
+ margin: 0 auto;
+}
+#ember-welcome-page-id-selector .welcome ol {
+ list-style: disc;
+ padding-left: 2em;
+ margin-bottom: .75em;
+}
+#ember-welcome-page-id-selector .welcome > ol > li {
+ padding-bottom: .5em;
+}
+#ember-welcome-page-id-selector .postscript {
+ clear: both;
+ text-align: center;
+ padding-top: 3em;
+ font-size: 14px;
+ color: #888;
+ font-style: italic;
+ line-height: 2;
+}
+#ember-welcome-page-id-selector .postscript code {
+ background-color: #F8E7CF;
+ border-radius: 3px;
+ font-family: Menlo, Courier, monospace;
+ font-size: 0.9em;
+ padding: 0.2em 0.5em;
+ margin: 0 0.1em;
+}
+@media (max-width: 700px) {
+ #ember-welcome-page-id-selector {
+ padding: 1em;
+ }
+ #ember-welcome-page-id-selector .columns {
+ flex-direction: column;
+ }
+ #ember-welcome-page-id-selector .welcome,
+ #ember-welcome-page-id-selector .tomster {
+ }
+ #ember-welcome-page-id-selector .tomster img {
+ width: 50%;
+ margin: auto;
+ display: block;
+ }
+ #ember-welcome-page-id-selector h2 {
+ text-align: center;
+ }
+}
+@media (max-width: 400px) {
+ #ember-welcome-page-id-selector .tomster img {
+ width: 60%;
+ }
+ #ember-welcome-page-id-selector .welcome,
+ #ember-welcome-page-id-selector .tomster {
+ width: 100%;
+ float: none;
+ margin: auto;
+ }
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/vendor.js b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/vendor.js
new file mode 100644
index 0000000000..59c9988960
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/vendor.js
@@ -0,0 +1,86407 @@
+window.EmberENV = {"FEATURES":{},"EXTEND_PROTOTYPES":{"Date":false}};
+var runningTests = false;
+
+
+
+;var loader, define, requireModule, require, requirejs;
+
+(function (global) {
+ 'use strict';
+
+ function dict() {
+ var obj = Object.create(null);
+ obj['__'] = undefined;
+ delete obj['__'];
+ return obj;
+ }
+
+ // Save off the original values of these globals, so we can restore them if someone asks us to
+ var oldGlobals = {
+ loader: loader,
+ define: define,
+ requireModule: requireModule,
+ require: require,
+ requirejs: requirejs
+ };
+
+ requirejs = require = requireModule = function (id) {
+ var pending = [];
+ var mod = findModule(id, '(require)', pending);
+
+ for (var i = pending.length - 1; i >= 0; i--) {
+ pending[i].exports();
+ }
+
+ return mod.module.exports;
+ };
+
+ loader = {
+ noConflict: function (aliases) {
+ var oldName, newName;
+
+ for (oldName in aliases) {
+ if (aliases.hasOwnProperty(oldName)) {
+ if (oldGlobals.hasOwnProperty(oldName)) {
+ newName = aliases[oldName];
+
+ global[newName] = global[oldName];
+ global[oldName] = oldGlobals[oldName];
+ }
+ }
+ }
+ },
+ // Option to enable or disable the generation of default exports
+ makeDefaultExport: true
+ };
+
+ var registry = dict();
+ var seen = dict();
+
+ var uuid = 0;
+
+ function unsupportedModule(length) {
+ throw new Error('an unsupported module was defined, expected `define(id, deps, module)` instead got: `' + length + '` arguments to define`');
+ }
+
+ var defaultDeps = ['require', 'exports', 'module'];
+
+ function Module(id, deps, callback, alias) {
+ this.uuid = uuid++;
+ this.id = id;
+ this.deps = !deps.length && callback.length ? defaultDeps : deps;
+ this.module = { exports: {} };
+ this.callback = callback;
+ this.hasExportsAsDep = false;
+ this.isAlias = alias;
+ this.reified = new Array(deps.length);
+
+ /*
+ Each module normally passes through these states, in order:
+ new : initial state
+ pending : this module is scheduled to be executed
+ reifying : this module's dependencies are being executed
+ reified : this module's dependencies finished executing successfully
+ errored : this module's dependencies failed to execute
+ finalized : this module executed successfully
+ */
+ this.state = 'new';
+ }
+
+ Module.prototype.makeDefaultExport = function () {
+ var exports = this.module.exports;
+ if (exports !== null && (typeof exports === 'object' || typeof exports === 'function') && exports['default'] === undefined && Object.isExtensible(exports)) {
+ exports['default'] = exports;
+ }
+ };
+
+ Module.prototype.exports = function () {
+ // if finalized, there is no work to do. If reifying, there is a
+ // circular dependency so we must return our (partial) exports.
+ if (this.state === 'finalized' || this.state === 'reifying') {
+ return this.module.exports;
+ }
+
+
+ if (loader.wrapModules) {
+ this.callback = loader.wrapModules(this.id, this.callback);
+ }
+
+ this.reify();
+
+ var result = this.callback.apply(this, this.reified);
+ this.reified.length = 0;
+ this.state = 'finalized';
+
+ if (!(this.hasExportsAsDep && result === undefined)) {
+ this.module.exports = result;
+ }
+ if (loader.makeDefaultExport) {
+ this.makeDefaultExport();
+ }
+ return this.module.exports;
+ };
+
+ Module.prototype.unsee = function () {
+ this.state = 'new';
+ this.module = { exports: {} };
+ };
+
+ Module.prototype.reify = function () {
+ if (this.state === 'reified') {
+ return;
+ }
+ this.state = 'reifying';
+ try {
+ this.reified = this._reify();
+ this.state = 'reified';
+ } finally {
+ if (this.state === 'reifying') {
+ this.state = 'errored';
+ }
+ }
+ };
+
+ Module.prototype._reify = function () {
+ var reified = this.reified.slice();
+ for (var i = 0; i < reified.length; i++) {
+ var mod = reified[i];
+ reified[i] = mod.exports ? mod.exports : mod.module.exports();
+ }
+ return reified;
+ };
+
+ Module.prototype.findDeps = function (pending) {
+ if (this.state !== 'new') {
+ return;
+ }
+
+ this.state = 'pending';
+
+ var deps = this.deps;
+
+ for (var i = 0; i < deps.length; i++) {
+ var dep = deps[i];
+ var entry = this.reified[i] = { exports: undefined, module: undefined };
+ if (dep === 'exports') {
+ this.hasExportsAsDep = true;
+ entry.exports = this.module.exports;
+ } else if (dep === 'require') {
+ entry.exports = this.makeRequire();
+ } else if (dep === 'module') {
+ entry.exports = this.module;
+ } else {
+ entry.module = findModule(resolve(dep, this.id), this.id, pending);
+ }
+ }
+ };
+
+ Module.prototype.makeRequire = function () {
+ var id = this.id;
+ var r = function (dep) {
+ return require(resolve(dep, id));
+ };
+ r['default'] = r;
+ r.moduleId = id;
+ r.has = function (dep) {
+ return has(resolve(dep, id));
+ };
+ return r;
+ };
+
+ define = function (id, deps, callback) {
+ var module = registry[id];
+
+ // If a module for this id has already been defined and is in any state
+ // other than `new` (meaning it has been or is currently being required),
+ // then we return early to avoid redefinition.
+ if (module && module.state !== 'new') {
+ return;
+ }
+
+ if (arguments.length < 2) {
+ unsupportedModule(arguments.length);
+ }
+
+ if (!Array.isArray(deps)) {
+ callback = deps;
+ deps = [];
+ }
+
+ if (callback instanceof Alias) {
+ registry[id] = new Module(callback.id, deps, callback, true);
+ } else {
+ registry[id] = new Module(id, deps, callback, false);
+ }
+ };
+
+ define.exports = function (name, defaultExport) {
+ var module = registry[name];
+
+ // If a module for this name has already been defined and is in any state
+ // other than `new` (meaning it has been or is currently being required),
+ // then we return early to avoid redefinition.
+ if (module && module.state !== 'new') {
+ return;
+ }
+
+ module = new Module(name, [], noop, null);
+ module.module.exports = defaultExport;
+ module.state = 'finalized';
+ registry[name] = module;
+
+ return module;
+ };
+
+ function noop() {}
+ // we don't support all of AMD
+ // define.amd = {};
+
+ function Alias(id) {
+ this.id = id;
+ }
+
+ define.alias = function (id, target) {
+ if (arguments.length === 2) {
+ return define(target, new Alias(id));
+ }
+
+ return new Alias(id);
+ };
+
+ function missingModule(id, referrer) {
+ throw new Error('Could not find module `' + id + '` imported from `' + referrer + '`');
+ }
+
+ function findModule(id, referrer, pending) {
+ var mod = registry[id] || registry[id + '/index'];
+
+ while (mod && mod.isAlias) {
+ mod = registry[mod.id];
+ }
+
+ if (!mod) {
+ missingModule(id, referrer);
+ }
+
+ if (pending && mod.state !== 'pending' && mod.state !== 'finalized') {
+ mod.findDeps(pending);
+ pending.push(mod);
+ }
+ return mod;
+ }
+
+ function resolve(child, id) {
+ if (child.charAt(0) !== '.') {
+ return child;
+ }
+
+
+ var parts = child.split('/');
+ var nameParts = id.split('/');
+ var parentBase = nameParts.slice(0, -1);
+
+ for (var i = 0, l = parts.length; i < l; i++) {
+ var part = parts[i];
+
+ if (part === '..') {
+ if (parentBase.length === 0) {
+ throw new Error('Cannot access parent module of root');
+ }
+ parentBase.pop();
+ } else if (part === '.') {
+ continue;
+ } else {
+ parentBase.push(part);
+ }
+ }
+
+ return parentBase.join('/');
+ }
+
+ function has(id) {
+ return !!(registry[id] || registry[id + '/index']);
+ }
+
+ requirejs.entries = requirejs._eak_seen = registry;
+ requirejs.has = has;
+ requirejs.unsee = function (id) {
+ findModule(id, '(unsee)', false).unsee();
+ };
+
+ requirejs.clear = function () {
+ requirejs.entries = requirejs._eak_seen = registry = dict();
+ seen = dict();
+ };
+
+ // This code primes the JS engine for good performance by warming the
+ // JIT compiler for these functions.
+ define('foo', function () {});
+ define('foo/bar', [], function () {});
+ define('foo/asdf', ['module', 'exports', 'require'], function (module, exports, require) {
+ if (require.has('foo/bar')) {
+ require('foo/bar');
+ }
+ });
+ define('foo/baz', [], define.alias('foo'));
+ define('foo/quz', define.alias('foo'));
+ define.alias('foo', 'foo/qux');
+ define('foo/bar', ['foo', './quz', './baz', './asdf', './bar', '../foo'], function () {});
+ define('foo/main', ['foo/bar'], function () {});
+ define.exports('foo/exports', {});
+
+ require('foo/exports');
+ require('foo/main');
+ require.unsee('foo/bar');
+
+ requirejs.clear();
+
+ if (typeof exports === 'object' && typeof module === 'object' && module.exports) {
+ module.exports = { require: require, define: define };
+ }
+})(this);
+;/*!
+ * jQuery JavaScript Library v3.3.1
+ * https://jquery.com/
+ *
+ * Includes Sizzle.js
+ * https://sizzlejs.com/
+ *
+ * Copyright JS Foundation and other contributors
+ * Released under the MIT license
+ * https://jquery.org/license
+ *
+ * Date: 2018-01-20T17:24Z
+ */
+( function( global, factory ) {
+
+ "use strict";
+
+ if ( typeof module === "object" && typeof module.exports === "object" ) {
+
+ // For CommonJS and CommonJS-like environments where a proper `window`
+ // is present, execute the factory and get jQuery.
+ // For environments that do not have a `window` with a `document`
+ // (such as Node.js), expose a factory as module.exports.
+ // This accentuates the need for the creation of a real `window`.
+ // e.g. var jQuery = require("jquery")(window);
+ // See ticket #14549 for more info.
+ module.exports = global.document ?
+ factory( global, true ) :
+ function( w ) {
+ if ( !w.document ) {
+ throw new Error( "jQuery requires a window with a document" );
+ }
+ return factory( w );
+ };
+ } else {
+ factory( global );
+ }
+
+// Pass this if window is not defined yet
+} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
+
+// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
+// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
+// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
+// enough that all such attempts are guarded in a try block.
+"use strict";
+
+var arr = [];
+
+var document = window.document;
+
+var getProto = Object.getPrototypeOf;
+
+var slice = arr.slice;
+
+var concat = arr.concat;
+
+var push = arr.push;
+
+var indexOf = arr.indexOf;
+
+var class2type = {};
+
+var toString = class2type.toString;
+
+var hasOwn = class2type.hasOwnProperty;
+
+var fnToString = hasOwn.toString;
+
+var ObjectFunctionString = fnToString.call( Object );
+
+var support = {};
+
+var isFunction = function isFunction( obj ) {
+
+ // Support: Chrome <=57, Firefox <=52
+ // In some browsers, typeof returns "function" for HTML <object> elements
+ // (i.e., `typeof document.createElement( "object" ) === "function"`).
+ // We don't want to classify *any* DOM node as a function.
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
+ };
+
+
+var isWindow = function isWindow( obj ) {
+ return obj != null && obj === obj.window;
+ };
+
+
+
+
+ var preservedScriptAttributes = {
+ type: true,
+ src: true,
+ noModule: true
+ };
+
+ function DOMEval( code, doc, node ) {
+ doc = doc || document;
+
+ var i,
+ script = doc.createElement( "script" );
+
+ script.text = code;
+ if ( node ) {
+ for ( i in preservedScriptAttributes ) {
+ if ( node[ i ] ) {
+ script[ i ] = node[ i ];
+ }
+ }
+ }
+ doc.head.appendChild( script ).parentNode.removeChild( script );
+ }
+
+
+function toType( obj ) {
+ if ( obj == null ) {
+ return obj + "";
+ }
+
+ // Support: Android <=2.3 only (functionish RegExp)
+ return typeof obj === "object" || typeof obj === "function" ?
+ class2type[ toString.call( obj ) ] || "object" :
+ typeof obj;
+}
+/* global Symbol */
+// Defining this global in .eslintrc.json would create a danger of using the global
+// unguarded in another place, it seems safer to define global only for this module
+
+
+
+var
+ version = "3.3.1",
+
+ // Define a local copy of jQuery
+ jQuery = function( selector, context ) {
+
+ // The jQuery object is actually just the init constructor 'enhanced'
+ // Need init if jQuery is called (just allow error to be thrown if not included)
+ return new jQuery.fn.init( selector, context );
+ },
+
+ // Support: Android <=4.0 only
+ // Make sure we trim BOM and NBSP
+ rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
+
+jQuery.fn = jQuery.prototype = {
+
+ // The current version of jQuery being used
+ jquery: version,
+
+ constructor: jQuery,
+
+ // The default length of a jQuery object is 0
+ length: 0,
+
+ toArray: function() {
+ return slice.call( this );
+ },
+
+ // Get the Nth element in the matched element set OR
+ // Get the whole matched element set as a clean array
+ get: function( num ) {
+
+ // Return all the elements in a clean array
+ if ( num == null ) {
+ return slice.call( this );
+ }
+
+ // Return just the one element from the set
+ return num < 0 ? this[ num + this.length ] : this[ num ];
+ },
+
+ // Take an array of elements and push it onto the stack
+ // (returning the new matched element set)
+ pushStack: function( elems ) {
+
+ // Build a new jQuery matched element set
+ var ret = jQuery.merge( this.constructor(), elems );
+
+ // Add the old object onto the stack (as a reference)
+ ret.prevObject = this;
+
+ // Return the newly-formed element set
+ return ret;
+ },
+
+ // Execute a callback for every element in the matched set.
+ each: function( callback ) {
+ return jQuery.each( this, callback );
+ },
+
+ map: function( callback ) {
+ return this.pushStack( jQuery.map( this, function( elem, i ) {
+ return callback.call( elem, i, elem );
+ } ) );
+ },
+
+ slice: function() {
+ return this.pushStack( slice.apply( this, arguments ) );
+ },
+
+ first: function() {
+ return this.eq( 0 );
+ },
+
+ last: function() {
+ return this.eq( -1 );
+ },
+
+ eq: function( i ) {
+ var len = this.length,
+ j = +i + ( i < 0 ? len : 0 );
+ return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
+ },
+
+ end: function() {
+ return this.prevObject || this.constructor();
+ },
+
+ // For internal use only.
+ // Behaves like an Array's method, not like a jQuery method.
+ push: push,
+ sort: arr.sort,
+ splice: arr.splice
+};
+
+jQuery.extend = jQuery.fn.extend = function() {
+ var options, name, src, copy, copyIsArray, clone,
+ target = arguments[ 0 ] || {},
+ i = 1,
+ length = arguments.length,
+ deep = false;
+
+ // Handle a deep copy situation
+ if ( typeof target === "boolean" ) {
+ deep = target;
+
+ // Skip the boolean and the target
+ target = arguments[ i ] || {};
+ i++;
+ }
+
+ // Handle case when target is a string or something (possible in deep copy)
+ if ( typeof target !== "object" && !isFunction( target ) ) {
+ target = {};
+ }
+
+ // Extend jQuery itself if only one argument is passed
+ if ( i === length ) {
+ target = this;
+ i--;
+ }
+
+ for ( ; i < length; i++ ) {
+
+ // Only deal with non-null/undefined values
+ if ( ( options = arguments[ i ] ) != null ) {
+
+ // Extend the base object
+ for ( name in options ) {
+ src = target[ name ];
+ copy = options[ name ];
+
+ // Prevent never-ending loop
+ if ( target === copy ) {
+ continue;
+ }
+
+ // Recurse if we're merging plain objects or arrays
+ if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
+ ( copyIsArray = Array.isArray( copy ) ) ) ) {
+
+ if ( copyIsArray ) {
+ copyIsArray = false;
+ clone = src && Array.isArray( src ) ? src : [];
+
+ } else {
+ clone = src && jQuery.isPlainObject( src ) ? src : {};
+ }
+
+ // Never move original objects, clone them
+ target[ name ] = jQuery.extend( deep, clone, copy );
+
+ // Don't bring in undefined values
+ } else if ( copy !== undefined ) {
+ target[ name ] = copy;
+ }
+ }
+ }
+ }
+
+ // Return the modified object
+ return target;
+};
+
+jQuery.extend( {
+
+ // Unique for each copy of jQuery on the page
+ expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
+
+ // Assume jQuery is ready without the ready module
+ isReady: true,
+
+ error: function( msg ) {
+ throw new Error( msg );
+ },
+
+ noop: function() {},
+
+ isPlainObject: function( obj ) {
+ var proto, Ctor;
+
+ // Detect obvious negatives
+ // Use toString instead of jQuery.type to catch host objects
+ if ( !obj || toString.call( obj ) !== "[object Object]" ) {
+ return false;
+ }
+
+ proto = getProto( obj );
+
+ // Objects with no prototype (e.g., `Object.create( null )`) are plain
+ if ( !proto ) {
+ return true;
+ }
+
+ // Objects with prototype are plain iff they were constructed by a global Object function
+ Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor;
+ return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString;
+ },
+
+ isEmptyObject: function( obj ) {
+
+ /* eslint-disable no-unused-vars */
+ // See https://github.com/eslint/eslint/issues/6125
+ var name;
+
+ for ( name in obj ) {
+ return false;
+ }
+ return true;
+ },
+
+ // Evaluates a script in a global context
+ globalEval: function( code ) {
+ DOMEval( code );
+ },
+
+ each: function( obj, callback ) {
+ var length, i = 0;
+
+ if ( isArrayLike( obj ) ) {
+ length = obj.length;
+ for ( ; i < length; i++ ) {
+ if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( i in obj ) {
+ if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
+ break;
+ }
+ }
+ }
+
+ return obj;
+ },
+
+ // Support: Android <=4.0 only
+ trim: function( text ) {
+ return text == null ?
+ "" :
+ ( text + "" ).replace( rtrim, "" );
+ },
+
+ // results is for internal usage only
+ makeArray: function( arr, results ) {
+ var ret = results || [];
+
+ if ( arr != null ) {
+ if ( isArrayLike( Object( arr ) ) ) {
+ jQuery.merge( ret,
+ typeof arr === "string" ?
+ [ arr ] : arr
+ );
+ } else {
+ push.call( ret, arr );
+ }
+ }
+
+ return ret;
+ },
+
+ inArray: function( elem, arr, i ) {
+ return arr == null ? -1 : indexOf.call( arr, elem, i );
+ },
+
+ // Support: Android <=4.0 only, PhantomJS 1 only
+ // push.apply(_, arraylike) throws on ancient WebKit
+ merge: function( first, second ) {
+ var len = +second.length,
+ j = 0,
+ i = first.length;
+
+ for ( ; j < len; j++ ) {
+ first[ i++ ] = second[ j ];
+ }
+
+ first.length = i;
+
+ return first;
+ },
+
+ grep: function( elems, callback, invert ) {
+ var callbackInverse,
+ matches = [],
+ i = 0,
+ length = elems.length,
+ callbackExpect = !invert;
+
+ // Go through the array, only saving the items
+ // that pass the validator function
+ for ( ; i < length; i++ ) {
+ callbackInverse = !callback( elems[ i ], i );
+ if ( callbackInverse !== callbackExpect ) {
+ matches.push( elems[ i ] );
+ }
+ }
+
+ return matches;
+ },
+
+ // arg is for internal usage only
+ map: function( elems, callback, arg ) {
+ var length, value,
+ i = 0,
+ ret = [];
+
+ // Go through the array, translating each of the items to their new values
+ if ( isArrayLike( elems ) ) {
+ length = elems.length;
+ for ( ; i < length; i++ ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+
+ // Go through every key on the object,
+ } else {
+ for ( i in elems ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret.push( value );
+ }
+ }
+ }
+
+ // Flatten any nested arrays
+ return concat.apply( [], ret );
+ },
+
+ // A global GUID counter for objects
+ guid: 1,
+
+ // jQuery.support is not used in Core but other projects attach their
+ // properties to it so it needs to exist.
+ support: support
+} );
+
+if ( typeof Symbol === "function" ) {
+ jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
+}
+
+// Populate the class2type map
+jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
+function( i, name ) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+} );
+
+function isArrayLike( obj ) {
+
+ // Support: real iOS 8.2 only (not reproducible in simulator)
+ // `in` check used to prevent JIT error (gh-2145)
+ // hasOwn isn't used here due to false negatives
+ // regarding Nodelist length in IE
+ var length = !!obj && "length" in obj && obj.length,
+ type = toType( obj );
+
+ if ( isFunction( obj ) || isWindow( obj ) ) {
+ return false;
+ }
+
+ return type === "array" || length === 0 ||
+ typeof length === "number" && length > 0 && ( length - 1 ) in obj;
+}
+var Sizzle =
+/*!
+ * Sizzle CSS Selector Engine v2.3.3
+ * https://sizzlejs.com/
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2016-08-08
+ */
+(function( window ) {
+
+var i,
+ support,
+ Expr,
+ getText,
+ isXML,
+ tokenize,
+ compile,
+ select,
+ outermostContext,
+ sortInput,
+ hasDuplicate,
+
+ // Local document vars
+ setDocument,
+ document,
+ docElem,
+ documentIsHTML,
+ rbuggyQSA,
+ rbuggyMatches,
+ matches,
+ contains,
+
+ // Instance-specific data
+ expando = "sizzle" + 1 * new Date(),
+ preferredDoc = window.document,
+ dirruns = 0,
+ done = 0,
+ classCache = createCache(),
+ tokenCache = createCache(),
+ compilerCache = createCache(),
+ sortOrder = function( a, b ) {
+ if ( a === b ) {
+ hasDuplicate = true;
+ }
+ return 0;
+ },
+
+ // Instance methods
+ hasOwn = ({}).hasOwnProperty,
+ arr = [],
+ pop = arr.pop,
+ push_native = arr.push,
+ push = arr.push,
+ slice = arr.slice,
+ // Use a stripped-down indexOf as it's faster than native
+ // https://jsperf.com/thor-indexof-vs-for/5
+ indexOf = function( list, elem ) {
+ var i = 0,
+ len = list.length;
+ for ( ; i < len; i++ ) {
+ if ( list[i] === elem ) {
+ return i;
+ }
+ }
+ return -1;
+ },
+
+ booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+
+ // Regular expressions
+
+ // http://www.w3.org/TR/css3-selectors/#whitespace
+ whitespace = "[\\x20\\t\\r\\n\\f]",
+
+ // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+ identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
+
+ // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
+ attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
+ // Operator (capture 2)
+ "*([*^$|!~]?=)" + whitespace +
+ // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
+ "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
+ "*\\]",
+
+ pseudos = ":(" + identifier + ")(?:\\((" +
+ // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
+ // 1. quoted (capture 3; capture 4 or capture 5)
+ "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+ // 2. simple (capture 6)
+ "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+ // 3. anything else (capture 2)
+ ".*" +
+ ")\\)|)",
+
+ // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+ rwhitespace = new RegExp( whitespace + "+", "g" ),
+ rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+ rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+ rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),
+
+ rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),
+
+ rpseudo = new RegExp( pseudos ),
+ ridentifier = new RegExp( "^" + identifier + "$" ),
+
+ matchExpr = {
+ "ID": new RegExp( "^#(" + identifier + ")" ),
+ "CLASS": new RegExp( "^\\.(" + identifier + ")" ),
+ "TAG": new RegExp( "^(" + identifier + "|[*])" ),
+ "ATTR": new RegExp( "^" + attributes ),
+ "PSEUDO": new RegExp( "^" + pseudos ),
+ "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
+ "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+ "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+ "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
+ // For use in libraries implementing .is()
+ // We use this for POS matching in `select`
+ "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
+ whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+ },
+
+ rinputs = /^(?:input|select|textarea|button)$/i,
+ rheader = /^h\d$/i,
+
+ rnative = /^[^{]+\{\s*\[native \w/,
+
+ // Easily-parseable/retrievable ID or TAG or CLASS selectors
+ rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+ rsibling = /[+~]/,
+
+ // CSS escapes
+ // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+ runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
+ funescape = function( _, escaped, escapedWhitespace ) {
+ var high = "0x" + escaped - 0x10000;
+ // NaN means non-codepoint
+ // Support: Firefox<24
+ // Workaround erroneous numeric interpretation of +"0x"
+ return high !== high || escapedWhitespace ?
+ escaped :
+ high < 0 ?
+ // BMP codepoint
+ String.fromCharCode( high + 0x10000 ) :
+ // Supplemental Plane codepoint (surrogate pair)
+ String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+ },
+
+ // CSS string/identifier serialization
+ // https://drafts.csswg.org/cssom/#common-serializing-idioms
+ rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
+ fcssescape = function( ch, asCodePoint ) {
+ if ( asCodePoint ) {
+
+ // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
+ if ( ch === "\0" ) {
+ return "\uFFFD";
+ }
+
+ // Control characters and (dependent upon position) numbers get escaped as code points
+ return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
+ }
+
+ // Other potentially-special ASCII characters get backslash-escaped
+ return "\\" + ch;
+ },
+
+ // Used for iframes
+ // See setDocument()
+ // Removing the function wrapper causes a "Permission Denied"
+ // error in IE
+ unloadHandler = function() {
+ setDocument();
+ },
+
+ disabledAncestor = addCombinator(
+ function( elem ) {
+ return elem.disabled === true && ("form" in elem || "label" in elem);
+ },
+ { dir: "parentNode", next: "legend" }
+ );
+
+// Optimize for push.apply( _, NodeList )
+try {
+ push.apply(
+ (arr = slice.call( preferredDoc.childNodes )),
+ preferredDoc.childNodes
+ );
+ // Support: Android<4.0
+ // Detect silently failing push.apply
+ arr[ preferredDoc.childNodes.length ].nodeType;
+} catch ( e ) {
+ push = { apply: arr.length ?
+
+ // Leverage slice if possible
+ function( target, els ) {
+ push_native.apply( target, slice.call(els) );
+ } :
+
+ // Support: IE<9
+ // Otherwise append directly
+ function( target, els ) {
+ var j = target.length,
+ i = 0;
+ // Can't trust NodeList.length
+ while ( (target[j++] = els[i++]) ) {}
+ target.length = j - 1;
+ }
+ };
+}
+
+function Sizzle( selector, context, results, seed ) {
+ var m, i, elem, nid, match, groups, newSelector,
+ newContext = context && context.ownerDocument,
+
+ // nodeType defaults to 9, since context defaults to document
+ nodeType = context ? context.nodeType : 9;
+
+ results = results || [];
+
+ // Return early from calls with invalid selector or context
+ if ( typeof selector !== "string" || !selector ||
+ nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {
+
+ return results;
+ }
+
+ // Try to shortcut find operations (as opposed to filters) in HTML documents
+ if ( !seed ) {
+
+ if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+ setDocument( context );
+ }
+ context = context || document;
+
+ if ( documentIsHTML ) {
+
+ // If the selector is sufficiently simple, try using a "get*By*" DOM method
+ // (excepting DocumentFragment context, where the methods don't exist)
+ if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {
+
+ // ID selector
+ if ( (m = match[1]) ) {
+
+ // Document context
+ if ( nodeType === 9 ) {
+ if ( (elem = context.getElementById( m )) ) {
+
+ // Support: IE, Opera, Webkit
+ // TODO: identify versions
+ // getElementById can match elements by name instead of ID
+ if ( elem.id === m ) {
+ results.push( elem );
+ return results;
+ }
+ } else {
+ return results;
+ }
+
+ // Element context
+ } else {
+
+ // Support: IE, Opera, Webkit
+ // TODO: identify versions
+ // getElementById can match elements by name instead of ID
+ if ( newContext && (elem = newContext.getElementById( m )) &&
+ contains( context, elem ) &&
+ elem.id === m ) {
+
+ results.push( elem );
+ return results;
+ }
+ }
+
+ // Type selector
+ } else if ( match[2] ) {
+ push.apply( results, context.getElementsByTagName( selector ) );
+ return results;
+
+ // Class selector
+ } else if ( (m = match[3]) && support.getElementsByClassName &&
+ context.getElementsByClassName ) {
+
+ push.apply( results, context.getElementsByClassName( m ) );
+ return results;
+ }
+ }
+
+ // Take advantage of querySelectorAll
+ if ( support.qsa &&
+ !compilerCache[ selector + " " ] &&
+ (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
+
+ if ( nodeType !== 1 ) {
+ newContext = context;
+ newSelector = selector;
+
+ // qSA looks outside Element context, which is not what we want
+ // Thanks to Andrew Dupont for this workaround technique
+ // Support: IE <=8
+ // Exclude object elements
+ } else if ( context.nodeName.toLowerCase() !== "object" ) {
+
+ // Capture the context ID, setting it first if necessary
+ if ( (nid = context.getAttribute( "id" )) ) {
+ nid = nid.replace( rcssescape, fcssescape );
+ } else {
+ context.setAttribute( "id", (nid = expando) );
+ }
+
+ // Prefix every selector in the list
+ groups = tokenize( selector );
+ i = groups.length;
+ while ( i-- ) {
+ groups[i] = "#" + nid + " " + toSelector( groups[i] );
+ }
+ newSelector = groups.join( "," );
+
+ // Expand context for sibling selectors
+ newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
+ context;
+ }
+
+ if ( newSelector ) {
+ try {
+ push.apply( results,
+ newContext.querySelectorAll( newSelector )
+ );
+ return results;
+ } catch ( qsaError ) {
+ } finally {
+ if ( nid === expando ) {
+ context.removeAttribute( "id" );
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // All others
+ return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * Create key-value caches of limited size
+ * @returns {function(string, object)} Returns the Object data after storing it on itself with
+ * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ * deleting the oldest entry
+ */
+function createCache() {
+ var keys = [];
+
+ function cache( key, value ) {
+ // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+ if ( keys.push( key + " " ) > Expr.cacheLength ) {
+ // Only keep the most recent entries
+ delete cache[ keys.shift() ];
+ }
+ return (cache[ key + " " ] = value);
+ }
+ return cache;
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+ fn[ expando ] = true;
+ return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created element and returns a boolean result
+ */
+function assert( fn ) {
+ var el = document.createElement("fieldset");
+
+ try {
+ return !!fn( el );
+ } catch (e) {
+ return false;
+ } finally {
+ // Remove from its parent by default
+ if ( el.parentNode ) {
+ el.parentNode.removeChild( el );
+ }
+ // release memory in IE
+ el = null;
+ }
+}
+
+/**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+function addHandle( attrs, handler ) {
+ var arr = attrs.split("|"),
+ i = arr.length;
+
+ while ( i-- ) {
+ Expr.attrHandle[ arr[i] ] = handler;
+ }
+}
+
+/**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+function siblingCheck( a, b ) {
+ var cur = b && a,
+ diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+ a.sourceIndex - b.sourceIndex;
+
+ // Use IE sourceIndex if available on both nodes
+ if ( diff ) {
+ return diff;
+ }
+
+ // Check if b follows a
+ if ( cur ) {
+ while ( (cur = cur.nextSibling) ) {
+ if ( cur === b ) {
+ return -1;
+ }
+ }
+ }
+
+ return a ? 1 : -1;
+}
+
+/**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+function createInputPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+function createButtonPseudo( type ) {
+ return function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return (name === "input" || name === "button") && elem.type === type;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for :enabled/:disabled
+ * @param {Boolean} disabled true for :disabled; false for :enabled
+ */
+function createDisabledPseudo( disabled ) {
+
+ // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
+ return function( elem ) {
+
+ // Only certain elements can match :enabled or :disabled
+ // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
+ // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
+ if ( "form" in elem ) {
+
+ // Check for inherited disabledness on relevant non-disabled elements:
+ // * listed form-associated elements in a disabled fieldset
+ // https://html.spec.whatwg.org/multipage/forms.html#category-listed
+ // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
+ // * option elements in a disabled optgroup
+ // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
+ // All such elements have a "form" property.
+ if ( elem.parentNode && elem.disabled === false ) {
+
+ // Option elements defer to a parent optgroup if present
+ if ( "label" in elem ) {
+ if ( "label" in elem.parentNode ) {
+ return elem.parentNode.disabled === disabled;
+ } else {
+ return elem.disabled === disabled;
+ }
+ }
+
+ // Support: IE 6 - 11
+ // Use the isDisabled shortcut property to check for disabled fieldset ancestors
+ return elem.isDisabled === disabled ||
+
+ // Where there is no isDisabled, check manually
+ /* jshint -W018 */
+ elem.isDisabled !== !disabled &&
+ disabledAncestor( elem ) === disabled;
+ }
+
+ return elem.disabled === disabled;
+
+ // Try to winnow out elements that can't be disabled before trusting the disabled property.
+ // Some victims get caught in our net (label, legend, menu, track), but it shouldn't
+ // even exist on them, let alone have a boolean value.
+ } else if ( "label" in elem ) {
+ return elem.disabled === disabled;
+ }
+
+ // Remaining elements are neither :enabled nor :disabled
+ return false;
+ };
+}
+
+/**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+function createPositionalPseudo( fn ) {
+ return markFunction(function( argument ) {
+ argument = +argument;
+ return markFunction(function( seed, matches ) {
+ var j,
+ matchIndexes = fn( [], seed.length, argument ),
+ i = matchIndexes.length;
+
+ // Match elements found at the specified indexes
+ while ( i-- ) {
+ if ( seed[ (j = matchIndexes[i]) ] ) {
+ seed[j] = !(matches[j] = seed[j]);
+ }
+ }
+ });
+ });
+}
+
+/**
+ * Checks a node for validity as a Sizzle context
+ * @param {Element|Object=} context
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
+ */
+function testContext( context ) {
+ return context && typeof context.getElementsByTagName !== "undefined" && context;
+}
+
+// Expose support vars for convenience
+support = Sizzle.support = {};
+
+/**
+ * Detects XML nodes
+ * @param {Element|Object} elem An element or a document
+ * @returns {Boolean} True iff elem is a non-HTML XML node
+ */
+isXML = Sizzle.isXML = function( elem ) {
+ // documentElement is verified for cases where it doesn't yet exist
+ // (such as loading iframes in IE - #4833)
+ var documentElement = elem && (elem.ownerDocument || elem).documentElement;
+ return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+ var hasCompare, subWindow,
+ doc = node ? node.ownerDocument || node : preferredDoc;
+
+ // Return early if doc is invalid or already selected
+ if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+ return document;
+ }
+
+ // Update global variables
+ document = doc;
+ docElem = document.documentElement;
+ documentIsHTML = !isXML( document );
+
+ // Support: IE 9-11, Edge
+ // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
+ if ( preferredDoc !== document &&
+ (subWindow = document.defaultView) && subWindow.top !== subWindow ) {
+
+ // Support: IE 11, Edge
+ if ( subWindow.addEventListener ) {
+ subWindow.addEventListener( "unload", unloadHandler, false );
+
+ // Support: IE 9 - 10 only
+ } else if ( subWindow.attachEvent ) {
+ subWindow.attachEvent( "onunload", unloadHandler );
+ }
+ }
+
+ /* Attributes
+ ---------------------------------------------------------------------- */
+
+ // Support: IE<8
+ // Verify that getAttribute really returns attributes and not properties
+ // (excepting IE8 booleans)
+ support.attributes = assert(function( el ) {
+ el.className = "i";
+ return !el.getAttribute("className");
+ });
+
+ /* getElement(s)By*
+ ---------------------------------------------------------------------- */
+
+ // Check if getElementsByTagName("*") returns only elements
+ support.getElementsByTagName = assert(function( el ) {
+ el.appendChild( document.createComment("") );
+ return !el.getElementsByTagName("*").length;
+ });
+
+ // Support: IE<9
+ support.getElementsByClassName = rnative.test( document.getElementsByClassName );
+
+ // Support: IE<10
+ // Check if getElementById returns elements by name
+ // The broken getElementById methods don't pick up programmatically-set names,
+ // so use a roundabout getElementsByName test
+ support.getById = assert(function( el ) {
+ docElem.appendChild( el ).id = expando;
+ return !document.getElementsByName || !document.getElementsByName( expando ).length;
+ });
+
+ // ID filter and find
+ if ( support.getById ) {
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ return elem.getAttribute("id") === attrId;
+ };
+ };
+ Expr.find["ID"] = function( id, context ) {
+ if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+ var elem = context.getElementById( id );
+ return elem ? [ elem ] : [];
+ }
+ };
+ } else {
+ Expr.filter["ID"] = function( id ) {
+ var attrId = id.replace( runescape, funescape );
+ return function( elem ) {
+ var node = typeof elem.getAttributeNode !== "undefined" &&
+ elem.getAttributeNode("id");
+ return node && node.value === attrId;
+ };
+ };
+
+ // Support: IE 6 - 7 only
+ // getElementById is not reliable as a find shortcut
+ Expr.find["ID"] = function( id, context ) {
+ if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
+ var node, i, elems,
+ elem = context.getElementById( id );
+
+ if ( elem ) {
+
+ // Verify the id attribute
+ node = elem.getAttributeNode("id");
+ if ( node && node.value === id ) {
+ return [ elem ];
+ }
+
+ // Fall back on getElementsByName
+ elems = context.getElementsByName( id );
+ i = 0;
+ while ( (elem = elems[i++]) ) {
+ node = elem.getAttributeNode("id");
+ if ( node && node.value === id ) {
+ return [ elem ];
+ }
+ }
+ }
+
+ return [];
+ }
+ };
+ }
+
+ // Tag
+ Expr.find["TAG"] = support.getElementsByTagName ?
+ function( tag, context ) {
+ if ( typeof context.getElementsByTagName !== "undefined" ) {
+ return context.getElementsByTagName( tag );
+
+ // DocumentFragment nodes don't have gEBTN
+ } else if ( support.qsa ) {
+ return context.querySelectorAll( tag );
+ }
+ } :
+
+ function( tag, context ) {
+ var elem,
+ tmp = [],
+ i = 0,
+ // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
+ results = context.getElementsByTagName( tag );
+
+ // Filter out possible comments
+ if ( tag === "*" ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem.nodeType === 1 ) {
+ tmp.push( elem );
+ }
+ }
+
+ return tmp;
+ }
+ return results;
+ };
+
+ // Class
+ Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
+ if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
+ return context.getElementsByClassName( className );
+ }
+ };
+
+ /* QSA/matchesSelector
+ ---------------------------------------------------------------------- */
+
+ // QSA and matchesSelector support
+
+ // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+ rbuggyMatches = [];
+
+ // qSa(:focus) reports false when true (Chrome 21)
+ // We allow this because of a bug in IE8/9 that throws an error
+ // whenever `document.activeElement` is accessed on an iframe
+ // So, we allow :focus to pass through QSA all the time to avoid the IE error
+ // See https://bugs.jquery.com/ticket/13378
+ rbuggyQSA = [];
+
+ if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
+ // Build QSA regex
+ // Regex strategy adopted from Diego Perini
+ assert(function( el ) {
+ // Select is set to empty string on purpose
+ // This is to test IE's treatment of not explicitly
+ // setting a boolean content attribute,
+ // since its presence should be enough
+ // https://bugs.jquery.com/ticket/12359
+ docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" +
+ "<select id='" + expando + "-\r\\' msallowcapture=''>" +
+ "<option selected=''></option></select>";
+
+ // Support: IE8, Opera 11-12.16
+ // Nothing should be selected when empty strings follow ^= or $= or *=
+ // The test attribute must be unknown in Opera but "safe" for WinRT
+ // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+ if ( el.querySelectorAll("[msallowcapture^='']").length ) {
+ rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
+ }
+
+ // Support: IE8
+ // Boolean attributes and "value" are not treated correctly
+ if ( !el.querySelectorAll("[selected]").length ) {
+ rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
+ }
+
+ // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
+ if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
+ rbuggyQSA.push("~=");
+ }
+
+ // Webkit/Opera - :checked should return selected option elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ // IE8 throws error here and will not see later tests
+ if ( !el.querySelectorAll(":checked").length ) {
+ rbuggyQSA.push(":checked");
+ }
+
+ // Support: Safari 8+, iOS 8+
+ // https://bugs.webkit.org/show_bug.cgi?id=136851
+ // In-page `selector#id sibling-combinator selector` fails
+ if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) {
+ rbuggyQSA.push(".#.+[+~]");
+ }
+ });
+
+ assert(function( el ) {
+ el.innerHTML = "<a href='' disabled='disabled'></a>" +
+ "<select disabled='disabled'><option/></select>";
+
+ // Support: Windows 8 Native Apps
+ // The type and name attributes are restricted during .innerHTML assignment
+ var input = document.createElement("input");
+ input.setAttribute( "type", "hidden" );
+ el.appendChild( input ).setAttribute( "name", "D" );
+
+ // Support: IE8
+ // Enforce case-sensitivity of name attribute
+ if ( el.querySelectorAll("[name=d]").length ) {
+ rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
+ }
+
+ // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+ // IE8 throws error here and will not see later tests
+ if ( el.querySelectorAll(":enabled").length !== 2 ) {
+ rbuggyQSA.push( ":enabled", ":disabled" );
+ }
+
+ // Support: IE9-11+
+ // IE's :disabled selector does not pick up the children of disabled fieldsets
+ docElem.appendChild( el ).disabled = true;
+ if ( el.querySelectorAll(":disabled").length !== 2 ) {
+ rbuggyQSA.push( ":enabled", ":disabled" );
+ }
+
+ // Opera 10-11 does not throw on post-comma invalid pseudos
+ el.querySelectorAll("*,:x");
+ rbuggyQSA.push(",.*:");
+ });
+ }
+
+ if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
+ docElem.webkitMatchesSelector ||
+ docElem.mozMatchesSelector ||
+ docElem.oMatchesSelector ||
+ docElem.msMatchesSelector) )) ) {
+
+ assert(function( el ) {
+ // Check to see if it's possible to do matchesSelector
+ // on a disconnected node (IE 9)
+ support.disconnectedMatch = matches.call( el, "*" );
+
+ // This should fail with an exception
+ // Gecko does not error, returns false instead
+ matches.call( el, "[s!='']:x" );
+ rbuggyMatches.push( "!=", pseudos );
+ });
+ }
+
+ rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
+ rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );
+
+ /* Contains
+ ---------------------------------------------------------------------- */
+ hasCompare = rnative.test( docElem.compareDocumentPosition );
+
+ // Element contains another
+ // Purposefully self-exclusive
+ // As in, an element does not contain itself
+ contains = hasCompare || rnative.test( docElem.contains ) ?
+ function( a, b ) {
+ var adown = a.nodeType === 9 ? a.documentElement : a,
+ bup = b && b.parentNode;
+ return a === bup || !!( bup && bup.nodeType === 1 && (
+ adown.contains ?
+ adown.contains( bup ) :
+ a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+ ));
+ } :
+ function( a, b ) {
+ if ( b ) {
+ while ( (b = b.parentNode) ) {
+ if ( b === a ) {
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+
+ /* Sorting
+ ---------------------------------------------------------------------- */
+
+ // Document order sorting
+ sortOrder = hasCompare ?
+ function( a, b ) {
+
+ // Flag for duplicate removal
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ // Sort on method existence if only one input has compareDocumentPosition
+ var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
+ if ( compare ) {
+ return compare;
+ }
+
+ // Calculate position if both inputs belong to the same document
+ compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
+ a.compareDocumentPosition( b ) :
+
+ // Otherwise we know they are disconnected
+ 1;
+
+ // Disconnected nodes
+ if ( compare & 1 ||
+ (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
+
+ // Choose the first element that is related to our preferred document
+ if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
+ return -1;
+ }
+ if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
+ return 1;
+ }
+
+ // Maintain original order
+ return sortInput ?
+ ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+ 0;
+ }
+
+ return compare & 4 ? -1 : 1;
+ } :
+ function( a, b ) {
+ // Exit early if the nodes are identical
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ var cur,
+ i = 0,
+ aup = a.parentNode,
+ bup = b.parentNode,
+ ap = [ a ],
+ bp = [ b ];
+
+ // Parentless nodes are either documents or disconnected
+ if ( !aup || !bup ) {
+ return a === document ? -1 :
+ b === document ? 1 :
+ aup ? -1 :
+ bup ? 1 :
+ sortInput ?
+ ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
+ 0;
+
+ // If the nodes are siblings, we can do a quick check
+ } else if ( aup === bup ) {
+ return siblingCheck( a, b );
+ }
+
+ // Otherwise we need full lists of their ancestors for comparison
+ cur = a;
+ while ( (cur = cur.parentNode) ) {
+ ap.unshift( cur );
+ }
+ cur = b;
+ while ( (cur = cur.parentNode) ) {
+ bp.unshift( cur );
+ }
+
+ // Walk down the tree looking for a discrepancy
+ while ( ap[i] === bp[i] ) {
+ i++;
+ }
+
+ return i ?
+ // Do a sibling check if the nodes have a common ancestor
+ siblingCheck( ap[i], bp[i] ) :
+
+ // Otherwise nodes in our document sort first
+ ap[i] === preferredDoc ? -1 :
+ bp[i] === preferredDoc ? 1 :
+ 0;
+ };
+
+ return document;
+};
+
+Sizzle.matches = function( expr, elements ) {
+ return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ // Make sure that attribute selectors are quoted
+ expr = expr.replace( rattributeQuotes, "='$1']" );
+
+ if ( support.matchesSelector && documentIsHTML &&
+ !compilerCache[ expr + " " ] &&
+ ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
+ ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
+
+ try {
+ var ret = matches.call( elem, expr );
+
+ // IE 9's matchesSelector returns false on disconnected nodes
+ if ( ret || support.disconnectedMatch ||
+ // As well, disconnected nodes are said to be in a document
+ // fragment in IE 9
+ elem.document && elem.document.nodeType !== 11 ) {
+ return ret;
+ }
+ } catch (e) {}
+ }
+
+ return Sizzle( expr, document, null, [ elem ] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+ // Set document vars if needed
+ if ( ( context.ownerDocument || context ) !== document ) {
+ setDocument( context );
+ }
+ return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+ // Set document vars if needed
+ if ( ( elem.ownerDocument || elem ) !== document ) {
+ setDocument( elem );
+ }
+
+ var fn = Expr.attrHandle[ name.toLowerCase() ],
+ // Don't get fooled by Object.prototype properties (jQuery #13807)
+ val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
+ fn( elem, name, !documentIsHTML ) :
+ undefined;
+
+ return val !== undefined ?
+ val :
+ support.attributes || !documentIsHTML ?
+ elem.getAttribute( name ) :
+ (val = elem.getAttributeNode(name)) && val.specified ?
+ val.value :
+ null;
+};
+
+Sizzle.escape = function( sel ) {
+ return (sel + "").replace( rcssescape, fcssescape );
+};
+
+Sizzle.error = function( msg ) {
+ throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+/**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+Sizzle.uniqueSort = function( results ) {
+ var elem,
+ duplicates = [],
+ j = 0,
+ i = 0;
+
+ // Unless we *know* we can detect duplicates, assume their presence
+ hasDuplicate = !support.detectDuplicates;
+ sortInput = !support.sortStable && results.slice( 0 );
+ results.sort( sortOrder );
+
+ if ( hasDuplicate ) {
+ while ( (elem = results[i++]) ) {
+ if ( elem === results[ i ] ) {
+ j = duplicates.push( i );
+ }
+ }
+ while ( j-- ) {
+ results.splice( duplicates[ j ], 1 );
+ }
+ }
+
+ // Clear input after sorting to release objects
+ // See https://github.com/jquery/sizzle/pull/225
+ sortInput = null;
+
+ return results;
+};
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+ var node,
+ ret = "",
+ i = 0,
+ nodeType = elem.nodeType;
+
+ if ( !nodeType ) {
+ // If no nodeType, this is expected to be an array
+ while ( (node = elem[i++]) ) {
+ // Do not traverse comment nodes
+ ret += getText( node );
+ }
+ } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+ // Use textContent for elements
+ // innerText usage removed for consistency of new lines (jQuery #11153)
+ if ( typeof elem.textContent === "string" ) {
+ return elem.textContent;
+ } else {
+ // Traverse its children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ ret += getText( elem );
+ }
+ }
+ } else if ( nodeType === 3 || nodeType === 4 ) {
+ return elem.nodeValue;
+ }
+ // Do not include comment or processing instruction nodes
+
+ return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+ // Can be adjusted by the user
+ cacheLength: 50,
+
+ createPseudo: markFunction,
+
+ match: matchExpr,
+
+ attrHandle: {},
+
+ find: {},
+
+ relative: {
+ ">": { dir: "parentNode", first: true },
+ " ": { dir: "parentNode" },
+ "+": { dir: "previousSibling", first: true },
+ "~": { dir: "previousSibling" }
+ },
+
+ preFilter: {
+ "ATTR": function( match ) {
+ match[1] = match[1].replace( runescape, funescape );
+
+ // Move the given value to match[3] whether quoted or unquoted
+ match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );
+
+ if ( match[2] === "~=" ) {
+ match[3] = " " + match[3] + " ";
+ }
+
+ return match.slice( 0, 4 );
+ },
+
+ "CHILD": function( match ) {
+ /* matches from matchExpr["CHILD"]
+ 1 type (only|nth|...)
+ 2 what (child|of-type)
+ 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+ 4 xn-component of xn+y argument ([+-]?\d*n|)
+ 5 sign of xn-component
+ 6 x of xn-component
+ 7 sign of y-component
+ 8 y of y-component
+ */
+ match[1] = match[1].toLowerCase();
+
+ if ( match[1].slice( 0, 3 ) === "nth" ) {
+ // nth-* requires argument
+ if ( !match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ // numeric x and y parameters for Expr.filter.CHILD
+ // remember that false/true cast respectively to 0/1
+ match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
+ match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
+
+ // other types prohibit arguments
+ } else if ( match[3] ) {
+ Sizzle.error( match[0] );
+ }
+
+ return match;
+ },
+
+ "PSEUDO": function( match ) {
+ var excess,
+ unquoted = !match[6] && match[2];
+
+ if ( matchExpr["CHILD"].test( match[0] ) ) {
+ return null;
+ }
+
+ // Accept quoted arguments as-is
+ if ( match[3] ) {
+ match[2] = match[4] || match[5] || "";
+
+ // Strip excess characters from unquoted arguments
+ } else if ( unquoted && rpseudo.test( unquoted ) &&
+ // Get excess from tokenize (recursively)
+ (excess = tokenize( unquoted, true )) &&
+ // advance to the next closing parenthesis
+ (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+ // excess is a negative index
+ match[0] = match[0].slice( 0, excess );
+ match[2] = unquoted.slice( 0, excess );
+ }
+
+ // Return only captures needed by the pseudo filter method (type and argument)
+ return match.slice( 0, 3 );
+ }
+ },
+
+ filter: {
+
+ "TAG": function( nodeNameSelector ) {
+ var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
+ return nodeNameSelector === "*" ?
+ function() { return true; } :
+ function( elem ) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+ };
+ },
+
+ "CLASS": function( className ) {
+ var pattern = classCache[ className + " " ];
+
+ return pattern ||
+ (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
+ classCache( className, function( elem ) {
+ return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
+ });
+ },
+
+ "ATTR": function( name, operator, check ) {
+ return function( elem ) {
+ var result = Sizzle.attr( elem, name );
+
+ if ( result == null ) {
+ return operator === "!=";
+ }
+ if ( !operator ) {
+ return true;
+ }
+
+ result += "";
+
+ return operator === "=" ? result === check :
+ operator === "!=" ? result !== check :
+ operator === "^=" ? check && result.indexOf( check ) === 0 :
+ operator === "*=" ? check && result.indexOf( check ) > -1 :
+ operator === "$=" ? check && result.slice( -check.length ) === check :
+ operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
+ operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
+ false;
+ };
+ },
+
+ "CHILD": function( type, what, argument, first, last ) {
+ var simple = type.slice( 0, 3 ) !== "nth",
+ forward = type.slice( -4 ) !== "last",
+ ofType = what === "of-type";
+
+ return first === 1 && last === 0 ?
+
+ // Shortcut for :nth-*(n)
+ function( elem ) {
+ return !!elem.parentNode;
+ } :
+
+ function( elem, context, xml ) {
+ var cache, uniqueCache, outerCache, node, nodeIndex, start,
+ dir = simple !== forward ? "nextSibling" : "previousSibling",
+ parent = elem.parentNode,
+ name = ofType && elem.nodeName.toLowerCase(),
+ useCache = !xml && !ofType,
+ diff = false;
+
+ if ( parent ) {
+
+ // :(first|last|only)-(child|of-type)
+ if ( simple ) {
+ while ( dir ) {
+ node = elem;
+ while ( (node = node[ dir ]) ) {
+ if ( ofType ?
+ node.nodeName.toLowerCase() === name :
+ node.nodeType === 1 ) {
+
+ return false;
+ }
+ }
+ // Reverse direction for :only-* (if we haven't yet done so)
+ start = dir = type === "only" && !start && "nextSibling";
+ }
+ return true;
+ }
+
+ start = [ forward ? parent.firstChild : parent.lastChild ];
+
+ // non-xml :nth-child(...) stores cache data on `parent`
+ if ( forward && useCache ) {
+
+ // Seek `elem` from a previously-cached index
+
+ // ...in a gzip-friendly way
+ node = parent;
+ outerCache = node[ expando ] || (node[ expando ] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ node.uniqueID ] ||
+ (outerCache[ node.uniqueID ] = {});
+
+ cache = uniqueCache[ type ] || [];
+ nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+ diff = nodeIndex && cache[ 2 ];
+ node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+
+ // Fallback to seeking `elem` from the start
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ // When found, cache indexes on `parent` and break
+ if ( node.nodeType === 1 && ++diff && node === elem ) {
+ uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
+ break;
+ }
+ }
+
+ } else {
+ // Use previously-cached element index if available
+ if ( useCache ) {
+ // ...in a gzip-friendly way
+ node = elem;
+ outerCache = node[ expando ] || (node[ expando ] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ node.uniqueID ] ||
+ (outerCache[ node.uniqueID ] = {});
+
+ cache = uniqueCache[ type ] || [];
+ nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
+ diff = nodeIndex;
+ }
+
+ // xml :nth-child(...)
+ // or :nth-last-child(...) or :nth(-last)?-of-type(...)
+ if ( diff === false ) {
+ // Use the same loop as above to seek `elem` from the start
+ while ( (node = ++nodeIndex && node && node[ dir ] ||
+ (diff = nodeIndex = 0) || start.pop()) ) {
+
+ if ( ( ofType ?
+ node.nodeName.toLowerCase() === name :
+ node.nodeType === 1 ) &&
+ ++diff ) {
+
+ // Cache the index of each encountered element
+ if ( useCache ) {
+ outerCache = node[ expando ] || (node[ expando ] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ node.uniqueID ] ||
+ (outerCache[ node.uniqueID ] = {});
+
+ uniqueCache[ type ] = [ dirruns, diff ];
+ }
+
+ if ( node === elem ) {
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ // Incorporate the offset, then check against cycle size
+ diff -= last;
+ return diff === first || ( diff % first === 0 && diff / first >= 0 );
+ }
+ };
+ },
+
+ "PSEUDO": function( pseudo, argument ) {
+ // pseudo-class names are case-insensitive
+ // http://www.w3.org/TR/selectors/#pseudo-classes
+ // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+ // Remember that setFilters inherits from pseudos
+ var args,
+ fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+ Sizzle.error( "unsupported pseudo: " + pseudo );
+
+ // The user may use createPseudo to indicate that
+ // arguments are needed to create the filter function
+ // just as Sizzle does
+ if ( fn[ expando ] ) {
+ return fn( argument );
+ }
+
+ // But maintain support for old signatures
+ if ( fn.length > 1 ) {
+ args = [ pseudo, pseudo, "", argument ];
+ return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+ markFunction(function( seed, matches ) {
+ var idx,
+ matched = fn( seed, argument ),
+ i = matched.length;
+ while ( i-- ) {
+ idx = indexOf( seed, matched[i] );
+ seed[ idx ] = !( matches[ idx ] = matched[i] );
+ }
+ }) :
+ function( elem ) {
+ return fn( elem, 0, args );
+ };
+ }
+
+ return fn;
+ }
+ },
+
+ pseudos: {
+ // Potentially complex pseudos
+ "not": markFunction(function( selector ) {
+ // Trim the selector passed to compile
+ // to avoid treating leading and trailing
+ // spaces as combinators
+ var input = [],
+ results = [],
+ matcher = compile( selector.replace( rtrim, "$1" ) );
+
+ return matcher[ expando ] ?
+ markFunction(function( seed, matches, context, xml ) {
+ var elem,
+ unmatched = matcher( seed, null, xml, [] ),
+ i = seed.length;
+
+ // Match elements unmatched by `matcher`
+ while ( i-- ) {
+ if ( (elem = unmatched[i]) ) {
+ seed[i] = !(matches[i] = elem);
+ }
+ }
+ }) :
+ function( elem, context, xml ) {
+ input[0] = elem;
+ matcher( input, null, xml, results );
+ // Don't keep the element (issue #299)
+ input[0] = null;
+ return !results.pop();
+ };
+ }),
+
+ "has": markFunction(function( selector ) {
+ return function( elem ) {
+ return Sizzle( selector, elem ).length > 0;
+ };
+ }),
+
+ "contains": markFunction(function( text ) {
+ text = text.replace( runescape, funescape );
+ return function( elem ) {
+ return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
+ };
+ }),
+
+ // "Whether an element is represented by a :lang() selector
+ // is based solely on the element's language value
+ // being equal to the identifier C,
+ // or beginning with the identifier C immediately followed by "-".
+ // The matching of C against the element's language value is performed case-insensitively.
+ // The identifier C does not have to be a valid language name."
+ // http://www.w3.org/TR/selectors/#lang-pseudo
+ "lang": markFunction( function( lang ) {
+ // lang value must be a valid identifier
+ if ( !ridentifier.test(lang || "") ) {
+ Sizzle.error( "unsupported lang: " + lang );
+ }
+ lang = lang.replace( runescape, funescape ).toLowerCase();
+ return function( elem ) {
+ var elemLang;
+ do {
+ if ( (elemLang = documentIsHTML ?
+ elem.lang :
+ elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
+
+ elemLang = elemLang.toLowerCase();
+ return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+ }
+ } while ( (elem = elem.parentNode) && elem.nodeType === 1 );
+ return false;
+ };
+ }),
+
+ // Miscellaneous
+ "target": function( elem ) {
+ var hash = window.location && window.location.hash;
+ return hash && hash.slice( 1 ) === elem.id;
+ },
+
+ "root": function( elem ) {
+ return elem === docElem;
+ },
+
+ "focus": function( elem ) {
+ return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+ },
+
+ // Boolean properties
+ "enabled": createDisabledPseudo( false ),
+ "disabled": createDisabledPseudo( true ),
+
+ "checked": function( elem ) {
+ // In CSS3, :checked should return both checked and selected elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ var nodeName = elem.nodeName.toLowerCase();
+ return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+ },
+
+ "selected": function( elem ) {
+ // Accessing this property makes selected-by-default
+ // options in Safari work properly
+ if ( elem.parentNode ) {
+ elem.parentNode.selectedIndex;
+ }
+
+ return elem.selected === true;
+ },
+
+ // Contents
+ "empty": function( elem ) {
+ // http://www.w3.org/TR/selectors/#empty-pseudo
+ // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
+ // but not by others (comment: 8; processing instruction: 7; etc.)
+ // nodeType < 6 works because attributes (2) do not appear as children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+ if ( elem.nodeType < 6 ) {
+ return false;
+ }
+ }
+ return true;
+ },
+
+ "parent": function( elem ) {
+ return !Expr.pseudos["empty"]( elem );
+ },
+
+ // Element/input types
+ "header": function( elem ) {
+ return rheader.test( elem.nodeName );
+ },
+
+ "input": function( elem ) {
+ return rinputs.test( elem.nodeName );
+ },
+
+ "button": function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === "button" || name === "button";
+ },
+
+ "text": function( elem ) {
+ var attr;
+ return elem.nodeName.toLowerCase() === "input" &&
+ elem.type === "text" &&
+
+ // Support: IE<8
+ // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
+ ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
+ },
+
+ // Position-in-collection
+ "first": createPositionalPseudo(function() {
+ return [ 0 ];
+ }),
+
+ "last": createPositionalPseudo(function( matchIndexes, length ) {
+ return [ length - 1 ];
+ }),
+
+ "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ return [ argument < 0 ? argument + length : argument ];
+ }),
+
+ "even": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 0;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "odd": createPositionalPseudo(function( matchIndexes, length ) {
+ var i = 1;
+ for ( ; i < length; i += 2 ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; --i >= 0; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ }),
+
+ "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+ var i = argument < 0 ? argument + length : argument;
+ for ( ; ++i < length; ) {
+ matchIndexes.push( i );
+ }
+ return matchIndexes;
+ })
+ }
+};
+
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+ Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+ Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+// Easy API for creating new setFilters
+function setFilters() {}
+setFilters.prototype = Expr.filters = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
+ var matched, match, tokens, type,
+ soFar, groups, preFilters,
+ cached = tokenCache[ selector + " " ];
+
+ if ( cached ) {
+ return parseOnly ? 0 : cached.slice( 0 );
+ }
+
+ soFar = selector;
+ groups = [];
+ preFilters = Expr.preFilter;
+
+ while ( soFar ) {
+
+ // Comma and first run
+ if ( !matched || (match = rcomma.exec( soFar )) ) {
+ if ( match ) {
+ // Don't consume trailing commas as valid
+ soFar = soFar.slice( match[0].length ) || soFar;
+ }
+ groups.push( (tokens = []) );
+ }
+
+ matched = false;
+
+ // Combinators
+ if ( (match = rcombinators.exec( soFar )) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ // Cast descendant combinators to space
+ type: match[0].replace( rtrim, " " )
+ });
+ soFar = soFar.slice( matched.length );
+ }
+
+ // Filters
+ for ( type in Expr.filter ) {
+ if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+ (match = preFilters[ type ]( match ))) ) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ type: type,
+ matches: match
+ });
+ soFar = soFar.slice( matched.length );
+ }
+ }
+
+ if ( !matched ) {
+ break;
+ }
+ }
+
+ // Return the length of the invalid excess
+ // if we're just parsing
+ // Otherwise, throw an error or return tokens
+ return parseOnly ?
+ soFar.length :
+ soFar ?
+ Sizzle.error( selector ) :
+ // Cache the tokens
+ tokenCache( selector, groups ).slice( 0 );
+};
+
+function toSelector( tokens ) {
+ var i = 0,
+ len = tokens.length,
+ selector = "";
+ for ( ; i < len; i++ ) {
+ selector += tokens[i].value;
+ }
+ return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+ var dir = combinator.dir,
+ skip = combinator.next,
+ key = skip || dir,
+ checkNonElements = base && key === "parentNode",
+ doneName = done++;
+
+ return combinator.first ?
+ // Check against closest ancestor/preceding element
+ function( elem, context, xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ return matcher( elem, context, xml );
+ }
+ }
+ return false;
+ } :
+
+ // Check against all ancestor/preceding elements
+ function( elem, context, xml ) {
+ var oldCache, uniqueCache, outerCache,
+ newCache = [ dirruns, doneName ];
+
+ // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
+ if ( xml ) {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ if ( matcher( elem, context, xml ) ) {
+ return true;
+ }
+ }
+ }
+ } else {
+ while ( (elem = elem[ dir ]) ) {
+ if ( elem.nodeType === 1 || checkNonElements ) {
+ outerCache = elem[ expando ] || (elem[ expando ] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});
+
+ if ( skip && skip === elem.nodeName.toLowerCase() ) {
+ elem = elem[ dir ] || elem;
+ } else if ( (oldCache = uniqueCache[ key ]) &&
+ oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {
+
+ // Assign to newCache so results back-propagate to previous elements
+ return (newCache[ 2 ] = oldCache[ 2 ]);
+ } else {
+ // Reuse newcache so results back-propagate to previous elements
+ uniqueCache[ key ] = newCache;
+
+ // A match means we're done; a fail means we have to keep checking
+ if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ return false;
+ };
+}
+
+function elementMatcher( matchers ) {
+ return matchers.length > 1 ?
+ function( elem, context, xml ) {
+ var i = matchers.length;
+ while ( i-- ) {
+ if ( !matchers[i]( elem, context, xml ) ) {
+ return false;
+ }
+ }
+ return true;
+ } :
+ matchers[0];
+}
+
+function multipleContexts( selector, contexts, results ) {
+ var i = 0,
+ len = contexts.length;
+ for ( ; i < len; i++ ) {
+ Sizzle( selector, contexts[i], results );
+ }
+ return results;
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+ var elem,
+ newUnmatched = [],
+ i = 0,
+ len = unmatched.length,
+ mapped = map != null;
+
+ for ( ; i < len; i++ ) {
+ if ( (elem = unmatched[i]) ) {
+ if ( !filter || filter( elem, context, xml ) ) {
+ newUnmatched.push( elem );
+ if ( mapped ) {
+ map.push( i );
+ }
+ }
+ }
+ }
+
+ return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+ if ( postFilter && !postFilter[ expando ] ) {
+ postFilter = setMatcher( postFilter );
+ }
+ if ( postFinder && !postFinder[ expando ] ) {
+ postFinder = setMatcher( postFinder, postSelector );
+ }
+ return markFunction(function( seed, results, context, xml ) {
+ var temp, i, elem,
+ preMap = [],
+ postMap = [],
+ preexisting = results.length,
+
+ // Get initial elements from seed or context
+ elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+
+ // Prefilter to get matcher input, preserving a map for seed-results synchronization
+ matcherIn = preFilter && ( seed || !selector ) ?
+ condense( elems, preMap, preFilter, context, xml ) :
+ elems,
+
+ matcherOut = matcher ?
+ // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+ postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+ // ...intermediate processing is necessary
+ [] :
+
+ // ...otherwise use results directly
+ results :
+ matcherIn;
+
+ // Find primary matches
+ if ( matcher ) {
+ matcher( matcherIn, matcherOut, context, xml );
+ }
+
+ // Apply postFilter
+ if ( postFilter ) {
+ temp = condense( matcherOut, postMap );
+ postFilter( temp, [], context, xml );
+
+ // Un-match failing elements by moving them back to matcherIn
+ i = temp.length;
+ while ( i-- ) {
+ if ( (elem = temp[i]) ) {
+ matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+ }
+ }
+ }
+
+ if ( seed ) {
+ if ( postFinder || preFilter ) {
+ if ( postFinder ) {
+ // Get the final matcherOut by condensing this intermediate into postFinder contexts
+ temp = [];
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) ) {
+ // Restore matcherIn since elem is not yet a final match
+ temp.push( (matcherIn[i] = elem) );
+ }
+ }
+ postFinder( null, (matcherOut = []), temp, xml );
+ }
+
+ // Move matched elements from seed to results to keep them synchronized
+ i = matcherOut.length;
+ while ( i-- ) {
+ if ( (elem = matcherOut[i]) &&
+ (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {
+
+ seed[temp] = !(results[temp] = elem);
+ }
+ }
+ }
+
+ // Add elements to results, through postFinder if defined
+ } else {
+ matcherOut = condense(
+ matcherOut === results ?
+ matcherOut.splice( preexisting, matcherOut.length ) :
+ matcherOut
+ );
+ if ( postFinder ) {
+ postFinder( null, results, matcherOut, xml );
+ } else {
+ push.apply( results, matcherOut );
+ }
+ }
+ });
+}
+
+function matcherFromTokens( tokens ) {
+ var checkContext, matcher, j,
+ len = tokens.length,
+ leadingRelative = Expr.relative[ tokens[0].type ],
+ implicitRelative = leadingRelative || Expr.relative[" "],
+ i = leadingRelative ? 1 : 0,
+
+ // The foundational matcher ensures that elements are reachable from top-level context(s)
+ matchContext = addCombinator( function( elem ) {
+ return elem === checkContext;
+ }, implicitRelative, true ),
+ matchAnyContext = addCombinator( function( elem ) {
+ return indexOf( checkContext, elem ) > -1;
+ }, implicitRelative, true ),
+ matchers = [ function( elem, context, xml ) {
+ var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+ (checkContext = context).nodeType ?
+ matchContext( elem, context, xml ) :
+ matchAnyContext( elem, context, xml ) );
+ // Avoid hanging onto element (issue #299)
+ checkContext = null;
+ return ret;
+ } ];
+
+ for ( ; i < len; i++ ) {
+ if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+ matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
+ } else {
+ matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+ // Return special upon seeing a positional matcher
+ if ( matcher[ expando ] ) {
+ // Find the next relative operator (if any) for proper handling
+ j = ++i;
+ for ( ; j < len; j++ ) {
+ if ( Expr.relative[ tokens[j].type ] ) {
+ break;
+ }
+ }
+ return setMatcher(
+ i > 1 && elementMatcher( matchers ),
+ i > 1 && toSelector(
+ // If the preceding token was a descendant combinator, insert an implicit any-element `*`
+ tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
+ ).replace( rtrim, "$1" ),
+ matcher,
+ i < j && matcherFromTokens( tokens.slice( i, j ) ),
+ j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+ j < len && toSelector( tokens )
+ );
+ }
+ matchers.push( matcher );
+ }
+ }
+
+ return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+ var bySet = setMatchers.length > 0,
+ byElement = elementMatchers.length > 0,
+ superMatcher = function( seed, context, xml, results, outermost ) {
+ var elem, j, matcher,
+ matchedCount = 0,
+ i = "0",
+ unmatched = seed && [],
+ setMatched = [],
+ contextBackup = outermostContext,
+ // We must always have either seed elements or outermost context
+ elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
+ // Use integer dirruns iff this is the outermost matcher
+ dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
+ len = elems.length;
+
+ if ( outermost ) {
+ outermostContext = context === document || context || outermost;
+ }
+
+ // Add elements passing elementMatchers directly to results
+ // Support: IE<9, Safari
+ // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
+ for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
+ if ( byElement && elem ) {
+ j = 0;
+ if ( !context && elem.ownerDocument !== document ) {
+ setDocument( elem );
+ xml = !documentIsHTML;
+ }
+ while ( (matcher = elementMatchers[j++]) ) {
+ if ( matcher( elem, context || document, xml) ) {
+ results.push( elem );
+ break;
+ }
+ }
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ }
+ }
+
+ // Track unmatched elements for set filters
+ if ( bySet ) {
+ // They will have gone through all possible matchers
+ if ( (elem = !matcher && elem) ) {
+ matchedCount--;
+ }
+
+ // Lengthen the array for every element, matched or not
+ if ( seed ) {
+ unmatched.push( elem );
+ }
+ }
+ }
+
+ // `i` is now the count of elements visited above, and adding it to `matchedCount`
+ // makes the latter nonnegative.
+ matchedCount += i;
+
+ // Apply set filters to unmatched elements
+ // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
+ // equals `i`), unless we didn't visit _any_ elements in the above loop because we have
+ // no element matchers and no seed.
+ // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
+ // case, which will result in a "00" `matchedCount` that differs from `i` but is also
+ // numerically zero.
+ if ( bySet && i !== matchedCount ) {
+ j = 0;
+ while ( (matcher = setMatchers[j++]) ) {
+ matcher( unmatched, setMatched, context, xml );
+ }
+
+ if ( seed ) {
+ // Reintegrate element matches to eliminate the need for sorting
+ if ( matchedCount > 0 ) {
+ while ( i-- ) {
+ if ( !(unmatched[i] || setMatched[i]) ) {
+ setMatched[i] = pop.call( results );
+ }
+ }
+ }
+
+ // Discard index placeholder values to get only actual matches
+ setMatched = condense( setMatched );
+ }
+
+ // Add matches to results
+ push.apply( results, setMatched );
+
+ // Seedless set matches succeeding multiple successful matchers stipulate sorting
+ if ( outermost && !seed && setMatched.length > 0 &&
+ ( matchedCount + setMatchers.length ) > 1 ) {
+
+ Sizzle.uniqueSort( results );
+ }
+ }
+
+ // Override manipulation of globals by nested matchers
+ if ( outermost ) {
+ dirruns = dirrunsUnique;
+ outermostContext = contextBackup;
+ }
+
+ return unmatched;
+ };
+
+ return bySet ?
+ markFunction( superMatcher ) :
+ superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
+ var i,
+ setMatchers = [],
+ elementMatchers = [],
+ cached = compilerCache[ selector + " " ];
+
+ if ( !cached ) {
+ // Generate a function of recursive functions that can be used to check each element
+ if ( !match ) {
+ match = tokenize( selector );
+ }
+ i = match.length;
+ while ( i-- ) {
+ cached = matcherFromTokens( match[i] );
+ if ( cached[ expando ] ) {
+ setMatchers.push( cached );
+ } else {
+ elementMatchers.push( cached );
+ }
+ }
+
+ // Cache the compiled function
+ cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+
+ // Save selector and tokenization
+ cached.selector = selector;
+ }
+ return cached;
+};
+
+/**
+ * A low-level selection function that works with Sizzle's compiled
+ * selector functions
+ * @param {String|Function} selector A selector or a pre-compiled
+ * selector function built with Sizzle.compile
+ * @param {Element} context
+ * @param {Array} [results]
+ * @param {Array} [seed] A set of elements to match against
+ */
+select = Sizzle.select = function( selector, context, results, seed ) {
+ var i, tokens, token, type, find,
+ compiled = typeof selector === "function" && selector,
+ match = !seed && tokenize( (selector = compiled.selector || selector) );
+
+ results = results || [];
+
+ // Try to minimize operations if there is only one selector in the list and no seed
+ // (the latter of which guarantees us context)
+ if ( match.length === 1 ) {
+
+ // Reduce context if the leading compound selector is an ID
+ tokens = match[0] = match[0].slice( 0 );
+ if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+ context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {
+
+ context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
+ if ( !context ) {
+ return results;
+
+ // Precompiled matchers will still verify ancestry, so step up a level
+ } else if ( compiled ) {
+ context = context.parentNode;
+ }
+
+ selector = selector.slice( tokens.shift().value.length );
+ }
+
+ // Fetch a seed set for right-to-left matching
+ i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
+ while ( i-- ) {
+ token = tokens[i];
+
+ // Abort if we hit a combinator
+ if ( Expr.relative[ (type = token.type) ] ) {
+ break;
+ }
+ if ( (find = Expr.find[ type ]) ) {
+ // Search, expanding context for leading sibling combinators
+ if ( (seed = find(
+ token.matches[0].replace( runescape, funescape ),
+ rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
+ )) ) {
+
+ // If seed is empty or no tokens remain, we can return early
+ tokens.splice( i, 1 );
+ selector = seed.length && toSelector( tokens );
+ if ( !selector ) {
+ push.apply( results, seed );
+ return results;
+ }
+
+ break;
+ }
+ }
+ }
+ }
+
+ // Compile and execute a filtering function if one is not provided
+ // Provide `match` to avoid retokenization if we modified the selector above
+ ( compiled || compile( selector, match ) )(
+ seed,
+ context,
+ !documentIsHTML,
+ results,
+ !context || rsibling.test( selector ) && testContext( context.parentNode ) || context
+ );
+ return results;
+};
+
+// One-time assignments
+
+// Sort stability
+support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;
+
+// Support: Chrome 14-35+
+// Always assume duplicates if they aren't passed to the comparison function
+support.detectDuplicates = !!hasDuplicate;
+
+// Initialize against the default document
+setDocument();
+
+// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+// Detached nodes confoundingly follow *each other*
+support.sortDetached = assert(function( el ) {
+ // Should return 1, but returns 4 (following)
+ return el.compareDocumentPosition( document.createElement("fieldset") ) & 1;
+});
+
+// Support: IE<8
+// Prevent attribute/property "interpolation"
+// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !assert(function( el ) {
+ el.innerHTML = "<a href='#'></a>";
+ return el.firstChild.getAttribute("href") === "#" ;
+}) ) {
+ addHandle( "type|href|height|width", function( elem, name, isXML ) {
+ if ( !isXML ) {
+ return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
+ }
+ });
+}
+
+// Support: IE<9
+// Use defaultValue in place of getAttribute("value")
+if ( !support.attributes || !assert(function( el ) {
+ el.innerHTML = "<input/>";
+ el.firstChild.setAttribute( "value", "" );
+ return el.firstChild.getAttribute( "value" ) === "";
+}) ) {
+ addHandle( "value", function( elem, name, isXML ) {
+ if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
+ return elem.defaultValue;
+ }
+ });
+}
+
+// Support: IE<9
+// Use getAttributeNode to fetch booleans when getAttribute lies
+if ( !assert(function( el ) {
+ return el.getAttribute("disabled") == null;
+}) ) {
+ addHandle( booleans, function( elem, name, isXML ) {
+ var val;
+ if ( !isXML ) {
+ return elem[ name ] === true ? name.toLowerCase() :
+ (val = elem.getAttributeNode( name )) && val.specified ?
+ val.value :
+ null;
+ }
+ });
+}
+
+return Sizzle;
+
+})( window );
+
+
+
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+
+// Deprecated
+jQuery.expr[ ":" ] = jQuery.expr.pseudos;
+jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+jQuery.escapeSelector = Sizzle.escape;
+
+
+
+
+var dir = function( elem, dir, until ) {
+ var matched = [],
+ truncate = until !== undefined;
+
+ while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
+ if ( elem.nodeType === 1 ) {
+ if ( truncate && jQuery( elem ).is( until ) ) {
+ break;
+ }
+ matched.push( elem );
+ }
+ }
+ return matched;
+};
+
+
+var siblings = function( n, elem ) {
+ var matched = [];
+
+ for ( ; n; n = n.nextSibling ) {
+ if ( n.nodeType === 1 && n !== elem ) {
+ matched.push( n );
+ }
+ }
+
+ return matched;
+};
+
+
+var rneedsContext = jQuery.expr.match.needsContext;
+
+
+
+function nodeName( elem, name ) {
+
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+
+};
+var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
+
+
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, not ) {
+ if ( isFunction( qualifier ) ) {
+ return jQuery.grep( elements, function( elem, i ) {
+ return !!qualifier.call( elem, i, elem ) !== not;
+ } );
+ }
+
+ // Single element
+ if ( qualifier.nodeType ) {
+ return jQuery.grep( elements, function( elem ) {
+ return ( elem === qualifier ) !== not;
+ } );
+ }
+
+ // Arraylike of elements (jQuery, arguments, Array)
+ if ( typeof qualifier !== "string" ) {
+ return jQuery.grep( elements, function( elem ) {
+ return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
+ } );
+ }
+
+ // Filtered directly for both simple and complex selectors
+ return jQuery.filter( qualifier, elements, not );
+}
+
+jQuery.filter = function( expr, elems, not ) {
+ var elem = elems[ 0 ];
+
+ if ( not ) {
+ expr = ":not(" + expr + ")";
+ }
+
+ if ( elems.length === 1 && elem.nodeType === 1 ) {
+ return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];
+ }
+
+ return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
+ return elem.nodeType === 1;
+ } ) );
+};
+
+jQuery.fn.extend( {
+ find: function( selector ) {
+ var i, ret,
+ len = this.length,
+ self = this;
+
+ if ( typeof selector !== "string" ) {
+ return this.pushStack( jQuery( selector ).filter( function() {
+ for ( i = 0; i < len; i++ ) {
+ if ( jQuery.contains( self[ i ], this ) ) {
+ return true;
+ }
+ }
+ } ) );
+ }
+
+ ret = this.pushStack( [] );
+
+ for ( i = 0; i < len; i++ ) {
+ jQuery.find( selector, self[ i ], ret );
+ }
+
+ return len > 1 ? jQuery.uniqueSort( ret ) : ret;
+ },
+ filter: function( selector ) {
+ return this.pushStack( winnow( this, selector || [], false ) );
+ },
+ not: function( selector ) {
+ return this.pushStack( winnow( this, selector || [], true ) );
+ },
+ is: function( selector ) {
+ return !!winnow(
+ this,
+
+ // If this is a positional/relative selector, check membership in the returned set
+ // so $("p:first").is("p:last") won't return true for a doc with two "p".
+ typeof selector === "string" && rneedsContext.test( selector ) ?
+ jQuery( selector ) :
+ selector || [],
+ false
+ ).length;
+ }
+} );
+
+
+// Initialize a jQuery object
+
+
+// A central reference to the root jQuery(document)
+var rootjQuery,
+
+ // A simple way to check for HTML strings
+ // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+ // Strict HTML recognition (#11290: must start with <)
+ // Shortcut simple #id case for speed
+ rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
+
+ init = jQuery.fn.init = function( selector, context, root ) {
+ var match, elem;
+
+ // HANDLE: $(""), $(null), $(undefined), $(false)
+ if ( !selector ) {
+ return this;
+ }
+
+ // Method init() accepts an alternate rootjQuery
+ // so migrate can support jQuery.sub (gh-2101)
+ root = root || rootjQuery;
+
+ // Handle HTML strings
+ if ( typeof selector === "string" ) {
+ if ( selector[ 0 ] === "<" &&
+ selector[ selector.length - 1 ] === ">" &&
+ selector.length >= 3 ) {
+
+ // Assume that strings that start and end with <> are HTML and skip the regex check
+ match = [ null, selector, null ];
+
+ } else {
+ match = rquickExpr.exec( selector );
+ }
+
+ // Match html or make sure no context is specified for #id
+ if ( match && ( match[ 1 ] || !context ) ) {
+
+ // HANDLE: $(html) -> $(array)
+ if ( match[ 1 ] ) {
+ context = context instanceof jQuery ? context[ 0 ] : context;
+
+ // Option to run scripts is true for back-compat
+ // Intentionally let the error be thrown if parseHTML is not present
+ jQuery.merge( this, jQuery.parseHTML(
+ match[ 1 ],
+ context && context.nodeType ? context.ownerDocument || context : document,
+ true
+ ) );
+
+ // HANDLE: $(html, props)
+ if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
+ for ( match in context ) {
+
+ // Properties of context are called as methods if possible
+ if ( isFunction( this[ match ] ) ) {
+ this[ match ]( context[ match ] );
+
+ // ...and otherwise set as attributes
+ } else {
+ this.attr( match, context[ match ] );
+ }
+ }
+ }
+
+ return this;
+
+ // HANDLE: $(#id)
+ } else {
+ elem = document.getElementById( match[ 2 ] );
+
+ if ( elem ) {
+
+ // Inject the element directly into the jQuery object
+ this[ 0 ] = elem;
+ this.length = 1;
+ }
+ return this;
+ }
+
+ // HANDLE: $(expr, $(...))
+ } else if ( !context || context.jquery ) {
+ return ( context || root ).find( selector );
+
+ // HANDLE: $(expr, context)
+ // (which is just equivalent to: $(context).find(expr)
+ } else {
+ return this.constructor( context ).find( selector );
+ }
+
+ // HANDLE: $(DOMElement)
+ } else if ( selector.nodeType ) {
+ this[ 0 ] = selector;
+ this.length = 1;
+ return this;
+
+ // HANDLE: $(function)
+ // Shortcut for document ready
+ } else if ( isFunction( selector ) ) {
+ return root.ready !== undefined ?
+ root.ready( selector ) :
+
+ // Execute immediately if ready is not present
+ selector( jQuery );
+ }
+
+ return jQuery.makeArray( selector, this );
+ };
+
+// Give the init function the jQuery prototype for later instantiation
+init.prototype = jQuery.fn;
+
+// Initialize central reference
+rootjQuery = jQuery( document );
+
+
+var rparentsprev = /^(?:parents|prev(?:Until|All))/,
+
+ // Methods guaranteed to produce a unique set when starting from a unique set
+ guaranteedUnique = {
+ children: true,
+ contents: true,
+ next: true,
+ prev: true
+ };
+
+jQuery.fn.extend( {
+ has: function( target ) {
+ var targets = jQuery( target, this ),
+ l = targets.length;
+
+ return this.filter( function() {
+ var i = 0;
+ for ( ; i < l; i++ ) {
+ if ( jQuery.contains( this, targets[ i ] ) ) {
+ return true;
+ }
+ }
+ } );
+ },
+
+ closest: function( selectors, context ) {
+ var cur,
+ i = 0,
+ l = this.length,
+ matched = [],
+ targets = typeof selectors !== "string" && jQuery( selectors );
+
+ // Positional selectors never match, since there's no _selection_ context
+ if ( !rneedsContext.test( selectors ) ) {
+ for ( ; i < l; i++ ) {
+ for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {
+
+ // Always skip document fragments
+ if ( cur.nodeType < 11 && ( targets ?
+ targets.index( cur ) > -1 :
+
+ // Don't pass non-elements to Sizzle
+ cur.nodeType === 1 &&
+ jQuery.find.matchesSelector( cur, selectors ) ) ) {
+
+ matched.push( cur );
+ break;
+ }
+ }
+ }
+ }
+
+ return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
+ },
+
+ // Determine the position of an element within the set
+ index: function( elem ) {
+
+ // No argument, return index in parent
+ if ( !elem ) {
+ return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
+ }
+
+ // Index in selector
+ if ( typeof elem === "string" ) {
+ return indexOf.call( jQuery( elem ), this[ 0 ] );
+ }
+
+ // Locate the position of the desired element
+ return indexOf.call( this,
+
+ // If it receives a jQuery object, the first element is used
+ elem.jquery ? elem[ 0 ] : elem
+ );
+ },
+
+ add: function( selector, context ) {
+ return this.pushStack(
+ jQuery.uniqueSort(
+ jQuery.merge( this.get(), jQuery( selector, context ) )
+ )
+ );
+ },
+
+ addBack: function( selector ) {
+ return this.add( selector == null ?
+ this.prevObject : this.prevObject.filter( selector )
+ );
+ }
+} );
+
+function sibling( cur, dir ) {
+ while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
+ return cur;
+}
+
+jQuery.each( {
+ parent: function( elem ) {
+ var parent = elem.parentNode;
+ return parent && parent.nodeType !== 11 ? parent : null;
+ },
+ parents: function( elem ) {
+ return dir( elem, "parentNode" );
+ },
+ parentsUntil: function( elem, i, until ) {
+ return dir( elem, "parentNode", until );
+ },
+ next: function( elem ) {
+ return sibling( elem, "nextSibling" );
+ },
+ prev: function( elem ) {
+ return sibling( elem, "previousSibling" );
+ },
+ nextAll: function( elem ) {
+ return dir( elem, "nextSibling" );
+ },
+ prevAll: function( elem ) {
+ return dir( elem, "previousSibling" );
+ },
+ nextUntil: function( elem, i, until ) {
+ return dir( elem, "nextSibling", until );
+ },
+ prevUntil: function( elem, i, until ) {
+ return dir( elem, "previousSibling", until );
+ },
+ siblings: function( elem ) {
+ return siblings( ( elem.parentNode || {} ).firstChild, elem );
+ },
+ children: function( elem ) {
+ return siblings( elem.firstChild );
+ },
+ contents: function( elem ) {
+ if ( nodeName( elem, "iframe" ) ) {
+ return elem.contentDocument;
+ }
+
+ // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
+ // Treat the template element as a regular one in browsers that
+ // don't support it.
+ if ( nodeName( elem, "template" ) ) {
+ elem = elem.content || elem;
+ }
+
+ return jQuery.merge( [], elem.childNodes );
+ }
+}, function( name, fn ) {
+ jQuery.fn[ name ] = function( until, selector ) {
+ var matched = jQuery.map( this, fn, until );
+
+ if ( name.slice( -5 ) !== "Until" ) {
+ selector = until;
+ }
+
+ if ( selector && typeof selector === "string" ) {
+ matched = jQuery.filter( selector, matched );
+ }
+
+ if ( this.length > 1 ) {
+
+ // Remove duplicates
+ if ( !guaranteedUnique[ name ] ) {
+ jQuery.uniqueSort( matched );
+ }
+
+ // Reverse order for parents* and prev-derivatives
+ if ( rparentsprev.test( name ) ) {
+ matched.reverse();
+ }
+ }
+
+ return this.pushStack( matched );
+ };
+} );
+var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g );
+
+
+
+// Convert String-formatted options into Object-formatted ones
+function createOptions( options ) {
+ var object = {};
+ jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {
+ object[ flag ] = true;
+ } );
+ return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ * options: an optional list of space-separated options that will change how
+ * the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ * once: will ensure the callback list can only be fired once (like a Deferred)
+ *
+ * memory: will keep track of previous values and will call any callback added
+ * after the list has been fired right away with the latest "memorized"
+ * values (like a Deferred)
+ *
+ * unique: will ensure a callback can only be added once (no duplicate in the list)
+ *
+ * stopOnFalse: interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+ // Convert options from String-formatted to Object-formatted if needed
+ // (we check in cache first)
+ options = typeof options === "string" ?
+ createOptions( options ) :
+ jQuery.extend( {}, options );
+
+ var // Flag to know if list is currently firing
+ firing,
+
+ // Last fire value for non-forgettable lists
+ memory,
+
+ // Flag to know if list was already fired
+ fired,
+
+ // Flag to prevent firing
+ locked,
+
+ // Actual callback list
+ list = [],
+
+ // Queue of execution data for repeatable lists
+ queue = [],
+
+ // Index of currently firing callback (modified by add/remove as needed)
+ firingIndex = -1,
+
+ // Fire callbacks
+ fire = function() {
+
+ // Enforce single-firing
+ locked = locked || options.once;
+
+ // Execute callbacks for all pending executions,
+ // respecting firingIndex overrides and runtime changes
+ fired = firing = true;
+ for ( ; queue.length; firingIndex = -1 ) {
+ memory = queue.shift();
+ while ( ++firingIndex < list.length ) {
+
+ // Run callback and check for early termination
+ if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
+ options.stopOnFalse ) {
+
+ // Jump to end and forget the data so .add doesn't re-fire
+ firingIndex = list.length;
+ memory = false;
+ }
+ }
+ }
+
+ // Forget the data if we're done with it
+ if ( !options.memory ) {
+ memory = false;
+ }
+
+ firing = false;
+
+ // Clean up if we're done firing for good
+ if ( locked ) {
+
+ // Keep an empty list if we have data for future add calls
+ if ( memory ) {
+ list = [];
+
+ // Otherwise, this object is spent
+ } else {
+ list = "";
+ }
+ }
+ },
+
+ // Actual Callbacks object
+ self = {
+
+ // Add a callback or a collection of callbacks to the list
+ add: function() {
+ if ( list ) {
+
+ // If we have memory from a past run, we should fire after adding
+ if ( memory && !firing ) {
+ firingIndex = list.length - 1;
+ queue.push( memory );
+ }
+
+ ( function add( args ) {
+ jQuery.each( args, function( _, arg ) {
+ if ( isFunction( arg ) ) {
+ if ( !options.unique || !self.has( arg ) ) {
+ list.push( arg );
+ }
+ } else if ( arg && arg.length && toType( arg ) !== "string" ) {
+
+ // Inspect recursively
+ add( arg );
+ }
+ } );
+ } )( arguments );
+
+ if ( memory && !firing ) {
+ fire();
+ }
+ }
+ return this;
+ },
+
+ // Remove a callback from the list
+ remove: function() {
+ jQuery.each( arguments, function( _, arg ) {
+ var index;
+ while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+ list.splice( index, 1 );
+
+ // Handle firing indexes
+ if ( index <= firingIndex ) {
+ firingIndex--;
+ }
+ }
+ } );
+ return this;
+ },
+
+ // Check if a given callback is in the list.
+ // If no argument is given, return whether or not list has callbacks attached.
+ has: function( fn ) {
+ return fn ?
+ jQuery.inArray( fn, list ) > -1 :
+ list.length > 0;
+ },
+
+ // Remove all callbacks from the list
+ empty: function() {
+ if ( list ) {
+ list = [];
+ }
+ return this;
+ },
+
+ // Disable .fire and .add
+ // Abort any current/pending executions
+ // Clear all callbacks and values
+ disable: function() {
+ locked = queue = [];
+ list = memory = "";
+ return this;
+ },
+ disabled: function() {
+ return !list;
+ },
+
+ // Disable .fire
+ // Also disable .add unless we have memory (since it would have no effect)
+ // Abort any pending executions
+ lock: function() {
+ locked = queue = [];
+ if ( !memory && !firing ) {
+ list = memory = "";
+ }
+ return this;
+ },
+ locked: function() {
+ return !!locked;
+ },
+
+ // Call all callbacks with the given context and arguments
+ fireWith: function( context, args ) {
+ if ( !locked ) {
+ args = args || [];
+ args = [ context, args.slice ? args.slice() : args ];
+ queue.push( args );
+ if ( !firing ) {
+ fire();
+ }
+ }
+ return this;
+ },
+
+ // Call all the callbacks with the given arguments
+ fire: function() {
+ self.fireWith( this, arguments );
+ return this;
+ },
+
+ // To know if the callbacks have already been called at least once
+ fired: function() {
+ return !!fired;
+ }
+ };
+
+ return self;
+};
+
+
+function Identity( v ) {
+ return v;
+}
+function Thrower( ex ) {
+ throw ex;
+}
+
+function adoptValue( value, resolve, reject, noValue ) {
+ var method;
+
+ try {
+
+ // Check for promise aspect first to privilege synchronous behavior
+ if ( value && isFunction( ( method = value.promise ) ) ) {
+ method.call( value ).done( resolve ).fail( reject );
+
+ // Other thenables
+ } else if ( value && isFunction( ( method = value.then ) ) ) {
+ method.call( value, resolve, reject );
+
+ // Other non-thenables
+ } else {
+
+ // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
+ // * false: [ value ].slice( 0 ) => resolve( value )
+ // * true: [ value ].slice( 1 ) => resolve()
+ resolve.apply( undefined, [ value ].slice( noValue ) );
+ }
+
+ // For Promises/A+, convert exceptions into rejections
+ // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
+ // Deferred#then to conditionally suppress rejection.
+ } catch ( value ) {
+
+ // Support: Android 4.0 only
+ // Strict mode functions invoked without .call/.apply get global-object context
+ reject.apply( undefined, [ value ] );
+ }
+}
+
+jQuery.extend( {
+
+ Deferred: function( func ) {
+ var tuples = [
+
+ // action, add listener, callbacks,
+ // ... .then handlers, argument index, [final state]
+ [ "notify", "progress", jQuery.Callbacks( "memory" ),
+ jQuery.Callbacks( "memory" ), 2 ],
+ [ "resolve", "done", jQuery.Callbacks( "once memory" ),
+ jQuery.Callbacks( "once memory" ), 0, "resolved" ],
+ [ "reject", "fail", jQuery.Callbacks( "once memory" ),
+ jQuery.Callbacks( "once memory" ), 1, "rejected" ]
+ ],
+ state = "pending",
+ promise = {
+ state: function() {
+ return state;
+ },
+ always: function() {
+ deferred.done( arguments ).fail( arguments );
+ return this;
+ },
+ "catch": function( fn ) {
+ return promise.then( null, fn );
+ },
+
+ // Keep pipe for back-compat
+ pipe: function( /* fnDone, fnFail, fnProgress */ ) {
+ var fns = arguments;
+
+ return jQuery.Deferred( function( newDefer ) {
+ jQuery.each( tuples, function( i, tuple ) {
+
+ // Map tuples (progress, done, fail) to arguments (done, fail, progress)
+ var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];
+
+ // deferred.progress(function() { bind to newDefer or newDefer.notify })
+ // deferred.done(function() { bind to newDefer or newDefer.resolve })
+ // deferred.fail(function() { bind to newDefer or newDefer.reject })
+ deferred[ tuple[ 1 ] ]( function() {
+ var returned = fn && fn.apply( this, arguments );
+ if ( returned && isFunction( returned.promise ) ) {
+ returned.promise()
+ .progress( newDefer.notify )
+ .done( newDefer.resolve )
+ .fail( newDefer.reject );
+ } else {
+ newDefer[ tuple[ 0 ] + "With" ](
+ this,
+ fn ? [ returned ] : arguments
+ );
+ }
+ } );
+ } );
+ fns = null;
+ } ).promise();
+ },
+ then: function( onFulfilled, onRejected, onProgress ) {
+ var maxDepth = 0;
+ function resolve( depth, deferred, handler, special ) {
+ return function() {
+ var that = this,
+ args = arguments,
+ mightThrow = function() {
+ var returned, then;
+
+ // Support: Promises/A+ section 2.3.3.3.3
+ // https://promisesaplus.com/#point-59
+ // Ignore double-resolution attempts
+ if ( depth < maxDepth ) {
+ return;
+ }
+
+ returned = handler.apply( that, args );
+
+ // Support: Promises/A+ section 2.3.1
+ // https://promisesaplus.com/#point-48
+ if ( returned === deferred.promise() ) {
+ throw new TypeError( "Thenable self-resolution" );
+ }
+
+ // Support: Promises/A+ sections 2.3.3.1, 3.5
+ // https://promisesaplus.com/#point-54
+ // https://promisesaplus.com/#point-75
+ // Retrieve `then` only once
+ then = returned &&
+
+ // Support: Promises/A+ section 2.3.4
+ // https://promisesaplus.com/#point-64
+ // Only check objects and functions for thenability
+ ( typeof returned === "object" ||
+ typeof returned === "function" ) &&
+ returned.then;
+
+ // Handle a returned thenable
+ if ( isFunction( then ) ) {
+
+ // Special processors (notify) just wait for resolution
+ if ( special ) {
+ then.call(
+ returned,
+ resolve( maxDepth, deferred, Identity, special ),
+ resolve( maxDepth, deferred, Thrower, special )
+ );
+
+ // Normal processors (resolve) also hook into progress
+ } else {
+
+ // ...and disregard older resolution values
+ maxDepth++;
+
+ then.call(
+ returned,
+ resolve( maxDepth, deferred, Identity, special ),
+ resolve( maxDepth, deferred, Thrower, special ),
+ resolve( maxDepth, deferred, Identity,
+ deferred.notifyWith )
+ );
+ }
+
+ // Handle all other returned values
+ } else {
+
+ // Only substitute handlers pass on context
+ // and multiple values (non-spec behavior)
+ if ( handler !== Identity ) {
+ that = undefined;
+ args = [ returned ];
+ }
+
+ // Process the value(s)
+ // Default process is resolve
+ ( special || deferred.resolveWith )( that, args );
+ }
+ },
+
+ // Only normal processors (resolve) catch and reject exceptions
+ process = special ?
+ mightThrow :
+ function() {
+ try {
+ mightThrow();
+ } catch ( e ) {
+
+ if ( jQuery.Deferred.exceptionHook ) {
+ jQuery.Deferred.exceptionHook( e,
+ process.stackTrace );
+ }
+
+ // Support: Promises/A+ section 2.3.3.3.4.1
+ // https://promisesaplus.com/#point-61
+ // Ignore post-resolution exceptions
+ if ( depth + 1 >= maxDepth ) {
+
+ // Only substitute handlers pass on context
+ // and multiple values (non-spec behavior)
+ if ( handler !== Thrower ) {
+ that = undefined;
+ args = [ e ];
+ }
+
+ deferred.rejectWith( that, args );
+ }
+ }
+ };
+
+ // Support: Promises/A+ section 2.3.3.3.1
+ // https://promisesaplus.com/#point-57
+ // Re-resolve promises immediately to dodge false rejection from
+ // subsequent errors
+ if ( depth ) {
+ process();
+ } else {
+
+ // Call an optional hook to record the stack, in case of exception
+ // since it's otherwise lost when execution goes async
+ if ( jQuery.Deferred.getStackHook ) {
+ process.stackTrace = jQuery.Deferred.getStackHook();
+ }
+ window.setTimeout( process );
+ }
+ };
+ }
+
+ return jQuery.Deferred( function( newDefer ) {
+
+ // progress_handlers.add( ... )
+ tuples[ 0 ][ 3 ].add(
+ resolve(
+ 0,
+ newDefer,
+ isFunction( onProgress ) ?
+ onProgress :
+ Identity,
+ newDefer.notifyWith
+ )
+ );
+
+ // fulfilled_handlers.add( ... )
+ tuples[ 1 ][ 3 ].add(
+ resolve(
+ 0,
+ newDefer,
+ isFunction( onFulfilled ) ?
+ onFulfilled :
+ Identity
+ )
+ );
+
+ // rejected_handlers.add( ... )
+ tuples[ 2 ][ 3 ].add(
+ resolve(
+ 0,
+ newDefer,
+ isFunction( onRejected ) ?
+ onRejected :
+ Thrower
+ )
+ );
+ } ).promise();
+ },
+
+ // Get a promise for this deferred
+ // If obj is provided, the promise aspect is added to the object
+ promise: function( obj ) {
+ return obj != null ? jQuery.extend( obj, promise ) : promise;
+ }
+ },
+ deferred = {};
+
+ // Add list-specific methods
+ jQuery.each( tuples, function( i, tuple ) {
+ var list = tuple[ 2 ],
+ stateString = tuple[ 5 ];
+
+ // promise.progress = list.add
+ // promise.done = list.add
+ // promise.fail = list.add
+ promise[ tuple[ 1 ] ] = list.add;
+
+ // Handle state
+ if ( stateString ) {
+ list.add(
+ function() {
+
+ // state = "resolved" (i.e., fulfilled)
+ // state = "rejected"
+ state = stateString;
+ },
+
+ // rejected_callbacks.disable
+ // fulfilled_callbacks.disable
+ tuples[ 3 - i ][ 2 ].disable,
+
+ // rejected_handlers.disable
+ // fulfilled_handlers.disable
+ tuples[ 3 - i ][ 3 ].disable,
+
+ // progress_callbacks.lock
+ tuples[ 0 ][ 2 ].lock,
+
+ // progress_handlers.lock
+ tuples[ 0 ][ 3 ].lock
+ );
+ }
+
+ // progress_handlers.fire
+ // fulfilled_handlers.fire
+ // rejected_handlers.fire
+ list.add( tuple[ 3 ].fire );
+
+ // deferred.notify = function() { deferred.notifyWith(...) }
+ // deferred.resolve = function() { deferred.resolveWith(...) }
+ // deferred.reject = function() { deferred.rejectWith(...) }
+ deferred[ tuple[ 0 ] ] = function() {
+ deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
+ return this;
+ };
+
+ // deferred.notifyWith = list.fireWith
+ // deferred.resolveWith = list.fireWith
+ // deferred.rejectWith = list.fireWith
+ deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
+ } );
+
+ // Make the deferred a promise
+ promise.promise( deferred );
+
+ // Call given func if any
+ if ( func ) {
+ func.call( deferred, deferred );
+ }
+
+ // All done!
+ return deferred;
+ },
+
+ // Deferred helper
+ when: function( singleValue ) {
+ var
+
+ // count of uncompleted subordinates
+ remaining = arguments.length,
+
+ // count of unprocessed arguments
+ i = remaining,
+
+ // subordinate fulfillment data
+ resolveContexts = Array( i ),
+ resolveValues = slice.call( arguments ),
+
+ // the master Deferred
+ master = jQuery.Deferred(),
+
+ // subordinate callback factory
+ updateFunc = function( i ) {
+ return function( value ) {
+ resolveContexts[ i ] = this;
+ resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
+ if ( !( --remaining ) ) {
+ master.resolveWith( resolveContexts, resolveValues );
+ }
+ };
+ };
+
+ // Single- and empty arguments are adopted like Promise.resolve
+ if ( remaining <= 1 ) {
+ adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
+ !remaining );
+
+ // Use .then() to unwrap secondary thenables (cf. gh-3000)
+ if ( master.state() === "pending" ||
+ isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
+
+ return master.then();
+ }
+ }
+
+ // Multiple arguments are aggregated like Promise.all array elements
+ while ( i-- ) {
+ adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
+ }
+
+ return master.promise();
+ }
+} );
+
+
+// These usually indicate a programmer mistake during development,
+// warn about them ASAP rather than swallowing them by default.
+var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
+
+jQuery.Deferred.exceptionHook = function( error, stack ) {
+
+ // Support: IE 8 - 9 only
+ // Console exists when dev tools are open, which can happen at any time
+ if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {
+ window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack );
+ }
+};
+
+
+
+
+jQuery.readyException = function( error ) {
+ window.setTimeout( function() {
+ throw error;
+ } );
+};
+
+
+
+
+// The deferred used on DOM ready
+var readyList = jQuery.Deferred();
+
+jQuery.fn.ready = function( fn ) {
+
+ readyList
+ .then( fn )
+
+ // Wrap jQuery.readyException in a function so that the lookup
+ // happens at the time of error handling instead of callback
+ // registration.
+ .catch( function( error ) {
+ jQuery.readyException( error );
+ } );
+
+ return this;
+};
+
+jQuery.extend( {
+
+ // Is the DOM ready to be used? Set to true once it occurs.
+ isReady: false,
+
+ // A counter to track how many items to wait for before
+ // the ready event fires. See #6781
+ readyWait: 1,
+
+ // Handle when the DOM is ready
+ ready: function( wait ) {
+
+ // Abort if there are pending holds or we're already ready
+ if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+ return;
+ }
+
+ // Remember that the DOM is ready
+ jQuery.isReady = true;
+
+ // If a normal DOM Ready event fired, decrement, and wait if need be
+ if ( wait !== true && --jQuery.readyWait > 0 ) {
+ return;
+ }
+
+ // If there are functions bound, to execute
+ readyList.resolveWith( document, [ jQuery ] );
+ }
+} );
+
+jQuery.ready.then = readyList.then;
+
+// The ready event handler and self cleanup method
+function completed() {
+ document.removeEventListener( "DOMContentLoaded", completed );
+ window.removeEventListener( "load", completed );
+ jQuery.ready();
+}
+
+// Catch cases where $(document).ready() is called
+// after the browser event has already occurred.
+// Support: IE <=9 - 10 only
+// Older IE sometimes signals "interactive" too soon
+if ( document.readyState === "complete" ||
+ ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {
+
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
+ window.setTimeout( jQuery.ready );
+
+} else {
+
+ // Use the handy event callback
+ document.addEventListener( "DOMContentLoaded", completed );
+
+ // A fallback to window.onload, that will always work
+ window.addEventListener( "load", completed );
+}
+
+
+
+
+// Multifunctional method to get and set values of a collection
+// The value/s can optionally be executed if it's a function
+var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
+ var i = 0,
+ len = elems.length,
+ bulk = key == null;
+
+ // Sets many values
+ if ( toType( key ) === "object" ) {
+ chainable = true;
+ for ( i in key ) {
+ access( elems, fn, i, key[ i ], true, emptyGet, raw );
+ }
+
+ // Sets one value
+ } else if ( value !== undefined ) {
+ chainable = true;
+
+ if ( !isFunction( value ) ) {
+ raw = true;
+ }
+
+ if ( bulk ) {
+
+ // Bulk operations run against the entire set
+ if ( raw ) {
+ fn.call( elems, value );
+ fn = null;
+
+ // ...except when executing function values
+ } else {
+ bulk = fn;
+ fn = function( elem, key, value ) {
+ return bulk.call( jQuery( elem ), value );
+ };
+ }
+ }
+
+ if ( fn ) {
+ for ( ; i < len; i++ ) {
+ fn(
+ elems[ i ], key, raw ?
+ value :
+ value.call( elems[ i ], i, fn( elems[ i ], key ) )
+ );
+ }
+ }
+ }
+
+ if ( chainable ) {
+ return elems;
+ }
+
+ // Gets
+ if ( bulk ) {
+ return fn.call( elems );
+ }
+
+ return len ? fn( elems[ 0 ], key ) : emptyGet;
+};
+
+
+// Matches dashed string for camelizing
+var rmsPrefix = /^-ms-/,
+ rdashAlpha = /-([a-z])/g;
+
+// Used by camelCase as callback to replace()
+function fcamelCase( all, letter ) {
+ return letter.toUpperCase();
+}
+
+// Convert dashed to camelCase; used by the css and data modules
+// Support: IE <=9 - 11, Edge 12 - 15
+// Microsoft forgot to hump their vendor prefix (#9572)
+function camelCase( string ) {
+ return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+}
+var acceptData = function( owner ) {
+
+ // Accepts only:
+ // - Node
+ // - Node.ELEMENT_NODE
+ // - Node.DOCUMENT_NODE
+ // - Object
+ // - Any
+ return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
+};
+
+
+
+
+function Data() {
+ this.expando = jQuery.expando + Data.uid++;
+}
+
+Data.uid = 1;
+
+Data.prototype = {
+
+ cache: function( owner ) {
+
+ // Check if the owner object already has a cache
+ var value = owner[ this.expando ];
+
+ // If not, create one
+ if ( !value ) {
+ value = {};
+
+ // We can accept data for non-element nodes in modern browsers,
+ // but we should not, see #8335.
+ // Always return an empty object.
+ if ( acceptData( owner ) ) {
+
+ // If it is a node unlikely to be stringify-ed or looped over
+ // use plain assignment
+ if ( owner.nodeType ) {
+ owner[ this.expando ] = value;
+
+ // Otherwise secure it in a non-enumerable property
+ // configurable must be true to allow the property to be
+ // deleted when data is removed
+ } else {
+ Object.defineProperty( owner, this.expando, {
+ value: value,
+ configurable: true
+ } );
+ }
+ }
+ }
+
+ return value;
+ },
+ set: function( owner, data, value ) {
+ var prop,
+ cache = this.cache( owner );
+
+ // Handle: [ owner, key, value ] args
+ // Always use camelCase key (gh-2257)
+ if ( typeof data === "string" ) {
+ cache[ camelCase( data ) ] = value;
+
+ // Handle: [ owner, { properties } ] args
+ } else {
+
+ // Copy the properties one-by-one to the cache object
+ for ( prop in data ) {
+ cache[ camelCase( prop ) ] = data[ prop ];
+ }
+ }
+ return cache;
+ },
+ get: function( owner, key ) {
+ return key === undefined ?
+ this.cache( owner ) :
+
+ // Always use camelCase key (gh-2257)
+ owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];
+ },
+ access: function( owner, key, value ) {
+
+ // In cases where either:
+ //
+ // 1. No key was specified
+ // 2. A string key was specified, but no value provided
+ //
+ // Take the "read" path and allow the get method to determine
+ // which value to return, respectively either:
+ //
+ // 1. The entire cache object
+ // 2. The data stored at the key
+ //
+ if ( key === undefined ||
+ ( ( key && typeof key === "string" ) && value === undefined ) ) {
+
+ return this.get( owner, key );
+ }
+
+ // When the key is not a string, or both a key and value
+ // are specified, set or extend (existing objects) with either:
+ //
+ // 1. An object of properties
+ // 2. A key and value
+ //
+ this.set( owner, key, value );
+
+ // Since the "set" path can have two possible entry points
+ // return the expected data based on which path was taken[*]
+ return value !== undefined ? value : key;
+ },
+ remove: function( owner, key ) {
+ var i,
+ cache = owner[ this.expando ];
+
+ if ( cache === undefined ) {
+ return;
+ }
+
+ if ( key !== undefined ) {
+
+ // Support array or space separated string of keys
+ if ( Array.isArray( key ) ) {
+
+ // If key is an array of keys...
+ // We always set camelCase keys, so remove that.
+ key = key.map( camelCase );
+ } else {
+ key = camelCase( key );
+
+ // If a key with the spaces exists, use it.
+ // Otherwise, create an array by matching non-whitespace
+ key = key in cache ?
+ [ key ] :
+ ( key.match( rnothtmlwhite ) || [] );
+ }
+
+ i = key.length;
+
+ while ( i-- ) {
+ delete cache[ key[ i ] ];
+ }
+ }
+
+ // Remove the expando if there's no more data
+ if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
+
+ // Support: Chrome <=35 - 45
+ // Webkit & Blink performance suffers when deleting properties
+ // from DOM nodes, so set to undefined instead
+ // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
+ if ( owner.nodeType ) {
+ owner[ this.expando ] = undefined;
+ } else {
+ delete owner[ this.expando ];
+ }
+ }
+ },
+ hasData: function( owner ) {
+ var cache = owner[ this.expando ];
+ return cache !== undefined && !jQuery.isEmptyObject( cache );
+ }
+};
+var dataPriv = new Data();
+
+var dataUser = new Data();
+
+
+
+// Implementation Summary
+//
+// 1. Enforce API surface and semantic compatibility with 1.9.x branch
+// 2. Improve the module's maintainability by reducing the storage
+// paths to a single mechanism.
+// 3. Use the same single mechanism to support "private" and "user" data.
+// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
+// 5. Avoid exposing implementation details on user objects (eg. expando properties)
+// 6. Provide a clear path for implementation upgrade to WeakMap in 2014
+
+var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
+ rmultiDash = /[A-Z]/g;
+
+function getData( data ) {
+ if ( data === "true" ) {
+ return true;
+ }
+
+ if ( data === "false" ) {
+ return false;
+ }
+
+ if ( data === "null" ) {
+ return null;
+ }
+
+ // Only convert to a number if it doesn't change the string
+ if ( data === +data + "" ) {
+ return +data;
+ }
+
+ if ( rbrace.test( data ) ) {
+ return JSON.parse( data );
+ }
+
+ return data;
+}
+
+function dataAttr( elem, key, data ) {
+ var name;
+
+ // If nothing was found internally, try to fetch any
+ // data from the HTML5 data-* attribute
+ if ( data === undefined && elem.nodeType === 1 ) {
+ name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
+ data = elem.getAttribute( name );
+
+ if ( typeof data === "string" ) {
+ try {
+ data = getData( data );
+ } catch ( e ) {}
+
+ // Make sure we set the data so it isn't changed later
+ dataUser.set( elem, key, data );
+ } else {
+ data = undefined;
+ }
+ }
+ return data;
+}
+
+jQuery.extend( {
+ hasData: function( elem ) {
+ return dataUser.hasData( elem ) || dataPriv.hasData( elem );
+ },
+
+ data: function( elem, name, data ) {
+ return dataUser.access( elem, name, data );
+ },
+
+ removeData: function( elem, name ) {
+ dataUser.remove( elem, name );
+ },
+
+ // TODO: Now that all calls to _data and _removeData have been replaced
+ // with direct calls to dataPriv methods, these can be deprecated.
+ _data: function( elem, name, data ) {
+ return dataPriv.access( elem, name, data );
+ },
+
+ _removeData: function( elem, name ) {
+ dataPriv.remove( elem, name );
+ }
+} );
+
+jQuery.fn.extend( {
+ data: function( key, value ) {
+ var i, name, data,
+ elem = this[ 0 ],
+ attrs = elem && elem.attributes;
+
+ // Gets all values
+ if ( key === undefined ) {
+ if ( this.length ) {
+ data = dataUser.get( elem );
+
+ if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
+ i = attrs.length;
+ while ( i-- ) {
+
+ // Support: IE 11 only
+ // The attrs elements can be null (#14894)
+ if ( attrs[ i ] ) {
+ name = attrs[ i ].name;
+ if ( name.indexOf( "data-" ) === 0 ) {
+ name = camelCase( name.slice( 5 ) );
+ dataAttr( elem, name, data[ name ] );
+ }
+ }
+ }
+ dataPriv.set( elem, "hasDataAttrs", true );
+ }
+ }
+
+ return data;
+ }
+
+ // Sets multiple values
+ if ( typeof key === "object" ) {
+ return this.each( function() {
+ dataUser.set( this, key );
+ } );
+ }
+
+ return access( this, function( value ) {
+ var data;
+
+ // The calling jQuery object (element matches) is not empty
+ // (and therefore has an element appears at this[ 0 ]) and the
+ // `value` parameter was not undefined. An empty jQuery object
+ // will result in `undefined` for elem = this[ 0 ] which will
+ // throw an exception if an attempt to read a data cache is made.
+ if ( elem && value === undefined ) {
+
+ // Attempt to get data from the cache
+ // The key will always be camelCased in Data
+ data = dataUser.get( elem, key );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // Attempt to "discover" the data in
+ // HTML5 custom data-* attrs
+ data = dataAttr( elem, key );
+ if ( data !== undefined ) {
+ return data;
+ }
+
+ // We tried really hard, but the data doesn't exist.
+ return;
+ }
+
+ // Set the data...
+ this.each( function() {
+
+ // We always store the camelCased key
+ dataUser.set( this, key, value );
+ } );
+ }, null, value, arguments.length > 1, null, true );
+ },
+
+ removeData: function( key ) {
+ return this.each( function() {
+ dataUser.remove( this, key );
+ } );
+ }
+} );
+
+
+jQuery.extend( {
+ queue: function( elem, type, data ) {
+ var queue;
+
+ if ( elem ) {
+ type = ( type || "fx" ) + "queue";
+ queue = dataPriv.get( elem, type );
+
+ // Speed up dequeue by getting out quickly if this is just a lookup
+ if ( data ) {
+ if ( !queue || Array.isArray( data ) ) {
+ queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
+ } else {
+ queue.push( data );
+ }
+ }
+ return queue || [];
+ }
+ },
+
+ dequeue: function( elem, type ) {
+ type = type || "fx";
+
+ var queue = jQuery.queue( elem, type ),
+ startLength = queue.length,
+ fn = queue.shift(),
+ hooks = jQuery._queueHooks( elem, type ),
+ next = function() {
+ jQuery.dequeue( elem, type );
+ };
+
+ // If the fx queue is dequeued, always remove the progress sentinel
+ if ( fn === "inprogress" ) {
+ fn = queue.shift();
+ startLength--;
+ }
+
+ if ( fn ) {
+
+ // Add a progress sentinel to prevent the fx queue from being
+ // automatically dequeued
+ if ( type === "fx" ) {
+ queue.unshift( "inprogress" );
+ }
+
+ // Clear up the last queue stop function
+ delete hooks.stop;
+ fn.call( elem, next, hooks );
+ }
+
+ if ( !startLength && hooks ) {
+ hooks.empty.fire();
+ }
+ },
+
+ // Not public - generate a queueHooks object, or return the current one
+ _queueHooks: function( elem, type ) {
+ var key = type + "queueHooks";
+ return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
+ empty: jQuery.Callbacks( "once memory" ).add( function() {
+ dataPriv.remove( elem, [ type + "queue", key ] );
+ } )
+ } );
+ }
+} );
+
+jQuery.fn.extend( {
+ queue: function( type, data ) {
+ var setter = 2;
+
+ if ( typeof type !== "string" ) {
+ data = type;
+ type = "fx";
+ setter--;
+ }
+
+ if ( arguments.length < setter ) {
+ return jQuery.queue( this[ 0 ], type );
+ }
+
+ return data === undefined ?
+ this :
+ this.each( function() {
+ var queue = jQuery.queue( this, type, data );
+
+ // Ensure a hooks for this queue
+ jQuery._queueHooks( this, type );
+
+ if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
+ jQuery.dequeue( this, type );
+ }
+ } );
+ },
+ dequeue: function( type ) {
+ return this.each( function() {
+ jQuery.dequeue( this, type );
+ } );
+ },
+ clearQueue: function( type ) {
+ return this.queue( type || "fx", [] );
+ },
+
+ // Get a promise resolved when queues of a certain type
+ // are emptied (fx is the type by default)
+ promise: function( type, obj ) {
+ var tmp,
+ count = 1,
+ defer = jQuery.Deferred(),
+ elements = this,
+ i = this.length,
+ resolve = function() {
+ if ( !( --count ) ) {
+ defer.resolveWith( elements, [ elements ] );
+ }
+ };
+
+ if ( typeof type !== "string" ) {
+ obj = type;
+ type = undefined;
+ }
+ type = type || "fx";
+
+ while ( i-- ) {
+ tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
+ if ( tmp && tmp.empty ) {
+ count++;
+ tmp.empty.add( resolve );
+ }
+ }
+ resolve();
+ return defer.promise( obj );
+ }
+} );
+var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;
+
+var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );
+
+
+var cssExpand = [ "Top", "Right", "Bottom", "Left" ];
+
+var isHiddenWithinTree = function( elem, el ) {
+
+ // isHiddenWithinTree might be called from jQuery#filter function;
+ // in that case, element will be second argument
+ elem = el || elem;
+
+ // Inline style trumps all
+ return elem.style.display === "none" ||
+ elem.style.display === "" &&
+
+ // Otherwise, check computed style
+ // Support: Firefox <=43 - 45
+ // Disconnected elements can have computed display: none, so first confirm that elem is
+ // in the document.
+ jQuery.contains( elem.ownerDocument, elem ) &&
+
+ jQuery.css( elem, "display" ) === "none";
+ };
+
+var swap = function( elem, options, callback, args ) {
+ var ret, name,
+ old = {};
+
+ // Remember the old values, and insert the new ones
+ for ( name in options ) {
+ old[ name ] = elem.style[ name ];
+ elem.style[ name ] = options[ name ];
+ }
+
+ ret = callback.apply( elem, args || [] );
+
+ // Revert the old values
+ for ( name in options ) {
+ elem.style[ name ] = old[ name ];
+ }
+
+ return ret;
+};
+
+
+
+
+function adjustCSS( elem, prop, valueParts, tween ) {
+ var adjusted, scale,
+ maxIterations = 20,
+ currentValue = tween ?
+ function() {
+ return tween.cur();
+ } :
+ function() {
+ return jQuery.css( elem, prop, "" );
+ },
+ initial = currentValue(),
+ unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),
+
+ // Starting value computation is required for potential unit mismatches
+ initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
+ rcssNum.exec( jQuery.css( elem, prop ) );
+
+ if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {
+
+ // Support: Firefox <=54
+ // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
+ initial = initial / 2;
+
+ // Trust units reported by jQuery.css
+ unit = unit || initialInUnit[ 3 ];
+
+ // Iteratively approximate from a nonzero starting point
+ initialInUnit = +initial || 1;
+
+ while ( maxIterations-- ) {
+
+ // Evaluate and update our best guess (doubling guesses that zero out).
+ // Finish if the scale equals or crosses 1 (making the old*new product non-positive).
+ jQuery.style( elem, prop, initialInUnit + unit );
+ if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {
+ maxIterations = 0;
+ }
+ initialInUnit = initialInUnit / scale;
+
+ }
+
+ initialInUnit = initialInUnit * 2;
+ jQuery.style( elem, prop, initialInUnit + unit );
+
+ // Make sure we update the tween properties later on
+ valueParts = valueParts || [];
+ }
+
+ if ( valueParts ) {
+ initialInUnit = +initialInUnit || +initial || 0;
+
+ // Apply relative offset (+=/-=) if specified
+ adjusted = valueParts[ 1 ] ?
+ initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
+ +valueParts[ 2 ];
+ if ( tween ) {
+ tween.unit = unit;
+ tween.start = initialInUnit;
+ tween.end = adjusted;
+ }
+ }
+ return adjusted;
+}
+
+
+var defaultDisplayMap = {};
+
+function getDefaultDisplay( elem ) {
+ var temp,
+ doc = elem.ownerDocument,
+ nodeName = elem.nodeName,
+ display = defaultDisplayMap[ nodeName ];
+
+ if ( display ) {
+ return display;
+ }
+
+ temp = doc.body.appendChild( doc.createElement( nodeName ) );
+ display = jQuery.css( temp, "display" );
+
+ temp.parentNode.removeChild( temp );
+
+ if ( display === "none" ) {
+ display = "block";
+ }
+ defaultDisplayMap[ nodeName ] = display;
+
+ return display;
+}
+
+function showHide( elements, show ) {
+ var display, elem,
+ values = [],
+ index = 0,
+ length = elements.length;
+
+ // Determine new display value for elements that need to change
+ for ( ; index < length; index++ ) {
+ elem = elements[ index ];
+ if ( !elem.style ) {
+ continue;
+ }
+
+ display = elem.style.display;
+ if ( show ) {
+
+ // Since we force visibility upon cascade-hidden elements, an immediate (and slow)
+ // check is required in this first loop unless we have a nonempty display value (either
+ // inline or about-to-be-restored)
+ if ( display === "none" ) {
+ values[ index ] = dataPriv.get( elem, "display" ) || null;
+ if ( !values[ index ] ) {
+ elem.style.display = "";
+ }
+ }
+ if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) {
+ values[ index ] = getDefaultDisplay( elem );
+ }
+ } else {
+ if ( display !== "none" ) {
+ values[ index ] = "none";
+
+ // Remember what we're overwriting
+ dataPriv.set( elem, "display", display );
+ }
+ }
+ }
+
+ // Set the display of the elements in a second loop to avoid constant reflow
+ for ( index = 0; index < length; index++ ) {
+ if ( values[ index ] != null ) {
+ elements[ index ].style.display = values[ index ];
+ }
+ }
+
+ return elements;
+}
+
+jQuery.fn.extend( {
+ show: function() {
+ return showHide( this, true );
+ },
+ hide: function() {
+ return showHide( this );
+ },
+ toggle: function( state ) {
+ if ( typeof state === "boolean" ) {
+ return state ? this.show() : this.hide();
+ }
+
+ return this.each( function() {
+ if ( isHiddenWithinTree( this ) ) {
+ jQuery( this ).show();
+ } else {
+ jQuery( this ).hide();
+ }
+ } );
+ }
+} );
+var rcheckableType = ( /^(?:checkbox|radio)$/i );
+
+var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i );
+
+var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i );
+
+
+
+// We have to close these tags to support XHTML (#13200)
+var wrapMap = {
+
+ // Support: IE <=9 only
+ option: [ 1, "<select multiple='multiple'>", "</select>" ],
+
+ // XHTML parsers do not magically insert elements in the
+ // same way that tag soup parsers do. So we cannot shorten
+ // this by omitting <tbody> or other required elements.
+ thead: [ 1, "<table>", "</table>" ],
+ col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
+ tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+ td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+
+ _default: [ 0, "", "" ]
+};
+
+// Support: IE <=9 only
+wrapMap.optgroup = wrapMap.option;
+
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+
+function getAll( context, tag ) {
+
+ // Support: IE <=9 - 11 only
+ // Use typeof to avoid zero-argument method invocation on host objects (#15151)
+ var ret;
+
+ if ( typeof context.getElementsByTagName !== "undefined" ) {
+ ret = context.getElementsByTagName( tag || "*" );
+
+ } else if ( typeof context.querySelectorAll !== "undefined" ) {
+ ret = context.querySelectorAll( tag || "*" );
+
+ } else {
+ ret = [];
+ }
+
+ if ( tag === undefined || tag && nodeName( context, tag ) ) {
+ return jQuery.merge( [ context ], ret );
+ }
+
+ return ret;
+}
+
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+ var i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ dataPriv.set(
+ elems[ i ],
+ "globalEval",
+ !refElements || dataPriv.get( refElements[ i ], "globalEval" )
+ );
+ }
+}
+
+
+var rhtml = /<|&#?\w+;/;
+
+function buildFragment( elems, context, scripts, selection, ignored ) {
+ var elem, tmp, tag, wrap, contains, j,
+ fragment = context.createDocumentFragment(),
+ nodes = [],
+ i = 0,
+ l = elems.length;
+
+ for ( ; i < l; i++ ) {
+ elem = elems[ i ];
+
+ if ( elem || elem === 0 ) {
+
+ // Add nodes directly
+ if ( toType( elem ) === "object" ) {
+
+ // Support: Android <=4.0 only, PhantomJS 1 only
+ // push.apply(_, arraylike) throws on ancient WebKit
+ jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+
+ // Convert non-html into a text node
+ } else if ( !rhtml.test( elem ) ) {
+ nodes.push( context.createTextNode( elem ) );
+
+ // Convert html into DOM nodes
+ } else {
+ tmp = tmp || fragment.appendChild( context.createElement( "div" ) );
+
+ // Deserialize a standard representation
+ tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
+ wrap = wrapMap[ tag ] || wrapMap._default;
+ tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];
+
+ // Descend through wrappers to the right content
+ j = wrap[ 0 ];
+ while ( j-- ) {
+ tmp = tmp.lastChild;
+ }
+
+ // Support: Android <=4.0 only, PhantomJS 1 only
+ // push.apply(_, arraylike) throws on ancient WebKit
+ jQuery.merge( nodes, tmp.childNodes );
+
+ // Remember the top-level container
+ tmp = fragment.firstChild;
+
+ // Ensure the created nodes are orphaned (#12392)
+ tmp.textContent = "";
+ }
+ }
+ }
+
+ // Remove wrapper from fragment
+ fragment.textContent = "";
+
+ i = 0;
+ while ( ( elem = nodes[ i++ ] ) ) {
+
+ // Skip elements already in the context collection (trac-4087)
+ if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
+ if ( ignored ) {
+ ignored.push( elem );
+ }
+ continue;
+ }
+
+ contains = jQuery.contains( elem.ownerDocument, elem );
+
+ // Append to fragment
+ tmp = getAll( fragment.appendChild( elem ), "script" );
+
+ // Preserve script evaluation history
+ if ( contains ) {
+ setGlobalEval( tmp );
+ }
+
+ // Capture executables
+ if ( scripts ) {
+ j = 0;
+ while ( ( elem = tmp[ j++ ] ) ) {
+ if ( rscriptType.test( elem.type || "" ) ) {
+ scripts.push( elem );
+ }
+ }
+ }
+ }
+
+ return fragment;
+}
+
+
+( function() {
+ var fragment = document.createDocumentFragment(),
+ div = fragment.appendChild( document.createElement( "div" ) ),
+ input = document.createElement( "input" );
+
+ // Support: Android 4.0 - 4.3 only
+ // Check state lost if the name is set (#11217)
+ // Support: Windows Web Apps (WWA)
+ // `name` and `type` must use .setAttribute for WWA (#14901)
+ input.setAttribute( "type", "radio" );
+ input.setAttribute( "checked", "checked" );
+ input.setAttribute( "name", "t" );
+
+ div.appendChild( input );
+
+ // Support: Android <=4.1 only
+ // Older WebKit doesn't clone checked state correctly in fragments
+ support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+ // Support: IE <=11 only
+ // Make sure textarea (and checkbox) defaultValue is properly cloned
+ div.innerHTML = "<textarea>x</textarea>";
+ support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
+} )();
+var documentElement = document.documentElement;
+
+
+
+var
+ rkeyEvent = /^key/,
+ rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
+ rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
+
+function returnTrue() {
+ return true;
+}
+
+function returnFalse() {
+ return false;
+}
+
+// Support: IE <=9 only
+// See #13393 for more info
+function safeActiveElement() {
+ try {
+ return document.activeElement;
+ } catch ( err ) { }
+}
+
+function on( elem, types, selector, data, fn, one ) {
+ var origFn, type;
+
+ // Types can be a map of types/handlers
+ if ( typeof types === "object" ) {
+
+ // ( types-Object, selector, data )
+ if ( typeof selector !== "string" ) {
+
+ // ( types-Object, data )
+ data = data || selector;
+ selector = undefined;
+ }
+ for ( type in types ) {
+ on( elem, type, selector, data, types[ type ], one );
+ }
+ return elem;
+ }
+
+ if ( data == null && fn == null ) {
+
+ // ( types, fn )
+ fn = selector;
+ data = selector = undefined;
+ } else if ( fn == null ) {
+ if ( typeof selector === "string" ) {
+
+ // ( types, selector, fn )
+ fn = data;
+ data = undefined;
+ } else {
+
+ // ( types, data, fn )
+ fn = data;
+ data = selector;
+ selector = undefined;
+ }
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ } else if ( !fn ) {
+ return elem;
+ }
+
+ if ( one === 1 ) {
+ origFn = fn;
+ fn = function( event ) {
+
+ // Can use an empty set, since event contains the info
+ jQuery().off( event );
+ return origFn.apply( this, arguments );
+ };
+
+ // Use same guid so caller can remove using origFn
+ fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+ }
+ return elem.each( function() {
+ jQuery.event.add( this, types, fn, data, selector );
+ } );
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+ global: {},
+
+ add: function( elem, types, handler, data, selector ) {
+
+ var handleObjIn, eventHandle, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = dataPriv.get( elem );
+
+ // Don't attach events to noData or text/comment nodes (but allow plain objects)
+ if ( !elemData ) {
+ return;
+ }
+
+ // Caller can pass in an object of custom data in lieu of the handler
+ if ( handler.handler ) {
+ handleObjIn = handler;
+ handler = handleObjIn.handler;
+ selector = handleObjIn.selector;
+ }
+
+ // Ensure that invalid selectors throw exceptions at attach time
+ // Evaluate against documentElement in case elem is a non-element node (e.g., document)
+ if ( selector ) {
+ jQuery.find.matchesSelector( documentElement, selector );
+ }
+
+ // Make sure that the handler has a unique ID, used to find/remove it later
+ if ( !handler.guid ) {
+ handler.guid = jQuery.guid++;
+ }
+
+ // Init the element's event structure and main handler, if this is the first
+ if ( !( events = elemData.events ) ) {
+ events = elemData.events = {};
+ }
+ if ( !( eventHandle = elemData.handle ) ) {
+ eventHandle = elemData.handle = function( e ) {
+
+ // Discard the second event of a jQuery.event.trigger() and
+ // when an event is called after a page has unloaded
+ return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
+ jQuery.event.dispatch.apply( elem, arguments ) : undefined;
+ };
+ }
+
+ // Handle multiple events separated by a space
+ types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[ t ] ) || [];
+ type = origType = tmp[ 1 ];
+ namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+ // There *must* be a type, no attaching namespace-only handlers
+ if ( !type ) {
+ continue;
+ }
+
+ // If event changes its type, use the special event handlers for the changed type
+ special = jQuery.event.special[ type ] || {};
+
+ // If selector defined, determine special event api type, otherwise given type
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+
+ // Update special based on newly reset type
+ special = jQuery.event.special[ type ] || {};
+
+ // handleObj is passed to all event handlers
+ handleObj = jQuery.extend( {
+ type: type,
+ origType: origType,
+ data: data,
+ handler: handler,
+ guid: handler.guid,
+ selector: selector,
+ needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+ namespace: namespaces.join( "." )
+ }, handleObjIn );
+
+ // Init the event handler queue if we're the first
+ if ( !( handlers = events[ type ] ) ) {
+ handlers = events[ type ] = [];
+ handlers.delegateCount = 0;
+
+ // Only use addEventListener if the special events handler returns false
+ if ( !special.setup ||
+ special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+
+ if ( elem.addEventListener ) {
+ elem.addEventListener( type, eventHandle );
+ }
+ }
+ }
+
+ if ( special.add ) {
+ special.add.call( elem, handleObj );
+
+ if ( !handleObj.handler.guid ) {
+ handleObj.handler.guid = handler.guid;
+ }
+ }
+
+ // Add to the element's handler list, delegates in front
+ if ( selector ) {
+ handlers.splice( handlers.delegateCount++, 0, handleObj );
+ } else {
+ handlers.push( handleObj );
+ }
+
+ // Keep track of which events have ever been used, for event optimization
+ jQuery.event.global[ type ] = true;
+ }
+
+ },
+
+ // Detach an event or set of events from an element
+ remove: function( elem, types, handler, selector, mappedTypes ) {
+
+ var j, origCount, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );
+
+ if ( !elemData || !( events = elemData.events ) ) {
+ return;
+ }
+
+ // Once for each type.namespace in types; type may be omitted
+ types = ( types || "" ).match( rnothtmlwhite ) || [ "" ];
+ t = types.length;
+ while ( t-- ) {
+ tmp = rtypenamespace.exec( types[ t ] ) || [];
+ type = origType = tmp[ 1 ];
+ namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();
+
+ // Unbind all events (on this namespace, if provided) for the element
+ if ( !type ) {
+ for ( type in events ) {
+ jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+ }
+ continue;
+ }
+
+ special = jQuery.event.special[ type ] || {};
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+ handlers = events[ type ] || [];
+ tmp = tmp[ 2 ] &&
+ new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );
+
+ // Remove matching events
+ origCount = j = handlers.length;
+ while ( j-- ) {
+ handleObj = handlers[ j ];
+
+ if ( ( mappedTypes || origType === handleObj.origType ) &&
+ ( !handler || handler.guid === handleObj.guid ) &&
+ ( !tmp || tmp.test( handleObj.namespace ) ) &&
+ ( !selector || selector === handleObj.selector ||
+ selector === "**" && handleObj.selector ) ) {
+ handlers.splice( j, 1 );
+
+ if ( handleObj.selector ) {
+ handlers.delegateCount--;
+ }
+ if ( special.remove ) {
+ special.remove.call( elem, handleObj );
+ }
+ }
+ }
+
+ // Remove generic event handler if we removed something and no more handlers exist
+ // (avoids potential for endless recursion during removal of special event handlers)
+ if ( origCount && !handlers.length ) {
+ if ( !special.teardown ||
+ special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+
+ jQuery.removeEvent( elem, type, elemData.handle );
+ }
+
+ delete events[ type ];
+ }
+ }
+
+ // Remove data and the expando if it's no longer used
+ if ( jQuery.isEmptyObject( events ) ) {
+ dataPriv.remove( elem, "handle events" );
+ }
+ },
+
+ dispatch: function( nativeEvent ) {
+
+ // Make a writable jQuery.Event from the native event object
+ var event = jQuery.event.fix( nativeEvent );
+
+ var i, j, ret, matched, handleObj, handlerQueue,
+ args = new Array( arguments.length ),
+ handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
+ special = jQuery.event.special[ event.type ] || {};
+
+ // Use the fix-ed jQuery.Event rather than the (read-only) native event
+ args[ 0 ] = event;
+
+ for ( i = 1; i < arguments.length; i++ ) {
+ args[ i ] = arguments[ i ];
+ }
+
+ event.delegateTarget = this;
+
+ // Call the preDispatch hook for the mapped type, and let it bail if desired
+ if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+ return;
+ }
+
+ // Determine handlers
+ handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+ // Run delegates first; they may want to stop propagation beneath us
+ i = 0;
+ while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
+ event.currentTarget = matched.elem;
+
+ j = 0;
+ while ( ( handleObj = matched.handlers[ j++ ] ) &&
+ !event.isImmediatePropagationStopped() ) {
+
+ // Triggered event must either 1) have no namespace, or 2) have namespace(s)
+ // a subset or equal to those in the bound event (both can have no namespace).
+ if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {
+
+ event.handleObj = handleObj;
+ event.data = handleObj.data;
+
+ ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
+ handleObj.handler ).apply( matched.elem, args );
+
+ if ( ret !== undefined ) {
+ if ( ( event.result = ret ) === false ) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
+ }
+ }
+ }
+
+ // Call the postDispatch hook for the mapped type
+ if ( special.postDispatch ) {
+ special.postDispatch.call( this, event );
+ }
+
+ return event.result;
+ },
+
+ handlers: function( event, handlers ) {
+ var i, handleObj, sel, matchedHandlers, matchedSelectors,
+ handlerQueue = [],
+ delegateCount = handlers.delegateCount,
+ cur = event.target;
+
+ // Find delegate handlers
+ if ( delegateCount &&
+
+ // Support: IE <=9
+ // Black-hole SVG <use> instance trees (trac-13180)
+ cur.nodeType &&
+
+ // Support: Firefox <=42
+ // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
+ // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
+ // Support: IE 11 only
+ // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
+ !( event.type === "click" && event.button >= 1 ) ) {
+
+ for ( ; cur !== this; cur = cur.parentNode || this ) {
+
+ // Don't check non-elements (#13208)
+ // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+ if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) {
+ matchedHandlers = [];
+ matchedSelectors = {};
+ for ( i = 0; i < delegateCount; i++ ) {
+ handleObj = handlers[ i ];
+
+ // Don't conflict with Object.prototype properties (#13203)
+ sel = handleObj.selector + " ";
+
+ if ( matchedSelectors[ sel ] === undefined ) {
+ matchedSelectors[ sel ] = handleObj.needsContext ?
+ jQuery( sel, this ).index( cur ) > -1 :
+ jQuery.find( sel, this, null, [ cur ] ).length;
+ }
+ if ( matchedSelectors[ sel ] ) {
+ matchedHandlers.push( handleObj );
+ }
+ }
+ if ( matchedHandlers.length ) {
+ handlerQueue.push( { elem: cur, handlers: matchedHandlers } );
+ }
+ }
+ }
+ }
+
+ // Add the remaining (directly-bound) handlers
+ cur = this;
+ if ( delegateCount < handlers.length ) {
+ handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );
+ }
+
+ return handlerQueue;
+ },
+
+ addProp: function( name, hook ) {
+ Object.defineProperty( jQuery.Event.prototype, name, {
+ enumerable: true,
+ configurable: true,
+
+ get: isFunction( hook ) ?
+ function() {
+ if ( this.originalEvent ) {
+ return hook( this.originalEvent );
+ }
+ } :
+ function() {
+ if ( this.originalEvent ) {
+ return this.originalEvent[ name ];
+ }
+ },
+
+ set: function( value ) {
+ Object.defineProperty( this, name, {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: value
+ } );
+ }
+ } );
+ },
+
+ fix: function( originalEvent ) {
+ return originalEvent[ jQuery.expando ] ?
+ originalEvent :
+ new jQuery.Event( originalEvent );
+ },
+
+ special: {
+ load: {
+
+ // Prevent triggered image.load events from bubbling to window.load
+ noBubble: true
+ },
+ focus: {
+
+ // Fire native event if possible so blur/focus sequence is correct
+ trigger: function() {
+ if ( this !== safeActiveElement() && this.focus ) {
+ this.focus();
+ return false;
+ }
+ },
+ delegateType: "focusin"
+ },
+ blur: {
+ trigger: function() {
+ if ( this === safeActiveElement() && this.blur ) {
+ this.blur();
+ return false;
+ }
+ },
+ delegateType: "focusout"
+ },
+ click: {
+
+ // For checkbox, fire native event so checked state will be right
+ trigger: function() {
+ if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) {
+ this.click();
+ return false;
+ }
+ },
+
+ // For cross-browser consistency, don't fire native .click() on links
+ _default: function( event ) {
+ return nodeName( event.target, "a" );
+ }
+ },
+
+ beforeunload: {
+ postDispatch: function( event ) {
+
+ // Support: Firefox 20+
+ // Firefox doesn't alert if the returnValue field is not set.
+ if ( event.result !== undefined && event.originalEvent ) {
+ event.originalEvent.returnValue = event.result;
+ }
+ }
+ }
+ }
+};
+
+jQuery.removeEvent = function( elem, type, handle ) {
+
+ // This "if" is needed for plain objects
+ if ( elem.removeEventListener ) {
+ elem.removeEventListener( type, handle );
+ }
+};
+
+jQuery.Event = function( src, props ) {
+
+ // Allow instantiation without the 'new' keyword
+ if ( !( this instanceof jQuery.Event ) ) {
+ return new jQuery.Event( src, props );
+ }
+
+ // Event object
+ if ( src && src.type ) {
+ this.originalEvent = src;
+ this.type = src.type;
+
+ // Events bubbling up the document may have been marked as prevented
+ // by a handler lower down the tree; reflect the correct value.
+ this.isDefaultPrevented = src.defaultPrevented ||
+ src.defaultPrevented === undefined &&
+
+ // Support: Android <=2.3 only
+ src.returnValue === false ?
+ returnTrue :
+ returnFalse;
+
+ // Create target properties
+ // Support: Safari <=6 - 7 only
+ // Target should not be a text node (#504, #13143)
+ this.target = ( src.target && src.target.nodeType === 3 ) ?
+ src.target.parentNode :
+ src.target;
+
+ this.currentTarget = src.currentTarget;
+ this.relatedTarget = src.relatedTarget;
+
+ // Event type
+ } else {
+ this.type = src;
+ }
+
+ // Put explicitly provided properties onto the event object
+ if ( props ) {
+ jQuery.extend( this, props );
+ }
+
+ // Create a timestamp if incoming event doesn't have one
+ this.timeStamp = src && src.timeStamp || Date.now();
+
+ // Mark it as fixed
+ this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+ constructor: jQuery.Event,
+ isDefaultPrevented: returnFalse,
+ isPropagationStopped: returnFalse,
+ isImmediatePropagationStopped: returnFalse,
+ isSimulated: false,
+
+ preventDefault: function() {
+ var e = this.originalEvent;
+
+ this.isDefaultPrevented = returnTrue;
+
+ if ( e && !this.isSimulated ) {
+ e.preventDefault();
+ }
+ },
+ stopPropagation: function() {
+ var e = this.originalEvent;
+
+ this.isPropagationStopped = returnTrue;
+
+ if ( e && !this.isSimulated ) {
+ e.stopPropagation();
+ }
+ },
+ stopImmediatePropagation: function() {
+ var e = this.originalEvent;
+
+ this.isImmediatePropagationStopped = returnTrue;
+
+ if ( e && !this.isSimulated ) {
+ e.stopImmediatePropagation();
+ }
+
+ this.stopPropagation();
+ }
+};
+
+// Includes all common event props including KeyEvent and MouseEvent specific props
+jQuery.each( {
+ altKey: true,
+ bubbles: true,
+ cancelable: true,
+ changedTouches: true,
+ ctrlKey: true,
+ detail: true,
+ eventPhase: true,
+ metaKey: true,
+ pageX: true,
+ pageY: true,
+ shiftKey: true,
+ view: true,
+ "char": true,
+ charCode: true,
+ key: true,
+ keyCode: true,
+ button: true,
+ buttons: true,
+ clientX: true,
+ clientY: true,
+ offsetX: true,
+ offsetY: true,
+ pointerId: true,
+ pointerType: true,
+ screenX: true,
+ screenY: true,
+ targetTouches: true,
+ toElement: true,
+ touches: true,
+
+ which: function( event ) {
+ var button = event.button;
+
+ // Add which for key events
+ if ( event.which == null && rkeyEvent.test( event.type ) ) {
+ return event.charCode != null ? event.charCode : event.keyCode;
+ }
+
+ // Add which for click: 1 === left; 2 === middle; 3 === right
+ if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
+ if ( button & 1 ) {
+ return 1;
+ }
+
+ if ( button & 2 ) {
+ return 3;
+ }
+
+ if ( button & 4 ) {
+ return 2;
+ }
+
+ return 0;
+ }
+
+ return event.which;
+ }
+}, jQuery.event.addProp );
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+// so that event delegation works in jQuery.
+// Do the same for pointerenter/pointerleave and pointerover/pointerout
+//
+// Support: Safari 7 only
+// Safari sends mouseenter too often; see:
+// https://bugs.chromium.org/p/chromium/issues/detail?id=470258
+// for the description of the bug (it existed in older Chrome versions as well).
+jQuery.each( {
+ mouseenter: "mouseover",
+ mouseleave: "mouseout",
+ pointerenter: "pointerover",
+ pointerleave: "pointerout"
+}, function( orig, fix ) {
+ jQuery.event.special[ orig ] = {
+ delegateType: fix,
+ bindType: fix,
+
+ handle: function( event ) {
+ var ret,
+ target = this,
+ related = event.relatedTarget,
+ handleObj = event.handleObj;
+
+ // For mouseenter/leave call the handler if related is outside the target.
+ // NB: No relatedTarget if the mouse left/entered the browser window
+ if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
+ event.type = handleObj.origType;
+ ret = handleObj.handler.apply( this, arguments );
+ event.type = fix;
+ }
+ return ret;
+ }
+ };
+} );
+
+jQuery.fn.extend( {
+
+ on: function( types, selector, data, fn ) {
+ return on( this, types, selector, data, fn );
+ },
+ one: function( types, selector, data, fn ) {
+ return on( this, types, selector, data, fn, 1 );
+ },
+ off: function( types, selector, fn ) {
+ var handleObj, type;
+ if ( types && types.preventDefault && types.handleObj ) {
+
+ // ( event ) dispatched jQuery.Event
+ handleObj = types.handleObj;
+ jQuery( types.delegateTarget ).off(
+ handleObj.namespace ?
+ handleObj.origType + "." + handleObj.namespace :
+ handleObj.origType,
+ handleObj.selector,
+ handleObj.handler
+ );
+ return this;
+ }
+ if ( typeof types === "object" ) {
+
+ // ( types-object [, selector] )
+ for ( type in types ) {
+ this.off( type, selector, types[ type ] );
+ }
+ return this;
+ }
+ if ( selector === false || typeof selector === "function" ) {
+
+ // ( types [, fn] )
+ fn = selector;
+ selector = undefined;
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ }
+ return this.each( function() {
+ jQuery.event.remove( this, types, fn, selector );
+ } );
+ }
+} );
+
+
+var
+
+ /* eslint-disable max-len */
+
+ // See https://github.com/eslint/eslint/issues/3229
+ rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
+
+ /* eslint-enable */
+
+ // Support: IE <=10 - 11, Edge 12 - 13 only
+ // In IE/Edge using regex groups here causes severe slowdowns.
+ // See https://connect.microsoft.com/IE/feedback/details/1736512/
+ rnoInnerhtml = /<script|<style|<link/i,
+
+ // checked="checked" or checked
+ rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+ rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
+
+// Prefer a tbody over its parent table for containing new rows
+function manipulationTarget( elem, content ) {
+ if ( nodeName( elem, "table" ) &&
+ nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) {
+
+ return jQuery( elem ).children( "tbody" )[ 0 ] || elem;
+ }
+
+ return elem;
+}
+
+// Replace/restore the type attribute of script elements for safe DOM manipulation
+function disableScript( elem ) {
+ elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
+ return elem;
+}
+function restoreScript( elem ) {
+ if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) {
+ elem.type = elem.type.slice( 5 );
+ } else {
+ elem.removeAttribute( "type" );
+ }
+
+ return elem;
+}
+
+function cloneCopyEvent( src, dest ) {
+ var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
+
+ if ( dest.nodeType !== 1 ) {
+ return;
+ }
+
+ // 1. Copy private data: events, handlers, etc.
+ if ( dataPriv.hasData( src ) ) {
+ pdataOld = dataPriv.access( src );
+ pdataCur = dataPriv.set( dest, pdataOld );
+ events = pdataOld.events;
+
+ if ( events ) {
+ delete pdataCur.handle;
+ pdataCur.events = {};
+
+ for ( type in events ) {
+ for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+ jQuery.event.add( dest, type, events[ type ][ i ] );
+ }
+ }
+ }
+ }
+
+ // 2. Copy user data
+ if ( dataUser.hasData( src ) ) {
+ udataOld = dataUser.access( src );
+ udataCur = jQuery.extend( {}, udataOld );
+
+ dataUser.set( dest, udataCur );
+ }
+}
+
+// Fix IE bugs, see support tests
+function fixInput( src, dest ) {
+ var nodeName = dest.nodeName.toLowerCase();
+
+ // Fails to persist the checked state of a cloned checkbox or radio button.
+ if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
+ dest.checked = src.checked;
+
+ // Fails to return the selected option to the default selected state when cloning options
+ } else if ( nodeName === "input" || nodeName === "textarea" ) {
+ dest.defaultValue = src.defaultValue;
+ }
+}
+
+function domManip( collection, args, callback, ignored ) {
+
+ // Flatten any nested arrays
+ args = concat.apply( [], args );
+
+ var fragment, first, scripts, hasScripts, node, doc,
+ i = 0,
+ l = collection.length,
+ iNoClone = l - 1,
+ value = args[ 0 ],
+ valueIsFunction = isFunction( value );
+
+ // We can't cloneNode fragments that contain checked, in WebKit
+ if ( valueIsFunction ||
+ ( l > 1 && typeof value === "string" &&
+ !support.checkClone && rchecked.test( value ) ) ) {
+ return collection.each( function( index ) {
+ var self = collection.eq( index );
+ if ( valueIsFunction ) {
+ args[ 0 ] = value.call( this, index, self.html() );
+ }
+ domManip( self, args, callback, ignored );
+ } );
+ }
+
+ if ( l ) {
+ fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
+ first = fragment.firstChild;
+
+ if ( fragment.childNodes.length === 1 ) {
+ fragment = first;
+ }
+
+ // Require either new content or an interest in ignored elements to invoke the callback
+ if ( first || ignored ) {
+ scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
+ hasScripts = scripts.length;
+
+ // Use the original fragment for the last item
+ // instead of the first because it can end up
+ // being emptied incorrectly in certain situations (#8070).
+ for ( ; i < l; i++ ) {
+ node = fragment;
+
+ if ( i !== iNoClone ) {
+ node = jQuery.clone( node, true, true );
+
+ // Keep references to cloned scripts for later restoration
+ if ( hasScripts ) {
+
+ // Support: Android <=4.0 only, PhantomJS 1 only
+ // push.apply(_, arraylike) throws on ancient WebKit
+ jQuery.merge( scripts, getAll( node, "script" ) );
+ }
+ }
+
+ callback.call( collection[ i ], node, i );
+ }
+
+ if ( hasScripts ) {
+ doc = scripts[ scripts.length - 1 ].ownerDocument;
+
+ // Reenable scripts
+ jQuery.map( scripts, restoreScript );
+
+ // Evaluate executable scripts on first document insertion
+ for ( i = 0; i < hasScripts; i++ ) {
+ node = scripts[ i ];
+ if ( rscriptType.test( node.type || "" ) &&
+ !dataPriv.access( node, "globalEval" ) &&
+ jQuery.contains( doc, node ) ) {
+
+ if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) {
+
+ // Optional AJAX dependency, but won't run scripts if not present
+ if ( jQuery._evalUrl ) {
+ jQuery._evalUrl( node.src );
+ }
+ } else {
+ DOMEval( node.textContent.replace( rcleanScript, "" ), doc, node );
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return collection;
+}
+
+function remove( elem, selector, keepData ) {
+ var node,
+ nodes = selector ? jQuery.filter( selector, elem ) : elem,
+ i = 0;
+
+ for ( ; ( node = nodes[ i ] ) != null; i++ ) {
+ if ( !keepData && node.nodeType === 1 ) {
+ jQuery.cleanData( getAll( node ) );
+ }
+
+ if ( node.parentNode ) {
+ if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
+ setGlobalEval( getAll( node, "script" ) );
+ }
+ node.parentNode.removeChild( node );
+ }
+ }
+
+ return elem;
+}
+
+jQuery.extend( {
+ htmlPrefilter: function( html ) {
+ return html.replace( rxhtmlTag, "<$1></$2>" );
+ },
+
+ clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+ var i, l, srcElements, destElements,
+ clone = elem.cloneNode( true ),
+ inPage = jQuery.contains( elem.ownerDocument, elem );
+
+ // Fix IE cloning issues
+ if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
+ !jQuery.isXMLDoc( elem ) ) {
+
+ // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
+ destElements = getAll( clone );
+ srcElements = getAll( elem );
+
+ for ( i = 0, l = srcElements.length; i < l; i++ ) {
+ fixInput( srcElements[ i ], destElements[ i ] );
+ }
+ }
+
+ // Copy the events from the original to the clone
+ if ( dataAndEvents ) {
+ if ( deepDataAndEvents ) {
+ srcElements = srcElements || getAll( elem );
+ destElements = destElements || getAll( clone );
+
+ for ( i = 0, l = srcElements.length; i < l; i++ ) {
+ cloneCopyEvent( srcElements[ i ], destElements[ i ] );
+ }
+ } else {
+ cloneCopyEvent( elem, clone );
+ }
+ }
+
+ // Preserve script evaluation history
+ destElements = getAll( clone, "script" );
+ if ( destElements.length > 0 ) {
+ setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
+ }
+
+ // Return the cloned set
+ return clone;
+ },
+
+ cleanData: function( elems ) {
+ var data, elem, type,
+ special = jQuery.event.special,
+ i = 0;
+
+ for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
+ if ( acceptData( elem ) ) {
+ if ( ( data = elem[ dataPriv.expando ] ) ) {
+ if ( data.events ) {
+ for ( type in data.events ) {
+ if ( special[ type ] ) {
+ jQuery.event.remove( elem, type );
+
+ // This is a shortcut to avoid jQuery.event.remove's overhead
+ } else {
+ jQuery.removeEvent( elem, type, data.handle );
+ }
+ }
+ }
+
+ // Support: Chrome <=35 - 45+
+ // Assign undefined instead of using delete, see Data#remove
+ elem[ dataPriv.expando ] = undefined;
+ }
+ if ( elem[ dataUser.expando ] ) {
+
+ // Support: Chrome <=35 - 45+
+ // Assign undefined instead of using delete, see Data#remove
+ elem[ dataUser.expando ] = undefined;
+ }
+ }
+ }
+ }
+} );
+
+jQuery.fn.extend( {
+ detach: function( selector ) {
+ return remove( this, selector, true );
+ },
+
+ remove: function( selector ) {
+ return remove( this, selector );
+ },
+
+ text: function( value ) {
+ return access( this, function( value ) {
+ return value === undefined ?
+ jQuery.text( this ) :
+ this.empty().each( function() {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ this.textContent = value;
+ }
+ } );
+ }, null, value, arguments.length );
+ },
+
+ append: function() {
+ return domManip( this, arguments, function( elem ) {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ var target = manipulationTarget( this, elem );
+ target.appendChild( elem );
+ }
+ } );
+ },
+
+ prepend: function() {
+ return domManip( this, arguments, function( elem ) {
+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+ var target = manipulationTarget( this, elem );
+ target.insertBefore( elem, target.firstChild );
+ }
+ } );
+ },
+
+ before: function() {
+ return domManip( this, arguments, function( elem ) {
+ if ( this.parentNode ) {
+ this.parentNode.insertBefore( elem, this );
+ }
+ } );
+ },
+
+ after: function() {
+ return domManip( this, arguments, function( elem ) {
+ if ( this.parentNode ) {
+ this.parentNode.insertBefore( elem, this.nextSibling );
+ }
+ } );
+ },
+
+ empty: function() {
+ var elem,
+ i = 0;
+
+ for ( ; ( elem = this[ i ] ) != null; i++ ) {
+ if ( elem.nodeType === 1 ) {
+
+ // Prevent memory leaks
+ jQuery.cleanData( getAll( elem, false ) );
+
+ // Remove any remaining nodes
+ elem.textContent = "";
+ }
+ }
+
+ return this;
+ },
+
+ clone: function( dataAndEvents, deepDataAndEvents ) {
+ dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+ deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+ return this.map( function() {
+ return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+ } );
+ },
+
+ html: function( value ) {
+ return access( this, function( value ) {
+ var elem = this[ 0 ] || {},
+ i = 0,
+ l = this.length;
+
+ if ( value === undefined && elem.nodeType === 1 ) {
+ return elem.innerHTML;
+ }
+
+ // See if we can take a shortcut and just use innerHTML
+ if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+ !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
+
+ value = jQuery.htmlPrefilter( value );
+
+ try {
+ for ( ; i < l; i++ ) {
+ elem = this[ i ] || {};
+
+ // Remove element nodes and prevent memory leaks
+ if ( elem.nodeType === 1 ) {
+ jQuery.cleanData( getAll( elem, false ) );
+ elem.innerHTML = value;
+ }
+ }
+
+ elem = 0;
+
+ // If using innerHTML throws an exception, use the fallback method
+ } catch ( e ) {}
+ }
+
+ if ( elem ) {
+ this.empty().append( value );
+ }
+ }, null, value, arguments.length );
+ },
+
+ replaceWith: function() {
+ var ignored = [];
+
+ // Make the changes, replacing each non-ignored context element with the new content
+ return domManip( this, arguments, function( elem ) {
+ var parent = this.parentNode;
+
+ if ( jQuery.inArray( this, ignored ) < 0 ) {
+ jQuery.cleanData( getAll( this ) );
+ if ( parent ) {
+ parent.replaceChild( elem, this );
+ }
+ }
+
+ // Force callback invocation
+ }, ignored );
+ }
+} );
+
+jQuery.each( {
+ appendTo: "append",
+ prependTo: "prepend",
+ insertBefore: "before",
+ insertAfter: "after",
+ replaceAll: "replaceWith"
+}, function( name, original ) {
+ jQuery.fn[ name ] = function( selector ) {
+ var elems,
+ ret = [],
+ insert = jQuery( selector ),
+ last = insert.length - 1,
+ i = 0;
+
+ for ( ; i <= last; i++ ) {
+ elems = i === last ? this : this.clone( true );
+ jQuery( insert[ i ] )[ original ]( elems );
+
+ // Support: Android <=4.0 only, PhantomJS 1 only
+ // .get() because push.apply(_, arraylike) throws on ancient WebKit
+ push.apply( ret, elems.get() );
+ }
+
+ return this.pushStack( ret );
+ };
+} );
+var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );
+
+var getStyles = function( elem ) {
+
+ // Support: IE <=11 only, Firefox <=30 (#15098, #14150)
+ // IE throws on elements created in popups
+ // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
+ var view = elem.ownerDocument.defaultView;
+
+ if ( !view || !view.opener ) {
+ view = window;
+ }
+
+ return view.getComputedStyle( elem );
+ };
+
+var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
+
+
+
+( function() {
+
+ // Executing both pixelPosition & boxSizingReliable tests require only one layout
+ // so they're executed at the same time to save the second computation.
+ function computeStyleTests() {
+
+ // This is a singleton, we need to execute it only once
+ if ( !div ) {
+ return;
+ }
+
+ container.style.cssText = "position:absolute;left:-11111px;width:60px;" +
+ "margin-top:1px;padding:0;border:0";
+ div.style.cssText =
+ "position:relative;display:block;box-sizing:border-box;overflow:scroll;" +
+ "margin:auto;border:1px;padding:1px;" +
+ "width:60%;top:1%";
+ documentElement.appendChild( container ).appendChild( div );
+
+ var divStyle = window.getComputedStyle( div );
+ pixelPositionVal = divStyle.top !== "1%";
+
+ // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
+ reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;
+
+ // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3
+ // Some styles come back with percentage values, even though they shouldn't
+ div.style.right = "60%";
+ pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;
+
+ // Support: IE 9 - 11 only
+ // Detect misreporting of content dimensions for box-sizing:border-box elements
+ boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;
+
+ // Support: IE 9 only
+ // Detect overflow:scroll screwiness (gh-3699)
+ div.style.position = "absolute";
+ scrollboxSizeVal = div.offsetWidth === 36 || "absolute";
+
+ documentElement.removeChild( container );
+
+ // Nullify the div so it wouldn't be stored in the memory and
+ // it will also be a sign that checks already performed
+ div = null;
+ }
+
+ function roundPixelMeasures( measure ) {
+ return Math.round( parseFloat( measure ) );
+ }
+
+ var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
+ reliableMarginLeftVal,
+ container = document.createElement( "div" ),
+ div = document.createElement( "div" );
+
+ // Finish early in limited (non-browser) environments
+ if ( !div.style ) {
+ return;
+ }
+
+ // Support: IE <=9 - 11 only
+ // Style of cloned element affects source element cloned (#8908)
+ div.style.backgroundClip = "content-box";
+ div.cloneNode( true ).style.backgroundClip = "";
+ support.clearCloneStyle = div.style.backgroundClip === "content-box";
+
+ jQuery.extend( support, {
+ boxSizingReliable: function() {
+ computeStyleTests();
+ return boxSizingReliableVal;
+ },
+ pixelBoxStyles: function() {
+ computeStyleTests();
+ return pixelBoxStylesVal;
+ },
+ pixelPosition: function() {
+ computeStyleTests();
+ return pixelPositionVal;
+ },
+ reliableMarginLeft: function() {
+ computeStyleTests();
+ return reliableMarginLeftVal;
+ },
+ scrollboxSize: function() {
+ computeStyleTests();
+ return scrollboxSizeVal;
+ }
+ } );
+} )();
+
+
+function curCSS( elem, name, computed ) {
+ var width, minWidth, maxWidth, ret,
+
+ // Support: Firefox 51+
+ // Retrieving style before computed somehow
+ // fixes an issue with getting wrong values
+ // on detached elements
+ style = elem.style;
+
+ computed = computed || getStyles( elem );
+
+ // getPropertyValue is needed for:
+ // .css('filter') (IE 9 only, #12537)
+ // .css('--customProperty) (#3144)
+ if ( computed ) {
+ ret = computed.getPropertyValue( name ) || computed[ name ];
+
+ if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
+ ret = jQuery.style( elem, name );
+ }
+
+ // A tribute to the "awesome hack by Dean Edwards"
+ // Android Browser returns percentage for some values,
+ // but width seems to be reliably pixels.
+ // This is against the CSSOM draft spec:
+ // https://drafts.csswg.org/cssom/#resolved-values
+ if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {
+
+ // Remember the original values
+ width = style.width;
+ minWidth = style.minWidth;
+ maxWidth = style.maxWidth;
+
+ // Put in the new values to get a computed value out
+ style.minWidth = style.maxWidth = style.width = ret;
+ ret = computed.width;
+
+ // Revert the changed values
+ style.width = width;
+ style.minWidth = minWidth;
+ style.maxWidth = maxWidth;
+ }
+ }
+
+ return ret !== undefined ?
+
+ // Support: IE <=9 - 11 only
+ // IE returns zIndex value as an integer.
+ ret + "" :
+ ret;
+}
+
+
+function addGetHookIf( conditionFn, hookFn ) {
+
+ // Define the hook, we'll check on the first run if it's really needed.
+ return {
+ get: function() {
+ if ( conditionFn() ) {
+
+ // Hook not needed (or it's not possible to use it due
+ // to missing dependency), remove it.
+ delete this.get;
+ return;
+ }
+
+ // Hook needed; redefine it so that the support test is not executed again.
+ return ( this.get = hookFn ).apply( this, arguments );
+ }
+ };
+}
+
+
+var
+
+ // Swappable if display is none or starts with table
+ // except "table", "table-cell", or "table-caption"
+ // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+ rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+ rcustomProp = /^--/,
+ cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+ cssNormalTransform = {
+ letterSpacing: "0",
+ fontWeight: "400"
+ },
+
+ cssPrefixes = [ "Webkit", "Moz", "ms" ],
+ emptyStyle = document.createElement( "div" ).style;
+
+// Return a css property mapped to a potentially vendor prefixed property
+function vendorPropName( name ) {
+
+ // Shortcut for names that are not vendor prefixed
+ if ( name in emptyStyle ) {
+ return name;
+ }
+
+ // Check for vendor prefixed names
+ var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
+ i = cssPrefixes.length;
+
+ while ( i-- ) {
+ name = cssPrefixes[ i ] + capName;
+ if ( name in emptyStyle ) {
+ return name;
+ }
+ }
+}
+
+// Return a property mapped along what jQuery.cssProps suggests or to
+// a vendor prefixed property.
+function finalPropName( name ) {
+ var ret = jQuery.cssProps[ name ];
+ if ( !ret ) {
+ ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;
+ }
+ return ret;
+}
+
+function setPositiveNumber( elem, value, subtract ) {
+
+ // Any relative (+/-) values have already been
+ // normalized at this point
+ var matches = rcssNum.exec( value );
+ return matches ?
+
+ // Guard against undefined "subtract", e.g., when used as in cssHooks
+ Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
+ value;
+}
+
+function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {
+ var i = dimension === "width" ? 1 : 0,
+ extra = 0,
+ delta = 0;
+
+ // Adjustment may not be necessary
+ if ( box === ( isBorderBox ? "border" : "content" ) ) {
+ return 0;
+ }
+
+ for ( ; i < 4; i += 2 ) {
+
+ // Both box models exclude margin
+ if ( box === "margin" ) {
+ delta += jQuery.css( elem, box + cssExpand[ i ], true, styles );
+ }
+
+ // If we get here with a content-box, we're seeking "padding" or "border" or "margin"
+ if ( !isBorderBox ) {
+
+ // Add padding
+ delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+
+ // For "border" or "margin", add border
+ if ( box !== "padding" ) {
+ delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+
+ // But still keep track of it otherwise
+ } else {
+ extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+ }
+
+ // If we get here with a border-box (content + padding + border), we're seeking "content" or
+ // "padding" or "margin"
+ } else {
+
+ // For "content", subtract padding
+ if ( box === "content" ) {
+ delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+ }
+
+ // For "content" or "padding", subtract border
+ if ( box !== "margin" ) {
+ delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+ }
+ }
+ }
+
+ // Account for positive content-box scroll gutter when requested by providing computedVal
+ if ( !isBorderBox && computedVal >= 0 ) {
+
+ // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
+ // Assuming integer scroll gutter, subtract the rest and round down
+ delta += Math.max( 0, Math.ceil(
+ elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
+ computedVal -
+ delta -
+ extra -
+ 0.5
+ ) );
+ }
+
+ return delta;
+}
+
+function getWidthOrHeight( elem, dimension, extra ) {
+
+ // Start with computed style
+ var styles = getStyles( elem ),
+ val = curCSS( elem, dimension, styles ),
+ isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+ valueIsBorderBox = isBorderBox;
+
+ // Support: Firefox <=54
+ // Return a confounding non-pixel value or feign ignorance, as appropriate.
+ if ( rnumnonpx.test( val ) ) {
+ if ( !extra ) {
+ return val;
+ }
+ val = "auto";
+ }
+
+ // Check for style in case a browser which returns unreliable values
+ // for getComputedStyle silently falls back to the reliable elem.style
+ valueIsBorderBox = valueIsBorderBox &&
+ ( support.boxSizingReliable() || val === elem.style[ dimension ] );
+
+ // Fall back to offsetWidth/offsetHeight when value is "auto"
+ // This happens for inline elements with no explicit setting (gh-3571)
+ // Support: Android <=4.1 - 4.3 only
+ // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
+ if ( val === "auto" ||
+ !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) {
+
+ val = elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ];
+
+ // offsetWidth/offsetHeight provide border-box values
+ valueIsBorderBox = true;
+ }
+
+ // Normalize "" and auto
+ val = parseFloat( val ) || 0;
+
+ // Adjust for the element's box model
+ return ( val +
+ boxModelAdjustment(
+ elem,
+ dimension,
+ extra || ( isBorderBox ? "border" : "content" ),
+ valueIsBorderBox,
+ styles,
+
+ // Provide the current computed size to request scroll gutter calculation (gh-3589)
+ val
+ )
+ ) + "px";
+}
+
+jQuery.extend( {
+
+ // Add in style property hooks for overriding the default
+ // behavior of getting and setting a style property
+ cssHooks: {
+ opacity: {
+ get: function( elem, computed ) {
+ if ( computed ) {
+
+ // We should always get a number back from opacity
+ var ret = curCSS( elem, "opacity" );
+ return ret === "" ? "1" : ret;
+ }
+ }
+ }
+ },
+
+ // Don't automatically add "px" to these possibly-unitless properties
+ cssNumber: {
+ "animationIterationCount": true,
+ "columnCount": true,
+ "fillOpacity": true,
+ "flexGrow": true,
+ "flexShrink": true,
+ "fontWeight": true,
+ "lineHeight": true,
+ "opacity": true,
+ "order": true,
+ "orphans": true,
+ "widows": true,
+ "zIndex": true,
+ "zoom": true
+ },
+
+ // Add in properties whose names you wish to fix before
+ // setting or getting the value
+ cssProps: {},
+
+ // Get and set the style property on a DOM Node
+ style: function( elem, name, value, extra ) {
+
+ // Don't set styles on text and comment nodes
+ if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+ return;
+ }
+
+ // Make sure that we're working with the right name
+ var ret, type, hooks,
+ origName = camelCase( name ),
+ isCustomProp = rcustomProp.test( name ),
+ style = elem.style;
+
+ // Make sure that we're working with the right name. We don't
+ // want to query the value if it is a CSS custom property
+ // since they are user-defined.
+ if ( !isCustomProp ) {
+ name = finalPropName( origName );
+ }
+
+ // Gets hook for the prefixed version, then unprefixed version
+ hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+ // Check if we're setting a value
+ if ( value !== undefined ) {
+ type = typeof value;
+
+ // Convert "+=" or "-=" to relative numbers (#7345)
+ if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
+ value = adjustCSS( elem, name, ret );
+
+ // Fixes bug #9237
+ type = "number";
+ }
+
+ // Make sure that null and NaN values aren't set (#7116)
+ if ( value == null || value !== value ) {
+ return;
+ }
+
+ // If a number was passed in, add the unit (except for certain CSS properties)
+ if ( type === "number" ) {
+ value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
+ }
+
+ // background-* props affect original clone's values
+ if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
+ style[ name ] = "inherit";
+ }
+
+ // If a hook was provided, use that value, otherwise just set the specified value
+ if ( !hooks || !( "set" in hooks ) ||
+ ( value = hooks.set( elem, value, extra ) ) !== undefined ) {
+
+ if ( isCustomProp ) {
+ style.setProperty( name, value );
+ } else {
+ style[ name ] = value;
+ }
+ }
+
+ } else {
+
+ // If a hook was provided get the non-computed value from there
+ if ( hooks && "get" in hooks &&
+ ( ret = hooks.get( elem, false, extra ) ) !== undefined ) {
+
+ return ret;
+ }
+
+ // Otherwise just get the value from the style object
+ return style[ name ];
+ }
+ },
+
+ css: function( elem, name, extra, styles ) {
+ var val, num, hooks,
+ origName = camelCase( name ),
+ isCustomProp = rcustomProp.test( name );
+
+ // Make sure that we're working with the right name. We don't
+ // want to modify the value if it is a CSS custom property
+ // since they are user-defined.
+ if ( !isCustomProp ) {
+ name = finalPropName( origName );
+ }
+
+ // Try prefixed name followed by the unprefixed name
+ hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+ // If a hook was provided get the computed value from there
+ if ( hooks && "get" in hooks ) {
+ val = hooks.get( elem, true, extra );
+ }
+
+ // Otherwise, if a way to get the computed value exists, use that
+ if ( val === undefined ) {
+ val = curCSS( elem, name, styles );
+ }
+
+ // Convert "normal" to computed value
+ if ( val === "normal" && name in cssNormalTransform ) {
+ val = cssNormalTransform[ name ];
+ }
+
+ // Make numeric if forced or a qualifier was provided and val looks numeric
+ if ( extra === "" || extra ) {
+ num = parseFloat( val );
+ return extra === true || isFinite( num ) ? num || 0 : val;
+ }
+
+ return val;
+ }
+} );
+
+jQuery.each( [ "height", "width" ], function( i, dimension ) {
+ jQuery.cssHooks[ dimension ] = {
+ get: function( elem, computed, extra ) {
+ if ( computed ) {
+
+ // Certain elements can have dimension info if we invisibly show them
+ // but it must have a current display style that would benefit
+ return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
+
+ // Support: Safari 8+
+ // Table columns in Safari have non-zero offsetWidth & zero
+ // getBoundingClientRect().width unless display is changed.
+ // Support: IE <=11 only
+ // Running getBoundingClientRect on a disconnected node
+ // in IE throws an error.
+ ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
+ swap( elem, cssShow, function() {
+ return getWidthOrHeight( elem, dimension, extra );
+ } ) :
+ getWidthOrHeight( elem, dimension, extra );
+ }
+ },
+
+ set: function( elem, value, extra ) {
+ var matches,
+ styles = getStyles( elem ),
+ isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+ subtract = extra && boxModelAdjustment(
+ elem,
+ dimension,
+ extra,
+ isBorderBox,
+ styles
+ );
+
+ // Account for unreliable border-box dimensions by comparing offset* to computed and
+ // faking a content-box to get border and padding (gh-3699)
+ if ( isBorderBox && support.scrollboxSize() === styles.position ) {
+ subtract -= Math.ceil(
+ elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -
+ parseFloat( styles[ dimension ] ) -
+ boxModelAdjustment( elem, dimension, "border", false, styles ) -
+ 0.5
+ );
+ }
+
+ // Convert to pixels if value adjustment is needed
+ if ( subtract && ( matches = rcssNum.exec( value ) ) &&
+ ( matches[ 3 ] || "px" ) !== "px" ) {
+
+ elem.style[ dimension ] = value;
+ value = jQuery.css( elem, dimension );
+ }
+
+ return setPositiveNumber( elem, value, subtract );
+ }
+ };
+} );
+
+jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
+ function( elem, computed ) {
+ if ( computed ) {
+ return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
+ elem.getBoundingClientRect().left -
+ swap( elem, { marginLeft: 0 }, function() {
+ return elem.getBoundingClientRect().left;
+ } )
+ ) + "px";
+ }
+ }
+);
+
+// These hooks are used by animate to expand properties
+jQuery.each( {
+ margin: "",
+ padding: "",
+ border: "Width"
+}, function( prefix, suffix ) {
+ jQuery.cssHooks[ prefix + suffix ] = {
+ expand: function( value ) {
+ var i = 0,
+ expanded = {},
+
+ // Assumes a single number if not a string
+ parts = typeof value === "string" ? value.split( " " ) : [ value ];
+
+ for ( ; i < 4; i++ ) {
+ expanded[ prefix + cssExpand[ i ] + suffix ] =
+ parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+ }
+
+ return expanded;
+ }
+ };
+
+ if ( prefix !== "margin" ) {
+ jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+ }
+} );
+
+jQuery.fn.extend( {
+ css: function( name, value ) {
+ return access( this, function( elem, name, value ) {
+ var styles, len,
+ map = {},
+ i = 0;
+
+ if ( Array.isArray( name ) ) {
+ styles = getStyles( elem );
+ len = name.length;
+
+ for ( ; i < len; i++ ) {
+ map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
+ }
+
+ return map;
+ }
+
+ return value !== undefined ?
+ jQuery.style( elem, name, value ) :
+ jQuery.css( elem, name );
+ }, name, value, arguments.length > 1 );
+ }
+} );
+
+
+function Tween( elem, options, prop, end, easing ) {
+ return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
+
+Tween.prototype = {
+ constructor: Tween,
+ init: function( elem, options, prop, end, easing, unit ) {
+ this.elem = elem;
+ this.prop = prop;
+ this.easing = easing || jQuery.easing._default;
+ this.options = options;
+ this.start = this.now = this.cur();
+ this.end = end;
+ this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+ },
+ cur: function() {
+ var hooks = Tween.propHooks[ this.prop ];
+
+ return hooks && hooks.get ?
+ hooks.get( this ) :
+ Tween.propHooks._default.get( this );
+ },
+ run: function( percent ) {
+ var eased,
+ hooks = Tween.propHooks[ this.prop ];
+
+ if ( this.options.duration ) {
+ this.pos = eased = jQuery.easing[ this.easing ](
+ percent, this.options.duration * percent, 0, 1, this.options.duration
+ );
+ } else {
+ this.pos = eased = percent;
+ }
+ this.now = ( this.end - this.start ) * eased + this.start;
+
+ if ( this.options.step ) {
+ this.options.step.call( this.elem, this.now, this );
+ }
+
+ if ( hooks && hooks.set ) {
+ hooks.set( this );
+ } else {
+ Tween.propHooks._default.set( this );
+ }
+ return this;
+ }
+};
+
+Tween.prototype.init.prototype = Tween.prototype;
+
+Tween.propHooks = {
+ _default: {
+ get: function( tween ) {
+ var result;
+
+ // Use a property on the element directly when it is not a DOM element,
+ // or when there is no matching style property that exists.
+ if ( tween.elem.nodeType !== 1 ||
+ tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
+ return tween.elem[ tween.prop ];
+ }
+
+ // Passing an empty string as a 3rd parameter to .css will automatically
+ // attempt a parseFloat and fallback to a string if the parse fails.
+ // Simple values such as "10px" are parsed to Float;
+ // complex values such as "rotate(1rad)" are returned as-is.
+ result = jQuery.css( tween.elem, tween.prop, "" );
+
+ // Empty strings, null, undefined and "auto" are converted to 0.
+ return !result || result === "auto" ? 0 : result;
+ },
+ set: function( tween ) {
+
+ // Use step hook for back compat.
+ // Use cssHook if its there.
+ // Use .style if available and use plain properties where available.
+ if ( jQuery.fx.step[ tween.prop ] ) {
+ jQuery.fx.step[ tween.prop ]( tween );
+ } else if ( tween.elem.nodeType === 1 &&
+ ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||
+ jQuery.cssHooks[ tween.prop ] ) ) {
+ jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
+ } else {
+ tween.elem[ tween.prop ] = tween.now;
+ }
+ }
+ }
+};
+
+// Support: IE <=9 only
+// Panic based approach to setting things on disconnected nodes
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+ set: function( tween ) {
+ if ( tween.elem.nodeType && tween.elem.parentNode ) {
+ tween.elem[ tween.prop ] = tween.now;
+ }
+ }
+};
+
+jQuery.easing = {
+ linear: function( p ) {
+ return p;
+ },
+ swing: function( p ) {
+ return 0.5 - Math.cos( p * Math.PI ) / 2;
+ },
+ _default: "swing"
+};
+
+jQuery.fx = Tween.prototype.init;
+
+// Back compat <1.8 extension point
+jQuery.fx.step = {};
+
+
+
+
+var
+ fxNow, inProgress,
+ rfxtypes = /^(?:toggle|show|hide)$/,
+ rrun = /queueHooks$/;
+
+function schedule() {
+ if ( inProgress ) {
+ if ( document.hidden === false && window.requestAnimationFrame ) {
+ window.requestAnimationFrame( schedule );
+ } else {
+ window.setTimeout( schedule, jQuery.fx.interval );
+ }
+
+ jQuery.fx.tick();
+ }
+}
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+ window.setTimeout( function() {
+ fxNow = undefined;
+ } );
+ return ( fxNow = Date.now() );
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+ var which,
+ i = 0,
+ attrs = { height: type };
+
+ // If we include width, step value is 1 to do all cssExpand values,
+ // otherwise step value is 2 to skip over Left and Right
+ includeWidth = includeWidth ? 1 : 0;
+ for ( ; i < 4; i += 2 - includeWidth ) {
+ which = cssExpand[ i ];
+ attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
+ }
+
+ if ( includeWidth ) {
+ attrs.opacity = attrs.width = type;
+ }
+
+ return attrs;
+}
+
+function createTween( value, prop, animation ) {
+ var tween,
+ collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
+ index = 0,
+ length = collection.length;
+ for ( ; index < length; index++ ) {
+ if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {
+
+ // We're done with this property
+ return tween;
+ }
+ }
+}
+
+function defaultPrefilter( elem, props, opts ) {
+ var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
+ isBox = "width" in props || "height" in props,
+ anim = this,
+ orig = {},
+ style = elem.style,
+ hidden = elem.nodeType && isHiddenWithinTree( elem ),
+ dataShow = dataPriv.get( elem, "fxshow" );
+
+ // Queue-skipping animations hijack the fx hooks
+ if ( !opts.queue ) {
+ hooks = jQuery._queueHooks( elem, "fx" );
+ if ( hooks.unqueued == null ) {
+ hooks.unqueued = 0;
+ oldfire = hooks.empty.fire;
+ hooks.empty.fire = function() {
+ if ( !hooks.unqueued ) {
+ oldfire();
+ }
+ };
+ }
+ hooks.unqueued++;
+
+ anim.always( function() {
+
+ // Ensure the complete handler is called before this completes
+ anim.always( function() {
+ hooks.unqueued--;
+ if ( !jQuery.queue( elem, "fx" ).length ) {
+ hooks.empty.fire();
+ }
+ } );
+ } );
+ }
+
+ // Detect show/hide animations
+ for ( prop in props ) {
+ value = props[ prop ];
+ if ( rfxtypes.test( value ) ) {
+ delete props[ prop ];
+ toggle = toggle || value === "toggle";
+ if ( value === ( hidden ? "hide" : "show" ) ) {
+
+ // Pretend to be hidden if this is a "show" and
+ // there is still data from a stopped show/hide
+ if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
+ hidden = true;
+
+ // Ignore all other no-op show/hide data
+ } else {
+ continue;
+ }
+ }
+ orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
+ }
+ }
+
+ // Bail out if this is a no-op like .hide().hide()
+ propTween = !jQuery.isEmptyObject( props );
+ if ( !propTween && jQuery.isEmptyObject( orig ) ) {
+ return;
+ }
+
+ // Restrict "overflow" and "display" styles during box animations
+ if ( isBox && elem.nodeType === 1 ) {
+
+ // Support: IE <=9 - 11, Edge 12 - 15
+ // Record all 3 overflow attributes because IE does not infer the shorthand
+ // from identically-valued overflowX and overflowY and Edge just mirrors
+ // the overflowX value there.
+ opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
+
+ // Identify a display type, preferring old show/hide data over the CSS cascade
+ restoreDisplay = dataShow && dataShow.display;
+ if ( restoreDisplay == null ) {
+ restoreDisplay = dataPriv.get( elem, "display" );
+ }
+ display = jQuery.css( elem, "display" );
+ if ( display === "none" ) {
+ if ( restoreDisplay ) {
+ display = restoreDisplay;
+ } else {
+
+ // Get nonempty value(s) by temporarily forcing visibility
+ showHide( [ elem ], true );
+ restoreDisplay = elem.style.display || restoreDisplay;
+ display = jQuery.css( elem, "display" );
+ showHide( [ elem ] );
+ }
+ }
+
+ // Animate inline elements as inline-block
+ if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) {
+ if ( jQuery.css( elem, "float" ) === "none" ) {
+
+ // Restore the original display value at the end of pure show/hide animations
+ if ( !propTween ) {
+ anim.done( function() {
+ style.display = restoreDisplay;
+ } );
+ if ( restoreDisplay == null ) {
+ display = style.display;
+ restoreDisplay = display === "none" ? "" : display;
+ }
+ }
+ style.display = "inline-block";
+ }
+ }
+ }
+
+ if ( opts.overflow ) {
+ style.overflow = "hidden";
+ anim.always( function() {
+ style.overflow = opts.overflow[ 0 ];
+ style.overflowX = opts.overflow[ 1 ];
+ style.overflowY = opts.overflow[ 2 ];
+ } );
+ }
+
+ // Implement show/hide animations
+ propTween = false;
+ for ( prop in orig ) {
+
+ // General show/hide setup for this element animation
+ if ( !propTween ) {
+ if ( dataShow ) {
+ if ( "hidden" in dataShow ) {
+ hidden = dataShow.hidden;
+ }
+ } else {
+ dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } );
+ }
+
+ // Store hidden/visible for toggle so `.stop().toggle()` "reverses"
+ if ( toggle ) {
+ dataShow.hidden = !hidden;
+ }
+
+ // Show elements before animating them
+ if ( hidden ) {
+ showHide( [ elem ], true );
+ }
+
+ /* eslint-disable no-loop-func */
+
+ anim.done( function() {
+
+ /* eslint-enable no-loop-func */
+
+ // The final step of a "hide" animation is actually hiding the element
+ if ( !hidden ) {
+ showHide( [ elem ] );
+ }
+ dataPriv.remove( elem, "fxshow" );
+ for ( prop in orig ) {
+ jQuery.style( elem, prop, orig[ prop ] );
+ }
+ } );
+ }
+
+ // Per-property setup
+ propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
+ if ( !( prop in dataShow ) ) {
+ dataShow[ prop ] = propTween.start;
+ if ( hidden ) {
+ propTween.end = propTween.start;
+ propTween.start = 0;
+ }
+ }
+ }
+}
+
+function propFilter( props, specialEasing ) {
+ var index, name, easing, value, hooks;
+
+ // camelCase, specialEasing and expand cssHook pass
+ for ( index in props ) {
+ name = camelCase( index );
+ easing = specialEasing[ name ];
+ value = props[ index ];
+ if ( Array.isArray( value ) ) {
+ easing = value[ 1 ];
+ value = props[ index ] = value[ 0 ];
+ }
+
+ if ( index !== name ) {
+ props[ name ] = value;
+ delete props[ index ];
+ }
+
+ hooks = jQuery.cssHooks[ name ];
+ if ( hooks && "expand" in hooks ) {
+ value = hooks.expand( value );
+ delete props[ name ];
+
+ // Not quite $.extend, this won't overwrite existing keys.
+ // Reusing 'index' because we have the correct "name"
+ for ( index in value ) {
+ if ( !( index in props ) ) {
+ props[ index ] = value[ index ];
+ specialEasing[ index ] = easing;
+ }
+ }
+ } else {
+ specialEasing[ name ] = easing;
+ }
+ }
+}
+
+function Animation( elem, properties, options ) {
+ var result,
+ stopped,
+ index = 0,
+ length = Animation.prefilters.length,
+ deferred = jQuery.Deferred().always( function() {
+
+ // Don't match elem in the :animated selector
+ delete tick.elem;
+ } ),
+ tick = function() {
+ if ( stopped ) {
+ return false;
+ }
+ var currentTime = fxNow || createFxNow(),
+ remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+
+ // Support: Android 2.3 only
+ // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
+ temp = remaining / animation.duration || 0,
+ percent = 1 - temp,
+ index = 0,
+ length = animation.tweens.length;
+
+ for ( ; index < length; index++ ) {
+ animation.tweens[ index ].run( percent );
+ }
+
+ deferred.notifyWith( elem, [ animation, percent, remaining ] );
+
+ // If there's more to do, yield
+ if ( percent < 1 && length ) {
+ return remaining;
+ }
+
+ // If this was an empty animation, synthesize a final progress notification
+ if ( !length ) {
+ deferred.notifyWith( elem, [ animation, 1, 0 ] );
+ }
+
+ // Resolve the animation and report its conclusion
+ deferred.resolveWith( elem, [ animation ] );
+ return false;
+ },
+ animation = deferred.promise( {
+ elem: elem,
+ props: jQuery.extend( {}, properties ),
+ opts: jQuery.extend( true, {
+ specialEasing: {},
+ easing: jQuery.easing._default
+ }, options ),
+ originalProperties: properties,
+ originalOptions: options,
+ startTime: fxNow || createFxNow(),
+ duration: options.duration,
+ tweens: [],
+ createTween: function( prop, end ) {
+ var tween = jQuery.Tween( elem, animation.opts, prop, end,
+ animation.opts.specialEasing[ prop ] || animation.opts.easing );
+ animation.tweens.push( tween );
+ return tween;
+ },
+ stop: function( gotoEnd ) {
+ var index = 0,
+
+ // If we are going to the end, we want to run all the tweens
+ // otherwise we skip this part
+ length = gotoEnd ? animation.tweens.length : 0;
+ if ( stopped ) {
+ return this;
+ }
+ stopped = true;
+ for ( ; index < length; index++ ) {
+ animation.tweens[ index ].run( 1 );
+ }
+
+ // Resolve when we played the last frame; otherwise, reject
+ if ( gotoEnd ) {
+ deferred.notifyWith( elem, [ animation, 1, 0 ] );
+ deferred.resolveWith( elem, [ animation, gotoEnd ] );
+ } else {
+ deferred.rejectWith( elem, [ animation, gotoEnd ] );
+ }
+ return this;
+ }
+ } ),
+ props = animation.props;
+
+ propFilter( props, animation.opts.specialEasing );
+
+ for ( ; index < length; index++ ) {
+ result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
+ if ( result ) {
+ if ( isFunction( result.stop ) ) {
+ jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
+ result.stop.bind( result );
+ }
+ return result;
+ }
+ }
+
+ jQuery.map( props, createTween, animation );
+
+ if ( isFunction( animation.opts.start ) ) {
+ animation.opts.start.call( elem, animation );
+ }
+
+ // Attach callbacks from options
+ animation
+ .progress( animation.opts.progress )
+ .done( animation.opts.done, animation.opts.complete )
+ .fail( animation.opts.fail )
+ .always( animation.opts.always );
+
+ jQuery.fx.timer(
+ jQuery.extend( tick, {
+ elem: elem,
+ anim: animation,
+ queue: animation.opts.queue
+ } )
+ );
+
+ return animation;
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+
+ tweeners: {
+ "*": [ function( prop, value ) {
+ var tween = this.createTween( prop, value );
+ adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
+ return tween;
+ } ]
+ },
+
+ tweener: function( props, callback ) {
+ if ( isFunction( props ) ) {
+ callback = props;
+ props = [ "*" ];
+ } else {
+ props = props.match( rnothtmlwhite );
+ }
+
+ var prop,
+ index = 0,
+ length = props.length;
+
+ for ( ; index < length; index++ ) {
+ prop = props[ index ];
+ Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
+ Animation.tweeners[ prop ].unshift( callback );
+ }
+ },
+
+ prefilters: [ defaultPrefilter ],
+
+ prefilter: function( callback, prepend ) {
+ if ( prepend ) {
+ Animation.prefilters.unshift( callback );
+ } else {
+ Animation.prefilters.push( callback );
+ }
+ }
+} );
+
+jQuery.speed = function( speed, easing, fn ) {
+ var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+ complete: fn || !fn && easing ||
+ isFunction( speed ) && speed,
+ duration: speed,
+ easing: fn && easing || easing && !isFunction( easing ) && easing
+ };
+
+ // Go to the end state if fx are off
+ if ( jQuery.fx.off ) {
+ opt.duration = 0;
+
+ } else {
+ if ( typeof opt.duration !== "number" ) {
+ if ( opt.duration in jQuery.fx.speeds ) {
+ opt.duration = jQuery.fx.speeds[ opt.duration ];
+
+ } else {
+ opt.duration = jQuery.fx.speeds._default;
+ }
+ }
+ }
+
+ // Normalize opt.queue - true/undefined/null -> "fx"
+ if ( opt.queue == null || opt.queue === true ) {
+ opt.queue = "fx";
+ }
+
+ // Queueing
+ opt.old = opt.complete;
+
+ opt.complete = function() {
+ if ( isFunction( opt.old ) ) {
+ opt.old.call( this );
+ }
+
+ if ( opt.queue ) {
+ jQuery.dequeue( this, opt.queue );
+ }
+ };
+
+ return opt;
+};
+
+jQuery.fn.extend( {
+ fadeTo: function( speed, to, easing, callback ) {
+
+ // Show any hidden elements after setting opacity to 0
+ return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show()
+
+ // Animate to the value specified
+ .end().animate( { opacity: to }, speed, easing, callback );
+ },
+ animate: function( prop, speed, easing, callback ) {
+ var empty = jQuery.isEmptyObject( prop ),
+ optall = jQuery.speed( speed, easing, callback ),
+ doAnimation = function() {
+
+ // Operate on a copy of prop so per-property easing won't be lost
+ var anim = Animation( this, jQuery.extend( {}, prop ), optall );
+
+ // Empty animations, or finishing resolves immediately
+ if ( empty || dataPriv.get( this, "finish" ) ) {
+ anim.stop( true );
+ }
+ };
+ doAnimation.finish = doAnimation;
+
+ return empty || optall.queue === false ?
+ this.each( doAnimation ) :
+ this.queue( optall.queue, doAnimation );
+ },
+ stop: function( type, clearQueue, gotoEnd ) {
+ var stopQueue = function( hooks ) {
+ var stop = hooks.stop;
+ delete hooks.stop;
+ stop( gotoEnd );
+ };
+
+ if ( typeof type !== "string" ) {
+ gotoEnd = clearQueue;
+ clearQueue = type;
+ type = undefined;
+ }
+ if ( clearQueue && type !== false ) {
+ this.queue( type || "fx", [] );
+ }
+
+ return this.each( function() {
+ var dequeue = true,
+ index = type != null && type + "queueHooks",
+ timers = jQuery.timers,
+ data = dataPriv.get( this );
+
+ if ( index ) {
+ if ( data[ index ] && data[ index ].stop ) {
+ stopQueue( data[ index ] );
+ }
+ } else {
+ for ( index in data ) {
+ if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+ stopQueue( data[ index ] );
+ }
+ }
+ }
+
+ for ( index = timers.length; index--; ) {
+ if ( timers[ index ].elem === this &&
+ ( type == null || timers[ index ].queue === type ) ) {
+
+ timers[ index ].anim.stop( gotoEnd );
+ dequeue = false;
+ timers.splice( index, 1 );
+ }
+ }
+
+ // Start the next in the queue if the last step wasn't forced.
+ // Timers currently will call their complete callbacks, which
+ // will dequeue but only if they were gotoEnd.
+ if ( dequeue || !gotoEnd ) {
+ jQuery.dequeue( this, type );
+ }
+ } );
+ },
+ finish: function( type ) {
+ if ( type !== false ) {
+ type = type || "fx";
+ }
+ return this.each( function() {
+ var index,
+ data = dataPriv.get( this ),
+ queue = data[ type + "queue" ],
+ hooks = data[ type + "queueHooks" ],
+ timers = jQuery.timers,
+ length = queue ? queue.length : 0;
+
+ // Enable finishing flag on private data
+ data.finish = true;
+
+ // Empty the queue first
+ jQuery.queue( this, type, [] );
+
+ if ( hooks && hooks.stop ) {
+ hooks.stop.call( this, true );
+ }
+
+ // Look for any active animations, and finish them
+ for ( index = timers.length; index--; ) {
+ if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
+ timers[ index ].anim.stop( true );
+ timers.splice( index, 1 );
+ }
+ }
+
+ // Look for any animations in the old queue and finish them
+ for ( index = 0; index < length; index++ ) {
+ if ( queue[ index ] && queue[ index ].finish ) {
+ queue[ index ].finish.call( this );
+ }
+ }
+
+ // Turn off finishing flag
+ delete data.finish;
+ } );
+ }
+} );
+
+jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
+ var cssFn = jQuery.fn[ name ];
+ jQuery.fn[ name ] = function( speed, easing, callback ) {
+ return speed == null || typeof speed === "boolean" ?
+ cssFn.apply( this, arguments ) :
+ this.animate( genFx( name, true ), speed, easing, callback );
+ };
+} );
+
+// Generate shortcuts for custom animations
+jQuery.each( {
+ slideDown: genFx( "show" ),
+ slideUp: genFx( "hide" ),
+ slideToggle: genFx( "toggle" ),
+ fadeIn: { opacity: "show" },
+ fadeOut: { opacity: "hide" },
+ fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+ jQuery.fn[ name ] = function( speed, easing, callback ) {
+ return this.animate( props, speed, easing, callback );
+ };
+} );
+
+jQuery.timers = [];
+jQuery.fx.tick = function() {
+ var timer,
+ i = 0,
+ timers = jQuery.timers;
+
+ fxNow = Date.now();
+
+ for ( ; i < timers.length; i++ ) {
+ timer = timers[ i ];
+
+ // Run the timer and safely remove it when done (allowing for external removal)
+ if ( !timer() && timers[ i ] === timer ) {
+ timers.splice( i--, 1 );
+ }
+ }
+
+ if ( !timers.length ) {
+ jQuery.fx.stop();
+ }
+ fxNow = undefined;
+};
+
+jQuery.fx.timer = function( timer ) {
+ jQuery.timers.push( timer );
+ jQuery.fx.start();
+};
+
+jQuery.fx.interval = 13;
+jQuery.fx.start = function() {
+ if ( inProgress ) {
+ return;
+ }
+
+ inProgress = true;
+ schedule();
+};
+
+jQuery.fx.stop = function() {
+ inProgress = null;
+};
+
+jQuery.fx.speeds = {
+ slow: 600,
+ fast: 200,
+
+ // Default speed
+ _default: 400
+};
+
+
+// Based off of the plugin by Clint Helfers, with permission.
+// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
+jQuery.fn.delay = function( time, type ) {
+ time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+ type = type || "fx";
+
+ return this.queue( type, function( next, hooks ) {
+ var timeout = window.setTimeout( next, time );
+ hooks.stop = function() {
+ window.clearTimeout( timeout );
+ };
+ } );
+};
+
+
+( function() {
+ var input = document.createElement( "input" ),
+ select = document.createElement( "select" ),
+ opt = select.appendChild( document.createElement( "option" ) );
+
+ input.type = "checkbox";
+
+ // Support: Android <=4.3 only
+ // Default value for a checkbox should be "on"
+ support.checkOn = input.value !== "";
+
+ // Support: IE <=11 only
+ // Must access selectedIndex to make default options select
+ support.optSelected = opt.selected;
+
+ // Support: IE <=11 only
+ // An input loses its value after becoming a radio
+ input = document.createElement( "input" );
+ input.value = "t";
+ input.type = "radio";
+ support.radioValue = input.value === "t";
+} )();
+
+
+var boolHook,
+ attrHandle = jQuery.expr.attrHandle;
+
+jQuery.fn.extend( {
+ attr: function( name, value ) {
+ return access( this, jQuery.attr, name, value, arguments.length > 1 );
+ },
+
+ removeAttr: function( name ) {
+ return this.each( function() {
+ jQuery.removeAttr( this, name );
+ } );
+ }
+} );
+
+jQuery.extend( {
+ attr: function( elem, name, value ) {
+ var ret, hooks,
+ nType = elem.nodeType;
+
+ // Don't get/set attributes on text, comment and attribute nodes
+ if ( nType === 3 || nType === 8 || nType === 2 ) {
+ return;
+ }
+
+ // Fallback to prop when attributes are not supported
+ if ( typeof elem.getAttribute === "undefined" ) {
+ return jQuery.prop( elem, name, value );
+ }
+
+ // Attribute hooks are determined by the lowercase version
+ // Grab necessary hook if one is defined
+ if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+ hooks = jQuery.attrHooks[ name.toLowerCase() ] ||
+ ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
+ }
+
+ if ( value !== undefined ) {
+ if ( value === null ) {
+ jQuery.removeAttr( elem, name );
+ return;
+ }
+
+ if ( hooks && "set" in hooks &&
+ ( ret = hooks.set( elem, value, name ) ) !== undefined ) {
+ return ret;
+ }
+
+ elem.setAttribute( name, value + "" );
+ return value;
+ }
+
+ if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
+ return ret;
+ }
+
+ ret = jQuery.find.attr( elem, name );
+
+ // Non-existent attributes return null, we normalize to undefined
+ return ret == null ? undefined : ret;
+ },
+
+ attrHooks: {
+ type: {
+ set: function( elem, value ) {
+ if ( !support.radioValue && value === "radio" &&
+ nodeName( elem, "input" ) ) {
+ var val = elem.value;
+ elem.setAttribute( "type", value );
+ if ( val ) {
+ elem.value = val;
+ }
+ return value;
+ }
+ }
+ }
+ },
+
+ removeAttr: function( elem, value ) {
+ var name,
+ i = 0,
+
+ // Attribute names can contain non-HTML whitespace characters
+ // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
+ attrNames = value && value.match( rnothtmlwhite );
+
+ if ( attrNames && elem.nodeType === 1 ) {
+ while ( ( name = attrNames[ i++ ] ) ) {
+ elem.removeAttribute( name );
+ }
+ }
+ }
+} );
+
+// Hooks for boolean attributes
+boolHook = {
+ set: function( elem, value, name ) {
+ if ( value === false ) {
+
+ // Remove boolean attributes when set to false
+ jQuery.removeAttr( elem, name );
+ } else {
+ elem.setAttribute( name, name );
+ }
+ return name;
+ }
+};
+
+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
+ var getter = attrHandle[ name ] || jQuery.find.attr;
+
+ attrHandle[ name ] = function( elem, name, isXML ) {
+ var ret, handle,
+ lowercaseName = name.toLowerCase();
+
+ if ( !isXML ) {
+
+ // Avoid an infinite loop by temporarily removing this function from the getter
+ handle = attrHandle[ lowercaseName ];
+ attrHandle[ lowercaseName ] = ret;
+ ret = getter( elem, name, isXML ) != null ?
+ lowercaseName :
+ null;
+ attrHandle[ lowercaseName ] = handle;
+ }
+ return ret;
+ };
+} );
+
+
+
+
+var rfocusable = /^(?:input|select|textarea|button)$/i,
+ rclickable = /^(?:a|area)$/i;
+
+jQuery.fn.extend( {
+ prop: function( name, value ) {
+ return access( this, jQuery.prop, name, value, arguments.length > 1 );
+ },
+
+ removeProp: function( name ) {
+ return this.each( function() {
+ delete this[ jQuery.propFix[ name ] || name ];
+ } );
+ }
+} );
+
+jQuery.extend( {
+ prop: function( elem, name, value ) {
+ var ret, hooks,
+ nType = elem.nodeType;
+
+ // Don't get/set properties on text, comment and attribute nodes
+ if ( nType === 3 || nType === 8 || nType === 2 ) {
+ return;
+ }
+
+ if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
+
+ // Fix name and attach hooks
+ name = jQuery.propFix[ name ] || name;
+ hooks = jQuery.propHooks[ name ];
+ }
+
+ if ( value !== undefined ) {
+ if ( hooks && "set" in hooks &&
+ ( ret = hooks.set( elem, value, name ) ) !== undefined ) {
+ return ret;
+ }
+
+ return ( elem[ name ] = value );
+ }
+
+ if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
+ return ret;
+ }
+
+ return elem[ name ];
+ },
+
+ propHooks: {
+ tabIndex: {
+ get: function( elem ) {
+
+ // Support: IE <=9 - 11 only
+ // elem.tabIndex doesn't always return the
+ // correct value when it hasn't been explicitly set
+ // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+ // Use proper attribute retrieval(#12072)
+ var tabindex = jQuery.find.attr( elem, "tabindex" );
+
+ if ( tabindex ) {
+ return parseInt( tabindex, 10 );
+ }
+
+ if (
+ rfocusable.test( elem.nodeName ) ||
+ rclickable.test( elem.nodeName ) &&
+ elem.href
+ ) {
+ return 0;
+ }
+
+ return -1;
+ }
+ }
+ },
+
+ propFix: {
+ "for": "htmlFor",
+ "class": "className"
+ }
+} );
+
+// Support: IE <=11 only
+// Accessing the selectedIndex property
+// forces the browser to respect setting selected
+// on the option
+// The getter ensures a default option is selected
+// when in an optgroup
+// eslint rule "no-unused-expressions" is disabled for this code
+// since it considers such accessions noop
+if ( !support.optSelected ) {
+ jQuery.propHooks.selected = {
+ get: function( elem ) {
+
+ /* eslint no-unused-expressions: "off" */
+
+ var parent = elem.parentNode;
+ if ( parent && parent.parentNode ) {
+ parent.parentNode.selectedIndex;
+ }
+ return null;
+ },
+ set: function( elem ) {
+
+ /* eslint no-unused-expressions: "off" */
+
+ var parent = elem.parentNode;
+ if ( parent ) {
+ parent.selectedIndex;
+
+ if ( parent.parentNode ) {
+ parent.parentNode.selectedIndex;
+ }
+ }
+ }
+ };
+}
+
+jQuery.each( [
+ "tabIndex",
+ "readOnly",
+ "maxLength",
+ "cellSpacing",
+ "cellPadding",
+ "rowSpan",
+ "colSpan",
+ "useMap",
+ "frameBorder",
+ "contentEditable"
+], function() {
+ jQuery.propFix[ this.toLowerCase() ] = this;
+} );
+
+
+
+
+ // Strip and collapse whitespace according to HTML spec
+ // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
+ function stripAndCollapse( value ) {
+ var tokens = value.match( rnothtmlwhite ) || [];
+ return tokens.join( " " );
+ }
+
+
+function getClass( elem ) {
+ return elem.getAttribute && elem.getAttribute( "class" ) || "";
+}
+
+function classesToArray( value ) {
+ if ( Array.isArray( value ) ) {
+ return value;
+ }
+ if ( typeof value === "string" ) {
+ return value.match( rnothtmlwhite ) || [];
+ }
+ return [];
+}
+
+jQuery.fn.extend( {
+ addClass: function( value ) {
+ var classes, elem, cur, curValue, clazz, j, finalValue,
+ i = 0;
+
+ if ( isFunction( value ) ) {
+ return this.each( function( j ) {
+ jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
+ } );
+ }
+
+ classes = classesToArray( value );
+
+ if ( classes.length ) {
+ while ( ( elem = this[ i++ ] ) ) {
+ curValue = getClass( elem );
+ cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
+
+ if ( cur ) {
+ j = 0;
+ while ( ( clazz = classes[ j++ ] ) ) {
+ if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
+ cur += clazz + " ";
+ }
+ }
+
+ // Only assign if different to avoid unneeded rendering.
+ finalValue = stripAndCollapse( cur );
+ if ( curValue !== finalValue ) {
+ elem.setAttribute( "class", finalValue );
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ removeClass: function( value ) {
+ var classes, elem, cur, curValue, clazz, j, finalValue,
+ i = 0;
+
+ if ( isFunction( value ) ) {
+ return this.each( function( j ) {
+ jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
+ } );
+ }
+
+ if ( !arguments.length ) {
+ return this.attr( "class", "" );
+ }
+
+ classes = classesToArray( value );
+
+ if ( classes.length ) {
+ while ( ( elem = this[ i++ ] ) ) {
+ curValue = getClass( elem );
+
+ // This expression is here for better compressibility (see addClass)
+ cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " );
+
+ if ( cur ) {
+ j = 0;
+ while ( ( clazz = classes[ j++ ] ) ) {
+
+ // Remove *all* instances
+ while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
+ cur = cur.replace( " " + clazz + " ", " " );
+ }
+ }
+
+ // Only assign if different to avoid unneeded rendering.
+ finalValue = stripAndCollapse( cur );
+ if ( curValue !== finalValue ) {
+ elem.setAttribute( "class", finalValue );
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ toggleClass: function( value, stateVal ) {
+ var type = typeof value,
+ isValidValue = type === "string" || Array.isArray( value );
+
+ if ( typeof stateVal === "boolean" && isValidValue ) {
+ return stateVal ? this.addClass( value ) : this.removeClass( value );
+ }
+
+ if ( isFunction( value ) ) {
+ return this.each( function( i ) {
+ jQuery( this ).toggleClass(
+ value.call( this, i, getClass( this ), stateVal ),
+ stateVal
+ );
+ } );
+ }
+
+ return this.each( function() {
+ var className, i, self, classNames;
+
+ if ( isValidValue ) {
+
+ // Toggle individual class names
+ i = 0;
+ self = jQuery( this );
+ classNames = classesToArray( value );
+
+ while ( ( className = classNames[ i++ ] ) ) {
+
+ // Check each className given, space separated list
+ if ( self.hasClass( className ) ) {
+ self.removeClass( className );
+ } else {
+ self.addClass( className );
+ }
+ }
+
+ // Toggle whole class name
+ } else if ( value === undefined || type === "boolean" ) {
+ className = getClass( this );
+ if ( className ) {
+
+ // Store className if set
+ dataPriv.set( this, "__className__", className );
+ }
+
+ // If the element has a class name or if we're passed `false`,
+ // then remove the whole classname (if there was one, the above saved it).
+ // Otherwise bring back whatever was previously saved (if anything),
+ // falling back to the empty string if nothing was stored.
+ if ( this.setAttribute ) {
+ this.setAttribute( "class",
+ className || value === false ?
+ "" :
+ dataPriv.get( this, "__className__" ) || ""
+ );
+ }
+ }
+ } );
+ },
+
+ hasClass: function( selector ) {
+ var className, elem,
+ i = 0;
+
+ className = " " + selector + " ";
+ while ( ( elem = this[ i++ ] ) ) {
+ if ( elem.nodeType === 1 &&
+ ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+} );
+
+
+
+
+var rreturn = /\r/g;
+
+jQuery.fn.extend( {
+ val: function( value ) {
+ var hooks, ret, valueIsFunction,
+ elem = this[ 0 ];
+
+ if ( !arguments.length ) {
+ if ( elem ) {
+ hooks = jQuery.valHooks[ elem.type ] ||
+ jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+ if ( hooks &&
+ "get" in hooks &&
+ ( ret = hooks.get( elem, "value" ) ) !== undefined
+ ) {
+ return ret;
+ }
+
+ ret = elem.value;
+
+ // Handle most common string cases
+ if ( typeof ret === "string" ) {
+ return ret.replace( rreturn, "" );
+ }
+
+ // Handle cases where value is null/undef or number
+ return ret == null ? "" : ret;
+ }
+
+ return;
+ }
+
+ valueIsFunction = isFunction( value );
+
+ return this.each( function( i ) {
+ var val;
+
+ if ( this.nodeType !== 1 ) {
+ return;
+ }
+
+ if ( valueIsFunction ) {
+ val = value.call( this, i, jQuery( this ).val() );
+ } else {
+ val = value;
+ }
+
+ // Treat null/undefined as ""; convert numbers to string
+ if ( val == null ) {
+ val = "";
+
+ } else if ( typeof val === "number" ) {
+ val += "";
+
+ } else if ( Array.isArray( val ) ) {
+ val = jQuery.map( val, function( value ) {
+ return value == null ? "" : value + "";
+ } );
+ }
+
+ hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+ // If set returns undefined, fall back to normal setting
+ if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
+ this.value = val;
+ }
+ } );
+ }
+} );
+
+jQuery.extend( {
+ valHooks: {
+ option: {
+ get: function( elem ) {
+
+ var val = jQuery.find.attr( elem, "value" );
+ return val != null ?
+ val :
+
+ // Support: IE <=10 - 11 only
+ // option.text throws exceptions (#14686, #14858)
+ // Strip and collapse whitespace
+ // https://html.spec.whatwg.org/#strip-and-collapse-whitespace
+ stripAndCollapse( jQuery.text( elem ) );
+ }
+ },
+ select: {
+ get: function( elem ) {
+ var value, option, i,
+ options = elem.options,
+ index = elem.selectedIndex,
+ one = elem.type === "select-one",
+ values = one ? null : [],
+ max = one ? index + 1 : options.length;
+
+ if ( index < 0 ) {
+ i = max;
+
+ } else {
+ i = one ? index : 0;
+ }
+
+ // Loop through all the selected options
+ for ( ; i < max; i++ ) {
+ option = options[ i ];
+
+ // Support: IE <=9 only
+ // IE8-9 doesn't update selected after form reset (#2551)
+ if ( ( option.selected || i === index ) &&
+
+ // Don't return options that are disabled or in a disabled optgroup
+ !option.disabled &&
+ ( !option.parentNode.disabled ||
+ !nodeName( option.parentNode, "optgroup" ) ) ) {
+
+ // Get the specific value for the option
+ value = jQuery( option ).val();
+
+ // We don't need an array for one selects
+ if ( one ) {
+ return value;
+ }
+
+ // Multi-Selects return an array
+ values.push( value );
+ }
+ }
+
+ return values;
+ },
+
+ set: function( elem, value ) {
+ var optionSet, option,
+ options = elem.options,
+ values = jQuery.makeArray( value ),
+ i = options.length;
+
+ while ( i-- ) {
+ option = options[ i ];
+
+ /* eslint-disable no-cond-assign */
+
+ if ( option.selected =
+ jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
+ ) {
+ optionSet = true;
+ }
+
+ /* eslint-enable no-cond-assign */
+ }
+
+ // Force browsers to behave consistently when non-matching value is set
+ if ( !optionSet ) {
+ elem.selectedIndex = -1;
+ }
+ return values;
+ }
+ }
+ }
+} );
+
+// Radios and checkboxes getter/setter
+jQuery.each( [ "radio", "checkbox" ], function() {
+ jQuery.valHooks[ this ] = {
+ set: function( elem, value ) {
+ if ( Array.isArray( value ) ) {
+ return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
+ }
+ }
+ };
+ if ( !support.checkOn ) {
+ jQuery.valHooks[ this ].get = function( elem ) {
+ return elem.getAttribute( "value" ) === null ? "on" : elem.value;
+ };
+ }
+} );
+
+
+
+
+// Return jQuery for attributes-only inclusion
+
+
+support.focusin = "onfocusin" in window;
+
+
+var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+ stopPropagationCallback = function( e ) {
+ e.stopPropagation();
+ };
+
+jQuery.extend( jQuery.event, {
+
+ trigger: function( event, data, elem, onlyHandlers ) {
+
+ var i, cur, tmp, bubbleType, ontype, handle, special, lastElement,
+ eventPath = [ elem || document ],
+ type = hasOwn.call( event, "type" ) ? event.type : event,
+ namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];
+
+ cur = lastElement = tmp = elem = elem || document;
+
+ // Don't do events on text and comment nodes
+ if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+ return;
+ }
+
+ // focus/blur morphs to focusin/out; ensure we're not firing them right now
+ if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+ return;
+ }
+
+ if ( type.indexOf( "." ) > -1 ) {
+
+ // Namespaced trigger; create a regexp to match event type in handle()
+ namespaces = type.split( "." );
+ type = namespaces.shift();
+ namespaces.sort();
+ }
+ ontype = type.indexOf( ":" ) < 0 && "on" + type;
+
+ // Caller can pass in a jQuery.Event object, Object, or just an event type string
+ event = event[ jQuery.expando ] ?
+ event :
+ new jQuery.Event( type, typeof event === "object" && event );
+
+ // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
+ event.isTrigger = onlyHandlers ? 2 : 3;
+ event.namespace = namespaces.join( "." );
+ event.rnamespace = event.namespace ?
+ new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
+ null;
+
+ // Clean up the event in case it is being reused
+ event.result = undefined;
+ if ( !event.target ) {
+ event.target = elem;
+ }
+
+ // Clone any incoming data and prepend the event, creating the handler arg list
+ data = data == null ?
+ [ event ] :
+ jQuery.makeArray( data, [ event ] );
+
+ // Allow special events to draw outside the lines
+ special = jQuery.event.special[ type ] || {};
+ if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
+ return;
+ }
+
+ // Determine event propagation path in advance, per W3C events spec (#9951)
+ // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+ if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {
+
+ bubbleType = special.delegateType || type;
+ if ( !rfocusMorph.test( bubbleType + type ) ) {
+ cur = cur.parentNode;
+ }
+ for ( ; cur; cur = cur.parentNode ) {
+ eventPath.push( cur );
+ tmp = cur;
+ }
+
+ // Only add window if we got to document (e.g., not plain obj or detached DOM)
+ if ( tmp === ( elem.ownerDocument || document ) ) {
+ eventPath.push( tmp.defaultView || tmp.parentWindow || window );
+ }
+ }
+
+ // Fire handlers on the event path
+ i = 0;
+ while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {
+ lastElement = cur;
+ event.type = i > 1 ?
+ bubbleType :
+ special.bindType || type;
+
+ // jQuery handler
+ handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&
+ dataPriv.get( cur, "handle" );
+ if ( handle ) {
+ handle.apply( cur, data );
+ }
+
+ // Native handler
+ handle = ontype && cur[ ontype ];
+ if ( handle && handle.apply && acceptData( cur ) ) {
+ event.result = handle.apply( cur, data );
+ if ( event.result === false ) {
+ event.preventDefault();
+ }
+ }
+ }
+ event.type = type;
+
+ // If nobody prevented the default action, do it now
+ if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+ if ( ( !special._default ||
+ special._default.apply( eventPath.pop(), data ) === false ) &&
+ acceptData( elem ) ) {
+
+ // Call a native DOM method on the target with the same name as the event.
+ // Don't do default actions on window, that's where global variables be (#6170)
+ if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {
+
+ // Don't re-trigger an onFOO event when we call its FOO() method
+ tmp = elem[ ontype ];
+
+ if ( tmp ) {
+ elem[ ontype ] = null;
+ }
+
+ // Prevent re-triggering of the same event, since we already bubbled it above
+ jQuery.event.triggered = type;
+
+ if ( event.isPropagationStopped() ) {
+ lastElement.addEventListener( type, stopPropagationCallback );
+ }
+
+ elem[ type ]();
+
+ if ( event.isPropagationStopped() ) {
+ lastElement.removeEventListener( type, stopPropagationCallback );
+ }
+
+ jQuery.event.triggered = undefined;
+
+ if ( tmp ) {
+ elem[ ontype ] = tmp;
+ }
+ }
+ }
+ }
+
+ return event.result;
+ },
+
+ // Piggyback on a donor event to simulate a different one
+ // Used only for `focus(in | out)` events
+ simulate: function( type, elem, event ) {
+ var e = jQuery.extend(
+ new jQuery.Event(),
+ event,
+ {
+ type: type,
+ isSimulated: true
+ }
+ );
+
+ jQuery.event.trigger( e, null, elem );
+ }
+
+} );
+
+jQuery.fn.extend( {
+
+ trigger: function( type, data ) {
+ return this.each( function() {
+ jQuery.event.trigger( type, data, this );
+ } );
+ },
+ triggerHandler: function( type, data ) {
+ var elem = this[ 0 ];
+ if ( elem ) {
+ return jQuery.event.trigger( type, data, elem, true );
+ }
+ }
+} );
+
+
+// Support: Firefox <=44
+// Firefox doesn't have focus(in | out) events
+// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
+//
+// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
+// focus(in | out) events fire after focus & blur events,
+// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
+// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
+if ( !support.focusin ) {
+ jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+ // Attach a single capturing handler on the document while someone wants focusin/focusout
+ var handler = function( event ) {
+ jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
+ };
+
+ jQuery.event.special[ fix ] = {
+ setup: function() {
+ var doc = this.ownerDocument || this,
+ attaches = dataPriv.access( doc, fix );
+
+ if ( !attaches ) {
+ doc.addEventListener( orig, handler, true );
+ }
+ dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
+ },
+ teardown: function() {
+ var doc = this.ownerDocument || this,
+ attaches = dataPriv.access( doc, fix ) - 1;
+
+ if ( !attaches ) {
+ doc.removeEventListener( orig, handler, true );
+ dataPriv.remove( doc, fix );
+
+ } else {
+ dataPriv.access( doc, fix, attaches );
+ }
+ }
+ };
+ } );
+}
+var location = window.location;
+
+var nonce = Date.now();
+
+var rquery = ( /\?/ );
+
+
+
+// Cross-browser xml parsing
+jQuery.parseXML = function( data ) {
+ var xml;
+ if ( !data || typeof data !== "string" ) {
+ return null;
+ }
+
+ // Support: IE 9 - 11 only
+ // IE throws on parseFromString with invalid input.
+ try {
+ xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
+ } catch ( e ) {
+ xml = undefined;
+ }
+
+ if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
+ jQuery.error( "Invalid XML: " + data );
+ }
+ return xml;
+};
+
+
+var
+ rbracket = /\[\]$/,
+ rCRLF = /\r?\n/g,
+ rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
+ rsubmittable = /^(?:input|select|textarea|keygen)/i;
+
+function buildParams( prefix, obj, traditional, add ) {
+ var name;
+
+ if ( Array.isArray( obj ) ) {
+
+ // Serialize array item.
+ jQuery.each( obj, function( i, v ) {
+ if ( traditional || rbracket.test( prefix ) ) {
+
+ // Treat each array item as a scalar.
+ add( prefix, v );
+
+ } else {
+
+ // Item is non-scalar (array or object), encode its numeric index.
+ buildParams(
+ prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
+ v,
+ traditional,
+ add
+ );
+ }
+ } );
+
+ } else if ( !traditional && toType( obj ) === "object" ) {
+
+ // Serialize object item.
+ for ( name in obj ) {
+ buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+ }
+
+ } else {
+
+ // Serialize scalar item.
+ add( prefix, obj );
+ }
+}
+
+// Serialize an array of form elements or a set of
+// key/values into a query string
+jQuery.param = function( a, traditional ) {
+ var prefix,
+ s = [],
+ add = function( key, valueOrFunction ) {
+
+ // If value is a function, invoke it and use its return value
+ var value = isFunction( valueOrFunction ) ?
+ valueOrFunction() :
+ valueOrFunction;
+
+ s[ s.length ] = encodeURIComponent( key ) + "=" +
+ encodeURIComponent( value == null ? "" : value );
+ };
+
+ // If an array was passed in, assume that it is an array of form elements.
+ if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+
+ // Serialize the form elements
+ jQuery.each( a, function() {
+ add( this.name, this.value );
+ } );
+
+ } else {
+
+ // If traditional, encode the "old" way (the way 1.3.2 or older
+ // did it), otherwise encode params recursively.
+ for ( prefix in a ) {
+ buildParams( prefix, a[ prefix ], traditional, add );
+ }
+ }
+
+ // Return the resulting serialization
+ return s.join( "&" );
+};
+
+jQuery.fn.extend( {
+ serialize: function() {
+ return jQuery.param( this.serializeArray() );
+ },
+ serializeArray: function() {
+ return this.map( function() {
+
+ // Can add propHook for "elements" to filter or add form elements
+ var elements = jQuery.prop( this, "elements" );
+ return elements ? jQuery.makeArray( elements ) : this;
+ } )
+ .filter( function() {
+ var type = this.type;
+
+ // Use .is( ":disabled" ) so that fieldset[disabled] works
+ return this.name && !jQuery( this ).is( ":disabled" ) &&
+ rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
+ ( this.checked || !rcheckableType.test( type ) );
+ } )
+ .map( function( i, elem ) {
+ var val = jQuery( this ).val();
+
+ if ( val == null ) {
+ return null;
+ }
+
+ if ( Array.isArray( val ) ) {
+ return jQuery.map( val, function( val ) {
+ return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+ } );
+ }
+
+ return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+ } ).get();
+ }
+} );
+
+
+var
+ r20 = /%20/g,
+ rhash = /#.*$/,
+ rantiCache = /([?&])_=[^&]*/,
+ rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
+
+ // #7653, #8125, #8152: local protocol detection
+ rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
+ rnoContent = /^(?:GET|HEAD)$/,
+ rprotocol = /^\/\//,
+
+ /* Prefilters
+ * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+ * 2) These are called:
+ * - BEFORE asking for a transport
+ * - AFTER param serialization (s.data is a string if s.processData is true)
+ * 3) key is the dataType
+ * 4) the catchall symbol "*" can be used
+ * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+ */
+ prefilters = {},
+
+ /* Transports bindings
+ * 1) key is the dataType
+ * 2) the catchall symbol "*" can be used
+ * 3) selection will start with transport dataType and THEN go to "*" if needed
+ */
+ transports = {},
+
+ // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+ allTypes = "*/".concat( "*" ),
+
+ // Anchor tag for parsing the document origin
+ originAnchor = document.createElement( "a" );
+ originAnchor.href = location.href;
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+ // dataTypeExpression is optional and defaults to "*"
+ return function( dataTypeExpression, func ) {
+
+ if ( typeof dataTypeExpression !== "string" ) {
+ func = dataTypeExpression;
+ dataTypeExpression = "*";
+ }
+
+ var dataType,
+ i = 0,
+ dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];
+
+ if ( isFunction( func ) ) {
+
+ // For each dataType in the dataTypeExpression
+ while ( ( dataType = dataTypes[ i++ ] ) ) {
+
+ // Prepend if requested
+ if ( dataType[ 0 ] === "+" ) {
+ dataType = dataType.slice( 1 ) || "*";
+ ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );
+
+ // Otherwise append
+ } else {
+ ( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
+ }
+ }
+ }
+ };
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
+
+ var inspected = {},
+ seekingTransport = ( structure === transports );
+
+ function inspect( dataType ) {
+ var selected;
+ inspected[ dataType ] = true;
+ jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
+ var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
+ if ( typeof dataTypeOrTransport === "string" &&
+ !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
+
+ options.dataTypes.unshift( dataTypeOrTransport );
+ inspect( dataTypeOrTransport );
+ return false;
+ } else if ( seekingTransport ) {
+ return !( selected = dataTypeOrTransport );
+ }
+ } );
+ return selected;
+ }
+
+ return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+ var key, deep,
+ flatOptions = jQuery.ajaxSettings.flatOptions || {};
+
+ for ( key in src ) {
+ if ( src[ key ] !== undefined ) {
+ ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
+ }
+ }
+ if ( deep ) {
+ jQuery.extend( true, target, deep );
+ }
+
+ return target;
+}
+
+/* Handles responses to an ajax request:
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+ var ct, type, finalDataType, firstDataType,
+ contents = s.contents,
+ dataTypes = s.dataTypes;
+
+ // Remove auto dataType and get content-type in the process
+ while ( dataTypes[ 0 ] === "*" ) {
+ dataTypes.shift();
+ if ( ct === undefined ) {
+ ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
+ }
+ }
+
+ // Check if we're dealing with a known content-type
+ if ( ct ) {
+ for ( type in contents ) {
+ if ( contents[ type ] && contents[ type ].test( ct ) ) {
+ dataTypes.unshift( type );
+ break;
+ }
+ }
+ }
+
+ // Check to see if we have a response for the expected dataType
+ if ( dataTypes[ 0 ] in responses ) {
+ finalDataType = dataTypes[ 0 ];
+ } else {
+
+ // Try convertible dataTypes
+ for ( type in responses ) {
+ if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
+ finalDataType = type;
+ break;
+ }
+ if ( !firstDataType ) {
+ firstDataType = type;
+ }
+ }
+
+ // Or just use first one
+ finalDataType = finalDataType || firstDataType;
+ }
+
+ // If we found a dataType
+ // We add the dataType to the list if needed
+ // and return the corresponding response
+ if ( finalDataType ) {
+ if ( finalDataType !== dataTypes[ 0 ] ) {
+ dataTypes.unshift( finalDataType );
+ }
+ return responses[ finalDataType ];
+ }
+}
+
+/* Chain conversions given the request and the original response
+ * Also sets the responseXXX fields on the jqXHR instance
+ */
+function ajaxConvert( s, response, jqXHR, isSuccess ) {
+ var conv2, current, conv, tmp, prev,
+ converters = {},
+
+ // Work with a copy of dataTypes in case we need to modify it for conversion
+ dataTypes = s.dataTypes.slice();
+
+ // Create converters map with lowercased keys
+ if ( dataTypes[ 1 ] ) {
+ for ( conv in s.converters ) {
+ converters[ conv.toLowerCase() ] = s.converters[ conv ];
+ }
+ }
+
+ current = dataTypes.shift();
+
+ // Convert to each sequential dataType
+ while ( current ) {
+
+ if ( s.responseFields[ current ] ) {
+ jqXHR[ s.responseFields[ current ] ] = response;
+ }
+
+ // Apply the dataFilter if provided
+ if ( !prev && isSuccess && s.dataFilter ) {
+ response = s.dataFilter( response, s.dataType );
+ }
+
+ prev = current;
+ current = dataTypes.shift();
+
+ if ( current ) {
+
+ // There's only work to do if current dataType is non-auto
+ if ( current === "*" ) {
+
+ current = prev;
+
+ // Convert response if prev dataType is non-auto and differs from current
+ } else if ( prev !== "*" && prev !== current ) {
+
+ // Seek a direct converter
+ conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+
+ // If none found, seek a pair
+ if ( !conv ) {
+ for ( conv2 in converters ) {
+
+ // If conv2 outputs current
+ tmp = conv2.split( " " );
+ if ( tmp[ 1 ] === current ) {
+
+ // If prev can be converted to accepted input
+ conv = converters[ prev + " " + tmp[ 0 ] ] ||
+ converters[ "* " + tmp[ 0 ] ];
+ if ( conv ) {
+
+ // Condense equivalence converters
+ if ( conv === true ) {
+ conv = converters[ conv2 ];
+
+ // Otherwise, insert the intermediate dataType
+ } else if ( converters[ conv2 ] !== true ) {
+ current = tmp[ 0 ];
+ dataTypes.unshift( tmp[ 1 ] );
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ // Apply converter (if not an equivalence)
+ if ( conv !== true ) {
+
+ // Unless errors are allowed to bubble, catch and return them
+ if ( conv && s.throws ) {
+ response = conv( response );
+ } else {
+ try {
+ response = conv( response );
+ } catch ( e ) {
+ return {
+ state: "parsererror",
+ error: conv ? e : "No conversion from " + prev + " to " + current
+ };
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return { state: "success", data: response };
+}
+
+jQuery.extend( {
+
+ // Counter for holding the number of active queries
+ active: 0,
+
+ // Last-Modified header cache for next request
+ lastModified: {},
+ etag: {},
+
+ ajaxSettings: {
+ url: location.href,
+ type: "GET",
+ isLocal: rlocalProtocol.test( location.protocol ),
+ global: true,
+ processData: true,
+ async: true,
+ contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+
+ /*
+ timeout: 0,
+ data: null,
+ dataType: null,
+ username: null,
+ password: null,
+ cache: null,
+ throws: false,
+ traditional: false,
+ headers: {},
+ */
+
+ accepts: {
+ "*": allTypes,
+ text: "text/plain",
+ html: "text/html",
+ xml: "application/xml, text/xml",
+ json: "application/json, text/javascript"
+ },
+
+ contents: {
+ xml: /\bxml\b/,
+ html: /\bhtml/,
+ json: /\bjson\b/
+ },
+
+ responseFields: {
+ xml: "responseXML",
+ text: "responseText",
+ json: "responseJSON"
+ },
+
+ // Data converters
+ // Keys separate source (or catchall "*") and destination types with a single space
+ converters: {
+
+ // Convert anything to text
+ "* text": String,
+
+ // Text to html (true = no transformation)
+ "text html": true,
+
+ // Evaluate text as a json expression
+ "text json": JSON.parse,
+
+ // Parse text as xml
+ "text xml": jQuery.parseXML
+ },
+
+ // For options that shouldn't be deep extended:
+ // you can add your own custom options here if
+ // and when you create one that shouldn't be
+ // deep extended (see ajaxExtend)
+ flatOptions: {
+ url: true,
+ context: true
+ }
+ },
+
+ // Creates a full fledged settings object into target
+ // with both ajaxSettings and settings fields.
+ // If target is omitted, writes into ajaxSettings.
+ ajaxSetup: function( target, settings ) {
+ return settings ?
+
+ // Building a settings object
+ ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
+
+ // Extending ajaxSettings
+ ajaxExtend( jQuery.ajaxSettings, target );
+ },
+
+ ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+ ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+ // Main method
+ ajax: function( url, options ) {
+
+ // If url is an object, simulate pre-1.5 signature
+ if ( typeof url === "object" ) {
+ options = url;
+ url = undefined;
+ }
+
+ // Force options to be an object
+ options = options || {};
+
+ var transport,
+
+ // URL without anti-cache param
+ cacheURL,
+
+ // Response headers
+ responseHeadersString,
+ responseHeaders,
+
+ // timeout handle
+ timeoutTimer,
+
+ // Url cleanup var
+ urlAnchor,
+
+ // Request state (becomes false upon send and true upon completion)
+ completed,
+
+ // To know if global events are to be dispatched
+ fireGlobals,
+
+ // Loop variable
+ i,
+
+ // uncached part of the url
+ uncached,
+
+ // Create the final options object
+ s = jQuery.ajaxSetup( {}, options ),
+
+ // Callbacks context
+ callbackContext = s.context || s,
+
+ // Context for global events is callbackContext if it is a DOM node or jQuery collection
+ globalEventContext = s.context &&
+ ( callbackContext.nodeType || callbackContext.jquery ) ?
+ jQuery( callbackContext ) :
+ jQuery.event,
+
+ // Deferreds
+ deferred = jQuery.Deferred(),
+ completeDeferred = jQuery.Callbacks( "once memory" ),
+
+ // Status-dependent callbacks
+ statusCode = s.statusCode || {},
+
+ // Headers (they are sent all at once)
+ requestHeaders = {},
+ requestHeadersNames = {},
+
+ // Default abort message
+ strAbort = "canceled",
+
+ // Fake xhr
+ jqXHR = {
+ readyState: 0,
+
+ // Builds headers hashtable if needed
+ getResponseHeader: function( key ) {
+ var match;
+ if ( completed ) {
+ if ( !responseHeaders ) {
+ responseHeaders = {};
+ while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
+ responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
+ }
+ }
+ match = responseHeaders[ key.toLowerCase() ];
+ }
+ return match == null ? null : match;
+ },
+
+ // Raw string
+ getAllResponseHeaders: function() {
+ return completed ? responseHeadersString : null;
+ },
+
+ // Caches the header
+ setRequestHeader: function( name, value ) {
+ if ( completed == null ) {
+ name = requestHeadersNames[ name.toLowerCase() ] =
+ requestHeadersNames[ name.toLowerCase() ] || name;
+ requestHeaders[ name ] = value;
+ }
+ return this;
+ },
+
+ // Overrides response content-type header
+ overrideMimeType: function( type ) {
+ if ( completed == null ) {
+ s.mimeType = type;
+ }
+ return this;
+ },
+
+ // Status-dependent callbacks
+ statusCode: function( map ) {
+ var code;
+ if ( map ) {
+ if ( completed ) {
+
+ // Execute the appropriate callbacks
+ jqXHR.always( map[ jqXHR.status ] );
+ } else {
+
+ // Lazy-add the new callbacks in a way that preserves old ones
+ for ( code in map ) {
+ statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
+ }
+ }
+ }
+ return this;
+ },
+
+ // Cancel the request
+ abort: function( statusText ) {
+ var finalText = statusText || strAbort;
+ if ( transport ) {
+ transport.abort( finalText );
+ }
+ done( 0, finalText );
+ return this;
+ }
+ };
+
+ // Attach deferreds
+ deferred.promise( jqXHR );
+
+ // Add protocol if not provided (prefilters might expect it)
+ // Handle falsy url in the settings object (#10093: consistency with old signature)
+ // We also use the url parameter if available
+ s.url = ( ( url || s.url || location.href ) + "" )
+ .replace( rprotocol, location.protocol + "//" );
+
+ // Alias method option to type as per ticket #12004
+ s.type = options.method || options.type || s.method || s.type;
+
+ // Extract dataTypes list
+ s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ];
+
+ // A cross-domain request is in order when the origin doesn't match the current origin.
+ if ( s.crossDomain == null ) {
+ urlAnchor = document.createElement( "a" );
+
+ // Support: IE <=8 - 11, Edge 12 - 15
+ // IE throws exception on accessing the href property if url is malformed,
+ // e.g. http://example.com:80x/
+ try {
+ urlAnchor.href = s.url;
+
+ // Support: IE <=8 - 11 only
+ // Anchor's host property isn't correctly set when s.url is relative
+ urlAnchor.href = urlAnchor.href;
+ s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
+ urlAnchor.protocol + "//" + urlAnchor.host;
+ } catch ( e ) {
+
+ // If there is an error parsing the URL, assume it is crossDomain,
+ // it can be rejected by the transport if it is invalid
+ s.crossDomain = true;
+ }
+ }
+
+ // Convert data if not already a string
+ if ( s.data && s.processData && typeof s.data !== "string" ) {
+ s.data = jQuery.param( s.data, s.traditional );
+ }
+
+ // Apply prefilters
+ inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+ // If request was aborted inside a prefilter, stop there
+ if ( completed ) {
+ return jqXHR;
+ }
+
+ // We can fire global events as of now if asked to
+ // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
+ fireGlobals = jQuery.event && s.global;
+
+ // Watch for a new set of requests
+ if ( fireGlobals && jQuery.active++ === 0 ) {
+ jQuery.event.trigger( "ajaxStart" );
+ }
+
+ // Uppercase the type
+ s.type = s.type.toUpperCase();
+
+ // Determine if request has content
+ s.hasContent = !rnoContent.test( s.type );
+
+ // Save the URL in case we're toying with the If-Modified-Since
+ // and/or If-None-Match header later on
+ // Remove hash to simplify url manipulation
+ cacheURL = s.url.replace( rhash, "" );
+
+ // More options handling for requests with no content
+ if ( !s.hasContent ) {
+
+ // Remember the hash so we can put it back
+ uncached = s.url.slice( cacheURL.length );
+
+ // If data is available and should be processed, append data to url
+ if ( s.data && ( s.processData || typeof s.data === "string" ) ) {
+ cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data;
+
+ // #9682: remove data so that it's not used in an eventual retry
+ delete s.data;
+ }
+
+ // Add or update anti-cache param if needed
+ if ( s.cache === false ) {
+ cacheURL = cacheURL.replace( rantiCache, "$1" );
+ uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached;
+ }
+
+ // Put hash and anti-cache on the URL that will be requested (gh-1732)
+ s.url = cacheURL + uncached;
+
+ // Change '%20' to '+' if this is encoded form body content (gh-2658)
+ } else if ( s.data && s.processData &&
+ ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) {
+ s.data = s.data.replace( r20, "+" );
+ }
+
+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+ if ( s.ifModified ) {
+ if ( jQuery.lastModified[ cacheURL ] ) {
+ jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
+ }
+ if ( jQuery.etag[ cacheURL ] ) {
+ jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
+ }
+ }
+
+ // Set the correct header, if data is being sent
+ if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+ jqXHR.setRequestHeader( "Content-Type", s.contentType );
+ }
+
+ // Set the Accepts header for the server, depending on the dataType
+ jqXHR.setRequestHeader(
+ "Accept",
+ s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
+ s.accepts[ s.dataTypes[ 0 ] ] +
+ ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+ s.accepts[ "*" ]
+ );
+
+ // Check for headers option
+ for ( i in s.headers ) {
+ jqXHR.setRequestHeader( i, s.headers[ i ] );
+ }
+
+ // Allow custom headers/mimetypes and early abort
+ if ( s.beforeSend &&
+ ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {
+
+ // Abort if not done already and return
+ return jqXHR.abort();
+ }
+
+ // Aborting is no longer a cancellation
+ strAbort = "abort";
+
+ // Install callbacks on deferreds
+ completeDeferred.add( s.complete );
+ jqXHR.done( s.success );
+ jqXHR.fail( s.error );
+
+ // Get transport
+ transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+ // If no transport, we auto-abort
+ if ( !transport ) {
+ done( -1, "No Transport" );
+ } else {
+ jqXHR.readyState = 1;
+
+ // Send global event
+ if ( fireGlobals ) {
+ globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+ }
+
+ // If request was aborted inside ajaxSend, stop there
+ if ( completed ) {
+ return jqXHR;
+ }
+
+ // Timeout
+ if ( s.async && s.timeout > 0 ) {
+ timeoutTimer = window.setTimeout( function() {
+ jqXHR.abort( "timeout" );
+ }, s.timeout );
+ }
+
+ try {
+ completed = false;
+ transport.send( requestHeaders, done );
+ } catch ( e ) {
+
+ // Rethrow post-completion exceptions
+ if ( completed ) {
+ throw e;
+ }
+
+ // Propagate others as results
+ done( -1, e );
+ }
+ }
+
+ // Callback for when everything is done
+ function done( status, nativeStatusText, responses, headers ) {
+ var isSuccess, success, error, response, modified,
+ statusText = nativeStatusText;
+
+ // Ignore repeat invocations
+ if ( completed ) {
+ return;
+ }
+
+ completed = true;
+
+ // Clear timeout if it exists
+ if ( timeoutTimer ) {
+ window.clearTimeout( timeoutTimer );
+ }
+
+ // Dereference transport for early garbage collection
+ // (no matter how long the jqXHR object will be used)
+ transport = undefined;
+
+ // Cache response headers
+ responseHeadersString = headers || "";
+
+ // Set readyState
+ jqXHR.readyState = status > 0 ? 4 : 0;
+
+ // Determine if successful
+ isSuccess = status >= 200 && status < 300 || status === 304;
+
+ // Get response data
+ if ( responses ) {
+ response = ajaxHandleResponses( s, jqXHR, responses );
+ }
+
+ // Convert no matter what (that way responseXXX fields are always set)
+ response = ajaxConvert( s, response, jqXHR, isSuccess );
+
+ // If successful, handle type chaining
+ if ( isSuccess ) {
+
+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+ if ( s.ifModified ) {
+ modified = jqXHR.getResponseHeader( "Last-Modified" );
+ if ( modified ) {
+ jQuery.lastModified[ cacheURL ] = modified;
+ }
+ modified = jqXHR.getResponseHeader( "etag" );
+ if ( modified ) {
+ jQuery.etag[ cacheURL ] = modified;
+ }
+ }
+
+ // if no content
+ if ( status === 204 || s.type === "HEAD" ) {
+ statusText = "nocontent";
+
+ // if not modified
+ } else if ( status === 304 ) {
+ statusText = "notmodified";
+
+ // If we have data, let's convert it
+ } else {
+ statusText = response.state;
+ success = response.data;
+ error = response.error;
+ isSuccess = !error;
+ }
+ } else {
+
+ // Extract error from statusText and normalize for non-aborts
+ error = statusText;
+ if ( status || !statusText ) {
+ statusText = "error";
+ if ( status < 0 ) {
+ status = 0;
+ }
+ }
+ }
+
+ // Set data for the fake xhr object
+ jqXHR.status = status;
+ jqXHR.statusText = ( nativeStatusText || statusText ) + "";
+
+ // Success/Error
+ if ( isSuccess ) {
+ deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+ } else {
+ deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+ }
+
+ // Status-dependent callbacks
+ jqXHR.statusCode( statusCode );
+ statusCode = undefined;
+
+ if ( fireGlobals ) {
+ globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
+ [ jqXHR, s, isSuccess ? success : error ] );
+ }
+
+ // Complete
+ completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+ if ( fireGlobals ) {
+ globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+
+ // Handle the global AJAX counter
+ if ( !( --jQuery.active ) ) {
+ jQuery.event.trigger( "ajaxStop" );
+ }
+ }
+ }
+
+ return jqXHR;
+ },
+
+ getJSON: function( url, data, callback ) {
+ return jQuery.get( url, data, callback, "json" );
+ },
+
+ getScript: function( url, callback ) {
+ return jQuery.get( url, undefined, callback, "script" );
+ }
+} );
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+ jQuery[ method ] = function( url, data, callback, type ) {
+
+ // Shift arguments if data argument was omitted
+ if ( isFunction( data ) ) {
+ type = type || callback;
+ callback = data;
+ data = undefined;
+ }
+
+ // The url can be an options object (which then must have .url)
+ return jQuery.ajax( jQuery.extend( {
+ url: url,
+ type: method,
+ dataType: type,
+ data: data,
+ success: callback
+ }, jQuery.isPlainObject( url ) && url ) );
+ };
+} );
+
+
+jQuery._evalUrl = function( url ) {
+ return jQuery.ajax( {
+ url: url,
+
+ // Make this explicit, since user can override this through ajaxSetup (#11264)
+ type: "GET",
+ dataType: "script",
+ cache: true,
+ async: false,
+ global: false,
+ "throws": true
+ } );
+};
+
+
+jQuery.fn.extend( {
+ wrapAll: function( html ) {
+ var wrap;
+
+ if ( this[ 0 ] ) {
+ if ( isFunction( html ) ) {
+ html = html.call( this[ 0 ] );
+ }
+
+ // The elements to wrap the target around
+ wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
+
+ if ( this[ 0 ].parentNode ) {
+ wrap.insertBefore( this[ 0 ] );
+ }
+
+ wrap.map( function() {
+ var elem = this;
+
+ while ( elem.firstElementChild ) {
+ elem = elem.firstElementChild;
+ }
+
+ return elem;
+ } ).append( this );
+ }
+
+ return this;
+ },
+
+ wrapInner: function( html ) {
+ if ( isFunction( html ) ) {
+ return this.each( function( i ) {
+ jQuery( this ).wrapInner( html.call( this, i ) );
+ } );
+ }
+
+ return this.each( function() {
+ var self = jQuery( this ),
+ contents = self.contents();
+
+ if ( contents.length ) {
+ contents.wrapAll( html );
+
+ } else {
+ self.append( html );
+ }
+ } );
+ },
+
+ wrap: function( html ) {
+ var htmlIsFunction = isFunction( html );
+
+ return this.each( function( i ) {
+ jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );
+ } );
+ },
+
+ unwrap: function( selector ) {
+ this.parent( selector ).not( "body" ).each( function() {
+ jQuery( this ).replaceWith( this.childNodes );
+ } );
+ return this;
+ }
+} );
+
+
+jQuery.expr.pseudos.hidden = function( elem ) {
+ return !jQuery.expr.pseudos.visible( elem );
+};
+jQuery.expr.pseudos.visible = function( elem ) {
+ return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );
+};
+
+
+
+
+jQuery.ajaxSettings.xhr = function() {
+ try {
+ return new window.XMLHttpRequest();
+ } catch ( e ) {}
+};
+
+var xhrSuccessStatus = {
+
+ // File protocol always yields status code 0, assume 200
+ 0: 200,
+
+ // Support: IE <=9 only
+ // #1450: sometimes IE returns 1223 when it should be 204
+ 1223: 204
+ },
+ xhrSupported = jQuery.ajaxSettings.xhr();
+
+support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
+support.ajax = xhrSupported = !!xhrSupported;
+
+jQuery.ajaxTransport( function( options ) {
+ var callback, errorCallback;
+
+ // Cross domain only allowed if supported through XMLHttpRequest
+ if ( support.cors || xhrSupported && !options.crossDomain ) {
+ return {
+ send: function( headers, complete ) {
+ var i,
+ xhr = options.xhr();
+
+ xhr.open(
+ options.type,
+ options.url,
+ options.async,
+ options.username,
+ options.password
+ );
+
+ // Apply custom fields if provided
+ if ( options.xhrFields ) {
+ for ( i in options.xhrFields ) {
+ xhr[ i ] = options.xhrFields[ i ];
+ }
+ }
+
+ // Override mime type if needed
+ if ( options.mimeType && xhr.overrideMimeType ) {
+ xhr.overrideMimeType( options.mimeType );
+ }
+
+ // X-Requested-With header
+ // For cross-domain requests, seeing as conditions for a preflight are
+ // akin to a jigsaw puzzle, we simply never set it to be sure.
+ // (it can always be set on a per-request basis or even using ajaxSetup)
+ // For same-domain requests, won't change header if already provided.
+ if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
+ headers[ "X-Requested-With" ] = "XMLHttpRequest";
+ }
+
+ // Set headers
+ for ( i in headers ) {
+ xhr.setRequestHeader( i, headers[ i ] );
+ }
+
+ // Callback
+ callback = function( type ) {
+ return function() {
+ if ( callback ) {
+ callback = errorCallback = xhr.onload =
+ xhr.onerror = xhr.onabort = xhr.ontimeout =
+ xhr.onreadystatechange = null;
+
+ if ( type === "abort" ) {
+ xhr.abort();
+ } else if ( type === "error" ) {
+
+ // Support: IE <=9 only
+ // On a manual native abort, IE9 throws
+ // errors on any property access that is not readyState
+ if ( typeof xhr.status !== "number" ) {
+ complete( 0, "error" );
+ } else {
+ complete(
+
+ // File: protocol always yields status 0; see #8605, #14207
+ xhr.status,
+ xhr.statusText
+ );
+ }
+ } else {
+ complete(
+ xhrSuccessStatus[ xhr.status ] || xhr.status,
+ xhr.statusText,
+
+ // Support: IE <=9 only
+ // IE9 has no XHR2 but throws on binary (trac-11426)
+ // For XHR2 non-text, let the caller handle it (gh-2498)
+ ( xhr.responseType || "text" ) !== "text" ||
+ typeof xhr.responseText !== "string" ?
+ { binary: xhr.response } :
+ { text: xhr.responseText },
+ xhr.getAllResponseHeaders()
+ );
+ }
+ }
+ };
+ };
+
+ // Listen to events
+ xhr.onload = callback();
+ errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" );
+
+ // Support: IE 9 only
+ // Use onreadystatechange to replace onabort
+ // to handle uncaught aborts
+ if ( xhr.onabort !== undefined ) {
+ xhr.onabort = errorCallback;
+ } else {
+ xhr.onreadystatechange = function() {
+
+ // Check readyState before timeout as it changes
+ if ( xhr.readyState === 4 ) {
+
+ // Allow onerror to be called first,
+ // but that will not handle a native abort
+ // Also, save errorCallback to a variable
+ // as xhr.onerror cannot be accessed
+ window.setTimeout( function() {
+ if ( callback ) {
+ errorCallback();
+ }
+ } );
+ }
+ };
+ }
+
+ // Create the abort callback
+ callback = callback( "abort" );
+
+ try {
+
+ // Do send the request (this may raise an exception)
+ xhr.send( options.hasContent && options.data || null );
+ } catch ( e ) {
+
+ // #14683: Only rethrow if this hasn't been notified as an error yet
+ if ( callback ) {
+ throw e;
+ }
+ }
+ },
+
+ abort: function() {
+ if ( callback ) {
+ callback();
+ }
+ }
+ };
+ }
+} );
+
+
+
+
+// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
+jQuery.ajaxPrefilter( function( s ) {
+ if ( s.crossDomain ) {
+ s.contents.script = false;
+ }
+} );
+
+// Install script dataType
+jQuery.ajaxSetup( {
+ accepts: {
+ script: "text/javascript, application/javascript, " +
+ "application/ecmascript, application/x-ecmascript"
+ },
+ contents: {
+ script: /\b(?:java|ecma)script\b/
+ },
+ converters: {
+ "text script": function( text ) {
+ jQuery.globalEval( text );
+ return text;
+ }
+ }
+} );
+
+// Handle cache's special case and crossDomain
+jQuery.ajaxPrefilter( "script", function( s ) {
+ if ( s.cache === undefined ) {
+ s.cache = false;
+ }
+ if ( s.crossDomain ) {
+ s.type = "GET";
+ }
+} );
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function( s ) {
+
+ // This transport only deals with cross domain requests
+ if ( s.crossDomain ) {
+ var script, callback;
+ return {
+ send: function( _, complete ) {
+ script = jQuery( "<script>" ).prop( {
+ charset: s.scriptCharset,
+ src: s.url
+ } ).on(
+ "load error",
+ callback = function( evt ) {
+ script.remove();
+ callback = null;
+ if ( evt ) {
+ complete( evt.type === "error" ? 404 : 200, evt.type );
+ }
+ }
+ );
+
+ // Use native DOM manipulation to avoid our domManip AJAX trickery
+ document.head.appendChild( script[ 0 ] );
+ },
+ abort: function() {
+ if ( callback ) {
+ callback();
+ }
+ }
+ };
+ }
+} );
+
+
+
+
+var oldCallbacks = [],
+ rjsonp = /(=)\?(?=&|$)|\?\?/;
+
+// Default jsonp settings
+jQuery.ajaxSetup( {
+ jsonp: "callback",
+ jsonpCallback: function() {
+ var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
+ this[ callback ] = true;
+ return callback;
+ }
+} );
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+ var callbackName, overwritten, responseContainer,
+ jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
+ "url" :
+ typeof s.data === "string" &&
+ ( s.contentType || "" )
+ .indexOf( "application/x-www-form-urlencoded" ) === 0 &&
+ rjsonp.test( s.data ) && "data"
+ );
+
+ // Handle iff the expected data type is "jsonp" or we have a parameter to set
+ if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
+
+ // Get callback name, remembering preexisting value associated with it
+ callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?
+ s.jsonpCallback() :
+ s.jsonpCallback;
+
+ // Insert callback into url or form data
+ if ( jsonProp ) {
+ s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
+ } else if ( s.jsonp !== false ) {
+ s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+ }
+
+ // Use data converter to retrieve json after script execution
+ s.converters[ "script json" ] = function() {
+ if ( !responseContainer ) {
+ jQuery.error( callbackName + " was not called" );
+ }
+ return responseContainer[ 0 ];
+ };
+
+ // Force json dataType
+ s.dataTypes[ 0 ] = "json";
+
+ // Install callback
+ overwritten = window[ callbackName ];
+ window[ callbackName ] = function() {
+ responseContainer = arguments;
+ };
+
+ // Clean-up function (fires after converters)
+ jqXHR.always( function() {
+
+ // If previous value didn't exist - remove it
+ if ( overwritten === undefined ) {
+ jQuery( window ).removeProp( callbackName );
+
+ // Otherwise restore preexisting value
+ } else {
+ window[ callbackName ] = overwritten;
+ }
+
+ // Save back as free
+ if ( s[ callbackName ] ) {
+
+ // Make sure that re-using the options doesn't screw things around
+ s.jsonpCallback = originalSettings.jsonpCallback;
+
+ // Save the callback name for future use
+ oldCallbacks.push( callbackName );
+ }
+
+ // Call if it was a function and we have a response
+ if ( responseContainer && isFunction( overwritten ) ) {
+ overwritten( responseContainer[ 0 ] );
+ }
+
+ responseContainer = overwritten = undefined;
+ } );
+
+ // Delegate to script
+ return "script";
+ }
+} );
+
+
+
+
+// Support: Safari 8 only
+// In Safari 8 documents created via document.implementation.createHTMLDocument
+// collapse sibling forms: the second one becomes a child of the first one.
+// Because of that, this security measure has to be disabled in Safari 8.
+// https://bugs.webkit.org/show_bug.cgi?id=137337
+support.createHTMLDocument = ( function() {
+ var body = document.implementation.createHTMLDocument( "" ).body;
+ body.innerHTML = "<form></form><form></form>";
+ return body.childNodes.length === 2;
+} )();
+
+
+// Argument "data" should be string of html
+// context (optional): If specified, the fragment will be created in this context,
+// defaults to document
+// keepScripts (optional): If true, will include scripts passed in the html string
+jQuery.parseHTML = function( data, context, keepScripts ) {
+ if ( typeof data !== "string" ) {
+ return [];
+ }
+ if ( typeof context === "boolean" ) {
+ keepScripts = context;
+ context = false;
+ }
+
+ var base, parsed, scripts;
+
+ if ( !context ) {
+
+ // Stop scripts or inline event handlers from being executed immediately
+ // by using document.implementation
+ if ( support.createHTMLDocument ) {
+ context = document.implementation.createHTMLDocument( "" );
+
+ // Set the base href for the created document
+ // so any parsed elements with URLs
+ // are based on the document's URL (gh-2965)
+ base = context.createElement( "base" );
+ base.href = document.location.href;
+ context.head.appendChild( base );
+ } else {
+ context = document;
+ }
+ }
+
+ parsed = rsingleTag.exec( data );
+ scripts = !keepScripts && [];
+
+ // Single tag
+ if ( parsed ) {
+ return [ context.createElement( parsed[ 1 ] ) ];
+ }
+
+ parsed = buildFragment( [ data ], context, scripts );
+
+ if ( scripts && scripts.length ) {
+ jQuery( scripts ).remove();
+ }
+
+ return jQuery.merge( [], parsed.childNodes );
+};
+
+
+/**
+ * Load a url into a page
+ */
+jQuery.fn.load = function( url, params, callback ) {
+ var selector, type, response,
+ self = this,
+ off = url.indexOf( " " );
+
+ if ( off > -1 ) {
+ selector = stripAndCollapse( url.slice( off ) );
+ url = url.slice( 0, off );
+ }
+
+ // If it's a function
+ if ( isFunction( params ) ) {
+
+ // We assume that it's the callback
+ callback = params;
+ params = undefined;
+
+ // Otherwise, build a param string
+ } else if ( params && typeof params === "object" ) {
+ type = "POST";
+ }
+
+ // If we have elements to modify, make the request
+ if ( self.length > 0 ) {
+ jQuery.ajax( {
+ url: url,
+
+ // If "type" variable is undefined, then "GET" method will be used.
+ // Make value of this field explicit since
+ // user can override it through ajaxSetup method
+ type: type || "GET",
+ dataType: "html",
+ data: params
+ } ).done( function( responseText ) {
+
+ // Save response for use in complete callback
+ response = arguments;
+
+ self.html( selector ?
+
+ // If a selector was specified, locate the right elements in a dummy div
+ // Exclude scripts to avoid IE 'Permission Denied' errors
+ jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :
+
+ // Otherwise use the full result
+ responseText );
+
+ // If the request succeeds, this function gets "data", "status", "jqXHR"
+ // but they are ignored because response was set above.
+ // If it fails, this function gets "jqXHR", "status", "error"
+ } ).always( callback && function( jqXHR, status ) {
+ self.each( function() {
+ callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
+ } );
+ } );
+ }
+
+ return this;
+};
+
+
+
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( [
+ "ajaxStart",
+ "ajaxStop",
+ "ajaxComplete",
+ "ajaxError",
+ "ajaxSuccess",
+ "ajaxSend"
+], function( i, type ) {
+ jQuery.fn[ type ] = function( fn ) {
+ return this.on( type, fn );
+ };
+} );
+
+
+
+
+jQuery.expr.pseudos.animated = function( elem ) {
+ return jQuery.grep( jQuery.timers, function( fn ) {
+ return elem === fn.elem;
+ } ).length;
+};
+
+
+
+
+jQuery.offset = {
+ setOffset: function( elem, options, i ) {
+ var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
+ position = jQuery.css( elem, "position" ),
+ curElem = jQuery( elem ),
+ props = {};
+
+ // Set position first, in-case top/left are set even on static elem
+ if ( position === "static" ) {
+ elem.style.position = "relative";
+ }
+
+ curOffset = curElem.offset();
+ curCSSTop = jQuery.css( elem, "top" );
+ curCSSLeft = jQuery.css( elem, "left" );
+ calculatePosition = ( position === "absolute" || position === "fixed" ) &&
+ ( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;
+
+ // Need to be able to calculate position if either
+ // top or left is auto and position is either absolute or fixed
+ if ( calculatePosition ) {
+ curPosition = curElem.position();
+ curTop = curPosition.top;
+ curLeft = curPosition.left;
+
+ } else {
+ curTop = parseFloat( curCSSTop ) || 0;
+ curLeft = parseFloat( curCSSLeft ) || 0;
+ }
+
+ if ( isFunction( options ) ) {
+
+ // Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
+ options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
+ }
+
+ if ( options.top != null ) {
+ props.top = ( options.top - curOffset.top ) + curTop;
+ }
+ if ( options.left != null ) {
+ props.left = ( options.left - curOffset.left ) + curLeft;
+ }
+
+ if ( "using" in options ) {
+ options.using.call( elem, props );
+
+ } else {
+ curElem.css( props );
+ }
+ }
+};
+
+jQuery.fn.extend( {
+
+ // offset() relates an element's border box to the document origin
+ offset: function( options ) {
+
+ // Preserve chaining for setter
+ if ( arguments.length ) {
+ return options === undefined ?
+ this :
+ this.each( function( i ) {
+ jQuery.offset.setOffset( this, options, i );
+ } );
+ }
+
+ var rect, win,
+ elem = this[ 0 ];
+
+ if ( !elem ) {
+ return;
+ }
+
+ // Return zeros for disconnected and hidden (display: none) elements (gh-2310)
+ // Support: IE <=11 only
+ // Running getBoundingClientRect on a
+ // disconnected node in IE throws an error
+ if ( !elem.getClientRects().length ) {
+ return { top: 0, left: 0 };
+ }
+
+ // Get document-relative position by adding viewport scroll to viewport-relative gBCR
+ rect = elem.getBoundingClientRect();
+ win = elem.ownerDocument.defaultView;
+ return {
+ top: rect.top + win.pageYOffset,
+ left: rect.left + win.pageXOffset
+ };
+ },
+
+ // position() relates an element's margin box to its offset parent's padding box
+ // This corresponds to the behavior of CSS absolute positioning
+ position: function() {
+ if ( !this[ 0 ] ) {
+ return;
+ }
+
+ var offsetParent, offset, doc,
+ elem = this[ 0 ],
+ parentOffset = { top: 0, left: 0 };
+
+ // position:fixed elements are offset from the viewport, which itself always has zero offset
+ if ( jQuery.css( elem, "position" ) === "fixed" ) {
+
+ // Assume position:fixed implies availability of getBoundingClientRect
+ offset = elem.getBoundingClientRect();
+
+ } else {
+ offset = this.offset();
+
+ // Account for the *real* offset parent, which can be the document or its root element
+ // when a statically positioned element is identified
+ doc = elem.ownerDocument;
+ offsetParent = elem.offsetParent || doc.documentElement;
+ while ( offsetParent &&
+ ( offsetParent === doc.body || offsetParent === doc.documentElement ) &&
+ jQuery.css( offsetParent, "position" ) === "static" ) {
+
+ offsetParent = offsetParent.parentNode;
+ }
+ if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {
+
+ // Incorporate borders into its offset, since they are outside its content origin
+ parentOffset = jQuery( offsetParent ).offset();
+ parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true );
+ parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true );
+ }
+ }
+
+ // Subtract parent offsets and element margins
+ return {
+ top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
+ left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
+ };
+ },
+
+ // This method will return documentElement in the following cases:
+ // 1) For the element inside the iframe without offsetParent, this method will return
+ // documentElement of the parent window
+ // 2) For the hidden or detached element
+ // 3) For body or html element, i.e. in case of the html node - it will return itself
+ //
+ // but those exceptions were never presented as a real life use-cases
+ // and might be considered as more preferable results.
+ //
+ // This logic, however, is not guaranteed and can change at any point in the future
+ offsetParent: function() {
+ return this.map( function() {
+ var offsetParent = this.offsetParent;
+
+ while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
+ offsetParent = offsetParent.offsetParent;
+ }
+
+ return offsetParent || documentElement;
+ } );
+ }
+} );
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
+ var top = "pageYOffset" === prop;
+
+ jQuery.fn[ method ] = function( val ) {
+ return access( this, function( elem, method, val ) {
+
+ // Coalesce documents and windows
+ var win;
+ if ( isWindow( elem ) ) {
+ win = elem;
+ } else if ( elem.nodeType === 9 ) {
+ win = elem.defaultView;
+ }
+
+ if ( val === undefined ) {
+ return win ? win[ prop ] : elem[ method ];
+ }
+
+ if ( win ) {
+ win.scrollTo(
+ !top ? val : win.pageXOffset,
+ top ? val : win.pageYOffset
+ );
+
+ } else {
+ elem[ method ] = val;
+ }
+ }, method, val, arguments.length );
+ };
+} );
+
+// Support: Safari <=7 - 9.1, Chrome <=37 - 49
+// Add the top/left cssHooks using jQuery.fn.position
+// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
+// getComputedStyle returns percent when specified for top/left/bottom/right;
+// rather than make the css module depend on the offset module, just check for it here
+jQuery.each( [ "top", "left" ], function( i, prop ) {
+ jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
+ function( elem, computed ) {
+ if ( computed ) {
+ computed = curCSS( elem, prop );
+
+ // If curCSS returns percentage, fallback to offset
+ return rnumnonpx.test( computed ) ?
+ jQuery( elem ).position()[ prop ] + "px" :
+ computed;
+ }
+ }
+ );
+} );
+
+
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+ jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
+ function( defaultExtra, funcName ) {
+
+ // Margin is only for outerHeight, outerWidth
+ jQuery.fn[ funcName ] = function( margin, value ) {
+ var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+ extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+
+ return access( this, function( elem, type, value ) {
+ var doc;
+
+ if ( isWindow( elem ) ) {
+
+ // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
+ return funcName.indexOf( "outer" ) === 0 ?
+ elem[ "inner" + name ] :
+ elem.document.documentElement[ "client" + name ];
+ }
+
+ // Get document width or height
+ if ( elem.nodeType === 9 ) {
+ doc = elem.documentElement;
+
+ // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
+ // whichever is greatest
+ return Math.max(
+ elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+ elem.body[ "offset" + name ], doc[ "offset" + name ],
+ doc[ "client" + name ]
+ );
+ }
+
+ return value === undefined ?
+
+ // Get width or height on the element, requesting but not forcing parseFloat
+ jQuery.css( elem, type, extra ) :
+
+ // Set width or height on the element
+ jQuery.style( elem, type, value, extra );
+ }, type, chainable ? margin : undefined, chainable );
+ };
+ } );
+} );
+
+
+jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
+ "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+ "change select submit keydown keypress keyup contextmenu" ).split( " " ),
+ function( i, name ) {
+
+ // Handle event binding
+ jQuery.fn[ name ] = function( data, fn ) {
+ return arguments.length > 0 ?
+ this.on( name, null, data, fn ) :
+ this.trigger( name );
+ };
+} );
+
+jQuery.fn.extend( {
+ hover: function( fnOver, fnOut ) {
+ return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+ }
+} );
+
+
+
+
+jQuery.fn.extend( {
+
+ bind: function( types, data, fn ) {
+ return this.on( types, null, data, fn );
+ },
+ unbind: function( types, fn ) {
+ return this.off( types, null, fn );
+ },
+
+ delegate: function( selector, types, data, fn ) {
+ return this.on( types, selector, data, fn );
+ },
+ undelegate: function( selector, types, fn ) {
+
+ // ( namespace ) or ( selector, types [, fn] )
+ return arguments.length === 1 ?
+ this.off( selector, "**" ) :
+ this.off( types, selector || "**", fn );
+ }
+} );
+
+// Bind a function to a context, optionally partially applying any
+// arguments.
+// jQuery.proxy is deprecated to promote standards (specifically Function#bind)
+// However, it is not slated for removal any time soon
+jQuery.proxy = function( fn, context ) {
+ var tmp, args, proxy;
+
+ if ( typeof context === "string" ) {
+ tmp = fn[ context ];
+ context = fn;
+ fn = tmp;
+ }
+
+ // Quick check to determine if target is callable, in the spec
+ // this throws a TypeError, but we will just return undefined.
+ if ( !isFunction( fn ) ) {
+ return undefined;
+ }
+
+ // Simulated bind
+ args = slice.call( arguments, 2 );
+ proxy = function() {
+ return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
+ };
+
+ // Set the guid of unique handler to the same of original handler, so it can be removed
+ proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+ return proxy;
+};
+
+jQuery.holdReady = function( hold ) {
+ if ( hold ) {
+ jQuery.readyWait++;
+ } else {
+ jQuery.ready( true );
+ }
+};
+jQuery.isArray = Array.isArray;
+jQuery.parseJSON = JSON.parse;
+jQuery.nodeName = nodeName;
+jQuery.isFunction = isFunction;
+jQuery.isWindow = isWindow;
+jQuery.camelCase = camelCase;
+jQuery.type = toType;
+
+jQuery.now = Date.now;
+
+jQuery.isNumeric = function( obj ) {
+
+ // As of jQuery 3.0, isNumeric is limited to
+ // strings and numbers (primitives or objects)
+ // that can be coerced to finite numbers (gh-2662)
+ var type = jQuery.type( obj );
+ return ( type === "number" || type === "string" ) &&
+
+ // parseFloat NaNs numeric-cast false positives ("")
+ // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
+ // subtraction forces infinities to NaN
+ !isNaN( obj - parseFloat( obj ) );
+};
+
+
+
+
+// Register as a named AMD module, since jQuery can be concatenated with other
+// files that may use define, but not via a proper concatenation script that
+// understands anonymous AMD modules. A named AMD is safest and most robust
+// way to register. Lowercase jquery is used because AMD module names are
+// derived from file names, and jQuery is normally delivered in a lowercase
+// file name. Do this after creating the global so that if an AMD module wants
+// to call noConflict to hide this version of jQuery, it will work.
+
+// Note that for maximum portability, libraries that are not jQuery should
+// declare themselves as anonymous modules, and avoid setting a global if an
+// AMD loader is present. jQuery is a special case. For more information, see
+// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
+
+if ( typeof define === "function" && define.amd ) {
+ define( "jquery", [], function() {
+ return jQuery;
+ } );
+}
+
+
+
+
+var
+
+ // Map over jQuery in case of overwrite
+ _jQuery = window.jQuery,
+
+ // Map over the $ in case of overwrite
+ _$ = window.$;
+
+jQuery.noConflict = function( deep ) {
+ if ( window.$ === jQuery ) {
+ window.$ = _$;
+ }
+
+ if ( deep && window.jQuery === jQuery ) {
+ window.jQuery = _jQuery;
+ }
+
+ return jQuery;
+};
+
+// Expose jQuery and $ identifiers, even in AMD
+// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
+// and CommonJS for browser emulators (#13566)
+if ( !noGlobal ) {
+ window.jQuery = window.$ = jQuery;
+}
+
+
+
+
+return jQuery;
+} );
+
+;(function() {
+/*!
+ * @overview Ember - JavaScript Application Framework
+ * @copyright Copyright 2011-2018 Tilde Inc. and contributors
+ * Portions Copyright 2006-2011 Strobe Inc.
+ * Portions Copyright 2008-2011 Apple Inc. All rights reserved.
+ * @license Licensed under MIT license
+ * See https://raw.github.com/emberjs/ember.js/master/LICENSE
+ * @version 3.0.0
+ */
+
+/*globals process */
+var enifed, requireModule, Ember;
+
+// Used in ember-environment/lib/global.js
+mainContext = this; // eslint-disable-line no-undef
+
+(function() {
+ function missingModule(name, referrerName) {
+ if (referrerName) {
+ throw new Error('Could not find module ' + name + ' required by: ' + referrerName);
+ } else {
+ throw new Error('Could not find module ' + name);
+ }
+ }
+
+ function internalRequire(_name, referrerName) {
+ var name = _name;
+ var mod = registry[name];
+
+ if (!mod) {
+ name = name + '/index';
+ mod = registry[name];
+ }
+
+ var exports = seen[name];
+
+ if (exports !== undefined) {
+ return exports;
+ }
+
+ exports = seen[name] = {};
+
+ if (!mod) {
+ missingModule(_name, referrerName);
+ }
+
+ var deps = mod.deps;
+ var callback = mod.callback;
+ var reified = new Array(deps.length);
+
+ for (var i = 0; i < deps.length; i++) {
+ if (deps[i] === 'exports') {
+ reified[i] = exports;
+ } else if (deps[i] === 'require') {
+ reified[i] = requireModule;
+ } else {
+ reified[i] = internalRequire(deps[i], name);
+ }
+ }
+
+ callback.apply(this, reified);
+
+ return exports;
+ }
+
+ var isNode = typeof window === 'undefined' &&
+ typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';
+
+ if (!isNode) {
+ Ember = this.Ember = this.Ember || {};
+ }
+
+ if (typeof Ember === 'undefined') { Ember = {}; }
+
+ if (typeof Ember.__loader === 'undefined') {
+ var registry = {};
+ var seen = {};
+
+ enifed = function(name, deps, callback) {
+ var value = { };
+
+ if (!callback) {
+ value.deps = [];
+ value.callback = deps;
+ } else {
+ value.deps = deps;
+ value.callback = callback;
+ }
+
+ registry[name] = value;
+ };
+
+ requireModule = function(name) {
+ return internalRequire(name, null);
+ };
+
+ // setup `require` module
+ requireModule['default'] = requireModule;
+
+ requireModule.has = function registryHas(moduleName) {
+ return !!registry[moduleName] || !!registry[moduleName + '/index'];
+ };
+
+ requireModule._eak_seen = registry;
+
+ Ember.__loader = {
+ define: enifed,
+ require: requireModule,
+ registry: registry
+ };
+ } else {
+ enifed = Ember.__loader.define;
+ requireModule = Ember.__loader.require;
+ }
+})();
+
+enifed("@glimmer/node", ["exports", "@glimmer/runtime"], function (exports, _runtime) {
+ "use strict";
+
+ exports.NodeDOMTreeConstruction = undefined;
+
+
+ function _defaults(obj, defaults) {
+ var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {
+ Object.defineProperty(obj, key, value);
+ }
+ }return obj;
+ }
+
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ function _possibleConstructorReturn(self, call) {
+ if (!self) {
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ }return call && (typeof call === "object" || typeof call === "function") ? call : self;
+ }
+
+ function _inherits(subClass, superClass) {
+ if (typeof superClass !== "function" && superClass !== null) {
+ throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass);
+ }
+
+ var NodeDOMTreeConstruction = function (_DOMTreeConstruction) {
+ _inherits(NodeDOMTreeConstruction, _DOMTreeConstruction);
+
+ function NodeDOMTreeConstruction(doc) {
+ _classCallCheck(this, NodeDOMTreeConstruction);
+
+ return _possibleConstructorReturn(this, _DOMTreeConstruction.call(this, doc));
+ }
+ // override to prevent usage of `this.document` until after the constructor
+
+
+ NodeDOMTreeConstruction.prototype.setupUselessElement = function setupUselessElement() {};
+
+ NodeDOMTreeConstruction.prototype.insertHTMLBefore = function insertHTMLBefore(parent, reference, html) {
+ var prev = reference ? reference.previousSibling : parent.lastChild;
+ var raw = this.document.createRawHTMLSection(html);
+ parent.insertBefore(raw, reference);
+ var first = prev ? prev.nextSibling : parent.firstChild;
+ var last = reference ? reference.previousSibling : parent.lastChild;
+ return new _runtime.ConcreteBounds(parent, first, last);
+ };
+ // override to avoid SVG detection/work when in node (this is not needed in SSR)
+
+
+ NodeDOMTreeConstruction.prototype.createElement = function createElement(tag) {
+ return this.document.createElement(tag);
+ };
+ // override to avoid namespace shenanigans when in node (this is not needed in SSR)
+
+
+ NodeDOMTreeConstruction.prototype.setAttribute = function setAttribute(element, name, value) {
+ element.setAttribute(name, value);
+ };
+
+ return NodeDOMTreeConstruction;
+ }(_runtime.DOMTreeConstruction);
+
+ exports.NodeDOMTreeConstruction = NodeDOMTreeConstruction;
+});
+enifed("@glimmer/reference", ["exports", "@glimmer/util"], function (exports, _util) {
+ "use strict";
+
+ exports.isModified = exports.ReferenceCache = exports.map = exports.CachedReference = exports.UpdatableTag = exports.CachedTag = exports.combine = exports.combineSlice = exports.combineTagged = exports.DirtyableTag = exports.CURRENT_TAG = exports.VOLATILE_TAG = exports.CONSTANT_TAG = exports.TagWrapper = exports.RevisionTag = exports.VOLATILE = exports.INITIAL = exports.CONSTANT = exports.IteratorSynchronizer = exports.ReferenceIterator = exports.IterationArtifacts = exports.referenceFromParts = exports.ListItem = exports.isConst = exports.ConstReference = undefined;
+
+
+ function _defaults(obj, defaults) {
+ var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {
+ Object.defineProperty(obj, key, value);
+ }
+ }return obj;
+ }
+
+ function _possibleConstructorReturn(self, call) {
+ if (!self) {
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ }return call && (typeof call === "object" || typeof call === "function") ? call : self;
+ }
+
+ function _inherits(subClass, superClass) {
+ if (typeof superClass !== "function" && superClass !== null) {
+ throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass);
+ }
+
+ function _classCallCheck$1(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ var CONSTANT = 0;
+ var INITIAL = 1;
+ var VOLATILE = NaN;
+ var RevisionTag = function () {
+ function RevisionTag() {
+ _classCallCheck$1(this, RevisionTag);
+ }
+
+ RevisionTag.prototype.validate = function validate(snapshot) {
+ return this.value() === snapshot;
+ };
+
+ return RevisionTag;
+ }();
+ RevisionTag.id = 0;
+ var VALUE = [];
+ var VALIDATE = [];
+ var TagWrapper = function () {
+ function TagWrapper(type, inner) {
+ _classCallCheck$1(this, TagWrapper);
+
+ this.type = type;
+ this.inner = inner;
+ }
+
+ TagWrapper.prototype.value = function value() {
+ var func = VALUE[this.type];
+ return func(this.inner);
+ };
+
+ TagWrapper.prototype.validate = function validate(snapshot) {
+ var func = VALIDATE[this.type];
+ return func(this.inner, snapshot);
+ };
+
+ return TagWrapper;
+ }();
+ function register(Type) {
+ var type = VALUE.length;
+ VALUE.push(function (tag) {
+ return tag.value();
+ });
+ VALIDATE.push(function (tag, snapshot) {
+ return tag.validate(snapshot);
+ });
+ Type.id = type;
+ }
+ ///
+ // CONSTANT: 0
+ VALUE.push(function () {
+ return CONSTANT;
+ });
+ VALIDATE.push(function (_tag, snapshot) {
+ return snapshot === CONSTANT;
+ });
+ var CONSTANT_TAG = new TagWrapper(0, null);
+ // VOLATILE: 1
+ VALUE.push(function () {
+ return VOLATILE;
+ });
+ VALIDATE.push(function (_tag, snapshot) {
+ return snapshot === VOLATILE;
+ });
+ var VOLATILE_TAG = new TagWrapper(1, null);
+ // CURRENT: 2
+ VALUE.push(function () {
+ return $REVISION;
+ });
+ VALIDATE.push(function (_tag, snapshot) {
+ return snapshot === $REVISION;
+ });
+ var CURRENT_TAG = new TagWrapper(2, null);
+ ///
+ var $REVISION = INITIAL;
+ var DirtyableTag = function (_RevisionTag) {
+ _inherits(DirtyableTag, _RevisionTag);
+
+ DirtyableTag.create = function create() {
+ var revision = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : $REVISION;
+
+ return new TagWrapper(this.id, new DirtyableTag(revision));
+ };
+
+ function DirtyableTag() {
+ var revision = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : $REVISION;
+
+ _classCallCheck$1(this, DirtyableTag);
+
+ var _this = _possibleConstructorReturn(this, _RevisionTag.call(this));
+
+ _this.revision = revision;
+ return _this;
+ }
+
+ DirtyableTag.prototype.value = function value() {
+ return this.revision;
+ };
+
+ DirtyableTag.prototype.dirty = function dirty() {
+ this.revision = ++$REVISION;
+ };
+
+ return DirtyableTag;
+ }(RevisionTag);
+ register(DirtyableTag);
+ function combineTagged(tagged) {
+ var optimized = [];
+ for (var i = 0, l = tagged.length; i < l; i++) {
+ var tag = tagged[i].tag;
+ if (tag === VOLATILE_TAG) return VOLATILE_TAG;
+ if (tag === CONSTANT_TAG) continue;
+ optimized.push(tag);
+ }
+ return _combine(optimized);
+ }
+ function combineSlice(slice) {
+ var optimized = [];
+ var node = slice.head();
+ while (node !== null) {
+ var tag = node.tag;
+ if (tag === VOLATILE_TAG) return VOLATILE_TAG;
+ if (tag !== CONSTANT_TAG) optimized.push(tag);
+ node = slice.nextNode(node);
+ }
+ return _combine(optimized);
+ }
+ function combine(tags) {
+ var optimized = [];
+ for (var i = 0, l = tags.length; i < l; i++) {
+ var tag = tags[i];
+ if (tag === VOLATILE_TAG) return VOLATILE_TAG;
+ if (tag === CONSTANT_TAG) continue;
+ optimized.push(tag);
+ }
+ return _combine(optimized);
+ }
+ function _combine(tags) {
+ switch (tags.length) {
+ case 0:
+ return CONSTANT_TAG;
+ case 1:
+ return tags[0];
+ case 2:
+ return TagsPair.create(tags[0], tags[1]);
+ default:
+ return TagsCombinator.create(tags);
+ }
+ }
+ var CachedTag = function (_RevisionTag2) {
+ _inherits(CachedTag, _RevisionTag2);
+
+ function CachedTag() {
+ _classCallCheck$1(this, CachedTag);
+
+ var _this2 = _possibleConstructorReturn(this, _RevisionTag2.apply(this, arguments));
+
+ _this2.lastChecked = null;
+ _this2.lastValue = null;
+ return _this2;
+ }
+
+ CachedTag.prototype.value = function value() {
+ var lastChecked = this.lastChecked,
+ lastValue = this.lastValue;
+
+ if (lastChecked !== $REVISION) {
+ this.lastChecked = $REVISION;
+ this.lastValue = lastValue = this.compute();
+ }
+ return this.lastValue;
+ };
+
+ CachedTag.prototype.invalidate = function invalidate() {
+ this.lastChecked = null;
+ };
+
+ return CachedTag;
+ }(RevisionTag);
+
+ var TagsPair = function (_CachedTag) {
+ _inherits(TagsPair, _CachedTag);
+
+ TagsPair.create = function create(first, second) {
+ return new TagWrapper(this.id, new TagsPair(first, second));
+ };
+
+ function TagsPair(first, second) {
+ _classCallCheck$1(this, TagsPair);
+
+ var _this3 = _possibleConstructorReturn(this, _CachedTag.call(this));
+
+ _this3.first = first;
+ _this3.second = second;
+ return _this3;
+ }
+
+ TagsPair.prototype.compute = function compute() {
+ return Math.max(this.first.value(), this.second.value());
+ };
+
+ return TagsPair;
+ }(CachedTag);
+
+ register(TagsPair);
+
+ var TagsCombinator = function (_CachedTag2) {
+ _inherits(TagsCombinator, _CachedTag2);
+
+ TagsCombinator.create = function create(tags) {
+ return new TagWrapper(this.id, new TagsCombinator(tags));
+ };
+
+ function TagsCombinator(tags) {
+ _classCallCheck$1(this, TagsCombinator);
+
+ var _this4 = _possibleConstructorReturn(this, _CachedTag2.call(this));
+
+ _this4.tags = tags;
+ return _this4;
+ }
+
+ TagsCombinator.prototype.compute = function compute() {
+ var tags = this.tags;
+
+ var max = -1;
+ for (var i = 0; i < tags.length; i++) {
+ var value = tags[i].value();
+ max = Math.max(value, max);
+ }
+ return max;
+ };
+
+ return TagsCombinator;
+ }(CachedTag);
+
+ register(TagsCombinator);
+ var UpdatableTag = function (_CachedTag3) {
+ _inherits(UpdatableTag, _CachedTag3);
+
+ UpdatableTag.create = function create(tag) {
+ return new TagWrapper(this.id, new UpdatableTag(tag));
+ };
+
+ function UpdatableTag(tag) {
+ _classCallCheck$1(this, UpdatableTag);
+
+ var _this5 = _possibleConstructorReturn(this, _CachedTag3.call(this));
+
+ _this5.tag = tag;
+ _this5.lastUpdated = INITIAL;
+ return _this5;
+ }
+
+ UpdatableTag.prototype.compute = function compute() {
+ return Math.max(this.lastUpdated, this.tag.value());
+ };
+
+ UpdatableTag.prototype.update = function update(tag) {
+ if (tag !== this.tag) {
+ this.tag = tag;
+ this.lastUpdated = $REVISION;
+ this.invalidate();
+ }
+ };
+
+ return UpdatableTag;
+ }(CachedTag);
+ register(UpdatableTag);
+ var CachedReference = function () {
+ function CachedReference() {
+ _classCallCheck$1(this, CachedReference);
+
+ this.lastRevision = null;
+ this.lastValue = null;
+ }
+
+ CachedReference.prototype.value = function value() {
+ var tag = this.tag,
+ lastRevision = this.lastRevision,
+ lastValue = this.lastValue;
+
+ if (!lastRevision || !tag.validate(lastRevision)) {
+ lastValue = this.lastValue = this.compute();
+ this.lastRevision = tag.value();
+ }
+ return lastValue;
+ };
+
+ CachedReference.prototype.invalidate = function invalidate() {
+ this.lastRevision = null;
+ };
+
+ return CachedReference;
+ }();
+
+ var MapperReference = function (_CachedReference) {
+ _inherits(MapperReference, _CachedReference);
+
+ function MapperReference(reference, mapper) {
+ _classCallCheck$1(this, MapperReference);
+
+ var _this6 = _possibleConstructorReturn(this, _CachedReference.call(this));
+
+ _this6.tag = reference.tag;
+ _this6.reference = reference;
+ _this6.mapper = mapper;
+ return _this6;
+ }
+
+ MapperReference.prototype.compute = function compute() {
+ var reference = this.reference,
+ mapper = this.mapper;
+
+ return mapper(reference.value());
+ };
+
+ return MapperReference;
+ }(CachedReference);
+
+ function map(reference, mapper) {
+ return new MapperReference(reference, mapper);
+ }
+ //////////
+ var ReferenceCache = function () {
+ function ReferenceCache(reference) {
+ _classCallCheck$1(this, ReferenceCache);
+
+ this.lastValue = null;
+ this.lastRevision = null;
+ this.initialized = false;
+ this.tag = reference.tag;
+ this.reference = reference;
+ }
+
+ ReferenceCache.prototype.peek = function peek() {
+ if (!this.initialized) {
+ return this.initialize();
+ }
+ return this.lastValue;
+ };
+
+ ReferenceCache.prototype.revalidate = function revalidate() {
+ if (!this.initialized) {
+ return this.initialize();
+ }
+ var reference = this.reference,
+ lastRevision = this.lastRevision;
+
+ var tag = reference.tag;
+ if (tag.validate(lastRevision)) return NOT_MODIFIED;
+ this.lastRevision = tag.value();
+ var lastValue = this.lastValue;
+
+ var value = reference.value();
+ if (value === lastValue) return NOT_MODIFIED;
+ this.lastValue = value;
+ return value;
+ };
+
+ ReferenceCache.prototype.initialize = function initialize() {
+ var reference = this.reference;
+
+ var value = this.lastValue = reference.value();
+ this.lastRevision = reference.tag.value();
+ this.initialized = true;
+ return value;
+ };
+
+ return ReferenceCache;
+ }();
+ var NOT_MODIFIED = "adb3b78e-3d22-4e4b-877a-6317c2c5c145";
+ function isModified(value) {
+ return value !== NOT_MODIFIED;
+ }
+
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ var ConstReference = function () {
+ function ConstReference(inner) {
+ _classCallCheck(this, ConstReference);
+
+ this.inner = inner;
+ this.tag = CONSTANT_TAG;
+ }
+
+ ConstReference.prototype.value = function value() {
+ return this.inner;
+ };
+
+ return ConstReference;
+ }();
+ function isConst(reference) {
+ return reference.tag === CONSTANT_TAG;
+ }
+
+ function _defaults$1(obj, defaults) {
+ var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {
+ Object.defineProperty(obj, key, value);
+ }
+ }return obj;
+ }
+
+ function _classCallCheck$2(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ function _possibleConstructorReturn$1(self, call) {
+ if (!self) {
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ }return call && (typeof call === "object" || typeof call === "function") ? call : self;
+ }
+
+ function _inherits$1(subClass, superClass) {
+ if (typeof superClass !== "function" && superClass !== null) {
+ throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults$1(subClass, superClass);
+ }
+
+ var ListItem = function (_ListNode) {
+ _inherits$1(ListItem, _ListNode);
+
+ function ListItem(iterable, result) {
+ _classCallCheck$2(this, ListItem);
+
+ var _this = _possibleConstructorReturn$1(this, _ListNode.call(this, iterable.valueReferenceFor(result)));
+
+ _this.retained = false;
+ _this.seen = false;
+ _this.key = result.key;
+ _this.iterable = iterable;
+ _this.memo = iterable.memoReferenceFor(result);
+ return _this;
+ }
+
+ ListItem.prototype.update = function update(item) {
+ this.retained = true;
+ this.iterable.updateValueReference(this.value, item);
+ this.iterable.updateMemoReference(this.memo, item);
+ };
+
+ ListItem.prototype.shouldRemove = function shouldRemove() {
+ return !this.retained;
+ };
+
+ ListItem.prototype.reset = function reset() {
+ this.retained = false;
+ this.seen = false;
+ };
+
+ return ListItem;
+ }(_util.ListNode);
+ var IterationArtifacts = function () {
+ function IterationArtifacts(iterable) {
+ _classCallCheck$2(this, IterationArtifacts);
+
+ this.map = (0, _util.dict)();
+ this.list = new _util.LinkedList();
+ this.tag = iterable.tag;
+ this.iterable = iterable;
+ }
+
+ IterationArtifacts.prototype.isEmpty = function isEmpty() {
+ var iterator = this.iterator = this.iterable.iterate();
+ return iterator.isEmpty();
+ };
+
+ IterationArtifacts.prototype.iterate = function iterate() {
+ var iterator = this.iterator || this.iterable.iterate();
+ this.iterator = null;
+ return iterator;
+ };
+
+ IterationArtifacts.prototype.has = function has(key) {
+ return !!this.map[key];
+ };
+
+ IterationArtifacts.prototype.get = function get(key) {
+ return this.map[key];
+ };
+
+ IterationArtifacts.prototype.wasSeen = function wasSeen(key) {
+ var node = this.map[key];
+ return node && node.seen;
+ };
+
+ IterationArtifacts.prototype.append = function append(item) {
+ var map = this.map,
+ list = this.list,
+ iterable = this.iterable;
+
+ var node = map[item.key] = new ListItem(iterable, item);
+ list.append(node);
+ return node;
+ };
+
+ IterationArtifacts.prototype.insertBefore = function insertBefore(item, reference) {
+ var map = this.map,
+ list = this.list,
+ iterable = this.iterable;
+
+ var node = map[item.key] = new ListItem(iterable, item);
+ node.retained = true;
+ list.insertBefore(node, reference);
+ return node;
+ };
+
+ IterationArtifacts.prototype.move = function move(item, reference) {
+ var list = this.list;
+
+ item.retained = true;
+ list.remove(item);
+ list.insertBefore(item, reference);
+ };
+
+ IterationArtifacts.prototype.remove = function remove(item) {
+ var list = this.list;
+
+ list.remove(item);
+ delete this.map[item.key];
+ };
+
+ IterationArtifacts.prototype.nextNode = function nextNode(item) {
+ return this.list.nextNode(item);
+ };
+
+ IterationArtifacts.prototype.head = function head() {
+ return this.list.head();
+ };
+
+ return IterationArtifacts;
+ }();
+ var ReferenceIterator = function () {
+ // if anyone needs to construct this object with something other than
+ // an iterable, let @wycats know.
+ function ReferenceIterator(iterable) {
+ _classCallCheck$2(this, ReferenceIterator);
+
+ this.iterator = null;
+ var artifacts = new IterationArtifacts(iterable);
+ this.artifacts = artifacts;
+ }
+
+ ReferenceIterator.prototype.next = function next() {
+ var artifacts = this.artifacts;
+
+ var iterator = this.iterator = this.iterator || artifacts.iterate();
+ var item = iterator.next();
+ if (!item) return null;
+ return artifacts.append(item);
+ };
+
+ return ReferenceIterator;
+ }();
+ var Phase;
+ (function (Phase) {
+ Phase[Phase["Append"] = 0] = "Append";
+ Phase[Phase["Prune"] = 1] = "Prune";
+ Phase[Phase["Done"] = 2] = "Done";
+ })(Phase || (Phase = {}));
+ var IteratorSynchronizer = function () {
+ function IteratorSynchronizer(_ref) {
+ var target = _ref.target,
+ artifacts = _ref.artifacts;
+
+ _classCallCheck$2(this, IteratorSynchronizer);
+
+ this.target = target;
+ this.artifacts = artifacts;
+ this.iterator = artifacts.iterate();
+ this.current = artifacts.head();
+ }
+
+ IteratorSynchronizer.prototype.sync = function sync() {
+ var phase = Phase.Append;
+ while (true) {
+ switch (phase) {
+ case Phase.Append:
+ phase = this.nextAppend();
+ break;
+ case Phase.Prune:
+ phase = this.nextPrune();
+ break;
+ case Phase.Done:
+ this.nextDone();
+ return;
+ }
+ }
+ };
+
+ IteratorSynchronizer.prototype.advanceToKey = function advanceToKey(key) {
+ var current = this.current,
+ artifacts = this.artifacts;
+
+ var seek = current;
+ while (seek && seek.key !== key) {
+ seek.seen = true;
+ seek = artifacts.nextNode(seek);
+ }
+ this.current = seek && artifacts.nextNode(seek);
+ };
+
+ IteratorSynchronizer.prototype.nextAppend = function nextAppend() {
+ var iterator = this.iterator,
+ current = this.current,
+ artifacts = this.artifacts;
+
+ var item = iterator.next();
+ if (item === null) {
+ return this.startPrune();
+ }
+ var key = item.key;
+
+ if (current && current.key === key) {
+ this.nextRetain(item);
+ } else if (artifacts.has(key)) {
+ this.nextMove(item);
+ } else {
+ this.nextInsert(item);
+ }
+ return Phase.Append;
+ };
+
+ IteratorSynchronizer.prototype.nextRetain = function nextRetain(item) {
+ var artifacts = this.artifacts,
+ current = this.current;
+
+ current = current;
+ current.update(item);
+ this.current = artifacts.nextNode(current);
+ this.target.retain(item.key, current.value, current.memo);
+ };
+
+ IteratorSynchronizer.prototype.nextMove = function nextMove(item) {
+ var current = this.current,
+ artifacts = this.artifacts,
+ target = this.target;
+ var key = item.key;
+
+ var found = artifacts.get(item.key);
+ found.update(item);
+ if (artifacts.wasSeen(item.key)) {
+ artifacts.move(found, current);
+ target.move(found.key, found.value, found.memo, current ? current.key : null);
+ } else {
+ this.advanceToKey(key);
+ }
+ };
+
+ IteratorSynchronizer.prototype.nextInsert = function nextInsert(item) {
+ var artifacts = this.artifacts,
+ target = this.target,
+ current = this.current;
+
+ var node = artifacts.insertBefore(item, current);
+ target.insert(node.key, node.value, node.memo, current ? current.key : null);
+ };
+
+ IteratorSynchronizer.prototype.startPrune = function startPrune() {
+ this.current = this.artifacts.head();
+ return Phase.Prune;
+ };
+
+ IteratorSynchronizer.prototype.nextPrune = function nextPrune() {
+ var artifacts = this.artifacts,
+ target = this.target,
+ current = this.current;
+
+ if (current === null) {
+ return Phase.Done;
+ }
+ var node = current;
+ this.current = artifacts.nextNode(node);
+ if (node.shouldRemove()) {
+ artifacts.remove(node);
+ target.delete(node.key);
+ } else {
+ node.reset();
+ }
+ return Phase.Prune;
+ };
+
+ IteratorSynchronizer.prototype.nextDone = function nextDone() {
+ this.target.done();
+ };
+
+ return IteratorSynchronizer;
+ }();
+
+ function referenceFromParts(root, parts) {
+ var reference = root;
+ for (var i = 0; i < parts.length; i++) {
+ reference = reference.get(parts[i]);
+ }
+ return reference;
+ }
+
+ exports.ConstReference = ConstReference;
+ exports.isConst = isConst;
+ exports.ListItem = ListItem;
+ exports.referenceFromParts = referenceFromParts;
+ exports.IterationArtifacts = IterationArtifacts;
+ exports.ReferenceIterator = ReferenceIterator;
+ exports.IteratorSynchronizer = IteratorSynchronizer;
+ exports.CONSTANT = CONSTANT;
+ exports.INITIAL = INITIAL;
+ exports.VOLATILE = VOLATILE;
+ exports.RevisionTag = RevisionTag;
+ exports.TagWrapper = TagWrapper;
+ exports.CONSTANT_TAG = CONSTANT_TAG;
+ exports.VOLATILE_TAG = VOLATILE_TAG;
+ exports.CURRENT_TAG = CURRENT_TAG;
+ exports.DirtyableTag = DirtyableTag;
+ exports.combineTagged = combineTagged;
+ exports.combineSlice = combineSlice;
+ exports.combine = combine;
+ exports.CachedTag = CachedTag;
+ exports.UpdatableTag = UpdatableTag;
+ exports.CachedReference = CachedReference;
+ exports.map = map;
+ exports.ReferenceCache = ReferenceCache;
+ exports.isModified = isModified;
+});
+enifed('@glimmer/runtime', ['exports', '@glimmer/util', '@glimmer/reference', '@glimmer/wire-format'], function (exports, _util, _reference2, _wireFormat) {
+ 'use strict';
+
+ exports.ConcreteBounds = exports.ElementStack = exports.insertHTMLBefore = exports.isWhitespace = exports.DOMTreeConstruction = exports.IDOMChanges = exports.DOMChanges = exports.isComponentDefinition = exports.ComponentDefinition = exports.PartialDefinition = exports.Environment = exports.Scope = exports.isSafeString = exports.RenderResult = exports.UpdatingVM = exports.compileExpression = exports.compileList = exports.InlineMacros = exports.BlockMacros = exports.getDynamicVar = exports.resetDebuggerCallback = exports.setDebuggerCallback = exports.normalizeTextValue = exports.debugSlice = exports.Register = exports.readDOMAttr = exports.defaultPropertyManagers = exports.defaultAttributeManagers = exports.defaultManagers = exports.INPUT_VALUE_PROPERTY_MANAGER = exports.PropertyManager = exports.AttributeManager = exports.IAttributeManager = exports.CompiledDynamicTemplate = exports.CompiledStaticTemplate = exports.compileLayout = exports.OpcodeBuilderDSL = exports.ConditionalReference = exports.PrimitiveReference = exports.UNDEFINED_REFERENCE = exports.NULL_REFERENCE = exports.templateFactory = exports.Simple = undefined;
+
+
+ function _defaults(obj, defaults) {
+ var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {
+ Object.defineProperty(obj, key, value);
+ }
+ }return obj;
+ }
+
+ function _possibleConstructorReturn(self, call) {
+ if (!self) {
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ }return call && (typeof call === "object" || typeof call === "function") ? call : self;
+ }
+
+ function _inherits(subClass, superClass) {
+ if (typeof superClass !== "function" && superClass !== null) {
+ throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass);
+ }
+
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ /**
+ * Registers
+ *
+ * For the most part, these follows MIPS naming conventions, however the
+ * register numbers are different.
+ */
+ var Register;
+ (function (Register) {
+ // $0 or $pc (program counter): pointer into `program` for the next insturction; -1 means exit
+ Register[Register["pc"] = 0] = "pc";
+ // $1 or $ra (return address): pointer into `program` for the return
+ Register[Register["ra"] = 1] = "ra";
+ // $2 or $fp (frame pointer): pointer into the `evalStack` for the base of the stack
+ Register[Register["fp"] = 2] = "fp";
+ // $3 or $sp (stack pointer): pointer into the `evalStack` for the top of the stack
+ Register[Register["sp"] = 3] = "sp";
+ // $4-$5 or $s0-$s1 (saved): callee saved general-purpose registers
+ Register[Register["s0"] = 4] = "s0";
+ Register[Register["s1"] = 5] = "s1";
+ // $6-$7 or $t0-$t1 (temporaries): caller saved general-purpose registers
+ Register[Register["t0"] = 6] = "t0";
+ Register[Register["t1"] = 7] = "t1";
+ })(Register || (exports.Register = Register = {}));
+ function debugSlice(env, start, end) {}
+ var AppendOpcodes = function () {
+ function AppendOpcodes() {
+ _classCallCheck(this, AppendOpcodes);
+
+ this.evaluateOpcode = (0, _util.fillNulls)(72 /* Size */).slice();
+ }
+
+ AppendOpcodes.prototype.add = function add(name, evaluate) {
+ this.evaluateOpcode[name] = evaluate;
+ };
+
+ AppendOpcodes.prototype.evaluate = function evaluate(vm, opcode, type) {
+ var func = this.evaluateOpcode[type];
+ func(vm, opcode);
+ };
+
+ return AppendOpcodes;
+ }();
+ var APPEND_OPCODES = new AppendOpcodes();
+ var AbstractOpcode = function () {
+ function AbstractOpcode() {
+ _classCallCheck(this, AbstractOpcode);
+
+ (0, _util.initializeGuid)(this);
+ }
+
+ AbstractOpcode.prototype.toJSON = function toJSON() {
+ return { guid: this._guid, type: this.type };
+ };
+
+ return AbstractOpcode;
+ }();
+ var UpdatingOpcode = function (_AbstractOpcode) {
+ _inherits(UpdatingOpcode, _AbstractOpcode);
+
+ function UpdatingOpcode() {
+ _classCallCheck(this, UpdatingOpcode);
+
+ var _this = _possibleConstructorReturn(this, _AbstractOpcode.apply(this, arguments));
+
+ _this.next = null;
+ _this.prev = null;
+ return _this;
+ }
+
+ return UpdatingOpcode;
+ }(AbstractOpcode);
+
+ function _defaults$1(obj, defaults) {
+ var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {
+ Object.defineProperty(obj, key, value);
+ }
+ }return obj;
+ }
+
+ function _classCallCheck$1(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ function _possibleConstructorReturn$1(self, call) {
+ if (!self) {
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ }return call && (typeof call === "object" || typeof call === "function") ? call : self;
+ }
+
+ function _inherits$1(subClass, superClass) {
+ if (typeof superClass !== "function" && superClass !== null) {
+ throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults$1(subClass, superClass);
+ }
+
+ var PrimitiveReference = function (_ConstReference) {
+ _inherits$1(PrimitiveReference, _ConstReference);
+
+ function PrimitiveReference(value) {
+ _classCallCheck$1(this, PrimitiveReference);
+
+ return _possibleConstructorReturn$1(this, _ConstReference.call(this, value));
+ }
+
+ PrimitiveReference.create = function create(value) {
+ if (value === undefined) {
+ return UNDEFINED_REFERENCE;
+ } else if (value === null) {
+ return NULL_REFERENCE;
+ } else if (value === true) {
+ return TRUE_REFERENCE;
+ } else if (value === false) {
+ return FALSE_REFERENCE;
+ } else if (typeof value === 'number') {
+ return new ValueReference(value);
+ } else {
+ return new StringReference(value);
+ }
+ };
+
+ PrimitiveReference.prototype.get = function get(_key) {
+ return UNDEFINED_REFERENCE;
+ };
+
+ return PrimitiveReference;
+ }(_reference2.ConstReference);
+
+ var StringReference = function (_PrimitiveReference) {
+ _inherits$1(StringReference, _PrimitiveReference);
+
+ function StringReference() {
+ _classCallCheck$1(this, StringReference);
+
+ var _this2 = _possibleConstructorReturn$1(this, _PrimitiveReference.apply(this, arguments));
+
+ _this2.lengthReference = null;
+ return _this2;
+ }
+
+ StringReference.prototype.get = function get(key) {
+ if (key === 'length') {
+ var lengthReference = this.lengthReference;
+
+ if (lengthReference === null) {
+ lengthReference = this.lengthReference = new ValueReference(this.inner.length);
+ }
+ return lengthReference;
+ } else {
+ return _PrimitiveReference.prototype.get.call(this, key);
+ }
+ };
+
+ return StringReference;
+ }(PrimitiveReference);
+
+ var ValueReference = function (_PrimitiveReference2) {
+ _inherits$1(ValueReference, _PrimitiveReference2);
+
+ function ValueReference(value) {
+ _classCallCheck$1(this, ValueReference);
+
+ return _possibleConstructorReturn$1(this, _PrimitiveReference2.call(this, value));
+ }
+
+ return ValueReference;
+ }(PrimitiveReference);
+
+ var UNDEFINED_REFERENCE = new ValueReference(undefined);
+ var NULL_REFERENCE = new ValueReference(null);
+ var TRUE_REFERENCE = new ValueReference(true);
+ var FALSE_REFERENCE = new ValueReference(false);
+ var ConditionalReference = function () {
+ function ConditionalReference(inner) {
+ _classCallCheck$1(this, ConditionalReference);
+
+ this.inner = inner;
+ this.tag = inner.tag;
+ }
+
+ ConditionalReference.prototype.value = function value() {
+ return this.toBool(this.inner.value());
+ };
+
+ ConditionalReference.prototype.toBool = function toBool(value) {
+ return !!value;
+ };
+
+ return ConditionalReference;
+ }();
+
+ function _defaults$2(obj, defaults) {
+ var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {
+ Object.defineProperty(obj, key, value);
+ }
+ }return obj;
+ }
+
+ function _classCallCheck$2(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ function _possibleConstructorReturn$2(self, call) {
+ if (!self) {
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ }return call && (typeof call === "object" || typeof call === "function") ? call : self;
+ }
+
+ function _inherits$2(subClass, superClass) {
+ if (typeof superClass !== "function" && superClass !== null) {
+ throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults$2(subClass, superClass);
+ }
+
+ var ConcatReference = function (_CachedReference) {
+ _inherits$2(ConcatReference, _CachedReference);
+
+ function ConcatReference(parts) {
+ _classCallCheck$2(this, ConcatReference);
+
+ var _this = _possibleConstructorReturn$2(this, _CachedReference.call(this));
+
+ _this.parts = parts;
+ _this.tag = (0, _reference2.combineTagged)(parts);
+ return _this;
+ }
+
+ ConcatReference.prototype.compute = function compute() {
+ var parts = new Array();
+ for (var i = 0; i < this.parts.length; i++) {
+ var value = this.parts[i].value();
+ if (value !== null && value !== undefined) {
+ parts[i] = castToString(value);
+ }
+ }
+ if (parts.length > 0) {
+ return parts.join('');
+ }
+ return null;
+ };
+
+ return ConcatReference;
+ }(_reference2.CachedReference);
+ function castToString(value) {
+ if (typeof value.toString !== 'function') {
+ return '';
+ }
+ return String(value);
+ }
+
+ APPEND_OPCODES.add(1 /* Helper */, function (vm, _ref) {
+ var _helper = _ref.op1;
+
+ var stack = vm.stack;
+ var helper = vm.constants.getFunction(_helper);
+ var args = stack.pop();
+ var value = helper(vm, args);
+ args.clear();
+ vm.stack.push(value);
+ });
+ APPEND_OPCODES.add(2 /* Function */, function (vm, _ref2) {
+ var _function = _ref2.op1;
+
+ var func = vm.constants.getFunction(_function);
+ vm.stack.push(func(vm));
+ });
+ APPEND_OPCODES.add(5 /* GetVariable */, function (vm, _ref3) {
+ var symbol = _ref3.op1;
+
+ var expr = vm.referenceForSymbol(symbol);
+ vm.stack.push(expr);
+ });
+ APPEND_OPCODES.add(4 /* SetVariable */, function (vm, _ref4) {
+ var symbol = _ref4.op1;
+
+ var expr = vm.stack.pop();
+ vm.scope().bindSymbol(symbol, expr);
+ });
+ APPEND_OPCODES.add(70 /* ResolveMaybeLocal */, function (vm, _ref5) {
+ var _name = _ref5.op1;
+
+ var name = vm.constants.getString(_name);
+ var locals = vm.scope().getPartialMap();
+ var ref = locals[name];
+ if (ref === undefined) {
+ ref = vm.getSelf().get(name);
+ }
+ vm.stack.push(ref);
+ });
+ APPEND_OPCODES.add(19 /* RootScope */, function (vm, _ref6) {
+ var symbols = _ref6.op1,
+ bindCallerScope = _ref6.op2;
+
+ vm.pushRootScope(symbols, !!bindCallerScope);
+ });
+ APPEND_OPCODES.add(6 /* GetProperty */, function (vm, _ref7) {
+ var _key = _ref7.op1;
+
+ var key = vm.constants.getString(_key);
+ var expr = vm.stack.pop();
+ vm.stack.push(expr.get(key));
+ });
+ APPEND_OPCODES.add(7 /* PushBlock */, function (vm, _ref8) {
+ var _block = _ref8.op1;
+
+ var block = _block ? vm.constants.getBlock(_block) : null;
+ vm.stack.push(block);
+ });
+ APPEND_OPCODES.add(8 /* GetBlock */, function (vm, _ref9) {
+ var _block = _ref9.op1;
+
+ vm.stack.push(vm.scope().getBlock(_block));
+ });
+ APPEND_OPCODES.add(9 /* HasBlock */, function (vm, _ref10) {
+ var _block = _ref10.op1;
+
+ var hasBlock = !!vm.scope().getBlock(_block);
+ vm.stack.push(hasBlock ? TRUE_REFERENCE : FALSE_REFERENCE);
+ });
+ APPEND_OPCODES.add(10 /* HasBlockParams */, function (vm, _ref11) {
+ var _block = _ref11.op1;
+
+ var block = vm.scope().getBlock(_block);
+ var hasBlockParams = block && block.symbolTable.parameters.length;
+ vm.stack.push(hasBlockParams ? TRUE_REFERENCE : FALSE_REFERENCE);
+ });
+ APPEND_OPCODES.add(11 /* Concat */, function (vm, _ref12) {
+ var count = _ref12.op1;
+
+ var out = [];
+ for (var i = count; i > 0; i--) {
+ out.push(vm.stack.pop());
+ }
+ vm.stack.push(new ConcatReference(out.reverse()));
+ });
+
+ var _createClass = function () {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }return function (Constructor, protoProps, staticProps) {
+ if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;
+ };
+ }();
+
+ function _classCallCheck$4(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ var Arguments = function () {
+ function Arguments() {
+ _classCallCheck$4(this, Arguments);
+
+ this.stack = null;
+ this.positional = new PositionalArguments();
+ this.named = new NamedArguments();
+ }
+
+ Arguments.prototype.empty = function empty() {
+ this.setup(null, true);
+ return this;
+ };
+
+ Arguments.prototype.setup = function setup(stack, synthetic) {
+ this.stack = stack;
+ var names = stack.fromTop(0);
+ var namedCount = names.length;
+ var positionalCount = stack.fromTop(namedCount + 1);
+ var start = positionalCount + namedCount + 2;
+ var positional = this.positional;
+ positional.setup(stack, start, positionalCount);
+ var named = this.named;
+ named.setup(stack, namedCount, names, synthetic);
+ };
+
+ Arguments.prototype.at = function at(pos) {
+ return this.positional.at(pos);
+ };
+
+ Arguments.prototype.get = function get(name) {
+ return this.named.get(name);
+ };
+
+ Arguments.prototype.capture = function capture() {
+ return {
+ tag: this.tag,
+ length: this.length,
+ positional: this.positional.capture(),
+ named: this.named.capture()
+ };
+ };
+
+ Arguments.prototype.clear = function clear() {
+ var stack = this.stack,
+ length = this.length;
+
+ stack.pop(length + 2);
+ };
+
+ _createClass(Arguments, [{
+ key: 'tag',
+ get: function () {
+ return (0, _reference2.combineTagged)([this.positional, this.named]);
+ }
+ }, {
+ key: 'length',
+ get: function () {
+ return this.positional.length + this.named.length;
+ }
+ }]);
+
+ return Arguments;
+ }();
+
+ var PositionalArguments = function () {
+ function PositionalArguments() {
+ _classCallCheck$4(this, PositionalArguments);
+
+ this.length = 0;
+ this.stack = null;
+ this.start = 0;
+ this._tag = null;
+ this._references = null;
+ }
+
+ PositionalArguments.prototype.setup = function setup(stack, start, length) {
+ this.stack = stack;
+ this.start = start;
+ this.length = length;
+ this._tag = null;
+ this._references = null;
+ };
+
+ PositionalArguments.prototype.at = function at(position) {
+ var start = this.start,
+ length = this.length;
+
+ if (position < 0 || position >= length) {
+ return UNDEFINED_REFERENCE;
+ }
+ // stack: pos1, pos2, pos3, named1, named2
+ // start: 4 (top - 4)
+ //
+ // at(0) === pos1 === top - start
+ // at(1) === pos2 === top - (start - 1)
+ // at(2) === pos3 === top - (start - 2)
+ var fromTop = start - position - 1;
+ return this.stack.fromTop(fromTop);
+ };
+
+ PositionalArguments.prototype.capture = function capture() {
+ return new CapturedPositionalArguments(this.tag, this.references);
+ };
+
+ _createClass(PositionalArguments, [{
+ key: 'tag',
+ get: function () {
+ var tag = this._tag;
+ if (!tag) {
+ tag = this._tag = (0, _reference2.combineTagged)(this.references);
+ }
+ return tag;
+ }
+ }, {
+ key: 'references',
+ get: function () {
+ var references = this._references;
+ if (!references) {
+ var length = this.length;
+
+ references = this._references = new Array(length);
+ for (var i = 0; i < length; i++) {
+ references[i] = this.at(i);
+ }
+ }
+ return references;
+ }
+ }]);
+
+ return PositionalArguments;
+ }();
+
+ var CapturedPositionalArguments = function () {
+ function CapturedPositionalArguments(tag, references) {
+ var length = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : references.length;
+
+ _classCallCheck$4(this, CapturedPositionalArguments);
+
+ this.tag = tag;
+ this.references = references;
+ this.length = length;
+ }
+
+ CapturedPositionalArguments.prototype.at = function at(position) {
+ return this.references[position];
+ };
+
+ CapturedPositionalArguments.prototype.value = function value() {
+ return this.references.map(this.valueOf);
+ };
+
+ CapturedPositionalArguments.prototype.get = function get(name) {
+ var references = this.references,
+ length = this.length;
+
+ if (name === 'length') {
+ return PrimitiveReference.create(length);
+ } else {
+ var idx = parseInt(name, 10);
+ if (idx < 0 || idx >= length) {
+ return UNDEFINED_REFERENCE;
+ } else {
+ return references[idx];
+ }
+ }
+ };
+
+ CapturedPositionalArguments.prototype.valueOf = function valueOf(reference$$1) {
+ return reference$$1.value();
+ };
+
+ return CapturedPositionalArguments;
+ }();
+
+ var NamedArguments = function () {
+ function NamedArguments() {
+ _classCallCheck$4(this, NamedArguments);
+
+ this.length = 0;
+ this._tag = null;
+ this._references = null;
+ this._names = null;
+ this._realNames = _util.EMPTY_ARRAY;
+ }
+
+ NamedArguments.prototype.setup = function setup(stack, length, names, synthetic) {
+ this.stack = stack;
+ this.length = length;
+ this._tag = null;
+ this._references = null;
+ if (synthetic) {
+ this._names = names;
+ this._realNames = _util.EMPTY_ARRAY;
+ } else {
+ this._names = null;
+ this._realNames = names;
+ }
+ };
+
+ NamedArguments.prototype.has = function has(name) {
+ return this.names.indexOf(name) !== -1;
+ };
+
+ NamedArguments.prototype.get = function get(name) {
+ var names = this.names,
+ length = this.length;
+
+ var idx = names.indexOf(name);
+ if (idx === -1) {
+ return UNDEFINED_REFERENCE;
+ }
+ // stack: pos1, pos2, pos3, named1, named2
+ // start: 4 (top - 4)
+ // namedDict: { named1: 1, named2: 0 };
+ //
+ // get('named1') === named1 === top - (start - 1)
+ // get('named2') === named2 === top - start
+ var fromTop = length - idx;
+ return this.stack.fromTop(fromTop);
+ };
+
+ NamedArguments.prototype.capture = function capture() {
+ return new CapturedNamedArguments(this.tag, this.names, this.references);
+ };
+
+ NamedArguments.prototype.sliceName = function sliceName(name) {
+ return name.slice(1);
+ };
+
+ _createClass(NamedArguments, [{
+ key: 'tag',
+ get: function () {
+ return (0, _reference2.combineTagged)(this.references);
+ }
+ }, {
+ key: 'names',
+ get: function () {
+ var names = this._names;
+ if (!names) {
+ names = this._names = this._realNames.map(this.sliceName);
+ }
+ return names;
+ }
+ }, {
+ key: 'references',
+ get: function () {
+ var references = this._references;
+ if (!references) {
+ var names = this.names,
+ length = this.length;
+
+ references = this._references = [];
+ for (var i = 0; i < length; i++) {
+ references[i] = this.get(names[i]);
+ }
+ }
+ return references;
+ }
+ }]);
+
+ return NamedArguments;
+ }();
+
+ var CapturedNamedArguments = function () {
+ function CapturedNamedArguments(tag, names, references) {
+ _classCallCheck$4(this, CapturedNamedArguments);
+
+ this.tag = tag;
+ this.names = names;
+ this.references = references;
+ this.length = names.length;
+ this._map = null;
+ }
+
+ CapturedNamedArguments.prototype.has = function has(name) {
+ return this.names.indexOf(name) !== -1;
+ };
+
+ CapturedNamedArguments.prototype.get = function get(name) {
+ var names = this.names,
+ references = this.references;
+
+ var idx = names.indexOf(name);
+ if (idx === -1) {
+ return UNDEFINED_REFERENCE;
+ } else {
+ return references[idx];
+ }
+ };
+
+ CapturedNamedArguments.prototype.value = function value() {
+ var names = this.names,
+ references = this.references;
+
+ var out = (0, _util.dict)();
+ for (var i = 0; i < names.length; i++) {
+ var name = names[i];
+ out[name] = references[i].value();
+ }
+ return out;
+ };
+
+ _createClass(CapturedNamedArguments, [{
+ key: 'map',
+ get: function () {
+ var map$$1 = this._map;
+ if (!map$$1) {
+ var names = this.names,
+ references = this.references;
+
+ map$$1 = this._map = (0, _util.dict)();
+ for (var i = 0; i < names.length; i++) {
+ var name = names[i];
+ map$$1[name] = references[i];
+ }
+ }
+ return map$$1;
+ }
+ }]);
+
+ return CapturedNamedArguments;
+ }();
+
+ var ARGS = new Arguments();
+
+ function _defaults$5(obj, defaults) {
+ var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {
+ Object.defineProperty(obj, key, value);
+ }
+ }return obj;
+ }
+
+ function _classCallCheck$6(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ function _possibleConstructorReturn$5(self, call) {
+ if (!self) {
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ }return call && (typeof call === "object" || typeof call === "function") ? call : self;
+ }
+
+ function _inherits$5(subClass, superClass) {
+ if (typeof superClass !== "function" && superClass !== null) {
+ throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults$5(subClass, superClass);
+ }
+
+ APPEND_OPCODES.add(20 /* ChildScope */, function (vm) {
+ return vm.pushChildScope();
+ });
+ APPEND_OPCODES.add(21 /* PopScope */, function (vm) {
+ return vm.popScope();
+ });
+ APPEND_OPCODES.add(39 /* PushDynamicScope */, function (vm) {
+ return vm.pushDynamicScope();
+ });
+ APPEND_OPCODES.add(40 /* PopDynamicScope */, function (vm) {
+ return vm.popDynamicScope();
+ });
+ APPEND_OPCODES.add(12 /* Immediate */, function (vm, _ref) {
+ var number = _ref.op1;
+
+ vm.stack.push(number);
+ });
+ APPEND_OPCODES.add(13 /* Constant */, function (vm, _ref2) {
+ var other = _ref2.op1;
+
+ vm.stack.push(vm.constants.getOther(other));
+ });
+ APPEND_OPCODES.add(14 /* PrimitiveReference */, function (vm, _ref3) {
+ var primitive = _ref3.op1;
+
+ var stack = vm.stack;
+ var flag = (primitive & 3 << 30) >>> 30;
+ var value = primitive & ~(3 << 30);
+ switch (flag) {
+ case 0:
+ stack.push(PrimitiveReference.create(value));
+ break;
+ case 1:
+ stack.push(PrimitiveReference.create(vm.constants.getFloat(value)));
+ break;
+ case 2:
+ stack.push(PrimitiveReference.create(vm.constants.getString(value)));
+ break;
+ case 3:
+ switch (value) {
+ case 0:
+ stack.push(FALSE_REFERENCE);
+ break;
+ case 1:
+ stack.push(TRUE_REFERENCE);
+ break;
+ case 2:
+ stack.push(NULL_REFERENCE);
+ break;
+ case 3:
+ stack.push(UNDEFINED_REFERENCE);
+ break;
+ }
+ break;
+ }
+ });
+ APPEND_OPCODES.add(15 /* Dup */, function (vm, _ref4) {
+ var register = _ref4.op1,
+ offset = _ref4.op2;
+
+ var position = vm.fetchValue(register) - offset;
+ vm.stack.dup(position);
+ });
+ APPEND_OPCODES.add(16 /* Pop */, function (vm, _ref5) {
+ var count = _ref5.op1;
+ return vm.stack.pop(count);
+ });
+ APPEND_OPCODES.add(17 /* Load */, function (vm, _ref6) {
+ var register = _ref6.op1;
+ return vm.load(register);
+ });
+ APPEND_OPCODES.add(18 /* Fetch */, function (vm, _ref7) {
+ var register = _ref7.op1;
+ return vm.fetch(register);
+ });
+ APPEND_OPCODES.add(38 /* BindDynamicScope */, function (vm, _ref8) {
+ var _names = _ref8.op1;
+
+ var names = vm.constants.getArray(_names);
+ vm.bindDynamicScope(names);
+ });
+ APPEND_OPCODES.add(47 /* PushFrame */, function (vm) {
+ return vm.pushFrame();
+ });
+ APPEND_OPCODES.add(48 /* PopFrame */, function (vm) {
+ return vm.popFrame();
+ });
+ APPEND_OPCODES.add(49 /* Enter */, function (vm, _ref9) {
+ var args = _ref9.op1;
+ return vm.enter(args);
+ });
+ APPEND_OPCODES.add(50 /* Exit */, function (vm) {
+ return vm.exit();
+ });
+ APPEND_OPCODES.add(41 /* CompileDynamicBlock */, function (vm) {
+ var stack = vm.stack;
+ var block = stack.pop();
+ stack.push(block ? block.compileDynamic(vm.env) : null);
+ });
+ APPEND_OPCODES.add(42 /* InvokeStatic */, function (vm, _ref10) {
+ var _block = _ref10.op1;
+
+ var block = vm.constants.getBlock(_block);
+ var compiled = block.compileStatic(vm.env);
+ vm.call(compiled.handle);
+ });
+ APPEND_OPCODES.add(43 /* InvokeDynamic */, function (vm, _ref11) {
+ var _invoker = _ref11.op1;
+
+ var invoker = vm.constants.getOther(_invoker);
+ var block = vm.stack.pop();
+ invoker.invoke(vm, block);
+ });
+ APPEND_OPCODES.add(44 /* Jump */, function (vm, _ref12) {
+ var target = _ref12.op1;
+ return vm.goto(target);
+ });
+ APPEND_OPCODES.add(45 /* JumpIf */, function (vm, _ref13) {
+ var target = _ref13.op1;
+
+ var reference$$1 = vm.stack.pop();
+ if ((0, _reference2.isConst)(reference$$1)) {
+ if (reference$$1.value()) {
+ vm.goto(target);
+ }
+ } else {
+ var cache = new _reference2.ReferenceCache(reference$$1);
+ if (cache.peek()) {
+ vm.goto(target);
+ }
+ vm.updateWith(new Assert(cache));
+ }
+ });
+ APPEND_OPCODES.add(46 /* JumpUnless */, function (vm, _ref14) {
+ var target = _ref14.op1;
+
+ var reference$$1 = vm.stack.pop();
+ if ((0, _reference2.isConst)(reference$$1)) {
+ if (!reference$$1.value()) {
+ vm.goto(target);
+ }
+ } else {
+ var cache = new _reference2.ReferenceCache(reference$$1);
+ if (!cache.peek()) {
+ vm.goto(target);
+ }
+ vm.updateWith(new Assert(cache));
+ }
+ });
+ APPEND_OPCODES.add(22 /* Return */, function (vm) {
+ return vm.return();
+ });
+ APPEND_OPCODES.add(23 /* ReturnTo */, function (vm, _ref15) {
+ var relative = _ref15.op1;
+
+ vm.returnTo(relative);
+ });
+ var ConstTest = function (ref, _env) {
+ return new _reference2.ConstReference(!!ref.value());
+ };
+ var SimpleTest = function (ref, _env) {
+ return ref;
+ };
+ var EnvironmentTest = function (ref, env) {
+ return env.toConditionalReference(ref);
+ };
+ APPEND_OPCODES.add(51 /* Test */, function (vm, _ref16) {
+ var _func = _ref16.op1;
+
+ var stack = vm.stack;
+ var operand = stack.pop();
+ var func = vm.constants.getFunction(_func);
+ stack.push(func(operand, vm.env));
+ });
+ var Assert = function (_UpdatingOpcode) {
+ _inherits$5(Assert, _UpdatingOpcode);
+
+ function Assert(cache) {
+ _classCallCheck$6(this, Assert);
+
+ var _this = _possibleConstructorReturn$5(this, _UpdatingOpcode.call(this));
+
+ _this.type = 'assert';
+ _this.tag = cache.tag;
+ _this.cache = cache;
+ return _this;
+ }
+
+ Assert.prototype.evaluate = function evaluate(vm) {
+ var cache = this.cache;
+
+ if ((0, _reference2.isModified)(cache.revalidate())) {
+ vm.throw();
+ }
+ };
+
+ Assert.prototype.toJSON = function toJSON() {
+ var type = this.type,
+ _guid = this._guid,
+ cache = this.cache;
+
+ var expected = void 0;
+ try {
+ expected = JSON.stringify(cache.peek());
+ } catch (e) {
+ expected = String(cache.peek());
+ }
+ return {
+ args: [],
+ details: { expected: expected },
+ guid: _guid,
+ type: type
+ };
+ };
+
+ return Assert;
+ }(UpdatingOpcode);
+ var JumpIfNotModifiedOpcode = function (_UpdatingOpcode2) {
+ _inherits$5(JumpIfNotModifiedOpcode, _UpdatingOpcode2);
+
+ function JumpIfNotModifiedOpcode(tag, target) {
+ _classCallCheck$6(this, JumpIfNotModifiedOpcode);
+
+ var _this2 = _possibleConstructorReturn$5(this, _UpdatingOpcode2.call(this));
+
+ _this2.target = target;
+ _this2.type = 'jump-if-not-modified';
+ _this2.tag = tag;
+ _this2.lastRevision = tag.value();
+ return _this2;
+ }
+
+ JumpIfNotModifiedOpcode.prototype.evaluate = function evaluate(vm) {
+ var tag = this.tag,
+ target = this.target,
+ lastRevision = this.lastRevision;
+
+ if (!vm.alwaysRevalidate && tag.validate(lastRevision)) {
+ vm.goto(target);
+ }
+ };
+
+ JumpIfNotModifiedOpcode.prototype.didModify = function didModify() {
+ this.lastRevision = this.tag.value();
+ };
+
+ JumpIfNotModifiedOpcode.prototype.toJSON = function toJSON() {
+ return {
+ args: [JSON.stringify(this.target.inspect())],
+ guid: this._guid,
+ type: this.type
+ };
+ };
+
+ return JumpIfNotModifiedOpcode;
+ }(UpdatingOpcode);
+ var DidModifyOpcode = function (_UpdatingOpcode3) {
+ _inherits$5(DidModifyOpcode, _UpdatingOpcode3);
+
+ function DidModifyOpcode(target) {
+ _classCallCheck$6(this, DidModifyOpcode);
+
+ var _this3 = _possibleConstructorReturn$5(this, _UpdatingOpcode3.call(this));
+
+ _this3.target = target;
+ _this3.type = 'did-modify';
+ _this3.tag = _reference2.CONSTANT_TAG;
+ return _this3;
+ }
+
+ DidModifyOpcode.prototype.evaluate = function evaluate() {
+ this.target.didModify();
+ };
+
+ return DidModifyOpcode;
+ }(UpdatingOpcode);
+ var LabelOpcode = function () {
+ function LabelOpcode(label) {
+ _classCallCheck$6(this, LabelOpcode);
+
+ this.tag = _reference2.CONSTANT_TAG;
+ this.type = 'label';
+ this.label = null;
+ this.prev = null;
+ this.next = null;
+ (0, _util.initializeGuid)(this);
+ this.label = label;
+ }
+
+ LabelOpcode.prototype.evaluate = function evaluate() {};
+
+ LabelOpcode.prototype.inspect = function inspect$$1() {
+ return this.label + ' [' + this._guid + ']';
+ };
+
+ LabelOpcode.prototype.toJSON = function toJSON() {
+ return {
+ args: [JSON.stringify(this.inspect())],
+ guid: this._guid,
+ type: this.type
+ };
+ };
+
+ return LabelOpcode;
+ }();
+
+ function _defaults$4(obj, defaults) {
+ var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {
+ Object.defineProperty(obj, key, value);
+ }
+ }return obj;
+ }
+
+ function _possibleConstructorReturn$4(self, call) {
+ if (!self) {
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ }return call && (typeof call === "object" || typeof call === "function") ? call : self;
+ }
+
+ function _inherits$4(subClass, superClass) {
+ if (typeof superClass !== "function" && superClass !== null) {
+ throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults$4(subClass, superClass);
+ }
+
+ function _classCallCheck$5(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ APPEND_OPCODES.add(24 /* Text */, function (vm, _ref) {
+ var text = _ref.op1;
+
+ vm.elements().appendText(vm.constants.getString(text));
+ });
+ APPEND_OPCODES.add(25 /* Comment */, function (vm, _ref2) {
+ var text = _ref2.op1;
+
+ vm.elements().appendComment(vm.constants.getString(text));
+ });
+ APPEND_OPCODES.add(27 /* OpenElement */, function (vm, _ref3) {
+ var tag = _ref3.op1;
+
+ vm.elements().openElement(vm.constants.getString(tag));
+ });
+ APPEND_OPCODES.add(28 /* OpenElementWithOperations */, function (vm, _ref4) {
+ var tag = _ref4.op1;
+
+ var tagName = vm.constants.getString(tag);
+ var operations = vm.stack.pop();
+ vm.elements().openElement(tagName, operations);
+ });
+ APPEND_OPCODES.add(29 /* OpenDynamicElement */, function (vm) {
+ var operations = vm.stack.pop();
+ var tagName = vm.stack.pop().value();
+ vm.elements().openElement(tagName, operations);
+ });
+ APPEND_OPCODES.add(36 /* PushRemoteElement */, function (vm) {
+ var elementRef = vm.stack.pop();
+ var nextSiblingRef = vm.stack.pop();
+ var element = void 0;
+ var nextSibling = void 0;
+ if ((0, _reference2.isConst)(elementRef)) {
+ element = elementRef.value();
+ } else {
+ var cache = new _reference2.ReferenceCache(elementRef);
+ element = cache.peek();
+ vm.updateWith(new Assert(cache));
+ }
+ if ((0, _reference2.isConst)(nextSiblingRef)) {
+ nextSibling = nextSiblingRef.value();
+ } else {
+ var _cache = new _reference2.ReferenceCache(nextSiblingRef);
+ nextSibling = _cache.peek();
+ vm.updateWith(new Assert(_cache));
+ }
+ vm.elements().pushRemoteElement(element, nextSibling);
+ });
+ APPEND_OPCODES.add(37 /* PopRemoteElement */, function (vm) {
+ return vm.elements().popRemoteElement();
+ });
+
+ var ClassList = function () {
+ function ClassList() {
+ _classCallCheck$5(this, ClassList);
+
+ this.list = null;
+ this.isConst = true;
+ }
+
+ ClassList.prototype.append = function append(reference$$1) {
+ var list = this.list,
+ isConst$$1 = this.isConst;
+
+ if (list === null) list = this.list = [];
+ list.push(reference$$1);
+ this.isConst = isConst$$1 && (0, _reference2.isConst)(reference$$1);
+ };
+
+ ClassList.prototype.toReference = function toReference() {
+ var list = this.list,
+ isConst$$1 = this.isConst;
+
+ if (!list) return NULL_REFERENCE;
+ if (isConst$$1) return PrimitiveReference.create(toClassName(list));
+ return new ClassListReference(list);
+ };
+
+ return ClassList;
+ }();
+
+ var ClassListReference = function (_CachedReference) {
+ _inherits$4(ClassListReference, _CachedReference);
+
+ function ClassListReference(list) {
+ _classCallCheck$5(this, ClassListReference);
+
+ var _this = _possibleConstructorReturn$4(this, _CachedReference.call(this));
+
+ _this.list = [];
+ _this.tag = (0, _reference2.combineTagged)(list);
+ _this.list = list;
+ return _this;
+ }
+
+ ClassListReference.prototype.compute = function compute() {
+ return toClassName(this.list);
+ };
+
+ return ClassListReference;
+ }(_reference2.CachedReference);
+
+ function toClassName(list) {
+ var ret = [];
+ for (var i = 0; i < list.length; i++) {
+ var value = list[i].value();
+ if (value !== false && value !== null && value !== undefined) ret.push(value);
+ }
+ return ret.length === 0 ? null : ret.join(' ');
+ }
+ var SimpleElementOperations = function () {
+ function SimpleElementOperations(env) {
+ _classCallCheck$5(this, SimpleElementOperations);
+
+ this.env = env;
+ this.opcodes = null;
+ this.classList = null;
+ }
+
+ SimpleElementOperations.prototype.addStaticAttribute = function addStaticAttribute(element, name, value) {
+ if (name === 'class') {
+ this.addClass(PrimitiveReference.create(value));
+ } else {
+ this.env.getAppendOperations().setAttribute(element, name, value);
+ }
+ };
+
+ SimpleElementOperations.prototype.addStaticAttributeNS = function addStaticAttributeNS(element, namespace, name, value) {
+ this.env.getAppendOperations().setAttribute(element, name, value, namespace);
+ };
+
+ SimpleElementOperations.prototype.addDynamicAttribute = function addDynamicAttribute(element, name, reference$$1, isTrusting) {
+ if (name === 'class') {
+ this.addClass(reference$$1);
+ } else {
+ var attributeManager = this.env.attributeFor(element, name, isTrusting);
+ var attribute = new DynamicAttribute(element, attributeManager, name, reference$$1);
+ this.addAttribute(attribute);
+ }
+ };
+
+ SimpleElementOperations.prototype.addDynamicAttributeNS = function addDynamicAttributeNS(element, namespace, name, reference$$1, isTrusting) {
+ var attributeManager = this.env.attributeFor(element, name, isTrusting, namespace);
+ var nsAttribute = new DynamicAttribute(element, attributeManager, name, reference$$1, namespace);
+ this.addAttribute(nsAttribute);
+ };
+
+ SimpleElementOperations.prototype.flush = function flush(element, vm) {
+ var env = vm.env;
+ var opcodes = this.opcodes,
+ classList = this.classList;
+
+ for (var i = 0; opcodes && i < opcodes.length; i++) {
+ vm.updateWith(opcodes[i]);
+ }
+ if (classList) {
+ var attributeManager = env.attributeFor(element, 'class', false);
+ var attribute = new DynamicAttribute(element, attributeManager, 'class', classList.toReference());
+ var opcode = attribute.flush(env);
+ if (opcode) {
+ vm.updateWith(opcode);
+ }
+ }
+ this.opcodes = null;
+ this.classList = null;
+ };
+
+ SimpleElementOperations.prototype.addClass = function addClass(reference$$1) {
+ var classList = this.classList;
+
+ if (!classList) {
+ classList = this.classList = new ClassList();
+ }
+ classList.append(reference$$1);
+ };
+
+ SimpleElementOperations.prototype.addAttribute = function addAttribute(attribute) {
+ var opcode = attribute.flush(this.env);
+ if (opcode) {
+ var opcodes = this.opcodes;
+
+ if (!opcodes) {
+ opcodes = this.opcodes = [];
+ }
+ opcodes.push(opcode);
+ }
+ };
+
+ return SimpleElementOperations;
+ }();
+ var ComponentElementOperations = function () {
+ function ComponentElementOperations(env) {
+ _classCallCheck$5(this, ComponentElementOperations);
+
+ this.env = env;
+ this.attributeNames = null;
+ this.attributes = null;
+ this.classList = null;
+ }
+
+ ComponentElementOperations.prototype.addStaticAttribute = function addStaticAttribute(element, name, value) {
+ if (name === 'class') {
+ this.addClass(PrimitiveReference.create(value));
+ } else if (this.shouldAddAttribute(name)) {
+ this.addAttribute(name, new StaticAttribute(element, name, value));
+ }
+ };
+
+ ComponentElementOperations.prototype.addStaticAttributeNS = function addStaticAttributeNS(element, namespace, name, value) {
+ if (this.shouldAddAttribute(name)) {
+ this.addAttribute(name, new StaticAttribute(element, name, value, namespace));
+ }
+ };
+
+ ComponentElementOperations.prototype.addDynamicAttribute = function addDynamicAttribute(element, name, reference$$1, isTrusting) {
+ if (name === 'class') {
+ this.addClass(reference$$1);
+ } else if (this.shouldAddAttribute(name)) {
+ var attributeManager = this.env.attributeFor(element, name, isTrusting);
+ var attribute = new DynamicAttribute(element, attributeManager, name, reference$$1);
+ this.addAttribute(name, attribute);
+ }
+ };
+
+ ComponentElementOperations.prototype.addDynamicAttributeNS = function addDynamicAttributeNS(element, namespace, name, reference$$1, isTrusting) {
+ if (this.shouldAddAttribute(name)) {
+ var attributeManager = this.env.attributeFor(element, name, isTrusting, namespace);
+ var nsAttribute = new DynamicAttribute(element, attributeManager, name, reference$$1, namespace);
+ this.addAttribute(name, nsAttribute);
+ }
+ };
+
+ ComponentElementOperations.prototype.flush = function flush(element, vm) {
+ var env = this.env;
+ var attributes = this.attributes,
+ classList = this.classList;
+
+ for (var i = 0; attributes && i < attributes.length; i++) {
+ var opcode = attributes[i].flush(env);
+ if (opcode) {
+ vm.updateWith(opcode);
+ }
+ }
+ if (classList) {
+ var attributeManager = env.attributeFor(element, 'class', false);
+ var attribute = new DynamicAttribute(element, attributeManager, 'class', classList.toReference());
+ var _opcode = attribute.flush(env);
+ if (_opcode) {
+ vm.updateWith(_opcode);
+ }
+ }
+ };
+
+ ComponentElementOperations.prototype.shouldAddAttribute = function shouldAddAttribute(name) {
+ return !this.attributeNames || this.attributeNames.indexOf(name) === -1;
+ };
+
+ ComponentElementOperations.prototype.addClass = function addClass(reference$$1) {
+ var classList = this.classList;
+
+ if (!classList) {
+ classList = this.classList = new ClassList();
+ }
+ classList.append(reference$$1);
+ };
+
+ ComponentElementOperations.prototype.addAttribute = function addAttribute(name, attribute) {
+ var attributeNames = this.attributeNames,
+ attributes = this.attributes;
+
+ if (!attributeNames) {
+ attributeNames = this.attributeNames = [];
+ attributes = this.attributes = [];
+ }
+ attributeNames.push(name);
+ attributes.push(attribute);
+ };
+
+ return ComponentElementOperations;
+ }();
+ APPEND_OPCODES.add(33 /* FlushElement */, function (vm) {
+ var stack = vm.elements();
+ var action = 'FlushElementOpcode#evaluate';
+ stack.expectOperations(action).flush(stack.expectConstructing(action), vm);
+ stack.flushElement();
+ });
+ APPEND_OPCODES.add(34 /* CloseElement */, function (vm) {
+ return vm.elements().closeElement();
+ });
+ APPEND_OPCODES.add(30 /* StaticAttr */, function (vm, _ref5) {
+ var _name = _ref5.op1,
+ _value = _ref5.op2,
+ _namespace = _ref5.op3;
+
+ var name = vm.constants.getString(_name);
+ var value = vm.constants.getString(_value);
+ if (_namespace) {
+ var namespace = vm.constants.getString(_namespace);
+ vm.elements().setStaticAttributeNS(namespace, name, value);
+ } else {
+ vm.elements().setStaticAttribute(name, value);
+ }
+ });
+ APPEND_OPCODES.add(35 /* Modifier */, function (vm, _ref6) {
+ var _manager = _ref6.op1;
+
+ var manager = vm.constants.getOther(_manager);
+ var stack = vm.stack;
+ var args = stack.pop();
+ var tag = args.tag;
+
+ var _vm$elements = vm.elements(),
+ element = _vm$elements.constructing,
+ updateOperations = _vm$elements.updateOperations;
+
+ var dynamicScope = vm.dynamicScope();
+ var modifier = manager.create(element, args, dynamicScope, updateOperations);
+ args.clear();
+ vm.env.scheduleInstallModifier(modifier, manager);
+ var destructor = manager.getDestructor(modifier);
+ if (destructor) {
+ vm.newDestroyable(destructor);
+ }
+ vm.updateWith(new UpdateModifierOpcode(tag, manager, modifier));
+ });
+ var UpdateModifierOpcode = function (_UpdatingOpcode) {
+ _inherits$4(UpdateModifierOpcode, _UpdatingOpcode);
+
+ function UpdateModifierOpcode(tag, manager, modifier) {
+ _classCallCheck$5(this, UpdateModifierOpcode);
+
+ var _this2 = _possibleConstructorReturn$4(this, _UpdatingOpcode.call(this));
+
+ _this2.tag = tag;
+ _this2.manager = manager;
+ _this2.modifier = modifier;
+ _this2.type = 'update-modifier';
+ _this2.lastUpdated = tag.value();
+ return _this2;
+ }
+
+ UpdateModifierOpcode.prototype.evaluate = function evaluate(vm) {
+ var manager = this.manager,
+ modifier = this.modifier,
+ tag = this.tag,
+ lastUpdated = this.lastUpdated;
+
+ if (!tag.validate(lastUpdated)) {
+ vm.env.scheduleUpdateModifier(modifier, manager);
+ this.lastUpdated = tag.value();
+ }
+ };
+
+ UpdateModifierOpcode.prototype.toJSON = function toJSON() {
+ return {
+ guid: this._guid,
+ type: this.type
+ };
+ };
+
+ return UpdateModifierOpcode;
+ }(UpdatingOpcode);
+ var StaticAttribute = function () {
+ function StaticAttribute(element, name, value, namespace) {
+ _classCallCheck$5(this, StaticAttribute);
+
+ this.element = element;
+ this.name = name;
+ this.value = value;
+ this.namespace = namespace;
+ }
+
+ StaticAttribute.prototype.flush = function flush(env) {
+ env.getAppendOperations().setAttribute(this.element, this.name, this.value, this.namespace);
+ return null;
+ };
+
+ return StaticAttribute;
+ }();
+ var DynamicAttribute = function () {
+ function DynamicAttribute(element, attributeManager, name, reference$$1, namespace) {
+ _classCallCheck$5(this, DynamicAttribute);
+
+ this.element = element;
+ this.attributeManager = attributeManager;
+ this.name = name;
+ this.reference = reference$$1;
+ this.namespace = namespace;
+ this.cache = null;
+ this.tag = reference$$1.tag;
+ }
+
+ DynamicAttribute.prototype.patch = function patch(env) {
+ var element = this.element,
+ cache = this.cache;
+
+ var value = cache.revalidate();
+ if ((0, _reference2.isModified)(value)) {
+ this.attributeManager.updateAttribute(env, element, value, this.namespace);
+ }
+ };
+
+ DynamicAttribute.prototype.flush = function flush(env) {
+ var reference$$1 = this.reference,
+ element = this.element;
+
+ if ((0, _reference2.isConst)(reference$$1)) {
+ var value = reference$$1.value();
+ this.attributeManager.setAttribute(env, element, value, this.namespace);
+ return null;
+ } else {
+ var cache = this.cache = new _reference2.ReferenceCache(reference$$1);
+ var _value2 = cache.peek();
+ this.attributeManager.setAttribute(env, element, _value2, this.namespace);
+ return new PatchElementOpcode(this);
+ }
+ };
+
+ DynamicAttribute.prototype.toJSON = function toJSON() {
+ var element = this.element,
+ namespace = this.namespace,
+ name = this.name,
+ cache = this.cache;
+
+ var formattedElement = formatElement(element);
+ var lastValue = cache.peek();
+ if (namespace) {
+ return {
+ element: formattedElement,
+ lastValue: lastValue,
+ name: name,
+ namespace: namespace,
+ type: 'attribute'
+ };
+ }
+ return {
+ element: formattedElement,
+ lastValue: lastValue,
+ name: name,
+ namespace: namespace === undefined ? null : namespace,
+ type: 'attribute'
+ };
+ };
+
+ return DynamicAttribute;
+ }();
+ function formatElement(element) {
+ return JSON.stringify('<' + element.tagName.toLowerCase() + ' />');
+ }
+ APPEND_OPCODES.add(32 /* DynamicAttrNS */, function (vm, _ref7) {
+ var _name = _ref7.op1,
+ _namespace = _ref7.op2,
+ trusting = _ref7.op3;
+
+ var name = vm.constants.getString(_name);
+ var namespace = vm.constants.getString(_namespace);
+ var reference$$1 = vm.stack.pop();
+ vm.elements().setDynamicAttributeNS(namespace, name, reference$$1, !!trusting);
+ });
+ APPEND_OPCODES.add(31 /* DynamicAttr */, function (vm, _ref8) {
+ var _name = _ref8.op1,
+ trusting = _ref8.op2;
+
+ var name = vm.constants.getString(_name);
+ var reference$$1 = vm.stack.pop();
+ vm.elements().setDynamicAttribute(name, reference$$1, !!trusting);
+ });
+ var PatchElementOpcode = function (_UpdatingOpcode2) {
+ _inherits$4(PatchElementOpcode, _UpdatingOpcode2);
+
+ function PatchElementOpcode(operation) {
+ _classCallCheck$5(this, PatchElementOpcode);
+
+ var _this3 = _possibleConstructorReturn$4(this, _UpdatingOpcode2.call(this));
+
+ _this3.type = 'patch-element';
+ _this3.tag = operation.tag;
+ _this3.operation = operation;
+ return _this3;
+ }
+
+ PatchElementOpcode.prototype.evaluate = function evaluate(vm) {
+ this.operation.patch(vm.env);
+ };
+
+ PatchElementOpcode.prototype.toJSON = function toJSON() {
+ var _guid = this._guid,
+ type = this.type,
+ operation = this.operation;
+
+ return {
+ details: operation.toJSON(),
+ guid: _guid,
+ type: type
+ };
+ };
+
+ return PatchElementOpcode;
+ }(UpdatingOpcode);
+
+ function _defaults$3(obj, defaults) {
+ var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {
+ Object.defineProperty(obj, key, value);
+ }
+ }return obj;
+ }
+
+ function _classCallCheck$3(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ function _possibleConstructorReturn$3(self, call) {
+ if (!self) {
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ }return call && (typeof call === "object" || typeof call === "function") ? call : self;
+ }
+
+ function _inherits$3(subClass, superClass) {
+ if (typeof superClass !== "function" && superClass !== null) {
+ throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults$3(subClass, superClass);
+ }
+
+ APPEND_OPCODES.add(56 /* PushComponentManager */, function (vm, _ref) {
+ var _definition = _ref.op1;
+
+ var definition = vm.constants.getOther(_definition);
+ var stack = vm.stack;
+ stack.push({ definition: definition, manager: definition.manager, component: null });
+ });
+ APPEND_OPCODES.add(57 /* PushDynamicComponentManager */, function (vm) {
+ var stack = vm.stack;
+ var reference$$1 = stack.pop();
+ var cache = (0, _reference2.isConst)(reference$$1) ? undefined : new _reference2.ReferenceCache(reference$$1);
+ var definition = cache ? cache.peek() : reference$$1.value();
+ stack.push({ definition: definition, manager: definition.manager, component: null });
+ if (cache) {
+ vm.updateWith(new Assert(cache));
+ }
+ });
+ APPEND_OPCODES.add(58 /* PushArgs */, function (vm, _ref2) {
+ var synthetic = _ref2.op1;
+
+ var stack = vm.stack;
+ ARGS.setup(stack, !!synthetic);
+ stack.push(ARGS);
+ });
+ APPEND_OPCODES.add(59 /* PrepareArgs */, function (vm, _ref3) {
+ var _state = _ref3.op1;
+
+ var stack = vm.stack;
+
+ var _vm$fetchValue = vm.fetchValue(_state),
+ definition = _vm$fetchValue.definition,
+ manager = _vm$fetchValue.manager;
+
+ var args = stack.pop();
+ var preparedArgs = manager.prepareArgs(definition, args);
+ if (preparedArgs) {
+ args.clear();
+ var positional = preparedArgs.positional,
+ named = preparedArgs.named;
+
+ var positionalCount = positional.length;
+ for (var i = 0; i < positionalCount; i++) {
+ stack.push(positional[i]);
+ }
+ stack.push(positionalCount);
+ var names = Object.keys(named);
+ var namedCount = names.length;
+ var atNames = [];
+ for (var _i = 0; _i < namedCount; _i++) {
+ var value = named[names[_i]];
+ var atName = '@' + names[_i];
+ stack.push(value);
+ atNames.push(atName);
+ }
+ stack.push(atNames);
+ args.setup(stack, false);
+ }
+ stack.push(args);
+ });
+ APPEND_OPCODES.add(60 /* CreateComponent */, function (vm, _ref4) {
+ var _vm$fetchValue2;
+
+ var flags = _ref4.op1,
+ _state = _ref4.op2;
+
+ var definition = void 0;
+ var manager = void 0;
+ var args = vm.stack.pop();
+ var dynamicScope = vm.dynamicScope();
+ var state = (_vm$fetchValue2 = vm.fetchValue(_state), definition = _vm$fetchValue2.definition, manager = _vm$fetchValue2.manager, _vm$fetchValue2);
+ var hasDefaultBlock = flags & 1;
+ var component = manager.create(vm.env, definition, args, dynamicScope, vm.getSelf(), !!hasDefaultBlock);
+ state.component = component;
+ vm.updateWith(new UpdateComponentOpcode(args.tag, definition.name, component, manager, dynamicScope));
+ });
+ APPEND_OPCODES.add(61 /* RegisterComponentDestructor */, function (vm, _ref5) {
+ var _state = _ref5.op1;
+
+ var _vm$fetchValue3 = vm.fetchValue(_state),
+ manager = _vm$fetchValue3.manager,
+ component = _vm$fetchValue3.component;
+
+ var destructor = manager.getDestructor(component);
+ if (destructor) vm.newDestroyable(destructor);
+ });
+ APPEND_OPCODES.add(65 /* BeginComponentTransaction */, function (vm) {
+ vm.beginCacheGroup();
+ vm.elements().pushSimpleBlock();
+ });
+ APPEND_OPCODES.add(62 /* PushComponentOperations */, function (vm) {
+ vm.stack.push(new ComponentElementOperations(vm.env));
+ });
+ APPEND_OPCODES.add(67 /* DidCreateElement */, function (vm, _ref6) {
+ var _state = _ref6.op1;
+
+ var _vm$fetchValue4 = vm.fetchValue(_state),
+ manager = _vm$fetchValue4.manager,
+ component = _vm$fetchValue4.component;
+
+ var action = 'DidCreateElementOpcode#evaluate';
+ manager.didCreateElement(component, vm.elements().expectConstructing(action), vm.elements().expectOperations(action));
+ });
+ APPEND_OPCODES.add(63 /* GetComponentSelf */, function (vm, _ref7) {
+ var _state = _ref7.op1;
+
+ var state = vm.fetchValue(_state);
+ vm.stack.push(state.manager.getSelf(state.component));
+ });
+ APPEND_OPCODES.add(64 /* GetComponentLayout */, function (vm, _ref8) {
+ var _state = _ref8.op1;
+
+ var _vm$fetchValue5 = vm.fetchValue(_state),
+ manager = _vm$fetchValue5.manager,
+ definition = _vm$fetchValue5.definition,
+ component = _vm$fetchValue5.component;
+
+ vm.stack.push(manager.layoutFor(definition, component, vm.env));
+ });
+ APPEND_OPCODES.add(68 /* DidRenderLayout */, function (vm, _ref9) {
+ var _state = _ref9.op1;
+
+ var _vm$fetchValue6 = vm.fetchValue(_state),
+ manager = _vm$fetchValue6.manager,
+ component = _vm$fetchValue6.component;
+
+ var bounds = vm.elements().popBlock();
+ manager.didRenderLayout(component, bounds);
+ vm.env.didCreate(component, manager);
+ vm.updateWith(new DidUpdateLayoutOpcode(manager, component, bounds));
+ });
+ APPEND_OPCODES.add(66 /* CommitComponentTransaction */, function (vm) {
+ return vm.commitCacheGroup();
+ });
+ var UpdateComponentOpcode = function (_UpdatingOpcode) {
+ _inherits$3(UpdateComponentOpcode, _UpdatingOpcode);
+
+ function UpdateComponentOpcode(tag, name, component, manager, dynamicScope) {
+ _classCallCheck$3(this, UpdateComponentOpcode);
+
+ var _this = _possibleConstructorReturn$3(this, _UpdatingOpcode.call(this));
+
+ _this.name = name;
+ _this.component = component;
+ _this.manager = manager;
+ _this.dynamicScope = dynamicScope;
+ _this.type = 'update-component';
+ var componentTag = manager.getTag(component);
+ if (componentTag) {
+ _this.tag = (0, _reference2.combine)([tag, componentTag]);
+ } else {
+ _this.tag = tag;
+ }
+ return _this;
+ }
+
+ UpdateComponentOpcode.prototype.evaluate = function evaluate(_vm) {
+ var component = this.component,
+ manager = this.manager,
+ dynamicScope = this.dynamicScope;
+
+ manager.update(component, dynamicScope);
+ };
+
+ UpdateComponentOpcode.prototype.toJSON = function toJSON() {
+ return {
+ args: [JSON.stringify(this.name)],
+ guid: this._guid,
+ type: this.type
+ };
+ };
+
+ return UpdateComponentOpcode;
+ }(UpdatingOpcode);
+ var DidUpdateLayoutOpcode = function (_UpdatingOpcode2) {
+ _inherits$3(DidUpdateLayoutOpcode, _UpdatingOpcode2);
+
+ function DidUpdateLayoutOpcode(manager, component, bounds) {
+ _classCallCheck$3(this, DidUpdateLayoutOpcode);
+
+ var _this2 = _possibleConstructorReturn$3(this, _UpdatingOpcode2.call(this));
+
+ _this2.manager = manager;
+ _this2.component = component;
+ _this2.bounds = bounds;
+ _this2.type = 'did-update-layout';
+ _this2.tag = _reference2.CONSTANT_TAG;
+ return _this2;
+ }
+
+ DidUpdateLayoutOpcode.prototype.evaluate = function evaluate(vm) {
+ var manager = this.manager,
+ component = this.component,
+ bounds = this.bounds;
+
+ manager.didUpdateLayout(component, bounds);
+ vm.env.didUpdate(component, manager);
+ };
+
+ return DidUpdateLayoutOpcode;
+ }(UpdatingOpcode);
+
+ function _classCallCheck$8(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ var Cursor = function Cursor(element, nextSibling) {
+ _classCallCheck$8(this, Cursor);
+
+ this.element = element;
+ this.nextSibling = nextSibling;
+ };
+
+ var ConcreteBounds = function () {
+ function ConcreteBounds(parentNode, first, last) {
+ _classCallCheck$8(this, ConcreteBounds);
+
+ this.parentNode = parentNode;
+ this.first = first;
+ this.last = last;
+ }
+
+ ConcreteBounds.prototype.parentElement = function parentElement() {
+ return this.parentNode;
+ };
+
+ ConcreteBounds.prototype.firstNode = function firstNode() {
+ return this.first;
+ };
+
+ ConcreteBounds.prototype.lastNode = function lastNode() {
+ return this.last;
+ };
+
+ return ConcreteBounds;
+ }();
+ var SingleNodeBounds = function () {
+ function SingleNodeBounds(parentNode, node) {
+ _classCallCheck$8(this, SingleNodeBounds);
+
+ this.parentNode = parentNode;
+ this.node = node;
+ }
+
+ SingleNodeBounds.prototype.parentElement = function parentElement() {
+ return this.parentNode;
+ };
+
+ SingleNodeBounds.prototype.firstNode = function firstNode() {
+ return this.node;
+ };
+
+ SingleNodeBounds.prototype.lastNode = function lastNode() {
+ return this.node;
+ };
+
+ return SingleNodeBounds;
+ }();
+
+ function single(parent, node) {
+ return new SingleNodeBounds(parent, node);
+ }
+ function move(bounds, reference$$1) {
+ var parent = bounds.parentElement();
+ var first = bounds.firstNode();
+ var last = bounds.lastNode();
+ var node = first;
+ while (node) {
+ var next = node.nextSibling;
+ parent.insertBefore(node, reference$$1);
+ if (node === last) return next;
+ node = next;
+ }
+ return null;
+ }
+ function clear(bounds) {
+ var parent = bounds.parentElement();
+ var first = bounds.firstNode();
+ var last = bounds.lastNode();
+ var node = first;
+ while (node) {
+ var next = node.nextSibling;
+ parent.removeChild(node);
+ if (node === last) return next;
+ node = next;
+ }
+ return null;
+ }
+
+ function _defaults$7(obj, defaults) {
+ var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {
+ Object.defineProperty(obj, key, value);
+ }
+ }return obj;
+ }
+
+ function _possibleConstructorReturn$7(self, call) {
+ if (!self) {
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ }return call && (typeof call === "object" || typeof call === "function") ? call : self;
+ }
+
+ function _inherits$7(subClass, superClass) {
+ if (typeof superClass !== "function" && superClass !== null) {
+ throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults$7(subClass, superClass);
+ }
+
+ function _classCallCheck$9(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ var First = function () {
+ function First(node) {
+ _classCallCheck$9(this, First);
+
+ this.node = node;
+ }
+
+ First.prototype.firstNode = function firstNode() {
+ return this.node;
+ };
+
+ return First;
+ }();
+
+ var Last = function () {
+ function Last(node) {
+ _classCallCheck$9(this, Last);
+
+ this.node = node;
+ }
+
+ Last.prototype.lastNode = function lastNode() {
+ return this.node;
+ };
+
+ return Last;
+ }();
+
+ var Fragment = function () {
+ function Fragment(bounds$$1) {
+ _classCallCheck$9(this, Fragment);
+
+ this.bounds = bounds$$1;
+ }
+
+ Fragment.prototype.parentElement = function parentElement() {
+ return this.bounds.parentElement();
+ };
+
+ Fragment.prototype.firstNode = function firstNode() {
+ return this.bounds.firstNode();
+ };
+
+ Fragment.prototype.lastNode = function lastNode() {
+ return this.bounds.lastNode();
+ };
+
+ Fragment.prototype.update = function update(bounds$$1) {
+ this.bounds = bounds$$1;
+ };
+
+ return Fragment;
+ }();
+ var ElementStack = function () {
+ function ElementStack(env, parentNode, nextSibling) {
+ _classCallCheck$9(this, ElementStack);
+
+ this.constructing = null;
+ this.operations = null;
+ this.elementStack = new _util.Stack();
+ this.nextSiblingStack = new _util.Stack();
+ this.blockStack = new _util.Stack();
+ this.env = env;
+ this.dom = env.getAppendOperations();
+ this.updateOperations = env.getDOM();
+ this.element = parentNode;
+ this.nextSibling = nextSibling;
+ this.defaultOperations = new SimpleElementOperations(env);
+ this.pushSimpleBlock();
+ this.elementStack.push(this.element);
+ this.nextSiblingStack.push(this.nextSibling);
+ }
+
+ ElementStack.forInitialRender = function forInitialRender(env, parentNode, nextSibling) {
+ return new ElementStack(env, parentNode, nextSibling);
+ };
+
+ ElementStack.resume = function resume(env, tracker, nextSibling) {
+ var parentNode = tracker.parentElement();
+ var stack = new ElementStack(env, parentNode, nextSibling);
+ stack.pushBlockTracker(tracker);
+ return stack;
+ };
+
+ ElementStack.prototype.expectConstructing = function expectConstructing(method) {
+ return this.constructing;
+ };
+
+ ElementStack.prototype.expectOperations = function expectOperations(method) {
+ return this.operations;
+ };
+
+ ElementStack.prototype.block = function block() {
+ return this.blockStack.current;
+ };
+
+ ElementStack.prototype.popElement = function popElement() {
+ var elementStack = this.elementStack,
+ nextSiblingStack = this.nextSiblingStack;
+
+ var topElement = elementStack.pop();
+ nextSiblingStack.pop();
+ // LOGGER.debug(`-> element stack ${this.elementStack.toArray().map(e => e.tagName).join(', ')}`);
+ this.element = elementStack.current;
+ this.nextSibling = nextSiblingStack.current;
+ return topElement;
+ };
+
+ ElementStack.prototype.pushSimpleBlock = function pushSimpleBlock() {
+ var tracker = new SimpleBlockTracker(this.element);
+ this.pushBlockTracker(tracker);
+ return tracker;
+ };
+
+ ElementStack.prototype.pushUpdatableBlock = function pushUpdatableBlock() {
+ var tracker = new UpdatableBlockTracker(this.element);
+ this.pushBlockTracker(tracker);
+ return tracker;
+ };
+
+ ElementStack.prototype.pushBlockTracker = function pushBlockTracker(tracker) {
+ var isRemote = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
+
+ var current = this.blockStack.current;
+ if (current !== null) {
+ current.newDestroyable(tracker);
+ if (!isRemote) {
+ current.newBounds(tracker);
+ }
+ }
+ this.blockStack.push(tracker);
+ return tracker;
+ };
+
+ ElementStack.prototype.pushBlockList = function pushBlockList(list) {
+ var tracker = new BlockListTracker(this.element, list);
+ var current = this.blockStack.current;
+ if (current !== null) {
+ current.newDestroyable(tracker);
+ current.newBounds(tracker);
+ }
+ this.blockStack.push(tracker);
+ return tracker;
+ };
+
+ ElementStack.prototype.popBlock = function popBlock() {
+ this.block().finalize(this);
+ return this.blockStack.pop();
+ };
+
+ ElementStack.prototype.openElement = function openElement(tag, _operations) {
+ // workaround argument.length transpile of arg initializer
+ var operations = _operations === undefined ? this.defaultOperations : _operations;
+ var element = this.dom.createElement(tag, this.element);
+ this.constructing = element;
+ this.operations = operations;
+ return element;
+ };
+
+ ElementStack.prototype.flushElement = function flushElement() {
+ var parent = this.element;
+ var element = this.constructing;
+ this.dom.insertBefore(parent, element, this.nextSibling);
+ this.constructing = null;
+ this.operations = null;
+ this.pushElement(element, null);
+ this.block().openElement(element);
+ };
+
+ ElementStack.prototype.pushRemoteElement = function pushRemoteElement(element) {
+ var nextSibling = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
+
+ this.pushElement(element, nextSibling);
+ var tracker = new RemoteBlockTracker(element);
+ this.pushBlockTracker(tracker, true);
+ };
+
+ ElementStack.prototype.popRemoteElement = function popRemoteElement() {
+ this.popBlock();
+ this.popElement();
+ };
+
+ ElementStack.prototype.pushElement = function pushElement(element, nextSibling) {
+ this.element = element;
+ this.elementStack.push(element);
+ // LOGGER.debug(`-> element stack ${this.elementStack.toArray().map(e => e.tagName).join(', ')}`);
+ this.nextSibling = nextSibling;
+ this.nextSiblingStack.push(nextSibling);
+ };
+
+ ElementStack.prototype.newDestroyable = function newDestroyable(d) {
+ this.block().newDestroyable(d);
+ };
+
+ ElementStack.prototype.newBounds = function newBounds(bounds$$1) {
+ this.block().newBounds(bounds$$1);
+ };
+
+ ElementStack.prototype.appendText = function appendText(string) {
+ var dom = this.dom;
+
+ var text = dom.createTextNode(string);
+ dom.insertBefore(this.element, text, this.nextSibling);
+ this.block().newNode(text);
+ return text;
+ };
+
+ ElementStack.prototype.appendComment = function appendComment(string) {
+ var dom = this.dom;
+
+ var comment = dom.createComment(string);
+ dom.insertBefore(this.element, comment, this.nextSibling);
+ this.block().newNode(comment);
+ return comment;
+ };
+
+ ElementStack.prototype.setStaticAttribute = function setStaticAttribute(name, value) {
+ this.expectOperations('setStaticAttribute').addStaticAttribute(this.expectConstructing('setStaticAttribute'), name, value);
+ };
+
+ ElementStack.prototype.setStaticAttributeNS = function setStaticAttributeNS(namespace, name, value) {
+ this.expectOperations('setStaticAttributeNS').addStaticAttributeNS(this.expectConstructing('setStaticAttributeNS'), namespace, name, value);
+ };
+
+ ElementStack.prototype.setDynamicAttribute = function setDynamicAttribute(name, reference$$1, isTrusting) {
+ this.expectOperations('setDynamicAttribute').addDynamicAttribute(this.expectConstructing('setDynamicAttribute'), name, reference$$1, isTrusting);
+ };
+
+ ElementStack.prototype.setDynamicAttributeNS = function setDynamicAttributeNS(namespace, name, reference$$1, isTrusting) {
+ this.expectOperations('setDynamicAttributeNS').addDynamicAttributeNS(this.expectConstructing('setDynamicAttributeNS'), namespace, name, reference$$1, isTrusting);
+ };
+
+ ElementStack.prototype.closeElement = function closeElement() {
+ this.block().closeElement();
+ this.popElement();
+ };
+
+ return ElementStack;
+ }();
+ var SimpleBlockTracker = function () {
+ function SimpleBlockTracker(parent) {
+ _classCallCheck$9(this, SimpleBlockTracker);
+
+ this.parent = parent;
+ this.first = null;
+ this.last = null;
+ this.destroyables = null;
+ this.nesting = 0;
+ }
+
+ SimpleBlockTracker.prototype.destroy = function destroy() {
+ var destroyables = this.destroyables;
+
+ if (destroyables && destroyables.length) {
+ for (var i = 0; i < destroyables.length; i++) {
+ destroyables[i].destroy();
+ }
+ }
+ };
+
+ SimpleBlockTracker.prototype.parentElement = function parentElement() {
+ return this.parent;
+ };
+
+ SimpleBlockTracker.prototype.firstNode = function firstNode() {
+ return this.first && this.first.firstNode();
+ };
+
+ SimpleBlockTracker.prototype.lastNode = function lastNode() {
+ return this.last && this.last.lastNode();
+ };
+
+ SimpleBlockTracker.prototype.openElement = function openElement(element) {
+ this.newNode(element);
+ this.nesting++;
+ };
+
+ SimpleBlockTracker.prototype.closeElement = function closeElement() {
+ this.nesting--;
+ };
+
+ SimpleBlockTracker.prototype.newNode = function newNode(node) {
+ if (this.nesting !== 0) return;
+ if (!this.first) {
+ this.first = new First(node);
+ }
+ this.last = new Last(node);
+ };
+
+ SimpleBlockTracker.prototype.newBounds = function newBounds(bounds$$1) {
+ if (this.nesting !== 0) return;
+ if (!this.first) {
+ this.first = bounds$$1;
+ }
+ this.last = bounds$$1;
+ };
+
+ SimpleBlockTracker.prototype.newDestroyable = function newDestroyable(d) {
+ this.destroyables = this.destroyables || [];
+ this.destroyables.push(d);
+ };
+
+ SimpleBlockTracker.prototype.finalize = function finalize(stack) {
+ if (!this.first) {
+ stack.appendComment('');
+ }
+ };
+
+ return SimpleBlockTracker;
+ }();
+
+ var RemoteBlockTracker = function (_SimpleBlockTracker) {
+ _inherits$7(RemoteBlockTracker, _SimpleBlockTracker);
+
+ function RemoteBlockTracker() {
+ _classCallCheck$9(this, RemoteBlockTracker);
+
+ return _possibleConstructorReturn$7(this, _SimpleBlockTracker.apply(this, arguments));
+ }
+
+ RemoteBlockTracker.prototype.destroy = function destroy() {
+ _SimpleBlockTracker.prototype.destroy.call(this);
+ clear(this);
+ };
+
+ return RemoteBlockTracker;
+ }(SimpleBlockTracker);
+
+ var UpdatableBlockTracker = function (_SimpleBlockTracker2) {
+ _inherits$7(UpdatableBlockTracker, _SimpleBlockTracker2);
+
+ function UpdatableBlockTracker() {
+ _classCallCheck$9(this, UpdatableBlockTracker);
+
+ return _possibleConstructorReturn$7(this, _SimpleBlockTracker2.apply(this, arguments));
+ }
+
+ UpdatableBlockTracker.prototype.reset = function reset(env) {
+ var destroyables = this.destroyables;
+
+ if (destroyables && destroyables.length) {
+ for (var i = 0; i < destroyables.length; i++) {
+ env.didDestroy(destroyables[i]);
+ }
+ }
+ var nextSibling = clear(this);
+ this.first = null;
+ this.last = null;
+ this.destroyables = null;
+ this.nesting = 0;
+ return nextSibling;
+ };
+
+ return UpdatableBlockTracker;
+ }(SimpleBlockTracker);
+
+ var BlockListTracker = function () {
+ function BlockListTracker(parent, boundList) {
+ _classCallCheck$9(this, BlockListTracker);
+
+ this.parent = parent;
+ this.boundList = boundList;
+ this.parent = parent;
+ this.boundList = boundList;
+ }
+
+ BlockListTracker.prototype.destroy = function destroy() {
+ this.boundList.forEachNode(function (node) {
+ return node.destroy();
+ });
+ };
+
+ BlockListTracker.prototype.parentElement = function parentElement() {
+ return this.parent;
+ };
+
+ BlockListTracker.prototype.firstNode = function firstNode() {
+ var head = this.boundList.head();
+ return head && head.firstNode();
+ };
+
+ BlockListTracker.prototype.lastNode = function lastNode() {
+ var tail = this.boundList.tail();
+ return tail && tail.lastNode();
+ };
+
+ BlockListTracker.prototype.openElement = function openElement(_element) {
+ (0, _util.assert)(false, 'Cannot openElement directly inside a block list');
+ };
+
+ BlockListTracker.prototype.closeElement = function closeElement() {
+ (0, _util.assert)(false, 'Cannot closeElement directly inside a block list');
+ };
+
+ BlockListTracker.prototype.newNode = function newNode(_node) {
+ (0, _util.assert)(false, 'Cannot create a new node directly inside a block list');
+ };
+
+ BlockListTracker.prototype.newBounds = function newBounds(_bounds) {};
+
+ BlockListTracker.prototype.newDestroyable = function newDestroyable(_d) {};
+
+ BlockListTracker.prototype.finalize = function finalize(_stack) {};
+
+ return BlockListTracker;
+ }();
+
+ function _classCallCheck$10(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ var COMPONENT_DEFINITION_BRAND = 'COMPONENT DEFINITION [id=e59c754e-61eb-4392-8c4a-2c0ac72bfcd4]';
+ function isComponentDefinition(obj) {
+ return typeof obj === 'object' && obj !== null && obj[COMPONENT_DEFINITION_BRAND];
+ }
+ var ComponentDefinition = function ComponentDefinition(name, manager, ComponentClass) {
+ _classCallCheck$10(this, ComponentDefinition);
+
+ this[COMPONENT_DEFINITION_BRAND] = true;
+ this.name = name;
+ this.manager = manager;
+ this.ComponentClass = ComponentClass;
+ };
+
+ function _defaults$8(obj, defaults) {
+ var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {
+ Object.defineProperty(obj, key, value);
+ }
+ }return obj;
+ }
+
+ function _possibleConstructorReturn$8(self, call) {
+ if (!self) {
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ }return call && (typeof call === "object" || typeof call === "function") ? call : self;
+ }
+
+ function _inherits$8(subClass, superClass) {
+ if (typeof superClass !== "function" && superClass !== null) {
+ throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults$8(subClass, superClass);
+ }
+
+ function _classCallCheck$11(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ function isSafeString(value) {
+ return typeof value === 'object' && value !== null && typeof value.toHTML === 'function';
+ }
+ function isNode(value) {
+ return typeof value === 'object' && value !== null && typeof value.nodeType === 'number';
+ }
+ function isString(value) {
+ return typeof value === 'string';
+ }
+
+ var Upsert = function Upsert(bounds$$1) {
+ _classCallCheck$11(this, Upsert);
+
+ this.bounds = bounds$$1;
+ };
+
+ function cautiousInsert(dom, cursor, value) {
+ if (isString(value)) {
+ return TextUpsert.insert(dom, cursor, value);
+ }
+ if (isSafeString(value)) {
+ return SafeStringUpsert.insert(dom, cursor, value);
+ }
+ if (isNode(value)) {
+ return NodeUpsert.insert(dom, cursor, value);
+ }
+ throw (0, _util.unreachable)();
+ }
+ function trustingInsert(dom, cursor, value) {
+ if (isString(value)) {
+ return HTMLUpsert.insert(dom, cursor, value);
+ }
+ if (isNode(value)) {
+ return NodeUpsert.insert(dom, cursor, value);
+ }
+ throw (0, _util.unreachable)();
+ }
+
+ var TextUpsert = function (_Upsert) {
+ _inherits$8(TextUpsert, _Upsert);
+
+ TextUpsert.insert = function insert(dom, cursor, value) {
+ var textNode = dom.createTextNode(value);
+ dom.insertBefore(cursor.element, textNode, cursor.nextSibling);
+ var bounds$$1 = new SingleNodeBounds(cursor.element, textNode);
+ return new TextUpsert(bounds$$1, textNode);
+ };
+
+ function TextUpsert(bounds$$1, textNode) {
+ _classCallCheck$11(this, TextUpsert);
+
+ var _this = _possibleConstructorReturn$8(this, _Upsert.call(this, bounds$$1));
+
+ _this.textNode = textNode;
+ return _this;
+ }
+
+ TextUpsert.prototype.update = function update(_dom, value) {
+ if (isString(value)) {
+ var textNode = this.textNode;
+
+ textNode.nodeValue = value;
+ return true;
+ } else {
+ return false;
+ }
+ };
+
+ return TextUpsert;
+ }(Upsert);
+
+ var HTMLUpsert = function (_Upsert2) {
+ _inherits$8(HTMLUpsert, _Upsert2);
+
+ function HTMLUpsert() {
+ _classCallCheck$11(this, HTMLUpsert);
+
+ return _possibleConstructorReturn$8(this, _Upsert2.apply(this, arguments));
+ }
+
+ HTMLUpsert.insert = function insert(dom, cursor, value) {
+ var bounds$$1 = dom.insertHTMLBefore(cursor.element, cursor.nextSibling, value);
+ return new HTMLUpsert(bounds$$1);
+ };
+
+ HTMLUpsert.prototype.update = function update(dom, value) {
+ if (isString(value)) {
+ var bounds$$1 = this.bounds;
+
+ var parentElement = bounds$$1.parentElement();
+ var nextSibling = clear(bounds$$1);
+ this.bounds = dom.insertHTMLBefore(parentElement, nextSibling, value);
+ return true;
+ } else {
+ return false;
+ }
+ };
+
+ return HTMLUpsert;
+ }(Upsert);
+
+ var SafeStringUpsert = function (_Upsert3) {
+ _inherits$8(SafeStringUpsert, _Upsert3);
+
+ function SafeStringUpsert(bounds$$1, lastStringValue) {
+ _classCallCheck$11(this, SafeStringUpsert);
+
+ var _this3 = _possibleConstructorReturn$8(this, _Upsert3.call(this, bounds$$1));
+
+ _this3.lastStringValue = lastStringValue;
+ return _this3;
+ }
+
+ SafeStringUpsert.insert = function insert(dom, cursor, value) {
+ var stringValue = value.toHTML();
+ var bounds$$1 = dom.insertHTMLBefore(cursor.element, cursor.nextSibling, stringValue);
+ return new SafeStringUpsert(bounds$$1, stringValue);
+ };
+
+ SafeStringUpsert.prototype.update = function update(dom, value) {
+ if (isSafeString(value)) {
+ var stringValue = value.toHTML();
+ if (stringValue !== this.lastStringValue) {
+ var bounds$$1 = this.bounds;
+
+ var parentElement = bounds$$1.parentElement();
+ var nextSibling = clear(bounds$$1);
+ this.bounds = dom.insertHTMLBefore(parentElement, nextSibling, stringValue);
+ this.lastStringValue = stringValue;
+ }
+ return true;
+ } else {
+ return false;
+ }
+ };
+
+ return SafeStringUpsert;
+ }(Upsert);
+
+ var NodeUpsert = function (_Upsert4) {
+ _inherits$8(NodeUpsert, _Upsert4);
+
+ function NodeUpsert() {
+ _classCallCheck$11(this, NodeUpsert);
+
+ return _possibleConstructorReturn$8(this, _Upsert4.apply(this, arguments));
+ }
+
+ NodeUpsert.insert = function insert(dom, cursor, node) {
+ dom.insertBefore(cursor.element, node, cursor.nextSibling);
+ return new NodeUpsert(single(cursor.element, node));
+ };
+
+ NodeUpsert.prototype.update = function update(dom, value) {
+ if (isNode(value)) {
+ var bounds$$1 = this.bounds;
+
+ var parentElement = bounds$$1.parentElement();
+ var nextSibling = clear(bounds$$1);
+ this.bounds = dom.insertNodeBefore(parentElement, value, nextSibling);
+ return true;
+ } else {
+ return false;
+ }
+ };
+
+ return NodeUpsert;
+ }(Upsert);
+
+ function _defaults$6(obj, defaults) {
+ var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {
+ Object.defineProperty(obj, key, value);
+ }
+ }return obj;
+ }
+
+ function _possibleConstructorReturn$6(self, call) {
+ if (!self) {
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ }return call && (typeof call === "object" || typeof call === "function") ? call : self;
+ }
+
+ function _inherits$6(subClass, superClass) {
+ if (typeof superClass !== "function" && superClass !== null) {
+ throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults$6(subClass, superClass);
+ }
+
+ function _classCallCheck$7(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ APPEND_OPCODES.add(26 /* DynamicContent */, function (vm, _ref) {
+ var append = _ref.op1;
+
+ var opcode = vm.constants.getOther(append);
+ opcode.evaluate(vm);
+ });
+ function isEmpty(value) {
+ return value === null || value === undefined || typeof value.toString !== 'function';
+ }
+ function normalizeTextValue(value) {
+ if (isEmpty(value)) {
+ return '';
+ }
+ return String(value);
+ }
+ function normalizeTrustedValue(value) {
+ if (isEmpty(value)) {
+ return '';
+ }
+ if (isString(value)) {
+ return value;
+ }
+ if (isSafeString(value)) {
+ return value.toHTML();
+ }
+ if (isNode(value)) {
+ return value;
+ }
+ return String(value);
+ }
+ function normalizeValue(value) {
+ if (isEmpty(value)) {
+ return '';
+ }
+ if (isString(value)) {
+ return value;
+ }
+ if (isSafeString(value) || isNode(value)) {
+ return value;
+ }
+ return String(value);
+ }
+ var AppendDynamicOpcode = function () {
+ function AppendDynamicOpcode() {
+ _classCallCheck$7(this, AppendDynamicOpcode);
+ }
+
+ AppendDynamicOpcode.prototype.evaluate = function evaluate(vm) {
+ var reference$$1 = vm.stack.pop();
+ var normalized = this.normalize(reference$$1);
+ var value = void 0;
+ var cache = void 0;
+ if ((0, _reference2.isConst)(reference$$1)) {
+ value = normalized.value();
+ } else {
+ cache = new _reference2.ReferenceCache(normalized);
+ value = cache.peek();
+ }
+ var stack = vm.elements();
+ var upsert = this.insert(vm.env.getAppendOperations(), stack, value);
+ var bounds$$1 = new Fragment(upsert.bounds);
+ stack.newBounds(bounds$$1);
+ if (cache /* i.e. !isConst(reference) */) {
+ vm.updateWith(this.updateWith(vm, reference$$1, cache, bounds$$1, upsert));
+ }
+ };
+
+ return AppendDynamicOpcode;
+ }();
+ var IsComponentDefinitionReference = function (_ConditionalReference) {
+ _inherits$6(IsComponentDefinitionReference, _ConditionalReference);
+
+ function IsComponentDefinitionReference() {
+ _classCallCheck$7(this, IsComponentDefinitionReference);
+
+ return _possibleConstructorReturn$6(this, _ConditionalReference.apply(this, arguments));
+ }
+
+ IsComponentDefinitionReference.create = function create(inner) {
+ return new IsComponentDefinitionReference(inner);
+ };
+
+ IsComponentDefinitionReference.prototype.toBool = function toBool(value) {
+ return isComponentDefinition(value);
+ };
+
+ return IsComponentDefinitionReference;
+ }(ConditionalReference);
+
+ var UpdateOpcode = function (_UpdatingOpcode) {
+ _inherits$6(UpdateOpcode, _UpdatingOpcode);
+
+ function UpdateOpcode(cache, bounds$$1, upsert) {
+ _classCallCheck$7(this, UpdateOpcode);
+
+ var _this2 = _possibleConstructorReturn$6(this, _UpdatingOpcode.call(this));
+
+ _this2.cache = cache;
+ _this2.bounds = bounds$$1;
+ _this2.upsert = upsert;
+ _this2.tag = cache.tag;
+ return _this2;
+ }
+
+ UpdateOpcode.prototype.evaluate = function evaluate(vm) {
+ var value = this.cache.revalidate();
+ if ((0, _reference2.isModified)(value)) {
+ var bounds$$1 = this.bounds,
+ upsert = this.upsert;
+ var dom = vm.dom;
+
+ if (!this.upsert.update(dom, value)) {
+ var cursor = new Cursor(bounds$$1.parentElement(), clear(bounds$$1));
+ upsert = this.upsert = this.insert(vm.env.getAppendOperations(), cursor, value);
+ }
+ bounds$$1.update(upsert.bounds);
+ }
+ };
+
+ UpdateOpcode.prototype.toJSON = function toJSON() {
+ var guid = this._guid,
+ type = this.type,
+ cache = this.cache;
+
+ return {
+ details: { lastValue: JSON.stringify(cache.peek()) },
+ guid: guid,
+ type: type
+ };
+ };
+
+ return UpdateOpcode;
+ }(UpdatingOpcode);
+
+ var OptimizedCautiousAppendOpcode = function (_AppendDynamicOpcode) {
+ _inherits$6(OptimizedCautiousAppendOpcode, _AppendDynamicOpcode);
+
+ function OptimizedCautiousAppendOpcode() {
+ _classCallCheck$7(this, OptimizedCautiousAppendOpcode);
+
+ var _this3 = _possibleConstructorReturn$6(this, _AppendDynamicOpcode.apply(this, arguments));
+
+ _this3.type = 'optimized-cautious-append';
+ return _this3;
+ }
+
+ OptimizedCautiousAppendOpcode.prototype.normalize = function normalize(reference$$1) {
+ return (0, _reference2.map)(reference$$1, normalizeValue);
+ };
+
+ OptimizedCautiousAppendOpcode.prototype.insert = function insert(dom, cursor, value) {
+ return cautiousInsert(dom, cursor, value);
+ };
+
+ OptimizedCautiousAppendOpcode.prototype.updateWith = function updateWith(_vm, _reference, cache, bounds$$1, upsert) {
+ return new OptimizedCautiousUpdateOpcode(cache, bounds$$1, upsert);
+ };
+
+ return OptimizedCautiousAppendOpcode;
+ }(AppendDynamicOpcode);
+
+ var OptimizedCautiousUpdateOpcode = function (_UpdateOpcode) {
+ _inherits$6(OptimizedCautiousUpdateOpcode, _UpdateOpcode);
+
+ function OptimizedCautiousUpdateOpcode() {
+ _classCallCheck$7(this, OptimizedCautiousUpdateOpcode);
+
+ var _this4 = _possibleConstructorReturn$6(this, _UpdateOpcode.apply(this, arguments));
+
+ _this4.type = 'optimized-cautious-update';
+ return _this4;
+ }
+
+ OptimizedCautiousUpdateOpcode.prototype.insert = function insert(dom, cursor, value) {
+ return cautiousInsert(dom, cursor, value);
+ };
+
+ return OptimizedCautiousUpdateOpcode;
+ }(UpdateOpcode);
+
+ var OptimizedTrustingAppendOpcode = function (_AppendDynamicOpcode2) {
+ _inherits$6(OptimizedTrustingAppendOpcode, _AppendDynamicOpcode2);
+
+ function OptimizedTrustingAppendOpcode() {
+ _classCallCheck$7(this, OptimizedTrustingAppendOpcode);
+
+ var _this5 = _possibleConstructorReturn$6(this, _AppendDynamicOpcode2.apply(this, arguments));
+
+ _this5.type = 'optimized-trusting-append';
+ return _this5;
+ }
+
+ OptimizedTrustingAppendOpcode.prototype.normalize = function normalize(reference$$1) {
+ return (0, _reference2.map)(reference$$1, normalizeTrustedValue);
+ };
+
+ OptimizedTrustingAppendOpcode.prototype.insert = function insert(dom, cursor, value) {
+ return trustingInsert(dom, cursor, value);
+ };
+
+ OptimizedTrustingAppendOpcode.prototype.updateWith = function updateWith(_vm, _reference, cache, bounds$$1, upsert) {
+ return new OptimizedTrustingUpdateOpcode(cache, bounds$$1, upsert);
+ };
+
+ return OptimizedTrustingAppendOpcode;
+ }(AppendDynamicOpcode);
+
+ var OptimizedTrustingUpdateOpcode = function (_UpdateOpcode2) {
+ _inherits$6(OptimizedTrustingUpdateOpcode, _UpdateOpcode2);
+
+ function OptimizedTrustingUpdateOpcode() {
+ _classCallCheck$7(this, OptimizedTrustingUpdateOpcode);
+
+ var _this6 = _possibleConstructorReturn$6(this, _UpdateOpcode2.apply(this, arguments));
+
+ _this6.type = 'optimized-trusting-update';
+ return _this6;
+ }
+
+ OptimizedTrustingUpdateOpcode.prototype.insert = function insert(dom, cursor, value) {
+ return trustingInsert(dom, cursor, value);
+ };
+
+ return OptimizedTrustingUpdateOpcode;
+ }(UpdateOpcode);
+
+ function _classCallCheck$12(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ /* tslint:disable */
+ function debugCallback(context, get) {
+ console.info('Use `context`, and `get(<path>)` to debug this template.');
+ // for example...
+ context === get('this');
+ debugger;
+ }
+ /* tslint:enable */
+ var callback = debugCallback;
+ // For testing purposes
+ function setDebuggerCallback(cb) {
+ callback = cb;
+ }
+ function resetDebuggerCallback() {
+ callback = debugCallback;
+ }
+
+ var ScopeInspector = function () {
+ function ScopeInspector(scope, symbols, evalInfo) {
+ _classCallCheck$12(this, ScopeInspector);
+
+ this.scope = scope;
+ this.locals = (0, _util.dict)();
+ for (var i = 0; i < evalInfo.length; i++) {
+ var slot = evalInfo[i];
+ var name = symbols[slot - 1];
+ var ref = scope.getSymbol(slot);
+ this.locals[name] = ref;
+ }
+ }
+
+ ScopeInspector.prototype.get = function get(path) {
+ var scope = this.scope,
+ locals = this.locals;
+
+ var parts = path.split('.');
+
+ var _path$split = path.split('.'),
+ head = _path$split[0],
+ tail = _path$split.slice(1);
+
+ var evalScope = scope.getEvalScope();
+ var ref = void 0;
+ if (head === 'this') {
+ ref = scope.getSelf();
+ } else if (locals[head]) {
+ ref = locals[head];
+ } else if (head.indexOf('@') === 0 && evalScope[head]) {
+ ref = evalScope[head];
+ } else {
+ ref = this.scope.getSelf();
+ tail = parts;
+ }
+ return tail.reduce(function (r, part) {
+ return r.get(part);
+ }, ref);
+ };
+
+ return ScopeInspector;
+ }();
+
+ APPEND_OPCODES.add(71 /* Debugger */, function (vm, _ref) {
+ var _symbols = _ref.op1,
+ _evalInfo = _ref.op2;
+
+ var symbols = vm.constants.getOther(_symbols);
+ var evalInfo = vm.constants.getArray(_evalInfo);
+ var inspector = new ScopeInspector(vm.scope(), symbols, evalInfo);
+ callback(vm.getSelf().value(), function (path) {
+ return inspector.get(path).value();
+ });
+ });
+
+ APPEND_OPCODES.add(69 /* GetPartialTemplate */, function (vm) {
+ var stack = vm.stack;
+ var definition = stack.pop();
+ stack.push(definition.value().template.asPartial());
+ });
+
+ function _classCallCheck$13(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ var IterablePresenceReference = function () {
+ function IterablePresenceReference(artifacts) {
+ _classCallCheck$13(this, IterablePresenceReference);
+
+ this.tag = artifacts.tag;
+ this.artifacts = artifacts;
+ }
+
+ IterablePresenceReference.prototype.value = function value() {
+ return !this.artifacts.isEmpty();
+ };
+
+ return IterablePresenceReference;
+ }();
+
+ APPEND_OPCODES.add(54 /* PutIterator */, function (vm) {
+ var stack = vm.stack;
+ var listRef = stack.pop();
+ var key = stack.pop();
+ var iterable = vm.env.iterableFor(listRef, key.value());
+ var iterator = new _reference2.ReferenceIterator(iterable);
+ stack.push(iterator);
+ stack.push(new IterablePresenceReference(iterator.artifacts));
+ });
+ APPEND_OPCODES.add(52 /* EnterList */, function (vm, _ref) {
+ var relativeStart = _ref.op1;
+
+ vm.enterList(relativeStart);
+ });
+ APPEND_OPCODES.add(53 /* ExitList */, function (vm) {
+ return vm.exitList();
+ });
+ APPEND_OPCODES.add(55 /* Iterate */, function (vm, _ref2) {
+ var breaks = _ref2.op1;
+
+ var stack = vm.stack;
+ var item = stack.peek().next();
+ if (item) {
+ var tryOpcode = vm.iterate(item.memo, item.value);
+ vm.enterItem(item.key, tryOpcode);
+ } else {
+ vm.goto(breaks);
+ }
+ });
+
+ var Ops$2;
+ (function (Ops$$1) {
+ Ops$$1[Ops$$1["OpenComponentElement"] = 0] = "OpenComponentElement";
+ Ops$$1[Ops$$1["DidCreateElement"] = 1] = "DidCreateElement";
+ Ops$$1[Ops$$1["DidRenderLayout"] = 2] = "DidRenderLayout";
+ Ops$$1[Ops$$1["FunctionExpression"] = 3] = "FunctionExpression";
+ })(Ops$2 || (Ops$2 = {}));
+
+ function _classCallCheck$17(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ var CompiledStaticTemplate = function CompiledStaticTemplate(handle) {
+ _classCallCheck$17(this, CompiledStaticTemplate);
+
+ this.handle = handle;
+ };
+ var CompiledDynamicTemplate = function CompiledDynamicTemplate(handle, symbolTable) {
+ _classCallCheck$17(this, CompiledDynamicTemplate);
+
+ this.handle = handle;
+ this.symbolTable = symbolTable;
+ };
+
+ var _createClass$2 = function () {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }return function (Constructor, protoProps, staticProps) {
+ if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;
+ };
+ }();
+
+ function _classCallCheck$20(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ function compileLayout(compilable, env) {
+ var builder = new ComponentLayoutBuilder(env);
+ compilable.compile(builder);
+ return builder.compile();
+ }
+
+ var ComponentLayoutBuilder = function () {
+ function ComponentLayoutBuilder(env) {
+ _classCallCheck$20(this, ComponentLayoutBuilder);
+
+ this.env = env;
+ }
+
+ ComponentLayoutBuilder.prototype.wrapLayout = function wrapLayout(layout) {
+ this.inner = new WrappedBuilder(this.env, layout);
+ };
+
+ ComponentLayoutBuilder.prototype.fromLayout = function fromLayout(componentName, layout) {
+ this.inner = new UnwrappedBuilder(this.env, componentName, layout);
+ };
+
+ ComponentLayoutBuilder.prototype.compile = function compile() {
+ return this.inner.compile();
+ };
+
+ _createClass$2(ComponentLayoutBuilder, [{
+ key: 'tag',
+ get: function () {
+ return this.inner.tag;
+ }
+ }, {
+ key: 'attrs',
+ get: function () {
+ return this.inner.attrs;
+ }
+ }]);
+
+ return ComponentLayoutBuilder;
+ }();
+
+ var WrappedBuilder = function () {
+ function WrappedBuilder(env, layout) {
+ _classCallCheck$20(this, WrappedBuilder);
+
+ this.env = env;
+ this.layout = layout;
+ this.tag = new ComponentTagBuilder();
+ this.attrs = new ComponentAttrsBuilder();
+ }
+
+ WrappedBuilder.prototype.compile = function compile() {
+ //========DYNAMIC
+ // PutValue(TagExpr)
+ // Test
+ // JumpUnless(BODY)
+ // OpenDynamicPrimitiveElement
+ // DidCreateElement
+ // ...attr statements...
+ // FlushElement
+ // BODY: Noop
+ // ...body statements...
+ // PutValue(TagExpr)
+ // Test
+ // JumpUnless(END)
+ // CloseElement
+ // END: Noop
+ // DidRenderLayout
+ // Exit
+ //
+ //========STATIC
+ // OpenPrimitiveElementOpcode
+ // DidCreateElement
+ // ...attr statements...
+ // FlushElement
+ // ...body statements...
+ // CloseElement
+ // DidRenderLayout
+ // Exit
+ var env = this.env,
+ layout = this.layout;
+
+ var meta = { templateMeta: layout.meta, symbols: layout.symbols, asPartial: false };
+ var dynamicTag = this.tag.getDynamic();
+ var staticTag = this.tag.getStatic();
+ var b = builder(env, meta);
+ b.startLabels();
+ if (dynamicTag) {
+ b.fetch(Register.s1);
+ expr(dynamicTag, b);
+ b.dup();
+ b.load(Register.s1);
+ b.test('simple');
+ b.jumpUnless('BODY');
+ b.fetch(Register.s1);
+ b.pushComponentOperations();
+ b.openDynamicElement();
+ } else if (staticTag) {
+ b.pushComponentOperations();
+ b.openElementWithOperations(staticTag);
+ }
+ if (dynamicTag || staticTag) {
+ b.didCreateElement(Register.s0);
+ var attrs = this.attrs.buffer;
+ for (var i = 0; i < attrs.length; i++) {
+ compileStatement(attrs[i], b);
+ }
+ b.flushElement();
+ }
+ b.label('BODY');
+ b.invokeStatic(layout.asBlock());
+ if (dynamicTag) {
+ b.fetch(Register.s1);
+ b.test('simple');
+ b.jumpUnless('END');
+ b.closeElement();
+ } else if (staticTag) {
+ b.closeElement();
+ }
+ b.label('END');
+ b.didRenderLayout(Register.s0);
+ if (dynamicTag) {
+ b.load(Register.s1);
+ }
+ b.stopLabels();
+ var start = b.start;
+ var end = b.finalize();
+ return new CompiledDynamicTemplate(start, {
+ meta: meta,
+ hasEval: layout.hasEval,
+ symbols: layout.symbols.concat([ATTRS_BLOCK])
+ });
+ };
+
+ return WrappedBuilder;
+ }();
+
+ var UnwrappedBuilder = function () {
+ function UnwrappedBuilder(env, componentName, layout) {
+ _classCallCheck$20(this, UnwrappedBuilder);
+
+ this.env = env;
+ this.componentName = componentName;
+ this.layout = layout;
+ this.attrs = new ComponentAttrsBuilder();
+ }
+
+ UnwrappedBuilder.prototype.compile = function compile() {
+ var env = this.env,
+ layout = this.layout;
+
+ return layout.asLayout(this.componentName, this.attrs.buffer).compileDynamic(env);
+ };
+
+ _createClass$2(UnwrappedBuilder, [{
+ key: 'tag',
+ get: function () {
+ throw new Error('BUG: Cannot call `tag` on an UnwrappedBuilder');
+ }
+ }]);
+
+ return UnwrappedBuilder;
+ }();
+
+ var ComponentTagBuilder = function () {
+ function ComponentTagBuilder() {
+ _classCallCheck$20(this, ComponentTagBuilder);
+
+ this.isDynamic = null;
+ this.isStatic = null;
+ this.staticTagName = null;
+ this.dynamicTagName = null;
+ }
+
+ ComponentTagBuilder.prototype.getDynamic = function getDynamic() {
+ if (this.isDynamic) {
+ return this.dynamicTagName;
+ }
+ };
+
+ ComponentTagBuilder.prototype.getStatic = function getStatic() {
+ if (this.isStatic) {
+ return this.staticTagName;
+ }
+ };
+
+ ComponentTagBuilder.prototype.static = function _static(tagName) {
+ this.isStatic = true;
+ this.staticTagName = tagName;
+ };
+
+ ComponentTagBuilder.prototype.dynamic = function dynamic(tagName) {
+ this.isDynamic = true;
+ this.dynamicTagName = [_wireFormat.Ops.ClientSideExpression, Ops$2.FunctionExpression, tagName];
+ };
+
+ return ComponentTagBuilder;
+ }();
+
+ var ComponentAttrsBuilder = function () {
+ function ComponentAttrsBuilder() {
+ _classCallCheck$20(this, ComponentAttrsBuilder);
+
+ this.buffer = [];
+ }
+
+ ComponentAttrsBuilder.prototype.static = function _static(name, value) {
+ this.buffer.push([_wireFormat.Ops.StaticAttr, name, value, null]);
+ };
+
+ ComponentAttrsBuilder.prototype.dynamic = function dynamic(name, value) {
+ this.buffer.push([_wireFormat.Ops.DynamicAttr, name, [_wireFormat.Ops.ClientSideExpression, Ops$2.FunctionExpression, value], null]);
+ };
+
+ return ComponentAttrsBuilder;
+ }();
+
+ var ComponentBuilder = function () {
+ function ComponentBuilder(builder) {
+ _classCallCheck$20(this, ComponentBuilder);
+
+ this.builder = builder;
+ this.env = builder.env;
+ }
+
+ ComponentBuilder.prototype.static = function _static(definition, args) {
+ var params = args[0],
+ hash = args[1],
+ _default = args[2],
+ inverse = args[3];
+ var builder = this.builder;
+
+ builder.pushComponentManager(definition);
+ builder.invokeComponent(null, params, hash, _default, inverse);
+ };
+
+ ComponentBuilder.prototype.dynamic = function dynamic(definitionArgs, getDefinition, args) {
+ var params = args[0],
+ hash = args[1],
+ block = args[2],
+ inverse = args[3];
+ var builder = this.builder;
+
+ if (!definitionArgs || definitionArgs.length === 0) {
+ throw new Error("Dynamic syntax without an argument");
+ }
+ var meta = this.builder.meta.templateMeta;
+ function helper(vm, a) {
+ return getDefinition(vm, a, meta);
+ }
+ builder.startLabels();
+ builder.pushFrame();
+ builder.returnTo('END');
+ builder.compileArgs(definitionArgs[0], definitionArgs[1], true);
+ builder.helper(helper);
+ builder.dup();
+ builder.test('simple');
+ builder.enter(2);
+ builder.jumpUnless('ELSE');
+ builder.pushDynamicComponentManager();
+ builder.invokeComponent(null, params, hash, block, inverse);
+ builder.label('ELSE');
+ builder.exit();
+ builder.return();
+ builder.label('END');
+ builder.popFrame();
+ builder.stopLabels();
+ };
+
+ return ComponentBuilder;
+ }();
+ function builder(env, meta) {
+ return new OpcodeBuilder(env, meta);
+ }
+
+ function _classCallCheck$21(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ var RawInlineBlock = function () {
+ function RawInlineBlock(meta, statements, parameters) {
+ _classCallCheck$21(this, RawInlineBlock);
+
+ this.meta = meta;
+ this.statements = statements;
+ this.parameters = parameters;
+ }
+
+ RawInlineBlock.prototype.scan = function scan() {
+ return new CompilableTemplate(this.statements, { parameters: this.parameters, meta: this.meta });
+ };
+
+ return RawInlineBlock;
+ }();
+
+ var _createClass$1 = function () {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }return function (Constructor, protoProps, staticProps) {
+ if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;
+ };
+ }();
+
+ function _defaults$9(obj, defaults) {
+ var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {
+ Object.defineProperty(obj, key, value);
+ }
+ }return obj;
+ }
+
+ function _possibleConstructorReturn$9(self, call) {
+ if (!self) {
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ }return call && (typeof call === "object" || typeof call === "function") ? call : self;
+ }
+
+ function _inherits$9(subClass, superClass) {
+ if (typeof superClass !== "function" && superClass !== null) {
+ throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults$9(subClass, superClass);
+ }
+
+ function _classCallCheck$19(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ var Labels = function () {
+ function Labels() {
+ _classCallCheck$19(this, Labels);
+
+ this.labels = (0, _util.dict)();
+ this.targets = [];
+ }
+
+ Labels.prototype.label = function label(name, index) {
+ this.labels[name] = index;
+ };
+
+ Labels.prototype.target = function target(at, Target, _target) {
+ this.targets.push({ at: at, Target: Target, target: _target });
+ };
+
+ Labels.prototype.patch = function patch(program) {
+ var targets = this.targets,
+ labels = this.labels;
+
+ for (var i = 0; i < targets.length; i++) {
+ var _targets$i = targets[i],
+ at = _targets$i.at,
+ target = _targets$i.target;
+
+ var goto = labels[target] - at;
+ program.heap.setbyaddr(at + 1, goto);
+ }
+ };
+
+ return Labels;
+ }();
+
+ var BasicOpcodeBuilder = function () {
+ function BasicOpcodeBuilder(env, meta, program) {
+ _classCallCheck$19(this, BasicOpcodeBuilder);
+
+ this.env = env;
+ this.meta = meta;
+ this.program = program;
+ this.labelsStack = new _util.Stack();
+ this.constants = program.constants;
+ this.heap = program.heap;
+ this.start = this.heap.malloc();
+ }
+
+ BasicOpcodeBuilder.prototype.upvars = function upvars(count) {
+ return (0, _util.fillNulls)(count);
+ };
+
+ BasicOpcodeBuilder.prototype.reserve = function reserve(name) {
+ this.push(name, 0, 0, 0);
+ };
+
+ BasicOpcodeBuilder.prototype.push = function push(name) {
+ var op1 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
+ var op2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
+ var op3 = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
+
+ this.heap.push(name);
+ this.heap.push(op1);
+ this.heap.push(op2);
+ this.heap.push(op3);
+ };
+
+ BasicOpcodeBuilder.prototype.finalize = function finalize() {
+ this.push(22 /* Return */);
+ this.heap.finishMalloc(this.start);
+ return this.start;
+ };
+ // args
+
+
+ BasicOpcodeBuilder.prototype.pushArgs = function pushArgs(synthetic) {
+ this.push(58 /* PushArgs */, synthetic === true ? 1 : 0);
+ };
+ // helpers
+
+
+ BasicOpcodeBuilder.prototype.startLabels = function startLabels() {
+ this.labelsStack.push(new Labels());
+ };
+
+ BasicOpcodeBuilder.prototype.stopLabels = function stopLabels() {
+ var label = this.labelsStack.pop();
+ label.patch(this.program);
+ };
+ // components
+
+
+ BasicOpcodeBuilder.prototype.pushComponentManager = function pushComponentManager(definition) {
+ this.push(56 /* PushComponentManager */, this.other(definition));
+ };
+
+ BasicOpcodeBuilder.prototype.pushDynamicComponentManager = function pushDynamicComponentManager() {
+ this.push(57 /* PushDynamicComponentManager */);
+ };
+
+ BasicOpcodeBuilder.prototype.prepareArgs = function prepareArgs(state) {
+ this.push(59 /* PrepareArgs */, state);
+ };
+
+ BasicOpcodeBuilder.prototype.createComponent = function createComponent(state, hasDefault, hasInverse) {
+ var flag = (hasDefault === true ? 1 : 0) | (hasInverse === true ? 1 : 0) << 1;
+ this.push(60 /* CreateComponent */, flag, state);
+ };
+
+ BasicOpcodeBuilder.prototype.registerComponentDestructor = function registerComponentDestructor(state) {
+ this.push(61 /* RegisterComponentDestructor */, state);
+ };
+
+ BasicOpcodeBuilder.prototype.beginComponentTransaction = function beginComponentTransaction() {
+ this.push(65 /* BeginComponentTransaction */);
+ };
+
+ BasicOpcodeBuilder.prototype.commitComponentTransaction = function commitComponentTransaction() {
+ this.push(66 /* CommitComponentTransaction */);
+ };
+
+ BasicOpcodeBuilder.prototype.pushComponentOperations = function pushComponentOperations() {
+ this.push(62 /* PushComponentOperations */);
+ };
+
+ BasicOpcodeBuilder.prototype.getComponentSelf = function getComponentSelf(state) {
+ this.push(63 /* GetComponentSelf */, state);
+ };
+
+ BasicOpcodeBuilder.prototype.getComponentLayout = function getComponentLayout(state) {
+ this.push(64 /* GetComponentLayout */, state);
+ };
+
+ BasicOpcodeBuilder.prototype.didCreateElement = function didCreateElement(state) {
+ this.push(67 /* DidCreateElement */, state);
+ };
+
+ BasicOpcodeBuilder.prototype.didRenderLayout = function didRenderLayout(state) {
+ this.push(68 /* DidRenderLayout */, state);
+ };
+ // partial
+
+
+ BasicOpcodeBuilder.prototype.getPartialTemplate = function getPartialTemplate() {
+ this.push(69 /* GetPartialTemplate */);
+ };
+
+ BasicOpcodeBuilder.prototype.resolveMaybeLocal = function resolveMaybeLocal(name) {
+ this.push(70 /* ResolveMaybeLocal */, this.string(name));
+ };
+ // debugger
+
+
+ BasicOpcodeBuilder.prototype.debugger = function _debugger(symbols, evalInfo) {
+ this.push(71 /* Debugger */, this.constants.other(symbols), this.constants.array(evalInfo));
+ };
+ // content
+
+
+ BasicOpcodeBuilder.prototype.dynamicContent = function dynamicContent(Opcode) {
+ this.push(26 /* DynamicContent */, this.other(Opcode));
+ };
+
+ BasicOpcodeBuilder.prototype.cautiousAppend = function cautiousAppend() {
+ this.dynamicContent(new OptimizedCautiousAppendOpcode());
+ };
+
+ BasicOpcodeBuilder.prototype.trustingAppend = function trustingAppend() {
+ this.dynamicContent(new OptimizedTrustingAppendOpcode());
+ };
+ // dom
+
+
+ BasicOpcodeBuilder.prototype.text = function text(_text) {
+ this.push(24 /* Text */, this.constants.string(_text));
+ };
+
+ BasicOpcodeBuilder.prototype.openPrimitiveElement = function openPrimitiveElement(tag) {
+ this.push(27 /* OpenElement */, this.constants.string(tag));
+ };
+
+ BasicOpcodeBuilder.prototype.openElementWithOperations = function openElementWithOperations(tag) {
+ this.push(28 /* OpenElementWithOperations */, this.constants.string(tag));
+ };
+
+ BasicOpcodeBuilder.prototype.openDynamicElement = function openDynamicElement() {
+ this.push(29 /* OpenDynamicElement */);
+ };
+
+ BasicOpcodeBuilder.prototype.flushElement = function flushElement() {
+ this.push(33 /* FlushElement */);
+ };
+
+ BasicOpcodeBuilder.prototype.closeElement = function closeElement() {
+ this.push(34 /* CloseElement */);
+ };
+
+ BasicOpcodeBuilder.prototype.staticAttr = function staticAttr(_name, _namespace, _value) {
+ var name = this.constants.string(_name);
+ var namespace = _namespace ? this.constants.string(_namespace) : 0;
+ var value = this.constants.string(_value);
+ this.push(30 /* StaticAttr */, name, value, namespace);
+ };
+
+ BasicOpcodeBuilder.prototype.dynamicAttrNS = function dynamicAttrNS(_name, _namespace, trusting) {
+ var name = this.constants.string(_name);
+ var namespace = this.constants.string(_namespace);
+ this.push(32 /* DynamicAttrNS */, name, namespace, trusting === true ? 1 : 0);
+ };
+
+ BasicOpcodeBuilder.prototype.dynamicAttr = function dynamicAttr(_name, trusting) {
+ var name = this.constants.string(_name);
+ this.push(31 /* DynamicAttr */, name, trusting === true ? 1 : 0);
+ };
+
+ BasicOpcodeBuilder.prototype.comment = function comment(_comment) {
+ var comment = this.constants.string(_comment);
+ this.push(25 /* Comment */, comment);
+ };
+
+ BasicOpcodeBuilder.prototype.modifier = function modifier(_definition) {
+ this.push(35 /* Modifier */, this.other(_definition));
+ };
+ // lists
+
+
+ BasicOpcodeBuilder.prototype.putIterator = function putIterator() {
+ this.push(54 /* PutIterator */);
+ };
+
+ BasicOpcodeBuilder.prototype.enterList = function enterList(start) {
+ this.reserve(52 /* EnterList */);
+ this.labels.target(this.pos, 52 /* EnterList */, start);
+ };
+
+ BasicOpcodeBuilder.prototype.exitList = function exitList() {
+ this.push(53 /* ExitList */);
+ };
+
+ BasicOpcodeBuilder.prototype.iterate = function iterate(breaks) {
+ this.reserve(55 /* Iterate */);
+ this.labels.target(this.pos, 55 /* Iterate */, breaks);
+ };
+ // expressions
+
+
+ BasicOpcodeBuilder.prototype.setVariable = function setVariable(symbol) {
+ this.push(4 /* SetVariable */, symbol);
+ };
+
+ BasicOpcodeBuilder.prototype.getVariable = function getVariable(symbol) {
+ this.push(5 /* GetVariable */, symbol);
+ };
+
+ BasicOpcodeBuilder.prototype.getProperty = function getProperty(key) {
+ this.push(6 /* GetProperty */, this.string(key));
+ };
+
+ BasicOpcodeBuilder.prototype.getBlock = function getBlock(symbol) {
+ this.push(8 /* GetBlock */, symbol);
+ };
+
+ BasicOpcodeBuilder.prototype.hasBlock = function hasBlock(symbol) {
+ this.push(9 /* HasBlock */, symbol);
+ };
+
+ BasicOpcodeBuilder.prototype.hasBlockParams = function hasBlockParams(symbol) {
+ this.push(10 /* HasBlockParams */, symbol);
+ };
+
+ BasicOpcodeBuilder.prototype.concat = function concat(size) {
+ this.push(11 /* Concat */, size);
+ };
+
+ BasicOpcodeBuilder.prototype.function = function _function(f) {
+ this.push(2 /* Function */, this.func(f));
+ };
+
+ BasicOpcodeBuilder.prototype.load = function load(register) {
+ this.push(17 /* Load */, register);
+ };
+
+ BasicOpcodeBuilder.prototype.fetch = function fetch(register) {
+ this.push(18 /* Fetch */, register);
+ };
+
+ BasicOpcodeBuilder.prototype.dup = function dup() {
+ var register = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Register.sp;
+ var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
+
+ return this.push(15 /* Dup */, register, offset);
+ };
+
+ BasicOpcodeBuilder.prototype.pop = function pop() {
+ var count = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
+
+ return this.push(16 /* Pop */, count);
+ };
+ // vm
+
+
+ BasicOpcodeBuilder.prototype.pushRemoteElement = function pushRemoteElement() {
+ this.push(36 /* PushRemoteElement */);
+ };
+
+ BasicOpcodeBuilder.prototype.popRemoteElement = function popRemoteElement() {
+ this.push(37 /* PopRemoteElement */);
+ };
+
+ BasicOpcodeBuilder.prototype.label = function label(name) {
+ this.labels.label(name, this.nextPos);
+ };
+
+ BasicOpcodeBuilder.prototype.pushRootScope = function pushRootScope(symbols, bindCallerScope) {
+ this.push(19 /* RootScope */, symbols, bindCallerScope ? 1 : 0);
+ };
+
+ BasicOpcodeBuilder.prototype.pushChildScope = function pushChildScope() {
+ this.push(20 /* ChildScope */);
+ };
+
+ BasicOpcodeBuilder.prototype.popScope = function popScope() {
+ this.push(21 /* PopScope */);
+ };
+
+ BasicOpcodeBuilder.prototype.returnTo = function returnTo(label) {
+ this.reserve(23 /* ReturnTo */);
+ this.labels.target(this.pos, 23 /* ReturnTo */, label);
+ };
+
+ BasicOpcodeBuilder.prototype.pushDynamicScope = function pushDynamicScope() {
+ this.push(39 /* PushDynamicScope */);
+ };
+
+ BasicOpcodeBuilder.prototype.popDynamicScope = function popDynamicScope() {
+ this.push(40 /* PopDynamicScope */);
+ };
+
+ BasicOpcodeBuilder.prototype.pushImmediate = function pushImmediate(value) {
+ this.push(13 /* Constant */, this.other(value));
+ };
+
+ BasicOpcodeBuilder.prototype.primitive = function primitive(_primitive) {
+ var flag = 0;
+ var primitive = void 0;
+ switch (typeof _primitive) {
+ case 'number':
+ if (_primitive % 1 === 0 && _primitive > 0) {
+ primitive = _primitive;
+ } else {
+ primitive = this.float(_primitive);
+ flag = 1;
+ }
+ break;
+ case 'string':
+ primitive = this.string(_primitive);
+ flag = 2;
+ break;
+ case 'boolean':
+ primitive = _primitive | 0;
+ flag = 3;
+ break;
+ case 'object':
+ // assume null
+ primitive = 2;
+ flag = 3;
+ break;
+ case 'undefined':
+ primitive = 3;
+ flag = 3;
+ break;
+ default:
+ throw new Error('Invalid primitive passed to pushPrimitive');
+ }
+ this.push(14 /* PrimitiveReference */, flag << 30 | primitive);
+ };
+
+ BasicOpcodeBuilder.prototype.helper = function helper(func) {
+ this.push(1 /* Helper */, this.func(func));
+ };
+
+ BasicOpcodeBuilder.prototype.pushBlock = function pushBlock(block) {
+ this.push(7 /* PushBlock */, this.block(block));
+ };
+
+ BasicOpcodeBuilder.prototype.bindDynamicScope = function bindDynamicScope(_names) {
+ this.push(38 /* BindDynamicScope */, this.names(_names));
+ };
+
+ BasicOpcodeBuilder.prototype.enter = function enter(args) {
+ this.push(49 /* Enter */, args);
+ };
+
+ BasicOpcodeBuilder.prototype.exit = function exit() {
+ this.push(50 /* Exit */);
+ };
+
+ BasicOpcodeBuilder.prototype.return = function _return() {
+ this.push(22 /* Return */);
+ };
+
+ BasicOpcodeBuilder.prototype.pushFrame = function pushFrame() {
+ this.push(47 /* PushFrame */);
+ };
+
+ BasicOpcodeBuilder.prototype.popFrame = function popFrame() {
+ this.push(48 /* PopFrame */);
+ };
+
+ BasicOpcodeBuilder.prototype.compileDynamicBlock = function compileDynamicBlock() {
+ this.push(41 /* CompileDynamicBlock */);
+ };
+
+ BasicOpcodeBuilder.prototype.invokeDynamic = function invokeDynamic(invoker) {
+ this.push(43 /* InvokeDynamic */, this.other(invoker));
+ };
+
+ BasicOpcodeBuilder.prototype.invokeStatic = function invokeStatic(block) {
+ var callerCount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
+ var parameters = block.symbolTable.parameters;
+
+ var calleeCount = parameters.length;
+ var count = Math.min(callerCount, calleeCount);
+ this.pushFrame();
+ if (count) {
+ this.pushChildScope();
+ for (var i = 0; i < count; i++) {
+ this.dup(Register.fp, callerCount - i);
+ this.setVariable(parameters[i]);
+ }
+ }
+ var _block = this.constants.block(block);
+ this.push(42 /* InvokeStatic */, _block);
+ if (count) {
+ this.popScope();
+ }
+ this.popFrame();
+ };
+
+ BasicOpcodeBuilder.prototype.test = function test(testFunc) {
+ var _func = void 0;
+ if (testFunc === 'const') {
+ _func = ConstTest;
+ } else if (testFunc === 'simple') {
+ _func = SimpleTest;
+ } else if (testFunc === 'environment') {
+ _func = EnvironmentTest;
+ } else if (typeof testFunc === 'function') {
+ _func = testFunc;
+ } else {
+ throw new Error('unreachable');
+ }
+ var func = this.constants.function(_func);
+ this.push(51 /* Test */, func);
+ };
+
+ BasicOpcodeBuilder.prototype.jump = function jump(target) {
+ this.reserve(44 /* Jump */);
+ this.labels.target(this.pos, 44 /* Jump */, target);
+ };
+
+ BasicOpcodeBuilder.prototype.jumpIf = function jumpIf(target) {
+ this.reserve(45 /* JumpIf */);
+ this.labels.target(this.pos, 45 /* JumpIf */, target);
+ };
+
+ BasicOpcodeBuilder.prototype.jumpUnless = function jumpUnless(target) {
+ this.reserve(46 /* JumpUnless */);
+ this.labels.target(this.pos, 46 /* JumpUnless */, target);
+ };
+
+ BasicOpcodeBuilder.prototype.string = function string(_string) {
+ return this.constants.string(_string);
+ };
+
+ BasicOpcodeBuilder.prototype.float = function float(num) {
+ return this.constants.float(num);
+ };
+
+ BasicOpcodeBuilder.prototype.names = function names(_names) {
+ var names = [];
+ for (var i = 0; i < _names.length; i++) {
+ var n = _names[i];
+ names[i] = this.constants.string(n);
+ }
+ return this.constants.array(names);
+ };
+
+ BasicOpcodeBuilder.prototype.symbols = function symbols(_symbols) {
+ return this.constants.array(_symbols);
+ };
+
+ BasicOpcodeBuilder.prototype.other = function other(value) {
+ return this.constants.other(value);
+ };
+
+ BasicOpcodeBuilder.prototype.block = function block(_block2) {
+ return _block2 ? this.constants.block(_block2) : 0;
+ };
+
+ BasicOpcodeBuilder.prototype.func = function func(_func2) {
+ return this.constants.function(_func2);
+ };
+
+ _createClass$1(BasicOpcodeBuilder, [{
+ key: 'pos',
+ get: function () {
+ return (0, _util.typePos)(this.heap.size());
+ }
+ }, {
+ key: 'nextPos',
+ get: function () {
+ return this.heap.size();
+ }
+ }, {
+ key: 'labels',
+ get: function () {
+ return this.labelsStack.current;
+ }
+ }]);
+
+ return BasicOpcodeBuilder;
+ }();
+
+ function isCompilableExpression(expr$$1) {
+ return typeof expr$$1 === 'object' && expr$$1 !== null && typeof expr$$1.compile === 'function';
+ }
+
+ var OpcodeBuilder = function (_BasicOpcodeBuilder) {
+ _inherits$9(OpcodeBuilder, _BasicOpcodeBuilder);
+
+ function OpcodeBuilder(env, meta) {
+ var program = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : env.program;
+
+ _classCallCheck$19(this, OpcodeBuilder);
+
+ var _this = _possibleConstructorReturn$9(this, _BasicOpcodeBuilder.call(this, env, meta, program));
+
+ _this.component = new ComponentBuilder(_this);
+ return _this;
+ }
+
+ OpcodeBuilder.prototype.compileArgs = function compileArgs(params, hash, synthetic) {
+ var positional = 0;
+ if (params) {
+ for (var i = 0; i < params.length; i++) {
+ expr(params[i], this);
+ }
+ positional = params.length;
+ }
+ this.pushImmediate(positional);
+ var names = _util.EMPTY_ARRAY;
+ if (hash) {
+ names = hash[0];
+ var val = hash[1];
+ for (var _i = 0; _i < val.length; _i++) {
+ expr(val[_i], this);
+ }
+ }
+ this.pushImmediate(names);
+ this.pushArgs(synthetic);
+ };
+
+ OpcodeBuilder.prototype.compile = function compile(expr$$1) {
+ if (isCompilableExpression(expr$$1)) {
+ return expr$$1.compile(this);
+ } else {
+ return expr$$1;
+ }
+ };
+
+ OpcodeBuilder.prototype.guardedAppend = function guardedAppend(expression, trusting) {
+ this.startLabels();
+ this.pushFrame();
+ this.returnTo('END');
+ expr(expression, this);
+ this.dup();
+ this.test(function (reference$$1) {
+ return IsComponentDefinitionReference.create(reference$$1);
+ });
+ this.enter(2);
+ this.jumpUnless('ELSE');
+ this.pushDynamicComponentManager();
+ this.invokeComponent(null, null, null, null, null);
+ this.exit();
+ this.return();
+ this.label('ELSE');
+ if (trusting) {
+ this.trustingAppend();
+ } else {
+ this.cautiousAppend();
+ }
+ this.exit();
+ this.return();
+ this.label('END');
+ this.popFrame();
+ this.stopLabels();
+ };
+
+ OpcodeBuilder.prototype.invokeComponent = function invokeComponent(attrs, params, hash, block) {
+ var inverse = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;
+
+ this.fetch(Register.s0);
+ this.dup(Register.sp, 1);
+ this.load(Register.s0);
+ this.pushBlock(block);
+ this.pushBlock(inverse);
+ this.compileArgs(params, hash, false);
+ this.prepareArgs(Register.s0);
+ this.beginComponentTransaction();
+ this.pushDynamicScope();
+ this.createComponent(Register.s0, block !== null, inverse !== null);
+ this.registerComponentDestructor(Register.s0);
+ this.getComponentSelf(Register.s0);
+ this.getComponentLayout(Register.s0);
+ this.invokeDynamic(new InvokeDynamicLayout(attrs && attrs.scan()));
+ this.popFrame();
+ this.popScope();
+ this.popDynamicScope();
+ this.commitComponentTransaction();
+ this.load(Register.s0);
+ };
+
+ OpcodeBuilder.prototype.template = function template(block) {
+ if (!block) return null;
+ return new RawInlineBlock(this.meta, block.statements, block.parameters);
+ };
+
+ return OpcodeBuilder;
+ }(BasicOpcodeBuilder);
+
+ function _classCallCheck$18(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ var Ops$3 = _wireFormat.Ops;
+ var ATTRS_BLOCK = '&attrs';
+
+ var Compilers = function () {
+ function Compilers() {
+ var offset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
+
+ _classCallCheck$18(this, Compilers);
+
+ this.offset = offset;
+ this.names = (0, _util.dict)();
+ this.funcs = [];
+ }
+
+ Compilers.prototype.add = function add(name, func) {
+ this.funcs.push(func);
+ this.names[name] = this.funcs.length - 1;
+ };
+
+ Compilers.prototype.compile = function compile(sexp, builder) {
+ var name = sexp[this.offset];
+ var index = this.names[name];
+ var func = this.funcs[index];
+ (0, _util.assert)(!!func, 'expected an implementation for ' + (this.offset === 0 ? Ops$3[sexp[0]] : Ops$2[sexp[1]]));
+ func(sexp, builder);
+ };
+
+ return Compilers;
+ }();
+
+ var STATEMENTS = new Compilers();
+ var CLIENT_SIDE = new Compilers(1);
+ STATEMENTS.add(Ops$3.Text, function (sexp, builder) {
+ builder.text(sexp[1]);
+ });
+ STATEMENTS.add(Ops$3.Comment, function (sexp, builder) {
+ builder.comment(sexp[1]);
+ });
+ STATEMENTS.add(Ops$3.CloseElement, function (_sexp, builder) {
+ builder.closeElement();
+ });
+ STATEMENTS.add(Ops$3.FlushElement, function (_sexp, builder) {
+ builder.flushElement();
+ });
+ STATEMENTS.add(Ops$3.Modifier, function (sexp, builder) {
+ var env = builder.env,
+ meta = builder.meta;
+ var name = sexp[1],
+ params = sexp[2],
+ hash = sexp[3];
+
+ if (env.hasModifier(name, meta.templateMeta)) {
+ builder.compileArgs(params, hash, true);
+ builder.modifier(env.lookupModifier(name, meta.templateMeta));
+ } else {
+ throw new Error('Compile Error ' + name + ' is not a modifier: Helpers may not be used in the element form.');
+ }
+ });
+ STATEMENTS.add(Ops$3.StaticAttr, function (sexp, builder) {
+ var name = sexp[1],
+ value = sexp[2],
+ namespace = sexp[3];
+
+ builder.staticAttr(name, namespace, value);
+ });
+ STATEMENTS.add(Ops$3.DynamicAttr, function (sexp, builder) {
+ dynamicAttr(sexp, false, builder);
+ });
+ STATEMENTS.add(Ops$3.TrustingAttr, function (sexp, builder) {
+ dynamicAttr(sexp, true, builder);
+ });
+ function dynamicAttr(sexp, trusting, builder) {
+ var name = sexp[1],
+ value = sexp[2],
+ namespace = sexp[3];
+
+ expr(value, builder);
+ if (namespace) {
+ builder.dynamicAttrNS(name, namespace, trusting);
+ } else {
+ builder.dynamicAttr(name, trusting);
+ }
+ }
+ STATEMENTS.add(Ops$3.OpenElement, function (sexp, builder) {
+ builder.openPrimitiveElement(sexp[1]);
+ });
+ CLIENT_SIDE.add(Ops$2.OpenComponentElement, function (sexp, builder) {
+ builder.pushComponentOperations();
+ builder.openElementWithOperations(sexp[2]);
+ });
+ CLIENT_SIDE.add(Ops$2.DidCreateElement, function (_sexp, builder) {
+ builder.didCreateElement(Register.s0);
+ });
+ CLIENT_SIDE.add(Ops$2.DidRenderLayout, function (_sexp, builder) {
+ builder.didRenderLayout(Register.s0);
+ });
+ STATEMENTS.add(Ops$3.Append, function (sexp, builder) {
+ var value = sexp[1],
+ trusting = sexp[2];
+
+ var _builder$env$macros = builder.env.macros(),
+ inlines = _builder$env$macros.inlines;
+
+ var returned = inlines.compile(sexp, builder) || value;
+ if (returned === true) return;
+ var isGet = E.isGet(value);
+ var isMaybeLocal = E.isMaybeLocal(value);
+ if (trusting) {
+ builder.guardedAppend(value, true);
+ } else {
+ if (isGet || isMaybeLocal) {
+ builder.guardedAppend(value, false);
+ } else {
+ expr(value, builder);
+ builder.cautiousAppend();
+ }
+ }
+ });
+ STATEMENTS.add(Ops$3.Block, function (sexp, builder) {
+ var name = sexp[1],
+ params = sexp[2],
+ hash = sexp[3],
+ _template = sexp[4],
+ _inverse = sexp[5];
+
+ var template = builder.template(_template);
+ var inverse = builder.template(_inverse);
+ var templateBlock = template && template.scan();
+ var inverseBlock = inverse && inverse.scan();
+
+ var _builder$env$macros2 = builder.env.macros(),
+ blocks = _builder$env$macros2.blocks;
+
+ blocks.compile(name, params, hash, templateBlock, inverseBlock, builder);
+ });
+ var InvokeDynamicLayout = function () {
+ function InvokeDynamicLayout(attrs) {
+ _classCallCheck$18(this, InvokeDynamicLayout);
+
+ this.attrs = attrs;
+ }
+
+ InvokeDynamicLayout.prototype.invoke = function invoke(vm, layout) {
+ var _layout$symbolTable = layout.symbolTable,
+ symbols = _layout$symbolTable.symbols,
+ hasEval = _layout$symbolTable.hasEval;
+
+ var stack = vm.stack;
+ var scope = vm.pushRootScope(symbols.length + 1, true);
+ scope.bindSelf(stack.pop());
+ scope.bindBlock(symbols.indexOf(ATTRS_BLOCK) + 1, this.attrs);
+ var lookup = null;
+ var $eval = -1;
+ if (hasEval) {
+ $eval = symbols.indexOf('$eval') + 1;
+ lookup = (0, _util.dict)();
+ }
+ var callerNames = stack.pop();
+ for (var i = callerNames.length - 1; i >= 0; i--) {
+ var symbol = symbols.indexOf(callerNames[i]);
+ var value = stack.pop();
+ if (symbol !== -1) scope.bindSymbol(symbol + 1, value);
+ if (hasEval) lookup[callerNames[i]] = value;
+ }
+ var numPositionalArgs = stack.pop();
+ (0, _util.assert)(typeof numPositionalArgs === 'number', '[BUG] Incorrect value of positional argument count found during invoke-dynamic-layout.');
+ // Currently we don't support accessing positional args in templates, so just throw them away
+ stack.pop(numPositionalArgs);
+ var inverseSymbol = symbols.indexOf('&inverse');
+ var inverse = stack.pop();
+ if (inverseSymbol !== -1) {
+ scope.bindBlock(inverseSymbol + 1, inverse);
+ }
+ if (lookup) lookup['&inverse'] = inverse;
+ var defaultSymbol = symbols.indexOf('&default');
+ var defaultBlock = stack.pop();
+ if (defaultSymbol !== -1) {
+ scope.bindBlock(defaultSymbol + 1, defaultBlock);
+ }
+ if (lookup) lookup['&default'] = defaultBlock;
+ if (lookup) scope.bindEvalScope(lookup);
+ vm.pushFrame();
+ vm.call(layout.handle);
+ };
+
+ InvokeDynamicLayout.prototype.toJSON = function toJSON() {
+ return { GlimmerDebug: '<invoke-dynamic-layout>' };
+ };
+
+ return InvokeDynamicLayout;
+ }();
+ STATEMENTS.add(Ops$3.Component, function (sexp, builder) {
+ var tag = sexp[1],
+ attrs = sexp[2],
+ args = sexp[3],
+ block = sexp[4];
+
+ if (builder.env.hasComponentDefinition(tag, builder.meta.templateMeta)) {
+ var child = builder.template(block);
+ var attrsBlock = new RawInlineBlock(builder.meta, attrs, _util.EMPTY_ARRAY);
+ var definition = builder.env.getComponentDefinition(tag, builder.meta.templateMeta);
+ builder.pushComponentManager(definition);
+ builder.invokeComponent(attrsBlock, null, args, child && child.scan());
+ } else if (block && block.parameters.length) {
+ throw new Error('Compile Error: Cannot find component ' + tag);
+ } else {
+ builder.openPrimitiveElement(tag);
+ for (var i = 0; i < attrs.length; i++) {
+ STATEMENTS.compile(attrs[i], builder);
+ }
+ builder.flushElement();
+ if (block) {
+ var stmts = block.statements;
+ for (var _i = 0; _i < stmts.length; _i++) {
+ STATEMENTS.compile(stmts[_i], builder);
+ }
+ }
+ builder.closeElement();
+ }
+ });
+ var PartialInvoker = function () {
+ function PartialInvoker(outerSymbols, evalInfo) {
+ _classCallCheck$18(this, PartialInvoker);
+
+ this.outerSymbols = outerSymbols;
+ this.evalInfo = evalInfo;
+ }
+
+ PartialInvoker.prototype.invoke = function invoke(vm, _partial) {
+ var partial = _partial;
+ var partialSymbols = partial.symbolTable.symbols;
+ var outerScope = vm.scope();
+ var evalScope = outerScope.getEvalScope();
+ var partialScope = vm.pushRootScope(partialSymbols.length, false);
+ partialScope.bindCallerScope(outerScope.getCallerScope());
+ partialScope.bindEvalScope(evalScope);
+ partialScope.bindSelf(outerScope.getSelf());
+ var evalInfo = this.evalInfo,
+ outerSymbols = this.outerSymbols;
+
+ var locals = Object.create(outerScope.getPartialMap());
+ for (var i = 0; i < evalInfo.length; i++) {
+ var slot = evalInfo[i];
+ var name = outerSymbols[slot - 1];
+ var ref = outerScope.getSymbol(slot);
+ locals[name] = ref;
+ }
+ if (evalScope) {
+ for (var _i2 = 0; _i2 < partialSymbols.length; _i2++) {
+ var _name = partialSymbols[_i2];
+ var symbol = _i2 + 1;
+ var value = evalScope[_name];
+ if (value !== undefined) partialScope.bind(symbol, value);
+ }
+ }
+ partialScope.bindPartialMap(locals);
+ vm.pushFrame();
+ vm.call(partial.handle);
+ };
+
+ return PartialInvoker;
+ }();
+ STATEMENTS.add(Ops$3.Partial, function (sexp, builder) {
+ var name = sexp[1],
+ evalInfo = sexp[2];
+ var _builder$meta = builder.meta,
+ templateMeta = _builder$meta.templateMeta,
+ symbols = _builder$meta.symbols;
+
+ function helper(vm, args) {
+ var env = vm.env;
+
+ var nameRef = args.positional.at(0);
+ return (0, _reference2.map)(nameRef, function (n) {
+ if (typeof n === 'string' && n) {
+ if (!env.hasPartial(n, templateMeta)) {
+ throw new Error('Could not find a partial named "' + n + '"');
+ }
+ return env.lookupPartial(n, templateMeta);
+ } else if (n) {
+ throw new Error('Could not find a partial named "' + String(n) + '"');
+ } else {
+ return null;
+ }
+ });
+ }
+ builder.startLabels();
+ builder.pushFrame();
+ builder.returnTo('END');
+ expr(name, builder);
+ builder.pushImmediate(1);
+ builder.pushImmediate(_util.EMPTY_ARRAY);
+ builder.pushArgs(true);
+ builder.helper(helper);
+ builder.dup();
+ builder.test('simple');
+ builder.enter(2);
+ builder.jumpUnless('ELSE');
+ builder.getPartialTemplate();
+ builder.compileDynamicBlock();
+ builder.invokeDynamic(new PartialInvoker(symbols, evalInfo));
+ builder.popScope();
+ builder.popFrame();
+ builder.label('ELSE');
+ builder.exit();
+ builder.return();
+ builder.label('END');
+ builder.popFrame();
+ builder.stopLabels();
+ });
+
+ var InvokeDynamicYield = function () {
+ function InvokeDynamicYield(callerCount) {
+ _classCallCheck$18(this, InvokeDynamicYield);
+
+ this.callerCount = callerCount;
+ }
+
+ InvokeDynamicYield.prototype.invoke = function invoke(vm, block) {
+ var callerCount = this.callerCount;
+
+ var stack = vm.stack;
+ if (!block) {
+ // To balance the pop{Frame,Scope}
+ vm.pushFrame();
+ vm.pushCallerScope();
+ return;
+ }
+ var table = block.symbolTable;
+ var locals = table.parameters; // always present in inline blocks
+ var calleeCount = locals ? locals.length : 0;
+ var count = Math.min(callerCount, calleeCount);
+ vm.pushFrame();
+ vm.pushCallerScope(calleeCount > 0);
+ var scope = vm.scope();
+ for (var i = 0; i < count; i++) {
+ scope.bindSymbol(locals[i], stack.fromBase(callerCount - i));
+ }
+ vm.call(block.handle);
+ };
+
+ InvokeDynamicYield.prototype.toJSON = function toJSON() {
+ return { GlimmerDebug: '<invoke-dynamic-yield caller-count=' + this.callerCount + '>' };
+ };
+
+ return InvokeDynamicYield;
+ }();
+
+ STATEMENTS.add(Ops$3.Yield, function (sexp, builder) {
+ var to = sexp[1],
+ params = sexp[2];
+
+ var count = compileList(params, builder);
+ builder.getBlock(to);
+ builder.compileDynamicBlock();
+ builder.invokeDynamic(new InvokeDynamicYield(count));
+ builder.popScope();
+ builder.popFrame();
+ if (count) {
+ builder.pop(count);
+ }
+ });
+ STATEMENTS.add(Ops$3.Debugger, function (sexp, builder) {
+ var evalInfo = sexp[1];
+
+ builder.debugger(builder.meta.symbols, evalInfo);
+ });
+ STATEMENTS.add(Ops$3.ClientSideStatement, function (sexp, builder) {
+ CLIENT_SIDE.compile(sexp, builder);
+ });
+ var EXPRESSIONS = new Compilers();
+ var CLIENT_SIDE_EXPRS = new Compilers(1);
+ var E = _wireFormat.Expressions;
+ function expr(expression, builder) {
+ if (Array.isArray(expression)) {
+ EXPRESSIONS.compile(expression, builder);
+ } else {
+ builder.primitive(expression);
+ }
+ }
+ EXPRESSIONS.add(Ops$3.Unknown, function (sexp, builder) {
+ var name = sexp[1];
+ if (builder.env.hasHelper(name, builder.meta.templateMeta)) {
+ EXPRESSIONS.compile([Ops$3.Helper, name, _util.EMPTY_ARRAY, null], builder);
+ } else if (builder.meta.asPartial) {
+ builder.resolveMaybeLocal(name);
+ } else {
+ builder.getVariable(0);
+ builder.getProperty(name);
+ }
+ });
+ EXPRESSIONS.add(Ops$3.Concat, function (sexp, builder) {
+ var parts = sexp[1];
+ for (var i = 0; i < parts.length; i++) {
+ expr(parts[i], builder);
+ }
+ builder.concat(parts.length);
+ });
+ CLIENT_SIDE_EXPRS.add(Ops$2.FunctionExpression, function (sexp, builder) {
+ builder.function(sexp[2]);
+ });
+ EXPRESSIONS.add(Ops$3.Helper, function (sexp, builder) {
+ var env = builder.env,
+ meta = builder.meta;
+ var name = sexp[1],
+ params = sexp[2],
+ hash = sexp[3];
+
+ if (env.hasHelper(name, meta.templateMeta)) {
+ builder.compileArgs(params, hash, true);
+ builder.helper(env.lookupHelper(name, meta.templateMeta));
+ } else {
+ throw new Error('Compile Error: ' + name + ' is not a helper');
+ }
+ });
+ EXPRESSIONS.add(Ops$3.Get, function (sexp, builder) {
+ var head = sexp[1],
+ path = sexp[2];
+
+ builder.getVariable(head);
+ for (var i = 0; i < path.length; i++) {
+ builder.getProperty(path[i]);
+ }
+ });
+ EXPRESSIONS.add(Ops$3.MaybeLocal, function (sexp, builder) {
+ var path = sexp[1];
+
+ if (builder.meta.asPartial) {
+ var head = path[0];
+ path = path.slice(1);
+ builder.resolveMaybeLocal(head);
+ } else {
+ builder.getVariable(0);
+ }
+ for (var i = 0; i < path.length; i++) {
+ builder.getProperty(path[i]);
+ }
+ });
+ EXPRESSIONS.add(Ops$3.Undefined, function (_sexp, builder) {
+ return builder.primitive(undefined);
+ });
+ EXPRESSIONS.add(Ops$3.HasBlock, function (sexp, builder) {
+ builder.hasBlock(sexp[1]);
+ });
+ EXPRESSIONS.add(Ops$3.HasBlockParams, function (sexp, builder) {
+ builder.hasBlockParams(sexp[1]);
+ });
+ EXPRESSIONS.add(Ops$3.ClientSideExpression, function (sexp, builder) {
+ CLIENT_SIDE_EXPRS.compile(sexp, builder);
+ });
+ function compileList(params, builder) {
+ if (!params) return 0;
+ for (var i = 0; i < params.length; i++) {
+ expr(params[i], builder);
+ }
+ return params.length;
+ }
+ var Blocks = function () {
+ function Blocks() {
+ _classCallCheck$18(this, Blocks);
+
+ this.names = (0, _util.dict)();
+ this.funcs = [];
+ }
+
+ Blocks.prototype.add = function add(name, func) {
+ this.funcs.push(func);
+ this.names[name] = this.funcs.length - 1;
+ };
+
+ Blocks.prototype.addMissing = function addMissing(func) {
+ this.missing = func;
+ };
+
+ Blocks.prototype.compile = function compile(name, params, hash, template, inverse, builder) {
+ var index = this.names[name];
+ if (index === undefined) {
+ (0, _util.assert)(!!this.missing, name + ' not found, and no catch-all block handler was registered');
+ var func = this.missing;
+ var handled = func(name, params, hash, template, inverse, builder);
+ (0, _util.assert)(!!handled, name + ' not found, and the catch-all block handler didn\'t handle it');
+ } else {
+ var _func = this.funcs[index];
+ _func(params, hash, template, inverse, builder);
+ }
+ };
+
+ return Blocks;
+ }();
+ var BLOCKS = new Blocks();
+ var Inlines = function () {
+ function Inlines() {
+ _classCallCheck$18(this, Inlines);
+
+ this.names = (0, _util.dict)();
+ this.funcs = [];
+ }
+
+ Inlines.prototype.add = function add(name, func) {
+ this.funcs.push(func);
+ this.names[name] = this.funcs.length - 1;
+ };
+
+ Inlines.prototype.addMissing = function addMissing(func) {
+ this.missing = func;
+ };
+
+ Inlines.prototype.compile = function compile(sexp, builder) {
+ var value = sexp[1];
+ // TODO: Fix this so that expression macros can return
+ // things like components, so that {{component foo}}
+ // is the same as {{(component foo)}}
+ if (!Array.isArray(value)) return ['expr', value];
+ var name = void 0;
+ var params = void 0;
+ var hash = void 0;
+ if (value[0] === Ops$3.Helper) {
+ name = value[1];
+ params = value[2];
+ hash = value[3];
+ } else if (value[0] === Ops$3.Unknown) {
+ name = value[1];
+ params = hash = null;
+ } else {
+ return ['expr', value];
+ }
+ var index = this.names[name];
+ if (index === undefined && this.missing) {
+ var func = this.missing;
+ var returned = func(name, params, hash, builder);
+ return returned === false ? ['expr', value] : returned;
+ } else if (index !== undefined) {
+ var _func2 = this.funcs[index];
+ var _returned = _func2(name, params, hash, builder);
+ return _returned === false ? ['expr', value] : _returned;
+ } else {
+ return ['expr', value];
+ }
+ };
+
+ return Inlines;
+ }();
+ var INLINES = new Inlines();
+ populateBuiltins(BLOCKS, INLINES);
+ function populateBuiltins() {
+ var blocks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Blocks();
+ var inlines = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Inlines();
+
+ blocks.add('if', function (params, _hash, template, inverse, builder) {
+ // PutArgs
+ // Test(Environment)
+ // Enter(BEGIN, END)
+ // BEGIN: Noop
+ // JumpUnless(ELSE)
+ // Evaluate(default)
+ // Jump(END)
+ // ELSE: Noop
+ // Evalulate(inverse)
+ // END: Noop
+ // Exit
+ if (!params || params.length !== 1) {
+ throw new Error('SYNTAX ERROR: #if requires a single argument');
+ }
+ builder.startLabels();
+ builder.pushFrame();
+ builder.returnTo('END');
+ expr(params[0], builder);
+ builder.test('environment');
+ builder.enter(1);
+ builder.jumpUnless('ELSE');
+ builder.invokeStatic(template);
+ if (inverse) {
+ builder.jump('EXIT');
+ builder.label('ELSE');
+ builder.invokeStatic(inverse);
+ builder.label('EXIT');
+ builder.exit();
+ builder.return();
+ } else {
+ builder.label('ELSE');
+ builder.exit();
+ builder.return();
+ }
+ builder.label('END');
+ builder.popFrame();
+ builder.stopLabels();
+ });
+ blocks.add('unless', function (params, _hash, template, inverse, builder) {
+ // PutArgs
+ // Test(Environment)
+ // Enter(BEGIN, END)
+ // BEGIN: Noop
+ // JumpUnless(ELSE)
+ // Evaluate(default)
+ // Jump(END)
+ // ELSE: Noop
+ // Evalulate(inverse)
+ // END: Noop
+ // Exit
+ if (!params || params.length !== 1) {
+ throw new Error('SYNTAX ERROR: #unless requires a single argument');
+ }
+ builder.startLabels();
+ builder.pushFrame();
+ builder.returnTo('END');
+ expr(params[0], builder);
+ builder.test('environment');
+ builder.enter(1);
+ builder.jumpIf('ELSE');
+ builder.invokeStatic(template);
+ if (inverse) {
+ builder.jump('EXIT');
+ builder.label('ELSE');
+ builder.invokeStatic(inverse);
+ builder.label('EXIT');
+ builder.exit();
+ builder.return();
+ } else {
+ builder.label('ELSE');
+ builder.exit();
+ builder.return();
+ }
+ builder.label('END');
+ builder.popFrame();
+ builder.stopLabels();
+ });
+ blocks.add('with', function (params, _hash, template, inverse, builder) {
+ // PutArgs
+ // Test(Environment)
+ // Enter(BEGIN, END)
+ // BEGIN: Noop
+ // JumpUnless(ELSE)
+ // Evaluate(default)
+ // Jump(END)
+ // ELSE: Noop
+ // Evalulate(inverse)
+ // END: Noop
+ // Exit
+ if (!params || params.length !== 1) {
+ throw new Error('SYNTAX ERROR: #with requires a single argument');
+ }
+ builder.startLabels();
+ builder.pushFrame();
+ builder.returnTo('END');
+ expr(params[0], builder);
+ builder.dup();
+ builder.test('environment');
+ builder.enter(2);
+ builder.jumpUnless('ELSE');
+ builder.invokeStatic(template, 1);
+ if (inverse) {
+ builder.jump('EXIT');
+ builder.label('ELSE');
+ builder.invokeStatic(inverse);
+ builder.label('EXIT');
+ builder.exit();
+ builder.return();
+ } else {
+ builder.label('ELSE');
+ builder.exit();
+ builder.return();
+ }
+ builder.label('END');
+ builder.popFrame();
+ builder.stopLabels();
+ });
+ blocks.add('each', function (params, hash, template, inverse, builder) {
+ // Enter(BEGIN, END)
+ // BEGIN: Noop
+ // PutArgs
+ // PutIterable
+ // JumpUnless(ELSE)
+ // EnterList(BEGIN2, END2)
+ // ITER: Noop
+ // NextIter(BREAK)
+ // BEGIN2: Noop
+ // PushChildScope
+ // Evaluate(default)
+ // PopScope
+ // END2: Noop
+ // Exit
+ // Jump(ITER)
+ // BREAK: Noop
+ // ExitList
+ // Jump(END)
+ // ELSE: Noop
+ // Evalulate(inverse)
+ // END: Noop
+ // Exit
+ builder.startLabels();
+ builder.pushFrame();
+ builder.returnTo('END');
+ if (hash && hash[0][0] === 'key') {
+ expr(hash[1][0], builder);
+ } else {
+ builder.primitive(null);
+ }
+ expr(params[0], builder);
+ builder.enter(2);
+ builder.putIterator();
+ builder.jumpUnless('ELSE');
+ builder.pushFrame();
+ builder.returnTo('ITER');
+ builder.dup(Register.fp, 1);
+ builder.enterList('BODY');
+ builder.label('ITER');
+ builder.iterate('BREAK');
+ builder.label('BODY');
+ builder.invokeStatic(template, 2);
+ builder.pop(2);
+ builder.exit();
+ builder.return();
+ builder.label('BREAK');
+ builder.exitList();
+ builder.popFrame();
+ if (inverse) {
+ builder.jump('EXIT');
+ builder.label('ELSE');
+ builder.invokeStatic(inverse);
+ builder.label('EXIT');
+ builder.exit();
+ builder.return();
+ } else {
+ builder.label('ELSE');
+ builder.exit();
+ builder.return();
+ }
+ builder.label('END');
+ builder.popFrame();
+ builder.stopLabels();
+ });
+ blocks.add('-in-element', function (params, hash, template, _inverse, builder) {
+ if (!params || params.length !== 1) {
+ throw new Error('SYNTAX ERROR: #-in-element requires a single argument');
+ }
+ builder.startLabels();
+ builder.pushFrame();
+ builder.returnTo('END');
+ if (hash && hash[0].length) {
+ var keys = hash[0],
+ values = hash[1];
+
+ if (keys.length === 1 && keys[0] === 'nextSibling') {
+ expr(values[0], builder);
+ } else {
+ throw new Error('SYNTAX ERROR: #-in-element does not take a `' + keys[0] + '` option');
+ }
+ } else {
+ expr(null, builder);
+ }
+ expr(params[0], builder);
+ builder.dup();
+ builder.test('simple');
+ builder.enter(3);
+ builder.jumpUnless('ELSE');
+ builder.pushRemoteElement();
+ builder.invokeStatic(template);
+ builder.popRemoteElement();
+ builder.label('ELSE');
+ builder.exit();
+ builder.return();
+ builder.label('END');
+ builder.popFrame();
+ builder.stopLabels();
+ });
+ blocks.add('-with-dynamic-vars', function (_params, hash, template, _inverse, builder) {
+ if (hash) {
+ var names = hash[0],
+ expressions = hash[1];
+
+ compileList(expressions, builder);
+ builder.pushDynamicScope();
+ builder.bindDynamicScope(names);
+ builder.invokeStatic(template);
+ builder.popDynamicScope();
+ } else {
+ builder.invokeStatic(template);
+ }
+ });
+ return { blocks: blocks, inlines: inlines };
+ }
+ function compileStatement(statement, builder) {
+ STATEMENTS.compile(statement, builder);
+ }
+ function compileStatements(statements, meta, env) {
+ var b = new OpcodeBuilder(env, meta);
+ for (var i = 0; i < statements.length; i++) {
+ compileStatement(statements[i], b);
+ }
+ return b;
+ }
+
+ function _classCallCheck$16(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ var CompilableTemplate = function () {
+ function CompilableTemplate(statements, symbolTable) {
+ _classCallCheck$16(this, CompilableTemplate);
+
+ this.statements = statements;
+ this.symbolTable = symbolTable;
+ this.compiledStatic = null;
+ this.compiledDynamic = null;
+ }
+
+ CompilableTemplate.prototype.compileStatic = function compileStatic(env) {
+ var compiledStatic = this.compiledStatic;
+
+ if (!compiledStatic) {
+ var builder = compileStatements(this.statements, this.symbolTable.meta, env);
+ builder.finalize();
+ var handle = builder.start;
+ compiledStatic = this.compiledStatic = new CompiledStaticTemplate(handle);
+ }
+ return compiledStatic;
+ };
+
+ CompilableTemplate.prototype.compileDynamic = function compileDynamic(env) {
+ var compiledDynamic = this.compiledDynamic;
+
+ if (!compiledDynamic) {
+ var staticBlock = this.compileStatic(env);
+ compiledDynamic = new CompiledDynamicTemplate(staticBlock.handle, this.symbolTable);
+ }
+ return compiledDynamic;
+ };
+
+ return CompilableTemplate;
+ }();
+
+ function _classCallCheck$15(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ var Ops$1 = _wireFormat.Ops;
+
+ var Scanner = function () {
+ function Scanner(block, env) {
+ _classCallCheck$15(this, Scanner);
+
+ this.block = block;
+ this.env = env;
+ }
+
+ Scanner.prototype.scanEntryPoint = function scanEntryPoint(meta) {
+ var block = this.block;
+ var statements = block.statements,
+ symbols = block.symbols,
+ hasEval = block.hasEval;
+
+ return new CompilableTemplate(statements, { meta: meta, symbols: symbols, hasEval: hasEval });
+ };
+
+ Scanner.prototype.scanBlock = function scanBlock(meta) {
+ var block = this.block;
+ var statements = block.statements;
+
+ return new CompilableTemplate(statements, { meta: meta, parameters: _util.EMPTY_ARRAY });
+ };
+
+ Scanner.prototype.scanLayout = function scanLayout(meta, attrs, componentName) {
+ var block = this.block;
+ var statements = block.statements,
+ symbols = block.symbols,
+ hasEval = block.hasEval;
+
+ var symbolTable = { meta: meta, hasEval: hasEval, symbols: symbols };
+ var newStatements = [];
+ var toplevel = void 0;
+ var inTopLevel = false;
+ for (var i = 0; i < statements.length; i++) {
+ var statement = statements[i];
+ if (_wireFormat.Statements.isComponent(statement)) {
+ var tagName = statement[1];
+ if (!this.env.hasComponentDefinition(tagName, meta.templateMeta)) {
+ if (toplevel !== undefined) {
+ newStatements.push([Ops$1.OpenElement, tagName]);
+ } else {
+ toplevel = tagName;
+ decorateTopLevelElement(tagName, symbols, attrs, newStatements);
+ }
+ addFallback(statement, newStatements);
+ } else {
+ if (toplevel === undefined && tagName === componentName) {
+ toplevel = tagName;
+ decorateTopLevelElement(tagName, symbols, attrs, newStatements);
+ addFallback(statement, newStatements);
+ } else {
+ newStatements.push(statement);
+ }
+ }
+ } else {
+ if (toplevel === undefined && _wireFormat.Statements.isOpenElement(statement)) {
+ toplevel = statement[1];
+ inTopLevel = true;
+ decorateTopLevelElement(toplevel, symbols, attrs, newStatements);
+ } else {
+ if (inTopLevel) {
+ if (_wireFormat.Statements.isFlushElement(statement)) {
+ inTopLevel = false;
+ } else if (_wireFormat.Statements.isModifier(statement)) {
+ throw Error('Found modifier "' + statement[1] + '" on the top-level element of "' + componentName + '". Modifiers cannot be on the top-level element');
+ }
+ }
+ newStatements.push(statement);
+ }
+ }
+ }
+ newStatements.push([Ops$1.ClientSideStatement, Ops$2.DidRenderLayout]);
+ return new CompilableTemplate(newStatements, symbolTable);
+ };
+
+ return Scanner;
+ }();
+
+ function addFallback(statement, buffer) {
+ var attrs = statement[2],
+ block = statement[4];
+
+ for (var i = 0; i < attrs.length; i++) {
+ buffer.push(attrs[i]);
+ }
+ buffer.push([Ops$1.FlushElement]);
+ if (block) {
+ var statements = block.statements;
+
+ for (var _i = 0; _i < statements.length; _i++) {
+ buffer.push(statements[_i]);
+ }
+ }
+ buffer.push([Ops$1.CloseElement]);
+ }
+ function decorateTopLevelElement(tagName, symbols, attrs, buffer) {
+ var attrsSymbol = symbols.push(ATTRS_BLOCK);
+ buffer.push([Ops$1.ClientSideStatement, Ops$2.OpenComponentElement, tagName]);
+ buffer.push([Ops$1.ClientSideStatement, Ops$2.DidCreateElement]);
+ buffer.push([Ops$1.Yield, attrsSymbol, _util.EMPTY_ARRAY]);
+ buffer.push.apply(buffer, attrs);
+ }
+
+ function _classCallCheck$24(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ var Constants = function () {
+ function Constants() {
+ _classCallCheck$24(this, Constants);
+
+ // `0` means NULL
+ this.references = [];
+ this.strings = [];
+ this.expressions = [];
+ this.floats = [];
+ this.arrays = [];
+ this.blocks = [];
+ this.functions = [];
+ this.others = [];
+ }
+
+ Constants.prototype.getReference = function getReference(value) {
+ return this.references[value - 1];
+ };
+
+ Constants.prototype.reference = function reference$$1(value) {
+ var index = this.references.length;
+ this.references.push(value);
+ return index + 1;
+ };
+
+ Constants.prototype.getString = function getString(value) {
+ return this.strings[value - 1];
+ };
+
+ Constants.prototype.getFloat = function getFloat(value) {
+ return this.floats[value - 1];
+ };
+
+ Constants.prototype.float = function float(value) {
+ return this.floats.push(value);
+ };
+
+ Constants.prototype.string = function string(value) {
+ var index = this.strings.length;
+ this.strings.push(value);
+ return index + 1;
+ };
+
+ Constants.prototype.getExpression = function getExpression(value) {
+ return this.expressions[value - 1];
+ };
+
+ Constants.prototype.getArray = function getArray(value) {
+ return this.arrays[value - 1];
+ };
+
+ Constants.prototype.getNames = function getNames(value) {
+ var _names = [];
+ var names = this.getArray(value);
+ for (var i = 0; i < names.length; i++) {
+ var n = names[i];
+ _names[i] = this.getString(n);
+ }
+ return _names;
+ };
+
+ Constants.prototype.array = function array(values) {
+ var index = this.arrays.length;
+ this.arrays.push(values);
+ return index + 1;
+ };
+
+ Constants.prototype.getBlock = function getBlock(value) {
+ return this.blocks[value - 1];
+ };
+
+ Constants.prototype.block = function block(_block) {
+ var index = this.blocks.length;
+ this.blocks.push(_block);
+ return index + 1;
+ };
+
+ Constants.prototype.getFunction = function getFunction(value) {
+ return this.functions[value - 1];
+ };
+
+ Constants.prototype.function = function _function(f) {
+ var index = this.functions.length;
+ this.functions.push(f);
+ return index + 1;
+ };
+
+ Constants.prototype.getOther = function getOther(value) {
+ return this.others[value - 1];
+ };
+
+ Constants.prototype.other = function other(_other) {
+ var index = this.others.length;
+ this.others.push(_other);
+ return index + 1;
+ };
+
+ return Constants;
+ }();
+
+ var badProtocols = ['javascript:', 'vbscript:'];
+ var badTags = ['A', 'BODY', 'LINK', 'IMG', 'IFRAME', 'BASE', 'FORM'];
+ var badTagsForDataURI = ['EMBED'];
+ var badAttributes = ['href', 'src', 'background', 'action'];
+ var badAttributesForDataURI = ['src'];
+ function has(array, item) {
+ return array.indexOf(item) !== -1;
+ }
+ function checkURI(tagName, attribute) {
+ return (tagName === null || has(badTags, tagName)) && has(badAttributes, attribute);
+ }
+ function checkDataURI(tagName, attribute) {
+ if (tagName === null) return false;
+ return has(badTagsForDataURI, tagName) && has(badAttributesForDataURI, attribute);
+ }
+ function requiresSanitization(tagName, attribute) {
+ return checkURI(tagName, attribute) || checkDataURI(tagName, attribute);
+ }
+ function sanitizeAttributeValue(env, element, attribute, value) {
+ var tagName = null;
+ if (value === null || value === undefined) {
+ return value;
+ }
+ if (isSafeString(value)) {
+ return value.toHTML();
+ }
+ if (!element) {
+ tagName = null;
+ } else {
+ tagName = element.tagName.toUpperCase();
+ }
+ var str = normalizeTextValue(value);
+ if (checkURI(tagName, attribute)) {
+ var protocol = env.protocolForURL(str);
+ if (has(badProtocols, protocol)) {
+ return 'unsafe:' + str;
+ }
+ }
+ if (checkDataURI(tagName, attribute)) {
+ return 'unsafe:' + str;
+ }
+ return str;
+ }
+
+ /*
+ * @method normalizeProperty
+ * @param element {HTMLElement}
+ * @param slotName {String}
+ * @returns {Object} { name, type }
+ */
+ function normalizeProperty(element, slotName) {
+ var type = void 0,
+ normalized = void 0;
+ if (slotName in element) {
+ normalized = slotName;
+ type = 'prop';
+ } else {
+ var lower = slotName.toLowerCase();
+ if (lower in element) {
+ type = 'prop';
+ normalized = lower;
+ } else {
+ type = 'attr';
+ normalized = slotName;
+ }
+ }
+ if (type === 'prop' && (normalized.toLowerCase() === 'style' || preferAttr(element.tagName, normalized))) {
+ type = 'attr';
+ }
+ return { normalized: normalized, type: type };
+ }
+
+ // properties that MUST be set as attributes, due to:
+ // * browser bug
+ // * strange spec outlier
+ var ATTR_OVERRIDES = {
+ // phantomjs < 2.0 lets you set it as a prop but won't reflect it
+ // back to the attribute. button.getAttribute('type') === null
+ BUTTON: { type: true, form: true },
+ INPUT: {
+ // Some version of IE (like IE9) actually throw an exception
+ // if you set input.type = 'something-unknown'
+ type: true,
+ form: true,
+ // Chrome 46.0.2464.0: 'autocorrect' in document.createElement('input') === false
+ // Safari 8.0.7: 'autocorrect' in document.createElement('input') === false
+ // Mobile Safari (iOS 8.4 simulator): 'autocorrect' in document.createElement('input') === true
+ autocorrect: true,
+ // Chrome 54.0.2840.98: 'list' in document.createElement('input') === true
+ // Safari 9.1.3: 'list' in document.createElement('input') === false
+ list: true
+ },
+ // element.form is actually a legitimate readOnly property, that is to be
+ // mutated, but must be mutated by setAttribute...
+ SELECT: { form: true },
+ OPTION: { form: true },
+ TEXTAREA: { form: true },
+ LABEL: { form: true },
+ FIELDSET: { form: true },
+ LEGEND: { form: true },
+ OBJECT: { form: true }
+ };
+ function preferAttr(tagName, propName) {
+ var tag = ATTR_OVERRIDES[tagName.toUpperCase()];
+ return tag && tag[propName.toLowerCase()] || false;
+ }
+
+ function _defaults$12(obj, defaults) {
+ var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {
+ Object.defineProperty(obj, key, value);
+ }
+ }return obj;
+ }
+
+ function _classCallCheck$27(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ function _possibleConstructorReturn$12(self, call) {
+ if (!self) {
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ }return call && (typeof call === "object" || typeof call === "function") ? call : self;
+ }
+
+ function _inherits$12(subClass, superClass) {
+ if (typeof superClass !== "function" && superClass !== null) {
+ throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults$12(subClass, superClass);
+ }
+
+ var innerHTMLWrapper = {
+ colgroup: { depth: 2, before: '<table><colgroup>', after: '</colgroup></table>' },
+ table: { depth: 1, before: '<table>', after: '</table>' },
+ tbody: { depth: 2, before: '<table><tbody>', after: '</tbody></table>' },
+ tfoot: { depth: 2, before: '<table><tfoot>', after: '</tfoot></table>' },
+ thead: { depth: 2, before: '<table><thead>', after: '</thead></table>' },
+ tr: { depth: 3, before: '<table><tbody><tr>', after: '</tr></tbody></table>' }
+ };
+ // Patch: innerHTML Fix
+ // Browsers: IE9
+ // Reason: IE9 don't allow us to set innerHTML on col, colgroup, frameset,
+ // html, style, table, tbody, tfoot, thead, title, tr.
+ // Fix: Wrap the innerHTML we are about to set in its parents, apply the
+ // wrapped innerHTML on a div, then move the unwrapped nodes into the
+ // target position.
+ function domChanges(document, DOMChangesClass) {
+ if (!document) return DOMChangesClass;
+ if (!shouldApplyFix(document)) {
+ return DOMChangesClass;
+ }
+ var div = document.createElement('div');
+ return function (_DOMChangesClass) {
+ _inherits$12(DOMChangesWithInnerHTMLFix, _DOMChangesClass);
+
+ function DOMChangesWithInnerHTMLFix() {
+ _classCallCheck$27(this, DOMChangesWithInnerHTMLFix);
+
+ return _possibleConstructorReturn$12(this, _DOMChangesClass.apply(this, arguments));
+ }
+
+ DOMChangesWithInnerHTMLFix.prototype.insertHTMLBefore = function insertHTMLBefore(parent, nextSibling, html) {
+ if (html === null || html === '') {
+ return _DOMChangesClass.prototype.insertHTMLBefore.call(this, parent, nextSibling, html);
+ }
+ var parentTag = parent.tagName.toLowerCase();
+ var wrapper = innerHTMLWrapper[parentTag];
+ if (wrapper === undefined) {
+ return _DOMChangesClass.prototype.insertHTMLBefore.call(this, parent, nextSibling, html);
+ }
+ return fixInnerHTML(parent, wrapper, div, html, nextSibling);
+ };
+
+ return DOMChangesWithInnerHTMLFix;
+ }(DOMChangesClass);
+ }
+ function treeConstruction(document, DOMTreeConstructionClass) {
+ if (!document) return DOMTreeConstructionClass;
+ if (!shouldApplyFix(document)) {
+ return DOMTreeConstructionClass;
+ }
+ var div = document.createElement('div');
+ return function (_DOMTreeConstructionC) {
+ _inherits$12(DOMTreeConstructionWithInnerHTMLFix, _DOMTreeConstructionC);
+
+ function DOMTreeConstructionWithInnerHTMLFix() {
+ _classCallCheck$27(this, DOMTreeConstructionWithInnerHTMLFix);
+
+ return _possibleConstructorReturn$12(this, _DOMTreeConstructionC.apply(this, arguments));
+ }
+
+ DOMTreeConstructionWithInnerHTMLFix.prototype.insertHTMLBefore = function insertHTMLBefore(parent, referenceNode, html) {
+ if (html === null || html === '') {
+ return _DOMTreeConstructionC.prototype.insertHTMLBefore.call(this, parent, referenceNode, html);
+ }
+ var parentTag = parent.tagName.toLowerCase();
+ var wrapper = innerHTMLWrapper[parentTag];
+ if (wrapper === undefined) {
+ return _DOMTreeConstructionC.prototype.insertHTMLBefore.call(this, parent, referenceNode, html);
+ }
+ return fixInnerHTML(parent, wrapper, div, html, referenceNode);
+ };
+
+ return DOMTreeConstructionWithInnerHTMLFix;
+ }(DOMTreeConstructionClass);
+ }
+ function fixInnerHTML(parent, wrapper, div, html, reference$$1) {
+ var wrappedHtml = wrapper.before + html + wrapper.after;
+ div.innerHTML = wrappedHtml;
+ var parentNode = div;
+ for (var i = 0; i < wrapper.depth; i++) {
+ parentNode = parentNode.childNodes[0];
+ }
+
+ var _moveNodesBefore = moveNodesBefore(parentNode, parent, reference$$1),
+ first = _moveNodesBefore[0],
+ last = _moveNodesBefore[1];
+
+ return new ConcreteBounds(parent, first, last);
+ }
+ function shouldApplyFix(document) {
+ var table = document.createElement('table');
+ try {
+ table.innerHTML = '<tbody></tbody>';
+ } catch (e) {} finally {
+ if (table.childNodes.length !== 0) {
+ // It worked as expected, no fix required
+ return false;
+ }
+ }
+ return true;
+ }
+
+ function _defaults$13(obj, defaults) {
+ var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {
+ Object.defineProperty(obj, key, value);
+ }
+ }return obj;
+ }
+
+ function _classCallCheck$28(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ function _possibleConstructorReturn$13(self, call) {
+ if (!self) {
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ }return call && (typeof call === "object" || typeof call === "function") ? call : self;
+ }
+
+ function _inherits$13(subClass, superClass) {
+ if (typeof superClass !== "function" && superClass !== null) {
+ throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults$13(subClass, superClass);
+ }
+
+ var SVG_NAMESPACE$1 = 'http://www.w3.org/2000/svg';
+ // Patch: insertAdjacentHTML on SVG Fix
+ // Browsers: Safari, IE, Edge, Firefox ~33-34
+ // Reason: insertAdjacentHTML does not exist on SVG elements in Safari. It is
+ // present but throws an exception on IE and Edge. Old versions of
+ // Firefox create nodes in the incorrect namespace.
+ // Fix: Since IE and Edge silently fail to create SVG nodes using
+ // innerHTML, and because Firefox may create nodes in the incorrect
+ // namespace using innerHTML on SVG elements, an HTML-string wrapping
+ // approach is used. A pre/post SVG tag is added to the string, then
+ // that whole string is added to a div. The created nodes are plucked
+ // out and applied to the target location on DOM.
+ function domChanges$1(document, DOMChangesClass, svgNamespace) {
+ if (!document) return DOMChangesClass;
+ if (!shouldApplyFix$1(document, svgNamespace)) {
+ return DOMChangesClass;
+ }
+ var div = document.createElement('div');
+ return function (_DOMChangesClass) {
+ _inherits$13(DOMChangesWithSVGInnerHTMLFix, _DOMChangesClass);
+
+ function DOMChangesWithSVGInnerHTMLFix() {
+ _classCallCheck$28(this, DOMChangesWithSVGInnerHTMLFix);
+
+ return _possibleConstructorReturn$13(this, _DOMChangesClass.apply(this, arguments));
+ }
+
+ DOMChangesWithSVGInnerHTMLFix.prototype.insertHTMLBefore = function insertHTMLBefore(parent, nextSibling, html) {
+ if (html === null || html === '') {
+ return _DOMChangesClass.prototype.insertHTMLBefore.call(this, parent, nextSibling, html);
+ }
+ if (parent.namespaceURI !== svgNamespace) {
+ return _DOMChangesClass.prototype.insertHTMLBefore.call(this, parent, nextSibling, html);
+ }
+ return fixSVG(parent, div, html, nextSibling);
+ };
+
+ return DOMChangesWithSVGInnerHTMLFix;
+ }(DOMChangesClass);
+ }
+ function treeConstruction$1(document, TreeConstructionClass, svgNamespace) {
+ if (!document) return TreeConstructionClass;
+ if (!shouldApplyFix$1(document, svgNamespace)) {
+ return TreeConstructionClass;
+ }
+ var div = document.createElement('div');
+ return function (_TreeConstructionClas) {
+ _inherits$13(TreeConstructionWithSVGInnerHTMLFix, _TreeConstructionClas);
+
+ function TreeConstructionWithSVGInnerHTMLFix() {
+ _classCallCheck$28(this, TreeConstructionWithSVGInnerHTMLFix);
+
+ return _possibleConstructorReturn$13(this, _TreeConstructionClas.apply(this, arguments));
+ }
+
+ TreeConstructionWithSVGInnerHTMLFix.prototype.insertHTMLBefore = function insertHTMLBefore(parent, reference$$1, html) {
+ if (html === null || html === '') {
+ return _TreeConstructionClas.prototype.insertHTMLBefore.call(this, parent, reference$$1, html);
+ }
+ if (parent.namespaceURI !== svgNamespace) {
+ return _TreeConstructionClas.prototype.insertHTMLBefore.call(this, parent, reference$$1, html);
+ }
+ return fixSVG(parent, div, html, reference$$1);
+ };
+
+ return TreeConstructionWithSVGInnerHTMLFix;
+ }(TreeConstructionClass);
+ }
+ function fixSVG(parent, div, html, reference$$1) {
+ // IE, Edge: also do not correctly support using `innerHTML` on SVG
+ // namespaced elements. So here a wrapper is used.
+ var wrappedHtml = '<svg>' + html + '</svg>';
+ div.innerHTML = wrappedHtml;
+
+ var _moveNodesBefore = moveNodesBefore(div.firstChild, parent, reference$$1),
+ first = _moveNodesBefore[0],
+ last = _moveNodesBefore[1];
+
+ return new ConcreteBounds(parent, first, last);
+ }
+ function shouldApplyFix$1(document, svgNamespace) {
+ var svg = document.createElementNS(svgNamespace, 'svg');
+ try {
+ svg['insertAdjacentHTML']('beforeend', '<circle></circle>');
+ } catch (e) {
+ // IE, Edge: Will throw, insertAdjacentHTML is unsupported on SVG
+ // Safari: Will throw, insertAdjacentHTML is not present on SVG
+ } finally {
+ // FF: Old versions will create a node in the wrong namespace
+ if (svg.childNodes.length === 1 && svg.firstChild.namespaceURI === SVG_NAMESPACE$1) {
+ // The test worked as expected, no fix required
+ return false;
+ }
+ return true;
+ }
+ }
+
+ function _defaults$14(obj, defaults) {
+ var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {
+ Object.defineProperty(obj, key, value);
+ }
+ }return obj;
+ }
+
+ function _classCallCheck$29(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ function _possibleConstructorReturn$14(self, call) {
+ if (!self) {
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ }return call && (typeof call === "object" || typeof call === "function") ? call : self;
+ }
+
+ function _inherits$14(subClass, superClass) {
+ if (typeof superClass !== "function" && superClass !== null) {
+ throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults$14(subClass, superClass);
+ }
+
+ // Patch: Adjacent text node merging fix
+ // Browsers: IE, Edge, Firefox w/o inspector open
+ // Reason: These browsers will merge adjacent text nodes. For exmaple given
+ // <div>Hello</div> with div.insertAdjacentHTML(' world') browsers
+ // with proper behavior will populate div.childNodes with two items.
+ // These browsers will populate it with one merged node instead.
+ // Fix: Add these nodes to a wrapper element, then iterate the childNodes
+ // of that wrapper and move the nodes to their target location. Note
+ // that potential SVG bugs will have been handled before this fix.
+ // Note that this fix must only apply to the previous text node, as
+ // the base implementation of `insertHTMLBefore` already handles
+ // following text nodes correctly.
+ function domChanges$2(document, DOMChangesClass) {
+ if (!document) return DOMChangesClass;
+ if (!shouldApplyFix$2(document)) {
+ return DOMChangesClass;
+ }
+ return function (_DOMChangesClass) {
+ _inherits$14(DOMChangesWithTextNodeMergingFix, _DOMChangesClass);
+
+ function DOMChangesWithTextNodeMergingFix(document) {
+ _classCallCheck$29(this, DOMChangesWithTextNodeMergingFix);
+
+ var _this = _possibleConstructorReturn$14(this, _DOMChangesClass.call(this, document));
+
+ _this.uselessComment = document.createComment('');
+ return _this;
+ }
+
+ DOMChangesWithTextNodeMergingFix.prototype.insertHTMLBefore = function insertHTMLBefore(parent, nextSibling, html) {
+ if (html === null) {
+ return _DOMChangesClass.prototype.insertHTMLBefore.call(this, parent, nextSibling, html);
+ }
+ var didSetUselessComment = false;
+ var nextPrevious = nextSibling ? nextSibling.previousSibling : parent.lastChild;
+ if (nextPrevious && nextPrevious instanceof Text) {
+ didSetUselessComment = true;
+ parent.insertBefore(this.uselessComment, nextSibling);
+ }
+ var bounds = _DOMChangesClass.prototype.insertHTMLBefore.call(this, parent, nextSibling, html);
+ if (didSetUselessComment) {
+ parent.removeChild(this.uselessComment);
+ }
+ return bounds;
+ };
+
+ return DOMChangesWithTextNodeMergingFix;
+ }(DOMChangesClass);
+ }
+ function treeConstruction$2(document, TreeConstructionClass) {
+ if (!document) return TreeConstructionClass;
+ if (!shouldApplyFix$2(document)) {
+ return TreeConstructionClass;
+ }
+ return function (_TreeConstructionClas) {
+ _inherits$14(TreeConstructionWithTextNodeMergingFix, _TreeConstructionClas);
+
+ function TreeConstructionWithTextNodeMergingFix(document) {
+ _classCallCheck$29(this, TreeConstructionWithTextNodeMergingFix);
+
+ var _this2 = _possibleConstructorReturn$14(this, _TreeConstructionClas.call(this, document));
+
+ _this2.uselessComment = _this2.createComment('');
+ return _this2;
+ }
+
+ TreeConstructionWithTextNodeMergingFix.prototype.insertHTMLBefore = function insertHTMLBefore(parent, reference$$1, html) {
+ if (html === null) {
+ return _TreeConstructionClas.prototype.insertHTMLBefore.call(this, parent, reference$$1, html);
+ }
+ var didSetUselessComment = false;
+ var nextPrevious = reference$$1 ? reference$$1.previousSibling : parent.lastChild;
+ if (nextPrevious && nextPrevious instanceof Text) {
+ didSetUselessComment = true;
+ parent.insertBefore(this.uselessComment, reference$$1);
+ }
+ var bounds = _TreeConstructionClas.prototype.insertHTMLBefore.call(this, parent, reference$$1, html);
+ if (didSetUselessComment) {
+ parent.removeChild(this.uselessComment);
+ }
+ return bounds;
+ };
+
+ return TreeConstructionWithTextNodeMergingFix;
+ }(TreeConstructionClass);
+ }
+ function shouldApplyFix$2(document) {
+ var mergingTextDiv = document.createElement('div');
+ mergingTextDiv.innerHTML = 'first';
+ mergingTextDiv.insertAdjacentHTML('beforeend', 'second');
+ if (mergingTextDiv.childNodes.length === 2) {
+ // It worked as expected, no fix required
+ return false;
+ }
+ return true;
+ }
+
+ function _defaults$11(obj, defaults) {
+ var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {
+ Object.defineProperty(obj, key, value);
+ }
+ }return obj;
+ }
+
+ function _possibleConstructorReturn$11(self, call) {
+ if (!self) {
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ }return call && (typeof call === "object" || typeof call === "function") ? call : self;
+ }
+
+ function _inherits$11(subClass, superClass) {
+ if (typeof superClass !== "function" && superClass !== null) {
+ throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults$11(subClass, superClass);
+ }
+
+ function _classCallCheck$26(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ var SVG_NAMESPACE = 'http://www.w3.org/2000/svg';
+ // http://www.w3.org/TR/html/syntax.html#html-integration-point
+ var SVG_INTEGRATION_POINTS = { foreignObject: 1, desc: 1, title: 1 };
+ // http://www.w3.org/TR/html/syntax.html#adjust-svg-attributes
+ // TODO: Adjust SVG attributes
+ // http://www.w3.org/TR/html/syntax.html#parsing-main-inforeign
+ // TODO: Adjust SVG elements
+ // http://www.w3.org/TR/html/syntax.html#parsing-main-inforeign
+ var BLACKLIST_TABLE = Object.create(null);
+ ["b", "big", "blockquote", "body", "br", "center", "code", "dd", "div", "dl", "dt", "em", "embed", "h1", "h2", "h3", "h4", "h5", "h6", "head", "hr", "i", "img", "li", "listing", "main", "meta", "nobr", "ol", "p", "pre", "ruby", "s", "small", "span", "strong", "strike", "sub", "sup", "table", "tt", "u", "ul", "var"].forEach(function (tag) {
+ return BLACKLIST_TABLE[tag] = 1;
+ });
+ var WHITESPACE = /[\t-\r \xA0\u1680\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]/;
+ var doc = typeof document === 'undefined' ? null : document;
+ function isWhitespace(string) {
+ return WHITESPACE.test(string);
+ }
+ function moveNodesBefore(source, target, nextSibling) {
+ var first = source.firstChild;
+ var last = null;
+ var current = first;
+ while (current) {
+ last = current;
+ current = current.nextSibling;
+ target.insertBefore(last, nextSibling);
+ }
+ return [first, last];
+ }
+ var DOMOperations = function () {
+ function DOMOperations(document) {
+ _classCallCheck$26(this, DOMOperations);
+
+ this.document = document;
+ this.setupUselessElement();
+ }
+ // split into seperate method so that NodeDOMTreeConstruction
+ // can override it.
+
+
+ DOMOperations.prototype.setupUselessElement = function setupUselessElement() {
+ this.uselessElement = this.document.createElement('div');
+ };
+
+ DOMOperations.prototype.createElement = function createElement(tag, context) {
+ var isElementInSVGNamespace = void 0,
+ isHTMLIntegrationPoint = void 0;
+ if (context) {
+ isElementInSVGNamespace = context.namespaceURI === SVG_NAMESPACE || tag === 'svg';
+ isHTMLIntegrationPoint = SVG_INTEGRATION_POINTS[context.tagName];
+ } else {
+ isElementInSVGNamespace = tag === 'svg';
+ isHTMLIntegrationPoint = false;
+ }
+ if (isElementInSVGNamespace && !isHTMLIntegrationPoint) {
+ // FIXME: This does not properly handle <font> with color, face, or
+ // size attributes, which is also disallowed by the spec. We should fix
+ // this.
+ if (BLACKLIST_TABLE[tag]) {
+ throw new Error('Cannot create a ' + tag + ' inside an SVG context');
+ }
+ return this.document.createElementNS(SVG_NAMESPACE, tag);
+ } else {
+ return this.document.createElement(tag);
+ }
+ };
+
+ DOMOperations.prototype.insertBefore = function insertBefore(parent, node, reference$$1) {
+ parent.insertBefore(node, reference$$1);
+ };
+
+ DOMOperations.prototype.insertHTMLBefore = function insertHTMLBefore(_parent, nextSibling, html) {
+ return _insertHTMLBefore(this.uselessElement, _parent, nextSibling, html);
+ };
+
+ DOMOperations.prototype.createTextNode = function createTextNode(text) {
+ return this.document.createTextNode(text);
+ };
+
+ DOMOperations.prototype.createComment = function createComment(data) {
+ return this.document.createComment(data);
+ };
+
+ return DOMOperations;
+ }();
+ var DOM;
+ (function (DOM) {
+ var TreeConstruction = function (_DOMOperations) {
+ _inherits$11(TreeConstruction, _DOMOperations);
+
+ function TreeConstruction() {
+ _classCallCheck$26(this, TreeConstruction);
+
+ return _possibleConstructorReturn$11(this, _DOMOperations.apply(this, arguments));
+ }
+
+ TreeConstruction.prototype.createElementNS = function createElementNS(namespace, tag) {
+ return this.document.createElementNS(namespace, tag);
+ };
+
+ TreeConstruction.prototype.setAttribute = function setAttribute(element, name, value, namespace) {
+ if (namespace) {
+ element.setAttributeNS(namespace, name, value);
+ } else {
+ element.setAttribute(name, value);
+ }
+ };
+
+ return TreeConstruction;
+ }(DOMOperations);
+
+ DOM.TreeConstruction = TreeConstruction;
+ var appliedTreeContruction = TreeConstruction;
+ appliedTreeContruction = treeConstruction$2(doc, appliedTreeContruction);
+ appliedTreeContruction = treeConstruction(doc, appliedTreeContruction);
+ appliedTreeContruction = treeConstruction$1(doc, appliedTreeContruction, SVG_NAMESPACE);
+ DOM.DOMTreeConstruction = appliedTreeContruction;
+ })(DOM || (DOM = {}));
+ var DOMChanges = function (_DOMOperations2) {
+ _inherits$11(DOMChanges, _DOMOperations2);
+
+ function DOMChanges(document) {
+ _classCallCheck$26(this, DOMChanges);
+
+ var _this2 = _possibleConstructorReturn$11(this, _DOMOperations2.call(this, document));
+
+ _this2.document = document;
+ _this2.namespace = null;
+ return _this2;
+ }
+
+ DOMChanges.prototype.setAttribute = function setAttribute(element, name, value) {
+ element.setAttribute(name, value);
+ };
+
+ DOMChanges.prototype.setAttributeNS = function setAttributeNS(element, namespace, name, value) {
+ element.setAttributeNS(namespace, name, value);
+ };
+
+ DOMChanges.prototype.removeAttribute = function removeAttribute(element, name) {
+ element.removeAttribute(name);
+ };
+
+ DOMChanges.prototype.removeAttributeNS = function removeAttributeNS(element, namespace, name) {
+ element.removeAttributeNS(namespace, name);
+ };
+
+ DOMChanges.prototype.insertNodeBefore = function insertNodeBefore(parent, node, reference$$1) {
+ if (isDocumentFragment(node)) {
+ var firstChild = node.firstChild,
+ lastChild = node.lastChild;
+
+ this.insertBefore(parent, node, reference$$1);
+ return new ConcreteBounds(parent, firstChild, lastChild);
+ } else {
+ this.insertBefore(parent, node, reference$$1);
+ return new SingleNodeBounds(parent, node);
+ }
+ };
+
+ DOMChanges.prototype.insertTextBefore = function insertTextBefore(parent, nextSibling, text) {
+ var textNode = this.createTextNode(text);
+ this.insertBefore(parent, textNode, nextSibling);
+ return textNode;
+ };
+
+ DOMChanges.prototype.insertBefore = function insertBefore(element, node, reference$$1) {
+ element.insertBefore(node, reference$$1);
+ };
+
+ DOMChanges.prototype.insertAfter = function insertAfter(element, node, reference$$1) {
+ this.insertBefore(element, node, reference$$1.nextSibling);
+ };
+
+ return DOMChanges;
+ }(DOMOperations);
+ function _insertHTMLBefore(_useless, _parent, _nextSibling, html) {
+ // TypeScript vendored an old version of the DOM spec where `insertAdjacentHTML`
+ // only exists on `HTMLElement` but not on `Element`. We actually work with the
+ // newer version of the DOM API here (and monkey-patch this method in `./compat`
+ // when we detect older browsers). This is a hack to work around this limitation.
+ var parent = _parent;
+ var useless = _useless;
+ var nextSibling = _nextSibling;
+ var prev = nextSibling ? nextSibling.previousSibling : parent.lastChild;
+ var last = void 0;
+ if (html === null || html === '') {
+ return new ConcreteBounds(parent, null, null);
+ }
+ if (nextSibling === null) {
+ parent.insertAdjacentHTML('beforeend', html);
+ last = parent.lastChild;
+ } else if (nextSibling instanceof HTMLElement) {
+ nextSibling.insertAdjacentHTML('beforebegin', html);
+ last = nextSibling.previousSibling;
+ } else {
+ // Non-element nodes do not support insertAdjacentHTML, so add an
+ // element and call it on that element. Then remove the element.
+ //
+ // This also protects Edge, IE and Firefox w/o the inspector open
+ // from merging adjacent text nodes. See ./compat/text-node-merging-fix.ts
+ parent.insertBefore(useless, nextSibling);
+ useless.insertAdjacentHTML('beforebegin', html);
+ last = useless.previousSibling;
+ parent.removeChild(useless);
+ }
+ var first = prev ? prev.nextSibling : parent.firstChild;
+ return new ConcreteBounds(parent, first, last);
+ }
+ function isDocumentFragment(node) {
+ return node.nodeType === Node.DOCUMENT_FRAGMENT_NODE;
+ }
+ var helper = DOMChanges;
+ helper = domChanges$2(doc, helper);
+ helper = domChanges(doc, helper);
+ helper = domChanges$1(doc, helper, SVG_NAMESPACE);
+ var helper$1 = helper;
+ var DOMTreeConstruction = DOM.DOMTreeConstruction;
+
+ function _defaults$10(obj, defaults) {
+ var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {
+ Object.defineProperty(obj, key, value);
+ }
+ }return obj;
+ }
+
+ function _possibleConstructorReturn$10(self, call) {
+ if (!self) {
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ }return call && (typeof call === "object" || typeof call === "function") ? call : self;
+ }
+
+ function _inherits$10(subClass, superClass) {
+ if (typeof superClass !== "function" && superClass !== null) {
+ throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults$10(subClass, superClass);
+ }
+
+ function _classCallCheck$25(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ function defaultManagers(element, attr, _isTrusting, _namespace) {
+ var tagName = element.tagName;
+ var isSVG = element.namespaceURI === SVG_NAMESPACE;
+ if (isSVG) {
+ return defaultAttributeManagers(tagName, attr);
+ }
+
+ var _normalizeProperty = normalizeProperty(element, attr),
+ type = _normalizeProperty.type,
+ normalized = _normalizeProperty.normalized;
+
+ if (type === 'attr') {
+ return defaultAttributeManagers(tagName, normalized);
+ } else {
+ return defaultPropertyManagers(tagName, normalized);
+ }
+ }
+ function defaultPropertyManagers(tagName, attr) {
+ if (requiresSanitization(tagName, attr)) {
+ return new SafePropertyManager(attr);
+ }
+ if (isUserInputValue(tagName, attr)) {
+ return INPUT_VALUE_PROPERTY_MANAGER;
+ }
+ if (isOptionSelected(tagName, attr)) {
+ return OPTION_SELECTED_MANAGER;
+ }
+ return new PropertyManager(attr);
+ }
+ function defaultAttributeManagers(tagName, attr) {
+ if (requiresSanitization(tagName, attr)) {
+ return new SafeAttributeManager(attr);
+ }
+ return new AttributeManager(attr);
+ }
+ function readDOMAttr(element, attr) {
+ var isSVG = element.namespaceURI === SVG_NAMESPACE;
+
+ var _normalizeProperty2 = normalizeProperty(element, attr),
+ type = _normalizeProperty2.type,
+ normalized = _normalizeProperty2.normalized;
+
+ if (isSVG) {
+ return element.getAttribute(normalized);
+ }
+ if (type === 'attr') {
+ return element.getAttribute(normalized);
+ }
+ {
+ return element[normalized];
+ }
+ }
+
+ var AttributeManager = function () {
+ function AttributeManager(attr) {
+ _classCallCheck$25(this, AttributeManager);
+
+ this.attr = attr;
+ }
+
+ AttributeManager.prototype.setAttribute = function setAttribute(env, element, value, namespace) {
+ var dom = env.getAppendOperations();
+ var normalizedValue = normalizeAttributeValue(value);
+ if (!isAttrRemovalValue(normalizedValue)) {
+ dom.setAttribute(element, this.attr, normalizedValue, namespace);
+ }
+ };
+
+ AttributeManager.prototype.updateAttribute = function updateAttribute(env, element, value, namespace) {
+ if (value === null || value === undefined || value === false) {
+ if (namespace) {
+ env.getDOM().removeAttributeNS(element, namespace, this.attr);
+ } else {
+ env.getDOM().removeAttribute(element, this.attr);
+ }
+ } else {
+ this.setAttribute(env, element, value);
+ }
+ };
+
+ return AttributeManager;
+ }();
+
+ var PropertyManager = function (_AttributeManager) {
+ _inherits$10(PropertyManager, _AttributeManager);
+
+ function PropertyManager() {
+ _classCallCheck$25(this, PropertyManager);
+
+ return _possibleConstructorReturn$10(this, _AttributeManager.apply(this, arguments));
+ }
+
+ PropertyManager.prototype.setAttribute = function setAttribute(_env, element, value, _namespace) {
+ if (!isAttrRemovalValue(value)) {
+ element[this.attr] = value;
+ }
+ };
+
+ PropertyManager.prototype.removeAttribute = function removeAttribute(env, element, namespace) {
+ // TODO this sucks but to preserve properties first and to meet current
+ // semantics we must do this.
+ var attr = this.attr;
+
+ if (namespace) {
+ env.getDOM().removeAttributeNS(element, namespace, attr);
+ } else {
+ env.getDOM().removeAttribute(element, attr);
+ }
+ };
+
+ PropertyManager.prototype.updateAttribute = function updateAttribute(env, element, value, namespace) {
+ // ensure the property is always updated
+ element[this.attr] = value;
+ if (isAttrRemovalValue(value)) {
+ this.removeAttribute(env, element, namespace);
+ }
+ };
+
+ return PropertyManager;
+ }(AttributeManager);
+
+ function normalizeAttributeValue(value) {
+ if (value === false || value === undefined || value === null) {
+ return null;
+ }
+ if (value === true) {
+ return '';
+ }
+ // onclick function etc in SSR
+ if (typeof value === 'function') {
+ return null;
+ }
+ return String(value);
+ }
+ function isAttrRemovalValue(value) {
+ return value === null || value === undefined;
+ }
+
+ var SafePropertyManager = function (_PropertyManager) {
+ _inherits$10(SafePropertyManager, _PropertyManager);
+
+ function SafePropertyManager() {
+ _classCallCheck$25(this, SafePropertyManager);
+
+ return _possibleConstructorReturn$10(this, _PropertyManager.apply(this, arguments));
+ }
+
+ SafePropertyManager.prototype.setAttribute = function setAttribute(env, element, value) {
+ _PropertyManager.prototype.setAttribute.call(this, env, element, sanitizeAttributeValue(env, element, this.attr, value));
+ };
+
+ SafePropertyManager.prototype.updateAttribute = function updateAttribute(env, element, value) {
+ _PropertyManager.prototype.updateAttribute.call(this, env, element, sanitizeAttributeValue(env, element, this.attr, value));
+ };
+
+ return SafePropertyManager;
+ }(PropertyManager);
+
+ function isUserInputValue(tagName, attribute) {
+ return (tagName === 'INPUT' || tagName === 'TEXTAREA') && attribute === 'value';
+ }
+
+ var InputValuePropertyManager = function (_AttributeManager2) {
+ _inherits$10(InputValuePropertyManager, _AttributeManager2);
+
+ function InputValuePropertyManager() {
+ _classCallCheck$25(this, InputValuePropertyManager);
+
+ return _possibleConstructorReturn$10(this, _AttributeManager2.apply(this, arguments));
+ }
+
+ InputValuePropertyManager.prototype.setAttribute = function setAttribute(_env, element, value) {
+ var input = element;
+ input.value = normalizeTextValue(value);
+ };
+
+ InputValuePropertyManager.prototype.updateAttribute = function updateAttribute(_env, element, value) {
+ var input = element;
+ var currentValue = input.value;
+ var normalizedValue = normalizeTextValue(value);
+ if (currentValue !== normalizedValue) {
+ input.value = normalizedValue;
+ }
+ };
+
+ return InputValuePropertyManager;
+ }(AttributeManager);
+
+ var INPUT_VALUE_PROPERTY_MANAGER = new InputValuePropertyManager('value');
+ function isOptionSelected(tagName, attribute) {
+ return tagName === 'OPTION' && attribute === 'selected';
+ }
+
+ var OptionSelectedManager = function (_PropertyManager2) {
+ _inherits$10(OptionSelectedManager, _PropertyManager2);
+
+ function OptionSelectedManager() {
+ _classCallCheck$25(this, OptionSelectedManager);
+
+ return _possibleConstructorReturn$10(this, _PropertyManager2.apply(this, arguments));
+ }
+
+ OptionSelectedManager.prototype.setAttribute = function setAttribute(_env, element, value) {
+ if (value !== null && value !== undefined && value !== false) {
+ var option = element;
+ option.selected = true;
+ }
+ };
+
+ OptionSelectedManager.prototype.updateAttribute = function updateAttribute(_env, element, value) {
+ var option = element;
+ if (value) {
+ option.selected = true;
+ } else {
+ option.selected = false;
+ }
+ };
+
+ return OptionSelectedManager;
+ }(PropertyManager);
+
+ var OPTION_SELECTED_MANAGER = new OptionSelectedManager('selected');
+
+ var SafeAttributeManager = function (_AttributeManager3) {
+ _inherits$10(SafeAttributeManager, _AttributeManager3);
+
+ function SafeAttributeManager() {
+ _classCallCheck$25(this, SafeAttributeManager);
+
+ return _possibleConstructorReturn$10(this, _AttributeManager3.apply(this, arguments));
+ }
+
+ SafeAttributeManager.prototype.setAttribute = function setAttribute(env, element, value) {
+ _AttributeManager3.prototype.setAttribute.call(this, env, element, sanitizeAttributeValue(env, element, this.attr, value));
+ };
+
+ SafeAttributeManager.prototype.updateAttribute = function updateAttribute(env, element, value, _namespace) {
+ _AttributeManager3.prototype.updateAttribute.call(this, env, element, sanitizeAttributeValue(env, element, this.attr, value));
+ };
+
+ return SafeAttributeManager;
+ }(AttributeManager);
+
+ var _createClass$4 = function () {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }return function (Constructor, protoProps, staticProps) {
+ if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;
+ };
+ }();
+
+ function _classCallCheck$23(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ var Scope = function () {
+ function Scope(
+ // the 0th slot is `self`
+ slots, callerScope,
+ // named arguments and blocks passed to a layout that uses eval
+ evalScope,
+ // locals in scope when the partial was invoked
+ partialMap) {
+ _classCallCheck$23(this, Scope);
+
+ this.slots = slots;
+ this.callerScope = callerScope;
+ this.evalScope = evalScope;
+ this.partialMap = partialMap;
+ }
+
+ Scope.root = function root(self) {
+ var size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
+
+ var refs = new Array(size + 1);
+ for (var i = 0; i <= size; i++) {
+ refs[i] = UNDEFINED_REFERENCE;
+ }
+ return new Scope(refs, null, null, null).init({ self: self });
+ };
+
+ Scope.sized = function sized() {
+ var size = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
+
+ var refs = new Array(size + 1);
+ for (var i = 0; i <= size; i++) {
+ refs[i] = UNDEFINED_REFERENCE;
+ }
+ return new Scope(refs, null, null, null);
+ };
+
+ Scope.prototype.init = function init(_ref) {
+ var self = _ref.self;
+
+ this.slots[0] = self;
+ return this;
+ };
+
+ Scope.prototype.getSelf = function getSelf() {
+ return this.get(0);
+ };
+
+ Scope.prototype.getSymbol = function getSymbol(symbol) {
+ return this.get(symbol);
+ };
+
+ Scope.prototype.getBlock = function getBlock(symbol) {
+ return this.get(symbol);
+ };
+
+ Scope.prototype.getEvalScope = function getEvalScope() {
+ return this.evalScope;
+ };
+
+ Scope.prototype.getPartialMap = function getPartialMap() {
+ return this.partialMap;
+ };
+
+ Scope.prototype.bind = function bind(symbol, value) {
+ this.set(symbol, value);
+ };
+
+ Scope.prototype.bindSelf = function bindSelf(self) {
+ this.set(0, self);
+ };
+
+ Scope.prototype.bindSymbol = function bindSymbol(symbol, value) {
+ this.set(symbol, value);
+ };
+
+ Scope.prototype.bindBlock = function bindBlock(symbol, value) {
+ this.set(symbol, value);
+ };
+
+ Scope.prototype.bindEvalScope = function bindEvalScope(map$$1) {
+ this.evalScope = map$$1;
+ };
+
+ Scope.prototype.bindPartialMap = function bindPartialMap(map$$1) {
+ this.partialMap = map$$1;
+ };
+
+ Scope.prototype.bindCallerScope = function bindCallerScope(scope) {
+ this.callerScope = scope;
+ };
+
+ Scope.prototype.getCallerScope = function getCallerScope() {
+ return this.callerScope;
+ };
+
+ Scope.prototype.child = function child() {
+ return new Scope(this.slots.slice(), this.callerScope, this.evalScope, this.partialMap);
+ };
+
+ Scope.prototype.get = function get(index) {
+ if (index >= this.slots.length) {
+ throw new RangeError('BUG: cannot get $' + index + ' from scope; length=' + this.slots.length);
+ }
+ return this.slots[index];
+ };
+
+ Scope.prototype.set = function set(index, value) {
+ if (index >= this.slots.length) {
+ throw new RangeError('BUG: cannot get $' + index + ' from scope; length=' + this.slots.length);
+ }
+ this.slots[index] = value;
+ };
+
+ return Scope;
+ }();
+
+ var Transaction = function () {
+ function Transaction() {
+ _classCallCheck$23(this, Transaction);
+
+ this.scheduledInstallManagers = [];
+ this.scheduledInstallModifiers = [];
+ this.scheduledUpdateModifierManagers = [];
+ this.scheduledUpdateModifiers = [];
+ this.createdComponents = [];
+ this.createdManagers = [];
+ this.updatedComponents = [];
+ this.updatedManagers = [];
+ this.destructors = [];
+ }
+
+ Transaction.prototype.didCreate = function didCreate(component, manager) {
+ this.createdComponents.push(component);
+ this.createdManagers.push(manager);
+ };
+
+ Transaction.prototype.didUpdate = function didUpdate(component, manager) {
+ this.updatedComponents.push(component);
+ this.updatedManagers.push(manager);
+ };
+
+ Transaction.prototype.scheduleInstallModifier = function scheduleInstallModifier(modifier, manager) {
+ this.scheduledInstallManagers.push(manager);
+ this.scheduledInstallModifiers.push(modifier);
+ };
+
+ Transaction.prototype.scheduleUpdateModifier = function scheduleUpdateModifier(modifier, manager) {
+ this.scheduledUpdateModifierManagers.push(manager);
+ this.scheduledUpdateModifiers.push(modifier);
+ };
+
+ Transaction.prototype.didDestroy = function didDestroy(d) {
+ this.destructors.push(d);
+ };
+
+ Transaction.prototype.commit = function commit() {
+ var createdComponents = this.createdComponents,
+ createdManagers = this.createdManagers;
+
+ for (var i = 0; i < createdComponents.length; i++) {
+ var component = createdComponents[i];
+ var manager = createdManagers[i];
+ manager.didCreate(component);
+ }
+ var updatedComponents = this.updatedComponents,
+ updatedManagers = this.updatedManagers;
+
+ for (var _i = 0; _i < updatedComponents.length; _i++) {
+ var _component = updatedComponents[_i];
+ var _manager = updatedManagers[_i];
+ _manager.didUpdate(_component);
+ }
+ var destructors = this.destructors;
+
+ for (var _i2 = 0; _i2 < destructors.length; _i2++) {
+ destructors[_i2].destroy();
+ }
+ var scheduledInstallManagers = this.scheduledInstallManagers,
+ scheduledInstallModifiers = this.scheduledInstallModifiers;
+
+ for (var _i3 = 0; _i3 < scheduledInstallManagers.length; _i3++) {
+ var _manager2 = scheduledInstallManagers[_i3];
+ var modifier = scheduledInstallModifiers[_i3];
+ _manager2.install(modifier);
+ }
+ var scheduledUpdateModifierManagers = this.scheduledUpdateModifierManagers,
+ scheduledUpdateModifiers = this.scheduledUpdateModifiers;
+
+ for (var _i4 = 0; _i4 < scheduledUpdateModifierManagers.length; _i4++) {
+ var _manager3 = scheduledUpdateModifierManagers[_i4];
+ var _modifier = scheduledUpdateModifiers[_i4];
+ _manager3.update(_modifier);
+ }
+ };
+
+ return Transaction;
+ }();
+
+ var Opcode = function () {
+ function Opcode(heap) {
+ _classCallCheck$23(this, Opcode);
+
+ this.heap = heap;
+ this.offset = 0;
+ }
+
+ _createClass$4(Opcode, [{
+ key: 'type',
+ get: function () {
+ return this.heap.getbyaddr(this.offset);
+ }
+ }, {
+ key: 'op1',
+ get: function () {
+ return this.heap.getbyaddr(this.offset + 1);
+ }
+ }, {
+ key: 'op2',
+ get: function () {
+ return this.heap.getbyaddr(this.offset + 2);
+ }
+ }, {
+ key: 'op3',
+ get: function () {
+ return this.heap.getbyaddr(this.offset + 3);
+ }
+ }]);
+
+ return Opcode;
+ }();
+ var TableSlotState;
+ (function (TableSlotState) {
+ TableSlotState[TableSlotState["Allocated"] = 0] = "Allocated";
+ TableSlotState[TableSlotState["Freed"] = 1] = "Freed";
+ TableSlotState[TableSlotState["Purged"] = 2] = "Purged";
+ TableSlotState[TableSlotState["Pointer"] = 3] = "Pointer";
+ })(TableSlotState || (TableSlotState = {}));
+ var Heap = function () {
+ function Heap() {
+ _classCallCheck$23(this, Heap);
+
+ this.heap = [];
+ this.offset = 0;
+ this.handle = 0;
+ /**
+ * layout:
+ *
+ * - pointer into heap
+ * - size
+ * - freed (0 or 1)
+ */
+ this.table = [];
+ }
+
+ Heap.prototype.push = function push(item) {
+ this.heap[this.offset++] = item;
+ };
+
+ Heap.prototype.getbyaddr = function getbyaddr(address) {
+ return this.heap[address];
+ };
+
+ Heap.prototype.setbyaddr = function setbyaddr(address, value) {
+ this.heap[address] = value;
+ };
+
+ Heap.prototype.malloc = function malloc() {
+ this.table.push(this.offset, 0, 0);
+ var handle = this.handle;
+ this.handle += 3;
+ return handle;
+ };
+
+ Heap.prototype.finishMalloc = function finishMalloc(handle) {
+ var start = this.table[handle];
+ var finish = this.offset;
+ this.table[handle + 1] = finish - start;
+ };
+
+ Heap.prototype.size = function size() {
+ return this.offset;
+ };
+ // It is illegal to close over this address, as compaction
+ // may move it. However, it is legal to use this address
+ // multiple times between compactions.
+
+
+ Heap.prototype.getaddr = function getaddr(handle) {
+ return this.table[handle];
+ };
+
+ Heap.prototype.gethandle = function gethandle(address) {
+ this.table.push(address, 0, TableSlotState.Pointer);
+ var handle = this.handle;
+ this.handle += 3;
+ return handle;
+ };
+
+ Heap.prototype.sizeof = function sizeof(handle) {
+ return -1;
+ };
+
+ Heap.prototype.free = function free(handle) {
+ this.table[handle + 2] = 1;
+ };
+
+ Heap.prototype.compact = function compact() {
+ var compactedSize = 0;
+ var table = this.table,
+ length = this.table.length,
+ heap = this.heap;
+
+ for (var i = 0; i < length; i += 3) {
+ var offset = table[i];
+ var size = table[i + 1];
+ var state = table[i + 2];
+ if (state === TableSlotState.Purged) {
+ continue;
+ } else if (state === TableSlotState.Freed) {
+ // transition to "already freed"
+ // a good improvement would be to reuse
+ // these slots
+ table[i + 2] = 2;
+ compactedSize += size;
+ } else if (state === TableSlotState.Allocated) {
+ for (var j = offset; j <= i + size; j++) {
+ heap[j - compactedSize] = heap[j];
+ }
+ table[i] = offset - compactedSize;
+ } else if (state === TableSlotState.Pointer) {
+ table[i] = offset - compactedSize;
+ }
+ }
+ this.offset = this.offset - compactedSize;
+ };
+
+ return Heap;
+ }();
+ var Program = function () {
+ function Program() {
+ _classCallCheck$23(this, Program);
+
+ this.heap = new Heap();
+ this._opcode = new Opcode(this.heap);
+ this.constants = new Constants();
+ }
+
+ Program.prototype.opcode = function opcode(offset) {
+ this._opcode.offset = offset;
+ return this._opcode;
+ };
+
+ return Program;
+ }();
+ var Environment = function () {
+ function Environment(_ref2) {
+ var appendOperations = _ref2.appendOperations,
+ updateOperations = _ref2.updateOperations;
+
+ _classCallCheck$23(this, Environment);
+
+ this._macros = null;
+ this._transaction = null;
+ this.program = new Program();
+ this.appendOperations = appendOperations;
+ this.updateOperations = updateOperations;
+ }
+
+ Environment.prototype.toConditionalReference = function toConditionalReference(reference$$1) {
+ return new ConditionalReference(reference$$1);
+ };
+
+ Environment.prototype.getAppendOperations = function getAppendOperations() {
+ return this.appendOperations;
+ };
+
+ Environment.prototype.getDOM = function getDOM() {
+ return this.updateOperations;
+ };
+
+ Environment.prototype.getIdentity = function getIdentity(object) {
+ return (0, _util.ensureGuid)(object) + '';
+ };
+
+ Environment.prototype.begin = function begin() {
+ (0, _util.assert)(!this._transaction, 'a glimmer transaction was begun, but one already exists. You may have a nested transaction');
+ this._transaction = new Transaction();
+ };
+
+ Environment.prototype.didCreate = function didCreate(component, manager) {
+ this.transaction.didCreate(component, manager);
+ };
+
+ Environment.prototype.didUpdate = function didUpdate(component, manager) {
+ this.transaction.didUpdate(component, manager);
+ };
+
+ Environment.prototype.scheduleInstallModifier = function scheduleInstallModifier(modifier, manager) {
+ this.transaction.scheduleInstallModifier(modifier, manager);
+ };
+
+ Environment.prototype.scheduleUpdateModifier = function scheduleUpdateModifier(modifier, manager) {
+ this.transaction.scheduleUpdateModifier(modifier, manager);
+ };
+
+ Environment.prototype.didDestroy = function didDestroy(d) {
+ this.transaction.didDestroy(d);
+ };
+
+ Environment.prototype.commit = function commit() {
+ var transaction = this.transaction;
+ this._transaction = null;
+ transaction.commit();
+ };
+
+ Environment.prototype.attributeFor = function attributeFor(element, attr, isTrusting, namespace) {
+ return defaultManagers(element, attr, isTrusting, namespace === undefined ? null : namespace);
+ };
+
+ Environment.prototype.macros = function macros() {
+ var macros = this._macros;
+ if (!macros) {
+ this._macros = macros = this.populateBuiltins();
+ }
+ return macros;
+ };
+
+ Environment.prototype.populateBuiltins = function populateBuiltins$$1() {
+ return populateBuiltins();
+ };
+
+ _createClass$4(Environment, [{
+ key: 'transaction',
+ get: function () {
+ return this._transaction;
+ }
+ }]);
+
+ return Environment;
+ }();
+
+ function _defaults$15(obj, defaults) {
+ var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {
+ Object.defineProperty(obj, key, value);
+ }
+ }return obj;
+ }
+
+ var _createClass$5 = function () {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }return function (Constructor, protoProps, staticProps) {
+ if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;
+ };
+ }();
+
+ function _possibleConstructorReturn$15(self, call) {
+ if (!self) {
+ throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
+ }return call && (typeof call === "object" || typeof call === "function") ? call : self;
+ }
+
+ function _inherits$15(subClass, superClass) {
+ if (typeof superClass !== "function" && superClass !== null) {
+ throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
+ }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults$15(subClass, superClass);
+ }
+
+ function _classCallCheck$30(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ var UpdatingVM = function () {
+ function UpdatingVM(env, _ref) {
+ var _ref$alwaysRevalidate = _ref.alwaysRevalidate,
+ alwaysRevalidate = _ref$alwaysRevalidate === undefined ? false : _ref$alwaysRevalidate;
+
+ _classCallCheck$30(this, UpdatingVM);
+
+ this.frameStack = new _util.Stack();
+ this.env = env;
+ this.constants = env.program.constants;
+ this.dom = env.getDOM();
+ this.alwaysRevalidate = alwaysRevalidate;
+ }
+
+ UpdatingVM.prototype.execute = function execute(opcodes, handler) {
+ var frameStack = this.frameStack;
+
+ this.try(opcodes, handler);
+ while (true) {
+ if (frameStack.isEmpty()) break;
+ var opcode = this.frame.nextStatement();
+ if (opcode === null) {
+ this.frameStack.pop();
+ continue;
+ }
+ opcode.evaluate(this);
+ }
+ };
+
+ UpdatingVM.prototype.goto = function goto(op) {
+ this.frame.goto(op);
+ };
+
+ UpdatingVM.prototype.try = function _try(ops, handler) {
+ this.frameStack.push(new UpdatingVMFrame(this, ops, handler));
+ };
+
+ UpdatingVM.prototype.throw = function _throw() {
+ this.frame.handleException();
+ this.frameStack.pop();
+ };
+
+ UpdatingVM.prototype.evaluateOpcode = function evaluateOpcode(opcode) {
+ opcode.evaluate(this);
+ };
+
+ _createClass$5(UpdatingVM, [{
+ key: 'frame',
+ get: function () {
+ return this.frameStack.current;
+ }
+ }]);
+
+ return UpdatingVM;
+ }();
+
+ var BlockOpcode = function (_UpdatingOpcode) {
+ _inherits$15(BlockOpcode, _UpdatingOpcode);
+
+ function BlockOpcode(start, state, bounds$$1, children) {
+ _classCallCheck$30(this, BlockOpcode);
+
+ var _this = _possibleConstructorReturn$15(this, _UpdatingOpcode.call(this));
+
+ _this.start = start;
+ _this.type = "block";
+ _this.next = null;
+ _this.prev = null;
+ var env = state.env,
+ scope = state.scope,
+ dynamicScope = state.dynamicScope,
+ stack = state.stack;
+
+ _this.children = children;
+ _this.env = env;
+ _this.scope = scope;
+ _this.dynamicScope = dynamicScope;
+ _this.stack = stack;
+ _this.bounds = bounds$$1;
+ return _this;
+ }
+
+ BlockOpcode.prototype.parentElement = function parentElement() {
+ return this.bounds.parentElement();
+ };
+
+ BlockOpcode.prototype.firstNode = function firstNode() {
+ return this.bounds.firstNode();
+ };
+
+ BlockOpcode.prototype.lastNode = function lastNode() {
+ return this.bounds.lastNode();
+ };
+
+ BlockOpcode.prototype.evaluate = function evaluate(vm) {
+ vm.try(this.children, null);
+ };
+
+ BlockOpcode.prototype.destroy = function destroy() {
+ this.bounds.destroy();
+ };
+
+ BlockOpcode.prototype.didDestroy = function didDestroy() {
+ this.env.didDestroy(this.bounds);
+ };
+
+ BlockOpcode.prototype.toJSON = function toJSON() {
+ var details = (0, _util.dict)();
+ details["guid"] = '' + this._guid;
+ return {
+ guid: this._guid,
+ type: this.type,
+ details: details,
+ children: this.children.toArray().map(function (op) {
+ return op.toJSON();
+ })
+ };
+ };
+
+ return BlockOpcode;
+ }(UpdatingOpcode);
+ var TryOpcode = function (_BlockOpcode) {
+ _inherits$15(TryOpcode, _BlockOpcode);
+
+ function TryOpcode(start, state, bounds$$1, children) {
+ _classCallCheck$30(this, TryOpcode);
+
+ var _this2 = _possibleConstructorReturn$15(this, _BlockOpcode.call(this, start, state, bounds$$1, children));
+
+ _this2.type = "try";
+ _this2.tag = _this2._tag = _reference2.UpdatableTag.create(_reference2.CONSTANT_TAG);
+ return _this2;
+ }
+
+ TryOpcode.prototype.didInitializeChildren = function didInitializeChildren() {
+ this._tag.inner.update((0, _reference2.combineSlice)(this.children));
+ };
+
+ TryOpcode.prototype.evaluate = function evaluate(vm) {
+ vm.try(this.children, this);
+ };
+
+ TryOpcode.prototype.handleException = function handleException() {
+ var _this3 = this;
+
+ var env = this.env,
+ bounds$$1 = this.bounds,
+ children = this.children,
+ scope = this.scope,
+ dynamicScope = this.dynamicScope,
+ start = this.start,
+ stack = this.stack,
+ prev = this.prev,
+ next = this.next;
+
+ children.clear();
+ var elementStack = ElementStack.resume(env, bounds$$1, bounds$$1.reset(env));
+ var vm = new VM(env, scope, dynamicScope, elementStack);
+ var updating = new _util.LinkedList();
+ vm.execute(start, function (vm) {
+ vm.stack = EvaluationStack.restore(stack);
+ vm.updatingOpcodeStack.push(updating);
+ vm.updateWith(_this3);
+ vm.updatingOpcodeStack.push(children);
+ });
+ this.prev = prev;
+ this.next = next;
+ };
+
+ TryOpcode.prototype.toJSON = function toJSON() {
+ var json = _BlockOpcode.prototype.toJSON.call(this);
+ var details = json["details"];
+ if (!details) {
+ details = json["details"] = {};
+ }
+ return _BlockOpcode.prototype.toJSON.call(this);
+ };
+
+ return TryOpcode;
+ }(BlockOpcode);
+
+ var ListRevalidationDelegate = function () {
+ function ListRevalidationDelegate(opcode, marker) {
+ _classCallCheck$30(this, ListRevalidationDelegate);
+
+ this.opcode = opcode;
+ this.marker = marker;
+ this.didInsert = false;
+ this.didDelete = false;
+ this.map = opcode.map;
+ this.updating = opcode['children'];
+ }
+
+ ListRevalidationDelegate.prototype.insert = function insert(key, item, memo, before) {
+ var map$$1 = this.map,
+ opcode = this.opcode,
+ updating = this.updating;
+
+ var nextSibling = null;
+ var reference$$1 = null;
+ if (before) {
+ reference$$1 = map$$1[before];
+ nextSibling = reference$$1['bounds'].firstNode();
+ } else {
+ nextSibling = this.marker;
+ }
+ var vm = opcode.vmForInsertion(nextSibling);
+ var tryOpcode = null;
+ var start = opcode.start;
+
+ vm.execute(start, function (vm) {
+ map$$1[key] = tryOpcode = vm.iterate(memo, item);
+ vm.updatingOpcodeStack.push(new _util.LinkedList());
+ vm.updateWith(tryOpcode);
+ vm.updatingOpcodeStack.push(tryOpcode.children);
+ });
+ updating.insertBefore(tryOpcode, reference$$1);
+ this.didInsert = true;
+ };
+
+ ListRevalidationDelegate.prototype.retain = function retain(_key, _item, _memo) {};
+
+ ListRevalidationDelegate.prototype.move = function move$$1(key, _item, _memo, before) {
+ var map$$1 = this.map,
+ updating = this.updating;
+
+ var entry = map$$1[key];
+ var reference$$1 = map$$1[before] || null;
+ if (before) {
+ move(entry, reference$$1.firstNode());
+ } else {
+ move(entry, this.marker);
+ }
+ updating.remove(entry);
+ updating.insertBefore(entry, reference$$1);
+ };
+
+ ListRevalidationDelegate.prototype.delete = function _delete(key) {
+ var map$$1 = this.map;
+
+ var opcode = map$$1[key];
+ opcode.didDestroy();
+ clear(opcode);
+ this.updating.remove(opcode);
+ delete map$$1[key];
+ this.didDelete = true;
+ };
+
+ ListRevalidationDelegate.prototype.done = function done() {
+ this.opcode.didInitializeChildren(this.didInsert || this.didDelete);
+ };
+
+ return ListRevalidationDelegate;
+ }();
+
+ var ListBlockOpcode = function (_BlockOpcode2) {
+ _inherits$15(ListBlockOpcode, _BlockOpcode2);
+
+ function ListBlockOpcode(start, state, bounds$$1, children, artifacts) {
+ _classCallCheck$30(this, ListBlockOpcode);
+
+ var _this4 = _possibleConstructorReturn$15(this, _BlockOpcode2.call(this, start, state, bounds$$1, children));
+
+ _this4.type = "list-block";
+ _this4.map = (0, _util.dict)();
+ _this4.lastIterated = _reference2.INITIAL;
+ _this4.artifacts = artifacts;
+ var _tag = _this4._tag = _reference2.UpdatableTag.create(_reference2.CONSTANT_TAG);
+ _this4.tag = (0, _reference2.combine)([artifacts.tag, _tag]);
+ return _this4;
+ }
+
+ ListBlockOpcode.prototype.didInitializeChildren = function didInitializeChildren() {
+ var listDidChange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
+
+ this.lastIterated = this.artifacts.tag.value();
+ if (listDidChange) {
+ this._tag.inner.update((0, _reference2.combineSlice)(this.children));
+ }
+ };
+
+ ListBlockOpcode.prototype.evaluate = function evaluate(vm) {
+ var artifacts = this.artifacts,
+ lastIterated = this.lastIterated;
+
+ if (!artifacts.tag.validate(lastIterated)) {
+ var bounds$$1 = this.bounds;
+ var dom = vm.dom;
+
+ var marker = dom.createComment('');
+ dom.insertAfter(bounds$$1.parentElement(), marker, bounds$$1.lastNode());
+ var target = new ListRevalidationDelegate(this, marker);
+ var synchronizer = new _reference2.IteratorSynchronizer({ target: target, artifacts: artifacts });
+ synchronizer.sync();
+ this.parentElement().removeChild(marker);
+ }
+ // Run now-updated updating opcodes
+ _BlockOpcode2.prototype.evaluate.call(this, vm);
+ };
+
+ ListBlockOpcode.prototype.vmForInsertion = function vmForInsertion(nextSibling) {
+ var env = this.env,
+ scope = this.scope,
+ dynamicScope = this.dynamicScope;
+
+ var elementStack = ElementStack.forInitialRender(this.env, this.bounds.parentElement(), nextSibling);
+ return new VM(env, scope, dynamicScope, elementStack);
+ };
+
+ ListBlockOpcode.prototype.toJSON = function toJSON() {
+ var json = _BlockOpcode2.prototype.toJSON.call(this);
+ var map$$1 = this.map;
+ var inner = Object.keys(map$$1).map(function (key) {
+ return JSON.stringify(key) + ': ' + map$$1[key]._guid;
+ }).join(", ");
+ var details = json["details"];
+ if (!details) {
+ details = json["details"] = {};
+ }
+ details["map"] = '{' + inner + '}';
+ return json;
+ };
+
+ return ListBlockOpcode;
+ }(BlockOpcode);
+
+ var UpdatingVMFrame = function () {
+ function UpdatingVMFrame(vm, ops, exceptionHandler) {
+ _classCallCheck$30(this, UpdatingVMFrame);
+
+ this.vm = vm;
+ this.ops = ops;
+ this.exceptionHandler = exceptionHandler;
+ this.vm = vm;
+ this.ops = ops;
+ this.current = ops.head();
+ }
+
+ UpdatingVMFrame.prototype.goto = function goto(op) {
+ this.current = op;
+ };
+
+ UpdatingVMFrame.prototype.nextStatement = function nextStatement() {
+ var current = this.current,
+ ops = this.ops;
+
+ if (current) this.current = ops.nextNode(current);
+ return current;
+ };
+
+ UpdatingVMFrame.prototype.handleException = function handleException() {
+ if (this.exceptionHandler) {
+ this.exceptionHandler.handleException();
+ }
+ };
+
+ return UpdatingVMFrame;
+ }();
+
+ function _classCallCheck$31(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ var RenderResult = function () {
+ function RenderResult(env, updating, bounds$$1) {
+ _classCallCheck$31(this, RenderResult);
+
+ this.env = env;
+ this.updating = updating;
+ this.bounds = bounds$$1;
+ }
+
+ RenderResult.prototype.rerender = function rerender() {
+ var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { alwaysRevalidate: false },
+ _ref$alwaysRevalidate = _ref.alwaysRevalidate,
+ alwaysRevalidate = _ref$alwaysRevalidate === undefined ? false : _ref$alwaysRevalidate;
+
+ var env = this.env,
+ updating = this.updating;
+
+ var vm = new UpdatingVM(env, { alwaysRevalidate: alwaysRevalidate });
+ vm.execute(updating, this);
+ };
+
+ RenderResult.prototype.parentElement = function parentElement() {
+ return this.bounds.parentElement();
+ };
+
+ RenderResult.prototype.firstNode = function firstNode() {
+ return this.bounds.firstNode();
+ };
+
+ RenderResult.prototype.lastNode = function lastNode() {
+ return this.bounds.lastNode();
+ };
+
+ RenderResult.prototype.opcodes = function opcodes() {
+ return this.updating;
+ };
+
+ RenderResult.prototype.handleException = function handleException() {
+ throw "this should never happen";
+ };
+
+ RenderResult.prototype.destroy = function destroy() {
+ this.bounds.destroy();
+ clear(this.bounds);
+ };
+
+ return RenderResult;
+ }();
+
+ var _createClass$3 = function () {
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if ("value" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }return function (Constructor, protoProps, staticProps) {
+ if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;
+ };
+ }();
+
+ function _classCallCheck$22(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ var EvaluationStack = function () {
+ function EvaluationStack(stack, fp, sp) {
+ _classCallCheck$22(this, EvaluationStack);
+
+ this.stack = stack;
+ this.fp = fp;
+ this.sp = sp;
+ }
+
+ EvaluationStack.empty = function empty() {
+ return new this([], 0, -1);
+ };
+
+ EvaluationStack.restore = function restore(snapshot) {
+ return new this(snapshot.slice(), 0, snapshot.length - 1);
+ };
+
+ EvaluationStack.prototype.isEmpty = function isEmpty() {
+ return this.sp === -1;
+ };
+
+ EvaluationStack.prototype.push = function push(value) {
+ this.stack[++this.sp] = value;
+ };
+
+ EvaluationStack.prototype.dup = function dup() {
+ var position = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.sp;
+
+ this.push(this.stack[position]);
+ };
+
+ EvaluationStack.prototype.pop = function pop() {
+ var n = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
+
+ var top = this.stack[this.sp];
+ this.sp -= n;
+ return top;
+ };
+
+ EvaluationStack.prototype.peek = function peek() {
+ return this.stack[this.sp];
+ };
+
+ EvaluationStack.prototype.fromBase = function fromBase(offset) {
+ return this.stack[this.fp - offset];
+ };
+
+ EvaluationStack.prototype.fromTop = function fromTop(offset) {
+ return this.stack[this.sp - offset];
+ };
+
+ EvaluationStack.prototype.capture = function capture(items) {
+ var end = this.sp + 1;
+ var start = end - items;
+ return this.stack.slice(start, end);
+ };
+
+ EvaluationStack.prototype.reset = function reset() {
+ this.stack.length = 0;
+ };
+
+ EvaluationStack.prototype.toArray = function toArray() {
+ return this.stack.slice(this.fp, this.sp + 1);
+ };
+
+ return EvaluationStack;
+ }();
+
+ var VM = function () {
+ function VM(env, scope, dynamicScope, elementStack) {
+ _classCallCheck$22(this, VM);
+
+ this.env = env;
+ this.elementStack = elementStack;
+ this.dynamicScopeStack = new _util.Stack();
+ this.scopeStack = new _util.Stack();
+ this.updatingOpcodeStack = new _util.Stack();
+ this.cacheGroups = new _util.Stack();
+ this.listBlockStack = new _util.Stack();
+ this.stack = EvaluationStack.empty();
+ /* Registers */
+ this.pc = -1;
+ this.ra = -1;
+ this.s0 = null;
+ this.s1 = null;
+ this.t0 = null;
+ this.t1 = null;
+ this.env = env;
+ this.heap = env.program.heap;
+ this.constants = env.program.constants;
+ this.elementStack = elementStack;
+ this.scopeStack.push(scope);
+ this.dynamicScopeStack.push(dynamicScope);
+ }
+
+ // Fetch a value from a register onto the stack
+ VM.prototype.fetch = function fetch(register) {
+ this.stack.push(this[Register[register]]);
+ };
+ // Load a value from the stack into a register
+
+
+ VM.prototype.load = function load(register) {
+ this[Register[register]] = this.stack.pop();
+ };
+ // Fetch a value from a register
+
+
+ VM.prototype.fetchValue = function fetchValue(register) {
+ return this[Register[register]];
+ };
+ // Load a value into a register
+
+
+ VM.prototype.loadValue = function loadValue(register, value) {
+ this[Register[register]] = value;
+ };
+ // Start a new frame and save $ra and $fp on the stack
+
+
+ VM.prototype.pushFrame = function pushFrame() {
+ this.stack.push(this.ra);
+ this.stack.push(this.fp);
+ this.fp = this.sp - 1;
+ };
+ // Restore $ra, $sp and $fp
+
+
+ VM.prototype.popFrame = function popFrame() {
+ this.sp = this.fp - 1;
+ this.ra = this.stack.fromBase(0);
+ this.fp = this.stack.fromBase(-1);
+ };
+ // Jump to an address in `program`
+
+
+ VM.prototype.goto = function goto(offset) {
+ this.pc = (0, _util.typePos)(this.pc + offset);
+ };
+ // Save $pc into $ra, then jump to a new address in `program` (jal in MIPS)
+
+
+ VM.prototype.call = function call(handle) {
+ var pc = this.heap.getaddr(handle);
+ this.ra = this.pc;
+ this.pc = pc;
+ };
+ // Put a specific `program` address in $ra
+
+
+ VM.prototype.returnTo = function returnTo(offset) {
+ this.ra = (0, _util.typePos)(this.pc + offset);
+ };
+ // Return to the `program` address stored in $ra
+
+
+ VM.prototype.return = function _return() {
+ this.pc = this.ra;
+ };
+
+ VM.initial = function initial(env, self, dynamicScope, elementStack, program) {
+ var scope = Scope.root(self, program.symbolTable.symbols.length);
+ var vm = new VM(env, scope, dynamicScope, elementStack);
+ vm.pc = vm.heap.getaddr(program.handle);
+ vm.updatingOpcodeStack.push(new _util.LinkedList());
+ return vm;
+ };
+
+ VM.prototype.capture = function capture(args) {
+ return {
+ dynamicScope: this.dynamicScope(),
+ env: this.env,
+ scope: this.scope(),
+ stack: this.stack.capture(args)
+ };
+ };
+
+ VM.prototype.beginCacheGroup = function beginCacheGroup() {
+ this.cacheGroups.push(this.updating().tail());
+ };
+
+ VM.prototype.commitCacheGroup = function commitCacheGroup() {
+ // JumpIfNotModified(END)
+ // (head)
+ // (....)
+ // (tail)
+ // DidModify
+ // END: Noop
+ var END = new LabelOpcode("END");
+ var opcodes = this.updating();
+ var marker = this.cacheGroups.pop();
+ var head = marker ? opcodes.nextNode(marker) : opcodes.head();
+ var tail = opcodes.tail();
+ var tag = (0, _reference2.combineSlice)(new _util.ListSlice(head, tail));
+ var guard = new JumpIfNotModifiedOpcode(tag, END);
+ opcodes.insertBefore(guard, head);
+ opcodes.append(new DidModifyOpcode(guard));
+ opcodes.append(END);
+ };
+
+ VM.prototype.enter = function enter(args) {
+ var updating = new _util.LinkedList();
+ var state = this.capture(args);
+ var tracker = this.elements().pushUpdatableBlock();
+ var tryOpcode = new TryOpcode(this.heap.gethandle(this.pc), state, tracker, updating);
+ this.didEnter(tryOpcode);
+ };
+
+ VM.prototype.iterate = function iterate(memo, value) {
+ var stack = this.stack;
+ stack.push(value);
+ stack.push(memo);
+ var state = this.capture(2);
+ var tracker = this.elements().pushUpdatableBlock();
+ // let ip = this.ip;
+ // this.ip = end + 4;
+ // this.frames.push(ip);
+ return new TryOpcode(this.heap.gethandle(this.pc), state, tracker, new _util.LinkedList());
+ };
+
+ VM.prototype.enterItem = function enterItem(key, opcode) {
+ this.listBlock().map[key] = opcode;
+ this.didEnter(opcode);
+ };
+
+ VM.prototype.enterList = function enterList(relativeStart) {
+ var updating = new _util.LinkedList();
+ var state = this.capture(0);
+ var tracker = this.elements().pushBlockList(updating);
+ var artifacts = this.stack.peek().artifacts;
+ var start = this.heap.gethandle((0, _util.typePos)(this.pc + relativeStart));
+ var opcode = new ListBlockOpcode(start, state, tracker, updating, artifacts);
+ this.listBlockStack.push(opcode);
+ this.didEnter(opcode);
+ };
+
+ VM.prototype.didEnter = function didEnter(opcode) {
+ this.updateWith(opcode);
+ this.updatingOpcodeStack.push(opcode.children);
+ };
+
+ VM.prototype.exit = function exit() {
+ this.elements().popBlock();
+ this.updatingOpcodeStack.pop();
+ var parent = this.updating().tail();
+ parent.didInitializeChildren();
+ };
+
+ VM.prototype.exitList = function exitList() {
+ this.exit();
+ this.listBlockStack.pop();
+ };
+
+ VM.prototype.updateWith = function updateWith(opcode) {
+ this.updating().append(opcode);
+ };
+
+ VM.prototype.listBlock = function listBlock() {
+ return this.listBlockStack.current;
+ };
+
+ VM.prototype.updating = function updating() {
+ return this.updatingOpcodeStack.current;
+ };
+
+ VM.prototype.elements = function elements() {
+ return this.elementStack;
+ };
+
+ VM.prototype.scope = function scope() {
+ return this.scopeStack.current;
+ };
+
+ VM.prototype.dynamicScope = function dynamicScope() {
+ return this.dynamicScopeStack.current;
+ };
+
+ VM.prototype.pushChildScope = function pushChildScope() {
+ this.scopeStack.push(this.scope().child());
+ };
+
+ VM.prototype.pushCallerScope = function pushCallerScope() {
+ var childScope = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+
+ var callerScope = this.scope().getCallerScope();
+ this.scopeStack.push(childScope ? callerScope.child() : callerScope);
+ };
+
+ VM.prototype.pushDynamicScope = function pushDynamicScope() {
+ var child = this.dynamicScope().child();
+ this.dynamicScopeStack.push(child);
+ return child;
+ };
+
+ VM.prototype.pushRootScope = function pushRootScope(size, bindCaller) {
+ var scope = Scope.sized(size);
+ if (bindCaller) scope.bindCallerScope(this.scope());
+ this.scopeStack.push(scope);
+ return scope;
+ };
+
+ VM.prototype.popScope = function popScope() {
+ this.scopeStack.pop();
+ };
+
+ VM.prototype.popDynamicScope = function popDynamicScope() {
+ this.dynamicScopeStack.pop();
+ };
+
+ VM.prototype.newDestroyable = function newDestroyable(d) {
+ this.elements().newDestroyable(d);
+ };
+ /// SCOPE HELPERS
+
+
+ VM.prototype.getSelf = function getSelf() {
+ return this.scope().getSelf();
+ };
+
+ VM.prototype.referenceForSymbol = function referenceForSymbol(symbol) {
+ return this.scope().getSymbol(symbol);
+ };
+ /// EXECUTION
+
+
+ VM.prototype.execute = function execute(start, initialize) {
+ this.pc = this.heap.getaddr(start);
+ if (initialize) initialize(this);
+ var result = void 0;
+ while (true) {
+ result = this.next();
+ if (result.done) break;
+ }
+ return result.value;
+ };
+
+ VM.prototype.next = function next() {
+ var env = this.env,
+ updatingOpcodeStack = this.updatingOpcodeStack,
+ elementStack = this.elementStack;
+
+ var opcode = this.nextStatement(env);
+ var result = void 0;
+ if (opcode !== null) {
+ APPEND_OPCODES.evaluate(this, opcode, opcode.type);
+ result = { done: false, value: null };
+ } else {
+ // Unload the stack
+ this.stack.reset();
+ result = {
+ done: true,
+ value: new RenderResult(env, updatingOpcodeStack.pop(), elementStack.popBlock())
+ };
+ }
+ return result;
+ };
+
+ VM.prototype.nextStatement = function nextStatement(env) {
+ var pc = this.pc;
+
+ if (pc === -1) {
+ return null;
+ }
+ var program = env.program;
+ this.pc += 4;
+ return program.opcode(pc);
+ };
+
+ VM.prototype.evaluateOpcode = function evaluateOpcode(opcode) {
+ APPEND_OPCODES.evaluate(this, opcode, opcode.type);
+ };
+
+ VM.prototype.bindDynamicScope = function bindDynamicScope(names) {
+ var scope = this.dynamicScope();
+ for (var i = names.length - 1; i >= 0; i--) {
+ var name = this.constants.getString(names[i]);
+ scope.set(name, this.stack.pop());
+ }
+ };
+
+ _createClass$3(VM, [{
+ key: 'fp',
+ get: function () {
+ return this.stack.fp;
+ },
+ set: function (fp) {
+ this.stack.fp = fp;
+ }
+ }, {
+ key: 'sp',
+ get: function () {
+ return this.stack.sp;
+ },
+ set: function (sp) {
+ this.stack.sp = sp;
+ }
+ }]);
+
+ return VM;
+ }();
+
+ function _classCallCheck$14(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ var TemplateIterator = function () {
+ function TemplateIterator(vm) {
+ _classCallCheck$14(this, TemplateIterator);
+
+ this.vm = vm;
+ }
+
+ TemplateIterator.prototype.next = function next() {
+ return this.vm.next();
+ };
+
+ return TemplateIterator;
+ }();
+ var clientId = 0;
+ function templateFactory(_ref) {
+ var templateId = _ref.id,
+ meta = _ref.meta,
+ block = _ref.block;
+
+ var parsedBlock = void 0;
+ var id = templateId || 'client-' + clientId++;
+ var create = function (env, envMeta) {
+ var newMeta = envMeta ? (0, _util.assign)({}, envMeta, meta) : meta;
+ if (!parsedBlock) {
+ parsedBlock = JSON.parse(block);
+ }
+ return new ScannableTemplate(id, newMeta, env, parsedBlock);
+ };
+ return { id: id, meta: meta, create: create };
+ }
+
+ var ScannableTemplate = function () {
+ function ScannableTemplate(id, meta, env, rawBlock) {
+ _classCallCheck$14(this, ScannableTemplate);
+
+ this.id = id;
+ this.meta = meta;
+ this.env = env;
+ this.entryPoint = null;
+ this.layout = null;
+ this.partial = null;
+ this.block = null;
+ this.scanner = new Scanner(rawBlock, env);
+ this.symbols = rawBlock.symbols;
+ this.hasEval = rawBlock.hasEval;
+ }
+
+ ScannableTemplate.prototype.render = function render(self, appendTo, dynamicScope) {
+ var env = this.env;
+
+ var elementStack = ElementStack.forInitialRender(env, appendTo, null);
+ var compiled = this.asEntryPoint().compileDynamic(env);
+ var vm = VM.initial(env, self, dynamicScope, elementStack, compiled);
+ return new TemplateIterator(vm);
+ };
+
+ ScannableTemplate.prototype.asEntryPoint = function asEntryPoint() {
+ if (!this.entryPoint) this.entryPoint = this.scanner.scanEntryPoint(this.compilationMeta());
+ return this.entryPoint;
+ };
+
+ ScannableTemplate.prototype.asLayout = function asLayout(componentName, attrs) {
+ if (!this.layout) this.layout = this.scanner.scanLayout(this.compilationMeta(), attrs || _util.EMPTY_ARRAY, componentName);
+ return this.layout;
+ };
+
+ ScannableTemplate.prototype.asPartial = function asPartial() {
+ if (!this.partial) this.partial = this.scanner.scanEntryPoint(this.compilationMeta(true));
+ return this.partial;
+ };
+
+ ScannableTemplate.prototype.asBlock = function asBlock() {
+ if (!this.block) this.block = this.scanner.scanBlock(this.compilationMeta());
+ return this.block;
+ };
+
+ ScannableTemplate.prototype.compilationMeta = function compilationMeta() {
+ var asPartial = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
+
+ return { templateMeta: this.meta, symbols: this.symbols, asPartial: asPartial };
+ };
+
+ return ScannableTemplate;
+ }();
+
+ function _classCallCheck$32(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ var DynamicVarReference = function () {
+ function DynamicVarReference(scope, nameRef) {
+ _classCallCheck$32(this, DynamicVarReference);
+
+ this.scope = scope;
+ this.nameRef = nameRef;
+ var varTag = this.varTag = _reference2.UpdatableTag.create(_reference2.CONSTANT_TAG);
+ this.tag = (0, _reference2.combine)([nameRef.tag, varTag]);
+ }
+
+ DynamicVarReference.prototype.value = function value() {
+ return this.getVar().value();
+ };
+
+ DynamicVarReference.prototype.get = function get(key) {
+ return this.getVar().get(key);
+ };
+
+ DynamicVarReference.prototype.getVar = function getVar() {
+ var name = String(this.nameRef.value());
+ var ref = this.scope.get(name);
+ this.varTag.inner.update(ref.tag);
+ return ref;
+ };
+
+ return DynamicVarReference;
+ }();
+
+ function getDynamicVar(vm, args) {
+ var scope = vm.dynamicScope();
+ var nameRef = args.positional.at(0);
+ return new DynamicVarReference(scope, nameRef);
+ }
+
+ function _classCallCheck$33(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ var PartialDefinition = function PartialDefinition(name, // for debugging
+ template) {
+ _classCallCheck$33(this, PartialDefinition);
+
+ this.name = name;
+ this.template = template;
+ };
+
+ var NodeType;
+ (function (NodeType) {
+ NodeType[NodeType["Element"] = 0] = "Element";
+ NodeType[NodeType["Attribute"] = 1] = "Attribute";
+ NodeType[NodeType["Text"] = 2] = "Text";
+ NodeType[NodeType["CdataSection"] = 3] = "CdataSection";
+ NodeType[NodeType["EntityReference"] = 4] = "EntityReference";
+ NodeType[NodeType["Entity"] = 5] = "Entity";
+ NodeType[NodeType["ProcessingInstruction"] = 6] = "ProcessingInstruction";
+ NodeType[NodeType["Comment"] = 7] = "Comment";
+ NodeType[NodeType["Document"] = 8] = "Document";
+ NodeType[NodeType["DocumentType"] = 9] = "DocumentType";
+ NodeType[NodeType["DocumentFragment"] = 10] = "DocumentFragment";
+ NodeType[NodeType["Notation"] = 11] = "Notation";
+ })(NodeType || (NodeType = {}));
+
+ var interfaces = Object.freeze({
+ get NodeType() {
+ return NodeType;
+ }
+ });
+
+ exports.Simple = interfaces;
+ exports.templateFactory = templateFactory;
+ exports.NULL_REFERENCE = NULL_REFERENCE;
+ exports.UNDEFINED_REFERENCE = UNDEFINED_REFERENCE;
+ exports.PrimitiveReference = PrimitiveReference;
+ exports.ConditionalReference = ConditionalReference;
+ exports.OpcodeBuilderDSL = OpcodeBuilder;
+ exports.compileLayout = compileLayout;
+ exports.CompiledStaticTemplate = CompiledStaticTemplate;
+ exports.CompiledDynamicTemplate = CompiledDynamicTemplate;
+ exports.IAttributeManager = AttributeManager;
+ exports.AttributeManager = AttributeManager;
+ exports.PropertyManager = PropertyManager;
+ exports.INPUT_VALUE_PROPERTY_MANAGER = INPUT_VALUE_PROPERTY_MANAGER;
+ exports.defaultManagers = defaultManagers;
+ exports.defaultAttributeManagers = defaultAttributeManagers;
+ exports.defaultPropertyManagers = defaultPropertyManagers;
+ exports.readDOMAttr = readDOMAttr;
+ exports.Register = Register;
+ exports.debugSlice = debugSlice;
+ exports.normalizeTextValue = normalizeTextValue;
+ exports.setDebuggerCallback = setDebuggerCallback;
+ exports.resetDebuggerCallback = resetDebuggerCallback;
+ exports.getDynamicVar = getDynamicVar;
+ exports.BlockMacros = Blocks;
+ exports.InlineMacros = Inlines;
+ exports.compileList = compileList;
+ exports.compileExpression = expr;
+ exports.UpdatingVM = UpdatingVM;
+ exports.RenderResult = RenderResult;
+ exports.isSafeString = isSafeString;
+ exports.Scope = Scope;
+ exports.Environment = Environment;
+ exports.PartialDefinition = PartialDefinition;
+ exports.ComponentDefinition = ComponentDefinition;
+ exports.isComponentDefinition = isComponentDefinition;
+ exports.DOMChanges = helper$1;
+ exports.IDOMChanges = DOMChanges;
+ exports.DOMTreeConstruction = DOMTreeConstruction;
+ exports.isWhitespace = isWhitespace;
+ exports.insertHTMLBefore = _insertHTMLBefore;
+ exports.ElementStack = ElementStack;
+ exports.ConcreteBounds = ConcreteBounds;
+});
+enifed('@glimmer/util', ['exports'], function (exports) {
+ 'use strict';
+
+ // There is a small whitelist of namespaced attributes specially
+ // enumerated in
+ // https://www.w3.org/TR/html/syntax.html#attributes-0
+ //
+ // > When a foreign element has one of the namespaced attributes given by
+ // > the local name and namespace of the first and second cells of a row
+ // > from the following table, it must be written using the name given by
+ // > the third cell from the same row.
+ //
+ // In all other cases, colons are interpreted as a regular character
+ // with no special meaning:
+ //
+ // > No other namespaced attribute can be expressed in the HTML syntax.
+ var XLINK = 'http://www.w3.org/1999/xlink';
+ var XML = 'http://www.w3.org/XML/1998/namespace';
+ var XMLNS = 'http://www.w3.org/2000/xmlns/';
+ var WHITELIST = {
+ 'xlink:actuate': XLINK,
+ 'xlink:arcrole': XLINK,
+ 'xlink:href': XLINK,
+ 'xlink:role': XLINK,
+ 'xlink:show': XLINK,
+ 'xlink:title': XLINK,
+ 'xlink:type': XLINK,
+ 'xml:base': XML,
+ 'xml:lang': XML,
+ 'xml:space': XML,
+ 'xmlns': XMLNS,
+ 'xmlns:xlink': XMLNS
+ };
+ function getAttrNamespace(attrName) {
+ return WHITELIST[attrName] || null;
+ }
+
+ function unwrap(val) {
+ if (val === null || val === undefined) throw new Error('Expected value to be present');
+ return val;
+ }
+ function expect(val, message) {
+ if (val === null || val === undefined) throw new Error(message);
+ return val;
+ }
+ function unreachable() {
+ return new Error('unreachable');
+ }
+ function typePos(lastOperand) {
+ return lastOperand - 4;
+ }
+
+ // import Logger from './logger';
+ // let alreadyWarned = false;
+ // import Logger from './logger';
+ function debugAssert(test, msg) {
+ // if (!alreadyWarned) {
+ // alreadyWarned = true;
+ // Logger.warn("Don't leave debug assertions on in public builds");
+ // }
+ if (!test) {
+ throw new Error(msg || "assertion failure");
+ }
+ }
+
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ var LogLevel;
+ (function (LogLevel) {
+ LogLevel[LogLevel["Trace"] = 0] = "Trace";
+ LogLevel[LogLevel["Debug"] = 1] = "Debug";
+ LogLevel[LogLevel["Warn"] = 2] = "Warn";
+ LogLevel[LogLevel["Error"] = 3] = "Error";
+ })(LogLevel || (exports.LogLevel = LogLevel = {}));
+
+ var NullConsole = function () {
+ function NullConsole() {
+ _classCallCheck(this, NullConsole);
+ }
+
+ NullConsole.prototype.log = function log(_message) {};
+
+ NullConsole.prototype.warn = function warn(_message) {};
+
+ NullConsole.prototype.error = function error(_message) {};
+
+ NullConsole.prototype.trace = function trace() {};
+
+ return NullConsole;
+ }();
+
+ var ALWAYS = void 0;
+ var Logger = function () {
+ function Logger(_ref) {
+ var console = _ref.console,
+ level = _ref.level;
+
+ _classCallCheck(this, Logger);
+
+ this.f = ALWAYS;
+ this.force = ALWAYS;
+ this.console = console;
+ this.level = level;
+ }
+
+ Logger.prototype.skipped = function skipped(level) {
+ return level < this.level;
+ };
+
+ Logger.prototype.trace = function trace(message) {
+ var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
+ _ref2$stackTrace = _ref2.stackTrace,
+ stackTrace = _ref2$stackTrace === undefined ? false : _ref2$stackTrace;
+
+ if (this.skipped(LogLevel.Trace)) return;
+ this.console.log(message);
+ if (stackTrace) this.console.trace();
+ };
+
+ Logger.prototype.debug = function debug(message) {
+ var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
+ _ref3$stackTrace = _ref3.stackTrace,
+ stackTrace = _ref3$stackTrace === undefined ? false : _ref3$stackTrace;
+
+ if (this.skipped(LogLevel.Debug)) return;
+ this.console.log(message);
+ if (stackTrace) this.console.trace();
+ };
+
+ Logger.prototype.warn = function warn(message) {
+ var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
+ _ref4$stackTrace = _ref4.stackTrace,
+ stackTrace = _ref4$stackTrace === undefined ? false : _ref4$stackTrace;
+
+ if (this.skipped(LogLevel.Warn)) return;
+ this.console.warn(message);
+ if (stackTrace) this.console.trace();
+ };
+
+ Logger.prototype.error = function error(message) {
+ if (this.skipped(LogLevel.Error)) return;
+ this.console.error(message);
+ };
+
+ return Logger;
+ }();
+ var _console = typeof console === 'undefined' ? new NullConsole() : console;
+ ALWAYS = new Logger({ console: _console, level: LogLevel.Trace });
+ var LOG_LEVEL = LogLevel.Debug;
+ var logger = new Logger({ console: _console, level: LOG_LEVEL });
+
+ var objKeys = Object.keys;
+
+ function assign(obj) {
+ for (var i = 1; i < arguments.length; i++) {
+ var assignment = arguments[i];
+ if (assignment === null || typeof assignment !== 'object') continue;
+ var keys = objKeys(assignment);
+ for (var j = 0; j < keys.length; j++) {
+ var key = keys[j];
+ obj[key] = assignment[key];
+ }
+ }
+ return obj;
+ }
+ function fillNulls(count) {
+ var arr = new Array(count);
+ for (var i = 0; i < count; i++) {
+ arr[i] = null;
+ }
+ return arr;
+ }
+
+ var GUID = 0;
+ function initializeGuid(object) {
+ return object._guid = ++GUID;
+ }
+ function ensureGuid(object) {
+ return object._guid || initializeGuid(object);
+ }
+
+ function _classCallCheck$1(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ var proto = Object.create(null, {
+ // without this, we will always still end up with (new
+ // EmptyObject()).constructor === Object
+ constructor: {
+ value: undefined,
+ enumerable: false,
+ writable: true
+ }
+ });
+ function EmptyObject() {}
+ EmptyObject.prototype = proto;
+ function dict() {
+ // let d = Object.create(null);
+ // d.x = 1;
+ // delete d.x;
+ // return d;
+ return new EmptyObject();
+ }
+ var DictSet = function () {
+ function DictSet() {
+ _classCallCheck$1(this, DictSet);
+
+ this.dict = dict();
+ }
+
+ DictSet.prototype.add = function add(obj) {
+ if (typeof obj === 'string') this.dict[obj] = obj;else this.dict[ensureGuid(obj)] = obj;
+ return this;
+ };
+
+ DictSet.prototype.delete = function _delete(obj) {
+ if (typeof obj === 'string') delete this.dict[obj];else if (obj._guid) delete this.dict[obj._guid];
+ };
+
+ DictSet.prototype.forEach = function forEach(callback) {
+ var dict = this.dict;
+
+ var dictKeys = Object.keys(dict);
+ for (var i = 0; dictKeys.length; i++) {
+ callback(dict[dictKeys[i]]);
+ }
+ };
+
+ DictSet.prototype.toArray = function toArray() {
+ return Object.keys(this.dict);
+ };
+
+ return DictSet;
+ }();
+ var Stack = function () {
+ function Stack() {
+ _classCallCheck$1(this, Stack);
+
+ this.stack = [];
+ this.current = null;
+ }
+
+ Stack.prototype.toArray = function toArray() {
+ return this.stack;
+ };
+
+ Stack.prototype.push = function push(item) {
+ this.current = item;
+ this.stack.push(item);
+ };
+
+ Stack.prototype.pop = function pop() {
+ var item = this.stack.pop();
+ var len = this.stack.length;
+ this.current = len === 0 ? null : this.stack[len - 1];
+ return item === undefined ? null : item;
+ };
+
+ Stack.prototype.isEmpty = function isEmpty() {
+ return this.stack.length === 0;
+ };
+
+ return Stack;
+ }();
+
+ function _classCallCheck$2(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ var ListNode = function ListNode(value) {
+ _classCallCheck$2(this, ListNode);
+
+ this.next = null;
+ this.prev = null;
+ this.value = value;
+ };
+ var LinkedList = function () {
+ function LinkedList() {
+ _classCallCheck$2(this, LinkedList);
+
+ this.clear();
+ }
+
+ LinkedList.fromSlice = function fromSlice(slice) {
+ var list = new LinkedList();
+ slice.forEachNode(function (n) {
+ return list.append(n.clone());
+ });
+ return list;
+ };
+
+ LinkedList.prototype.head = function head() {
+ return this._head;
+ };
+
+ LinkedList.prototype.tail = function tail() {
+ return this._tail;
+ };
+
+ LinkedList.prototype.clear = function clear() {
+ this._head = this._tail = null;
+ };
+
+ LinkedList.prototype.isEmpty = function isEmpty() {
+ return this._head === null;
+ };
+
+ LinkedList.prototype.toArray = function toArray() {
+ var out = [];
+ this.forEachNode(function (n) {
+ return out.push(n);
+ });
+ return out;
+ };
+
+ LinkedList.prototype.splice = function splice(start, end, reference) {
+ var before = void 0;
+ if (reference === null) {
+ before = this._tail;
+ this._tail = end;
+ } else {
+ before = reference.prev;
+ end.next = reference;
+ reference.prev = end;
+ }
+ if (before) {
+ before.next = start;
+ start.prev = before;
+ }
+ };
+
+ LinkedList.prototype.nextNode = function nextNode(node) {
+ return node.next;
+ };
+
+ LinkedList.prototype.prevNode = function prevNode(node) {
+ return node.prev;
+ };
+
+ LinkedList.prototype.forEachNode = function forEachNode(callback) {
+ var node = this._head;
+ while (node !== null) {
+ callback(node);
+ node = node.next;
+ }
+ };
+
+ LinkedList.prototype.contains = function contains(needle) {
+ var node = this._head;
+ while (node !== null) {
+ if (node === needle) return true;
+ node = node.next;
+ }
+ return false;
+ };
+
+ LinkedList.prototype.insertBefore = function insertBefore(node) {
+ var reference = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
+
+ if (reference === null) return this.append(node);
+ if (reference.prev) reference.prev.next = node;else this._head = node;
+ node.prev = reference.prev;
+ node.next = reference;
+ reference.prev = node;
+ return node;
+ };
+
+ LinkedList.prototype.append = function append(node) {
+ var tail = this._tail;
+ if (tail) {
+ tail.next = node;
+ node.prev = tail;
+ node.next = null;
+ } else {
+ this._head = node;
+ }
+ return this._tail = node;
+ };
+
+ LinkedList.prototype.pop = function pop() {
+ if (this._tail) return this.remove(this._tail);
+ return null;
+ };
+
+ LinkedList.prototype.prepend = function prepend(node) {
+ if (this._head) return this.insertBefore(node, this._head);
+ return this._head = this._tail = node;
+ };
+
+ LinkedList.prototype.remove = function remove(node) {
+ if (node.prev) node.prev.next = node.next;else this._head = node.next;
+ if (node.next) node.next.prev = node.prev;else this._tail = node.prev;
+ return node;
+ };
+
+ return LinkedList;
+ }();
+ var ListSlice = function () {
+ function ListSlice(head, tail) {
+ _classCallCheck$2(this, ListSlice);
+
+ this._head = head;
+ this._tail = tail;
+ }
+
+ ListSlice.toList = function toList(slice) {
+ var list = new LinkedList();
+ slice.forEachNode(function (n) {
+ return list.append(n.clone());
+ });
+ return list;
+ };
+
+ ListSlice.prototype.forEachNode = function forEachNode(callback) {
+ var node = this._head;
+ while (node !== null) {
+ callback(node);
+ node = this.nextNode(node);
+ }
+ };
+
+ ListSlice.prototype.contains = function contains(needle) {
+ var node = this._head;
+ while (node !== null) {
+ if (node === needle) return true;
+ node = node.next;
+ }
+ return false;
+ };
+
+ ListSlice.prototype.head = function head() {
+ return this._head;
+ };
+
+ ListSlice.prototype.tail = function tail() {
+ return this._tail;
+ };
+
+ ListSlice.prototype.toArray = function toArray() {
+ var out = [];
+ this.forEachNode(function (n) {
+ return out.push(n);
+ });
+ return out;
+ };
+
+ ListSlice.prototype.nextNode = function nextNode(node) {
+ if (node === this._tail) return null;
+ return node.next;
+ };
+
+ ListSlice.prototype.prevNode = function prevNode(node) {
+ if (node === this._head) return null;
+ return node.prev;
+ };
+
+ ListSlice.prototype.isEmpty = function isEmpty() {
+ return false;
+ };
+
+ return ListSlice;
+ }();
+ var EMPTY_SLICE = new ListSlice(null, null);
+
+ var HAS_NATIVE_WEAKMAP = function () {
+ // detect if `WeakMap` is even present
+ var hasWeakMap = typeof WeakMap === 'function';
+ if (!hasWeakMap) {
+ return false;
+ }
+ var instance = new WeakMap();
+ // use `Object`'s `.toString` directly to prevent us from detecting
+ // polyfills as native weakmaps
+ return Object.prototype.toString.call(instance) === '[object WeakMap]';
+ }();
+
+ var HAS_TYPED_ARRAYS = typeof Uint32Array !== 'undefined';
+ var A = void 0;
+ if (HAS_TYPED_ARRAYS) {
+ A = Uint32Array;
+ } else {
+ A = Array;
+ }
+ var A$1 = A;
+ var EMPTY_ARRAY = HAS_NATIVE_WEAKMAP ? Object.freeze([]) : [];
+
+ exports.getAttrNamespace = getAttrNamespace;
+ exports.assert = debugAssert;
+ exports.LOGGER = logger;
+ exports.Logger = Logger;
+ exports.LogLevel = LogLevel;
+ exports.assign = assign;
+ exports.fillNulls = fillNulls;
+ exports.ensureGuid = ensureGuid;
+ exports.initializeGuid = initializeGuid;
+ exports.Stack = Stack;
+ exports.DictSet = DictSet;
+ exports.dict = dict;
+ exports.EMPTY_SLICE = EMPTY_SLICE;
+ exports.LinkedList = LinkedList;
+ exports.ListNode = ListNode;
+ exports.ListSlice = ListSlice;
+ exports.A = A$1;
+ exports.EMPTY_ARRAY = EMPTY_ARRAY;
+ exports.HAS_NATIVE_WEAKMAP = HAS_NATIVE_WEAKMAP;
+ exports.unwrap = unwrap;
+ exports.expect = expect;
+ exports.unreachable = unreachable;
+ exports.typePos = typePos;
+});
+enifed("@glimmer/wire-format", ["exports"], function (exports) {
+ "use strict";
+
+ var Opcodes;
+ (function (Opcodes) {
+ // Statements
+ Opcodes[Opcodes["Text"] = 0] = "Text";
+ Opcodes[Opcodes["Append"] = 1] = "Append";
+ Opcodes[Opcodes["Comment"] = 2] = "Comment";
+ Opcodes[Opcodes["Modifier"] = 3] = "Modifier";
+ Opcodes[Opcodes["Block"] = 4] = "Block";
+ Opcodes[Opcodes["Component"] = 5] = "Component";
+ Opcodes[Opcodes["OpenElement"] = 6] = "OpenElement";
+ Opcodes[Opcodes["FlushElement"] = 7] = "FlushElement";
+ Opcodes[Opcodes["CloseElement"] = 8] = "CloseElement";
+ Opcodes[Opcodes["StaticAttr"] = 9] = "StaticAttr";
+ Opcodes[Opcodes["DynamicAttr"] = 10] = "DynamicAttr";
+ Opcodes[Opcodes["Yield"] = 11] = "Yield";
+ Opcodes[Opcodes["Partial"] = 12] = "Partial";
+ Opcodes[Opcodes["DynamicArg"] = 13] = "DynamicArg";
+ Opcodes[Opcodes["StaticArg"] = 14] = "StaticArg";
+ Opcodes[Opcodes["TrustingAttr"] = 15] = "TrustingAttr";
+ Opcodes[Opcodes["Debugger"] = 16] = "Debugger";
+ Opcodes[Opcodes["ClientSideStatement"] = 17] = "ClientSideStatement";
+ // Expressions
+ Opcodes[Opcodes["Unknown"] = 18] = "Unknown";
+ Opcodes[Opcodes["Get"] = 19] = "Get";
+ Opcodes[Opcodes["MaybeLocal"] = 20] = "MaybeLocal";
+ Opcodes[Opcodes["FixThisBeforeWeMerge"] = 21] = "FixThisBeforeWeMerge";
+ Opcodes[Opcodes["HasBlock"] = 22] = "HasBlock";
+ Opcodes[Opcodes["HasBlockParams"] = 23] = "HasBlockParams";
+ Opcodes[Opcodes["Undefined"] = 24] = "Undefined";
+ Opcodes[Opcodes["Helper"] = 25] = "Helper";
+ Opcodes[Opcodes["Concat"] = 26] = "Concat";
+ Opcodes[Opcodes["ClientSideExpression"] = 27] = "ClientSideExpression";
+ })(Opcodes || (exports.Ops = Opcodes = {}));
+
+ function is(variant) {
+ return function (value) {
+ return Array.isArray(value) && value[0] === variant;
+ };
+ }
+ var Expressions;
+ (function (Expressions) {
+ Expressions.isUnknown = is(Opcodes.Unknown);
+ Expressions.isGet = is(Opcodes.Get);
+ Expressions.isConcat = is(Opcodes.Concat);
+ Expressions.isHelper = is(Opcodes.Helper);
+ Expressions.isHasBlock = is(Opcodes.HasBlock);
+ Expressions.isHasBlockParams = is(Opcodes.HasBlockParams);
+ Expressions.isUndefined = is(Opcodes.Undefined);
+ Expressions.isClientSide = is(Opcodes.ClientSideExpression);
+ Expressions.isMaybeLocal = is(Opcodes.MaybeLocal);
+ function isPrimitiveValue(value) {
+ if (value === null) {
+ return true;
+ }
+ return typeof value !== 'object';
+ }
+ Expressions.isPrimitiveValue = isPrimitiveValue;
+ })(Expressions || (exports.Expressions = Expressions = {}));
+ var Statements;
+ (function (Statements) {
+ Statements.isText = is(Opcodes.Text);
+ Statements.isAppend = is(Opcodes.Append);
+ Statements.isComment = is(Opcodes.Comment);
+ Statements.isModifier = is(Opcodes.Modifier);
+ Statements.isBlock = is(Opcodes.Block);
+ Statements.isComponent = is(Opcodes.Component);
+ Statements.isOpenElement = is(Opcodes.OpenElement);
+ Statements.isFlushElement = is(Opcodes.FlushElement);
+ Statements.isCloseElement = is(Opcodes.CloseElement);
+ Statements.isStaticAttr = is(Opcodes.StaticAttr);
+ Statements.isDynamicAttr = is(Opcodes.DynamicAttr);
+ Statements.isYield = is(Opcodes.Yield);
+ Statements.isPartial = is(Opcodes.Partial);
+ Statements.isDynamicArg = is(Opcodes.DynamicArg);
+ Statements.isStaticArg = is(Opcodes.StaticArg);
+ Statements.isTrustingAttr = is(Opcodes.TrustingAttr);
+ Statements.isDebugger = is(Opcodes.Debugger);
+ Statements.isClientSide = is(Opcodes.ClientSideStatement);
+ function isAttribute(val) {
+ return val[0] === Opcodes.StaticAttr || val[0] === Opcodes.DynamicAttr || val[0] === Opcodes.TrustingAttr;
+ }
+ Statements.isAttribute = isAttribute;
+ function isArgument(val) {
+ return val[0] === Opcodes.StaticArg || val[0] === Opcodes.DynamicArg;
+ }
+ Statements.isArgument = isArgument;
+ function isParameter(val) {
+ return isAttribute(val) || isArgument(val);
+ }
+ Statements.isParameter = isParameter;
+ function getParameterName(s) {
+ return s[1];
+ }
+ Statements.getParameterName = getParameterName;
+ })(Statements || (exports.Statements = Statements = {}));
+
+ exports.is = is;
+ exports.Expressions = Expressions;
+ exports.Statements = Statements;
+ exports.Ops = Opcodes;
+});
+enifed('backburner', ['exports', 'ember-babel'], function (exports, _emberBabel) {
+ 'use strict';
+
+ var NUMBER = /\d+/;
+ function isCoercableNumber(suspect) {
+ var type = typeof suspect;
+ return type === 'number' && suspect === suspect || type === 'string' && NUMBER.test(suspect);
+ }
+ function getOnError(options) {
+ return options.onError || options.onErrorTarget && options.onErrorTarget[options.onErrorMethod];
+ }
+ function findItem(target, method, collection) {
+ var index = -1;
+ for (var i = 0, l = collection.length; i < l; i += 4) {
+ if (collection[i] === target && collection[i + 1] === method) {
+ index = i;
+ break;
+ }
+ }
+ return index;
+ }
+ function findTimer(timer, collection) {
+ var index = -1;
+ for (var i = 3; i < collection.length; i += 4) {
+ if (collection[i] === timer) {
+ index = i - 3;
+ break;
+ }
+ }
+ return index;
+ }
+
+ function binarySearch(time, timers) {
+ var start = 0;
+ var end = timers.length - 6;
+ var middle = void 0;
+ var l = void 0;
+ while (start < end) {
+ // since timers is an array of pairs 'l' will always
+ // be an integer
+ l = (end - start) / 6;
+ // compensate for the index in case even number
+ // of pairs inside timers
+ middle = start + l - l % 6;
+ if (time >= timers[middle]) {
+ start = middle + 6;
+ } else {
+ end = middle;
+ }
+ }
+ return time >= timers[start] ? start + 6 : start;
+ }
+
+ var Queue = function () {
+ function Queue(name) {
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+ var globalOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
+ (0, _emberBabel.classCallCheck)(this, Queue);
+
+ this._queueBeingFlushed = [];
+ this.targetQueues = new Map();
+ this.index = 0;
+ this._queue = [];
+ this.name = name;
+ this.options = options;
+ this.globalOptions = globalOptions;
+ }
+
+ Queue.prototype.stackFor = function stackFor(index) {
+ if (index < this._queue.length) {
+ var entry = this._queue[index * 3 + 4];
+ if (entry) {
+ return entry.stack;
+ } else {
+ return null;
+ }
+ }
+ };
+
+ Queue.prototype.flush = function flush(sync) {
+ var _options = this.options,
+ before = _options.before,
+ after = _options.after;
+
+ var target = void 0;
+ var method = void 0;
+ var args = void 0;
+ var errorRecordedForStack = void 0;
+ this.targetQueues.clear();
+ if (this._queueBeingFlushed.length === 0) {
+ this._queueBeingFlushed = this._queue;
+ this._queue = [];
+ }
+ if (before !== undefined) {
+ before();
+ }
+ var invoke = void 0;
+ var queueItems = this._queueBeingFlushed;
+ if (queueItems.length > 0) {
+ var onError = getOnError(this.globalOptions);
+ invoke = onError ? this.invokeWithOnError : this.invoke;
+ for (var i = this.index; i < queueItems.length; i += 4) {
+ this.index += 4;
+ method = queueItems[i + 1];
+ // method could have been nullified / canceled during flush
+ if (method !== null) {
+ //
+ // ** Attention intrepid developer **
+ //
+ // To find out the stack of this task when it was scheduled onto
+ // the run loop, add the following to your app.js:
+ //
+ // Ember.run.backburner.DEBUG = true; // NOTE: This slows your app, don't leave it on in production.
+ //
+ // Once that is in place, when you are at a breakpoint and navigate
+ // here in the stack explorer, you can look at `errorRecordedForStack.stack`,
+ // which will be the captured stack when this job was scheduled.
+ //
+ // One possible long-term solution is the following Chrome issue:
+ // https://bugs.chromium.org/p/chromium/issues/detail?id=332624
+ //
+ target = queueItems[i];
+ args = queueItems[i + 2];
+ errorRecordedForStack = queueItems[i + 3]; // Debugging assistance
+ invoke(target, method, args, onError, errorRecordedForStack);
+ }
+ if (this.index !== this._queueBeingFlushed.length && this.globalOptions.mustYield && this.globalOptions.mustYield()) {
+ return 1 /* Pause */;
+ }
+ }
+ }
+ if (after !== undefined) {
+ after();
+ }
+ this._queueBeingFlushed.length = 0;
+ this.index = 0;
+ if (sync !== false && this._queue.length > 0) {
+ // check if new items have been added
+ this.flush(true);
+ }
+ };
+
+ Queue.prototype.hasWork = function hasWork() {
+ return this._queueBeingFlushed.length > 0 || this._queue.length > 0;
+ };
+
+ Queue.prototype.cancel = function cancel(_ref) {
+ var target = _ref.target,
+ method = _ref.method;
+
+ var queue = this._queue;
+ var targetQueueMap = this.targetQueues.get(target);
+ if (targetQueueMap !== undefined) {
+ targetQueueMap.delete(method);
+ }
+ var index = findItem(target, method, queue);
+ if (index > -1) {
+ queue.splice(index, 4);
+ return true;
+ }
+ // if not found in current queue
+ // could be in the queue that is being flushed
+ queue = this._queueBeingFlushed;
+ index = findItem(target, method, queue);
+ if (index > -1) {
+ queue[index + 1] = null;
+ return true;
+ }
+ return false;
+ };
+
+ Queue.prototype.push = function push(target, method, args, stack) {
+ this._queue.push(target, method, args, stack);
+ return {
+ queue: this,
+ target: target,
+ method: method
+ };
+ };
+
+ Queue.prototype.pushUnique = function pushUnique(target, method, args, stack) {
+ var localQueueMap = this.targetQueues.get(target);
+ if (localQueueMap === undefined) {
+ localQueueMap = new Map();
+ this.targetQueues.set(target, localQueueMap);
+ }
+ var index = localQueueMap.get(method);
+ if (index === undefined) {
+ var queueIndex = this._queue.push(target, method, args, stack) - 4;
+ localQueueMap.set(method, queueIndex);
+ } else {
+ var queue = this._queue;
+ queue[index + 2] = args; // replace args
+ queue[index + 3] = stack; // replace stack
+ }
+ return {
+ queue: this,
+ target: target,
+ method: method
+ };
+ };
+
+ Queue.prototype.invoke = function invoke(target, method, args /*, onError, errorRecordedForStack */) {
+ if (args === undefined) {
+ method.call(target);
+ } else {
+ method.apply(target, args);
+ }
+ };
+
+ Queue.prototype.invokeWithOnError = function invokeWithOnError(target, method, args, onError, errorRecordedForStack) {
+ try {
+ if (args === undefined) {
+ method.call(target);
+ } else {
+ method.apply(target, args);
+ }
+ } catch (error) {
+ onError(error, errorRecordedForStack);
+ }
+ };
+
+ return Queue;
+ }();
+
+ var DeferredActionQueues = function () {
+ function DeferredActionQueues() {
+ var queueNames = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
+ var options = arguments[1];
+ (0, _emberBabel.classCallCheck)(this, DeferredActionQueues);
+
+ this.queues = {};
+ this.queueNameIndex = 0;
+ this.queueNames = queueNames;
+ queueNames.reduce(function (queues, queueName) {
+ queues[queueName] = new Queue(queueName, options[queueName], options);
+ return queues;
+ }, this.queues);
+ }
+ /*
+ @method schedule
+ @param {String} queueName
+ @param {Any} target
+ @param {Any} method
+ @param {Any} args
+ @param {Boolean} onceFlag
+ @param {Any} stack
+ @return queue
+ */
+
+
+ DeferredActionQueues.prototype.schedule = function schedule(queueName, target, method, args, onceFlag, stack) {
+ var queues = this.queues;
+ var queue = queues[queueName];
+ if (queue === undefined) {
+ throw new Error('You attempted to schedule an action in a queue (' + queueName + ') that doesn\'t exist');
+ }
+ if (method === undefined || method === null) {
+ throw new Error('You attempted to schedule an action in a queue (' + queueName + ') for a method that doesn\'t exist');
+ }
+ if (onceFlag) {
+ return queue.pushUnique(target, method, args, stack);
+ } else {
+ return queue.push(target, method, args, stack);
+ }
+ };
+
+ DeferredActionQueues.prototype.flush = function flush() {
+ var queue = void 0;
+ var queueName = void 0;
+ var numberOfQueues = this.queueNames.length;
+ while (this.queueNameIndex < numberOfQueues) {
+ queueName = this.queueNames[this.queueNameIndex];
+ queue = this.queues[queueName];
+ if (queue.hasWork() === false) {
+ this.queueNameIndex++;
+ } else {
+ if (queue.flush(false /* async */) === 1 /* Pause */) {
+ return 1 /* Pause */;
+ }
+ this.queueNameIndex = 0; // only reset to first queue if non-pause break
+ }
+ }
+ };
+
+ return DeferredActionQueues;
+ }();
+
+ var iteratorDrain = function (fn) {
+ var iterator = fn();
+ var result = iterator.next();
+ while (result.done === false) {
+ result.value();
+ result = iterator.next();
+ }
+ };
+
+ var noop = function () {};
+ var SET_TIMEOUT = setTimeout;
+ function parseArgs() {
+ var length = arguments.length;
+ var method = void 0;
+ var target = void 0;
+ var args = void 0;
+ if (length === 1) {
+ method = arguments[0];
+ target = null;
+ } else {
+ target = arguments[0];
+ method = arguments[1];
+ if (typeof method === 'string') {
+ method = target[method];
+ }
+ if (length > 2) {
+ args = new Array(length - 2);
+ for (var i = 0, l = length - 2; i < l; i++) {
+ args[i] = arguments[i + 2];
+ }
+ }
+ }
+ return [target, method, args];
+ }
+ var UUID = 0;
+
+ var Backburner = function () {
+ function Backburner(queueNames) {
+ var _this = this;
+
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+ (0, _emberBabel.classCallCheck)(this, Backburner);
+
+ this.DEBUG = false;
+ this.currentInstance = null;
+ this.instanceStack = [];
+ this._debouncees = [];
+ this._throttlers = [];
+ this._eventCallbacks = {
+ end: [],
+ begin: []
+ };
+ this._timerTimeoutId = null;
+ this._timers = [];
+ this._autorun = null;
+ this.queueNames = queueNames;
+ this.options = options;
+ if (!this.options.defaultQueue) {
+ this.options.defaultQueue = queueNames[0];
+ }
+ this._onBegin = this.options.onBegin || noop;
+ this._onEnd = this.options.onEnd || noop;
+ var _platform = this.options._platform || {};
+ var platform = Object.create(null);
+ platform.setTimeout = _platform.setTimeout || function (fn, ms) {
+ return setTimeout(fn, ms);
+ };
+ platform.clearTimeout = _platform.clearTimeout || function (id) {
+ return clearTimeout(id);
+ };
+ platform.next = _platform.next || function (fn) {
+ return SET_TIMEOUT(fn, 0);
+ };
+ platform.clearNext = _platform.clearNext || platform.clearTimeout;
+ platform.now = _platform.now || function () {
+ return Date.now();
+ };
+ this._platform = platform;
+ this._boundRunExpiredTimers = function () {
+ _this._runExpiredTimers();
+ };
+ this._boundAutorunEnd = function () {
+ _this._autorun = null;
+ _this.end();
+ };
+ }
+ /*
+ @method begin
+ @return instantiated class DeferredActionQueues
+ */
+
+
+ Backburner.prototype.begin = function begin() {
+ var options = this.options;
+ var previousInstance = this.currentInstance;
+ var current = void 0;
+ if (this._autorun !== null) {
+ current = previousInstance;
+ this._cancelAutorun();
+ } else {
+ if (previousInstance !== null) {
+ this.instanceStack.push(previousInstance);
+ }
+ current = this.currentInstance = new DeferredActionQueues(this.queueNames, options);
+ this._trigger('begin', current, previousInstance);
+ }
+ this._onBegin(current, previousInstance);
+ return current;
+ };
+
+ Backburner.prototype.end = function end() {
+ var currentInstance = this.currentInstance;
+ var nextInstance = null;
+ if (currentInstance === null) {
+ throw new Error('end called without begin');
+ }
+ // Prevent double-finally bug in Safari 6.0.2 and iOS 6
+ // This bug appears to be resolved in Safari 6.0.5 and iOS 7
+ var finallyAlreadyCalled = false;
+ var result = void 0;
+ try {
+ result = currentInstance.flush();
+ } finally {
+ if (!finallyAlreadyCalled) {
+ finallyAlreadyCalled = true;
+ if (result === 1 /* Pause */) {
+ var next = this._platform.next;
+ this._autorun = next(this._boundAutorunEnd);
+ } else {
+ this.currentInstance = null;
+ if (this.instanceStack.length > 0) {
+ nextInstance = this.instanceStack.pop();
+ this.currentInstance = nextInstance;
+ }
+ this._trigger('end', currentInstance, nextInstance);
+ this._onEnd(currentInstance, nextInstance);
+ }
+ }
+ }
+ };
+
+ Backburner.prototype.on = function on(eventName, callback) {
+ if (typeof callback !== 'function') {
+ throw new TypeError('Callback must be a function');
+ }
+ var callbacks = this._eventCallbacks[eventName];
+ if (callbacks !== undefined) {
+ callbacks.push(callback);
+ } else {
+ throw new TypeError('Cannot on() event ' + eventName + ' because it does not exist');
+ }
+ };
+
+ Backburner.prototype.off = function off(eventName, callback) {
+ var callbacks = this._eventCallbacks[eventName];
+ if (!eventName || callbacks === undefined) {
+ throw new TypeError('Cannot off() event ' + eventName + ' because it does not exist');
+ }
+ var callbackFound = false;
+ if (callback) {
+ for (var i = 0; i < callbacks.length; i++) {
+ if (callbacks[i] === callback) {
+ callbackFound = true;
+ callbacks.splice(i, 1);
+ i--;
+ }
+ }
+ }
+ if (!callbackFound) {
+ throw new TypeError('Cannot off() callback that does not exist');
+ }
+ };
+
+ Backburner.prototype.run = function run() {
+ var _parseArgs = parseArgs.apply(undefined, arguments),
+ target = _parseArgs[0],
+ method = _parseArgs[1],
+ args = _parseArgs[2];
+
+ return this._run(target, method, args);
+ };
+
+ Backburner.prototype.join = function join() {
+ var _parseArgs2 = parseArgs.apply(undefined, arguments),
+ target = _parseArgs2[0],
+ method = _parseArgs2[1],
+ args = _parseArgs2[2];
+
+ return this._join(target, method, args);
+ };
+
+ Backburner.prototype.defer = function defer(queueName, targetOrMethod) {
+ for (var _len = arguments.length, _args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
+ _args[_key - 2] = arguments[_key];
+ }
+
+ return this.schedule.apply(this, [queueName, targetOrMethod].concat(_args));
+ };
+
+ Backburner.prototype.schedule = function schedule(queueName) {
+ for (var _len2 = arguments.length, _args = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
+ _args[_key2 - 1] = arguments[_key2];
+ }
+
+ var _parseArgs3 = parseArgs.apply(undefined, _args),
+ target = _parseArgs3[0],
+ method = _parseArgs3[1],
+ args = _parseArgs3[2];
+
+ var stack = this.DEBUG ? new Error() : undefined;
+ return this._ensureInstance().schedule(queueName, target, method, args, false, stack);
+ };
+
+ Backburner.prototype.scheduleIterable = function scheduleIterable(queueName, iterable) {
+ var stack = this.DEBUG ? new Error() : undefined;
+ return this._ensureInstance().schedule(queueName, null, iteratorDrain, [iterable], false, stack);
+ };
+
+ Backburner.prototype.deferOnce = function deferOnce(queueName, targetOrMethod) {
+ for (var _len3 = arguments.length, args = Array(_len3 > 2 ? _len3 - 2 : 0), _key3 = 2; _key3 < _len3; _key3++) {
+ args[_key3 - 2] = arguments[_key3];
+ }
+
+ return this.scheduleOnce.apply(this, [queueName, targetOrMethod].concat(args));
+ };
+
+ Backburner.prototype.scheduleOnce = function scheduleOnce(queueName) {
+ for (var _len4 = arguments.length, _args = Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {
+ _args[_key4 - 1] = arguments[_key4];
+ }
+
+ var _parseArgs4 = parseArgs.apply(undefined, _args),
+ target = _parseArgs4[0],
+ method = _parseArgs4[1],
+ args = _parseArgs4[2];
+
+ var stack = this.DEBUG ? new Error() : undefined;
+ return this._ensureInstance().schedule(queueName, target, method, args, true, stack);
+ };
+
+ Backburner.prototype.setTimeout = function setTimeout() {
+ return this.later.apply(this, arguments);
+ };
+
+ Backburner.prototype.later = function later() {
+ for (var _len5 = arguments.length, args = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
+ args[_key5] = arguments[_key5];
+ }
+
+ var length = args.length;
+ var wait = 0;
+ var method = void 0;
+ var target = void 0;
+ var methodOrTarget = void 0;
+ var methodOrArgs = void 0;
+ if (length === 0) {
+ return;
+ } else if (length === 1) {
+ method = args.shift();
+ } else {
+ var last = args[args.length - 1];
+ if (isCoercableNumber(last)) {
+ wait = parseInt(args.pop(), 10);
+ }
+ methodOrTarget = args[0];
+ methodOrArgs = args[1];
+ var type = typeof methodOrArgs;
+ if (type === 'function') {
+ target = args.shift();
+ method = args.shift();
+ } else if (methodOrTarget !== null && type === 'string' && methodOrArgs in methodOrTarget) {
+ target = args.shift();
+ method = target[args.shift()];
+ } else {
+ method = args.shift();
+ }
+ }
+ return this._setTimeout(target, method, args, wait);
+ };
+
+ Backburner.prototype.throttle = function throttle(targetOrThisArgOrMethod) {
+ var _this2 = this;
+
+ var target = void 0;
+ var method = void 0;
+ var immediate = void 0;
+ var isImmediate = void 0;
+ var wait = void 0;
+
+ for (var _len6 = arguments.length, args = Array(_len6 > 1 ? _len6 - 1 : 0), _key6 = 1; _key6 < _len6; _key6++) {
+ args[_key6 - 1] = arguments[_key6];
+ }
+
+ if (args.length === 1) {
+ method = targetOrThisArgOrMethod;
+ wait = args.pop();
+ target = null;
+ isImmediate = true;
+ } else {
+ target = targetOrThisArgOrMethod;
+ method = args.shift();
+ immediate = args.pop();
+ var type = typeof method;
+ if (type === 'string') {
+ method = target[method];
+ } else if (type !== 'function') {
+ args.unshift(method);
+ method = target;
+ target = null;
+ }
+ if (isCoercableNumber(immediate)) {
+ wait = immediate;
+ isImmediate = true;
+ } else {
+ wait = args.pop();
+ isImmediate = immediate === true;
+ }
+ }
+ var index = findItem(target, method, this._throttlers);
+ if (index > -1) {
+ this._throttlers[index + 2] = args;
+ return this._throttlers[index + 3];
+ } // throttled
+ wait = parseInt(wait, 10);
+ var timer = this._platform.setTimeout(function () {
+ var i = findTimer(timer, _this2._throttlers);
+
+ var _throttlers$splice = _this2._throttlers.splice(i, 4),
+ context = _throttlers$splice[0],
+ func = _throttlers$splice[1],
+ params = _throttlers$splice[2];
+
+ if (isImmediate === false) {
+ _this2._run(context, func, params);
+ }
+ }, wait);
+ if (isImmediate) {
+ this._join(target, method, args);
+ }
+ this._throttlers.push(target, method, args, timer);
+ return timer;
+ };
+
+ Backburner.prototype.debounce = function debounce(targetOrThisArgOrMethod) {
+ var _this3 = this;
+
+ var target = void 0;
+ var method = void 0;
+ var immediate = void 0;
+ var isImmediate = void 0;
+ var wait = void 0;
+
+ for (var _len7 = arguments.length, args = Array(_len7 > 1 ? _len7 - 1 : 0), _key7 = 1; _key7 < _len7; _key7++) {
+ args[_key7 - 1] = arguments[_key7];
+ }
+
+ if (args.length === 1) {
+ method = targetOrThisArgOrMethod;
+ wait = args.pop();
+ target = null;
+ isImmediate = false;
+ } else {
+ target = targetOrThisArgOrMethod;
+ method = args.shift();
+ immediate = args.pop();
+ var type = typeof method;
+ if (type === 'string') {
+ method = target[method];
+ } else if (type !== 'function') {
+ args.unshift(method);
+ method = target;
+ target = null;
+ }
+ if (isCoercableNumber(immediate)) {
+ wait = immediate;
+ isImmediate = false;
+ } else {
+ wait = args.pop();
+ isImmediate = immediate === true;
+ }
+ }
+ wait = parseInt(wait, 10);
+ // Remove debouncee
+ var index = findItem(target, method, this._debouncees);
+ if (index > -1) {
+ var timerId = this._debouncees[index + 3];
+ this._platform.clearTimeout(timerId);
+ this._debouncees.splice(index, 4);
+ }
+ var timer = this._platform.setTimeout(function () {
+ var i = findTimer(timer, _this3._debouncees);
+
+ var _debouncees$splice = _this3._debouncees.splice(i, 4),
+ context = _debouncees$splice[0],
+ func = _debouncees$splice[1],
+ params = _debouncees$splice[2];
+
+ if (isImmediate === false) {
+ _this3._run(context, func, params);
+ }
+ }, wait);
+ if (isImmediate && index === -1) {
+ this._join(target, method, args);
+ }
+ this._debouncees.push(target, method, args, timer);
+ return timer;
+ };
+
+ Backburner.prototype.cancelTimers = function cancelTimers() {
+ for (var i = 3; i < this._throttlers.length; i += 4) {
+ this._platform.clearTimeout(this._throttlers[i]);
+ }
+ this._throttlers = [];
+ for (var t = 3; t < this._debouncees.length; t += 4) {
+ this._platform.clearTimeout(this._debouncees[t]);
+ }
+ this._debouncees = [];
+ this._clearTimerTimeout();
+ this._timers = [];
+ this._cancelAutorun();
+ };
+
+ Backburner.prototype.hasTimers = function hasTimers() {
+ return this._timers.length > 0 || this._debouncees.length > 0 || this._throttlers.length > 0 || this._autorun !== null;
+ };
+
+ Backburner.prototype.cancel = function cancel(timer) {
+ if (!timer) {
+ return false;
+ }
+ var timerType = typeof timer;
+ if (timerType === 'number') {
+ return this._cancelItem(timer, this._throttlers) || this._cancelItem(timer, this._debouncees);
+ } else if (timerType === 'string') {
+ return this._cancelLaterTimer(timer);
+ } else if (timerType === 'object' && timer.queue && timer.method) {
+ return timer.queue.cancel(timer);
+ }
+ return false;
+ };
+
+ Backburner.prototype.ensureInstance = function ensureInstance() {
+ this._ensureInstance();
+ };
+
+ Backburner.prototype._join = function _join(target, method, args) {
+ if (this.currentInstance === null) {
+ return this._run(target, method, args);
+ }
+ if (target === undefined && args === undefined) {
+ return method();
+ } else {
+ return method.apply(target, args);
+ }
+ };
+
+ Backburner.prototype._run = function _run(target, method, args) {
+ var onError = getOnError(this.options);
+ this.begin();
+ if (onError) {
+ try {
+ return method.apply(target, args);
+ } catch (error) {
+ onError(error);
+ } finally {
+ this.end();
+ }
+ } else {
+ try {
+ return method.apply(target, args);
+ } finally {
+ this.end();
+ }
+ }
+ };
+
+ Backburner.prototype._cancelAutorun = function _cancelAutorun() {
+ if (this._autorun !== null) {
+ this._platform.clearNext(this._autorun);
+ this._autorun = null;
+ }
+ };
+
+ Backburner.prototype._setTimeout = function _setTimeout(target, method, args, wait) {
+ var stack = this.DEBUG ? new Error() : undefined;
+ var executeAt = this._platform.now() + wait;
+ var id = UUID++ + '';
+ if (this._timers.length === 0) {
+ this._timers.push(executeAt, id, target, method, args, stack);
+ this._installTimerTimeout();
+ return id;
+ }
+ // find position to insert
+ var i = binarySearch(executeAt, this._timers);
+ this._timers.splice(i, 0, executeAt, id, target, method, args, stack);
+ // we should be the new earliest timer if i == 0
+ if (i === 0) {
+ this._reinstallTimerTimeout();
+ }
+ return id;
+ };
+
+ Backburner.prototype._cancelLaterTimer = function _cancelLaterTimer(timer) {
+ for (var i = 1; i < this._timers.length; i += 6) {
+ if (this._timers[i] === timer) {
+ i = i - 1;
+ this._timers.splice(i, 6);
+ if (i === 0) {
+ this._reinstallTimerTimeout();
+ }
+ return true;
+ }
+ }
+ return false;
+ };
+
+ Backburner.prototype._cancelItem = function _cancelItem(timer, array) {
+ var index = findTimer(timer, array);
+ if (index > -1) {
+ this._platform.clearTimeout(timer);
+ array.splice(index, 4);
+ return true;
+ }
+ return false;
+ };
+
+ Backburner.prototype._trigger = function _trigger(eventName, arg1, arg2) {
+ var callbacks = this._eventCallbacks[eventName];
+ if (callbacks !== undefined) {
+ for (var i = 0; i < callbacks.length; i++) {
+ callbacks[i](arg1, arg2);
+ }
+ }
+ };
+
+ Backburner.prototype._runExpiredTimers = function _runExpiredTimers() {
+ this._timerTimeoutId = null;
+ if (this._timers.length === 0) {
+ return;
+ }
+ this.begin();
+ this._scheduleExpiredTimers();
+ this.end();
+ };
+
+ Backburner.prototype._scheduleExpiredTimers = function _scheduleExpiredTimers() {
+ var timers = this._timers;
+ var i = 0;
+ var l = timers.length;
+ var defaultQueue = this.options.defaultQueue;
+ var n = this._platform.now();
+ for (; i < l; i += 6) {
+ var executeAt = timers[i];
+ if (executeAt <= n) {
+ var target = timers[i + 2];
+ var method = timers[i + 3];
+ var _args2 = timers[i + 4];
+ var stack = timers[i + 5];
+ this.currentInstance.schedule(defaultQueue, target, method, _args2, false, stack);
+ } else {
+ break;
+ }
+ }
+ timers.splice(0, i);
+ this._installTimerTimeout();
+ };
+
+ Backburner.prototype._reinstallTimerTimeout = function _reinstallTimerTimeout() {
+ this._clearTimerTimeout();
+ this._installTimerTimeout();
+ };
+
+ Backburner.prototype._clearTimerTimeout = function _clearTimerTimeout() {
+ if (this._timerTimeoutId === null) {
+ return;
+ }
+ this._platform.clearTimeout(this._timerTimeoutId);
+ this._timerTimeoutId = null;
+ };
+
+ Backburner.prototype._installTimerTimeout = function _installTimerTimeout() {
+ if (this._timers.length === 0) {
+ return;
+ }
+ var minExpiresAt = this._timers[0];
+ var n = this._platform.now();
+ var wait = Math.max(0, minExpiresAt - n);
+ this._timerTimeoutId = this._platform.setTimeout(this._boundRunExpiredTimers, wait);
+ };
+
+ Backburner.prototype._ensureInstance = function _ensureInstance() {
+ var currentInstance = this.currentInstance;
+ if (currentInstance === null) {
+ currentInstance = this.begin();
+ var next = this._platform.next;
+ this._autorun = next(this._boundAutorunEnd);
+ }
+ return currentInstance;
+ };
+
+ return Backburner;
+ }();
+
+ Backburner.Queue = Queue;
+
+ exports.default = Backburner;
+});
+enifed('container', ['exports', 'ember-babel', 'ember-utils', 'ember-debug', 'ember/features', 'ember-environment'], function (exports, _emberBabel, _emberUtils, _emberDebug, _features, _emberEnvironment) {
+ 'use strict';
+
+ exports.Container = exports.privatize = exports.Registry = undefined;
+
+ var Container = function () {
+ function Container(registry) {
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+ (0, _emberBabel.classCallCheck)(this, Container);
+
+ this.registry = registry;
+ this.owner = options.owner || null;
+ this.cache = (0, _emberUtils.dictionary)(options.cache || null);
+ this.factoryManagerCache = (0, _emberUtils.dictionary)(options.factoryManagerCache || null);
+ this.isDestroyed = false;
+
+ if (true) {
+ this.validationCache = (0, _emberUtils.dictionary)(options.validationCache || null);
+ }
+ }
+
+ /**
+ @private
+ @property registry
+ @type Registry
+ @since 1.11.0
+ */
+
+ /**
+ @private
+ @property cache
+ @type InheritingDict
+ */
+
+ /**
+ @private
+ @property validationCache
+ @type InheritingDict
+ */
+
+ /**
+ Given a fullName return a corresponding instance.
+ The default behavior is for lookup to return a singleton instance.
+ The singleton is scoped to the container, allowing multiple containers
+ to all have their own locally scoped singletons.
+ ```javascript
+ let registry = new Registry();
+ let container = registry.container();
+ registry.register('api:twitter', Twitter);
+ let twitter = container.lookup('api:twitter');
+ twitter instanceof Twitter; // => true
+ // by default the container will return singletons
+ let twitter2 = container.lookup('api:twitter');
+ twitter2 instanceof Twitter; // => true
+ twitter === twitter2; //=> true
+ ```
+ If singletons are not wanted, an optional flag can be provided at lookup.
+ ```javascript
+ let registry = new Registry();
+ let container = registry.container();
+ registry.register('api:twitter', Twitter);
+ let twitter = container.lookup('api:twitter', { singleton: false });
+ let twitter2 = container.lookup('api:twitter', { singleton: false });
+ twitter === twitter2; //=> false
+ ```
+ @private
+ @method lookup
+ @param {String} fullName
+ @param {Object} [options]
+ @param {String} [options.source] The fullname of the request source (used for local lookup)
+ @return {any}
+ */
+
+
+ Container.prototype.lookup = function lookup(fullName, options) {
+ (true && !(this.registry.isValidFullName(fullName)) && (0, _emberDebug.assert)('fullName must be a proper full name', this.registry.isValidFullName(fullName)));
+
+ return _lookup(this, this.registry.normalize(fullName), options);
+ };
+
+ Container.prototype.destroy = function destroy() {
+ destroyDestroyables(this);
+ this.isDestroyed = true;
+ };
+
+ Container.prototype.reset = function reset(fullName) {
+ if (fullName === undefined) {
+ resetCache(this);
+ } else {
+ resetMember(this, this.registry.normalize(fullName));
+ }
+ };
+
+ Container.prototype.ownerInjection = function ownerInjection() {
+ var _ref;
+
+ return _ref = {}, _ref[_emberUtils.OWNER] = this.owner, _ref;
+ };
+
+ Container.prototype._resolverCacheKey = function _resolverCacheKey(name, options) {
+ return this.registry.resolverCacheKey(name, options);
+ };
+
+ Container.prototype.factoryFor = function factoryFor(fullName) {
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ var normalizedName = this.registry.normalize(fullName);
+
+ (true && !(this.registry.isValidFullName(normalizedName)) && (0, _emberDebug.assert)('fullName must be a proper full name', this.registry.isValidFullName(normalizedName)));
+
+
+ if (options.source) {
+ var expandedFullName = this.registry.expandLocalLookup(fullName, options);
+ // if expandLocalLookup returns falsey, we do not support local lookup
+ if (!_features.EMBER_MODULE_UNIFICATION) {
+ if (!expandedFullName) {
+ return;
+ }
+
+ normalizedName = expandedFullName;
+ } else if (expandedFullName) {
+ // with ember-module-unification, if expandLocalLookup returns something,
+ // pass it to the resolve without the source
+ normalizedName = expandedFullName;
+ options = {};
+ }
+ }
+
+ var cacheKey = this._resolverCacheKey(normalizedName, options);
+ var cached = this.factoryManagerCache[cacheKey];
+
+ if (cached !== undefined) {
+ return cached;
+ }
+
+ var factory = _features.EMBER_MODULE_UNIFICATION ? this.registry.resolve(normalizedName, options) : this.registry.resolve(normalizedName);
+
+ if (factory === undefined) {
+ return;
+ }
+
+ if (true && factory && typeof factory._onLookup === 'function') {
+ factory._onLookup(fullName);
+ }
+
+ var manager = new FactoryManager(this, factory, fullName, normalizedName);
+
+ if (true) {
+ manager = wrapManagerInDeprecationProxy(manager);
+ }
+
+ this.factoryManagerCache[cacheKey] = manager;
+ return manager;
+ };
+
+ return Container;
+ }();
+
+ /*
+ * Wrap a factory manager in a proxy which will not permit properties to be
+ * set on the manager.
+ */
+ function wrapManagerInDeprecationProxy(manager) {
+ if (_emberUtils.HAS_NATIVE_PROXY) {
+ var validator = {
+ set: function (obj, prop) {
+ throw new Error('You attempted to set "' + prop + '" on a factory manager created by container#factoryFor. A factory manager is a read-only construct.');
+ }
+ };
+
+ // Note:
+ // We have to proxy access to the manager here so that private property
+ // access doesn't cause the above errors to occur.
+ var m = manager;
+ var proxiedManager = {
+ class: m.class,
+ create: function (props) {
+ return m.create(props);
+ }
+ };
+
+ return new Proxy(proxiedManager, validator);
+ }
+
+ return manager;
+ }
+
+ function isSingleton(container, fullName) {
+ return container.registry.getOption(fullName, 'singleton') !== false;
+ }
+
+ function isInstantiatable(container, fullName) {
+ return container.registry.getOption(fullName, 'instantiate') !== false;
+ }
+
+ function _lookup(container, fullName) {
+ var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
+
+ if (options.source) {
+ var expandedFullName = container.registry.expandLocalLookup(fullName, options);
+
+ if (!_features.EMBER_MODULE_UNIFICATION) {
+ // if expandLocalLookup returns falsey, we do not support local lookup
+ if (!expandedFullName) {
+ return;
+ }
+
+ fullName = expandedFullName;
+ } else if (expandedFullName) {
+ // with ember-module-unification, if expandLocalLookup returns something,
+ // pass it to the resolve without the source
+ fullName = expandedFullName;
+ options = {};
+ }
+ }
+
+ if (options.singleton !== false) {
+ var cacheKey = container._resolverCacheKey(fullName, options);
+ var cached = container.cache[cacheKey];
+ if (cached !== undefined) {
+ return cached;
+ }
+ }
+
+ return instantiateFactory(container, fullName, options);
+ }
+
+ function isSingletonClass(container, fullName, _ref2) {
+ var instantiate = _ref2.instantiate,
+ singleton = _ref2.singleton;
+
+ return singleton !== false && !instantiate && isSingleton(container, fullName) && !isInstantiatable(container, fullName);
+ }
+
+ function isSingletonInstance(container, fullName, _ref3) {
+ var instantiate = _ref3.instantiate,
+ singleton = _ref3.singleton;
+
+ return singleton !== false && instantiate !== false && isSingleton(container, fullName) && isInstantiatable(container, fullName);
+ }
+
+ function isFactoryClass(container, fullname, _ref4) {
+ var instantiate = _ref4.instantiate,
+ singleton = _ref4.singleton;
+
+ return instantiate === false && (singleton === false || !isSingleton(container, fullname)) && !isInstantiatable(container, fullname);
+ }
+
+ function isFactoryInstance(container, fullName, _ref5) {
+ var instantiate = _ref5.instantiate,
+ singleton = _ref5.singleton;
+
+ return instantiate !== false && (singleton !== false || isSingleton(container, fullName)) && isInstantiatable(container, fullName);
+ }
+
+ function instantiateFactory(container, fullName, options) {
+ var factoryManager = _features.EMBER_MODULE_UNIFICATION && options && options.source ? container.factoryFor(fullName, options) : container.factoryFor(fullName);
+
+ if (factoryManager === undefined) {
+ return;
+ }
+
+ // SomeClass { singleton: true, instantiate: true } | { singleton: true } | { instantiate: true } | {}
+ // By default majority of objects fall into this case
+ if (isSingletonInstance(container, fullName, options)) {
+ var cacheKey = container._resolverCacheKey(fullName, options);
+ return container.cache[cacheKey] = factoryManager.create();
+ }
+
+ // SomeClass { singleton: false, instantiate: true }
+ if (isFactoryInstance(container, fullName, options)) {
+ return factoryManager.create();
+ }
+
+ // SomeClass { singleton: true, instantiate: false } | { instantiate: false } | { singleton: false, instantiation: false }
+ if (isSingletonClass(container, fullName, options) || isFactoryClass(container, fullName, options)) {
+ return factoryManager.class;
+ }
+
+ throw new Error('Could not create factory');
+ }
+
+ function buildInjections(container, injections) {
+ var hash = {};
+ var isDynamic = false;
+
+ if (injections.length > 0) {
+ if (true) {
+ container.registry.validateInjections(injections);
+ }
+
+ var injection = void 0;
+ for (var i = 0; i < injections.length; i++) {
+ injection = injections[i];
+ hash[injection.property] = _lookup(container, injection.fullName);
+ if (!isDynamic) {
+ isDynamic = !isSingleton(container, injection.fullName);
+ }
+ }
+ }
+
+ return { injections: hash, isDynamic: isDynamic };
+ }
+
+ function injectionsFor(container, fullName) {
+ var registry = container.registry;
+
+ var _fullName$split = fullName.split(':'),
+ type = _fullName$split[0];
+
+ var injections = registry.getTypeInjections(type).concat(registry.getInjections(fullName));
+ return buildInjections(container, injections);
+ }
+
+ function destroyDestroyables(container) {
+ var cache = container.cache;
+ var keys = Object.keys(cache);
+
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];
+ var value = cache[key];
+
+ if (value.destroy) {
+ value.destroy();
+ }
+ }
+ }
+
+ function resetCache(container) {
+ destroyDestroyables(container);
+ container.cache = (0, _emberUtils.dictionary)(null);
+ container.factoryManagerCache = (0, _emberUtils.dictionary)(null);
+ }
+
+ function resetMember(container, fullName) {
+ var member = container.cache[fullName];
+
+ delete container.factoryManagerCache[fullName];
+
+ if (member) {
+ delete container.cache[fullName];
+
+ if (member.destroy) {
+ member.destroy();
+ }
+ }
+ }
+
+ var FactoryManager = function () {
+ function FactoryManager(container, factory, fullName, normalizedName) {
+ (0, _emberBabel.classCallCheck)(this, FactoryManager);
+
+ this.container = container;
+ this.owner = container.owner;
+ this.class = factory;
+ this.fullName = fullName;
+ this.normalizedName = normalizedName;
+ this.madeToString = undefined;
+ this.injections = undefined;
+ }
+
+ FactoryManager.prototype.toString = function toString() {
+ if (this.madeToString === undefined) {
+ this.madeToString = this.container.registry.makeToString(this.class, this.fullName);
+ }
+
+ return this.madeToString;
+ };
+
+ FactoryManager.prototype.create = function create() {
+ var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+ var injectionsCache = this.injections;
+ if (injectionsCache === undefined) {
+ var _injectionsFor = injectionsFor(this.container, this.normalizedName),
+ injections = _injectionsFor.injections,
+ isDynamic = _injectionsFor.isDynamic;
+
+ injectionsCache = injections;
+ if (!isDynamic) {
+ this.injections = injections;
+ }
+ }
+
+ var props = (0, _emberUtils.assign)({}, injectionsCache, options);
+
+ if (true) {
+ var lazyInjections = void 0;
+ var validationCache = this.container.validationCache;
+ // Ensure that all lazy injections are valid at instantiation time
+ if (!validationCache[this.fullName] && this.class && typeof this.class._lazyInjections === 'function') {
+ lazyInjections = this.class._lazyInjections();
+ lazyInjections = this.container.registry.normalizeInjectionsHash(lazyInjections);
+
+ this.container.registry.validateInjections(lazyInjections);
+ }
+
+ validationCache[this.fullName] = true;
+ }
+
+ if (!this.class.create) {
+ throw new Error('Failed to create an instance of \'' + this.normalizedName + '\'. Most likely an improperly defined class or' + ' an invalid module export.');
+ }
+
+ // required to allow access to things like
+ // the customized toString, _debugContainerKey,
+ // owner, etc. without a double extend and without
+ // modifying the objects properties
+ if (typeof this.class._initFactory === 'function') {
+ this.class._initFactory(this);
+ } else {
+ // in the non-EmberObject case we need to still setOwner
+ // this is required for supporting glimmer environment and
+ // template instantiation which rely heavily on
+ // `options[OWNER]` being passed into `create`
+ // TODO: clean this up, and remove in future versions
+ (0, _emberUtils.setOwner)(props, this.owner);
+ }
+
+ return this.class.create(props);
+ };
+
+ return FactoryManager;
+ }();
+
+ var VALID_FULL_NAME_REGEXP = /^[^:]+:[^:]+$/;
+ var missingResolverFunctionsDeprecation = 'Passing a `resolver` function into a Registry is deprecated. Please pass in a Resolver object with a `resolve` method.';
+
+ /**
+ A registry used to store factory and option information keyed
+ by type.
+
+ A `Registry` stores the factory and option information needed by a
+ `Container` to instantiate and cache objects.
+
+ The API for `Registry` is still in flux and should not be considered stable.
+
+ @private
+ @class Registry
+ @since 1.11.0
+ */
+
+ var Registry = function () {
+ function Registry() {
+ var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+ (0, _emberBabel.classCallCheck)(this, Registry);
+
+ this.fallback = options.fallback || null;
+ this.resolver = options.resolver || null;
+
+ if (_emberEnvironment.ENV._ENABLE_RESOLVER_FUNCTION_SUPPORT !== true) {
+ (true && !(typeof this.resolver !== 'function') && (0, _emberDebug.assert)(missingResolverFunctionsDeprecation, typeof this.resolver !== 'function'));
+ }
+
+ if (typeof this.resolver === 'function' && _emberEnvironment.ENV._ENABLE_RESOLVER_FUNCTION_SUPPORT === true) {
+ deprecateResolverFunction(this);
+ }
+
+ this.registrations = (0, _emberUtils.dictionary)(options.registrations || null);
+
+ this._typeInjections = (0, _emberUtils.dictionary)(null);
+ this._injections = (0, _emberUtils.dictionary)(null);
+
+ this._localLookupCache = Object.create(null);
+ this._normalizeCache = (0, _emberUtils.dictionary)(null);
+ this._resolveCache = (0, _emberUtils.dictionary)(null);
+ this._failSet = new Set();
+
+ this._options = (0, _emberUtils.dictionary)(null);
+ this._typeOptions = (0, _emberUtils.dictionary)(null);
+ }
+
+ /**
+ A backup registry for resolving registrations when no matches can be found.
+ @private
+ @property fallback
+ @type Registry
+ */
+
+ /**
+ An object that has a `resolve` method that resolves a name.
+ @private
+ @property resolver
+ @type Resolver
+ */
+
+ /**
+ @private
+ @property registrations
+ @type InheritingDict
+ */
+
+ /**
+ @private
+ @property _typeInjections
+ @type InheritingDict
+ */
+
+ /**
+ @private
+ @property _injections
+ @type InheritingDict
+ */
+
+ /**
+ @private
+ @property _normalizeCache
+ @type InheritingDict
+ */
+
+ /**
+ @private
+ @property _resolveCache
+ @type InheritingDict
+ */
+
+ /**
+ @private
+ @property _options
+ @type InheritingDict
+ */
+
+ /**
+ @private
+ @property _typeOptions
+ @type InheritingDict
+ */
+
+ /**
+ Creates a container based on this registry.
+ @private
+ @method container
+ @param {Object} options
+ @return {Container} created container
+ */
+
+
+ Registry.prototype.container = function container(options) {
+ return new Container(this, options);
+ };
+
+ Registry.prototype.register = function register(fullName, factory) {
+ var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
+ (true && !(this.isValidFullName(fullName)) && (0, _emberDebug.assert)('fullName must be a proper full name', this.isValidFullName(fullName)));
+ (true && !(factory !== undefined) && (0, _emberDebug.assert)('Attempting to register an unknown factory: \'' + fullName + '\'', factory !== undefined));
+
+
+ var normalizedName = this.normalize(fullName);
+ (true && !(!this._resolveCache[normalizedName]) && (0, _emberDebug.assert)('Cannot re-register: \'' + fullName + '\', as it has already been resolved.', !this._resolveCache[normalizedName]));
+
+
+ this._failSet.delete(normalizedName);
+ this.registrations[normalizedName] = factory;
+ this._options[normalizedName] = options;
+ };
+
+ Registry.prototype.unregister = function unregister(fullName) {
+ (true && !(this.isValidFullName(fullName)) && (0, _emberDebug.assert)('fullName must be a proper full name', this.isValidFullName(fullName)));
+
+
+ var normalizedName = this.normalize(fullName);
+
+ this._localLookupCache = Object.create(null);
+
+ delete this.registrations[normalizedName];
+ delete this._resolveCache[normalizedName];
+ delete this._options[normalizedName];
+ this._failSet.delete(normalizedName);
+ };
+
+ Registry.prototype.resolve = function resolve(fullName, options) {
+ (true && !(this.isValidFullName(fullName)) && (0, _emberDebug.assert)('fullName must be a proper full name', this.isValidFullName(fullName)));
+
+ var factory = _resolve(this, this.normalize(fullName), options);
+ if (factory === undefined && this.fallback !== null) {
+ var _fallback;
+
+ factory = (_fallback = this.fallback).resolve.apply(_fallback, arguments);
+ }
+ return factory;
+ };
+
+ Registry.prototype.describe = function describe(fullName) {
+ if (this.resolver !== null && this.resolver.lookupDescription) {
+ return this.resolver.lookupDescription(fullName);
+ } else if (this.fallback !== null) {
+ return this.fallback.describe(fullName);
+ } else {
+ return fullName;
+ }
+ };
+
+ Registry.prototype.normalizeFullName = function normalizeFullName(fullName) {
+ if (this.resolver !== null && this.resolver.normalize) {
+ return this.resolver.normalize(fullName);
+ } else if (this.fallback !== null) {
+ return this.fallback.normalizeFullName(fullName);
+ } else {
+ return fullName;
+ }
+ };
+
+ Registry.prototype.normalize = function normalize(fullName) {
+ return this._normalizeCache[fullName] || (this._normalizeCache[fullName] = this.normalizeFullName(fullName));
+ };
+
+ Registry.prototype.makeToString = function makeToString(factory, fullName) {
+ if (this.resolver !== null && this.resolver.makeToString) {
+ return this.resolver.makeToString(factory, fullName);
+ } else if (this.fallback !== null) {
+ return this.fallback.makeToString(factory, fullName);
+ } else {
+ return factory.toString();
+ }
+ };
+
+ Registry.prototype.has = function has(fullName, options) {
+ if (!this.isValidFullName(fullName)) {
+ return false;
+ }
+
+ var source = options && options.source && this.normalize(options.source);
+
+ return _has(this, this.normalize(fullName), source);
+ };
+
+ Registry.prototype.optionsForType = function optionsForType(type, options) {
+ this._typeOptions[type] = options;
+ };
+
+ Registry.prototype.getOptionsForType = function getOptionsForType(type) {
+ var optionsForType = this._typeOptions[type];
+ if (optionsForType === undefined && this.fallback !== null) {
+ optionsForType = this.fallback.getOptionsForType(type);
+ }
+ return optionsForType;
+ };
+
+ Registry.prototype.options = function options(fullName) {
+ var _options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ var normalizedName = this.normalize(fullName);
+ this._options[normalizedName] = _options;
+ };
+
+ Registry.prototype.getOptions = function getOptions(fullName) {
+ var normalizedName = this.normalize(fullName);
+ var options = this._options[normalizedName];
+
+ if (options === undefined && this.fallback !== null) {
+ options = this.fallback.getOptions(fullName);
+ }
+ return options;
+ };
+
+ Registry.prototype.getOption = function getOption(fullName, optionName) {
+ var options = this._options[fullName];
+
+ if (options && options[optionName] !== undefined) {
+ return options[optionName];
+ }
+
+ var type = fullName.split(':')[0];
+ options = this._typeOptions[type];
+
+ if (options && options[optionName] !== undefined) {
+ return options[optionName];
+ } else if (this.fallback !== null) {
+ return this.fallback.getOption(fullName, optionName);
+ }
+ };
+
+ Registry.prototype.typeInjection = function typeInjection(type, property, fullName) {
+ (true && !(this.isValidFullName(fullName)) && (0, _emberDebug.assert)('fullName must be a proper full name', this.isValidFullName(fullName)));
+
+
+ var fullNameType = fullName.split(':')[0];
+ (true && !(fullNameType !== type) && (0, _emberDebug.assert)('Cannot inject a \'' + fullName + '\' on other ' + type + '(s).', fullNameType !== type));
+
+
+ var injections = this._typeInjections[type] || (this._typeInjections[type] = []);
+
+ injections.push({ property: property, fullName: fullName });
+ };
+
+ Registry.prototype.injection = function injection(fullName, property, injectionName) {
+ (true && !(this.isValidFullName(injectionName)) && (0, _emberDebug.assert)('Invalid injectionName, expected: \'type:name\' got: ' + injectionName, this.isValidFullName(injectionName)));
+
+
+ var normalizedInjectionName = this.normalize(injectionName);
+
+ if (fullName.indexOf(':') === -1) {
+ return this.typeInjection(fullName, property, normalizedInjectionName);
+ }
+
+ (true && !(this.isValidFullName(fullName)) && (0, _emberDebug.assert)('fullName must be a proper full name', this.isValidFullName(fullName)));
+
+ var normalizedName = this.normalize(fullName);
+
+ var injections = this._injections[normalizedName] || (this._injections[normalizedName] = []);
+
+ injections.push({ property: property, fullName: normalizedInjectionName });
+ };
+
+ Registry.prototype.knownForType = function knownForType(type) {
+ var localKnown = (0, _emberUtils.dictionary)(null);
+ var registeredNames = Object.keys(this.registrations);
+ for (var index = 0; index < registeredNames.length; index++) {
+ var fullName = registeredNames[index];
+ var itemType = fullName.split(':')[0];
+
+ if (itemType === type) {
+ localKnown[fullName] = true;
+ }
+ }
+
+ var fallbackKnown = void 0,
+ resolverKnown = void 0;
+ if (this.fallback !== null) {
+ fallbackKnown = this.fallback.knownForType(type);
+ }
+
+ if (this.resolver !== null && this.resolver.knownForType) {
+ resolverKnown = this.resolver.knownForType(type);
+ }
+
+ return (0, _emberUtils.assign)({}, fallbackKnown, localKnown, resolverKnown);
+ };
+
+ Registry.prototype.isValidFullName = function isValidFullName(fullName) {
+ return VALID_FULL_NAME_REGEXP.test(fullName);
+ };
+
+ Registry.prototype.getInjections = function getInjections(fullName) {
+ var injections = this._injections[fullName] || [];
+ if (this.fallback !== null) {
+ injections = injections.concat(this.fallback.getInjections(fullName));
+ }
+ return injections;
+ };
+
+ Registry.prototype.getTypeInjections = function getTypeInjections(type) {
+ var injections = this._typeInjections[type] || [];
+ if (this.fallback !== null) {
+ injections = injections.concat(this.fallback.getTypeInjections(type));
+ }
+ return injections;
+ };
+
+ Registry.prototype.resolverCacheKey = function resolverCacheKey(name, options) {
+ if (!_features.EMBER_MODULE_UNIFICATION) {
+ return name;
+ }
+
+ return options && options.source ? options.source + ':' + name : name;
+ };
+
+ Registry.prototype.expandLocalLookup = function expandLocalLookup(fullName, options) {
+ if (this.resolver !== null && this.resolver.expandLocalLookup) {
+ (true && !(this.isValidFullName(fullName)) && (0, _emberDebug.assert)('fullName must be a proper full name', this.isValidFullName(fullName)));
+ (true && !(options && options.source) && (0, _emberDebug.assert)('options.source must be provided to expandLocalLookup', options && options.source));
+ (true && !(this.isValidFullName(options.source)) && (0, _emberDebug.assert)('options.source must be a proper full name', this.isValidFullName(options.source)));
+
+
+ var normalizedFullName = this.normalize(fullName);
+ var normalizedSource = this.normalize(options.source);
+
+ return _expandLocalLookup(this, normalizedFullName, normalizedSource);
+ } else if (this.fallback !== null) {
+ return this.fallback.expandLocalLookup(fullName, options);
+ } else {
+ return null;
+ }
+ };
+
+ return Registry;
+ }();
+
+ function deprecateResolverFunction(registry) {
+ (true && !(false) && (0, _emberDebug.deprecate)(missingResolverFunctionsDeprecation, false, { id: 'ember-application.registry-resolver-as-function', until: '3.0.0', url: 'https://emberjs.com/deprecations/v2.x#toc_registry-resolver-as-function' }));
+
+ registry.resolver = { resolve: registry.resolver };
+ }
+
+ if (true) {
+ Registry.prototype.normalizeInjectionsHash = function (hash) {
+ var injections = [];
+
+ for (var key in hash) {
+ if (hash.hasOwnProperty(key)) {
+ (true && !(this.isValidFullName(hash[key])) && (0, _emberDebug.assert)('Expected a proper full name, given \'' + hash[key] + '\'', this.isValidFullName(hash[key])));
+
+
+ injections.push({
+ property: key,
+ fullName: hash[key]
+ });
+ }
+ }
+
+ return injections;
+ };
+
+ Registry.prototype.validateInjections = function (injections) {
+ if (!injections) {
+ return;
+ }
+
+ var fullName = void 0;
+
+ for (var i = 0; i < injections.length; i++) {
+ fullName = injections[i].fullName;
+
+ (true && !(this.has(fullName)) && (0, _emberDebug.assert)('Attempting to inject an unknown injection: \'' + fullName + '\'', this.has(fullName)));
+ }
+ };
+ }
+
+ function _expandLocalLookup(registry, normalizedName, normalizedSource) {
+ var cache = registry._localLookupCache;
+ var normalizedNameCache = cache[normalizedName];
+
+ if (!normalizedNameCache) {
+ normalizedNameCache = cache[normalizedName] = Object.create(null);
+ }
+
+ var cached = normalizedNameCache[normalizedSource];
+
+ if (cached !== undefined) {
+ return cached;
+ }
+
+ var expanded = registry.resolver.expandLocalLookup(normalizedName, normalizedSource);
+
+ return normalizedNameCache[normalizedSource] = expanded;
+ }
+
+ function _resolve(registry, normalizedName, options) {
+ if (options && options.source) {
+ // when `source` is provided expand normalizedName
+ // and source into the full normalizedName
+ var expandedNormalizedName = registry.expandLocalLookup(normalizedName, options);
+
+ // if expandLocalLookup returns falsey, we do not support local lookup
+ if (!_features.EMBER_MODULE_UNIFICATION) {
+ if (!expandedNormalizedName) {
+ return;
+ }
+
+ normalizedName = expandedNormalizedName;
+ } else if (expandedNormalizedName) {
+ // with ember-module-unification, if expandLocalLookup returns something,
+ // pass it to the resolve without the source
+ normalizedName = expandedNormalizedName;
+ options = {};
+ }
+ }
+
+ var cacheKey = registry.resolverCacheKey(normalizedName, options);
+ var cached = registry._resolveCache[cacheKey];
+ if (cached !== undefined) {
+ return cached;
+ }
+ if (registry._failSet.has(cacheKey)) {
+ return;
+ }
+
+ var resolved = void 0;
+
+ if (registry.resolver) {
+ resolved = registry.resolver.resolve(normalizedName, options && options.source);
+ }
+
+ if (resolved === undefined) {
+ resolved = registry.registrations[normalizedName];
+ }
+
+ if (resolved === undefined) {
+ registry._failSet.add(cacheKey);
+ } else {
+ registry._resolveCache[cacheKey] = resolved;
+ }
+
+ return resolved;
+ }
+
+ function _has(registry, fullName, source) {
+ return registry.resolve(fullName, { source: source }) !== undefined;
+ }
+
+ var privateNames = (0, _emberUtils.dictionary)(null);
+ var privateSuffix = ('' + Math.random() + Date.now()).replace('.', '');
+
+ function privatize(_ref6) {
+ var fullName = _ref6[0];
+
+ var name = privateNames[fullName];
+ if (name) {
+ return name;
+ }
+
+ var _fullName$split2 = fullName.split(':'),
+ type = _fullName$split2[0],
+ rawName = _fullName$split2[1];
+
+ return privateNames[fullName] = (0, _emberUtils.intern)(type + ':' + rawName + '-' + privateSuffix);
+ }
+
+ /*
+ Public API for the container is still in flux.
+ The public API, specified on the application namespace should be considered the stable API.
+ // @module container
+ @private
+ */
+
+ exports.Registry = Registry;
+ exports.privatize = privatize;
+ exports.Container = Container;
+});
+enifed("dag-map", ["exports"], function (exports) {
+ "use strict";
+
+ /**
+ * A topologically ordered map of key/value pairs with a simple API for adding constraints.
+ *
+ * Edges can forward reference keys that have not been added yet (the forward reference will
+ * map the key to undefined).
+ */
+ var DAG = function () {
+ function DAG() {
+ this._vertices = new Vertices();
+ }
+ /**
+ * Adds a key/value pair with dependencies on other key/value pairs.
+ *
+ * @public
+ * @param key The key of the vertex to be added.
+ * @param value The value of that vertex.
+ * @param before A key or array of keys of the vertices that must
+ * be visited before this vertex.
+ * @param after An string or array of strings with the keys of the
+ * vertices that must be after this vertex is visited.
+ */
+ DAG.prototype.add = function (key, value, before, after) {
+ if (!key) throw new Error('argument `key` is required');
+ var vertices = this._vertices;
+ var v = vertices.add(key);
+ v.val = value;
+ if (before) {
+ if (typeof before === "string") {
+ vertices.addEdge(v, vertices.add(before));
+ } else {
+ for (var i = 0; i < before.length; i++) {
+ vertices.addEdge(v, vertices.add(before[i]));
+ }
+ }
+ }
+ if (after) {
+ if (typeof after === "string") {
+ vertices.addEdge(vertices.add(after), v);
+ } else {
+ for (var i = 0; i < after.length; i++) {
+ vertices.addEdge(vertices.add(after[i]), v);
+ }
+ }
+ }
+ };
+ /**
+ * @deprecated please use add.
+ */
+ DAG.prototype.addEdges = function (key, value, before, after) {
+ this.add(key, value, before, after);
+ };
+ /**
+ * Visits key/value pairs in topological order.
+ *
+ * @public
+ * @param callback The function to be invoked with each key/value.
+ */
+ DAG.prototype.each = function (callback) {
+ this._vertices.walk(callback);
+ };
+ /**
+ * @deprecated please use each.
+ */
+ DAG.prototype.topsort = function (callback) {
+ this.each(callback);
+ };
+ return DAG;
+ }();
+ exports.default = DAG;
+
+ /** @private */
+ var Vertices = function () {
+ function Vertices() {
+ this.length = 0;
+ this.stack = new IntStack();
+ this.path = new IntStack();
+ this.result = new IntStack();
+ }
+ Vertices.prototype.add = function (key) {
+ if (!key) throw new Error("missing key");
+ var l = this.length | 0;
+ var vertex;
+ for (var i = 0; i < l; i++) {
+ vertex = this[i];
+ if (vertex.key === key) return vertex;
+ }
+ this.length = l + 1;
+ return this[l] = {
+ idx: l,
+ key: key,
+ val: undefined,
+ out: false,
+ flag: false,
+ length: 0
+ };
+ };
+ Vertices.prototype.addEdge = function (v, w) {
+ this.check(v, w.key);
+ var l = w.length | 0;
+ for (var i = 0; i < l; i++) {
+ if (w[i] === v.idx) return;
+ }
+ w.length = l + 1;
+ w[l] = v.idx;
+ v.out = true;
+ };
+ Vertices.prototype.walk = function (cb) {
+ this.reset();
+ for (var i = 0; i < this.length; i++) {
+ var vertex = this[i];
+ if (vertex.out) continue;
+ this.visit(vertex, "");
+ }
+ this.each(this.result, cb);
+ };
+ Vertices.prototype.check = function (v, w) {
+ if (v.key === w) {
+ throw new Error("cycle detected: " + w + " <- " + w);
+ }
+ // quick check
+ if (v.length === 0) return;
+ // shallow check
+ for (var i = 0; i < v.length; i++) {
+ var key = this[v[i]].key;
+ if (key === w) {
+ throw new Error("cycle detected: " + w + " <- " + v.key + " <- " + w);
+ }
+ }
+ // deep check
+ this.reset();
+ this.visit(v, w);
+ if (this.path.length > 0) {
+ var msg_1 = "cycle detected: " + w;
+ this.each(this.path, function (key) {
+ msg_1 += " <- " + key;
+ });
+ throw new Error(msg_1);
+ }
+ };
+ Vertices.prototype.reset = function () {
+ this.stack.length = 0;
+ this.path.length = 0;
+ this.result.length = 0;
+ for (var i = 0, l = this.length; i < l; i++) {
+ this[i].flag = false;
+ }
+ };
+ Vertices.prototype.visit = function (start, search) {
+ var _a = this,
+ stack = _a.stack,
+ path = _a.path,
+ result = _a.result;
+ stack.push(start.idx);
+ while (stack.length) {
+ var index = stack.pop() | 0;
+ if (index >= 0) {
+ // enter
+ var vertex = this[index];
+ if (vertex.flag) continue;
+ vertex.flag = true;
+ path.push(index);
+ if (search === vertex.key) break;
+ // push exit
+ stack.push(~index);
+ this.pushIncoming(vertex);
+ } else {
+ // exit
+ path.pop();
+ result.push(~index);
+ }
+ }
+ };
+ Vertices.prototype.pushIncoming = function (incomming) {
+ var stack = this.stack;
+ for (var i = incomming.length - 1; i >= 0; i--) {
+ var index = incomming[i];
+ if (!this[index].flag) {
+ stack.push(index);
+ }
+ }
+ };
+ Vertices.prototype.each = function (indices, cb) {
+ for (var i = 0, l = indices.length; i < l; i++) {
+ var vertex = this[indices[i]];
+ cb(vertex.key, vertex.val);
+ }
+ };
+ return Vertices;
+ }();
+ /** @private */
+ var IntStack = function () {
+ function IntStack() {
+ this.length = 0;
+ }
+ IntStack.prototype.push = function (n) {
+ this[this.length++] = n | 0;
+ };
+ IntStack.prototype.pop = function () {
+ return this[--this.length] | 0;
+ };
+ return IntStack;
+ }();
+});
+enifed('ember-application/index', ['exports', 'ember-application/system/application', 'ember-application/system/application-instance', 'ember-application/system/resolver', 'ember-application/system/engine', 'ember-application/system/engine-instance', 'ember-application/system/engine-parent', 'ember-application/initializers/dom-templates'], function (exports, _application, _applicationInstance, _resolver, _engine, _engineInstance, _engineParent) {
+ 'use strict';
+
+ exports.setEngineParent = exports.getEngineParent = exports.EngineInstance = exports.Engine = exports.Resolver = exports.ApplicationInstance = exports.Application = undefined;
+ Object.defineProperty(exports, 'Application', {
+ enumerable: true,
+ get: function () {
+ return _application.default;
+ }
+ });
+ Object.defineProperty(exports, 'ApplicationInstance', {
+ enumerable: true,
+ get: function () {
+ return _applicationInstance.default;
+ }
+ });
+ Object.defineProperty(exports, 'Resolver', {
+ enumerable: true,
+ get: function () {
+ return _resolver.default;
+ }
+ });
+ Object.defineProperty(exports, 'Engine', {
+ enumerable: true,
+ get: function () {
+ return _engine.default;
+ }
+ });
+ Object.defineProperty(exports, 'EngineInstance', {
+ enumerable: true,
+ get: function () {
+ return _engineInstance.default;
+ }
+ });
+ Object.defineProperty(exports, 'getEngineParent', {
+ enumerable: true,
+ get: function () {
+ return _engineParent.getEngineParent;
+ }
+ });
+ Object.defineProperty(exports, 'setEngineParent', {
+ enumerable: true,
+ get: function () {
+ return _engineParent.setEngineParent;
+ }
+ });
+});
+enifed('ember-application/initializers/dom-templates', ['require', 'ember-glimmer', 'ember-environment', 'ember-application/system/application'], function (_require2, _emberGlimmer, _emberEnvironment, _application) {
+ 'use strict';
+
+ var bootstrap = function () {};
+
+ _application.default.initializer({
+ name: 'domTemplates',
+ initialize: function () {
+ var bootstrapModuleId = 'ember-template-compiler/system/bootstrap';
+ var context = void 0;
+ if (_emberEnvironment.environment.hasDOM && (0, _require2.has)(bootstrapModuleId)) {
+ bootstrap = (0, _require2.default)(bootstrapModuleId).default;
+ context = document;
+ }
+
+ bootstrap({ context: context, hasTemplate: _emberGlimmer.hasTemplate, setTemplate: _emberGlimmer.setTemplate });
+ }
+ });
+});
+enifed('ember-application/system/application-instance', ['exports', 'ember-utils', 'ember-metal', 'ember-environment', 'ember-views', 'ember-application/system/engine-instance', 'ember-glimmer'], function (exports, _emberUtils, _emberMetal, _emberEnvironment, _emberViews, _engineInstance, _emberGlimmer) {
+ 'use strict';
+
+ /**
+ The `ApplicationInstance` encapsulates all of the stateful aspects of a
+ running `Application`.
+
+ At a high-level, we break application boot into two distinct phases:
+
+ * Definition time, where all of the classes, templates, and other
+ dependencies are loaded (typically in the browser).
+ * Run time, where we begin executing the application once everything
+ has loaded.
+
+ Definition time can be expensive and only needs to happen once since it is
+ an idempotent operation. For example, between test runs and FastBoot
+ requests, the application stays the same. It is only the state that we want
+ to reset.
+
+ That state is what the `ApplicationInstance` manages: it is responsible for
+ creating the container that contains all application state, and disposing of
+ it once the particular test run or FastBoot request has finished.
+
+ @public
+ @class ApplicationInstance
+ @extends EngineInstance
+ */
+
+ /**
+ @module @ember/application
+ */
+
+ var ApplicationInstance = _engineInstance.default.extend({
+ /**
+ The `Application` for which this is an instance.
+ @property {Application} application
+ @private
+ */
+ application: null,
+
+ /**
+ The DOM events for which the event dispatcher should listen.
+ By default, the application's `Ember.EventDispatcher` listens
+ for a set of standard DOM events, such as `mousedown` and
+ `keyup`, and delegates them to your application's `Ember.View`
+ instances.
+ @private
+ @property {Object} customEvents
+ */
+ customEvents: null,
+
+ /**
+ The root DOM element of the Application as an element or a
+ [jQuery-compatible selector
+ string](http://api.jquery.com/category/selectors/).
+ @private
+ @property {String|DOMElement} rootElement
+ */
+ rootElement: null,
+
+ init: function () {
+ this._super.apply(this, arguments);
+
+ // Register this instance in the per-instance registry.
+ //
+ // Why do we need to register the instance in the first place?
+ // Because we need a good way for the root route (a.k.a ApplicationRoute)
+ // to notify us when it has created the root-most view. That view is then
+ // appended to the rootElement, in the case of apps, to the fixture harness
+ // in tests, or rendered to a string in the case of FastBoot.
+ this.register('-application-instance:main', this, { instantiate: false });
+ },
+ _bootSync: function (options) {
+ if (this._booted) {
+ return this;
+ }
+
+ options = new BootOptions(options);
+
+ this.setupRegistry(options);
+
+ if (options.rootElement) {
+ this.rootElement = options.rootElement;
+ } else {
+ this.rootElement = this.application.rootElement;
+ }
+
+ if (options.location) {
+ var router = (0, _emberMetal.get)(this, 'router');
+ (0, _emberMetal.set)(router, 'location', options.location);
+ }
+
+ this.application.runInstanceInitializers(this);
+
+ if (options.isInteractive) {
+ this.setupEventDispatcher();
+ }
+
+ this._booted = true;
+
+ return this;
+ },
+ setupRegistry: function (options) {
+ this.constructor.setupRegistry(this.__registry__, options);
+ },
+
+
+ router: (0, _emberMetal.computed)(function () {
+ return this.lookup('router:main');
+ }).readOnly(),
+
+ didCreateRootView: function (view) {
+ view.appendTo(this.rootElement);
+ },
+ startRouting: function () {
+ var router = (0, _emberMetal.get)(this, 'router');
+ router.startRouting();
+ this._didSetupRouter = true;
+ },
+ setupRouter: function () {
+ if (this._didSetupRouter) {
+ return;
+ }
+ this._didSetupRouter = true;
+
+ var router = (0, _emberMetal.get)(this, 'router');
+ router.setupRouter();
+ },
+ handleURL: function (url) {
+ var router = (0, _emberMetal.get)(this, 'router');
+
+ this.setupRouter();
+ return router.handleURL(url);
+ },
+ setupEventDispatcher: function () {
+ var dispatcher = this.lookup('event_dispatcher:main');
+ var applicationCustomEvents = (0, _emberMetal.get)(this.application, 'customEvents');
+ var instanceCustomEvents = (0, _emberMetal.get)(this, 'customEvents');
+
+ var customEvents = (0, _emberUtils.assign)({}, applicationCustomEvents, instanceCustomEvents);
+ dispatcher.setup(customEvents, this.rootElement);
+
+ return dispatcher;
+ },
+ getURL: function () {
+ return (0, _emberMetal.get)(this, 'router.url');
+ },
+ visit: function (url) {
+ var _this = this;
+
+ this.setupRouter();
+
+ var bootOptions = this.__container__.lookup('-environment:main');
+
+ var router = (0, _emberMetal.get)(this, 'router');
+
+ var handleTransitionResolve = function () {
+ if (!bootOptions.options.shouldRender) {
+ // No rendering is needed, and routing has completed, simply return.
+ return _this;
+ } else {
+ // Ensure that the visit promise resolves when all rendering has completed
+ return (0, _emberGlimmer.renderSettled)().then(function () {
+ return _this;
+ });
+ }
+ };
+
+ var handleTransitionReject = function (error) {
+ if (error.error) {
+ throw error.error;
+ } else if (error.name === 'TransitionAborted' && router._routerMicrolib.activeTransition) {
+ return router._routerMicrolib.activeTransition.then(handleTransitionResolve, handleTransitionReject);
+ } else if (error.name === 'TransitionAborted') {
+ throw new Error(error.message);
+ } else {
+ throw error;
+ }
+ };
+
+ var location = (0, _emberMetal.get)(router, 'location');
+
+ // Keeps the location adapter's internal URL in-sync
+ location.setURL(url);
+
+ // getURL returns the set url with the rootURL stripped off
+ return router.handleURL(location.getURL()).then(handleTransitionResolve, handleTransitionReject);
+ }
+ });
+
+ ApplicationInstance.reopenClass({
+ setupRegistry: function (registry) {
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ if (!options.toEnvironment) {
+ options = new BootOptions(options);
+ }
+
+ registry.register('-environment:main', options.toEnvironment(), { instantiate: false });
+ registry.register('service:-document', options.document, { instantiate: false });
+
+ this._super(registry, options);
+ }
+ });
+
+ /**
+ A list of boot-time configuration options for customizing the behavior of
+ an `ApplicationInstance`.
+
+ This is an interface class that exists purely to document the available
+ options; you do not need to construct it manually. Simply pass a regular
+ JavaScript object containing the desired options into methods that require
+ one of these options object:
+
+ ```javascript
+ MyApp.visit("/", { location: "none", rootElement: "#container" });
+ ```
+
+ Not all combinations of the supported options are valid. See the documentation
+ on `Application#visit` for the supported configurations.
+
+ Internal, experimental or otherwise unstable flags are marked as private.
+
+ @class BootOptions
+ @namespace ApplicationInstance
+ @public
+ */
+ function BootOptions() {
+ var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+ /**
+ Provide a specific instance of jQuery. This is useful in conjunction with
+ the `document` option, as it allows you to use a copy of `jQuery` that is
+ appropriately bound to the foreign `document` (e.g. a jsdom).
+ This is highly experimental and support very incomplete at the moment.
+ @property jQuery
+ @type Object
+ @default auto-detected
+ @private
+ */
+ this.jQuery = _emberViews.jQuery; // This default is overridable below
+
+ /**
+ Interactive mode: whether we need to set up event delegation and invoke
+ lifecycle callbacks on Components.
+ @property isInteractive
+ @type boolean
+ @default auto-detected
+ @private
+ */
+ this.isInteractive = _emberEnvironment.environment.hasDOM; // This default is overridable below
+
+ /**
+ Run in a full browser environment.
+ When this flag is set to `false`, it will disable most browser-specific
+ and interactive features. Specifically:
+ * It does not use `jQuery` to append the root view; the `rootElement`
+ (either specified as a subsequent option or on the application itself)
+ must already be an `Element` in the given `document` (as opposed to a
+ string selector).
+ * It does not set up an `EventDispatcher`.
+ * It does not run any `Component` lifecycle hooks (such as `didInsertElement`).
+ * It sets the `location` option to `"none"`. (If you would like to use
+ the location adapter specified in the app's router instead, you can also
+ specify `{ location: null }` to specifically opt-out.)
+ @property isBrowser
+ @type boolean
+ @default auto-detected
+ @public
+ */
+ if (options.isBrowser !== undefined) {
+ this.isBrowser = !!options.isBrowser;
+ } else {
+ this.isBrowser = _emberEnvironment.environment.hasDOM;
+ }
+
+ if (!this.isBrowser) {
+ this.jQuery = null;
+ this.isInteractive = false;
+ this.location = 'none';
+ }
+
+ /**
+ Disable rendering completely.
+ When this flag is set to `true`, it will disable the entire rendering
+ pipeline. Essentially, this puts the app into "routing-only" mode. No
+ templates will be rendered, and no Components will be created.
+ @property shouldRender
+ @type boolean
+ @default true
+ @public
+ */
+ if (options.shouldRender !== undefined) {
+ this.shouldRender = !!options.shouldRender;
+ } else {
+ this.shouldRender = true;
+ }
+
+ if (!this.shouldRender) {
+ this.jQuery = null;
+ this.isInteractive = false;
+ }
+
+ /**
+ If present, render into the given `Document` object instead of the
+ global `window.document` object.
+ In practice, this is only useful in non-browser environment or in
+ non-interactive mode, because Ember's `jQuery` dependency is
+ implicitly bound to the current document, causing event delegation
+ to not work properly when the app is rendered into a foreign
+ document object (such as an iframe's `contentDocument`).
+ In non-browser mode, this could be a "`Document`-like" object as
+ Ember only interact with a small subset of the DOM API in non-
+ interactive mode. While the exact requirements have not yet been
+ formalized, the `SimpleDOM` library's implementation is known to
+ work.
+ @property document
+ @type Document
+ @default the global `document` object
+ @public
+ */
+ if (options.document) {
+ this.document = options.document;
+ } else {
+ this.document = typeof document !== 'undefined' ? document : null;
+ }
+
+ /**
+ If present, overrides the application's `rootElement` property on
+ the instance. This is useful for testing environment, where you
+ might want to append the root view to a fixture area.
+ In non-browser mode, because Ember does not have access to jQuery,
+ this options must be specified as a DOM `Element` object instead of
+ a selector string.
+ See the documentation on `Application`'s `rootElement` for
+ details.
+ @property rootElement
+ @type String|Element
+ @default null
+ @public
+ */
+ if (options.rootElement) {
+ this.rootElement = options.rootElement;
+ }
+
+ // Set these options last to give the user a chance to override the
+ // defaults from the "combo" options like `isBrowser` (although in
+ // practice, the resulting combination is probably invalid)
+
+ /**
+ If present, overrides the router's `location` property with this
+ value. This is useful for environments where trying to modify the
+ URL would be inappropriate.
+ @property location
+ @type string
+ @default null
+ @public
+ */
+ if (options.location !== undefined) {
+ this.location = options.location;
+ }
+
+ if (options.jQuery !== undefined) {
+ this.jQuery = options.jQuery;
+ }
+
+ if (options.isInteractive !== undefined) {
+ this.isInteractive = !!options.isInteractive;
+ }
+ }
+
+ BootOptions.prototype.toEnvironment = function () {
+ var env = (0, _emberUtils.assign)({}, _emberEnvironment.environment);
+ // For compatibility with existing code
+ env.hasDOM = this.isBrowser;
+ env.isInteractive = this.isInteractive;
+ env.options = this;
+ return env;
+ };
+
+ exports.default = ApplicationInstance;
+});
+enifed('ember-application/system/application', ['exports', 'ember-babel', 'ember-utils', 'ember-environment', 'ember-debug', 'ember-metal', 'ember-runtime', 'ember-views', 'ember-routing', 'ember-application/system/application-instance', 'container', 'ember-application/system/engine', 'ember-glimmer', 'ember/features'], function (exports, _emberBabel, _emberUtils, _emberEnvironment, _emberDebug, _emberMetal, _emberRuntime, _emberViews, _emberRouting, _applicationInstance, _container, _engine, _emberGlimmer, _features) {
+ 'use strict';
+
+ var _templateObject = (0, _emberBabel.taggedTemplateLiteralLoose)(['-bucket-cache:main'], ['-bucket-cache:main']);
+
+ var librariesRegistered = false;
+
+ /**
+ An instance of `Application` is the starting point for every Ember
+ application. It helps to instantiate, initialize and coordinate the many
+ objects that make up your app.
+
+ Each Ember app has one and only one `Application` object. In fact, the
+ very first thing you should do in your application is create the instance:
+
+ ```javascript
+ import Application from '@ember/application';
+
+ window.App = Application.create();
+ ```
+
+ Typically, the application object is the only global variable. All other
+ classes in your app should be properties on the `Application` instance,
+ which highlights its first role: a global namespace.
+
+ For example, if you define a view class, it might look like this:
+
+ ```javascript
+ import Application from '@ember/application';
+
+ App.MyView = Ember.View.extend();
+ ```
+
+ By default, calling `Application.create()` will automatically initialize
+ your application by calling the `Application.initialize()` method. If
+ you need to delay initialization, you can call your app's `deferReadiness()`
+ method. When you are ready for your app to be initialized, call its
+ `advanceReadiness()` method.
+
+ You can define a `ready` method on the `Application` instance, which
+ will be run by Ember when the application is initialized.
+
+ Because `Application` inherits from `Ember.Namespace`, any classes
+ you create will have useful string representations when calling `toString()`.
+ See the `Ember.Namespace` documentation for more information.
+
+ While you can think of your `Application` as a container that holds the
+ other classes in your application, there are several other responsibilities
+ going on under-the-hood that you may want to understand.
+
+ ### Event Delegation
+
+ Ember uses a technique called _event delegation_. This allows the framework
+ to set up a global, shared event listener instead of requiring each view to
+ do it manually. For example, instead of each view registering its own
+ `mousedown` listener on its associated element, Ember sets up a `mousedown`
+ listener on the `body`.
+
+ If a `mousedown` event occurs, Ember will look at the target of the event and
+ start walking up the DOM node tree, finding corresponding views and invoking
+ their `mouseDown` method as it goes.
+
+ `Application` has a number of default events that it listens for, as
+ well as a mapping from lowercase events to camel-cased view method names. For
+ example, the `keypress` event causes the `keyPress` method on the view to be
+ called, the `dblclick` event causes `doubleClick` to be called, and so on.
+
+ If there is a bubbling browser event that Ember does not listen for by
+ default, you can specify custom events and their corresponding view method
+ names by setting the application's `customEvents` property:
+
+ ```javascript
+ import Application from '@ember/application';
+
+ let App = Application.create({
+ customEvents: {
+ // add support for the paste event
+ paste: 'paste'
+ }
+ });
+ ```
+
+ To prevent Ember from setting up a listener for a default event,
+ specify the event name with a `null` value in the `customEvents`
+ property:
+
+ ```javascript
+ import Application from '@ember/application';
+
+ let App = Application.create({
+ customEvents: {
+ // prevent listeners for mouseenter/mouseleave events
+ mouseenter: null,
+ mouseleave: null
+ }
+ });
+ ```
+
+ By default, the application sets up these event listeners on the document
+ body. However, in cases where you are embedding an Ember application inside
+ an existing page, you may want it to set up the listeners on an element
+ inside the body.
+
+ For example, if only events inside a DOM element with the ID of `ember-app`
+ should be delegated, set your application's `rootElement` property:
+
+ ```javascript
+ import Application from '@ember/application';
+
+ let App = Application.create({
+ rootElement: '#ember-app'
+ });
+ ```
+
+ The `rootElement` can be either a DOM element or a jQuery-compatible selector
+ string. Note that *views appended to the DOM outside the root element will
+ not receive events.* If you specify a custom root element, make sure you only
+ append views inside it!
+
+ To learn more about the events Ember components use, see
+
+ [components/handling-events](https://guides.emberjs.com/current/components/handling-events/#toc_event-names).
+
+ ### Initializers
+
+ Libraries on top of Ember can add initializers, like so:
+
+ ```javascript
+ import Application from '@ember/application';
+
+ Application.initializer({
+ name: 'api-adapter',
+
+ initialize: function(application) {
+ application.register('api-adapter:main', ApiAdapter);
+ }
+ });
+ ```
+
+ Initializers provide an opportunity to access the internal registry, which
+ organizes the different components of an Ember application. Additionally
+ they provide a chance to access the instantiated application. Beyond
+ being used for libraries, initializers are also a great way to organize
+ dependency injection or setup in your own application.
+
+ ### Routing
+
+ In addition to creating your application's router, `Application` is
+ also responsible for telling the router when to start routing. Transitions
+ between routes can be logged with the `LOG_TRANSITIONS` flag, and more
+ detailed intra-transition logging can be logged with
+ the `LOG_TRANSITIONS_INTERNAL` flag:
+
+ ```javascript
+ import Application from '@ember/application';
+
+ let App = Application.create({
+ LOG_TRANSITIONS: true, // basic logging of successful transitions
+ LOG_TRANSITIONS_INTERNAL: true // detailed logging of all routing steps
+ });
+ ```
+
+ By default, the router will begin trying to translate the current URL into
+ application state once the browser emits the `DOMContentReady` event. If you
+ need to defer routing, you can call the application's `deferReadiness()`
+ method. Once routing can begin, call the `advanceReadiness()` method.
+
+ If there is any setup required before routing begins, you can implement a
+ `ready()` method on your app that will be invoked immediately before routing
+ begins.
+
+ @class Application
+ @extends Engine
+ @uses RegistryProxyMixin
+ @public
+ */
+
+ var Application = _engine.default.extend({
+ /**
+ The root DOM element of the Application. This can be specified as an
+ element or a
+ [jQuery-compatible selector string](http://api.jquery.com/category/selectors/).
+ This is the element that will be passed to the Application's,
+ `eventDispatcher`, which sets up the listeners for event delegation. Every
+ view in your application should be a child of the element you specify here.
+ @property rootElement
+ @type DOMElement
+ @default 'body'
+ @public
+ */
+ rootElement: 'body',
+
+ /**
+ The `Ember.EventDispatcher` responsible for delegating events to this
+ application's views.
+ The event dispatcher is created by the application at initialization time
+ and sets up event listeners on the DOM element described by the
+ application's `rootElement` property.
+ See the documentation for `Ember.EventDispatcher` for more information.
+ @property eventDispatcher
+ @type Ember.EventDispatcher
+ @default null
+ @public
+ */
+ eventDispatcher: null,
+
+ /**
+ The DOM events for which the event dispatcher should listen.
+ By default, the application's `Ember.EventDispatcher` listens
+ for a set of standard DOM events, such as `mousedown` and
+ `keyup`, and delegates them to your application's `Ember.View`
+ instances.
+ If you would like additional bubbling events to be delegated to your
+ views, set your `Application`'s `customEvents` property
+ to a hash containing the DOM event name as the key and the
+ corresponding view method name as the value. Setting an event to
+ a value of `null` will prevent a default event listener from being
+ added for that event.
+ To add new events to be listened to:
+ ```javascript
+ import Application from '@ember/application';
+ let App = Application.create({
+ customEvents: {
+ // add support for the paste event
+ paste: 'paste'
+ }
+ });
+ ```
+ To prevent default events from being listened to:
+ ```javascript
+ import Application from '@ember/application';
+ let App = Application.create({
+ customEvents: {
+ // remove support for mouseenter / mouseleave events
+ mouseenter: null,
+ mouseleave: null
+ }
+ });
+ ```
+ @property customEvents
+ @type Object
+ @default null
+ @public
+ */
+ customEvents: null,
+
+ /**
+ Whether the application should automatically start routing and render
+ templates to the `rootElement` on DOM ready. While default by true,
+ other environments such as FastBoot or a testing harness can set this
+ property to `false` and control the precise timing and behavior of the boot
+ process.
+ @property autoboot
+ @type Boolean
+ @default true
+ @private
+ */
+ autoboot: true,
+
+ /**
+ Whether the application should be configured for the legacy "globals mode".
+ Under this mode, the Application object serves as a global namespace for all
+ classes.
+ ```javascript
+ import Application from '@ember/application';
+ import Component from '@ember/component';
+ let App = Application.create({
+ ...
+ });
+ App.Router.reopen({
+ location: 'none'
+ });
+ App.Router.map({
+ ...
+ });
+ App.MyComponent = Component.extend({
+ ...
+ });
+ ```
+ This flag also exposes other internal APIs that assumes the existence of
+ a special "default instance", like `App.__container__.lookup(...)`.
+ This option is currently not configurable, its value is derived from
+ the `autoboot` flag – disabling `autoboot` also implies opting-out of
+ globals mode support, although they are ultimately orthogonal concerns.
+ Some of the global modes features are already deprecated in 1.x. The
+ existence of this flag is to untangle the globals mode code paths from
+ the autoboot code paths, so that these legacy features can be reviewed
+ for deprecation/removal separately.
+ Forcing the (autoboot=true, _globalsMode=false) here and running the tests
+ would reveal all the places where we are still relying on these legacy
+ behavior internally (mostly just tests).
+ @property _globalsMode
+ @type Boolean
+ @default true
+ @private
+ */
+ _globalsMode: true,
+
+ init: function (options) {
+ // eslint-disable-line no-unused-vars
+ this._super.apply(this, arguments);
+
+ if (!this.$) {
+ this.$ = _emberViews.jQuery;
+ }
+
+ registerLibraries();
+
+ if (true) {
+ logLibraryVersions();
+ }
+
+ // Start off the number of deferrals at 1. This will be decremented by
+ // the Application's own `boot` method.
+ this._readinessDeferrals = 1;
+ this._booted = false;
+
+ this.autoboot = this._globalsMode = !!this.autoboot;
+
+ if (this._globalsMode) {
+ this._prepareForGlobalsMode();
+ }
+
+ if (this.autoboot) {
+ this.waitForDOMReady();
+ }
+ },
+ buildInstance: function () {
+ var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+ options.base = this;
+ options.application = this;
+ return _applicationInstance.default.create(options);
+ },
+ _prepareForGlobalsMode: function () {
+ // Create subclass of Router for this Application instance.
+ // This is to ensure that someone reopening `App.Router` does not
+ // tamper with the default `Router`.
+ this.Router = (this.Router || _emberRouting.Router).extend();
+
+ this._buildDeprecatedInstance();
+ },
+ _buildDeprecatedInstance: function () {
+ // Build a default instance
+ var instance = this.buildInstance();
+
+ // Legacy support for App.__container__ and other global methods
+ // on App that rely on a single, default instance.
+ this.__deprecatedInstance__ = instance;
+ this.__container__ = instance.__container__;
+ },
+ waitForDOMReady: function () {
+ if (!this.$ || this.$.isReady) {
+ _emberMetal.run.schedule('actions', this, 'domReady');
+ } else {
+ this.$().ready(_emberMetal.run.bind(this, 'domReady'));
+ }
+ },
+ domReady: function () {
+ if (this.isDestroyed) {
+ return;
+ }
+
+ this._bootSync();
+
+ // Continues to `didBecomeReady`
+ },
+ deferReadiness: function () {
+ (true && !(this instanceof Application) && (0, _emberDebug.assert)('You must call deferReadiness on an instance of Application', this instanceof Application));
+ (true && !(this._readinessDeferrals > 0) && (0, _emberDebug.assert)('You cannot defer readiness since the `ready()` hook has already been called.', this._readinessDeferrals > 0));
+
+ this._readinessDeferrals++;
+ },
+ advanceReadiness: function () {
+ (true && !(this instanceof Application) && (0, _emberDebug.assert)('You must call advanceReadiness on an instance of Application', this instanceof Application));
+
+ this._readinessDeferrals--;
+
+ if (this._readinessDeferrals === 0) {
+ _emberMetal.run.once(this, this.didBecomeReady);
+ }
+ },
+ boot: function () {
+ if (this._bootPromise) {
+ return this._bootPromise;
+ }
+
+ try {
+ this._bootSync();
+ } catch (_) {
+ // Ignore th error: in the asynchronous boot path, the error is already reflected
+ // in the promise rejection
+ }
+
+ return this._bootPromise;
+ },
+ _bootSync: function () {
+ if (this._booted) {
+ return;
+ }
+
+ // Even though this returns synchronously, we still need to make sure the
+ // boot promise exists for book-keeping purposes: if anything went wrong in
+ // the boot process, we need to store the error as a rejection on the boot
+ // promise so that a future caller of `boot()` can tell what failed.
+ var defer = this._bootResolver = _emberRuntime.RSVP.defer();
+ this._bootPromise = defer.promise;
+
+ try {
+ this.runInitializers();
+ (0, _emberRuntime.runLoadHooks)('application', this);
+ this.advanceReadiness();
+ // Continues to `didBecomeReady`
+ } catch (error) {
+ // For the asynchronous boot path
+ defer.reject(error);
+
+ // For the synchronous boot path
+ throw error;
+ }
+ },
+ reset: function () {
+ (true && !(this._globalsMode && this.autoboot) && (0, _emberDebug.assert)('Calling reset() on instances of `Application` is not\n supported when globals mode is disabled; call `visit()` to\n create new `ApplicationInstance`s and dispose them\n via their `destroy()` method instead.', this._globalsMode && this.autoboot));
+
+
+ var instance = this.__deprecatedInstance__;
+
+ this._readinessDeferrals = 1;
+ this._bootPromise = null;
+ this._bootResolver = null;
+ this._booted = false;
+
+ function handleReset() {
+ (0, _emberMetal.run)(instance, 'destroy');
+ this._buildDeprecatedInstance();
+ _emberMetal.run.schedule('actions', this, '_bootSync');
+ }
+
+ _emberMetal.run.join(this, handleReset);
+ },
+ didBecomeReady: function () {
+ try {
+ // TODO: Is this still needed for _globalsMode = false?
+ if (!(0, _emberDebug.isTesting)()) {
+ // Eagerly name all classes that are already loaded
+ _emberRuntime.Namespace.processAll();
+ (0, _emberRuntime.setNamespaceSearchDisabled)(true);
+ }
+
+ // See documentation on `_autoboot()` for details
+ if (this.autoboot) {
+ var instance = void 0;
+
+ if (this._globalsMode) {
+ // If we already have the __deprecatedInstance__ lying around, boot it to
+ // avoid unnecessary work
+ instance = this.__deprecatedInstance__;
+ } else {
+ // Otherwise, build an instance and boot it. This is currently unreachable,
+ // because we forced _globalsMode to === autoboot; but having this branch
+ // allows us to locally toggle that flag for weeding out legacy globals mode
+ // dependencies independently
+ instance = this.buildInstance();
+ }
+
+ instance._bootSync();
+
+ // TODO: App.ready() is not called when autoboot is disabled, is this correct?
+ this.ready();
+
+ instance.startRouting();
+ }
+
+ // For the asynchronous boot path
+ this._bootResolver.resolve(this);
+
+ // For the synchronous boot path
+ this._booted = true;
+ } catch (error) {
+ // For the asynchronous boot path
+ this._bootResolver.reject(error);
+
+ // For the synchronous boot path
+ throw error;
+ }
+ },
+ ready: function () {
+ return this;
+ },
+ willDestroy: function () {
+ this._super.apply(this, arguments);
+ (0, _emberRuntime.setNamespaceSearchDisabled)(false);
+ this._booted = false;
+ this._bootPromise = null;
+ this._bootResolver = null;
+
+ if (_emberRuntime._loaded.application === this) {
+ _emberRuntime._loaded.application = undefined;
+ }
+
+ if (this._globalsMode && this.__deprecatedInstance__) {
+ this.__deprecatedInstance__.destroy();
+ }
+ },
+ visit: function (url, options) {
+ var _this = this;
+
+ return this.boot().then(function () {
+ var instance = _this.buildInstance();
+
+ return instance.boot(options).then(function () {
+ return instance.visit(url);
+ }).catch(function (error) {
+ (0, _emberMetal.run)(instance, 'destroy');
+ throw error;
+ });
+ });
+ }
+ });
+
+ Application.reopenClass({
+ buildRegistry: function (application) {
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+ // eslint-disable-line no-unused-vars
+ var registry = this._super.apply(this, arguments);
+
+ commonSetupRegistry(registry);
+
+ (0, _emberGlimmer.setupApplicationRegistry)(registry);
+
+ return registry;
+ }
+ });
+
+ function commonSetupRegistry(registry) {
+ registry.register('router:main', _emberRouting.Router.extend());
+ registry.register('-view-registry:main', {
+ create: function () {
+ return (0, _emberUtils.dictionary)(null);
+ }
+ });
+
+ registry.register('route:basic', _emberRouting.Route);
+ registry.register('event_dispatcher:main', _emberViews.EventDispatcher);
+
+ registry.injection('router:main', 'namespace', 'application:main');
+
+ registry.register('location:auto', _emberRouting.AutoLocation);
+ registry.register('location:hash', _emberRouting.HashLocation);
+ registry.register('location:history', _emberRouting.HistoryLocation);
+ registry.register('location:none', _emberRouting.NoneLocation);
+
+ registry.register((0, _container.privatize)(_templateObject), _emberRouting.BucketCache);
+
+ if (_features.EMBER_ROUTING_ROUTER_SERVICE) {
+ registry.register('service:router', _emberRouting.RouterService);
+ registry.injection('service:router', '_router', 'router:main');
+ }
+ }
+
+ function registerLibraries() {
+ if (!librariesRegistered) {
+ librariesRegistered = true;
+
+ if (_emberEnvironment.environment.hasDOM && typeof _emberViews.jQuery === 'function') {
+ _emberMetal.libraries.registerCoreLibrary('jQuery', (0, _emberViews.jQuery)().jquery);
+ }
+ }
+ }
+
+ function logLibraryVersions() {
+ if (true) {
+ if (_emberEnvironment.ENV.LOG_VERSION) {
+ // we only need to see this once per Application#init
+ _emberEnvironment.ENV.LOG_VERSION = false;
+ var libs = _emberMetal.libraries._registry;
+
+ var nameLengths = libs.map(function (item) {
+ return (0, _emberMetal.get)(item, 'name.length');
+ });
+
+ var maxNameLength = Math.max.apply(this, nameLengths);
+
+ (0, _emberDebug.debug)('-------------------------------');
+ for (var i = 0; i < libs.length; i++) {
+ var lib = libs[i];
+ var spaces = new Array(maxNameLength - lib.name.length + 1).join(' ');
+ (0, _emberDebug.debug)([lib.name, spaces, ' : ', lib.version].join(''));
+ }
+ (0, _emberDebug.debug)('-------------------------------');
+ }
+ }
+ }
+
+ exports.default = Application;
+});
+enifed('ember-application/system/engine-instance', ['exports', 'ember-babel', 'ember-utils', 'ember-runtime', 'ember-debug', 'container', 'ember-application/system/engine-parent'], function (exports, _emberBabel, _emberUtils, _emberRuntime, _emberDebug, _container, _engineParent) {
+ 'use strict';
+
+ var _templateObject = (0, _emberBabel.taggedTemplateLiteralLoose)(['-bucket-cache:main'], ['-bucket-cache:main']);
+
+ /**
+ The `EngineInstance` encapsulates all of the stateful aspects of a
+ running `Engine`.
+
+ @public
+ @class EngineInstance
+ @extends EmberObject
+ @uses RegistryProxyMixin
+ @uses ContainerProxyMixin
+ */
+
+ var EngineInstance = _emberRuntime.Object.extend(_emberRuntime.RegistryProxyMixin, _emberRuntime.ContainerProxyMixin, {
+ /**
+ The base `Engine` for which this is an instance.
+ @property {Engine} engine
+ @private
+ */
+ base: null,
+
+ init: function () {
+ this._super.apply(this, arguments);
+
+ (0, _emberUtils.guidFor)(this);
+
+ var base = this.base;
+
+ if (!base) {
+ base = this.application;
+ this.base = base;
+ }
+
+ // Create a per-instance registry that will use the application's registry
+ // as a fallback for resolving registrations.
+ var registry = this.__registry__ = new _container.Registry({
+ fallback: base.__registry__
+ });
+
+ // Create a per-instance container from the instance's registry
+ this.__container__ = registry.container({ owner: this });
+
+ this._booted = false;
+ },
+ boot: function (options) {
+ var _this = this;
+
+ if (this._bootPromise) {
+ return this._bootPromise;
+ }
+
+ this._bootPromise = new _emberRuntime.RSVP.Promise(function (resolve) {
+ return resolve(_this._bootSync(options));
+ });
+
+ return this._bootPromise;
+ },
+ _bootSync: function (options) {
+ if (this._booted) {
+ return this;
+ }
+
+ (true && !((0, _engineParent.getEngineParent)(this)) && (0, _emberDebug.assert)('An engine instance\'s parent must be set via `setEngineParent(engine, parent)` prior to calling `engine.boot()`.', (0, _engineParent.getEngineParent)(this)));
+
+
+ this.cloneParentDependencies();
+
+ this.setupRegistry(options);
+
+ this.base.runInstanceInitializers(this);
+
+ this._booted = true;
+
+ return this;
+ },
+ setupRegistry: function () {
+ var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.__container__.lookup('-environment:main');
+
+ this.constructor.setupRegistry(this.__registry__, options);
+ },
+ unregister: function (fullName) {
+ this.__container__.reset(fullName);
+ this._super.apply(this, arguments);
+ },
+ buildChildEngineInstance: function (name) {
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ var Engine = this.lookup('engine:' + name);
+
+ if (!Engine) {
+ throw new _emberDebug.Error('You attempted to mount the engine \'' + name + '\', but it is not registered with its parent.');
+ }
+
+ var engineInstance = Engine.buildInstance(options);
+
+ (0, _engineParent.setEngineParent)(engineInstance, this);
+
+ return engineInstance;
+ },
+ cloneParentDependencies: function () {
+ var _this2 = this;
+
+ var parent = (0, _engineParent.getEngineParent)(this);
+
+ var registrations = ['route:basic', 'service:-routing', 'service:-glimmer-environment'];
+
+ registrations.forEach(function (key) {
+ return _this2.register(key, parent.resolveRegistration(key));
+ });
+
+ var env = parent.lookup('-environment:main');
+ this.register('-environment:main', env, { instantiate: false });
+
+ var singletons = ['router:main', (0, _container.privatize)(_templateObject), '-view-registry:main', 'renderer:-' + (env.isInteractive ? 'dom' : 'inert'), 'service:-document'];
+
+ if (env.isInteractive) {
+ singletons.push('event_dispatcher:main');
+ }
+
+ singletons.forEach(function (key) {
+ return _this2.register(key, parent.lookup(key), { instantiate: false });
+ });
+
+ this.inject('view', '_environment', '-environment:main');
+ this.inject('route', '_environment', '-environment:main');
+ }
+ });
+
+ EngineInstance.reopenClass({
+ setupRegistry: function (registry, options) {
+ // when no options/environment is present, do nothing
+ if (!options) {
+ return;
+ }
+
+ registry.injection('view', '_environment', '-environment:main');
+ registry.injection('route', '_environment', '-environment:main');
+
+ if (options.isInteractive) {
+ registry.injection('view', 'renderer', 'renderer:-dom');
+ registry.injection('component', 'renderer', 'renderer:-dom');
+ } else {
+ registry.injection('view', 'renderer', 'renderer:-inert');
+ registry.injection('component', 'renderer', 'renderer:-inert');
+ }
+ }
+ });
+
+ exports.default = EngineInstance;
+});
+enifed('ember-application/system/engine-parent', ['exports', 'ember-utils'], function (exports, _emberUtils) {
+ 'use strict';
+
+ exports.ENGINE_PARENT = undefined;
+ exports.getEngineParent = getEngineParent;
+ exports.setEngineParent = setEngineParent;
+ var ENGINE_PARENT = exports.ENGINE_PARENT = (0, _emberUtils.symbol)('ENGINE_PARENT');
+
+ /**
+ `getEngineParent` retrieves an engine instance's parent instance.
+
+ @method getEngineParent
+ @param {EngineInstance} engine An engine instance.
+ @return {EngineInstance} The parent engine instance.
+ @for @ember/engine
+ @static
+ @private
+ */
+ function getEngineParent(engine) {
+ return engine[ENGINE_PARENT];
+ }
+
+ /**
+ `setEngineParent` sets an engine instance's parent instance.
+
+ @method setEngineParent
+ @param {EngineInstance} engine An engine instance.
+ @param {EngineInstance} parent The parent engine instance.
+ @private
+ */
+ function setEngineParent(engine, parent) {
+ engine[ENGINE_PARENT] = parent;
+ }
+});
+enifed('ember-application/system/engine', ['exports', 'ember-babel', 'ember-utils', 'ember-runtime', 'container', 'dag-map', 'ember-debug', 'ember-metal', 'ember-application/system/resolver', 'ember-application/system/engine-instance', 'ember-routing', 'ember-extension-support', 'ember-views', 'ember-glimmer'], function (exports, _emberBabel, _emberUtils, _emberRuntime, _container, _dagMap, _emberDebug, _emberMetal, _resolver, _engineInstance, _emberRouting, _emberExtensionSupport, _emberViews, _emberGlimmer) {
+ 'use strict';
+
+ var _templateObject = (0, _emberBabel.taggedTemplateLiteralLoose)(['-bucket-cache:main'], ['-bucket-cache:main']);
+
+ function props(obj) {
+ var properties = [];
+
+ for (var key in obj) {
+ properties.push(key);
+ }
+
+ return properties;
+ }
+
+ /**
+ The `Engine` class contains core functionality for both applications and
+ engines.
+
+ Each engine manages a registry that's used for dependency injection and
+ exposed through `RegistryProxy`.
+
+ Engines also manage initializers and instance initializers.
+
+ Engines can spawn `EngineInstance` instances via `buildInstance()`.
+
+ @class Engine
+ @extends Ember.Namespace
+ @uses RegistryProxy
+ @public
+ */
+ var Engine = _emberRuntime.Namespace.extend(_emberRuntime.RegistryProxyMixin, {
+ init: function () {
+ this._super.apply(this, arguments);
+
+ this.buildRegistry();
+ },
+
+
+ /**
+ A private flag indicating whether an engine's initializers have run yet.
+ @private
+ @property _initializersRan
+ */
+ _initializersRan: false,
+
+ ensureInitializers: function () {
+ if (!this._initializersRan) {
+ this.runInitializers();
+ this._initializersRan = true;
+ }
+ },
+ buildInstance: function () {
+ var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+ this.ensureInitializers();
+ options.base = this;
+ return _engineInstance.default.create(options);
+ },
+ buildRegistry: function () {
+ var registry = this.__registry__ = this.constructor.buildRegistry(this);
+
+ return registry;
+ },
+ initializer: function (options) {
+ this.constructor.initializer(options);
+ },
+ instanceInitializer: function (options) {
+ this.constructor.instanceInitializer(options);
+ },
+ runInitializers: function () {
+ var _this = this;
+
+ this._runInitializer('initializers', function (name, initializer) {
+ (true && !(!!initializer) && (0, _emberDebug.assert)('No application initializer named \'' + name + '\'', !!initializer));
+
+ initializer.initialize(_this);
+ });
+ },
+ runInstanceInitializers: function (instance) {
+ this._runInitializer('instanceInitializers', function (name, initializer) {
+ (true && !(!!initializer) && (0, _emberDebug.assert)('No instance initializer named \'' + name + '\'', !!initializer));
+
+ initializer.initialize(instance);
+ });
+ },
+ _runInitializer: function (bucketName, cb) {
+ var initializersByName = (0, _emberMetal.get)(this.constructor, bucketName);
+ var initializers = props(initializersByName);
+ var graph = new _dagMap.default();
+ var initializer = void 0;
+
+ for (var i = 0; i < initializers.length; i++) {
+ initializer = initializersByName[initializers[i]];
+ graph.add(initializer.name, initializer, initializer.before, initializer.after);
+ }
+
+ graph.topsort(cb);
+ }
+ });
+
+ Engine.reopenClass({
+ initializers: Object.create(null),
+ instanceInitializers: Object.create(null),
+
+ /**
+ The goal of initializers should be to register dependencies and injections.
+ This phase runs once. Because these initializers may load code, they are
+ allowed to defer application readiness and advance it. If you need to access
+ the container or store you should use an InstanceInitializer that will be run
+ after all initializers and therefore after all code is loaded and the app is
+ ready.
+ Initializer receives an object which has the following attributes:
+ `name`, `before`, `after`, `initialize`. The only required attribute is
+ `initialize`, all others are optional.
+ * `name` allows you to specify under which name the initializer is registered.
+ This must be a unique name, as trying to register two initializers with the
+ same name will result in an error.
+ ```app/initializer/named-initializer.js
+ import { debug } from '@ember/debug';
+ export function initialize() {
+ debug('Running namedInitializer!');
+ }
+ export default {
+ name: 'named-initializer',
+ initialize
+ };
+ ```
+ * `before` and `after` are used to ensure that this initializer is ran prior
+ or after the one identified by the value. This value can be a single string
+ or an array of strings, referencing the `name` of other initializers.
+ An example of ordering initializers, we create an initializer named `first`:
+ ```app/initializer/first.js
+ import { debug } from '@ember/debug';
+ export function initialize() {
+ debug('First initializer!');
+ }
+ export default {
+ name: 'first',
+ initialize
+ };
+ ```
+ ```bash
+ // DEBUG: First initializer!
+ ```
+ We add another initializer named `second`, specifying that it should run
+ after the initializer named `first`:
+ ```app/initializer/second.js
+ import { debug } from '@ember/debug';
+ export function initialize() {
+ debug('Second initializer!');
+ }
+ export default {
+ name: 'second',
+ after: 'first',
+ initialize
+ };
+ ```
+ ```
+ // DEBUG: First initializer!
+ // DEBUG: Second initializer!
+ ```
+ Afterwards we add a further initializer named `pre`, this time specifying
+ that it should run before the initializer named `first`:
+ ```app/initializer/pre.js
+ import { debug } from '@ember/debug';
+ export function initialize() {
+ debug('Pre initializer!');
+ }
+ export default {
+ name: 'pre',
+ before: 'first',
+ initialize
+ };
+ ```
+ ```bash
+ // DEBUG: Pre initializer!
+ // DEBUG: First initializer!
+ // DEBUG: Second initializer!
+ ```
+ Finally we add an initializer named `post`, specifying it should run after
+ both the `first` and the `second` initializers:
+ ```app/initializer/post.js
+ import { debug } from '@ember/debug';
+ export function initialize() {
+ debug('Post initializer!');
+ }
+ export default {
+ name: 'post',
+ after: ['first', 'second'],
+ initialize
+ };
+ ```
+ ```bash
+ // DEBUG: Pre initializer!
+ // DEBUG: First initializer!
+ // DEBUG: Second initializer!
+ // DEBUG: Post initializer!
+ ```
+ * `initialize` is a callback function that receives one argument,
+ `application`, on which you can operate.
+ Example of using `application` to register an adapter:
+ ```app/initializer/api-adapter.js
+ import ApiAdapter from '../utils/api-adapter';
+ export function initialize(application) {
+ application.register('api-adapter:main', ApiAdapter);
+ }
+ export default {
+ name: 'post',
+ after: ['first', 'second'],
+ initialize
+ };
+ ```
+ @method initializer
+ @param initializer {Object}
+ @public
+ */
+
+ initializer: buildInitializerMethod('initializers', 'initializer'),
+
+ /**
+ Instance initializers run after all initializers have run. Because
+ instance initializers run after the app is fully set up. We have access
+ to the store, container, and other items. However, these initializers run
+ after code has loaded and are not allowed to defer readiness.
+ Instance initializer receives an object which has the following attributes:
+ `name`, `before`, `after`, `initialize`. The only required attribute is
+ `initialize`, all others are optional.
+ * `name` allows you to specify under which name the instanceInitializer is
+ registered. This must be a unique name, as trying to register two
+ instanceInitializer with the same name will result in an error.
+ ```app/initializer/named-instance-initializer.js
+ import { debug } from '@ember/debug';
+ export function initialize() {
+ debug('Running named-instance-initializer!');
+ }
+ export default {
+ name: 'named-instance-initializer',
+ initialize
+ };
+ ```
+ * `before` and `after` are used to ensure that this initializer is ran prior
+ or after the one identified by the value. This value can be a single string
+ or an array of strings, referencing the `name` of other initializers.
+ * See Application.initializer for discussion on the usage of before
+ and after.
+ Example instanceInitializer to preload data into the store.
+ ```app/initializer/preload-data.js
+ import $ from 'jquery';
+ export function initialize(application) {
+ var userConfig, userConfigEncoded, store;
+ // We have a HTML escaped JSON representation of the user's basic
+ // configuration generated server side and stored in the DOM of the main
+ // index.html file. This allows the app to have access to a set of data
+ // without making any additional remote calls. Good for basic data that is
+ // needed for immediate rendering of the page. Keep in mind, this data,
+ // like all local models and data can be manipulated by the user, so it
+ // should not be relied upon for security or authorization.
+ // Grab the encoded data from the meta tag
+ userConfigEncoded = $('head meta[name=app-user-config]').attr('content');
+ // Unescape the text, then parse the resulting JSON into a real object
+ userConfig = JSON.parse(unescape(userConfigEncoded));
+ // Lookup the store
+ store = application.lookup('service:store');
+ // Push the encoded JSON into the store
+ store.pushPayload(userConfig);
+ }
+ export default {
+ name: 'named-instance-initializer',
+ initialize
+ };
+ ```
+ @method instanceInitializer
+ @param instanceInitializer
+ @public
+ */
+ instanceInitializer: buildInitializerMethod('instanceInitializers', 'instance initializer'),
+
+ buildRegistry: function (namespace) {
+ var registry = new _container.Registry({
+ resolver: resolverFor(namespace)
+ });
+
+ registry.set = _emberMetal.set;
+
+ registry.register('application:main', namespace, { instantiate: false });
+
+ commonSetupRegistry(registry);
+ (0, _emberGlimmer.setupEngineRegistry)(registry);
+
+ return registry;
+ },
+
+
+ /**
+ Set this to provide an alternate class to `DefaultResolver`
+ @deprecated Use 'Resolver' instead
+ @property resolver
+ @public
+ */
+ resolver: null,
+
+ /**
+ Set this to provide an alternate class to `DefaultResolver`
+ @property resolver
+ @public
+ */
+ Resolver: null
+ });
+
+ /**
+ This function defines the default lookup rules for container lookups:
+
+ * templates are looked up on `Ember.TEMPLATES`
+ * other names are looked up on the application after classifying the name.
+ For example, `controller:post` looks up `App.PostController` by default.
+ * if the default lookup fails, look for registered classes on the container
+
+ This allows the application to register default injections in the container
+ that could be overridden by the normal naming convention.
+
+ @private
+ @method resolverFor
+ @param {Ember.Namespace} namespace the namespace to look for classes
+ @return {*} the resolved value for a given lookup
+ */
+ function resolverFor(namespace) {
+ var ResolverClass = namespace.get('Resolver') || _resolver.default;
+
+ return ResolverClass.create({
+ namespace: namespace
+ });
+ }
+
+ function buildInitializerMethod(bucketName, humanName) {
+ return function (initializer) {
+ // If this is the first initializer being added to a subclass, we are going to reopen the class
+ // to make sure we have a new `initializers` object, which extends from the parent class' using
+ // prototypal inheritance. Without this, attempting to add initializers to the subclass would
+ // pollute the parent class as well as other subclasses.
+ if (this.superclass[bucketName] !== undefined && this.superclass[bucketName] === this[bucketName]) {
+ var attrs = {};
+ attrs[bucketName] = Object.create(this[bucketName]);
+ this.reopenClass(attrs);
+ }
+
+ (true && !(!this[bucketName][initializer.name]) && (0, _emberDebug.assert)('The ' + humanName + ' \'' + initializer.name + '\' has already been registered', !this[bucketName][initializer.name]));
+ (true && !((0, _emberUtils.canInvoke)(initializer, 'initialize')) && (0, _emberDebug.assert)('An ' + humanName + ' cannot be registered without an initialize function', (0, _emberUtils.canInvoke)(initializer, 'initialize')));
+ (true && !(initializer.name !== undefined) && (0, _emberDebug.assert)('An ' + humanName + ' cannot be registered without a name property', initializer.name !== undefined));
+
+
+ this[bucketName][initializer.name] = initializer;
+ };
+ }
+
+ function commonSetupRegistry(registry) {
+ registry.optionsForType('component', { singleton: false });
+ registry.optionsForType('view', { singleton: false });
+
+ registry.register('controller:basic', _emberRuntime.Controller, { instantiate: false });
+
+ registry.injection('view', '_viewRegistry', '-view-registry:main');
+ registry.injection('renderer', '_viewRegistry', '-view-registry:main');
+ registry.injection('event_dispatcher:main', '_viewRegistry', '-view-registry:main');
+
+ registry.injection('route', '_topLevelViewTemplate', 'template:-outlet');
+
+ registry.injection('view:-outlet', 'namespace', 'application:main');
+
+ registry.injection('controller', 'target', 'router:main');
+ registry.injection('controller', 'namespace', 'application:main');
+
+ registry.injection('router', '_bucketCache', (0, _container.privatize)(_templateObject));
+ registry.injection('route', '_bucketCache', (0, _container.privatize)(_templateObject));
+
+ registry.injection('route', 'router', 'router:main');
+
+ // Register the routing service...
+ registry.register('service:-routing', _emberRouting.RoutingService);
+ // Then inject the app router into it
+ registry.injection('service:-routing', 'router', 'router:main');
+
+ // DEBUGGING
+ registry.register('resolver-for-debugging:main', registry.resolver, { instantiate: false });
+ registry.injection('container-debug-adapter:main', 'resolver', 'resolver-for-debugging:main');
+ registry.injection('data-adapter:main', 'containerDebugAdapter', 'container-debug-adapter:main');
+ // Custom resolver authors may want to register their own ContainerDebugAdapter with this key
+
+ registry.register('container-debug-adapter:main', _emberExtensionSupport.ContainerDebugAdapter);
+
+ registry.register('component-lookup:main', _emberViews.ComponentLookup);
+ }
+
+ exports.default = Engine;
+});
+enifed('ember-application/system/resolver', ['exports', 'ember-utils', 'ember-metal', 'ember-debug', 'ember-runtime', 'ember-application/utils/validate-type', 'ember-glimmer'], function (exports, _emberUtils, _emberMetal, _emberDebug, _emberRuntime, _validateType, _emberGlimmer) {
+ 'use strict';
+
+ exports.Resolver = undefined;
+ /**
+ @module @ember/application
+ */
+
+ var Resolver = exports.Resolver = _emberRuntime.Object.extend({
+ /*
+ This will be set to the Application instance when it is
+ created.
+ @property namespace
+ */
+ namespace: null,
+ normalize: null, // required
+ resolve: null, // required
+ parseName: null, // required
+ lookupDescription: null, // required
+ makeToString: null, // required
+ resolveOther: null, // required
+ _logLookup: null // required
+ });
+
+ /**
+ The DefaultResolver defines the default lookup rules to resolve
+ container lookups before consulting the container for registered
+ items:
+
+ * templates are looked up on `Ember.TEMPLATES`
+ * other names are looked up on the application after converting
+ the name. For example, `controller:post` looks up
+ `App.PostController` by default.
+ * there are some nuances (see examples below)
+
+ ### How Resolving Works
+
+ The container calls this object's `resolve` method with the
+ `fullName` argument.
+
+ It first parses the fullName into an object using `parseName`.
+
+ Then it checks for the presence of a type-specific instance
+ method of the form `resolve[Type]` and calls it if it exists.
+ For example if it was resolving 'template:post', it would call
+ the `resolveTemplate` method.
+
+ Its last resort is to call the `resolveOther` method.
+
+ The methods of this object are designed to be easy to override
+ in a subclass. For example, you could enhance how a template
+ is resolved like so:
+
+ ```app/app.js
+ import Application from '@ember/application';
+ import GlobalsResolver from '@ember/application/globals-resolver';
+
+ App = Application.create({
+ Resolver: GlobalsResolver.extend({
+ resolveTemplate(parsedName) {
+ let resolvedTemplate = this._super(parsedName);
+ if (resolvedTemplate) { return resolvedTemplate; }
+
+ return Ember.TEMPLATES['not_found'];
+ }
+ })
+ });
+ ```
+
+ Some examples of how names are resolved:
+
+ ```text
+ 'template:post' //=> Ember.TEMPLATES['post']
+ 'template:posts/byline' //=> Ember.TEMPLATES['posts/byline']
+ 'template:posts.byline' //=> Ember.TEMPLATES['posts/byline']
+ 'template:blogPost' //=> Ember.TEMPLATES['blog-post']
+ 'controller:post' //=> App.PostController
+ 'controller:posts.index' //=> App.PostsIndexController
+ 'controller:blog/post' //=> Blog.PostController
+ 'controller:basic' //=> Controller
+ 'route:post' //=> App.PostRoute
+ 'route:posts.index' //=> App.PostsIndexRoute
+ 'route:blog/post' //=> Blog.PostRoute
+ 'route:basic' //=> Route
+ 'foo:post' //=> App.PostFoo
+ 'model:post' //=> App.Post
+ ```
+
+ @class GlobalsResolver
+ @extends EmberObject
+ @public
+ */
+
+ var DefaultResolver = _emberRuntime.Object.extend({
+ /**
+ This will be set to the Application instance when it is
+ created.
+ @property namespace
+ @public
+ */
+ namespace: null,
+
+ init: function () {
+ this._parseNameCache = (0, _emberUtils.dictionary)(null);
+ },
+ normalize: function (fullName) {
+ var _fullName$split = fullName.split(':'),
+ type = _fullName$split[0],
+ name = _fullName$split[1];
+
+ (true && !(fullName.split(':').length === 2) && (0, _emberDebug.assert)('Tried to normalize a container name without a colon (:) in it. ' + 'You probably tried to lookup a name that did not contain a type, ' + 'a colon, and a name. A proper lookup name would be `view:post`.', fullName.split(':').length === 2));
+
+
+ if (type !== 'template') {
+ var result = name.replace(/(\.|_|-)./g, function (m) {
+ return m.charAt(1).toUpperCase();
+ });
+
+ return type + ':' + result;
+ } else {
+ return fullName;
+ }
+ },
+ resolve: function (fullName) {
+ var parsedName = this.parseName(fullName);
+ var resolveMethodName = parsedName.resolveMethodName;
+ var resolved = void 0;
+
+ if (this[resolveMethodName]) {
+ resolved = this[resolveMethodName](parsedName);
+ }
+
+ resolved = resolved || this.resolveOther(parsedName);
+
+ if (true) {
+ if (parsedName.root && parsedName.root.LOG_RESOLVER) {
+ this._logLookup(resolved, parsedName);
+ }
+ }
+
+ if (resolved) {
+ (0, _validateType.default)(resolved, parsedName);
+ }
+
+ return resolved;
+ },
+ parseName: function (fullName) {
+ return this._parseNameCache[fullName] || (this._parseNameCache[fullName] = this._parseName(fullName));
+ },
+ _parseName: function (fullName) {
+ var _fullName$split2 = fullName.split(':'),
+ type = _fullName$split2[0],
+ fullNameWithoutType = _fullName$split2[1];
+
+ var name = fullNameWithoutType;
+ var namespace = (0, _emberMetal.get)(this, 'namespace');
+ var root = namespace;
+ var lastSlashIndex = name.lastIndexOf('/');
+ var dirname = lastSlashIndex !== -1 ? name.slice(0, lastSlashIndex) : null;
+
+ if (type !== 'template' && lastSlashIndex !== -1) {
+ var parts = name.split('/');
+ name = parts[parts.length - 1];
+ var namespaceName = _emberRuntime.String.capitalize(parts.slice(0, -1).join('.'));
+ root = _emberRuntime.Namespace.byName(namespaceName);
+
+ (true && !(root) && (0, _emberDebug.assert)('You are looking for a ' + name + ' ' + type + ' in the ' + namespaceName + ' namespace, but the namespace could not be found', root));
+ }
+
+ var resolveMethodName = fullNameWithoutType === 'main' ? 'Main' : _emberRuntime.String.classify(type);
+
+ if (!(name && type)) {
+ throw new TypeError('Invalid fullName: `' + fullName + '`, must be of the form `type:name` ');
+ }
+
+ return {
+ fullName: fullName,
+ type: type,
+ fullNameWithoutType: fullNameWithoutType,
+ dirname: dirname,
+ name: name,
+ root: root,
+ resolveMethodName: 'resolve' + resolveMethodName
+ };
+ },
+ lookupDescription: function (fullName) {
+ var parsedName = this.parseName(fullName);
+ var description = void 0;
+
+ if (parsedName.type === 'template') {
+ return 'template at ' + parsedName.fullNameWithoutType.replace(/\./g, '/');
+ }
+
+ description = parsedName.root + '.' + _emberRuntime.String.classify(parsedName.name).replace(/\./g, '');
+
+ if (parsedName.type !== 'model') {
+ description += _emberRuntime.String.classify(parsedName.type);
+ }
+
+ return description;
+ },
+ makeToString: function (factory) {
+ return factory.toString();
+ },
+ useRouterNaming: function (parsedName) {
+ if (parsedName.name === 'basic') {
+ parsedName.name = '';
+ } else {
+ parsedName.name = parsedName.name.replace(/\./g, '_');
+ }
+ },
+ resolveTemplate: function (parsedName) {
+ var templateName = parsedName.fullNameWithoutType.replace(/\./g, '/');
+
+ return (0, _emberGlimmer.getTemplate)(templateName) || (0, _emberGlimmer.getTemplate)(_emberRuntime.String.decamelize(templateName));
+ },
+ resolveView: function (parsedName) {
+ this.useRouterNaming(parsedName);
+ return this.resolveOther(parsedName);
+ },
+ resolveController: function (parsedName) {
+ this.useRouterNaming(parsedName);
+ return this.resolveOther(parsedName);
+ },
+ resolveRoute: function (parsedName) {
+ this.useRouterNaming(parsedName);
+ return this.resolveOther(parsedName);
+ },
+ resolveModel: function (parsedName) {
+ var className = _emberRuntime.String.classify(parsedName.name);
+ var factory = (0, _emberMetal.get)(parsedName.root, className);
+
+ return factory;
+ },
+ resolveHelper: function (parsedName) {
+ return this.resolveOther(parsedName);
+ },
+ resolveOther: function (parsedName) {
+ var className = _emberRuntime.String.classify(parsedName.name) + _emberRuntime.String.classify(parsedName.type);
+ var factory = (0, _emberMetal.get)(parsedName.root, className);
+ return factory;
+ },
+ resolveMain: function (parsedName) {
+ var className = _emberRuntime.String.classify(parsedName.type);
+ return (0, _emberMetal.get)(parsedName.root, className);
+ },
+ knownForType: function (type) {
+ var namespace = (0, _emberMetal.get)(this, 'namespace');
+ var suffix = _emberRuntime.String.classify(type);
+ var typeRegexp = new RegExp(suffix + '$');
+
+ var known = (0, _emberUtils.dictionary)(null);
+ var knownKeys = Object.keys(namespace);
+ for (var index = 0; index < knownKeys.length; index++) {
+ var name = knownKeys[index];
+
+ if (typeRegexp.test(name)) {
+ var containerName = this.translateToContainerFullname(type, name);
+
+ known[containerName] = true;
+ }
+ }
+
+ return known;
+ },
+ translateToContainerFullname: function (type, name) {
+ var suffix = _emberRuntime.String.classify(type);
+ var namePrefix = name.slice(0, suffix.length * -1);
+ var dasherizedName = _emberRuntime.String.dasherize(namePrefix);
+
+ return type + ':' + dasherizedName;
+ }
+ });
+
+ exports.default = DefaultResolver;
+
+
+ if (true) {
+ DefaultResolver.reopen({
+ _logLookup: function (found, parsedName) {
+ var symbol = found ? '[✓]' : '[ ]';
+
+ var padding = void 0;
+ if (parsedName.fullName.length > 60) {
+ padding = '.';
+ } else {
+ padding = new Array(60 - parsedName.fullName.length).join('.');
+ }
+
+ (0, _emberDebug.info)(symbol, parsedName.fullName, padding, this.lookupDescription(parsedName.fullName));
+ }
+ });
+ }
+});
+enifed('ember-application/utils/validate-type', ['exports', 'ember-debug'], function (exports, _emberDebug) {
+ 'use strict';
+
+ exports.default = validateType;
+
+
+ var VALIDATED_TYPES = {
+ route: ['assert', 'isRouteFactory', 'Ember.Route'],
+ component: ['deprecate', 'isComponentFactory', 'Ember.Component'],
+ view: ['deprecate', 'isViewFactory', 'Ember.View'],
+ service: ['deprecate', 'isServiceFactory', 'Ember.Service']
+ };
+
+ function validateType(resolvedType, parsedName) {
+ var validationAttributes = VALIDATED_TYPES[parsedName.type];
+
+ if (!validationAttributes) {
+ return;
+ }
+
+ var factoryFlag = validationAttributes[1],
+ expectedType = validationAttributes[2];
+ (true && !(!!resolvedType[factoryFlag]) && (0, _emberDebug.assert)('Expected ' + parsedName.fullName + ' to resolve to an ' + expectedType + ' but ' + ('instead it was ' + resolvedType + '.'), !!resolvedType[factoryFlag]));
+ }
+});
+enifed('ember-babel', ['exports'], function (exports) {
+ 'use strict';
+
+ exports.classCallCheck = classCallCheck;
+ exports.inherits = inherits;
+ exports.taggedTemplateLiteralLoose = taggedTemplateLiteralLoose;
+ exports.createClass = createClass;
+ exports.defaults = defaults;
+ function classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError('Cannot call a class as a function');
+ }
+ }
+
+ function inherits(subClass, superClass) {
+ if (typeof superClass !== 'function' && superClass !== null) {
+ throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass);
+ }
+
+ subClass.prototype = Object.create(superClass && superClass.prototype, {
+ constructor: {
+ value: subClass,
+ enumerable: false,
+ writable: true,
+ configurable: true
+ }
+ });
+
+ if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : defaults(subClass, superClass);
+ }
+
+ function taggedTemplateLiteralLoose(strings, raw) {
+ strings.raw = raw;
+ return strings;
+ }
+
+ function defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || false;
+ descriptor.configurable = true;
+ if ('value' in descriptor) descriptor.writable = true;
+ Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+
+ function createClass(Constructor, protoProps, staticProps) {
+ if (protoProps) defineProperties(Constructor.prototype, protoProps);
+ if (staticProps) defineProperties(Constructor, staticProps);
+ return Constructor;
+ }
+
+ function defaults(obj, defaults) {
+ var keys = Object.getOwnPropertyNames(defaults);
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];
+ var value = Object.getOwnPropertyDescriptor(defaults, key);
+ if (value && value.configurable && obj[key] === undefined) {
+ Object.defineProperty(obj, key, value);
+ }
+ }
+ return obj;
+ }
+
+ var possibleConstructorReturn = exports.possibleConstructorReturn = function (self, call) {
+ if (!self) {
+ throw new ReferenceError('this hasn\'t been initialized - super() hasn\'t been called');
+ }
+ return call && (typeof call === 'object' || typeof call === 'function') ? call : self;
+ };
+
+ var slice = exports.slice = Array.prototype.slice;
+});
+enifed("ember-console", ["exports"], function (exports) {
+ "use strict";
+
+ /**
+ @module ember
+ */
+ /**
+ Inside Ember-Metal, simply uses the methods from `imports.console`.
+ Override this to provide more robust logging functionality.
+
+ @class Logger
+ @namespace Ember
+ @public
+ */
+ var index = {
+ log: function () {
+ var _console;
+
+ return (_console = console).log.apply(_console, arguments);
+ },
+ warn: function () {
+ var _console2;
+
+ return (_console2 = console).warn.apply(_console2, arguments);
+ },
+ error: function () {
+ var _console3;
+
+ return (_console3 = console).error.apply(_console3, arguments);
+ },
+ info: function () {
+ var _console4;
+
+ return (_console4 = console).info.apply(_console4, arguments);
+ },
+ debug: function () {
+ var _console6;
+
+ /* eslint-disable no-console */
+ if (console.debug) {
+ var _console5;
+
+ return (_console5 = console).debug.apply(_console5, arguments);
+ }
+
+ return (_console6 = console).info.apply(_console6, arguments);
+ /* eslint-enable no-console */
+ },
+ assert: function () {
+ var _console7;
+
+ return (_console7 = console).assert.apply(_console7, arguments);
+ }
+ };
+
+ exports.default = index;
+});
+enifed('ember-debug/deprecate', ['exports', 'ember-debug/error', 'ember-console', 'ember-environment', 'ember-debug/index', 'ember-debug/handlers'], function (exports, _error, _emberConsole, _emberEnvironment, _index, _handlers) {
+ 'use strict';
+
+ exports.missingOptionsUntilDeprecation = exports.missingOptionsIdDeprecation = exports.missingOptionsDeprecation = exports.registerHandler = undefined;
+
+ /**
+ @module @ember/debug
+ @public
+ */
+ /**
+ Allows for runtime registration of handler functions that override the default deprecation behavior.
+ Deprecations are invoked by calls to [@ember/application/deprecations/deprecate](https://emberjs.com/api/ember/release/classes/@ember%2Fapplication%2Fdeprecations/methods/deprecate?anchor=deprecate).
+ The following example demonstrates its usage by registering a handler that throws an error if the
+ message contains the word "should", otherwise defers to the default handler.
+
+ ```javascript
+ import { registerDeprecationHandler } from '@ember/debug';
+
+ registerDeprecationHandler((message, options, next) => {
+ if (message.indexOf('should') !== -1) {
+ throw new Error(`Deprecation message with should: ${message}`);
+ } else {
+ // defer to whatever handler was registered before this one
+ next(message, options);
+ }
+ });
+ ```
+
+ The handler function takes the following arguments:
+
+ <ul>
+ <li> <code>message</code> - The message received from the deprecation call.</li>
+ <li> <code>options</code> - An object passed in with the deprecation call containing additional information including:</li>
+ <ul>
+ <li> <code>id</code> - An id of the deprecation in the form of <code>package-name.specific-deprecation</code>.</li>
+ <li> <code>until</code> - The Ember version number the feature and deprecation will be removed in.</li>
+ </ul>
+ <li> <code>next</code> - A function that calls into the previously registered handler.</li>
+ </ul>
+
+ @public
+ @static
+ @method registerDeprecationHandler
+ @for @ember/debug
+ @param handler {Function} A function to handle deprecation calls.
+ @since 2.1.0
+ */
+ /*global __fail__*/
+ var registerHandler = function () {};
+ var missingOptionsDeprecation = void 0,
+ missingOptionsIdDeprecation = void 0,
+ missingOptionsUntilDeprecation = void 0,
+ deprecate = void 0;
+
+ if (true) {
+ exports.registerHandler = registerHandler = function registerHandler(handler) {
+ (0, _handlers.registerHandler)('deprecate', handler);
+ };
+
+ var formatMessage = function formatMessage(_message, options) {
+ var message = _message;
+
+ if (options && options.id) {
+ message = message + (' [deprecation id: ' + options.id + ']');
+ }
+
+ if (options && options.url) {
+ message += ' See ' + options.url + ' for more details.';
+ }
+
+ return message;
+ };
+
+ registerHandler(function logDeprecationToConsole(message, options) {
+ var updatedMessage = formatMessage(message, options);
+
+ _emberConsole.default.warn('DEPRECATION: ' + updatedMessage);
+ });
+
+ var captureErrorForStack = void 0;
+
+ if (new Error().stack) {
+ captureErrorForStack = function () {
+ return new Error();
+ };
+ } else {
+ captureErrorForStack = function () {
+ try {
+ __fail__.fail();
+ } catch (e) {
+ return e;
+ }
+ };
+ }
+
+ registerHandler(function logDeprecationStackTrace(message, options, next) {
+ if (_emberEnvironment.ENV.LOG_STACKTRACE_ON_DEPRECATION) {
+ var stackStr = '';
+ var error = captureErrorForStack();
+ var stack = void 0;
+
+ if (error.stack) {
+ if (error['arguments']) {
+ // Chrome
+ stack = error.stack.replace(/^\s+at\s+/gm, '').replace(/^([^\(]+?)([\n$])/gm, '{anonymous}($1)$2').replace(/^Object.<anonymous>\s*\(([^\)]+)\)/gm, '{anonymous}($1)').split('\n');
+ stack.shift();
+ } else {
+ // Firefox
+ stack = error.stack.replace(/(?:\n@:0)?\s+$/m, '').replace(/^\(/gm, '{anonymous}(').split('\n');
+ }
+
+ stackStr = '\n ' + stack.slice(2).join('\n ');
+ }
+
+ var updatedMessage = formatMessage(message, options);
+
+ _emberConsole.default.warn('DEPRECATION: ' + updatedMessage + stackStr);
+ } else {
+ next.apply(undefined, arguments);
+ }
+ });
+
+ registerHandler(function raiseOnDeprecation(message, options, next) {
+ if (_emberEnvironment.ENV.RAISE_ON_DEPRECATION) {
+ var updatedMessage = formatMessage(message);
+
+ throw new _error.default(updatedMessage);
+ } else {
+ next.apply(undefined, arguments);
+ }
+ });
+
+ exports.missingOptionsDeprecation = missingOptionsDeprecation = 'When calling `deprecate` you ' + 'must provide an `options` hash as the third parameter. ' + '`options` should include `id` and `until` properties.';
+ exports.missingOptionsIdDeprecation = missingOptionsIdDeprecation = 'When calling `deprecate` you must provide `id` in options.';
+ exports.missingOptionsUntilDeprecation = missingOptionsUntilDeprecation = 'When calling `deprecate` you must provide `until` in options.';
+ /**
+ @module @ember/application
+ @public
+ */
+ /**
+ Display a deprecation warning with the provided message and a stack trace
+ (Chrome and Firefox only).
+ * In a production build, this method is defined as an empty function (NOP).
+ Uses of this method in Ember itself are stripped from the ember.prod.js build.
+ @method deprecate
+ @for @ember/application/deprecations
+ @param {String} message A description of the deprecation.
+ @param {Boolean} test A boolean. If falsy, the deprecation will be displayed.
+ @param {Object} options
+ @param {String} options.id A unique id for this deprecation. The id can be
+ used by Ember debugging tools to change the behavior (raise, log or silence)
+ for that specific deprecation. The id should be namespaced by dots, e.g.
+ "view.helper.select".
+ @param {string} options.until The version of Ember when this deprecation
+ warning will be removed.
+ @param {String} [options.url] An optional url to the transition guide on the
+ emberjs.com website.
+ @static
+ @public
+ @since 1.0.0
+ */
+ deprecate = function deprecate(message, test, options) {
+ if (_emberEnvironment.ENV._ENABLE_DEPRECATION_OPTIONS_SUPPORT !== true) {
+ (0, _index.assert)(missingOptionsDeprecation, options && (options.id || options.until));
+ (0, _index.assert)(missingOptionsIdDeprecation, options.id);
+ (0, _index.assert)(missingOptionsUntilDeprecation, options.until);
+ }
+
+ if ((!options || !options.id && !options.until) && _emberEnvironment.ENV._ENABLE_DEPRECATION_OPTIONS_SUPPORT === true) {
+ deprecate(missingOptionsDeprecation, false, {
+ id: 'ember-debug.deprecate-options-missing',
+ until: '3.0.0',
+ url: 'https://emberjs.com/deprecations/v2.x/#toc_ember-debug-function-options'
+ });
+ }
+
+ if (options && !options.id && _emberEnvironment.ENV._ENABLE_DEPRECATION_OPTIONS_SUPPORT === true) {
+ deprecate(missingOptionsIdDeprecation, false, {
+ id: 'ember-debug.deprecate-id-missing',
+ until: '3.0.0',
+ url: 'https://emberjs.com/deprecations/v2.x/#toc_ember-debug-function-options'
+ });
+ }
+
+ if (options && !options.until && _emberEnvironment.ENV._ENABLE_DEPRECATION_OPTIONS_SUPPORT === true) {
+ deprecate(missingOptionsUntilDeprecation, options && options.until, {
+ id: 'ember-debug.deprecate-until-missing',
+ until: '3.0.0',
+ url: 'https://emberjs.com/deprecations/v2.x/#toc_ember-debug-function-options'
+ });
+ }
+
+ _handlers.invoke.apply(undefined, ['deprecate'].concat(Array.prototype.slice.call(arguments)));
+ };
+ }
+
+ exports.default = deprecate;
+ exports.registerHandler = registerHandler;
+ exports.missingOptionsDeprecation = missingOptionsDeprecation;
+ exports.missingOptionsIdDeprecation = missingOptionsIdDeprecation;
+ exports.missingOptionsUntilDeprecation = missingOptionsUntilDeprecation;
+});
+enifed("ember-debug/error", ["exports", "ember-babel"], function (exports, _emberBabel) {
+ "use strict";
+
+ /**
+ @module @ember/error
+ */
+ function ExtendBuiltin(klass) {
+ function ExtendableBuiltin() {
+ klass.apply(this, arguments);
+ }
+
+ ExtendableBuiltin.prototype = Object.create(klass.prototype);
+ ExtendableBuiltin.prototype.constructor = ExtendableBuiltin;
+ return ExtendableBuiltin;
+ }
+
+ /**
+ A subclass of the JavaScript Error object for use in Ember.
+
+ @class EmberError
+ @extends Error
+ @constructor
+ @public
+ */
+
+ var EmberError = function (_ExtendBuiltin) {
+ (0, _emberBabel.inherits)(EmberError, _ExtendBuiltin);
+
+ function EmberError(message) {
+ (0, _emberBabel.classCallCheck)(this, EmberError);
+
+ var _this = (0, _emberBabel.possibleConstructorReturn)(this, _ExtendBuiltin.call(this));
+
+ if (!(_this instanceof EmberError)) {
+ var _ret;
+
+ return _ret = new EmberError(message), (0, _emberBabel.possibleConstructorReturn)(_this, _ret);
+ }
+
+ var error = Error.call(_this, message);
+ _this.stack = error.stack;
+ _this.description = error.description;
+ _this.fileName = error.fileName;
+ _this.lineNumber = error.lineNumber;
+ _this.message = error.message;
+ _this.name = error.name;
+ _this.number = error.number;
+ _this.code = error.code;
+ return _this;
+ }
+
+ return EmberError;
+ }(ExtendBuiltin(Error));
+
+ exports.default = EmberError;
+});
+enifed('ember-debug/features', ['exports', 'ember-environment', 'ember/features'], function (exports, _emberEnvironment, _features) {
+ 'use strict';
+
+ exports.default = isEnabled;
+ var FEATURES = _features.FEATURES;
+
+
+ /**
+ @module ember
+ */
+
+ /**
+ The hash of enabled Canary features. Add to this, any canary features
+ before creating your application.
+
+ Alternatively (and recommended), you can also define `EmberENV.FEATURES`
+ if you need to enable features flagged at runtime.
+
+ @class FEATURES
+ @namespace Ember
+ @static
+ @since 1.1.0
+ @public
+ */
+
+ // Auto-generated
+
+ /**
+ Determine whether the specified `feature` is enabled. Used by Ember's
+ build tools to exclude experimental features from beta/stable builds.
+
+ You can define the following configuration options:
+
+ * `EmberENV.ENABLE_OPTIONAL_FEATURES` - enable any features that have not been explicitly
+ enabled/disabled.
+
+ @method isEnabled
+ @param {String} feature The feature to check
+ @return {Boolean}
+ @for Ember.FEATURES
+ @since 1.1.0
+ @public
+ */
+ function isEnabled(feature) {
+ var featureValue = FEATURES[feature];
+
+ if (featureValue === true || featureValue === false || featureValue === undefined) {
+ return featureValue;
+ } else if (_emberEnvironment.ENV.ENABLE_OPTIONAL_FEATURES) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+});
+enifed('ember-debug/handlers', ['exports'], function (exports) {
+ 'use strict';
+
+ var HANDLERS = exports.HANDLERS = {};
+
+ var registerHandler = function () {};
+ var invoke = function () {};
+
+ if (true) {
+ exports.registerHandler = registerHandler = function registerHandler(type, callback) {
+ var nextHandler = HANDLERS[type] || function () {};
+
+ HANDLERS[type] = function (message, options) {
+ callback(message, options, nextHandler);
+ };
+ };
+
+ exports.invoke = invoke = function invoke(type, message, test, options) {
+ if (test) {
+ return;
+ }
+
+ var handlerForType = HANDLERS[type];
+
+ if (handlerForType) {
+ handlerForType(message, options);
+ }
+ };
+ }
+
+ exports.registerHandler = registerHandler;
+ exports.invoke = invoke;
+});
+enifed('ember-debug/index', ['exports', 'ember-debug/warn', 'ember-debug/deprecate', 'ember-debug/features', 'ember-debug/error', 'ember-debug/testing', 'ember-environment', 'ember-console', 'ember/features'], function (exports, _warn2, _deprecate2, _features, _error, _testing, _emberEnvironment, _emberConsole, _features2) {
+ 'use strict';
+
+ exports._warnIfUsingStrippedFeatureFlags = exports.getDebugFunction = exports.setDebugFunction = exports.deprecateFunc = exports.runInDebug = exports.debugFreeze = exports.debugSeal = exports.deprecate = exports.debug = exports.warn = exports.info = exports.assert = exports.setTesting = exports.isTesting = exports.Error = exports.isFeatureEnabled = exports.registerDeprecationHandler = exports.registerWarnHandler = undefined;
+ Object.defineProperty(exports, 'registerWarnHandler', {
+ enumerable: true,
+ get: function () {
+ return _warn2.registerHandler;
+ }
+ });
+ Object.defineProperty(exports, 'registerDeprecationHandler', {
+ enumerable: true,
+ get: function () {
+ return _deprecate2.registerHandler;
+ }
+ });
+ Object.defineProperty(exports, 'isFeatureEnabled', {
+ enumerable: true,
+ get: function () {
+ return _features.default;
+ }
+ });
+ Object.defineProperty(exports, 'Error', {
+ enumerable: true,
+ get: function () {
+ return _error.default;
+ }
+ });
+ Object.defineProperty(exports, 'isTesting', {
+ enumerable: true,
+ get: function () {
+ return _testing.isTesting;
+ }
+ });
+ Object.defineProperty(exports, 'setTesting', {
+ enumerable: true,
+ get: function () {
+ return _testing.setTesting;
+ }
+ });
+ var DEFAULT_FEATURES = _features2.DEFAULT_FEATURES,
+ FEATURES = _features2.FEATURES;
+
+
+ // These are the default production build versions:
+ var noop = function () {};
+
+ var assert = noop;
+ var info = noop;
+ var warn = noop;
+ var debug = noop;
+ var deprecate = noop;
+ var debugSeal = noop;
+ var debugFreeze = noop;
+ var runInDebug = noop;
+ var setDebugFunction = noop;
+ var getDebugFunction = noop;
+
+ var deprecateFunc = function () {
+ return arguments[arguments.length - 1];
+ };
+
+ if (true) {
+ exports.setDebugFunction = setDebugFunction = function (type, callback) {
+ switch (type) {
+ case 'assert':
+ return exports.assert = assert = callback;
+ case 'info':
+ return exports.info = info = callback;
+ case 'warn':
+ return exports.warn = warn = callback;
+ case 'debug':
+ return exports.debug = debug = callback;
+ case 'deprecate':
+ return exports.deprecate = deprecate = callback;
+ case 'debugSeal':
+ return exports.debugSeal = debugSeal = callback;
+ case 'debugFreeze':
+ return exports.debugFreeze = debugFreeze = callback;
+ case 'runInDebug':
+ return exports.runInDebug = runInDebug = callback;
+ case 'deprecateFunc':
+ return exports.deprecateFunc = deprecateFunc = callback;
+ }
+ };
+
+ exports.getDebugFunction = getDebugFunction = function (type) {
+ switch (type) {
+ case 'assert':
+ return assert;
+ case 'info':
+ return info;
+ case 'warn':
+ return warn;
+ case 'debug':
+ return debug;
+ case 'deprecate':
+ return deprecate;
+ case 'debugSeal':
+ return debugSeal;
+ case 'debugFreeze':
+ return debugFreeze;
+ case 'runInDebug':
+ return runInDebug;
+ case 'deprecateFunc':
+ return deprecateFunc;
+ }
+ };
+ }
+
+ /**
+ @module @ember/debug
+ */
+
+ if (true) {
+ /**
+ Define an assertion that will throw an exception if the condition is not met.
+ * In a production build, this method is defined as an empty function (NOP).
+ Uses of this method in Ember itself are stripped from the ember.prod.js build.
+ ```javascript
+ import { assert } from '@ember/debug';
+ // Test for truthiness
+ assert('Must pass a valid object', obj);
+ // Fail unconditionally
+ assert('This code path should never be run');
+ ```
+ @method assert
+ @static
+ @for @ember/debug
+ @param {String} desc A description of the assertion. This will become
+ the text of the Error thrown if the assertion fails.
+ @param {Boolean} test Must be truthy for the assertion to pass. If
+ falsy, an exception will be thrown.
+ @public
+ @since 1.0.0
+ */
+ setDebugFunction('assert', function assert(desc, test) {
+ if (!test) {
+ throw new _error.default('Assertion Failed: ' + desc);
+ }
+ });
+
+ /**
+ Display a debug notice.
+ * In a production build, this method is defined as an empty function (NOP).
+ Uses of this method in Ember itself are stripped from the ember.prod.js build.
+ ```javascript
+ import { debug } from '@ember/debug';
+ debug('I\'m a debug notice!');
+ ```
+ @method debug
+ @for @ember/debug
+ @static
+ @param {String} message A debug message to display.
+ @public
+ */
+ setDebugFunction('debug', function debug(message) {
+ _emberConsole.default.debug('DEBUG: ' + message);
+ });
+
+ /**
+ Display an info notice.
+ * In a production build, this method is defined as an empty function (NOP).
+ Uses of this method in Ember itself are stripped from the ember.prod.js build.
+ @method info
+ @private
+ */
+ setDebugFunction('info', function info() {
+ _emberConsole.default.info.apply(undefined, arguments);
+ });
+
+ /**
+ @module @ember/application
+ @public
+ */
+
+ /**
+ Alias an old, deprecated method with its new counterpart.
+ Display a deprecation warning with the provided message and a stack trace
+ (Chrome and Firefox only) when the assigned method is called.
+ * In a production build, this method is defined as an empty function (NOP).
+ ```javascript
+ import { deprecateFunc } from '@ember/application/deprecations';
+ Ember.oldMethod = deprecateFunc('Please use the new, updated method', options, Ember.newMethod);
+ ```
+ @method deprecateFunc
+ @static
+ @for @ember/application/deprecations
+ @param {String} message A description of the deprecation.
+ @param {Object} [options] The options object for `deprecate`.
+ @param {Function} func The new function called to replace its deprecated counterpart.
+ @return {Function} A new function that wraps the original function with a deprecation warning
+ @private
+ */
+ setDebugFunction('deprecateFunc', function deprecateFunc() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ if (args.length === 3) {
+ var message = args[0],
+ options = args[1],
+ func = args[2];
+
+ return function () {
+ deprecate(message, false, options);
+ return func.apply(this, arguments);
+ };
+ } else {
+ var _message = args[0],
+ _func = args[1];
+
+ return function () {
+ deprecate(_message);
+ return _func.apply(this, arguments);
+ };
+ }
+ });
+
+ /**
+ @module @ember/debug
+ @public
+ */
+ /**
+ Run a function meant for debugging.
+ * In a production build, this method is defined as an empty function (NOP).
+ Uses of this method in Ember itself are stripped from the ember.prod.js build.
+ ```javascript
+ import Component from '@ember/component';
+ import { runInDebug } from '@ember/debug';
+ runInDebug(() => {
+ Component.reopen({
+ didInsertElement() {
+ console.log("I'm happy");
+ }
+ });
+ });
+ ```
+ @method runInDebug
+ @for @ember/debug
+ @static
+ @param {Function} func The function to be executed.
+ @since 1.5.0
+ @public
+ */
+ setDebugFunction('runInDebug', function runInDebug(func) {
+ func();
+ });
+
+ setDebugFunction('debugSeal', function debugSeal(obj) {
+ Object.seal(obj);
+ });
+
+ setDebugFunction('debugFreeze', function debugFreeze(obj) {
+ Object.freeze(obj);
+ });
+
+ setDebugFunction('deprecate', _deprecate2.default);
+
+ setDebugFunction('warn', _warn2.default);
+ }
+
+ var _warnIfUsingStrippedFeatureFlags = void 0;
+
+ if (true && !(0, _testing.isTesting)()) {
+ /**
+ Will call `warn()` if ENABLE_OPTIONAL_FEATURES or
+ any specific FEATURES flag is truthy.
+ This method is called automatically in debug canary builds.
+ @private
+ @method _warnIfUsingStrippedFeatureFlags
+ @return {void}
+ */
+ exports._warnIfUsingStrippedFeatureFlags = _warnIfUsingStrippedFeatureFlags = function _warnIfUsingStrippedFeatureFlags(FEATURES, knownFeatures, featuresWereStripped) {
+ if (featuresWereStripped) {
+ warn('Ember.ENV.ENABLE_OPTIONAL_FEATURES is only available in canary builds.', !_emberEnvironment.ENV.ENABLE_OPTIONAL_FEATURES, { id: 'ember-debug.feature-flag-with-features-stripped' });
+
+ var keys = Object.keys(FEATURES || {});
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];
+ if (key === 'isEnabled' || !(key in knownFeatures)) {
+ continue;
+ }
+
+ warn('FEATURE["' + key + '"] is set as enabled, but FEATURE flags are only available in canary builds.', !FEATURES[key], { id: 'ember-debug.feature-flag-with-features-stripped' });
+ }
+ }
+ };
+
+ // Complain if they're using FEATURE flags in builds other than canary
+ FEATURES['features-stripped-test'] = true;
+ var featuresWereStripped = true;
+
+ if ((0, _features.default)('features-stripped-test')) {
+ featuresWereStripped = false;
+ }
+
+ delete FEATURES['features-stripped-test'];
+ _warnIfUsingStrippedFeatureFlags(_emberEnvironment.ENV.FEATURES, DEFAULT_FEATURES, featuresWereStripped);
+
+ // Inform the developer about the Ember Inspector if not installed.
+ var isFirefox = _emberEnvironment.environment.isFirefox;
+ var isChrome = _emberEnvironment.environment.isChrome;
+
+ if (typeof window !== 'undefined' && (isFirefox || isChrome) && window.addEventListener) {
+ window.addEventListener('load', function () {
+ if (document.documentElement && document.documentElement.dataset && !document.documentElement.dataset.emberExtension) {
+ var downloadURL = void 0;
+
+ if (isChrome) {
+ downloadURL = 'https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi';
+ } else if (isFirefox) {
+ downloadURL = 'https://addons.mozilla.org/en-US/firefox/addon/ember-inspector/';
+ }
+
+ debug('For more advanced debugging, install the Ember Inspector from ' + downloadURL);
+ }
+ }, false);
+ }
+ }
+
+ exports.assert = assert;
+ exports.info = info;
+ exports.warn = warn;
+ exports.debug = debug;
+ exports.deprecate = deprecate;
+ exports.debugSeal = debugSeal;
+ exports.debugFreeze = debugFreeze;
+ exports.runInDebug = runInDebug;
+ exports.deprecateFunc = deprecateFunc;
+ exports.setDebugFunction = setDebugFunction;
+ exports.getDebugFunction = getDebugFunction;
+ exports._warnIfUsingStrippedFeatureFlags = _warnIfUsingStrippedFeatureFlags;
+});
+enifed("ember-debug/testing", ["exports"], function (exports) {
+ "use strict";
+
+ exports.isTesting = isTesting;
+ exports.setTesting = setTesting;
+ var testing = false;
+
+ function isTesting() {
+ return testing;
+ }
+
+ function setTesting(value) {
+ testing = !!value;
+ }
+});
+enifed('ember-debug/warn', ['exports', 'ember-environment', 'ember-console', 'ember-debug/deprecate', 'ember-debug/index', 'ember-debug/handlers'], function (exports, _emberEnvironment, _emberConsole, _deprecate, _index, _handlers) {
+ 'use strict';
+
+ exports.missingOptionsDeprecation = exports.missingOptionsIdDeprecation = exports.registerHandler = undefined;
+
+
+ var registerHandler = function () {};
+ var warn = function () {};
+ var missingOptionsDeprecation = void 0,
+ missingOptionsIdDeprecation = void 0;
+
+ /**
+ @module @ember/debug
+ */
+
+ if (true) {
+ /**
+ Allows for runtime registration of handler functions that override the default warning behavior.
+ Warnings are invoked by calls made to [@ember/debug/warn](https://emberjs.com/api/ember/release/classes/@ember%2Fdebug/methods/warn?anchor=warn).
+ The following example demonstrates its usage by registering a handler that does nothing overriding Ember's
+ default warning behavior.
+ ```javascript
+ import { registerWarnHandler } from '@ember/debug';
+ // next is not called, so no warnings get the default behavior
+ registerWarnHandler(() => {});
+ ```
+ The handler function takes the following arguments:
+ <ul>
+ <li> <code>message</code> - The message received from the warn call. </li>
+ <li> <code>options</code> - An object passed in with the warn call containing additional information including:</li>
+ <ul>
+ <li> <code>id</code> - An id of the warning in the form of <code>package-name.specific-warning</code>.</li>
+ </ul>
+ <li> <code>next</code> - A function that calls into the previously registered handler.</li>
+ </ul>
+ @public
+ @static
+ @method registerWarnHandler
+ @for @ember/debug
+ @param handler {Function} A function to handle warnings.
+ @since 2.1.0
+ */
+ exports.registerHandler = registerHandler = function registerHandler(handler) {
+ (0, _handlers.registerHandler)('warn', handler);
+ };
+
+ registerHandler(function logWarning(message) {
+ _emberConsole.default.warn('WARNING: ' + message);
+ if ('trace' in _emberConsole.default) {
+ _emberConsole.default.trace();
+ }
+ });
+
+ exports.missingOptionsDeprecation = missingOptionsDeprecation = 'When calling `warn` you ' + 'must provide an `options` hash as the third parameter. ' + '`options` should include an `id` property.';
+ exports.missingOptionsIdDeprecation = missingOptionsIdDeprecation = 'When calling `warn` you must provide `id` in options.';
+
+ /**
+ Display a warning with the provided message.
+ * In a production build, this method is defined as an empty function (NOP).
+ Uses of this method in Ember itself are stripped from the ember.prod.js build.
+ @method warn
+ @for @ember/debug
+ @static
+ @param {String} message A warning to display.
+ @param {Boolean} test An optional boolean. If falsy, the warning
+ will be displayed.
+ @param {Object} options An object that can be used to pass a unique
+ `id` for this warning. The `id` can be used by Ember debugging tools
+ to change the behavior (raise, log, or silence) for that specific warning.
+ The `id` should be namespaced by dots, e.g. "ember-debug.feature-flag-with-features-stripped"
+ @public
+ @since 1.0.0
+ */
+ warn = function warn(message, test, options) {
+ if (arguments.length === 2 && typeof test === 'object') {
+ options = test;
+ test = false;
+ }
+
+ if (_emberEnvironment.ENV._ENABLE_WARN_OPTIONS_SUPPORT !== true) {
+ (0, _index.assert)(missingOptionsDeprecation, options);
+ (0, _index.assert)(missingOptionsIdDeprecation, options && options.id);
+ }
+
+ if (!options && _emberEnvironment.ENV._ENABLE_WARN_OPTIONS_SUPPORT === true) {
+ (0, _deprecate.default)(missingOptionsDeprecation, false, {
+ id: 'ember-debug.warn-options-missing',
+ until: '3.0.0',
+ url: 'https://emberjs.com/deprecations/v2.x/#toc_ember-debug-function-options'
+ });
+ }
+
+ if (options && !options.id && _emberEnvironment.ENV._ENABLE_WARN_OPTIONS_SUPPORT === true) {
+ (0, _deprecate.default)(missingOptionsIdDeprecation, false, {
+ id: 'ember-debug.warn-id-missing',
+ until: '3.0.0',
+ url: 'https://emberjs.com/deprecations/v2.x/#toc_ember-debug-function-options'
+ });
+ }
+
+ (0, _handlers.invoke)('warn', message, test, options);
+ };
+ }
+
+ exports.default = warn;
+ exports.registerHandler = registerHandler;
+ exports.missingOptionsIdDeprecation = missingOptionsIdDeprecation;
+ exports.missingOptionsDeprecation = missingOptionsDeprecation;
+});
+enifed('ember-environment', ['exports'], function (exports) {
+ 'use strict';
+
+ /* globals global, window, self, mainContext */
+
+ // from lodash to catch fake globals
+ function checkGlobal(value) {
+ return value && value.Object === Object ? value : undefined;
+ }
+
+ // element ids can ruin global miss checks
+ function checkElementIdShadowing(value) {
+ return value && value.nodeType === undefined ? value : undefined;
+ }
+
+ // export real global
+ var global$1 = checkGlobal(checkElementIdShadowing(typeof global === 'object' && global)) || checkGlobal(typeof self === 'object' && self) || checkGlobal(typeof window === 'object' && window) || mainContext || // set before strict mode in Ember loader/wrapper
+ new Function('return this')(); // eval outside of strict mode
+
+ function defaultTrue(v) {
+ return v === false ? false : true;
+ }
+
+ function defaultFalse(v) {
+ return v === true ? true : false;
+ }
+
+ function normalizeExtendPrototypes(obj) {
+ if (obj === false) {
+ return { String: false, Array: false, Function: false };
+ } else if (!obj || obj === true) {
+ return { String: true, Array: true, Function: true };
+ } else {
+ return {
+ String: defaultTrue(obj.String),
+ Array: defaultTrue(obj.Array),
+ Function: defaultTrue(obj.Function)
+ };
+ }
+ }
+
+ /* globals module */
+ /**
+ The hash of environment variables used to control various configuration
+ settings. To specify your own or override default settings, add the
+ desired properties to a global hash named `EmberENV` (or `ENV` for
+ backwards compatibility with earlier versions of Ember). The `EmberENV`
+ hash must be created before loading Ember.
+
+ @class EmberENV
+ @type Object
+ @public
+ */
+ var ENV = typeof global$1.EmberENV === 'object' && global$1.EmberENV || typeof global$1.ENV === 'object' && global$1.ENV || {};
+
+ // ENABLE_ALL_FEATURES was documented, but you can't actually enable non optional features.
+ if (ENV.ENABLE_ALL_FEATURES) {
+ ENV.ENABLE_OPTIONAL_FEATURES = true;
+ }
+
+ /**
+ Determines whether Ember should add to `Array`, `Function`, and `String`
+ native object prototypes, a few extra methods in order to provide a more
+ friendly API.
+
+ We generally recommend leaving this option set to true however, if you need
+ to turn it off, you can add the configuration property
+ `EXTEND_PROTOTYPES` to `EmberENV` and set it to `false`.
+
+ Note, when disabled (the default configuration for Ember Addons), you will
+ instead have to access all methods and functions from the Ember
+ namespace.
+
+ @property EXTEND_PROTOTYPES
+ @type Boolean
+ @default true
+ @for EmberENV
+ @public
+ */
+ ENV.EXTEND_PROTOTYPES = normalizeExtendPrototypes(ENV.EXTEND_PROTOTYPES);
+
+ /**
+ The `LOG_STACKTRACE_ON_DEPRECATION` property, when true, tells Ember to log
+ a full stack trace during deprecation warnings.
+
+ @property LOG_STACKTRACE_ON_DEPRECATION
+ @type Boolean
+ @default true
+ @for EmberENV
+ @public
+ */
+ ENV.LOG_STACKTRACE_ON_DEPRECATION = defaultTrue(ENV.LOG_STACKTRACE_ON_DEPRECATION);
+
+ /**
+ The `LOG_VERSION` property, when true, tells Ember to log versions of all
+ dependent libraries in use.
+
+ @property LOG_VERSION
+ @type Boolean
+ @default true
+ @for EmberENV
+ @public
+ */
+ ENV.LOG_VERSION = defaultTrue(ENV.LOG_VERSION);
+
+ /**
+ Debug parameter you can turn on. This will log all bindings that fire to
+ the console. This should be disabled in production code. Note that you
+ can also enable this from the console or temporarily.
+
+ @property LOG_BINDINGS
+ @for EmberENV
+ @type Boolean
+ @default false
+ @public
+ */
+ ENV.LOG_BINDINGS = defaultFalse(ENV.LOG_BINDINGS);
+
+ ENV.RAISE_ON_DEPRECATION = defaultFalse(ENV.RAISE_ON_DEPRECATION);
+
+ // check if window exists and actually is the global
+ var hasDOM = typeof window !== 'undefined' && window === global$1 && window.document && window.document.createElement && !ENV.disableBrowserEnvironment; // is this a public thing?
+
+ // legacy imports/exports/lookup stuff (should we keep this??)
+ var originalContext = global$1.Ember || {};
+
+ var context = {
+ // import jQuery
+ imports: originalContext.imports || global$1,
+ // export Ember
+ exports: originalContext.exports || global$1,
+ // search for Namespaces
+ lookup: originalContext.lookup || global$1
+ };
+
+ // TODO: cleanup single source of truth issues with this stuff
+ var environment = hasDOM ? {
+ hasDOM: true,
+ isChrome: !!window.chrome && !window.opera,
+ isFirefox: typeof InstallTrigger !== 'undefined',
+ location: window.location,
+ history: window.history,
+ userAgent: window.navigator.userAgent,
+ window: window
+ } : {
+ hasDOM: false,
+ isChrome: false,
+ isFirefox: false,
+ location: null,
+ history: null,
+ userAgent: 'Lynx (textmode)',
+ window: null
+ };
+
+ exports.ENV = ENV;
+ exports.context = context;
+ exports.environment = environment;
+});
+enifed('ember-extension-support/container_debug_adapter', ['exports', 'ember-metal', 'ember-runtime'], function (exports, _emberMetal, _emberRuntime) {
+ 'use strict';
+
+ exports.default = _emberRuntime.Object.extend({
+ /**
+ The resolver instance of the application
+ being debugged. This property will be injected
+ on creation.
+ @property resolver
+ @default null
+ @public
+ */
+ resolver: null,
+
+ /**
+ Returns true if it is possible to catalog a list of available
+ classes in the resolver for a given type.
+ @method canCatalogEntriesByType
+ @param {String} type The type. e.g. "model", "controller", "route".
+ @return {boolean} whether a list is available for this type.
+ @public
+ */
+ canCatalogEntriesByType: function (type) {
+ if (type === 'model' || type === 'template') {
+ return false;
+ }
+
+ return true;
+ },
+
+
+ /**
+ Returns the available classes a given type.
+ @method catalogEntriesByType
+ @param {String} type The type. e.g. "model", "controller", "route".
+ @return {Array} An array of strings.
+ @public
+ */
+ catalogEntriesByType: function (type) {
+ var namespaces = (0, _emberRuntime.A)(_emberRuntime.Namespace.NAMESPACES);
+ var types = (0, _emberRuntime.A)();
+ var typeSuffixRegex = new RegExp(_emberRuntime.String.classify(type) + '$');
+
+ namespaces.forEach(function (namespace) {
+ if (namespace !== _emberMetal.default) {
+ for (var key in namespace) {
+ if (!namespace.hasOwnProperty(key)) {
+ continue;
+ }
+ if (typeSuffixRegex.test(key)) {
+ var klass = namespace[key];
+ if ((0, _emberRuntime.typeOf)(klass) === 'class') {
+ types.push(_emberRuntime.String.dasherize(key.replace(typeSuffixRegex, '')));
+ }
+ }
+ }
+ }
+ });
+ return types;
+ }
+ });
+});
+enifed('ember-extension-support/data_adapter', ['exports', 'ember-utils', 'ember-metal', 'ember-runtime'], function (exports, _emberUtils, _emberMetal, _emberRuntime) {
+ 'use strict';
+
+ exports.default = _emberRuntime.Object.extend({
+ init: function () {
+ this._super.apply(this, arguments);
+ this.releaseMethods = (0, _emberRuntime.A)();
+ },
+
+
+ /**
+ The container-debug-adapter which is used
+ to list all models.
+ @property containerDebugAdapter
+ @default undefined
+ @since 1.5.0
+ @public
+ **/
+ containerDebugAdapter: undefined,
+
+ /**
+ The number of attributes to send
+ as columns. (Enough to make the record
+ identifiable).
+ @private
+ @property attributeLimit
+ @default 3
+ @since 1.3.0
+ */
+ attributeLimit: 3,
+
+ /**
+ Ember Data > v1.0.0-beta.18
+ requires string model names to be passed
+ around instead of the actual factories.
+ This is a stamp for the Ember Inspector
+ to differentiate between the versions
+ to be able to support older versions too.
+ @public
+ @property acceptsModelName
+ */
+ acceptsModelName: true,
+
+ /**
+ Stores all methods that clear observers.
+ These methods will be called on destruction.
+ @private
+ @property releaseMethods
+ @since 1.3.0
+ */
+ releaseMethods: (0, _emberRuntime.A)(),
+
+ /**
+ Specifies how records can be filtered.
+ Records returned will need to have a `filterValues`
+ property with a key for every name in the returned array.
+ @public
+ @method getFilters
+ @return {Array} List of objects defining filters.
+ The object should have a `name` and `desc` property.
+ */
+ getFilters: function () {
+ return (0, _emberRuntime.A)();
+ },
+
+
+ /**
+ Fetch the model types and observe them for changes.
+ @public
+ @method watchModelTypes
+ @param {Function} typesAdded Callback to call to add types.
+ Takes an array of objects containing wrapped types (returned from `wrapModelType`).
+ @param {Function} typesUpdated Callback to call when a type has changed.
+ Takes an array of objects containing wrapped types.
+ @return {Function} Method to call to remove all observers
+ */
+ watchModelTypes: function (typesAdded, typesUpdated) {
+ var _this = this;
+
+ var modelTypes = this.getModelTypes();
+ var releaseMethods = (0, _emberRuntime.A)();
+ var typesToSend = void 0;
+
+ typesToSend = modelTypes.map(function (type) {
+ var klass = type.klass;
+ var wrapped = _this.wrapModelType(klass, type.name);
+ releaseMethods.push(_this.observeModelType(type.name, typesUpdated));
+ return wrapped;
+ });
+
+ typesAdded(typesToSend);
+
+ var release = function () {
+ releaseMethods.forEach(function (fn) {
+ return fn();
+ });
+ _this.releaseMethods.removeObject(release);
+ };
+ this.releaseMethods.pushObject(release);
+ return release;
+ },
+ _nameToClass: function (type) {
+ if (typeof type === 'string') {
+ var owner = (0, _emberUtils.getOwner)(this);
+ var Factory = owner.factoryFor('model:' + type);
+ type = Factory && Factory.class;
+ }
+ return type;
+ },
+
+
+ /**
+ Fetch the records of a given type and observe them for changes.
+ @public
+ @method watchRecords
+ @param {String} modelName The model name.
+ @param {Function} recordsAdded Callback to call to add records.
+ Takes an array of objects containing wrapped records.
+ The object should have the following properties:
+ columnValues: {Object} The key and value of a table cell.
+ object: {Object} The actual record object.
+ @param {Function} recordsUpdated Callback to call when a record has changed.
+ Takes an array of objects containing wrapped records.
+ @param {Function} recordsRemoved Callback to call when a record has removed.
+ Takes the following parameters:
+ index: The array index where the records were removed.
+ count: The number of records removed.
+ @return {Function} Method to call to remove all observers.
+ */
+ watchRecords: function (modelName, recordsAdded, recordsUpdated, recordsRemoved) {
+ var _this2 = this;
+
+ var releaseMethods = (0, _emberRuntime.A)();
+ var klass = this._nameToClass(modelName);
+ var records = this.getRecords(klass, modelName);
+ var release = void 0;
+
+ function recordUpdated(updatedRecord) {
+ recordsUpdated([updatedRecord]);
+ }
+
+ var recordsToSend = records.map(function (record) {
+ releaseMethods.push(_this2.observeRecord(record, recordUpdated));
+ return _this2.wrapRecord(record);
+ });
+
+ var contentDidChange = function (array, idx, removedCount, addedCount) {
+ for (var i = idx; i < idx + addedCount; i++) {
+ var record = (0, _emberRuntime.objectAt)(array, i);
+ var wrapped = _this2.wrapRecord(record);
+ releaseMethods.push(_this2.observeRecord(record, recordUpdated));
+ recordsAdded([wrapped]);
+ }
+
+ if (removedCount) {
+ recordsRemoved(idx, removedCount);
+ }
+ };
+
+ var observer = { didChange: contentDidChange, willChange: function () {
+ return this;
+ }
+ };
+ (0, _emberRuntime.addArrayObserver)(records, this, observer);
+
+ release = function () {
+ releaseMethods.forEach(function (fn) {
+ return fn();
+ });
+ (0, _emberRuntime.removeArrayObserver)(records, _this2, observer);
+ _this2.releaseMethods.removeObject(release);
+ };
+
+ recordsAdded(recordsToSend);
+
+ this.releaseMethods.pushObject(release);
+ return release;
+ },
+
+
+ /**
+ Clear all observers before destruction
+ @private
+ @method willDestroy
+ */
+ willDestroy: function () {
+ this._super.apply(this, arguments);
+ this.releaseMethods.forEach(function (fn) {
+ return fn();
+ });
+ },
+
+
+ /**
+ Detect whether a class is a model.
+ Test that against the model class
+ of your persistence library.
+ @private
+ @method detect
+ @return boolean Whether the class is a model class or not.
+ */
+ detect: function () {
+ return false;
+ },
+
+
+ /**
+ Get the columns for a given model type.
+ @private
+ @method columnsForType
+ @return {Array} An array of columns of the following format:
+ name: {String} The name of the column.
+ desc: {String} Humanized description (what would show in a table column name).
+ */
+ columnsForType: function () {
+ return (0, _emberRuntime.A)();
+ },
+
+
+ /**
+ Adds observers to a model type class.
+ @private
+ @method observeModelType
+ @param {String} modelName The model type name.
+ @param {Function} typesUpdated Called when a type is modified.
+ @return {Function} The function to call to remove observers.
+ */
+
+ observeModelType: function (modelName, typesUpdated) {
+ var _this3 = this;
+
+ var klass = this._nameToClass(modelName);
+ var records = this.getRecords(klass, modelName);
+
+ function onChange() {
+ typesUpdated([this.wrapModelType(klass, modelName)]);
+ }
+
+ var observer = {
+ didChange: function (array, idx, removedCount, addedCount) {
+ // Only re-fetch records if the record count changed
+ // (which is all we care about as far as model types are concerned).
+ if (removedCount > 0 || addedCount > 0) {
+ _emberMetal.run.scheduleOnce('actions', this, onChange);
+ }
+ },
+ willChange: function () {
+ return this;
+ }
+ };
+
+ (0, _emberRuntime.addArrayObserver)(records, this, observer);
+
+ var release = function () {
+ return (0, _emberRuntime.removeArrayObserver)(records, _this3, observer);
+ };
+
+ return release;
+ },
+
+
+ /**
+ Wraps a given model type and observes changes to it.
+ @private
+ @method wrapModelType
+ @param {Class} klass A model class.
+ @param {String} modelName Name of the class.
+ @return {Object} Contains the wrapped type and the function to remove observers
+ Format:
+ type: {Object} The wrapped type.
+ The wrapped type has the following format:
+ name: {String} The name of the type.
+ count: {Integer} The number of records available.
+ columns: {Columns} An array of columns to describe the record.
+ object: {Class} The actual Model type class.
+ release: {Function} The function to remove observers.
+ */
+ wrapModelType: function (klass, name) {
+ var records = this.getRecords(klass, name);
+ var typeToSend = void 0;
+
+ typeToSend = {
+ name: name,
+ count: (0, _emberMetal.get)(records, 'length'),
+ columns: this.columnsForType(klass),
+ object: klass
+ };
+
+ return typeToSend;
+ },
+
+
+ /**
+ Fetches all models defined in the application.
+ @private
+ @method getModelTypes
+ @return {Array} Array of model types.
+ */
+ getModelTypes: function () {
+ var _this4 = this;
+
+ var containerDebugAdapter = this.get('containerDebugAdapter');
+ var types = void 0;
+
+ if (containerDebugAdapter.canCatalogEntriesByType('model')) {
+ types = containerDebugAdapter.catalogEntriesByType('model');
+ } else {
+ types = this._getObjectsOnNamespaces();
+ }
+
+ // New adapters return strings instead of classes.
+ types = (0, _emberRuntime.A)(types).map(function (name) {
+ return {
+ klass: _this4._nameToClass(name),
+ name: name
+ };
+ });
+ types = (0, _emberRuntime.A)(types).filter(function (type) {
+ return _this4.detect(type.klass);
+ });
+
+ return (0, _emberRuntime.A)(types);
+ },
+
+
+ /**
+ Loops over all namespaces and all objects
+ attached to them.
+ @private
+ @method _getObjectsOnNamespaces
+ @return {Array} Array of model type strings.
+ */
+ _getObjectsOnNamespaces: function () {
+ var _this5 = this;
+
+ var namespaces = (0, _emberRuntime.A)(_emberRuntime.Namespace.NAMESPACES);
+ var types = (0, _emberRuntime.A)();
+
+ namespaces.forEach(function (namespace) {
+ for (var key in namespace) {
+ if (!namespace.hasOwnProperty(key)) {
+ continue;
+ }
+ // Even though we will filter again in `getModelTypes`,
+ // we should not call `lookupFactory` on non-models
+ if (!_this5.detect(namespace[key])) {
+ continue;
+ }
+ var name = _emberRuntime.String.dasherize(key);
+ types.push(name);
+ }
+ });
+ return types;
+ },
+
+
+ /**
+ Fetches all loaded records for a given type.
+ @private
+ @method getRecords
+ @return {Array} An array of records.
+ This array will be observed for changes,
+ so it should update when new records are added/removed.
+ */
+ getRecords: function () {
+ return (0, _emberRuntime.A)();
+ },
+
+
+ /**
+ Wraps a record and observers changes to it.
+ @private
+ @method wrapRecord
+ @param {Object} record The record instance.
+ @return {Object} The wrapped record. Format:
+ columnValues: {Array}
+ searchKeywords: {Array}
+ */
+ wrapRecord: function (record) {
+ var recordToSend = { object: record };
+
+ recordToSend.columnValues = this.getRecordColumnValues(record);
+ recordToSend.searchKeywords = this.getRecordKeywords(record);
+ recordToSend.filterValues = this.getRecordFilterValues(record);
+ recordToSend.color = this.getRecordColor(record);
+
+ return recordToSend;
+ },
+
+
+ /**
+ Gets the values for each column.
+ @private
+ @method getRecordColumnValues
+ @return {Object} Keys should match column names defined
+ by the model type.
+ */
+ getRecordColumnValues: function () {
+ return {};
+ },
+
+
+ /**
+ Returns keywords to match when searching records.
+ @private
+ @method getRecordKeywords
+ @return {Array} Relevant keywords for search.
+ */
+ getRecordKeywords: function () {
+ return (0, _emberRuntime.A)();
+ },
+
+
+ /**
+ Returns the values of filters defined by `getFilters`.
+ @private
+ @method getRecordFilterValues
+ @param {Object} record The record instance.
+ @return {Object} The filter values.
+ */
+ getRecordFilterValues: function () {
+ return {};
+ },
+
+
+ /**
+ Each record can have a color that represents its state.
+ @private
+ @method getRecordColor
+ @param {Object} record The record instance
+ @return {String} The records color.
+ Possible options: black, red, blue, green.
+ */
+ getRecordColor: function () {
+ return null;
+ },
+
+
+ /**
+ Observes all relevant properties and re-sends the wrapped record
+ when a change occurs.
+ @private
+ @method observerRecord
+ @return {Function} The function to call to remove all observers.
+ */
+ observeRecord: function () {
+ return function () {};
+ }
+ });
+});
+enifed('ember-extension-support/index', ['exports', 'ember-extension-support/data_adapter', 'ember-extension-support/container_debug_adapter'], function (exports, _data_adapter, _container_debug_adapter) {
+ 'use strict';
+
+ Object.defineProperty(exports, 'DataAdapter', {
+ enumerable: true,
+ get: function () {
+ return _data_adapter.default;
+ }
+ });
+ Object.defineProperty(exports, 'ContainerDebugAdapter', {
+ enumerable: true,
+ get: function () {
+ return _container_debug_adapter.default;
+ }
+ });
+});
+enifed('ember-glimmer/component-managers/abstract', ['exports', 'ember-babel'], function (exports, _emberBabel) {
+ 'use strict';
+
+ var AbstractManager = function () {
+ function AbstractManager() {
+ (0, _emberBabel.classCallCheck)(this, AbstractManager);
+
+ this.debugStack = undefined;
+ }
+
+ AbstractManager.prototype.prepareArgs = function prepareArgs(_definition, _args) {
+ return null;
+ };
+
+ AbstractManager.prototype.didCreateElement = function didCreateElement(_component, _element, _operations) {}
+ // noop
+
+ // inheritors should also call `this.debugStack.pop()` to
+ // ensure the rerendering assertion messages are properly
+ // maintained
+ ;
+
+ AbstractManager.prototype.didRenderLayout = function didRenderLayout(_component, _bounds) {
+ // noop
+ };
+
+ AbstractManager.prototype.didCreate = function didCreate(_bucket) {
+ // noop
+ };
+
+ AbstractManager.prototype.getTag = function getTag(_bucket) {
+ return null;
+ };
+
+ AbstractManager.prototype.update = function update(_bucket, _dynamicScope) {}
+ // noop
+
+ // inheritors should also call `this.debugStack.pop()` to
+ // ensure the rerendering assertion messages are properly
+ // maintained
+ ;
+
+ AbstractManager.prototype.didUpdateLayout = function didUpdateLayout(_bucket, _bounds) {
+ // noop
+ };
+
+ AbstractManager.prototype.didUpdate = function didUpdate(_bucket) {
+ // noop
+ };
+
+ return AbstractManager;
+ }();
+
+ exports.default = AbstractManager;
+
+ if (true) {
+ AbstractManager.prototype._pushToDebugStack = function (name, environment) {
+ this.debugStack = environment.debugStack;
+ this.debugStack.push(name);
+ };
+ AbstractManager.prototype._pushEngineToDebugStack = function (name, environment) {
+ this.debugStack = environment.debugStack;
+ this.debugStack.pushEngine(name);
+ };
+ }
+});
+enifed('ember-glimmer/component-managers/curly', ['exports', 'ember-babel', '@glimmer/reference', '@glimmer/runtime', 'container', 'ember-debug', 'ember-metal', 'ember-utils', 'ember-views', 'ember-glimmer/component', 'ember-glimmer/utils/bindings', 'ember-glimmer/utils/curly-component-state-bucket', 'ember-glimmer/utils/process-args', 'ember-glimmer/utils/references', 'ember-glimmer/component-managers/abstract'], function (exports, _emberBabel, _reference, _runtime, _container, _emberDebug, _emberMetal, _emberUtils, _emberViews, _component, _bindings, _curlyComponentStateBucket, _processArgs, _references, _abstract) {
+ 'use strict';
+
+ exports.CurlyComponentDefinition = exports.PositionalArgumentReference = undefined;
+ exports.validatePositionalParameters = validatePositionalParameters;
+ exports.processComponentInitializationAssertions = processComponentInitializationAssertions;
+ exports.initialRenderInstrumentDetails = initialRenderInstrumentDetails;
+ exports.rerenderInstrumentDetails = rerenderInstrumentDetails;
+
+ var _templateObject = (0, _emberBabel.taggedTemplateLiteralLoose)(['template:components/-default'], ['template:components/-default']);
+
+ var DEFAULT_LAYOUT = (0, _container.privatize)(_templateObject);
+ function aliasIdToElementId(args, props) {
+ if (args.named.has('id')) {
+ (true && !(!args.named.has('elementId')) && (0, _emberDebug.assert)('You cannot invoke a component with both \'id\' and \'elementId\' at the same time.', !args.named.has('elementId')));
+
+ props.elementId = props.id;
+ }
+ }
+ // We must traverse the attributeBindings in reverse keeping track of
+ // what has already been applied. This is essentially refining the concatenated
+ // properties applying right to left.
+ function applyAttributeBindings(element, attributeBindings, component, operations) {
+ var seen = [];
+ var i = attributeBindings.length - 1;
+ while (i !== -1) {
+ var binding = attributeBindings[i];
+ var parsed = _bindings.AttributeBinding.parse(binding);
+ var attribute = parsed[1];
+ if (seen.indexOf(attribute) === -1) {
+ seen.push(attribute);
+ _bindings.AttributeBinding.install(element, component, parsed, operations);
+ }
+ i--;
+ }
+ if (seen.indexOf('id') === -1) {
+ operations.addStaticAttribute(element, 'id', component.elementId);
+ }
+ if (seen.indexOf('style') === -1) {
+ _bindings.IsVisibleBinding.install(element, component, operations);
+ }
+ }
+ function tagName(vm) {
+ var dynamicScope = vm.dynamicScope();
+ // tslint:disable-next-line:no-shadowed-variable
+ var tagName = dynamicScope.view.tagName;
+
+ return _runtime.PrimitiveReference.create(tagName === '' ? null : tagName || 'div');
+ }
+ function ariaRole(vm) {
+ return vm.getSelf().get('ariaRole');
+ }
+
+ var CurlyComponentLayoutCompiler = function () {
+ function CurlyComponentLayoutCompiler(template) {
+ (0, _emberBabel.classCallCheck)(this, CurlyComponentLayoutCompiler);
+
+ this.template = template;
+ }
+
+ CurlyComponentLayoutCompiler.prototype.compile = function compile(builder) {
+ builder.wrapLayout(this.template);
+ builder.tag.dynamic(tagName);
+ builder.attrs.dynamic('role', ariaRole);
+ builder.attrs.static('class', 'ember-view');
+ };
+
+ return CurlyComponentLayoutCompiler;
+ }();
+
+ CurlyComponentLayoutCompiler.id = 'curly';
+
+ var PositionalArgumentReference = exports.PositionalArgumentReference = function () {
+ function PositionalArgumentReference(references) {
+ (0, _emberBabel.classCallCheck)(this, PositionalArgumentReference);
+
+ this.tag = (0, _reference.combineTagged)(references);
+ this._references = references;
+ }
+
+ PositionalArgumentReference.prototype.value = function value() {
+ return this._references.map(function (reference) {
+ return reference.value();
+ });
+ };
+
+ PositionalArgumentReference.prototype.get = function get(key) {
+ return _references.PropertyReference.create(this, key);
+ };
+
+ return PositionalArgumentReference;
+ }();
+
+ var CurlyComponentManager = function (_AbstractManager) {
+ (0, _emberBabel.inherits)(CurlyComponentManager, _AbstractManager);
+
+ function CurlyComponentManager() {
+ (0, _emberBabel.classCallCheck)(this, CurlyComponentManager);
+ return (0, _emberBabel.possibleConstructorReturn)(this, _AbstractManager.apply(this, arguments));
+ }
+
+ CurlyComponentManager.prototype.prepareArgs = function prepareArgs(definition, args) {
+ var componentPositionalParamsDefinition = definition.ComponentClass.class.positionalParams;
+ if (true && componentPositionalParamsDefinition) {
+ validatePositionalParameters(args.named, args.positional, componentPositionalParamsDefinition);
+ }
+ var componentHasRestStylePositionalParams = typeof componentPositionalParamsDefinition === 'string';
+ var componentHasPositionalParams = componentHasRestStylePositionalParams || componentPositionalParamsDefinition.length > 0;
+ var needsPositionalParamMunging = componentHasPositionalParams && args.positional.length !== 0;
+ var isClosureComponent = definition.args;
+ if (!needsPositionalParamMunging && !isClosureComponent) {
+ return null;
+ }
+ var capturedArgs = args.capture();
+ // grab raw positional references array
+ var positional = capturedArgs.positional.references;
+ // handle prep for closure component with positional params
+ var curriedNamed = void 0;
+ if (definition.args) {
+ var remainingDefinitionPositionals = definition.args.positional.slice(positional.length);
+ positional = positional.concat(remainingDefinitionPositionals);
+ curriedNamed = definition.args.named;
+ }
+ // handle positionalParams
+ var positionalParamsToNamed = void 0;
+ if (componentHasRestStylePositionalParams) {
+ var _positionalParamsToNa;
+
+ positionalParamsToNamed = (_positionalParamsToNa = {}, _positionalParamsToNa[componentPositionalParamsDefinition] = new PositionalArgumentReference(positional), _positionalParamsToNa);
+ positional = [];
+ } else if (componentHasPositionalParams) {
+ positionalParamsToNamed = {};
+ var length = Math.min(positional.length, componentPositionalParamsDefinition.length);
+ for (var i = 0; i < length; i++) {
+ var name = componentPositionalParamsDefinition[i];
+ positionalParamsToNamed[name] = positional[i];
+ }
+ }
+ var named = (0, _emberUtils.assign)({}, curriedNamed, positionalParamsToNamed, capturedArgs.named.map);
+ return { positional: positional, named: named };
+ };
+
+ CurlyComponentManager.prototype.create = function create(environment, definition, args, dynamicScope, callerSelfRef, hasBlock) {
+ if (true) {
+ this._pushToDebugStack('component:' + definition.name, environment);
+ }
+ var parentView = dynamicScope.view;
+ var factory = definition.ComponentClass;
+ var capturedArgs = args.named.capture();
+ var props = (0, _processArgs.processComponentArgs)(capturedArgs);
+ aliasIdToElementId(args, props);
+ props.parentView = parentView;
+ props[_component.HAS_BLOCK] = hasBlock;
+ props._targetObject = callerSelfRef.value();
+ var component = factory.create(props);
+ var finalizer = (0, _emberMetal._instrumentStart)('render.component', initialRenderInstrumentDetails, component);
+ dynamicScope.view = component;
+ if (parentView !== null && parentView !== undefined) {
+ parentView.appendChild(component);
+ }
+ // We usually do this in the `didCreateElement`, but that hook doesn't fire for tagless components
+ if (component.tagName === '') {
+ if (environment.isInteractive) {
+ component.trigger('willRender');
+ }
+ component._transitionTo('hasElement');
+ if (environment.isInteractive) {
+ component.trigger('willInsertElement');
+ }
+ }
+ var bucket = new _curlyComponentStateBucket.default(environment, component, capturedArgs, finalizer);
+ if (args.named.has('class')) {
+ bucket.classRef = args.named.get('class');
+ }
+ if (true) {
+ processComponentInitializationAssertions(component, props);
+ }
+ if (environment.isInteractive && component.tagName !== '') {
+ component.trigger('willRender');
+ }
+ return bucket;
+ };
+
+ CurlyComponentManager.prototype.layoutFor = function layoutFor(definition, bucket, env) {
+ var template = definition.template;
+ if (!template) {
+ template = this.templateFor(bucket.component, env);
+ }
+ return env.getCompiledBlock(CurlyComponentLayoutCompiler, template);
+ };
+
+ CurlyComponentManager.prototype.templateFor = function templateFor(component, env) {
+ var Template = (0, _emberMetal.get)(component, 'layout');
+ var owner = component[_emberUtils.OWNER];
+ if (Template) {
+ return env.getTemplate(Template, owner);
+ }
+ var layoutName = (0, _emberMetal.get)(component, 'layoutName');
+ if (layoutName) {
+ var template = owner.lookup('template:' + layoutName);
+ if (template) {
+ return template;
+ }
+ }
+ return owner.lookup(DEFAULT_LAYOUT);
+ };
+
+ CurlyComponentManager.prototype.getSelf = function getSelf(_ref) {
+ var component = _ref.component;
+
+ return component[_component.ROOT_REF];
+ };
+
+ CurlyComponentManager.prototype.didCreateElement = function didCreateElement(_ref2, element, operations) {
+ var component = _ref2.component,
+ classRef = _ref2.classRef,
+ environment = _ref2.environment;
+
+ (0, _emberViews.setViewElement)(component, element);
+ var attributeBindings = component.attributeBindings,
+ classNames = component.classNames,
+ classNameBindings = component.classNameBindings;
+
+ if (attributeBindings && attributeBindings.length) {
+ applyAttributeBindings(element, attributeBindings, component, operations);
+ } else {
+ operations.addStaticAttribute(element, 'id', component.elementId);
+ _bindings.IsVisibleBinding.install(element, component, operations);
+ }
+ if (classRef) {
+ // TODO should make addDynamicAttribute accept an opaque
+ operations.addDynamicAttribute(element, 'class', classRef, false);
+ }
+ if (classNames && classNames.length) {
+ classNames.forEach(function (name) {
+ operations.addStaticAttribute(element, 'class', name);
+ });
+ }
+ if (classNameBindings && classNameBindings.length) {
+ classNameBindings.forEach(function (binding) {
+ _bindings.ClassNameBinding.install(element, component, binding, operations);
+ });
+ }
+ component._transitionTo('hasElement');
+ if (environment.isInteractive) {
+ component.trigger('willInsertElement');
+ }
+ };
+
+ CurlyComponentManager.prototype.didRenderLayout = function didRenderLayout(bucket, bounds) {
+ bucket.component[_component.BOUNDS] = bounds;
+ bucket.finalize();
+ if (true) {
+ this.debugStack.pop();
+ }
+ };
+
+ CurlyComponentManager.prototype.getTag = function getTag(_ref3) {
+ var component = _ref3.component;
+
+ return component[_component.DIRTY_TAG];
+ };
+
+ CurlyComponentManager.prototype.didCreate = function didCreate(_ref4) {
+ var component = _ref4.component,
+ environment = _ref4.environment;
+
+ if (environment.isInteractive) {
+ component._transitionTo('inDOM');
+ component.trigger('didInsertElement');
+ component.trigger('didRender');
+ }
+ };
+
+ CurlyComponentManager.prototype.update = function update(bucket) {
+ var component = bucket.component,
+ args = bucket.args,
+ argsRevision = bucket.argsRevision,
+ environment = bucket.environment;
+
+ if (true) {
+ this._pushToDebugStack(component._debugContainerKey, environment);
+ }
+ bucket.finalizer = (0, _emberMetal._instrumentStart)('render.component', rerenderInstrumentDetails, component);
+ if (!args.tag.validate(argsRevision)) {
+ var props = (0, _processArgs.processComponentArgs)(args);
+ bucket.argsRevision = args.tag.value();
+ component[_component.IS_DISPATCHING_ATTRS] = true;
+ component.setProperties(props);
+ component[_component.IS_DISPATCHING_ATTRS] = false;
+ component.trigger('didUpdateAttrs');
+ component.trigger('didReceiveAttrs');
+ }
+ if (environment.isInteractive) {
+ component.trigger('willUpdate');
+ component.trigger('willRender');
+ }
+ };
+
+ CurlyComponentManager.prototype.didUpdateLayout = function didUpdateLayout(bucket) {
+ bucket.finalize();
+ if (true) {
+ this.debugStack.pop();
+ }
+ };
+
+ CurlyComponentManager.prototype.didUpdate = function didUpdate(_ref5) {
+ var component = _ref5.component,
+ environment = _ref5.environment;
+
+ if (environment.isInteractive) {
+ component.trigger('didUpdate');
+ component.trigger('didRender');
+ }
+ };
+
+ CurlyComponentManager.prototype.getDestructor = function getDestructor(stateBucket) {
+ return stateBucket;
+ };
+
+ return CurlyComponentManager;
+ }(_abstract.default);
+
+ exports.default = CurlyComponentManager;
+ function validatePositionalParameters(named, positional, positionalParamsDefinition) {
+ if (true) {
+ if (!named || !positional || !positional.length) {
+ return;
+ }
+ var paramType = typeof positionalParamsDefinition;
+ if (paramType === 'string') {
+ (true && !(!named.has(positionalParamsDefinition)) && (0, _emberDebug.assert)('You cannot specify positional parameters and the hash argument `' + positionalParamsDefinition + '`.', !named.has(positionalParamsDefinition)));
+ } else {
+ if (positional.length < positionalParamsDefinition.length) {
+ positionalParamsDefinition = positionalParamsDefinition.slice(0, positional.length);
+ }
+ for (var i = 0; i < positionalParamsDefinition.length; i++) {
+ var name = positionalParamsDefinition[i];
+ (true && !(!named.has(name)) && (0, _emberDebug.assert)('You cannot specify both a positional param (at position ' + i + ') and the hash argument `' + name + '`.', !named.has(name)));
+ }
+ }
+ }
+ }
+ function processComponentInitializationAssertions(component, props) {
+ (true && !(function () {
+ var classNameBindings = component.classNameBindings;
+
+ for (var i = 0; i < classNameBindings.length; i++) {
+ var binding = classNameBindings[i];
+ if (typeof binding !== 'string' || binding.length === 0) {
+ return false;
+ }
+ }
+ return true;
+ }()) && (0, _emberDebug.assert)('classNameBindings must be non-empty strings: ' + component, function () {
+ var classNameBindings = component.classNameBindings;
+ for (var i = 0; i < classNameBindings.length; i++) {
+ var binding = classNameBindings[i];if (typeof binding !== 'string' || binding.length === 0) {
+ return false;
+ }
+ }return true;
+ }()));
+ (true && !(function () {
+ var classNameBindings = component.classNameBindings;
+
+ for (var i = 0; i < classNameBindings.length; i++) {
+ var binding = classNameBindings[i];
+ if (binding.split(' ').length > 1) {
+ return false;
+ }
+ }
+ return true;
+ }()) && (0, _emberDebug.assert)('classNameBindings must not have spaces in them: ' + component, function () {
+ var classNameBindings = component.classNameBindings;
+ for (var i = 0; i < classNameBindings.length; i++) {
+ var binding = classNameBindings[i];if (binding.split(' ').length > 1) {
+ return false;
+ }
+ }return true;
+ }()));
+ (true && !(component.tagName !== '' || !component.classNameBindings || component.classNameBindings.length === 0) && (0, _emberDebug.assert)('You cannot use `classNameBindings` on a tag-less component: ' + component, component.tagName !== '' || !component.classNameBindings || component.classNameBindings.length === 0));
+ (true && !(component.tagName !== '' || props.id === component.elementId || !component.elementId && component.elementId !== '') && (0, _emberDebug.assert)('You cannot use `elementId` on a tag-less component: ' + component, component.tagName !== '' || props.id === component.elementId || !component.elementId && component.elementId !== ''));
+ (true && !(component.tagName !== '' || !component.attributeBindings || component.attributeBindings.length === 0) && (0, _emberDebug.assert)('You cannot use `attributeBindings` on a tag-less component: ' + component, component.tagName !== '' || !component.attributeBindings || component.attributeBindings.length === 0));
+ }
+ function initialRenderInstrumentDetails(component) {
+ return component.instrumentDetails({ initialRender: true });
+ }
+ function rerenderInstrumentDetails(component) {
+ return component.instrumentDetails({ initialRender: false });
+ }
+ var MANAGER = new CurlyComponentManager();
+
+ var CurlyComponentDefinition = exports.CurlyComponentDefinition = function (_ComponentDefinition) {
+ (0, _emberBabel.inherits)(CurlyComponentDefinition, _ComponentDefinition);
+
+ // tslint:disable-next-line:no-shadowed-variable
+ function CurlyComponentDefinition(name, ComponentClass, template, args, customManager) {
+ (0, _emberBabel.classCallCheck)(this, CurlyComponentDefinition);
+
+ var _this2 = (0, _emberBabel.possibleConstructorReturn)(this, _ComponentDefinition.call(this, name, customManager || MANAGER, ComponentClass));
+
+ _this2.template = template;
+ _this2.args = args;
+ return _this2;
+ }
+
+ return CurlyComponentDefinition;
+ }(_runtime.ComponentDefinition);
+});
+enifed('ember-glimmer/component-managers/mount', ['exports', 'ember-babel', '@glimmer/runtime', 'ember-routing', 'ember/features', 'ember-glimmer/utils/references', 'ember-glimmer/component-managers/abstract', 'ember-glimmer/component-managers/outlet'], function (exports, _emberBabel, _runtime, _emberRouting, _features, _references, _abstract, _outlet) {
+ 'use strict';
+
+ exports.MountDefinition = undefined;
+
+ var MountManager = function (_AbstractManager) {
+ (0, _emberBabel.inherits)(MountManager, _AbstractManager);
+
+ function MountManager() {
+ (0, _emberBabel.classCallCheck)(this, MountManager);
+ return (0, _emberBabel.possibleConstructorReturn)(this, _AbstractManager.apply(this, arguments));
+ }
+
+ MountManager.prototype.create = function create(environment, _ref, args) {
+ var name = _ref.name;
+
+ if (true) {
+ this._pushEngineToDebugStack('engine:' + name, environment);
+ }
+ var engine = environment.owner.buildChildEngineInstance(name);
+ engine.boot();
+ var bucket = { engine: engine };
+ if (_features.EMBER_ENGINES_MOUNT_PARAMS) {
+ bucket.modelReference = args.named.get('model');
+ }
+ return bucket;
+ };
+
+ MountManager.prototype.layoutFor = function layoutFor(_definition, _ref2, env) {
+ var engine = _ref2.engine;
+
+ var template = engine.lookup('template:application');
+ return env.getCompiledBlock(_outlet.OutletLayoutCompiler, template);
+ };
+
+ MountManager.prototype.getSelf = function getSelf(bucket) {
+ var engine = bucket.engine,
+ modelReference = bucket.modelReference;
+
+ var applicationFactory = engine.factoryFor('controller:application');
+ var controllerFactory = applicationFactory || (0, _emberRouting.generateControllerFactory)(engine, 'application');
+ var controller = bucket.controller = controllerFactory.create();
+ if (_features.EMBER_ENGINES_MOUNT_PARAMS) {
+ var model = modelReference.value();
+ bucket.modelRevision = modelReference.tag.value();
+ controller.set('model', model);
+ }
+ return new _references.RootReference(controller);
+ };
+
+ MountManager.prototype.getDestructor = function getDestructor(_ref3) {
+ var engine = _ref3.engine;
+
+ return engine;
+ };
+
+ MountManager.prototype.didRenderLayout = function didRenderLayout() {
+ if (true) {
+ this.debugStack.pop();
+ }
+ };
+
+ MountManager.prototype.update = function update(bucket) {
+ if (_features.EMBER_ENGINES_MOUNT_PARAMS) {
+ var controller = bucket.controller,
+ modelReference = bucket.modelReference,
+ modelRevision = bucket.modelRevision;
+
+ if (!modelReference.tag.validate(modelRevision)) {
+ var model = modelReference.value();
+ bucket.modelRevision = modelReference.tag.value();
+ controller.set('model', model);
+ }
+ }
+ };
+
+ return MountManager;
+ }(_abstract.default);
+
+ var MOUNT_MANAGER = new MountManager();
+
+ var MountDefinition = exports.MountDefinition = function (_ComponentDefinition) {
+ (0, _emberBabel.inherits)(MountDefinition, _ComponentDefinition);
+
+ function MountDefinition(name) {
+ (0, _emberBabel.classCallCheck)(this, MountDefinition);
+ return (0, _emberBabel.possibleConstructorReturn)(this, _ComponentDefinition.call(this, name, MOUNT_MANAGER, null));
+ }
+
+ return MountDefinition;
+ }(_runtime.ComponentDefinition);
+});
+enifed('ember-glimmer/component-managers/outlet', ['exports', 'ember-babel', '@glimmer/runtime', 'ember-metal', 'ember-utils', 'ember/features', 'ember-glimmer/utils/references', 'ember-glimmer/component-managers/abstract'], function (exports, _emberBabel, _runtime, _emberMetal, _emberUtils, _features, _references, _abstract) {
+ 'use strict';
+
+ exports.OutletLayoutCompiler = exports.OutletComponentDefinition = exports.TopLevelOutletComponentDefinition = undefined;
+
+ function instrumentationPayload(_ref) {
+ var _ref$render = _ref.render,
+ name = _ref$render.name,
+ outlet = _ref$render.outlet;
+
+ return { object: name + ':' + outlet };
+ }
+ function NOOP() {}
+
+ var StateBucket = function () {
+ function StateBucket(outletState) {
+ (0, _emberBabel.classCallCheck)(this, StateBucket);
+
+ this.outletState = outletState;
+ this.instrument();
+ }
+
+ StateBucket.prototype.instrument = function instrument() {
+ this.finalizer = (0, _emberMetal._instrumentStart)('render.outlet', instrumentationPayload, this.outletState);
+ };
+
+ StateBucket.prototype.finalize = function finalize() {
+ var finalizer = this.finalizer;
+
+ finalizer();
+ this.finalizer = NOOP;
+ };
+
+ return StateBucket;
+ }();
+
+ var OutletComponentManager = function (_AbstractManager) {
+ (0, _emberBabel.inherits)(OutletComponentManager, _AbstractManager);
+
+ function OutletComponentManager() {
+ (0, _emberBabel.classCallCheck)(this, OutletComponentManager);
+ return (0, _emberBabel.possibleConstructorReturn)(this, _AbstractManager.apply(this, arguments));
+ }
+
+ OutletComponentManager.prototype.create = function create(environment, definition, _args, dynamicScope) {
+ if (true) {
+ this._pushToDebugStack('template:' + definition.template.meta.moduleName, environment);
+ }
+ var outletStateReference = dynamicScope.outletState = dynamicScope.outletState.get('outlets').get(definition.outletName);
+ var outletState = outletStateReference.value();
+ return new StateBucket(outletState);
+ };
+
+ OutletComponentManager.prototype.layoutFor = function layoutFor(definition, _bucket, env) {
+ return env.getCompiledBlock(OutletLayoutCompiler, definition.template);
+ };
+
+ OutletComponentManager.prototype.getSelf = function getSelf(_ref2) {
+ var outletState = _ref2.outletState;
+
+ return new _references.RootReference(outletState.render.controller);
+ };
+
+ OutletComponentManager.prototype.didRenderLayout = function didRenderLayout(bucket) {
+ bucket.finalize();
+ if (true) {
+ this.debugStack.pop();
+ }
+ };
+
+ OutletComponentManager.prototype.getDestructor = function getDestructor() {
+ return null;
+ };
+
+ return OutletComponentManager;
+ }(_abstract.default);
+
+ var MANAGER = new OutletComponentManager();
+
+ var TopLevelOutletComponentManager = function (_OutletComponentManag) {
+ (0, _emberBabel.inherits)(TopLevelOutletComponentManager, _OutletComponentManag);
+
+ function TopLevelOutletComponentManager() {
+ (0, _emberBabel.classCallCheck)(this, TopLevelOutletComponentManager);
+ return (0, _emberBabel.possibleConstructorReturn)(this, _OutletComponentManag.apply(this, arguments));
+ }
+
+ TopLevelOutletComponentManager.prototype.create = function create(environment, definition, _args, dynamicScope) {
+ if (true) {
+ this._pushToDebugStack('template:' + definition.template.meta.moduleName, environment);
+ }
+ return new StateBucket(dynamicScope.outletState.value());
+ };
+
+ return TopLevelOutletComponentManager;
+ }(OutletComponentManager);
+
+ var TOP_LEVEL_MANAGER = function () {
+ if (_features.EMBER_GLIMMER_REMOVE_APPLICATION_TEMPLATE_WRAPPER) {
+ return new TopLevelOutletComponentManager();
+ } else {
+ var WrappedTopLevelOutletLayoutCompiler = function () {
+ function WrappedTopLevelOutletLayoutCompiler(template) {
+ (0, _emberBabel.classCallCheck)(this, WrappedTopLevelOutletLayoutCompiler);
+
+ this.template = template;
+ }
+
+ WrappedTopLevelOutletLayoutCompiler.prototype.compile = function compile(builder) {
+ builder.wrapLayout(this.template);
+ builder.tag.static('div');
+ builder.attrs.static('id', (0, _emberUtils.guidFor)(this));
+ builder.attrs.static('class', 'ember-view');
+ };
+
+ return WrappedTopLevelOutletLayoutCompiler;
+ }();
+
+ WrappedTopLevelOutletLayoutCompiler.id = 'wrapped-top-level-outlet';
+
+ var WrappedTopLevelOutletComponentManager = function (_TopLevelOutletCompon) {
+ (0, _emberBabel.inherits)(WrappedTopLevelOutletComponentManager, _TopLevelOutletCompon);
+
+ function WrappedTopLevelOutletComponentManager() {
+ (0, _emberBabel.classCallCheck)(this, WrappedTopLevelOutletComponentManager);
+ return (0, _emberBabel.possibleConstructorReturn)(this, _TopLevelOutletCompon.apply(this, arguments));
+ }
+
+ WrappedTopLevelOutletComponentManager.prototype.layoutFor = function layoutFor(definition, _bucket, env) {
+ return env.getCompiledBlock(WrappedTopLevelOutletLayoutCompiler, definition.template);
+ };
+
+ return WrappedTopLevelOutletComponentManager;
+ }(TopLevelOutletComponentManager);
+
+ return new WrappedTopLevelOutletComponentManager();
+ }
+ }();
+
+ var TopLevelOutletComponentDefinition = exports.TopLevelOutletComponentDefinition = function (_ComponentDefinition) {
+ (0, _emberBabel.inherits)(TopLevelOutletComponentDefinition, _ComponentDefinition);
+
+ function TopLevelOutletComponentDefinition(instance) {
+ (0, _emberBabel.classCallCheck)(this, TopLevelOutletComponentDefinition);
+
+ var _this4 = (0, _emberBabel.possibleConstructorReturn)(this, _ComponentDefinition.call(this, 'outlet', TOP_LEVEL_MANAGER, instance));
+
+ _this4.template = instance.template;
+ (0, _emberUtils.generateGuid)(_this4);
+ return _this4;
+ }
+
+ return TopLevelOutletComponentDefinition;
+ }(_runtime.ComponentDefinition);
+
+ var OutletComponentDefinition = exports.OutletComponentDefinition = function (_ComponentDefinition2) {
+ (0, _emberBabel.inherits)(OutletComponentDefinition, _ComponentDefinition2);
+
+ function OutletComponentDefinition(outletName, template) {
+ (0, _emberBabel.classCallCheck)(this, OutletComponentDefinition);
+
+ var _this5 = (0, _emberBabel.possibleConstructorReturn)(this, _ComponentDefinition2.call(this, 'outlet', MANAGER, null));
+
+ _this5.outletName = outletName;
+ _this5.template = template;
+ (0, _emberUtils.generateGuid)(_this5);
+ return _this5;
+ }
+
+ return OutletComponentDefinition;
+ }(_runtime.ComponentDefinition);
+
+ var OutletLayoutCompiler = exports.OutletLayoutCompiler = function () {
+ function OutletLayoutCompiler(template) {
+ (0, _emberBabel.classCallCheck)(this, OutletLayoutCompiler);
+
+ this.template = template;
+ }
+
+ OutletLayoutCompiler.prototype.compile = function compile(builder) {
+ builder.wrapLayout(this.template);
+ };
+
+ return OutletLayoutCompiler;
+ }();
+
+ OutletLayoutCompiler.id = 'outlet';
+});
+enifed('ember-glimmer/component-managers/render', ['exports', 'ember-babel', '@glimmer/runtime', 'ember-debug', 'ember-routing', 'ember-glimmer/utils/references', 'ember-glimmer/component-managers/abstract', 'ember-glimmer/component-managers/outlet'], function (exports, _emberBabel, _runtime, _emberDebug, _emberRouting, _references, _abstract, _outlet) {
+ 'use strict';
+
+ exports.RenderDefinition = exports.NON_SINGLETON_RENDER_MANAGER = exports.SINGLETON_RENDER_MANAGER = exports.AbstractRenderManager = undefined;
+
+ var AbstractRenderManager = exports.AbstractRenderManager = function (_AbstractManager) {
+ (0, _emberBabel.inherits)(AbstractRenderManager, _AbstractManager);
+
+ function AbstractRenderManager() {
+ (0, _emberBabel.classCallCheck)(this, AbstractRenderManager);
+ return (0, _emberBabel.possibleConstructorReturn)(this, _AbstractManager.apply(this, arguments));
+ }
+
+ AbstractRenderManager.prototype.layoutFor = function layoutFor(definition, _bucket, env) {
+ // only curly components can have lazy layout
+ (true && !(!!definition.template) && (0, _emberDebug.assert)('definition is missing a template', !!definition.template));
+
+ return env.getCompiledBlock(_outlet.OutletLayoutCompiler, definition.template);
+ };
+
+ AbstractRenderManager.prototype.getSelf = function getSelf(_ref) {
+ var controller = _ref.controller;
+
+ return new _references.RootReference(controller);
+ };
+
+ return AbstractRenderManager;
+ }(_abstract.default);
+
+ if (true) {
+ AbstractRenderManager.prototype.didRenderLayout = function () {
+ this.debugStack.pop();
+ };
+ }
+
+ var SingletonRenderManager = function (_AbstractRenderManage) {
+ (0, _emberBabel.inherits)(SingletonRenderManager, _AbstractRenderManage);
+
+ function SingletonRenderManager() {
+ (0, _emberBabel.classCallCheck)(this, SingletonRenderManager);
+ return (0, _emberBabel.possibleConstructorReturn)(this, _AbstractRenderManage.apply(this, arguments));
+ }
+
+ SingletonRenderManager.prototype.create = function create(env, definition, _args, dynamicScope) {
+ var name = definition.name;
+
+ var controller = env.owner.lookup('controller:' + name) || (0, _emberRouting.generateController)(env.owner, name);
+ if (true) {
+ this._pushToDebugStack('controller:' + name + ' (with the render helper)', env);
+ }
+ if (dynamicScope.rootOutletState) {
+ dynamicScope.outletState = dynamicScope.rootOutletState.getOrphan(name);
+ }
+ return { controller: controller };
+ };
+
+ SingletonRenderManager.prototype.getDestructor = function getDestructor() {
+ return null;
+ };
+
+ return SingletonRenderManager;
+ }(AbstractRenderManager);
+
+ var SINGLETON_RENDER_MANAGER = exports.SINGLETON_RENDER_MANAGER = new SingletonRenderManager();
+
+ var NonSingletonRenderManager = function (_AbstractRenderManage2) {
+ (0, _emberBabel.inherits)(NonSingletonRenderManager, _AbstractRenderManage2);
+
+ function NonSingletonRenderManager() {
+ (0, _emberBabel.classCallCheck)(this, NonSingletonRenderManager);
+ return (0, _emberBabel.possibleConstructorReturn)(this, _AbstractRenderManage2.apply(this, arguments));
+ }
+
+ NonSingletonRenderManager.prototype.create = function create(environment, definition, args, dynamicScope) {
+ var name = definition.name,
+ env = definition.env;
+
+ var modelRef = args.positional.at(0);
+ var controllerFactory = env.owner.factoryFor('controller:' + name);
+ var factory = controllerFactory || (0, _emberRouting.generateControllerFactory)(env.owner, name);
+ var controller = factory.create({ model: modelRef.value() });
+ if (true) {
+ this._pushToDebugStack('controller:' + name + ' (with the render helper)', environment);
+ }
+ if (dynamicScope.rootOutletState) {
+ dynamicScope.outletState = dynamicScope.rootOutletState.getOrphan(name);
+ }
+ return { controller: controller, model: modelRef };
+ };
+
+ NonSingletonRenderManager.prototype.update = function update(_ref2) {
+ var controller = _ref2.controller,
+ model = _ref2.model;
+
+ controller.set('model', model.value());
+ };
+
+ NonSingletonRenderManager.prototype.getDestructor = function getDestructor(_ref3) {
+ var controller = _ref3.controller;
+
+ return controller;
+ };
+
+ return NonSingletonRenderManager;
+ }(AbstractRenderManager);
+
+ var NON_SINGLETON_RENDER_MANAGER = exports.NON_SINGLETON_RENDER_MANAGER = new NonSingletonRenderManager();
+
+ var RenderDefinition = exports.RenderDefinition = function (_ComponentDefinition) {
+ (0, _emberBabel.inherits)(RenderDefinition, _ComponentDefinition);
+
+ function RenderDefinition(name, template, env, manager) {
+ (0, _emberBabel.classCallCheck)(this, RenderDefinition);
+
+ var _this4 = (0, _emberBabel.possibleConstructorReturn)(this, _ComponentDefinition.call(this, 'render', manager, null));
+
+ _this4.name = name;
+ _this4.template = template;
+ _this4.env = env;
+ return _this4;
+ }
+
+ return RenderDefinition;
+ }(_runtime.ComponentDefinition);
+});
+enifed('ember-glimmer/component-managers/root', ['exports', 'ember-babel', '@glimmer/runtime', 'ember-metal', 'ember-glimmer/utils/curly-component-state-bucket', 'ember-glimmer/component-managers/curly'], function (exports, _emberBabel, _runtime, _emberMetal, _curlyComponentStateBucket, _curly) {
+ 'use strict';
+
+ exports.RootComponentDefinition = undefined;
+
+ var RootComponentManager = function (_CurlyComponentManage) {
+ (0, _emberBabel.inherits)(RootComponentManager, _CurlyComponentManage);
+
+ function RootComponentManager() {
+ (0, _emberBabel.classCallCheck)(this, RootComponentManager);
+ return (0, _emberBabel.possibleConstructorReturn)(this, _CurlyComponentManage.apply(this, arguments));
+ }
+
+ RootComponentManager.prototype.create = function create(environment, definition, args, dynamicScope) {
+ var component = definition.ComponentClass.create();
+ if (true) {
+ this._pushToDebugStack(component._debugContainerKey, environment);
+ }
+ var finalizer = (0, _emberMetal._instrumentStart)('render.component', _curly.initialRenderInstrumentDetails, component);
+ dynamicScope.view = component;
+ // We usually do this in the `didCreateElement`, but that hook doesn't fire for tagless components
+ if (component.tagName === '') {
+ if (environment.isInteractive) {
+ component.trigger('willRender');
+ }
+ component._transitionTo('hasElement');
+ if (environment.isInteractive) {
+ component.trigger('willInsertElement');
+ }
+ }
+ if (true) {
+ (0, _curly.processComponentInitializationAssertions)(component, {});
+ }
+ return new _curlyComponentStateBucket.default(environment, component, args.named.capture(), finalizer);
+ };
+
+ return RootComponentManager;
+ }(_curly.default);
+
+ var ROOT_MANAGER = new RootComponentManager();
+
+ var RootComponentDefinition = exports.RootComponentDefinition = function (_ComponentDefinition) {
+ (0, _emberBabel.inherits)(RootComponentDefinition, _ComponentDefinition);
+
+ function RootComponentDefinition(instance) {
+ (0, _emberBabel.classCallCheck)(this, RootComponentDefinition);
+
+ var _this2 = (0, _emberBabel.possibleConstructorReturn)(this, _ComponentDefinition.call(this, '-root', ROOT_MANAGER, {
+ class: instance.constructor,
+ create: function () {
+ return instance;
+ }
+ }));
+
+ _this2.template = undefined;
+ _this2.args = undefined;
+ return _this2;
+ }
+
+ return RootComponentDefinition;
+ }(_runtime.ComponentDefinition);
+});
+enifed('ember-glimmer/component-managers/template-only', ['exports', 'ember-babel', '@glimmer/runtime', 'ember-glimmer/component-managers/abstract'], function (exports, _emberBabel, _runtime, _abstract) {
+ 'use strict';
+
+ exports.TemplateOnlyComponentDefinition = undefined;
+
+ var TemplateOnlyComponentLayoutCompiler = function () {
+ function TemplateOnlyComponentLayoutCompiler(template) {
+ (0, _emberBabel.classCallCheck)(this, TemplateOnlyComponentLayoutCompiler);
+
+ this.template = template;
+ }
+
+ TemplateOnlyComponentLayoutCompiler.prototype.compile = function compile(builder) {
+ // TODO: use fromLayout
+ builder.wrapLayout(this.template);
+ };
+
+ return TemplateOnlyComponentLayoutCompiler;
+ }();
+
+ TemplateOnlyComponentLayoutCompiler.id = 'template-only';
+
+ var TemplateOnlyComponentManager = function (_AbstractManager) {
+ (0, _emberBabel.inherits)(TemplateOnlyComponentManager, _AbstractManager);
+
+ function TemplateOnlyComponentManager() {
+ (0, _emberBabel.classCallCheck)(this, TemplateOnlyComponentManager);
+ return (0, _emberBabel.possibleConstructorReturn)(this, _AbstractManager.apply(this, arguments));
+ }
+
+ TemplateOnlyComponentManager.prototype.create = function create() {
+ return null;
+ };
+
+ TemplateOnlyComponentManager.prototype.layoutFor = function layoutFor(_ref, _, env) {
+ var template = _ref.template;
+
+ return env.getCompiledBlock(TemplateOnlyComponentLayoutCompiler, template);
+ };
+
+ TemplateOnlyComponentManager.prototype.getSelf = function getSelf() {
+ return _runtime.NULL_REFERENCE;
+ };
+
+ TemplateOnlyComponentManager.prototype.getDestructor = function getDestructor() {
+ return null;
+ };
+
+ return TemplateOnlyComponentManager;
+ }(_abstract.default);
+
+ exports.default = TemplateOnlyComponentManager;
+
+ var MANAGER = new TemplateOnlyComponentManager();
+
+ var TemplateOnlyComponentDefinition = exports.TemplateOnlyComponentDefinition = function (_ComponentDefinition) {
+ (0, _emberBabel.inherits)(TemplateOnlyComponentDefinition, _ComponentDefinition);
+
+ function TemplateOnlyComponentDefinition(name, template) {
+ (0, _emberBabel.classCallCheck)(this, TemplateOnlyComponentDefinition);
+
+ var _this2 = (0, _emberBabel.possibleConstructorReturn)(this, _ComponentDefinition.call(this, name, MANAGER, null));
+
+ _this2.template = template;
+ return _this2;
+ }
+
+ return TemplateOnlyComponentDefinition;
+ }(_runtime.ComponentDefinition);
+});
+enifed('ember-glimmer/component', ['exports', '@glimmer/reference', '@glimmer/runtime', 'ember-debug', 'ember-metal', 'ember-runtime', 'ember-utils', 'ember-views', 'ember-glimmer/utils/references'], function (exports, _reference, _runtime, _emberDebug, _emberMetal, _emberRuntime, _emberUtils, _emberViews, _references) {
+ 'use strict';
+
+ exports.BOUNDS = exports.HAS_BLOCK = exports.IS_DISPATCHING_ATTRS = exports.ROOT_REF = exports.ARGS = exports.DIRTY_TAG = undefined;
+
+ var _CoreView$extend;
+
+ var DIRTY_TAG = exports.DIRTY_TAG = (0, _emberUtils.symbol)('DIRTY_TAG');
+ var ARGS = exports.ARGS = (0, _emberUtils.symbol)('ARGS');
+ var ROOT_REF = exports.ROOT_REF = (0, _emberUtils.symbol)('ROOT_REF');
+ var IS_DISPATCHING_ATTRS = exports.IS_DISPATCHING_ATTRS = (0, _emberUtils.symbol)('IS_DISPATCHING_ATTRS');
+ var HAS_BLOCK = exports.HAS_BLOCK = (0, _emberUtils.symbol)('HAS_BLOCK');
+ var BOUNDS = exports.BOUNDS = (0, _emberUtils.symbol)('BOUNDS');
+ /**
+ @module @ember/component
+ */
+ /**
+ A `Component` is a view that is completely
+ isolated. Properties accessed in its templates go
+ to the view object and actions are targeted at
+ the view object. There is no access to the
+ surrounding context or outer controller; all
+ contextual information must be passed in.
+
+ The easiest way to create a `Component` is via
+ a template. If you name a template
+ `app/components/my-foo.hbs`, you will be able to use
+ `{{my-foo}}` in other templates, which will make
+ an instance of the isolated component.
+
+ ```app/components/my-foo.hbs
+ {{person-profile person=currentUser}}
+ ```
+
+ ```app/components/person-profile.hbs
+ <h1>{{person.title}}</h1>
+ <img src={{person.avatar}}>
+ <p class='signature'>{{person.signature}}</p>
+ ```
+
+ You can use `yield` inside a template to
+ include the **contents** of any block attached to
+ the component. The block will be executed in the
+ context of the surrounding context or outer controller:
+
+ ```handlebars
+ {{#person-profile person=currentUser}}
+ <p>Admin mode</p>
+ {{! Executed in the controller's context. }}
+ {{/person-profile}}
+ ```
+
+ ```app/components/person-profile.hbs
+ <h1>{{person.title}}</h1>
+ {{! Executed in the component's context. }}
+ {{yield}} {{! block contents }}
+ ```
+
+ If you want to customize the component, in order to
+ handle events or actions, you implement a subclass
+ of `Component` named after the name of the
+ component.
+
+ For example, you could implement the action
+ `hello` for the `person-profile` component:
+
+ ```app/components/person-profile.js
+ import Component from '@ember/component';
+
+ export default Component.extend({
+ actions: {
+ hello(name) {
+ console.log("Hello", name);
+ }
+ }
+ });
+ ```
+
+ And then use it in the component's template:
+
+ ```app/templates/components/person-profile.hbs
+ <h1>{{person.title}}</h1>
+ {{yield}} <!-- block contents -->
+ <button {{action 'hello' person.name}}>
+ Say Hello to {{person.name}}
+ </button>
+ ```
+
+ Components must have a `-` in their name to avoid
+ conflicts with built-in controls that wrap HTML
+ elements. This is consistent with the same
+ requirement in web components.
+
+ ## HTML Tag
+
+ The default HTML tag name used for a component's DOM representation is `div`.
+ This can be customized by setting the `tagName` property.
+ The following component class:
+
+ ```app/components/emphasized-paragraph.js
+ import Component from '@ember/component';
+
+ export default Component.extend({
+ tagName: 'em'
+ });
+ ```
+
+ Would result in instances with the following HTML:
+
+ ```html
+ <em id="ember1" class="ember-view"></em>
+ ```
+
+ ## HTML `class` Attribute
+
+ The HTML `class` attribute of a component's tag can be set by providing a
+ `classNames` property that is set to an array of strings:
+
+ ```app/components/my-widget.js
+ import Component from '@ember/component';
+
+ export default Component.extend({
+ classNames: ['my-class', 'my-other-class']
+ });
+ ```
+
+ Will result in component instances with an HTML representation of:
+
+ ```html
+ <div id="ember1" class="ember-view my-class my-other-class"></div>
+ ```
+
+ `class` attribute values can also be set by providing a `classNameBindings`
+ property set to an array of properties names for the component. The return value
+ of these properties will be added as part of the value for the components's `class`
+ attribute. These properties can be computed properties:
+
+ ```app/components/my-widget.js
+ import Component from '@ember/component';
+ import { computed } from '@ember/object';
+
+ export default Component.extend({
+ classNameBindings: ['propertyA', 'propertyB'],
+
+ propertyA: 'from-a',
+ propertyB: computed(function() {
+ if (someLogic) { return 'from-b'; }
+ })
+ });
+ ```
+
+ Will result in component instances with an HTML representation of:
+
+ ```html
+ <div id="ember1" class="ember-view from-a from-b"></div>
+ ```
+
+ If the value of a class name binding returns a boolean the property name
+ itself will be used as the class name if the property is true.
+ The class name will not be added if the value is `false` or `undefined`.
+
+ ```app/components/my-widget.js
+ import Component from '@ember/component';
+
+ export default Component.extend({
+ classNameBindings: ['hovered'],
+
+ hovered: true
+ });
+ ```
+
+ Will result in component instances with an HTML representation of:
+
+ ```html
+ <div id="ember1" class="ember-view hovered"></div>
+ ```
+
+ When using boolean class name bindings you can supply a string value other
+ than the property name for use as the `class` HTML attribute by appending the
+ preferred value after a ":" character when defining the binding:
+
+ ```app/components/my-widget.js
+ import Component from '@ember/component';
+
+ export default Component.extend({
+ classNameBindings: ['awesome:so-very-cool'],
+
+ awesome: true
+ });
+ ```
+
+ Will result in component instances with an HTML representation of:
+
+ ```html
+ <div id="ember1" class="ember-view so-very-cool"></div>
+ ```
+
+ Boolean value class name bindings whose property names are in a
+ camelCase-style format will be converted to a dasherized format:
+
+ ```app/components/my-widget.js
+ import Component from '@ember/component';
+
+ export default Component.extend({
+ classNameBindings: ['isUrgent'],
+
+ isUrgent: true
+ });
+ ```
+
+ Will result in component instances with an HTML representation of:
+
+ ```html
+ <div id="ember1" class="ember-view is-urgent"></div>
+ ```
+
+ Class name bindings can also refer to object values that are found by
+ traversing a path relative to the component itself:
+
+ ```app/components/my-widget.js
+ import Component from '@ember/component';
+ import EmberObject from '@ember/object';
+
+ export default Component.extend({
+ classNameBindings: ['messages.empty'],
+
+ messages: EmberObject.create({
+ empty: true
+ })
+ });
+ ```
+
+ Will result in component instances with an HTML representation of:
+
+ ```html
+ <div id="ember1" class="ember-view empty"></div>
+ ```
+
+ If you want to add a class name for a property which evaluates to true and
+ and a different class name if it evaluates to false, you can pass a binding
+ like this:
+
+ ```app/components/my-widget.js
+ import Component from '@ember/component';
+
+ export default Component.extend({
+ classNameBindings: ['isEnabled:enabled:disabled'],
+ isEnabled: true
+ });
+ ```
+
+ Will result in component instances with an HTML representation of:
+
+ ```html
+ <div id="ember1" class="ember-view enabled"></div>
+ ```
+
+ When isEnabled is `false`, the resulting HTML representation looks like
+ this:
+
+ ```html
+ <div id="ember1" class="ember-view disabled"></div>
+ ```
+
+ This syntax offers the convenience to add a class if a property is `false`:
+
+ ```app/components/my-widget.js
+ import Component from '@ember/component';
+
+ // Applies no class when isEnabled is true and class 'disabled' when isEnabled is false
+ export default Component.extend({
+ classNameBindings: ['isEnabled::disabled'],
+ isEnabled: true
+ });
+ ```
+
+ Will result in component instances with an HTML representation of:
+
+ ```html
+ <div id="ember1" class="ember-view"></div>
+ ```
+
+ When the `isEnabled` property on the component is set to `false`, it will result
+ in component instances with an HTML representation of:
+
+ ```html
+ <div id="ember1" class="ember-view disabled"></div>
+ ```
+
+ Updates to the value of a class name binding will result in automatic
+ update of the HTML `class` attribute in the component's rendered HTML
+ representation. If the value becomes `false` or `undefined` the class name
+ will be removed.
+ Both `classNames` and `classNameBindings` are concatenated properties. See
+ [EmberObject](/api/ember/release/classes/EmberObject) documentation for more
+ information about concatenated properties.
+
+ ## HTML Attributes
+
+ The HTML attribute section of a component's tag can be set by providing an
+ `attributeBindings` property set to an array of property names on the component.
+ The return value of these properties will be used as the value of the component's
+ HTML associated attribute:
+
+ ```app/components/my-anchor.js
+ import Component from '@ember/component';
+
+ export default Component.extend({
+ tagName: 'a',
+ attributeBindings: ['href'],
+
+ href: 'http://google.com'
+ });
+ ```
+
+ Will result in component instances with an HTML representation of:
+
+ ```html
+ <a id="ember1" class="ember-view" href="http://google.com"></a>
+ ```
+
+ One property can be mapped on to another by placing a ":" between
+ the source property and the destination property:
+
+ ```app/components/my-anchor.js
+ import Component from '@ember/component';
+
+ export default Component.extend({
+ tagName: 'a',
+ attributeBindings: ['url:href'],
+
+ url: 'http://google.com'
+ });
+ ```
+
+ Will result in component instances with an HTML representation of:
+
+ ```html
+ <a id="ember1" class="ember-view" href="http://google.com"></a>
+ ```
+
+ Namespaced attributes (e.g. `xlink:href`) are supported, but have to be
+ mapped, since `:` is not a valid character for properties in Javascript:
+
+ ```app/components/my-use.js
+ import Component from '@ember/component';
+
+ export default Component.extend({
+ tagName: 'use',
+ attributeBindings: ['xlinkHref:xlink:href'],
+
+ xlinkHref: '#triangle'
+ });
+ ```
+
+ Will result in component instances with an HTML representation of:
+
+ ```html
+ <use xlink:href="#triangle"></use>
+ ```
+
+ If the return value of an `attributeBindings` monitored property is a boolean
+ the attribute will be present or absent depending on the value:
+
+ ```app/components/my-text-input.js
+ import Component from '@ember/component';
+
+ export default Component.extend({
+ tagName: 'input',
+ attributeBindings: ['disabled'],
+
+ disabled: false
+ });
+ ```
+
+ Will result in a component instance with an HTML representation of:
+
+ ```html
+ <input id="ember1" class="ember-view" />
+ ```
+
+ `attributeBindings` can refer to computed properties:
+
+ ```app/components/my-text-input.js
+ import Component from '@ember/component';
+ import { computed } from '@ember/object';
+
+ export default Component.extend({
+ tagName: 'input',
+ attributeBindings: ['disabled'],
+
+ disabled: computed(function() {
+ if (someLogic) {
+ return true;
+ } else {
+ return false;
+ }
+ })
+ });
+ ```
+
+ To prevent setting an attribute altogether, use `null` or `undefined` as the
+ return value of the `attributeBindings` monitored property:
+
+ ```app/components/my-text-input.js
+ import Component from '@ember/component';
+
+ export default Component.extend({
+ tagName: 'form',
+ attributeBindings: ['novalidate'],
+ novalidate: null
+ });
+ ```
+
+ Updates to the property of an attribute binding will result in automatic
+ update of the HTML attribute in the component's rendered HTML representation.
+ `attributeBindings` is a concatenated property. See [EmberObject](/api/ember/release/classes/EmberObject)
+ documentation for more information about concatenated properties.
+
+ ## Layouts
+
+ See [Ember.Templates.helpers.yield](/api/ember/release/classes/Ember.Templates.helpers/methods/yield?anchor=yield)
+ for more information.
+
+ Layout can be used to wrap content in a component. In addition
+ to wrapping content in a Component's template, you can also use
+ the public layout API in your Component JavaScript.
+
+ ```app/templates/components/person-profile.hbs
+ <h1>Person's Title</h1>
+ <div class='details'>{{yield}}</div>
+ ```
+
+ ```app/components/person-profile.js
+ import Component from '@ember/component';
+ import layout from '../templates/components/person-profile';
+
+ export default Component.extend({
+ layout
+ });
+ ```
+
+ The above will result in the following HTML output:
+
+ ```html
+ <h1>Person's Title</h1>
+ <div class="details">
+ <h2>Chief Basket Weaver</h2>
+ <h3>Fisherman Industries</h3>
+ </div>
+ ```
+
+ ## Responding to Browser Events
+
+ Components can respond to user-initiated events in one of three ways: method
+ implementation, through an event manager, and through `{{action}}` helper use
+ in their template or layout.
+
+ ### Method Implementation
+
+ Components can respond to user-initiated events by implementing a method that
+ matches the event name. A `jQuery.Event` object will be passed as the
+ argument to this method.
+
+ ```app/components/my-widget.js
+ import Component from '@ember/component';
+
+ export default Component.extend({
+ click(event) {
+ // will be called when an instance's
+ // rendered element is clicked
+ }
+ });
+ ```
+
+ ### `{{action}}` Helper
+
+ See [Ember.Templates.helpers.action](/api/ember/release/classes/Ember.Templates.helpers/methods/yield?anchor=yield).
+
+ ### Event Names
+
+ All of the event handling approaches described above respond to the same set
+ of events. The names of the built-in events are listed below. (The hash of
+ built-in events exists in `Ember.EventDispatcher`.) Additional, custom events
+ can be registered by using `Application.customEvents`.
+
+ Touch events:
+
+ * `touchStart`
+ * `touchMove`
+ * `touchEnd`
+ * `touchCancel`
+
+ Keyboard events:
+
+ * `keyDown`
+ * `keyUp`
+ * `keyPress`
+
+ Mouse events:
+
+ * `mouseDown`
+ * `mouseUp`
+ * `contextMenu`
+ * `click`
+ * `doubleClick`
+ * `mouseMove`
+ * `focusIn`
+ * `focusOut`
+ * `mouseEnter`
+ * `mouseLeave`
+
+ Form events:
+
+ * `submit`
+ * `change`
+ * `focusIn`
+ * `focusOut`
+ * `input`
+
+ HTML5 drag and drop events:
+
+ * `dragStart`
+ * `drag`
+ * `dragEnter`
+ * `dragLeave`
+ * `dragOver`
+ * `dragEnd`
+ * `drop`
+
+ @class Component
+ @extends Ember.CoreView
+ @uses Ember.TargetActionSupport
+ @uses Ember.ClassNamesSupport
+ @uses Ember.ActionSupport
+ @uses Ember.ViewMixin
+ @uses Ember.ViewStateSupport
+ @public
+ */
+ var Component = _emberViews.CoreView.extend(_emberViews.ChildViewsSupport, _emberViews.ViewStateSupport, _emberViews.ClassNamesSupport, _emberRuntime.TargetActionSupport, _emberViews.ActionSupport, _emberViews.ViewMixin, (_CoreView$extend = {
+ isComponent: true,
+ init: function () {
+ var _this = this;
+
+ this._super.apply(this, arguments);
+ this[IS_DISPATCHING_ATTRS] = false;
+ this[DIRTY_TAG] = new _reference.DirtyableTag();
+ this[ROOT_REF] = new _references.RootReference(this);
+ this[BOUNDS] = null;
+ // If in a tagless component, assert that no event handlers are defined
+ (true && !(this.tagName !== '' || !this.renderer._destinedForDOM || !function () {
+ var eventDispatcher = (0, _emberUtils.getOwner)(_this).lookup('event_dispatcher:main');
+ var events = eventDispatcher && eventDispatcher._finalEvents || {};
+ // tslint:disable-next-line:forin
+ for (var key in events) {
+ var methodName = events[key];
+ if (typeof _this[methodName] === 'function') {
+ return true; // indicate that the assertion should be triggered
+ }
+ }
+ return false;
+ }()) && (0, _emberDebug.assert)('You can not define a function that handles DOM events in the `' + this + '` tagless component since it doesn\'t have any DOM element.', this.tagName !== '' || !this.renderer._destinedForDOM || !function () {
+ var eventDispatcher = (0, _emberUtils.getOwner)(_this).lookup('event_dispatcher:main');var events = eventDispatcher && eventDispatcher._finalEvents || {};for (var key in events) {
+ var methodName = events[key];if (typeof _this[methodName] === 'function') {
+ return true;
+ }
+ }return false;
+ }()));
+ },
+ rerender: function () {
+ this[DIRTY_TAG].dirty();
+ this._super();
+ },
+ __defineNonEnumerable: function (property) {
+ this[property.name] = property.descriptor.value;
+ }
+ }, _CoreView$extend[_emberMetal.PROPERTY_DID_CHANGE] = function (key) {
+ if (this[IS_DISPATCHING_ATTRS]) {
+ return;
+ }
+ var args = this[ARGS];
+ var reference = args && args[key];
+ if (reference) {
+ if (reference[_references.UPDATE]) {
+ reference[_references.UPDATE]((0, _emberMetal.get)(this, key));
+ }
+ }
+ }, _CoreView$extend.getAttr = function (key) {
+ // TODO Intimate API should be deprecated
+ return this.get(key);
+ }, _CoreView$extend.readDOMAttr = function (name) {
+ var element = (0, _emberViews.getViewElement)(this);
+ return (0, _runtime.readDOMAttr)(element, name);
+ }, _CoreView$extend));
+ Component[_emberUtils.NAME_KEY] = 'Ember.Component';
+ Component.reopenClass({
+ isComponentFactory: true,
+ positionalParams: []
+ });
+ exports.default = Component;
+});
+enifed('ember-glimmer/components/checkbox', ['exports', 'ember-metal', 'ember-glimmer/component', 'ember-glimmer/templates/empty'], function (exports, _emberMetal, _component, _empty) {
+ 'use strict';
+
+ exports.default = _component.default.extend({
+ layout: _empty.default,
+ classNames: ['ember-checkbox'],
+ tagName: 'input',
+ attributeBindings: ['type', 'checked', 'indeterminate', 'disabled', 'tabindex', 'name', 'autofocus', 'required', 'form'],
+ type: 'checkbox',
+ disabled: false,
+ indeterminate: false,
+ didInsertElement: function () {
+ this._super.apply(this, arguments);
+ (0, _emberMetal.get)(this, 'element').indeterminate = !!(0, _emberMetal.get)(this, 'indeterminate');
+ },
+ change: function () {
+ (0, _emberMetal.set)(this, 'checked', this.$().prop('checked'));
+ }
+ });
+});
+enifed('ember-glimmer/components/link-to', ['exports', 'ember-debug', 'ember-metal', 'ember-runtime', 'ember-views', 'ember-glimmer/component', 'ember-glimmer/templates/link-to'], function (exports, _emberDebug, _emberMetal, _emberRuntime, _emberViews, _component, _linkTo) {
+ 'use strict';
+
+ /**
+ @module @ember/routing
+ */
+ /**
+ `LinkComponent` renders an element whose `click` event triggers a
+ transition of the application's instance of `Router` to
+ a supplied route by name.
+
+ `LinkComponent` components are invoked with {{#link-to}}. Properties
+ of this class can be overridden with `reopen` to customize application-wide
+ behavior.
+
+ @class LinkComponent
+ @extends Component
+ @see {Ember.Templates.helpers.link-to}
+ @public
+ **/
+ var LinkComponent = _component.default.extend({
+ layout: _linkTo.default,
+ tagName: 'a',
+ /**
+ Used to determine when this `LinkComponent` is active.
+ @property current-when
+ @public
+ */
+ 'current-when': null,
+ /**
+ Sets the `title` attribute of the `LinkComponent`'s HTML element.
+ @property title
+ @default null
+ @public
+ **/
+ title: null,
+ /**
+ Sets the `rel` attribute of the `LinkComponent`'s HTML element.
+ @property rel
+ @default null
+ @public
+ **/
+ rel: null,
+ /**
+ Sets the `tabindex` attribute of the `LinkComponent`'s HTML element.
+ @property tabindex
+ @default null
+ @public
+ **/
+ tabindex: null,
+ /**
+ Sets the `target` attribute of the `LinkComponent`'s HTML element.
+ @since 1.8.0
+ @property target
+ @default null
+ @public
+ **/
+ target: null,
+ /**
+ The CSS class to apply to `LinkComponent`'s element when its `active`
+ property is `true`.
+ @property activeClass
+ @type String
+ @default active
+ @public
+ **/
+ activeClass: 'active',
+ /**
+ The CSS class to apply to `LinkComponent`'s element when its `loading`
+ property is `true`.
+ @property loadingClass
+ @type String
+ @default loading
+ @private
+ **/
+ loadingClass: 'loading',
+ /**
+ The CSS class to apply to a `LinkComponent`'s element when its `disabled`
+ property is `true`.
+ @property disabledClass
+ @type String
+ @default disabled
+ @private
+ **/
+ disabledClass: 'disabled',
+ /**
+ Determines whether the `LinkComponent` will trigger routing via
+ the `replaceWith` routing strategy.
+ @property replace
+ @type Boolean
+ @default false
+ @public
+ **/
+ replace: false,
+ /**
+ By default the `{{link-to}}` component will bind to the `href` and
+ `title` attributes. It's discouraged that you override these defaults,
+ however you can push onto the array if needed.
+ @property attributeBindings
+ @type Array | String
+ @default ['title', 'rel', 'tabindex', 'target']
+ @public
+ */
+ attributeBindings: ['href', 'title', 'rel', 'tabindex', 'target'],
+ /**
+ By default the `{{link-to}}` component will bind to the `active`, `loading`,
+ and `disabled` classes. It is discouraged to override these directly.
+ @property classNameBindings
+ @type Array
+ @default ['active', 'loading', 'disabled', 'ember-transitioning-in', 'ember-transitioning-out']
+ @public
+ */
+ classNameBindings: ['active', 'loading', 'disabled', 'transitioningIn', 'transitioningOut'],
+ /**
+ By default the `{{link-to}}` component responds to the `click` event. You
+ can override this globally by setting this property to your custom
+ event name.
+ This is particularly useful on mobile when one wants to avoid the 300ms
+ click delay using some sort of custom `tap` event.
+ @property eventName
+ @type String
+ @default click
+ @private
+ */
+ eventName: 'click',
+ init: function () {
+ this._super.apply(this, arguments);
+ // Map desired event name to invoke function
+ var eventName = (0, _emberMetal.get)(this, 'eventName');
+ this.on(eventName, this, this._invoke);
+ },
+
+ _routing: _emberRuntime.inject.service('-routing'),
+ /**
+ Accessed as a classname binding to apply the `LinkComponent`'s `disabledClass`
+ CSS `class` to the element when the link is disabled.
+ When `true` interactions with the element will not trigger route changes.
+ @property disabled
+ @private
+ */
+ disabled: (0, _emberMetal.computed)({
+ get: function (_key) {
+ // always returns false for `get` because (due to the `set` just below)
+ // the cached return value from the set will prevent this getter from _ever_
+ // being called after a set has occured
+ return false;
+ },
+ set: function (_key, value) {
+ this._isDisabled = value;
+ return value ? (0, _emberMetal.get)(this, 'disabledClass') : false;
+ }
+ }),
+ _isActive: function (routerState) {
+ if ((0, _emberMetal.get)(this, 'loading')) {
+ return false;
+ }
+ var currentWhen = (0, _emberMetal.get)(this, 'current-when');
+ if (typeof currentWhen === 'boolean') {
+ return currentWhen;
+ }
+ var isCurrentWhenSpecified = !!currentWhen;
+ currentWhen = currentWhen || (0, _emberMetal.get)(this, 'qualifiedRouteName');
+ currentWhen = currentWhen.split(' ');
+ var routing = (0, _emberMetal.get)(this, '_routing');
+ var models = (0, _emberMetal.get)(this, 'models');
+ var resolvedQueryParams = (0, _emberMetal.get)(this, 'resolvedQueryParams');
+ for (var i = 0; i < currentWhen.length; i++) {
+ if (routing.isActiveForRoute(models, resolvedQueryParams, currentWhen[i], routerState, isCurrentWhenSpecified)) {
+ return true;
+ }
+ }
+ return false;
+ },
+
+ /**
+ Accessed as a classname binding to apply the `LinkComponent`'s `activeClass`
+ CSS `class` to the element when the link is active.
+ A `LinkComponent` is considered active when its `currentWhen` property is `true`
+ or the application's current route is the route the `LinkComponent` would trigger
+ transitions into.
+ The `currentWhen` property can match against multiple routes by separating
+ route names using the ` ` (space) character.
+ @property active
+ @private
+ */
+ active: (0, _emberMetal.computed)('activeClass', '_active', function computeLinkToComponentActiveClass() {
+ return this.get('_active') ? (0, _emberMetal.get)(this, 'activeClass') : false;
+ }),
+ _active: (0, _emberMetal.computed)('_routing.currentState', 'attrs.params', function computeLinkToComponentActive() {
+ var currentState = (0, _emberMetal.get)(this, '_routing.currentState');
+ if (!currentState) {
+ return false;
+ }
+ return this._isActive(currentState);
+ }),
+ willBeActive: (0, _emberMetal.computed)('_routing.targetState', function computeLinkToComponentWillBeActive() {
+ var routing = (0, _emberMetal.get)(this, '_routing');
+ var targetState = (0, _emberMetal.get)(routing, 'targetState');
+ if ((0, _emberMetal.get)(routing, 'currentState') === targetState) {
+ return;
+ }
+ return this._isActive(targetState);
+ }),
+ transitioningIn: (0, _emberMetal.computed)('active', 'willBeActive', function computeLinkToComponentTransitioningIn() {
+ if ((0, _emberMetal.get)(this, 'willBeActive') === true && !(0, _emberMetal.get)(this, '_active')) {
+ return 'ember-transitioning-in';
+ } else {
+ return false;
+ }
+ }),
+ transitioningOut: (0, _emberMetal.computed)('active', 'willBeActive', function computeLinkToComponentTransitioningOut() {
+ if ((0, _emberMetal.get)(this, 'willBeActive') === false && (0, _emberMetal.get)(this, '_active')) {
+ return 'ember-transitioning-out';
+ } else {
+ return false;
+ }
+ }),
+ _invoke: function (event) {
+ if (!(0, _emberViews.isSimpleClick)(event)) {
+ return true;
+ }
+ var preventDefault = (0, _emberMetal.get)(this, 'preventDefault');
+ var targetAttribute = (0, _emberMetal.get)(this, 'target');
+ if (preventDefault !== false) {
+ if (!targetAttribute || targetAttribute === '_self') {
+ event.preventDefault();
+ }
+ }
+ if ((0, _emberMetal.get)(this, 'bubbles') === false) {
+ event.stopPropagation();
+ }
+ if (this._isDisabled) {
+ return false;
+ }
+ if ((0, _emberMetal.get)(this, 'loading')) {
+ (true && (0, _emberDebug.warn)('This link-to is in an inactive loading state because at least one of its parameters presently has a null/undefined value, or the provided route name is invalid.', false));
+
+ return false;
+ }
+ if (targetAttribute && targetAttribute !== '_self') {
+ return false;
+ }
+ var qualifiedRouteName = (0, _emberMetal.get)(this, 'qualifiedRouteName');
+ var models = (0, _emberMetal.get)(this, 'models');
+ var queryParams = (0, _emberMetal.get)(this, 'queryParams.values');
+ var shouldReplace = (0, _emberMetal.get)(this, 'replace');
+ var payload = {
+ queryParams: queryParams,
+ routeName: qualifiedRouteName
+ };
+ // tslint:disable-next-line:max-line-length
+ (0, _emberMetal.flaggedInstrument)('interaction.link-to', payload, this._generateTransition(payload, qualifiedRouteName, models, queryParams, shouldReplace));
+ return false;
+ },
+ _generateTransition: function (payload, qualifiedRouteName, models, queryParams, shouldReplace) {
+ var routing = (0, _emberMetal.get)(this, '_routing');
+ return function () {
+ payload.transition = routing.transitionTo(qualifiedRouteName, models, queryParams, shouldReplace);
+ };
+ },
+
+ queryParams: null,
+ qualifiedRouteName: (0, _emberMetal.computed)('targetRouteName', '_routing.currentState', function computeLinkToComponentQualifiedRouteName() {
+ var params = (0, _emberMetal.get)(this, 'params');
+ var paramsLength = params.length;
+ var lastParam = params[paramsLength - 1];
+ if (lastParam && lastParam.isQueryParams) {
+ paramsLength--;
+ }
+ var onlyQueryParamsSupplied = this[_component.HAS_BLOCK] ? paramsLength === 0 : paramsLength === 1;
+ if (onlyQueryParamsSupplied) {
+ return (0, _emberMetal.get)(this, '_routing.currentRouteName');
+ }
+ return (0, _emberMetal.get)(this, 'targetRouteName');
+ }),
+ resolvedQueryParams: (0, _emberMetal.computed)('queryParams', function computeLinkToComponentResolvedQueryParams() {
+ var resolvedQueryParams = {};
+ var queryParams = (0, _emberMetal.get)(this, 'queryParams');
+ if (!queryParams) {
+ return resolvedQueryParams;
+ }
+ var values = queryParams.values;
+ for (var key in values) {
+ if (!values.hasOwnProperty(key)) {
+ continue;
+ }
+ resolvedQueryParams[key] = values[key];
+ }
+ return resolvedQueryParams;
+ }),
+ /**
+ Sets the element's `href` attribute to the url for
+ the `LinkComponent`'s targeted route.
+ If the `LinkComponent`'s `tagName` is changed to a value other
+ than `a`, this property will be ignored.
+ @property href
+ @private
+ */
+ href: (0, _emberMetal.computed)('models', 'qualifiedRouteName', function computeLinkToComponentHref() {
+ if ((0, _emberMetal.get)(this, 'tagName') !== 'a') {
+ return;
+ }
+ var qualifiedRouteName = (0, _emberMetal.get)(this, 'qualifiedRouteName');
+ var models = (0, _emberMetal.get)(this, 'models');
+ if ((0, _emberMetal.get)(this, 'loading')) {
+ return (0, _emberMetal.get)(this, 'loadingHref');
+ }
+ var routing = (0, _emberMetal.get)(this, '_routing');
+ var queryParams = (0, _emberMetal.get)(this, 'queryParams.values');
+ if (true) {
+ /*
+ * Unfortunately, to get decent error messages, we need to do this.
+ * In some future state we should be able to use a "feature flag"
+ * which allows us to strip this without needing to call it twice.
+ *
+ * if (isDebugBuild()) {
+ * // Do the useful debug thing, probably including try/catch.
+ * } else {
+ * // Do the performant thing.
+ * }
+ */
+ try {
+ routing.generateURL(qualifiedRouteName, models, queryParams);
+ } catch (e) {
+ (true && !(false) && (0, _emberDebug.assert)('You attempted to define a `{{link-to "' + qualifiedRouteName + '"}}` but did not pass the parameters required for generating its dynamic segments. ' + e.message));
+ }
+ }
+ return routing.generateURL(qualifiedRouteName, models, queryParams);
+ }),
+ loading: (0, _emberMetal.computed)('_modelsAreLoaded', 'qualifiedRouteName', function computeLinkToComponentLoading() {
+ var qualifiedRouteName = (0, _emberMetal.get)(this, 'qualifiedRouteName');
+ var modelsAreLoaded = (0, _emberMetal.get)(this, '_modelsAreLoaded');
+ if (!modelsAreLoaded || qualifiedRouteName === null || qualifiedRouteName === undefined) {
+ return (0, _emberMetal.get)(this, 'loadingClass');
+ }
+ }),
+ _modelsAreLoaded: (0, _emberMetal.computed)('models', function computeLinkToComponentModelsAreLoaded() {
+ var models = (0, _emberMetal.get)(this, 'models');
+ for (var i = 0; i < models.length; i++) {
+ var model = models[i];
+ if (model === null || model === undefined) {
+ return false;
+ }
+ }
+ return true;
+ }),
+ _getModels: function (params) {
+ var modelCount = params.length - 1;
+ var models = new Array(modelCount);
+ for (var i = 0; i < modelCount; i++) {
+ var value = params[i + 1];
+ models[i] = value;
+ }
+ return models;
+ },
+
+ /**
+ The default href value to use while a link-to is loading.
+ Only applies when tagName is 'a'
+ @property loadingHref
+ @type String
+ @default #
+ @private
+ */
+ loadingHref: '#',
+ didReceiveAttrs: function () {
+ var queryParams = void 0;
+ var params = (0, _emberMetal.get)(this, 'params');
+ if (params) {
+ // Do not mutate params in place
+ params = params.slice();
+ }
+ (true && !(params && params.length) && (0, _emberDebug.assert)('You must provide one or more parameters to the link-to component.', params && params.length));
+
+ var disabledWhen = (0, _emberMetal.get)(this, 'disabledWhen');
+ if (disabledWhen !== undefined) {
+ this.set('disabled', disabledWhen);
+ }
+ // Process the positional arguments, in order.
+ // 1. Inline link title comes first, if present.
+ if (!this[_component.HAS_BLOCK]) {
+ this.set('linkTitle', params.shift());
+ }
+ // 2. `targetRouteName` is now always at index 0.
+ this.set('targetRouteName', params[0]);
+ // 3. The last argument (if still remaining) is the `queryParams` object.
+ var lastParam = params[params.length - 1];
+ if (lastParam && lastParam.isQueryParams) {
+ queryParams = params.pop();
+ } else {
+ queryParams = { values: {} };
+ }
+ this.set('queryParams', queryParams);
+ // 4. Any remaining indices (excepting `targetRouteName` at 0) are `models`.
+ if (params.length > 1) {
+ this.set('models', this._getModels(params));
+ } else {
+ this.set('models', []);
+ }
+ }
+ }); /**
+ @module ember
+ */
+ /**
+ The `{{link-to}}` component renders a link to the supplied
+ `routeName` passing an optionally supplied model to the
+ route as its `model` context of the route. The block
+ for `{{link-to}}` becomes the innerHTML of the rendered
+ element:
+
+ ```handlebars
+ {{#link-to 'photoGallery'}}
+ Great Hamster Photos
+ {{/link-to}}
+ ```
+
+ You can also use an inline form of `{{link-to}}` component by
+ passing the link text as the first argument
+ to the component:
+
+ ```handlebars
+ {{link-to 'Great Hamster Photos' 'photoGallery'}}
+ ```
+
+ Both will result in:
+
+ ```html
+ <a href="/hamster-photos">
+ Great Hamster Photos
+ </a>
+ ```
+
+ ### Supplying a tagName
+ By default `{{link-to}}` renders an `<a>` element. This can
+ be overridden for a single use of `{{link-to}}` by supplying
+ a `tagName` option:
+
+ ```handlebars
+ {{#link-to 'photoGallery' tagName="li"}}
+ Great Hamster Photos
+ {{/link-to}}
+ ```
+
+ ```html
+ <li>
+ Great Hamster Photos
+ </li>
+ ```
+
+ To override this option for your entire application, see
+ "Overriding Application-wide Defaults".
+
+ ### Disabling the `link-to` component
+ By default `{{link-to}}` is enabled.
+ any passed value to the `disabled` component property will disable
+ the `link-to` component.
+
+ static use: the `disabled` option:
+
+ ```handlebars
+ {{#link-to 'photoGallery' disabled=true}}
+ Great Hamster Photos
+ {{/link-to}}
+ ```
+
+ dynamic use: the `disabledWhen` option:
+
+ ```handlebars
+ {{#link-to 'photoGallery' disabledWhen=controller.someProperty}}
+ Great Hamster Photos
+ {{/link-to}}
+ ```
+
+ any truthy value passed to `disabled` will disable it except `undefined`.
+
+ See "Overriding Application-wide Defaults" for more.
+
+ ### Handling `href`
+ `{{link-to}}` will use your application's Router to
+ fill the element's `href` property with a url that
+ matches the path to the supplied `routeName` for your
+ router's configured `Location` scheme, which defaults
+ to HashLocation.
+
+ ### Handling current route
+ `{{link-to}}` will apply a CSS class name of 'active'
+ when the application's current route matches
+ the supplied routeName. For example, if the application's
+ current route is 'photoGallery.recent' the following
+ use of `{{link-to}}`:
+
+ ```handlebars
+ {{#link-to 'photoGallery.recent'}}
+ Great Hamster Photos
+ {{/link-to}}
+ ```
+
+ will result in
+
+ ```html
+ <a href="/hamster-photos/this-week" class="active">
+ Great Hamster Photos
+ </a>
+ ```
+
+ The CSS class name used for active classes can be customized
+ for a single use of `{{link-to}}` by passing an `activeClass`
+ option:
+
+ ```handlebars
+ {{#link-to 'photoGallery.recent' activeClass="current-url"}}
+ Great Hamster Photos
+ {{/link-to}}
+ ```
+
+ ```html
+ <a href="/hamster-photos/this-week" class="current-url">
+ Great Hamster Photos
+ </a>
+ ```
+
+ To override this option for your entire application, see
+ "Overriding Application-wide Defaults".
+
+ ### Keeping a link active for other routes
+
+ If you need a link to be 'active' even when it doesn't match
+ the current route, you can use the `current-when` argument.
+
+ ```handlebars
+ {{#link-to 'photoGallery' current-when='photos'}}
+ Photo Gallery
+ {{/link-to}}
+ ```
+
+ This may be helpful for keeping links active for:
+
+ * non-nested routes that are logically related
+ * some secondary menu approaches
+ * 'top navigation' with 'sub navigation' scenarios
+
+ A link will be active if `current-when` is `true` or the current
+ route is the route this link would transition to.
+
+ To match multiple routes 'space-separate' the routes:
+
+ ```handlebars
+ {{#link-to 'gallery' current-when='photos drawings paintings'}}
+ Art Gallery
+ {{/link-to}}
+ ```
+
+ ### Supplying a model
+ An optional model argument can be used for routes whose
+ paths contain dynamic segments. This argument will become
+ the model context of the linked route:
+
+ ```javascript
+ Router.map(function() {
+ this.route("photoGallery", {path: "hamster-photos/:photo_id"});
+ });
+ ```
+
+ ```handlebars
+ {{#link-to 'photoGallery' aPhoto}}
+ {{aPhoto.title}}
+ {{/link-to}}
+ ```
+
+ ```html
+ <a href="/hamster-photos/42">
+ Tomster
+ </a>
+ ```
+
+ ### Supplying multiple models
+ For deep-linking to route paths that contain multiple
+ dynamic segments, multiple model arguments can be used.
+ As the router transitions through the route path, each
+ supplied model argument will become the context for the
+ route with the dynamic segments:
+
+ ```javascript
+ Router.map(function() {
+ this.route("photoGallery", { path: "hamster-photos/:photo_id" }, function() {
+ this.route("comment", {path: "comments/:comment_id"});
+ });
+ });
+ ```
+ This argument will become the model context of the linked route:
+
+ ```handlebars
+ {{#link-to 'photoGallery.comment' aPhoto comment}}
+ {{comment.body}}
+ {{/link-to}}
+ ```
+
+ ```html
+ <a href="/hamster-photos/42/comments/718">
+ A+++ would snuggle again.
+ </a>
+ ```
+
+ ### Supplying an explicit dynamic segment value
+ If you don't have a model object available to pass to `{{link-to}}`,
+ an optional string or integer argument can be passed for routes whose
+ paths contain dynamic segments. This argument will become the value
+ of the dynamic segment:
+
+ ```javascript
+ Router.map(function() {
+ this.route("photoGallery", { path: "hamster-photos/:photo_id" });
+ });
+ ```
+
+ ```handlebars
+ {{#link-to 'photoGallery' aPhotoId}}
+ {{aPhoto.title}}
+ {{/link-to}}
+ ```
+
+ ```html
+ <a href="/hamster-photos/42">
+ Tomster
+ </a>
+ ```
+
+ When transitioning into the linked route, the `model` hook will
+ be triggered with parameters including this passed identifier.
+
+ ### Allowing Default Action
+
+ By default the `{{link-to}}` component prevents the default browser action
+ by calling `preventDefault()` as this sort of action bubbling is normally
+ handled internally and we do not want to take the browser to a new URL (for
+ example).
+
+ If you need to override this behavior specify `preventDefault=false` in
+ your template:
+
+ ```handlebars
+ {{#link-to 'photoGallery' aPhotoId preventDefault=false}}
+ {{aPhotoId.title}}
+ {{/link-to}}
+ ```
+
+ ### Overriding attributes
+ You can override any given property of the `LinkComponent`
+ that is generated by the `{{link-to}}` component by passing
+ key/value pairs, like so:
+
+ ```handlebars
+ {{#link-to aPhoto tagName='li' title='Following this link will change your life' classNames='pic sweet'}}
+ Uh-mazing!
+ {{/link-to}}
+ ```
+
+ See [LinkComponent](/api/ember/release/classes/LinkComponent) for a
+ complete list of overrideable properties. Be sure to also
+ check out inherited properties of `LinkComponent`.
+
+ ### Overriding Application-wide Defaults
+
+ ``{{link-to}}`` creates an instance of `LinkComponent` for rendering. To
+ override options for your entire application, export your customized
+ `LinkComponent` from `app/components/link-to.js` with the desired overrides:
+
+ ```javascript
+ // app/components/link-to.js
+ import LinkComponent from '@ember/routing/link-component';
+
+ export default LinkComponent.extend({
+ activeClass: "is-active",
+ tagName: 'li'
+ })
+ ```
+
+ It is also possible to override the default event in this manner:
+
+ ```javascript
+ import LinkCompoennt from '@ember/routing/link-component';
+
+ export default LinkComponent.extend({
+ eventName: 'customEventName'
+ });
+ ```
+
+ @method link-to
+ @for Ember.Templates.helpers
+ @param {String} routeName
+ @param {Object} [context]*
+ @param [options] {Object} Handlebars key/value pairs of options, you can override any property of Ember.LinkComponent
+ @return {String} HTML string
+ @see {LinkComponent}
+ @public
+ */
+
+ LinkComponent.toString = function () {
+ return 'LinkComponent';
+ };
+ LinkComponent.reopenClass({
+ positionalParams: 'params'
+ });
+ exports.default = LinkComponent;
+});
+enifed('ember-glimmer/components/text_area', ['exports', 'ember-views', 'ember-glimmer/component', 'ember-glimmer/templates/empty'], function (exports, _emberViews, _component, _empty) {
+ 'use strict';
+
+ exports.default = _component.default.extend(_emberViews.TextSupport, {
+ classNames: ['ember-text-area'],
+ layout: _empty.default,
+ tagName: 'textarea',
+ attributeBindings: ['rows', 'cols', 'name', 'selectionEnd', 'selectionStart', 'wrap', 'lang', 'dir', 'value'],
+ rows: null,
+ cols: null
+ });
+});
+enifed('ember-glimmer/components/text_field', ['exports', 'ember-environment', 'ember-metal', 'ember-views', 'ember-glimmer/component', 'ember-glimmer/templates/empty'], function (exports, _emberEnvironment, _emberMetal, _emberViews, _component, _empty) {
+ 'use strict';
+
+ var inputTypes = Object.create(null); /**
+ @module @ember/component
+ */
+
+ function canSetTypeOfInput(type) {
+ if (type in inputTypes) {
+ return inputTypes[type];
+ }
+ // if running in outside of a browser always return the
+ // original type
+ if (!_emberEnvironment.environment.hasDOM) {
+ inputTypes[type] = type;
+ return type;
+ }
+ var inputTypeTestElement = document.createElement('input');
+ try {
+ inputTypeTestElement.type = type;
+ } catch (e) {
+ // ignored
+ }
+ return inputTypes[type] = inputTypeTestElement.type === type;
+ }
+ /**
+
+ The internal class used to create text inputs when the `{{input}}`
+ helper is used with `type` of `text`.
+
+ See [Ember.Templates.helpers.input](/api/ember/release/classes/Ember.Templates.helpers/methods/input?anchor=input) for usage details.
+
+ ## Layout and LayoutName properties
+
+ Because HTML `input` elements are self closing `layout` and `layoutName`
+ properties will not be applied.
+
+ @class TextField
+ @extends Component
+ @uses Ember.TextSupport
+ @public
+ */
+ exports.default = _component.default.extend(_emberViews.TextSupport, {
+ layout: _empty.default,
+ classNames: ['ember-text-field'],
+ tagName: 'input',
+ attributeBindings: ['accept', 'autocomplete', 'autosave', 'dir', 'formaction', 'formenctype', 'formmethod', 'formnovalidate', 'formtarget', 'height', 'inputmode', 'lang', 'list', 'type', 'max', 'min', 'multiple', 'name', 'pattern', 'size', 'step', 'value', 'width'],
+ /**
+ The `value` attribute of the input element. As the user inputs text, this
+ property is updated live.
+ @property value
+ @type String
+ @default ""
+ @public
+ */
+ value: '',
+ /**
+ The `type` attribute of the input element.
+ @property type
+ @type String
+ @default "text"
+ @public
+ */
+ type: (0, _emberMetal.computed)({
+ get: function () {
+ return 'text';
+ },
+ set: function (_key, value) {
+ var type = 'text';
+ if (canSetTypeOfInput(value)) {
+ type = value;
+ }
+ return type;
+ }
+ }),
+ /**
+ The `size` of the text field in characters.
+ @property size
+ @type String
+ @default null
+ @public
+ */
+ size: null,
+ /**
+ The `pattern` attribute of input element.
+ @property pattern
+ @type String
+ @default null
+ @public
+ */
+ pattern: null,
+ /**
+ The `min` attribute of input element used with `type="number"` or `type="range"`.
+ @property min
+ @type String
+ @default null
+ @since 1.4.0
+ @public
+ */
+ min: null,
+ /**
+ The `max` attribute of input element used with `type="number"` or `type="range"`.
+ @property max
+ @type String
+ @default null
+ @since 1.4.0
+ @public
+ */
+ max: null
+ });
+});
+enifed('ember-glimmer/dom', ['exports', '@glimmer/runtime', '@glimmer/node'], function (exports, _runtime, _node) {
+ 'use strict';
+
+ Object.defineProperty(exports, 'DOMChanges', {
+ enumerable: true,
+ get: function () {
+ return _runtime.DOMChanges;
+ }
+ });
+ Object.defineProperty(exports, 'DOMTreeConstruction', {
+ enumerable: true,
+ get: function () {
+ return _runtime.DOMTreeConstruction;
+ }
+ });
+ Object.defineProperty(exports, 'NodeDOMTreeConstruction', {
+ enumerable: true,
+ get: function () {
+ return _node.NodeDOMTreeConstruction;
+ }
+ });
+});
+enifed('ember-glimmer/environment', ['exports', 'ember-babel', '@glimmer/runtime', 'ember-debug', 'ember-metal', 'ember-utils', 'ember-views', 'ember-glimmer/component-managers/curly', 'ember-glimmer/component-managers/template-only', 'ember-glimmer/syntax', 'ember-glimmer/utils/debug-stack', 'ember-glimmer/utils/iterable', 'ember-glimmer/utils/references', 'ember-glimmer/helpers/-class', 'ember-glimmer/helpers/-html-safe', 'ember-glimmer/helpers/-input-type', 'ember-glimmer/helpers/-normalize-class', 'ember-glimmer/helpers/action', 'ember-glimmer/helpers/component', 'ember-glimmer/helpers/concat', 'ember-glimmer/helpers/each-in', 'ember-glimmer/helpers/get', 'ember-glimmer/helpers/hash', 'ember-glimmer/helpers/if-unless', 'ember-glimmer/helpers/log', 'ember-glimmer/helpers/mut', 'ember-glimmer/helpers/query-param', 'ember-glimmer/helpers/readonly', 'ember-glimmer/helpers/unbound', 'ember-glimmer/modifiers/action', 'ember-glimmer/protocol-for-url', 'ember/features'], function (exports, _emberBabel, _runtime, _emberDebug, _emberMetal, _emberUtils, _emberViews, _curly, _templateOnly, _syntax, _debugStack, _iterable, _references, _class, _htmlSafe, _inputType, _normalizeClass, _action, _component, _concat, _eachIn, _get, _hash, _ifUnless, _log, _mut, _queryParam, _readonly, _unbound, _action2, _protocolForUrl, _features) {
+ 'use strict';
+
+ function instrumentationPayload(name) {
+ return { object: 'component:' + name };
+ }
+ function isTemplateFactory(template) {
+ return typeof template.create === 'function';
+ }
+
+ var Environment = function (_GlimmerEnvironment) {
+ (0, _emberBabel.inherits)(Environment, _GlimmerEnvironment);
+
+ Environment.create = function create(options) {
+ return new this(options);
+ };
+
+ function Environment(injections) {
+ (0, _emberBabel.classCallCheck)(this, Environment);
+
+ var _this = (0, _emberBabel.possibleConstructorReturn)(this, _GlimmerEnvironment.call(this, injections));
+
+ _this.owner = injections[_emberUtils.OWNER];
+ _this.isInteractive = _this.owner.lookup('-environment:main').isInteractive;
+ // can be removed once https://github.com/tildeio/glimmer/pull/305 lands
+ _this.destroyedComponents = [];
+ (0, _protocolForUrl.default)(_this);
+ _this._definitionCache = new _emberMetal.Cache(2000, function (_ref) {
+ var name = _ref.name,
+ source = _ref.source,
+ owner = _ref.owner;
+
+ var _lookupComponent = (0, _emberViews.lookupComponent)(owner, name, { source: source }),
+ componentFactory = _lookupComponent.component,
+ layout = _lookupComponent.layout;
+
+ var customManager = void 0;
+ if (_features.EMBER_GLIMMER_TEMPLATE_ONLY_COMPONENTS && layout && !componentFactory) {
+ return new _templateOnly.TemplateOnlyComponentDefinition(name, layout);
+ } else if (componentFactory || layout) {
+ if (_features.GLIMMER_CUSTOM_COMPONENT_MANAGER) {
+ var managerId = layout && layout.meta.managerId;
+ if (managerId) {
+ customManager = owner.factoryFor('component-manager:' + managerId).class;
+ }
+ }
+ return new _curly.CurlyComponentDefinition(name, componentFactory, layout, undefined, customManager);
+ }
+ return undefined;
+ }, function (_ref2) {
+ var name = _ref2.name,
+ source = _ref2.source,
+ owner = _ref2.owner;
+
+ var expandedName = source && _this._resolveLocalLookupName(name, source, owner) || name;
+ var ownerGuid = (0, _emberUtils.guidFor)(owner);
+ return ownerGuid + '|' + expandedName;
+ });
+ _this._templateCache = new _emberMetal.Cache(1000, function (_ref3) {
+ var Template = _ref3.Template,
+ owner = _ref3.owner;
+
+ if (isTemplateFactory(Template)) {
+ var _Template$create;
+
+ // we received a factory
+ return Template.create((_Template$create = { env: _this }, _Template$create[_emberUtils.OWNER] = owner, _Template$create));
+ } else {
+ // we were provided an instance already
+ return Template;
+ }
+ }, function (_ref4) {
+ var Template = _ref4.Template,
+ owner = _ref4.owner;
+ return (0, _emberUtils.guidFor)(owner) + '|' + Template.id;
+ });
+ _this._compilerCache = new _emberMetal.Cache(10, function (Compiler) {
+ return new _emberMetal.Cache(2000, function (template) {
+ var compilable = new Compiler(template);
+ return (0, _runtime.compileLayout)(compilable, _this);
+ }, function (template) {
+ var owner = template.meta.owner;
+ return (0, _emberUtils.guidFor)(owner) + '|' + template.id;
+ });
+ }, function (Compiler) {
+ return Compiler.id;
+ });
+ _this.builtInModifiers = {
+ action: new _action2.default()
+ };
+ _this.builtInHelpers = {
+ 'if': _ifUnless.inlineIf,
+ action: _action.default,
+ concat: _concat.default,
+ get: _get.default,
+ hash: _hash.default,
+ log: _log.default,
+ mut: _mut.default,
+ 'query-params': _queryParam.default,
+ readonly: _readonly.default,
+ unbound: _unbound.default,
+ 'unless': _ifUnless.inlineUnless,
+ '-class': _class.default,
+ '-each-in': _eachIn.default,
+ '-input-type': _inputType.default,
+ '-normalize-class': _normalizeClass.default,
+ '-html-safe': _htmlSafe.default,
+ '-get-dynamic-var': _runtime.getDynamicVar
+ };
+ if (true) {
+ _this.debugStack = new _debugStack.default();
+ }
+ return _this;
+ }
+ // this gets clobbered by installPlatformSpecificProtocolForURL
+ // it really should just delegate to a platform specific injection
+
+
+ Environment.prototype.protocolForURL = function protocolForURL(s) {
+ return s;
+ };
+
+ Environment.prototype._resolveLocalLookupName = function _resolveLocalLookupName(name, source, owner) {
+ return _features.EMBER_MODULE_UNIFICATION ? source + ':' + name : owner._resolveLocalLookupName(name, source);
+ };
+
+ Environment.prototype.macros = function macros() {
+ var macros = _GlimmerEnvironment.prototype.macros.call(this);
+ (0, _syntax.populateMacros)(macros.blocks, macros.inlines);
+ return macros;
+ };
+
+ Environment.prototype.hasComponentDefinition = function hasComponentDefinition() {
+ return false;
+ };
+
+ Environment.prototype.getComponentDefinition = function getComponentDefinition(name, _ref5) {
+ var owner = _ref5.owner,
+ moduleName = _ref5.moduleName;
+
+ var finalizer = (0, _emberMetal._instrumentStart)('render.getComponentDefinition', instrumentationPayload, name);
+ var source = moduleName && 'template:' + moduleName;
+ var definition = this._definitionCache.get({ name: name, source: source, owner: owner });
+ finalizer();
+ // TODO the glimmer-vm wants this to always have a def
+ // but internally we need it to sometimes be undefined
+ return definition;
+ };
+
+ Environment.prototype.getTemplate = function getTemplate(Template, owner) {
+ return this._templateCache.get({ Template: Template, owner: owner });
+ };
+
+ Environment.prototype.getCompiledBlock = function getCompiledBlock(Compiler, template) {
+ var compilerCache = this._compilerCache.get(Compiler);
+ return compilerCache.get(template);
+ };
+
+ Environment.prototype.hasPartial = function hasPartial(name, meta) {
+ return (0, _emberViews.hasPartial)(name, meta.owner);
+ };
+
+ Environment.prototype.lookupPartial = function lookupPartial(name, meta) {
+ var partial = {
+ name: name,
+ template: (0, _emberViews.lookupPartial)(name, meta.owner)
+ };
+ if (partial.template) {
+ return partial;
+ } else {
+ throw new Error(name + ' is not a partial');
+ }
+ };
+
+ Environment.prototype.hasHelper = function hasHelper(name, _ref6) {
+ var owner = _ref6.owner,
+ moduleName = _ref6.moduleName;
+
+ if (name === 'component' || this.builtInHelpers[name]) {
+ return true;
+ }
+ var options = { source: 'template:' + moduleName };
+ return owner.hasRegistration('helper:' + name, options) || owner.hasRegistration('helper:' + name);
+ };
+
+ Environment.prototype.lookupHelper = function lookupHelper(name, meta) {
+ if (name === 'component') {
+ return function (vm, args) {
+ return (0, _component.default)(vm, args, meta);
+ };
+ }
+ var owner = meta.owner,
+ moduleName = meta.moduleName;
+
+ var helper = this.builtInHelpers[name];
+ if (helper) {
+ return helper;
+ }
+ var options = moduleName && { source: 'template:' + moduleName } || {};
+ var helperFactory = owner.factoryFor('helper:' + name, options) || owner.factoryFor('helper:' + name);
+ // TODO: try to unify this into a consistent protocol to avoid wasteful closure allocations
+ var HelperReference = void 0;
+ if (helperFactory.class.isSimpleHelperFactory) {
+ HelperReference = _references.SimpleHelperReference;
+ } else if (helperFactory.class.isHelperFactory) {
+ HelperReference = _references.ClassBasedHelperReference;
+ } else {
+ throw new Error(name + ' is not a helper');
+ }
+ return function (vm, args) {
+ return HelperReference.create(helperFactory, vm, args.capture());
+ };
+ };
+
+ Environment.prototype.hasModifier = function hasModifier(name) {
+ return !!this.builtInModifiers[name];
+ };
+
+ Environment.prototype.lookupModifier = function lookupModifier(name) {
+ var modifier = this.builtInModifiers[name];
+ if (modifier) {
+ return modifier;
+ } else {
+ throw new Error(name + ' is not a modifier');
+ }
+ };
+
+ Environment.prototype.toConditionalReference = function toConditionalReference(reference) {
+ return _references.ConditionalReference.create(reference);
+ };
+
+ Environment.prototype.iterableFor = function iterableFor(ref, key) {
+ return (0, _iterable.default)(ref, key);
+ };
+
+ Environment.prototype.scheduleInstallModifier = function scheduleInstallModifier(modifier, manager) {
+ if (this.isInteractive) {
+ _GlimmerEnvironment.prototype.scheduleInstallModifier.call(this, modifier, manager);
+ }
+ };
+
+ Environment.prototype.scheduleUpdateModifier = function scheduleUpdateModifier(modifier, manager) {
+ if (this.isInteractive) {
+ _GlimmerEnvironment.prototype.scheduleUpdateModifier.call(this, modifier, manager);
+ }
+ };
+
+ Environment.prototype.didDestroy = function didDestroy(destroyable) {
+ destroyable.destroy();
+ };
+
+ Environment.prototype.begin = function begin() {
+ this.inTransaction = true;
+ _GlimmerEnvironment.prototype.begin.call(this);
+ };
+
+ Environment.prototype.commit = function commit() {
+ var destroyedComponents = this.destroyedComponents;
+ this.destroyedComponents = [];
+ // components queued for destruction must be destroyed before firing
+ // `didCreate` to prevent errors when removing and adding a component
+ // with the same name (would throw an error when added to view registry)
+ for (var i = 0; i < destroyedComponents.length; i++) {
+ destroyedComponents[i].destroy();
+ }
+ _GlimmerEnvironment.prototype.commit.call(this);
+ this.inTransaction = false;
+ };
+
+ return Environment;
+ }(_runtime.Environment);
+
+ exports.default = Environment;
+
+ if (true) {
+ var StyleAttributeManager = function (_AttributeManager) {
+ (0, _emberBabel.inherits)(StyleAttributeManager, _AttributeManager);
+
+ function StyleAttributeManager() {
+ (0, _emberBabel.classCallCheck)(this, StyleAttributeManager);
+ return (0, _emberBabel.possibleConstructorReturn)(this, _AttributeManager.apply(this, arguments));
+ }
+
+ StyleAttributeManager.prototype.setAttribute = function setAttribute(dom, element, value) {
+ (true && (0, _emberDebug.warn)((0, _emberViews.constructStyleDeprecationMessage)(value), function () {
+ if (value === null || value === undefined || (0, _runtime.isSafeString)(value)) {
+ return true;
+ }
+ return false;
+ }(), { id: 'ember-htmlbars.style-xss-warning' }));
+
+ _AttributeManager.prototype.setAttribute.call(this, dom, element, value);
+ };
+
+ StyleAttributeManager.prototype.updateAttribute = function updateAttribute(dom, element, value) {
+ (true && (0, _emberDebug.warn)((0, _emberViews.constructStyleDeprecationMessage)(value), function () {
+ if (value === null || value === undefined || (0, _runtime.isSafeString)(value)) {
+ return true;
+ }
+ return false;
+ }(), { id: 'ember-htmlbars.style-xss-warning' }));
+
+ _AttributeManager.prototype.updateAttribute.call(this, dom, element, value);
+ };
+
+ return StyleAttributeManager;
+ }(_runtime.AttributeManager);
+
+ var STYLE_ATTRIBUTE_MANANGER = new StyleAttributeManager('style');
+ Environment.prototype.attributeFor = function (element, attribute, isTrusting) {
+ if (attribute === 'style' && !isTrusting) {
+ return STYLE_ATTRIBUTE_MANANGER;
+ }
+ return _runtime.Environment.prototype.attributeFor.call(this, element, attribute, isTrusting);
+ };
+ }
+});
+enifed('ember-glimmer/helper', ['exports', 'ember-babel', '@glimmer/reference', 'ember-runtime', 'ember-utils'], function (exports, _emberBabel, _reference, _emberRuntime, _emberUtils) {
+ 'use strict';
+
+ exports.SimpleHelper = exports.RECOMPUTE_TAG = undefined;
+ exports.helper = helper;
+ var RECOMPUTE_TAG = exports.RECOMPUTE_TAG = (0, _emberUtils.symbol)('RECOMPUTE_TAG');
+ /**
+ Ember Helpers are functions that can compute values, and are used in templates.
+ For example, this code calls a helper named `format-currency`:
+
+ ```handlebars
+ <div>{{format-currency cents currency="$"}}</div>
+ ```
+
+ Additionally a helper can be called as a nested helper (sometimes called a
+ subexpression). In this example, the computed value of a helper is passed
+ to a component named `show-money`:
+
+ ```handlebars
+ {{show-money amount=(format-currency cents currency="$")}}
+ ```
+
+ Helpers defined using a class must provide a `compute` function. For example:
+
+ ```app/helpers/format-currency.js
+ import Helper from '@ember/component/helper';
+
+ export default Helper.extend({
+ compute(params, hash) {
+ let cents = params[0];
+ let currency = hash.currency;
+ return `${currency}${cents * 0.01}`;
+ }
+ });
+ ```
+
+ Each time the input to a helper changes, the `compute` function will be
+ called again.
+
+ As instances, these helpers also have access to the container an will accept
+ injected dependencies.
+
+ Additionally, class helpers can call `recompute` to force a new computation.
+
+ @class Helper
+ @public
+ @since 1.13.0
+ */
+ /**
+ @module @ember/component
+ */
+ var Helper = _emberRuntime.FrameworkObject.extend({
+ isHelperInstance: true,
+ init: function () {
+ this._super.apply(this, arguments);
+ this[RECOMPUTE_TAG] = new _reference.DirtyableTag();
+ },
+ recompute: function () {
+ this[RECOMPUTE_TAG].dirty();
+ }
+ });
+ Helper.reopenClass({
+ isHelperFactory: true
+ });
+
+ var SimpleHelper = exports.SimpleHelper = function () {
+ function SimpleHelper(compute) {
+ (0, _emberBabel.classCallCheck)(this, SimpleHelper);
+
+ this.compute = compute;
+ this.isHelperFactory = true;
+ this.isHelperInstance = true;
+ this.isSimpleHelperFactory = true;
+ }
+
+ SimpleHelper.prototype.create = function create() {
+ return this;
+ };
+
+ return SimpleHelper;
+ }();
+
+ /**
+ In many cases, the ceremony of a full `Helper` class is not required.
+ The `helper` method create pure-function helpers without instances. For
+ example:
+
+ ```app/helpers/format-currency.js
+ import { helper } from '@ember/component/helper';
+
+ export default helper(function(params, hash) {
+ let cents = params[0];
+ let currency = hash.currency;
+ return `${currency}${cents * 0.01}`;
+ });
+ ```
+
+ @static
+ @param {Function} helper The helper function
+ @method helper
+ @for @ember/component/helper
+ @public
+ @since 1.13.0
+ */
+ function helper(helperFn) {
+ return new SimpleHelper(helperFn);
+ }
+ exports.default = Helper;
+});
+enifed('ember-glimmer/helpers/-class', ['exports', 'ember-runtime', 'ember-glimmer/utils/references'], function (exports, _emberRuntime, _references) {
+ 'use strict';
+
+ exports.default = function (_vm, args) {
+ return new _references.InternalHelperReference(classHelper, args.capture());
+ };
+
+ function classHelper(_ref) {
+ var positional = _ref.positional;
+
+ var path = positional.at(0);
+ var args = positional.length;
+ var value = path.value();
+ if (value === true) {
+ if (args > 1) {
+ return _emberRuntime.String.dasherize(positional.at(1).value());
+ }
+ return null;
+ }
+ if (value === false) {
+ if (args > 2) {
+ return _emberRuntime.String.dasherize(positional.at(2).value());
+ }
+ return null;
+ }
+ return value;
+ }
+});
+enifed('ember-glimmer/helpers/-html-safe', ['exports', 'ember-glimmer/utils/references', 'ember-glimmer/utils/string'], function (exports, _references, _string) {
+ 'use strict';
+
+ exports.default = function (_vm, args) {
+ return new _references.InternalHelperReference(htmlSafe, args.capture());
+ };
+
+ function htmlSafe(_ref) {
+ var positional = _ref.positional;
+
+ var path = positional.at(0);
+ return new _string.SafeString(path.value());
+ }
+});
+enifed('ember-glimmer/helpers/-input-type', ['exports', 'ember-glimmer/utils/references'], function (exports, _references) {
+ 'use strict';
+
+ exports.default = function (_vm, args) {
+ return new _references.InternalHelperReference(inputTypeHelper, args.capture());
+ };
+
+ function inputTypeHelper(_ref) {
+ var positional = _ref.positional;
+
+ var type = positional.at(0).value();
+ if (type === 'checkbox') {
+ return '-checkbox';
+ }
+ return '-text-field';
+ }
+});
+enifed('ember-glimmer/helpers/-normalize-class', ['exports', 'ember-runtime', 'ember-glimmer/utils/references'], function (exports, _emberRuntime, _references) {
+ 'use strict';
+
+ exports.default = function (_vm, args) {
+ return new _references.InternalHelperReference(normalizeClass, args.capture());
+ };
+
+ function normalizeClass(_ref) {
+ var positional = _ref.positional;
+
+ var classNameParts = positional.at(0).value().split('.');
+ var className = classNameParts[classNameParts.length - 1];
+ var value = positional.at(1).value();
+ if (value === true) {
+ return _emberRuntime.String.dasherize(className);
+ } else if (!value && value !== 0) {
+ return '';
+ } else {
+ return String(value);
+ }
+ }
+});
+enifed('ember-glimmer/helpers/action', ['exports', '@glimmer/reference', 'ember-debug', 'ember-metal', 'ember-utils', 'ember-glimmer/utils/references'], function (exports, _reference, _emberDebug, _emberMetal, _emberUtils, _references) {
+ 'use strict';
+
+ exports.ACTION = exports.INVOKE = undefined;
+
+ exports.default = function (_vm, args) {
+ var named = args.named,
+ positional = args.positional;
+
+ var capturedArgs = positional.capture();
+ // The first two argument slots are reserved.
+ // pos[0] is the context (or `this`)
+ // pos[1] is the action name or function
+ // Anything else is an action argument.
+
+ var _capturedArgs$referen = capturedArgs.references,
+ context = _capturedArgs$referen[0],
+ action = _capturedArgs$referen[1],
+ restArgs = _capturedArgs$referen.slice(2);
+ // TODO: Is there a better way of doing this?
+
+
+ var debugKey = action._propertyKey;
+ var target = named.has('target') ? named.get('target') : context;
+ var processArgs = makeArgsProcessor(named.has('value') && named.get('value'), restArgs);
+ var fn = void 0;
+ if (typeof action[INVOKE] === 'function') {
+ fn = makeClosureAction(action, action, action[INVOKE], processArgs, debugKey);
+ } else if ((0, _reference.isConst)(target) && (0, _reference.isConst)(action)) {
+ fn = makeClosureAction(context.value(), target.value(), action.value(), processArgs, debugKey);
+ } else {
+ fn = makeDynamicClosureAction(context.value(), target, action, processArgs, debugKey);
+ }
+ fn[ACTION] = true;
+ return new _references.UnboundReference(fn);
+ };
+
+ var INVOKE = exports.INVOKE = (0, _emberUtils.symbol)('INVOKE'); /**
+ @module ember
+ */
+ var ACTION = exports.ACTION = (0, _emberUtils.symbol)('ACTION');
+ /**
+ The `{{action}}` helper provides a way to pass triggers for behavior (usually
+ just a function) between components, and into components from controllers.
+
+ ### Passing functions with the action helper
+
+ There are three contexts an action helper can be used in. The first two
+ contexts to discuss are attribute context, and Handlebars value context.
+
+ ```handlebars
+ {{! An example of attribute context }}
+ <div onclick={{action "save"}}></div>
+ {{! Examples of Handlebars value context }}
+ {{input on-input=(action "save")}}
+ {{yield (action "refreshData") andAnotherParam}}
+ ```
+
+ In these contexts,
+ the helper is called a "closure action" helper. Its behavior is simple:
+ If passed a function name, read that function off the `actions` property
+ of the current context. Once that function is read (or if a function was
+ passed), create a closure over that function and any arguments.
+ The resulting value of an action helper used this way is simply a function.
+
+ For example, in the attribute context:
+
+ ```handlebars
+ {{! An example of attribute context }}
+ <div onclick={{action "save"}}></div>
+ ```
+
+ The resulting template render logic would be:
+
+ ```js
+ var div = document.createElement('div');
+ var actionFunction = (function(context){
+ return function() {
+ return context.actions.save.apply(context, arguments);
+ };
+ })(context);
+ div.onclick = actionFunction;
+ ```
+
+ Thus when the div is clicked, the action on that context is called.
+ Because the `actionFunction` is just a function, closure actions can be
+ passed between components and still execute in the correct context.
+
+ Here is an example action handler on a component:
+
+ ```app/components/my-component.js
+ import Component from '@ember/component';
+
+ export default Component.extend({
+ actions: {
+ save() {
+ this.get('model').save();
+ }
+ }
+ });
+ ```
+
+ Actions are always looked up on the `actions` property of the current context.
+ This avoids collisions in the naming of common actions, such as `destroy`.
+ Two options can be passed to the `action` helper when it is used in this way.
+
+ * `target=someProperty` will look to `someProperty` instead of the current
+ context for the `actions` hash. This can be useful when targeting a
+ service for actions.
+ * `value="target.value"` will read the path `target.value` off the first
+ argument to the action when it is called and rewrite the first argument
+ to be that value. This is useful when attaching actions to event listeners.
+
+ ### Invoking an action
+
+ Closure actions curry both their scope and any arguments. When invoked, any
+ additional arguments are added to the already curried list.
+ Actions should be invoked using the [sendAction](/api/ember/release/classes/Component/methods/sendAction?anchor=sendAction)
+ method. The first argument to `sendAction` is the action to be called, and
+ additional arguments are passed to the action function. This has interesting
+ properties combined with currying of arguments. For example:
+
+ ```app/components/my-component.js
+ import Component from '@ember/component';
+
+ export default Component.extend({
+ actions: {
+ // Usage {{input on-input=(action (action 'setName' model) value="target.value")}}
+ setName(model, name) {
+ model.set('name', name);
+ }
+ }
+ });
+ ```
+
+ The first argument (`model`) was curried over, and the run-time argument (`event`)
+ becomes a second argument. Action calls can be nested this way because each simply
+ returns a function. Any function can be passed to the `{{action}}` helper, including
+ other actions.
+
+ Actions invoked with `sendAction` have the same currying behavior as demonstrated
+ with `on-input` above. For example:
+
+ ```app/components/my-input.js
+ import Component from '@ember/component';
+
+ export default Component.extend({
+ actions: {
+ setName(model, name) {
+ model.set('name', name);
+ }
+ }
+ });
+ ```
+
+ ```handlebars
+ {{my-input submit=(action 'setName' model)}}
+ ```
+
+ ```app/components/my-component.js
+ import Component from '@ember/component';
+
+ export default Component.extend({
+ click() {
+ // Note that model is not passed, it was curried in the template
+ this.sendAction('submit', 'bob');
+ }
+ });
+ ```
+
+ ### Attaching actions to DOM elements
+
+ The third context of the `{{action}}` helper can be called "element space".
+ For example:
+
+ ```handlebars
+ {{! An example of element space }}
+ <div {{action "save"}}></div>
+ ```
+
+ Used this way, the `{{action}}` helper provides a useful shortcut for
+ registering an HTML element in a template for a single DOM event and
+ forwarding that interaction to the template's context (controller or component).
+ If the context of a template is a controller, actions used this way will
+ bubble to routes when the controller does not implement the specified action.
+ Once an action hits a route, it will bubble through the route hierarchy.
+
+ ### Event Propagation
+
+ `{{action}}` helpers called in element space can control event bubbling. Note
+ that the closure style actions cannot.
+
+ Events triggered through the action helper will automatically have
+ `.preventDefault()` called on them. You do not need to do so in your event
+ handlers. If you need to allow event propagation (to handle file inputs for
+ example) you can supply the `preventDefault=false` option to the `{{action}}` helper:
+
+ ```handlebars
+ <div {{action "sayHello" preventDefault=false}}>
+ <input type="file" />
+ <input type="checkbox" />
+ </div>
+ ```
+
+ To disable bubbling, pass `bubbles=false` to the helper:
+
+ ```handlebars
+ <button {{action 'edit' post bubbles=false}}>Edit</button>
+ ```
+
+ To disable bubbling with closure style actions you must create your own
+ wrapper helper that makes use of `event.stopPropagation()`:
+
+ ```handlebars
+ <div onclick={{disable-bubbling (action "sayHello")}}>Hello</div>
+ ```
+
+ ```app/helpers/disable-bubbling.js
+ import { helper } from '@ember/component/helper';
+
+ export function disableBubbling([action]) {
+ return function(event) {
+ event.stopPropagation();
+ return action(event);
+ };
+ }
+ export default helper(disableBubbling);
+ ```
+
+ If you need the default handler to trigger you should either register your
+ own event handler, or use event methods on your view class. See
+ ["Responding to Browser Events"](/api/ember/release/classes/Component)
+ in the documentation for `Component` for more information.
+
+ ### Specifying DOM event type
+
+ `{{action}}` helpers called in element space can specify an event type.
+ By default the `{{action}}` helper registers for DOM `click` events. You can
+ supply an `on` option to the helper to specify a different DOM event name:
+
+ ```handlebars
+ <div {{action "anActionName" on="doubleClick"}}>
+ click me
+ </div>
+ ```
+
+ See ["Event Names"](/api/ember/release/classes/Component) for a list of
+ acceptable DOM event names.
+
+ ### Specifying whitelisted modifier keys
+
+ `{{action}}` helpers called in element space can specify modifier keys.
+ By default the `{{action}}` helper will ignore click events with pressed modifier
+ keys. You can supply an `allowedKeys` option to specify which keys should not be ignored.
+
+ ```handlebars
+ <div {{action "anActionName" allowedKeys="alt"}}>
+ click me
+ </div>
+ ```
+
+ This way the action will fire when clicking with the alt key pressed down.
+ Alternatively, supply "any" to the `allowedKeys` option to accept any combination of modifier keys.
+
+ ```handlebars
+ <div {{action "anActionName" allowedKeys="any"}}>
+ click me with any key pressed
+ </div>
+ ```
+
+ ### Specifying a Target
+
+ A `target` option can be provided to the helper to change
+ which object will receive the method call. This option must be a path
+ to an object, accessible in the current context:
+
+ ```app/templates/application.hbs
+ <div {{action "anActionName" target=someService}}>
+ click me
+ </div>
+ ```
+
+ ```app/controllers/application.js
+ import Controller from '@ember/controller';
+ import { inject as service } from '@ember/service';
+
+ export default Controller.extend({
+ someService: service()
+ });
+ ```
+
+ @method action
+ @for Ember.Templates.helpers
+ @public
+ */
+
+ function NOOP(args) {
+ return args;
+ }
+ function makeArgsProcessor(valuePathRef, actionArgsRef) {
+ var mergeArgs = void 0;
+ if (actionArgsRef.length > 0) {
+ mergeArgs = function (args) {
+ return actionArgsRef.map(function (ref) {
+ return ref.value();
+ }).concat(args);
+ };
+ }
+ var readValue = void 0;
+ if (valuePathRef) {
+ readValue = function (args) {
+ var valuePath = valuePathRef.value();
+ if (valuePath && args.length > 0) {
+ args[0] = (0, _emberMetal.get)(args[0], valuePath);
+ }
+ return args;
+ };
+ }
+ if (mergeArgs && readValue) {
+ return function (args) {
+ return readValue(mergeArgs(args));
+ };
+ } else {
+ return mergeArgs || readValue || NOOP;
+ }
+ }
+ function makeDynamicClosureAction(context, targetRef, actionRef, processArgs, debugKey) {
+ // We don't allow undefined/null values, so this creates a throw-away action to trigger the assertions
+ if (true) {
+ makeClosureAction(context, targetRef.value(), actionRef.value(), processArgs, debugKey);
+ }
+ return function () {
+ return makeClosureAction(context, targetRef.value(), actionRef.value(), processArgs, debugKey).apply(undefined, arguments);
+ };
+ }
+ function makeClosureAction(context, target, action, processArgs, debugKey) {
+ var self = void 0;
+ var fn = void 0;
+ (true && !(!(0, _emberMetal.isNone)(action)) && (0, _emberDebug.assert)('Action passed is null or undefined in (action) from ' + target + '.', !(0, _emberMetal.isNone)(action)));
+
+ if (typeof action[INVOKE] === 'function') {
+ self = action;
+ fn = action[INVOKE];
+ } else {
+ var typeofAction = typeof action;
+ if (typeofAction === 'string') {
+ self = target;
+ fn = target.actions && target.actions[action];
+ (true && !(fn) && (0, _emberDebug.assert)('An action named \'' + action + '\' was not found in ' + target, fn));
+ } else if (typeofAction === 'function') {
+ self = context;
+ fn = action;
+ } else {
+ (true && !(false) && (0, _emberDebug.assert)('An action could not be made for `' + (debugKey || action) + '` in ' + target + '. Please confirm that you are using either a quoted action name (i.e. `(action \'' + (debugKey || 'myAction') + '\')`) or a function available in ' + target + '.', false));
+ }
+ }
+ return function () {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ var payload = { target: self, args: args, label: '@glimmer/closure-action' };
+ return (0, _emberMetal.flaggedInstrument)('interaction.ember-action', payload, function () {
+ return _emberMetal.run.join.apply(_emberMetal.run, [self, fn].concat(processArgs(args)));
+ });
+ };
+ }
+});
+enifed('ember-glimmer/helpers/component', ['exports', 'ember-babel', '@glimmer/runtime', 'ember-debug', 'ember-utils', 'ember-glimmer/component-managers/curly', 'ember-glimmer/utils/references'], function (exports, _emberBabel, _runtime, _emberDebug, _emberUtils, _curly, _references) {
+ 'use strict';
+
+ exports.ClosureComponentReference = undefined;
+
+ exports.default = function (vm, args, meta) {
+ return ClosureComponentReference.create(args.capture(), meta, vm.env);
+ };
+
+ var ClosureComponentReference = exports.ClosureComponentReference = function (_CachedReference) {
+ (0, _emberBabel.inherits)(ClosureComponentReference, _CachedReference);
+
+ ClosureComponentReference.create = function create(args, meta, env) {
+ return new ClosureComponentReference(args, meta, env);
+ };
+
+ function ClosureComponentReference(args, meta, env) {
+ (0, _emberBabel.classCallCheck)(this, ClosureComponentReference);
+
+ var _this = (0, _emberBabel.possibleConstructorReturn)(this, _CachedReference.call(this));
+
+ var firstArg = args.positional.at(0);
+ _this.defRef = firstArg;
+ _this.tag = firstArg.tag;
+ _this.args = args;
+ _this.meta = meta;
+ _this.env = env;
+ _this.lastDefinition = undefined;
+ _this.lastName = undefined;
+ return _this;
+ }
+
+ ClosureComponentReference.prototype.compute = function compute() {
+ // TODO: Figure out how to extract this because it's nearly identical to
+ // DynamicComponentReference::compute(). The only differences besides
+ // currying are in the assertion messages.
+ var args = this.args,
+ defRef = this.defRef,
+ env = this.env,
+ meta = this.meta,
+ lastDefinition = this.lastDefinition,
+ lastName = this.lastName;
+
+ var nameOrDef = defRef.value();
+ var definition = void 0;
+ if (nameOrDef && nameOrDef === lastName) {
+ return lastDefinition;
+ }
+ this.lastName = nameOrDef;
+ if (typeof nameOrDef === 'string') {
+ // tslint:disable-next-line:max-line-length
+ (true && !(nameOrDef !== 'input') && (0, _emberDebug.assert)('You cannot use the input helper as a contextual helper. Please extend TextField or Checkbox to use it as a contextual component.', nameOrDef !== 'input'));
+ // tslint:disable-next-line:max-line-length
+
+ (true && !(nameOrDef !== 'textarea') && (0, _emberDebug.assert)('You cannot use the textarea helper as a contextual helper. Please extend TextArea to use it as a contextual component.', nameOrDef !== 'textarea'));
+
+ definition = env.getComponentDefinition(nameOrDef, meta);
+ // tslint:disable-next-line:max-line-length
+ (true && !(!!definition) && (0, _emberDebug.assert)('The component helper cannot be used without a valid component name. You used "' + nameOrDef + '" via (component "' + nameOrDef + '")', !!definition));
+ } else if ((0, _runtime.isComponentDefinition)(nameOrDef)) {
+ definition = nameOrDef;
+ } else {
+ (true && !(nameOrDef) && (0, _emberDebug.assert)('You cannot create a component from ' + nameOrDef + ' using the {{component}} helper', nameOrDef));
+
+ return null;
+ }
+ var newDef = createCurriedDefinition(definition, args);
+ this.lastDefinition = newDef;
+ return newDef;
+ };
+
+ return ClosureComponentReference;
+ }(_references.CachedReference);
+
+ function createCurriedDefinition(definition, args) {
+ var curriedArgs = curryArgs(definition, args);
+ return new _curly.CurlyComponentDefinition(definition.name, definition.ComponentClass, definition.template, curriedArgs);
+ }
+ function curryArgs(definition, newArgs) {
+ var args = definition.args,
+ ComponentClass = definition.ComponentClass;
+
+ var positionalParams = ComponentClass.class.positionalParams;
+ // The args being passed in are from the (component ...) invocation,
+ // so the first positional argument is actually the name or component
+ // definition. It needs to be dropped in order for any actual positional
+ // args to coincide with the ComponentClass's positionParams.
+ // For "normal" curly components this slicing is done at the syntax layer,
+ // but we don't have that luxury here.
+
+ var _newArgs$positional$r = newArgs.positional.references,
+ slicedPositionalArgs = _newArgs$positional$r.slice(1);
+
+ if (positionalParams && slicedPositionalArgs.length) {
+ (0, _curly.validatePositionalParameters)(newArgs.named, slicedPositionalArgs, positionalParams);
+ }
+ var isRest = typeof positionalParams === 'string';
+ // For non-rest position params, we need to perform the position -> name mapping
+ // at each layer to avoid a collision later when the args are used to construct
+ // the component instance (inside of processArgs(), inside of create()).
+ var positionalToNamedParams = {};
+ if (!isRest && positionalParams.length > 0) {
+ var limit = Math.min(positionalParams.length, slicedPositionalArgs.length);
+ for (var i = 0; i < limit; i++) {
+ var name = positionalParams[i];
+ positionalToNamedParams[name] = slicedPositionalArgs[i];
+ }
+ slicedPositionalArgs.length = 0; // Throw them away since you're merged in.
+ }
+ // args (aka 'oldArgs') may be undefined or simply be empty args, so
+ // we need to fall back to an empty array or object.
+ var oldNamed = args && args.named || {};
+ var oldPositional = args && args.positional || [];
+ // Merge positional arrays
+ var positional = new Array(Math.max(oldPositional.length, slicedPositionalArgs.length));
+ positional.splice.apply(positional, [0, oldPositional.length].concat(oldPositional));
+ positional.splice.apply(positional, [0, slicedPositionalArgs.length].concat(slicedPositionalArgs));
+ // Merge named maps
+ var named = (0, _emberUtils.assign)({}, oldNamed, positionalToNamedParams, newArgs.named.map);
+ return { positional: positional, named: named };
+ }
+});
+enifed('ember-glimmer/helpers/concat', ['exports', '@glimmer/runtime', 'ember-glimmer/utils/references'], function (exports, _runtime, _references) {
+ 'use strict';
+
+ exports.default = function (_vm, args) {
+ return new _references.InternalHelperReference(concat, args.capture());
+ };
+
+ /**
+ @module ember
+ */
+ /**
+ Concatenates the given arguments into a string.
+
+ Example:
+
+ ```handlebars
+ {{some-component name=(concat firstName " " lastName)}}
+
+ {{! would pass name="<first name value> <last name value>" to the component}}
+ ```
+
+ @public
+ @method concat
+ @for Ember.Templates.helpers
+ @since 1.13.0
+ */
+ function concat(_ref) {
+ var positional = _ref.positional;
+
+ return positional.value().map(_runtime.normalizeTextValue).join('');
+ }
+});
+enifed('ember-glimmer/helpers/each-in', ['exports', 'ember-utils'], function (exports, _emberUtils) {
+ 'use strict';
+
+ exports.isEachIn = isEachIn;
+
+ exports.default = function (_vm, args) {
+ var ref = Object.create(args.positional.at(0));
+ ref[EACH_IN_REFERENCE] = true;
+ return ref;
+ };
+
+ /**
+ The `{{#each}}` helper loops over elements in a collection. It is an extension
+ of the base Handlebars `{{#each}}` helper.
+ The default behavior of `{{#each}}` is to yield its inner block once for every
+ item in an array passing the item as the first block parameter.
+
+ ```javascript
+ var developers = [{ name: 'Yehuda' },{ name: 'Tom' }, { name: 'Paul' }];
+ ```
+
+ ```handlebars
+ {{#each developers key="name" as |person|}}
+ {{person.name}}
+ {{! `this` is whatever it was outside the #each }}
+ {{/each}}
+ ```
+
+ The same rules apply to arrays of primitives.
+
+ ```javascript
+ var developerNames = ['Yehuda', 'Tom', 'Paul']
+ ```
+
+ ```handlebars
+ {{#each developerNames key="@index" as |name|}}
+ {{name}}
+ {{/each}}
+ ```
+
+ During iteration, the index of each item in the array is provided as a second block parameter.
+
+ ```handlebars
+ <ul>
+ {{#each people as |person index|}}
+ <li>Hello, {{person.name}}! You're number {{index}} in line</li>
+ {{/each}}
+ </ul>
+ ```
+
+ ### Specifying Keys
+
+ The `key` option is used to tell Ember how to determine if the array being
+ iterated over with `{{#each}}` has changed between renders. By helping Ember
+ detect that some elements in the array are the same, DOM elements can be
+ re-used, significantly improving rendering speed.
+
+ For example, here's the `{{#each}}` helper with its `key` set to `id`:
+
+ ```handlebars
+ {{#each model key="id" as |item|}}
+ {{/each}}
+ ```
+
+ When this `{{#each}}` re-renders, Ember will match up the previously rendered
+ items (and reorder the generated DOM elements) based on each item's `id`
+ property.
+ By default the item's own reference is used.
+
+ ### {{else}} condition
+
+ `{{#each}}` can have a matching `{{else}}`. The contents of this block will render
+ if the collection is empty.
+
+ ```handlebars
+ {{#each developers as |person|}}
+ {{person.name}}
+ {{else}}
+ <p>Sorry, nobody is available for this task.</p>
+ {{/each}}
+ ```
+
+ @method each
+ @for Ember.Templates.helpers
+ @public
+ */
+ /**
+ The `{{each-in}}` helper loops over properties on an object.
+
+ For example, given a `user` object that looks like:
+
+ ```javascript
+ {
+ "name": "Shelly Sails",
+ "age": 42
+ }
+ ```
+
+ This template would display all properties on the `user`
+ object in a list:
+
+ ```handlebars
+ <ul>
+ {{#each-in user as |key value|}}
+ <li>{{key}}: {{value}}</li>
+ {{/each-in}}
+ </ul>
+ ```
+
+ Outputting their name and age.
+
+ @method each-in
+ @for Ember.Templates.helpers
+ @public
+ @since 2.1.0
+ */
+ var EACH_IN_REFERENCE = (0, _emberUtils.symbol)('EACH_IN');
+ function isEachIn(ref) {
+ return ref && ref[EACH_IN_REFERENCE];
+ }
+});
+enifed('ember-glimmer/helpers/get', ['exports', 'ember-babel', '@glimmer/reference', '@glimmer/runtime', 'ember-metal', 'ember-glimmer/utils/references'], function (exports, _emberBabel, _reference, _runtime, _emberMetal, _references) {
+ 'use strict';
+
+ exports.default = function (_vm, args) {
+ return GetHelperReference.create(args.positional.at(0), args.positional.at(1));
+ };
+
+ var GetHelperReference = function (_CachedReference) {
+ (0, _emberBabel.inherits)(GetHelperReference, _CachedReference);
+
+ GetHelperReference.create = function create(sourceReference, pathReference) {
+ if ((0, _reference.isConst)(pathReference)) {
+ var path = pathReference.value();
+ if (path === undefined || path === null || path === '') {
+ return _runtime.NULL_REFERENCE;
+ } else if (typeof path === 'string' && path.indexOf('.') > -1) {
+ return (0, _reference.referenceFromParts)(sourceReference, path.split('.'));
+ } else {
+ return sourceReference.get(path);
+ }
+ } else {
+ return new GetHelperReference(sourceReference, pathReference);
+ }
+ };
+
+ function GetHelperReference(sourceReference, pathReference) {
+ (0, _emberBabel.classCallCheck)(this, GetHelperReference);
+
+ var _this = (0, _emberBabel.possibleConstructorReturn)(this, _CachedReference.call(this));
+
+ _this.sourceReference = sourceReference;
+ _this.pathReference = pathReference;
+ _this.lastPath = null;
+ _this.innerReference = _runtime.NULL_REFERENCE;
+ var innerTag = _this.innerTag = _reference.UpdatableTag.create(_reference.CONSTANT_TAG);
+ _this.tag = (0, _reference.combine)([sourceReference.tag, pathReference.tag, innerTag]);
+ return _this;
+ }
+
+ GetHelperReference.prototype.compute = function compute() {
+ var lastPath = this.lastPath,
+ innerReference = this.innerReference,
+ innerTag = this.innerTag;
+
+ var path = this.lastPath = this.pathReference.value();
+ if (path !== lastPath) {
+ if (path === undefined || path === null || path === '') {
+ innerReference = _runtime.NULL_REFERENCE;
+ } else if (typeof path === 'string' && path.indexOf('.') > -1) {
+ innerReference = (0, _reference.referenceFromParts)(this.sourceReference, path.split('.'));
+ } else {
+ innerReference = this.sourceReference.get(path);
+ }
+ innerTag.inner.update(innerReference.tag);
+ this.innerReference = innerReference;
+ }
+ return innerReference.value();
+ };
+
+ GetHelperReference.prototype[_references.UPDATE] = function (value) {
+ (0, _emberMetal.set)(this.sourceReference.value(), this.pathReference.value(), value);
+ };
+
+ return GetHelperReference;
+ }(_references.CachedReference);
+});
+enifed("ember-glimmer/helpers/hash", ["exports"], function (exports) {
+ "use strict";
+
+ exports.default = function (_vm, args) {
+ return args.named.capture();
+ };
+});
+enifed('ember-glimmer/helpers/if-unless', ['exports', 'ember-babel', '@glimmer/reference', 'ember-debug', 'ember-glimmer/utils/references'], function (exports, _emberBabel, _reference, _emberDebug, _references) {
+ 'use strict';
+
+ exports.inlineIf = inlineIf;
+ exports.inlineUnless = inlineUnless;
+
+ var ConditionalHelperReference = function (_CachedReference) {
+ (0, _emberBabel.inherits)(ConditionalHelperReference, _CachedReference);
+
+ ConditionalHelperReference.create = function create(_condRef, truthyRef, falsyRef) {
+ var condRef = _references.ConditionalReference.create(_condRef);
+ if ((0, _reference.isConst)(condRef)) {
+ return condRef.value() ? truthyRef : falsyRef;
+ } else {
+ return new ConditionalHelperReference(condRef, truthyRef, falsyRef);
+ }
+ };
+
+ function ConditionalHelperReference(cond, truthy, falsy) {
+ (0, _emberBabel.classCallCheck)(this, ConditionalHelperReference);
+
+ var _this = (0, _emberBabel.possibleConstructorReturn)(this, _CachedReference.call(this));
+
+ _this.branchTag = _reference.UpdatableTag.create(_reference.CONSTANT_TAG);
+ _this.tag = (0, _reference.combine)([cond.tag, _this.branchTag]);
+ _this.cond = cond;
+ _this.truthy = truthy;
+ _this.falsy = falsy;
+ return _this;
+ }
+
+ ConditionalHelperReference.prototype.compute = function compute() {
+ var branch = this.cond.value() ? this.truthy : this.falsy;
+ this.branchTag.inner.update(branch.tag);
+ return branch.value();
+ };
+
+ return ConditionalHelperReference;
+ }(_references.CachedReference);
+
+ /**
+ The `if` helper allows you to conditionally render one of two branches,
+ depending on the "truthiness" of a property.
+ For example the following values are all falsey: `false`, `undefined`, `null`, `""`, `0`, `NaN` or an empty array.
+
+ This helper has two forms, block and inline.
+
+ ## Block form
+
+ You can use the block form of `if` to conditionally render a section of the template.
+
+ To use it, pass the conditional value to the `if` helper,
+ using the block form to wrap the section of template you want to conditionally render.
+ Like so:
+
+ ```handlebars
+ {{! will not render if foo is falsey}}
+ {{#if foo}}
+ Welcome to the {{foo.bar}}
+ {{/if}}
+ ```
+
+ You can also specify a template to show if the property is falsey by using
+ the `else` helper.
+
+ ```handlebars
+ {{! is it raining outside?}}
+ {{#if isRaining}}
+ Yes, grab an umbrella!
+ {{else}}
+ No, it's lovely outside!
+ {{/if}}
+ ```
+
+ You are also able to combine `else` and `if` helpers to create more complex
+ conditional logic.
+
+ ```handlebars
+ {{#if isMorning}}
+ Good morning
+ {{else if isAfternoon}}
+ Good afternoon
+ {{else}}
+ Good night
+ {{/if}}
+ ```
+
+ ## Inline form
+
+ The inline `if` helper conditionally renders a single property or string.
+
+ In this form, the `if` helper receives three arguments, the conditional value,
+ the value to render when truthy, and the value to render when falsey.
+
+ For example, if `useLongGreeting` is truthy, the following:
+
+ ```handlebars
+ {{if useLongGreeting "Hello" "Hi"}} Alex
+ ```
+
+ Will render:
+
+ ```html
+ Hello Alex
+ ```
+
+ ### Nested `if`
+
+ You can use the `if` helper inside another helper as a nested helper:
+
+ ```handlebars
+ {{some-component height=(if isBig "100" "10")}}
+ ```
+
+ One detail to keep in mind is that both branches of the `if` helper will be evaluated,
+ so if you have `{{if condition "foo" (expensive-operation "bar")`,
+ `expensive-operation` will always calculate.
+
+ @method if
+ @for Ember.Templates.helpers
+ @public
+ */
+ function inlineIf(_vm, _ref) {
+ var positional = _ref.positional;
+ (true && !(positional.length === 3 || positional.length === 2) && (0, _emberDebug.assert)('The inline form of the `if` helper expects two or three arguments, e.g. ' + '`{{if trialExpired "Expired" expiryDate}}`.', positional.length === 3 || positional.length === 2));
+
+ return ConditionalHelperReference.create(positional.at(0), positional.at(1), positional.at(2));
+ }
+ /**
+ The inline `unless` helper conditionally renders a single property or string.
+ This helper acts like a ternary operator. If the first property is falsy,
+ the second argument will be displayed, otherwise, the third argument will be
+ displayed
+
+ ```handlebars
+ {{unless useLongGreeting "Hi" "Hello"}} Ben
+ ```
+
+ You can use the `unless` helper inside another helper as a subexpression.
+
+ ```handlebars
+ {{some-component height=(unless isBig "10" "100")}}
+ ```
+
+ @method unless
+ @for Ember.Templates.helpers
+ @public
+ */
+ function inlineUnless(_vm, _ref2) {
+ var positional = _ref2.positional;
+ (true && !(positional.length === 3 || positional.length === 2) && (0, _emberDebug.assert)('The inline form of the `unless` helper expects two or three arguments, e.g. ' + '`{{unless isFirstLogin "Welcome back!"}}`.', positional.length === 3 || positional.length === 2));
+
+ return ConditionalHelperReference.create(positional.at(0), positional.at(2), positional.at(1));
+ }
+});
+enifed('ember-glimmer/helpers/loc', ['exports', 'ember-glimmer/helper', 'ember-runtime'], function (exports, _helper, _emberRuntime) {
+ 'use strict';
+
+ exports.default = (0, _helper.helper)(function (params) {
+ return _emberRuntime.String.loc.apply(null, params);
+ });
+});
+enifed('ember-glimmer/helpers/log', ['exports', 'ember-glimmer/utils/references', 'ember-console'], function (exports, _references, _emberConsole) {
+ 'use strict';
+
+ exports.default = function (_vm, args) {
+ return new _references.InternalHelperReference(log, args.capture());
+ };
+
+ /**
+ `log` allows you to output the value of variables in the current rendering
+ context. `log` also accepts primitive types such as strings or numbers.
+
+ ```handlebars
+ {{log "myVariable:" myVariable }}
+ ```
+
+ @method log
+ @for Ember.Templates.helpers
+ @param {Array} params
+ @public
+ */
+ function log(_ref) {
+ var positional = _ref.positional;
+
+ _emberConsole.default.log.apply(null, positional.value());
+ }
+ /**
+ @module ember
+ */
+});
+enifed('ember-glimmer/helpers/mut', ['exports', 'ember-debug', 'ember-utils', 'ember-glimmer/utils/references', 'ember-glimmer/helpers/action'], function (exports, _emberDebug, _emberUtils, _references, _action) {
+ 'use strict';
+
+ exports.isMut = isMut;
+ exports.unMut = unMut;
+
+ exports.default = function (_vm, args) {
+ var rawRef = args.positional.at(0);
+ if (isMut(rawRef)) {
+ return rawRef;
+ }
+ // TODO: Improve this error message. This covers at least two distinct
+ // cases:
+ //
+ // 1. (mut "not a path") – passing a literal, result from a helper
+ // invocation, etc
+ //
+ // 2. (mut receivedValue) – passing a value received from the caller
+ // that was originally derived from a literal, result from a helper
+ // invocation, etc
+ //
+ // This message is alright for the first case, but could be quite
+ // confusing for the second case.
+ (true && !(rawRef[_references.UPDATE]) && (0, _emberDebug.assert)('You can only pass a path to mut', rawRef[_references.UPDATE]));
+
+ var wrappedRef = Object.create(rawRef);
+ wrappedRef[SOURCE] = rawRef;
+ wrappedRef[_action.INVOKE] = rawRef[_references.UPDATE];
+ wrappedRef[MUT_REFERENCE] = true;
+ return wrappedRef;
+ };
+
+ /**
+ The `mut` helper lets you __clearly specify__ that a child `Component` can update the
+ (mutable) value passed to it, which will __change the value of the parent component__.
+
+ To specify that a parameter is mutable, when invoking the child `Component`:
+
+ ```handlebars
+ {{my-child childClickCount=(mut totalClicks)}}
+ ```
+
+ The child `Component` can then modify the parent's value just by modifying its own
+ property:
+
+ ```javascript
+ // my-child.js
+ export default Component.extend({
+ click() {
+ this.incrementProperty('childClickCount');
+ }
+ });
+ ```
+
+ Note that for curly components (`{{my-component}}`) the bindings are already mutable,
+ making the `mut` unnecessary.
+
+ Additionally, the `mut` helper can be combined with the `action` helper to
+ mutate a value. For example:
+
+ ```handlebars
+ {{my-child childClickCount=totalClicks click-count-change=(action (mut totalClicks))}}
+ ```
+
+ The child `Component` would invoke the action with the new click value:
+
+ ```javascript
+ // my-child.js
+ export default Component.extend({
+ click() {
+ this.get('click-count-change')(this.get('childClickCount') + 1);
+ }
+ });
+ ```
+
+ The `mut` helper changes the `totalClicks` value to what was provided as the action argument.
+
+ The `mut` helper, when used with `action`, will return a function that
+ sets the value passed to `mut` to its first argument. This works like any other
+ closure action and interacts with the other features `action` provides.
+ As an example, we can create a button that increments a value passing the value
+ directly to the `action`:
+
+ ```handlebars
+ {{! inc helper is not provided by Ember }}
+ <button onclick={{action (mut count) (inc count)}}>
+ Increment count
+ </button>
+ ```
+
+ You can also use the `value` option:
+
+ ```handlebars
+ <input value={{name}} oninput={{action (mut name) value="target.value"}}>
+ ```
+
+ @method mut
+ @param {Object} [attr] the "two-way" attribute that can be modified.
+ @for Ember.Templates.helpers
+ @public
+ */
+ var MUT_REFERENCE = (0, _emberUtils.symbol)('MUT');
+ var SOURCE = (0, _emberUtils.symbol)('SOURCE');
+ function isMut(ref) {
+ return ref && ref[MUT_REFERENCE];
+ }
+ function unMut(ref) {
+ return ref[SOURCE] || ref;
+ }
+});
+enifed('ember-glimmer/helpers/query-param', ['exports', 'ember-debug', 'ember-routing', 'ember-utils', 'ember-glimmer/utils/references'], function (exports, _emberDebug, _emberRouting, _emberUtils, _references) {
+ 'use strict';
+
+ exports.default = function (_vm, args) {
+ return new _references.InternalHelperReference(queryParams, args.capture());
+ };
+
+ /**
+ This is a helper to be used in conjunction with the link-to helper.
+ It will supply url query parameters to the target route.
+
+ Example
+
+ ```handlebars
+ {{#link-to 'posts' (query-params direction="asc")}}Sort{{/link-to}}
+ ```
+
+ @method query-params
+ @for Ember.Templates.helpers
+ @param {Object} hash takes a hash of query parameters
+ @return {Object} A `QueryParams` object for `{{link-to}}`
+ @public
+ */
+ function queryParams(_ref) {
+ var positional = _ref.positional,
+ named = _ref.named;
+ (true && !(positional.value().length === 0) && (0, _emberDebug.assert)('The `query-params` helper only accepts hash parameters, e.g. (query-params queryParamPropertyName=\'foo\') as opposed to just (query-params \'foo\')', positional.value().length === 0));
+
+ return _emberRouting.QueryParams.create({
+ values: (0, _emberUtils.assign)({}, named.value())
+ });
+ }
+});
+enifed('ember-glimmer/helpers/readonly', ['exports', 'ember-glimmer/utils/references', 'ember-glimmer/helpers/mut'], function (exports, _references, _mut) {
+ 'use strict';
+
+ exports.default = function (_vm, args) {
+ var ref = (0, _mut.unMut)(args.positional.at(0));
+ var wrapped = Object.create(ref);
+ wrapped[_references.UPDATE] = undefined;
+ return wrapped;
+ };
+});
+enifed('ember-glimmer/helpers/unbound', ['exports', 'ember-debug', 'ember-glimmer/utils/references'], function (exports, _emberDebug, _references) {
+ 'use strict';
+
+ exports.default = function (_vm, args) {
+ (true && !(args.positional.length === 1 && args.named.length === 0) && (0, _emberDebug.assert)('unbound helper cannot be called with multiple params or hash params', args.positional.length === 1 && args.named.length === 0));
+
+ return _references.UnboundReference.create(args.positional.at(0).value());
+ };
+});
+enifed('ember-glimmer/index', ['exports', 'ember-glimmer/helpers/action', 'ember-glimmer/templates/root', 'ember-glimmer/template', 'ember-glimmer/components/checkbox', 'ember-glimmer/components/text_field', 'ember-glimmer/components/text_area', 'ember-glimmer/components/link-to', 'ember-glimmer/component', 'ember-glimmer/helper', 'ember-glimmer/environment', 'ember-glimmer/utils/string', 'ember-glimmer/renderer', 'ember-glimmer/template_registry', 'ember-glimmer/setup-registry', 'ember-glimmer/dom', 'ember-glimmer/syntax', 'ember-glimmer/component-managers/abstract'], function (exports, _action, _root, _template, _checkbox, _text_field, _text_area, _linkTo, _component, _helper, _environment, _string, _renderer, _template_registry, _setupRegistry, _dom, _syntax, _abstract) {
+ 'use strict';
+
+ Object.defineProperty(exports, 'INVOKE', {
+ enumerable: true,
+ get: function () {
+ return _action.INVOKE;
+ }
+ });
+ Object.defineProperty(exports, 'RootTemplate', {
+ enumerable: true,
+ get: function () {
+ return _root.default;
+ }
+ });
+ Object.defineProperty(exports, 'template', {
+ enumerable: true,
+ get: function () {
+ return _template.default;
+ }
+ });
+ Object.defineProperty(exports, 'Checkbox', {
+ enumerable: true,
+ get: function () {
+ return _checkbox.default;
+ }
+ });
+ Object.defineProperty(exports, 'TextField', {
+ enumerable: true,
+ get: function () {
+ return _text_field.default;
+ }
+ });
+ Object.defineProperty(exports, 'TextArea', {
+ enumerable: true,
+ get: function () {
+ return _text_area.default;
+ }
+ });
+ Object.defineProperty(exports, 'LinkComponent', {
+ enumerable: true,
+ get: function () {
+ return _linkTo.default;
+ }
+ });
+ Object.defineProperty(exports, 'Component', {
+ enumerable: true,
+ get: function () {
+ return _component.default;
+ }
+ });
+ Object.defineProperty(exports, 'Helper', {
+ enumerable: true,
+ get: function () {
+ return _helper.default;
+ }
+ });
+ Object.defineProperty(exports, 'helper', {
+ enumerable: true,
+ get: function () {
+ return _helper.helper;
+ }
+ });
+ Object.defineProperty(exports, 'Environment', {
+ enumerable: true,
+ get: function () {
+ return _environment.default;
+ }
+ });
+ Object.defineProperty(exports, 'SafeString', {
+ enumerable: true,
+ get: function () {
+ return _string.SafeString;
+ }
+ });
+ Object.defineProperty(exports, 'escapeExpression', {
+ enumerable: true,
+ get: function () {
+ return _string.escapeExpression;
+ }
+ });
+ Object.defineProperty(exports, 'htmlSafe', {
+ enumerable: true,
+ get: function () {
+ return _string.htmlSafe;
+ }
+ });
+ Object.defineProperty(exports, 'isHTMLSafe', {
+ enumerable: true,
+ get: function () {
+ return _string.isHTMLSafe;
+ }
+ });
+ Object.defineProperty(exports, 'Renderer', {
+ enumerable: true,
+ get: function () {
+ return _renderer.Renderer;
+ }
+ });
+ Object.defineProperty(exports, 'InertRenderer', {
+ enumerable: true,
+ get: function () {
+ return _renderer.InertRenderer;
+ }
+ });
+ Object.defineProperty(exports, 'InteractiveRenderer', {
+ enumerable: true,
+ get: function () {
+ return _renderer.InteractiveRenderer;
+ }
+ });
+ Object.defineProperty(exports, '_resetRenderers', {
+ enumerable: true,
+ get: function () {
+ return _renderer._resetRenderers;
+ }
+ });
+ Object.defineProperty(exports, 'renderSettled', {
+ enumerable: true,
+ get: function () {
+ return _renderer.renderSettled;
+ }
+ });
+ Object.defineProperty(exports, 'getTemplate', {
+ enumerable: true,
+ get: function () {
+ return _template_registry.getTemplate;
+ }
+ });
+ Object.defineProperty(exports, 'setTemplate', {
+ enumerable: true,
+ get: function () {
+ return _template_registry.setTemplate;
+ }
+ });
+ Object.defineProperty(exports, 'hasTemplate', {
+ enumerable: true,
+ get: function () {
+ return _template_registry.hasTemplate;
+ }
+ });
+ Object.defineProperty(exports, 'getTemplates', {
+ enumerable: true,
+ get: function () {
+ return _template_registry.getTemplates;
+ }
+ });
+ Object.defineProperty(exports, 'setTemplates', {
+ enumerable: true,
+ get: function () {
+ return _template_registry.setTemplates;
+ }
+ });
+ Object.defineProperty(exports, 'setupEngineRegistry', {
+ enumerable: true,
+ get: function () {
+ return _setupRegistry.setupEngineRegistry;
+ }
+ });
+ Object.defineProperty(exports, 'setupApplicationRegistry', {
+ enumerable: true,
+ get: function () {
+ return _setupRegistry.setupApplicationRegistry;
+ }
+ });
+ Object.defineProperty(exports, 'DOMChanges', {
+ enumerable: true,
+ get: function () {
+ return _dom.DOMChanges;
+ }
+ });
+ Object.defineProperty(exports, 'NodeDOMTreeConstruction', {
+ enumerable: true,
+ get: function () {
+ return _dom.NodeDOMTreeConstruction;
+ }
+ });
+ Object.defineProperty(exports, 'DOMTreeConstruction', {
+ enumerable: true,
+ get: function () {
+ return _dom.DOMTreeConstruction;
+ }
+ });
+ Object.defineProperty(exports, '_registerMacros', {
+ enumerable: true,
+ get: function () {
+ return _syntax.registerMacros;
+ }
+ });
+ Object.defineProperty(exports, '_experimentalMacros', {
+ enumerable: true,
+ get: function () {
+ return _syntax.experimentalMacros;
+ }
+ });
+ Object.defineProperty(exports, 'AbstractComponentManager', {
+ enumerable: true,
+ get: function () {
+ return _abstract.default;
+ }
+ });
+});
+enifed('ember-glimmer/modifiers/action', ['exports', 'ember-babel', 'ember-debug', 'ember-metal', 'ember-utils', 'ember-views', 'ember-glimmer/helpers/action'], function (exports, _emberBabel, _emberDebug, _emberMetal, _emberUtils, _emberViews, _action) {
+ 'use strict';
+
+ exports.ActionState = exports.ActionHelper = undefined;
+
+ var MODIFIERS = ['alt', 'shift', 'meta', 'ctrl'];
+ var POINTER_EVENT_TYPE_REGEX = /^click|mouse|touch/;
+ function isAllowedEvent(event, allowedKeys) {
+ if (allowedKeys === null || allowedKeys === undefined) {
+ if (POINTER_EVENT_TYPE_REGEX.test(event.type)) {
+ return (0, _emberViews.isSimpleClick)(event);
+ } else {
+ allowedKeys = '';
+ }
+ }
+ if (allowedKeys.indexOf('any') >= 0) {
+ return true;
+ }
+ for (var i = 0; i < MODIFIERS.length; i++) {
+ if (event[MODIFIERS[i] + 'Key'] && allowedKeys.indexOf(MODIFIERS[i]) === -1) {
+ return false;
+ }
+ }
+ return true;
+ }
+ var ActionHelper = exports.ActionHelper = {
+ // registeredActions is re-exported for compatibility with older plugins
+ // that were using this undocumented API.
+ registeredActions: _emberViews.ActionManager.registeredActions,
+ registerAction: function (actionState) {
+ var actionId = actionState.actionId;
+
+ _emberViews.ActionManager.registeredActions[actionId] = actionState;
+ return actionId;
+ },
+ unregisterAction: function (actionState) {
+ var actionId = actionState.actionId;
+
+ delete _emberViews.ActionManager.registeredActions[actionId];
+ }
+ };
+
+ var ActionState = exports.ActionState = function () {
+ function ActionState(element, actionId, actionName, actionArgs, namedArgs, positionalArgs, implicitTarget, dom) {
+ (0, _emberBabel.classCallCheck)(this, ActionState);
+
+ this.element = element;
+ this.actionId = actionId;
+ this.actionName = actionName;
+ this.actionArgs = actionArgs;
+ this.namedArgs = namedArgs;
+ this.positional = positionalArgs;
+ this.implicitTarget = implicitTarget;
+ this.dom = dom;
+ this.eventName = this.getEventName();
+ }
+
+ ActionState.prototype.getEventName = function getEventName() {
+ return this.namedArgs.get('on').value() || 'click';
+ };
+
+ ActionState.prototype.getActionArgs = function getActionArgs() {
+ var result = new Array(this.actionArgs.length);
+ for (var i = 0; i < this.actionArgs.length; i++) {
+ result[i] = this.actionArgs[i].value();
+ }
+ return result;
+ };
+
+ ActionState.prototype.getTarget = function getTarget() {
+ var implicitTarget = this.implicitTarget,
+ namedArgs = this.namedArgs;
+
+ var target = void 0;
+ if (namedArgs.has('target')) {
+ target = namedArgs.get('target').value();
+ } else {
+ target = implicitTarget.value();
+ }
+ return target;
+ };
+
+ ActionState.prototype.handler = function handler(event) {
+ var _this = this;
+
+ var actionName = this.actionName,
+ namedArgs = this.namedArgs;
+
+ var bubbles = namedArgs.get('bubbles');
+ var preventDefault = namedArgs.get('preventDefault');
+ var allowedKeys = namedArgs.get('allowedKeys');
+ var target = this.getTarget();
+ if (!isAllowedEvent(event, allowedKeys.value())) {
+ return true;
+ }
+ if (preventDefault.value() !== false) {
+ event.preventDefault();
+ }
+ if (bubbles.value() === false) {
+ event.stopPropagation();
+ }
+ _emberMetal.run.join(function () {
+ var args = _this.getActionArgs();
+ var payload = {
+ args: args,
+ target: target,
+ name: null
+ };
+ if (typeof actionName[_action.INVOKE] === 'function') {
+ (0, _emberMetal.flaggedInstrument)('interaction.ember-action', payload, function () {
+ actionName[_action.INVOKE].apply(actionName, args);
+ });
+ return;
+ }
+ if (typeof actionName === 'function') {
+ (0, _emberMetal.flaggedInstrument)('interaction.ember-action', payload, function () {
+ actionName.apply(target, args);
+ });
+ return;
+ }
+ payload.name = actionName;
+ if (target.send) {
+ (0, _emberMetal.flaggedInstrument)('interaction.ember-action', payload, function () {
+ target.send.apply(target, [actionName].concat(args));
+ });
+ } else {
+ (true && !(typeof target[actionName] === 'function') && (0, _emberDebug.assert)('The action \'' + actionName + '\' did not exist on ' + target, typeof target[actionName] === 'function'));
+
+ (0, _emberMetal.flaggedInstrument)('interaction.ember-action', payload, function () {
+ target[actionName].apply(target, args);
+ });
+ }
+ });
+ return false;
+ };
+
+ ActionState.prototype.destroy = function destroy() {
+ ActionHelper.unregisterAction(this);
+ };
+
+ return ActionState;
+ }();
+
+ var ActionModifierManager = function () {
+ function ActionModifierManager() {
+ (0, _emberBabel.classCallCheck)(this, ActionModifierManager);
+ }
+
+ ActionModifierManager.prototype.create = function create(element, args, _dynamicScope, dom) {
+ var _args$capture = args.capture(),
+ named = _args$capture.named,
+ positional = _args$capture.positional;
+
+ var implicitTarget = void 0;
+ var actionName = void 0;
+ var actionNameRef = void 0;
+ if (positional.length > 1) {
+ implicitTarget = positional.at(0);
+ actionNameRef = positional.at(1);
+ if (actionNameRef[_action.INVOKE]) {
+ actionName = actionNameRef;
+ } else {
+ var actionLabel = actionNameRef._propertyKey;
+ actionName = actionNameRef.value();
+ (true && !(typeof actionName === 'string' || typeof actionName === 'function') && (0, _emberDebug.assert)('You specified a quoteless path, `' + actionLabel + '`, to the ' + '{{action}} helper which did not resolve to an action name (a ' + 'string). Perhaps you meant to use a quoted actionName? (e.g. ' + '{{action "' + actionLabel + '"}}).', typeof actionName === 'string' || typeof actionName === 'function'));
+ }
+ }
+ var actionArgs = [];
+ // The first two arguments are (1) `this` and (2) the action name.
+ // Everything else is a param.
+ for (var i = 2; i < positional.length; i++) {
+ actionArgs.push(positional.at(i));
+ }
+ var actionId = (0, _emberUtils.uuid)();
+ return new ActionState(element, actionId, actionName, actionArgs, named, positional, implicitTarget, dom);
+ };
+
+ ActionModifierManager.prototype.install = function install(actionState) {
+ var dom = actionState.dom,
+ element = actionState.element,
+ actionId = actionState.actionId;
+
+ ActionHelper.registerAction(actionState);
+ dom.setAttribute(element, 'data-ember-action', '');
+ dom.setAttribute(element, 'data-ember-action-' + actionId, actionId);
+ };
+
+ ActionModifierManager.prototype.update = function update(actionState) {
+ var positional = actionState.positional;
+
+ var actionNameRef = positional.at(1);
+ if (!actionNameRef[_action.INVOKE]) {
+ actionState.actionName = actionNameRef.value();
+ }
+ actionState.eventName = actionState.getEventName();
+ };
+
+ ActionModifierManager.prototype.getDestructor = function getDestructor(modifier) {
+ return modifier;
+ };
+
+ return ActionModifierManager;
+ }();
+
+ exports.default = ActionModifierManager;
+});
+enifed('ember-glimmer/protocol-for-url', ['exports', 'ember-environment', 'node-module'], function (exports, _emberEnvironment, _nodeModule) {
+ 'use strict';
+
+ exports.default = installProtocolForURL;
+ /* globals module, URL */
+ var nodeURL = void 0;
+ var parsingNode = void 0;
+ function installProtocolForURL(environment) {
+ var protocol = void 0;
+ if (_emberEnvironment.environment.hasDOM) {
+ protocol = browserProtocolForURL.call(environment, 'foobar:baz');
+ }
+ // Test to see if our DOM implementation parses
+ // and normalizes URLs.
+ if (protocol === 'foobar:') {
+ // Swap in the method that doesn't do this test now that
+ // we know it works.
+ environment.protocolForURL = browserProtocolForURL;
+ } else if (typeof URL === 'object') {
+ // URL globally provided, likely from FastBoot's sandbox
+ nodeURL = URL;
+ environment.protocolForURL = nodeProtocolForURL;
+ } else if (_nodeModule.IS_NODE) {
+ // Otherwise, we need to fall back to our own URL parsing.
+ // Global `require` is shadowed by Ember's loader so we have to use the fully
+ // qualified `module.require`.
+ // tslint:disable-next-line:no-require-imports
+ nodeURL = (0, _nodeModule.require)('url');
+ environment.protocolForURL = nodeProtocolForURL;
+ } else {
+ throw new Error('Could not find valid URL parsing mechanism for URL Sanitization');
+ }
+ }
+ function browserProtocolForURL(url) {
+ if (!parsingNode) {
+ parsingNode = document.createElement('a');
+ }
+ parsingNode.href = url;
+ return parsingNode.protocol;
+ }
+ function nodeProtocolForURL(url) {
+ var protocol = null;
+ if (typeof url === 'string') {
+ protocol = nodeURL.parse(url).protocol;
+ }
+ return protocol === null ? ':' : protocol;
+ }
+});
+enifed('ember-glimmer/renderer', ['exports', 'ember-babel', '@glimmer/reference', 'ember-debug', 'ember-metal', 'ember-views', 'ember-glimmer/component', 'ember-glimmer/component-managers/outlet', 'ember-glimmer/component-managers/root', 'ember-glimmer/utils/references', '@glimmer/runtime', 'rsvp'], function (exports, _emberBabel, _reference, _emberDebug, _emberMetal, _emberViews, _component, _outlet, _root2, _references, _runtime, _rsvp) {
+ 'use strict';
+
+ exports.InteractiveRenderer = exports.InertRenderer = exports.Renderer = exports.DynamicScope = undefined;
+ exports._resetRenderers = _resetRenderers;
+ exports.renderSettled = renderSettled;
+ var backburner = _emberMetal.run.backburner;
+
+ var DynamicScope = exports.DynamicScope = function () {
+ function DynamicScope(view, outletState, rootOutletState) {
+ (0, _emberBabel.classCallCheck)(this, DynamicScope);
+
+ this.view = view;
+ this.outletState = outletState;
+ this.rootOutletState = rootOutletState;
+ }
+
+ DynamicScope.prototype.child = function child() {
+ return new DynamicScope(this.view, this.outletState, this.rootOutletState);
+ };
+
+ DynamicScope.prototype.get = function get(key) {
+ // tslint:disable-next-line:max-line-length
+ (true && !(key === 'outletState') && (0, _emberDebug.assert)('Using `-get-dynamic-scope` is only supported for `outletState` (you used `' + key + '`).', key === 'outletState'));
+
+ return this.outletState;
+ };
+
+ DynamicScope.prototype.set = function set(key, value) {
+ // tslint:disable-next-line:max-line-length
+ (true && !(key === 'outletState') && (0, _emberDebug.assert)('Using `-with-dynamic-scope` is only supported for `outletState` (you used `' + key + '`).', key === 'outletState'));
+
+ this.outletState = value;
+ return value;
+ };
+
+ return DynamicScope;
+ }();
+
+ var RootState = function () {
+ function RootState(root, env, template, self, parentElement, dynamicScope) {
+ var _this = this;
+
+ (0, _emberBabel.classCallCheck)(this, RootState);
+ (true && !(template !== undefined) && (0, _emberDebug.assert)('You cannot render `' + self.value() + '` without a template.', template !== undefined));
+
+ this.id = (0, _emberViews.getViewId)(root);
+ this.env = env;
+ this.root = root;
+ this.result = undefined;
+ this.shouldReflush = false;
+ this.destroyed = false;
+ var options = this.options = {
+ alwaysRevalidate: false
+ };
+ this.render = function () {
+ var iterator = template.render(self, parentElement, dynamicScope);
+ var iteratorResult = void 0;
+ do {
+ iteratorResult = iterator.next();
+ } while (!iteratorResult.done);
+ var result = _this.result = iteratorResult.value;
+ // override .render function after initial render
+ _this.render = function () {
+ return result.rerender(options);
+ };
+ };
+ }
+
+ RootState.prototype.isFor = function isFor(possibleRoot) {
+ return this.root === possibleRoot;
+ };
+
+ RootState.prototype.destroy = function destroy() {
+ var result = this.result,
+ env = this.env;
+
+ this.destroyed = true;
+ this.env = undefined;
+ this.root = null;
+ this.result = undefined;
+ this.render = undefined;
+ if (result) {
+ /*
+ Handles these scenarios:
+ * When roots are removed during standard rendering process, a transaction exists already
+ `.begin()` / `.commit()` are not needed.
+ * When roots are being destroyed manually (`component.append(); component.destroy() case), no
+ transaction exists already.
+ * When roots are being destroyed during `Renderer#destroy`, no transaction exists
+ */
+ var needsTransaction = !env.inTransaction;
+ if (needsTransaction) {
+ env.begin();
+ }
+ result.destroy();
+ if (needsTransaction) {
+ env.commit();
+ }
+ }
+ };
+
+ return RootState;
+ }();
+
+ var renderers = [];
+ function _resetRenderers() {
+ renderers.length = 0;
+ }
+ (0, _emberMetal.setHasViews)(function () {
+ return renderers.length > 0;
+ });
+ function register(renderer) {
+ (true && !(renderers.indexOf(renderer) === -1) && (0, _emberDebug.assert)('Cannot register the same renderer twice', renderers.indexOf(renderer) === -1));
+
+ renderers.push(renderer);
+ }
+ function deregister(renderer) {
+ var index = renderers.indexOf(renderer);
+ (true && !(index !== -1) && (0, _emberDebug.assert)('Cannot deregister unknown unregistered renderer', index !== -1));
+
+ renderers.splice(index, 1);
+ }
+ function loopBegin() {
+ for (var i = 0; i < renderers.length; i++) {
+ renderers[i]._scheduleRevalidate();
+ }
+ }
+ function K() {}
+ var renderSettledDeferred = null;
+ /*
+ Returns a promise which will resolve when rendering has settled. Settled in
+ this context is defined as when all of the tags in use are "current" (e.g.
+ `renderers.every(r => r._isValid())`). When this is checked at the _end_ of
+ the run loop, this essentially guarantees that all rendering is completed.
+
+ @method renderSettled
+ @returns {Promise<void>} a promise which fulfills when rendering has settled
+ */
+ function renderSettled() {
+ if (renderSettledDeferred === null) {
+ renderSettledDeferred = _rsvp.default.defer();
+ // if there is no current runloop, the promise created above will not have
+ // a chance to resolve (because its resolved in backburner's "end" event)
+ if (!_emberMetal.run.currentRunLoop) {
+ // ensure a runloop has been kicked off
+ backburner.schedule('actions', null, K);
+ }
+ }
+ return renderSettledDeferred.promise;
+ }
+ function resolveRenderPromise() {
+ if (renderSettledDeferred !== null) {
+ var resolve = renderSettledDeferred.resolve;
+ renderSettledDeferred = null;
+ backburner.join(null, resolve);
+ }
+ }
+ var loops = 0;
+ function loopEnd() {
+ for (var i = 0; i < renderers.length; i++) {
+ if (!renderers[i]._isValid()) {
+ if (loops > 10) {
+ loops = 0;
+ // TODO: do something better
+ renderers[i].destroy();
+ throw new Error('infinite rendering invalidation detected');
+ }
+ loops++;
+ return backburner.join(null, K);
+ }
+ }
+ loops = 0;
+ resolveRenderPromise();
+ }
+ backburner.on('begin', loopBegin);
+ backburner.on('end', loopEnd);
+
+ var Renderer = exports.Renderer = function () {
+ function Renderer(env, rootTemplate) {
+ var _viewRegistry = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _emberViews.fallbackViewRegistry;
+
+ var destinedForDOM = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
+ (0, _emberBabel.classCallCheck)(this, Renderer);
+
+ this._env = env;
+ this._rootTemplate = rootTemplate;
+ this._viewRegistry = _viewRegistry;
+ this._destinedForDOM = destinedForDOM;
+ this._destroyed = false;
+ this._roots = [];
+ this._lastRevision = -1;
+ this._isRenderingRoots = false;
+ this._removedRoots = [];
+ }
+ // renderer HOOKS
+
+
+ Renderer.prototype.appendOutletView = function appendOutletView(view, target) {
+ var definition = new _outlet.TopLevelOutletComponentDefinition(view);
+ var outletStateReference = view.toReference();
+ this._appendDefinition(view, definition, target, outletStateReference);
+ };
+
+ Renderer.prototype.appendTo = function appendTo(view, target) {
+ var rootDef = new _root2.RootComponentDefinition(view);
+ this._appendDefinition(view, rootDef, target);
+ };
+
+ Renderer.prototype._appendDefinition = function _appendDefinition(root, definition, target, outletStateReference) {
+ var self = new _references.RootReference(definition);
+ var dynamicScope = new DynamicScope(null, outletStateReference || _runtime.NULL_REFERENCE, outletStateReference);
+ var rootState = new RootState(root, this._env, this._rootTemplate, self, target, dynamicScope);
+ this._renderRoot(rootState);
+ };
+
+ Renderer.prototype.rerender = function rerender() {
+ this._scheduleRevalidate();
+ };
+
+ Renderer.prototype.register = function register(view) {
+ var id = (0, _emberViews.getViewId)(view);
+ (true && !(!this._viewRegistry[id]) && (0, _emberDebug.assert)('Attempted to register a view with an id already in use: ' + id, !this._viewRegistry[id]));
+
+ this._viewRegistry[id] = view;
+ };
+
+ Renderer.prototype.unregister = function unregister(view) {
+ delete this._viewRegistry[(0, _emberViews.getViewId)(view)];
+ };
+
+ Renderer.prototype.remove = function remove(view) {
+ view._transitionTo('destroying');
+ this.cleanupRootFor(view);
+ (0, _emberViews.setViewElement)(view, null);
+ if (this._destinedForDOM) {
+ view.trigger('didDestroyElement');
+ }
+ if (!view.isDestroying) {
+ view.destroy();
+ }
+ };
+
+ Renderer.prototype.cleanupRootFor = function cleanupRootFor(view) {
+ // no need to cleanup roots if we have already been destroyed
+ if (this._destroyed) {
+ return;
+ }
+ var roots = this._roots;
+ // traverse in reverse so we can remove items
+ // without mucking up the index
+ var i = this._roots.length;
+ while (i--) {
+ var root = roots[i];
+ if (root.isFor(view)) {
+ root.destroy();
+ roots.splice(i, 1);
+ }
+ }
+ };
+
+ Renderer.prototype.destroy = function destroy() {
+ if (this._destroyed) {
+ return;
+ }
+ this._destroyed = true;
+ this._clearAllRoots();
+ };
+
+ Renderer.prototype.getBounds = function getBounds(view) {
+ var bounds = view[_component.BOUNDS];
+ var parentElement = bounds.parentElement();
+ var firstNode = bounds.firstNode();
+ var lastNode = bounds.lastNode();
+ return { parentElement: parentElement, firstNode: firstNode, lastNode: lastNode };
+ };
+
+ Renderer.prototype.createElement = function createElement(tagName) {
+ return this._env.getAppendOperations().createElement(tagName);
+ };
+
+ Renderer.prototype._renderRoot = function _renderRoot(root) {
+ var roots = this._roots;
+
+ roots.push(root);
+ if (roots.length === 1) {
+ register(this);
+ }
+ this._renderRootsTransaction();
+ };
+
+ Renderer.prototype._renderRoots = function _renderRoots() {
+ var roots = this._roots,
+ env = this._env,
+ removedRoots = this._removedRoots;
+
+ var globalShouldReflush = void 0;
+ var initialRootsLength = void 0;
+ do {
+ env.begin();
+ // ensure that for the first iteration of the loop
+ // each root is processed
+ initialRootsLength = roots.length;
+ globalShouldReflush = false;
+ for (var i = 0; i < roots.length; i++) {
+ var root = roots[i];
+ if (root.destroyed) {
+ // add to the list of roots to be removed
+ // they will be removed from `this._roots` later
+ removedRoots.push(root);
+ // skip over roots that have been marked as destroyed
+ continue;
+ }
+ var shouldReflush = root.shouldReflush;
+ // when processing non-initial reflush loops,
+ // do not process more roots than needed
+
+ if (i >= initialRootsLength && !shouldReflush) {
+ continue;
+ }
+ root.options.alwaysRevalidate = shouldReflush;
+ // track shouldReflush based on this roots render result
+ shouldReflush = root.shouldReflush = (0, _emberMetal.runInTransaction)(root, 'render');
+ // globalShouldReflush should be `true` if *any* of
+ // the roots need to reflush
+ globalShouldReflush = globalShouldReflush || shouldReflush;
+ }
+ this._lastRevision = _reference.CURRENT_TAG.value();
+ env.commit();
+ } while (globalShouldReflush || roots.length > initialRootsLength);
+ // remove any roots that were destroyed during this transaction
+ while (removedRoots.length) {
+ var _root = removedRoots.pop();
+ var rootIndex = roots.indexOf(_root);
+ roots.splice(rootIndex, 1);
+ }
+ if (this._roots.length === 0) {
+ deregister(this);
+ }
+ };
+
+ Renderer.prototype._renderRootsTransaction = function _renderRootsTransaction() {
+ if (this._isRenderingRoots) {
+ // currently rendering roots, a new root was added and will
+ // be processed by the existing _renderRoots invocation
+ return;
+ }
+ // used to prevent calling _renderRoots again (see above)
+ // while we are actively rendering roots
+ this._isRenderingRoots = true;
+ var completedWithoutError = false;
+ try {
+ this._renderRoots();
+ completedWithoutError = true;
+ } finally {
+ if (!completedWithoutError) {
+ this._lastRevision = _reference.CURRENT_TAG.value();
+ if (this._env.inTransaction === true) {
+ this._env.commit();
+ }
+ }
+ this._isRenderingRoots = false;
+ }
+ };
+
+ Renderer.prototype._clearAllRoots = function _clearAllRoots() {
+ var roots = this._roots;
+ for (var i = 0; i < roots.length; i++) {
+ var root = roots[i];
+ root.destroy();
+ }
+ this._removedRoots.length = 0;
+ this._roots = [];
+ // if roots were present before destroying
+ // deregister this renderer instance
+ if (roots.length) {
+ deregister(this);
+ }
+ };
+
+ Renderer.prototype._scheduleRevalidate = function _scheduleRevalidate() {
+ backburner.scheduleOnce('render', this, this._revalidate);
+ };
+
+ Renderer.prototype._isValid = function _isValid() {
+ return this._destroyed || this._roots.length === 0 || _reference.CURRENT_TAG.validate(this._lastRevision);
+ };
+
+ Renderer.prototype._revalidate = function _revalidate() {
+ if (this._isValid()) {
+ return;
+ }
+ this._renderRootsTransaction();
+ };
+
+ return Renderer;
+ }();
+
+ var InertRenderer = exports.InertRenderer = function (_Renderer) {
+ (0, _emberBabel.inherits)(InertRenderer, _Renderer);
+
+ function InertRenderer() {
+ (0, _emberBabel.classCallCheck)(this, InertRenderer);
+ return (0, _emberBabel.possibleConstructorReturn)(this, _Renderer.apply(this, arguments));
+ }
+
+ InertRenderer.create = function create(_ref) {
+ var env = _ref.env,
+ rootTemplate = _ref.rootTemplate,
+ _viewRegistry = _ref._viewRegistry;
+
+ return new this(env, rootTemplate, _viewRegistry, false);
+ };
+
+ InertRenderer.prototype.getElement = function getElement(_view) {
+ throw new Error('Accessing `this.element` is not allowed in non-interactive environments (such as FastBoot).');
+ };
+
+ return InertRenderer;
+ }(Renderer);
+
+ var InteractiveRenderer = exports.InteractiveRenderer = function (_Renderer2) {
+ (0, _emberBabel.inherits)(InteractiveRenderer, _Renderer2);
+
+ function InteractiveRenderer() {
+ (0, _emberBabel.classCallCheck)(this, InteractiveRenderer);
+ return (0, _emberBabel.possibleConstructorReturn)(this, _Renderer2.apply(this, arguments));
+ }
+
+ InteractiveRenderer.create = function create(_ref2) {
+ var env = _ref2.env,
+ rootTemplate = _ref2.rootTemplate,
+ _viewRegistry = _ref2._viewRegistry;
+
+ return new this(env, rootTemplate, _viewRegistry, true);
+ };
+
+ InteractiveRenderer.prototype.getElement = function getElement(view) {
+ return (0, _emberViews.getViewElement)(view);
+ };
+
+ return InteractiveRenderer;
+ }(Renderer);
+});
+enifed('ember-glimmer/setup-registry', ['exports', 'ember-babel', 'container', 'ember-environment', 'ember-glimmer/component', 'ember-glimmer/components/checkbox', 'ember-glimmer/components/link-to', 'ember-glimmer/components/text_area', 'ember-glimmer/components/text_field', 'ember-glimmer/dom', 'ember-glimmer/environment', 'ember-glimmer/renderer', 'ember-glimmer/templates/component', 'ember-glimmer/templates/outlet', 'ember-glimmer/templates/root', 'ember-glimmer/views/outlet', 'ember-glimmer/helpers/loc', 'ember/features'], function (exports, _emberBabel, _container, _emberEnvironment, _component, _checkbox, _linkTo, _text_area, _text_field, _dom, _environment, _renderer, _component2, _outlet, _root, _outlet2, _loc, _features) {
+ 'use strict';
+
+ exports.setupApplicationRegistry = setupApplicationRegistry;
+ exports.setupEngineRegistry = setupEngineRegistry;
+
+ var _templateObject = (0, _emberBabel.taggedTemplateLiteralLoose)(['template:-root'], ['template:-root']),
+ _templateObject2 = (0, _emberBabel.taggedTemplateLiteralLoose)(['template:components/-default'], ['template:components/-default']),
+ _templateObject3 = (0, _emberBabel.taggedTemplateLiteralLoose)(['component:-default'], ['component:-default']);
+
+ function setupApplicationRegistry(registry) {
+ registry.injection('service:-glimmer-environment', 'appendOperations', 'service:-dom-tree-construction');
+ registry.injection('renderer', 'env', 'service:-glimmer-environment');
+ registry.register((0, _container.privatize)(_templateObject), _root.default);
+ registry.injection('renderer', 'rootTemplate', (0, _container.privatize)(_templateObject));
+ registry.register('renderer:-dom', _renderer.InteractiveRenderer);
+ registry.register('renderer:-inert', _renderer.InertRenderer);
+ if (_emberEnvironment.environment.hasDOM) {
+ registry.injection('service:-glimmer-environment', 'updateOperations', 'service:-dom-changes');
+ }
+ registry.register('service:-dom-changes', {
+ create: function (_ref) {
+ var document = _ref.document;
+
+ return new _dom.DOMChanges(document);
+ }
+ });
+ registry.register('service:-dom-tree-construction', {
+ create: function (_ref2) {
+ var document = _ref2.document;
+
+ var Implementation = _emberEnvironment.environment.hasDOM ? _dom.DOMTreeConstruction : _dom.NodeDOMTreeConstruction;
+ return new Implementation(document);
+ }
+ });
+ }
+ function setupEngineRegistry(registry) {
+ registry.register('view:-outlet', _outlet2.default);
+ registry.register('template:-outlet', _outlet.default);
+ registry.injection('view:-outlet', 'template', 'template:-outlet');
+ registry.injection('service:-dom-changes', 'document', 'service:-document');
+ registry.injection('service:-dom-tree-construction', 'document', 'service:-document');
+ registry.register((0, _container.privatize)(_templateObject2), _component2.default);
+ registry.register('service:-glimmer-environment', _environment.default);
+ registry.injection('template', 'env', 'service:-glimmer-environment');
+ registry.optionsForType('helper', { instantiate: false });
+ registry.register('helper:loc', _loc.default);
+ registry.register('component:-text-field', _text_field.default);
+ registry.register('component:-text-area', _text_area.default);
+ registry.register('component:-checkbox', _checkbox.default);
+ registry.register('component:link-to', _linkTo.default);
+ if (!_features.EMBER_GLIMMER_TEMPLATE_ONLY_COMPONENTS) {
+ registry.register((0, _container.privatize)(_templateObject3), _component.default);
+ }
+ }
+});
+enifed('ember-glimmer/syntax', ['exports', 'ember-debug', 'ember-environment', 'ember-glimmer/syntax/-text-area', 'ember-glimmer/syntax/dynamic-component', 'ember-glimmer/syntax/input', 'ember-glimmer/syntax/mount', 'ember-glimmer/syntax/outlet', 'ember-glimmer/syntax/render', 'ember-glimmer/syntax/utils', 'ember-glimmer/utils/bindings'], function (exports, _emberDebug, _emberEnvironment, _textArea, _dynamicComponent, _input, _mount, _outlet, _render, _utils, _bindings) {
+ 'use strict';
+
+ exports.experimentalMacros = undefined;
+ exports.registerMacros = registerMacros;
+ exports.populateMacros = populateMacros;
+
+ function refineInlineSyntax(name, params, hash, builder) {
+ (true && !(!(builder.env.builtInHelpers[name] && builder.env.owner.hasRegistration('helper:' + name))) && (0, _emberDebug.assert)('You attempted to overwrite the built-in helper "' + name + '" which is not allowed. Please rename the helper.', !(builder.env.builtInHelpers[name] && builder.env.owner.hasRegistration('helper:' + name))));
+
+ var definition = void 0;
+ if (name.indexOf('-') > -1) {
+ definition = builder.env.getComponentDefinition(name, builder.meta.templateMeta);
+ }
+ if (definition) {
+ (0, _bindings.wrapComponentClassAttribute)(hash);
+ builder.component.static(definition, [params, (0, _utils.hashToArgs)(hash), null, null]);
+ return true;
+ }
+ return false;
+ }
+ function refineBlockSyntax(name, params, hash, _default, inverse, builder) {
+ if (name.indexOf('-') === -1) {
+ return false;
+ }
+ var meta = builder.meta.templateMeta;
+ var definition = void 0;
+ if (name.indexOf('-') > -1) {
+ definition = builder.env.getComponentDefinition(name, meta);
+ }
+ if (definition) {
+ (0, _bindings.wrapComponentClassAttribute)(hash);
+ builder.component.static(definition, [params, (0, _utils.hashToArgs)(hash), _default, inverse]);
+ return true;
+ }
+ (true && !(builder.env.hasHelper(name, meta)) && (0, _emberDebug.assert)('A component or helper named "' + name + '" could not be found', builder.env.hasHelper(name, meta)));
+ (true && !(!builder.env.hasHelper(name, meta)) && (0, _emberDebug.assert)('Helpers may not be used in the block form, for example {{#' + name + '}}{{/' + name + '}}. Please use a component, or alternatively use the helper in combination with a built-in Ember helper, for example {{#if (' + name + ')}}{{/if}}.', !builder.env.hasHelper(name, meta)));
+
+ return false;
+ }
+ var experimentalMacros = exports.experimentalMacros = [];
+ // This is a private API to allow for experimental macros
+ // to be created in user space. Registering a macro should
+ // should be done in an initializer.
+ function registerMacros(macro) {
+ experimentalMacros.push(macro);
+ }
+ function populateMacros(blocks, inlines) {
+ inlines.add('outlet', _outlet.outletMacro);
+ inlines.add('component', _dynamicComponent.inlineComponentMacro);
+ if (_emberEnvironment.ENV._ENABLE_RENDER_SUPPORT === true) {
+ inlines.add('render', _render.renderMacro);
+ }
+ inlines.add('mount', _mount.mountMacro);
+ inlines.add('input', _input.inputMacro);
+ inlines.add('textarea', _textArea.textAreaMacro);
+ inlines.addMissing(refineInlineSyntax);
+ blocks.add('component', _dynamicComponent.blockComponentMacro);
+ blocks.addMissing(refineBlockSyntax);
+ for (var i = 0; i < experimentalMacros.length; i++) {
+ var macro = experimentalMacros[i];
+ macro(blocks, inlines);
+ }
+ return { blocks: blocks, inlines: inlines };
+ }
+});
+enifed('ember-glimmer/syntax/-text-area', ['exports', 'ember-glimmer/utils/bindings', 'ember-glimmer/syntax/utils'], function (exports, _bindings, _utils) {
+ 'use strict';
+
+ exports.textAreaMacro = textAreaMacro;
+ function textAreaMacro(_name, params, hash, builder) {
+ var definition = builder.env.getComponentDefinition('-text-area', builder.meta.templateMeta);
+ (0, _bindings.wrapComponentClassAttribute)(hash);
+ builder.component.static(definition, [params, (0, _utils.hashToArgs)(hash), null, null]);
+ return true;
+ }
+});
+enifed('ember-glimmer/syntax/dynamic-component', ['exports', 'ember-babel', '@glimmer/runtime', 'ember-debug', 'ember-glimmer/syntax/utils'], function (exports, _emberBabel, _runtime, _emberDebug, _utils) {
+ 'use strict';
+
+ exports.dynamicComponentMacro = dynamicComponentMacro;
+ exports.blockComponentMacro = blockComponentMacro;
+ exports.inlineComponentMacro = inlineComponentMacro;
+
+ function dynamicComponentFor(vm, args, meta) {
+ var env = vm.env;
+ var nameRef = args.positional.at(0);
+ return new DynamicComponentReference({ nameRef: nameRef, env: env, meta: meta, args: null });
+ }
+ function dynamicComponentMacro(params, hash, _default, _inverse, builder) {
+ var definitionArgs = [params.slice(0, 1), null, null, null];
+ var args = [params.slice(1), (0, _utils.hashToArgs)(hash), null, null];
+ builder.component.dynamic(definitionArgs, dynamicComponentFor, args);
+ return true;
+ }
+ function blockComponentMacro(params, hash, _default, inverse, builder) {
+ var definitionArgs = [params.slice(0, 1), null, null, null];
+ var args = [params.slice(1), (0, _utils.hashToArgs)(hash), _default, inverse];
+ builder.component.dynamic(definitionArgs, dynamicComponentFor, args);
+ return true;
+ }
+ function inlineComponentMacro(_name, params, hash, builder) {
+ var definitionArgs = [params.slice(0, 1), null, null, null];
+ var args = [params.slice(1), (0, _utils.hashToArgs)(hash), null, null];
+ builder.component.dynamic(definitionArgs, dynamicComponentFor, args);
+ return true;
+ }
+
+ var DynamicComponentReference = function () {
+ function DynamicComponentReference(_ref) {
+ var nameRef = _ref.nameRef,
+ env = _ref.env,
+ meta = _ref.meta,
+ args = _ref.args;
+ (0, _emberBabel.classCallCheck)(this, DynamicComponentReference);
+
+ this.tag = nameRef.tag;
+ this.nameRef = nameRef;
+ this.env = env;
+ this.meta = meta;
+ this.args = args;
+ }
+
+ DynamicComponentReference.prototype.value = function value() {
+ var env = this.env,
+ nameRef = this.nameRef,
+ meta = this.meta;
+
+ var nameOrDef = nameRef.value();
+ if (typeof nameOrDef === 'string') {
+ var definition = env.getComponentDefinition(nameOrDef, meta);
+ // tslint:disable-next-line:max-line-length
+ (true && !(!!definition) && (0, _emberDebug.assert)('Could not find component named "' + nameOrDef + '" (no component or template with that name was found)', !!definition));
+
+ return definition;
+ } else if ((0, _runtime.isComponentDefinition)(nameOrDef)) {
+ return nameOrDef;
+ } else {
+ return null;
+ }
+ };
+
+ DynamicComponentReference.prototype.get = function get() {};
+
+ return DynamicComponentReference;
+ }();
+});
+enifed('ember-glimmer/syntax/input', ['exports', 'ember-debug', 'ember-glimmer/utils/bindings', 'ember-glimmer/syntax/dynamic-component', 'ember-glimmer/syntax/utils'], function (exports, _emberDebug, _bindings, _dynamicComponent, _utils) {
+ 'use strict';
+
+ exports.inputMacro = inputMacro;
+ /**
+ @module ember
+ */
+ function buildSyntax(type, params, hash, builder) {
+ var definition = builder.env.getComponentDefinition(type, builder.meta.templateMeta);
+ builder.component.static(definition, [params, (0, _utils.hashToArgs)(hash), null, null]);
+ return true;
+ }
+ /**
+ The `{{input}}` helper lets you create an HTML `<input />` component.
+ It causes an `TextField` component to be rendered. For more info,
+ see the [TextField](/api/ember/release/classes/TextField) docs and
+ the [templates guide](https://emberjs.com/guides/templates/input-helpers/).
+
+ ```handlebars
+ {{input value="987"}}
+ ```
+
+ renders as:
+
+ ```HTML
+ <input type="text" value="987" />
+ ```
+
+ ### Text field
+
+ If no `type` option is specified, a default of type 'text' is used.
+ Many of the standard HTML attributes may be passed to this helper.
+ <table>
+ <tr><td>`readonly`</td><td>`required`</td><td>`autofocus`</td></tr>
+ <tr><td>`value`</td><td>`placeholder`</td><td>`disabled`</td></tr>
+ <tr><td>`size`</td><td>`tabindex`</td><td>`maxlength`</td></tr>
+ <tr><td>`name`</td><td>`min`</td><td>`max`</td></tr>
+ <tr><td>`pattern`</td><td>`accept`</td><td>`autocomplete`</td></tr>
+ <tr><td>`autosave`</td><td>`formaction`</td><td>`formenctype`</td></tr>
+ <tr><td>`formmethod`</td><td>`formnovalidate`</td><td>`formtarget`</td></tr>
+ <tr><td>`height`</td><td>`inputmode`</td><td>`multiple`</td></tr>
+ <tr><td>`step`</td><td>`width`</td><td>`form`</td></tr>
+ <tr><td>`selectionDirection`</td><td>`spellcheck`</td><td>&nbsp;</td></tr>
+ </table>
+ When set to a quoted string, these values will be directly applied to the HTML
+ element. When left unquoted, these values will be bound to a property on the
+ template's current rendering context (most typically a controller instance).
+ A very common use of this helper is to bind the `value` of an input to an Object's attribute:
+
+ ```handlebars
+ Search:
+ {{input value=searchWord}}
+ ```
+
+ In this example, the initial value in the `<input />` will be set to the value of `searchWord`.
+ If the user changes the text, the value of `searchWord` will also be updated.
+
+ ### Actions
+
+ The helper can send multiple actions based on user events.
+ The action property defines the action which is sent when
+ the user presses the return key.
+
+ ```handlebars
+ {{input action="submit"}}
+ ```
+
+ The helper allows some user events to send actions.
+
+ * `enter`
+ * `insert-newline`
+ * `escape-press`
+ * `focus-in`
+ * `focus-out`
+ * `key-press`
+ * `key-up`
+
+ For example, if you desire an action to be sent when the input is blurred,
+ you only need to setup the action name to the event name property.
+
+ ```handlebars
+ {{input focus-out="alertMessage"}}
+ ```
+ See more about [Text Support Actions](/api/ember/release/classes/TextField)
+
+ ### Extending `TextField`
+
+ Internally, `{{input type="text"}}` creates an instance of `TextField`, passing
+ arguments from the helper to `TextField`'s `create` method. You can extend the
+ capabilities of text inputs in your applications by reopening this class. For example,
+ if you are building a Bootstrap project where `data-*` attributes are used, you
+ can add one to the `TextField`'s `attributeBindings` property:
+
+ ```javascript
+ import TextField from '@ember/component/text-field';
+ TextField.reopen({
+ attributeBindings: ['data-error']
+ });
+ ```
+
+ Keep in mind when writing `TextField` subclasses that `TextField`
+ itself extends `Component`. Expect isolated component semantics, not
+ legacy 1.x view semantics (like `controller` being present).
+ See more about [Ember components](/api/ember/release/classes/Component)
+
+ ### Checkbox
+
+ Checkboxes are special forms of the `{{input}}` helper. To create a `<checkbox />`:
+
+ ```handlebars
+ Emberize Everything:
+ {{input type="checkbox" name="isEmberized" checked=isEmberized}}
+ ```
+
+ This will bind checked state of this checkbox to the value of `isEmberized` -- if either one changes,
+ it will be reflected in the other.
+
+ The following HTML attributes can be set via the helper:
+
+ * `checked`
+ * `disabled`
+ * `tabindex`
+ * `indeterminate`
+ * `name`
+ * `autofocus`
+ * `form`
+
+ ### Extending `Checkbox`
+
+ Internally, `{{input type="checkbox"}}` creates an instance of `Checkbox`, passing
+ arguments from the helper to `Checkbox`'s `create` method. You can extend the
+ capablilties of checkbox inputs in your applications by reopening this class. For example,
+ if you wanted to add a css class to all checkboxes in your application:
+
+ ```javascript
+ import Checkbox from '@ember/component/checkbox';
+
+ Checkbox.reopen({
+ classNames: ['my-app-checkbox']
+ });
+ ```
+
+ @method input
+ @for Ember.Templates.helpers
+ @param {Hash} options
+ @public
+ */
+ function inputMacro(_name, params, hash, builder) {
+ var keys = void 0;
+ var values = void 0;
+ var typeIndex = -1;
+ var valueIndex = -1;
+ if (hash) {
+ keys = hash[0];
+ values = hash[1];
+ typeIndex = keys.indexOf('type');
+ valueIndex = keys.indexOf('value');
+ }
+ if (!params) {
+ params = [];
+ }
+ if (typeIndex > -1) {
+ var typeArg = values[typeIndex];
+ if (Array.isArray(typeArg)) {
+ return (0, _dynamicComponent.dynamicComponentMacro)(params, hash, null, null, builder);
+ } else if (typeArg === 'checkbox') {
+ (true && !(valueIndex === -1) && (0, _emberDebug.assert)('{{input type=\'checkbox\'}} does not support setting `value=someBooleanValue`; ' + 'you must use `checked=someBooleanValue` instead.', valueIndex === -1));
+
+ (0, _bindings.wrapComponentClassAttribute)(hash);
+ return buildSyntax('-checkbox', params, hash, builder);
+ }
+ }
+ return buildSyntax('-text-field', params, hash, builder);
+ }
+});
+enifed('ember-glimmer/syntax/mount', ['exports', 'ember-babel', 'ember-debug', 'ember/features', 'ember-glimmer/component-managers/mount', 'ember-glimmer/syntax/utils'], function (exports, _emberBabel, _emberDebug, _features, _mount, _utils) {
+ 'use strict';
+
+ exports.mountMacro = mountMacro;
+
+ function dynamicEngineFor(vm, args, meta) {
+ var env = vm.env;
+ var nameRef = args.positional.at(0);
+ return new DynamicEngineReference({ nameRef: nameRef, env: env, meta: meta });
+ }
+ /**
+ The `{{mount}}` helper lets you embed a routeless engine in a template.
+ Mounting an engine will cause an instance to be booted and its `application`
+ template to be rendered.
+
+ For example, the following template mounts the `ember-chat` engine:
+
+ ```handlebars
+ {{! application.hbs }}
+ {{mount "ember-chat"}}
+ ```
+
+ Additionally, you can also pass in a `model` argument that will be
+ set as the engines model. This can be an existing object:
+
+ ```
+ <div>
+ {{mount 'admin' model=userSettings}}
+ </div>
+ ```
+
+ Or an inline `hash`, and you can even pass components:
+
+ ```
+ <div>
+ <h1>Application template!</h1>
+ {{mount 'admin' model=(hash
+ title='Secret Admin'
+ signInButton=(component 'sign-in-button')
+ )}}
+ </div>
+ ```
+
+ @method mount
+ @param {String} name Name of the engine to mount.
+ @param {Object} [model] Object that will be set as
+ the model of the engine.
+ @for Ember.Templates.helpers
+ @category ember-application-engines
+ @public
+ */
+ function mountMacro(_name, params, hash, builder) {
+ if (_features.EMBER_ENGINES_MOUNT_PARAMS) {
+ (true && !(params.length === 1) && (0, _emberDebug.assert)('You can only pass a single positional argument to the {{mount}} helper, e.g. {{mount "chat-engine"}}.', params.length === 1));
+ } else {
+ (true && !(params.length === 1 && hash === null) && (0, _emberDebug.assert)('You can only pass a single argument to the {{mount}} helper, e.g. {{mount "chat-engine"}}.', params.length === 1 && hash === null));
+ }
+ var definitionArgs = [params.slice(0, 1), null, null, null];
+ var args = [null, (0, _utils.hashToArgs)(hash), null, null];
+ builder.component.dynamic(definitionArgs, dynamicEngineFor, args);
+ return true;
+ }
+
+ var DynamicEngineReference = function () {
+ function DynamicEngineReference(_ref) {
+ var nameRef = _ref.nameRef,
+ env = _ref.env,
+ meta = _ref.meta;
+ (0, _emberBabel.classCallCheck)(this, DynamicEngineReference);
+
+ this.tag = nameRef.tag;
+ this.nameRef = nameRef;
+ this.env = env;
+ this.meta = meta;
+ this._lastName = undefined;
+ this._lastDef = undefined;
+ }
+
+ DynamicEngineReference.prototype.value = function value() {
+ var env = this.env,
+ nameRef = this.nameRef;
+
+ var nameOrDef = nameRef.value();
+ if (typeof nameOrDef === 'string') {
+ if (this._lastName === nameOrDef) {
+ return this._lastDef;
+ }
+ (true && !(env.owner.hasRegistration('engine:' + nameOrDef)) && (0, _emberDebug.assert)('You used `{{mount \'' + nameOrDef + '\'}}`, but the engine \'' + nameOrDef + '\' can not be found.', env.owner.hasRegistration('engine:' + nameOrDef)));
+
+ if (!env.owner.hasRegistration('engine:' + nameOrDef)) {
+ return null;
+ }
+ this._lastName = nameOrDef;
+ this._lastDef = new _mount.MountDefinition(nameOrDef);
+ return this._lastDef;
+ } else {
+ (true && !(nameOrDef === null || nameOrDef === undefined) && (0, _emberDebug.assert)('Invalid engine name \'' + nameOrDef + '\' specified, engine name must be either a string, null or undefined.', nameOrDef === null || nameOrDef === undefined));
+
+ return null;
+ }
+ };
+
+ return DynamicEngineReference;
+ }();
+});
+enifed('ember-glimmer/syntax/outlet', ['exports', 'ember-babel', '@glimmer/reference', 'ember-glimmer/component-managers/outlet'], function (exports, _emberBabel, _reference, _outlet) {
+ 'use strict';
+
+ exports.outletMacro = outletMacro;
+
+ var OutletComponentReference = function () {
+ function OutletComponentReference(outletNameRef, parentOutletStateRef) {
+ (0, _emberBabel.classCallCheck)(this, OutletComponentReference);
+
+ this.outletNameRef = outletNameRef;
+ this.parentOutletStateRef = parentOutletStateRef;
+ this.definition = null;
+ this.lastState = null;
+ var outletStateTag = this.outletStateTag = _reference.UpdatableTag.create(parentOutletStateRef.tag);
+ this.tag = (0, _reference.combine)([outletStateTag.inner, outletNameRef.tag]);
+ }
+
+ OutletComponentReference.prototype.value = function value() {
+ var outletNameRef = this.outletNameRef,
+ parentOutletStateRef = this.parentOutletStateRef,
+ definition = this.definition,
+ lastState = this.lastState;
+
+ var outletName = outletNameRef.value();
+ var outletStateRef = parentOutletStateRef.get('outlets').get(outletName);
+ var newState = this.lastState = outletStateRef.value();
+ this.outletStateTag.inner.update(outletStateRef.tag);
+ definition = revalidate(definition, lastState, newState);
+ var hasTemplate = newState && newState.render.template;
+ if (definition) {
+ return definition;
+ } else if (hasTemplate) {
+ return this.definition = new _outlet.OutletComponentDefinition(outletName, newState.render.template);
+ } else {
+ return this.definition = null;
+ }
+ };
+
+ return OutletComponentReference;
+ }();
+
+ function revalidate(definition, lastState, newState) {
+ if (!lastState && !newState) {
+ return definition;
+ }
+ if (!lastState && newState || lastState && !newState) {
+ return null;
+ }
+ if (newState.render.template === lastState.render.template && newState.render.controller === lastState.render.controller) {
+ return definition;
+ }
+ return null;
+ }
+ function outletComponentFor(vm, args) {
+ var _vm$dynamicScope = vm.dynamicScope(),
+ outletState = _vm$dynamicScope.outletState;
+
+ var outletNameRef = void 0;
+ if (args.positional.length === 0) {
+ outletNameRef = new _reference.ConstReference('main');
+ } else {
+ outletNameRef = args.positional.at(0);
+ }
+ return new OutletComponentReference(outletNameRef, outletState);
+ }
+ /**
+ The `{{outlet}}` helper lets you specify where a child route will render in
+ your template. An important use of the `{{outlet}}` helper is in your
+ application's `application.hbs` file:
+
+ ```handlebars
+ {{! app/templates/application.hbs }}
+ <!-- header content goes here, and will always display -->
+ {{my-header}}
+ <div class="my-dynamic-content">
+ <!-- this content will change based on the current route, which depends on the current URL -->
+ {{outlet}}
+ </div>
+ <!-- footer content goes here, and will always display -->
+ {{my-footer}}
+ ```
+
+ See [templates guide](https://emberjs.com/guides/templates/the-application-template/) for
+ additional information on using `{{outlet}}` in `application.hbs`.
+ You may also specify a name for the `{{outlet}}`, which is useful when using more than one
+ `{{outlet}}` in a template:
+
+ ```handlebars
+ {{outlet "menu"}}
+ {{outlet "sidebar"}}
+ {{outlet "main"}}
+ ```
+
+ Your routes can then render into a specific one of these `outlet`s by specifying the `outlet`
+ attribute in your `renderTemplate` function:
+
+ ```app/routes/menu.js
+ import Route from '@ember/routing/route';
+
+ export default Route.extend({
+ renderTemplate() {
+ this.render({ outlet: 'menu' });
+ }
+ });
+ ```
+
+ See the [routing guide](https://emberjs.com/guides/routing/rendering-a-template/) for more
+ information on how your `route` interacts with the `{{outlet}}` helper.
+ Note: Your content __will not render__ if there isn't an `{{outlet}}` for it.
+
+ @method outlet
+ @param {String} [name]
+ @for Ember.Templates.helpers
+ @public
+ */
+ function outletMacro(_name, params, _hash, builder) {
+ if (!params) {
+ params = [];
+ }
+ var definitionArgs = [params.slice(0, 1), null, null, null];
+ var emptyArgs = [[], null, null, null]; // FIXME
+ builder.component.dynamic(definitionArgs, outletComponentFor, emptyArgs);
+ return true;
+ }
+});
+enifed('ember-glimmer/syntax/render', ['exports', '@glimmer/reference', 'ember-debug', 'ember-glimmer/component-managers/render', 'ember-glimmer/syntax/utils'], function (exports, _reference, _emberDebug, _render, _utils) {
+ 'use strict';
+
+ exports.renderMacro = renderMacro;
+ /**
+ @module ember
+
+ Remove after 3.4 once _ENABLE_RENDER_SUPPORT flag is no longer needed.
+ */
+ function makeComponentDefinition(vm, args) {
+ var env = vm.env;
+ var nameRef = args.positional.at(0);
+ (true && !((0, _reference.isConst)(nameRef)) && (0, _emberDebug.assert)('The first argument of {{render}} must be quoted, e.g. {{render "sidebar"}}.', (0, _reference.isConst)(nameRef)));
+ (true && !(args.positional.length === 1 || !(0, _reference.isConst)(args.positional.at(1))) && (0, _emberDebug.assert)('The second argument of {{render}} must be a path, e.g. {{render "post" post}}.', args.positional.length === 1 || !(0, _reference.isConst)(args.positional.at(1))));
+
+ var templateName = nameRef.value();
+ // tslint:disable-next-line:max-line-length
+ (true && !(env.owner.hasRegistration('template:' + templateName)) && (0, _emberDebug.assert)('You used `{{render \'' + templateName + '\'}}`, but \'' + templateName + '\' can not be found as a template.', env.owner.hasRegistration('template:' + templateName)));
+
+ var template = env.owner.lookup('template:' + templateName);
+ var controllerName = void 0;
+ if (args.named.has('controller')) {
+ var controllerNameRef = args.named.get('controller');
+ // tslint:disable-next-line:max-line-length
+ (true && !((0, _reference.isConst)(controllerNameRef)) && (0, _emberDebug.assert)('The controller argument for {{render}} must be quoted, e.g. {{render "sidebar" controller="foo"}}.', (0, _reference.isConst)(controllerNameRef)));
+
+ // TODO should be ensuring this to string here
+ controllerName = controllerNameRef.value();
+ // tslint:disable-next-line:max-line-length
+ (true && !(env.owner.hasRegistration('controller:' + controllerName)) && (0, _emberDebug.assert)('The controller name you supplied \'' + controllerName + '\' did not resolve to a controller.', env.owner.hasRegistration('controller:' + controllerName)));
+ } else {
+ controllerName = templateName;
+ }
+ if (args.positional.length === 1) {
+ return new _reference.ConstReference(new _render.RenderDefinition(controllerName, template, env, _render.SINGLETON_RENDER_MANAGER));
+ } else {
+ return new _reference.ConstReference(new _render.RenderDefinition(controllerName, template, env, _render.NON_SINGLETON_RENDER_MANAGER));
+ }
+ }
+ /**
+ Calling ``{{render}}`` from within a template will insert another
+ template that matches the provided name. The inserted template will
+ access its properties on its own controller (rather than the controller
+ of the parent template).
+
+ If a view class with the same name exists, the view class also will be used.
+ Note: A given controller may only be used *once* in your app in this manner.
+ A singleton instance of the controller will be created for you.
+
+ Example:
+
+ ```app/controllers/navigation.js
+ import Controller from '@ember/controller';
+
+ export default Controller.extend({
+ who: "world"
+ });
+ ```
+
+ ```handlebars
+ <!-- navigation.hbs -->
+ Hello, {{who}}.
+ ```
+
+ ```handlebars
+ <!-- application.hbs -->
+ <h1>My great app</h1>
+ {{render "navigation"}}
+ ```
+
+ ```html
+ <h1>My great app</h1>
+ <div class='ember-view'>
+ Hello, world.
+ </div>
+ ```
+
+ Optionally you may provide a second argument: a property path
+ that will be bound to the `model` property of the controller.
+ If a `model` property path is specified, then a new instance of the
+ controller will be created and `{{render}}` can be used multiple times
+ with the same name.
+
+ For example if you had this `author` template.
+
+ ```handlebars
+ <div class="author">
+ Written by {{firstName}} {{lastName}}.
+ Total Posts: {{postCount}}
+ </div>
+ ```
+
+ You could render it inside the `post` template using the `render` helper.
+
+ ```handlebars
+ <div class="post">
+ <h1>{{title}}</h1>
+ <div>{{body}}</div>
+ {{render "author" author}}
+ </div>
+ ```
+
+ @method render
+ @for Ember.Templates.helpers
+ @param {String} name
+ @param {Object?} context
+ @param {Hash} options
+ @return {String} HTML string
+ @public
+ @deprecated Use a component instead
+ */
+ function renderMacro(_name, params, hash, builder) {
+ if (!params) {
+ params = [];
+ }
+ var definitionArgs = [params.slice(0), hash, null, null];
+ var args = [params.slice(1), (0, _utils.hashToArgs)(hash), null, null];
+ builder.component.dynamic(definitionArgs, makeComponentDefinition, args);
+ return true;
+ }
+});
+enifed("ember-glimmer/syntax/utils", ["exports"], function (exports) {
+ "use strict";
+
+ exports.hashToArgs = hashToArgs;
+ function hashToArgs(hash) {
+ if (hash === null) {
+ return null;
+ }
+ var names = hash[0].map(function (key) {
+ return "@" + key;
+ });
+ return [names, hash[1]];
+ }
+});
+enifed('ember-glimmer/template', ['exports', 'ember-babel', '@glimmer/runtime', 'ember-utils'], function (exports, _emberBabel, _runtime, _emberUtils) {
+ 'use strict';
+
+ exports.WrappedTemplateFactory = undefined;
+ exports.default = template;
+
+ var WrappedTemplateFactory = exports.WrappedTemplateFactory = function () {
+ function WrappedTemplateFactory(factory) {
+ (0, _emberBabel.classCallCheck)(this, WrappedTemplateFactory);
+
+ this.factory = factory;
+ this.id = factory.id;
+ this.meta = factory.meta;
+ }
+
+ WrappedTemplateFactory.prototype.create = function create(props) {
+ var owner = props[_emberUtils.OWNER];
+ return this.factory.create(props.env, { owner: owner });
+ };
+
+ return WrappedTemplateFactory;
+ }();
+
+ function template(json) {
+ var factory = (0, _runtime.templateFactory)(json);
+ return new WrappedTemplateFactory(factory);
+ }
+});
+enifed("ember-glimmer/template_registry", ["exports"], function (exports) {
+ "use strict";
+
+ exports.setTemplates = setTemplates;
+ exports.getTemplates = getTemplates;
+ exports.getTemplate = getTemplate;
+ exports.hasTemplate = hasTemplate;
+ exports.setTemplate = setTemplate;
+ var TEMPLATES = {};
+ function setTemplates(templates) {
+ TEMPLATES = templates;
+ }
+ function getTemplates() {
+ return TEMPLATES;
+ }
+ function getTemplate(name) {
+ if (TEMPLATES.hasOwnProperty(name)) {
+ return TEMPLATES[name];
+ }
+ }
+ function hasTemplate(name) {
+ return TEMPLATES.hasOwnProperty(name);
+ }
+ function setTemplate(name, template) {
+ return TEMPLATES[name] = template;
+ }
+});
+enifed("ember-glimmer/templates/component", ["exports", "ember-glimmer/template"], function (exports, _template) {
+ "use strict";
+
+ exports.default = (0, _template.default)({ "id": "RxHsBKwy", "block": "{\"symbols\":[\"&default\"],\"statements\":[[11,1]],\"hasEval\":false}", "meta": { "moduleName": "packages/ember-glimmer/lib/templates/component.hbs" } });
+});
+enifed("ember-glimmer/templates/empty", ["exports", "ember-glimmer/template"], function (exports, _template) {
+ "use strict";
+
+ exports.default = (0, _template.default)({ "id": "5jp2oO+o", "block": "{\"symbols\":[],\"statements\":[],\"hasEval\":false}", "meta": { "moduleName": "packages/ember-glimmer/lib/templates/empty.hbs" } });
+});
+enifed("ember-glimmer/templates/link-to", ["exports", "ember-glimmer/template"], function (exports, _template) {
+ "use strict";
+
+ exports.default = (0, _template.default)({ "id": "VZn3uSPL", "block": "{\"symbols\":[\"&default\"],\"statements\":[[4,\"if\",[[20,[\"linkTitle\"]]],null,{\"statements\":[[1,[18,\"linkTitle\"],false]],\"parameters\":[]},{\"statements\":[[11,1]],\"parameters\":[]}]],\"hasEval\":false}", "meta": { "moduleName": "packages/ember-glimmer/lib/templates/link-to.hbs" } });
+});
+enifed("ember-glimmer/templates/outlet", ["exports", "ember-glimmer/template"], function (exports, _template) {
+ "use strict";
+
+ exports.default = (0, _template.default)({ "id": "/7rqcQ85", "block": "{\"symbols\":[],\"statements\":[[1,[18,\"outlet\"],false]],\"hasEval\":false}", "meta": { "moduleName": "packages/ember-glimmer/lib/templates/outlet.hbs" } });
+});
+enifed("ember-glimmer/templates/root", ["exports", "ember-glimmer/template"], function (exports, _template) {
+ "use strict";
+
+ exports.default = (0, _template.default)({ "id": "AdIsk/cm", "block": "{\"symbols\":[],\"statements\":[[1,[25,\"component\",[[19,0,[]]],null],false]],\"hasEval\":false}", "meta": { "moduleName": "packages/ember-glimmer/lib/templates/root.hbs" } });
+});
+enifed('ember-glimmer/utils/bindings', ['exports', 'ember-babel', '@glimmer/reference', '@glimmer/wire-format', 'ember-debug', 'ember-metal', 'ember-runtime', 'ember-glimmer/component', 'ember-glimmer/utils/string'], function (exports, _emberBabel, _reference, _wireFormat, _emberDebug, _emberMetal, _emberRuntime, _component, _string) {
+ 'use strict';
+
+ exports.ClassNameBinding = exports.IsVisibleBinding = exports.AttributeBinding = undefined;
+ exports.wrapComponentClassAttribute = wrapComponentClassAttribute;
+
+ function referenceForKey(component, key) {
+ return component[_component.ROOT_REF].get(key);
+ }
+ function referenceForParts(component, parts) {
+ var isAttrs = parts[0] === 'attrs';
+ // TODO deprecate this
+ if (isAttrs) {
+ parts.shift();
+ if (parts.length === 1) {
+ return referenceForKey(component, parts[0]);
+ }
+ }
+ return (0, _reference.referenceFromParts)(component[_component.ROOT_REF], parts);
+ }
+ // TODO we should probably do this transform at build time
+ function wrapComponentClassAttribute(hash) {
+ if (!hash) {
+ return hash;
+ }
+ var keys = hash[0],
+ values = hash[1];
+
+ var index = keys.indexOf('class');
+ if (index !== -1) {
+ var _values$index = values[index],
+ type = _values$index[0];
+
+ if (type === _wireFormat.Ops.Get || type === _wireFormat.Ops.MaybeLocal) {
+ var getExp = values[index];
+ var path = getExp[getExp.length - 1];
+ var propName = path[path.length - 1];
+ hash[1][index] = [_wireFormat.Ops.Helper, ['-class'], [getExp, propName]];
+ }
+ }
+ return hash;
+ }
+ var AttributeBinding = exports.AttributeBinding = {
+ parse: function (microsyntax) {
+ var colonIndex = microsyntax.indexOf(':');
+ if (colonIndex === -1) {
+ (true && !(microsyntax !== 'class') && (0, _emberDebug.assert)('You cannot use class as an attributeBinding, use classNameBindings instead.', microsyntax !== 'class'));
+
+ return [microsyntax, microsyntax, true];
+ } else {
+ var prop = microsyntax.substring(0, colonIndex);
+ var attribute = microsyntax.substring(colonIndex + 1);
+ (true && !(attribute !== 'class') && (0, _emberDebug.assert)('You cannot use class as an attributeBinding, use classNameBindings instead.', attribute !== 'class'));
+
+ return [prop, attribute, false];
+ }
+ },
+ install: function (element, component, parsed, operations) {
+ var prop = parsed[0],
+ attribute = parsed[1],
+ isSimple = parsed[2];
+
+ if (attribute === 'id') {
+ var elementId = (0, _emberMetal.get)(component, prop);
+ if (elementId === undefined || elementId === null) {
+ elementId = component.elementId;
+ }
+ operations.addStaticAttribute(element, 'id', elementId);
+ return;
+ }
+ var isPath = prop.indexOf('.') > -1;
+ var reference = isPath ? referenceForParts(component, prop.split('.')) : referenceForKey(component, prop);
+ (true && !(!(isSimple && isPath)) && (0, _emberDebug.assert)('Illegal attributeBinding: \'' + prop + '\' is not a valid attribute name.', !(isSimple && isPath)));
+
+ if (attribute === 'style') {
+ reference = new StyleBindingReference(reference, referenceForKey(component, 'isVisible'));
+ }
+ operations.addDynamicAttribute(element, attribute, reference, false);
+ }
+ };
+ var DISPLAY_NONE = 'display: none;';
+ var SAFE_DISPLAY_NONE = (0, _string.htmlSafe)(DISPLAY_NONE);
+
+ var StyleBindingReference = function (_CachedReference) {
+ (0, _emberBabel.inherits)(StyleBindingReference, _CachedReference);
+
+ function StyleBindingReference(inner, isVisible) {
+ (0, _emberBabel.classCallCheck)(this, StyleBindingReference);
+
+ var _this = (0, _emberBabel.possibleConstructorReturn)(this, _CachedReference.call(this));
+
+ _this.inner = inner;
+ _this.isVisible = isVisible;
+ _this.tag = (0, _reference.combine)([inner.tag, isVisible.tag]);
+ return _this;
+ }
+
+ StyleBindingReference.prototype.compute = function compute() {
+ var value = this.inner.value();
+ var isVisible = this.isVisible.value();
+ if (isVisible !== false) {
+ return value;
+ } else if (!value) {
+ return SAFE_DISPLAY_NONE;
+ } else {
+ var style = value + ' ' + DISPLAY_NONE;
+ return (0, _string.isHTMLSafe)(value) ? (0, _string.htmlSafe)(style) : style;
+ }
+ };
+
+ return StyleBindingReference;
+ }(_reference.CachedReference);
+
+ var IsVisibleBinding = exports.IsVisibleBinding = {
+ install: function (element, component, operations) {
+ var ref = (0, _reference.map)(referenceForKey(component, 'isVisible'), this.mapStyleValue);
+ // the upstream type for addDynamicAttribute's `value` argument
+ // appears to be incorrect. It is currently a Reference<string>, I
+ // think it should be a Reference<string|null>.
+ operations.addDynamicAttribute(element, 'style', ref, false);
+ },
+ mapStyleValue: function (isVisible) {
+ return isVisible === false ? SAFE_DISPLAY_NONE : null;
+ }
+ };
+ var ClassNameBinding = exports.ClassNameBinding = {
+ install: function (element, component, microsyntax, operations) {
+ var _microsyntax$split = microsyntax.split(':'),
+ prop = _microsyntax$split[0],
+ truthy = _microsyntax$split[1],
+ falsy = _microsyntax$split[2];
+
+ var isStatic = prop === '';
+ if (isStatic) {
+ operations.addStaticAttribute(element, 'class', truthy);
+ } else {
+ var isPath = prop.indexOf('.') > -1;
+ var parts = isPath ? prop.split('.') : [];
+ var value = isPath ? referenceForParts(component, parts) : referenceForKey(component, prop);
+ var ref = void 0;
+ if (truthy === undefined) {
+ ref = new SimpleClassNameBindingReference(value, isPath ? parts[parts.length - 1] : prop);
+ } else {
+ ref = new ColonClassNameBindingReference(value, truthy, falsy);
+ }
+ // the upstream type for addDynamicAttribute's `value` argument
+ // appears to be incorrect. It is currently a Reference<string>, I
+ // think it should be a Reference<string|null>.
+ operations.addDynamicAttribute(element, 'class', ref, false);
+ }
+ }
+ };
+
+ var SimpleClassNameBindingReference = function (_CachedReference2) {
+ (0, _emberBabel.inherits)(SimpleClassNameBindingReference, _CachedReference2);
+
+ function SimpleClassNameBindingReference(inner, path) {
+ (0, _emberBabel.classCallCheck)(this, SimpleClassNameBindingReference);
+
+ var _this2 = (0, _emberBabel.possibleConstructorReturn)(this, _CachedReference2.call(this));
+
+ _this2.inner = inner;
+ _this2.path = path;
+ _this2.tag = inner.tag;
+ _this2.inner = inner;
+ _this2.path = path;
+ _this2.dasherizedPath = null;
+ return _this2;
+ }
+
+ SimpleClassNameBindingReference.prototype.compute = function compute() {
+ var value = this.inner.value();
+ if (value === true) {
+ var path = this.path,
+ dasherizedPath = this.dasherizedPath;
+
+ return dasherizedPath || (this.dasherizedPath = _emberRuntime.String.dasherize(path));
+ } else if (value || value === 0) {
+ return String(value);
+ } else {
+ return null;
+ }
+ };
+
+ return SimpleClassNameBindingReference;
+ }(_reference.CachedReference);
+
+ var ColonClassNameBindingReference = function (_CachedReference3) {
+ (0, _emberBabel.inherits)(ColonClassNameBindingReference, _CachedReference3);
+
+ function ColonClassNameBindingReference(inner) {
+ var truthy = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
+ var falsy = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
+ (0, _emberBabel.classCallCheck)(this, ColonClassNameBindingReference);
+
+ var _this3 = (0, _emberBabel.possibleConstructorReturn)(this, _CachedReference3.call(this));
+
+ _this3.inner = inner;
+ _this3.truthy = truthy;
+ _this3.falsy = falsy;
+ _this3.tag = inner.tag;
+ return _this3;
+ }
+
+ ColonClassNameBindingReference.prototype.compute = function compute() {
+ var inner = this.inner,
+ truthy = this.truthy,
+ falsy = this.falsy;
+
+ return inner.value() ? truthy : falsy;
+ };
+
+ return ColonClassNameBindingReference;
+ }(_reference.CachedReference);
+});
+enifed('ember-glimmer/utils/curly-component-state-bucket', ['exports', 'ember-babel'], function (exports, _emberBabel) {
+ 'use strict';
+
+ // tslint:disable-next-line:no-empty
+ function NOOP() {}
+ /**
+ @module ember
+ */
+ /**
+ Represents the internal state of the component.
+
+ @class ComponentStateBucket
+ @private
+ */
+
+ var ComponentStateBucket = function () {
+ function ComponentStateBucket(environment, component, args, finalizer) {
+ (0, _emberBabel.classCallCheck)(this, ComponentStateBucket);
+
+ this.environment = environment;
+ this.component = component;
+ this.args = args;
+ this.finalizer = finalizer;
+ this.classRef = null;
+ this.classRef = null;
+ this.argsRevision = args.tag.value();
+ }
+
+ ComponentStateBucket.prototype.destroy = function destroy() {
+ var component = this.component,
+ environment = this.environment;
+
+ if (environment.isInteractive) {
+ component.trigger('willDestroyElement');
+ component.trigger('willClearRender');
+ }
+ environment.destroyedComponents.push(component);
+ };
+
+ ComponentStateBucket.prototype.finalize = function finalize() {
+ var finalizer = this.finalizer;
+
+ finalizer();
+ this.finalizer = NOOP;
+ };
+
+ return ComponentStateBucket;
+ }();
+
+ exports.default = ComponentStateBucket;
+});
+enifed('ember-glimmer/utils/debug-stack', ['exports', 'ember-babel'], function (exports, _emberBabel) {
+ 'use strict';
+
+ // @ts-check
+ var DebugStack = void 0;
+ if (true) {
+ var Element = function Element(name) {
+ (0, _emberBabel.classCallCheck)(this, Element);
+
+ this.name = name;
+ };
+
+ var TemplateElement = function (_Element) {
+ (0, _emberBabel.inherits)(TemplateElement, _Element);
+
+ function TemplateElement() {
+ (0, _emberBabel.classCallCheck)(this, TemplateElement);
+ return (0, _emberBabel.possibleConstructorReturn)(this, _Element.apply(this, arguments));
+ }
+
+ return TemplateElement;
+ }(Element);
+
+ var EngineElement = function (_Element2) {
+ (0, _emberBabel.inherits)(EngineElement, _Element2);
+
+ function EngineElement() {
+ (0, _emberBabel.classCallCheck)(this, EngineElement);
+ return (0, _emberBabel.possibleConstructorReturn)(this, _Element2.apply(this, arguments));
+ }
+
+ return EngineElement;
+ }(Element);
+
+ // tslint:disable-next-line:no-shadowed-variable
+ DebugStack = function () {
+ function DebugStack() {
+ (0, _emberBabel.classCallCheck)(this, DebugStack);
+
+ this._stack = [];
+ }
+
+ DebugStack.prototype.push = function push(name) {
+ this._stack.push(new TemplateElement(name));
+ };
+
+ DebugStack.prototype.pushEngine = function pushEngine(name) {
+ this._stack.push(new EngineElement(name));
+ };
+
+ DebugStack.prototype.pop = function pop() {
+ var element = this._stack.pop();
+ if (element) {
+ return element.name;
+ }
+ };
+
+ DebugStack.prototype.peek = function peek() {
+ var template = this._currentTemplate();
+ var engine = this._currentEngine();
+ if (engine) {
+ return '"' + template + '" (in "' + engine + '")';
+ } else if (template) {
+ return '"' + template + '"';
+ }
+ };
+
+ DebugStack.prototype._currentTemplate = function _currentTemplate() {
+ return this._getCurrentByType(TemplateElement);
+ };
+
+ DebugStack.prototype._currentEngine = function _currentEngine() {
+ return this._getCurrentByType(EngineElement);
+ };
+
+ DebugStack.prototype._getCurrentByType = function _getCurrentByType(type) {
+ for (var i = this._stack.length; i >= 0; i--) {
+ var element = this._stack[i];
+ if (element instanceof type) {
+ return element.name;
+ }
+ }
+ };
+
+ return DebugStack;
+ }();
+ }
+ exports.default = DebugStack;
+});
+enifed('ember-glimmer/utils/iterable', ['exports', 'ember-babel', '@glimmer/reference', 'ember-metal', 'ember-runtime', 'ember-utils', 'ember-glimmer/helpers/each-in', 'ember-glimmer/utils/references'], function (exports, _emberBabel, _reference, _emberMetal, _emberRuntime, _emberUtils, _eachIn, _references) {
+ 'use strict';
+
+ exports.default = iterableFor;
+
+ var ITERATOR_KEY_GUID = 'be277757-bbbe-4620-9fcb-213ef433cca2';
+ function iterableFor(ref, keyPath) {
+ if ((0, _eachIn.isEachIn)(ref)) {
+ return new EachInIterable(ref, keyForEachIn(keyPath));
+ } else {
+ return new ArrayIterable(ref, keyForArray(keyPath));
+ }
+ }
+ function keyForEachIn(keyPath) {
+ switch (keyPath) {
+ case '@index':
+ case undefined:
+ case null:
+ return index;
+ case '@identity':
+ return identity;
+ default:
+ return function (item) {
+ return (0, _emberMetal.get)(item, keyPath);
+ };
+ }
+ }
+ function keyForArray(keyPath) {
+ switch (keyPath) {
+ case '@index':
+ return index;
+ case '@identity':
+ case undefined:
+ case null:
+ return identity;
+ default:
+ return function (item) {
+ return (0, _emberMetal.get)(item, keyPath);
+ };
+ }
+ }
+ function index(_item, i) {
+ return String(i);
+ }
+ function identity(item) {
+ switch (typeof item) {
+ case 'string':
+ case 'number':
+ return String(item);
+ default:
+ return (0, _emberUtils.guidFor)(item);
+ }
+ }
+ function ensureUniqueKey(seen, key) {
+ var seenCount = seen[key];
+ if (seenCount > 0) {
+ seen[key]++;
+ return '' + key + ITERATOR_KEY_GUID + seenCount;
+ } else {
+ seen[key] = 1;
+ }
+ return key;
+ }
+
+ var ArrayIterator = function () {
+ function ArrayIterator(array, length, keyFor) {
+ (0, _emberBabel.classCallCheck)(this, ArrayIterator);
+
+ this.array = array;
+ this.length = length;
+ this.keyFor = keyFor;
+ this.position = 0;
+ this.seen = Object.create(null);
+ }
+
+ ArrayIterator.from = function from(array, keyFor) {
+ var length = array.length;
+
+ if (length > 0) {
+ return new this(array, array.length, keyFor);
+ } else {
+ return EMPTY_ITERATOR;
+ }
+ };
+
+ ArrayIterator.prototype.isEmpty = function isEmpty() {
+ return false;
+ };
+
+ ArrayIterator.prototype.getMemo = function getMemo(position) {
+ return position;
+ };
+
+ ArrayIterator.prototype.getValue = function getValue(position) {
+ return this.array[position];
+ };
+
+ ArrayIterator.prototype.next = function next() {
+ var length = this.length,
+ keyFor = this.keyFor,
+ position = this.position,
+ seen = this.seen;
+
+ if (position >= length) {
+ return null;
+ }
+ var value = this.getValue(position);
+ var memo = this.getMemo(position);
+ var key = ensureUniqueKey(seen, keyFor(value, memo));
+ this.position++;
+ return { key: key, value: value, memo: memo };
+ };
+
+ return ArrayIterator;
+ }();
+
+ var EmberArrayIterator = function (_ArrayIterator) {
+ (0, _emberBabel.inherits)(EmberArrayIterator, _ArrayIterator);
+
+ EmberArrayIterator.from = function from(array, keyFor) {
+ var length = (0, _emberMetal.get)(array, 'length');
+ if (length > 0) {
+ return new this(array, length, keyFor);
+ } else {
+ return EMPTY_ITERATOR;
+ }
+ };
+
+ function EmberArrayIterator(array, length, keyFor) {
+ (0, _emberBabel.classCallCheck)(this, EmberArrayIterator);
+ return (0, _emberBabel.possibleConstructorReturn)(this, _ArrayIterator.call(this, array, length, keyFor));
+ }
+
+ EmberArrayIterator.prototype.getValue = function getValue(position) {
+ return (0, _emberRuntime.objectAt)(this.array, position);
+ };
+
+ return EmberArrayIterator;
+ }(ArrayIterator);
+
+ var ObjectKeysIterator = function (_ArrayIterator2) {
+ (0, _emberBabel.inherits)(ObjectKeysIterator, _ArrayIterator2);
+
+ function ObjectKeysIterator(keys, values, length, keyFor) {
+ (0, _emberBabel.classCallCheck)(this, ObjectKeysIterator);
+
+ var _this2 = (0, _emberBabel.possibleConstructorReturn)(this, _ArrayIterator2.call(this, values, length, keyFor));
+
+ _this2.keys = keys;
+ return _this2;
+ }
+
+ ObjectKeysIterator.from = function from(obj, keyFor) {
+ var keys = Object.keys(obj);
+ var length = keys.length;
+
+ if (length > 0) {
+ return new this(keys, keys.map(function (key) {
+ return obj[key];
+ }), length, keyFor);
+ } else {
+ return EMPTY_ITERATOR;
+ }
+ };
+
+ ObjectKeysIterator.prototype.getMemo = function getMemo(position) {
+ return this.keys[position];
+ };
+
+ return ObjectKeysIterator;
+ }(ArrayIterator);
+
+ var EmptyIterator = function () {
+ function EmptyIterator() {
+ (0, _emberBabel.classCallCheck)(this, EmptyIterator);
+ }
+
+ EmptyIterator.prototype.isEmpty = function isEmpty() {
+ return true;
+ };
+
+ EmptyIterator.prototype.next = function next() {
+ throw new Error('Cannot call next() on an empty iterator');
+ };
+
+ return EmptyIterator;
+ }();
+
+ var EMPTY_ITERATOR = new EmptyIterator();
+
+ var EachInIterable = function () {
+ function EachInIterable(ref, keyFor) {
+ (0, _emberBabel.classCallCheck)(this, EachInIterable);
+
+ this.ref = ref;
+ this.keyFor = keyFor;
+ var valueTag = this.valueTag = _reference.UpdatableTag.create(_reference.CONSTANT_TAG);
+ this.tag = (0, _reference.combine)([ref.tag, valueTag]);
+ }
+
+ EachInIterable.prototype.iterate = function iterate() {
+ var ref = this.ref,
+ keyFor = this.keyFor,
+ valueTag = this.valueTag;
+
+ var iterable = ref.value();
+ valueTag.inner.update((0, _emberMetal.tagFor)(iterable));
+ if ((0, _emberMetal.isProxy)(iterable)) {
+ iterable = (0, _emberMetal.get)(iterable, 'content');
+ }
+ var typeofIterable = typeof iterable;
+ if (iterable !== null && (typeofIterable === 'object' || typeofIterable === 'function')) {
+ return ObjectKeysIterator.from(iterable, keyFor);
+ } else {
+ return EMPTY_ITERATOR;
+ }
+ };
+
+ EachInIterable.prototype.valueReferenceFor = function valueReferenceFor(item) {
+ return new _references.UpdatablePrimitiveReference(item.memo);
+ };
+
+ EachInIterable.prototype.updateValueReference = function updateValueReference(reference, item) {
+ reference.update(item.memo);
+ };
+
+ EachInIterable.prototype.memoReferenceFor = function memoReferenceFor(item) {
+ return new _references.UpdatableReference(item.value);
+ };
+
+ EachInIterable.prototype.updateMemoReference = function updateMemoReference(reference, item) {
+ reference.update(item.value);
+ };
+
+ return EachInIterable;
+ }();
+
+ var ArrayIterable = function () {
+ function ArrayIterable(ref, keyFor) {
+ (0, _emberBabel.classCallCheck)(this, ArrayIterable);
+
+ this.ref = ref;
+ this.keyFor = keyFor;
+ var valueTag = this.valueTag = _reference.UpdatableTag.create(_reference.CONSTANT_TAG);
+ this.tag = (0, _reference.combine)([ref.tag, valueTag]);
+ }
+
+ ArrayIterable.prototype.iterate = function iterate() {
+ var ref = this.ref,
+ keyFor = this.keyFor,
+ valueTag = this.valueTag;
+
+ var iterable = ref.value();
+ valueTag.inner.update((0, _emberMetal.tagForProperty)(iterable, '[]'));
+ if (iterable === null || typeof iterable !== 'object') {
+ return EMPTY_ITERATOR;
+ }
+ if (Array.isArray(iterable)) {
+ return ArrayIterator.from(iterable, keyFor);
+ } else if ((0, _emberRuntime.isEmberArray)(iterable)) {
+ return EmberArrayIterator.from(iterable, keyFor);
+ } else if (typeof iterable.forEach === 'function') {
+ var array = [];
+ iterable.forEach(function (item) {
+ return array.push(item);
+ });
+ return ArrayIterator.from(array, keyFor);
+ } else {
+ return EMPTY_ITERATOR;
+ }
+ };
+
+ ArrayIterable.prototype.valueReferenceFor = function valueReferenceFor(item) {
+ return new _references.UpdatableReference(item.value);
+ };
+
+ ArrayIterable.prototype.updateValueReference = function updateValueReference(reference, item) {
+ reference.update(item.value);
+ };
+
+ ArrayIterable.prototype.memoReferenceFor = function memoReferenceFor(item) {
+ return new _references.UpdatablePrimitiveReference(item.memo);
+ };
+
+ ArrayIterable.prototype.updateMemoReference = function updateMemoReference(reference, item) {
+ reference.update(item.memo);
+ };
+
+ return ArrayIterable;
+ }();
+});
+enifed('ember-glimmer/utils/process-args', ['exports', 'ember-babel', 'ember-utils', 'ember-views', 'ember-glimmer/component', 'ember-glimmer/helpers/action', 'ember-glimmer/utils/references'], function (exports, _emberBabel, _emberUtils, _emberViews, _component, _action, _references) {
+ 'use strict';
+
+ exports.processComponentArgs = processComponentArgs;
+
+ // ComponentArgs takes EvaluatedNamedArgs and converts them into the
+ // inputs needed by CurlyComponents (attrs and props, with mutable
+ // cells, etc).
+ function processComponentArgs(namedArgs) {
+ var keys = namedArgs.names;
+ var attrs = namedArgs.value();
+ var props = Object.create(null);
+ var args = Object.create(null);
+ props[_component.ARGS] = args;
+ for (var i = 0; i < keys.length; i++) {
+ var name = keys[i];
+ var ref = namedArgs.get(name);
+ var value = attrs[name];
+ if (typeof value === 'function' && value[_action.ACTION]) {
+ attrs[name] = value;
+ } else if (ref[_references.UPDATE]) {
+ attrs[name] = new MutableCell(ref, value);
+ }
+ args[name] = ref;
+ props[name] = value;
+ }
+ props.attrs = attrs;
+ return props;
+ }
+ var REF = (0, _emberUtils.symbol)('REF');
+
+ var MutableCell = function () {
+ function MutableCell(ref, value) {
+ (0, _emberBabel.classCallCheck)(this, MutableCell);
+
+ this[_emberViews.MUTABLE_CELL] = true;
+ this[REF] = ref;
+ this.value = value;
+ }
+
+ MutableCell.prototype.update = function update(val) {
+ this[REF][_references.UPDATE](val);
+ };
+
+ return MutableCell;
+ }();
+});
+enifed('ember-glimmer/utils/references', ['exports', 'ember-babel', '@glimmer/reference', '@glimmer/runtime', 'ember-metal', 'ember-utils', 'ember/features', 'ember-glimmer/helper', 'ember-glimmer/utils/to-bool'], function (exports, _emberBabel, _reference, _runtime, _emberMetal, _emberUtils, _features, _helper, _toBool) {
+ 'use strict';
+
+ exports.UnboundReference = exports.InternalHelperReference = exports.ClassBasedHelperReference = exports.SimpleHelperReference = exports.ConditionalReference = exports.UpdatablePrimitiveReference = exports.UpdatableReference = exports.NestedPropertyReference = exports.RootPropertyReference = exports.PropertyReference = exports.RootReference = exports.CachedReference = exports.UPDATE = undefined;
+ var UPDATE = exports.UPDATE = (0, _emberUtils.symbol)('UPDATE');
+ var maybeFreeze = void 0;
+ if (true) {
+ // gaurding this in a DEBUG gaurd (as well as all invocations)
+ // so that it is properly stripped during the minification's
+ // dead code elimination
+ maybeFreeze = function (obj) {
+ // re-freezing an already frozen object introduces a significant
+ // performance penalty on Chrome (tested through 59).
+ //
+ // See: https://bugs.chromium.org/p/v8/issues/detail?id=6450
+ if (!Object.isFrozen(obj)) {
+ Object.freeze(obj);
+ }
+ };
+ }
+ // @abstract
+ // @implements PathReference
+
+ var EmberPathReference = function () {
+ function EmberPathReference() {
+ (0, _emberBabel.classCallCheck)(this, EmberPathReference);
+ }
+
+ EmberPathReference.prototype.get = function get(key) {
+ return PropertyReference.create(this, key);
+ };
+
+ return EmberPathReference;
+ }();
+
+ var CachedReference = exports.CachedReference = function (_EmberPathReference) {
+ (0, _emberBabel.inherits)(CachedReference, _EmberPathReference);
+
+ function CachedReference() {
+ (0, _emberBabel.classCallCheck)(this, CachedReference);
+
+ var _this = (0, _emberBabel.possibleConstructorReturn)(this, _EmberPathReference.call(this));
+
+ _this._lastRevision = null;
+ _this._lastValue = null;
+ return _this;
+ }
+
+ CachedReference.prototype.compute = function compute() {};
+
+ CachedReference.prototype.value = function value() {
+ var tag = this.tag,
+ _lastRevision = this._lastRevision,
+ _lastValue = this._lastValue;
+
+ if (!_lastRevision || !tag.validate(_lastRevision)) {
+ _lastValue = this._lastValue = this.compute();
+ this._lastRevision = tag.value();
+ }
+ return _lastValue;
+ };
+
+ return CachedReference;
+ }(EmberPathReference);
+
+ var RootReference = exports.RootReference = function (_ConstReference) {
+ (0, _emberBabel.inherits)(RootReference, _ConstReference);
+
+ function RootReference(value) {
+ (0, _emberBabel.classCallCheck)(this, RootReference);
+
+ var _this2 = (0, _emberBabel.possibleConstructorReturn)(this, _ConstReference.call(this, value));
+
+ _this2.children = Object.create(null);
+ return _this2;
+ }
+
+ RootReference.prototype.get = function get(propertyKey) {
+ var ref = this.children[propertyKey];
+ if (ref === undefined) {
+ ref = this.children[propertyKey] = new RootPropertyReference(this.inner, propertyKey);
+ }
+ return ref;
+ };
+
+ return RootReference;
+ }(_reference.ConstReference);
+
+ var TwoWayFlushDetectionTag = void 0;
+ if (_features.EMBER_GLIMMER_DETECT_BACKTRACKING_RERENDER) {
+ TwoWayFlushDetectionTag = function () {
+ function TwoWayFlushDetectionTag(tag, key, ref) {
+ (0, _emberBabel.classCallCheck)(this, TwoWayFlushDetectionTag);
+
+ this.tag = tag;
+ this.parent = null;
+ this.key = key;
+ this.ref = ref;
+ }
+
+ TwoWayFlushDetectionTag.prototype.value = function value() {
+ return this.tag.value();
+ };
+
+ TwoWayFlushDetectionTag.prototype.validate = function validate(ticket) {
+ var parent = this.parent,
+ key = this.key;
+
+ var isValid = this.tag.validate(ticket);
+ if (isValid && parent) {
+ (0, _emberMetal.didRender)(parent, key, this.ref);
+ }
+ return isValid;
+ };
+
+ TwoWayFlushDetectionTag.prototype.didCompute = function didCompute(parent) {
+ this.parent = parent;
+ (0, _emberMetal.didRender)(parent, this.key, this.ref);
+ };
+
+ return TwoWayFlushDetectionTag;
+ }();
+ }
+
+ var PropertyReference = exports.PropertyReference = function (_CachedReference) {
+ (0, _emberBabel.inherits)(PropertyReference, _CachedReference);
+
+ function PropertyReference() {
+ (0, _emberBabel.classCallCheck)(this, PropertyReference);
+ return (0, _emberBabel.possibleConstructorReturn)(this, _CachedReference.apply(this, arguments));
+ }
+
+ PropertyReference.create = function create(parentReference, propertyKey) {
+ if ((0, _reference.isConst)(parentReference)) {
+ return new RootPropertyReference(parentReference.value(), propertyKey);
+ } else {
+ return new NestedPropertyReference(parentReference, propertyKey);
+ }
+ };
+
+ PropertyReference.prototype.get = function get(key) {
+ return new NestedPropertyReference(this, key);
+ };
+
+ return PropertyReference;
+ }(CachedReference);
+
+ var RootPropertyReference = exports.RootPropertyReference = function (_PropertyReference) {
+ (0, _emberBabel.inherits)(RootPropertyReference, _PropertyReference);
+
+ function RootPropertyReference(parentValue, propertyKey) {
+ (0, _emberBabel.classCallCheck)(this, RootPropertyReference);
+
+ var _this4 = (0, _emberBabel.possibleConstructorReturn)(this, _PropertyReference.call(this));
+
+ _this4._parentValue = parentValue;
+ _this4._propertyKey = propertyKey;
+ if (_features.EMBER_GLIMMER_DETECT_BACKTRACKING_RERENDER) {
+ _this4.tag = new TwoWayFlushDetectionTag((0, _emberMetal.tagForProperty)(parentValue, propertyKey), propertyKey, _this4);
+ } else {
+ _this4.tag = (0, _emberMetal.tagForProperty)(parentValue, propertyKey);
+ }
+ if (_features.MANDATORY_SETTER) {
+ (0, _emberMetal.watchKey)(parentValue, propertyKey);
+ }
+ return _this4;
+ }
+
+ RootPropertyReference.prototype.compute = function compute() {
+ var _parentValue = this._parentValue,
+ _propertyKey = this._propertyKey;
+
+ if (_features.EMBER_GLIMMER_DETECT_BACKTRACKING_RERENDER) {
+ this.tag.didCompute(_parentValue);
+ }
+ return (0, _emberMetal.get)(_parentValue, _propertyKey);
+ };
+
+ RootPropertyReference.prototype[UPDATE] = function (value) {
+ (0, _emberMetal.set)(this._parentValue, this._propertyKey, value);
+ };
+
+ return RootPropertyReference;
+ }(PropertyReference);
+
+ var NestedPropertyReference = exports.NestedPropertyReference = function (_PropertyReference2) {
+ (0, _emberBabel.inherits)(NestedPropertyReference, _PropertyReference2);
+
+ function NestedPropertyReference(parentReference, propertyKey) {
+ (0, _emberBabel.classCallCheck)(this, NestedPropertyReference);
+
+ var _this5 = (0, _emberBabel.possibleConstructorReturn)(this, _PropertyReference2.call(this));
+
+ var parentReferenceTag = parentReference.tag;
+ var parentObjectTag = _reference.UpdatableTag.create(_reference.CONSTANT_TAG);
+ _this5._parentReference = parentReference;
+ _this5._parentObjectTag = parentObjectTag;
+ _this5._propertyKey = propertyKey;
+ if (_features.EMBER_GLIMMER_DETECT_BACKTRACKING_RERENDER) {
+ var tag = (0, _reference.combine)([parentReferenceTag, parentObjectTag]);
+ _this5.tag = new TwoWayFlushDetectionTag(tag, propertyKey, _this5);
+ } else {
+ _this5.tag = (0, _reference.combine)([parentReferenceTag, parentObjectTag]);
+ }
+ return _this5;
+ }
+
+ NestedPropertyReference.prototype.compute = function compute() {
+ var _parentReference = this._parentReference,
+ _parentObjectTag = this._parentObjectTag,
+ _propertyKey = this._propertyKey;
+
+ var parentValue = _parentReference.value();
+ _parentObjectTag.inner.update((0, _emberMetal.tagForProperty)(parentValue, _propertyKey));
+ var parentValueType = typeof parentValue;
+ if (parentValueType === 'string' && _propertyKey === 'length') {
+ return parentValue.length;
+ }
+ if (parentValueType === 'object' && parentValue !== null || parentValueType === 'function') {
+ if (_features.MANDATORY_SETTER) {
+ (0, _emberMetal.watchKey)(parentValue, _propertyKey);
+ }
+ if (_features.EMBER_GLIMMER_DETECT_BACKTRACKING_RERENDER) {
+ this.tag.didCompute(parentValue);
+ }
+ return (0, _emberMetal.get)(parentValue, _propertyKey);
+ } else {
+ return undefined;
+ }
+ };
+
+ NestedPropertyReference.prototype[UPDATE] = function (value) {
+ var parent = this._parentReference.value();
+ (0, _emberMetal.set)(parent, this._propertyKey, value);
+ };
+
+ return NestedPropertyReference;
+ }(PropertyReference);
+
+ var UpdatableReference = exports.UpdatableReference = function (_EmberPathReference2) {
+ (0, _emberBabel.inherits)(UpdatableReference, _EmberPathReference2);
+
+ function UpdatableReference(value) {
+ (0, _emberBabel.classCallCheck)(this, UpdatableReference);
+
+ var _this6 = (0, _emberBabel.possibleConstructorReturn)(this, _EmberPathReference2.call(this));
+
+ _this6.tag = _reference.DirtyableTag.create();
+ _this6._value = value;
+ return _this6;
+ }
+
+ UpdatableReference.prototype.value = function value() {
+ return this._value;
+ };
+
+ UpdatableReference.prototype.update = function update(value) {
+ var _value = this._value;
+
+ if (value !== _value) {
+ this.tag.inner.dirty();
+ this._value = value;
+ }
+ };
+
+ return UpdatableReference;
+ }(EmberPathReference);
+
+ var UpdatablePrimitiveReference = exports.UpdatablePrimitiveReference = function (_UpdatableReference) {
+ (0, _emberBabel.inherits)(UpdatablePrimitiveReference, _UpdatableReference);
+
+ function UpdatablePrimitiveReference() {
+ (0, _emberBabel.classCallCheck)(this, UpdatablePrimitiveReference);
+ return (0, _emberBabel.possibleConstructorReturn)(this, _UpdatableReference.apply(this, arguments));
+ }
+
+ return UpdatablePrimitiveReference;
+ }(UpdatableReference);
+
+ var ConditionalReference = exports.ConditionalReference = function (_GlimmerConditionalRe) {
+ (0, _emberBabel.inherits)(ConditionalReference, _GlimmerConditionalRe);
+
+ ConditionalReference.create = function create(reference) {
+ if ((0, _reference.isConst)(reference)) {
+ var value = reference.value();
+ if ((0, _emberMetal.isProxy)(value)) {
+ return new RootPropertyReference(value, 'isTruthy');
+ } else {
+ return _runtime.PrimitiveReference.create((0, _toBool.default)(value));
+ }
+ }
+ return new ConditionalReference(reference);
+ };
+
+ function ConditionalReference(reference) {
+ (0, _emberBabel.classCallCheck)(this, ConditionalReference);
+
+ var _this8 = (0, _emberBabel.possibleConstructorReturn)(this, _GlimmerConditionalRe.call(this, reference));
+
+ _this8.objectTag = _reference.UpdatableTag.create(_reference.CONSTANT_TAG);
+ _this8.tag = (0, _reference.combine)([reference.tag, _this8.objectTag]);
+ return _this8;
+ }
+
+ ConditionalReference.prototype.toBool = function toBool(predicate) {
+ if ((0, _emberMetal.isProxy)(predicate)) {
+ this.objectTag.inner.update((0, _emberMetal.tagForProperty)(predicate, 'isTruthy'));
+ return (0, _emberMetal.get)(predicate, 'isTruthy');
+ } else {
+ this.objectTag.inner.update((0, _emberMetal.tagFor)(predicate));
+ return (0, _toBool.default)(predicate);
+ }
+ };
+
+ return ConditionalReference;
+ }(_runtime.ConditionalReference);
+
+ var SimpleHelperReference = exports.SimpleHelperReference = function (_CachedReference2) {
+ (0, _emberBabel.inherits)(SimpleHelperReference, _CachedReference2);
+
+ SimpleHelperReference.create = function create(Helper, _vm, args) {
+ var helper = Helper.create();
+ if ((0, _reference.isConst)(args)) {
+ var positional = args.positional,
+ named = args.named;
+
+ var positionalValue = positional.value();
+ var namedValue = named.value();
+ if (true) {
+ maybeFreeze(positionalValue);
+ maybeFreeze(namedValue);
+ }
+ var result = helper.compute(positionalValue, namedValue);
+ if (typeof result === 'object' && result !== null || typeof result === 'function') {
+ return new RootReference(result);
+ } else {
+ return _runtime.PrimitiveReference.create(result);
+ }
+ } else {
+ return new SimpleHelperReference(helper.compute, args);
+ }
+ };
+
+ function SimpleHelperReference(helper, args) {
+ (0, _emberBabel.classCallCheck)(this, SimpleHelperReference);
+
+ var _this9 = (0, _emberBabel.possibleConstructorReturn)(this, _CachedReference2.call(this));
+
+ _this9.tag = args.tag;
+ _this9.helper = helper;
+ _this9.args = args;
+ return _this9;
+ }
+
+ SimpleHelperReference.prototype.compute = function compute() {
+ var helper = this.helper,
+ _args = this.args,
+ positional = _args.positional,
+ named = _args.named;
+
+ var positionalValue = positional.value();
+ var namedValue = named.value();
+ if (true) {
+ maybeFreeze(positionalValue);
+ maybeFreeze(namedValue);
+ }
+ return helper(positionalValue, namedValue);
+ };
+
+ return SimpleHelperReference;
+ }(CachedReference);
+
+ var ClassBasedHelperReference = exports.ClassBasedHelperReference = function (_CachedReference3) {
+ (0, _emberBabel.inherits)(ClassBasedHelperReference, _CachedReference3);
+
+ ClassBasedHelperReference.create = function create(helperClass, vm, args) {
+ var instance = helperClass.create();
+ vm.newDestroyable(instance);
+ return new ClassBasedHelperReference(instance, args);
+ };
+
+ function ClassBasedHelperReference(instance, args) {
+ (0, _emberBabel.classCallCheck)(this, ClassBasedHelperReference);
+
+ var _this10 = (0, _emberBabel.possibleConstructorReturn)(this, _CachedReference3.call(this));
+
+ _this10.tag = (0, _reference.combine)([instance[_helper.RECOMPUTE_TAG], args.tag]);
+ _this10.instance = instance;
+ _this10.args = args;
+ return _this10;
+ }
+
+ ClassBasedHelperReference.prototype.compute = function compute() {
+ var instance = this.instance,
+ _args2 = this.args,
+ positional = _args2.positional,
+ named = _args2.named;
+
+ var positionalValue = positional.value();
+ var namedValue = named.value();
+ if (true) {
+ maybeFreeze(positionalValue);
+ maybeFreeze(namedValue);
+ }
+ return instance.compute(positionalValue, namedValue);
+ };
+
+ return ClassBasedHelperReference;
+ }(CachedReference);
+
+ var InternalHelperReference = exports.InternalHelperReference = function (_CachedReference4) {
+ (0, _emberBabel.inherits)(InternalHelperReference, _CachedReference4);
+
+ function InternalHelperReference(helper, args) {
+ (0, _emberBabel.classCallCheck)(this, InternalHelperReference);
+
+ var _this11 = (0, _emberBabel.possibleConstructorReturn)(this, _CachedReference4.call(this));
+
+ _this11.tag = args.tag;
+ _this11.helper = helper;
+ _this11.args = args;
+ return _this11;
+ }
+
+ InternalHelperReference.prototype.compute = function compute() {
+ var helper = this.helper,
+ args = this.args;
+
+ return helper(args);
+ };
+
+ return InternalHelperReference;
+ }(CachedReference);
+
+ var UnboundReference = exports.UnboundReference = function (_ConstReference2) {
+ (0, _emberBabel.inherits)(UnboundReference, _ConstReference2);
+
+ function UnboundReference() {
+ (0, _emberBabel.classCallCheck)(this, UnboundReference);
+ return (0, _emberBabel.possibleConstructorReturn)(this, _ConstReference2.apply(this, arguments));
+ }
+
+ UnboundReference.create = function create(value) {
+ if (typeof value === 'object' && value !== null) {
+ return new UnboundReference(value);
+ } else {
+ return _runtime.PrimitiveReference.create(value);
+ }
+ };
+
+ UnboundReference.prototype.get = function get(key) {
+ return new UnboundReference((0, _emberMetal.get)(this.inner, key));
+ };
+
+ return UnboundReference;
+ }(_reference.ConstReference);
+});
+enifed('ember-glimmer/utils/string', ['exports', 'ember-babel'], function (exports, _emberBabel) {
+ 'use strict';
+
+ exports.SafeString = undefined;
+ exports.escapeExpression = escapeExpression;
+ exports.htmlSafe = htmlSafe;
+ exports.isHTMLSafe = isHTMLSafe;
+
+ var SafeString = exports.SafeString = function () {
+ function SafeString(string) {
+ (0, _emberBabel.classCallCheck)(this, SafeString);
+
+ this.string = string;
+ }
+
+ SafeString.prototype.toString = function toString() {
+ return '' + this.string;
+ };
+
+ SafeString.prototype.toHTML = function toHTML() {
+ return this.toString();
+ };
+
+ return SafeString;
+ }();
+
+ var escape = {
+ '&': '&amp;',
+ '<': '&lt;',
+ '>': '&gt;',
+ '"': '&quot;',
+ "'": '&#x27;',
+ '`': '&#x60;',
+ '=': '&#x3D;'
+ };
+ var possible = /[&<>"'`=]/;
+ var badChars = /[&<>"'`=]/g;
+ function escapeChar(chr) {
+ return escape[chr];
+ }
+ function escapeExpression(string) {
+ if (typeof string !== 'string') {
+ // don't escape SafeStrings, since they're already safe
+ if (string && string.toHTML) {
+ return string.toHTML();
+ } else if (string === null || string === undefined) {
+ return '';
+ } else if (!string) {
+ return string + '';
+ }
+ // Force a string conversion as this will be done by the append regardless and
+ // the regex test will do this transparently behind the scenes, causing issues if
+ // an object's to string has escaped characters in it.
+ string = '' + string;
+ }
+ if (!possible.test(string)) {
+ return string;
+ }
+ return string.replace(badChars, escapeChar);
+ }
+ /**
+ Mark a string as safe for unescaped output with Ember templates. If you
+ return HTML from a helper, use this function to
+ ensure Ember's rendering layer does not escape the HTML.
+
+ ```javascript
+ import { htmlSafe } from '@ember/string';
+
+ htmlSafe('<div>someString</div>')
+ ```
+
+ @method htmlSafe
+ @for @ember/template
+ @static
+ @return {Handlebars.SafeString} A string that will not be HTML escaped by Handlebars.
+ @public
+ */
+ function htmlSafe(str) {
+ if (str === null || str === undefined) {
+ str = '';
+ } else if (typeof str !== 'string') {
+ str = '' + str;
+ }
+ return new SafeString(str);
+ }
+ /**
+ Detects if a string was decorated using `htmlSafe`.
+
+ ```javascript
+ import { htmlSafe, isHTMLSafe } from '@ember/string';
+
+ var plainString = 'plain string',
+ safeString = htmlSafe('<div>someValue</div>');
+
+ isHTMLSafe(plainString); // false
+ isHTMLSafe(safeString); // true
+ ```
+
+ @method isHTMLSafe
+ @for @ember/template
+ @static
+ @return {Boolean} `true` if the string was decorated with `htmlSafe`, `false` otherwise.
+ @public
+ */
+ function isHTMLSafe(str) {
+ return str !== null && typeof str === 'object' && typeof str.toHTML === 'function';
+ }
+});
+enifed('ember-glimmer/utils/to-bool', ['exports', 'ember-metal', 'ember-runtime'], function (exports, _emberMetal, _emberRuntime) {
+ 'use strict';
+
+ exports.default = toBool;
+ function toBool(predicate) {
+ if (!predicate) {
+ return false;
+ }
+ if (predicate === true) {
+ return true;
+ }
+ if ((0, _emberRuntime.isArray)(predicate)) {
+ return (0, _emberMetal.get)(predicate, 'length') !== 0;
+ }
+ return true;
+ }
+});
+enifed('ember-glimmer/views/outlet', ['exports', 'ember-babel', '@glimmer/reference', 'ember-environment', 'ember-metal', 'ember-utils'], function (exports, _emberBabel, _reference, _emberEnvironment, _emberMetal, _emberUtils) {
+ 'use strict';
+
+ exports.RootOutletStateReference = undefined;
+
+ var RootOutletStateReference = exports.RootOutletStateReference = function () {
+ function RootOutletStateReference(outletView) {
+ (0, _emberBabel.classCallCheck)(this, RootOutletStateReference);
+
+ this.outletView = outletView;
+ this.tag = outletView._tag;
+ }
+
+ RootOutletStateReference.prototype.get = function get(key) {
+ return new ChildOutletStateReference(this, key);
+ };
+
+ RootOutletStateReference.prototype.value = function value() {
+ return this.outletView.outletState;
+ };
+
+ RootOutletStateReference.prototype.getOrphan = function getOrphan(name) {
+ return new OrphanedOutletStateReference(this, name);
+ };
+
+ RootOutletStateReference.prototype.update = function update(state) {
+ this.outletView.setOutletState(state);
+ };
+
+ return RootOutletStateReference;
+ }();
+
+ var OrphanedOutletStateReference = function (_RootOutletStateRefer) {
+ (0, _emberBabel.inherits)(OrphanedOutletStateReference, _RootOutletStateRefer);
+
+ function OrphanedOutletStateReference(root, name) {
+ (0, _emberBabel.classCallCheck)(this, OrphanedOutletStateReference);
+
+ var _this = (0, _emberBabel.possibleConstructorReturn)(this, _RootOutletStateRefer.call(this, root.outletView));
+
+ _this.root = root;
+ _this.name = name;
+ return _this;
+ }
+
+ OrphanedOutletStateReference.prototype.value = function value() {
+ var rootState = this.root.value();
+ var orphans = rootState.outlets.main.outlets.__ember_orphans__;
+ if (!orphans) {
+ return null;
+ }
+ var matched = orphans.outlets[this.name];
+ if (!matched) {
+ return null;
+ }
+ var state = Object.create(null);
+ state[matched.render.outlet] = matched;
+ matched.wasUsed = true;
+ return { outlets: state, render: undefined };
+ };
+
+ return OrphanedOutletStateReference;
+ }(RootOutletStateReference);
+
+ var ChildOutletStateReference = function () {
+ function ChildOutletStateReference(parent, key) {
+ (0, _emberBabel.classCallCheck)(this, ChildOutletStateReference);
+
+ this.parent = parent;
+ this.key = key;
+ this.tag = parent.tag;
+ }
+
+ ChildOutletStateReference.prototype.get = function get(key) {
+ return new ChildOutletStateReference(this, key);
+ };
+
+ ChildOutletStateReference.prototype.value = function value() {
+ var parent = this.parent.value();
+ return parent && parent[this.key];
+ };
+
+ return ChildOutletStateReference;
+ }();
+
+ var OutletView = function () {
+ OutletView.extend = function extend(injections) {
+ return function (_OutletView) {
+ (0, _emberBabel.inherits)(_class, _OutletView);
+
+ function _class() {
+ (0, _emberBabel.classCallCheck)(this, _class);
+ return (0, _emberBabel.possibleConstructorReturn)(this, _OutletView.apply(this, arguments));
+ }
+
+ _class.create = function create(options) {
+ if (options) {
+ return _OutletView.create.call(this, (0, _emberUtils.assign)({}, injections, options));
+ } else {
+ return _OutletView.create.call(this, injections);
+ }
+ };
+
+ return _class;
+ }(OutletView);
+ };
+
+ OutletView.reopenClass = function reopenClass(injections) {
+ (0, _emberUtils.assign)(this, injections);
+ };
+
+ OutletView.create = function create(options) {
+ var _environment = options._environment,
+ renderer = options.renderer,
+ template = options.template;
+
+ var owner = options[_emberUtils.OWNER];
+ return new OutletView(_environment, renderer, owner, template);
+ };
+
+ function OutletView(_environment, renderer, owner, template) {
+ (0, _emberBabel.classCallCheck)(this, OutletView);
+
+ this._environment = _environment;
+ this.renderer = renderer;
+ this.owner = owner;
+ this.template = template;
+ this.outletState = null;
+ this._tag = _reference.DirtyableTag.create();
+ }
+
+ OutletView.prototype.appendTo = function appendTo(selector) {
+ var env = this._environment || _emberEnvironment.environment;
+ var target = void 0;
+ if (env.hasDOM) {
+ target = typeof selector === 'string' ? document.querySelector(selector) : selector;
+ } else {
+ target = selector;
+ }
+ _emberMetal.run.schedule('render', this.renderer, 'appendOutletView', this, target);
+ };
+
+ OutletView.prototype.rerender = function rerender() {};
+
+ OutletView.prototype.setOutletState = function setOutletState(state) {
+ this.outletState = {
+ outlets: {
+ main: state
+ },
+ render: {
+ owner: undefined,
+ into: undefined,
+ outlet: 'main',
+ name: '-top-level',
+ controller: undefined,
+ template: undefined
+ }
+ };
+ this._tag.inner.dirty();
+ };
+
+ OutletView.prototype.toReference = function toReference() {
+ return new RootOutletStateReference(this);
+ };
+
+ OutletView.prototype.destroy = function destroy() {};
+
+ return OutletView;
+ }();
+
+ exports.default = OutletView;
+});
+enifed('ember-metal', ['exports', 'ember-environment', 'ember-utils', 'ember-debug', 'ember/features', 'ember-babel', '@glimmer/reference', 'require', 'backburner'], function (exports, emberEnvironment, emberUtils, emberDebug, features, emberBabel, reference, require, Backburner) {
+ 'use strict';
+
+ require = require && require.hasOwnProperty('default') ? require['default'] : require;
+ Backburner = Backburner && Backburner.hasOwnProperty('default') ? Backburner['default'] : Backburner;
+
+ var Ember = typeof emberEnvironment.context.imports.Ember === 'object' && emberEnvironment.context.imports.Ember || {};
+
+ // Make sure these are set whether Ember was already defined or not
+ Ember.isNamespace = true;
+ Ember.toString = function () {
+ return 'Ember';
+ };
+
+ /*
+ When we render a rich template hierarchy, the set of events that
+ *might* happen tends to be much larger than the set of events that
+ actually happen. This implies that we should make listener creation &
+ destruction cheap, even at the cost of making event dispatch more
+ expensive.
+
+ Thus we store a new listener with a single push and no new
+ allocations, without even bothering to do deduplication -- we can
+ save that for dispatch time, if an event actually happens.
+ */
+
+ /* listener flags */
+ var ONCE = 1;
+ var SUSPENDED = 2;
+
+ var protoMethods = {
+ addToListeners: function (eventName, target, method, flags) {
+ if (this._listeners === undefined) {
+ this._listeners = [];
+ }
+ this._listeners.push(eventName, target, method, flags);
+ },
+ _finalizeListeners: function () {
+ if (this._listenersFinalized) {
+ return;
+ }
+ if (this._listeners === undefined) {
+ this._listeners = [];
+ }
+ var pointer = this.parent;
+ while (pointer !== undefined) {
+ var listeners = pointer._listeners;
+ if (listeners !== undefined) {
+ this._listeners = this._listeners.concat(listeners);
+ }
+ if (pointer._listenersFinalized) {
+ break;
+ }
+ pointer = pointer.parent;
+ }
+ this._listenersFinalized = true;
+ },
+ removeFromListeners: function (eventName, target, method, didRemove) {
+ var pointer = this;
+ while (pointer !== undefined) {
+ var listeners = pointer._listeners;
+ if (listeners !== undefined) {
+ for (var index = listeners.length - 4; index >= 0; index -= 4) {
+ if (listeners[index] === eventName && (!method || listeners[index + 1] === target && listeners[index + 2] === method)) {
+ if (pointer === this) {
+ // we are modifying our own list, so we edit directly
+ if (typeof didRemove === 'function') {
+ didRemove(eventName, target, listeners[index + 2]);
+ }
+ listeners.splice(index, 4);
+ } else {
+ // we are trying to remove an inherited listener, so we do
+ // just-in-time copying to detach our own listeners from
+ // our inheritance chain.
+ this._finalizeListeners();
+ return this.removeFromListeners(eventName, target, method);
+ }
+ }
+ }
+ }
+ if (pointer._listenersFinalized) {
+ break;
+ }
+ pointer = pointer.parent;
+ }
+ },
+ matchingListeners: function (eventName) {
+ var pointer = this;
+ var result = void 0;
+ while (pointer !== undefined) {
+ var listeners = pointer._listeners;
+ if (listeners !== undefined) {
+ for (var index = 0; index < listeners.length; index += 4) {
+ if (listeners[index] === eventName) {
+ result = result || [];
+ pushUniqueListener(result, listeners, index);
+ }
+ }
+ }
+ if (pointer._listenersFinalized) {
+ break;
+ }
+ pointer = pointer.parent;
+ }
+ return result;
+ }
+ };
+
+ function pushUniqueListener(destination, source, index) {
+ var target = source[index + 1];
+ var method = source[index + 2];
+ for (var destinationIndex = 0; destinationIndex < destination.length; destinationIndex += 3) {
+ if (destination[destinationIndex] === target && destination[destinationIndex + 1] === method) {
+ return;
+ }
+ }
+ destination.push(target, method, source[index + 3]);
+ }
+
+ /**
+ @module @ember/object
+ */
+ /*
+ The event system uses a series of nested hashes to store listeners on an
+ object. When a listener is registered, or when an event arrives, these
+ hashes are consulted to determine which target and action pair to invoke.
+
+ The hashes are stored in the object's meta hash, and look like this:
+
+ // Object's meta hash
+ {
+ listeners: { // variable name: `listenerSet`
+ "foo:changed": [ // variable name: `actions`
+ target, method, flags
+ ]
+ }
+ }
+
+ */
+
+ /**
+ Add an event listener
+
+ @method addListener
+ @static
+ @for @ember/object/events
+ @param obj
+ @param {String} eventName
+ @param {Object|Function} target A target object or a function
+ @param {Function|String} method A function or the name of a function to be called on `target`
+ @param {Boolean} once A flag whether a function should only be called once
+ @public
+ */
+ function addListener(obj, eventName, target, method, once) {
+ true && !(!!obj && !!eventName) && emberDebug.assert('You must pass at least an object and event name to addListener', !!obj && !!eventName);
+
+ if (emberEnvironment.ENV._ENABLE_DID_INIT_ATTRS_SUPPORT === true) {
+ true && !(eventName !== 'didInitAttrs') && emberDebug.deprecate('didInitAttrs called in ' + (obj && obj.toString && obj.toString()) + '.', eventName !== 'didInitAttrs', {
+ id: 'ember-views.did-init-attrs',
+ until: '3.0.0',
+ url: 'https://emberjs.com/deprecations/v2.x#toc_ember-component-didinitattrs'
+ });
+ } else {
+ true && !(eventName !== 'didInitAttrs') && emberDebug.assert('didInitAttrs called in ' + (obj && obj.toString && obj.toString()) + ' is no longer supported.', eventName !== 'didInitAttrs');
+ }
+
+ if (!method && 'function' === typeof target) {
+ method = target;
+ target = null;
+ }
+
+ var flags = 0;
+ if (once) {
+ flags |= ONCE;
+ }
+
+ meta(obj).addToListeners(eventName, target, method, flags);
+
+ if ('function' === typeof obj.didAddListener) {
+ obj.didAddListener(eventName, target, method);
+ }
+ }
+
+ /**
+ Remove an event listener
+
+ Arguments should match those passed to `addListener`.
+
+ @method removeListener
+ @static
+ @for @ember/object/events
+ @param obj
+ @param {String} eventName
+ @param {Object|Function} target A target object or a function
+ @param {Function|String} method A function or the name of a function to be called on `target`
+ @public
+ */
+ function removeListener(obj, eventName, target, method) {
+ true && !(!!obj && !!eventName) && emberDebug.assert('You must pass at least an object and event name to removeListener', !!obj && !!eventName);
+
+ if (!method && 'function' === typeof target) {
+ method = target;
+ target = null;
+ }
+
+ var func = 'function' === typeof obj.didRemoveListener ? obj.didRemoveListener.bind(obj) : function () {};
+ meta(obj).removeFromListeners(eventName, target, method, func);
+ }
+
+ /**
+ Send an event. The execution of suspended listeners
+ is skipped, and once listeners are removed. A listener without
+ a target is executed on the passed object. If an array of actions
+ is not passed, the actions stored on the passed object are invoked.
+
+ @method sendEvent
+ @static
+ @for @ember/object/events
+ @param obj
+ @param {String} eventName
+ @param {Array} params Optional parameters for each listener.
+ @param {Array} actions Optional array of actions (listeners).
+ @param {Meta} meta Optional meta to lookup listeners
+ @return true
+ @public
+ */
+ function sendEvent(obj, eventName, params, actions, _meta) {
+ if (actions === undefined) {
+ var meta$$1 = _meta === undefined ? peekMeta(obj) : _meta;
+ actions = typeof meta$$1 === 'object' && meta$$1 !== null && meta$$1.matchingListeners(eventName);
+ }
+
+ if (actions === undefined || actions.length === 0) {
+ return false;
+ }
+
+ for (var i = actions.length - 3; i >= 0; i -= 3) {
+ // looping in reverse for once listeners
+ var target = actions[i];
+ var method = actions[i + 1];
+ var flags = actions[i + 2];
+
+ if (!method) {
+ continue;
+ }
+ if (flags & SUSPENDED) {
+ continue;
+ }
+ if (flags & ONCE) {
+ removeListener(obj, eventName, target, method);
+ }
+ if (!target) {
+ target = obj;
+ }
+ if ('string' === typeof method) {
+ if (params) {
+ emberUtils.applyStr(target, method, params);
+ } else {
+ target[method]();
+ }
+ } else {
+ if (params) {
+ method.apply(target, params);
+ } else {
+ method.call(target);
+ }
+ }
+ }
+ return true;
+ }
+
+ /**
+ @private
+ @method hasListeners
+ @static
+ @for @ember/object/events
+ @param obj
+ @param {String} eventName
+ */
+ function hasListeners(obj, eventName) {
+ var meta$$1 = peekMeta(obj);
+ if (meta$$1 === undefined) {
+ return false;
+ }
+ var matched = meta$$1.matchingListeners(eventName);
+ return matched !== undefined && matched.length > 0;
+ }
+
+ /**
+ Define a property as a function that should be executed when
+ a specified event or events are triggered.
+
+
+ ``` javascript
+ import EmberObject from '@ember/object';
+ import { on } from '@ember/object/evented';
+ import { sendEvent } from '@ember/object/events';
+
+ let Job = EmberObject.extend({
+ logCompleted: on('completed', function() {
+ console.log('Job completed!');
+ })
+ });
+
+ let job = Job.create();
+
+ sendEvent(job, 'completed'); // Logs 'Job completed!'
+ ```
+
+ @method on
+ @static
+ @for @ember/object/evented
+ @param {String} eventNames*
+ @param {Function} func
+ @return func
+ @public
+ */
+ function on() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ var func = args.pop();
+ var events = args;
+
+ true && !(typeof func === 'function') && emberDebug.assert('on expects function as last argument', typeof func === 'function');
+ true && !(events.length > 0 && events.every(function (p) {
+ return typeof p === 'string' && p.length;
+ })) && emberDebug.assert('on called without valid event names', events.length > 0 && events.every(function (p) {
+ return typeof p === 'string' && p.length;
+ }));
+
+ func.__ember_listens__ = events;
+ return func;
+ }
+
+ var hasViews = function () {
+ return false;
+ };
+
+ function setHasViews(fn) {
+ hasViews = fn;
+ }
+
+ function makeTag() {
+ return new reference.DirtyableTag();
+ }
+
+ function tagForProperty(object, propertyKey, _meta) {
+ if (typeof object !== 'object' || object === null) {
+ return reference.CONSTANT_TAG;
+ }
+
+ var meta$$1 = _meta === undefined ? meta(object) : _meta;
+ if (meta$$1.isProxy()) {
+ return tagFor(object, meta$$1);
+ }
+
+ var tags = meta$$1.writableTags();
+ var tag = tags[propertyKey];
+ if (tag) {
+ return tag;
+ }
+
+ return tags[propertyKey] = makeTag();
+ }
+
+ function tagFor(object, _meta) {
+ if (typeof object === 'object' && object !== null) {
+ var meta$$1 = _meta === undefined ? meta(object) : _meta;
+ return meta$$1.writableTag(makeTag);
+ } else {
+ return reference.CONSTANT_TAG;
+ }
+ }
+
+ function markObjectAsDirty(meta$$1, propertyKey) {
+ var objectTag = meta$$1.readableTag();
+
+ if (objectTag !== undefined) {
+ objectTag.dirty();
+ }
+
+ var tags = meta$$1.readableTags();
+ var propertyTag = tags !== undefined ? tags[propertyKey] : undefined;
+
+ if (propertyTag !== undefined) {
+ propertyTag.dirty();
+ }
+
+ if (propertyKey === 'content' && meta$$1.isProxy()) {
+ objectTag.contentDidChange();
+ }
+
+ if (objectTag !== undefined || propertyTag !== undefined) {
+ ensureRunloop();
+ }
+ }
+
+ var backburner = void 0;
+ function ensureRunloop() {
+ if (backburner === undefined) {
+ backburner = require('ember-metal').run.backburner;
+ }
+
+ if (hasViews()) {
+ backburner.ensureInstance();
+ }
+ }
+
+ /*
+ this.observerSet = {
+ [senderGuid]: { // variable name: `keySet`
+ [keyName]: listIndex
+ }
+ },
+ this.observers = [
+ {
+ sender: obj,
+ keyName: keyName,
+ eventName: eventName,
+ listeners: [
+ [target, method, flags]
+ ]
+ },
+ ...
+ ]
+ */
+
+ var ObserverSet = function () {
+ function ObserverSet() {
+ emberBabel.classCallCheck(this, ObserverSet);
+
+ this.clear();
+ }
+
+ ObserverSet.prototype.add = function add(sender, keyName, eventName) {
+ var observerSet = this.observerSet;
+ var observers = this.observers;
+ var senderGuid = emberUtils.guidFor(sender);
+ var keySet = observerSet[senderGuid];
+
+ if (keySet === undefined) {
+ observerSet[senderGuid] = keySet = {};
+ }
+
+ var index = keySet[keyName];
+ if (index === undefined) {
+ index = observers.push({
+ sender: sender,
+ keyName: keyName,
+ eventName: eventName,
+ listeners: []
+ }) - 1;
+ keySet[keyName] = index;
+ }
+ return observers[index].listeners;
+ };
+
+ ObserverSet.prototype.flush = function flush() {
+ var observers = this.observers;
+ var observer = void 0,
+ sender = void 0;
+ this.clear();
+ for (var i = 0; i < observers.length; ++i) {
+ observer = observers[i];
+ sender = observer.sender;
+ if (sender.isDestroying || sender.isDestroyed) {
+ continue;
+ }
+ sendEvent(sender, observer.eventName, [sender, observer.keyName], observer.listeners);
+ }
+ };
+
+ ObserverSet.prototype.clear = function clear() {
+ this.observerSet = {};
+ this.observers = [];
+ };
+
+ return ObserverSet;
+ }();
+
+ exports.runInTransaction = void 0;
+ exports.didRender = void 0;
+ exports.assertNotRendered = void 0;
+
+ // detect-backtracking-rerender by default is debug build only
+ if (features.EMBER_GLIMMER_DETECT_BACKTRACKING_RERENDER) {
+
+ // there are 2 states
+
+ // DEBUG
+ // tracks lastRef and lastRenderedIn per rendered object and key during a transaction
+ // release everything via normal weakmap semantics by just derefencing the weakmap
+
+ // RELEASE
+ // tracks transactionId per rendered object and key during a transaction
+ // release everything via normal weakmap semantics by just derefencing the weakmap
+
+ var TransactionRunner = function () {
+ function TransactionRunner() {
+ emberBabel.classCallCheck(this, TransactionRunner);
+
+ this.transactionId = 0;
+ this.inTransaction = false;
+ this.shouldReflush = false;
+ this.weakMap = new WeakMap();
+ {
+ // track templates
+ this.debugStack = undefined;
+ }
+ }
+
+ TransactionRunner.prototype.runInTransaction = function runInTransaction(context$$1, methodName) {
+ this.before(context$$1);
+ try {
+ context$$1[methodName]();
+ } finally {
+ this.after();
+ }
+ return this.shouldReflush;
+ };
+
+ TransactionRunner.prototype.didRender = function didRender(object, key, reference$$1) {
+ if (!this.inTransaction) {
+ return;
+ }
+ {
+ this.setKey(object, key, {
+ lastRef: reference$$1,
+ lastRenderedIn: this.debugStack.peek()
+ });
+ }
+ };
+
+ TransactionRunner.prototype.assertNotRendered = function assertNotRendered(object, key) {
+ if (!this.inTransaction) {
+ return;
+ }
+ if (this.hasRendered(object, key)) {
+ {
+ var _getKey = this.getKey(object, key),
+ lastRef = _getKey.lastRef,
+ lastRenderedIn = _getKey.lastRenderedIn;
+
+ var currentlyIn = this.debugStack.peek();
+
+ var parts = [];
+ var label = void 0;
+
+ if (lastRef !== undefined) {
+ while (lastRef && lastRef._propertyKey) {
+ parts.unshift(lastRef._propertyKey);
+ lastRef = lastRef._parentReference;
+ }
+
+ label = parts.join('.');
+ } else {
+ label = 'the same value';
+ }
+
+ true && !false && emberDebug.assert('You modified "' + label + '" twice on ' + object + ' in a single render. It was rendered in ' + lastRenderedIn + ' and modified in ' + currentlyIn + '. This was unreliable and slow in Ember 1.x and is no longer supported. See https://github.com/emberjs/ember.js/issues/13948 for more details.', false);
+ }
+
+ this.shouldReflush = true;
+ }
+ };
+
+ TransactionRunner.prototype.hasRendered = function hasRendered(object, key) {
+ if (!this.inTransaction) {
+ return false;
+ }
+ {
+ return this.getKey(object, key) !== undefined;
+ }
+ return this.getKey(object, key) === this.transactionId;
+ };
+
+ TransactionRunner.prototype.before = function before(context$$1) {
+ this.inTransaction = true;
+ this.shouldReflush = false;
+ {
+ this.debugStack = context$$1.env.debugStack;
+ }
+ };
+
+ TransactionRunner.prototype.after = function after() {
+ this.transactionId++;
+ this.inTransaction = false;
+ {
+ this.debugStack = undefined;
+ }
+ this.clearObjectMap();
+ };
+
+ TransactionRunner.prototype.createMap = function createMap(object) {
+ var map = Object.create(null);
+ this.weakMap.set(object, map);
+ return map;
+ };
+
+ TransactionRunner.prototype.getOrCreateMap = function getOrCreateMap(object) {
+ var map = this.weakMap.get(object);
+ if (map === undefined) {
+ map = this.createMap(object);
+ }
+ return map;
+ };
+
+ TransactionRunner.prototype.setKey = function setKey(object, key, value) {
+ var map = this.getOrCreateMap(object);
+ map[key] = value;
+ };
+
+ TransactionRunner.prototype.getKey = function getKey(object, key) {
+ var map = this.weakMap.get(object);
+ if (map !== undefined) {
+ return map[key];
+ }
+ };
+
+ TransactionRunner.prototype.clearObjectMap = function clearObjectMap() {
+ this.weakMap = new WeakMap();
+ };
+
+ return TransactionRunner;
+ }();
+
+ var runner = new TransactionRunner();
+
+ exports.runInTransaction = runner.runInTransaction.bind(runner);
+ exports.didRender = runner.didRender.bind(runner);
+ exports.assertNotRendered = runner.assertNotRendered.bind(runner);
+ } else {
+ // in production do nothing to detect reflushes
+ exports.runInTransaction = function (context$$1, methodName) {
+ context$$1[methodName]();
+ return false;
+ };
+ }
+
+ function watchPath(obj, keyPath, meta$$1) {
+ if (typeof obj !== 'object' || obj === null) {
+ return;
+ }
+ var m = meta$$1 === undefined ? meta(obj) : meta$$1;
+ var counter = m.peekWatching(keyPath) || 0;
+
+ m.writeWatching(keyPath, counter + 1);
+ if (counter === 0) {
+ // activate watching first time
+ m.writableChains(makeChainNode).add(keyPath);
+ }
+ }
+
+ function unwatchPath(obj, keyPath, meta$$1) {
+ if (typeof obj !== 'object' || obj === null) {
+ return;
+ }
+ var m = meta$$1 === undefined ? peekMeta(obj) : meta$$1;
+
+ if (m === undefined) {
+ return;
+ }
+ var counter = m.peekWatching(keyPath) || 0;
+
+ if (counter === 1) {
+ m.writeWatching(keyPath, 0);
+ m.writableChains(makeChainNode).remove(keyPath);
+ } else if (counter > 1) {
+ m.writeWatching(keyPath, counter - 1);
+ }
+ }
+
+ /**
+ @module ember
+ */
+ /**
+ Starts watching a property on an object. Whenever the property changes,
+ invokes `Ember.notifyPropertyChange`. This is the primitive used by observers
+ and dependent keys; usually you will never call this method directly but instead
+ use higher level methods like `addObserver()`.
+
+ @private
+ @method watch
+ @for Ember
+ @param obj
+ @param {String} _keyPath
+ */
+ function watch(obj, _keyPath, m) {
+ if (isPath(_keyPath)) {
+ watchPath(obj, _keyPath, m);
+ } else {
+ watchKey(obj, _keyPath, m);
+ }
+ }
+
+ function isWatching(obj, key) {
+ return watcherCount(obj, key) > 0;
+ }
+
+ function watcherCount(obj, key) {
+ var meta$$1 = peekMeta(obj);
+ return meta$$1 !== undefined && meta$$1.peekWatching(key) || 0;
+ }
+
+ function unwatch(obj, _keyPath, m) {
+ if (isPath(_keyPath)) {
+ unwatchPath(obj, _keyPath, m);
+ } else {
+ unwatchKey(obj, _keyPath, m);
+ }
+ }
+
+ /**
+ @module @ember/object
+ */
+
+ var AFTER_OBSERVERS = ':change';
+ var BEFORE_OBSERVERS = ':before';
+
+ function changeEvent(keyName) {
+ return keyName + AFTER_OBSERVERS;
+ }
+
+ function beforeEvent(keyName) {
+ return keyName + BEFORE_OBSERVERS;
+ }
+
+ /**
+ @method addObserver
+ @static
+ @for @ember/object/observers
+ @param obj
+ @param {String} _path
+ @param {Object|Function} target
+ @param {Function|String} [method]
+ @public
+ */
+ function addObserver(obj, _path, target, method) {
+ addListener(obj, changeEvent(_path), target, method);
+ watch(obj, _path);
+
+ return this;
+ }
+
+ /**
+ @method removeObserver
+ @static
+ @for @ember/object/observers
+ @param obj
+ @param {String} path
+ @param {Object|Function} target
+ @param {Function|String} [method]
+ @public
+ */
+ function removeObserver(obj, path, target, method) {
+ unwatch(obj, path);
+ removeListener(obj, changeEvent(path), target, method);
+
+ return this;
+ }
+
+ /**
+ @method _addBeforeObserver
+ @static
+ @for @ember/object/observers
+ @param obj
+ @param {String} path
+ @param {Object|Function} target
+ @param {Function|String} [method]
+ @deprecated
+ @private
+ */
+ function _addBeforeObserver(obj, path, target, method) {
+ addListener(obj, beforeEvent(path), target, method);
+ watch(obj, path);
+
+ return this;
+ }
+
+ /**
+ @method removeBeforeObserver
+ @static
+ @for @ember/object/observers
+ @param obj
+ @param {String} path
+ @param {Object|Function} target
+ @param {Function|String} [method]
+ @deprecated
+ @private
+ */
+ function _removeBeforeObserver(obj, path, target, method) {
+ unwatch(obj, path);
+ removeListener(obj, beforeEvent(path), target, method);
+
+ return this;
+ }
+
+ /**
+ @module ember
+ @private
+ */
+
+ var PROPERTY_DID_CHANGE = emberUtils.symbol('PROPERTY_DID_CHANGE');
+
+ var beforeObserverSet = new ObserverSet();
+ var observerSet = new ObserverSet();
+ var deferred = 0;
+
+ // ..........................................................
+ // PROPERTY CHANGES
+ //
+
+ /**
+ This function is called just before an object property is about to change.
+ It will notify any before observers and prepare caches among other things.
+
+ Normally you will not need to call this method directly but if for some
+ reason you can't directly watch a property you can invoke this method
+ manually along with `Ember.propertyDidChange()` which you should call just
+ after the property value changes.
+
+ @method propertyWillChange
+ @for Ember
+ @param {Object} obj The object with the property that will change
+ @param {String} keyName The property key (or path) that will change.
+ @return {void}
+ @private
+ */
+ function propertyWillChange(obj, keyName, _meta) {
+ var meta$$1 = _meta === undefined ? peekMeta(obj) : _meta;
+ if (meta$$1 !== undefined && !meta$$1.isInitialized(obj)) {
+ return;
+ }
+
+ var watching = meta$$1 !== undefined && meta$$1.peekWatching(keyName) > 0;
+ var possibleDesc = descriptorFor(obj, keyName, meta$$1);
+
+ if (possibleDesc !== undefined && possibleDesc.willChange) {
+ possibleDesc.willChange(obj, keyName);
+ }
+
+ if (watching) {
+ dependentKeysWillChange(obj, keyName, meta$$1);
+ chainsWillChange(obj, keyName, meta$$1);
+ notifyBeforeObservers(obj, keyName, meta$$1);
+ }
+ }
+
+ /**
+ This function is called just after an object property has changed.
+ It will notify any observers and clear caches among other things.
+
+ Normally you will not need to call this method directly but if for some
+ reason you can't directly watch a property you can invoke this method
+ manually along with `Ember.propertyWillChange()` which you should call just
+ before the property value changes.
+
+ @method propertyDidChange
+ @for Ember
+ @param {Object} obj The object with the property that will change
+ @param {String} keyName The property key (or path) that will change.
+ @param {Meta} meta The objects meta.
+ @return {void}
+ @private
+ */
+ function propertyDidChange(obj, keyName, _meta) {
+ var meta$$1 = _meta === undefined ? peekMeta(obj) : _meta;
+ var hasMeta = meta$$1 !== undefined;
+
+ if (hasMeta && !meta$$1.isInitialized(obj)) {
+ return;
+ }
+
+ var possibleDesc = descriptorFor(obj, keyName, meta$$1);
+
+ // shouldn't this mean that we're watching this key?
+ if (possibleDesc !== undefined && possibleDesc.didChange) {
+ possibleDesc.didChange(obj, keyName);
+ }
+
+ if (hasMeta && meta$$1.peekWatching(keyName) > 0) {
+ dependentKeysDidChange(obj, keyName, meta$$1);
+ chainsDidChange(obj, keyName, meta$$1);
+ notifyObservers(obj, keyName, meta$$1);
+ }
+
+ if (obj[PROPERTY_DID_CHANGE]) {
+ obj[PROPERTY_DID_CHANGE](keyName);
+ }
+
+ if (hasMeta) {
+ if (meta$$1.isSourceDestroying()) {
+ return;
+ }
+ markObjectAsDirty(meta$$1, keyName);
+ }
+
+ if (features.EMBER_GLIMMER_DETECT_BACKTRACKING_RERENDER) {
+ exports.assertNotRendered(obj, keyName, meta$$1);
+ }
+ }
+
+ var WILL_SEEN = void 0;
+ var DID_SEEN = void 0;
+ // called whenever a property is about to change to clear the cache of any dependent keys (and notify those properties of changes, etc...)
+ function dependentKeysWillChange(obj, depKey, meta$$1) {
+ if (meta$$1.isSourceDestroying() || !meta$$1.hasDeps(depKey)) {
+ return;
+ }
+ var seen = WILL_SEEN;
+ var top = !seen;
+
+ if (top) {
+ seen = WILL_SEEN = {};
+ }
+
+ iterDeps(propertyWillChange, obj, depKey, seen, meta$$1);
+
+ if (top) {
+ WILL_SEEN = null;
+ }
+ }
+
+ // called whenever a property has just changed to update dependent keys
+ function dependentKeysDidChange(obj, depKey, meta$$1) {
+ if (meta$$1.isSourceDestroying() || !meta$$1.hasDeps(depKey)) {
+ return;
+ }
+ var seen = DID_SEEN;
+ var top = !seen;
+
+ if (top) {
+ seen = DID_SEEN = {};
+ }
+
+ iterDeps(propertyDidChange, obj, depKey, seen, meta$$1);
+
+ if (top) {
+ DID_SEEN = null;
+ }
+ }
+
+ function iterDeps(method, obj, depKey, seen, meta$$1) {
+ var possibleDesc = void 0;
+ var guid = emberUtils.guidFor(obj);
+ var current = seen[guid];
+
+ if (!current) {
+ current = seen[guid] = {};
+ }
+
+ if (current[depKey]) {
+ return;
+ }
+
+ current[depKey] = true;
+
+ meta$$1.forEachInDeps(depKey, function (key, value) {
+ if (!value) {
+ return;
+ }
+
+ possibleDesc = descriptorFor(obj, key, meta$$1);
+
+ if (possibleDesc !== undefined && possibleDesc._suspended === obj) {
+ return;
+ }
+
+ method(obj, key, meta$$1);
+ });
+ }
+
+ function chainsWillChange(obj, keyName, meta$$1) {
+ var chainWatchers = meta$$1.readableChainWatchers();
+ if (chainWatchers !== undefined) {
+ chainWatchers.notify(keyName, false, propertyWillChange);
+ }
+ }
+
+ function chainsDidChange(obj, keyName, meta$$1) {
+ var chainWatchers = meta$$1.readableChainWatchers();
+ if (chainWatchers !== undefined) {
+ chainWatchers.notify(keyName, true, propertyDidChange);
+ }
+ }
+
+ function overrideChains(obj, keyName, meta$$1) {
+ var chainWatchers = meta$$1.readableChainWatchers();
+ if (chainWatchers !== undefined) {
+ chainWatchers.revalidate(keyName);
+ }
+ }
+
+ /**
+ @method beginPropertyChanges
+ @chainable
+ @private
+ */
+ function beginPropertyChanges() {
+ deferred++;
+ }
+
+ /**
+ @method endPropertyChanges
+ @private
+ */
+ function endPropertyChanges() {
+ deferred--;
+ if (deferred <= 0) {
+ beforeObserverSet.clear();
+ observerSet.flush();
+ }
+ }
+
+ /**
+ Make a series of property changes together in an
+ exception-safe way.
+
+ ```javascript
+ Ember.changeProperties(function() {
+ obj1.set('foo', mayBlowUpWhenSet);
+ obj2.set('bar', baz);
+ });
+ ```
+
+ @method changeProperties
+ @param {Function} callback
+ @private
+ */
+ function changeProperties(callback) {
+ beginPropertyChanges();
+ try {
+ callback();
+ } finally {
+ endPropertyChanges();
+ }
+ }
+
+ function indexOf(array, target, method) {
+ var index = -1;
+ // hashes are added to the end of the event array
+ // so it makes sense to start searching at the end
+ // of the array and search in reverse
+ for (var i = array.length - 3; i >= 0; i -= 3) {
+ if (target === array[i] && method === array[i + 1]) {
+ index = i;
+ break;
+ }
+ }
+ return index;
+ }
+
+ function accumulateListeners(obj, eventName, otherActions, meta$$1) {
+ var actions = meta$$1.matchingListeners(eventName);
+ if (actions === undefined) {
+ return;
+ }
+ var newActions = [];
+
+ for (var i = actions.length - 3; i >= 0; i -= 3) {
+ var target = actions[i];
+ var method = actions[i + 1];
+ var flags = actions[i + 2];
+ var actionIndex = indexOf(otherActions, target, method);
+
+ if (actionIndex === -1) {
+ otherActions.push(target, method, flags);
+ newActions.push(target, method, flags);
+ }
+ }
+
+ return newActions;
+ }
+
+ function notifyBeforeObservers(obj, keyName, meta$$1) {
+ if (meta$$1.isSourceDestroying()) {
+ return;
+ }
+
+ var eventName = beforeEvent(keyName);
+ var listeners = void 0,
+ added = void 0;
+ if (deferred > 0) {
+ listeners = beforeObserverSet.add(obj, keyName, eventName);
+ added = accumulateListeners(obj, eventName, listeners, meta$$1);
+ }
+ sendEvent(obj, eventName, [obj, keyName], added);
+ }
+
+ function notifyObservers(obj, keyName, meta$$1) {
+ if (meta$$1.isSourceDestroying()) {
+ return;
+ }
+
+ var eventName = changeEvent(keyName);
+ var listeners = void 0;
+ if (deferred > 0) {
+ listeners = observerSet.add(obj, keyName, eventName);
+ accumulateListeners(obj, eventName, listeners, meta$$1);
+ } else {
+ sendEvent(obj, eventName, [obj, keyName]);
+ }
+ }
+
+ /**
+ @module @ember/object
+ */
+
+ // ..........................................................
+ // DESCRIPTOR
+ //
+
+ /**
+ Objects of this type can implement an interface to respond to requests to
+ get and set. The default implementation handles simple properties.
+
+ @class Descriptor
+ @private
+ */
+ function Descriptor() {
+ this.isDescriptor = true;
+ }
+
+ // ..........................................................
+ // DEFINING PROPERTIES API
+ //
+
+ function MANDATORY_SETTER_FUNCTION(name) {
+ function SETTER_FUNCTION(value) {
+ var m = peekMeta(this);
+ if (!m.isInitialized(this)) {
+ m.writeValues(name, value);
+ } else {
+ true && !false && emberDebug.assert('You must use set() to set the `' + name + '` property (of ' + this + ') to `' + value + '`.', false);
+ }
+ }
+
+ SETTER_FUNCTION.isMandatorySetter = true;
+ return SETTER_FUNCTION;
+ }
+
+ function DEFAULT_GETTER_FUNCTION(name) {
+ return function GETTER_FUNCTION() {
+ var meta$$1 = peekMeta(this);
+ if (meta$$1 !== undefined) {
+ return meta$$1.peekValues(name);
+ }
+ };
+ }
+
+ function INHERITING_GETTER_FUNCTION(name) {
+ function IGETTER_FUNCTION() {
+ var meta$$1 = peekMeta(this);
+ var val = void 0;
+ if (meta$$1 !== undefined) {
+ val = meta$$1.readInheritedValue('values', name);
+ }
+
+ if (val === UNDEFINED) {
+ var proto = Object.getPrototypeOf(this);
+ return proto && proto[name];
+ } else {
+ return val;
+ }
+ }
+
+ IGETTER_FUNCTION.isInheritingGetter = true;
+ return IGETTER_FUNCTION;
+ }
+
+ var DESCRIPTOR_GETTER_FUNCTION = void 0;
+
+ if (features.EMBER_METAL_ES5_GETTERS) {
+ DESCRIPTOR_GETTER_FUNCTION = function (name, descriptor) {
+ return function CPGETTER_FUNCTION() {
+ return descriptor.get(this, name);
+ };
+ };
+ } else if (features.DESCRIPTOR_TRAP) {
+ // Future traveler, although this code looks scary. It merely exists in
+ // development to aid in development asertions. Production builds of
+ // ember strip this entire branch out.
+ var messageFor = function (obj, keyName, property, value) {
+ return 'You attempted to access `' + keyName + '.' + String(property) + '` ' + ('(on `' + obj + '`), but `' + keyName + '` is a computed property.\n\n') + 'Due to certain internal implementation details of Ember, the ' + ('`' + keyName + '` property previously contained a private "descriptor" ') + ('object, therefore `' + keyName + '.' + String(property) + '` would have been ') + ('`' + String(value).replace(/\n/g, ' ') + '`.\n\n') + 'This implementation detail has now changed and the "descriptor" ' + 'object is no longer present at this location. Soon, accessing ' + ('`' + keyName + '` on this object will return the computed property\'s ') + 'current value (see RFC #281 for more details).\n\n' + 'If you are seeing this error, you are likely using an addon that ' + 'relies on this now-defunct private implementation detail. If you ' + 'can, identify the addon from the stack trace below and report this ' + 'bug to the addon authors. If you feel stuck, the Ember Community ' + 'Slack (https://ember-community-slackin.herokuapp.com/) may be able ' + 'to offer some help.\n\n' + 'If you are an addon author and need help transitioning your code, ' + 'please get in touch in the #dev-ember channel in the Ember Community ' + 'Slack.';
+ };
+
+ var trapFor = void 0;
+
+ if (emberUtils.HAS_NATIVE_PROXY) {
+ /* globals Proxy */
+ trapFor = function (obj, keyName, descriptor) {
+ return new Proxy(descriptor, {
+ get: function (descriptor, property) {
+ if (property === DESCRIPTOR) {
+ return descriptor;
+ } else if (property === 'prototype' || property === 'constructor' || property === 'nodeType') {
+ return undefined;
+ } else if (property === 'toString' || property === 'valueOf' || property === 'inspect' || Symbol && property === Symbol.toPrimitive || Symbol && property === Symbol.toStringTag) {
+ return function () {
+ return '[COMPUTED PROPERTY]';
+ };
+ }
+
+ true && !false && emberDebug.assert(messageFor(obj, keyName, property, descriptor[property]));
+ }
+ });
+ };
+ } else {
+ trapFor = function (obj, keyName, descriptor) {
+ var trap = Object.create(null);
+
+ Object.defineProperty(trap, DESCRIPTOR, {
+ configurable: false,
+ enumerable: false,
+ writable: false,
+ value: descriptor
+ });
+
+ trap.toString = trap.valueOf = function () {
+ return '[COMPUTED PROPERTY]';
+ };
+
+ // Without a proxy, we can only trap the "likely" properties
+ ['isDescriptor', 'setup', 'teardown', 'get', '_getter', 'set', '_setter', 'meta'].forEach(function (property) {
+ Object.defineProperty(trap, property, {
+ configurable: false,
+ enumerable: false,
+ get: function () {
+ true && !false && emberDebug.assert(messageFor(obj, keyName, property, descriptor[property]));
+ }
+ });
+ });
+
+ return trap;
+ };
+ }
+
+ DESCRIPTOR_GETTER_FUNCTION = function (name, descriptor) {
+ var trap = void 0;
+ return function CPGETTER_FUNCTION() {
+ if (trap) {
+ return trap;
+ }
+
+ trap = trapFor(this, name, descriptor);
+ return trap;
+ };
+ };
+ }
+
+ /**
+ NOTE: This is a low-level method used by other parts of the API. You almost
+ never want to call this method directly. Instead you should use
+ `mixin()` to define new properties.
+
+ Defines a property on an object. This method works much like the ES5
+ `Object.defineProperty()` method except that it can also accept computed
+ properties and other special descriptors.
+
+ Normally this method takes only three parameters. However if you pass an
+ instance of `Descriptor` as the third param then you can pass an
+ optional value as the fourth parameter. This is often more efficient than
+ creating new descriptor hashes for each property.
+
+ ## Examples
+
+ ```javascript
+ import { defineProperty, computed } from '@ember/object';
+
+ // ES5 compatible mode
+ defineProperty(contact, 'firstName', {
+ writable: true,
+ configurable: false,
+ enumerable: true,
+ value: 'Charles'
+ });
+
+ // define a simple property
+ defineProperty(contact, 'lastName', undefined, 'Jolley');
+
+ // define a computed property
+ defineProperty(contact, 'fullName', computed('firstName', 'lastName', function() {
+ return this.firstName+' '+this.lastName;
+ }));
+ ```
+
+ @private
+ @method defineProperty
+ @for @ember/object
+ @param {Object} obj the object to define this property on. This may be a prototype.
+ @param {String} keyName the name of the property
+ @param {Descriptor} [desc] an instance of `Descriptor` (typically a
+ computed property) or an ES5 descriptor.
+ You must provide this or `data` but not both.
+ @param {*} [data] something other than a descriptor, that will
+ become the explicit value of this property.
+ */
+ function defineProperty(obj, keyName, desc, data, meta$$1) {
+ if (meta$$1 === undefined) {
+ meta$$1 = meta(obj);
+ }
+
+ var watchEntry = meta$$1.peekWatching(keyName);
+ var watching = watchEntry !== undefined && watchEntry > 0;
+ var previousDesc = descriptorFor(obj, keyName, meta$$1);
+ var wasDescriptor = previousDesc !== undefined;
+
+ if (wasDescriptor) {
+ previousDesc.teardown(obj, keyName, meta$$1);
+
+ if (features.EMBER_METAL_ES5_GETTERS) {
+ meta$$1.removeDescriptors(keyName);
+ }
+ }
+
+ // used to track if the the property being defined be enumerable
+ var enumerable = true;
+
+ // Ember.NativeArray is a normal Ember.Mixin that we mix into `Array.prototype` when prototype extensions are enabled
+ // mutating a native object prototype like this should _not_ result in enumerable properties being added (or we have significant
+ // issues with things like deep equality checks from test frameworks, or things like jQuery.extend(true, [], [])).
+ //
+ // this is a hack, and we should stop mutating the array prototype by default 😫
+ if (obj === Array.prototype) {
+ enumerable = false;
+ }
+
+ var value = void 0;
+ if (desc instanceof Descriptor) {
+ value = desc;
+
+ if (features.EMBER_METAL_ES5_GETTERS || features.DESCRIPTOR_TRAP) {
+ Object.defineProperty(obj, keyName, {
+ configurable: true,
+ enumerable: enumerable,
+ get: DESCRIPTOR_GETTER_FUNCTION(keyName, value)
+ });
+ } else if (features.MANDATORY_SETTER && watching) {
+ Object.defineProperty(obj, keyName, {
+ configurable: true,
+ enumerable: enumerable,
+ writable: true,
+ value: value
+ });
+ } else if (enumerable === false) {
+ Object.defineProperty(obj, keyName, {
+ configurable: true,
+ writable: true,
+ enumerable: enumerable,
+ value: value
+ });
+ } else {
+ obj[keyName] = value;
+ }
+
+ if (features.EMBER_METAL_ES5_GETTERS) {
+ meta$$1.writeDescriptors(keyName, value);
+ }
+
+ didDefineComputedProperty(obj.constructor);
+
+ if (typeof desc.setup === 'function') {
+ desc.setup(obj, keyName);
+ }
+ } else if (desc === undefined || desc === null) {
+ value = data;
+
+ if (features.MANDATORY_SETTER && watching) {
+ meta$$1.writeValues(keyName, data);
+
+ var defaultDescriptor = {
+ configurable: true,
+ enumerable: enumerable,
+ set: MANDATORY_SETTER_FUNCTION(keyName),
+ get: DEFAULT_GETTER_FUNCTION(keyName)
+ };
+
+ Object.defineProperty(obj, keyName, defaultDescriptor);
+ } else if ((features.EMBER_METAL_ES5_GETTERS || features.DESCRIPTOR_TRAP) && wasDescriptor) {
+ Object.defineProperty(obj, keyName, {
+ configurable: true,
+ enumerable: enumerable,
+ writable: true,
+ value: value
+ });
+ } else if (enumerable === false) {
+ Object.defineProperty(obj, keyName, {
+ configurable: true,
+ enumerable: enumerable,
+ writable: true,
+ value: value
+ });
+ } else {
+ obj[keyName] = data;
+ }
+ } else {
+ value = desc;
+
+ // fallback to ES5
+ Object.defineProperty(obj, keyName, desc);
+ }
+
+ // if key is being watched, override chains that
+ // were initialized with the prototype
+ if (watching) {
+ overrideChains(obj, keyName, meta$$1);
+ }
+
+ // The `value` passed to the `didDefineProperty` hook is
+ // either the descriptor or data, whichever was passed.
+ if (typeof obj.didDefineProperty === 'function') {
+ obj.didDefineProperty(obj, keyName, value);
+ }
+
+ return this;
+ }
+
+ var hasCachedComputedProperties = false;
+ function _hasCachedComputedProperties() {
+ hasCachedComputedProperties = true;
+ }
+
+ function didDefineComputedProperty(constructor) {
+ if (hasCachedComputedProperties === false) {
+ return;
+ }
+ var cache = meta(constructor).readableCache();
+
+ if (cache && cache._computedProperties !== undefined) {
+ cache._computedProperties = undefined;
+ }
+ }
+
+ var handleMandatorySetter = void 0;
+
+ function watchKey(obj, keyName, _meta) {
+ if (typeof obj !== 'object' || obj === null) {
+ return;
+ }
+
+ var meta$$1 = _meta === undefined ? meta(obj) : _meta;
+ var count = meta$$1.peekWatching(keyName) || 0;
+ meta$$1.writeWatching(keyName, count + 1);
+
+ if (count === 0) {
+ // activate watching first time
+ var possibleDesc = descriptorFor(obj, keyName, meta$$1);
+
+ if (possibleDesc !== undefined && possibleDesc.willWatch) {
+ possibleDesc.willWatch(obj, keyName, meta$$1);
+ }
+
+ if (typeof obj.willWatchProperty === 'function') {
+ obj.willWatchProperty(keyName);
+ }
+
+ if (features.MANDATORY_SETTER) {
+ // NOTE: this is dropped for prod + minified builds
+ handleMandatorySetter(meta$$1, obj, keyName);
+ }
+ }
+ }
+
+ if (features.MANDATORY_SETTER) {
+ var _hasOwnProperty = function (obj, key) {
+ return Object.prototype.hasOwnProperty.call(obj, key);
+ };
+ var _propertyIsEnumerable = function (obj, key) {
+ return Object.prototype.propertyIsEnumerable.call(obj, key);
+ };
+
+ // Future traveler, although this code looks scary. It merely exists in
+ // development to aid in development asertions. Production builds of
+ // ember strip this entire block out
+ handleMandatorySetter = function handleMandatorySetter(m, obj, keyName) {
+ var descriptor = emberUtils.lookupDescriptor(obj, keyName);
+ var hasDescriptor = descriptor !== null;
+ var possibleDesc = hasDescriptor && descriptor.value;
+ if (isDescriptor(possibleDesc)) {
+ return;
+ }
+ var configurable = hasDescriptor ? descriptor.configurable : true;
+ var isWritable = hasDescriptor ? descriptor.writable : true;
+ var hasValue = hasDescriptor ? 'value' in descriptor : true;
+
+ // this x in Y deopts, so keeping it in this function is better;
+ if (configurable && isWritable && hasValue && keyName in obj) {
+ var desc = {
+ configurable: true,
+ set: MANDATORY_SETTER_FUNCTION(keyName),
+ enumerable: _propertyIsEnumerable(obj, keyName),
+ get: undefined
+ };
+
+ if (_hasOwnProperty(obj, keyName)) {
+ m.writeValues(keyName, obj[keyName]);
+ desc.get = DEFAULT_GETTER_FUNCTION(keyName);
+ } else {
+ desc.get = INHERITING_GETTER_FUNCTION(keyName);
+ }
+
+ Object.defineProperty(obj, keyName, desc);
+ }
+ };
+ }
+
+ function unwatchKey(obj, keyName, _meta) {
+ if (typeof obj !== 'object' || obj === null) {
+ return;
+ }
+ var meta$$1 = _meta === undefined ? peekMeta(obj) : _meta;
+
+ // do nothing of this object has already been destroyed
+ if (meta$$1 === undefined || meta$$1.isSourceDestroyed()) {
+ return;
+ }
+
+ var count = meta$$1.peekWatching(keyName);
+ if (count === 1) {
+ meta$$1.writeWatching(keyName, 0);
+
+ var possibleDesc = descriptorFor(obj, keyName, meta$$1);
+ var _isDescriptor = possibleDesc !== undefined;
+
+ if (_isDescriptor && possibleDesc.didUnwatch) {
+ possibleDesc.didUnwatch(obj, keyName, meta$$1);
+ }
+
+ if (typeof obj.didUnwatchProperty === 'function') {
+ obj.didUnwatchProperty(keyName);
+ }
+
+ if (features.MANDATORY_SETTER) {
+ // It is true, the following code looks quite WAT. But have no fear, It
+ // exists purely to improve development ergonomics and is removed from
+ // ember.min.js and ember.prod.js builds.
+ //
+ // Some further context: Once a property is watched by ember, bypassing `set`
+ // for mutation, will bypass observation. This code exists to assert when
+ // that occurs, and attempt to provide more helpful feedback. The alternative
+ // is tricky to debug partially observable properties.
+ if (!_isDescriptor && keyName in obj) {
+ var maybeMandatoryDescriptor = emberUtils.lookupDescriptor(obj, keyName);
+
+ if (maybeMandatoryDescriptor.set && maybeMandatoryDescriptor.set.isMandatorySetter) {
+ if (maybeMandatoryDescriptor.get && maybeMandatoryDescriptor.get.isInheritingGetter) {
+ var possibleValue = meta$$1.readInheritedValue('values', keyName);
+ if (possibleValue === UNDEFINED) {
+ delete obj[keyName];
+ return;
+ }
+ }
+
+ Object.defineProperty(obj, keyName, {
+ configurable: true,
+ enumerable: Object.prototype.propertyIsEnumerable.call(obj, keyName),
+ writable: true,
+ value: meta$$1.peekValues(keyName)
+ });
+ meta$$1.deleteFromValues(keyName);
+ }
+ }
+ }
+ } else if (count > 1) {
+ meta$$1.writeWatching(keyName, count - 1);
+ }
+ }
+
+ var FIRST_KEY = /^([^\.]+)/;
+
+ function firstKey(path) {
+ return path.match(FIRST_KEY)[0];
+ }
+
+ function isObject(obj) {
+ return typeof obj === 'object' && obj !== null;
+ }
+
+ function isVolatile(obj, keyName, meta$$1) {
+ var desc = descriptorFor(obj, keyName, meta$$1);
+ return !(desc !== undefined && desc._volatile === false);
+ }
+
+ var ChainWatchers = function () {
+ function ChainWatchers() {
+ emberBabel.classCallCheck(this, ChainWatchers);
+
+ // chain nodes that reference a key in this obj by key
+ // we only create ChainWatchers when we are going to add them
+ // so create this upfront
+ this.chains = Object.create(null);
+ }
+
+ ChainWatchers.prototype.add = function add(key, node) {
+ var nodes = this.chains[key];
+ if (nodes === undefined) {
+ this.chains[key] = [node];
+ } else {
+ nodes.push(node);
+ }
+ };
+
+ ChainWatchers.prototype.remove = function remove(key, node) {
+ var nodes = this.chains[key];
+ if (nodes !== undefined) {
+ for (var i = 0; i < nodes.length; i++) {
+ if (nodes[i] === node) {
+ nodes.splice(i, 1);
+ break;
+ }
+ }
+ }
+ };
+
+ ChainWatchers.prototype.has = function has(key, node) {
+ var nodes = this.chains[key];
+ if (nodes !== undefined) {
+ for (var i = 0; i < nodes.length; i++) {
+ if (nodes[i] === node) {
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+
+ ChainWatchers.prototype.revalidateAll = function revalidateAll() {
+ for (var key in this.chains) {
+ this.notify(key, true, undefined);
+ }
+ };
+
+ ChainWatchers.prototype.revalidate = function revalidate(key) {
+ this.notify(key, true, undefined);
+ };
+
+ // key: the string key that is part of a path changed
+ // revalidate: boolean; the chains that are watching this value should revalidate
+ // callback: function that will be called with the object and path that
+ // will be/are invalidated by this key change, depending on
+ // whether the revalidate flag is passed
+
+
+ ChainWatchers.prototype.notify = function notify(key, revalidate, callback) {
+ var nodes = this.chains[key];
+ if (nodes === undefined || nodes.length === 0) {
+ return;
+ }
+
+ var affected = void 0;
+
+ if (callback) {
+ affected = [];
+ }
+
+ for (var i = 0; i < nodes.length; i++) {
+ nodes[i].notify(revalidate, affected);
+ }
+
+ if (callback === undefined) {
+ return;
+ }
+
+ // we gather callbacks so we don't notify them during revalidation
+ for (var _i = 0; _i < affected.length; _i += 2) {
+ var obj = affected[_i];
+ var path = affected[_i + 1];
+ callback(obj, path);
+ }
+ };
+
+ return ChainWatchers;
+ }();
+
+ function makeChainWatcher() {
+ return new ChainWatchers();
+ }
+
+ function makeChainNode(obj) {
+ return new ChainNode(null, null, obj);
+ }
+
+ function addChainWatcher(obj, keyName, node) {
+ var m = meta(obj);
+ m.writableChainWatchers(makeChainWatcher).add(keyName, node);
+ watchKey(obj, keyName, m);
+ }
+
+ function removeChainWatcher(obj, keyName, node, _meta) {
+ if (!isObject(obj)) {
+ return;
+ }
+
+ var meta$$1 = _meta === undefined ? peekMeta(obj) : _meta;
+
+ if (meta$$1 === undefined || meta$$1.readableChainWatchers() === undefined) {
+ return;
+ }
+
+ // make meta writable
+ meta$$1 = meta(obj);
+
+ meta$$1.readableChainWatchers().remove(keyName, node);
+
+ unwatchKey(obj, keyName, meta$$1);
+ }
+
+ // A ChainNode watches a single key on an object. If you provide a starting
+ // value for the key then the node won't actually watch it. For a root node
+ // pass null for parent and key and object for value.
+
+ var ChainNode = function () {
+ function ChainNode(parent, key, value) {
+ emberBabel.classCallCheck(this, ChainNode);
+
+ this._parent = parent;
+ this._key = key;
+
+ // _watching is true when calling get(this._parent, this._key) will
+ // return the value of this node.
+ //
+ // It is false for the root of a chain (because we have no parent)
+ // and for global paths (because the parent node is the object with
+ // the observer on it)
+ var isWatching = this._watching = value === undefined;
+
+ this._chains = undefined;
+ this._object = undefined;
+ this.count = 0;
+
+ this._value = value;
+ this._paths = undefined;
+ if (isWatching) {
+ var obj = parent.value();
+
+ if (!isObject(obj)) {
+ return;
+ }
+
+ this._object = obj;
+
+ addChainWatcher(this._object, this._key, this);
+ }
+ }
+
+ ChainNode.prototype.value = function value() {
+ if (this._value === undefined && this._watching) {
+ var obj = this._parent.value();
+ this._value = lazyGet(obj, this._key);
+ }
+ return this._value;
+ };
+
+ ChainNode.prototype.destroy = function destroy() {
+ if (this._watching) {
+ removeChainWatcher(this._object, this._key, this);
+ this._watching = false; // so future calls do nothing
+ }
+ };
+
+ // copies a top level object only
+
+
+ ChainNode.prototype.copy = function copy(obj) {
+ var ret = makeChainNode(obj);
+ var paths = this._paths;
+ if (paths !== undefined) {
+ var path = void 0;
+ for (path in paths) {
+ if (paths[path] > 0) {
+ ret.add(path);
+ }
+ }
+ }
+ return ret;
+ };
+
+ // called on the root node of a chain to setup watchers on the specified
+ // path.
+
+
+ ChainNode.prototype.add = function add(path) {
+ var paths = this._paths || (this._paths = {});
+ paths[path] = (paths[path] || 0) + 1;
+
+ var key = firstKey(path);
+ var tail = path.slice(key.length + 1);
+
+ this.chain(key, tail);
+ };
+
+ // called on the root node of a chain to teardown watcher on the specified
+ // path
+
+
+ ChainNode.prototype.remove = function remove(path) {
+ var paths = this._paths;
+ if (paths === undefined) {
+ return;
+ }
+ if (paths[path] > 0) {
+ paths[path]--;
+ }
+
+ var key = firstKey(path);
+ var tail = path.slice(key.length + 1);
+
+ this.unchain(key, tail);
+ };
+
+ ChainNode.prototype.chain = function chain(key, path) {
+ var chains = this._chains;
+ var node = void 0;
+ if (chains === undefined) {
+ chains = this._chains = Object.create(null);
+ } else {
+ node = chains[key];
+ }
+
+ if (node === undefined) {
+ node = chains[key] = new ChainNode(this, key, undefined);
+ }
+
+ node.count++; // count chains...
+
+ // chain rest of path if there is one
+ if (path) {
+ key = firstKey(path);
+ path = path.slice(key.length + 1);
+ node.chain(key, path);
+ }
+ };
+
+ ChainNode.prototype.unchain = function unchain(key, path) {
+ var chains = this._chains;
+ var node = chains[key];
+
+ // unchain rest of path first...
+ if (path && path.length > 1) {
+ var nextKey = firstKey(path);
+ var nextPath = path.slice(nextKey.length + 1);
+ node.unchain(nextKey, nextPath);
+ }
+
+ // delete node if needed.
+ node.count--;
+ if (node.count <= 0) {
+ chains[node._key] = undefined;
+ node.destroy();
+ }
+ };
+
+ ChainNode.prototype.notify = function notify(revalidate, affected) {
+ if (revalidate && this._watching) {
+ var parentValue = this._parent.value();
+
+ if (parentValue !== this._object) {
+ removeChainWatcher(this._object, this._key, this);
+
+ if (isObject(parentValue)) {
+ this._object = parentValue;
+ addChainWatcher(parentValue, this._key, this);
+ } else {
+ this._object = undefined;
+ }
+ }
+ this._value = undefined;
+ }
+
+ // then notify chains...
+ var chains = this._chains;
+ if (chains !== undefined) {
+ var node = void 0;
+ for (var key in chains) {
+ node = chains[key];
+ if (node !== undefined) {
+ node.notify(revalidate, affected);
+ }
+ }
+ }
+
+ if (affected && this._parent) {
+ this._parent.populateAffected(this._key, 1, affected);
+ }
+ };
+
+ ChainNode.prototype.populateAffected = function populateAffected(path, depth, affected) {
+ if (this._key) {
+ path = this._key + '.' + path;
+ }
+
+ if (this._parent) {
+ this._parent.populateAffected(path, depth + 1, affected);
+ } else if (depth > 1) {
+ affected.push(this.value(), path);
+ }
+ };
+
+ return ChainNode;
+ }();
+
+ function lazyGet(obj, key) {
+ if (!isObject(obj)) {
+ return;
+ }
+
+ var meta$$1 = peekMeta(obj);
+
+ // check if object meant only to be a prototype
+ if (meta$$1 !== undefined && meta$$1.proto === obj) {
+ return;
+ }
+
+ // Use `get` if the return value is an EachProxy or an uncacheable value.
+ if (isVolatile(obj, key, meta$$1)) {
+ return get(obj, key);
+ // Otherwise attempt to get the cached value of the computed property
+ } else {
+ var cache = meta$$1.readableCache();
+ if (cache !== undefined) {
+ return cacheFor.get(cache, key);
+ }
+ }
+ }
+
+ function finishChains(meta$$1) {
+ // finish any current chains node watchers that reference obj
+ var chainWatchers = meta$$1.readableChainWatchers();
+ if (chainWatchers !== undefined) {
+ chainWatchers.revalidateAll();
+ }
+ // ensure that if we have inherited any chains they have been
+ // copied onto our own meta.
+ if (meta$$1.readableChains() !== undefined) {
+ meta$$1.writableChains(makeChainNode);
+ }
+ }
+
+ var counters = void 0;
+ {
+ counters = {
+ peekCalls: 0,
+ peekParentCalls: 0,
+ peekPrototypeWalks: 0,
+ setCalls: 0,
+ deleteCalls: 0,
+ metaCalls: 0,
+ metaInstantiated: 0
+ };
+ }
+
+ /**
+ @module ember
+ */
+
+ var UNDEFINED = emberUtils.symbol('undefined');
+
+ // FLAGS
+ var SOURCE_DESTROYING = 1 << 1;
+ var SOURCE_DESTROYED = 1 << 2;
+ var META_DESTROYED = 1 << 3;
+ var IS_PROXY = 1 << 4;
+
+ var NODE_STACK = [];
+
+ var Meta = function () {
+ function Meta(obj, parentMeta) {
+ emberBabel.classCallCheck(this, Meta);
+
+ {
+ counters.metaInstantiated++;
+ }
+
+ this._cache = undefined;
+
+ if (features.EMBER_METAL_ES5_GETTERS) {
+ this._descriptors = undefined;
+ }
+
+ this._watching = undefined;
+ this._mixins = undefined;
+ if (emberEnvironment.ENV._ENABLE_BINDING_SUPPORT) {
+ this._bindings = undefined;
+ }
+ this._values = undefined;
+ this._deps = undefined;
+ this._chainWatchers = undefined;
+ this._chains = undefined;
+ this._tag = undefined;
+ this._tags = undefined;
+ this._factory = undefined;
+
+ // initial value for all flags right now is false
+ // see FLAGS const for detailed list of flags used
+ this._flags = 0;
+
+ // used only internally
+ this.source = obj;
+
+ // when meta(obj).proto === obj, the object is intended to be only a
+ // prototype and doesn't need to actually be observable itself
+ this.proto = undefined;
+
+ // The next meta in our inheritance chain. We (will) track this
+ // explicitly instead of using prototypical inheritance because we
+ // have detailed knowledge of how each property should really be
+ // inherited, and we can optimize it much better than JS runtimes.
+ this.parent = parentMeta;
+
+ this._listeners = undefined;
+ this._listenersFinalized = false;
+ }
+
+ Meta.prototype.isInitialized = function isInitialized(obj) {
+ return this.proto !== obj;
+ };
+
+ Meta.prototype.destroy = function destroy() {
+ if (this.isMetaDestroyed()) {
+ return;
+ }
+
+ // remove chainWatchers to remove circular references that would prevent GC
+ var nodes = void 0,
+ key = void 0,
+ nodeObject = void 0;
+ var node = this.readableChains();
+ if (node !== undefined) {
+ NODE_STACK.push(node);
+ // process tree
+ while (NODE_STACK.length > 0) {
+ node = NODE_STACK.pop();
+ // push children
+ nodes = node._chains;
+ if (nodes !== undefined) {
+ for (key in nodes) {
+ if (nodes[key] !== undefined) {
+ NODE_STACK.push(nodes[key]);
+ }
+ }
+ }
+
+ // remove chainWatcher in node object
+ if (node._watching) {
+ nodeObject = node._object;
+ if (nodeObject !== undefined) {
+ var foreignMeta = peekMeta(nodeObject);
+ // avoid cleaning up chain watchers when both current and
+ // foreign objects are being destroyed
+ // if both are being destroyed manual cleanup is not needed
+ // as they will be GC'ed and no non-destroyed references will
+ // be remaining
+ if (foreignMeta && !foreignMeta.isSourceDestroying()) {
+ removeChainWatcher(nodeObject, node._key, node, foreignMeta);
+ }
+ }
+ }
+ }
+ }
+
+ this.setMetaDestroyed();
+ };
+
+ Meta.prototype.isSourceDestroying = function isSourceDestroying() {
+ return (this._flags & SOURCE_DESTROYING) !== 0;
+ };
+
+ Meta.prototype.setSourceDestroying = function setSourceDestroying() {
+ this._flags |= SOURCE_DESTROYING;
+ };
+
+ Meta.prototype.isSourceDestroyed = function isSourceDestroyed() {
+ return (this._flags & SOURCE_DESTROYED) !== 0;
+ };
+
+ Meta.prototype.setSourceDestroyed = function setSourceDestroyed() {
+ this._flags |= SOURCE_DESTROYED;
+ };
+
+ Meta.prototype.isMetaDestroyed = function isMetaDestroyed() {
+ return (this._flags & META_DESTROYED) !== 0;
+ };
+
+ Meta.prototype.setMetaDestroyed = function setMetaDestroyed() {
+ this._flags |= META_DESTROYED;
+ };
+
+ Meta.prototype.isProxy = function isProxy() {
+ return (this._flags & IS_PROXY) !== 0;
+ };
+
+ Meta.prototype.setProxy = function setProxy() {
+ this._flags |= IS_PROXY;
+ };
+
+ Meta.prototype._getOrCreateOwnMap = function _getOrCreateOwnMap(key) {
+ return this[key] || (this[key] = Object.create(null));
+ };
+
+ Meta.prototype._getInherited = function _getInherited(key) {
+ var pointer = this;
+ while (pointer !== undefined) {
+ var map = pointer[key];
+ if (map !== undefined) {
+ return map;
+ }
+ pointer = pointer.parent;
+ }
+ };
+
+ Meta.prototype._findInherited = function _findInherited(key, subkey) {
+ var pointer = this;
+ while (pointer !== undefined) {
+ var map = pointer[key];
+ if (map !== undefined) {
+ var value = map[subkey];
+ if (value !== undefined) {
+ return value;
+ }
+ }
+ pointer = pointer.parent;
+ }
+ };
+
+ // Implements a member that provides a lazily created map of maps,
+ // with inheritance at both levels.
+
+
+ Meta.prototype.writeDeps = function writeDeps(subkey, itemkey, value) {
+ true && !!this.isMetaDestroyed() && emberDebug.assert('Cannot modify dependent keys for `' + itemkey + '` on `' + emberUtils.toString(this.source) + '` after it has been destroyed.', !this.isMetaDestroyed());
+
+ var outerMap = this._getOrCreateOwnMap('_deps');
+ var innerMap = outerMap[subkey];
+ if (innerMap === undefined) {
+ innerMap = outerMap[subkey] = Object.create(null);
+ }
+ innerMap[itemkey] = value;
+ };
+
+ Meta.prototype.peekDeps = function peekDeps(subkey, itemkey) {
+ var pointer = this;
+ while (pointer !== undefined) {
+ var map = pointer._deps;
+ if (map !== undefined) {
+ var value = map[subkey];
+ if (value !== undefined) {
+ var itemvalue = value[itemkey];
+ if (itemvalue !== undefined) {
+ return itemvalue;
+ }
+ }
+ }
+ pointer = pointer.parent;
+ }
+ };
+
+ Meta.prototype.hasDeps = function hasDeps(subkey) {
+ var pointer = this;
+ while (pointer !== undefined) {
+ var deps = pointer._deps;
+ if (deps !== undefined && deps[subkey] !== undefined) {
+ return true;
+ }
+ pointer = pointer.parent;
+ }
+ return false;
+ };
+
+ Meta.prototype.forEachInDeps = function forEachInDeps(subkey, fn) {
+ return this._forEachIn('_deps', subkey, fn);
+ };
+
+ Meta.prototype._forEachIn = function _forEachIn(key, subkey, fn) {
+ var pointer = this;
+ var seen = void 0;
+ var calls = void 0;
+ while (pointer !== undefined) {
+ var map = pointer[key];
+ if (map !== undefined) {
+ var innerMap = map[subkey];
+ if (innerMap !== undefined) {
+ for (var innerKey in innerMap) {
+ seen = seen === undefined ? new Set() : seen;
+ if (!seen.has(innerKey)) {
+ seen.add(innerKey);
+ calls = calls || [];
+ calls.push(innerKey, innerMap[innerKey]);
+ }
+ }
+ }
+ }
+ pointer = pointer.parent;
+ }
+
+ if (calls !== undefined) {
+ for (var i = 0; i < calls.length; i += 2) {
+ fn(calls[i], calls[i + 1]);
+ }
+ }
+ };
+
+ Meta.prototype.writableCache = function writableCache() {
+ return this._getOrCreateOwnMap('_cache');
+ };
+
+ Meta.prototype.readableCache = function readableCache() {
+ return this._cache;
+ };
+
+ Meta.prototype.writableTags = function writableTags() {
+ return this._getOrCreateOwnMap('_tags');
+ };
+
+ Meta.prototype.readableTags = function readableTags() {
+ return this._tags;
+ };
+
+ Meta.prototype.writableTag = function writableTag(create) {
+ true && !!this.isMetaDestroyed() && emberDebug.assert('Cannot create a new tag for `' + emberUtils.toString(this.source) + '` after it has been destroyed.', !this.isMetaDestroyed());
+
+ var ret = this._tag;
+ if (ret === undefined) {
+ ret = this._tag = create(this.source);
+ }
+ return ret;
+ };
+
+ Meta.prototype.readableTag = function readableTag() {
+ return this._tag;
+ };
+
+ Meta.prototype.writableChainWatchers = function writableChainWatchers(create) {
+ true && !!this.isMetaDestroyed() && emberDebug.assert('Cannot create a new chain watcher for `' + emberUtils.toString(this.source) + '` after it has been destroyed.', !this.isMetaDestroyed());
+
+ var ret = this._chainWatchers;
+ if (ret === undefined) {
+ ret = this._chainWatchers = create(this.source);
+ }
+ return ret;
+ };
+
+ Meta.prototype.readableChainWatchers = function readableChainWatchers() {
+ return this._chainWatchers;
+ };
+
+ Meta.prototype.writableChains = function writableChains(create) {
+ true && !!this.isMetaDestroyed() && emberDebug.assert('Cannot create a new chains for `' + emberUtils.toString(this.source) + '` after it has been destroyed.', !this.isMetaDestroyed());
+
+ var ret = this._chains;
+ if (ret === undefined) {
+ if (this.parent === undefined) {
+ ret = create(this.source);
+ } else {
+ ret = this.parent.writableChains(create).copy(this.source);
+ }
+ this._chains = ret;
+ }
+ return ret;
+ };
+
+ Meta.prototype.readableChains = function readableChains() {
+ return this._getInherited('_chains');
+ };
+
+ Meta.prototype.writeWatching = function writeWatching(subkey, value) {
+ true && !!this.isMetaDestroyed() && emberDebug.assert('Cannot update watchers for `' + subkey + '` on `' + emberUtils.toString(this.source) + '` after it has been destroyed.', !this.isMetaDestroyed());
+
+ var map = this._getOrCreateOwnMap('_watching');
+ map[subkey] = value;
+ };
+
+ Meta.prototype.peekWatching = function peekWatching(subkey) {
+ return this._findInherited('_watching', subkey);
+ };
+
+ Meta.prototype.writeMixins = function writeMixins(subkey, value) {
+ true && !!this.isMetaDestroyed() && emberDebug.assert('Cannot add mixins for `' + subkey + '` on `' + emberUtils.toString(this.source) + '` call writeMixins after it has been destroyed.', !this.isMetaDestroyed());
+
+ var map = this._getOrCreateOwnMap('_mixins');
+ map[subkey] = value;
+ };
+
+ Meta.prototype.peekMixins = function peekMixins(subkey) {
+ return this._findInherited('_mixins', subkey);
+ };
+
+ Meta.prototype.forEachMixins = function forEachMixins(fn) {
+ var pointer = this;
+ var seen = void 0;
+ while (pointer !== undefined) {
+ var map = pointer._mixins;
+ if (map !== undefined) {
+ for (var key in map) {
+ seen = seen === undefined ? new Set() : seen;
+ if (!seen.has(key)) {
+ seen.add(key);
+ fn(key, map[key]);
+ }
+ }
+ }
+ pointer = pointer.parent;
+ }
+ };
+
+ Meta.prototype.writeBindings = function writeBindings(subkey, value) {
+ true && !emberEnvironment.ENV._ENABLE_BINDING_SUPPORT && emberDebug.assert('Cannot invoke `meta.writeBindings` when EmberENV._ENABLE_BINDING_SUPPORT is not set', emberEnvironment.ENV._ENABLE_BINDING_SUPPORT);
+ true && !!this.isMetaDestroyed() && emberDebug.assert('Cannot add a binding for `' + subkey + '` on `' + emberUtils.toString(this.source) + '` after it has been destroyed.', !this.isMetaDestroyed());
+
+ var map = this._getOrCreateOwnMap('_bindings');
+ map[subkey] = value;
+ };
+
+ Meta.prototype.peekBindings = function peekBindings(subkey) {
+ true && !emberEnvironment.ENV._ENABLE_BINDING_SUPPORT && emberDebug.assert('Cannot invoke `meta.peekBindings` when EmberENV._ENABLE_BINDING_SUPPORT is not set', emberEnvironment.ENV._ENABLE_BINDING_SUPPORT);
+
+ return this._findInherited('_bindings', subkey);
+ };
+
+ Meta.prototype.forEachBindings = function forEachBindings(fn) {
+ true && !emberEnvironment.ENV._ENABLE_BINDING_SUPPORT && emberDebug.assert('Cannot invoke `meta.forEachBindings` when EmberENV._ENABLE_BINDING_SUPPORT is not set', emberEnvironment.ENV._ENABLE_BINDING_SUPPORT);
+
+ var pointer = this;
+ var seen = void 0;
+ while (pointer !== undefined) {
+ var map = pointer._bindings;
+ if (map !== undefined) {
+ for (var key in map) {
+ seen = seen || Object.create(null);
+ if (seen[key] === undefined) {
+ seen[key] = true;
+ fn(key, map[key]);
+ }
+ }
+ }
+ pointer = pointer.parent;
+ }
+ };
+
+ Meta.prototype.clearBindings = function clearBindings() {
+ true && !emberEnvironment.ENV._ENABLE_BINDING_SUPPORT && emberDebug.assert('Cannot invoke `meta.clearBindings` when EmberENV._ENABLE_BINDING_SUPPORT is not set', emberEnvironment.ENV._ENABLE_BINDING_SUPPORT);
+ true && !!this.isMetaDestroyed() && emberDebug.assert('Cannot clear bindings on `' + emberUtils.toString(this.source) + '` after it has been destroyed.', !this.isMetaDestroyed());
+
+ this._bindings = undefined;
+ };
+
+ Meta.prototype.writeValues = function writeValues(subkey, value) {
+ true && !!this.isMetaDestroyed() && emberDebug.assert('Cannot set the value of `' + subkey + '` on `' + emberUtils.toString(this.source) + '` after it has been destroyed.', !this.isMetaDestroyed());
+
+ var map = this._getOrCreateOwnMap('_values');
+ map[subkey] = value;
+ };
+
+ Meta.prototype.peekValues = function peekValues(subkey) {
+ return this._findInherited('_values', subkey);
+ };
+
+ Meta.prototype.deleteFromValues = function deleteFromValues(subkey) {
+ delete this._getOrCreateOwnMap('_values')[subkey];
+ };
+
+ emberBabel.createClass(Meta, [{
+ key: 'factory',
+ set: function (factory) {
+ this._factory = factory;
+ },
+ get: function () {
+ return this._factory;
+ }
+ }]);
+
+ return Meta;
+ }();
+
+ for (var name in protoMethods) {
+ Meta.prototype[name] = protoMethods[name];
+ }
+
+ if (features.MANDATORY_SETTER) {
+ Meta.prototype.readInheritedValue = function (key, subkey) {
+ var internalKey = '_' + key;
+
+ var pointer = this;
+
+ while (pointer !== undefined) {
+ var map = pointer[internalKey];
+ if (map !== undefined) {
+ var value = map[subkey];
+ if (value !== undefined || subkey in map) {
+ return value;
+ }
+ }
+ pointer = pointer.parent;
+ }
+
+ return UNDEFINED;
+ };
+
+ Meta.prototype.writeValue = function (obj, key, value) {
+ var descriptor = emberUtils.lookupDescriptor(obj, key);
+ var isMandatorySetter = descriptor !== null && descriptor.set && descriptor.set.isMandatorySetter;
+
+ if (isMandatorySetter) {
+ this.writeValues(key, value);
+ } else {
+ obj[key] = value;
+ }
+ };
+ }
+
+ if (features.EMBER_METAL_ES5_GETTERS) {
+ Meta.prototype.writeDescriptors = function (subkey, value) {
+ true && !!this.isMetaDestroyed() && emberDebug.assert('Cannot update descriptors for `' + subkey + '` on `' + emberUtils.toString(this.source) + '` after it has been destroyed.', !this.isMetaDestroyed());
+
+ var map = this._getOrCreateOwnMap('_descriptors');
+ map[subkey] = value;
+ };
+
+ Meta.prototype.peekDescriptors = function (subkey) {
+ var possibleDesc = this._findInherited('_descriptors', subkey);
+ return possibleDesc === UNDEFINED ? undefined : possibleDesc;
+ };
+
+ Meta.prototype.removeDescriptors = function (subkey) {
+ this.writeDescriptors(subkey, UNDEFINED);
+ };
+ }
+
+ var getPrototypeOf = Object.getPrototypeOf;
+ var metaStore = new WeakMap();
+
+ function setMeta(obj, meta) {
+ true && !(obj !== null) && emberDebug.assert('Cannot call `setMeta` on null', obj !== null);
+ true && !(obj !== undefined) && emberDebug.assert('Cannot call `setMeta` on undefined', obj !== undefined);
+ true && !(typeof obj === 'object' || typeof obj === 'function') && emberDebug.assert('Cannot call `setMeta` on ' + typeof obj, typeof obj === 'object' || typeof obj === 'function');
+
+ {
+ counters.setCalls++;
+ }
+ metaStore.set(obj, meta);
+ }
+
+ function peekMeta(obj) {
+ true && !(obj !== null) && emberDebug.assert('Cannot call `peekMeta` on null', obj !== null);
+ true && !(obj !== undefined) && emberDebug.assert('Cannot call `peekMeta` on undefined', obj !== undefined);
+ true && !(typeof obj === 'object' || typeof obj === 'function') && emberDebug.assert('Cannot call `peekMeta` on ' + typeof obj, typeof obj === 'object' || typeof obj === 'function');
+
+ var pointer = obj;
+ var meta = void 0;
+ while (pointer !== undefined && pointer !== null) {
+ meta = metaStore.get(pointer);
+ // jshint loopfunc:true
+ {
+ counters.peekCalls++;
+ }
+ if (meta !== undefined) {
+ return meta;
+ }
+
+ pointer = getPrototypeOf(pointer);
+ {
+ counters.peekPrototypeWalks++;
+ }
+ }
+ }
+
+ /**
+ Tears down the meta on an object so that it can be garbage collected.
+ Multiple calls will have no effect.
+
+ @method deleteMeta
+ @for Ember
+ @param {Object} obj the object to destroy
+ @return {void}
+ @private
+ */
+ function deleteMeta(obj) {
+ true && !(obj !== null) && emberDebug.assert('Cannot call `deleteMeta` on null', obj !== null);
+ true && !(obj !== undefined) && emberDebug.assert('Cannot call `deleteMeta` on undefined', obj !== undefined);
+ true && !(typeof obj === 'object' || typeof obj === 'function') && emberDebug.assert('Cannot call `deleteMeta` on ' + typeof obj, typeof obj === 'object' || typeof obj === 'function');
+
+ {
+ counters.deleteCalls++;
+ }
+
+ var meta = peekMeta(obj);
+ if (meta !== undefined) {
+ meta.destroy();
+ }
+ }
+
+ /**
+ Retrieves the meta hash for an object. If `writable` is true ensures the
+ hash is writable for this object as well.
+
+ The meta object contains information about computed property descriptors as
+ well as any watched properties and other information. You generally will
+ not access this information directly but instead work with higher level
+ methods that manipulate this hash indirectly.
+
+ @method meta
+ @for Ember
+ @private
+
+ @param {Object} obj The object to retrieve meta for
+ @param {Boolean} [writable=true] Pass `false` if you do not intend to modify
+ the meta hash, allowing the method to avoid making an unnecessary copy.
+ @return {Object} the meta hash for an object
+ */
+ function meta(obj) {
+ true && !(obj !== null) && emberDebug.assert('Cannot call `meta` on null', obj !== null);
+ true && !(obj !== undefined) && emberDebug.assert('Cannot call `meta` on undefined', obj !== undefined);
+ true && !(typeof obj === 'object' || typeof obj === 'function') && emberDebug.assert('Cannot call `meta` on ' + typeof obj, typeof obj === 'object' || typeof obj === 'function');
+
+ {
+ counters.metaCalls++;
+ }
+
+ var maybeMeta = peekMeta(obj);
+ var parent = void 0;
+
+ // remove this code, in-favor of explicit parent
+ if (maybeMeta !== undefined) {
+ if (maybeMeta.source === obj) {
+ return maybeMeta;
+ }
+ parent = maybeMeta;
+ }
+
+ var newMeta = new Meta(obj, parent);
+ setMeta(obj, newMeta);
+ return newMeta;
+ }
+
+ // Using `symbol()` here causes some node test to fail, presumably
+ // because we define the CP with one copy of Ember and boot the app
+ // with a different copy, so the random key we generate do not line
+ // up. Is that testing a legit scenario?
+ var DESCRIPTOR = '__DESCRIPTOR__';
+
+ /**
+ Returns the CP descriptor assocaited with `obj` and `keyName`, if any.
+
+ @method descriptorFor
+ @param {Object} obj the object to check
+ @param {String} keyName the key to check
+ @return {Descriptor}
+ @private
+ */
+ function descriptorFor(obj, keyName, _meta) {
+ true && !(obj !== null) && emberDebug.assert('Cannot call `descriptorFor` on null', obj !== null);
+ true && !(obj !== undefined) && emberDebug.assert('Cannot call `descriptorFor` on undefined', obj !== undefined);
+ true && !(typeof obj === 'object' || typeof obj === 'function') && emberDebug.assert('Cannot call `descriptorFor` on ' + typeof obj, typeof obj === 'object' || typeof obj === 'function');
+
+ if (features.EMBER_METAL_ES5_GETTERS) {
+ var _meta2 = _meta === undefined ? peekMeta(obj) : _meta;
+
+ if (_meta2 !== undefined) {
+ return _meta2.peekDescriptors(keyName);
+ }
+ } else {
+ var possibleDesc = obj[keyName];
+
+ if (features.DESCRIPTOR_TRAP && isDescriptorTrap(possibleDesc)) {
+ return possibleDesc[DESCRIPTOR];
+ } else {
+ return isDescriptor(possibleDesc) ? possibleDesc : undefined;
+ }
+ }
+ }
+
+ function isDescriptorTrap(possibleDesc) {
+ if (features.DESCRIPTOR_TRAP) {
+ return possibleDesc !== null && typeof possibleDesc === 'object' && possibleDesc[DESCRIPTOR] !== undefined;
+ } else {
+ throw new Error('Cannot call `isDescriptorTrap` in production');
+ }
+ }
+
+ /**
+ Check whether a value is a CP descriptor.
+
+ @method descriptorFor
+ @param {any} possibleDesc the value to check
+ @return {boolean}
+ @private
+ */
+ function isDescriptor(possibleDesc) {
+ return possibleDesc !== null && typeof possibleDesc === 'object' && possibleDesc.isDescriptor;
+ }
+
+ var Cache = function () {
+ function Cache(limit, func, key, store) {
+ emberBabel.classCallCheck(this, Cache);
+
+ this.size = 0;
+ this.misses = 0;
+ this.hits = 0;
+ this.limit = limit;
+ this.func = func;
+ this.key = key;
+ this.store = store || new DefaultStore();
+ }
+
+ Cache.prototype.get = function get(obj) {
+ var key = this.key === undefined ? obj : this.key(obj);
+ var value = this.store.get(key);
+ if (value === undefined) {
+ this.misses++;
+ value = this._set(key, this.func(obj));
+ } else if (value === UNDEFINED) {
+ this.hits++;
+ value = undefined;
+ } else {
+ this.hits++;
+ // nothing to translate
+ }
+
+ return value;
+ };
+
+ Cache.prototype.set = function set(obj, value) {
+ var key = this.key === undefined ? obj : this.key(obj);
+ return this._set(key, value);
+ };
+
+ Cache.prototype._set = function _set(key, value) {
+ if (this.limit > this.size) {
+ this.size++;
+ if (value === undefined) {
+ this.store.set(key, UNDEFINED);
+ } else {
+ this.store.set(key, value);
+ }
+ }
+
+ return value;
+ };
+
+ Cache.prototype.purge = function purge() {
+ this.store.clear();
+ this.size = 0;
+ this.hits = 0;
+ this.misses = 0;
+ };
+
+ return Cache;
+ }();
+
+ var DefaultStore = function () {
+ function DefaultStore() {
+ emberBabel.classCallCheck(this, DefaultStore);
+
+ this.data = Object.create(null);
+ }
+
+ DefaultStore.prototype.get = function get(key) {
+ return this.data[key];
+ };
+
+ DefaultStore.prototype.set = function set(key, value) {
+ this.data[key] = value;
+ };
+
+ DefaultStore.prototype.clear = function clear() {
+ this.data = Object.create(null);
+ };
+
+ return DefaultStore;
+ }();
+
+ var firstDotIndexCache = new Cache(1000, function (key) {
+ return key.indexOf('.');
+ });
+
+ function isPath(path) {
+ return typeof path === 'string' && firstDotIndexCache.get(path) !== -1;
+ }
+
+ /**
+ @module @ember/object
+ */
+
+ var ALLOWABLE_TYPES = {
+ object: true,
+ function: true,
+ string: true
+ };
+
+ // ..........................................................
+ // GET AND SET
+ //
+ // If we are on a platform that supports accessors we can use those.
+ // Otherwise simulate accessors by looking up the property directly on the
+ // object.
+
+ /**
+ Gets the value of a property on an object. If the property is computed,
+ the function will be invoked. If the property is not defined but the
+ object implements the `unknownProperty` method then that will be invoked.
+
+ ```javascript
+ import { get } from '@ember/object';
+ get(obj, "name");
+ ```
+
+ If you plan to run on IE8 and older browsers then you should use this
+ method anytime you want to retrieve a property on an object that you don't
+ know for sure is private. (Properties beginning with an underscore '_'
+ are considered private.)
+
+ On all newer browsers, you only need to use this method to retrieve
+ properties if the property might not be defined on the object and you want
+ to respect the `unknownProperty` handler. Otherwise you can ignore this
+ method.
+
+ Note that if the object itself is `undefined`, this method will throw
+ an error.
+
+ @method get
+ @for @ember/object
+ @static
+ @param {Object} obj The object to retrieve from.
+ @param {String} keyName The property key to retrieve
+ @return {Object} the property value or `null`.
+ @public
+ */
+ function get(obj, keyName) {
+ true && !(arguments.length === 2) && emberDebug.assert('Get must be called with two arguments; an object and a property key', arguments.length === 2);
+ true && !(obj !== undefined && obj !== null) && emberDebug.assert('Cannot call get with \'' + keyName + '\' on an undefined object.', obj !== undefined && obj !== null);
+ true && !(typeof keyName === 'string' || typeof keyName === 'number' && !isNaN(keyName)) && emberDebug.assert('The key provided to get must be a string or number, you passed ' + keyName, typeof keyName === 'string' || typeof keyName === 'number' && !isNaN(keyName));
+ true && !(typeof keyName !== 'string' || keyName.lastIndexOf('this.', 0) !== 0) && emberDebug.assert('\'this\' in paths is not supported', typeof keyName !== 'string' || keyName.lastIndexOf('this.', 0) !== 0);
+ true && !(keyName !== '') && emberDebug.assert('Cannot call `get` with an empty string', keyName !== '');
+
+ var type = typeof obj;
+
+ var isObject = type === 'object';
+ var isFunction = type === 'function';
+ var isObjectLike = isObject || isFunction;
+
+ var descriptor = undefined;
+ var value = void 0;
+
+ if (isObjectLike) {
+ if (features.EMBER_METAL_ES5_GETTERS) {
+ descriptor = descriptorFor(obj, keyName);
+ }
+
+ if (!features.EMBER_METAL_ES5_GETTERS || descriptor === undefined) {
+ value = obj[keyName];
+
+ if (features.DESCRIPTOR_TRAP && isDescriptorTrap(value)) {
+ descriptor = value[DESCRIPTOR];
+ } else if (isDescriptor(value)) {
+ descriptor = value;
+ }
+ }
+
+ if (descriptor !== undefined) {
+ return descriptor.get(obj, keyName);
+ }
+ } else {
+ value = obj[keyName];
+ }
+
+ if (isPath(keyName)) {
+ return _getPath(obj, keyName);
+ } else if (value === undefined && isObject && !(keyName in obj) && typeof obj.unknownProperty === 'function') {
+ return obj.unknownProperty(keyName);
+ } else {
+ return value;
+ }
+ }
+
+ function _getPath(root, path) {
+ var obj = root;
+ var parts = path.split('.');
+
+ for (var i = 0; i < parts.length; i++) {
+ if (!isGettable(obj)) {
+ return undefined;
+ }
+
+ obj = get(obj, parts[i]);
+
+ if (obj && obj.isDestroyed) {
+ return undefined;
+ }
+ }
+
+ return obj;
+ }
+
+ function isGettable(obj) {
+ return obj !== undefined && obj !== null && ALLOWABLE_TYPES[typeof obj];
+ }
+
+ /**
+ Retrieves the value of a property from an Object, or a default value in the
+ case that the property returns `undefined`.
+
+ ```javascript
+ import { getWithDefault } from '@ember/object';
+ getWithDefault(person, 'lastName', 'Doe');
+ ```
+
+ @method getWithDefault
+ @for @ember/object
+ @static
+ @param {Object} obj The object to retrieve from.
+ @param {String} keyName The name of the property to retrieve
+ @param {Object} defaultValue The value to return if the property value is undefined
+ @return {Object} The property value or the defaultValue.
+ @public
+ */
+ function getWithDefault(root, key, defaultValue) {
+ var value = get(root, key);
+
+ if (value === undefined) {
+ return defaultValue;
+ }
+ return value;
+ }
+
+ /**
+ @module @ember/object
+ */
+ /**
+ Sets the value of a property on an object, respecting computed properties
+ and notifying observers and other listeners of the change. If the
+ property is not defined but the object implements the `setUnknownProperty`
+ method then that will be invoked as well.
+
+ ```javascript
+ import { set } from '@ember/object';
+ set(obj, "name", value);
+ ```
+
+ @method set
+ @static
+ @for @ember/object
+ @param {Object} obj The object to modify.
+ @param {String} keyName The property key to set
+ @param {Object} value The value to set
+ @return {Object} the passed value.
+ @public
+ */
+ function set(obj, keyName, value, tolerant) {
+ true && !(arguments.length === 3 || arguments.length === 4) && emberDebug.assert('Set must be called with three or four arguments; an object, a property key, a value and tolerant true/false', arguments.length === 3 || arguments.length === 4);
+ true && !(obj && typeof obj === 'object' || typeof obj === 'function') && emberDebug.assert('Cannot call set with \'' + keyName + '\' on an undefined object.', obj && typeof obj === 'object' || typeof obj === 'function');
+ true && !(typeof keyName === 'string' || typeof keyName === 'number' && !isNaN(keyName)) && emberDebug.assert('The key provided to set must be a string or number, you passed ' + keyName, typeof keyName === 'string' || typeof keyName === 'number' && !isNaN(keyName));
+ true && !(typeof keyName !== 'string' || keyName.lastIndexOf('this.', 0) !== 0) && emberDebug.assert('\'this\' in paths is not supported', typeof keyName !== 'string' || keyName.lastIndexOf('this.', 0) !== 0);
+ true && !!obj.isDestroyed && emberDebug.assert('calling set on destroyed object: ' + emberUtils.toString(obj) + '.' + keyName + ' = ' + emberUtils.toString(value), !obj.isDestroyed);
+
+ if (isPath(keyName)) {
+ return setPath(obj, keyName, value, tolerant);
+ }
+
+ if (features.EMBER_METAL_ES5_GETTERS) {
+ var possibleDesc = descriptorFor(obj, keyName);
+
+ if (possibleDesc !== undefined) {
+ /* computed property */
+ possibleDesc.set(obj, keyName, value);
+ return value;
+ }
+ }
+
+ var currentValue = obj[keyName];
+
+ if (features.DESCRIPTOR_TRAP && isDescriptorTrap(currentValue)) {
+ currentValue = currentValue[DESCRIPTOR];
+ }
+
+ if (isDescriptor(currentValue)) {
+ /* computed property */
+ currentValue.set(obj, keyName, value);
+ } else if (currentValue === undefined && 'object' === typeof obj && !(keyName in obj) && typeof obj.setUnknownProperty === 'function') {
+ /* unknown property */
+ obj.setUnknownProperty(keyName, value);
+ } else if (currentValue === value) {/* no change */
+ } else {
+ var meta$$1 = peekMeta(obj);
+ propertyWillChange(obj, keyName, meta$$1);
+
+ if (features.MANDATORY_SETTER) {
+ setWithMandatorySetter(meta$$1, obj, keyName, value);
+ } else {
+ obj[keyName] = value;
+ }
+
+ propertyDidChange(obj, keyName, meta$$1);
+ }
+
+ return value;
+ }
+
+ if (features.MANDATORY_SETTER) {
+ var setWithMandatorySetter = function (meta$$1, obj, keyName, value) {
+ if (meta$$1 !== undefined && meta$$1.peekWatching(keyName) > 0) {
+ makeEnumerable(obj, keyName);
+ meta$$1.writeValue(obj, keyName, value);
+ } else {
+ obj[keyName] = value;
+ }
+ };
+
+ var makeEnumerable = function (obj, key) {
+ var desc = Object.getOwnPropertyDescriptor(obj, key);
+
+ if (desc && desc.set && desc.set.isMandatorySetter) {
+ desc.enumerable = true;
+ Object.defineProperty(obj, key, desc);
+ }
+ };
+ }
+
+ function setPath(root, path, value, tolerant) {
+ var parts = path.split('.');
+ var keyName = parts.pop();
+
+ true && !(keyName.trim().length > 0) && emberDebug.assert('Property set failed: You passed an empty path', keyName.trim().length > 0);
+
+ var newPath = parts.join('.');
+
+ var newRoot = _getPath(root, newPath);
+
+ if (newRoot) {
+ return set(newRoot, keyName, value);
+ } else if (!tolerant) {
+ throw new emberDebug.Error('Property set failed: object in path "' + newPath + '" could not be found or was destroyed.');
+ }
+ }
+
+ /**
+ Error-tolerant form of `set`. Will not blow up if any part of the
+ chain is `undefined`, `null`, or destroyed.
+
+ This is primarily used when syncing bindings, which may try to update after
+ an object has been destroyed.
+
+ @method trySet
+ @static
+ @for @ember/object
+ @param {Object} root The object to modify.
+ @param {String} path The property path to set
+ @param {Object} value The value to set
+ @public
+ */
+ function trySet(root, path, value) {
+ return set(root, path, value, true);
+ }
+
+ /**
+ @module @ember/object
+ */
+
+ var END_WITH_EACH_REGEX = /\.@each$/;
+
+ /**
+ Expands `pattern`, invoking `callback` for each expansion.
+
+ The only pattern supported is brace-expansion, anything else will be passed
+ once to `callback` directly.
+
+ Example
+
+ ```js
+ import { expandProperties } from '@ember/object/computed';
+
+ function echo(arg){ console.log(arg); }
+
+ expandProperties('foo.bar', echo); //=> 'foo.bar'
+ expandProperties('{foo,bar}', echo); //=> 'foo', 'bar'
+ expandProperties('foo.{bar,baz}', echo); //=> 'foo.bar', 'foo.baz'
+ expandProperties('{foo,bar}.baz', echo); //=> 'foo.baz', 'bar.baz'
+ expandProperties('foo.{bar,baz}.[]', echo) //=> 'foo.bar.[]', 'foo.baz.[]'
+ expandProperties('{foo,bar}.{spam,eggs}', echo) //=> 'foo.spam', 'foo.eggs', 'bar.spam', 'bar.eggs'
+ expandProperties('{foo}.bar.{baz}') //=> 'foo.bar.baz'
+ ```
+
+ @method expandProperties
+ @static
+ @for @ember/object
+ @public
+ @param {String} pattern The property pattern to expand.
+ @param {Function} callback The callback to invoke. It is invoked once per
+ expansion, and is passed the expansion.
+ */
+ function expandProperties(pattern, callback) {
+ true && !(typeof pattern === 'string') && emberDebug.assert('A computed property key must be a string, you passed ' + typeof pattern + ' ' + pattern, typeof pattern === 'string');
+ true && !(pattern.indexOf(' ') === -1) && emberDebug.assert('Brace expanded properties cannot contain spaces, e.g. "user.{firstName, lastName}" should be "user.{firstName,lastName}"', pattern.indexOf(' ') === -1);
+ // regex to look for double open, double close, or unclosed braces
+
+ true && !(pattern.match(/\{[^}{]*\{|\}[^}{]*\}|\{[^}]*$/g) === null) && emberDebug.assert('Brace expanded properties have to be balanced and cannot be nested, pattern: ' + pattern, pattern.match(/\{[^}{]*\{|\}[^}{]*\}|\{[^}]*$/g) === null);
+
+ var start = pattern.indexOf('{');
+ if (start < 0) {
+ callback(pattern.replace(END_WITH_EACH_REGEX, '.[]'));
+ } else {
+ dive('', pattern, start, callback);
+ }
+ }
+
+ function dive(prefix, pattern, start, callback) {
+ var end = pattern.indexOf('}'),
+ i = 0,
+ newStart = void 0,
+ arrayLength = void 0;
+ var tempArr = pattern.substring(start + 1, end).split(',');
+ var after = pattern.substring(end + 1);
+ prefix = prefix + pattern.substring(0, start);
+
+ arrayLength = tempArr.length;
+ while (i < arrayLength) {
+ newStart = after.indexOf('{');
+ if (newStart < 0) {
+ callback((prefix + tempArr[i++] + after).replace(END_WITH_EACH_REGEX, '.[]'));
+ } else {
+ dive(prefix + tempArr[i++], after, newStart, callback);
+ }
+ }
+ }
+
+ // ..........................................................
+ // DEPENDENT KEYS
+ //
+
+ function addDependentKeys(desc, obj, keyName, meta) {
+ // the descriptor has a list of dependent keys, so
+ // add all of its dependent keys.
+ var depKeys = desc._dependentKeys;
+ if (depKeys === null || depKeys === undefined) {
+ return;
+ }
+
+ for (var idx = 0; idx < depKeys.length; idx++) {
+ var depKey = depKeys[idx];
+ // Increment the number of times depKey depends on keyName.
+ meta.writeDeps(depKey, keyName, (meta.peekDeps(depKey, keyName) || 0) + 1);
+ // Watch the depKey
+ watch(obj, depKey, meta);
+ }
+ }
+
+ function removeDependentKeys(desc, obj, keyName, meta) {
+ // the descriptor has a list of dependent keys, so
+ // remove all of its dependent keys.
+ var depKeys = desc._dependentKeys;
+ if (depKeys === null || depKeys === undefined) {
+ return;
+ }
+
+ for (var idx = 0; idx < depKeys.length; idx++) {
+ var depKey = depKeys[idx];
+ // Decrement the number of times depKey depends on keyName.
+ meta.writeDeps(depKey, keyName, (meta.peekDeps(depKey, keyName) || 0) - 1);
+ // Unwatch the depKey
+ unwatch(obj, depKey, meta);
+ }
+ }
+
+ /**
+ @module @ember/object
+ */
+
+ var DEEP_EACH_REGEX = /\.@each\.[^.]+\./;
+
+ /**
+ A computed property transforms an object literal with object's accessor function(s) into a property.
+
+ By default the function backing the computed property will only be called
+ once and the result will be cached. You can specify various properties
+ that your computed property depends on. This will force the cached
+ result to be recomputed if the dependencies are modified.
+
+ In the following example we declare a computed property - `fullName` - by calling
+ `computed` with property dependencies (`firstName` and `lastName`) as leading arguments and getter accessor function. The `fullName` getter function
+ will be called once (regardless of how many times it is accessed) as long
+ as its dependencies have not changed. Once `firstName` or `lastName` are updated
+ any future calls (or anything bound) to `fullName` will incorporate the new
+ values.
+
+ ```javascript
+ import EmberObject, { computed } from '@ember/object';
+
+ let Person = EmberObject.extend({
+ // these will be supplied by `create`
+ firstName: null,
+ lastName: null,
+
+ fullName: computed('firstName', 'lastName', function() {
+ let firstName = this.get('firstName'),
+ lastName = this.get('lastName');
+
+ return `${firstName} ${lastName}`;
+ })
+ });
+
+ let tom = Person.create({
+ firstName: 'Tom',
+ lastName: 'Dale'
+ });
+
+ tom.get('fullName') // 'Tom Dale'
+ ```
+
+ You can also define what Ember should do when setting a computed property by providing additional function (`set`) in hash argument.
+ If you try to set a computed property, it will try to invoke setter accessor function with the key and
+ value you want to set it to as arguments.
+
+ ```javascript
+ import EmberObject, { computed } from '@ember/object';
+
+ let Person = EmberObject.extend({
+ // these will be supplied by `create`
+ firstName: null,
+ lastName: null,
+
+ fullName: computed('firstName', 'lastName', {
+ get(key) {
+ let firstName = this.get('firstName'),
+ lastName = this.get('lastName');
+
+ return firstName + ' ' + lastName;
+ },
+ set(key, value) {
+ let [firstName, lastName] = value.split(' ');
+
+ this.set('firstName', firstName);
+ this.set('lastName', lastName);
+
+ return value;
+ }
+ })
+ });
+
+ let person = Person.create();
+
+ person.set('fullName', 'Peter Wagenet');
+ person.get('firstName'); // 'Peter'
+ person.get('lastName'); // 'Wagenet'
+ ```
+
+ You can overwrite computed property with normal property (no longer computed), that won't change if dependencies change, if you set computed property and it won't have setter accessor function defined.
+
+ You can also mark computed property as `.readOnly()` and block all attempts to set it.
+
+ ```javascript
+ import EmberObject, { computed } from '@ember/object';
+
+ let Person = EmberObject.extend({
+ // these will be supplied by `create`
+ firstName: null,
+ lastName: null,
+
+ fullName: computed('firstName', 'lastName', {
+ get(key) {
+ let firstName = this.get('firstName');
+ let lastName = this.get('lastName');
+
+ return firstName + ' ' + lastName;
+ }
+ }).readOnly()
+ });
+
+ let person = Person.create();
+ person.set('fullName', 'Peter Wagenet'); // Uncaught Error: Cannot set read-only property "fullName" on object: <(...):emberXXX>
+ ```
+
+ Additional resources:
+ - [New CP syntax RFC](https://github.com/emberjs/rfcs/blob/master/text/0011-improved-cp-syntax.md)
+ - [New computed syntax explained in "Ember 1.12 released" ](https://emberjs.com/blog/2015/05/13/ember-1-12-released.html#toc_new-computed-syntax)
+
+ @class ComputedProperty
+ @public
+ */
+ function ComputedProperty(config, opts) {
+ this.isDescriptor = true;
+ var hasGetterOnly = typeof config === 'function';
+ if (hasGetterOnly) {
+ this._getter = config;
+ } else {
+ true && !(typeof config === 'object' && !Array.isArray(config)) && emberDebug.assert('computed expects a function or an object as last argument.', typeof config === 'object' && !Array.isArray(config));
+ true && !Object.keys(config).every(function (key) {
+ return key === 'get' || key === 'set';
+ }) && emberDebug.assert('Config object passed to computed can only contain `get` or `set` keys.', Object.keys(config).every(function (key) {
+ return key === 'get' || key === 'set';
+ }));
+
+ this._getter = config.get;
+ this._setter = config.set;
+ }
+ true && !(!!this._getter || !!this._setter) && emberDebug.assert('Computed properties must receive a getter or a setter, you passed none.', !!this._getter || !!this._setter);
+
+ this._suspended = undefined;
+ this._meta = undefined;
+ this._volatile = false;
+
+ this._dependentKeys = opts && opts.dependentKeys;
+ this._readOnly = opts && hasGetterOnly && opts.readOnly === true;
+ }
+
+ ComputedProperty.prototype = new Descriptor();
+ ComputedProperty.prototype.constructor = ComputedProperty;
+
+ var ComputedPropertyPrototype = ComputedProperty.prototype;
+
+ /**
+ Call on a computed property to set it into non-cached mode. When in this
+ mode the computed property will not automatically cache the return value.
+
+ It also does not automatically fire any change events. You must manually notify
+ any changes if you want to observe this property.
+
+ Dependency keys have no effect on volatile properties as they are for cache
+ invalidation and notification when cached value is invalidated.
+
+ ```javascript
+ import EmberObject, { computed } from '@ember/object';
+
+ let outsideService = EmberObject.extend({
+ value: computed(function() {
+ return OutsideService.getValue();
+ }).volatile()
+ }).create();
+ ```
+
+ @method volatile
+ @return {ComputedProperty} this
+ @chainable
+ @public
+ */
+ ComputedPropertyPrototype.volatile = function () {
+ this._volatile = true;
+ return this;
+ };
+
+ /**
+ Call on a computed property to set it into read-only mode. When in this
+ mode the computed property will throw an error when set.
+
+ ```javascript
+ import EmberObject, { computed } from '@ember/object';
+
+ let Person = EmberObject.extend({
+ guid: computed(function() {
+ return 'guid-guid-guid';
+ }).readOnly()
+ });
+
+ let person = Person.create();
+
+ person.set('guid', 'new-guid'); // will throw an exception
+ ```
+
+ @method readOnly
+ @return {ComputedProperty} this
+ @chainable
+ @public
+ */
+ ComputedPropertyPrototype.readOnly = function () {
+ this._readOnly = true;
+ true && !!(this._readOnly && this._setter && this._setter !== this._getter) && emberDebug.assert('Computed properties that define a setter using the new syntax cannot be read-only', !(this._readOnly && this._setter && this._setter !== this._getter));
+
+ return this;
+ };
+
+ /**
+ Sets the dependent keys on this computed property. Pass any number of
+ arguments containing key paths that this computed property depends on.
+
+ ```javascript
+ import EmberObject, { computed } from '@ember/object';
+
+ let President = EmberObject.extend({
+ fullName: computed('firstName', 'lastName', function() {
+ return this.get('firstName') + ' ' + this.get('lastName');
+
+ // Tell Ember that this computed property depends on firstName
+ // and lastName
+ })
+ });
+
+ let president = President.create({
+ firstName: 'Barack',
+ lastName: 'Obama'
+ });
+
+ president.get('fullName'); // 'Barack Obama'
+ ```
+
+ @method property
+ @param {String} path* zero or more property paths
+ @return {ComputedProperty} this
+ @chainable
+ @public
+ */
+ ComputedPropertyPrototype.property = function () {
+ var args = [];
+
+ function addArg(property) {
+ true && emberDebug.warn('Dependent keys containing @each only work one level deep. ' + ('You used the key "' + property + '" which is invalid. ') + 'Please create an intermediary computed property.', DEEP_EACH_REGEX.test(property) === false, { id: 'ember-metal.computed-deep-each' });
+
+ args.push(property);
+ }
+
+ for (var i = 0; i < arguments.length; i++) {
+ expandProperties(arguments[i], addArg);
+ }
+
+ this._dependentKeys = args;
+ return this;
+ };
+
+ /**
+ In some cases, you may want to annotate computed properties with additional
+ metadata about how they function or what values they operate on. For example,
+ computed property functions may close over variables that are then no longer
+ available for introspection.
+
+ You can pass a hash of these values to a computed property like this:
+
+ ```
+ import { computed } from '@ember/object';
+ import Person from 'my-app/utils/person';
+
+ person: computed(function() {
+ let personId = this.get('personId');
+ return Person.create({ id: personId });
+ }).meta({ type: Person })
+ ```
+
+ The hash that you pass to the `meta()` function will be saved on the
+ computed property descriptor under the `_meta` key. Ember runtime
+ exposes a public API for retrieving these values from classes,
+ via the `metaForProperty()` function.
+
+ @method meta
+ @param {Object} meta
+ @chainable
+ @public
+ */
+ ComputedPropertyPrototype.meta = function (meta$$1) {
+ if (arguments.length === 0) {
+ return this._meta || {};
+ } else {
+ this._meta = meta$$1;
+ return this;
+ }
+ };
+
+ // invalidate cache when CP key changes
+ ComputedPropertyPrototype.didChange = function (obj, keyName) {
+ // _suspended is set via a CP.set to ensure we don't clear
+ // the cached value set by the setter
+ if (this._volatile || this._suspended === obj) {
+ return;
+ }
+
+ // don't create objects just to invalidate
+ var meta$$1 = peekMeta(obj);
+ if (meta$$1 === undefined || meta$$1.source !== obj) {
+ return;
+ }
+
+ var cache = meta$$1.readableCache();
+ if (cache !== undefined && cache[keyName] !== undefined) {
+ cache[keyName] = undefined;
+ removeDependentKeys(this, obj, keyName, meta$$1);
+ }
+ };
+
+ ComputedPropertyPrototype.get = function (obj, keyName) {
+ if (this._volatile) {
+ return this._getter.call(obj, keyName);
+ }
+
+ var meta$$1 = meta(obj);
+ var cache = meta$$1.writableCache();
+
+ var result = cache[keyName];
+ if (result === UNDEFINED) {
+ return undefined;
+ } else if (result !== undefined) {
+ return result;
+ }
+
+ var ret = this._getter.call(obj, keyName);
+
+ cache[keyName] = ret === undefined ? UNDEFINED : ret;
+
+ var chainWatchers = meta$$1.readableChainWatchers();
+ if (chainWatchers !== undefined) {
+ chainWatchers.revalidate(keyName);
+ }
+ addDependentKeys(this, obj, keyName, meta$$1);
+
+ return ret;
+ };
+
+ ComputedPropertyPrototype.set = function computedPropertySetEntry(obj, keyName, value) {
+ if (this._readOnly) {
+ this._throwReadOnlyError(obj, keyName);
+ }
+
+ if (!this._setter) {
+ return this.clobberSet(obj, keyName, value);
+ }
+
+ if (this._volatile) {
+ return this.volatileSet(obj, keyName, value);
+ }
+
+ return this.setWithSuspend(obj, keyName, value);
+ };
+
+ ComputedPropertyPrototype._throwReadOnlyError = function computedPropertyThrowReadOnlyError(obj, keyName) {
+ throw new emberDebug.Error('Cannot set read-only property "' + keyName + '" on object: ' + emberUtils.inspect(obj));
+ };
+
+ ComputedPropertyPrototype.clobberSet = function computedPropertyClobberSet(obj, keyName, value) {
+ var cachedValue = cacheFor(obj, keyName);
+ defineProperty(obj, keyName, null, cachedValue);
+ set(obj, keyName, value);
+ return value;
+ };
+
+ ComputedPropertyPrototype.volatileSet = function computedPropertyVolatileSet(obj, keyName, value) {
+ return this._setter.call(obj, keyName, value);
+ };
+
+ ComputedPropertyPrototype.setWithSuspend = function computedPropertySetWithSuspend(obj, keyName, value) {
+ var oldSuspended = this._suspended;
+ this._suspended = obj;
+ try {
+ return this._set(obj, keyName, value);
+ } finally {
+ this._suspended = oldSuspended;
+ }
+ };
+
+ ComputedPropertyPrototype._set = function computedPropertySet(obj, keyName, value) {
+ var meta$$1 = meta(obj);
+ var cache = meta$$1.writableCache();
+
+ var val = cache[keyName];
+ var hadCachedValue = val !== undefined;
+
+ var cachedValue = void 0;
+ if (hadCachedValue && val !== UNDEFINED) {
+ cachedValue = val;
+ }
+
+ var ret = this._setter.call(obj, keyName, value, cachedValue);
+
+ // allows setter to return the same value that is cached already
+ if (hadCachedValue && cachedValue === ret) {
+ return ret;
+ }
+
+ propertyWillChange(obj, keyName, meta$$1);
+
+ if (!hadCachedValue) {
+ addDependentKeys(this, obj, keyName, meta$$1);
+ }
+
+ cache[keyName] = ret === undefined ? UNDEFINED : ret;
+
+ propertyDidChange(obj, keyName, meta$$1);
+
+ return ret;
+ };
+
+ /* called before property is overridden */
+ ComputedPropertyPrototype.teardown = function (obj, keyName, meta$$1) {
+ if (this._volatile) {
+ return;
+ }
+ var cache = meta$$1.readableCache();
+ if (cache !== undefined && cache[keyName] !== undefined) {
+ removeDependentKeys(this, obj, keyName, meta$$1);
+ cache[keyName] = undefined;
+ }
+ };
+
+ /**
+ This helper returns a new property descriptor that wraps the passed
+ computed property function. You can use this helper to define properties
+ with mixins or via `defineProperty()`.
+
+ If you pass a function as an argument, it will be used as a getter. A computed
+ property defined in this way might look like this:
+
+ ```js
+ import EmberObject, { computed } from '@ember/object';
+
+ let Person = EmberObject.extend({
+ init() {
+ this._super(...arguments);
+
+ this.firstName = 'Betty';
+ this.lastName = 'Jones';
+ },
+
+ fullName: computed('firstName', 'lastName', function() {
+ return `${this.get('firstName')} ${this.get('lastName')}`;
+ })
+ });
+
+ let client = Person.create();
+
+ client.get('fullName'); // 'Betty Jones'
+
+ client.set('lastName', 'Fuller');
+ client.get('fullName'); // 'Betty Fuller'
+ ```
+
+ You can pass a hash with two functions, `get` and `set`, as an
+ argument to provide both a getter and setter:
+
+ ```js
+ import EmberObject, { computed } from '@ember/object';
+
+ let Person = EmberObject.extend({
+ init() {
+ this._super(...arguments);
+
+ this.firstName = 'Betty';
+ this.lastName = 'Jones';
+ },
+
+ fullName: computed('firstName', 'lastName', {
+ get(key) {
+ return `${this.get('firstName')} ${this.get('lastName')}`;
+ },
+ set(key, value) {
+ let [firstName, lastName] = value.split(/\s+/);
+ this.setProperties({ firstName, lastName });
+ return value;
+ }
+ })
+ });
+
+ let client = Person.create();
+ client.get('firstName'); // 'Betty'
+
+ client.set('fullName', 'Carroll Fuller');
+ client.get('firstName'); // 'Carroll'
+ ```
+
+ The `set` function should accept two parameters, `key` and `value`. The value
+ returned from `set` will be the new value of the property.
+
+ _Note: This is the preferred way to define computed properties when writing third-party
+ libraries that depend on or use Ember, since there is no guarantee that the user
+ will have [prototype Extensions](https://emberjs.com/guides/configuring-ember/disabling-prototype-extensions/) enabled._
+
+ The alternative syntax, with prototype extensions, might look like:
+
+ ```js
+ fullName: function() {
+ return this.get('firstName') + ' ' + this.get('lastName');
+ }.property('firstName', 'lastName')
+ ```
+
+ @method computed
+ @for @ember/object
+ @static
+ @param {String} [dependentKeys*] Optional dependent keys that trigger this computed property.
+ @param {Function} func The computed property function.
+ @return {ComputedProperty} property descriptor instance
+ @public
+ */
+ function computed() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ var func = args.pop();
+
+ var cp = new ComputedProperty(func);
+
+ if (args.length > 0) {
+ cp.property.apply(cp, args);
+ }
+
+ return cp;
+ }
+
+ /**
+ Returns the cached value for a property, if one exists.
+ This can be useful for peeking at the value of a computed
+ property that is generated lazily, without accidentally causing
+ it to be created.
+
+ @method cacheFor
+ @static
+ @for @ember/object/internals
+ @param {Object} obj the object whose property you want to check
+ @param {String} key the name of the property whose cached value you want
+ to return
+ @return {Object} the cached value
+ @public
+ */
+ function cacheFor(obj, key) {
+ var meta$$1 = peekMeta(obj);
+ var cache = meta$$1 !== undefined ? meta$$1.source === obj && meta$$1.readableCache() : undefined;
+ var ret = cache !== undefined ? cache[key] : undefined;
+
+ if (ret === UNDEFINED) {
+ return undefined;
+ }
+ return ret;
+ }
+
+ cacheFor.set = function (cache, key, value) {
+ if (value === undefined) {
+ cache[key] = UNDEFINED;
+ } else {
+ cache[key] = value;
+ }
+ };
+
+ cacheFor.get = function (cache, key) {
+ var ret = cache[key];
+ if (ret === UNDEFINED) {
+ return undefined;
+ }
+ return ret;
+ };
+
+ cacheFor.remove = function (cache, key) {
+ cache[key] = undefined;
+ };
+
+ var CONSUMED = {};
+
+ function alias(altKey) {
+ return new AliasedProperty(altKey);
+ }
+
+ var AliasedProperty = function (_Descriptor) {
+ emberBabel.inherits(AliasedProperty, _Descriptor);
+
+ function AliasedProperty(altKey) {
+ emberBabel.classCallCheck(this, AliasedProperty);
+
+ var _this = emberBabel.possibleConstructorReturn(this, _Descriptor.call(this));
+
+ _this.isDescriptor = true;
+ _this.altKey = altKey;
+ _this._dependentKeys = [altKey];
+ return _this;
+ }
+
+ AliasedProperty.prototype.setup = function setup(obj, keyName) {
+ true && !(this.altKey !== keyName) && emberDebug.assert('Setting alias \'' + keyName + '\' on self', this.altKey !== keyName);
+
+ var meta$$1 = meta(obj);
+ if (meta$$1.peekWatching(keyName)) {
+ addDependentKeys(this, obj, keyName, meta$$1);
+ }
+ };
+
+ AliasedProperty.prototype.teardown = function teardown(obj, keyName, meta$$1) {
+ if (meta$$1.peekWatching(keyName)) {
+ removeDependentKeys(this, obj, keyName, meta$$1);
+ }
+ };
+
+ AliasedProperty.prototype.willWatch = function willWatch(obj, keyName, meta$$1) {
+ addDependentKeys(this, obj, keyName, meta$$1);
+ };
+
+ AliasedProperty.prototype.didUnwatch = function didUnwatch(obj, keyName, meta$$1) {
+ removeDependentKeys(this, obj, keyName, meta$$1);
+ };
+
+ AliasedProperty.prototype.get = function get$$1(obj, keyName) {
+ var ret = get(obj, this.altKey);
+ var meta$$1 = meta(obj);
+ var cache = meta$$1.writableCache();
+ if (cache[keyName] !== CONSUMED) {
+ cache[keyName] = CONSUMED;
+ addDependentKeys(this, obj, keyName, meta$$1);
+ }
+ return ret;
+ };
+
+ AliasedProperty.prototype.set = function set$$1(obj, keyName, value) {
+ return set(obj, this.altKey, value);
+ };
+
+ AliasedProperty.prototype.readOnly = function readOnly() {
+ this.set = AliasedProperty_readOnlySet;
+ return this;
+ };
+
+ AliasedProperty.prototype.oneWay = function oneWay() {
+ this.set = AliasedProperty_oneWaySet;
+ return this;
+ };
+
+ return AliasedProperty;
+ }(Descriptor);
+
+ function AliasedProperty_readOnlySet(obj, keyName, value) {
+ // eslint-disable-line no-unused-vars
+ throw new emberDebug.Error('Cannot set read-only property \'' + keyName + '\' on object: ' + emberUtils.inspect(obj));
+ }
+
+ function AliasedProperty_oneWaySet(obj, keyName, value) {
+ defineProperty(obj, keyName, null);
+ return set(obj, keyName, value);
+ }
+
+ // Backwards compatibility with Ember Data.
+ AliasedProperty.prototype._meta = undefined;
+ AliasedProperty.prototype.meta = ComputedProperty.prototype.meta;
+
+ /**
+ @module @ember/polyfills
+ */
+ /**
+ Merge the contents of two objects together into the first object.
+
+ ```javascript
+ import { merge } from '@ember/polyfills';
+
+ merge({ first: 'Tom' }, { last: 'Dale' }); // { first: 'Tom', last: 'Dale' }
+ var a = { first: 'Yehuda' };
+ var b = { last: 'Katz' };
+ merge(a, b); // a == { first: 'Yehuda', last: 'Katz' }, b == { last: 'Katz' }
+ ```
+
+ @method merge
+ @static
+ @for @ember/polyfills
+ @param {Object} original The object to merge into
+ @param {Object} updates The object to copy properties from
+ @return {Object}
+ @public
+ */
+ function merge(original, updates) {
+ if (updates === null || typeof updates !== 'object') {
+ return original;
+ }
+
+ var props = Object.keys(updates);
+ var prop = void 0;
+
+ for (var i = 0; i < props.length; i++) {
+ prop = props[i];
+ original[prop] = updates[prop];
+ }
+
+ return original;
+ }
+
+ /**
+ @module ember
+ */
+
+ /**
+ Used internally to allow changing properties in a backwards compatible way, and print a helpful
+ deprecation warning.
+
+ @method deprecateProperty
+ @param {Object} object The object to add the deprecated property to.
+ @param {String} deprecatedKey The property to add (and print deprecation warnings upon accessing).
+ @param {String} newKey The property that will be aliased.
+ @private
+ @since 1.7.0
+ */
+
+ function deprecateProperty(object, deprecatedKey, newKey, options) {
+ function _deprecate() {
+ true && !false && emberDebug.deprecate('Usage of `' + deprecatedKey + '` is deprecated, use `' + newKey + '` instead.', false, options);
+ }
+
+ Object.defineProperty(object, deprecatedKey, {
+ configurable: true,
+ enumerable: false,
+ set: function (value) {
+ _deprecate();
+ set(this, newKey, value);
+ },
+ get: function () {
+ _deprecate();
+ return get(this, newKey);
+ }
+ });
+ }
+
+ /* eslint no-console:off */
+ /* global console */
+
+ /**
+ @module @ember/instrumentation
+ @private
+ */
+
+ /**
+ The purpose of the Ember Instrumentation module is
+ to provide efficient, general-purpose instrumentation
+ for Ember.
+
+ Subscribe to a listener by using `subscribe`:
+
+ ```javascript
+ import { subscribe } from '@ember/instrumentation';
+
+ subscribe("render", {
+ before(name, timestamp, payload) {
+
+ },
+
+ after(name, timestamp, payload) {
+
+ }
+ });
+ ```
+
+ If you return a value from the `before` callback, that same
+ value will be passed as a fourth parameter to the `after`
+ callback.
+
+ Instrument a block of code by using `instrument`:
+
+ ```javascript
+ import { instrument } from '@ember/instrumentation';
+
+ instrument("render.handlebars", payload, function() {
+ // rendering logic
+ }, binding);
+ ```
+
+ Event names passed to `instrument` are namespaced
+ by periods, from more general to more specific. Subscribers
+ can listen for events by whatever level of granularity they
+ are interested in.
+
+ In the above example, the event is `render.handlebars`,
+ and the subscriber listened for all events beginning with
+ `render`. It would receive callbacks for events named
+ `render`, `render.handlebars`, `render.container`, or
+ even `render.handlebars.layout`.
+
+ @class Instrumentation
+ @static
+ @private
+ */
+ var subscribers = [];
+ var cache = {};
+
+ function populateListeners(name) {
+ var listeners = [];
+ var subscriber = void 0;
+
+ for (var i = 0; i < subscribers.length; i++) {
+ subscriber = subscribers[i];
+ if (subscriber.regex.test(name)) {
+ listeners.push(subscriber.object);
+ }
+ }
+
+ cache[name] = listeners;
+ return listeners;
+ }
+
+ var time = function () {
+ var perf = 'undefined' !== typeof window ? window.performance || {} : {};
+ var fn = perf.now || perf.mozNow || perf.webkitNow || perf.msNow || perf.oNow;
+ // fn.bind will be available in all the browsers that support the advanced window.performance... ;-)
+ return fn ? fn.bind(perf) : function () {
+ return +new Date();
+ };
+ }();
+
+ /**
+ Notifies event's subscribers, calls `before` and `after` hooks.
+
+ @method instrument
+ @for @ember/instrumentation
+ @static
+ @param {String} [name] Namespaced event name.
+ @param {Object} _payload
+ @param {Function} callback Function that you're instrumenting.
+ @param {Object} binding Context that instrument function is called with.
+ @private
+ */
+ function instrument(name, _payload, callback, binding) {
+ if (arguments.length <= 3 && typeof _payload === 'function') {
+ binding = callback;
+ callback = _payload;
+ _payload = undefined;
+ }
+ if (subscribers.length === 0) {
+ return callback.call(binding);
+ }
+ var payload = _payload || {};
+ var finalizer = _instrumentStart(name, function () {
+ return payload;
+ });
+
+ if (finalizer) {
+ return withFinalizer(callback, finalizer, payload, binding);
+ } else {
+ return callback.call(binding);
+ }
+ }
+
+ exports.flaggedInstrument = void 0;
+ if (features.EMBER_IMPROVED_INSTRUMENTATION) {
+ exports.flaggedInstrument = instrument;
+ } else {
+ exports.flaggedInstrument = function (name, payload, callback) {
+ return callback();
+ };
+ }
+ function withFinalizer(callback, finalizer, payload, binding) {
+ var result = void 0;
+ try {
+ result = callback.call(binding);
+ } catch (e) {
+ payload.exception = e;
+ result = payload;
+ } finally {
+ finalizer();
+ }
+ return result;
+ }
+
+ function NOOP() {}
+
+ // private for now
+ function _instrumentStart(name, _payload, _payloadParam) {
+ if (subscribers.length === 0) {
+ return NOOP;
+ }
+
+ var listeners = cache[name];
+
+ if (!listeners) {
+ listeners = populateListeners(name);
+ }
+
+ if (listeners.length === 0) {
+ return NOOP;
+ }
+
+ var payload = _payload(_payloadParam);
+
+ var STRUCTURED_PROFILE = emberEnvironment.ENV.STRUCTURED_PROFILE;
+ var timeName = void 0;
+ if (STRUCTURED_PROFILE) {
+ timeName = name + ': ' + payload.object;
+ console.time(timeName);
+ }
+
+ var beforeValues = new Array(listeners.length);
+ var i = void 0,
+ listener = void 0;
+ var timestamp = time();
+ for (i = 0; i < listeners.length; i++) {
+ listener = listeners[i];
+ beforeValues[i] = listener.before(name, timestamp, payload);
+ }
+
+ return function _instrumentEnd() {
+ var i = void 0,
+ listener = void 0;
+ var timestamp = time();
+ for (i = 0; i < listeners.length; i++) {
+ listener = listeners[i];
+ if (typeof listener.after === 'function') {
+ listener.after(name, timestamp, payload, beforeValues[i]);
+ }
+ }
+
+ if (STRUCTURED_PROFILE) {
+ console.timeEnd(timeName);
+ }
+ };
+ }
+
+ /**
+ Subscribes to a particular event or instrumented block of code.
+
+ @method subscribe
+ @for @ember/instrumentation
+ @static
+
+ @param {String} [pattern] Namespaced event name.
+ @param {Object} [object] Before and After hooks.
+
+ @return {Subscriber}
+ @private
+ */
+ function subscribe(pattern, object) {
+ var paths = pattern.split('.');
+ var path = void 0;
+ var regex = [];
+
+ for (var i = 0; i < paths.length; i++) {
+ path = paths[i];
+ if (path === '*') {
+ regex.push('[^\\.]*');
+ } else {
+ regex.push(path);
+ }
+ }
+
+ regex = regex.join('\\.');
+ regex = regex + '(\\..*)?';
+
+ var subscriber = {
+ pattern: pattern,
+ regex: new RegExp('^' + regex + '$'),
+ object: object
+ };
+
+ subscribers.push(subscriber);
+ cache = {};
+
+ return subscriber;
+ }
+
+ /**
+ Unsubscribes from a particular event or instrumented block of code.
+
+ @method unsubscribe
+ @for @ember/instrumentation
+ @static
+
+ @param {Object} [subscriber]
+ @private
+ */
+ function unsubscribe(subscriber) {
+ var index = void 0;
+
+ for (var i = 0; i < subscribers.length; i++) {
+ if (subscribers[i] === subscriber) {
+ index = i;
+ }
+ }
+
+ subscribers.splice(index, 1);
+ cache = {};
+ }
+
+ /**
+ Resets `Instrumentation` by flushing list of subscribers.
+
+ @method reset
+ @for @ember/instrumentation
+ @static
+ @private
+ */
+ function reset() {
+ subscribers.length = 0;
+ cache = {};
+ }
+
+ var onerror = void 0;
+ var onErrorTarget = {
+ get onerror() {
+ return onerror;
+ }
+ };
+
+ // Ember.onerror getter
+ function getOnerror() {
+ return onerror;
+ }
+ // Ember.onerror setter
+ function setOnerror(handler) {
+ onerror = handler;
+ }
+
+ var dispatchOverride = void 0;
+
+ // allows testing adapter to override dispatch
+ function getDispatchOverride() {
+ return dispatchOverride;
+ }
+ function setDispatchOverride(handler) {
+ dispatchOverride = handler;
+ }
+
+ /**
+ @module @ember/utils
+ */
+ /**
+ Returns true if the passed value is null or undefined. This avoids errors
+ from JSLint complaining about use of ==, which can be technically
+ confusing.
+
+ ```javascript
+ isNone(); // true
+ isNone(null); // true
+ isNone(undefined); // true
+ isNone(''); // false
+ isNone([]); // false
+ isNone(function() {}); // false
+ ```
+
+ @method isNone
+ @static
+ @for @ember/utils
+ @param {Object} obj Value to test
+ @return {Boolean}
+ @public
+ */
+ function isNone(obj) {
+ return obj === null || obj === undefined;
+ }
+
+ /**
+ @module @ember/utils
+ */
+ /**
+ Verifies that a value is `null` or `undefined`, an empty string, or an empty
+ array.
+
+ Constrains the rules on `isNone` by returning true for empty strings and
+ empty arrays.
+
+ If the value is an object with a `size` property of type number, it is used
+ to check emptiness.
+
+ ```javascript
+ isEmpty(); // true
+ isEmpty(null); // true
+ isEmpty(undefined); // true
+ isEmpty(''); // true
+ isEmpty([]); // true
+ isEmpty({ size: 0}); // true
+ isEmpty({}); // false
+ isEmpty('Adam Hawkins'); // false
+ isEmpty([0,1,2]); // false
+ isEmpty('\n\t'); // false
+ isEmpty(' '); // false
+ isEmpty({ size: 1 }) // false
+ isEmpty({ size: () => 0 }) // false
+ ```
+
+ @method isEmpty
+ @static
+ @for @ember/utils
+ @param {Object} obj Value to test
+ @return {Boolean}
+ @public
+ */
+ function isEmpty(obj) {
+ var none = isNone(obj);
+ if (none) {
+ return none;
+ }
+
+ if (typeof obj.size === 'number') {
+ return !obj.size;
+ }
+
+ var objectType = typeof obj;
+
+ if (objectType === 'object') {
+ var size = get(obj, 'size');
+ if (typeof size === 'number') {
+ return !size;
+ }
+ }
+
+ if (typeof obj.length === 'number' && objectType !== 'function') {
+ return !obj.length;
+ }
+
+ if (objectType === 'object') {
+ var length = get(obj, 'length');
+ if (typeof length === 'number') {
+ return !length;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ @module @ember/utils
+ */
+ /**
+ A value is blank if it is empty or a whitespace string.
+
+ ```javascript
+ import { isBlank } from '@ember/utils';
+
+ isBlank(); // true
+ isBlank(null); // true
+ isBlank(undefined); // true
+ isBlank(''); // true
+ isBlank([]); // true
+ isBlank('\n\t'); // true
+ isBlank(' '); // true
+ isBlank({}); // false
+ isBlank('\n\t Hello'); // false
+ isBlank('Hello world'); // false
+ isBlank([1,2,3]); // false
+ ```
+
+ @method isBlank
+ @static
+ @for @ember/utils
+ @param {Object} obj Value to test
+ @return {Boolean}
+ @since 1.5.0
+ @public
+ */
+ function isBlank(obj) {
+ return isEmpty(obj) || typeof obj === 'string' && /\S/.test(obj) === false;
+ }
+
+ /**
+ @module @ember/utils
+ */
+ /**
+ A value is present if it not `isBlank`.
+
+ ```javascript
+ isPresent(); // false
+ isPresent(null); // false
+ isPresent(undefined); // false
+ isPresent(''); // false
+ isPresent(' '); // false
+ isPresent('\n\t'); // false
+ isPresent([]); // false
+ isPresent({ length: 0 }) // false
+ isPresent(false); // true
+ isPresent(true); // true
+ isPresent('string'); // true
+ isPresent(0); // true
+ isPresent(function() {}) // true
+ isPresent({}); // true
+ isPresent(false); // true
+ isPresent('\n\t Hello'); // true
+ isPresent([1,2,3]); // true
+ ```
+
+ @method isPresent
+ @static
+ @for @ember/utils
+ @param {Object} obj Value to test
+ @return {Boolean}
+ @since 1.8.0
+ @public
+ */
+ function isPresent(obj) {
+ return !isBlank(obj);
+ }
+
+ function onBegin(current) {
+ run.currentRunLoop = current;
+ }
+
+ function onEnd(current, next) {
+ run.currentRunLoop = next;
+ }
+
+ var backburner$1 = new Backburner(['sync', 'actions', 'destroy'], {
+ sync: {
+ before: beginPropertyChanges,
+ after: endPropertyChanges
+ },
+ defaultQueue: 'actions',
+ onBegin: onBegin,
+ onEnd: onEnd,
+ onErrorTarget: onErrorTarget,
+ onErrorMethod: 'onerror'
+ });
+
+ /**
+ @module @ember/runloop
+ */
+ // ..........................................................
+ // run - this is ideally the only public API the dev sees
+ //
+
+ /**
+ Runs the passed target and method inside of a RunLoop, ensuring any
+ deferred actions including bindings and views updates are flushed at the
+ end.
+
+ Normally you should not need to invoke this method yourself. However if
+ you are implementing raw event handlers when interfacing with other
+ libraries or plugins, you should probably wrap all of your code inside this
+ call.
+
+ ```javascript
+ import { run } from '@ember/runloop';
+
+ run(function() {
+ // code to be executed within a RunLoop
+ });
+ ```
+ @method run
+ @for @ember/runloop
+ @static
+ @param {Object} [target] target of method to call
+ @param {Function|String} method Method to invoke.
+ May be a function or a string. If you pass a string
+ then it will be looked up on the passed target.
+ @param {Object} [args*] Any additional arguments you wish to pass to the method.
+ @return {Object} return value from invoking the passed function.
+ @public
+ */
+ function run() {
+ return backburner$1.run.apply(backburner$1, arguments);
+ }
+
+ /**
+ If no run-loop is present, it creates a new one. If a run loop is
+ present it will queue itself to run on the existing run-loops action
+ queue.
+
+ Please note: This is not for normal usage, and should be used sparingly.
+
+ If invoked when not within a run loop:
+
+ ```javascript
+ import { join } from '@ember/runloop';
+
+ join(function() {
+ // creates a new run-loop
+ });
+ ```
+
+ Alternatively, if called within an existing run loop:
+
+ ```javascript
+ import { run, join } from '@ember/runloop';
+
+ run(function() {
+ // creates a new run-loop
+
+ join(function() {
+ // joins with the existing run-loop, and queues for invocation on
+ // the existing run-loops action queue.
+ });
+ });
+ ```
+
+ @method join
+ @static
+ @for @ember/runloop
+ @param {Object} [target] target of method to call
+ @param {Function|String} method Method to invoke.
+ May be a function or a string. If you pass a string
+ then it will be looked up on the passed target.
+ @param {Object} [args*] Any additional arguments you wish to pass to the method.
+ @return {Object} Return value from invoking the passed function. Please note,
+ when called within an existing loop, no return value is possible.
+ @public
+ */
+ run.join = function () {
+ return backburner$1.join.apply(backburner$1, arguments);
+ };
+
+ /**
+ Allows you to specify which context to call the specified function in while
+ adding the execution of that function to the Ember run loop. This ability
+ makes this method a great way to asynchronously integrate third-party libraries
+ into your Ember application.
+
+ `bind` takes two main arguments, the desired context and the function to
+ invoke in that context. Any additional arguments will be supplied as arguments
+ to the function that is passed in.
+
+ Let's use the creation of a TinyMCE component as an example. Currently,
+ TinyMCE provides a setup configuration option we can use to do some processing
+ after the TinyMCE instance is initialized but before it is actually rendered.
+ We can use that setup option to do some additional setup for our component.
+ The component itself could look something like the following:
+
+ ```app/components/rich-text-editor.js
+ import Component from '@ember/component';
+ import { on } from '@ember/object/evented';
+ import { bind } from '@ember/runloop';
+
+ export default Component.extend({
+ initializeTinyMCE: on('didInsertElement', function() {
+ tinymce.init({
+ selector: '#' + this.$().prop('id'),
+ setup: bind(this, this.setupEditor)
+ });
+ }),
+
+ didInsertElement() {
+ tinymce.init({
+ selector: '#' + this.$().prop('id'),
+ setup: bind(this, this.setupEditor)
+ });
+ }
+
+ setupEditor(editor) {
+ this.set('editor', editor);
+
+ editor.on('change', function() {
+ console.log('content changed!');
+ });
+ }
+ });
+ ```
+
+ In this example, we use `bind` to bind the setupEditor method to the
+ context of the RichTextEditor component and to have the invocation of that
+ method be safely handled and executed by the Ember run loop.
+
+ @method bind
+ @static
+ @for @ember/runloop
+ @param {Object} [target] target of method to call
+ @param {Function|String} method Method to invoke.
+ May be a function or a string. If you pass a string
+ then it will be looked up on the passed target.
+ @param {Object} [args*] Any additional arguments you wish to pass to the method.
+ @return {Function} returns a new function that will always have a particular context
+ @since 1.4.0
+ @public
+ */
+ run.bind = function () {
+ for (var _len = arguments.length, curried = Array(_len), _key = 0; _key < _len; _key++) {
+ curried[_key] = arguments[_key];
+ }
+
+ return function () {
+ for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+ args[_key2] = arguments[_key2];
+ }
+
+ return run.join.apply(run, curried.concat(args));
+ };
+ };
+
+ run.backburner = backburner$1;
+ run.currentRunLoop = null;
+ run.queues = backburner$1.queueNames;
+
+ /**
+ Begins a new RunLoop. Any deferred actions invoked after the begin will
+ be buffered until you invoke a matching call to `run.end()`. This is
+ a lower-level way to use a RunLoop instead of using `run()`.
+
+ ```javascript
+ import { begin, end } from '@ember/runloop';
+
+ begin();
+ // code to be executed within a RunLoop
+ end();
+ ```
+
+ @method begin
+ @static
+ @for @ember/runloop
+ @return {void}
+ @public
+ */
+ run.begin = function () {
+ backburner$1.begin();
+ };
+
+ /**
+ Ends a RunLoop. This must be called sometime after you call
+ `run.begin()` to flush any deferred actions. This is a lower-level way
+ to use a RunLoop instead of using `run()`.
+
+ ```javascript
+ import { begin, end } from '@ember/runloop';
+
+ begin();
+ // code to be executed within a RunLoop
+ end();
+ ```
+
+ @method end
+ @static
+ @for @ember/runloop
+ @return {void}
+ @public
+ */
+ run.end = function () {
+ backburner$1.end();
+ };
+
+ /**
+ Array of named queues. This array determines the order in which queues
+ are flushed at the end of the RunLoop. You can define your own queues by
+ simply adding the queue name to this array. Normally you should not need
+ to inspect or modify this property.
+
+ @property queues
+ @type Array
+ @default ['actions', 'destroy']
+ @private
+ */
+
+ /**
+ Adds the passed target/method and any optional arguments to the named
+ queue to be executed at the end of the RunLoop. If you have not already
+ started a RunLoop when calling this method one will be started for you
+ automatically.
+
+ At the end of a RunLoop, any methods scheduled in this way will be invoked.
+ Methods will be invoked in an order matching the named queues defined in
+ the `run.queues` property.
+
+ ```javascript
+ import { schedule } from '@ember/runloop';
+
+ schedule('actions', this, function() {
+ // this will be executed in the 'actions' queue, after bindings have synced.
+ console.log('scheduled on actions queue');
+ });
+
+ // Note the functions will be run in order based on the run queues order.
+ // Output would be:
+ // scheduled on sync queue
+ // scheduled on actions queue
+ ```
+
+ @method schedule
+ @static
+ @for @ember/runloop
+ @param {String} queue The name of the queue to schedule against. Default queues is 'actions'
+ @param {Object} [target] target object to use as the context when invoking a method.
+ @param {String|Function} method The method to invoke. If you pass a string it
+ will be resolved on the target object at the time the scheduled item is
+ invoked allowing you to change the target function.
+ @param {Object} [arguments*] Optional arguments to be passed to the queued method.
+ @return {*} Timer information for use in canceling, see `run.cancel`.
+ @public
+ */
+ run.schedule = function (queue /*, target, method */) {
+ true && !(run.currentRunLoop || !emberDebug.isTesting()) && emberDebug.assert('You have turned on testing mode, which disabled the run-loop\'s autorun. ' + 'You will need to wrap any code with asynchronous side-effects in a run', run.currentRunLoop || !emberDebug.isTesting());
+ true && !(queue !== 'sync') && emberDebug.deprecate('Scheduling into the \'' + queue + '\' run loop queue is deprecated.', queue !== 'sync', { id: 'ember-metal.run.sync', until: '3.5.0' });
+
+ return backburner$1.schedule.apply(backburner$1, arguments);
+ };
+
+ // Used by global test teardown
+ run.hasScheduledTimers = function () {
+ return backburner$1.hasTimers();
+ };
+
+ // Used by global test teardown
+ run.cancelTimers = function () {
+ backburner$1.cancelTimers();
+ };
+
+ /**
+ Invokes the passed target/method and optional arguments after a specified
+ period of time. The last parameter of this method must always be a number
+ of milliseconds.
+
+ You should use this method whenever you need to run some action after a
+ period of time instead of using `setTimeout()`. This method will ensure that
+ items that expire during the same script execution cycle all execute
+ together, which is often more efficient than using a real setTimeout.
+
+ ```javascript
+ import { later } from '@ember/runloop';
+
+ later(myContext, function() {
+ // code here will execute within a RunLoop in about 500ms with this == myContext
+ }, 500);
+ ```
+
+ @method later
+ @static
+ @for @ember/runloop
+ @param {Object} [target] target of method to invoke
+ @param {Function|String} method The method to invoke.
+ If you pass a string it will be resolved on the
+ target at the time the method is invoked.
+ @param {Object} [args*] Optional arguments to pass to the timeout.
+ @param {Number} wait Number of milliseconds to wait.
+ @return {*} Timer information for use in canceling, see `run.cancel`.
+ @public
+ */
+ run.later = function () /*target, method*/{
+ return backburner$1.later.apply(backburner$1, arguments);
+ };
+
+ /**
+ Schedule a function to run one time during the current RunLoop. This is equivalent
+ to calling `scheduleOnce` with the "actions" queue.
+
+ @method once
+ @static
+ @for @ember/runloop
+ @param {Object} [target] The target of the method to invoke.
+ @param {Function|String} method The method to invoke.
+ If you pass a string it will be resolved on the
+ target at the time the method is invoked.
+ @param {Object} [args*] Optional arguments to pass to the timeout.
+ @return {Object} Timer information for use in canceling, see `run.cancel`.
+ @public
+ */
+ run.once = function () {
+ true && !(run.currentRunLoop || !emberDebug.isTesting()) && emberDebug.assert('You have turned on testing mode, which disabled the run-loop\'s autorun. ' + 'You will need to wrap any code with asynchronous side-effects in a run', run.currentRunLoop || !emberDebug.isTesting());
+
+ for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
+ args[_key3] = arguments[_key3];
+ }
+
+ args.unshift('actions');
+ return backburner$1.scheduleOnce.apply(backburner$1, args);
+ };
+
+ /**
+ Schedules a function to run one time in a given queue of the current RunLoop.
+ Calling this method with the same queue/target/method combination will have
+ no effect (past the initial call).
+
+ Note that although you can pass optional arguments these will not be
+ considered when looking for duplicates. New arguments will replace previous
+ calls.
+
+ ```javascript
+ import { run, scheduleOnce } from '@ember/runloop';
+
+ function sayHi() {
+ console.log('hi');
+ }
+
+ run(function() {
+ scheduleOnce('afterRender', myContext, sayHi);
+ scheduleOnce('afterRender', myContext, sayHi);
+ // sayHi will only be executed once, in the afterRender queue of the RunLoop
+ });
+ ```
+
+ Also note that for `run.scheduleOnce` to prevent additional calls, you need to
+ pass the same function instance. The following case works as expected:
+
+ ```javascript
+ function log() {
+ console.log('Logging only once');
+ }
+
+ function scheduleIt() {
+ scheduleOnce('actions', myContext, log);
+ }
+
+ scheduleIt();
+ scheduleIt();
+ ```
+
+ But this other case will schedule the function multiple times:
+
+ ```javascript
+ import { scheduleOnce } from '@ember/runloop';
+
+ function scheduleIt() {
+ scheduleOnce('actions', myContext, function() {
+ console.log('Closure');
+ });
+ }
+
+ scheduleIt();
+ scheduleIt();
+
+ // "Closure" will print twice, even though we're using `run.scheduleOnce`,
+ // because the function we pass to it won't match the
+ // previously scheduled operation.
+ ```
+
+ Available queues, and their order, can be found at `run.queues`
+
+ @method scheduleOnce
+ @static
+ @for @ember/runloop
+ @param {String} [queue] The name of the queue to schedule against. Default queues is 'actions'.
+ @param {Object} [target] The target of the method to invoke.
+ @param {Function|String} method The method to invoke.
+ If you pass a string it will be resolved on the
+ target at the time the method is invoked.
+ @param {Object} [args*] Optional arguments to pass to the timeout.
+ @return {Object} Timer information for use in canceling, see `run.cancel`.
+ @public
+ */
+ run.scheduleOnce = function (queue /*, target, method*/) {
+ true && !(run.currentRunLoop || !emberDebug.isTesting()) && emberDebug.assert('You have turned on testing mode, which disabled the run-loop\'s autorun. ' + 'You will need to wrap any code with asynchronous side-effects in a run', run.currentRunLoop || !emberDebug.isTesting());
+ true && !(queue !== 'sync') && emberDebug.deprecate('Scheduling into the \'' + queue + '\' run loop queue is deprecated.', queue !== 'sync', { id: 'ember-metal.run.sync', until: '3.5.0' });
+
+ return backburner$1.scheduleOnce.apply(backburner$1, arguments);
+ };
+
+ /**
+ Schedules an item to run from within a separate run loop, after
+ control has been returned to the system. This is equivalent to calling
+ `run.later` with a wait time of 1ms.
+
+ ```javascript
+ import { next } from '@ember/runloop';
+
+ next(myContext, function() {
+ // code to be executed in the next run loop,
+ // which will be scheduled after the current one
+ });
+ ```
+
+ Multiple operations scheduled with `run.next` will coalesce
+ into the same later run loop, along with any other operations
+ scheduled by `run.later` that expire right around the same
+ time that `run.next` operations will fire.
+
+ Note that there are often alternatives to using `run.next`.
+ For instance, if you'd like to schedule an operation to happen
+ after all DOM element operations have completed within the current
+ run loop, you can make use of the `afterRender` run loop queue (added
+ by the `ember-views` package, along with the preceding `render` queue
+ where all the DOM element operations happen).
+
+ Example:
+
+ ```app/components/my-component.js
+ import Component from '@ember/component';
+ import { scheduleOnce } from '@ember/runloop';
+
+ export Component.extend({
+ didInsertElement() {
+ this._super(...arguments);
+ scheduleOnce('afterRender', this, 'processChildElements');
+ },
+
+ processChildElements() {
+ // ... do something with component's child component
+ // elements after they've finished rendering, which
+ // can't be done within this component's
+ // `didInsertElement` hook because that gets run
+ // before the child elements have been added to the DOM.
+ }
+ });
+ ```
+
+ One benefit of the above approach compared to using `run.next` is
+ that you will be able to perform DOM/CSS operations before unprocessed
+ elements are rendered to the screen, which may prevent flickering or
+ other artifacts caused by delaying processing until after rendering.
+
+ The other major benefit to the above approach is that `run.next`
+ introduces an element of non-determinism, which can make things much
+ harder to test, due to its reliance on `setTimeout`; it's much harder
+ to guarantee the order of scheduled operations when they are scheduled
+ outside of the current run loop, i.e. with `run.next`.
+
+ @method next
+ @static
+ @for @ember/runloop
+ @param {Object} [target] target of method to invoke
+ @param {Function|String} method The method to invoke.
+ If you pass a string it will be resolved on the
+ target at the time the method is invoked.
+ @param {Object} [args*] Optional arguments to pass to the timeout.
+ @return {Object} Timer information for use in canceling, see `run.cancel`.
+ @public
+ */
+ run.next = function () {
+ for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
+ args[_key4] = arguments[_key4];
+ }
+
+ args.push(1);
+ return backburner$1.later.apply(backburner$1, args);
+ };
+
+ /**
+ Cancels a scheduled item. Must be a value returned by `later()`,
+ `once()`, `scheduleOnce()`, `next()`, `debounce()`, or
+ `throttle()`.
+
+ ```javascript
+ import {
+ next,
+ cancel,
+ later,
+ scheduleOnce,
+ once,
+ throttle,
+ debounce
+ } from '@ember/runloop';
+
+ let runNext = next(myContext, function() {
+ // will not be executed
+ });
+
+ cancel(runNext);
+
+ let runLater = later(myContext, function() {
+ // will not be executed
+ }, 500);
+
+ cancel(runLater);
+
+ let runScheduleOnce = scheduleOnce('afterRender', myContext, function() {
+ // will not be executed
+ });
+
+ cancel(runScheduleOnce);
+
+ let runOnce = once(myContext, function() {
+ // will not be executed
+ });
+
+ cancel(runOnce);
+
+ let throttle = throttle(myContext, function() {
+ // will not be executed
+ }, 1, false);
+
+ cancel(throttle);
+
+ let debounce = debounce(myContext, function() {
+ // will not be executed
+ }, 1);
+
+ cancel(debounce);
+
+ let debounceImmediate = debounce(myContext, function() {
+ // will be executed since we passed in true (immediate)
+ }, 100, true);
+
+ // the 100ms delay until this method can be called again will be canceled
+ cancel(debounceImmediate);
+ ```
+
+ @method cancel
+ @static
+ @for @ember/runloop
+ @param {Object} timer Timer object to cancel
+ @return {Boolean} true if canceled or false/undefined if it wasn't found
+ @public
+ */
+ run.cancel = function (timer) {
+ return backburner$1.cancel(timer);
+ };
+
+ /**
+ Delay calling the target method until the debounce period has elapsed
+ with no additional debounce calls. If `debounce` is called again before
+ the specified time has elapsed, the timer is reset and the entire period
+ must pass again before the target method is called.
+
+ This method should be used when an event may be called multiple times
+ but the action should only be called once when the event is done firing.
+ A common example is for scroll events where you only want updates to
+ happen once scrolling has ceased.
+
+ ```javascript
+ import { debounce } from '@ember/runloop';
+
+ function whoRan() {
+ console.log(this.name + ' ran.');
+ }
+
+ let myContext = { name: 'debounce' };
+
+ debounce(myContext, whoRan, 150);
+
+ // less than 150ms passes
+ debounce(myContext, whoRan, 150);
+
+ // 150ms passes
+ // whoRan is invoked with context myContext
+ // console logs 'debounce ran.' one time.
+ ```
+
+ Immediate allows you to run the function immediately, but debounce
+ other calls for this function until the wait time has elapsed. If
+ `debounce` is called again before the specified time has elapsed,
+ the timer is reset and the entire period must pass again before
+ the method can be called again.
+
+ ```javascript
+ import { debounce } from '@ember/runloop';
+
+ function whoRan() {
+ console.log(this.name + ' ran.');
+ }
+
+ let myContext = { name: 'debounce' };
+
+ debounce(myContext, whoRan, 150, true);
+
+ // console logs 'debounce ran.' one time immediately.
+ // 100ms passes
+ debounce(myContext, whoRan, 150, true);
+
+ // 150ms passes and nothing else is logged to the console and
+ // the debouncee is no longer being watched
+ debounce(myContext, whoRan, 150, true);
+
+ // console logs 'debounce ran.' one time immediately.
+ // 150ms passes and nothing else is logged to the console and
+ // the debouncee is no longer being watched
+ ```
+
+ @method debounce
+ @static
+ @for @ember/runloop
+ @param {Object} [target] target of method to invoke
+ @param {Function|String} method The method to invoke.
+ May be a function or a string. If you pass a string
+ then it will be looked up on the passed target.
+ @param {Object} [args*] Optional arguments to pass to the timeout.
+ @param {Number} wait Number of milliseconds to wait.
+ @param {Boolean} immediate Trigger the function on the leading instead
+ of the trailing edge of the wait interval. Defaults to false.
+ @return {Array} Timer information for use in canceling, see `run.cancel`.
+ @public
+ */
+ run.debounce = function () {
+ return backburner$1.debounce.apply(backburner$1, arguments);
+ };
+
+ /**
+ Ensure that the target method is never called more frequently than
+ the specified spacing period. The target method is called immediately.
+
+ ```javascript
+ import { throttle } from '@ember/runloop';
+
+ function whoRan() {
+ console.log(this.name + ' ran.');
+ }
+
+ let myContext = { name: 'throttle' };
+
+ throttle(myContext, whoRan, 150);
+ // whoRan is invoked with context myContext
+ // console logs 'throttle ran.'
+
+ // 50ms passes
+ throttle(myContext, whoRan, 150);
+
+ // 50ms passes
+ throttle(myContext, whoRan, 150);
+
+ // 150ms passes
+ throttle(myContext, whoRan, 150);
+ // whoRan is invoked with context myContext
+ // console logs 'throttle ran.'
+ ```
+
+ @method throttle
+ @static
+ @for @ember/runloop
+ @param {Object} [target] target of method to invoke
+ @param {Function|String} method The method to invoke.
+ May be a function or a string. If you pass a string
+ then it will be looked up on the passed target.
+ @param {Object} [args*] Optional arguments to pass to the timeout.
+ @param {Number} spacing Number of milliseconds to space out requests.
+ @param {Boolean} immediate Trigger the function on the leading instead
+ of the trailing edge of the wait interval. Defaults to true.
+ @return {Array} Timer information for use in canceling, see `run.cancel`.
+ @public
+ */
+ run.throttle = function () {
+ return backburner$1.throttle.apply(backburner$1, arguments);
+ };
+
+ /**
+ Add a new named queue after the specified queue.
+
+ The queue to add will only be added once.
+
+ @method _addQueue
+ @param {String} name the name of the queue to add.
+ @param {String} after the name of the queue to add after.
+ @private
+ */
+ run._addQueue = function (name, after) {
+ if (run.queues.indexOf(name) === -1) {
+ run.queues.splice(run.queues.indexOf(after) + 1, 0, name);
+ }
+ };
+
+ /**
+ @module ember
+ */
+ /**
+ Helper class that allows you to register your library with Ember.
+
+ Singleton created at `Ember.libraries`.
+
+ @class Libraries
+ @constructor
+ @private
+ */
+ var Libraries = function () {
+ function Libraries() {
+ emberBabel.classCallCheck(this, Libraries);
+
+ this._registry = [];
+ this._coreLibIndex = 0;
+ }
+
+ Libraries.prototype._getLibraryByName = function _getLibraryByName(name) {
+ var libs = this._registry;
+ var count = libs.length;
+
+ for (var i = 0; i < count; i++) {
+ if (libs[i].name === name) {
+ return libs[i];
+ }
+ }
+ };
+
+ Libraries.prototype.register = function register(name, version, isCoreLibrary) {
+ var index = this._registry.length;
+
+ if (!this._getLibraryByName(name)) {
+ if (isCoreLibrary) {
+ index = this._coreLibIndex++;
+ }
+ this._registry.splice(index, 0, { name: name, version: version });
+ } else {
+ true && emberDebug.warn('Library "' + name + '" is already registered with Ember.', false, { id: 'ember-metal.libraries-register' });
+ }
+ };
+
+ Libraries.prototype.registerCoreLibrary = function registerCoreLibrary(name, version) {
+ this.register(name, version, true);
+ };
+
+ Libraries.prototype.deRegister = function deRegister(name) {
+ var lib = this._getLibraryByName(name);
+ var index = void 0;
+
+ if (lib) {
+ index = this._registry.indexOf(lib);
+ this._registry.splice(index, 1);
+ }
+ };
+
+ return Libraries;
+ }();
+
+ if (features.EMBER_LIBRARIES_ISREGISTERED) {
+ Libraries.prototype.isRegistered = function (name) {
+ return !!this._getLibraryByName(name);
+ };
+ }
+
+ var libraries = new Libraries();
+
+ /**
+ @module @ember/map
+ @private
+ */
+
+ /*
+ JavaScript (before ES6) does not have a Map implementation. Objects,
+ which are often used as dictionaries, may only have Strings as keys.
+
+ Because Ember has a way to get a unique identifier for every object
+ via `guidFor`, we can implement a performant Map with arbitrary
+ keys. Because it is commonly used in low-level bookkeeping, Map is
+ implemented as a pure JavaScript object for performance.
+
+ This implementation follows the current iteration of the ES6 proposal for
+ maps (http://wiki.ecmascript.org/doku.php?id=harmony:simple_maps_and_sets),
+ with one exception: as we do not have the luxury of in-VM iteration, we implement a
+ forEach method for iteration.
+
+ Map is mocked out to look like an Ember object, so you can do
+ `EmberMap.create()` for symmetry with other Ember classes.
+ */
+
+ function copyNull(obj) {
+ var output = Object.create(null);
+
+ for (var prop in obj) {
+ // hasOwnPropery is not needed because obj is Object.create(null);
+ output[prop] = obj[prop];
+ }
+
+ return output;
+ }
+
+ function copyMap(original, newObject) {
+ var keys = original._keys.copy();
+ var values = copyNull(original._values);
+
+ newObject._keys = keys;
+ newObject._values = values;
+ newObject.size = original.size;
+
+ return newObject;
+ }
+
+ /**
+ This class is used internally by Ember and Ember Data.
+ Please do not use it at this time. We plan to clean it up
+ and add many tests soon.
+
+ @class OrderedSet
+ @namespace Ember
+ @constructor
+ @private
+ */
+
+ var OrderedSet = function () {
+ function OrderedSet() {
+ emberBabel.classCallCheck(this, OrderedSet);
+
+ this.clear();
+ }
+
+ /**
+ @method create
+ @static
+ @return {Ember.OrderedSet}
+ @private
+ */
+
+ OrderedSet.create = function create() {
+ var Constructor = this;
+ return new Constructor();
+ };
+
+ /**
+ @method clear
+ @private
+ */
+
+ OrderedSet.prototype.clear = function clear() {
+ this.presenceSet = Object.create(null);
+ this.list = [];
+ this.size = 0;
+ };
+
+ /**
+ @method add
+ @param obj
+ @param guid (optional, and for internal use)
+ @return {Ember.OrderedSet}
+ @private
+ */
+
+ OrderedSet.prototype.add = function add(obj, _guid) {
+ var guid = _guid || emberUtils.guidFor(obj);
+ var presenceSet = this.presenceSet;
+ var list = this.list;
+
+ if (presenceSet[guid] !== true) {
+ presenceSet[guid] = true;
+ this.size = list.push(obj);
+ }
+
+ return this;
+ };
+
+ /**
+ @since 1.8.0
+ @method delete
+ @param obj
+ @param _guid (optional and for internal use only)
+ @return {Boolean}
+ @private
+ */
+
+ OrderedSet.prototype.delete = function _delete(obj, _guid) {
+ var guid = _guid || emberUtils.guidFor(obj);
+ var presenceSet = this.presenceSet;
+ var list = this.list;
+
+ if (presenceSet[guid] === true) {
+ delete presenceSet[guid];
+ var index = list.indexOf(obj);
+ if (index > -1) {
+ list.splice(index, 1);
+ }
+ this.size = list.length;
+ return true;
+ } else {
+ return false;
+ }
+ };
+
+ /**
+ @method isEmpty
+ @return {Boolean}
+ @private
+ */
+
+ OrderedSet.prototype.isEmpty = function isEmpty() {
+ return this.size === 0;
+ };
+
+ /**
+ @method has
+ @param obj
+ @return {Boolean}
+ @private
+ */
+
+ OrderedSet.prototype.has = function has(obj) {
+ if (this.size === 0) {
+ return false;
+ }
+
+ var guid = emberUtils.guidFor(obj);
+ var presenceSet = this.presenceSet;
+
+ return presenceSet[guid] === true;
+ };
+
+ /**
+ @method forEach
+ @param {Function} fn
+ @param self
+ @private
+ */
+
+ OrderedSet.prototype.forEach = function forEach(fn /*, ...thisArg*/) {
+ true && !(typeof fn === 'function') && emberDebug.assert(Object.prototype.toString.call(fn) + ' is not a function', typeof fn === 'function');
+
+ if (this.size === 0) {
+ return;
+ }
+
+ var list = this.list;
+
+ if (arguments.length === 2) {
+ for (var i = 0; i < list.length; i++) {
+ fn.call(arguments[1], list[i]);
+ }
+ } else {
+ for (var _i = 0; _i < list.length; _i++) {
+ fn(list[_i]);
+ }
+ }
+ };
+
+ /**
+ @method toArray
+ @return {Array}
+ @private
+ */
+
+ OrderedSet.prototype.toArray = function toArray() {
+ return this.list.slice();
+ };
+
+ /**
+ @method copy
+ @return {Ember.OrderedSet}
+ @private
+ */
+
+ OrderedSet.prototype.copy = function copy() {
+ var Constructor = this.constructor;
+ var set = new Constructor();
+
+ set.presenceSet = copyNull(this.presenceSet);
+ set.list = this.toArray();
+ set.size = this.size;
+
+ return set;
+ };
+
+ return OrderedSet;
+ }();
+
+ /**
+ A Map stores values indexed by keys. Unlike JavaScript's
+ default Objects, the keys of a Map can be any JavaScript
+ object.
+
+ Internally, a Map has two data structures:
+
+ 1. `keys`: an OrderedSet of all of the existing keys
+ 2. `values`: a JavaScript Object indexed by the `guidFor(key)`
+
+ When a key/value pair is added for the first time, we
+ add the key to the `keys` OrderedSet, and create or
+ replace an entry in `values`. When an entry is deleted,
+ we delete its entry in `keys` and `values`.
+
+ @class Map
+ @private
+ @constructor
+ */
+
+ var Map = function () {
+ function Map() {
+ emberBabel.classCallCheck(this, Map);
+
+ this._keys = new OrderedSet();
+ this._values = Object.create(null);
+ this.size = 0;
+ }
+
+ /**
+ @method create
+ @static
+ @private
+ */
+
+ Map.create = function create() {
+ var Constructor = this;
+ return new Constructor();
+ };
+
+ /**
+ Retrieve the value associated with a given key.
+ @method get
+ @param {*} key
+ @return {*} the value associated with the key, or `undefined`
+ @private
+ */
+
+ Map.prototype.get = function get(key) {
+ if (this.size === 0) {
+ return;
+ }
+
+ var values = this._values;
+ var guid = emberUtils.guidFor(key);
+
+ return values[guid];
+ };
+
+ /**
+ Adds a value to the map. If a value for the given key has already been
+ provided, the new value will replace the old value.
+ @method set
+ @param {*} key
+ @param {*} value
+ @return {Map}
+ @private
+ */
+
+ Map.prototype.set = function set(key, value) {
+ var keys = this._keys;
+ var values = this._values;
+ var guid = emberUtils.guidFor(key);
+
+ // ensure we don't store -0
+ var k = key === -0 ? 0 : key;
+
+ keys.add(k, guid);
+
+ values[guid] = value;
+
+ this.size = keys.size;
+
+ return this;
+ };
+
+ /**
+ Removes a value from the map for an associated key.
+ @since 1.8.0
+ @method delete
+ @param {*} key
+ @return {Boolean} true if an item was removed, false otherwise
+ @private
+ */
+
+ Map.prototype.delete = function _delete(key) {
+ if (this.size === 0) {
+ return false;
+ }
+ // don't use ES6 "delete" because it will be annoying
+ // to use in browsers that are not ES6 friendly;
+ var keys = this._keys;
+ var values = this._values;
+ var guid = emberUtils.guidFor(key);
+
+ if (keys.delete(key, guid)) {
+ delete values[guid];
+ this.size = keys.size;
+ return true;
+ } else {
+ return false;
+ }
+ };
+
+ /**
+ Check whether a key is present.
+ @method has
+ @param {*} key
+ @return {Boolean} true if the item was present, false otherwise
+ @private
+ */
+
+ Map.prototype.has = function has(key) {
+ return this._keys.has(key);
+ };
+
+ /**
+ Iterate over all the keys and values. Calls the function once
+ for each key, passing in value, key, and the map being iterated over,
+ in that order.
+ The keys are guaranteed to be iterated over in insertion order.
+ @method forEach
+ @param {Function} callback
+ @param {*} self if passed, the `this` value inside the
+ callback. By default, `this` is the map.
+ @private
+ */
+
+ Map.prototype.forEach = function forEach(callback /*, ...thisArg*/) {
+ true && !(typeof callback === 'function') && emberDebug.assert(Object.prototype.toString.call(callback) + ' is not a function', typeof callback === 'function');
+
+ if (this.size === 0) {
+ return;
+ }
+
+ var map = this;
+ var cb = void 0,
+ thisArg = void 0;
+
+ if (arguments.length === 2) {
+ thisArg = arguments[1];
+ cb = function (key) {
+ return callback.call(thisArg, map.get(key), key, map);
+ };
+ } else {
+ cb = function (key) {
+ return callback(map.get(key), key, map);
+ };
+ }
+
+ this._keys.forEach(cb);
+ };
+
+ /**
+ @method clear
+ @private
+ */
+
+ Map.prototype.clear = function clear() {
+ this._keys.clear();
+ this._values = Object.create(null);
+ this.size = 0;
+ };
+
+ /**
+ @method copy
+ @return {Map}
+ @private
+ */
+
+ Map.prototype.copy = function copy() {
+ return copyMap(this, new Map());
+ };
+
+ return Map;
+ }();
+
+ /**
+ @class MapWithDefault
+ @extends Map
+ @private
+ @constructor
+ @param [options]
+ @param {*} [options.defaultValue]
+ */
+
+ var MapWithDefault = function (_Map) {
+ emberBabel.inherits(MapWithDefault, _Map);
+
+ function MapWithDefault(options) {
+ emberBabel.classCallCheck(this, MapWithDefault);
+
+ var _this = emberBabel.possibleConstructorReturn(this, _Map.call(this));
+
+ _this.defaultValue = options.defaultValue;
+ return _this;
+ }
+
+ /**
+ @method create
+ @static
+ @param [options]
+ @param {*} [options.defaultValue]
+ @return {MapWithDefault|Map} If options are passed, returns
+ `MapWithDefault` otherwise returns `EmberMap`
+ @private
+ */
+
+ MapWithDefault.create = function create(options) {
+ if (options) {
+ return new MapWithDefault(options);
+ } else {
+ return new Map();
+ }
+ };
+
+ /**
+ Retrieve the value associated with a given key.
+ @method get
+ @param {*} key
+ @return {*} the value associated with the key, or the default value
+ @private
+ */
+
+ MapWithDefault.prototype.get = function get(key) {
+ var hasValue = this.has(key);
+
+ if (hasValue) {
+ return _Map.prototype.get.call(this, key);
+ } else {
+ var defaultValue = this.defaultValue(key);
+ this.set(key, defaultValue);
+ return defaultValue;
+ }
+ };
+
+ /**
+ @method copy
+ @return {MapWithDefault}
+ @private
+ */
+
+ MapWithDefault.prototype.copy = function copy() {
+ var Constructor = this.constructor;
+ return copyMap(this, new Constructor({
+ defaultValue: this.defaultValue
+ }));
+ };
+
+ return MapWithDefault;
+ }(Map);
+
+ /**
+ @module @ember/object
+ */
+
+ /**
+ To get multiple properties at once, call `getProperties`
+ with an object followed by a list of strings or an array:
+
+ ```javascript
+ import { getProperties } from '@ember/object';
+
+ getProperties(record, 'firstName', 'lastName', 'zipCode');
+ // { firstName: 'John', lastName: 'Doe', zipCode: '10011' }
+ ```
+
+ is equivalent to:
+
+ ```javascript
+ import { getProperties } from '@ember/object';
+
+ getProperties(record, ['firstName', 'lastName', 'zipCode']);
+ // { firstName: 'John', lastName: 'Doe', zipCode: '10011' }
+ ```
+
+ @method getProperties
+ @static
+ @for @ember/object
+ @param {Object} obj
+ @param {String...|Array} list of keys to get
+ @return {Object}
+ @public
+ */
+ function getProperties(obj) {
+ var ret = {};
+ var propertyNames = arguments;
+ var i = 1;
+
+ if (arguments.length === 2 && Array.isArray(arguments[1])) {
+ i = 0;
+ propertyNames = arguments[1];
+ }
+ for (; i < propertyNames.length; i++) {
+ ret[propertyNames[i]] = get(obj, propertyNames[i]);
+ }
+ return ret;
+ }
+
+ /**
+ @module @ember/object
+ */
+ /**
+ Set a list of properties on an object. These properties are set inside
+ a single `beginPropertyChanges` and `endPropertyChanges` batch, so
+ observers will be buffered.
+
+ ```javascript
+ import EmberObject from '@ember/object';
+ let anObject = EmberObject.create();
+
+ anObject.setProperties({
+ firstName: 'Stanley',
+ lastName: 'Stuart',
+ age: 21
+ });
+ ```
+
+ @method setProperties
+ @static
+ @for @ember/object
+ @param obj
+ @param {Object} properties
+ @return properties
+ @public
+ */
+ function setProperties(obj, properties) {
+ if (properties === null || typeof properties !== 'object') {
+ return properties;
+ }
+ changeProperties(function () {
+ var props = Object.keys(properties);
+ var propertyName = void 0;
+
+ for (var i = 0; i < props.length; i++) {
+ propertyName = props[i];
+
+ set(obj, propertyName, properties[propertyName]);
+ }
+ });
+ return properties;
+ }
+
+ /**
+ @module @ember/object
+ */
+ var a_concat = Array.prototype.concat;
+ var isArray = Array.isArray;
+
+ function isMethod(obj) {
+ return 'function' === typeof obj && obj.isMethod !== false && obj !== Boolean && obj !== Object && obj !== Number && obj !== Array && obj !== Date && obj !== String;
+ }
+
+ var CONTINUE = {};
+
+ function mixinProperties(mixinsMeta, mixin) {
+ var guid = void 0;
+
+ if (mixin instanceof Mixin) {
+ guid = emberUtils.guidFor(mixin);
+ if (mixinsMeta.peekMixins(guid)) {
+ return CONTINUE;
+ }
+ mixinsMeta.writeMixins(guid, mixin);
+ return mixin.properties;
+ } else {
+ return mixin; // apply anonymous mixin properties
+ }
+ }
+
+ function concatenatedMixinProperties(concatProp, props, values, base) {
+ // reset before adding each new mixin to pickup concats from previous
+ var concats = values[concatProp] || base[concatProp];
+ if (props[concatProp]) {
+ concats = concats ? a_concat.call(concats, props[concatProp]) : props[concatProp];
+ }
+ return concats;
+ }
+
+ function giveDescriptorSuper(meta$$1, key, property, values, descs, base) {
+ var superProperty = void 0;
+
+ // Computed properties override methods, and do not call super to them
+ if (values[key] === undefined) {
+ // Find the original descriptor in a parent mixin
+ superProperty = descs[key];
+ }
+
+ // If we didn't find the original descriptor in a parent mixin, find
+ // it on the original object.
+ if (!superProperty) {
+ superProperty = descriptorFor(base, key, meta$$1);
+ }
+
+ if (superProperty === undefined || !(superProperty instanceof ComputedProperty)) {
+ return property;
+ }
+
+ // Since multiple mixins may inherit from the same parent, we need
+ // to clone the computed property so that other mixins do not receive
+ // the wrapped version.
+ property = Object.create(property);
+ property._getter = emberUtils.wrap(property._getter, superProperty._getter);
+ if (superProperty._setter) {
+ if (property._setter) {
+ property._setter = emberUtils.wrap(property._setter, superProperty._setter);
+ } else {
+ property._setter = superProperty._setter;
+ }
+ }
+
+ return property;
+ }
+
+ function giveMethodSuper(obj, key, method, values, descs) {
+ // Methods overwrite computed properties, and do not call super to them.
+ if (descs[key] !== undefined) {
+ return method;
+ }
+
+ // Find the original method in a parent mixin
+ var superMethod = values[key];
+
+ // If we didn't find the original value in a parent mixin, find it in
+ // the original object
+ if (superMethod === undefined && (!features.EMBER_METAL_ES5_GETTERS || descriptorFor(obj, key) === undefined)) {
+ superMethod = obj[key];
+ }
+
+ // Only wrap the new method if the original method was a function
+ if (typeof superMethod === 'function') {
+ return emberUtils.wrap(method, superMethod);
+ }
+
+ return method;
+ }
+
+ function applyConcatenatedProperties(obj, key, value, values) {
+ var baseValue = values[key] || obj[key];
+ var ret = void 0;
+
+ if (baseValue === null || baseValue === undefined) {
+ ret = emberUtils.makeArray(value);
+ } else if (isArray(baseValue)) {
+ if (value === null || value === undefined) {
+ ret = baseValue;
+ } else {
+ ret = a_concat.call(baseValue, value);
+ }
+ } else {
+ ret = a_concat.call(emberUtils.makeArray(baseValue), value);
+ }
+
+ {
+ // it is possible to use concatenatedProperties with strings (which cannot be frozen)
+ // only freeze objects...
+ if (typeof ret === 'object' && ret !== null) {
+ // prevent mutating `concatenatedProperties` array after it is applied
+ Object.freeze(ret);
+ }
+ }
+
+ return ret;
+ }
+
+ function applyMergedProperties(obj, key, value, values) {
+ var baseValue = values[key] || obj[key];
+
+ true && !!isArray(value) && emberDebug.assert('You passed in `' + JSON.stringify(value) + '` as the value for `' + key + '` but `' + key + '` cannot be an Array', !isArray(value));
+
+ if (!baseValue) {
+ return value;
+ }
+
+ var newBase = emberUtils.assign({}, baseValue);
+ var hasFunction = false;
+
+ for (var prop in value) {
+ if (!value.hasOwnProperty(prop)) {
+ continue;
+ }
+
+ var propValue = value[prop];
+ if (isMethod(propValue)) {
+ // TODO: support for Computed Properties, etc?
+ hasFunction = true;
+ newBase[prop] = giveMethodSuper(obj, prop, propValue, baseValue, {});
+ } else {
+ newBase[prop] = propValue;
+ }
+ }
+
+ if (hasFunction) {
+ newBase._super = emberUtils.ROOT;
+ }
+
+ return newBase;
+ }
+
+ function addNormalizedProperty(base, key, value, meta$$1, descs, values, concats, mergings) {
+ if (value instanceof Descriptor) {
+ if (emberEnvironment.ENV._ENABLE_PROPERTY_REQUIRED_SUPPORT && value === REQUIRED && descs[key]) {
+ return CONTINUE;
+ }
+
+ // Wrap descriptor function to implement
+ // _super() if needed
+ if (value._getter) {
+ value = giveDescriptorSuper(meta$$1, key, value, values, descs, base);
+ }
+
+ descs[key] = value;
+ values[key] = undefined;
+ } else {
+ if (concats && concats.indexOf(key) >= 0 || key === 'concatenatedProperties' || key === 'mergedProperties') {
+ value = applyConcatenatedProperties(base, key, value, values);
+ } else if (mergings && mergings.indexOf(key) > -1) {
+ value = applyMergedProperties(base, key, value, values);
+ } else if (isMethod(value)) {
+ value = giveMethodSuper(base, key, value, values, descs);
+ }
+
+ descs[key] = undefined;
+ values[key] = value;
+ }
+ }
+
+ function mergeMixins(mixins, meta$$1, descs, values, base, keys) {
+ var currentMixin = void 0,
+ props = void 0,
+ key = void 0,
+ concats = void 0,
+ mergings = void 0;
+
+ function removeKeys(keyName) {
+ delete descs[keyName];
+ delete values[keyName];
+ }
+
+ for (var i = 0; i < mixins.length; i++) {
+ currentMixin = mixins[i];
+ true && !(typeof currentMixin === 'object' && currentMixin !== null && Object.prototype.toString.call(currentMixin) !== '[object Array]') && emberDebug.assert('Expected hash or Mixin instance, got ' + Object.prototype.toString.call(currentMixin), typeof currentMixin === 'object' && currentMixin !== null && Object.prototype.toString.call(currentMixin) !== '[object Array]');
+
+ props = mixinProperties(meta$$1, currentMixin);
+ if (props === CONTINUE) {
+ continue;
+ }
+
+ if (props) {
+ // remove willMergeMixin after 3.4 as it was used for _actions
+ if (base.willMergeMixin) {
+ base.willMergeMixin(props);
+ }
+ concats = concatenatedMixinProperties('concatenatedProperties', props, values, base);
+ mergings = concatenatedMixinProperties('mergedProperties', props, values, base);
+
+ for (key in props) {
+ if (!props.hasOwnProperty(key)) {
+ continue;
+ }
+ keys.push(key);
+ addNormalizedProperty(base, key, props[key], meta$$1, descs, values, concats, mergings);
+ }
+
+ // manually copy toString() because some JS engines do not enumerate it
+ if (props.hasOwnProperty('toString')) {
+ base.toString = props.toString;
+ }
+ } else if (currentMixin.mixins) {
+ mergeMixins(currentMixin.mixins, meta$$1, descs, values, base, keys);
+ if (currentMixin._without) {
+ currentMixin._without.forEach(removeKeys);
+ }
+ }
+ }
+ }
+
+ function followAlias(obj, desc, descs, values) {
+ var altKey = desc.methodName;
+ var value = void 0;
+ var possibleDesc = void 0;
+ if (descs[altKey] || values[altKey]) {
+ value = values[altKey];
+ desc = descs[altKey];
+ } else if ((possibleDesc = descriptorFor(obj, altKey)) !== undefined) {
+ desc = possibleDesc;
+ value = undefined;
+ } else {
+ desc = undefined;
+ value = obj[altKey];
+ }
+
+ return { desc: desc, value: value };
+ }
+
+ function updateObserversAndListeners(obj, key, paths, updateMethod) {
+ if (paths) {
+ for (var i = 0; i < paths.length; i++) {
+ updateMethod(obj, paths[i], null, key);
+ }
+ }
+ }
+
+ function replaceObserversAndListeners(obj, key, prev, next) {
+ if (typeof prev === 'function') {
+ updateObserversAndListeners(obj, key, prev.__ember_observesBefore__, _removeBeforeObserver);
+ updateObserversAndListeners(obj, key, prev.__ember_observes__, removeObserver);
+ updateObserversAndListeners(obj, key, prev.__ember_listens__, removeListener);
+ }
+
+ if (typeof next === 'function') {
+ updateObserversAndListeners(obj, key, next.__ember_observesBefore__, _addBeforeObserver);
+ updateObserversAndListeners(obj, key, next.__ember_observes__, addObserver);
+ updateObserversAndListeners(obj, key, next.__ember_listens__, addListener);
+ }
+ }
+
+ function applyMixin(obj, mixins, partial) {
+ var descs = {};
+ var values = {};
+ var meta$$1 = meta(obj);
+ var keys = [];
+ var key = void 0,
+ value = void 0,
+ desc = void 0;
+
+ obj._super = emberUtils.ROOT;
+
+ // Go through all mixins and hashes passed in, and:
+ //
+ // * Handle concatenated properties
+ // * Handle merged properties
+ // * Set up _super wrapping if necessary
+ // * Set up computed property descriptors
+ // * Copying `toString` in broken browsers
+ mergeMixins(mixins, meta$$1, descs, values, obj, keys);
+
+ for (var i = 0; i < keys.length; i++) {
+ key = keys[i];
+ if (key === 'constructor' || !values.hasOwnProperty(key)) {
+ continue;
+ }
+
+ desc = descs[key];
+ value = values[key];
+
+ if (emberEnvironment.ENV._ENABLE_PROPERTY_REQUIRED_SUPPORT && desc === REQUIRED) {
+ continue;
+ }
+
+ while (desc && desc instanceof Alias) {
+ var followed = followAlias(obj, desc, descs, values);
+ desc = followed.desc;
+ value = followed.value;
+ }
+
+ if (desc === undefined && value === undefined) {
+ continue;
+ }
+
+ if (features.EMBER_METAL_ES5_GETTERS && descriptorFor(obj, key) !== undefined) {
+ replaceObserversAndListeners(obj, key, null, value);
+ } else {
+ replaceObserversAndListeners(obj, key, obj[key], value);
+ }
+
+ if (emberEnvironment.ENV._ENABLE_BINDING_SUPPORT && typeof Mixin.detectBinding === 'function' && Mixin.detectBinding(key)) {
+ meta$$1.writeBindings(key, value);
+ }
+
+ defineProperty(obj, key, desc, value, meta$$1);
+ }
+
+ if (emberEnvironment.ENV._ENABLE_BINDING_SUPPORT && !partial && typeof Mixin.finishProtype === 'function') {
+ Mixin.finishPartial(obj, meta$$1);
+ }
+
+ return obj;
+ }
+
+ /**
+ @method mixin
+ @param obj
+ @param mixins*
+ @return obj
+ @private
+ */
+ function mixin(obj) {
+ for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ args[_key - 1] = arguments[_key];
+ }
+
+ applyMixin(obj, args, false);
+ return obj;
+ }
+
+ /**
+ The `Mixin` class allows you to create mixins, whose properties can be
+ added to other classes. For instance,
+
+ ```javascript
+ import Mixin from '@ember/object/mixin';
+
+ const EditableMixin = Mixin.create({
+ edit() {
+ console.log('starting to edit');
+ this.set('isEditing', true);
+ },
+ isEditing: false
+ });
+ ```
+
+ ```javascript
+ import EmberObject from '@ember/object';
+ import EditableMixin from '../mixins/editable';
+
+ // Mix mixins into classes by passing them as the first arguments to
+ // `.extend.`
+ const Comment = EmberObject.extend(EditableMixin, {
+ post: null
+ });
+
+ let comment = Comment.create({
+ post: somePost
+ });
+
+ comment.edit(); // outputs 'starting to edit'
+ ```
+
+ Note that Mixins are created with `Mixin.create`, not
+ `Mixin.extend`.
+
+ Note that mixins extend a constructor's prototype so arrays and object literals
+ defined as properties will be shared amongst objects that implement the mixin.
+ If you want to define a property in a mixin that is not shared, you can define
+ it either as a computed property or have it be created on initialization of the object.
+
+ ```javascript
+ // filters array will be shared amongst any object implementing mixin
+ import Mixin from '@ember/object/mixin';
+ import { A } from '@ember/array';
+
+ const FilterableMixin = Mixin.create({
+ filters: A()
+ });
+ ```
+
+ ```javascript
+ import Mixin from '@ember/object/mixin';
+ import { A } from '@ember/array';
+ import { computed } from '@ember/object';
+
+ // filters will be a separate array for every object implementing the mixin
+ const FilterableMixin = Mixin.create({
+ filters: computed(function() {
+ return A();
+ })
+ });
+ ```
+
+ ```javascript
+ import Mixin from '@ember/object/mixin';
+ import { A } from '@ember/array';
+
+ // filters will be created as a separate array during the object's initialization
+ const Filterable = Mixin.create({
+ filters: null,
+
+ init() {
+ this._super(...arguments);
+ this.set("filters", A());
+ }
+ });
+ ```
+
+ @class Mixin
+ @public
+ */
+
+ var Mixin = function () {
+ function Mixin(mixins, properties) {
+ emberBabel.classCallCheck(this, Mixin);
+
+ this.properties = properties;
+
+ var length = mixins && mixins.length;
+
+ if (length > 0) {
+ var m = new Array(length);
+
+ for (var i = 0; i < length; i++) {
+ var x = mixins[i];
+ if (x instanceof Mixin) {
+ m[i] = x;
+ } else {
+ m[i] = new Mixin(undefined, x);
+ }
+ }
+
+ this.mixins = m;
+ } else {
+ this.mixins = undefined;
+ }
+ this.ownerConstructor = undefined;
+ this._without = undefined;
+ this[emberUtils.GUID_KEY] = null;
+ this[emberUtils.NAME_KEY] = null;
+ emberDebug.debugSeal(this);
+ }
+
+ Mixin.applyPartial = function applyPartial(obj) {
+ for (var _len2 = arguments.length, args = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
+ args[_key2 - 1] = arguments[_key2];
+ }
+
+ return applyMixin(obj, args, true);
+ };
+
+ /**
+ @method create
+ @for @ember/object/mixin
+ @static
+ @param arguments*
+ @public
+ */
+
+ Mixin.create = function create() {
+ // ES6TODO: this relies on a global state?
+ unprocessedFlag = true;
+ var M = this;
+
+ for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
+ args[_key3] = arguments[_key3];
+ }
+
+ return new M(args, undefined);
+ };
+
+ // returns the mixins currently applied to the specified object
+ // TODO: Make `mixin`
+
+
+ Mixin.mixins = function mixins(obj) {
+ var meta$$1 = peekMeta(obj);
+ var ret = [];
+ if (meta$$1 === undefined) {
+ return ret;
+ }
+
+ meta$$1.forEachMixins(function (key, currentMixin) {
+ // skip primitive mixins since these are always anonymous
+ if (!currentMixin.properties) {
+ ret.push(currentMixin);
+ }
+ });
+
+ return ret;
+ };
+
+ /**
+ @method reopen
+ @param arguments*
+ @private
+ */
+
+ Mixin.prototype.reopen = function reopen() {
+ var currentMixin = void 0;
+
+ if (this.properties) {
+ currentMixin = new Mixin(undefined, this.properties);
+ this.properties = undefined;
+ this.mixins = [currentMixin];
+ } else if (!this.mixins) {
+ this.mixins = [];
+ }
+
+ var mixins = this.mixins;
+ var idx = void 0;
+
+ for (idx = 0; idx < arguments.length; idx++) {
+ currentMixin = arguments[idx];
+ true && !(typeof currentMixin === 'object' && currentMixin !== null && Object.prototype.toString.call(currentMixin) !== '[object Array]') && emberDebug.assert('Expected hash or Mixin instance, got ' + Object.prototype.toString.call(currentMixin), typeof currentMixin === 'object' && currentMixin !== null && Object.prototype.toString.call(currentMixin) !== '[object Array]');
+
+ if (currentMixin instanceof Mixin) {
+ mixins.push(currentMixin);
+ } else {
+ mixins.push(new Mixin(undefined, currentMixin));
+ }
+ }
+
+ return this;
+ };
+
+ /**
+ @method apply
+ @param obj
+ @return applied object
+ @private
+ */
+
+ Mixin.prototype.apply = function apply(obj) {
+ return applyMixin(obj, [this], false);
+ };
+
+ Mixin.prototype.applyPartial = function applyPartial(obj) {
+ return applyMixin(obj, [this], true);
+ };
+
+ /**
+ @method detect
+ @param obj
+ @return {Boolean}
+ @private
+ */
+
+ Mixin.prototype.detect = function detect(obj) {
+ if (typeof obj !== 'object' || obj === null) {
+ return false;
+ }
+ if (obj instanceof Mixin) {
+ return _detect(obj, this, {});
+ }
+ var meta$$1 = peekMeta(obj);
+ if (meta$$1 === undefined) {
+ return false;
+ }
+ return !!meta$$1.peekMixins(emberUtils.guidFor(this));
+ };
+
+ Mixin.prototype.without = function without() {
+ var ret = new Mixin([this]);
+
+ for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
+ args[_key4] = arguments[_key4];
+ }
+
+ ret._without = args;
+ return ret;
+ };
+
+ Mixin.prototype.keys = function keys() {
+ var keys = {};
+ var seen = {};
+
+ _keys(keys, this, seen);
+ var ret = Object.keys(keys);
+ return ret;
+ };
+
+ return Mixin;
+ }();
+
+ Mixin._apply = applyMixin;
+ if (emberEnvironment.ENV._ENABLE_BINDING_SUPPORT) {
+ // slotting this so that the legacy addon can add the function here
+ // without triggering an error due to the Object.seal done below
+ Mixin.finishPartial = null;
+ Mixin.detectBinding = null;
+ }
+
+ var MixinPrototype = Mixin.prototype;
+ MixinPrototype.toString = Object.toString;
+
+ emberDebug.debugSeal(MixinPrototype);
+
+ var unprocessedFlag = false;
+
+ function hasUnprocessedMixins() {
+ return unprocessedFlag;
+ }
+
+ function clearUnprocessedMixins() {
+ unprocessedFlag = false;
+ }
+
+ function _detect(curMixin, targetMixin, seen) {
+ var guid = emberUtils.guidFor(curMixin);
+
+ if (seen[guid]) {
+ return false;
+ }
+ seen[guid] = true;
+
+ if (curMixin === targetMixin) {
+ return true;
+ }
+ var mixins = curMixin.mixins;
+ var loc = mixins ? mixins.length : 0;
+ while (--loc >= 0) {
+ if (_detect(mixins[loc], targetMixin, seen)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ function _keys(ret, mixin, seen) {
+ if (seen[emberUtils.guidFor(mixin)]) {
+ return;
+ }
+ seen[emberUtils.guidFor(mixin)] = true;
+
+ if (mixin.properties) {
+ var props = Object.keys(mixin.properties);
+ for (var i = 0; i < props.length; i++) {
+ var key = props[i];
+ ret[key] = true;
+ }
+ } else if (mixin.mixins) {
+ mixin.mixins.forEach(function (x) {
+ return _keys(ret, x, seen);
+ });
+ }
+ }
+
+ var REQUIRED = new Descriptor();
+ REQUIRED.toString = function () {
+ return '(Required Property)';
+ };
+
+ /**
+ Denotes a required property for a mixin
+
+ @method required
+ @for Ember
+ @private
+ */
+ function required() {
+ true && !false && emberDebug.deprecate('Ember.required is deprecated as its behavior is inconsistent and unreliable.', false, { id: 'ember-metal.required', until: '3.0.0' });
+
+ return REQUIRED;
+ }
+
+ function Alias(methodName) {
+ this.isDescriptor = true;
+ this.methodName = methodName;
+ }
+
+ Alias.prototype = new Descriptor();
+
+ /**
+ Makes a method available via an additional name.
+
+ ```app/utils/person.js
+ import EmberObject, {
+ aliasMethod
+ } from '@ember/object';
+
+ export default EmberObject.extend({
+ name() {
+ return 'Tomhuda Katzdale';
+ },
+ moniker: aliasMethod('name')
+ });
+ ```
+
+ ```javascript
+ let goodGuy = Person.create();
+
+ goodGuy.name(); // 'Tomhuda Katzdale'
+ goodGuy.moniker(); // 'Tomhuda Katzdale'
+ ```
+
+ @method aliasMethod
+ @static
+ @for @ember/object
+ @param {String} methodName name of the method to alias
+ @public
+ */
+ function aliasMethod(methodName) {
+ return new Alias(methodName);
+ }
+
+ // ..........................................................
+ // OBSERVER HELPER
+ //
+
+ /**
+ Specify a method that observes property changes.
+
+ ```javascript
+ import EmberObject from '@ember/object';
+ import { observer } from '@ember/object';
+
+ export default EmberObject.extend({
+ valueObserver: observer('value', function() {
+ // Executes whenever the "value" property changes
+ })
+ });
+ ```
+
+ Also available as `Function.prototype.observes` if prototype extensions are
+ enabled.
+
+ @method observer
+ @for @ember/object
+ @param {String} propertyNames*
+ @param {Function} func
+ @return func
+ @public
+ @static
+ */
+ function observer() {
+ for (var _len5 = arguments.length, args = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
+ args[_key5] = arguments[_key5];
+ }
+
+ var func = args.pop();
+ var _paths = args;
+
+ true && !(typeof func === 'function') && emberDebug.assert('observer called without a function', typeof func === 'function');
+ true && !(_paths.length > 0 && _paths.every(function (p) {
+ return typeof p === 'string' && p.length;
+ })) && emberDebug.assert('observer called without valid path', _paths.length > 0 && _paths.every(function (p) {
+ return typeof p === 'string' && p.length;
+ }));
+
+ var paths = [];
+ var addWatchedProperty = function (path) {
+ return paths.push(path);
+ };
+
+ for (var i = 0; i < _paths.length; ++i) {
+ expandProperties(_paths[i], addWatchedProperty);
+ }
+
+ func.__ember_observes__ = paths;
+ return func;
+ }
+
+ /**
+ When observers fire, they are called with the arguments `obj`, `keyName`.
+
+ Note, `@each.property` observer is called per each add or replace of an element
+ and it's not called with a specific enumeration item.
+
+ A `_beforeObserver` fires before a property changes.
+
+ @method beforeObserver
+ @for Ember
+ @param {String} propertyNames*
+ @param {Function} func
+ @return func
+ @deprecated
+ @private
+ */
+ function _beforeObserver() {
+ for (var _len6 = arguments.length, args = Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
+ args[_key6] = arguments[_key6];
+ }
+
+ var func = args.pop();
+ var _paths = args;
+
+ true && !(typeof func === 'function') && emberDebug.assert('_beforeObserver called without a function', typeof func === 'function');
+
+ var paths = [];
+ var addWatchedProperty = function (path) {
+ paths.push(path);
+ };
+
+ for (var i = 0; i < _paths.length; ++i) {
+ expandProperties(_paths[i], addWatchedProperty);
+ }
+
+ func.__ember_observesBefore__ = paths;
+ return func;
+ }
+
+ /**
+ @module ember
+ @private
+ */
+
+ /**
+ Read-only property that returns the result of a container lookup.
+
+ @class InjectedProperty
+ @namespace Ember
+ @constructor
+ @param {String} type The container type the property will lookup
+ @param {String} name (optional) The name the property will lookup, defaults
+ to the property's name
+ @private
+ */
+ function InjectedProperty(type, name) {
+ this.type = type;
+ this.name = name;
+
+ this._super$Constructor(injectedPropertyGet);
+ AliasedPropertyPrototype.oneWay.call(this);
+ }
+
+ function injectedPropertyGet(keyName) {
+ var desc = descriptorFor(this, keyName);
+ var owner = emberUtils.getOwner(this) || this.container; // fallback to `container` for backwards compat
+
+ true && !(desc && desc.type) && emberDebug.assert('InjectedProperties should be defined with the inject computed property macros.', desc && desc.type);
+ true && !owner && emberDebug.assert('Attempting to lookup an injected property on an object without a container, ensure that the object was instantiated via a container.', owner);
+
+ return owner.lookup(desc.type + ':' + (desc.name || keyName));
+ }
+
+ InjectedProperty.prototype = Object.create(Descriptor.prototype);
+
+ var InjectedPropertyPrototype = InjectedProperty.prototype;
+ var ComputedPropertyPrototype$1 = ComputedProperty.prototype;
+ var AliasedPropertyPrototype = AliasedProperty.prototype;
+
+ InjectedPropertyPrototype._super$Constructor = ComputedProperty;
+
+ InjectedPropertyPrototype.get = ComputedPropertyPrototype$1.get;
+ InjectedPropertyPrototype.readOnly = ComputedPropertyPrototype$1.readOnly;
+ InjectedPropertyPrototype.teardown = ComputedPropertyPrototype$1.teardown;
+
+ var splice = Array.prototype.splice;
+
+ function replace(array, idx, amt, objects) {
+ var args = [].concat(objects);
+ var ret = [];
+ // https://code.google.com/p/chromium/issues/detail?id=56588
+ var size = 60000;
+ var start = idx;
+ var ends = amt;
+ var count = void 0,
+ chunk = void 0;
+
+ while (args.length) {
+ count = ends > size ? size : ends;
+ if (count <= 0) {
+ count = 0;
+ }
+
+ chunk = args.splice(0, size);
+ chunk = [start, count].concat(chunk);
+
+ start += size;
+ ends -= count;
+
+ ret = ret.concat(splice.apply(array, chunk));
+ }
+ return ret;
+ }
+
+ function isProxy(value) {
+ if (typeof value === 'object' && value !== null) {
+ var meta$$1 = peekMeta(value);
+ return meta$$1 === undefined ? false : meta$$1.isProxy();
+ }
+
+ return false;
+ }
+
+ function descriptor(desc) {
+ return new Descriptor$1(desc);
+ }
+
+ /**
+ A wrapper for a native ES5 descriptor. In an ideal world, we wouldn't need
+ this at all, however, the way we currently flatten/merge our mixins require
+ a special value to denote a descriptor.
+
+ @class Descriptor
+ @private
+ */
+
+ var Descriptor$1 = function (_EmberDescriptor) {
+ emberBabel.inherits(Descriptor$$1, _EmberDescriptor);
+
+ function Descriptor$$1(desc) {
+ emberBabel.classCallCheck(this, Descriptor$$1);
+
+ var _this = emberBabel.possibleConstructorReturn(this, _EmberDescriptor.call(this));
+
+ _this.desc = desc;
+ return _this;
+ }
+
+ Descriptor$$1.prototype.setup = function setup(obj, key) {
+ Object.defineProperty(obj, key, this.desc);
+ };
+
+ Descriptor$$1.prototype.get = function get(obj, key) {
+ return obj[key];
+ };
+
+ Descriptor$$1.prototype.set = function set(obj, key, value) {
+ return obj[key] = value;
+ };
+
+ Descriptor$$1.prototype.teardown = function teardown() {};
+
+ return Descriptor$$1;
+ }(Descriptor);
+
+ exports['default'] = Ember;
+ exports.computed = computed;
+ exports.cacheFor = cacheFor;
+ exports.ComputedProperty = ComputedProperty;
+ exports.alias = alias;
+ exports.merge = merge;
+ exports.deprecateProperty = deprecateProperty;
+ exports.instrument = instrument;
+ exports._instrumentStart = _instrumentStart;
+ exports.instrumentationReset = reset;
+ exports.instrumentationSubscribe = subscribe;
+ exports.instrumentationUnsubscribe = unsubscribe;
+ exports.getOnerror = getOnerror;
+ exports.setOnerror = setOnerror;
+ exports.setDispatchOverride = setDispatchOverride;
+ exports.getDispatchOverride = getDispatchOverride;
+ exports.descriptorFor = descriptorFor;
+ exports.meta = meta;
+ exports.peekMeta = peekMeta;
+ exports.deleteMeta = deleteMeta;
+ exports.Cache = Cache;
+ exports._getPath = _getPath;
+ exports.get = get;
+ exports.getWithDefault = getWithDefault;
+ exports.set = set;
+ exports.trySet = trySet;
+ exports.addListener = addListener;
+ exports.hasListeners = hasListeners;
+ exports.on = on;
+ exports.removeListener = removeListener;
+ exports.sendEvent = sendEvent;
+ exports.isNone = isNone;
+ exports.isEmpty = isEmpty;
+ exports.isBlank = isBlank;
+ exports.isPresent = isPresent;
+ exports.run = run;
+ exports.ObserverSet = ObserverSet;
+ exports.beginPropertyChanges = beginPropertyChanges;
+ exports.changeProperties = changeProperties;
+ exports.endPropertyChanges = endPropertyChanges;
+ exports.overrideChains = overrideChains;
+ exports.propertyDidChange = propertyDidChange;
+ exports.propertyWillChange = propertyWillChange;
+ exports.PROPERTY_DID_CHANGE = PROPERTY_DID_CHANGE;
+ exports.defineProperty = defineProperty;
+ exports.Descriptor = Descriptor;
+ exports._hasCachedComputedProperties = _hasCachedComputedProperties;
+ exports.watchKey = watchKey;
+ exports.unwatchKey = unwatchKey;
+ exports.ChainNode = ChainNode;
+ exports.finishChains = finishChains;
+ exports.removeChainWatcher = removeChainWatcher;
+ exports.watchPath = watchPath;
+ exports.unwatchPath = unwatchPath;
+ exports.isWatching = isWatching;
+ exports.unwatch = unwatch;
+ exports.watch = watch;
+ exports.watcherCount = watcherCount;
+ exports.libraries = libraries;
+ exports.Libraries = Libraries;
+ exports.Map = Map;
+ exports.MapWithDefault = MapWithDefault;
+ exports.OrderedSet = OrderedSet;
+ exports.getProperties = getProperties;
+ exports.setProperties = setProperties;
+ exports.expandProperties = expandProperties;
+ exports.addObserver = addObserver;
+ exports.removeObserver = removeObserver;
+ exports._addBeforeObserver = _addBeforeObserver;
+ exports._removeBeforeObserver = _removeBeforeObserver;
+ exports.Mixin = Mixin;
+ exports.aliasMethod = aliasMethod;
+ exports._beforeObserver = _beforeObserver;
+ exports.mixin = mixin;
+ exports.observer = observer;
+ exports.required = required;
+ exports.REQUIRED = REQUIRED;
+ exports.hasUnprocessedMixins = hasUnprocessedMixins;
+ exports.clearUnprocessedMixins = clearUnprocessedMixins;
+ exports.InjectedProperty = InjectedProperty;
+ exports.setHasViews = setHasViews;
+ exports.tagForProperty = tagForProperty;
+ exports.tagFor = tagFor;
+ exports.markObjectAsDirty = markObjectAsDirty;
+ exports.replace = replace;
+ exports.isProxy = isProxy;
+ exports.descriptor = descriptor;
+
+ Object.defineProperty(exports, '__esModule', { value: true });
+});
+enifed('ember-routing/ext/controller', ['exports', 'ember-metal', 'ember-runtime', 'ember-routing/utils'], function (exports, _emberMetal, _emberRuntime, _utils) {
+ 'use strict';
+
+ /**
+ @module ember
+ */
+
+ _emberRuntime.ControllerMixin.reopen({
+ concatenatedProperties: ['queryParams'],
+
+ /**
+ Defines which query parameters the controller accepts.
+ If you give the names `['category','page']` it will bind
+ the values of these query parameters to the variables
+ `this.category` and `this.page`.
+ By default, Ember coerces query parameter values using `toggleProperty`.
+ This behavior may lead to unexpected results.
+ To explicitly configure a query parameter property so it coerces as expected, you must define a type property:
+ ```javascript
+ queryParams: [{
+ category: {
+ type: 'boolean'
+ }
+ }]
+ ```
+ @property queryParams
+ @public
+ */
+ queryParams: null,
+
+ /**
+ This property is updated to various different callback functions depending on
+ the current "state" of the backing route. It is used by
+ `Controller.prototype._qpChanged`.
+ The methods backing each state can be found in the `Route.prototype._qp` computed
+ property return value (the `.states` property). The current values are listed here for
+ the sanity of future travelers:
+ * `inactive` - This state is used when this controller instance is not part of the active
+ route hierarchy. Set in `Route.prototype._reset` (a `router.js` microlib hook) and
+ `Route.prototype.actions.finalizeQueryParamChange`.
+ * `active` - This state is used when this controller instance is part of the active
+ route hierarchy. Set in `Route.prototype.actions.finalizeQueryParamChange`.
+ * `allowOverrides` - This state is used in `Route.prototype.setup` (`route.js` microlib hook).
+ @method _qpDelegate
+ @private
+ */
+ _qpDelegate: null, _qpChanged: function (controller, _prop) {
+ var prop = _prop.substr(0, _prop.length - 3);
+
+ var delegate = controller._qpDelegate;
+ var value = (0, _emberMetal.get)(controller, prop);
+ delegate(prop, value);
+ },
+ transitionToRoute: function () {
+ // target may be either another controller or a router
+ var target = (0, _emberMetal.get)(this, 'target');
+ var method = target.transitionToRoute || target.transitionTo;
+
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ return method.apply(target, (0, _utils.prefixRouteNameArg)(this, args));
+ },
+ replaceRoute: function () {
+ // target may be either another controller or a router
+ var target = (0, _emberMetal.get)(this, 'target');
+ var method = target.replaceRoute || target.replaceWith;
+
+ for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+ args[_key2] = arguments[_key2];
+ }
+
+ return method.apply(target, (0, _utils.prefixRouteNameArg)(this, args));
+ }
+ });
+
+ exports.default = _emberRuntime.ControllerMixin;
+});
+enifed('ember-routing/ext/run_loop', ['ember-metal'], function (_emberMetal) {
+ 'use strict';
+
+ // Add a new named queue after the 'actions' queue (where RSVP promises
+ // resolve), which is used in router transitions to prevent unnecessary
+ // loading state entry if all context promises resolve on the
+ // 'actions' queue first.
+ _emberMetal.run._addQueue('routerTransitions', 'actions');
+});
+enifed('ember-routing/index', ['exports', 'ember-routing/location/api', 'ember-routing/location/none_location', 'ember-routing/location/hash_location', 'ember-routing/location/history_location', 'ember-routing/location/auto_location', 'ember-routing/system/generate_controller', 'ember-routing/system/controller_for', 'ember-routing/system/dsl', 'ember-routing/system/router', 'ember-routing/system/route', 'ember-routing/system/query_params', 'ember-routing/services/routing', 'ember-routing/services/router', 'ember-routing/system/cache', 'ember-routing/ext/run_loop', 'ember-routing/ext/controller'], function (exports, _api, _none_location, _hash_location, _history_location, _auto_location, _generate_controller, _controller_for, _dsl, _router, _route, _query_params, _routing, _router2, _cache) {
+ 'use strict';
+
+ exports.BucketCache = exports.RouterService = exports.RoutingService = exports.QueryParams = exports.Route = exports.Router = exports.RouterDSL = exports.controllerFor = exports.generateControllerFactory = exports.generateController = exports.AutoLocation = exports.HistoryLocation = exports.HashLocation = exports.NoneLocation = exports.Location = undefined;
+ Object.defineProperty(exports, 'Location', {
+ enumerable: true,
+ get: function () {
+ return _api.default;
+ }
+ });
+ Object.defineProperty(exports, 'NoneLocation', {
+ enumerable: true,
+ get: function () {
+ return _none_location.default;
+ }
+ });
+ Object.defineProperty(exports, 'HashLocation', {
+ enumerable: true,
+ get: function () {
+ return _hash_location.default;
+ }
+ });
+ Object.defineProperty(exports, 'HistoryLocation', {
+ enumerable: true,
+ get: function () {
+ return _history_location.default;
+ }
+ });
+ Object.defineProperty(exports, 'AutoLocation', {
+ enumerable: true,
+ get: function () {
+ return _auto_location.default;
+ }
+ });
+ Object.defineProperty(exports, 'generateController', {
+ enumerable: true,
+ get: function () {
+ return _generate_controller.default;
+ }
+ });
+ Object.defineProperty(exports, 'generateControllerFactory', {
+ enumerable: true,
+ get: function () {
+ return _generate_controller.generateControllerFactory;
+ }
+ });
+ Object.defineProperty(exports, 'controllerFor', {
+ enumerable: true,
+ get: function () {
+ return _controller_for.default;
+ }
+ });
+ Object.defineProperty(exports, 'RouterDSL', {
+ enumerable: true,
+ get: function () {
+ return _dsl.default;
+ }
+ });
+ Object.defineProperty(exports, 'Router', {
+ enumerable: true,
+ get: function () {
+ return _router.default;
+ }
+ });
+ Object.defineProperty(exports, 'Route', {
+ enumerable: true,
+ get: function () {
+ return _route.default;
+ }
+ });
+ Object.defineProperty(exports, 'QueryParams', {
+ enumerable: true,
+ get: function () {
+ return _query_params.default;
+ }
+ });
+ Object.defineProperty(exports, 'RoutingService', {
+ enumerable: true,
+ get: function () {
+ return _routing.default;
+ }
+ });
+ Object.defineProperty(exports, 'RouterService', {
+ enumerable: true,
+ get: function () {
+ return _router2.default;
+ }
+ });
+ Object.defineProperty(exports, 'BucketCache', {
+ enumerable: true,
+ get: function () {
+ return _cache.default;
+ }
+ });
+});
+enifed('ember-routing/location/api', ['exports', 'ember-debug', 'ember-environment', 'ember-routing/location/util'], function (exports, _emberDebug, _emberEnvironment, _util) {
+ 'use strict';
+
+ exports.default = {
+ /**
+ This is deprecated in favor of using the container to lookup the location
+ implementation as desired.
+ For example:
+ ```javascript
+ // Given a location registered as follows:
+ container.register('location:history-test', HistoryTestLocation);
+ // You could create a new instance via:
+ container.lookup('location:history-test');
+ ```
+ @method create
+ @param {Object} options
+ @return {Object} an instance of an implementation of the `location` API
+ @deprecated Use the container to lookup the location implementation that you
+ need.
+ @private
+ */
+ create: function (options) {
+ var implementation = options && options.implementation;
+ (true && !(!!implementation) && (0, _emberDebug.assert)('Location.create: you must specify a \'implementation\' option', !!implementation));
+
+
+ var implementationClass = this.implementations[implementation];
+ (true && !(!!implementationClass) && (0, _emberDebug.assert)('Location.create: ' + implementation + ' is not a valid implementation', !!implementationClass));
+
+
+ return implementationClass.create.apply(implementationClass, arguments);
+ },
+
+
+ implementations: {},
+ _location: _emberEnvironment.environment.location,
+
+ /**
+ Returns the current `location.hash` by parsing location.href since browsers
+ inconsistently URL-decode `location.hash`.
+ https://bugzilla.mozilla.org/show_bug.cgi?id=483304
+ @private
+ @method getHash
+ @since 1.4.0
+ */
+ _getHash: function () {
+ return (0, _util.getHash)(this.location);
+ }
+ };
+});
+enifed('ember-routing/location/auto_location', ['exports', 'ember-utils', 'ember-metal', 'ember-debug', 'ember-runtime', 'ember-environment', 'ember-routing/location/util'], function (exports, _emberUtils, _emberMetal, _emberDebug, _emberRuntime, _emberEnvironment, _util) {
+ 'use strict';
+
+ exports.getHistoryPath = getHistoryPath;
+ exports.getHashPath = getHashPath;
+ exports.default = _emberRuntime.Object.extend({
+ /**
+ @private
+ The browser's `location` object. This is typically equivalent to
+ `window.location`, but may be overridden for testing.
+ @property location
+ @default environment.location
+ */
+ location: _emberEnvironment.environment.location,
+
+ /**
+ @private
+ The browser's `history` object. This is typically equivalent to
+ `window.history`, but may be overridden for testing.
+ @since 1.5.1
+ @property history
+ @default environment.history
+ */
+ history: _emberEnvironment.environment.history,
+
+ /**
+ @private
+ The user agent's global variable. In browsers, this will be `window`.
+ @since 1.11
+ @property global
+ @default window
+ */
+ global: _emberEnvironment.environment.window,
+
+ /**
+ @private
+ The browser's `userAgent`. This is typically equivalent to
+ `navigator.userAgent`, but may be overridden for testing.
+ @since 1.5.1
+ @property userAgent
+ @default environment.history
+ */
+ userAgent: _emberEnvironment.environment.userAgent,
+
+ /**
+ @private
+ This property is used by the router to know whether to cancel the routing
+ setup process, which is needed while we redirect the browser.
+ @since 1.5.1
+ @property cancelRouterSetup
+ @default false
+ */
+ cancelRouterSetup: false,
+
+ /**
+ @private
+ Will be pre-pended to path upon state change.
+ @since 1.5.1
+ @property rootURL
+ @default '/'
+ */
+ rootURL: '/',
+
+ /**
+ Called by the router to instruct the location to do any feature detection
+ necessary. In the case of AutoLocation, we detect whether to use history
+ or hash concrete implementations.
+ @private
+ */
+ detect: function () {
+ var rootURL = this.rootURL;
+
+ (true && !(rootURL.charAt(rootURL.length - 1) === '/') && (0, _emberDebug.assert)('rootURL must end with a trailing forward slash e.g. "/app/"', rootURL.charAt(rootURL.length - 1) === '/'));
+
+
+ var implementation = detectImplementation({
+ location: this.location,
+ history: this.history,
+ userAgent: this.userAgent,
+ rootURL: rootURL,
+ documentMode: this.documentMode,
+ global: this.global
+ });
+
+ if (implementation === false) {
+ (0, _emberMetal.set)(this, 'cancelRouterSetup', true);
+ implementation = 'none';
+ }
+
+ var concrete = (0, _emberUtils.getOwner)(this).lookup('location:' + implementation);
+ (0, _emberMetal.set)(concrete, 'rootURL', rootURL);
+
+ (true && !(!!concrete) && (0, _emberDebug.assert)('Could not find location \'' + implementation + '\'.', !!concrete));
+
+
+ (0, _emberMetal.set)(this, 'concreteImplementation', concrete);
+ },
+
+
+ initState: delegateToConcreteImplementation('initState'),
+ getURL: delegateToConcreteImplementation('getURL'),
+ setURL: delegateToConcreteImplementation('setURL'),
+ replaceURL: delegateToConcreteImplementation('replaceURL'),
+ onUpdateURL: delegateToConcreteImplementation('onUpdateURL'),
+ formatURL: delegateToConcreteImplementation('formatURL'),
+
+ willDestroy: function () {
+ var concreteImplementation = (0, _emberMetal.get)(this, 'concreteImplementation');
+
+ if (concreteImplementation) {
+ concreteImplementation.destroy();
+ }
+ }
+ });
+
+
+ function delegateToConcreteImplementation(methodName) {
+ return function () {
+ var concreteImplementation = (0, _emberMetal.get)(this, 'concreteImplementation');
+ (true && !(!!concreteImplementation) && (0, _emberDebug.assert)('AutoLocation\'s detect() method should be called before calling any other hooks.', !!concreteImplementation));
+
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ return (0, _emberUtils.tryInvoke)(concreteImplementation, methodName, args);
+ };
+ }
+
+ /*
+ Given the browser's `location`, `history` and `userAgent`, and a configured
+ root URL, this function detects whether the browser supports the [History
+ API](https://developer.mozilla.org/en-US/docs/Web/API/History) and returns a
+ string representing the Location object to use based on its determination.
+
+ For example, if the page loads in an evergreen browser, this function would
+ return the string "history", meaning the history API and thus HistoryLocation
+ should be used. If the page is loaded in IE8, it will return the string
+ "hash," indicating that the History API should be simulated by manipulating the
+ hash portion of the location.
+
+ */
+
+ function detectImplementation(options) {
+ var location = options.location;
+ var userAgent = options.userAgent;
+ var history = options.history;
+ var documentMode = options.documentMode;
+ var global = options.global;
+ var rootURL = options.rootURL;
+
+ var implementation = 'none';
+ var cancelRouterSetup = false;
+ var currentPath = (0, _util.getFullPath)(location);
+
+ if ((0, _util.supportsHistory)(userAgent, history)) {
+ var historyPath = getHistoryPath(rootURL, location);
+
+ // If the browser supports history and we have a history path, we can use
+ // the history location with no redirects.
+ if (currentPath === historyPath) {
+ return 'history';
+ } else {
+ if (currentPath.substr(0, 2) === '/#') {
+ history.replaceState({ path: historyPath }, null, historyPath);
+ implementation = 'history';
+ } else {
+ cancelRouterSetup = true;
+ (0, _util.replacePath)(location, historyPath);
+ }
+ }
+ } else if ((0, _util.supportsHashChange)(documentMode, global)) {
+ var hashPath = getHashPath(rootURL, location);
+
+ // Be sure we're using a hashed path, otherwise let's switch over it to so
+ // we start off clean and consistent. We'll count an index path with no
+ // hash as "good enough" as well.
+ if (currentPath === hashPath || currentPath === '/' && hashPath === '/#/') {
+ implementation = 'hash';
+ } else {
+ // Our URL isn't in the expected hash-supported format, so we want to
+ // cancel the router setup and replace the URL to start off clean
+ cancelRouterSetup = true;
+ (0, _util.replacePath)(location, hashPath);
+ }
+ }
+
+ if (cancelRouterSetup) {
+ return false;
+ }
+
+ return implementation;
+ }
+
+ /**
+ @private
+
+ Returns the current path as it should appear for HistoryLocation supported
+ browsers. This may very well differ from the real current path (e.g. if it
+ starts off as a hashed URL)
+ */
+ function getHistoryPath(rootURL, location) {
+ var path = (0, _util.getPath)(location);
+ var hash = (0, _util.getHash)(location);
+ var query = (0, _util.getQuery)(location);
+ var rootURLIndex = path.indexOf(rootURL);
+ var routeHash = void 0,
+ hashParts = void 0;
+
+ (true && !(rootURLIndex === 0) && (0, _emberDebug.assert)('Path ' + path + ' does not start with the provided rootURL ' + rootURL, rootURLIndex === 0));
+
+
+ // By convention, Ember.js routes using HashLocation are required to start
+ // with `#/`. Anything else should NOT be considered a route and should
+ // be passed straight through, without transformation.
+ if (hash.substr(0, 2) === '#/') {
+ // There could be extra hash segments after the route
+ hashParts = hash.substr(1).split('#');
+ // The first one is always the route url
+ routeHash = hashParts.shift();
+
+ // If the path already has a trailing slash, remove the one
+ // from the hashed route so we don't double up.
+ if (path.charAt(path.length - 1) === '/') {
+ routeHash = routeHash.substr(1);
+ }
+
+ // This is the "expected" final order
+ path += routeHash + query;
+
+ if (hashParts.length) {
+ path += '#' + hashParts.join('#');
+ }
+ } else {
+ path += query + hash;
+ }
+
+ return path;
+ }
+
+ /**
+ @private
+
+ Returns the current path as it should appear for HashLocation supported
+ browsers. This may very well differ from the real current path.
+
+ @method _getHashPath
+ */
+ function getHashPath(rootURL, location) {
+ var path = rootURL;
+ var historyPath = getHistoryPath(rootURL, location);
+ var routePath = historyPath.substr(rootURL.length);
+
+ if (routePath !== '') {
+ if (routePath[0] !== '/') {
+ routePath = '/' + routePath;
+ }
+
+ path += '#' + routePath;
+ }
+
+ return path;
+ }
+});
+enifed('ember-routing/location/hash_location', ['exports', 'ember-metal', 'ember-runtime', 'ember-routing/location/api'], function (exports, _emberMetal, _emberRuntime, _api) {
+ 'use strict';
+
+ exports.default = _emberRuntime.Object.extend({
+ implementation: 'hash',
+
+ init: function () {
+ (0, _emberMetal.set)(this, 'location', (0, _emberMetal.get)(this, '_location') || window.location);
+
+ this._hashchangeHandler = undefined;
+ },
+
+
+ /**
+ @private
+ Returns normalized location.hash
+ @since 1.5.1
+ @method getHash
+ */
+ getHash: _api.default._getHash,
+
+ /**
+ Returns the normalized URL, constructed from `location.hash`.
+ e.g. `#/foo` => `/foo` as well as `#/foo#bar` => `/foo#bar`.
+ By convention, hashed paths must begin with a forward slash, otherwise they
+ are not treated as a path so we can distinguish intent.
+ @private
+ @method getURL
+ */
+ getURL: function () {
+ var originalPath = this.getHash().substr(1);
+ var outPath = originalPath;
+
+ if (outPath[0] !== '/') {
+ outPath = '/';
+
+ // Only add the # if the path isn't empty.
+ // We do NOT want `/#` since the ampersand
+ // is only included (conventionally) when
+ // the location.hash has a value
+ if (originalPath) {
+ outPath += '#' + originalPath;
+ }
+ }
+
+ return outPath;
+ },
+
+
+ /**
+ Set the `location.hash` and remembers what was set. This prevents
+ `onUpdateURL` callbacks from triggering when the hash was set by
+ `HashLocation`.
+ @private
+ @method setURL
+ @param path {String}
+ */
+ setURL: function (path) {
+ (0, _emberMetal.get)(this, 'location').hash = path;
+ (0, _emberMetal.set)(this, 'lastSetURL', path);
+ },
+
+
+ /**
+ Uses location.replace to update the url without a page reload
+ or history modification.
+ @private
+ @method replaceURL
+ @param path {String}
+ */
+ replaceURL: function (path) {
+ (0, _emberMetal.get)(this, 'location').replace('#' + path);
+ (0, _emberMetal.set)(this, 'lastSetURL', path);
+ },
+
+
+ /**
+ Register a callback to be invoked when the hash changes. These
+ callbacks will execute when the user presses the back or forward
+ button, but not after `setURL` is invoked.
+ @private
+ @method onUpdateURL
+ @param callback {Function}
+ */
+ onUpdateURL: function (callback) {
+ this._removeEventListener();
+
+ this._hashchangeHandler = _emberMetal.run.bind(this, function () {
+ var path = this.getURL();
+ if ((0, _emberMetal.get)(this, 'lastSetURL') === path) {
+ return;
+ }
+
+ (0, _emberMetal.set)(this, 'lastSetURL', null);
+
+ callback(path);
+ });
+
+ window.addEventListener('hashchange', this._hashchangeHandler);
+ },
+
+
+ /**
+ Given a URL, formats it to be placed into the page as part
+ of an element's `href` attribute.
+ This is used, for example, when using the {{action}} helper
+ to generate a URL based on an event.
+ @private
+ @method formatURL
+ @param url {String}
+ */
+ formatURL: function (url) {
+ return '#' + url;
+ },
+
+
+ /**
+ Cleans up the HashLocation event listener.
+ @private
+ @method willDestroy
+ */
+ willDestroy: function () {
+ this._removeEventListener();
+ },
+ _removeEventListener: function () {
+ if (this._hashchangeHandler) {
+ window.removeEventListener('hashchange', this._hashchangeHandler);
+ }
+ }
+ });
+});
+enifed('ember-routing/location/history_location', ['exports', 'ember-metal', 'ember-runtime', 'ember-routing/location/api'], function (exports, _emberMetal, _emberRuntime, _api) {
+ 'use strict';
+
+ /**
+ @module @ember/routing
+ */
+
+ var popstateFired = false;
+
+ function _uuid() {
+ return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
+ var r, v;
+ r = Math.random() * 16 | 0;
+ v = c === 'x' ? r : r & 3 | 8;
+ return v.toString(16);
+ });
+ }
+
+ /**
+ HistoryLocation implements the location API using the browser's
+ history.pushState API.
+
+ Using `HistoryLocation` results in URLs that are indistinguishable from a
+ standard URL. This relies upon the browser's `history` API.
+
+ Example:
+
+ ```app/router.js
+ Router.map(function() {
+ this.route('posts', function() {
+ this.route('new');
+ });
+ });
+
+ Router.reopen({
+ location: 'history'
+ });
+ ```
+
+ This will result in a posts.new url of `/posts/new`.
+
+ Keep in mind that your server must serve the Ember app at all the routes you
+ define.
+
+ @class HistoryLocation
+ @extends EmberObject
+ @protected
+ */
+ exports.default = _emberRuntime.Object.extend({
+ implementation: 'history',
+
+ init: function () {
+ this._super.apply(this, arguments);
+
+ var base = document.querySelector('base');
+ var baseURL = '';
+ if (base) {
+ baseURL = base.getAttribute('href');
+ }
+
+ (0, _emberMetal.set)(this, 'baseURL', baseURL);
+ (0, _emberMetal.set)(this, 'location', (0, _emberMetal.get)(this, 'location') || window.location);
+
+ this._popstateHandler = undefined;
+ },
+
+
+ /**
+ Used to set state on first call to setURL
+ @private
+ @method initState
+ */
+ initState: function () {
+ var history = (0, _emberMetal.get)(this, 'history') || window.history;
+ (0, _emberMetal.set)(this, 'history', history);
+
+ if (history && 'state' in history) {
+ this.supportsHistory = true;
+ }
+
+ var state = this.getState();
+ var path = this.formatURL(this.getURL());
+ if (state && state.path === path) {
+ // preserve existing state
+ // used for webkit workaround, since there will be no initial popstate event
+ this._previousURL = this.getURL();
+ } else {
+ this.replaceState(path);
+ }
+ },
+
+
+ /**
+ Will be pre-pended to path upon state change
+ @property rootURL
+ @default '/'
+ @private
+ */
+ rootURL: '/',
+
+ /**
+ Returns the current `location.pathname` without `rootURL` or `baseURL`
+ @private
+ @method getURL
+ @return url {String}
+ */
+ getURL: function () {
+ var location = (0, _emberMetal.get)(this, 'location');
+ var path = location.pathname;
+
+ var rootURL = (0, _emberMetal.get)(this, 'rootURL');
+ var baseURL = (0, _emberMetal.get)(this, 'baseURL');
+
+ // remove trailing slashes if they exists
+ rootURL = rootURL.replace(/\/$/, '');
+ baseURL = baseURL.replace(/\/$/, '');
+
+ // remove baseURL and rootURL from start of path
+ var url = path.replace(new RegExp('^' + baseURL + '(?=/|$)'), '').replace(new RegExp('^' + rootURL + '(?=/|$)'), '').replace(/\/\/$/g, '/'); // remove extra slashes
+
+ var search = location.search || '';
+ url += search + this.getHash();
+
+ return url;
+ },
+
+
+ /**
+ Uses `history.pushState` to update the url without a page reload.
+ @private
+ @method setURL
+ @param path {String}
+ */
+ setURL: function (path) {
+ var state = this.getState();
+ path = this.formatURL(path);
+
+ if (!state || state.path !== path) {
+ this.pushState(path);
+ }
+ },
+
+
+ /**
+ Uses `history.replaceState` to update the url without a page reload
+ or history modification.
+ @private
+ @method replaceURL
+ @param path {String}
+ */
+ replaceURL: function (path) {
+ var state = this.getState();
+ path = this.formatURL(path);
+
+ if (!state || state.path !== path) {
+ this.replaceState(path);
+ }
+ },
+
+
+ /**
+ Get the current `history.state`. Checks for if a polyfill is
+ required and if so fetches this._historyState. The state returned
+ from getState may be null if an iframe has changed a window's
+ history.
+ The object returned will contain a `path` for the given state as well
+ as a unique state `id`. The state index will allow the app to distinguish
+ between two states with similar paths but should be unique from one another.
+ @private
+ @method getState
+ @return state {Object}
+ */
+ getState: function () {
+ if (this.supportsHistory) {
+ return (0, _emberMetal.get)(this, 'history').state;
+ }
+
+ return this._historyState;
+ },
+
+
+ /**
+ Pushes a new state.
+ @private
+ @method pushState
+ @param path {String}
+ */
+ pushState: function (path) {
+ var state = { path: path, uuid: _uuid() };
+
+ (0, _emberMetal.get)(this, 'history').pushState(state, null, path);
+
+ this._historyState = state;
+
+ // used for webkit workaround
+ this._previousURL = this.getURL();
+ },
+
+
+ /**
+ Replaces the current state.
+ @private
+ @method replaceState
+ @param path {String}
+ */
+ replaceState: function (path) {
+ var state = { path: path, uuid: _uuid() };
+
+ (0, _emberMetal.get)(this, 'history').replaceState(state, null, path);
+
+ this._historyState = state;
+
+ // used for webkit workaround
+ this._previousURL = this.getURL();
+ },
+
+
+ /**
+ Register a callback to be invoked whenever the browser
+ history changes, including using forward and back buttons.
+ @private
+ @method onUpdateURL
+ @param callback {Function}
+ */
+ onUpdateURL: function (callback) {
+ var _this = this;
+
+ this._removeEventListener();
+
+ this._popstateHandler = function () {
+ // Ignore initial page load popstate event in Chrome
+ if (!popstateFired) {
+ popstateFired = true;
+ if (_this.getURL() === _this._previousURL) {
+ return;
+ }
+ }
+ callback(_this.getURL());
+ };
+
+ window.addEventListener('popstate', this._popstateHandler);
+ },
+
+
+ /**
+ Used when using `{{action}}` helper. The url is always appended to the rootURL.
+ @private
+ @method formatURL
+ @param url {String}
+ @return formatted url {String}
+ */
+ formatURL: function (url) {
+ var rootURL = (0, _emberMetal.get)(this, 'rootURL');
+ var baseURL = (0, _emberMetal.get)(this, 'baseURL');
+
+ if (url !== '') {
+ // remove trailing slashes if they exists
+ rootURL = rootURL.replace(/\/$/, '');
+ baseURL = baseURL.replace(/\/$/, '');
+ } else if (baseURL[0] === '/' && rootURL[0] === '/') {
+ // if baseURL and rootURL both start with a slash
+ // ... remove trailing slash from baseURL if it exists
+ baseURL = baseURL.replace(/\/$/, '');
+ }
+
+ return baseURL + rootURL + url;
+ },
+
+
+ /**
+ Cleans up the HistoryLocation event listener.
+ @private
+ @method willDestroy
+ */
+ willDestroy: function () {
+ this._removeEventListener();
+ },
+
+
+ /**
+ @private
+ Returns normalized location.hash
+ @method getHash
+ */
+ getHash: _api.default._getHash,
+
+ _removeEventListener: function () {
+ if (this._popstateHandler) {
+ window.removeEventListener('popstate', this._popstateHandler);
+ }
+ }
+ });
+});
+enifed('ember-routing/location/none_location', ['exports', 'ember-metal', 'ember-debug', 'ember-runtime'], function (exports, _emberMetal, _emberDebug, _emberRuntime) {
+ 'use strict';
+
+ exports.default = _emberRuntime.Object.extend({
+ implementation: 'none',
+ path: '',
+
+ detect: function () {
+ var rootURL = this.rootURL;
+
+ (true && !(rootURL.charAt(rootURL.length - 1) === '/') && (0, _emberDebug.assert)('rootURL must end with a trailing forward slash e.g. "/app/"', rootURL.charAt(rootURL.length - 1) === '/'));
+ },
+
+
+ /**
+ Will be pre-pended to path.
+ @private
+ @property rootURL
+ @default '/'
+ */
+ rootURL: '/',
+
+ /**
+ Returns the current path without `rootURL`.
+ @private
+ @method getURL
+ @return {String} path
+ */
+ getURL: function () {
+ var path = (0, _emberMetal.get)(this, 'path');
+ var rootURL = (0, _emberMetal.get)(this, 'rootURL');
+
+ // remove trailing slashes if they exists
+ rootURL = rootURL.replace(/\/$/, '');
+
+ // remove rootURL from url
+ return path.replace(new RegExp('^' + rootURL + '(?=/|$)'), '');
+ },
+
+
+ /**
+ Set the path and remembers what was set. Using this method
+ to change the path will not invoke the `updateURL` callback.
+ @private
+ @method setURL
+ @param path {String}
+ */
+ setURL: function (path) {
+ (0, _emberMetal.set)(this, 'path', path);
+ },
+
+
+ /**
+ Register a callback to be invoked when the path changes. These
+ callbacks will execute when the user presses the back or forward
+ button, but not after `setURL` is invoked.
+ @private
+ @method onUpdateURL
+ @param callback {Function}
+ */
+ onUpdateURL: function (callback) {
+ this.updateCallback = callback;
+ },
+
+
+ /**
+ Sets the path and calls the `updateURL` callback.
+ @private
+ @method handleURL
+ @param url {String}
+ */
+ handleURL: function (url) {
+ (0, _emberMetal.set)(this, 'path', url);
+ this.updateCallback(url);
+ },
+
+
+ /**
+ Given a URL, formats it to be placed into the page as part
+ of an element's `href` attribute.
+ This is used, for example, when using the {{action}} helper
+ to generate a URL based on an event.
+ @private
+ @method formatURL
+ @param url {String}
+ @return {String} url
+ */
+ formatURL: function (url) {
+ var rootURL = (0, _emberMetal.get)(this, 'rootURL');
+
+ if (url !== '') {
+ // remove trailing slashes if they exists
+ rootURL = rootURL.replace(/\/$/, '');
+ }
+
+ return rootURL + url;
+ }
+ });
+});
+enifed('ember-routing/location/util', ['exports'], function (exports) {
+ 'use strict';
+
+ exports.getPath = getPath;
+ exports.getQuery = getQuery;
+ exports.getHash = getHash;
+ exports.getFullPath = getFullPath;
+ exports.getOrigin = getOrigin;
+ exports.supportsHashChange = supportsHashChange;
+ exports.supportsHistory = supportsHistory;
+ exports.replacePath = replacePath;
+ /**
+ @private
+
+ Returns the current `location.pathname`, normalized for IE inconsistencies.
+ */
+ function getPath(location) {
+ var pathname = location.pathname;
+ // Various versions of IE/Opera don't always return a leading slash
+ if (pathname[0] !== '/') {
+ pathname = '/' + pathname;
+ }
+
+ return pathname;
+ }
+
+ /**
+ @private
+
+ Returns the current `location.search`.
+ */
+ function getQuery(location) {
+ return location.search;
+ }
+
+ /**
+ @private
+
+ Returns the current `location.hash` by parsing location.href since browsers
+ inconsistently URL-decode `location.hash`.
+
+ Should be passed the browser's `location` object as the first argument.
+
+ https://bugzilla.mozilla.org/show_bug.cgi?id=483304
+ */
+ function getHash(location) {
+ var href = location.href;
+ var hashIndex = href.indexOf('#');
+
+ if (hashIndex === -1) {
+ return '';
+ } else {
+ return href.substr(hashIndex);
+ }
+ }
+
+ function getFullPath(location) {
+ return getPath(location) + getQuery(location) + getHash(location);
+ }
+
+ function getOrigin(location) {
+ var origin = location.origin;
+
+ // Older browsers, especially IE, don't have origin
+ if (!origin) {
+ origin = location.protocol + '//' + location.hostname;
+
+ if (location.port) {
+ origin += ':' + location.port;
+ }
+ }
+
+ return origin;
+ }
+
+ /*
+ `documentMode` only exist in Internet Explorer, and it's tested because IE8 running in
+ IE7 compatibility mode claims to support `onhashchange` but actually does not.
+
+ `global` is an object that may have an `onhashchange` property.
+
+ @private
+ @function supportsHashChange
+ */
+ function supportsHashChange(documentMode, global) {
+ return 'onhashchange' in global && (documentMode === undefined || documentMode > 7);
+ }
+
+ /*
+ `userAgent` is a user agent string. We use user agent testing here, because
+ the stock Android browser is known to have buggy versions of the History API,
+ in some Android versions.
+
+ @private
+ @function supportsHistory
+ */
+ function supportsHistory(userAgent, history) {
+ // Boosted from Modernizr: https://github.com/Modernizr/Modernizr/blob/master/feature-detects/history.js
+ // The stock browser on Android 2.2 & 2.3, and 4.0.x returns positive on history support
+ // Unfortunately support is really buggy and there is no clean way to detect
+ // these bugs, so we fall back to a user agent sniff :(
+
+ // We only want Android 2 and 4.0, stock browser, and not Chrome which identifies
+ // itself as 'Mobile Safari' as well, nor Windows Phone.
+ if ((userAgent.indexOf('Android 2.') !== -1 || userAgent.indexOf('Android 4.0') !== -1) && userAgent.indexOf('Mobile Safari') !== -1 && userAgent.indexOf('Chrome') === -1 && userAgent.indexOf('Windows Phone') === -1) {
+ return false;
+ }
+
+ return !!(history && 'pushState' in history);
+ }
+
+ /**
+ Replaces the current location, making sure we explicitly include the origin
+ to prevent redirecting to a different origin.
+
+ @private
+ */
+ function replacePath(location, path) {
+ location.replace(getOrigin(location) + path);
+ }
+});
+enifed('ember-routing/services/router', ['exports', 'ember-runtime', 'ember-routing/utils'], function (exports, _emberRuntime, _utils) {
+ 'use strict';
+
+ /**
+ The Router service is the public API that provides component/view layer
+ access to the router.
+
+ @public
+ @class RouterService
+ @category ember-routing-router-service
+ */
+ /**
+ @module ember
+ */
+
+ var RouterService = _emberRuntime.Service.extend({
+
+ /**
+ Name of the current route.
+ This property represent the logical name of the route,
+ which is comma separated.
+ For the following router:
+ ```app/router.js
+ Router.map(function() {
+ this.route('about);
+ this.route('blog', function () {
+ this.route('post', { path: ':post_id' });
+ });
+ });
+ ```
+ It will return:
+ * `index` when you visit `/`
+ * `about` when you visit `/about`
+ * `blog.index` when you visit `/blog`
+ * `blog.post` when you visit `/blog/some-post-id`
+ @property currentRouteName
+ @type String
+ @public
+ */
+ currentRouteName: (0, _emberRuntime.readOnly)('_router.currentRouteName'),
+
+ /**
+ Current URL for the application.
+ This property represent the URL path for this route.
+ For the following router:
+ ```app/router.js
+ Router.map(function() {
+ this.route('about);
+ this.route('blog', function () {
+ this.route('post', { path: ':post_id' });
+ });
+ });
+ ```
+ It will return:
+ * `/` when you visit `/`
+ * `/about` when you visit `/about`
+ * `/blog/index` when you visit `/blog`
+ * `/blog/post` when you visit `/blog/some-post-id`
+ @property currentURL
+ @type String
+ @public
+ */
+ currentURL: (0, _emberRuntime.readOnly)('_router.currentURL'),
+
+ /**
+ The `location` property determines the type of URL's that your
+ application will use.
+ The following location types are currently available:
+ * `auto`
+ * `hash`
+ * `history`
+ * `none`
+ @property location
+ @default 'hash'
+ @see {Location}
+ @public
+ */
+ location: (0, _emberRuntime.readOnly)('_router.location'),
+
+ /**
+ The `rootURL` property represents the URL of the root of
+ the application, '/' by default.
+ This prefix is assumed on all routes defined on this app.
+ IF you change the `rootURL` in your environment configuration
+ like so:
+ ```config/environment.js
+ 'use strict';
+ module.exports = function(environment) {
+ let ENV = {
+ modulePrefix: 'router-service',
+ environment,
+ rootURL: '/my-root',
+ …
+ }
+ ]
+ ```
+ This property will return `/my-root`.
+ @property rootURL
+ @default '/'
+ @public
+ */
+ rootURL: (0, _emberRuntime.readOnly)('_router.rootURL'),
+ _router: null,
+
+ transitionTo: function () {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ if ((0, _utils.resemblesURL)(args[0])) {
+ return this._router._doURLTransition('transitionTo', args[0]);
+ }
+
+ var _extractRouteArgs = (0, _utils.extractRouteArgs)(args),
+ routeName = _extractRouteArgs.routeName,
+ models = _extractRouteArgs.models,
+ queryParams = _extractRouteArgs.queryParams;
+
+ var transition = this._router._doTransition(routeName, models, queryParams, true);
+ transition._keepDefaultQueryParamValues = true;
+
+ return transition;
+ },
+ replaceWith: function () /* routeNameOrUrl, ...models, options */{
+ return this.transitionTo.apply(this, arguments).method('replace');
+ },
+ urlFor: function () /* routeName, ...models, options */{
+ var _router;
+
+ return (_router = this._router).generate.apply(_router, arguments);
+ },
+ isActive: function () {
+ for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+ args[_key2] = arguments[_key2];
+ }
+
+ var _extractRouteArgs2 = (0, _utils.extractRouteArgs)(args),
+ routeName = _extractRouteArgs2.routeName,
+ models = _extractRouteArgs2.models,
+ queryParams = _extractRouteArgs2.queryParams;
+
+ var routerMicrolib = this._router._routerMicrolib;
+
+ if (!routerMicrolib.isActiveIntent(routeName, models, null)) {
+ return false;
+ }
+ var hasQueryParams = Object.keys(queryParams).length > 0;
+
+ if (hasQueryParams) {
+ this._router._prepareQueryParams(routeName, models, queryParams, true /* fromRouterService */);
+ return (0, _utils.shallowEqual)(queryParams, routerMicrolib.state.queryParams);
+ }
+
+ return true;
+ }
+ });
+
+ exports.default = RouterService;
+});
+enifed('ember-routing/services/routing', ['exports', 'ember-utils', 'ember-runtime', 'ember-metal'], function (exports, _emberUtils, _emberRuntime, _emberMetal) {
+ 'use strict';
+
+ exports.default = _emberRuntime.Service.extend({
+ router: null,
+
+ targetState: (0, _emberRuntime.readOnly)('router.targetState'),
+ currentState: (0, _emberRuntime.readOnly)('router.currentState'),
+ currentRouteName: (0, _emberRuntime.readOnly)('router.currentRouteName'),
+ currentPath: (0, _emberRuntime.readOnly)('router.currentPath'),
+
+ hasRoute: function (routeName) {
+ return (0, _emberMetal.get)(this, 'router').hasRoute(routeName);
+ },
+ transitionTo: function (routeName, models, queryParams, shouldReplace) {
+ var router = (0, _emberMetal.get)(this, 'router');
+
+ var transition = router._doTransition(routeName, models, queryParams);
+
+ if (shouldReplace) {
+ transition.method('replace');
+ }
+
+ return transition;
+ },
+ normalizeQueryParams: function (routeName, models, queryParams) {
+ (0, _emberMetal.get)(this, 'router')._prepareQueryParams(routeName, models, queryParams);
+ },
+ generateURL: function (routeName, models, queryParams) {
+ var router = (0, _emberMetal.get)(this, 'router');
+ // return early when the router microlib is not present, which is the case for {{link-to}} in integration tests
+ if (!router._routerMicrolib) {
+ return;
+ }
+
+ var visibleQueryParams = {};
+ if (queryParams) {
+ (0, _emberUtils.assign)(visibleQueryParams, queryParams);
+ this.normalizeQueryParams(routeName, models, visibleQueryParams);
+ }
+
+ return router.generate.apply(router, [routeName].concat(models, [{ queryParams: visibleQueryParams }]));
+ },
+ isActiveForRoute: function (contexts, queryParams, routeName, routerState, isCurrentWhenSpecified) {
+ var router = (0, _emberMetal.get)(this, 'router');
+
+ var handlers = router._routerMicrolib.recognizer.handlersFor(routeName);
+ var leafName = handlers[handlers.length - 1].handler;
+ var maximumContexts = numberOfContextsAcceptedByHandler(routeName, handlers);
+
+ // NOTE: any ugliness in the calculation of activeness is largely
+ // due to the fact that we support automatic normalizing of
+ // `resource` -> `resource.index`, even though there might be
+ // dynamic segments / query params defined on `resource.index`
+ // which complicates (and makes somewhat ambiguous) the calculation
+ // of activeness for links that link to `resource` instead of
+ // directly to `resource.index`.
+
+ // if we don't have enough contexts revert back to full route name
+ // this is because the leaf route will use one of the contexts
+ if (contexts.length > maximumContexts) {
+ routeName = leafName;
+ }
+
+ return routerState.isActiveIntent(routeName, contexts, queryParams, !isCurrentWhenSpecified);
+ }
+ });
+
+
+ function numberOfContextsAcceptedByHandler(handler, handlerInfos) {
+ var req = 0;
+ for (var i = 0; i < handlerInfos.length; i++) {
+ req += handlerInfos[i].names.length;
+ if (handlerInfos[i].handler === handler) {
+ break;
+ }
+ }
+
+ return req;
+ }
+});
+enifed('ember-routing/system/cache', ['exports', 'ember-runtime'], function (exports, _emberRuntime) {
+ 'use strict';
+
+ exports.default = _emberRuntime.Object.extend({
+ init: function () {
+ this.cache = Object.create(null);
+ },
+ has: function (bucketKey) {
+ return !!this.cache[bucketKey];
+ },
+ stash: function (bucketKey, key, value) {
+ var bucket = this.cache[bucketKey];
+
+ if (!bucket) {
+ bucket = this.cache[bucketKey] = Object.create(null);
+ }
+
+ bucket[key] = value;
+ },
+ lookup: function (bucketKey, prop, defaultValue) {
+ var cache = this.cache;
+ if (!this.has(bucketKey)) {
+ return defaultValue;
+ }
+
+ var bucket = cache[bucketKey];
+ if (prop in bucket && bucket[prop] !== undefined) {
+ return bucket[prop];
+ } else {
+ return defaultValue;
+ }
+ }
+ });
+});
+enifed("ember-routing/system/controller_for", ["exports"], function (exports) {
+ "use strict";
+
+ exports.default = controllerFor;
+ /**
+ @module ember
+ */
+
+ /**
+ Finds a controller instance.
+
+ @for Ember
+ @method controllerFor
+ @private
+ */
+ function controllerFor(container, controllerName, lookupOptions) {
+ return container.lookup("controller:" + controllerName, lookupOptions);
+ }
+});
+enifed('ember-routing/system/dsl', ['exports', 'ember-babel', 'ember-utils', 'ember-debug'], function (exports, _emberBabel, _emberUtils, _emberDebug) {
+ 'use strict';
+
+ var uuid = 0;
+
+ var DSL = function () {
+ function DSL(name, options) {
+ (0, _emberBabel.classCallCheck)(this, DSL);
+
+ this.parent = name;
+ this.enableLoadingSubstates = options && options.enableLoadingSubstates;
+ this.matches = [];
+ this.explicitIndex = undefined;
+ this.options = options;
+ }
+
+ DSL.prototype.route = function route(name) {
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+ var callback = arguments[2];
+
+ var dummyErrorRoute = '/_unused_dummy_error_path_route_' + name + '/:error';
+ if (arguments.length === 2 && typeof options === 'function') {
+ callback = options;
+ options = {};
+ }
+
+ (true && !(function () {
+ if (options.overrideNameAssertion === true) {
+ return true;
+ }
+
+ return ['array', 'basic', 'object', 'application'].indexOf(name) === -1;
+ }()) && (0, _emberDebug.assert)('\'' + name + '\' cannot be used as a route name.', function () {
+ if (options.overrideNameAssertion === true) {
+ return true;
+ }return ['array', 'basic', 'object', 'application'].indexOf(name) === -1;
+ }()));
+
+
+ if (this.enableLoadingSubstates) {
+ createRoute(this, name + '_loading', { resetNamespace: options.resetNamespace });
+ createRoute(this, name + '_error', { resetNamespace: options.resetNamespace, path: dummyErrorRoute });
+ }
+
+ if (callback) {
+ var fullName = getFullName(this, name, options.resetNamespace);
+ var dsl = new DSL(fullName, this.options);
+
+ createRoute(dsl, 'loading');
+ createRoute(dsl, 'error', { path: dummyErrorRoute });
+
+ callback.call(dsl);
+
+ createRoute(this, name, options, dsl.generate());
+ } else {
+ createRoute(this, name, options);
+ }
+ };
+
+ DSL.prototype.push = function push(url, name, callback, serialize) {
+ var parts = name.split('.');
+
+ if (this.options.engineInfo) {
+ var localFullName = name.slice(this.options.engineInfo.fullName.length + 1);
+ var routeInfo = (0, _emberUtils.assign)({ localFullName: localFullName }, this.options.engineInfo);
+
+ if (serialize) {
+ routeInfo.serializeMethod = serialize;
+ }
+
+ this.options.addRouteForEngine(name, routeInfo);
+ } else if (serialize) {
+ throw new Error('Defining a route serializer on route \'' + name + '\' outside an Engine is not allowed.');
+ }
+
+ if (url === '' || url === '/' || parts[parts.length - 1] === 'index') {
+ this.explicitIndex = true;
+ }
+
+ this.matches.push(url, name, callback);
+ };
+
+ DSL.prototype.generate = function generate() {
+ var dslMatches = this.matches;
+
+ if (!this.explicitIndex) {
+ this.route('index', { path: '/' });
+ }
+
+ return function (match) {
+ for (var i = 0; i < dslMatches.length; i += 3) {
+ match(dslMatches[i]).to(dslMatches[i + 1], dslMatches[i + 2]);
+ }
+ };
+ };
+
+ DSL.prototype.mount = function mount(_name) {
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ var engineRouteMap = this.options.resolveRouteMap(_name);
+ var name = _name;
+
+ if (options.as) {
+ name = options.as;
+ }
+
+ var fullName = getFullName(this, name, options.resetNamespace);
+
+ var engineInfo = {
+ name: _name,
+ instanceId: uuid++,
+ mountPoint: fullName,
+ fullName: fullName
+ };
+
+ var path = options.path;
+
+ if (typeof path !== 'string') {
+ path = '/' + name;
+ }
+
+ var callback = void 0;
+ var dummyErrorRoute = '/_unused_dummy_error_path_route_' + name + '/:error';
+ if (engineRouteMap) {
+ var shouldResetEngineInfo = false;
+ var oldEngineInfo = this.options.engineInfo;
+ if (oldEngineInfo) {
+ shouldResetEngineInfo = true;
+ this.options.engineInfo = engineInfo;
+ }
+
+ var optionsForChild = (0, _emberUtils.assign)({ engineInfo: engineInfo }, this.options);
+ var childDSL = new DSL(fullName, optionsForChild);
+
+ createRoute(childDSL, 'loading');
+ createRoute(childDSL, 'error', { path: dummyErrorRoute });
+
+ engineRouteMap.class.call(childDSL);
+
+ callback = childDSL.generate();
+
+ if (shouldResetEngineInfo) {
+ this.options.engineInfo = oldEngineInfo;
+ }
+ }
+
+ var localFullName = 'application';
+ var routeInfo = (0, _emberUtils.assign)({ localFullName: localFullName }, engineInfo);
+
+ if (this.enableLoadingSubstates) {
+ // These values are important to register the loading routes under their
+ // proper names for the Router and within the Engine's registry.
+ var substateName = name + '_loading';
+ var _localFullName = 'application_loading';
+ var _routeInfo = (0, _emberUtils.assign)({ localFullName: _localFullName }, engineInfo);
+ createRoute(this, substateName, { resetNamespace: options.resetNamespace });
+ this.options.addRouteForEngine(substateName, _routeInfo);
+
+ substateName = name + '_error';
+ _localFullName = 'application_error';
+ _routeInfo = (0, _emberUtils.assign)({ localFullName: _localFullName }, engineInfo);
+ createRoute(this, substateName, { resetNamespace: options.resetNamespace, path: dummyErrorRoute });
+ this.options.addRouteForEngine(substateName, _routeInfo);
+ }
+
+ this.options.addRouteForEngine(fullName, routeInfo);
+
+ this.push(path, fullName, callback);
+ };
+
+ return DSL;
+ }();
+
+ exports.default = DSL;
+
+
+ function canNest(dsl) {
+ return dsl.parent !== 'application';
+ }
+
+ function getFullName(dsl, name, resetNamespace) {
+ if (canNest(dsl) && resetNamespace !== true) {
+ return dsl.parent + '.' + name;
+ } else {
+ return name;
+ }
+ }
+
+ function createRoute(dsl, name) {
+ var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
+ var callback = arguments[3];
+
+ var fullName = getFullName(dsl, name, options.resetNamespace);
+
+ if (typeof options.path !== 'string') {
+ options.path = '/' + name;
+ }
+
+ dsl.push(options.path, fullName, callback, options.serialize);
+ }
+
+ DSL.map = function (callback) {
+ var dsl = new DSL();
+ callback.call(dsl);
+ return dsl;
+ };
+});
+enifed('ember-routing/system/generate_controller', ['exports', 'ember-metal', 'ember-debug'], function (exports, _emberMetal, _emberDebug) {
+ 'use strict';
+
+ exports.generateControllerFactory = generateControllerFactory;
+ exports.default = generateController;
+
+ /**
+ @module ember
+ */
+
+ /**
+ Generates a controller factory
+
+ @for Ember
+ @method generateControllerFactory
+ @private
+ */
+
+ function generateControllerFactory(owner, controllerName) {
+ var Factory = owner.factoryFor('controller:basic').class;
+
+ Factory = Factory.extend({
+ toString: function () {
+ return '(generated ' + controllerName + ' controller)';
+ }
+ });
+
+ var fullName = 'controller:' + controllerName;
+
+ owner.register(fullName, Factory);
+
+ return Factory;
+ }
+
+ /**
+ Generates and instantiates a controller extending from `controller:basic`
+ if present, or `Controller` if not.
+
+ @for Ember
+ @method generateController
+ @private
+ @since 1.3.0
+ */
+ function generateController(owner, controllerName) {
+ generateControllerFactory(owner, controllerName);
+
+ var fullName = 'controller:' + controllerName;
+ var instance = owner.lookup(fullName);
+
+ if (true) {
+ if ((0, _emberMetal.get)(instance, 'namespace.LOG_ACTIVE_GENERATION')) {
+ (0, _emberDebug.info)('generated -> ' + fullName, { fullName: fullName });
+ }
+ }
+
+ return instance;
+ }
+});
+enifed('ember-routing/system/query_params', ['exports', 'ember-runtime'], function (exports, _emberRuntime) {
+ 'use strict';
+
+ exports.default = _emberRuntime.Object.extend({
+ isQueryParams: true,
+ values: null
+ });
+});
+enifed('ember-routing/system/route', ['exports', 'ember-utils', 'ember-metal', 'ember-debug', 'ember-runtime', 'ember-routing/system/generate_controller', 'ember-routing/utils'], function (exports, _emberUtils, _emberMetal, _emberDebug, _emberRuntime, _generate_controller, _utils) {
+ 'use strict';
+
+ exports.defaultSerialize = defaultSerialize;
+ exports.hasDefaultSerialize = hasDefaultSerialize;
+
+
+ function K() {
+ return this;
+ }
+
+ function defaultSerialize(model, params) {
+ if (params.length < 1 || !model) {
+ return;
+ }
+
+ var object = {};
+
+ if (params.length === 1) {
+ var name = params[0];
+ if (name in model) {
+ object[name] = (0, _emberMetal.get)(model, name);
+ } else if (/_id$/.test(name)) {
+ object[name] = (0, _emberMetal.get)(model, 'id');
+ }
+ } else {
+ object = (0, _emberMetal.getProperties)(model, params);
+ }
+
+ return object;
+ }
+
+ var DEFAULT_SERIALIZE = (0, _emberUtils.symbol)('DEFAULT_SERIALIZE');
+
+ defaultSerialize[DEFAULT_SERIALIZE] = true;
+
+ function hasDefaultSerialize(route) {
+ return !!route.serialize[DEFAULT_SERIALIZE];
+ }
+
+ /**
+ @module @ember/routing
+ */
+
+ /**
+ The `Route` class is used to define individual routes. Refer to
+ the [routing guide](https://emberjs.com/guides/routing/) for documentation.
+
+ @class Route
+ @extends EmberObject
+ @uses ActionHandler
+ @uses Evented
+ @since 1.0.0
+ @public
+ */
+ var Route = _emberRuntime.Object.extend(_emberRuntime.ActionHandler, _emberRuntime.Evented, {
+ /**
+ Configuration hash for this route's queryParams. The possible
+ configuration options and their defaults are as follows
+ (assuming a query param whose controller property is `page`):
+ ```javascript
+ queryParams: {
+ page: {
+ // By default, controller query param properties don't
+ // cause a full transition when they are changed, but
+ // rather only cause the URL to update. Setting
+ // `refreshModel` to true will cause an "in-place"
+ // transition to occur, whereby the model hooks for
+ // this route (and any child routes) will re-fire, allowing
+ // you to reload models (e.g., from the server) using the
+ // updated query param values.
+ refreshModel: false,
+ // By default, changes to controller query param properties
+ // cause the URL to update via `pushState`, which means an
+ // item will be added to the browser's history, allowing
+ // you to use the back button to restore the app to the
+ // previous state before the query param property was changed.
+ // Setting `replace` to true will use `replaceState` (or its
+ // hash location equivalent), which causes no browser history
+ // item to be added. This options name and default value are
+ // the same as the `link-to` helper's `replace` option.
+ replace: false,
+ // By default, the query param URL key is the same name as
+ // the controller property name. Use `as` to specify a
+ // different URL key.
+ as: 'page'
+ }
+ }
+ ```
+ @property queryParams
+ @for Route
+ @type Object
+ @since 1.6.0
+ @public
+ */
+ queryParams: {},
+
+ _setRouteName: function (name) {
+ this.routeName = name;
+ this.fullRouteName = getEngineRouteName((0, _emberUtils.getOwner)(this), name);
+ },
+
+
+ /**
+ @private
+ @property _qp
+ */
+ _qp: (0, _emberMetal.computed)(function () {
+ var _this = this;
+
+ var combinedQueryParameterConfiguration = void 0;
+
+ var controllerName = this.controllerName || this.routeName;
+ var owner = (0, _emberUtils.getOwner)(this);
+ var controller = owner.lookup('controller:' + controllerName);
+ var queryParameterConfiguraton = (0, _emberMetal.get)(this, 'queryParams');
+ var hasRouterDefinedQueryParams = Object.keys(queryParameterConfiguraton).length > 0;
+
+ if (controller) {
+ // the developer has authored a controller class in their application for
+ // this route find its query params and normalize their object shape them
+ // merge in the query params for the route. As a mergedProperty,
+ // Route#queryParams is always at least `{}`
+
+ var controllerDefinedQueryParameterConfiguration = (0, _emberMetal.get)(controller, 'queryParams') || {};
+ var normalizedControllerQueryParameterConfiguration = (0, _utils.normalizeControllerQueryParams)(controllerDefinedQueryParameterConfiguration);
+ combinedQueryParameterConfiguration = mergeEachQueryParams(normalizedControllerQueryParameterConfiguration, queryParameterConfiguraton);
+ } else if (hasRouterDefinedQueryParams) {
+ // the developer has not defined a controller but *has* supplied route query params.
+ // Generate a class for them so we can later insert default values
+ controller = (0, _generate_controller.default)(owner, controllerName);
+ combinedQueryParameterConfiguration = queryParameterConfiguraton;
+ }
+
+ var qps = [];
+ var map = {};
+ var propertyNames = [];
+
+ for (var propName in combinedQueryParameterConfiguration) {
+ if (!combinedQueryParameterConfiguration.hasOwnProperty(propName)) {
+ continue;
+ }
+
+ // to support the dubious feature of using unknownProperty
+ // on queryParams configuration
+ if (propName === 'unknownProperty' || propName === '_super') {
+ // possible todo: issue deprecation warning?
+ continue;
+ }
+
+ var desc = combinedQueryParameterConfiguration[propName];
+ var scope = desc.scope || 'model';
+ var parts = void 0;
+
+ if (scope === 'controller') {
+ parts = [];
+ }
+
+ var urlKey = desc.as || this.serializeQueryParamKey(propName);
+ var defaultValue = (0, _emberMetal.get)(controller, propName);
+
+ if (Array.isArray(defaultValue)) {
+ defaultValue = (0, _emberRuntime.A)(defaultValue.slice());
+ }
+
+ var type = desc.type || (0, _emberRuntime.typeOf)(defaultValue);
+
+ var defaultValueSerialized = this.serializeQueryParam(defaultValue, urlKey, type);
+ var scopedPropertyName = controllerName + ':' + propName;
+ var qp = {
+ undecoratedDefaultValue: (0, _emberMetal.get)(controller, propName),
+ defaultValue: defaultValue,
+ serializedDefaultValue: defaultValueSerialized,
+ serializedValue: defaultValueSerialized,
+
+ type: type,
+ urlKey: urlKey,
+ prop: propName,
+ scopedPropertyName: scopedPropertyName,
+ controllerName: controllerName,
+ route: this,
+ parts: parts, // provided later when stashNames is called if 'model' scope
+ values: null, // provided later when setup is called. no idea why.
+ scope: scope
+ };
+
+ map[propName] = map[urlKey] = map[scopedPropertyName] = qp;
+ qps.push(qp);
+ propertyNames.push(propName);
+ }
+
+ return {
+ qps: qps,
+ map: map,
+ propertyNames: propertyNames,
+ states: {
+ /*
+ Called when a query parameter changes in the URL, this route cares
+ about that query parameter, but the route is not currently
+ in the active route hierarchy.
+ */
+ inactive: function (prop, value) {
+ var qp = map[prop];
+ _this._qpChanged(prop, value, qp);
+ },
+ /*
+ Called when a query parameter changes in the URL, this route cares
+ about that query parameter, and the route is currently
+ in the active route hierarchy.
+ */
+ active: function (prop, value) {
+ var qp = map[prop];
+ _this._qpChanged(prop, value, qp);
+ return _this._activeQPChanged(qp, value);
+ },
+ /*
+ Called when a value of a query parameter this route handles changes in a controller
+ and the route is currently in the active route hierarchy.
+ */
+ allowOverrides: function (prop, value) {
+ var qp = map[prop];
+ _this._qpChanged(prop, value, qp);
+ return _this._updatingQPChanged(qp);
+ }
+ }
+ };
+ }),
+
+ /**
+ @private
+ @property _names
+ */
+ _names: null,
+
+ _stashNames: function (handlerInfo, dynamicParent) {
+ if (this._names) {
+ return;
+ }
+ var names = this._names = handlerInfo._names;
+
+ if (!names.length) {
+ handlerInfo = dynamicParent;
+ names = handlerInfo && handlerInfo._names || [];
+ }
+
+ var qps = (0, _emberMetal.get)(this, '_qp.qps');
+
+ var namePaths = new Array(names.length);
+ for (var a = 0; a < names.length; ++a) {
+ namePaths[a] = handlerInfo.name + '.' + names[a];
+ }
+
+ for (var i = 0; i < qps.length; ++i) {
+ var qp = qps[i];
+ if (qp.scope === 'model') {
+ qp.parts = namePaths;
+ }
+ }
+ },
+ _activeQPChanged: function (qp, value) {
+ this.router._activeQPChanged(qp.scopedPropertyName, value);
+ },
+ _updatingQPChanged: function (qp) {
+ this.router._updatingQPChanged(qp.urlKey);
+ },
+
+
+ mergedProperties: ['queryParams'],
+
+ paramsFor: function (name) {
+ var _this2 = this;
+
+ var route = (0, _emberUtils.getOwner)(this).lookup('route:' + name);
+
+ if (!route) {
+ return {};
+ }
+
+ var transition = this.router._routerMicrolib.activeTransition;
+ var state = transition ? transition.state : this.router._routerMicrolib.state;
+
+ var fullName = route.fullRouteName;
+ var params = (0, _emberUtils.assign)({}, state.params[fullName]);
+ var queryParams = getQueryParamsFor(route, state);
+
+ return Object.keys(queryParams).reduce(function (params, key) {
+ (true && !(!params[key]) && (0, _emberDebug.assert)('The route \'' + _this2.routeName + '\' has both a dynamic segment and query param with name \'' + key + '\'. Please rename one to avoid collisions.', !params[key]));
+
+ params[key] = queryParams[key];
+ return params;
+ }, params);
+ },
+ serializeQueryParamKey: function (controllerPropertyName) {
+ return controllerPropertyName;
+ },
+ serializeQueryParam: function (value, urlKey, defaultValueType) {
+ // urlKey isn't used here, but anyone overriding
+ // can use it to provide serialization specific
+ // to a certain query param.
+ return this.router._serializeQueryParam(value, defaultValueType);
+ },
+ deserializeQueryParam: function (value, urlKey, defaultValueType) {
+ // urlKey isn't used here, but anyone overriding
+ // can use it to provide deserialization specific
+ // to a certain query param.
+ return this.router._deserializeQueryParam(value, defaultValueType);
+ },
+ _optionsForQueryParam: function (qp) {
+ return (0, _emberMetal.get)(this, 'queryParams.' + qp.urlKey) || (0, _emberMetal.get)(this, 'queryParams.' + qp.prop) || {};
+ },
+
+
+ /**
+ A hook you can use to reset controller values either when the model
+ changes or the route is exiting.
+ ```app/routes/articles.js
+ import Route from '@ember/routing/route';
+ export default Route.extend({
+ resetController(controller, isExiting, transition) {
+ if (isExiting && transition.targetName !== 'error') {
+ controller.set('page', 1);
+ }
+ }
+ });
+ ```
+ @method resetController
+ @param {Controller} controller instance
+ @param {Boolean} isExiting
+ @param {Object} transition
+ @since 1.7.0
+ @public
+ */
+ resetController: K,
+
+ exit: function () {
+ this.deactivate();
+ this.trigger('deactivate');
+ this.teardownViews();
+ },
+ _reset: function (isExiting, transition) {
+ var controller = this.controller;
+ controller._qpDelegate = (0, _emberMetal.get)(this, '_qp.states.inactive');
+
+ this.resetController(controller, isExiting, transition);
+ },
+ enter: function () {
+ this.connections = [];
+ this.activate();
+ this.trigger('activate');
+ },
+
+
+ /**
+ The name of the template to use by default when rendering this routes
+ template.
+ ```app/routes/posts/list.js
+ import Route from '@ember/routing/route';
+ export default Route.extend({
+ templateName: 'posts/list'
+ });
+ ```
+ ```app/routes/posts/index.js
+ import PostsList from '../posts/list';
+ export default PostsList.extend();
+ ```
+ ```app/routes/posts/archived.js
+ import PostsList from '../posts/list';
+ export default PostsList.extend();
+ ```
+ @property templateName
+ @type String
+ @default null
+ @since 1.4.0
+ @public
+ */
+ templateName: null,
+
+ /**
+ The name of the controller to associate with this route.
+ By default, Ember will lookup a route's controller that matches the name
+ of the route (i.e. `App.PostController` for `App.PostRoute`). However,
+ if you would like to define a specific controller to use, you can do so
+ using this property.
+ This is useful in many ways, as the controller specified will be:
+ * passed to the `setupController` method.
+ * used as the controller for the template being rendered by the route.
+ * returned from a call to `controllerFor` for the route.
+ @property controllerName
+ @type String
+ @default null
+ @since 1.4.0
+ @public
+ */
+ controllerName: null,
+
+ /**
+ The `willTransition` action is fired at the beginning of any
+ attempted transition with a `Transition` object as the sole
+ argument. This action can be used for aborting, redirecting,
+ or decorating the transition from the currently active routes.
+ A good example is preventing navigation when a form is
+ half-filled out:
+ ```app/routes/contact-form.js
+ import Route from '@ember/routing/route';
+ export default Route.extend({
+ actions: {
+ willTransition(transition) {
+ if (this.controller.get('userHasEnteredData')) {
+ this.controller.displayNavigationConfirm();
+ transition.abort();
+ }
+ }
+ }
+ });
+ ```
+ You can also redirect elsewhere by calling
+ `this.transitionTo('elsewhere')` from within `willTransition`.
+ Note that `willTransition` will not be fired for the
+ redirecting `transitionTo`, since `willTransition` doesn't
+ fire when there is already a transition underway. If you want
+ subsequent `willTransition` actions to fire for the redirecting
+ transition, you must first explicitly call
+ `transition.abort()`.
+ To allow the `willTransition` event to continue bubbling to the parent
+ route, use `return true;`. When the `willTransition` method has a
+ return value of `true` then the parent route's `willTransition` method
+ will be fired, enabling "bubbling" behavior for the event.
+ @event willTransition
+ @param {Transition} transition
+ @since 1.0.0
+ @public
+ */
+
+ /**
+ The `didTransition` action is fired after a transition has
+ successfully been completed. This occurs after the normal model
+ hooks (`beforeModel`, `model`, `afterModel`, `setupController`)
+ have resolved. The `didTransition` action has no arguments,
+ however, it can be useful for tracking page views or resetting
+ state on the controller.
+ ```app/routes/login.js
+ import Route from '@ember/routing/route';
+ export default Route.extend({
+ actions: {
+ didTransition() {
+ this.controller.get('errors.base').clear();
+ return true; // Bubble the didTransition event
+ }
+ }
+ });
+ ```
+ @event didTransition
+ @since 1.2.0
+ @public
+ */
+
+ /**
+ The `loading` action is fired on the route when a route's `model`
+ hook returns a promise that is not already resolved. The current
+ `Transition` object is the first parameter and the route that
+ triggered the loading event is the second parameter.
+ ```app/routes/application.js
+ import Route from '@ember/routing/route';
+ export default Route.extend({
+ actions: {
+ loading(transition, route) {
+ let controller = this.controllerFor('foo');
+ controller.set('currentlyLoading', true);
+ transition.finally(function() {
+ controller.set('currentlyLoading', false);
+ });
+ }
+ }
+ });
+ ```
+ @event loading
+ @param {Transition} transition
+ @param {Route} route The route that triggered the loading event
+ @since 1.2.0
+ @public
+ */
+
+ /**
+ When attempting to transition into a route, any of the hooks
+ may return a promise that rejects, at which point an `error`
+ action will be fired on the partially-entered routes, allowing
+ for per-route error handling logic, or shared error handling
+ logic defined on a parent route.
+ Here is an example of an error handler that will be invoked
+ for rejected promises from the various hooks on the route,
+ as well as any unhandled errors from child routes:
+ ```app/routes/admin.js
+ import { reject } from 'rsvp';
+ import Route from '@ember/routing/route';
+ export default Route.extend({
+ beforeModel() {
+ return reject('bad things!');
+ },
+ actions: {
+ error(error, transition) {
+ // Assuming we got here due to the error in `beforeModel`,
+ // we can expect that error === "bad things!",
+ // but a promise model rejecting would also
+ // call this hook, as would any errors encountered
+ // in `afterModel`.
+ // The `error` hook is also provided the failed
+ // `transition`, which can be stored and later
+ // `.retry()`d if desired.
+ this.transitionTo('login');
+ }
+ }
+ });
+ ```
+ `error` actions that bubble up all the way to `ApplicationRoute`
+ will fire a default error handler that logs the error. You can
+ specify your own global default error handler by overriding the
+ `error` handler on `ApplicationRoute`:
+ ```app/routes/application.js
+ import Route from '@ember/routing/route';
+ export default Route.extend({
+ actions: {
+ error(error, transition) {
+ this.controllerFor('banner').displayError(error.message);
+ }
+ }
+ });
+ ```
+ @event error
+ @param {Error} error
+ @param {Transition} transition
+ @since 1.0.0
+ @public
+ */
+
+ /**
+ This event is triggered when the router enters the route. It is
+ not executed when the model for the route changes.
+ ```app/routes/application.js
+ import { on } from '@ember/object/evented';
+ import Route from '@ember/routing/route';
+ export default Route.extend({
+ collectAnalytics: on('activate', function(){
+ collectAnalytics();
+ })
+ });
+ ```
+ @event activate
+ @since 1.9.0
+ @public
+ */
+
+ /**
+ This event is triggered when the router completely exits this
+ route. It is not executed when the model for the route changes.
+ ```app/routes/index.js
+ import { on } from '@ember/object/evented';
+ import Route from '@ember/routing/route';
+ export default Route.extend({
+ trackPageLeaveAnalytics: on('deactivate', function(){
+ trackPageLeaveAnalytics();
+ })
+ });
+ ```
+ @event deactivate
+ @since 1.9.0
+ @public
+ */
+
+ /**
+ The controller associated with this route.
+ Example
+ ```app/routes/form.js
+ import Route from '@ember/routing/route';
+ export default Route.extend({
+ actions: {
+ willTransition(transition) {
+ if (this.controller.get('userHasEnteredData') &&
+ !confirm('Are you sure you want to abandon progress?')) {
+ transition.abort();
+ } else {
+ // Bubble the `willTransition` action so that
+ // parent routes can decide whether or not to abort.
+ return true;
+ }
+ }
+ }
+ });
+ ```
+ @property controller
+ @type Controller
+ @since 1.6.0
+ @public
+ */
+
+ actions: {
+ queryParamsDidChange: function (changed, totalPresent, removed) {
+ var qpMap = (0, _emberMetal.get)(this, '_qp').map;
+
+ var totalChanged = Object.keys(changed).concat(Object.keys(removed));
+ for (var i = 0; i < totalChanged.length; ++i) {
+ var qp = qpMap[totalChanged[i]];
+ if (qp && (0, _emberMetal.get)(this._optionsForQueryParam(qp), 'refreshModel') && this.router.currentState) {
+ this.refresh();
+ break;
+ }
+ }
+
+ return true;
+ },
+ finalizeQueryParamChange: function (params, finalParams, transition) {
+ if (this.fullRouteName !== 'application') {
+ return true;
+ }
+
+ // Transition object is absent for intermediate transitions.
+ if (!transition) {
+ return;
+ }
+
+ var handlerInfos = transition.state.handlerInfos;
+ var router = this.router;
+ var qpMeta = router._queryParamsFor(handlerInfos);
+ var changes = router._qpUpdates;
+ var replaceUrl = void 0;
+
+ (0, _utils.stashParamNames)(router, handlerInfos);
+
+ for (var i = 0; i < qpMeta.qps.length; ++i) {
+ var qp = qpMeta.qps[i];
+ var route = qp.route;
+ var controller = route.controller;
+ var presentKey = qp.urlKey in params && qp.urlKey;
+
+ // Do a reverse lookup to see if the changed query
+ // param URL key corresponds to a QP property on
+ // this controller.
+ var value = void 0,
+ svalue = void 0;
+ if (changes && qp.urlKey in changes) {
+ // Value updated in/before setupController
+ value = (0, _emberMetal.get)(controller, qp.prop);
+ svalue = route.serializeQueryParam(value, qp.urlKey, qp.type);
+ } else {
+ if (presentKey) {
+ svalue = params[presentKey];
+
+ if (svalue !== undefined) {
+ value = route.deserializeQueryParam(svalue, qp.urlKey, qp.type);
+ }
+ } else {
+ // No QP provided; use default value.
+ svalue = qp.serializedDefaultValue;
+ value = copyDefaultValue(qp.defaultValue);
+ }
+ }
+
+ controller._qpDelegate = (0, _emberMetal.get)(route, '_qp.states.inactive');
+
+ var thisQueryParamChanged = svalue !== qp.serializedValue;
+ if (thisQueryParamChanged) {
+ if (transition.queryParamsOnly && replaceUrl !== false) {
+ var options = route._optionsForQueryParam(qp);
+ var replaceConfigValue = (0, _emberMetal.get)(options, 'replace');
+ if (replaceConfigValue) {
+ replaceUrl = true;
+ } else if (replaceConfigValue === false) {
+ // Explicit pushState wins over any other replaceStates.
+ replaceUrl = false;
+ }
+ }
+
+ (0, _emberMetal.set)(controller, qp.prop, value);
+ }
+
+ // Stash current serialized value of controller.
+ qp.serializedValue = svalue;
+
+ var thisQueryParamHasDefaultValue = qp.serializedDefaultValue === svalue;
+ if (!thisQueryParamHasDefaultValue || transition._keepDefaultQueryParamValues) {
+ finalParams.push({
+ value: svalue,
+ visible: true,
+ key: presentKey || qp.urlKey
+ });
+ }
+ }
+
+ if (replaceUrl) {
+ transition.method('replace');
+ }
+
+ qpMeta.qps.forEach(function (qp) {
+ var routeQpMeta = (0, _emberMetal.get)(qp.route, '_qp');
+ var finalizedController = qp.route.controller;
+ finalizedController._qpDelegate = (0, _emberMetal.get)(routeQpMeta, 'states.active');
+ });
+
+ router._qpUpdates = null;
+ }
+ },
+
+ /**
+ This hook is executed when the router completely exits this route. It is
+ not executed when the model for the route changes.
+ @method deactivate
+ @since 1.0.0
+ @public
+ */
+ deactivate: K,
+
+ /**
+ This hook is executed when the router enters the route. It is not executed
+ when the model for the route changes.
+ @method activate
+ @since 1.0.0
+ @public
+ */
+ activate: K,
+
+ transitionTo: function (name, context) {
+ var _router;
+
+ // eslint-disable-line no-unused-vars
+ return (_router = this.router).transitionTo.apply(_router, (0, _utils.prefixRouteNameArg)(this, arguments));
+ },
+ intermediateTransitionTo: function () {
+ var _router2;
+
+ (_router2 = this.router).intermediateTransitionTo.apply(_router2, (0, _utils.prefixRouteNameArg)(this, arguments));
+ },
+ refresh: function () {
+ return this.router._routerMicrolib.refresh(this);
+ },
+ replaceWith: function () {
+ var _router3;
+
+ return (_router3 = this.router).replaceWith.apply(_router3, (0, _utils.prefixRouteNameArg)(this, arguments));
+ },
+ send: function () {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ if (this.router && this.router._routerMicrolib || !(0, _emberDebug.isTesting)()) {
+ var _router4;
+
+ (_router4 = this.router).send.apply(_router4, args);
+ } else {
+ var name = args.shift();
+ var action = this.actions[name];
+ if (action) {
+ return action.apply(this, args);
+ }
+ }
+ },
+ setup: function (context, transition) {
+ var controller = void 0;
+
+ var controllerName = this.controllerName || this.routeName;
+ var definedController = this.controllerFor(controllerName, true);
+
+ if (definedController) {
+ controller = definedController;
+ } else {
+ controller = this.generateController(controllerName);
+ }
+
+ // Assign the route's controller so that it can more easily be
+ // referenced in action handlers. Side effects. Side effects everywhere.
+ if (!this.controller) {
+ var propNames = (0, _emberMetal.get)(this, '_qp.propertyNames');
+ addQueryParamsObservers(controller, propNames);
+ this.controller = controller;
+ }
+
+ var queryParams = (0, _emberMetal.get)(this, '_qp');
+
+ var states = queryParams.states;
+
+ controller._qpDelegate = states.allowOverrides;
+
+ if (transition) {
+ // Update the model dep values used to calculate cache keys.
+ (0, _utils.stashParamNames)(this.router, transition.state.handlerInfos);
+
+ var cache = this._bucketCache;
+ var params = transition.params;
+ var allParams = queryParams.propertyNames;
+
+ allParams.forEach(function (prop) {
+ var aQp = queryParams.map[prop];
+ aQp.values = params;
+
+ var cacheKey = (0, _utils.calculateCacheKey)(aQp.route.fullRouteName, aQp.parts, aQp.values);
+ var value = cache.lookup(cacheKey, prop, aQp.undecoratedDefaultValue);
+ (0, _emberMetal.set)(controller, prop, value);
+ });
+
+ var qpValues = getQueryParamsFor(this, transition.state);
+ (0, _emberMetal.setProperties)(controller, qpValues);
+ }
+
+ this.setupController(controller, context, transition);
+
+ if (this._environment.options.shouldRender) {
+ this.renderTemplate(controller, context);
+ }
+ },
+ _qpChanged: function (prop, value, qp) {
+ if (!qp) {
+ return;
+ }
+
+ // Update model-dep cache
+ var cache = this._bucketCache;
+ var cacheKey = (0, _utils.calculateCacheKey)(qp.route.fullRouteName, qp.parts, qp.values);
+ cache.stash(cacheKey, prop, value);
+ },
+
+
+ /**
+ This hook is the first of the route entry validation hooks
+ called when an attempt is made to transition into a route
+ or one of its children. It is called before `model` and
+ `afterModel`, and is appropriate for cases when:
+ 1) A decision can be made to redirect elsewhere without
+ needing to resolve the model first.
+ 2) Any async operations need to occur first before the
+ model is attempted to be resolved.
+ This hook is provided the current `transition` attempt
+ as a parameter, which can be used to `.abort()` the transition,
+ save it for a later `.retry()`, or retrieve values set
+ on it from a previous hook. You can also just call
+ `this.transitionTo` to another route to implicitly
+ abort the `transition`.
+ You can return a promise from this hook to pause the
+ transition until the promise resolves (or rejects). This could
+ be useful, for instance, for retrieving async code from
+ the server that is required to enter a route.
+ @method beforeModel
+ @param {Transition} transition
+ @return {any | Promise<any>} if the value returned from this hook is
+ a promise, the transition will pause until the transition
+ resolves. Otherwise, non-promise return values are not
+ utilized in any way.
+ @since 1.0.0
+ @public
+ */
+ beforeModel: K,
+
+ /**
+ This hook is called after this route's model has resolved.
+ It follows identical async/promise semantics to `beforeModel`
+ but is provided the route's resolved model in addition to
+ the `transition`, and is therefore suited to performing
+ logic that can only take place after the model has already
+ resolved.
+ ```app/routes/posts.js
+ import Route from '@ember/routing/route';
+ export default Route.extend({
+ afterModel(posts, transition) {
+ if (posts.get('length') === 1) {
+ this.transitionTo('post.show', posts.get('firstObject'));
+ }
+ }
+ });
+ ```
+ Refer to documentation for `beforeModel` for a description
+ of transition-pausing semantics when a promise is returned
+ from this hook.
+ @method afterModel
+ @param {Object} resolvedModel the value returned from `model`,
+ or its resolved value if it was a promise
+ @param {Transition} transition
+ @return {any | Promise<any>} if the value returned from this hook is
+ a promise, the transition will pause until the transition
+ resolves. Otherwise, non-promise return values are not
+ utilized in any way.
+ @since 1.0.0
+ @public
+ */
+ afterModel: K,
+
+ /**
+ A hook you can implement to optionally redirect to another route.
+ If you call `this.transitionTo` from inside of this hook, this route
+ will not be entered in favor of the other hook.
+ `redirect` and `afterModel` behave very similarly and are
+ called almost at the same time, but they have an important
+ distinction in the case that, from one of these hooks, a
+ redirect into a child route of this route occurs: redirects
+ from `afterModel` essentially invalidate the current attempt
+ to enter this route, and will result in this route's `beforeModel`,
+ `model`, and `afterModel` hooks being fired again within
+ the new, redirecting transition. Redirects that occur within
+ the `redirect` hook, on the other hand, will _not_ cause
+ these hooks to be fired again the second time around; in
+ other words, by the time the `redirect` hook has been called,
+ both the resolved model and attempted entry into this route
+ are considered to be fully validated.
+ @method redirect
+ @param {Object} model the model for this route
+ @param {Transition} transition the transition object associated with the current transition
+ @since 1.0.0
+ @public
+ */
+ redirect: K,
+
+ contextDidChange: function () {
+ this.currentModel = this.context;
+ },
+ model: function (params, transition) {
+ var name = void 0,
+ sawParams = void 0,
+ value = void 0;
+ var queryParams = (0, _emberMetal.get)(this, '_qp.map');
+
+ for (var prop in params) {
+ if (prop === 'queryParams' || queryParams && prop in queryParams) {
+ continue;
+ }
+
+ var match = prop.match(/^(.*)_id$/);
+ if (match !== null) {
+ name = match[1];
+ value = params[prop];
+ }
+ sawParams = true;
+ }
+
+ if (!name) {
+ if (sawParams) {
+ return (0, _emberRuntime.copy)(params);
+ } else {
+ if (transition.resolveIndex < 1) {
+ return;
+ }
+ return transition.state.handlerInfos[transition.resolveIndex - 1].context;
+ }
+ }
+
+ return this.findModel(name, value);
+ },
+ deserialize: function (params, transition) {
+ return this.model(this.paramsFor(this.routeName), transition);
+ },
+ findModel: function () {
+ var _get;
+
+ return (_get = (0, _emberMetal.get)(this, 'store')).find.apply(_get, arguments);
+ },
+
+
+ /**
+ Store property provides a hook for data persistence libraries to inject themselves.
+ By default, this store property provides the exact same functionality previously
+ in the model hook.
+ Currently, the required interface is:
+ `store.find(modelName, findArguments)`
+ @method store
+ @param {Object} store
+ @private
+ */
+ store: (0, _emberMetal.computed)(function () {
+ var owner = (0, _emberUtils.getOwner)(this);
+ var routeName = this.routeName;
+ var namespace = (0, _emberMetal.get)(this, 'router.namespace');
+
+ return {
+ find: function (name, value) {
+ var modelClass = owner.factoryFor('model:' + name);
+
+ (true && !(!!modelClass) && (0, _emberDebug.assert)('You used the dynamic segment ' + name + '_id in your route ' + routeName + ', but ' + namespace + '.' + _emberRuntime.String.classify(name) + ' did not exist and you did not override your route\'s `model` hook.', !!modelClass));
+
+
+ if (!modelClass) {
+ return;
+ }
+
+ modelClass = modelClass.class;
+
+ (true && !(typeof modelClass.find === 'function') && (0, _emberDebug.assert)(_emberRuntime.String.classify(name) + ' has no method `find`.', typeof modelClass.find === 'function'));
+
+
+ return modelClass.find(value);
+ }
+ };
+ }),
+
+ /**
+ A hook you can implement to convert the route's model into parameters
+ for the URL.
+ ```app/router.js
+ // ...
+ Router.map(function() {
+ this.route('post', { path: '/posts/:post_id' });
+ });
+ ```
+ ```app/routes/post.js
+ import $ from 'jquery';
+ import Route from '@ember/routing/route';
+ export default Route.extend({
+ model(params) {
+ // the server returns `{ id: 12 }`
+ return $.getJSON('/posts/' + params.post_id);
+ },
+ serialize(model) {
+ // this will make the URL `/posts/12`
+ return { post_id: model.id };
+ }
+ });
+ ```
+ The default `serialize` method will insert the model's `id` into the
+ route's dynamic segment (in this case, `:post_id`) if the segment contains '_id'.
+ If the route has multiple dynamic segments or does not contain '_id', `serialize`
+ will return `getProperties(model, params)`
+ This method is called when `transitionTo` is called with a context
+ in order to populate the URL.
+ @method serialize
+ @param {Object} model the routes model
+ @param {Array} params an Array of parameter names for the current
+ route (in the example, `['post_id']`.
+ @return {Object} the serialized parameters
+ @since 1.0.0
+ @public
+ */
+ serialize: defaultSerialize,
+
+ setupController: function (controller, context, transition) {
+ // eslint-disable-line no-unused-vars
+ if (controller && context !== undefined) {
+ (0, _emberMetal.set)(controller, 'model', context);
+ }
+ },
+ controllerFor: function (name, _skipAssert) {
+ var owner = (0, _emberUtils.getOwner)(this);
+ var route = owner.lookup('route:' + name);
+ var controller = void 0;
+
+ if (route && route.controllerName) {
+ name = route.controllerName;
+ }
+
+ controller = owner.lookup('controller:' + name);
+
+ // NOTE: We're specifically checking that skipAssert is true, because according
+ // to the old API the second parameter was model. We do not want people who
+ // passed a model to skip the assertion.
+ (true && !(controller || _skipAssert === true) && (0, _emberDebug.assert)('The controller named \'' + name + '\' could not be found. Make sure that this route exists and has already been entered at least once. If you are accessing a controller not associated with a route, make sure the controller class is explicitly defined.', controller || _skipAssert === true));
+
+
+ return controller;
+ },
+ generateController: function (name) {
+ var owner = (0, _emberUtils.getOwner)(this);
+
+ return (0, _generate_controller.default)(owner, name);
+ },
+ modelFor: function (_name) {
+ var name = void 0;
+ var owner = (0, _emberUtils.getOwner)(this);
+ var transition = this.router ? this.router._routerMicrolib.activeTransition : null;
+
+ // Only change the route name when there is an active transition.
+ // Otherwise, use the passed in route name.
+ if (owner.routable && transition !== null) {
+ name = getEngineRouteName(owner, _name);
+ } else {
+ name = _name;
+ }
+
+ var route = owner.lookup('route:' + name);
+ // If we are mid-transition, we want to try and look up
+ // resolved parent contexts on the current transitionEvent.
+ if (transition !== null) {
+ var modelLookupName = route && route.routeName || name;
+ if (transition.resolvedModels.hasOwnProperty(modelLookupName)) {
+ return transition.resolvedModels[modelLookupName];
+ }
+ }
+
+ return route && route.currentModel;
+ },
+ renderTemplate: function (controller, model) {
+ // eslint-disable-line no-unused-vars
+ this.render();
+ },
+ render: function (_name, options) {
+ var name = void 0;
+ var isDefaultRender = arguments.length === 0;
+ if (!isDefaultRender) {
+ if (typeof _name === 'object' && !options) {
+ name = this.templateName || this.routeName;
+ options = _name;
+ } else {
+ (true && !(!(0, _emberMetal.isEmpty)(_name)) && (0, _emberDebug.assert)('The name in the given arguments is undefined or empty string', !(0, _emberMetal.isEmpty)(_name)));
+
+ name = _name;
+ }
+ }
+
+ var renderOptions = buildRenderOptions(this, isDefaultRender, name, options);
+ this.connections.push(renderOptions);
+ _emberMetal.run.once(this.router, '_setOutlets');
+ },
+ disconnectOutlet: function (options) {
+ var outletName = void 0;
+ var parentView = void 0;
+ if (options) {
+ if (typeof options === 'string') {
+ outletName = options;
+ } else {
+ outletName = options.outlet;
+ parentView = options.parentView ? options.parentView.replace(/\//g, '.') : undefined;
+
+ (true && !(!('outlet' in options && options.outlet === undefined)) && (0, _emberDebug.assert)('You passed undefined as the outlet name.', !('outlet' in options && options.outlet === undefined)));
+ }
+ }
+
+ outletName = outletName || 'main';
+ this._disconnectOutlet(outletName, parentView);
+ var handlerInfos = this.router._routerMicrolib.currentHandlerInfos;
+ for (var i = 0; i < handlerInfos.length; i++) {
+ // This non-local state munging is sadly necessary to maintain
+ // backward compatibility with our existing semantics, which allow
+ // any route to disconnectOutlet things originally rendered by any
+ // other route. This should all get cut in 2.0.
+ handlerInfos[i].handler._disconnectOutlet(outletName, parentView);
+ }
+ },
+ _disconnectOutlet: function (outletName, parentView) {
+ var parent = parentRoute(this);
+ if (parent && parentView === parent.routeName) {
+ parentView = undefined;
+ }
+ for (var i = 0; i < this.connections.length; i++) {
+ var connection = this.connections[i];
+ if (connection.outlet === outletName && connection.into === parentView) {
+ // This neuters the disconnected outlet such that it doesn't
+ // render anything, but it leaves an entry in the outlet
+ // hierarchy so that any existing other renders that target it
+ // don't suddenly blow up. They will still stick themselves
+ // into its outlets, which won't render anywhere. All of this
+ // statefulness should get the machete in 2.0.
+ this.connections[i] = {
+ owner: connection.owner,
+ into: connection.into,
+ outlet: connection.outlet,
+ name: connection.name,
+ controller: undefined,
+ template: undefined
+ };
+ _emberMetal.run.once(this.router, '_setOutlets');
+ }
+ }
+ },
+ willDestroy: function () {
+ this.teardownViews();
+ },
+ teardownViews: function () {
+ if (this.connections && this.connections.length > 0) {
+ this.connections = [];
+ _emberMetal.run.once(this.router, '_setOutlets');
+ }
+ }
+ });
+
+ Route.reopenClass({
+ isRouteFactory: true
+ });
+
+ function parentRoute(route) {
+ var handlerInfo = handlerInfoFor(route, route.router._routerMicrolib.state.handlerInfos, -1);
+ return handlerInfo && handlerInfo.handler;
+ }
+
+ function handlerInfoFor(route, handlerInfos) {
+ var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
+
+ if (!handlerInfos) {
+ return;
+ }
+
+ var current = void 0;
+ for (var i = 0; i < handlerInfos.length; i++) {
+ current = handlerInfos[i].handler;
+ if (current === route) {
+ return handlerInfos[i + offset];
+ }
+ }
+ }
+
+ function buildRenderOptions(route, isDefaultRender, _name, options) {
+ (true && !(isDefaultRender || !(options && 'outlet' in options && options.outlet === undefined)) && (0, _emberDebug.assert)('You passed undefined as the outlet name.', isDefaultRender || !(options && 'outlet' in options && options.outlet === undefined)));
+
+
+ var owner = (0, _emberUtils.getOwner)(route);
+ var name = void 0,
+ templateName = void 0,
+ into = void 0,
+ outlet = void 0,
+ controller = void 0,
+ model = void 0;
+ if (options) {
+ into = options.into && options.into.replace(/\//g, '.');
+ outlet = options.outlet;
+ controller = options.controller;
+ model = options.model;
+ }
+ outlet = outlet || 'main';
+
+ if (isDefaultRender) {
+ name = route.routeName;
+ templateName = route.templateName || name;
+ } else {
+ name = _name.replace(/\//g, '.');
+ templateName = name;
+ }
+
+ if (!controller) {
+ if (isDefaultRender) {
+ controller = route.controllerName || owner.lookup('controller:' + name);
+ } else {
+ controller = owner.lookup('controller:' + name) || route.controllerName || route.routeName;
+ }
+ }
+
+ if (typeof controller === 'string') {
+ var controllerName = controller;
+ controller = owner.lookup('controller:' + controllerName);
+ (true && !(isDefaultRender || controller) && (0, _emberDebug.assert)('You passed `controller: \'' + controllerName + '\'` into the `render` method, but no such controller could be found.', isDefaultRender || controller));
+ }
+
+ if (model) {
+ controller.set('model', model);
+ }
+
+ var template = owner.lookup('template:' + templateName);
+ (true && !(isDefaultRender || template) && (0, _emberDebug.assert)('Could not find "' + templateName + '" template, view, or component.', isDefaultRender || template));
+
+
+ var parent = void 0;
+ if (into && (parent = parentRoute(route)) && into === parent.routeName) {
+ into = undefined;
+ }
+
+ var renderOptions = {
+ owner: owner,
+ into: into,
+ outlet: outlet,
+ name: name,
+ controller: controller,
+ template: template || route._topLevelViewTemplate
+ };
+
+ if (true) {
+ var LOG_VIEW_LOOKUPS = (0, _emberMetal.get)(route.router, 'namespace.LOG_VIEW_LOOKUPS');
+ if (LOG_VIEW_LOOKUPS && !template) {
+ (0, _emberDebug.info)('Could not find "' + name + '" template. Nothing will be rendered', { fullName: 'template:' + name });
+ }
+ }
+
+ return renderOptions;
+ }
+
+ function getFullQueryParams(router, state) {
+ if (state.fullQueryParams) {
+ return state.fullQueryParams;
+ }
+
+ state.fullQueryParams = {};
+ (0, _emberUtils.assign)(state.fullQueryParams, state.queryParams);
+
+ router._deserializeQueryParams(state.handlerInfos, state.fullQueryParams);
+ return state.fullQueryParams;
+ }
+
+ function getQueryParamsFor(route, state) {
+ state.queryParamsFor = state.queryParamsFor || {};
+ var name = route.fullRouteName;
+
+ if (state.queryParamsFor[name]) {
+ return state.queryParamsFor[name];
+ }
+
+ var fullQueryParams = getFullQueryParams(route.router, state);
+
+ var params = state.queryParamsFor[name] = {};
+
+ // Copy over all the query params for this route/controller into params hash.
+ var qpMeta = (0, _emberMetal.get)(route, '_qp');
+ var qps = qpMeta.qps;
+ for (var i = 0; i < qps.length; ++i) {
+ // Put deserialized qp on params hash.
+ var qp = qps[i];
+
+ var qpValueWasPassedIn = qp.prop in fullQueryParams;
+ params[qp.prop] = qpValueWasPassedIn ? fullQueryParams[qp.prop] : copyDefaultValue(qp.defaultValue);
+ }
+
+ return params;
+ }
+
+ function copyDefaultValue(value) {
+ if (Array.isArray(value)) {
+ return (0, _emberRuntime.A)(value.slice());
+ }
+ return value;
+ }
+
+ /*
+ Merges all query parameters from a controller with those from
+ a route, returning a new object and avoiding any mutations to
+ the existing objects.
+ */
+ function mergeEachQueryParams(controllerQP, routeQP) {
+ var qps = {};
+ var keysAlreadyMergedOrSkippable = {
+ defaultValue: true,
+ type: true,
+ scope: true,
+ as: true
+ };
+
+ // first loop over all controller qps, merging them with any matching route qps
+ // into a new empty object to avoid mutating.
+ for (var cqpName in controllerQP) {
+ if (!controllerQP.hasOwnProperty(cqpName)) {
+ continue;
+ }
+
+ var newControllerParameterConfiguration = {};
+ (0, _emberUtils.assign)(newControllerParameterConfiguration, controllerQP[cqpName], routeQP[cqpName]);
+
+ qps[cqpName] = newControllerParameterConfiguration;
+
+ // allows us to skip this QP when we check route QPs.
+ keysAlreadyMergedOrSkippable[cqpName] = true;
+ }
+
+ // loop over all route qps, skipping those that were merged in the first pass
+ // because they also appear in controller qps
+ for (var rqpName in routeQP) {
+ if (!routeQP.hasOwnProperty(rqpName) || keysAlreadyMergedOrSkippable[rqpName]) {
+ continue;
+ }
+
+ var newRouteParameterConfiguration = {};
+ (0, _emberUtils.assign)(newRouteParameterConfiguration, routeQP[rqpName], controllerQP[rqpName]);
+ qps[rqpName] = newRouteParameterConfiguration;
+ }
+
+ return qps;
+ }
+
+ function addQueryParamsObservers(controller, propNames) {
+ propNames.forEach(function (prop) {
+ controller.addObserver(prop + '.[]', controller, controller._qpChanged);
+ });
+ }
+
+ function getEngineRouteName(engine, routeName) {
+ if (engine.routable) {
+ var prefix = engine.mountPoint;
+
+ if (routeName === 'application') {
+ return prefix;
+ } else {
+ return prefix + '.' + routeName;
+ }
+ }
+
+ return routeName;
+ }
+
+ exports.default = Route;
+});
+enifed('ember-routing/system/router', ['exports', 'ember-utils', 'ember-console', 'ember-metal', 'ember-debug', 'ember-runtime', 'ember-routing/system/route', 'ember-routing/system/dsl', 'ember-routing/location/api', 'ember-routing/utils', 'ember-routing/system/router_state', 'router'], function (exports, _emberUtils, _emberConsole, _emberMetal, _emberDebug, _emberRuntime, _route, _dsl, _api, _utils, _router_state, _router) {
+ 'use strict';
+
+ exports.triggerEvent = triggerEvent;
+
+
+ function K() {
+ return this;
+ }
+
+ /**
+ @module @ember/routing
+ */
+
+ var slice = Array.prototype.slice;
+
+
+ /**
+ The `EmberRouter` class manages the application state and URLs. Refer to
+ the [routing guide](https://emberjs.com/guides/routing/) for documentation.
+
+ @class EmberRouter
+ @extends EmberObject
+ @uses Evented
+ @public
+ */
+ var EmberRouter = _emberRuntime.Object.extend(_emberRuntime.Evented, {
+ /**
+ The `location` property determines the type of URL's that your
+ application will use.
+ The following location types are currently available:
+ * `history` - use the browser's history API to make the URLs look just like any standard URL
+ * `hash` - use `#` to separate the server part of the URL from the Ember part: `/blog/#/posts/new`
+ * `none` - do not store the Ember URL in the actual browser URL (mainly used for testing)
+ * `auto` - use the best option based on browser capabilities: `history` if possible, then `hash` if possible, otherwise `none`
+ This value is defaulted to `auto` by the `locationType` setting of `/config/environment.js`
+ @property location
+ @default 'hash'
+ @see {Location}
+ @public
+ */
+ location: 'hash',
+
+ /**
+ Represents the URL of the root of the application, often '/'. This prefix is
+ assumed on all routes defined on this router.
+ @property rootURL
+ @default '/'
+ @public
+ */
+ rootURL: '/',
+
+ _initRouterJs: function () {
+ var routerMicrolib = this._routerMicrolib = new _router.default();
+ routerMicrolib.triggerEvent = triggerEvent.bind(this);
+
+ routerMicrolib._triggerWillChangeContext = K;
+ routerMicrolib._triggerWillLeave = K;
+
+ var dslCallbacks = this.constructor.dslCallbacks || [K];
+ var dsl = this._buildDSL();
+
+ dsl.route('application', { path: '/', resetNamespace: true, overrideNameAssertion: true }, function () {
+ for (var i = 0; i < dslCallbacks.length; i++) {
+ dslCallbacks[i].call(this);
+ }
+ });
+
+ if (true) {
+ if ((0, _emberMetal.get)(this, 'namespace.LOG_TRANSITIONS_INTERNAL')) {
+ routerMicrolib.log = _emberConsole.default.debug;
+ }
+ }
+
+ routerMicrolib.map(dsl.generate());
+ },
+ _buildDSL: function () {
+ var enableLoadingSubstates = this._hasModuleBasedResolver();
+ var options = { enableLoadingSubstates: enableLoadingSubstates };
+
+ var owner = (0, _emberUtils.getOwner)(this);
+ var router = this;
+
+ options.resolveRouteMap = function (name) {
+ return owner.factoryFor('route-map:' + name);
+ };
+
+ options.addRouteForEngine = function (name, engineInfo) {
+ if (!router._engineInfoByRoute[name]) {
+ router._engineInfoByRoute[name] = engineInfo;
+ }
+ };
+
+ return new _dsl.default(null, options);
+ },
+ init: function () {
+ this._super.apply(this, arguments);
+
+ this.currentURL = null;
+ this.currentRouteName = null;
+ this.currentPath = null;
+
+ this._qpCache = Object.create(null);
+ this._resetQueuedQueryParameterChanges();
+ this._handledErrors = new Set();
+ this._engineInstances = Object.create(null);
+ this._engineInfoByRoute = Object.create(null);
+ },
+ _resetQueuedQueryParameterChanges: function () {
+ this._queuedQPChanges = {};
+ },
+
+
+ /**
+ Represents the current URL.
+ @method url
+ @return {String} The current URL.
+ @private
+ */
+ url: (0, _emberMetal.computed)(function () {
+ return (0, _emberMetal.get)(this, 'location').getURL();
+ }),
+
+ _hasModuleBasedResolver: function () {
+ var owner = (0, _emberUtils.getOwner)(this);
+ if (!owner) {
+ return false;
+ }
+
+ var resolver = (0, _emberMetal.get)(owner, 'application.__registry__.resolver.moduleBasedResolver');
+ return !!resolver;
+ },
+ startRouting: function () {
+ var initialURL = (0, _emberMetal.get)(this, 'initialURL');
+
+ if (this.setupRouter()) {
+ if (initialURL === undefined) {
+ initialURL = (0, _emberMetal.get)(this, 'location').getURL();
+ }
+ var initialTransition = this.handleURL(initialURL);
+ if (initialTransition && initialTransition.error) {
+ throw initialTransition.error;
+ }
+ }
+ },
+ setupRouter: function () {
+ var _this = this;
+
+ this._initRouterJs();
+ this._setupLocation();
+
+ var location = (0, _emberMetal.get)(this, 'location');
+
+ // Allow the Location class to cancel the router setup while it refreshes
+ // the page
+ if ((0, _emberMetal.get)(location, 'cancelRouterSetup')) {
+ return false;
+ }
+
+ this._setupRouter(location);
+
+ location.onUpdateURL(function (url) {
+ _this.handleURL(url);
+ });
+
+ return true;
+ },
+ didTransition: function (infos) {
+ updatePaths(this);
+
+ this._cancelSlowTransitionTimer();
+
+ this.notifyPropertyChange('url');
+ this.set('currentState', this.targetState);
+
+ // Put this in the runloop so url will be accurate. Seems
+ // less surprising than didTransition being out of sync.
+ _emberMetal.run.once(this, this.trigger, 'didTransition');
+
+ if (true) {
+ if ((0, _emberMetal.get)(this, 'namespace').LOG_TRANSITIONS) {
+ _emberConsole.default.log('Transitioned into \'' + EmberRouter._routePath(infos) + '\'');
+ }
+ }
+ },
+ _setOutlets: function () {
+ // This is triggered async during Route#willDestroy.
+ // If the router is also being destroyed we do not want to
+ // to create another this._toplevelView (and leak the renderer)
+ if (this.isDestroying || this.isDestroyed) {
+ return;
+ }
+
+ var handlerInfos = this._routerMicrolib.currentHandlerInfos;
+ var route = void 0;
+ var defaultParentState = void 0;
+ var liveRoutes = null;
+
+ if (!handlerInfos) {
+ return;
+ }
+
+ for (var i = 0; i < handlerInfos.length; i++) {
+ route = handlerInfos[i].handler;
+ var connections = route.connections;
+ var ownState = void 0;
+ for (var j = 0; j < connections.length; j++) {
+ var appended = appendLiveRoute(liveRoutes, defaultParentState, connections[j]);
+ liveRoutes = appended.liveRoutes;
+ if (appended.ownState.render.name === route.routeName || appended.ownState.render.outlet === 'main') {
+ ownState = appended.ownState;
+ }
+ }
+ if (connections.length === 0) {
+ ownState = representEmptyRoute(liveRoutes, defaultParentState, route);
+ }
+ defaultParentState = ownState;
+ }
+
+ // when a transitionTo happens after the validation phase
+ // during the initial transition _setOutlets is called
+ // when no routes are active. However, it will get called
+ // again with the correct values during the next turn of
+ // the runloop
+ if (!liveRoutes) {
+ return;
+ }
+
+ if (!this._toplevelView) {
+ var owner = (0, _emberUtils.getOwner)(this);
+ var OutletView = owner.factoryFor('view:-outlet');
+ this._toplevelView = OutletView.create();
+ this._toplevelView.setOutletState(liveRoutes);
+ var instance = owner.lookup('-application-instance:main');
+ instance.didCreateRootView(this._toplevelView);
+ } else {
+ this._toplevelView.setOutletState(liveRoutes);
+ }
+ },
+ willTransition: function (oldInfos, newInfos, transition) {
+ _emberMetal.run.once(this, this.trigger, 'willTransition', transition);
+
+ if (true) {
+ if ((0, _emberMetal.get)(this, 'namespace').LOG_TRANSITIONS) {
+ _emberConsole.default.log('Preparing to transition from \'' + EmberRouter._routePath(oldInfos) + '\' to \'' + EmberRouter._routePath(newInfos) + '\'');
+ }
+ }
+ },
+ handleURL: function (url) {
+ // Until we have an ember-idiomatic way of accessing #hashes, we need to
+ // remove it because router.js doesn't know how to handle it.
+ var _url = url.split(/#(.+)?/)[0];
+ return this._doURLTransition('handleURL', _url);
+ },
+ _doURLTransition: function (routerJsMethod, url) {
+ var transition = this._routerMicrolib[routerJsMethod](url || '/');
+ didBeginTransition(transition, this);
+ return transition;
+ },
+ transitionTo: function () {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ if ((0, _utils.resemblesURL)(args[0])) {
+ return this._doURLTransition('transitionTo', args[0]);
+ }
+
+ var _extractRouteArgs = (0, _utils.extractRouteArgs)(args),
+ routeName = _extractRouteArgs.routeName,
+ models = _extractRouteArgs.models,
+ queryParams = _extractRouteArgs.queryParams;
+
+ return this._doTransition(routeName, models, queryParams);
+ },
+ intermediateTransitionTo: function () {
+ var _routerMicrolib;
+
+ (_routerMicrolib = this._routerMicrolib).intermediateTransitionTo.apply(_routerMicrolib, arguments);
+
+ updatePaths(this);
+
+ if (true) {
+ var infos = this._routerMicrolib.currentHandlerInfos;
+ if ((0, _emberMetal.get)(this, 'namespace').LOG_TRANSITIONS) {
+ _emberConsole.default.log('Intermediate-transitioned into \'' + EmberRouter._routePath(infos) + '\'');
+ }
+ }
+ },
+ replaceWith: function () {
+ return this.transitionTo.apply(this, arguments).method('replace');
+ },
+ generate: function () {
+ var _routerMicrolib2;
+
+ var url = (_routerMicrolib2 = this._routerMicrolib).generate.apply(_routerMicrolib2, arguments);
+ return this.location.formatURL(url);
+ },
+ isActive: function () {
+ var _routerMicrolib3;
+
+ return (_routerMicrolib3 = this._routerMicrolib).isActive.apply(_routerMicrolib3, arguments);
+ },
+ isActiveIntent: function (routeName, models, queryParams) {
+ return this.currentState.isActiveIntent(routeName, models, queryParams);
+ },
+ send: function () {
+ var _routerMicrolib4;
+
+ /*name, context*/
+ (_routerMicrolib4 = this._routerMicrolib).trigger.apply(_routerMicrolib4, arguments);
+ },
+ hasRoute: function (route) {
+ return this._routerMicrolib.hasRoute(route);
+ },
+ reset: function () {
+ if (this._routerMicrolib) {
+ this._routerMicrolib.reset();
+ }
+ },
+ willDestroy: function () {
+ if (this._toplevelView) {
+ this._toplevelView.destroy();
+ this._toplevelView = null;
+ }
+
+ this._super.apply(this, arguments);
+
+ this.reset();
+
+ var instances = this._engineInstances;
+ for (var name in instances) {
+ for (var id in instances[name]) {
+ (0, _emberMetal.run)(instances[name][id], 'destroy');
+ }
+ }
+ },
+ _activeQPChanged: function (queryParameterName, newValue) {
+ this._queuedQPChanges[queryParameterName] = newValue;
+ _emberMetal.run.once(this, this._fireQueryParamTransition);
+ },
+ _updatingQPChanged: function (queryParameterName) {
+ if (!this._qpUpdates) {
+ this._qpUpdates = {};
+ }
+ this._qpUpdates[queryParameterName] = true;
+ },
+ _fireQueryParamTransition: function () {
+ this.transitionTo({ queryParams: this._queuedQPChanges });
+ this._resetQueuedQueryParameterChanges();
+ },
+ _setupLocation: function () {
+ var location = (0, _emberMetal.get)(this, 'location');
+ var rootURL = (0, _emberMetal.get)(this, 'rootURL');
+ var owner = (0, _emberUtils.getOwner)(this);
+
+ if ('string' === typeof location && owner) {
+ var resolvedLocation = owner.lookup('location:' + location);
+
+ if (resolvedLocation !== undefined) {
+ location = (0, _emberMetal.set)(this, 'location', resolvedLocation);
+ } else {
+ // Allow for deprecated registration of custom location API's
+ var options = {
+ implementation: location
+ };
+
+ location = (0, _emberMetal.set)(this, 'location', _api.default.create(options));
+ }
+ }
+
+ if (location !== null && typeof location === 'object') {
+ if (rootURL) {
+ (0, _emberMetal.set)(location, 'rootURL', rootURL);
+ }
+
+ // Allow the location to do any feature detection, such as AutoLocation
+ // detecting history support. This gives it a chance to set its
+ // `cancelRouterSetup` property which aborts routing.
+ if (typeof location.detect === 'function') {
+ location.detect();
+ }
+
+ // ensure that initState is called AFTER the rootURL is set on
+ // the location instance
+ if (typeof location.initState === 'function') {
+ location.initState();
+ }
+ }
+ },
+ _getHandlerFunction: function () {
+ var _this2 = this;
+
+ var seen = Object.create(null);
+ var owner = (0, _emberUtils.getOwner)(this);
+
+ return function (name) {
+ var routeName = name;
+ var routeOwner = owner;
+ var engineInfo = _this2._engineInfoByRoute[routeName];
+
+ if (engineInfo) {
+ var engineInstance = _this2._getEngineInstance(engineInfo);
+
+ routeOwner = engineInstance;
+ routeName = engineInfo.localFullName;
+ }
+
+ var fullRouteName = 'route:' + routeName;
+
+ var handler = routeOwner.lookup(fullRouteName);
+
+ if (seen[name]) {
+ return handler;
+ }
+
+ seen[name] = true;
+
+ if (!handler) {
+ var DefaultRoute = routeOwner.factoryFor('route:basic').class;
+ routeOwner.register(fullRouteName, DefaultRoute.extend());
+ handler = routeOwner.lookup(fullRouteName);
+
+ if (true) {
+ if ((0, _emberMetal.get)(_this2, 'namespace.LOG_ACTIVE_GENERATION')) {
+ (0, _emberDebug.info)('generated -> ' + fullRouteName, { fullName: fullRouteName });
+ }
+ }
+ }
+
+ handler._setRouteName(routeName);
+
+ if (engineInfo && !(0, _route.hasDefaultSerialize)(handler)) {
+ throw new Error('Defining a custom serialize method on an Engine route is not supported.');
+ }
+
+ return handler;
+ };
+ },
+ _getSerializerFunction: function () {
+ var _this3 = this;
+
+ return function (name) {
+ var engineInfo = _this3._engineInfoByRoute[name];
+
+ // If this is not an Engine route, we fall back to the handler for serialization
+ if (!engineInfo) {
+ return;
+ }
+
+ return engineInfo.serializeMethod || _route.defaultSerialize;
+ };
+ },
+ _setupRouter: function (location) {
+ var _this4 = this;
+
+ var lastURL = void 0;
+ var routerMicrolib = this._routerMicrolib;
+
+ routerMicrolib.getHandler = this._getHandlerFunction();
+ routerMicrolib.getSerializer = this._getSerializerFunction();
+
+ var doUpdateURL = function () {
+ location.setURL(lastURL);
+ (0, _emberMetal.set)(_this4, 'currentURL', lastURL);
+ };
+
+ routerMicrolib.updateURL = function (path) {
+ lastURL = path;
+ _emberMetal.run.once(doUpdateURL);
+ };
+
+ if (location.replaceURL) {
+ var doReplaceURL = function () {
+ location.replaceURL(lastURL);
+ (0, _emberMetal.set)(_this4, 'currentURL', lastURL);
+ };
+
+ routerMicrolib.replaceURL = function (path) {
+ lastURL = path;
+ _emberMetal.run.once(doReplaceURL);
+ };
+ }
+
+ routerMicrolib.didTransition = function (infos) {
+ _this4.didTransition(infos);
+ };
+
+ routerMicrolib.willTransition = function (oldInfos, newInfos, transition) {
+ _this4.willTransition(oldInfos, newInfos, transition);
+ };
+ },
+ _serializeQueryParams: function (handlerInfos, queryParams) {
+ var _this5 = this;
+
+ forEachQueryParam(this, handlerInfos, queryParams, function (key, value, qp) {
+ if (qp) {
+ delete queryParams[key];
+ queryParams[qp.urlKey] = qp.route.serializeQueryParam(value, qp.urlKey, qp.type);
+ } else if (value === undefined) {
+ return; // We don't serialize undefined values
+ } else {
+ queryParams[key] = _this5._serializeQueryParam(value, (0, _emberRuntime.typeOf)(value));
+ }
+ });
+ },
+ _serializeQueryParam: function (value, type) {
+ if (value === null || value === undefined) {
+ return value;
+ } else if (type === 'array') {
+ return JSON.stringify(value);
+ }
+
+ return '' + value;
+ },
+ _deserializeQueryParams: function (handlerInfos, queryParams) {
+ forEachQueryParam(this, handlerInfos, queryParams, function (key, value, qp) {
+ // If we don't have QP meta info for a given key, then we do nothing
+ // because all values will be treated as strings
+ if (qp) {
+ delete queryParams[key];
+ queryParams[qp.prop] = qp.route.deserializeQueryParam(value, qp.urlKey, qp.type);
+ }
+ });
+ },
+ _deserializeQueryParam: function (value, defaultType) {
+ if (value === null || value === undefined) {
+ return value;
+ } else if (defaultType === 'boolean') {
+ return value === 'true';
+ } else if (defaultType === 'number') {
+ return Number(value).valueOf();
+ } else if (defaultType === 'array') {
+ return (0, _emberRuntime.A)(JSON.parse(value));
+ }
+ return value;
+ },
+ _pruneDefaultQueryParamValues: function (handlerInfos, queryParams) {
+ var qps = this._queryParamsFor(handlerInfos);
+ for (var key in queryParams) {
+ var qp = qps.map[key];
+ if (qp && qp.serializedDefaultValue === queryParams[key]) {
+ delete queryParams[key];
+ }
+ }
+ },
+ _doTransition: function (_targetRouteName, models, _queryParams, _keepDefaultQueryParamValues) {
+ var _routerMicrolib5;
+
+ var targetRouteName = _targetRouteName || (0, _utils.getActiveTargetName)(this._routerMicrolib);
+ (true && !(targetRouteName && this._routerMicrolib.hasRoute(targetRouteName)) && (0, _emberDebug.assert)('The route ' + targetRouteName + ' was not found', targetRouteName && this._routerMicrolib.hasRoute(targetRouteName)));
+
+
+ var queryParams = {};
+
+ this._processActiveTransitionQueryParams(targetRouteName, models, queryParams, _queryParams);
+
+ (0, _emberUtils.assign)(queryParams, _queryParams);
+ this._prepareQueryParams(targetRouteName, models, queryParams, _keepDefaultQueryParamValues);
+
+ var transition = (_routerMicrolib5 = this._routerMicrolib).transitionTo.apply(_routerMicrolib5, [targetRouteName].concat(models, [{ queryParams: queryParams }]));
+
+ didBeginTransition(transition, this);
+
+ return transition;
+ },
+ _processActiveTransitionQueryParams: function (targetRouteName, models, queryParams, _queryParams) {
+ // merge in any queryParams from the active transition which could include
+ // queryParams from the url on initial load.
+ if (!this._routerMicrolib.activeTransition) {
+ return;
+ }
+
+ var unchangedQPs = {};
+ var qpUpdates = this._qpUpdates || {};
+ var params = this._routerMicrolib.activeTransition.queryParams;
+ for (var key in params) {
+ if (!qpUpdates[key]) {
+ unchangedQPs[key] = params[key];
+ }
+ }
+
+ // We need to fully scope queryParams so that we can create one object
+ // that represents both passed-in queryParams and ones that aren't changed
+ // from the active transition.
+ this._fullyScopeQueryParams(targetRouteName, models, _queryParams);
+ this._fullyScopeQueryParams(targetRouteName, models, unchangedQPs);
+ (0, _emberUtils.assign)(queryParams, unchangedQPs);
+ },
+ _prepareQueryParams: function (targetRouteName, models, queryParams, _fromRouterService) {
+ var state = calculatePostTransitionState(this, targetRouteName, models);
+ this._hydrateUnsuppliedQueryParams(state, queryParams, _fromRouterService);
+ this._serializeQueryParams(state.handlerInfos, queryParams);
+
+ if (!_fromRouterService) {
+ this._pruneDefaultQueryParamValues(state.handlerInfos, queryParams);
+ }
+ },
+ _getQPMeta: function (handlerInfo) {
+ var route = handlerInfo.handler;
+ return route && (0, _emberMetal.get)(route, '_qp');
+ },
+ _queryParamsFor: function (handlerInfos) {
+ var handlerInfoLength = handlerInfos.length;
+ var leafRouteName = handlerInfos[handlerInfoLength - 1].name;
+ var cached = this._qpCache[leafRouteName];
+ if (cached) {
+ return cached;
+ }
+
+ var shouldCache = true;
+ var qpsByUrlKey = {};
+ var map = {};
+ var qps = [];
+
+ for (var i = 0; i < handlerInfoLength; ++i) {
+ var qpMeta = this._getQPMeta(handlerInfos[i]);
+
+ if (!qpMeta) {
+ shouldCache = false;
+ continue;
+ }
+
+ // Loop over each QP to make sure we don't have any collisions by urlKey
+ for (var _i = 0; _i < qpMeta.qps.length; _i++) {
+ var qp = qpMeta.qps[_i];
+ var urlKey = qp.urlKey;
+ var qpOther = qpsByUrlKey[urlKey];
+
+ if (qpOther && qpOther.controllerName !== qp.controllerName) {
+ var otherQP = qpsByUrlKey[urlKey];
+ (true && !(false) && (0, _emberDebug.assert)('You\'re not allowed to have more than one controller property map to the same query param key, but both `' + otherQP.scopedPropertyName + '` and `' + qp.scopedPropertyName + '` map to `' + urlKey + '`. You can fix this by mapping one of the controller properties to a different query param key via the `as` config option, e.g. `' + otherQP.prop + ': { as: \'other-' + otherQP.prop + '\' }`', false));
+ }
+
+ qpsByUrlKey[urlKey] = qp;
+ qps.push(qp);
+ }
+
+ (0, _emberUtils.assign)(map, qpMeta.map);
+ }
+
+ var finalQPMeta = { qps: qps, map: map };
+
+ if (shouldCache) {
+ this._qpCache[leafRouteName] = finalQPMeta;
+ }
+
+ return finalQPMeta;
+ },
+ _fullyScopeQueryParams: function (leafRouteName, contexts, queryParams) {
+ var state = calculatePostTransitionState(this, leafRouteName, contexts);
+ var handlerInfos = state.handlerInfos;
+
+ for (var i = 0, len = handlerInfos.length; i < len; ++i) {
+ var qpMeta = this._getQPMeta(handlerInfos[i]);
+
+ if (!qpMeta) {
+ continue;
+ }
+
+ for (var j = 0, qpLen = qpMeta.qps.length; j < qpLen; ++j) {
+ var qp = qpMeta.qps[j];
+
+ var presentProp = qp.prop in queryParams && qp.prop || qp.scopedPropertyName in queryParams && qp.scopedPropertyName || qp.urlKey in queryParams && qp.urlKey;
+
+ if (presentProp) {
+ if (presentProp !== qp.scopedPropertyName) {
+ queryParams[qp.scopedPropertyName] = queryParams[presentProp];
+ delete queryParams[presentProp];
+ }
+ }
+ }
+ }
+ },
+ _hydrateUnsuppliedQueryParams: function (state, queryParams, _fromRouterService) {
+ var handlerInfos = state.handlerInfos;
+ var appCache = this._bucketCache;
+
+ for (var i = 0; i < handlerInfos.length; ++i) {
+ var qpMeta = this._getQPMeta(handlerInfos[i]);
+
+ if (!qpMeta) {
+ continue;
+ }
+
+ for (var j = 0, qpLen = qpMeta.qps.length; j < qpLen; ++j) {
+ var qp = qpMeta.qps[j];
+
+ var presentProp = qp.prop in queryParams && qp.prop || qp.scopedPropertyName in queryParams && qp.scopedPropertyName || qp.urlKey in queryParams && qp.urlKey;
+
+ (true && !(function () {
+ if (qp.urlKey === presentProp) {
+ return true;
+ }
+
+ if (_fromRouterService && presentProp !== false) {
+ return false;
+ }
+
+ return true;
+ }()) && (0, _emberDebug.assert)('You passed the `' + presentProp + '` query parameter during a transition into ' + qp.route.routeName + ', please update to ' + qp.urlKey, function () {
+ if (qp.urlKey === presentProp) {
+ return true;
+ }if (_fromRouterService && presentProp !== false) {
+ return false;
+ }return true;
+ }()));
+
+
+ if (presentProp) {
+ if (presentProp !== qp.scopedPropertyName) {
+ queryParams[qp.scopedPropertyName] = queryParams[presentProp];
+ delete queryParams[presentProp];
+ }
+ } else {
+ var cacheKey = (0, _utils.calculateCacheKey)(qp.route.fullRouteName, qp.parts, state.params);
+ queryParams[qp.scopedPropertyName] = appCache.lookup(cacheKey, qp.prop, qp.defaultValue);
+ }
+ }
+ }
+ },
+ _scheduleLoadingEvent: function (transition, originRoute) {
+ this._cancelSlowTransitionTimer();
+ this._slowTransitionTimer = _emberMetal.run.scheduleOnce('routerTransitions', this, '_handleSlowTransition', transition, originRoute);
+ },
+
+
+ currentState: null,
+ targetState: null,
+
+ _handleSlowTransition: function (transition, originRoute) {
+ if (!this._routerMicrolib.activeTransition) {
+ // Don't fire an event if we've since moved on from
+ // the transition that put us in a loading state.
+ return;
+ }
+
+ this.set('targetState', _router_state.default.create({
+ emberRouter: this,
+ routerJs: this._routerMicrolib,
+ routerJsState: this._routerMicrolib.activeTransition.state
+ }));
+
+ transition.trigger(true, 'loading', transition, originRoute);
+ },
+ _cancelSlowTransitionTimer: function () {
+ if (this._slowTransitionTimer) {
+ _emberMetal.run.cancel(this._slowTransitionTimer);
+ }
+ this._slowTransitionTimer = null;
+ },
+ _markErrorAsHandled: function (error) {
+ this._handledErrors.add(error);
+ },
+ _isErrorHandled: function (error) {
+ return this._handledErrors.has(error);
+ },
+ _clearHandledError: function (error) {
+ this._handledErrors.delete(error);
+ },
+ _getEngineInstance: function (_ref) {
+ var name = _ref.name,
+ instanceId = _ref.instanceId,
+ mountPoint = _ref.mountPoint;
+
+ var engineInstances = this._engineInstances;
+
+ if (!engineInstances[name]) {
+ engineInstances[name] = Object.create(null);
+ }
+
+ var engineInstance = engineInstances[name][instanceId];
+
+ if (!engineInstance) {
+ var owner = (0, _emberUtils.getOwner)(this);
+
+ (true && !(owner.hasRegistration('engine:' + name)) && (0, _emberDebug.assert)('You attempted to mount the engine \'' + name + '\' in your router map, but the engine can not be found.', owner.hasRegistration('engine:' + name)));
+
+
+ engineInstance = owner.buildChildEngineInstance(name, {
+ routable: true,
+ mountPoint: mountPoint
+ });
+
+ engineInstance.boot();
+
+ engineInstances[name][instanceId] = engineInstance;
+ }
+
+ return engineInstance;
+ }
+ });
+
+ /*
+ Helper function for iterating over routes in a set of handlerInfos that are
+ at or above the given origin route. Example: if `originRoute` === 'foo.bar'
+ and the handlerInfos given were for 'foo.bar.baz', then the given callback
+ will be invoked with the routes for 'foo.bar', 'foo', and 'application'
+ individually.
+
+ If the callback returns anything other than `true`, then iteration will stop.
+
+ @private
+ @param {Route} originRoute
+ @param {Array<HandlerInfo>} handlerInfos
+ @param {Function} callback
+ @return {Void}
+ */
+ function forEachRouteAbove(handlerInfos, callback) {
+
+ for (var i = handlerInfos.length - 1; i >= 0; --i) {
+ var handlerInfo = handlerInfos[i];
+ var route = handlerInfo.handler;
+
+ // handlerInfo.handler being `undefined` generally means either:
+ //
+ // 1. an error occurred during creation of the route in question
+ // 2. the route is across an async boundary (e.g. within an engine)
+ //
+ // In both of these cases, we cannot invoke the callback on that specific
+ // route, because it just doesn't exist...
+ if (route === undefined) {
+ continue;
+ }
+
+ if (callback(route, handlerInfo) !== true) {
+ return;
+ }
+ }
+ }
+
+ // These get invoked when an action bubbles above ApplicationRoute
+ // and are not meant to be overridable.
+ var defaultActionHandlers = {
+ willResolveModel: function (handlerInfos, transition, originRoute) {
+ this._scheduleLoadingEvent(transition, originRoute);
+ },
+ error: function (handlerInfos, error, transition) {
+ var router = this;
+
+ var handlerInfoWithError = handlerInfos[handlerInfos.length - 1];
+
+ forEachRouteAbove(handlerInfos, function (route, handlerInfo) {
+ // We don't check the leaf most handlerInfo since that would
+ // technically be below where we're at in the route hierarchy.
+ if (handlerInfo !== handlerInfoWithError) {
+ // Check for the existence of an 'error' route.
+ var errorRouteName = findRouteStateName(route, 'error');
+ if (errorRouteName) {
+ router._markErrorAsHandled(error);
+ router.intermediateTransitionTo(errorRouteName, error);
+ return false;
+ }
+ }
+
+ // Check for an 'error' substate route
+ var errorSubstateName = findRouteSubstateName(route, 'error');
+ if (errorSubstateName) {
+ router._markErrorAsHandled(error);
+ router.intermediateTransitionTo(errorSubstateName, error);
+ return false;
+ }
+
+ return true;
+ });
+
+ logError(error, 'Error while processing route: ' + transition.targetName);
+ },
+ loading: function (handlerInfos, transition) {
+ var router = this;
+
+ var handlerInfoWithSlowLoading = handlerInfos[handlerInfos.length - 1];
+
+ forEachRouteAbove(handlerInfos, function (route, handlerInfo) {
+ // We don't check the leaf most handlerInfo since that would
+ // technically be below where we're at in the route hierarchy.
+ if (handlerInfo !== handlerInfoWithSlowLoading) {
+ // Check for the existence of a 'loading' route.
+ var loadingRouteName = findRouteStateName(route, 'loading');
+ if (loadingRouteName) {
+ router.intermediateTransitionTo(loadingRouteName);
+ return false;
+ }
+ }
+
+ // Check for loading substate
+ var loadingSubstateName = findRouteSubstateName(route, 'loading');
+ if (loadingSubstateName) {
+ router.intermediateTransitionTo(loadingSubstateName);
+ return false;
+ }
+
+ // Don't bubble above pivot route.
+ return transition.pivotHandler !== route;
+ });
+ }
+ };
+
+ function logError(_error, initialMessage) {
+ var errorArgs = [];
+ var error = void 0;
+ if (_error && typeof _error === 'object' && typeof _error.errorThrown === 'object') {
+ error = _error.errorThrown;
+ } else {
+ error = _error;
+ }
+
+ if (initialMessage) {
+ errorArgs.push(initialMessage);
+ }
+
+ if (error) {
+ if (error.message) {
+ errorArgs.push(error.message);
+ }
+ if (error.stack) {
+ errorArgs.push(error.stack);
+ }
+
+ if (typeof error === 'string') {
+ errorArgs.push(error);
+ }
+ }
+
+ _emberConsole.default.error.apply(this, errorArgs);
+ }
+
+ /**
+ Finds the name of the substate route if it exists for the given route. A
+ substate route is of the form `route_state`, such as `foo_loading`.
+
+ @private
+ @param {Route} route
+ @param {String} state
+ @return {String}
+ */
+ function findRouteSubstateName(route, state) {
+ var owner = (0, _emberUtils.getOwner)(route);
+ var routeName = route.routeName,
+ fullRouteName = route.fullRouteName,
+ router = route.router;
+
+
+ var substateName = routeName + '_' + state;
+ var substateNameFull = fullRouteName + '_' + state;
+
+ return routeHasBeenDefined(owner, router, substateName, substateNameFull) ? substateNameFull : '';
+ }
+
+ /**
+ Finds the name of the state route if it exists for the given route. A state
+ route is of the form `route.state`, such as `foo.loading`. Properly Handles
+ `application` named routes.
+
+ @private
+ @param {Route} route
+ @param {String} state
+ @return {String}
+ */
+ function findRouteStateName(route, state) {
+ var owner = (0, _emberUtils.getOwner)(route);
+ var routeName = route.routeName,
+ fullRouteName = route.fullRouteName,
+ router = route.router;
+
+
+ var stateName = routeName === 'application' ? state : routeName + '.' + state;
+ var stateNameFull = fullRouteName === 'application' ? state : fullRouteName + '.' + state;
+
+ return routeHasBeenDefined(owner, router, stateName, stateNameFull) ? stateNameFull : '';
+ }
+
+ /**
+ Determines whether or not a route has been defined by checking that the route
+ is in the Router's map and the owner has a registration for that route.
+
+ @private
+ @param {Owner} owner
+ @param {Router} router
+ @param {String} localName
+ @param {String} fullName
+ @return {Boolean}
+ */
+ function routeHasBeenDefined(owner, router, localName, fullName) {
+ var routerHasRoute = router.hasRoute(fullName);
+ var ownerHasRoute = owner.hasRegistration('template:' + localName) || owner.hasRegistration('route:' + localName);
+ return routerHasRoute && ownerHasRoute;
+ }
+
+ function triggerEvent(handlerInfos, ignoreFailure, args) {
+ var name = args.shift();
+
+ if (!handlerInfos) {
+ if (ignoreFailure) {
+ return;
+ }
+ throw new _emberDebug.Error('Can\'t trigger action \'' + name + '\' because your app hasn\'t finished transitioning into its first route. To trigger an action on destination routes during a transition, you can call `.send()` on the `Transition` object passed to the `model/beforeModel/afterModel` hooks.');
+ }
+
+ var eventWasHandled = false;
+ var handlerInfo = void 0,
+ handler = void 0,
+ actionHandler = void 0;
+
+ for (var i = handlerInfos.length - 1; i >= 0; i--) {
+ handlerInfo = handlerInfos[i];
+ handler = handlerInfo.handler;
+ actionHandler = handler && handler.actions && handler.actions[name];
+ if (actionHandler) {
+ if (actionHandler.apply(handler, args) === true) {
+ eventWasHandled = true;
+ } else {
+ // Should only hit here if a non-bubbling error action is triggered on a route.
+ if (name === 'error') {
+ handler.router._markErrorAsHandled(args[0]);
+ }
+ return;
+ }
+ }
+ }
+
+ var defaultHandler = defaultActionHandlers[name];
+ if (defaultHandler) {
+ defaultHandler.apply(this, [handlerInfos].concat(args));
+ return;
+ }
+
+ if (!eventWasHandled && !ignoreFailure) {
+ throw new _emberDebug.Error('Nothing handled the action \'' + name + '\'. If you did handle the action, this error can be caused by returning true from an action handler in a controller, causing the action to bubble.');
+ }
+ }
+
+ function calculatePostTransitionState(emberRouter, leafRouteName, contexts) {
+ var state = emberRouter._routerMicrolib.applyIntent(leafRouteName, contexts);
+ var handlerInfos = state.handlerInfos,
+ params = state.params;
+
+
+ for (var i = 0; i < handlerInfos.length; ++i) {
+ var handlerInfo = handlerInfos[i];
+
+ // If the handlerInfo is not resolved, we serialize the context into params
+ if (!handlerInfo.isResolved) {
+ params[handlerInfo.name] = handlerInfo.serialize(handlerInfo.context);
+ } else {
+ params[handlerInfo.name] = handlerInfo.params;
+ }
+ }
+ return state;
+ }
+
+ function updatePaths(router) {
+ var infos = router._routerMicrolib.currentHandlerInfos;
+ if (infos.length === 0) {
+ return;
+ }
+
+ var path = EmberRouter._routePath(infos);
+ var currentRouteName = infos[infos.length - 1].name;
+ var currentURL = router.get('location').getURL();
+
+ (0, _emberMetal.set)(router, 'currentPath', path);
+ (0, _emberMetal.set)(router, 'currentRouteName', currentRouteName);
+ (0, _emberMetal.set)(router, 'currentURL', currentURL);
+
+ var appController = (0, _emberUtils.getOwner)(router).lookup('controller:application');
+
+ if (!appController) {
+ // appController might not exist when top-level loading/error
+ // substates have been entered since ApplicationRoute hasn't
+ // actually been entered at that point.
+ return;
+ }
+
+ if (!('currentPath' in appController)) {
+ (0, _emberMetal.defineProperty)(appController, 'currentPath');
+ }
+
+ (0, _emberMetal.set)(appController, 'currentPath', path);
+
+ if (!('currentRouteName' in appController)) {
+ (0, _emberMetal.defineProperty)(appController, 'currentRouteName');
+ }
+
+ (0, _emberMetal.set)(appController, 'currentRouteName', currentRouteName);
+ }
+
+ EmberRouter.reopenClass({
+ map: function (callback) {
+ if (!this.dslCallbacks) {
+ this.dslCallbacks = [];
+ this.reopenClass({ dslCallbacks: this.dslCallbacks });
+ }
+
+ this.dslCallbacks.push(callback);
+
+ return this;
+ },
+ _routePath: function (handlerInfos) {
+ var path = [];
+
+ // We have to handle coalescing resource names that
+ // are prefixed with their parent's names, e.g.
+ // ['foo', 'foo.bar.baz'] => 'foo.bar.baz', not 'foo.foo.bar.baz'
+
+ function intersectionMatches(a1, a2) {
+ for (var i = 0; i < a1.length; ++i) {
+ if (a1[i] !== a2[i]) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ var name = void 0,
+ nameParts = void 0,
+ oldNameParts = void 0;
+ for (var i = 1; i < handlerInfos.length; i++) {
+ name = handlerInfos[i].name;
+ nameParts = name.split('.');
+ oldNameParts = slice.call(path);
+
+ while (oldNameParts.length) {
+ if (intersectionMatches(oldNameParts, nameParts)) {
+ break;
+ }
+ oldNameParts.shift();
+ }
+
+ path.push.apply(path, nameParts.slice(oldNameParts.length));
+ }
+
+ return path.join('.');
+ }
+ });
+
+ function didBeginTransition(transition, router) {
+ var routerState = _router_state.default.create({
+ emberRouter: router,
+ routerJs: router._routerMicrolib,
+ routerJsState: transition.state
+ });
+
+ if (!router.currentState) {
+ router.set('currentState', routerState);
+ }
+ router.set('targetState', routerState);
+
+ transition.promise = transition.catch(function (error) {
+ if (router._isErrorHandled(error)) {
+ router._clearHandledError(error);
+ } else {
+ throw error;
+ }
+ });
+ }
+
+ function forEachQueryParam(router, handlerInfos, queryParams, callback) {
+ var qpCache = router._queryParamsFor(handlerInfos);
+
+ for (var key in queryParams) {
+ if (!queryParams.hasOwnProperty(key)) {
+ continue;
+ }
+ var value = queryParams[key];
+ var qp = qpCache.map[key];
+
+ callback(key, value, qp);
+ }
+ }
+
+ function findLiveRoute(liveRoutes, name) {
+ if (!liveRoutes) {
+ return;
+ }
+ var stack = [liveRoutes];
+ while (stack.length > 0) {
+ var test = stack.shift();
+ if (test.render.name === name) {
+ return test;
+ }
+ var outlets = test.outlets;
+ for (var outletName in outlets) {
+ stack.push(outlets[outletName]);
+ }
+ }
+ }
+
+ function appendLiveRoute(liveRoutes, defaultParentState, renderOptions) {
+ var target = void 0;
+ var myState = {
+ render: renderOptions,
+ outlets: Object.create(null),
+ wasUsed: false
+ };
+ if (renderOptions.into) {
+ target = findLiveRoute(liveRoutes, renderOptions.into);
+ } else {
+ target = defaultParentState;
+ }
+ if (target) {
+ (0, _emberMetal.set)(target.outlets, renderOptions.outlet, myState);
+ } else {
+ if (renderOptions.into) {
+ (true && !(false) && (0, _emberDebug.deprecate)('Rendering into a {{render}} helper that resolves to an {{outlet}} is deprecated.', false, {
+ id: 'ember-routing.top-level-render-helper',
+ until: '3.0.0',
+ url: 'https://emberjs.com/deprecations/v2.x/#toc_rendering-into-a-render-helper-that-resolves-to-an-outlet'
+ }));
+
+
+ // Megahax time. Post-3.0-breaking-changes, we will just assert
+ // right here that the user tried to target a nonexistent
+ // thing. But for now we still need to support the `render`
+ // helper, and people are allowed to target templates rendered
+ // by the render helper. So instead we defer doing anyting with
+ // these orphan renders until afterRender.
+ appendOrphan(liveRoutes, renderOptions.into, myState);
+ } else {
+ liveRoutes = myState;
+ }
+ }
+ return {
+ liveRoutes: liveRoutes,
+ ownState: myState
+ };
+ }
+
+ function appendOrphan(liveRoutes, into, myState) {
+ if (!liveRoutes.outlets.__ember_orphans__) {
+ liveRoutes.outlets.__ember_orphans__ = {
+ render: {
+ name: '__ember_orphans__'
+ },
+ outlets: Object.create(null)
+ };
+ }
+ liveRoutes.outlets.__ember_orphans__.outlets[into] = myState;
+ _emberMetal.run.schedule('afterRender', function () {
+ (true && !(liveRoutes.outlets.__ember_orphans__.outlets[into].wasUsed) && (0, _emberDebug.assert)('You attempted to render into \'' + into + '\' but it was not found', liveRoutes.outlets.__ember_orphans__.outlets[into].wasUsed));
+ });
+ }
+
+ function representEmptyRoute(liveRoutes, defaultParentState, route) {
+ // the route didn't render anything
+ var alreadyAppended = findLiveRoute(liveRoutes, route.routeName);
+ if (alreadyAppended) {
+ // But some other route has already rendered our default
+ // template, so that becomes the default target for any
+ // children we may have.
+ return alreadyAppended;
+ } else {
+ // Create an entry to represent our default template name,
+ // just so other routes can target it and inherit its place
+ // in the outlet hierarchy.
+ defaultParentState.outlets.main = {
+ render: {
+ name: route.routeName,
+ outlet: 'main'
+ },
+ outlets: {}
+ };
+ return defaultParentState;
+ }
+ }
+
+ exports.default = EmberRouter;
+});
+enifed('ember-routing/system/router_state', ['exports', 'ember-utils', 'ember-routing/utils', 'ember-runtime'], function (exports, _emberUtils, _utils, _emberRuntime) {
+ 'use strict';
+
+ exports.default = _emberRuntime.Object.extend({
+ emberRouter: null,
+ routerJs: null,
+ routerJsState: null,
+
+ isActiveIntent: function (routeName, models, queryParams, queryParamsMustMatch) {
+ var state = this.routerJsState;
+ if (!this.routerJs.isActiveIntent(routeName, models, null, state)) {
+ return false;
+ }
+
+ if (queryParamsMustMatch && Object.keys(queryParams).length > 0) {
+ var visibleQueryParams = (0, _emberUtils.assign)({}, queryParams);
+
+ this.emberRouter._prepareQueryParams(routeName, models, visibleQueryParams);
+ return (0, _utils.shallowEqual)(visibleQueryParams, state.queryParams);
+ }
+
+ return true;
+ }
+ });
+});
+enifed('ember-routing/utils', ['exports', 'ember-utils', 'ember-metal', 'ember-debug'], function (exports, _emberUtils, _emberMetal, _emberDebug) {
+ 'use strict';
+
+ exports.extractRouteArgs = extractRouteArgs;
+ exports.getActiveTargetName = getActiveTargetName;
+ exports.stashParamNames = stashParamNames;
+ exports.calculateCacheKey = calculateCacheKey;
+ exports.normalizeControllerQueryParams = normalizeControllerQueryParams;
+ exports.resemblesURL = resemblesURL;
+ exports.prefixRouteNameArg = prefixRouteNameArg;
+ exports.shallowEqual = shallowEqual;
+
+
+ var ALL_PERIODS_REGEX = /\./g;
+
+ function extractRouteArgs(args) {
+ args = args.slice();
+ var possibleQueryParams = args[args.length - 1];
+
+ var queryParams = void 0;
+ if (possibleQueryParams && possibleQueryParams.hasOwnProperty('queryParams')) {
+ queryParams = args.pop().queryParams;
+ } else {
+ queryParams = {};
+ }
+
+ var routeName = args.shift();
+
+ return { routeName: routeName, models: args, queryParams: queryParams };
+ }
+
+ function getActiveTargetName(router) {
+ var handlerInfos = router.activeTransition ? router.activeTransition.state.handlerInfos : router.state.handlerInfos;
+ return handlerInfos[handlerInfos.length - 1].name;
+ }
+
+ function stashParamNames(router, handlerInfos) {
+ if (handlerInfos._namesStashed) {
+ return;
+ }
+
+ // This helper exists because router.js/route-recognizer.js awkwardly
+ // keeps separate a handlerInfo's list of parameter names depending
+ // on whether a URL transition or named transition is happening.
+ // Hopefully we can remove this in the future.
+ var targetRouteName = handlerInfos[handlerInfos.length - 1].name;
+ var recogHandlers = router._routerMicrolib.recognizer.handlersFor(targetRouteName);
+ var dynamicParent = null;
+
+ for (var i = 0; i < handlerInfos.length; ++i) {
+ var handlerInfo = handlerInfos[i];
+ var names = recogHandlers[i].names;
+
+ if (names.length) {
+ dynamicParent = handlerInfo;
+ }
+
+ handlerInfo._names = names;
+
+ var route = handlerInfo.handler;
+ route._stashNames(handlerInfo, dynamicParent);
+ }
+
+ handlerInfos._namesStashed = true;
+ }
+
+ function _calculateCacheValuePrefix(prefix, part) {
+ // calculates the dot separated sections from prefix that are also
+ // at the start of part - which gives us the route name
+
+ // given : prefix = site.article.comments, part = site.article.id
+ // - returns: site.article (use get(values[site.article], 'id') to get the dynamic part - used below)
+
+ // given : prefix = site.article, part = site.article.id
+ // - returns: site.article. (use get(values[site.article], 'id') to get the dynamic part - used below)
+
+ var prefixParts = prefix.split('.');
+ var currPrefix = '';
+
+ for (var i = 0; i < prefixParts.length; i++) {
+ var currPart = prefixParts.slice(0, i + 1).join('.');
+ if (part.indexOf(currPart) !== 0) {
+ break;
+ }
+ currPrefix = currPart;
+ }
+
+ return currPrefix;
+ }
+
+ /*
+ Stolen from Controller
+ */
+ function calculateCacheKey(prefix) {
+ var parts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
+ var values = arguments[2];
+
+ var suffixes = '';
+ for (var i = 0; i < parts.length; ++i) {
+ var part = parts[i];
+ var cacheValuePrefix = _calculateCacheValuePrefix(prefix, part);
+ var value = void 0;
+ if (values) {
+ if (cacheValuePrefix && cacheValuePrefix in values) {
+ var partRemovedPrefix = part.indexOf(cacheValuePrefix) === 0 ? part.substr(cacheValuePrefix.length + 1) : part;
+ value = (0, _emberMetal.get)(values[cacheValuePrefix], partRemovedPrefix);
+ } else {
+ value = (0, _emberMetal.get)(values, part);
+ }
+ }
+ suffixes += '::' + part + ':' + value;
+ }
+ return prefix + suffixes.replace(ALL_PERIODS_REGEX, '-');
+ }
+
+ /*
+ Controller-defined query parameters can come in three shapes:
+
+ Array
+ queryParams: ['foo', 'bar']
+ Array of simple objects where value is an alias
+ queryParams: [
+ {
+ 'foo': 'rename_foo_to_this'
+ },
+ {
+ 'bar': 'call_bar_this_instead'
+ }
+ ]
+ Array of fully defined objects
+ queryParams: [
+ {
+ 'foo': {
+ as: 'rename_foo_to_this'
+ },
+ }
+ {
+ 'bar': {
+ as: 'call_bar_this_instead',
+ scope: 'controller'
+ }
+ }
+ ]
+
+ This helper normalizes all three possible styles into the
+ 'Array of fully defined objects' style.
+ */
+ function normalizeControllerQueryParams(queryParams) {
+ var qpMap = {};
+
+ for (var i = 0; i < queryParams.length; ++i) {
+ accumulateQueryParamDescriptors(queryParams[i], qpMap);
+ }
+
+ return qpMap;
+ }
+
+ function accumulateQueryParamDescriptors(_desc, accum) {
+ var desc = _desc;
+ var tmp = void 0;
+ if (typeof desc === 'string') {
+ tmp = {};
+ tmp[desc] = { as: null };
+ desc = tmp;
+ }
+
+ for (var key in desc) {
+ if (!desc.hasOwnProperty(key)) {
+ return;
+ }
+
+ var singleDesc = desc[key];
+ if (typeof singleDesc === 'string') {
+ singleDesc = { as: singleDesc };
+ }
+
+ tmp = accum[key] || { as: null, scope: 'model' };
+ (0, _emberUtils.assign)(tmp, singleDesc);
+
+ accum[key] = tmp;
+ }
+ }
+
+ /*
+ Check if a routeName resembles a url instead
+
+ @private
+ */
+ function resemblesURL(str) {
+ return typeof str === 'string' && (str === '' || str[0] === '/');
+ }
+
+ /*
+ Returns an arguments array where the route name arg is prefixed based on the mount point
+
+ @private
+ */
+ function prefixRouteNameArg(route, args) {
+ var routeName = args[0];
+ var owner = (0, _emberUtils.getOwner)(route);
+ var prefix = owner.mountPoint;
+
+ // only alter the routeName if it's actually referencing a route.
+ if (owner.routable && typeof routeName === 'string') {
+ if (resemblesURL(routeName)) {
+ throw new _emberDebug.Error('Programmatic transitions by URL cannot be used within an Engine. Please use the route name instead.');
+ } else {
+ routeName = prefix + '.' + routeName;
+ args[0] = routeName;
+ }
+ }
+
+ return args;
+ }
+
+ function shallowEqual(a, b) {
+ var k = void 0;
+ var aCount = 0;
+ var bCount = 0;
+ for (k in a) {
+ if (a.hasOwnProperty(k)) {
+ if (a[k] !== b[k]) {
+ return false;
+ }
+ aCount++;
+ }
+ }
+
+ for (k in b) {
+ if (b.hasOwnProperty(k)) {
+ bCount++;
+ }
+ }
+
+ return aCount === bCount;
+ }
+});
+enifed('ember-runtime/compare', ['exports', 'ember-runtime/utils', 'ember-runtime/mixins/comparable'], function (exports, _utils, _comparable) {
+ 'use strict';
+
+ exports.default = compare;
+
+
+ var TYPE_ORDER = {
+ 'undefined': 0,
+ 'null': 1,
+ 'boolean': 2,
+ 'number': 3,
+ 'string': 4,
+ 'array': 5,
+ 'object': 6,
+ 'instance': 7,
+ 'function': 8,
+ 'class': 9,
+ 'date': 10
+ };
+
+ //
+ // the spaceship operator
+ //
+ // `. ___
+ // __,' __`. _..----....____
+ // __...--.'``;. ,. ;``--..__ .' ,-._ _.-'
+ // _..-''-------' `' `' `' O ``-''._ (,;') _,'
+ // ,'________________ \`-._`-','
+ // `._ ```````````------...___ '-.._'-:
+ // ```--.._ ,. ````--...__\-.
+ // `.--. `-` "INFINITY IS LESS ____ | |`
+ // `. `. THAN BEYOND" ,'`````. ; ;`
+ // `._`. __________ `. \'__/`
+ // `-:._____/______/___/____`. \ `
+ // | `._ `. \
+ // `._________`-. `. `.___
+ // SSt `------'`
+ function spaceship(a, b) {
+ var diff = a - b;
+ return (diff > 0) - (diff < 0);
+ }
+
+ /**
+ @module @ember/utils
+ */
+
+ /**
+ Compares two javascript values and returns:
+
+ - -1 if the first is smaller than the second,
+ - 0 if both are equal,
+ - 1 if the first is greater than the second.
+
+ ```javascript
+ import { compare } from '@ember/utils';
+
+ compare('hello', 'hello'); // 0
+ compare('abc', 'dfg'); // -1
+ compare(2, 1); // 1
+ ```
+
+ If the types of the two objects are different precedence occurs in the
+ following order, with types earlier in the list considered `<` types
+ later in the list:
+
+ - undefined
+ - null
+ - boolean
+ - number
+ - string
+ - array
+ - object
+ - instance
+ - function
+ - class
+ - date
+
+ ```javascript
+ import { compare } from '@ember/utils';
+
+ compare('hello', 50); // 1
+ compare(50, 'hello'); // -1
+ ```
+
+ @method compare
+ @for @ember/utils
+ @static
+ @param {Object} v First value to compare
+ @param {Object} w Second value to compare
+ @return {Number} -1 if v < w, 0 if v = w and 1 if v > w.
+ @public
+ */
+ function compare(v, w) {
+ if (v === w) {
+ return 0;
+ }
+
+ var type1 = (0, _utils.typeOf)(v);
+ var type2 = (0, _utils.typeOf)(w);
+
+ if (_comparable.default) {
+ if (type1 === 'instance' && _comparable.default.detect(v) && v.constructor.compare) {
+ return v.constructor.compare(v, w);
+ }
+
+ if (type2 === 'instance' && _comparable.default.detect(w) && w.constructor.compare) {
+ return w.constructor.compare(w, v) * -1;
+ }
+ }
+
+ var res = spaceship(TYPE_ORDER[type1], TYPE_ORDER[type2]);
+
+ if (res !== 0) {
+ return res;
+ }
+
+ // types are equal - so we have to check values now
+ switch (type1) {
+ case 'boolean':
+ case 'number':
+ return spaceship(v, w);
+
+ case 'string':
+ return spaceship(v.localeCompare(w), 0);
+
+ case 'array':
+ {
+ var vLen = v.length;
+ var wLen = w.length;
+ var len = Math.min(vLen, wLen);
+
+ for (var i = 0; i < len; i++) {
+ var r = compare(v[i], w[i]);
+ if (r !== 0) {
+ return r;
+ }
+ }
+
+ // all elements are equal now
+ // shorter array should be ordered first
+ return spaceship(vLen, wLen);
+ }
+ case 'instance':
+ if (_comparable.default && _comparable.default.detect(v)) {
+ return v.compare(v, w);
+ }
+ return 0;
+
+ case 'date':
+ return spaceship(v.getTime(), w.getTime());
+
+ default:
+ return 0;
+ }
+ }
+});
+enifed('ember-runtime/computed/computed_macros', ['exports', 'ember-metal', 'ember-debug'], function (exports, _emberMetal, _emberDebug) {
+ 'use strict';
+
+ exports.or = exports.and = undefined;
+ exports.empty = empty;
+ exports.notEmpty = notEmpty;
+ exports.none = none;
+ exports.not = not;
+ exports.bool = bool;
+ exports.match = match;
+ exports.equal = equal;
+ exports.gt = gt;
+ exports.gte = gte;
+ exports.lt = lt;
+ exports.lte = lte;
+ exports.oneWay = oneWay;
+ exports.readOnly = readOnly;
+ exports.deprecatingAlias = deprecatingAlias;
+
+
+ /**
+ @module @ember/object
+ */
+
+ function expandPropertiesToArray(predicateName, properties) {
+ var expandedProperties = [];
+
+ function extractProperty(entry) {
+ expandedProperties.push(entry);
+ }
+
+ for (var i = 0; i < properties.length; i++) {
+ var property = properties[i];
+ (true && !(property.indexOf(' ') < 0) && (0, _emberDebug.assert)('Dependent keys passed to computed.' + predicateName + '() can\'t have spaces.', property.indexOf(' ') < 0));
+
+
+ (0, _emberMetal.expandProperties)(property, extractProperty);
+ }
+
+ return expandedProperties;
+ }
+
+ function generateComputedWithPredicate(name, predicate) {
+ return function () {
+ for (var _len = arguments.length, properties = Array(_len), _key = 0; _key < _len; _key++) {
+ properties[_key] = arguments[_key];
+ }
+
+ var dependentKeys = expandPropertiesToArray(name, properties);
+
+ var computedFunc = new _emberMetal.ComputedProperty(function () {
+ var lastIdx = dependentKeys.length - 1;
+
+ for (var i = 0; i < lastIdx; i++) {
+ var value = (0, _emberMetal.get)(this, dependentKeys[i]);
+ if (!predicate(value)) {
+ return value;
+ }
+ }
+
+ return (0, _emberMetal.get)(this, dependentKeys[lastIdx]);
+ }, { dependentKeys: dependentKeys });
+
+ return computedFunc;
+ };
+ }
+
+ /**
+ A computed property that returns true if the value of the dependent
+ property is null, an empty string, empty array, or empty function.
+
+ Example
+
+ ```javascript
+ import { empty } from '@ember/object/computed';
+ import EmberObject from '@ember/object';
+
+ let ToDoList = EmberObject.extend({
+ isDone: empty('todos')
+ });
+
+ let todoList = ToDoList.create({
+ todos: ['Unit Test', 'Documentation', 'Release']
+ });
+
+ todoList.get('isDone'); // false
+ todoList.get('todos').clear();
+ todoList.get('isDone'); // true
+ ```
+
+ @since 1.6.0
+ @method empty
+ @static
+ @for @ember/object/computed
+ @param {String} dependentKey
+ @return {ComputedProperty} computed property which returns true if
+ the value of the dependent property is null, an empty string, empty array,
+ or empty function and false if the underlying value is not empty.
+
+ @public
+ */
+ function empty(dependentKey) {
+ return (0, _emberMetal.computed)(dependentKey + '.length', function () {
+ return (0, _emberMetal.isEmpty)((0, _emberMetal.get)(this, dependentKey));
+ });
+ }
+
+ /**
+ A computed property that returns true if the value of the dependent
+ property is NOT null, an empty string, empty array, or empty function.
+
+ Example
+
+ ```javascript
+ import { notEmpty } from '@ember/object/computed';
+ import EmberObject from '@ember/object';
+
+ let Hamster = EmberObject.extend({
+ hasStuff: notEmpty('backpack')
+ });
+
+ let hamster = Hamster.create({ backpack: ['Food', 'Sleeping Bag', 'Tent'] });
+
+ hamster.get('hasStuff'); // true
+ hamster.get('backpack').clear(); // []
+ hamster.get('hasStuff'); // false
+ ```
+
+ @method notEmpty
+ @static
+ @for @ember/object/computed
+ @param {String} dependentKey
+ @return {ComputedProperty} computed property which returns true if
+ original value for property is not empty.
+ @public
+ */
+ function notEmpty(dependentKey) {
+ return (0, _emberMetal.computed)(dependentKey + '.length', function () {
+ return !(0, _emberMetal.isEmpty)((0, _emberMetal.get)(this, dependentKey));
+ });
+ }
+
+ /**
+ A computed property that returns true if the value of the dependent
+ property is null or undefined. This avoids errors from JSLint complaining
+ about use of ==, which can be technically confusing.
+
+ Example
+
+ ```javascript
+ import { none } from '@ember/object/computed';
+ import EmberObject from '@ember/object';
+
+ let Hamster = EmberObject.extend({
+ isHungry: none('food')
+ });
+
+ let hamster = Hamster.create();
+
+ hamster.get('isHungry'); // true
+ hamster.set('food', 'Banana');
+ hamster.get('isHungry'); // false
+ hamster.set('food', null);
+ hamster.get('isHungry'); // true
+ ```
+
+ @method none
+ @static
+ @for @ember/object/computed
+ @param {String} dependentKey
+ @return {ComputedProperty} computed property which
+ returns true if original value for property is null or undefined.
+ @public
+ */
+ function none(dependentKey) {
+ return (0, _emberMetal.computed)(dependentKey, function () {
+ return (0, _emberMetal.isNone)((0, _emberMetal.get)(this, dependentKey));
+ });
+ }
+
+ /**
+ A computed property that returns the inverse boolean value
+ of the original value for the dependent property.
+
+ Example
+
+ ```javascript
+ import { not } from '@ember/object/computed';
+ import EmberObject from '@ember/object';
+
+ let User = EmberObject.extend({
+ isAnonymous: not('loggedIn')
+ });
+
+ let user = User.create({loggedIn: false});
+
+ user.get('isAnonymous'); // true
+ user.set('loggedIn', true);
+ user.get('isAnonymous'); // false
+ ```
+
+ @method not
+ @static
+ @for @ember/object/computed
+ @param {String} dependentKey
+ @return {ComputedProperty} computed property which returns
+ inverse of the original value for property
+ @public
+ */
+ function not(dependentKey) {
+ return (0, _emberMetal.computed)(dependentKey, function () {
+ return !(0, _emberMetal.get)(this, dependentKey);
+ });
+ }
+
+ /**
+ A computed property that converts the provided dependent property
+ into a boolean value.
+
+ ```javascript
+ import { bool } from '@ember/object/computed';
+ import EmberObject from '@ember/object';
+
+ let Hamster = EmberObject.extend({
+ hasBananas: bool('numBananas')
+ });
+
+ let hamster = Hamster.create();
+
+ hamster.get('hasBananas'); // false
+ hamster.set('numBananas', 0);
+ hamster.get('hasBananas'); // false
+ hamster.set('numBananas', 1);
+ hamster.get('hasBananas'); // true
+ hamster.set('numBananas', null);
+ hamster.get('hasBananas'); // false
+ ```
+
+ @method bool
+ @static
+ @for @ember/object/computed
+ @param {String} dependentKey
+ @return {ComputedProperty} computed property which converts
+ to boolean the original value for property
+ @public
+ */
+ function bool(dependentKey) {
+ return (0, _emberMetal.computed)(dependentKey, function () {
+ return !!(0, _emberMetal.get)(this, dependentKey);
+ });
+ }
+
+ /**
+ A computed property which matches the original value for the
+ dependent property against a given RegExp, returning `true`
+ if the value matches the RegExp and `false` if it does not.
+
+ Example
+
+ ```javascript
+ import { match } from '@ember/object/computed';
+ import EmberObject from '@ember/object';
+
+ let User = EmberObject.extend({
+ hasValidEmail: match('email', /^.+@.+\..+$/)
+ });
+
+ let user = User.create({loggedIn: false});
+
+ user.get('hasValidEmail'); // false
+ user.set('email', '');
+ user.get('hasValidEmail'); // false
+ user.set('email', 'ember_hamster@example.com');
+ user.get('hasValidEmail'); // true
+ ```
+
+ @method match
+ @static
+ @for @ember/object/computed
+ @param {String} dependentKey
+ @param {RegExp} regexp
+ @return {ComputedProperty} computed property which match
+ the original value for property against a given RegExp
+ @public
+ */
+ function match(dependentKey, regexp) {
+ return (0, _emberMetal.computed)(dependentKey, function () {
+ var value = (0, _emberMetal.get)(this, dependentKey);
+ return regexp.test(value);
+ });
+ }
+
+ /**
+ A computed property that returns true if the provided dependent property
+ is equal to the given value.
+
+ Example
+
+ ```javascript
+ import { equal } from '@ember/object/computed';
+ import EmberObject from '@ember/object';
+
+ let Hamster = EmberObject.extend({
+ satisfied: equal('percentCarrotsEaten', 100)
+ });
+
+ let hamster = Hamster.create();
+
+ hamster.get('satisfied'); // false
+ hamster.set('percentCarrotsEaten', 100);
+ hamster.get('satisfied'); // true
+ hamster.set('percentCarrotsEaten', 50);
+ hamster.get('satisfied'); // false
+ ```
+
+ @method equal
+ @static
+ @for @ember/object/computed
+ @param {String} dependentKey
+ @param {String|Number|Object} value
+ @return {ComputedProperty} computed property which returns true if
+ the original value for property is equal to the given value.
+ @public
+ */
+ function equal(dependentKey, value) {
+ return (0, _emberMetal.computed)(dependentKey, function () {
+ return (0, _emberMetal.get)(this, dependentKey) === value;
+ });
+ }
+
+ /**
+ A computed property that returns true if the provided dependent property
+ is greater than the provided value.
+
+ Example
+
+ ```javascript
+ import { gt } from '@ember/object/computed';
+ import EmberObject from '@ember/object';
+
+ let Hamster = EmberObject.extend({
+ hasTooManyBananas: gt('numBananas', 10)
+ });
+
+ let hamster = Hamster.create();
+
+ hamster.get('hasTooManyBananas'); // false
+ hamster.set('numBananas', 3);
+ hamster.get('hasTooManyBananas'); // false
+ hamster.set('numBananas', 11);
+ hamster.get('hasTooManyBananas'); // true
+ ```
+
+ @method gt
+ @static
+ @for @ember/object/computed
+ @param {String} dependentKey
+ @param {Number} value
+ @return {ComputedProperty} computed property which returns true if
+ the original value for property is greater than given value.
+ @public
+ */
+ function gt(dependentKey, value) {
+ return (0, _emberMetal.computed)(dependentKey, function () {
+ return (0, _emberMetal.get)(this, dependentKey) > value;
+ });
+ }
+
+ /**
+ A computed property that returns true if the provided dependent property
+ is greater than or equal to the provided value.
+
+ Example
+
+ ```javascript
+ import { gte } from '@ember/object/computed';
+ import EmberObject from '@ember/object';
+
+ let Hamster = EmberObject.extend({
+ hasTooManyBananas: gte('numBananas', 10)
+ });
+
+ let hamster = Hamster.create();
+
+ hamster.get('hasTooManyBananas'); // false
+ hamster.set('numBananas', 3);
+ hamster.get('hasTooManyBananas'); // false
+ hamster.set('numBananas', 10);
+ hamster.get('hasTooManyBananas'); // true
+ ```
+
+ @method gte
+ @static
+ @for @ember/object/computed
+ @param {String} dependentKey
+ @param {Number} value
+ @return {ComputedProperty} computed property which returns true if
+ the original value for property is greater or equal then given value.
+ @public
+ */
+ function gte(dependentKey, value) {
+ return (0, _emberMetal.computed)(dependentKey, function () {
+ return (0, _emberMetal.get)(this, dependentKey) >= value;
+ });
+ }
+
+ /**
+ A computed property that returns true if the provided dependent property
+ is less than the provided value.
+
+ Example
+
+ ```javascript
+ import { lt } from '@ember/object/computed';
+ import EmberObject from '@ember/object';
+
+ let Hamster = EmberObject.extend({
+ needsMoreBananas: lt('numBananas', 3)
+ });
+
+ let hamster = Hamster.create();
+
+ hamster.get('needsMoreBananas'); // true
+ hamster.set('numBananas', 3);
+ hamster.get('needsMoreBananas'); // false
+ hamster.set('numBananas', 2);
+ hamster.get('needsMoreBananas'); // true
+ ```
+
+ @method lt
+ @static
+ @for @ember/object/computed
+ @param {String} dependentKey
+ @param {Number} value
+ @return {ComputedProperty} computed property which returns true if
+ the original value for property is less then given value.
+ @public
+ */
+ function lt(dependentKey, value) {
+ return (0, _emberMetal.computed)(dependentKey, function () {
+ return (0, _emberMetal.get)(this, dependentKey) < value;
+ });
+ }
+
+ /**
+ A computed property that returns true if the provided dependent property
+ is less than or equal to the provided value.
+
+ Example
+
+ ```javascript
+ import { lte } from '@ember/object/computed';
+ import EmberObject from '@ember/object';
+
+ let Hamster = EmberObject.extend({
+ needsMoreBananas: lte('numBananas', 3)
+ });
+
+ let hamster = Hamster.create();
+
+ hamster.get('needsMoreBananas'); // true
+ hamster.set('numBananas', 5);
+ hamster.get('needsMoreBananas'); // false
+ hamster.set('numBananas', 3);
+ hamster.get('needsMoreBananas'); // true
+ ```
+
+ @method lte
+ @static
+ @for @ember/object/computed
+ @param {String} dependentKey
+ @param {Number} value
+ @return {ComputedProperty} computed property which returns true if
+ the original value for property is less or equal than given value.
+ @public
+ */
+ function lte(dependentKey, value) {
+ return (0, _emberMetal.computed)(dependentKey, function () {
+ return (0, _emberMetal.get)(this, dependentKey) <= value;
+ });
+ }
+
+ /**
+ A computed property that performs a logical `and` on the
+ original values for the provided dependent properties.
+
+ You may pass in more than two properties and even use
+ property brace expansion. The computed property will
+ return the first falsy value or last truthy value
+ just like JavaScript's `&&` operator.
+
+ Example
+
+ ```javascript
+ import { and } from '@ember/object/computed';
+ import EmberObject from '@ember/object';
+
+ let Hamster = EmberObject.extend({
+ readyForCamp: and('hasTent', 'hasBackpack'),
+ readyForHike: and('hasWalkingStick', 'hasBackpack')
+ });
+
+ let tomster = Hamster.create();
+
+ tomster.get('readyForCamp'); // false
+ tomster.set('hasTent', true);
+ tomster.get('readyForCamp'); // false
+ tomster.set('hasBackpack', true);
+ tomster.get('readyForCamp'); // true
+ tomster.set('hasBackpack', 'Yes');
+ tomster.get('readyForCamp'); // 'Yes'
+ tomster.set('hasWalkingStick', null);
+ tomster.get('readyForHike'); // null
+ ```
+
+ @method and
+ @static
+ @for @ember/object/computed
+ @param {String} dependentKey*
+ @return {ComputedProperty} computed property which performs
+ a logical `and` on the values of all the original values for properties.
+ @public
+ */
+ var and = exports.and = generateComputedWithPredicate('and', function (value) {
+ return value;
+ });
+
+ /**
+ A computed property which performs a logical `or` on the
+ original values for the provided dependent properties.
+
+ You may pass in more than two properties and even use
+ property brace expansion. The computed property will
+ return the first truthy value or last falsy value just
+ like JavaScript's `||` operator.
+
+ Example
+
+ ```javascript
+ import { or } from '@ember/object/computed';
+ import EmberObject from '@ember/object';
+
+ let Hamster = EmberObject.extend({
+ readyForRain: or('hasJacket', 'hasUmbrella'),
+ readyForBeach: or('{hasSunscreen,hasUmbrella}')
+ });
+
+ let tomster = Hamster.create();
+
+ tomster.get('readyForRain'); // undefined
+ tomster.set('hasUmbrella', true);
+ tomster.get('readyForRain'); // true
+ tomster.set('hasJacket', 'Yes');
+ tomster.get('readyForRain'); // 'Yes'
+ tomster.set('hasSunscreen', 'Check');
+ tomster.get('readyForBeach'); // 'Check'
+ ```
+
+ @method or
+ @static
+ @for @ember/object/computed
+ @param {String} dependentKey*
+ @return {ComputedProperty} computed property which performs
+ a logical `or` on the values of all the original values for properties.
+ @public
+ */
+ var or = exports.or = generateComputedWithPredicate('or', function (value) {
+ return !value;
+ });
+
+ /**
+ Creates a new property that is an alias for another property
+ on an object. Calls to `get` or `set` this property behave as
+ though they were called on the original property.
+
+ ```javascript
+ import { alias } from '@ember/object/computed';
+ import EmberObject from '@ember/object';
+
+ let Person = EmberObject.extend({
+ name: 'Alex Matchneer',
+ nomen: alias('name')
+ });
+
+ let alex = Person.create();
+
+ alex.get('nomen'); // 'Alex Matchneer'
+ alex.get('name'); // 'Alex Matchneer'
+
+ alex.set('nomen', '@machty');
+ alex.get('name'); // '@machty'
+ ```
+
+ @method alias
+ @static
+ @for @ember/object/computed
+ @param {String} dependentKey
+ @return {ComputedProperty} computed property which creates an
+ alias to the original value for property.
+ @public
+ */
+
+ /**
+ Where `computed.alias` aliases `get` and `set`, and allows for bidirectional
+ data flow, `computed.oneWay` only provides an aliased `get`. The `set` will
+ not mutate the upstream property, rather causes the current property to
+ become the value set. This causes the downstream property to permanently
+ diverge from the upstream property.
+
+ Example
+
+ ```javascript
+ import { oneWay } from '@ember/object/computed';
+ import EmberObject from '@ember/object';
+
+ let User = EmberObject.extend({
+ firstName: null,
+ lastName: null,
+ nickName: oneWay('firstName')
+ });
+
+ let teddy = User.create({
+ firstName: 'Teddy',
+ lastName: 'Zeenny'
+ });
+
+ teddy.get('nickName'); // 'Teddy'
+ teddy.set('nickName', 'TeddyBear'); // 'TeddyBear'
+ teddy.get('firstName'); // 'Teddy'
+ ```
+
+ @method oneWay
+ @static
+ @for @ember/object/computed
+ @param {String} dependentKey
+ @return {ComputedProperty} computed property which creates a
+ one way computed property to the original value for property.
+ @public
+ */
+ function oneWay(dependentKey) {
+ return (0, _emberMetal.alias)(dependentKey).oneWay();
+ }
+
+ /**
+ This is a more semantically meaningful alias of `computed.oneWay`,
+ whose name is somewhat ambiguous as to which direction the data flows.
+
+ @method reads
+ @static
+ @for @ember/object/computed
+ @param {String} dependentKey
+ @return {ComputedProperty} computed property which creates a
+ one way computed property to the original value for property.
+ @public
+ */
+
+ /**
+ Where `computed.oneWay` provides oneWay bindings, `computed.readOnly` provides
+ a readOnly one way binding. Very often when using `computed.oneWay` one does
+ not also want changes to propagate back up, as they will replace the value.
+
+ This prevents the reverse flow, and also throws an exception when it occurs.
+
+ Example
+
+ ```javascript
+ import { readOnly } from '@ember/object/computed';
+ import EmberObject from '@ember/object';
+
+ let User = EmberObject.extend({
+ firstName: null,
+ lastName: null,
+ nickName: readOnly('firstName')
+ });
+
+ let teddy = User.create({
+ firstName: 'Teddy',
+ lastName: 'Zeenny'
+ });
+
+ teddy.get('nickName'); // 'Teddy'
+ teddy.set('nickName', 'TeddyBear'); // throws Exception
+ // throw new EmberError('Cannot Set: nickName on: <User:ember27288>' );`
+ teddy.get('firstName'); // 'Teddy'
+ ```
+
+ @method readOnly
+ @static
+ @for @ember/object/computed
+ @param {String} dependentKey
+ @return {ComputedProperty} computed property which creates a
+ one way computed property to the original value for property.
+ @since 1.5.0
+ @public
+ */
+ function readOnly(dependentKey) {
+ return (0, _emberMetal.alias)(dependentKey).readOnly();
+ }
+
+ /**
+ Creates a new property that is an alias for another property
+ on an object. Calls to `get` or `set` this property behave as
+ though they were called on the original property, but also
+ print a deprecation warning.
+
+ ```javascript
+ import { deprecatingAlias } from '@ember/object/computed';
+ import EmberObject from '@ember/object';
+
+ let Hamster = EmberObject.extend({
+ bananaCount: deprecatingAlias('cavendishCount', {
+ id: 'hamster.deprecate-banana',
+ until: '3.0.0'
+ })
+ });
+
+ let hamster = Hamster.create();
+
+ hamster.set('bananaCount', 5); // Prints a deprecation warning.
+ hamster.get('cavendishCount'); // 5
+ ```
+
+ @method deprecatingAlias
+ @static
+ @for @ember/object/computed
+ @param {String} dependentKey
+ @param {Object} options Options for `deprecate`.
+ @return {ComputedProperty} computed property which creates an
+ alias with a deprecation to the original value for property.
+ @since 1.7.0
+ @public
+ */
+ function deprecatingAlias(dependentKey, options) {
+ return (0, _emberMetal.computed)(dependentKey, {
+ get: function (key) {
+ (true && !(false) && (0, _emberDebug.deprecate)('Usage of `' + key + '` is deprecated, use `' + dependentKey + '` instead.', false, options));
+
+ return (0, _emberMetal.get)(this, dependentKey);
+ },
+ set: function (key, value) {
+ (true && !(false) && (0, _emberDebug.deprecate)('Usage of `' + key + '` is deprecated, use `' + dependentKey + '` instead.', false, options));
+
+ (0, _emberMetal.set)(this, dependentKey, value);
+ return value;
+ }
+ });
+ }
+});
+enifed('ember-runtime/computed/reduce_computed_macros', ['exports', 'ember-debug', 'ember-metal', 'ember-runtime/compare', 'ember-runtime/utils', 'ember-runtime/system/native_array'], function (exports, _emberDebug, _emberMetal, _compare, _utils, _native_array) {
+ 'use strict';
+
+ exports.union = undefined;
+ exports.sum = sum;
+ exports.max = max;
+ exports.min = min;
+ exports.map = map;
+ exports.mapBy = mapBy;
+ exports.filter = filter;
+ exports.filterBy = filterBy;
+ exports.uniq = uniq;
+ exports.uniqBy = uniqBy;
+ exports.intersect = intersect;
+ exports.setDiff = setDiff;
+ exports.collect = collect;
+ exports.sort = sort;
+
+
+ function reduceMacro(dependentKey, callback, initialValue, name) {
+ (true && !(!/[\[\]\{\}]/g.test(dependentKey)) && (0, _emberDebug.assert)('Dependent key passed to `computed.' + name + '` shouldn\'t contain brace expanding pattern.', !/[\[\]\{\}]/g.test(dependentKey)));
+
+
+ var cp = new _emberMetal.ComputedProperty(function () {
+ var arr = (0, _emberMetal.get)(this, dependentKey);
+ if (arr === null || typeof arr !== 'object') {
+ return initialValue;
+ }
+ return arr.reduce(callback, initialValue, this);
+ }, { dependentKeys: [dependentKey + '.[]'], readOnly: true });
+
+ return cp;
+ } /**
+ @module @ember/object
+ */
+
+
+ function arrayMacro(dependentKey, callback) {
+ // This is a bit ugly
+ var propertyName = void 0;
+ if (/@each/.test(dependentKey)) {
+ propertyName = dependentKey.replace(/\.@each.*$/, '');
+ } else {
+ propertyName = dependentKey;
+ dependentKey += '.[]';
+ }
+
+ var cp = new _emberMetal.ComputedProperty(function () {
+ var value = (0, _emberMetal.get)(this, propertyName);
+ if ((0, _utils.isArray)(value)) {
+ return (0, _native_array.A)(callback.call(this, value));
+ } else {
+ return (0, _native_array.A)();
+ }
+ }, { readOnly: true });
+
+ cp.property(dependentKey); // this forces to expand properties GH #15855
+
+ return cp;
+ }
+
+ function multiArrayMacro(_dependentKeys, callback, name) {
+ (true && !(_dependentKeys.every(function (dependentKey) {
+ return !/[\[\]\{\}]/g.test(dependentKey);
+ })) && (0, _emberDebug.assert)('Dependent keys passed to `computed.' + name + '` shouldn\'t contain brace expanding pattern.', _dependentKeys.every(function (dependentKey) {
+ return !/[\[\]\{\}]/g.test(dependentKey);
+ })));
+
+ var dependentKeys = _dependentKeys.map(function (key) {
+ return key + '.[]';
+ });
+
+ var cp = new _emberMetal.ComputedProperty(function () {
+ return (0, _native_array.A)(callback.call(this, _dependentKeys));
+ }, { dependentKeys: dependentKeys, readOnly: true });
+
+ return cp;
+ }
+
+ /**
+ A computed property that returns the sum of the values
+ in the dependent array.
+
+ @method sum
+ @for @ember/object/computed
+ @static
+ @param {String} dependentKey
+ @return {ComputedProperty} computes the sum of all values in the dependentKey's array
+ @since 1.4.0
+ @public
+ */
+ function sum(dependentKey) {
+ return reduceMacro(dependentKey, function (sum, item) {
+ return sum + item;
+ }, 0, 'sum');
+ }
+
+ /**
+ A computed property that calculates the maximum value in the
+ dependent array. This will return `-Infinity` when the dependent
+ array is empty.
+
+ ```javascript
+ import { mapBy, max } from '@ember/object/computed';
+ import EmberObject from '@ember/object';
+
+ let Person = EmberObject.extend({
+ childAges: mapBy('children', 'age'),
+ maxChildAge: max('childAges')
+ });
+
+ let lordByron = Person.create({ children: [] });
+
+ lordByron.get('maxChildAge'); // -Infinity
+ lordByron.get('children').pushObject({
+ name: 'Augusta Ada Byron', age: 7
+ });
+ lordByron.get('maxChildAge'); // 7
+ lordByron.get('children').pushObjects([{
+ name: 'Allegra Byron',
+ age: 5
+ }, {
+ name: 'Elizabeth Medora Leigh',
+ age: 8
+ }]);
+ lordByron.get('maxChildAge'); // 8
+ ```
+
+ If the types of the arguments are not numbers,
+ they will be converted to numbers and the type
+ of the return value will always be `Number`.
+ For example, the max of a list of Date objects will be
+ the highest timestamp as a `Number`.
+ This behavior is consistent with `Math.max`.
+
+ @method max
+ @for @ember/object/computed
+ @static
+ @param {String} dependentKey
+ @return {ComputedProperty} computes the largest value in the dependentKey's array
+ @public
+ */
+ function max(dependentKey) {
+ return reduceMacro(dependentKey, function (max, item) {
+ return Math.max(max, item);
+ }, -Infinity, 'max');
+ }
+
+ /**
+ A computed property that calculates the minimum value in the
+ dependent array. This will return `Infinity` when the dependent
+ array is empty.
+
+ ```javascript
+ import { mapBy, min } from '@ember/object/computed';
+ import EmberObject from '@ember/object';
+
+ let Person = EmberObject.extend({
+ childAges: mapBy('children', 'age'),
+ minChildAge: min('childAges')
+ });
+
+ let lordByron = Person.create({ children: [] });
+
+ lordByron.get('minChildAge'); // Infinity
+ lordByron.get('children').pushObject({
+ name: 'Augusta Ada Byron', age: 7
+ });
+ lordByron.get('minChildAge'); // 7
+ lordByron.get('children').pushObjects([{
+ name: 'Allegra Byron',
+ age: 5
+ }, {
+ name: 'Elizabeth Medora Leigh',
+ age: 8
+ }]);
+ lordByron.get('minChildAge'); // 5
+ ```
+
+ If the types of the arguments are not numbers,
+ they will be converted to numbers and the type
+ of the return value will always be `Number`.
+ For example, the min of a list of Date objects will be
+ the lowest timestamp as a `Number`.
+ This behavior is consistent with `Math.min`.
+
+ @method min
+ @for @ember/object/computed
+ @static
+ @param {String} dependentKey
+ @return {ComputedProperty} computes the smallest value in the dependentKey's array
+ @public
+ */
+ function min(dependentKey) {
+ return reduceMacro(dependentKey, function (min, item) {
+ return Math.min(min, item);
+ }, Infinity, 'min');
+ }
+
+ /**
+ Returns an array mapped via the callback
+
+ The callback method you provide should have the following signature.
+ `item` is the current item in the iteration.
+ `index` is the integer index of the current item in the iteration.
+
+ ```javascript
+ function(item, index);
+ ```
+
+ Example
+
+ ```javascript
+ import { map } from '@ember/object/computed';
+ import EmberObject from '@ember/object';
+
+ let Hamster = EmberObject.extend({
+ excitingChores: map('chores', function(chore, index) {
+ return chore.toUpperCase() + '!';
+ })
+ });
+
+ let hamster = Hamster.create({
+ chores: ['clean', 'write more unit tests']
+ });
+
+ hamster.get('excitingChores'); // ['CLEAN!', 'WRITE MORE UNIT TESTS!']
+ ```
+
+ @method map
+ @for @ember/object/computed
+ @static
+ @param {String} dependentKey
+ @param {Function} callback
+ @return {ComputedProperty} an array mapped via the callback
+ @public
+ */
+ function map(dependentKey, callback) {
+ return arrayMacro(dependentKey, function (value) {
+ return value.map(callback, this);
+ });
+ }
+
+ /**
+ Returns an array mapped to the specified key.
+
+ ```javascript
+ import { mapBy } from '@ember/object/computed';
+ import EmberObject from '@ember/object';
+
+ let Person = EmberObject.extend({
+ childAges: mapBy('children', 'age')
+ });
+
+ let lordByron = Person.create({ children: [] });
+
+ lordByron.get('childAges'); // []
+ lordByron.get('children').pushObject({ name: 'Augusta Ada Byron', age: 7 });
+ lordByron.get('childAges'); // [7]
+ lordByron.get('children').pushObjects([{
+ name: 'Allegra Byron',
+ age: 5
+ }, {
+ name: 'Elizabeth Medora Leigh',
+ age: 8
+ }]);
+ lordByron.get('childAges'); // [7, 5, 8]
+ ```
+
+ @method mapBy
+ @for @ember/object/computed
+ @static
+ @param {String} dependentKey
+ @param {String} propertyKey
+ @return {ComputedProperty} an array mapped to the specified key
+ @public
+ */
+ function mapBy(dependentKey, propertyKey) {
+ (true && !(typeof propertyKey === 'string') && (0, _emberDebug.assert)('\`computed.mapBy\` expects a property string for its second argument, ' + 'perhaps you meant to use "map"', typeof propertyKey === 'string'));
+ (true && !(!/[\[\]\{\}]/g.test(dependentKey)) && (0, _emberDebug.assert)('Dependent key passed to `computed.mapBy` shouldn\'t contain brace expanding pattern.', !/[\[\]\{\}]/g.test(dependentKey)));
+
+
+ return map(dependentKey + '.@each.' + propertyKey, function (item) {
+ return (0, _emberMetal.get)(item, propertyKey);
+ });
+ }
+
+ /**
+ Filters the array by the callback.
+
+ The callback method you provide should have the following signature.
+ `item` is the current item in the iteration.
+ `index` is the integer index of the current item in the iteration.
+ `array` is the dependant array itself.
+
+ ```javascript
+ function(item, index, array);
+ ```
+
+ ```javascript
+ import { filter } from '@ember/object/computed';
+ import EmberObject from '@ember/object';
+
+ let Hamster = EmberObject.extend({
+ remainingChores: filter('chores', function(chore, index, array) {
+ return !chore.done;
+ })
+ });
+
+ let hamster = Hamster.create({
+ chores: [
+ { name: 'cook', done: true },
+ { name: 'clean', done: true },
+ { name: 'write more unit tests', done: false }
+ ]
+ });
+
+ hamster.get('remainingChores'); // [{name: 'write more unit tests', done: false}]
+ ```
+
+ You can also use `@each.property` in your dependent key, the callback will still use the underlying array:
+
+ ```javascript
+ import { A } from '@ember/array';
+ import { filter } from '@ember/object/computed';
+ import EmberObject from '@ember/object';
+
+ let Hamster = EmberObject.extend({
+ remainingChores: filter('chores.@each.done', function(chore, index, array) {
+ return !chore.get('done');
+ })
+ });
+
+ let hamster = Hamster.create({
+ chores: A([
+ EmberObject.create({ name: 'cook', done: true }),
+ EmberObject.create({ name: 'clean', done: true }),
+ EmberObject.create({ name: 'write more unit tests', done: false })
+ ])
+ });
+ hamster.get('remainingChores'); // [{name: 'write more unit tests', done: false}]
+ hamster.get('chores').objectAt(2).set('done', true);
+ hamster.get('remainingChores'); // []
+ ```
+
+
+ @method filter
+ @for @ember/object/computed
+ @static
+ @param {String} dependentKey
+ @param {Function} callback
+ @return {ComputedProperty} the filtered array
+ @public
+ */
+ function filter(dependentKey, callback) {
+ return arrayMacro(dependentKey, function (value) {
+ return value.filter(callback, this);
+ });
+ }
+
+ /**
+ Filters the array by the property and value
+
+ ```javascript
+ import { filterBy } from '@ember/object/computed';
+ import EmberObject from '@ember/object';
+
+ let Hamster = EmberObject.extend({
+ remainingChores: filterBy('chores', 'done', false)
+ });
+
+ let hamster = Hamster.create({
+ chores: [
+ { name: 'cook', done: true },
+ { name: 'clean', done: true },
+ { name: 'write more unit tests', done: false }
+ ]
+ });
+
+ hamster.get('remainingChores'); // [{ name: 'write more unit tests', done: false }]
+ ```
+
+ @method filterBy
+ @for @ember/object/computed
+ @static
+ @param {String} dependentKey
+ @param {String} propertyKey
+ @param {*} value
+ @return {ComputedProperty} the filtered array
+ @public
+ */
+ function filterBy(dependentKey, propertyKey, value) {
+ (true && !(!/[\[\]\{\}]/g.test(dependentKey)) && (0, _emberDebug.assert)('Dependent key passed to `computed.filterBy` shouldn\'t contain brace expanding pattern.', !/[\[\]\{\}]/g.test(dependentKey)));
+
+
+ var callback = void 0;
+ if (arguments.length === 2) {
+ callback = function (item) {
+ return (0, _emberMetal.get)(item, propertyKey);
+ };
+ } else {
+ callback = function (item) {
+ return (0, _emberMetal.get)(item, propertyKey) === value;
+ };
+ }
+
+ return filter(dependentKey + '.@each.' + propertyKey, callback);
+ }
+
+ /**
+ A computed property which returns a new array with all the unique
+ elements from one or more dependent arrays.
+
+ Example
+
+ ```javascript
+ import { uniq } from '@ember/object/computed';
+ import EmberObject from '@ember/object';
+
+ let Hamster = EmberObject.extend({
+ uniqueFruits: uniq('fruits')
+ });
+
+ let hamster = Hamster.create({
+ fruits: [
+ 'banana',
+ 'grape',
+ 'kale',
+ 'banana'
+ ]
+ });
+
+ hamster.get('uniqueFruits'); // ['banana', 'grape', 'kale']
+ ```
+
+ @method uniq
+ @for @ember/object/computed
+ @static
+ @param {String} propertyKey*
+ @return {ComputedProperty} computes a new array with all the
+ unique elements from the dependent array
+ @public
+ */
+ function uniq() {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ return multiArrayMacro(args, function (dependentKeys) {
+ var _this = this;
+
+ var uniq = (0, _native_array.A)();
+ var seen = new Set();
+
+ dependentKeys.forEach(function (dependentKey) {
+ var value = (0, _emberMetal.get)(_this, dependentKey);
+ if ((0, _utils.isArray)(value)) {
+ value.forEach(function (item) {
+ if (!seen.has(item)) {
+ seen.add(item);
+ uniq.push(item);
+ }
+ });
+ }
+ });
+
+ return uniq;
+ }, 'uniq');
+ }
+
+ /**
+ A computed property which returns a new array with all the unique
+ elements from an array, with uniqueness determined by specific key.
+
+ Example
+
+ ```javascript
+ import { uniqBy } from '@ember/object/computed';
+ import EmberObject from '@ember/object';
+
+ let Hamster = EmberObject.extend({
+ uniqueFruits: uniqBy('fruits', 'id')
+ });
+ let hamster = Hamster.create({
+ fruits: [
+ { id: 1, 'banana' },
+ { id: 2, 'grape' },
+ { id: 3, 'peach' },
+ { id: 1, 'banana' }
+ ]
+ });
+ hamster.get('uniqueFruits'); // [ { id: 1, 'banana' }, { id: 2, 'grape' }, { id: 3, 'peach' }]
+ ```
+
+ @method uniqBy
+ @for @ember/object/computed
+ @static
+ @param {String} dependentKey
+ @param {String} propertyKey
+ @return {ComputedProperty} computes a new array with all the
+ unique elements from the dependent array
+ @public
+ */
+ function uniqBy(dependentKey, propertyKey) {
+ (true && !(!/[\[\]\{\}]/g.test(dependentKey)) && (0, _emberDebug.assert)('Dependent key passed to `computed.uniqBy` shouldn\'t contain brace expanding pattern.', !/[\[\]\{\}]/g.test(dependentKey)));
+
+
+ var cp = new _emberMetal.ComputedProperty(function () {
+ var uniq = (0, _native_array.A)();
+ var list = (0, _emberMetal.get)(this, dependentKey);
+ if ((0, _utils.isArray)(list)) {
+ var seen = new Set();
+ list.forEach(function (item) {
+ var val = (0, _emberMetal.get)(item, propertyKey);
+ if (!seen.has(val)) {
+ seen.add(val);
+ uniq.push(item);
+ }
+ });
+ }
+ return uniq;
+ }, { dependentKeys: [dependentKey + '.[]'], readOnly: true });
+
+ return cp;
+ }
+
+ /**
+ A computed property which returns a new array with all the unique
+ elements from one or more dependent arrays.
+
+ Example
+
+ ```javascript
+ import { union } from '@ember/object/computed';
+ import EmberObject from '@ember/object';
+
+ let Hamster = EmberObject.extend({
+ uniqueFruits: union('fruits', 'vegetables')
+ });
+
+ let hamster = Hamster.create({
+ fruits: [
+ 'banana',
+ 'grape',
+ 'kale',
+ 'banana',
+ 'tomato'
+ ],
+ vegetables: [
+ 'tomato',
+ 'carrot',
+ 'lettuce'
+ ]
+ });
+
+ hamster.get('uniqueFruits'); // ['banana', 'grape', 'kale', 'tomato', 'carrot', 'lettuce']
+ ```
+
+ @method union
+ @for @ember/object/computed
+ @static
+ @param {String} propertyKey*
+ @return {ComputedProperty} computes a new array with all the
+ unique elements from the dependent array
+ @public
+ */
+ var union = exports.union = uniq;
+
+ /**
+ A computed property which returns a new array with all the elements
+ two or more dependent arrays have in common.
+
+ Example
+
+ ```javascript
+ import { intersect } from '@ember/object/computed';
+ import EmberObject from '@ember/object';
+
+ let obj = EmberObject.extend({
+ friendsInCommon: intersect('adaFriends', 'charlesFriends')
+ }).create({
+ adaFriends: ['Charles Babbage', 'John Hobhouse', 'William King', 'Mary Somerville'],
+ charlesFriends: ['William King', 'Mary Somerville', 'Ada Lovelace', 'George Peacock']
+ });
+
+ obj.get('friendsInCommon'); // ['William King', 'Mary Somerville']
+ ```
+
+ @method intersect
+ @for @ember/object/computed
+ @static
+ @param {String} propertyKey*
+ @return {ComputedProperty} computes a new array with all the
+ duplicated elements from the dependent arrays
+ @public
+ */
+ function intersect() {
+ for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+ args[_key2] = arguments[_key2];
+ }
+
+ return multiArrayMacro(args, function (dependentKeys) {
+ var _this2 = this;
+
+ var arrays = dependentKeys.map(function (dependentKey) {
+ var array = (0, _emberMetal.get)(_this2, dependentKey);
+ return (0, _utils.isArray)(array) ? array : [];
+ });
+
+ var results = arrays.pop().filter(function (candidate) {
+ for (var i = 0; i < arrays.length; i++) {
+ var found = false;
+ var array = arrays[i];
+ for (var j = 0; j < array.length; j++) {
+ if (array[j] === candidate) {
+ found = true;
+ break;
+ }
+ }
+
+ if (found === false) {
+ return false;
+ }
+ }
+
+ return true;
+ }, 'intersect');
+
+ return (0, _native_array.A)(results);
+ });
+ }
+
+ /**
+ A computed property which returns a new array with all the
+ properties from the first dependent array that are not in the second
+ dependent array.
+
+ Example
+
+ ```javascript
+ import { setDiff } from '@ember/object/computed';
+ import EmberObject from '@ember/object';
+
+ let Hamster = EmberObject.extend({
+ likes: ['banana', 'grape', 'kale'],
+ wants: setDiff('likes', 'fruits')
+ });
+
+ let hamster = Hamster.create({
+ fruits: [
+ 'grape',
+ 'kale',
+ ]
+ });
+
+ hamster.get('wants'); // ['banana']
+ ```
+
+ @method setDiff
+ @for @ember/object/computed
+ @static
+ @param {String} setAProperty
+ @param {String} setBProperty
+ @return {ComputedProperty} computes a new array with all the
+ items from the first dependent array that are not in the second
+ dependent array
+ @public
+ */
+ function setDiff(setAProperty, setBProperty) {
+ (true && !(arguments.length === 2) && (0, _emberDebug.assert)('\`computed.setDiff\` requires exactly two dependent arrays.', arguments.length === 2));
+ (true && !(!/[\[\]\{\}]/g.test(setAProperty) && !/[\[\]\{\}]/g.test(setBProperty)) && (0, _emberDebug.assert)('Dependent keys passed to `computed.setDiff` shouldn\'t contain brace expanding pattern.', !/[\[\]\{\}]/g.test(setAProperty) && !/[\[\]\{\}]/g.test(setBProperty)));
+
+
+ var cp = new _emberMetal.ComputedProperty(function () {
+ var setA = this.get(setAProperty);
+ var setB = this.get(setBProperty);
+
+ if (!(0, _utils.isArray)(setA)) {
+ return (0, _native_array.A)();
+ }
+ if (!(0, _utils.isArray)(setB)) {
+ return (0, _native_array.A)(setA);
+ }
+
+ return setA.filter(function (x) {
+ return setB.indexOf(x) === -1;
+ });
+ }, {
+ dependentKeys: [setAProperty + '.[]', setBProperty + '.[]'],
+ readOnly: true
+ });
+
+ return cp;
+ }
+
+ /**
+ A computed property that returns the array of values
+ for the provided dependent properties.
+
+ Example
+
+ ```javascript
+ import { collect } from '@ember/object/computed';
+ import EmberObject from '@ember/object';
+
+ let Hamster = EmberObject.extend({
+ clothes: collect('hat', 'shirt')
+ });
+
+ let hamster = Hamster.create();
+
+ hamster.get('clothes'); // [null, null]
+ hamster.set('hat', 'Camp Hat');
+ hamster.set('shirt', 'Camp Shirt');
+ hamster.get('clothes'); // ['Camp Hat', 'Camp Shirt']
+ ```
+
+ @method collect
+ @for @ember/object/computed
+ @static
+ @param {String} dependentKey*
+ @return {ComputedProperty} computed property which maps
+ values of all passed in properties to an array.
+ @public
+ */
+ function collect() {
+ for (var _len3 = arguments.length, dependentKeys = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
+ dependentKeys[_key3] = arguments[_key3];
+ }
+
+ return multiArrayMacro(dependentKeys, function () {
+ var properties = (0, _emberMetal.getProperties)(this, dependentKeys);
+ var res = (0, _native_array.A)();
+ for (var key in properties) {
+ if (properties.hasOwnProperty(key)) {
+ if (properties[key] === undefined) {
+ res.push(null);
+ } else {
+ res.push(properties[key]);
+ }
+ }
+ }
+ return res;
+ }, 'collect');
+ }
+
+ /**
+ A computed property which returns a new array with all the
+ properties from the first dependent array sorted based on a property
+ or sort function.
+
+ The callback method you provide should have the following signature:
+
+ ```javascript
+ function(itemA, itemB);
+ ```
+
+ - `itemA` the first item to compare.
+ - `itemB` the second item to compare.
+
+ This function should return negative number (e.g. `-1`) when `itemA` should come before
+ `itemB`. It should return positive number (e.g. `1`) when `itemA` should come after
+ `itemB`. If the `itemA` and `itemB` are equal this function should return `0`.
+
+ Therefore, if this function is comparing some numeric values, simple `itemA - itemB` or
+ `itemA.get( 'foo' ) - itemB.get( 'foo' )` can be used instead of series of `if`.
+
+ Example
+
+ ```javascript
+ import { sort } from '@ember/object/computed';
+ import EmberObject from '@ember/object';
+
+ let ToDoList = EmberObject.extend({
+ // using standard ascending sort
+ todosSorting: Object.freeze(['name']),
+ sortedTodos: sort('todos', 'todosSorting'),
+
+ // using descending sort
+ todosSortingDesc: Object.freeze(['name:desc']),
+ sortedTodosDesc: sort('todos', 'todosSortingDesc'),
+
+ // using a custom sort function
+ priorityTodos: sort('todos', function(a, b){
+ if (a.priority > b.priority) {
+ return 1;
+ } else if (a.priority < b.priority) {
+ return -1;
+ }
+
+ return 0;
+ })
+ });
+
+ let todoList = ToDoList.create({todos: [
+ { name: 'Unit Test', priority: 2 },
+ { name: 'Documentation', priority: 3 },
+ { name: 'Release', priority: 1 }
+ ]});
+
+ todoList.get('sortedTodos'); // [{ name:'Documentation', priority:3 }, { name:'Release', priority:1 }, { name:'Unit Test', priority:2 }]
+ todoList.get('sortedTodosDesc'); // [{ name:'Unit Test', priority:2 }, { name:'Release', priority:1 }, { name:'Documentation', priority:3 }]
+ todoList.get('priorityTodos'); // [{ name:'Release', priority:1 }, { name:'Unit Test', priority:2 }, { name:'Documentation', priority:3 }]
+ ```
+
+ @method sort
+ @for @ember/object/computed
+ @static
+ @param {String} itemsKey
+ @param {String or Function} sortDefinition a dependent key to an
+ array of sort properties (add `:desc` to the arrays sort properties to sort descending) or a function to use when sorting
+ @return {ComputedProperty} computes a new sorted array based
+ on the sort property array or callback function
+ @public
+ */
+ function sort(itemsKey, sortDefinition) {
+ (true && !(arguments.length === 2) && (0, _emberDebug.assert)('\`computed.sort\` requires two arguments: an array key to sort and ' + 'either a sort properties key or sort function', arguments.length === 2));
+
+
+ if (typeof sortDefinition === 'function') {
+ return customSort(itemsKey, sortDefinition);
+ } else {
+ return propertySort(itemsKey, sortDefinition);
+ }
+ }
+
+ function customSort(itemsKey, comparator) {
+ return arrayMacro(itemsKey, function (value) {
+ var _this3 = this;
+
+ return value.slice().sort(function (x, y) {
+ return comparator.call(_this3, x, y);
+ });
+ });
+ }
+
+ // This one needs to dynamically set up and tear down observers on the itemsKey
+ // depending on the sortProperties
+ function propertySort(itemsKey, sortPropertiesKey) {
+ var cp = new _emberMetal.ComputedProperty(function (key) {
+ var _this4 = this;
+
+ var sortProperties = (0, _emberMetal.get)(this, sortPropertiesKey);
+
+ (true && !((0, _utils.isArray)(sortProperties) && sortProperties.every(function (s) {
+ return typeof s === 'string';
+ })) && (0, _emberDebug.assert)('The sort definition for \'' + key + '\' on ' + this + ' must be a function or an array of strings', (0, _utils.isArray)(sortProperties) && sortProperties.every(function (s) {
+ return typeof s === 'string';
+ })));
+
+
+ // Add/remove property observers as required.
+ var activeObserversMap = cp._activeObserverMap || (cp._activeObserverMap = new WeakMap());
+ var activeObservers = activeObserversMap.get(this);
+
+ if (activeObservers !== undefined) {
+ activeObservers.forEach(function (args) {
+ return _emberMetal.removeObserver.apply(undefined, args);
+ });
+ }
+
+ function sortPropertyDidChange() {
+ this.notifyPropertyChange(key);
+ }
+
+ var itemsKeyIsAtThis = itemsKey === '@this';
+ var normalizedSortProperties = normalizeSortProperties(sortProperties);
+ activeObservers = normalizedSortProperties.map(function (_ref) {
+ var prop = _ref[0];
+
+ var path = itemsKeyIsAtThis ? '@each.' + prop : itemsKey + '.@each.' + prop;
+ (0, _emberMetal.addObserver)(_this4, path, sortPropertyDidChange);
+ return [_this4, path, sortPropertyDidChange];
+ });
+
+ activeObserversMap.set(this, activeObservers);
+
+ var items = itemsKeyIsAtThis ? this : (0, _emberMetal.get)(this, itemsKey);
+ if (!(0, _utils.isArray)(items)) {
+ return (0, _native_array.A)();
+ }
+
+ return sortByNormalizedSortProperties(items, normalizedSortProperties);
+ }, { dependentKeys: [sortPropertiesKey + '.[]'], readOnly: true });
+
+ cp._activeObserverMap = undefined;
+
+ return cp;
+ }
+
+ function normalizeSortProperties(sortProperties) {
+ return sortProperties.map(function (p) {
+ var _p$split = p.split(':'),
+ prop = _p$split[0],
+ direction = _p$split[1];
+
+ direction = direction || 'asc';
+
+ return [prop, direction];
+ });
+ }
+
+ function sortByNormalizedSortProperties(items, normalizedSortProperties) {
+ return (0, _native_array.A)(items.slice().sort(function (itemA, itemB) {
+ for (var i = 0; i < normalizedSortProperties.length; i++) {
+ var _normalizedSortProper = normalizedSortProperties[i],
+ prop = _normalizedSortProper[0],
+ direction = _normalizedSortProper[1];
+
+ var result = (0, _compare.default)((0, _emberMetal.get)(itemA, prop), (0, _emberMetal.get)(itemB, prop));
+ if (result !== 0) {
+ return direction === 'desc' ? -1 * result : result;
+ }
+ }
+ return 0;
+ }));
+ }
+});
+enifed('ember-runtime/controllers/controller', ['exports', 'ember-debug', 'ember-runtime/system/object', 'ember-runtime/mixins/controller', 'ember-runtime/inject'], function (exports, _emberDebug, _object, _controller, _inject) {
+ 'use strict';
+
+ /**
+ @module @ember/controller
+ */
+
+ /**
+ @class Controller
+ @extends EmberObject
+ @uses Ember.ControllerMixin
+ @public
+ */
+ var Controller = _object.default.extend(_controller.default);
+
+ function controllerInjectionHelper(factory) {
+ (true && !(_controller.default.detect(factory.PrototypeMixin)) && (0, _emberDebug.assert)('Defining an injected controller property on a ' + 'non-controller is not allowed.', _controller.default.detect(factory.PrototypeMixin)));
+ }
+
+ /**
+ Creates a property that lazily looks up another controller in the container.
+ Can only be used when defining another controller.
+
+ Example:
+
+ ```app/controllers/post.js
+ import Controller, {
+ inject as controller
+ } from '@ember/controller';
+
+ export default Controller.extend({
+ posts: controller()
+ });
+ ```
+
+ This example will create a `posts` property on the `post` controller that
+ looks up the `posts` controller in the container, making it easy to
+ reference other controllers.
+
+ @method inject
+ @static
+ @for @ember/controller
+ @since 1.10.0
+ @param {String} name (optional) name of the controller to inject, defaults
+ to the property's name
+ @return {Ember.InjectedProperty} injection descriptor instance
+ @public
+ */
+ (0, _inject.createInjectionHelper)('controller', controllerInjectionHelper);
+
+ exports.default = Controller;
+});
+enifed('ember-runtime/copy', ['exports', 'ember-debug', 'ember-runtime/system/object', 'ember-runtime/mixins/copyable'], function (exports, _emberDebug, _object, _copyable) {
+ 'use strict';
+
+ exports.default = copy;
+
+ /**
+ @module @ember/object
+ */
+ function _copy(obj, deep, seen, copies) {
+ var ret = void 0,
+ loc = void 0,
+ key = void 0;
+
+ // primitive data types are immutable, just return them.
+ if (typeof obj !== 'object' || obj === null) {
+ return obj;
+ }
+
+ // avoid cyclical loops
+ if (deep && (loc = seen.indexOf(obj)) >= 0) {
+ return copies[loc];
+ }
+
+ (true && !(!(obj instanceof _object.default) || _copyable.default && _copyable.default.detect(obj)) && (0, _emberDebug.assert)('Cannot clone an EmberObject that does not implement Copyable', !(obj instanceof _object.default) || _copyable.default && _copyable.default.detect(obj)));
+
+
+ // IMPORTANT: this specific test will detect a native array only. Any other
+ // object will need to implement Copyable.
+ if (Array.isArray(obj)) {
+ ret = obj.slice();
+
+ if (deep) {
+ loc = ret.length;
+
+ while (--loc >= 0) {
+ ret[loc] = _copy(ret[loc], deep, seen, copies);
+ }
+ }
+ } else if (_copyable.default && _copyable.default.detect(obj)) {
+ ret = obj.copy(deep, seen, copies);
+ } else if (obj instanceof Date) {
+ ret = new Date(obj.getTime());
+ } else {
+ ret = {};
+
+ for (key in obj) {
+ // support Null prototype
+ if (!Object.prototype.hasOwnProperty.call(obj, key)) {
+ continue;
+ }
+
+ // Prevents browsers that don't respect non-enumerability from
+ // copying internal Ember properties
+ if (key.substring(0, 2) === '__') {
+ continue;
+ }
+
+ ret[key] = deep ? _copy(obj[key], deep, seen, copies) : obj[key];
+ }
+ }
+
+ if (deep) {
+ seen.push(obj);
+ copies.push(ret);
+ }
+
+ return ret;
+ }
+
+ /**
+ Creates a shallow copy of the passed object. A deep copy of the object is
+ returned if the optional `deep` argument is `true`.
+
+ If the passed object implements the `Copyable` interface, then this
+ function will delegate to the object's `copy()` method and return the
+ result. See `Copyable` for further details.
+
+ For primitive values (which are immutable in JavaScript), the passed object
+ is simply returned.
+
+ @method copy
+ @static
+ @for @ember/object/internals
+ @param {Object} obj The object to clone
+ @param {Boolean} [deep=false] If true, a deep copy of the object is made.
+ @return {Object} The copied object
+ @public
+ */
+ function copy(obj, deep) {
+ // fast paths
+ if ('object' !== typeof obj || obj === null) {
+ return obj; // can't copy primitives
+ }
+
+ if (_copyable.default && _copyable.default.detect(obj)) {
+ return obj.copy(deep);
+ }
+
+ return _copy(obj, deep, deep ? [] : null, deep ? [] : null);
+ }
+});
+enifed('ember-runtime/ext/function', ['ember-environment', 'ember-metal', 'ember-debug'], function (_emberEnvironment, _emberMetal, _emberDebug) {
+ 'use strict';
+
+ var FunctionPrototype = Function.prototype; /**
+ @module ember
+ */
+
+ if (_emberEnvironment.ENV.EXTEND_PROTOTYPES.Function) {
+ /**
+ The `property` extension of Javascript's Function prototype is available
+ when `EmberENV.EXTEND_PROTOTYPES` or `EmberENV.EXTEND_PROTOTYPES.Function` is
+ `true`, which is the default.
+ Computed properties allow you to treat a function like a property:
+ ```app/utils/president.js
+ import EmberObject from '@ember/object';
+ export default EmberObject.extend({
+ firstName: '',
+ lastName: '',
+ fullName: function() {
+ return this.get('firstName') + ' ' + this.get('lastName');
+ }.property() // Call this flag to mark the function as a property
+ });
+ ```
+ ```javascript
+ let president = President.create({
+ firstName: 'Barack',
+ lastName: 'Obama'
+ });
+ president.get('fullName'); // 'Barack Obama'
+ ```
+ Treating a function like a property is useful because they can work with
+ bindings, just like any other property.
+ Many computed properties have dependencies on other properties. For
+ example, in the above example, the `fullName` property depends on
+ `firstName` and `lastName` to determine its value. You can tell Ember
+ about these dependencies like this:
+ ```app/utils/president.js
+ import EmberObject from '@ember/object';
+ export default EmberObject.extend({
+ firstName: '',
+ lastName: '',
+ fullName: function() {
+ return this.get('firstName') + ' ' + this.get('lastName');
+ // Tell Ember.js that this computed property depends on firstName
+ // and lastName
+ }.property('firstName', 'lastName')
+ });
+ ```
+ Make sure you list these dependencies so Ember knows when to update
+ bindings that connect to a computed property. Changing a dependency
+ will not immediately trigger an update of the computed property, but
+ will instead clear the cache so that it is updated when the next `get`
+ is called on the property.
+ See [ComputedProperty](/api/ember/release/classes/ComputedProperty), [@ember/object/computed](/api/ember/release/classes/@ember%2Fobject%2Fcomputed).
+ @method property
+ @for Function
+ @public
+ */
+ Object.defineProperty(FunctionPrototype, 'property', {
+ configurable: true,
+ enumerable: false,
+ writable: true,
+ value: function () {
+ return _emberMetal.computed.apply(undefined, Array.prototype.slice.call(arguments).concat([this]));
+ }
+ });
+
+ /**
+ The `observes` extension of Javascript's Function prototype is available
+ when `EmberENV.EXTEND_PROTOTYPES` or `EmberENV.EXTEND_PROTOTYPES.Function` is
+ true, which is the default.
+ You can observe property changes simply by adding the `observes`
+ call to the end of your method declarations in classes that you write.
+ For example:
+ ```javascript
+ import EmberObject from '@ember/object';
+ EmberObject.extend({
+ valueObserver: function() {
+ // Executes whenever the "value" property changes
+ }.observes('value')
+ });
+ ```
+ In the future this method may become asynchronous.
+ See `observer`.
+ @method observes
+ @for Function
+ @public
+ */
+ Object.defineProperty(FunctionPrototype, 'observes', {
+ configurable: true,
+ enumerable: false,
+ writable: true,
+ value: function () {
+ return _emberMetal.observer.apply(undefined, Array.prototype.slice.call(arguments).concat([this]));
+ }
+ });
+
+ Object.defineProperty(FunctionPrototype, '_observesImmediately', {
+ configurable: true,
+ enumerable: false,
+ writable: true,
+ value: function () {
+ (true && !(function checkIsInternalProperty() {
+ for (var i = 0; i < arguments.length; i++) {
+ if (arguments[i].indexOf('.') !== -1) {
+ return false;
+ }
+ }
+ return true;
+ }) && (0, _emberDebug.assert)('Immediate observers must observe internal properties only, ' + 'not properties on other objects.', function checkIsInternalProperty() {
+ for (var i = 0; i < arguments.length; i++) {
+ if (arguments[i].indexOf('.') !== -1) {
+ return false;
+ }
+ }return true;
+ }));
+
+
+ // observes handles property expansion
+ return this.observes.apply(this, arguments);
+ }
+ });
+
+ /**
+ The `on` extension of Javascript's Function prototype is available
+ when `EmberENV.EXTEND_PROTOTYPES` or `EmberENV.EXTEND_PROTOTYPES.Function` is
+ true, which is the default.
+ You can listen for events simply by adding the `on` call to the end of
+ your method declarations in classes or mixins that you write. For example:
+ ```javascript
+ import Mixin from '@ember/mixin';
+ Mixin.create({
+ doSomethingWithElement: function() {
+ // Executes whenever the "didInsertElement" event fires
+ }.on('didInsertElement')
+ });
+ ```
+ See `@ember/object/evented/on`.
+ @method on
+ @for Function
+ @public
+ */
+
+ Object.defineProperty(FunctionPrototype, 'on', {
+ configurable: true,
+ enumerable: false,
+ writable: true,
+ value: function () {
+ return _emberMetal.on.apply(undefined, Array.prototype.slice.call(arguments).concat([this]));
+ }
+ });
+ }
+});
+enifed('ember-runtime/ext/rsvp', ['exports', 'rsvp', 'ember-metal', 'ember-debug'], function (exports, _rsvp, _emberMetal, _emberDebug) {
+ 'use strict';
+
+ exports.onerrorDefault = onerrorDefault;
+
+
+ var backburner = _emberMetal.run.backburner;
+ _emberMetal.run._addQueue('rsvpAfter', 'destroy');
+
+ _rsvp.configure('async', function (callback, promise) {
+ backburner.schedule('actions', null, callback, promise);
+ });
+
+ _rsvp.configure('after', function (cb) {
+ backburner.schedule('rsvpAfter', null, cb);
+ });
+
+ _rsvp.on('error', onerrorDefault);
+
+ function onerrorDefault(reason) {
+ var error = errorFor(reason);
+ if (error) {
+ var overrideDispatch = (0, _emberMetal.getDispatchOverride)();
+ if (overrideDispatch) {
+ overrideDispatch(error);
+ } else {
+ throw error;
+ }
+ }
+ }
+
+ function errorFor(reason) {
+ if (!reason) return;
+
+ if (reason.errorThrown) {
+ return unwrapErrorThrown(reason);
+ }
+
+ if (reason.name === 'UnrecognizedURLError') {
+ (true && !(false) && (0, _emberDebug.assert)('The URL \'' + reason.message + '\' did not match any routes in your application', false));
+
+ return;
+ }
+
+ if (reason.name === 'TransitionAborted') {
+ return;
+ }
+
+ return reason;
+ }
+
+ function unwrapErrorThrown(reason) {
+ var error = reason.errorThrown;
+ if (typeof error === 'string') {
+ error = new Error(error);
+ }
+ Object.defineProperty(error, '__reason_with_error_thrown__', {
+ value: reason,
+ enumerable: false
+ });
+ return error;
+ }
+
+ exports.default = _rsvp;
+});
+enifed('ember-runtime/ext/string', ['ember-environment', 'ember-runtime/system/string'], function (_emberEnvironment, _string) {
+ 'use strict';
+
+ /**
+ @module @ember/string
+ */
+
+ var StringPrototype = String.prototype;
+
+ if (_emberEnvironment.ENV.EXTEND_PROTOTYPES.String) {
+ /**
+ See [String.w](/api/ember/release/classes/String/methods/w?anchor=w).
+ @method w
+ @for @ember/string
+ @static
+ @private
+ */
+ Object.defineProperty(StringPrototype, 'w', {
+ configurable: true,
+ enumerable: false,
+ writeable: true,
+ value: function () {
+ return (0, _string.w)(this);
+ }
+ });
+
+ /**
+ See [String.loc](/api/ember/release/classes/String/methods/loc?anchor=loc).
+ @method loc
+ @for @ember/string
+ @static
+ @private
+ */
+ Object.defineProperty(StringPrototype, 'loc', {
+ configurable: true,
+ enumerable: false,
+ writeable: true,
+ value: function () {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ return (0, _string.loc)(this, args);
+ }
+ });
+
+ /**
+ See [String.camelize](/api/ember/release/classes/String/methods/camelize?anchor=camelize).
+ @method camelize
+ @for @ember/string
+ @static
+ @private
+ */
+ Object.defineProperty(StringPrototype, 'camelize', {
+ configurable: true,
+ enumerable: false,
+ writeable: true,
+ value: function () {
+ return (0, _string.camelize)(this);
+ }
+ });
+
+ /**
+ See [String.decamelize](/api/ember/release/classes/String/methods/decamelize?anchor=decamelize).
+ @method decamelize
+ @for @ember/string
+ @static
+ @private
+ */
+ Object.defineProperty(StringPrototype, 'decamelize', {
+ configurable: true,
+ enumerable: false,
+ writeable: true,
+ value: function () {
+ return (0, _string.decamelize)(this);
+ }
+ });
+
+ /**
+ See [String.dasherize](/api/ember/release/classes/String/methods/dasherize?anchor=dasherize).
+ @method dasherize
+ @for @ember/string
+ @static
+ @private
+ */
+ Object.defineProperty(StringPrototype, 'dasherize', {
+ configurable: true,
+ enumerable: false,
+ writeable: true,
+ value: function () {
+ return (0, _string.dasherize)(this);
+ }
+ });
+
+ /**
+ See [String.underscore](/api/ember/release/classes/String/methods/underscore?anchor=underscore).
+ @method underscore
+ @for @ember/string
+ @static
+ @private
+ */
+ Object.defineProperty(StringPrototype, 'underscore', {
+ configurable: true,
+ enumerable: false,
+ writeable: true,
+ value: function () {
+ return (0, _string.underscore)(this);
+ }
+ });
+
+ /**
+ See [String.classify](/api/ember/release/classes/String/methods/classify?anchor=classify).
+ @method classify
+ @for @ember/string
+ @static
+ @private
+ */
+ Object.defineProperty(StringPrototype, 'classify', {
+ configurable: true,
+ enumerable: false,
+ writeable: true,
+ value: function () {
+ return (0, _string.classify)(this);
+ }
+ });
+
+ /**
+ See [String.capitalize](/api/ember/release/classes/String/methods/capitalize?anchor=capitalize).
+ @method capitalize
+ @for @ember/string
+ @static
+ @private
+ */
+ Object.defineProperty(StringPrototype, 'capitalize', {
+ configurable: true,
+ enumerable: false,
+ writeable: true,
+ value: function () {
+ return (0, _string.capitalize)(this);
+ }
+ });
+ }
+});
+enifed('ember-runtime/index', ['exports', 'ember-runtime/system/object', 'ember-runtime/system/string', 'ember-runtime/mixins/registry_proxy', 'ember-runtime/mixins/container_proxy', 'ember-runtime/copy', 'ember-runtime/inject', 'ember-runtime/compare', 'ember-runtime/is-equal', 'ember-runtime/mixins/array', 'ember-runtime/mixins/comparable', 'ember-runtime/system/namespace', 'ember-runtime/system/array_proxy', 'ember-runtime/system/object_proxy', 'ember-runtime/system/core_object', 'ember-runtime/system/native_array', 'ember-runtime/mixins/action_handler', 'ember-runtime/mixins/copyable', 'ember-runtime/mixins/enumerable', 'ember-runtime/mixins/-proxy', 'ember-runtime/system/lazy_load', 'ember-runtime/mixins/observable', 'ember-runtime/mixins/mutable_enumerable', 'ember-runtime/mixins/mutable_array', 'ember-runtime/mixins/target_action_support', 'ember-runtime/mixins/evented', 'ember-runtime/mixins/promise_proxy', 'ember-runtime/computed/computed_macros', 'ember-runtime/computed/reduce_computed_macros', 'ember-runtime/controllers/controller', 'ember-runtime/mixins/controller', 'ember-runtime/system/service', 'ember-runtime/ext/rsvp', 'ember-runtime/utils', 'ember-runtime/string_registry', 'ember-runtime/ext/string', 'ember-runtime/ext/function'], function (exports, _object, _string, _registry_proxy, _container_proxy, _copy, _inject, _compare, _isEqual, _array, _comparable, _namespace, _array_proxy, _object_proxy, _core_object, _native_array, _action_handler, _copyable, _enumerable, _proxy, _lazy_load, _observable, _mutable_enumerable, _mutable_array, _target_action_support, _evented, _promise_proxy, _computed_macros, _reduce_computed_macros, _controller, _controller2, _service, _rsvp, _utils, _string_registry) {
+ 'use strict';
+
+ exports.setStrings = exports.getStrings = exports.typeOf = exports.isArray = exports.onerrorDefault = exports.RSVP = exports.Service = exports.ControllerMixin = exports.Controller = exports.collect = exports.intersect = exports.union = exports.uniqBy = exports.uniq = exports.filterBy = exports.filter = exports.mapBy = exports.setDiff = exports.sort = exports.map = exports.max = exports.min = exports.sum = exports.or = exports.and = exports.deprecatingAlias = exports.readOnly = exports.oneWay = exports.lte = exports.lt = exports.gte = exports.gt = exports.equal = exports.match = exports.bool = exports.not = exports.none = exports.notEmpty = exports.empty = exports.PromiseProxyMixin = exports.Evented = exports.TargetActionSupport = exports.removeAt = exports.MutableArray = exports.MutableEnumerable = exports.Observable = exports._loaded = exports.runLoadHooks = exports.onLoad = exports._ProxyMixin = exports.Enumerable = exports.Copyable = exports.ActionHandler = exports.A = exports.NativeArray = exports.CoreObject = exports.ObjectProxy = exports.ArrayProxy = exports.setNamespaceSearchDisabled = exports.isNamespaceSearchDisabled = exports.Namespace = exports.Comparable = exports.removeArrayObserver = exports.addArrayObserver = exports.isEmberArray = exports.objectAt = exports.Array = exports.isEqual = exports.compare = exports.inject = exports.copy = exports.ContainerProxyMixin = exports.RegistryProxyMixin = exports.String = exports.FrameworkObject = exports.Object = undefined;
+ Object.defineProperty(exports, 'Object', {
+ enumerable: true,
+ get: function () {
+ return _object.default;
+ }
+ });
+ Object.defineProperty(exports, 'FrameworkObject', {
+ enumerable: true,
+ get: function () {
+ return _object.FrameworkObject;
+ }
+ });
+ Object.defineProperty(exports, 'String', {
+ enumerable: true,
+ get: function () {
+ return _string.default;
+ }
+ });
+ Object.defineProperty(exports, 'RegistryProxyMixin', {
+ enumerable: true,
+ get: function () {
+ return _registry_proxy.default;
+ }
+ });
+ Object.defineProperty(exports, 'ContainerProxyMixin', {
+ enumerable: true,
+ get: function () {
+ return _container_proxy.default;
+ }
+ });
+ Object.defineProperty(exports, 'copy', {
+ enumerable: true,
+ get: function () {
+ return _copy.default;
+ }
+ });
+ Object.defineProperty(exports, 'inject', {
+ enumerable: true,
+ get: function () {
+ return _inject.default;
+ }
+ });
+ Object.defineProperty(exports, 'compare', {
+ enumerable: true,
+ get: function () {
+ return _compare.default;
+ }
+ });
+ Object.defineProperty(exports, 'isEqual', {
+ enumerable: true,
+ get: function () {
+ return _isEqual.default;
+ }
+ });
+ Object.defineProperty(exports, 'Array', {
+ enumerable: true,
+ get: function () {
+ return _array.default;
+ }
+ });
+ Object.defineProperty(exports, 'objectAt', {
+ enumerable: true,
+ get: function () {
+ return _array.objectAt;
+ }
+ });
+ Object.defineProperty(exports, 'isEmberArray', {
+ enumerable: true,
+ get: function () {
+ return _array.isEmberArray;
+ }
+ });
+ Object.defineProperty(exports, 'addArrayObserver', {
+ enumerable: true,
+ get: function () {
+ return _array.addArrayObserver;
+ }
+ });
+ Object.defineProperty(exports, 'removeArrayObserver', {
+ enumerable: true,
+ get: function () {
+ return _array.removeArrayObserver;
+ }
+ });
+ Object.defineProperty(exports, 'Comparable', {
+ enumerable: true,
+ get: function () {
+ return _comparable.default;
+ }
+ });
+ Object.defineProperty(exports, 'Namespace', {
+ enumerable: true,
+ get: function () {
+ return _namespace.default;
+ }
+ });
+ Object.defineProperty(exports, 'isNamespaceSearchDisabled', {
+ enumerable: true,
+ get: function () {
+ return _namespace.isSearchDisabled;
+ }
+ });
+ Object.defineProperty(exports, 'setNamespaceSearchDisabled', {
+ enumerable: true,
+ get: function () {
+ return _namespace.setSearchDisabled;
+ }
+ });
+ Object.defineProperty(exports, 'ArrayProxy', {
+ enumerable: true,
+ get: function () {
+ return _array_proxy.default;
+ }
+ });
+ Object.defineProperty(exports, 'ObjectProxy', {
+ enumerable: true,
+ get: function () {
+ return _object_proxy.default;
+ }
+ });
+ Object.defineProperty(exports, 'CoreObject', {
+ enumerable: true,
+ get: function () {
+ return _core_object.default;
+ }
+ });
+ Object.defineProperty(exports, 'NativeArray', {
+ enumerable: true,
+ get: function () {
+ return _native_array.default;
+ }
+ });
+ Object.defineProperty(exports, 'A', {
+ enumerable: true,
+ get: function () {
+ return _native_array.A;
+ }
+ });
+ Object.defineProperty(exports, 'ActionHandler', {
+ enumerable: true,
+ get: function () {
+ return _action_handler.default;
+ }
+ });
+ Object.defineProperty(exports, 'Copyable', {
+ enumerable: true,
+ get: function () {
+ return _copyable.default;
+ }
+ });
+ Object.defineProperty(exports, 'Enumerable', {
+ enumerable: true,
+ get: function () {
+ return _enumerable.default;
+ }
+ });
+ Object.defineProperty(exports, '_ProxyMixin', {
+ enumerable: true,
+ get: function () {
+ return _proxy.default;
+ }
+ });
+ Object.defineProperty(exports, 'onLoad', {
+ enumerable: true,
+ get: function () {
+ return _lazy_load.onLoad;
+ }
+ });
+ Object.defineProperty(exports, 'runLoadHooks', {
+ enumerable: true,
+ get: function () {
+ return _lazy_load.runLoadHooks;
+ }
+ });
+ Object.defineProperty(exports, '_loaded', {
+ enumerable: true,
+ get: function () {
+ return _lazy_load._loaded;
+ }
+ });
+ Object.defineProperty(exports, 'Observable', {
+ enumerable: true,
+ get: function () {
+ return _observable.default;
+ }
+ });
+ Object.defineProperty(exports, 'MutableEnumerable', {
+ enumerable: true,
+ get: function () {
+ return _mutable_enumerable.default;
+ }
+ });
+ Object.defineProperty(exports, 'MutableArray', {
+ enumerable: true,
+ get: function () {
+ return _mutable_array.default;
+ }
+ });
+ Object.defineProperty(exports, 'removeAt', {
+ enumerable: true,
+ get: function () {
+ return _mutable_array.removeAt;
+ }
+ });
+ Object.defineProperty(exports, 'TargetActionSupport', {
+ enumerable: true,
+ get: function () {
+ return _target_action_support.default;
+ }
+ });
+ Object.defineProperty(exports, 'Evented', {
+ enumerable: true,
+ get: function () {
+ return _evented.default;
+ }
+ });
+ Object.defineProperty(exports, 'PromiseProxyMixin', {
+ enumerable: true,
+ get: function () {
+ return _promise_proxy.default;
+ }
+ });
+ Object.defineProperty(exports, 'empty', {
+ enumerable: true,
+ get: function () {
+ return _computed_macros.empty;
+ }
+ });
+ Object.defineProperty(exports, 'notEmpty', {
+ enumerable: true,
+ get: function () {
+ return _computed_macros.notEmpty;
+ }
+ });
+ Object.defineProperty(exports, 'none', {
+ enumerable: true,
+ get: function () {
+ return _computed_macros.none;
+ }
+ });
+ Object.defineProperty(exports, 'not', {
+ enumerable: true,
+ get: function () {
+ return _computed_macros.not;
+ }
+ });
+ Object.defineProperty(exports, 'bool', {
+ enumerable: true,
+ get: function () {
+ return _computed_macros.bool;
+ }
+ });
+ Object.defineProperty(exports, 'match', {
+ enumerable: true,
+ get: function () {
+ return _computed_macros.match;
+ }
+ });
+ Object.defineProperty(exports, 'equal', {
+ enumerable: true,
+ get: function () {
+ return _computed_macros.equal;
+ }
+ });
+ Object.defineProperty(exports, 'gt', {
+ enumerable: true,
+ get: function () {
+ return _computed_macros.gt;
+ }
+ });
+ Object.defineProperty(exports, 'gte', {
+ enumerable: true,
+ get: function () {
+ return _computed_macros.gte;
+ }
+ });
+ Object.defineProperty(exports, 'lt', {
+ enumerable: true,
+ get: function () {
+ return _computed_macros.lt;
+ }
+ });
+ Object.defineProperty(exports, 'lte', {
+ enumerable: true,
+ get: function () {
+ return _computed_macros.lte;
+ }
+ });
+ Object.defineProperty(exports, 'oneWay', {
+ enumerable: true,
+ get: function () {
+ return _computed_macros.oneWay;
+ }
+ });
+ Object.defineProperty(exports, 'readOnly', {
+ enumerable: true,
+ get: function () {
+ return _computed_macros.readOnly;
+ }
+ });
+ Object.defineProperty(exports, 'deprecatingAlias', {
+ enumerable: true,
+ get: function () {
+ return _computed_macros.deprecatingAlias;
+ }
+ });
+ Object.defineProperty(exports, 'and', {
+ enumerable: true,
+ get: function () {
+ return _computed_macros.and;
+ }
+ });
+ Object.defineProperty(exports, 'or', {
+ enumerable: true,
+ get: function () {
+ return _computed_macros.or;
+ }
+ });
+ Object.defineProperty(exports, 'sum', {
+ enumerable: true,
+ get: function () {
+ return _reduce_computed_macros.sum;
+ }
+ });
+ Object.defineProperty(exports, 'min', {
+ enumerable: true,
+ get: function () {
+ return _reduce_computed_macros.min;
+ }
+ });
+ Object.defineProperty(exports, 'max', {
+ enumerable: true,
+ get: function () {
+ return _reduce_computed_macros.max;
+ }
+ });
+ Object.defineProperty(exports, 'map', {
+ enumerable: true,
+ get: function () {
+ return _reduce_computed_macros.map;
+ }
+ });
+ Object.defineProperty(exports, 'sort', {
+ enumerable: true,
+ get: function () {
+ return _reduce_computed_macros.sort;
+ }
+ });
+ Object.defineProperty(exports, 'setDiff', {
+ enumerable: true,
+ get: function () {
+ return _reduce_computed_macros.setDiff;
+ }
+ });
+ Object.defineProperty(exports, 'mapBy', {
+ enumerable: true,
+ get: function () {
+ return _reduce_computed_macros.mapBy;
+ }
+ });
+ Object.defineProperty(exports, 'filter', {
+ enumerable: true,
+ get: function () {
+ return _reduce_computed_macros.filter;
+ }
+ });
+ Object.defineProperty(exports, 'filterBy', {
+ enumerable: true,
+ get: function () {
+ return _reduce_computed_macros.filterBy;
+ }
+ });
+ Object.defineProperty(exports, 'uniq', {
+ enumerable: true,
+ get: function () {
+ return _reduce_computed_macros.uniq;
+ }
+ });
+ Object.defineProperty(exports, 'uniqBy', {
+ enumerable: true,
+ get: function () {
+ return _reduce_computed_macros.uniqBy;
+ }
+ });
+ Object.defineProperty(exports, 'union', {
+ enumerable: true,
+ get: function () {
+ return _reduce_computed_macros.union;
+ }
+ });
+ Object.defineProperty(exports, 'intersect', {
+ enumerable: true,
+ get: function () {
+ return _reduce_computed_macros.intersect;
+ }
+ });
+ Object.defineProperty(exports, 'collect', {
+ enumerable: true,
+ get: function () {
+ return _reduce_computed_macros.collect;
+ }
+ });
+ Object.defineProperty(exports, 'Controller', {
+ enumerable: true,
+ get: function () {
+ return _controller.default;
+ }
+ });
+ Object.defineProperty(exports, 'ControllerMixin', {
+ enumerable: true,
+ get: function () {
+ return _controller2.default;
+ }
+ });
+ Object.defineProperty(exports, 'Service', {
+ enumerable: true,
+ get: function () {
+ return _service.default;
+ }
+ });
+ Object.defineProperty(exports, 'RSVP', {
+ enumerable: true,
+ get: function () {
+ return _rsvp.default;
+ }
+ });
+ Object.defineProperty(exports, 'onerrorDefault', {
+ enumerable: true,
+ get: function () {
+ return _rsvp.onerrorDefault;
+ }
+ });
+ Object.defineProperty(exports, 'isArray', {
+ enumerable: true,
+ get: function () {
+ return _utils.isArray;
+ }
+ });
+ Object.defineProperty(exports, 'typeOf', {
+ enumerable: true,
+ get: function () {
+ return _utils.typeOf;
+ }
+ });
+ Object.defineProperty(exports, 'getStrings', {
+ enumerable: true,
+ get: function () {
+ return _string_registry.getStrings;
+ }
+ });
+ Object.defineProperty(exports, 'setStrings', {
+ enumerable: true,
+ get: function () {
+ return _string_registry.setStrings;
+ }
+ });
+});
+enifed('ember-runtime/inject', ['exports', 'ember-metal', 'ember-debug'], function (exports, _emberMetal, _emberDebug) {
+ 'use strict';
+
+ exports.default = inject;
+ exports.createInjectionHelper = createInjectionHelper;
+ exports.validatePropertyInjections = validatePropertyInjections;
+
+
+ /**
+ Namespace for injection helper methods.
+
+ @class inject
+ @namespace Ember
+ @static
+ @public
+ */
+ function inject() {
+ (true && !(false) && (0, _emberDebug.assert)('Injected properties must be created through helpers, see \'' + Object.keys(inject).map(function (k) {
+ return '\'inject.' + k + '\'';
+ }).join(' or ') + '\''));
+ }
+
+ // Dictionary of injection validations by type, added to by `createInjectionHelper`
+ var typeValidators = {};
+
+ /**
+ This method allows other Ember modules to register injection helpers for a
+ given container type. Helpers are exported to the `inject` namespace as the
+ container type itself.
+
+ @private
+ @method createInjectionHelper
+ @since 1.10.0
+ @for Ember
+ @param {String} type The container type the helper will inject
+ @param {Function} validator A validation callback that is executed at mixin-time
+ */
+ function createInjectionHelper(type, validator) {
+ typeValidators[type] = validator;
+
+ inject[type] = function (name) {
+ return new _emberMetal.InjectedProperty(type, name);
+ };
+ }
+
+ /**
+ Validation function that runs per-type validation functions once for each
+ injected type encountered.
+
+ @private
+ @method validatePropertyInjections
+ @since 1.10.0
+ @for Ember
+ @param {Object} factory The factory object
+ */
+ function validatePropertyInjections(factory) {
+ var proto = factory.proto();
+ var types = [];
+
+ for (var key in proto) {
+ var desc = (0, _emberMetal.descriptorFor)(proto, key);
+ if (desc instanceof _emberMetal.InjectedProperty && types.indexOf(desc.type) === -1) {
+ types.push(desc.type);
+ }
+ }
+
+ if (types.length) {
+ for (var i = 0; i < types.length; i++) {
+ var validator = typeValidators[types[i]];
+
+ if (typeof validator === 'function') {
+ validator(factory);
+ }
+ }
+ }
+
+ return true;
+ }
+});
+enifed('ember-runtime/is-equal', ['exports'], function (exports) {
+ 'use strict';
+
+ exports.default = isEqual;
+ /**
+ @module @ember/utils
+ */
+ /**
+ Compares two objects, returning true if they are equal.
+
+ ```javascript
+ import { isEqual } from '@ember/utils';
+
+ isEqual('hello', 'hello'); // true
+ isEqual(1, 2); // false
+ ```
+
+ `isEqual` is a more specific comparison than a triple equal comparison.
+ It will call the `isEqual` instance method on the objects being
+ compared, allowing finer control over when objects should be considered
+ equal to each other.
+
+ ```javascript
+ import { isEqual } from '@ember/utils';
+ import EmberObject from '@ember/object';
+
+ let Person = EmberObject.extend({
+ isEqual(other) { return this.ssn == other.ssn; }
+ });
+
+ let personA = Person.create({name: 'Muhammad Ali', ssn: '123-45-6789'});
+ let personB = Person.create({name: 'Cassius Clay', ssn: '123-45-6789'});
+
+ isEqual(personA, personB); // true
+ ```
+
+ Due to the expense of array comparisons, collections will never be equal to
+ each other even if each of their items are equal to each other.
+
+ ```javascript
+ import { isEqual } from '@ember/utils';
+
+ isEqual([4, 2], [4, 2]); // false
+ ```
+
+ @method isEqual
+ @for @ember/utils
+ @static
+ @param {Object} a first object to compare
+ @param {Object} b second object to compare
+ @return {Boolean}
+ @public
+ */
+ function isEqual(a, b) {
+ if (a && typeof a.isEqual === 'function') {
+ return a.isEqual(b);
+ }
+
+ if (a instanceof Date && b instanceof Date) {
+ return a.getTime() === b.getTime();
+ }
+
+ return a === b;
+ }
+});
+enifed('ember-runtime/mixins/-proxy', ['exports', 'ember-babel', '@glimmer/reference', 'ember-metal', 'ember-debug', 'ember-runtime/computed/computed_macros'], function (exports, _emberBabel, _reference, _emberMetal, _emberDebug, _computed_macros) {
+ 'use strict';
+
+ /**
+ @module ember
+ */
+
+ function contentPropertyWillChange(content, contentKey) {
+ var key = contentKey.slice(8); // remove "content."
+ if (key in this) {
+ return;
+ } // if shadowed in proxy
+ (0, _emberMetal.propertyWillChange)(this, key);
+ }
+
+ function contentPropertyDidChange(content, contentKey) {
+ var key = contentKey.slice(8); // remove "content."
+ if (key in this) {
+ return;
+ } // if shadowed in proxy
+ (0, _emberMetal.propertyDidChange)(this, key);
+ }
+
+ var ProxyTag = function (_CachedTag) {
+ (0, _emberBabel.inherits)(ProxyTag, _CachedTag);
+
+ function ProxyTag(proxy) {
+ (0, _emberBabel.classCallCheck)(this, ProxyTag);
+
+ var _this = (0, _emberBabel.possibleConstructorReturn)(this, _CachedTag.call(this));
+
+ var content = (0, _emberMetal.get)(proxy, 'content');
+
+ _this.proxy = proxy;
+ _this.proxyWrapperTag = new _reference.DirtyableTag();
+ _this.proxyContentTag = new _reference.UpdatableTag((0, _emberMetal.tagFor)(content));
+ return _this;
+ }
+
+ ProxyTag.prototype.compute = function compute() {
+ return Math.max(this.proxyWrapperTag.value(), this.proxyContentTag.value());
+ };
+
+ ProxyTag.prototype.dirty = function dirty() {
+ this.proxyWrapperTag.dirty();
+ };
+
+ ProxyTag.prototype.contentDidChange = function contentDidChange() {
+ var content = (0, _emberMetal.get)(this.proxy, 'content');
+ this.proxyContentTag.update((0, _emberMetal.tagFor)(content));
+ };
+
+ return ProxyTag;
+ }(_reference.CachedTag);
+
+ exports.default = _emberMetal.Mixin.create({
+ /**
+ The object whose properties will be forwarded.
+ @property content
+ @type EmberObject
+ @default null
+ @private
+ */
+ content: null,
+
+ init: function () {
+ this._super.apply(this, arguments);
+ var m = (0, _emberMetal.meta)(this);
+ m.setProxy();
+ m.writableTag(function (source) {
+ return new ProxyTag(source);
+ });
+ },
+
+
+ isTruthy: (0, _computed_macros.bool)('content'),
+
+ willWatchProperty: function (key) {
+ var contentKey = 'content.' + key;
+ (0, _emberMetal._addBeforeObserver)(this, contentKey, null, contentPropertyWillChange);
+ (0, _emberMetal.addObserver)(this, contentKey, null, contentPropertyDidChange);
+ },
+ didUnwatchProperty: function (key) {
+ var contentKey = 'content.' + key;
+ (0, _emberMetal._removeBeforeObserver)(this, contentKey, null, contentPropertyWillChange);
+ (0, _emberMetal.removeObserver)(this, contentKey, null, contentPropertyDidChange);
+ },
+ unknownProperty: function (key) {
+ var content = (0, _emberMetal.get)(this, 'content');
+ if (content) {
+ return (0, _emberMetal.get)(content, key);
+ }
+ },
+ setUnknownProperty: function (key, value) {
+ var m = (0, _emberMetal.meta)(this);
+
+ if (m.proto === this) {
+ // if marked as prototype then just defineProperty
+ // rather than delegate
+ (0, _emberMetal.defineProperty)(this, key, null, value);
+ return value;
+ }
+
+ var content = (0, _emberMetal.get)(this, 'content');
+ (true && !(content) && (0, _emberDebug.assert)('Cannot delegate set(\'' + key + '\', ' + value + ') to the \'content\' property of object proxy ' + this + ': its \'content\' is undefined.', content));
+
+
+ return (0, _emberMetal.set)(content, key, value);
+ }
+ });
+});
+enifed('ember-runtime/mixins/action_handler', ['exports', 'ember-metal', 'ember-debug'], function (exports, _emberMetal, _emberDebug) {
+ 'use strict';
+
+ /**
+ `Ember.ActionHandler` is available on some familiar classes including
+ `Route`, `Component`, and `Controller`.
+ (Internally the mixin is used by `Ember.CoreView`, `Ember.ControllerMixin`,
+ and `Route` and available to the above classes through
+ inheritance.)
+
+ @class ActionHandler
+ @namespace Ember
+ @private
+ */
+ /**
+ @module ember
+ */
+
+ var ActionHandler = _emberMetal.Mixin.create({
+ mergedProperties: ['actions'],
+
+ send: function (actionName) {
+ for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ args[_key - 1] = arguments[_key];
+ }
+
+ if (this.actions && this.actions[actionName]) {
+ var shouldBubble = this.actions[actionName].apply(this, args) === true;
+ if (!shouldBubble) {
+ return;
+ }
+ }
+
+ var target = (0, _emberMetal.get)(this, 'target');
+ if (target) {
+ (true && !(typeof target.send === 'function') && (0, _emberDebug.assert)('The `target` for ' + this + ' (' + target + ') does not have a `send` method', typeof target.send === 'function'));
+
+ target.send.apply(target, arguments);
+ }
+ }
+ });
+
+ exports.default = ActionHandler;
+});
+enifed('ember-runtime/mixins/array', ['exports', 'ember-utils', 'ember-metal', 'ember-debug', 'ember-runtime/mixins/enumerable', 'ember-runtime/compare', 'require'], function (exports, _emberUtils, _emberMetal, _emberDebug, _enumerable, _compare, _require2) {
+ 'use strict';
+
+ exports.addArrayObserver = addArrayObserver;
+ exports.removeArrayObserver = removeArrayObserver;
+ exports.objectAt = objectAt;
+ exports.arrayContentWillChange = arrayContentWillChange;
+ exports.arrayContentDidChange = arrayContentDidChange;
+ exports.isEmberArray = isEmberArray;
+
+ var _Mixin$create;
+
+ // Required to break a module cycle
+ var _A = void 0;
+ function A() {
+ if (_A === undefined) {
+ _A = (0, _require2.default)('ember-runtime/system/native_array').A;
+ }
+ return _A();
+ }
+
+ function arrayObserversHelper(obj, target, opts, operation, notify) {
+ var willChange = opts && opts.willChange || 'arrayWillChange';
+ var didChange = opts && opts.didChange || 'arrayDidChange';
+ var hasObservers = (0, _emberMetal.get)(obj, 'hasArrayObservers');
+
+ if (hasObservers === notify) {
+ (0, _emberMetal.propertyWillChange)(obj, 'hasArrayObservers');
+ }
+
+ operation(obj, '@array:before', target, willChange);
+ operation(obj, '@array:change', target, didChange);
+
+ if (hasObservers === notify) {
+ (0, _emberMetal.propertyDidChange)(obj, 'hasArrayObservers');
+ }
+
+ return obj;
+ }
+
+ function addArrayObserver(array, target, opts) {
+ return arrayObserversHelper(array, target, opts, _emberMetal.addListener, false);
+ }
+
+ function removeArrayObserver(array, target, opts) {
+ return arrayObserversHelper(array, target, opts, _emberMetal.removeListener, true);
+ }
+
+ function objectAt(content, idx) {
+ return typeof content.objectAt === 'function' ? content.objectAt(idx) : content[idx];
+ }
+
+ function arrayContentWillChange(array, startIdx, removeAmt, addAmt) {
+ // if no args are passed assume everything changes
+ if (startIdx === undefined) {
+ startIdx = 0;
+ removeAmt = addAmt = -1;
+ } else {
+ if (removeAmt === undefined) {
+ removeAmt = -1;
+ }
+
+ if (addAmt === undefined) {
+ addAmt = -1;
+ }
+ }
+
+ if (array.__each) {
+ array.__each.arrayWillChange(array, startIdx, removeAmt, addAmt);
+ }
+
+ (0, _emberMetal.sendEvent)(array, '@array:before', [array, startIdx, removeAmt, addAmt]);
+
+ (0, _emberMetal.propertyWillChange)(array, '[]');
+
+ if (addAmt < 0 || removeAmt < 0 || addAmt - removeAmt !== 0) {
+ (0, _emberMetal.propertyWillChange)(array, 'length');
+ }
+
+ return array;
+ }
+
+ function arrayContentDidChange(array, startIdx, removeAmt, addAmt) {
+ // if no args are passed assume everything changes
+ if (startIdx === undefined) {
+ startIdx = 0;
+ removeAmt = addAmt = -1;
+ } else {
+ if (removeAmt === undefined) {
+ removeAmt = -1;
+ }
+
+ if (addAmt === undefined) {
+ addAmt = -1;
+ }
+ }
+
+ if (addAmt < 0 || removeAmt < 0 || addAmt - removeAmt !== 0) {
+ (0, _emberMetal.propertyDidChange)(array, 'length');
+ }
+
+ (0, _emberMetal.propertyDidChange)(array, '[]');
+
+ if (array.__each) {
+ array.__each.arrayDidChange(array, startIdx, removeAmt, addAmt);
+ }
+
+ (0, _emberMetal.sendEvent)(array, '@array:change', [array, startIdx, removeAmt, addAmt]);
+
+ var meta = (0, _emberMetal.peekMeta)(array);
+ var cache = meta !== undefined ? meta.readableCache() : undefined;
+ if (cache !== undefined) {
+ var length = (0, _emberMetal.get)(array, 'length');
+ var addedAmount = addAmt === -1 ? 0 : addAmt;
+ var removedAmount = removeAmt === -1 ? 0 : removeAmt;
+ var delta = addedAmount - removedAmount;
+ var previousLength = length - delta;
+
+ var normalStartIdx = startIdx < 0 ? previousLength + startIdx : startIdx;
+ if (cache.firstObject !== undefined && normalStartIdx === 0) {
+ (0, _emberMetal.propertyWillChange)(array, 'firstObject', meta);
+ (0, _emberMetal.propertyDidChange)(array, 'firstObject', meta);
+ }
+
+ if (cache.lastObject !== undefined) {
+ var previousLastIndex = previousLength - 1;
+ var lastAffectedIndex = normalStartIdx + removedAmount;
+ if (previousLastIndex < lastAffectedIndex) {
+ (0, _emberMetal.propertyWillChange)(array, 'lastObject', meta);
+ (0, _emberMetal.propertyDidChange)(array, 'lastObject', meta);
+ }
+ }
+ }
+
+ return array;
+ }
+
+ var EMBER_ARRAY = (0, _emberUtils.symbol)('EMBER_ARRAY');
+
+ function isEmberArray(obj) {
+ return obj && obj[EMBER_ARRAY];
+ }
+
+ function iter(key, value) {
+ var valueProvided = arguments.length === 2;
+
+ return valueProvided ? function (item) {
+ return value === (0, _emberMetal.get)(item, key);
+ } : function (item) {
+ return !!(0, _emberMetal.get)(item, key);
+ };
+ }
+
+ // ..........................................................
+ // ARRAY
+ //
+ /**
+ This mixin implements Observer-friendly Array-like behavior. It is not a
+ concrete implementation, but it can be used up by other classes that want
+ to appear like arrays.
+
+ For example, ArrayProxy is a concrete classes that can
+ be instantiated to implement array-like behavior. Both of these classes use
+ the Array Mixin by way of the MutableArray mixin, which allows observable
+ changes to be made to the underlying array.
+
+ This mixin defines methods specifically for collections that provide
+ index-ordered access to their contents. When you are designing code that
+ needs to accept any kind of Array-like object, you should use these methods
+ instead of Array primitives because these will properly notify observers of
+ changes to the array.
+
+ Although these methods are efficient, they do add a layer of indirection to
+ your application so it is a good idea to use them only when you need the
+ flexibility of using both true JavaScript arrays and "virtual" arrays such
+ as controllers and collections.
+
+ You can use the methods defined in this module to access and modify array
+ contents in a KVO-friendly way. You can also be notified whenever the
+ membership of an array changes by using `.observes('myArray.[]')`.
+
+ To support `EmberArray` in your own class, you must override two
+ primitives to use it: `length()` and `objectAt()`.
+
+ @class EmberArray
+ @uses Enumerable
+ @since Ember 0.9.0
+ @public
+ */
+ var ArrayMixin = _emberMetal.Mixin.create(_enumerable.default, (_Mixin$create = {}, _Mixin$create[EMBER_ARRAY] = true, _Mixin$create.length = null, _Mixin$create.objectAt = function (idx) {
+ if (idx < 0 || idx >= (0, _emberMetal.get)(this, 'length')) {
+ return undefined;
+ }
+
+ return (0, _emberMetal.get)(this, idx);
+ }, _Mixin$create.objectsAt = function (indexes) {
+ var _this = this;
+
+ return indexes.map(function (idx) {
+ return objectAt(_this, idx);
+ });
+ }, _Mixin$create['[]'] = (0, _emberMetal.computed)({
+ get: function (key) {
+ // eslint-disable-line no-unused-vars
+ return this;
+ },
+ set: function (key, value) {
+ this.replace(0, (0, _emberMetal.get)(this, 'length'), value);
+ return this;
+ }
+ }), _Mixin$create.firstObject = (0, _emberMetal.computed)(function () {
+ return objectAt(this, 0);
+ }).readOnly(), _Mixin$create.lastObject = (0, _emberMetal.computed)(function () {
+ return objectAt(this, (0, _emberMetal.get)(this, 'length') - 1);
+ }).readOnly(), _Mixin$create.slice = function (beginIndex, endIndex) {
+ var ret = A();
+ var length = (0, _emberMetal.get)(this, 'length');
+
+ if ((0, _emberMetal.isNone)(beginIndex)) {
+ beginIndex = 0;
+ } else if (beginIndex < 0) {
+ beginIndex = length + beginIndex;
+ }
+
+ if ((0, _emberMetal.isNone)(endIndex) || endIndex > length) {
+ endIndex = length;
+ } else if (endIndex < 0) {
+ endIndex = length + endIndex;
+ }
+
+ while (beginIndex < endIndex) {
+ ret[ret.length] = objectAt(this, beginIndex++);
+ }
+
+ return ret;
+ }, _Mixin$create.indexOf = function (object, startAt) {
+ var len = (0, _emberMetal.get)(this, 'length');
+
+ if (startAt === undefined) {
+ startAt = 0;
+ }
+
+ if (startAt < 0) {
+ startAt += len;
+ }
+
+ for (var idx = startAt; idx < len; idx++) {
+ if (objectAt(this, idx) === object) {
+ return idx;
+ }
+ }
+
+ return -1;
+ }, _Mixin$create.lastIndexOf = function (object, startAt) {
+ var len = (0, _emberMetal.get)(this, 'length');
+
+ if (startAt === undefined || startAt >= len) {
+ startAt = len - 1;
+ }
+
+ if (startAt < 0) {
+ startAt += len;
+ }
+
+ for (var idx = startAt; idx >= 0; idx--) {
+ if (objectAt(this, idx) === object) {
+ return idx;
+ }
+ }
+
+ return -1;
+ }, _Mixin$create.addArrayObserver = function (target, opts) {
+ return addArrayObserver(this, target, opts);
+ }, _Mixin$create.removeArrayObserver = function (target, opts) {
+ return removeArrayObserver(this, target, opts);
+ }, _Mixin$create.hasArrayObservers = (0, _emberMetal.computed)(function () {
+ return (0, _emberMetal.hasListeners)(this, '@array:change') || (0, _emberMetal.hasListeners)(this, '@array:before');
+ }), _Mixin$create.arrayContentWillChange = function (startIdx, removeAmt, addAmt) {
+ return arrayContentWillChange(this, startIdx, removeAmt, addAmt);
+ }, _Mixin$create.arrayContentDidChange = function (startIdx, removeAmt, addAmt) {
+ return arrayContentDidChange(this, startIdx, removeAmt, addAmt);
+ }, _Mixin$create.forEach = function (callback) {
+ var target = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
+ (true && !(typeof callback === 'function') && (0, _emberDebug.assert)('forEach expects a function as first argument.', typeof callback === 'function'));
+
+
+ var length = (0, _emberMetal.get)(this, 'length');
+
+ for (var index = 0; index < length; index++) {
+ var item = this.objectAt(index);
+ callback.call(target, item, index, this);
+ }
+
+ return this;
+ }, _Mixin$create.getEach = (0, _emberMetal.aliasMethod)('mapBy'), _Mixin$create.setEach = function (key, value) {
+ return this.forEach(function (item) {
+ return (0, _emberMetal.set)(item, key, value);
+ });
+ }, _Mixin$create.map = function (callback, target) {
+ (true && !(typeof callback === 'function') && (0, _emberDebug.assert)('map expects a function as first argument.', typeof callback === 'function'));
+
+
+ var ret = A();
+
+ this.forEach(function (x, idx, i) {
+ return ret[idx] = callback.call(target, x, idx, i);
+ });
+
+ return ret;
+ }, _Mixin$create.mapBy = function (key) {
+ return this.map(function (next) {
+ return (0, _emberMetal.get)(next, key);
+ });
+ }, _Mixin$create.filter = function (callback, target) {
+ (true && !(typeof callback === 'function') && (0, _emberDebug.assert)('filter expects a function as first argument.', typeof callback === 'function'));
+
+
+ var ret = A();
+
+ this.forEach(function (x, idx, i) {
+ if (callback.call(target, x, idx, i)) {
+ ret.push(x);
+ }
+ });
+
+ return ret;
+ }, _Mixin$create.reject = function (callback, target) {
+ (true && !(typeof callback === 'function') && (0, _emberDebug.assert)('reject expects a function as first argument.', typeof callback === 'function'));
+
+
+ return this.filter(function () {
+ return !callback.apply(target, arguments);
+ });
+ }, _Mixin$create.filterBy = function (key, value) {
+ // eslint-disable-line no-unused-vars
+ return this.filter(iter.apply(this, arguments));
+ }, _Mixin$create.rejectBy = function (key, value) {
+ var exactValue = function (item) {
+ return (0, _emberMetal.get)(item, key) === value;
+ };
+ var hasValue = function (item) {
+ return !!(0, _emberMetal.get)(item, key);
+ };
+ var use = arguments.length === 2 ? exactValue : hasValue;
+
+ return this.reject(use);
+ }, _Mixin$create.find = function (callback) {
+ var target = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
+ (true && !(typeof callback === 'function') && (0, _emberDebug.assert)('find expects a function as first argument.', typeof callback === 'function'));
+
+
+ var length = (0, _emberMetal.get)(this, 'length');
+
+ for (var index = 0; index < length; index++) {
+ var item = this.objectAt(index);
+
+ if (callback.call(target, item, index, this)) {
+ return item;
+ }
+ }
+ }, _Mixin$create.findBy = function (key, value) {
+ // eslint-disable-line no-unused-vars
+ return this.find(iter.apply(this, arguments));
+ }, _Mixin$create.every = function (callback, target) {
+ (true && !(typeof callback === 'function') && (0, _emberDebug.assert)('every expects a function as first argument.', typeof callback === 'function'));
+
+
+ return !this.find(function (x, idx, i) {
+ return !callback.call(target, x, idx, i);
+ });
+ }, _Mixin$create.isEvery = function (key, value) {
+ // eslint-disable-line no-unused-vars
+ return this.every(iter.apply(this, arguments));
+ }, _Mixin$create.any = function (callback) {
+ var target = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
+ (true && !(typeof callback === 'function') && (0, _emberDebug.assert)('any expects a function as first argument.', typeof callback === 'function'));
+
+
+ var length = (0, _emberMetal.get)(this, 'length');
+
+ for (var index = 0; index < length; index++) {
+ var item = this.objectAt(index);
+
+ if (callback.call(target, item, index, this)) {
+ return true;
+ }
+ }
+
+ return false;
+ }, _Mixin$create.isAny = function (key, value) {
+ // eslint-disable-line no-unused-vars
+ return this.any(iter.apply(this, arguments));
+ }, _Mixin$create.reduce = function (callback, initialValue, reducerProperty) {
+ (true && !(typeof callback === 'function') && (0, _emberDebug.assert)('reduce expects a function as first argument.', typeof callback === 'function'));
+
+
+ var ret = initialValue;
+
+ this.forEach(function (item, i) {
+ ret = callback(ret, item, i, this, reducerProperty);
+ }, this);
+
+ return ret;
+ }, _Mixin$create.invoke = function (methodName) {
+ for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ args[_key - 1] = arguments[_key];
+ }
+
+ var ret = A();
+
+ this.forEach(function (x, idx) {
+ var method = x && x[methodName];
+
+ if ('function' === typeof method) {
+ ret[idx] = args.length ? method.apply(x, args) : x[methodName]();
+ }
+ }, this);
+
+ return ret;
+ }, _Mixin$create.toArray = function () {
+ var ret = A();
+
+ this.forEach(function (o, idx) {
+ return ret[idx] = o;
+ });
+
+ return ret;
+ }, _Mixin$create.compact = function () {
+ return this.filter(function (value) {
+ return value != null;
+ });
+ }, _Mixin$create.includes = function (obj, startAt) {
+ var len = (0, _emberMetal.get)(this, 'length');
+
+ if (startAt === undefined) {
+ startAt = 0;
+ }
+
+ if (startAt < 0) {
+ startAt += len;
+ }
+
+ for (var idx = startAt; idx < len; idx++) {
+ var currentObj = objectAt(this, idx);
+
+ // SameValueZero comparison (NaN !== NaN)
+ if (obj === currentObj || obj !== obj && currentObj !== currentObj) {
+ return true;
+ }
+ }
+
+ return false;
+ }, _Mixin$create.sortBy = function () {
+ var sortKeys = arguments;
+
+ return this.toArray().sort(function (a, b) {
+ for (var i = 0; i < sortKeys.length; i++) {
+ var key = sortKeys[i];
+ var propA = (0, _emberMetal.get)(a, key);
+ var propB = (0, _emberMetal.get)(b, key);
+ // return 1 or -1 else continue to the next sortKey
+ var compareValue = (0, _compare.default)(propA, propB);
+
+ if (compareValue) {
+ return compareValue;
+ }
+ }
+ return 0;
+ });
+ }, _Mixin$create.uniq = function () {
+ var ret = A();
+
+ var seen = new Set();
+ this.forEach(function (item) {
+ if (!seen.has(item)) {
+ seen.add(item);
+ ret.push(item);
+ }
+ });
+
+ return ret;
+ }, _Mixin$create.uniqBy = function (key) {
+ var ret = A();
+ var seen = new Set();
+
+ this.forEach(function (item) {
+ var val = (0, _emberMetal.get)(item, key);
+ if (!seen.has(val)) {
+ seen.add(val);
+ ret.push(item);
+ }
+ });
+
+ return ret;
+ }, _Mixin$create.without = function (value) {
+ if (!this.includes(value)) {
+ return this; // nothing to do
+ }
+
+ var ret = A();
+
+ this.forEach(function (k) {
+ // SameValueZero comparison (NaN !== NaN)
+ if (!(k === value || k !== k && value !== value)) {
+ ret[ret.length] = k;
+ }
+ });
+
+ return ret;
+ }, _Mixin$create['@each'] = (0, _emberMetal.computed)(function () {
+ // TODO use Symbol or add to meta
+ if (!this.__each) {
+ this.__each = new EachProxy(this);
+ }
+
+ return this.__each;
+ }).volatile().readOnly(), _Mixin$create));
+
+ /**
+ This is the object instance returned when you get the `@each` property on an
+ array. It uses the unknownProperty handler to automatically create
+ EachArray instances for property names.
+ @class EachProxy
+ @private
+ */
+ function EachProxy(content) {
+ this._content = content;
+ this._keys = undefined;
+ (0, _emberMetal.meta)(this);
+ }
+
+ EachProxy.prototype = {
+ __defineNonEnumerable: function (property) {
+ this[property.name] = property.descriptor.value;
+ },
+ arrayWillChange: function (content, idx, removedCnt, addedCnt) {
+ // eslint-disable-line no-unused-vars
+ var keys = this._keys;
+ var lim = removedCnt > 0 ? idx + removedCnt : -1;
+ var meta = (0, _emberMetal.peekMeta)(this);
+ for (var key in keys) {
+ if (lim > 0) {
+ removeObserverForContentKey(content, key, this, idx, lim);
+ }
+ (0, _emberMetal.propertyWillChange)(this, key, meta);
+ }
+ },
+ arrayDidChange: function (content, idx, removedCnt, addedCnt) {
+ var keys = this._keys;
+ var lim = addedCnt > 0 ? idx + addedCnt : -1;
+ var meta = (0, _emberMetal.peekMeta)(this);
+ for (var key in keys) {
+ if (lim > 0) {
+ addObserverForContentKey(content, key, this, idx, lim);
+ }
+ (0, _emberMetal.propertyDidChange)(this, key, meta);
+ }
+ },
+ willWatchProperty: function (property) {
+ this.beginObservingContentKey(property);
+ },
+ didUnwatchProperty: function (property) {
+ this.stopObservingContentKey(property);
+ },
+ beginObservingContentKey: function (keyName) {
+ var keys = this._keys;
+ if (!keys) {
+ keys = this._keys = Object.create(null);
+ }
+
+ if (!keys[keyName]) {
+ keys[keyName] = 1;
+ var content = this._content;
+ var len = (0, _emberMetal.get)(content, 'length');
+
+ addObserverForContentKey(content, keyName, this, 0, len);
+ } else {
+ keys[keyName]++;
+ }
+ },
+ stopObservingContentKey: function (keyName) {
+ var keys = this._keys;
+ if (keys && keys[keyName] > 0 && --keys[keyName] <= 0) {
+ var content = this._content;
+ var len = (0, _emberMetal.get)(content, 'length');
+
+ removeObserverForContentKey(content, keyName, this, 0, len);
+ }
+ },
+ contentKeyWillChange: function (obj, keyName) {
+ (0, _emberMetal.propertyWillChange)(this, keyName);
+ },
+ contentKeyDidChange: function (obj, keyName) {
+ (0, _emberMetal.propertyDidChange)(this, keyName);
+ }
+ };
+
+ function addObserverForContentKey(content, keyName, proxy, idx, loc) {
+ while (--loc >= idx) {
+ var item = objectAt(content, loc);
+ if (item) {
+ (true && !(typeof item === 'object') && (0, _emberDebug.assert)('When using @each to observe the array `' + (0, _emberUtils.toString)(content) + '`, the array must return an object', typeof item === 'object'));
+
+ (0, _emberMetal._addBeforeObserver)(item, keyName, proxy, 'contentKeyWillChange');
+ (0, _emberMetal.addObserver)(item, keyName, proxy, 'contentKeyDidChange');
+ }
+ }
+ }
+
+ function removeObserverForContentKey(content, keyName, proxy, idx, loc) {
+ while (--loc >= idx) {
+ var item = objectAt(content, loc);
+ if (item) {
+ (0, _emberMetal._removeBeforeObserver)(item, keyName, proxy, 'contentKeyWillChange');
+ (0, _emberMetal.removeObserver)(item, keyName, proxy, 'contentKeyDidChange');
+ }
+ }
+ }
+
+ exports.default = ArrayMixin;
+});
+enifed('ember-runtime/mixins/comparable', ['exports', 'ember-metal'], function (exports, _emberMetal) {
+ 'use strict';
+
+ exports.default = _emberMetal.Mixin.create({
+
+ /**
+ __Required.__ You must implement this method to apply this mixin.
+ Override to return the result of the comparison of the two parameters. The
+ compare method should return:
+ - `-1` if `a < b`
+ - `0` if `a == b`
+ - `1` if `a > b`
+ Default implementation raises an exception.
+ @method compare
+ @param a {Object} the first object to compare
+ @param b {Object} the second object to compare
+ @return {Number} the result of the comparison
+ @private
+ */
+ compare: null
+ });
+});
+enifed('ember-runtime/mixins/container_proxy', ['exports', 'ember-metal'], function (exports, _emberMetal) {
+ 'use strict';
+
+ /**
+ ContainerProxyMixin is used to provide public access to specific
+ container functionality.
+
+ @class ContainerProxyMixin
+ @private
+ */
+ var containerProxyMixin = {
+ /**
+ The container stores state.
+ @private
+ @property {Ember.Container} __container__
+ */
+ __container__: null,
+
+ ownerInjection: function () {
+ return this.__container__.ownerInjection();
+ },
+ lookup: function (fullName, options) {
+ return this.__container__.lookup(fullName, options);
+ },
+ _resolveLocalLookupName: function (name, source) {
+ return this.__container__.registry.expandLocalLookup('component:' + name, {
+ source: source
+ });
+ },
+ willDestroy: function () {
+ this._super.apply(this, arguments);
+
+ if (this.__container__) {
+ (0, _emberMetal.run)(this.__container__, 'destroy');
+ }
+ },
+ factoryFor: function (fullName) {
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ return this.__container__.factoryFor(fullName, options);
+ }
+ }; /**
+ @module ember
+ */
+ exports.default = _emberMetal.Mixin.create(containerProxyMixin);
+});
+enifed('ember-runtime/mixins/controller', ['exports', 'ember-metal', 'ember-runtime/computed/computed_macros', 'ember-runtime/mixins/action_handler'], function (exports, _emberMetal, _computed_macros, _action_handler) {
+ 'use strict';
+
+ exports.default = _emberMetal.Mixin.create(_action_handler.default, {
+ /* ducktype as a controller */
+ isController: true,
+
+ /**
+ The object to which actions from the view should be sent.
+ For example, when a Handlebars template uses the `{{action}}` helper,
+ it will attempt to send the action to the view's controller's `target`.
+ By default, the value of the target property is set to the router, and
+ is injected when a controller is instantiated. This injection is applied
+ as part of the application's initialization process. In most cases the
+ `target` property will automatically be set to the logical consumer of
+ actions for the controller.
+ @property target
+ @default null
+ @public
+ */
+ target: null,
+
+ store: null,
+
+ /**
+ The controller's current model. When retrieving or modifying a controller's
+ model, this property should be used instead of the `content` property.
+ @property model
+ @public
+ */
+ model: null,
+
+ /**
+ @private
+ */
+ content: (0, _computed_macros.deprecatingAlias)('model', {
+ id: 'ember-runtime.controller.content-alias',
+ until: '2.17.0',
+ url: 'https://emberjs.com/deprecations/v2.x/#toc_controller-content-alias'
+ })
+ });
+});
+enifed('ember-runtime/mixins/copyable', ['exports', 'ember-metal'], function (exports, _emberMetal) {
+ 'use strict';
+
+ exports.default = _emberMetal.Mixin.create({
+ /**
+ __Required.__ You must implement this method to apply this mixin.
+ Override to return a copy of the receiver. Default implementation raises
+ an exception.
+ @method copy
+ @param {Boolean} deep if `true`, a deep copy of the object should be made
+ @return {Object} copy of receiver
+ @private
+ */
+ copy: null
+ });
+});
+enifed('ember-runtime/mixins/enumerable', ['exports', 'ember-metal'], function (exports, _emberMetal) {
+ 'use strict';
+
+ exports.default = _emberMetal.Mixin.create();
+});
+enifed('ember-runtime/mixins/evented', ['exports', 'ember-metal'], function (exports, _emberMetal) {
+ 'use strict';
+
+ exports.default = _emberMetal.Mixin.create({
+
+ /**
+ Subscribes to a named event with given function.
+ ```javascript
+ person.on('didLoad', function() {
+ // fired once the person has loaded
+ });
+ ```
+ An optional target can be passed in as the 2nd argument that will
+ be set as the "this" for the callback. This is a good way to give your
+ function access to the object triggering the event. When the target
+ parameter is used the callback becomes the third argument.
+ @method on
+ @param {String} name The name of the event
+ @param {Object} [target] The "this" binding for the callback
+ @param {Function} method The callback to execute
+ @return this
+ @public
+ */
+ on: function (name, target, method) {
+ (0, _emberMetal.addListener)(this, name, target, method);
+ return this;
+ },
+
+
+ /**
+ Subscribes a function to a named event and then cancels the subscription
+ after the first time the event is triggered. It is good to use ``one`` when
+ you only care about the first time an event has taken place.
+ This function takes an optional 2nd argument that will become the "this"
+ value for the callback. If this argument is passed then the 3rd argument
+ becomes the function.
+ @method one
+ @param {String} name The name of the event
+ @param {Object} [target] The "this" binding for the callback
+ @param {Function} method The callback to execute
+ @return this
+ @public
+ */
+ one: function (name, target, method) {
+ if (!method) {
+ method = target;
+ target = null;
+ }
+
+ (0, _emberMetal.addListener)(this, name, target, method, true);
+ return this;
+ },
+
+
+ /**
+ Triggers a named event for the object. Any additional arguments
+ will be passed as parameters to the functions that are subscribed to the
+ event.
+ ```javascript
+ person.on('didEat', function(food) {
+ console.log('person ate some ' + food);
+ });
+ person.trigger('didEat', 'broccoli');
+ // outputs: person ate some broccoli
+ ```
+ @method trigger
+ @param {String} name The name of the event
+ @param {Object...} args Optional arguments to pass on
+ @public
+ */
+ trigger: function (name) {
+ for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ args[_key - 1] = arguments[_key];
+ }
+
+ (0, _emberMetal.sendEvent)(this, name, args);
+ },
+
+
+ /**
+ Cancels subscription for given name, target, and method.
+ @method off
+ @param {String} name The name of the event
+ @param {Object} target The target of the subscription
+ @param {Function} method The function of the subscription
+ @return this
+ @public
+ */
+ off: function (name, target, method) {
+ (0, _emberMetal.removeListener)(this, name, target, method);
+ return this;
+ },
+
+
+ /**
+ Checks to see if object has any subscriptions for named event.
+ @method has
+ @param {String} name The name of the event
+ @return {Boolean} does the object have a subscription for event
+ @public
+ */
+ has: function (name) {
+ return (0, _emberMetal.hasListeners)(this, name);
+ }
+ });
+});
+enifed('ember-runtime/mixins/mutable_array', ['exports', 'ember-metal', 'ember-runtime/mixins/mutable_enumerable', 'ember-runtime/mixins/array', 'ember-debug'], function (exports, _emberMetal, _mutable_enumerable, _array, _emberDebug) {
+ 'use strict';
+
+ exports.removeAt = removeAt;
+ /**
+ @module @ember/array
+ */
+
+ var OUT_OF_RANGE_EXCEPTION = 'Index out of range';
+ var EMPTY = [];
+
+ function removeAt(array, start, len) {
+ if ('number' === typeof start) {
+ if (start < 0 || start >= (0, _emberMetal.get)(array, 'length')) {
+ throw new _emberDebug.Error(OUT_OF_RANGE_EXCEPTION);
+ }
+
+ // fast case
+ if (len === undefined) {
+ len = 1;
+ }
+
+ array.replace(start, len, EMPTY);
+ }
+
+ return array;
+ }
+
+ /**
+ This mixin defines the API for modifying array-like objects. These methods
+ can be applied only to a collection that keeps its items in an ordered set.
+ It builds upon the Array mixin and adds methods to modify the array.
+ One concrete implementations of this class include ArrayProxy.
+
+ It is important to use the methods in this class to modify arrays so that
+ changes are observable. This allows the binding system in Ember to function
+ correctly.
+
+
+ Note that an Array can change even if it does not implement this mixin.
+ For example, one might implement a SparseArray that cannot be directly
+ modified, but if its underlying enumerable changes, it will change also.
+
+ @class MutableArray
+ @uses EmberArray
+ @uses MutableEnumerable
+ @public
+ */
+ exports.default = _emberMetal.Mixin.create(_array.default, _mutable_enumerable.default, {
+
+ /**
+ __Required.__ You must implement this method to apply this mixin.
+ This is one of the primitives you must implement to support `Array`.
+ You should replace amt objects started at idx with the objects in the
+ passed array. You should also call `this.arrayContentDidChange()`
+ @method replace
+ @param {Number} idx Starting index in the array to replace. If
+ idx >= length, then append to the end of the array.
+ @param {Number} amt Number of elements that should be removed from
+ the array, starting at *idx*.
+ @param {EmberArray} objects An array of zero or more objects that should be
+ inserted into the array at *idx*
+ @public
+ */
+ replace: null,
+
+ /**
+ Remove all elements from the array. This is useful if you
+ want to reuse an existing array without having to recreate it.
+ ```javascript
+ let colors = ['red', 'green', 'blue'];
+ colors.length; // 3
+ colors.clear(); // []
+ colors.length; // 0
+ ```
+ @method clear
+ @return {Array} An empty Array.
+ @public
+ */
+ clear: function () {
+ var len = (0, _emberMetal.get)(this, 'length');
+ if (len === 0) {
+ return this;
+ }
+
+ this.replace(0, len, EMPTY);
+ return this;
+ },
+
+
+ /**
+ This will use the primitive `replace()` method to insert an object at the
+ specified index.
+ ```javascript
+ let colors = ['red', 'green', 'blue'];
+ colors.insertAt(2, 'yellow'); // ['red', 'green', 'yellow', 'blue']
+ colors.insertAt(5, 'orange'); // Error: Index out of range
+ ```
+ @method insertAt
+ @param {Number} idx index of insert the object at.
+ @param {Object} object object to insert
+ @return {EmberArray} receiver
+ @public
+ */
+ insertAt: function (idx, object) {
+ if (idx > (0, _emberMetal.get)(this, 'length')) {
+ throw new _emberDebug.Error(OUT_OF_RANGE_EXCEPTION);
+ }
+
+ this.replace(idx, 0, [object]);
+ return this;
+ },
+
+
+ /**
+ Remove an object at the specified index using the `replace()` primitive
+ method. You can pass either a single index, or a start and a length.
+ If you pass a start and length that is beyond the
+ length this method will throw an `OUT_OF_RANGE_EXCEPTION`.
+ ```javascript
+ let colors = ['red', 'green', 'blue', 'yellow', 'orange'];
+ colors.removeAt(0); // ['green', 'blue', 'yellow', 'orange']
+ colors.removeAt(2, 2); // ['green', 'blue']
+ colors.removeAt(4, 2); // Error: Index out of range
+ ```
+ @method removeAt
+ @param {Number} start index, start of range
+ @param {Number} len length of passing range
+ @return {EmberArray} receiver
+ @public
+ */
+ removeAt: function (start, len) {
+ return removeAt(this, start, len);
+ },
+
+
+ /**
+ Push the object onto the end of the array. Works just like `push()` but it
+ is KVO-compliant.
+ ```javascript
+ let colors = ['red', 'green'];
+ colors.pushObject('black'); // ['red', 'green', 'black']
+ colors.pushObject(['yellow']); // ['red', 'green', ['yellow']]
+ ```
+ @method pushObject
+ @param {*} obj object to push
+ @return object same object passed as a param
+ @public
+ */
+ pushObject: function (obj) {
+ this.insertAt((0, _emberMetal.get)(this, 'length'), obj);
+ return obj;
+ },
+
+
+ /**
+ Add the objects in the passed array to the end of the array. Defers
+ notifying observers of the change until all objects are added.
+ ```javascript
+ let colors = ['red'];
+ colors.pushObjects(['yellow', 'orange']); // ['red', 'yellow', 'orange']
+ ```
+ @method pushObjects
+ @param {EmberArray} objects the objects to add
+ @return {EmberArray} receiver
+ @public
+ */
+ pushObjects: function (objects) {
+ if (!Array.isArray(objects)) {
+ throw new TypeError('Must pass Enumerable to MutableArray#pushObjects');
+ }
+ this.replace((0, _emberMetal.get)(this, 'length'), 0, objects);
+ return this;
+ },
+
+
+ /**
+ Pop object from array or nil if none are left. Works just like `pop()` but
+ it is KVO-compliant.
+ ```javascript
+ let colors = ['red', 'green', 'blue'];
+ colors.popObject(); // 'blue'
+ console.log(colors); // ['red', 'green']
+ ```
+ @method popObject
+ @return object
+ @public
+ */
+ popObject: function () {
+ var len = (0, _emberMetal.get)(this, 'length');
+ if (len === 0) {
+ return null;
+ }
+
+ var ret = (0, _array.objectAt)(this, len - 1);
+ this.removeAt(len - 1, 1);
+ return ret;
+ },
+
+
+ /**
+ Shift an object from start of array or nil if none are left. Works just
+ like `shift()` but it is KVO-compliant.
+ ```javascript
+ let colors = ['red', 'green', 'blue'];
+ colors.shiftObject(); // 'red'
+ console.log(colors); // ['green', 'blue']
+ ```
+ @method shiftObject
+ @return object
+ @public
+ */
+ shiftObject: function () {
+ if ((0, _emberMetal.get)(this, 'length') === 0) {
+ return null;
+ }
+
+ var ret = (0, _array.objectAt)(this, 0);
+ this.removeAt(0);
+ return ret;
+ },
+
+
+ /**
+ Unshift an object to start of array. Works just like `unshift()` but it is
+ KVO-compliant.
+ ```javascript
+ let colors = ['red'];
+ colors.unshiftObject('yellow'); // ['yellow', 'red']
+ colors.unshiftObject(['black']); // [['black'], 'yellow', 'red']
+ ```
+ @method unshiftObject
+ @param {*} obj object to unshift
+ @return object same object passed as a param
+ @public
+ */
+ unshiftObject: function (obj) {
+ this.insertAt(0, obj);
+ return obj;
+ },
+
+
+ /**
+ Adds the named objects to the beginning of the array. Defers notifying
+ observers until all objects have been added.
+ ```javascript
+ let colors = ['red'];
+ colors.unshiftObjects(['black', 'white']); // ['black', 'white', 'red']
+ colors.unshiftObjects('yellow'); // Type Error: 'undefined' is not a function
+ ```
+ @method unshiftObjects
+ @param {Enumberable} objects the objects to add
+ @return {EmberArray} receiver
+ @public
+ */
+ unshiftObjects: function (objects) {
+ this.replace(0, 0, objects);
+ return this;
+ },
+
+
+ /**
+ Reverse objects in the array. Works just like `reverse()` but it is
+ KVO-compliant.
+ @method reverseObjects
+ @return {EmberArray} receiver
+ @public
+ */
+ reverseObjects: function () {
+ var len = (0, _emberMetal.get)(this, 'length');
+ if (len === 0) {
+ return this;
+ }
+
+ var objects = this.toArray().reverse();
+ this.replace(0, len, objects);
+ return this;
+ },
+
+
+ /**
+ Replace all the receiver's content with content of the argument.
+ If argument is an empty array receiver will be cleared.
+ ```javascript
+ let colors = ['red', 'green', 'blue'];
+ colors.setObjects(['black', 'white']); // ['black', 'white']
+ colors.setObjects([]); // []
+ ```
+ @method setObjects
+ @param {EmberArray} objects array whose content will be used for replacing
+ the content of the receiver
+ @return {EmberArray} receiver with the new content
+ @public
+ */
+ setObjects: function (objects) {
+ if (objects.length === 0) {
+ return this.clear();
+ }
+
+ var len = (0, _emberMetal.get)(this, 'length');
+ this.replace(0, len, objects);
+ return this;
+ },
+
+
+ /**
+ Remove all occurrences of an object in the array.
+ ```javascript
+ let cities = ['Chicago', 'Berlin', 'Lima', 'Chicago'];
+ cities.removeObject('Chicago'); // ['Berlin', 'Lima']
+ cities.removeObject('Lima'); // ['Berlin']
+ cities.removeObject('Tokyo') // ['Berlin']
+ ```
+ @method removeObject
+ @param {*} obj object to remove
+ @return {EmberArray} receiver
+ @public
+ */
+ removeObject: function (obj) {
+ var loc = (0, _emberMetal.get)(this, 'length') || 0;
+ while (--loc >= 0) {
+ var curObject = (0, _array.objectAt)(this, loc);
+
+ if (curObject === obj) {
+ this.removeAt(loc);
+ }
+ }
+ return this;
+ },
+
+
+ /**
+ Removes each object in the passed array from the receiver.
+ @method removeObjects
+ @param {EmberArray} objects the objects to remove
+ @return {EmberArray} receiver
+ @public
+ */
+ removeObjects: function (objects) {
+ (0, _emberMetal.beginPropertyChanges)(this);
+ for (var i = objects.length - 1; i >= 0; i--) {
+ this.removeObject(objects[i]);
+ }
+ (0, _emberMetal.endPropertyChanges)(this);
+ return this;
+ },
+
+
+ /**
+ Push the object onto the end of the array if it is not already
+ present in the array.
+ ```javascript
+ let cities = ['Chicago', 'Berlin'];
+ cities.addObject('Lima'); // ['Chicago', 'Berlin', 'Lima']
+ cities.addObject('Berlin'); // ['Chicago', 'Berlin', 'Lima']
+ ```
+ @method addObject
+ @param {*} obj object to add, if not already present
+ @return {EmberArray} receiver
+ @public
+ */
+ addObject: function (obj) {
+ var included = this.includes(obj);
+
+ if (!included) {
+ this.pushObject(obj);
+ }
+
+ return this;
+ },
+
+
+ /**
+ Adds each object in the passed array to the receiver.
+ @method addObjects
+ @param {EmberArray} objects the objects to add.
+ @return {EmberArray} receiver
+ @public
+ */
+ addObjects: function (objects) {
+ var _this = this;
+
+ (0, _emberMetal.beginPropertyChanges)(this);
+ objects.forEach(function (obj) {
+ return _this.addObject(obj);
+ });
+ (0, _emberMetal.endPropertyChanges)(this);
+ return this;
+ }
+ });
+});
+enifed('ember-runtime/mixins/mutable_enumerable', ['exports', 'ember-runtime/mixins/enumerable', 'ember-metal'], function (exports, _enumerable, _emberMetal) {
+ 'use strict';
+
+ exports.default = _emberMetal.Mixin.create(_enumerable.default);
+});
+enifed('ember-runtime/mixins/observable', ['exports', 'ember-metal', 'ember-debug'], function (exports, _emberMetal, _emberDebug) {
+ 'use strict';
+
+ exports.default = _emberMetal.Mixin.create({
+
+ /**
+ Retrieves the value of a property from the object.
+ This method is usually similar to using `object[keyName]` or `object.keyName`,
+ however it supports both computed properties and the unknownProperty
+ handler.
+ Because `get` unifies the syntax for accessing all these kinds
+ of properties, it can make many refactorings easier, such as replacing a
+ simple property with a computed property, or vice versa.
+ ### Computed Properties
+ Computed properties are methods defined with the `property` modifier
+ declared at the end, such as:
+ ```javascript
+ import { computed } from '@ember/object';
+ fullName: computed('firstName', 'lastName', function() {
+ return this.get('firstName') + ' ' + this.get('lastName');
+ })
+ ```
+ When you call `get` on a computed property, the function will be
+ called and the return value will be returned instead of the function
+ itself.
+ ### Unknown Properties
+ Likewise, if you try to call `get` on a property whose value is
+ `undefined`, the `unknownProperty()` method will be called on the object.
+ If this method returns any value other than `undefined`, it will be returned
+ instead. This allows you to implement "virtual" properties that are
+ not defined upfront.
+ @method get
+ @param {String} keyName The property to retrieve
+ @return {Object} The property value or undefined.
+ @public
+ */
+ get: function (keyName) {
+ return (0, _emberMetal.get)(this, keyName);
+ },
+
+
+ /**
+ To get the values of multiple properties at once, call `getProperties`
+ with a list of strings or an array:
+ ```javascript
+ record.getProperties('firstName', 'lastName', 'zipCode');
+ // { firstName: 'John', lastName: 'Doe', zipCode: '10011' }
+ ```
+ is equivalent to:
+ ```javascript
+ record.getProperties(['firstName', 'lastName', 'zipCode']);
+ // { firstName: 'John', lastName: 'Doe', zipCode: '10011' }
+ ```
+ @method getProperties
+ @param {String...|Array} list of keys to get
+ @return {Object}
+ @public
+ */
+ getProperties: function () {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ return _emberMetal.getProperties.apply(undefined, [this].concat(args));
+ },
+
+
+ /**
+ Sets the provided key or path to the value.
+ ```javascript
+ record.set("key", value);
+ ```
+ This method is generally very similar to calling `object["key"] = value` or
+ `object.key = value`, except that it provides support for computed
+ properties, the `setUnknownProperty()` method and property observers.
+ ### Computed Properties
+ If you try to set a value on a key that has a computed property handler
+ defined (see the `get()` method for an example), then `set()` will call
+ that method, passing both the value and key instead of simply changing
+ the value itself. This is useful for those times when you need to
+ implement a property that is composed of one or more member
+ properties.
+ ### Unknown Properties
+ If you try to set a value on a key that is undefined in the target
+ object, then the `setUnknownProperty()` handler will be called instead. This
+ gives you an opportunity to implement complex "virtual" properties that
+ are not predefined on the object. If `setUnknownProperty()` returns
+ undefined, then `set()` will simply set the value on the object.
+ ### Property Observers
+ In addition to changing the property, `set()` will also register a property
+ change with the object. Unless you have placed this call inside of a
+ `beginPropertyChanges()` and `endPropertyChanges(),` any "local" observers
+ (i.e. observer methods declared on the same object), will be called
+ immediately. Any "remote" observers (i.e. observer methods declared on
+ another object) will be placed in a queue and called at a later time in a
+ coalesced manner.
+ @method set
+ @param {String} keyName The property to set
+ @param {Object} value The value to set or `null`.
+ @return {Object} The passed value
+ @public
+ */
+ set: function (keyName, value) {
+ return (0, _emberMetal.set)(this, keyName, value);
+ },
+
+
+ /**
+ Sets a list of properties at once. These properties are set inside
+ a single `beginPropertyChanges` and `endPropertyChanges` batch, so
+ observers will be buffered.
+ ```javascript
+ record.setProperties({ firstName: 'Charles', lastName: 'Jolley' });
+ ```
+ @method setProperties
+ @param {Object} hash the hash of keys and values to set
+ @return {Object} The passed in hash
+ @public
+ */
+ setProperties: function (hash) {
+ return (0, _emberMetal.setProperties)(this, hash);
+ },
+
+
+ /**
+ Begins a grouping of property changes.
+ You can use this method to group property changes so that notifications
+ will not be sent until the changes are finished. If you plan to make a
+ large number of changes to an object at one time, you should call this
+ method at the beginning of the changes to begin deferring change
+ notifications. When you are done making changes, call
+ `endPropertyChanges()` to deliver the deferred change notifications and end
+ deferring.
+ @method beginPropertyChanges
+ @return {Observable}
+ @private
+ */
+ beginPropertyChanges: function () {
+ (0, _emberMetal.beginPropertyChanges)();
+ return this;
+ },
+
+
+ /**
+ Ends a grouping of property changes.
+ You can use this method to group property changes so that notifications
+ will not be sent until the changes are finished. If you plan to make a
+ large number of changes to an object at one time, you should call
+ `beginPropertyChanges()` at the beginning of the changes to defer change
+ notifications. When you are done making changes, call this method to
+ deliver the deferred change notifications and end deferring.
+ @method endPropertyChanges
+ @return {Observable}
+ @private
+ */
+ endPropertyChanges: function () {
+ (0, _emberMetal.endPropertyChanges)();
+ return this;
+ },
+
+
+ /**
+ Notify the observer system that a property is about to change.
+ Sometimes you need to change a value directly or indirectly without
+ actually calling `get()` or `set()` on it. In this case, you can use this
+ method and `propertyDidChange()` instead. Calling these two methods
+ together will notify all observers that the property has potentially
+ changed value.
+ Note that you must always call `propertyWillChange` and `propertyDidChange`
+ as a pair. If you do not, it may get the property change groups out of
+ order and cause notifications to be delivered more often than you would
+ like.
+ @method propertyWillChange
+ @param {String} keyName The property key that is about to change.
+ @return {Observable}
+ @private
+ */
+ propertyWillChange: function (keyName) {
+ (0, _emberMetal.propertyWillChange)(this, keyName);
+ return this;
+ },
+
+
+ /**
+ Notify the observer system that a property has just changed.
+ Sometimes you need to change a value directly or indirectly without
+ actually calling `get()` or `set()` on it. In this case, you can use this
+ method and `propertyWillChange()` instead. Calling these two methods
+ together will notify all observers that the property has potentially
+ changed value.
+ Note that you must always call `propertyWillChange` and `propertyDidChange`
+ as a pair. If you do not, it may get the property change groups out of
+ order and cause notifications to be delivered more often than you would
+ like.
+ @method propertyDidChange
+ @param {String} keyName The property key that has just changed.
+ @return {Observable}
+ @private
+ */
+ propertyDidChange: function (keyName) {
+ (0, _emberMetal.propertyDidChange)(this, keyName);
+ return this;
+ },
+
+
+ /**
+ Convenience method to call `propertyWillChange` and `propertyDidChange` in
+ succession.
+ @method notifyPropertyChange
+ @param {String} keyName The property key to be notified about.
+ @return {Observable}
+ @public
+ */
+ notifyPropertyChange: function (keyName) {
+ this.propertyWillChange(keyName);
+ this.propertyDidChange(keyName);
+ return this;
+ },
+
+
+ /**
+ Adds an observer on a property.
+ This is the core method used to register an observer for a property.
+ Once you call this method, any time the key's value is set, your observer
+ will be notified. Note that the observers are triggered any time the
+ value is set, regardless of whether it has actually changed. Your
+ observer should be prepared to handle that.
+ ### Observer Methods
+ Observer methods have the following signature:
+ ```app/components/my-component.js
+ import Component from '@ember/component';
+ export default Component.extend({
+ init() {
+ this._super(...arguments);
+ this.addObserver('foo', this, 'fooDidChange');
+ },
+ fooDidChange(sender, key, value, rev) {
+ // your code
+ }
+ });
+ ```
+ The `sender` is the object that changed. The `key` is the property that
+ changes. The `value` property is currently reserved and unused. The `rev`
+ is the last property revision of the object when it changed, which you can
+ use to detect if the key value has really changed or not.
+ Usually you will not need the value or revision parameters at
+ the end. In this case, it is common to write observer methods that take
+ only a sender and key value as parameters or, if you aren't interested in
+ any of these values, to write an observer that has no parameters at all.
+ @method addObserver
+ @param {String} key The key to observe
+ @param {Object} target The target object to invoke
+ @param {String|Function} method The method to invoke
+ @return {Observable}
+ @public
+ */
+ addObserver: function (key, target, method) {
+ (0, _emberMetal.addObserver)(this, key, target, method);
+ return this;
+ },
+
+
+ /**
+ Remove an observer you have previously registered on this object. Pass
+ the same key, target, and method you passed to `addObserver()` and your
+ target will no longer receive notifications.
+ @method removeObserver
+ @param {String} key The key to observe
+ @param {Object} target The target object to invoke
+ @param {String|Function} method The method to invoke
+ @return {Observable}
+ @public
+ */
+ removeObserver: function (key, target, method) {
+ (0, _emberMetal.removeObserver)(this, key, target, method);
+ return this;
+ },
+
+
+ /**
+ Returns `true` if the object currently has observers registered for a
+ particular key. You can use this method to potentially defer performing
+ an expensive action until someone begins observing a particular property
+ on the object.
+ @method hasObserverFor
+ @param {String} key Key to check
+ @return {Boolean}
+ @private
+ */
+ hasObserverFor: function (key) {
+ return (0, _emberMetal.hasListeners)(this, key + ':change');
+ },
+
+
+ /**
+ Retrieves the value of a property, or a default value in the case that the
+ property returns `undefined`.
+ ```javascript
+ person.getWithDefault('lastName', 'Doe');
+ ```
+ @method getWithDefault
+ @param {String} keyName The name of the property to retrieve
+ @param {Object} defaultValue The value to return if the property value is undefined
+ @return {Object} The property value or the defaultValue.
+ @public
+ */
+ getWithDefault: function (keyName, defaultValue) {
+ return (0, _emberMetal.getWithDefault)(this, keyName, defaultValue);
+ },
+
+
+ /**
+ Set the value of a property to the current value plus some amount.
+ ```javascript
+ person.incrementProperty('age');
+ team.incrementProperty('score', 2);
+ ```
+ @method incrementProperty
+ @param {String} keyName The name of the property to increment
+ @param {Number} increment The amount to increment by. Defaults to 1
+ @return {Number} The new property value
+ @public
+ */
+ incrementProperty: function (keyName, increment) {
+ if ((0, _emberMetal.isNone)(increment)) {
+ increment = 1;
+ }
+ (true && !(!isNaN(parseFloat(increment)) && isFinite(increment)) && (0, _emberDebug.assert)('Must pass a numeric value to incrementProperty', !isNaN(parseFloat(increment)) && isFinite(increment)));
+
+ return (0, _emberMetal.set)(this, keyName, (parseFloat((0, _emberMetal.get)(this, keyName)) || 0) + increment);
+ },
+
+
+ /**
+ Set the value of a property to the current value minus some amount.
+ ```javascript
+ player.decrementProperty('lives');
+ orc.decrementProperty('health', 5);
+ ```
+ @method decrementProperty
+ @param {String} keyName The name of the property to decrement
+ @param {Number} decrement The amount to decrement by. Defaults to 1
+ @return {Number} The new property value
+ @public
+ */
+ decrementProperty: function (keyName, decrement) {
+ if ((0, _emberMetal.isNone)(decrement)) {
+ decrement = 1;
+ }
+ (true && !(!isNaN(parseFloat(decrement)) && isFinite(decrement)) && (0, _emberDebug.assert)('Must pass a numeric value to decrementProperty', !isNaN(parseFloat(decrement)) && isFinite(decrement)));
+
+ return (0, _emberMetal.set)(this, keyName, ((0, _emberMetal.get)(this, keyName) || 0) - decrement);
+ },
+
+
+ /**
+ Set the value of a boolean property to the opposite of its
+ current value.
+ ```javascript
+ starship.toggleProperty('warpDriveEngaged');
+ ```
+ @method toggleProperty
+ @param {String} keyName The name of the property to toggle
+ @return {Boolean} The new property value
+ @public
+ */
+ toggleProperty: function (keyName) {
+ return (0, _emberMetal.set)(this, keyName, !(0, _emberMetal.get)(this, keyName));
+ },
+
+
+ /**
+ Returns the cached value of a computed property, if it exists.
+ This allows you to inspect the value of a computed property
+ without accidentally invoking it if it is intended to be
+ generated lazily.
+ @method cacheFor
+ @param {String} keyName
+ @return {Object} The cached value of the computed property, if any
+ @public
+ */
+ cacheFor: function (keyName) {
+ return (0, _emberMetal.cacheFor)(this, keyName);
+ }
+ });
+});
+enifed('ember-runtime/mixins/promise_proxy', ['exports', 'ember-metal', 'ember-debug', 'ember-runtime/computed/computed_macros'], function (exports, _emberMetal, _emberDebug, _computed_macros) {
+ 'use strict';
+
+ /**
+ @module @ember/object
+ */
+
+ function tap(proxy, promise) {
+ (0, _emberMetal.setProperties)(proxy, {
+ isFulfilled: false,
+ isRejected: false
+ });
+
+ return promise.then(function (value) {
+ if (!proxy.isDestroyed && !proxy.isDestroying) {
+ (0, _emberMetal.setProperties)(proxy, {
+ content: value,
+ isFulfilled: true
+ });
+ }
+ return value;
+ }, function (reason) {
+ if (!proxy.isDestroyed && !proxy.isDestroying) {
+ (0, _emberMetal.setProperties)(proxy, {
+ reason: reason,
+ isRejected: true
+ });
+ }
+ throw reason;
+ }, 'Ember: PromiseProxy');
+ }
+
+ /**
+ A low level mixin making ObjectProxy promise-aware.
+
+ ```javascript
+ import { resolve } from 'rsvp';
+ import $ from 'jquery';
+ import ObjectProxy from '@ember/object/proxy';
+ import PromiseProxyMixin from '@ember/object/promise-proxy-mixin';
+
+ let ObjectPromiseProxy = ObjectProxy.extend(PromiseProxyMixin);
+
+ let proxy = ObjectPromiseProxy.create({
+ promise: resolve($.getJSON('/some/remote/data.json'))
+ });
+
+ proxy.then(function(json){
+ // the json
+ }, function(reason) {
+ // the reason why you have no json
+ });
+ ```
+
+ the proxy has bindable attributes which
+ track the promises life cycle
+
+ ```javascript
+ proxy.get('isPending') //=> true
+ proxy.get('isSettled') //=> false
+ proxy.get('isRejected') //=> false
+ proxy.get('isFulfilled') //=> false
+ ```
+
+ When the $.getJSON completes, and the promise is fulfilled
+ with json, the life cycle attributes will update accordingly.
+ Note that $.getJSON doesn't return an ECMA specified promise,
+ it is useful to wrap this with an `RSVP.resolve` so that it behaves
+ as a spec compliant promise.
+
+ ```javascript
+ proxy.get('isPending') //=> false
+ proxy.get('isSettled') //=> true
+ proxy.get('isRejected') //=> false
+ proxy.get('isFulfilled') //=> true
+ ```
+
+ As the proxy is an ObjectProxy, and the json now its content,
+ all the json properties will be available directly from the proxy.
+
+ ```javascript
+ // Assuming the following json:
+ {
+ firstName: 'Stefan',
+ lastName: 'Penner'
+ }
+
+ // both properties will accessible on the proxy
+ proxy.get('firstName') //=> 'Stefan'
+ proxy.get('lastName') //=> 'Penner'
+ ```
+
+ @class PromiseProxyMixin
+ @public
+ */
+ exports.default = _emberMetal.Mixin.create({
+ /**
+ If the proxied promise is rejected this will contain the reason
+ provided.
+ @property reason
+ @default null
+ @public
+ */
+ reason: null,
+
+ /**
+ Once the proxied promise has settled this will become `false`.
+ @property isPending
+ @default true
+ @public
+ */
+ isPending: (0, _computed_macros.not)('isSettled').readOnly(),
+
+ /**
+ Once the proxied promise has settled this will become `true`.
+ @property isSettled
+ @default false
+ @public
+ */
+ isSettled: (0, _computed_macros.or)('isRejected', 'isFulfilled').readOnly(),
+
+ /**
+ Will become `true` if the proxied promise is rejected.
+ @property isRejected
+ @default false
+ @public
+ */
+ isRejected: false,
+
+ /**
+ Will become `true` if the proxied promise is fulfilled.
+ @property isFulfilled
+ @default false
+ @public
+ */
+ isFulfilled: false,
+
+ /**
+ The promise whose fulfillment value is being proxied by this object.
+ This property must be specified upon creation, and should not be
+ changed once created.
+ Example:
+ ```javascript
+ import ObjectProxy from '@ember/object/proxy';
+ import PromiseProxyMixin from '@ember/object/promise-proxy-mixin';
+ ObjectProxy.extend(PromiseProxyMixin).create({
+ promise: <thenable>
+ });
+ ```
+ @property promise
+ @public
+ */
+ promise: (0, _emberMetal.computed)({
+ get: function () {
+ throw new _emberDebug.Error('PromiseProxy\'s promise must be set');
+ },
+ set: function (key, promise) {
+ return tap(this, promise);
+ }
+ }),
+
+ /**
+ An alias to the proxied promise's `then`.
+ See RSVP.Promise.then.
+ @method then
+ @param {Function} callback
+ @return {RSVP.Promise}
+ @public
+ */
+ then: promiseAlias('then'),
+
+ /**
+ An alias to the proxied promise's `catch`.
+ See RSVP.Promise.catch.
+ @method catch
+ @param {Function} callback
+ @return {RSVP.Promise}
+ @since 1.3.0
+ @public
+ */
+ 'catch': promiseAlias('catch'),
+
+ /**
+ An alias to the proxied promise's `finally`.
+ See RSVP.Promise.finally.
+ @method finally
+ @param {Function} callback
+ @return {RSVP.Promise}
+ @since 1.3.0
+ @public
+ */
+ 'finally': promiseAlias('finally')
+
+ });
+
+
+ function promiseAlias(name) {
+ return function () {
+ var promise = (0, _emberMetal.get)(this, 'promise');
+ return promise[name].apply(promise, arguments);
+ };
+ }
+});
+enifed('ember-runtime/mixins/registry_proxy', ['exports', 'ember-metal'], function (exports, _emberMetal) {
+ 'use strict';
+
+ exports.default = _emberMetal.Mixin.create({
+ __registry__: null,
+
+ /**
+ Given a fullName return the corresponding factory.
+ @public
+ @method resolveRegistration
+ @param {String} fullName
+ @return {Function} fullName's factory
+ */
+ resolveRegistration: registryAlias('resolve'),
+
+ /**
+ Registers a factory that can be used for dependency injection (with
+ `inject`) or for service lookup. Each factory is registered with
+ a full name including two parts: `type:name`.
+ A simple example:
+ ```javascript
+ import Application from '@ember/application';
+ import EmberObject from '@ember/object';
+ let App = Application.create();
+ App.Orange = EmberObject.extend();
+ App.register('fruit:favorite', App.Orange);
+ ```
+ Ember will resolve factories from the `App` namespace automatically.
+ For example `App.CarsController` will be discovered and returned if
+ an application requests `controller:cars`.
+ An example of registering a controller with a non-standard name:
+ ```javascript
+ import Application from '@ember/application';
+ import Controller from '@ember/controller';
+ let App = Application.create();
+ let Session = Controller.extend();
+ App.register('controller:session', Session);
+ // The Session controller can now be treated like a normal controller,
+ // despite its non-standard name.
+ App.ApplicationController = Controller.extend({
+ needs: ['session']
+ });
+ ```
+ Registered factories are **instantiated** by having `create`
+ called on them. Additionally they are **singletons**, each time
+ they are looked up they return the same instance.
+ Some examples modifying that default behavior:
+ ```javascript
+ import Application from '@ember/application';
+ import EmberObject from '@ember/object';
+ let App = Application.create();
+ App.Person = EmberObject.extend();
+ App.Orange = EmberObject.extend();
+ App.Email = EmberObject.extend();
+ App.session = EmberObject.create();
+ App.register('model:user', App.Person, { singleton: false });
+ App.register('fruit:favorite', App.Orange);
+ App.register('communication:main', App.Email, { singleton: false });
+ App.register('session', App.session, { instantiate: false });
+ ```
+ @method register
+ @param fullName {String} type:name (e.g., 'model:user')
+ @param factory {Function} (e.g., App.Person)
+ @param options {Object} (optional) disable instantiation or singleton usage
+ @public
+ */
+ register: registryAlias('register'),
+
+ /**
+ Unregister a factory.
+ ```javascript
+ import Application from '@ember/application';
+ import EmberObject from '@ember/object';
+ let App = Application.create();
+ let User = EmberObject.extend();
+ App.register('model:user', User);
+ App.resolveRegistration('model:user').create() instanceof User //=> true
+ App.unregister('model:user')
+ App.resolveRegistration('model:user') === undefined //=> true
+ ```
+ @public
+ @method unregister
+ @param {String} fullName
+ */
+ unregister: registryAlias('unregister'),
+
+ /**
+ Check if a factory is registered.
+ @public
+ @method hasRegistration
+ @param {String} fullName
+ @return {Boolean}
+ */
+ hasRegistration: registryAlias('has'),
+
+ /**
+ Return a specific registered option for a particular factory.
+ @public
+ @method registeredOption
+ @param {String} fullName
+ @param {String} optionName
+ @return {Object} options
+ */
+ registeredOption: registryAlias('getOption'),
+
+ /**
+ Register options for a particular factory.
+ @public
+ @method registerOptions
+ @param {String} fullName
+ @param {Object} options
+ */
+ registerOptions: registryAlias('options'),
+
+ /**
+ Return registered options for a particular factory.
+ @public
+ @method registeredOptions
+ @param {String} fullName
+ @return {Object} options
+ */
+ registeredOptions: registryAlias('getOptions'),
+
+ /**
+ Allow registering options for all factories of a type.
+ ```javascript
+ import Application from '@ember/application';
+ let App = Application.create();
+ let appInstance = App.buildInstance();
+ // if all of type `connection` must not be singletons
+ appInstance.registerOptionsForType('connection', { singleton: false });
+ appInstance.register('connection:twitter', TwitterConnection);
+ appInstance.register('connection:facebook', FacebookConnection);
+ let twitter = appInstance.lookup('connection:twitter');
+ let twitter2 = appInstance.lookup('connection:twitter');
+ twitter === twitter2; // => false
+ let facebook = appInstance.lookup('connection:facebook');
+ let facebook2 = appInstance.lookup('connection:facebook');
+ facebook === facebook2; // => false
+ ```
+ @public
+ @method registerOptionsForType
+ @param {String} type
+ @param {Object} options
+ */
+ registerOptionsForType: registryAlias('optionsForType'),
+
+ /**
+ Return the registered options for all factories of a type.
+ @public
+ @method registeredOptionsForType
+ @param {String} type
+ @return {Object} options
+ */
+ registeredOptionsForType: registryAlias('getOptionsForType'),
+
+ /**
+ Define a dependency injection onto a specific factory or all factories
+ of a type.
+ When Ember instantiates a controller, view, or other framework component
+ it can attach a dependency to that component. This is often used to
+ provide services to a set of framework components.
+ An example of providing a session object to all controllers:
+ ```javascript
+ import { alias } from '@ember/object/computed';
+ import Application from '@ember/application';
+ import Controller from '@ember/controller';
+ import EmberObject from '@ember/object';
+ let App = Application.create();
+ let Session = EmberObject.extend({ isAuthenticated: false });
+ // A factory must be registered before it can be injected
+ App.register('session:main', Session);
+ // Inject 'session:main' onto all factories of the type 'controller'
+ // with the name 'session'
+ App.inject('controller', 'session', 'session:main');
+ App.IndexController = Controller.extend({
+ isLoggedIn: alias('session.isAuthenticated')
+ });
+ ```
+ Injections can also be performed on specific factories.
+ ```javascript
+ App.inject(<full_name or type>, <property name>, <full_name>)
+ App.inject('route', 'source', 'source:main')
+ App.inject('route:application', 'email', 'model:email')
+ ```
+ It is important to note that injections can only be performed on
+ classes that are instantiated by Ember itself. Instantiating a class
+ directly (via `create` or `new`) bypasses the dependency injection
+ system.
+ @public
+ @method inject
+ @param factoryNameOrType {String}
+ @param property {String}
+ @param injectionName {String}
+ **/
+ inject: registryAlias('injection')
+ });
+
+
+ function registryAlias(name) {
+ return function () {
+ var _registry__;
+
+ return (_registry__ = this.__registry__)[name].apply(_registry__, arguments);
+ };
+ }
+});
+enifed('ember-runtime/mixins/target_action_support', ['exports', 'ember-environment', 'ember-metal', 'ember-debug'], function (exports, _emberEnvironment, _emberMetal, _emberDebug) {
+ 'use strict';
+
+ exports.default = _emberMetal.Mixin.create({
+ target: null,
+ targetObject: (0, _emberMetal.descriptor)({
+ configurable: true,
+ enumerable: false,
+ get: function () {
+ var message = this + ' Usage of `targetObject` is deprecated. Please use `target` instead.';
+ var options = { id: 'ember-runtime.using-targetObject', until: '3.5.0' };
+ (true && !(false) && (0, _emberDebug.deprecate)(message, false, options));
+
+ return this._targetObject;
+ },
+ set: function (value) {
+ var message = this + ' Usage of `targetObject` is deprecated. Please use `target` instead.';
+ var options = { id: 'ember-runtime.using-targetObject', until: '3.5.0' };
+ (true && !(false) && (0, _emberDebug.deprecate)(message, false, options));
+
+ this._targetObject = value;
+ }
+ }),
+ action: null,
+ actionContext: null,
+
+ actionContextObject: (0, _emberMetal.computed)('actionContext', function () {
+ var actionContext = (0, _emberMetal.get)(this, 'actionContext');
+
+ if (typeof actionContext === 'string') {
+ var value = (0, _emberMetal.get)(this, actionContext);
+ if (value === undefined) {
+ value = (0, _emberMetal.get)(_emberEnvironment.context.lookup, actionContext);
+ }
+ return value;
+ } else {
+ return actionContext;
+ }
+ }),
+
+ /**
+ Send an `action` with an `actionContext` to a `target`. The action, actionContext
+ and target will be retrieved from properties of the object. For example:
+ ```javascript
+ import { alias } from '@ember/object/computed';
+ App.SaveButtonView = Ember.View.extend(Ember.TargetActionSupport, {
+ target: alias('controller'),
+ action: 'save',
+ actionContext: alias('context'),
+ click() {
+ this.triggerAction(); // Sends the `save` action, along with the current context
+ // to the current controller
+ }
+ });
+ ```
+ The `target`, `action`, and `actionContext` can be provided as properties of
+ an optional object argument to `triggerAction` as well.
+ ```javascript
+ App.SaveButtonView = Ember.View.extend(Ember.TargetActionSupport, {
+ click() {
+ this.triggerAction({
+ action: 'save',
+ target: this.get('controller'),
+ actionContext: this.get('context')
+ }); // Sends the `save` action, along with the current context
+ // to the current controller
+ }
+ });
+ ```
+ The `actionContext` defaults to the object you are mixing `TargetActionSupport` into.
+ But `target` and `action` must be specified either as properties or with the argument
+ to `triggerAction`, or a combination:
+ ```javascript
+ import { alias } from '@ember/object/computed';
+ App.SaveButtonView = Ember.View.extend(Ember.TargetActionSupport, {
+ target: alias('controller'),
+ click() {
+ this.triggerAction({
+ action: 'save'
+ }); // Sends the `save` action, along with a reference to `this`,
+ // to the current controller
+ }
+ });
+ ```
+ @method triggerAction
+ @param opts {Object} (optional, with the optional keys action, target and/or actionContext)
+ @return {Boolean} true if the action was sent successfully and did not return false
+ @private
+ */
+ triggerAction: function () {
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+ var action = opts.action,
+ target = opts.target,
+ actionContext = opts.actionContext;
+
+ action = action || (0, _emberMetal.get)(this, 'action');
+ target = target || getTarget(this);
+
+ if (actionContext === undefined) {
+ actionContext = (0, _emberMetal.get)(this, 'actionContextObject') || this;
+ }
+
+ if (target && action) {
+ var ret = void 0;
+
+ if (target.send) {
+ var _target;
+
+ ret = (_target = target).send.apply(_target, [action].concat(actionContext));
+ } else {
+ var _target2;
+
+ (true && !(typeof target[action] === 'function') && (0, _emberDebug.assert)('The action \'' + action + '\' did not exist on ' + target, typeof target[action] === 'function'));
+
+ ret = (_target2 = target)[action].apply(_target2, [].concat(actionContext));
+ }
+
+ if (ret !== false) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+ });
+
+
+ function getTarget(instance) {
+ var target = (0, _emberMetal.get)(instance, 'target');
+ if (target) {
+ if (typeof target === 'string') {
+ var value = (0, _emberMetal.get)(instance, target);
+ if (value === undefined) {
+ value = (0, _emberMetal.get)(_emberEnvironment.context.lookup, target);
+ }
+
+ return value;
+ } else {
+ return target;
+ }
+ }
+
+ // if a `targetObject` CP was provided, use it
+ if (target) {
+ return target;
+ }
+
+ // if _targetObject use it
+ if (instance._targetObject) {
+ return instance._targetObject;
+ }
+
+ return null;
+ }
+});
+enifed("ember-runtime/string_registry", ["exports"], function (exports) {
+ "use strict";
+
+ exports.setStrings = setStrings;
+ exports.getStrings = getStrings;
+ exports.get = get;
+ // STATE within a module is frowned upon, this exists
+ // to support Ember.STRINGS but shield ember internals from this legacy global
+ // API.
+ var STRINGS = {};
+
+ function setStrings(strings) {
+ STRINGS = strings;
+ }
+
+ function getStrings() {
+ return STRINGS;
+ }
+
+ function get(name) {
+ return STRINGS[name];
+ }
+});
+enifed('ember-runtime/system/application', ['exports', 'ember-runtime/system/namespace'], function (exports, _namespace) {
+ 'use strict';
+
+ exports.default = _namespace.default.extend();
+});
+enifed('ember-runtime/system/array_proxy', ['exports', 'ember-metal', 'ember-runtime/utils', 'ember-runtime/system/object', 'ember-runtime/mixins/mutable_array', 'ember-runtime/mixins/array', 'ember-debug'], function (exports, _emberMetal, _utils, _object, _mutable_array, _array, _emberDebug) {
+ 'use strict';
+
+ var _EmberObject$extend;
+
+ var ARRAY_OBSERVER_MAPPING = {
+ willChange: '_arrangedContentArrayWillChange',
+ didChange: '_arrangedContentArrayDidChange'
+ };
+
+ /**
+ An ArrayProxy wraps any other object that implements `Array` and/or
+ `MutableArray,` forwarding all requests. This makes it very useful for
+ a number of binding use cases or other cases where being able to swap
+ out the underlying array is useful.
+
+ A simple example of usage:
+
+ ```javascript
+ import { A } from '@ember/array';
+ import ArrayProxy from '@ember/array/proxy';
+
+ let pets = ['dog', 'cat', 'fish'];
+ let ap = ArrayProxy.create({ content: A(pets) });
+
+ ap.get('firstObject'); // 'dog'
+ ap.set('content', ['amoeba', 'paramecium']);
+ ap.get('firstObject'); // 'amoeba'
+ ```
+
+ This class can also be useful as a layer to transform the contents of
+ an array, as they are accessed. This can be done by overriding
+ `objectAtContent`:
+
+ ```javascript
+ import { A } from '@ember/array';
+ import ArrayProxy from '@ember/array/proxy';
+
+ let pets = ['dog', 'cat', 'fish'];
+ let ap = ArrayProxy.create({
+ content: A(pets),
+ objectAtContent: function(idx) {
+ return this.get('content').objectAt(idx).toUpperCase();
+ }
+ });
+
+ ap.get('firstObject'); // . 'DOG'
+ ```
+
+ @class ArrayProxy
+ @extends EmberObject
+ @uses MutableArray
+ @public
+ */
+ exports.default = _object.default.extend(_mutable_array.default, (_EmberObject$extend = {
+ init: function () {
+ this._super.apply(this, arguments);
+
+ /*
+ `this._objectsDirtyIndex` determines which indexes in the `this._objects`
+ cache are dirty.
+ If `this._objectsDirtyIndex === -1` then no indexes are dirty.
+ Otherwise, an index `i` is dirty if `i >= this._objectsDirtyIndex`.
+ Calling `objectAt` with a dirty index will cause the `this._objects`
+ cache to be recomputed.
+ */
+ this._objectsDirtyIndex = 0;
+ this._objects = null;
+
+ this._lengthDirty = true;
+ this._length = 0;
+
+ this._arrangedContent = null;
+ this._addArrangedContentArrayObsever();
+ },
+ willDestroy: function () {
+ this._removeArrangedContentArrayObsever();
+ },
+
+
+ /**
+ The content array. Must be an object that implements `Array` and/or
+ `MutableArray.`
+ @property content
+ @type EmberArray
+ @public
+ */
+ content: null,
+
+ /**
+ The array that the proxy pretends to be. In the default `ArrayProxy`
+ implementation, this and `content` are the same. Subclasses of `ArrayProxy`
+ can override this property to provide things like sorting and filtering.
+ @property arrangedContent
+ @public
+ */
+ arrangedContent: (0, _emberMetal.alias)('content'),
+
+ /**
+ Should actually retrieve the object at the specified index from the
+ content. You can override this method in subclasses to transform the
+ content item to something new.
+ This method will only be called if content is non-`null`.
+ @method objectAtContent
+ @param {Number} idx The index to retrieve.
+ @return {Object} the value or undefined if none found
+ @public
+ */
+ objectAtContent: function (idx) {
+ return (0, _array.objectAt)((0, _emberMetal.get)(this, 'arrangedContent'), idx);
+ },
+ replace: function (idx, amt, objects) {
+ (true && !((0, _emberMetal.get)(this, 'arrangedContent') === (0, _emberMetal.get)(this, 'content')) && (0, _emberDebug.assert)('Mutating an arranged ArrayProxy is not allowed', (0, _emberMetal.get)(this, 'arrangedContent') === (0, _emberMetal.get)(this, 'content')));
+
+ this.replaceContent(idx, amt, objects);
+ },
+
+
+ /**
+ Should actually replace the specified objects on the content array.
+ You can override this method in subclasses to transform the content item
+ into something new.
+ This method will only be called if content is non-`null`.
+ @method replaceContent
+ @param {Number} idx The starting index
+ @param {Number} amt The number of items to remove from the content.
+ @param {EmberArray} objects Optional array of objects to insert or null if no
+ objects.
+ @return {void}
+ @public
+ */
+ replaceContent: function (idx, amt, objects) {
+ (0, _emberMetal.get)(this, 'content').replace(idx, amt, objects);
+ },
+
+
+ // Overriding objectAt is not supported.
+ objectAt: function (idx) {
+ if (this._objects === null) {
+ this._objects = [];
+ }
+
+ if (this._objectsDirtyIndex !== -1 && idx >= this._objectsDirtyIndex) {
+ var arrangedContent = (0, _emberMetal.get)(this, 'arrangedContent');
+ if (arrangedContent) {
+ var length = this._objects.length = (0, _emberMetal.get)(arrangedContent, 'length');
+
+ for (var i = this._objectsDirtyIndex; i < length; i++) {
+ this._objects[i] = this.objectAtContent(i);
+ }
+ } else {
+ this._objects.length = 0;
+ }
+ this._objectsDirtyIndex = -1;
+ }
+
+ return this._objects[idx];
+ },
+
+
+ // Overriding length is not supported.
+ length: (0, _emberMetal.computed)(function () {
+ if (this._lengthDirty) {
+ var arrangedContent = (0, _emberMetal.get)(this, 'arrangedContent');
+ this._length = arrangedContent ? (0, _emberMetal.get)(arrangedContent, 'length') : 0;
+ this._lengthDirty = false;
+ }
+
+ return this._length;
+ }).volatile()
+
+ }, _EmberObject$extend[_emberMetal.PROPERTY_DID_CHANGE] = function (key) {
+ if (key === 'arrangedContent') {
+ var oldLength = this._objects === null ? 0 : this._objects.length;
+ var arrangedContent = (0, _emberMetal.get)(this, 'arrangedContent');
+ var newLength = arrangedContent ? (0, _emberMetal.get)(arrangedContent, 'length') : 0;
+
+ this._removeArrangedContentArrayObsever();
+ this.arrayContentWillChange(0, oldLength, newLength);
+
+ this._objectsDirtyIndex = 0;
+ this._lengthDirty = true;
+
+ this.arrayContentDidChange(0, oldLength, newLength);
+ this._addArrangedContentArrayObsever();
+ }
+ }, _EmberObject$extend._addArrangedContentArrayObsever = function () {
+ var arrangedContent = (0, _emberMetal.get)(this, 'arrangedContent');
+ if (arrangedContent) {
+ (true && !(arrangedContent !== this) && (0, _emberDebug.assert)('Can\'t set ArrayProxy\'s content to itself', arrangedContent !== this));
+ (true && !((0, _utils.isArray)(arrangedContent) || arrangedContent.isDestroyed) && (0, _emberDebug.assert)('ArrayProxy expects an Array or ArrayProxy, but you passed ' + typeof arrangedContent, (0, _utils.isArray)(arrangedContent) || arrangedContent.isDestroyed));
+
+
+ (0, _array.addArrayObserver)(arrangedContent, this, ARRAY_OBSERVER_MAPPING);
+
+ this._arrangedContent = arrangedContent;
+ }
+ }, _EmberObject$extend._removeArrangedContentArrayObsever = function () {
+ if (this._arrangedContent) {
+ (0, _array.removeArrayObserver)(this._arrangedContent, this, ARRAY_OBSERVER_MAPPING);
+ }
+ }, _EmberObject$extend._arrangedContentArrayWillChange = function () {}, _EmberObject$extend._arrangedContentArrayDidChange = function (proxy, idx, removedCnt, addedCnt) {
+ this.arrayContentWillChange(idx, removedCnt, addedCnt);
+
+ var dirtyIndex = idx;
+ if (dirtyIndex < 0) {
+ var length = (0, _emberMetal.get)(this._arrangedContent, 'length');
+ dirtyIndex += length + removedCnt - addedCnt;
+ }
+
+ if (this._objectsDirtyIndex === -1) {
+ this._objectsDirtyIndex = dirtyIndex;
+ } else {
+ if (this._objectsDirtyIndex > dirtyIndex) {
+ this._objectsDirtyIndex = dirtyIndex;
+ }
+ }
+
+ this._lengthDirty = true;
+
+ this.arrayContentDidChange(idx, removedCnt, addedCnt);
+ }, _EmberObject$extend));
+});
+enifed('ember-runtime/system/core_object', ['exports', 'ember-babel', 'ember-utils', 'ember-metal', 'ember-runtime/mixins/action_handler', 'ember-runtime/inject', 'ember-debug', 'ember-environment', 'ember/features'], function (exports, _emberBabel, _emberUtils, _emberMetal, _action_handler, _inject, _emberDebug, _emberEnvironment, _features) {
+ 'use strict';
+
+ exports.POST_INIT = undefined;
+
+ var _Mixin$create, _ClassMixinProps;
+
+ var schedule = _emberMetal.run.schedule;
+ var applyMixin = _emberMetal.Mixin._apply;
+ var reopen = _emberMetal.Mixin.prototype.reopen;
+
+ var POST_INIT = exports.POST_INIT = (0, _emberUtils.symbol)('POST_INIT');
+
+ function makeCtor() {
+ // Note: avoid accessing any properties on the object since it makes the
+ // method a lot faster. This is glue code so we want it to be as fast as
+ // possible.
+
+ var wasApplied = false;
+ var initProperties = void 0,
+ initFactory = void 0;
+
+ var Class = function () {
+ function Class() {
+ (0, _emberBabel.classCallCheck)(this, Class);
+
+ if (!wasApplied) {
+ Class.proto(); // prepare prototype...
+ }
+
+ if (arguments.length > 0) {
+ initProperties = [arguments[0]];
+ }
+
+ this.__defineNonEnumerable(_emberUtils.GUID_KEY_PROPERTY);
+ var m = (0, _emberMetal.meta)(this);
+ var proto = m.proto;
+ m.proto = this;
+
+ if (initFactory) {
+ m.factory = initFactory;
+ initFactory = null;
+ }
+ if (initProperties) {
+ // capture locally so we can clear the closed over variable
+ var props = initProperties;
+ initProperties = null;
+
+ var concatenatedProperties = this.concatenatedProperties;
+ var mergedProperties = this.mergedProperties;
+ var hasConcatenatedProps = concatenatedProperties && concatenatedProperties.length > 0;
+ var hasMergedProps = mergedProperties && mergedProperties.length > 0;
+
+ for (var i = 0; i < props.length; i++) {
+ var properties = props[i];
+
+ (true && !(typeof properties === 'object' || properties === undefined) && (0, _emberDebug.assert)('EmberObject.create only accepts objects.', typeof properties === 'object' || properties === undefined));
+ (true && !(!(properties instanceof _emberMetal.Mixin)) && (0, _emberDebug.assert)('EmberObject.create no longer supports mixing in other ' + 'definitions, use .extend & .create separately instead.', !(properties instanceof _emberMetal.Mixin)));
+
+
+ if (!properties) {
+ continue;
+ }
+
+ var keyNames = Object.keys(properties);
+
+ for (var j = 0; j < keyNames.length; j++) {
+ var keyName = keyNames[j];
+ var value = properties[keyName];
+
+ if (_emberEnvironment.ENV._ENABLE_BINDING_SUPPORT && _emberMetal.Mixin.detectBinding(keyName)) {
+ m.writeBindings(keyName, value);
+ }
+
+ (true && !(!(value instanceof _emberMetal.ComputedProperty)) && (0, _emberDebug.assert)('EmberObject.create no longer supports defining computed ' + 'properties. Define computed properties using extend() or reopen() ' + 'before calling create().', !(value instanceof _emberMetal.ComputedProperty)));
+ (true && !(!(typeof value === 'function' && value.toString().indexOf('._super') !== -1)) && (0, _emberDebug.assert)('EmberObject.create no longer supports defining methods that call _super.', !(typeof value === 'function' && value.toString().indexOf('._super') !== -1)));
+ (true && !(!(keyName === 'actions' && _action_handler.default.detect(this))) && (0, _emberDebug.assert)('`actions` must be provided at extend time, not at create time, ' + 'when ActionHandler is used (i.e. views, controllers & routes).', !(keyName === 'actions' && _action_handler.default.detect(this))));
+
+
+ var possibleDesc = (0, _emberMetal.descriptorFor)(this, keyName, m);
+ var isDescriptor = possibleDesc !== undefined;
+
+ if (!isDescriptor) {
+ var baseValue = this[keyName];
+
+ if (hasConcatenatedProps && concatenatedProperties.indexOf(keyName) > -1) {
+ if (baseValue) {
+ value = (0, _emberUtils.makeArray)(baseValue).concat(value);
+ } else {
+ value = (0, _emberUtils.makeArray)(value);
+ }
+ }
+
+ if (hasMergedProps && mergedProperties.indexOf(keyName) > -1) {
+ value = (0, _emberUtils.assign)({}, baseValue, value);
+ }
+ }
+
+ if (isDescriptor) {
+ possibleDesc.set(this, keyName, value);
+ } else if (typeof this.setUnknownProperty === 'function' && !(keyName in this)) {
+ this.setUnknownProperty(keyName, value);
+ } else {
+ if (_features.MANDATORY_SETTER) {
+ (0, _emberMetal.defineProperty)(this, keyName, null, value); // setup mandatory setter
+ } else {
+ this[keyName] = value;
+ }
+ }
+ }
+ }
+ }
+
+ if (_emberEnvironment.ENV._ENABLE_BINDING_SUPPORT) {
+ _emberMetal.Mixin.finishPartial(this, m);
+ }
+
+ this.init.apply(this, arguments);
+
+ this[POST_INIT]();
+
+ m.proto = proto;
+ (0, _emberMetal.finishChains)(m);
+ (0, _emberMetal.sendEvent)(this, 'init', undefined, undefined, undefined, m);
+ }
+
+ Class.willReopen = function willReopen() {
+ if (wasApplied) {
+ Class.PrototypeMixin = _emberMetal.Mixin.create(Class.PrototypeMixin);
+ }
+
+ wasApplied = false;
+ };
+
+ Class._initProperties = function _initProperties(args) {
+ initProperties = args;
+ };
+
+ Class._initFactory = function _initFactory(factory) {
+ initFactory = factory;
+ };
+
+ Class.proto = function proto() {
+ var superclass = Class.superclass;
+ if (superclass) {
+ superclass.proto();
+ }
+
+ if (!wasApplied) {
+ wasApplied = true;
+ Class.PrototypeMixin.applyPartial(Class.prototype);
+ }
+
+ return this.prototype;
+ };
+
+ return Class;
+ }();
+
+ Class.toString = _emberMetal.Mixin.prototype.toString;
+
+ return Class;
+ }
+
+ var IS_DESTROYED = (0, _emberMetal.descriptor)({
+ configurable: true,
+ enumerable: false,
+
+ get: function () {
+ return (0, _emberMetal.peekMeta)(this).isSourceDestroyed();
+ },
+ set: function (value) {
+ (true && !(value === IS_DESTROYED) && (0, _emberDebug.assert)('You cannot set `' + this + '.isDestroyed` directly, please use `.destroy()`.', value === IS_DESTROYED));
+ }
+ });
+
+ var IS_DESTROYING = (0, _emberMetal.descriptor)({
+ configurable: true,
+ enumerable: false,
+
+ get: function () {
+ return (0, _emberMetal.peekMeta)(this).isSourceDestroying();
+ },
+ set: function (value) {
+ (true && !(value === IS_DESTROYING) && (0, _emberDebug.assert)('You cannot set `' + this + '.isDestroying` directly, please use `.destroy()`.', value === IS_DESTROYING));
+ }
+ });
+
+ /**
+ @class CoreObject
+ @public
+ */
+ var CoreObject = makeCtor();
+ CoreObject.toString = function () {
+ return 'Ember.CoreObject';
+ };
+ CoreObject.PrototypeMixin = _emberMetal.Mixin.create((_Mixin$create = {
+ reopen: function () {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ applyMixin(this, args, true);
+ return this;
+ },
+ init: function () {}
+ }, _Mixin$create[POST_INIT] = function () {}, _Mixin$create.__defineNonEnumerable = function (property) {
+ Object.defineProperty(this, property.name, property.descriptor);
+ //this[property.name] = property.descriptor.value;
+ }, _Mixin$create.concatenatedProperties = null, _Mixin$create.mergedProperties = null, _Mixin$create.isDestroyed = IS_DESTROYED, _Mixin$create.isDestroying = IS_DESTROYING, _Mixin$create.destroy = function () {
+ var m = (0, _emberMetal.peekMeta)(this);
+ if (m.isSourceDestroying()) {
+ return;
+ }
+
+ m.setSourceDestroying();
+
+ schedule('actions', this, this.willDestroy);
+ schedule('destroy', this, this._scheduledDestroy, m);
+
+ return this;
+ }, _Mixin$create.willDestroy = function () {}, _Mixin$create._scheduledDestroy = function (m) {
+ if (m.isSourceDestroyed()) {
+ return;
+ }
+ (0, _emberMetal.deleteMeta)(this);
+ m.setSourceDestroyed();
+ }, _Mixin$create.toString = function () {
+ var hasToStringExtension = typeof this.toStringExtension === 'function';
+ var extension = hasToStringExtension ? ':' + this.toStringExtension() : '';
+
+ var ret = '<' + (this[_emberUtils.NAME_KEY] || (0, _emberMetal.peekMeta)(this).factory || this.constructor.toString()) + ':' + (0, _emberUtils.guidFor)(this) + extension + '>';
+
+ return ret;
+ }, _Mixin$create));
+
+ CoreObject.PrototypeMixin.ownerConstructor = CoreObject;
+
+ CoreObject.__super__ = null;
+
+ var ClassMixinProps = (_ClassMixinProps = {
+
+ isClass: true,
+
+ isMethod: false
+ }, _ClassMixinProps[_emberUtils.NAME_KEY] = null, _ClassMixinProps[_emberUtils.GUID_KEY] = null, _ClassMixinProps.extend = function () {
+ var Class = makeCtor();
+ var proto = void 0;
+ Class.ClassMixin = _emberMetal.Mixin.create(this.ClassMixin);
+ Class.PrototypeMixin = _emberMetal.Mixin.create(this.PrototypeMixin);
+
+ Class.ClassMixin.ownerConstructor = Class;
+ Class.PrototypeMixin.ownerConstructor = Class;
+
+ reopen.apply(Class.PrototypeMixin, arguments);
+
+ Class.superclass = this;
+ Class.__super__ = this.prototype;
+
+ proto = Class.prototype = Object.create(this.prototype);
+ proto.constructor = Class;
+ (0, _emberUtils.generateGuid)(proto);
+ (0, _emberMetal.meta)(proto).proto = proto; // this will disable observers on prototype
+
+ Class.ClassMixin.apply(Class);
+ return Class;
+ }, _ClassMixinProps.create = function () {
+ var C = this;
+
+ for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+ args[_key2] = arguments[_key2];
+ }
+
+ if (args.length > 0) {
+ this._initProperties(args);
+ }
+ return new C();
+ }, _ClassMixinProps.reopen = function () {
+ this.willReopen();
+ reopen.apply(this.PrototypeMixin, arguments);
+ return this;
+ }, _ClassMixinProps.reopenClass = function () {
+ reopen.apply(this.ClassMixin, arguments);
+ applyMixin(this, arguments, false);
+ return this;
+ }, _ClassMixinProps.detect = function (obj) {
+ if ('function' !== typeof obj) {
+ return false;
+ }
+ while (obj) {
+ if (obj === this) {
+ return true;
+ }
+ obj = obj.superclass;
+ }
+ return false;
+ }, _ClassMixinProps.detectInstance = function (obj) {
+ return obj instanceof this;
+ }, _ClassMixinProps.metaForProperty = function (key) {
+ var proto = this.proto();
+ var possibleDesc = (0, _emberMetal.descriptorFor)(proto, key);
+
+ (true && !(possibleDesc !== undefined) && (0, _emberDebug.assert)('metaForProperty() could not find a computed property with key \'' + key + '\'.', possibleDesc !== undefined));
+
+ return possibleDesc._meta || {};
+ }, _ClassMixinProps._computedProperties = (0, _emberMetal.computed)(function () {
+ (0, _emberMetal._hasCachedComputedProperties)();
+ var proto = this.proto();
+ var possibleDesc = void 0;
+ var properties = [];
+
+ for (var name in proto) {
+ possibleDesc = (0, _emberMetal.descriptorFor)(proto, name);
+
+ if (possibleDesc !== undefined) {
+ properties.push({
+ name: name,
+ meta: possibleDesc._meta
+ });
+ }
+ }
+ return properties;
+ }).readOnly(), _ClassMixinProps.eachComputedProperty = function (callback, binding) {
+ var property = void 0;
+ var empty = {};
+
+ var properties = (0, _emberMetal.get)(this, '_computedProperties');
+
+ for (var i = 0; i < properties.length; i++) {
+ property = properties[i];
+ callback.call(binding || this, property.name, property.meta || empty);
+ }
+ }, _ClassMixinProps);
+
+ if (_emberEnvironment.ENV._ENABLE_PROPERTY_REQUIRED_SUPPORT) {
+ ClassMixinProps.ClassMixin = _emberMetal.REQUIRED;
+ ClassMixinProps.PrototypeMixin = _emberMetal.REQUIRED;
+ }
+
+ function injectedPropertyAssertion() {
+ (true && !((0, _inject.validatePropertyInjections)(this)) && (0, _emberDebug.assert)('Injected properties are invalid', (0, _inject.validatePropertyInjections)(this)));
+ }
+
+ if (true) {
+ /**
+ Provides lookup-time type validation for injected properties.
+ @private
+ @method _onLookup
+ */
+ ClassMixinProps._onLookup = injectedPropertyAssertion;
+ /**
+ Returns a hash of property names and container names that injected
+ properties will lookup on the container lazily.
+ @method _lazyInjections
+ @return {Object} Hash of all lazy injected property keys to container names
+ @private
+ */
+ ClassMixinProps._lazyInjections = function () {
+ var injections = {};
+ var proto = this.proto();
+ var key = void 0;
+ var desc = void 0;
+
+ for (key in proto) {
+ desc = (0, _emberMetal.descriptorFor)(proto, key);
+ if (desc instanceof _emberMetal.InjectedProperty) {
+ injections[key] = desc.type + ':' + (desc.name || key);
+ }
+ }
+
+ return injections;
+ };
+ }
+
+ var ClassMixin = _emberMetal.Mixin.create(ClassMixinProps);
+
+ ClassMixin.ownerConstructor = CoreObject;
+
+ CoreObject.ClassMixin = ClassMixin;
+
+ ClassMixin.apply(CoreObject);
+ exports.default = CoreObject;
+});
+enifed('ember-runtime/system/lazy_load', ['exports', 'ember-environment'], function (exports, _emberEnvironment) {
+ 'use strict';
+
+ exports._loaded = undefined;
+ exports.onLoad = onLoad;
+ exports.runLoadHooks = runLoadHooks;
+
+
+ /**
+ @module @ember/application
+ */
+
+ var loadHooks = _emberEnvironment.ENV.EMBER_LOAD_HOOKS || {}; /*globals CustomEvent */
+
+ var loaded = {};
+ var _loaded = exports._loaded = loaded;
+
+ /**
+ Detects when a specific package of Ember (e.g. 'Application')
+ has fully loaded and is available for extension.
+
+ The provided `callback` will be called with the `name` passed
+ resolved from a string into the object:
+
+ ``` javascript
+ import { onLoad } from '@ember/application';
+
+ onLoad('Ember.Application' function(hbars) {
+ hbars.registerHelper(...);
+ });
+ ```
+
+ @method onLoad
+ @static
+ @for @ember/application
+ @param name {String} name of hook
+ @param callback {Function} callback to be called
+ @private
+ */
+ function onLoad(name, callback) {
+ var object = loaded[name];
+
+ loadHooks[name] = loadHooks[name] || [];
+ loadHooks[name].push(callback);
+
+ if (object) {
+ callback(object);
+ }
+ }
+
+ /**
+ Called when an Ember.js package (e.g Application) has finished
+ loading. Triggers any callbacks registered for this event.
+
+ @method runLoadHooks
+ @static
+ @for @ember/application
+ @param name {String} name of hook
+ @param object {Object} object to pass to callbacks
+ @private
+ */
+ function runLoadHooks(name, object) {
+ loaded[name] = object;
+ var window = _emberEnvironment.environment.window;
+
+ if (window && typeof CustomEvent === 'function') {
+ var event = new CustomEvent(name, { detail: object, name: name });
+ window.dispatchEvent(event);
+ }
+
+ if (loadHooks[name]) {
+ loadHooks[name].forEach(function (callback) {
+ return callback(object);
+ });
+ }
+ }
+});
+enifed('ember-runtime/system/namespace', ['exports', 'ember-utils', 'ember-metal', 'ember-environment', 'ember-runtime/system/object'], function (exports, _emberUtils, _emberMetal, _emberEnvironment, _object) {
+ 'use strict';
+
+ exports.isSearchDisabled = isSearchDisabled;
+ exports.setSearchDisabled = setSearchDisabled;
+
+
+ var searchDisabled = false; // Preloaded into namespaces
+ /**
+ @module ember
+ */
+ function isSearchDisabled() {
+ return searchDisabled;
+ }
+
+ function setSearchDisabled(flag) {
+ searchDisabled = !!flag;
+ }
+
+ /**
+ A Namespace is an object usually used to contain other objects or methods
+ such as an application or framework. Create a namespace anytime you want
+ to define one of these new containers.
+
+ # Example Usage
+
+ ```javascript
+ MyFramework = Ember.Namespace.create({
+ VERSION: '1.0.0'
+ });
+ ```
+
+ @class Namespace
+ @namespace Ember
+ @extends EmberObject
+ @public
+ */
+ var Namespace = _object.default.extend({
+ isNamespace: true,
+
+ init: function () {
+ Namespace.NAMESPACES.push(this);
+ Namespace.PROCESSED = false;
+ },
+ toString: function () {
+ var name = (0, _emberMetal.get)(this, 'name') || (0, _emberMetal.get)(this, 'modulePrefix');
+ if (name) {
+ return name;
+ }
+
+ findNamespaces();
+ return this[_emberUtils.NAME_KEY];
+ },
+ nameClasses: function () {
+ processNamespace([this.toString()], this, {});
+ },
+ destroy: function () {
+ var namespaces = Namespace.NAMESPACES;
+ var toString = this.toString();
+
+ if (toString) {
+ _emberEnvironment.context.lookup[toString] = undefined;
+ delete Namespace.NAMESPACES_BY_ID[toString];
+ }
+ namespaces.splice(namespaces.indexOf(this), 1);
+ this._super.apply(this, arguments);
+ }
+ });
+
+ Namespace.reopenClass({
+ NAMESPACES: [_emberMetal.default],
+ NAMESPACES_BY_ID: {
+ Ember: _emberMetal.default
+ },
+ PROCESSED: false,
+ processAll: processAllNamespaces,
+ byName: function (name) {
+ if (!searchDisabled) {
+ processAllNamespaces();
+ }
+
+ return NAMESPACES_BY_ID[name];
+ }
+ });
+
+ var NAMESPACES_BY_ID = Namespace.NAMESPACES_BY_ID;
+
+ var hasOwnProp = {}.hasOwnProperty;
+
+ function processNamespace(paths, root, seen) {
+ var idx = paths.length;
+
+ NAMESPACES_BY_ID[paths.join('.')] = root;
+
+ // Loop over all of the keys in the namespace, looking for classes
+ for (var key in root) {
+ if (!hasOwnProp.call(root, key)) {
+ continue;
+ }
+ var obj = root[key];
+
+ // If we are processing the `Ember` namespace, for example, the
+ // `paths` will start with `["Ember"]`. Every iteration through
+ // the loop will update the **second** element of this list with
+ // the key, so processing `Ember.View` will make the Array
+ // `['Ember', 'View']`.
+ paths[idx] = key;
+
+ // If we have found an unprocessed class
+ if (obj && obj.toString === classToString && !obj[_emberUtils.NAME_KEY]) {
+ // Replace the class' `toString` with the dot-separated path
+ // and set its `NAME_KEY`
+ obj[_emberUtils.NAME_KEY] = paths.join('.');
+
+ // Support nested namespaces
+ } else if (obj && obj.isNamespace) {
+ // Skip aliased namespaces
+ if (seen[(0, _emberUtils.guidFor)(obj)]) {
+ continue;
+ }
+ seen[(0, _emberUtils.guidFor)(obj)] = true;
+
+ // Process the child namespace
+ processNamespace(paths, obj, seen);
+ }
+ }
+
+ paths.length = idx; // cut out last item
+ }
+
+ function isUppercase(code) {
+ return code >= 65 && // A
+ code <= 90; // Z
+ }
+
+ function tryIsNamespace(lookup, prop) {
+ try {
+ var obj = lookup[prop];
+ return obj && obj.isNamespace && obj;
+ } catch (e) {
+ // continue
+ }
+ }
+
+ function findNamespaces() {
+ if (Namespace.PROCESSED) {
+ return;
+ }
+ var lookup = _emberEnvironment.context.lookup;
+ var keys = Object.keys(lookup);
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];
+ // Only process entities that start with uppercase A-Z
+ if (!isUppercase(key.charCodeAt(0))) {
+ continue;
+ }
+ var obj = tryIsNamespace(lookup, key);
+ if (obj) {
+ obj[_emberUtils.NAME_KEY] = key;
+ }
+ }
+ }
+
+ function superClassString(mixin) {
+ var superclass = mixin.superclass;
+ if (superclass) {
+ if (superclass[_emberUtils.NAME_KEY]) {
+ return superclass[_emberUtils.NAME_KEY];
+ }
+ return superClassString(superclass);
+ }
+ }
+
+ function calculateToString(target) {
+ var str = void 0;
+
+ if (!searchDisabled) {
+ processAllNamespaces();
+ // can also be set by processAllNamespaces
+ str = target[_emberUtils.NAME_KEY];
+ if (str) {
+ return str;
+ } else {
+ str = superClassString(target);
+ str = str ? '(subclass of ' + str + ')' : str;
+ }
+ }
+ if (str) {
+ return str;
+ } else {
+ return '(unknown mixin)';
+ }
+ }
+
+ function classToString() {
+ var name = this[_emberUtils.NAME_KEY];
+ if (name) {
+ return name;
+ }
+
+ return this[_emberUtils.NAME_KEY] = calculateToString(this);
+ }
+
+ function processAllNamespaces() {
+ var unprocessedNamespaces = !Namespace.PROCESSED;
+ var unprocessedMixins = (0, _emberMetal.hasUnprocessedMixins)();
+
+ if (unprocessedNamespaces) {
+ findNamespaces();
+ Namespace.PROCESSED = true;
+ }
+
+ if (unprocessedNamespaces || unprocessedMixins) {
+ var namespaces = Namespace.NAMESPACES;
+ var namespace = void 0;
+
+ for (var i = 0; i < namespaces.length; i++) {
+ namespace = namespaces[i];
+ processNamespace([namespace.toString()], namespace, {});
+ }
+
+ (0, _emberMetal.clearUnprocessedMixins)();
+ }
+ }
+
+ _emberMetal.Mixin.prototype.toString = classToString; // ES6TODO: altering imported objects. SBB.
+
+ exports.default = Namespace;
+});
+enifed('ember-runtime/system/native_array', ['exports', 'ember-metal', 'ember-environment', 'ember-runtime/mixins/array', 'ember-runtime/mixins/mutable_array', 'ember-runtime/mixins/observable', 'ember-runtime/mixins/copyable', 'ember-debug', 'ember-runtime/copy'], function (exports, _emberMetal, _emberEnvironment, _array, _mutable_array, _observable, _copyable, _emberDebug, _copy) {
+ 'use strict';
+
+ exports.NativeArray = exports.A = undefined;
+
+ var _NativeArray;
+
+ // Add Ember.Array to Array.prototype. Remove methods with native
+ // implementations and supply some more optimized versions of generic methods
+ // because they are so common.
+
+ /**
+ The NativeArray mixin contains the properties needed to make the native
+ Array support MutableArray and all of its dependent APIs. Unless you
+ have `EmberENV.EXTEND_PROTOTYPES` or `EmberENV.EXTEND_PROTOTYPES.Array` set to
+ false, this will be applied automatically. Otherwise you can apply the mixin
+ at anytime by calling `Ember.NativeArray.apply(Array.prototype)`.
+
+ @class Ember.NativeArray
+ @uses MutableArray
+ @uses Observable
+ @uses Ember.Copyable
+ @public
+ */
+ var NativeArray = _emberMetal.Mixin.create(_mutable_array.default, _observable.default, _copyable.default, {
+ get: function (key) {
+ if ('number' === typeof key) {
+ return this[key];
+ } else {
+ return this._super(key);
+ }
+ },
+ objectAt: function (idx) {
+ return this[idx];
+ },
+ replace: function (idx, amt, objects) {
+ (true && !(objects === null || objects === undefined || Array.isArray(objects)) && (0, _emberDebug.assert)('The third argument to replace needs to be an array.', objects === null || objects === undefined || Array.isArray(objects)));
+
+
+ // if we replaced exactly the same number of items, then pass only the
+ // replaced range. Otherwise, pass the full remaining array length
+ // since everything has shifted
+ var len = objects ? (0, _emberMetal.get)(objects, 'length') : 0;
+ (0, _array.arrayContentWillChange)(this, idx, amt, len);
+
+ if (len === 0) {
+ this.splice(idx, amt);
+ } else {
+ (0, _emberMetal.replace)(this, idx, amt, objects);
+ }
+
+ (0, _array.arrayContentDidChange)(this, idx, amt, len);
+ return this;
+ },
+ unknownProperty: function (key, value) {
+ var ret = void 0; // = this.reducedProperty(key, value);
+ if (value !== undefined && ret === undefined) {
+ ret = this[key] = value;
+ }
+ return ret;
+ },
+
+
+ indexOf: Array.prototype.indexOf,
+ lastIndexOf: Array.prototype.lastIndexOf,
+
+ copy: function (deep) {
+ if (deep) {
+ return this.map(function (item) {
+ return (0, _copy.default)(item, true);
+ });
+ }
+
+ return this.slice();
+ }
+ });
+
+ // Remove any methods implemented natively so we don't override them
+ var ignore = ['length'];
+ NativeArray.keys().forEach(function (methodName) {
+ if (Array.prototype[methodName]) {
+ ignore.push(methodName);
+ }
+ });
+
+ exports.NativeArray = NativeArray = (_NativeArray = NativeArray).without.apply(_NativeArray, ignore);
+ /**
+ @module @ember/array
+ */
+ /**
+ Creates an `Ember.NativeArray` from an Array-like object.
+ Does not modify the original object's contents. `A()` is not needed if
+ `EmberENV.EXTEND_PROTOTYPES` is `true` (the default value). However,
+ it is recommended that you use `A()` when creating addons for
+ ember or when you can not guarantee that `EmberENV.EXTEND_PROTOTYPES`
+ will be `true`.
+
+ Example
+
+ ```app/components/my-component.js
+ import Component from '@ember/component';
+ import { A } from '@ember/array';
+
+ export default Component.extend({
+ tagName: 'ul',
+ classNames: ['pagination'],
+
+ init() {
+ this._super(...arguments);
+
+ if (!this.get('content')) {
+ this.set('content', A());
+ this.set('otherContent', A([1,2,3]));
+ }
+ }
+ });
+ ```
+
+ @method A
+ @static
+ @for @ember/array
+ @return {Ember.NativeArray}
+ @public
+ */
+ var A = void 0;
+
+ if (_emberEnvironment.ENV.EXTEND_PROTOTYPES.Array) {
+ NativeArray.apply(Array.prototype);
+ exports.A = A = function (arr) {
+ return arr || [];
+ };
+ } else {
+ exports.A = A = function (arr) {
+ if (!arr) {
+ arr = [];
+ }
+ return _array.default.detect(arr) ? arr : NativeArray.apply(arr);
+ };
+ }
+
+ _emberMetal.default.A = A;
+ exports.A = A;
+ exports.NativeArray = NativeArray;
+ exports.default = NativeArray;
+});
+enifed('ember-runtime/system/object', ['exports', 'ember-utils', 'ember-metal', 'ember-runtime/system/core_object', 'ember-runtime/mixins/observable', 'ember-debug'], function (exports, _emberUtils, _emberMetal, _core_object, _observable, _emberDebug) {
+ 'use strict';
+
+ exports.FrameworkObject = undefined;
+
+ var _CoreObject$extend;
+
+ var OVERRIDE_OWNER = (0, _emberUtils.symbol)('OVERRIDE_OWNER');
+
+ /**
+ `EmberObject` is the main base class for all Ember objects. It is a subclass
+ of `CoreObject` with the `Observable` mixin applied. For details,
+ see the documentation for each of these.
+
+ @class EmberObject
+ @extends CoreObject
+ @uses Observable
+ @public
+ */
+ var EmberObject = _core_object.default.extend(_observable.default, (_CoreObject$extend = {
+ _debugContainerKey: (0, _emberMetal.descriptor)({
+ enumerable: false,
+ get: function () {
+ var meta = (0, _emberMetal.peekMeta)(this);
+ var factory = meta.factory;
+
+
+ return factory && factory.fullName;
+ }
+ })
+
+ }, _CoreObject$extend[_emberUtils.OWNER] = (0, _emberMetal.descriptor)({
+ enumerable: false,
+ get: function () {
+ if (this[OVERRIDE_OWNER]) {
+ return this[OVERRIDE_OWNER];
+ }
+
+ var meta = (0, _emberMetal.peekMeta)(this);
+ var factory = meta.factory;
+
+
+ return factory && factory.owner;
+ },
+ set: function (value) {
+ this[OVERRIDE_OWNER] = value;
+ }
+ }), _CoreObject$extend));
+
+ EmberObject.toString = function () {
+ return 'Ember.Object';
+ };
+
+ var FrameworkObject = exports.FrameworkObject = EmberObject;
+
+ if (true) {
+ var _EmberObject$extend;
+
+ var INIT_WAS_CALLED = (0, _emberUtils.symbol)('INIT_WAS_CALLED');
+ var ASSERT_INIT_WAS_CALLED = (0, _emberUtils.symbol)('ASSERT_INIT_WAS_CALLED');
+
+ exports.FrameworkObject = FrameworkObject = EmberObject.extend((_EmberObject$extend = {
+ init: function () {
+ this._super.apply(this, arguments);
+ this[INIT_WAS_CALLED] = true;
+ }
+ }, _EmberObject$extend[ASSERT_INIT_WAS_CALLED] = (0, _emberMetal.on)('init', function () {
+ (true && !(this[INIT_WAS_CALLED]) && (0, _emberDebug.assert)('You must call `this._super(...arguments);` when overriding `init` on a framework object. Please update ' + this + ' to call `this._super(...arguments);` from `init`.', this[INIT_WAS_CALLED]));
+ }), _EmberObject$extend));
+ }
+
+ exports.default = EmberObject;
+});
+enifed('ember-runtime/system/object_proxy', ['exports', 'ember-runtime/system/object', 'ember-runtime/mixins/-proxy'], function (exports, _object, _proxy) {
+ 'use strict';
+
+ exports.default = _object.default.extend(_proxy.default);
+});
+enifed('ember-runtime/system/service', ['exports', 'ember-runtime/system/object', 'ember-runtime/inject'], function (exports, _object, _inject) {
+ 'use strict';
+
+ /**
+ @module @ember/service
+ @public
+ */
+
+ /**
+ Creates a property that lazily looks up a service in the container. There
+ are no restrictions as to what objects a service can be injected into.
+
+ Example:
+
+ ```app/routes/application.js
+ import Route from '@ember/routing/route';
+ import { inject as service } from '@ember/service';
+
+ export default Route.extend({
+ authManager: service('auth'),
+
+ model() {
+ return this.get('authManager').findCurrentUser();
+ }
+ });
+ ```
+
+ This example will create an `authManager` property on the application route
+ that looks up the `auth` service in the container, making it easily
+ accessible in the `model` hook.
+
+ @method inject
+ @static
+ @since 1.10.0
+ @for @ember/service
+ @param {String} name (optional) name of the service to inject, defaults to
+ the property's name
+ @return {Ember.InjectedProperty} injection descriptor instance
+ @public
+ */
+ (0, _inject.createInjectionHelper)('service');
+
+ /**
+ @class Service
+ @extends EmberObject
+ @since 1.10.0
+ @public
+ */
+ var Service = _object.default.extend();
+
+ Service.reopenClass({
+ isServiceFactory: true
+ });
+
+ exports.default = Service;
+});
+enifed('ember-runtime/system/string', ['exports', 'ember-metal', 'ember-utils', 'ember-runtime/utils', 'ember-runtime/string_registry'], function (exports, _emberMetal, _emberUtils, _utils, _string_registry) {
+ 'use strict';
+
+ exports.capitalize = exports.underscore = exports.classify = exports.camelize = exports.dasherize = exports.decamelize = exports.w = exports.loc = undefined;
+ /**
+ @module @ember/string
+ */
+ var STRING_DASHERIZE_REGEXP = /[ _]/g;
+
+ var STRING_DASHERIZE_CACHE = new _emberMetal.Cache(1000, function (key) {
+ return decamelize(key).replace(STRING_DASHERIZE_REGEXP, '-');
+ });
+
+ var STRING_CAMELIZE_REGEXP_1 = /(\-|\_|\.|\s)+(.)?/g;
+ var STRING_CAMELIZE_REGEXP_2 = /(^|\/)([A-Z])/g;
+
+ var CAMELIZE_CACHE = new _emberMetal.Cache(1000, function (key) {
+ return key.replace(STRING_CAMELIZE_REGEXP_1, function (match, separator, chr) {
+ return chr ? chr.toUpperCase() : '';
+ }).replace(STRING_CAMELIZE_REGEXP_2, function (match /*, separator, chr */) {
+ return match.toLowerCase();
+ });
+ });
+
+ var STRING_CLASSIFY_REGEXP_1 = /^(\-|_)+(.)?/;
+ var STRING_CLASSIFY_REGEXP_2 = /(.)(\-|\_|\.|\s)+(.)?/g;
+ var STRING_CLASSIFY_REGEXP_3 = /(^|\/|\.)([a-z])/g;
+
+ var CLASSIFY_CACHE = new _emberMetal.Cache(1000, function (str) {
+ var replace1 = function (match, separator, chr) {
+ return chr ? '_' + chr.toUpperCase() : '';
+ };
+ var replace2 = function (match, initialChar, separator, chr) {
+ return initialChar + (chr ? chr.toUpperCase() : '');
+ };
+ var parts = str.split('/');
+ for (var i = 0; i < parts.length; i++) {
+ parts[i] = parts[i].replace(STRING_CLASSIFY_REGEXP_1, replace1).replace(STRING_CLASSIFY_REGEXP_2, replace2);
+ }
+ return parts.join('/').replace(STRING_CLASSIFY_REGEXP_3, function (match /*, separator, chr */) {
+ return match.toUpperCase();
+ });
+ });
+
+ var STRING_UNDERSCORE_REGEXP_1 = /([a-z\d])([A-Z]+)/g;
+ var STRING_UNDERSCORE_REGEXP_2 = /\-|\s+/g;
+
+ var UNDERSCORE_CACHE = new _emberMetal.Cache(1000, function (str) {
+ return str.replace(STRING_UNDERSCORE_REGEXP_1, '$1_$2').replace(STRING_UNDERSCORE_REGEXP_2, '_').toLowerCase();
+ });
+
+ var STRING_CAPITALIZE_REGEXP = /(^|\/)([a-z\u00C0-\u024F])/g;
+
+ var CAPITALIZE_CACHE = new _emberMetal.Cache(1000, function (str) {
+ return str.replace(STRING_CAPITALIZE_REGEXP, function (match /*, separator, chr */) {
+ return match.toUpperCase();
+ });
+ });
+
+ var STRING_DECAMELIZE_REGEXP = /([a-z\d])([A-Z])/g;
+
+ var DECAMELIZE_CACHE = new _emberMetal.Cache(1000, function (str) {
+ return str.replace(STRING_DECAMELIZE_REGEXP, '$1_$2').toLowerCase();
+ });
+
+ function _fmt(str, formats) {
+ var cachedFormats = formats;
+
+ if (!(0, _utils.isArray)(cachedFormats) || arguments.length > 2) {
+ cachedFormats = new Array(arguments.length - 1);
+
+ for (var i = 1; i < arguments.length; i++) {
+ cachedFormats[i - 1] = arguments[i];
+ }
+ }
+
+ // first, replace any ORDERED replacements.
+ var idx = 0; // the current index for non-numerical replacements
+ return str.replace(/%@([0-9]+)?/g, function (s, argIndex) {
+ argIndex = argIndex ? parseInt(argIndex, 10) - 1 : idx++;
+ s = cachedFormats[argIndex];
+ return s === null ? '(null)' : s === undefined ? '' : (0, _emberUtils.inspect)(s);
+ });
+ }
+
+ function loc(str, formats) {
+ if (!(0, _utils.isArray)(formats) || arguments.length > 2) {
+ formats = Array.prototype.slice.call(arguments, 1);
+ }
+
+ str = (0, _string_registry.get)(str) || str;
+ return _fmt(str, formats);
+ }
+
+ function w(str) {
+ return str.split(/\s+/);
+ }
+
+ function decamelize(str) {
+ return DECAMELIZE_CACHE.get(str);
+ }
+
+ function dasherize(str) {
+ return STRING_DASHERIZE_CACHE.get(str);
+ }
+
+ function camelize(str) {
+ return CAMELIZE_CACHE.get(str);
+ }
+
+ function classify(str) {
+ return CLASSIFY_CACHE.get(str);
+ }
+
+ function underscore(str) {
+ return UNDERSCORE_CACHE.get(str);
+ }
+
+ function capitalize(str) {
+ return CAPITALIZE_CACHE.get(str);
+ }
+
+ /**
+ Defines string helper methods including string formatting and localization.
+ Unless `EmberENV.EXTEND_PROTOTYPES.String` is `false` these methods will also be
+ added to the `String.prototype` as well.
+
+ @class String
+ @public
+ */
+ exports.default = {
+ /**
+ Formats the passed string, but first looks up the string in the localized
+ strings hash. This is a convenient way to localize text.
+ Note that it is traditional but not required to prefix localized string
+ keys with an underscore or other character so you can easily identify
+ localized strings.
+ ```javascript
+ import { loc } from '@ember/string';
+ Ember.STRINGS = {
+ '_Hello World': 'Bonjour le monde',
+ '_Hello %@ %@': 'Bonjour %@ %@'
+ };
+ loc("_Hello World"); // 'Bonjour le monde';
+ loc("_Hello %@ %@", ["John", "Smith"]); // "Bonjour John Smith";
+ ```
+ @method loc
+ @param {String} str The string to format
+ @param {Array} formats Optional array of parameters to interpolate into string.
+ @return {String} formatted string
+ @public
+ */
+ loc: loc,
+
+ /**
+ Splits a string into separate units separated by spaces, eliminating any
+ empty strings in the process. This is a convenience method for split that
+ is mostly useful when applied to the `String.prototype`.
+ ```javascript
+ import { w } from '@ember/string';
+ w("alpha beta gamma").forEach(function(key) {
+ console.log(key);
+ });
+ // > alpha
+ // > beta
+ // > gamma
+ ```
+ @method w
+ @param {String} str The string to split
+ @return {Array} array containing the split strings
+ @public
+ */
+ w: w,
+
+ /**
+ Converts a camelized string into all lower case separated by underscores.
+ ```javascript
+ 'innerHTML'.decamelize(); // 'inner_html'
+ 'action_name'.decamelize(); // 'action_name'
+ 'css-class-name'.decamelize(); // 'css-class-name'
+ 'my favorite items'.decamelize(); // 'my favorite items'
+ ```
+ @method decamelize
+ @param {String} str The string to decamelize.
+ @return {String} the decamelized string.
+ @public
+ */
+ decamelize: decamelize,
+
+ /**
+ Replaces underscores, spaces, or camelCase with dashes.
+ ```javascript
+ 'innerHTML'.dasherize(); // 'inner-html'
+ 'action_name'.dasherize(); // 'action-name'
+ 'css-class-name'.dasherize(); // 'css-class-name'
+ 'my favorite items'.dasherize(); // 'my-favorite-items'
+ 'privateDocs/ownerInvoice'.dasherize(); // 'private-docs/owner-invoice'
+ ```
+ @method dasherize
+ @param {String} str The string to dasherize.
+ @return {String} the dasherized string.
+ @public
+ */
+ dasherize: dasherize,
+
+ /**
+ Returns the lowerCamelCase form of a string.
+ ```javascript
+ 'innerHTML'.camelize(); // 'innerHTML'
+ 'action_name'.camelize(); // 'actionName'
+ 'css-class-name'.camelize(); // 'cssClassName'
+ 'my favorite items'.camelize(); // 'myFavoriteItems'
+ 'My Favorite Items'.camelize(); // 'myFavoriteItems'
+ 'private-docs/owner-invoice'.camelize(); // 'privateDocs/ownerInvoice'
+ ```
+ @method camelize
+ @param {String} str The string to camelize.
+ @return {String} the camelized string.
+ @public
+ */
+ camelize: camelize,
+
+ /**
+ Returns the UpperCamelCase form of a string.
+ ```javascript
+ 'innerHTML'.classify(); // 'InnerHTML'
+ 'action_name'.classify(); // 'ActionName'
+ 'css-class-name'.classify(); // 'CssClassName'
+ 'my favorite items'.classify(); // 'MyFavoriteItems'
+ 'private-docs/owner-invoice'.classify(); // 'PrivateDocs/OwnerInvoice'
+ ```
+ @method classify
+ @param {String} str the string to classify
+ @return {String} the classified string
+ @public
+ */
+ classify: classify,
+
+ /**
+ More general than decamelize. Returns the lower\_case\_and\_underscored
+ form of a string.
+ ```javascript
+ 'innerHTML'.underscore(); // 'inner_html'
+ 'action_name'.underscore(); // 'action_name'
+ 'css-class-name'.underscore(); // 'css_class_name'
+ 'my favorite items'.underscore(); // 'my_favorite_items'
+ 'privateDocs/ownerInvoice'.underscore(); // 'private_docs/owner_invoice'
+ ```
+ @method underscore
+ @param {String} str The string to underscore.
+ @return {String} the underscored string.
+ @public
+ */
+ underscore: underscore,
+
+ /**
+ Returns the Capitalized form of a string
+ ```javascript
+ 'innerHTML'.capitalize() // 'InnerHTML'
+ 'action_name'.capitalize() // 'Action_name'
+ 'css-class-name'.capitalize() // 'Css-class-name'
+ 'my favorite items'.capitalize() // 'My favorite items'
+ 'privateDocs/ownerInvoice'.capitalize(); // 'PrivateDocs/ownerInvoice'
+ ```
+ @method capitalize
+ @param {String} str The string to capitalize.
+ @return {String} The capitalized string.
+ @public
+ */
+ capitalize: capitalize
+ };
+ exports.loc = loc;
+ exports.w = w;
+ exports.decamelize = decamelize;
+ exports.dasherize = dasherize;
+ exports.camelize = camelize;
+ exports.classify = classify;
+ exports.underscore = underscore;
+ exports.capitalize = capitalize;
+});
+enifed('ember-runtime/utils', ['exports', 'ember-runtime/mixins/array', 'ember-runtime/system/object'], function (exports, _array, _object) {
+ 'use strict';
+
+ exports.isArray = isArray;
+ exports.typeOf = typeOf;
+
+
+ // ........................................
+ // TYPING & ARRAY MESSAGING
+ //
+ var TYPE_MAP = {
+ '[object Boolean]': 'boolean',
+ '[object Number]': 'number',
+ '[object String]': 'string',
+ '[object Function]': 'function',
+ '[object Array]': 'array',
+ '[object Date]': 'date',
+ '[object RegExp]': 'regexp',
+ '[object Object]': 'object',
+ '[object FileList]': 'filelist'
+ };
+
+ var toString = Object.prototype.toString;
+
+ /**
+ @module @ember/array
+ */
+ /**
+ Returns true if the passed object is an array or Array-like.
+
+ Objects are considered Array-like if any of the following are true:
+
+ - the object is a native Array
+ - the object has an objectAt property
+ - the object is an Object, and has a length property
+
+ Unlike `typeOf` this method returns true even if the passed object is
+ not formally an array but appears to be array-like (i.e. implements `Array`)
+
+ ```javascript
+ import { isArray } from '@ember/array';
+ import ArrayProxy from '@ember/array/proxy';
+
+ isArray(); // false
+ isArray([]); // true
+ isArray(ArrayProxy.create({ content: [] })); // true
+ ```
+
+ @method isArray
+ @static
+ @for @ember/array
+ @param {Object} obj The object to test
+ @return {Boolean} true if the passed object is an array or Array-like
+ @public
+ */
+ function isArray(obj) {
+ if (!obj || obj.setInterval) {
+ return false;
+ }
+ if (Array.isArray(obj)) {
+ return true;
+ }
+ if (_array.default.detect(obj)) {
+ return true;
+ }
+
+ var type = typeOf(obj);
+ if ('array' === type) {
+ return true;
+ }
+ var length = obj.length;
+ if (typeof length === 'number' && length === length && 'object' === type) {
+ return true;
+ }
+ return false;
+ }
+ /**
+ @module @ember/utils
+ */
+ /**
+ Returns a consistent type for the passed object.
+
+ Use this instead of the built-in `typeof` to get the type of an item.
+ It will return the same result across all browsers and includes a bit
+ more detail. Here is what will be returned:
+
+ | Return Value | Meaning |
+ |---------------|------------------------------------------------------|
+ | 'string' | String primitive or String object. |
+ | 'number' | Number primitive or Number object. |
+ | 'boolean' | Boolean primitive or Boolean object. |
+ | 'null' | Null value |
+ | 'undefined' | Undefined value |
+ | 'function' | A function |
+ | 'array' | An instance of Array |
+ | 'regexp' | An instance of RegExp |
+ | 'date' | An instance of Date |
+ | 'filelist' | An instance of FileList |
+ | 'class' | An Ember class (created using EmberObject.extend()) |
+ | 'instance' | An Ember object instance |
+ | 'error' | An instance of the Error object |
+ | 'object' | A JavaScript object not inheriting from EmberObject |
+
+ Examples:
+
+ ```javascript
+ import { A } from '@ember/array';
+ import { typeOf } from '@ember/utils';
+ import EmberObject from '@ember/object';
+
+ typeOf(); // 'undefined'
+ typeOf(null); // 'null'
+ typeOf(undefined); // 'undefined'
+ typeOf('michael'); // 'string'
+ typeOf(new String('michael')); // 'string'
+ typeOf(101); // 'number'
+ typeOf(new Number(101)); // 'number'
+ typeOf(true); // 'boolean'
+ typeOf(new Boolean(true)); // 'boolean'
+ typeOf(A); // 'function'
+ typeOf([1, 2, 90]); // 'array'
+ typeOf(/abc/); // 'regexp'
+ typeOf(new Date()); // 'date'
+ typeOf(event.target.files); // 'filelist'
+ typeOf(EmberObject.extend()); // 'class'
+ typeOf(EmberObject.create()); // 'instance'
+ typeOf(new Error('teamocil')); // 'error'
+
+ // 'normal' JavaScript object
+ typeOf({ a: 'b' }); // 'object'
+ ```
+
+ @method typeOf
+ @for @ember/utils
+ @param {Object} item the item to check
+ @return {String} the type
+ @public
+ @static
+ */
+ function typeOf(item) {
+ if (item === null) {
+ return 'null';
+ }
+ if (item === undefined) {
+ return 'undefined';
+ }
+ var ret = TYPE_MAP[toString.call(item)] || 'object';
+
+ if (ret === 'function') {
+ if (_object.default.detect(item)) {
+ ret = 'class';
+ }
+ } else if (ret === 'object') {
+ if (item instanceof Error) {
+ ret = 'error';
+ } else if (item instanceof _object.default) {
+ ret = 'instance';
+ } else if (item instanceof Date) {
+ ret = 'date';
+ }
+ }
+
+ return ret;
+ }
+});
+enifed('ember-template-compiler/compat', ['ember-metal', 'ember-template-compiler/system/precompile', 'ember-template-compiler/system/compile', 'ember-template-compiler/system/compile-options'], function (_emberMetal, _precompile, _compile, _compileOptions) {
+ 'use strict';
+
+ var EmberHandlebars = _emberMetal.default.Handlebars = _emberMetal.default.Handlebars || {}; // reexports
+
+ var EmberHTMLBars = _emberMetal.default.HTMLBars = _emberMetal.default.HTMLBars || {};
+
+ EmberHTMLBars.precompile = EmberHandlebars.precompile = _precompile.default;
+ EmberHTMLBars.compile = EmberHandlebars.compile = _compile.default;
+ EmberHTMLBars.registerPlugin = _compileOptions.registerPlugin;
+});
+enifed('ember-template-compiler/index', ['exports', 'ember-template-compiler/system/precompile', 'ember-template-compiler/system/compile', 'ember-template-compiler/system/compile-options', 'ember-template-compiler/plugins', 'ember-metal', 'ember/features', 'ember-environment', 'ember/version', 'ember-template-compiler/compat', 'ember-template-compiler/system/bootstrap'], function (exports, _precompile, _compile, _compileOptions, _plugins, _emberMetal, _features, _emberEnvironment, _version) {
+ 'use strict';
+
+ exports.defaultPlugins = exports.unregisterPlugin = exports.registerPlugin = exports.compileOptions = exports.compile = exports.precompile = exports._Ember = undefined;
+ Object.defineProperty(exports, 'precompile', {
+ enumerable: true,
+ get: function () {
+ return _precompile.default;
+ }
+ });
+ Object.defineProperty(exports, 'compile', {
+ enumerable: true,
+ get: function () {
+ return _compile.default;
+ }
+ });
+ Object.defineProperty(exports, 'compileOptions', {
+ enumerable: true,
+ get: function () {
+ return _compileOptions.default;
+ }
+ });
+ Object.defineProperty(exports, 'registerPlugin', {
+ enumerable: true,
+ get: function () {
+ return _compileOptions.registerPlugin;
+ }
+ });
+ Object.defineProperty(exports, 'unregisterPlugin', {
+ enumerable: true,
+ get: function () {
+ return _compileOptions.unregisterPlugin;
+ }
+ });
+ Object.defineProperty(exports, 'defaultPlugins', {
+ enumerable: true,
+ get: function () {
+ return _plugins.default;
+ }
+ });
+
+
+ // private API used by ember-cli-htmlbars to setup ENV and FEATURES
+ if (!_emberMetal.default.ENV) {
+ _emberMetal.default.ENV = _emberEnvironment.ENV;
+ }
+ if (!_emberMetal.default.FEATURES) {
+ _emberMetal.default.FEATURES = _features.FEATURES;
+ }
+ if (!_emberMetal.default.VERSION) {
+ _emberMetal.default.VERSION = _version.default;
+ }
+
+ exports._Ember = _emberMetal.default;
+});
+enifed('ember-template-compiler/plugins/assert-input-helper-without-block', ['exports', 'ember-debug', 'ember-template-compiler/system/calculate-location-display'], function (exports, _emberDebug, _calculateLocationDisplay) {
+ 'use strict';
+
+ exports.default = errorOnInputWithContent;
+ function errorOnInputWithContent(env) {
+ var moduleName = env.meta.moduleName;
+
+
+ return {
+ name: 'assert-input-helper-without-block',
+
+ visitors: {
+ BlockStatement: function (node) {
+ if (node.path.original !== 'input') {
+ return;
+ }
+
+ (true && !(false) && (0, _emberDebug.assert)(assertMessage(moduleName, node)));
+ }
+ }
+ };
+ }
+
+ function assertMessage(moduleName, node) {
+ var sourceInformation = (0, _calculateLocationDisplay.default)(moduleName, node.loc);
+
+ return 'The {{input}} helper cannot be used in block form. ' + sourceInformation;
+ }
+});
+enifed('ember-template-compiler/plugins/assert-reserved-named-arguments', ['exports', 'ember-debug', 'ember/features', 'ember-template-compiler/system/calculate-location-display'], function (exports, _emberDebug, _features, _calculateLocationDisplay) {
+ 'use strict';
+
+ exports.default = assertReservedNamedArguments;
+
+
+ var RESERVED = ['@arguments', '@args'];
+
+ var isReserved = void 0,
+ assertMessage = void 0;
+
+ function assertReservedNamedArguments(env) {
+ var moduleName = env.meta.moduleName;
+
+
+ return {
+ name: 'assert-reserved-named-arguments',
+
+ visitors: {
+ PathExpression: function (_ref) {
+ var original = _ref.original,
+ loc = _ref.loc;
+
+ if (isReserved(original)) {
+ (true && !(false) && (0, _emberDebug.assert)(assertMessage(original) + ' ' + (0, _calculateLocationDisplay.default)(moduleName, loc)));
+ }
+ }
+ }
+ };
+ }
+
+ if (_features.EMBER_GLIMMER_NAMED_ARGUMENTS) {
+ isReserved = function (name) {
+ return RESERVED.indexOf(name) !== -1 || name.match(/^@[^a-z]/);
+ };
+ assertMessage = function (name) {
+ return '\'' + name + '\' is reserved.';
+ };
+ } else {
+ isReserved = function (name) {
+ return name[0] === '@';
+ };
+ assertMessage = function (name) {
+ return '\'' + name + '\' is not a valid path.';
+ };
+ }
+});
+enifed('ember-template-compiler/plugins/deprecate-render-model', ['exports', 'ember-debug', 'ember-template-compiler/system/calculate-location-display'], function (exports, _emberDebug, _calculateLocationDisplay) {
+ 'use strict';
+
+ exports.default = deprecateRenderModel;
+
+
+ /*
+ * Remove after 3.4 once _ENABLE_RENDER_SUPPORT flag is no
+ * longer needed.
+ */
+ function deprecateRenderModel(env) {
+ var moduleName = env.meta.moduleName;
+
+
+ return {
+ name: 'deprecate-render-model',
+
+ visitors: {
+ MustacheStatement: function (node) {
+ if (node.path.original === 'render' && node.params.length > 1) {
+ node.params.forEach(function (param) {
+ if (param.type !== 'PathExpression') {
+ return;
+ }
+
+ (true && !(false) && (0, _emberDebug.deprecate)(deprecationMessage(moduleName, node, param), false, {
+ id: 'ember-template-compiler.deprecate-render-model',
+ until: '3.0.0',
+ url: 'https://emberjs.com/deprecations/v2.x#toc_model-param-in-code-render-code-helper'
+ }));
+ });
+ }
+ }
+ }
+ };
+ }
+
+ function deprecationMessage(moduleName, node, param) {
+ var sourceInformation = (0, _calculateLocationDisplay.default)(moduleName, node.loc);
+ var componentName = node.params[0].original;
+ var modelName = param.original;
+ var original = '{{render "' + componentName + '" ' + modelName + '}}';
+ var preferred = '{{' + componentName + ' model=' + modelName + '}}';
+
+ return 'Please refactor `' + original + '` to a component and invoke via' + (' `' + preferred + '`. ' + sourceInformation);
+ }
+});
+enifed('ember-template-compiler/plugins/deprecate-render', ['exports', 'ember-debug', 'ember-template-compiler/system/calculate-location-display'], function (exports, _emberDebug, _calculateLocationDisplay) {
+ 'use strict';
+
+ exports.default = deprecateRender;
+
+
+ /*
+ * Remove after 3.4 once _ENABLE_RENDER_SUPPORT flag is no
+ * longer needed.
+ */
+ function deprecateRender(env) {
+ var moduleName = env.meta.moduleName;
+
+
+ return {
+ name: 'deprecate-render',
+
+ visitors: {
+ MustacheStatement: function (node) {
+ if (node.path.original !== 'render') {
+ return;
+ }
+ if (node.params.length !== 1) {
+ return;
+ }
+
+ each(node.params, function (param) {
+ if (param.type !== 'StringLiteral') {
+ return;
+ }
+
+ (true && !(false) && (0, _emberDebug.deprecate)(deprecationMessage(moduleName, node), false, {
+ id: 'ember-template-compiler.deprecate-render',
+ until: '3.0.0',
+ url: 'https://emberjs.com/deprecations/v2.x#toc_code-render-code-helper'
+ }));
+ });
+ }
+ }
+ };
+ }
+
+ function each(list, callback) {
+ for (var i = 0, l = list.length; i < l; i++) {
+ callback(list[i]);
+ }
+ }
+
+ function deprecationMessage(moduleName, node) {
+ var sourceInformation = (0, _calculateLocationDisplay.default)(moduleName, node.loc);
+ var componentName = node.params[0].original;
+ var original = '{{render "' + componentName + '"}}';
+ var preferred = '{{' + componentName + '}}';
+
+ return 'Please refactor `' + original + '` to a component and invoke via' + (' `' + preferred + '`. ' + sourceInformation);
+ }
+});
+enifed('ember-template-compiler/plugins/extract-pragma-tag', ['exports'], function (exports) {
+ 'use strict';
+
+ exports.default = extractPragmaTag;
+ var PRAGMA_TAG = 'use-component-manager';
+
+ function extractPragmaTag(env) {
+ var meta = env.meta;
+
+
+ return {
+ name: 'exract-pragma-tag',
+
+ visitors: {
+ MustacheStatement: {
+ enter: function (node) {
+ if (node.path.type === 'PathExpression' && node.path.original === PRAGMA_TAG) {
+ meta.managerId = node.params[0].value;
+ return null;
+ }
+ }
+ }
+ }
+ };
+ }
+});
+enifed('ember-template-compiler/plugins/index', ['exports', 'ember-template-compiler/plugins/transform-old-binding-syntax', 'ember-template-compiler/plugins/transform-angle-bracket-components', 'ember-template-compiler/plugins/transform-top-level-components', 'ember-template-compiler/plugins/transform-inline-link-to', 'ember-template-compiler/plugins/transform-old-class-binding-syntax', 'ember-template-compiler/plugins/transform-quoted-bindings-into-just-bindings', 'ember-template-compiler/plugins/deprecate-render-model', 'ember-template-compiler/plugins/deprecate-render', 'ember-template-compiler/plugins/assert-reserved-named-arguments', 'ember-template-compiler/plugins/transform-action-syntax', 'ember-template-compiler/plugins/transform-input-type-syntax', 'ember-template-compiler/plugins/transform-attrs-into-args', 'ember-template-compiler/plugins/transform-each-in-into-each', 'ember-template-compiler/plugins/transform-has-block-syntax', 'ember-template-compiler/plugins/transform-dot-component-invocation', 'ember-template-compiler/plugins/extract-pragma-tag', 'ember-template-compiler/plugins/assert-input-helper-without-block', 'ember/features'], function (exports, _transformOldBindingSyntax, _transformAngleBracketComponents, _transformTopLevelComponents, _transformInlineLinkTo, _transformOldClassBindingSyntax, _transformQuotedBindingsIntoJustBindings, _deprecateRenderModel, _deprecateRender, _assertReservedNamedArguments, _transformActionSyntax, _transformInputTypeSyntax, _transformAttrsIntoArgs, _transformEachInIntoEach, _transformHasBlockSyntax, _transformDotComponentInvocation, _extractPragmaTag, _assertInputHelperWithoutBlock, _features) {
+ 'use strict';
+
+ var transforms = [_transformDotComponentInvocation.default, _transformOldBindingSyntax.default, _transformAngleBracketComponents.default, _transformTopLevelComponents.default, _transformInlineLinkTo.default, _transformOldClassBindingSyntax.default, _transformQuotedBindingsIntoJustBindings.default, _deprecateRenderModel.default, _deprecateRender.default, _assertReservedNamedArguments.default, _transformActionSyntax.default, _transformInputTypeSyntax.default, _transformAttrsIntoArgs.default, _transformEachInIntoEach.default, _transformHasBlockSyntax.default, _assertInputHelperWithoutBlock.default];
+
+ if (_features.GLIMMER_CUSTOM_COMPONENT_MANAGER) {
+ transforms.push(_extractPragmaTag.default);
+ }
+
+ exports.default = Object.freeze(transforms);
+});
+enifed('ember-template-compiler/plugins/transform-action-syntax', ['exports'], function (exports) {
+ 'use strict';
+
+ exports.default = transformActionSyntax;
+ /**
+ @module ember
+ */
+
+ /**
+ A Glimmer2 AST transformation that replaces all instances of
+
+ ```handlebars
+ <button {{action 'foo'}}>
+ <button onblur={{action 'foo'}}>
+ <button onblur={{action (action 'foo') 'bar'}}>
+ ```
+
+ with
+
+ ```handlebars
+ <button {{action this 'foo'}}>
+ <button onblur={{action this 'foo'}}>
+ <button onblur={{action this (action this 'foo') 'bar'}}>
+ ```
+
+ @private
+ @class TransformActionSyntax
+ */
+
+ function transformActionSyntax(_ref) {
+ var syntax = _ref.syntax;
+ var b = syntax.builders;
+
+
+ return {
+ name: 'transform-action-syntax',
+
+ visitors: {
+ ElementModifierStatement: function (node) {
+ if (isAction(node)) {
+ insertThisAsFirstParam(node, b);
+ }
+ },
+ MustacheStatement: function (node) {
+ if (isAction(node)) {
+ insertThisAsFirstParam(node, b);
+ }
+ },
+ SubExpression: function (node) {
+ if (isAction(node)) {
+ insertThisAsFirstParam(node, b);
+ }
+ }
+ }
+ };
+ }
+
+ function isAction(node) {
+ return node.path.original === 'action';
+ }
+
+ function insertThisAsFirstParam(node, builders) {
+ node.params.unshift(builders.path('this'));
+ }
+});
+enifed('ember-template-compiler/plugins/transform-angle-bracket-components', ['exports'], function (exports) {
+ 'use strict';
+
+ exports.default = transformAngleBracketComponents;
+ function transformAngleBracketComponents() /* env */{
+ return {
+ name: 'transform-angle-bracket-components',
+
+ visitors: {
+ ComponentNode: function (node) {
+ node.tag = '<' + node.tag + '>';
+ }
+ }
+ };
+ }
+});
+enifed('ember-template-compiler/plugins/transform-attrs-into-args', ['exports'], function (exports) {
+ 'use strict';
+
+ exports.default = transformAttrsIntoArgs;
+ /**
+ @module ember
+ */
+
+ /**
+ A Glimmer2 AST transformation that replaces all instances of
+
+ ```handlebars
+ {{attrs.foo.bar}}
+ ```
+
+ to
+
+ ```handlebars
+ {{@foo.bar}}
+ ```
+
+ as well as `{{#if attrs.foo}}`, `{{deeply (nested attrs.foobar.baz)}}`,
+ `{{this.attrs.foo}}` etc
+
+ @private
+ @class TransformAttrsToProps
+ */
+
+ function transformAttrsIntoArgs(env) {
+ var b = env.syntax.builders;
+
+
+ var stack = [[]];
+
+ return {
+ name: 'transform-attrs-into-args',
+
+ visitors: {
+ Program: {
+ enter: function (node) {
+ var parent = stack[stack.length - 1];
+ stack.push(parent.concat(node.blockParams));
+ },
+ exit: function () {
+ stack.pop();
+ }
+ },
+
+ PathExpression: function (node) {
+ if (isAttrs(node, stack[stack.length - 1])) {
+ var path = b.path(node.original.substr(6));
+ path.original = '@' + path.original;
+ path.data = true;
+ return path;
+ }
+ }
+ }
+ };
+ }
+
+ function isAttrs(node, symbols) {
+ var name = node.parts[0];
+
+ if (symbols.indexOf(name) !== -1) {
+ return false;
+ }
+
+ if (name === 'attrs') {
+ if (node.this === true) {
+ node.parts.shift();
+ node.original = node.original.slice(5);
+ }
+
+ return true;
+ }
+
+ return false;
+ }
+});
+enifed('ember-template-compiler/plugins/transform-dot-component-invocation', ['exports'], function (exports) {
+ 'use strict';
+
+ exports.default = transformDotComponentInvocation;
+
+ /**
+ Transforms dot invocation of closure components to be wrapped
+ with the component helper. This allows for a more static invocation
+ of the component.
+
+ ```handlebars
+ {{#my-component as |comps|}}
+ {{comp.dropdown isOpen=false}}
+ {{/my-component}}
+ ```
+
+ with
+
+ ```handlebars
+ {{#my-component as |comps|}}
+ {{component comp.dropdown isOpen=false}}
+ {{/my-component}}
+ ```
+ and
+
+ ```handlebars
+ {{#my-component as |comps|}}
+ {{comp.dropdown isOpen}}
+ {{/my-component}}
+ ```
+
+ with
+
+ ```handlebars
+ {{#my-component as |comps|}}
+ {{component comp.dropdown isOpen}}
+ {{/my-component}}
+ ```
+
+ and
+
+ ```handlebars
+ {{#my-component as |comps|}}
+ {{#comp.dropdown}}Open{{/comp.dropdown}}
+ {{/my-component}}
+ ```
+
+ with
+
+ ```handlebars
+ {{#my-component as |comps|}}
+ {{#component comp.dropdown}}Open{{/component}}
+ {{/my-component}}
+ ```
+
+ @private
+ @class TransFormDotComponentInvocation
+ */
+ function transformDotComponentInvocation(env) {
+ var b = env.syntax.builders;
+
+
+ return {
+ name: 'transform-dot-component-invocation',
+
+ visitors: {
+ MustacheStatement: function (node) {
+ if (isInlineInvocation(node.path, node.params, node.hash)) {
+ wrapInComponent(node, b);
+ }
+ },
+ BlockStatement: function (node) {
+ if (isMultipartPath(node.path)) {
+ wrapInComponent(node, b);
+ }
+ }
+ }
+ };
+ }
+
+ function isMultipartPath(path) {
+ return path.parts && path.parts.length > 1;
+ }
+
+ function isInlineInvocation(path, params, hash) {
+ if (isMultipartPath(path)) {
+ if (params.length > 0 || hash.pairs.length > 0) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ function wrapInComponent(node, builder) {
+ var component = node.path;
+ var componentHelper = builder.path('component');
+ node.path = componentHelper;
+ node.params.unshift(component);
+ }
+});
+enifed('ember-template-compiler/plugins/transform-each-in-into-each', ['exports'], function (exports) {
+ 'use strict';
+
+ exports.default = transformEachInIntoEach;
+ /**
+ @module ember
+ */
+
+ /**
+ A Glimmer2 AST transformation that replaces all instances of
+
+ ```handlebars
+ {{#each-in iterableThing as |key value|}}
+ ```
+
+ with
+
+ ```handlebars
+ {{#each (-each-in iterableThing) as |key value|}}
+ ```
+
+ @private
+ @class TransformHasBlockSyntax
+ */
+ function transformEachInIntoEach(env) {
+ var b = env.syntax.builders;
+
+
+ return {
+ name: 'transform-each-in-into-each',
+
+ visitors: {
+ BlockStatement: function (node) {
+ if (node.path.original === 'each-in') {
+ node.params[0] = b.sexpr(b.path('-each-in'), [node.params[0]]);
+ return b.block(b.path('each'), node.params, node.hash, node.program, node.inverse, node.loc);
+ }
+ }
+ }
+ };
+ }
+});
+enifed('ember-template-compiler/plugins/transform-has-block-syntax', ['exports'], function (exports) {
+ 'use strict';
+
+ exports.default = transformHasBlockSyntax;
+ /**
+ @module ember
+ */
+
+ /**
+ A Glimmer2 AST transformation that replaces all instances of
+
+ ```handlebars
+ {{hasBlock}}
+ ```
+
+ with
+
+ ```handlebars
+ {{has-block}}
+ ```
+
+ @private
+ @class TransformHasBlockSyntax
+ */
+
+ var TRANSFORMATIONS = {
+ hasBlock: 'has-block',
+ hasBlockParams: 'has-block-params'
+ };
+
+ function transformHasBlockSyntax(env) {
+ var b = env.syntax.builders;
+
+
+ return {
+ name: 'transform-has-block-syntax',
+
+ visitors: {
+ PathExpression: function (node) {
+ if (TRANSFORMATIONS[node.original]) {
+ return b.sexpr(b.path(TRANSFORMATIONS[node.original]));
+ }
+ },
+ MustacheStatement: function (node) {
+ if (TRANSFORMATIONS[node.path.original]) {
+ return b.mustache(b.path(TRANSFORMATIONS[node.path.original]), node.params, node.hash, null, node.loc);
+ }
+ },
+ SubExpression: function (node) {
+ if (TRANSFORMATIONS[node.path.original]) {
+ return b.sexpr(b.path(TRANSFORMATIONS[node.path.original]), node.params, node.hash);
+ }
+ }
+ }
+ };
+ }
+});
+enifed('ember-template-compiler/plugins/transform-inline-link-to', ['exports'], function (exports) {
+ 'use strict';
+
+ exports.default = transformInlineLinkTo;
+ function buildProgram(b, content, loc) {
+ return b.program([buildStatement(b, content, loc)], null, loc);
+ }
+
+ function buildStatement(b, content, loc) {
+ switch (content.type) {
+ case 'PathExpression':
+ return b.mustache(content, null, null, null, loc);
+
+ case 'SubExpression':
+ return b.mustache(content.path, content.params, content.hash, null, loc);
+
+ // The default case handles literals.
+ default:
+ return b.text('' + content.value, loc);
+ }
+ }
+
+ function unsafeHtml(b, expr) {
+ return b.sexpr('-html-safe', [expr]);
+ }
+
+ function transformInlineLinkTo(env) {
+ var b = env.syntax.builders;
+
+
+ return {
+ name: 'transform-inline-link-to',
+
+ visitors: {
+ MustacheStatement: function (node) {
+ if (node.path.original === 'link-to') {
+ var content = node.escaped ? node.params[0] : unsafeHtml(b, node.params[0]);
+ return b.block('link-to', node.params.slice(1), node.hash, buildProgram(b, content, node.loc), null, node.loc);
+ }
+ }
+ }
+ };
+ }
+});
+enifed('ember-template-compiler/plugins/transform-input-type-syntax', ['exports'], function (exports) {
+ 'use strict';
+
+ exports.default = transformInputTypeSyntax;
+ /**
+ @module ember
+ */
+
+ /**
+ A Glimmer2 AST transformation that replaces all instances of
+
+ ```handlebars
+ {{input type=boundType}}
+ ```
+
+ with
+
+ ```handlebars
+ {{input (-input-type boundType) type=boundType}}
+ ```
+
+ Note that the type parameters is not removed as the -input-type helpers
+ is only used to select the component class. The component still needs
+ the type parameter to function.
+
+ @private
+ @class TransformInputTypeSyntax
+ */
+
+ function transformInputTypeSyntax(env) {
+ var b = env.syntax.builders;
+
+ return {
+ name: 'transform-input-type-syntax',
+
+ visitors: {
+ MustacheStatement: function (node) {
+ if (isInput(node)) {
+ insertTypeHelperParameter(node, b);
+ }
+ }
+ }
+ };
+ }
+
+ function isInput(node) {
+ return node.path.original === 'input';
+ }
+
+ function insertTypeHelperParameter(node, builders) {
+ var pairs = node.hash.pairs;
+ var pair = null;
+ for (var i = 0; i < pairs.length; i++) {
+ if (pairs[i].key === 'type') {
+ pair = pairs[i];
+ break;
+ }
+ }
+ if (pair && pair.value.type !== 'StringLiteral') {
+ node.params.unshift(builders.sexpr('-input-type', [pair.value], null, pair.loc));
+ }
+ }
+});
+enifed('ember-template-compiler/plugins/transform-old-binding-syntax', ['exports', 'ember-debug', 'ember-template-compiler/system/calculate-location-display'], function (exports, _emberDebug, _calculateLocationDisplay) {
+ 'use strict';
+
+ exports.default = transformOldBindingSyntax;
+ function transformOldBindingSyntax(env) {
+ var moduleName = env.meta.moduleName;
+
+ var b = env.syntax.builders;
+
+ return {
+ name: 'transform-old-binding-syntax',
+
+ visitors: {
+ BlockStatement: function (node) {
+ processHash(b, node, moduleName);
+ },
+ MustacheStatement: function (node) {
+ processHash(b, node, moduleName);
+ }
+ }
+ };
+ }
+
+ function processHash(b, node, moduleName) {
+ for (var i = 0; i < node.hash.pairs.length; i++) {
+ var pair = node.hash.pairs[i];
+ var key = pair.key,
+ value = pair.value;
+
+
+ var sourceInformation = (0, _calculateLocationDisplay.default)(moduleName, pair.loc);
+
+ if (key === 'classBinding') {
+ return;
+ }
+
+ (true && !(key !== 'attributeBindings') && (0, _emberDebug.assert)('Setting \'attributeBindings\' via template helpers is not allowed ' + sourceInformation, key !== 'attributeBindings'));
+
+
+ if (key.substr(-7) === 'Binding') {
+ var newKey = key.slice(0, -7);
+
+ (true && !(false) && (0, _emberDebug.deprecate)('You\'re using legacy binding syntax: ' + key + '=' + exprToString(value) + ' ' + sourceInformation + '. Please replace with ' + newKey + '=' + value.original, false, { id: 'ember-template-compiler.transform-old-binding-syntax', until: '3.0.0' }));
+
+
+ pair.key = newKey;
+ if (value.type === 'StringLiteral') {
+ pair.value = b.path(value.original);
+ }
+ }
+ }
+ }
+
+ function exprToString(expr) {
+ switch (expr.type) {
+ case 'StringLiteral':
+ return '"' + expr.original + '"';
+ case 'PathExpression':
+ return expr.original;
+ }
+ }
+});
+enifed('ember-template-compiler/plugins/transform-old-class-binding-syntax', ['exports'], function (exports) {
+ 'use strict';
+
+ exports.default = transformOldClassBindingSyntax;
+ function transformOldClassBindingSyntax(env) {
+ var b = env.syntax.builders;
+
+ return {
+ name: 'transform-old-class-binding-syntax',
+
+ visitors: {
+ MustacheStatement: function (node) {
+ process(b, node);
+ },
+ BlockStatement: function (node) {
+ process(b, node);
+ }
+ }
+ };
+ }
+
+ function process(b, node) {
+ var allOfTheMicrosyntaxes = [];
+ var allOfTheMicrosyntaxIndexes = [];
+ var classPair = void 0;
+
+ each(node.hash.pairs, function (pair, index) {
+ var key = pair.key;
+
+
+ if (key === 'classBinding' || key === 'classNameBindings') {
+ allOfTheMicrosyntaxIndexes.push(index);
+ allOfTheMicrosyntaxes.push(pair);
+ } else if (key === 'class') {
+ classPair = pair;
+ }
+ });
+
+ if (allOfTheMicrosyntaxes.length === 0) {
+ return;
+ }
+
+ var classValue = [];
+
+ if (classPair) {
+ classValue.push(classPair.value);
+ classValue.push(b.string(' '));
+ } else {
+ classPair = b.pair('class', null);
+ node.hash.pairs.push(classPair);
+ }
+
+ each(allOfTheMicrosyntaxIndexes, function (index) {
+ node.hash.pairs.splice(index, 1);
+ });
+
+ each(allOfTheMicrosyntaxes, function (_ref) {
+ var value = _ref.value;
+
+ var sexprs = [];
+ // TODO: add helpful deprecation when both `classNames` and `classNameBindings` can
+ // be removed.
+
+ if (value.type === 'StringLiteral') {
+ var microsyntax = parseMicrosyntax(value.original);
+
+ buildSexprs(microsyntax, sexprs, b);
+
+ classValue.push.apply(classValue, sexprs);
+ }
+ });
+
+ var hash = b.hash();
+ classPair.value = b.sexpr(b.path('concat'), classValue, hash);
+ }
+
+ function buildSexprs(microsyntax, sexprs, b) {
+ for (var i = 0; i < microsyntax.length; i++) {
+ var _microsyntax$i = microsyntax[i],
+ propName = _microsyntax$i[0],
+ activeClass = _microsyntax$i[1],
+ inactiveClass = _microsyntax$i[2];
+
+ var sexpr = void 0;
+
+ // :my-class-name microsyntax for static values
+ if (propName === '') {
+ sexpr = b.string(activeClass);
+ } else {
+ var params = [b.path(propName)];
+
+ if (activeClass || activeClass === '') {
+ params.push(b.string(activeClass));
+ } else {
+ var sexprParams = [b.string(propName), b.path(propName)];
+
+ var hash = b.hash();
+ if (activeClass !== undefined) {
+ hash.pairs.push(b.pair('activeClass', b.string(activeClass)));
+ }
+
+ if (inactiveClass !== undefined) {
+ hash.pairs.push(b.pair('inactiveClass', b.string(inactiveClass)));
+ }
+
+ params.push(b.sexpr(b.path('-normalize-class'), sexprParams, hash));
+ }
+
+ if (inactiveClass || inactiveClass === '') {
+ params.push(b.string(inactiveClass));
+ }
+
+ sexpr = b.sexpr(b.path('if'), params);
+ }
+
+ sexprs.push(sexpr);
+ sexprs.push(b.string(' '));
+ }
+ }
+
+ function each(list, callback) {
+ for (var i = 0; i < list.length; i++) {
+ callback(list[i], i);
+ }
+ }
+
+ function parseMicrosyntax(string) {
+ var segments = string.split(' ');
+
+ for (var i = 0; i < segments.length; i++) {
+ segments[i] = segments[i].split(':');
+ }
+
+ return segments;
+ }
+});
+enifed('ember-template-compiler/plugins/transform-quoted-bindings-into-just-bindings', ['exports'], function (exports) {
+ 'use strict';
+
+ exports.default = transformQuotedBindingsIntoJustBindings;
+ function transformQuotedBindingsIntoJustBindings() /* env */{
+
+ return {
+ name: 'transform-quoted-bindings-into-just-bindings',
+
+ visitors: {
+ ElementNode: function (node) {
+ var styleAttr = getStyleAttr(node);
+
+ if (!validStyleAttr(styleAttr)) {
+ return;
+ }
+
+ styleAttr.value = styleAttr.value.parts[0];
+ }
+ }
+ };
+ }
+
+ function validStyleAttr(attr) {
+ if (!attr) {
+ return false;
+ }
+
+ var value = attr.value;
+
+ if (!value || value.type !== 'ConcatStatement' || value.parts.length !== 1) {
+ return false;
+ }
+
+ var onlyPart = value.parts[0];
+
+ return onlyPart.type === 'MustacheStatement';
+ }
+
+ function getStyleAttr(node) {
+ var attributes = node.attributes;
+
+ for (var i = 0; i < attributes.length; i++) {
+ if (attributes[i].name === 'style') {
+ return attributes[i];
+ }
+ }
+ }
+});
+enifed('ember-template-compiler/plugins/transform-top-level-components', ['exports'], function (exports) {
+ 'use strict';
+
+ exports.default = transformTopLevelComponent;
+ function transformTopLevelComponent() /* env */{
+ return {
+ name: 'transform-top-level-component',
+
+ visitors: {
+ Program: function (node) {
+ hasSingleComponentNode(node, function (component) {
+ component.tag = '@' + component.tag;
+ component.isStatic = true;
+ });
+ }
+ }
+ };
+ }
+
+ function hasSingleComponentNode(program, componentCallback) {
+ var loc = program.loc,
+ body = program.body;
+
+ if (!loc || loc.start.line !== 1 || loc.start.column !== 0) {
+ return;
+ }
+
+ var lastComponentNode = void 0;
+ var nodeCount = 0;
+
+ for (var i = 0; i < body.length; i++) {
+ var curr = body[i];
+
+ // text node with whitespace only
+ if (curr.type === 'TextNode' && /^[\s]*$/.test(curr.chars)) {
+ continue;
+ }
+
+ // has multiple root elements if we've been here before
+ if (nodeCount++ > 0) {
+ return false;
+ }
+
+ if (curr.type === 'ComponentNode' || curr.type === 'ElementNode') {
+ lastComponentNode = curr;
+ }
+ }
+
+ if (!lastComponentNode) {
+ return;
+ }
+
+ if (lastComponentNode.type === 'ComponentNode') {
+ componentCallback(lastComponentNode);
+ }
+ }
+});
+enifed('ember-template-compiler/system/bootstrap', ['exports', 'ember-debug', 'ember-template-compiler/system/compile'], function (exports, _emberDebug, _compile) {
+ 'use strict';
+
+ /**
+ Find templates stored in the head tag as script tags and make them available
+ to `Ember.CoreView` in the global `Ember.TEMPLATES` object.
+
+ Script tags with `text/x-handlebars` will be compiled
+ with Ember's template compiler and are suitable for use as a view's template.
+
+ @private
+ @method bootstrap
+ @for Ember.HTMLBars
+ @static
+ @param ctx
+ */
+ /**
+ @module ember
+ */
+
+ function bootstrap(_ref) {
+ var context = _ref.context,
+ hasTemplate = _ref.hasTemplate,
+ setTemplate = _ref.setTemplate;
+
+ if (!context) {
+ context = document;
+ }
+
+ var selector = 'script[type="text/x-handlebars"]';
+
+ var elements = context.querySelectorAll(selector);
+
+ for (var i = 0; i < elements.length; i++) {
+ var script = elements[i];
+
+ // Get the name of the script
+ // First look for data-template-name attribute, then fall back to its
+ // id if no name is found.
+ var templateName = script.getAttribute('data-template-name') || script.getAttribute('id') || 'application';
+ var template = void 0;
+
+ template = (0, _compile.default)(script.innerHTML, {
+ moduleName: templateName
+ });
+
+ // Check if template of same name already exists.
+ if (hasTemplate(templateName)) {
+ throw new _emberDebug.Error('Template named "' + templateName + '" already exists.');
+ }
+
+ // For templates which have a name, we save them and then remove them from the DOM.
+ setTemplate(templateName, template);
+
+ // Remove script tag from DOM.
+ script.parentNode.removeChild(script);
+ }
+ }
+
+ exports.default = bootstrap;
+});
+enifed('ember-template-compiler/system/calculate-location-display', ['exports'], function (exports) {
+ 'use strict';
+
+ exports.default = calculateLocationDisplay;
+ function calculateLocationDisplay(moduleName) {
+ var loc = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ var _ref = loc.start || {},
+ column = _ref.column,
+ line = _ref.line;
+
+ var moduleInfo = '';
+ if (moduleName) {
+ moduleInfo += '\'' + moduleName + '\' ';
+ }
+
+ if (line !== undefined && column !== undefined) {
+ if (moduleName) {
+ // only prepend @ if the moduleName was present
+ moduleInfo += '@ ';
+ }
+ moduleInfo += 'L' + line + ':C' + column;
+ }
+
+ if (moduleInfo) {
+ moduleInfo = '(' + moduleInfo + ') ';
+ }
+
+ return moduleInfo;
+ }
+});
+enifed('ember-template-compiler/system/compile-options', ['exports', 'ember-utils', 'ember-template-compiler/plugins'], function (exports, _emberUtils, _plugins) {
+ 'use strict';
+
+ exports.default = compileOptions;
+ exports.registerPlugin = registerPlugin;
+ exports.unregisterPlugin = unregisterPlugin;
+
+
+ var USER_PLUGINS = [];
+
+ function compileOptions(_options) {
+ var options = (0, _emberUtils.assign)({ meta: {} }, _options);
+
+ // move `moduleName` into `meta` property
+ if (options.moduleName) {
+ var meta = options.meta;
+ meta.moduleName = options.moduleName;
+ }
+
+ if (!options.plugins) {
+ options.plugins = { ast: [].concat(USER_PLUGINS, _plugins.default) };
+ } else {
+ var potententialPugins = [].concat(USER_PLUGINS, _plugins.default);
+ var providedPlugins = options.plugins.ast.map(function (plugin) {
+ return wrapLegacyPluginIfNeeded(plugin);
+ });
+ var pluginsToAdd = potententialPugins.filter(function (plugin) {
+ return options.plugins.ast.indexOf(plugin) === -1;
+ });
+ options.plugins.ast = providedPlugins.concat(pluginsToAdd);
+ }
+
+ return options;
+ }
+
+ function wrapLegacyPluginIfNeeded(_plugin) {
+ var plugin = _plugin;
+ if (_plugin.prototype && _plugin.prototype.transform) {
+ plugin = function (env) {
+ var pluginInstantiated = false;
+
+ return {
+ name: _plugin.constructor && _plugin.constructor.name,
+
+ visitors: {
+ Program: function (node) {
+ if (!pluginInstantiated) {
+
+ pluginInstantiated = true;
+ var _plugin2 = new _plugin(env);
+
+ _plugin2.syntax = env.syntax;
+
+ return _plugin2.transform(node);
+ }
+ }
+ }
+ };
+ };
+
+ plugin.__raw = _plugin;
+ }
+
+ return plugin;
+ }
+
+ function registerPlugin(type, _plugin) {
+ if (type !== 'ast') {
+ throw new Error('Attempting to register ' + _plugin + ' as "' + type + '" which is not a valid Glimmer plugin type.');
+ }
+
+ for (var i = 0; i < USER_PLUGINS.length; i++) {
+ var PLUGIN = USER_PLUGINS[i];
+ if (PLUGIN === _plugin || PLUGIN.__raw === _plugin) {
+ return;
+ }
+ }
+
+ var plugin = wrapLegacyPluginIfNeeded(_plugin);
+
+ USER_PLUGINS = [plugin].concat(USER_PLUGINS);
+ }
+
+ function unregisterPlugin(type, PluginClass) {
+ if (type !== 'ast') {
+ throw new Error('Attempting to unregister ' + PluginClass + ' as "' + type + '" which is not a valid Glimmer plugin type.');
+ }
+
+ USER_PLUGINS = USER_PLUGINS.filter(function (plugin) {
+ return plugin !== PluginClass && plugin.__raw !== PluginClass;
+ });
+ }
+});
+enifed('ember-template-compiler/system/compile', ['exports', 'require', 'ember-template-compiler/system/precompile'], function (exports, _require2, _precompile) {
+ 'use strict';
+
+ exports.default = compile;
+ /**
+ @module ember
+ */
+ var template = void 0;
+
+ /**
+ Uses HTMLBars `compile` function to process a string into a compiled template.
+
+ This is not present in production builds.
+
+ @private
+ @method compile
+ @param {String} templateString This is the string to be compiled by HTMLBars.
+ @param {Object} options This is an options hash to augment the compiler options.
+ */
+ function compile(templateString, options) {
+ if (!template && (0, _require2.has)('ember-glimmer')) {
+ template = (0, _require2.default)('ember-glimmer').template;
+ }
+
+ if (!template) {
+ throw new Error('Cannot call `compile` with only the template compiler loaded. Please load `ember.debug.js` or `ember.prod.js` prior to calling `compile`.');
+ }
+
+ var precompiledTemplateString = (0, _precompile.default)(templateString, options);
+ var templateJS = new Function('return ' + precompiledTemplateString)();
+ return template(templateJS);
+ }
+});
+enifed('ember-template-compiler/system/precompile', ['exports', 'ember-template-compiler/system/compile-options', 'require'], function (exports, _compileOptions, _require2) {
+ 'use strict';
+
+ exports.default = precompile;
+ /**
+ @module ember
+ */
+
+ var glimmerPrecompile = void 0;
+
+ /**
+ Uses HTMLBars `compile` function to process a string into a compiled template string.
+ The returned string must be passed through `Ember.HTMLBars.template`.
+
+ This is not present in production builds.
+
+ @private
+ @method precompile
+ @param {String} templateString This is the string to be compiled by HTMLBars.
+ */
+ function precompile(templateString, options) {
+ if (!glimmerPrecompile && (0, _require2.has)('@glimmer/compiler')) {
+ glimmerPrecompile = (0, _require2.default)('@glimmer/compiler').precompile;
+ }
+
+ if (!glimmerPrecompile) {
+ throw new Error('Cannot call `compile` without the template compiler loaded. Please load `ember-template-compiler.js` prior to calling `compile`.');
+ }
+
+ return glimmerPrecompile(templateString, (0, _compileOptions.default)(options));
+ }
+});
+enifed('ember-testing/adapters/adapter', ['exports', 'ember-runtime'], function (exports, _emberRuntime) {
+ 'use strict';
+
+ function K() {
+ return this;
+ }
+
+ /**
+ @module @ember/test
+ */
+
+ /**
+ The primary purpose of this class is to create hooks that can be implemented
+ by an adapter for various test frameworks.
+
+ @class TestAdapter
+ @public
+ */
+ exports.default = _emberRuntime.Object.extend({
+ /**
+ This callback will be called whenever an async operation is about to start.
+ Override this to call your framework's methods that handle async
+ operations.
+ @public
+ @method asyncStart
+ */
+ asyncStart: K,
+
+ /**
+ This callback will be called whenever an async operation has completed.
+ @public
+ @method asyncEnd
+ */
+ asyncEnd: K,
+
+ /**
+ Override this method with your testing framework's false assertion.
+ This function is called whenever an exception occurs causing the testing
+ promise to fail.
+ QUnit example:
+ ```javascript
+ exception: function(error) {
+ ok(false, error);
+ };
+ ```
+ @public
+ @method exception
+ @param {String} error The exception to be raised.
+ */
+ exception: function (error) {
+ throw error;
+ }
+ });
+});
+enifed('ember-testing/adapters/qunit', ['exports', 'ember-utils', 'ember-testing/adapters/adapter'], function (exports, _emberUtils, _adapter) {
+ 'use strict';
+
+ exports.default = _adapter.default.extend({
+ asyncStart: function () {
+ QUnit.stop();
+ },
+ asyncEnd: function () {
+ QUnit.start();
+ },
+ exception: function (error) {
+ QUnit.config.current.assert.ok(false, (0, _emberUtils.inspect)(error));
+ }
+ });
+});
+enifed('ember-testing/events', ['exports', 'ember-views', 'ember-metal'], function (exports, _emberViews, _emberMetal) {
+ 'use strict';
+
+ exports.focus = focus;
+ exports.fireEvent = fireEvent;
+
+
+ var DEFAULT_EVENT_OPTIONS = { canBubble: true, cancelable: true };
+ var KEYBOARD_EVENT_TYPES = ['keydown', 'keypress', 'keyup'];
+ var MOUSE_EVENT_TYPES = ['click', 'mousedown', 'mouseup', 'dblclick', 'mouseenter', 'mouseleave', 'mousemove', 'mouseout', 'mouseover'];
+
+ function focus(el) {
+ if (!el) {
+ return;
+ }
+ var $el = (0, _emberViews.jQuery)(el);
+ if ($el.is(':input, [contenteditable=true]')) {
+ var type = $el.prop('type');
+ if (type !== 'checkbox' && type !== 'radio' && type !== 'hidden') {
+ (0, _emberMetal.run)(null, function () {
+ // Firefox does not trigger the `focusin` event if the window
+ // does not have focus. If the document doesn't have focus just
+ // use trigger('focusin') instead.
+
+ if (!document.hasFocus || document.hasFocus()) {
+ el.focus();
+ } else {
+ $el.trigger('focusin');
+ }
+ });
+ }
+ }
+ }
+
+ function fireEvent(element, type) {
+ var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
+
+ if (!element) {
+ return;
+ }
+ var event = void 0;
+ if (KEYBOARD_EVENT_TYPES.indexOf(type) > -1) {
+ event = buildKeyboardEvent(type, options);
+ } else if (MOUSE_EVENT_TYPES.indexOf(type) > -1) {
+ var rect = element.getBoundingClientRect();
+ var x = rect.left + 1;
+ var y = rect.top + 1;
+ var simulatedCoordinates = {
+ screenX: x + 5,
+ screenY: y + 95,
+ clientX: x,
+ clientY: y
+ };
+ event = buildMouseEvent(type, _emberViews.jQuery.extend(simulatedCoordinates, options));
+ } else {
+ event = buildBasicEvent(type, options);
+ }
+ element.dispatchEvent(event);
+ }
+
+ function buildBasicEvent(type) {
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ var event = document.createEvent('Events');
+ event.initEvent(type, true, true);
+ _emberViews.jQuery.extend(event, options);
+ return event;
+ }
+
+ function buildMouseEvent(type) {
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ var event = void 0;
+ try {
+ event = document.createEvent('MouseEvents');
+ var eventOpts = _emberViews.jQuery.extend({}, DEFAULT_EVENT_OPTIONS, options);
+ event.initMouseEvent(type, eventOpts.canBubble, eventOpts.cancelable, window, eventOpts.detail, eventOpts.screenX, eventOpts.screenY, eventOpts.clientX, eventOpts.clientY, eventOpts.ctrlKey, eventOpts.altKey, eventOpts.shiftKey, eventOpts.metaKey, eventOpts.button, eventOpts.relatedTarget);
+ } catch (e) {
+ event = buildBasicEvent(type, options);
+ }
+ return event;
+ }
+
+ function buildKeyboardEvent(type) {
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
+
+ var event = void 0;
+ try {
+ event = document.createEvent('KeyEvents');
+ var eventOpts = _emberViews.jQuery.extend({}, DEFAULT_EVENT_OPTIONS, options);
+ event.initKeyEvent(type, eventOpts.canBubble, eventOpts.cancelable, window, eventOpts.ctrlKey, eventOpts.altKey, eventOpts.shiftKey, eventOpts.metaKey, eventOpts.keyCode, eventOpts.charCode);
+ } catch (e) {
+ event = buildBasicEvent(type, options);
+ }
+ return event;
+ }
+});
+enifed('ember-testing/ext/application', ['ember-application', 'ember-testing/setup_for_testing', 'ember-testing/test/helpers', 'ember-testing/test/promise', 'ember-testing/test/run', 'ember-testing/test/on_inject_helpers', 'ember-testing/test/adapter'], function (_emberApplication, _setup_for_testing, _helpers, _promise, _run, _on_inject_helpers, _adapter) {
+ 'use strict';
+
+ _emberApplication.Application.reopen({
+ /**
+ This property contains the testing helpers for the current application. These
+ are created once you call `injectTestHelpers` on your `Application`
+ instance. The included helpers are also available on the `window` object by
+ default, but can be used from this object on the individual application also.
+ @property testHelpers
+ @type {Object}
+ @default {}
+ @public
+ */
+ testHelpers: {},
+
+ /**
+ This property will contain the original methods that were registered
+ on the `helperContainer` before `injectTestHelpers` is called.
+ When `removeTestHelpers` is called, these methods are restored to the
+ `helperContainer`.
+ @property originalMethods
+ @type {Object}
+ @default {}
+ @private
+ @since 1.3.0
+ */
+ originalMethods: {},
+
+ /**
+ This property indicates whether or not this application is currently in
+ testing mode. This is set when `setupForTesting` is called on the current
+ application.
+ @property testing
+ @type {Boolean}
+ @default false
+ @since 1.3.0
+ @public
+ */
+ testing: false,
+
+ setupForTesting: function () {
+ (0, _setup_for_testing.default)();
+
+ this.testing = true;
+
+ this.resolveRegistration('router:main').reopen({
+ location: 'none'
+ });
+ },
+
+
+ /**
+ This will be used as the container to inject the test helpers into. By
+ default the helpers are injected into `window`.
+ @property helperContainer
+ @type {Object} The object to be used for test helpers.
+ @default window
+ @since 1.2.0
+ @private
+ */
+ helperContainer: null,
+
+ injectTestHelpers: function (helperContainer) {
+ if (helperContainer) {
+ this.helperContainer = helperContainer;
+ } else {
+ this.helperContainer = window;
+ }
+
+ this.reopen({
+ willDestroy: function () {
+ this._super.apply(this, arguments);
+ this.removeTestHelpers();
+ }
+ });
+
+ this.testHelpers = {};
+ for (var name in _helpers.helpers) {
+ this.originalMethods[name] = this.helperContainer[name];
+ this.testHelpers[name] = this.helperContainer[name] = helper(this, name);
+ protoWrap(_promise.default.prototype, name, helper(this, name), _helpers.helpers[name].meta.wait);
+ }
+
+ (0, _on_inject_helpers.invokeInjectHelpersCallbacks)(this);
+ },
+ removeTestHelpers: function () {
+ if (!this.helperContainer) {
+ return;
+ }
+
+ for (var name in _helpers.helpers) {
+ this.helperContainer[name] = this.originalMethods[name];
+ delete _promise.default.prototype[name];
+ delete this.testHelpers[name];
+ delete this.originalMethods[name];
+ }
+ }
+ });
+
+ // This method is no longer needed
+ // But still here for backwards compatibility
+ // of helper chaining
+ function protoWrap(proto, name, callback, isAsync) {
+ proto[name] = function () {
+ for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
+ args[_key] = arguments[_key];
+ }
+
+ if (isAsync) {
+ return callback.apply(this, args);
+ } else {
+ return this.then(function () {
+ return callback.apply(this, args);
+ });
+ }
+ };
+ }
+
+ function helper(app, name) {
+ var fn = _helpers.helpers[name].method;
+ var meta = _helpers.helpers[name].meta;
+ if (!meta.wait) {
+ return function () {
+ for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+ args[_key2] = arguments[_key2];
+ }
+
+ return fn.apply(app, [app].concat(args));
+ };
+ }
+
+ return function () {
+ for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
+ args[_key3] = arguments[_key3];
+ }
+
+ var lastPromise = (0, _run.default)(function () {
+ return (0, _promise.resolve)((0, _promise.getLastPromise)());
+ });
+
+ // wait for last helper's promise to resolve and then
+ // execute. To be safe, we need to tell the adapter we're going
+ // asynchronous here, because fn may not be invoked before we
+ // return.
+ (0, _adapter.asyncStart)();
+ return lastPromise.then(function () {
+ return fn.apply(app, [app].concat(args));
+ }).finally(_adapter.asyncEnd);
+ };
+ }
+});
+enifed('ember-testing/ext/rsvp', ['exports', 'ember-runtime', 'ember-metal', 'ember-debug', 'ember-testing/test/adapter'], function (exports, _emberRuntime, _emberMetal, _emberDebug, _adapter) {
+ 'use strict';
+
+ _emberRuntime.RSVP.configure('async', function (callback, promise) {
+ // if schedule will cause autorun, we need to inform adapter
+ if ((0, _emberDebug.isTesting)() && !_emberMetal.run.backburner.currentInstance) {
+ (0, _adapter.asyncStart)();
+ _emberMetal.run.backburner.schedule('actions', function () {
+ (0, _adapter.asyncEnd)();
+ callback(promise);
+ });
+ } else {
+ _emberMetal.run.backburner.schedule('actions', function () {
+ return callback(promise);
+ });
+ }
+ });
+
+ exports.default = _emberRuntime.RSVP;
+});
+enifed('ember-testing/helpers', ['ember-testing/test/helpers', 'ember-testing/helpers/and_then', 'ember-testing/helpers/click', 'ember-testing/helpers/current_path', 'ember-testing/helpers/current_route_name', 'ember-testing/helpers/current_url', 'ember-testing/helpers/fill_in', 'ember-testing/helpers/find', 'ember-testing/helpers/find_with_assert', 'ember-testing/helpers/key_event', 'ember-testing/helpers/pause_test', 'ember-testing/helpers/trigger_event', 'ember-testing/helpers/visit', 'ember-testing/helpers/wait'], function (_helpers, _and_then, _click, _current_path, _current_route_name, _current_url, _fill_in, _find, _find_with_assert, _key_event, _pause_test, _trigger_event, _visit, _wait) {
+ 'use strict';
+
+ (0, _helpers.registerAsyncHelper)('visit', _visit.default);
+ (0, _helpers.registerAsyncHelper)('click', _click.default);
+ (0, _helpers.registerAsyncHelper)('keyEvent', _key_event.default);
+ (0, _helpers.registerAsyncHelper)('fillIn', _fill_in.default);
+ (0, _helpers.registerAsyncHelper)('wait', _wait.default);
+ (0, _helpers.registerAsyncHelper)('andThen', _and_then.default);
+ (0, _helpers.registerAsyncHelper)('pauseTest', _pause_test.pauseTest);
+ (0, _helpers.registerAsyncHelper)('triggerEvent', _trigger_event.default);
+
+ (0, _helpers.registerHelper)('find', _find.default);
+ (0, _helpers.registerHelper)('findWithAssert', _find_with_assert.default);
+ (0, _helpers.registerHelper)('currentRouteName', _current_route_name.default);
+ (0, _helpers.registerHelper)('currentPath', _current_path.default);
+ (0, _helpers.registerHelper)('currentURL', _current_url.default);
+ (0, _helpers.registerHelper)('resumeTest', _pause_test.resumeTest);
+});
+enifed("ember-testing/helpers/and_then", ["exports"], function (exports) {
+ "use strict";
+
+ exports.default = andThen;
+ function andThen(app, callback) {
+ return app.testHelpers.wait(callback(app));
+ }
+});
+enifed('ember-testing/helpers/click', ['exports', 'ember-testing/events'], function (exports, _events) {
+ 'use strict';
+
+ exports.default = click;
+
+
+ /**
+ Clicks an element and triggers any actions triggered by the element's `click`
+ event.
+
+ Example:
+
+ ```javascript
+ click('.some-jQuery-selector').then(function() {
+ // assert something
+ });
+ ```
+
+ @method click
+ @param {String} selector jQuery selector for finding element on the DOM
+ @param {Object} context A DOM Element, Document, or jQuery to use as context
+ @return {RSVP.Promise<undefined>}
+ @public
+ */
+ function click(app, selector, context) {
+ var $el = app.testHelpers.findWithAssert(selector, context);
+ var el = $el[0];
+
+ (0, _events.fireEvent)(el, 'mousedown');
+
+ (0, _events.focus)(el);
+
+ (0, _events.fireEvent)(el, 'mouseup');
+ (0, _events.fireEvent)(el, 'click');
+
+ return app.testHelpers.wait();
+ } /**
+ @module ember
+ */
+});
+enifed('ember-testing/helpers/current_path', ['exports', 'ember-metal'], function (exports, _emberMetal) {
+ 'use strict';
+
+ exports.default = currentPath;
+
+
+ /**
+ Returns the current path.
+
+ Example:
+
+ ```javascript
+ function validateURL() {
+ equal(currentPath(), 'some.path.index', "correct path was transitioned into.");
+ }
+
+ click('#some-link-id').then(validateURL);
+ ```
+
+ @method currentPath
+ @return {Object} The currently active path.
+ @since 1.5.0
+ @public
+ */
+ function currentPath(app) {
+ var routingService = app.__container__.lookup('service:-routing');
+ return (0, _emberMetal.get)(routingService, 'currentPath');
+ } /**
+ @module ember
+ */
+});
+enifed('ember-testing/helpers/current_route_name', ['exports', 'ember-metal'], function (exports, _emberMetal) {
+ 'use strict';
+
+ exports.default = currentRouteName;
+
+ /**
+ Returns the currently active route name.
+
+ Example:
+
+ ```javascript
+ function validateRouteName() {
+ equal(currentRouteName(), 'some.path', "correct route was transitioned into.");
+ }
+ visit('/some/path').then(validateRouteName)
+ ```
+
+ @method currentRouteName
+ @return {Object} The name of the currently active route.
+ @since 1.5.0
+ @public
+ */
+ function currentRouteName(app) {
+ var routingService = app.__container__.lookup('service:-routing');
+ return (0, _emberMetal.get)(routingService, 'currentRouteName');
+ } /**
+ @module ember
+ */
+});
+enifed('ember-testing/helpers/current_url', ['exports', 'ember-metal'], function (exports, _emberMetal) {
+ 'use strict';
+
+ exports.default = currentURL;
+
+
+ /**
+ Returns the current URL.
+
+ Example:
+
+ ```javascript
+ function validateURL() {
+ equal(currentURL(), '/some/path', "correct URL was transitioned into.");
+ }
+
+ click('#some-link-id').then(validateURL);
+ ```
+
+ @method currentURL
+ @return {Object} The currently active URL.
+ @since 1.5.0
+ @public
+ */
+ function currentURL(app) {
+ var router = app.__container__.lookup('router:main');
+ return (0, _emberMetal.get)(router, 'location').getURL();
+ } /**
+ @module ember
+ */
+});
+enifed('ember-testing/helpers/fill_in', ['exports', 'ember-testing/events'], function (exports, _events) {
+ 'use strict';
+
+ exports.default = fillIn;
+
+
+ /**
+ Fills in an input element with some text.
+
+ Example:
+
+ ```javascript
+ fillIn('#email', 'you@example.com').then(function() {
+ // assert something
+ });
+ ```
+
+ @method fillIn
+ @param {String} selector jQuery selector finding an input element on the DOM
+ to fill text with
+ @param {String} text text to place inside the input element
+ @return {RSVP.Promise<undefined>}
+ @public
+ */
+ function fillIn(app, selector, contextOrText, text) {
+ var $el = void 0,
+ el = void 0,
+ context = void 0;
+ if (text === undefined) {
+ text = contextOrText;
+ } else {
+ context = contextOrText;
+ }
+ $el = app.testHelpers.findWithAssert(selector, context);
+ el = $el[0];
+ (0, _events.focus)(el);
+
+ $el.eq(0).val(text);
+ (0, _events.fireEvent)(el, 'input');
+ (0, _events.fireEvent)(el, 'change');
+
+ return app.testHelpers.wait();
+ } /**
+ @module ember
+ */
+});
+enifed('ember-testing/helpers/find', ['exports', 'ember-metal'], function (exports, _emberMetal) {
+ 'use strict';
+
+ exports.default = find;
+
+
+ /**
+ Finds an element in the context of the app's container element. A simple alias
+ for `app.$(selector)`.
+
+ Example:
+
+ ```javascript
+ var $el = find('.my-selector');
+ ```
+
+ With the `context` param:
+
+ ```javascript
+ var $el = find('.my-selector', '.parent-element-class');
+ ```
+
+ @method find
+ @param {String} selector jQuery string selector for element lookup
+ @param {String} [context] (optional) jQuery selector that will limit the selector
+ argument to find only within the context's children
+ @return {Object} jQuery object representing the results of the query
+ @public
+ */
+ function find(app, selector, context) {
+ var $el = void 0;
+ context = context || (0, _emberMetal.get)(app, 'rootElement');
+ $el = app.$(selector, context);
+ return $el;
+ } /**
+ @module ember
+ */
+});
+enifed('ember-testing/helpers/find_with_assert', ['exports'], function (exports) {
+ 'use strict';
+
+ exports.default = findWithAssert;
+ /**
+ @module ember
+ */
+ /**
+ Like `find`, but throws an error if the element selector returns no results.
+
+ Example:
+
+ ```javascript
+ var $el = findWithAssert('.doesnt-exist'); // throws error
+ ```
+
+ With the `context` param:
+
+ ```javascript
+ var $el = findWithAssert('.selector-id', '.parent-element-class'); // assert will pass
+ ```
+
+ @method findWithAssert
+ @param {String} selector jQuery selector string for finding an element within
+ the DOM
+ @param {String} [context] (optional) jQuery selector that will limit the
+ selector argument to find only within the context's children
+ @return {Object} jQuery object representing the results of the query
+ @throws {Error} throws error if jQuery object returned has a length of 0
+ @public
+ */
+ function findWithAssert(app, selector, context) {
+ var $el = app.testHelpers.find(selector, context);
+ if ($el.length === 0) {
+ throw new Error('Element ' + selector + ' not found.');
+ }
+ return $el;
+ }
+});
+enifed("ember-testing/helpers/key_event", ["exports"], function (exports) {
+ "use strict";
+
+ exports.default = keyEvent;
+ /**
+ @module ember
+ */
+ /**
+ Simulates a key event, e.g. `keypress`, `keydown`, `keyup` with the desired keyCode
+ Example:
+ ```javascript
+ keyEvent('.some-jQuery-selector', 'keypress', 13).then(function() {
+ // assert something
+ });
+ ```
+ @method keyEvent
+ @param {String} selector jQuery selector for finding element on the DOM
+ @param {String} type the type of key event, e.g. `keypress`, `keydown`, `keyup`
+ @param {Number} keyCode the keyCode of the simulated key event
+ @return {RSVP.Promise<undefined>}
+ @since 1.5.0
+ @public
+ */
+ function keyEvent(app, selector, contextOrType, typeOrKeyCode, keyCode) {
+ var context = void 0,
+ type = void 0;
+
+ if (keyCode === undefined) {
+ context = null;
+ keyCode = typeOrKeyCode;
+ type = contextOrType;
+ } else {
+ context = contextOrType;
+ type = typeOrKeyCode;
+ }
+
+ return app.testHelpers.triggerEvent(selector, context, type, { keyCode: keyCode, which: keyCode });
+ }
+});
+enifed('ember-testing/helpers/pause_test', ['exports', 'ember-runtime', 'ember-console', 'ember-debug'], function (exports, _emberRuntime, _emberConsole, _emberDebug) {
+ 'use strict';
+
+ exports.resumeTest = resumeTest;
+ exports.pauseTest = pauseTest;
+
+
+ var resume = void 0;
+
+ /**
+ Resumes a test paused by `pauseTest`.
+
+ @method resumeTest
+ @return {void}
+ @public
+ */
+ /**
+ @module ember
+ */
+ function resumeTest() {
+ (true && !(resume) && (0, _emberDebug.assert)('Testing has not been paused. There is nothing to resume.', resume));
+
+ resume();
+ resume = undefined;
+ }
+
+ /**
+ Pauses the current test - this is useful for debugging while testing or for test-driving.
+ It allows you to inspect the state of your application at any point.
+ Example (The test will pause before clicking the button):
+
+ ```javascript
+ visit('/')
+ return pauseTest();
+ click('.btn');
+ ```
+
+ You may want to turn off the timeout before pausing.
+
+ qunit (as of 2.4.0):
+
+ ```
+ visit('/');
+ assert.timeout(0);
+ return pauseTest();
+ click('.btn');
+ ```
+
+ mocha:
+
+ ```
+ visit('/');
+ this.timeout(0);
+ return pauseTest();
+ click('.btn');
+ ```
+
+
+ @since 1.9.0
+ @method pauseTest
+ @return {Object} A promise that will never resolve
+ @public
+ */
+ function pauseTest() {
+ _emberConsole.default.info('Testing paused. Use `resumeTest()` to continue.');
+
+ return new _emberRuntime.RSVP.Promise(function (resolve) {
+ resume = resolve;
+ }, 'TestAdapter paused promise');
+ }
+});
+enifed('ember-testing/helpers/trigger_event', ['exports', 'ember-testing/events'], function (exports, _events) {
+ 'use strict';
+
+ exports.default = triggerEvent;
+
+ /**
+ Triggers the given DOM event on the element identified by the provided selector.
+ Example:
+ ```javascript
+ triggerEvent('#some-elem-id', 'blur');
+ ```
+ This is actually used internally by the `keyEvent` helper like so:
+ ```javascript
+ triggerEvent('#some-elem-id', 'keypress', { keyCode: 13 });
+ ```
+ @method triggerEvent
+ @param {String} selector jQuery selector for finding element on the DOM
+ @param {String} [context] jQuery selector that will limit the selector
+ argument to find only within the context's children
+ @param {String} type The event type to be triggered.
+ @param {Object} [options] The options to be passed to jQuery.Event.
+ @return {RSVP.Promise<undefined>}
+ @since 1.5.0
+ @public
+ */
+ function triggerEvent(app, selector, contextOrType, typeOrOptions, possibleOptions) {
+ var arity = arguments.length;
+ var context = void 0,
+ type = void 0,
+ options = void 0;
+
+ if (arity === 3) {
+ // context and options are optional, so this is
+ // app, selector, type
+ context = null;
+ type = contextOrType;
+ options = {};
+ } else if (arity === 4) {
+ // context and options are optional, so this is
+ if (typeof typeOrOptions === 'object') {
+ // either
+ // app, selector, type, options
+ context = null;
+ type = contextOrType;
+ options = typeOrOptions;
+ } else {
+ // or
+ // app, selector, context, type
+ context = contextOrType;
+ type = typeOrOptions;
+ options = {};
+ }
+ } else {
+ context = contextOrType;
+ type = typeOrOptions;
+ options = possibleOptions;
+ }
+
+ var $el = app.testHelpers.findWithAssert(selector, context);
+ var el = $el[0];
+
+ (0, _events.fireEvent)(el, type, options);
+
+ return app.testHelpers.wait();
+ } /**
+ @module ember
+ */
+});
+enifed('ember-testing/helpers/visit', ['exports', 'ember-metal'], function (exports, _emberMetal) {
+ 'use strict';
+
+ exports.default = visit;
+
+
+ /**
+ Loads a route, sets up any controllers, and renders any templates associated
+ with the route as though a real user had triggered the route change while
+ using your app.
+
+ Example:
+
+ ```javascript
+ visit('posts/index').then(function() {
+ // assert something
+ });
+ ```
+
+ @method visit
+ @param {String} url the name of the route
+ @return {RSVP.Promise<undefined>}
+ @public
+ */
+ function visit(app, url) {
+ var router = app.__container__.lookup('router:main');
+ var shouldHandleURL = false;
+
+ app.boot().then(function () {
+ router.location.setURL(url);
+
+ if (shouldHandleURL) {
+ (0, _emberMetal.run)(app.__deprecatedInstance__, 'handleURL', url);
+ }
+ });
+
+ if (app._readinessDeferrals > 0) {
+ router['initialURL'] = url;
+ (0, _emberMetal.run)(app, 'advanceReadiness');
+ delete router['initialURL'];
+ } else {
+ shouldHandleURL = true;
+ }
+
+ return app.testHelpers.wait();
+ } /**
+ @module ember
+ */
+});
+enifed('ember-testing/helpers/wait', ['exports', 'ember-testing/test/waiters', 'ember-runtime', 'ember-metal', 'ember-testing/test/pending_requests'], function (exports, _waiters, _emberRuntime, _emberMetal, _pending_requests) {
+ 'use strict';
+
+ exports.default = wait;
+
+
+ /**
+ Causes the run loop to process any pending events. This is used to ensure that
+ any async operations from other helpers (or your assertions) have been processed.
+
+ This is most often used as the return value for the helper functions (see 'click',
+ 'fillIn','visit',etc). However, there is a method to register a test helper which
+ utilizes this method without the need to actually call `wait()` in your helpers.
+
+ The `wait` helper is built into `registerAsyncHelper` by default. You will not need
+ to `return app.testHelpers.wait();` - the wait behavior is provided for you.
+
+ Example:
+
+ ```javascript
+ import { registerAsyncHelper } from '@ember/test';
+
+ registerAsyncHelper('loginUser', function(app, username, password) {
+ visit('secured/path/here')
+ .fillIn('#username', username)
+ .fillIn('#password', password)
+ .click('.submit');
+ });
+ ```
+
+ @method wait
+ @param {Object} value The value to be returned.
+ @return {RSVP.Promise<any>} Promise that resolves to the passed value.
+ @public
+ @since 1.0.0
+ */
+ /**
+ @module ember
+ */
+ function wait(app, value) {
+ return new _emberRuntime.RSVP.Promise(function (resolve) {
+ var router = app.__container__.lookup('router:main');
+
+ // Every 10ms, poll for the async thing to have finished
+ var watcher = setInterval(function () {
+ // 1. If the router is loading, keep polling
+ var routerIsLoading = router._routerMicrolib && !!router._routerMicrolib.activeTransition;
+ if (routerIsLoading) {
+ return;
+ }
+
+ // 2. If there are pending Ajax requests, keep polling
+ if ((0, _pending_requests.pendingRequests)()) {
+ return;
+ }
+
+ // 3. If there are scheduled timers or we are inside of a run loop, keep polling
+ if (_emberMetal.run.hasScheduledTimers() || _emberMetal.run.currentRunLoop) {
+ return;
+ }
+
+ if ((0, _waiters.checkWaiters)()) {
+ return;
+ }
+
+ // Stop polling
+ clearInterval(watcher);
+
+ // Synchronously resolve the promise
+ (0, _emberMetal.run)(null, resolve, value);
+ }, 10);
+ });
+ }
+});
+enifed('ember-testing/index', ['exports', 'ember-testing/test', 'ember-testing/adapters/adapter', 'ember-testing/setup_for_testing', 'ember-testing/adapters/qunit', 'ember-testing/support', 'ember-testing/ext/application', 'ember-testing/ext/rsvp', 'ember-testing/helpers', 'ember-testing/initializers'], function (exports, _test, _adapter, _setup_for_testing, _qunit) {
+ 'use strict';
+
+ exports.QUnitAdapter = exports.setupForTesting = exports.Adapter = exports.Test = undefined;
+ Object.defineProperty(exports, 'Test', {
+ enumerable: true,
+ get: function () {
+ return _test.default;
+ }
+ });
+ Object.defineProperty(exports, 'Adapter', {
+ enumerable: true,
+ get: function () {
+ return _adapter.default;
+ }
+ });
+ Object.defineProperty(exports, 'setupForTesting', {
+ enumerable: true,
+ get: function () {
+ return _setup_for_testing.default;
+ }
+ });
+ Object.defineProperty(exports, 'QUnitAdapter', {
+ enumerable: true,
+ get: function () {
+ return _qunit.default;
+ }
+ });
+});
+enifed('ember-testing/initializers', ['ember-runtime'], function (_emberRuntime) {
+ 'use strict';
+
+ var name = 'deferReadiness in `testing` mode';
+
+ (0, _emberRuntime.onLoad)('Ember.Application', function (Application) {
+ if (!Application.initializers[name]) {
+ Application.initializer({
+ name: name,
+
+ initialize: function (application) {
+ if (application.testing) {
+ application.deferReadiness();
+ }
+ }
+ });
+ }
+ });
+});
+enifed('ember-testing/setup_for_testing', ['exports', 'ember-debug', 'ember-views', 'ember-testing/test/adapter', 'ember-testing/test/pending_requests', 'ember-testing/adapters/adapter', 'ember-testing/adapters/qunit'], function (exports, _emberDebug, _emberViews, _adapter, _pending_requests, _adapter2, _qunit) {
+ 'use strict';
+
+ exports.default = setupForTesting;
+
+
+ /**
+ Sets Ember up for testing. This is useful to perform
+ basic setup steps in order to unit test.
+
+ Use `App.setupForTesting` to perform integration tests (full
+ application testing).
+
+ @method setupForTesting
+ @namespace Ember
+ @since 1.5.0
+ @private
+ */
+ /* global self */
+
+ function setupForTesting() {
+ (0, _emberDebug.setTesting)(true);
+
+ var adapter = (0, _adapter.getAdapter)();
+ // if adapter is not manually set default to QUnit
+ if (!adapter) {
+ (0, _adapter.setAdapter)(typeof self.QUnit === 'undefined' ? new _adapter2.default() : new _qunit.default());
+ }
+
+ if (_emberViews.jQuery) {
+ (0, _emberViews.jQuery)(document).off('ajaxSend', _pending_requests.incrementPendingRequests);
+ (0, _emberViews.jQuery)(document).off('ajaxComplete', _pending_requests.decrementPendingRequests);
+
+ (0, _pending_requests.clearPendingRequests)();
+
+ (0, _emberViews.jQuery)(document).on('ajaxSend', _pending_requests.incrementPendingRequests);
+ (0, _emberViews.jQuery)(document).on('ajaxComplete', _pending_requests.decrementPendingRequests);
+ }
+ }
+});
+enifed('ember-testing/support', ['ember-debug', 'ember-views', 'ember-environment'], function (_emberDebug, _emberViews, _emberEnvironment) {
+ 'use strict';
+
+ /**
+ @module ember
+ */
+
+ var $ = _emberViews.jQuery;
+
+ /**
+ This method creates a checkbox and triggers the click event to fire the
+ passed in handler. It is used to correct for a bug in older versions
+ of jQuery (e.g 1.8.3).
+
+ @private
+ @method testCheckboxClick
+ */
+ function testCheckboxClick(handler) {
+ var input = document.createElement('input');
+ $(input).attr('type', 'checkbox').css({ position: 'absolute', left: '-1000px', top: '-1000px' }).appendTo('body').on('click', handler).trigger('click').remove();
+ }
+
+ if (_emberEnvironment.environment.hasDOM && typeof $ === 'function') {
+ $(function () {
+ /*
+ Determine whether a checkbox checked using jQuery's "click" method will have
+ the correct value for its checked property.
+ If we determine that the current jQuery version exhibits this behavior,
+ patch it to work correctly as in the commit for the actual fix:
+ https://github.com/jquery/jquery/commit/1fb2f92.
+ */
+ testCheckboxClick(function () {
+ if (!this.checked && !$.event.special.click) {
+ $.event.special.click = {
+ trigger: function () {
+ if ($.nodeName(this, 'input') && this.type === 'checkbox' && this.click) {
+ this.click();
+ return false;
+ }
+ }
+ };
+ }
+ });
+
+ // Try again to verify that the patch took effect or blow up.
+ testCheckboxClick(function () {
+ (true && (0, _emberDebug.warn)('clicked checkboxes should be checked! the jQuery patch didn\'t work', this.checked, { id: 'ember-testing.test-checkbox-click' }));
+ });
+ });
+ }
+});
+enifed('ember-testing/test', ['exports', 'ember-testing/test/helpers', 'ember-testing/test/on_inject_helpers', 'ember-testing/test/promise', 'ember-testing/test/waiters', 'ember-testing/test/adapter'], function (exports, _helpers, _on_inject_helpers, _promise, _waiters, _adapter) {
+ 'use strict';
+
+ /**
+ This is a container for an assortment of testing related functionality:
+
+ * Choose your default test adapter (for your framework of choice).
+ * Register/Unregister additional test helpers.
+ * Setup callbacks to be fired when the test helpers are injected into
+ your application.
+
+ @class Test
+ @namespace Ember
+ @public
+ */
+ var Test = {
+ /**
+ Hash containing all known test helpers.
+ @property _helpers
+ @private
+ @since 1.7.0
+ */
+ _helpers: _helpers.helpers,
+
+ registerHelper: _helpers.registerHelper,
+ registerAsyncHelper: _helpers.registerAsyncHelper,
+ unregisterHelper: _helpers.unregisterHelper,
+ onInjectHelpers: _on_inject_helpers.onInjectHelpers,
+ Promise: _promise.default,
+ promise: _promise.promise,
+ resolve: _promise.resolve,
+ registerWaiter: _waiters.registerWaiter,
+ unregisterWaiter: _waiters.unregisterWaiter,
+ checkWaiters: _waiters.checkWaiters
+ };
+
+ /**
+ Used to allow ember-testing to communicate with a specific testing
+ framework.
+
+ You can manually set it before calling `App.setupForTesting()`.
+
+ Example:
+
+ ```javascript
+ Ember.Test.adapter = MyCustomAdapter.create()
+ ```
+
+ If you do not set it, ember-testing will default to `Ember.Test.QUnitAdapter`.
+
+ @public
+ @for Ember.Test
+ @property adapter
+ @type {Class} The adapter to be used.
+ @default Ember.Test.QUnitAdapter
+ */
+ /**
+ @module ember
+ */
+ Object.defineProperty(Test, 'adapter', {
+ get: _adapter.getAdapter,
+ set: _adapter.setAdapter
+ });
+
+ exports.default = Test;
+});
+enifed('ember-testing/test/adapter', ['exports', 'ember-console', 'ember-metal'], function (exports, _emberConsole, _emberMetal) {
+ 'use strict';
+
+ exports.getAdapter = getAdapter;
+ exports.setAdapter = setAdapter;
+ exports.asyncStart = asyncStart;
+ exports.asyncEnd = asyncEnd;
+
+
+ var adapter = void 0;
+ function getAdapter() {
+ return adapter;
+ }
+
+ function setAdapter(value) {
+ adapter = value;
+ if (value && typeof value.exception === 'function') {
+ (0, _emberMetal.setDispatchOverride)(adapterDispatch);
+ } else {
+ (0, _emberMetal.setDispatchOverride)(null);
+ }
+ }
+
+ function asyncStart() {
+ if (adapter) {
+ adapter.asyncStart();
+ }
+ }
+
+ function asyncEnd() {
+ if (adapter) {
+ adapter.asyncEnd();
+ }
+ }
+
+ function adapterDispatch(error) {
+ adapter.exception(error);
+ _emberConsole.default.error(error.stack);
+ }
+});
+enifed('ember-testing/test/helpers', ['exports', 'ember-testing/test/promise'], function (exports, _promise) {
+ 'use strict';
+
+ exports.helpers = undefined;
+ exports.registerHelper = registerHelper;
+ exports.registerAsyncHelper = registerAsyncHelper;
+ exports.unregisterHelper = unregisterHelper;
+ var helpers = exports.helpers = {};
+ /**
+ @module @ember/test
+ */
+
+ /**
+ `registerHelper` is used to register a test helper that will be injected
+ when `App.injectTestHelpers` is called.
+
+ The helper method will always be called with the current Application as
+ the first parameter.
+
+ For example:
+
+ ```javascript
+ import { registerHelper } from '@ember/test';
+ import { run } from '@ember/runloop';
+
+ registerHelper('boot', function(app) {
+ run(app, app.advanceReadiness);
+ });
+ ```
+
+ This helper can later be called without arguments because it will be
+ called with `app` as the first parameter.
+
+ ```javascript
+ import Application from '@ember/application';
+
+ App = Application.create();
+ App.injectTestHelpers();
+ boot();
+ ```
+
+ @public
+ @for @ember/test
+ @static
+ @method registerHelper
+ @param {String} name The name of the helper method to add.
+ @param {Function} helperMethod
+ @param options {Object}
+ */
+ function registerHelper(name, helperMethod) {
+ helpers[name] = {
+ method: helperMethod,
+ meta: { wait: false }
+ };
+ }
+
+ /**
+ `registerAsyncHelper` is used to register an async test helper that will be injected
+ when `App.injectTestHelpers` is called.
+
+ The helper method will always be called with the current Application as
+ the first parameter.
+
+ For example:
+
+ ```javascript
+ import { registerAsyncHelper } from '@ember/test';
+ import { run } from '@ember/runloop';
+
+ registerAsyncHelper('boot', function(app) {
+ run(app, app.advanceReadiness);
+ });
+ ```
+
+ The advantage of an async helper is that it will not run
+ until the last async helper has completed. All async helpers
+ after it will wait for it complete before running.
+
+
+ For example:
+
+ ```javascript
+ import { registerAsyncHelper } from '@ember/test';
+
+ registerAsyncHelper('deletePost', function(app, postId) {
+ click('.delete-' + postId);
+ });
+
+ // ... in your test
+ visit('/post/2');
+ deletePost(2);
+ visit('/post/3');
+ deletePost(3);
+ ```
+
+ @public
+ @for @ember/test
+ @method registerAsyncHelper
+ @param {String} name The name of the helper method to add.
+ @param {Function} helperMethod
+ @since 1.2.0
+ */
+ function registerAsyncHelper(name, helperMethod) {
+ helpers[name] = {
+ method: helperMethod,
+ meta: { wait: true }
+ };
+ }
+
+ /**
+ Remove a previously added helper method.
+
+ Example:
+
+ ```javascript
+ import { unregisterHelper } from '@ember/test';
+
+ unregisterHelper('wait');
+ ```
+
+ @public
+ @method unregisterHelper
+ @static
+ @for @ember/test
+ @param {String} name The helper to remove.
+ */
+ function unregisterHelper(name) {
+ delete helpers[name];
+ delete _promise.default.prototype[name];
+ }
+});
+enifed("ember-testing/test/on_inject_helpers", ["exports"], function (exports) {
+ "use strict";
+
+ exports.onInjectHelpers = onInjectHelpers;
+ exports.invokeInjectHelpersCallbacks = invokeInjectHelpersCallbacks;
+ var callbacks = exports.callbacks = [];
+
+ /**
+ Used to register callbacks to be fired whenever `App.injectTestHelpers`
+ is called.
+
+ The callback will receive the current application as an argument.
+
+ Example:
+
+ ```javascript
+ import $ from 'jquery';
+
+ Ember.Test.onInjectHelpers(function() {
+ $(document).ajaxSend(function() {
+ Test.pendingRequests++;
+ });
+
+ $(document).ajaxComplete(function() {
+ Test.pendingRequests--;
+ });
+ });
+ ```
+
+ @public
+ @for Ember.Test
+ @method onInjectHelpers
+ @param {Function} callback The function to be called.
+ */
+ function onInjectHelpers(callback) {
+ callbacks.push(callback);
+ }
+
+ function invokeInjectHelpersCallbacks(app) {
+ for (var i = 0; i < callbacks.length; i++) {
+ callbacks[i](app);
+ }
+ }
+});
+enifed("ember-testing/test/pending_requests", ["exports"], function (exports) {
+ "use strict";
+
+ exports.pendingRequests = pendingRequests;
+ exports.clearPendingRequests = clearPendingRequests;
+ exports.incrementPendingRequests = incrementPendingRequests;
+ exports.decrementPendingRequests = decrementPendingRequests;
+ var requests = [];
+
+ function pendingRequests() {
+ return requests.length;
+ }
+
+ function clearPendingRequests() {
+ requests.length = 0;
+ }
+
+ function incrementPendingRequests(_, xhr) {
+ requests.push(xhr);
+ }
+
+ function decrementPendingRequests(_, xhr) {
+ for (var i = 0; i < requests.length; i++) {
+ if (xhr === requests[i]) {
+ requests.splice(i, 1);
+ break;
+ }
+ }
+ }
+});
+enifed('ember-testing/test/promise', ['exports', 'ember-babel', 'ember-runtime', 'ember-testing/test/run'], function (exports, _emberBabel, _emberRuntime, _run) {
+ 'use strict';
+
+ exports.promise = promise;
+ exports.resolve = resolve;
+ exports.getLastPromise = getLastPromise;
+
+
+ var lastPromise = void 0;
+
+ var TestPromise = function (_RSVP$Promise) {
+ (0, _emberBabel.inherits)(TestPromise, _RSVP$Promise);
+
+ function TestPromise() {
+ (0, _emberBabel.classCallCheck)(this, TestPromise);
+
+ var _this = (0, _emberBabel.possibleConstructorReturn)(this, _RSVP$Promise.apply(this, arguments));
+
+ lastPromise = _this;
+ return _this;
+ }
+
+ TestPromise.prototype.then = function then(_onFulfillment) {
+ var _RSVP$Promise$prototy;
+
+ var onFulfillment = typeof _onFulfillment === 'function' ? function (result) {
+ return isolate(_onFulfillment, result);
+ } : undefined;
+
+ for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ args[_key - 1] = arguments[_key];
+ }
+
+ return (_RSVP$Promise$prototy = _RSVP$Promise.prototype.then).call.apply(_RSVP$Promise$prototy, [this, onFulfillment].concat(args));
+ };
+
+ return TestPromise;
+ }(_emberRuntime.RSVP.Promise);
+
+ exports.default = TestPromise;
+
+
+ /**
+ This returns a thenable tailored for testing. It catches failed
+ `onSuccess` callbacks and invokes the `Ember.Test.adapter.exception`
+ callback in the last chained then.
+
+ This method should be returned by async helpers such as `wait`.
+
+ @public
+ @for Ember.Test
+ @method promise
+ @param {Function} resolver The function used to resolve the promise.
+ @param {String} label An optional string for identifying the promise.
+ */
+ function promise(resolver, label) {
+ var fullLabel = 'Ember.Test.promise: ' + (label || '<Unknown Promise>');
+ return new TestPromise(resolver, fullLabel);
+ }
+
+ /**
+ Replacement for `Ember.RSVP.resolve`
+ The only difference is this uses
+ an instance of `Ember.Test.Promise`
+
+ @public
+ @for Ember.Test
+ @method resolve
+ @param {Mixed} The value to resolve
+ @since 1.2.0
+ */
+ function resolve(result, label) {
+ return TestPromise.resolve(result, label);
+ }
+
+ function getLastPromise() {
+ return lastPromise;
+ }
+
+ // This method isolates nested async methods
+ // so that they don't conflict with other last promises.
+ //
+ // 1. Set `Ember.Test.lastPromise` to null
+ // 2. Invoke method
+ // 3. Return the last promise created during method
+ function isolate(onFulfillment, result) {
+ // Reset lastPromise for nested helpers
+ lastPromise = null;
+
+ var value = onFulfillment(result);
+
+ var promise = lastPromise;
+ lastPromise = null;
+
+ // If the method returned a promise
+ // return that promise. If not,
+ // return the last async helper's promise
+ if (value && value instanceof TestPromise || !promise) {
+ return value;
+ } else {
+ return (0, _run.default)(function () {
+ return resolve(promise).then(function () {
+ return value;
+ });
+ });
+ }
+ }
+});
+enifed('ember-testing/test/run', ['exports', 'ember-metal'], function (exports, _emberMetal) {
+ 'use strict';
+
+ exports.default = run;
+ function run(fn) {
+ if (!_emberMetal.run.currentRunLoop) {
+ return (0, _emberMetal.run)(fn);
+ } else {
+ return fn();
+ }
+ }
+});
+enifed("ember-testing/test/waiters", ["exports"], function (exports) {
+ "use strict";
+
+ exports.registerWaiter = registerWaiter;
+ exports.unregisterWaiter = unregisterWaiter;
+ exports.checkWaiters = checkWaiters;
+ /**
+ @module @ember/test
+ */
+ var contexts = [];
+ var callbacks = [];
+
+ /**
+ This allows ember-testing to play nicely with other asynchronous
+ events, such as an application that is waiting for a CSS3
+ transition or an IndexDB transaction. The waiter runs periodically
+ after each async helper (i.e. `click`, `andThen`, `visit`, etc) has executed,
+ until the returning result is truthy. After the waiters finish, the next async helper
+ is executed and the process repeats.
+
+ For example:
+
+ ```javascript
+ import { registerWaiter } from '@ember/test';
+
+ registerWaiter(function() {
+ return myPendingTransactions() == 0;
+ });
+ ```
+ The `context` argument allows you to optionally specify the `this`
+ with which your callback will be invoked.
+
+ For example:
+
+ ```javascript
+ import { registerWaiter } from '@ember/test';
+
+ registerWaiter(MyDB, MyDB.hasPendingTransactions);
+ ```
+
+ @public
+ @for @ember/test
+ @static
+ @method registerWaiter
+ @param {Object} context (optional)
+ @param {Function} callback
+ @since 1.2.0
+ */
+ function registerWaiter(context, callback) {
+ if (arguments.length === 1) {
+ callback = context;
+ context = null;
+ }
+ if (indexOf(context, callback) > -1) {
+ return;
+ }
+ contexts.push(context);
+ callbacks.push(callback);
+ }
+
+ /**
+ `unregisterWaiter` is used to unregister a callback that was
+ registered with `registerWaiter`.
+
+ @public
+ @for @ember/test
+ @static
+ @method unregisterWaiter
+ @param {Object} context (optional)
+ @param {Function} callback
+ @since 1.2.0
+ */
+ function unregisterWaiter(context, callback) {
+ if (!callbacks.length) {
+ return;
+ }
+ if (arguments.length === 1) {
+ callback = context;
+ context = null;
+ }
+ var i = indexOf(context, callback);
+ if (i === -1) {
+ return;
+ }
+ contexts.splice(i, 1);
+ callbacks.splice(i, 1);
+ }
+
+ /**
+ Iterates through each registered test waiter, and invokes
+ its callback. If any waiter returns false, this method will return
+ true indicating that the waiters have not settled yet.
+
+ This is generally used internally from the acceptance/integration test
+ infrastructure.
+
+ @public
+ @for @ember/test
+ @static
+ @method checkWaiters
+ */
+ function checkWaiters() {
+ if (!callbacks.length) {
+ return false;
+ }
+ for (var i = 0; i < callbacks.length; i++) {
+ var context = contexts[i];
+ var callback = callbacks[i];
+ if (!callback.call(context)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ function indexOf(context, callback) {
+ for (var i = 0; i < callbacks.length; i++) {
+ if (callbacks[i] === callback && contexts[i] === context) {
+ return i;
+ }
+ }
+ return -1;
+ }
+});
+enifed('ember-utils', ['exports'], function (exports) {
+ 'use strict';
+
+ /**
+ Strongly hint runtimes to intern the provided string.
+
+ When do I need to use this function?
+
+ For the most part, never. Pre-mature optimization is bad, and often the
+ runtime does exactly what you need it to, and more often the trade-off isn't
+ worth it.
+
+ Why?
+
+ Runtimes store strings in at least 2 different representations:
+ Ropes and Symbols (interned strings). The Rope provides a memory efficient
+ data-structure for strings created from concatenation or some other string
+ manipulation like splitting.
+
+ Unfortunately checking equality of different ropes can be quite costly as
+ runtimes must resort to clever string comparison algorithms. These
+ algorithms typically cost in proportion to the length of the string.
+ Luckily, this is where the Symbols (interned strings) shine. As Symbols are
+ unique by their string content, equality checks can be done by pointer
+ comparison.
+
+ How do I know if my string is a rope or symbol?
+
+ Typically (warning general sweeping statement, but truthy in runtimes at
+ present) static strings created as part of the JS source are interned.
+ Strings often used for comparisons can be interned at runtime if some
+ criteria are met. One of these criteria can be the size of the entire rope.
+ For example, in chrome 38 a rope longer then 12 characters will not
+ intern, nor will segments of that rope.
+
+ Some numbers: http://jsperf.com/eval-vs-keys/8
+
+ Known Trick™
+
+ @private
+ @return {String} interned version of the provided string
+ */
+ function intern(str) {
+ var obj = {};
+ obj[str] = 1;
+ for (var key in obj) {
+ if (key === str) {
+ return key;
+ }
+ }
+ return str;
+ }
+
+ /**
+ @module @ember/object
+ */
+
+ /**
+ Previously we used `Ember.$.uuid`, however `$.uuid` has been removed from
+ jQuery master. We'll just bootstrap our own uuid now.
+
+ @private
+ @return {Number} the uuid
+ */
+ var _uuid = 0;
+
+ /**
+ Generates a universally unique identifier. This method
+ is used internally by Ember for assisting with
+ the generation of GUID's and other unique identifiers.
+
+ @public
+ @return {Number} [description]
+ */
+ function uuid() {
+ return ++_uuid;
+ }
+
+ /**
+ Prefix used for guids through out Ember.
+ @private
+ @property GUID_PREFIX
+ @for Ember
+ @type String
+ @final
+ */
+ var GUID_PREFIX = 'ember';
+
+ // Used for guid generation...
+ var numberCache = [];
+ var stringCache = {};
+
+ /**
+ A unique key used to assign guids and other private metadata to objects.
+ If you inspect an object in your browser debugger you will often see these.
+ They can be safely ignored.
+
+ On browsers that support it, these properties are added with enumeration
+ disabled so they won't show up when you iterate over your properties.
+
+ @private
+ @property GUID_KEY
+ @for Ember
+ @type String
+ @final
+ */
+ var GUID_KEY = intern('__ember' + +new Date());
+
+ var GUID_DESC = {
+ writable: true,
+ configurable: true,
+ enumerable: false,
+ value: null
+ };
+
+ var nullDescriptor = {
+ configurable: true,
+ writable: true,
+ enumerable: false,
+ value: null
+ };
+
+ var GUID_KEY_PROPERTY = {
+ name: GUID_KEY,
+ descriptor: nullDescriptor
+ };
+
+ /**
+ Generates a new guid, optionally saving the guid to the object that you
+ pass in. You will rarely need to use this method. Instead you should
+ call `guidFor(obj)`, which return an existing guid if available.
+
+ @private
+ @method generateGuid
+ @static
+ @for @ember/object/internals
+ @param {Object} [obj] Object the guid will be used for. If passed in, the guid will
+ be saved on the object and reused whenever you pass the same object
+ again.
+
+ If no object is passed, just generate a new guid.
+ @param {String} [prefix] Prefix to place in front of the guid. Useful when you want to
+ separate the guid into separate namespaces.
+ @return {String} the guid
+ */
+ function generateGuid(obj) {
+ var prefix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : GUID_PREFIX;
+
+ var ret = prefix + uuid();
+ if (obj !== undefined && obj !== null) {
+ if (obj[GUID_KEY] === null) {
+ obj[GUID_KEY] = ret;
+ } else {
+ GUID_DESC.value = ret;
+ if (obj.__defineNonEnumerable) {
+ obj.__defineNonEnumerable(GUID_KEY_PROPERTY);
+ } else {
+ Object.defineProperty(obj, GUID_KEY, GUID_DESC);
+ }
+ }
+ }
+ return ret;
+ }
+
+ /**
+ Returns a unique id for the object. If the object does not yet have a guid,
+ one will be assigned to it. You can call this on any object,
+ `EmberObject`-based or not, but be aware that it will add a `_guid`
+ property.
+
+ You can also use this method on DOM Element objects.
+
+ @public
+ @static
+ @method guidFor
+ @for @ember/object/internals
+ @param {Object} obj any object, string, number, Element, or primitive
+ @return {String} the unique guid for this instance.
+ */
+ function guidFor(obj) {
+ // special cases where we don't want to add a key to object
+ if (obj === undefined) {
+ return '(undefined)';
+ }
+
+ if (obj === null) {
+ return '(null)';
+ }
+
+ var type = typeof obj;
+ if ((type === 'object' || type === 'function') && obj[GUID_KEY]) {
+ return obj[GUID_KEY];
+ }
+
+ var ret = void 0;
+ // Don't allow prototype changes to String etc. to change the guidFor
+ switch (type) {
+ case 'number':
+ ret = numberCache[obj];
+
+ if (!ret) {
+ ret = numberCache[obj] = 'nu' + obj;
+ }
+
+ return ret;
+
+ case 'string':
+ ret = stringCache[obj];
+
+ if (!ret) {
+ ret = stringCache[obj] = 'st' + uuid();
+ }
+
+ return ret;
+
+ case 'boolean':
+ return obj ? '(true)' : '(false)';
+
+ default:
+ if (obj === Object) {
+ return '(Object)';
+ }
+
+ if (obj === Array) {
+ return '(Array)';
+ }
+
+ return generateGuid(obj);
+ }
+ }
+
+ function symbol(debugName) {
+ // TODO: Investigate using platform symbols, but we do not
+ // want to require non-enumerability for this API, which
+ // would introduce a large cost.
+ var id = GUID_KEY + Math.floor(Math.random() * new Date());
+ return intern('__' + debugName + id + '__');
+ }
+
+ /**
+ @module @ember/application
+ */
+
+ var OWNER = symbol('OWNER');
+
+ /**
+ Framework objects in an Ember application (components, services, routes, etc.)
+ are created via a factory and dependency injection system. Each of these
+ objects is the responsibility of an "owner", which handled its
+ instantiation and manages its lifetime.
+
+ `getOwner` fetches the owner object responsible for an instance. This can
+ be used to lookup or resolve other class instances, or register new factories
+ into the owner.
+
+ For example, this component dynamically looks up a service based on the
+ `audioType` passed as an attribute:
+
+ ```app/components/play-audio.js
+ import Component from '@ember/component';
+ import { computed } from '@ember/object';
+ import { getOwner } from '@ember/application';
+
+ // Usage:
+ //
+ // {{play-audio audioType=model.audioType audioFile=model.file}}
+ //
+ export default Component.extend({
+ audioService: computed('audioType', function() {
+ let owner = getOwner(this);
+ return owner.lookup(`service:${this.get('audioType')}`);
+ }),
+
+ click() {
+ let player = this.get('audioService');
+ player.play(this.get('audioFile'));
+ }
+ });
+ ```
+
+ @method getOwner
+ @static
+ @for @ember/application
+ @param {Object} object An object with an owner.
+ @return {Object} An owner object.
+ @since 2.3.0
+ @public
+ */
+ function getOwner(object) {
+ return object[OWNER];
+ }
+
+ /**
+ `setOwner` forces a new owner on a given object instance. This is primarily
+ useful in some testing cases.
+
+ @method setOwner
+ @static
+ @for @ember/application
+ @param {Object} object An object instance.
+ @param {Object} object The new owner object of the object instance.
+ @since 2.3.0
+ @public
+ */
+ function setOwner(object, owner) {
+ object[OWNER] = owner;
+ }
+
+ /**
+ @module @ember/polyfills
+ */
+ /**
+ Copy properties from a source object to a target object.
+
+ ```javascript
+ import { assign } from '@ember/polyfills';
+
+ var a = { first: 'Yehuda' };
+ var b = { last: 'Katz' };
+ var c = { company: 'Tilde Inc.' };
+ assign(a, b, c); // a === { first: 'Yehuda', last: 'Katz', company: 'Tilde Inc.' }, b === { last: 'Katz' }, c === { company: 'Tilde Inc.' }
+ ```
+
+ @method assign
+ @for @ember/polyfills
+ @param {Object} original The object to assign into
+ @param {Object} ...args The objects to copy properties from
+ @return {Object}
+ @public
+ @static
+ */
+ function assign(original) {
+ for (var i = 1; i < arguments.length; i++) {
+ var arg = arguments[i];
+ if (!arg) {
+ continue;
+ }
+
+ var updates = Object.keys(arg);
+
+ for (var _i = 0; _i < updates.length; _i++) {
+ var prop = updates[_i];
+ original[prop] = arg[prop];
+ }
+ }
+
+ return original;
+ }
+
+ var assign$1 = Object.assign || assign;
+
+ // the delete is meant to hint at runtimes that this object should remain in
+ // dictionary mode. This is clearly a runtime specific hack, but currently it
+ // appears worthwhile in some usecases. Please note, these deletes do increase
+ // the cost of creation dramatically over a plain Object.create. And as this
+ // only makes sense for long-lived dictionaries that aren't instantiated often.
+ function makeDictionary(parent) {
+ var dict = Object.create(parent);
+ dict['_dict'] = null;
+ delete dict['_dict'];
+ return dict;
+ }
+
+ var HAS_SUPER_PATTERN = /\.(_super|call\(this|apply\(this)/;
+ var fnToString = Function.prototype.toString;
+
+ var checkHasSuper = function () {
+ var sourceAvailable = fnToString.call(function () {
+ return this;
+ }).indexOf('return this') > -1;
+
+ if (sourceAvailable) {
+ return function checkHasSuper(func) {
+ return HAS_SUPER_PATTERN.test(fnToString.call(func));
+ };
+ }
+
+ return function checkHasSuper() {
+ return true;
+ };
+ }();
+
+ function ROOT() {}
+ ROOT.__hasSuper = false;
+
+ function hasSuper(func) {
+ if (func.__hasSuper === undefined) {
+ func.__hasSuper = checkHasSuper(func);
+ }
+ return func.__hasSuper;
+ }
+
+ /**
+ Wraps the passed function so that `this._super` will point to the superFunc
+ when the function is invoked. This is the primitive we use to implement
+ calls to super.
+
+ @private
+ @method wrap
+ @for Ember
+ @param {Function} func The function to call
+ @param {Function} superFunc The super function.
+ @return {Function} wrapped function.
+ */
+ function wrap(func, superFunc) {
+ if (!hasSuper(func)) {
+ return func;
+ }
+ // ensure an unwrapped super that calls _super is wrapped with a terminal _super
+ if (!superFunc.wrappedFunction && hasSuper(superFunc)) {
+ return _wrap(func, _wrap(superFunc, ROOT));
+ }
+ return _wrap(func, superFunc);
+ }
+
+ function _wrap(func, superFunc) {
+ function superWrapper() {
+ var orig = this._super;
+ this._super = superFunc;
+ var ret = func.apply(this, arguments);
+ this._super = orig;
+ return ret;
+ }
+
+ superWrapper.wrappedFunction = func;
+ superWrapper.__ember_observes__ = func.__ember_observes__;
+ superWrapper.__ember_observesBefore__ = func.__ember_observesBefore__;
+ superWrapper.__ember_listens__ = func.__ember_listens__;
+
+ return superWrapper;
+ }
+
+ var objectToString = Object.prototype.toString;
+ /**
+ @module @ember/debug
+ */
+ /**
+ Convenience method to inspect an object. This method will attempt to
+ convert the object into a useful string description.
+
+ It is a pretty simple implementation. If you want something more robust,
+ use something like JSDump: https://github.com/NV/jsDump
+
+ @method inspect
+ @static
+ @param {Object} obj The object you want to inspect.
+ @return {String} A description of the object
+ @since 1.4.0
+ @private
+ */
+ function inspect(obj) {
+ if (obj === null) {
+ return 'null';
+ }
+ if (obj === undefined) {
+ return 'undefined';
+ }
+ if (Array.isArray(obj)) {
+ return '[' + obj + ']';
+ }
+ // for non objects
+ var type = typeof obj;
+ if (type !== 'object' && type !== 'symbol') {
+ return '' + obj;
+ }
+ // overridden toString
+ if (typeof obj.toString === 'function' && obj.toString !== objectToString) {
+ return obj.toString();
+ }
+
+ // Object.prototype.toString === {}.toString
+ var v = void 0;
+ var ret = [];
+ for (var key in obj) {
+ if (obj.hasOwnProperty(key)) {
+ v = obj[key];
+ if (v === 'toString') {
+ continue;
+ } // ignore useless items
+ if (typeof v === 'function') {
+ v = 'function() { ... }';
+ }
+
+ if (v && typeof v.toString !== 'function') {
+ ret.push(key + ': ' + objectToString.call(v));
+ } else {
+ ret.push(key + ': ' + v);
+ }
+ }
+ }
+ return '{' + ret.join(', ') + '}';
+ }
+
+ function lookupDescriptor(obj, keyName) {
+ var current = obj;
+ while (current) {
+ var descriptor = Object.getOwnPropertyDescriptor(current, keyName);
+
+ if (descriptor) {
+ return descriptor;
+ }
+
+ current = Object.getPrototypeOf(current);
+ }
+
+ return null;
+ }
+
+ /**
+ @param {Object} t target
+ @param {String} m method
+ @param {Array} a args
+ @private
+ */
+ function applyStr(t, m, a) {
+ var l = a && a.length;
+ if (!a || !l) {
+ return t[m]();
+ }
+ switch (l) {
+ case 1:
+ return t[m](a[0]);
+ case 2:
+ return t[m](a[0], a[1]);
+ case 3:
+ return t[m](a[0], a[1], a[2]);
+ case 4:
+ return t[m](a[0], a[1], a[2], a[3]);
+ case 5:
+ return t[m](a[0], a[1], a[2], a[3], a[4]);
+ default:
+ return t[m].apply(t, a);
+ }
+ }
+
+ /**
+ Checks to see if the `methodName` exists on the `obj`.
+
+ ```javascript
+ let foo = { bar: function() { return 'bar'; }, baz: null };
+
+ Ember.canInvoke(foo, 'bar'); // true
+ Ember.canInvoke(foo, 'baz'); // false
+ Ember.canInvoke(foo, 'bat'); // false
+ ```
+
+ @method canInvoke
+ @for Ember
+ @param {Object} obj The object to check for the method
+ @param {String} methodName The method name to check for
+ @return {Boolean}
+ @private
+ */
+ function canInvoke(obj, methodName) {
+ return obj !== null && obj !== undefined && typeof obj[methodName] === 'function';
+ }
+
+ /**
+ @module @ember/utils
+ */
+
+ /**
+ Checks to see if the `methodName` exists on the `obj`,
+ and if it does, invokes it with the arguments passed.
+
+ ```javascript
+ import { tryInvoke } from '@ember/utils';
+
+ let d = new Date('03/15/2013');
+
+ tryInvoke(d, 'getTime'); // 1363320000000
+ tryInvoke(d, 'setFullYear', [2014]); // 1394856000000
+ tryInvoke(d, 'noSuchMethod', [2014]); // undefined
+ ```
+
+ @method tryInvoke
+ @for @ember/utils
+ @static
+ @param {Object} obj The object to check for the method
+ @param {String} methodName The method name to check for
+ @param {Array} [args] The arguments to pass to the method
+ @return {*} the return value of the invoked method or undefined if it cannot be invoked
+ @public
+ */
+ function tryInvoke(obj, methodName, args) {
+ if (canInvoke(obj, methodName)) {
+ return applyStr(obj, methodName, args);
+ }
+ }
+
+ var isArray = Array.isArray;
+
+ /**
+ @module @ember/array
+ */
+ /**
+ Forces the passed object to be part of an array. If the object is already
+ an array, it will return the object. Otherwise, it will add the object to
+ an array. If obj is `null` or `undefined`, it will return an empty array.
+
+ ```javascript
+ import { makeArray } from '@ember/array';
+ import ArrayProxy from '@ember/array/proxy';
+
+ makeArray(); // []
+ makeArray(null); // []
+ makeArray(undefined); // []
+ makeArray('lindsay'); // ['lindsay']
+ makeArray([1, 2, 42]); // [1, 2, 42]
+
+ let controller = ArrayProxy.create({ content: [] });
+
+ makeArray(controller) === controller; // true
+ ```
+
+ @method makeArray
+ @static
+ @for @ember/array
+ @param {Object} obj the object
+ @return {Array}
+ @private
+ */
+ function makeArray(obj) {
+ if (obj === null || obj === undefined) {
+ return [];
+ }
+ return isArray(obj) ? obj : [obj];
+ }
+
+ var name = symbol('NAME_KEY');
+
+ var objectToString$1 = Object.prototype.toString;
+
+ function isNone(obj) {
+ return obj === null || obj === undefined;
+ }
+
+ /*
+ A `toString` util function that supports objects without a `toString`
+ method, e.g. an object created with `Object.create(null)`.
+ */
+ function toString(obj) {
+ var type = typeof obj;
+ if (type === "string") {
+ return obj;
+ }
+
+ if (Array.isArray(obj)) {
+ // Reimplement Array.prototype.join according to spec (22.1.3.13)
+ // Changing ToString(element) with this safe version of ToString.
+ var len = obj.length;
+ var r = '';
+
+ for (var k = 0; k < len; k++) {
+ if (k > 0) {
+ r += ',';
+ }
+
+ if (!isNone(obj[k])) {
+ r += toString(obj[k]);
+ }
+ }
+
+ return r;
+ } else if (obj != null && typeof obj.toString === 'function') {
+ return obj.toString();
+ } else {
+ return objectToString$1.call(obj);
+ }
+ }
+
+ var HAS_NATIVE_PROXY = typeof Proxy === 'function';
+
+ /*
+ This package will be eagerly parsed and should have no dependencies on external
+ packages.
+
+ It is intended to be used to share utility methods that will be needed
+ by every Ember application (and is **not** a dumping ground of useful utilities).
+
+ Utility methods that are needed in < 80% of cases should be placed
+ elsewhere (so they can be lazily evaluated / parsed).
+ */
+
+ exports.symbol = symbol;
+ exports.getOwner = getOwner;
+ exports.setOwner = setOwner;
+ exports.OWNER = OWNER;
+ exports.assign = assign$1;
+ exports.assignPolyfill = assign;
+ exports.dictionary = makeDictionary;
+ exports.uuid = uuid;
+ exports.GUID_KEY = GUID_KEY;
+ exports.GUID_DESC = GUID_DESC;
+ exports.GUID_KEY_PROPERTY = GUID_KEY_PROPERTY;
+ exports.generateGuid = generateGuid;
+ exports.guidFor = guidFor;
+ exports.intern = intern;
+ exports.checkHasSuper = checkHasSuper;
+ exports.ROOT = ROOT;
+ exports.wrap = wrap;
+ exports.inspect = inspect;
+ exports.lookupDescriptor = lookupDescriptor;
+ exports.canInvoke = canInvoke;
+ exports.tryInvoke = tryInvoke;
+ exports.makeArray = makeArray;
+ exports.applyStr = applyStr;
+ exports.NAME_KEY = name;
+ exports.toString = toString;
+ exports.HAS_NATIVE_PROXY = HAS_NATIVE_PROXY;
+});
+enifed('ember-views/compat/attrs', ['exports', 'ember-utils'], function (exports, _emberUtils) {
+ 'use strict';
+
+ exports.MUTABLE_CELL = undefined;
+ var MUTABLE_CELL = exports.MUTABLE_CELL = (0, _emberUtils.symbol)('MUTABLE_CELL');
+});
+enifed('ember-views/compat/fallback-view-registry', ['exports', 'ember-utils'], function (exports, _emberUtils) {
+ 'use strict';
+
+ exports.default = (0, _emberUtils.dictionary)(null);
+});
+enifed('ember-views/component_lookup', ['exports', 'ember-debug', 'ember-runtime'], function (exports, _emberDebug, _emberRuntime) {
+ 'use strict';
+
+ exports.default = _emberRuntime.Object.extend({
+ componentFor: function (name, owner, options) {
+ (true && !(~name.indexOf('-')) && (0, _emberDebug.assert)('You cannot use \'' + name + '\' as a component name. Component names must contain a hyphen.', ~name.indexOf('-')));
+
+ var fullName = 'component:' + name;
+ return owner.factoryFor(fullName, options);
+ },
+ layoutFor: function (name, owner, options) {
+ (true && !(~name.indexOf('-')) && (0, _emberDebug.assert)('You cannot use \'' + name + '\' as a component name. Component names must contain a hyphen.', ~name.indexOf('-')));
+
+
+ var templateFullName = 'template:components/' + name;
+ return owner.lookup(templateFullName, options);
+ }
+ });
+});
+enifed('ember-views/index', ['exports', 'ember-views/system/jquery', 'ember-views/system/utils', 'ember-views/system/event_dispatcher', 'ember-views/component_lookup', 'ember-views/mixins/text_support', 'ember-views/views/core_view', 'ember-views/mixins/class_names_support', 'ember-views/mixins/child_views_support', 'ember-views/mixins/view_state_support', 'ember-views/mixins/view_support', 'ember-views/mixins/action_support', 'ember-views/compat/attrs', 'ember-views/system/lookup_partial', 'ember-views/utils/lookup-component', 'ember-views/system/action_manager', 'ember-views/compat/fallback-view-registry', 'ember-views/system/ext'], function (exports, _jquery, _utils, _event_dispatcher, _component_lookup, _text_support, _core_view, _class_names_support, _child_views_support, _view_state_support, _view_support, _action_support, _attrs, _lookup_partial, _lookupComponent, _action_manager, _fallbackViewRegistry) {
+ 'use strict';
+
+ exports.fallbackViewRegistry = exports.ActionManager = exports.lookupComponent = exports.hasPartial = exports.lookupPartial = exports.MUTABLE_CELL = exports.ActionSupport = exports.ViewMixin = exports.ViewStateSupport = exports.ChildViewsSupport = exports.ClassNamesSupport = exports.CoreView = exports.TextSupport = exports.ComponentLookup = exports.EventDispatcher = exports.constructStyleDeprecationMessage = exports.setViewElement = exports.getViewElement = exports.getViewId = exports.getChildViews = exports.getRootViews = exports.getViewBoundingClientRect = exports.getViewClientRects = exports.getViewBounds = exports.isSimpleClick = exports.jQuery = undefined;
+ Object.defineProperty(exports, 'jQuery', {
+ enumerable: true,
+ get: function () {
+ return _jquery.default;
+ }
+ });
+ Object.defineProperty(exports, 'isSimpleClick', {
+ enumerable: true,
+ get: function () {
+ return _utils.isSimpleClick;
+ }
+ });
+ Object.defineProperty(exports, 'getViewBounds', {
+ enumerable: true,
+ get: function () {
+ return _utils.getViewBounds;
+ }
+ });
+ Object.defineProperty(exports, 'getViewClientRects', {
+ enumerable: true,
+ get: function () {
+ return _utils.getViewClientRects;
+ }
+ });
+ Object.defineProperty(exports, 'getViewBoundingClientRect', {
+ enumerable: true,
+ get: function () {
+ return _utils.getViewBoundingClientRect;
+ }
+ });
+ Object.defineProperty(exports, 'getRootViews', {
+ enumerable: true,
+ get: function () {
+ return _utils.getRootViews;
+ }
+ });
+ Object.defineProperty(exports, 'getChildViews', {
+ enumerable: true,
+ get: function () {
+ return _utils.getChildViews;
+ }
+ });
+ Object.defineProperty(exports, 'getViewId', {
+ enumerable: true,
+ get: function () {
+ return _utils.getViewId;
+ }
+ });
+ Object.defineProperty(exports, 'getViewElement', {
+ enumerable: true,
+ get: function () {
+ return _utils.getViewElement;
+ }
+ });
+ Object.defineProperty(exports, 'setViewElement', {
+ enumerable: true,
+ get: function () {
+ return _utils.setViewElement;
+ }
+ });
+ Object.defineProperty(exports, 'constructStyleDeprecationMessage', {
+ enumerable: true,
+ get: function () {
+ return _utils.constructStyleDeprecationMessage;
+ }
+ });
+ Object.defineProperty(exports, 'EventDispatcher', {
+ enumerable: true,
+ get: function () {
+ return _event_dispatcher.default;
+ }
+ });
+ Object.defineProperty(exports, 'ComponentLookup', {
+ enumerable: true,
+ get: function () {
+ return _component_lookup.default;
+ }
+ });
+ Object.defineProperty(exports, 'TextSupport', {
+ enumerable: true,
+ get: function () {
+ return _text_support.default;
+ }
+ });
+ Object.defineProperty(exports, 'CoreView', {
+ enumerable: true,
+ get: function () {
+ return _core_view.default;
+ }
+ });
+ Object.defineProperty(exports, 'ClassNamesSupport', {
+ enumerable: true,
+ get: function () {
+ return _class_names_support.default;
+ }
+ });
+ Object.defineProperty(exports, 'ChildViewsSupport', {
+ enumerable: true,
+ get: function () {
+ return _child_views_support.default;
+ }
+ });
+ Object.defineProperty(exports, 'ViewStateSupport', {
+ enumerable: true,
+ get: function () {
+ return _view_state_support.default;
+ }
+ });
+ Object.defineProperty(exports, 'ViewMixin', {
+ enumerable: true,
+ get: function () {
+ return _view_support.default;
+ }
+ });
+ Object.defineProperty(exports, 'ActionSupport', {
+ enumerable: true,
+ get: function () {
+ return _action_support.default;
+ }
+ });
+ Object.defineProperty(exports, 'MUTABLE_CELL', {
+ enumerable: true,
+ get: function () {
+ return _attrs.MUTABLE_CELL;
+ }
+ });
+ Object.defineProperty(exports, 'lookupPartial', {
+ enumerable: true,
+ get: function () {
+ return _lookup_partial.default;
+ }
+ });
+ Object.defineProperty(exports, 'hasPartial', {
+ enumerable: true,
+ get: function () {
+ return _lookup_partial.hasPartial;
+ }
+ });
+ Object.defineProperty(exports, 'lookupComponent', {
+ enumerable: true,
+ get: function () {
+ return _lookupComponent.default;
+ }
+ });
+ Object.defineProperty(exports, 'ActionManager', {
+ enumerable: true,
+ get: function () {
+ return _action_manager.default;
+ }
+ });
+ Object.defineProperty(exports, 'fallbackViewRegistry', {
+ enumerable: true,
+ get: function () {
+ return _fallbackViewRegistry.default;
+ }
+ });
+});
+enifed('ember-views/mixins/action_support', ['exports', 'ember-utils', 'ember-metal', 'ember-debug', 'ember-views/compat/attrs'], function (exports, _emberUtils, _emberMetal, _emberDebug, _attrs) {
+ 'use strict';
+
+ /**
+ @module ember
+ */
+ function validateAction(component, actionName) {
+ if (actionName && actionName[_attrs.MUTABLE_CELL]) {
+ actionName = actionName.value;
+ }
+
+ (true && !((0, _emberMetal.isNone)(actionName) || typeof actionName === 'string' || typeof actionName === 'function') && (0, _emberDebug.assert)('The default action was triggered on the component ' + component.toString() + ', but the action name (' + actionName + ') was not a string.', (0, _emberMetal.isNone)(actionName) || typeof actionName === 'string' || typeof actionName === 'function'));
+
+ return actionName;
+ }
+
+ /**
+ @class ActionSupport
+ @namespace Ember
+ @private
+ */
+ exports.default = _emberMetal.Mixin.create({
+ /**
+ Calls an action passed to a component.
+ For example a component for playing or pausing music may translate click events
+ into action notifications of "play" or "stop" depending on some internal state
+ of the component:
+ ```app/components/play-button.js
+ import Component from '@ember/component';
+ export default Component.extend({
+ click() {
+ if (this.get('isPlaying')) {
+ this.sendAction('play');
+ } else {
+ this.sendAction('stop');
+ }
+ }
+ });
+ ```
+ The actions "play" and "stop" must be passed to this `play-button` component:
+ ```handlebars
+ {{! app/templates/application.hbs }}
+ {{play-button play=(action "musicStarted") stop=(action "musicStopped")}}
+ ```
+ When the component receives a browser `click` event it translate this
+ interaction into application-specific semantics ("play" or "stop") and
+ calls the specified action.
+ ```app/controller/application.js
+ import Controller from '@ember/controller';
+ export default Controller.extend({
+ actions: {
+ musicStarted() {
+ // called when the play button is clicked
+ // and the music started playing
+ },
+ musicStopped() {
+ // called when the play button is clicked
+ // and the music stopped playing
+ }
+ }
+ });
+ ```
+ If no action is passed to `sendAction` a default name of "action"
+ is assumed.
+ ```app/components/next-button.js
+ import Component from '@ember/component';
+ export default Component.extend({
+ click() {
+ this.sendAction();
+ }
+ });
+ ```
+ ```handlebars
+ {{! app/templates/application.hbs }}
+ {{next-button action=(action "playNextSongInAlbum")}}
+ ```
+ ```app/controllers/application.js
+ import Controller from '@ember/controller';
+ export default Controller.extend({
+ actions: {
+ playNextSongInAlbum() {
+ ...
+ }
+ }
+ });
+ ```
+ @method sendAction
+ @param [action] {String} the action to call
+ @param [params] {*} arguments for the action
+ @public
+ */
+ sendAction: function (action) {
+ for (var _len = arguments.length, contexts = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ contexts[_key - 1] = arguments[_key];
+ }
+
+ var actionName = void 0;
+
+ // Send the default action
+ if (action === undefined) {
+ action = 'action';
+ }
+ actionName = (0, _emberMetal.get)(this, 'attrs.' + action) || (0, _emberMetal.get)(this, action);
+ actionName = validateAction(this, actionName);
+
+ // If no action name for that action could be found, just abort.
+ if (actionName === undefined) {
+ return;
+ }
+
+ if (typeof actionName === 'function') {
+ actionName.apply(undefined, contexts);
+ } else {
+ this.triggerAction({
+ action: actionName,
+ actionContext: contexts
+ });
+ }
+ },
+ send: function (actionName) {
+ for (var _len2 = arguments.length, args = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
+ args[_key2 - 1] = arguments[_key2];
+ }
+
+ var action = this.actions && this.actions[actionName];
+
+ if (action) {
+ var shouldBubble = action.apply(this, args) === true;
+ if (!shouldBubble) {
+ return;
+ }
+ }
+
+ var target = (0, _emberMetal.get)(this, 'target');
+ if (target) {
+ (true && !(typeof target.send === 'function') && (0, _emberDebug.assert)('The `target` for ' + this + ' (' + target + ') does not have a `send` method', typeof target.send === 'function'));
+
+ target.send.apply(target, arguments);
+ } else {
+ (true && !(action) && (0, _emberDebug.assert)((0, _emberUtils.inspect)(this) + ' had no action handler for: ' + actionName, action));
+ }
+ }
+ });
+});
+enifed('ember-views/mixins/child_views_support', ['exports', 'ember-utils', 'ember-metal', 'ember-views/system/utils'], function (exports, _emberUtils, _emberMetal, _utils) {
+ 'use strict';
+
+ exports.default = _emberMetal.Mixin.create({
+ init: function () {
+ this._super.apply(this, arguments);
+ (0, _utils.initChildViews)(this);
+ },
+
+
+ /**
+ Array of child views. You should never edit this array directly.
+ @property childViews
+ @type Array
+ @default []
+ @private
+ */
+ childViews: (0, _emberMetal.descriptor)({
+ configurable: false,
+ enumerable: false,
+ get: function () {
+ return (0, _utils.getChildViews)(this);
+ }
+ }),
+
+ appendChild: function (view) {
+ this.linkChild(view);
+ (0, _utils.addChildView)(this, view);
+ },
+ linkChild: function (instance) {
+ if (!(0, _emberUtils.getOwner)(instance)) {
+ (0, _emberUtils.setOwner)(instance, (0, _emberUtils.getOwner)(this));
+ }
+ }
+ });
+});
+enifed('ember-views/mixins/class_names_support', ['exports', 'ember-metal', 'ember-debug'], function (exports, _emberMetal, _emberDebug) {
+ 'use strict';
+
+ /**
+ @module ember
+ */
+
+ var EMPTY_ARRAY = Object.freeze([]);
+
+ /**
+ @class ClassNamesSupport
+ @namespace Ember
+ @private
+ */
+ exports.default = _emberMetal.Mixin.create({
+ concatenatedProperties: ['classNames', 'classNameBindings'],
+
+ init: function () {
+ this._super.apply(this, arguments);
+
+ (true && !((0, _emberMetal.descriptorFor)(this, 'classNameBindings') === undefined && Array.isArray(this.classNameBindings)) && (0, _emberDebug.assert)('Only arrays are allowed for \'classNameBindings\'', (0, _emberMetal.descriptorFor)(this, 'classNameBindings') === undefined && Array.isArray(this.classNameBindings)));
+ (true && !((0, _emberMetal.descriptorFor)(this, 'classNames') === undefined && Array.isArray(this.classNames)) && (0, _emberDebug.assert)('Only arrays of static class strings are allowed for \'classNames\'. For dynamic classes, use \'classNameBindings\'.', (0, _emberMetal.descriptorFor)(this, 'classNames') === undefined && Array.isArray(this.classNames)));
+ },
+
+
+ /**
+ Standard CSS class names to apply to the view's outer element. This
+ property automatically inherits any class names defined by the view's
+ superclasses as well.
+ @property classNames
+ @type Array
+ @default ['ember-view']
+ @public
+ */
+ classNames: EMPTY_ARRAY,
+
+ /**
+ A list of properties of the view to apply as class names. If the property
+ is a string value, the value of that string will be applied as a class
+ name.
+ ```javascript
+ // Applies the 'high' class to the view element
+ import Component from '@ember/component';
+ Component.extend({
+ classNameBindings: ['priority'],
+ priority: 'high'
+ });
+ ```
+ If the value of the property is a Boolean, the name of that property is
+ added as a dasherized class name.
+ ```javascript
+ // Applies the 'is-urgent' class to the view element
+ import Component from '@ember/component';
+ Component.extend({
+ classNameBindings: ['isUrgent'],
+ isUrgent: true
+ });
+ ```
+ If you would prefer to use a custom value instead of the dasherized
+ property name, you can pass a binding like this:
+ ```javascript
+ // Applies the 'urgent' class to the view element
+ import Component from '@ember/component';
+ Component.extend({
+ classNameBindings: ['isUrgent:urgent'],
+ isUrgent: true
+ });
+ ```
+ This list of properties is inherited from the component's superclasses as well.
+ @property classNameBindings
+ @type Array
+ @default []
+ @public
+ */
+ classNameBindings: EMPTY_ARRAY
+ });
+});
+enifed('ember-views/mixins/text_support', ['exports', 'ember-metal', 'ember-runtime'], function (exports, _emberMetal, _emberRuntime) {
+ 'use strict';
+
+ /**
+ @module ember
+ */
+
+ var KEY_EVENTS = {
+ 13: 'insertNewline',
+ 27: 'cancel'
+ };
+
+ /**
+ `TextSupport` is a shared mixin used by both `TextField` and
+ `TextArea`. `TextSupport` adds a number of methods that allow you to
+ specify a controller action to invoke when a certain event is fired on your
+ text field or textarea. The specified controller action would get the current
+ value of the field passed in as the only argument unless the value of
+ the field is empty. In that case, the instance of the field itself is passed
+ in as the only argument.
+
+ Let's use the pressing of the escape key as an example. If you wanted to
+ invoke a controller action when a user presses the escape key while on your
+ field, you would use the `escape-press` attribute on your field like so:
+
+ ```handlebars
+ {{! application.hbs}}
+
+ {{input escape-press='alertUser'}}
+ ```
+
+ ```javascript
+ import Application from '@ember/application';
+ import Controller from '@ember/controller';
+ App = Application.create();
+
+ App.ApplicationController = Controller.extend({
+ actions: {
+ alertUser: function ( currentValue ) {
+ alert( 'escape pressed, current value: ' + currentValue );
+ }
+ }
+ });
+ ```
+
+ The following chart is a visual representation of what takes place when the
+ escape key is pressed in this scenario:
+
+ ```
+ The Template
+ +---------------------------+
+ | |
+ | escape-press='alertUser' |
+ | | TextSupport Mixin
+ +----+----------------------+ +-------------------------------+
+ | | cancel method |
+ | escape button pressed | |
+ +-------------------------------> | checks for the `escape-press` |
+ | attribute and pulls out the |
+ +-------------------------------+ | `alertUser` value |
+ | action name 'alertUser' +-------------------------------+
+ | sent to controller
+ v
+ Controller
+ +------------------------------------------ +
+ | |
+ | actions: { |
+ | alertUser: function( currentValue ){ |
+ | alert( 'the esc key was pressed!' ) |
+ | } |
+ | } |
+ | |
+ +-------------------------------------------+
+ ```
+
+ Here are the events that we currently support along with the name of the
+ attribute you would need to use on your field. To reiterate, you would use the
+ attribute name like so:
+
+ ```handlebars
+ {{input attribute-name='controllerAction'}}
+ ```
+
+ ```
+ +--------------------+----------------+
+ | | |
+ | event | attribute name |
+ +--------------------+----------------+
+ | new line inserted | insert-newline |
+ | | |
+ | enter key pressed | insert-newline |
+ | | |
+ | cancel key pressed | escape-press |
+ | | |
+ | focusin | focus-in |
+ | | |
+ | focusout | focus-out |
+ | | |
+ | keypress | key-press |
+ | | |
+ | keyup | key-up |
+ | | |
+ | keydown | key-down |
+ +--------------------+----------------+
+ ```
+
+ @class TextSupport
+ @namespace Ember
+ @uses Ember.TargetActionSupport
+ @extends Mixin
+ @private
+ */
+ exports.default = _emberMetal.Mixin.create(_emberRuntime.TargetActionSupport, {
+ value: '',
+
+ attributeBindings: ['autocapitalize', 'autocorrect', 'autofocus', 'disabled', 'form', 'maxlength', 'minlength', 'placeholder', 'readonly', 'required', 'selectionDirection', 'spellcheck', 'tabindex', 'title'],
+ placeholder: null,
+ disabled: false,
+ maxlength: null,
+
+ init: function () {
+ this._super.apply(this, arguments);
+ this.on('paste', this, this._elementValueDidChange);
+ this.on('cut', this, this._elementValueDidChange);
+ this.on('input', this, this._elementValueDidChange);
+ },
+
+
+ /**
+ Whether the `keyUp` event that triggers an `action` to be sent continues
+ propagating to other views.
+ By default, when the user presses the return key on their keyboard and
+ the text field has an `action` set, the action will be sent to the view's
+ controller and the key event will stop propagating.
+ If you would like parent views to receive the `keyUp` event even after an
+ action has been dispatched, set `bubbles` to true.
+ @property bubbles
+ @type Boolean
+ @default false
+ @private
+ */
+ bubbles: false,
+
+ interpretKeyEvents: function (event) {
+ var map = KEY_EVENTS;
+ var method = map[event.keyCode];
+
+ this._elementValueDidChange();
+ if (method) {
+ return this[method](event);
+ }
+ },
+ _elementValueDidChange: function () {
+ (0, _emberMetal.set)(this, 'value', this.element.value);
+ },
+ change: function (event) {
+ this._elementValueDidChange(event);
+ },
+
+
+ /**
+ Allows you to specify a controller action to invoke when either the `enter`
+ key is pressed or, in the case of the field being a textarea, when a newline
+ is inserted. To use this method, give your field an `insert-newline`
+ attribute. The value of that attribute should be the name of the action
+ in your controller that you wish to invoke.
+ For an example on how to use the `insert-newline` attribute, please
+ reference the example near the top of this file.
+ @method insertNewline
+ @param {Event} event
+ @private
+ */
+ insertNewline: function (event) {
+ sendAction('enter', this, event);
+ sendAction('insert-newline', this, event);
+ },
+
+
+ /**
+ Allows you to specify a controller action to invoke when the escape button
+ is pressed. To use this method, give your field an `escape-press`
+ attribute. The value of that attribute should be the name of the action
+ in your controller that you wish to invoke.
+ For an example on how to use the `escape-press` attribute, please reference
+ the example near the top of this file.
+ @method cancel
+ @param {Event} event
+ @private
+ */
+ cancel: function (event) {
+ sendAction('escape-press', this, event);
+ },
+
+
+ /**
+ Allows you to specify a controller action to invoke when a field receives
+ focus. To use this method, give your field a `focus-in` attribute. The value
+ of that attribute should be the name of the action in your controller
+ that you wish to invoke.
+ For an example on how to use the `focus-in` attribute, please reference the
+ example near the top of this file.
+ @method focusIn
+ @param {Event} event
+ @private
+ */
+ focusIn: function (event) {
+ sendAction('focus-in', this, event);
+ },
+
+
+ /**
+ Allows you to specify a controller action to invoke when a field loses
+ focus. To use this method, give your field a `focus-out` attribute. The value
+ of that attribute should be the name of the action in your controller
+ that you wish to invoke.
+ For an example on how to use the `focus-out` attribute, please reference the
+ example near the top of this file.
+ @method focusOut
+ @param {Event} event
+ @private
+ */
+ focusOut: function (event) {
+ this._elementValueDidChange(event);
+ sendAction('focus-out', this, event);
+ },
+
+
+ /**
+ Allows you to specify a controller action to invoke when a key is pressed.
+ To use this method, give your field a `key-press` attribute. The value of
+ that attribute should be the name of the action in your controller you
+ that wish to invoke.
+ For an example on how to use the `key-press` attribute, please reference the
+ example near the top of this file.
+ @method keyPress
+ @param {Event} event
+ @private
+ */
+ keyPress: function (event) {
+ sendAction('key-press', this, event);
+ },
+
+
+ /**
+ Allows you to specify a controller action to invoke when a key-up event is
+ fired. To use this method, give your field a `key-up` attribute. The value
+ of that attribute should be the name of the action in your controller
+ that you wish to invoke.
+ For an example on how to use the `key-up` attribute, please reference the
+ example near the top of this file.
+ @method keyUp
+ @param {Event} event
+ @private
+ */
+ keyUp: function (event) {
+ this.interpretKeyEvents(event);
+
+ this.sendAction('key-up', (0, _emberMetal.get)(this, 'value'), event);
+ },
+
+
+ /**
+ Allows you to specify a controller action to invoke when a key-down event is
+ fired. To use this method, give your field a `key-down` attribute. The value
+ of that attribute should be the name of the action in your controller that
+ you wish to invoke.
+ For an example on how to use the `key-down` attribute, please reference the
+ example near the top of this file.
+ @method keyDown
+ @param {Event} event
+ @private
+ */
+ keyDown: function (event) {
+ this.sendAction('key-down', (0, _emberMetal.get)(this, 'value'), event);
+ }
+ });
+
+
+ // In principle, this shouldn't be necessary, but the legacy
+ // sendAction semantics for TextField are different from
+ // the component semantics so this method normalizes them.
+ function sendAction(eventName, view, event) {
+ var action = (0, _emberMetal.get)(view, 'attrs.' + eventName) || (0, _emberMetal.get)(view, eventName);
+ var value = (0, _emberMetal.get)(view, 'value');
+
+ view.sendAction(eventName, value);
+
+ if (action && !(0, _emberMetal.get)(view, 'bubbles')) {
+ event.stopPropagation();
+ }
+ }
+});
+enifed('ember-views/mixins/view_state_support', ['exports', 'ember-metal'], function (exports, _emberMetal) {
+ 'use strict';
+
+ exports.default = _emberMetal.Mixin.create({
+ _transitionTo: function (state) {
+ var priorState = this._currentState;
+ var currentState = this._currentState = this._states[state];
+ this._state = state;
+
+ if (priorState && priorState.exit) {
+ priorState.exit(this);
+ }
+ if (currentState.enter) {
+ currentState.enter(this);
+ }
+ }
+ });
+});
+enifed('ember-views/mixins/view_support', ['exports', 'ember-utils', 'ember-metal', 'ember-debug', 'ember-environment', 'ember-views/system/utils', 'ember-runtime/system/core_object', 'ember-views/system/jquery'], function (exports, _emberUtils, _emberMetal, _emberDebug, _emberEnvironment, _utils, _core_object, _jquery) {
+ 'use strict';
+
+ var _Mixin$create;
+
+ function K() {
+ return this;
+ }
+
+ /**
+ @class ViewMixin
+ @namespace Ember
+ @private
+ */
+ exports.default = _emberMetal.Mixin.create((_Mixin$create = {
+ /**
+ A list of properties of the view to apply as attributes. If the property
+ is a string value, the value of that string will be applied as the value
+ for an attribute of the property's name.
+ The following example creates a tag like `<div priority="high" />`.
+ ```app/components/my-component.js
+ import Component from '@ember/component';
+ export default Component.extend({
+ attributeBindings: ['priority'],
+ priority: 'high'
+ });
+ ```
+ If the value of the property is a Boolean, the attribute is treated as
+ an HTML Boolean attribute. It will be present if the property is `true`
+ and omitted if the property is `false`.
+ The following example creates markup like `<div visible />`.
+ ```app/components/my-component.js
+ import Component from '@ember/component';
+ export default Component.extend({
+ attributeBindings: ['visible'],
+ visible: true
+ });
+ ```
+ If you would prefer to use a custom value instead of the property name,
+ you can create the same markup as the last example with a binding like
+ this:
+ ```app/components/my-component.js
+ import Component from '@ember/component';
+ export default Component.extend({
+ attributeBindings: ['isVisible:visible'],
+ isVisible: true
+ });
+ ```
+ This list of attributes is inherited from the component's superclasses,
+ as well.
+ @property attributeBindings
+ @type Array
+ @default []
+ @public
+ */
+ concatenatedProperties: ['attributeBindings']
+
+ }, _Mixin$create[_core_object.POST_INIT] = function () {
+ if (_emberEnvironment.ENV._ENABLE_DID_INIT_ATTRS_SUPPORT === true) {
+ this.trigger('didInitAttrs');
+ }
+ this.trigger('didReceiveAttrs');
+ }, _Mixin$create.nearestOfType = function (klass) {
+ var view = this.parentView;
+ var isOfType = klass instanceof _emberMetal.Mixin ? function (view) {
+ return klass.detect(view);
+ } : function (view) {
+ return klass.detect(view.constructor);
+ };
+
+ while (view) {
+ if (isOfType(view)) {
+ return view;
+ }
+ view = view.parentView;
+ }
+ }, _Mixin$create.nearestWithProperty = function (property) {
+ var view = this.parentView;
+
+ while (view) {
+ if (property in view) {
+ return view;
+ }
+ view = view.parentView;
+ }
+ }, _Mixin$create.rerender = function () {
+ return this._currentState.rerender(this);
+ }, _Mixin$create.element = (0, _emberMetal.descriptor)({
+ configurable: false,
+ enumerable: false,
+ get: function () {
+ return this.renderer.getElement(this);
+ }
+ }), _Mixin$create.$ = function (sel) {
+ (true && !(this.tagName !== '') && (0, _emberDebug.assert)('You cannot access this.$() on a component with `tagName: \'\'` specified.', this.tagName !== ''));
+
+ if (this.element) {
+ return sel ? (0, _jquery.default)(sel, this.element) : (0, _jquery.default)(this.element);
+ }
+ }, _Mixin$create.appendTo = function (selector) {
+ var env = this._environment || _emberEnvironment.environment;
+ var target = void 0;
+
+ if (env.hasDOM) {
+ target = typeof selector === 'string' ? document.querySelector(selector) : selector;
+
+ (true && !(target) && (0, _emberDebug.assert)('You tried to append to (' + selector + ') but that isn\'t in the DOM', target));
+ (true && !(!(0, _utils.matches)(target, '.ember-view')) && (0, _emberDebug.assert)('You cannot append to an existing Ember.View.', !(0, _utils.matches)(target, '.ember-view')));
+ (true && !(function () {
+ var node = target.parentNode;
+ while (node) {
+ if (node.nodeType !== 9 && (0, _utils.matches)(node, '.ember-view')) {
+ return false;
+ }
+
+ node = node.parentNode;
+ }
+
+ return true;
+ }()) && (0, _emberDebug.assert)('You cannot append to an existing Ember.View.', function () {
+ var node = target.parentNode;while (node) {
+ if (node.nodeType !== 9 && (0, _utils.matches)(node, '.ember-view')) {
+ return false;
+ }node = node.parentNode;
+ }return true;
+ }()));
+ } else {
+ target = selector;
+
+ (true && !(typeof target !== 'string') && (0, _emberDebug.assert)('You tried to append to a selector string (' + selector + ') in an environment without jQuery', typeof target !== 'string'));
+ (true && !(typeof selector.appendChild === 'function') && (0, _emberDebug.assert)('You tried to append to a non-Element (' + selector + ') in an environment without jQuery', typeof selector.appendChild === 'function'));
+ }
+
+ this.renderer.appendTo(this, target);
+
+ return this;
+ }, _Mixin$create.append = function () {
+ return this.appendTo(document.body);
+ }, _Mixin$create.elementId = null, _Mixin$create.findElementInParentElement = function (parentElem) {
+ var id = '#' + this.elementId;
+ return (0, _jquery.default)(id)[0] || (0, _jquery.default)(id, parentElem)[0];
+ }, _Mixin$create.willInsertElement = K, _Mixin$create.didInsertElement = K, _Mixin$create.willClearRender = K, _Mixin$create.destroy = function () {
+ this._super.apply(this, arguments);
+ this._currentState.destroy(this);
+ }, _Mixin$create.willDestroyElement = K, _Mixin$create.parentViewDidChange = K, _Mixin$create.tagName = null, _Mixin$create.init = function () {
+ this._super.apply(this, arguments);
+
+ // tslint:disable-next-line:max-line-length
+ (true && !((0, _emberMetal.descriptorFor)(this, 'elementId') === undefined) && (0, _emberDebug.assert)('You cannot use a computed property for the component\'s `elementId` (' + this + ').', (0, _emberMetal.descriptorFor)(this, 'elementId') === undefined));
+
+ // tslint:disable-next-line:max-line-length
+
+ (true && !((0, _emberMetal.descriptorFor)(this, 'tagName') === undefined) && (0, _emberDebug.assert)('You cannot use a computed property for the component\'s `tagName` (' + this + ').', (0, _emberMetal.descriptorFor)(this, 'tagName') === undefined));
+
+
+ if (!this.elementId && this.tagName !== '') {
+ this.elementId = (0, _emberUtils.guidFor)(this);
+ }
+
+ if (_emberEnvironment.environment._ENABLE_DID_INIT_ATTRS_SUPPORT) {
+ (true && !(typeof this.didInitAttrs !== 'function') && (0, _emberDebug.deprecate)('[DEPRECATED] didInitAttrs called in ' + this.toString() + '.', typeof this.didInitAttrs !== 'function', {
+ id: 'ember-views.did-init-attrs',
+ until: '3.0.0',
+ url: 'https://emberjs.com/deprecations/v2.x#toc_ember-component-didinitattrs'
+ }));
+ } else {
+ (true && !(typeof this.didInitAttrs !== 'function') && (0, _emberDebug.assert)('didInitAttrs called in ' + this.toString() + ' is no longer supported.', typeof this.didInitAttrs !== 'function'));
+ }
+
+ (true && !(!this.render) && (0, _emberDebug.assert)('Using a custom `.render` function is no longer supported.', !this.render));
+ }, _Mixin$create.__defineNonEnumerable = function (property) {
+ this[property.name] = property.descriptor.value;
+ }, _Mixin$create.handleEvent = function (eventName, evt) {
+ return this._currentState.handleEvent(this, eventName, evt);
+ }, _Mixin$create));
+});
+enifed("ember-views/system/action_manager", ["exports"], function (exports) {
+ "use strict";
+
+ exports.default = ActionManager;
+ /**
+ @module ember
+ */
+
+ function ActionManager() {}
+
+ /**
+ Global action id hash.
+
+ @private
+ @property registeredActions
+ @type Object
+ */
+ ActionManager.registeredActions = {};
+});
+enifed('ember-views/system/event_dispatcher', ['exports', 'ember-utils', 'ember-debug', 'ember-metal', 'ember-runtime', 'ember-views/system/jquery', 'ember-views/system/action_manager', 'ember-views/compat/fallback-view-registry'], function (exports, _emberUtils, _emberDebug, _emberMetal, _emberRuntime, _jquery, _action_manager, _fallbackViewRegistry) {
+ 'use strict';
+
+ var HAS_JQUERY = _jquery.default !== undefined; /**
+ @module ember
+ */
+
+ var ROOT_ELEMENT_CLASS = 'ember-application';
+ var ROOT_ELEMENT_SELECTOR = '.' + ROOT_ELEMENT_CLASS;
+
+ /**
+ `Ember.EventDispatcher` handles delegating browser events to their
+ corresponding `Ember.Views.` For example, when you click on a view,
+ `Ember.EventDispatcher` ensures that that view's `mouseDown` method gets
+ called.
+
+ @class EventDispatcher
+ @namespace Ember
+ @private
+ @extends Ember.Object
+ */
+ exports.default = _emberRuntime.Object.extend({
+
+ /**
+ The set of events names (and associated handler function names) to be setup
+ and dispatched by the `EventDispatcher`. Modifications to this list can be done
+ at setup time, generally via the `Application.customEvents` hash.
+ To add new events to be listened to:
+ ```javascript
+ import Application from '@ember/application';
+ let App = Application.create({
+ customEvents: {
+ paste: 'paste'
+ }
+ });
+ ```
+ To prevent default events from being listened to:
+ ```javascript
+ import Application from '@ember/application';
+ let App = Application.create({
+ customEvents: {
+ mouseenter: null,
+ mouseleave: null
+ }
+ });
+ ```
+ @property events
+ @type Object
+ @private
+ */
+ events: {
+ touchstart: 'touchStart',
+ touchmove: 'touchMove',
+ touchend: 'touchEnd',
+ touchcancel: 'touchCancel',
+ keydown: 'keyDown',
+ keyup: 'keyUp',
+ keypress: 'keyPress',
+ mousedown: 'mouseDown',
+ mouseup: 'mouseUp',
+ contextmenu: 'contextMenu',
+ click: 'click',
+ dblclick: 'doubleClick',
+ mousemove: 'mouseMove',
+ focusin: 'focusIn',
+ focusout: 'focusOut',
+ mouseenter: 'mouseEnter',
+ mouseleave: 'mouseLeave',
+ submit: 'submit',
+ input: 'input',
+ change: 'change',
+ dragstart: 'dragStart',
+ drag: 'drag',
+ dragenter: 'dragEnter',
+ dragleave: 'dragLeave',
+ dragover: 'dragOver',
+ drop: 'drop',
+ dragend: 'dragEnd'
+ },
+
+ /**
+ The root DOM element to which event listeners should be attached. Event
+ listeners will be attached to the document unless this is overridden.
+ Can be specified as a DOMElement or a selector string.
+ The default body is a string since this may be evaluated before document.body
+ exists in the DOM.
+ @private
+ @property rootElement
+ @type DOMElement
+ @default 'body'
+ */
+ rootElement: 'body',
+
+ init: function () {
+ var _this = this;
+
+ this._super();
+
+ (true && !(function () {
+ var owner = (0, _emberUtils.getOwner)(_this);
+ var environment = owner.lookup('-environment:main');
+
+ return environment.isInteractive;
+ }()) && (0, _emberDebug.assert)('EventDispatcher should never be instantiated in fastboot mode. Please report this as an Ember bug.', function () {
+ var owner = (0, _emberUtils.getOwner)(_this);var environment = owner.lookup('-environment:main');return environment.isInteractive;
+ }()));
+
+
+ this._eventHandlers = Object.create(null);
+ },
+
+
+ /**
+ Sets up event listeners for standard browser events.
+ This will be called after the browser sends a `DOMContentReady` event. By
+ default, it will set up all of the listeners on the document body. If you
+ would like to register the listeners on a different element, set the event
+ dispatcher's `root` property.
+ @private
+ @method setup
+ @param addedEvents {Object}
+ */
+ setup: function (addedEvents, _rootElement) {
+ var event = void 0,
+ rootElement = void 0;
+ var events = this._finalEvents = (0, _emberUtils.assign)({}, (0, _emberMetal.get)(this, 'events'), addedEvents);
+
+ if (!(0, _emberMetal.isNone)(_rootElement)) {
+ (0, _emberMetal.set)(this, 'rootElement', _rootElement);
+ }
+
+ var rootElementSelector = (0, _emberMetal.get)(this, 'rootElement');
+ if (HAS_JQUERY) {
+ rootElement = (0, _jquery.default)(rootElementSelector);
+ (true && !(!rootElement.is(ROOT_ELEMENT_SELECTOR)) && (0, _emberDebug.assert)('You cannot use the same root element (' + (rootElement.selector || rootElement[0].tagName) + ') multiple times in an Ember.Application', !rootElement.is(ROOT_ELEMENT_SELECTOR)));
+ (true && !(!rootElement.closest(ROOT_ELEMENT_SELECTOR).length) && (0, _emberDebug.assert)('You cannot make a new Ember.Application using a root element that is a descendent of an existing Ember.Application', !rootElement.closest(ROOT_ELEMENT_SELECTOR).length));
+ (true && !(!rootElement.find(ROOT_ELEMENT_SELECTOR).length) && (0, _emberDebug.assert)('You cannot make a new Ember.Application using a root element that is an ancestor of an existing Ember.Application', !rootElement.find(ROOT_ELEMENT_SELECTOR).length));
+
+
+ rootElement.addClass(ROOT_ELEMENT_CLASS);
+
+ if (!rootElement.is(ROOT_ELEMENT_SELECTOR)) {
+ throw new TypeError('Unable to add \'' + ROOT_ELEMENT_CLASS + '\' class to root element (' + (rootElement.selector || rootElement[0].tagName) + '). Make sure you set rootElement to the body or an element in the body.');
+ }
+ } else {
+ if (typeof rootElementSelector !== 'string') {
+ rootElement = rootElementSelector;
+ } else {
+ rootElement = document.querySelector(rootElementSelector);
+ }
+
+ (true && !(!rootElement.classList.contains(ROOT_ELEMENT_CLASS)) && (0, _emberDebug.assert)('You cannot use the same root element (' + ((0, _emberMetal.get)(this, 'rootElement') || rootElement.tagName) + ') multiple times in an Ember.Application', !rootElement.classList.contains(ROOT_ELEMENT_CLASS)));
+ (true && !(function () {
+ var target = rootElement.parentNode;
+ do {
+ if (target.classList.contains(ROOT_ELEMENT_CLASS)) {
+ return false;
+ }
+
+ target = target.parentNode;
+ } while (target && target.nodeType === 1);
+
+ return true;
+ }()) && (0, _emberDebug.assert)('You cannot make a new Ember.Application using a root element that is a descendent of an existing Ember.Application', function () {
+ var target = rootElement.parentNode;do {
+ if (target.classList.contains(ROOT_ELEMENT_CLASS)) {
+ return false;
+ }target = target.parentNode;
+ } while (target && target.nodeType === 1);return true;
+ }()));
+ (true && !(!rootElement.querySelector(ROOT_ELEMENT_SELECTOR)) && (0, _emberDebug.assert)('You cannot make a new Ember.Application using a root element that is an ancestor of an existing Ember.Application', !rootElement.querySelector(ROOT_ELEMENT_SELECTOR)));
+
+
+ rootElement.classList.add(ROOT_ELEMENT_CLASS);
+
+ (true && !(rootElement.classList.contains(ROOT_ELEMENT_CLASS)) && (0, _emberDebug.assert)('Unable to add \'' + ROOT_ELEMENT_CLASS + '\' class to root element (' + ((0, _emberMetal.get)(this, 'rootElement') || rootElement.tagName) + '). Make sure you set rootElement to the body or an element in the body.', rootElement.classList.contains(ROOT_ELEMENT_CLASS)));
+ }
+
+ var viewRegistry = this._getViewRegistry();
+
+ for (event in events) {
+ if (events.hasOwnProperty(event)) {
+ this.setupHandler(rootElement, event, events[event], viewRegistry);
+ }
+ }
+ },
+
+
+ /**
+ Registers an event listener on the rootElement. If the given event is
+ triggered, the provided event handler will be triggered on the target view.
+ If the target view does not implement the event handler, or if the handler
+ returns `false`, the parent view will be called. The event will continue to
+ bubble to each successive parent view until it reaches the top.
+ @private
+ @method setupHandler
+ @param {Element} rootElement
+ @param {String} event the browser-originated event to listen to
+ @param {String} eventName the name of the method to call on the view
+ @param {Object} viewRegistry
+ */
+ setupHandler: function (rootElement, event, eventName, viewRegistry) {
+ if (eventName === null) {
+ return;
+ }
+
+ if (HAS_JQUERY) {
+ rootElement.on(event + '.ember', '.ember-view', function (evt) {
+ var view = viewRegistry[this.id];
+ var result = true;
+
+ if (view) {
+ result = view.handleEvent(eventName, evt);
+ }
+
+ return result;
+ });
+
+ rootElement.on(event + '.ember', '[data-ember-action]', function (evt) {
+ var attributes = evt.currentTarget.attributes;
+ var handledActions = [];
+
+ for (var i = 0; i < attributes.length; i++) {
+ var attr = attributes.item(i);
+ var attrName = attr.name;
+
+ if (attrName.lastIndexOf('data-ember-action-', 0) !== -1) {
+ var action = _action_manager.default.registeredActions[attr.value];
+
+ // We have to check for action here since in some cases, jQuery will trigger
+ // an event on `removeChild` (i.e. focusout) after we've already torn down the
+ // action handlers for the view.
+ if (action && action.eventName === eventName && handledActions.indexOf(action) === -1) {
+ action.handler(evt);
+ // Action handlers can mutate state which in turn creates new attributes on the element.
+ // This effect could cause the `data-ember-action` attribute to shift down and be invoked twice.
+ // To avoid this, we keep track of which actions have been handled.
+ handledActions.push(action);
+ }
+ }
+ }
+ });
+ } else {
+ var viewHandler = function (target, event) {
+ var view = viewRegistry[target.id];
+ var result = true;
+
+ if (view) {
+ result = view.handleEvent(eventName, event);
+ }
+
+ return result;
+ };
+
+ var actionHandler = function (target, event) {
+ var actionId = target.getAttribute('data-ember-action');
+ var actions = _action_manager.default.registeredActions[actionId];
+
+ // In Glimmer2 this attribute is set to an empty string and an additional
+ // attribute it set for each action on a given element. In this case, the
+ // attributes need to be read so that a proper set of action handlers can
+ // be coalesced.
+ if (actionId === '') {
+ var attributes = target.attributes;
+ var attributeCount = attributes.length;
+
+ actions = [];
+
+ for (var i = 0; i < attributeCount; i++) {
+ var attr = attributes.item(i);
+ var attrName = attr.name;
+
+ if (attrName.indexOf('data-ember-action-') === 0) {
+ actions = actions.concat(_action_manager.default.registeredActions[attr.value]);
+ }
+ }
+ }
+
+ // We have to check for actions here since in some cases, jQuery will trigger
+ // an event on `removeChild` (i.e. focusout) after we've already torn down the
+ // action handlers for the view.
+ if (!actions) {
+ return;
+ }
+
+ for (var index = 0; index < actions.length; index++) {
+ var action = actions[index];
+
+ if (action && action.eventName === eventName) {
+ return action.handler(event);
+ }
+ }
+ };
+
+ var handleEvent = this._eventHandlers[event] = function (event) {
+ var target = event.target;
+
+ do {
+ if (viewRegistry[target.id]) {
+ if (viewHandler(target, event) === false) {
+ event.preventDefault();
+ event.stopPropagation();
+ break;
+ }
+ } else if (target.hasAttribute('data-ember-action')) {
+ actionHandler(target, event);
+ break;
+ }
+
+ target = target.parentNode;
+ } while (target && target.nodeType === 1);
+ };
+
+ rootElement.addEventListener(event, handleEvent);
+ }
+ },
+ _getViewRegistry: function () {
+ var owner = (0, _emberUtils.getOwner)(this);
+ var viewRegistry = owner && owner.lookup('-view-registry:main') || _fallbackViewRegistry.default;
+
+ return viewRegistry;
+ },
+ destroy: function () {
+ var rootElementSelector = (0, _emberMetal.get)(this, 'rootElement');
+ var rootElement = void 0;
+ if (rootElementSelector.nodeType) {
+ rootElement = rootElementSelector;
+ } else {
+ rootElement = document.querySelector(rootElementSelector);
+ }
+
+ if (!rootElement) {
+ return;
+ }
+
+ if (HAS_JQUERY) {
+ (0, _jquery.default)(rootElementSelector).off('.ember', '**');
+ } else {
+ for (var event in this._eventHandlers) {
+ rootElement.removeEventListener(event, this._eventHandlers[event]);
+ }
+ }
+
+ rootElement.classList.remove(ROOT_ELEMENT_CLASS);
+
+ return this._super.apply(this, arguments);
+ },
+ toString: function () {
+ return '(EventDispatcher)';
+ }
+ });
+});
+enifed('ember-views/system/ext', ['ember-metal'], function (_emberMetal) {
+ 'use strict';
+
+ // Add a new named queue for rendering views that happens
+ // after bindings have synced, and a queue for scheduling actions
+ // that should occur after view rendering.
+ _emberMetal.run._addQueue('render', 'actions');
+ _emberMetal.run._addQueue('afterRender', 'render');
+});
+enifed('ember-views/system/jquery', ['exports', 'ember-environment'], function (exports, _emberEnvironment) {
+ 'use strict';
+
+ var jQuery = void 0;
+
+ if (_emberEnvironment.environment.hasDOM) {
+ jQuery = _emberEnvironment.context.imports.jQuery;
+
+ if (jQuery) {
+ if (jQuery.event.addProp) {
+ jQuery.event.addProp('dataTransfer');
+ } else {
+ // http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dndevents
+ ['dragstart', 'drag', 'dragenter', 'dragleave', 'dragover', 'drop', 'dragend'].forEach(function (eventName) {
+ jQuery.event.fixHooks[eventName] = {
+ props: ['dataTransfer']
+ };
+ });
+ }
+ }
+ }
+
+ exports.default = jQuery;
+});
+enifed('ember-views/system/lookup_partial', ['exports', 'ember-debug'], function (exports, _emberDebug) {
+ 'use strict';
+
+ exports.default = lookupPartial;
+ exports.hasPartial = hasPartial;
+
+
+ function parseUnderscoredName(templateName) {
+ var nameParts = templateName.split('/');
+ var lastPart = nameParts[nameParts.length - 1];
+
+ nameParts[nameParts.length - 1] = '_' + lastPart;
+
+ return nameParts.join('/');
+ }
+
+ function lookupPartial(templateName, owner) {
+ if (templateName == null) {
+ return;
+ }
+
+ var template = templateFor(owner, parseUnderscoredName(templateName), templateName);
+
+ (true && !(!!template) && (0, _emberDebug.assert)('Unable to find partial with name "' + templateName + '"', !!template));
+
+
+ return template;
+ }
+
+ function hasPartial(name, owner) {
+ if (!owner) {
+ throw new _emberDebug.Error('Container was not found when looking up a views template. ' + 'This is most likely due to manually instantiating an Ember.View. ' + 'See: http://git.io/EKPpnA');
+ }
+
+ return owner.hasRegistration('template:' + parseUnderscoredName(name)) || owner.hasRegistration('template:' + name);
+ }
+
+ function templateFor(owner, underscored, name) {
+ if (!name) {
+ return;
+ }
+ (true && !(name.indexOf('.') === -1) && (0, _emberDebug.assert)('templateNames are not allowed to contain periods: ' + name, name.indexOf('.') === -1));
+
+
+ if (!owner) {
+ throw new _emberDebug.Error('Container was not found when looking up a views template. ' + 'This is most likely due to manually instantiating an Ember.View. ' + 'See: http://git.io/EKPpnA');
+ }
+
+ return owner.lookup('template:' + underscored) || owner.lookup('template:' + name);
+ }
+});
+enifed('ember-views/system/utils', ['exports', 'ember-utils'], function (exports, _emberUtils) {
+ 'use strict';
+
+ exports.elMatches = undefined;
+ exports.isSimpleClick = isSimpleClick;
+ exports.constructStyleDeprecationMessage = constructStyleDeprecationMessage;
+ exports.getRootViews = getRootViews;
+ exports.getViewId = getViewId;
+ exports.getViewElement = getViewElement;
+ exports.initViewElement = initViewElement;
+ exports.setViewElement = setViewElement;
+ exports.getChildViews = getChildViews;
+ exports.initChildViews = initChildViews;
+ exports.addChildView = addChildView;
+ exports.collectChildViews = collectChildViews;
+ exports.getViewBounds = getViewBounds;
+ exports.getViewRange = getViewRange;
+ exports.getViewClientRects = getViewClientRects;
+ exports.getViewBoundingClientRect = getViewBoundingClientRect;
+ exports.matches = matches;
+
+
+ /**
+ @module ember
+ */
+
+ function isSimpleClick(event) {
+ var modifier = event.shiftKey || event.metaKey || event.altKey || event.ctrlKey;
+ var secondaryClick = event.which > 1; // IE9 may return undefined
+
+ return !modifier && !secondaryClick;
+ } /* globals Element */
+ function constructStyleDeprecationMessage(affectedStyle) {
+ return '' + 'Binding style attributes may introduce cross-site scripting vulnerabilities; ' + 'please ensure that values being bound are properly escaped. For more information, ' + 'including how to disable this warning, see ' + 'https://emberjs.com/deprecations/v1.x/#toc_binding-style-attributes. ' + 'Style affected: "' + affectedStyle + '"';
+ }
+
+ /**
+ @private
+ @method getRootViews
+ @param {Object} owner
+ */
+ function getRootViews(owner) {
+ var registry = owner.lookup('-view-registry:main');
+
+ var rootViews = [];
+
+ Object.keys(registry).forEach(function (id) {
+ var view = registry[id];
+
+ if (view.parentView === null) {
+ rootViews.push(view);
+ }
+ });
+
+ return rootViews;
+ }
+
+ /**
+ @private
+ @method getViewId
+ @param {Ember.View} view
+ */
+ function getViewId(view) {
+ if (view.tagName === '') {
+ return (0, _emberUtils.guidFor)(view);
+ } else {
+ return view.elementId || (0, _emberUtils.guidFor)(view);
+ }
+ }
+
+ var VIEW_ELEMENT = (0, _emberUtils.symbol)('VIEW_ELEMENT');
+
+ /**
+ @private
+ @method getViewElement
+ @param {Ember.View} view
+ */
+ function getViewElement(view) {
+ return view[VIEW_ELEMENT];
+ }
+
+ function initViewElement(view) {
+ view[VIEW_ELEMENT] = null;
+ }
+
+ function setViewElement(view, element) {
+ return view[VIEW_ELEMENT] = element;
+ }
+
+ var CHILD_VIEW_IDS = (0, _emberUtils.symbol)('CHILD_VIEW_IDS');
+
+ /**
+ @private
+ @method getChildViews
+ @param {Ember.View} view
+ */
+ function getChildViews(view) {
+ var owner = (0, _emberUtils.getOwner)(view);
+ var registry = owner.lookup('-view-registry:main');
+ return collectChildViews(view, registry);
+ }
+
+ function initChildViews(view) {
+ view[CHILD_VIEW_IDS] = [];
+ }
+
+ function addChildView(parent, child) {
+ parent[CHILD_VIEW_IDS].push(getViewId(child));
+ }
+
+ function collectChildViews(view, registry) {
+ var ids = [];
+ var views = [];
+
+ view[CHILD_VIEW_IDS].forEach(function (id) {
+ var view = registry[id];
+
+ if (view && !view.isDestroying && !view.isDestroyed && ids.indexOf(id) === -1) {
+ ids.push(id);
+ views.push(view);
+ }
+ });
+
+ view[CHILD_VIEW_IDS] = ids;
+
+ return views;
+ }
+
+ /**
+ @private
+ @method getViewBounds
+ @param {Ember.View} view
+ */
+ function getViewBounds(view) {
+ return view.renderer.getBounds(view);
+ }
+
+ /**
+ @private
+ @method getViewRange
+ @param {Ember.View} view
+ */
+ function getViewRange(view) {
+ var bounds = getViewBounds(view);
+
+ var range = document.createRange();
+ range.setStartBefore(bounds.firstNode);
+ range.setEndAfter(bounds.lastNode);
+
+ return range;
+ }
+
+ /**
+ `getViewClientRects` provides information about the position of the border
+ box edges of a view relative to the viewport.
+
+ It is only intended to be used by development tools like the Ember Inspector
+ and may not work on older browsers.
+
+ @private
+ @method getViewClientRects
+ @param {Ember.View} view
+ */
+ function getViewClientRects(view) {
+ var range = getViewRange(view);
+ return range.getClientRects();
+ }
+
+ /**
+ `getViewBoundingClientRect` provides information about the position of the
+ bounding border box edges of a view relative to the viewport.
+
+ It is only intended to be used by development tools like the Ember Inspector
+ and may not work on older browsers.
+
+ @private
+ @method getViewBoundingClientRect
+ @param {Ember.View} view
+ */
+ function getViewBoundingClientRect(view) {
+ var range = getViewRange(view);
+ return range.getBoundingClientRect();
+ }
+
+ /**
+ Determines if the element matches the specified selector.
+
+ @private
+ @method matches
+ @param {DOMElement} el
+ @param {String} selector
+ */
+ var elMatches = exports.elMatches = typeof Element !== 'undefined' && (Element.prototype.matches || Element.prototype.matchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.webkitMatchesSelector);
+
+ function matches(el, selector) {
+ return elMatches.call(el, selector);
+ }
+});
+enifed('ember-views/utils/lookup-component', ['exports', 'ember-babel', 'container', 'ember/features'], function (exports, _emberBabel, _container, _features) {
+ 'use strict';
+
+ exports.default = lookupComponent;
+
+ var _templateObject = (0, _emberBabel.taggedTemplateLiteralLoose)(['component:-default'], ['component:-default']);
+
+ function lookupModuleUnificationComponentPair(componentLookup, owner, name, options) {
+ var localComponent = componentLookup.componentFor(name, owner, options);
+ var localLayout = componentLookup.layoutFor(name, owner, options);
+
+ var globalComponent = componentLookup.componentFor(name, owner);
+ var globalLayout = componentLookup.layoutFor(name, owner);
+
+ var localAndUniqueComponent = !!localComponent && (!globalComponent || localComponent.class !== globalComponent.class);
+ var localAndUniqueLayout = !!localLayout && (!globalLayout || localLayout.meta.moduleName !== globalLayout.meta.moduleName);
+
+ if (localAndUniqueComponent && localAndUniqueLayout) {
+ return { layout: localLayout, component: localComponent };
+ }
+
+ if (localAndUniqueComponent && !localAndUniqueLayout) {
+ return { layout: null, component: localComponent };
+ }
+
+ var defaultComponentFactory = null;
+
+ if (!_features.EMBER_GLIMMER_TEMPLATE_ONLY_COMPONENTS) {
+ defaultComponentFactory = owner.factoryFor((0, _container.privatize)(_templateObject));
+ }
+
+ if (!localAndUniqueComponent && localAndUniqueLayout) {
+ return { layout: localLayout, component: defaultComponentFactory };
+ }
+
+ var component = globalComponent || globalLayout && defaultComponentFactory;
+ return { layout: globalLayout, component: component };
+ }
+
+ function lookupComponentPair(componentLookup, owner, name, options) {
+ if (_features.EMBER_MODULE_UNIFICATION) {
+ return lookupModuleUnificationComponentPair(componentLookup, owner, name, options);
+ }
+
+ var component = componentLookup.componentFor(name, owner, options);
+ var layout = componentLookup.layoutFor(name, owner, options);
+
+ var result = { layout: layout, component: component };
+
+ if (!_features.EMBER_GLIMMER_TEMPLATE_ONLY_COMPONENTS && layout && !component) {
+ result.component = owner.factoryFor((0, _container.privatize)(_templateObject));
+ }
+
+ return result;
+ }
+
+ function lookupComponent(owner, name, options) {
+ var componentLookup = owner.lookup('component-lookup:main');
+
+ var source = options && options.source;
+
+ if (source) {
+ var localResult = lookupComponentPair(componentLookup, owner, name, options);
+
+ if (localResult.component || localResult.layout) {
+ return localResult;
+ }
+ }
+
+ return lookupComponentPair(componentLookup, owner, name);
+ }
+});
+enifed('ember-views/views/core_view', ['exports', 'ember-runtime', 'ember-views/system/utils', 'ember-views/views/states'], function (exports, _emberRuntime, _utils, _states) {
+ 'use strict';
+
+ /**
+ `Ember.CoreView` is an abstract class that exists to give view-like behavior
+ to both Ember's main view class `Component` and other classes that don't need
+ the full functionality of `Component`.
+
+ Unless you have specific needs for `CoreView`, you will use `Component`
+ in your applications.
+
+ @class CoreView
+ @namespace Ember
+ @extends EmberObject
+ @deprecated Use `Component` instead.
+ @uses Evented
+ @uses Ember.ActionHandler
+ @private
+ */
+ var CoreView = _emberRuntime.FrameworkObject.extend(_emberRuntime.Evented, _emberRuntime.ActionHandler, {
+ isView: true,
+
+ _states: (0, _states.cloneStates)(_states.states),
+
+ init: function () {
+ this._super.apply(this, arguments);
+ this._state = 'preRender';
+ this._currentState = this._states.preRender;
+
+ (0, _utils.initViewElement)(this);
+
+ if (!this.renderer) {
+ throw new Error('Cannot instantiate a component without a renderer. Please ensure that you are creating ' + this + ' with a proper container/registry.');
+ }
+ },
+
+
+ /**
+ If the view is currently inserted into the DOM of a parent view, this
+ property will point to the parent of the view.
+ @property parentView
+ @type Ember.View
+ @default null
+ @private
+ */
+ parentView: null,
+
+ instrumentDetails: function (hash) {
+ hash.object = this.toString();
+ hash.containerKey = this._debugContainerKey;
+ hash.view = this;
+ return hash;
+ },
+ trigger: function (name) {
+ for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
+ args[_key - 1] = arguments[_key];
+ }
+
+ this._super.apply(this, arguments);
+ var method = this[name];
+ if (typeof method === 'function') {
+ return method.apply(this, args);
+ }
+ },
+ has: function (name) {
+ return typeof this[name] === 'function' || this._super(name);
+ }
+ });
+
+ CoreView.reopenClass({
+ isViewFactory: true
+ });
+
+ exports.default = CoreView;
+});
+enifed('ember-views/views/states', ['exports', 'ember-utils', 'ember-views/views/states/default', 'ember-views/views/states/pre_render', 'ember-views/views/states/has_element', 'ember-views/views/states/in_dom', 'ember-views/views/states/destroying'], function (exports, _emberUtils, _default2, _pre_render, _has_element, _in_dom, _destroying) {
+ 'use strict';
+
+ exports.states = undefined;
+ exports.cloneStates = cloneStates;
+ function cloneStates(from) {
+ var into = {};
+
+ into._default = {};
+ into.preRender = Object.create(into._default);
+ into.destroying = Object.create(into._default);
+ into.hasElement = Object.create(into._default);
+ into.inDOM = Object.create(into.hasElement);
+
+ for (var stateName in from) {
+ if (!from.hasOwnProperty(stateName)) {
+ continue;
+ }
+ (0, _emberUtils.assign)(into[stateName], from[stateName]);
+ }
+
+ return into;
+ }
+
+ /*
+ Describe how the specified actions should behave in the various
+ states that a view can exist in. Possible states:
+
+ * preRender: when a view is first instantiated, and after its
+ element was destroyed, it is in the preRender state
+ * hasElement: the DOM representation of the view is created,
+ and is ready to be inserted
+ * inDOM: once a view has been inserted into the DOM it is in
+ the inDOM state. A view spends the vast majority of its
+ existence in this state.
+ * destroyed: once a view has been destroyed (using the destroy
+ method), it is in this state. No further actions can be invoked
+ on a destroyed view.
+ */
+ var states = exports.states = {
+ _default: _default2.default,
+ preRender: _pre_render.default,
+ inDOM: _in_dom.default,
+ hasElement: _has_element.default,
+ destroying: _destroying.default
+ };
+});
+enifed('ember-views/views/states/default', ['exports', 'ember-debug'], function (exports, _emberDebug) {
+ 'use strict';
+
+ exports.default = {
+ // appendChild is only legal while rendering the buffer.
+ appendChild: function () {
+ throw new _emberDebug.EmberError('You can\'t use appendChild outside of the rendering process');
+ },
+
+
+ // Handle events from `Ember.EventDispatcher`
+ handleEvent: function () {
+ return true; // continue event propagation
+ },
+ rerender: function () {},
+ destroy: function () {}
+ };
+});
+enifed('ember-views/views/states/destroying', ['exports', 'ember-utils', 'ember-debug', 'ember-views/views/states/default'], function (exports, _emberUtils, _emberDebug, _default2) {
+ 'use strict';
+
+ var destroying = Object.create(_default2.default);
+
+ (0, _emberUtils.assign)(destroying, {
+ appendChild: function () {
+ throw new _emberDebug.Error('You can\'t call appendChild on a view being destroyed');
+ },
+ rerender: function () {
+ throw new _emberDebug.Error('You can\'t call rerender on a view being destroyed');
+ }
+ });
+
+ exports.default = destroying;
+});
+enifed('ember-views/views/states/has_element', ['exports', 'ember-utils', 'ember-views/views/states/default', 'ember-metal'], function (exports, _emberUtils, _default2, _emberMetal) {
+ 'use strict';
+
+ var hasElement = Object.create(_default2.default);
+
+ (0, _emberUtils.assign)(hasElement, {
+ rerender: function (view) {
+ view.renderer.rerender(view);
+ },
+ destroy: function (view) {
+ view.renderer.remove(view);
+ },
+ handleEvent: function (view, eventName, event) {
+ if (view.has(eventName)) {
+ // Handler should be able to re-dispatch events, so we don't
+ // preventDefault or stopPropagation.
+ return (0, _emberMetal.flaggedInstrument)('interaction.' + eventName, { event: event, view: view }, function () {
+ return _emberMetal.run.join(view, view.trigger, eventName, event);
+ });
+ } else {
+ return true; // continue event propagation
+ }
+ }
+ });
+
+ exports.default = hasElement;
+});
+enifed('ember-views/views/states/in_dom', ['exports', 'ember-utils', 'ember-metal', 'ember-debug', 'ember-views/views/states/has_element'], function (exports, _emberUtils, _emberMetal, _emberDebug, _has_element) {
+ 'use strict';
+
+ var inDOM = Object.create(_has_element.default);
+
+ (0, _emberUtils.assign)(inDOM, {
+ enter: function (view) {
+ // Register the view for event handling. This hash is used by
+ // Ember.EventDispatcher to dispatch incoming events.
+ view.renderer.register(view);
+
+ if (true) {
+ (0, _emberMetal._addBeforeObserver)(view, 'elementId', function () {
+ throw new _emberDebug.Error('Changing a view\'s elementId after creation is not allowed');
+ });
+ }
+ },
+ exit: function (view) {
+ view.renderer.unregister(view);
+ }
+ });
+
+ exports.default = inDOM;
+});
+enifed('ember-views/views/states/pre_render', ['exports', 'ember-views/views/states/default'], function (exports, _default2) {
+ 'use strict';
+
+ exports.default = Object.create(_default2.default);
+});
+enifed('ember/features', ['exports', 'ember-environment', 'ember-utils'], function (exports, _emberEnvironment, _emberUtils) {
+ 'use strict';
+
+ exports.EMBER_GLIMMER_DETECT_BACKTRACKING_RERENDER = exports.MANDATORY_SETTER = exports.DESCRIPTOR_TRAP = exports.GLIMMER_CUSTOM_COMPONENT_MANAGER = exports.EMBER_MODULE_UNIFICATION = exports.EMBER_ENGINES_MOUNT_PARAMS = exports.EMBER_ROUTING_ROUTER_SERVICE = exports.EMBER_METAL_ES5_GETTERS = exports.EMBER_GLIMMER_TEMPLATE_ONLY_COMPONENTS = exports.EMBER_GLIMMER_REMOVE_APPLICATION_TEMPLATE_WRAPPER = exports.EMBER_GLIMMER_NAMED_ARGUMENTS = exports.EMBER_IMPROVED_INSTRUMENTATION = exports.EMBER_LIBRARIES_ISREGISTERED = exports.FEATURES_STRIPPED_TEST = exports.FEATURES = exports.DEFAULT_FEATURES = undefined;
+ var DEFAULT_FEATURES = exports.DEFAULT_FEATURES = { "features-stripped-test": false, "ember-libraries-isregistered": false, "ember-improved-instrumentation": false, "ember-glimmer-named-arguments": false, "ember-glimmer-remove-application-template-wrapper": false, "ember-glimmer-template-only-components": false, "ember-metal-es5-getters": false, "ember-routing-router-service": true, "ember-engines-mount-params": true, "ember-module-unification": false, "glimmer-custom-component-manager": false, "descriptor-trap": true, "mandatory-setter": true, "ember-glimmer-detect-backtracking-rerender": true };
+ var FEATURES = exports.FEATURES = (0, _emberUtils.assign)(DEFAULT_FEATURES, _emberEnvironment.ENV.FEATURES);
+
+ var FEATURES_STRIPPED_TEST = exports.FEATURES_STRIPPED_TEST = FEATURES["features-stripped-test"];
+ var EMBER_LIBRARIES_ISREGISTERED = exports.EMBER_LIBRARIES_ISREGISTERED = FEATURES["ember-libraries-isregistered"];
+ var EMBER_IMPROVED_INSTRUMENTATION = exports.EMBER_IMPROVED_INSTRUMENTATION = FEATURES["ember-improved-instrumentation"];
+ var EMBER_GLIMMER_NAMED_ARGUMENTS = exports.EMBER_GLIMMER_NAMED_ARGUMENTS = FEATURES["ember-glimmer-named-arguments"];
+ var EMBER_GLIMMER_REMOVE_APPLICATION_TEMPLATE_WRAPPER = exports.EMBER_GLIMMER_REMOVE_APPLICATION_TEMPLATE_WRAPPER = FEATURES["ember-glimmer-remove-application-template-wrapper"];
+ var EMBER_GLIMMER_TEMPLATE_ONLY_COMPONENTS = exports.EMBER_GLIMMER_TEMPLATE_ONLY_COMPONENTS = FEATURES["ember-glimmer-template-only-components"];
+ var EMBER_METAL_ES5_GETTERS = exports.EMBER_METAL_ES5_GETTERS = FEATURES["ember-metal-es5-getters"];
+ var EMBER_ROUTING_ROUTER_SERVICE = exports.EMBER_ROUTING_ROUTER_SERVICE = FEATURES["ember-routing-router-service"];
+ var EMBER_ENGINES_MOUNT_PARAMS = exports.EMBER_ENGINES_MOUNT_PARAMS = FEATURES["ember-engines-mount-params"];
+ var EMBER_MODULE_UNIFICATION = exports.EMBER_MODULE_UNIFICATION = FEATURES["ember-module-unification"];
+ var GLIMMER_CUSTOM_COMPONENT_MANAGER = exports.GLIMMER_CUSTOM_COMPONENT_MANAGER = FEATURES["glimmer-custom-component-manager"];
+ var DESCRIPTOR_TRAP = exports.DESCRIPTOR_TRAP = FEATURES["descriptor-trap"];
+ var MANDATORY_SETTER = exports.MANDATORY_SETTER = FEATURES["mandatory-setter"];
+ var EMBER_GLIMMER_DETECT_BACKTRACKING_RERENDER = exports.EMBER_GLIMMER_DETECT_BACKTRACKING_RERENDER = FEATURES["ember-glimmer-detect-backtracking-rerender"];
+});
+enifed('ember/index', ['exports', 'require', 'ember-environment', 'node-module', 'ember-utils', 'container', 'ember-metal', 'ember/features', 'ember-debug', 'backburner', 'ember-console', 'ember-runtime', 'ember-glimmer', 'ember/version', 'ember-views', 'ember-routing', 'ember-application', 'ember-extension-support'], function (exports, _require2, _emberEnvironment, _nodeModule, _emberUtils, _container, _emberMetal, _features, _emberDebug, _backburner, _emberConsole, _emberRuntime, _emberGlimmer, _version, _emberViews, _emberRouting, _emberApplication, _emberExtensionSupport) {
+ 'use strict';
+
+ exports.VERSION = undefined;
+
+
+ // ember-utils exports
+
+
+ // ****ember-metal****
+
+
+ // ****ember-environment****
+ _emberMetal.default.getOwner = _emberUtils.getOwner;
+ _emberMetal.default.setOwner = _emberUtils.setOwner;
+ _emberMetal.default.generateGuid = _emberUtils.generateGuid;
+ _emberMetal.default.GUID_KEY = _emberUtils.GUID_KEY;
+ _emberMetal.default.guidFor = _emberUtils.guidFor;
+ _emberMetal.default.inspect = _emberUtils.inspect;
+ _emberMetal.default.makeArray = _emberUtils.makeArray;
+ _emberMetal.default.canInvoke = _emberUtils.canInvoke;
+ _emberMetal.default.tryInvoke = _emberUtils.tryInvoke;
+ _emberMetal.default.wrap = _emberUtils.wrap;
+ _emberMetal.default.applyStr = _emberUtils.applyStr;
+ _emberMetal.default.uuid = _emberUtils.uuid;
+ _emberMetal.default.assign = _emberUtils.assign;
+
+ // container exports
+ _emberMetal.default.Container = _container.Container;
+ _emberMetal.default.Registry = _container.Registry;
+
+ // need to import this directly, to ensure the babel feature
+ // flag plugin works properly
+
+
+ var computed = _emberMetal.computed;
+ computed.alias = _emberMetal.alias;
+ _emberMetal.default.computed = computed;
+ _emberMetal.default.ComputedProperty = _emberMetal.ComputedProperty;
+ _emberMetal.default.cacheFor = _emberMetal.cacheFor;
+
+ _emberMetal.default.assert = _emberDebug.assert;
+ _emberMetal.default.warn = _emberDebug.warn;
+ _emberMetal.default.debug = _emberDebug.debug;
+ _emberMetal.default.deprecate = _emberDebug.deprecate;
+ _emberMetal.default.deprecateFunc = _emberDebug.deprecateFunc;
+ _emberMetal.default.runInDebug = _emberDebug.runInDebug;
+ /**
+ @public
+ @class Ember.Debug
+ */
+ _emberMetal.default.Debug = {
+ registerDeprecationHandler: _emberDebug.registerDeprecationHandler,
+ registerWarnHandler: _emberDebug.registerWarnHandler
+ };
+ _emberMetal.default.merge = _emberMetal.merge;
+
+ _emberMetal.default.instrument = _emberMetal.instrument;
+ _emberMetal.default.subscribe = _emberMetal.instrumentationSubscribe;
+ _emberMetal.default.Instrumentation = {
+ instrument: _emberMetal.instrument,
+ subscribe: _emberMetal.instrumentationSubscribe,
+ unsubscribe: _emberMetal.instrumentationUnsubscribe,
+ reset: _emberMetal.instrumentationReset
+ };
+
+ _emberMetal.default.Error = _emberDebug.Error;
+ _emberMetal.default.meta = _emberMetal.meta;
+ _emberMetal.default.get = _emberMetal.get;
+ _emberMetal.default.getWithDefault = _emberMetal.getWithDefault;
+ _emberMetal.default._getPath = _emberMetal._getPath;
+ _emberMetal.default.set = _emberMetal.set;
+ _emberMetal.default.trySet = _emberMetal.trySet;
+ _emberMetal.default.FEATURES = _features.FEATURES;
+ _emberMetal.default.FEATURES.isEnabled = _emberDebug.isFeatureEnabled;
+ _emberMetal.default._Cache = _emberMetal.Cache;
+ _emberMetal.default.on = _emberMetal.on;
+ _emberMetal.default.addListener = _emberMetal.addListener;
+ _emberMetal.default.removeListener = _emberMetal.removeListener;
+ _emberMetal.default.sendEvent = _emberMetal.sendEvent;
+ _emberMetal.default.hasListeners = _emberMetal.hasListeners;
+ _emberMetal.default.isNone = _emberMetal.isNone;
+ _emberMetal.default.isEmpty = _emberMetal.isEmpty;
+ _emberMetal.default.isBlank = _emberMetal.isBlank;
+ _emberMetal.default.isPresent = _emberMetal.isPresent;
+ _emberMetal.default.run = _emberMetal.run;
+ _emberMetal.default._ObserverSet = _emberMetal.ObserverSet;
+ _emberMetal.default.propertyWillChange = _emberMetal.propertyWillChange;
+ _emberMetal.default.propertyDidChange = _emberMetal.propertyDidChange;
+ _emberMetal.default.overrideChains = _emberMetal.overrideChains;
+ _emberMetal.default.beginPropertyChanges = _emberMetal.beginPropertyChanges;
+ _emberMetal.default.endPropertyChanges = _emberMetal.endPropertyChanges;
+ _emberMetal.default.changeProperties = _emberMetal.changeProperties;
+ _emberMetal.default.platform = {
+ defineProperty: true,
+ hasPropertyAccessors: true
+ };
+ _emberMetal.default.defineProperty = _emberMetal.defineProperty;
+ _emberMetal.default.watchKey = _emberMetal.watchKey;
+ _emberMetal.default.unwatchKey = _emberMetal.unwatchKey;
+ _emberMetal.default.removeChainWatcher = _emberMetal.removeChainWatcher;
+ _emberMetal.default._ChainNode = _emberMetal.ChainNode;
+ _emberMetal.default.finishChains = _emberMetal.finishChains;
+ _emberMetal.default.watchPath = _emberMetal.watchPath;
+ _emberMetal.default.unwatchPath = _emberMetal.unwatchPath;
+ _emberMetal.default.watch = _emberMetal.watch;
+ _emberMetal.default.isWatching = _emberMetal.isWatching;
+ _emberMetal.default.unwatch = _emberMetal.unwatch;
+ _emberMetal.default.destroy = _emberMetal.deleteMeta;
+ _emberMetal.default.libraries = _emberMetal.libraries;
+ _emberMetal.default.OrderedSet = _emberMetal.OrderedSet;
+ _emberMetal.default.Map = _emberMetal.Map;
+ _emberMetal.default.MapWithDefault = _emberMetal.MapWithDefault;
+ _emberMetal.default.getProperties = _emberMetal.getProperties;
+ _emberMetal.default.setProperties = _emberMetal.setProperties;
+ _emberMetal.default.expandProperties = _emberMetal.expandProperties;
+ _emberMetal.default.NAME_KEY = _emberUtils.NAME_KEY;
+ _emberMetal.default.addObserver = _emberMetal.addObserver;
+ _emberMetal.default.removeObserver = _emberMetal.removeObserver;
+ if (_emberEnvironment.ENV._ENABLE_PROPERTY_REQUIRED_SUPPORT) {
+ _emberMetal.default.required = _emberMetal.required;
+ }
+ _emberMetal.default.aliasMethod = _emberMetal.aliasMethod;
+ _emberMetal.default.observer = _emberMetal.observer;
+ _emberMetal.default.mixin = _emberMetal.mixin;
+ _emberMetal.default.Mixin = _emberMetal.Mixin;
+ _emberMetal.default.bind = _emberMetal.bind;
+ _emberMetal.default.Binding = _emberMetal.Binding;
+
+ Object.defineProperty(_emberMetal.default, 'ENV', {
+ get: function () {
+ return _emberEnvironment.ENV;
+ },
+
+ enumerable: false
+ });
+
+ /**
+ The context that Ember searches for namespace instances on.
+
+ @private
+ */
+ Object.defineProperty(_emberMetal.default, 'lookup', {
+ get: function () {
+ return _emberEnvironment.context.lookup;
+ },
+ set: function (value) {
+ _emberEnvironment.context.lookup = value;
+ },
+
+ enumerable: false
+ });
+
+ _emberMetal.default.EXTEND_PROTOTYPES = _emberEnvironment.ENV.EXTEND_PROTOTYPES;
+
+ // BACKWARDS COMPAT ACCESSORS FOR ENV FLAGS
+ Object.defineProperty(_emberMetal.default, 'LOG_STACKTRACE_ON_DEPRECATION', {
+ get: function () {
+ return _emberEnvironment.ENV.LOG_STACKTRACE_ON_DEPRECATION;
+ },
+ set: function (value) {
+ _emberEnvironment.ENV.LOG_STACKTRACE_ON_DEPRECATION = !!value;
+ },
+
+ enumerable: false
+ });
+
+ Object.defineProperty(_emberMetal.default, 'LOG_VERSION', {
+ get: function () {
+ return _emberEnvironment.ENV.LOG_VERSION;
+ },
+ set: function (value) {
+ _emberEnvironment.ENV.LOG_VERSION = !!value;
+ },
+
+ enumerable: false
+ });
+
+ if (true) {
+ Object.defineProperty(_emberMetal.default, 'MODEL_FACTORY_INJECTIONS', {
+ get: function () {
+ return false;
+ },
+ set: function () {
+ (true && !(false) && (0, _emberDebug.deprecate)('Ember.MODEL_FACTORY_INJECTIONS is no longer required', false, {
+ id: 'ember-metal.model_factory_injections',
+ until: '2.17.0',
+ url: 'https://emberjs.com/deprecations/v2.x/#toc_id-ember-metal-model_factory_injections'
+ }));
+ },
+
+ enumerable: false
+ });
+ }
+
+ Object.defineProperty(_emberMetal.default, 'LOG_BINDINGS', {
+ get: function () {
+ return _emberEnvironment.ENV.LOG_BINDINGS;
+ },
+ set: function (value) {
+ _emberEnvironment.ENV.LOG_BINDINGS = !!value;
+ },
+
+ enumerable: false
+ });
+
+ /**
+ A function may be assigned to `Ember.onerror` to be called when Ember
+ internals encounter an error. This is useful for specialized error handling
+ and reporting code.
+
+ ```javascript
+ import $ from 'jquery';
+
+ Ember.onerror = function(error) {
+ $.ajax('/report-error', 'POST', {
+ stack: error.stack,
+ otherInformation: 'whatever app state you want to provide'
+ });
+ };
+ ```
+
+ Internally, `Ember.onerror` is used as Backburner's error handler.
+
+ @event onerror
+ @for Ember
+ @param {Exception} error the error object
+ @public
+ */
+ Object.defineProperty(_emberMetal.default, 'onerror', {
+ get: _emberMetal.getOnerror,
+ set: _emberMetal.setOnerror,
+ enumerable: false
+ });
+
+ Object.defineProperty(_emberMetal.default, 'testing', {
+ get: _emberDebug.isTesting,
+ set: _emberDebug.setTesting,
+ enumerable: false
+ });
+
+ _emberMetal.default._Backburner = _backburner.default;
+
+ _emberMetal.default.Logger = _emberConsole.default;
+
+ // ****ember-runtime****
+
+ _emberMetal.default.String = _emberRuntime.String;
+ _emberMetal.default.Object = _emberRuntime.Object;
+ _emberMetal.default._RegistryProxyMixin = _emberRuntime.RegistryProxyMixin;
+ _emberMetal.default._ContainerProxyMixin = _emberRuntime.ContainerProxyMixin;
+ _emberMetal.default.compare = _emberRuntime.compare;
+ _emberMetal.default.copy = _emberRuntime.copy;
+ _emberMetal.default.isEqual = _emberRuntime.isEqual;
+ _emberMetal.default.inject = _emberRuntime.inject;
+ _emberMetal.default.Array = _emberRuntime.Array;
+ _emberMetal.default.Comparable = _emberRuntime.Comparable;
+ _emberMetal.default.Enumerable = _emberRuntime.Enumerable;
+ _emberMetal.default.ArrayProxy = _emberRuntime.ArrayProxy;
+ _emberMetal.default.ObjectProxy = _emberRuntime.ObjectProxy;
+ _emberMetal.default.ActionHandler = _emberRuntime.ActionHandler;
+ _emberMetal.default.CoreObject = _emberRuntime.CoreObject;
+ _emberMetal.default.NativeArray = _emberRuntime.NativeArray;
+ _emberMetal.default.Copyable = _emberRuntime.Copyable;
+ _emberMetal.default.MutableEnumerable = _emberRuntime.MutableEnumerable;
+ _emberMetal.default.MutableArray = _emberRuntime.MutableArray;
+ _emberMetal.default.TargetActionSupport = _emberRuntime.TargetActionSupport;
+ _emberMetal.default.Evented = _emberRuntime.Evented;
+ _emberMetal.default.PromiseProxyMixin = _emberRuntime.PromiseProxyMixin;
+ _emberMetal.default.Observable = _emberRuntime.Observable;
+ _emberMetal.default.typeOf = _emberRuntime.typeOf;
+ _emberMetal.default.isArray = _emberRuntime.isArray;
+ _emberMetal.default.Object = _emberRuntime.Object;
+ _emberMetal.default.onLoad = _emberRuntime.onLoad;
+ _emberMetal.default.runLoadHooks = _emberRuntime.runLoadHooks;
+ _emberMetal.default.Controller = _emberRuntime.Controller;
+ _emberMetal.default.ControllerMixin = _emberRuntime.ControllerMixin;
+ _emberMetal.default.Service = _emberRuntime.Service;
+ _emberMetal.default._ProxyMixin = _emberRuntime._ProxyMixin;
+ _emberMetal.default.RSVP = _emberRuntime.RSVP;
+ _emberMetal.default.Namespace = _emberRuntime.Namespace;
+
+ // ES6TODO: this seems a less than ideal way/place to add properties to Ember.computed
+ computed.empty = _emberRuntime.empty;
+ computed.notEmpty = _emberRuntime.notEmpty;
+ computed.none = _emberRuntime.none;
+ computed.not = _emberRuntime.not;
+ computed.bool = _emberRuntime.bool;
+ computed.match = _emberRuntime.match;
+ computed.equal = _emberRuntime.equal;
+ computed.gt = _emberRuntime.gt;
+ computed.gte = _emberRuntime.gte;
+ computed.lt = _emberRuntime.lt;
+ computed.lte = _emberRuntime.lte;
+ computed.oneWay = _emberRuntime.oneWay;
+ computed.reads = _emberRuntime.oneWay;
+ computed.readOnly = _emberRuntime.readOnly;
+ computed.deprecatingAlias = _emberRuntime.deprecatingAlias;
+ computed.and = _emberRuntime.and;
+ computed.or = _emberRuntime.or;
+ computed.any = _emberRuntime.any;
+
+ computed.sum = _emberRuntime.sum;
+ computed.min = _emberRuntime.min;
+ computed.max = _emberRuntime.max;
+ computed.map = _emberRuntime.map;
+ computed.sort = _emberRuntime.sort;
+ computed.setDiff = _emberRuntime.setDiff;
+ computed.mapBy = _emberRuntime.mapBy;
+ computed.filter = _emberRuntime.filter;
+ computed.filterBy = _emberRuntime.filterBy;
+ computed.uniq = _emberRuntime.uniq;
+
+ computed.uniqBy = _emberRuntime.uniqBy;
+ computed.union = _emberRuntime.union;
+ computed.intersect = _emberRuntime.intersect;
+ computed.collect = _emberRuntime.collect;
+
+ /**
+ Defines the hash of localized strings for the current language. Used by
+ the `String.loc` helper. To localize, add string values to this
+ hash.
+
+ @property STRINGS
+ @for Ember
+ @type Object
+ @private
+ */
+ Object.defineProperty(_emberMetal.default, 'STRINGS', {
+ configurable: false,
+ get: _emberRuntime.getStrings,
+ set: _emberRuntime.setStrings
+ });
+
+ /**
+ Whether searching on the global for new Namespace instances is enabled.
+
+ This is only exported here as to not break any addons. Given the new
+ visit API, you will have issues if you treat this as a indicator of
+ booted.
+
+ Internally this is only exposing a flag in Namespace.
+
+ @property BOOTED
+ @for Ember
+ @type Boolean
+ @private
+ */
+ Object.defineProperty(_emberMetal.default, 'BOOTED', {
+ configurable: false,
+ enumerable: false,
+ get: _emberRuntime.isNamespaceSearchDisabled,
+ set: _emberRuntime.setNamespaceSearchDisabled
+ });
+
+ _emberMetal.default.Component = _emberGlimmer.Component;
+ _emberGlimmer.Helper.helper = _emberGlimmer.helper;
+ _emberMetal.default.Helper = _emberGlimmer.Helper;
+ _emberMetal.default.Checkbox = _emberGlimmer.Checkbox;
+ _emberMetal.default.TextField = _emberGlimmer.TextField;
+ _emberMetal.default.TextArea = _emberGlimmer.TextArea;
+ _emberMetal.default.LinkComponent = _emberGlimmer.LinkComponent;
+
+ if (_emberEnvironment.ENV.EXTEND_PROTOTYPES.String) {
+ String.prototype.htmlSafe = function () {
+ return (0, _emberGlimmer.htmlSafe)(this);
+ };
+ }
+
+ var EmberHandlebars = _emberMetal.default.Handlebars = _emberMetal.default.Handlebars || {};
+ var EmberHTMLBars = _emberMetal.default.HTMLBars = _emberMetal.default.HTMLBars || {};
+ var EmberHandleBarsUtils = EmberHandlebars.Utils = EmberHandlebars.Utils || {};
+
+ EmberHTMLBars.template = EmberHandlebars.template = _emberGlimmer.template;
+ EmberHandleBarsUtils.escapeExpression = _emberGlimmer.escapeExpression;
+ _emberRuntime.String.htmlSafe = _emberGlimmer.htmlSafe;
+
+ _emberRuntime.String.isHTMLSafe = _emberGlimmer.isHTMLSafe;
+
+ /**
+ Global hash of shared templates. This will automatically be populated
+ by the build tools so that you can store your Handlebars templates in
+ separate files that get loaded into JavaScript at buildtime.
+
+ @property TEMPLATES
+ @for Ember
+ @type Object
+ @private
+ */
+ Object.defineProperty(_emberMetal.default, 'TEMPLATES', {
+ get: _emberGlimmer.getTemplates,
+ set: _emberGlimmer.setTemplates,
+ configurable: false,
+ enumerable: false
+ });
+
+ exports.VERSION = _version.default;
+
+
+ /**
+ The semantic version
+
+ @property VERSION
+ @type String
+ @public
+ */
+ _emberMetal.default.VERSION = _version.default;
+
+ _emberMetal.libraries.registerCoreLibrary('Ember', _version.default);
+
+ // require the main entry points for each of these packages
+ // this is so that the global exports occur properly
+
+
+ _emberMetal.default.$ = _emberViews.jQuery;
+
+ _emberMetal.default.ViewTargetActionSupport = _emberViews.ViewTargetActionSupport;
+
+ _emberMetal.default.ViewUtils = {
+ isSimpleClick: _emberViews.isSimpleClick,
+ getViewElement: _emberViews.getViewElement,
+ getViewBounds: _emberViews.getViewBounds,
+ getViewClientRects: _emberViews.getViewClientRects,
+ getViewBoundingClientRect: _emberViews.getViewBoundingClientRect,
+ getRootViews: _emberViews.getRootViews,
+ getChildViews: _emberViews.getChildViews
+ };
+
+ _emberMetal.default.TextSupport = _emberViews.TextSupport;
+ _emberMetal.default.ComponentLookup = _emberViews.ComponentLookup;
+ _emberMetal.default.EventDispatcher = _emberViews.EventDispatcher;
+
+ _emberMetal.default.Location = _emberRouting.Location;
+ _emberMetal.default.AutoLocation = _emberRouting.AutoLocation;
+ _emberMetal.default.HashLocation = _emberRouting.HashLocation;
+ _emberMetal.default.HistoryLocation = _emberRouting.HistoryLocation;
+ _emberMetal.default.NoneLocation = _emberRouting.NoneLocation;
+ _emberMetal.default.controllerFor = _emberRouting.controllerFor;
+ _emberMetal.default.generateControllerFactory = _emberRouting.generateControllerFactory;
+ _emberMetal.default.generateController = _emberRouting.generateController;
+ _emberMetal.default.RouterDSL = _emberRouting.RouterDSL;
+ _emberMetal.default.Router = _emberRouting.Router;
+ _emberMetal.default.Route = _emberRouting.Route;
+
+ _emberMetal.default.Application = _emberApplication.Application;
+ _emberMetal.default.ApplicationInstance = _emberApplication.ApplicationInstance;
+ _emberMetal.default.Engine = _emberApplication.Engine;
+ _emberMetal.default.EngineInstance = _emberApplication.EngineInstance;
+ _emberMetal.default.DefaultResolver = _emberMetal.default.Resolver = _emberApplication.Resolver;
+
+ (0, _emberRuntime.runLoadHooks)('Ember.Application', _emberApplication.Application);
+
+ _emberMetal.default.DataAdapter = _emberExtensionSupport.DataAdapter;
+ _emberMetal.default.ContainerDebugAdapter = _emberExtensionSupport.ContainerDebugAdapter;
+
+ if ((0, _require2.has)('ember-template-compiler')) {
+ (0, _require2.default)('ember-template-compiler');
+ }
+
+ // do this to ensure that Ember.Test is defined properly on the global
+ // if it is present.
+ if ((0, _require2.has)('ember-testing')) {
+ var testing = (0, _require2.default)('ember-testing');
+
+ _emberMetal.default.Test = testing.Test;
+ _emberMetal.default.Test.Adapter = testing.Adapter;
+ _emberMetal.default.Test.QUnitAdapter = testing.QUnitAdapter;
+ _emberMetal.default.setupForTesting = testing.setupForTesting;
+ }
+
+ (0, _emberRuntime.runLoadHooks)('Ember');
+
+ /**
+ @module ember
+ @private
+ */
+ exports.default = _emberMetal.default;
+
+
+ /* globals module */
+ if (_nodeModule.IS_NODE) {
+ _nodeModule.module.exports = _emberMetal.default;
+ } else {
+ _emberEnvironment.context.exports.Ember = _emberEnvironment.context.exports.Em = _emberMetal.default;
+ }
+
+ /**
+ @module jquery
+ @public
+ */
+
+ /**
+ @class jquery
+ @public
+ @static
+ */
+
+ /**
+ Alias for jQuery
+
+ @for jquery
+ @method $
+ @static
+ @public
+ */
+});
+enifed("ember/version", ["exports"], function (exports) {
+ "use strict";
+
+ exports.default = "3.0.0";
+});
+enifed("handlebars", ["exports"], function (exports) {
+ "use strict";
+
+ // File ignored in coverage tests via setting in .istanbul.yml
+ /* Jison generated parser */
+ var handlebars = function () {
+ var parser = { trace: function trace() {},
+ yy: {},
+ symbols_: { "error": 2, "root": 3, "program": 4, "EOF": 5, "program_repetition0": 6, "statement": 7, "mustache": 8, "block": 9, "rawBlock": 10, "partial": 11, "partialBlock": 12, "content": 13, "COMMENT": 14, "CONTENT": 15, "openRawBlock": 16, "rawBlock_repetition_plus0": 17, "END_RAW_BLOCK": 18, "OPEN_RAW_BLOCK": 19, "helperName": 20, "openRawBlock_repetition0": 21, "openRawBlock_option0": 22, "CLOSE_RAW_BLOCK": 23, "openBlock": 24, "block_option0": 25, "closeBlock": 26, "openInverse": 27, "block_option1": 28, "OPEN_BLOCK": 29, "openBlock_repetition0": 30, "openBlock_option0": 31, "openBlock_option1": 32, "CLOSE": 33, "OPEN_INVERSE": 34, "openInverse_repetition0": 35, "openInverse_option0": 36, "openInverse_option1": 37, "openInverseChain": 38, "OPEN_INVERSE_CHAIN": 39, "openInverseChain_repetition0": 40, "openInverseChain_option0": 41, "openInverseChain_option1": 42, "inverseAndProgram": 43, "INVERSE": 44, "inverseChain": 45, "inverseChain_option0": 46, "OPEN_ENDBLOCK": 47, "OPEN": 48, "mustache_repetition0": 49, "mustache_option0": 50, "OPEN_UNESCAPED": 51, "mustache_repetition1": 52, "mustache_option1": 53, "CLOSE_UNESCAPED": 54, "OPEN_PARTIAL": 55, "partialName": 56, "partial_repetition0": 57, "partial_option0": 58, "openPartialBlock": 59, "OPEN_PARTIAL_BLOCK": 60, "openPartialBlock_repetition0": 61, "openPartialBlock_option0": 62, "param": 63, "sexpr": 64, "OPEN_SEXPR": 65, "sexpr_repetition0": 66, "sexpr_option0": 67, "CLOSE_SEXPR": 68, "hash": 69, "hash_repetition_plus0": 70, "hashSegment": 71, "ID": 72, "EQUALS": 73, "blockParams": 74, "OPEN_BLOCK_PARAMS": 75, "blockParams_repetition_plus0": 76, "CLOSE_BLOCK_PARAMS": 77, "path": 78, "dataName": 79, "STRING": 80, "NUMBER": 81, "BOOLEAN": 82, "UNDEFINED": 83, "NULL": 84, "DATA": 85, "pathSegments": 86, "SEP": 87, "$accept": 0, "$end": 1 },
+ terminals_: { 2: "error", 5: "EOF", 14: "COMMENT", 15: "CONTENT", 18: "END_RAW_BLOCK", 19: "OPEN_RAW_BLOCK", 23: "CLOSE_RAW_BLOCK", 29: "OPEN_BLOCK", 33: "CLOSE", 34: "OPEN_INVERSE", 39: "OPEN_INVERSE_CHAIN", 44: "INVERSE", 47: "OPEN_ENDBLOCK", 48: "OPEN", 51: "OPEN_UNESCAPED", 54: "CLOSE_UNESCAPED", 55: "OPEN_PARTIAL", 60: "OPEN_PARTIAL_BLOCK", 65: "OPEN_SEXPR", 68: "CLOSE_SEXPR", 72: "ID", 73: "EQUALS", 75: "OPEN_BLOCK_PARAMS", 77: "CLOSE_BLOCK_PARAMS", 80: "STRING", 81: "NUMBER", 82: "BOOLEAN", 83: "UNDEFINED", 84: "NULL", 85: "DATA", 87: "SEP" },
+ productions_: [0, [3, 2], [4, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [13, 1], [10, 3], [16, 5], [9, 4], [9, 4], [24, 6], [27, 6], [38, 6], [43, 2], [45, 3], [45, 1], [26, 3], [8, 5], [8, 5], [11, 5], [12, 3], [59, 5], [63, 1], [63, 1], [64, 5], [69, 1], [71, 3], [74, 3], [20, 1], [20, 1], [20, 1], [20, 1], [20, 1], [20, 1], [20, 1], [56, 1], [56, 1], [79, 2], [78, 1], [86, 3], [86, 1], [6, 0], [6, 2], [17, 1], [17, 2], [21, 0], [21, 2], [22, 0], [22, 1], [25, 0], [25, 1], [28, 0], [28, 1], [30, 0], [30, 2], [31, 0], [31, 1], [32, 0], [32, 1], [35, 0], [35, 2], [36, 0], [36, 1], [37, 0], [37, 1], [40, 0], [40, 2], [41, 0], [41, 1], [42, 0], [42, 1], [46, 0], [46, 1], [49, 0], [49, 2], [50, 0], [50, 1], [52, 0], [52, 2], [53, 0], [53, 1], [57, 0], [57, 2], [58, 0], [58, 1], [61, 0], [61, 2], [62, 0], [62, 1], [66, 0], [66, 2], [67, 0], [67, 1], [70, 1], [70, 2], [76, 1], [76, 2]],
+ performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$
+ /**/) {
+
+ var $0 = $$.length - 1;
+ switch (yystate) {
+ case 1:
+ return $$[$0 - 1];
+ break;
+ case 2:
+ this.$ = yy.prepareProgram($$[$0]);
+ break;
+ case 3:
+ this.$ = $$[$0];
+ break;
+ case 4:
+ this.$ = $$[$0];
+ break;
+ case 5:
+ this.$ = $$[$0];
+ break;
+ case 6:
+ this.$ = $$[$0];
+ break;
+ case 7:
+ this.$ = $$[$0];
+ break;
+ case 8:
+ this.$ = $$[$0];
+ break;
+ case 9:
+ this.$ = {
+ type: 'CommentStatement',
+ value: yy.stripComment($$[$0]),
+ strip: yy.stripFlags($$[$0], $$[$0]),
+ loc: yy.locInfo(this._$)
+ };
+
+ break;
+ case 10:
+ this.$ = {
+ type: 'ContentStatement',
+ original: $$[$0],
+ value: $$[$0],
+ loc: yy.locInfo(this._$)
+ };
+
+ break;
+ case 11:
+ this.$ = yy.prepareRawBlock($$[$0 - 2], $$[$0 - 1], $$[$0], this._$);
+ break;
+ case 12:
+ this.$ = { path: $$[$0 - 3], params: $$[$0 - 2], hash: $$[$0 - 1] };
+ break;
+ case 13:
+ this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], false, this._$);
+ break;
+ case 14:
+ this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], true, this._$);
+ break;
+ case 15:
+ this.$ = { open: $$[$0 - 5], path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) };
+ break;
+ case 16:
+ this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) };
+ break;
+ case 17:
+ this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) };
+ break;
+ case 18:
+ this.$ = { strip: yy.stripFlags($$[$0 - 1], $$[$0 - 1]), program: $$[$0] };
+ break;
+ case 19:
+ var inverse = yy.prepareBlock($$[$0 - 2], $$[$0 - 1], $$[$0], $$[$0], false, this._$),
+ program = yy.prepareProgram([inverse], $$[$0 - 1].loc);
+ program.chained = true;
+
+ this.$ = { strip: $$[$0 - 2].strip, program: program, chain: true };
+
+ break;
+ case 20:
+ this.$ = $$[$0];
+ break;
+ case 21:
+ this.$ = { path: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 2], $$[$0]) };
+ break;
+ case 22:
+ this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$);
+ break;
+ case 23:
+ this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$);
+ break;
+ case 24:
+ this.$ = {
+ type: 'PartialStatement',
+ name: $$[$0 - 3],
+ params: $$[$0 - 2],
+ hash: $$[$0 - 1],
+ indent: '',
+ strip: yy.stripFlags($$[$0 - 4], $$[$0]),
+ loc: yy.locInfo(this._$)
+ };
+
+ break;
+ case 25:
+ this.$ = yy.preparePartialBlock($$[$0 - 2], $$[$0 - 1], $$[$0], this._$);
+ break;
+ case 26:
+ this.$ = { path: $$[$0 - 3], params: $$[$0 - 2], hash: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 4], $$[$0]) };
+ break;
+ case 27:
+ this.$ = $$[$0];
+ break;
+ case 28:
+ this.$ = $$[$0];
+ break;
+ case 29:
+ this.$ = {
+ type: 'SubExpression',
+ path: $$[$0 - 3],
+ params: $$[$0 - 2],
+ hash: $$[$0 - 1],
+ loc: yy.locInfo(this._$)
+ };
+
+ break;
+ case 30:
+ this.$ = { type: 'Hash', pairs: $$[$0], loc: yy.locInfo(this._$) };
+ break;
+ case 31:
+ this.$ = { type: 'HashPair', key: yy.id($$[$0 - 2]), value: $$[$0], loc: yy.locInfo(this._$) };
+ break;
+ case 32:
+ this.$ = yy.id($$[$0 - 1]);
+ break;
+ case 33:
+ this.$ = $$[$0];
+ break;
+ case 34:
+ this.$ = $$[$0];
+ break;
+ case 35:
+ this.$ = { type: 'StringLiteral', value: $$[$0], original: $$[$0], loc: yy.locInfo(this._$) };
+ break;
+ case 36:
+ this.$ = { type: 'NumberLiteral', value: Number($$[$0]), original: Number($$[$0]), loc: yy.locInfo(this._$) };
+ break;
+ case 37:
+ this.$ = { type: 'BooleanLiteral', value: $$[$0] === 'true', original: $$[$0] === 'true', loc: yy.locInfo(this._$) };
+ break;
+ case 38:
+ this.$ = { type: 'UndefinedLiteral', original: undefined, value: undefined, loc: yy.locInfo(this._$) };
+ break;
+ case 39:
+ this.$ = { type: 'NullLiteral', original: null, value: null, loc: yy.locInfo(this._$) };
+ break;
+ case 40:
+ this.$ = $$[$0];
+ break;
+ case 41:
+ this.$ = $$[$0];
+ break;
+ case 42:
+ this.$ = yy.preparePath(true, $$[$0], this._$);
+ break;
+ case 43:
+ this.$ = yy.preparePath(false, $$[$0], this._$);
+ break;
+ case 44:
+ $$[$0 - 2].push({ part: yy.id($$[$0]), original: $$[$0], separator: $$[$0 - 1] });this.$ = $$[$0 - 2];
+ break;
+ case 45:
+ this.$ = [{ part: yy.id($$[$0]), original: $$[$0] }];
+ break;
+ case 46:
+ this.$ = [];
+ break;
+ case 47:
+ $$[$0 - 1].push($$[$0]);
+ break;
+ case 48:
+ this.$ = [$$[$0]];
+ break;
+ case 49:
+ $$[$0 - 1].push($$[$0]);
+ break;
+ case 50:
+ this.$ = [];
+ break;
+ case 51:
+ $$[$0 - 1].push($$[$0]);
+ break;
+ case 58:
+ this.$ = [];
+ break;
+ case 59:
+ $$[$0 - 1].push($$[$0]);
+ break;
+ case 64:
+ this.$ = [];
+ break;
+ case 65:
+ $$[$0 - 1].push($$[$0]);
+ break;
+ case 70:
+ this.$ = [];
+ break;
+ case 71:
+ $$[$0 - 1].push($$[$0]);
+ break;
+ case 78:
+ this.$ = [];
+ break;
+ case 79:
+ $$[$0 - 1].push($$[$0]);
+ break;
+ case 82:
+ this.$ = [];
+ break;
+ case 83:
+ $$[$0 - 1].push($$[$0]);
+ break;
+ case 86:
+ this.$ = [];
+ break;
+ case 87:
+ $$[$0 - 1].push($$[$0]);
+ break;
+ case 90:
+ this.$ = [];
+ break;
+ case 91:
+ $$[$0 - 1].push($$[$0]);
+ break;
+ case 94:
+ this.$ = [];
+ break;
+ case 95:
+ $$[$0 - 1].push($$[$0]);
+ break;
+ case 98:
+ this.$ = [$$[$0]];
+ break;
+ case 99:
+ $$[$0 - 1].push($$[$0]);
+ break;
+ case 100:
+ this.$ = [$$[$0]];
+ break;
+ case 101:
+ $$[$0 - 1].push($$[$0]);
+ break;
+ }
+ },
+ table: [{ 3: 1, 4: 2, 5: [2, 46], 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 1: [3] }, { 5: [1, 4] }, { 5: [2, 2], 7: 5, 8: 6, 9: 7, 10: 8, 11: 9, 12: 10, 13: 11, 14: [1, 12], 15: [1, 20], 16: 17, 19: [1, 23], 24: 15, 27: 16, 29: [1, 21], 34: [1, 22], 39: [2, 2], 44: [2, 2], 47: [2, 2], 48: [1, 13], 51: [1, 14], 55: [1, 18], 59: 19, 60: [1, 24] }, { 1: [2, 1] }, { 5: [2, 47], 14: [2, 47], 15: [2, 47], 19: [2, 47], 29: [2, 47], 34: [2, 47], 39: [2, 47], 44: [2, 47], 47: [2, 47], 48: [2, 47], 51: [2, 47], 55: [2, 47], 60: [2, 47] }, { 5: [2, 3], 14: [2, 3], 15: [2, 3], 19: [2, 3], 29: [2, 3], 34: [2, 3], 39: [2, 3], 44: [2, 3], 47: [2, 3], 48: [2, 3], 51: [2, 3], 55: [2, 3], 60: [2, 3] }, { 5: [2, 4], 14: [2, 4], 15: [2, 4], 19: [2, 4], 29: [2, 4], 34: [2, 4], 39: [2, 4], 44: [2, 4], 47: [2, 4], 48: [2, 4], 51: [2, 4], 55: [2, 4], 60: [2, 4] }, { 5: [2, 5], 14: [2, 5], 15: [2, 5], 19: [2, 5], 29: [2, 5], 34: [2, 5], 39: [2, 5], 44: [2, 5], 47: [2, 5], 48: [2, 5], 51: [2, 5], 55: [2, 5], 60: [2, 5] }, { 5: [2, 6], 14: [2, 6], 15: [2, 6], 19: [2, 6], 29: [2, 6], 34: [2, 6], 39: [2, 6], 44: [2, 6], 47: [2, 6], 48: [2, 6], 51: [2, 6], 55: [2, 6], 60: [2, 6] }, { 5: [2, 7], 14: [2, 7], 15: [2, 7], 19: [2, 7], 29: [2, 7], 34: [2, 7], 39: [2, 7], 44: [2, 7], 47: [2, 7], 48: [2, 7], 51: [2, 7], 55: [2, 7], 60: [2, 7] }, { 5: [2, 8], 14: [2, 8], 15: [2, 8], 19: [2, 8], 29: [2, 8], 34: [2, 8], 39: [2, 8], 44: [2, 8], 47: [2, 8], 48: [2, 8], 51: [2, 8], 55: [2, 8], 60: [2, 8] }, { 5: [2, 9], 14: [2, 9], 15: [2, 9], 19: [2, 9], 29: [2, 9], 34: [2, 9], 39: [2, 9], 44: [2, 9], 47: [2, 9], 48: [2, 9], 51: [2, 9], 55: [2, 9], 60: [2, 9] }, { 20: 25, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 36, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 4: 37, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 39: [2, 46], 44: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 4: 38, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 44: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 13: 40, 15: [1, 20], 17: 39 }, { 20: 42, 56: 41, 64: 43, 65: [1, 44], 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 4: 45, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 5: [2, 10], 14: [2, 10], 15: [2, 10], 18: [2, 10], 19: [2, 10], 29: [2, 10], 34: [2, 10], 39: [2, 10], 44: [2, 10], 47: [2, 10], 48: [2, 10], 51: [2, 10], 55: [2, 10], 60: [2, 10] }, { 20: 46, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 47, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 48, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 42, 56: 49, 64: 43, 65: [1, 44], 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 33: [2, 78], 49: 50, 65: [2, 78], 72: [2, 78], 80: [2, 78], 81: [2, 78], 82: [2, 78], 83: [2, 78], 84: [2, 78], 85: [2, 78] }, { 23: [2, 33], 33: [2, 33], 54: [2, 33], 65: [2, 33], 68: [2, 33], 72: [2, 33], 75: [2, 33], 80: [2, 33], 81: [2, 33], 82: [2, 33], 83: [2, 33], 84: [2, 33], 85: [2, 33] }, { 23: [2, 34], 33: [2, 34], 54: [2, 34], 65: [2, 34], 68: [2, 34], 72: [2, 34], 75: [2, 34], 80: [2, 34], 81: [2, 34], 82: [2, 34], 83: [2, 34], 84: [2, 34], 85: [2, 34] }, { 23: [2, 35], 33: [2, 35], 54: [2, 35], 65: [2, 35], 68: [2, 35], 72: [2, 35], 75: [2, 35], 80: [2, 35], 81: [2, 35], 82: [2, 35], 83: [2, 35], 84: [2, 35], 85: [2, 35] }, { 23: [2, 36], 33: [2, 36], 54: [2, 36], 65: [2, 36], 68: [2, 36], 72: [2, 36], 75: [2, 36], 80: [2, 36], 81: [2, 36], 82: [2, 36], 83: [2, 36], 84: [2, 36], 85: [2, 36] }, { 23: [2, 37], 33: [2, 37], 54: [2, 37], 65: [2, 37], 68: [2, 37], 72: [2, 37], 75: [2, 37], 80: [2, 37], 81: [2, 37], 82: [2, 37], 83: [2, 37], 84: [2, 37], 85: [2, 37] }, { 23: [2, 38], 33: [2, 38], 54: [2, 38], 65: [2, 38], 68: [2, 38], 72: [2, 38], 75: [2, 38], 80: [2, 38], 81: [2, 38], 82: [2, 38], 83: [2, 38], 84: [2, 38], 85: [2, 38] }, { 23: [2, 39], 33: [2, 39], 54: [2, 39], 65: [2, 39], 68: [2, 39], 72: [2, 39], 75: [2, 39], 80: [2, 39], 81: [2, 39], 82: [2, 39], 83: [2, 39], 84: [2, 39], 85: [2, 39] }, { 23: [2, 43], 33: [2, 43], 54: [2, 43], 65: [2, 43], 68: [2, 43], 72: [2, 43], 75: [2, 43], 80: [2, 43], 81: [2, 43], 82: [2, 43], 83: [2, 43], 84: [2, 43], 85: [2, 43], 87: [1, 51] }, { 72: [1, 35], 86: 52 }, { 23: [2, 45], 33: [2, 45], 54: [2, 45], 65: [2, 45], 68: [2, 45], 72: [2, 45], 75: [2, 45], 80: [2, 45], 81: [2, 45], 82: [2, 45], 83: [2, 45], 84: [2, 45], 85: [2, 45], 87: [2, 45] }, { 52: 53, 54: [2, 82], 65: [2, 82], 72: [2, 82], 80: [2, 82], 81: [2, 82], 82: [2, 82], 83: [2, 82], 84: [2, 82], 85: [2, 82] }, { 25: 54, 38: 56, 39: [1, 58], 43: 57, 44: [1, 59], 45: 55, 47: [2, 54] }, { 28: 60, 43: 61, 44: [1, 59], 47: [2, 56] }, { 13: 63, 15: [1, 20], 18: [1, 62] }, { 15: [2, 48], 18: [2, 48] }, { 33: [2, 86], 57: 64, 65: [2, 86], 72: [2, 86], 80: [2, 86], 81: [2, 86], 82: [2, 86], 83: [2, 86], 84: [2, 86], 85: [2, 86] }, { 33: [2, 40], 65: [2, 40], 72: [2, 40], 80: [2, 40], 81: [2, 40], 82: [2, 40], 83: [2, 40], 84: [2, 40], 85: [2, 40] }, { 33: [2, 41], 65: [2, 41], 72: [2, 41], 80: [2, 41], 81: [2, 41], 82: [2, 41], 83: [2, 41], 84: [2, 41], 85: [2, 41] }, { 20: 65, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 26: 66, 47: [1, 67] }, { 30: 68, 33: [2, 58], 65: [2, 58], 72: [2, 58], 75: [2, 58], 80: [2, 58], 81: [2, 58], 82: [2, 58], 83: [2, 58], 84: [2, 58], 85: [2, 58] }, { 33: [2, 64], 35: 69, 65: [2, 64], 72: [2, 64], 75: [2, 64], 80: [2, 64], 81: [2, 64], 82: [2, 64], 83: [2, 64], 84: [2, 64], 85: [2, 64] }, { 21: 70, 23: [2, 50], 65: [2, 50], 72: [2, 50], 80: [2, 50], 81: [2, 50], 82: [2, 50], 83: [2, 50], 84: [2, 50], 85: [2, 50] }, { 33: [2, 90], 61: 71, 65: [2, 90], 72: [2, 90], 80: [2, 90], 81: [2, 90], 82: [2, 90], 83: [2, 90], 84: [2, 90], 85: [2, 90] }, { 20: 75, 33: [2, 80], 50: 72, 63: 73, 64: 76, 65: [1, 44], 69: 74, 70: 77, 71: 78, 72: [1, 79], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 72: [1, 80] }, { 23: [2, 42], 33: [2, 42], 54: [2, 42], 65: [2, 42], 68: [2, 42], 72: [2, 42], 75: [2, 42], 80: [2, 42], 81: [2, 42], 82: [2, 42], 83: [2, 42], 84: [2, 42], 85: [2, 42], 87: [1, 51] }, { 20: 75, 53: 81, 54: [2, 84], 63: 82, 64: 76, 65: [1, 44], 69: 83, 70: 77, 71: 78, 72: [1, 79], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 26: 84, 47: [1, 67] }, { 47: [2, 55] }, { 4: 85, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 39: [2, 46], 44: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 47: [2, 20] }, { 20: 86, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 4: 87, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 26: 88, 47: [1, 67] }, { 47: [2, 57] }, { 5: [2, 11], 14: [2, 11], 15: [2, 11], 19: [2, 11], 29: [2, 11], 34: [2, 11], 39: [2, 11], 44: [2, 11], 47: [2, 11], 48: [2, 11], 51: [2, 11], 55: [2, 11], 60: [2, 11] }, { 15: [2, 49], 18: [2, 49] }, { 20: 75, 33: [2, 88], 58: 89, 63: 90, 64: 76, 65: [1, 44], 69: 91, 70: 77, 71: 78, 72: [1, 79], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 65: [2, 94], 66: 92, 68: [2, 94], 72: [2, 94], 80: [2, 94], 81: [2, 94], 82: [2, 94], 83: [2, 94], 84: [2, 94], 85: [2, 94] }, { 5: [2, 25], 14: [2, 25], 15: [2, 25], 19: [2, 25], 29: [2, 25], 34: [2, 25], 39: [2, 25], 44: [2, 25], 47: [2, 25], 48: [2, 25], 51: [2, 25], 55: [2, 25], 60: [2, 25] }, { 20: 93, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 75, 31: 94, 33: [2, 60], 63: 95, 64: 76, 65: [1, 44], 69: 96, 70: 77, 71: 78, 72: [1, 79], 75: [2, 60], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 75, 33: [2, 66], 36: 97, 63: 98, 64: 76, 65: [1, 44], 69: 99, 70: 77, 71: 78, 72: [1, 79], 75: [2, 66], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 75, 22: 100, 23: [2, 52], 63: 101, 64: 76, 65: [1, 44], 69: 102, 70: 77, 71: 78, 72: [1, 79], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 75, 33: [2, 92], 62: 103, 63: 104, 64: 76, 65: [1, 44], 69: 105, 70: 77, 71: 78, 72: [1, 79], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 33: [1, 106] }, { 33: [2, 79], 65: [2, 79], 72: [2, 79], 80: [2, 79], 81: [2, 79], 82: [2, 79], 83: [2, 79], 84: [2, 79], 85: [2, 79] }, { 33: [2, 81] }, { 23: [2, 27], 33: [2, 27], 54: [2, 27], 65: [2, 27], 68: [2, 27], 72: [2, 27], 75: [2, 27], 80: [2, 27], 81: [2, 27], 82: [2, 27], 83: [2, 27], 84: [2, 27], 85: [2, 27] }, { 23: [2, 28], 33: [2, 28], 54: [2, 28], 65: [2, 28], 68: [2, 28], 72: [2, 28], 75: [2, 28], 80: [2, 28], 81: [2, 28], 82: [2, 28], 83: [2, 28], 84: [2, 28], 85: [2, 28] }, { 23: [2, 30], 33: [2, 30], 54: [2, 30], 68: [2, 30], 71: 107, 72: [1, 108], 75: [2, 30] }, { 23: [2, 98], 33: [2, 98], 54: [2, 98], 68: [2, 98], 72: [2, 98], 75: [2, 98] }, { 23: [2, 45], 33: [2, 45], 54: [2, 45], 65: [2, 45], 68: [2, 45], 72: [2, 45], 73: [1, 109], 75: [2, 45], 80: [2, 45], 81: [2, 45], 82: [2, 45], 83: [2, 45], 84: [2, 45], 85: [2, 45], 87: [2, 45] }, { 23: [2, 44], 33: [2, 44], 54: [2, 44], 65: [2, 44], 68: [2, 44], 72: [2, 44], 75: [2, 44], 80: [2, 44], 81: [2, 44], 82: [2, 44], 83: [2, 44], 84: [2, 44], 85: [2, 44], 87: [2, 44] }, { 54: [1, 110] }, { 54: [2, 83], 65: [2, 83], 72: [2, 83], 80: [2, 83], 81: [2, 83], 82: [2, 83], 83: [2, 83], 84: [2, 83], 85: [2, 83] }, { 54: [2, 85] }, { 5: [2, 13], 14: [2, 13], 15: [2, 13], 19: [2, 13], 29: [2, 13], 34: [2, 13], 39: [2, 13], 44: [2, 13], 47: [2, 13], 48: [2, 13], 51: [2, 13], 55: [2, 13], 60: [2, 13] }, { 38: 56, 39: [1, 58], 43: 57, 44: [1, 59], 45: 112, 46: 111, 47: [2, 76] }, { 33: [2, 70], 40: 113, 65: [2, 70], 72: [2, 70], 75: [2, 70], 80: [2, 70], 81: [2, 70], 82: [2, 70], 83: [2, 70], 84: [2, 70], 85: [2, 70] }, { 47: [2, 18] }, { 5: [2, 14], 14: [2, 14], 15: [2, 14], 19: [2, 14], 29: [2, 14], 34: [2, 14], 39: [2, 14], 44: [2, 14], 47: [2, 14], 48: [2, 14], 51: [2, 14], 55: [2, 14], 60: [2, 14] }, { 33: [1, 114] }, { 33: [2, 87], 65: [2, 87], 72: [2, 87], 80: [2, 87], 81: [2, 87], 82: [2, 87], 83: [2, 87], 84: [2, 87], 85: [2, 87] }, { 33: [2, 89] }, { 20: 75, 63: 116, 64: 76, 65: [1, 44], 67: 115, 68: [2, 96], 69: 117, 70: 77, 71: 78, 72: [1, 79], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 33: [1, 118] }, { 32: 119, 33: [2, 62], 74: 120, 75: [1, 121] }, { 33: [2, 59], 65: [2, 59], 72: [2, 59], 75: [2, 59], 80: [2, 59], 81: [2, 59], 82: [2, 59], 83: [2, 59], 84: [2, 59], 85: [2, 59] }, { 33: [2, 61], 75: [2, 61] }, { 33: [2, 68], 37: 122, 74: 123, 75: [1, 121] }, { 33: [2, 65], 65: [2, 65], 72: [2, 65], 75: [2, 65], 80: [2, 65], 81: [2, 65], 82: [2, 65], 83: [2, 65], 84: [2, 65], 85: [2, 65] }, { 33: [2, 67], 75: [2, 67] }, { 23: [1, 124] }, { 23: [2, 51], 65: [2, 51], 72: [2, 51], 80: [2, 51], 81: [2, 51], 82: [2, 51], 83: [2, 51], 84: [2, 51], 85: [2, 51] }, { 23: [2, 53] }, { 33: [1, 125] }, { 33: [2, 91], 65: [2, 91], 72: [2, 91], 80: [2, 91], 81: [2, 91], 82: [2, 91], 83: [2, 91], 84: [2, 91], 85: [2, 91] }, { 33: [2, 93] }, { 5: [2, 22], 14: [2, 22], 15: [2, 22], 19: [2, 22], 29: [2, 22], 34: [2, 22], 39: [2, 22], 44: [2, 22], 47: [2, 22], 48: [2, 22], 51: [2, 22], 55: [2, 22], 60: [2, 22] }, { 23: [2, 99], 33: [2, 99], 54: [2, 99], 68: [2, 99], 72: [2, 99], 75: [2, 99] }, { 73: [1, 109] }, { 20: 75, 63: 126, 64: 76, 65: [1, 44], 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 5: [2, 23], 14: [2, 23], 15: [2, 23], 19: [2, 23], 29: [2, 23], 34: [2, 23], 39: [2, 23], 44: [2, 23], 47: [2, 23], 48: [2, 23], 51: [2, 23], 55: [2, 23], 60: [2, 23] }, { 47: [2, 19] }, { 47: [2, 77] }, { 20: 75, 33: [2, 72], 41: 127, 63: 128, 64: 76, 65: [1, 44], 69: 129, 70: 77, 71: 78, 72: [1, 79], 75: [2, 72], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 5: [2, 24], 14: [2, 24], 15: [2, 24], 19: [2, 24], 29: [2, 24], 34: [2, 24], 39: [2, 24], 44: [2, 24], 47: [2, 24], 48: [2, 24], 51: [2, 24], 55: [2, 24], 60: [2, 24] }, { 68: [1, 130] }, { 65: [2, 95], 68: [2, 95], 72: [2, 95], 80: [2, 95], 81: [2, 95], 82: [2, 95], 83: [2, 95], 84: [2, 95], 85: [2, 95] }, { 68: [2, 97] }, { 5: [2, 21], 14: [2, 21], 15: [2, 21], 19: [2, 21], 29: [2, 21], 34: [2, 21], 39: [2, 21], 44: [2, 21], 47: [2, 21], 48: [2, 21], 51: [2, 21], 55: [2, 21], 60: [2, 21] }, { 33: [1, 131] }, { 33: [2, 63] }, { 72: [1, 133], 76: 132 }, { 33: [1, 134] }, { 33: [2, 69] }, { 15: [2, 12] }, { 14: [2, 26], 15: [2, 26], 19: [2, 26], 29: [2, 26], 34: [2, 26], 47: [2, 26], 48: [2, 26], 51: [2, 26], 55: [2, 26], 60: [2, 26] }, { 23: [2, 31], 33: [2, 31], 54: [2, 31], 68: [2, 31], 72: [2, 31], 75: [2, 31] }, { 33: [2, 74], 42: 135, 74: 136, 75: [1, 121] }, { 33: [2, 71], 65: [2, 71], 72: [2, 71], 75: [2, 71], 80: [2, 71], 81: [2, 71], 82: [2, 71], 83: [2, 71], 84: [2, 71], 85: [2, 71] }, { 33: [2, 73], 75: [2, 73] }, { 23: [2, 29], 33: [2, 29], 54: [2, 29], 65: [2, 29], 68: [2, 29], 72: [2, 29], 75: [2, 29], 80: [2, 29], 81: [2, 29], 82: [2, 29], 83: [2, 29], 84: [2, 29], 85: [2, 29] }, { 14: [2, 15], 15: [2, 15], 19: [2, 15], 29: [2, 15], 34: [2, 15], 39: [2, 15], 44: [2, 15], 47: [2, 15], 48: [2, 15], 51: [2, 15], 55: [2, 15], 60: [2, 15] }, { 72: [1, 138], 77: [1, 137] }, { 72: [2, 100], 77: [2, 100] }, { 14: [2, 16], 15: [2, 16], 19: [2, 16], 29: [2, 16], 34: [2, 16], 44: [2, 16], 47: [2, 16], 48: [2, 16], 51: [2, 16], 55: [2, 16], 60: [2, 16] }, { 33: [1, 139] }, { 33: [2, 75] }, { 33: [2, 32] }, { 72: [2, 101], 77: [2, 101] }, { 14: [2, 17], 15: [2, 17], 19: [2, 17], 29: [2, 17], 34: [2, 17], 39: [2, 17], 44: [2, 17], 47: [2, 17], 48: [2, 17], 51: [2, 17], 55: [2, 17], 60: [2, 17] }],
+ defaultActions: { 4: [2, 1], 55: [2, 55], 57: [2, 20], 61: [2, 57], 74: [2, 81], 83: [2, 85], 87: [2, 18], 91: [2, 89], 102: [2, 53], 105: [2, 93], 111: [2, 19], 112: [2, 77], 117: [2, 97], 120: [2, 63], 123: [2, 69], 124: [2, 12], 136: [2, 75], 137: [2, 32] },
+ parseError: function parseError(str, hash) {
+ throw new Error(str);
+ },
+ parse: function parse(input) {
+ var self = this,
+ stack = [0],
+ vstack = [null],
+ lstack = [],
+ table = this.table,
+ yytext = "",
+ yylineno = 0,
+ yyleng = 0,
+ recovering = 0;
+ this.lexer.setInput(input);
+ this.lexer.yy = this.yy;
+ this.yy.lexer = this.lexer;
+ this.yy.parser = this;
+ if (typeof this.lexer.yylloc == "undefined") this.lexer.yylloc = {};
+ var yyloc = this.lexer.yylloc;
+ lstack.push(yyloc);
+ var ranges = this.lexer.options && this.lexer.options.ranges;
+ if (typeof this.yy.parseError === "function") this.parseError = this.yy.parseError;
+ function lex() {
+ var token;
+ token = self.lexer.lex() || 1;
+ if (typeof token !== "number") {
+ token = self.symbols_[token] || token;
+ }
+ return token;
+ }
+ var symbol,
+ preErrorSymbol,
+ state,
+ action,
+ a,
+ r,
+ yyval = {},
+ p,
+ len,
+ newState,
+ expected;
+ while (true) {
+ state = stack[stack.length - 1];
+ if (this.defaultActions[state]) {
+ action = this.defaultActions[state];
+ } else {
+ if (symbol === null || typeof symbol == "undefined") {
+ symbol = lex();
+ }
+ action = table[state] && table[state][symbol];
+ }
+ if (typeof action === "undefined" || !action.length || !action[0]) {
+ var errStr = "";
+ if (!recovering) {
+ expected = [];
+ for (p in table[state]) {
+ if (this.terminals_[p] && p > 2) {
+ expected.push("'" + this.terminals_[p] + "'");
+ }
+ }if (this.lexer.showPosition) {
+ errStr = "Parse error on line " + (yylineno + 1) + ":\n" + this.lexer.showPosition() + "\nExpecting " + expected.join(", ") + ", got '" + (this.terminals_[symbol] || symbol) + "'";
+ } else {
+ errStr = "Parse error on line " + (yylineno + 1) + ": Unexpected " + (symbol == 1 ? "end of input" : "'" + (this.terminals_[symbol] || symbol) + "'");
+ }
+ this.parseError(errStr, { text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected });
+ }
+ }
+ if (action[0] instanceof Array && action.length > 1) {
+ throw new Error("Parse Error: multiple actions possible at state: " + state + ", token: " + symbol);
+ }
+ switch (action[0]) {
+ case 1:
+ stack.push(symbol);
+ vstack.push(this.lexer.yytext);
+ lstack.push(this.lexer.yylloc);
+ stack.push(action[1]);
+ symbol = null;
+ if (!preErrorSymbol) {
+ yyleng = this.lexer.yyleng;
+ yytext = this.lexer.yytext;
+ yylineno = this.lexer.yylineno;
+ yyloc = this.lexer.yylloc;
+ if (recovering > 0) recovering--;
+ } else {
+ symbol = preErrorSymbol;
+ preErrorSymbol = null;
+ }
+ break;
+ case 2:
+ len = this.productions_[action[1]][1];
+ yyval.$ = vstack[vstack.length - len];
+ yyval._$ = { first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column };
+ if (ranges) {
+ yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]];
+ }
+ r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack);
+ if (typeof r !== "undefined") {
+ return r;
+ }
+ if (len) {
+ stack = stack.slice(0, -1 * len * 2);
+ vstack = vstack.slice(0, -1 * len);
+ lstack = lstack.slice(0, -1 * len);
+ }
+ stack.push(this.productions_[action[1]][0]);
+ vstack.push(yyval.$);
+ lstack.push(yyval._$);
+ newState = table[stack[stack.length - 2]][stack[stack.length - 1]];
+ stack.push(newState);
+ break;
+ case 3:
+ return true;
+ }
+ }
+ return true;
+ }
+ };
+ /* Jison generated lexer */
+ var lexer = function () {
+ var lexer = { EOF: 1,
+ parseError: function parseError(str, hash) {
+ if (this.yy.parser) {
+ this.yy.parser.parseError(str, hash);
+ } else {
+ throw new Error(str);
+ }
+ },
+ setInput: function (input) {
+ this._input = input;
+ this._more = this._less = this.done = false;
+ this.yylineno = this.yyleng = 0;
+ this.yytext = this.matched = this.match = '';
+ this.conditionStack = ['INITIAL'];
+ this.yylloc = { first_line: 1, first_column: 0, last_line: 1, last_column: 0 };
+ if (this.options.ranges) this.yylloc.range = [0, 0];
+ this.offset = 0;
+ return this;
+ },
+ input: function () {
+ var ch = this._input[0];
+ this.yytext += ch;
+ this.yyleng++;
+ this.offset++;
+ this.match += ch;
+ this.matched += ch;
+ var lines = ch.match(/(?:\r\n?|\n).*/g);
+ if (lines) {
+ this.yylineno++;
+ this.yylloc.last_line++;
+ } else {
+ this.yylloc.last_column++;
+ }
+ if (this.options.ranges) this.yylloc.range[1]++;
+
+ this._input = this._input.slice(1);
+ return ch;
+ },
+ unput: function (ch) {
+ var len = ch.length;
+ var lines = ch.split(/(?:\r\n?|\n)/g);
+
+ this._input = ch + this._input;
+ this.yytext = this.yytext.substr(0, this.yytext.length - len - 1);
+ //this.yyleng -= len;
+ this.offset -= len;
+ var oldLines = this.match.split(/(?:\r\n?|\n)/g);
+ this.match = this.match.substr(0, this.match.length - 1);
+ this.matched = this.matched.substr(0, this.matched.length - 1);
+
+ if (lines.length - 1) this.yylineno -= lines.length - 1;
+ var r = this.yylloc.range;
+
+ this.yylloc = { first_line: this.yylloc.first_line,
+ last_line: this.yylineno + 1,
+ first_column: this.yylloc.first_column,
+ last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len
+ };
+
+ if (this.options.ranges) {
+ this.yylloc.range = [r[0], r[0] + this.yyleng - len];
+ }
+ return this;
+ },
+ more: function () {
+ this._more = true;
+ return this;
+ },
+ less: function (n) {
+ this.unput(this.match.slice(n));
+ },
+ pastInput: function () {
+ var past = this.matched.substr(0, this.matched.length - this.match.length);
+ return (past.length > 20 ? '...' : '') + past.substr(-20).replace(/\n/g, "");
+ },
+ upcomingInput: function () {
+ var next = this.match;
+ if (next.length < 20) {
+ next += this._input.substr(0, 20 - next.length);
+ }
+ return (next.substr(0, 20) + (next.length > 20 ? '...' : '')).replace(/\n/g, "");
+ },
+ showPosition: function () {
+ var pre = this.pastInput();
+ var c = new Array(pre.length + 1).join("-");
+ return pre + this.upcomingInput() + "\n" + c + "^";
+ },
+ next: function () {
+ if (this.done) {
+ return this.EOF;
+ }
+ if (!this._input) this.done = true;
+
+ var token, match, tempMatch, index, col, lines;
+ if (!this._more) {
+ this.yytext = '';
+ this.match = '';
+ }
+ var rules = this._currentRules();
+ for (var i = 0; i < rules.length; i++) {
+ tempMatch = this._input.match(this.rules[rules[i]]);
+ if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {
+ match = tempMatch;
+ index = i;
+ if (!this.options.flex) break;
+ }
+ }
+ if (match) {
+ lines = match[0].match(/(?:\r\n?|\n).*/g);
+ if (lines) this.yylineno += lines.length;
+ this.yylloc = { first_line: this.yylloc.last_line,
+ last_line: this.yylineno + 1,
+ first_column: this.yylloc.last_column,
+ last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : this.yylloc.last_column + match[0].length };
+ this.yytext += match[0];
+ this.match += match[0];
+ this.matches = match;
+ this.yyleng = this.yytext.length;
+ if (this.options.ranges) {
+ this.yylloc.range = [this.offset, this.offset += this.yyleng];
+ }
+ this._more = false;
+ this._input = this._input.slice(match[0].length);
+ this.matched += match[0];
+ token = this.performAction.call(this, this.yy, this, rules[index], this.conditionStack[this.conditionStack.length - 1]);
+ if (this.done && this._input) this.done = false;
+ if (token) return token;else return;
+ }
+ if (this._input === "") {
+ return this.EOF;
+ } else {
+ return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), { text: "", token: null, line: this.yylineno });
+ }
+ },
+ lex: function lex() {
+ var r = this.next();
+ if (typeof r !== 'undefined') {
+ return r;
+ } else {
+ return this.lex();
+ }
+ },
+ begin: function begin(condition) {
+ this.conditionStack.push(condition);
+ },
+ popState: function popState() {
+ return this.conditionStack.pop();
+ },
+ _currentRules: function _currentRules() {
+ return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;
+ },
+ topState: function () {
+ return this.conditionStack[this.conditionStack.length - 2];
+ },
+ pushState: function begin(condition) {
+ this.begin(condition);
+ } };
+ lexer.options = {};
+ lexer.performAction = function anonymous(yy, yy_, $avoiding_name_collisions, YY_START
+ /**/) {
+
+ function strip(start, end) {
+ return yy_.yytext = yy_.yytext.substr(start, yy_.yyleng - end);
+ }
+
+ switch ($avoiding_name_collisions) {
+ case 0:
+ if (yy_.yytext.slice(-2) === "\\\\") {
+ strip(0, 1);
+ this.begin("mu");
+ } else if (yy_.yytext.slice(-1) === "\\") {
+ strip(0, 1);
+ this.begin("emu");
+ } else {
+ this.begin("mu");
+ }
+ if (yy_.yytext) return 15;
+
+ break;
+ case 1:
+ return 15;
+ break;
+ case 2:
+ this.popState();
+ return 15;
+
+ break;
+ case 3:
+ this.begin('raw');return 15;
+ break;
+ case 4:
+ this.popState();
+ // Should be using `this.topState()` below, but it currently
+ // returns the second top instead of the first top. Opened an
+ // issue about it at https://github.com/zaach/jison/issues/291
+ if (this.conditionStack[this.conditionStack.length - 1] === 'raw') {
+ return 15;
+ } else {
+ yy_.yytext = yy_.yytext.substr(5, yy_.yyleng - 9);
+ return 'END_RAW_BLOCK';
+ }
+
+ break;
+ case 5:
+ return 15;
+ break;
+ case 6:
+ this.popState();
+ return 14;
+
+ break;
+ case 7:
+ return 65;
+ break;
+ case 8:
+ return 68;
+ break;
+ case 9:
+ return 19;
+ break;
+ case 10:
+ this.popState();
+ this.begin('raw');
+ return 23;
+
+ break;
+ case 11:
+ return 55;
+ break;
+ case 12:
+ return 60;
+ break;
+ case 13:
+ return 29;
+ break;
+ case 14:
+ return 47;
+ break;
+ case 15:
+ this.popState();return 44;
+ break;
+ case 16:
+ this.popState();return 44;
+ break;
+ case 17:
+ return 34;
+ break;
+ case 18:
+ return 39;
+ break;
+ case 19:
+ return 51;
+ break;
+ case 20:
+ return 48;
+ break;
+ case 21:
+ this.unput(yy_.yytext);
+ this.popState();
+ this.begin('com');
+
+ break;
+ case 22:
+ this.popState();
+ return 14;
+
+ break;
+ case 23:
+ return 48;
+ break;
+ case 24:
+ return 73;
+ break;
+ case 25:
+ return 72;
+ break;
+ case 26:
+ return 72;
+ break;
+ case 27:
+ return 87;
+ break;
+ case 28:
+ // ignore whitespace
+ break;
+ case 29:
+ this.popState();return 54;
+ break;
+ case 30:
+ this.popState();return 33;
+ break;
+ case 31:
+ yy_.yytext = strip(1, 2).replace(/\\"/g, '"');return 80;
+ break;
+ case 32:
+ yy_.yytext = strip(1, 2).replace(/\\'/g, "'");return 80;
+ break;
+ case 33:
+ return 85;
+ break;
+ case 34:
+ return 82;
+ break;
+ case 35:
+ return 82;
+ break;
+ case 36:
+ return 83;
+ break;
+ case 37:
+ return 84;
+ break;
+ case 38:
+ return 81;
+ break;
+ case 39:
+ return 75;
+ break;
+ case 40:
+ return 77;
+ break;
+ case 41:
+ return 72;
+ break;
+ case 42:
+ yy_.yytext = yy_.yytext.replace(/\\([\\\]])/g, '$1');return 72;
+ break;
+ case 43:
+ return 'INVALID';
+ break;
+ case 44:
+ return 5;
+ break;
+ }
+ };
+ lexer.rules = [/^(?:[^\x00]*?(?=(\{\{)))/, /^(?:[^\x00]+)/, /^(?:[^\x00]{2,}?(?=(\{\{|\\\{\{|\\\\\{\{|$)))/, /^(?:\{\{\{\{(?=[^\/]))/, /^(?:\{\{\{\{\/[^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=[=}\s\/.])\}\}\}\})/, /^(?:[^\x00]*?(?=(\{\{\{\{)))/, /^(?:[\s\S]*?--(~)?\}\})/, /^(?:\()/, /^(?:\))/, /^(?:\{\{\{\{)/, /^(?:\}\}\}\})/, /^(?:\{\{(~)?>)/, /^(?:\{\{(~)?#>)/, /^(?:\{\{(~)?#\*?)/, /^(?:\{\{(~)?\/)/, /^(?:\{\{(~)?\^\s*(~)?\}\})/, /^(?:\{\{(~)?\s*else\s*(~)?\}\})/, /^(?:\{\{(~)?\^)/, /^(?:\{\{(~)?\s*else\b)/, /^(?:\{\{(~)?\{)/, /^(?:\{\{(~)?&)/, /^(?:\{\{(~)?!--)/, /^(?:\{\{(~)?![\s\S]*?\}\})/, /^(?:\{\{(~)?\*?)/, /^(?:=)/, /^(?:\.\.)/, /^(?:\.(?=([=~}\s\/.)|])))/, /^(?:[\/.])/, /^(?:\s+)/, /^(?:\}(~)?\}\})/, /^(?:(~)?\}\})/, /^(?:"(\\["]|[^"])*")/, /^(?:'(\\[']|[^'])*')/, /^(?:@)/, /^(?:true(?=([~}\s)])))/, /^(?:false(?=([~}\s)])))/, /^(?:undefined(?=([~}\s)])))/, /^(?:null(?=([~}\s)])))/, /^(?:-?[0-9]+(?:\.[0-9]+)?(?=([~}\s)])))/, /^(?:as\s+\|)/, /^(?:\|)/, /^(?:([^\s!"#%-,\.\/;->@\[-\^`\{-~]+(?=([=~}\s\/.)|]))))/, /^(?:\[(\\\]|[^\]])*\])/, /^(?:.)/, /^(?:$)/];
+ lexer.conditions = { "mu": { "rules": [7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44], "inclusive": false }, "emu": { "rules": [2], "inclusive": false }, "com": { "rules": [6], "inclusive": false }, "raw": { "rules": [3, 4, 5], "inclusive": false }, "INITIAL": { "rules": [0, 1, 44], "inclusive": true } };
+ return lexer;
+ }();
+ parser.lexer = lexer;
+ function Parser() {
+ this.yy = {};
+ }Parser.prototype = parser;parser.Parser = Parser;
+ return new Parser();
+ }();
+
+ var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack'];
+
+ function Exception(message, node) {
+ var loc = node && node.loc,
+ line = void 0,
+ column = void 0;
+ if (loc) {
+ line = loc.start.line;
+ column = loc.start.column;
+
+ message += ' - ' + line + ':' + column;
+ }
+
+ var tmp = Error.prototype.constructor.call(this, message);
+
+ // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work.
+ for (var idx = 0; idx < errorProps.length; idx++) {
+ this[errorProps[idx]] = tmp[errorProps[idx]];
+ }
+
+ /* istanbul ignore else */
+ if (Error.captureStackTrace) {
+ Error.captureStackTrace(this, Exception);
+ }
+
+ try {
+ if (loc) {
+ this.lineNumber = line;
+
+ // Work around issue under safari where we can't directly set the column value
+ /* istanbul ignore next */
+ if (Object.defineProperty) {
+ Object.defineProperty(this, 'column', {
+ value: column,
+ enumerable: true
+ });
+ } else {
+ this.column = column;
+ }
+ }
+ } catch (nop) {
+ /* Ignore if the browser is very particular */
+ }
+ }
+
+ Exception.prototype = new Error();
+
+ function Visitor() {
+ this.parents = [];
+ }
+
+ Visitor.prototype = {
+ constructor: Visitor,
+ mutating: false,
+
+ // Visits a given value. If mutating, will replace the value if necessary.
+ acceptKey: function (node, name) {
+ var value = this.accept(node[name]);
+ if (this.mutating) {
+ // Hacky sanity check: This may have a few false positives for type for the helper
+ // methods but will generally do the right thing without a lot of overhead.
+ if (value && !Visitor.prototype[value.type]) {
+ throw new Exception('Unexpected node type "' + value.type + '" found when accepting ' + name + ' on ' + node.type);
+ }
+ node[name] = value;
+ }
+ },
+
+ // Performs an accept operation with added sanity check to ensure
+ // required keys are not removed.
+ acceptRequired: function (node, name) {
+ this.acceptKey(node, name);
+
+ if (!node[name]) {
+ throw new Exception(node.type + ' requires ' + name);
+ }
+ },
+
+ // Traverses a given array. If mutating, empty respnses will be removed
+ // for child elements.
+ acceptArray: function (array) {
+ for (var i = 0, l = array.length; i < l; i++) {
+ this.acceptKey(array, i);
+
+ if (!array[i]) {
+ array.splice(i, 1);
+ i--;
+ l--;
+ }
+ }
+ },
+
+ accept: function (object) {
+ if (!object) {
+ return;
+ }
+
+ /* istanbul ignore next: Sanity code */
+ if (!this[object.type]) {
+ throw new Exception('Unknown type: ' + object.type, object);
+ }
+
+ if (this.current) {
+ this.parents.unshift(this.current);
+ }
+ this.current = object;
+
+ var ret = this[object.type](object);
+
+ this.current = this.parents.shift();
+
+ if (!this.mutating || ret) {
+ return ret;
+ } else if (ret !== false) {
+ return object;
+ }
+ },
+
+ Program: function (program) {
+ this.acceptArray(program.body);
+ },
+
+ MustacheStatement: visitSubExpression,
+ Decorator: visitSubExpression,
+
+ BlockStatement: visitBlock,
+ DecoratorBlock: visitBlock,
+
+ PartialStatement: visitPartial,
+ PartialBlockStatement: function (partial) {
+ visitPartial.call(this, partial);
+
+ this.acceptKey(partial, 'program');
+ },
+
+ ContentStatement: function () /* content */{},
+ CommentStatement: function () /* comment */{},
+
+ SubExpression: visitSubExpression,
+
+ PathExpression: function () /* path */{},
+
+ StringLiteral: function () /* string */{},
+ NumberLiteral: function () /* number */{},
+ BooleanLiteral: function () /* bool */{},
+ UndefinedLiteral: function () /* literal */{},
+ NullLiteral: function () /* literal */{},
+
+ Hash: function (hash) {
+ this.acceptArray(hash.pairs);
+ },
+ HashPair: function (pair) {
+ this.acceptRequired(pair, 'value');
+ }
+ };
+
+ function visitSubExpression(mustache) {
+ this.acceptRequired(mustache, 'path');
+ this.acceptArray(mustache.params);
+ this.acceptKey(mustache, 'hash');
+ }
+ function visitBlock(block) {
+ visitSubExpression.call(this, block);
+
+ this.acceptKey(block, 'program');
+ this.acceptKey(block, 'inverse');
+ }
+ function visitPartial(partial) {
+ this.acceptRequired(partial, 'name');
+ this.acceptArray(partial.params);
+ this.acceptKey(partial, 'hash');
+ }
+
+ function WhitespaceControl() {
+ var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+
+ this.options = options;
+ }
+ WhitespaceControl.prototype = new Visitor();
+
+ WhitespaceControl.prototype.Program = function (program) {
+ var doStandalone = !this.options.ignoreStandalone;
+
+ var isRoot = !this.isRootSeen;
+ this.isRootSeen = true;
+
+ var body = program.body;
+ for (var i = 0, l = body.length; i < l; i++) {
+ var current = body[i],
+ strip = this.accept(current);
+
+ if (!strip) {
+ continue;
+ }
+
+ var _isPrevWhitespace = isPrevWhitespace(body, i, isRoot),
+ _isNextWhitespace = isNextWhitespace(body, i, isRoot),
+ openStandalone = strip.openStandalone && _isPrevWhitespace,
+ closeStandalone = strip.closeStandalone && _isNextWhitespace,
+ inlineStandalone = strip.inlineStandalone && _isPrevWhitespace && _isNextWhitespace;
+
+ if (strip.close) {
+ omitRight(body, i, true);
+ }
+ if (strip.open) {
+ omitLeft(body, i, true);
+ }
+
+ if (doStandalone && inlineStandalone) {
+ omitRight(body, i);
+
+ if (omitLeft(body, i)) {
+ // If we are on a standalone node, save the indent info for partials
+ if (current.type === 'PartialStatement') {
+ // Pull out the whitespace from the final line
+ current.indent = /([ \t]+$)/.exec(body[i - 1].original)[1];
+ }
+ }
+ }
+ if (doStandalone && openStandalone) {
+ omitRight((current.program || current.inverse).body);
+
+ // Strip out the previous content node if it's whitespace only
+ omitLeft(body, i);
+ }
+ if (doStandalone && closeStandalone) {
+ // Always strip the next node
+ omitRight(body, i);
+
+ omitLeft((current.inverse || current.program).body);
+ }
+ }
+
+ return program;
+ };
+
+ WhitespaceControl.prototype.BlockStatement = WhitespaceControl.prototype.DecoratorBlock = WhitespaceControl.prototype.PartialBlockStatement = function (block) {
+ this.accept(block.program);
+ this.accept(block.inverse);
+
+ // Find the inverse program that is involed with whitespace stripping.
+ var program = block.program || block.inverse,
+ inverse = block.program && block.inverse,
+ firstInverse = inverse,
+ lastInverse = inverse;
+
+ if (inverse && inverse.chained) {
+ firstInverse = inverse.body[0].program;
+
+ // Walk the inverse chain to find the last inverse that is actually in the chain.
+ while (lastInverse.chained) {
+ lastInverse = lastInverse.body[lastInverse.body.length - 1].program;
+ }
+ }
+
+ var strip = {
+ open: block.openStrip.open,
+ close: block.closeStrip.close,
+
+ // Determine the standalone candiacy. Basically flag our content as being possibly standalone
+ // so our parent can determine if we actually are standalone
+ openStandalone: isNextWhitespace(program.body),
+ closeStandalone: isPrevWhitespace((firstInverse || program).body)
+ };
+
+ if (block.openStrip.close) {
+ omitRight(program.body, null, true);
+ }
+
+ if (inverse) {
+ var inverseStrip = block.inverseStrip;
+
+ if (inverseStrip.open) {
+ omitLeft(program.body, null, true);
+ }
+
+ if (inverseStrip.close) {
+ omitRight(firstInverse.body, null, true);
+ }
+ if (block.closeStrip.open) {
+ omitLeft(lastInverse.body, null, true);
+ }
+
+ // Find standalone else statments
+ if (!this.options.ignoreStandalone && isPrevWhitespace(program.body) && isNextWhitespace(firstInverse.body)) {
+ omitLeft(program.body);
+ omitRight(firstInverse.body);
+ }
+ } else if (block.closeStrip.open) {
+ omitLeft(program.body, null, true);
+ }
+
+ return strip;
+ };
+
+ WhitespaceControl.prototype.Decorator = WhitespaceControl.prototype.MustacheStatement = function (mustache) {
+ return mustache.strip;
+ };
+
+ WhitespaceControl.prototype.PartialStatement = WhitespaceControl.prototype.CommentStatement = function (node) {
+ /* istanbul ignore next */
+ var strip = node.strip || {};
+ return {
+ inlineStandalone: true,
+ open: strip.open,
+ close: strip.close
+ };
+ };
+
+ function isPrevWhitespace(body, i, isRoot) {
+ if (i === undefined) {
+ i = body.length;
+ }
+
+ // Nodes that end with newlines are considered whitespace (but are special
+ // cased for strip operations)
+ var prev = body[i - 1],
+ sibling = body[i - 2];
+ if (!prev) {
+ return isRoot;
+ }
+
+ if (prev.type === 'ContentStatement') {
+ return (sibling || !isRoot ? /\r?\n\s*?$/ : /(^|\r?\n)\s*?$/).test(prev.original);
+ }
+ }
+ function isNextWhitespace(body, i, isRoot) {
+ if (i === undefined) {
+ i = -1;
+ }
+
+ var next = body[i + 1],
+ sibling = body[i + 2];
+ if (!next) {
+ return isRoot;
+ }
+
+ if (next.type === 'ContentStatement') {
+ return (sibling || !isRoot ? /^\s*?\r?\n/ : /^\s*?(\r?\n|$)/).test(next.original);
+ }
+ }
+
+ // Marks the node to the right of the position as omitted.
+ // I.e. {{foo}}' ' will mark the ' ' node as omitted.
+ //
+ // If i is undefined, then the first child will be marked as such.
+ //
+ // If mulitple is truthy then all whitespace will be stripped out until non-whitespace
+ // content is met.
+ function omitRight(body, i, multiple) {
+ var current = body[i == null ? 0 : i + 1];
+ if (!current || current.type !== 'ContentStatement' || !multiple && current.rightStripped) {
+ return;
+ }
+
+ var original = current.value;
+ current.value = current.value.replace(multiple ? /^\s+/ : /^[ \t]*\r?\n?/, '');
+ current.rightStripped = current.value !== original;
+ }
+
+ // Marks the node to the left of the position as omitted.
+ // I.e. ' '{{foo}} will mark the ' ' node as omitted.
+ //
+ // If i is undefined then the last child will be marked as such.
+ //
+ // If mulitple is truthy then all whitespace will be stripped out until non-whitespace
+ // content is met.
+ function omitLeft(body, i, multiple) {
+ var current = body[i == null ? body.length - 1 : i - 1];
+ if (!current || current.type !== 'ContentStatement' || !multiple && current.leftStripped) {
+ return;
+ }
+
+ // We omit the last node if it's whitespace only and not preceeded by a non-content node.
+ var original = current.value;
+ current.value = current.value.replace(multiple ? /\s+$/ : /[ \t]+$/, '');
+ current.leftStripped = current.value !== original;
+ return current.leftStripped;
+ }
+
+ function validateClose(open, close) {
+ close = close.path ? close.path.original : close;
+
+ if (open.path.original !== close) {
+ var errorNode = { loc: open.path.loc };
+
+ throw new Exception(open.path.original + " doesn't match " + close, errorNode);
+ }
+ }
+
+ function SourceLocation(source, locInfo) {
+ this.source = source;
+ this.start = {
+ line: locInfo.first_line,
+ column: locInfo.first_column
+ };
+ this.end = {
+ line: locInfo.last_line,
+ column: locInfo.last_column
+ };
+ }
+
+ function id(token) {
+ if (/^\[.*\]$/.test(token)) {
+ return token.substr(1, token.length - 2);
+ } else {
+ return token;
+ }
+ }
+
+ function stripFlags(open, close) {
+ return {
+ open: open.charAt(2) === '~',
+ close: close.charAt(close.length - 3) === '~'
+ };
+ }
+
+ function stripComment(comment) {
+ return comment.replace(/^\{\{~?\!-?-?/, '').replace(/-?-?~?\}\}$/, '');
+ }
+
+ function preparePath(data, parts, loc) {
+ loc = this.locInfo(loc);
+
+ var original = data ? '@' : '',
+ dig = [],
+ depth = 0;
+
+ for (var i = 0, l = parts.length; i < l; i++) {
+ var part = parts[i].part,
+
+ // If we have [] syntax then we do not treat path references as operators,
+ // i.e. foo.[this] resolves to approximately context.foo['this']
+ isLiteral = parts[i].original !== part;
+ original += (parts[i].separator || '') + part;
+
+ if (!isLiteral && (part === '..' || part === '.' || part === 'this')) {
+ if (dig.length > 0) {
+ throw new Exception('Invalid path: ' + original, { loc: loc });
+ } else if (part === '..') {
+ depth++;
+ }
+ } else {
+ dig.push(part);
+ }
+ }
+
+ return {
+ type: 'PathExpression',
+ data: data,
+ depth: depth,
+ parts: dig,
+ original: original,
+ loc: loc
+ };
+ }
+
+ function prepareMustache(path, params, hash, open, strip, locInfo) {
+ // Must use charAt to support IE pre-10
+ var escapeFlag = open.charAt(3) || open.charAt(2),
+ escaped = escapeFlag !== '{' && escapeFlag !== '&';
+
+ var decorator = /\*/.test(open);
+ return {
+ type: decorator ? 'Decorator' : 'MustacheStatement',
+ path: path,
+ params: params,
+ hash: hash,
+ escaped: escaped,
+ strip: strip,
+ loc: this.locInfo(locInfo)
+ };
+ }
+
+ function prepareRawBlock(openRawBlock, contents, close, locInfo) {
+ validateClose(openRawBlock, close);
+
+ locInfo = this.locInfo(locInfo);
+ var program = {
+ type: 'Program',
+ body: contents,
+ strip: {},
+ loc: locInfo
+ };
+
+ return {
+ type: 'BlockStatement',
+ path: openRawBlock.path,
+ params: openRawBlock.params,
+ hash: openRawBlock.hash,
+ program: program,
+ openStrip: {},
+ inverseStrip: {},
+ closeStrip: {},
+ loc: locInfo
+ };
+ }
+
+ function prepareBlock(openBlock, program, inverseAndProgram, close, inverted, locInfo) {
+ if (close && close.path) {
+ validateClose(openBlock, close);
+ }
+
+ var decorator = /\*/.test(openBlock.open);
+
+ program.blockParams = openBlock.blockParams;
+
+ var inverse = void 0,
+ inverseStrip = void 0;
+
+ if (inverseAndProgram) {
+ if (decorator) {
+ throw new Exception('Unexpected inverse block on decorator', inverseAndProgram);
+ }
+
+ if (inverseAndProgram.chain) {
+ inverseAndProgram.program.body[0].closeStrip = close.strip;
+ }
+
+ inverseStrip = inverseAndProgram.strip;
+ inverse = inverseAndProgram.program;
+ }
+
+ if (inverted) {
+ inverted = inverse;
+ inverse = program;
+ program = inverted;
+ }
+
+ return {
+ type: decorator ? 'DecoratorBlock' : 'BlockStatement',
+ path: openBlock.path,
+ params: openBlock.params,
+ hash: openBlock.hash,
+ program: program,
+ inverse: inverse,
+ openStrip: openBlock.strip,
+ inverseStrip: inverseStrip,
+ closeStrip: close && close.strip,
+ loc: this.locInfo(locInfo)
+ };
+ }
+
+ function prepareProgram(statements, loc) {
+ if (!loc && statements.length) {
+ var firstLoc = statements[0].loc,
+ lastLoc = statements[statements.length - 1].loc;
+
+ /* istanbul ignore else */
+ if (firstLoc && lastLoc) {
+ loc = {
+ source: firstLoc.source,
+ start: {
+ line: firstLoc.start.line,
+ column: firstLoc.start.column
+ },
+ end: {
+ line: lastLoc.end.line,
+ column: lastLoc.end.column
+ }
+ };
+ }
+ }
+
+ return {
+ type: 'Program',
+ body: statements,
+ strip: {},
+ loc: loc
+ };
+ }
+
+ function preparePartialBlock(open, program, close, locInfo) {
+ validateClose(open, close);
+
+ return {
+ type: 'PartialBlockStatement',
+ name: open.path,
+ params: open.params,
+ hash: open.hash,
+ program: program,
+ openStrip: open.strip,
+ closeStrip: close && close.strip,
+ loc: this.locInfo(locInfo)
+ };
+ }
+
+ var Helpers = Object.freeze({
+ SourceLocation: SourceLocation,
+ id: id,
+ stripFlags: stripFlags,
+ stripComment: stripComment,
+ preparePath: preparePath,
+ prepareMustache: prepareMustache,
+ prepareRawBlock: prepareRawBlock,
+ prepareBlock: prepareBlock,
+ prepareProgram: prepareProgram,
+ preparePartialBlock: preparePartialBlock
+ });
+
+ function extend(obj /* , ...source */) {
+ for (var i = 1; i < arguments.length; i++) {
+ for (var key in arguments[i]) {
+ if (Object.prototype.hasOwnProperty.call(arguments[i], key)) {
+ obj[key] = arguments[i][key];
+ }
+ }
+ }
+
+ return obj;
+ }
+
+ var toString = Object.prototype.toString;
+
+ // Sourced from lodash
+ // https://github.com/bestiejs/lodash/blob/master/LICENSE.txt
+ /* eslint-disable func-style */
+ var isFunction = function (value) {
+ return typeof value === 'function';
+ };
+ // fallback for older versions of Chrome and Safari
+ /* istanbul ignore next */
+ if (isFunction(/x/)) {
+ isFunction = function (value) {
+ return typeof value === 'function' && toString.call(value) === '[object Function]';
+ };
+ }
+ /* eslint-enable func-style */
+
+ /* istanbul ignore next */
+
+ // Older IE versions do not directly support indexOf so we must implement our own, sadly.
+
+ var yy = {};
+ extend(yy, Helpers);
+
+ function parse(input, options) {
+ // Just return if an already-compiled AST was passed in.
+ if (input.type === 'Program') {
+ return input;
+ }
+
+ handlebars.yy = yy;
+
+ // Altering the shared object here, but this is ok as parser is a sync operation
+ yy.locInfo = function (locInfo) {
+ return new yy.SourceLocation(options && options.srcName, locInfo);
+ };
+
+ var strip = new WhitespaceControl(options);
+ return strip.accept(handlebars.parse(input));
+ }
+
+ exports.parser = handlebars;
+ exports.parse = parse;
+});
+/*global enifed */
+enifed('node-module', ['exports'], function(_exports) {
+ var IS_NODE = typeof module === 'object' && typeof module.require === 'function';
+ if (IS_NODE) {
+ _exports.require = module.require;
+ _exports.module = module;
+ _exports.IS_NODE = IS_NODE;
+ } else {
+ _exports.require = null;
+ _exports.module = null;
+ _exports.IS_NODE = IS_NODE;
+ }
+});
+enifed("route-recognizer", ["exports"], function (exports) {
+ "use strict";
+
+ var createObject = Object.create;
+ function createMap() {
+ var map = createObject(null);
+ map["__"] = undefined;
+ delete map["__"];
+ return map;
+ }
+
+ var Target = function Target(path, matcher, delegate) {
+ this.path = path;
+ this.matcher = matcher;
+ this.delegate = delegate;
+ };
+ Target.prototype.to = function to(target, callback) {
+ var delegate = this.delegate;
+ if (delegate && delegate.willAddRoute) {
+ target = delegate.willAddRoute(this.matcher.target, target);
+ }
+ this.matcher.add(this.path, target);
+ if (callback) {
+ if (callback.length === 0) {
+ throw new Error("You must have an argument in the function passed to `to`");
+ }
+ this.matcher.addChild(this.path, target, callback, this.delegate);
+ }
+ };
+ var Matcher = function Matcher(target) {
+ this.routes = createMap();
+ this.children = createMap();
+ this.target = target;
+ };
+ Matcher.prototype.add = function add(path, target) {
+ this.routes[path] = target;
+ };
+ Matcher.prototype.addChild = function addChild(path, target, callback, delegate) {
+ var matcher = new Matcher(target);
+ this.children[path] = matcher;
+ var match = generateMatch(path, matcher, delegate);
+ if (delegate && delegate.contextEntered) {
+ delegate.contextEntered(target, match);
+ }
+ callback(match);
+ };
+ function generateMatch(startingPath, matcher, delegate) {
+ function match(path, callback) {
+ var fullPath = startingPath + path;
+ if (callback) {
+ callback(generateMatch(fullPath, matcher, delegate));
+ } else {
+ return new Target(fullPath, matcher, delegate);
+ }
+ }
+
+ return match;
+ }
+ function addRoute(routeArray, path, handler) {
+ var len = 0;
+ for (var i = 0; i < routeArray.length; i++) {
+ len += routeArray[i].path.length;
+ }
+ path = path.substr(len);
+ var route = { path: path, handler: handler };
+ routeArray.push(route);
+ }
+ function eachRoute(baseRoute, matcher, callback, binding) {
+ var routes = matcher.routes;
+ var paths = Object.keys(routes);
+ for (var i = 0; i < paths.length; i++) {
+ var path = paths[i];
+ var routeArray = baseRoute.slice();
+ addRoute(routeArray, path, routes[path]);
+ var nested = matcher.children[path];
+ if (nested) {
+ eachRoute(routeArray, nested, callback, binding);
+ } else {
+ callback.call(binding, routeArray);
+ }
+ }
+ }
+ var map = function (callback, addRouteCallback) {
+ var matcher = new Matcher();
+ callback(generateMatch("", matcher, this.delegate));
+ eachRoute([], matcher, function (routes) {
+ if (addRouteCallback) {
+ addRouteCallback(this, routes);
+ } else {
+ this.add(routes);
+ }
+ }, this);
+ };
+
+ // Normalizes percent-encoded values in `path` to upper-case and decodes percent-encoded
+ // values that are not reserved (i.e., unicode characters, emoji, etc). The reserved
+ // chars are "/" and "%".
+ // Safe to call multiple times on the same path.
+ // Normalizes percent-encoded values in `path` to upper-case and decodes percent-encoded
+ function normalizePath(path) {
+ return path.split("/").map(normalizeSegment).join("/");
+ }
+ // We want to ensure the characters "%" and "/" remain in percent-encoded
+ // form when normalizing paths, so replace them with their encoded form after
+ // decoding the rest of the path
+ var SEGMENT_RESERVED_CHARS = /%|\//g;
+ function normalizeSegment(segment) {
+ if (segment.length < 3 || segment.indexOf("%") === -1) {
+ return segment;
+ }
+ return decodeURIComponent(segment).replace(SEGMENT_RESERVED_CHARS, encodeURIComponent);
+ }
+ // We do not want to encode these characters when generating dynamic path segments
+ // See https://tools.ietf.org/html/rfc3986#section-3.3
+ // sub-delims: "!", "$", "&", "'", "(", ")", "*", "+", ",", ";", "="
+ // others allowed by RFC 3986: ":", "@"
+ //
+ // First encode the entire path segment, then decode any of the encoded special chars.
+ //
+ // The chars "!", "'", "(", ")", "*" do not get changed by `encodeURIComponent`,
+ // so the possible encoded chars are:
+ // ['%24', '%26', '%2B', '%2C', '%3B', '%3D', '%3A', '%40'].
+ var PATH_SEGMENT_ENCODINGS = /%(?:2(?:4|6|B|C)|3(?:B|D|A)|40)/g;
+ function encodePathSegment(str) {
+ return encodeURIComponent(str).replace(PATH_SEGMENT_ENCODINGS, decodeURIComponent);
+ }
+
+ var escapeRegex = /(\/|\.|\*|\+|\?|\||\(|\)|\[|\]|\{|\}|\\)/g;
+ var isArray = Array.isArray;
+ var hasOwnProperty = Object.prototype.hasOwnProperty;
+ function getParam(params, key) {
+ if (typeof params !== "object" || params === null) {
+ throw new Error("You must pass an object as the second argument to `generate`.");
+ }
+ if (!hasOwnProperty.call(params, key)) {
+ throw new Error("You must provide param `" + key + "` to `generate`.");
+ }
+ var value = params[key];
+ var str = typeof value === "string" ? value : "" + value;
+ if (str.length === 0) {
+ throw new Error("You must provide a param `" + key + "`.");
+ }
+ return str;
+ }
+ var eachChar = [];
+ eachChar[0 /* Static */] = function (segment, currentState) {
+ var state = currentState;
+ var value = segment.value;
+ for (var i = 0; i < value.length; i++) {
+ var ch = value.charCodeAt(i);
+ state = state.put(ch, false, false);
+ }
+ return state;
+ };
+ eachChar[1 /* Dynamic */] = function (_, currentState) {
+ return currentState.put(47 /* SLASH */, true, true);
+ };
+ eachChar[2 /* Star */] = function (_, currentState) {
+ return currentState.put(-1 /* ANY */, false, true);
+ };
+ eachChar[4 /* Epsilon */] = function (_, currentState) {
+ return currentState;
+ };
+ var regex = [];
+ regex[0 /* Static */] = function (segment) {
+ return segment.value.replace(escapeRegex, "\\$1");
+ };
+ regex[1 /* Dynamic */] = function () {
+ return "([^/]+)";
+ };
+ regex[2 /* Star */] = function () {
+ return "(.+)";
+ };
+ regex[4 /* Epsilon */] = function () {
+ return "";
+ };
+ var generate = [];
+ generate[0 /* Static */] = function (segment) {
+ return segment.value;
+ };
+ generate[1 /* Dynamic */] = function (segment, params) {
+ var value = getParam(params, segment.value);
+ if (RouteRecognizer.ENCODE_AND_DECODE_PATH_SEGMENTS) {
+ return encodePathSegment(value);
+ } else {
+ return value;
+ }
+ };
+ generate[2 /* Star */] = function (segment, params) {
+ return getParam(params, segment.value);
+ };
+ generate[4 /* Epsilon */] = function () {
+ return "";
+ };
+ var EmptyObject = Object.freeze({});
+ var EmptyArray = Object.freeze([]);
+ // The `names` will be populated with the paramter name for each dynamic/star
+ // segment. `shouldDecodes` will be populated with a boolean for each dyanamic/star
+ // segment, indicating whether it should be decoded during recognition.
+ function parse(segments, route, types) {
+ // normalize route as not starting with a "/". Recognition will
+ // also normalize.
+ if (route.length > 0 && route.charCodeAt(0) === 47 /* SLASH */) {
+ route = route.substr(1);
+ }
+ var parts = route.split("/");
+ var names = undefined;
+ var shouldDecodes = undefined;
+ for (var i = 0; i < parts.length; i++) {
+ var part = parts[i];
+ var flags = 0;
+ var type = 0;
+ if (part === "") {
+ type = 4 /* Epsilon */;
+ } else if (part.charCodeAt(0) === 58 /* COLON */) {
+ type = 1 /* Dynamic */;
+ } else if (part.charCodeAt(0) === 42 /* STAR */) {
+ type = 2 /* Star */;
+ } else {
+ type = 0 /* Static */;
+ }
+ flags = 2 << type;
+ if (flags & 12 /* Named */) {
+ part = part.slice(1);
+ names = names || [];
+ names.push(part);
+ shouldDecodes = shouldDecodes || [];
+ shouldDecodes.push((flags & 4 /* Decoded */) !== 0);
+ }
+ if (flags & 14 /* Counted */) {
+ types[type]++;
+ }
+ segments.push({
+ type: type,
+ value: normalizeSegment(part)
+ });
+ }
+ return {
+ names: names || EmptyArray,
+ shouldDecodes: shouldDecodes || EmptyArray
+ };
+ }
+ function isEqualCharSpec(spec, char, negate) {
+ return spec.char === char && spec.negate === negate;
+ }
+ // A State has a character specification and (`charSpec`) and a list of possible
+ // subsequent states (`nextStates`).
+ //
+ // If a State is an accepting state, it will also have several additional
+ // properties:
+ //
+ // * `regex`: A regular expression that is used to extract parameters from paths
+ // that reached this accepting state.
+ // * `handlers`: Information on how to convert the list of captures into calls
+ // to registered handlers with the specified parameters
+ // * `types`: How many static, dynamic or star segments in this route. Used to
+ // decide which route to use if multiple registered routes match a path.
+ //
+ // Currently, State is implemented naively by looping over `nextStates` and
+ // comparing a character specification against a character. A more efficient
+ // implementation would use a hash of keys pointing at one or more next states.
+ var State = function State(states, id, char, negate, repeat) {
+ this.states = states;
+ this.id = id;
+ this.char = char;
+ this.negate = negate;
+ this.nextStates = repeat ? id : null;
+ this.pattern = "";
+ this._regex = undefined;
+ this.handlers = undefined;
+ this.types = undefined;
+ };
+ State.prototype.regex = function regex$1() {
+ if (!this._regex) {
+ this._regex = new RegExp(this.pattern);
+ }
+ return this._regex;
+ };
+ State.prototype.get = function get(char, negate) {
+ var this$1 = this;
+
+ var nextStates = this.nextStates;
+ if (nextStates === null) {
+ return;
+ }
+ if (isArray(nextStates)) {
+ for (var i = 0; i < nextStates.length; i++) {
+ var child = this$1.states[nextStates[i]];
+ if (isEqualCharSpec(child, char, negate)) {
+ return child;
+ }
+ }
+ } else {
+ var child$1 = this.states[nextStates];
+ if (isEqualCharSpec(child$1, char, negate)) {
+ return child$1;
+ }
+ }
+ };
+ State.prototype.put = function put(char, negate, repeat) {
+ var state;
+ // If the character specification already exists in a child of the current
+ // state, just return that state.
+ if (state = this.get(char, negate)) {
+ return state;
+ }
+ // Make a new state for the character spec
+ var states = this.states;
+ state = new State(states, states.length, char, negate, repeat);
+ states[states.length] = state;
+ // Insert the new state as a child of the current state
+ if (this.nextStates == null) {
+ this.nextStates = state.id;
+ } else if (isArray(this.nextStates)) {
+ this.nextStates.push(state.id);
+ } else {
+ this.nextStates = [this.nextStates, state.id];
+ }
+ // Return the new state
+ return state;
+ };
+ // Find a list of child states matching the next character
+ State.prototype.match = function match(ch) {
+ var this$1 = this;
+
+ var nextStates = this.nextStates;
+ if (!nextStates) {
+ return [];
+ }
+ var returned = [];
+ if (isArray(nextStates)) {
+ for (var i = 0; i < nextStates.length; i++) {
+ var child = this$1.states[nextStates[i]];
+ if (isMatch(child, ch)) {
+ returned.push(child);
+ }
+ }
+ } else {
+ var child$1 = this.states[nextStates];
+ if (isMatch(child$1, ch)) {
+ returned.push(child$1);
+ }
+ }
+ return returned;
+ };
+ function isMatch(spec, char) {
+ return spec.negate ? spec.char !== char && spec.char !== -1 /* ANY */ : spec.char === char || spec.char === -1 /* ANY */;
+ }
+ // This is a somewhat naive strategy, but should work in a lot of cases
+ // A better strategy would properly resolve /posts/:id/new and /posts/edit/:id.
+ //
+ // This strategy generally prefers more static and less dynamic matching.
+ // Specifically, it
+ //
+ // * prefers fewer stars to more, then
+ // * prefers using stars for less of the match to more, then
+ // * prefers fewer dynamic segments to more, then
+ // * prefers more static segments to more
+ function sortSolutions(states) {
+ return states.sort(function (a, b) {
+ var ref = a.types || [0, 0, 0];
+ var astatics = ref[0];
+ var adynamics = ref[1];
+ var astars = ref[2];
+ var ref$1 = b.types || [0, 0, 0];
+ var bstatics = ref$1[0];
+ var bdynamics = ref$1[1];
+ var bstars = ref$1[2];
+ if (astars !== bstars) {
+ return astars - bstars;
+ }
+ if (astars) {
+ if (astatics !== bstatics) {
+ return bstatics - astatics;
+ }
+ if (adynamics !== bdynamics) {
+ return bdynamics - adynamics;
+ }
+ }
+ if (adynamics !== bdynamics) {
+ return adynamics - bdynamics;
+ }
+ if (astatics !== bstatics) {
+ return bstatics - astatics;
+ }
+ return 0;
+ });
+ }
+ function recognizeChar(states, ch) {
+ var nextStates = [];
+ for (var i = 0, l = states.length; i < l; i++) {
+ var state = states[i];
+ nextStates = nextStates.concat(state.match(ch));
+ }
+ return nextStates;
+ }
+ var RecognizeResults = function RecognizeResults(queryParams) {
+ this.length = 0;
+ this.queryParams = queryParams || {};
+ };
+
+ RecognizeResults.prototype.splice = Array.prototype.splice;
+ RecognizeResults.prototype.slice = Array.prototype.slice;
+ RecognizeResults.prototype.push = Array.prototype.push;
+ function findHandler(state, originalPath, queryParams) {
+ var handlers = state.handlers;
+ var regex = state.regex();
+ if (!regex || !handlers) {
+ throw new Error("state not initialized");
+ }
+ var captures = originalPath.match(regex);
+ var currentCapture = 1;
+ var result = new RecognizeResults(queryParams);
+ result.length = handlers.length;
+ for (var i = 0; i < handlers.length; i++) {
+ var handler = handlers[i];
+ var names = handler.names;
+ var shouldDecodes = handler.shouldDecodes;
+ var params = EmptyObject;
+ var isDynamic = false;
+ if (names !== EmptyArray && shouldDecodes !== EmptyArray) {
+ for (var j = 0; j < names.length; j++) {
+ isDynamic = true;
+ var name = names[j];
+ var capture = captures && captures[currentCapture++];
+ if (params === EmptyObject) {
+ params = {};
+ }
+ if (RouteRecognizer.ENCODE_AND_DECODE_PATH_SEGMENTS && shouldDecodes[j]) {
+ params[name] = capture && decodeURIComponent(capture);
+ } else {
+ params[name] = capture;
+ }
+ }
+ }
+ result[i] = {
+ handler: handler.handler,
+ params: params,
+ isDynamic: isDynamic
+ };
+ }
+ return result;
+ }
+ function decodeQueryParamPart(part) {
+ // http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1
+ part = part.replace(/\+/gm, "%20");
+ var result;
+ try {
+ result = decodeURIComponent(part);
+ } catch (error) {
+ result = "";
+ }
+ return result;
+ }
+ var RouteRecognizer = function RouteRecognizer() {
+ this.names = createMap();
+ var states = [];
+ var state = new State(states, 0, -1 /* ANY */, true, false);
+ states[0] = state;
+ this.states = states;
+ this.rootState = state;
+ };
+ RouteRecognizer.prototype.add = function add(routes, options) {
+ var currentState = this.rootState;
+ var pattern = "^";
+ var types = [0, 0, 0];
+ var handlers = new Array(routes.length);
+ var allSegments = [];
+ var isEmpty = true;
+ var j = 0;
+ for (var i = 0; i < routes.length; i++) {
+ var route = routes[i];
+ var ref = parse(allSegments, route.path, types);
+ var names = ref.names;
+ var shouldDecodes = ref.shouldDecodes;
+ // preserve j so it points to the start of newly added segments
+ for (; j < allSegments.length; j++) {
+ var segment = allSegments[j];
+ if (segment.type === 4 /* Epsilon */) {
+ continue;
+ }
+ isEmpty = false;
+ // Add a "/" for the new segment
+ currentState = currentState.put(47 /* SLASH */, false, false);
+ pattern += "/";
+ // Add a representation of the segment to the NFA and regex
+ currentState = eachChar[segment.type](segment, currentState);
+ pattern += regex[segment.type](segment);
+ }
+ handlers[i] = {
+ handler: route.handler,
+ names: names,
+ shouldDecodes: shouldDecodes
+ };
+ }
+ if (isEmpty) {
+ currentState = currentState.put(47 /* SLASH */, false, false);
+ pattern += "/";
+ }
+ currentState.handlers = handlers;
+ currentState.pattern = pattern + "$";
+ currentState.types = types;
+ var name;
+ if (typeof options === "object" && options !== null && options.as) {
+ name = options.as;
+ }
+ if (name) {
+ // if (this.names[name]) {
+ // throw new Error("You may not add a duplicate route named `" + name + "`.");
+ // }
+ this.names[name] = {
+ segments: allSegments,
+ handlers: handlers
+ };
+ }
+ };
+ RouteRecognizer.prototype.handlersFor = function handlersFor(name) {
+ var route = this.names[name];
+ if (!route) {
+ throw new Error("There is no route named " + name);
+ }
+ var result = new Array(route.handlers.length);
+ for (var i = 0; i < route.handlers.length; i++) {
+ var handler = route.handlers[i];
+ result[i] = handler;
+ }
+ return result;
+ };
+ RouteRecognizer.prototype.hasRoute = function hasRoute(name) {
+ return !!this.names[name];
+ };
+ RouteRecognizer.prototype.generate = function generate$1(name, params) {
+ var route = this.names[name];
+ var output = "";
+ if (!route) {
+ throw new Error("There is no route named " + name);
+ }
+ var segments = route.segments;
+ for (var i = 0; i < segments.length; i++) {
+ var segment = segments[i];
+ if (segment.type === 4 /* Epsilon */) {
+ continue;
+ }
+ output += "/";
+ output += generate[segment.type](segment, params);
+ }
+ if (output.charAt(0) !== "/") {
+ output = "/" + output;
+ }
+ if (params && params.queryParams) {
+ output += this.generateQueryString(params.queryParams);
+ }
+ return output;
+ };
+ RouteRecognizer.prototype.generateQueryString = function generateQueryString(params) {
+ var pairs = [];
+ var keys = Object.keys(params);
+ keys.sort();
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];
+ var value = params[key];
+ if (value == null) {
+ continue;
+ }
+ var pair = encodeURIComponent(key);
+ if (isArray(value)) {
+ for (var j = 0; j < value.length; j++) {
+ var arrayPair = key + "[]" + "=" + encodeURIComponent(value[j]);
+ pairs.push(arrayPair);
+ }
+ } else {
+ pair += "=" + encodeURIComponent(value);
+ pairs.push(pair);
+ }
+ }
+ if (pairs.length === 0) {
+ return "";
+ }
+ return "?" + pairs.join("&");
+ };
+ RouteRecognizer.prototype.parseQueryString = function parseQueryString(queryString) {
+ var pairs = queryString.split("&");
+ var queryParams = {};
+ for (var i = 0; i < pairs.length; i++) {
+ var pair = pairs[i].split("="),
+ key = decodeQueryParamPart(pair[0]),
+ keyLength = key.length,
+ isArray = false,
+ value = void 0;
+ if (pair.length === 1) {
+ value = "true";
+ } else {
+ // Handle arrays
+ if (keyLength > 2 && key.slice(keyLength - 2) === "[]") {
+ isArray = true;
+ key = key.slice(0, keyLength - 2);
+ if (!queryParams[key]) {
+ queryParams[key] = [];
+ }
+ }
+ value = pair[1] ? decodeQueryParamPart(pair[1]) : "";
+ }
+ if (isArray) {
+ queryParams[key].push(value);
+ } else {
+ queryParams[key] = value;
+ }
+ }
+ return queryParams;
+ };
+ RouteRecognizer.prototype.recognize = function recognize(path) {
+ var results;
+ var states = [this.rootState];
+ var queryParams = {};
+ var isSlashDropped = false;
+ var hashStart = path.indexOf("#");
+ if (hashStart !== -1) {
+ path = path.substr(0, hashStart);
+ }
+ var queryStart = path.indexOf("?");
+ if (queryStart !== -1) {
+ var queryString = path.substr(queryStart + 1, path.length);
+ path = path.substr(0, queryStart);
+ queryParams = this.parseQueryString(queryString);
+ }
+ if (path.charAt(0) !== "/") {
+ path = "/" + path;
+ }
+ var originalPath = path;
+ if (RouteRecognizer.ENCODE_AND_DECODE_PATH_SEGMENTS) {
+ path = normalizePath(path);
+ } else {
+ path = decodeURI(path);
+ originalPath = decodeURI(originalPath);
+ }
+ var pathLen = path.length;
+ if (pathLen > 1 && path.charAt(pathLen - 1) === "/") {
+ path = path.substr(0, pathLen - 1);
+ originalPath = originalPath.substr(0, originalPath.length - 1);
+ isSlashDropped = true;
+ }
+ for (var i = 0; i < path.length; i++) {
+ states = recognizeChar(states, path.charCodeAt(i));
+ if (!states.length) {
+ break;
+ }
+ }
+ var solutions = [];
+ for (var i$1 = 0; i$1 < states.length; i$1++) {
+ if (states[i$1].handlers) {
+ solutions.push(states[i$1]);
+ }
+ }
+ states = sortSolutions(solutions);
+ var state = solutions[0];
+ if (state && state.handlers) {
+ // if a trailing slash was dropped and a star segment is the last segment
+ // specified, put the trailing slash back
+ if (isSlashDropped && state.pattern && state.pattern.slice(-5) === "(.+)$") {
+ originalPath = originalPath + "/";
+ }
+ results = findHandler(state, originalPath, queryParams);
+ }
+ return results;
+ };
+ RouteRecognizer.VERSION = "0.3.3";
+ // Set to false to opt-out of encoding and decoding path segments.
+ // See https://github.com/tildeio/route-recognizer/pull/55
+ RouteRecognizer.ENCODE_AND_DECODE_PATH_SEGMENTS = true;
+ RouteRecognizer.Normalizer = {
+ normalizeSegment: normalizeSegment, normalizePath: normalizePath, encodePathSegment: encodePathSegment
+ };
+ RouteRecognizer.prototype.map = map;
+
+ exports.default = RouteRecognizer;
+});
+enifed('router', ['exports', 'ember-babel', 'route-recognizer', 'rsvp'], function (exports, _emberBabel, _routeRecognizer, _rsvp) {
+ 'use strict';
+
+ exports.Transition = undefined;
+
+
+ var slice = Array.prototype.slice;
+ var hasOwnProperty = Object.prototype.hasOwnProperty;
+
+ /**
+ Determines if an object is Promise by checking if it is "thenable".
+ **/
+ function isPromise(obj) {
+ return (typeof obj === 'object' && obj !== null || typeof obj === 'function') && typeof obj.then === 'function';
+ }
+
+ function merge(hash, other) {
+ for (var prop in other) {
+ if (hasOwnProperty.call(other, prop)) {
+ hash[prop] = other[prop];
+ }
+ }
+ }
+
+ /**
+ @private
+
+ Extracts query params from the end of an array
+ **/
+ function extractQueryParams(array) {
+ var len = array && array.length,
+ head = void 0,
+ queryParams = void 0;
+
+ if (len && len > 0 && array[len - 1] && array[len - 1].hasOwnProperty('queryParams')) {
+ queryParams = array[len - 1].queryParams;
+ head = slice.call(array, 0, len - 1);
+ return [head, queryParams];
+ } else {
+ return [array, null];
+ }
+ }
+
+ /**
+ @private
+
+ Coerces query param properties and array elements into strings.
+ **/
+ function coerceQueryParamsToString(queryParams) {
+ for (var key in queryParams) {
+ if (typeof queryParams[key] === 'number') {
+ queryParams[key] = '' + queryParams[key];
+ } else if (Array.isArray(queryParams[key])) {
+ for (var i = 0, l = queryParams[key].length; i < l; i++) {
+ queryParams[key][i] = '' + queryParams[key][i];
+ }
+ }
+ }
+ }
+ /**
+ @private
+ */
+ function _log(router, sequence, msg) {
+ if (!router.log) {
+ return;
+ }
+
+ if (arguments.length === 3) {
+ router.log('Transition #' + sequence + ': ' + msg);
+ } else {
+ msg = sequence;
+ router.log(msg);
+ }
+ }
+
+ function isParam(object) {
+ return typeof object === 'string' || object instanceof String || typeof object === 'number' || object instanceof Number;
+ }
+
+ function forEach(array, callback) {
+ for (var i = 0, l = array.length; i < l && false !== callback(array[i]); i++) {
+ // empty intentionally
+ }
+ }
+
+ function _trigger(router, handlerInfos, ignoreFailure, args) {
+ if (router.triggerEvent) {
+ router.triggerEvent(handlerInfos, ignoreFailure, args);
+ return;
+ }
+
+ var name = args.shift();
+
+ if (!handlerInfos) {
+ if (ignoreFailure) {
+ return;
+ }
+ throw new Error("Could not trigger event '" + name + "'. There are no active handlers");
+ }
+
+ var eventWasHandled = false;
+
+ function delayedEvent(name, args, handler) {
+ handler.events[name].apply(handler, args);
+ }
+
+ for (var i = handlerInfos.length - 1; i >= 0; i--) {
+ var handlerInfo = handlerInfos[i],
+ handler = handlerInfo.handler;
+
+ // If there is no handler, it means the handler hasn't resolved yet which
+ // means that we should trigger the event later when the handler is available
+ if (!handler) {
+ handlerInfo.handlerPromise.then(delayedEvent.bind(null, name, args));
+ continue;
+ }
+
+ if (handler.events && handler.events[name]) {
+ if (handler.events[name].apply(handler, args) === true) {
+ eventWasHandled = true;
+ } else {
+ return;
+ }
+ }
+ }
+
+ // In the case that we got an UnrecognizedURLError as an event with no handler,
+ // let it bubble up
+ if (name === 'error' && args[0].name === 'UnrecognizedURLError') {
+ throw args[0];
+ } else if (!eventWasHandled && !ignoreFailure) {
+ throw new Error("Nothing handled the event '" + name + "'.");
+ }
+ }
+
+ function getChangelist(oldObject, newObject) {
+ var key = void 0;
+ var results = {
+ all: {},
+ changed: {},
+ removed: {}
+ };
+
+ merge(results.all, newObject);
+
+ var didChange = false;
+ coerceQueryParamsToString(oldObject);
+ coerceQueryParamsToString(newObject);
+
+ // Calculate removals
+ for (key in oldObject) {
+ if (hasOwnProperty.call(oldObject, key)) {
+ if (!hasOwnProperty.call(newObject, key)) {
+ didChange = true;
+ results.removed[key] = oldObject[key];
+ }
+ }
+ }
+
+ // Calculate changes
+ for (key in newObject) {
+ if (hasOwnProperty.call(newObject, key)) {
+ if (Array.isArray(oldObject[key]) && Array.isArray(newObject[key])) {
+ if (oldObject[key].length !== newObject[key].length) {
+ results.changed[key] = newObject[key];
+ didChange = true;
+ } else {
+ for (var i = 0, l = oldObject[key].length; i < l; i++) {
+ if (oldObject[key][i] !== newObject[key][i]) {
+ results.changed[key] = newObject[key];
+ didChange = true;
+ }
+ }
+ }
+ } else {
+ if (oldObject[key] !== newObject[key]) {
+ results.changed[key] = newObject[key];
+ didChange = true;
+ }
+ }
+ }
+ }
+
+ return didChange && results;
+ }
+
+ function _promiseLabel(label) {
+ return 'Router: ' + label;
+ }
+
+ function resolveHook(obj, hookName) {
+ if (!obj) {
+ return;
+ }
+ var underscored = '_' + hookName;
+ return obj[underscored] && underscored || obj[hookName] && hookName;
+ }
+
+ function callHook(obj, _hookName, arg1, arg2) {
+ var hookName = resolveHook(obj, _hookName);
+ return hookName && obj[hookName].call(obj, arg1, arg2);
+ }
+
+ function applyHook(obj, _hookName, args) {
+ var hookName = resolveHook(obj, _hookName);
+ if (hookName) {
+ if (args.length === 0) {
+ return obj[hookName].call(obj);
+ } else if (args.length === 1) {
+ return obj[hookName].call(obj, args[0]);
+ } else if (args.length === 2) {
+ return obj[hookName].call(obj, args[0], args[1]);
+ } else {
+ return obj[hookName].apply(obj, args);
+ }
+ }
+ }
+
+ function TransitionState() {
+ this.handlerInfos = [];
+ this.queryParams = {};
+ this.params = {};
+ }
+
+ TransitionState.prototype = {
+ promiseLabel: function (label) {
+ var targetName = '';
+ forEach(this.handlerInfos, function (handlerInfo) {
+ if (targetName !== '') {
+ targetName += '.';
+ }
+ targetName += handlerInfo.name;
+ });
+ return _promiseLabel("'" + targetName + "': " + label);
+ },
+
+ resolve: function (shouldContinue, payload) {
+ // First, calculate params for this state. This is useful
+ // information to provide to the various route hooks.
+ var params = this.params;
+ forEach(this.handlerInfos, function (handlerInfo) {
+ params[handlerInfo.name] = handlerInfo.params || {};
+ });
+
+ payload = payload || {};
+ payload.resolveIndex = 0;
+
+ var currentState = this;
+ var wasAborted = false;
+
+ // The prelude RSVP.resolve() asyncs us into the promise land.
+ return _rsvp.Promise.resolve(null, this.promiseLabel('Start transition')).then(resolveOneHandlerInfo, null, this.promiseLabel('Resolve handler')).catch(handleError, this.promiseLabel('Handle error'));
+
+ function innerShouldContinue() {
+ return _rsvp.Promise.resolve(shouldContinue(), currentState.promiseLabel('Check if should continue')).catch(function (reason) {
+ // We distinguish between errors that occurred
+ // during resolution (e.g. before"Model/model/afterModel),
+ // and aborts due to a rejecting promise from shouldContinue().
+ wasAborted = true;
+ return _rsvp.Promise.reject(reason);
+ }, currentState.promiseLabel('Handle abort'));
+ }
+
+ function handleError(error) {
+ // This is the only possible
+ // reject value of TransitionState#resolve
+ var handlerInfos = currentState.handlerInfos;
+ var errorHandlerIndex = payload.resolveIndex >= handlerInfos.length ? handlerInfos.length - 1 : payload.resolveIndex;
+ return _rsvp.Promise.reject({
+ error: error,
+ handlerWithError: currentState.handlerInfos[errorHandlerIndex].handler,
+ wasAborted: wasAborted,
+ state: currentState
+ });
+ }
+
+ function proceed(resolvedHandlerInfo) {
+ var wasAlreadyResolved = currentState.handlerInfos[payload.resolveIndex].isResolved;
+
+ // Swap the previously unresolved handlerInfo with
+ // the resolved handlerInfo
+ currentState.handlerInfos[payload.resolveIndex++] = resolvedHandlerInfo;
+
+ if (!wasAlreadyResolved) {
+ // Call the redirect hook. The reason we call it here
+ // vs. afterModel is so that redirects into child
+ // routes don't re-run the model hooks for this
+ // already-resolved route.
+ var handler = resolvedHandlerInfo.handler;
+ callHook(handler, 'redirect', resolvedHandlerInfo.context, payload);
+ }
+
+ // Proceed after ensuring that the redirect hook
+ // didn't abort this transition by transitioning elsewhere.
+ return innerShouldContinue().then(resolveOneHandlerInfo, null, currentState.promiseLabel('Resolve handler'));
+ }
+
+ function resolveOneHandlerInfo() {
+ if (payload.resolveIndex === currentState.handlerInfos.length) {
+ // This is is the only possible
+ // fulfill value of TransitionState#resolve
+ return {
+ error: null,
+ state: currentState
+ };
+ }
+
+ var handlerInfo = currentState.handlerInfos[payload.resolveIndex];
+
+ return handlerInfo.resolve(innerShouldContinue, payload).then(proceed, null, currentState.promiseLabel('Proceed'));
+ }
+ }
+ };
+
+ function TransitionAbortedError(message) {
+ if (!(this instanceof TransitionAbortedError)) {
+ return new TransitionAbortedError(message);
+ }
+
+ var error = Error.call(this, message);
+
+ if (Error.captureStackTrace) {
+ Error.captureStackTrace(this, TransitionAbortedError);
+ } else {
+ this.stack = error.stack;
+ }
+
+ this.description = error.description;
+ this.fileName = error.fileName;
+ this.lineNumber = error.lineNumber;
+ this.message = error.message || 'TransitionAborted';
+ this.name = 'TransitionAborted';
+ this.number = error.number;
+ this.code = error.code;
+ }
+
+ TransitionAbortedError.prototype = Object.create(Error.prototype);
+
+ /**
+ A Transition is a thennable (a promise-like object) that represents
+ an attempt to transition to another route. It can be aborted, either
+ explicitly via `abort` or by attempting another transition while a
+ previous one is still underway. An aborted transition can also
+ be `retry()`d later.
+
+ @class Transition
+ @constructor
+ @param {Object} router
+ @param {Object} intent
+ @param {Object} state
+ @param {Object} error
+ @private
+ */
+
+ var Transition = function () {
+ function Transition(router, intent, state, error, previousTransition) {
+ var _this = this;
+
+ (0, _emberBabel.classCallCheck)(this, Transition);
+
+ this.state = state || router.state;
+ this.intent = intent;
+ this.router = router;
+ this.data = this.intent && this.intent.data || {};
+ this.resolvedModels = {};
+ this.queryParams = {};
+ this.promise = undefined;
+ this.error = undefined;
+ this.params = undefined;
+ this.handlerInfos = undefined;
+ this.targetName = undefined;
+ this.pivotHandler = undefined;
+ this.sequence = undefined;
+ this.isAborted = false;
+ this.isActive = true;
+ this.urlMethod = 'update';
+ this.resolveIndex = 0;
+ this.queryParamsOnly = false;
+ this.isTransition = true;
+
+ if (error) {
+ this.promise = _rsvp.Promise.reject(error);
+ this.error = error;
+ return;
+ }
+
+ // if you're doing multiple redirects, need the new transition to know if it
+ // is actually part of the first transition or not. Any further redirects
+ // in the initial transition also need to know if they are part of the
+ // initial transition
+ this.isCausedByAbortingTransition = !!previousTransition;
+ this.isCausedByInitialTransition = previousTransition && (previousTransition.isCausedByInitialTransition || previousTransition.sequence === 0);
+
+ if (state) {
+ this.params = state.params;
+ this.queryParams = state.queryParams;
+ this.handlerInfos = state.handlerInfos;
+
+ var len = state.handlerInfos.length;
+ if (len) {
+ this.targetName = state.handlerInfos[len - 1].name;
+ }
+
+ for (var i = 0; i < len; ++i) {
+ var handlerInfo = state.handlerInfos[i];
+
+ // TODO: this all seems hacky
+ if (!handlerInfo.isResolved) {
+ break;
+ }
+ this.pivotHandler = handlerInfo.handler;
+ }
+
+ this.sequence = router.currentSequence++;
+ this.promise = state.resolve(function () {
+ if (_this.isAborted) {
+ return _rsvp.Promise.reject(undefined, _promiseLabel('Transition aborted - reject'));
+ }
+ }, this).catch(function (result) {
+ if (result.wasAborted || _this.isAborted) {
+ return _rsvp.Promise.reject(logAbort(_this));
+ } else {
+ _this.trigger('error', result.error, _this, result.handlerWithError);
+ _this.abort();
+ return _rsvp.Promise.reject(result.error);
+ }
+ }, _promiseLabel('Handle Abort'));
+ } else {
+ this.promise = _rsvp.Promise.resolve(this.state);
+ this.params = {};
+ }
+ }
+
+ Transition.prototype.isExiting = function isExiting(handler) {
+ var handlerInfos = this.handlerInfos;
+ for (var i = 0, len = handlerInfos.length; i < len; ++i) {
+ var handlerInfo = handlerInfos[i];
+ if (handlerInfo.name === handler || handlerInfo.handler === handler) {
+ return false;
+ }
+ }
+ return true;
+ };
+
+ Transition.prototype.then = function then(onFulfilled, onRejected, label) {
+ return this.promise.then(onFulfilled, onRejected, label);
+ };
+
+ Transition.prototype.catch = function _catch(onRejection, label) {
+ return this.promise.catch(onRejection, label);
+ };
+
+ Transition.prototype.finally = function _finally(callback, label) {
+ return this.promise.finally(callback, label);
+ };
+
+ Transition.prototype.abort = function abort() {
+ if (this.isAborted) {
+ return this;
+ }
+ _log(this.router, this.sequence, this.targetName + ': transition was aborted');
+ this.intent.preTransitionState = this.router.state;
+ this.isAborted = true;
+ this.isActive = false;
+ this.router.activeTransition = null;
+ return this;
+ };
+
+ Transition.prototype.retry = function retry() {
+ // TODO: add tests for merged state retry()s
+ this.abort();
+ var newTransition = this.router.transitionByIntent(this.intent, false);
+
+ // inheriting a `null` urlMethod is not valid
+ // the urlMethod is only set to `null` when
+ // the transition is initiated *after* the url
+ // has been updated (i.e. `router.handleURL`)
+ //
+ // in that scenario, the url method cannot be
+ // inherited for a new transition because then
+ // the url would not update even though it should
+ if (this.urlMethod !== null) {
+ newTransition.method(this.urlMethod);
+ }
+ return newTransition;
+ };
+
+ Transition.prototype.method = function method(_method) {
+ this.urlMethod = _method;
+ return this;
+ };
+
+ Transition.prototype.trigger = function trigger(ignoreFailure) {
+ var args = slice.call(arguments);
+ if (typeof ignoreFailure === 'boolean') {
+ args.shift();
+ } else {
+ // Throw errors on unhandled trigger events by default
+ ignoreFailure = false;
+ }
+ _trigger(this.router, this.state.handlerInfos.slice(0, this.resolveIndex + 1), ignoreFailure, args);
+ };
+
+ Transition.prototype.followRedirects = function followRedirects() {
+ var router = this.router;
+ return this.promise.catch(function (reason) {
+ if (router.activeTransition) {
+ return router.activeTransition.followRedirects();
+ }
+ return _rsvp.Promise.reject(reason);
+ });
+ };
+
+ Transition.prototype.toString = function toString() {
+ return 'Transition (sequence ' + this.sequence + ')';
+ };
+
+ Transition.prototype.log = function log(message) {
+ _log(this.router, this.sequence, message);
+ };
+
+ return Transition;
+ }();
+
+ // Alias 'trigger' as 'send'
+ Transition.prototype.send = Transition.prototype.trigger;
+
+ /**
+ @private
+
+ Logs and returns an instance of TransitionAborted.
+ */
+ function logAbort(transition) {
+ _log(transition.router, transition.sequence, 'detected abort.');
+ return new TransitionAbortedError();
+ }
+
+ var TransitionIntent = function TransitionIntent() {
+ (0, _emberBabel.classCallCheck)(this, TransitionIntent);
+
+ this.data = this.data || {};
+ };
+
+ var DEFAULT_HANDLER = Object.freeze({});
+
+ var HandlerInfo = function () {
+ function HandlerInfo(_props) {
+ (0, _emberBabel.classCallCheck)(this, HandlerInfo);
+
+ var props = _props || {};
+
+ // initialize local properties to ensure consistent object shape
+ this._handler = DEFAULT_HANDLER;
+ this._handlerPromise = null;
+ this.factory = null; // Injected by the handler info factory
+ this.name = props.name;
+
+ for (var prop in props) {
+ if (prop === 'handler') {
+ this._processHandler(props.handler);
+ } else {
+ this[prop] = props[prop];
+ }
+ }
+ }
+
+ HandlerInfo.prototype.getHandler = function getHandler() {};
+
+ HandlerInfo.prototype.fetchHandler = function fetchHandler() {
+ var handler = this.getHandler(this.name);
+
+ return this._processHandler(handler);
+ };
+
+ HandlerInfo.prototype._processHandler = function _processHandler(handler) {
+ var _this2 = this;
+
+ // Setup a handlerPromise so that we can wait for asynchronously loaded handlers
+ this.handlerPromise = _rsvp.Promise.resolve(handler);
+
+ // Wait until the 'handler' property has been updated when chaining to a handler
+ // that is a promise
+ if (isPromise(handler)) {
+ this.handlerPromise = this.handlerPromise.then(function (h) {
+ return _this2.updateHandler(h);
+ });
+ // set to undefined to avoid recursive loop in the handler getter
+ return this.handler = undefined;
+ } else if (handler) {
+ return this.updateHandler(handler);
+ }
+ };
+
+ HandlerInfo.prototype.log = function log(payload, message) {
+ if (payload.log) {
+ payload.log(this.name + ': ' + message);
+ }
+ };
+
+ HandlerInfo.prototype.promiseLabel = function promiseLabel(label) {
+ return _promiseLabel("'" + this.name + "' " + label);
+ };
+
+ HandlerInfo.prototype.getUnresolved = function getUnresolved() {
+ return this;
+ };
+
+ HandlerInfo.prototype.serialize = function serialize() {
+ return this.params || {};
+ };
+
+ HandlerInfo.prototype.updateHandler = function updateHandler(handler) {
+ // Store the name of the handler on the handler for easy checks later
+ handler._handlerName = this.name;
+ return this.handler = handler;
+ };
+
+ HandlerInfo.prototype.resolve = function resolve(shouldContinue, payload) {
+ var checkForAbort = this.checkForAbort.bind(this, shouldContinue),
+ beforeModel = this.runBeforeModelHook.bind(this, payload),
+ model = this.getModel.bind(this, payload),
+ afterModel = this.runAfterModelHook.bind(this, payload),
+ becomeResolved = this.becomeResolved.bind(this, payload),
+ self = this;
+
+ return _rsvp.Promise.resolve(this.handlerPromise, this.promiseLabel('Start handler')).then(function (handler) {
+ // We nest this chain in case the handlerPromise has an error so that
+ // we don't have to bubble it through every step
+ return _rsvp.Promise.resolve(handler).then(checkForAbort, null, self.promiseLabel('Check for abort')).then(beforeModel, null, self.promiseLabel('Before model')).then(checkForAbort, null, self.promiseLabel("Check if aborted during 'beforeModel' hook")).then(model, null, self.promiseLabel('Model')).then(checkForAbort, null, self.promiseLabel("Check if aborted in 'model' hook")).then(afterModel, null, self.promiseLabel('After model')).then(checkForAbort, null, self.promiseLabel("Check if aborted in 'afterModel' hook")).then(becomeResolved, null, self.promiseLabel('Become resolved'));
+ }, function (error) {
+ throw error;
+ });
+ };
+
+ HandlerInfo.prototype.runBeforeModelHook = function runBeforeModelHook(payload) {
+ if (payload.trigger) {
+ payload.trigger(true, 'willResolveModel', payload, this.handler);
+ }
+ return this.runSharedModelHook(payload, 'beforeModel', []);
+ };
+
+ HandlerInfo.prototype.runAfterModelHook = function runAfterModelHook(payload, resolvedModel) {
+ // Stash the resolved model on the payload.
+ // This makes it possible for users to swap out
+ // the resolved model in afterModel.
+ var name = this.name;
+ this.stashResolvedModel(payload, resolvedModel);
+
+ return this.runSharedModelHook(payload, 'afterModel', [resolvedModel]).then(function () {
+ // Ignore the fulfilled value returned from afterModel.
+ // Return the value stashed in resolvedModels, which
+ // might have been swapped out in afterModel.
+ return payload.resolvedModels[name];
+ }, null, this.promiseLabel('Ignore fulfillment value and return model value'));
+ };
+
+ HandlerInfo.prototype.runSharedModelHook = function runSharedModelHook(payload, hookName, args) {
+ this.log(payload, 'calling ' + hookName + ' hook');
+
+ if (this.queryParams) {
+ args.push(this.queryParams);
+ }
+ args.push(payload);
+
+ var result = applyHook(this.handler, hookName, args);
+
+ if (result && result.isTransition) {
+ result = null;
+ }
+
+ return _rsvp.Promise.resolve(result, this.promiseLabel('Resolve value returned from one of the model hooks'));
+ };
+
+ HandlerInfo.prototype.getModel = function getModel() {};
+
+ HandlerInfo.prototype.checkForAbort = function checkForAbort(shouldContinue, promiseValue) {
+ return _rsvp.Promise.resolve(shouldContinue(), this.promiseLabel('Check for abort')).then(function () {
+ // We don't care about shouldContinue's resolve value;
+ // pass along the original value passed to this fn.
+ return promiseValue;
+ }, null, this.promiseLabel('Ignore fulfillment value and continue'));
+ };
+
+ HandlerInfo.prototype.stashResolvedModel = function stashResolvedModel(payload, resolvedModel) {
+ payload.resolvedModels = payload.resolvedModels || {};
+ payload.resolvedModels[this.name] = resolvedModel;
+ };
+
+ HandlerInfo.prototype.becomeResolved = function becomeResolved(payload, resolvedContext) {
+ var params = this.serialize(resolvedContext);
+
+ if (payload) {
+ this.stashResolvedModel(payload, resolvedContext);
+ payload.params = payload.params || {};
+ payload.params[this.name] = params;
+ }
+
+ return this.factory('resolved', {
+ context: resolvedContext,
+ name: this.name,
+ handler: this.handler,
+ params: params
+ });
+ };
+
+ HandlerInfo.prototype.shouldSupercede = function shouldSupercede(other) {
+ // Prefer this newer handlerInfo over `other` if:
+ // 1) The other one doesn't exist
+ // 2) The names don't match
+ // 3) This handler has a context that doesn't match
+ // the other one (or the other one doesn't have one).
+ // 4) This handler has parameters that don't match the other.
+ if (!other) {
+ return true;
+ }
+
+ var contextsMatch = other.context === this.context;
+ return other.name !== this.name || this.hasOwnProperty('context') && !contextsMatch || this.hasOwnProperty('params') && !paramsMatch(this.params, other.params);
+ };
+
+ (0, _emberBabel.createClass)(HandlerInfo, [{
+ key: 'handler',
+ get: function () {
+ // _handler could be set to either a handler object or undefined, so we
+ // compare against a default reference to know when it's been set
+ if (this._handler !== DEFAULT_HANDLER) {
+ return this._handler;
+ }
+
+ return this.fetchHandler();
+ },
+ set: function (handler) {
+ return this._handler = handler;
+ }
+ }, {
+ key: 'handlerPromise',
+ get: function () {
+ if (this._handlerPromise !== null) {
+ return this._handlerPromise;
+ }
+
+ this.fetchHandler();
+
+ return this._handlerPromise;
+ },
+ set: function (handlerPromise) {
+ this._handlerPromise = handlerPromise;
+
+ return handlerPromise;
+ }
+ }]);
+ return HandlerInfo;
+ }();
+
+ // this is bonkers, we require that `context` be set on on the
+ // HandlerInfo prototype to null because the checks in
+ // `NamedTransitionIntent.prototype.applyToHandlers` here
+ // https://github.com/tildeio/router.js/blob/v1.2.8/lib/router/transition-intent/named-transition-intent.js#L76-L81
+ // check of `oldHandlerInfo.context === newHandlerInfo.context` and assumes
+ // that the params _must_ match also in that case.
+ //
+ // The only reason `oldHandlerInfo.context` and `newHandlerInfo.context` did not
+ // match in prior versions is because if the context isn't set yet (on newHandlerInfo)
+ // is because it inherits the `null` from the prototype vs `undefined` (on
+ // the oldHandlerInfo).
+ //
+ // A future refactoring should remove that conditional, and fix the hand full of
+ // failing tests.
+ HandlerInfo.prototype.context = null;
+
+ function paramsMatch(a, b) {
+ if (!a ^ !b) {
+ // Only one is null.
+ return false;
+ }
+
+ if (!a) {
+ // Both must be null.
+ return true;
+ }
+
+ // Note: this assumes that both params have the same
+ // number of keys, but since we're comparing the
+ // same handlers, they should.
+ for (var k in a) {
+ if (a.hasOwnProperty(k) && a[k] !== b[k]) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ var ResolvedHandlerInfo = function (_HandlerInfo) {
+ (0, _emberBabel.inherits)(ResolvedHandlerInfo, _HandlerInfo);
+
+ function ResolvedHandlerInfo(props) {
+ (0, _emberBabel.classCallCheck)(this, ResolvedHandlerInfo);
+
+ var _this3 = (0, _emberBabel.possibleConstructorReturn)(this, _HandlerInfo.call(this, props));
+
+ _this3.isResolved = true;
+ return _this3;
+ }
+
+ ResolvedHandlerInfo.prototype.resolve = function resolve(shouldContinue, payload) {
+ // A ResolvedHandlerInfo just resolved with itself.
+ if (payload && payload.resolvedModels) {
+ payload.resolvedModels[this.name] = this.context;
+ }
+ return _rsvp.Promise.resolve(this, this.promiseLabel('Resolve'));
+ };
+
+ ResolvedHandlerInfo.prototype.getUnresolved = function getUnresolved() {
+ return this.factory('param', {
+ name: this.name,
+ handler: this.handler,
+ params: this.params
+ });
+ };
+
+ return ResolvedHandlerInfo;
+ }(HandlerInfo);
+
+ var UnresolvedHandlerInfoByObject = function (_HandlerInfo2) {
+ (0, _emberBabel.inherits)(UnresolvedHandlerInfoByObject, _HandlerInfo2);
+
+ function UnresolvedHandlerInfoByObject(props) {
+ (0, _emberBabel.classCallCheck)(this, UnresolvedHandlerInfoByObject);
+
+ var _this4 = (0, _emberBabel.possibleConstructorReturn)(this, _HandlerInfo2.call(this, props));
+
+ _this4.names = _this4.names || [];
+ return _this4;
+ }
+
+ UnresolvedHandlerInfoByObject.prototype.getModel = function getModel(payload) {
+ this.log(payload, this.name + ': resolving provided model');
+ return _rsvp.Promise.resolve(this.context);
+ };
+
+ UnresolvedHandlerInfoByObject.prototype.serialize = function serialize(_model) {
+ var model = _model || this.context,
+ names = this.names;
+
+ var object = {};
+ if (isParam(model)) {
+ object[names[0]] = model;
+ return object;
+ }
+
+ // Use custom serialize if it exists.
+ if (this.serializer) {
+ // invoke this.serializer unbound (getSerializer returns a stateless function)
+ return this.serializer.call(null, model, names);
+ } else if (this.handler && this.handler.serialize) {
+ return this.handler.serialize(model, names);
+ }
+
+ if (names.length !== 1) {
+ return;
+ }
+
+ var name = names[0];
+
+ if (/_id$/.test(name)) {
+ object[name] = model.id;
+ } else {
+ object[name] = model;
+ }
+ return object;
+ };
+
+ return UnresolvedHandlerInfoByObject;
+ }(HandlerInfo);
+
+ var UnresolvedHandlerInfoByParam = function (_HandlerInfo3) {
+ (0, _emberBabel.inherits)(UnresolvedHandlerInfoByParam, _HandlerInfo3);
+
+ function UnresolvedHandlerInfoByParam(props) {
+ (0, _emberBabel.classCallCheck)(this, UnresolvedHandlerInfoByParam);
+
+ var _this5 = (0, _emberBabel.possibleConstructorReturn)(this, _HandlerInfo3.call(this, props));
+
+ _this5.params = _this5.params || {};
+ return _this5;
+ }
+
+ UnresolvedHandlerInfoByParam.prototype.getModel = function getModel(payload) {
+ var fullParams = this.params;
+ if (payload && payload.queryParams) {
+ fullParams = {};
+ merge(fullParams, this.params);
+ fullParams.queryParams = payload.queryParams;
+ }
+
+ var handler = this.handler;
+ var hookName = resolveHook(handler, 'deserialize') || resolveHook(handler, 'model');
+
+ return this.runSharedModelHook(payload, hookName, [fullParams]);
+ };
+
+ return UnresolvedHandlerInfoByParam;
+ }(HandlerInfo);
+
+ handlerInfoFactory.klasses = {
+ resolved: ResolvedHandlerInfo,
+ param: UnresolvedHandlerInfoByParam,
+ object: UnresolvedHandlerInfoByObject
+ };
+
+ function handlerInfoFactory(name, props) {
+ var klass = handlerInfoFactory.klasses[name];
+ var handlerInfo = new klass(props || {});
+ handlerInfo.factory = handlerInfoFactory;
+ return handlerInfo;
+ }
+
+ var NamedTransitionIntent = function (_TransitionIntent) {
+ (0, _emberBabel.inherits)(NamedTransitionIntent, _TransitionIntent);
+
+ function NamedTransitionIntent(props) {
+ (0, _emberBabel.classCallCheck)(this, NamedTransitionIntent);
+
+ var _this6 = (0, _emberBabel.possibleConstructorReturn)(this, _TransitionIntent.call(this, props));
+
+ _this6.name = props.name;
+ _this6.pivotHandler = props.pivotHandler;
+ _this6.contexts = props.contexts || [];
+ _this6.queryParams = props.queryParams;
+ return _this6;
+ }
+
+ NamedTransitionIntent.prototype.applyToState = function applyToState(oldState, recognizer, getHandler, isIntermediate, getSerializer) {
+ var partitionedArgs = extractQueryParams([this.name].concat(this.contexts)),
+ pureArgs = partitionedArgs[0],
+ handlers = recognizer.handlersFor(pureArgs[0]);
+
+ var targetRouteName = handlers[handlers.length - 1].handler;
+
+ return this.applyToHandlers(oldState, handlers, getHandler, targetRouteName, isIntermediate, null, getSerializer);
+ };
+
+ NamedTransitionIntent.prototype.applyToHandlers = function applyToHandlers(oldState, handlers, getHandler, targetRouteName, isIntermediate, checkingIfActive, getSerializer) {
+ var i, len;
+ var newState = new TransitionState();
+ var objects = this.contexts.slice(0);
+
+ var invalidateIndex = handlers.length;
+
+ // Pivot handlers are provided for refresh transitions
+ if (this.pivotHandler) {
+ for (i = 0, len = handlers.length; i < len; ++i) {
+ if (handlers[i].handler === this.pivotHandler._handlerName) {
+ invalidateIndex = i;
+ break;
+ }
+ }
+ }
+
+ for (i = handlers.length - 1; i >= 0; --i) {
+ var result = handlers[i];
+ var name = result.handler;
+
+ var oldHandlerInfo = oldState.handlerInfos[i];
+ var newHandlerInfo = null;
+
+ if (result.names.length > 0) {
+ if (i >= invalidateIndex) {
+ newHandlerInfo = this.createParamHandlerInfo(name, getHandler, result.names, objects, oldHandlerInfo);
+ } else {
+ var serializer = getSerializer(name);
+ newHandlerInfo = this.getHandlerInfoForDynamicSegment(name, getHandler, result.names, objects, oldHandlerInfo, targetRouteName, i, serializer);
+ }
+ } else {
+ // This route has no dynamic segment.
+ // Therefore treat as a param-based handlerInfo
+ // with empty params. This will cause the `model`
+ // hook to be called with empty params, which is desirable.
+ newHandlerInfo = this.createParamHandlerInfo(name, getHandler, result.names, objects, oldHandlerInfo);
+ }
+
+ if (checkingIfActive) {
+ // If we're performing an isActive check, we want to
+ // serialize URL params with the provided context, but
+ // ignore mismatches between old and new context.
+ newHandlerInfo = newHandlerInfo.becomeResolved(null, newHandlerInfo.context);
+ var oldContext = oldHandlerInfo && oldHandlerInfo.context;
+ if (result.names.length > 0 && newHandlerInfo.context === oldContext) {
+ // If contexts match in isActive test, assume params also match.
+ // This allows for flexibility in not requiring that every last
+ // handler provide a `serialize` method
+ newHandlerInfo.params = oldHandlerInfo && oldHandlerInfo.params;
+ }
+ newHandlerInfo.context = oldContext;
+ }
+
+ var handlerToUse = oldHandlerInfo;
+ if (i >= invalidateIndex || newHandlerInfo.shouldSupercede(oldHandlerInfo)) {
+ invalidateIndex = Math.min(i, invalidateIndex);
+ handlerToUse = newHandlerInfo;
+ }
+
+ if (isIntermediate && !checkingIfActive) {
+ handlerToUse = handlerToUse.becomeResolved(null, handlerToUse.context);
+ }
+
+ newState.handlerInfos.unshift(handlerToUse);
+ }
+
+ if (objects.length > 0) {
+ throw new Error('More context objects were passed than there are dynamic segments for the route: ' + targetRouteName);
+ }
+
+ if (!isIntermediate) {
+ this.invalidateChildren(newState.handlerInfos, invalidateIndex);
+ }
+
+ merge(newState.queryParams, this.queryParams || {});
+
+ return newState;
+ };
+
+ NamedTransitionIntent.prototype.invalidateChildren = function invalidateChildren(handlerInfos, invalidateIndex) {
+ for (var i = invalidateIndex, l = handlerInfos.length; i < l; ++i) {
+ var handlerInfo = handlerInfos[i];
+ handlerInfos[i] = handlerInfo.getUnresolved();
+ }
+ };
+
+ NamedTransitionIntent.prototype.getHandlerInfoForDynamicSegment = function getHandlerInfoForDynamicSegment(name, getHandler, names, objects, oldHandlerInfo, targetRouteName, i, serializer) {
+ var objectToUse;
+ if (objects.length > 0) {
+ // Use the objects provided for this transition.
+ objectToUse = objects[objects.length - 1];
+ if (isParam(objectToUse)) {
+ return this.createParamHandlerInfo(name, getHandler, names, objects, oldHandlerInfo);
+ } else {
+ objects.pop();
+ }
+ } else if (oldHandlerInfo && oldHandlerInfo.name === name) {
+ // Reuse the matching oldHandlerInfo
+ return oldHandlerInfo;
+ } else {
+ if (this.preTransitionState) {
+ var preTransitionHandlerInfo = this.preTransitionState.handlerInfos[i];
+ objectToUse = preTransitionHandlerInfo && preTransitionHandlerInfo.context;
+ } else {
+ // Ideally we should throw this error to provide maximal
+ // information to the user that not enough context objects
+ // were provided, but this proves too cumbersome in Ember
+ // in cases where inner template helpers are evaluated
+ // before parent helpers un-render, in which cases this
+ // error somewhat prematurely fires.
+ //throw new Error("Not enough context objects were provided to complete a transition to " + targetRouteName + ". Specifically, the " + name + " route needs an object that can be serialized into its dynamic URL segments [" + names.join(', ') + "]");
+ return oldHandlerInfo;
+ }
+ }
+
+ return handlerInfoFactory('object', {
+ name: name,
+ getHandler: getHandler,
+ serializer: serializer,
+ context: objectToUse,
+ names: names
+ });
+ };
+
+ NamedTransitionIntent.prototype.createParamHandlerInfo = function createParamHandlerInfo(name, getHandler, names, objects, oldHandlerInfo) {
+ var params = {};
+
+ // Soak up all the provided string/numbers
+ var numNames = names.length;
+ while (numNames--) {
+ // Only use old params if the names match with the new handler
+ var oldParams = oldHandlerInfo && name === oldHandlerInfo.name && oldHandlerInfo.params || {};
+
+ var peek = objects[objects.length - 1];
+ var paramName = names[numNames];
+ if (isParam(peek)) {
+ params[paramName] = '' + objects.pop();
+ } else {
+ // If we're here, this means only some of the params
+ // were string/number params, so try and use a param
+ // value from a previous handler.
+ if (oldParams.hasOwnProperty(paramName)) {
+ params[paramName] = oldParams[paramName];
+ } else {
+ throw new Error("You didn't provide enough string/numeric parameters to satisfy all of the dynamic segments for route " + name);
+ }
+ }
+ }
+
+ return handlerInfoFactory('param', {
+ name: name,
+ getHandler: getHandler,
+ params: params
+ });
+ };
+
+ return NamedTransitionIntent;
+ }(TransitionIntent);
+
+ function UnrecognizedURLError(message) {
+ if (!(this instanceof UnrecognizedURLError)) {
+ return new UnrecognizedURLError(message);
+ }
+
+ var error = Error.call(this, message);
+
+ if (Error.captureStackTrace) {
+ Error.captureStackTrace(this, UnrecognizedURLError);
+ } else {
+ this.stack = error.stack;
+ }
+
+ this.description = error.description;
+ this.fileName = error.fileName;
+ this.lineNumber = error.lineNumber;
+ this.message = error.message || 'UnrecognizedURL';
+ this.name = 'UnrecognizedURLError';
+ this.number = error.number;
+ this.code = error.code;
+ }
+
+ UnrecognizedURLError.prototype = Object.create(Error.prototype);
+
+ var URLTransitionIntent = function (_TransitionIntent2) {
+ (0, _emberBabel.inherits)(URLTransitionIntent, _TransitionIntent2);
+
+ function URLTransitionIntent(props) {
+ (0, _emberBabel.classCallCheck)(this, URLTransitionIntent);
+
+ var _this7 = (0, _emberBabel.possibleConstructorReturn)(this, _TransitionIntent2.call(this, props));
+
+ _this7.url = props.url;
+ return _this7;
+ }
+
+ URLTransitionIntent.prototype.applyToState = function applyToState(oldState, recognizer, getHandler) {
+ var newState = new TransitionState();
+
+ var results = recognizer.recognize(this.url),
+ i,
+ len;
+
+ if (!results) {
+ throw new UnrecognizedURLError(this.url);
+ }
+
+ var statesDiffer = false;
+ var url = this.url;
+
+ // Checks if a handler is accessible by URL. If it is not, an error is thrown.
+ // For the case where the handler is loaded asynchronously, the error will be
+ // thrown once it is loaded.
+ function checkHandlerAccessibility(handler) {
+ if (handler && handler.inaccessibleByURL) {
+ throw new UnrecognizedURLError(url);
+ }
+
+ return handler;
+ }
+
+ for (i = 0, len = results.length; i < len; ++i) {
+ var result = results[i];
+ var name = result.handler;
+ var newHandlerInfo = handlerInfoFactory('param', {
+ name: name,
+ getHandler: getHandler,
+ params: result.params
+ });
+ var handler = newHandlerInfo.handler;
+
+ if (handler) {
+ checkHandlerAccessibility(handler);
+ } else {
+ // If the hanlder is being loaded asynchronously, check if we can
+ // access it after it has resolved
+ newHandlerInfo.handlerPromise = newHandlerInfo.handlerPromise.then(checkHandlerAccessibility);
+ }
+
+ var oldHandlerInfo = oldState.handlerInfos[i];
+ if (statesDiffer || newHandlerInfo.shouldSupercede(oldHandlerInfo)) {
+ statesDiffer = true;
+ newState.handlerInfos[i] = newHandlerInfo;
+ } else {
+ newState.handlerInfos[i] = oldHandlerInfo;
+ }
+ }
+
+ merge(newState.queryParams, results.queryParams);
+
+ return newState;
+ };
+
+ return URLTransitionIntent;
+ }(TransitionIntent);
+
+ var pop = Array.prototype.pop;
+
+ function Router(_options) {
+ var options = _options || {};
+ this.getHandler = options.getHandler || this.getHandler;
+ this.getSerializer = options.getSerializer || this.getSerializer;
+ this.updateURL = options.updateURL || this.updateURL;
+ this.replaceURL = options.replaceURL || this.replaceURL;
+ this.didTransition = options.didTransition || this.didTransition;
+ this.willTransition = options.willTransition || this.willTransition;
+ this.delegate = options.delegate || this.delegate;
+ this.triggerEvent = options.triggerEvent || this.triggerEvent;
+ this.log = options.log || this.log;
+ this.dslCallBacks = []; // NOTE: set by Ember
+ this.state = undefined;
+ this.activeTransition = undefined;
+ this._changedQueryParams = undefined;
+ this.oldState = undefined;
+ this.currentHandlerInfos = undefined;
+ this.currentSequence = 0;
+
+ this.recognizer = new _routeRecognizer.default();
+ this.reset();
+ }
+
+ function getTransitionByIntent(intent, isIntermediate) {
+ var wasTransitioning = !!this.activeTransition;
+ var oldState = wasTransitioning ? this.activeTransition.state : this.state;
+ var newTransition;
+
+ var newState = intent.applyToState(oldState, this.recognizer, this.getHandler, isIntermediate, this.getSerializer);
+ var queryParamChangelist = getChangelist(oldState.queryParams, newState.queryParams);
+
+ if (handlerInfosEqual(newState.handlerInfos, oldState.handlerInfos)) {
+ // This is a no-op transition. See if query params changed.
+ if (queryParamChangelist) {
+ newTransition = this.queryParamsTransition(queryParamChangelist, wasTransitioning, oldState, newState);
+ if (newTransition) {
+ newTransition.queryParamsOnly = true;
+ return newTransition;
+ }
+ }
+
+ // No-op. No need to create a new transition.
+ return this.activeTransition || new Transition(this);
+ }
+
+ if (isIntermediate) {
+ setupContexts(this, newState);
+ return;
+ }
+
+ // Create a new transition to the destination route.
+ newTransition = new Transition(this, intent, newState, undefined, this.activeTransition);
+
+ // transition is to same route with same params, only query params differ.
+ // not caught above probably because refresh() has been used
+ if (handlerInfosSameExceptQueryParams(newState.handlerInfos, oldState.handlerInfos)) {
+ newTransition.queryParamsOnly = true;
+ }
+
+ // Abort and usurp any previously active transition.
+ if (this.activeTransition) {
+ this.activeTransition.abort();
+ }
+ this.activeTransition = newTransition;
+
+ // Transition promises by default resolve with resolved state.
+ // For our purposes, swap out the promise to resolve
+ // after the transition has been finalized.
+ newTransition.promise = newTransition.promise.then(function (result) {
+ return finalizeTransition(newTransition, result.state);
+ }, null, _promiseLabel('Settle transition promise when transition is finalized'));
+
+ if (!wasTransitioning) {
+ notifyExistingHandlers(this, newState, newTransition);
+ }
+
+ fireQueryParamDidChange(this, newState, queryParamChangelist);
+
+ return newTransition;
+ }
+
+ Router.prototype = {
+ /**
+ The main entry point into the router. The API is essentially
+ the same as the `map` method in `route-recognizer`.
+ This method extracts the String handler at the last `.to()`
+ call and uses it as the name of the whole route.
+ @param {Function} callback
+ */
+ map: function (callback) {
+ this.recognizer.delegate = this.delegate;
+
+ this.recognizer.map(callback, function (recognizer, routes) {
+ for (var i = routes.length - 1, proceed = true; i >= 0 && proceed; --i) {
+ var route = routes[i];
+ recognizer.add(routes, { as: route.handler });
+ proceed = route.path === '/' || route.path === '' || route.handler.slice(-6) === '.index';
+ }
+ });
+ },
+
+ hasRoute: function (route) {
+ return this.recognizer.hasRoute(route);
+ },
+
+ getHandler: function () {},
+
+ getSerializer: function () {},
+
+ queryParamsTransition: function (changelist, wasTransitioning, oldState, newState) {
+ var router = this;
+
+ fireQueryParamDidChange(this, newState, changelist);
+
+ if (!wasTransitioning && this.activeTransition) {
+ // One of the handlers in queryParamsDidChange
+ // caused a transition. Just return that transition.
+ return this.activeTransition;
+ } else {
+ // Running queryParamsDidChange didn't change anything.
+ // Just update query params and be on our way.
+
+ // We have to return a noop transition that will
+ // perform a URL update at the end. This gives
+ // the user the ability to set the url update
+ // method (default is replaceState).
+ var newTransition = new Transition(this);
+ newTransition.queryParamsOnly = true;
+
+ oldState.queryParams = finalizeQueryParamChange(this, newState.handlerInfos, newState.queryParams, newTransition);
+
+ newTransition.promise = newTransition.promise.then(function (result) {
+ updateURL(newTransition, oldState, true);
+ if (router.didTransition) {
+ router.didTransition(router.currentHandlerInfos);
+ }
+ return result;
+ }, null, _promiseLabel('Transition complete'));
+ return newTransition;
+ }
+ },
+
+ // NOTE: this doesn't really belong here, but here
+ // it shall remain until our ES6 transpiler can
+ // handle cyclical deps.
+ transitionByIntent: function (intent /*, isIntermediate*/) {
+ try {
+ return getTransitionByIntent.apply(this, arguments);
+ } catch (e) {
+ return new Transition(this, intent, null, e);
+ }
+ },
+
+ /**
+ Clears the current and target route handlers and triggers exit
+ on each of them starting at the leaf and traversing up through
+ its ancestors.
+ */
+ reset: function () {
+ if (this.state) {
+ forEach(this.state.handlerInfos.slice().reverse(), function (handlerInfo) {
+ var handler = handlerInfo.handler;
+ callHook(handler, 'exit');
+ });
+ }
+
+ this.oldState = undefined;
+ this.state = new TransitionState();
+ this.currentHandlerInfos = null;
+ },
+
+ activeTransition: null,
+
+ /**
+ var handler = handlerInfo.handler;
+ The entry point for handling a change to the URL (usually
+ via the back and forward button).
+ Returns an Array of handlers and the parameters associated
+ with those parameters.
+ @param {String} url a URL to process
+ @return {Array} an Array of `[handler, parameter]` tuples
+ */
+ handleURL: function (url) {
+ // Perform a URL-based transition, but don't change
+ // the URL afterward, since it already happened.
+ var args = slice.call(arguments);
+ if (url.charAt(0) !== '/') {
+ args[0] = '/' + url;
+ }
+
+ return doTransition(this, args).method(null);
+ },
+
+ /**
+ Hook point for updating the URL.
+ @param {String} url a URL to update to
+ */
+ updateURL: function () {
+ throw new Error('updateURL is not implemented');
+ },
+
+ /**
+ Hook point for replacing the current URL, i.e. with replaceState
+ By default this behaves the same as `updateURL`
+ @param {String} url a URL to update to
+ */
+ replaceURL: function (url) {
+ this.updateURL(url);
+ },
+
+ /**
+ Transition into the specified named route.
+ If necessary, trigger the exit callback on any handlers
+ that are no longer represented by the target route.
+ @param {String} name the name of the route
+ */
+ transitionTo: function () /*name*/{
+ return doTransition(this, arguments);
+ },
+
+ intermediateTransitionTo: function () /*name*/{
+ return doTransition(this, arguments, true);
+ },
+
+ refresh: function (pivotHandler) {
+ var previousTransition = this.activeTransition;
+ var state = previousTransition ? previousTransition.state : this.state;
+ var handlerInfos = state.handlerInfos;
+
+ _log(this, 'Starting a refresh transition');
+ var intent = new NamedTransitionIntent({
+ name: handlerInfos[handlerInfos.length - 1].name,
+ pivotHandler: pivotHandler || handlerInfos[0].handler,
+ contexts: [], // TODO collect contexts...?
+ queryParams: this._changedQueryParams || state.queryParams || {}
+ });
+
+ var newTransition = this.transitionByIntent(intent, false);
+
+ // if the previous transition is a replace transition, that needs to be preserved
+ if (previousTransition && previousTransition.urlMethod === 'replace') {
+ newTransition.method(previousTransition.urlMethod);
+ }
+
+ return newTransition;
+ },
+
+ /**
+ Identical to `transitionTo` except that the current URL will be replaced
+ if possible.
+ This method is intended primarily for use with `replaceState`.
+ @param {String} name the name of the route
+ */
+ replaceWith: function () /*name*/{
+ return doTransition(this, arguments).method('replace');
+ },
+
+ /**
+ Take a named route and context objects and generate a
+ URL.
+ @param {String} name the name of the route to generate
+ a URL for
+ @param {...Object} objects a list of objects to serialize
+ @return {String} a URL
+ */
+ generate: function (handlerName) {
+ var partitionedArgs = extractQueryParams(slice.call(arguments, 1)),
+ suppliedParams = partitionedArgs[0],
+ queryParams = partitionedArgs[1];
+
+ // Construct a TransitionIntent with the provided params
+ // and apply it to the present state of the router.
+ var intent = new NamedTransitionIntent({
+ name: handlerName,
+ contexts: suppliedParams
+ });
+ var state = intent.applyToState(this.state, this.recognizer, this.getHandler, null, this.getSerializer);
+ var params = {};
+
+ for (var i = 0, len = state.handlerInfos.length; i < len; ++i) {
+ var handlerInfo = state.handlerInfos[i];
+ var handlerParams = handlerInfo.serialize();
+ merge(params, handlerParams);
+ }
+ params.queryParams = queryParams;
+
+ return this.recognizer.generate(handlerName, params);
+ },
+
+ applyIntent: function (handlerName, contexts) {
+ var intent = new NamedTransitionIntent({
+ name: handlerName,
+ contexts: contexts
+ });
+
+ var state = this.activeTransition && this.activeTransition.state || this.state;
+ return intent.applyToState(state, this.recognizer, this.getHandler, null, this.getSerializer);
+ },
+
+ isActiveIntent: function (handlerName, contexts, queryParams, _state) {
+ var state = _state || this.state,
+ targetHandlerInfos = state.handlerInfos,
+ handlerInfo,
+ len;
+
+ if (!targetHandlerInfos.length) {
+ return false;
+ }
+
+ var targetHandler = targetHandlerInfos[targetHandlerInfos.length - 1].name;
+ var recogHandlers = this.recognizer.handlersFor(targetHandler);
+
+ var index = 0;
+ for (len = recogHandlers.length; index < len; ++index) {
+ handlerInfo = targetHandlerInfos[index];
+ if (handlerInfo.name === handlerName) {
+ break;
+ }
+ }
+
+ if (index === recogHandlers.length) {
+ // The provided route name isn't even in the route hierarchy.
+ return false;
+ }
+
+ var testState = new TransitionState();
+ testState.handlerInfos = targetHandlerInfos.slice(0, index + 1);
+ recogHandlers = recogHandlers.slice(0, index + 1);
+
+ var intent = new NamedTransitionIntent({
+ name: targetHandler,
+ contexts: contexts
+ });
+
+ var newState = intent.applyToHandlers(testState, recogHandlers, this.getHandler, targetHandler, true, true, this.getSerializer);
+
+ var handlersEqual = handlerInfosEqual(newState.handlerInfos, testState.handlerInfos);
+ if (!queryParams || !handlersEqual) {
+ return handlersEqual;
+ }
+
+ // Get a hash of QPs that will still be active on new route
+ var activeQPsOnNewHandler = {};
+ merge(activeQPsOnNewHandler, queryParams);
+
+ var activeQueryParams = state.queryParams;
+ for (var key in activeQueryParams) {
+ if (activeQueryParams.hasOwnProperty(key) && activeQPsOnNewHandler.hasOwnProperty(key)) {
+ activeQPsOnNewHandler[key] = activeQueryParams[key];
+ }
+ }
+
+ return handlersEqual && !getChangelist(activeQPsOnNewHandler, queryParams);
+ },
+
+ isActive: function (handlerName) {
+ var partitionedArgs = extractQueryParams(slice.call(arguments, 1));
+ return this.isActiveIntent(handlerName, partitionedArgs[0], partitionedArgs[1]);
+ },
+
+ trigger: function () /*name*/{
+ var args = slice.call(arguments);
+ _trigger(this, this.currentHandlerInfos, false, args);
+ },
+
+ /**
+ Hook point for logging transition status updates.
+ @param {String} message The message to log.
+ */
+ log: null
+ };
+
+ /**
+ @private
+
+ Fires queryParamsDidChange event
+ */
+ function fireQueryParamDidChange(router, newState, queryParamChangelist) {
+ // If queryParams changed trigger event
+ if (queryParamChangelist) {
+ // This is a little hacky but we need some way of storing
+ // changed query params given that no activeTransition
+ // is guaranteed to have occurred.
+ router._changedQueryParams = queryParamChangelist.all;
+ _trigger(router, newState.handlerInfos, true, ['queryParamsDidChange', queryParamChangelist.changed, queryParamChangelist.all, queryParamChangelist.removed]);
+ router._changedQueryParams = null;
+ }
+ }
+
+ /**
+ @private
+
+ Takes an Array of `HandlerInfo`s, figures out which ones are
+ exiting, entering, or changing contexts, and calls the
+ proper handler hooks.
+
+ For example, consider the following tree of handlers. Each handler is
+ followed by the URL segment it handles.
+
+ ```
+ |~index ("/")
+ | |~posts ("/posts")
+ | | |-showPost ("/:id")
+ | | |-newPost ("/new")
+ | | |-editPost ("/edit")
+ | |~about ("/about/:id")
+ ```
+
+ Consider the following transitions:
+
+ 1. A URL transition to `/posts/1`.
+ 1. Triggers the `*model` callbacks on the
+ `index`, `posts`, and `showPost` handlers
+ 2. Triggers the `enter` callback on the same
+ 3. Triggers the `setup` callback on the same
+ 2. A direct transition to `newPost`
+ 1. Triggers the `exit` callback on `showPost`
+ 2. Triggers the `enter` callback on `newPost`
+ 3. Triggers the `setup` callback on `newPost`
+ 3. A direct transition to `about` with a specified
+ context object
+ 1. Triggers the `exit` callback on `newPost`
+ and `posts`
+ 2. Triggers the `serialize` callback on `about`
+ 3. Triggers the `enter` callback on `about`
+ 4. Triggers the `setup` callback on `about`
+
+ @param {Router} transition
+ @param {TransitionState} newState
+ */
+ function setupContexts(router, newState, transition) {
+ var partition = partitionHandlers(router.state, newState);
+ var i, l, handler;
+
+ for (i = 0, l = partition.exited.length; i < l; i++) {
+ handler = partition.exited[i].handler;
+ delete handler.context;
+
+ callHook(handler, 'reset', true, transition);
+ callHook(handler, 'exit', transition);
+ }
+
+ var oldState = router.oldState = router.state;
+ router.state = newState;
+ var currentHandlerInfos = router.currentHandlerInfos = partition.unchanged.slice();
+
+ try {
+ for (i = 0, l = partition.reset.length; i < l; i++) {
+ handler = partition.reset[i].handler;
+ callHook(handler, 'reset', false, transition);
+ }
+
+ for (i = 0, l = partition.updatedContext.length; i < l; i++) {
+ handlerEnteredOrUpdated(currentHandlerInfos, partition.updatedContext[i], false, transition);
+ }
+
+ for (i = 0, l = partition.entered.length; i < l; i++) {
+ handlerEnteredOrUpdated(currentHandlerInfos, partition.entered[i], true, transition);
+ }
+ } catch (e) {
+ router.state = oldState;
+ router.currentHandlerInfos = oldState.handlerInfos;
+ throw e;
+ }
+
+ router.state.queryParams = finalizeQueryParamChange(router, currentHandlerInfos, newState.queryParams, transition);
+ }
+
+ /**
+ @private
+
+ Helper method used by setupContexts. Handles errors or redirects
+ that may happen in enter/setup.
+ */
+ function handlerEnteredOrUpdated(currentHandlerInfos, handlerInfo, enter, transition) {
+ var handler = handlerInfo.handler,
+ context = handlerInfo.context;
+
+ function _handlerEnteredOrUpdated(handler) {
+ if (enter) {
+ callHook(handler, 'enter', transition);
+ }
+
+ if (transition && transition.isAborted) {
+ throw new TransitionAbortedError();
+ }
+
+ handler.context = context;
+ callHook(handler, 'contextDidChange');
+
+ callHook(handler, 'setup', context, transition);
+ if (transition && transition.isAborted) {
+ throw new TransitionAbortedError();
+ }
+
+ currentHandlerInfos.push(handlerInfo);
+ }
+
+ // If the handler doesn't exist, it means we haven't resolved the handler promise yet
+ if (!handler) {
+ handlerInfo.handlerPromise = handlerInfo.handlerPromise.then(_handlerEnteredOrUpdated);
+ } else {
+ _handlerEnteredOrUpdated(handler);
+ }
+
+ return true;
+ }
+
+ /**
+ @private
+
+ This function is called when transitioning from one URL to
+ another to determine which handlers are no longer active,
+ which handlers are newly active, and which handlers remain
+ active but have their context changed.
+
+ Take a list of old handlers and new handlers and partition
+ them into four buckets:
+
+ * unchanged: the handler was active in both the old and
+ new URL, and its context remains the same
+ * updated context: the handler was active in both the
+ old and new URL, but its context changed. The handler's
+ `setup` method, if any, will be called with the new
+ context.
+ * exited: the handler was active in the old URL, but is
+ no longer active.
+ * entered: the handler was not active in the old URL, but
+ is now active.
+
+ The PartitionedHandlers structure has four fields:
+
+ * `updatedContext`: a list of `HandlerInfo` objects that
+ represent handlers that remain active but have a changed
+ context
+ * `entered`: a list of `HandlerInfo` objects that represent
+ handlers that are newly active
+ * `exited`: a list of `HandlerInfo` objects that are no
+ longer active.
+ * `unchanged`: a list of `HanderInfo` objects that remain active.
+
+ @param {Array[HandlerInfo]} oldHandlers a list of the handler
+ information for the previous URL (or `[]` if this is the
+ first handled transition)
+ @param {Array[HandlerInfo]} newHandlers a list of the handler
+ information for the new URL
+
+ @return {Partition}
+ */
+ function partitionHandlers(oldState, newState) {
+ var oldHandlers = oldState.handlerInfos;
+ var newHandlers = newState.handlerInfos;
+
+ var handlers = {
+ updatedContext: [],
+ exited: [],
+ entered: [],
+ unchanged: [],
+ reset: undefined
+ };
+
+ var handlerChanged,
+ contextChanged = false,
+ i,
+ l;
+
+ for (i = 0, l = newHandlers.length; i < l; i++) {
+ var oldHandler = oldHandlers[i],
+ newHandler = newHandlers[i];
+
+ if (!oldHandler || oldHandler.handler !== newHandler.handler) {
+ handlerChanged = true;
+ }
+
+ if (handlerChanged) {
+ handlers.entered.push(newHandler);
+ if (oldHandler) {
+ handlers.exited.unshift(oldHandler);
+ }
+ } else if (contextChanged || oldHandler.context !== newHandler.context) {
+ contextChanged = true;
+ handlers.updatedContext.push(newHandler);
+ } else {
+ handlers.unchanged.push(oldHandler);
+ }
+ }
+
+ for (i = newHandlers.length, l = oldHandlers.length; i < l; i++) {
+ handlers.exited.unshift(oldHandlers[i]);
+ }
+
+ handlers.reset = handlers.updatedContext.slice();
+ handlers.reset.reverse();
+
+ return handlers;
+ }
+
+ function updateURL(transition, state /*, inputUrl*/) {
+ var urlMethod = transition.urlMethod;
+
+ if (!urlMethod) {
+ return;
+ }
+
+ var router = transition.router,
+ handlerInfos = state.handlerInfos,
+ handlerName = handlerInfos[handlerInfos.length - 1].name,
+ params = {};
+
+ for (var i = handlerInfos.length - 1; i >= 0; --i) {
+ var handlerInfo = handlerInfos[i];
+ merge(params, handlerInfo.params);
+ if (handlerInfo.handler.inaccessibleByURL) {
+ urlMethod = null;
+ }
+ }
+
+ if (urlMethod) {
+ params.queryParams = transition._visibleQueryParams || state.queryParams;
+ var url = router.recognizer.generate(handlerName, params);
+
+ // transitions during the initial transition must always use replaceURL.
+ // When the app boots, you are at a url, e.g. /foo. If some handler
+ // redirects to bar as part of the initial transition, you don't want to
+ // add a history entry for /foo. If you do, pressing back will immediately
+ // hit the redirect again and take you back to /bar, thus killing the back
+ // button
+ var initial = transition.isCausedByInitialTransition;
+
+ // say you are at / and you click a link to route /foo. In /foo's
+ // handler, the transition is aborted using replacewith('/bar').
+ // Because the current url is still /, the history entry for / is
+ // removed from the history. Clicking back will take you to the page
+ // you were on before /, which is often not even the app, thus killing
+ // the back button. That's why updateURL is always correct for an
+ // aborting transition that's not the initial transition
+ var replaceAndNotAborting = urlMethod === 'replace' && !transition.isCausedByAbortingTransition;
+
+ // because calling refresh causes an aborted transition, this needs to be
+ // special cased - if the initial transition is a replace transition, the
+ // urlMethod should be honored here.
+ var isQueryParamsRefreshTransition = transition.queryParamsOnly && urlMethod === 'replace';
+
+ if (initial || replaceAndNotAborting || isQueryParamsRefreshTransition) {
+ router.replaceURL(url);
+ } else {
+ router.updateURL(url);
+ }
+ }
+ }
+
+ /**
+ @private
+
+ Updates the URL (if necessary) and calls `setupContexts`
+ to update the router's array of `currentHandlerInfos`.
+ */
+ function finalizeTransition(transition, newState) {
+ try {
+ _log(transition.router, transition.sequence, 'Resolved all models on destination route; finalizing transition.');
+
+ var router = transition.router,
+ handlerInfos = newState.handlerInfos;
+
+ // Run all the necessary enter/setup/exit hooks
+ setupContexts(router, newState, transition);
+
+ // Check if a redirect occurred in enter/setup
+ if (transition.isAborted) {
+ // TODO: cleaner way? distinguish b/w targetHandlerInfos?
+ router.state.handlerInfos = router.currentHandlerInfos;
+ return _rsvp.Promise.reject(logAbort(transition));
+ }
+
+ updateURL(transition, newState, transition.intent.url);
+
+ transition.isActive = false;
+ router.activeTransition = null;
+
+ _trigger(router, router.currentHandlerInfos, true, ['didTransition']);
+
+ if (router.didTransition) {
+ router.didTransition(router.currentHandlerInfos);
+ }
+
+ _log(router, transition.sequence, 'TRANSITION COMPLETE.');
+
+ // Resolve with the final handler.
+ return handlerInfos[handlerInfos.length - 1].handler;
+ } catch (e) {
+ if (!(e instanceof TransitionAbortedError)) {
+ //var erroneousHandler = handlerInfos.pop();
+ var infos = transition.state.handlerInfos;
+ transition.trigger(true, 'error', e, transition, infos[infos.length - 1].handler);
+ transition.abort();
+ }
+
+ throw e;
+ }
+ }
+
+ /**
+ @private
+
+ Begins and returns a Transition based on the provided
+ arguments. Accepts arguments in the form of both URL
+ transitions and named transitions.
+
+ @param {Router} router
+ @param {Array[Object]} args arguments passed to transitionTo,
+ replaceWith, or handleURL
+ */
+ function doTransition(router, args, isIntermediate) {
+ // Normalize blank transitions to root URL transitions.
+ var name = args[0] || '/';
+
+ var lastArg = args[args.length - 1];
+ var queryParams = {};
+ if (lastArg && lastArg.hasOwnProperty('queryParams')) {
+ queryParams = pop.call(args).queryParams;
+ }
+
+ var intent;
+ if (args.length === 0) {
+ _log(router, 'Updating query params');
+
+ // A query param update is really just a transition
+ // into the route you're already on.
+ var handlerInfos = router.state.handlerInfos;
+ intent = new NamedTransitionIntent({
+ name: handlerInfos[handlerInfos.length - 1].name,
+ contexts: [],
+ queryParams: queryParams
+ });
+ } else if (name.charAt(0) === '/') {
+ _log(router, 'Attempting URL transition to ' + name);
+ intent = new URLTransitionIntent({ url: name });
+ } else {
+ _log(router, 'Attempting transition to ' + name);
+ intent = new NamedTransitionIntent({
+ name: args[0],
+ contexts: slice.call(args, 1),
+ queryParams: queryParams
+ });
+ }
+
+ return router.transitionByIntent(intent, isIntermediate);
+ }
+
+ function handlerInfosEqual(handlerInfos, otherHandlerInfos) {
+ if (handlerInfos.length !== otherHandlerInfos.length) {
+ return false;
+ }
+
+ for (var i = 0, len = handlerInfos.length; i < len; ++i) {
+ if (handlerInfos[i] !== otherHandlerInfos[i]) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ function handlerInfosSameExceptQueryParams(handlerInfos, otherHandlerInfos) {
+ if (handlerInfos.length !== otherHandlerInfos.length) {
+ return false;
+ }
+
+ for (var i = 0, len = handlerInfos.length; i < len; ++i) {
+ if (handlerInfos[i].name !== otherHandlerInfos[i].name) {
+ return false;
+ }
+
+ if (!paramsEqual(handlerInfos[i].params, otherHandlerInfos[i].params)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ function paramsEqual(params, otherParams) {
+ if (!params && !otherParams) {
+ return true;
+ } else if (!params && !!otherParams || !!params && !otherParams) {
+ // one is falsy but other is not;
+ return false;
+ }
+ var keys = Object.keys(params);
+ var otherKeys = Object.keys(otherParams);
+
+ if (keys.length !== otherKeys.length) {
+ return false;
+ }
+
+ for (var i = 0, len = keys.length; i < len; ++i) {
+ var key = keys[i];
+
+ if (params[key] !== otherParams[key]) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ function finalizeQueryParamChange(router, resolvedHandlers, newQueryParams, transition) {
+ // We fire a finalizeQueryParamChange event which
+ // gives the new route hierarchy a chance to tell
+ // us which query params it's consuming and what
+ // their final values are. If a query param is
+ // no longer consumed in the final route hierarchy,
+ // its serialized segment will be removed
+ // from the URL.
+
+ for (var k in newQueryParams) {
+ if (newQueryParams.hasOwnProperty(k) && newQueryParams[k] === null) {
+ delete newQueryParams[k];
+ }
+ }
+
+ var finalQueryParamsArray = [];
+ _trigger(router, resolvedHandlers, true, ['finalizeQueryParamChange', newQueryParams, finalQueryParamsArray, transition]);
+
+ if (transition) {
+ transition._visibleQueryParams = {};
+ }
+
+ var finalQueryParams = {};
+ for (var i = 0, len = finalQueryParamsArray.length; i < len; ++i) {
+ var qp = finalQueryParamsArray[i];
+ finalQueryParams[qp.key] = qp.value;
+ if (transition && qp.visible !== false) {
+ transition._visibleQueryParams[qp.key] = qp.value;
+ }
+ }
+ return finalQueryParams;
+ }
+
+ function notifyExistingHandlers(router, newState, newTransition) {
+ var oldHandlers = router.state.handlerInfos,
+ changing = [],
+ i,
+ oldHandlerLen,
+ oldHandler,
+ newHandler;
+
+ oldHandlerLen = oldHandlers.length;
+ for (i = 0; i < oldHandlerLen; i++) {
+ oldHandler = oldHandlers[i];
+ newHandler = newState.handlerInfos[i];
+
+ if (!newHandler || oldHandler.name !== newHandler.name) {
+ break;
+ }
+
+ if (!newHandler.isResolved) {
+ changing.push(oldHandler);
+ }
+ }
+
+ _trigger(router, oldHandlers, true, ['willTransition', newTransition]);
+
+ if (router.willTransition) {
+ router.willTransition(oldHandlers, newState.handlerInfos, newTransition);
+ }
+ }
+
+ exports.Transition = Transition;
+ exports.default = Router;
+});
+enifed('rsvp', ['exports', 'ember-babel', 'node-module'], function (exports, _emberBabel, _nodeModule) {
+ 'use strict';
+
+ exports.filter = exports.async = exports.map = exports.reject = exports.resolve = exports.off = exports.on = exports.configure = exports.denodeify = exports.defer = exports.rethrow = exports.hashSettled = exports.hash = exports.race = exports.allSettled = exports.all = exports.EventTarget = exports.Promise = exports.cast = exports.asap = undefined;
+
+ var _rsvp;
+
+ function callbacksFor(object) {
+ var callbacks = object._promiseCallbacks;
+
+ if (!callbacks) {
+ callbacks = object._promiseCallbacks = {};
+ }
+
+ return callbacks;
+ }
+
+ /**
+ @class RSVP.EventTarget
+ */
+ var EventTarget = {
+ mixin: function (object) {
+ object['on'] = this['on'];
+ object['off'] = this['off'];
+ object['trigger'] = this['trigger'];
+ object._promiseCallbacks = undefined;
+ return object;
+ },
+ on: function (eventName, callback) {
+ if (typeof callback !== 'function') {
+ throw new TypeError('Callback must be a function');
+ }
+
+ var allCallbacks = callbacksFor(this),
+ callbacks = void 0;
+
+ callbacks = allCallbacks[eventName];
+
+ if (!callbacks) {
+ callbacks = allCallbacks[eventName] = [];
+ }
+
+ if (callbacks.indexOf(callback)) {
+ callbacks.push(callback);
+ }
+ },
+ off: function (eventName, callback) {
+ var allCallbacks = callbacksFor(this),
+ callbacks = void 0,
+ index = void 0;
+
+ if (!callback) {
+ allCallbacks[eventName] = [];
+ return;
+ }
+
+ callbacks = allCallbacks[eventName];
+
+ index = callbacks.indexOf(callback);
+
+ if (index !== -1) {
+ callbacks.splice(index, 1);
+ }
+ },
+ trigger: function (eventName, options, label) {
+ var allCallbacks = callbacksFor(this),
+ callbacks = void 0,
+ callback = void 0;
+
+ if (callbacks = allCallbacks[eventName]) {
+ // Don't cache the callbacks.length since it may grow
+ for (var i = 0; i < callbacks.length; i++) {
+ callback = callbacks[i];
+
+ callback(options, label);
+ }
+ }
+ }
+ };
+
+ var config = {
+ instrument: false
+ };
+
+ EventTarget['mixin'](config);
+
+ function configure(name, value) {
+ if (arguments.length === 2) {
+ config[name] = value;
+ } else {
+ return config[name];
+ }
+ }
+
+ var queue = [];
+
+ function scheduleFlush() {
+ setTimeout(function () {
+ for (var i = 0; i < queue.length; i++) {
+ var entry = queue[i];
+
+ var payload = entry.payload;
+
+ payload.guid = payload.key + payload.id;
+ payload.childGuid = payload.key + payload.childId;
+ if (payload.error) {
+ payload.stack = payload.error.stack;
+ }
+
+ config['trigger'](entry.name, entry.payload);
+ }
+ queue.length = 0;
+ }, 50);
+ }
+
+ function instrument(eventName, promise, child) {
+ if (1 === queue.push({
+ name: eventName,
+ payload: {
+ key: promise._guidKey,
+ id: promise._id,
+ eventName: eventName,
+ detail: promise._result,
+ childId: child && child._id,
+ label: promise._label,
+ timeStamp: Date.now(),
+ error: config["instrument-with-stack"] ? new Error(promise._label) : null
+ } })) {
+ scheduleFlush();
+ }
+ }
+
+ /**
+ `RSVP.Promise.resolve` returns a promise that will become resolved with the
+ passed `value`. It is shorthand for the following:
+
+ ```javascript
+ let promise = new RSVP.Promise(function(resolve, reject){
+ resolve(1);
+ });
+
+ promise.then(function(value){
+ // value === 1
+ });
+ ```
+
+ Instead of writing the above, your code now simply becomes the following:
+
+ ```javascript
+ let promise = RSVP.Promise.resolve(1);
+
+ promise.then(function(value){
+ // value === 1
+ });
+ ```
+
+ @method resolve
+ @static
+ @param {*} object value that the returned promise will be resolved with
+ @param {String} label optional string for identifying the returned promise.
+ Useful for tooling.
+ @return {Promise} a promise that will become fulfilled with the given
+ `value`
+ */
+ function resolve$1(object, label) {
+ /*jshint validthis:true */
+ var Constructor = this;
+
+ if (object && typeof object === 'object' && object.constructor === Constructor) {
+ return object;
+ }
+
+ var promise = new Constructor(noop, label);
+ resolve(promise, object);
+ return promise;
+ }
+
+ function withOwnPromise() {
+ return new TypeError('A promises callback cannot return that same promise.');
+ }
+
+ function objectOrFunction(x) {
+ var type = typeof x;
+ return x !== null && (type === 'object' || type === 'function');
+ }
+
+ function noop() {}
+
+ var PENDING = void 0;
+ var FULFILLED = 1;
+ var REJECTED = 2;
+
+ function ErrorObject() {
+ this.error = null;
+ }
+
+ var GET_THEN_ERROR = new ErrorObject();
+
+ function getThen(promise) {
+ try {
+ return promise.then;
+ } catch (error) {
+ GET_THEN_ERROR.error = error;
+ return GET_THEN_ERROR;
+ }
+ }
+
+ var TRY_CATCH_ERROR = new ErrorObject();
+
+ var tryCatchCallback = void 0;
+ function tryCatcher() {
+ try {
+ var target = tryCatchCallback;
+ tryCatchCallback = null;
+ return target.apply(this, arguments);
+ } catch (e) {
+ TRY_CATCH_ERROR.error = e;
+ return TRY_CATCH_ERROR;
+ }
+ }
+
+ function tryCatch(fn) {
+ tryCatchCallback = fn;
+ return tryCatcher;
+ }
+
+ function tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) {
+ try {
+ then$$1.call(value, fulfillmentHandler, rejectionHandler);
+ } catch (e) {
+ return e;
+ }
+ }
+
+ function handleForeignThenable(promise, thenable, then$$1) {
+ config.async(function (promise) {
+ var sealed = false;
+ var error = tryThen(then$$1, thenable, function (value) {
+ if (sealed) {
+ return;
+ }
+ sealed = true;
+ if (thenable !== value) {
+ resolve(promise, value, undefined);
+ } else {
+ fulfill(promise, value);
+ }
+ }, function (reason) {
+ if (sealed) {
+ return;
+ }
+ sealed = true;
+
+ reject(promise, reason);
+ }, 'Settle: ' + (promise._label || ' unknown promise'));
+
+ if (!sealed && error) {
+ sealed = true;
+ reject(promise, error);
+ }
+ }, promise);
+ }
+
+ function handleOwnThenable(promise, thenable) {
+ if (thenable._state === FULFILLED) {
+ fulfill(promise, thenable._result);
+ } else if (thenable._state === REJECTED) {
+ thenable._onError = null;
+ reject(promise, thenable._result);
+ } else {
+ subscribe(thenable, undefined, function (value) {
+ if (thenable === value) {
+ fulfill(promise, value);
+ } else {
+ resolve(promise, value);
+ }
+ }, function (reason) {
+ return reject(promise, reason);
+ });
+ }
+ }
+
+ function handleMaybeThenable(promise, maybeThenable, then$$1) {
+ var isOwnThenable = maybeThenable.constructor === promise.constructor && then$$1 === then && promise.constructor.resolve === resolve$1;
+
+ if (isOwnThenable) {
+ handleOwnThenable(promise, maybeThenable);
+ } else if (then$$1 === GET_THEN_ERROR) {
+ var error = GET_THEN_ERROR.error;
+ GET_THEN_ERROR.error = null;
+ reject(promise, error);
+ } else if (typeof then$$1 === 'function') {
+ handleForeignThenable(promise, maybeThenable, then$$1);
+ } else {
+ fulfill(promise, maybeThenable);
+ }
+ }
+
+ function resolve(promise, value) {
+ if (promise === value) {
+ fulfill(promise, value);
+ } else if (objectOrFunction(value)) {
+ handleMaybeThenable(promise, value, getThen(value));
+ } else {
+ fulfill(promise, value);
+ }
+ }
+
+ function publishRejection(promise) {
+ if (promise._onError) {
+ promise._onError(promise._result);
+ }
+
+ publish(promise);
+ }
+
+ function fulfill(promise, value) {
+ if (promise._state !== PENDING) {
+ return;
+ }
+
+ promise._result = value;
+ promise._state = FULFILLED;
+
+ if (promise._subscribers.length === 0) {
+ if (config.instrument) {
+ instrument('fulfilled', promise);
+ }
+ } else {
+ config.async(publish, promise);
+ }
+ }
+
+ function reject(promise, reason) {
+ if (promise._state !== PENDING) {
+ return;
+ }
+ promise._state = REJECTED;
+ promise._result = reason;
+ config.async(publishRejection, promise);
+ }
+
+ function subscribe(parent, child, onFulfillment, onRejection) {
+ var subscribers = parent._subscribers;
+ var length = subscribers.length;
+
+ parent._onError = null;
+
+ subscribers[length] = child;
+ subscribers[length + FULFILLED] = onFulfillment;
+ subscribers[length + REJECTED] = onRejection;
+
+ if (length === 0 && parent._state) {
+ config.async(publish, parent);
+ }
+ }
+
+ function publish(promise) {
+ var subscribers = promise._subscribers;
+ var settled = promise._state;
+
+ if (config.instrument) {
+ instrument(settled === FULFILLED ? 'fulfilled' : 'rejected', promise);
+ }
+
+ if (subscribers.length === 0) {
+ return;
+ }
+
+ var child = void 0,
+ callback = void 0,
+ result = promise._result;
+
+ for (var i = 0; i < subscribers.length; i += 3) {
+ child = subscribers[i];
+ callback = subscribers[i + settled];
+
+ if (child) {
+ invokeCallback(settled, child, callback, result);
+ } else {
+ callback(result);
+ }
+ }
+
+ promise._subscribers.length = 0;
+ }
+
+ function invokeCallback(state, promise, callback, result) {
+ var hasCallback = typeof callback === 'function';
+ var value = void 0;
+
+ if (hasCallback) {
+ value = tryCatch(callback)(result);
+ } else {
+ value = result;
+ }
+
+ if (promise._state !== PENDING) {
+ // noop
+ } else if (value === promise) {
+ reject(promise, withOwnPromise());
+ } else if (value === TRY_CATCH_ERROR) {
+ var error = value.error;
+ value.error = null; // release
+ reject(promise, error);
+ } else if (hasCallback) {
+ resolve(promise, value);
+ } else if (state === FULFILLED) {
+ fulfill(promise, value);
+ } else if (state === REJECTED) {
+ reject(promise, value);
+ }
+ }
+
+ function initializePromise(promise, resolver) {
+ var resolved = false;
+ try {
+ resolver(function (value) {
+ if (resolved) {
+ return;
+ }
+ resolved = true;
+ resolve(promise, value);
+ }, function (reason) {
+ if (resolved) {
+ return;
+ }
+ resolved = true;
+ reject(promise, reason);
+ });
+ } catch (e) {
+ reject(promise, e);
+ }
+ }
+
+ function then(onFulfillment, onRejection, label) {
+ var parent = this;
+ var state = parent._state;
+
+ if (state === FULFILLED && !onFulfillment || state === REJECTED && !onRejection) {
+ config.instrument && instrument('chained', parent, parent);
+ return parent;
+ }
+
+ parent._onError = null;
+
+ var child = new parent.constructor(noop, label);
+ var result = parent._result;
+
+ config.instrument && instrument('chained', parent, child);
+
+ if (state === PENDING) {
+ subscribe(parent, child, onFulfillment, onRejection);
+ } else {
+ var callback = state === FULFILLED ? onFulfillment : onRejection;
+ config.async(function () {
+ return invokeCallback(state, child, callback, result);
+ });
+ }
+
+ return child;
+ }
+
+ var Enumerator = function () {
+ function Enumerator(Constructor, input, abortOnReject, label) {
+ (0, _emberBabel.classCallCheck)(this, Enumerator);
+
+ this._instanceConstructor = Constructor;
+ this.promise = new Constructor(noop, label);
+ this._abortOnReject = abortOnReject;
+ this.isUsingOwnPromise = Constructor === Promise;
+
+ this._init.apply(this, arguments);
+ }
+
+ Enumerator.prototype._init = function _init(Constructor, input) {
+ var len = input.length || 0;
+ this.length = len;
+ this._remaining = len;
+ this._result = new Array(len);
+
+ this._enumerate(input);
+ };
+
+ Enumerator.prototype._enumerate = function _enumerate(input) {
+ var length = this.length;
+ var promise = this.promise;
+
+ for (var i = 0; promise._state === PENDING && i < length; i++) {
+ this._eachEntry(input[i], i, true);
+ }
+
+ this._checkFullfillment();
+ };
+
+ Enumerator.prototype._checkFullfillment = function _checkFullfillment() {
+ if (this._remaining === 0) {
+ fulfill(this.promise, this._result);
+ }
+ };
+
+ Enumerator.prototype._settleMaybeThenable = function _settleMaybeThenable(entry, i, firstPass) {
+ var c = this._instanceConstructor;
+ var resolve$$1 = c.resolve;
+
+ if (resolve$$1 === resolve$1) {
+ var then$$1 = getThen(entry);
+
+ if (then$$1 === then && entry._state !== PENDING) {
+ entry._onError = null;
+ this._settledAt(entry._state, i, entry._result, firstPass);
+ } else if (typeof then$$1 !== 'function') {
+ this._settledAt(FULFILLED, i, entry, firstPass);
+ } else if (this.isUsingOwnPromise) {
+ var promise = new c(noop);
+ handleMaybeThenable(promise, entry, then$$1);
+ this._willSettleAt(promise, i, firstPass);
+ } else {
+ this._willSettleAt(new c(function (resolve$$1) {
+ return resolve$$1(entry);
+ }), i, firstPass);
+ }
+ } else {
+ this._willSettleAt(resolve$$1(entry), i, firstPass);
+ }
+ };
+
+ Enumerator.prototype._eachEntry = function _eachEntry(entry, i, firstPass) {
+ if (entry !== null && typeof entry === 'object') {
+ this._settleMaybeThenable(entry, i, firstPass);
+ } else {
+ this._setResultAt(FULFILLED, i, entry, firstPass);
+ }
+ };
+
+ Enumerator.prototype._settledAt = function _settledAt(state, i, value, firstPass) {
+ var promise = this.promise;
+
+ if (promise._state === PENDING) {
+ if (this._abortOnReject && state === REJECTED) {
+ reject(promise, value);
+ } else {
+ this._setResultAt(state, i, value, firstPass);
+ this._checkFullfillment();
+ }
+ }
+ };
+
+ Enumerator.prototype._setResultAt = function _setResultAt(state, i, value, firstPass) {
+ this._remaining--;
+ this._result[i] = value;
+ };
+
+ Enumerator.prototype._willSettleAt = function _willSettleAt(promise, i, firstPass) {
+ var _this = this;
+
+ subscribe(promise, undefined, function (value) {
+ return _this._settledAt(FULFILLED, i, value, firstPass);
+ }, function (reason) {
+ return _this._settledAt(REJECTED, i, reason, firstPass);
+ });
+ };
+
+ return Enumerator;
+ }();
+
+ function setSettledResult(state, i, value) {
+ this._remaining--;
+ if (state === FULFILLED) {
+ this._result[i] = {
+ state: 'fulfilled',
+ value: value
+ };
+ } else {
+ this._result[i] = {
+ state: 'rejected',
+ reason: value
+ };
+ }
+ }
+
+ /**
+ `RSVP.Promise.all` accepts an array of promises, and returns a new promise which
+ is fulfilled with an array of fulfillment values for the passed promises, or
+ rejected with the reason of the first passed promise to be rejected. It casts all
+ elements of the passed iterable to promises as it runs this algorithm.
+
+ Example:
+
+ ```javascript
+ let promise1 = RSVP.resolve(1);
+ let promise2 = RSVP.resolve(2);
+ let promise3 = RSVP.resolve(3);
+ let promises = [ promise1, promise2, promise3 ];
+
+ RSVP.Promise.all(promises).then(function(array){
+ // The array here would be [ 1, 2, 3 ];
+ });
+ ```
+
+ If any of the `promises` given to `RSVP.all` are rejected, the first promise
+ that is rejected will be given as an argument to the returned promises's
+ rejection handler. For example:
+
+ Example:
+
+ ```javascript
+ let promise1 = RSVP.resolve(1);
+ let promise2 = RSVP.reject(new Error("2"));
+ let promise3 = RSVP.reject(new Error("3"));
+ let promises = [ promise1, promise2, promise3 ];
+
+ RSVP.Promise.all(promises).then(function(array){
+ // Code here never runs because there are rejected promises!
+ }, function(error) {
+ // error.message === "2"
+ });
+ ```
+
+ @method all
+ @static
+ @param {Array} entries array of promises
+ @param {String} label optional string for labeling the promise.
+ Useful for tooling.
+ @return {Promise} promise that is fulfilled when all `promises` have been
+ fulfilled, or rejected if any of them become rejected.
+ @static
+ */
+ function all(entries, label) {
+ if (!Array.isArray(entries)) {
+ return this.reject(new TypeError("Promise.all must be called with an array"), label);
+ }
+ return new Enumerator(this, entries, true /* abort on reject */, label).promise;
+ }
+
+ /**
+ `RSVP.Promise.race` returns a new promise which is settled in the same way as the
+ first passed promise to settle.
+
+ Example:
+
+ ```javascript
+ let promise1 = new RSVP.Promise(function(resolve, reject){
+ setTimeout(function(){
+ resolve('promise 1');
+ }, 200);
+ });
+
+ let promise2 = new RSVP.Promise(function(resolve, reject){
+ setTimeout(function(){
+ resolve('promise 2');
+ }, 100);
+ });
+
+ RSVP.Promise.race([promise1, promise2]).then(function(result){
+ // result === 'promise 2' because it was resolved before promise1
+ // was resolved.
+ });
+ ```
+
+ `RSVP.Promise.race` is deterministic in that only the state of the first
+ settled promise matters. For example, even if other promises given to the
+ `promises` array argument are resolved, but the first settled promise has
+ become rejected before the other promises became fulfilled, the returned
+ promise will become rejected:
+
+ ```javascript
+ let promise1 = new RSVP.Promise(function(resolve, reject){
+ setTimeout(function(){
+ resolve('promise 1');
+ }, 200);
+ });
+
+ let promise2 = new RSVP.Promise(function(resolve, reject){
+ setTimeout(function(){
+ reject(new Error('promise 2'));
+ }, 100);
+ });
+
+ RSVP.Promise.race([promise1, promise2]).then(function(result){
+ // Code here never runs
+ }, function(reason){
+ // reason.message === 'promise 2' because promise 2 became rejected before
+ // promise 1 became fulfilled
+ });
+ ```
+
+ An example real-world use case is implementing timeouts:
+
+ ```javascript
+ RSVP.Promise.race([ajax('foo.json'), timeout(5000)])
+ ```
+
+ @method race
+ @static
+ @param {Array} entries array of promises to observe
+ @param {String} label optional string for describing the promise returned.
+ Useful for tooling.
+ @return {Promise} a promise which settles in the same way as the first passed
+ promise to settle.
+ */
+ function race(entries, label) {
+ /*jshint validthis:true */
+ var Constructor = this;
+
+ var promise = new Constructor(noop, label);
+
+ if (!Array.isArray(entries)) {
+ reject(promise, new TypeError('Promise.race must be called with an array'));
+ return promise;
+ }
+
+ for (var i = 0; promise._state === PENDING && i < entries.length; i++) {
+ subscribe(Constructor.resolve(entries[i]), undefined, function (value) {
+ return resolve(promise, value);
+ }, function (reason) {
+ return reject(promise, reason);
+ });
+ }
+
+ return promise;
+ }
+
+ /**
+ `RSVP.Promise.reject` returns a promise rejected with the passed `reason`.
+ It is shorthand for the following:
+
+ ```javascript
+ let promise = new RSVP.Promise(function(resolve, reject){
+ reject(new Error('WHOOPS'));
+ });
+
+ promise.then(function(value){
+ // Code here doesn't run because the promise is rejected!
+ }, function(reason){
+ // reason.message === 'WHOOPS'
+ });
+ ```
+
+ Instead of writing the above, your code now simply becomes the following:
+
+ ```javascript
+ let promise = RSVP.Promise.reject(new Error('WHOOPS'));
+
+ promise.then(function(value){
+ // Code here doesn't run because the promise is rejected!
+ }, function(reason){
+ // reason.message === 'WHOOPS'
+ });
+ ```
+
+ @method reject
+ @static
+ @param {*} reason value that the returned promise will be rejected with.
+ @param {String} label optional string for identifying the returned promise.
+ Useful for tooling.
+ @return {Promise} a promise rejected with the given `reason`.
+ */
+ function reject$1(reason, label) {
+ /*jshint validthis:true */
+ var Constructor = this;
+ var promise = new Constructor(noop, label);
+ reject(promise, reason);
+ return promise;
+ }
+
+ var guidKey = 'rsvp_' + Date.now() + '-';
+ var counter = 0;
+
+ function needsResolver() {
+ throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');
+ }
+
+ function needsNew() {
+ throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.");
+ }
+
+ /**
+ Promise objects represent the eventual result of an asynchronous operation. The
+ primary way of interacting with a promise is through its `then` method, which
+ registers callbacks to receive either a promise’s eventual value or the reason
+ why the promise cannot be fulfilled.
+
+ Terminology
+ -----------
+
+ - `promise` is an object or function with a `then` method whose behavior conforms to this specification.
+ - `thenable` is an object or function that defines a `then` method.
+ - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).
+ - `exception` is a value that is thrown using the throw statement.
+ - `reason` is a value that indicates why a promise was rejected.
+ - `settled` the final resting state of a promise, fulfilled or rejected.
+
+ A promise can be in one of three states: pending, fulfilled, or rejected.
+
+ Promises that are fulfilled have a fulfillment value and are in the fulfilled
+ state. Promises that are rejected have a rejection reason and are in the
+ rejected state. A fulfillment value is never a thenable.
+
+ Promises can also be said to *resolve* a value. If this value is also a
+ promise, then the original promise's settled state will match the value's
+ settled state. So a promise that *resolves* a promise that rejects will
+ itself reject, and a promise that *resolves* a promise that fulfills will
+ itself fulfill.
+
+
+ Basic Usage:
+ ------------
+
+ ```js
+ let promise = new Promise(function(resolve, reject) {
+ // on success
+ resolve(value);
+
+ // on failure
+ reject(reason);
+ });
+
+ promise.then(function(value) {
+ // on fulfillment
+ }, function(reason) {
+ // on rejection
+ });
+ ```
+
+ Advanced Usage:
+ ---------------
+
+ Promises shine when abstracting away asynchronous interactions such as
+ `XMLHttpRequest`s.
+
+ ```js
+ function getJSON(url) {
+ return new Promise(function(resolve, reject){
+ let xhr = new XMLHttpRequest();
+
+ xhr.open('GET', url);
+ xhr.onreadystatechange = handler;
+ xhr.responseType = 'json';
+ xhr.setRequestHeader('Accept', 'application/json');
+ xhr.send();
+
+ function handler() {
+ if (this.readyState === this.DONE) {
+ if (this.status === 200) {
+ resolve(this.response);
+ } else {
+ reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));
+ }
+ }
+ };
+ });
+ }
+
+ getJSON('/posts.json').then(function(json) {
+ // on fulfillment
+ }, function(reason) {
+ // on rejection
+ });
+ ```
+
+ Unlike callbacks, promises are great composable primitives.
+
+ ```js
+ Promise.all([
+ getJSON('/posts'),
+ getJSON('/comments')
+ ]).then(function(values){
+ values[0] // => postsJSON
+ values[1] // => commentsJSON
+
+ return values;
+ });
+ ```
+
+ @class RSVP.Promise
+ @param {function} resolver
+ @param {String} label optional string for labeling the promise.
+ Useful for tooling.
+ @constructor
+ */
+
+ var Promise = function () {
+ function Promise(resolver, label) {
+ (0, _emberBabel.classCallCheck)(this, Promise);
+
+ this._id = counter++;
+ this._label = label;
+ this._state = undefined;
+ this._result = undefined;
+ this._subscribers = [];
+
+ config.instrument && instrument('created', this);
+
+ if (noop !== resolver) {
+ typeof resolver !== 'function' && needsResolver();
+ this instanceof Promise ? initializePromise(this, resolver) : needsNew();
+ }
+ }
+
+ Promise.prototype._onError = function _onError(reason) {
+ var _this2 = this;
+
+ config.after(function () {
+ if (_this2._onError) {
+ config.trigger('error', reason, _this2._label);
+ }
+ });
+ };
+
+ Promise.prototype.catch = function _catch(onRejection, label) {
+ return this.then(undefined, onRejection, label);
+ };
+
+ Promise.prototype.finally = function _finally(callback, label) {
+ var promise = this;
+ var constructor = promise.constructor;
+
+ return promise.then(function (value) {
+ return constructor.resolve(callback()).then(function () {
+ return value;
+ });
+ }, function (reason) {
+ return constructor.resolve(callback()).then(function () {
+ throw reason;
+ });
+ }, label);
+ };
+
+ return Promise;
+ }();
+
+ Promise.cast = resolve$1; // deprecated
+ Promise.all = all;
+ Promise.race = race;
+ Promise.resolve = resolve$1;
+ Promise.reject = reject$1;
+
+ Promise.prototype._guidKey = guidKey;
+
+ /**
+ The primary way of interacting with a promise is through its `then` method,
+ which registers callbacks to receive either a promise's eventual value or the
+ reason why the promise cannot be fulfilled.
+
+ ```js
+ findUser().then(function(user){
+ // user is available
+ }, function(reason){
+ // user is unavailable, and you are given the reason why
+ });
+ ```
+
+ Chaining
+ --------
+
+ The return value of `then` is itself a promise. This second, 'downstream'
+ promise is resolved with the return value of the first promise's fulfillment
+ or rejection handler, or rejected if the handler throws an exception.
+
+ ```js
+ findUser().then(function (user) {
+ return user.name;
+ }, function (reason) {
+ return 'default name';
+ }).then(function (userName) {
+ // If `findUser` fulfilled, `userName` will be the user's name, otherwise it
+ // will be `'default name'`
+ });
+
+ findUser().then(function (user) {
+ throw new Error('Found user, but still unhappy');
+ }, function (reason) {
+ throw new Error('`findUser` rejected and we\'re unhappy');
+ }).then(function (value) {
+ // never reached
+ }, function (reason) {
+ // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.
+ // If `findUser` rejected, `reason` will be '`findUser` rejected and we\'re unhappy'.
+ });
+ ```
+ If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.
+
+ ```js
+ findUser().then(function (user) {
+ throw new PedagogicalException('Upstream error');
+ }).then(function (value) {
+ // never reached
+ }).then(function (value) {
+ // never reached
+ }, function (reason) {
+ // The `PedgagocialException` is propagated all the way down to here
+ });
+ ```
+
+ Assimilation
+ ------------
+
+ Sometimes the value you want to propagate to a downstream promise can only be
+ retrieved asynchronously. This can be achieved by returning a promise in the
+ fulfillment or rejection handler. The downstream promise will then be pending
+ until the returned promise is settled. This is called *assimilation*.
+
+ ```js
+ findUser().then(function (user) {
+ return findCommentsByAuthor(user);
+ }).then(function (comments) {
+ // The user's comments are now available
+ });
+ ```
+
+ If the assimliated promise rejects, then the downstream promise will also reject.
+
+ ```js
+ findUser().then(function (user) {
+ return findCommentsByAuthor(user);
+ }).then(function (comments) {
+ // If `findCommentsByAuthor` fulfills, we'll have the value here
+ }, function (reason) {
+ // If `findCommentsByAuthor` rejects, we'll have the reason here
+ });
+ ```
+
+ Simple Example
+ --------------
+
+ Synchronous Example
+
+ ```javascript
+ let result;
+
+ try {
+ result = findResult();
+ // success
+ } catch(reason) {
+ // failure
+ }
+ ```
+
+ Errback Example
+
+ ```js
+ findResult(function(result, err){
+ if (err) {
+ // failure
+ } else {
+ // success
+ }
+ });
+ ```
+
+ Promise Example;
+
+ ```javascript
+ findResult().then(function(result){
+ // success
+ }, function(reason){
+ // failure
+ });
+ ```
+
+ Advanced Example
+ --------------
+
+ Synchronous Example
+
+ ```javascript
+ let author, books;
+
+ try {
+ author = findAuthor();
+ books = findBooksByAuthor(author);
+ // success
+ } catch(reason) {
+ // failure
+ }
+ ```
+
+ Errback Example
+
+ ```js
+
+ function foundBooks(books) {
+
+ }
+
+ function failure(reason) {
+
+ }
+
+ findAuthor(function(author, err){
+ if (err) {
+ failure(err);
+ // failure
+ } else {
+ try {
+ findBoooksByAuthor(author, function(books, err) {
+ if (err) {
+ failure(err);
+ } else {
+ try {
+ foundBooks(books);
+ } catch(reason) {
+ failure(reason);
+ }
+ }
+ });
+ } catch(error) {
+ failure(err);
+ }
+ // success
+ }
+ });
+ ```
+
+ Promise Example;
+
+ ```javascript
+ findAuthor().
+ then(findBooksByAuthor).
+ then(function(books){
+ // found books
+ }).catch(function(reason){
+ // something went wrong
+ });
+ ```
+
+ @method then
+ @param {Function} onFulfillment
+ @param {Function} onRejection
+ @param {String} label optional string for labeling the promise.
+ Useful for tooling.
+ @return {Promise}
+ */
+ Promise.prototype.then = then;
+
+ function Result() {
+ this.value = undefined;
+ }
+
+ var ERROR = new Result();
+ var GET_THEN_ERROR$1 = new Result();
+
+ function getThen$1(obj) {
+ try {
+ return obj.then;
+ } catch (error) {
+ ERROR.value = error;
+ return ERROR;
+ }
+ }
+
+ function tryApply(f, s, a) {
+ try {
+ f.apply(s, a);
+ } catch (error) {
+ ERROR.value = error;
+ return ERROR;
+ }
+ }
+
+ function makeObject(_, argumentNames) {
+ var obj = {};
+ var length = _.length;
+ var args = new Array(length);
+
+ for (var x = 0; x < length; x++) {
+ args[x] = _[x];
+ }
+
+ for (var i = 0; i < argumentNames.length; i++) {
+ var name = argumentNames[i];
+ obj[name] = args[i + 1];
+ }
+
+ return obj;
+ }
+
+ function arrayResult(_) {
+ var length = _.length;
+ var args = new Array(length - 1);
+
+ for (var i = 1; i < length; i++) {
+ args[i - 1] = _[i];
+ }
+
+ return args;
+ }
+
+ function wrapThenable(then, promise) {
+ return {
+ then: function (onFulFillment, onRejection) {
+ return then.call(promise, onFulFillment, onRejection);
+ }
+ };
+ }
+
+ /**
+ `RSVP.denodeify` takes a 'node-style' function and returns a function that
+ will return an `RSVP.Promise`. You can use `denodeify` in Node.js or the
+ browser when you'd prefer to use promises over using callbacks. For example,
+ `denodeify` transforms the following:
+
+ ```javascript
+ let fs = require('fs');
+
+ fs.readFile('myfile.txt', function(err, data){
+ if (err) return handleError(err);
+ handleData(data);
+ });
+ ```
+
+ into:
+
+ ```javascript
+ let fs = require('fs');
+ let readFile = RSVP.denodeify(fs.readFile);
+
+ readFile('myfile.txt').then(handleData, handleError);
+ ```
+
+ If the node function has multiple success parameters, then `denodeify`
+ just returns the first one:
+
+ ```javascript
+ let request = RSVP.denodeify(require('request'));
+
+ request('http://example.com').then(function(res) {
+ // ...
+ });
+ ```
+
+ However, if you need all success parameters, setting `denodeify`'s
+ second parameter to `true` causes it to return all success parameters
+ as an array:
+
+ ```javascript
+ let request = RSVP.denodeify(require('request'), true);
+
+ request('http://example.com').then(function(result) {
+ // result[0] -> res
+ // result[1] -> body
+ });
+ ```
+
+ Or if you pass it an array with names it returns the parameters as a hash:
+
+ ```javascript
+ let request = RSVP.denodeify(require('request'), ['res', 'body']);
+
+ request('http://example.com').then(function(result) {
+ // result.res
+ // result.body
+ });
+ ```
+
+ Sometimes you need to retain the `this`:
+
+ ```javascript
+ let app = require('express')();
+ let render = RSVP.denodeify(app.render.bind(app));
+ ```
+
+ The denodified function inherits from the original function. It works in all
+ environments, except IE 10 and below. Consequently all properties of the original
+ function are available to you. However, any properties you change on the
+ denodeified function won't be changed on the original function. Example:
+
+ ```javascript
+ let request = RSVP.denodeify(require('request')),
+ cookieJar = request.jar(); // <- Inheritance is used here
+
+ request('http://example.com', {jar: cookieJar}).then(function(res) {
+ // cookieJar.cookies holds now the cookies returned by example.com
+ });
+ ```
+
+ Using `denodeify` makes it easier to compose asynchronous operations instead
+ of using callbacks. For example, instead of:
+
+ ```javascript
+ let fs = require('fs');
+
+ fs.readFile('myfile.txt', function(err, data){
+ if (err) { ... } // Handle error
+ fs.writeFile('myfile2.txt', data, function(err){
+ if (err) { ... } // Handle error
+ console.log('done')
+ });
+ });
+ ```
+
+ you can chain the operations together using `then` from the returned promise:
+
+ ```javascript
+ let fs = require('fs');
+ let readFile = RSVP.denodeify(fs.readFile);
+ let writeFile = RSVP.denodeify(fs.writeFile);
+
+ readFile('myfile.txt').then(function(data){
+ return writeFile('myfile2.txt', data);
+ }).then(function(){
+ console.log('done')
+ }).catch(function(error){
+ // Handle error
+ });
+ ```
+
+ @method denodeify
+ @static
+ @for RSVP
+ @param {Function} nodeFunc a 'node-style' function that takes a callback as
+ its last argument. The callback expects an error to be passed as its first
+ argument (if an error occurred, otherwise null), and the value from the
+ operation as its second argument ('function(err, value){ }').
+ @param {Boolean|Array} [options] An optional paramter that if set
+ to `true` causes the promise to fulfill with the callback's success arguments
+ as an array. This is useful if the node function has multiple success
+ paramters. If you set this paramter to an array with names, the promise will
+ fulfill with a hash with these names as keys and the success parameters as
+ values.
+ @return {Function} a function that wraps `nodeFunc` to return an
+ `RSVP.Promise`
+ @static
+ */
+ function denodeify(nodeFunc, options) {
+ var fn = function () {
+ var self = this;
+ var l = arguments.length;
+ var args = new Array(l + 1);
+ var promiseInput = false;
+
+ for (var i = 0; i < l; ++i) {
+ var arg = arguments[i];
+
+ if (!promiseInput) {
+ // TODO: clean this up
+ promiseInput = needsPromiseInput(arg);
+ if (promiseInput === GET_THEN_ERROR$1) {
+ var p = new Promise(noop);
+ reject(p, GET_THEN_ERROR$1.value);
+ return p;
+ } else if (promiseInput && promiseInput !== true) {
+ arg = wrapThenable(promiseInput, arg);
+ }
+ }
+ args[i] = arg;
+ }
+
+ var promise = new Promise(noop);
+
+ args[l] = function (err, val) {
+ if (err) reject(promise, err);else if (options === undefined) resolve(promise, val);else if (options === true) resolve(promise, arrayResult(arguments));else if (Array.isArray(options)) resolve(promise, makeObject(arguments, options));else resolve(promise, val);
+ };
+
+ if (promiseInput) {
+ return handlePromiseInput(promise, args, nodeFunc, self);
+ } else {
+ return handleValueInput(promise, args, nodeFunc, self);
+ }
+ };
+
+ (0, _emberBabel.defaults)(fn, nodeFunc);
+
+
+ return fn;
+ }
+
+ function handleValueInput(promise, args, nodeFunc, self) {
+ var result = tryApply(nodeFunc, self, args);
+ if (result === ERROR) {
+ reject(promise, result.value);
+ }
+ return promise;
+ }
+
+ function handlePromiseInput(promise, args, nodeFunc, self) {
+ return Promise.all(args).then(function (args) {
+ var result = tryApply(nodeFunc, self, args);
+ if (result === ERROR) {
+ reject(promise, result.value);
+ }
+ return promise;
+ });
+ }
+
+ function needsPromiseInput(arg) {
+ if (arg && typeof arg === 'object') {
+ if (arg.constructor === Promise) {
+ return true;
+ } else {
+ return getThen$1(arg);
+ }
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ This is a convenient alias for `RSVP.Promise.all`.
+
+ @method all
+ @static
+ @for RSVP
+ @param {Array} array Array of promises.
+ @param {String} label An optional label. This is useful
+ for tooling.
+ */
+ function all$1(array, label) {
+ return Promise.all(array, label);
+ }
+
+ var AllSettled = function (_Enumerator) {
+ (0, _emberBabel.inherits)(AllSettled, _Enumerator);
+
+ function AllSettled(Constructor, entries, label) {
+ (0, _emberBabel.classCallCheck)(this, AllSettled);
+ return (0, _emberBabel.possibleConstructorReturn)(this, _Enumerator.call(this, Constructor, entries, false /* don't abort on reject */, label));
+ }
+
+ return AllSettled;
+ }(Enumerator);
+
+ AllSettled.prototype._setResultAt = setSettledResult;
+
+ /**
+ `RSVP.allSettled` is similar to `RSVP.all`, but instead of implementing
+ a fail-fast method, it waits until all the promises have returned and
+ shows you all the results. This is useful if you want to handle multiple
+ promises' failure states together as a set.
+ Returns a promise that is fulfilled when all the given promises have been
+ settled. The return promise is fulfilled with an array of the states of
+ the promises passed into the `promises` array argument.
+ Each state object will either indicate fulfillment or rejection, and
+ provide the corresponding value or reason. The states will take one of
+ the following formats:
+ ```javascript
+ { state: 'fulfilled', value: value }
+ or
+ { state: 'rejected', reason: reason }
+ ```
+ Example:
+ ```javascript
+ let promise1 = RSVP.Promise.resolve(1);
+ let promise2 = RSVP.Promise.reject(new Error('2'));
+ let promise3 = RSVP.Promise.reject(new Error('3'));
+ let promises = [ promise1, promise2, promise3 ];
+ RSVP.allSettled(promises).then(function(array){
+ // array == [
+ // { state: 'fulfilled', value: 1 },
+ // { state: 'rejected', reason: Error },
+ // { state: 'rejected', reason: Error }
+ // ]
+ // Note that for the second item, reason.message will be '2', and for the
+ // third item, reason.message will be '3'.
+ }, function(error) {
+ // Not run. (This block would only be called if allSettled had failed,
+ // for instance if passed an incorrect argument type.)
+ });
+ ```
+ @method allSettled
+ @static
+ @for RSVP
+ @param {Array} entries
+ @param {String} label - optional string that describes the promise.
+ Useful for tooling.
+ @return {Promise} promise that is fulfilled with an array of the settled
+ states of the constituent promises.
+ */
+
+ function allSettled(entries, label) {
+ if (!Array.isArray(entries)) {
+ return Promise.reject(new TypeError("Promise.allSettled must be called with an array"), label);
+ }
+
+ return new AllSettled(Promise, entries, label).promise;
+ }
+
+ /**
+ This is a convenient alias for `RSVP.Promise.race`.
+
+ @method race
+ @static
+ @for RSVP
+ @param {Array} array Array of promises.
+ @param {String} label An optional label. This is useful
+ for tooling.
+ */
+ function race$1(array, label) {
+ return Promise.race(array, label);
+ }
+
+ var hasOwnProperty = Object.prototype.hasOwnProperty;
+
+ var PromiseHash = function (_Enumerator2) {
+ (0, _emberBabel.inherits)(PromiseHash, _Enumerator2);
+
+ function PromiseHash(Constructor, object) {
+ var abortOnReject = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
+ var label = arguments[3];
+ (0, _emberBabel.classCallCheck)(this, PromiseHash);
+ return (0, _emberBabel.possibleConstructorReturn)(this, _Enumerator2.call(this, Constructor, object, abortOnReject, label));
+ }
+
+ PromiseHash.prototype._init = function _init(Constructor, object) {
+ this._result = {};
+
+ this._enumerate(object);
+ if (this._remaining === 0) {
+ fulfill(this.promise, this._result);
+ }
+ };
+
+ PromiseHash.prototype._enumerate = function _enumerate(input) {
+ var promise = this.promise;
+ var results = [];
+
+ for (var key in input) {
+ if (hasOwnProperty.call(input, key)) {
+ results.push({
+ position: key,
+ entry: input[key]
+ });
+ }
+ }
+
+ var length = results.length;
+ this._remaining = length;
+ var result = void 0;
+
+ for (var i = 0; promise._state === PENDING && i < length; i++) {
+ result = results[i];
+ this._eachEntry(result.entry, result.position);
+ }
+ };
+
+ return PromiseHash;
+ }(Enumerator);
+
+ /**
+ `RSVP.hash` is similar to `RSVP.all`, but takes an object instead of an array
+ for its `promises` argument.
+
+ Returns a promise that is fulfilled when all the given promises have been
+ fulfilled, or rejected if any of them become rejected. The returned promise
+ is fulfilled with a hash that has the same key names as the `promises` object
+ argument. If any of the values in the object are not promises, they will
+ simply be copied over to the fulfilled object.
+
+ Example:
+
+ ```javascript
+ let promises = {
+ myPromise: RSVP.resolve(1),
+ yourPromise: RSVP.resolve(2),
+ theirPromise: RSVP.resolve(3),
+ notAPromise: 4
+ };
+
+ RSVP.hash(promises).then(function(hash){
+ // hash here is an object that looks like:
+ // {
+ // myPromise: 1,
+ // yourPromise: 2,
+ // theirPromise: 3,
+ // notAPromise: 4
+ // }
+ });
+ ````
+
+ If any of the `promises` given to `RSVP.hash` are rejected, the first promise
+ that is rejected will be given as the reason to the rejection handler.
+
+ Example:
+
+ ```javascript
+ let promises = {
+ myPromise: RSVP.resolve(1),
+ rejectedPromise: RSVP.reject(new Error('rejectedPromise')),
+ anotherRejectedPromise: RSVP.reject(new Error('anotherRejectedPromise')),
+ };
+
+ RSVP.hash(promises).then(function(hash){
+ // Code here never runs because there are rejected promises!
+ }, function(reason) {
+ // reason.message === 'rejectedPromise'
+ });
+ ```
+
+ An important note: `RSVP.hash` is intended for plain JavaScript objects that
+ are just a set of keys and values. `RSVP.hash` will NOT preserve prototype
+ chains.
+
+ Example:
+
+ ```javascript
+ function MyConstructor(){
+ this.example = RSVP.resolve('Example');
+ }
+
+ MyConstructor.prototype = {
+ protoProperty: RSVP.resolve('Proto Property')
+ };
+
+ let myObject = new MyConstructor();
+
+ RSVP.hash(myObject).then(function(hash){
+ // protoProperty will not be present, instead you will just have an
+ // object that looks like:
+ // {
+ // example: 'Example'
+ // }
+ //
+ // hash.hasOwnProperty('protoProperty'); // false
+ // 'undefined' === typeof hash.protoProperty
+ });
+ ```
+
+ @method hash
+ @static
+ @for RSVP
+ @param {Object} object
+ @param {String} label optional string that describes the promise.
+ Useful for tooling.
+ @return {Promise} promise that is fulfilled when all properties of `promises`
+ have been fulfilled, or rejected if any of them become rejected.
+ */
+ function hash(object, label) {
+ if (object === null || typeof object !== 'object') {
+ return Promise.reject(new TypeError("Promise.hash must be called with an object"), label);
+ }
+
+ return new PromiseHash(Promise, object, label).promise;
+ }
+
+ var HashSettled = function (_PromiseHash) {
+ (0, _emberBabel.inherits)(HashSettled, _PromiseHash);
+
+ function HashSettled(Constructor, object, label) {
+ (0, _emberBabel.classCallCheck)(this, HashSettled);
+ return (0, _emberBabel.possibleConstructorReturn)(this, _PromiseHash.call(this, Constructor, object, false, label));
+ }
+
+ return HashSettled;
+ }(PromiseHash);
+
+ HashSettled.prototype._setResultAt = setSettledResult;
+
+ /**
+ `RSVP.hashSettled` is similar to `RSVP.allSettled`, but takes an object
+ instead of an array for its `promises` argument.
+
+ Unlike `RSVP.all` or `RSVP.hash`, which implement a fail-fast method,
+ but like `RSVP.allSettled`, `hashSettled` waits until all the
+ constituent promises have returned and then shows you all the results
+ with their states and values/reasons. This is useful if you want to
+ handle multiple promises' failure states together as a set.
+
+ Returns a promise that is fulfilled when all the given promises have been
+ settled, or rejected if the passed parameters are invalid.
+
+ The returned promise is fulfilled with a hash that has the same key names as
+ the `promises` object argument. If any of the values in the object are not
+ promises, they will be copied over to the fulfilled object and marked with state
+ 'fulfilled'.
+
+ Example:
+
+ ```javascript
+ let promises = {
+ myPromise: RSVP.Promise.resolve(1),
+ yourPromise: RSVP.Promise.resolve(2),
+ theirPromise: RSVP.Promise.resolve(3),
+ notAPromise: 4
+ };
+
+ RSVP.hashSettled(promises).then(function(hash){
+ // hash here is an object that looks like:
+ // {
+ // myPromise: { state: 'fulfilled', value: 1 },
+ // yourPromise: { state: 'fulfilled', value: 2 },
+ // theirPromise: { state: 'fulfilled', value: 3 },
+ // notAPromise: { state: 'fulfilled', value: 4 }
+ // }
+ });
+ ```
+
+ If any of the `promises` given to `RSVP.hash` are rejected, the state will
+ be set to 'rejected' and the reason for rejection provided.
+
+ Example:
+
+ ```javascript
+ let promises = {
+ myPromise: RSVP.Promise.resolve(1),
+ rejectedPromise: RSVP.Promise.reject(new Error('rejection')),
+ anotherRejectedPromise: RSVP.Promise.reject(new Error('more rejection')),
+ };
+
+ RSVP.hashSettled(promises).then(function(hash){
+ // hash here is an object that looks like:
+ // {
+ // myPromise: { state: 'fulfilled', value: 1 },
+ // rejectedPromise: { state: 'rejected', reason: Error },
+ // anotherRejectedPromise: { state: 'rejected', reason: Error },
+ // }
+ // Note that for rejectedPromise, reason.message == 'rejection',
+ // and for anotherRejectedPromise, reason.message == 'more rejection'.
+ });
+ ```
+
+ An important note: `RSVP.hashSettled` is intended for plain JavaScript objects that
+ are just a set of keys and values. `RSVP.hashSettled` will NOT preserve prototype
+ chains.
+
+ Example:
+
+ ```javascript
+ function MyConstructor(){
+ this.example = RSVP.Promise.resolve('Example');
+ }
+
+ MyConstructor.prototype = {
+ protoProperty: RSVP.Promise.resolve('Proto Property')
+ };
+
+ let myObject = new MyConstructor();
+
+ RSVP.hashSettled(myObject).then(function(hash){
+ // protoProperty will not be present, instead you will just have an
+ // object that looks like:
+ // {
+ // example: { state: 'fulfilled', value: 'Example' }
+ // }
+ //
+ // hash.hasOwnProperty('protoProperty'); // false
+ // 'undefined' === typeof hash.protoProperty
+ });
+ ```
+
+ @method hashSettled
+ @for RSVP
+ @param {Object} object
+ @param {String} label optional string that describes the promise.
+ Useful for tooling.
+ @return {Promise} promise that is fulfilled when when all properties of `promises`
+ have been settled.
+ @static
+ */
+
+ function hashSettled(object, label) {
+ if (object === null || typeof object !== 'object') {
+ return Promise.reject(new TypeError("RSVP.hashSettled must be called with an object"), label);
+ }
+
+ return new HashSettled(Promise, object, false, label).promise;
+ }
+
+ /**
+ `RSVP.rethrow` will rethrow an error on the next turn of the JavaScript event
+ loop in order to aid debugging.
+
+ Promises A+ specifies that any exceptions that occur with a promise must be
+ caught by the promises implementation and bubbled to the last handler. For
+ this reason, it is recommended that you always specify a second rejection
+ handler function to `then`. However, `RSVP.rethrow` will throw the exception
+ outside of the promise, so it bubbles up to your console if in the browser,
+ or domain/cause uncaught exception in Node. `rethrow` will also throw the
+ error again so the error can be handled by the promise per the spec.
+
+ ```javascript
+ function throws(){
+ throw new Error('Whoops!');
+ }
+
+ let promise = new RSVP.Promise(function(resolve, reject){
+ throws();
+ });
+
+ promise.catch(RSVP.rethrow).then(function(){
+ // Code here doesn't run because the promise became rejected due to an
+ // error!
+ }, function (err){
+ // handle the error here
+ });
+ ```
+
+ The 'Whoops' error will be thrown on the next turn of the event loop
+ and you can watch for it in your console. You can also handle it using a
+ rejection handler given to `.then` or `.catch` on the returned promise.
+
+ @method rethrow
+ @static
+ @for RSVP
+ @param {Error} reason reason the promise became rejected.
+ @throws Error
+ @static
+ */
+ function rethrow(reason) {
+ setTimeout(function () {
+ throw reason;
+ });
+ throw reason;
+ }
+
+ /**
+ `RSVP.defer` returns an object similar to jQuery's `$.Deferred`.
+ `RSVP.defer` should be used when porting over code reliant on `$.Deferred`'s
+ interface. New code should use the `RSVP.Promise` constructor instead.
+
+ The object returned from `RSVP.defer` is a plain object with three properties:
+
+ * promise - an `RSVP.Promise`.
+ * reject - a function that causes the `promise` property on this object to
+ become rejected
+ * resolve - a function that causes the `promise` property on this object to
+ become fulfilled.
+
+ Example:
+
+ ```javascript
+ let deferred = RSVP.defer();
+
+ deferred.resolve("Success!");
+
+ deferred.promise.then(function(value){
+ // value here is "Success!"
+ });
+ ```
+
+ @method defer
+ @static
+ @for RSVP
+ @param {String} label optional string for labeling the promise.
+ Useful for tooling.
+ @return {Object}
+ */
+
+ function defer(label) {
+ var deferred = { resolve: undefined, reject: undefined };
+
+ deferred.promise = new Promise(function (resolve, reject) {
+ deferred.resolve = resolve;
+ deferred.reject = reject;
+ }, label);
+
+ return deferred;
+ }
+
+ var MapEnumerator = function (_Enumerator3) {
+ (0, _emberBabel.inherits)(MapEnumerator, _Enumerator3);
+
+ function MapEnumerator(Constructor, entries, mapFn, label) {
+ (0, _emberBabel.classCallCheck)(this, MapEnumerator);
+ return (0, _emberBabel.possibleConstructorReturn)(this, _Enumerator3.call(this, Constructor, entries, true, label, mapFn));
+ }
+
+ MapEnumerator.prototype._init = function _init(Constructor, input, bool, label, mapFn) {
+ var len = input.length || 0;
+ this.length = len;
+ this._remaining = len;
+ this._result = new Array(len);
+ this._mapFn = mapFn;
+
+ this._enumerate(input);
+ };
+
+ MapEnumerator.prototype._setResultAt = function _setResultAt(state, i, value, firstPass) {
+ if (firstPass) {
+ var val = tryCatch(this._mapFn)(value, i);
+ if (val === TRY_CATCH_ERROR) {
+ this._settledAt(REJECTED, i, val.error, false);
+ } else {
+ this._eachEntry(val, i, false);
+ }
+ } else {
+ this._remaining--;
+ this._result[i] = value;
+ }
+ };
+
+ return MapEnumerator;
+ }(Enumerator);
+
+ /**
+ `RSVP.map` is similar to JavaScript's native `map` method. `mapFn` is eagerly called
+ meaning that as soon as any promise resolves its value will be passed to `mapFn`.
+ `RSVP.map` returns a promise that will become fulfilled with the result of running
+ `mapFn` on the values the promises become fulfilled with.
+
+ For example:
+
+ ```javascript
+
+ let promise1 = RSVP.resolve(1);
+ let promise2 = RSVP.resolve(2);
+ let promise3 = RSVP.resolve(3);
+ let promises = [ promise1, promise2, promise3 ];
+
+ let mapFn = function(item){
+ return item + 1;
+ };
+
+ RSVP.map(promises, mapFn).then(function(result){
+ // result is [ 2, 3, 4 ]
+ });
+ ```
+
+ If any of the `promises` given to `RSVP.map` are rejected, the first promise
+ that is rejected will be given as an argument to the returned promise's
+ rejection handler. For example:
+
+ ```javascript
+ let promise1 = RSVP.resolve(1);
+ let promise2 = RSVP.reject(new Error('2'));
+ let promise3 = RSVP.reject(new Error('3'));
+ let promises = [ promise1, promise2, promise3 ];
+
+ let mapFn = function(item){
+ return item + 1;
+ };
+
+ RSVP.map(promises, mapFn).then(function(array){
+ // Code here never runs because there are rejected promises!
+ }, function(reason) {
+ // reason.message === '2'
+ });
+ ```
+
+ `RSVP.map` will also wait if a promise is returned from `mapFn`. For example,
+ say you want to get all comments from a set of blog posts, but you need
+ the blog posts first because they contain a url to those comments.
+
+ ```javscript
+
+ let mapFn = function(blogPost){
+ // getComments does some ajax and returns an RSVP.Promise that is fulfilled
+ // with some comments data
+ return getComments(blogPost.comments_url);
+ };
+
+ // getBlogPosts does some ajax and returns an RSVP.Promise that is fulfilled
+ // with some blog post data
+ RSVP.map(getBlogPosts(), mapFn).then(function(comments){
+ // comments is the result of asking the server for the comments
+ // of all blog posts returned from getBlogPosts()
+ });
+ ```
+
+ @method map
+ @static
+ @for RSVP
+ @param {Array} promises
+ @param {Function} mapFn function to be called on each fulfilled promise.
+ @param {String} label optional string for labeling the promise.
+ Useful for tooling.
+ @return {Promise} promise that is fulfilled with the result of calling
+ `mapFn` on each fulfilled promise or value when they become fulfilled.
+ The promise will be rejected if any of the given `promises` become rejected.
+ @static
+ */
+ function map(promises, mapFn, label) {
+ if (!Array.isArray(promises)) {
+ return Promise.reject(new TypeError("RSVP.map must be called with an array"), label);
+ }
+
+ if (typeof mapFn !== 'function') {
+ return Promise.reject(new TypeError("RSVP.map expects a function as a second argument"), label);
+ }
+
+ return new MapEnumerator(Promise, promises, mapFn, label).promise;
+ }
+
+ /**
+ This is a convenient alias for `RSVP.Promise.resolve`.
+
+ @method resolve
+ @static
+ @for RSVP
+ @param {*} value value that the returned promise will be resolved with
+ @param {String} label optional string for identifying the returned promise.
+ Useful for tooling.
+ @return {Promise} a promise that will become fulfilled with the given
+ `value`
+ */
+ function resolve$2(value, label) {
+ return Promise.resolve(value, label);
+ }
+
+ /**
+ This is a convenient alias for `RSVP.Promise.reject`.
+
+ @method reject
+ @static
+ @for RSVP
+ @param {*} reason value that the returned promise will be rejected with.
+ @param {String} label optional string for identifying the returned promise.
+ Useful for tooling.
+ @return {Promise} a promise rejected with the given `reason`.
+ */
+ function reject$2(reason, label) {
+ return Promise.reject(reason, label);
+ }
+
+ var EMPTY_OBJECT = {};
+
+ var FilterEnumerator = function (_Enumerator4) {
+ (0, _emberBabel.inherits)(FilterEnumerator, _Enumerator4);
+
+ function FilterEnumerator(Constructor, entries, filterFn, label) {
+ (0, _emberBabel.classCallCheck)(this, FilterEnumerator);
+ return (0, _emberBabel.possibleConstructorReturn)(this, _Enumerator4.call(this, Constructor, entries, true, label, filterFn));
+ }
+
+ FilterEnumerator.prototype._init = function _init(Constructor, input, bool, label, filterFn) {
+ var len = input.length || 0;
+ this.length = len;
+ this._remaining = len;
+
+ this._result = new Array(len);
+ this._filterFn = filterFn;
+
+ this._enumerate(input);
+ };
+
+ FilterEnumerator.prototype._checkFullfillment = function _checkFullfillment() {
+ if (this._remaining === 0) {
+ this._result = this._result.filter(function (val) {
+ return val !== EMPTY_OBJECT;
+ });
+ fulfill(this.promise, this._result);
+ }
+ };
+
+ FilterEnumerator.prototype._setResultAt = function _setResultAt(state, i, value, firstPass) {
+ if (firstPass) {
+ this._result[i] = value;
+ var val = tryCatch(this._filterFn)(value, i);
+ if (val === TRY_CATCH_ERROR) {
+ this._settledAt(REJECTED, i, val.error, false);
+ } else {
+ this._eachEntry(val, i, false);
+ }
+ } else {
+ this._remaining--;
+ if (!value) {
+ this._result[i] = EMPTY_OBJECT;
+ }
+ }
+ };
+
+ return FilterEnumerator;
+ }(Enumerator);
+
+ /**
+ `RSVP.filter` is similar to JavaScript's native `filter` method.
+ `filterFn` is eagerly called meaning that as soon as any promise
+ resolves its value will be passed to `filterFn`. `RSVP.filter` returns
+ a promise that will become fulfilled with the result of running
+ `filterFn` on the values the promises become fulfilled with.
+
+ For example:
+
+ ```javascript
+
+ let promise1 = RSVP.resolve(1);
+ let promise2 = RSVP.resolve(2);
+ let promise3 = RSVP.resolve(3);
+
+ let promises = [promise1, promise2, promise3];
+
+ let filterFn = function(item){
+ return item > 1;
+ };
+
+ RSVP.filter(promises, filterFn).then(function(result){
+ // result is [ 2, 3 ]
+ });
+ ```
+
+ If any of the `promises` given to `RSVP.filter` are rejected, the first promise
+ that is rejected will be given as an argument to the returned promise's
+ rejection handler. For example:
+
+ ```javascript
+ let promise1 = RSVP.resolve(1);
+ let promise2 = RSVP.reject(new Error('2'));
+ let promise3 = RSVP.reject(new Error('3'));
+ let promises = [ promise1, promise2, promise3 ];
+
+ let filterFn = function(item){
+ return item > 1;
+ };
+
+ RSVP.filter(promises, filterFn).then(function(array){
+ // Code here never runs because there are rejected promises!
+ }, function(reason) {
+ // reason.message === '2'
+ });
+ ```
+
+ `RSVP.filter` will also wait for any promises returned from `filterFn`.
+ For instance, you may want to fetch a list of users then return a subset
+ of those users based on some asynchronous operation:
+
+ ```javascript
+
+ let alice = { name: 'alice' };
+ let bob = { name: 'bob' };
+ let users = [ alice, bob ];
+
+ let promises = users.map(function(user){
+ return RSVP.resolve(user);
+ });
+
+ let filterFn = function(user){
+ // Here, Alice has permissions to create a blog post, but Bob does not.
+ return getPrivilegesForUser(user).then(function(privs){
+ return privs.can_create_blog_post === true;
+ });
+ };
+ RSVP.filter(promises, filterFn).then(function(users){
+ // true, because the server told us only Alice can create a blog post.
+ users.length === 1;
+ // false, because Alice is the only user present in `users`
+ users[0] === bob;
+ });
+ ```
+
+ @method filter
+ @static
+ @for RSVP
+ @param {Array} promises
+ @param {Function} filterFn - function to be called on each resolved value to
+ filter the final results.
+ @param {String} label optional string describing the promise. Useful for
+ tooling.
+ @return {Promise}
+ */
+
+ function filter(promises, filterFn, label) {
+ if (!Array.isArray(promises) && !(promises !== null && typeof promises === 'object' && promises.then !== undefined)) {
+ return Promise.reject(new TypeError("RSVP.filter must be called with an array or promise"), label);
+ }
+
+ if (typeof filterFn !== 'function') {
+ return Promise.reject(new TypeError("RSVP.filter expects function as a second argument"), label);
+ }
+
+ return Promise.resolve(promises, label).then(function (promises) {
+ return new FilterEnumerator(Promise, promises, filterFn, label).promise;
+ });
+ }
+
+ var len = 0;
+ var vertxNext = void 0;
+ function asap(callback, arg) {
+ queue$1[len] = callback;
+ queue$1[len + 1] = arg;
+ len += 2;
+ if (len === 2) {
+ // If len is 1, that means that we need to schedule an async flush.
+ // If additional callbacks are queued before the queue is flushed, they
+ // will be processed by this flush that we are scheduling.
+ scheduleFlush$1();
+ }
+ }
+
+ var browserWindow = typeof window !== 'undefined' ? window : undefined;
+ var browserGlobal = browserWindow || {};
+ var BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;
+ var isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';
+
+ // test for web worker but not in IE10
+ var isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';
+
+ // node
+ function useNextTick() {
+ var nextTick = process.nextTick;
+ // node version 0.10.x displays a deprecation warning when nextTick is used recursively
+ // setImmediate should be used instead instead
+ var version = process.versions.node.match(/^(?:(\d+)\.)?(?:(\d+)\.)?(\*|\d+)$/);
+ if (Array.isArray(version) && version[1] === '0' && version[2] === '10') {
+ nextTick = setImmediate;
+ }
+ return function () {
+ return nextTick(flush);
+ };
+ }
+
+ // vertx
+ function useVertxTimer() {
+ if (typeof vertxNext !== 'undefined') {
+ return function () {
+ vertxNext(flush);
+ };
+ }
+ return useSetTimeout();
+ }
+
+ function useMutationObserver() {
+ var iterations = 0;
+ var observer = new BrowserMutationObserver(flush);
+ var node = document.createTextNode('');
+ observer.observe(node, { characterData: true });
+
+ return function () {
+ return node.data = iterations = ++iterations % 2;
+ };
+ }
+
+ // web worker
+ function useMessageChannel() {
+ var channel = new MessageChannel();
+ channel.port1.onmessage = flush;
+ return function () {
+ return channel.port2.postMessage(0);
+ };
+ }
+
+ function useSetTimeout() {
+ return function () {
+ return setTimeout(flush, 1);
+ };
+ }
+
+ var queue$1 = new Array(1000);
+
+ function flush() {
+ for (var i = 0; i < len; i += 2) {
+ var callback = queue$1[i];
+ var arg = queue$1[i + 1];
+
+ callback(arg);
+
+ queue$1[i] = undefined;
+ queue$1[i + 1] = undefined;
+ }
+
+ len = 0;
+ }
+
+ function attemptVertex() {
+ try {
+ var r = _nodeModule.require;
+ var vertx = r('vertx');
+ vertxNext = vertx.runOnLoop || vertx.runOnContext;
+ return useVertxTimer();
+ } catch (e) {
+ return useSetTimeout();
+ }
+ }
+
+ var scheduleFlush$1 = void 0;
+ // Decide what async method to use to triggering processing of queued callbacks:
+ if (isNode) {
+ scheduleFlush$1 = useNextTick();
+ } else if (BrowserMutationObserver) {
+ scheduleFlush$1 = useMutationObserver();
+ } else if (isWorker) {
+ scheduleFlush$1 = useMessageChannel();
+ } else if (browserWindow === undefined && typeof _nodeModule.require === 'function') {
+ scheduleFlush$1 = attemptVertex();
+ } else {
+ scheduleFlush$1 = useSetTimeout();
+ }
+
+ /* global self */
+ if (typeof self === 'object') {
+
+ /* global global */
+ } else if (typeof global === 'object') {} else {
+ throw new Error('no global: `self` or `global` found');
+ }
+
+ // defaults
+ config.async = asap;
+ config.after = function (cb) {
+ return setTimeout(cb, 0);
+ };
+ var cast = resolve$2;
+
+ var async = function (callback, arg) {
+ return config.async(callback, arg);
+ };
+
+ function on() {
+ config['on'].apply(config, arguments);
+ }
+
+ function off() {
+ config['off'].apply(config, arguments);
+ }
+
+ // Set up instrumentation through `window.__PROMISE_INTRUMENTATION__`
+ if (typeof window !== 'undefined' && typeof window['__PROMISE_INSTRUMENTATION__'] === 'object') {
+ var callbacks = window['__PROMISE_INSTRUMENTATION__'];
+ configure('instrument', true);
+ for (var eventName in callbacks) {
+ if (callbacks.hasOwnProperty(eventName)) {
+ on(eventName, callbacks[eventName]);
+ }
+ }
+ }
+
+ // the default export here is for backwards compat:
+ // https://github.com/tildeio/rsvp.js/issues/434
+ var rsvp = (_rsvp = {
+ asap: asap,
+ cast: cast,
+ Promise: Promise,
+ EventTarget: EventTarget,
+ all: all$1,
+ allSettled: allSettled,
+ race: race$1,
+ hash: hash,
+ hashSettled: hashSettled,
+ rethrow: rethrow,
+ defer: defer,
+ denodeify: denodeify,
+ configure: configure,
+ on: on,
+ off: off,
+ resolve: resolve$2,
+ reject: reject$2,
+ map: map
+ }, _rsvp['async'] = async, _rsvp.filter = filter, _rsvp);
+
+ exports.asap = asap;
+ exports.cast = cast;
+ exports.Promise = Promise;
+ exports.EventTarget = EventTarget;
+ exports.all = all$1;
+ exports.allSettled = allSettled;
+ exports.race = race$1;
+ exports.hash = hash;
+ exports.hashSettled = hashSettled;
+ exports.rethrow = rethrow;
+ exports.defer = defer;
+ exports.denodeify = denodeify;
+ exports.configure = configure;
+ exports.on = on;
+ exports.off = off;
+ exports.resolve = resolve$2;
+ exports.reject = reject$2;
+ exports.map = map;
+ exports.async = async;
+ exports.filter = filter;
+ exports.default = rsvp;
+});
+requireModule('ember')
+
+}());
+
+;(function() {
+ define('ember-cli-shims/deprecations', [], function() {
+ var values = {"ember-application":{"default":["@ember/application"]},"ember-array":{"default":["@ember/array"]},"ember-array/mutable":{"default":["@ember/array/mutable"]},"ember-array/utils":{"A":["@ember/array","A"],"isEmberArray":["@ember/array","isArray"],"wrap":["@ember/array","makeArray"]},"ember-component":{"default":["@ember/component"]},"ember-components/checkbox":{"default":["@ember/component/checkbox"]},"ember-components/text-area":{"default":["@ember/component/text-area"]},"ember-components/text-field":{"default":["@ember/component/text-field"]},"ember-controller":{"default":["@ember/controller"]},"ember-controller/inject":{"default":["@ember/controller","inject"]},"ember-controller/proxy":{"default":["@ember/array/proxy"]},"ember-debug":{"log":["@ember/debug","debug"],"inspect":["@ember/debug","inspect"],"run":["@ember/debug","runInDebug"],"warn":["@ember/debug","warn"]},"ember-debug/container-debug-adapter":{"default":["@ember/debug/container-debug-adapter"]},"ember-debug/data-adapter":{"default":["@ember/debug/data-adapter"]},"ember-deprecations":{"deprecate":["@ember/application/deprecations","deprecate"],"deprecateFunc":["@ember/application/deprecations","deprecateFunc"]},"ember-enumerable":{"default":["@ember/enumerable"]},"ember-evented":{"default":["@ember/object/evented"]},"ember-evented/on":{"default":["@ember/object/evented","on"]},"ember-globals-resolver":{"default":["@ember/application/globals-resolver"]},"ember-helper":{"default":["@ember/component/helper"],"helper":["@ember/component/helper","helper"]},"ember-instrumentation":{"instrument":["@ember/instrumentation","instrument"],"reset":["@ember/instrumentation","reset"],"subscribe":["@ember/instrumentation","subscribe"],"unsubscribe":["@ember/instrumentation","unsubscribe"]},"ember-locations/hash":{"default":["@ember/routing/hash-location"]},"ember-locations/history":{"default":["@ember/routing/history-location"]},"ember-locations/none":{"default":["@ember/routing/none-location"]},"ember-map":{"default":["@ember/map"],"withDefault":["@ember/map/with-default"]},"ember-metal/events":{"addListener":["@ember/object/events","addListener"],"removeListener":["@ember/object/events","removeListener"],"send":["@ember/object/events","sendEvent"]},"ember-metal/get":{"default":["@ember/object","get"],"getProperties":["@ember/object","getProperties"]},"ember-metal/mixin":{"default":["@ember/object/mixin"]},"ember-metal/observer":{"default":["@ember/object","observer"],"addObserver":["@ember/object/observers","addObserver"],"removeObserver":["@ember/object/observers","removeObserver"]},"ember-metal/on-load":{"default":["@ember/application","onLoad"],"run":["@ember/application","runLoadHooks"]},"ember-metal/set":{"default":["@ember/object","set"],"setProperties":["@ember/object","setProperties"],"trySet":["@ember/object","trySet"]},"ember-metal/utils":{"aliasMethod":["@ember/object","aliasMethod"],"assert":["@ember/debug","assert"],"cacheFor":["@ember/object/internals","cacheFor"],"copy":["@ember/object/internals","copy"],"guidFor":["@ember/object/internals","guidFor"]},"ember-object":{"default":["@ember/object"]},"ember-owner/get":{"default":["@ember/application","getOwner"]},"ember-owner/set":{"default":["@ember/application","setOwner"]},"ember-platform":{"assign":["@ember/polyfills","assign"],"create":["@ember/polyfills","create"],"hasAccessors":["@ember/polyfills","hasPropertyAccessors"],"keys":["@ember/polyfills","keys"]},"ember-route":{"default":["@ember/routing/route"]},"ember-router":{"default":["@ember/routing/router"]},"ember-runloop":{"default":["@ember/runloop","run"],"begin":["@ember/runloop","begin"],"bind":["@ember/runloop","bind"],"cancel":["@ember/runloop","cancel"],"debounce":["@ember/runloop","debounce"],"end":["@ember/runloop","end"],"join":["@ember/runloop","join"],"later":["@ember/runloop","later"],"next":["@ember/runloop","next"],"once":["@ember/runloop","once"],"schedule":["@ember/runloop","schedule"],"scheduleOnce":["@ember/runloop","scheduleOnce"],"throttle":["@ember/runloop","throttle"]},"ember-service":{"default":["@ember/service"]},"ember-service/inject":{"default":["@ember/service","inject"]},"ember-string":{"camelize":["@ember/string","camelize"],"capitalize":["@ember/string","capitalize"],"classify":["@ember/string","classify"],"dasherize":["@ember/string","dasherize"],"decamelize":["@ember/string","decamelize"],"fmt":["@ember/string","fmt"],"htmlSafe":["@ember/string","htmlSafe"],"loc":["@ember/string","loc"],"underscore":["@ember/string","underscore"],"w":["@ember/string","w"]},"ember-utils":{"isBlank":["@ember/utils","isBlank"],"isEmpty":["@ember/utils","isEmpty"],"isNone":["@ember/utils","isNone"],"isPresent":["@ember/utils","isPresent"],"tryInvoke":["@ember/utils","tryInvoke"],"typeOf":["@ember/utils","typeOf"]},"ember-computed":{"default":["@ember/object","computed"],"empty":["@ember/object/computed","empty"],"notEmpty":["@ember/object/computed","notEmpty"],"none":["@ember/object/computed","none"],"not":["@ember/object/computed","not"],"bool":["@ember/object/computed","bool"],"match":["@ember/object/computed","match"],"equal":["@ember/object/computed","equal"],"gt":["@ember/object/computed","gt"],"gte":["@ember/object/computed","gte"],"lt":["@ember/object/computed","lt"],"lte":["@ember/object/computed","lte"],"alias":["@ember/object/computed","alias"],"oneWay":["@ember/object/computed","oneWay"],"reads":["@ember/object/computed","reads"],"readOnly":["@ember/object/computed","readOnly"],"deprecatingAlias":["@ember/object/computed","deprecatingAlias"],"and":["@ember/object/computed","and"],"or":["@ember/object/computed","or"],"collect":["@ember/object/computed","collect"],"sum":["@ember/object/computed","sum"],"min":["@ember/object/computed","min"],"max":["@ember/object/computed","max"],"map":["@ember/object/computed","map"],"sort":["@ember/object/computed","sort"],"setDiff":["@ember/object/computed","setDiff"],"mapBy":["@ember/object/computed","mapBy"],"mapProperty":["@ember/object/computed","mapProperty"],"filter":["@ember/object/computed","filter"],"filterBy":["@ember/object/computed","filterBy"],"filterProperty":["@ember/object/computed","filterProperty"],"uniq":["@ember/object/computed","uniq"],"union":["@ember/object/computed","union"],"intersect":["@ember/object/computed","intersect"]},"ember-test/adapter":{"default":["@ember/test/adapter"]}};
+
+ Object.defineProperty(values, '__esModule', {
+ value: true
+ });
+
+ return values;
+ });
+})();
+;(function() {
+/* globals define, Ember, jQuery */
+
+ function processEmberShims() {
+ var shims = {
+ 'ember-application': {
+ 'default': Ember.Application
+ },
+ 'ember-array': {
+ 'default': Ember.Array
+ },
+ 'ember-array/mutable': {
+ 'default': Ember.MutableArray
+ },
+ 'ember-array/utils': {
+ 'A': Ember.A,
+ 'isEmberArray': Ember.isArray,
+ 'wrap': Ember.makeArray
+ },
+ 'ember-component': {
+ 'default': Ember.Component
+ },
+ 'ember-components/checkbox': {
+ 'default': Ember.Checkbox
+ },
+ 'ember-components/text-area': {
+ 'default': Ember.TextArea
+ },
+ 'ember-components/text-field': {
+ 'default': Ember.TextField
+ },
+ 'ember-controller': {
+ 'default': Ember.Controller
+ },
+ 'ember-controller/inject': {
+ 'default': Ember.inject.controller
+ },
+ 'ember-controller/proxy': {
+ 'default': Ember.ArrayProxy
+ },
+ 'ember-controllers/sortable': {
+ 'default': Ember.SortableMixin
+ },
+ 'ember-debug': {
+ 'log': Ember.debug,
+ 'inspect': Ember.inspect,
+ 'run': Ember.runInDebug,
+ 'warn': Ember.warn
+ },
+ 'ember-debug/container-debug-adapter': {
+ 'default': Ember.ContainerDebugAdapter
+ },
+ 'ember-debug/data-adapter': {
+ 'default': Ember.DataAdapter
+ },
+ 'ember-deprecations': {
+ 'deprecate': Ember.deprecate,
+ 'deprecateFunc': Ember.deprecateFunc
+ },
+ 'ember-enumerable': {
+ 'default': Ember.Enumerable
+ },
+ 'ember-evented': {
+ 'default': Ember.Evented
+ },
+ 'ember-evented/on': {
+ 'default': Ember.on
+ },
+ 'ember-globals-resolver': {
+ 'default': Ember.DefaultResolver
+ },
+ 'ember-helper': {
+ 'default': Ember.Helper,
+ 'helper': Ember.Helper && Ember.Helper.helper
+ },
+ 'ember-instrumentation': {
+ 'instrument': Ember.Instrumentation.instrument,
+ 'reset': Ember.Instrumentation.reset,
+ 'subscribe': Ember.Instrumentation.subscribe,
+ 'unsubscribe': Ember.Instrumentation.unsubscribe
+ },
+ 'ember-locations/hash': {
+ 'default': Ember.HashLocation
+ },
+ 'ember-locations/history': {
+ 'default': Ember.HistoryLocation
+ },
+ 'ember-locations/none': {
+ 'default': Ember.NoneLocation
+ },
+ 'ember-map': {
+ 'default': Ember.Map,
+ 'withDefault': Ember.MapWithDefault
+ },
+ 'ember-metal/destroy': {
+ 'default': Ember.destroy
+ },
+ 'ember-metal/events': {
+ 'addListener': Ember.addListener,
+ 'removeListener': Ember.removeListener,
+ 'send': Ember.sendEvent
+ },
+ 'ember-metal/get': {
+ 'default': Ember.get,
+ 'getProperties': Ember.getProperties
+ },
+ 'ember-metal/mixin': {
+ 'default': Ember.Mixin
+ },
+ 'ember-metal/observer': {
+ 'default': Ember.observer,
+ 'addObserver': Ember.addObserver,
+ 'removeObserver': Ember.removeObserver
+ },
+ 'ember-metal/on-load': {
+ 'default': Ember.onLoad,
+ 'run': Ember.runLoadHooks
+ },
+ 'ember-metal/set': {
+ 'default': Ember.set,
+ 'setProperties': Ember.setProperties,
+ 'trySet': Ember.trySet
+ },
+ 'ember-metal/utils': {
+ 'aliasMethod': Ember.aliasMethod,
+ 'assert': Ember.assert,
+ 'cacheFor': Ember.cacheFor,
+ 'copy': Ember.copy,
+ 'guidFor': Ember.guidFor
+ },
+ 'ember-object': {
+ 'default': Ember.Object
+ },
+ 'ember-owner/get': {
+ 'default': Ember.getOwner
+ },
+ 'ember-owner/set': {
+ 'default': Ember.setOwner
+ },
+ 'ember-platform': {
+ 'assign': Ember.assign || Ember.merge,
+ 'create': Ember.create,
+ 'defineProperty': Ember.platform.defineProperty,
+ 'hasAccessors': Ember.platform.hasPropertyAccessors,
+ 'keys': Ember.keys
+ },
+ 'ember-route': {
+ 'default': Ember.Route
+ },
+ 'ember-router': {
+ 'default': Ember.Router
+ },
+ 'ember-runloop': {
+ 'default': Ember.run,
+ 'begin': Ember.run.begin,
+ 'bind': Ember.run.bind,
+ 'cancel': Ember.run.cancel,
+ 'debounce': Ember.run.debounce,
+ 'end': Ember.run.end,
+ 'join': Ember.run.join,
+ 'later': Ember.run.later,
+ 'next': Ember.run.next,
+ 'once': Ember.run.once,
+ 'schedule': Ember.run.schedule,
+ 'scheduleOnce': Ember.run.scheduleOnce,
+ 'throttle': Ember.run.throttle
+ },
+ 'ember-service': {
+ 'default': Ember.Service
+ },
+ 'ember-service/inject': {
+ 'default': Ember.inject.service
+ },
+ 'ember-set/ordered': {
+ 'default': Ember.OrderedSet
+ },
+ 'ember-string': {
+ 'camelize': Ember.String.camelize,
+ 'capitalize': Ember.String.capitalize,
+ 'classify': Ember.String.classify,
+ 'dasherize': Ember.String.dasherize,
+ 'decamelize': Ember.String.decamelize,
+ 'fmt': Ember.String.fmt,
+ 'htmlSafe': Ember.String.htmlSafe,
+ 'loc': Ember.String.loc,
+ 'underscore': Ember.String.underscore,
+ 'w': Ember.String.w
+ },
+ 'ember-utils': {
+ 'isBlank': Ember.isBlank,
+ 'isEmpty': Ember.isEmpty,
+ 'isNone': Ember.isNone,
+ 'isPresent': Ember.isPresent,
+ 'tryInvoke': Ember.tryInvoke,
+ 'typeOf': Ember.typeOf
+ }
+ };
+
+ // populate `ember/computed` named exports
+ shims['ember-computed'] = {
+ 'default': Ember.computed
+ };
+ var computedMacros = [
+ "empty","notEmpty", "none", "not", "bool", "match",
+ "equal", "gt", "gte", "lt", "lte", "alias", "oneWay",
+ "reads", "readOnly", "deprecatingAlias",
+ "and", "or", "collect", "sum", "min", "max",
+ "map", "sort", "setDiff", "mapBy", "mapProperty",
+ "filter", "filterBy", "filterProperty", "uniq",
+ "union", "intersect"
+ ];
+ for (var i = 0, l = computedMacros.length; i < l; i++) {
+ var key = computedMacros[i];
+ shims['ember-computed'][key] = Ember.computed[key];
+ }
+
+ for (var moduleName in shims) {
+ generateModule(moduleName, shims[moduleName], true);
+ }
+ }
+
+ function processTestShims() {
+ if (Ember.Test) {
+ var testShims = {
+ 'ember-test': {
+ 'default': Ember.Test
+ },
+ 'ember-test/adapter': {
+ 'default': Ember.Test.Adapter
+ },
+ 'ember-test/qunit-adapter': {
+ 'default': Ember.Test.QUnitAdapter
+ }
+ };
+
+ for (var moduleName in testShims) {
+ generateModule(moduleName, testShims[moduleName]);
+ }
+ }
+ }
+
+ function generateModule(name, values, deprecated) {
+ define(name, ['ember-cli-shims/deprecations'], function(deprecations) {
+ 'use strict';
+
+ if (deprecated) {
+ var moduleDeprecations = deprecations[name];
+
+ var message = 'Importing from the `' + name + '` module has been deprecated. ';
+ if (moduleDeprecations) {
+ message += 'Please use the new module imports:\n\n';
+ Object.keys(moduleDeprecations).forEach(function(key) {
+ var newImport = moduleDeprecations[key];
+ if (newImport[1]) {
+ message += 'import { ' + newImport[1] + ' } from \'' + newImport[0] + '\'\n';
+ } else {
+ var importName = Ember.String.classify(newImport[0].split('/').pop());
+ message += 'import ' + importName + ' from \'' + newImport[0] + '\'\n';
+ }
+ });
+ message += '\n';
+
+ } else {
+ message += 'Please use globals instead.';
+ }
+
+ Ember.deprecate(message, false, {
+ id: 'ember-cli-shims.deprecated-shims',
+ until: '3.0.0',
+ url: 'https://github.com/emberjs/rfcs/blob/master/text/0176-javascript-module-api.md'
+ });
+ }
+
+ Object.defineProperty(values, '__esModule', {
+ value: true
+ });
+
+ return values;
+ });
+ }
+
+ generateModule('ember', { default: Ember });
+ processEmberShims();
+ processTestShims();
+ generateModule('jquery', { 'default': self.jQuery });
+ generateModule('rsvp', { 'default': Ember.RSVP });
+})();
+
+;/* globals define */
+
+function createDeprecatedModule(moduleId) {
+ define(moduleId, ['exports', 'ember-resolver/resolver', 'ember'], function(exports, Resolver, Ember) {
+ Ember['default'].deprecate(
+ 'Usage of `' + moduleId + '` module is deprecated, please update to `ember-resolver`.',
+ false,
+ { id: 'ember-resolver.legacy-shims', until: '3.0.0' }
+ );
+
+ exports['default'] = Resolver['default'];
+ });
+}
+
+createDeprecatedModule('ember/resolver');
+createDeprecatedModule('resolver');
+
+;define('ember-ajax/-private/promise', ['exports'], function (exports) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+
+
+ /**
+ * AJAX Promise
+ *
+ * Sub-class of RSVP Promise that passes the XHR property on to the
+ * child promise
+ *
+ * @extends RSVP.Promise
+ * @private
+ */
+ class AJAXPromise extends Ember.RSVP.Promise {
+ /**
+ * Overriding `.then` to add XHR to child promise
+ *
+ * @public
+ * @return {AJAXPromise} child promise
+ */
+ then() {
+ const child = super.then(...arguments);
+
+ child.xhr = this.xhr;
+
+ return child;
+ }
+ }
+ exports.default = AJAXPromise;
+});
+;define('ember-ajax/-private/utils/get-header', ['exports'], function (exports) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = getHeader;
+
+
+ /**
+ * Do a case-insensitive lookup of an HTTP header
+ *
+ * @function getHeader
+ * @private
+ * @param {Object} headers
+ * @param {string} name
+ * @return {string}
+ */
+ function getHeader(headers, name) {
+ if (Ember.isNone(headers) || Ember.isNone(name)) {
+ return; // ask for nothing, get nothing.
+ }
+
+ const matchedKey = Ember.A(Object.keys(headers)).find(key => {
+ return key.toLowerCase() === name.toLowerCase();
+ });
+
+ return headers[matchedKey];
+ }
+});
+;define('ember-ajax/-private/utils/is-fastboot', ['exports'], function (exports) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ /* global FastBoot */
+ const isFastBoot = typeof FastBoot !== 'undefined';
+ exports.default = isFastBoot;
+});
+;define('ember-ajax/-private/utils/is-string', ['exports'], function (exports) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = isString;
+ function isString(object) {
+ return typeof object === 'string';
+ }
+});
+;define('ember-ajax/-private/utils/parse-response-headers', ['exports'], function (exports) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = parseResponseHeaders;
+ const CRLF = exports.CRLF = '\u000d\u000a';
+
+ function parseResponseHeaders(headersString) {
+ const headers = {};
+
+ if (!headersString) {
+ return headers;
+ }
+
+ return headersString.split(CRLF).reduce((hash, header) => {
+ let [field, ...value] = header.split(':');
+
+ field = field.trim();
+ value = value.join(':').trim();
+
+ if (value) {
+ hash[field] = value;
+ }
+
+ return hash;
+ }, headers);
+ }
+});
+;define('ember-ajax/-private/utils/url-helpers', ['exports', 'require', 'ember-ajax/-private/utils/is-fastboot'], function (exports, _require2, _isFastboot) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.parseURL = parseURL;
+ exports.isFullURL = isFullURL;
+ exports.haveSameHost = haveSameHost;
+ /* eslint-env browser, node */
+
+ const completeUrlRegex = /^(http|https)/;
+
+ /*
+ * Isomorphic URL parsing
+ * Borrowed from
+ * http://www.sitepoint.com/url-parsing-isomorphic-javascript/
+ */
+ const isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';
+
+ const url = function () {
+ if (_isFastboot.default) {
+ // ember-fastboot-server provides the node url module as URL global
+ return URL;
+ }
+
+ if (isNode) {
+ return (0, _require2.default)('url');
+ }
+
+ return document.createElement('a');
+ }();
+
+ /**
+ * Parse a URL string into an object that defines its structure
+ *
+ * The returned object will have the following properties:
+ *
+ * href: the full URL
+ * protocol: the request protocol
+ * hostname: the target for the request
+ * port: the port for the request
+ * pathname: any URL after the host
+ * search: query parameters
+ * hash: the URL hash
+ *
+ * @function parseURL
+ * @private
+ * @param {string} str The string to parse
+ * @return {Object} URL structure
+ */
+ function parseURL(str) {
+ let fullObject;
+
+ if (isNode || _isFastboot.default) {
+ fullObject = url.parse(str);
+ } else {
+ url.href = str;
+ fullObject = url;
+ }
+
+ const desiredProps = {};
+ desiredProps.href = fullObject.href;
+ desiredProps.protocol = fullObject.protocol;
+ desiredProps.hostname = fullObject.hostname;
+ desiredProps.port = fullObject.port;
+ desiredProps.pathname = fullObject.pathname;
+ desiredProps.search = fullObject.search;
+ desiredProps.hash = fullObject.hash;
+ return desiredProps;
+ }
+
+ function isFullURL(url) {
+ return url.match(completeUrlRegex);
+ }
+
+ function haveSameHost(a, b) {
+ a = parseURL(a);
+ b = parseURL(b);
+
+ return a.protocol === b.protocol && a.hostname === b.hostname && a.port === b.port;
+ }
+});
+;define('ember-ajax/ajax-request', ['exports', 'ember-ajax/mixins/ajax-request'], function (exports, _ajaxRequest) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = Ember.Object.extend(_ajaxRequest.default);
+});
+;define('ember-ajax/errors', ['exports'], function (exports) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.AjaxError = AjaxError;
+ exports.InvalidError = InvalidError;
+ exports.UnauthorizedError = UnauthorizedError;
+ exports.ForbiddenError = ForbiddenError;
+ exports.BadRequestError = BadRequestError;
+ exports.NotFoundError = NotFoundError;
+ exports.TimeoutError = TimeoutError;
+ exports.AbortError = AbortError;
+ exports.ConflictError = ConflictError;
+ exports.ServerError = ServerError;
+ exports.isAjaxError = isAjaxError;
+ exports.isUnauthorizedError = isUnauthorizedError;
+ exports.isForbiddenError = isForbiddenError;
+ exports.isInvalidError = isInvalidError;
+ exports.isBadRequestError = isBadRequestError;
+ exports.isNotFoundError = isNotFoundError;
+ exports.isTimeoutError = isTimeoutError;
+ exports.isAbortError = isAbortError;
+ exports.isConflictError = isConflictError;
+ exports.isServerError = isServerError;
+ exports.isSuccess = isSuccess;
+
+
+ /**
+ * @class AjaxError
+ * @public
+ * @extends Ember.Error
+ */
+ function AjaxError(payload, message = 'Ajax operation failed', status) {
+ Ember.Error.call(this, message);
+
+ this.payload = payload;
+ this.status = status;
+ }
+
+ AjaxError.prototype = Object.create(Ember.Error.prototype);
+
+ /**
+ * @class InvalidError
+ * @public
+ * @extends AjaxError
+ */
+ function InvalidError(payload) {
+ AjaxError.call(this, payload, 'Request was rejected because it was invalid', 422);
+ }
+
+ InvalidError.prototype = Object.create(AjaxError.prototype);
+
+ /**
+ * @class UnauthorizedError
+ * @public
+ * @extends AjaxError
+ */
+ function UnauthorizedError(payload) {
+ AjaxError.call(this, payload, 'Ajax authorization failed', 401);
+ }
+
+ UnauthorizedError.prototype = Object.create(AjaxError.prototype);
+
+ /**
+ * @class ForbiddenError
+ * @public
+ * @extends AjaxError
+ */
+ function ForbiddenError(payload) {
+ AjaxError.call(this, payload, 'Request was rejected because user is not permitted to perform this operation.', 403);
+ }
+
+ ForbiddenError.prototype = Object.create(AjaxError.prototype);
+
+ /**
+ * @class BadRequestError
+ * @public
+ * @extends AjaxError
+ */
+ function BadRequestError(payload) {
+ AjaxError.call(this, payload, 'Request was formatted incorrectly.', 400);
+ }
+
+ BadRequestError.prototype = Object.create(AjaxError.prototype);
+
+ /**
+ * @class NotFoundError
+ * @public
+ * @extends AjaxError
+ */
+ function NotFoundError(payload) {
+ AjaxError.call(this, payload, 'Resource was not found.', 404);
+ }
+
+ NotFoundError.prototype = Object.create(AjaxError.prototype);
+
+ /**
+ * @class TimeoutError
+ * @public
+ * @extends AjaxError
+ */
+ function TimeoutError() {
+ AjaxError.call(this, null, 'The ajax operation timed out', -1);
+ }
+
+ TimeoutError.prototype = Object.create(AjaxError.prototype);
+
+ /**
+ * @class AbortError
+ * @public
+ * @extends AjaxError
+ */
+ function AbortError() {
+ AjaxError.call(this, null, 'The ajax operation was aborted', 0);
+ }
+
+ AbortError.prototype = Object.create(AjaxError.prototype);
+
+ /**
+ * @class ConflictError
+ * @public
+ * @extends AjaxError
+ */
+ function ConflictError(payload) {
+ AjaxError.call(this, payload, 'The ajax operation failed due to a conflict', 409);
+ }
+
+ ConflictError.prototype = Object.create(AjaxError.prototype);
+
+ /**
+ * @class ServerError
+ * @public
+ * @extends AjaxError
+ */
+ function ServerError(payload, status) {
+ AjaxError.call(this, payload, 'Request was rejected due to server error', status);
+ }
+
+ ServerError.prototype = Object.create(AjaxError.prototype);
+
+ /**
+ * Checks if the given error is or inherits from AjaxError
+ *
+ * @method isAjaxError
+ * @public
+ * @param {Error} error
+ * @return {Boolean}
+ */
+ function isAjaxError(error) {
+ return error instanceof AjaxError;
+ }
+
+ /**
+ * Checks if the given status code or AjaxError object represents an
+ * unauthorized request error
+ *
+ * @method isUnauthorizedError
+ * @public
+ * @param {Number | AjaxError} error
+ * @return {Boolean}
+ */
+ function isUnauthorizedError(error) {
+ if (isAjaxError(error)) {
+ return error instanceof UnauthorizedError;
+ } else {
+ return error === 401;
+ }
+ }
+
+ /**
+ * Checks if the given status code or AjaxError object represents a forbidden
+ * request error
+ *
+ * @method isForbiddenError
+ * @public
+ * @param {Number | AjaxError} error
+ * @return {Boolean}
+ */
+ function isForbiddenError(error) {
+ if (isAjaxError(error)) {
+ return error instanceof ForbiddenError;
+ } else {
+ return error === 403;
+ }
+ }
+
+ /**
+ * Checks if the given status code or AjaxError object represents an invalid
+ * request error
+ *
+ * @method isInvalidError
+ * @public
+ * @param {Number | AjaxError} error
+ * @return {Boolean}
+ */
+ function isInvalidError(error) {
+ if (isAjaxError(error)) {
+ return error instanceof InvalidError;
+ } else {
+ return error === 422;
+ }
+ }
+
+ /**
+ * Checks if the given status code or AjaxError object represents a bad request
+ * error
+ *
+ * @method isBadRequestError
+ * @public
+ * @param {Number | AjaxError} error
+ * @return {Boolean}
+ */
+ function isBadRequestError(error) {
+ if (isAjaxError(error)) {
+ return error instanceof BadRequestError;
+ } else {
+ return error === 400;
+ }
+ }
+
+ /**
+ * Checks if the given status code or AjaxError object represents a
+ * "not found" error
+ *
+ * @method isNotFoundError
+ * @public
+ * @param {Number | AjaxError} error
+ * @return {Boolean}
+ */
+ function isNotFoundError(error) {
+ if (isAjaxError(error)) {
+ return error instanceof NotFoundError;
+ } else {
+ return error === 404;
+ }
+ }
+
+ /**
+ * Checks if the given status code or AjaxError object represents a
+ * "timeout" error
+ *
+ * @method isTimeoutError
+ * @public
+ * @param {AjaxError} error
+ * @return {Boolean}
+ */
+ function isTimeoutError(error) {
+ return error instanceof TimeoutError;
+ }
+
+ /**
+ * Checks if the given status code or AjaxError object represents an
+ * "abort" error
+ *
+ * @method isAbortError
+ * @public
+ * @param {AjaxError} error
+ * @return {Boolean}
+ */
+ function isAbortError(error) {
+ if (isAjaxError(error)) {
+ return error instanceof AbortError;
+ } else {
+ return error === 0;
+ }
+ }
+
+ /**
+ * Checks if the given status code or AjaxError object represents a
+ * conflict error
+ *
+ * @method isConflictError
+ * @public
+ * @param {Number | AjaxError} error
+ * @return {Boolean}
+ */
+ function isConflictError(error) {
+ if (isAjaxError(error)) {
+ return error instanceof ConflictError;
+ } else {
+ return error === 409;
+ }
+ }
+
+ /**
+ * Checks if the given status code or AjaxError object represents a server error
+ *
+ * @method isServerError
+ * @public
+ * @param {Number | AjaxError} error
+ * @return {Boolean}
+ */
+ function isServerError(error) {
+ if (isAjaxError(error)) {
+ return error instanceof ServerError;
+ } else {
+ return error >= 500 && error < 600;
+ }
+ }
+
+ /**
+ * Checks if the given status code represents a successful request
+ *
+ * @method isSuccess
+ * @public
+ * @param {Number} status
+ * @return {Boolean}
+ */
+ function isSuccess(status) {
+ const s = parseInt(status, 10);
+
+ return s >= 200 && s < 300 || s === 304;
+ }
+});
+;define('ember-ajax/index', ['exports', 'ember-ajax/request'], function (exports, _request) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function () {
+ return _request.default;
+ }
+ });
+});
+;define('ember-ajax/mixins/ajax-request', ['exports', 'ember-ajax/errors', 'ember-ajax/utils/ajax', 'ember-ajax/-private/utils/parse-response-headers', 'ember-ajax/-private/utils/get-header', 'ember-ajax/-private/utils/url-helpers', 'ember-ajax/-private/utils/is-string', 'ember-ajax/-private/promise'], function (exports, _errors, _ajax, _parseResponseHeaders, _getHeader, _urlHelpers, _isString, _promise) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+
+
+ const { Logger, Test, testing } = Ember;
+ const JSONContentType = /^application\/(?:vnd\.api\+)?json/i;
+
+ function isJSONContentType(header) {
+ if (!(0, _isString.default)(header)) {
+ return false;
+ }
+ return !!header.match(JSONContentType);
+ }
+
+ function isJSONStringifyable(method, { contentType, data, headers }) {
+ if (method === 'GET') {
+ return false;
+ }
+
+ if (!isJSONContentType(contentType) && !isJSONContentType((0, _getHeader.default)(headers, 'Content-Type'))) {
+ return false;
+ }
+
+ if (typeof data !== 'object') {
+ return false;
+ }
+
+ return true;
+ }
+
+ function startsWithSlash(string) {
+ return string.charAt(0) === '/';
+ }
+
+ function endsWithSlash(string) {
+ return string.charAt(string.length - 1) === '/';
+ }
+
+ function removeLeadingSlash(string) {
+ return string.substring(1);
+ }
+
+ function stripSlashes(path) {
+ // make sure path starts with `/`
+ if (startsWithSlash(path)) {
+ path = removeLeadingSlash(path);
+ }
+
+ // remove end `/`
+ if (endsWithSlash(path)) {
+ path = path.slice(0, -1);
+ }
+ return path;
+ }
+
+ let pendingRequestCount = 0;
+ if (testing) {
+ Test.registerWaiter(function () {
+ return pendingRequestCount === 0;
+ });
+ }
+
+ /**
+ * AjaxRequest Mixin
+ *
+ * @public
+ * @mixin
+ */
+ exports.default = Ember.Mixin.create({
+ /**
+ * The default value for the request `contentType`
+ *
+ * For now, defaults to the same value that jQuery would assign. In the
+ * future, the default value will be for JSON requests.
+ * @property {string} contentType
+ * @public
+ * @default
+ */
+ contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
+
+ /**
+ * Headers to include on the request
+ *
+ * Some APIs require HTTP headers, e.g. to provide an API key. Arbitrary
+ * headers can be set as key/value pairs on the `RESTAdapter`'s `headers`
+ * object and Ember Data will send them along with each ajax request.
+ *
+ * ```javascript
+ * // app/services/ajax.js
+ * import AjaxService from 'ember-ajax/services/ajax';
+ *
+ * export default AjaxService.extend({
+ * headers: {
+ * 'API_KEY': 'secret key',
+ * 'ANOTHER_HEADER': 'Some header value'
+ * }
+ * });
+ * ```
+ *
+ * `headers` can also be used as a computed property to support dynamic
+ * headers.
+ *
+ * ```javascript
+ * // app/services/ajax.js
+ * import Ember from 'ember';
+ * import AjaxService from 'ember-ajax/services/ajax';
+ *
+ * const {
+ * computed,
+ * get,
+ * inject: { service }
+ * } = Ember;
+ *
+ * export default AjaxService.extend({
+ * session: service(),
+ * headers: computed('session.authToken', function() {
+ * return {
+ * 'API_KEY': get(this, 'session.authToken'),
+ * 'ANOTHER_HEADER': 'Some header value'
+ * };
+ * })
+ * });
+ * ```
+ *
+ * In some cases, your dynamic headers may require data from some object
+ * outside of Ember's observer system (for example `document.cookie`). You
+ * can use the `volatile` function to set the property into a non-cached mode
+ * causing the headers to be recomputed with every request.
+ *
+ * ```javascript
+ * // app/services/ajax.js
+ * import Ember from 'ember';
+ * import AjaxService from 'ember-ajax/services/ajax';
+ *
+ * const {
+ * computed,
+ * get,
+ * inject: { service }
+ * } = Ember;
+ *
+ * export default AjaxService.extend({
+ * session: service(),
+ * headers: computed('session.authToken', function() {
+ * return {
+ * 'API_KEY': get(document.cookie.match(/apiKey\=([^;]*)/), '1'),
+ * 'ANOTHER_HEADER': 'Some header value'
+ * };
+ * }).volatile()
+ * });
+ * ```
+ *
+ * @property {Object} headers
+ * @public
+ * @default
+ */
+ headers: {},
+
+ /**
+ * Make an AJAX request, ignoring the raw XHR object and dealing only with
+ * the response
+ *
+ * @method request
+ * @public
+ * @param {string} url The url to make a request to
+ * @param {Object} options The options for the request
+ * @return {Promise} The result of the request
+ */
+ request(url, options) {
+ const hash = this.options(url, options);
+ const internalPromise = this._makeRequest(hash);
+
+ const ajaxPromise = new _promise.default((resolve, reject) => {
+ internalPromise.then(({ response }) => {
+ resolve(response);
+ }).catch(({ response }) => {
+ reject(response);
+ });
+ }, `ember-ajax: ${hash.type} ${hash.url} response`);
+
+ ajaxPromise.xhr = internalPromise.xhr;
+
+ return ajaxPromise;
+ },
+
+ /**
+ * Make an AJAX request, returning the raw XHR object along with the response
+ *
+ * @method raw
+ * @public
+ * @param {string} url The url to make a request to
+ * @param {Object} options The options for the request
+ * @return {Promise} The result of the request
+ */
+ raw(url, options) {
+ const hash = this.options(url, options);
+ return this._makeRequest(hash);
+ },
+
+ /**
+ * Shared method to actually make an AJAX request
+ *
+ * @method _makeRequest
+ * @private
+ * @param {Object} hash The options for the request
+ * @param {string} hash.url The URL to make the request to
+ * @return {Promise} The result of the request
+ */
+ _makeRequest(hash) {
+ const method = hash.method || hash.type || 'GET';
+ const requestData = { method, type: method, url: hash.url };
+
+ if (isJSONStringifyable(method, hash)) {
+ hash.data = JSON.stringify(hash.data);
+ }
+
+ pendingRequestCount = pendingRequestCount + 1;
+
+ const jqXHR = (0, _ajax.default)(hash);
+
+ const promise = new _promise.default((resolve, reject) => {
+ jqXHR.done((payload, textStatus, jqXHR) => {
+ const response = this.handleResponse(jqXHR.status, (0, _parseResponseHeaders.default)(jqXHR.getAllResponseHeaders()), payload, requestData);
+
+ if ((0, _errors.isAjaxError)(response)) {
+ Ember.run.join(null, reject, { payload, textStatus, jqXHR, response });
+ } else {
+ Ember.run.join(null, resolve, { payload, textStatus, jqXHR, response });
+ }
+ }).fail((jqXHR, textStatus, errorThrown) => {
+ Ember.runInDebug(function () {
+ const message = `The server returned an empty string for ${requestData.type} ${requestData.url}, which cannot be parsed into a valid JSON. Return either null or {}.`;
+ const validJSONString = !(textStatus === 'parsererror' && jqXHR.responseText === '');
+
+ (true && Ember.warn(message, validJSONString, {
+ id: 'ds.adapter.returned-empty-string-as-JSON'
+ }));
+ });
+
+ const payload = this.parseErrorResponse(jqXHR.responseText) || errorThrown;
+ let response;
+
+ if (errorThrown instanceof Error) {
+ response = errorThrown;
+ } else if (textStatus === 'timeout') {
+ response = new _errors.TimeoutError();
+ } else if (textStatus === 'abort') {
+ response = new _errors.AbortError();
+ } else {
+ response = this.handleResponse(jqXHR.status, (0, _parseResponseHeaders.default)(jqXHR.getAllResponseHeaders()), payload, requestData);
+ }
+
+ Ember.run.join(null, reject, { payload, textStatus, jqXHR, errorThrown, response });
+ }).always(() => {
+ pendingRequestCount = pendingRequestCount - 1;
+ });
+ }, `ember-ajax: ${hash.type} ${hash.url}`);
+
+ promise.xhr = jqXHR;
+
+ return promise;
+ },
+
+ /**
+ * calls `request()` but forces `options.type` to `POST`
+ *
+ * @method post
+ * @public
+ * @param {string} url The url to make a request to
+ * @param {Object} options The options for the request
+ * @return {Promise} The result of the request
+ */
+ post(url, options) {
+ return this.request(url, this._addTypeToOptionsFor(options, 'POST'));
+ },
+
+ /**
+ * calls `request()` but forces `options.type` to `PUT`
+ *
+ * @method put
+ * @public
+ * @param {string} url The url to make a request to
+ * @param {Object} options The options for the request
+ * @return {Promise} The result of the request
+ */
+ put(url, options) {
+ return this.request(url, this._addTypeToOptionsFor(options, 'PUT'));
+ },
+
+ /**
+ * calls `request()` but forces `options.type` to `PATCH`
+ *
+ * @method patch
+ * @public
+ * @param {string} url The url to make a request to
+ * @param {Object} options The options for the request
+ * @return {Promise} The result of the request
+ */
+ patch(url, options) {
+ return this.request(url, this._addTypeToOptionsFor(options, 'PATCH'));
+ },
+
+ /**
+ * calls `request()` but forces `options.type` to `DELETE`
+ *
+ * @method del
+ * @public
+ * @param {string} url The url to make a request to
+ * @param {Object} options The options for the request
+ * @return {Promise} The result of the request
+ */
+ del(url, options) {
+ return this.request(url, this._addTypeToOptionsFor(options, 'DELETE'));
+ },
+
+ /**
+ * calls `request()` but forces `options.type` to `DELETE`
+ *
+ * Alias for `del()`
+ *
+ * @method delete
+ * @public
+ * @param {string} url The url to make a request to
+ * @param {Object} options The options for the request
+ * @return {Promise} The result of the request
+ */
+ delete() {
+ return this.del(...arguments);
+ },
+
+ /**
+ * Wrap the `.get` method so that we issue a warning if
+ *
+ * Since `.get` is both an AJAX pattern _and_ an Ember pattern, we want to try
+ * to warn users when they try using `.get` to make a request
+ *
+ * @method get
+ * @public
+ */
+ get(url) {
+ if (arguments.length > 1 || url.indexOf('/') !== -1) {
+ throw new Ember.Error('It seems you tried to use `.get` to make a request! Use the `.request` method instead.');
+ }
+ return this._super(...arguments);
+ },
+
+ /**
+ * Manipulates the options hash to include the HTTP method on the type key
+ *
+ * @method _addTypeToOptionsFor
+ * @private
+ * @param {Object} options The original request options
+ * @param {string} method The method to enforce
+ * @return {Object} The new options, with the method set
+ */
+ _addTypeToOptionsFor(options, method) {
+ options = options || {};
+ options.type = method;
+ return options;
+ },
+
+ /**
+ * Get the full "headers" hash, combining the service-defined headers with
+ * the ones provided for the request
+ *
+ * @method _getFullHeadersHash
+ * @private
+ * @param {Object} headers
+ * @return {Object}
+ */
+ _getFullHeadersHash(headers) {
+ const classHeaders = Ember.get(this, 'headers');
+ const _headers = Ember.merge({}, classHeaders);
+ return Ember.merge(_headers, headers);
+ },
+
+ /**
+ * @method options
+ * @private
+ * @param {string} url
+ * @param {Object} options
+ * @return {Object}
+ */
+ options(url, options = {}) {
+ options = Ember.merge({}, options);
+ options.url = this._buildURL(url, options);
+ options.type = options.type || 'GET';
+ options.dataType = options.dataType || 'json';
+ options.contentType = Ember.isEmpty(options.contentType) ? Ember.get(this, 'contentType') : options.contentType;
+
+ if (this._shouldSendHeaders(options)) {
+ options.headers = this._getFullHeadersHash(options.headers);
+ } else {
+ options.headers = options.headers || {};
+ }
+
+ return options;
+ },
+
+ /**
+ * Build a URL for a request
+ *
+ * If the provided `url` is deemed to be a complete URL, it will be returned
+ * directly. If it is not complete, then the segment provided will be combined
+ * with the `host` and `namespace` options of the request class to create the
+ * full URL.
+ *
+ * @private
+ * @param {string} url the url, or url segment, to request
+ * @param {Object} [options={}] the options for the request being made
+ * @param {string} [options.host] the host to use for this request
+ * @returns {string} the URL to make a request to
+ */
+ _buildURL(url, options = {}) {
+ if ((0, _urlHelpers.isFullURL)(url)) {
+ return url;
+ }
+
+ const urlParts = [];
+
+ let host = options.host || Ember.get(this, 'host');
+ if (host) {
+ host = stripSlashes(host);
+ }
+ urlParts.push(host);
+
+ let namespace = options.namespace || Ember.get(this, 'namespace');
+ if (namespace) {
+ namespace = stripSlashes(namespace);
+ urlParts.push(namespace);
+ }
+
+ // If the URL has already been constructed (presumably, by Ember Data), then we should just leave it alone
+ const hasNamespaceRegex = new RegExp(`^(/)?${namespace}`);
+ if (hasNamespaceRegex.test(url)) {
+ return url;
+ }
+
+ // *Only* remove a leading slash -- we need to maintain a trailing slash for
+ // APIs that differentiate between it being and not being present
+ if (startsWithSlash(url)) {
+ url = removeLeadingSlash(url);
+ }
+ urlParts.push(url);
+
+ return urlParts.join('/');
+ },
+
+ /**
+ * Takes an ajax response, and returns the json payload or an error.
+ *
+ * By default this hook just returns the json payload passed to it.
+ * You might want to override it in two cases:
+ *
+ * 1. Your API might return useful results in the response headers.
+ * Response headers are passed in as the second argument.
+ *
+ * 2. Your API might return errors as successful responses with status code
+ * 200 and an Errors text or object.
+ *
+ * @method handleResponse
+ * @private
+ * @param {Number} status
+ * @param {Object} headers
+ * @param {Object} payload
+ * @param {Object} requestData the original request information
+ * @return {Object | AjaxError} response
+ */
+ handleResponse(status, headers, payload, requestData) {
+ if (this.isSuccess(status, headers, payload)) {
+ return payload;
+ }
+
+ // Allow overriding of error payload
+ payload = this.normalizeErrorResponse(status, headers, payload);
+
+ return this._createCorrectError(status, headers, payload, requestData);
+ },
+
+ _createCorrectError(status, headers, payload, requestData) {
+ let error;
+
+ if (this.isUnauthorizedError(status, headers, payload)) {
+ error = new _errors.UnauthorizedError(payload);
+ } else if (this.isForbiddenError(status, headers, payload)) {
+ error = new _errors.ForbiddenError(payload);
+ } else if (this.isInvalidError(status, headers, payload)) {
+ error = new _errors.InvalidError(payload);
+ } else if (this.isBadRequestError(status, headers, payload)) {
+ error = new _errors.BadRequestError(payload);
+ } else if (this.isNotFoundError(status, headers, payload)) {
+ error = new _errors.NotFoundError(payload);
+ } else if (this.isAbortError(status, headers, payload)) {
+ error = new _errors.AbortError(payload);
+ } else if (this.isConflictError(status, headers, payload)) {
+ error = new _errors.ConflictError(payload);
+ } else if (this.isServerError(status, headers, payload)) {
+ error = new _errors.ServerError(payload, status);
+ } else {
+ const detailedMessage = this.generateDetailedMessage(status, headers, payload, requestData);
+
+ error = new _errors.AjaxError(payload, detailedMessage, status);
+ }
+
+ return error;
+ },
+
+ /**
+ * Match the host to a provided array of strings or regexes that can match to a host
+ *
+ * @method matchHosts
+ * @private
+ * @param {string} host the host you are sending too
+ * @param {RegExp | string} matcher a string or regex that you can match the host to.
+ * @returns {Boolean} if the host passed the matcher
+ */
+ _matchHosts(host, matcher) {
+ if (matcher.constructor === RegExp) {
+ return matcher.test(host);
+ } else if (typeof matcher === 'string') {
+ return matcher === host;
+ } else {
+ Logger.warn('trustedHosts only handles strings or regexes.', matcher, 'is neither.');
+ return false;
+ }
+ },
+
+ /**
+ * Determine whether the headers should be added for this request
+ *
+ * This hook is used to help prevent sending headers to every host, regardless
+ * of the destination, since this could be a security issue if authentication
+ * tokens are accidentally leaked to third parties.
+ *
+ * To avoid that problem, subclasses should utilize the `headers` computed
+ * property to prevent authentication from being sent to third parties, or
+ * implement this hook for more fine-grain control over when headers are sent.
+ *
+ * By default, the headers are sent if the host of the request matches the
+ * `host` property designated on the class.
+ *
+ * @method _shouldSendHeaders
+ * @private
+ * @property {Object} hash request options hash
+ * @returns {Boolean} whether or not headers should be sent
+ */
+ _shouldSendHeaders({ url, host }) {
+ url = url || '';
+ host = host || Ember.get(this, 'host') || '';
+
+ const trustedHosts = Ember.get(this, 'trustedHosts') || Ember.A();
+ const { hostname } = (0, _urlHelpers.parseURL)(url);
+
+ // Add headers on relative URLs
+ if (!(0, _urlHelpers.isFullURL)(url)) {
+ return true;
+ } else if (trustedHosts.find(matcher => this._matchHosts(hostname, matcher))) {
+ return true;
+ }
+
+ // Add headers on matching host
+ return (0, _urlHelpers.haveSameHost)(url, host);
+ },
+
+ /**
+ * Generates a detailed ("friendly") error message, with plenty
+ * of information for debugging (good luck!)
+ *
+ * @method generateDetailedMessage
+ * @private
+ * @param {Number} status
+ * @param {Object} headers
+ * @param {Object} payload
+ * @param {Object} requestData the original request information
+ * @return {Object} request information
+ */
+ generateDetailedMessage(status, headers, payload, requestData) {
+ let shortenedPayload;
+ const payloadContentType = (0, _getHeader.default)(headers, 'Content-Type') || 'Empty Content-Type';
+
+ if (payloadContentType.toLowerCase() === 'text/html' && payload.length > 250) {
+ shortenedPayload = '[Omitted Lengthy HTML]';
+ } else {
+ shortenedPayload = JSON.stringify(payload);
+ }
+
+ const requestDescription = `${requestData.type} ${requestData.url}`;
+ const payloadDescription = `Payload (${payloadContentType})`;
+
+ return [`Ember AJAX Request ${requestDescription} returned a ${status}`, payloadDescription, shortenedPayload].join('\n');
+ },
+
+ /**
+ * Default `handleResponse` implementation uses this hook to decide if the
+ * response is a an authorized error.
+ *
+ * @method isUnauthorizedError
+ * @private
+ * @param {Number} status
+ * @param {Object} headers
+ * @param {Object} payload
+ * @return {Boolean}
+ */
+ isUnauthorizedError(status) {
+ return (0, _errors.isUnauthorizedError)(status);
+ },
+
+ /**
+ * Default `handleResponse` implementation uses this hook to decide if the
+ * response is a forbidden error.
+ *
+ * @method isForbiddenError
+ * @private
+ * @param {Number} status
+ * @param {Object} headers
+ * @param {Object} payload
+ * @return {Boolean}
+ */
+ isForbiddenError(status) {
+ return (0, _errors.isForbiddenError)(status);
+ },
+
+ /**
+ * Default `handleResponse` implementation uses this hook to decide if the
+ * response is a an invalid error.
+ *
+ * @method isInvalidError
+ * @private
+ * @param {Number} status
+ * @param {Object} headers
+ * @param {Object} payload
+ * @return {Boolean}
+ */
+ isInvalidError(status) {
+ return (0, _errors.isInvalidError)(status);
+ },
+
+ /**
+ * Default `handleResponse` implementation uses this hook to decide if the
+ * response is a bad request error.
+ *
+ * @method isBadRequestError
+ * @private
+ * @param {Number} status
+ * @param {Object} headers
+ * @param {Object} payload
+ * @return {Boolean}
+ */
+ isBadRequestError(status) {
+ return (0, _errors.isBadRequestError)(status);
+ },
+
+ /**
+ * Default `handleResponse` implementation uses this hook to decide if the
+ * response is a "not found" error.
+ *
+ * @method isNotFoundError
+ * @private
+ * @param {Number} status
+ * @param {Object} headers
+ * @param {Object} payload
+ * @return {Boolean}
+ */
+ isNotFoundError(status) {
+ return (0, _errors.isNotFoundError)(status);
+ },
+
+ /**
+ * Default `handleResponse` implementation uses this hook to decide if the
+ * response is an "abort" error.
+ *
+ * @method isAbortError
+ * @private
+ * @param {Number} status
+ * @param {Object} headers
+ * @param {Object} payload
+ * @return {Boolean}
+ */
+ isAbortError(status) {
+ return (0, _errors.isAbortError)(status);
+ },
+
+ /**
+ * Default `handleResponse` implementation uses this hook to decide if the
+ * response is a "conflict" error.
+ *
+ * @method isConflictError
+ * @private
+ * @param {Number} status
+ * @param {Object} headers
+ * @param {Object} payload
+ * @return {Boolean}
+ */
+ isConflictError(status) {
+ return (0, _errors.isConflictError)(status);
+ },
+
+ /**
+ * Default `handleResponse` implementation uses this hook to decide if the
+ * response is a server error.
+ *
+ * @method isServerError
+ * @private
+ * @param {Number} status
+ * @param {Object} headers
+ * @param {Object} payload
+ * @return {Boolean}
+ */
+ isServerError(status) {
+ return (0, _errors.isServerError)(status);
+ },
+
+ /**
+ * Default `handleResponse` implementation uses this hook to decide if the
+ * response is a success.
+ *
+ * @method isSuccess
+ * @private
+ * @param {Number} status
+ * @param {Object} headers
+ * @param {Object} payload
+ * @return {Boolean}
+ */
+ isSuccess(status) {
+ return (0, _errors.isSuccess)(status);
+ },
+
+ /**
+ * @method parseErrorResponse
+ * @private
+ * @param {string} responseText
+ * @return {Object}
+ */
+ parseErrorResponse(responseText) {
+ try {
+ return JSON.parse(responseText);
+ } catch (e) {
+ return responseText;
+ }
+ },
+
+ /**
+ * Can be overwritten to allow re-formatting of error messages
+ *
+ * @method normalizeErrorResponse
+ * @private
+ * @param {Number} status
+ * @param {Object} headers
+ * @param {Object} payload
+ * @return {*} error response
+ */
+ normalizeErrorResponse(status, headers, payload) {
+ return payload;
+ }
+ });
+});
+;define('ember-ajax/mixins/ajax-support', ['exports'], function (exports) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = Ember.Mixin.create({
+ /**
+ * The AJAX service to send requests through
+ *
+ * @property {AjaxService} ajaxService
+ * @public
+ */
+ ajaxService: Ember.inject.service('ajax'),
+
+ /**
+ * @property {string} host
+ * @public
+ */
+ host: Ember.computed.alias('ajaxService.host'),
+
+ /**
+ * @property {string} namespace
+ * @public
+ */
+ namespace: Ember.computed.alias('ajaxService.namespace'),
+
+ /**
+ * @property {object} headers
+ * @public
+ */
+ headers: Ember.computed.alias('ajaxService.headers'),
+
+ ajax(url) {
+ const augmentedOptions = this.ajaxOptions(...arguments);
+
+ return this.get('ajaxService').request(url, augmentedOptions);
+ }
+ });
+});
+;define('ember-ajax/mixins/legacy/normalize-error-response', ['exports', 'ember-ajax/-private/utils/is-string'], function (exports, _isString) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+
+
+ function isObject(object) {
+ return typeof object === 'object';
+ }
+
+ exports.default = Ember.Mixin.create({
+ /**
+ * Normalize the error from the server into the same format
+ *
+ * The format we normalize to is based on the JSON API specification. The
+ * return value should be an array of objects that match the format they
+ * describe. More details about the object format can be found
+ * [here](http://jsonapi.org/format/#error-objects)
+ *
+ * The basics of the format are as follows:
+ *
+ * ```javascript
+ * [
+ * {
+ * status: 'The status code for the error',
+ * title: 'The human-readable title of the error'
+ * detail: 'The human-readable details of the error'
+ * }
+ * ]
+ * ```
+ *
+ * In cases where the server returns an array, then there should be one item
+ * in the array for each of the payload. If your server returns a JSON API
+ * formatted payload already, it will just be returned directly.
+ *
+ * If your server returns something other than a JSON API format, it's
+ * suggested that you override this method to convert your own errors into the
+ * one described above.
+ *
+ * @method normalizeErrorResponse
+ * @private
+ * @param {Number} status
+ * @param {Object} headers
+ * @param {Object} payload
+ * @return {Array} An array of JSON API-formatted error objects
+ */
+ normalizeErrorResponse(status, headers, payload) {
+ payload = Ember.isNone(payload) ? {} : payload;
+
+ if (Ember.isArray(payload.errors)) {
+ return payload.errors.map(function (error) {
+ if (isObject(error)) {
+ const ret = Ember.merge({}, error);
+ ret.status = `${error.status}`;
+ return ret;
+ } else {
+ return {
+ status: `${status}`,
+ title: error
+ };
+ }
+ });
+ } else if (Ember.isArray(payload)) {
+ return payload.map(function (error) {
+ if (isObject(error)) {
+ return {
+ status: `${status}`,
+ title: error.title || 'The backend responded with an error',
+ detail: error
+ };
+ } else {
+ return {
+ status: `${status}`,
+ title: `${error}`
+ };
+ }
+ });
+ } else if ((0, _isString.default)(payload)) {
+ return [{
+ status: `${status}`,
+ title: payload
+ }];
+ } else {
+ return [{
+ status: `${status}`,
+ title: payload.title || 'The backend responded with an error',
+ detail: payload
+ }];
+ }
+ }
+ });
+});
+;define('ember-ajax/raw', ['exports', 'ember-ajax/ajax-request'], function (exports, _ajaxRequest) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = raw;
+
+
+ /**
+ * Same as `request` except it resolves an object with
+ *
+ * {response, textStatus, jqXHR}
+ *
+ * Useful if you need access to the jqXHR object for headers, etc.
+ *
+ * @public
+ */
+ function raw() {
+ const ajax = new _ajaxRequest.default();
+ return ajax.raw(...arguments);
+ }
+});
+;define('ember-ajax/request', ['exports', 'ember-ajax/ajax-request'], function (exports, _ajaxRequest) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = request;
+
+
+ /**
+ * Helper function that allows you to use the default `ember-ajax` to make
+ * requests without using the service.
+ *
+ * Note: Unlike `ic-ajax`'s `request` helper function, this will *not* return a
+ * jqXHR object in the error handler. If you need jqXHR, you can use the `raw`
+ * function instead.
+ *
+ * @public
+ */
+ function request() {
+ const ajax = new _ajaxRequest.default();
+ return ajax.request(...arguments);
+ }
+});
+;define('ember-ajax/services/ajax', ['exports', 'ember-ajax/mixins/ajax-request'], function (exports, _ajaxRequest) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = Ember.Service.extend(_ajaxRequest.default);
+});
+;define('ember-ajax/utils/ajax', ['exports', 'ember-ajax/-private/utils/is-fastboot'], function (exports, _isFastboot) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = _isFastboot.default ? najax : Ember.$.ajax;
+});
+;define('ember-cli-app-version/initializer-factory', ['exports'], function (exports) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = initializerFactory;
+
+
+ const {
+ String: { classify },
+ libraries
+ } = Ember;
+
+ function initializerFactory(name, version) {
+ let registered = false;
+
+ return function () {
+ if (!registered && name && version) {
+ var appName = classify(name);
+ libraries.register(appName, version);
+ registered = true;
+ }
+ };
+ }
+});
+;define("ember-cli-app-version/utils/regexp", ["exports"], function (exports) {
+ "use strict";
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ const versionRegExp = exports.versionRegExp = /\d[.]\d[.]\d/;
+ const shaRegExp = exports.shaRegExp = /[a-z\d]{8}/;
+});
+;define('ember-inflector/index', ['exports', 'ember-inflector/lib/system', 'ember-inflector/lib/ext/string'], function (exports, _system) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.defaultRules = exports.singularize = exports.pluralize = undefined;
+
+
+ _system.Inflector.defaultRules = _system.defaultRules;
+
+ Object.defineProperty(Ember, 'Inflector', {
+ get() {
+ Ember.deprecate(`Ember.Inflector is deprecated. Please explicitly: import Inflector from 'ember-inflector';`, false, {
+ id: 'ember-inflector.globals',
+ until: '3.0.0'
+ });
+
+ return _system.Inflector;
+ }
+ });
+
+ Object.defineProperty(Ember.String, 'singularize', {
+ get() {
+ Ember.deprecate(`Ember.String.singularize() is deprecated. Please explicitly: import { singularize } from 'ember-inflector';`, false, {
+ id: 'ember-inflector.globals',
+ until: '3.0.0'
+ });
+
+ return _system.singularize;
+ }
+ });
+
+ Object.defineProperty(Ember.String, 'pluralize', {
+ get() {
+ Ember.deprecate(`Ember.String.pluralize() is deprecated. Please explicitly: import { pluralize } from 'ember-inflector';`, false, {
+ id: 'ember-inflector.globals',
+ until: '3.0.0'
+ });
+
+ return _system.pluralize;
+ }
+ });
+
+ exports.default = _system.Inflector;
+ exports.pluralize = _system.pluralize;
+ exports.singularize = _system.singularize;
+ exports.defaultRules = _system.defaultRules;
+});
+;define('ember-inflector/lib/ext/string', ['ember-inflector/lib/system/string'], function (_string) {
+ 'use strict';
+
+ if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.String) {
+ /**
+ See {{#crossLink "Ember.String/pluralize"}}{{/crossLink}}
+ @method pluralize
+ @for String
+ */
+ Object.defineProperty(String.prototype, 'pluralize', {
+ get() {
+ Ember.deprecate(`String.prototype.pluralize() is deprecated. Please explicitly: import { pluralize } from 'ember-inflector';`, false, {
+ id: 'ember-inflector.globals',
+ until: '3.0.0'
+ });
+
+ return function () {
+ return (0, _string.pluralize)(this);
+ };
+ }
+ });
+
+ /**
+ See {{#crossLink "Ember.String/singularize"}}{{/crossLink}}
+ @method singularize
+ @for String
+ */
+ Object.defineProperty(String.prototype, 'singularize', {
+ get() {
+ Ember.deprecate(`String.prototype.singularize() is deprecated. Please explicitly: import { singularize } from 'ember-inflector';`, false, {
+ id: 'ember-inflector.globals',
+ until: '3.0.0'
+ });
+
+ return function () {
+ return (0, _string.singularize)(this);
+ };
+ }
+ });
+ }
+});
+;define('ember-inflector/lib/helpers/pluralize', ['exports', 'ember-inflector', 'ember-inflector/lib/utils/make-helper'], function (exports, _emberInflector, _makeHelper) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = (0, _makeHelper.default)(function (params, hash) {
+ let count,
+ word,
+ withoutCount = false;
+
+ if (params.length === 1) {
+ word = params[0];
+ return (0, _emberInflector.pluralize)(word);
+ } else {
+ count = params[0];
+ word = params[1];
+
+ if (hash["without-count"]) {
+ withoutCount = hash["without-count"];
+ }
+
+ if (parseFloat(count) !== 1) {
+ word = (0, _emberInflector.pluralize)(word);
+ }
+
+ return withoutCount ? word : count + " " + word;
+ }
+ });
+});
+;define('ember-inflector/lib/helpers/singularize', ['exports', 'ember-inflector', 'ember-inflector/lib/utils/make-helper'], function (exports, _emberInflector, _makeHelper) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = (0, _makeHelper.default)(function (params) {
+ return (0, _emberInflector.singularize)(params[0]);
+ });
+});
+;define("ember-inflector/lib/system", ["exports", "ember-inflector/lib/system/inflector", "ember-inflector/lib/system/string", "ember-inflector/lib/system/inflections"], function (exports, _inflector, _string, _inflections) {
+ "use strict";
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.defaultRules = exports.pluralize = exports.singularize = exports.Inflector = undefined;
+
+
+ _inflector.default.inflector = new _inflector.default(_inflections.default);
+
+ exports.Inflector = _inflector.default;
+ exports.singularize = _string.singularize;
+ exports.pluralize = _string.pluralize;
+ exports.defaultRules = _inflections.default;
+});
+;define('ember-inflector/lib/system/inflections', ['exports'], function (exports) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = {
+ plurals: [[/$/, 's'], [/s$/i, 's'], [/^(ax|test)is$/i, '$1es'], [/(octop|vir)us$/i, '$1i'], [/(octop|vir)i$/i, '$1i'], [/(alias|status|bonus)$/i, '$1es'], [/(bu)s$/i, '$1ses'], [/(buffal|tomat)o$/i, '$1oes'], [/([ti])um$/i, '$1a'], [/([ti])a$/i, '$1a'], [/sis$/i, 'ses'], [/(?:([^f])fe|([lr])f)$/i, '$1$2ves'], [/(hive)$/i, '$1s'], [/([^aeiouy]|qu)y$/i, '$1ies'], [/(x|ch|ss|sh)$/i, '$1es'], [/(matr|vert|ind)(?:ix|ex)$/i, '$1ices'], [/^(m|l)ouse$/i, '$1ice'], [/^(m|l)ice$/i, '$1ice'], [/^(ox)$/i, '$1en'], [/^(oxen)$/i, '$1'], [/(quiz)$/i, '$1zes']],
+
+ singular: [[/s$/i, ''], [/(ss)$/i, '$1'], [/(n)ews$/i, '$1ews'], [/([ti])a$/i, '$1um'], [/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)(sis|ses)$/i, '$1sis'], [/(^analy)(sis|ses)$/i, '$1sis'], [/([^f])ves$/i, '$1fe'], [/(hive)s$/i, '$1'], [/(tive)s$/i, '$1'], [/([lr])ves$/i, '$1f'], [/([^aeiouy]|qu)ies$/i, '$1y'], [/(s)eries$/i, '$1eries'], [/(m)ovies$/i, '$1ovie'], [/(x|ch|ss|sh)es$/i, '$1'], [/^(m|l)ice$/i, '$1ouse'], [/(bus)(es)?$/i, '$1'], [/(o)es$/i, '$1'], [/(shoe)s$/i, '$1'], [/(cris|test)(is|es)$/i, '$1is'], [/^(a)x[ie]s$/i, '$1xis'], [/(octop|vir)(us|i)$/i, '$1us'], [/(alias|status|bonus)(es)?$/i, '$1'], [/^(ox)en/i, '$1'], [/(vert|ind)ices$/i, '$1ex'], [/(matr)ices$/i, '$1ix'], [/(quiz)zes$/i, '$1'], [/(database)s$/i, '$1']],
+
+ irregularPairs: [['person', 'people'], ['man', 'men'], ['child', 'children'], ['sex', 'sexes'], ['move', 'moves'], ['cow', 'kine'], ['zombie', 'zombies']],
+
+ uncountable: ['equipment', 'information', 'rice', 'money', 'species', 'series', 'fish', 'sheep', 'jeans', 'police']
+ };
+});
+;define('ember-inflector/lib/system/inflector', ['exports'], function (exports) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+
+
+ var capitalize = Ember.String.capitalize;
+
+ var BLANK_REGEX = /^\s*$/;
+ var LAST_WORD_DASHED_REGEX = /([\w/-]+[_/\s-])([a-z\d]+$)/;
+ var LAST_WORD_CAMELIZED_REGEX = /([\w/\s-]+)([A-Z][a-z\d]*$)/;
+ var CAMELIZED_REGEX = /[A-Z][a-z\d]*$/;
+
+ function loadUncountable(rules, uncountable) {
+ for (var i = 0, length = uncountable.length; i < length; i++) {
+ rules.uncountable[uncountable[i].toLowerCase()] = true;
+ }
+ }
+
+ function loadIrregular(rules, irregularPairs) {
+ var pair;
+
+ for (var i = 0, length = irregularPairs.length; i < length; i++) {
+ pair = irregularPairs[i];
+
+ //pluralizing
+ rules.irregular[pair[0].toLowerCase()] = pair[1];
+ rules.irregular[pair[1].toLowerCase()] = pair[1];
+
+ //singularizing
+ rules.irregularInverse[pair[1].toLowerCase()] = pair[0];
+ rules.irregularInverse[pair[0].toLowerCase()] = pair[0];
+ }
+ }
+
+ /**
+ Inflector.Ember provides a mechanism for supplying inflection rules for your
+ application. Ember includes a default set of inflection rules, and provides an
+ API for providing additional rules.
+
+ Examples:
+
+ Creating an inflector with no rules.
+
+ ```js
+ var inflector = new Ember.Inflector();
+ ```
+
+ Creating an inflector with the default ember ruleset.
+
+ ```js
+ var inflector = new Ember.Inflector(Ember.Inflector.defaultRules);
+
+ inflector.pluralize('cow'); //=> 'kine'
+ inflector.singularize('kine'); //=> 'cow'
+ ```
+
+ Creating an inflector and adding rules later.
+
+ ```javascript
+ var inflector = Ember.Inflector.inflector;
+
+ inflector.pluralize('advice'); // => 'advices'
+ inflector.uncountable('advice');
+ inflector.pluralize('advice'); // => 'advice'
+
+ inflector.pluralize('formula'); // => 'formulas'
+ inflector.irregular('formula', 'formulae');
+ inflector.pluralize('formula'); // => 'formulae'
+
+ // you would not need to add these as they are the default rules
+ inflector.plural(/$/, 's');
+ inflector.singular(/s$/i, '');
+ ```
+
+ Creating an inflector with a nondefault ruleset.
+
+ ```javascript
+ var rules = {
+ plurals: [
+ [ /$/, 's' ]
+ ],
+ singular: [
+ [ /\s$/, '' ]
+ ],
+ irregularPairs: [
+ [ 'cow', 'kine' ]
+ ],
+ uncountable: [ 'fish' ]
+ };
+
+ var inflector = new Ember.Inflector(rules);
+ ```
+
+ @class Inflector
+ @namespace Ember
+ */
+ function Inflector(ruleSet) {
+ ruleSet = ruleSet || {};
+ ruleSet.uncountable = ruleSet.uncountable || makeDictionary();
+ ruleSet.irregularPairs = ruleSet.irregularPairs || makeDictionary();
+
+ var rules = this.rules = {
+ plurals: ruleSet.plurals || [],
+ singular: ruleSet.singular || [],
+ irregular: makeDictionary(),
+ irregularInverse: makeDictionary(),
+ uncountable: makeDictionary()
+ };
+
+ loadUncountable(rules, ruleSet.uncountable);
+ loadIrregular(rules, ruleSet.irregularPairs);
+
+ this.enableCache();
+ }
+
+ if (!Object.create && !Object.create(null).hasOwnProperty) {
+ throw new Error("This browser does not support Object.create(null), please polyfil with es5-sham: http://git.io/yBU2rg");
+ }
+
+ function makeDictionary() {
+ var cache = Object.create(null);
+ cache['_dict'] = null;
+ delete cache['_dict'];
+ return cache;
+ }
+
+ Inflector.prototype = {
+ /**
+ @public
+ As inflections can be costly, and commonly the same subset of words are repeatedly
+ inflected an optional cache is provided.
+ @method enableCache
+ */
+ enableCache: function () {
+ this.purgeCache();
+
+ this.singularize = function (word) {
+ this._cacheUsed = true;
+ return this._sCache[word] || (this._sCache[word] = this._singularize(word));
+ };
+
+ this.pluralize = function (word) {
+ this._cacheUsed = true;
+ return this._pCache[word] || (this._pCache[word] = this._pluralize(word));
+ };
+ },
+
+ /**
+ @public
+ @method purgedCache
+ */
+ purgeCache: function () {
+ this._cacheUsed = false;
+ this._sCache = makeDictionary();
+ this._pCache = makeDictionary();
+ },
+
+ /**
+ @public
+ disable caching
+ @method disableCache;
+ */
+ disableCache: function () {
+ this._sCache = null;
+ this._pCache = null;
+ this.singularize = function (word) {
+ return this._singularize(word);
+ };
+
+ this.pluralize = function (word) {
+ return this._pluralize(word);
+ };
+ },
+
+ /**
+ @method plural
+ @param {RegExp} regex
+ @param {String} string
+ */
+ plural: function (regex, string) {
+ if (this._cacheUsed) {
+ this.purgeCache();
+ }
+ this.rules.plurals.push([regex, string.toLowerCase()]);
+ },
+
+ /**
+ @method singular
+ @param {RegExp} regex
+ @param {String} string
+ */
+ singular: function (regex, string) {
+ if (this._cacheUsed) {
+ this.purgeCache();
+ }
+ this.rules.singular.push([regex, string.toLowerCase()]);
+ },
+
+ /**
+ @method uncountable
+ @param {String} regex
+ */
+ uncountable: function (string) {
+ if (this._cacheUsed) {
+ this.purgeCache();
+ }
+ loadUncountable(this.rules, [string.toLowerCase()]);
+ },
+
+ /**
+ @method irregular
+ @param {String} singular
+ @param {String} plural
+ */
+ irregular: function (singular, plural) {
+ if (this._cacheUsed) {
+ this.purgeCache();
+ }
+ loadIrregular(this.rules, [[singular, plural]]);
+ },
+
+ /**
+ @method pluralize
+ @param {String} word
+ */
+ pluralize: function (word) {
+ return this._pluralize(word);
+ },
+
+ _pluralize: function (word) {
+ return this.inflect(word, this.rules.plurals, this.rules.irregular);
+ },
+ /**
+ @method singularize
+ @param {String} word
+ */
+ singularize: function (word) {
+ return this._singularize(word);
+ },
+
+ _singularize: function (word) {
+ return this.inflect(word, this.rules.singular, this.rules.irregularInverse);
+ },
+
+ /**
+ @protected
+ @method inflect
+ @param {String} word
+ @param {Object} typeRules
+ @param {Object} irregular
+ */
+ inflect: function (word, typeRules, irregular) {
+ var inflection, substitution, result, lowercase, wordSplit, firstPhrase, lastWord, isBlank, isCamelized, rule, isUncountable;
+
+ isBlank = !word || BLANK_REGEX.test(word);
+
+ isCamelized = CAMELIZED_REGEX.test(word);
+ firstPhrase = "";
+
+ if (isBlank) {
+ return word;
+ }
+
+ lowercase = word.toLowerCase();
+ wordSplit = LAST_WORD_DASHED_REGEX.exec(word) || LAST_WORD_CAMELIZED_REGEX.exec(word);
+
+ if (wordSplit) {
+ firstPhrase = wordSplit[1];
+ lastWord = wordSplit[2].toLowerCase();
+ }
+
+ isUncountable = this.rules.uncountable[lowercase] || this.rules.uncountable[lastWord];
+
+ if (isUncountable) {
+ return word;
+ }
+
+ for (rule in irregular) {
+ if (lowercase.match(rule + "$")) {
+ substitution = irregular[rule];
+
+ if (isCamelized && irregular[lastWord]) {
+ substitution = capitalize(substitution);
+ rule = capitalize(rule);
+ }
+
+ return word.replace(new RegExp(rule, 'i'), substitution);
+ }
+ }
+
+ for (var i = typeRules.length, min = 0; i > min; i--) {
+ inflection = typeRules[i - 1];
+ rule = inflection[0];
+
+ if (rule.test(word)) {
+ break;
+ }
+ }
+
+ inflection = inflection || [];
+
+ rule = inflection[0];
+ substitution = inflection[1];
+
+ result = word.replace(rule, substitution);
+
+ return result;
+ }
+ };
+
+ exports.default = Inflector;
+});
+;define('ember-inflector/lib/system/string', ['exports', 'ember-inflector/lib/system/inflector'], function (exports, _inflector) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.singularize = exports.pluralize = undefined;
+
+
+ function pluralize(word) {
+ return _inflector.default.inflector.pluralize(word);
+ }
+
+ function singularize(word) {
+ return _inflector.default.inflector.singularize(word);
+ }
+
+ exports.pluralize = pluralize;
+ exports.singularize = singularize;
+});
+;define('ember-inflector/lib/utils/make-helper', ['exports'], function (exports) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = makeHelper;
+ function makeHelper(helperFunction) {
+ if (Ember.Helper) {
+ return Ember.Helper.helper(helperFunction);
+ }
+ if (Ember.HTMLBars) {
+ return Ember.HTMLBars.makeBoundHelper(helperFunction);
+ }
+ return Ember.Handlebars.makeBoundHelper(helperFunction);
+ }
+});
+;define('ember-load-initializers/index', ['exports'], function (exports) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+
+ exports.default = function (app, prefix) {
+ var initializerPrefix = prefix + '/initializers/';
+ var instanceInitializerPrefix = prefix + '/instance-initializers/';
+ var initializers = [];
+ var instanceInitializers = [];
+ // this is 2 pass because generally the first pass is the problem
+ // and is reduced, and resolveInitializer has potential to deopt
+ var moduleNames = Object.keys(requirejs._eak_seen);
+ for (var i = 0; i < moduleNames.length; i++) {
+ var moduleName = moduleNames[i];
+ if (moduleName.lastIndexOf(initializerPrefix, 0) === 0) {
+ initializers.push(moduleName);
+ } else if (moduleName.lastIndexOf(instanceInitializerPrefix, 0) === 0) {
+ instanceInitializers.push(moduleName);
+ }
+ }
+ registerInitializers(app, initializers);
+ registerInstanceInitializers(app, instanceInitializers);
+ };
+
+ function resolveInitializer(moduleName) {
+ var module = require(moduleName, null, null, true);
+ if (!module) {
+ throw new Error(moduleName + ' must export an initializer.');
+ }
+ var initializer = module['default'];
+ if (!initializer.name) {
+ initializer.name = moduleName.slice(moduleName.lastIndexOf('/') + 1);
+ }
+ return initializer;
+ }
+
+ function registerInitializers(app, moduleNames) {
+ for (var i = 0; i < moduleNames.length; i++) {
+ app.initializer(resolveInitializer(moduleNames[i]));
+ }
+ }
+
+ function registerInstanceInitializers(app, moduleNames) {
+ for (var i = 0; i < moduleNames.length; i++) {
+ app.instanceInitializer(resolveInitializer(moduleNames[i]));
+ }
+ }
+});
+;/*
+ * This is a stub file, it must be on disk b/c babel-plugin-debug-macros
+ * does not strip the module require when the transpiled variable usage is
+ * stripped.
+ */
+define("ember-resolver/features", [], function () {
+ "use strict";
+});
+;define('ember-resolver/index', ['exports', 'ember-resolver/resolvers/classic'], function (exports, _classic) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function () {
+ return _classic.default;
+ }
+ });
+});
+;define('ember-resolver/resolver', ['exports', 'ember-resolver/resolvers/classic'], function (exports, _classic) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function () {
+ return _classic.default;
+ }
+ });
+});
+;define('ember-resolver/resolvers/classic/container-debug-adapter', ['exports', 'ember-resolver/resolvers/classic/index'], function (exports, _index) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+
+
+ const { ContainerDebugAdapter } = Ember;
+
+ function getPod(type, key, prefix) {
+ let match = key.match(new RegExp('^/?' + prefix + '/(.+)/' + type + '$'));
+ if (match !== null) {
+ return match[1];
+ }
+ }
+
+ /*
+ * This module defines a subclass of Ember.ContainerDebugAdapter that adds
+ * support for resolving from modules.
+ *
+ */
+ exports.default = ContainerDebugAdapter.extend({
+ _moduleRegistry: null,
+
+ init() {
+ this._super(...arguments);
+
+ if (!this._moduleRegistry) {
+ this._moduleRegistry = new _index.ModuleRegistry();
+ }
+ },
+
+ /**
+ The container of the application being debugged.
+ This property will be injected
+ on creation.
+ @property container
+ @default null
+ */
+
+ /**
+ The resolver instance of the application
+ being debugged. This property will be injected
+ on creation.
+ @property resolver
+ @default null
+ */
+
+ /**
+ Returns true if it is possible to catalog a list of available
+ classes in the resolver for a given type.
+ @method canCatalogEntriesByType
+ @param {string} type The type. e.g. "model", "controller", "route"
+ @return {boolean} whether a list is available for this type.
+ */
+ canCatalogEntriesByType(type) {
+ if (type === 'model') {
+ return true;
+ }
+ return this._super(...arguments);
+ },
+
+ /**
+ Returns the available classes a given type.
+ @method catalogEntriesByType
+ @param {string} type The type. e.g. "model", "controller", "route"
+ @return {Array} An array of classes.
+ */
+ catalogEntriesByType(type) {
+ let moduleNames = this._moduleRegistry.moduleNames();
+ let types = Ember.A();
+
+ let prefix = this.namespace.modulePrefix;
+
+ for (let i = 0, l = moduleNames.length; i < l; i++) {
+ let key = moduleNames[i];
+
+ if (key.indexOf(type) !== -1) {
+ // Check if it's a pod module
+ let name = getPod(type, key, this.namespace.podModulePrefix || prefix);
+ if (!name) {
+ // Not pod
+ name = key.split(type + 's/').pop();
+
+ // Support for different prefix (such as ember-cli addons).
+ // Uncomment the code below when
+ // https://github.com/ember-cli/ember-resolver/pull/80 is merged.
+
+ //let match = key.match('^/?(.+)/' + type);
+ //if (match && match[1] !== prefix) {
+ // Different prefix such as an addon
+ //name = match[1] + '@' + name;
+ //}
+ }
+ types.addObject(name);
+ }
+ }
+ return types;
+ }
+ });
+});
+;define('ember-resolver/resolvers/classic/index', ['exports', 'ember-resolver/utils/class-factory', 'ember-resolver/utils/make-dictionary'], function (exports, _classFactory, _makeDictionary) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.ModuleRegistry = undefined;
+
+
+ if (typeof requirejs.entries === 'undefined') {
+ requirejs.entries = requirejs._eak_seen;
+ } /* globals requirejs, require */
+
+ class ModuleRegistry {
+ constructor(entries) {
+ this._entries = entries || requirejs.entries;
+ }
+ moduleNames() {
+ return Object.keys(this._entries);
+ }
+ has(moduleName) {
+ return moduleName in this._entries;
+ }
+ get(moduleName) {
+ return require(moduleName);
+ }
+ }
+
+ exports.ModuleRegistry = ModuleRegistry;
+ /*
+ * This module defines a subclass of Ember.DefaultResolver that adds two
+ * important features:
+ *
+ * 1) The resolver makes the container aware of es6 modules via the AMD
+ * output. The loader's _moduleEntries is consulted so that classes can be
+ * resolved directly via the module loader, without needing a manual
+ * `import`.
+ * 2) is able to provide injections to classes that implement `extend`
+ * (as is typical with Ember).
+ */
+
+ const {
+ underscore,
+ classify,
+ dasherize
+ } = Ember.String;
+ const {
+ get,
+ DefaultResolver
+ } = Ember;
+
+ function parseName(fullName) {
+ if (fullName.parsedName === true) {
+ return fullName;
+ }
+
+ let prefix, type, name;
+ let fullNameParts = fullName.split('@');
+
+ // HTMLBars uses helper:@content-helper which collides
+ // with ember-cli namespace detection.
+ // This will be removed in a future release of HTMLBars.
+ if (fullName !== 'helper:@content-helper' && fullNameParts.length === 2) {
+ let prefixParts = fullNameParts[0].split(':');
+
+ if (prefixParts.length === 2) {
+ prefix = prefixParts[1];
+ type = prefixParts[0];
+ name = fullNameParts[1];
+ } else {
+ let nameParts = fullNameParts[1].split(':');
+
+ prefix = fullNameParts[0];
+ type = nameParts[0];
+ name = nameParts[1];
+ }
+
+ if (type === 'template' && prefix.lastIndexOf('components/', 0) === 0) {
+ name = `components/${name}`;
+ prefix = prefix.slice(11);
+ }
+ } else {
+ fullNameParts = fullName.split(':');
+ type = fullNameParts[0];
+ name = fullNameParts[1];
+ }
+
+ let fullNameWithoutType = name;
+ let namespace = get(this, 'namespace');
+ let root = namespace;
+
+ return {
+ parsedName: true,
+ fullName: fullName,
+ prefix: prefix || this.prefix({ type: type }),
+ type: type,
+ fullNameWithoutType: fullNameWithoutType,
+ name: name,
+ root: root,
+ resolveMethodName: "resolve" + classify(type)
+ };
+ }
+
+ function resolveOther(parsedName) {
+ Ember.assert('`modulePrefix` must be defined', this.namespace.modulePrefix);
+
+ let normalizedModuleName = this.findModuleName(parsedName);
+
+ if (normalizedModuleName) {
+ let defaultExport = this._extractDefaultExport(normalizedModuleName, parsedName);
+
+ if (defaultExport === undefined) {
+ throw new Error(` Expected to find: '${parsedName.fullName}' within '${normalizedModuleName}' but got 'undefined'. Did you forget to 'export default' within '${normalizedModuleName}'?`);
+ }
+
+ if (this.shouldWrapInClassFactory(defaultExport, parsedName)) {
+ defaultExport = (0, _classFactory.default)(defaultExport);
+ }
+
+ return defaultExport;
+ } else {
+ return this._super(parsedName);
+ }
+ }
+
+ // Ember.DefaultResolver docs:
+ // https://github.com/emberjs/ember.js/blob/master/packages/ember-application/lib/system/resolver.js
+ const Resolver = DefaultResolver.extend({
+ resolveOther,
+ parseName,
+ resolveTemplate: resolveOther,
+ pluralizedTypes: null,
+ moduleRegistry: null,
+
+ makeToString(factory, fullName) {
+ return '' + this.namespace.modulePrefix + '@' + fullName + ':';
+ },
+
+ shouldWrapInClassFactory() /* module, parsedName */{
+ return false;
+ },
+
+ init() {
+ this._super();
+ this.moduleBasedResolver = true;
+
+ if (!this._moduleRegistry) {
+ this._moduleRegistry = new ModuleRegistry();
+ }
+
+ this._normalizeCache = (0, _makeDictionary.default)();
+
+ this.pluralizedTypes = this.pluralizedTypes || (0, _makeDictionary.default)();
+
+ if (!this.pluralizedTypes.config) {
+ this.pluralizedTypes.config = 'config';
+ }
+ this._deprecatedPodModulePrefix = false;
+ },
+
+ normalize(fullName) {
+ return this._normalizeCache[fullName] || (this._normalizeCache[fullName] = this._normalize(fullName));
+ },
+
+ _normalize(fullName) {
+ // A) Convert underscores to dashes
+ // B) Convert camelCase to dash-case, except for helpers where we want to avoid shadowing camelCase expressions
+ // C) replace `.` with `/` in order to make nested controllers work in the following cases
+ // 1. `needs: ['posts/post']`
+ // 2. `{{render "posts/post"}}`
+ // 3. `this.render('posts/post')` from Route
+
+ let split = fullName.split(':');
+ if (split.length > 1) {
+ if (split[0] === 'helper') {
+ return split[0] + ':' + split[1].replace(/_/g, '-');
+ } else {
+ return split[0] + ':' + dasherize(split[1].replace(/\./g, '/'));
+ }
+ } else {
+ return fullName;
+ }
+ },
+
+ pluralize(type) {
+ return this.pluralizedTypes[type] || (this.pluralizedTypes[type] = type + 's');
+ },
+
+ podBasedLookupWithPrefix(podPrefix, parsedName) {
+ let fullNameWithoutType = parsedName.fullNameWithoutType;
+
+ if (parsedName.type === 'template') {
+ fullNameWithoutType = fullNameWithoutType.replace(/^components\//, '');
+ }
+
+ return podPrefix + '/' + fullNameWithoutType + '/' + parsedName.type;
+ },
+
+ podBasedModuleName(parsedName) {
+ let podPrefix = this.namespace.podModulePrefix || this.namespace.modulePrefix;
+
+ return this.podBasedLookupWithPrefix(podPrefix, parsedName);
+ },
+
+ podBasedComponentsInSubdir(parsedName) {
+ let podPrefix = this.namespace.podModulePrefix || this.namespace.modulePrefix;
+ podPrefix = podPrefix + '/components';
+
+ if (parsedName.type === 'component' || /^components/.test(parsedName.fullNameWithoutType)) {
+ return this.podBasedLookupWithPrefix(podPrefix, parsedName);
+ }
+ },
+
+ resolveEngine(parsedName) {
+ let engineName = parsedName.fullNameWithoutType;
+ let engineModule = engineName + '/engine';
+
+ if (this._moduleRegistry.has(engineModule)) {
+ return this._extractDefaultExport(engineModule);
+ }
+ },
+
+ resolveRouteMap(parsedName) {
+ let engineName = parsedName.fullNameWithoutType;
+ let engineRoutesModule = engineName + '/routes';
+
+ if (this._moduleRegistry.has(engineRoutesModule)) {
+ let routeMap = this._extractDefaultExport(engineRoutesModule);
+
+ Ember.assert(`The route map for ${engineName} should be wrapped by 'buildRoutes' before exporting.`, routeMap.isRouteMap);
+
+ return routeMap;
+ }
+ },
+
+ mainModuleName(parsedName) {
+ // if router:main or adapter:main look for a module with just the type first
+ let tmpModuleName = parsedName.prefix + '/' + parsedName.type;
+
+ if (parsedName.fullNameWithoutType === 'main') {
+ return tmpModuleName;
+ }
+ },
+
+ defaultModuleName(parsedName) {
+ return parsedName.prefix + '/' + this.pluralize(parsedName.type) + '/' + parsedName.fullNameWithoutType;
+ },
+
+ prefix(parsedName) {
+ let tmpPrefix = this.namespace.modulePrefix;
+
+ if (this.namespace[parsedName.type + 'Prefix']) {
+ tmpPrefix = this.namespace[parsedName.type + 'Prefix'];
+ }
+
+ return tmpPrefix;
+ },
+
+ /**
+ A listing of functions to test for moduleName's based on the provided
+ `parsedName`. This allows easy customization of additional module based
+ lookup patterns.
+ @property moduleNameLookupPatterns
+ @returns {Ember.Array}
+ */
+ moduleNameLookupPatterns: Ember.computed(function () {
+ return [this.podBasedModuleName, this.podBasedComponentsInSubdir, this.mainModuleName, this.defaultModuleName];
+ }).readOnly(),
+
+ findModuleName(parsedName, loggingDisabled) {
+ let moduleNameLookupPatterns = this.get('moduleNameLookupPatterns');
+ let moduleName;
+
+ for (let index = 0, length = moduleNameLookupPatterns.length; index < length; index++) {
+ let item = moduleNameLookupPatterns[index];
+
+ let tmpModuleName = item.call(this, parsedName);
+
+ // allow treat all dashed and all underscored as the same thing
+ // supports components with dashes and other stuff with underscores.
+ if (tmpModuleName) {
+ tmpModuleName = this.chooseModuleName(tmpModuleName, parsedName);
+ }
+
+ if (tmpModuleName && this._moduleRegistry.has(tmpModuleName)) {
+ moduleName = tmpModuleName;
+ }
+
+ if (!loggingDisabled) {
+ this._logLookup(moduleName, parsedName, tmpModuleName);
+ }
+
+ if (moduleName) {
+ return moduleName;
+ }
+ }
+ },
+
+ chooseModuleName(moduleName, parsedName) {
+ let underscoredModuleName = underscore(moduleName);
+
+ if (moduleName !== underscoredModuleName && this._moduleRegistry.has(moduleName) && this._moduleRegistry.has(underscoredModuleName)) {
+ throw new TypeError(`Ambiguous module names: '${moduleName}' and '${underscoredModuleName}'`);
+ }
+
+ if (this._moduleRegistry.has(moduleName)) {
+ return moduleName;
+ } else if (this._moduleRegistry.has(underscoredModuleName)) {
+ return underscoredModuleName;
+ }
+ // workaround for dasherized partials:
+ // something/something/-something => something/something/_something
+ let partializedModuleName = moduleName.replace(/\/-([^/]*)$/, '/_$1');
+
+ if (this._moduleRegistry.has(partializedModuleName)) {
+ Ember.deprecate('Modules should not contain underscores. ' + 'Attempted to lookup "' + moduleName + '" which ' + 'was not found. Please rename "' + partializedModuleName + '" ' + 'to "' + moduleName + '" instead.', false, { id: 'ember-resolver.underscored-modules', until: '3.0.0' });
+
+ return partializedModuleName;
+ }
+
+ Ember.runInDebug(() => {
+ let isCamelCaseHelper = parsedName.type === 'helper' && /[a-z]+[A-Z]+/.test(moduleName);
+ if (isCamelCaseHelper) {
+ this._camelCaseHelperWarnedNames = this._camelCaseHelperWarnedNames || [];
+ let alreadyWarned = this._camelCaseHelperWarnedNames.indexOf(parsedName.fullName) > -1;
+ if (!alreadyWarned && this._moduleRegistry.has(dasherize(moduleName))) {
+ this._camelCaseHelperWarnedNames.push(parsedName.fullName);
+ Ember.warn('Attempted to lookup "' + parsedName.fullName + '" which ' + 'was not found. In previous versions of ember-resolver, a bug would have ' + 'caused the module at "' + dasherize(moduleName) + '" to be ' + 'returned for this camel case helper name. This has been fixed. ' + 'Use the dasherized name to resolve the module that would have been ' + 'returned in previous versions.', false, { id: 'ember-resolver.camelcase-helper-names', until: '3.0.0' });
+ }
+ }
+ });
+ },
+
+ // used by Ember.DefaultResolver.prototype._logLookup
+ lookupDescription(fullName) {
+ let parsedName = this.parseName(fullName);
+
+ let moduleName = this.findModuleName(parsedName, true);
+
+ return moduleName;
+ },
+
+ // only needed until 1.6.0-beta.2 can be required
+ _logLookup(found, parsedName, description) {
+ if (!Ember.ENV.LOG_MODULE_RESOLVER && !parsedName.root.LOG_RESOLVER) {
+ return;
+ }
+
+ let padding;
+ let symbol = found ? '[✓]' : '[ ]';
+
+ if (parsedName.fullName.length > 60) {
+ padding = '.';
+ } else {
+ padding = new Array(60 - parsedName.fullName.length).join('.');
+ }
+
+ if (!description) {
+ description = this.lookupDescription(parsedName);
+ }
+
+ if (console && console.info) {
+ // eslint-disable-next-line no-console
+ console.info(symbol, parsedName.fullName, padding, description);
+ }
+ },
+
+ knownForType(type) {
+ let moduleKeys = this._moduleRegistry.moduleNames();
+
+ let items = (0, _makeDictionary.default)();
+ for (let index = 0, length = moduleKeys.length; index < length; index++) {
+ let moduleName = moduleKeys[index];
+ let fullname = this.translateToContainerFullname(type, moduleName);
+
+ if (fullname) {
+ items[fullname] = true;
+ }
+ }
+
+ return items;
+ },
+
+ translateToContainerFullname(type, moduleName) {
+ let prefix = this.prefix({ type });
+
+ // Note: using string manipulation here rather than regexes for better performance.
+ // pod modules
+ // '^' + prefix + '/(.+)/' + type + '$'
+ let podPrefix = prefix + '/';
+ let podSuffix = '/' + type;
+ let start = moduleName.indexOf(podPrefix);
+ let end = moduleName.indexOf(podSuffix);
+
+ if (start === 0 && end === moduleName.length - podSuffix.length && moduleName.length > podPrefix.length + podSuffix.length) {
+ return type + ':' + moduleName.slice(start + podPrefix.length, end);
+ }
+
+ // non-pod modules
+ // '^' + prefix + '/' + pluralizedType + '/(.+)$'
+ let pluralizedType = this.pluralize(type);
+ let nonPodPrefix = prefix + '/' + pluralizedType + '/';
+
+ if (moduleName.indexOf(nonPodPrefix) === 0 && moduleName.length > nonPodPrefix.length) {
+ return type + ':' + moduleName.slice(nonPodPrefix.length);
+ }
+ },
+
+ _extractDefaultExport(normalizedModuleName) {
+ let module = require(normalizedModuleName, null, null, true /* force sync */);
+
+ if (module && module['default']) {
+ module = module['default'];
+ }
+
+ return module;
+ }
+ });
+
+ Resolver.reopenClass({
+ moduleBasedResolver: true
+ });
+
+ exports.default = Resolver;
+});
+;define('ember-resolver/utils/class-factory', ['exports'], function (exports) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = classFactory;
+ function classFactory(klass) {
+ return {
+ create(injections) {
+ if (typeof klass.extend === 'function') {
+ return klass.extend(injections);
+ } else {
+ return klass;
+ }
+ }
+ };
+ }
+});
+;define('ember-resolver/utils/make-dictionary', ['exports'], function (exports) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = makeDictionary;
+ function makeDictionary() {
+ let cache = Object.create(null);
+ cache['_dict'] = null;
+ delete cache['_dict'];
+ return cache;
+ }
+});
+;define('ember-welcome-page/components/welcome-page', ['exports', 'ember-welcome-page/templates/components/welcome-page'], function (exports, _welcomePage) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = Ember.Component.extend({
+ layout: _welcomePage.default,
+
+ emberVersion: Ember.computed(function () {
+ let [major, minor] = Ember.VERSION.split(".");
+
+ return `${major}.${minor}.0`;
+ })
+ });
+});
+;define("ember-welcome-page/templates/components/welcome-page", ["exports"], function (exports) {
+ "use strict";
+
+ exports.__esModule = true;
+ exports.default = Ember.HTMLBars.template({ "id": "D2iezqDS", "block": "{\"symbols\":[],\"statements\":[[6,\"div\"],[9,\"id\",\"ember-welcome-page-id-selector\"],[10,\"data-ember-version\",[26,[[18,\"emberVersion\"]]]],[7],[0,\"\\n \"],[6,\"div\"],[9,\"class\",\"columns\"],[7],[0,\"\\n \"],[6,\"div\"],[9,\"class\",\"tomster\"],[7],[0,\"\\n \"],[6,\"img\"],[9,\"src\",\"ember-welcome-page/images/construction.png\"],[9,\"alt\",\"Under construction\"],[7],[8],[0,\"\\n \"],[8],[0,\"\\n \"],[6,\"div\"],[9,\"class\",\"welcome\"],[7],[0,\"\\n \"],[6,\"h2\"],[9,\"id\",\"title\"],[7],[0,\"Congratulations, you made it!\"],[8],[0,\"\\n\\n \"],[6,\"p\"],[7],[0,\"You’ve officially spun up your very first Ember app :-)\"],[8],[0,\"\\n \"],[6,\"p\"],[7],[0,\"You’ve got one more decision to make: what do you want to do next? We’d suggest one of the following to help you get going:\"],[8],[0,\"\\n \"],[6,\"ol\"],[7],[0,\"\\n \"],[6,\"li\"],[7],[6,\"a\"],[10,\"href\",[26,[\"https://guides.emberjs.com/v\",[18,\"emberVersion\"],\"/getting-started/quick-start/\"]]],[7],[0,\"Quick Start\"],[8],[0,\" - a quick introduction to how Ember works. Learn about defining your first route, writing a UI component and deploying your application.\"],[8],[0,\"\\n \"],[6,\"li\"],[7],[6,\"a\"],[10,\"href\",[26,[\"https://guides.emberjs.com/v\",[18,\"emberVersion\"],\"/tutorial/ember-cli/\"]]],[7],[0,\"Ember Guides\"],[8],[0,\" - this is our more thorough, hands-on intro to Ember. Your crash course in Ember philosophy, background and some in-depth discussion of how things work (and why they work the way they do).\"],[8],[0,\"\\n \"],[8],[0,\"\\n \"],[6,\"p\"],[7],[0,\"If you run into problems, you can check \"],[6,\"a\"],[9,\"href\",\"http://stackoverflow.com/questions/tagged/ember.js\"],[7],[0,\"Stack Overflow\"],[8],[0,\" or \"],[6,\"a\"],[9,\"href\",\"http://discuss.emberjs.com/\"],[7],[0,\"our forums\"],[8],[0,\" for ideas and answers—someone’s probably been through the same thing and already posted an answer. If not, you can post your \"],[6,\"strong\"],[7],[0,\"own\"],[8],[0,\" question. People love to help new Ember developers get started, and our community is incredibly supportive \"],[8],[0,\"\\n \"],[8],[0,\"\\n \"],[8],[0,\"\\n \"],[6,\"p\"],[9,\"class\",\"postscript\"],[7],[0,\"To remove this welcome message, remove the \"],[6,\"code\"],[7],[0,\"{{welcome-page}}\"],[8],[0,\" component from your \"],[6,\"code\"],[7],[0,\"application.hbs\"],[8],[0,\" file.\"],[6,\"br\"],[7],[8],[0,\"You'll see this page update soon after!\"],[8],[0,\"\\n\"],[8],[0,\"\\n\"]],\"hasEval\":false}", "meta": { "moduleName": "ember-welcome-page/templates/components/welcome-page.hbs" } });
+});
+;define('ember-data/-debug/index', ['exports'], function (exports) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.instrument = instrument;
+ function instrument(method) {
+ return method();
+ }
+
+ /*
+ Assert that `addedRecord` has a valid type so it can be added to the
+ relationship of the `record`.
+
+ The assert basically checks if the `addedRecord` can be added to the
+ relationship (specified via `relationshipMeta`) of the `record`.
+
+ This utility should only be used internally, as both record parameters must
+ be an InternalModel and the `relationshipMeta` needs to be the meta
+ information about the relationship, retrieved via
+ `record.relationshipFor(key)`.
+
+ @method assertPolymorphicType
+ @param {InternalModel} internalModel
+ @param {RelationshipMeta} relationshipMeta retrieved via
+ `record.relationshipFor(key)`
+ @param {InternalModel} addedRecord record which
+ should be added/set for the relationship
+ */
+ var assertPolymorphicType = void 0;
+
+ if (true) {
+ var checkPolymorphic = function checkPolymorphic(modelClass, addedModelClass) {
+ if (modelClass.__isMixin) {
+ //TODO Need to do this in order to support mixins, should convert to public api
+ //once it exists in Ember
+ return modelClass.__mixin.detect(addedModelClass.PrototypeMixin);
+ }
+ if (Ember.MODEL_FACTORY_INJECTIONS) {
+ modelClass = modelClass.superclass;
+ }
+ return modelClass.detect(addedModelClass);
+ };
+
+ exports.assertPolymorphicType = assertPolymorphicType = function assertPolymorphicType(parentInternalModel, relationshipMeta, addedInternalModel) {
+ var addedModelName = addedInternalModel.modelName;
+ var parentModelName = parentInternalModel.modelName;
+ var key = relationshipMeta.key;
+ var relationshipModelName = relationshipMeta.type;
+ var relationshipClass = parentInternalModel.store.modelFor(relationshipModelName);
+ var assertionMessage = `You cannot add a record of modelClass '${addedModelName}' to the '${parentModelName}.${key}' relationship (only '${relationshipModelName}' allowed)`;
+
+ (true && !(checkPolymorphic(relationshipClass, addedInternalModel.modelClass)) && Ember.assert(assertionMessage, checkPolymorphic(relationshipClass, addedInternalModel.modelClass)));
+ };
+ }
+
+ exports.assertPolymorphicType = assertPolymorphicType;
+});
+;define('ember-data/-private', ['exports', 'ember-inflector', 'ember-data/-debug', 'ember-data/version'], function (exports, emberInflector, emberData_Debug, VERSION) { 'use strict';
+
+VERSION = 'default' in VERSION ? VERSION['default'] : VERSION;
+
+/**
+ A `PromiseArray` is an object that acts like both an `Ember.Array`
+ and a promise. When the promise is resolved the resulting value
+ will be set to the `PromiseArray`'s `content` property. This makes
+ it easy to create data bindings with the `PromiseArray` that will be
+ updated when the promise resolves.
+
+ For more information see the [Ember.PromiseProxyMixin
+ documentation](/api/classes/Ember.PromiseProxyMixin.html).
+
+ Example
+
+ ```javascript
+ let promiseArray = DS.PromiseArray.create({
+ promise: $.getJSON('/some/remote/data.json')
+ });
+
+ promiseArray.get('length'); // 0
+
+ promiseArray.then(function() {
+ promiseArray.get('length'); // 100
+ });
+ ```
+
+ @class PromiseArray
+ @namespace DS
+ @extends Ember.ArrayProxy
+ @uses Ember.PromiseProxyMixin
+*/
+var PromiseArray = Ember.ArrayProxy.extend(Ember.PromiseProxyMixin, {
+ meta: Ember.computed.reads('content.meta')
+});
+
+/**
+ A `PromiseObject` is an object that acts like both an `Ember.Object`
+ and a promise. When the promise is resolved, then the resulting value
+ will be set to the `PromiseObject`'s `content` property. This makes
+ it easy to create data bindings with the `PromiseObject` that will
+ be updated when the promise resolves.
+
+ For more information see the [Ember.PromiseProxyMixin
+ documentation](/api/classes/Ember.PromiseProxyMixin.html).
+
+ Example
+
+ ```javascript
+ let promiseObject = DS.PromiseObject.create({
+ promise: $.getJSON('/some/remote/data.json')
+ });
+
+ promiseObject.get('name'); // null
+
+ promiseObject.then(function() {
+ promiseObject.get('name'); // 'Tomster'
+ });
+ ```
+
+ @class PromiseObject
+ @namespace DS
+ @extends Ember.ObjectProxy
+ @uses Ember.PromiseProxyMixin
+*/
+var PromiseObject = Ember.ObjectProxy.extend(Ember.PromiseProxyMixin);
+
+function promiseObject(promise, label) {
+ return PromiseObject.create({
+ promise: Ember.RSVP.Promise.resolve(promise, label)
+ });
+}
+
+function promiseArray(promise, label) {
+ return PromiseArray.create({
+ promise: Ember.RSVP.Promise.resolve(promise, label)
+ });
+}
+
+/**
+ A PromiseManyArray is a PromiseArray that also proxies certain method calls
+ to the underlying manyArray.
+ Right now we proxy:
+
+ * `reload()`
+ * `createRecord()`
+ * `on()`
+ * `one()`
+ * `trigger()`
+ * `off()`
+ * `has()`
+
+ @class PromiseManyArray
+ @namespace DS
+ @extends Ember.ArrayProxy
+*/
+
+function proxyToContent(method) {
+ return function () {
+ return Ember.get(this, 'content')[method](...arguments);
+ };
+}
+
+var PromiseManyArray = PromiseArray.extend({
+ reload() {
+ (true && !(Ember.get(this, 'content')) && Ember.assert('You are trying to reload an async manyArray before it has been created', Ember.get(this, 'content')));
+
+ this.set('promise', this.get('content').reload());
+ return this;
+ },
+
+ createRecord: proxyToContent('createRecord'),
+
+ on: proxyToContent('on'),
+
+ one: proxyToContent('one'),
+
+ trigger: proxyToContent('trigger'),
+
+ off: proxyToContent('off'),
+
+ has: proxyToContent('has')
+});
+
+/**
+@module ember-data
+*/
+
+/**
+ Holds validation errors for a given record, organized by attribute names.
+
+ Every `DS.Model` has an `errors` property that is an instance of
+ `DS.Errors`. This can be used to display validation error
+ messages returned from the server when a `record.save()` rejects.
+
+ For Example, if you had a `User` model that looked like this:
+
+ ```app/models/user.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ username: DS.attr('string'),
+ email: DS.attr('string')
+ });
+ ```
+ And you attempted to save a record that did not validate on the backend:
+
+ ```javascript
+ let user = store.createRecord('user', {
+ username: 'tomster',
+ email: 'invalidEmail'
+ });
+ user.save();
+ ```
+
+ Your backend would be expected to return an error response that described
+ the problem, so that error messages can be generated on the app.
+
+ API responses will be translated into instances of `DS.Errors` differently,
+ depending on the specific combination of adapter and serializer used. You
+ may want to check the documentation or the source code of the libraries
+ that you are using, to know how they expect errors to be communicated.
+
+ Errors can be displayed to the user by accessing their property name
+ to get an array of all the error objects for that property. Each
+ error object is a JavaScript object with two keys:
+
+ - `message` A string containing the error message from the backend
+ - `attribute` The name of the property associated with this error message
+
+ ```handlebars
+ <label>Username: {{input value=username}} </label>
+ {{#each model.errors.username as |error|}}
+ <div class="error">
+ {{error.message}}
+ </div>
+ {{/each}}
+
+ <label>Email: {{input value=email}} </label>
+ {{#each model.errors.email as |error|}}
+ <div class="error">
+ {{error.message}}
+ </div>
+ {{/each}}
+ ```
+
+ You can also access the special `messages` property on the error
+ object to get an array of all the error strings.
+
+ ```handlebars
+ {{#each model.errors.messages as |message|}}
+ <div class="error">
+ {{message}}
+ </div>
+ {{/each}}
+ ```
+
+ @class Errors
+ @namespace DS
+ @extends Ember.Object
+ @uses Ember.Enumerable
+ @uses Ember.Evented
+ */
+var Errors = Ember.ArrayProxy.extend(Ember.Evented, {
+ /**
+ Register with target handler
+ @method registerHandlers
+ @param {Object} target
+ @param {Function} becameInvalid
+ @param {Function} becameValid
+ @deprecated
+ */
+ registerHandlers(target, becameInvalid, becameValid) {
+ (true && !(false) && Ember.deprecate(`Record errors will no longer be evented.`, false, {
+ id: 'ds.errors.registerHandlers',
+ until: '3.0.0'
+ }));
+
+
+ this._registerHandlers(target, becameInvalid, becameValid);
+ },
+
+ /**
+ Register with target handler
+ @method _registerHandlers
+ @private
+ */
+ _registerHandlers(target, becameInvalid, becameValid) {
+ this.on('becameInvalid', target, becameInvalid);
+ this.on('becameValid', target, becameValid);
+ },
+
+ /**
+ @property errorsByAttributeName
+ @type {Ember.MapWithDefault}
+ @private
+ */
+ errorsByAttributeName: Ember.computed(function () {
+ return Ember.MapWithDefault.create({
+ defaultValue() {
+ return Ember.A();
+ }
+ });
+ }),
+
+ /**
+ Returns errors for a given attribute
+ ```javascript
+ let user = store.createRecord('user', {
+ username: 'tomster',
+ email: 'invalidEmail'
+ });
+ user.save().catch(function(){
+ user.get('errors').errorsFor('email'); // returns:
+ // [{attribute: "email", message: "Doesn't look like a valid email."}]
+ });
+ ```
+ @method errorsFor
+ @param {String} attribute
+ @return {Array}
+ */
+ errorsFor(attribute) {
+ return Ember.get(this, 'errorsByAttributeName').get(attribute);
+ },
+
+ /**
+ An array containing all of the error messages for this
+ record. This is useful for displaying all errors to the user.
+ ```handlebars
+ {{#each model.errors.messages as |message|}}
+ <div class="error">
+ {{message}}
+ </div>
+ {{/each}}
+ ```
+ @property messages
+ @type {Array}
+ */
+ messages: Ember.computed.mapBy('content', 'message'),
+
+ /**
+ @property content
+ @type {Array}
+ @private
+ */
+ content: Ember.computed(function () {
+ return Ember.A();
+ }),
+
+ /**
+ @method unknownProperty
+ @private
+ */
+ unknownProperty(attribute) {
+ var errors = this.errorsFor(attribute);
+ if (Ember.isEmpty(errors)) {
+ return undefined;
+ }
+ return errors;
+ },
+
+ /**
+ Total number of errors.
+ @property length
+ @type {Number}
+ @readOnly
+ */
+
+ /**
+ @property isEmpty
+ @type {Boolean}
+ @readOnly
+ */
+ isEmpty: Ember.computed.not('length').readOnly(),
+
+ /**
+ Adds error messages to a given attribute and sends
+ `becameInvalid` event to the record.
+ Example:
+ ```javascript
+ if (!user.get('username') {
+ user.get('errors').add('username', 'This field is required');
+ }
+ ```
+ @method add
+ @param {String} attribute
+ @param {(Array|String)} messages
+ @deprecated
+ */
+ add(attribute, messages) {
+ (true && Ember.warn(`Interacting with a record errors object will no longer change the record state.`, false, {
+ id: 'ds.errors.add'
+ }));
+
+
+ var wasEmpty = Ember.get(this, 'isEmpty');
+
+ this._add(attribute, messages);
+
+ if (wasEmpty && !Ember.get(this, 'isEmpty')) {
+ this.trigger('becameInvalid');
+ }
+ },
+
+ /**
+ Adds error messages to a given attribute without sending event.
+ @method _add
+ @private
+ */
+ _add(attribute, messages) {
+ messages = this._findOrCreateMessages(attribute, messages);
+ this.addObjects(messages);
+ Ember.get(this, 'errorsByAttributeName').get(attribute).addObjects(messages);
+
+ this.notifyPropertyChange(attribute);
+ },
+
+ /**
+ @method _findOrCreateMessages
+ @private
+ */
+ _findOrCreateMessages(attribute, messages) {
+ var errors = this.errorsFor(attribute);
+ var messagesArray = Ember.makeArray(messages);
+ var _messages = new Array(messagesArray.length);
+
+ for (var i = 0; i < messagesArray.length; i++) {
+ var message = messagesArray[i];
+ var err = errors.findBy('message', message);
+ if (err) {
+ _messages[i] = err;
+ } else {
+ _messages[i] = {
+ attribute: attribute,
+ message: message
+ };
+ }
+ }
+
+ return _messages;
+ },
+
+ /**
+ Removes all error messages from the given attribute and sends
+ `becameValid` event to the record if there no more errors left.
+ Example:
+ ```app/models/user.js
+ import DS from 'ember-data';
+ export default DS.Model.extend({
+ email: DS.attr('string'),
+ twoFactorAuth: DS.attr('boolean'),
+ phone: DS.attr('string')
+ });
+ ```
+ ```app/routes/user/edit.js
+ import Route from '@ember/routing/route';
+ export default Route.extend({
+ actions: {
+ save: function(user) {
+ if (!user.get('twoFactorAuth')) {
+ user.get('errors').remove('phone');
+ }
+ user.save();
+ }
+ }
+ });
+ ```
+ @method remove
+ @param {String} attribute
+ @deprecated
+ */
+ remove(attribute) {
+ (true && Ember.warn(`Interacting with a record errors object will no longer change the record state.`, false, {
+ id: 'ds.errors.remove'
+ }));
+
+
+ if (Ember.get(this, 'isEmpty')) {
+ return;
+ }
+
+ this._remove(attribute);
+
+ if (Ember.get(this, 'isEmpty')) {
+ this.trigger('becameValid');
+ }
+ },
+
+ /**
+ Removes all error messages from the given attribute without sending event.
+ @method _remove
+ @private
+ */
+ _remove(attribute) {
+ if (Ember.get(this, 'isEmpty')) {
+ return;
+ }
+
+ var content = this.rejectBy('attribute', attribute);
+ Ember.set(this, 'content', content);
+ Ember.get(this, 'errorsByAttributeName').delete(attribute);
+
+ this.notifyPropertyChange(attribute);
+ this.notifyPropertyChange('length');
+ },
+
+ /**
+ Removes all error messages and sends `becameValid` event
+ to the record.
+ Example:
+ ```app/routes/user/edit.js
+ import Route from '@ember/routing/route';
+ export default Route.extend({
+ actions: {
+ retrySave: function(user) {
+ user.get('errors').clear();
+ user.save();
+ }
+ }
+ });
+ ```
+ @method clear
+ @deprecated
+ */
+ clear() {
+ (true && Ember.warn(`Interacting with a record errors object will no longer change the record state.`, false, {
+ id: 'ds.errors.clear'
+ }));
+
+
+ if (Ember.get(this, 'isEmpty')) {
+ return;
+ }
+
+ this._clear();
+ this.trigger('becameValid');
+ },
+
+ /**
+ Removes all error messages.
+ to the record.
+ @method _clear
+ @private
+ */
+ _clear() {
+ if (Ember.get(this, 'isEmpty')) {
+ return;
+ }
+
+ var errorsByAttributeName = Ember.get(this, 'errorsByAttributeName');
+ var attributes = Ember.A();
+
+ errorsByAttributeName.forEach(function (_, attribute) {
+ attributes.push(attribute);
+ });
+
+ errorsByAttributeName.clear();
+ attributes.forEach(function (attribute) {
+ this.notifyPropertyChange(attribute);
+ }, this);
+
+ Ember.ArrayProxy.prototype.clear.call(this);
+ },
+
+ /**
+ Checks if there is error messages for the given attribute.
+ ```app/routes/user/edit.js
+ import Route from '@ember/routing/route';
+ export default Route.extend({
+ actions: {
+ save: function(user) {
+ if (user.get('errors').has('email')) {
+ return alert('Please update your email before attempting to save.');
+ }
+ user.save();
+ }
+ }
+ });
+ ```
+ @method has
+ @param {String} attribute
+ @return {Boolean} true if there some errors on given attribute
+ */
+ has(attribute) {
+ return !Ember.isEmpty(this.errorsFor(attribute));
+ }
+});
+
+function isEnabled() {
+ return Ember.FEATURES.isEnabled(...arguments);
+}
+
+/*
+ This file encapsulates the various states that a record can transition
+ through during its lifecycle.
+*/
+/**
+ ### State
+
+ Each record has a `currentState` property that explicitly tracks what
+ state a record is in at any given time. For instance, if a record is
+ newly created and has not yet been sent to the adapter to be saved,
+ it would be in the `root.loaded.created.uncommitted` state. If a
+ record has had local modifications made to it that are in the
+ process of being saved, the record would be in the
+ `root.loaded.updated.inFlight` state. (This state paths will be
+ explained in more detail below.)
+
+ Events are sent by the record or its store to the record's
+ `currentState` property. How the state reacts to these events is
+ dependent on which state it is in. In some states, certain events
+ will be invalid and will cause an exception to be raised.
+
+ States are hierarchical and every state is a substate of the
+ `RootState`. For example, a record can be in the
+ `root.deleted.uncommitted` state, then transition into the
+ `root.deleted.inFlight` state. If a child state does not implement
+ an event handler, the state manager will attempt to invoke the event
+ on all parent states until the root state is reached. The state
+ hierarchy of a record is described in terms of a path string. You
+ can determine a record's current state by getting the state's
+ `stateName` property:
+
+ ```javascript
+ record.get('currentState.stateName');
+ //=> "root.created.uncommitted"
+ ```
+
+ The hierarchy of valid states that ship with ember data looks like
+ this:
+
+ ```text
+ * root
+ * deleted
+ * saved
+ * uncommitted
+ * inFlight
+ * empty
+ * loaded
+ * created
+ * uncommitted
+ * inFlight
+ * saved
+ * updated
+ * uncommitted
+ * inFlight
+ * loading
+ ```
+
+ The `DS.Model` states are themselves stateless. What that means is
+ that, the hierarchical states that each of *those* points to is a
+ shared data structure. For performance reasons, instead of each
+ record getting its own copy of the hierarchy of states, each record
+ points to this global, immutable shared instance. How does a state
+ know which record it should be acting on? We pass the record
+ instance into the state's event handlers as the first argument.
+
+ The record passed as the first parameter is where you should stash
+ state about the record if needed; you should never store data on the state
+ object itself.
+
+ ### Events and Flags
+
+ A state may implement zero or more events and flags.
+
+ #### Events
+
+ Events are named functions that are invoked when sent to a record. The
+ record will first look for a method with the given name on the
+ current state. If no method is found, it will search the current
+ state's parent, and then its grandparent, and so on until reaching
+ the top of the hierarchy. If the root is reached without an event
+ handler being found, an exception will be raised. This can be very
+ helpful when debugging new features.
+
+ Here's an example implementation of a state with a `myEvent` event handler:
+
+ ```javascript
+ aState: DS.State.create({
+ myEvent: function(manager, param) {
+ console.log("Received myEvent with", param);
+ }
+ })
+ ```
+
+ To trigger this event:
+
+ ```javascript
+ record.send('myEvent', 'foo');
+ //=> "Received myEvent with foo"
+ ```
+
+ Note that an optional parameter can be sent to a record's `send()` method,
+ which will be passed as the second parameter to the event handler.
+
+ Events should transition to a different state if appropriate. This can be
+ done by calling the record's `transitionTo()` method with a path to the
+ desired state. The state manager will attempt to resolve the state path
+ relative to the current state. If no state is found at that path, it will
+ attempt to resolve it relative to the current state's parent, and then its
+ parent, and so on until the root is reached. For example, imagine a hierarchy
+ like this:
+
+ * created
+ * uncommitted <-- currentState
+ * inFlight
+ * updated
+ * inFlight
+
+ If we are currently in the `uncommitted` state, calling
+ `transitionTo('inFlight')` would transition to the `created.inFlight` state,
+ while calling `transitionTo('updated.inFlight')` would transition to
+ the `updated.inFlight` state.
+
+ Remember that *only events* should ever cause a state transition. You should
+ never call `transitionTo()` from outside a state's event handler. If you are
+ tempted to do so, create a new event and send that to the state manager.
+
+ #### Flags
+
+ Flags are Boolean values that can be used to introspect a record's current
+ state in a more user-friendly way than examining its state path. For example,
+ instead of doing this:
+
+ ```javascript
+ var statePath = record.get('stateManager.currentPath');
+ if (statePath === 'created.inFlight') {
+ doSomething();
+ }
+ ```
+
+ You can say:
+
+ ```javascript
+ if (record.get('isNew') && record.get('isSaving')) {
+ doSomething();
+ }
+ ```
+
+ If your state does not set a value for a given flag, the value will
+ be inherited from its parent (or the first place in the state hierarchy
+ where it is defined).
+
+ The current set of flags are defined below. If you want to add a new flag,
+ in addition to the area below, you will also need to declare it in the
+ `DS.Model` class.
+
+
+ * [isEmpty](DS.Model.html#property_isEmpty)
+ * [isLoading](DS.Model.html#property_isLoading)
+ * [isLoaded](DS.Model.html#property_isLoaded)
+ * [hasDirtyAttributes](DS.Model.html#property_hasDirtyAttributes)
+ * [isSaving](DS.Model.html#property_isSaving)
+ * [isDeleted](DS.Model.html#property_isDeleted)
+ * [isNew](DS.Model.html#property_isNew)
+ * [isValid](DS.Model.html#property_isValid)
+
+ @namespace DS
+ @class RootState
+*/
+
+function didSetProperty(internalModel, context) {
+ if (context.value === context.originalValue) {
+ delete internalModel._attributes[context.name];
+ internalModel.send('propertyWasReset', context.name);
+ } else if (context.value !== context.oldValue) {
+ internalModel.send('becomeDirty');
+ }
+
+ internalModel.updateRecordArrays();
+}
+
+// Implementation notes:
+//
+// Each state has a boolean value for all of the following flags:
+//
+// * isLoaded: The record has a populated `data` property. When a
+// record is loaded via `store.find`, `isLoaded` is false
+// until the adapter sets it. When a record is created locally,
+// its `isLoaded` property is always true.
+// * isDirty: The record has local changes that have not yet been
+// saved by the adapter. This includes records that have been
+// created (but not yet saved) or deleted.
+// * isSaving: The record has been committed, but
+// the adapter has not yet acknowledged that the changes have
+// been persisted to the backend.
+// * isDeleted: The record was marked for deletion. When `isDeleted`
+// is true and `isDirty` is true, the record is deleted locally
+// but the deletion was not yet persisted. When `isSaving` is
+// true, the change is in-flight. When both `isDirty` and
+// `isSaving` are false, the change has persisted.
+// * isNew: The record was created on the client and the adapter
+// did not yet report that it was successfully saved.
+// * isValid: The adapter did not report any server-side validation
+// failures.
+
+// The dirty state is a abstract state whose functionality is
+// shared between the `created` and `updated` states.
+//
+// The deleted state shares the `isDirty` flag with the
+// subclasses of `DirtyState`, but with a very different
+// implementation.
+//
+// Dirty states have three child states:
+//
+// `uncommitted`: the store has not yet handed off the record
+// to be saved.
+// `inFlight`: the store has handed off the record to be saved,
+// but the adapter has not yet acknowledged success.
+// `invalid`: the record has invalid information and cannot be
+// sent to the adapter yet.
+/**
+ @module ember-data
+*/
+var DirtyState = {
+ initialState: 'uncommitted',
+
+ // FLAGS
+ isDirty: true,
+
+ // SUBSTATES
+
+ // When a record first becomes dirty, it is `uncommitted`.
+ // This means that there are local pending changes, but they
+ // have not yet begun to be saved, and are not invalid.
+ uncommitted: {
+ // EVENTS
+ didSetProperty,
+
+ //TODO(Igor) reloading now triggers a
+ //loadingData event, though it seems fine?
+ loadingData() {},
+
+ propertyWasReset(internalModel, name) {
+ if (!internalModel.hasChangedAttributes()) {
+ internalModel.send('rolledBack');
+ }
+ },
+
+ pushedData(internalModel) {
+ internalModel.updateChangedAttributes();
+
+ if (!internalModel.hasChangedAttributes()) {
+ internalModel.transitionTo('loaded.saved');
+ }
+ },
+
+ becomeDirty() {},
+
+ willCommit(internalModel) {
+ internalModel.transitionTo('inFlight');
+ },
+
+ reloadRecord(internalModel, resolve) {
+ resolve(internalModel.store._reloadRecord(internalModel));
+ },
+
+ rolledBack(internalModel) {
+ internalModel.transitionTo('loaded.saved');
+ },
+
+ becameInvalid(internalModel) {
+ internalModel.transitionTo('invalid');
+ },
+
+ rollback(internalModel) {
+ internalModel.rollbackAttributes();
+ internalModel.triggerLater('ready');
+ }
+ },
+
+ // Once a record has been handed off to the adapter to be
+ // saved, it is in the 'in flight' state. Changes to the
+ // record cannot be made during this window.
+ inFlight: {
+ // FLAGS
+ isSaving: true,
+
+ // EVENTS
+ didSetProperty,
+ becomeDirty() {},
+ pushedData() {},
+
+ unloadRecord: assertAgainstUnloadRecord,
+
+ // TODO: More robust semantics around save-while-in-flight
+ willCommit() {},
+
+ didCommit(internalModel) {
+ internalModel.transitionTo('saved');
+ internalModel.send('invokeLifecycleCallbacks', this.dirtyType);
+ },
+
+ becameInvalid(internalModel) {
+ internalModel.transitionTo('invalid');
+ internalModel.send('invokeLifecycleCallbacks');
+ },
+
+ becameError(internalModel) {
+ internalModel.transitionTo('uncommitted');
+ internalModel.triggerLater('becameError', internalModel);
+ }
+ },
+
+ // A record is in the `invalid` if the adapter has indicated
+ // the the record failed server-side invalidations.
+ invalid: {
+ // FLAGS
+ isValid: false,
+
+ // EVENTS
+ deleteRecord(internalModel) {
+ internalModel.transitionTo('deleted.uncommitted');
+ },
+
+ didSetProperty(internalModel, context) {
+ internalModel.removeErrorMessageFromAttribute(context.name);
+
+ didSetProperty(internalModel, context);
+
+ if (!internalModel.hasErrors()) {
+ this.becameValid(internalModel);
+ }
+ },
+
+ becameInvalid() {},
+ becomeDirty() {},
+ pushedData() {},
+
+ willCommit(internalModel) {
+ internalModel.clearErrorMessages();
+ internalModel.transitionTo('inFlight');
+ },
+
+ rolledBack(internalModel) {
+ internalModel.clearErrorMessages();
+ internalModel.transitionTo('loaded.saved');
+ internalModel.triggerLater('ready');
+ },
+
+ becameValid(internalModel) {
+ internalModel.transitionTo('uncommitted');
+ },
+
+ invokeLifecycleCallbacks(internalModel) {
+ internalModel.triggerLater('becameInvalid', internalModel);
+ }
+ }
+};
+
+// The created and updated states are created outside the state
+// chart so we can reopen their substates and add mixins as
+// necessary.
+
+function deepClone(object) {
+ var clone = {};
+ var value = void 0;
+
+ for (var prop in object) {
+ value = object[prop];
+ if (value && typeof value === 'object') {
+ clone[prop] = deepClone(value);
+ } else {
+ clone[prop] = value;
+ }
+ }
+
+ return clone;
+}
+
+function mixin(original, hash) {
+ for (var prop in hash) {
+ original[prop] = hash[prop];
+ }
+
+ return original;
+}
+
+function dirtyState(options) {
+ var newState = deepClone(DirtyState);
+ return mixin(newState, options);
+}
+
+var createdState = dirtyState({
+ dirtyType: 'created',
+ // FLAGS
+ isNew: true
+});
+
+createdState.invalid.rolledBack = function (internalModel) {
+ internalModel.transitionTo('deleted.saved');
+};
+
+createdState.uncommitted.rolledBack = function (internalModel) {
+ internalModel.transitionTo('deleted.saved');
+};
+
+var updatedState = dirtyState({
+ dirtyType: 'updated'
+});
+
+function createdStateDeleteRecord(internalModel) {
+ internalModel.transitionTo('deleted.saved');
+ internalModel.send('invokeLifecycleCallbacks');
+}
+
+createdState.uncommitted.deleteRecord = createdStateDeleteRecord;
+
+createdState.invalid.deleteRecord = createdStateDeleteRecord;
+
+createdState.uncommitted.rollback = function (internalModel) {
+ DirtyState.uncommitted.rollback.apply(this, arguments);
+ internalModel.transitionTo('deleted.saved');
+};
+
+createdState.uncommitted.pushedData = function (internalModel) {
+ internalModel.transitionTo('loaded.updated.uncommitted');
+ internalModel.triggerLater('didLoad');
+};
+
+createdState.uncommitted.propertyWasReset = function () {};
+
+function assertAgainstUnloadRecord(internalModel) {
+ (true && !(false) && Ember.assert("You can only unload a record which is not inFlight. `" + internalModel + "`", false));
+}
+
+updatedState.invalid.becameValid = function (internalModel) {
+ // we're eagerly transition into the loaded.saved state, even though we could
+ // be still dirty; but the setup hook of the loaded.saved state checks for
+ // dirty attributes and transitions into the corresponding dirty state
+ internalModel.transitionTo('loaded.saved');
+};
+
+updatedState.inFlight.unloadRecord = assertAgainstUnloadRecord;
+
+updatedState.uncommitted.deleteRecord = function (internalModel) {
+ internalModel.transitionTo('deleted.uncommitted');
+};
+
+var RootState = {
+ // FLAGS
+ isEmpty: false,
+ isLoading: false,
+ isLoaded: false,
+ isDirty: false,
+ isSaving: false,
+ isDeleted: false,
+ isNew: false,
+ isValid: true,
+
+ // DEFAULT EVENTS
+
+ // Trying to roll back if you're not in the dirty state
+ // doesn't change your state. For example, if you're in the
+ // in-flight state, rolling back the record doesn't move
+ // you out of the in-flight state.
+ rolledBack() {},
+ unloadRecord(internalModel) {},
+
+ propertyWasReset() {},
+
+ // SUBSTATES
+
+ // A record begins its lifecycle in the `empty` state.
+ // If its data will come from the adapter, it will
+ // transition into the `loading` state. Otherwise, if
+ // the record is being created on the client, it will
+ // transition into the `created` state.
+ empty: {
+ isEmpty: true,
+
+ // EVENTS
+ loadingData(internalModel, promise) {
+ internalModel._loadingPromise = promise;
+ internalModel.transitionTo('loading');
+ },
+
+ loadedData(internalModel) {
+ internalModel.transitionTo('loaded.created.uncommitted');
+ internalModel.triggerLater('ready');
+ },
+
+ pushedData(internalModel) {
+ internalModel.transitionTo('loaded.saved');
+ internalModel.triggerLater('didLoad');
+ internalModel.triggerLater('ready');
+ }
+ },
+
+ // A record enters this state when the store asks
+ // the adapter for its data. It remains in this state
+ // until the adapter provides the requested data.
+ //
+ // Usually, this process is asynchronous, using an
+ // XHR to retrieve the data.
+ loading: {
+ // FLAGS
+ isLoading: true,
+
+ exit(internalModel) {
+ internalModel._loadingPromise = null;
+ },
+
+ // EVENTS
+ pushedData(internalModel) {
+ internalModel.transitionTo('loaded.saved');
+ internalModel.triggerLater('didLoad');
+ internalModel.triggerLater('ready');
+ //TODO this seems out of place here
+ internalModel.didCleanError();
+ },
+
+ becameError(internalModel) {
+ internalModel.triggerLater('becameError', internalModel);
+ },
+
+ notFound(internalModel) {
+ internalModel.transitionTo('empty');
+ }
+ },
+
+ // A record enters this state when its data is populated.
+ // Most of a record's lifecycle is spent inside substates
+ // of the `loaded` state.
+ loaded: {
+ initialState: 'saved',
+
+ // FLAGS
+ isLoaded: true,
+
+ //TODO(Igor) Reloading now triggers a loadingData event,
+ //but it should be ok?
+ loadingData() {},
+
+ // SUBSTATES
+
+ // If there are no local changes to a record, it remains
+ // in the `saved` state.
+ saved: {
+ setup(internalModel) {
+ if (internalModel.hasChangedAttributes()) {
+ internalModel.adapterDidDirty();
+ }
+ },
+
+ // EVENTS
+ didSetProperty,
+
+ pushedData() {},
+
+ becomeDirty(internalModel) {
+ internalModel.transitionTo('updated.uncommitted');
+ },
+
+ willCommit(internalModel) {
+ internalModel.transitionTo('updated.inFlight');
+ },
+
+ reloadRecord(internalModel, resolve) {
+ resolve(internalModel.store._reloadRecord(internalModel));
+ },
+
+ deleteRecord(internalModel) {
+ internalModel.transitionTo('deleted.uncommitted');
+ },
+
+ unloadRecord(internalModel) {},
+
+ didCommit() {},
+
+ // loaded.saved.notFound would be triggered by a failed
+ // `reload()` on an unchanged record
+ notFound() {}
+ },
+
+ // A record is in this state after it has been locally
+ // created but before the adapter has indicated that
+ // it has been saved.
+ created: createdState,
+
+ // A record is in this state if it has already been
+ // saved to the server, but there are new local changes
+ // that have not yet been saved.
+ updated: updatedState
+ },
+
+ // A record is in this state if it was deleted from the store.
+ deleted: {
+ initialState: 'uncommitted',
+ dirtyType: 'deleted',
+
+ // FLAGS
+ isDeleted: true,
+ isLoaded: true,
+ isDirty: true,
+
+ // TRANSITIONS
+ setup(internalModel) {
+ internalModel.updateRecordArrays();
+ },
+
+ // SUBSTATES
+
+ // When a record is deleted, it enters the `start`
+ // state. It will exit this state when the record
+ // starts to commit.
+ uncommitted: {
+
+ // EVENTS
+
+ willCommit(internalModel) {
+ internalModel.transitionTo('inFlight');
+ },
+
+ rollback(internalModel) {
+ internalModel.rollbackAttributes();
+ internalModel.triggerLater('ready');
+ },
+
+ pushedData() {},
+ becomeDirty() {},
+ deleteRecord() {},
+
+ rolledBack(internalModel) {
+ internalModel.transitionTo('loaded.saved');
+ internalModel.triggerLater('ready');
+ }
+ },
+
+ // After a record starts committing, but
+ // before the adapter indicates that the deletion
+ // has saved to the server, a record is in the
+ // `inFlight` substate of `deleted`.
+ inFlight: {
+ // FLAGS
+ isSaving: true,
+
+ // EVENTS
+
+ unloadRecord: assertAgainstUnloadRecord,
+
+ // TODO: More robust semantics around save-while-in-flight
+ willCommit() {},
+ didCommit(internalModel) {
+ internalModel.transitionTo('saved');
+
+ internalModel.send('invokeLifecycleCallbacks');
+ },
+
+ becameError(internalModel) {
+ internalModel.transitionTo('uncommitted');
+ internalModel.triggerLater('becameError', internalModel);
+ },
+
+ becameInvalid(internalModel) {
+ internalModel.transitionTo('invalid');
+ internalModel.triggerLater('becameInvalid', internalModel);
+ }
+ },
+
+ // Once the adapter indicates that the deletion has
+ // been saved, the record enters the `saved` substate
+ // of `deleted`.
+ saved: {
+ // FLAGS
+ isDirty: false,
+
+ setup(internalModel) {
+ internalModel.removeFromInverseRelationships();
+ },
+
+ invokeLifecycleCallbacks(internalModel) {
+ internalModel.triggerLater('didDelete', internalModel);
+ internalModel.triggerLater('didCommit', internalModel);
+ },
+
+ willCommit() {},
+ didCommit() {}
+ },
+
+ invalid: {
+ isValid: false,
+
+ didSetProperty(internalModel, context) {
+ internalModel.removeErrorMessageFromAttribute(context.name);
+
+ didSetProperty(internalModel, context);
+
+ if (!internalModel.hasErrors()) {
+ this.becameValid(internalModel);
+ }
+ },
+
+ becameInvalid() {},
+ becomeDirty() {},
+ deleteRecord() {},
+ willCommit() {},
+
+ rolledBack(internalModel) {
+ internalModel.clearErrorMessages();
+ internalModel.transitionTo('loaded.saved');
+ internalModel.triggerLater('ready');
+ },
+
+ becameValid(internalModel) {
+ internalModel.transitionTo('uncommitted');
+ }
+
+ }
+ },
+
+ invokeLifecycleCallbacks(internalModel, dirtyType) {
+ if (dirtyType === 'created') {
+ internalModel.triggerLater('didCreate', internalModel);
+ } else {
+ internalModel.triggerLater('didUpdate', internalModel);
+ }
+
+ internalModel.triggerLater('didCommit', internalModel);
+ }
+};
+
+function wireState(object, parent, name) {
+ // TODO: Use Object.create and copy instead
+ object = mixin(parent ? Object.create(parent) : {}, object);
+ object.parentState = parent;
+ object.stateName = name;
+
+ for (var prop in object) {
+ if (!object.hasOwnProperty(prop) || prop === 'parentState' || prop === 'stateName') {
+ continue;
+ }
+ if (typeof object[prop] === 'object') {
+ object[prop] = wireState(object[prop], object, name + '.' + prop);
+ }
+ }
+
+ return object;
+}
+
+var RootState$1 = wireState(RootState, null, 'root');
+
+// All modelNames are dasherized internally. Changing this function may
+// require changes to other normalization hooks (such as typeForRoot).
+
+/**
+ This method normalizes a modelName into the format Ember Data uses
+ internally.
+
+ @method normalizeModelName
+ @public
+ @param {String} modelName
+ @return {String} normalizedModelName
+ @for DS
+*/
+function normalizeModelName(modelName) {
+ return Ember.String.dasherize(modelName);
+}
+
+function typeForRelationshipMeta(meta) {
+ var modelName = void 0;
+
+ modelName = meta.type || meta.key;
+ if (meta.kind === 'hasMany') {
+ modelName = emberInflector.singularize(normalizeModelName(modelName));
+ }
+ return modelName;
+}
+
+function relationshipFromMeta(meta) {
+ return {
+ key: meta.key,
+ kind: meta.kind,
+ type: typeForRelationshipMeta(meta),
+ options: meta.options,
+ name: meta.name,
+ parentType: meta.parentType,
+ isRelationship: true
+ };
+}
+
+var relationshipsDescriptor = Ember.computed(function () {
+ var map = new Ember.MapWithDefault({
+ defaultValue() {
+ return [];
+ }
+ });
+
+ // Loop through each computed property on the class
+ this.eachComputedProperty((name, meta) => {
+ // If the computed property is a relationship, add
+ // it to the map.
+ if (meta.isRelationship) {
+ meta.key = name;
+ var relationshipsForType = map.get(typeForRelationshipMeta(meta));
+
+ relationshipsForType.push({
+ name: name,
+ kind: meta.kind
+ });
+ }
+ });
+
+ return map;
+}).readOnly();
+
+var relatedTypesDescriptor = Ember.computed(function () {
+ var modelName = void 0;
+ var types = Ember.A();
+
+ // Loop through each computed property on the class,
+ // and create an array of the unique types involved
+ // in relationships
+ this.eachComputedProperty((name, meta) => {
+ if (meta.isRelationship) {
+ meta.key = name;
+ modelName = typeForRelationshipMeta(meta);
+
+ (true && !(modelName) && Ember.assert(`You specified a hasMany (${meta.type}) on ${meta.parentType} but ${meta.type} was not found.`, modelName));
+
+
+ if (!types.includes(modelName)) {
+ (true && !(!!modelName) && Ember.assert(`Trying to sideload ${name} on ${this.toString()} but the type doesn't exist.`, !!modelName));
+
+ types.push(modelName);
+ }
+ }
+ });
+
+ return types;
+}).readOnly();
+
+var relationshipsByNameDescriptor = Ember.computed(function () {
+ var map = Ember.Map.create();
+
+ this.eachComputedProperty((name, meta) => {
+ if (meta.isRelationship) {
+ meta.key = name;
+ var relationship = relationshipFromMeta(meta);
+ relationship.type = typeForRelationshipMeta(meta);
+ map.set(name, relationship);
+ }
+ });
+
+ return map;
+}).readOnly();
+
+/**
+ @module ember-data
+*/
+
+function findPossibleInverses(type, inverseType, name, relationshipsSoFar) {
+ var possibleRelationships = relationshipsSoFar || [];
+
+ var relationshipMap = Ember.get(inverseType, 'relationships');
+ if (!relationshipMap) {
+ return possibleRelationships;
+ }
+
+ var relationships = relationshipMap.get(type.modelName).filter(relationship => {
+ var optionsForRelationship = inverseType.metaForProperty(relationship.name).options;
+
+ if (!optionsForRelationship.inverse && optionsForRelationship.inverse !== null) {
+ return true;
+ }
+
+ return name === optionsForRelationship.inverse;
+ });
+
+ if (relationships) {
+ possibleRelationships.push.apply(possibleRelationships, relationships);
+ }
+
+ //Recurse to support polymorphism
+ if (type.superclass) {
+ findPossibleInverses(type.superclass, inverseType, name, possibleRelationships);
+ }
+
+ return possibleRelationships;
+}
+
+function intersection(array1, array2) {
+ var result = [];
+ array1.forEach(element => {
+ if (array2.indexOf(element) >= 0) {
+ result.push(element);
+ }
+ });
+
+ return result;
+}
+
+var RESERVED_MODEL_PROPS = ['currentState', 'data', 'store'];
+
+var retrieveFromCurrentState = Ember.computed('currentState', function (key) {
+ return Ember.get(this._internalModel.currentState, key);
+}).readOnly();
+
+/**
+
+ The model class that all Ember Data records descend from.
+ This is the public API of Ember Data models. If you are using Ember Data
+ in your application, this is the class you should use.
+ If you are working on Ember Data internals, you most likely want to be dealing
+ with `InternalModel`
+
+ @class Model
+ @namespace DS
+ @extends Ember.Object
+ @uses Ember.Evented
+*/
+var Model = Ember.Object.extend(Ember.Evented, {
+ _internalModel: null,
+ store: null,
+ __defineNonEnumerable(property) {
+ this[property.name] = property.descriptor.value;
+ },
+
+ /**
+ If this property is `true` the record is in the `empty`
+ state. Empty is the first state all records enter after they have
+ been created. Most records created by the store will quickly
+ transition to the `loading` state if data needs to be fetched from
+ the server or the `created` state if the record is created on the
+ client. A record can also enter the empty state if the adapter is
+ unable to locate the record.
+ @property isEmpty
+ @type {Boolean}
+ @readOnly
+ */
+ isEmpty: retrieveFromCurrentState,
+ /**
+ If this property is `true` the record is in the `loading` state. A
+ record enters this state when the store asks the adapter for its
+ data. It remains in this state until the adapter provides the
+ requested data.
+ @property isLoading
+ @type {Boolean}
+ @readOnly
+ */
+ isLoading: retrieveFromCurrentState,
+ /**
+ If this property is `true` the record is in the `loaded` state. A
+ record enters this state when its data is populated. Most of a
+ record's lifecycle is spent inside substates of the `loaded`
+ state.
+ Example
+ ```javascript
+ let record = store.createRecord('model');
+ record.get('isLoaded'); // true
+ store.findRecord('model', 1).then(function(model) {
+ model.get('isLoaded'); // true
+ });
+ ```
+ @property isLoaded
+ @type {Boolean}
+ @readOnly
+ */
+ isLoaded: retrieveFromCurrentState,
+ /**
+ If this property is `true` the record is in the `dirty` state. The
+ record has local changes that have not yet been saved by the
+ adapter. This includes records that have been created (but not yet
+ saved) or deleted.
+ Example
+ ```javascript
+ let record = store.createRecord('model');
+ record.get('hasDirtyAttributes'); // true
+ store.findRecord('model', 1).then(function(model) {
+ model.get('hasDirtyAttributes'); // false
+ model.set('foo', 'some value');
+ model.get('hasDirtyAttributes'); // true
+ });
+ ```
+ @since 1.13.0
+ @property hasDirtyAttributes
+ @type {Boolean}
+ @readOnly
+ */
+ hasDirtyAttributes: Ember.computed('currentState.isDirty', function () {
+ return this.get('currentState.isDirty');
+ }),
+ /**
+ If this property is `true` the record is in the `saving` state. A
+ record enters the saving state when `save` is called, but the
+ adapter has not yet acknowledged that the changes have been
+ persisted to the backend.
+ Example
+ ```javascript
+ let record = store.createRecord('model');
+ record.get('isSaving'); // false
+ let promise = record.save();
+ record.get('isSaving'); // true
+ promise.then(function() {
+ record.get('isSaving'); // false
+ });
+ ```
+ @property isSaving
+ @type {Boolean}
+ @readOnly
+ */
+ isSaving: retrieveFromCurrentState,
+ /**
+ If this property is `true` the record is in the `deleted` state
+ and has been marked for deletion. When `isDeleted` is true and
+ `hasDirtyAttributes` is true, the record is deleted locally but the deletion
+ was not yet persisted. When `isSaving` is true, the change is
+ in-flight. When both `hasDirtyAttributes` and `isSaving` are false, the
+ change has persisted.
+ Example
+ ```javascript
+ let record = store.createRecord('model');
+ record.get('isDeleted'); // false
+ record.deleteRecord();
+ // Locally deleted
+ record.get('isDeleted'); // true
+ record.get('hasDirtyAttributes'); // true
+ record.get('isSaving'); // false
+ // Persisting the deletion
+ let promise = record.save();
+ record.get('isDeleted'); // true
+ record.get('isSaving'); // true
+ // Deletion Persisted
+ promise.then(function() {
+ record.get('isDeleted'); // true
+ record.get('isSaving'); // false
+ record.get('hasDirtyAttributes'); // false
+ });
+ ```
+ @property isDeleted
+ @type {Boolean}
+ @readOnly
+ */
+ isDeleted: retrieveFromCurrentState,
+ /**
+ If this property is `true` the record is in the `new` state. A
+ record will be in the `new` state when it has been created on the
+ client and the adapter has not yet report that it was successfully
+ saved.
+ Example
+ ```javascript
+ let record = store.createRecord('model');
+ record.get('isNew'); // true
+ record.save().then(function(model) {
+ model.get('isNew'); // false
+ });
+ ```
+ @property isNew
+ @type {Boolean}
+ @readOnly
+ */
+ isNew: retrieveFromCurrentState,
+ /**
+ If this property is `true` the record is in the `valid` state.
+ A record will be in the `valid` state when the adapter did not report any
+ server-side validation failures.
+ @property isValid
+ @type {Boolean}
+ @readOnly
+ */
+ isValid: retrieveFromCurrentState,
+ /**
+ If the record is in the dirty state this property will report what
+ kind of change has caused it to move into the dirty
+ state. Possible values are:
+ - `created` The record has been created by the client and not yet saved to the adapter.
+ - `updated` The record has been updated by the client and not yet saved to the adapter.
+ - `deleted` The record has been deleted by the client and not yet saved to the adapter.
+ Example
+ ```javascript
+ let record = store.createRecord('model');
+ record.get('dirtyType'); // 'created'
+ ```
+ @property dirtyType
+ @type {String}
+ @readOnly
+ */
+ dirtyType: retrieveFromCurrentState,
+
+ /**
+ If `true` the adapter reported that it was unable to save local
+ changes to the backend for any reason other than a server-side
+ validation error.
+ Example
+ ```javascript
+ record.get('isError'); // false
+ record.set('foo', 'valid value');
+ record.save().then(null, function() {
+ record.get('isError'); // true
+ });
+ ```
+ @property isError
+ @type {Boolean}
+ @readOnly
+ */
+ isError: false,
+
+ /**
+ If `true` the store is attempting to reload the record from the adapter.
+ Example
+ ```javascript
+ record.get('isReloading'); // false
+ record.reload();
+ record.get('isReloading'); // true
+ ```
+ @property isReloading
+ @type {Boolean}
+ @readOnly
+ */
+ isReloading: false,
+
+ /**
+ All ember models have an id property. This is an identifier
+ managed by an external source. These are always coerced to be
+ strings before being used internally. Note when declaring the
+ attributes for a model it is an error to declare an id
+ attribute.
+ ```javascript
+ let record = store.createRecord('model');
+ record.get('id'); // null
+ store.findRecord('model', 1).then(function(model) {
+ model.get('id'); // '1'
+ });
+ ```
+ @property id
+ @type {String}
+ */
+ id: null,
+
+ /**
+ @property currentState
+ @private
+ @type {Object}
+ */
+ currentState: RootState$1.empty,
+
+ /**
+ When the record is in the `invalid` state this object will contain
+ any errors returned by the adapter. When present the errors hash
+ contains keys corresponding to the invalid property names
+ and values which are arrays of Javascript objects with two keys:
+ - `message` A string containing the error message from the backend
+ - `attribute` The name of the property associated with this error message
+ ```javascript
+ record.get('errors.length'); // 0
+ record.set('foo', 'invalid value');
+ record.save().catch(function() {
+ record.get('errors').get('foo');
+ // [{message: 'foo should be a number.', attribute: 'foo'}]
+ });
+ ```
+ The `errors` property us useful for displaying error messages to
+ the user.
+ ```handlebars
+ <label>Username: {{input value=username}} </label>
+ {{#each model.errors.username as |error|}}
+ <div class="error">
+ {{error.message}}
+ </div>
+ {{/each}}
+ <label>Email: {{input value=email}} </label>
+ {{#each model.errors.email as |error|}}
+ <div class="error">
+ {{error.message}}
+ </div>
+ {{/each}}
+ ```
+ You can also access the special `messages` property on the error
+ object to get an array of all the error strings.
+ ```handlebars
+ {{#each model.errors.messages as |message|}}
+ <div class="error">
+ {{message}}
+ </div>
+ {{/each}}
+ ```
+ @property errors
+ @type {DS.Errors}
+ */
+ errors: Ember.computed(function () {
+ var errors = Errors.create();
+
+ errors._registerHandlers(this._internalModel, function () {
+ this.send('becameInvalid');
+ }, function () {
+ this.send('becameValid');
+ });
+ return errors;
+ }).readOnly(),
+
+ /**
+ This property holds the `DS.AdapterError` object with which
+ last adapter operation was rejected.
+ @property adapterError
+ @type {DS.AdapterError}
+ */
+ adapterError: null,
+
+ /**
+ Create a JSON representation of the record, using the serialization
+ strategy of the store's adapter.
+ `serialize` takes an optional hash as a parameter, currently
+ supported options are:
+ - `includeId`: `true` if the record's ID should be included in the
+ JSON representation.
+ @method serialize
+ @param {Object} options
+ @return {Object} an object whose values are primitive JSON values only
+ */
+ serialize(options) {
+ return this._internalModel.createSnapshot().serialize(options);
+ },
+
+ /**
+ Use [DS.JSONSerializer](DS.JSONSerializer.html) to
+ get the JSON representation of a record.
+ `toJSON` takes an optional hash as a parameter, currently
+ supported options are:
+ - `includeId`: `true` if the record's ID should be included in the
+ JSON representation.
+ @method toJSON
+ @param {Object} options
+ @return {Object} A JSON representation of the object.
+ */
+ toJSON(options) {
+ // container is for lazy transform lookups
+ var serializer = this.store.serializerFor('-default');
+ var snapshot = this._internalModel.createSnapshot();
+
+ return serializer.serialize(snapshot, options);
+ },
+
+ /**
+ Fired when the record is ready to be interacted with,
+ that is either loaded from the server or created locally.
+ @event ready
+ */
+ ready: null,
+
+ /**
+ Fired when the record is loaded from the server.
+ @event didLoad
+ */
+ didLoad: null,
+
+ /**
+ Fired when the record is updated.
+ @event didUpdate
+ */
+ didUpdate: null,
+
+ /**
+ Fired when a new record is commited to the server.
+ @event didCreate
+ */
+ didCreate: null,
+
+ /**
+ Fired when the record is deleted.
+ @event didDelete
+ */
+ didDelete: null,
+
+ /**
+ Fired when the record becomes invalid.
+ @event becameInvalid
+ */
+ becameInvalid: null,
+
+ /**
+ Fired when the record enters the error state.
+ @event becameError
+ */
+ becameError: null,
+
+ /**
+ Fired when the record is rolled back.
+ @event rolledBack
+ */
+ rolledBack: null,
+
+ //TODO Do we want to deprecate these?
+ /**
+ @method send
+ @private
+ @param {String} name
+ @param {Object} context
+ */
+ send(name, context) {
+ return this._internalModel.send(name, context);
+ },
+
+ /**
+ @method transitionTo
+ @private
+ @param {String} name
+ */
+ transitionTo(name) {
+ return this._internalModel.transitionTo(name);
+ },
+
+ /**
+ Marks the record as deleted but does not save it. You must call
+ `save` afterwards if you want to persist it. You might use this
+ method if you want to allow the user to still `rollbackAttributes()`
+ after a delete was made.
+ Example
+ ```app/routes/model/delete.js
+ import Route from '@ember/routing/route';
+ export default Route.extend({
+ actions: {
+ softDelete() {
+ this.get('controller.model').deleteRecord();
+ },
+ confirm() {
+ this.get('controller.model').save();
+ },
+ undo() {
+ this.get('controller.model').rollbackAttributes();
+ }
+ }
+ });
+ ```
+ @method deleteRecord
+ */
+ deleteRecord() {
+ this._internalModel.deleteRecord();
+ },
+
+ /**
+ Same as `deleteRecord`, but saves the record immediately.
+ Example
+ ```app/routes/model/delete.js
+ import Route from '@ember/routing/route';
+ export default Route.extend({
+ actions: {
+ delete() {
+ this.get('controller.model').destroyRecord().then(function() {
+ controller.transitionToRoute('model.index');
+ });
+ }
+ }
+ });
+ ```
+ If you pass an object on the `adapterOptions` property of the options
+ argument it will be passed to your adapter via the snapshot
+ ```js
+ record.destroyRecord({ adapterOptions: { subscribe: false } });
+ ```
+ ```app/adapters/post.js
+ import MyCustomAdapter from './custom-adapter';
+ export default MyCustomAdapter.extend({
+ deleteRecord(store, type, snapshot) {
+ if (snapshot.adapterOptions.subscribe) {
+ // ...
+ }
+ // ...
+ }
+ });
+ ```
+ @method destroyRecord
+ @param {Object} options
+ @return {Promise} a promise that will be resolved when the adapter returns
+ successfully or rejected if the adapter returns with an error.
+ */
+ destroyRecord(options) {
+ this.deleteRecord();
+ return this.save(options);
+ },
+
+ /**
+ Unloads the record from the store. This will cause the record to be destroyed and freed up for garbage collection.
+ @method unloadRecord
+ */
+ unloadRecord() {
+ if (this.isDestroyed) {
+ return;
+ }
+ this._internalModel.unloadRecord();
+ },
+
+ /**
+ @method _notifyProperties
+ @private
+ */
+ _notifyProperties(keys) {
+ Ember.beginPropertyChanges();
+ var key = void 0;
+ for (var i = 0, length = keys.length; i < length; i++) {
+ key = keys[i];
+ this.notifyPropertyChange(key);
+ }
+ Ember.endPropertyChanges();
+ },
+
+ /**
+ Returns an object, whose keys are changed properties, and value is
+ an [oldProp, newProp] array.
+ The array represents the diff of the canonical state with the local state
+ of the model. Note: if the model is created locally, the canonical state is
+ empty since the adapter hasn't acknowledged the attributes yet:
+ Example
+ ```app/models/mascot.js
+ import DS from 'ember-data';
+ export default DS.Model.extend({
+ name: DS.attr('string'),
+ isAdmin: DS.attr('boolean', {
+ defaultValue: false
+ })
+ });
+ ```
+ ```javascript
+ let mascot = store.createRecord('mascot');
+ mascot.changedAttributes(); // {}
+ mascot.set('name', 'Tomster');
+ mascot.changedAttributes(); // { name: [undefined, 'Tomster'] }
+ mascot.set('isAdmin', true);
+ mascot.changedAttributes(); // { isAdmin: [undefined, true], name: [undefined, 'Tomster'] }
+ mascot.save().then(function() {
+ mascot.changedAttributes(); // {}
+ mascot.set('isAdmin', false);
+ mascot.changedAttributes(); // { isAdmin: [true, false] }
+ });
+ ```
+ @method changedAttributes
+ @return {Object} an object, whose keys are changed properties,
+ and value is an [oldProp, newProp] array.
+ */
+ changedAttributes() {
+ return this._internalModel.changedAttributes();
+ },
+
+ //TODO discuss with tomhuda about events/hooks
+ //Bring back as hooks?
+ /**
+ @method adapterWillCommit
+ @private
+ adapterWillCommit: function() {
+ this.send('willCommit');
+ },
+ /**
+ @method adapterDidDirty
+ @private
+ adapterDidDirty: function() {
+ this.send('becomeDirty');
+ this.updateRecordArraysLater();
+ },
+ */
+
+ /**
+ If the model `hasDirtyAttributes` this function will discard any unsaved
+ changes. If the model `isNew` it will be removed from the store.
+ Example
+ ```javascript
+ record.get('name'); // 'Untitled Document'
+ record.set('name', 'Doc 1');
+ record.get('name'); // 'Doc 1'
+ record.rollbackAttributes();
+ record.get('name'); // 'Untitled Document'
+ ```
+ @since 1.13.0
+ @method rollbackAttributes
+ */
+ rollbackAttributes() {
+ this._internalModel.rollbackAttributes();
+ },
+
+ /*
+ @method _createSnapshot
+ @private
+ */
+ _createSnapshot() {
+ return this._internalModel.createSnapshot();
+ },
+
+ toStringExtension() {
+ return Ember.get(this, 'id');
+ },
+
+ /**
+ Save the record and persist any changes to the record to an
+ external source via the adapter.
+ Example
+ ```javascript
+ record.set('name', 'Tomster');
+ record.save().then(function() {
+ // Success callback
+ }, function() {
+ // Error callback
+ });
+ ```
+ If you pass an object using the `adapterOptions` property of the options
+ argument it will be passed to your adapter via the snapshot.
+ ```js
+ record.save({ adapterOptions: { subscribe: false } });
+ ```
+ ```app/adapters/post.js
+ import MyCustomAdapter from './custom-adapter';
+ export default MyCustomAdapter.extend({
+ updateRecord(store, type, snapshot) {
+ if (snapshot.adapterOptions.subscribe) {
+ // ...
+ }
+ // ...
+ }
+ });
+ ```
+ @method save
+ @param {Object} options
+ @return {Promise} a promise that will be resolved when the adapter returns
+ successfully or rejected if the adapter returns with an error.
+ */
+ save(options) {
+ return PromiseObject.create({
+ promise: this._internalModel.save(options).then(() => this)
+ });
+ },
+
+ /**
+ Reload the record from the adapter.
+ This will only work if the record has already finished loading.
+ Example
+ ```app/routes/model/view.js
+ import Route from '@ember/routing/route';
+ export default Route.extend({
+ actions: {
+ reload() {
+ this.controller.get('model').reload().then(function(model) {
+ // do something with the reloaded model
+ });
+ }
+ }
+ });
+ ```
+ @method reload
+ @return {Promise} a promise that will be resolved with the record when the
+ adapter returns successfully or rejected if the adapter returns
+ with an error.
+ */
+ reload() {
+ return PromiseObject.create({
+ promise: this._internalModel.reload().then(() => this)
+ });
+ },
+
+ /**
+ Override the default event firing from Ember.Evented to
+ also call methods with the given name.
+ @method trigger
+ @private
+ @param {String} name
+ */
+ trigger(name) {
+ var fn = this[name];
+
+ if (typeof fn === 'function') {
+ var length = arguments.length;
+ var args = new Array(length - 1);
+
+ for (var i = 1; i < length; i++) {
+ args[i - 1] = arguments[i];
+ }
+ fn.apply(this, args);
+ }
+
+ this._super(...arguments);
+ },
+
+ attr() {
+ (true && !(false) && Ember.assert("The `attr` method is not available on DS.Model, a DS.Snapshot was probably expected. Are you passing a DS.Model instead of a DS.Snapshot to your serializer?", false));
+ },
+
+ /**
+ Get the reference for the specified belongsTo relationship.
+ Example
+ ```app/models/blog.js
+ export default DS.Model.extend({
+ user: DS.belongsTo({ async: true })
+ });
+ ```
+ ```javascript
+ let blog = store.push({
+ data: {
+ type: 'blog',
+ id: 1,
+ relationships: {
+ user: {
+ data: { type: 'user', id: 1 }
+ }
+ }
+ }
+ });
+ let userRef = blog.belongsTo('user');
+ // check if the user relationship is loaded
+ let isLoaded = userRef.value() !== null;
+ // get the record of the reference (null if not yet available)
+ let user = userRef.value();
+ // get the identifier of the reference
+ if (userRef.remoteType() === "id") {
+ let id = userRef.id();
+ } else if (userRef.remoteType() === "link") {
+ let link = userRef.link();
+ }
+ // load user (via store.findRecord or store.findBelongsTo)
+ userRef.load().then(...)
+ // or trigger a reload
+ userRef.reload().then(...)
+ // provide data for reference
+ userRef.push({
+ type: 'user',
+ id: 1,
+ attributes: {
+ username: "@user"
+ }
+ }).then(function(user) {
+ userRef.value() === user;
+ });
+ ```
+ @method belongsTo
+ @param {String} name of the relationship
+ @since 2.5.0
+ @return {BelongsToReference} reference for this relationship
+ */
+ belongsTo(name) {
+ return this._internalModel.referenceFor('belongsTo', name);
+ },
+
+ /**
+ Get the reference for the specified hasMany relationship.
+ Example
+ ```javascript
+ // models/blog.js
+ export default DS.Model.extend({
+ comments: DS.hasMany({ async: true })
+ });
+ let blog = store.push({
+ data: {
+ type: 'blog',
+ id: 1,
+ relationships: {
+ comments: {
+ data: [
+ { type: 'comment', id: 1 },
+ { type: 'comment', id: 2 }
+ ]
+ }
+ }
+ }
+ });
+ let commentsRef = blog.hasMany('comments');
+ // check if the comments are loaded already
+ let isLoaded = commentsRef.value() !== null;
+ // get the records of the reference (null if not yet available)
+ let comments = commentsRef.value();
+ // get the identifier of the reference
+ if (commentsRef.remoteType() === "ids") {
+ let ids = commentsRef.ids();
+ } else if (commentsRef.remoteType() === "link") {
+ let link = commentsRef.link();
+ }
+ // load comments (via store.findMany or store.findHasMany)
+ commentsRef.load().then(...)
+ // or trigger a reload
+ commentsRef.reload().then(...)
+ // provide data for reference
+ commentsRef.push([{ type: 'comment', id: 1 }, { type: 'comment', id: 2 }]).then(function(comments) {
+ commentsRef.value() === comments;
+ });
+ ```
+ @method hasMany
+ @param {String} name of the relationship
+ @since 2.5.0
+ @return {HasManyReference} reference for this relationship
+ */
+ hasMany(name) {
+ return this._internalModel.referenceFor('hasMany', name);
+ },
+
+ setId: Ember.observer('id', function () {
+ this._internalModel.setId(this.get('id'));
+ }),
+
+ /**
+ Provides info about the model for debugging purposes
+ by grouping the properties into more semantic groups.
+ Meant to be used by debugging tools such as the Chrome Ember Extension.
+ - Groups all attributes in "Attributes" group.
+ - Groups all belongsTo relationships in "Belongs To" group.
+ - Groups all hasMany relationships in "Has Many" group.
+ - Groups all flags in "Flags" group.
+ - Flags relationship CPs as expensive properties.
+ @method _debugInfo
+ @for DS.Model
+ @private
+ */
+ _debugInfo() {
+ var attributes = ['id'];
+ var relationships = {};
+ var expensiveProperties = [];
+
+ this.eachAttribute((name, meta) => attributes.push(name));
+
+ var groups = [{
+ name: 'Attributes',
+ properties: attributes,
+ expand: true
+ }];
+
+ this.eachRelationship((name, relationship) => {
+ var properties = relationships[relationship.kind];
+
+ if (properties === undefined) {
+ properties = relationships[relationship.kind] = [];
+ groups.push({
+ name: relationship.name,
+ properties,
+ expand: true
+ });
+ }
+ properties.push(name);
+ expensiveProperties.push(name);
+ });
+
+ groups.push({
+ name: 'Flags',
+ properties: ['isLoaded', 'hasDirtyAttributes', 'isSaving', 'isDeleted', 'isError', 'isNew', 'isValid']
+ });
+
+ return {
+ propertyInfo: {
+ // include all other mixins / properties (not just the grouped ones)
+ includeOtherProperties: true,
+ groups: groups,
+ // don't pre-calculate unless cached
+ expensiveProperties: expensiveProperties
+ }
+ };
+ },
+
+ notifyBelongsToChanged(key) {
+ this.notifyPropertyChange(key);
+ },
+ /**
+ Given a callback, iterates over each of the relationships in the model,
+ invoking the callback with the name of each relationship and its relationship
+ descriptor.
+ The callback method you provide should have the following signature (all
+ parameters are optional):
+ ```javascript
+ function(name, descriptor);
+ ```
+ - `name` the name of the current property in the iteration
+ - `descriptor` the meta object that describes this relationship
+ The relationship descriptor argument is an object with the following properties.
+ - **key** <span class="type">String</span> the name of this relationship on the Model
+ - **kind** <span class="type">String</span> "hasMany" or "belongsTo"
+ - **options** <span class="type">Object</span> the original options hash passed when the relationship was declared
+ - **parentType** <span class="type">DS.Model</span> the type of the Model that owns this relationship
+ - **type** <span class="type">String</span> the type name of the related Model
+ Note that in addition to a callback, you can also pass an optional target
+ object that will be set as `this` on the context.
+ Example
+ ```app/serializers/application.js
+ import DS from 'ember-data';
+ export default DS.JSONSerializer.extend({
+ serialize: function(record, options) {
+ let json = {};
+ record.eachRelationship(function(name, descriptor) {
+ if (descriptor.kind === 'hasMany') {
+ let serializedHasManyName = name.toUpperCase() + '_IDS';
+ json[serializedHasManyName] = record.get(name).mapBy('id');
+ }
+ });
+ return json;
+ }
+ });
+ ```
+ @method eachRelationship
+ @param {Function} callback the callback to invoke
+ @param {any} binding the value to which the callback's `this` should be bound
+ */
+ eachRelationship(callback, binding) {
+ this.constructor.eachRelationship(callback, binding);
+ },
+
+ relationshipFor(name) {
+ return Ember.get(this.constructor, 'relationshipsByName').get(name);
+ },
+
+ inverseFor(key) {
+ return this.constructor.inverseFor(key, this.store);
+ },
+
+ notifyHasManyAdded(key) {
+ //We need to notifyPropertyChange in the adding case because we need to make sure
+ //we fetch the newly added record in case it is unloaded
+ //TODO(Igor): Consider whether we could do this only if the record state is unloaded
+
+ //Goes away once hasMany is double promisified
+ this.notifyPropertyChange(key);
+ },
+
+ eachAttribute(callback, binding) {
+ this.constructor.eachAttribute(callback, binding);
+ }
+});
+
+/**
+ @property data
+ @private
+ @type {Object}
+ */
+Object.defineProperty(Model.prototype, 'data', {
+ get() {
+ return this._internalModel._data;
+ }
+});
+
+{
+ Model.reopen({
+ init() {
+ this._super(...arguments);
+
+ if (!this._internalModel) {
+ throw new Ember.Error('You should not call `create` on a model. Instead, call `store.createRecord` with the attributes you would like to set.');
+ }
+ }
+ });
+}
+
+Model.reopenClass({
+ isModel: true,
+
+ /**
+ Override the class' `create()` method to raise an error. This
+ prevents end users from inadvertently calling `create()` instead
+ of `createRecord()`. The store is still able to create instances
+ by calling the `_create()` method. To create an instance of a
+ `DS.Model` use [store.createRecord](DS.Store.html#method_createRecord).
+ @method create
+ @private
+ @static
+ */
+ /**
+ Represents the model's class name as a string. This can be used to look up the model's class name through
+ `DS.Store`'s modelFor method.
+ `modelName` is generated for you by Ember Data. It will be a lowercased, dasherized string.
+ For example:
+ ```javascript
+ store.modelFor('post').modelName; // 'post'
+ store.modelFor('blog-post').modelName; // 'blog-post'
+ ```
+ The most common place you'll want to access `modelName` is in your serializer's `payloadKeyFromModelName` method. For example, to change payload
+ keys to underscore (instead of dasherized), you might use the following code:
+ ```javascript
+ import { underscore } from '@ember/string';
+ export default const PostSerializer = DS.RESTSerializer.extend({
+ payloadKeyFromModelName(modelName) {
+ return underscore(modelName);
+ }
+ });
+ ```
+ @property modelName
+ @type String
+ @readonly
+ @static
+ */
+ modelName: null,
+
+ /*
+ These class methods below provide relationship
+ introspection abilities about relationships.
+ A note about the computed properties contained here:
+ **These properties are effectively sealed once called for the first time.**
+ To avoid repeatedly doing expensive iteration over a model's fields, these
+ values are computed once and then cached for the remainder of the runtime of
+ your application.
+ If your application needs to modify a class after its initial definition
+ (for example, using `reopen()` to add additional attributes), make sure you
+ do it before using your model with the store, which uses these properties
+ extensively.
+ */
+
+ /**
+ For a given relationship name, returns the model type of the relationship.
+ For example, if you define a model like this:
+ ```app/models/post.js
+ import DS from 'ember-data';
+ export default DS.Model.extend({
+ comments: DS.hasMany('comment')
+ });
+ ```
+ Calling `store.modelFor('post').typeForRelationship('comments', store)` will return `Comment`.
+ @method typeForRelationship
+ @static
+ @param {String} name the name of the relationship
+ @param {store} store an instance of DS.Store
+ @return {DS.Model} the type of the relationship, or undefined
+ */
+ typeForRelationship(name, store) {
+ var relationship = Ember.get(this, 'relationshipsByName').get(name);
+ return relationship && store.modelFor(relationship.type);
+ },
+
+ inverseMap: Ember.computed(function () {
+ return Object.create(null);
+ }),
+
+ /**
+ Find the relationship which is the inverse of the one asked for.
+ For example, if you define models like this:
+ ```app/models/post.js
+ import DS from 'ember-data';
+ export default DS.Model.extend({
+ comments: DS.hasMany('message')
+ });
+ ```
+ ```app/models/message.js
+ import DS from 'ember-data';
+ export default DS.Model.extend({
+ owner: DS.belongsTo('post')
+ });
+ ```
+ ``` js
+ store.modelFor('post').inverseFor('comments', store) // { type: App.Message, name: 'owner', kind: 'belongsTo' }
+ store.modelFor('message').inverseFor('owner', store) // { type: App.Post, name: 'comments', kind: 'hasMany' }
+ ```
+ @method inverseFor
+ @static
+ @param {String} name the name of the relationship
+ @param {DS.Store} store
+ @return {Object} the inverse relationship, or null
+ */
+ inverseFor(name, store) {
+ var inverseMap = Ember.get(this, 'inverseMap');
+ if (inverseMap[name] !== undefined) {
+ return inverseMap[name];
+ } else {
+ var relationship = Ember.get(this, 'relationshipsByName').get(name);
+ if (!relationship) {
+ inverseMap[name] = null;
+ return null;
+ }
+
+ var options = relationship.options;
+ if (options && options.inverse === null) {
+ // populate the cache with a miss entry so we can skip getting and going
+ // through `relationshipsByName`
+ inverseMap[name] = null;
+ return null;
+ }
+
+ return inverseMap[name] = this._findInverseFor(name, store);
+ }
+ },
+
+ //Calculate the inverse, ignoring the cache
+ _findInverseFor(name, store) {
+
+ var inverseType = this.typeForRelationship(name, store);
+ if (!inverseType) {
+ return null;
+ }
+
+ var propertyMeta = this.metaForProperty(name);
+ //If inverse is manually specified to be null, like `comments: DS.hasMany('message', { inverse: null })`
+ var options = propertyMeta.options;
+ if (options.inverse === null) {
+ return null;
+ }
+
+ var inverseName = void 0,
+ inverseKind = void 0,
+ inverse = void 0;
+
+ //If inverse is specified manually, return the inverse
+ if (options.inverse) {
+ inverseName = options.inverse;
+ inverse = Ember.get(inverseType, 'relationshipsByName').get(inverseName);
+
+ (true && !(!Ember.isNone(inverse)) && Ember.assert("We found no inverse relationships by the name of '" + inverseName + "' on the '" + inverseType.modelName + "' model. This is most likely due to a missing attribute on your model definition.", !Ember.isNone(inverse)));
+
+
+ inverseKind = inverse.kind;
+ } else {
+ //No inverse was specified manually, we need to use a heuristic to guess one
+ if (propertyMeta.parentType && propertyMeta.type === propertyMeta.parentType.modelName) {
+ (true && Ember.warn(`Detected a reflexive relationship by the name of '${name}' without an inverse option. Look at https://guides.emberjs.com/current/models/relationships/#toc_reflexive-relations for how to explicitly specify inverses.`, false, {
+ id: 'ds.model.reflexive-relationship-without-inverse'
+ }));
+ }
+
+ var possibleRelationships = findPossibleInverses(this, inverseType, name);
+
+ if (possibleRelationships.length === 0) {
+ return null;
+ }
+
+ var filteredRelationships = possibleRelationships.filter(possibleRelationship => {
+ var optionsForRelationship = inverseType.metaForProperty(possibleRelationship.name).options;
+ return name === optionsForRelationship.inverse;
+ });
+
+ (true && !(filteredRelationships.length < 2) && Ember.assert("You defined the '" + name + "' relationship on " + this + ", but you defined the inverse relationships of type " + inverseType.toString() + " multiple times. Look at https://guides.emberjs.com/current/models/relationships/#toc_explicit-inverses for how to explicitly specify inverses", filteredRelationships.length < 2));
+
+
+ if (filteredRelationships.length === 1) {
+ possibleRelationships = filteredRelationships;
+ }
+
+ (true && !(possibleRelationships.length === 1) && Ember.assert("You defined the '" + name + "' relationship on " + this + ", but multiple possible inverse relationships of type " + this + " were found on " + inverseType + ". Look at https://guides.emberjs.com/current/models/relationships/#toc_explicit-inverses for how to explicitly specify inverses", possibleRelationships.length === 1));
+
+
+ inverseName = possibleRelationships[0].name;
+ inverseKind = possibleRelationships[0].kind;
+ }
+
+ return {
+ type: inverseType,
+ name: inverseName,
+ kind: inverseKind
+ };
+ },
+
+ /**
+ The model's relationships as a map, keyed on the type of the
+ relationship. The value of each entry is an array containing a descriptor
+ for each relationship with that type, describing the name of the relationship
+ as well as the type.
+ For example, given the following model definition:
+ ```app/models/blog.js
+ import DS from 'ember-data';
+ export default DS.Model.extend({
+ users: DS.hasMany('user'),
+ owner: DS.belongsTo('user'),
+ posts: DS.hasMany('post')
+ });
+ ```
+ This computed property would return a map describing these
+ relationships, like this:
+ ```javascript
+ import Ember from 'ember';
+ import Blog from 'app/models/blog';
+ import User from 'app/models/user';
+ import Post from 'app/models/post';
+ let relationships = Ember.get(Blog, 'relationships');
+ relationships.get(User);
+ //=> [ { name: 'users', kind: 'hasMany' },
+ // { name: 'owner', kind: 'belongsTo' } ]
+ relationships.get(Post);
+ //=> [ { name: 'posts', kind: 'hasMany' } ]
+ ```
+ @property relationships
+ @static
+ @type Ember.Map
+ @readOnly
+ */
+
+ relationships: relationshipsDescriptor,
+
+ /**
+ A hash containing lists of the model's relationships, grouped
+ by the relationship kind. For example, given a model with this
+ definition:
+ ```app/models/blog.js
+ import DS from 'ember-data';
+ export default DS.Model.extend({
+ users: DS.hasMany('user'),
+ owner: DS.belongsTo('user'),
+ posts: DS.hasMany('post')
+ });
+ ```
+ This property would contain the following:
+ ```javascript
+ import Ember from 'ember';
+ import Blog from 'app/models/blog';
+ let relationshipNames = Ember.get(Blog, 'relationshipNames');
+ relationshipNames.hasMany;
+ //=> ['users', 'posts']
+ relationshipNames.belongsTo;
+ //=> ['owner']
+ ```
+ @property relationshipNames
+ @static
+ @type Object
+ @readOnly
+ */
+ relationshipNames: Ember.computed(function () {
+ var names = {
+ hasMany: [],
+ belongsTo: []
+ };
+
+ this.eachComputedProperty((name, meta) => {
+ if (meta.isRelationship) {
+ names[meta.kind].push(name);
+ }
+ });
+
+ return names;
+ }),
+
+ /**
+ An array of types directly related to a model. Each type will be
+ included once, regardless of the number of relationships it has with
+ the model.
+ For example, given a model with this definition:
+ ```app/models/blog.js
+ import DS from 'ember-data';
+ export default DS.Model.extend({
+ users: DS.hasMany('user'),
+ owner: DS.belongsTo('user'),
+ posts: DS.hasMany('post')
+ });
+ ```
+ This property would contain the following:
+ ```javascript
+ import Ember from 'ember';
+ import Blog from 'app/models/blog';
+ let relatedTypes = Ember.get(Blog, 'relatedTypes');
+ //=> [ User, Post ]
+ ```
+ @property relatedTypes
+ @static
+ @type Ember.Array
+ @readOnly
+ */
+ relatedTypes: relatedTypesDescriptor,
+
+ /**
+ A map whose keys are the relationships of a model and whose values are
+ relationship descriptors.
+ For example, given a model with this
+ definition:
+ ```app/models/blog.js
+ import DS from 'ember-data';
+ export default DS.Model.extend({
+ users: DS.hasMany('user'),
+ owner: DS.belongsTo('user'),
+ posts: DS.hasMany('post')
+ });
+ ```
+ This property would contain the following:
+ ```javascript
+ import Ember from 'ember';
+ import Blog from 'app/models/blog';
+ let relationshipsByName = Ember.get(Blog, 'relationshipsByName');
+ relationshipsByName.get('users');
+ //=> { key: 'users', kind: 'hasMany', type: 'user', options: Object, isRelationship: true }
+ relationshipsByName.get('owner');
+ //=> { key: 'owner', kind: 'belongsTo', type: 'user', options: Object, isRelationship: true }
+ ```
+ @property relationshipsByName
+ @static
+ @type Ember.Map
+ @readOnly
+ */
+ relationshipsByName: relationshipsByNameDescriptor,
+
+ /**
+ A map whose keys are the fields of the model and whose values are strings
+ describing the kind of the field. A model's fields are the union of all of its
+ attributes and relationships.
+ For example:
+ ```app/models/blog.js
+ import DS from 'ember-data';
+ export default DS.Model.extend({
+ users: DS.hasMany('user'),
+ owner: DS.belongsTo('user'),
+ posts: DS.hasMany('post'),
+ title: DS.attr('string')
+ });
+ ```
+ ```js
+ import Ember from 'ember';
+ import Blog from 'app/models/blog';
+ let fields = Ember.get(Blog, 'fields');
+ fields.forEach(function(kind, field) {
+ console.log(field, kind);
+ });
+ // prints:
+ // users, hasMany
+ // owner, belongsTo
+ // posts, hasMany
+ // title, attribute
+ ```
+ @property fields
+ @static
+ @type Ember.Map
+ @readOnly
+ */
+ fields: Ember.computed(function () {
+ var map = Ember.Map.create();
+
+ this.eachComputedProperty((name, meta) => {
+ if (meta.isRelationship) {
+ map.set(name, meta.kind);
+ } else if (meta.isAttribute) {
+ map.set(name, 'attribute');
+ }
+ });
+
+ return map;
+ }).readOnly(),
+
+ /**
+ Given a callback, iterates over each of the relationships in the model,
+ invoking the callback with the name of each relationship and its relationship
+ descriptor.
+ @method eachRelationship
+ @static
+ @param {Function} callback the callback to invoke
+ @param {any} binding the value to which the callback's `this` should be bound
+ */
+ eachRelationship(callback, binding) {
+ Ember.get(this, 'relationshipsByName').forEach((relationship, name) => {
+ callback.call(binding, name, relationship);
+ });
+ },
+
+ /**
+ Given a callback, iterates over each of the types related to a model,
+ invoking the callback with the related type's class. Each type will be
+ returned just once, regardless of how many different relationships it has
+ with a model.
+ @method eachRelatedType
+ @static
+ @param {Function} callback the callback to invoke
+ @param {any} binding the value to which the callback's `this` should be bound
+ */
+ eachRelatedType(callback, binding) {
+ var relationshipTypes = Ember.get(this, 'relatedTypes');
+
+ for (var i = 0; i < relationshipTypes.length; i++) {
+ var type = relationshipTypes[i];
+ callback.call(binding, type);
+ }
+ },
+
+ determineRelationshipType(knownSide, store) {
+ var knownKey = knownSide.key;
+ var knownKind = knownSide.kind;
+ var inverse = this.inverseFor(knownKey, store);
+ // let key;
+ var otherKind = void 0;
+
+ if (!inverse) {
+ return knownKind === 'belongsTo' ? 'oneToNone' : 'manyToNone';
+ }
+
+ // key = inverse.name;
+ otherKind = inverse.kind;
+
+ if (otherKind === 'belongsTo') {
+ return knownKind === 'belongsTo' ? 'oneToOne' : 'manyToOne';
+ } else {
+ return knownKind === 'belongsTo' ? 'oneToMany' : 'manyToMany';
+ }
+ },
+
+ /**
+ A map whose keys are the attributes of the model (properties
+ described by DS.attr) and whose values are the meta object for the
+ property.
+ Example
+ ```app/models/person.js
+ import DS from 'ember-data';
+ export default DS.Model.extend({
+ firstName: DS.attr('string'),
+ lastName: DS.attr('string'),
+ birthday: DS.attr('date')
+ });
+ ```
+ ```javascript
+ import Ember from 'ember';
+ import Person from 'app/models/person';
+ let attributes = Ember.get(Person, 'attributes')
+ attributes.forEach(function(meta, name) {
+ console.log(name, meta);
+ });
+ // prints:
+ // firstName {type: "string", isAttribute: true, options: Object, parentType: function, name: "firstName"}
+ // lastName {type: "string", isAttribute: true, options: Object, parentType: function, name: "lastName"}
+ // birthday {type: "date", isAttribute: true, options: Object, parentType: function, name: "birthday"}
+ ```
+ @property attributes
+ @static
+ @type {Ember.Map}
+ @readOnly
+ */
+ attributes: Ember.computed(function () {
+ var map = Ember.Map.create();
+
+ this.eachComputedProperty((name, meta) => {
+ if (meta.isAttribute) {
+ (true && !(name !== 'id') && Ember.assert("You may not set `id` as an attribute on your model. Please remove any lines that look like: `id: DS.attr('<type>')` from " + this.toString(), name !== 'id'));
+
+
+ meta.name = name;
+ map.set(name, meta);
+ }
+ });
+
+ return map;
+ }).readOnly(),
+
+ /**
+ A map whose keys are the attributes of the model (properties
+ described by DS.attr) and whose values are type of transformation
+ applied to each attribute. This map does not include any
+ attributes that do not have an transformation type.
+ Example
+ ```app/models/person.js
+ import DS from 'ember-data';
+ export default DS.Model.extend({
+ firstName: DS.attr(),
+ lastName: DS.attr('string'),
+ birthday: DS.attr('date')
+ });
+ ```
+ ```javascript
+ import Ember from 'ember';
+ import Person from 'app/models/person';
+ let transformedAttributes = Ember.get(Person, 'transformedAttributes')
+ transformedAttributes.forEach(function(field, type) {
+ console.log(field, type);
+ });
+ // prints:
+ // lastName string
+ // birthday date
+ ```
+ @property transformedAttributes
+ @static
+ @type {Ember.Map}
+ @readOnly
+ */
+ transformedAttributes: Ember.computed(function () {
+ var map = Ember.Map.create();
+
+ this.eachAttribute((key, meta) => {
+ if (meta.type) {
+ map.set(key, meta.type);
+ }
+ });
+
+ return map;
+ }).readOnly(),
+
+ /**
+ Iterates through the attributes of the model, calling the passed function on each
+ attribute.
+ The callback method you provide should have the following signature (all
+ parameters are optional):
+ ```javascript
+ function(name, meta);
+ ```
+ - `name` the name of the current property in the iteration
+ - `meta` the meta object for the attribute property in the iteration
+ Note that in addition to a callback, you can also pass an optional target
+ object that will be set as `this` on the context.
+ Example
+ ```javascript
+ import DS from 'ember-data';
+ let Person = DS.Model.extend({
+ firstName: DS.attr('string'),
+ lastName: DS.attr('string'),
+ birthday: DS.attr('date')
+ });
+ Person.eachAttribute(function(name, meta) {
+ console.log(name, meta);
+ });
+ // prints:
+ // firstName {type: "string", isAttribute: true, options: Object, parentType: function, name: "firstName"}
+ // lastName {type: "string", isAttribute: true, options: Object, parentType: function, name: "lastName"}
+ // birthday {type: "date", isAttribute: true, options: Object, parentType: function, name: "birthday"}
+ ```
+ @method eachAttribute
+ @param {Function} callback The callback to execute
+ @param {Object} [binding] the value to which the callback's `this` should be bound
+ @static
+ */
+ eachAttribute(callback, binding) {
+ Ember.get(this, 'attributes').forEach((meta, name) => {
+ callback.call(binding, name, meta);
+ });
+ },
+
+ /**
+ Iterates through the transformedAttributes of the model, calling
+ the passed function on each attribute. Note the callback will not be
+ called for any attributes that do not have an transformation type.
+ The callback method you provide should have the following signature (all
+ parameters are optional):
+ ```javascript
+ function(name, type);
+ ```
+ - `name` the name of the current property in the iteration
+ - `type` a string containing the name of the type of transformed
+ applied to the attribute
+ Note that in addition to a callback, you can also pass an optional target
+ object that will be set as `this` on the context.
+ Example
+ ```javascript
+ import DS from 'ember-data';
+ let Person = DS.Model.extend({
+ firstName: DS.attr(),
+ lastName: DS.attr('string'),
+ birthday: DS.attr('date')
+ });
+ Person.eachTransformedAttribute(function(name, type) {
+ console.log(name, type);
+ });
+ // prints:
+ // lastName string
+ // birthday date
+ ```
+ @method eachTransformedAttribute
+ @param {Function} callback The callback to execute
+ @param {Object} [binding] the value to which the callback's `this` should be bound
+ @static
+ */
+ eachTransformedAttribute(callback, binding) {
+ Ember.get(this, 'transformedAttributes').forEach((type, name) => {
+ callback.call(binding, name, type);
+ });
+ }
+});
+
+if (isEnabled('ds-rollback-attribute')) {
+ Model.reopen({
+ /**
+ Discards any unsaved changes to the given attribute. This feature is not enabled by default. You must enable `ds-rollback-attribute` and be running a canary build.
+ Example
+ ```javascript
+ record.get('name'); // 'Untitled Document'
+ record.set('name', 'Doc 1');
+ record.get('name'); // 'Doc 1'
+ record.rollbackAttribute('name');
+ record.get('name'); // 'Untitled Document'
+ ```
+ @method rollbackAttribute
+ */
+ rollbackAttribute(attributeName) {
+ if (attributeName in this._internalModel._attributes) {
+ this.set(attributeName, this._internalModel.lastAcknowledgedValue(attributeName));
+ }
+ }
+ });
+}
+
+{
+ Model.reopen({
+ // This is a temporary solution until we refactor DS.Model to not
+ // rely on the data property.
+ willMergeMixin(props) {
+ var constructor = this.constructor;
+ (true && !(!intersection(Object.keys(props), RESERVED_MODEL_PROPS)[0]) && Ember.assert('`' + intersection(Object.keys(props), RESERVED_MODEL_PROPS)[0] + '` is a reserved property name on DS.Model objects. Please choose a different property name for ' + constructor.toString(), !intersection(Object.keys(props), RESERVED_MODEL_PROPS)[0]));
+ (true && !(Object.keys(props).indexOf('id') === -1) && Ember.assert("You may not set `id` as an attribute on your model. Please remove any lines that look like: `id: DS.attr('<type>')` from " + constructor.toString(), Object.keys(props).indexOf('id') === -1));
+ },
+
+ /**
+ This Ember.js hook allows an object to be notified when a property
+ is defined.
+ In this case, we use it to be notified when an Ember Data user defines a
+ belongs-to relationship. In that case, we need to set up observers for
+ each one, allowing us to track relationship changes and automatically
+ reflect changes in the inverse has-many array.
+ This hook passes the class being set up, as well as the key and value
+ being defined. So, for example, when the user does this:
+ ```javascript
+ DS.Model.extend({
+ parent: DS.belongsTo('user')
+ });
+ ```
+ This hook would be called with "parent" as the key and the computed
+ property returned by `DS.belongsTo` as the value.
+ @method didDefineProperty
+ @param {Object} proto
+ @param {String} key
+ @param {Ember.ComputedProperty} value
+ */
+ didDefineProperty(proto, key, value) {
+ // Check if the value being set is a computed property.
+ if (value instanceof Ember.ComputedProperty) {
+
+ // If it is, get the metadata for the relationship. This is
+ // populated by the `DS.belongsTo` helper when it is creating
+ // the computed property.
+ var meta = value.meta();
+
+ /*
+ This is buggy because if the parent has never been looked up
+ via `modelFor` it will not have `modelName` set.
+ */
+ meta.parentType = proto.constructor;
+ }
+ }
+ });
+}
+
+var SOURCE_POINTER_REGEXP = /^\/?data\/(attributes|relationships)\/(.*)/;
+var SOURCE_POINTER_PRIMARY_REGEXP = /^\/?data/;
+var PRIMARY_ATTRIBUTE_KEY = 'base';
+
+/**
+ A `DS.AdapterError` is used by an adapter to signal that an error occurred
+ during a request to an external API. It indicates a generic error, and
+ subclasses are used to indicate specific error states. The following
+ subclasses are provided:
+
+ - `DS.InvalidError`
+ - `DS.TimeoutError`
+ - `DS.AbortError`
+ - `DS.UnauthorizedError`
+ - `DS.ForbiddenError`
+ - `DS.NotFoundError`
+ - `DS.ConflictError`
+ - `DS.ServerError`
+
+ To create a custom error to signal a specific error state in communicating
+ with an external API, extend the `DS.AdapterError`. For example if the
+ external API exclusively used HTTP `503 Service Unavailable` to indicate
+ it was closed for maintenance:
+
+ ```app/adapters/maintenance-error.js
+ import DS from 'ember-data';
+
+ export default DS.AdapterError.extend({ message: "Down for maintenance." });
+ ```
+
+ This error would then be returned by an adapter's `handleResponse` method:
+
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ import MaintenanceError from './maintenance-error';
+
+ export default DS.JSONAPIAdapter.extend({
+ handleResponse(status) {
+ if (503 === status) {
+ return new MaintenanceError();
+ }
+
+ return this._super(...arguments);
+ }
+ });
+ ```
+
+ And can then be detected in an application and used to send the user to an
+ `under-maintenance` route:
+
+ ```app/routes/application.js
+ import Route from '@ember/routing/route';
+ import MaintenanceError from '../adapters/maintenance-error';
+
+ export default Route.extend({
+ actions: {
+ error(error, transition) {
+ if (error instanceof MaintenanceError) {
+ this.transitionTo('under-maintenance');
+ return;
+ }
+
+ // ...other error handling logic
+ }
+ }
+ });
+ ```
+
+ @class AdapterError
+ @namespace DS
+*/
+function AdapterError(errors, message = 'Adapter operation failed') {
+ this.isAdapterError = true;
+ Ember.Error.call(this, message);
+
+ this.errors = errors || [{
+ title: 'Adapter Error',
+ detail: message
+ }];
+}
+
+function extendFn(ErrorClass) {
+ return function ({ message: defaultMessage } = {}) {
+ return extend(ErrorClass, defaultMessage);
+ };
+}
+
+function extend(ParentErrorClass, defaultMessage) {
+ var ErrorClass = function (errors, message) {
+ (true && !(Array.isArray(errors || [])) && Ember.assert('`AdapterError` expects json-api formatted errors array.', Array.isArray(errors || [])));
+
+ ParentErrorClass.call(this, errors, message || defaultMessage);
+ };
+ ErrorClass.prototype = Object.create(ParentErrorClass.prototype);
+ ErrorClass.extend = extendFn(ErrorClass);
+
+ return ErrorClass;
+}
+
+AdapterError.prototype = Object.create(Ember.Error.prototype);
+
+AdapterError.extend = extendFn(AdapterError);
+
+/**
+ A `DS.InvalidError` is used by an adapter to signal the external API
+ was unable to process a request because the content was not
+ semantically correct or meaningful per the API. Usually this means a
+ record failed some form of server side validation. When a promise
+ from an adapter is rejected with a `DS.InvalidError` the record will
+ transition to the `invalid` state and the errors will be set to the
+ `errors` property on the record.
+
+ For Ember Data to correctly map errors to their corresponding
+ properties on the model, Ember Data expects each error to be
+ a valid json-api error object with a `source/pointer` that matches
+ the property name. For example if you had a Post model that
+ looked like this.
+
+ ```app/models/post.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ title: DS.attr('string'),
+ content: DS.attr('string')
+ });
+ ```
+
+ To show an error from the server related to the `title` and
+ `content` properties your adapter could return a promise that
+ rejects with a `DS.InvalidError` object that looks like this:
+
+ ```app/adapters/post.js
+ import RSVP from 'RSVP';
+ import DS from 'ember-data';
+
+ export default DS.RESTAdapter.extend({
+ updateRecord() {
+ // Fictional adapter that always rejects
+ return RSVP.reject(new DS.InvalidError([
+ {
+ detail: 'Must be unique',
+ source: { pointer: '/data/attributes/title' }
+ },
+ {
+ detail: 'Must not be blank',
+ source: { pointer: '/data/attributes/content'}
+ }
+ ]));
+ }
+ });
+ ```
+
+ Your backend may use different property names for your records the
+ store will attempt extract and normalize the errors using the
+ serializer's `extractErrors` method before the errors get added to
+ the the model. As a result, it is safe for the `InvalidError` to
+ wrap the error payload unaltered.
+
+ @class InvalidError
+ @namespace DS
+*/
+var InvalidError = extend(AdapterError, 'The adapter rejected the commit because it was invalid');
+
+/**
+ A `DS.TimeoutError` is used by an adapter to signal that a request
+ to the external API has timed out. I.e. no response was received from
+ the external API within an allowed time period.
+
+ An example use case would be to warn the user to check their internet
+ connection if an adapter operation has timed out:
+
+ ```app/routes/application.js
+ import Route from '@ember/routing/route';
+ import DS from 'ember-data';
+
+ const { TimeoutError } = DS;
+
+ export default Route.extend({
+ actions: {
+ error(error, transition) {
+ if (error instanceof TimeoutError) {
+ // alert the user
+ alert('Are you still connected to the internet?');
+ return;
+ }
+
+ // ...other error handling logic
+ }
+ }
+ });
+ ```
+
+ @class TimeoutError
+ @namespace DS
+*/
+var TimeoutError = extend(AdapterError, 'The adapter operation timed out');
+
+/**
+ A `DS.AbortError` is used by an adapter to signal that a request to
+ the external API was aborted. For example, this can occur if the user
+ navigates away from the current page after a request to the external API
+ has been initiated but before a response has been received.
+
+ @class AbortError
+ @namespace DS
+*/
+var AbortError = extend(AdapterError, 'The adapter operation was aborted');
+
+/**
+ A `DS.UnauthorizedError` equates to a HTTP `401 Unauthorized` response
+ status. It is used by an adapter to signal that a request to the external
+ API was rejected because authorization is required and has failed or has not
+ yet been provided.
+
+ An example use case would be to redirect the user to a log in route if a
+ request is unauthorized:
+
+ ```app/routes/application.js
+ import Route from '@ember/routing/route';
+ import DS from 'ember-data';
+
+ const { UnauthorizedError } = DS;
+
+ export default Route.extend({
+ actions: {
+ error(error, transition) {
+ if (error instanceof UnauthorizedError) {
+ // go to the sign in route
+ this.transitionTo('login');
+ return;
+ }
+
+ // ...other error handling logic
+ }
+ }
+ });
+ ```
+
+ @class UnauthorizedError
+ @namespace DS
+*/
+var UnauthorizedError = extend(AdapterError, 'The adapter operation is unauthorized');
+
+/**
+ A `DS.ForbiddenError` equates to a HTTP `403 Forbidden` response status.
+ It is used by an adapter to signal that a request to the external API was
+ valid but the server is refusing to respond to it. If authorization was
+ provided and is valid, then the authenticated user does not have the
+ necessary permissions for the request.
+
+ @class ForbiddenError
+ @namespace DS
+*/
+var ForbiddenError = extend(AdapterError, 'The adapter operation is forbidden');
+
+/**
+ A `DS.NotFoundError` equates to a HTTP `404 Not Found` response status.
+ It is used by an adapter to signal that a request to the external API
+ was rejected because the resource could not be found on the API.
+
+ An example use case would be to detect if the user has entered a route
+ for a specific model that does not exist. For example:
+
+ ```app/routes/post.js
+ import Route from '@ember/routing/route';
+ import DS from 'ember-data';
+
+ const { NotFoundError } = DS;
+
+ export default Route.extend({
+ model(params) {
+ return this.get('store').findRecord('post', params.post_id);
+ },
+
+ actions: {
+ error(error, transition) {
+ if (error instanceof NotFoundError) {
+ // redirect to a list of all posts instead
+ this.transitionTo('posts');
+ } else {
+ // otherwise let the error bubble
+ return true;
+ }
+ }
+ }
+ });
+ ```
+
+ @class NotFoundError
+ @namespace DS
+*/
+var NotFoundError = extend(AdapterError, 'The adapter could not find the resource');
+
+/**
+ A `DS.ConflictError` equates to a HTTP `409 Conflict` response status.
+ It is used by an adapter to indicate that the request could not be processed
+ because of a conflict in the request. An example scenario would be when
+ creating a record with a client generated id but that id is already known
+ to the external API.
+
+ @class ConflictError
+ @namespace DS
+*/
+var ConflictError = extend(AdapterError, 'The adapter operation failed due to a conflict');
+
+/**
+ A `DS.ServerError` equates to a HTTP `500 Internal Server Error` response
+ status. It is used by the adapter to indicate that a request has failed
+ because of an error in the external API.
+
+ @class ServerError
+ @namespace DS
+*/
+var ServerError = extend(AdapterError, 'The adapter operation failed due to a server error');
+
+/**
+ Convert an hash of errors into an array with errors in JSON-API format.
+
+ ```javascript
+ import DS from 'ember-data';
+
+ const { errorsHashToArray } = DS;
+
+ let errors = {
+ base: 'Invalid attributes on saving this record',
+ name: 'Must be present',
+ age: ['Must be present', 'Must be a number']
+ };
+
+ let errorsArray = errorsHashToArray(errors);
+ // [
+ // {
+ // title: "Invalid Document",
+ // detail: "Invalid attributes on saving this record",
+ // source: { pointer: "/data" }
+ // },
+ // {
+ // title: "Invalid Attribute",
+ // detail: "Must be present",
+ // source: { pointer: "/data/attributes/name" }
+ // },
+ // {
+ // title: "Invalid Attribute",
+ // detail: "Must be present",
+ // source: { pointer: "/data/attributes/age" }
+ // },
+ // {
+ // title: "Invalid Attribute",
+ // detail: "Must be a number",
+ // source: { pointer: "/data/attributes/age" }
+ // }
+ // ]
+ ```
+
+ @method errorsHashToArray
+ @public
+ @namespace
+ @for DS
+ @param {Object} errors hash with errors as properties
+ @return {Array} array of errors in JSON-API format
+*/
+function errorsHashToArray(errors) {
+ var out = [];
+
+ if (Ember.isPresent(errors)) {
+ Object.keys(errors).forEach(key => {
+ var messages = Ember.makeArray(errors[key]);
+ for (var i = 0; i < messages.length; i++) {
+ var title = 'Invalid Attribute';
+ var pointer = `/data/attributes/${key}`;
+ if (key === PRIMARY_ATTRIBUTE_KEY) {
+ title = 'Invalid Document';
+ pointer = `/data`;
+ }
+ out.push({
+ title: title,
+ detail: messages[i],
+ source: {
+ pointer: pointer
+ }
+ });
+ }
+ });
+ }
+
+ return out;
+}
+
+/**
+ Convert an array of errors in JSON-API format into an object.
+
+ ```javascript
+ import DS from 'ember-data';
+
+ const { errorsArrayToHash } = DS;
+
+ let errorsArray = [
+ {
+ title: 'Invalid Attribute',
+ detail: 'Must be present',
+ source: { pointer: '/data/attributes/name' }
+ },
+ {
+ title: 'Invalid Attribute',
+ detail: 'Must be present',
+ source: { pointer: '/data/attributes/age' }
+ },
+ {
+ title: 'Invalid Attribute',
+ detail: 'Must be a number',
+ source: { pointer: '/data/attributes/age' }
+ }
+ ];
+
+ let errors = errorsArrayToHash(errorsArray);
+ // {
+ // "name": ["Must be present"],
+ // "age": ["Must be present", "must be a number"]
+ // }
+ ```
+
+ @method errorsArrayToHash
+ @public
+ @namespace
+ @for DS
+ @param {Array} errors array of errors in JSON-API format
+ @return {Object}
+*/
+function errorsArrayToHash(errors) {
+ var out = {};
+
+ if (Ember.isPresent(errors)) {
+ errors.forEach(error => {
+ if (error.source && error.source.pointer) {
+ var key = error.source.pointer.match(SOURCE_POINTER_REGEXP);
+
+ if (key) {
+ key = key[2];
+ } else if (error.source.pointer.search(SOURCE_POINTER_PRIMARY_REGEXP) !== -1) {
+ key = PRIMARY_ATTRIBUTE_KEY;
+ }
+
+ if (key) {
+ out[key] = out[key] || [];
+ out[key].push(error.detail || error.title);
+ }
+ }
+ });
+ }
+
+ return out;
+}
+
+var EmberOrderedSet = Ember.OrderedSet;
+
+function OrderedSet() {
+ this._super$constructor();
+}
+
+OrderedSet.create = function () {
+ var Constructor = this;
+ return new Constructor();
+};
+
+OrderedSet.prototype = Object.create(EmberOrderedSet.prototype);
+OrderedSet.prototype.constructor = OrderedSet;
+OrderedSet.prototype._super$constructor = EmberOrderedSet;
+
+OrderedSet.prototype.addWithIndex = function (obj, idx) {
+ var guid = Ember.guidFor(obj);
+ var presenceSet = this.presenceSet;
+ var list = this.list;
+
+ if (presenceSet[guid] === true) {
+ return;
+ }
+
+ presenceSet[guid] = true;
+
+ if (idx === undefined || idx === null) {
+ list.push(obj);
+ } else {
+ list.splice(idx, 0, obj);
+ }
+
+ this.size += 1;
+
+ return this;
+};
+
+/*
+ This method normalizes a link to an "links object". If the passed link is
+ already an object it's returned without any modifications.
+
+ See http://jsonapi.org/format/#document-links for more information.
+
+ @method _normalizeLink
+ @private
+ @param {String} link
+ @return {Object|null}
+ @for DS
+*/
+function _normalizeLink(link) {
+ switch (typeof link) {
+ case 'object':
+ return link;
+ case 'string':
+ return { href: link };
+ }
+ return null;
+}
+
+class Relationship {
+ constructor(store, internalModel, inverseKey, relationshipMeta) {
+ var async = relationshipMeta.options.async;
+ var polymorphic = relationshipMeta.options.polymorphic;
+ this.members = new OrderedSet();
+ this.canonicalMembers = new OrderedSet();
+ this.store = store;
+ this.key = relationshipMeta.key;
+ this.inverseKey = inverseKey;
+ this.internalModel = internalModel;
+ this.isAsync = typeof async === 'undefined' ? true : async;
+ this.isPolymorphic = typeof polymorphic === 'undefined' ? true : polymorphic;
+ this.relationshipMeta = relationshipMeta;
+ //This probably breaks for polymorphic relationship in complex scenarios, due to
+ //multiple possible modelNames
+ this.inverseKeyForImplicit = this.internalModel.modelName + this.key;
+ this.linkPromise = null;
+ this.meta = null;
+ this.hasData = false;
+ this.hasLoaded = false;
+ this.__inverseMeta = undefined;
+ }
+
+ _inverseIsAsync() {
+ var inverseMeta = this._inverseMeta;
+ if (!inverseMeta) {
+ return false;
+ }
+
+ var inverseAsync = inverseMeta.options.async;
+ return typeof inverseAsync === 'undefined' ? true : inverseAsync;
+ }
+
+ _inverseIsSync() {
+ var inverseMeta = this._inverseMeta;
+ if (!inverseMeta) {
+ return false;
+ }
+
+ var inverseAsync = inverseMeta.options.async;
+ return typeof inverseAsync === 'undefined' ? false : !inverseAsync;
+ }
+
+ get _inverseMeta() {
+ if (this.__inverseMeta === undefined) {
+ var inverseMeta = null;
+
+ if (this.inverseKey) {
+ var inverseModelClass = this.store.modelFor(this.relationshipMeta.type);
+ var inverseRelationships = Ember.get(inverseModelClass, 'relationshipsByName');
+ inverseMeta = inverseRelationships.get(this.inverseKey);
+ }
+
+ this.__inverseMeta = inverseMeta;
+ }
+
+ return this.__inverseMeta;
+ }
+
+ get parentType() {
+ return this.internalModel.modelName;
+ }
+
+ internalModelDidDematerialize() {
+ if (!this.inverseKey) {
+ return;
+ }
+
+ this.forAllMembers(inverseInternalModel => {
+ var relationship = inverseInternalModel._relationships.get(this.inverseKey);
+ relationship.inverseDidDematerialize(this.internalModel);
+ });
+ }
+
+ inverseDidDematerialize(inverseInternalModel) {
+ if (!this.isAsync) {
+ // unloading inverse of a sync relationship is treated as a client-side
+ // delete, so actually remove the models don't merely invalidate the cp
+ // cache.
+ this.removeInternalModelFromOwn(inverseInternalModel);
+ this.removeCanonicalInternalModelFromOwn(inverseInternalModel);
+ }
+ }
+
+ updateMeta(meta) {
+ this.meta = meta;
+ }
+
+ clear() {
+
+ var members = this.members.list;
+ while (members.length > 0) {
+ var member = members[0];
+ this.removeInternalModel(member);
+ }
+
+ var canonicalMembers = this.canonicalMembers.list;
+ while (canonicalMembers.length > 0) {
+ var _member = canonicalMembers[0];
+ this.removeCanonicalInternalModel(_member);
+ }
+ }
+
+ removeAllInternalModelsFromOwn() {
+ this.members.clear();
+ this.internalModel.updateRecordArrays();
+ }
+
+ removeAllCanonicalInternalModelsFromOwn() {
+ this.canonicalMembers.clear();
+ this.flushCanonicalLater();
+ }
+
+ removeInternalModels(internalModels) {
+ internalModels.forEach(internalModel => this.removeInternalModel(internalModel));
+ }
+
+ addInternalModels(internalModels, idx) {
+ internalModels.forEach(internalModel => {
+ this.addInternalModel(internalModel, idx);
+ if (idx !== undefined) {
+ idx++;
+ }
+ });
+ }
+
+ addCanonicalInternalModels(internalModels, idx) {
+ for (var i = 0; i < internalModels.length; i++) {
+ if (idx !== undefined) {
+ this.addCanonicalInternalModel(internalModels[i], i + idx);
+ } else {
+ this.addCanonicalInternalModel(internalModels[i]);
+ }
+ }
+ }
+
+ addCanonicalInternalModel(internalModel, idx) {
+ if (!this.canonicalMembers.has(internalModel)) {
+ this.canonicalMembers.add(internalModel);
+ this.setupInverseRelationship(internalModel);
+ }
+ this.flushCanonicalLater();
+ this.setHasData(true);
+ }
+
+ setupInverseRelationship(internalModel) {
+ if (this.inverseKey) {
+ var relationships = internalModel._relationships;
+ var relationshipExisted = relationships.has(this.inverseKey);
+ var relationship = relationships.get(this.inverseKey);
+ if (relationshipExisted || this.isPolymorphic) {
+ // if we have only just initialized the inverse relationship, then it
+ // already has this.internalModel in its canonicalMembers, so skip the
+ // unnecessary work. The exception to this is polymorphic
+ // relationships whose members are determined by their inverse, as those
+ // relationships cannot efficiently find their inverse payloads.
+ relationship.addCanonicalInternalModel(this.internalModel);
+ }
+ } else {
+ var _relationships = internalModel._implicitRelationships;
+ var _relationship = _relationships[this.inverseKeyForImplicit];
+ if (!_relationship) {
+ _relationship = _relationships[this.inverseKeyForImplicit] = new Relationship(this.store, internalModel, this.key, { options: { async: this.isAsync }, type: this.parentType });
+ }
+ _relationship.addCanonicalInternalModel(this.internalModel);
+ }
+ }
+
+ removeCanonicalInternalModels(internalModels, idx) {
+ for (var i = 0; i < internalModels.length; i++) {
+ if (idx !== undefined) {
+ this.removeCanonicalInternalModel(internalModels[i], i + idx);
+ } else {
+ this.removeCanonicalInternalModel(internalModels[i]);
+ }
+ }
+ }
+
+ removeCanonicalInternalModel(internalModel, idx) {
+ if (this.canonicalMembers.has(internalModel)) {
+ this.removeCanonicalInternalModelFromOwn(internalModel);
+ if (this.inverseKey) {
+ this.removeCanonicalInternalModelFromInverse(internalModel);
+ } else {
+ if (internalModel._implicitRelationships[this.inverseKeyForImplicit]) {
+ internalModel._implicitRelationships[this.inverseKeyForImplicit].removeCanonicalInternalModel(this.internalModel);
+ }
+ }
+ }
+ this.flushCanonicalLater();
+ }
+
+ addInternalModel(internalModel, idx) {
+ if (!this.members.has(internalModel)) {
+ this.members.addWithIndex(internalModel, idx);
+ this.notifyRecordRelationshipAdded(internalModel, idx);
+ if (this.inverseKey) {
+ internalModel._relationships.get(this.inverseKey).addInternalModel(this.internalModel);
+ } else {
+ if (!internalModel._implicitRelationships[this.inverseKeyForImplicit]) {
+ internalModel._implicitRelationships[this.inverseKeyForImplicit] = new Relationship(this.store, internalModel, this.key, { options: { async: this.isAsync }, type: this.parentType });
+ }
+ internalModel._implicitRelationships[this.inverseKeyForImplicit].addInternalModel(this.internalModel);
+ }
+ this.internalModel.updateRecordArrays();
+ }
+ this.setHasData(true);
+ }
+
+ removeInternalModel(internalModel) {
+ if (this.members.has(internalModel)) {
+ this.removeInternalModelFromOwn(internalModel);
+ if (this.inverseKey) {
+ this.removeInternalModelFromInverse(internalModel);
+ } else {
+ if (internalModel._implicitRelationships[this.inverseKeyForImplicit]) {
+ internalModel._implicitRelationships[this.inverseKeyForImplicit].removeInternalModel(this.internalModel);
+ }
+ }
+ }
+ }
+
+ removeInternalModelFromInverse(internalModel) {
+ var inverseRelationship = internalModel._relationships.get(this.inverseKey);
+ //Need to check for existence, as the record might unloading at the moment
+ if (inverseRelationship) {
+ inverseRelationship.removeInternalModelFromOwn(this.internalModel);
+ }
+ }
+
+ removeInternalModelFromOwn(internalModel) {
+ this.members.delete(internalModel);
+ this.internalModel.updateRecordArrays();
+ }
+
+ removeCanonicalInternalModelFromInverse(internalModel) {
+ var inverseRelationship = internalModel._relationships.get(this.inverseKey);
+ //Need to check for existence, as the record might unloading at the moment
+ if (inverseRelationship) {
+ inverseRelationship.removeCanonicalInternalModelFromOwn(this.internalModel);
+ }
+ }
+
+ removeCanonicalInternalModelFromOwn(internalModel) {
+ this.canonicalMembers.delete(internalModel);
+ this.flushCanonicalLater();
+ }
+
+ /*
+ Call this method once a record deletion has been persisted
+ to purge it from BOTH current and canonical state of all
+ relationships.
+ @method removeCompletelyFromInverse
+ @private
+ */
+ removeCompletelyFromInverse() {
+ if (!this.inverseKey) {
+ return;
+ }
+
+ // we actually want a union of members and canonicalMembers
+ // they should be disjoint but currently are not due to a bug
+ var seen = Object.create(null);
+ var internalModel = this.internalModel;
+
+ var unload = inverseInternalModel => {
+ var id = Ember.guidFor(inverseInternalModel);
+
+ if (seen[id] === undefined) {
+ var relationship = inverseInternalModel._relationships.get(this.inverseKey);
+ relationship.removeCompletelyFromOwn(internalModel);
+ seen[id] = true;
+ }
+ };
+
+ this.members.forEach(unload);
+ this.canonicalMembers.forEach(unload);
+
+ if (!this.isAsync) {
+ this.clear();
+ }
+ }
+
+ forAllMembers(callback) {
+ var seen = Object.create(null);
+
+ for (var i = 0; i < this.members.list.length; i++) {
+ var inverseInternalModel = this.members.list[i];
+ var id = Ember.guidFor(inverseInternalModel);
+ if (!seen[id]) {
+ seen[id] = true;
+ callback(inverseInternalModel);
+ }
+ }
+
+ for (var _i = 0; _i < this.canonicalMembers.list.length; _i++) {
+ var _inverseInternalModel = this.canonicalMembers.list[_i];
+ var _id = Ember.guidFor(_inverseInternalModel);
+ if (!seen[_id]) {
+ seen[_id] = true;
+ callback(_inverseInternalModel);
+ }
+ }
+ }
+
+ /*
+ Removes the given internalModel from BOTH canonical AND current state.
+ This method is useful when either a deletion or a rollback on a new record
+ needs to entirely purge itself from an inverse relationship.
+ */
+ removeCompletelyFromOwn(internalModel) {
+ this.canonicalMembers.delete(internalModel);
+ this.members.delete(internalModel);
+ this.internalModel.updateRecordArrays();
+ }
+
+ flushCanonical() {
+ var list = this.members.list;
+ this.willSync = false;
+ //a hack for not removing new internalModels
+ //TODO remove once we have proper diffing
+ var newInternalModels = [];
+ for (var i = 0; i < list.length; i++) {
+ if (list[i].isNew()) {
+ newInternalModels.push(list[i]);
+ }
+ }
+
+ //TODO(Igor) make this less abysmally slow
+ this.members = this.canonicalMembers.copy();
+ for (var _i2 = 0; _i2 < newInternalModels.length; _i2++) {
+ this.members.add(newInternalModels[_i2]);
+ }
+ }
+
+ flushCanonicalLater() {
+ if (this.willSync) {
+ return;
+ }
+ this.willSync = true;
+ this.store._updateRelationshipState(this);
+ }
+
+ updateLink(link, initial) {
+ (true && Ember.warn(`You pushed a record of type '${this.internalModel.modelName}' with a relationship '${this.key}' configured as 'async: false'. You've included a link but no primary data, this may be an error in your payload.`, this.isAsync || this.hasData, {
+ id: 'ds.store.push-link-for-sync-relationship'
+ }));
+ (true && !(typeof link === 'string' || link === null) && Ember.assert(`You have pushed a record of type '${this.internalModel.modelName}' with '${this.key}' as a link, but the value of that link is not a string.`, typeof link === 'string' || link === null));
+
+
+ this.link = link;
+ this.linkPromise = null;
+
+ if (!initial) {
+ this.internalModel.notifyPropertyChange(this.key);
+ }
+ }
+
+ findLink() {
+ if (this.linkPromise) {
+ return this.linkPromise;
+ } else {
+ var promise = this.fetchLink();
+ this.linkPromise = promise;
+ return promise.then(result => result);
+ }
+ }
+
+ updateInternalModelsFromAdapter(internalModels) {
+ this.setHasData(true);
+ //TODO(Igor) move this to a proper place
+ //TODO Once we have adapter support, we need to handle updated and canonical changes
+ this.computeChanges(internalModels);
+ }
+
+ notifyRecordRelationshipAdded() {}
+
+ /*
+ `hasData` for a relationship is a flag to indicate if we consider the
+ content of this relationship "known". Snapshots uses this to tell the
+ difference between unknown (`undefined`) or empty (`null`). The reason for
+ this is that we wouldn't want to serialize unknown relationships as `null`
+ as that might overwrite remote state.
+ All relationships for a newly created (`store.createRecord()`) are
+ considered known (`hasData === true`).
+ */
+ setHasData(value) {
+ this.hasData = value;
+ }
+
+ /*
+ `hasLoaded` is a flag to indicate if we have gotten data from the adapter or
+ not when the relationship has a link.
+ This is used to be able to tell when to fetch the link and when to return
+ the local data in scenarios where the local state is considered known
+ (`hasData === true`).
+ Updating the link will automatically set `hasLoaded` to `false`.
+ */
+ setHasLoaded(value) {
+ this.hasLoaded = value;
+ }
+
+ /*
+ `push` for a relationship allows the store to push a JSON API Relationship
+ Object onto the relationship. The relationship will then extract and set the
+ meta, data and links of that relationship.
+ `push` use `updateMeta`, `updateData` and `updateLink` to update the state
+ of the relationship.
+ */
+ push(payload, initial) {
+
+ var hasData = false;
+ var hasLink = false;
+
+ if (payload.meta) {
+ this.updateMeta(payload.meta);
+ }
+
+ if (payload.data !== undefined) {
+ hasData = true;
+ this.updateData(payload.data, initial);
+ }
+
+ if (payload.links && payload.links.related) {
+ var relatedLink = _normalizeLink(payload.links.related);
+ if (relatedLink && relatedLink.href && relatedLink.href !== this.link) {
+ hasLink = true;
+ this.updateLink(relatedLink.href, initial);
+ }
+ }
+
+ /*
+ Data being pushed into the relationship might contain only data or links,
+ or a combination of both.
+ If we got data we want to set both hasData and hasLoaded to true since
+ this would indicate that we should prefer the local state instead of
+ trying to fetch the link or call findRecord().
+ If we have no data but a link is present we want to set hasLoaded to false
+ without modifying the hasData flag. This will ensure we fetch the updated
+ link next time the relationship is accessed.
+ */
+ if (hasData) {
+ this.setHasData(true);
+ this.setHasLoaded(true);
+ } else if (hasLink) {
+ this.setHasLoaded(false);
+ }
+ }
+
+ updateData() {}
+
+ destroy() {}
+}
+
+function _bind(fn, ...args) {
+
+ return function () {
+ return fn.apply(undefined, args);
+ };
+}
+
+function _guard(promise, test) {
+ var guarded = promise['finally'](function () {
+ if (!test()) {
+ guarded._subscribers.length = 0;
+ }
+ });
+
+ return guarded;
+}
+
+function _objectIsAlive(object) {
+ return !(Ember.get(object, "isDestroyed") || Ember.get(object, "isDestroying"));
+}
+
+/**
+ @namespace
+ @method diffArray
+ @private
+ @param {Array} oldArray the old array
+ @param {Array} newArray the new array
+ @return {hash} {
+ firstChangeIndex: <integer>, // null if no change
+ addedCount: <integer>, // 0 if no change
+ removedCount: <integer> // 0 if no change
+ }
+*/
+function diffArray(oldArray, newArray) {
+ var oldLength = oldArray.length;
+ var newLength = newArray.length;
+
+ var shortestLength = Math.min(oldLength, newLength);
+ var firstChangeIndex = null; // null signifies no changes
+
+ // find the first change
+ for (var i = 0; i < shortestLength; i++) {
+ // compare each item in the array
+ if (oldArray[i] !== newArray[i]) {
+ firstChangeIndex = i;
+ break;
+ }
+ }
+
+ if (firstChangeIndex === null && newLength !== oldLength) {
+ // no change found in the overlapping block
+ // and array lengths differ,
+ // so change starts at end of overlap
+ firstChangeIndex = shortestLength;
+ }
+
+ var addedCount = 0;
+ var removedCount = 0;
+ if (firstChangeIndex !== null) {
+ // we found a change, find the end of the change
+ var unchangedEndBlockLength = shortestLength - firstChangeIndex;
+ // walk back from the end of both arrays until we find a change
+ for (var _i = 1; _i <= shortestLength; _i++) {
+ // compare each item in the array
+ if (oldArray[oldLength - _i] !== newArray[newLength - _i]) {
+ unchangedEndBlockLength = _i - 1;
+ break;
+ }
+ }
+ addedCount = newLength - unchangedEndBlockLength - firstChangeIndex;
+ removedCount = oldLength - unchangedEndBlockLength - firstChangeIndex;
+ }
+
+ return {
+ firstChangeIndex,
+ addedCount,
+ removedCount
+ };
+}
+
+/**
+ A `ManyArray` is a `MutableArray` that represents the contents of a has-many
+ relationship.
+
+ The `ManyArray` is instantiated lazily the first time the relationship is
+ requested.
+
+ ### Inverses
+
+ Often, the relationships in Ember Data applications will have
+ an inverse. For example, imagine the following models are
+ defined:
+
+ ```app/models/post.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ comments: DS.hasMany('comment')
+ });
+ ```
+
+ ```app/models/comment.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ post: DS.belongsTo('post')
+ });
+ ```
+
+ If you created a new instance of `App.Post` and added
+ a `App.Comment` record to its `comments` has-many
+ relationship, you would expect the comment's `post`
+ property to be set to the post that contained
+ the has-many.
+
+ We call the record to which a relationship belongs the
+ relationship's _owner_.
+
+ @class ManyArray
+ @namespace DS
+ @extends Ember.Object
+ @uses Ember.MutableArray, Ember.Evented
+*/
+var ManyArray = Ember.Object.extend(Ember.MutableArray, Ember.Evented, {
+ init() {
+ this._super(...arguments);
+
+ /**
+ The loading state of this array
+ @property {Boolean} isLoaded
+ */
+ this.isLoaded = false;
+ this.length = 0;
+
+ /**
+ Used for async `hasMany` arrays
+ to keep track of when they will resolve.
+ @property {Ember.RSVP.Promise} promise
+ @private
+ */
+ this.promise = null;
+
+ /**
+ Metadata associated with the request for async hasMany relationships.
+ Example
+ Given that the server returns the following JSON payload when fetching a
+ hasMany relationship:
+ ```js
+ {
+ "comments": [{
+ "id": 1,
+ "comment": "This is the first comment",
+ }, {
+ // ...
+ }],
+ "meta": {
+ "page": 1,
+ "total": 5
+ }
+ }
+ ```
+ You can then access the metadata via the `meta` property:
+ ```js
+ post.get('comments').then(function(comments) {
+ var meta = comments.get('meta');
+ // meta.page => 1
+ // meta.total => 5
+ });
+ ```
+ @property {Object} meta
+ @public
+ */
+ this.meta = this.meta || null;
+
+ /**
+ `true` if the relationship is polymorphic, `false` otherwise.
+ @property {Boolean} isPolymorphic
+ @private
+ */
+ this.isPolymorphic = this.isPolymorphic || false;
+
+ /**
+ The relationship which manages this array.
+ @property {ManyRelationship} relationship
+ @private
+ */
+ this.relationship = this.relationship || null;
+
+ this.currentState = [];
+ this.flushCanonical(false);
+ },
+
+ objectAt(index) {
+ var internalModel = this.currentState[index];
+ if (internalModel === undefined) {
+ return;
+ }
+
+ return internalModel.getRecord();
+ },
+
+ flushCanonical(isInitialized = true) {
+ // It’s possible the parent side of the relationship may have been unloaded by this point
+ if (!_objectIsAlive(this)) {
+ return;
+ }
+ var toSet = this.canonicalState;
+
+ //a hack for not removing new records
+ //TODO remove once we have proper diffing
+ var newInternalModels = this.currentState.filter(
+ // only add new internalModels which are not yet in the canonical state of this
+ // relationship (a new internalModel can be in the canonical state if it has
+ // been 'acknowleged' to be in the relationship via a store.push)
+ internalModel => internalModel.isNew() && toSet.indexOf(internalModel) === -1);
+ toSet = toSet.concat(newInternalModels);
+
+ // diff to find changes
+ var diff = diffArray(this.currentState, toSet);
+
+ if (diff.firstChangeIndex !== null) {
+ // it's null if no change found
+ // we found a change
+ this.arrayContentWillChange(diff.firstChangeIndex, diff.removedCount, diff.addedCount);
+ this.set('length', toSet.length);
+ this.currentState = toSet;
+ this.arrayContentDidChange(diff.firstChangeIndex, diff.removedCount, diff.addedCount);
+ if (isInitialized && diff.addedCount > 0) {
+ //notify only on additions
+ //TODO only notify if unloaded
+ this.relationship.notifyHasManyChanged();
+ }
+ }
+ },
+
+ internalReplace(idx, amt, objects) {
+ if (!objects) {
+ objects = [];
+ }
+ this.arrayContentWillChange(idx, amt, objects.length);
+ this.currentState.splice.apply(this.currentState, [idx, amt].concat(objects));
+ this.set('length', this.currentState.length);
+ this.arrayContentDidChange(idx, amt, objects.length);
+ },
+
+ //TODO(Igor) optimize
+ _removeInternalModels(internalModels) {
+ for (var i = 0; i < internalModels.length; i++) {
+ var index = this.currentState.indexOf(internalModels[i]);
+ this.internalReplace(index, 1);
+ }
+ },
+
+ //TODO(Igor) optimize
+ _addInternalModels(internalModels, idx) {
+ if (idx === undefined) {
+ idx = this.currentState.length;
+ }
+ this.internalReplace(idx, 0, internalModels);
+ },
+
+ replace(idx, amt, objects) {
+ var internalModels = void 0;
+ if (amt > 0) {
+ internalModels = this.currentState.slice(idx, idx + amt);
+ this.get('relationship').removeInternalModels(internalModels);
+ }
+ if (objects) {
+ this.get('relationship').addInternalModels(objects.map(obj => obj._internalModel), idx);
+ }
+ },
+
+ /**
+ Reloads all of the records in the manyArray. If the manyArray
+ holds a relationship that was originally fetched using a links url
+ Ember Data will revisit the original links url to repopulate the
+ relationship.
+ If the manyArray holds the result of a `store.query()` reload will
+ re-run the original query.
+ Example
+ ```javascript
+ var user = store.peekRecord('user', 1)
+ user.login().then(function() {
+ user.get('permissions').then(function(permissions) {
+ return permissions.reload();
+ });
+ });
+ ```
+ @method reload
+ @public
+ */
+ reload() {
+ return this.relationship.reload();
+ },
+
+ /**
+ Saves all of the records in the `ManyArray`.
+ Example
+ ```javascript
+ store.findRecord('inbox', 1).then(function(inbox) {
+ inbox.get('messages').then(function(messages) {
+ messages.forEach(function(message) {
+ message.set('isRead', true);
+ });
+ messages.save()
+ });
+ });
+ ```
+ @method save
+ @return {DS.PromiseArray} promise
+ */
+ save() {
+ var manyArray = this;
+ var promiseLabel = 'DS: ManyArray#save ' + Ember.get(this, 'type');
+ var promise = Ember.RSVP.all(this.invoke("save"), promiseLabel).then(() => manyArray, null, 'DS: ManyArray#save return ManyArray');
+
+ return PromiseArray.create({ promise });
+ },
+
+ /**
+ Create a child record within the owner
+ @method createRecord
+ @private
+ @param {Object} hash
+ @return {DS.Model} record
+ */
+ createRecord(hash) {
+ var store = Ember.get(this, 'store');
+ var type = Ember.get(this, 'type');
+
+ (true && !(!Ember.get(this, 'isPolymorphic')) && Ember.assert(`You cannot add '${type.modelName}' records to this polymorphic relationship.`, !Ember.get(this, 'isPolymorphic')));
+
+ var record = store.createRecord(type.modelName, hash);
+ this.pushObject(record);
+
+ return record;
+ }
+});
+
+class ManyRelationship extends Relationship {
+ constructor(store, internalModel, inverseKey, relationshipMeta) {
+ super(store, internalModel, inverseKey, relationshipMeta);
+ this.belongsToType = relationshipMeta.type;
+ this.canonicalState = [];
+ this.isPolymorphic = relationshipMeta.options.polymorphic;
+ // The ManyArray for this relationship
+ this._manyArray = null;
+ // The previous ManyArray for this relationship. It will be destroyed when
+ // we create a new many array, but in the interim it will be updated if
+ // inverse internal models are unloaded.
+ this._retainedManyArray = null;
+ this.__loadingPromise = null;
+ }
+
+ get _loadingPromise() {
+ return this.__loadingPromise;
+ }
+ _updateLoadingPromise(promise, content) {
+ if (this.__loadingPromise) {
+ if (content) {
+ this.__loadingPromise.set('content', content);
+ }
+ this.__loadingPromise.set('promise', promise);
+ } else {
+ this.__loadingPromise = PromiseManyArray.create({
+ promise,
+ content
+ });
+ }
+
+ return this.__loadingPromise;
+ }
+
+ get manyArray() {
+ (true && !(this._manyArray === null || this._retainedManyArray === null) && Ember.assert(`Error: relationship ${this.parentType}:${this.key} has both many array and retained many array`, this._manyArray === null || this._retainedManyArray === null));
+
+
+ if (!this._manyArray) {
+ this._manyArray = ManyArray.create({
+ canonicalState: this.canonicalState,
+ store: this.store,
+ relationship: this,
+ type: this.store.modelFor(this.belongsToType),
+ record: this.internalModel,
+ meta: this.meta,
+ isPolymorphic: this.isPolymorphic
+ });
+
+ if (this._retainedManyArray !== null) {
+ this._retainedManyArray.destroy();
+ this._retainedManyArray = null;
+ }
+ }
+
+ return this._manyArray;
+ }
+
+ removeInverseRelationships() {
+ super.removeInverseRelationships();
+ if (this._manyArray) {
+ this._manyArray.destroy();
+ this._manyArray = null;
+ }
+
+ if (this._loadingPromise) {
+ this._loadingPromise.destroy();
+ }
+ }
+
+ updateMeta(meta) {
+ super.updateMeta(meta);
+ if (this._manyArray) {
+ this._manyArray.set('meta', meta);
+ }
+ }
+
+ addCanonicalInternalModel(internalModel, idx) {
+ if (this.canonicalMembers.has(internalModel)) {
+ return;
+ }
+ if (idx !== undefined) {
+ this.canonicalState.splice(idx, 0, internalModel);
+ } else {
+ this.canonicalState.push(internalModel);
+ }
+ super.addCanonicalInternalModel(internalModel, idx);
+ }
+
+ inverseDidDematerialize(inverseInternalModel) {
+ super.inverseDidDematerialize(inverseInternalModel);
+ if (this.isAsync) {
+ if (this._manyArray) {
+ this._retainedManyArray = this._manyArray;
+ this._manyArray = null;
+ }
+ this._removeInternalModelFromManyArray(this._retainedManyArray, inverseInternalModel);
+ }
+ this.notifyHasManyChanged();
+ }
+
+ addInternalModel(internalModel, idx) {
+ if (this.members.has(internalModel)) {
+ return;
+ }
+
+ emberData_Debug.assertPolymorphicType(this.internalModel, this.relationshipMeta, internalModel);
+ super.addInternalModel(internalModel, idx);
+ // make lazy later
+ this.manyArray._addInternalModels([internalModel], idx);
+ }
+
+ removeCanonicalInternalModelFromOwn(internalModel, idx) {
+ var i = idx;
+ if (!this.canonicalMembers.has(internalModel)) {
+ return;
+ }
+ if (i === undefined) {
+ i = this.canonicalState.indexOf(internalModel);
+ }
+ if (i > -1) {
+ this.canonicalState.splice(i, 1);
+ }
+ super.removeCanonicalInternalModelFromOwn(internalModel, idx);
+ }
+
+ removeAllCanonicalInternalModelsFromOwn() {
+ super.removeAllCanonicalInternalModelsFromOwn();
+ this.canonicalMembers.clear();
+ this.canonicalState.splice(0, this.canonicalState.length);
+ }
+
+ removeCompletelyFromOwn(internalModel) {
+ super.removeCompletelyFromOwn(internalModel);
+
+ var canonicalIndex = this.canonicalState.indexOf(internalModel);
+
+ if (canonicalIndex !== -1) {
+ this.canonicalState.splice(canonicalIndex, 1);
+ }
+
+ var manyArray = this._manyArray;
+
+ if (manyArray) {
+ var idx = manyArray.currentState.indexOf(internalModel);
+
+ if (idx !== -1) {
+ manyArray.internalReplace(idx, 1);
+ }
+ }
+ }
+
+ flushCanonical() {
+ if (this._manyArray) {
+ this._manyArray.flushCanonical();
+ }
+ super.flushCanonical();
+ }
+
+ removeInternalModelFromOwn(internalModel, idx) {
+ if (!this.members.has(internalModel)) {
+ return;
+ }
+ super.removeInternalModelFromOwn(internalModel, idx);
+ // note that ensuring the many array is created, via `this.manyArray`
+ // (instead of `this._manyArray`) is intentional.
+ //
+ // Because we're removing from local, and not canonical, state, it is
+ // important that the many array is initialized now with those changes,
+ // otherwise it will be initialized with canonical state and we'll have
+ // lost the fact that this internalModel was removed.
+ this._removeInternalModelFromManyArray(this.manyArray, internalModel, idx);
+ this._removeInternalModelFromManyArray(this._retainedManyArray, internalModel, idx);
+ }
+
+ removeAllInternalModelsFromOwn() {
+ super.removeAllInternalModelsFromOwn();
+ // as with removeInternalModelFromOwn, we make sure the many array is
+ // instantiated, or we'll lose local removals, as we're not updating
+ // canonical state here.
+ this.manyArray.clear();
+ if (this._retainedManyArray) {
+ this._retainedManyArray.clear();
+ }
+ }
+
+ _removeInternalModelFromManyArray(manyArray, internalModel, idx) {
+ if (manyArray === null) {
+ return;
+ }
+
+ if (idx !== undefined) {
+ //TODO(Igor) not used currently, fix
+ manyArray.currentState.removeAt(idx);
+ } else {
+ manyArray._removeInternalModels([internalModel]);
+ }
+ }
+
+ notifyRecordRelationshipAdded(internalModel, idx) {
+ this.internalModel.notifyHasManyAdded(this.key, internalModel, idx);
+ }
+
+ reload() {
+ var manyArray = this.manyArray;
+ var manyArrayLoadedState = manyArray.get('isLoaded');
+
+ if (this._loadingPromise) {
+ if (this._loadingPromise.get('isPending')) {
+ return this._loadingPromise;
+ }
+ if (this._loadingPromise.get('isRejected')) {
+ manyArray.set('isLoaded', manyArrayLoadedState);
+ }
+ }
+
+ var promise = void 0;
+ if (this.link) {
+ promise = this.fetchLink();
+ } else {
+ promise = this.store._scheduleFetchMany(manyArray.currentState).then(() => manyArray);
+ }
+
+ this._updateLoadingPromise(promise);
+ return this._loadingPromise;
+ }
+
+ computeChanges(internalModels = []) {
+ var members = this.canonicalMembers;
+ var internalModelsToRemove = [];
+ var internalModelSet = setForArray(internalModels);
+
+ members.forEach(member => {
+ if (internalModelSet.has(member)) {
+ return;
+ }
+
+ internalModelsToRemove.push(member);
+ });
+
+ this.removeCanonicalInternalModels(internalModelsToRemove);
+
+ for (var i = 0, l = internalModels.length; i < l; i++) {
+ var internalModel = internalModels[i];
+ this.removeCanonicalInternalModel(internalModel);
+ this.addCanonicalInternalModel(internalModel, i);
+ }
+ }
+
+ setInitialInternalModels(internalModels) {
+ if (Array.isArray(internalModels) === false || internalModels.length === 0) {
+ return;
+ }
+
+ for (var i = 0; i < internalModels.length; i++) {
+ var internalModel = internalModels[i];
+ if (this.canonicalMembers.has(internalModel)) {
+ continue;
+ }
+
+ this.canonicalMembers.add(internalModel);
+ this.members.add(internalModel);
+ this.setupInverseRelationship(internalModel);
+ }
+
+ this.canonicalState = this.canonicalMembers.toArray();
+ }
+
+ fetchLink() {
+ return this.store.findHasMany(this.internalModel, this.link, this.relationshipMeta).then(records => {
+ if (records.hasOwnProperty('meta')) {
+ this.updateMeta(records.meta);
+ }
+ this.store._backburner.join(() => {
+ this.updateInternalModelsFromAdapter(records);
+ this.manyArray.set('isLoaded', true);
+ this.setHasData(true);
+ });
+ return this.manyArray;
+ });
+ }
+
+ findRecords() {
+ var manyArray = this.manyArray;
+ var internalModels = manyArray.currentState;
+
+ //TODO CLEANUP
+ return this.store.findMany(internalModels).then(() => {
+ if (!manyArray.get('isDestroyed')) {
+ //Goes away after the manyArray refactor
+ manyArray.set('isLoaded', true);
+ }
+ return manyArray;
+ });
+ }
+
+ notifyHasManyChanged() {
+ this.internalModel.notifyHasManyAdded(this.key);
+ }
+
+ getRecords() {
+ //TODO(Igor) sync server here, once our syncing is not stupid
+ var manyArray = this.manyArray;
+ if (this.isAsync) {
+ var promise = void 0;
+ if (this.link) {
+ if (this.hasLoaded) {
+ promise = this.findRecords();
+ } else {
+ promise = this.findLink().then(() => this.findRecords());
+ }
+ } else {
+ promise = this.findRecords();
+ }
+ return this._updateLoadingPromise(promise, manyArray);
+ } else {
+ (true && !(manyArray.isEvery('isEmpty', false)) && Ember.assert(`You looked up the '${this.key}' relationship on a '${this.internalModel.type.modelName}' with id ${this.internalModel.id} but some of the associated records were not loaded. Either make sure they are all loaded together with the parent record, or specify that the relationship is async ('DS.hasMany({ async: true })')`, manyArray.isEvery('isEmpty', false)));
+
+ //TODO(Igor) WTF DO I DO HERE?
+ // TODO @runspired equal WTFs to Igor
+
+ if (!manyArray.get('isDestroyed')) {
+ manyArray.set('isLoaded', true);
+ }
+ return manyArray;
+ }
+ }
+
+ updateData(data, initial) {
+ var internalModels = this.store._pushResourceIdentifiers(this, data);
+ if (initial) {
+ this.setInitialInternalModels(internalModels);
+ } else {
+ this.updateInternalModelsFromAdapter(internalModels);
+ }
+ }
+
+ destroy() {
+ super.destroy();
+ var manyArray = this._manyArray;
+ if (manyArray) {
+ manyArray.destroy();
+ this._manyArray = null;
+ }
+
+ var proxy = this.__loadingPromise;
+
+ if (proxy) {
+ proxy.destroy();
+ this.__loadingPromise = null;
+ }
+ }
+}
+
+function setForArray(array) {
+ var set = new OrderedSet();
+
+ if (array) {
+ for (var i = 0, l = array.length; i < l; i++) {
+ set.add(array[i]);
+ }
+ }
+
+ return set;
+}
+
+class BelongsToRelationship extends Relationship {
+ constructor(store, internalModel, inverseKey, relationshipMeta) {
+ super(store, internalModel, inverseKey, relationshipMeta);
+ this.internalModel = internalModel;
+ this.key = relationshipMeta.key;
+ this.inverseInternalModel = null;
+ this.canonicalState = null;
+ }
+
+ setInternalModel(internalModel) {
+ if (internalModel) {
+ this.addInternalModel(internalModel);
+ } else if (this.inverseInternalModel) {
+ this.removeInternalModel(this.inverseInternalModel);
+ }
+ this.setHasData(true);
+ this.setHasLoaded(true);
+ }
+
+ setCanonicalInternalModel(internalModel) {
+ if (internalModel) {
+ this.addCanonicalInternalModel(internalModel);
+ } else if (this.canonicalState) {
+ this.removeCanonicalInternalModel(this.canonicalState);
+ }
+ this.flushCanonicalLater();
+ }
+
+ setInitialCanonicalInternalModel(internalModel) {
+ if (!internalModel) {
+ return;
+ }
+
+ // When we initialize a belongsTo relationship, we want to avoid work like
+ // notifying our internalModel that we've "changed" and excessive thrash on
+ // setting up inverse relationships
+ this.canonicalMembers.add(internalModel);
+ this.members.add(internalModel);
+ this.inverseInternalModel = this.canonicalState = internalModel;
+ this.setupInverseRelationship(internalModel);
+ }
+
+ addCanonicalInternalModel(internalModel) {
+ if (this.canonicalMembers.has(internalModel)) {
+ return;
+ }
+
+ if (this.canonicalState) {
+ this.removeCanonicalInternalModel(this.canonicalState);
+ }
+
+ this.canonicalState = internalModel;
+ super.addCanonicalInternalModel(internalModel);
+ }
+
+ inverseDidDematerialize() {
+ super.inverseDidDematerialize(this.inverseInternalModel);
+ this.notifyBelongsToChanged();
+ }
+
+ removeCompletelyFromOwn(internalModel) {
+ super.removeCompletelyFromOwn(internalModel);
+
+ if (this.canonicalState === internalModel) {
+ this.canonicalState = null;
+ }
+
+ if (this.inverseInternalModel === internalModel) {
+ this.inverseInternalModel = null;
+ this.notifyBelongsToChanged();
+ }
+ }
+
+ removeCompletelyFromInverse() {
+ super.removeCompletelyFromInverse();
+
+ this.inverseInternalModel = null;
+ }
+
+ flushCanonical() {
+ //temporary fix to not remove newly created records if server returned null.
+ //TODO remove once we have proper diffing
+ if (this.inverseInternalModel && this.inverseInternalModel.isNew() && !this.canonicalState) {
+ return;
+ }
+ if (this.inverseInternalModel !== this.canonicalState) {
+ this.inverseInternalModel = this.canonicalState;
+ this.notifyBelongsToChanged();
+ }
+
+ super.flushCanonical();
+ }
+
+ addInternalModel(internalModel) {
+ if (this.members.has(internalModel)) {
+ return;
+ }
+
+ emberData_Debug.assertPolymorphicType(this.internalModel, this.relationshipMeta, internalModel);
+
+ if (this.inverseInternalModel) {
+ this.removeInternalModel(this.inverseInternalModel);
+ }
+
+ this.inverseInternalModel = internalModel;
+ super.addInternalModel(internalModel);
+ this.notifyBelongsToChanged();
+ }
+
+ setRecordPromise(newPromise) {
+ var content = newPromise.get && newPromise.get('content');
+ (true && !(content !== undefined) && Ember.assert("You passed in a promise that did not originate from an EmberData relationship. You can only pass promises that come from a belongsTo or hasMany relationship to the get call.", content !== undefined));
+
+ this.setInternalModel(content ? content._internalModel : content);
+ }
+
+ removeInternalModelFromOwn(internalModel) {
+ if (!this.members.has(internalModel)) {
+ return;
+ }
+ this.inverseInternalModel = null;
+ super.removeInternalModelFromOwn(internalModel);
+ this.notifyBelongsToChanged();
+ }
+
+ removeAllInternalModelsFromOwn() {
+ super.removeAllInternalModelsFromOwn();
+ this.inverseInternalModel = null;
+ this.notifyBelongsToChanged();
+ }
+
+ notifyBelongsToChanged() {
+ this.internalModel.notifyBelongsToChanged(this.key);
+ }
+
+ removeCanonicalInternalModelFromOwn(internalModel) {
+ if (!this.canonicalMembers.has(internalModel)) {
+ return;
+ }
+ this.canonicalState = null;
+ super.removeCanonicalInternalModelFromOwn(internalModel);
+ }
+
+ removeAllCanonicalInternalModelsFromOwn() {
+ super.removeAllCanonicalInternalModelsFromOwn();
+ this.canonicalState = null;
+ }
+
+ findRecord() {
+ if (this.inverseInternalModel) {
+ return this.store._findByInternalModel(this.inverseInternalModel);
+ } else {
+ return Ember.RSVP.Promise.resolve(null);
+ }
+ }
+
+ fetchLink() {
+ return this.store.findBelongsTo(this.internalModel, this.link, this.relationshipMeta).then(internalModel => {
+ if (internalModel) {
+ this.addInternalModel(internalModel);
+ }
+ return internalModel;
+ });
+ }
+
+ getRecord() {
+ //TODO(Igor) flushCanonical here once our syncing is not stupid
+ if (this.isAsync) {
+ var promise = void 0;
+ if (this.link) {
+ if (this.hasLoaded) {
+ promise = this.findRecord();
+ } else {
+ promise = this.findLink().then(() => this.findRecord());
+ }
+ } else {
+ promise = this.findRecord();
+ }
+
+ return PromiseObject.create({
+ promise: promise,
+ content: this.inverseInternalModel ? this.inverseInternalModel.getRecord() : null
+ });
+ } else {
+ if (this.inverseInternalModel === null) {
+ return null;
+ }
+ var toReturn = this.inverseInternalModel.getRecord();
+ (true && !(toReturn === null || !toReturn.get('isEmpty')) && Ember.assert("You looked up the '" + this.key + "' relationship on a '" + this.internalModel.modelName + "' with id " + this.internalModel.id + " but some of the associated records were not loaded. Either make sure they are all loaded together with the parent record, or specify that the relationship is async (`DS.belongsTo({ async: true })`)", toReturn === null || !toReturn.get('isEmpty')));
+
+ return toReturn;
+ }
+ }
+
+ reload() {
+ // TODO handle case when reload() is triggered multiple times
+
+ if (this.link) {
+ return this.fetchLink();
+ }
+
+ // reload record, if it is already loaded
+ if (this.inverseInternalModel && this.inverseInternalModel.hasRecord) {
+ return this.inverseInternalModel.getRecord().reload();
+ }
+
+ return this.findRecord();
+ }
+
+ updateData(data, initial) {
+ (true && !(data === null || data.id !== undefined && data.type !== undefined) && Ember.assert(`Ember Data expected the data for the ${this.key} relationship on a ${this.internalModel.toString()} to be in a JSON API format and include an \`id\` and \`type\` property but it found ${Ember.inspect(data)}. Please check your serializer and make sure it is serializing the relationship payload into a JSON API format.`, data === null || data.id !== undefined && data.type !== undefined));
+
+ var internalModel = this.store._pushResourceIdentifier(this, data);
+ if (initial) {
+ this.setInitialCanonicalInternalModel(internalModel);
+ } else {
+ this.setCanonicalInternalModel(internalModel);
+ }
+ }
+}
+
+function shouldFindInverse(relationshipMeta) {
+ var options = relationshipMeta.options;
+ return !(options && options.inverse === null);
+}
+
+function createRelationshipFor(internalModel, relationshipMeta, store) {
+ var inverseKey = void 0;
+ var inverse = null;
+
+ if (shouldFindInverse(relationshipMeta)) {
+ inverse = internalModel.type.inverseFor(relationshipMeta.key, store);
+ } else {
+ internalModel.type.typeForRelationship(relationshipMeta.key, store);
+ }
+
+ if (inverse) {
+ inverseKey = inverse.name;
+ }
+
+ if (relationshipMeta.kind === 'hasMany') {
+ return new ManyRelationship(store, internalModel, inverseKey, relationshipMeta);
+ } else {
+ return new BelongsToRelationship(store, internalModel, inverseKey, relationshipMeta);
+ }
+}
+
+class Relationships {
+ constructor(internalModel) {
+ this.internalModel = internalModel;
+ this.initializedRelationships = Object.create(null);
+ }
+
+ // TODO @runspired deprecate this as it was never truly a record instance
+ get record() {
+ return this.internalModel;
+ }
+
+ has(key) {
+ return !!this.initializedRelationships[key];
+ }
+
+ forEach(cb) {
+ var rels = this.initializedRelationships;
+ Object.keys(rels).forEach(name => {
+ cb(name, rels[name]);
+ });
+ }
+
+ get(key) {
+ var relationships = this.initializedRelationships;
+ var relationship = relationships[key];
+ var internalModel = this.internalModel;
+
+ if (!relationship) {
+ var relationshipsByName = Ember.get(internalModel.type, 'relationshipsByName');
+ var rel = relationshipsByName.get(key);
+
+ if (!rel) {
+ return undefined;
+ }
+
+ var relationshipPayload = internalModel.store._relationshipsPayloads.get(internalModel.modelName, internalModel.id, key);
+
+ relationship = relationships[key] = createRelationshipFor(internalModel, rel, internalModel.store);
+
+ if (relationshipPayload) {
+ relationship.push(relationshipPayload, true);
+ }
+ }
+
+ return relationship;
+ }
+}
+
+/**
+ @class Snapshot
+ @namespace DS
+ @private
+ @constructor
+ @param {DS.Model} internalModel The model to create a snapshot from
+*/
+/**
+ @module ember-data
+*/
+
+class Snapshot {
+ constructor(internalModel, options = {}) {
+ this._attributes = Object.create(null);
+ this._belongsToRelationships = Object.create(null);
+ this._belongsToIds = Object.create(null);
+ this._hasManyRelationships = Object.create(null);
+ this._hasManyIds = Object.create(null);
+ this._internalModel = internalModel;
+
+ var record = internalModel.getRecord();
+
+ /**
+ The underlying record for this snapshot. Can be used to access methods and
+ properties defined on the record.
+ Example
+ ```javascript
+ let json = snapshot.record.toJSON();
+ ```
+ @property record
+ @type {DS.Model}
+ */
+ this.record = record;
+ record.eachAttribute(keyName => this._attributes[keyName] = Ember.get(record, keyName));
+
+ /**
+ The id of the snapshot's underlying record
+ Example
+ ```javascript
+ // store.push('post', { id: 1, author: 'Tomster', title: 'Ember.js rocks' });
+ postSnapshot.id; // => '1'
+ ```
+ @property id
+ @type {String}
+ */
+ this.id = internalModel.id;
+
+ /**
+ A hash of adapter options
+ @property adapterOptions
+ @type {Object}
+ */
+ this.adapterOptions = options.adapterOptions;
+ this.include = options.include;
+
+ /**
+ The name of the type of the underlying record for this snapshot, as a string.
+ @property modelName
+ @type {String}
+ */
+ this.modelName = internalModel.modelName;
+
+ this._changedAttributes = record.changedAttributes();
+ }
+
+ /**
+ The type of the underlying record for this snapshot, as a DS.Model.
+ @property type
+ @type {DS.Model}
+ */
+ get type() {
+ // TODO @runspired we should deprecate this in favor of modelClass but only once
+ // we've cleaned up the internals enough that a public change to follow suite is
+ // uncontroversial.
+ return this._internalModel.modelClass;
+ }
+
+ /**
+ Returns the value of an attribute.
+ Example
+ ```javascript
+ // store.push('post', { id: 1, author: 'Tomster', title: 'Ember.js rocks' });
+ postSnapshot.attr('author'); // => 'Tomster'
+ postSnapshot.attr('title'); // => 'Ember.js rocks'
+ ```
+ Note: Values are loaded eagerly and cached when the snapshot is created.
+ @method attr
+ @param {String} keyName
+ @return {Object} The attribute value or undefined
+ */
+ attr(keyName) {
+ if (keyName in this._attributes) {
+ return this._attributes[keyName];
+ }
+ throw new Ember.Error("Model '" + Ember.inspect(this.record) + "' has no attribute named '" + keyName + "' defined.");
+ }
+
+ /**
+ Returns all attributes and their corresponding values.
+ Example
+ ```javascript
+ // store.push('post', { id: 1, author: 'Tomster', title: 'Ember.js rocks' });
+ postSnapshot.attributes(); // => { author: 'Tomster', title: 'Ember.js rocks' }
+ ```
+ @method attributes
+ @return {Object} All attributes of the current snapshot
+ */
+ attributes() {
+ return Ember.copy(this._attributes);
+ }
+
+ /**
+ Returns all changed attributes and their old and new values.
+ Example
+ ```javascript
+ // store.push('post', { id: 1, author: 'Tomster', title: 'Ember.js rocks' });
+ postModel.set('title', 'Ember.js rocks!');
+ postSnapshot.changedAttributes(); // => { title: ['Ember.js rocks', 'Ember.js rocks!'] }
+ ```
+ @method changedAttributes
+ @return {Object} All changed attributes of the current snapshot
+ */
+ changedAttributes() {
+ var changedAttributes = Object.create(null);
+ var changedAttributeKeys = Object.keys(this._changedAttributes);
+
+ for (var i = 0, length = changedAttributeKeys.length; i < length; i++) {
+ var key = changedAttributeKeys[i];
+ changedAttributes[key] = Ember.copy(this._changedAttributes[key]);
+ }
+
+ return changedAttributes;
+ }
+
+ /**
+ Returns the current value of a belongsTo relationship.
+ `belongsTo` takes an optional hash of options as a second parameter,
+ currently supported options are:
+ - `id`: set to `true` if you only want the ID of the related record to be
+ returned.
+ Example
+ ```javascript
+ // store.push('post', { id: 1, title: 'Hello World' });
+ // store.createRecord('comment', { body: 'Lorem ipsum', post: post });
+ commentSnapshot.belongsTo('post'); // => DS.Snapshot
+ commentSnapshot.belongsTo('post', { id: true }); // => '1'
+ // store.push('comment', { id: 1, body: 'Lorem ipsum' });
+ commentSnapshot.belongsTo('post'); // => undefined
+ ```
+ Calling `belongsTo` will return a new Snapshot as long as there's any known
+ data for the relationship available, such as an ID. If the relationship is
+ known but unset, `belongsTo` will return `null`. If the contents of the
+ relationship is unknown `belongsTo` will return `undefined`.
+ Note: Relationships are loaded lazily and cached upon first access.
+ @method belongsTo
+ @param {String} keyName
+ @param {Object} [options]
+ @return {(DS.Snapshot|String|null|undefined)} A snapshot or ID of a known
+ relationship or null if the relationship is known but unset. undefined
+ will be returned if the contents of the relationship is unknown.
+ */
+ belongsTo(keyName, options) {
+ var id = options && options.id;
+ var relationship = void 0,
+ inverseInternalModel = void 0,
+ hasData = void 0;
+ var result = void 0;
+
+ if (id && keyName in this._belongsToIds) {
+ return this._belongsToIds[keyName];
+ }
+
+ if (!id && keyName in this._belongsToRelationships) {
+ return this._belongsToRelationships[keyName];
+ }
+
+ relationship = this._internalModel._relationships.get(keyName);
+ if (!(relationship && relationship.relationshipMeta.kind === 'belongsTo')) {
+ throw new Ember.Error("Model '" + Ember.inspect(this.record) + "' has no belongsTo relationship named '" + keyName + "' defined.");
+ }
+
+ hasData = Ember.get(relationship, 'hasData');
+ inverseInternalModel = Ember.get(relationship, 'inverseInternalModel');
+
+ if (hasData) {
+ if (inverseInternalModel && !inverseInternalModel.isDeleted()) {
+ if (id) {
+ result = Ember.get(inverseInternalModel, 'id');
+ } else {
+ result = inverseInternalModel.createSnapshot();
+ }
+ } else {
+ result = null;
+ }
+ }
+
+ if (id) {
+ this._belongsToIds[keyName] = result;
+ } else {
+ this._belongsToRelationships[keyName] = result;
+ }
+
+ return result;
+ }
+
+ /**
+ Returns the current value of a hasMany relationship.
+ `hasMany` takes an optional hash of options as a second parameter,
+ currently supported options are:
+ - `ids`: set to `true` if you only want the IDs of the related records to be
+ returned.
+ Example
+ ```javascript
+ // store.push('post', { id: 1, title: 'Hello World', comments: [2, 3] });
+ postSnapshot.hasMany('comments'); // => [DS.Snapshot, DS.Snapshot]
+ postSnapshot.hasMany('comments', { ids: true }); // => ['2', '3']
+ // store.push('post', { id: 1, title: 'Hello World' });
+ postSnapshot.hasMany('comments'); // => undefined
+ ```
+ Note: Relationships are loaded lazily and cached upon first access.
+ @method hasMany
+ @param {String} keyName
+ @param {Object} [options]
+ @return {(Array|undefined)} An array of snapshots or IDs of a known
+ relationship or an empty array if the relationship is known but unset.
+ undefined will be returned if the contents of the relationship is unknown.
+ */
+ hasMany(keyName, options) {
+ var ids = options && options.ids;
+ var relationship = void 0,
+ members = void 0,
+ hasData = void 0;
+ var results = void 0;
+
+ if (ids && keyName in this._hasManyIds) {
+ return this._hasManyIds[keyName];
+ }
+
+ if (!ids && keyName in this._hasManyRelationships) {
+ return this._hasManyRelationships[keyName];
+ }
+
+ relationship = this._internalModel._relationships.get(keyName);
+ if (!(relationship && relationship.relationshipMeta.kind === 'hasMany')) {
+ throw new Ember.Error("Model '" + Ember.inspect(this.record) + "' has no hasMany relationship named '" + keyName + "' defined.");
+ }
+
+ hasData = Ember.get(relationship, 'hasData');
+ members = Ember.get(relationship, 'members');
+
+ if (hasData) {
+ results = [];
+ members.forEach(member => {
+ if (!member.isDeleted()) {
+ if (ids) {
+ results.push(member.id);
+ } else {
+ results.push(member.createSnapshot());
+ }
+ }
+ });
+ }
+
+ if (ids) {
+ this._hasManyIds[keyName] = results;
+ } else {
+ this._hasManyRelationships[keyName] = results;
+ }
+
+ return results;
+ }
+
+ /**
+ Iterates through all the attributes of the model, calling the passed
+ function on each attribute.
+ Example
+ ```javascript
+ snapshot.eachAttribute(function(name, meta) {
+ // ...
+ });
+ ```
+ @method eachAttribute
+ @param {Function} callback the callback to execute
+ @param {Object} [binding] the value to which the callback's `this` should be bound
+ */
+ eachAttribute(callback, binding) {
+ this.record.eachAttribute(callback, binding);
+ }
+
+ /**
+ Iterates through all the relationships of the model, calling the passed
+ function on each relationship.
+ Example
+ ```javascript
+ snapshot.eachRelationship(function(name, relationship) {
+ // ...
+ });
+ ```
+ @method eachRelationship
+ @param {Function} callback the callback to execute
+ @param {Object} [binding] the value to which the callback's `this` should be bound
+ */
+ eachRelationship(callback, binding) {
+ this.record.eachRelationship(callback, binding);
+ }
+
+ /**
+ Serializes the snapshot using the serializer for the model.
+ Example
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ export default DS.Adapter.extend({
+ createRecord(store, type, snapshot) {
+ var data = snapshot.serialize({ includeId: true });
+ var url = `/${type.modelName}`;
+ return fetch(url, {
+ method: 'POST',
+ body: data,
+ }).then((response) => response.json())
+ }
+ });
+ ```
+ @method serialize
+ @param {Object} options
+ @return {Object} an object whose values are primitive JSON values only
+ */
+ serialize(options) {
+ return this.record.store.serializerFor(this.modelName).serialize(this, options);
+ }
+}
+
+/*
+ Check if the passed model has a `type` attribute or a relationship named `type`.
+
+ @method modelHasAttributeOrRelationshipNamedType
+ @param modelClass
+ */
+function modelHasAttributeOrRelationshipNamedType(modelClass) {
+ return Ember.get(modelClass, 'attributes').has('type') || Ember.get(modelClass, 'relationshipsByName').has('type');
+}
+
+/*
+ ember-container-inject-owner is a new feature in Ember 2.3 that finally provides a public
+ API for looking items up. This function serves as a super simple polyfill to avoid
+ triggering deprecations.
+ */
+function getOwner(context) {
+ var owner = void 0;
+
+ if (Ember.getOwner) {
+ owner = Ember.getOwner(context);
+ } else if (context.container) {
+ owner = context.container;
+ }
+
+ if (owner && owner.lookupFactory && !owner._lookupFactory) {
+ // `owner` is a container, we are just making this work
+ owner._lookupFactory = function () {
+ return owner.lookupFactory(...arguments);
+ };
+
+ owner.register = function () {
+ var registry = owner.registry || owner._registry || owner;
+
+ return registry.register(...arguments);
+ };
+ }
+
+ return owner;
+}
+
+var Reference = function (store, internalModel) {
+ this.store = store;
+ this.internalModel = internalModel;
+};
+
+Reference.prototype = {
+ constructor: Reference
+};
+
+/**
+ An RecordReference is a low level API that allows users and
+ addon author to perform meta-operations on a record.
+
+ @class RecordReference
+ @namespace DS
+*/
+var RecordReference = function (store, internalModel) {
+ this._super$constructor(store, internalModel);
+ this.type = internalModel.modelName;
+ this._id = internalModel.id;
+};
+
+RecordReference.prototype = Object.create(Reference.prototype);
+RecordReference.prototype.constructor = RecordReference;
+RecordReference.prototype._super$constructor = Reference;
+
+/**
+ The `id` of the record that this reference refers to.
+
+ Together, the `type` and `id` properties form a composite key for
+ the identity map.
+
+ Example
+
+ ```javascript
+ let userRef = store.getReference('user', 1);
+
+ userRef.id(); // '1'
+ ```
+
+ @method id
+ @return {String} The id of the record.
+*/
+RecordReference.prototype.id = function () {
+ return this._id;
+};
+
+/**
+ How the reference will be looked up when it is loaded: Currently
+ this always return `identity` to signifying that a record will be
+ loaded by the `type` and `id`.
+
+ Example
+
+ ```javascript
+ const userRef = store.getReference('user', 1);
+
+ userRef.remoteType(); // 'identity'
+ ```
+
+ @method remoteType
+ @return {String} 'identity'
+*/
+RecordReference.prototype.remoteType = function () {
+ return 'identity';
+};
+
+/**
+ This API allows you to provide a reference with new data. The
+ simplest usage of this API is similar to `store.push`: you provide a
+ normalized hash of data and the object represented by the reference
+ will update.
+
+ If you pass a promise to `push`, Ember Data will not ask the adapter
+ for the data if another attempt to fetch it is made in the
+ interim. When the promise resolves, the underlying object is updated
+ with the new data, and the promise returned by *this function* is resolved
+ with that object.
+
+ For example, `recordReference.push(promise)` will be resolved with a
+ record.
+
+ Example
+
+ ```javascript
+ let userRef = store.getReference('user', 1);
+
+ // provide data for reference
+ userRef.push({ data: { id: 1, username: "@user" }}).then(function(user) {
+ userRef.value() === user;
+ });
+ ```
+
+ @method push
+ @param {Promise|Object}
+ @return Promise<record> a promise for the value (record or relationship)
+*/
+RecordReference.prototype.push = function (objectOrPromise) {
+ return Ember.RSVP.resolve(objectOrPromise).then(data => {
+ return this.store.push(data);
+ });
+};
+
+/**
+ If the entity referred to by the reference is already loaded, it is
+ present as `reference.value`. Otherwise the value returned by this function
+ is `null`.
+
+ Example
+
+ ```javascript
+ let userRef = store.getReference('user', 1);
+
+ userRef.value(); // user
+ ```
+
+ @method value
+ @return {DS.Model} the record for this RecordReference
+*/
+RecordReference.prototype.value = function () {
+ if (this.internalModel.hasRecord) {
+ return this.internalModel.getRecord();
+ }
+ return null;
+};
+
+/**
+ Triggers a fetch for the backing entity based on its `remoteType`
+ (see `remoteType` definitions per reference type).
+
+ Example
+
+ ```javascript
+ let userRef = store.getReference('user', 1);
+
+ // load user (via store.find)
+ userRef.load().then(...)
+ ```
+
+ @method load
+ @return {Promise<record>} the record for this RecordReference
+*/
+RecordReference.prototype.load = function () {
+ return this.store.findRecord(this.type, this._id);
+};
+
+/**
+ Reloads the record if it is already loaded. If the record is not
+ loaded it will load the record via `store.findRecord`
+
+ Example
+
+ ```javascript
+ let userRef = store.getReference('user', 1);
+
+ // or trigger a reload
+ userRef.reload().then(...)
+ ```
+
+ @method reload
+ @return {Promise<record>} the record for this RecordReference
+*/
+RecordReference.prototype.reload = function () {
+ var record = this.value();
+ if (record) {
+ return record.reload();
+ }
+
+ return this.load();
+};
+
+/**
+ A BelongsToReference is a low level API that allows users and
+ addon author to perform meta-operations on a belongs-to
+ relationship.
+
+ @class BelongsToReference
+ @namespace DS
+ @extends DS.Reference
+*/
+var BelongsToReference = function (store, parentInternalModel, belongsToRelationship) {
+ this._super$constructor(store, parentInternalModel);
+ this.belongsToRelationship = belongsToRelationship;
+ this.type = belongsToRelationship.relationshipMeta.type;
+ this.parent = parentInternalModel.recordReference;
+
+ // TODO inverse
+};
+
+BelongsToReference.prototype = Object.create(Reference.prototype);
+BelongsToReference.prototype.constructor = BelongsToReference;
+BelongsToReference.prototype._super$constructor = Reference;
+
+/**
+ This returns a string that represents how the reference will be
+ looked up when it is loaded. If the relationship has a link it will
+ use the "link" otherwise it defaults to "id".
+
+ Example
+
+ ```javascript
+ // models/blog.js
+ export default DS.Model.extend({
+ user: DS.belongsTo({ async: true })
+ });
+
+ let blog = store.push({
+ type: 'blog',
+ id: 1,
+ relationships: {
+ user: {
+ data: { type: 'user', id: 1 }
+ }
+ }
+ });
+ let userRef = blog.belongsTo('user');
+
+ // get the identifier of the reference
+ if (userRef.remoteType() === "id") {
+ let id = userRef.id();
+ } else if (userRef.remoteType() === "link") {
+ let link = userRef.link();
+ }
+ ```
+
+ @method remoteType
+ @return {String} The name of the remote type. This should either be "link" or "id"
+*/
+BelongsToReference.prototype.remoteType = function () {
+ if (this.belongsToRelationship.link) {
+ return "link";
+ }
+
+ return "id";
+};
+
+/**
+ The `id` of the record that this reference refers to. Together, the
+ `type()` and `id()` methods form a composite key for the identity
+ map. This can be used to access the id of an async relationship
+ without triggering a fetch that would normally happen if you
+ attempted to use `record.get('relationship.id')`.
+
+ Example
+
+ ```javascript
+ // models/blog.js
+ export default DS.Model.extend({
+ user: DS.belongsTo({ async: true })
+ });
+
+ let blog = store.push({
+ data: {
+ type: 'blog',
+ id: 1,
+ relationships: {
+ user: {
+ data: { type: 'user', id: 1 }
+ }
+ }
+ }
+ });
+ let userRef = blog.belongsTo('user');
+
+ // get the identifier of the reference
+ if (userRef.remoteType() === "id") {
+ let id = userRef.id();
+ }
+ ```
+
+ @method id
+ @return {String} The id of the record in this belongsTo relationship.
+*/
+BelongsToReference.prototype.id = function () {
+ var inverseInternalModel = this.belongsToRelationship.inverseInternalModel;
+ return inverseInternalModel && inverseInternalModel.id;
+};
+
+/**
+ The link Ember Data will use to fetch or reload this belongs-to
+ relationship.
+
+ Example
+
+ ```javascript
+ // models/blog.js
+ export default DS.Model.extend({
+ user: DS.belongsTo({ async: true })
+ });
+
+ let blog = store.push({
+ data: {
+ type: 'blog',
+ id: 1,
+ relationships: {
+ user: {
+ links: {
+ related: '/articles/1/author'
+ }
+ }
+ }
+ }
+ });
+ let userRef = blog.belongsTo('user');
+
+ // get the identifier of the reference
+ if (userRef.remoteType() === "link") {
+ let link = userRef.link();
+ }
+ ```
+
+ @method link
+ @return {String} The link Ember Data will use to fetch or reload this belongs-to relationship.
+*/
+BelongsToReference.prototype.link = function () {
+ return this.belongsToRelationship.link;
+};
+
+/**
+ The meta data for the belongs-to relationship.
+
+ Example
+
+ ```javascript
+ // models/blog.js
+ export default DS.Model.extend({
+ user: DS.belongsTo({ async: true })
+ });
+
+ let blog = store.push({
+ data: {
+ type: 'blog',
+ id: 1,
+ relationships: {
+ user: {
+ links: {
+ related: {
+ href: '/articles/1/author',
+ meta: {
+ lastUpdated: 1458014400000
+ }
+ }
+ }
+ }
+ }
+ }
+ });
+
+ let userRef = blog.belongsTo('user');
+
+ userRef.meta() // { lastUpdated: 1458014400000 }
+ ```
+
+ @method meta
+ @return {Object} The meta information for the belongs-to relationship.
+*/
+BelongsToReference.prototype.meta = function () {
+ return this.belongsToRelationship.meta;
+};
+
+/**
+ `push` can be used to update the data in the relationship and Ember
+ Data will treat the new data as the conanical value of this
+ relationship on the backend.
+
+ Example
+
+ ```javascript
+ // models/blog.js
+ export default DS.Model.extend({
+ user: DS.belongsTo({ async: true })
+ });
+
+ let blog = store.push({
+ data: {
+ type: 'blog',
+ id: 1,
+ relationships: {
+ user: {
+ data: { type: 'user', id: 1 }
+ }
+ }
+ }
+ });
+ let userRef = blog.belongsTo('user');
+
+ // provide data for reference
+ userRef.push({
+ data: {
+ type: 'user',
+ id: 1,
+ attributes: {
+ username: "@user"
+ }
+ }
+ }).then(function(user) {
+ userRef.value() === user;
+ });
+ ```
+
+ @method push
+ @param {Object|Promise} objectOrPromise a promise that resolves to a JSONAPI document object describing the new value of this relationship.
+ @return {Promise<record>} A promise that resolves with the new value in this belongs-to relationship.
+*/
+BelongsToReference.prototype.push = function (objectOrPromise) {
+ return Ember.RSVP.resolve(objectOrPromise).then(data => {
+ var record = void 0;
+
+ if (data instanceof Model) {
+ if (isEnabled('ds-overhaul-references')) {
+ (true && !(false) && Ember.deprecate("BelongsToReference#push(DS.Model) is deprecated. Update relationship via `model.set('relationshipName', value)` instead.", false, {
+ id: 'ds.references.belongs-to.push-record',
+ until: '4.0.0'
+ }));
+ }
+ record = data;
+ } else {
+ record = this.store.push(data);
+ }
+
+ emberData_Debug.assertPolymorphicType(this.internalModel, this.belongsToRelationship.relationshipMeta, record._internalModel);
+
+ this.belongsToRelationship.setCanonicalInternalModel(record._internalModel);
+
+ return record;
+ });
+};
+
+/**
+ `value()` synchronously returns the current value of the belongs-to
+ relationship. Unlike `record.get('relationshipName')`, calling
+ `value()` on a reference does not trigger a fetch if the async
+ relationship is not yet loaded. If the relationship is not loaded
+ it will always return `null`.
+
+ Example
+
+ ```javascript
+ // models/blog.js
+ export default DS.Model.extend({
+ user: DS.belongsTo({ async: true })
+ });
+
+ let blog = store.push({
+ data: {
+ type: 'blog',
+ id: 1,
+ relationships: {
+ user: {
+ data: { type: 'user', id: 1 }
+ }
+ }
+ }
+ });
+ let userRef = blog.belongsTo('user');
+
+ userRef.value(); // null
+
+ // provide data for reference
+ userRef.push({
+ data: {
+ type: 'user',
+ id: 1,
+ attributes: {
+ username: "@user"
+ }
+ }
+ }).then(function(user) {
+ userRef.value(); // user
+ });
+ ```
+
+ @method value
+ @return {DS.Model} the record in this relationship
+*/
+BelongsToReference.prototype.value = function () {
+ var inverseInternalModel = this.belongsToRelationship.inverseInternalModel;
+
+ if (inverseInternalModel && inverseInternalModel.isLoaded()) {
+ return inverseInternalModel.getRecord();
+ }
+
+ return null;
+};
+
+/**
+ Loads a record in a belongs to relationship if it is not already
+ loaded. If the relationship is already loaded this method does not
+ trigger a new load.
+
+ Example
+
+ ```javascript
+ // models/blog.js
+ export default DS.Model.extend({
+ user: DS.belongsTo({ async: true })
+ });
+
+ let blog = store.push({
+ data: {
+ type: 'blog',
+ id: 1,
+ relationships: {
+ user: {
+ data: { type: 'user', id: 1 }
+ }
+ }
+ }
+ });
+ let userRef = blog.belongsTo('user');
+
+ userRef.value(); // null
+
+ userRef.load().then(function(user) {
+ userRef.value() === user
+ });
+ ```
+
+ @method load
+ @return {Promise} a promise that resolves with the record in this belongs-to relationship.
+*/
+BelongsToReference.prototype.load = function () {
+ if (this.remoteType() === "id") {
+ return this.belongsToRelationship.getRecord();
+ }
+
+ if (this.remoteType() === "link") {
+ return this.belongsToRelationship.findLink().then(internalModel => {
+ return this.value();
+ });
+ }
+};
+
+/**
+ Triggers a reload of the value in this relationship. If the
+ remoteType is `"link"` Ember Data will use the relationship link to
+ reload the relationship. Otherwise it will reload the record by its
+ id.
+
+ Example
+
+ ```javascript
+ // models/blog.js
+ export default DS.Model.extend({
+ user: DS.belongsTo({ async: true })
+ });
+
+ let blog = store.push({
+ data: {
+ type: 'blog',
+ id: 1,
+ relationships: {
+ user: {
+ data: { type: 'user', id: 1 }
+ }
+ }
+ }
+ });
+ let userRef = blog.belongsTo('user');
+
+ userRef.reload().then(function(user) {
+ userRef.value() === user
+ });
+ ```
+
+ @method reload
+ @return {Promise} a promise that resolves with the record in this belongs-to relationship after the reload has completed.
+*/
+BelongsToReference.prototype.reload = function () {
+ return this.belongsToRelationship.reload().then(internalModel => {
+ return this.value();
+ });
+};
+
+/**
+ A HasManyReference is a low level API that allows users and addon
+ author to perform meta-operations on a has-many relationship.
+
+ @class HasManyReference
+ @namespace DS
+*/
+var HasManyReference = function (store, parentInternalModel, hasManyRelationship) {
+ this._super$constructor(store, parentInternalModel);
+ this.hasManyRelationship = hasManyRelationship;
+ this.type = hasManyRelationship.relationshipMeta.type;
+ this.parent = parentInternalModel.recordReference;
+
+ // TODO inverse
+};
+
+HasManyReference.prototype = Object.create(Reference.prototype);
+HasManyReference.prototype.constructor = HasManyReference;
+HasManyReference.prototype._super$constructor = Reference;
+
+/**
+ This returns a string that represents how the reference will be
+ looked up when it is loaded. If the relationship has a link it will
+ use the "link" otherwise it defaults to "id".
+
+ Example
+
+ ```app/models/post.js
+ export default DS.Model.extend({
+ comments: DS.hasMany({ async: true })
+ });
+ ```
+
+ ```javascript
+ let post = store.push({
+ data: {
+ type: 'post',
+ id: 1,
+ relationships: {
+ comments: {
+ data: [{ type: 'comment', id: 1 }]
+ }
+ }
+ }
+ });
+
+ let commentsRef = post.hasMany('comments');
+
+ // get the identifier of the reference
+ if (commentsRef.remoteType() === "ids") {
+ let ids = commentsRef.ids();
+ } else if (commentsRef.remoteType() === "link") {
+ let link = commentsRef.link();
+ }
+ ```
+
+ @method remoteType
+ @return {String} The name of the remote type. This should either be "link" or "ids"
+*/
+HasManyReference.prototype.remoteType = function () {
+ if (this.hasManyRelationship.link) {
+ return "link";
+ }
+
+ return "ids";
+};
+
+/**
+ The link Ember Data will use to fetch or reload this has-many
+ relationship.
+
+ Example
+
+ ```app/models/post.js
+ export default DS.Model.extend({
+ comments: DS.hasMany({ async: true })
+ });
+ ```
+
+ ```javascript
+ let post = store.push({
+ data: {
+ type: 'post',
+ id: 1,
+ relationships: {
+ comments: {
+ links: {
+ related: '/posts/1/comments'
+ }
+ }
+ }
+ }
+ });
+
+ let commentsRef = post.hasMany('comments');
+
+ commentsRef.link(); // '/posts/1/comments'
+ ```
+
+ @method link
+ @return {String} The link Ember Data will use to fetch or reload this has-many relationship.
+*/
+HasManyReference.prototype.link = function () {
+ return this.hasManyRelationship.link;
+};
+
+/**
+ `ids()` returns an array of the record ids in this relationship.
+
+ Example
+
+ ```app/models/post.js
+ export default DS.Model.extend({
+ comments: DS.hasMany({ async: true })
+ });
+ ```
+
+ ```javascript
+ let post = store.push({
+ data: {
+ type: 'post',
+ id: 1,
+ relationships: {
+ comments: {
+ data: [{ type: 'comment', id: 1 }]
+ }
+ }
+ }
+ });
+
+ let commentsRef = post.hasMany('comments');
+
+ commentsRef.ids(); // ['1']
+ ```
+
+ @method ids
+ @return {Array} The ids in this has-many relationship
+*/
+HasManyReference.prototype.ids = function () {
+ var members = this.hasManyRelationship.members.toArray();
+
+ return members.map(function (internalModel) {
+ return internalModel.id;
+ });
+};
+
+/**
+ The meta data for the has-many relationship.
+
+ Example
+
+ ```app/models/post.js
+ export default DS.Model.extend({
+ comments: DS.hasMany({ async: true })
+ });
+ ```
+
+ ```javascript
+ let post = store.push({
+ data: {
+ type: 'post',
+ id: 1,
+ relationships: {
+ comments: {
+ links: {
+ related: {
+ href: '/posts/1/comments',
+ meta: {
+ count: 10
+ }
+ }
+ }
+ }
+ }
+ }
+ });
+
+ let commentsRef = post.hasMany('comments');
+
+ commentsRef.meta(); // { count: 10 }
+ ```
+
+ @method meta
+ @return {Object} The meta information for the has-many relationship.
+*/
+HasManyReference.prototype.meta = function () {
+ return this.hasManyRelationship.meta;
+};
+
+/**
+ `push` can be used to update the data in the relationship and Ember
+ Data will treat the new data as the canonical value of this
+ relationship on the backend.
+
+ Example
+
+ ```app/models/post.js
+ export default DS.Model.extend({
+ comments: DS.hasMany({ async: true })
+ });
+ ```
+
+ ```
+ let post = store.push({
+ data: {
+ type: 'post',
+ id: 1,
+ relationships: {
+ comments: {
+ data: [{ type: 'comment', id: 1 }]
+ }
+ }
+ }
+ });
+
+ let commentsRef = post.hasMany('comments');
+
+ commentsRef.ids(); // ['1']
+
+ commentsRef.push([
+ [{ type: 'comment', id: 2 }],
+ [{ type: 'comment', id: 3 }],
+ ])
+
+ commentsRef.ids(); // ['2', '3']
+ ```
+
+ @method push
+ @param {Array|Promise} objectOrPromise a promise that resolves to a JSONAPI document object describing the new value of this relationship.
+ @return {DS.ManyArray}
+*/
+HasManyReference.prototype.push = function (objectOrPromise) {
+ return Ember.RSVP.resolve(objectOrPromise).then(payload => {
+ var array = payload;
+
+ if (isEnabled("ds-overhaul-references")) {
+ (true && !(!Array.isArray(payload)) && Ember.deprecate("HasManyReference#push(array) is deprecated. Push a JSON-API document instead.", !Array.isArray(payload), {
+ id: 'ds.references.has-many.push-array',
+ until: '4.0.0'
+ }));
+ }
+
+ var useLegacyArrayPush = true;
+ if (typeof payload === "object" && payload.data) {
+ array = payload.data;
+ useLegacyArrayPush = array.length && array[0].data;
+
+ if (isEnabled('ds-overhaul-references')) {
+ (true && !(!useLegacyArrayPush) && Ember.deprecate("HasManyReference#push() expects a valid JSON-API document.", !useLegacyArrayPush, {
+ id: 'ds.references.has-many.push-invalid-json-api',
+ until: '4.0.0'
+ }));
+ }
+ }
+
+ if (!isEnabled('ds-overhaul-references')) {
+ useLegacyArrayPush = true;
+ }
+
+ var internalModels = void 0;
+ if (useLegacyArrayPush) {
+ internalModels = array.map(obj => {
+ var record = this.store.push(obj);
+
+ {
+ var relationshipMeta = this.hasManyRelationship.relationshipMeta;
+ emberData_Debug.assertPolymorphicType(this.internalModel, relationshipMeta, record._internalModel);
+ }
+
+ return record._internalModel;
+ });
+ } else {
+ var records = this.store.push(payload);
+ internalModels = Ember.A(records).mapBy('_internalModel');
+
+ {
+ internalModels.forEach(internalModel => {
+ var relationshipMeta = this.hasManyRelationship.relationshipMeta;
+ emberData_Debug.assertPolymorphicType(this.internalModel, relationshipMeta, internalModel);
+ });
+ }
+ }
+
+ this.hasManyRelationship.computeChanges(internalModels);
+
+ return this.hasManyRelationship.manyArray;
+ });
+};
+
+HasManyReference.prototype._isLoaded = function () {
+ var hasData = Ember.get(this.hasManyRelationship, 'hasData');
+ if (!hasData) {
+ return false;
+ }
+
+ var members = this.hasManyRelationship.members.toArray();
+
+ return members.every(function (internalModel) {
+ return internalModel.isLoaded() === true;
+ });
+};
+
+/**
+ `value()` synchronously returns the current value of the has-many
+ relationship. Unlike `record.get('relationshipName')`, calling
+ `value()` on a reference does not trigger a fetch if the async
+ relationship is not yet loaded. If the relationship is not loaded
+ it will always return `null`.
+
+ Example
+
+ ```app/models/post.js
+ export default DS.Model.extend({
+ comments: DS.hasMany({ async: true })
+ });
+ ```
+
+ ```javascript
+ let post = store.push({
+ data: {
+ type: 'post',
+ id: 1,
+ relationships: {
+ comments: {
+ data: [{ type: 'comment', id: 1 }]
+ }
+ }
+ }
+ });
+
+ let commentsRef = post.hasMany('comments');
+
+ post.get('comments').then(function(comments) {
+ commentsRef.value() === comments
+ })
+ ```
+
+ @method value
+ @return {DS.ManyArray}
+*/
+HasManyReference.prototype.value = function () {
+ if (this._isLoaded()) {
+ return this.hasManyRelationship.manyArray;
+ }
+
+ return null;
+};
+
+/**
+ Loads the relationship if it is not already loaded. If the
+ relationship is already loaded this method does not trigger a new
+ load.
+
+ Example
+
+ ```app/models/post.js
+ export default DS.Model.extend({
+ comments: DS.hasMany({ async: true })
+ });
+ ```
+
+ ```javascript
+ let post = store.push({
+ data: {
+ type: 'post',
+ id: 1,
+ relationships: {
+ comments: {
+ data: [{ type: 'comment', id: 1 }]
+ }
+ }
+ }
+ });
+
+ let commentsRef = post.hasMany('comments');
+
+ commentsRef.load().then(function(comments) {
+ //...
+ });
+ ```
+
+ @method load
+ @return {Promise} a promise that resolves with the ManyArray in
+ this has-many relationship.
+*/
+HasManyReference.prototype.load = function () {
+ if (!this._isLoaded()) {
+ return this.hasManyRelationship.getRecords();
+ }
+
+ return Ember.RSVP.resolve(this.hasManyRelationship.manyArray);
+};
+
+/**
+ Reloads this has-many relationship.
+
+ Example
+
+ ```app/models/post.js
+ export default DS.Model.extend({
+ comments: DS.hasMany({ async: true })
+ });
+ ```
+
+ ```javascript
+ let post = store.push({
+ data: {
+ type: 'post',
+ id: 1,
+ relationships: {
+ comments: {
+ data: [{ type: 'comment', id: 1 }]
+ }
+ }
+ }
+ });
+
+ let commentsRef = post.hasMany('comments');
+
+ commentsRef.reload().then(function(comments) {
+ //...
+ });
+ ```
+
+ @method reload
+ @return {Promise} a promise that resolves with the ManyArray in this has-many relationship.
+*/
+HasManyReference.prototype.reload = function () {
+ return this.hasManyRelationship.reload();
+};
+
+var emberAssign = Ember.assign || Ember.merge;
+
+/*
+ The TransitionChainMap caches the `state.enters`, `state.setups`, and final state reached
+ when transitioning from one state to another, so that future transitions can replay the
+ transition without needing to walk the state tree, collect these hook calls and determine
+ the state to transition into.
+
+ A future optimization would be to build a single chained method out of the collected enters
+ and setups. It may also be faster to do a two level cache (from: { to }) instead of caching based
+ on a key that adds the two together.
+ */
+var TransitionChainMap = Object.create(null);
+
+var _extractPivotNameCache = Object.create(null);
+var _splitOnDotCache = Object.create(null);
+
+function splitOnDot(name) {
+ return _splitOnDotCache[name] || (_splitOnDotCache[name] = name.split('.'));
+}
+
+function extractPivotName(name) {
+ return _extractPivotNameCache[name] || (_extractPivotNameCache[name] = splitOnDot(name)[0]);
+}
+
+function areAllModelsUnloaded(internalModels) {
+ for (var i = 0; i < internalModels.length; ++i) {
+ var record = internalModels[i]._record;
+ if (record && !(record.get('isDestroyed') || record.get('isDestroying'))) {
+ return false;
+ }
+ }
+ return true;
+}
+
+// Handle dematerialization for relationship `rel`. In all cases, notify the
+// relatinoship of the dematerialization: this is done so the relationship can
+// notify its inverse which needs to update state
+//
+// If the inverse is sync, unloading this record is treated as a client-side
+// delete, so we remove the inverse records from this relationship to
+// disconnect the graph. Because it's not async, we don't need to keep around
+// the internalModel as an id-wrapper for references and because the graph is
+// disconnected we can actually destroy the internalModel when checking for
+// orphaned models.
+function destroyRelationship(rel) {
+ rel.internalModelDidDematerialize();
+
+ if (rel._inverseIsSync()) {
+ // disconnect the graph so that the sync inverse relationship does not
+ // prevent us from cleaning up during `_cleanupOrphanedInternalModels`
+ rel.removeAllInternalModelsFromOwn();
+ rel.removeAllCanonicalInternalModelsFromOwn();
+ }
+}
+// this (and all heimdall instrumentation) will be stripped by a babel transform
+// https://github.com/heimdalljs/babel5-plugin-strip-heimdall
+
+
+var InternalModelReferenceId = 1;
+var nextBfsId = 1;
+
+/*
+ `InternalModel` is the Model class that we use internally inside Ember Data to represent models.
+ Internal ED methods should only deal with `InternalModel` objects. It is a fast, plain Javascript class.
+
+ We expose `DS.Model` to application code, by materializing a `DS.Model` from `InternalModel` lazily, as
+ a performance optimization.
+
+ `InternalModel` should never be exposed to application code. At the boundaries of the system, in places
+ like `find`, `push`, etc. we convert between Models and InternalModels.
+
+ We need to make sure that the properties from `InternalModel` are correctly exposed/proxied on `Model`
+ if they are needed.
+
+ @private
+ @class InternalModel
+*/
+class InternalModel {
+ constructor(modelName, id, store, data) {
+ this.id = id;
+
+ // this ensure ordered set can quickly identify this as unique
+ this[Ember.GUID_KEY] = InternalModelReferenceId++ + 'internal-model';
+
+ this.store = store;
+ this.modelName = modelName;
+ this._loadingPromise = null;
+ this._record = null;
+ this._isDestroyed = false;
+ this.isError = false;
+ this._isUpdatingRecordArrays = false; // used by the recordArrayManager
+
+ // During dematerialization we don't want to rematerialize the record. The
+ // reason this might happen is that dematerialization removes records from
+ // record arrays, and Ember arrays will always `objectAt(0)` and
+ // `objectAt(len - 1)` to test whether or not `firstObject` or `lastObject`
+ // have changed.
+ this._isDematerializing = false;
+ this._scheduledDestroy = null;
+
+ this.resetRecord();
+
+ if (data) {
+ this.__data = data;
+ }
+
+ // caches for lazy getters
+ this._modelClass = null;
+ this.__deferredTriggers = null;
+ this.__recordArrays = null;
+ this._references = null;
+ this._recordReference = null;
+ this.__relationships = null;
+ this.__implicitRelationships = null;
+
+ // Used during the mark phase of unloading to avoid checking the same internal
+ // model twice in the same scan
+ this._bfsId = 0;
+ }
+
+ get modelClass() {
+ return this._modelClass || (this._modelClass = this.store._modelFor(this.modelName));
+ }
+
+ get type() {
+ return this.modelClass;
+ }
+
+ get recordReference() {
+ if (this._recordReference === null) {
+ this._recordReference = new RecordReference(this.store, this);
+ }
+ return this._recordReference;
+ }
+
+ get _recordArrays() {
+ if (this.__recordArrays === null) {
+ this.__recordArrays = OrderedSet.create();
+ }
+ return this.__recordArrays;
+ }
+
+ get references() {
+ if (this._references === null) {
+ this._references = Object.create(null);
+ }
+ return this._references;
+ }
+
+ get _deferredTriggers() {
+ if (this.__deferredTriggers === null) {
+ this.__deferredTriggers = [];
+ }
+ return this.__deferredTriggers;
+ }
+
+ get _attributes() {
+ if (this.__attributes === null) {
+ this.__attributes = Object.create(null);
+ }
+ return this.__attributes;
+ }
+
+ set _attributes(v) {
+ this.__attributes = v;
+ }
+
+ get _relationships() {
+ if (this.__relationships === null) {
+ this.__relationships = new Relationships(this);
+ }
+
+ return this.__relationships;
+ }
+
+ get _inFlightAttributes() {
+ if (this.__inFlightAttributes === null) {
+ this.__inFlightAttributes = Object.create(null);
+ }
+ return this.__inFlightAttributes;
+ }
+
+ set _inFlightAttributes(v) {
+ this.__inFlightAttributes = v;
+ }
+
+ get _data() {
+ if (this.__data === null) {
+ this.__data = Object.create(null);
+ }
+ return this.__data;
+ }
+
+ set _data(v) {
+ this.__data = v;
+ }
+
+ /*
+ implicit relationships are relationship which have not been declared but the inverse side exists on
+ another record somewhere
+ For example if there was
+ ```app/models/comment.js
+ import DS from 'ember-data';
+ export default DS.Model.extend({
+ name: DS.attr()
+ })
+ ```
+ but there is also
+ ```app/models/post.js
+ import DS from 'ember-data';
+ export default DS.Model.extend({
+ name: DS.attr(),
+ comments: DS.hasMany('comment')
+ })
+ ```
+ would have a implicit post relationship in order to be do things like remove ourselves from the post
+ when we are deleted
+ */
+ get _implicitRelationships() {
+ if (this.__implicitRelationships === null) {
+ this.__implicitRelationships = Object.create(null);
+ }
+ return this.__implicitRelationships;
+ }
+
+ isHiddenFromRecordArrays() {
+ // During dematerialization we don't want to rematerialize the record.
+ // recordWasDeleted can cause other records to rematerialize because it
+ // removes the internal model from the array and Ember arrays will always
+ // `objectAt(0)` and `objectAt(len -1)` to check whether `firstObject` or
+ // `lastObject` have changed. When this happens we don't want those
+ // models to rematerialize their records.
+
+ return this._isDematerializing || this.isDestroyed || this.currentState.stateName === 'root.deleted.saved' || this.isEmpty();
+ }
+
+ isEmpty() {
+ return this.currentState.isEmpty;
+ }
+
+ isLoading() {
+ return this.currentState.isLoading;
+ }
+
+ isLoaded() {
+ return this.currentState.isLoaded;
+ }
+
+ hasDirtyAttributes() {
+ return this.currentState.hasDirtyAttributes;
+ }
+
+ isSaving() {
+ return this.currentState.isSaving;
+ }
+
+ isDeleted() {
+ return this.currentState.isDeleted;
+ }
+
+ isNew() {
+ return this.currentState.isNew;
+ }
+
+ isValid() {
+ return this.currentState.isValid;
+ }
+
+ dirtyType() {
+ return this.currentState.dirtyType;
+ }
+
+ getRecord(properties) {
+ if (!this._record && !this._isDematerializing) {
+
+ // lookupFactory should really return an object that creates
+ // instances with the injections applied
+ var createOptions = {
+ store: this.store,
+ _internalModel: this,
+ id: this.id,
+ currentState: this.currentState,
+ isError: this.isError,
+ adapterError: this.error
+ };
+
+ if (typeof properties === 'object' && properties !== null) {
+ emberAssign(createOptions, properties);
+ }
+
+ if (Ember.setOwner) {
+ // ensure that `getOwner(this)` works inside a model instance
+ Ember.setOwner(createOptions, getOwner(this.store));
+ } else {
+ createOptions.container = this.store.container;
+ }
+
+ this._record = this.store.modelFactoryFor(this.modelName).create(createOptions);
+
+ this._triggerDeferredTriggers();
+ }
+
+ return this._record;
+ }
+
+ resetRecord() {
+ this._record = null;
+ this.isReloading = false;
+ this.error = null;
+ this.currentState = RootState$1.empty;
+ this.__attributes = null;
+ this.__inFlightAttributes = null;
+ this._data = null;
+ }
+
+ dematerializeRecord() {
+ if (this._record) {
+ this._isDematerializing = true;
+ this._record.destroy();
+ this.destroyRelationships();
+ this.updateRecordArrays();
+ this.resetRecord();
+ }
+ }
+
+ deleteRecord() {
+ this.send('deleteRecord');
+ }
+
+ save(options) {
+ var promiseLabel = "DS: Model#save " + this;
+ var resolver = Ember.RSVP.defer(promiseLabel);
+
+ this.store.scheduleSave(this, resolver, options);
+ return resolver.promise;
+ }
+
+ startedReloading() {
+ this.isReloading = true;
+ if (this.hasRecord) {
+ Ember.set(this._record, 'isReloading', true);
+ }
+ }
+
+ finishedReloading() {
+ this.isReloading = false;
+ if (this.hasRecord) {
+ Ember.set(this._record, 'isReloading', false);
+ }
+ }
+
+ reload() {
+ this.startedReloading();
+ var internalModel = this;
+ var promiseLabel = "DS: Model#reload of " + this;
+
+ return new Ember.RSVP.Promise(function (resolve) {
+ internalModel.send('reloadRecord', resolve);
+ }, promiseLabel).then(function () {
+ internalModel.didCleanError();
+ return internalModel;
+ }, function (error) {
+ internalModel.didError(error);
+ throw error;
+ }, "DS: Model#reload complete, update flags").finally(function () {
+ internalModel.finishedReloading();
+ internalModel.updateRecordArrays();
+ });
+ }
+
+ /**
+ Computes the set of internal models reachable from `this` across exactly one
+ relationship.
+ @return {Array} An array containing the internal models that `this` belongs
+ to or has many.
+ */
+ _directlyRelatedInternalModels() {
+ var array = [];
+
+ this._relationships.forEach((name, rel) => {
+ array = array.concat(rel.members.list, rel.canonicalMembers.list);
+ });
+ return array;
+ }
+
+ /**
+ Computes the set of internal models reachable from this internal model.
+ Reachability is determined over the relationship graph (ie a graph where
+ nodes are internal models and edges are belongs to or has many
+ relationships).
+ @return {Array} An array including `this` and all internal models reachable
+ from `this`.
+ */
+ _allRelatedInternalModels() {
+ var array = [];
+ var queue = [];
+ var bfsId = nextBfsId++;
+ queue.push(this);
+ this._bfsId = bfsId;
+ while (queue.length > 0) {
+ var node = queue.shift();
+ array.push(node);
+ var related = node._directlyRelatedInternalModels();
+ for (var i = 0; i < related.length; ++i) {
+ var internalModel = related[i];
+ (true && !(internalModel._bfsId <= bfsId) && Ember.assert('Internal Error: seen a future bfs iteration', internalModel._bfsId <= bfsId));
+
+ if (internalModel._bfsId < bfsId) {
+ queue.push(internalModel);
+ internalModel._bfsId = bfsId;
+ }
+ }
+ }
+ return array;
+ }
+
+ /**
+ Unload the record for this internal model. This will cause the record to be
+ destroyed and freed up for garbage collection. It will also do a check
+ for cleaning up internal models.
+ This check is performed by first computing the set of related internal
+ models. If all records in this set are unloaded, then the entire set is
+ destroyed. Otherwise, nothing in the set is destroyed.
+ This means that this internal model will be freed up for garbage collection
+ once all models that refer to it via some relationship are also unloaded.
+ */
+ unloadRecord() {
+ if (this.isDestroyed) {
+ return;
+ }
+ this.send('unloadRecord');
+ this.dematerializeRecord();
+
+ if (this._scheduledDestroy === null) {
+ // TODO: use run.schedule once we drop 1.13
+ if (!Ember.run.currentRunLoop) {
+ (true && !(Ember.testing) && Ember.assert('You have turned on testing mode, which disabled the run-loop\'s autorun.\n You will need to wrap any code with asynchronous side-effects in a run', Ember.testing));
+ }
+ this._scheduledDestroy = Ember.run.backburner.schedule('destroy', this, '_checkForOrphanedInternalModels');
+ }
+ }
+
+ hasScheduledDestroy() {
+ return !!this._scheduledDestroy;
+ }
+
+ cancelDestroy() {
+ (true && !(!this.isDestroyed) && Ember.assert(`You cannot cancel the destruction of an InternalModel once it has already been destroyed`, !this.isDestroyed));
+
+
+ this._isDematerializing = false;
+ Ember.run.cancel(this._scheduledDestroy);
+ this._scheduledDestroy = null;
+ }
+
+ // typically, we prefer to async destroy this lets us batch cleanup work.
+ // Unfortunately, some scenarios where that is not possible. Such as:
+ //
+ // ```js
+ // const record = store.find(‘record’, 1);
+ // record.unloadRecord();
+ // store.createRecord(‘record’, 1);
+ // ```
+ //
+ // In those scenarios, we make that model's cleanup work, sync.
+ //
+ destroySync() {
+ if (this._isDematerializing) {
+ this.cancelDestroy();
+ }
+ this._checkForOrphanedInternalModels();
+ if (this.isDestroyed || this.isDestroying) {
+ return;
+ }
+
+ // just in-case we are not one of the orphaned, we should still
+ // still destroy ourselves
+ this.destroy();
+ }
+
+ _checkForOrphanedInternalModels() {
+ this._isDematerializing = false;
+ this._scheduledDestroy = null;
+ if (this.isDestroyed) {
+ return;
+ }
+
+ this._cleanupOrphanedInternalModels();
+ }
+
+ _cleanupOrphanedInternalModels() {
+ var relatedInternalModels = this._allRelatedInternalModels();
+ if (areAllModelsUnloaded(relatedInternalModels)) {
+ for (var i = 0; i < relatedInternalModels.length; ++i) {
+ var internalModel = relatedInternalModels[i];
+ if (!internalModel.isDestroyed) {
+ internalModel.destroy();
+ }
+ }
+ }
+ }
+
+ eachRelationship(callback, binding) {
+ return this.modelClass.eachRelationship(callback, binding);
+ }
+
+ destroy() {
+ (true && !(!this._record || this._record.get('isDestroyed') || this._record.get('isDestroying')) && Ember.assert("Cannot destroy an internalModel while its record is materialized", !this._record || this._record.get('isDestroyed') || this._record.get('isDestroying')));
+
+
+ this.store._internalModelDestroyed(this);
+
+ this._relationships.forEach((name, rel) => rel.destroy());
+
+ this._isDestroyed = true;
+ }
+
+ eachAttribute(callback, binding) {
+ return this.modelClass.eachAttribute(callback, binding);
+ }
+
+ inverseFor(key) {
+ return this.modelClass.inverseFor(key);
+ }
+
+ setupData(data) {
+ this.store._internalModelDidReceiveRelationshipData(this.modelName, this.id, data.relationships);
+
+ var changedKeys = void 0;
+
+ if (this.hasRecord) {
+ changedKeys = this._changedKeys(data.attributes);
+ }
+
+ emberAssign(this._data, data.attributes);
+ this.pushedData();
+
+ if (this.hasRecord) {
+ this._record._notifyProperties(changedKeys);
+ }
+ }
+
+ get isDestroyed() {
+ return this._isDestroyed;
+ }
+
+ get hasRecord() {
+ return !!this._record;
+ }
+
+ /*
+ @method createSnapshot
+ @private
+ */
+ createSnapshot(options) {
+ return new Snapshot(this, options);
+ }
+
+ /*
+ @method loadingData
+ @private
+ @param {Promise} promise
+ */
+ loadingData(promise) {
+ this.send('loadingData', promise);
+ }
+
+ /*
+ @method loadedData
+ @private
+ */
+ loadedData() {
+ this.send('loadedData');
+ }
+
+ /*
+ @method notFound
+ @private
+ */
+ notFound() {
+ this.send('notFound');
+ }
+
+ /*
+ @method pushedData
+ @private
+ */
+ pushedData() {
+ this.send('pushedData');
+ }
+
+ flushChangedAttributes() {
+ this._inFlightAttributes = this._attributes;
+ this._attributes = null;
+ }
+
+ hasChangedAttributes() {
+ return this.__attributes !== null && Object.keys(this.__attributes).length > 0;
+ }
+
+ /*
+ Checks if the attributes which are considered as changed are still
+ different to the state which is acknowledged by the server.
+ This method is needed when data for the internal model is pushed and the
+ pushed data might acknowledge dirty attributes as confirmed.
+ @method updateChangedAttributes
+ @private
+ */
+ updateChangedAttributes() {
+ var changedAttributes = this.changedAttributes();
+ var changedAttributeNames = Object.keys(changedAttributes);
+ var attrs = this._attributes;
+
+ for (var i = 0, length = changedAttributeNames.length; i < length; i++) {
+ var attribute = changedAttributeNames[i];
+ var data = changedAttributes[attribute];
+ var oldData = data[0];
+ var newData = data[1];
+
+ if (oldData === newData) {
+ delete attrs[attribute];
+ }
+ }
+ }
+
+ /*
+ Returns an object, whose keys are changed properties, and value is an
+ [oldProp, newProp] array.
+ @method changedAttributes
+ @private
+ */
+ changedAttributes() {
+ var oldData = this._data;
+ var currentData = this._attributes;
+ var inFlightData = this._inFlightAttributes;
+ var newData = emberAssign(Ember.copy(inFlightData), currentData);
+ var diffData = Object.create(null);
+ var newDataKeys = Object.keys(newData);
+
+ for (var i = 0, length = newDataKeys.length; i < length; i++) {
+ var key = newDataKeys[i];
+ diffData[key] = [oldData[key], newData[key]];
+ }
+
+ return diffData;
+ }
+
+ /*
+ @method adapterWillCommit
+ @private
+ */
+ adapterWillCommit() {
+ this.send('willCommit');
+ }
+
+ /*
+ @method adapterDidDirty
+ @private
+ */
+ adapterDidDirty() {
+ this.send('becomeDirty');
+ this.updateRecordArrays();
+ }
+
+ /*
+ @method send
+ @private
+ @param {String} name
+ @param {Object} context
+ */
+ send(name, context) {
+ var currentState = this.currentState;
+
+ if (!currentState[name]) {
+ this._unhandledEvent(currentState, name, context);
+ }
+
+ return currentState[name](this, context);
+ }
+
+ notifyHasManyAdded(key, record, idx) {
+ if (this.hasRecord) {
+ this._record.notifyHasManyAdded(key, record, idx);
+ }
+ }
+
+ notifyBelongsToChanged(key, record) {
+ if (this.hasRecord) {
+ this._record.notifyBelongsToChanged(key, record);
+ }
+ }
+
+ notifyPropertyChange(key) {
+ if (this.hasRecord) {
+ this._record.notifyPropertyChange(key);
+ }
+ }
+
+ rollbackAttributes() {
+ var dirtyKeys = void 0;
+ if (this.hasChangedAttributes()) {
+ dirtyKeys = Object.keys(this._attributes);
+ this._attributes = null;
+ }
+
+ if (Ember.get(this, 'isError')) {
+ this._inFlightAttributes = null;
+ this.didCleanError();
+ }
+
+ if (this.isNew()) {
+ this.removeFromInverseRelationships();
+ }
+
+ if (this.isValid()) {
+ this._inFlightAttributes = null;
+ }
+
+ this.send('rolledBack');
+
+ if (dirtyKeys && dirtyKeys.length > 0) {
+ this._record._notifyProperties(dirtyKeys);
+ }
+ }
+
+ /*
+ @method transitionTo
+ @private
+ @param {String} name
+ */
+ transitionTo(name) {
+ // POSSIBLE TODO: Remove this code and replace with
+ // always having direct reference to state objects
+
+ var pivotName = extractPivotName(name);
+ var state = this.currentState;
+ var transitionMapId = `${state.stateName}->${name}`;
+
+ do {
+ if (state.exit) {
+ state.exit(this);
+ }
+ state = state.parentState;
+ } while (!state[pivotName]);
+
+ var setups = void 0;
+ var enters = void 0;
+ var i = void 0;
+ var l = void 0;
+ var map = TransitionChainMap[transitionMapId];
+
+ if (map) {
+ setups = map.setups;
+ enters = map.enters;
+ state = map.state;
+ } else {
+ setups = [];
+ enters = [];
+
+ var path = splitOnDot(name);
+
+ for (i = 0, l = path.length; i < l; i++) {
+ state = state[path[i]];
+
+ if (state.enter) {
+ enters.push(state);
+ }
+ if (state.setup) {
+ setups.push(state);
+ }
+ }
+
+ TransitionChainMap[transitionMapId] = { setups, enters, state };
+ }
+
+ for (i = 0, l = enters.length; i < l; i++) {
+ enters[i].enter(this);
+ }
+
+ this.currentState = state;
+ if (this.hasRecord) {
+ Ember.set(this._record, 'currentState', state);
+ }
+
+ for (i = 0, l = setups.length; i < l; i++) {
+ setups[i].setup(this);
+ }
+
+ this.updateRecordArrays();
+ }
+
+ _unhandledEvent(state, name, context) {
+ var errorMessage = "Attempted to handle event `" + name + "` ";
+ errorMessage += "on " + String(this) + " while in state ";
+ errorMessage += state.stateName + ". ";
+
+ if (context !== undefined) {
+ errorMessage += "Called with " + Ember.inspect(context) + ".";
+ }
+
+ throw new Ember.Error(errorMessage);
+ }
+
+ triggerLater(...args) {
+ if (this._deferredTriggers.push(args) !== 1) {
+ return;
+ }
+
+ this.store._updateInternalModel(this);
+ }
+
+ _triggerDeferredTriggers() {
+ //TODO: Before 1.0 we want to remove all the events that happen on the pre materialized record,
+ //but for now, we queue up all the events triggered before the record was materialized, and flush
+ //them once we have the record
+ if (!this.hasRecord) {
+ return;
+ }
+ var triggers = this._deferredTriggers;
+ var record = this._record;
+ var trigger = record.trigger;
+ for (var i = 0, l = triggers.length; i < l; i++) {
+ trigger.apply(record, triggers[i]);
+ }
+
+ triggers.length = 0;
+ }
+
+ /*
+ This method should only be called by records in the `isNew()` state OR once the record
+ has been deleted and that deletion has been persisted.
+ It will remove this record from any associated relationships.
+ @method removeFromInverseRelationships
+ @private
+ */
+ removeFromInverseRelationships() {
+ this._relationships.forEach((name, rel) => {
+ rel.removeCompletelyFromInverse();
+ rel.clear();
+ });
+
+ var implicitRelationships = this._implicitRelationships;
+ this.__implicitRelationships = null;
+
+ Object.keys(implicitRelationships).forEach(key => {
+ var rel = implicitRelationships[key];
+
+ rel.removeCompletelyFromInverse();
+ rel.clear();
+ });
+ }
+
+ /*
+ Notify all inverses that this internalModel has been dematerialized
+ and destroys any ManyArrays.
+ */
+ destroyRelationships() {
+ var relationships = this._relationships;
+ relationships.forEach((name, rel) => destroyRelationship(rel));
+
+ var implicitRelationships = this._implicitRelationships;
+ this.__implicitRelationships = null;
+ Object.keys(implicitRelationships).forEach(key => {
+ var rel = implicitRelationships[key];
+ destroyRelationship(rel);
+ });
+ }
+
+ /*
+ When a find request is triggered on the store, the user can optionally pass in
+ attributes and relationships to be preloaded. These are meant to behave as if they
+ came back from the server, except the user obtained them out of band and is informing
+ the store of their existence. The most common use case is for supporting client side
+ nested URLs, such as `/posts/1/comments/2` so the user can do
+ `store.findRecord('comment', 2, { preload: { post: 1 } })` without having to fetch the post.
+ Preloaded data can be attributes and relationships passed in either as IDs or as actual
+ models.
+ @method preloadData
+ @private
+ @param {Object} preload
+ */
+ preloadData(preload) {
+ //TODO(Igor) consider the polymorphic case
+ Object.keys(preload).forEach(key => {
+ var preloadValue = Ember.get(preload, key);
+ var relationshipMeta = this.modelClass.metaForProperty(key);
+ if (relationshipMeta.isRelationship) {
+ this._preloadRelationship(key, preloadValue);
+ } else {
+ this._data[key] = preloadValue;
+ }
+ });
+ }
+
+ _preloadRelationship(key, preloadValue) {
+ var relationshipMeta = this.modelClass.metaForProperty(key);
+ var modelClass = relationshipMeta.type;
+ if (relationshipMeta.kind === 'hasMany') {
+ this._preloadHasMany(key, preloadValue, modelClass);
+ } else {
+ this._preloadBelongsTo(key, preloadValue, modelClass);
+ }
+ }
+
+ _preloadHasMany(key, preloadValue, modelClass) {
+ (true && !(Array.isArray(preloadValue)) && Ember.assert("You need to pass in an array to set a hasMany property on a record", Array.isArray(preloadValue)));
+
+ var recordsToSet = new Array(preloadValue.length);
+
+ for (var i = 0; i < preloadValue.length; i++) {
+ var recordToPush = preloadValue[i];
+ recordsToSet[i] = this._convertStringOrNumberIntoInternalModel(recordToPush, modelClass);
+ }
+
+ //We use the pathway of setting the hasMany as if it came from the adapter
+ //because the user told us that they know this relationships exists already
+ this._relationships.get(key).updateInternalModelsFromAdapter(recordsToSet);
+ }
+
+ _preloadBelongsTo(key, preloadValue, modelClass) {
+ var internalModelToSet = this._convertStringOrNumberIntoInternalModel(preloadValue, modelClass);
+
+ //We use the pathway of setting the hasMany as if it came from the adapter
+ //because the user told us that they know this relationships exists already
+ this._relationships.get(key).setInternalModel(internalModelToSet);
+ }
+
+ _convertStringOrNumberIntoInternalModel(value, modelClass) {
+ if (typeof value === 'string' || typeof value === 'number') {
+ return this.store._internalModelForId(modelClass, value);
+ }
+ if (value._internalModel) {
+ return value._internalModel;
+ }
+ return value;
+ }
+
+ /*
+ Used to notify the store to update FilteredRecordArray membership.
+ @method updateRecordArrays
+ @private
+ */
+ updateRecordArrays() {
+ this.store.recordArrayManager.recordDidChange(this);
+ }
+
+ setId(id) {
+ (true && !(this.id === null || this.id === id || this.isNew()) && Ember.assert('A record\'s id cannot be changed once it is in the loaded state', this.id === null || this.id === id || this.isNew()));
+
+ this.id = id;
+ if (this._record.get('id') !== id) {
+ this._record.set('id', id);
+ }
+ }
+
+ didError(error) {
+ this.error = error;
+ this.isError = true;
+
+ if (this.hasRecord) {
+ this._record.setProperties({
+ isError: true,
+ adapterError: error
+ });
+ }
+ }
+
+ didCleanError() {
+ this.error = null;
+ this.isError = false;
+
+ if (this.hasRecord) {
+ this._record.setProperties({
+ isError: false,
+ adapterError: null
+ });
+ }
+ }
+
+ /*
+ If the adapter did not return a hash in response to a commit,
+ merge the changed attributes and relationships into the existing
+ saved data.
+ @method adapterDidCommit
+ */
+ adapterDidCommit(data) {
+ if (data) {
+ this.store._internalModelDidReceiveRelationshipData(this.modelName, this.id, data.relationships);
+
+ data = data.attributes;
+ }
+
+ this.didCleanError();
+ var changedKeys = this._changedKeys(data);
+
+ emberAssign(this._data, this._inFlightAttributes);
+ if (data) {
+ emberAssign(this._data, data);
+ }
+
+ this._inFlightAttributes = null;
+
+ this.send('didCommit');
+ this.updateRecordArrays();
+
+ if (!data) {
+ return;
+ }
+
+ this._record._notifyProperties(changedKeys);
+ }
+
+ addErrorMessageToAttribute(attribute, message) {
+ Ember.get(this.getRecord(), 'errors')._add(attribute, message);
+ }
+
+ removeErrorMessageFromAttribute(attribute) {
+ Ember.get(this.getRecord(), 'errors')._remove(attribute);
+ }
+
+ clearErrorMessages() {
+ Ember.get(this.getRecord(), 'errors')._clear();
+ }
+
+ hasErrors() {
+ var errors = Ember.get(this.getRecord(), 'errors');
+
+ return !Ember.isEmpty(errors);
+ }
+
+ // FOR USE DURING COMMIT PROCESS
+
+ /*
+ @method adapterDidInvalidate
+ @private
+ */
+ adapterDidInvalidate(errors) {
+ var attribute = void 0;
+
+ for (attribute in errors) {
+ if (errors.hasOwnProperty(attribute)) {
+ this.addErrorMessageToAttribute(attribute, errors[attribute]);
+ }
+ }
+
+ this.send('becameInvalid');
+
+ this._saveWasRejected();
+ }
+
+ /*
+ @method adapterDidError
+ @private
+ */
+ adapterDidError(error) {
+ this.send('becameError');
+ this.didError(error);
+ this._saveWasRejected();
+ }
+
+ _saveWasRejected() {
+ var keys = Object.keys(this._inFlightAttributes);
+ if (keys.length > 0) {
+ var attrs = this._attributes;
+ for (var i = 0; i < keys.length; i++) {
+ if (attrs[keys[i]] === undefined) {
+ attrs[keys[i]] = this._inFlightAttributes[keys[i]];
+ }
+ }
+ }
+ this._inFlightAttributes = null;
+ }
+
+ /*
+ Ember Data has 3 buckets for storing the value of an attribute on an internalModel.
+ `_data` holds all of the attributes that have been acknowledged by
+ a backend via the adapter. When rollbackAttributes is called on a model all
+ attributes will revert to the record's state in `_data`.
+ `_attributes` holds any change the user has made to an attribute
+ that has not been acknowledged by the adapter. Any values in
+ `_attributes` are have priority over values in `_data`.
+ `_inFlightAttributes`. When a record is being synced with the
+ backend the values in `_attributes` are copied to
+ `_inFlightAttributes`. This way if the backend acknowledges the
+ save but does not return the new state Ember Data can copy the
+ values from `_inFlightAttributes` to `_data`. Without having to
+ worry about changes made to `_attributes` while the save was
+ happenign.
+ Changed keys builds a list of all of the values that may have been
+ changed by the backend after a successful save.
+ It does this by iterating over each key, value pair in the payload
+ returned from the server after a save. If the `key` is found in
+ `_attributes` then the user has a local changed to the attribute
+ that has not been synced with the server and the key is not
+ included in the list of changed keys.
+
+ If the value, for a key differs from the value in what Ember Data
+ believes to be the truth about the backend state (A merger of the
+ `_data` and `_inFlightAttributes` objects where
+ `_inFlightAttributes` has priority) then that means the backend
+ has updated the value and the key is added to the list of changed
+ keys.
+ @method _changedKeys
+ @private
+ */
+ _changedKeys(updates) {
+ var changedKeys = [];
+
+ if (updates) {
+ var original = void 0,
+ i = void 0,
+ value = void 0,
+ key = void 0;
+ var keys = Object.keys(updates);
+ var length = keys.length;
+ var hasAttrs = this.hasChangedAttributes();
+ var attrs = void 0;
+ if (hasAttrs) {
+ attrs = this._attributes;
+ }
+
+ original = emberAssign(Object.create(null), this._data);
+ original = emberAssign(original, this._inFlightAttributes);
+
+ for (i = 0; i < length; i++) {
+ key = keys[i];
+ value = updates[key];
+
+ // A value in _attributes means the user has a local change to
+ // this attributes. We never override this value when merging
+ // updates from the backend so we should not sent a change
+ // notification if the server value differs from the original.
+ if (hasAttrs === true && attrs[key] !== undefined) {
+ continue;
+ }
+
+ if (!Ember.isEqual(original[key], value)) {
+ changedKeys.push(key);
+ }
+ }
+ }
+
+ return changedKeys;
+ }
+
+ toString() {
+ return `<${this.modelName}:${this.id}>`;
+ }
+
+ referenceFor(kind, name) {
+ var reference = this.references[name];
+
+ if (!reference) {
+ var relationship = this._relationships.get(name);
+
+ {
+ var modelName = this.modelName;
+ (true && !(relationship) && Ember.assert(`There is no ${kind} relationship named '${name}' on a model of modelClass '${modelName}'`, relationship));
+
+
+ var actualRelationshipKind = relationship.relationshipMeta.kind;
+ (true && !(actualRelationshipKind === kind) && Ember.assert(`You tried to get the '${name}' relationship on a '${modelName}' via record.${kind}('${name}'), but the relationship is of kind '${actualRelationshipKind}'. Use record.${actualRelationshipKind}('${name}') instead.`, actualRelationshipKind === kind));
+ }
+
+ if (kind === "belongsTo") {
+ reference = new BelongsToReference(this.store, this, relationship);
+ } else if (kind === "hasMany") {
+ reference = new HasManyReference(this.store, this, relationship);
+ }
+
+ this.references[name] = reference;
+ }
+
+ return reference;
+ }
+}
+
+if (isEnabled('ds-rollback-attribute')) {
+ /*
+ Returns the latest truth for an attribute - the canonical value, or the
+ in-flight value.
+ @method lastAcknowledgedValue
+ @private
+ */
+ InternalModel.prototype.lastAcknowledgedValue = function lastAcknowledgedValue(key) {
+ if (key in this._inFlightAttributes) {
+ return this._inFlightAttributes[key];
+ } else {
+ return this._data[key];
+ }
+ };
+}
+
+/**
+ `InternalModelMap` is a custom storage map for internalModels of a given modelName
+ used by `IdentityMap`.
+
+ It was extracted from an implicit pojo based "internalModel map" and preserves
+ that interface while we work towards a more official API.
+
+ @class InternalModelMap
+ @private
+ */
+class InternalModelMap {
+ constructor(modelName) {
+ this.modelName = modelName;
+ this._idToModel = Object.create(null);
+ this._models = [];
+ this._metadata = null;
+ }
+
+ /**
+ *
+ * @param id
+ * @returns {InternalModel}
+ */
+ get(id) {
+ return this._idToModel[id];
+ }
+
+ has(id) {
+ return !!this._idToModel[id];
+ }
+
+ get length() {
+ return this._models.length;
+ }
+
+ set(id, internalModel) {
+ (true && !(id) && Ember.assert(`You cannot index an internalModel by an empty id'`, id));
+ (true && !(internalModel instanceof InternalModel) && Ember.assert(`You cannot set an index for an internalModel to something other than an internalModel`, internalModel instanceof InternalModel));
+ (true && !(this.contains(internalModel)) && Ember.assert(`You cannot set an index for an internalModel that is not in the InternalModelMap`, this.contains(internalModel)));
+ (true && !(!this.has(id) || this.get(id) === internalModel) && Ember.assert(`You cannot update the id index of an InternalModel once set. Attempted to update ${id}.`, !this.has(id) || this.get(id) === internalModel));
+
+
+ this._idToModel[id] = internalModel;
+ }
+
+ add(internalModel, id) {
+ (true && !(!this.contains(internalModel)) && Ember.assert(`You cannot re-add an already present InternalModel to the InternalModelMap.`, !this.contains(internalModel)));
+
+
+ if (id) {
+ this._idToModel[id] = internalModel;
+ }
+
+ this._models.push(internalModel);
+ }
+
+ remove(internalModel, id) {
+ delete this._idToModel[id];
+
+ var loc = this._models.indexOf(internalModel);
+
+ if (loc !== -1) {
+ this._models.splice(loc, 1);
+ }
+ }
+
+ contains(internalModel) {
+ return this._models.indexOf(internalModel) !== -1;
+ }
+
+ /**
+ An array of all models of this modelName
+ */
+ get models() {
+ return this._models;
+ }
+
+ /**
+ * meta information about internalModels
+ */
+ get metadata() {
+ return this._metadata || (this._metadata = Object.create(null));
+ }
+
+ /**
+ deprecated (and unsupported) way of accessing modelClass
+ @deprecated
+ */
+ get type() {
+ throw new Error('InternalModelMap.type is no longer available');
+ }
+
+ /**
+ Destroy all models in the internalModelTest and wipe metadata.
+ @method clear
+ */
+ clear() {
+ var models = this._models;
+ this._models = [];
+
+ for (var i = 0; i < models.length; i++) {
+ var model = models[i];
+ model.unloadRecord();
+ }
+
+ this._metadata = null;
+ }
+
+}
+
+/**
+ `IdentityMap` is a custom storage map for records by modelName
+ used by `DS.Store`.
+
+ @class IdentityMap
+ @private
+ */
+class IdentityMap {
+ constructor() {
+ this._map = Object.create(null);
+ }
+
+ /**
+ Retrieves the `InternalModelMap` for a given modelName,
+ creating one if one did not already exist. This is
+ similar to `getWithDefault` or `get` on a `MapWithDefault`
+ @method retrieve
+ @param modelName a previously normalized modelName
+ @returns {InternalModelMap} the InternalModelMap for the given modelName
+ */
+ retrieve(modelName) {
+ var map = this._map[modelName];
+
+ if (map === undefined) {
+ map = this._map[modelName] = new InternalModelMap(modelName);
+ }
+
+ return map;
+ }
+
+ /**
+ Clears the contents of all known `RecordMaps`, but does
+ not remove the InternalModelMap instances.
+ @method clear
+ */
+ clear() {
+ var map = this._map;
+ var keys = Object.keys(map);
+
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];
+ map[key].clear();
+ }
+ }
+}
+
+/*
+ This is a helper method that validates a JSON API top-level document
+
+ The format of a document is described here:
+ http://jsonapi.org/format/#document-top-level
+
+ @method validateDocumentStructure
+ @param {Object} doc JSON API document
+ @return {array} An array of errors found in the document structure
+*/
+function validateDocumentStructure(doc) {
+ var errors = [];
+ if (!doc || typeof doc !== 'object') {
+ errors.push('Top level of a JSON API document must be an object');
+ } else {
+ if (!('data' in doc) && !('errors' in doc) && !('meta' in doc)) {
+ errors.push('One or more of the following keys must be present: "data", "errors", "meta".');
+ } else {
+ if ('data' in doc && 'errors' in doc) {
+ errors.push('Top level keys "errors" and "data" cannot both be present in a JSON API document');
+ }
+ }
+ if ('data' in doc) {
+ if (!(doc.data === null || Array.isArray(doc.data) || typeof doc.data === 'object')) {
+ errors.push('data must be null, an object, or an array');
+ }
+ }
+ if ('meta' in doc) {
+ if (typeof doc.meta !== 'object') {
+ errors.push('meta must be an object');
+ }
+ }
+ if ('errors' in doc) {
+ if (!Array.isArray(doc.errors)) {
+ errors.push('errors must be an array');
+ }
+ }
+ if ('links' in doc) {
+ if (typeof doc.links !== 'object') {
+ errors.push('links must be an object');
+ }
+ }
+ if ('jsonapi' in doc) {
+ if (typeof doc.jsonapi !== 'object') {
+ errors.push('jsonapi must be an object');
+ }
+ }
+ if ('included' in doc) {
+ if (typeof doc.included !== 'object') {
+ errors.push('included must be an array');
+ }
+ }
+ }
+
+ return errors;
+}
+
+/*
+ This is a helper method that always returns a JSON-API Document.
+
+ @method normalizeResponseHelper
+ @param {DS.Serializer} serializer
+ @param {DS.Store} store
+ @param {subclass of DS.Model} modelClass
+ @param {Object} payload
+ @param {String|Number} id
+ @param {String} requestType
+ @return {Object} JSON-API Document
+*/
+function normalizeResponseHelper(serializer, store, modelClass, payload, id, requestType) {
+ var normalizedResponse = serializer.normalizeResponse(store, modelClass, payload, id, requestType);
+ var validationErrors = [];
+ {
+ validationErrors = validateDocumentStructure(normalizedResponse);
+ }
+ (true && !(Ember.isEmpty(validationErrors)) && Ember.assert(`normalizeResponse must return a valid JSON API document:\n\t* ${validationErrors.join('\n\t* ')}`, Ember.isEmpty(validationErrors)));
+
+
+ return normalizedResponse;
+}
+
+function serializerForAdapter(store, adapter, modelName) {
+ var serializer = adapter.serializer;
+
+ if (serializer === undefined) {
+ serializer = store.serializerFor(modelName);
+ }
+
+ if (serializer === null || serializer === undefined) {
+ serializer = {
+ extract(store, type, payload) {
+ return payload;
+ }
+ };
+ }
+
+ return serializer;
+}
+
+// TODO this is now VERY similar to the identity/internal-model map
+// so we should probably generalize
+class TypeCache {
+ constructor() {
+ this.types = Object.create(null);
+ }
+ get(modelName, id) {
+ var { types } = this;
+
+ if (types[modelName] !== undefined) {
+ return types[modelName][id];
+ }
+ }
+
+ set(modelName, id, payload) {
+ var { types } = this;
+ var typeMap = types[modelName];
+
+ if (typeMap === undefined) {
+ typeMap = types[modelName] = Object.create(null);
+ }
+
+ typeMap[id] = payload;
+ }
+
+ delete(modelName, id) {
+ var { types } = this;
+
+ if (types[modelName] !== undefined) {
+ delete types[modelName][id];
+ }
+ }
+}
+
+/**
+ Manages the payloads for both sides of a single relationship, across all model
+ instances.
+
+ For example, with
+
+ const User = DS.Model.extend({
+ hobbies: DS.hasMany('hobby')
+ });
+
+ const Hobby = DS.Model.extend({
+ user: DS.belongsTo('user')
+ });
+
+ let relationshipPayloads = new RelationshipPayloads('user', 'hobbies', 'hobby', 'user');
+
+ let userPayload = {
+ data: {
+ id: 1,
+ type: 'user',
+ relationships: {
+ hobbies: {
+ data: [{
+ id: 2,
+ type: 'hobby',
+ }]
+ }
+ }
+ }
+ };
+
+ // here we expect the payload of the individual relationship
+ relationshipPayloads.push('user', 1, 'hobbies', userPayload.data.relationships.hobbies);
+
+ relationshipPayloads.get('user', 1, 'hobbies');
+ relationshipPayloads.get('hobby', 2, 'user');
+
+ @class RelationshipPayloads
+ @private
+ */
+class RelationshipPayloads {
+ constructor(relInfo) {
+ this._relInfo = relInfo;
+
+ // a map of id -> payloads for the left hand side of the relationship.
+ this.lhs_payloads = new TypeCache();
+ this.rhs_payloads = relInfo.isReflexive ? this.lhs_payloads : new TypeCache();
+
+ // When we push relationship payloads, just stash them in a queue until
+ // somebody actually asks for one of them.
+ //
+ // This is a queue of the relationship payloads that have been pushed for
+ // either side of this relationship
+ this._pendingPayloads = [];
+ }
+
+ /**
+ Get the payload for the relationship of an individual record.
+ This might return the raw payload as pushed into the store, or one computed
+ from the payload of the inverse relationship.
+ @method
+ */
+ get(modelName, id, relationshipName) {
+ this._flushPending();
+
+ if (this._isLHS(modelName, relationshipName)) {
+ return this.lhs_payloads.get(modelName, id);
+ } else {
+ (true && !(this._isRHS(modelName, relationshipName)) && Ember.assert(`${modelName}:${relationshipName} is not either side of this relationship, ${this._relInfo.lhs_key}<->${this._relInfo.rhs_key}`, this._isRHS(modelName, relationshipName)));
+
+ return this.rhs_payloads.get(modelName, id);
+ }
+ }
+
+ /**
+ Push a relationship payload for an individual record.
+ This will make the payload available later for both this relationship and its inverse.
+ @method
+ */
+ push(modelName, id, relationshipName, relationshipData) {
+ this._pendingPayloads.push([modelName, id, relationshipName, relationshipData]);
+ }
+
+ /**
+ Unload the relationship payload for an individual record.
+ This does not unload the inverse relationship payload.
+ @method
+ */
+ unload(modelName, id, relationshipName) {
+ this._flushPending();
+
+ if (this._isLHS(modelName, relationshipName)) {
+ delete this.lhs_payloads.delete(modelName, id);
+ } else {
+ (true && !(this._isRHS(modelName, relationshipName)) && Ember.assert(`${modelName}:${relationshipName} is not either side of this relationship, ${this._relInfo.lhs_baseModelName}:${this._relInfo.lhs_relationshipName}<->${this._relInfo.rhs_baseModelName}:${this._relInfo.rhs_relationshipName}`, this._isRHS(modelName, relationshipName)));
+
+ delete this.rhs_payloads.delete(modelName, id);
+ }
+ }
+
+ /**
+ @return {boolean} true iff `modelName` and `relationshipName` refer to the
+ left hand side of this relationship, as opposed to the right hand side.
+ @method
+ */
+ _isLHS(modelName, relationshipName) {
+ var relInfo = this._relInfo;
+ var isSelfReferential = relInfo.isSelfReferential;
+ var isRelationship = relationshipName === relInfo.lhs_relationshipName;
+
+ if (isRelationship === true) {
+ return isSelfReferential === true || // itself
+ modelName === relInfo.lhs_baseModelName || // base or non-polymorphic
+ relInfo.lhs_modelNames.indexOf(modelName) !== -1; // polymorphic
+ }
+
+ return false;
+ }
+
+ /**
+ @return {boolean} true iff `modelName` and `relationshipName` refer to the
+ right hand side of this relationship, as opposed to the left hand side.
+ @method
+ */
+ _isRHS(modelName, relationshipName) {
+ var relInfo = this._relInfo;
+ var isSelfReferential = relInfo.isSelfReferential;
+ var isRelationship = relationshipName === relInfo.rhs_relationshipName;
+
+ if (isRelationship === true) {
+ return isSelfReferential === true || // itself
+ modelName === relInfo.rhs_baseModelName || // base or non-polymorphic
+ relInfo.rhs_modelNames.indexOf(modelName) !== -1; // polymorphic
+ }
+
+ return false;
+ }
+
+ _flushPending() {
+ if (this._pendingPayloads.length === 0) {
+ return;
+ }
+
+ var payloadsToBeProcessed = this._pendingPayloads.splice(0, this._pendingPayloads.length);
+ for (var i = 0; i < payloadsToBeProcessed.length; ++i) {
+ var modelName = payloadsToBeProcessed[i][0];
+ var id = payloadsToBeProcessed[i][1];
+ var relationshipName = payloadsToBeProcessed[i][2];
+ var relationshipData = payloadsToBeProcessed[i][3];
+
+ // TODO: maybe delay this allocation slightly?
+ var inverseRelationshipData = {
+ data: {
+ id: id,
+ type: modelName
+ }
+ };
+
+ // start flushing this individual payload. The logic is the same whether
+ // it's for the left hand side of the relationship or the right hand side,
+ // except the role of primary and inverse idToPayloads is reversed
+ //
+ var previousPayload = void 0;
+ var payloadMap = void 0;
+ var inversePayloadMap = void 0;
+ var inverseIsMany = void 0;
+
+ if (this._isLHS(modelName, relationshipName)) {
+ previousPayload = this.lhs_payloads.get(modelName, id);
+ payloadMap = this.lhs_payloads;
+ inversePayloadMap = this.rhs_payloads;
+ inverseIsMany = this._rhsRelationshipIsMany;
+ } else {
+ (true && !(this._isRHS(modelName, relationshipName)) && Ember.assert(`${modelName}:${relationshipName} is not either side of this relationship, ${this._relInfo.lhs_key}<->${this._relInfo.rhs_key}`, this._isRHS(modelName, relationshipName)));
+
+ previousPayload = this.rhs_payloads.get(modelName, id);
+ payloadMap = this.rhs_payloads;
+ inversePayloadMap = this.lhs_payloads;
+ inverseIsMany = this._lhsRelationshipIsMany;
+ }
+
+ // actually flush this individual payload
+ //
+ // We remove the previous inverse before populating our current one
+ // because we may have multiple payloads for the same relationship, in
+ // which case the last one wins.
+ //
+ // eg if user hasMany helicopters, and helicopter belongsTo user and we see
+ //
+ // [{
+ // data: {
+ // id: 1,
+ // type: 'helicopter',
+ // relationships: {
+ // user: {
+ // id: 2,
+ // type: 'user'
+ // }
+ // }
+ // }
+ // }, {
+ // data: {
+ // id: 1,
+ // type: 'helicopter',
+ // relationships: {
+ // user: {
+ // id: 4,
+ // type: 'user'
+ // }
+ // }
+ // }
+ // }]
+ //
+ // Then we will initially have set user:2 as having helicopter:1, which we
+ // need to remove before adding helicopter:1 to user:4
+ //
+ // only remove relationship information before adding if there is relationshipData.data
+ // * null is considered new information "empty", and it should win
+ // * undefined is NOT considered new information, we should keep original state
+ // * anything else is considered new information, and it should win
+ if (relationshipData.data !== undefined) {
+ this._removeInverse(id, previousPayload, inversePayloadMap);
+ }
+ payloadMap.set(modelName, id, relationshipData);
+ this._populateInverse(relationshipData, inverseRelationshipData, inversePayloadMap, inverseIsMany);
+ }
+ }
+
+ /**
+ Populate the inverse relationship for `relationshipData`.
+ If `relationshipData` is an array (eg because the relationship is hasMany)
+ this means populate each inverse, otherwise populate only the single
+ inverse.
+ @private
+ @method
+ */
+ _populateInverse(relationshipData, inversePayload, inversePayloadMap, inverseIsMany) {
+ if (!relationshipData.data) {
+ // This id doesn't have an inverse, eg a belongsTo with a payload
+ // { data: null }, so there's nothing to populate
+ return;
+ }
+
+ if (Array.isArray(relationshipData.data)) {
+ for (var i = 0; i < relationshipData.data.length; ++i) {
+ var resourceIdentifier = relationshipData.data[i];
+ this._addToInverse(inversePayload, resourceIdentifier, inversePayloadMap, inverseIsMany);
+ }
+ } else {
+ var _resourceIdentifier = relationshipData.data;
+ this._addToInverse(inversePayload, _resourceIdentifier, inversePayloadMap, inverseIsMany);
+ }
+ }
+
+ /**
+ Actually add `inversePayload` to `inverseIdToPayloads`. This is part of
+ `_populateInverse` after we've normalized the case of `relationshipData`
+ being either an array or a pojo.
+ We still have to handle the case that the *inverse* relationship payload may
+ be an array or pojo.
+ @private
+ @method
+ */
+ _addToInverse(inversePayload, resourceIdentifier, inversePayloadMap, inverseIsMany) {
+ var relInfo = this._relInfo;
+
+ if (relInfo.isReflexive && inversePayload.data.id === resourceIdentifier.id) {
+ // eg <user:1>.friends = [{ id: 1, type: 'user' }]
+ return;
+ }
+
+ var existingPayload = inversePayloadMap.get(resourceIdentifier.type, resourceIdentifier.id);
+ var existingData = existingPayload && existingPayload.data;
+
+ if (existingData) {
+ // There already is an inverse, either add or overwrite depehnding on
+ // whether the inverse is a many relationship or not
+ //
+ if (Array.isArray(existingData)) {
+ existingData.push(inversePayload.data);
+ } else {
+ inversePayloadMap.set(resourceIdentifier.type, resourceIdentifier.id, inversePayload);
+ }
+ } else {
+ // first time we're populating the inverse side
+ //
+ if (inverseIsMany) {
+ inversePayloadMap.set(resourceIdentifier.type, resourceIdentifier.id, {
+ data: [inversePayload.data]
+ });
+ } else {
+ inversePayloadMap.set(resourceIdentifier.type, resourceIdentifier.id, inversePayload);
+ }
+ }
+ }
+
+ get _lhsRelationshipIsMany() {
+ var meta = this._relInfo.lhs_relationshipMeta;
+ return meta !== null && meta.kind === 'hasMany';
+ }
+
+ get _rhsRelationshipIsMany() {
+ var meta = this._relInfo.rhs_relationshipMeta;
+ return meta !== null && meta.kind === 'hasMany';
+ }
+
+ /**
+ Remove the relationship in `previousPayload` from its inverse(s), because
+ this relationship payload has just been updated (eg because the same
+ relationship had multiple payloads pushed before the relationship was
+ initialized).
+ @method
+ */
+ _removeInverse(id, previousPayload, inversePayloadMap) {
+ var data = previousPayload && previousPayload.data;
+ if (!data) {
+ // either this is the first time we've seen a payload for this id, or its
+ // previous payload indicated that it had no inverse, eg a belongsTo
+ // relationship with payload { data: null }
+ //
+ // In either case there's nothing that needs to be removed from the
+ // inverse map of payloads
+ return;
+ }
+
+ if (Array.isArray(data)) {
+ // TODO: diff rather than removeall addall?
+ for (var i = 0; i < data.length; ++i) {
+ var resourceIdentifier = data[i];
+ this._removeFromInverse(id, resourceIdentifier, inversePayloadMap);
+ }
+ } else {
+ this._removeFromInverse(id, data, inversePayloadMap);
+ }
+ }
+
+ /**
+ Remove `id` from its inverse record with id `inverseId`. If the inverse
+ relationship is a belongsTo, this means just setting it to null, if the
+ inverse relationship is a hasMany, then remove that id from its array of ids.
+ @method
+ */
+ _removeFromInverse(id, resourceIdentifier, inversePayloads) {
+ var inversePayload = inversePayloads.get(resourceIdentifier.type, resourceIdentifier.id);
+ var data = inversePayload && inversePayload.data;
+
+ if (!data) {
+ return;
+ }
+
+ if (Array.isArray(data)) {
+ inversePayload.data = data.filter(x => x.id !== id);
+ } else {
+ inversePayloads.set(resourceIdentifier.type, resourceIdentifier.id, {
+ data: null
+ });
+ }
+ }
+}
+
+/**
+ Manages relationship payloads for a given store, for uninitialized
+ relationships. Acts as a single source of truth (of payloads) for both sides
+ of an uninitialized relationship so they can agree on the most up-to-date
+ payload received without needing too much eager processing when those payloads
+ are pushed into the store.
+
+ This minimizes the work spent on relationships that are never initialized.
+
+ Once relationships are initialized, their state is managed in a relationship
+ state object (eg BelongsToRelationship or ManyRelationship).
+
+
+ @example
+
+ let relationshipPayloadsManager = new RelationshipPayloadsManager(store);
+
+ const User = DS.Model.extend({
+ hobbies: DS.hasMany('hobby')
+ });
+
+ const Hobby = DS.Model.extend({
+ user: DS.belongsTo('user')
+ });
+
+ let userPayload = {
+ data: {
+ id: 1,
+ type: 'user',
+ relationships: {
+ hobbies: {
+ data: [{
+ id: 2,
+ type: 'hobby'
+ }]
+ }
+ }
+ },
+ };
+ relationshipPayloadsManager.push('user', 1, userPayload.data.relationships);
+
+ relationshipPayloadsManager.get('hobby', 2, 'user') === {
+ {
+ data: {
+ id: 1,
+ type: 'user'
+ }
+ }
+ }
+
+ @private
+ @class RelationshipPayloadsManager
+*/
+
+// import { DEBUG } from '@glimmer/env';
+class RelationshipPayloadsManager {
+ constructor(store) {
+ this._store = store;
+ // cache of `RelationshipPayload`s
+ this._cache = Object.create(null);
+ this._inverseLookupCache = new TypeCache();
+ }
+
+ /**
+ Find the payload for the given relationship of the given model.
+ Returns the payload for the given relationship, whether raw or computed from
+ the payload of the inverse relationship.
+ @example
+ relationshipPayloadsManager.get('hobby', 2, 'user') === {
+ {
+ data: {
+ id: 1,
+ type: 'user'
+ }
+ }
+ }
+ @method
+ */
+ get(modelName, id, relationshipName) {
+ var relationshipPayloads = this._getRelationshipPayloads(modelName, relationshipName, false);
+ return relationshipPayloads && relationshipPayloads.get(modelName, id, relationshipName);
+ }
+
+ /**
+ Push a model's relationships payload into this cache.
+ @example
+ let userPayload = {
+ data: {
+ id: 1,
+ type: 'user',
+ relationships: {
+ hobbies: {
+ data: [{
+ id: 2,
+ type: 'hobby'
+ }]
+ }
+ }
+ },
+ };
+ relationshipPayloadsManager.push('user', 1, userPayload.data.relationships);
+ @method
+ */
+ push(modelName, id, relationshipsData) {
+ if (!relationshipsData) {
+ return;
+ }
+
+ Object.keys(relationshipsData).forEach(key => {
+ var relationshipPayloads = this._getRelationshipPayloads(modelName, key, true);
+ if (relationshipPayloads) {
+ relationshipPayloads.push(modelName, id, key, relationshipsData[key]);
+ }
+ });
+ }
+
+ /**
+ Unload a model's relationships payload.
+ @method
+ */
+ unload(modelName, id) {
+ var modelClass = this._store._modelFor(modelName);
+ var relationshipsByName = Ember.get(modelClass, 'relationshipsByName');
+ relationshipsByName.forEach((_, relationshipName) => {
+ var relationshipPayloads = this._getRelationshipPayloads(modelName, relationshipName, false);
+ if (relationshipPayloads) {
+ relationshipPayloads.unload(modelName, id, relationshipName);
+ }
+ });
+ }
+
+ /**
+ Find the RelationshipPayloads object for the given relationship. The same
+ RelationshipPayloads object is returned for either side of a relationship.
+ @example
+ const User = DS.Model.extend({
+ hobbies: DS.hasMany('hobby')
+ });
+ const Hobby = DS.Model.extend({
+ user: DS.belongsTo('user')
+ });
+ relationshipPayloads.get('user', 'hobbies') === relationshipPayloads.get('hobby', 'user');
+ The signature has a somewhat large arity to avoid extra work, such as
+ a) string manipulation & allocation with `modelName` and
+ `relationshipName`
+ b) repeatedly getting `relationshipsByName` via `Ember.get`
+ @private
+ @method
+ */
+ _getRelationshipPayloads(modelName, relationshipName, init) {
+ var relInfo = this.getRelationshipInfo(modelName, relationshipName);
+
+ if (relInfo === null) {
+ return;
+ }
+
+ var cache = this._cache[relInfo.lhs_key];
+
+ if (!cache && init) {
+ return this._initializeRelationshipPayloads(relInfo);
+ }
+
+ return cache;
+ }
+
+ getRelationshipInfo(modelName, relationshipName) {
+ var inverseCache = this._inverseLookupCache;
+ var store = this._store;
+ var cached = inverseCache.get(modelName, relationshipName);
+
+ // CASE: We have a cached resolution (null if no relationship exists)
+ if (cached !== undefined) {
+ return cached;
+ }
+
+ var modelClass = store._modelFor(modelName);
+ var relationshipsByName = Ember.get(modelClass, 'relationshipsByName');
+
+ // CASE: We don't have a relationship at all
+ if (!relationshipsByName.has(relationshipName)) {
+ inverseCache.set(modelName, relationshipName, null);
+ return null;
+ }
+
+ var inverseMeta = modelClass.inverseFor(relationshipName, store);
+ var relationshipMeta = relationshipsByName.get(relationshipName);
+ var selfIsPolymorphic = relationshipMeta.options !== undefined && relationshipMeta.options.polymorphic === true;
+ var inverseBaseModelName = relationshipMeta.type;
+
+ // CASE: We have no inverse
+ if (!inverseMeta) {
+ var _info = {
+ lhs_key: `${modelName}:${relationshipName}`,
+ lhs_modelNames: [modelName],
+ lhs_baseModelName: modelName,
+ lhs_relationshipName: relationshipName,
+ lhs_relationshipMeta: relationshipMeta,
+ lhs_isPolymorphic: selfIsPolymorphic,
+ rhs_key: '',
+ rhs_modelNames: [],
+ rhs_baseModelName: inverseBaseModelName,
+ rhs_relationshipName: '',
+ rhs_relationshipMeta: null,
+ rhs_isPolymorphic: false,
+ hasInverse: false,
+ isSelfReferential: false, // modelName === inverseBaseModelName,
+ isReflexive: false
+ };
+
+ inverseCache.set(modelName, relationshipName, _info);
+
+ return _info;
+ }
+
+ // CASE: We do have an inverse
+
+ var inverseRelationshipName = inverseMeta.name;
+ var inverseRelationshipMeta = Ember.get(inverseMeta.type, 'relationshipsByName').get(inverseRelationshipName);
+ var baseModelName = inverseRelationshipMeta.type;
+ var isSelfReferential = baseModelName === inverseBaseModelName;
+
+ // TODO we want to assert this but this breaks all of our shoddily written tests
+ /*
+ if (DEBUG) {
+ let inverseDoubleCheck = inverseMeta.type.inverseFor(inverseRelationshipName, store);
+ assert(`The ${inverseBaseModelName}:${inverseRelationshipName} relationship declares 'inverse: null', but it was resolved as the inverse for ${baseModelName}:${relationshipName}.`, inverseDoubleCheck);
+ }
+ */
+
+ // CASE: We may have already discovered the inverse for the baseModelName
+ // CASE: We have already discovered the inverse
+ cached = inverseCache.get(baseModelName, relationshipName) || inverseCache.get(inverseBaseModelName, inverseRelationshipName);
+ if (cached) {
+ // TODO this assert can be removed if the above assert is enabled
+ (true && !(cached.hasInverse !== false) && Ember.assert(`The ${inverseBaseModelName}:${inverseRelationshipName} relationship declares 'inverse: null', but it was resolved as the inverse for ${baseModelName}:${relationshipName}.`, cached.hasInverse !== false));
+
+
+ var isLHS = cached.lhs_baseModelName === baseModelName;
+ var modelNames = isLHS ? cached.lhs_modelNames : cached.rhs_modelNames;
+ // make this lookup easier in the future by caching the key
+ modelNames.push(modelName);
+ inverseCache.set(modelName, relationshipName, cached);
+
+ return cached;
+ }
+
+ var info = {
+ lhs_key: `${baseModelName}:${relationshipName}`,
+ lhs_modelNames: [modelName],
+ lhs_baseModelName: baseModelName,
+ lhs_relationshipName: relationshipName,
+ lhs_relationshipMeta: relationshipMeta,
+ lhs_isPolymorphic: selfIsPolymorphic,
+ rhs_key: `${inverseBaseModelName}:${inverseRelationshipName}`,
+ rhs_modelNames: [],
+ rhs_baseModelName: inverseBaseModelName,
+ rhs_relationshipName: inverseRelationshipName,
+ rhs_relationshipMeta: inverseRelationshipMeta,
+ rhs_isPolymorphic: inverseRelationshipMeta.options !== undefined && inverseRelationshipMeta.options.polymorphic === true,
+ hasInverse: true,
+ isSelfReferential,
+ isReflexive: isSelfReferential && relationshipName === inverseRelationshipName
+ };
+
+ // Create entries for the baseModelName as well as modelName to speed up
+ // inverse lookups
+ inverseCache.set(baseModelName, relationshipName, info);
+ inverseCache.set(modelName, relationshipName, info);
+
+ // Greedily populate the inverse
+ inverseCache.set(inverseBaseModelName, inverseRelationshipName, info);
+
+ return info;
+ }
+
+ /**
+ Create the `RelationshipsPayload` for the relationship `modelName`, `relationshipName`, and its inverse.
+ @private
+ @method
+ */
+ _initializeRelationshipPayloads(relInfo) {
+ var lhsKey = relInfo.lhs_key;
+ var rhsKey = relInfo.rhs_key;
+ var existingPayloads = this._cache[lhsKey];
+
+ if (relInfo.hasInverse === true && relInfo.rhs_isPolymorphic === true) {
+ existingPayloads = this._cache[rhsKey];
+
+ if (existingPayloads !== undefined) {
+ this._cache[lhsKey] = existingPayloads;
+ return existingPayloads;
+ }
+ }
+
+ // populate the cache for both sides of the relationship, as they both use
+ // the same `RelationshipPayloads`.
+ //
+ // This works out better than creating a single common key, because to
+ // compute that key we would need to do work to look up the inverse
+ //
+ var cache = this._cache[lhsKey] = new RelationshipPayloads(relInfo);
+
+ if (relInfo.hasInverse === true) {
+ this._cache[rhsKey] = cache;
+ }
+
+ return cache;
+ }
+}
+
+function payloadIsNotBlank(adapterPayload) {
+ if (Array.isArray(adapterPayload)) {
+ return true;
+ } else {
+ return Object.keys(adapterPayload || {}).length;
+ }
+}
+
+function _find(adapter, store, modelClass, id, internalModel, options) {
+ var snapshot = internalModel.createSnapshot(options);
+ var { modelName } = internalModel;
+ var promise = adapter.findRecord(store, modelClass, id, snapshot);
+ var label = `DS: Handle Adapter#findRecord of '${modelName}' with id: '${id}'`;
+
+ promise = Ember.RSVP.Promise.resolve(promise, label);
+ promise = _guard(promise, _bind(_objectIsAlive, store));
+
+ return promise.then(adapterPayload => {
+ (true && !(payloadIsNotBlank(adapterPayload)) && Ember.assert(`You made a 'findRecord' request for a '${modelName}' with id '${id}', but the adapter's response did not have any data`, payloadIsNotBlank(adapterPayload)));
+
+ var serializer = serializerForAdapter(store, adapter, modelName);
+ var payload = normalizeResponseHelper(serializer, store, modelClass, adapterPayload, id, 'findRecord');
+ (true && !(!Array.isArray(payload.data)) && Ember.assert(`Ember Data expected the primary data returned from a 'findRecord' response to be an object but instead it found an array.`, !Array.isArray(payload.data)));
+ (true && Ember.warn(`You requested a record of type '${modelName}' with id '${id}' but the adapter returned a payload with primary data having an id of '${payload.data.id}'. Use 'store.findRecord()' when the requested id is the same as the one returned by the adapter. In other cases use 'store.queryRecord()' instead https://emberjs.com/api/data/classes/DS.Store.html#method_queryRecord`, payload.data.id === id, {
+ id: 'ds.store.findRecord.id-mismatch'
+ }));
+
+
+ return store._push(payload);
+ }, error => {
+ internalModel.notFound();
+ if (internalModel.isEmpty()) {
+ internalModel.unloadRecord();
+ }
+
+ throw error;
+ }, `DS: Extract payload of '${modelName}'`);
+}
+
+function _findMany(adapter, store, modelName, ids, internalModels) {
+ var snapshots = Ember.A(internalModels).invoke('createSnapshot');
+ var modelClass = store.modelFor(modelName); // `adapter.findMany` gets the modelClass still
+ var promise = adapter.findMany(store, modelClass, ids, snapshots);
+ var label = `DS: Handle Adapter#findMany of '${modelName}'`;
+
+ if (promise === undefined) {
+ throw new Error('adapter.findMany returned undefined, this was very likely a mistake');
+ }
+
+ promise = Ember.RSVP.Promise.resolve(promise, label);
+ promise = _guard(promise, _bind(_objectIsAlive, store));
+
+ return promise.then(adapterPayload => {
+ (true && !(payloadIsNotBlank(adapterPayload)) && Ember.assert(`You made a 'findMany' request for '${modelName}' records with ids '[${ids}]', but the adapter's response did not have any data`, payloadIsNotBlank(adapterPayload)));
+
+ var serializer = serializerForAdapter(store, adapter, modelName);
+ var payload = normalizeResponseHelper(serializer, store, modelClass, adapterPayload, null, 'findMany');
+ return store._push(payload);
+ }, null, `DS: Extract payload of ${modelName}`);
+}
+
+function _findHasMany(adapter, store, internalModel, link, relationship) {
+ var snapshot = internalModel.createSnapshot();
+ var modelClass = store.modelFor(relationship.type);
+ var promise = adapter.findHasMany(store, snapshot, link, relationship);
+ var label = `DS: Handle Adapter#findHasMany of '${internalModel.modelName}' : '${relationship.type}'`;
+
+ promise = Ember.RSVP.Promise.resolve(promise, label);
+ promise = _guard(promise, _bind(_objectIsAlive, store));
+ promise = _guard(promise, _bind(_objectIsAlive, internalModel));
+
+ return promise.then(adapterPayload => {
+ (true && !(payloadIsNotBlank(adapterPayload)) && Ember.assert(`You made a 'findHasMany' request for a ${internalModel.modelName}'s '${relationship.key}' relationship, using link '${link}' , but the adapter's response did not have any data`, payloadIsNotBlank(adapterPayload)));
+
+ var serializer = serializerForAdapter(store, adapter, relationship.type);
+ var payload = normalizeResponseHelper(serializer, store, modelClass, adapterPayload, null, 'findHasMany');
+ var internalModelArray = store._push(payload);
+
+ internalModelArray.meta = payload.meta;
+ return internalModelArray;
+ }, null, `DS: Extract payload of '${internalModel.modelName}' : hasMany '${relationship.type}'`);
+}
+
+function _findBelongsTo(adapter, store, internalModel, link, relationship) {
+ var snapshot = internalModel.createSnapshot();
+ var modelClass = store.modelFor(relationship.type);
+ var promise = adapter.findBelongsTo(store, snapshot, link, relationship);
+ var label = `DS: Handle Adapter#findBelongsTo of ${internalModel.modelName} : ${relationship.type}`;
+
+ promise = Ember.RSVP.Promise.resolve(promise, label);
+ promise = _guard(promise, _bind(_objectIsAlive, store));
+ promise = _guard(promise, _bind(_objectIsAlive, internalModel));
+
+ return promise.then(adapterPayload => {
+ var serializer = serializerForAdapter(store, adapter, relationship.type);
+ var payload = normalizeResponseHelper(serializer, store, modelClass, adapterPayload, null, 'findBelongsTo');
+
+ if (!payload.data) {
+ return null;
+ }
+
+ return store._push(payload);
+ }, null, `DS: Extract payload of ${internalModel.modelName} : ${relationship.type}`);
+}
+
+function _findAll(adapter, store, modelName, sinceToken, options) {
+ var modelClass = store.modelFor(modelName); // adapter.findAll depends on the class
+ var recordArray = store.peekAll(modelName);
+ var snapshotArray = recordArray._createSnapshot(options);
+ var promise = adapter.findAll(store, modelClass, sinceToken, snapshotArray);
+ var label = "DS: Handle Adapter#findAll of " + modelClass;
+
+ promise = Ember.RSVP.Promise.resolve(promise, label);
+ promise = _guard(promise, _bind(_objectIsAlive, store));
+
+ return promise.then(adapterPayload => {
+ (true && !(payloadIsNotBlank(adapterPayload)) && Ember.assert(`You made a 'findAll' request for '${modelName}' records, but the adapter's response did not have any data`, payloadIsNotBlank(adapterPayload)));
+
+ var serializer = serializerForAdapter(store, adapter, modelName);
+ var payload = normalizeResponseHelper(serializer, store, modelClass, adapterPayload, null, 'findAll');
+
+ store._push(payload);
+ store._didUpdateAll(modelName);
+
+ return recordArray;
+ }, null, 'DS: Extract payload of findAll ${modelName}');
+}
+
+function _query(adapter, store, modelName, query, recordArray) {
+ var modelClass = store.modelFor(modelName); // adapter.query needs the class
+
+ var promise = void 0;
+ if (adapter.query.length > 3) {
+ recordArray = recordArray || store.recordArrayManager.createAdapterPopulatedRecordArray(modelName, query);
+ promise = adapter.query(store, modelClass, query, recordArray);
+ } else {
+ promise = adapter.query(store, modelClass, query);
+ }
+
+ var label = `DS: Handle Adapter#query of ${modelClass}`;
+
+ promise = Ember.RSVP.Promise.resolve(promise, label);
+ promise = _guard(promise, _bind(_objectIsAlive, store));
+
+ return promise.then(adapterPayload => {
+ var serializer = serializerForAdapter(store, adapter, modelName);
+
+ var payload = normalizeResponseHelper(serializer, store, modelClass, adapterPayload, null, 'query');
+
+ var internalModels = store._push(payload);
+
+ (true && !(Array.isArray(internalModels)) && Ember.assert('The response to store.query is expected to be an array but it was a single record. Please wrap your response in an array or use `store.queryRecord` to query for a single record.', Array.isArray(internalModels)));
+
+ if (recordArray) {
+ recordArray._setInternalModels(internalModels, payload);
+ } else {
+ recordArray = store.recordArrayManager.createAdapterPopulatedRecordArray(modelName, query, internalModels, payload);
+ }
+
+ return recordArray;
+ }, null, `DS: Extract payload of query ${modelName}`);
+}
+
+function _queryRecord(adapter, store, modelName, query) {
+ var modelClass = store.modelFor(modelName); // adapter.queryRecord needs the class
+ var promise = adapter.queryRecord(store, modelClass, query);
+ var label = `DS: Handle Adapter#queryRecord of ${modelName}`;
+
+ promise = Ember.RSVP.Promise.resolve(promise, label);
+ promise = _guard(promise, _bind(_objectIsAlive, store));
+
+ return promise.then(adapterPayload => {
+ var serializer = serializerForAdapter(store, adapter, modelName);
+ var payload = normalizeResponseHelper(serializer, store, modelClass, adapterPayload, null, 'queryRecord');
+
+ (true && !(!Array.isArray(payload.data)) && Ember.assert(`Expected the primary data returned by the serializer for a 'queryRecord' response to be a single object or null but instead it was an array.`, !Array.isArray(payload.data), {
+ id: 'ds.store.queryRecord-array-response'
+ }));
+
+
+ return store._push(payload);
+ }, null, `DS: Extract payload of queryRecord ${modelName}`);
+}
+
+// Used by the store to normalize IDs entering the store. Despite the fact
+// that developers may provide IDs as numbers (e.g., `store.findRecord('person', 1)`),
+// it is important that internally we use strings, since IDs may be serialized
+// and lose type information. For example, Ember's router may put a record's
+// ID into the URL, and if we later try to deserialize that URL and find the
+// corresponding record, we will not know if it is a string or a number.
+function coerceId(id) {
+ if (id === null || id === undefined || id === '') {
+ return null;
+ }
+ if (typeof id === 'string') {
+ return id;
+ }
+ return '' + id;
+}
+
+/**
+ @module ember-data
+*/
+
+/**
+ @class SnapshotRecordArray
+ @namespace DS
+ @private
+ @constructor
+ @param {Array} snapshots An array of snapshots
+ @param {Object} meta
+*/
+class SnapshotRecordArray {
+ constructor(recordArray, meta, options = {}) {
+ /**
+ An array of snapshots
+ @private
+ @property _snapshots
+ @type {Array}
+ */
+ this._snapshots = null;
+
+ /**
+ An array of records
+ @private
+ @property _recordArray
+ @type {Array}
+ */
+ this._recordArray = recordArray;
+
+ /**
+ Number of records in the array
+ Example
+ ```app/adapters/post.js
+ import DS from 'ember-data'
+ export default DS.JSONAPIAdapter.extend({
+ shouldReloadAll(store, snapshotRecordArray) {
+ return !snapshotRecordArray.length;
+ },
+ });
+ ```
+ @property length
+ @type {Number}
+ */
+ this.length = recordArray.get('length');
+
+ this._type = null;
+
+ /**
+ Meta objects for the record array.
+ Example
+ ```app/adapters/post.js
+ import DS from 'ember-data'
+ export default DS.JSONAPIAdapter.extend({
+ shouldReloadAll(store, snapshotRecordArray) {
+ var lastRequestTime = snapshotRecordArray.meta.lastRequestTime;
+ var twentyMinutes = 20 * 60 * 1000;
+ return Date.now() > lastRequestTime + twentyMinutes;
+ },
+ });
+ ```
+ @property meta
+ @type {Object}
+ */
+ this.meta = meta;
+
+ /**
+ A hash of adapter options passed into the store method for this request.
+ Example
+ ```app/adapters/post.js
+ import MyCustomAdapter from './custom-adapter';
+ export default MyCustomAdapter.extend({
+ findAll(store, type, sinceToken, snapshotRecordArray) {
+ if (snapshotRecordArray.adapterOptions.subscribe) {
+ // ...
+ }
+ // ...
+ }
+ });
+ ```
+ @property adapterOptions
+ @type {Object}
+ */
+ this.adapterOptions = options.adapterOptions;
+
+ /**
+ The relationships to include for this request.
+ Example
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ export default DS.Adapter.extend({
+ findAll(store, type, snapshotRecordArray) {
+ var url = `/${type.modelName}?include=${encodeURIComponent(snapshotRecordArray.include)}`;
+ return fetch(url).then((response) => response.json())
+ }
+ });
+ @property include
+ @type {String|Array}
+ */
+ this.include = options.include;
+ }
+
+ /**
+ The type of the underlying records for the snapshots in the array, as a DS.Model
+ @property type
+ @type {DS.Model}
+ */
+ get type() {
+ return this._type || (this._type = this._recordArray.get('type'));
+ }
+
+ /**
+ Get snapshots of the underlying record array
+ Example
+ ```app/adapters/post.js
+ import DS from 'ember-data'
+ export default DS.JSONAPIAdapter.extend({
+ shouldReloadAll(store, snapshotArray) {
+ var snapshots = snapshotArray.snapshots();
+ return snapshots.any(function(ticketSnapshot) {
+ var timeDiff = moment().diff(ticketSnapshot.attr('lastAccessedAt'), 'minutes');
+ if (timeDiff > 20) {
+ return true;
+ } else {
+ return false;
+ }
+ });
+ }
+ });
+ ```
+ @method snapshots
+ @return {Array} Array of snapshots
+ */
+ snapshots() {
+ if (this._snapshots !== null) {
+ return this._snapshots;
+ }
+
+ this._snapshots = this._recordArray._takeSnapshot();
+
+ return this._snapshots;
+ }
+}
+
+/**
+ @module ember-data
+*/
+
+/**
+ A record array is an array that contains records of a certain modelName. The record
+ array materializes records as needed when they are retrieved for the first
+ time. You should not create record arrays yourself. Instead, an instance of
+ `DS.RecordArray` or its subclasses will be returned by your application's store
+ in response to queries.
+
+ @class RecordArray
+ @namespace DS
+ @extends Ember.ArrayProxy
+ @uses Ember.Evented
+*/
+
+var RecordArray = Ember.ArrayProxy.extend(Ember.Evented, {
+ init() {
+ this._super(...arguments);
+
+ /**
+ The array of client ids backing the record array. When a
+ record is requested from the record array, the record
+ for the client id at the same index is materialized, if
+ necessary, by the store.
+ @property content
+ @private
+ @type Ember.Array
+ */
+ this.set('content', this.content || null);
+
+ /**
+ The flag to signal a `RecordArray` is finished loading data.
+ Example
+ ```javascript
+ var people = store.peekAll('person');
+ people.get('isLoaded'); // true
+ ```
+ @property isLoaded
+ @type Boolean
+ */
+ this.isLoaded = this.isLoaded || false;
+ /**
+ The flag to signal a `RecordArray` is currently loading data.
+ Example
+ ```javascript
+ var people = store.peekAll('person');
+ people.get('isUpdating'); // false
+ people.update();
+ people.get('isUpdating'); // true
+ ```
+ @property isUpdating
+ @type Boolean
+ */
+ this.isUpdating = false;
+
+ /**
+ The store that created this record array.
+ @property store
+ @private
+ @type DS.Store
+ */
+ this.store = this.store || null;
+ this._updatingPromise = null;
+ },
+
+ replace() {
+ throw new Error(`The result of a server query (for all ${this.modelName} types) is immutable. To modify contents, use toArray()`);
+ },
+
+ /**
+ The modelClass represented by this record array.
+ @property type
+ @type DS.Model
+ */
+ type: Ember.computed('modelName', function () {
+ if (!this.modelName) {
+ return null;
+ }
+ return this.store._modelFor(this.modelName);
+ }).readOnly(),
+
+ /**
+ Retrieves an object from the content by index.
+ @method objectAtContent
+ @private
+ @param {Number} index
+ @return {DS.Model} record
+ */
+ objectAtContent(index) {
+ var internalModel = Ember.get(this, 'content').objectAt(index);
+ return internalModel && internalModel.getRecord();
+ },
+
+ /**
+ Used to get the latest version of all of the records in this array
+ from the adapter.
+ Example
+ ```javascript
+ var people = store.peekAll('person');
+ people.get('isUpdating'); // false
+ people.update().then(function() {
+ people.get('isUpdating'); // false
+ });
+ people.get('isUpdating'); // true
+ ```
+ @method update
+ */
+ update() {
+ if (Ember.get(this, 'isUpdating')) {
+ return this._updatingPromise;
+ }
+
+ this.set('isUpdating', true);
+
+ var updatingPromise = this._update().finally(() => {
+ this._updatingPromise = null;
+ if (this.get('isDestroying') || this.get('isDestroyed')) {
+ return;
+ }
+ this.set('isUpdating', false);
+ });
+
+ this._updatingPromise = updatingPromise;
+
+ return updatingPromise;
+ },
+
+ /*
+ Update this RecordArray and return a promise which resolves once the update
+ is finished.
+ */
+ _update() {
+ return this.store.findAll(this.modelName, { reload: true });
+ },
+
+ /**
+ Adds an internal model to the `RecordArray` without duplicates
+ @method _pushInternalModels
+ @private
+ @param {InternalModel} internalModel
+ */
+ _pushInternalModels(internalModels) {
+ // pushObjects because the internalModels._recordArrays set was already
+ // consulted for inclusion, so addObject and its on .contains call is not
+ // required.
+ Ember.get(this, 'content').pushObjects(internalModels);
+ },
+
+ /**
+ Removes an internalModel to the `RecordArray`.
+ @method removeInternalModel
+ @private
+ @param {InternalModel} internalModel
+ */
+ _removeInternalModels(internalModels) {
+ Ember.get(this, 'content').removeObjects(internalModels);
+ },
+
+ /**
+ Saves all of the records in the `RecordArray`.
+ Example
+ ```javascript
+ var messages = store.peekAll('message');
+ messages.forEach(function(message) {
+ message.set('hasBeenSeen', true);
+ });
+ messages.save();
+ ```
+ @method save
+ @return {DS.PromiseArray} promise
+ */
+ save() {
+ var promiseLabel = `DS: RecordArray#save ${this.modelName}`;
+ var promise = Ember.RSVP.Promise.all(this.invoke('save'), promiseLabel).then(() => this, null, 'DS: RecordArray#save return RecordArray');
+
+ return PromiseArray.create({ promise });
+ },
+
+ _dissociateFromOwnRecords() {
+ this.get('content').forEach(internalModel => {
+ var recordArrays = internalModel.__recordArrays;
+
+ if (recordArrays) {
+ recordArrays.delete(this);
+ }
+ });
+ },
+
+ /**
+ @method _unregisterFromManager
+ @private
+ */
+ _unregisterFromManager() {
+ this.manager.unregisterRecordArray(this);
+ },
+
+ willDestroy() {
+ this._unregisterFromManager();
+ this._dissociateFromOwnRecords();
+ // TODO: we should not do work during destroy:
+ // * when objects are destroyed, they should simply be left to do
+ // * if logic errors do to this, that logic needs to be more careful during
+ // teardown (ember provides isDestroying/isDestroyed) for this reason
+ // * the exception being: if an dominator has a reference to this object,
+ // and must be informed to release e.g. e.g. removing itself from th
+ // recordArrayMananger
+ Ember.set(this, 'content', null);
+ Ember.set(this, 'length', 0);
+ this._super(...arguments);
+ },
+
+ /*
+ @method _createSnapshot
+ @private
+ */
+ _createSnapshot(options) {
+ // this is private for users, but public for ember-data internals
+ return new SnapshotRecordArray(this, this.get('meta'), options);
+ },
+
+ /*
+ @method _takeSnapshot
+ @private
+ */
+ _takeSnapshot() {
+ return Ember.get(this, 'content').map(internalModel => internalModel.createSnapshot());
+ }
+});
+
+/**
+ Represents a list of records whose membership is determined by the
+ store. As records are created, loaded, or modified, the store
+ evaluates them to determine if they should be part of the record
+ array.
+
+ @class FilteredRecordArray
+ @namespace DS
+ @extends DS.RecordArray
+*/
+var FilteredRecordArray = RecordArray.extend({
+ init() {
+ this._super(...arguments);
+
+ this.set('filterFunction', this.get('filterFunction') || null);
+ this.isLoaded = true;
+ },
+ /**
+ The filterFunction is a function used to test records from the store to
+ determine if they should be part of the record array.
+ Example
+ ```javascript
+ var allPeople = store.peekAll('person');
+ allPeople.mapBy('name'); // ["Tom Dale", "Yehuda Katz", "Trek Glowacki"]
+ var people = store.filter('person', function(person) {
+ if (person.get('name').match(/Katz$/)) { return true; }
+ });
+ people.mapBy('name'); // ["Yehuda Katz"]
+ var notKatzFilter = function(person) {
+ return !person.get('name').match(/Katz$/);
+ };
+ people.set('filterFunction', notKatzFilter);
+ people.mapBy('name'); // ["Tom Dale", "Trek Glowacki"]
+ ```
+ @method filterFunction
+ @param {DS.Model} record
+ @return {Boolean} `true` if the record should be in the array
+ */
+
+ replace() {
+ throw new Error(`The result of a client-side filter (on ${this.modelName}) is immutable.`);
+ },
+
+ /**
+ @method updateFilter
+ @private
+ */
+ _updateFilter() {
+ if (Ember.get(this, 'isDestroying') || Ember.get(this, 'isDestroyed')) {
+ return;
+ }
+ Ember.get(this, 'manager').updateFilter(this, this.modelName, Ember.get(this, 'filterFunction'));
+ },
+
+ updateFilter: Ember.observer('filterFunction', function () {
+ Ember.run.once(this, this._updateFilter);
+ })
+});
+
+function cloneNull(source) {
+ var clone = Object.create(null);
+ for (var key in source) {
+ clone[key] = source[key];
+ }
+ return clone;
+}
+
+/**
+ Represents an ordered list of records whose order and membership is
+ determined by the adapter. For example, a query sent to the adapter
+ may trigger a search on the server, whose results would be loaded
+ into an instance of the `AdapterPopulatedRecordArray`.
+
+ ---
+
+ If you want to update the array and get the latest records from the
+ adapter, you can invoke [`update()`](#method_update):
+
+ Example
+
+ ```javascript
+ // GET /users?isAdmin=true
+ var admins = store.query('user', { isAdmin: true });
+
+ admins.then(function() {
+ console.log(admins.get("length")); // 42
+ });
+
+ // somewhere later in the app code, when new admins have been created
+ // in the meantime
+ //
+ // GET /users?isAdmin=true
+ admins.update().then(function() {
+ admins.get('isUpdating'); // false
+ console.log(admins.get("length")); // 123
+ });
+
+ admins.get('isUpdating'); // true
+ ```
+
+ @class AdapterPopulatedRecordArray
+ @namespace DS
+ @extends DS.RecordArray
+*/
+var AdapterPopulatedRecordArray = RecordArray.extend({
+ init() {
+ // yes we are touching `this` before super, but ArrayProxy has a bug that requires this.
+ this.set('content', this.get('content') || Ember.A());
+
+ this._super(...arguments);
+ this.query = this.query || null;
+ this.links = this.links || null;
+ },
+
+ replace() {
+ throw new Error(`The result of a server query (on ${this.modelName}) is immutable.`);
+ },
+
+ _update() {
+ var store = Ember.get(this, 'store');
+ var query = Ember.get(this, 'query');
+
+ return store._query(this.modelName, query, this);
+ },
+
+ /**
+ @method _setInternalModels
+ @param {Array} internalModels
+ @param {Object} payload normalized payload
+ @private
+ */
+ _setInternalModels(internalModels, payload) {
+
+ // TODO: initial load should not cause change events at all, only
+ // subsequent. This requires changing the public api of adapter.query, but
+ // hopefully we can do that soon.
+ this.get('content').setObjects(internalModels);
+
+ this.setProperties({
+ isLoaded: true,
+ isUpdating: false,
+ meta: cloneNull(payload.meta),
+ links: cloneNull(payload.links)
+ });
+
+ associateWithRecordArray(internalModels, this);
+
+ // TODO: should triggering didLoad event be the last action of the runLoop?
+ Ember.run.once(this, 'trigger', 'didLoad');
+ }
+});
+
+/**
+ @module ember-data
+*/
+
+/**
+ @class RecordArrayManager
+ @namespace DS
+ @private
+*/
+class RecordArrayManager {
+ constructor(options) {
+ this.store = options.store;
+ this.isDestroying = false;
+ this.isDestroyed = false;
+ this._filteredRecordArrays = Object.create(null);
+ this._liveRecordArrays = Object.create(null);
+ this._pending = Object.create(null);
+ this._adapterPopulatedRecordArrays = [];
+ }
+
+ recordDidChange(internalModel) {
+ // TODO: change name
+ // TODO: track that it was also a change
+ this.internalModelDidChange(internalModel);
+ }
+
+ recordWasLoaded(internalModel) {
+ // TODO: change name
+ // TODO: track that it was also that it was first loaded
+ this.internalModelDidChange(internalModel);
+ }
+
+ internalModelDidChange(internalModel) {
+
+ var modelName = internalModel.modelName;
+
+ if (internalModel._pendingRecordArrayManagerFlush) {
+ return;
+ }
+
+ internalModel._pendingRecordArrayManagerFlush = true;
+
+ var pending = this._pending;
+ var models = pending[modelName] = pending[modelName] || [];
+ if (models.push(internalModel) !== 1) {
+ return;
+ }
+
+ Ember.run.schedule('actions', this, this._flush);
+ }
+
+ _flush() {
+
+ var pending = this._pending;
+ this._pending = Object.create(null);
+ var modelsToRemove = [];
+
+ for (var modelName in pending) {
+ var internalModels = pending[modelName];
+ for (var j = 0; j < internalModels.length; j++) {
+ var internalModel = internalModels[j];
+ // mark internalModels, so they can once again be processed by the
+ // recordArrayManager
+ internalModel._pendingRecordArrayManagerFlush = false;
+ // build up a set of models to ensure we have purged correctly;
+ if (internalModel.isHiddenFromRecordArrays()) {
+ modelsToRemove.push(internalModel);
+ }
+ }
+
+ // process filteredRecordArrays
+ if (this._filteredRecordArrays[modelName]) {
+ var recordArrays = this.filteredRecordArraysFor(modelName);
+ for (var i = 0; i < recordArrays.length; i++) {
+ this.updateFilterRecordArray(recordArrays[i], modelName, internalModels);
+ }
+ }
+
+ var array = this._liveRecordArrays[modelName];
+ if (array) {
+ // TODO: skip if it only changed
+ // process liveRecordArrays
+ this.updateLiveRecordArray(array, internalModels);
+ }
+
+ // process adapterPopulatedRecordArrays
+ if (modelsToRemove.length > 0) {
+ removeFromAdapterPopulatedRecordArrays(modelsToRemove);
+ }
+ }
+ }
+
+ updateLiveRecordArray(array, internalModels) {
+ return updateLiveRecordArray(array, internalModels);
+ }
+
+ /**
+ Update an individual filter.
+ @private
+ @method updateFilterRecordArray
+ @param {DS.FilteredRecordArray} array
+ @param {String} modelName
+ @param {Array} internalModels
+ */
+ updateFilterRecordArray(array, modelName, internalModels) {
+
+ var filter = Ember.get(array, 'filterFunction');
+
+ var shouldBeInAdded = [];
+ var shouldBeRemoved = [];
+
+ for (var i = 0; i < internalModels.length; i++) {
+ var internalModel = internalModels[i];
+ if (internalModel.isHiddenFromRecordArrays() === false && filter(internalModel.getRecord())) {
+ if (internalModel._recordArrays.has(array)) {
+ continue;
+ }
+ shouldBeInAdded.push(internalModel);
+ internalModel._recordArrays.add(array);
+ } else {
+ if (internalModel._recordArrays.delete(array)) {
+ shouldBeRemoved.push(internalModel);
+ }
+ }
+ }
+
+ if (shouldBeInAdded.length > 0) {
+ array._pushInternalModels(shouldBeInAdded);
+ }
+ if (shouldBeRemoved.length > 0) {
+ array._removeInternalModels(shouldBeRemoved);
+ }
+ }
+
+ // TODO: remove, utilize existing flush code but make it flush sync based on 1 modelName
+ _syncLiveRecordArray(array, modelName) {
+ (true && !(typeof modelName === 'string') && Ember.assert(`recordArrayManger.syncLiveRecordArray expects modelName not modelClass as the second param`, typeof modelName === 'string'));
+
+ var hasNoPotentialDeletions = Object.keys(this._pending).length === 0;
+ var map = this.store._internalModelsFor(modelName);
+ var hasNoInsertionsOrRemovals = Ember.get(map, 'length') === Ember.get(array, 'length');
+
+ /*
+ Ideally the recordArrayManager has knowledge of the changes to be applied to
+ liveRecordArrays, and is capable of strategically flushing those changes and applying
+ small diffs if desired. However, until we've refactored recordArrayManager, this dirty
+ check prevents us from unnecessarily wiping out live record arrays returned by peekAll.
+ */
+ if (hasNoPotentialDeletions && hasNoInsertionsOrRemovals) {
+ return;
+ }
+
+ var internalModels = this._visibleInternalModelsByType(modelName);
+ var modelsToAdd = [];
+ for (var i = 0; i < internalModels.length; i++) {
+ var internalModel = internalModels[i];
+ var recordArrays = internalModel._recordArrays;
+ if (recordArrays.has(array) === false) {
+ recordArrays.add(array);
+ modelsToAdd.push(internalModel);
+ }
+ }
+
+ array._pushInternalModels(modelsToAdd);
+ }
+
+ /**
+ This method is invoked if the `filterFunction` property is
+ changed on a `DS.FilteredRecordArray`.
+ It essentially re-runs the filter from scratch. This same
+ method is invoked when the filter is created in th first place.
+ @method updateFilter
+ @param {Array} array
+ @param {String} modelName
+ @param {Function} filter
+ */
+ updateFilter(array, modelName, filter) {
+ (true && !(typeof modelName === 'string') && Ember.assert(`recordArrayManger.updateFilter expects modelName not modelClass as the second param, received ${modelName}`, typeof modelName === 'string'));
+
+ var modelMap = this.store._internalModelsFor(modelName);
+ var internalModels = modelMap.models;
+
+ this.updateFilterRecordArray(array, filter, internalModels);
+ }
+
+ _didUpdateAll(modelName) {
+ var recordArray = this._liveRecordArrays[modelName];
+ if (recordArray) {
+ Ember.set(recordArray, 'isUpdating', false);
+ }
+ }
+
+ /**
+ Get the `DS.RecordArray` for a modelName, which contains all loaded records of
+ given modelName.
+ @method liveRecordArrayFor
+ @param {String} modelName
+ @return {DS.RecordArray}
+ */
+ liveRecordArrayFor(modelName) {
+ (true && !(typeof modelName === 'string') && Ember.assert(`recordArrayManger.liveRecordArrayFor expects modelName not modelClass as the param`, typeof modelName === 'string'));
+
+
+ var array = this._liveRecordArrays[modelName];
+
+ if (array) {
+ // if the array already exists, synchronize
+ this._syncLiveRecordArray(array, modelName);
+ } else {
+ // if the array is being newly created merely create it with its initial
+ // content already set. This prevents unneeded change events.
+ var internalModels = this._visibleInternalModelsByType(modelName);
+ array = this.createRecordArray(modelName, internalModels);
+ this._liveRecordArrays[modelName] = array;
+ }
+
+ return array;
+ }
+
+ _visibleInternalModelsByType(modelName) {
+ var all = this.store._internalModelsFor(modelName)._models;
+ var visible = [];
+ for (var i = 0; i < all.length; i++) {
+ var model = all[i];
+ if (model.isHiddenFromRecordArrays() === false) {
+ visible.push(model);
+ }
+ }
+ return visible;
+ }
+ /**
+ Get the `DS.RecordArray` for a modelName, which contains all loaded records of
+ given modelName.
+ @method filteredRecordArraysFor
+ @param {String} modelName
+ @return {DS.RecordArray}
+ */
+ filteredRecordArraysFor(modelName) {
+ (true && !(typeof modelName === 'string') && Ember.assert(`recordArrayManger.filteredRecordArraysFor expects modelName not modelClass as the param`, typeof modelName === 'string'));
+
+
+ return this._filteredRecordArrays[modelName] || (this._filteredRecordArrays[modelName] = []);
+ }
+ /**
+ Create a `DS.RecordArray` for a modelName.
+ @method createRecordArray
+ @param {String} modelName
+ @param {Array} _content (optional|private)
+ @return {DS.RecordArray}
+ */
+ createRecordArray(modelName, content) {
+ (true && !(typeof modelName === 'string') && Ember.assert(`recordArrayManger.createRecordArray expects modelName not modelClass as the param`, typeof modelName === 'string'));
+
+
+ var array = RecordArray.create({
+ modelName,
+ content: Ember.A(content || []),
+ store: this.store,
+ isLoaded: true,
+ manager: this
+ });
+
+ if (Array.isArray(content)) {
+ associateWithRecordArray(content, array);
+ }
+
+ return array;
+ }
+
+ /**
+ Create a `DS.FilteredRecordArray` for a modelName and register it for updates.
+ @method createFilteredRecordArray
+ @param {String} modelName
+ @param {Function} filter
+ @param {Object} query (optional
+ @return {DS.FilteredRecordArray}
+ */
+ createFilteredRecordArray(modelName, filter, query) {
+ (true && !(typeof modelName === 'string') && Ember.assert(`recordArrayManger.createFilteredRecordArray expects modelName not modelClass as the first param, received ${modelName}`, typeof modelName === 'string'));
+
+ var array = FilteredRecordArray.create({
+ query,
+ modelName,
+ content: Ember.A(),
+ store: this.store,
+ manager: this,
+ filterFunction: filter
+ });
+
+ this.registerFilteredRecordArray(array, modelName, filter);
+
+ return array;
+ }
+
+ /**
+ Create a `DS.AdapterPopulatedRecordArray` for a modelName with given query.
+ @method createAdapterPopulatedRecordArray
+ @param {String} modelName
+ @param {Object} query
+ @return {DS.AdapterPopulatedRecordArray}
+ */
+ createAdapterPopulatedRecordArray(modelName, query, internalModels, payload) {
+ (true && !(typeof modelName === 'string') && Ember.assert(`recordArrayManger.createAdapterPopulatedRecordArray expects modelName not modelClass as the first param, received ${modelName}`, typeof modelName === 'string'));
+
+
+ var array = void 0;
+ if (Array.isArray(internalModels)) {
+ array = AdapterPopulatedRecordArray.create({
+ modelName,
+ query: query,
+ content: Ember.A(internalModels),
+ store: this.store,
+ manager: this,
+ isLoaded: true,
+ isUpdating: false,
+ meta: cloneNull(payload.meta),
+ links: cloneNull(payload.links)
+ });
+
+ associateWithRecordArray(internalModels, array);
+ } else {
+ array = AdapterPopulatedRecordArray.create({
+ modelName,
+ query: query,
+ content: Ember.A(),
+ store: this.store,
+ manager: this
+ });
+ }
+
+ this._adapterPopulatedRecordArrays.push(array);
+
+ return array;
+ }
+
+ /**
+ Register a RecordArray for a given modelName to be backed by
+ a filter function. This will cause the array to update
+ automatically when records of that modelName change attribute
+ values or states.
+ @method registerFilteredRecordArray
+ @param {DS.RecordArray} array
+ @param {String} modelName
+ @param {Function} filter
+ */
+ registerFilteredRecordArray(array, modelName, filter) {
+ (true && !(typeof modelName === 'string') && Ember.assert(`recordArrayManger.registerFilteredRecordArray expects modelName not modelClass as the second param, received ${modelName}`, typeof modelName === 'string'));
+
+
+ this.filteredRecordArraysFor(modelName).push(array);
+ this.updateFilter(array, modelName, filter);
+ }
+
+ /**
+ Unregister a RecordArray.
+ So manager will not update this array.
+ @method unregisterRecordArray
+ @param {DS.RecordArray} array
+ */
+ unregisterRecordArray(array) {
+
+ var modelName = array.modelName;
+
+ // unregister filtered record array
+ var recordArrays = this.filteredRecordArraysFor(modelName);
+ var removedFromFiltered = remove(recordArrays, array);
+
+ // remove from adapter populated record array
+ var removedFromAdapterPopulated = remove(this._adapterPopulatedRecordArrays, array);
+
+ if (!removedFromFiltered && !removedFromAdapterPopulated) {
+
+ var liveRecordArrayForType = this._liveRecordArrays[modelName];
+ // unregister live record array
+ if (liveRecordArrayForType) {
+ if (array === liveRecordArrayForType) {
+ delete this._liveRecordArrays[modelName];
+ }
+ }
+ }
+ }
+
+ willDestroy() {
+ Object.keys(this._filteredRecordArrays).forEach(modelName => flatten(this._filteredRecordArrays[modelName]).forEach(destroy));
+ Object.keys(this._liveRecordArrays).forEach(modelName => this._liveRecordArrays[modelName].destroy());
+ this._adapterPopulatedRecordArrays.forEach(destroy);
+ this.isDestroyed = true;
+ }
+
+ destroy() {
+ this.isDestroying = true;
+ Ember.run.schedule('actions', this, this.willDestroy);
+ }
+}
+
+function destroy(entry) {
+ entry.destroy();
+}
+
+function flatten(list) {
+ var length = list.length;
+ var result = [];
+
+ for (var i = 0; i < length; i++) {
+ result = result.concat(list[i]);
+ }
+
+ return result;
+}
+
+function remove(array, item) {
+ var index = array.indexOf(item);
+
+ if (index !== -1) {
+ array.splice(index, 1);
+ return true;
+ }
+
+ return false;
+}
+
+function updateLiveRecordArray(array, internalModels) {
+ var modelsToAdd = [];
+ var modelsToRemove = [];
+
+ for (var i = 0; i < internalModels.length; i++) {
+ var internalModel = internalModels[i];
+ var isDeleted = internalModel.isHiddenFromRecordArrays();
+ var recordArrays = internalModel._recordArrays;
+
+ if (!isDeleted && !internalModel.isEmpty()) {
+ if (!recordArrays.has(array)) {
+ modelsToAdd.push(internalModel);
+ recordArrays.add(array);
+ }
+ }
+
+ if (isDeleted) {
+ modelsToRemove.push(internalModel);
+ recordArrays.delete(array);
+ }
+ }
+
+ if (modelsToAdd.length > 0) {
+ array._pushInternalModels(modelsToAdd);
+ }
+ if (modelsToRemove.length > 0) {
+ array._removeInternalModels(modelsToRemove);
+ }
+}
+
+function removeFromAdapterPopulatedRecordArrays(internalModels) {
+ for (var i = 0; i < internalModels.length; i++) {
+ var internalModel = internalModels[i];
+ var list = internalModel._recordArrays.list;
+
+ for (var j = 0; j < list.length; j++) {
+ // TODO: group by arrays, so we can batch remove
+ list[j]._removeInternalModels([internalModel]);
+ }
+
+ internalModel._recordArrays.clear();
+ }
+}
+
+function associateWithRecordArray(internalModels, array) {
+ for (var i = 0, l = internalModels.length; i < l; i++) {
+ var internalModel = internalModels[i];
+ internalModel._recordArrays.add(array);
+ }
+}
+
+/**
+ @module ember-data
+*/
+
+var badIdFormatAssertion = '`id` passed to `findRecord()` has to be non-empty string or number';
+
+var {
+ _Backburner: Backburner,
+ ENV
+} = Ember;
+
+var { Promise } = Ember.RSVP;
+
+//Get the materialized model from the internalModel/promise that returns
+//an internal model and return it in a promiseObject. Useful for returning
+//from find methods
+function promiseRecord(internalModelPromise, label) {
+ var toReturn = internalModelPromise.then(internalModel => internalModel.getRecord());
+
+ return promiseObject(toReturn, label);
+}
+
+var Store = void 0;
+
+// Implementors Note:
+//
+// The variables in this file are consistently named according to the following
+// scheme:
+//
+// * +id+ means an identifier managed by an external source, provided inside
+// the data provided by that source. These are always coerced to be strings
+// before being used internally.
+// * +clientId+ means a transient numerical identifier generated at runtime by
+// the data store. It is important primarily because newly created objects may
+// not yet have an externally generated id.
+// * +internalModel+ means a record internalModel object, which holds metadata about a
+// record, even if it has not yet been fully materialized.
+// * +type+ means a DS.Model.
+
+/**
+ The store contains all of the data for records loaded from the server.
+ It is also responsible for creating instances of `DS.Model` that wrap
+ the individual data for a record, so that they can be bound to in your
+ Handlebars templates.
+
+ Define your application's store like this:
+
+ ```app/services/store.js
+ import DS from 'ember-data';
+
+ export default DS.Store.extend({
+ });
+ ```
+
+ Most Ember.js applications will only have a single `DS.Store` that is
+ automatically created by their `Ember.Application`.
+
+ You can retrieve models from the store in several ways. To retrieve a record
+ for a specific id, use `DS.Store`'s `findRecord()` method:
+
+ ```javascript
+ store.findRecord('person', 123).then(function (person) {
+ });
+ ```
+
+ By default, the store will talk to your backend using a standard
+ REST mechanism. You can customize how the store talks to your
+ backend by specifying a custom adapter:
+
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+
+ export default DS.Adapter.extend({
+ });
+ ```
+
+ You can learn more about writing a custom adapter by reading the `DS.Adapter`
+ documentation.
+
+ ### Store createRecord() vs. push() vs. pushPayload()
+
+ The store provides multiple ways to create new record objects. They have
+ some subtle differences in their use which are detailed below:
+
+ [createRecord](#method_createRecord) is used for creating new
+ records on the client side. This will return a new record in the
+ `created.uncommitted` state. In order to persist this record to the
+ backend you will need to call `record.save()`.
+
+ [push](#method_push) is used to notify Ember Data's store of new or
+ updated records that exist in the backend. This will return a record
+ in the `loaded.saved` state. The primary use-case for `store#push` is
+ to notify Ember Data about record updates (full or partial) that happen
+ outside of the normal adapter methods (for example
+ [SSE](http://dev.w3.org/html5/eventsource/) or [Web
+ Sockets](http://www.w3.org/TR/2009/WD-websockets-20091222/)).
+
+ [pushPayload](#method_pushPayload) is a convenience wrapper for
+ `store#push` that will deserialize payloads if the
+ Serializer implements a `pushPayload` method.
+
+ Note: When creating a new record using any of the above methods
+ Ember Data will update `DS.RecordArray`s such as those returned by
+ `store#peekAll()` or `store#findAll()`. This means any
+ data bindings or computed properties that depend on the RecordArray
+ will automatically be synced to include the new or updated record
+ values.
+
+ @class Store
+ @namespace DS
+ @extends Ember.Service
+*/
+Store = Ember.Service.extend({
+
+ /**
+ @method init
+ @private
+ */
+ init() {
+ this._super(...arguments);
+ this._backburner = new Backburner(['normalizeRelationships', 'syncRelationships', 'finished']);
+ // internal bookkeeping; not observable
+ this.recordArrayManager = new RecordArrayManager({ store: this });
+ this._identityMap = new IdentityMap();
+ this._pendingSave = [];
+ this._modelFactoryCache = Object.create(null);
+ this._relationshipsPayloads = new RelationshipPayloadsManager(this);
+
+ /*
+ Ember Data uses several specialized micro-queues for organizing
+ and coalescing similar async work.
+ These queues are currently controlled by a flush scheduled into
+ ember-data's custom backburner instance.
+ */
+ // used for coalescing record save requests
+ this._pendingSave = [];
+ // used for coalescing relationship updates
+ this._updatedRelationships = [];
+ // used for coalescing relationship setup needs
+ this._pushedInternalModels = [];
+ // used for coalescing internal model updates
+ this._updatedInternalModels = [];
+
+ // used to keep track of all the find requests that need to be coalesced
+ this._pendingFetch = Ember.MapWithDefault.create({ defaultValue() {
+ return [];
+ } });
+
+ this._adapterCache = Object.create(null);
+ this._serializerCache = Object.create(null);
+ },
+
+ /**
+ The default adapter to use to communicate to a backend server or
+ other persistence layer. This will be overridden by an application
+ adapter if present.
+ If you want to specify `app/adapters/custom.js` as a string, do:
+ ```js
+ import DS from 'ember-data';
+ export default DS.Store.extend({
+ adapter: 'custom',
+ });
+ ```
+ @property adapter
+ @default '-json-api'
+ @type {String}
+ */
+ adapter: '-json-api',
+
+ /**
+ Returns a JSON representation of the record using a custom
+ type-specific serializer, if one exists.
+ The available options are:
+ * `includeId`: `true` if the record's ID should be included in
+ the JSON representation
+ @method serialize
+ @private
+ @deprecated
+ @param {DS.Model} record the record to serialize
+ @param {Object} options an options hash
+ */
+ serialize(record, options) {
+ if (isEnabled('ds-deprecate-store-serialize')) {
+ (true && !(false) && Ember.deprecate('Use of store.serialize is deprecated, use record.serialize instead.', false, {
+ id: 'ds.store.serialize',
+ until: '3.0'
+ }));
+ }
+ var snapshot = record._internalModel.createSnapshot();
+ return snapshot.serialize(options);
+ },
+
+ /**
+ This property returns the adapter, after resolving a possible
+ string key.
+ If the supplied `adapter` was a class, or a String property
+ path resolved to a class, this property will instantiate the
+ class.
+ This property is cacheable, so the same instance of a specified
+ adapter class should be used for the lifetime of the store.
+ @property defaultAdapter
+ @private
+ @return DS.Adapter
+ */
+ defaultAdapter: Ember.computed('adapter', function () {
+ var adapter = Ember.get(this, 'adapter');
+
+ (true && !(typeof adapter === 'string') && Ember.assert('You tried to set `adapter` property to an instance of `DS.Adapter`, where it should be a name', typeof adapter === 'string'));
+
+
+ return this.adapterFor(adapter);
+ }),
+
+ // .....................
+ // . CREATE NEW RECORD .
+ // .....................
+
+ /**
+ Create a new record in the current store. The properties passed
+ to this method are set on the newly created record.
+ To create a new instance of a `Post`:
+ ```js
+ store.createRecord('post', {
+ title: 'Rails is omakase'
+ });
+ ```
+ To create a new instance of a `Post` that has a relationship with a `User` record:
+ ```js
+ let user = this.store.peekRecord('user', 1);
+ store.createRecord('post', {
+ title: 'Rails is omakase',
+ user: user
+ });
+ ```
+ @method createRecord
+ @param {String} modelName
+ @param {Object} inputProperties a hash of properties to set on the
+ newly created record.
+ @return {DS.Model} record
+ */
+ createRecord(modelName, inputProperties) {
+ (true && !(Ember.isPresent(modelName)) && Ember.assert(`You need to pass a model name to the store's createRecord method`, Ember.isPresent(modelName)));
+ (true && !(typeof modelName === 'string') && Ember.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));
+
+ var normalizedModelName = normalizeModelName(modelName);
+ var properties = Ember.copy(inputProperties) || Object.create(null);
+
+ // If the passed properties do not include a primary key,
+ // give the adapter an opportunity to generate one. Typically,
+ // client-side ID generators will use something like uuid.js
+ // to avoid conflicts.
+
+ if (Ember.isNone(properties.id)) {
+ properties.id = this._generateId(normalizedModelName, properties);
+ }
+
+ // Coerce ID to a string
+ properties.id = coerceId(properties.id);
+
+ var internalModel = this._buildInternalModel(normalizedModelName, properties.id);
+ internalModel.loadedData();
+ var record = internalModel.getRecord(properties);
+
+ // TODO @runspired this should also be coalesced into some form of internalModel.setState()
+ internalModel.eachRelationship((key, descriptor) => {
+ if (properties[key] !== undefined) {
+ internalModel._relationships.get(key).setHasData(true);
+ }
+ });
+
+ return record;
+ },
+
+ /**
+ If possible, this method asks the adapter to generate an ID for
+ a newly created record.
+ @method _generateId
+ @private
+ @param {String} modelName
+ @param {Object} properties from the new record
+ @return {String} if the adapter can generate one, an ID
+ */
+ _generateId(modelName, properties) {
+ var adapter = this.adapterFor(modelName);
+
+ if (adapter && adapter.generateIdForRecord) {
+ return adapter.generateIdForRecord(this, modelName, properties);
+ }
+
+ return null;
+ },
+
+ // .................
+ // . DELETE RECORD .
+ // .................
+
+ /**
+ For symmetry, a record can be deleted via the store.
+ Example
+ ```javascript
+ let post = store.createRecord('post', {
+ title: 'Rails is omakase'
+ });
+ store.deleteRecord(post);
+ ```
+ @method deleteRecord
+ @param {DS.Model} record
+ */
+ deleteRecord(record) {
+ record.deleteRecord();
+ },
+
+ /**
+ For symmetry, a record can be unloaded via the store.
+ This will cause the record to be destroyed and freed up for garbage collection.
+ Example
+ ```javascript
+ store.findRecord('post', 1).then(function(post) {
+ store.unloadRecord(post);
+ });
+ ```
+ @method unloadRecord
+ @param {DS.Model} record
+ */
+ unloadRecord(record) {
+ record.unloadRecord();
+ },
+
+ // ................
+ // . FIND RECORDS .
+ // ................
+
+ /**
+ @method find
+ @param {String} modelName
+ @param {String|Integer} id
+ @param {Object} options
+ @return {Promise} promise
+ @private
+ */
+ find(modelName, id, options) {
+ // The default `model` hook in Route calls `find(modelName, id)`,
+ // that's why we have to keep this method around even though `findRecord` is
+ // the public way to get a record by modelName and id.
+ (true && !(arguments.length !== 1) && Ember.assert(`Using store.find(type) has been removed. Use store.findAll(modelName) to retrieve all records for a given type.`, arguments.length !== 1));
+ (true && !(!options) && Ember.assert(`Calling store.find(modelName, id, { preload: preload }) is no longer supported. Use store.findRecord(modelName, id, { preload: preload }) instead.`, !options));
+ (true && !(arguments.length === 2) && Ember.assert(`You need to pass the model name and id to the store's find method`, arguments.length === 2));
+ (true && !(typeof id === 'string' || typeof id === 'number') && Ember.assert(`You cannot pass '${id}' as id to the store's find method`, typeof id === 'string' || typeof id === 'number'));
+ (true && !(typeof id !== 'object') && Ember.assert(`Calling store.find() with a query object is no longer supported. Use store.query() instead.`, typeof id !== 'object'));
+ (true && !(typeof modelName === 'string') && Ember.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));
+
+
+ var normalizedModelName = normalizeModelName(modelName);
+
+ return this.findRecord(normalizedModelName, id);
+ },
+
+ /**
+ This method returns a record for a given type and id combination.
+ The `findRecord` method will always resolve its promise with the same
+ object for a given type and `id`.
+ The `findRecord` method will always return a **promise** that will be
+ resolved with the record.
+ Example
+ ```app/routes/post.js
+ import Route from '@ember/routing/route';
+ export default Route.extend({
+ model(params) {
+ return this.store.findRecord('post', params.post_id);
+ }
+ });
+ ```
+ If the record is not yet available, the store will ask the adapter's `find`
+ method to find the necessary data. If the record is already present in the
+ store, it depends on the reload behavior _when_ the returned promise
+ resolves.
+ ### Preloading
+ You can optionally `preload` specific attributes and relationships that you know of
+ by passing them via the passed `options`.
+ For example, if your Ember route looks like `/posts/1/comments/2` and your API route
+ for the comment also looks like `/posts/1/comments/2` if you want to fetch the comment
+ without fetching the post you can pass in the post to the `findRecord` call:
+ ```javascript
+ store.findRecord('comment', 2, { preload: { post: 1 } });
+ ```
+ If you have access to the post model you can also pass the model itself:
+ ```javascript
+ store.findRecord('post', 1).then(function (myPostModel) {
+ store.findRecord('comment', 2, { post: myPostModel });
+ });
+ ```
+ ### Reloading
+ The reload behavior is configured either via the passed `options` hash or
+ the result of the adapter's `shouldReloadRecord`.
+ If `{ reload: true }` is passed or `adapter.shouldReloadRecord` evaluates
+ to `true`, then the returned promise resolves once the adapter returns
+ data, regardless if the requested record is already in the store:
+ ```js
+ store.push({
+ data: {
+ id: 1,
+ type: 'post',
+ revision: 1
+ }
+ });
+ // adapter#findRecord resolves with
+ // [
+ // {
+ // id: 1,
+ // type: 'post',
+ // revision: 2
+ // }
+ // ]
+ store.findRecord('post', 1, { reload: true }).then(function(post) {
+ post.get('revision'); // 2
+ });
+ ```
+ If no reload is indicated via the abovementioned ways, then the promise
+ immediately resolves with the cached version in the store.
+ ### Background Reloading
+ Optionally, if `adapter.shouldBackgroundReloadRecord` evaluates to `true`,
+ then a background reload is started, which updates the records' data, once
+ it is available:
+ ```js
+ // app/adapters/post.js
+ import ApplicationAdapter from "./application";
+ export default ApplicationAdapter.extend({
+ shouldReloadRecord(store, snapshot) {
+ return false;
+ },
+ shouldBackgroundReloadRecord(store, snapshot) {
+ return true;
+ }
+ });
+ // ...
+ store.push({
+ data: {
+ id: 1,
+ type: 'post',
+ revision: 1
+ }
+ });
+ let blogPost = store.findRecord('post', 1).then(function(post) {
+ post.get('revision'); // 1
+ });
+ // later, once adapter#findRecord resolved with
+ // [
+ // {
+ // id: 1,
+ // type: 'post',
+ // revision: 2
+ // }
+ // ]
+ blogPost.get('revision'); // 2
+ ```
+ If you would like to force or prevent background reloading, you can set a
+ boolean value for `backgroundReload` in the options object for
+ `findRecord`.
+ ```app/routes/post/edit.js
+ import Route from '@ember/routing/route';
+ export default Route.extend({
+ model(params) {
+ return this.store.findRecord('post', params.post_id, { backgroundReload: false });
+ }
+ });
+ ```
+ If you pass an object on the `adapterOptions` property of the options
+ argument it will be passed to you adapter via the snapshot
+ ```app/routes/post/edit.js
+ import Route from '@ember/routing/route';
+ export default Route.extend({
+ model(params) {
+ return this.store.findRecord('post', params.post_id, {
+ adapterOptions: { subscribe: false }
+ });
+ }
+ });
+ ```
+ ```app/adapters/post.js
+ import MyCustomAdapter from './custom-adapter';
+ export default MyCustomAdapter.extend({
+ findRecord(store, type, id, snapshot) {
+ if (snapshot.adapterOptions.subscribe) {
+ // ...
+ }
+ // ...
+ }
+ });
+ ```
+ See [peekRecord](#method_peekRecord) to get the cached version of a record.
+ ### Retrieving Related Model Records
+ If you use an adapter such as Ember's default
+ [`JSONAPIAdapter`](https://emberjs.com/api/data/classes/DS.JSONAPIAdapter.html)
+ that supports the [JSON API specification](http://jsonapi.org/) and if your server
+ endpoint supports the use of an
+ ['include' query parameter](http://jsonapi.org/format/#fetching-includes),
+ you can use `findRecord()` to automatically retrieve additional records related to
+ the one you request by supplying an `include` parameter in the `options` object.
+ For example, given a `post` model that has a `hasMany` relationship with a `comment`
+ model, when we retrieve a specific post we can have the server also return that post's
+ comments in the same request:
+ ```app/routes/post.js
+ import Route from '@ember/routing/route';
+ export default Route.extend({
+ model(params) {
+ return this.store.findRecord('post', params.post_id, { include: 'comments' });
+ }
+ });
+ ```
+ In this case, the post's comments would then be available in your template as
+ `model.comments`.
+ Multiple relationships can be requested using an `include` parameter consisting of a
+ comma-separated list (without white-space) while nested relationships can be specified
+ using a dot-separated sequence of relationship names. So to request both the post's
+ comments and the authors of those comments the request would look like this:
+ ```app/routes/post.js
+ import Route from '@ember/routing/route';
+ export default Route.extend({
+ model(params) {
+ return this.store.findRecord('post', params.post_id, { include: 'comments,comments.author' });
+ }
+ });
+ ```
+ @since 1.13.0
+ @method findRecord
+ @param {String} modelName
+ @param {(String|Integer)} id
+ @param {Object} options
+ @return {Promise} promise
+ */
+ findRecord(modelName, id, options) {
+ (true && !(Ember.isPresent(modelName)) && Ember.assert(`You need to pass a model name to the store's findRecord method`, Ember.isPresent(modelName)));
+ (true && !(typeof modelName === 'string') && Ember.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));
+ (true && !(typeof id === 'string' && id.length > 0 || typeof id === 'number' && !isNaN(id)) && Ember.assert(badIdFormatAssertion, typeof id === 'string' && id.length > 0 || typeof id === 'number' && !isNaN(id)));
+
+
+ var normalizedModelName = normalizeModelName(modelName);
+
+ var internalModel = this._internalModelForId(normalizedModelName, id);
+ options = options || {};
+
+ if (!this.hasRecordForId(normalizedModelName, id)) {
+ return this._findByInternalModel(internalModel, options);
+ }
+
+ var fetchedInternalModel = this._findRecord(internalModel, options);
+
+ return promiseRecord(fetchedInternalModel, `DS: Store#findRecord ${normalizedModelName} with id: ${id}`);
+ },
+
+ _findRecord(internalModel, options) {
+ // Refetch if the reload option is passed
+ if (options.reload) {
+ return this._scheduleFetch(internalModel, options);
+ }
+
+ var snapshot = internalModel.createSnapshot(options);
+ var adapter = this.adapterFor(internalModel.modelName);
+
+ // Refetch the record if the adapter thinks the record is stale
+ if (adapter.shouldReloadRecord(this, snapshot)) {
+ return this._scheduleFetch(internalModel, options);
+ }
+
+ if (options.backgroundReload === false) {
+ return Promise.resolve(internalModel);
+ }
+
+ // Trigger the background refetch if backgroundReload option is passed
+ if (options.backgroundReload || adapter.shouldBackgroundReloadRecord(this, snapshot)) {
+ this._scheduleFetch(internalModel, options);
+ }
+
+ // Return the cached record
+ return Promise.resolve(internalModel);
+ },
+
+ _findByInternalModel(internalModel, options = {}) {
+ if (options.preload) {
+ internalModel.preloadData(options.preload);
+ }
+
+ var fetchedInternalModel = this._findEmptyInternalModel(internalModel, options);
+
+ return promiseRecord(fetchedInternalModel, `DS: Store#findRecord ${internalModel.modelName} with id: ${internalModel.id}`);
+ },
+
+ _findEmptyInternalModel(internalModel, options) {
+ if (internalModel.isEmpty()) {
+ return this._scheduleFetch(internalModel, options);
+ }
+
+ //TODO double check about reloading
+ if (internalModel.isLoading()) {
+ return internalModel._loadingPromise;
+ }
+
+ return Promise.resolve(internalModel);
+ },
+
+ /**
+ This method makes a series of requests to the adapter's `find` method
+ and returns a promise that resolves once they are all loaded.
+ @private
+ @method findByIds
+ @param {String} modelName
+ @param {Array} ids
+ @return {Promise} promise
+ */
+ findByIds(modelName, ids) {
+ (true && !(Ember.isPresent(modelName)) && Ember.assert(`You need to pass a model name to the store's findByIds method`, Ember.isPresent(modelName)));
+ (true && !(typeof modelName === 'string') && Ember.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));
+
+
+ var promises = new Array(ids.length);
+
+ var normalizedModelName = normalizeModelName(modelName);
+
+ for (var i = 0; i < ids.length; i++) {
+ promises[i] = this.findRecord(normalizedModelName, ids[i]);
+ }
+
+ return promiseArray(Ember.RSVP.all(promises).then(Ember.A, null, `DS: Store#findByIds of ${normalizedModelName} complete`));
+ },
+
+ /**
+ This method is called by `findRecord` if it discovers that a particular
+ type/id pair hasn't been loaded yet to kick off a request to the
+ adapter.
+ @method _fetchRecord
+ @private
+ @param {InternalModel} internalModel model
+ @return {Promise} promise
+ */
+ _fetchRecord(internalModel, options) {
+ var modelName = internalModel.modelName;
+ var adapter = this.adapterFor(modelName);
+
+ (true && !(adapter) && Ember.assert(`You tried to find a record but you have no adapter (for ${modelName})`, adapter));
+ (true && !(typeof adapter.findRecord === 'function') && Ember.assert(`You tried to find a record but your adapter (for ${modelName}) does not implement 'findRecord'`, typeof adapter.findRecord === 'function'));
+
+
+ return _find(adapter, this, internalModel.type, internalModel.id, internalModel, options);
+ },
+
+ _scheduleFetchMany(internalModels) {
+ var fetches = new Array(internalModels.length);
+
+ for (var i = 0; i < internalModels.length; i++) {
+ fetches[i] = this._scheduleFetch(internalModels[i]);
+ }
+
+ return Promise.all(fetches);
+ },
+
+ _scheduleFetch(internalModel, options) {
+ if (internalModel._loadingPromise) {
+ return internalModel._loadingPromise;
+ }
+
+ var { id, modelName } = internalModel;
+ var resolver = Ember.RSVP.defer(`Fetching ${modelName}' with id: ${id}`);
+ var pendingFetchItem = {
+ internalModel,
+ resolver,
+ options
+ };
+
+ var promise = resolver.promise;
+
+ internalModel.loadingData(promise);
+ if (this._pendingFetch.size === 0) {
+ Ember.run.schedule('afterRender', this, this.flushAllPendingFetches);
+ }
+
+ this._pendingFetch.get(modelName).push(pendingFetchItem);
+
+ return promise;
+ },
+
+ flushAllPendingFetches() {
+ if (this.isDestroyed || this.isDestroying) {
+ return;
+ }
+
+ this._pendingFetch.forEach(this._flushPendingFetchForType, this);
+ this._pendingFetch.clear();
+ },
+
+ _flushPendingFetchForType(pendingFetchItems, modelName) {
+ var store = this;
+ var adapter = store.adapterFor(modelName);
+ var shouldCoalesce = !!adapter.findMany && adapter.coalesceFindRequests;
+ var totalItems = pendingFetchItems.length;
+ var internalModels = new Array(totalItems);
+ var seeking = Object.create(null);
+
+ for (var _i = 0; _i < totalItems; _i++) {
+ var pendingItem = pendingFetchItems[_i];
+ var _internalModel = pendingItem.internalModel;
+ internalModels[_i] = _internalModel;
+ seeking[_internalModel.id] = pendingItem;
+ }
+
+ function _fetchRecord(recordResolverPair) {
+ var recordFetch = store._fetchRecord(recordResolverPair.internalModel, recordResolverPair.options); // TODO adapter options
+
+ recordResolverPair.resolver.resolve(recordFetch);
+ }
+
+ function handleFoundRecords(foundInternalModels, expectedInternalModels) {
+ // resolve found records
+ var found = Object.create(null);
+ for (var _i2 = 0, _l = foundInternalModels.length; _i2 < _l; _i2++) {
+ var _internalModel2 = foundInternalModels[_i2];
+ var _pair = seeking[_internalModel2.id];
+ found[_internalModel2.id] = _internalModel2;
+
+ if (_pair) {
+ var resolver = _pair.resolver;
+ resolver.resolve(_internalModel2);
+ }
+ }
+
+ // reject missing records
+ var missingInternalModels = [];
+
+ for (var _i3 = 0, _l2 = expectedInternalModels.length; _i3 < _l2; _i3++) {
+ var _internalModel3 = expectedInternalModels[_i3];
+
+ if (!found[_internalModel3.id]) {
+ missingInternalModels.push(_internalModel3);
+ }
+ }
+
+ if (missingInternalModels.length) {
+ (true && Ember.warn('Ember Data expected to find records with the following ids in the adapter response but they were missing: ' + Ember.inspect(missingInternalModels.map(r => r.id)), false, {
+ id: 'ds.store.missing-records-from-adapter'
+ }));
+
+ rejectInternalModels(missingInternalModels);
+ }
+ }
+
+ function rejectInternalModels(internalModels, error) {
+ for (var _i4 = 0, _l3 = internalModels.length; _i4 < _l3; _i4++) {
+ var _internalModel4 = internalModels[_i4];
+ var _pair2 = seeking[_internalModel4.id];
+
+ if (_pair2) {
+ _pair2.resolver.reject(error || new Error(`Expected: '${_internalModel4}' to be present in the adapter provided payload, but it was not found.`));
+ }
+ }
+ }
+
+ if (shouldCoalesce) {
+ // TODO: Improve records => snapshots => records => snapshots
+ //
+ // We want to provide records to all store methods and snapshots to all
+ // adapter methods. To make sure we're doing that we're providing an array
+ // of snapshots to adapter.groupRecordsForFindMany(), which in turn will
+ // return grouped snapshots instead of grouped records.
+ //
+ // But since the _findMany() finder is a store method we need to get the
+ // records from the grouped snapshots even though the _findMany() finder
+ // will once again convert the records to snapshots for adapter.findMany()
+ var snapshots = new Array(totalItems);
+ for (var _i5 = 0; _i5 < totalItems; _i5++) {
+ snapshots[_i5] = internalModels[_i5].createSnapshot();
+ }
+
+ var groups = adapter.groupRecordsForFindMany(this, snapshots);
+
+ for (var i = 0, l = groups.length; i < l; i++) {
+ var group = groups[i];
+ var totalInGroup = groups[i].length;
+ var ids = new Array(totalInGroup);
+ var groupedInternalModels = new Array(totalInGroup);
+
+ for (var j = 0; j < totalInGroup; j++) {
+ var internalModel = group[j]._internalModel;
+
+ groupedInternalModels[j] = internalModel;
+ ids[j] = internalModel.id;
+ }
+
+ if (totalInGroup > 1) {
+ (function (groupedInternalModels) {
+ _findMany(adapter, store, modelName, ids, groupedInternalModels).then(function (foundInternalModels) {
+ handleFoundRecords(foundInternalModels, groupedInternalModels);
+ }).catch(function (error) {
+ rejectInternalModels(groupedInternalModels, error);
+ });
+ })(groupedInternalModels);
+ } else if (ids.length === 1) {
+ var pair = seeking[groupedInternalModels[0].id];
+ _fetchRecord(pair);
+ } else {
+ (true && !(false) && Ember.assert("You cannot return an empty array from adapter's method groupRecordsForFindMany", false));
+ }
+ }
+ } else {
+ for (var _i6 = 0; _i6 < totalItems; _i6++) {
+ _fetchRecord(pendingFetchItems[_i6]);
+ }
+ }
+ },
+
+ /**
+ Get the reference for the specified record.
+ Example
+ ```javascript
+ let userRef = store.getReference('user', 1);
+ // check if the user is loaded
+ let isLoaded = userRef.value() !== null;
+ // get the record of the reference (null if not yet available)
+ let user = userRef.value();
+ // get the identifier of the reference
+ if (userRef.remoteType() === 'id') {
+ let id = userRef.id();
+ }
+ // load user (via store.find)
+ userRef.load().then(...)
+ // or trigger a reload
+ userRef.reload().then(...)
+ // provide data for reference
+ userRef.push({ id: 1, username: '@user' }).then(function(user) {
+ userRef.value() === user;
+ });
+ ```
+ @method getReference
+ @param {String} modelName
+ @param {String|Integer} id
+ @since 2.5.0
+ @return {RecordReference}
+ */
+ getReference(modelName, id) {
+ var normalizedModelName = normalizeModelName(modelName);
+
+ return this._internalModelForId(normalizedModelName, id).recordReference;
+ },
+
+ /**
+ Get a record by a given type and ID without triggering a fetch.
+ This method will synchronously return the record if it is available in the store,
+ otherwise it will return `null`. A record is available if it has been fetched earlier, or
+ pushed manually into the store.
+ See [findRecord](#method_findRecord) if you would like to request this record from the backend.
+ _Note: This is a synchronous method and does not return a promise._
+ ```js
+ let post = store.peekRecord('post', 1);
+ post.get('id'); // 1
+ ```
+ @since 1.13.0
+ @method peekRecord
+ @param {String} modelName
+ @param {String|Integer} id
+ @return {DS.Model|null} record
+ */
+ peekRecord(modelName, id) {
+ (true && !(Ember.isPresent(modelName)) && Ember.assert(`You need to pass a model name to the store's peekRecord method`, Ember.isPresent(modelName)));
+ (true && !(Ember.isPresent(modelName) && Ember.isPresent(id)) && Ember.assert(`You need to pass both a model name and id to the store's peekRecord method`, Ember.isPresent(modelName) && Ember.isPresent(id)));
+ (true && !(typeof modelName === 'string') && Ember.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));
+
+ var normalizedModelName = normalizeModelName(modelName);
+
+ if (this.hasRecordForId(normalizedModelName, id)) {
+ return this._internalModelForId(normalizedModelName, id).getRecord();
+ } else {
+ return null;
+ }
+ },
+
+ /**
+ This method is called by the record's `reload` method.
+ This method calls the adapter's `find` method, which returns a promise. When
+ **that** promise resolves, `reloadRecord` will resolve the promise returned
+ by the record's `reload`.
+ @method reloadRecord
+ @private
+ @param {DS.Model} internalModel
+ @return {Promise} promise
+ */
+ _reloadRecord(internalModel) {
+ var { id, modelName } = internalModel;
+ var adapter = this.adapterFor(modelName);
+
+ (true && !(id) && Ember.assert(`You cannot reload a record without an ID`, id));
+ (true && !(adapter) && Ember.assert(`You tried to reload a record but you have no adapter (for ${modelName})`, adapter));
+ (true && !(typeof adapter.findRecord === 'function' || typeof adapter.find === 'function') && Ember.assert(`You tried to reload a record but your adapter does not implement 'findRecord'`, typeof adapter.findRecord === 'function' || typeof adapter.find === 'function'));
+
+
+ return this._scheduleFetch(internalModel);
+ },
+
+ /**
+ This method returns true if a record for a given modelName and id is already
+ loaded in the store. Use this function to know beforehand if a findRecord()
+ will result in a request or that it will be a cache hit.
+ Example
+ ```javascript
+ store.hasRecordForId('post', 1); // false
+ store.findRecord('post', 1).then(function() {
+ store.hasRecordForId('post', 1); // true
+ });
+ ```
+ @method hasRecordForId
+ @param {String} modelName
+ @param {(String|Integer)} id
+ @return {Boolean}
+ */
+ hasRecordForId(modelName, id) {
+ (true && !(Ember.isPresent(modelName)) && Ember.assert(`You need to pass a model name to the store's hasRecordForId method`, Ember.isPresent(modelName)));
+ (true && !(typeof modelName === 'string') && Ember.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));
+
+
+ var normalizedModelName = normalizeModelName(modelName);
+
+ var trueId = coerceId(id);
+ var internalModel = this._internalModelsFor(normalizedModelName).get(trueId);
+
+ return !!internalModel && internalModel.isLoaded();
+ },
+
+ /**
+ Returns id record for a given type and ID. If one isn't already loaded,
+ it builds a new record and leaves it in the `empty` state.
+ @method recordForId
+ @private
+ @param {String} modelName
+ @param {(String|Integer)} id
+ @return {DS.Model} record
+ */
+ recordForId(modelName, id) {
+ (true && !(Ember.isPresent(modelName)) && Ember.assert(`You need to pass a model name to the store's recordForId method`, Ember.isPresent(modelName)));
+ (true && !(typeof modelName === 'string') && Ember.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));
+
+
+ return this._internalModelForId(modelName, id).getRecord();
+ },
+
+ _internalModelForId(modelName, id) {
+ var trueId = coerceId(id);
+ var internalModel = this._internalModelsFor(modelName).get(trueId);
+
+ if (internalModel) {
+ if (internalModel.hasScheduledDestroy()) {
+ internalModel.destroySync();
+ return this._buildInternalModel(modelName, trueId);
+ } else {
+ return internalModel;
+ }
+ } else {
+ return this._buildInternalModel(modelName, trueId);
+ }
+ },
+
+ _internalModelDidReceiveRelationshipData(modelName, id, relationshipData) {
+ this._relationshipsPayloads.push(modelName, id, relationshipData);
+ },
+
+ _internalModelDestroyed(internalModel) {
+ this._removeFromIdMap(internalModel);
+ this._relationshipsPayloads.unload(internalModel.modelName, internalModel.id);
+ },
+
+ /**
+ @method findMany
+ @private
+ @param {Array} internalModels
+ @return {Promise} promise
+ */
+ findMany(internalModels) {
+ var finds = new Array(internalModels.length);
+
+ for (var i = 0; i < internalModels.length; i++) {
+ finds[i] = this._findEmptyInternalModel(internalModels[i]);
+ }
+
+ return Promise.all(finds);
+ },
+
+ /**
+ If a relationship was originally populated by the adapter as a link
+ (as opposed to a list of IDs), this method is called when the
+ relationship is fetched.
+ The link (which is usually a URL) is passed through unchanged, so the
+ adapter can make whatever request it wants.
+ The usual use-case is for the server to register a URL as a link, and
+ then use that URL in the future to make a request for the relationship.
+ @method findHasMany
+ @private
+ @param {InternalModel} internalModel
+ @param {any} link
+ @param {(Relationship)} relationship
+ @return {Promise} promise
+ */
+ findHasMany(internalModel, link, relationship) {
+ var adapter = this.adapterFor(internalModel.modelName);
+
+ (true && !(adapter) && Ember.assert(`You tried to load a hasMany relationship but you have no adapter (for ${internalModel.modelName})`, adapter));
+ (true && !(typeof adapter.findHasMany === 'function') && Ember.assert(`You tried to load a hasMany relationship from a specified 'link' in the original payload but your adapter does not implement 'findHasMany'`, typeof adapter.findHasMany === 'function'));
+
+
+ return _findHasMany(adapter, this, internalModel, link, relationship);
+ },
+
+ /**
+ @method findBelongsTo
+ @private
+ @param {InternalModel} internalModel
+ @param {any} link
+ @param {Relationship} relationship
+ @return {Promise} promise
+ */
+ findBelongsTo(internalModel, link, relationship) {
+ var adapter = this.adapterFor(internalModel.modelName);
+
+ (true && !(adapter) && Ember.assert(`You tried to load a belongsTo relationship but you have no adapter (for ${internalModel.modelName})`, adapter));
+ (true && !(typeof adapter.findBelongsTo === 'function') && Ember.assert(`You tried to load a belongsTo relationship from a specified 'link' in the original payload but your adapter does not implement 'findBelongsTo'`, typeof adapter.findBelongsTo === 'function'));
+
+
+ return _findBelongsTo(adapter, this, internalModel, link, relationship);
+ },
+
+ /**
+ This method delegates a query to the adapter. This is the one place where
+ adapter-level semantics are exposed to the application.
+ Each time this method is called a new request is made through the adapter.
+ Exposing queries this way seems preferable to creating an abstract query
+ language for all server-side queries, and then require all adapters to
+ implement them.
+ ---
+ If you do something like this:
+ ```javascript
+ store.query('person', { page: 1 });
+ ```
+ The call made to the server, using a Rails backend, will look something like this:
+ ```
+ Started GET "/api/v1/person?page=1"
+ Processing by Api::V1::PersonsController#index as HTML
+ Parameters: { "page"=>"1" }
+ ```
+ ---
+ If you do something like this:
+ ```javascript
+ store.query('person', { ids: [1, 2, 3] });
+ ```
+ The call to the server, using a Rails backend, will look something like this:
+ ```
+ Started GET "/api/v1/person?ids%5B%5D=1&ids%5B%5D=2&ids%5B%5D=3"
+ Processing by Api::V1::PersonsController#index as HTML
+ Parameters: { "ids" => ["1", "2", "3"] }
+ ```
+ This method returns a promise, which is resolved with an
+ [`AdapterPopulatedRecordArray`](https://emberjs.com/api/data/classes/DS.AdapterPopulatedRecordArray.html)
+ once the server returns.
+ @since 1.13.0
+ @method query
+ @param {String} modelName
+ @param {any} query an opaque query to be used by the adapter
+ @return {Promise} promise
+ */
+ query(modelName, query) {
+ (true && !(Ember.isPresent(modelName)) && Ember.assert(`You need to pass a model name to the store's query method`, Ember.isPresent(modelName)));
+ (true && !(query) && Ember.assert(`You need to pass a query hash to the store's query method`, query));
+ (true && !(typeof modelName === 'string') && Ember.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));
+
+
+ var normalizedModelName = normalizeModelName(modelName);
+ return this._query(normalizedModelName, query);
+ },
+
+ _query(modelName, query, array) {
+ (true && !(Ember.isPresent(modelName)) && Ember.assert(`You need to pass a model name to the store's query method`, Ember.isPresent(modelName)));
+ (true && !(query) && Ember.assert(`You need to pass a query hash to the store's query method`, query));
+ (true && !(typeof modelName === 'string') && Ember.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));
+
+ var adapter = this.adapterFor(modelName);
+ (true && !(adapter) && Ember.assert(`You tried to load a query but you have no adapter (for ${modelName})`, adapter));
+ (true && !(typeof adapter.query === 'function') && Ember.assert(`You tried to load a query but your adapter does not implement 'query'`, typeof adapter.query === 'function'));
+
+
+ var pA = promiseArray(_query(adapter, this, modelName, query, array));
+
+ return pA;
+ },
+
+ /**
+ This method makes a request for one record, where the `id` is not known
+ beforehand (if the `id` is known, use [`findRecord`](#method_findRecord)
+ instead).
+ This method can be used when it is certain that the server will return a
+ single object for the primary data.
+ Each time this method is called a new request is made through the adapter.
+ Let's assume our API provides an endpoint for the currently logged in user
+ via:
+ ```
+ // GET /api/current_user
+ {
+ user: {
+ id: 1234,
+ username: 'admin'
+ }
+ }
+ ```
+ Since the specific `id` of the `user` is not known beforehand, we can use
+ `queryRecord` to get the user:
+ ```javascript
+ store.queryRecord('user', {}).then(function(user) {
+ let username = user.get('username');
+ console.log(`Currently logged in as ${username}`);
+ });
+ ```
+ The request is made through the adapters' `queryRecord`:
+ ```app/adapters/user.js
+ import $ from 'jquery';
+ import DS from 'ember-data';
+ export default DS.Adapter.extend({
+ queryRecord(modelName, query) {
+ return $.getJSON('/api/current_user');
+ }
+ });
+ ```
+ Note: the primary use case for `store.queryRecord` is when a single record
+ is queried and the `id` is not known beforehand. In all other cases
+ `store.query` and using the first item of the array is likely the preferred
+ way:
+ ```
+ // GET /users?username=unique
+ {
+ data: [{
+ id: 1234,
+ type: 'user',
+ attributes: {
+ username: "unique"
+ }
+ }]
+ }
+ ```
+ ```javascript
+ store.query('user', { username: 'unique' }).then(function(users) {
+ return users.get('firstObject');
+ }).then(function(user) {
+ let id = user.get('id');
+ });
+ ```
+ This method returns a promise, which resolves with the found record.
+ If the adapter returns no data for the primary data of the payload, then
+ `queryRecord` resolves with `null`:
+ ```
+ // GET /users?username=unique
+ {
+ data: null
+ }
+ ```
+ ```javascript
+ store.queryRecord('user', { username: 'unique' }).then(function(user) {
+ console.log(user); // null
+ });
+ ```
+ @since 1.13.0
+ @method queryRecord
+ @param {String} modelName
+ @param {any} query an opaque query to be used by the adapter
+ @return {Promise} promise which resolves with the found record or `null`
+ */
+ queryRecord(modelName, query) {
+ (true && !(Ember.isPresent(modelName)) && Ember.assert(`You need to pass a model name to the store's queryRecord method`, Ember.isPresent(modelName)));
+ (true && !(query) && Ember.assert(`You need to pass a query hash to the store's queryRecord method`, query));
+ (true && !(typeof modelName === 'string') && Ember.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));
+
+
+ var normalizedModelName = normalizeModelName(modelName);
+
+ var adapter = this.adapterFor(normalizedModelName);
+
+ (true && !(adapter) && Ember.assert(`You tried to make a query but you have no adapter (for ${normalizedModelName})`, adapter));
+ (true && !(typeof adapter.queryRecord === 'function') && Ember.assert(`You tried to make a query but your adapter does not implement 'queryRecord'`, typeof adapter.queryRecord === 'function'));
+
+
+ return promiseObject(_queryRecord(adapter, this, modelName, query).then(internalModel => {
+ // the promise returned by store.queryRecord is expected to resolve with
+ // an instance of DS.Model
+ if (internalModel) {
+ return internalModel.getRecord();
+ }
+
+ return null;
+ }));
+ },
+
+ /**
+ `findAll` asks the adapter's `findAll` method to find the records for the
+ given type, and returns a promise which will resolve with all records of
+ this type present in the store, even if the adapter only returns a subset
+ of them.
+ ```app/routes/authors.js
+ import Route from '@ember/routing/route';
+ export default Route.extend({
+ model(params) {
+ return this.store.findAll('author');
+ }
+ });
+ ```
+ _When_ the returned promise resolves depends on the reload behavior,
+ configured via the passed `options` hash and the result of the adapter's
+ `shouldReloadAll` method.
+ ### Reloading
+ If `{ reload: true }` is passed or `adapter.shouldReloadAll` evaluates to
+ `true`, then the returned promise resolves once the adapter returns data,
+ regardless if there are already records in the store:
+ ```js
+ store.push({
+ data: {
+ id: 'first',
+ type: 'author'
+ }
+ });
+ // adapter#findAll resolves with
+ // [
+ // {
+ // id: 'second',
+ // type: 'author'
+ // }
+ // ]
+ store.findAll('author', { reload: true }).then(function(authors) {
+ authors.getEach('id'); // ['first', 'second']
+ });
+ ```
+ If no reload is indicated via the abovementioned ways, then the promise
+ immediately resolves with all the records currently loaded in the store.
+ ### Background Reloading
+ Optionally, if `adapter.shouldBackgroundReloadAll` evaluates to `true`,
+ then a background reload is started. Once this resolves, the array with
+ which the promise resolves, is updated automatically so it contains all the
+ records in the store:
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ export default DS.Adapter.extend({
+ shouldReloadAll(store, snapshotsArray) {
+ return false;
+ },
+ shouldBackgroundReloadAll(store, snapshotsArray) {
+ return true;
+ }
+ });
+ // ...
+ store.push({
+ data: {
+ id: 'first',
+ type: 'author'
+ }
+ });
+ let allAuthors;
+ store.findAll('author').then(function(authors) {
+ authors.getEach('id'); // ['first']
+ allAuthors = authors;
+ });
+ // later, once adapter#findAll resolved with
+ // [
+ // {
+ // id: 'second',
+ // type: 'author'
+ // }
+ // ]
+ allAuthors.getEach('id'); // ['first', 'second']
+ ```
+ If you would like to force or prevent background reloading, you can set a
+ boolean value for `backgroundReload` in the options object for
+ `findAll`.
+ ```app/routes/post/edit.js
+ import Route from '@ember/routing/route';
+ export default Route.extend({
+ model() {
+ return this.store.findAll('post', { backgroundReload: false });
+ }
+ });
+ ```
+ If you pass an object on the `adapterOptions` property of the options
+ argument it will be passed to you adapter via the `snapshotRecordArray`
+ ```app/routes/posts.js
+ import Route from '@ember/routing/route';
+ export default Route.extend({
+ model(params) {
+ return this.store.findAll('post', {
+ adapterOptions: { subscribe: false }
+ });
+ }
+ });
+ ```
+ ```app/adapters/post.js
+ import MyCustomAdapter from './custom-adapter';
+ export default MyCustomAdapter.extend({
+ findAll(store, type, sinceToken, snapshotRecordArray) {
+ if (snapshotRecordArray.adapterOptions.subscribe) {
+ // ...
+ }
+ // ...
+ }
+ });
+ ```
+ See [peekAll](#method_peekAll) to get an array of current records in the
+ store, without waiting until a reload is finished.
+ ### Retrieving Related Model Records
+ If you use an adapter such as Ember's default
+ [`JSONAPIAdapter`](https://emberjs.com/api/data/classes/DS.JSONAPIAdapter.html)
+ that supports the [JSON API specification](http://jsonapi.org/) and if your server
+ endpoint supports the use of an
+ ['include' query parameter](http://jsonapi.org/format/#fetching-includes),
+ you can use `findAll()` to automatically retrieve additional records related to
+ those requested by supplying an `include` parameter in the `options` object.
+ For example, given a `post` model that has a `hasMany` relationship with a `comment`
+ model, when we retrieve all of the post records we can have the server also return
+ all of the posts' comments in the same request:
+ ```app/routes/posts.js
+ import Route from '@ember/routing/route';
+ export default Route.extend({
+ model() {
+ return this.store.findAll('post', { include: 'comments' });
+ }
+ });
+ ```
+ Multiple relationships can be requested using an `include` parameter consisting of a
+ comma-separated list (without white-space) while nested relationships can be specified
+ using a dot-separated sequence of relationship names. So to request both the posts'
+ comments and the authors of those comments the request would look like this:
+ ```app/routes/posts.js
+ import Route from '@ember/routing/route';
+ export default Route.extend({
+ model() {
+ return this.store.findAll('post', { include: 'comments,comments.author' });
+ }
+ });
+ ```
+ See [query](#method_query) to only get a subset of records from the server.
+ @since 1.13.0
+ @method findAll
+ @param {String} modelName
+ @param {Object} options
+ @return {Promise} promise
+ */
+ findAll(modelName, options) {
+ (true && !(Ember.isPresent(modelName)) && Ember.assert(`You need to pass a model name to the store's findAll method`, Ember.isPresent(modelName)));
+ (true && !(typeof modelName === 'string') && Ember.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));
+
+ var normalizedModelName = normalizeModelName(modelName);
+ var fetch = this._fetchAll(normalizedModelName, this.peekAll(normalizedModelName), options);
+
+ return fetch;
+ },
+
+ /**
+ @method _fetchAll
+ @private
+ @param {DS.Model} modelName
+ @param {DS.RecordArray} array
+ @return {Promise} promise
+ */
+ _fetchAll(modelName, array, options = {}) {
+ var adapter = this.adapterFor(modelName);
+ var sinceToken = this._internalModelsFor(modelName).metadata.since;
+
+ (true && !(adapter) && Ember.assert(`You tried to load all records but you have no adapter (for ${modelName})`, adapter));
+ (true && !(typeof adapter.findAll === 'function') && Ember.assert(`You tried to load all records but your adapter does not implement 'findAll'`, typeof adapter.findAll === 'function'));
+
+
+ if (options.reload) {
+ Ember.set(array, 'isUpdating', true);
+ return promiseArray(_findAll(adapter, this, modelName, sinceToken, options));
+ }
+
+ var snapshotArray = array._createSnapshot(options);
+
+ if (adapter.shouldReloadAll(this, snapshotArray)) {
+ Ember.set(array, 'isUpdating', true);
+ return promiseArray(_findAll(adapter, this, modelName, sinceToken, options));
+ }
+
+ if (options.backgroundReload === false) {
+ return promiseArray(Promise.resolve(array));
+ }
+
+ if (options.backgroundReload || adapter.shouldBackgroundReloadAll(this, snapshotArray)) {
+ Ember.set(array, 'isUpdating', true);
+ _findAll(adapter, this, modelName, sinceToken, options);
+ }
+
+ return promiseArray(Promise.resolve(array));
+ },
+
+ /**
+ @method _didUpdateAll
+ @param {String} modelName
+ @private
+ */
+ _didUpdateAll(modelName) {
+ this.recordArrayManager._didUpdateAll(modelName);
+ },
+
+ didUpdateAll(modelName) {
+ (true && !(false) && Ember.deprecate('didUpdateAll was documented as private and will be removed in the next version of Ember Data.', false, { id: 'ember-data.didUpdateAll', until: '2.17.0' }));
+
+ return this._didUpdateAll(modelName);
+ },
+
+ /**
+ This method returns a filtered array that contains all of the
+ known records for a given type in the store.
+ Note that because it's just a filter, the result will contain any
+ locally created records of the type, however, it will not make a
+ request to the backend to retrieve additional records. If you
+ would like to request all the records from the backend please use
+ [store.findAll](#method_findAll).
+ Also note that multiple calls to `peekAll` for a given type will always
+ return the same `RecordArray`.
+ Example
+ ```javascript
+ let localPosts = store.peekAll('post');
+ ```
+ @since 1.13.0
+ @method peekAll
+ @param {String} modelName
+ @return {DS.RecordArray}
+ */
+ peekAll(modelName) {
+ (true && !(Ember.isPresent(modelName)) && Ember.assert(`You need to pass a model name to the store's peekAll method`, Ember.isPresent(modelName)));
+ (true && !(typeof modelName === 'string') && Ember.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));
+
+ var normalizedModelName = normalizeModelName(modelName);
+ return this.recordArrayManager.liveRecordArrayFor(normalizedModelName);
+ },
+
+ /**
+ This method unloads all records in the store.
+ It schedules unloading to happen during the next run loop.
+ Optionally you can pass a type which unload all records for a given type.
+ ```javascript
+ store.unloadAll();
+ store.unloadAll('post');
+ ```
+ @method unloadAll
+ @param {String} modelName
+ */
+ unloadAll(modelName) {
+ (true && !(!modelName || typeof modelName === 'string') && Ember.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, !modelName || typeof modelName === 'string'));
+
+
+ if (arguments.length === 0) {
+ this._identityMap.clear();
+ } else {
+ var normalizedModelName = normalizeModelName(modelName);
+ this._internalModelsFor(normalizedModelName).clear();
+ }
+ },
+
+ /**
+ Takes a type and filter function, and returns a live RecordArray that
+ remains up to date as new records are loaded into the store or created
+ locally.
+ The filter function takes a materialized record, and returns true
+ if the record should be included in the filter and false if it should
+ not.
+ Example
+ ```javascript
+ store.filter('post', function(post) {
+ return post.get('unread');
+ });
+ ```
+ The filter function is called once on all records for the type when
+ it is created, and then once on each newly loaded or created record.
+ If any of a record's properties change, or if it changes state, the
+ filter function will be invoked again to determine whether it should
+ still be in the array.
+ Optionally you can pass a query, which is the equivalent of calling
+ [query](#method_query) with that same query, to fetch additional records
+ from the server. The results returned by the server could then appear
+ in the filter if they match the filter function.
+ The query itself is not used to filter records, it's only sent to your
+ server for you to be able to do server-side filtering. The filter
+ function will be applied on the returned results regardless.
+ Example
+ ```javascript
+ store.filter('post', { unread: true }, function(post) {
+ return post.get('unread');
+ }).then(function(unreadPosts) {
+ unreadPosts.get('length'); // 5
+ let unreadPost = unreadPosts.objectAt(0);
+ unreadPost.set('unread', false);
+ unreadPosts.get('length'); // 4
+ });
+ ```
+ @method filter
+ @private
+ @param {String} modelName
+ @param {Object} query optional query
+ @param {Function} filter
+ @return {DS.PromiseArray}
+ @deprecated
+ */
+ filter(modelName, query, filter) {
+ (true && !(Ember.isPresent(modelName)) && Ember.assert(`You need to pass a model name to the store's filter method`, Ember.isPresent(modelName)));
+ (true && !(typeof modelName === 'string') && Ember.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));
+
+
+ if (!ENV.ENABLE_DS_FILTER) {
+ (true && !(false) && Ember.assert('The filter API has been moved to a plugin. To enable store.filter using an environment flag, or to use an alternative, you can visit the ember-data-filter addon page. https://github.com/ember-data/ember-data-filter', false));
+ }
+
+ var promise = void 0;
+ var length = arguments.length;
+ var array = void 0;
+ var hasQuery = length === 3;
+
+ var normalizedModelName = normalizeModelName(modelName);
+
+ // allow an optional server query
+ if (hasQuery) {
+ promise = this.query(normalizedModelName, query);
+ } else if (arguments.length === 2) {
+ filter = query;
+ }
+
+ if (hasQuery) {
+ array = this.recordArrayManager.createFilteredRecordArray(normalizedModelName, filter, query);
+ } else {
+ array = this.recordArrayManager.createFilteredRecordArray(normalizedModelName, filter);
+ }
+
+ promise = promise || Promise.resolve(array);
+
+ return promiseArray(promise.then(() => array, null, `DS: Store#filter of ${normalizedModelName}`));
+ },
+
+ /**
+ This method has been deprecated and is an alias for store.hasRecordForId, which should
+ be used instead.
+ @deprecated
+ @method recordIsLoaded
+ @param {String} modelName
+ @param {string} id
+ @return {boolean}
+ */
+ recordIsLoaded(modelName, id) {
+ (true && !(false) && Ember.deprecate(`Use of recordIsLoaded is deprecated, use hasRecordForId instead.`, false, {
+ id: 'ds.store.recordIsLoaded',
+ until: '3.0'
+ }));
+
+ return this.hasRecordForId(modelName, id);
+ },
+
+ // ..............
+ // . PERSISTING .
+ // ..............
+
+ /**
+ This method is called by `record.save`, and gets passed a
+ resolver for the promise that `record.save` returns.
+ It schedules saving to happen at the end of the run loop.
+ @method scheduleSave
+ @private
+ @param {InternalModel} internalModel
+ @param {Resolver} resolver
+ @param {Object} options
+ */
+ scheduleSave(internalModel, resolver, options) {
+ var snapshot = internalModel.createSnapshot(options);
+ internalModel.flushChangedAttributes();
+ internalModel.adapterWillCommit();
+ this._pendingSave.push({
+ snapshot: snapshot,
+ resolver: resolver
+ });
+ Ember.run.once(this, this.flushPendingSave);
+ },
+
+ /**
+ This method is called at the end of the run loop, and
+ flushes any records passed into `scheduleSave`
+ @method flushPendingSave
+ @private
+ */
+ flushPendingSave() {
+ var pending = this._pendingSave.slice();
+ this._pendingSave = [];
+
+ for (var i = 0, j = pending.length; i < j; i++) {
+ var pendingItem = pending[i];
+ var snapshot = pendingItem.snapshot;
+ var resolver = pendingItem.resolver;
+ var internalModel = snapshot._internalModel;
+ var adapter = this.adapterFor(internalModel.modelName);
+ var operation = void 0;
+
+ if (internalModel.currentState.stateName === 'root.deleted.saved') {
+ resolver.resolve();
+ continue;
+ } else if (internalModel.isNew()) {
+ operation = 'createRecord';
+ } else if (internalModel.isDeleted()) {
+ operation = 'deleteRecord';
+ } else {
+ operation = 'updateRecord';
+ }
+
+ resolver.resolve(_commit(adapter, this, operation, snapshot));
+ }
+ },
+
+ /**
+ This method is called once the promise returned by an
+ adapter's `createRecord`, `updateRecord` or `deleteRecord`
+ is resolved.
+ If the data provides a server-generated ID, it will
+ update the record and the store's indexes.
+ @method didSaveRecord
+ @private
+ @param {InternalModel} internalModel the in-flight internal model
+ @param {Object} data optional data (see above)
+ */
+ didSaveRecord(internalModel, dataArg) {
+ var data = void 0;
+ if (dataArg) {
+ data = dataArg.data;
+ }
+ if (data) {
+ // normalize relationship IDs into records
+ this.updateId(internalModel, data);
+ this._setupRelationshipsForModel(internalModel, data);
+ } else {
+ (true && !(internalModel.id) && Ember.assert(`Your ${internalModel.modelName} record was saved to the server, but the response does not have an id and no id has been set client side. Records must have ids. Please update the server response to provide an id in the response or generate the id on the client side either before saving the record or while normalizing the response.`, internalModel.id));
+ }
+
+ //We first make sure the primary data has been updated
+ //TODO try to move notification to the user to the end of the runloop
+ internalModel.adapterDidCommit(data);
+ },
+
+ /**
+ This method is called once the promise returned by an
+ adapter's `createRecord`, `updateRecord` or `deleteRecord`
+ is rejected with a `DS.InvalidError`.
+ @method recordWasInvalid
+ @private
+ @param {InternalModel} internalModel
+ @param {Object} errors
+ */
+ recordWasInvalid(internalModel, errors) {
+ internalModel.adapterDidInvalidate(errors);
+ },
+
+ /**
+ This method is called once the promise returned by an
+ adapter's `createRecord`, `updateRecord` or `deleteRecord`
+ is rejected (with anything other than a `DS.InvalidError`).
+ @method recordWasError
+ @private
+ @param {InternalModel} internalModel
+ @param {Error} error
+ */
+ recordWasError(internalModel, error) {
+ internalModel.adapterDidError(error);
+ },
+
+ /**
+ When an adapter's `createRecord`, `updateRecord` or `deleteRecord`
+ resolves with data, this method extracts the ID from the supplied
+ data.
+ @method updateId
+ @private
+ @param {InternalModel} internalModel
+ @param {Object} data
+ */
+ updateId(internalModel, data) {
+ var oldId = internalModel.id;
+ var modelName = internalModel.modelName;
+ var id = coerceId(data.id);
+
+ // ID absolutely can't be missing if the oldID is empty (missing Id in response for a new record)
+ (true && !(!(id === null && oldId === null)) && Ember.assert(`'${modelName}' was saved to the server, but the response does not have an id and your record does not either.`, !(id === null && oldId === null)));
+
+ // ID absolutely can't be different than oldID if oldID is not null
+
+ (true && !(!(oldId !== null && id !== oldId)) && Ember.assert(`'${modelName}:${oldId}' was saved to the server, but the response returned the new id '${id}'. The store cannot assign a new id to a record that already has an id.`, !(oldId !== null && id !== oldId)));
+
+ // ID can be null if oldID is not null (altered ID in response for a record)
+ // however, this is more than likely a developer error.
+
+ if (oldId !== null && id === null) {
+ (true && Ember.warn(`Your ${modelName} record was saved to the server, but the response does not have an id.`, !(oldId !== null && id === null)));
+
+ return;
+ }
+
+ var existingInternalModel = this._existingInternalModelForId(modelName, id);
+
+ (true && !(Ember.isNone(existingInternalModel) || existingInternalModel === internalModel) && Ember.assert(`'${modelName}' was saved to the server, but the response returned the new id '${id}', which has already been used with another record.'`, Ember.isNone(existingInternalModel) || existingInternalModel === internalModel));
+
+
+ this._internalModelsFor(internalModel.modelName).set(id, internalModel);
+
+ internalModel.setId(id);
+ },
+
+ /**
+ Returns a map of IDs to client IDs for a given modelName.
+ @method _internalModelsFor
+ @private
+ @param {String} modelName
+ @return {Object} recordMap
+ */
+ _internalModelsFor(modelName) {
+ return this._identityMap.retrieve(modelName);
+ },
+
+ // ................
+ // . LOADING DATA .
+ // ................
+
+ /**
+ This internal method is used by `push`.
+ @method _load
+ @private
+ @param {Object} data
+ */
+ _load(data) {
+ var modelName = normalizeModelName(data.type);
+ var internalModel = this._internalModelForId(modelName, data.id);
+
+ var isUpdate = internalModel.currentState.isEmpty === false;
+
+ internalModel.setupData(data);
+
+ if (isUpdate) {
+ this.recordArrayManager.recordDidChange(internalModel);
+ } else {
+ this.recordArrayManager.recordWasLoaded(internalModel);
+ }
+
+ return internalModel;
+ },
+
+ /*
+ In case someone defined a relationship to a mixin, for example:
+ ```
+ let Comment = DS.Model.extend({
+ owner: belongsTo('commentable'. { polymorphic: true })
+ });
+ let Commentable = Ember.Mixin.create({
+ comments: hasMany('comment')
+ });
+ ```
+ we want to look up a Commentable class which has all the necessary
+ relationship metadata. Thus, we look up the mixin and create a mock
+ DS.Model, so we can access the relationship CPs of the mixin (`comments`)
+ in this case
+ @private
+ */
+ _modelForMixin(normalizedModelName) {
+ // container.registry = 2.1
+ // container._registry = 1.11 - 2.0
+ // container = < 1.11
+ var owner = getOwner(this);
+ var mixin = void 0;
+
+ if (owner.factoryFor) {
+ var MaybeMixin = owner.factoryFor(`mixin:${normalizedModelName}`);
+ mixin = MaybeMixin && MaybeMixin.class;
+ } else {
+ mixin = owner._lookupFactory(`mixin:${normalizedModelName}`);
+ }
+
+ if (mixin) {
+ var ModelForMixin = Model.extend(mixin);
+ ModelForMixin.reopenClass({
+ __isMixin: true,
+ __mixin: mixin
+ });
+
+ //Cache the class as a model
+ owner.register('model:' + normalizedModelName, ModelForMixin);
+ }
+
+ return this.modelFactoryFor(normalizedModelName);
+ },
+
+ /**
+ Returns the model class for the particular `modelName`.
+ The class of a model might be useful if you want to get a list of all the
+ relationship names of the model, see
+ [`relationshipNames`](https://emberjs.com/api/data/classes/DS.Model.html#property_relationshipNames)
+ for example.
+ @method modelFor
+ @param {String} modelName
+ @return {DS.Model}
+ */
+ modelFor(modelName) {
+ (true && !(Ember.isPresent(modelName)) && Ember.assert(`You need to pass a model name to the store's modelFor method`, Ember.isPresent(modelName)));
+ (true && !(typeof modelName === 'string') && Ember.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));
+
+
+ var normalizedModelName = normalizeModelName(modelName);
+
+ return this._modelFor(normalizedModelName);
+ },
+
+ /*
+ @private
+ */
+ _modelFor(modelName) {
+ var maybeFactory = this._modelFactoryFor(modelName);
+ // for factorFor factory/class split
+ return maybeFactory.class ? maybeFactory.class : maybeFactory;
+ },
+
+ _modelFactoryFor(modelName) {
+ var factory = this._modelFactoryCache[modelName];
+
+ if (!factory) {
+ factory = this.modelFactoryFor(modelName);
+
+ if (!factory) {
+ //Support looking up mixins as base types for polymorphic relationships
+ factory = this._modelForMixin(modelName);
+ }
+ if (!factory) {
+ throw new Ember.Error(`No model was found for '${modelName}'`);
+ }
+
+ // interopt with the future
+ var klass = getOwner(this).factoryFor ? factory.class : factory;
+
+ (true && !(klass.isModel) && Ember.assert(`'${Ember.inspect(klass)}' does not appear to be an ember-data model`, klass.isModel));
+
+ // TODO: deprecate this
+
+ klass.modelName = klass.modelName || modelName;
+
+ this._modelFactoryCache[modelName] = factory;
+ }
+
+ return factory;
+ },
+
+ /*
+ @private
+ */
+ modelFactoryFor(modelName) {
+ (true && !(Ember.isPresent(modelName)) && Ember.assert(`You need to pass a model name to the store's modelFactoryFor method`, Ember.isPresent(modelName)));
+ (true && !(typeof modelName === 'string') && Ember.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));
+
+
+ var normalizedModelName = normalizeModelName(modelName);
+ var owner = getOwner(this);
+
+ if (owner.factoryFor) {
+ return owner.factoryFor(`model:${normalizedModelName}`);
+ } else {
+ return owner._lookupFactory(`model:${normalizedModelName}`);
+ }
+ },
+
+ /**
+ Push some data for a given type into the store.
+ This method expects normalized [JSON API](http://jsonapi.org/) document. This means you have to follow [JSON API specification](http://jsonapi.org/format/) with few minor adjustments:
+ - record's `type` should always be in singular, dasherized form
+ - members (properties) should be camelCased
+ [Your primary data should be wrapped inside `data` property](http://jsonapi.org/format/#document-top-level):
+ ```js
+ store.push({
+ data: {
+ // primary data for single record of type `Person`
+ id: '1',
+ type: 'person',
+ attributes: {
+ firstName: 'Daniel',
+ lastName: 'Kmak'
+ }
+ }
+ });
+ ```
+ [Demo.](http://ember-twiddle.com/fb99f18cd3b4d3e2a4c7)
+ `data` property can also hold an array (of records):
+ ```js
+ store.push({
+ data: [
+ // an array of records
+ {
+ id: '1',
+ type: 'person',
+ attributes: {
+ firstName: 'Daniel',
+ lastName: 'Kmak'
+ }
+ },
+ {
+ id: '2',
+ type: 'person',
+ attributes: {
+ firstName: 'Tom',
+ lastName: 'Dale'
+ }
+ }
+ ]
+ });
+ ```
+ [Demo.](http://ember-twiddle.com/69cdbeaa3702159dc355)
+ There are some typical properties for `JSONAPI` payload:
+ * `id` - mandatory, unique record's key
+ * `type` - mandatory string which matches `model`'s dasherized name in singular form
+ * `attributes` - object which holds data for record attributes - `DS.attr`'s declared in model
+ * `relationships` - object which must contain any of the following properties under each relationships' respective key (example path is `relationships.achievements.data`):
+ - [`links`](http://jsonapi.org/format/#document-links)
+ - [`data`](http://jsonapi.org/format/#document-resource-object-linkage) - place for primary data
+ - [`meta`](http://jsonapi.org/format/#document-meta) - object which contains meta-information about relationship
+ For this model:
+ ```app/models/person.js
+ import DS from 'ember-data';
+ export default DS.Model.extend({
+ firstName: DS.attr('string'),
+ lastName: DS.attr('string'),
+ children: DS.hasMany('person')
+ });
+ ```
+ To represent the children as IDs:
+ ```js
+ {
+ data: {
+ id: '1',
+ type: 'person',
+ attributes: {
+ firstName: 'Tom',
+ lastName: 'Dale'
+ },
+ relationships: {
+ children: {
+ data: [
+ {
+ id: '2',
+ type: 'person'
+ },
+ {
+ id: '3',
+ type: 'person'
+ },
+ {
+ id: '4',
+ type: 'person'
+ }
+ ]
+ }
+ }
+ }
+ }
+ ```
+ [Demo.](http://ember-twiddle.com/343e1735e034091f5bde)
+ To represent the children relationship as a URL:
+ ```js
+ {
+ data: {
+ id: '1',
+ type: 'person',
+ attributes: {
+ firstName: 'Tom',
+ lastName: 'Dale'
+ },
+ relationships: {
+ children: {
+ links: {
+ related: '/people/1/children'
+ }
+ }
+ }
+ }
+ }
+ ```
+ If you're streaming data or implementing an adapter, make sure
+ that you have converted the incoming data into this form. The
+ store's [normalize](#method_normalize) method is a convenience
+ helper for converting a json payload into the form Ember Data
+ expects.
+ ```js
+ store.push(store.normalize('person', data));
+ ```
+ This method can be used both to push in brand new
+ records, as well as to update existing records.
+ @method push
+ @param {Object} data
+ @return {DS.Model|Array} the record(s) that was created or
+ updated.
+ */
+ push(data) {
+ var pushed = this._push(data);
+
+ if (Array.isArray(pushed)) {
+ var records = pushed.map(internalModel => internalModel.getRecord());
+
+ return records;
+ }
+
+ if (pushed === null) {
+ return null;
+ }
+
+ var record = pushed.getRecord();
+
+ return record;
+ },
+
+ /*
+ Push some data in the form of a json-api document into the store,
+ without creating materialized records.
+ @method _push
+ @private
+ @param {Object} jsonApiDoc
+ @return {DS.InternalModel|Array<DS.InternalModel>} pushed InternalModel(s)
+ */
+ _push(jsonApiDoc) {
+ var internalModelOrModels = this._backburner.join(() => {
+ var included = jsonApiDoc.included;
+ var i = void 0,
+ length = void 0;
+
+ if (included) {
+ for (i = 0, length = included.length; i < length; i++) {
+ this._pushInternalModel(included[i]);
+ }
+ }
+
+ if (Array.isArray(jsonApiDoc.data)) {
+ length = jsonApiDoc.data.length;
+ var internalModels = new Array(length);
+
+ for (i = 0; i < length; i++) {
+ internalModels[i] = this._pushInternalModel(jsonApiDoc.data[i]);
+ }
+ return internalModels;
+ }
+
+ if (jsonApiDoc.data === null) {
+ return null;
+ }
+
+ (true && !(Ember.typeOf(jsonApiDoc.data) === 'object') && Ember.assert(`Expected an object in the 'data' property in a call to 'push' for ${jsonApiDoc.type}, but was ${Ember.typeOf(jsonApiDoc.data)}`, Ember.typeOf(jsonApiDoc.data) === 'object'));
+
+
+ return this._pushInternalModel(jsonApiDoc.data);
+ });
+
+ return internalModelOrModels;
+ },
+
+ _hasModelFor(modelName) {
+ var owner = getOwner(this);
+ modelName = normalizeModelName(modelName);
+
+ if (owner.factoryFor) {
+ return !!owner.factoryFor(`model:${modelName}`);
+ } else {
+ return !!owner._lookupFactory(`model:${modelName}`);
+ }
+ },
+
+ _pushInternalModel(data) {
+ var modelName = data.type;
+ (true && !(data.id !== null && data.id !== undefined && data.id !== '') && Ember.assert(`You must include an 'id' for ${modelName} in an object passed to 'push'`, data.id !== null && data.id !== undefined && data.id !== ''));
+ (true && !(this._hasModelFor(modelName)) && Ember.assert(`You tried to push data with a type '${modelName}' but no model could be found with that name.`, this._hasModelFor(modelName)));
+
+
+ {
+ // If ENV.DS_WARN_ON_UNKNOWN_KEYS is set to true and the payload
+ // contains unknown attributes or relationships, log a warning.
+
+ if (ENV.DS_WARN_ON_UNKNOWN_KEYS) {
+ var modelClass = this._modelFor(modelName);
+
+ // Check unknown attributes
+ var unknownAttributes = Object.keys(data.attributes || {}).filter(key => {
+ return !Ember.get(modelClass, 'fields').has(key);
+ });
+ var unknownAttributesMessage = `The payload for '${modelName}' contains these unknown attributes: ${unknownAttributes}. Make sure they've been defined in your model.`;
+ (true && Ember.warn(unknownAttributesMessage, unknownAttributes.length === 0, { id: 'ds.store.unknown-keys-in-payload' }));
+
+ // Check unknown relationships
+
+ var unknownRelationships = Object.keys(data.relationships || {}).filter(key => {
+ return !Ember.get(modelClass, 'fields').has(key);
+ });
+ var unknownRelationshipsMessage = `The payload for '${modelName}' contains these unknown relationships: ${unknownRelationships}. Make sure they've been defined in your model.`;
+ (true && Ember.warn(unknownRelationshipsMessage, unknownRelationships.length === 0, { id: 'ds.store.unknown-keys-in-payload' }));
+ }
+ }
+
+ // Actually load the record into the store.
+ var internalModel = this._load(data);
+
+ this._setupRelationshipsForModel(internalModel, data);
+
+ return internalModel;
+ },
+
+ _setupRelationshipsForModel(internalModel, data) {
+ if (data.relationships === undefined) {
+ return;
+ }
+
+ if (this._pushedInternalModels.push(internalModel, data) !== 2) {
+ return;
+ }
+
+ this._backburner.schedule('normalizeRelationships', this, this._setupRelationships);
+ },
+
+ _setupRelationships() {
+ var pushed = this._pushedInternalModels;
+
+ // Cache the inverse maps for each modelClass that we visit during this
+ // payload push. In the common case where we are pushing many more
+ // instances than types we want to minimize the cost of looking up the
+ // inverse map and the overhead of Ember.get adds up.
+ var modelNameToInverseMap = void 0;
+
+ for (var i = 0, l = pushed.length; i < l; i += 2) {
+ modelNameToInverseMap = modelNameToInverseMap || Object.create(null);
+ // This will convert relationships specified as IDs into DS.Model instances
+ // (possibly unloaded) and also create the data structures used to track
+ // relationships.
+ var internalModel = pushed[i];
+ var data = pushed[i + 1];
+ setupRelationships(this, internalModel, data, modelNameToInverseMap);
+ }
+
+ pushed.length = 0;
+ },
+
+ /**
+ Push some raw data into the store.
+ This method can be used both to push in brand new
+ records, as well as to update existing records. You
+ can push in more than one type of object at once.
+ All objects should be in the format expected by the
+ serializer.
+ ```app/serializers/application.js
+ import DS from 'ember-data';
+ export default DS.ActiveModelSerializer;
+ ```
+ ```js
+ let pushData = {
+ posts: [
+ { id: 1, post_title: "Great post", comment_ids: [2] }
+ ],
+ comments: [
+ { id: 2, comment_body: "Insightful comment" }
+ ]
+ }
+ store.pushPayload(pushData);
+ ```
+ By default, the data will be deserialized using a default
+ serializer (the application serializer if it exists).
+ Alternatively, `pushPayload` will accept a model type which
+ will determine which serializer will process the payload.
+ ```app/serializers/application.js
+ import DS from 'ember-data';
+ export default DS.ActiveModelSerializer;
+ ```
+ ```app/serializers/post.js
+ import DS from 'ember-data';
+ export default DS.JSONSerializer;
+ ```
+ ```js
+ store.pushPayload(pushData); // Will use the application serializer
+ store.pushPayload('post', pushData); // Will use the post serializer
+ ```
+ @method pushPayload
+ @param {String} modelName Optionally, a model type used to determine which serializer will be used
+ @param {Object} inputPayload
+ */
+ pushPayload(modelName, inputPayload) {
+ var serializer = void 0;
+ var payload = void 0;
+ if (!inputPayload) {
+ payload = modelName;
+ serializer = defaultSerializer(this);
+ (true && !(typeof serializer.pushPayload === 'function') && Ember.assert(`You cannot use 'store#pushPayload' without a modelName unless your default serializer defines 'pushPayload'`, typeof serializer.pushPayload === 'function'));
+ } else {
+ payload = inputPayload;
+ (true && !(typeof modelName === 'string') && Ember.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));
+
+ var normalizedModelName = normalizeModelName(modelName);
+ serializer = this.serializerFor(normalizedModelName);
+ }
+ if (isEnabled('ds-pushpayload-return')) {
+ return serializer.pushPayload(this, payload);
+ } else {
+ serializer.pushPayload(this, payload);
+ }
+ },
+
+ /**
+ `normalize` converts a json payload into the normalized form that
+ [push](#method_push) expects.
+ Example
+ ```js
+ socket.on('message', function(message) {
+ let modelName = message.model;
+ let data = message.data;
+ store.push(store.normalize(modelName, data));
+ });
+ ```
+ @method normalize
+ @param {String} modelName The name of the model type for this payload
+ @param {Object} payload
+ @return {Object} The normalized payload
+ */
+ normalize(modelName, payload) {
+ (true && !(Ember.isPresent(modelName)) && Ember.assert(`You need to pass a model name to the store's normalize method`, Ember.isPresent(modelName)));
+ (true && !(typeof modelName === 'string') && Ember.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${Ember.inspect(modelName)}`, typeof modelName === 'string'));
+
+ var normalizedModelName = normalizeModelName(modelName);
+ var serializer = this.serializerFor(normalizedModelName);
+ var model = this._modelFor(normalizedModelName);
+ return serializer.normalize(model, payload);
+ },
+
+ /**
+ Build a brand new record for a given type, ID, and
+ initial data.
+ @method _buildInternalModel
+ @private
+ @param {String} modelName
+ @param {String} id
+ @param {Object} data
+ @return {InternalModel} internal model
+ */
+ _buildInternalModel(modelName, id, data) {
+ (true && !(typeof modelName === 'string') && Ember.assert(`You can no longer pass a modelClass as the first argument to store._buildInternalModel. Pass modelName instead.`, typeof modelName === 'string'));
+
+
+ var existingInternalModel = this._existingInternalModelForId(modelName, id);
+
+ (true && !(!existingInternalModel) && Ember.assert(`The id ${id} has already been used with another record for modelClass '${modelName}'.`, !existingInternalModel));
+
+ // lookupFactory should really return an object that creates
+ // instances with the injections applied
+
+ var internalModel = new InternalModel(modelName, id, this, data);
+
+ this._internalModelsFor(modelName).add(internalModel, id);
+
+ return internalModel;
+ },
+
+ _existingInternalModelForId(modelName, id) {
+ var internalModel = this._internalModelsFor(modelName).get(id);
+
+ if (internalModel && internalModel.hasScheduledDestroy()) {
+ // unloadRecord is async, if one attempts to unload + then sync create,
+ // we must ensure the unload is complete before starting the create
+ internalModel.destroySync();
+ internalModel = null;
+ }
+ return internalModel;
+ },
+
+ buildInternalModel(modelName, id, data) {
+ (true && !(false) && Ember.deprecate('buildInternalModel was documented as private and will be removed in the next version of Ember Data.', false, { id: 'ember-data.buildInternalModel', until: '2.17.0' }));
+
+ return this._buildInternalModel(modelName, id, data);
+ },
+
+ //Called by the state machine to notify the store that the record is ready to be interacted with
+ recordWasLoaded(record) {
+ this.recordArrayManager.recordWasLoaded(record);
+ },
+
+ // ...............
+ // . DESTRUCTION .
+ // ...............
+
+ /**
+ When a record is destroyed, this un-indexes it and
+ removes it from any record arrays so it can be GCed.
+ @method _removeFromIdMap
+ @private
+ @param {InternalModel} internalModel
+ */
+ _removeFromIdMap(internalModel) {
+ var recordMap = this._internalModelsFor(internalModel.modelName);
+ var id = internalModel.id;
+
+ recordMap.remove(internalModel, id);
+ },
+
+ // ......................
+ // . PER-TYPE ADAPTERS
+ // ......................
+
+ /**
+ Returns an instance of the adapter for a given type. For
+ example, `adapterFor('person')` will return an instance of
+ `App.PersonAdapter`.
+ If no `App.PersonAdapter` is found, this method will look
+ for an `App.ApplicationAdapter` (the default adapter for
+ your entire application).
+ If no `App.ApplicationAdapter` is found, it will return
+ the value of the `defaultAdapter`.
+ @method adapterFor
+ @public
+ @param {String} modelName
+ @return DS.Adapter
+ */
+ adapterFor(modelName) {
+ (true && !(Ember.isPresent(modelName)) && Ember.assert(`You need to pass a model name to the store's adapterFor method`, Ember.isPresent(modelName)));
+ (true && !(typeof modelName === 'string') && Ember.assert(`Passing classes to store.adapterFor has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));
+
+ var normalizedModelName = normalizeModelName(modelName);
+
+ var { _adapterCache } = this;
+ var adapter = _adapterCache[normalizedModelName];
+ if (adapter) {
+ return adapter;
+ }
+
+ var owner = getOwner(this);
+
+ adapter = owner.lookup(`adapter:${normalizedModelName}`);
+ if (adapter !== undefined) {
+ Ember.set(adapter, 'store', this);
+ _adapterCache[normalizedModelName] = adapter;
+ return adapter;
+ }
+
+ // no adapter found for the specific model, fallback and check for application adapter
+ adapter = _adapterCache.application || owner.lookup('adapter:application');
+ if (adapter !== undefined) {
+ Ember.set(adapter, 'store', this);
+ _adapterCache[normalizedModelName] = adapter;
+ _adapterCache.application = adapter;
+ return adapter;
+ }
+
+ // no model specific adapter or application adapter, check for an `adapter`
+ // property defined on the store
+ var adapterName = this.get('adapter');
+ adapter = _adapterCache[adapterName] || owner.lookup(`adapter:${adapterName}`);
+ if (adapter !== undefined) {
+ Ember.set(adapter, 'store', this);
+ _adapterCache[normalizedModelName] = adapter;
+ _adapterCache[adapterName] = adapter;
+ return adapter;
+ }
+
+ // final fallback, no model specific adapter, no application adapter, no
+ // `adapter` property on store: use json-api adapter
+ adapter = _adapterCache['-json-api'] || owner.lookup('adapter:-json-api');
+ Ember.set(adapter, 'store', this);
+ _adapterCache[normalizedModelName] = adapter;
+ _adapterCache['-json-api'] = adapter;
+ return adapter;
+ },
+
+ // ..............................
+ // . RECORD CHANGE NOTIFICATION .
+ // ..............................
+
+ /**
+ Returns an instance of the serializer for a given type. For
+ example, `serializerFor('person')` will return an instance of
+ `App.PersonSerializer`.
+ If no `App.PersonSerializer` is found, this method will look
+ for an `App.ApplicationSerializer` (the default serializer for
+ your entire application).
+ if no `App.ApplicationSerializer` is found, it will attempt
+ to get the `defaultSerializer` from the `PersonAdapter`
+ (`adapterFor('person')`).
+ If a serializer cannot be found on the adapter, it will fall back
+ to an instance of `DS.JSONSerializer`.
+ @method serializerFor
+ @public
+ @param {String} modelName the record to serialize
+ @return {DS.Serializer}
+ */
+ serializerFor(modelName) {
+ (true && !(Ember.isPresent(modelName)) && Ember.assert(`You need to pass a model name to the store's serializerFor method`, Ember.isPresent(modelName)));
+ (true && !(typeof modelName === 'string') && Ember.assert(`Passing classes to store.serializerFor has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));
+
+ var normalizedModelName = normalizeModelName(modelName);
+
+ var { _serializerCache } = this;
+ var serializer = _serializerCache[normalizedModelName];
+ if (serializer) {
+ return serializer;
+ }
+
+ var owner = getOwner(this);
+
+ serializer = owner.lookup(`serializer:${normalizedModelName}`);
+ if (serializer !== undefined) {
+ Ember.set(serializer, 'store', this);
+ _serializerCache[normalizedModelName] = serializer;
+ return serializer;
+ }
+
+ // no serializer found for the specific model, fallback and check for application serializer
+ serializer = _serializerCache.application || owner.lookup('serializer:application');
+ if (serializer !== undefined) {
+ Ember.set(serializer, 'store', this);
+ _serializerCache[normalizedModelName] = serializer;
+ _serializerCache.application = serializer;
+ return serializer;
+ }
+
+ // no model specific serializer or application serializer, check for the `defaultSerializer`
+ // property defined on the adapter
+ var adapter = this.adapterFor(modelName);
+ var serializerName = Ember.get(adapter, 'defaultSerializer');
+ serializer = _serializerCache[serializerName] || owner.lookup(`serializer:${serializerName}`);
+ if (serializer !== undefined) {
+ Ember.set(serializer, 'store', this);
+ _serializerCache[normalizedModelName] = serializer;
+ _serializerCache[serializerName] = serializer;
+ return serializer;
+ }
+
+ // final fallback, no model specific serializer, no application serializer, no
+ // `serializer` property on store: use json-api serializer
+ serializer = _serializerCache['-default'] || owner.lookup('serializer:-default');
+ Ember.set(serializer, 'store', this);
+ _serializerCache[normalizedModelName] = serializer;
+ _serializerCache['-default'] = serializer;
+
+ return serializer;
+ },
+
+ lookupAdapter(name) {
+ (true && !(false) && Ember.deprecate(`Use of lookupAdapter is deprecated, use adapterFor instead.`, false, {
+ id: 'ds.store.lookupAdapter',
+ until: '3.0'
+ }));
+
+ return this.adapterFor(name);
+ },
+
+ lookupSerializer(name) {
+ (true && !(false) && Ember.deprecate(`Use of lookupSerializer is deprecated, use serializerFor instead.`, false, {
+ id: 'ds.store.lookupSerializer',
+ until: '3.0'
+ }));
+
+ return this.serializerFor(name);
+ },
+
+ willDestroy() {
+ this._super(...arguments);
+ this._pushedInternalModels = null;
+ this.recordArrayManager.destroy();
+
+ this._adapterCache = null;
+ this._serializerCache = null;
+
+ this.unloadAll();
+ },
+
+ _updateRelationshipState(relationship) {
+ if (this._updatedRelationships.push(relationship) !== 1) {
+ return;
+ }
+
+ this._backburner.join(() => {
+ this._backburner.schedule('syncRelationships', this, this._flushUpdatedRelationships);
+ });
+ },
+
+ _flushUpdatedRelationships() {
+ var updated = this._updatedRelationships;
+
+ for (var i = 0, l = updated.length; i < l; i++) {
+ updated[i].flushCanonical();
+ }
+
+ updated.length = 0;
+ },
+
+ _updateInternalModel(internalModel) {
+ if (this._updatedInternalModels.push(internalModel) !== 1) {
+ return;
+ }
+
+ Ember.run.schedule('actions', this, this._flushUpdatedInternalModels);
+ },
+
+ _flushUpdatedInternalModels() {
+ var updated = this._updatedInternalModels;
+
+ for (var i = 0, l = updated.length; i < l; i++) {
+ updated[i]._triggerDeferredTriggers();
+ }
+
+ updated.length = 0;
+ },
+
+ _pushResourceIdentifier(relationship, resourceIdentifier) {
+ if (Ember.isNone(resourceIdentifier)) {
+ return;
+ }
+
+ (true && !(!Array.isArray(resourceIdentifier)) && Ember.assert(`A ${relationship.internalModel.modelName} record was pushed into the store with the value of ${relationship.key} being ${Ember.inspect(resourceIdentifier)}, but ${relationship.key} is a belongsTo relationship so the value must not be an array. You should probably check your data payload or serializer.`, !Array.isArray(resourceIdentifier)));
+
+ //TODO:Better asserts
+
+ return this._internalModelForId(resourceIdentifier.type, resourceIdentifier.id);
+ },
+
+ _pushResourceIdentifiers(relationship, resourceIdentifiers) {
+ if (Ember.isNone(resourceIdentifiers)) {
+ return;
+ }
+
+ (true && !(Array.isArray(resourceIdentifiers)) && Ember.assert(`A ${relationship.internalModel.modelName} record was pushed into the store with the value of ${relationship.key} being '${Ember.inspect(resourceIdentifiers)}', but ${relationship.key} is a hasMany relationship so the value must be an array. You should probably check your data payload or serializer.`, Array.isArray(resourceIdentifiers)));
+
+
+ var _internalModels = new Array(resourceIdentifiers.length);
+ for (var i = 0; i < resourceIdentifiers.length; i++) {
+ _internalModels[i] = this._pushResourceIdentifier(relationship, resourceIdentifiers[i]);
+ }
+ return _internalModels;
+ }
+});
+
+// Delegation to the adapter and promise management
+
+
+function defaultSerializer(store) {
+ return store.serializerFor('application');
+}
+
+function _commit(adapter, store, operation, snapshot) {
+ var internalModel = snapshot._internalModel;
+ var modelName = snapshot.modelName;
+ var modelClass = store._modelFor(modelName);
+ (true && !(adapter) && Ember.assert(`You tried to update a record but you have no adapter (for ${modelName})`, adapter));
+ (true && !(typeof adapter[operation] === 'function') && Ember.assert(`You tried to update a record but your adapter (for ${modelName}) does not implement '${operation}'`, typeof adapter[operation] === 'function'));
+
+ var promise = adapter[operation](store, modelClass, snapshot);
+ var serializer = serializerForAdapter(store, adapter, modelName);
+ var label = `DS: Extract and notify about ${operation} completion of ${internalModel}`;
+
+ (true && !(promise !== undefined) && Ember.assert(`Your adapter's '${operation}' method must return a value, but it returned 'undefined'`, promise !== undefined));
+
+
+ promise = Promise.resolve(promise, label);
+ promise = _guard(promise, _bind(_objectIsAlive, store));
+ promise = _guard(promise, _bind(_objectIsAlive, internalModel));
+
+ return promise.then(adapterPayload => {
+ /*
+ Note to future spelunkers hoping to optimize.
+ We rely on this `run` to create a run loop if needed
+ that `store._push` and `store.didSaveRecord` will both share.
+ We use `join` because it is often the case that we
+ have an outer run loop available still from the first
+ call to `store._push`;
+ */
+ store._backburner.join(() => {
+ var payload = void 0,
+ data = void 0;
+ if (adapterPayload) {
+ payload = normalizeResponseHelper(serializer, store, modelClass, adapterPayload, snapshot.id, operation);
+ if (payload.included) {
+ store._push({ data: null, included: payload.included });
+ }
+ data = payload.data;
+ }
+ store.didSaveRecord(internalModel, { data });
+ });
+
+ return internalModel;
+ }, function (error) {
+ if (error instanceof InvalidError) {
+ var errors = serializer.extractErrors(store, modelClass, error, snapshot.id);
+
+ store.recordWasInvalid(internalModel, errors);
+ } else {
+ store.recordWasError(internalModel, error);
+ }
+
+ throw error;
+ }, label);
+}
+
+function isInverseRelationshipInitialized(store, internalModel, data, key, modelNameToInverseMap) {
+ var relationshipData = data.relationships[key].data;
+
+ if (!relationshipData) {
+ // can't check inverse for eg { comments: { links: { related: URL }}}
+ return false;
+ }
+
+ var inverseMap = modelNameToInverseMap[internalModel.modelName];
+ if (!inverseMap) {
+ inverseMap = modelNameToInverseMap[internalModel.modelName] = Ember.get(internalModel.type, 'inverseMap');
+ }
+ var inverseRelationshipMetadata = inverseMap[key];
+ if (inverseRelationshipMetadata === undefined) {
+ inverseRelationshipMetadata = internalModel.type.inverseFor(key, store);
+ }
+
+ if (!inverseRelationshipMetadata) {
+ return false;
+ }
+
+ var { name: inverseRelationshipName } = inverseRelationshipMetadata;
+
+ if (Array.isArray(relationshipData)) {
+ for (var i = 0; i < relationshipData.length; ++i) {
+ var inverseInternalModel = store._internalModelsFor(relationshipData[i].type).get(relationshipData[i].id);
+ if (inverseInternalModel && inverseInternalModel._relationships.has(inverseRelationshipName)) {
+ return true;
+ }
+ }
+
+ return false;
+ } else {
+ var _inverseInternalModel = store._internalModelsFor(relationshipData.type).get(relationshipData.id);
+ return _inverseInternalModel && _inverseInternalModel._relationships.has(inverseRelationshipName);
+ }
+}
+
+function setupRelationships(store, internalModel, data, modelNameToInverseMap) {
+ Object.keys(data.relationships).forEach(relationshipName => {
+ var relationships = internalModel._relationships;
+ var relationshipRequiresNotification = relationships.has(relationshipName) || isInverseRelationshipInitialized(store, internalModel, data, relationshipName, modelNameToInverseMap);
+
+ if (relationshipRequiresNotification) {
+ var relationshipData = data.relationships[relationshipName];
+ relationships.get(relationshipName).push(relationshipData, false);
+ }
+
+ // in debug, assert payload validity eagerly
+ {
+ var relationshipMeta = Ember.get(internalModel.type, 'relationshipsByName').get(relationshipName);
+ var _relationshipData = data.relationships[relationshipName];
+ if (!_relationshipData || !relationshipMeta) {
+ return;
+ }
+
+ if (_relationshipData.links) {
+ var isAsync = relationshipMeta.options && relationshipMeta.options.async !== false;
+ (true && Ember.warn(`You pushed a record of type '${internalModel.type.modelName}' with a relationship '${relationshipName}' configured as 'async: false'. You've included a link but no primary data, this may be an error in your payload.`, isAsync || _relationshipData.data, {
+ id: 'ds.store.push-link-for-sync-relationship'
+ }));
+ } else if (_relationshipData.data) {
+ if (relationshipMeta.kind === 'belongsTo') {
+ (true && !(!Array.isArray(_relationshipData.data)) && Ember.assert(`A ${internalModel.type.modelName} record was pushed into the store with the value of ${relationshipName} being ${Ember.inspect(_relationshipData.data)}, but ${relationshipName} is a belongsTo relationship so the value must not be an array. You should probably check your data payload or serializer.`, !Array.isArray(_relationshipData.data)));
+ } else if (relationshipMeta.kind === 'hasMany') {
+ (true && !(Array.isArray(_relationshipData.data)) && Ember.assert(`A ${internalModel.type.modelName} record was pushed into the store with the value of ${relationshipName} being '${Ember.inspect(_relationshipData.data)}', but ${relationshipName} is a hasMany relationship so the value must be an array. You should probably check your data payload or serializer.`, Array.isArray(_relationshipData.data)));
+ }
+ }
+ }
+ });
+}
+
+var Store$1 = Store;
+
+/**
+ @module ember-data
+*/
+
+/**
+ All Ember Data classes, methods and functions are defined inside of this namespace.
+
+ @class DS
+ @static
+*/
+
+/**
+ @property VERSION
+ @type String
+ @static
+*/
+var DS = Ember.Namespace.create({
+ VERSION: VERSION,
+ name: "DS"
+});
+
+if (Ember.libraries) {
+ Ember.libraries.registerCoreLibrary('Ember Data', DS.VERSION);
+}
+
+/**
+ `DS.belongsTo` is used to define One-To-One and One-To-Many
+ relationships on a [DS.Model](/api/data/classes/DS.Model.html).
+
+
+ `DS.belongsTo` takes an optional hash as a second parameter, currently
+ supported options are:
+
+ - `async`: A boolean value used to explicitly declare this to be an async relationship.
+ - `inverse`: A string used to identify the inverse property on a
+ related model in a One-To-Many relationship. See [Explicit Inverses](#toc_explicit-inverses)
+
+ #### One-To-One
+ To declare a one-to-one relationship between two models, use
+ `DS.belongsTo`:
+
+ ```app/models/user.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ profile: DS.belongsTo('profile')
+ });
+ ```
+
+ ```app/models/profile.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ user: DS.belongsTo('user')
+ });
+ ```
+
+ #### One-To-Many
+ To declare a one-to-many relationship between two models, use
+ `DS.belongsTo` in combination with `DS.hasMany`, like this:
+
+ ```app/models/post.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ comments: DS.hasMany('comment')
+ });
+ ```
+
+ ```app/models/comment.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ post: DS.belongsTo('post')
+ });
+ ```
+
+ You can avoid passing a string as the first parameter. In that case Ember Data
+ will infer the type from the key name.
+
+ ```app/models/comment.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ post: DS.belongsTo()
+ });
+ ```
+
+ will lookup for a Post type.
+
+ @namespace
+ @method belongsTo
+ @for DS
+ @param {String} modelName (optional) type of the relationship
+ @param {Object} options (optional) a hash of options
+ @return {Ember.computed} relationship
+*/
+function belongsTo(modelName, options) {
+ var opts = void 0,
+ userEnteredModelName = void 0;
+ if (typeof modelName === 'object') {
+ opts = modelName;
+ userEnteredModelName = undefined;
+ } else {
+ opts = options;
+ userEnteredModelName = modelName;
+ }
+
+ if (typeof userEnteredModelName === 'string') {
+ userEnteredModelName = normalizeModelName(userEnteredModelName);
+ }
+
+ (true && !(typeof userEnteredModelName === 'string' || typeof userEnteredModelName === 'undefined') && Ember.assert("The first argument to DS.belongsTo must be a string representing a model type key, not an instance of " + Ember.inspect(userEnteredModelName) + ". E.g., to define a relation to the Person model, use DS.belongsTo('person')", typeof userEnteredModelName === 'string' || typeof userEnteredModelName === 'undefined'));
+
+
+ opts = opts || {};
+
+ var meta = {
+ type: userEnteredModelName,
+ isRelationship: true,
+ options: opts,
+ kind: 'belongsTo',
+ name: 'Belongs To',
+ key: null
+ };
+
+ return Ember.computed({
+ get(key) {
+ if (opts.hasOwnProperty('serialize')) {
+ (true && Ember.warn(`You provided a serialize option on the "${key}" property in the "${this._internalModel.modelName}" class, this belongs in the serializer. See DS.Serializer and it's implementations https://emberjs.com/api/data/classes/DS.Serializer.html`, false, {
+ id: 'ds.model.serialize-option-in-belongs-to'
+ }));
+ }
+
+ if (opts.hasOwnProperty('embedded')) {
+ (true && Ember.warn(`You provided an embedded option on the "${key}" property in the "${this._internalModel.modelName}" class, this belongs in the serializer. See DS.EmbeddedRecordsMixin https://emberjs.com/api/data/classes/DS.EmbeddedRecordsMixin.html`, false, {
+ id: 'ds.model.embedded-option-in-belongs-to'
+ }));
+ }
+
+ return this._internalModel._relationships.get(key).getRecord();
+ },
+ set(key, value) {
+ if (value === undefined) {
+ value = null;
+ }
+ if (value && value.then) {
+ this._internalModel._relationships.get(key).setRecordPromise(value);
+ } else if (value) {
+ this._internalModel._relationships.get(key).setInternalModel(value._internalModel);
+ } else {
+ this._internalModel._relationships.get(key).setInternalModel(value);
+ }
+
+ return this._internalModel._relationships.get(key).getRecord();
+ }
+ }).meta(meta);
+}
+
+/*
+ We're using this to detect arrays and "array-like" objects.
+
+ This is a copy of the `isArray` method found in `ember-runtime/utils` as we're
+ currently unable to import non-exposed modules.
+
+ This method was previously exposed as `Ember.isArray` but since
+ https://github.com/emberjs/ember.js/pull/11463 `Ember.isArray` is an alias of
+ `Array.isArray` hence removing the "array-like" part.
+ */
+function isArrayLike(obj) {
+ if (!obj || obj.setInterval) {
+ return false;
+ }
+ if (Array.isArray(obj)) {
+ return true;
+ }
+ if (Ember.Array.detect(obj)) {
+ return true;
+ }
+
+ var type = Ember.typeOf(obj);
+ if ('array' === type) {
+ return true;
+ }
+ if (obj.length !== undefined && 'object' === type) {
+ return true;
+ }
+ return false;
+}
+
+/**
+ `DS.hasMany` is used to define One-To-Many and Many-To-Many
+ relationships on a [DS.Model](/api/data/classes/DS.Model.html).
+
+ `DS.hasMany` takes an optional hash as a second parameter, currently
+ supported options are:
+
+ - `async`: A boolean value used to explicitly declare this to be an async relationship.
+ - `inverse`: A string used to identify the inverse property on a related model.
+
+ #### One-To-Many
+ To declare a one-to-many relationship between two models, use
+ `DS.belongsTo` in combination with `DS.hasMany`, like this:
+
+ ```app/models/post.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ comments: DS.hasMany('comment')
+ });
+ ```
+
+ ```app/models/comment.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ post: DS.belongsTo('post')
+ });
+ ```
+
+ #### Many-To-Many
+ To declare a many-to-many relationship between two models, use
+ `DS.hasMany`:
+
+ ```app/models/post.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ tags: DS.hasMany('tag')
+ });
+ ```
+
+ ```app/models/tag.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ posts: DS.hasMany('post')
+ });
+ ```
+
+ You can avoid passing a string as the first parameter. In that case Ember Data
+ will infer the type from the singularized key name.
+
+ ```app/models/post.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ tags: DS.hasMany()
+ });
+ ```
+
+ will lookup for a Tag type.
+
+ #### Explicit Inverses
+
+ Ember Data will do its best to discover which relationships map to
+ one another. In the one-to-many code above, for example, Ember Data
+ can figure out that changing the `comments` relationship should update
+ the `post` relationship on the inverse because post is the only
+ relationship to that model.
+
+ However, sometimes you may have multiple `belongsTo`/`hasMany` for the
+ same type. You can specify which property on the related model is
+ the inverse using `DS.hasMany`'s `inverse` option:
+
+ ```app/models/comment.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ onePost: DS.belongsTo('post'),
+ twoPost: DS.belongsTo('post'),
+ redPost: DS.belongsTo('post'),
+ bluePost: DS.belongsTo('post')
+ });
+ ```
+
+ ```app/models/post.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ comments: DS.hasMany('comment', {
+ inverse: 'redPost'
+ })
+ });
+ ```
+
+ You can also specify an inverse on a `belongsTo`, which works how
+ you'd expect.
+
+ @namespace
+ @method hasMany
+ @for DS
+ @param {String} type (optional) type of the relationship
+ @param {Object} options (optional) a hash of options
+ @return {Ember.computed} relationship
+*/
+function hasMany(type, options) {
+ if (typeof type === 'object') {
+ options = type;
+ type = undefined;
+ }
+
+ (true && !(typeof type === 'string' || typeof type === 'undefined') && Ember.assert(`The first argument to DS.hasMany must be a string representing a model type key, not an instance of ${Ember.inspect(type)}. E.g., to define a relation to the Comment model, use DS.hasMany('comment')`, typeof type === 'string' || typeof type === 'undefined'));
+
+
+ options = options || {};
+
+ if (typeof type === 'string') {
+ type = normalizeModelName(type);
+ }
+
+ // Metadata about relationships is stored on the meta of
+ // the relationship. This is used for introspection and
+ // serialization. Note that `key` is populated lazily
+ // the first time the CP is called.
+ var meta = {
+ type,
+ options,
+ isRelationship: true,
+ kind: 'hasMany',
+ name: 'Has Many',
+ key: null
+ };
+
+ return Ember.computed({
+ get(key) {
+ return this._internalModel._relationships.get(key).getRecords();
+ },
+ set(key, records) {
+ (true && !(isArrayLike(records)) && Ember.assert(`You must pass an array of records to set a hasMany relationship`, isArrayLike(records)));
+ (true && !(function () {
+ return Ember.A(records).every(record => record.hasOwnProperty('_internalModel') === true);
+ }()) && Ember.assert(`All elements of a hasMany relationship must be instances of DS.Model, you passed ${Ember.inspect(records)}`, function () {
+ return Ember.A(records).every(record => record.hasOwnProperty('_internalModel') === true);
+ }()));
+
+
+ var relationship = this._internalModel._relationships.get(key);
+ relationship.clear();
+ relationship.addInternalModels(records.map(record => Ember.get(record, '_internalModel')));
+ return relationship.getRecords();
+ }
+ }).meta(meta);
+}
+
+/**
+
+ WARNING: This interface is likely to change in order to accomodate https://github.com/emberjs/rfcs/pull/4
+
+ ## Using BuildURLMixin
+
+ To use url building, include the mixin when extending an adapter, and call `buildURL` where needed.
+ The default behaviour is designed for RESTAdapter.
+
+ ### Example
+
+ ```javascript
+ export default DS.Adapter.extend(BuildURLMixin, {
+ findRecord: function(store, type, id, snapshot) {
+ var url = this.buildURL(type.modelName, id, snapshot, 'findRecord');
+ return this.ajax(url, 'GET');
+ }
+ });
+ ```
+
+ ### Attributes
+
+ The `host` and `namespace` attributes will be used if defined, and are optional.
+
+ @class BuildURLMixin
+ @namespace DS
+*/
+var buildUrlMixin = Ember.Mixin.create({
+ /**
+ Builds a URL for a given type and optional ID.
+ By default, it pluralizes the type's name (for example, 'post'
+ becomes 'posts' and 'person' becomes 'people'). To override the
+ pluralization see [pathForType](#method_pathForType).
+ If an ID is specified, it adds the ID to the path generated
+ for the type, separated by a `/`.
+ When called by RESTAdapter.findMany() the `id` and `snapshot` parameters
+ will be arrays of ids and snapshots.
+ @method buildURL
+ @param {String} modelName
+ @param {(String|Array|Object)} id single id or array of ids or query
+ @param {(DS.Snapshot|Array)} snapshot single snapshot or array of snapshots
+ @param {String} requestType
+ @param {Object} query object of query parameters to send for query requests.
+ @return {String} url
+ */
+ buildURL(modelName, id, snapshot, requestType, query) {
+ switch (requestType) {
+ case 'findRecord':
+ return this.urlForFindRecord(id, modelName, snapshot);
+ case 'findAll':
+ return this.urlForFindAll(modelName, snapshot);
+ case 'query':
+ return this.urlForQuery(query, modelName);
+ case 'queryRecord':
+ return this.urlForQueryRecord(query, modelName);
+ case 'findMany':
+ return this.urlForFindMany(id, modelName, snapshot);
+ case 'findHasMany':
+ return this.urlForFindHasMany(id, modelName, snapshot);
+ case 'findBelongsTo':
+ return this.urlForFindBelongsTo(id, modelName, snapshot);
+ case 'createRecord':
+ return this.urlForCreateRecord(modelName, snapshot);
+ case 'updateRecord':
+ return this.urlForUpdateRecord(id, modelName, snapshot);
+ case 'deleteRecord':
+ return this.urlForDeleteRecord(id, modelName, snapshot);
+ default:
+ return this._buildURL(modelName, id);
+ }
+ },
+
+ /**
+ @method _buildURL
+ @private
+ @param {String} modelName
+ @param {String} id
+ @return {String} url
+ */
+ _buildURL(modelName, id) {
+ var path = void 0;
+ var url = [];
+ var host = Ember.get(this, 'host');
+ var prefix = this.urlPrefix();
+
+ if (modelName) {
+ path = this.pathForType(modelName);
+ if (path) {
+ url.push(path);
+ }
+ }
+
+ if (id) {
+ url.push(encodeURIComponent(id));
+ }
+ if (prefix) {
+ url.unshift(prefix);
+ }
+
+ url = url.join('/');
+ if (!host && url && url.charAt(0) !== '/') {
+ url = '/' + url;
+ }
+
+ return url;
+ },
+
+ /**
+ Builds a URL for a `store.findRecord(type, id)` call.
+ Example:
+ ```app/adapters/user.js
+ import DS from 'ember-data';
+ export default DS.JSONAPIAdapter.extend({
+ urlForFindRecord(id, modelName, snapshot) {
+ let baseUrl = this.buildURL(modelName, id, snapshot);
+ return `${baseUrl}/users/${snapshot.adapterOptions.user_id}/playlists/${id}`;
+ }
+ });
+ ```
+ @method urlForFindRecord
+ @param {String} id
+ @param {String} modelName
+ @param {DS.Snapshot} snapshot
+ @return {String} url
+ */
+ urlForFindRecord(id, modelName, snapshot) {
+ return this._buildURL(modelName, id);
+ },
+
+ /**
+ Builds a URL for a `store.findAll(type)` call.
+ Example:
+ ```app/adapters/comment.js
+ import DS from 'ember-data';
+ export default DS.JSONAPIAdapter.extend({
+ urlForFindAll(modelName, snapshot) {
+ return 'data/comments.json';
+ }
+ });
+ ```
+ @method urlForFindAll
+ @param {String} modelName
+ @param {DS.SnapshotRecordArray} snapshot
+ @return {String} url
+ */
+ urlForFindAll(modelName, snapshot) {
+ return this._buildURL(modelName);
+ },
+
+ /**
+ Builds a URL for a `store.query(type, query)` call.
+ Example:
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ export default DS.RESTAdapter.extend({
+ host: 'https://api.github.com',
+ urlForQuery (query, modelName) {
+ switch(modelName) {
+ case 'repo':
+ return `https://api.github.com/orgs/${query.orgId}/repos`;
+ default:
+ return this._super(...arguments);
+ }
+ }
+ });
+ ```
+ @method urlForQuery
+ @param {Object} query
+ @param {String} modelName
+ @return {String} url
+ */
+ urlForQuery(query, modelName) {
+ return this._buildURL(modelName);
+ },
+
+ /**
+ Builds a URL for a `store.queryRecord(type, query)` call.
+ Example:
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ export default DS.RESTAdapter.extend({
+ urlForQueryRecord({ slug }, modelName) {
+ let baseUrl = this.buildURL();
+ return `${baseUrl}/${encodeURIComponent(slug)}`;
+ }
+ });
+ ```
+ @method urlForQueryRecord
+ @param {Object} query
+ @param {String} modelName
+ @return {String} url
+ */
+ urlForQueryRecord(query, modelName) {
+ return this._buildURL(modelName);
+ },
+
+ /**
+ Builds a URL for coalesceing multiple `store.findRecord(type, id)`
+ records into 1 request when the adapter's `coalesceFindRequests`
+ property is true.
+ Example:
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ export default DS.RESTAdapter.extend({
+ urlForFindMany(ids, modelName) {
+ let baseUrl = this.buildURL();
+ return `${baseUrl}/coalesce`;
+ }
+ });
+ ```
+ @method urlForFindMany
+ @param {Array} ids
+ @param {String} modelName
+ @param {Array} snapshots
+ @return {String} url
+ */
+ urlForFindMany(ids, modelName, snapshots) {
+ return this._buildURL(modelName);
+ },
+
+ /**
+ Builds a URL for fetching a async hasMany relationship when a url
+ is not provided by the server.
+ Example:
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ export default DS.JSONAPIAdapter.extend({
+ urlForFindHasMany(id, modelName, snapshot) {
+ let baseUrl = this.buildURL(id, modelName);
+ return `${baseUrl}/relationships`;
+ }
+ });
+ ```
+ @method urlForFindHasMany
+ @param {String} id
+ @param {String} modelName
+ @param {DS.Snapshot} snapshot
+ @return {String} url
+ */
+ urlForFindHasMany(id, modelName, snapshot) {
+ return this._buildURL(modelName, id);
+ },
+
+ /**
+ Builds a URL for fetching a async belongsTo relationship when a url
+ is not provided by the server.
+ Example:
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ export default DS.JSONAPIAdapter.extend({
+ urlForFindBelongsTo(id, modelName, snapshot) {
+ let baseUrl = this.buildURL(id, modelName);
+ return `${baseUrl}/relationships`;
+ }
+ });
+ ```
+ @method urlForFindBelongsTo
+ @param {String} id
+ @param {String} modelName
+ @param {DS.Snapshot} snapshot
+ @return {String} url
+ */
+ urlForFindBelongsTo(id, modelName, snapshot) {
+ return this._buildURL(modelName, id);
+ },
+
+ /**
+ Builds a URL for a `record.save()` call when the record was created
+ locally using `store.createRecord()`.
+ Example:
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ export default DS.RESTAdapter.extend({
+ urlForCreateRecord(modelName, snapshot) {
+ return this._super(...arguments) + '/new';
+ }
+ });
+ ```
+ @method urlForCreateRecord
+ @param {String} modelName
+ @param {DS.Snapshot} snapshot
+ @return {String} url
+ */
+ urlForCreateRecord(modelName, snapshot) {
+ return this._buildURL(modelName);
+ },
+
+ /**
+ Builds a URL for a `record.save()` call when the record has been update locally.
+ Example:
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ export default DS.RESTAdapter.extend({
+ urlForUpdateRecord(id, modelName, snapshot) {
+ return `/${id}/feed?access_token=${snapshot.adapterOptions.token}`;
+ }
+ });
+ ```
+ @method urlForUpdateRecord
+ @param {String} id
+ @param {String} modelName
+ @param {DS.Snapshot} snapshot
+ @return {String} url
+ */
+ urlForUpdateRecord(id, modelName, snapshot) {
+ return this._buildURL(modelName, id);
+ },
+
+ /**
+ Builds a URL for a `record.save()` call when the record has been deleted locally.
+ Example:
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ export default DS.RESTAdapter.extend({
+ urlForDeleteRecord(id, modelName, snapshot) {
+ return this._super(...arguments) + '/destroy';
+ }
+ });
+ ```
+ @method urlForDeleteRecord
+ @param {String} id
+ @param {String} modelName
+ @param {DS.Snapshot} snapshot
+ @return {String} url
+ */
+ urlForDeleteRecord(id, modelName, snapshot) {
+ return this._buildURL(modelName, id);
+ },
+
+ /**
+ @method urlPrefix
+ @private
+ @param {String} path
+ @param {String} parentURL
+ @return {String} urlPrefix
+ */
+ urlPrefix(path, parentURL) {
+ var host = Ember.get(this, 'host');
+ var namespace = Ember.get(this, 'namespace');
+
+ if (!host || host === '/') {
+ host = '';
+ }
+
+ if (path) {
+ // Protocol relative url
+ if (/^\/\//.test(path) || /http(s)?:\/\//.test(path)) {
+ // Do nothing, the full host is already included.
+ return path;
+
+ // Absolute path
+ } else if (path.charAt(0) === '/') {
+ return `${host}${path}`;
+ // Relative path
+ } else {
+ return `${parentURL}/${path}`;
+ }
+ }
+
+ // No path provided
+ var url = [];
+ if (host) {
+ url.push(host);
+ }
+ if (namespace) {
+ url.push(namespace);
+ }
+ return url.join('/');
+ },
+
+ /**
+ Determines the pathname for a given type.
+ By default, it pluralizes the type's name (for example,
+ 'post' becomes 'posts' and 'person' becomes 'people').
+ ### Pathname customization
+ For example if you have an object LineItem with an
+ endpoint of "/line_items/".
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ import { decamelize } from '@ember/string';
+ import { pluralize } from 'ember-inflector';
+ export default DS.RESTAdapter.extend({
+ pathForType: function(modelName) {
+ var decamelized = decamelize(modelName);
+ return pluralize(decamelized);
+ }
+ });
+ ```
+ @method pathForType
+ @param {String} modelName
+ @return {String} path
+ **/
+ pathForType(modelName) {
+ var camelized = Ember.String.camelize(modelName);
+ return emberInflector.pluralize(camelized);
+ }
+});
+
+var CLRF = '\u000d\u000a';
+
+function parseResponseHeaders(headersString) {
+ var headers = Object.create(null);
+
+ if (!headersString) {
+ return headers;
+ }
+
+ var headerPairs = headersString.split(CLRF);
+ for (var i = 0; i < headerPairs.length; i++) {
+ var header = headerPairs[i];
+ var j = 0;
+ var foundSep = false;
+
+ for (; j < header.length; j++) {
+ if (header.charCodeAt(j) === 58 /* ':' */) {
+ foundSep = true;
+ break;
+ }
+ }
+
+ if (foundSep === false) {
+ continue;
+ }
+
+ var field = header.substring(0, j).trim();
+ var value = header.substring(j + 1, header.length).trim();
+
+ if (value) {
+ headers[field] = value;
+ }
+ }
+
+ return headers;
+}
+
+/*
+ Extend `Ember.DataAdapter` with ED specific code.
+
+ @class DebugAdapter
+ @namespace DS
+ @extends Ember.DataAdapter
+ @private
+*/
+/**
+ @module ember-data
+*/
+var debugAdapter = Ember.DataAdapter.extend({
+ getFilters() {
+ return [{ name: 'isNew', desc: 'New' }, { name: 'isModified', desc: 'Modified' }, { name: 'isClean', desc: 'Clean' }];
+ },
+
+ detect(typeClass) {
+ return typeClass !== Model && Model.detect(typeClass);
+ },
+
+ columnsForType(typeClass) {
+ var columns = [{
+ name: 'id',
+ desc: 'Id'
+ }];
+ var count = 0;
+ var self = this;
+ Ember.get(typeClass, 'attributes').forEach((meta, name) => {
+ if (count++ > self.attributeLimit) {
+ return false;
+ }
+ var desc = Ember.String.capitalize(Ember.String.underscore(name).replace('_', ' '));
+ columns.push({ name: name, desc: desc });
+ });
+ return columns;
+ },
+
+ getRecords(modelClass, modelName) {
+ if (arguments.length < 2) {
+ // Legacy Ember.js < 1.13 support
+ var containerKey = modelClass._debugContainerKey;
+ if (containerKey) {
+ var match = containerKey.match(/model:(.*)/);
+ if (match !== null) {
+ modelName = match[1];
+ }
+ }
+ }
+ (true && !(!!modelName) && Ember.assert("Cannot find model name. Please upgrade to Ember.js >= 1.13 for Ember Inspector support", !!modelName));
+
+ return this.get('store').peekAll(modelName);
+ },
+
+ getRecordColumnValues(record) {
+ var count = 0;
+ var columnValues = { id: Ember.get(record, 'id') };
+
+ record.eachAttribute(key => {
+ if (count++ > this.attributeLimit) {
+ return false;
+ }
+ columnValues[key] = Ember.get(record, key);
+ });
+ return columnValues;
+ },
+
+ getRecordKeywords(record) {
+ var keywords = [];
+ var keys = Ember.A(['id']);
+ record.eachAttribute(key => keys.push(key));
+ keys.forEach(key => keywords.push(Ember.get(record, key)));
+ return keywords;
+ },
+
+ getRecordFilterValues(record) {
+ return {
+ isNew: record.get('isNew'),
+ isModified: record.get('hasDirtyAttributes') && !record.get('isNew'),
+ isClean: !record.get('hasDirtyAttributes')
+ };
+ },
+
+ getRecordColor(record) {
+ var color = 'black';
+ if (record.get('isNew')) {
+ color = 'green';
+ } else if (record.get('hasDirtyAttributes')) {
+ color = 'blue';
+ }
+ return color;
+ },
+
+ observeRecord(record, recordUpdated) {
+ var releaseMethods = Ember.A();
+ var keysToObserve = Ember.A(['id', 'isNew', 'hasDirtyAttributes']);
+
+ record.eachAttribute(key => keysToObserve.push(key));
+ var adapter = this;
+
+ keysToObserve.forEach(function (key) {
+ var handler = function () {
+ recordUpdated(adapter.wrapRecord(record));
+ };
+ Ember.addObserver(record, key, handler);
+ releaseMethods.push(function () {
+ Ember.removeObserver(record, key, handler);
+ });
+ });
+
+ var release = function () {
+ releaseMethods.forEach(fn => fn());
+ };
+
+ return release;
+ }
+});
+
+// public
+
+exports.Model = Model;
+exports.Errors = Errors;
+exports.Store = Store$1;
+exports.DS = DS;
+exports.belongsTo = belongsTo;
+exports.hasMany = hasMany;
+exports.BuildURLMixin = buildUrlMixin;
+exports.Snapshot = Snapshot;
+exports.AdapterError = AdapterError;
+exports.InvalidError = InvalidError;
+exports.UnauthorizedError = UnauthorizedError;
+exports.ForbiddenError = ForbiddenError;
+exports.NotFoundError = NotFoundError;
+exports.ConflictError = ConflictError;
+exports.ServerError = ServerError;
+exports.TimeoutError = TimeoutError;
+exports.AbortError = AbortError;
+exports.errorsHashToArray = errorsHashToArray;
+exports.errorsArrayToHash = errorsArrayToHash;
+exports.normalizeModelName = normalizeModelName;
+exports.getOwner = getOwner;
+exports.modelHasAttributeOrRelationshipNamedType = modelHasAttributeOrRelationshipNamedType;
+exports.coerceId = coerceId;
+exports.parseResponseHeaders = parseResponseHeaders;
+exports.isEnabled = isEnabled;
+exports.RootState = RootState$1;
+exports.InternalModel = InternalModel;
+exports.PromiseArray = PromiseArray;
+exports.PromiseObject = PromiseObject;
+exports.PromiseManyArray = PromiseManyArray;
+exports.RecordArray = RecordArray;
+exports.FilteredRecordArray = FilteredRecordArray;
+exports.AdapterPopulatedRecordArray = AdapterPopulatedRecordArray;
+exports.ManyArray = ManyArray;
+exports.RecordArrayManager = RecordArrayManager;
+exports.Relationship = Relationship;
+exports.DebugAdapter = debugAdapter;
+exports.diffArray = diffArray;
+exports.RelationshipPayloadsManager = RelationshipPayloadsManager;
+exports.RelationshipPayloads = RelationshipPayloads;
+exports.SnapshotRecordArray = SnapshotRecordArray;
+
+Object.defineProperty(exports, '__esModule', { value: true });
+
+});
+
+;define('ember-data/adapter', ['exports'], function (exports) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = Ember.Object.extend({
+
+ /**
+ If you would like your adapter to use a custom serializer you can
+ set the `defaultSerializer` property to be the name of the custom
+ serializer.
+ Note the `defaultSerializer` serializer has a lower priority than
+ a model specific serializer (i.e. `PostSerializer`) or the
+ `application` serializer.
+ ```app/adapters/django.js
+ import DS from 'ember-data';
+ export default DS.Adapter.extend({
+ defaultSerializer: 'django'
+ });
+ ```
+ @property defaultSerializer
+ @type {String}
+ */
+ defaultSerializer: '-default',
+
+ /**
+ The `findRecord()` method is invoked when the store is asked for a record that
+ has not previously been loaded. In response to `findRecord()` being called, you
+ should query your persistence layer for a record with the given ID. The `findRecord`
+ method should return a promise that will resolve to a JavaScript object that will be
+ normalized by the serializer.
+ Here is an example `findRecord` implementation:
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ import RSVP from 'RSVP';
+ import $ from 'jquery';
+ export default DS.Adapter.extend({
+ findRecord(store, type, id, snapshot) {
+ return new RSVP.Promise(function(resolve, reject) {
+ $.getJSON(`/${type.modelName}/${id}`).then(function(data) {
+ resolve(data);
+ }, function(jqXHR) {
+ reject(jqXHR);
+ });
+ });
+ }
+ });
+ ```
+ @method findRecord
+ @param {DS.Store} store
+ @param {DS.Model} type
+ @param {String} id
+ @param {DS.Snapshot} snapshot
+ @return {Promise} promise
+ */
+ findRecord: null,
+
+ /**
+ The `findAll()` method is used to retrieve all records for a given type.
+ Example
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ import RSVP from 'RSVP';
+ import $ from 'jquery';
+ export default DS.Adapter.extend({
+ findAll(store, type, sinceToken) {
+ let query = { since: sinceToken };
+ return new RSVP.Promise(function(resolve, reject) {
+ $.getJSON(`/${type.modelName}`, query).then(function(data) {
+ resolve(data);
+ }, function(jqXHR) {
+ reject(jqXHR);
+ });
+ });
+ }
+ });
+ ```
+ @method findAll
+ @param {DS.Store} store
+ @param {DS.Model} type
+ @param {String} sinceToken
+ @param {DS.SnapshotRecordArray} snapshotRecordArray
+ @return {Promise} promise
+ */
+ findAll: null,
+
+ /**
+ This method is called when you call `query` on the store.
+ Example
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ import RSVP from 'RSVP';
+ import $ from 'jquery';
+ export default DS.Adapter.extend({
+ query(store, type, query) {
+ return new RSVP.Promise(function(resolve, reject) {
+ $.getJSON(`/${type.modelName}`, query).then(function(data) {
+ resolve(data);
+ }, function(jqXHR) {
+ reject(jqXHR);
+ });
+ });
+ }
+ });
+ ```
+ @method query
+ @param {DS.Store} store
+ @param {DS.Model} type
+ @param {Object} query
+ @param {DS.AdapterPopulatedRecordArray} recordArray
+ @return {Promise} promise
+ */
+ query: null,
+
+ /**
+ The `queryRecord()` method is invoked when the store is asked for a single
+ record through a query object.
+ In response to `queryRecord()` being called, you should always fetch fresh
+ data. Once found, you can asynchronously call the store's `push()` method
+ to push the record into the store.
+ Here is an example `queryRecord` implementation:
+ Example
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ import RSVP from 'RSVP';
+ import $ from 'jquery';
+ export default DS.Adapter.extend(DS.BuildURLMixin, {
+ queryRecord(store, type, query) {
+ return new RSVP.Promise(function(resolve, reject) {
+ $.getJSON(`/${type.modelName}`, query).then(function(data) {
+ resolve(data);
+ }, function(jqXHR) {
+ reject(jqXHR);
+ });
+ });
+ }
+ });
+ ```
+ @method queryRecord
+ @param {DS.Store} store
+ @param {subclass of DS.Model} type
+ @param {Object} query
+ @return {Promise} promise
+ */
+ queryRecord: null,
+
+ /**
+ If the globally unique IDs for your records should be generated on the client,
+ implement the `generateIdForRecord()` method. This method will be invoked
+ each time you create a new record, and the value returned from it will be
+ assigned to the record's `primaryKey`.
+ Most traditional REST-like HTTP APIs will not use this method. Instead, the ID
+ of the record will be set by the server, and your adapter will update the store
+ with the new ID when it calls `didCreateRecord()`. Only implement this method if
+ you intend to generate record IDs on the client-side.
+ The `generateIdForRecord()` method will be invoked with the requesting store as
+ the first parameter and the newly created record as the second parameter:
+ ```javascript
+ import DS from 'ember-data';
+ import { v4 } from 'uuid';
+ export default DS.Adapter.extend({
+ generateIdForRecord(store, inputProperties) {
+ return v4();
+ }
+ });
+ ```
+ @method generateIdForRecord
+ @param {DS.Store} store
+ @param {DS.Model} type the DS.Model class of the record
+ @param {Object} inputProperties a hash of properties to set on the
+ newly created record.
+ @return {(String|Number)} id
+ */
+ generateIdForRecord: null,
+
+ /**
+ Proxies to the serializer's `serialize` method.
+ Example
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ export default DS.Adapter.extend({
+ createRecord(store, type, snapshot) {
+ let data = this.serialize(snapshot, { includeId: true });
+ let url = `/${type.modelName}`;
+ // ...
+ }
+ });
+ ```
+ @method serialize
+ @param {DS.Snapshot} snapshot
+ @param {Object} options
+ @return {Object} serialized snapshot
+ */
+ serialize(snapshot, options) {
+ return snapshot.serialize(options);
+ },
+
+ /**
+ Implement this method in a subclass to handle the creation of
+ new records.
+ Serializes the record and sends it to the server.
+ Example
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ import { run } from '@ember/runloop';
+ import RSVP from 'RSVP';
+ import $ from 'jquery';
+ export default DS.Adapter.extend({
+ createRecord(store, type, snapshot) {
+ let data = this.serialize(snapshot, { includeId: true });
+ return new RSVP.Promise(function(resolve, reject) {
+ $.ajax({
+ type: 'POST',
+ url: `/${type.modelName}`,
+ dataType: 'json',
+ data: data
+ }).then(function(data) {
+ run(null, resolve, data);
+ }, function(jqXHR) {
+ jqXHR.then = null; // tame jQuery's ill mannered promises
+ run(null, reject, jqXHR);
+ });
+ });
+ }
+ });
+ ```
+ @method createRecord
+ @param {DS.Store} store
+ @param {DS.Model} type the DS.Model class of the record
+ @param {DS.Snapshot} snapshot
+ @return {Promise} promise
+ */
+ createRecord: null,
+
+ /**
+ Implement this method in a subclass to handle the updating of
+ a record.
+ Serializes the record update and sends it to the server.
+ The updateRecord method is expected to return a promise that will
+ resolve with the serialized record. This allows the backend to
+ inform the Ember Data store the current state of this record after
+ the update. If it is not possible to return a serialized record
+ the updateRecord promise can also resolve with `undefined` and the
+ Ember Data store will assume all of the updates were successfully
+ applied on the backend.
+ Example
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ import { run } from '@ember/runloop';
+ import RSVP from 'RSVP';
+ import $ from 'jquery';
+ export default DS.Adapter.extend({
+ updateRecord(store, type, snapshot) {
+ let data = this.serialize(snapshot, { includeId: true });
+ let id = snapshot.id;
+ return new RSVP.Promise(function(resolve, reject) {
+ $.ajax({
+ type: 'PUT',
+ url: `/${type.modelName}/${id}`,
+ dataType: 'json',
+ data: data
+ }).then(function(data) {
+ run(null, resolve, data);
+ }, function(jqXHR) {
+ jqXHR.then = null; // tame jQuery's ill mannered promises
+ run(null, reject, jqXHR);
+ });
+ });
+ }
+ });
+ ```
+ @method updateRecord
+ @param {DS.Store} store
+ @param {DS.Model} type the DS.Model class of the record
+ @param {DS.Snapshot} snapshot
+ @return {Promise} promise
+ */
+ updateRecord: null,
+
+ /**
+ Implement this method in a subclass to handle the deletion of
+ a record.
+ Sends a delete request for the record to the server.
+ Example
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ import { run } from '@ember/runloop';
+ import RSVP from 'RSVP';
+ import $ from 'jquery';
+ export default DS.Adapter.extend({
+ deleteRecord(store, type, snapshot) {
+ let data = this.serialize(snapshot, { includeId: true });
+ let id = snapshot.id;
+ return new RSVP.Promise(function(resolve, reject) {
+ $.ajax({
+ type: 'DELETE',
+ url: `/${type.modelName}/${id}`,
+ dataType: 'json',
+ data: data
+ }).then(function(data) {
+ run(null, resolve, data);
+ }, function(jqXHR) {
+ jqXHR.then = null; // tame jQuery's ill mannered promises
+ run(null, reject, jqXHR);
+ });
+ });
+ }
+ });
+ ```
+ @method deleteRecord
+ @param {DS.Store} store
+ @param {DS.Model} type the DS.Model class of the record
+ @param {DS.Snapshot} snapshot
+ @return {Promise} promise
+ */
+ deleteRecord: null,
+
+ /**
+ By default the store will try to coalesce all `fetchRecord` calls within the same runloop
+ into as few requests as possible by calling groupRecordsForFindMany and passing it into a findMany call.
+ You can opt out of this behaviour by either not implementing the findMany hook or by setting
+ coalesceFindRequests to false.
+ @property coalesceFindRequests
+ @type {boolean}
+ */
+ coalesceFindRequests: true,
+
+ /**
+ The store will call `findMany` instead of multiple `findRecord`
+ requests to find multiple records at once if coalesceFindRequests
+ is true.
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ import { run } from '@ember/runloop';
+ import RSVP from 'RSVP';
+ import $ from 'jquery';
+ export default DS.Adapter.extend({
+ findMany(store, type, ids, snapshots) {
+ return new RSVP.Promise(function(resolve, reject) {
+ $.ajax({
+ type: 'GET',
+ url: `/${type.modelName}/`,
+ dataType: 'json',
+ data: { filter: { id: ids.join(',') } }
+ }).then(function(data) {
+ run(null, resolve, data);
+ }, function(jqXHR) {
+ jqXHR.then = null; // tame jQuery's ill mannered promises
+ run(null, reject, jqXHR);
+ });
+ });
+ }
+ });
+ ```
+ @method findMany
+ @param {DS.Store} store
+ @param {DS.Model} type the DS.Model class of the records
+ @param {Array} ids
+ @param {Array} snapshots
+ @return {Promise} promise
+ */
+ findMany: null,
+
+ /**
+ Organize records into groups, each of which is to be passed to separate
+ calls to `findMany`.
+ For example, if your api has nested URLs that depend on the parent, you will
+ want to group records by their parent.
+ The default implementation returns the records as a single group.
+ @method groupRecordsForFindMany
+ @param {DS.Store} store
+ @param {Array} snapshots
+ @return {Array} an array of arrays of records, each of which is to be
+ loaded separately by `findMany`.
+ */
+ groupRecordsForFindMany(store, snapshots) {
+ return [snapshots];
+ },
+
+ /**
+ This method is used by the store to determine if the store should
+ reload a record from the adapter when a record is requested by
+ `store.findRecord`.
+ If this method returns `true`, the store will re-fetch a record from
+ the adapter. If this method returns `false`, the store will resolve
+ immediately using the cached record.
+ For example, if you are building an events ticketing system, in which users
+ can only reserve tickets for 20 minutes at a time, and want to ensure that
+ in each route you have data that is no more than 20 minutes old you could
+ write:
+ ```javascript
+ shouldReloadRecord(store, ticketSnapshot) {
+ let lastAccessedAt = ticketSnapshot.attr('lastAccessedAt');
+ let timeDiff = moment().diff(lastAccessedAt, 'minutes');
+ if (timeDiff > 20) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+ ```
+ This method would ensure that whenever you do `store.findRecord('ticket',
+ id)` you will always get a ticket that is no more than 20 minutes old. In
+ case the cached version is more than 20 minutes old, `findRecord` will not
+ resolve until you fetched the latest version.
+ By default this hook returns `false`, as most UIs should not block user
+ interactions while waiting on data update.
+ Note that, with default settings, `shouldBackgroundReloadRecord` will always
+ re-fetch the records in the background even if `shouldReloadRecord` returns
+ `false`. You can override `shouldBackgroundReloadRecord` if this does not
+ suit your use case.
+ @since 1.13.0
+ @method shouldReloadRecord
+ @param {DS.Store} store
+ @param {DS.Snapshot} snapshot
+ @return {Boolean}
+ */
+ shouldReloadRecord(store, snapshot) {
+ return false;
+ },
+
+ /**
+ This method is used by the store to determine if the store should
+ reload all records from the adapter when records are requested by
+ `store.findAll`.
+ If this method returns `true`, the store will re-fetch all records from
+ the adapter. If this method returns `false`, the store will resolve
+ immediately using the cached records.
+ For example, if you are building an events ticketing system, in which users
+ can only reserve tickets for 20 minutes at a time, and want to ensure that
+ in each route you have data that is no more than 20 minutes old you could
+ write:
+ ```javascript
+ shouldReloadAll(store, snapshotArray) {
+ let snapshots = snapshotArray.snapshots();
+ return snapshots.any((ticketSnapshot) => {
+ let lastAccessedAt = ticketSnapshot.attr('lastAccessedAt');
+ let timeDiff = moment().diff(lastAccessedAt, 'minutes');
+ if (timeDiff > 20) {
+ return true;
+ } else {
+ return false;
+ }
+ });
+ }
+ ```
+ This method would ensure that whenever you do `store.findAll('ticket')` you
+ will always get a list of tickets that are no more than 20 minutes old. In
+ case a cached version is more than 20 minutes old, `findAll` will not
+ resolve until you fetched the latest versions.
+ By default this methods returns `true` if the passed `snapshotRecordArray`
+ is empty (meaning that there are no records locally available yet),
+ otherwise it returns `false`.
+ Note that, with default settings, `shouldBackgroundReloadAll` will always
+ re-fetch all the records in the background even if `shouldReloadAll` returns
+ `false`. You can override `shouldBackgroundReloadAll` if this does not suit
+ your use case.
+ @since 1.13.0
+ @method shouldReloadAll
+ @param {DS.Store} store
+ @param {DS.SnapshotRecordArray} snapshotRecordArray
+ @return {Boolean}
+ */
+ shouldReloadAll(store, snapshotRecordArray) {
+ return !snapshotRecordArray.length;
+ },
+
+ /**
+ This method is used by the store to determine if the store should
+ reload a record after the `store.findRecord` method resolves a
+ cached record.
+ This method is *only* checked by the store when the store is
+ returning a cached record.
+ If this method returns `true` the store will re-fetch a record from
+ the adapter.
+ For example, if you do not want to fetch complex data over a mobile
+ connection, or if the network is down, you can implement
+ `shouldBackgroundReloadRecord` as follows:
+ ```javascript
+ shouldBackgroundReloadRecord(store, snapshot) {
+ let connection = window.navigator.connection;
+ if (connection === 'cellular' || connection === 'none') {
+ return false;
+ } else {
+ return true;
+ }
+ }
+ ```
+ By default this hook returns `true` so the data for the record is updated
+ in the background.
+ @since 1.13.0
+ @method shouldBackgroundReloadRecord
+ @param {DS.Store} store
+ @param {DS.Snapshot} snapshot
+ @return {Boolean}
+ */
+ shouldBackgroundReloadRecord(store, snapshot) {
+ return true;
+ },
+
+ /**
+ This method is used by the store to determine if the store should
+ reload a record array after the `store.findAll` method resolves
+ with a cached record array.
+ This method is *only* checked by the store when the store is
+ returning a cached record array.
+ If this method returns `true` the store will re-fetch all records
+ from the adapter.
+ For example, if you do not want to fetch complex data over a mobile
+ connection, or if the network is down, you can implement
+ `shouldBackgroundReloadAll` as follows:
+ ```javascript
+ shouldBackgroundReloadAll(store, snapshotArray) {
+ let connection = window.navigator.connection;
+ if (connection === 'cellular' || connection === 'none') {
+ return false;
+ } else {
+ return true;
+ }
+ }
+ ```
+ By default this method returns `true`, indicating that a background reload
+ should always be triggered.
+ @since 1.13.0
+ @method shouldBackgroundReloadAll
+ @param {DS.Store} store
+ @param {DS.SnapshotRecordArray} snapshotRecordArray
+ @return {Boolean}
+ */
+ shouldBackgroundReloadAll(store, snapshotRecordArray) {
+ return true;
+ }
+ });
+});
+;define('ember-data/adapters/errors', ['exports', 'ember-data/-private'], function (exports, _private) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ Object.defineProperty(exports, 'AdapterError', {
+ enumerable: true,
+ get: function () {
+ return _private.AdapterError;
+ }
+ });
+ Object.defineProperty(exports, 'InvalidError', {
+ enumerable: true,
+ get: function () {
+ return _private.InvalidError;
+ }
+ });
+ Object.defineProperty(exports, 'UnauthorizedError', {
+ enumerable: true,
+ get: function () {
+ return _private.UnauthorizedError;
+ }
+ });
+ Object.defineProperty(exports, 'ForbiddenError', {
+ enumerable: true,
+ get: function () {
+ return _private.ForbiddenError;
+ }
+ });
+ Object.defineProperty(exports, 'NotFoundError', {
+ enumerable: true,
+ get: function () {
+ return _private.NotFoundError;
+ }
+ });
+ Object.defineProperty(exports, 'ConflictError', {
+ enumerable: true,
+ get: function () {
+ return _private.ConflictError;
+ }
+ });
+ Object.defineProperty(exports, 'ServerError', {
+ enumerable: true,
+ get: function () {
+ return _private.ServerError;
+ }
+ });
+ Object.defineProperty(exports, 'TimeoutError', {
+ enumerable: true,
+ get: function () {
+ return _private.TimeoutError;
+ }
+ });
+ Object.defineProperty(exports, 'AbortError', {
+ enumerable: true,
+ get: function () {
+ return _private.AbortError;
+ }
+ });
+ Object.defineProperty(exports, 'errorsHashToArray', {
+ enumerable: true,
+ get: function () {
+ return _private.errorsHashToArray;
+ }
+ });
+ Object.defineProperty(exports, 'errorsArrayToHash', {
+ enumerable: true,
+ get: function () {
+ return _private.errorsArrayToHash;
+ }
+ });
+});
+;define('ember-data/adapters/json-api', ['exports', 'ember-data/adapters/rest', 'ember-data/-private', 'ember-inflector'], function (exports, _rest, _private, _emberInflector) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+
+
+ /**
+ The `JSONAPIAdapter` is the default adapter used by Ember Data. It
+ is responsible for transforming the store's requests into HTTP
+ requests that follow the [JSON API](http://jsonapi.org/format/)
+ format.
+
+ ## JSON API Conventions
+
+ The JSONAPIAdapter uses JSON API conventions for building the url
+ for a record and selecting the HTTP verb to use with a request. The
+ actions you can take on a record map onto the following URLs in the
+ JSON API adapter:
+
+ <table>
+ <tr>
+ <th>
+ Action
+ </th>
+ <th>
+ HTTP Verb
+ </th>
+ <th>
+ URL
+ </th>
+ </tr>
+ <tr>
+ <th>
+ `store.findRecord('post', 123)`
+ </th>
+ <td>
+ GET
+ </td>
+ <td>
+ /posts/123
+ </td>
+ </tr>
+ <tr>
+ <th>
+ `store.findAll('post')`
+ </th>
+ <td>
+ GET
+ </td>
+ <td>
+ /posts
+ </td>
+ </tr>
+ <tr>
+ <th>
+ Update `postRecord.save()`
+ </th>
+ <td>
+ PATCH
+ </td>
+ <td>
+ /posts/123
+ </td>
+ </tr>
+ <tr>
+ <th>
+ Create `store.createRecord('post').save()`
+ </th>
+ <td>
+ POST
+ </td>
+ <td>
+ /posts
+ </td>
+ </tr>
+ <tr>
+ <th>
+ Delete `postRecord.destroyRecord()`
+ </th>
+ <td>
+ DELETE
+ </td>
+ <td>
+ /posts/123
+ </td>
+ </tr>
+ </table>
+
+ ## Success and failure
+
+ The JSONAPIAdapter will consider a success any response with a
+ status code of the 2xx family ("Success"), as well as 304 ("Not
+ Modified"). Any other status code will be considered a failure.
+
+ On success, the request promise will be resolved with the full
+ response payload.
+
+ Failed responses with status code 422 ("Unprocessable Entity") will
+ be considered "invalid". The response will be discarded, except for
+ the `errors` key. The request promise will be rejected with a
+ `DS.InvalidError`. This error object will encapsulate the saved
+ `errors` value.
+
+ Any other status codes will be treated as an adapter error. The
+ request promise will be rejected, similarly to the invalid case,
+ but with an instance of `DS.AdapterError` instead.
+
+ ### Endpoint path customization
+
+ Endpoint paths can be prefixed with a `namespace` by setting the
+ namespace property on the adapter:
+
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+
+ export default DS.JSONAPIAdapter.extend({
+ namespace: 'api/1'
+ });
+ ```
+ Requests for the `person` model would now target `/api/1/people/1`.
+
+ ### Host customization
+
+ An adapter can target other hosts by setting the `host` property.
+
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+
+ export default DS.JSONAPIAdapter.extend({
+ host: 'https://api.example.com'
+ });
+ ```
+
+ Requests for the `person` model would now target
+ `https://api.example.com/people/1`.
+
+ @since 1.13.0
+ @class JSONAPIAdapter
+ @constructor
+ @namespace DS
+ @extends DS.RESTAdapter
+ */
+ var JSONAPIAdapter = _rest.default.extend({
+ defaultSerializer: '-json-api',
+
+ /**
+ @method ajaxOptions
+ @private
+ @param {String} url
+ @param {String} type The request type GET, POST, PUT, DELETE etc.
+ @param {Object} options
+ @return {Object}
+ */
+ ajaxOptions(url, type, options) {
+ var hash = this._super(...arguments);
+
+ if (hash.contentType) {
+ hash.contentType = 'application/vnd.api+json';
+ }
+
+ var beforeSend = hash.beforeSend;
+ hash.beforeSend = function (xhr) {
+ xhr.setRequestHeader('Accept', 'application/vnd.api+json');
+ if (beforeSend) {
+ beforeSend(xhr);
+ }
+ };
+
+ return hash;
+ },
+
+ /**
+ By default the JSONAPIAdapter will send each find request coming from a `store.find`
+ or from accessing a relationship separately to the server. If your server supports passing
+ ids as a query string, you can set coalesceFindRequests to true to coalesce all find requests
+ within a single runloop.
+ For example, if you have an initial payload of:
+ ```javascript
+ {
+ data: {
+ id: 1,
+ type: 'post',
+ relationship: {
+ comments: {
+ data: [
+ { id: 1, type: 'comment' },
+ { id: 2, type: 'comment' }
+ ]
+ }
+ }
+ }
+ }
+ ```
+ By default calling `post.get('comments')` will trigger the following requests(assuming the
+ comments haven't been loaded before):
+ ```
+ GET /comments/1
+ GET /comments/2
+ ```
+ If you set coalesceFindRequests to `true` it will instead trigger the following request:
+ ```
+ GET /comments?filter[id]=1,2
+ ```
+ Setting coalesceFindRequests to `true` also works for `store.find` requests and `belongsTo`
+ relationships accessed within the same runloop. If you set `coalesceFindRequests: true`
+ ```javascript
+ store.findRecord('comment', 1);
+ store.findRecord('comment', 2);
+ ```
+ will also send a request to: `GET /comments?filter[id]=1,2`
+ Note: Requests coalescing rely on URL building strategy. So if you override `buildURL` in your app
+ `groupRecordsForFindMany` more likely should be overridden as well in order for coalescing to work.
+ @property coalesceFindRequests
+ @type {boolean}
+ */
+ coalesceFindRequests: false,
+
+ findMany(store, type, ids, snapshots) {
+ if ((0, _private.isEnabled)('ds-improved-ajax') && !this._hasCustomizedAjax()) {
+ return this._super(...arguments);
+ } else {
+ var url = this.buildURL(type.modelName, ids, snapshots, 'findMany');
+ return this.ajax(url, 'GET', { data: { filter: { id: ids.join(',') } } });
+ }
+ },
+
+ pathForType(modelName) {
+ var dasherized = Ember.String.dasherize(modelName);
+ return (0, _emberInflector.pluralize)(dasherized);
+ },
+
+ // TODO: Remove this once we have a better way to override HTTP verbs.
+ updateRecord(store, type, snapshot) {
+ if ((0, _private.isEnabled)('ds-improved-ajax') && !this._hasCustomizedAjax()) {
+ return this._super(...arguments);
+ } else {
+ var data = {};
+ var serializer = store.serializerFor(type.modelName);
+
+ serializer.serializeIntoHash(data, type, snapshot, { includeId: true });
+
+ var url = this.buildURL(type.modelName, snapshot.id, snapshot, 'updateRecord');
+
+ return this.ajax(url, 'PATCH', { data: data });
+ }
+ },
+
+ _hasCustomizedAjax() {
+ if (this.ajax !== JSONAPIAdapter.prototype.ajax) {
+ (true && !(false) && Ember.deprecate('JSONAPIAdapter#ajax has been deprecated please use. `methodForRequest`, `urlForRequest`, `headersForRequest` or `dataForRequest` instead.', false, {
+ id: 'ds.json-api-adapter.ajax',
+ until: '3.0.0'
+ }));
+
+ return true;
+ }
+
+ if (this.ajaxOptions !== JSONAPIAdapter.prototype.ajaxOptions) {
+ (true && !(false) && Ember.deprecate('JSONAPIAdapterr#ajaxOptions has been deprecated please use. `methodForRequest`, `urlForRequest`, `headersForRequest` or `dataForRequest` instead.', false, {
+ id: 'ds.json-api-adapter.ajax-options',
+ until: '3.0.0'
+ }));
+
+ return true;
+ }
+
+ return false;
+ }
+ }); /* global heimdall */
+ /**
+ @module ember-data
+ */
+
+
+ if ((0, _private.isEnabled)('ds-improved-ajax')) {
+
+ JSONAPIAdapter.reopen({
+
+ methodForRequest(params) {
+ if (params.requestType === 'updateRecord') {
+ return 'PATCH';
+ }
+
+ return this._super(...arguments);
+ },
+
+ dataForRequest(params) {
+ var { requestType, ids } = params;
+
+ if (requestType === 'findMany') {
+ return {
+ filter: { id: ids.join(',') }
+ };
+ }
+
+ if (requestType === 'updateRecord') {
+ var { store, type, snapshot } = params;
+ var data = {};
+ var serializer = store.serializerFor(type.modelName);
+
+ serializer.serializeIntoHash(data, type, snapshot, { includeId: true });
+
+ return data;
+ }
+
+ return this._super(...arguments);
+ },
+
+ headersForRequest() {
+ var headers = this._super(...arguments) || {};
+
+ headers['Accept'] = 'application/vnd.api+json';
+
+ return headers;
+ },
+
+ _requestToJQueryAjaxHash() {
+ var hash = this._super(...arguments);
+
+ if (hash.contentType) {
+ hash.contentType = 'application/vnd.api+json';
+ }
+
+ return hash;
+ }
+
+ });
+ }
+
+ exports.default = JSONAPIAdapter;
+});
+;define('ember-data/adapters/rest', ['exports', 'ember-data/adapter', 'ember-data/-private'], function (exports, _adapter, _private) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+
+
+ var Promise = Ember.RSVP.Promise;
+
+ /**
+ The REST adapter allows your store to communicate with an HTTP server by
+ transmitting JSON via XHR. Most Ember.js apps that consume a JSON API
+ should use the REST adapter.
+
+ This adapter is designed around the idea that the JSON exchanged with
+ the server should be conventional.
+
+ ## Success and failure
+
+ The REST adapter will consider a success any response with a status code
+ of the 2xx family ("Success"), as well as 304 ("Not Modified"). Any other
+ status code will be considered a failure.
+
+ On success, the request promise will be resolved with the full response
+ payload.
+
+ Failed responses with status code 422 ("Unprocessable Entity") will be
+ considered "invalid". The response will be discarded, except for the
+ `errors` key. The request promise will be rejected with a `DS.InvalidError`.
+ This error object will encapsulate the saved `errors` value.
+
+ Any other status codes will be treated as an "adapter error". The request
+ promise will be rejected, similarly to the "invalid" case, but with
+ an instance of `DS.AdapterError` instead.
+
+ ## JSON Structure
+
+ The REST adapter expects the JSON returned from your server to follow
+ these conventions.
+
+ ### Object Root
+
+ The JSON payload should be an object that contains the record inside a
+ root property. For example, in response to a `GET` request for
+ `/posts/1`, the JSON should look like this:
+
+ ```js
+ {
+ "posts": {
+ "id": 1,
+ "title": "I'm Running to Reform the W3C's Tag",
+ "author": "Yehuda Katz"
+ }
+ }
+ ```
+
+ Similarly, in response to a `GET` request for `/posts`, the JSON should
+ look like this:
+
+ ```js
+ {
+ "posts": [
+ {
+ "id": 1,
+ "title": "I'm Running to Reform the W3C's Tag",
+ "author": "Yehuda Katz"
+ },
+ {
+ "id": 2,
+ "title": "Rails is omakase",
+ "author": "D2H"
+ }
+ ]
+ }
+ ```
+
+ Note that the object root can be pluralized for both a single-object response
+ and an array response: the REST adapter is not strict on this. Further, if the
+ HTTP server responds to a `GET` request to `/posts/1` (e.g. the response to a
+ `findRecord` query) with more than one object in the array, Ember Data will
+ only display the object with the matching ID.
+
+ ### Conventional Names
+
+ Attribute names in your JSON payload should be the camelCased versions of
+ the attributes in your Ember.js models.
+
+ For example, if you have a `Person` model:
+
+ ```app/models/person.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ firstName: DS.attr('string'),
+ lastName: DS.attr('string'),
+ occupation: DS.attr('string')
+ });
+ ```
+
+ The JSON returned should look like this:
+
+ ```js
+ {
+ "people": {
+ "id": 5,
+ "firstName": "Zaphod",
+ "lastName": "Beeblebrox",
+ "occupation": "President"
+ }
+ }
+ ```
+
+ #### Relationships
+
+ Relationships are usually represented by ids to the record in the
+ relationship. The related records can then be sideloaded in the
+ response under a key for the type.
+
+ ```js
+ {
+ "posts": {
+ "id": 5,
+ "title": "I'm Running to Reform the W3C's Tag",
+ "author": "Yehuda Katz",
+ "comments": [1, 2]
+ },
+ "comments": [{
+ "id": 1,
+ "author": "User 1",
+ "message": "First!",
+ }, {
+ "id": 2,
+ "author": "User 2",
+ "message": "Good Luck!",
+ }]
+ }
+ ```
+
+ If the records in the relationship are not known when the response
+ is serialized its also possible to represent the relationship as a
+ url using the `links` key in the response. Ember Data will fetch
+ this url to resolve the relationship when it is accessed for the
+ first time.
+
+ ```js
+ {
+ "posts": {
+ "id": 5,
+ "title": "I'm Running to Reform the W3C's Tag",
+ "author": "Yehuda Katz",
+ "links": {
+ "comments": "/posts/5/comments"
+ }
+ }
+ }
+ ```
+
+ ### Errors
+
+ If a response is considered a failure, the JSON payload is expected to include
+ a top-level key `errors`, detailing any specific issues. For example:
+
+ ```js
+ {
+ "errors": {
+ "msg": "Something went wrong"
+ }
+ }
+ ```
+
+ This adapter does not make any assumptions as to the format of the `errors`
+ object. It will simply be passed along as is, wrapped in an instance
+ of `DS.InvalidError` or `DS.AdapterError`. The serializer can interpret it
+ afterwards.
+
+ ## Customization
+
+ ### Endpoint path customization
+
+ Endpoint paths can be prefixed with a `namespace` by setting the namespace
+ property on the adapter:
+
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+
+ export default DS.RESTAdapter.extend({
+ namespace: 'api/1'
+ });
+ ```
+ Requests for the `Person` model would now target `/api/1/people/1`.
+
+ ### Host customization
+
+ An adapter can target other hosts by setting the `host` property.
+
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+
+ export default DS.RESTAdapter.extend({
+ host: 'https://api.example.com'
+ });
+ ```
+
+ ### Headers customization
+
+ Some APIs require HTTP headers, e.g. to provide an API key. Arbitrary
+ headers can be set as key/value pairs on the `RESTAdapter`'s `headers`
+ object and Ember Data will send them along with each ajax request.
+
+
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ import { computed } from '@ember/object';
+
+ export default DS.RESTAdapter.extend({
+ headers: computed(function() {
+ return {
+ 'API_KEY': 'secret key',
+ 'ANOTHER_HEADER': 'Some header value'
+ };
+ }
+ });
+ ```
+
+ `headers` can also be used as a computed property to support dynamic
+ headers. In the example below, the `session` object has been
+ injected into an adapter by Ember's container.
+
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ import { computed } from '@ember/object';
+
+ export default DS.RESTAdapter.extend({
+ headers: computed('session.authToken', function() {
+ return {
+ 'API_KEY': this.get('session.authToken'),
+ 'ANOTHER_HEADER': 'Some header value'
+ };
+ })
+ });
+ ```
+
+ In some cases, your dynamic headers may require data from some
+ object outside of Ember's observer system (for example
+ `document.cookie`). You can use the
+ [volatile](/api/classes/Ember.ComputedProperty.html#method_volatile)
+ function to set the property into a non-cached mode causing the headers to
+ be recomputed with every request.
+
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ import { get } from '@ember/object';
+ import { computed } from '@ember/object';
+
+ export default DS.RESTAdapter.extend({
+ headers: computed(function() {
+ return {
+ 'API_KEY': get(document.cookie.match(/apiKey\=([^;]*)/), '1'),
+ 'ANOTHER_HEADER': 'Some header value'
+ };
+ }).volatile()
+ });
+ ```
+
+ @class RESTAdapter
+ @constructor
+ @namespace DS
+ @extends DS.Adapter
+ @uses DS.BuildURLMixin
+ */
+ /* global heimdall */
+ /**
+ @module ember-data
+ */
+
+ var RESTAdapter = _adapter.default.extend(_private.BuildURLMixin, {
+ defaultSerializer: '-rest',
+
+ /**
+ By default, the RESTAdapter will send the query params sorted alphabetically to the
+ server.
+ For example:
+ ```js
+ store.query('posts', { sort: 'price', category: 'pets' });
+ ```
+ will generate a requests like this `/posts?category=pets&sort=price`, even if the
+ parameters were specified in a different order.
+ That way the generated URL will be deterministic and that simplifies caching mechanisms
+ in the backend.
+ Setting `sortQueryParams` to a falsey value will respect the original order.
+ In case you want to sort the query parameters with a different criteria, set
+ `sortQueryParams` to your custom sort function.
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ export default DS.RESTAdapter.extend({
+ sortQueryParams(params) {
+ let sortedKeys = Object.keys(params).sort().reverse();
+ let len = sortedKeys.length, newParams = {};
+ for (let i = 0; i < len; i++) {
+ newParams[sortedKeys[i]] = params[sortedKeys[i]];
+ }
+ return newParams;
+ }
+ });
+ ```
+ @method sortQueryParams
+ @param {Object} obj
+ @return {Object}
+ */
+ sortQueryParams(obj) {
+ var keys = Object.keys(obj);
+ var len = keys.length;
+ if (len < 2) {
+ return obj;
+ }
+ var newQueryParams = {};
+ var sortedKeys = keys.sort();
+
+ for (var i = 0; i < len; i++) {
+ newQueryParams[sortedKeys[i]] = obj[sortedKeys[i]];
+ }
+ return newQueryParams;
+ },
+
+ /**
+ By default the RESTAdapter will send each find request coming from a `store.find`
+ or from accessing a relationship separately to the server. If your server supports passing
+ ids as a query string, you can set coalesceFindRequests to true to coalesce all find requests
+ within a single runloop.
+ For example, if you have an initial payload of:
+ ```javascript
+ {
+ post: {
+ id: 1,
+ comments: [1, 2]
+ }
+ }
+ ```
+ By default calling `post.get('comments')` will trigger the following requests(assuming the
+ comments haven't been loaded before):
+ ```
+ GET /comments/1
+ GET /comments/2
+ ```
+ If you set coalesceFindRequests to `true` it will instead trigger the following request:
+ ```
+ GET /comments?ids[]=1&ids[]=2
+ ```
+ Setting coalesceFindRequests to `true` also works for `store.find` requests and `belongsTo`
+ relationships accessed within the same runloop. If you set `coalesceFindRequests: true`
+ ```javascript
+ store.findRecord('comment', 1);
+ store.findRecord('comment', 2);
+ ```
+ will also send a request to: `GET /comments?ids[]=1&ids[]=2`
+ Note: Requests coalescing rely on URL building strategy. So if you override `buildURL` in your app
+ `groupRecordsForFindMany` more likely should be overridden as well in order for coalescing to work.
+ @property coalesceFindRequests
+ @type {boolean}
+ */
+ coalesceFindRequests: false,
+
+ /**
+ Endpoint paths can be prefixed with a `namespace` by setting the namespace
+ property on the adapter:
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ export default DS.RESTAdapter.extend({
+ namespace: 'api/1'
+ });
+ ```
+ Requests for the `Post` model would now target `/api/1/post/`.
+ @property namespace
+ @type {String}
+ */
+
+ /**
+ An adapter can target other hosts by setting the `host` property.
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ export default DS.RESTAdapter.extend({
+ host: 'https://api.example.com'
+ });
+ ```
+ Requests for the `Post` model would now target `https://api.example.com/post/`.
+ @property host
+ @type {String}
+ */
+
+ /**
+ Some APIs require HTTP headers, e.g. to provide an API
+ key. Arbitrary headers can be set as key/value pairs on the
+ `RESTAdapter`'s `headers` object and Ember Data will send them
+ along with each ajax request. For dynamic headers see [headers
+ customization](/api/data/classes/DS.RESTAdapter.html#toc_headers-customization).
+ ```app/adapters/application.js
+ import DS from 'ember-data';
+ import { computed } from '@ember/object';
+ export default DS.RESTAdapter.extend({
+ headers: computed(function() {
+ return {
+ 'API_KEY': 'secret key',
+ 'ANOTHER_HEADER': 'Some header value'
+ };
+ })
+ });
+ ```
+ @property headers
+ @type {Object}
+ */
+
+ /**
+ Called by the store in order to fetch the JSON for a given
+ type and ID.
+ The `findRecord` method makes an Ajax request to a URL computed by
+ `buildURL`, and returns a promise for the resulting payload.
+ This method performs an HTTP `GET` request with the id provided as part of the query string.
+ @since 1.13.0
+ @method findRecord
+ @param {DS.Store} store
+ @param {DS.Model} type
+ @param {String} id
+ @param {DS.Snapshot} snapshot
+ @return {Promise} promise
+ */
+ findRecord(store, type, id, snapshot) {
+ if ((0, _private.isEnabled)('ds-improved-ajax') && !this._hasCustomizedAjax()) {
+ var request = this._requestFor({
+ store, type, id, snapshot,
+ requestType: 'findRecord'
+ });
+
+ return this._makeRequest(request);
+ } else {
+ var url = this.buildURL(type.modelName, id, snapshot, 'findRecord');
+ var query = this.buildQuery(snapshot);
+
+ return this.ajax(url, 'GET', { data: query });
+ }
+ },
+
+ /**
+ Called by the store in order to fetch a JSON array for all
+ of the records for a given type.
+ The `findAll` method makes an Ajax (HTTP GET) request to a URL computed by `buildURL`, and returns a
+ promise for the resulting payload.
+ @method findAll
+ @param {DS.Store} store
+ @param {DS.Model} type
+ @param {String} sinceToken
+ @param {DS.SnapshotRecordArray} snapshotRecordArray
+ @return {Promise} promise
+ */
+ findAll(store, type, sinceToken, snapshotRecordArray) {
+ var query = this.buildQuery(snapshotRecordArray);
+
+ if ((0, _private.isEnabled)('ds-improved-ajax') && !this._hasCustomizedAjax()) {
+ var request = this._requestFor({
+ store, type, sinceToken, query,
+ snapshots: snapshotRecordArray,
+ requestType: 'findAll'
+ });
+
+ return this._makeRequest(request);
+ } else {
+ var url = this.buildURL(type.modelName, null, snapshotRecordArray, 'findAll');
+
+ if (sinceToken) {
+ query.since = sinceToken;
+ }
+
+ return this.ajax(url, 'GET', { data: query });
+ }
+ },
+
+ /**
+ Called by the store in order to fetch a JSON array for
+ the records that match a particular query.
+ The `query` method makes an Ajax (HTTP GET) request to a URL
+ computed by `buildURL`, and returns a promise for the resulting
+ payload.
+ The `query` argument is a simple JavaScript object that will be passed directly
+ to the server as parameters.
+ @method query
+ @param {DS.Store} store
+ @param {DS.Model} type
+ @param {Object} query
+ @return {Promise} promise
+ */
+ query(store, type, query) {
+ if ((0, _private.isEnabled)('ds-improved-ajax') && !this._hasCustomizedAjax()) {
+ var request = this._requestFor({
+ store, type, query,
+ requestType: 'query'
+ });
+
+ return this._makeRequest(request);
+ } else {
+ var url = this.buildURL(type.modelName, null, null, 'query', query);
+
+ if (this.sortQueryParams) {
+ query = this.sortQueryParams(query);
+ }
+
+ return this.ajax(url, 'GET', { data: query });
+ }
+ },
+
+ /**
+ Called by the store in order to fetch a JSON object for
+ the record that matches a particular query.
+ The `queryRecord` method makes an Ajax (HTTP GET) request to a URL
+ computed by `buildURL`, and returns a promise for the resulting
+ payload.
+ The `query` argument is a simple JavaScript object that will be passed directly
+ to the server as parameters.
+ @since 1.13.0
+ @method queryRecord
+ @param {DS.Store} store
+ @param {DS.Model} type
+ @param {Object} query
+ @return {Promise} promise
+ */
+ queryRecord(store, type, query) {
+ if ((0, _private.isEnabled)('ds-improved-ajax') && !this._hasCustomizedAjax()) {
+ var request = this._requestFor({
+ store, type, query,
+ requestType: 'queryRecord'
+ });
+
+ return this._makeRequest(request);
+ } else {
+ var url = this.buildURL(type.modelName, null, null, 'queryRecord', query);
+
+ if (this.sortQueryParams) {
+ query = this.sortQueryParams(query);
+ }
+
+ return this.ajax(url, 'GET', { data: query });
+ }
+ },
+
+ /**
+ Called by the store in order to fetch several records together if `coalesceFindRequests` is true
+ For example, if the original payload looks like:
+ ```js
+ {
+ "id": 1,
+ "title": "Rails is omakase",
+ "comments": [ 1, 2, 3 ]
+ }
+ ```
+ The IDs will be passed as a URL-encoded Array of IDs, in this form:
+ ```
+ ids[]=1&ids[]=2&ids[]=3
+ ```
+ Many servers, such as Rails and PHP, will automatically convert this URL-encoded array
+ into an Array for you on the server-side. If you want to encode the
+ IDs, differently, just override this (one-line) method.
+ The `findMany` method makes an Ajax (HTTP GET) request to a URL computed by `buildURL`, and returns a
+ promise for the resulting payload.
+ @method findMany
+ @param {DS.Store} store
+ @param {DS.Model} type
+ @param {Array} ids
+ @param {Array} snapshots
+ @return {Promise} promise
+ */
+ findMany(store, type, ids, snapshots) {
+ if ((0, _private.isEnabled)('ds-improved-ajax') && !this._hasCustomizedAjax()) {
+ var request = this._requestFor({
+ store, type, ids, snapshots,
+ requestType: 'findMany'
+ });
+
+ return this._makeRequest(request);
+ } else {
+ var url = this.buildURL(type.modelName, ids, snapshots, 'findMany');
+ return this.ajax(url, 'GET', { data: { ids: ids } });
+ }
+ },
+
+ /**
+ Called by the store in order to fetch a JSON array for
+ the unloaded records in a has-many relationship that were originally
+ specified as a URL (inside of `links`).
+ For example, if your original payload looks like this:
+ ```js
+ {
+ "post": {
+ "id": 1,
+ "title": "Rails is omakase",
+ "links": { "comments": "/posts/1/comments" }
+ }
+ }
+ ```
+ This method will be called with the parent record and `/posts/1/comments`.
+ The `findHasMany` method will make an Ajax (HTTP GET) request to the originally specified URL.
+ The format of your `links` value will influence the final request URL via the `urlPrefix` method:
+ * Links beginning with `//`, `http://`, `https://`, will be used as is, with no further manipulation.
+ * Links beginning with a single `/` will have the current adapter's `host` value prepended to it.
+ * Links with no beginning `/` will have a parentURL prepended to it, via the current adapter's `buildURL`.
+ @method findHasMany
+ @param {DS.Store} store
+ @param {DS.Snapshot} snapshot
+ @param {String} url
+ @param {Object} relationship meta object describing the relationship
+ @return {Promise} promise
+ */
+ findHasMany(store, snapshot, url, relationship) {
+ if ((0, _private.isEnabled)('ds-improved-ajax') && !this._hasCustomizedAjax()) {
+ var request = this._requestFor({
+ store, snapshot, url, relationship,
+ requestType: 'findHasMany'
+ });
+
+ return this._makeRequest(request);
+ } else {
+ var id = snapshot.id;
+ var type = snapshot.modelName;
+
+ url = this.urlPrefix(url, this.buildURL(type, id, snapshot, 'findHasMany'));
+
+ return this.ajax(url, 'GET');
+ }
+ },
+
+ /**
+ Called by the store in order to fetch the JSON for the unloaded record in a
+ belongs-to relationship that was originally specified as a URL (inside of
+ `links`).
+ For example, if your original payload looks like this:
+ ```js
+ {
+ "person": {
+ "id": 1,
+ "name": "Tom Dale",
+ "links": { "group": "/people/1/group" }
+ }
+ }
+ ```
+ This method will be called with the parent record and `/people/1/group`.
+ The `findBelongsTo` method will make an Ajax (HTTP GET) request to the originally specified URL.
+ The format of your `links` value will influence the final request URL via the `urlPrefix` method:
+ * Links beginning with `//`, `http://`, `https://`, will be used as is, with no further manipulation.
+ * Links beginning with a single `/` will have the current adapter's `host` value prepended to it.
+ * Links with no beginning `/` will have a parentURL prepended to it, via the current adapter's `buildURL`.
+ @method findBelongsTo
+ @param {DS.Store} store
+ @param {DS.Snapshot} snapshot
+ @param {String} url
+ @param {Object} relationship meta object describing the relationship
+ @return {Promise} promise
+ */
+ findBelongsTo(store, snapshot, url, relationship) {
+ if ((0, _private.isEnabled)('ds-improved-ajax') && !this._hasCustomizedAjax()) {
+ var request = this._requestFor({
+ store, snapshot, url, relationship,
+ requestType: 'findBelongsTo'
+ });
+
+ return this._makeRequest(request);
+ } else {
+ var id = snapshot.id;
+ var type = snapshot.modelName;
+
+ url = this.urlPrefix(url, this.buildURL(type, id, snapshot, 'findBelongsTo'));
+ return this.ajax(url, 'GET');
+ }
+ },
+
+ /**
+ Called by the store when a newly created record is
+ saved via the `save` method on a model record instance.
+ The `createRecord` method serializes the record and makes an Ajax (HTTP POST) request
+ to a URL computed by `buildURL`.
+ See `serialize` for information on how to customize the serialized form
+ of a record.
+ @method createRecord
+ @param {DS.Store} store
+ @param {DS.Model} type
+ @param {DS.Snapshot} snapshot
+ @return {Promise} promise
+ */
+ createRecord(store, type, snapshot) {
+ if ((0, _private.isEnabled)('ds-improved-ajax') && !this._hasCustomizedAjax()) {
+ var request = this._requestFor({
+ store, type, snapshot,
+ requestType: 'createRecord'
+ });
+
+ return this._makeRequest(request);
+ } else {
+ var data = {};
+ var serializer = store.serializerFor(type.modelName);
+ var url = this.buildURL(type.modelName, null, snapshot, 'createRecord');
+
+ serializer.serializeIntoHash(data, type, snapshot, { includeId: true });
+
+ return this.ajax(url, "POST", { data: data });
+ }
+ },
+
+ /**
+ Called by the store when an existing record is saved
+ via the `save` method on a model record instance.
+ The `updateRecord` method serializes the record and makes an Ajax (HTTP PUT) request
+ to a URL computed by `buildURL`.
+ See `serialize` for information on how to customize the serialized form
+ of a record.
+ @method updateRecord
+ @param {DS.Store} store
+ @param {DS.Model} type
+ @param {DS.Snapshot} snapshot
+ @return {Promise} promise
+ */
+ updateRecord(store, type, snapshot) {
+ if ((0, _private.isEnabled)('ds-improved-ajax') && !this._hasCustomizedAjax()) {
+ var request = this._requestFor({
+ store, type, snapshot,
+ requestType: 'updateRecord'
+ });
+
+ return this._makeRequest(request);
+ } else {
+ var data = {};
+ var serializer = store.serializerFor(type.modelName);
+
+ serializer.serializeIntoHash(data, type, snapshot);
+
+ var id = snapshot.id;
+ var url = this.buildURL(type.modelName, id, snapshot, 'updateRecord');
+
+ return this.ajax(url, "PUT", { data: data });
+ }
+ },
+
+ /**
+ Called by the store when a record is deleted.
+ The `deleteRecord` method makes an Ajax (HTTP DELETE) request to a URL computed by `buildURL`.
+ @method deleteRecord
+ @param {DS.Store} store
+ @param {DS.Model} type
+ @param {DS.Snapshot} snapshot
+ @return {Promise} promise
+ */
+ deleteRecord(store, type, snapshot) {
+ if ((0, _private.isEnabled)('ds-improved-ajax') && !this._hasCustomizedAjax()) {
+ var request = this._requestFor({
+ store, type, snapshot,
+ requestType: 'deleteRecord'
+ });
+
+ return this._makeRequest(request);
+ } else {
+ var id = snapshot.id;
+
+ return this.ajax(this.buildURL(type.modelName, id, snapshot, 'deleteRecord'), "DELETE");
+ }
+ },
+
+ _stripIDFromURL(store, snapshot) {
+ var url = this.buildURL(snapshot.modelName, snapshot.id, snapshot);
+
+ var expandedURL = url.split('/');
+ // Case when the url is of the format ...something/:id
+ // We are decodeURIComponent-ing the lastSegment because if it represents
+ // the id, it has been encodeURIComponent-ified within `buildURL`. If we
+ // don't do this, then records with id having special characters are not
+ // coalesced correctly (see GH #4190 for the reported bug)
+ var lastSegment = expandedURL[expandedURL.length - 1];
+ var id = snapshot.id;
+ if (decodeURIComponent(lastSegment) === id) {
+ expandedURL[expandedURL.length - 1] = "";
+ } else if (endsWith(lastSegment, '?id=' + id)) {
+ //Case when the url is of the format ...something?id=:id
+ expandedURL[expandedURL.length - 1] = lastSegment.substring(0, lastSegment.length - id.length - 1);
+ }
+
+ return expandedURL.join('/');
+ },
+
+ // http://stackoverflow.com/questions/417142/what-is-the-maximum-length-of-a-url-in-different-browsers
+ maxURLLength: 2048,
+
+ /**
+ Organize records into groups, each of which is to be passed to separate
+ calls to `findMany`.
+ This implementation groups together records that have the same base URL but
+ differing ids. For example `/comments/1` and `/comments/2` will be grouped together
+ because we know findMany can coalesce them together as `/comments?ids[]=1&ids[]=2`
+ It also supports urls where ids are passed as a query param, such as `/comments?id=1`
+ but not those where there is more than 1 query param such as `/comments?id=2&name=David`
+ Currently only the query param of `id` is supported. If you need to support others, please
+ override this or the `_stripIDFromURL` method.
+ It does not group records that have differing base urls, such as for example: `/posts/1/comments/2`
+ and `/posts/2/comments/3`
+ @method groupRecordsForFindMany
+ @param {DS.Store} store
+ @param {Array} snapshots
+ @return {Array} an array of arrays of records, each of which is to be
+ loaded separately by `findMany`.
+ */
+ groupRecordsForFindMany(store, snapshots) {
+ var groups = Ember.MapWithDefault.create({ defaultValue() {
+ return [];
+ } });
+ var adapter = this;
+ var maxURLLength = this.maxURLLength;
+
+ snapshots.forEach(snapshot => {
+ var baseUrl = adapter._stripIDFromURL(store, snapshot);
+ groups.get(baseUrl).push(snapshot);
+ });
+
+ function splitGroupToFitInUrl(group, maxURLLength, paramNameLength) {
+ var idsSize = 0;
+ var baseUrl = adapter._stripIDFromURL(store, group[0]);
+ var splitGroups = [[]];
+
+ group.forEach(snapshot => {
+ var additionalLength = encodeURIComponent(snapshot.id).length + paramNameLength;
+ if (baseUrl.length + idsSize + additionalLength >= maxURLLength) {
+ idsSize = 0;
+ splitGroups.push([]);
+ }
+
+ idsSize += additionalLength;
+
+ var lastGroupIndex = splitGroups.length - 1;
+ splitGroups[lastGroupIndex].push(snapshot);
+ });
+
+ return splitGroups;
+ }
+
+ var groupsArray = [];
+ groups.forEach((group, key) => {
+ var paramNameLength = '&ids%5B%5D='.length;
+ var splitGroups = splitGroupToFitInUrl(group, maxURLLength, paramNameLength);
+
+ splitGroups.forEach(splitGroup => groupsArray.push(splitGroup));
+ });
+
+ return groupsArray;
+ },
+
+ /**
+ Takes an ajax response, and returns the json payload or an error.
+ By default this hook just returns the json payload passed to it.
+ You might want to override it in two cases:
+ 1. Your API might return useful results in the response headers.
+ Response headers are passed in as the second argument.
+ 2. Your API might return errors as successful responses with status code
+ 200 and an Errors text or object. You can return a `DS.InvalidError` or a
+ `DS.AdapterError` (or a sub class) from this hook and it will automatically
+ reject the promise and put your record into the invalid or error state.
+ Returning a `DS.InvalidError` from this method will cause the
+ record to transition into the `invalid` state and make the
+ `errors` object available on the record. When returning an
+ `DS.InvalidError` the store will attempt to normalize the error data
+ returned from the server using the serializer's `extractErrors`
+ method.
+ @since 1.13.0
+ @method handleResponse
+ @param {Number} status
+ @param {Object} headers
+ @param {Object} payload
+ @param {Object} requestData - the original request information
+ @return {Object | DS.AdapterError} response
+ */
+ handleResponse(status, headers, payload, requestData) {
+ if (this.isSuccess(status, headers, payload)) {
+ return payload;
+ } else if (this.isInvalid(status, headers, payload)) {
+ return new _private.InvalidError(payload.errors);
+ }
+
+ var errors = this.normalizeErrorResponse(status, headers, payload);
+ var detailedMessage = this.generatedDetailedMessage(status, headers, payload, requestData);
+
+ switch (status) {
+ case 401:
+ return new _private.UnauthorizedError(errors, detailedMessage);
+ case 403:
+ return new _private.ForbiddenError(errors, detailedMessage);
+ case 404:
+ return new _private.NotFoundError(errors, detailedMessage);
+ case 409:
+ return new _private.ConflictError(errors, detailedMessage);
+ default:
+ if (status >= 500) {
+ return new _private.ServerError(errors, detailedMessage);
+ }
+ }
+
+ return new _private.AdapterError(errors, detailedMessage);
+ },
+
+ /**
+ Default `handleResponse` implementation uses this hook to decide if the
+ response is a success.
+ @since 1.13.0
+ @method isSuccess
+ @param {Number} status
+ @param {Object} headers
+ @param {Object} payload
+ @return {Boolean}
+ */
+ isSuccess(status, headers, payload) {
+ return status >= 200 && status < 300 || status === 304;
+ },
+
+ /**
+ Default `handleResponse` implementation uses this hook to decide if the
+ response is an invalid error.
+ @since 1.13.0
+ @method isInvalid
+ @param {Number} status
+ @param {Object} headers
+ @param {Object} payload
+ @return {Boolean}
+ */
+ isInvalid(status, headers, payload) {
+ return status === 422;
+ },
+
+ /**
+ Takes a URL, an HTTP method and a hash of data, and makes an
+ HTTP request.
+ When the server responds with a payload, Ember Data will call into `extractSingle`
+ or `extractArray` (depending on whether the original query was for one record or
+ many records).
+ By default, `ajax` method has the following behavior:
+ * It sets the response `dataType` to `"json"`
+ * If the HTTP method is not `"GET"`, it sets the `Content-Type` to be
+ `application/json; charset=utf-8`
+ * If the HTTP method is not `"GET"`, it stringifies the data passed in. The
+ data is the serialized record in the case of a save.
+ * Registers success and failure handlers.
+ @method ajax
+ @private
+ @param {String} url
+ @param {String} type The request type GET, POST, PUT, DELETE etc.
+ @param {Object} options
+ @return {Promise} promise
+ */
+ ajax(url, type, options) {
+ var adapter = this;
+
+ var requestData = {
+ url: url,
+ method: type
+ };
+
+ return new Promise(function (resolve, reject) {
+ var hash = adapter.ajaxOptions(url, type, options);
+
+ hash.success = function (payload, textStatus, jqXHR) {
+ var response = ajaxSuccess(adapter, jqXHR, payload, requestData);
+ Ember.run.join(null, resolve, response);
+ };
+
+ hash.error = function (jqXHR, textStatus, errorThrown) {
+ var responseData = {
+ textStatus,
+ errorThrown
+ };
+ var error = ajaxError(adapter, jqXHR, requestData, responseData);
+ Ember.run.join(null, reject, error);
+ };
+
+ adapter._ajaxRequest(hash);
+ }, 'DS: RESTAdapter#ajax ' + type + ' to ' + url);
+ },
+
+ /**
+ @method _ajaxRequest
+ @private
+ @param {Object} options jQuery ajax options to be used for the ajax request
+ */
+ _ajaxRequest(options) {
+ Ember.$.ajax(options);
+ },
+
+ /**
+ @method ajaxOptions
+ @private
+ @param {String} url
+ @param {String} type The request type GET, POST, PUT, DELETE etc.
+ @param {Object} options
+ @return {Object}
+ */
+ ajaxOptions(url, type, options) {
+ var hash = options || {};
+ hash.url = url;
+ hash.type = type;
+ hash.dataType = 'json';
+ hash.context = this;
+
+ if (hash.data && type !== 'GET') {
+ hash.contentType = 'application/json; charset=utf-8';
+ hash.data = JSON.stringify(hash.data);
+ }
+
+ var headers = Ember.get(this, 'headers');
+ if (headers !== undefined) {
+ hash.beforeSend = function (xhr) {
+ Object.keys(headers).forEach(key => xhr.setRequestHeader(key, headers[key]));
+ };
+ }
+
+ return hash;
+ },
+
+ /**
+ @method parseErrorResponse
+ @private
+ @param {String} responseText
+ @return {Object}
+ */
+ parseErrorResponse(responseText) {
+ var json = responseText;
+
+ try {
+ json = Ember.$.parseJSON(responseText);
+ } catch (e) {
+ // ignored
+ }
+
+ return json;
+ },
+
+ /**
+ @method normalizeErrorResponse
+ @private
+ @param {Number} status
+ @param {Object} headers
+ @param {Object} payload
+ @return {Array} errors payload
+ */
+ normalizeErrorResponse(status, headers, payload) {
+ if (payload && typeof payload === 'object' && payload.errors) {
+ return payload.errors;
+ } else {
+ return [{
+ status: `${status}`,
+ title: "The backend responded with an error",
+ detail: `${payload}`
+ }];
+ }
+ },
+
+ /**
+ Generates a detailed ("friendly") error message, with plenty
+ of information for debugging (good luck!)
+ @method generatedDetailedMessage
+ @private
+ @param {Number} status
+ @param {Object} headers
+ @param {Object} payload
+ @param {Object} requestData
+ @return {String} detailed error message
+ */
+ generatedDetailedMessage: function (status, headers, payload, requestData) {
+ var shortenedPayload = void 0;
+ var payloadContentType = headers["Content-Type"] || "Empty Content-Type";
+
+ if (payloadContentType === "text/html" && payload.length > 250) {
+ shortenedPayload = "[Omitted Lengthy HTML]";
+ } else {
+ shortenedPayload = payload;
+ }
+
+ var requestDescription = requestData.method + ' ' + requestData.url;
+ var payloadDescription = 'Payload (' + payloadContentType + ')';
+
+ return ['Ember Data Request ' + requestDescription + ' returned a ' + status, payloadDescription, shortenedPayload].join('\n');
+ },
+
+ // @since 2.5.0
+ buildQuery(snapshot) {
+ var query = {};
+
+ if (snapshot) {
+ var { include } = snapshot;
+
+ if (include) {
+ query.include = include;
+ }
+ }
+
+ return query;
+ },
+
+ _hasCustomizedAjax() {
+ if (this.ajax !== RESTAdapter.prototype.ajax) {
+ (true && !(false) && Ember.deprecate('RESTAdapter#ajax has been deprecated please use. `methodForRequest`, `urlForRequest`, `headersForRequest` or `dataForRequest` instead.', false, {
+ id: 'ds.rest-adapter.ajax',
+ until: '3.0.0'
+ }));
+
+ return true;
+ }
+
+ if (this.ajaxOptions !== RESTAdapter.prototype.ajaxOptions) {
+ (true && !(false) && Ember.deprecate('RESTAdapter#ajaxOptions has been deprecated please use. `methodForRequest`, `urlForRequest`, `headersForRequest` or `dataForRequest` instead.', false, {
+ id: 'ds.rest-adapter.ajax-options',
+ until: '3.0.0'
+ }));
+
+ return true;
+ }
+
+ return false;
+ }
+ });
+
+ if ((0, _private.isEnabled)('ds-improved-ajax')) {
+
+ RESTAdapter.reopen({
+
+ /*
+ * Get the data (body or query params) for a request.
+ *
+ * @public
+ * @method dataForRequest
+ * @param {Object} params
+ * @return {Object} data
+ */
+ dataForRequest(params) {
+ var { store, type, snapshot, requestType, query } = params;
+
+ // type is not passed to findBelongsTo and findHasMany
+ type = type || snapshot && snapshot.type;
+
+ var serializer = store.serializerFor(type.modelName);
+ var data = {};
+
+ switch (requestType) {
+ case 'createRecord':
+ serializer.serializeIntoHash(data, type, snapshot, { includeId: true });
+ break;
+
+ case 'updateRecord':
+ serializer.serializeIntoHash(data, type, snapshot);
+ break;
+
+ case 'findRecord':
+ data = this.buildQuery(snapshot);
+ break;
+
+ case 'findAll':
+ if (params.sinceToken) {
+ query = query || {};
+ query.since = params.sinceToken;
+ }
+ data = query;
+ break;
+
+ case 'query':
+ case 'queryRecord':
+ if (this.sortQueryParams) {
+ query = this.sortQueryParams(query);
+ }
+ data = query;
+ break;
+
+ case 'findMany':
+ data = { ids: params.ids };
+ break;
+
+ default:
+ data = undefined;
+ break;
+ }
+
+ return data;
+ },
+
+ /*
+ * Get the HTTP method for a request.
+ *
+ * @public
+ * @method methodForRequest
+ * @param {Object} params
+ * @return {String} HTTP method
+ */
+ methodForRequest(params) {
+ var { requestType } = params;
+
+ switch (requestType) {
+ case 'createRecord':
+ return 'POST';
+ case 'updateRecord':
+ return 'PUT';
+ case 'deleteRecord':
+ return 'DELETE';
+ }
+
+ return 'GET';
+ },
+
+ /*
+ * Get the URL for a request.
+ *
+ * @public
+ * @method urlForRequest
+ * @param {Object} params
+ * @return {String} URL
+ */
+ urlForRequest(params) {
+ var { type, id, ids, snapshot, snapshots, requestType, query } = params;
+
+ // type and id are not passed from updateRecord and deleteRecord, hence they
+ // are defined if not set
+ type = type || snapshot && snapshot.type;
+ id = id || snapshot && snapshot.id;
+
+ switch (requestType) {
+ case 'findAll':
+ return this.buildURL(type.modelName, null, snapshots, requestType);
+
+ case 'query':
+ case 'queryRecord':
+ return this.buildURL(type.modelName, null, null, requestType, query);
+
+ case 'findMany':
+ return this.buildURL(type.modelName, ids, snapshots, requestType);
+
+ case 'findHasMany':
+ case 'findBelongsTo':
+ {
+ var url = this.buildURL(type.modelName, id, snapshot, requestType);
+ return this.urlPrefix(params.url, url);
+ }
+ }
+
+ return this.buildURL(type.modelName, id, snapshot, requestType, query);
+ },
+
+ /*
+ * Get the headers for a request.
+ *
+ * By default the value of the `headers` property of the adapter is
+ * returned.
+ *
+ * @public
+ * @method headersForRequest
+ * @param {Object} params
+ * @return {Object} headers
+ */
+ headersForRequest(params) {
+ return this.get('headers');
+ },
+
+ /*
+ * Get an object which contains all properties for a request which should
+ * be made.
+ *
+ * @private
+ * @method _requestFor
+ * @param {Object} params
+ * @return {Object} request object
+ */
+ _requestFor(params) {
+ var method = this.methodForRequest(params);
+ var url = this.urlForRequest(params);
+ var headers = this.headersForRequest(params);
+ var data = this.dataForRequest(params);
+
+ return { method, url, headers, data };
+ },
+
+ /*
+ * Convert a request object into a hash which can be passed to `jQuery.ajax`.
+ *
+ * @private
+ * @method _requestToJQueryAjaxHash
+ * @param {Object} request
+ * @return {Object} jQuery ajax hash
+ */
+ _requestToJQueryAjaxHash(request) {
+ var hash = {};
+
+ hash.type = request.method;
+ hash.url = request.url;
+ hash.dataType = 'json';
+ hash.context = this;
+
+ if (request.data) {
+ if (request.method !== 'GET') {
+ hash.contentType = 'application/json; charset=utf-8';
+ hash.data = JSON.stringify(request.data);
+ } else {
+ hash.data = request.data;
+ }
+ }
+
+ var headers = request.headers;
+ if (headers !== undefined) {
+ hash.beforeSend = function (xhr) {
+ Object.keys(headers).forEach(key => xhr.setRequestHeader(key, headers[key]));
+ };
+ }
+
+ return hash;
+ },
+
+ /*
+ * Make a request using `jQuery.ajax`.
+ *
+ * @private
+ * @method _makeRequest
+ * @param {Object} request
+ * @return {Promise} promise
+ */
+ _makeRequest(request) {
+ var adapter = this;
+ var hash = this._requestToJQueryAjaxHash(request);
+
+ var { method, url } = request;
+ var requestData = { method, url };
+
+ return new Promise((resolve, reject) => {
+
+ hash.success = function (payload, textStatus, jqXHR) {
+ var response = ajaxSuccess(adapter, jqXHR, payload, requestData);
+ Ember.run.join(null, resolve, response);
+ };
+
+ hash.error = function (jqXHR, textStatus, errorThrown) {
+ var responseData = {
+ textStatus,
+ errorThrown
+ };
+ var error = ajaxError(adapter, jqXHR, requestData, responseData);
+ Ember.run.join(null, reject, error);
+ };
+
+ adapter._ajaxRequest(hash);
+ }, `DS: RESTAdapter#makeRequest: ${method} ${url}`);
+ }
+ });
+ }
+
+ function ajaxSuccess(adapter, jqXHR, payload, requestData) {
+ var response = void 0;
+ try {
+ response = adapter.handleResponse(jqXHR.status, (0, _private.parseResponseHeaders)(jqXHR.getAllResponseHeaders()), payload, requestData);
+ } catch (error) {
+ return Promise.reject(error);
+ }
+
+ if (response && response.isAdapterError) {
+ return Promise.reject(response);
+ } else {
+ return response;
+ }
+ }
+
+ function ajaxError(adapter, jqXHR, requestData, responseData) {
+ if (true) {
+ var message = `The server returned an empty string for ${requestData.method} ${requestData.url}, which cannot be parsed into a valid JSON. Return either null or {}.`;
+ var validJSONString = !(responseData.textStatus === "parsererror" && jqXHR.responseText === "");
+ (true && Ember.warn(message, validJSONString, {
+ id: 'ds.adapter.returned-empty-string-as-JSON'
+ }));
+ }
+
+ var error = void 0;
+
+ if (responseData.errorThrown instanceof Error) {
+ error = responseData.errorThrown;
+ } else if (responseData.textStatus === 'timeout') {
+ error = new _private.TimeoutError();
+ } else if (responseData.textStatus === 'abort' || jqXHR.status === 0) {
+ error = new _private.AbortError();
+ } else {
+ try {
+ error = adapter.handleResponse(jqXHR.status, (0, _private.parseResponseHeaders)(jqXHR.getAllResponseHeaders()), adapter.parseErrorResponse(jqXHR.responseText) || responseData.errorThrown, requestData);
+ } catch (e) {
+ error = e;
+ }
+ }
+
+ return error;
+ }
+
+ //From http://stackoverflow.com/questions/280634/endswith-in-javascript
+ function endsWith(string, suffix) {
+ if (typeof String.prototype.endsWith !== 'function') {
+ return string.indexOf(suffix, string.length - suffix.length) !== -1;
+ } else {
+ return string.endsWith(suffix);
+ }
+ }
+
+ exports.default = RESTAdapter;
+});
+;define('ember-data/attr', ['exports'], function (exports) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = attr;
+
+
+ /**
+ @module ember-data
+ */
+
+ function getDefaultValue(record, options, key) {
+ if (typeof options.defaultValue === 'function') {
+ return options.defaultValue.apply(null, arguments);
+ } else {
+ var defaultValue = options.defaultValue;
+ (true && !(typeof defaultValue !== 'object' || defaultValue === null) && Ember.assert(`Non primitive defaultValues are not supported because they are shared between all instances. If you would like to use a complex object as a default value please provide a function that returns the complex object.`, typeof defaultValue !== 'object' || defaultValue === null));
+
+ return defaultValue;
+ }
+ }
+
+ function hasValue(record, key) {
+ return key in record._attributes || key in record._inFlightAttributes || key in record._data;
+ }
+
+ function getValue(record, key) {
+ if (key in record._attributes) {
+ return record._attributes[key];
+ } else if (key in record._inFlightAttributes) {
+ return record._inFlightAttributes[key];
+ } else {
+ return record._data[key];
+ }
+ }
+
+ /**
+ `DS.attr` defines an attribute on a [DS.Model](/api/data/classes/DS.Model.html).
+ By default, attributes are passed through as-is, however you can specify an
+ optional type to have the value automatically transformed.
+ Ember Data ships with four basic transform types: `string`, `number`,
+ `boolean` and `date`. You can define your own transforms by subclassing
+ [DS.Transform](/api/data/classes/DS.Transform.html).
+
+ Note that you cannot use `attr` to define an attribute of `id`.
+
+ `DS.attr` takes an optional hash as a second parameter, currently
+ supported options are:
+
+ - `defaultValue`: Pass a string or a function to be called to set the attribute
+ to a default value if none is supplied.
+
+ Example
+
+ ```app/models/user.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ username: DS.attr('string'),
+ email: DS.attr('string'),
+ verified: DS.attr('boolean', { defaultValue: false })
+ });
+ ```
+
+ Default value can also be a function. This is useful it you want to return
+ a new object for each attribute.
+
+ ```app/models/user.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ username: DS.attr('string'),
+ email: DS.attr('string'),
+ settings: DS.attr({
+ defaultValue() {
+ return {};
+ }
+ })
+ });
+ ```
+
+ The `options` hash is passed as second argument to a transforms'
+ `serialize` and `deserialize` method. This allows to configure a
+ transformation and adapt the corresponding value, based on the config:
+
+ ```app/models/post.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ text: DS.attr('text', {
+ uppercase: true
+ })
+ });
+ ```
+
+ ```app/transforms/text.js
+ import DS from 'ember-data';
+
+ export default DS.Transform.extend({
+ serialize(value, options) {
+ if (options.uppercase) {
+ return value.toUpperCase();
+ }
+
+ return value;
+ },
+
+ deserialize(value) {
+ return value;
+ }
+ })
+ ```
+
+ @namespace
+ @method attr
+ @for DS
+ @param {String|Object} type the attribute type
+ @param {Object} options a hash of options
+ @return {Attribute}
+ */
+
+ function attr(type, options) {
+ if (typeof type === 'object') {
+ options = type;
+ type = undefined;
+ } else {
+ options = options || {};
+ }
+
+ var meta = {
+ type: type,
+ isAttribute: true,
+ options: options
+ };
+
+ return Ember.computed({
+ get(key) {
+ var internalModel = this._internalModel;
+ if (hasValue(internalModel, key)) {
+ return getValue(internalModel, key);
+ } else {
+ return getDefaultValue(this, options, key);
+ }
+ },
+ set(key, value) {
+ var internalModel = this._internalModel;
+ var oldValue = getValue(internalModel, key);
+ var originalValue = void 0;
+
+ if (value !== oldValue) {
+ // Add the new value to the changed attributes hash; it will get deleted by
+ // the 'didSetProperty' handler if it is no different from the original value
+ internalModel._attributes[key] = value;
+
+ if (key in internalModel._inFlightAttributes) {
+ originalValue = internalModel._inFlightAttributes[key];
+ } else {
+ originalValue = internalModel._data[key];
+ }
+
+ this._internalModel.send('didSetProperty', {
+ name: key,
+ oldValue: oldValue,
+ originalValue: originalValue,
+ value: value
+ });
+ }
+
+ return value;
+ }
+ }).meta(meta);
+ }
+});
+;define("ember-data/index", ["exports", "ember-data/-private", "ember-data/setup-container", "ember-data/initialize-store-service", "ember-data/transforms/transform", "ember-data/transforms/number", "ember-data/transforms/date", "ember-data/transforms/string", "ember-data/transforms/boolean", "ember-data/adapter", "ember-data/adapters/json-api", "ember-data/adapters/rest", "ember-data/serializer", "ember-data/serializers/json-api", "ember-data/serializers/json", "ember-data/serializers/rest", "ember-data/serializers/embedded-records-mixin", "ember-data/attr", "ember-inflector"], function (exports, _private, _setupContainer, _initializeStoreService, _transform, _number, _date, _string, _boolean, _adapter, _jsonApi, _rest, _serializer, _jsonApi2, _json, _rest2, _embeddedRecordsMixin, _attr) {
+ "use strict";
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+
+
+ /**
+ Ember Data
+ @module ember-data
+ @main ember-data
+ */
+
+ if (Ember.VERSION.match(/^1\.([0-9]|1[0-2])\./)) {
+ throw new Ember.Error("Ember Data requires at least Ember 1.13.0, but you have " + Ember.VERSION + ". Please upgrade your version of Ember, then upgrade Ember Data.");
+ }
+
+ _private.DS.Store = _private.Store;
+ _private.DS.PromiseArray = _private.PromiseArray;
+ _private.DS.PromiseObject = _private.PromiseObject;
+
+ _private.DS.PromiseManyArray = _private.PromiseManyArray;
+
+ _private.DS.Model = _private.Model;
+ _private.DS.RootState = _private.RootState;
+ _private.DS.attr = _attr.default;
+ _private.DS.Errors = _private.Errors;
+
+ _private.DS.InternalModel = _private.InternalModel;
+ _private.DS.Snapshot = _private.Snapshot;
+
+ _private.DS.Adapter = _adapter.default;
+
+ _private.DS.AdapterError = _private.AdapterError;
+ _private.DS.InvalidError = _private.InvalidError;
+ _private.DS.TimeoutError = _private.TimeoutError;
+ _private.DS.AbortError = _private.AbortError;
+
+ _private.DS.UnauthorizedError = _private.UnauthorizedError;
+ _private.DS.ForbiddenError = _private.ForbiddenError;
+ _private.DS.NotFoundError = _private.NotFoundError;
+ _private.DS.ConflictError = _private.ConflictError;
+ _private.DS.ServerError = _private.ServerError;
+
+ _private.DS.errorsHashToArray = _private.errorsHashToArray;
+ _private.DS.errorsArrayToHash = _private.errorsArrayToHash;
+
+ _private.DS.Serializer = _serializer.default;
+
+ _private.DS.DebugAdapter = _private.DebugAdapter;
+
+ _private.DS.RecordArray = _private.RecordArray;
+ _private.DS.FilteredRecordArray = _private.FilteredRecordArray;
+ _private.DS.AdapterPopulatedRecordArray = _private.AdapterPopulatedRecordArray;
+ _private.DS.ManyArray = _private.ManyArray;
+
+ _private.DS.RecordArrayManager = _private.RecordArrayManager;
+
+ _private.DS.RESTAdapter = _rest.default;
+ _private.DS.BuildURLMixin = _private.BuildURLMixin;
+
+ _private.DS.RESTSerializer = _rest2.default;
+ _private.DS.JSONSerializer = _json.default;
+
+ _private.DS.JSONAPIAdapter = _jsonApi.default;
+ _private.DS.JSONAPISerializer = _jsonApi2.default;
+
+ _private.DS.Transform = _transform.default;
+ _private.DS.DateTransform = _date.default;
+ _private.DS.StringTransform = _string.default;
+ _private.DS.NumberTransform = _number.default;
+ _private.DS.BooleanTransform = _boolean.default;
+
+ _private.DS.EmbeddedRecordsMixin = _embeddedRecordsMixin.default;
+
+ _private.DS.belongsTo = _private.belongsTo;
+ _private.DS.hasMany = _private.hasMany;
+
+ _private.DS.Relationship = _private.Relationship;
+
+ _private.DS._setupContainer = _setupContainer.default;
+ _private.DS._initializeStoreService = _initializeStoreService.default;
+
+ Object.defineProperty(_private.DS, 'normalizeModelName', {
+ enumerable: true,
+ writable: false,
+ configurable: false,
+ value: _private.normalizeModelName
+ });
+
+ exports.default = _private.DS;
+});
+;define('ember-data/initialize-store-service', ['exports'], function (exports) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = initializeStoreService;
+ /*
+ Configures a registry for use with an Ember-Data
+ store.
+
+ @method initializeStoreService
+ @param {Ember.ApplicationInstance | Ember.EngineInstance} instance
+ */
+ function initializeStoreService(instance) {
+ // instance.lookup supports Ember 2.1 and higher
+ // instance.container supports Ember 1.11 - 2.0
+ var container = instance.lookup ? instance : instance.container;
+
+ // Eagerly generate the store so defaultStore is populated.
+ container.lookup('service:store');
+ }
+});
+;define('ember-data/model', ['exports', 'ember-data/-private'], function (exports, _private) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function () {
+ return _private.Model;
+ }
+ });
+});
+;define('ember-data/relationships', ['exports', 'ember-data/-private'], function (exports, _private) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ Object.defineProperty(exports, 'belongsTo', {
+ enumerable: true,
+ get: function () {
+ return _private.belongsTo;
+ }
+ });
+ Object.defineProperty(exports, 'hasMany', {
+ enumerable: true,
+ get: function () {
+ return _private.hasMany;
+ }
+ });
+});
+;define('ember-data/serializer', ['exports'], function (exports) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = Ember.Object.extend({
+
+ /**
+ The `store` property is the application's `store` that contains
+ all records. It can be used to look up serializers for other model
+ types that may be nested inside the payload response.
+ Example:
+ ```js
+ Serializer.extend({
+ extractRelationship(relationshipModelName, relationshipHash) {
+ var modelClass = this.store.modelFor(relationshipModelName);
+ var relationshipSerializer = this.store.serializerFor(relationshipModelName);
+ return relationshipSerializer.normalize(modelClass, relationshipHash);
+ }
+ });
+ ```
+ @property store
+ @type {DS.Store}
+ @public
+ */
+
+ /**
+ The `normalizeResponse` method is used to normalize a payload from the
+ server to a JSON-API Document.
+ http://jsonapi.org/format/#document-structure
+ Example:
+ ```js
+ Serializer.extend({
+ normalizeResponse(store, primaryModelClass, payload, id, requestType) {
+ if (requestType === 'findRecord') {
+ return this.normalize(primaryModelClass, payload);
+ } else {
+ return payload.reduce(function(documentHash, item) {
+ let { data, included } = this.normalize(primaryModelClass, item);
+ documentHash.included.push(...included);
+ documentHash.data.push(data);
+ return documentHash;
+ }, { data: [], included: [] })
+ }
+ }
+ });
+ ```
+ @since 1.13.0
+ @method normalizeResponse
+ @param {DS.Store} store
+ @param {DS.Model} primaryModelClass
+ @param {Object} payload
+ @param {String|Number} id
+ @param {String} requestType
+ @return {Object} JSON-API Document
+ */
+ normalizeResponse: null,
+
+ /**
+ The `serialize` method is used when a record is saved in order to convert
+ the record into the form that your external data source expects.
+ `serialize` takes an optional `options` hash with a single option:
+ - `includeId`: If this is `true`, `serialize` should include the ID
+ in the serialized object it builds.
+ Example:
+ ```js
+ Serializer.extend({
+ serialize(snapshot, options) {
+ var json = {
+ id: snapshot.id
+ };
+ snapshot.eachAttribute((key, attribute) => {
+ json[key] = snapshot.attr(key);
+ });
+ snapshot.eachRelationship((key, relationship) => {
+ if (relationship.kind === 'belongsTo') {
+ json[key] = snapshot.belongsTo(key, { id: true });
+ } else if (relationship.kind === 'hasMany') {
+ json[key] = snapshot.hasMany(key, { ids: true });
+ }
+ });
+ return json;
+ },
+ });
+ ```
+ @method serialize
+ @param {DS.Snapshot} snapshot
+ @param {Object} [options]
+ @return {Object}
+ */
+ serialize: null,
+
+ /**
+ The `normalize` method is used to convert a payload received from your
+ external data source into the normalized form `store.push()` expects. You
+ should override this method, munge the hash and return the normalized
+ payload.
+ Example:
+ ```js
+ Serializer.extend({
+ normalize(modelClass, resourceHash) {
+ var data = {
+ id: resourceHash.id,
+ type: modelClass.modelName,
+ attributes: resourceHash
+ };
+ return { data: data };
+ }
+ })
+ ```
+ @method normalize
+ @param {DS.Model} typeClass
+ @param {Object} hash
+ @return {Object}
+ */
+ normalize(typeClass, hash) {
+ return hash;
+ }
+
+ });
+});
+;define('ember-data/serializers/embedded-records-mixin', ['exports'], function (exports) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = Ember.Mixin.create({
+
+ /**
+ Normalize the record and recursively normalize/extract all the embedded records
+ while pushing them into the store as they are encountered
+ A payload with an attr configured for embedded records needs to be extracted:
+ ```js
+ {
+ "post": {
+ "id": "1"
+ "title": "Rails is omakase",
+ "comments": [{
+ "id": "1",
+ "body": "Rails is unagi"
+ }, {
+ "id": "2",
+ "body": "Omakase O_o"
+ }]
+ }
+ }
+ ```
+ @method normalize
+ @param {DS.Model} typeClass
+ @param {Object} hash to be normalized
+ @param {String} prop the hash has been referenced by
+ @return {Object} the normalized hash
+ **/
+ normalize(typeClass, hash, prop) {
+ var normalizedHash = this._super(typeClass, hash, prop);
+ return this._extractEmbeddedRecords(this, this.store, typeClass, normalizedHash);
+ },
+
+ keyForRelationship(key, typeClass, method) {
+ if (method === 'serialize' && this.hasSerializeRecordsOption(key) || method === 'deserialize' && this.hasDeserializeRecordsOption(key)) {
+ return this.keyForAttribute(key, method);
+ } else {
+ return this._super(key, typeClass, method) || key;
+ }
+ },
+
+ /**
+ Serialize `belongsTo` relationship when it is configured as an embedded object.
+ This example of an author model belongs to a post model:
+ ```js
+ Post = DS.Model.extend({
+ title: DS.attr('string'),
+ body: DS.attr('string'),
+ author: DS.belongsTo('author')
+ });
+ Author = DS.Model.extend({
+ name: DS.attr('string'),
+ post: DS.belongsTo('post')
+ });
+ ```
+ Use a custom (type) serializer for the post model to configure embedded author
+ ```app/serializers/post.js
+ import DS from 'ember-data';
+ export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
+ attrs: {
+ author: { embedded: 'always' }
+ }
+ })
+ ```
+ A payload with an attribute configured for embedded records can serialize
+ the records together under the root attribute's payload:
+ ```js
+ {
+ "post": {
+ "id": "1"
+ "title": "Rails is omakase",
+ "author": {
+ "id": "2"
+ "name": "dhh"
+ }
+ }
+ }
+ ```
+ @method serializeBelongsTo
+ @param {DS.Snapshot} snapshot
+ @param {Object} json
+ @param {Object} relationship
+ */
+ serializeBelongsTo(snapshot, json, relationship) {
+ var attr = relationship.key;
+ if (this.noSerializeOptionSpecified(attr)) {
+ this._super(snapshot, json, relationship);
+ return;
+ }
+ var includeIds = this.hasSerializeIdsOption(attr);
+ var includeRecords = this.hasSerializeRecordsOption(attr);
+ var embeddedSnapshot = snapshot.belongsTo(attr);
+ if (includeIds) {
+ var serializedKey = this._getMappedKey(relationship.key, snapshot.type);
+ if (serializedKey === relationship.key && this.keyForRelationship) {
+ serializedKey = this.keyForRelationship(relationship.key, relationship.kind, "serialize");
+ }
+
+ if (!embeddedSnapshot) {
+ json[serializedKey] = null;
+ } else {
+ json[serializedKey] = embeddedSnapshot.id;
+
+ if (relationship.options.polymorphic) {
+ this.serializePolymorphicType(snapshot, json, relationship);
+ }
+ }
+ } else if (includeRecords) {
+ this._serializeEmbeddedBelongsTo(snapshot, json, relationship);
+ }
+ },
+
+ _serializeEmbeddedBelongsTo(snapshot, json, relationship) {
+ var embeddedSnapshot = snapshot.belongsTo(relationship.key);
+ var serializedKey = this._getMappedKey(relationship.key, snapshot.type);
+ if (serializedKey === relationship.key && this.keyForRelationship) {
+ serializedKey = this.keyForRelationship(relationship.key, relationship.kind, "serialize");
+ }
+
+ if (!embeddedSnapshot) {
+ json[serializedKey] = null;
+ } else {
+ json[serializedKey] = embeddedSnapshot.serialize({ includeId: true });
+ this.removeEmbeddedForeignKey(snapshot, embeddedSnapshot, relationship, json[serializedKey]);
+
+ if (relationship.options.polymorphic) {
+ this.serializePolymorphicType(snapshot, json, relationship);
+ }
+ }
+ },
+
+ /**
+ Serializes `hasMany` relationships when it is configured as embedded objects.
+ This example of a post model has many comments:
+ ```js
+ Post = DS.Model.extend({
+ title: DS.attr('string'),
+ body: DS.attr('string'),
+ comments: DS.hasMany('comment')
+ });
+ Comment = DS.Model.extend({
+ body: DS.attr('string'),
+ post: DS.belongsTo('post')
+ });
+ ```
+ Use a custom (type) serializer for the post model to configure embedded comments
+ ```app/serializers/post.js
+ import DS from 'ember-data;
+ export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
+ attrs: {
+ comments: { embedded: 'always' }
+ }
+ })
+ ```
+ A payload with an attribute configured for embedded records can serialize
+ the records together under the root attribute's payload:
+ ```js
+ {
+ "post": {
+ "id": "1"
+ "title": "Rails is omakase",
+ "body": "I want this for my ORM, I want that for my template language..."
+ "comments": [{
+ "id": "1",
+ "body": "Rails is unagi"
+ }, {
+ "id": "2",
+ "body": "Omakase O_o"
+ }]
+ }
+ }
+ ```
+ The attrs options object can use more specific instruction for extracting and
+ serializing. When serializing, an option to embed `ids`, `ids-and-types` or `records` can be set.
+ When extracting the only option is `records`.
+ So `{ embedded: 'always' }` is shorthand for:
+ `{ serialize: 'records', deserialize: 'records' }`
+ To embed the `ids` for a related object (using a hasMany relationship):
+ ```app/serializers/post.js
+ import DS from 'ember-data;
+ export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
+ attrs: {
+ comments: { serialize: 'ids', deserialize: 'records' }
+ }
+ })
+ ```
+ ```js
+ {
+ "post": {
+ "id": "1"
+ "title": "Rails is omakase",
+ "body": "I want this for my ORM, I want that for my template language..."
+ "comments": ["1", "2"]
+ }
+ }
+ ```
+ To embed the relationship as a collection of objects with `id` and `type` keys, set
+ `ids-and-types` for the related object.
+ This is particularly useful for polymorphic relationships where records don't share
+ the same table and the `id` is not enough information.
+ By example having a user that has many pets:
+ ```js
+ User = DS.Model.extend({
+ name: DS.attr('string'),
+ pets: DS.hasMany('pet', { polymorphic: true })
+ });
+ Pet = DS.Model.extend({
+ name: DS.attr('string'),
+ });
+ Cat = Pet.extend({
+ // ...
+ });
+ Parrot = Pet.extend({
+ // ...
+ });
+ ```
+ ```app/serializers/user.js
+ import DS from 'ember-data;
+ export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
+ attrs: {
+ pets: { serialize: 'ids-and-types', deserialize: 'records' }
+ }
+ });
+ ```
+ ```js
+ {
+ "user": {
+ "id": "1"
+ "name": "Bertin Osborne",
+ "pets": [
+ { "id": "1", "type": "Cat" },
+ { "id": "1", "type": "Parrot"}
+ ]
+ }
+ }
+ ```
+ @method serializeHasMany
+ @param {DS.Snapshot} snapshot
+ @param {Object} json
+ @param {Object} relationship
+ */
+ serializeHasMany(snapshot, json, relationship) {
+ var attr = relationship.key;
+ if (this.noSerializeOptionSpecified(attr)) {
+ this._super(snapshot, json, relationship);
+ return;
+ }
+
+ if (this.hasSerializeIdsOption(attr)) {
+ var serializedKey = this._getMappedKey(relationship.key, snapshot.type);
+ if (serializedKey === relationship.key && this.keyForRelationship) {
+ serializedKey = this.keyForRelationship(relationship.key, relationship.kind, "serialize");
+ }
+
+ json[serializedKey] = snapshot.hasMany(attr, { ids: true });
+ } else if (this.hasSerializeRecordsOption(attr)) {
+ this._serializeEmbeddedHasMany(snapshot, json, relationship);
+ } else {
+ if (this.hasSerializeIdsAndTypesOption(attr)) {
+ this._serializeHasManyAsIdsAndTypes(snapshot, json, relationship);
+ }
+ }
+ },
+
+ /*
+ Serializes a hasMany relationship as an array of objects containing only `id` and `type`
+ keys.
+ This has its use case on polymorphic hasMany relationships where the server is not storing
+ all records in the same table using STI, and therefore the `id` is not enough information
+ TODO: Make the default in Ember-data 3.0??
+ */
+ _serializeHasManyAsIdsAndTypes(snapshot, json, relationship) {
+ var serializedKey = this.keyForAttribute(relationship.key, 'serialize');
+ var hasMany = snapshot.hasMany(relationship.key);
+
+ json[serializedKey] = Ember.A(hasMany).map(function (recordSnapshot) {
+ //
+ // I'm sure I'm being utterly naive here. Propably id is a configurate property and
+ // type too, and the modelName has to be normalized somehow.
+ //
+ return { id: recordSnapshot.id, type: recordSnapshot.modelName };
+ });
+ },
+
+ _serializeEmbeddedHasMany(snapshot, json, relationship) {
+ var serializedKey = this._getMappedKey(relationship.key, snapshot.type);
+ if (serializedKey === relationship.key && this.keyForRelationship) {
+ serializedKey = this.keyForRelationship(relationship.key, relationship.kind, "serialize");
+ }
+
+ (true && Ember.warn(`The embedded relationship '${serializedKey}' is undefined for '${snapshot.modelName}' with id '${snapshot.id}'. Please include it in your original payload.`, Ember.typeOf(snapshot.hasMany(relationship.key)) !== 'undefined', { id: 'ds.serializer.embedded-relationship-undefined' }));
+
+
+ json[serializedKey] = this._generateSerializedHasMany(snapshot, relationship);
+ },
+
+ /*
+ Returns an array of embedded records serialized to JSON
+ */
+ _generateSerializedHasMany(snapshot, relationship) {
+ var hasMany = snapshot.hasMany(relationship.key);
+ var manyArray = Ember.A(hasMany);
+ var ret = new Array(manyArray.length);
+
+ for (var i = 0; i < manyArray.length; i++) {
+ var embeddedSnapshot = manyArray[i];
+ var embeddedJson = embeddedSnapshot.serialize({ includeId: true });
+ this.removeEmbeddedForeignKey(snapshot, embeddedSnapshot, relationship, embeddedJson);
+ ret[i] = embeddedJson;
+ }
+
+ return ret;
+ },
+
+ /**
+ When serializing an embedded record, modify the property (in the json payload)
+ that refers to the parent record (foreign key for relationship).
+ Serializing a `belongsTo` relationship removes the property that refers to the
+ parent record
+ Serializing a `hasMany` relationship does not remove the property that refers to
+ the parent record.
+ @method removeEmbeddedForeignKey
+ @param {DS.Snapshot} snapshot
+ @param {DS.Snapshot} embeddedSnapshot
+ @param {Object} relationship
+ @param {Object} json
+ */
+ removeEmbeddedForeignKey(snapshot, embeddedSnapshot, relationship, json) {
+ if (relationship.kind === 'belongsTo') {
+ var parentRecord = snapshot.type.inverseFor(relationship.key, this.store);
+ if (parentRecord) {
+ var name = parentRecord.name;
+ var embeddedSerializer = this.store.serializerFor(embeddedSnapshot.modelName);
+ var parentKey = embeddedSerializer.keyForRelationship(name, parentRecord.kind, 'deserialize');
+ if (parentKey) {
+ delete json[parentKey];
+ }
+ }
+ } /*else if (relationship.kind === 'hasMany') {
+ return;
+ }*/
+ },
+
+ // checks config for attrs option to embedded (always) - serialize and deserialize
+ hasEmbeddedAlwaysOption(attr) {
+ var option = this.attrsOption(attr);
+ return option && option.embedded === 'always';
+ },
+
+ // checks config for attrs option to serialize ids
+ hasSerializeRecordsOption(attr) {
+ var alwaysEmbed = this.hasEmbeddedAlwaysOption(attr);
+ var option = this.attrsOption(attr);
+ return alwaysEmbed || option && option.serialize === 'records';
+ },
+
+ // checks config for attrs option to serialize records
+ hasSerializeIdsOption(attr) {
+ var option = this.attrsOption(attr);
+ return option && (option.serialize === 'ids' || option.serialize === 'id');
+ },
+
+ // checks config for attrs option to serialize records as objects containing id and types
+ hasSerializeIdsAndTypesOption(attr) {
+ var option = this.attrsOption(attr);
+ return option && (option.serialize === 'ids-and-types' || option.serialize === 'id-and-type');
+ },
+
+ // checks config for attrs option to serialize records
+ noSerializeOptionSpecified(attr) {
+ var option = this.attrsOption(attr);
+ return !(option && (option.serialize || option.embedded));
+ },
+
+ // checks config for attrs option to deserialize records
+ // a defined option object for a resource is treated the same as
+ // `deserialize: 'records'`
+ hasDeserializeRecordsOption(attr) {
+ var alwaysEmbed = this.hasEmbeddedAlwaysOption(attr);
+ var option = this.attrsOption(attr);
+ return alwaysEmbed || option && option.deserialize === 'records';
+ },
+
+ attrsOption(attr) {
+ var attrs = this.get('attrs');
+ return attrs && (attrs[Ember.String.camelize(attr)] || attrs[attr]);
+ },
+
+ /**
+ @method _extractEmbeddedRecords
+ @private
+ */
+ _extractEmbeddedRecords(serializer, store, typeClass, partial) {
+ typeClass.eachRelationship((key, relationship) => {
+ if (serializer.hasDeserializeRecordsOption(key)) {
+ if (relationship.kind === "hasMany") {
+ this._extractEmbeddedHasMany(store, key, partial, relationship);
+ }
+ if (relationship.kind === "belongsTo") {
+ this._extractEmbeddedBelongsTo(store, key, partial, relationship);
+ }
+ }
+ });
+ return partial;
+ },
+
+ /**
+ @method _extractEmbeddedHasMany
+ @private
+ */
+ _extractEmbeddedHasMany(store, key, hash, relationshipMeta) {
+ var relationshipHash = Ember.get(hash, `data.relationships.${key}.data`);
+
+ if (!relationshipHash) {
+ return;
+ }
+
+ var hasMany = new Array(relationshipHash.length);
+
+ for (var i = 0; i < relationshipHash.length; i++) {
+ var item = relationshipHash[i];
+ var { data, included } = this._normalizeEmbeddedRelationship(store, relationshipMeta, item);
+ hash.included = hash.included || [];
+ hash.included.push(data);
+ if (included) {
+ hash.included.push(...included);
+ }
+
+ hasMany[i] = { id: data.id, type: data.type };
+ }
+
+ var relationship = { data: hasMany };
+ Ember.set(hash, `data.relationships.${key}`, relationship);
+ },
+
+ /**
+ @method _extractEmbeddedBelongsTo
+ @private
+ */
+ _extractEmbeddedBelongsTo(store, key, hash, relationshipMeta) {
+ var relationshipHash = Ember.get(hash, `data.relationships.${key}.data`);
+ if (!relationshipHash) {
+ return;
+ }
+
+ var { data, included } = this._normalizeEmbeddedRelationship(store, relationshipMeta, relationshipHash);
+ hash.included = hash.included || [];
+ hash.included.push(data);
+ if (included) {
+ hash.included.push(...included);
+ }
+
+ var belongsTo = { id: data.id, type: data.type };
+ var relationship = { data: belongsTo };
+
+ Ember.set(hash, `data.relationships.${key}`, relationship);
+ },
+
+ /**
+ @method _normalizeEmbeddedRelationship
+ @private
+ */
+ _normalizeEmbeddedRelationship(store, relationshipMeta, relationshipHash) {
+ var modelName = relationshipMeta.type;
+ if (relationshipMeta.options.polymorphic) {
+ modelName = relationshipHash.type;
+ }
+ var modelClass = store.modelFor(modelName);
+ var serializer = store.serializerFor(modelName);
+
+ return serializer.normalize(modelClass, relationshipHash, null);
+ },
+ isEmbeddedRecordsMixin: true
+ });
+});
+;define('ember-data/serializers/json-api', ['exports', 'ember-inflector', 'ember-data/serializers/json', 'ember-data/-private'], function (exports, _emberInflector, _json, _private) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+
+
+ /**
+ Ember Data 2.0 Serializer:
+
+ In Ember Data a Serializer is used to serialize and deserialize
+ records when they are transferred in and out of an external source.
+ This process involves normalizing property names, transforming
+ attribute values and serializing relationships.
+
+ `JSONAPISerializer` supports the http://jsonapi.org/ spec and is the
+ serializer recommended by Ember Data.
+
+ This serializer normalizes a JSON API payload that looks like:
+
+ ```app/models/player.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ name: DS.attr('string'),
+ skill: DS.attr('string'),
+ gamesPlayed: DS.attr('number'),
+ club: DS.belongsTo('club')
+ });
+ ```
+
+ ```app/models/club.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ name: DS.attr('string'),
+ location: DS.attr('string'),
+ players: DS.hasMany('player')
+ });
+ ```
+
+ ```js
+ {
+ "data": [
+ {
+ "attributes": {
+ "name": "Benfica",
+ "location": "Portugal"
+ },
+ "id": "1",
+ "relationships": {
+ "players": {
+ "data": [
+ {
+ "id": "3",
+ "type": "players"
+ }
+ ]
+ }
+ },
+ "type": "clubs"
+ }
+ ],
+ "included": [
+ {
+ "attributes": {
+ "name": "Eusebio Silva Ferreira",
+ "skill": "Rocket shot",
+ "games-played": 431
+ },
+ "id": "3",
+ "relationships": {
+ "club": {
+ "data": {
+ "id": "1",
+ "type": "clubs"
+ }
+ }
+ },
+ "type": "players"
+ }
+ ]
+ }
+ ```
+
+ to the format that the Ember Data store expects.
+
+ ### Customizing meta
+
+ Since a JSON API Document can have meta defined in multiple locations you can
+ use the specific serializer hooks if you need to customize the meta.
+
+ One scenario would be to camelCase the meta keys of your payload. The example
+ below shows how this could be done using `normalizeArrayResponse` and
+ `extractRelationship`.
+
+ ```app/serializers/application.js
+ export default JSONAPISerializer.extend({
+ normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {
+ let normalizedDocument = this._super(...arguments);
+
+ // Customize document meta
+ normalizedDocument.meta = camelCaseKeys(normalizedDocument.meta);
+
+ return normalizedDocument;
+ },
+
+ extractRelationship(relationshipHash) {
+ let normalizedRelationship = this._super(...arguments);
+
+ // Customize relationship meta
+ normalizedRelationship.meta = camelCaseKeys(normalizedRelationship.meta);
+
+ return normalizedRelationship;
+ }
+ });
+ ```
+
+ @since 1.13.0
+ @class JSONAPISerializer
+ @namespace DS
+ @extends DS.JSONSerializer
+ */
+ var JSONAPISerializer = _json.default.extend({
+
+ /**
+ @method _normalizeDocumentHelper
+ @param {Object} documentHash
+ @return {Object}
+ @private
+ */
+ _normalizeDocumentHelper(documentHash) {
+
+ if (Ember.typeOf(documentHash.data) === 'object') {
+ documentHash.data = this._normalizeResourceHelper(documentHash.data);
+ } else if (Array.isArray(documentHash.data)) {
+ var ret = new Array(documentHash.data.length);
+
+ for (var i = 0; i < documentHash.data.length; i++) {
+ var data = documentHash.data[i];
+ ret[i] = this._normalizeResourceHelper(data);
+ }
+
+ documentHash.data = ret;
+ }
+
+ if (Array.isArray(documentHash.included)) {
+ var _ret = new Array();
+ for (var _i = 0; _i < documentHash.included.length; _i++) {
+ var included = documentHash.included[_i];
+ var normalized = this._normalizeResourceHelper(included);
+ if (normalized !== null) {
+ // can be null when unknown type is encountered
+ _ret.push(normalized);
+ }
+ }
+
+ documentHash.included = _ret;
+ }
+
+ return documentHash;
+ },
+
+ /**
+ @method _normalizeRelationshipDataHelper
+ @param {Object} relationshipDataHash
+ @return {Object}
+ @private
+ */
+ _normalizeRelationshipDataHelper(relationshipDataHash) {
+ if ((0, _private.isEnabled)("ds-payload-type-hooks")) {
+ var modelName = this.modelNameFromPayloadType(relationshipDataHash.type);
+ var deprecatedModelNameLookup = this.modelNameFromPayloadKey(relationshipDataHash.type);
+
+ if (modelName !== deprecatedModelNameLookup && this._hasCustomModelNameFromPayloadKey()) {
+ (true && !(false) && Ember.deprecate("You are using modelNameFromPayloadKey to normalize the type for a relationship. This has been deprecated in favor of modelNameFromPayloadType", false, {
+ id: 'ds.json-api-serializer.deprecated-model-name-for-relationship',
+ until: '4.0.0'
+ }));
+
+
+ modelName = deprecatedModelNameLookup;
+ }
+
+ relationshipDataHash.type = modelName;
+ } else {
+ relationshipDataHash.type = this.modelNameFromPayloadKey(relationshipDataHash.type);
+ }
+
+ return relationshipDataHash;
+ },
+
+ /**
+ @method _normalizeResourceHelper
+ @param {Object} resourceHash
+ @return {Object}
+ @private
+ */
+ _normalizeResourceHelper(resourceHash) {
+ (true && !(!Ember.isNone(resourceHash.type)) && Ember.assert(this.warnMessageForUndefinedType(), !Ember.isNone(resourceHash.type), {
+ id: 'ds.serializer.type-is-undefined'
+ }));
+
+
+ var modelName = void 0,
+ usedLookup = void 0;
+
+ if ((0, _private.isEnabled)("ds-payload-type-hooks")) {
+ modelName = this.modelNameFromPayloadType(resourceHash.type);
+ var deprecatedModelNameLookup = this.modelNameFromPayloadKey(resourceHash.type);
+
+ usedLookup = 'modelNameFromPayloadType';
+
+ if (modelName !== deprecatedModelNameLookup && this._hasCustomModelNameFromPayloadKey()) {
+ (true && !(false) && Ember.deprecate("You are using modelNameFromPayloadKey to normalize the type for a resource. This has been deprecated in favor of modelNameFromPayloadType", false, {
+ id: 'ds.json-api-serializer.deprecated-model-name-for-resource',
+ until: '4.0.0'
+ }));
+
+
+ modelName = deprecatedModelNameLookup;
+ usedLookup = 'modelNameFromPayloadKey';
+ }
+ } else {
+ modelName = this.modelNameFromPayloadKey(resourceHash.type);
+ usedLookup = 'modelNameFromPayloadKey';
+ }
+
+ if (!this.store._hasModelFor(modelName)) {
+ (true && Ember.warn(this.warnMessageNoModelForType(modelName, resourceHash.type, usedLookup), false, {
+ id: 'ds.serializer.model-for-type-missing'
+ }));
+
+ return null;
+ }
+
+ var modelClass = this.store._modelFor(modelName);
+ var serializer = this.store.serializerFor(modelName);
+ var { data } = serializer.normalize(modelClass, resourceHash);
+ return data;
+ },
+
+ /**
+ @method pushPayload
+ @param {DS.Store} store
+ @param {Object} payload
+ */
+ pushPayload(store, payload) {
+ var normalizedPayload = this._normalizeDocumentHelper(payload);
+ if ((0, _private.isEnabled)('ds-pushpayload-return')) {
+ return store.push(normalizedPayload);
+ } else {
+ store.push(normalizedPayload);
+ }
+ },
+
+ /**
+ @method _normalizeResponse
+ @param {DS.Store} store
+ @param {DS.Model} primaryModelClass
+ @param {Object} payload
+ @param {String|Number} id
+ @param {String} requestType
+ @param {Boolean} isSingle
+ @return {Object} JSON-API Document
+ @private
+ */
+ _normalizeResponse(store, primaryModelClass, payload, id, requestType, isSingle) {
+ var normalizedPayload = this._normalizeDocumentHelper(payload);
+ return normalizedPayload;
+ },
+
+ normalizeQueryRecordResponse() {
+ var normalized = this._super(...arguments);
+
+ (true && !(!Array.isArray(normalized.data)) && Ember.assert('Expected the primary data returned by the serializer for a `queryRecord` response to be a single object but instead it was an array.', !Array.isArray(normalized.data), {
+ id: 'ds.serializer.json-api.queryRecord-array-response'
+ }));
+
+
+ return normalized;
+ },
+
+ extractAttributes(modelClass, resourceHash) {
+ var attributes = {};
+
+ if (resourceHash.attributes) {
+ modelClass.eachAttribute(key => {
+ var attributeKey = this.keyForAttribute(key, 'deserialize');
+ if (resourceHash.attributes[attributeKey] !== undefined) {
+ attributes[key] = resourceHash.attributes[attributeKey];
+ }
+ if (true) {
+ if (resourceHash.attributes[attributeKey] === undefined && resourceHash.attributes[key] !== undefined) {
+ (true && !(false) && Ember.assert(`Your payload for '${modelClass.modelName}' contains '${key}', but your serializer is setup to look for '${attributeKey}'. This is most likely because Ember Data's JSON API serializer dasherizes attribute keys by default. You should subclass JSONAPISerializer and implement 'keyForAttribute(key) { return key; }' to prevent Ember Data from customizing your attribute keys.`, false));
+ }
+ }
+ });
+ }
+
+ return attributes;
+ },
+
+ /**
+ Returns a relationship formatted as a JSON-API "relationship object".
+ http://jsonapi.org/format/#document-resource-object-relationships
+ @method extractRelationship
+ @param {Object} relationshipHash
+ @return {Object}
+ */
+ extractRelationship(relationshipHash) {
+
+ if (Ember.typeOf(relationshipHash.data) === 'object') {
+ relationshipHash.data = this._normalizeRelationshipDataHelper(relationshipHash.data);
+ }
+
+ if (Array.isArray(relationshipHash.data)) {
+ var ret = new Array(relationshipHash.data.length);
+
+ for (var i = 0; i < relationshipHash.data.length; i++) {
+ var data = relationshipHash.data[i];
+ ret[i] = this._normalizeRelationshipDataHelper(data);
+ }
+
+ relationshipHash.data = ret;
+ }
+
+ return relationshipHash;
+ },
+
+ /**
+ Returns the resource's relationships formatted as a JSON-API "relationships object".
+ http://jsonapi.org/format/#document-resource-object-relationships
+ @method extractRelationships
+ @param {Object} modelClass
+ @param {Object} resourceHash
+ @return {Object}
+ */
+ extractRelationships(modelClass, resourceHash) {
+ var relationships = {};
+
+ if (resourceHash.relationships) {
+ modelClass.eachRelationship((key, relationshipMeta) => {
+ var relationshipKey = this.keyForRelationship(key, relationshipMeta.kind, 'deserialize');
+ if (resourceHash.relationships[relationshipKey] !== undefined) {
+
+ var relationshipHash = resourceHash.relationships[relationshipKey];
+ relationships[key] = this.extractRelationship(relationshipHash);
+ }
+ if (true) {
+ if (resourceHash.relationships[relationshipKey] === undefined && resourceHash.relationships[key] !== undefined) {
+ (true && !(false) && Ember.assert(`Your payload for '${modelClass.modelName}' contains '${key}', but your serializer is setup to look for '${relationshipKey}'. This is most likely because Ember Data's JSON API serializer dasherizes relationship keys by default. You should subclass JSONAPISerializer and implement 'keyForRelationship(key) { return key; }' to prevent Ember Data from customizing your relationship keys.`, false));
+ }
+ }
+ });
+ }
+
+ return relationships;
+ },
+
+ /**
+ @method _extractType
+ @param {DS.Model} modelClass
+ @param {Object} resourceHash
+ @return {String}
+ @private
+ */
+ _extractType(modelClass, resourceHash) {
+ if ((0, _private.isEnabled)("ds-payload-type-hooks")) {
+ var modelName = this.modelNameFromPayloadType(resourceHash.type);
+ var deprecatedModelNameLookup = this.modelNameFromPayloadKey(resourceHash.type);
+
+ if (modelName !== deprecatedModelNameLookup && this._hasCustomModelNameFromPayloadKey()) {
+ (true && !(false) && Ember.deprecate("You are using modelNameFromPayloadKey to normalize the type for a polymorphic relationship. This has been deprecated in favor of modelNameFromPayloadType", false, {
+ id: 'ds.json-api-serializer.deprecated-model-name-for-polymorphic-type',
+ until: '3.0.0'
+ }));
+
+
+ modelName = deprecatedModelNameLookup;
+ }
+
+ return modelName;
+ } else {
+ return this.modelNameFromPayloadKey(resourceHash.type);
+ }
+ },
+
+ /**
+ Dasherizes and singularizes the model name in the payload to match
+ the format Ember Data uses internally for the model name.
+ For example the key `posts` would be converted to `post` and the
+ key `studentAssesments` would be converted to `student-assesment`.
+ @method modelNameFromPayloadKey
+ @param {String} key
+ @return {String} the model's modelName
+ */
+ // TODO @deprecated Use modelNameFromPayloadType instead
+ modelNameFromPayloadKey(key) {
+ return (0, _emberInflector.singularize)((0, _private.normalizeModelName)(key));
+ },
+
+ /**
+ Converts the model name to a pluralized version of the model name.
+ For example `post` would be converted to `posts` and
+ `student-assesment` would be converted to `student-assesments`.
+ @method payloadKeyFromModelName
+ @param {String} modelName
+ @return {String}
+ */
+ // TODO @deprecated Use payloadTypeFromModelName instead
+ payloadKeyFromModelName(modelName) {
+ return (0, _emberInflector.pluralize)(modelName);
+ },
+
+ normalize(modelClass, resourceHash) {
+ if (resourceHash.attributes) {
+ this.normalizeUsingDeclaredMapping(modelClass, resourceHash.attributes);
+ }
+
+ if (resourceHash.relationships) {
+ this.normalizeUsingDeclaredMapping(modelClass, resourceHash.relationships);
+ }
+
+ var data = {
+ id: this.extractId(modelClass, resourceHash),
+ type: this._extractType(modelClass, resourceHash),
+ attributes: this.extractAttributes(modelClass, resourceHash),
+ relationships: this.extractRelationships(modelClass, resourceHash)
+ };
+
+ this.applyTransforms(modelClass, data.attributes);
+
+ return { data };
+ },
+
+ /**
+ `keyForAttribute` can be used to define rules for how to convert an
+ attribute name in your model to a key in your JSON.
+ By default `JSONAPISerializer` follows the format used on the examples of
+ http://jsonapi.org/format and uses dashes as the word separator in the JSON
+ attribute keys.
+ This behaviour can be easily customized by extending this method.
+ Example
+ ```app/serializers/application.js
+ import DS from 'ember-data';
+ import { dasherize } from '@ember/string';
+ export default DS.JSONAPISerializer.extend({
+ keyForAttribute(attr, method) {
+ return dasherize(attr).toUpperCase();
+ }
+ });
+ ```
+ @method keyForAttribute
+ @param {String} key
+ @param {String} method
+ @return {String} normalized key
+ */
+ keyForAttribute(key, method) {
+ return Ember.String.dasherize(key);
+ },
+
+ /**
+ `keyForRelationship` can be used to define a custom key when
+ serializing and deserializing relationship properties.
+ By default `JSONAPISerializer` follows the format used on the examples of
+ http://jsonapi.org/format and uses dashes as word separators in
+ relationship properties.
+ This behaviour can be easily customized by extending this method.
+ Example
+ ```app/serializers/post.js
+ import DS from 'ember-data';
+ import { underscore } from '@ember/string';
+ export default DS.JSONAPISerializer.extend({
+ keyForRelationship(key, relationship, method) {
+ return underscore(key);
+ }
+ });
+ ```
+ @method keyForRelationship
+ @param {String} key
+ @param {String} typeClass
+ @param {String} method
+ @return {String} normalized key
+ */
+ keyForRelationship(key, typeClass, method) {
+ return Ember.String.dasherize(key);
+ },
+
+ serialize(snapshot, options) {
+ var data = this._super(...arguments);
+
+ var payloadType = void 0;
+ if ((0, _private.isEnabled)("ds-payload-type-hooks")) {
+ payloadType = this.payloadTypeFromModelName(snapshot.modelName);
+ var deprecatedPayloadTypeLookup = this.payloadKeyFromModelName(snapshot.modelName);
+
+ if (payloadType !== deprecatedPayloadTypeLookup && this._hasCustomPayloadKeyFromModelName()) {
+ (true && !(false) && Ember.deprecate("You used payloadKeyFromModelName to customize how a type is serialized. Use payloadTypeFromModelName instead.", false, {
+ id: 'ds.json-api-serializer.deprecated-payload-type-for-model',
+ until: '4.0.0'
+ }));
+
+
+ payloadType = deprecatedPayloadTypeLookup;
+ }
+ } else {
+ payloadType = this.payloadKeyFromModelName(snapshot.modelName);
+ }
+
+ data.type = payloadType;
+ return { data };
+ },
+
+ serializeAttribute(snapshot, json, key, attribute) {
+ var type = attribute.type;
+
+ if (this._canSerialize(key)) {
+ json.attributes = json.attributes || {};
+
+ var value = snapshot.attr(key);
+ if (type) {
+ var transform = this.transformFor(type);
+ value = transform.serialize(value, attribute.options);
+ }
+
+ var payloadKey = this._getMappedKey(key, snapshot.type);
+
+ if (payloadKey === key) {
+ payloadKey = this.keyForAttribute(key, 'serialize');
+ }
+
+ json.attributes[payloadKey] = value;
+ }
+ },
+
+ serializeBelongsTo(snapshot, json, relationship) {
+ var key = relationship.key;
+
+ if (this._canSerialize(key)) {
+ var belongsTo = snapshot.belongsTo(key);
+ if (belongsTo !== undefined) {
+
+ json.relationships = json.relationships || {};
+
+ var payloadKey = this._getMappedKey(key, snapshot.type);
+ if (payloadKey === key) {
+ payloadKey = this.keyForRelationship(key, 'belongsTo', 'serialize');
+ }
+
+ var data = null;
+ if (belongsTo) {
+ var payloadType = void 0;
+
+ if ((0, _private.isEnabled)("ds-payload-type-hooks")) {
+ payloadType = this.payloadTypeFromModelName(belongsTo.modelName);
+ var deprecatedPayloadTypeLookup = this.payloadKeyFromModelName(belongsTo.modelName);
+
+ if (payloadType !== deprecatedPayloadTypeLookup && this._hasCustomPayloadKeyFromModelName()) {
+ (true && !(false) && Ember.deprecate("You used payloadKeyFromModelName to serialize type for belongs-to relationship. Use payloadTypeFromModelName instead.", false, {
+ id: 'ds.json-api-serializer.deprecated-payload-type-for-belongs-to',
+ until: '4.0.0'
+ }));
+
+
+ payloadType = deprecatedPayloadTypeLookup;
+ }
+ } else {
+ payloadType = this.payloadKeyFromModelName(belongsTo.modelName);
+ }
+
+ data = {
+ type: payloadType,
+ id: belongsTo.id
+ };
+ }
+
+ json.relationships[payloadKey] = { data };
+ }
+ }
+ },
+
+ serializeHasMany(snapshot, json, relationship) {
+ var key = relationship.key;
+
+ if (this.shouldSerializeHasMany(snapshot, key, relationship)) {
+ var hasMany = snapshot.hasMany(key);
+ if (hasMany !== undefined) {
+
+ json.relationships = json.relationships || {};
+
+ var payloadKey = this._getMappedKey(key, snapshot.type);
+ if (payloadKey === key && this.keyForRelationship) {
+ payloadKey = this.keyForRelationship(key, 'hasMany', 'serialize');
+ }
+
+ var data = new Array(hasMany.length);
+
+ for (var i = 0; i < hasMany.length; i++) {
+ var item = hasMany[i];
+
+ var payloadType = void 0;
+
+ if ((0, _private.isEnabled)("ds-payload-type-hooks")) {
+ payloadType = this.payloadTypeFromModelName(item.modelName);
+ var deprecatedPayloadTypeLookup = this.payloadKeyFromModelName(item.modelName);
+
+ if (payloadType !== deprecatedPayloadTypeLookup && this._hasCustomPayloadKeyFromModelName()) {
+ (true && !(false) && Ember.deprecate("You used payloadKeyFromModelName to serialize type for belongs-to relationship. Use payloadTypeFromModelName instead.", false, {
+ id: 'ds.json-api-serializer.deprecated-payload-type-for-has-many',
+ until: '4.0.0'
+ }));
+
+
+ payloadType = deprecatedPayloadTypeLookup;
+ }
+ } else {
+ payloadType = this.payloadKeyFromModelName(item.modelName);
+ }
+
+ data[i] = {
+ type: payloadType,
+ id: item.id
+ };
+ }
+
+ json.relationships[payloadKey] = { data };
+ }
+ }
+ }
+ }); /**
+ @module ember-data
+ */
+
+ if ((0, _private.isEnabled)("ds-payload-type-hooks")) {
+
+ JSONAPISerializer.reopen({
+
+ /**
+ `modelNameFromPayloadType` can be used to change the mapping for a DS model
+ name, taken from the value in the payload.
+ Say your API namespaces the type of a model and returns the following
+ payload for the `post` model:
+ ```javascript
+ // GET /api/posts/1
+ {
+ "data": {
+ "id": 1,
+ "type: "api::v1::post"
+ }
+ }
+ ```
+ By overwriting `modelNameFromPayloadType` you can specify that the
+ `post` model should be used:
+ ```app/serializers/application.js
+ import DS from 'ember-data';
+ export default DS.JSONAPISerializer.extend({
+ modelNameFromPayloadType(payloadType) {
+ return payloadType.replace('api::v1::', '');
+ }
+ });
+ ```
+ By default the modelName for a model is its singularized name in dasherized
+ form. Usually, Ember Data can use the correct inflection to do this for
+ you. Most of the time, you won't need to override
+ `modelNameFromPayloadType` for this purpose.
+ Also take a look at
+ [payloadTypeFromModelName](#method_payloadTypeFromModelName) to customize
+ how the type of a record should be serialized.
+ @method modelNameFromPayloadType
+ @public
+ @param {String} payloadType type from payload
+ @return {String} modelName
+ */
+ modelNameFromPayloadType(type) {
+ return (0, _emberInflector.singularize)((0, _private.normalizeModelName)(type));
+ },
+
+ /**
+ `payloadTypeFromModelName` can be used to change the mapping for the type in
+ the payload, taken from the model name.
+ Say your API namespaces the type of a model and expects the following
+ payload when you update the `post` model:
+ ```javascript
+ // POST /api/posts/1
+ {
+ "data": {
+ "id": 1,
+ "type": "api::v1::post"
+ }
+ }
+ ```
+ By overwriting `payloadTypeFromModelName` you can specify that the
+ namespaces model name for the `post` should be used:
+ ```app/serializers/application.js
+ import DS from 'ember-data';
+ export default JSONAPISerializer.extend({
+ payloadTypeFromModelName(modelName) {
+ return 'api::v1::' + modelName;
+ }
+ });
+ ```
+ By default the payload type is the pluralized model name. Usually, Ember
+ Data can use the correct inflection to do this for you. Most of the time,
+ you won't need to override `payloadTypeFromModelName` for this purpose.
+ Also take a look at
+ [modelNameFromPayloadType](#method_modelNameFromPayloadType) to customize
+ how the model name from should be mapped from the payload.
+ @method payloadTypeFromModelName
+ @public
+ @param {String} modelname modelName from the record
+ @return {String} payloadType
+ */
+ payloadTypeFromModelName(modelName) {
+ return (0, _emberInflector.pluralize)(modelName);
+ },
+
+ _hasCustomModelNameFromPayloadKey() {
+ return this.modelNameFromPayloadKey !== JSONAPISerializer.prototype.modelNameFromPayloadKey;
+ },
+
+ _hasCustomPayloadKeyFromModelName() {
+ return this.payloadKeyFromModelName !== JSONAPISerializer.prototype.payloadKeyFromModelName;
+ }
+
+ });
+ }
+
+ if (true) {
+ JSONAPISerializer.reopen({
+ willMergeMixin(props) {
+ var constructor = this.constructor;
+ (true && Ember.warn(`You've defined 'extractMeta' in ${constructor.toString()} which is not used for serializers extending JSONAPISerializer. Read more at https://emberjs.com/api/data/classes/DS.JSONAPISerializer.html#toc_customizing-meta on how to customize meta when using JSON API.`, Ember.isNone(props.extractMeta) || props.extractMeta === _json.default.prototype.extractMeta, {
+ id: 'ds.serializer.json-api.extractMeta'
+ }));
+ (true && Ember.warn('The JSONAPISerializer does not work with the EmbeddedRecordsMixin because the JSON API spec does not describe how to format embedded resources.', !props.isEmbeddedRecordsMixin, {
+ id: 'ds.serializer.embedded-records-mixin-not-supported'
+ }));
+ },
+ warnMessageForUndefinedType() {
+ return 'Encountered a resource object with an undefined type (resolved resource using ' + this.constructor.toString() + ')';
+ },
+ warnMessageNoModelForType(modelName, originalType, usedLookup) {
+ return `Encountered a resource object with type "${originalType}", but no model was found for model name "${modelName}" (resolved model name using '${this.constructor.toString()}.${usedLookup}("${originalType}")').`;
+ }
+ });
+ }
+
+ exports.default = JSONAPISerializer;
+});
+;define('ember-data/serializers/json', ['exports', 'ember-data/serializer', 'ember-data/-private'], function (exports, _serializer, _private) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+
+
+ var emberAssign = Ember.assign || Ember.merge;
+
+ /**
+ Ember Data 2.0 Serializer:
+
+ In Ember Data a Serializer is used to serialize and deserialize
+ records when they are transferred in and out of an external source.
+ This process involves normalizing property names, transforming
+ attribute values and serializing relationships.
+
+ By default, Ember Data uses and recommends the `JSONAPISerializer`.
+
+ `JSONSerializer` is useful for simpler or legacy backends that may
+ not support the http://jsonapi.org/ spec.
+
+ For example, given the following `User` model and JSON payload:
+
+ ```app/models/user.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ friends: DS.hasMany('user'),
+ house: DS.belongsTo('location'),
+
+ name: DS.attr('string')
+ });
+ ```
+
+ ```js
+ {
+ id: 1,
+ name: 'Sebastian',
+ friends: [3, 4],
+ links: {
+ house: '/houses/lefkada'
+ }
+ }
+ ```
+
+ `JSONSerializer` will normalize the JSON payload to the JSON API format that the
+ Ember Data store expects.
+
+ You can customize how JSONSerializer processes its payload by passing options in
+ the `attrs` hash or by subclassing the `JSONSerializer` and overriding hooks:
+
+ - To customize how a single record is normalized, use the `normalize` hook.
+ - To customize how `JSONSerializer` normalizes the whole server response, use the
+ `normalizeResponse` hook.
+ - To customize how `JSONSerializer` normalizes a specific response from the server,
+ use one of the many specific `normalizeResponse` hooks.
+ - To customize how `JSONSerializer` normalizes your id, attributes or relationships,
+ use the `extractId`, `extractAttributes` and `extractRelationships` hooks.
+
+ The `JSONSerializer` normalization process follows these steps:
+
+ - `normalizeResponse` - entry method to the serializer.
+ - `normalizeCreateRecordResponse` - a `normalizeResponse` for a specific operation is called.
+ - `normalizeSingleResponse`|`normalizeArrayResponse` - for methods like `createRecord` we expect
+ a single record back, while for methods like `findAll` we expect multiple records back.
+ - `normalize` - `normalizeArray` iterates and calls `normalize` for each of its records while `normalizeSingle`
+ calls it once. This is the method you most likely want to subclass.
+ - `extractId` | `extractAttributes` | `extractRelationships` - `normalize` delegates to these methods to
+ turn the record payload into the JSON API format.
+
+ @class JSONSerializer
+ @namespace DS
+ @extends DS.Serializer
+ */
+ var JSONSerializer = _serializer.default.extend({
+
+ /**
+ The `primaryKey` is used when serializing and deserializing
+ data. Ember Data always uses the `id` property to store the id of
+ the record. The external source may not always follow this
+ convention. In these cases it is useful to override the
+ `primaryKey` property to match the `primaryKey` of your external
+ store.
+ Example
+ ```app/serializers/application.js
+ import DS from 'ember-data';
+ export default DS.JSONSerializer.extend({
+ primaryKey: '_id'
+ });
+ ```
+ @property primaryKey
+ @type {String}
+ @default 'id'
+ */
+ primaryKey: 'id',
+
+ /**
+ The `attrs` object can be used to declare a simple mapping between
+ property names on `DS.Model` records and payload keys in the
+ serialized JSON object representing the record. An object with the
+ property `key` can also be used to designate the attribute's key on
+ the response payload.
+ Example
+ ```app/models/person.js
+ import DS from 'ember-data';
+ export default DS.Model.extend({
+ firstName: DS.attr('string'),
+ lastName: DS.attr('string'),
+ occupation: DS.attr('string'),
+ admin: DS.attr('boolean')
+ });
+ ```
+ ```app/serializers/person.js
+ import DS from 'ember-data';
+ export default DS.JSONSerializer.extend({
+ attrs: {
+ admin: 'is_admin',
+ occupation: { key: 'career' }
+ }
+ });
+ ```
+ You can also remove attributes by setting the `serialize` key to
+ `false` in your mapping object.
+ Example
+ ```app/serializers/person.js
+ import DS from 'ember-data';
+ export default DS.JSONSerializer.extend({
+ attrs: {
+ admin: { serialize: false },
+ occupation: { key: 'career' }
+ }
+ });
+ ```
+ When serialized:
+ ```javascript
+ {
+ "firstName": "Harry",
+ "lastName": "Houdini",
+ "career": "magician"
+ }
+ ```
+ Note that the `admin` is now not included in the payload.
+ @property attrs
+ @type {Object}
+ */
+ mergedProperties: ['attrs'],
+
+ /**
+ Given a subclass of `DS.Model` and a JSON object this method will
+ iterate through each attribute of the `DS.Model` and invoke the
+ `DS.Transform#deserialize` method on the matching property of the
+ JSON object. This method is typically called after the
+ serializer's `normalize` method.
+ @method applyTransforms
+ @private
+ @param {DS.Model} typeClass
+ @param {Object} data The data to transform
+ @return {Object} data The transformed data object
+ */
+ applyTransforms(typeClass, data) {
+ var attributes = Ember.get(typeClass, 'attributes');
+
+ typeClass.eachTransformedAttribute((key, typeClass) => {
+ if (data[key] === undefined) {
+ return;
+ }
+
+ var transform = this.transformFor(typeClass);
+ var transformMeta = attributes.get(key);
+ data[key] = transform.deserialize(data[key], transformMeta.options);
+ });
+
+ return data;
+ },
+
+ /**
+ The `normalizeResponse` method is used to normalize a payload from the
+ server to a JSON-API Document.
+ http://jsonapi.org/format/#document-structure
+ This method delegates to a more specific normalize method based on
+ the `requestType`.
+ To override this method with a custom one, make sure to call
+ `return this._super(store, primaryModelClass, payload, id, requestType)` with your
+ pre-processed data.
+ Here's an example of using `normalizeResponse` manually:
+ ```javascript
+ socket.on('message', function(message) {
+ var data = message.data;
+ var modelClass = store.modelFor(data.modelName);
+ var serializer = store.serializerFor(data.modelName);
+ var normalized = serializer.normalizeSingleResponse(store, modelClass, data, data.id);
+ store.push(normalized);
+ });
+ ```
+ @since 1.13.0
+ @method normalizeResponse
+ @param {DS.Store} store
+ @param {DS.Model} primaryModelClass
+ @param {Object} payload
+ @param {String|Number} id
+ @param {String} requestType
+ @return {Object} JSON-API Document
+ */
+ normalizeResponse(store, primaryModelClass, payload, id, requestType) {
+ switch (requestType) {
+ case 'findRecord':
+ return this.normalizeFindRecordResponse(...arguments);
+ case 'queryRecord':
+ return this.normalizeQueryRecordResponse(...arguments);
+ case 'findAll':
+ return this.normalizeFindAllResponse(...arguments);
+ case 'findBelongsTo':
+ return this.normalizeFindBelongsToResponse(...arguments);
+ case 'findHasMany':
+ return this.normalizeFindHasManyResponse(...arguments);
+ case 'findMany':
+ return this.normalizeFindManyResponse(...arguments);
+ case 'query':
+ return this.normalizeQueryResponse(...arguments);
+ case 'createRecord':
+ return this.normalizeCreateRecordResponse(...arguments);
+ case 'deleteRecord':
+ return this.normalizeDeleteRecordResponse(...arguments);
+ case 'updateRecord':
+ return this.normalizeUpdateRecordResponse(...arguments);
+ }
+ },
+
+ /**
+ @since 1.13.0
+ @method normalizeFindRecordResponse
+ @param {DS.Store} store
+ @param {DS.Model} primaryModelClass
+ @param {Object} payload
+ @param {String|Number} id
+ @param {String} requestType
+ @return {Object} JSON-API Document
+ */
+ normalizeFindRecordResponse(store, primaryModelClass, payload, id, requestType) {
+ return this.normalizeSingleResponse(...arguments);
+ },
+
+ /**
+ @since 1.13.0
+ @method normalizeQueryRecordResponse
+ @param {DS.Store} store
+ @param {DS.Model} primaryModelClass
+ @param {Object} payload
+ @param {String|Number} id
+ @param {String} requestType
+ @return {Object} JSON-API Document
+ */
+ normalizeQueryRecordResponse(store, primaryModelClass, payload, id, requestType) {
+ return this.normalizeSingleResponse(...arguments);
+ },
+
+ /**
+ @since 1.13.0
+ @method normalizeFindAllResponse
+ @param {DS.Store} store
+ @param {DS.Model} primaryModelClass
+ @param {Object} payload
+ @param {String|Number} id
+ @param {String} requestType
+ @return {Object} JSON-API Document
+ */
+ normalizeFindAllResponse(store, primaryModelClass, payload, id, requestType) {
+ return this.normalizeArrayResponse(...arguments);
+ },
+
+ /**
+ @since 1.13.0
+ @method normalizeFindBelongsToResponse
+ @param {DS.Store} store
+ @param {DS.Model} primaryModelClass
+ @param {Object} payload
+ @param {String|Number} id
+ @param {String} requestType
+ @return {Object} JSON-API Document
+ */
+ normalizeFindBelongsToResponse(store, primaryModelClass, payload, id, requestType) {
+ return this.normalizeSingleResponse(...arguments);
+ },
+
+ /**
+ @since 1.13.0
+ @method normalizeFindHasManyResponse
+ @param {DS.Store} store
+ @param {DS.Model} primaryModelClass
+ @param {Object} payload
+ @param {String|Number} id
+ @param {String} requestType
+ @return {Object} JSON-API Document
+ */
+ normalizeFindHasManyResponse(store, primaryModelClass, payload, id, requestType) {
+ return this.normalizeArrayResponse(...arguments);
+ },
+
+ /**
+ @since 1.13.0
+ @method normalizeFindManyResponse
+ @param {DS.Store} store
+ @param {DS.Model} primaryModelClass
+ @param {Object} payload
+ @param {String|Number} id
+ @param {String} requestType
+ @return {Object} JSON-API Document
+ */
+ normalizeFindManyResponse(store, primaryModelClass, payload, id, requestType) {
+ return this.normalizeArrayResponse(...arguments);
+ },
+
+ /**
+ @since 1.13.0
+ @method normalizeQueryResponse
+ @param {DS.Store} store
+ @param {DS.Model} primaryModelClass
+ @param {Object} payload
+ @param {String|Number} id
+ @param {String} requestType
+ @return {Object} JSON-API Document
+ */
+ normalizeQueryResponse(store, primaryModelClass, payload, id, requestType) {
+ return this.normalizeArrayResponse(...arguments);
+ },
+
+ /**
+ @since 1.13.0
+ @method normalizeCreateRecordResponse
+ @param {DS.Store} store
+ @param {DS.Model} primaryModelClass
+ @param {Object} payload
+ @param {String|Number} id
+ @param {String} requestType
+ @return {Object} JSON-API Document
+ */
+ normalizeCreateRecordResponse(store, primaryModelClass, payload, id, requestType) {
+ return this.normalizeSaveResponse(...arguments);
+ },
+
+ /**
+ @since 1.13.0
+ @method normalizeDeleteRecordResponse
+ @param {DS.Store} store
+ @param {DS.Model} primaryModelClass
+ @param {Object} payload
+ @param {String|Number} id
+ @param {String} requestType
+ @return {Object} JSON-API Document
+ */
+ normalizeDeleteRecordResponse(store, primaryModelClass, payload, id, requestType) {
+ return this.normalizeSaveResponse(...arguments);
+ },
+
+ /**
+ @since 1.13.0
+ @method normalizeUpdateRecordResponse
+ @param {DS.Store} store
+ @param {DS.Model} primaryModelClass
+ @param {Object} payload
+ @param {String|Number} id
+ @param {String} requestType
+ @return {Object} JSON-API Document
+ */
+ normalizeUpdateRecordResponse(store, primaryModelClass, payload, id, requestType) {
+ return this.normalizeSaveResponse(...arguments);
+ },
+
+ /**
+ @since 1.13.0
+ @method normalizeSaveResponse
+ @param {DS.Store} store
+ @param {DS.Model} primaryModelClass
+ @param {Object} payload
+ @param {String|Number} id
+ @param {String} requestType
+ @return {Object} JSON-API Document
+ */
+ normalizeSaveResponse(store, primaryModelClass, payload, id, requestType) {
+ return this.normalizeSingleResponse(...arguments);
+ },
+
+ /**
+ @since 1.13.0
+ @method normalizeSingleResponse
+ @param {DS.Store} store
+ @param {DS.Model} primaryModelClass
+ @param {Object} payload
+ @param {String|Number} id
+ @param {String} requestType
+ @return {Object} JSON-API Document
+ */
+ normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {
+ return this._normalizeResponse(store, primaryModelClass, payload, id, requestType, true);
+ },
+
+ /**
+ @since 1.13.0
+ @method normalizeArrayResponse
+ @param {DS.Store} store
+ @param {DS.Model} primaryModelClass
+ @param {Object} payload
+ @param {String|Number} id
+ @param {String} requestType
+ @return {Object} JSON-API Document
+ */
+ normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {
+ return this._normalizeResponse(store, primaryModelClass, payload, id, requestType, false);
+ },
+
+ /**
+ @method _normalizeResponse
+ @param {DS.Store} store
+ @param {DS.Model} primaryModelClass
+ @param {Object} payload
+ @param {String|Number} id
+ @param {String} requestType
+ @param {Boolean} isSingle
+ @return {Object} JSON-API Document
+ @private
+ */
+ _normalizeResponse(store, primaryModelClass, payload, id, requestType, isSingle) {
+ var documentHash = {
+ data: null,
+ included: []
+ };
+
+ var meta = this.extractMeta(store, primaryModelClass, payload);
+ if (meta) {
+ (true && !(Ember.typeOf(meta) === 'object') && Ember.assert('The `meta` returned from `extractMeta` has to be an object, not "' + Ember.typeOf(meta) + '".', Ember.typeOf(meta) === 'object'));
+
+ documentHash.meta = meta;
+ }
+
+ if (isSingle) {
+ var { data, included } = this.normalize(primaryModelClass, payload);
+ documentHash.data = data;
+ if (included) {
+ documentHash.included = included;
+ }
+ } else {
+ var ret = new Array(payload.length);
+ for (var i = 0, l = payload.length; i < l; i++) {
+ var item = payload[i];
+ var { data: _data, included: _included } = this.normalize(primaryModelClass, item);
+ if (_included) {
+ documentHash.included.push(..._included);
+ }
+ ret[i] = _data;
+ }
+
+ documentHash.data = ret;
+ }
+
+ return documentHash;
+ },
+
+ /**
+ Normalizes a part of the JSON payload returned by
+ the server. You should override this method, munge the hash
+ and call super if you have generic normalization to do.
+ It takes the type of the record that is being normalized
+ (as a DS.Model class), the property where the hash was
+ originally found, and the hash to normalize.
+ You can use this method, for example, to normalize underscored keys to camelized
+ or other general-purpose normalizations.
+ Example
+ ```app/serializers/application.js
+ import DS from 'ember-data';
+ import { underscore } from '@ember/string';
+ import { get } from '@ember/object';
+ export default DS.JSONSerializer.extend({
+ normalize(typeClass, hash) {
+ var fields = get(typeClass, 'fields');
+ fields.forEach(function(field) {
+ var payloadField = underscore(field);
+ if (field === payloadField) { return; }
+ hash[field] = hash[payloadField];
+ delete hash[payloadField];
+ });
+ return this._super.apply(this, arguments);
+ }
+ });
+ ```
+ @method normalize
+ @param {DS.Model} typeClass
+ @param {Object} hash
+ @return {Object}
+ */
+ normalize(modelClass, resourceHash) {
+ var data = null;
+
+ if (resourceHash) {
+ this.normalizeUsingDeclaredMapping(modelClass, resourceHash);
+ if (Ember.typeOf(resourceHash.links) === 'object') {
+ this.normalizeUsingDeclaredMapping(modelClass, resourceHash.links);
+ }
+
+ data = {
+ id: this.extractId(modelClass, resourceHash),
+ type: modelClass.modelName,
+ attributes: this.extractAttributes(modelClass, resourceHash),
+ relationships: this.extractRelationships(modelClass, resourceHash)
+ };
+
+ this.applyTransforms(modelClass, data.attributes);
+ }
+
+ return { data };
+ },
+
+ /**
+ Returns the resource's ID.
+ @method extractId
+ @param {Object} modelClass
+ @param {Object} resourceHash
+ @return {String}
+ */
+ extractId(modelClass, resourceHash) {
+ var primaryKey = Ember.get(this, 'primaryKey');
+ var id = resourceHash[primaryKey];
+ return (0, _private.coerceId)(id);
+ },
+
+ /**
+ Returns the resource's attributes formatted as a JSON-API "attributes object".
+ http://jsonapi.org/format/#document-resource-object-attributes
+ @method extractAttributes
+ @param {Object} modelClass
+ @param {Object} resourceHash
+ @return {Object}
+ */
+ extractAttributes(modelClass, resourceHash) {
+ var attributeKey = void 0;
+ var attributes = {};
+
+ modelClass.eachAttribute(key => {
+ attributeKey = this.keyForAttribute(key, 'deserialize');
+ if (resourceHash[attributeKey] !== undefined) {
+ attributes[key] = resourceHash[attributeKey];
+ }
+ });
+
+ return attributes;
+ },
+
+ /**
+ Returns a relationship formatted as a JSON-API "relationship object".
+ http://jsonapi.org/format/#document-resource-object-relationships
+ @method extractRelationship
+ @param {Object} relationshipModelName
+ @param {Object} relationshipHash
+ @return {Object}
+ */
+ extractRelationship(relationshipModelName, relationshipHash) {
+ if (Ember.isNone(relationshipHash)) {
+ return null;
+ }
+ /*
+ When `relationshipHash` is an object it usually means that the relationship
+ is polymorphic. It could however also be embedded resources that the
+ EmbeddedRecordsMixin has be able to process.
+ */
+ if (Ember.typeOf(relationshipHash) === 'object') {
+ if (relationshipHash.id) {
+ relationshipHash.id = (0, _private.coerceId)(relationshipHash.id);
+ }
+
+ var modelClass = this.store.modelFor(relationshipModelName);
+ if (relationshipHash.type && !(0, _private.modelHasAttributeOrRelationshipNamedType)(modelClass)) {
+
+ if ((0, _private.isEnabled)("ds-payload-type-hooks")) {
+ var modelName = this.modelNameFromPayloadType(relationshipHash.type);
+ var deprecatedModelNameLookup = this.modelNameFromPayloadKey(relationshipHash.type);
+
+ if (modelName !== deprecatedModelNameLookup && this._hasCustomModelNameFromPayloadKey()) {
+ (true && !(false) && Ember.deprecate("You used modelNameFromPayloadKey to customize how a type is normalized. Use modelNameFromPayloadType instead", false, {
+ id: 'ds.json-serializer.deprecated-type-for-polymorphic-relationship',
+ until: '3.0.0'
+ }));
+
+
+ modelName = deprecatedModelNameLookup;
+ }
+
+ relationshipHash.type = modelName;
+ } else {
+ relationshipHash.type = this.modelNameFromPayloadKey(relationshipHash.type);
+ }
+ }
+ return relationshipHash;
+ }
+ return { id: (0, _private.coerceId)(relationshipHash), type: relationshipModelName };
+ },
+
+ /**
+ Returns a polymorphic relationship formatted as a JSON-API "relationship object".
+ http://jsonapi.org/format/#document-resource-object-relationships
+ `relationshipOptions` is a hash which contains more information about the
+ polymorphic relationship which should be extracted:
+ - `resourceHash` complete hash of the resource the relationship should be
+ extracted from
+ - `relationshipKey` key under which the value for the relationship is
+ extracted from the resourceHash
+ - `relationshipMeta` meta information about the relationship
+ @method extractPolymorphicRelationship
+ @param {Object} relationshipModelName
+ @param {Object} relationshipHash
+ @param {Object} relationshipOptions
+ @return {Object}
+ */
+ extractPolymorphicRelationship(relationshipModelName, relationshipHash, relationshipOptions) {
+ return this.extractRelationship(relationshipModelName, relationshipHash);
+ },
+
+ /**
+ Returns the resource's relationships formatted as a JSON-API "relationships object".
+ http://jsonapi.org/format/#document-resource-object-relationships
+ @method extractRelationships
+ @param {Object} modelClass
+ @param {Object} resourceHash
+ @return {Object}
+ */
+ extractRelationships(modelClass, resourceHash) {
+ var relationships = {};
+
+ modelClass.eachRelationship((key, relationshipMeta) => {
+ var relationship = null;
+ var relationshipKey = this.keyForRelationship(key, relationshipMeta.kind, 'deserialize');
+ if (resourceHash[relationshipKey] !== undefined) {
+ var data = null;
+ var relationshipHash = resourceHash[relationshipKey];
+ if (relationshipMeta.kind === 'belongsTo') {
+ if (relationshipMeta.options.polymorphic) {
+ // extracting a polymorphic belongsTo may need more information
+ // than the type and the hash (which might only be an id) for the
+ // relationship, hence we pass the key, resource and
+ // relationshipMeta too
+ data = this.extractPolymorphicRelationship(relationshipMeta.type, relationshipHash, { key, resourceHash, relationshipMeta });
+ } else {
+ data = this.extractRelationship(relationshipMeta.type, relationshipHash);
+ }
+ } else if (relationshipMeta.kind === 'hasMany') {
+ if (!Ember.isNone(relationshipHash)) {
+ data = new Array(relationshipHash.length);
+ for (var i = 0, l = relationshipHash.length; i < l; i++) {
+ var item = relationshipHash[i];
+ data[i] = this.extractRelationship(relationshipMeta.type, item);
+ }
+ }
+ }
+ relationship = { data };
+ }
+
+ var linkKey = this.keyForLink(key, relationshipMeta.kind);
+ if (resourceHash.links && resourceHash.links[linkKey] !== undefined) {
+ var related = resourceHash.links[linkKey];
+ relationship = relationship || {};
+ relationship.links = { related };
+ }
+
+ if (relationship) {
+ relationships[key] = relationship;
+ }
+ });
+
+ return relationships;
+ },
+
+ /**
+ @method modelNameFromPayloadKey
+ @param {String} key
+ @return {String} the model's modelName
+ */
+ // TODO @deprecated Use modelNameFromPayloadType instead
+ modelNameFromPayloadKey(key) {
+ return (0, _private.normalizeModelName)(key);
+ },
+
+ /**
+ @method normalizeRelationships
+ @private
+ */
+ normalizeRelationships(typeClass, hash) {
+ var payloadKey = void 0;
+
+ if (this.keyForRelationship) {
+ typeClass.eachRelationship((key, relationship) => {
+ payloadKey = this.keyForRelationship(key, relationship.kind, 'deserialize');
+ if (key === payloadKey) {
+ return;
+ }
+ if (hash[payloadKey] === undefined) {
+ return;
+ }
+
+ hash[key] = hash[payloadKey];
+ delete hash[payloadKey];
+ });
+ }
+ },
+
+ /**
+ @method normalizeUsingDeclaredMapping
+ @private
+ */
+ normalizeUsingDeclaredMapping(modelClass, hash) {
+ var attrs = Ember.get(this, 'attrs');
+ var normalizedKey = void 0;
+ var payloadKey = void 0;
+
+ if (attrs) {
+ for (var key in attrs) {
+ normalizedKey = payloadKey = this._getMappedKey(key, modelClass);
+
+ if (hash[payloadKey] === undefined) {
+ continue;
+ }
+
+ if (Ember.get(modelClass, 'attributes').has(key)) {
+ normalizedKey = this.keyForAttribute(key);
+ }
+
+ if (Ember.get(modelClass, 'relationshipsByName').has(key)) {
+ normalizedKey = this.keyForRelationship(key);
+ }
+
+ if (payloadKey !== normalizedKey) {
+ hash[normalizedKey] = hash[payloadKey];
+ delete hash[payloadKey];
+ }
+ }
+ }
+ },
+
+ /**
+ Looks up the property key that was set by the custom `attr` mapping
+ passed to the serializer.
+ @method _getMappedKey
+ @private
+ @param {String} key
+ @return {String} key
+ */
+ _getMappedKey(key, modelClass) {
+ (true && Ember.warn('There is no attribute or relationship with the name `' + key + '` on `' + modelClass.modelName + '`. Check your serializers attrs hash.', Ember.get(modelClass, 'attributes').has(key) || Ember.get(modelClass, 'relationshipsByName').has(key), {
+ id: 'ds.serializer.no-mapped-attrs-key'
+ }));
+
+
+ var attrs = Ember.get(this, 'attrs');
+ var mappedKey = void 0;
+ if (attrs && attrs[key]) {
+ mappedKey = attrs[key];
+ //We need to account for both the { title: 'post_title' } and
+ //{ title: { key: 'post_title' }} forms
+ if (mappedKey.key) {
+ mappedKey = mappedKey.key;
+ }
+ if (typeof mappedKey === 'string') {
+ key = mappedKey;
+ }
+ }
+
+ return key;
+ },
+
+ /**
+ Check attrs.key.serialize property to inform if the `key`
+ can be serialized
+ @method _canSerialize
+ @private
+ @param {String} key
+ @return {boolean} true if the key can be serialized
+ */
+ _canSerialize(key) {
+ var attrs = Ember.get(this, 'attrs');
+
+ return !attrs || !attrs[key] || attrs[key].serialize !== false;
+ },
+
+ /**
+ When attrs.key.serialize is set to true then
+ it takes priority over the other checks and the related
+ attribute/relationship will be serialized
+ @method _mustSerialize
+ @private
+ @param {String} key
+ @return {boolean} true if the key must be serialized
+ */
+ _mustSerialize(key) {
+ var attrs = Ember.get(this, 'attrs');
+
+ return attrs && attrs[key] && attrs[key].serialize === true;
+ },
+
+ /**
+ Check if the given hasMany relationship should be serialized
+ @method shouldSerializeHasMany
+ @param {DS.Snapshot} snapshot
+ @param {String} key
+ @param {String} relationshipType
+ @return {boolean} true if the hasMany relationship should be serialized
+ */
+ shouldSerializeHasMany(snapshot, key, relationship) {
+ var relationshipType = snapshot.type.determineRelationshipType(relationship, this.store);
+ if (this._mustSerialize(key)) {
+ return true;
+ }
+ return this._canSerialize(key) && (relationshipType === 'manyToNone' || relationshipType === 'manyToMany');
+ },
+
+ // SERIALIZE
+ /**
+ Called when a record is saved in order to convert the
+ record into JSON.
+ By default, it creates a JSON object with a key for
+ each attribute and belongsTo relationship.
+ For example, consider this model:
+ ```app/models/comment.js
+ import DS from 'ember-data';
+ export default DS.Model.extend({
+ title: DS.attr(),
+ body: DS.attr(),
+ author: DS.belongsTo('user')
+ });
+ ```
+ The default serialization would create a JSON object like:
+ ```javascript
+ {
+ "title": "Rails is unagi",
+ "body": "Rails? Omakase? O_O",
+ "author": 12
+ }
+ ```
+ By default, attributes are passed through as-is, unless
+ you specified an attribute type (`DS.attr('date')`). If
+ you specify a transform, the JavaScript value will be
+ serialized when inserted into the JSON hash.
+ By default, belongs-to relationships are converted into
+ IDs when inserted into the JSON hash.
+ ## IDs
+ `serialize` takes an options hash with a single option:
+ `includeId`. If this option is `true`, `serialize` will,
+ by default include the ID in the JSON object it builds.
+ The adapter passes in `includeId: true` when serializing
+ a record for `createRecord`, but not for `updateRecord`.
+ ## Customization
+ Your server may expect a different JSON format than the
+ built-in serialization format.
+ In that case, you can implement `serialize` yourself and
+ return a JSON hash of your choosing.
+ ```app/serializers/post.js
+ import DS from 'ember-data';
+ export default DS.JSONSerializer.extend({
+ serialize(snapshot, options) {
+ var json = {
+ POST_TTL: snapshot.attr('title'),
+ POST_BDY: snapshot.attr('body'),
+ POST_CMS: snapshot.hasMany('comments', { ids: true })
+ };
+ if (options.includeId) {
+ json.POST_ID_ = snapshot.id;
+ }
+ return json;
+ }
+ });
+ ```
+ ## Customizing an App-Wide Serializer
+ If you want to define a serializer for your entire
+ application, you'll probably want to use `eachAttribute`
+ and `eachRelationship` on the record.
+ ```app/serializers/application.js
+ import DS from 'ember-data';
+ import { singularize } from 'ember-inflector';
+ export default DS.JSONSerializer.extend({
+ serialize(snapshot, options) {
+ var json = {};
+ snapshot.eachAttribute(function(name) {
+ json[serverAttributeName(name)] = snapshot.attr(name);
+ });
+ snapshot.eachRelationship(function(name, relationship) {
+ if (relationship.kind === 'hasMany') {
+ json[serverHasManyName(name)] = snapshot.hasMany(name, { ids: true });
+ }
+ });
+ if (options.includeId) {
+ json.ID_ = snapshot.id;
+ }
+ return json;
+ }
+ });
+ function serverAttributeName(attribute) {
+ return attribute.underscore().toUpperCase();
+ }
+ function serverHasManyName(name) {
+ return serverAttributeName(singularize(name)) + "_IDS";
+ }
+ ```
+ This serializer will generate JSON that looks like this:
+ ```javascript
+ {
+ "TITLE": "Rails is omakase",
+ "BODY": "Yep. Omakase.",
+ "COMMENT_IDS": [ 1, 2, 3 ]
+ }
+ ```
+ ## Tweaking the Default JSON
+ If you just want to do some small tweaks on the default JSON,
+ you can call super first and make the tweaks on the returned
+ JSON.
+ ```app/serializers/post.js
+ import DS from 'ember-data';
+ export default DS.JSONSerializer.extend({
+ serialize(snapshot, options) {
+ var json = this._super(...arguments);
+ json.subject = json.title;
+ delete json.title;
+ return json;
+ }
+ });
+ ```
+ @method serialize
+ @param {DS.Snapshot} snapshot
+ @param {Object} options
+ @return {Object} json
+ */
+ serialize(snapshot, options) {
+ var json = {};
+
+ if (options && options.includeId) {
+ if ((0, _private.isEnabled)('ds-serialize-id')) {
+ this.serializeId(snapshot, json, Ember.get(this, 'primaryKey'));
+ } else {
+ var id = snapshot.id;
+ if (id) {
+ json[Ember.get(this, 'primaryKey')] = id;
+ }
+ }
+ }
+
+ snapshot.eachAttribute((key, attribute) => {
+ this.serializeAttribute(snapshot, json, key, attribute);
+ });
+
+ snapshot.eachRelationship((key, relationship) => {
+ if (relationship.kind === 'belongsTo') {
+ this.serializeBelongsTo(snapshot, json, relationship);
+ } else if (relationship.kind === 'hasMany') {
+ this.serializeHasMany(snapshot, json, relationship);
+ }
+ });
+
+ return json;
+ },
+
+ /**
+ You can use this method to customize how a serialized record is added to the complete
+ JSON hash to be sent to the server. By default the JSON Serializer does not namespace
+ the payload and just sends the raw serialized JSON object.
+ If your server expects namespaced keys, you should consider using the RESTSerializer.
+ Otherwise you can override this method to customize how the record is added to the hash.
+ The hash property should be modified by reference.
+ For example, your server may expect underscored root objects.
+ ```app/serializers/application.js
+ import DS from 'ember-data';
+ import { decamelize } from '@ember/string';
+ export default DS.RESTSerializer.extend({
+ serializeIntoHash(data, type, snapshot, options) {
+ var root = decamelize(type.modelName);
+ data[root] = this.serialize(snapshot, options);
+ }
+ });
+ ```
+ @method serializeIntoHash
+ @param {Object} hash
+ @param {DS.Model} typeClass
+ @param {DS.Snapshot} snapshot
+ @param {Object} options
+ */
+ serializeIntoHash(hash, typeClass, snapshot, options) {
+ emberAssign(hash, this.serialize(snapshot, options));
+ },
+
+ /**
+ `serializeAttribute` can be used to customize how `DS.attr`
+ properties are serialized
+ For example if you wanted to ensure all your attributes were always
+ serialized as properties on an `attributes` object you could
+ write:
+ ```app/serializers/application.js
+ import DS from 'ember-data';
+ export default DS.JSONSerializer.extend({
+ serializeAttribute(snapshot, json, key, attributes) {
+ json.attributes = json.attributes || {};
+ this._super(snapshot, json.attributes, key, attributes);
+ }
+ });
+ ```
+ @method serializeAttribute
+ @param {DS.Snapshot} snapshot
+ @param {Object} json
+ @param {String} key
+ @param {Object} attribute
+ */
+ serializeAttribute(snapshot, json, key, attribute) {
+
+ if (this._canSerialize(key)) {
+ var type = attribute.type;
+ var value = snapshot.attr(key);
+ if (type) {
+ var transform = this.transformFor(type);
+ value = transform.serialize(value, attribute.options);
+ }
+
+ // if provided, use the mapping provided by `attrs` in
+ // the serializer
+ var payloadKey = this._getMappedKey(key, snapshot.type);
+
+ if (payloadKey === key && this.keyForAttribute) {
+ payloadKey = this.keyForAttribute(key, 'serialize');
+ }
+
+ json[payloadKey] = value;
+ }
+ },
+
+ /**
+ `serializeBelongsTo` can be used to customize how `DS.belongsTo`
+ properties are serialized.
+ Example
+ ```app/serializers/post.js
+ import DS from 'ember-data';
+ import { isNone } from '@ember/utils';
+ export default DS.JSONSerializer.extend({
+ serializeBelongsTo(snapshot, json, relationship) {
+ var key = relationship.key;
+ var belongsTo = snapshot.belongsTo(key);
+ key = this.keyForRelationship ? this.keyForRelationship(key, "belongsTo", "serialize") : key;
+ json[key] = isNone(belongsTo) ? belongsTo : belongsTo.record.toJSON();
+ }
+ });
+ ```
+ @method serializeBelongsTo
+ @param {DS.Snapshot} snapshot
+ @param {Object} json
+ @param {Object} relationship
+ */
+ serializeBelongsTo(snapshot, json, relationship) {
+ var key = relationship.key;
+
+ if (this._canSerialize(key)) {
+ var belongsToId = snapshot.belongsTo(key, { id: true });
+
+ // if provided, use the mapping provided by `attrs` in
+ // the serializer
+ var payloadKey = this._getMappedKey(key, snapshot.type);
+ if (payloadKey === key && this.keyForRelationship) {
+ payloadKey = this.keyForRelationship(key, "belongsTo", "serialize");
+ }
+
+ //Need to check whether the id is there for new&async records
+ if (Ember.isNone(belongsToId)) {
+ json[payloadKey] = null;
+ } else {
+ json[payloadKey] = belongsToId;
+ }
+
+ if (relationship.options.polymorphic) {
+ this.serializePolymorphicType(snapshot, json, relationship);
+ }
+ }
+ },
+
+ /**
+ `serializeHasMany` can be used to customize how `DS.hasMany`
+ properties are serialized.
+ Example
+ ```app/serializers/post.js
+ import DS from 'ember-data';
+ export default DS.JSONSerializer.extend({
+ serializeHasMany(snapshot, json, relationship) {
+ var key = relationship.key;
+ if (key === 'comments') {
+ return;
+ } else {
+ this._super(...arguments);
+ }
+ }
+ });
+ ```
+ @method serializeHasMany
+ @param {DS.Snapshot} snapshot
+ @param {Object} json
+ @param {Object} relationship
+ */
+ serializeHasMany(snapshot, json, relationship) {
+ var key = relationship.key;
+
+ if (this.shouldSerializeHasMany(snapshot, key, relationship)) {
+ var hasMany = snapshot.hasMany(key, { ids: true });
+ if (hasMany !== undefined) {
+ // if provided, use the mapping provided by `attrs` in
+ // the serializer
+ var payloadKey = this._getMappedKey(key, snapshot.type);
+ if (payloadKey === key && this.keyForRelationship) {
+ payloadKey = this.keyForRelationship(key, "hasMany", "serialize");
+ }
+
+ json[payloadKey] = hasMany;
+ // TODO support for polymorphic manyToNone and manyToMany relationships
+ }
+ }
+ },
+
+ /**
+ You can use this method to customize how polymorphic objects are
+ serialized. Objects are considered to be polymorphic if
+ `{ polymorphic: true }` is pass as the second argument to the
+ `DS.belongsTo` function.
+ Example
+ ```app/serializers/comment.js
+ import DS from 'ember-data';
+ import { isNone } from '@ember/utils';
+ export default DS.JSONSerializer.extend({
+ serializePolymorphicType(snapshot, json, relationship) {
+ var key = relationship.key;
+ var belongsTo = snapshot.belongsTo(key);
+ key = this.keyForAttribute ? this.keyForAttribute(key, 'serialize') : key;
+ if (isNone(belongsTo)) {
+ json[key + '_type'] = null;
+ } else {
+ json[key + '_type'] = belongsTo.modelName;
+ }
+ }
+ });
+ ```
+ @method serializePolymorphicType
+ @param {DS.Snapshot} snapshot
+ @param {Object} json
+ @param {Object} relationship
+ */
+ serializePolymorphicType() {},
+
+ /**
+ `extractMeta` is used to deserialize any meta information in the
+ adapter payload. By default Ember Data expects meta information to
+ be located on the `meta` property of the payload object.
+ Example
+ ```app/serializers/post.js
+ import DS from 'ember-data';
+ export default DS.JSONSerializer.extend({
+ extractMeta(store, typeClass, payload) {
+ if (payload && payload.hasOwnProperty('_pagination')) {
+ let meta = payload._pagination;
+ delete payload._pagination;
+ return meta;
+ }
+ }
+ });
+ ```
+ @method extractMeta
+ @param {DS.Store} store
+ @param {DS.Model} modelClass
+ @param {Object} payload
+ */
+ extractMeta(store, modelClass, payload) {
+ if (payload && payload['meta'] !== undefined) {
+ var meta = payload.meta;
+ delete payload.meta;
+ return meta;
+ }
+ },
+
+ /**
+ `extractErrors` is used to extract model errors when a call
+ to `DS.Model#save` fails with an `InvalidError`. By default
+ Ember Data expects error information to be located on the `errors`
+ property of the payload object.
+ This serializer expects this `errors` object to be an Array similar
+ to the following, compliant with the JSON-API specification:
+ ```js
+ {
+ "errors": [
+ {
+ "detail": "This username is already taken!",
+ "source": {
+ "pointer": "data/attributes/username"
+ }
+ }, {
+ "detail": "Doesn't look like a valid email.",
+ "source": {
+ "pointer": "data/attributes/email"
+ }
+ }
+ ]
+ }
+ ```
+ The key `detail` provides a textual description of the problem.
+ Alternatively, the key `title` can be used for the same purpose.
+ The nested keys `source.pointer` detail which specific element
+ of the request data was invalid.
+ Note that JSON-API also allows for object-level errors to be placed
+ in an object with pointer `data`, signifying that the problem
+ cannot be traced to a specific attribute:
+ ```javascript
+ {
+ "errors": [
+ {
+ "detail": "Some generic non property error message",
+ "source": {
+ "pointer": "data"
+ }
+ }
+ ]
+ }
+ ```
+ When turn into a `DS.Errors` object, you can read these errors
+ through the property `base`:
+ ```handlebars
+ {{#each model.errors.base as |error|}}
+ <div class="error">
+ {{error.message}}
+ </div>
+ {{/each}}
+ ```
+ Example of alternative implementation, overriding the default
+ behavior to deal with a different format of errors:
+ ```app/serializers/post.js
+ import DS from 'ember-data';
+ export default DS.JSONSerializer.extend({
+ extractErrors(store, typeClass, payload, id) {
+ if (payload && typeof payload === 'object' && payload._problems) {
+ payload = payload._problems;
+ this.normalizeErrors(typeClass, payload);
+ }
+ return payload;
+ }
+ });
+ ```
+ @method extractErrors
+ @param {DS.Store} store
+ @param {DS.Model} typeClass
+ @param {Object} payload
+ @param {(String|Number)} id
+ @return {Object} json The deserialized errors
+ */
+ extractErrors(store, typeClass, payload, id) {
+ if (payload && typeof payload === 'object' && payload.errors) {
+ payload = (0, _private.errorsArrayToHash)(payload.errors);
+
+ this.normalizeUsingDeclaredMapping(typeClass, payload);
+
+ typeClass.eachAttribute(name => {
+ var key = this.keyForAttribute(name, 'deserialize');
+ if (key !== name && payload[key] !== undefined) {
+ payload[name] = payload[key];
+ delete payload[key];
+ }
+ });
+
+ typeClass.eachRelationship(name => {
+ var key = this.keyForRelationship(name, 'deserialize');
+ if (key !== name && payload[key] !== undefined) {
+ payload[name] = payload[key];
+ delete payload[key];
+ }
+ });
+ }
+
+ return payload;
+ },
+
+ /**
+ `keyForAttribute` can be used to define rules for how to convert an
+ attribute name in your model to a key in your JSON.
+ Example
+ ```app/serializers/application.js
+ import DS from 'ember-data';
+ import { underscore } from '@ember/string';
+ export default DS.RESTSerializer.extend({
+ keyForAttribute(attr, method) {
+ return underscore(attr).toUpperCase();
+ }
+ });
+ ```
+ @method keyForAttribute
+ @param {String} key
+ @param {String} method
+ @return {String} normalized key
+ */
+ keyForAttribute(key, method) {
+ return key;
+ },
+
+ /**
+ `keyForRelationship` can be used to define a custom key when
+ serializing and deserializing relationship properties. By default
+ `JSONSerializer` does not provide an implementation of this method.
+ Example
+ ```app/serializers/post.js
+ import DS from 'ember-data';
+ import { underscore } from '@ember/string';
+ export default DS.JSONSerializer.extend({
+ keyForRelationship(key, relationship, method) {
+ return `rel_${underscore(key)}`;
+ }
+ });
+ ```
+ @method keyForRelationship
+ @param {String} key
+ @param {String} typeClass
+ @param {String} method
+ @return {String} normalized key
+ */
+ keyForRelationship(key, typeClass, method) {
+ return key;
+ },
+
+ /**
+ `keyForLink` can be used to define a custom key when deserializing link
+ properties.
+ @method keyForLink
+ @param {String} key
+ @param {String} kind `belongsTo` or `hasMany`
+ @return {String} normalized key
+ */
+ keyForLink(key, kind) {
+ return key;
+ },
+
+ // HELPERS
+
+ /**
+ @method transformFor
+ @private
+ @param {String} attributeType
+ @param {Boolean} skipAssertion
+ @return {DS.Transform} transform
+ */
+ transformFor(attributeType, skipAssertion) {
+ var transform = (0, _private.getOwner)(this).lookup('transform:' + attributeType);
+
+ (true && !(skipAssertion || !!transform) && Ember.assert("Unable to find transform for '" + attributeType + "'", skipAssertion || !!transform));
+
+
+ return transform;
+ }
+ });
+
+ if ((0, _private.isEnabled)("ds-payload-type-hooks")) {
+
+ JSONSerializer.reopen({
+
+ /**
+ @method modelNameFromPayloadType
+ @public
+ @param {String} type
+ @return {String} the model's modelName
+ */
+ modelNameFromPayloadType(type) {
+ return (0, _private.normalizeModelName)(type);
+ },
+
+ _hasCustomModelNameFromPayloadKey() {
+ return this.modelNameFromPayloadKey !== JSONSerializer.prototype.modelNameFromPayloadKey;
+ }
+
+ });
+ }
+
+ if ((0, _private.isEnabled)("ds-serialize-id")) {
+
+ JSONSerializer.reopen({
+
+ /**
+ serializeId can be used to customize how id is serialized
+ For example, your server may expect integer datatype of id
+ By default the snapshot's id (String) is set on the json hash via json[primaryKey] = snapshot.id.
+ ```app/serializers/application.js
+ import DS from 'ember-data';
+ export default DS.JSONSerializer.extend({
+ serializeId(snapshot, json, primaryKey) {
+ var id = snapshot.id;
+ json[primaryKey] = parseInt(id, 10);
+ }
+ });
+ ```
+ @method serializeId
+ @public
+ @param {DS.Snapshot} snapshot
+ @param {Object} json
+ @param {String} primaryKey
+ */
+ serializeId(snapshot, json, primaryKey) {
+ var id = snapshot.id;
+
+ if (id) {
+ json[primaryKey] = id;
+ }
+ }
+ });
+ }
+
+ exports.default = JSONSerializer;
+});
+;define('ember-data/serializers/rest', ['exports', 'ember-inflector', 'ember-data/serializers/json', 'ember-data/-private'], function (exports, _emberInflector, _json, _private) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+
+
+ /**
+ Normally, applications will use the `RESTSerializer` by implementing
+ the `normalize` method.
+
+ This allows you to do whatever kind of munging you need, and is
+ especially useful if your server is inconsistent and you need to
+ do munging differently for many different kinds of responses.
+
+ See the `normalize` documentation for more information.
+
+ ## Across the Board Normalization
+
+ There are also a number of hooks that you might find useful to define
+ across-the-board rules for your payload. These rules will be useful
+ if your server is consistent, or if you're building an adapter for
+ an infrastructure service, like Firebase, and want to encode service
+ conventions.
+
+ For example, if all of your keys are underscored and all-caps, but
+ otherwise consistent with the names you use in your models, you
+ can implement across-the-board rules for how to convert an attribute
+ name in your model to a key in your JSON.
+
+ ```app/serializers/application.js
+ import DS from 'ember-data';
+ import { underscore } from '@ember/string';
+
+ export default DS.RESTSerializer.extend({
+ keyForAttribute(attr, method) {
+ return underscore(attr).toUpperCase();
+ }
+ });
+ ```
+
+ You can also implement `keyForRelationship`, which takes the name
+ of the relationship as the first parameter, the kind of
+ relationship (`hasMany` or `belongsTo`) as the second parameter, and
+ the method (`serialize` or `deserialize`) as the third parameter.
+
+ @class RESTSerializer
+ @namespace DS
+ @extends DS.JSONSerializer
+ */
+ /**
+ @module ember-data
+ */
+
+ var RESTSerializer = _json.default.extend({
+
+ /**
+ `keyForPolymorphicType` can be used to define a custom key when
+ serializing and deserializing a polymorphic type. By default, the
+ returned key is `${key}Type`.
+ Example
+ ```app/serializers/post.js
+ import DS from 'ember-data';
+ export default DS.RESTSerializer.extend({
+ keyForPolymorphicType(key, relationship) {
+ var relationshipKey = this.keyForRelationship(key);
+ return 'type-' + relationshipKey;
+ }
+ });
+ ```
+ @method keyForPolymorphicType
+ @param {String} key
+ @param {String} typeClass
+ @param {String} method
+ @return {String} normalized key
+ */
+ keyForPolymorphicType(key, typeClass, method) {
+ var relationshipKey = this.keyForRelationship(key);
+
+ return `${relationshipKey}Type`;
+ },
+
+ /**
+ Normalizes a part of the JSON payload returned by
+ the server. You should override this method, munge the hash
+ and call super if you have generic normalization to do.
+ It takes the type of the record that is being normalized
+ (as a DS.Model class), the property where the hash was
+ originally found, and the hash to normalize.
+ For example, if you have a payload that looks like this:
+ ```js
+ {
+ "post": {
+ "id": 1,
+ "title": "Rails is omakase",
+ "comments": [ 1, 2 ]
+ },
+ "comments": [{
+ "id": 1,
+ "body": "FIRST"
+ }, {
+ "id": 2,
+ "body": "Rails is unagi"
+ }]
+ }
+ ```
+ The `normalize` method will be called three times:
+ * With `App.Post`, `"posts"` and `{ id: 1, title: "Rails is omakase", ... }`
+ * With `App.Comment`, `"comments"` and `{ id: 1, body: "FIRST" }`
+ * With `App.Comment`, `"comments"` and `{ id: 2, body: "Rails is unagi" }`
+ You can use this method, for example, to normalize underscored keys to camelized
+ or other general-purpose normalizations. You will only need to implement
+ `normalize` and manipulate the payload as desired.
+ For example, if the `IDs` under `"comments"` are provided as `_id` instead of
+ `id`, you can specify how to normalize just the comments:
+ ```app/serializers/post.js
+ import DS from 'ember-data';
+ export default DS.RESTSerializer.extend({
+ normalize(model, hash, prop) {
+ if (prop === 'comments') {
+ hash.id = hash._id;
+ delete hash._id;
+ }
+ return this._super(...arguments);
+ }
+ });
+ ```
+ On each call to the `normalize` method, the third parameter (`prop`) is always
+ one of the keys that were in the original payload or in the result of another
+ normalization as `normalizeResponse`.
+ @method normalize
+ @param {DS.Model} modelClass
+ @param {Object} resourceHash
+ @param {String} prop
+ @return {Object}
+ */
+
+ /**
+ Normalizes an array of resource payloads and returns a JSON-API Document
+ with primary data and, if any, included data as `{ data, included }`.
+ @method _normalizeArray
+ @param {DS.Store} store
+ @param {String} modelName
+ @param {Object} arrayHash
+ @param {String} prop
+ @return {Object}
+ @private
+ */
+ _normalizeArray(store, modelName, arrayHash, prop) {
+ var documentHash = {
+ data: [],
+ included: []
+ };
+
+ var modelClass = store.modelFor(modelName);
+ var serializer = store.serializerFor(modelName);
+
+ Ember.makeArray(arrayHash).forEach(hash => {
+ var { data, included } = this._normalizePolymorphicRecord(store, hash, prop, modelClass, serializer);
+ documentHash.data.push(data);
+ if (included) {
+ documentHash.included.push(...included);
+ }
+ });
+
+ return documentHash;
+ },
+
+ _normalizePolymorphicRecord(store, hash, prop, primaryModelClass, primarySerializer) {
+ var serializer = primarySerializer;
+ var modelClass = primaryModelClass;
+
+ var primaryHasTypeAttribute = (0, _private.modelHasAttributeOrRelationshipNamedType)(primaryModelClass);
+
+ if (!primaryHasTypeAttribute && hash.type) {
+ // Support polymorphic records in async relationships
+ var modelName = void 0;
+ if ((0, _private.isEnabled)("ds-payload-type-hooks")) {
+ modelName = this.modelNameFromPayloadType(hash.type);
+ var deprecatedModelNameLookup = this.modelNameFromPayloadKey(hash.type);
+
+ if (modelName !== deprecatedModelNameLookup && !this._hasCustomModelNameFromPayloadType() && this._hasCustomModelNameFromPayloadKey()) {
+ (true && !(false) && Ember.deprecate("You are using modelNameFromPayloadKey to normalize the type for a polymorphic relationship. This is has been deprecated in favor of modelNameFromPayloadType", false, {
+ id: 'ds.rest-serializer.deprecated-model-name-for-polymorphic-type',
+ until: '3.0.0'
+ }));
+
+
+ modelName = deprecatedModelNameLookup;
+ }
+ } else {
+ modelName = this.modelNameFromPayloadKey(hash.type);
+ }
+
+ if (store._hasModelFor(modelName)) {
+ serializer = store.serializerFor(modelName);
+ modelClass = store.modelFor(modelName);
+ }
+ }
+
+ return serializer.normalize(modelClass, hash, prop);
+ },
+
+ /*
+ @method _normalizeResponse
+ @param {DS.Store} store
+ @param {DS.Model} primaryModelClass
+ @param {Object} payload
+ @param {String|Number} id
+ @param {String} requestType
+ @param {Boolean} isSingle
+ @return {Object} JSON-API Document
+ @private
+ */
+ _normalizeResponse(store, primaryModelClass, payload, id, requestType, isSingle) {
+ var documentHash = {
+ data: null,
+ included: []
+ };
+
+ var meta = this.extractMeta(store, primaryModelClass, payload);
+ if (meta) {
+ (true && !(Ember.typeOf(meta) === 'object') && Ember.assert('The `meta` returned from `extractMeta` has to be an object, not "' + Ember.typeOf(meta) + '".', Ember.typeOf(meta) === 'object'));
+
+ documentHash.meta = meta;
+ }
+
+ var keys = Object.keys(payload);
+
+ for (var i = 0, length = keys.length; i < length; i++) {
+ var prop = keys[i];
+ var modelName = prop;
+ var forcedSecondary = false;
+
+ /*
+ If you want to provide sideloaded records of the same type that the
+ primary data you can do that by prefixing the key with `_`.
+ Example
+ ```
+ {
+ users: [
+ { id: 1, title: 'Tom', manager: 3 },
+ { id: 2, title: 'Yehuda', manager: 3 }
+ ],
+ _users: [
+ { id: 3, title: 'Tomster' }
+ ]
+ }
+ ```
+ This forces `_users` to be added to `included` instead of `data`.
+ */
+ if (prop.charAt(0) === '_') {
+ forcedSecondary = true;
+ modelName = prop.substr(1);
+ }
+
+ var typeName = this.modelNameFromPayloadKey(modelName);
+ if (!store.modelFactoryFor(typeName)) {
+ (true && Ember.warn(this.warnMessageNoModelForKey(modelName, typeName), false, {
+ id: 'ds.serializer.model-for-key-missing'
+ }));
+
+ continue;
+ }
+
+ var isPrimary = !forcedSecondary && this.isPrimaryType(store, typeName, primaryModelClass);
+ var value = payload[prop];
+
+ if (value === null) {
+ continue;
+ }
+
+ if (true) {
+ var isQueryRecordAnArray = requestType === 'queryRecord' && isPrimary && Array.isArray(value);
+ var message = "The adapter returned an array for the primary data of a `queryRecord` response. This is deprecated as `queryRecord` should return a single record.";
+
+ (true && !(!isQueryRecordAnArray) && Ember.deprecate(message, !isQueryRecordAnArray, {
+ id: 'ds.serializer.rest.queryRecord-array-response',
+ until: '3.0'
+ }));
+ }
+
+ /*
+ Support primary data as an object instead of an array.
+ Example
+ ```
+ {
+ user: { id: 1, title: 'Tom', manager: 3 }
+ }
+ ```
+ */
+ if (isPrimary && !Array.isArray(value)) {
+ var { data: _data, included: _included } = this._normalizePolymorphicRecord(store, value, prop, primaryModelClass, this);
+ documentHash.data = _data;
+ if (_included) {
+ documentHash.included.push(..._included);
+ }
+ continue;
+ }
+
+ var { data, included } = this._normalizeArray(store, typeName, value, prop);
+
+ if (included) {
+ documentHash.included.push(...included);
+ }
+
+ if (isSingle) {
+ data.forEach(resource => {
+
+ /*
+ Figures out if this is the primary record or not.
+ It's either:
+ 1. The record with the same ID as the original request
+ 2. If it's a newly created record without an ID, the first record
+ in the array
+ */
+ var isUpdatedRecord = isPrimary && (0, _private.coerceId)(resource.id) === id;
+ var isFirstCreatedRecord = isPrimary && !id && !documentHash.data;
+
+ if (isFirstCreatedRecord || isUpdatedRecord) {
+ documentHash.data = resource;
+ } else {
+ documentHash.included.push(resource);
+ }
+ });
+ } else {
+ if (isPrimary) {
+ documentHash.data = data;
+ } else {
+ if (data) {
+ documentHash.included.push(...data);
+ }
+ }
+ }
+ }
+
+ return documentHash;
+ },
+
+ isPrimaryType(store, typeName, primaryTypeClass) {
+ return store.modelFor(typeName) === primaryTypeClass;
+ },
+
+ /**
+ This method allows you to push a payload containing top-level
+ collections of records organized per type.
+ ```js
+ {
+ "posts": [{
+ "id": "1",
+ "title": "Rails is omakase",
+ "author", "1",
+ "comments": [ "1" ]
+ }],
+ "comments": [{
+ "id": "1",
+ "body": "FIRST"
+ }],
+ "users": [{
+ "id": "1",
+ "name": "@d2h"
+ }]
+ }
+ ```
+ It will first normalize the payload, so you can use this to push
+ in data streaming in from your server structured the same way
+ that fetches and saves are structured.
+ @method pushPayload
+ @param {DS.Store} store
+ @param {Object} payload
+ */
+ pushPayload(store, payload) {
+ var documentHash = {
+ data: [],
+ included: []
+ };
+
+ for (var prop in payload) {
+ var modelName = this.modelNameFromPayloadKey(prop);
+ if (!store.modelFactoryFor(modelName)) {
+ (true && Ember.warn(this.warnMessageNoModelForKey(prop, modelName), false, {
+ id: 'ds.serializer.model-for-key-missing'
+ }));
+
+ continue;
+ }
+ var type = store.modelFor(modelName);
+ var typeSerializer = store.serializerFor(type.modelName);
+
+ Ember.makeArray(payload[prop]).forEach(hash => {
+ var { data, included } = typeSerializer.normalize(type, hash, prop);
+ documentHash.data.push(data);
+ if (included) {
+ documentHash.included.push(...included);
+ }
+ });
+ }
+
+ if ((0, _private.isEnabled)('ds-pushpayload-return')) {
+ return store.push(documentHash);
+ } else {
+ store.push(documentHash);
+ }
+ },
+
+ /**
+ This method is used to convert each JSON root key in the payload
+ into a modelName that it can use to look up the appropriate model for
+ that part of the payload.
+ For example, your server may send a model name that does not correspond with
+ the name of the model in your app. Let's take a look at an example model,
+ and an example payload:
+ ```app/models/post.js
+ import DS from 'ember-data';
+ export default DS.Model.extend({
+ });
+ ```
+ ```javascript
+ {
+ "blog/post": {
+ "id": "1
+ }
+ }
+ ```
+ Ember Data is going to normalize the payload's root key for the modelName. As a result,
+ it will try to look up the "blog/post" model. Since we don't have a model called "blog/post"
+ (or a file called app/models/blog/post.js in ember-cli), Ember Data will throw an error
+ because it cannot find the "blog/post" model.
+ Since we want to remove this namespace, we can define a serializer for the application that will
+ remove "blog/" from the payload key whenver it's encountered by Ember Data:
+ ```app/serializers/application.js
+ import DS from 'ember-data';
+ export default DS.RESTSerializer.extend({
+ modelNameFromPayloadKey(payloadKey) {
+ if (payloadKey === 'blog/post') {
+ return this._super(payloadKey.replace('blog/', ''));
+ } else {
+ return this._super(payloadKey);
+ }
+ }
+ });
+ ```
+ After refreshing, Ember Data will appropriately look up the "post" model.
+ By default the modelName for a model is its
+ name in dasherized form. This means that a payload key like "blogPost" would be
+ normalized to "blog-post" when Ember Data looks up the model. Usually, Ember Data
+ can use the correct inflection to do this for you. Most of the time, you won't
+ need to override `modelNameFromPayloadKey` for this purpose.
+ @method modelNameFromPayloadKey
+ @param {String} key
+ @return {String} the model's modelName
+ */
+ modelNameFromPayloadKey(key) {
+ return (0, _emberInflector.singularize)((0, _private.normalizeModelName)(key));
+ },
+
+ // SERIALIZE
+
+ /**
+ Called when a record is saved in order to convert the
+ record into JSON.
+ By default, it creates a JSON object with a key for
+ each attribute and belongsTo relationship.
+ For example, consider this model:
+ ```app/models/comment.js
+ import DS from 'ember-data';
+ export default DS.Model.extend({
+ title: DS.attr(),
+ body: DS.attr(),
+ author: DS.belongsTo('user')
+ });
+ ```
+ The default serialization would create a JSON object like:
+ ```js
+ {
+ "title": "Rails is unagi",
+ "body": "Rails? Omakase? O_O",
+ "author": 12
+ }
+ ```
+ By default, attributes are passed through as-is, unless
+ you specified an attribute type (`DS.attr('date')`). If
+ you specify a transform, the JavaScript value will be
+ serialized when inserted into the JSON hash.
+ By default, belongs-to relationships are converted into
+ IDs when inserted into the JSON hash.
+ ## IDs
+ `serialize` takes an options hash with a single option:
+ `includeId`. If this option is `true`, `serialize` will,
+ by default include the ID in the JSON object it builds.
+ The adapter passes in `includeId: true` when serializing
+ a record for `createRecord`, but not for `updateRecord`.
+ ## Customization
+ Your server may expect a different JSON format than the
+ built-in serialization format.
+ In that case, you can implement `serialize` yourself and
+ return a JSON hash of your choosing.
+ ```app/serializers/post.js
+ import DS from 'ember-data';
+ export default DS.RESTSerializer.extend({
+ serialize(snapshot, options) {
+ var json = {
+ POST_TTL: snapshot.attr('title'),
+ POST_BDY: snapshot.attr('body'),
+ POST_CMS: snapshot.hasMany('comments', { ids: true })
+ };
+ if (options.includeId) {
+ json.POST_ID_ = snapshot.id;
+ }
+ return json;
+ }
+ });
+ ```
+ ## Customizing an App-Wide Serializer
+ If you want to define a serializer for your entire
+ application, you'll probably want to use `eachAttribute`
+ and `eachRelationship` on the record.
+ ```app/serializers/application.js
+ import DS from 'ember-data';
+ import { pluralize } from 'ember-inflector';
+ export default DS.RESTSerializer.extend({
+ serialize(snapshot, options) {
+ var json = {};
+ snapshot.eachAttribute(function(name) {
+ json[serverAttributeName(name)] = snapshot.attr(name);
+ });
+ snapshot.eachRelationship(function(name, relationship) {
+ if (relationship.kind === 'hasMany') {
+ json[serverHasManyName(name)] = snapshot.hasMany(name, { ids: true });
+ }
+ });
+ if (options.includeId) {
+ json.ID_ = snapshot.id;
+ }
+ return json;
+ }
+ });
+ function serverAttributeName(attribute) {
+ return attribute.underscore().toUpperCase();
+ }
+ function serverHasManyName(name) {
+ return serverAttributeName(singularize(name)) + "_IDS";
+ }
+ ```
+ This serializer will generate JSON that looks like this:
+ ```js
+ {
+ "TITLE": "Rails is omakase",
+ "BODY": "Yep. Omakase.",
+ "COMMENT_IDS": [ 1, 2, 3 ]
+ }
+ ```
+ ## Tweaking the Default JSON
+ If you just want to do some small tweaks on the default JSON,
+ you can call super first and make the tweaks on the returned
+ JSON.
+ ```app/serializers/post.js
+ import DS from 'ember-data';
+ export default DS.RESTSerializer.extend({
+ serialize(snapshot, options) {
+ var json = this._super(snapshot, options);
+ json.subject = json.title;
+ delete json.title;
+ return json;
+ }
+ });
+ ```
+ @method serialize
+ @param {DS.Snapshot} snapshot
+ @param {Object} options
+ @return {Object} json
+ */
+ serialize(snapshot, options) {
+ return this._super(...arguments);
+ },
+
+ /**
+ You can use this method to customize the root keys serialized into the JSON.
+ The hash property should be modified by reference (possibly using something like _.extend)
+ By default the REST Serializer sends the modelName of a model, which is a camelized
+ version of the name.
+ For example, your server may expect underscored root objects.
+ ```app/serializers/application.js
+ import DS from 'ember-data';
+ import { decamelize } from '@ember/string';
+ export default DS.RESTSerializer.extend({
+ serializeIntoHash(data, type, record, options) {
+ var root = decamelize(type.modelName);
+ data[root] = this.serialize(record, options);
+ }
+ });
+ ```
+ @method serializeIntoHash
+ @param {Object} hash
+ @param {DS.Model} typeClass
+ @param {DS.Snapshot} snapshot
+ @param {Object} options
+ */
+ serializeIntoHash(hash, typeClass, snapshot, options) {
+ var normalizedRootKey = this.payloadKeyFromModelName(typeClass.modelName);
+ hash[normalizedRootKey] = this.serialize(snapshot, options);
+ },
+
+ /**
+ You can use `payloadKeyFromModelName` to override the root key for an outgoing
+ request. By default, the RESTSerializer returns a camelized version of the
+ model's name.
+ For a model called TacoParty, its `modelName` would be the string `taco-party`. The RESTSerializer
+ will send it to the server with `tacoParty` as the root key in the JSON payload:
+ ```js
+ {
+ "tacoParty": {
+ "id": "1",
+ "location": "Matthew Beale's House"
+ }
+ }
+ ```
+ For example, your server may expect dasherized root objects:
+ ```app/serializers/application.js
+ import DS from 'ember-data';
+ import { dasherize } from '@ember/string';
+ export default DS.RESTSerializer.extend({
+ payloadKeyFromModelName(modelName) {
+ return dasherize(modelName);
+ }
+ });
+ ```
+ Given a `TacoParty` model, calling `save` on it would produce an outgoing
+ request like:
+ ```js
+ {
+ "taco-party": {
+ "id": "1",
+ "location": "Matthew Beale's House"
+ }
+ }
+ ```
+ @method payloadKeyFromModelName
+ @param {String} modelName
+ @return {String}
+ */
+ payloadKeyFromModelName(modelName) {
+ return Ember.String.camelize(modelName);
+ },
+
+ /**
+ You can use this method to customize how polymorphic objects are serialized.
+ By default the REST Serializer creates the key by appending `Type` to
+ the attribute and value from the model's camelcased model name.
+ @method serializePolymorphicType
+ @param {DS.Snapshot} snapshot
+ @param {Object} json
+ @param {Object} relationship
+ */
+ serializePolymorphicType(snapshot, json, relationship) {
+ var key = relationship.key;
+ var typeKey = this.keyForPolymorphicType(key, relationship.type, 'serialize');
+ var belongsTo = snapshot.belongsTo(key);
+
+ if (Ember.isNone(belongsTo)) {
+ json[typeKey] = null;
+ } else {
+ if ((0, _private.isEnabled)("ds-payload-type-hooks")) {
+ json[typeKey] = this.payloadTypeFromModelName(belongsTo.modelName);
+ } else {
+ json[typeKey] = Ember.String.camelize(belongsTo.modelName);
+ }
+ }
+ },
+
+ /**
+ You can use this method to customize how a polymorphic relationship should
+ be extracted.
+ @method extractPolymorphicRelationship
+ @param {Object} relationshipType
+ @param {Object} relationshipHash
+ @param {Object} relationshipOptions
+ @return {Object}
+ */
+ extractPolymorphicRelationship(relationshipType, relationshipHash, relationshipOptions) {
+ var { key, resourceHash, relationshipMeta } = relationshipOptions;
+
+ // A polymorphic belongsTo relationship can be present in the payload
+ // either in the form where the `id` and the `type` are given:
+ //
+ // {
+ // message: { id: 1, type: 'post' }
+ // }
+ //
+ // or by the `id` and a `<relationship>Type` attribute:
+ //
+ // {
+ // message: 1,
+ // messageType: 'post'
+ // }
+ //
+ // The next code checks if the latter case is present and returns the
+ // corresponding JSON-API representation. The former case is handled within
+ // the base class JSONSerializer.
+ var isPolymorphic = relationshipMeta.options.polymorphic;
+ var typeProperty = this.keyForPolymorphicType(key, relationshipType, 'deserialize');
+
+ if (isPolymorphic && resourceHash[typeProperty] !== undefined && typeof relationshipHash !== 'object') {
+
+ if ((0, _private.isEnabled)("ds-payload-type-hooks")) {
+
+ var payloadType = resourceHash[typeProperty];
+ var type = this.modelNameFromPayloadType(payloadType);
+ var deprecatedTypeLookup = this.modelNameFromPayloadKey(payloadType);
+
+ if (payloadType !== deprecatedTypeLookup && !this._hasCustomModelNameFromPayloadType() && this._hasCustomModelNameFromPayloadKey()) {
+ (true && !(false) && Ember.deprecate("You are using modelNameFromPayloadKey to normalize the type for a polymorphic relationship. This has been deprecated in favor of modelNameFromPayloadType", false, {
+ id: 'ds.rest-serializer.deprecated-model-name-for-polymorphic-type',
+ until: '3.0.0'
+ }));
+
+
+ type = deprecatedTypeLookup;
+ }
+
+ return {
+ id: relationshipHash,
+ type: type
+ };
+ } else {
+
+ var _type = this.modelNameFromPayloadKey(resourceHash[typeProperty]);
+ return {
+ id: relationshipHash,
+ type: _type
+ };
+ }
+ }
+
+ return this._super(...arguments);
+ }
+ });
+
+ if ((0, _private.isEnabled)("ds-payload-type-hooks")) {
+
+ RESTSerializer.reopen({
+
+ /**
+ `modelNameFromPayloadType` can be used to change the mapping for a DS model
+ name, taken from the value in the payload.
+ Say your API namespaces the type of a model and returns the following
+ payload for the `post` model, which has a polymorphic `user` relationship:
+ ```javascript
+ // GET /api/posts/1
+ {
+ "post": {
+ "id": 1,
+ "user": 1,
+ "userType: "api::v1::administrator"
+ }
+ }
+ ```
+ By overwriting `modelNameFromPayloadType` you can specify that the
+ `administrator` model should be used:
+ ```app/serializers/application.js
+ import DS from 'ember-data';
+ export default DS.RESTSerializer.extend({
+ modelNameFromPayloadType(payloadType) {
+ return payloadType.replace('api::v1::', '');
+ }
+ });
+ ```
+ By default the modelName for a model is its name in dasherized form.
+ Usually, Ember Data can use the correct inflection to do this for you. Most
+ of the time, you won't need to override `modelNameFromPayloadType` for this
+ purpose.
+ Also take a look at
+ [payloadTypeFromModelName](#method_payloadTypeFromModelName) to customize
+ how the type of a record should be serialized.
+ @method modelNameFromPayloadType
+ @public
+ @param {String} payloadType type from payload
+ @return {String} modelName
+ */
+ modelNameFromPayloadType(payloadType) {
+ return (0, _emberInflector.singularize)((0, _private.normalizeModelName)(payloadType));
+ },
+
+ /**
+ `payloadTypeFromModelName` can be used to change the mapping for the type in
+ the payload, taken from the model name.
+ Say your API namespaces the type of a model and expects the following
+ payload when you update the `post` model, which has a polymorphic `user`
+ relationship:
+ ```javascript
+ // POST /api/posts/1
+ {
+ "post": {
+ "id": 1,
+ "user": 1,
+ "userType": "api::v1::administrator"
+ }
+ }
+ ```
+ By overwriting `payloadTypeFromModelName` you can specify that the
+ namespaces model name for the `administrator` should be used:
+ ```app/serializers/application.js
+ import DS from 'ember-data';
+ export default DS.RESTSerializer.extend({
+ payloadTypeFromModelName(modelName) {
+ return 'api::v1::' + modelName;
+ }
+ });
+ ```
+ By default the payload type is the camelized model name. Usually, Ember
+ Data can use the correct inflection to do this for you. Most of the time,
+ you won't need to override `payloadTypeFromModelName` for this purpose.
+ Also take a look at
+ [modelNameFromPayloadType](#method_modelNameFromPayloadType) to customize
+ how the model name from should be mapped from the payload.
+ @method payloadTypeFromModelName
+ @public
+ @param {String} modelName modelName from the record
+ @return {String} payloadType
+ */
+ payloadTypeFromModelName(modelName) {
+ return Ember.String.camelize(modelName);
+ },
+
+ _hasCustomModelNameFromPayloadKey() {
+ return this.modelNameFromPayloadKey !== RESTSerializer.prototype.modelNameFromPayloadKey;
+ },
+
+ _hasCustomModelNameFromPayloadType() {
+ return this.modelNameFromPayloadType !== RESTSerializer.prototype.modelNameFromPayloadType;
+ },
+
+ _hasCustomPayloadTypeFromModelName() {
+ return this.payloadTypeFromModelName !== RESTSerializer.prototype.payloadTypeFromModelName;
+ },
+
+ _hasCustomPayloadKeyFromModelName() {
+ return this.payloadKeyFromModelName !== RESTSerializer.prototype.payloadKeyFromModelName;
+ }
+
+ });
+ }
+
+ if (true) {
+ RESTSerializer.reopen({
+ warnMessageNoModelForKey(prop, typeKey) {
+ return 'Encountered "' + prop + '" in payload, but no model was found for model name "' + typeKey + '" (resolved model name using ' + this.constructor.toString() + '.modelNameFromPayloadKey("' + prop + '"))';
+ }
+ });
+ }
+
+ exports.default = RESTSerializer;
+});
+;define('ember-data/setup-container', ['exports', 'ember-data/-private', 'ember-data/serializers/json-api', 'ember-data/serializers/json', 'ember-data/serializers/rest', 'ember-data/adapters/json-api', 'ember-data/adapters/rest', 'ember-data/transforms/number', 'ember-data/transforms/date', 'ember-data/transforms/string', 'ember-data/transforms/boolean'], function (exports, _private, _jsonApi, _json, _rest, _jsonApi2, _rest2, _number, _date, _string, _boolean) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = setupContainer;
+
+
+ function has(applicationOrRegistry, fullName) {
+ if (applicationOrRegistry.has) {
+ // < 2.1.0
+ return applicationOrRegistry.has(fullName);
+ } else {
+ // 2.1.0+
+ return applicationOrRegistry.hasRegistration(fullName);
+ }
+ }
+
+ /*
+ Configures a registry for use with an Ember-Data
+ store. Accepts an optional namespace argument.
+
+ @method initializeStore
+ @param {Ember.Registry} registry
+ */
+ function initializeStore(registry) {
+ var registerOptionsForType = registry.registerOptionsForType || registry.optionsForType;
+ registerOptionsForType.call(registry, 'serializer', { singleton: false });
+ registerOptionsForType.call(registry, 'adapter', { singleton: false });
+ registry.register('serializer:-default', _json.default);
+ registry.register('serializer:-rest', _rest.default);
+ registry.register('adapter:-rest', _rest2.default);
+
+ registry.register('adapter:-json-api', _jsonApi2.default);
+ registry.register('serializer:-json-api', _jsonApi.default);
+
+ if (!has(registry, 'service:store')) {
+ registry.register('service:store', _private.Store);
+ }
+ }
+
+ /*
+ Configures a registry with injections on Ember applications
+ for the Ember-Data store. Accepts an optional namespace argument.
+
+ @method initializeDebugAdapter
+ @param {Ember.Registry} registry
+ */
+ function initializeDataAdapter(registry) {
+ registry.register('data-adapter:main', _private.DebugAdapter);
+ }
+
+ /*
+ Configures a registry with injections on Ember applications
+ for the Ember-Data store. Accepts an optional namespace argument.
+
+ @method initializeStoreInjections
+ @param {Ember.Registry} registry
+ */
+ function initializeStoreInjections(registry) {
+ // registry.injection for Ember < 2.1.0
+ // application.inject for Ember 2.1.0+
+ var inject = registry.inject || registry.injection;
+ inject.call(registry, 'controller', 'store', 'service:store');
+ inject.call(registry, 'route', 'store', 'service:store');
+ inject.call(registry, 'data-adapter', 'store', 'service:store');
+ }
+
+ /*
+ Configures a registry for use with Ember-Data
+ transforms.
+
+ @method initializeTransforms
+ @param {Ember.Registry} registry
+ */
+ function initializeTransforms(registry) {
+ registry.register('transform:boolean', _boolean.default);
+ registry.register('transform:date', _date.default);
+ registry.register('transform:number', _number.default);
+ registry.register('transform:string', _string.default);
+ }
+
+ function setupContainer(application) {
+ initializeDataAdapter(application);
+ initializeTransforms(application);
+ initializeStoreInjections(application);
+ initializeStore(application);
+ }
+});
+;define('ember-data/store', ['exports', 'ember-data/-private'], function (exports, _private) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function () {
+ return _private.Store;
+ }
+ });
+});
+;define('ember-data/transform', ['exports', 'ember-data/transforms/transform'], function (exports, _transform) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ Object.defineProperty(exports, 'default', {
+ enumerable: true,
+ get: function () {
+ return _transform.default;
+ }
+ });
+});
+;define('ember-data/transforms/boolean', ['exports', 'ember-data/transforms/transform'], function (exports, _transform) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = _transform.default.extend({
+ deserialize(serialized, options) {
+ if (Ember.isNone(serialized) && options.allowNull === true) {
+ return null;
+ }
+
+ var type = typeof serialized;
+ if (type === "boolean") {
+ return serialized;
+ } else if (type === "string") {
+ return (/^(true|t|1)$/i.test(serialized)
+ );
+ } else if (type === "number") {
+ return serialized === 1;
+ } else {
+ return false;
+ }
+ },
+
+ serialize(deserialized, options) {
+ if (Ember.isNone(deserialized) && options.allowNull === true) {
+ return null;
+ }
+
+ return Boolean(deserialized);
+ }
+ });
+});
+;define('ember-data/transforms/date', ['exports', 'ember-data/transforms/transform'], function (exports, _transform) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = _transform.default.extend({
+ deserialize(serialized) {
+ var type = typeof serialized;
+
+ if (type === "string") {
+ var offset = serialized.indexOf('+');
+
+ if (offset !== -1 && serialized.length - 5 === offset) {
+ offset += 3;
+ return new Date(serialized.slice(0, offset) + ':' + serialized.slice(offset));
+ }
+ return new Date(serialized);
+ } else if (type === "number") {
+ return new Date(serialized);
+ } else if (serialized === null || serialized === undefined) {
+ // if the value is null return null
+ // if the value is not present in the data return undefined
+ return serialized;
+ } else {
+ return null;
+ }
+ },
+
+ serialize(date) {
+ if (date instanceof Date && !isNaN(date)) {
+ return date.toISOString();
+ } else {
+ return null;
+ }
+ }
+ });
+});
+;define('ember-data/transforms/number', ['exports', 'ember-data/transforms/transform'], function (exports, _transform) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+
+
+ function isNumber(value) {
+ return value === value && value !== Infinity && value !== -Infinity;
+ }
+
+ /**
+ The `DS.NumberTransform` class is used to serialize and deserialize
+ numeric attributes on Ember Data record objects. This transform is
+ used when `number` is passed as the type parameter to the
+ [DS.attr](../../data#method_attr) function.
+
+ Usage
+
+ ```app/models/score.js
+ import DS from 'ember-data';
+
+ export default DS.Model.extend({
+ value: DS.attr('number'),
+ player: DS.belongsTo('player'),
+ date: DS.attr('date')
+ });
+ ```
+
+ @class NumberTransform
+ @extends DS.Transform
+ @namespace DS
+ */
+ exports.default = _transform.default.extend({
+ deserialize(serialized) {
+ var transformed = void 0;
+
+ if (Ember.isEmpty(serialized)) {
+ return null;
+ } else {
+ transformed = Number(serialized);
+
+ return isNumber(transformed) ? transformed : null;
+ }
+ },
+
+ serialize(deserialized) {
+ var transformed = void 0;
+
+ if (Ember.isEmpty(deserialized)) {
+ return null;
+ } else {
+ transformed = Number(deserialized);
+
+ return isNumber(transformed) ? transformed : null;
+ }
+ }
+ });
+});
+;define('ember-data/transforms/string', ['exports', 'ember-data/transforms/transform'], function (exports, _transform) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = _transform.default.extend({
+ deserialize(serialized) {
+ return Ember.isNone(serialized) ? null : String(serialized);
+ },
+ serialize(deserialized) {
+ return Ember.isNone(deserialized) ? null : String(deserialized);
+ }
+ });
+});
+;define('ember-data/transforms/transform', ['exports'], function (exports) {
+ 'use strict';
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = Ember.Object.extend({
+ /**
+ When given a deserialized value from a record attribute this
+ method must return the serialized value.
+ Example
+ ```javascript
+ import { isEmpty } from '@ember/utils';
+ serialize(deserialized, options) {
+ return isEmpty(deserialized) ? null : Number(deserialized);
+ }
+ ```
+ @method serialize
+ @param deserialized The deserialized value
+ @param options hash of options passed to `DS.attr`
+ @return The serialized value
+ */
+ serialize: null,
+
+ /**
+ When given a serialize value from a JSON object this method must
+ return the deserialized value for the record attribute.
+ Example
+ ```javascript
+ deserialize(serialized, options) {
+ return empty(serialized) ? null : Number(serialized);
+ }
+ ```
+ @method deserialize
+ @param serialized The serialized value
+ @param options hash of options passed to `DS.attr`
+ @return The deserialized value
+ */
+ deserialize: null
+ });
+});
+;define("ember-data/version", ["exports"], function (exports) {
+ "use strict";
+
+ Object.defineProperty(exports, "__esModule", {
+ value: true
+ });
+ exports.default = "3.0.2";
+});
+;
+//# sourceMappingURL=vendor.map
diff --git a/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/vendor.map b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/vendor.map
new file mode 100644
index 0000000000..d6995e87b2
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/vendor.map
@@ -0,0 +1 @@
+{"version":3,"sources":["vendor/ember-cli/vendor-prefix.js","vendor/loader/loader.js","vendor/ember/jquery/jquery.js","license.js","loader.js","@glimmer/node.js","@glimmer/reference.js","@glimmer/runtime.js","@glimmer/util.js","@glimmer/wire-format.js","backburner.js","container.js","dag-map.js","ember-application/index.js","ember-application/initializers/dom-templates.js","ember-application/system/application-instance.js","ember-application/system/application.js","ember-application/system/engine-instance.js","ember-application/system/engine-parent.js","ember-application/system/engine.js","ember-application/system/resolver.js","ember-application/utils/validate-type.js","ember-babel.js","ember-console.js","ember-debug/deprecate.js","ember-debug/error.js","ember-debug/features.js","ember-debug/handlers.js","ember-debug/index.js","ember-debug/testing.js","ember-debug/warn.js","ember-environment.js","ember-extension-support/container_debug_adapter.js","ember-extension-support/data_adapter.js","ember-extension-support/index.js","ember-glimmer/component-managers/abstract.js","ember-glimmer/component-managers/curly.js","ember-glimmer/component-managers/mount.js","ember-glimmer/component-managers/outlet.js","ember-glimmer/component-managers/render.js","ember-glimmer/component-managers/root.js","ember-glimmer/component-managers/template-only.js","ember-glimmer/component.js","ember-glimmer/components/checkbox.js","ember-glimmer/components/link-to.js","ember-glimmer/components/text_area.js","ember-glimmer/components/text_field.js","ember-glimmer/dom.js","ember-glimmer/environment.js","ember-glimmer/helper.js","ember-glimmer/helpers/-class.js","ember-glimmer/helpers/-html-safe.js","ember-glimmer/helpers/-input-type.js","ember-glimmer/helpers/-normalize-class.js","ember-glimmer/helpers/action.js","ember-glimmer/helpers/component.js","ember-glimmer/helpers/concat.js","ember-glimmer/helpers/each-in.js","ember-glimmer/helpers/get.js","ember-glimmer/helpers/hash.js","ember-glimmer/helpers/if-unless.js","ember-glimmer/helpers/loc.js","ember-glimmer/helpers/log.js","ember-glimmer/helpers/mut.js","ember-glimmer/helpers/query-param.js","ember-glimmer/helpers/readonly.js","ember-glimmer/helpers/unbound.js","ember-glimmer/index.js","ember-glimmer/modifiers/action.js","ember-glimmer/protocol-for-url.js","ember-glimmer/renderer.js","ember-glimmer/setup-registry.js","ember-glimmer/syntax.js","ember-glimmer/syntax/-text-area.js","ember-glimmer/syntax/dynamic-component.js","ember-glimmer/syntax/input.js","ember-glimmer/syntax/mount.js","ember-glimmer/syntax/outlet.js","ember-glimmer/syntax/render.js","ember-glimmer/syntax/utils.js","ember-glimmer/template.js","ember-glimmer/template_registry.js","ember-glimmer/templates/component.js","ember-glimmer/templates/empty.js","ember-glimmer/templates/link-to.js","ember-glimmer/templates/outlet.js","ember-glimmer/templates/root.js","ember-glimmer/utils/bindings.js","ember-glimmer/utils/curly-component-state-bucket.js","ember-glimmer/utils/debug-stack.js","ember-glimmer/utils/iterable.js","ember-glimmer/utils/process-args.js","ember-glimmer/utils/references.js","ember-glimmer/utils/string.js","ember-glimmer/utils/to-bool.js","ember-glimmer/views/outlet.js","ember-metal.js","ember-routing/ext/controller.js","ember-routing/ext/run_loop.js","ember-routing/index.js","ember-routing/location/api.js","ember-routing/location/auto_location.js","ember-routing/location/hash_location.js","ember-routing/location/history_location.js","ember-routing/location/none_location.js","ember-routing/location/util.js","ember-routing/services/router.js","ember-routing/services/routing.js","ember-routing/system/cache.js","ember-routing/system/controller_for.js","ember-routing/system/dsl.js","ember-routing/system/generate_controller.js","ember-routing/system/query_params.js","ember-routing/system/route.js","ember-routing/system/router.js","ember-routing/system/router_state.js","ember-routing/utils.js","ember-runtime/compare.js","ember-runtime/computed/computed_macros.js","ember-runtime/computed/reduce_computed_macros.js","ember-runtime/controllers/controller.js","ember-runtime/copy.js","ember-runtime/ext/function.js","ember-runtime/ext/rsvp.js","ember-runtime/ext/string.js","ember-runtime/index.js","ember-runtime/inject.js","ember-runtime/is-equal.js","ember-runtime/mixins/-proxy.js","ember-runtime/mixins/action_handler.js","ember-runtime/mixins/array.js","ember-runtime/mixins/comparable.js","ember-runtime/mixins/container_proxy.js","ember-runtime/mixins/controller.js","ember-runtime/mixins/copyable.js","ember-runtime/mixins/enumerable.js","ember-runtime/mixins/evented.js","ember-runtime/mixins/mutable_array.js","ember-runtime/mixins/mutable_enumerable.js","ember-runtime/mixins/observable.js","ember-runtime/mixins/promise_proxy.js","ember-runtime/mixins/registry_proxy.js","ember-runtime/mixins/target_action_support.js","ember-runtime/string_registry.js","ember-runtime/system/application.js","ember-runtime/system/array_proxy.js","ember-runtime/system/core_object.js","ember-runtime/system/lazy_load.js","ember-runtime/system/namespace.js","ember-runtime/system/native_array.js","ember-runtime/system/object.js","ember-runtime/system/object_proxy.js","ember-runtime/system/service.js","ember-runtime/system/string.js","ember-runtime/utils.js","ember-template-compiler/compat.js","ember-template-compiler/index.js","ember-template-compiler/plugins/assert-input-helper-without-block.js","ember-template-compiler/plugins/assert-reserved-named-arguments.js","ember-template-compiler/plugins/deprecate-render-model.js","ember-template-compiler/plugins/deprecate-render.js","ember-template-compiler/plugins/extract-pragma-tag.js","ember-template-compiler/plugins/index.js","ember-template-compiler/plugins/transform-action-syntax.js","ember-template-compiler/plugins/transform-angle-bracket-components.js","ember-template-compiler/plugins/transform-attrs-into-args.js","ember-template-compiler/plugins/transform-dot-component-invocation.js","ember-template-compiler/plugins/transform-each-in-into-each.js","ember-template-compiler/plugins/transform-has-block-syntax.js","ember-template-compiler/plugins/transform-inline-link-to.js","ember-template-compiler/plugins/transform-input-type-syntax.js","ember-template-compiler/plugins/transform-old-binding-syntax.js","ember-template-compiler/plugins/transform-old-class-binding-syntax.js","ember-template-compiler/plugins/transform-quoted-bindings-into-just-bindings.js","ember-template-compiler/plugins/transform-top-level-components.js","ember-template-compiler/system/bootstrap.js","ember-template-compiler/system/calculate-location-display.js","ember-template-compiler/system/compile-options.js","ember-template-compiler/system/compile.js","ember-template-compiler/system/precompile.js","ember-testing/adapters/adapter.js","ember-testing/adapters/qunit.js","ember-testing/events.js","ember-testing/ext/application.js","ember-testing/ext/rsvp.js","ember-testing/helpers.js","ember-testing/helpers/and_then.js","ember-testing/helpers/click.js","ember-testing/helpers/current_path.js","ember-testing/helpers/current_route_name.js","ember-testing/helpers/current_url.js","ember-testing/helpers/fill_in.js","ember-testing/helpers/find.js","ember-testing/helpers/find_with_assert.js","ember-testing/helpers/key_event.js","ember-testing/helpers/pause_test.js","ember-testing/helpers/trigger_event.js","ember-testing/helpers/visit.js","ember-testing/helpers/wait.js","ember-testing/index.js","ember-testing/initializers.js","ember-testing/setup_for_testing.js","ember-testing/support.js","ember-testing/test.js","ember-testing/test/adapter.js","ember-testing/test/helpers.js","ember-testing/test/on_inject_helpers.js","ember-testing/test/pending_requests.js","ember-testing/test/promise.js","ember-testing/test/run.js","ember-testing/test/waiters.js","ember-utils.js","ember-views/compat/attrs.js","ember-views/compat/fallback-view-registry.js","ember-views/component_lookup.js","ember-views/index.js","ember-views/mixins/action_support.js","ember-views/mixins/child_views_support.js","ember-views/mixins/class_names_support.js","ember-views/mixins/text_support.js","ember-views/mixins/view_state_support.js","ember-views/mixins/view_support.js","ember-views/system/action_manager.js","ember-views/system/event_dispatcher.js","ember-views/system/ext.js","ember-views/system/jquery.js","ember-views/system/lookup_partial.js","ember-views/system/utils.js","ember-views/utils/lookup-component.js","ember-views/views/core_view.js","ember-views/views/states.js","ember-views/views/states/default.js","ember-views/views/states/destroying.js","ember-views/views/states/has_element.js","ember-views/views/states/in_dom.js","ember-views/views/states/pre_render.js","ember/features.js","ember/index.js","ember/version.js","handlebars.js","node-module.js","route-recognizer.js","router.js","rsvp.js","bootstrap","vendor/ember-cli-shims/deprecations.js","vendor/ember-cli-shims/app-shims.js","vendor/ember-resolver/legacy-shims.js","addon-tree-output/ember-ajax/-private/promise.js","addon-tree-output/ember-ajax/-private/utils/get-header.js","addon-tree-output/ember-ajax/-private/utils/is-fastboot.js","addon-tree-output/ember-ajax/-private/utils/is-string.js","addon-tree-output/ember-ajax/-private/utils/parse-response-headers.js","addon-tree-output/ember-ajax/-private/utils/url-helpers.js","addon-tree-output/ember-ajax/ajax-request.js","addon-tree-output/ember-ajax/errors.js","addon-tree-output/ember-ajax/index.js","addon-tree-output/ember-ajax/mixins/ajax-request.js","addon-tree-output/ember-ajax/mixins/ajax-support.js","addon-tree-output/ember-ajax/mixins/legacy/normalize-error-response.js","addon-tree-output/ember-ajax/raw.js","addon-tree-output/ember-ajax/request.js","addon-tree-output/ember-ajax/services/ajax.js","addon-tree-output/ember-ajax/utils/ajax.js","addon-tree-output/ember-cli-app-version/initializer-factory.js","addon-tree-output/ember-cli-app-version/utils/regexp.js","addon-tree-output/ember-inflector/index.js","addon-tree-output/ember-inflector/lib/ext/string.js","addon-tree-output/ember-inflector/lib/helpers/pluralize.js","addon-tree-output/ember-inflector/lib/helpers/singularize.js","addon-tree-output/ember-inflector/lib/system.js","addon-tree-output/ember-inflector/lib/system/inflections.js","addon-tree-output/ember-inflector/lib/system/inflector.js","addon-tree-output/ember-inflector/lib/system/string.js","addon-tree-output/ember-inflector/lib/utils/make-helper.js","addon-tree-output/ember-load-initializers/index.js","addon-tree-output/ember-resolver/features.js","addon-tree-output/ember-resolver/index.js","addon-tree-output/ember-resolver/resolver.js","addon-tree-output/ember-resolver/resolvers/classic/container-debug-adapter.js","addon-tree-output/ember-resolver/resolvers/classic/index.js","addon-tree-output/ember-resolver/utils/class-factory.js","addon-tree-output/ember-resolver/utils/make-dictionary.js","addon-tree-output/ember-welcome-page/components/welcome-page.js","addon-tree-output/ember-welcome-page/templates/components/welcome-page.js","addon-tree-output/modules/ember-data/-debug/index.js","addon-tree-output/modules/ember-data/-private.js","addon-tree-output/modules/ember-data/adapter.js","addon-tree-output/modules/ember-data/adapters/errors.js","addon-tree-output/modules/ember-data/adapters/json-api.js","addon-tree-output/modules/ember-data/adapters/rest.js","addon-tree-output/modules/ember-data/attr.js","addon-tree-output/modules/ember-data/index.js","addon-tree-output/modules/ember-data/initialize-store-service.js","addon-tree-output/modules/ember-data/model.js","addon-tree-output/modules/ember-data/relationships.js","addon-tree-output/modules/ember-data/serializer.js","addon-tree-output/modules/ember-data/serializers/embedded-records-mixin.js","addon-tree-output/modules/ember-data/serializers/json-api.js","addon-tree-output/modules/ember-data/serializers/json.js","addon-tree-output/modules/ember-data/serializers/rest.js","addon-tree-output/modules/ember-data/setup-container.js","addon-tree-output/modules/ember-data/store.js","addon-tree-output/modules/ember-data/transform.js","addon-tree-output/modules/ember-data/transforms/boolean.js","addon-tree-output/modules/ember-data/transforms/date.js","addon-tree-output/modules/ember-data/transforms/number.js","addon-tree-output/modules/ember-data/transforms/string.js","addon-tree-output/modules/ember-data/transforms/transform.js","addon-tree-output/modules/ember-data/version.js","vendor/ember-cli/vendor-suffix.js"],"sourcesContent":["window.EmberENV = {\"FEATURES\":{},\"EXTEND_PROTOTYPES\":{\"Date\":false}};\nvar runningTests = false;\n\n\n","var loader, define, requireModule, require, requirejs;\n\n(function (global) {\n 'use strict';\n\n function dict() {\n var obj = Object.create(null);\n obj['__'] = undefined;\n delete obj['__'];\n return obj;\n }\n\n // Save off the original values of these globals, so we can restore them if someone asks us to\n var oldGlobals = {\n loader: loader,\n define: define,\n requireModule: requireModule,\n require: require,\n requirejs: requirejs\n };\n\n requirejs = require = requireModule = function (id) {\n var pending = [];\n var mod = findModule(id, '(require)', pending);\n\n for (var i = pending.length - 1; i >= 0; i--) {\n pending[i].exports();\n }\n\n return mod.module.exports;\n };\n\n loader = {\n noConflict: function (aliases) {\n var oldName, newName;\n\n for (oldName in aliases) {\n if (aliases.hasOwnProperty(oldName)) {\n if (oldGlobals.hasOwnProperty(oldName)) {\n newName = aliases[oldName];\n\n global[newName] = global[oldName];\n global[oldName] = oldGlobals[oldName];\n }\n }\n }\n },\n // Option to enable or disable the generation of default exports\n makeDefaultExport: true\n };\n\n var registry = dict();\n var seen = dict();\n\n var uuid = 0;\n\n function unsupportedModule(length) {\n throw new Error('an unsupported module was defined, expected `define(id, deps, module)` instead got: `' + length + '` arguments to define`');\n }\n\n var defaultDeps = ['require', 'exports', 'module'];\n\n function Module(id, deps, callback, alias) {\n this.uuid = uuid++;\n this.id = id;\n this.deps = !deps.length && callback.length ? defaultDeps : deps;\n this.module = { exports: {} };\n this.callback = callback;\n this.hasExportsAsDep = false;\n this.isAlias = alias;\n this.reified = new Array(deps.length);\n\n /*\n Each module normally passes through these states, in order:\n new : initial state\n pending : this module is scheduled to be executed\n reifying : this module's dependencies are being executed\n reified : this module's dependencies finished executing successfully\n errored : this module's dependencies failed to execute\n finalized : this module executed successfully\n */\n this.state = 'new';\n }\n\n Module.prototype.makeDefaultExport = function () {\n var exports = this.module.exports;\n if (exports !== null && (typeof exports === 'object' || typeof exports === 'function') && exports['default'] === undefined && Object.isExtensible(exports)) {\n exports['default'] = exports;\n }\n };\n\n Module.prototype.exports = function () {\n // if finalized, there is no work to do. If reifying, there is a\n // circular dependency so we must return our (partial) exports.\n if (this.state === 'finalized' || this.state === 'reifying') {\n return this.module.exports;\n }\n\n\n if (loader.wrapModules) {\n this.callback = loader.wrapModules(this.id, this.callback);\n }\n\n this.reify();\n\n var result = this.callback.apply(this, this.reified);\n this.reified.length = 0;\n this.state = 'finalized';\n\n if (!(this.hasExportsAsDep && result === undefined)) {\n this.module.exports = result;\n }\n if (loader.makeDefaultExport) {\n this.makeDefaultExport();\n }\n return this.module.exports;\n };\n\n Module.prototype.unsee = function () {\n this.state = 'new';\n this.module = { exports: {} };\n };\n\n Module.prototype.reify = function () {\n if (this.state === 'reified') {\n return;\n }\n this.state = 'reifying';\n try {\n this.reified = this._reify();\n this.state = 'reified';\n } finally {\n if (this.state === 'reifying') {\n this.state = 'errored';\n }\n }\n };\n\n Module.prototype._reify = function () {\n var reified = this.reified.slice();\n for (var i = 0; i < reified.length; i++) {\n var mod = reified[i];\n reified[i] = mod.exports ? mod.exports : mod.module.exports();\n }\n return reified;\n };\n\n Module.prototype.findDeps = function (pending) {\n if (this.state !== 'new') {\n return;\n }\n\n this.state = 'pending';\n\n var deps = this.deps;\n\n for (var i = 0; i < deps.length; i++) {\n var dep = deps[i];\n var entry = this.reified[i] = { exports: undefined, module: undefined };\n if (dep === 'exports') {\n this.hasExportsAsDep = true;\n entry.exports = this.module.exports;\n } else if (dep === 'require') {\n entry.exports = this.makeRequire();\n } else if (dep === 'module') {\n entry.exports = this.module;\n } else {\n entry.module = findModule(resolve(dep, this.id), this.id, pending);\n }\n }\n };\n\n Module.prototype.makeRequire = function () {\n var id = this.id;\n var r = function (dep) {\n return require(resolve(dep, id));\n };\n r['default'] = r;\n r.moduleId = id;\n r.has = function (dep) {\n return has(resolve(dep, id));\n };\n return r;\n };\n\n define = function (id, deps, callback) {\n var module = registry[id];\n\n // If a module for this id has already been defined and is in any state\n // other than `new` (meaning it has been or is currently being required),\n // then we return early to avoid redefinition.\n if (module && module.state !== 'new') {\n return;\n }\n\n if (arguments.length < 2) {\n unsupportedModule(arguments.length);\n }\n\n if (!Array.isArray(deps)) {\n callback = deps;\n deps = [];\n }\n\n if (callback instanceof Alias) {\n registry[id] = new Module(callback.id, deps, callback, true);\n } else {\n registry[id] = new Module(id, deps, callback, false);\n }\n };\n\n define.exports = function (name, defaultExport) {\n var module = registry[name];\n\n // If a module for this name has already been defined and is in any state\n // other than `new` (meaning it has been or is currently being required),\n // then we return early to avoid redefinition.\n if (module && module.state !== 'new') {\n return;\n }\n\n module = new Module(name, [], noop, null);\n module.module.exports = defaultExport;\n module.state = 'finalized';\n registry[name] = module;\n\n return module;\n };\n\n function noop() {}\n // we don't support all of AMD\n // define.amd = {};\n\n function Alias(id) {\n this.id = id;\n }\n\n define.alias = function (id, target) {\n if (arguments.length === 2) {\n return define(target, new Alias(id));\n }\n\n return new Alias(id);\n };\n\n function missingModule(id, referrer) {\n throw new Error('Could not find module `' + id + '` imported from `' + referrer + '`');\n }\n\n function findModule(id, referrer, pending) {\n var mod = registry[id] || registry[id + '/index'];\n\n while (mod && mod.isAlias) {\n mod = registry[mod.id];\n }\n\n if (!mod) {\n missingModule(id, referrer);\n }\n\n if (pending && mod.state !== 'pending' && mod.state !== 'finalized') {\n mod.findDeps(pending);\n pending.push(mod);\n }\n return mod;\n }\n\n function resolve(child, id) {\n if (child.charAt(0) !== '.') {\n return child;\n }\n\n\n var parts = child.split('/');\n var nameParts = id.split('/');\n var parentBase = nameParts.slice(0, -1);\n\n for (var i = 0, l = parts.length; i < l; i++) {\n var part = parts[i];\n\n if (part === '..') {\n if (parentBase.length === 0) {\n throw new Error('Cannot access parent module of root');\n }\n parentBase.pop();\n } else if (part === '.') {\n continue;\n } else {\n parentBase.push(part);\n }\n }\n\n return parentBase.join('/');\n }\n\n function has(id) {\n return !!(registry[id] || registry[id + '/index']);\n }\n\n requirejs.entries = requirejs._eak_seen = registry;\n requirejs.has = has;\n requirejs.unsee = function (id) {\n findModule(id, '(unsee)', false).unsee();\n };\n\n requirejs.clear = function () {\n requirejs.entries = requirejs._eak_seen = registry = dict();\n seen = dict();\n };\n\n // This code primes the JS engine for good performance by warming the\n // JIT compiler for these functions.\n define('foo', function () {});\n define('foo/bar', [], function () {});\n define('foo/asdf', ['module', 'exports', 'require'], function (module, exports, require) {\n if (require.has('foo/bar')) {\n require('foo/bar');\n }\n });\n define('foo/baz', [], define.alias('foo'));\n define('foo/quz', define.alias('foo'));\n define.alias('foo', 'foo/qux');\n define('foo/bar', ['foo', './quz', './baz', './asdf', './bar', '../foo'], function () {});\n define('foo/main', ['foo/bar'], function () {});\n define.exports('foo/exports', {});\n\n require('foo/exports');\n require('foo/main');\n require.unsee('foo/bar');\n\n requirejs.clear();\n\n if (typeof exports === 'object' && typeof module === 'object' && module.exports) {\n module.exports = { require: require, define: define };\n }\n})(this);","/*!\n * jQuery JavaScript Library v3.3.1\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2018-01-20T17:24Z\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar document = window.document;\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar concat = arr.concat;\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\nvar isFunction = function isFunction( obj ) {\n\n // Support: Chrome <=57, Firefox <=52\n // In some browsers, typeof returns \"function\" for HTML <object> elements\n // (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n // We don't want to classify *any* DOM node as a function.\n return typeof obj === \"function\" && typeof obj.nodeType !== \"number\";\n };\n\n\nvar isWindow = function isWindow( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t};\n\n\n\n\n\tvar preservedScriptAttributes = {\n\t\ttype: true,\n\t\tsrc: true,\n\t\tnoModule: true\n\t};\n\n\tfunction DOMEval( code, doc, node ) {\n\t\tdoc = doc || document;\n\n\t\tvar i,\n\t\t\tscript = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tif ( node ) {\n\t\t\tfor ( i in preservedScriptAttributes ) {\n\t\t\t\tif ( node[ i ] ) {\n\t\t\t\t\tscript[ i ] = node[ i ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n\n\nfunction toType( obj ) {\n\tif ( obj == null ) {\n\t\treturn obj + \"\";\n\t}\n\n\t// Support: Android <=2.3 only (functionish RegExp)\n\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\ttypeof obj;\n}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar\n\tversion = \"3.3.1\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t},\n\n\t// Support: Android <=4.0 only\n\t// Make sure we trim BOM and NBSP\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) {\n\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && Array.isArray( src ) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject( src ) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\n\t\t/* eslint-disable no-unused-vars */\n\t\t// See https://github.com/eslint/eslint/issues/6125\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\t// Evaluates a script in a global context\n\tglobalEval: function( code ) {\n\t\tDOMEval( code );\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// Support: Android <=4.0 only\n\ttrim: function( text ) {\n\t\treturn text == null ?\n\t\t\t\"\" :\n\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\nfunction( i, name ) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = toType( obj );\n\n\tif ( isFunction( obj ) || isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.3.3\n * https://sizzlejs.com/\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2016-08-08\n */\n(function( window ) {\n\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// Instance methods\n\thasOwn = ({}).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf as it's faster than native\n\t// https://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\n\t// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = \"(?:\\\\\\\\.|[\\\\w-]|[^\\0-\\\\xa0])+\",\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\t\t// \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" + whitespace +\n\t\t\"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\n\trattributeQuotes = new RegExp( \"=\" + whitespace + \"*([^\\\\]'\\\"]*?)\" + whitespace + \"*\\\\]\", \"g\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\n\tfunescape = function( _, escaped, escapedWhitespace ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\t// Support: Firefox<24\n\t\t// Workaround erroneous numeric interpretation of +\"0x\"\n\t\treturn high !== high || escapedWhitespace ?\n\t\t\tescaped :\n\t\t\thigh < 0 ?\n\t\t\t\t// BMP codepoint\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// CSS string/identifier serialization\n\t// https://drafts.csswg.org/cssom/#common-serializing-idioms\n\trcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,\n\tfcssescape = function( ch, asCodePoint ) {\n\t\tif ( asCodePoint ) {\n\n\t\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\t\tif ( ch === \"\\0\" ) {\n\t\t\t\treturn \"\\uFFFD\";\n\t\t\t}\n\n\t\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\t\treturn ch.slice( 0, -1 ) + \"\\\\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t\t}\n\n\t\t// Other potentially-special ASCII characters get backslash-escaped\n\t\treturn \"\\\\\" + ch;\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tdisabledAncestor = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && (\"form\" in elem || \"label\" in elem);\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\n\t\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\t\tsetDocument( context );\n\t\t}\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( (m = match[1]) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( (elem = context.getElementById( m )) ) {\n\n\t\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && (elem = newContext.getElementById( m )) &&\n\t\t\t\t\t\t\tcontains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[2] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName &&\n\t\t\t\t\tcontext.getElementsByClassName ) {\n\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( support.qsa &&\n\t\t\t\t!compilerCache[ selector + \" \" ] &&\n\t\t\t\t(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\n\n\t\t\t\tif ( nodeType !== 1 ) {\n\t\t\t\t\tnewContext = context;\n\t\t\t\t\tnewSelector = selector;\n\n\t\t\t\t// qSA looks outside Element context, which is not what we want\n\t\t\t\t// Thanks to Andrew Dupont for this workaround technique\n\t\t\t\t// Support: IE <=8\n\t\t\t\t// Exclude object elements\n\t\t\t\t} else if ( context.nodeName.toLowerCase() !== \"object\" ) {\n\n\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\tif ( (nid = context.getAttribute( \"id\" )) ) {\n\t\t\t\t\t\tnid = nid.replace( rcssescape, fcssescape );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontext.setAttribute( \"id\", (nid = expando) );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[i] = \"#\" + nid + \" \" + toSelector( groups[i] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\t\t\t\t}\n\n\t\t\t\tif ( newSelector ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key + \" \" ] = value);\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement(\"fieldset\");\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split(\"|\"),\n\t\ti = arr.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[i] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\ta.sourceIndex - b.sourceIndex;\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t// https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\t/* jshint -W018 */\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\t\tdisabledAncestor( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocElem = document.documentElement;\n\tdocumentIsHTML = !isXML( document );\n\n\t// Support: IE 9-11, Edge\n\t// Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\n\tif ( preferredDoc !== document &&\n\t\t(subWindow = document.defaultView) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 11, Edge\n\t\tif ( subWindow.addEventListener ) {\n\t\t\tsubWindow.addEventListener( \"unload\", unloadHandler, false );\n\n\t\t// Support: IE 9 - 10 only\n\t\t} else if ( subWindow.attachEvent ) {\n\t\t\tsubWindow.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert(function( el ) {\n\t\tel.className = \"i\";\n\t\treturn !el.getAttribute(\"className\");\n\t});\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( el ) {\n\t\tel.appendChild( document.createComment(\"\") );\n\t\treturn !el.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert(function( el ) {\n\t\tdocElem.appendChild( el ).id = expando;\n\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\n\t});\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode(\"id\");\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( (elem = elems[i++]) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode(\"id\");\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See https://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( (support.qsa = rnative.test( document.querySelectorAll )) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( el ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// https://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( el ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\r\\\\' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( el.querySelectorAll(\"[msallowcapture^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !el.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n\t\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push(\"~=\");\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !el.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push(\".#.+[+~]\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( el ) {\n\t\t\tel.innerHTML = \"<a href='' disabled='disabled'></a>\" +\n\t\t\t\t\"<select disabled='disabled'><option/></select>\";\n\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = document.createElement(\"input\");\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( el.querySelectorAll(\"[name=d]\").length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( el.querySelectorAll(\":enabled\").length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t\tdocElem.appendChild( el ).disabled = true;\n\t\t\tif ( el.querySelectorAll(\":disabled\").length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tel.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( el ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( el, \"*\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( el, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully self-exclusive\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\tcompare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\tif ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\t\t\treturn a === document ? -1 :\n\t\t\t\tb === document ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t!compilerCache[ expr + \" \" ] &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch (e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t(val = elem.getAttributeNode(name)) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.escape = function( sel ) {\n\treturn (sel + \"\").replace( rcssescape, fcssescape );\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( (node = elem[i++]) ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[3] || match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[6] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[3] ) {\n\t\t\t\tmatch[2] = match[4] || match[5] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() { return true; } :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== \"undefined\" && elem.getAttribute(\"class\") || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, uniqueCache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\n\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\tnode = parent;\n\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[0] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": createDisabledPseudo( false ),\n\t\t\"disabled\": createDisabledPseudo( true ),\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t// but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( (tokens = []) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push({\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t});\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push({\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t});\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tskip = combinator.next,\n\t\tkey = skip || dir,\n\t\tcheckNonElements = base && key === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, uniqueCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\n\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\tuniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});\n\n\t\t\t\t\t\tif ( skip && skip === elem.nodeName.toLowerCase() ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( (oldCache = uniqueCache[ key ]) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn (newCache[ 2 ] = oldCache[ 2 ]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\tuniqueCache[ key ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", outermost ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context === document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\tif ( !context && elem.ownerDocument !== document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n * selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n * selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( (selector = compiled.selector || selector) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[0] = match[0].slice( 0 );\n\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {\n\n\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[i];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( (seed = find(\n\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context\n\t\t\t\t)) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert(function( el ) {\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement(\"fieldset\") ) & 1;\n});\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert(function( el ) {\n\tel.innerHTML = \"<a href='#'></a>\";\n\treturn el.firstChild.getAttribute(\"href\") === \"#\" ;\n}) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert(function( el ) {\n\tel.innerHTML = \"<input/>\";\n\tel.firstChild.setAttribute( \"value\", \"\" );\n\treturn el.firstChild.getAttribute( \"value\" ) === \"\";\n}) ) {\n\taddHandle( \"value\", function( elem, name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert(function( el ) {\n\treturn el.getAttribute(\"disabled\") == null;\n}) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t\t(val = elem.getAttributeNode( name )) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\tnull;\n\t\t}\n\t});\n}\n\nreturn Sizzle;\n\n})( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\njQuery.escapeSelector = Sizzle.escape;\n\n\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\n\n\nfunction nodeName( elem, name ) {\n\n return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\n};\nvar rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\t}\n\n\t// Single element\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\t}\n\n\t// Arraylike of elements (jQuery, arguments, Array)\n\tif ( typeof qualifier !== \"string\" ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t\t} );\n\t}\n\n\t// Filtered directly for both simple and complex selectors\n\treturn jQuery.filter( qualifier, elements, not );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\tif ( elems.length === 1 && elem.nodeType === 1 ) {\n\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n\t}\n\n\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\treturn elem.nodeType === 1;\n\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i, ret,\n\t\t\tlen = this.length,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tret = this.pushStack( [] );\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\t// Shortcut simple #id case for speed\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\ttargets = typeof selectors !== \"string\" && jQuery( selectors );\n\n\t\t// Positional selectors never match, since there's no _selection_ context\n\t\tif ( !rneedsContext.test( selectors ) ) {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t\t// Always skip document fragments\n\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ?\n\t\t\t\t\t\ttargets.index( cur ) > -1 :\n\n\t\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n if ( nodeName( elem, \"iframe\" ) ) {\n return elem.contentDocument;\n }\n\n // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n // Treat the template element as a regular one in browsers that\n // don't support it.\n if ( nodeName( elem, \"template\" ) ) {\n elem = elem.content || elem;\n }\n\n return jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = locked || options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && toType( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory && !firing ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\nfunction Identity( v ) {\n\treturn v;\n}\nfunction Thrower( ex ) {\n\tthrow ex;\n}\n\nfunction adoptValue( value, resolve, reject, noValue ) {\n\tvar method;\n\n\ttry {\n\n\t\t// Check for promise aspect first to privilege synchronous behavior\n\t\tif ( value && isFunction( ( method = value.promise ) ) ) {\n\t\t\tmethod.call( value ).done( resolve ).fail( reject );\n\n\t\t// Other thenables\n\t\t} else if ( value && isFunction( ( method = value.then ) ) ) {\n\t\t\tmethod.call( value, resolve, reject );\n\n\t\t// Other non-thenables\n\t\t} else {\n\n\t\t\t// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n\t\t\t// * false: [ value ].slice( 0 ) => resolve( value )\n\t\t\t// * true: [ value ].slice( 1 ) => resolve()\n\t\t\tresolve.apply( undefined, [ value ].slice( noValue ) );\n\t\t}\n\n\t// For Promises/A+, convert exceptions into rejections\n\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n\t// Deferred#then to conditionally suppress rejection.\n\t} catch ( value ) {\n\n\t\t// Support: Android 4.0 only\n\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\treject.apply( undefined, [ value ] );\n\t}\n}\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, callbacks,\n\t\t\t\t// ... .then handlers, argument index, [final state]\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"memory\" ), 2 ],\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\t\"catch\": function( fn ) {\n\t\t\t\t\treturn promise.then( null, fn );\n\t\t\t\t},\n\n\t\t\t\t// Keep pipe for back-compat\n\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\n\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress)\n\t\t\t\t\t\t\tvar fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify })\n\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve })\n\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject })\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) {\n\t\t\t\t\tvar maxDepth = 0;\n\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tvar that = this,\n\t\t\t\t\t\t\t\targs = arguments,\n\t\t\t\t\t\t\t\tmightThrow = function() {\n\t\t\t\t\t\t\t\t\tvar returned, then;\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59\n\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts\n\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args );\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48\n\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) {\n\t\t\t\t\t\t\t\t\t\tthrow new TypeError( \"Thenable self-resolution\" );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75\n\t\t\t\t\t\t\t\t\t// Retrieve `then` only once\n\t\t\t\t\t\t\t\t\tthen = returned &&\n\n\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4\n\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64\n\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability\n\t\t\t\t\t\t\t\t\t\t( typeof returned === \"object\" ||\n\t\t\t\t\t\t\t\t\t\t\ttypeof returned === \"function\" ) &&\n\t\t\t\t\t\t\t\t\t\treturned.then;\n\n\t\t\t\t\t\t\t\t\t// Handle a returned thenable\n\t\t\t\t\t\t\t\t\tif ( isFunction( then ) ) {\n\n\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution\n\t\t\t\t\t\t\t\t\t\tif ( special ) {\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special )\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values\n\t\t\t\t\t\t\t\t\t\t\tmaxDepth++;\n\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Handle all other returned values\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) {\n\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\targs = [ returned ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Process the value(s)\n\t\t\t\t\t\t\t\t\t\t// Default process is resolve\n\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions\n\t\t\t\t\t\t\t\tprocess = special ?\n\t\t\t\t\t\t\t\t\tmightThrow :\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tmightThrow();\n\t\t\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) {\n\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e,\n\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.stackTrace );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1\n\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61\n\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions\n\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1\n\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57\n\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from\n\t\t\t\t\t\t\t// subsequent errors\n\t\t\t\t\t\t\tif ( depth ) {\n\t\t\t\t\t\t\t\tprocess();\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Call an optional hook to record the stack, in case of exception\n\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async\n\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.stackTrace = jQuery.Deferred.getStackHook();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twindow.setTimeout( process );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\n\t\t\t\t\t\t// progress_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 0 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onProgress ) ?\n\t\t\t\t\t\t\t\t\tonProgress :\n\t\t\t\t\t\t\t\t\tIdentity,\n\t\t\t\t\t\t\t\tnewDefer.notifyWith\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// fulfilled_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 1 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onFulfilled ) ?\n\t\t\t\t\t\t\t\t\tonFulfilled :\n\t\t\t\t\t\t\t\t\tIdentity\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// rejected_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 2 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onRejected ) ?\n\t\t\t\t\t\t\t\t\tonRejected :\n\t\t\t\t\t\t\t\t\tThrower\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 5 ];\n\n\t\t\t// promise.progress = list.add\n\t\t\t// promise.done = list.add\n\t\t\t// promise.fail = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(\n\t\t\t\t\tfunction() {\n\n\t\t\t\t\t\t// state = \"resolved\" (i.e., fulfilled)\n\t\t\t\t\t\t// state = \"rejected\"\n\t\t\t\t\t\tstate = stateString;\n\t\t\t\t\t},\n\n\t\t\t\t\t// rejected_callbacks.disable\n\t\t\t\t\t// fulfilled_callbacks.disable\n\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable,\n\n\t\t\t\t\t// rejected_handlers.disable\n\t\t\t\t\t// fulfilled_handlers.disable\n\t\t\t\t\ttuples[ 3 - i ][ 3 ].disable,\n\n\t\t\t\t\t// progress_callbacks.lock\n\t\t\t\t\ttuples[ 0 ][ 2 ].lock,\n\n\t\t\t\t\t// progress_handlers.lock\n\t\t\t\t\ttuples[ 0 ][ 3 ].lock\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// progress_handlers.fire\n\t\t\t// fulfilled_handlers.fire\n\t\t\t// rejected_handlers.fire\n\t\t\tlist.add( tuple[ 3 ].fire );\n\n\t\t\t// deferred.notify = function() { deferred.notifyWith(...) }\n\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) }\n\t\t\t// deferred.reject = function() { deferred.rejectWith(...) }\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t// deferred.notifyWith = list.fireWith\n\t\t\t// deferred.resolveWith = list.fireWith\n\t\t\t// deferred.rejectWith = list.fireWith\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( singleValue ) {\n\t\tvar\n\n\t\t\t// count of uncompleted subordinates\n\t\t\tremaining = arguments.length,\n\n\t\t\t// count of unprocessed arguments\n\t\t\ti = remaining,\n\n\t\t\t// subordinate fulfillment data\n\t\t\tresolveContexts = Array( i ),\n\t\t\tresolveValues = slice.call( arguments ),\n\n\t\t\t// the master Deferred\n\t\t\tmaster = jQuery.Deferred(),\n\n\t\t\t// subordinate callback factory\n\t\t\tupdateFunc = function( i ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tresolveContexts[ i ] = this;\n\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( !( --remaining ) ) {\n\t\t\t\t\t\tmaster.resolveWith( resolveContexts, resolveValues );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t// Single- and empty arguments are adopted like Promise.resolve\n\t\tif ( remaining <= 1 ) {\n\t\t\tadoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,\n\t\t\t\t!remaining );\n\n\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000)\n\t\t\tif ( master.state() === \"pending\" ||\n\t\t\t\tisFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn master.then();\n\t\t\t}\n\t\t}\n\n\t\t// Multiple arguments are aggregated like Promise.all array elements\n\t\twhile ( i-- ) {\n\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), master.reject );\n\t\t}\n\n\t\treturn master.promise();\n\t}\n} );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\nvar rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\njQuery.Deferred.exceptionHook = function( error, stack ) {\n\n\t// Support: IE 8 - 9 only\n\t// Console exists when dev tools are open, which can happen at any time\n\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n\t\twindow.console.warn( \"jQuery.Deferred exception: \" + error.message, error.stack, stack );\n\t}\n};\n\n\n\n\njQuery.readyException = function( error ) {\n\twindow.setTimeout( function() {\n\t\tthrow error;\n\t} );\n};\n\n\n\n\n// The deferred used on DOM ready\nvar readyList = jQuery.Deferred();\n\njQuery.fn.ready = function( fn ) {\n\n\treadyList\n\t\t.then( fn )\n\n\t\t// Wrap jQuery.readyException in a function so that the lookup\n\t\t// happens at the time of error handling instead of callback\n\t\t// registration.\n\t\t.catch( function( error ) {\n\t\t\tjQuery.readyException( error );\n\t\t} );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\t}\n} );\n\njQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\nif ( document.readyState === \"complete\" ||\n\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\twindow.setTimeout( jQuery.ready );\n\n} else {\n\n\t// Use the handy event callback\n\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t// A fallback to window.onload, that will always work\n\twindow.addEventListener( \"load\", completed );\n}\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( toType( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\tvalue :\n\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( chainable ) {\n\t\treturn elems;\n\t}\n\n\t// Gets\n\tif ( bulk ) {\n\t\treturn fn.call( elems );\n\t}\n\n\treturn len ? fn( elems[ 0 ], key ) : emptyGet;\n};\n\n\n// Matches dashed string for camelizing\nvar rmsPrefix = /^-ms-/,\n\trdashAlpha = /-([a-z])/g;\n\n// Used by camelCase as callback to replace()\nfunction fcamelCase( all, letter ) {\n\treturn letter.toUpperCase();\n}\n\n// Convert dashed to camelCase; used by the css and data modules\n// Support: IE <=9 - 11, Edge 12 - 15\n// Microsoft forgot to hump their vendor prefix (#9572)\nfunction camelCase( string ) {\n\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n}\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t// - Node\n\t// - Node.ELEMENT_NODE\n\t// - Node.DOCUMENT_NODE\n\t// - Object\n\t// - Any\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tcache: function( owner ) {\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see #8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\t// Always use camelCase key (gh-2257)\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ camelCase( data ) ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ camelCase( prop ) ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\n\t\t\t// Always use camelCase key (gh-2257)\n\t\t\towner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];\n\t},\n\taccess: function( owner, key, value ) {\n\n\t\t// In cases where either:\n\t\t//\n\t\t// 1. No key was specified\n\t\t// 2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t// 1. The entire cache object\n\t\t// 2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\treturn this.get( owner, key );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t// 1. An object of properties\n\t\t// 2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key !== undefined ) {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( Array.isArray( key ) ) {\n\n\t\t\t\t// If key is an array of keys...\n\t\t\t\t// We always set camelCase keys, so remove that.\n\t\t\t\tkey = key.map( camelCase );\n\t\t\t} else {\n\t\t\t\tkey = camelCase( key );\n\n\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\tkey = key in cache ?\n\t\t\t\t\t[ key ] :\n\t\t\t\t\t( key.match( rnothtmlwhite ) || [] );\n\t\t\t}\n\n\t\t\ti = key.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ key[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <=35 - 45\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction getData( data ) {\n\tif ( data === \"true\" ) {\n\t\treturn true;\n\t}\n\n\tif ( data === \"false\" ) {\n\t\treturn false;\n\t}\n\n\tif ( data === \"null\" ) {\n\t\treturn null;\n\t}\n\n\t// Only convert to a number if it doesn't change the string\n\tif ( data === +data + \"\" ) {\n\t\treturn +data;\n\t}\n\n\tif ( rbrace.test( data ) ) {\n\t\treturn JSON.parse( data );\n\t}\n\n\treturn data;\n}\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = getData( data );\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE 11 only\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// The key will always be camelCased in Data\n\t\t\t\tdata = dataUser.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each( function() {\n\n\t\t\t\t// We always store the camelCased key\n\t\t\t\tdataUser.set( this, key, value );\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || Array.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar isHiddenWithinTree = function( elem, el ) {\n\n\t\t// isHiddenWithinTree might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\n\t\t// Inline style trumps all\n\t\treturn elem.style.display === \"none\" ||\n\t\t\telem.style.display === \"\" &&\n\n\t\t\t// Otherwise, check computed style\n\t\t\t// Support: Firefox <=43 - 45\n\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is\n\t\t\t// in the document.\n\t\t\tjQuery.contains( elem.ownerDocument, elem ) &&\n\n\t\t\tjQuery.css( elem, \"display\" ) === \"none\";\n\t};\n\nvar swap = function( elem, options, callback, args ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.apply( elem, args || [] );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted, scale,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() {\n\t\t\t\treturn tween.cur();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\treturn jQuery.css( elem, prop, \"\" );\n\t\t\t},\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = ( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Support: Firefox <=54\n\t\t// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)\n\t\tinitial = initial / 2;\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\twhile ( maxIterations-- ) {\n\n\t\t\t// Evaluate and update our best guess (doubling guesses that zero out).\n\t\t\t// Finish if the scale equals or crosses 1 (making the old*new product non-positive).\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\t\t\tif ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {\n\t\t\t\tmaxIterations = 0;\n\t\t\t}\n\t\t\tinitialInUnit = initialInUnit / scale;\n\n\t\t}\n\n\t\tinitialInUnit = initialInUnit * 2;\n\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\nvar defaultDisplayMap = {};\n\nfunction getDefaultDisplay( elem ) {\n\tvar temp,\n\t\tdoc = elem.ownerDocument,\n\t\tnodeName = elem.nodeName,\n\t\tdisplay = defaultDisplayMap[ nodeName ];\n\n\tif ( display ) {\n\t\treturn display;\n\t}\n\n\ttemp = doc.body.appendChild( doc.createElement( nodeName ) );\n\tdisplay = jQuery.css( temp, \"display\" );\n\n\ttemp.parentNode.removeChild( temp );\n\n\tif ( display === \"none\" ) {\n\t\tdisplay = \"block\";\n\t}\n\tdefaultDisplayMap[ nodeName ] = display;\n\n\treturn display;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\t// Determine new display value for elements that need to change\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n\t\t\t// check is required in this first loop unless we have a nonempty display value (either\n\t\t\t// inline or about-to-be-restored)\n\t\t\tif ( display === \"none\" ) {\n\t\t\t\tvalues[ index ] = dataPriv.get( elem, \"display\" ) || null;\n\t\t\t\tif ( !values[ index ] ) {\n\t\t\t\t\telem.style.display = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n\t\t\t\tvalues[ index ] = getDefaultDisplay( elem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( display !== \"none\" ) {\n\t\t\t\tvalues[ index ] = \"none\";\n\n\t\t\t\t// Remember what we're overwriting\n\t\t\t\tdataPriv.set( elem, \"display\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of the elements in a second loop to avoid constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( values[ index ] != null ) {\n\t\t\telements[ index ].style.display = values[ index ];\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend( {\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHiddenWithinTree( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]+)/i );\n\nvar rscriptType = ( /^$|^module$|\\/(?:java|ecma)script/i );\n\n\n\n// We have to close these tags to support XHTML (#13200)\nvar wrapMap = {\n\n\t// Support: IE <=9 only\n\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting <tbody> or other required elements.\n\tthead: [ 1, \"<table>\", \"</table>\" ],\n\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\n// Support: IE <=9 only\nwrapMap.optgroup = wrapMap.option;\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (#15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, contains, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( toType( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (#12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tcontains = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( contains ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0 - 4.3 only\n\t// Check state lost if the name is set (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Android <=4.1 only\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE <=11 only\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n} )();\nvar documentElement = document.documentElement;\n\n\n\nvar\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE <=9 only\n// See #13393 for more info\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tvar event = jQuery.event.fix( nativeEvent );\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\t\t\thandlers = ( dataPriv.get( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// Triggered event must either 1) have no namespace, or 2) have namespace(s)\n\t\t\t\t// a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG <use> instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tfocus: {\n\n\t\t\t// Fire native event if possible so blur/focus sequence is correct\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this !== safeActiveElement() && this.focus ) {\n\t\t\t\t\tthis.focus();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this === safeActiveElement() && this.blur ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\t\tclick: {\n\n\t\t\t// For checkbox, fire native event so checked state will be right\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this.type === \"checkbox\" && this.click && nodeName( this, \"input\" ) ) {\n\t\t\t\t\tthis.click();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, don't fire native .click() on links\n\t\t\t_default: function( event ) {\n\t\t\t\treturn nodeName( event.target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (#504, #13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || Date.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\n\twhich: function( event ) {\n\t\tvar button = event.button;\n\n\t\t// Add which for key events\n\t\tif ( event.which == null && rkeyEvent.test( event.type ) ) {\n\t\t\treturn event.charCode != null ? event.charCode : event.keyCode;\n\t\t}\n\n\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\tif ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {\n\t\t\tif ( button & 1 ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\tif ( button & 2 ) {\n\t\t\t\treturn 3;\n\t\t\t}\n\n\t\t\tif ( button & 4 ) {\n\t\t\t\treturn 2;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn event.which;\n\t}\n}, jQuery.event.addProp );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event ) dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t/* eslint-disable max-len */\n\n\t// See https://github.com/eslint/eslint/issues/3229\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)[^>]*)\\/>/gi,\n\n\t/* eslint-enable */\n\n\t// Support: IE <=10 - 11, Edge 12 - 13 only\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /<script|<style|<link/i,\n\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, \"table\" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn jQuery( elem ).children( \"tbody\" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tif ( ( elem.type || \"\" ).slice( 0, 5 ) === \"true/\" ) {\n\t\telem.type = elem.type.slice( 5 );\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.access( src );\n\t\tpdataCur = dataPriv.set( dest, pdataOld );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdelete pdataCur.handle;\n\t\t\tpdataCur.events = {};\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = concat.apply( [], args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tvalueIsFunction = isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( valueIsFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Reenable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src && ( node.type || \"\" ).toLowerCase() !== \"module\" ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), doc, node );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && jQuery.contains( node.ownerDocument, node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html.replace( rxhtmlTag, \"<$1></$2>\" );\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\nvar rboxStyle = new RegExp( cssExpand.join( \"|\" ), \"i\" );\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.cssText = \"position:absolute;left:-11111px;width:60px;\" +\n\t\t\t\"margin-top:1px;padding:0;border:0\";\n\t\tdiv.style.cssText =\n\t\t\t\"position:relative;display:block;box-sizing:border-box;overflow:scroll;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"width:60%;top:1%\";\n\t\tdocumentElement.appendChild( container ).appendChild( div );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;\n\n\t\t// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.right = \"60%\";\n\t\tpixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;\n\n\t\t// Support: IE 9 - 11 only\n\t\t// Detect misreporting of content dimensions for box-sizing:border-box elements\n\t\tboxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;\n\n\t\t// Support: IE 9 only\n\t\t// Detect overflow:scroll screwiness (gh-3699)\n\t\tdiv.style.position = \"absolute\";\n\t\tscrollboxSizeVal = div.offsetWidth === 36 || \"absolute\";\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tfunction roundPixelMeasures( measure ) {\n\t\treturn Math.round( parseFloat( measure ) );\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,\n\t\treliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (#8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tjQuery.extend( support, {\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelBoxStyles: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelBoxStylesVal;\n\t\t},\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t},\n\t\tscrollboxSize: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn scrollboxSizeVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t// .css('filter') (IE 9 only, #12537)\n\t// .css('--customProperty) (#3144)\n\tif ( computed ) {\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trcustomProp = /^--/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t},\n\n\tcssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style;\n\n// Return a css property mapped to a potentially vendor prefixed property\nfunction vendorPropName( name ) {\n\n\t// Shortcut for names that are not vendor prefixed\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a property mapped along what jQuery.cssProps suggests or to\n// a vendor prefixed property.\nfunction finalPropName( name ) {\n\tvar ret = jQuery.cssProps[ name ];\n\tif ( !ret ) {\n\t\tret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;\n\t}\n\treturn ret;\n}\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {\n\tvar i = dimension === \"width\" ? 1 : 0,\n\t\textra = 0,\n\t\tdelta = 0;\n\n\t// Adjustment may not be necessary\n\tif ( box === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\treturn 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin\n\t\tif ( box === \"margin\" ) {\n\t\t\tdelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\t// If we get here with a content-box, we're seeking \"padding\" or \"border\" or \"margin\"\n\t\tif ( !isBorderBox ) {\n\n\t\t\t// Add padding\n\t\t\tdelta += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// For \"border\" or \"margin\", add border\n\t\t\tif ( box !== \"padding\" ) {\n\t\t\t\tdelta += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\n\t\t\t// But still keep track of it otherwise\n\t\t\t} else {\n\t\t\t\textra += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\n\t\t// If we get here with a border-box (content + padding + border), we're seeking \"content\" or\n\t\t// \"padding\" or \"margin\"\n\t\t} else {\n\n\t\t\t// For \"content\", subtract padding\n\t\t\tif ( box === \"content\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// For \"content\" or \"padding\", subtract border\n\t\t\tif ( box !== \"margin\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Account for positive content-box scroll gutter when requested by providing computedVal\n\tif ( !isBorderBox && computedVal >= 0 ) {\n\n\t\t// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n\t\t// Assuming integer scroll gutter, subtract the rest and round down\n\t\tdelta += Math.max( 0, Math.ceil(\n\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\tcomputedVal -\n\t\t\tdelta -\n\t\t\textra -\n\t\t\t0.5\n\t\t) );\n\t}\n\n\treturn delta;\n}\n\nfunction getWidthOrHeight( elem, dimension, extra ) {\n\n\t// Start with computed style\n\tvar styles = getStyles( elem ),\n\t\tval = curCSS( elem, dimension, styles ),\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\tvalueIsBorderBox = isBorderBox;\n\n\t// Support: Firefox <=54\n\t// Return a confounding non-pixel value or feign ignorance, as appropriate.\n\tif ( rnumnonpx.test( val ) ) {\n\t\tif ( !extra ) {\n\t\t\treturn val;\n\t\t}\n\t\tval = \"auto\";\n\t}\n\n\t// Check for style in case a browser which returns unreliable values\n\t// for getComputedStyle silently falls back to the reliable elem.style\n\tvalueIsBorderBox = valueIsBorderBox &&\n\t\t( support.boxSizingReliable() || val === elem.style[ dimension ] );\n\n\t// Fall back to offsetWidth/offsetHeight when value is \"auto\"\n\t// This happens for inline elements with no explicit setting (gh-3571)\n\t// Support: Android <=4.1 - 4.3 only\n\t// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n\tif ( val === \"auto\" ||\n\t\t!parseFloat( val ) && jQuery.css( elem, \"display\", false, styles ) === \"inline\" ) {\n\n\t\tval = elem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ];\n\n\t\t// offsetWidth/offsetHeight provide border-box values\n\t\tvalueIsBorderBox = true;\n\t}\n\n\t// Normalize \"\" and auto\n\tval = parseFloat( val ) || 0;\n\n\t// Adjust for the element's box model\n\treturn ( val +\n\t\tboxModelAdjustment(\n\t\t\telem,\n\t\t\tdimension,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles,\n\n\t\t\t// Provide the current computed size to request scroll gutter calculation (gh-3589)\n\t\t\tval\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"animationIterationCount\": true,\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (#7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (#7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\tif ( type === \"number\" ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( i, dimension ) {\n\tjQuery.cssHooks[ dimension ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\t\treturn getWidthOrHeight( elem, dimension, extra );\n\t\t\t\t\t\t} ) :\n\t\t\t\t\t\tgetWidthOrHeight( elem, dimension, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = getStyles( elem ),\n\t\t\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\tsubtract = extra && boxModelAdjustment(\n\t\t\t\t\telem,\n\t\t\t\t\tdimension,\n\t\t\t\t\textra,\n\t\t\t\t\tisBorderBox,\n\t\t\t\t\tstyles\n\t\t\t\t);\n\n\t\t\t// Account for unreliable border-box dimensions by comparing offset* to computed and\n\t\t\t// faking a content-box to get border and padding (gh-3699)\n\t\t\tif ( isBorderBox && support.scrollboxSize() === styles.position ) {\n\t\t\t\tsubtract -= Math.ceil(\n\t\t\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\t\t\tparseFloat( styles[ dimension ] ) -\n\t\t\t\t\tboxModelAdjustment( elem, dimension, \"border\", false, styles ) -\n\t\t\t\t\t0.5\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ dimension ] = value;\n\t\t\t\tvalue = jQuery.css( elem, dimension );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( prefix !== \"margin\" ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 &&\n\t\t\t\t( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||\n\t\t\t\t\tjQuery.cssHooks[ tween.prop ] ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, inProgress,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction schedule() {\n\tif ( inProgress ) {\n\t\tif ( document.hidden === false && window.requestAnimationFrame ) {\n\t\t\twindow.requestAnimationFrame( schedule );\n\t\t} else {\n\t\t\twindow.setTimeout( schedule, jQuery.fx.interval );\n\t\t}\n\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = Date.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 15\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY and Edge just mirrors\n\t\t// the overflowX value there.\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( Array.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\t// If there's more to do, yield\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t}\n\n\t\t\t// If this was an empty animation, synthesize a final progress notification\n\t\t\tif ( !length ) {\n\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t}\n\n\t\t\t// Resolve the animation and report its conclusion\n\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\treturn false;\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tresult.stop.bind( result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\t// Attach callbacks from options\n\tanimation\n\t\t.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\treturn animation;\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tisFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off\n\tif ( jQuery.fx.off ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = Date.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Run the timer and safely remove it when done (allowing for external removal)\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tjQuery.fx.start();\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( inProgress ) {\n\t\treturn;\n\t}\n\n\tinProgress = true;\n\tschedule();\n};\n\njQuery.fx.stop = function() {\n\tinProgress = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tnodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\nfunction classesToArray( value ) {\n\tif ( Array.isArray( value ) ) {\n\t\treturn value;\n\t}\n\tif ( typeof value === \"string\" ) {\n\t\treturn value.match( rnothtmlwhite ) || [];\n\t}\n\treturn [];\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value,\n\t\t\tisValidValue = type === \"string\" || Array.isArray( value );\n\n\t\tif ( typeof stateVal === \"boolean\" && isValidValue ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar className, i, self, classNames;\n\n\t\t\tif ( isValidValue ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\ti = 0;\n\t\t\t\tself = jQuery( this );\n\t\t\t\tclassNames = classesToArray( value );\n\n\t\t\t\twhile ( ( className = classNames[ i++ ] ) ) {\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, valueIsFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueIsFunction = isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( Array.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (#14686, #14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\nsupport.focusin = \"onfocusin\" in window;\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\tstopPropagationCallback = function( e ) {\n\t\te.stopPropagation();\n\t};\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special, lastElement,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = lastElement = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tlastElement = cur;\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( dataPriv.get( cur, \"events\" ) || {} )[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.addEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\telem[ type ]();\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.removeEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\n// Support: Firefox <=44\n// Firefox doesn't have focus(in | out) events\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n//\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n// focus(in | out) events fire after focus & blur events,\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\nif ( !support.focusin ) {\n\tjQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\n\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdataPriv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\nvar location = window.location;\n\nvar nonce = Date.now();\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {\n\t\txml = undefined;\n\t}\n\n\tif ( !xml || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\tjQuery.error( \"Invalid XML: \" + data );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && toType( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} )\n\t\t.filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} )\n\t\t.map( function( i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t * - BEFORE asking for a transport\n\t * - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\toriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match;\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 15\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available and should be processed, append data to url\n\t\t\tif ( s.data && ( s.processData || typeof s.data === \"string\" ) ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce++ ) + uncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\n\njQuery._evalUrl = function( url ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (#11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\t\t\"throws\": true\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar htmlIsFunction = isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// #1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.ontimeout =\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see #8605, #14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\" ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = xhr.ontimeout = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// #14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"<script>\" ).prop( {\n\t\t\t\t\tcharset: s.scriptCharset,\n\t\t\t\t\tsrc: s.url\n\t\t\t\t} ).on(\n\t\t\t\t\t\"load error\",\n\t\t\t\t\tcallback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup( {\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n} );\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" &&\n\t\t\t\t( s.contentType || \"\" )\n\t\t\t\t\t.indexOf( \"application/x-www-form-urlencoded\" ) === 0 &&\n\t\t\t\trjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[ \"script json\" ] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// Force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always( function() {\n\n\t\t\t// If previous value didn't exist - remove it\n\t\t\tif ( overwritten === undefined ) {\n\t\t\t\tjQuery( window ).removeProp( callbackName );\n\n\t\t\t// Otherwise restore preexisting value\n\t\t\t} else {\n\t\t\t\twindow[ callbackName ] = overwritten;\n\t\t\t}\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\n\t\t\t\t// Make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// Save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t} );\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n} );\n\n\n\n\n// Support: Safari 8 only\n// In Safari 8 documents created via document.implementation.createHTMLDocument\n// collapse sibling forms: the second one becomes a child of the first one.\n// Because of that, this security measure has to be disabled in Safari 8.\n// https://bugs.webkit.org/show_bug.cgi?id=137337\nsupport.createHTMLDocument = ( function() {\n\tvar body = document.implementation.createHTMLDocument( \"\" ).body;\n\tbody.innerHTML = \"<form></form><form></form>\";\n\treturn body.childNodes.length === 2;\n} )();\n\n\n// Argument \"data\" should be string of html\n// context (optional): If specified, the fragment will be created in this context,\n// defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( typeof data !== \"string\" ) {\n\t\treturn [];\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\n\tvar base, parsed, scripts;\n\n\tif ( !context ) {\n\n\t\t// Stop scripts or inline event handlers from being executed immediately\n\t\t// by using document.implementation\n\t\tif ( support.createHTMLDocument ) {\n\t\t\tcontext = document.implementation.createHTMLDocument( \"\" );\n\n\t\t\t// Set the base href for the created document\n\t\t\t// so any parsed elements with URLs\n\t\t\t// are based on the document's URL (gh-2965)\n\t\t\tbase = context.createElement( \"base\" );\n\t\t\tbase.href = document.location.href;\n\t\t\tcontext.head.appendChild( base );\n\t\t} else {\n\t\t\tcontext = document;\n\t\t}\n\t}\n\n\tparsed = rsingleTag.exec( data );\n\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[ 1 ] ) ];\n\t}\n\n\tparsed = buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf( \" \" );\n\n\tif ( off > -1 ) {\n\t\tselector = stripAndCollapse( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax( {\n\t\t\turl: url,\n\n\t\t\t// If \"type\" variable is undefined, then \"GET\" method will be used.\n\t\t\t// Make value of this field explicit since\n\t\t\t// user can override it through ajaxSetup method\n\t\t\ttype: type || \"GET\",\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t} ).done( function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery( \"<div>\" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t// If the request succeeds, this function gets \"data\", \"status\", \"jqXHR\"\n\t\t// but they are ignored because response was set above.\n\t\t// If it fails, this function gets \"jqXHR\", \"status\", \"error\"\n\t\t} ).always( callback && function( jqXHR, status ) {\n\t\t\tself.each( function() {\n\t\t\t\tcallback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t\t} );\n\t\t} );\n\t}\n\n\treturn this;\n};\n\n\n\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( [\n\t\"ajaxStart\",\n\t\"ajaxStop\",\n\t\"ajaxComplete\",\n\t\"ajaxError\",\n\t\"ajaxSuccess\",\n\t\"ajaxSend\"\n], function( i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n} );\n\n\n\n\njQuery.expr.pseudos.animated = function( elem ) {\n\treturn jQuery.grep( jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t} ).length;\n};\n\n\n\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf( \"auto\" ) > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( isFunction( options ) ) {\n\n\t\t\t// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n\t\t\toptions = options.call( elem, i, jQuery.extend( {}, curOffset ) );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend( {\n\n\t// offset() relates an element's border box to the document origin\n\toffset: function( options ) {\n\n\t\t// Preserve chaining for setter\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each( function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t} );\n\t\t}\n\n\t\tvar rect, win,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !elem ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Return zeros for disconnected and hidden (display: none) elements (gh-2310)\n\t\t// Support: IE <=11 only\n\t\t// Running getBoundingClientRect on a\n\t\t// disconnected node in IE throws an error\n\t\tif ( !elem.getClientRects().length ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\t// Get document-relative position by adding viewport scroll to viewport-relative gBCR\n\t\trect = elem.getBoundingClientRect();\n\t\twin = elem.ownerDocument.defaultView;\n\t\treturn {\n\t\t\ttop: rect.top + win.pageYOffset,\n\t\t\tleft: rect.left + win.pageXOffset\n\t\t};\n\t},\n\n\t// position() relates an element's margin box to its offset parent's padding box\n\t// This corresponds to the behavior of CSS absolute positioning\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset, doc,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// position:fixed elements are offset from the viewport, which itself always has zero offset\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\n\t\t\t// Assume position:fixed implies availability of getBoundingClientRect\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\t\t\toffset = this.offset();\n\n\t\t\t// Account for the *real* offset parent, which can be the document or its root element\n\t\t\t// when a statically positioned element is identified\n\t\t\tdoc = elem.ownerDocument;\n\t\t\toffsetParent = elem.offsetParent || doc.documentElement;\n\t\t\twhile ( offsetParent &&\n\t\t\t\t( offsetParent === doc.body || offsetParent === doc.documentElement ) &&\n\t\t\t\tjQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\n\t\t\t\toffsetParent = offsetParent.parentNode;\n\t\t\t}\n\t\t\tif ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {\n\n\t\t\t\t// Incorporate borders into its offset, since they are outside its content origin\n\t\t\t\tparentOffset = jQuery( offsetParent ).offset();\n\t\t\t\tparentOffset.top += jQuery.css( offsetParent, \"borderTopWidth\", true );\n\t\t\t\tparentOffset.left += jQuery.css( offsetParent, \"borderLeftWidth\", true );\n\t\t\t}\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\t// This method will return documentElement in the following cases:\n\t// 1) For the element inside the iframe without offsetParent, this method will return\n\t// documentElement of the parent window\n\t// 2) For the hidden or detached element\n\t// 3) For body or html element, i.e. in case of the html node - it will return itself\n\t//\n\t// but those exceptions were never presented as a real life use-cases\n\t// and might be considered as more preferable results.\n\t//\n\t// This logic, however, is not guaranteed and can change at any point in the future\n\toffsetParent: function() {\n\t\treturn this.map( function() {\n\t\t\tvar offsetParent = this.offsetParent;\n\n\t\t\twhile ( offsetParent && jQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || documentElement;\n\t\t} );\n\t}\n} );\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\n\t\t\t// Coalesce documents and windows\n\t\t\tvar win;\n\t\t\tif ( isWindow( elem ) ) {\n\t\t\t\twin = elem;\n\t\t\t} else if ( elem.nodeType === 9 ) {\n\t\t\t\twin = elem.defaultView;\n\t\t\t}\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : win.pageXOffset,\n\t\t\t\t\ttop ? val : win.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length );\n\t};\n} );\n\n// Support: Safari <=7 - 9.1, Chrome <=37 - 49\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n} );\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name },\n\t\tfunction( defaultExtra, funcName ) {\n\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( isWindow( elem ) ) {\n\n\t\t\t\t\t// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)\n\t\t\t\t\treturn funcName.indexOf( \"outer\" ) === 0 ?\n\t\t\t\t\t\telem[ \"inner\" + name ] :\n\t\t\t\t\t\telem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable );\n\t\t};\n\t} );\n} );\n\n\njQuery.each( ( \"blur focus focusin focusout resize scroll click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup contextmenu\" ).split( \" \" ),\n\tfunction( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n} );\n\njQuery.fn.extend( {\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n} );\n\n\n\n\njQuery.fn.extend( {\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ?\n\t\t\tthis.off( selector, \"**\" ) :\n\t\t\tthis.off( types, selector || \"**\", fn );\n\t}\n} );\n\n// Bind a function to a context, optionally partially applying any\n// arguments.\n// jQuery.proxy is deprecated to promote standards (specifically Function#bind)\n// However, it is not slated for removal any time soon\njQuery.proxy = function( fn, context ) {\n\tvar tmp, args, proxy;\n\n\tif ( typeof context === \"string\" ) {\n\t\ttmp = fn[ context ];\n\t\tcontext = fn;\n\t\tfn = tmp;\n\t}\n\n\t// Quick check to determine if target is callable, in the spec\n\t// this throws a TypeError, but we will just return undefined.\n\tif ( !isFunction( fn ) ) {\n\t\treturn undefined;\n\t}\n\n\t// Simulated bind\n\targs = slice.call( arguments, 2 );\n\tproxy = function() {\n\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t};\n\n\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\treturn proxy;\n};\n\njQuery.holdReady = function( hold ) {\n\tif ( hold ) {\n\t\tjQuery.readyWait++;\n\t} else {\n\t\tjQuery.ready( true );\n\t}\n};\njQuery.isArray = Array.isArray;\njQuery.parseJSON = JSON.parse;\njQuery.nodeName = nodeName;\njQuery.isFunction = isFunction;\njQuery.isWindow = isWindow;\njQuery.camelCase = camelCase;\njQuery.type = toType;\n\njQuery.now = Date.now;\n\njQuery.isNumeric = function( obj ) {\n\n\t// As of jQuery 3.0, isNumeric is limited to\n\t// strings and numbers (primitives or objects)\n\t// that can be coerced to finite numbers (gh-2662)\n\tvar type = jQuery.type( obj );\n\treturn ( type === \"number\" || type === \"string\" ) &&\n\n\t\t// parseFloat NaNs numeric-cast false positives (\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t!isNaN( obj - parseFloat( obj ) );\n};\n\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( \"jquery\", [], function() {\n\t\treturn jQuery;\n\t} );\n}\n\n\n\n\nvar\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\nif ( !noGlobal ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n} );\n","/*!\n * @overview Ember - JavaScript Application Framework\n * @copyright Copyright 2011-2018 Tilde Inc. and contributors\n * Portions Copyright 2006-2011 Strobe Inc.\n * Portions Copyright 2008-2011 Apple Inc. All rights reserved.\n * @license Licensed under MIT license\n * See https://raw.github.com/emberjs/ember.js/master/LICENSE\n * @version 3.0.0\n */\n","/*globals process */\nvar enifed, requireModule, Ember;\n\n// Used in ember-environment/lib/global.js\nmainContext = this; // eslint-disable-line no-undef\n\n(function() {\n function missingModule(name, referrerName) {\n if (referrerName) {\n throw new Error('Could not find module ' + name + ' required by: ' + referrerName);\n } else {\n throw new Error('Could not find module ' + name);\n }\n }\n\n function internalRequire(_name, referrerName) {\n var name = _name;\n var mod = registry[name];\n\n if (!mod) {\n name = name + '/index';\n mod = registry[name];\n }\n\n var exports = seen[name];\n\n if (exports !== undefined) {\n return exports;\n }\n\n exports = seen[name] = {};\n\n if (!mod) {\n missingModule(_name, referrerName);\n }\n\n var deps = mod.deps;\n var callback = mod.callback;\n var reified = new Array(deps.length);\n\n for (var i = 0; i < deps.length; i++) {\n if (deps[i] === 'exports') {\n reified[i] = exports;\n } else if (deps[i] === 'require') {\n reified[i] = requireModule;\n } else {\n reified[i] = internalRequire(deps[i], name);\n }\n }\n\n callback.apply(this, reified);\n\n return exports;\n }\n\n var isNode = typeof window === 'undefined' &&\n typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n if (!isNode) {\n Ember = this.Ember = this.Ember || {};\n }\n\n if (typeof Ember === 'undefined') { Ember = {}; }\n\n if (typeof Ember.__loader === 'undefined') {\n var registry = {};\n var seen = {};\n\n enifed = function(name, deps, callback) {\n var value = { };\n\n if (!callback) {\n value.deps = [];\n value.callback = deps;\n } else {\n value.deps = deps;\n value.callback = callback;\n }\n\n registry[name] = value;\n };\n\n requireModule = function(name) {\n return internalRequire(name, null);\n };\n\n // setup `require` module\n requireModule['default'] = requireModule;\n\n requireModule.has = function registryHas(moduleName) {\n return !!registry[moduleName] || !!registry[moduleName + '/index'];\n };\n\n requireModule._eak_seen = registry;\n\n Ember.__loader = {\n define: enifed,\n require: requireModule,\n registry: registry\n };\n } else {\n enifed = Ember.__loader.define;\n requireModule = Ember.__loader.require;\n }\n})();\n","enifed(\"@glimmer/node\", [\"exports\", \"@glimmer/runtime\"], function (exports, _runtime) {\n \"use strict\";\n\n exports.NodeDOMTreeConstruction = undefined;\n\n\n function _defaults(obj, defaults) {\n var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {\n var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {\n Object.defineProperty(obj, key, value);\n }\n }return obj;\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _possibleConstructorReturn(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n }\n\n function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass);\n }\n\n var NodeDOMTreeConstruction = function (_DOMTreeConstruction) {\n _inherits(NodeDOMTreeConstruction, _DOMTreeConstruction);\n\n function NodeDOMTreeConstruction(doc) {\n _classCallCheck(this, NodeDOMTreeConstruction);\n\n return _possibleConstructorReturn(this, _DOMTreeConstruction.call(this, doc));\n }\n // override to prevent usage of `this.document` until after the constructor\n\n\n NodeDOMTreeConstruction.prototype.setupUselessElement = function setupUselessElement() {};\n\n NodeDOMTreeConstruction.prototype.insertHTMLBefore = function insertHTMLBefore(parent, reference, html) {\n var prev = reference ? reference.previousSibling : parent.lastChild;\n var raw = this.document.createRawHTMLSection(html);\n parent.insertBefore(raw, reference);\n var first = prev ? prev.nextSibling : parent.firstChild;\n var last = reference ? reference.previousSibling : parent.lastChild;\n return new _runtime.ConcreteBounds(parent, first, last);\n };\n // override to avoid SVG detection/work when in node (this is not needed in SSR)\n\n\n NodeDOMTreeConstruction.prototype.createElement = function createElement(tag) {\n return this.document.createElement(tag);\n };\n // override to avoid namespace shenanigans when in node (this is not needed in SSR)\n\n\n NodeDOMTreeConstruction.prototype.setAttribute = function setAttribute(element, name, value) {\n element.setAttribute(name, value);\n };\n\n return NodeDOMTreeConstruction;\n }(_runtime.DOMTreeConstruction);\n\n exports.NodeDOMTreeConstruction = NodeDOMTreeConstruction;\n});","enifed(\"@glimmer/reference\", [\"exports\", \"@glimmer/util\"], function (exports, _util) {\n \"use strict\";\n\n exports.isModified = exports.ReferenceCache = exports.map = exports.CachedReference = exports.UpdatableTag = exports.CachedTag = exports.combine = exports.combineSlice = exports.combineTagged = exports.DirtyableTag = exports.CURRENT_TAG = exports.VOLATILE_TAG = exports.CONSTANT_TAG = exports.TagWrapper = exports.RevisionTag = exports.VOLATILE = exports.INITIAL = exports.CONSTANT = exports.IteratorSynchronizer = exports.ReferenceIterator = exports.IterationArtifacts = exports.referenceFromParts = exports.ListItem = exports.isConst = exports.ConstReference = undefined;\n\n\n function _defaults(obj, defaults) {\n var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {\n var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {\n Object.defineProperty(obj, key, value);\n }\n }return obj;\n }\n\n function _possibleConstructorReturn(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n }\n\n function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass);\n }\n\n function _classCallCheck$1(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n var CONSTANT = 0;\n var INITIAL = 1;\n var VOLATILE = NaN;\n var RevisionTag = function () {\n function RevisionTag() {\n _classCallCheck$1(this, RevisionTag);\n }\n\n RevisionTag.prototype.validate = function validate(snapshot) {\n return this.value() === snapshot;\n };\n\n return RevisionTag;\n }();\n RevisionTag.id = 0;\n var VALUE = [];\n var VALIDATE = [];\n var TagWrapper = function () {\n function TagWrapper(type, inner) {\n _classCallCheck$1(this, TagWrapper);\n\n this.type = type;\n this.inner = inner;\n }\n\n TagWrapper.prototype.value = function value() {\n var func = VALUE[this.type];\n return func(this.inner);\n };\n\n TagWrapper.prototype.validate = function validate(snapshot) {\n var func = VALIDATE[this.type];\n return func(this.inner, snapshot);\n };\n\n return TagWrapper;\n }();\n function register(Type) {\n var type = VALUE.length;\n VALUE.push(function (tag) {\n return tag.value();\n });\n VALIDATE.push(function (tag, snapshot) {\n return tag.validate(snapshot);\n });\n Type.id = type;\n }\n ///\n // CONSTANT: 0\n VALUE.push(function () {\n return CONSTANT;\n });\n VALIDATE.push(function (_tag, snapshot) {\n return snapshot === CONSTANT;\n });\n var CONSTANT_TAG = new TagWrapper(0, null);\n // VOLATILE: 1\n VALUE.push(function () {\n return VOLATILE;\n });\n VALIDATE.push(function (_tag, snapshot) {\n return snapshot === VOLATILE;\n });\n var VOLATILE_TAG = new TagWrapper(1, null);\n // CURRENT: 2\n VALUE.push(function () {\n return $REVISION;\n });\n VALIDATE.push(function (_tag, snapshot) {\n return snapshot === $REVISION;\n });\n var CURRENT_TAG = new TagWrapper(2, null);\n ///\n var $REVISION = INITIAL;\n var DirtyableTag = function (_RevisionTag) {\n _inherits(DirtyableTag, _RevisionTag);\n\n DirtyableTag.create = function create() {\n var revision = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : $REVISION;\n\n return new TagWrapper(this.id, new DirtyableTag(revision));\n };\n\n function DirtyableTag() {\n var revision = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : $REVISION;\n\n _classCallCheck$1(this, DirtyableTag);\n\n var _this = _possibleConstructorReturn(this, _RevisionTag.call(this));\n\n _this.revision = revision;\n return _this;\n }\n\n DirtyableTag.prototype.value = function value() {\n return this.revision;\n };\n\n DirtyableTag.prototype.dirty = function dirty() {\n this.revision = ++$REVISION;\n };\n\n return DirtyableTag;\n }(RevisionTag);\n register(DirtyableTag);\n function combineTagged(tagged) {\n var optimized = [];\n for (var i = 0, l = tagged.length; i < l; i++) {\n var tag = tagged[i].tag;\n if (tag === VOLATILE_TAG) return VOLATILE_TAG;\n if (tag === CONSTANT_TAG) continue;\n optimized.push(tag);\n }\n return _combine(optimized);\n }\n function combineSlice(slice) {\n var optimized = [];\n var node = slice.head();\n while (node !== null) {\n var tag = node.tag;\n if (tag === VOLATILE_TAG) return VOLATILE_TAG;\n if (tag !== CONSTANT_TAG) optimized.push(tag);\n node = slice.nextNode(node);\n }\n return _combine(optimized);\n }\n function combine(tags) {\n var optimized = [];\n for (var i = 0, l = tags.length; i < l; i++) {\n var tag = tags[i];\n if (tag === VOLATILE_TAG) return VOLATILE_TAG;\n if (tag === CONSTANT_TAG) continue;\n optimized.push(tag);\n }\n return _combine(optimized);\n }\n function _combine(tags) {\n switch (tags.length) {\n case 0:\n return CONSTANT_TAG;\n case 1:\n return tags[0];\n case 2:\n return TagsPair.create(tags[0], tags[1]);\n default:\n return TagsCombinator.create(tags);\n }\n }\n var CachedTag = function (_RevisionTag2) {\n _inherits(CachedTag, _RevisionTag2);\n\n function CachedTag() {\n _classCallCheck$1(this, CachedTag);\n\n var _this2 = _possibleConstructorReturn(this, _RevisionTag2.apply(this, arguments));\n\n _this2.lastChecked = null;\n _this2.lastValue = null;\n return _this2;\n }\n\n CachedTag.prototype.value = function value() {\n var lastChecked = this.lastChecked,\n lastValue = this.lastValue;\n\n if (lastChecked !== $REVISION) {\n this.lastChecked = $REVISION;\n this.lastValue = lastValue = this.compute();\n }\n return this.lastValue;\n };\n\n CachedTag.prototype.invalidate = function invalidate() {\n this.lastChecked = null;\n };\n\n return CachedTag;\n }(RevisionTag);\n\n var TagsPair = function (_CachedTag) {\n _inherits(TagsPair, _CachedTag);\n\n TagsPair.create = function create(first, second) {\n return new TagWrapper(this.id, new TagsPair(first, second));\n };\n\n function TagsPair(first, second) {\n _classCallCheck$1(this, TagsPair);\n\n var _this3 = _possibleConstructorReturn(this, _CachedTag.call(this));\n\n _this3.first = first;\n _this3.second = second;\n return _this3;\n }\n\n TagsPair.prototype.compute = function compute() {\n return Math.max(this.first.value(), this.second.value());\n };\n\n return TagsPair;\n }(CachedTag);\n\n register(TagsPair);\n\n var TagsCombinator = function (_CachedTag2) {\n _inherits(TagsCombinator, _CachedTag2);\n\n TagsCombinator.create = function create(tags) {\n return new TagWrapper(this.id, new TagsCombinator(tags));\n };\n\n function TagsCombinator(tags) {\n _classCallCheck$1(this, TagsCombinator);\n\n var _this4 = _possibleConstructorReturn(this, _CachedTag2.call(this));\n\n _this4.tags = tags;\n return _this4;\n }\n\n TagsCombinator.prototype.compute = function compute() {\n var tags = this.tags;\n\n var max = -1;\n for (var i = 0; i < tags.length; i++) {\n var value = tags[i].value();\n max = Math.max(value, max);\n }\n return max;\n };\n\n return TagsCombinator;\n }(CachedTag);\n\n register(TagsCombinator);\n var UpdatableTag = function (_CachedTag3) {\n _inherits(UpdatableTag, _CachedTag3);\n\n UpdatableTag.create = function create(tag) {\n return new TagWrapper(this.id, new UpdatableTag(tag));\n };\n\n function UpdatableTag(tag) {\n _classCallCheck$1(this, UpdatableTag);\n\n var _this5 = _possibleConstructorReturn(this, _CachedTag3.call(this));\n\n _this5.tag = tag;\n _this5.lastUpdated = INITIAL;\n return _this5;\n }\n\n UpdatableTag.prototype.compute = function compute() {\n return Math.max(this.lastUpdated, this.tag.value());\n };\n\n UpdatableTag.prototype.update = function update(tag) {\n if (tag !== this.tag) {\n this.tag = tag;\n this.lastUpdated = $REVISION;\n this.invalidate();\n }\n };\n\n return UpdatableTag;\n }(CachedTag);\n register(UpdatableTag);\n var CachedReference = function () {\n function CachedReference() {\n _classCallCheck$1(this, CachedReference);\n\n this.lastRevision = null;\n this.lastValue = null;\n }\n\n CachedReference.prototype.value = function value() {\n var tag = this.tag,\n lastRevision = this.lastRevision,\n lastValue = this.lastValue;\n\n if (!lastRevision || !tag.validate(lastRevision)) {\n lastValue = this.lastValue = this.compute();\n this.lastRevision = tag.value();\n }\n return lastValue;\n };\n\n CachedReference.prototype.invalidate = function invalidate() {\n this.lastRevision = null;\n };\n\n return CachedReference;\n }();\n\n var MapperReference = function (_CachedReference) {\n _inherits(MapperReference, _CachedReference);\n\n function MapperReference(reference, mapper) {\n _classCallCheck$1(this, MapperReference);\n\n var _this6 = _possibleConstructorReturn(this, _CachedReference.call(this));\n\n _this6.tag = reference.tag;\n _this6.reference = reference;\n _this6.mapper = mapper;\n return _this6;\n }\n\n MapperReference.prototype.compute = function compute() {\n var reference = this.reference,\n mapper = this.mapper;\n\n return mapper(reference.value());\n };\n\n return MapperReference;\n }(CachedReference);\n\n function map(reference, mapper) {\n return new MapperReference(reference, mapper);\n }\n //////////\n var ReferenceCache = function () {\n function ReferenceCache(reference) {\n _classCallCheck$1(this, ReferenceCache);\n\n this.lastValue = null;\n this.lastRevision = null;\n this.initialized = false;\n this.tag = reference.tag;\n this.reference = reference;\n }\n\n ReferenceCache.prototype.peek = function peek() {\n if (!this.initialized) {\n return this.initialize();\n }\n return this.lastValue;\n };\n\n ReferenceCache.prototype.revalidate = function revalidate() {\n if (!this.initialized) {\n return this.initialize();\n }\n var reference = this.reference,\n lastRevision = this.lastRevision;\n\n var tag = reference.tag;\n if (tag.validate(lastRevision)) return NOT_MODIFIED;\n this.lastRevision = tag.value();\n var lastValue = this.lastValue;\n\n var value = reference.value();\n if (value === lastValue) return NOT_MODIFIED;\n this.lastValue = value;\n return value;\n };\n\n ReferenceCache.prototype.initialize = function initialize() {\n var reference = this.reference;\n\n var value = this.lastValue = reference.value();\n this.lastRevision = reference.tag.value();\n this.initialized = true;\n return value;\n };\n\n return ReferenceCache;\n }();\n var NOT_MODIFIED = \"adb3b78e-3d22-4e4b-877a-6317c2c5c145\";\n function isModified(value) {\n return value !== NOT_MODIFIED;\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n var ConstReference = function () {\n function ConstReference(inner) {\n _classCallCheck(this, ConstReference);\n\n this.inner = inner;\n this.tag = CONSTANT_TAG;\n }\n\n ConstReference.prototype.value = function value() {\n return this.inner;\n };\n\n return ConstReference;\n }();\n function isConst(reference) {\n return reference.tag === CONSTANT_TAG;\n }\n\n function _defaults$1(obj, defaults) {\n var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {\n var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {\n Object.defineProperty(obj, key, value);\n }\n }return obj;\n }\n\n function _classCallCheck$2(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _possibleConstructorReturn$1(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n }\n\n function _inherits$1(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults$1(subClass, superClass);\n }\n\n var ListItem = function (_ListNode) {\n _inherits$1(ListItem, _ListNode);\n\n function ListItem(iterable, result) {\n _classCallCheck$2(this, ListItem);\n\n var _this = _possibleConstructorReturn$1(this, _ListNode.call(this, iterable.valueReferenceFor(result)));\n\n _this.retained = false;\n _this.seen = false;\n _this.key = result.key;\n _this.iterable = iterable;\n _this.memo = iterable.memoReferenceFor(result);\n return _this;\n }\n\n ListItem.prototype.update = function update(item) {\n this.retained = true;\n this.iterable.updateValueReference(this.value, item);\n this.iterable.updateMemoReference(this.memo, item);\n };\n\n ListItem.prototype.shouldRemove = function shouldRemove() {\n return !this.retained;\n };\n\n ListItem.prototype.reset = function reset() {\n this.retained = false;\n this.seen = false;\n };\n\n return ListItem;\n }(_util.ListNode);\n var IterationArtifacts = function () {\n function IterationArtifacts(iterable) {\n _classCallCheck$2(this, IterationArtifacts);\n\n this.map = (0, _util.dict)();\n this.list = new _util.LinkedList();\n this.tag = iterable.tag;\n this.iterable = iterable;\n }\n\n IterationArtifacts.prototype.isEmpty = function isEmpty() {\n var iterator = this.iterator = this.iterable.iterate();\n return iterator.isEmpty();\n };\n\n IterationArtifacts.prototype.iterate = function iterate() {\n var iterator = this.iterator || this.iterable.iterate();\n this.iterator = null;\n return iterator;\n };\n\n IterationArtifacts.prototype.has = function has(key) {\n return !!this.map[key];\n };\n\n IterationArtifacts.prototype.get = function get(key) {\n return this.map[key];\n };\n\n IterationArtifacts.prototype.wasSeen = function wasSeen(key) {\n var node = this.map[key];\n return node && node.seen;\n };\n\n IterationArtifacts.prototype.append = function append(item) {\n var map = this.map,\n list = this.list,\n iterable = this.iterable;\n\n var node = map[item.key] = new ListItem(iterable, item);\n list.append(node);\n return node;\n };\n\n IterationArtifacts.prototype.insertBefore = function insertBefore(item, reference) {\n var map = this.map,\n list = this.list,\n iterable = this.iterable;\n\n var node = map[item.key] = new ListItem(iterable, item);\n node.retained = true;\n list.insertBefore(node, reference);\n return node;\n };\n\n IterationArtifacts.prototype.move = function move(item, reference) {\n var list = this.list;\n\n item.retained = true;\n list.remove(item);\n list.insertBefore(item, reference);\n };\n\n IterationArtifacts.prototype.remove = function remove(item) {\n var list = this.list;\n\n list.remove(item);\n delete this.map[item.key];\n };\n\n IterationArtifacts.prototype.nextNode = function nextNode(item) {\n return this.list.nextNode(item);\n };\n\n IterationArtifacts.prototype.head = function head() {\n return this.list.head();\n };\n\n return IterationArtifacts;\n }();\n var ReferenceIterator = function () {\n // if anyone needs to construct this object with something other than\n // an iterable, let @wycats know.\n function ReferenceIterator(iterable) {\n _classCallCheck$2(this, ReferenceIterator);\n\n this.iterator = null;\n var artifacts = new IterationArtifacts(iterable);\n this.artifacts = artifacts;\n }\n\n ReferenceIterator.prototype.next = function next() {\n var artifacts = this.artifacts;\n\n var iterator = this.iterator = this.iterator || artifacts.iterate();\n var item = iterator.next();\n if (!item) return null;\n return artifacts.append(item);\n };\n\n return ReferenceIterator;\n }();\n var Phase;\n (function (Phase) {\n Phase[Phase[\"Append\"] = 0] = \"Append\";\n Phase[Phase[\"Prune\"] = 1] = \"Prune\";\n Phase[Phase[\"Done\"] = 2] = \"Done\";\n })(Phase || (Phase = {}));\n var IteratorSynchronizer = function () {\n function IteratorSynchronizer(_ref) {\n var target = _ref.target,\n artifacts = _ref.artifacts;\n\n _classCallCheck$2(this, IteratorSynchronizer);\n\n this.target = target;\n this.artifacts = artifacts;\n this.iterator = artifacts.iterate();\n this.current = artifacts.head();\n }\n\n IteratorSynchronizer.prototype.sync = function sync() {\n var phase = Phase.Append;\n while (true) {\n switch (phase) {\n case Phase.Append:\n phase = this.nextAppend();\n break;\n case Phase.Prune:\n phase = this.nextPrune();\n break;\n case Phase.Done:\n this.nextDone();\n return;\n }\n }\n };\n\n IteratorSynchronizer.prototype.advanceToKey = function advanceToKey(key) {\n var current = this.current,\n artifacts = this.artifacts;\n\n var seek = current;\n while (seek && seek.key !== key) {\n seek.seen = true;\n seek = artifacts.nextNode(seek);\n }\n this.current = seek && artifacts.nextNode(seek);\n };\n\n IteratorSynchronizer.prototype.nextAppend = function nextAppend() {\n var iterator = this.iterator,\n current = this.current,\n artifacts = this.artifacts;\n\n var item = iterator.next();\n if (item === null) {\n return this.startPrune();\n }\n var key = item.key;\n\n if (current && current.key === key) {\n this.nextRetain(item);\n } else if (artifacts.has(key)) {\n this.nextMove(item);\n } else {\n this.nextInsert(item);\n }\n return Phase.Append;\n };\n\n IteratorSynchronizer.prototype.nextRetain = function nextRetain(item) {\n var artifacts = this.artifacts,\n current = this.current;\n\n current = current;\n current.update(item);\n this.current = artifacts.nextNode(current);\n this.target.retain(item.key, current.value, current.memo);\n };\n\n IteratorSynchronizer.prototype.nextMove = function nextMove(item) {\n var current = this.current,\n artifacts = this.artifacts,\n target = this.target;\n var key = item.key;\n\n var found = artifacts.get(item.key);\n found.update(item);\n if (artifacts.wasSeen(item.key)) {\n artifacts.move(found, current);\n target.move(found.key, found.value, found.memo, current ? current.key : null);\n } else {\n this.advanceToKey(key);\n }\n };\n\n IteratorSynchronizer.prototype.nextInsert = function nextInsert(item) {\n var artifacts = this.artifacts,\n target = this.target,\n current = this.current;\n\n var node = artifacts.insertBefore(item, current);\n target.insert(node.key, node.value, node.memo, current ? current.key : null);\n };\n\n IteratorSynchronizer.prototype.startPrune = function startPrune() {\n this.current = this.artifacts.head();\n return Phase.Prune;\n };\n\n IteratorSynchronizer.prototype.nextPrune = function nextPrune() {\n var artifacts = this.artifacts,\n target = this.target,\n current = this.current;\n\n if (current === null) {\n return Phase.Done;\n }\n var node = current;\n this.current = artifacts.nextNode(node);\n if (node.shouldRemove()) {\n artifacts.remove(node);\n target.delete(node.key);\n } else {\n node.reset();\n }\n return Phase.Prune;\n };\n\n IteratorSynchronizer.prototype.nextDone = function nextDone() {\n this.target.done();\n };\n\n return IteratorSynchronizer;\n }();\n\n function referenceFromParts(root, parts) {\n var reference = root;\n for (var i = 0; i < parts.length; i++) {\n reference = reference.get(parts[i]);\n }\n return reference;\n }\n\n exports.ConstReference = ConstReference;\n exports.isConst = isConst;\n exports.ListItem = ListItem;\n exports.referenceFromParts = referenceFromParts;\n exports.IterationArtifacts = IterationArtifacts;\n exports.ReferenceIterator = ReferenceIterator;\n exports.IteratorSynchronizer = IteratorSynchronizer;\n exports.CONSTANT = CONSTANT;\n exports.INITIAL = INITIAL;\n exports.VOLATILE = VOLATILE;\n exports.RevisionTag = RevisionTag;\n exports.TagWrapper = TagWrapper;\n exports.CONSTANT_TAG = CONSTANT_TAG;\n exports.VOLATILE_TAG = VOLATILE_TAG;\n exports.CURRENT_TAG = CURRENT_TAG;\n exports.DirtyableTag = DirtyableTag;\n exports.combineTagged = combineTagged;\n exports.combineSlice = combineSlice;\n exports.combine = combine;\n exports.CachedTag = CachedTag;\n exports.UpdatableTag = UpdatableTag;\n exports.CachedReference = CachedReference;\n exports.map = map;\n exports.ReferenceCache = ReferenceCache;\n exports.isModified = isModified;\n});","enifed('@glimmer/runtime', ['exports', '@glimmer/util', '@glimmer/reference', '@glimmer/wire-format'], function (exports, _util, _reference2, _wireFormat) {\n 'use strict';\n\n exports.ConcreteBounds = exports.ElementStack = exports.insertHTMLBefore = exports.isWhitespace = exports.DOMTreeConstruction = exports.IDOMChanges = exports.DOMChanges = exports.isComponentDefinition = exports.ComponentDefinition = exports.PartialDefinition = exports.Environment = exports.Scope = exports.isSafeString = exports.RenderResult = exports.UpdatingVM = exports.compileExpression = exports.compileList = exports.InlineMacros = exports.BlockMacros = exports.getDynamicVar = exports.resetDebuggerCallback = exports.setDebuggerCallback = exports.normalizeTextValue = exports.debugSlice = exports.Register = exports.readDOMAttr = exports.defaultPropertyManagers = exports.defaultAttributeManagers = exports.defaultManagers = exports.INPUT_VALUE_PROPERTY_MANAGER = exports.PropertyManager = exports.AttributeManager = exports.IAttributeManager = exports.CompiledDynamicTemplate = exports.CompiledStaticTemplate = exports.compileLayout = exports.OpcodeBuilderDSL = exports.ConditionalReference = exports.PrimitiveReference = exports.UNDEFINED_REFERENCE = exports.NULL_REFERENCE = exports.templateFactory = exports.Simple = undefined;\n\n\n function _defaults(obj, defaults) {\n var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {\n var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {\n Object.defineProperty(obj, key, value);\n }\n }return obj;\n }\n\n function _possibleConstructorReturn(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n }\n\n function _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass);\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n /**\n * Registers\n *\n * For the most part, these follows MIPS naming conventions, however the\n * register numbers are different.\n */\n var Register;\n (function (Register) {\n // $0 or $pc (program counter): pointer into `program` for the next insturction; -1 means exit\n Register[Register[\"pc\"] = 0] = \"pc\";\n // $1 or $ra (return address): pointer into `program` for the return\n Register[Register[\"ra\"] = 1] = \"ra\";\n // $2 or $fp (frame pointer): pointer into the `evalStack` for the base of the stack\n Register[Register[\"fp\"] = 2] = \"fp\";\n // $3 or $sp (stack pointer): pointer into the `evalStack` for the top of the stack\n Register[Register[\"sp\"] = 3] = \"sp\";\n // $4-$5 or $s0-$s1 (saved): callee saved general-purpose registers\n Register[Register[\"s0\"] = 4] = \"s0\";\n Register[Register[\"s1\"] = 5] = \"s1\";\n // $6-$7 or $t0-$t1 (temporaries): caller saved general-purpose registers\n Register[Register[\"t0\"] = 6] = \"t0\";\n Register[Register[\"t1\"] = 7] = \"t1\";\n })(Register || (exports.Register = Register = {}));\n function debugSlice(env, start, end) {}\n var AppendOpcodes = function () {\n function AppendOpcodes() {\n _classCallCheck(this, AppendOpcodes);\n\n this.evaluateOpcode = (0, _util.fillNulls)(72 /* Size */).slice();\n }\n\n AppendOpcodes.prototype.add = function add(name, evaluate) {\n this.evaluateOpcode[name] = evaluate;\n };\n\n AppendOpcodes.prototype.evaluate = function evaluate(vm, opcode, type) {\n var func = this.evaluateOpcode[type];\n func(vm, opcode);\n };\n\n return AppendOpcodes;\n }();\n var APPEND_OPCODES = new AppendOpcodes();\n var AbstractOpcode = function () {\n function AbstractOpcode() {\n _classCallCheck(this, AbstractOpcode);\n\n (0, _util.initializeGuid)(this);\n }\n\n AbstractOpcode.prototype.toJSON = function toJSON() {\n return { guid: this._guid, type: this.type };\n };\n\n return AbstractOpcode;\n }();\n var UpdatingOpcode = function (_AbstractOpcode) {\n _inherits(UpdatingOpcode, _AbstractOpcode);\n\n function UpdatingOpcode() {\n _classCallCheck(this, UpdatingOpcode);\n\n var _this = _possibleConstructorReturn(this, _AbstractOpcode.apply(this, arguments));\n\n _this.next = null;\n _this.prev = null;\n return _this;\n }\n\n return UpdatingOpcode;\n }(AbstractOpcode);\n\n function _defaults$1(obj, defaults) {\n var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {\n var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {\n Object.defineProperty(obj, key, value);\n }\n }return obj;\n }\n\n function _classCallCheck$1(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _possibleConstructorReturn$1(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n }\n\n function _inherits$1(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults$1(subClass, superClass);\n }\n\n var PrimitiveReference = function (_ConstReference) {\n _inherits$1(PrimitiveReference, _ConstReference);\n\n function PrimitiveReference(value) {\n _classCallCheck$1(this, PrimitiveReference);\n\n return _possibleConstructorReturn$1(this, _ConstReference.call(this, value));\n }\n\n PrimitiveReference.create = function create(value) {\n if (value === undefined) {\n return UNDEFINED_REFERENCE;\n } else if (value === null) {\n return NULL_REFERENCE;\n } else if (value === true) {\n return TRUE_REFERENCE;\n } else if (value === false) {\n return FALSE_REFERENCE;\n } else if (typeof value === 'number') {\n return new ValueReference(value);\n } else {\n return new StringReference(value);\n }\n };\n\n PrimitiveReference.prototype.get = function get(_key) {\n return UNDEFINED_REFERENCE;\n };\n\n return PrimitiveReference;\n }(_reference2.ConstReference);\n\n var StringReference = function (_PrimitiveReference) {\n _inherits$1(StringReference, _PrimitiveReference);\n\n function StringReference() {\n _classCallCheck$1(this, StringReference);\n\n var _this2 = _possibleConstructorReturn$1(this, _PrimitiveReference.apply(this, arguments));\n\n _this2.lengthReference = null;\n return _this2;\n }\n\n StringReference.prototype.get = function get(key) {\n if (key === 'length') {\n var lengthReference = this.lengthReference;\n\n if (lengthReference === null) {\n lengthReference = this.lengthReference = new ValueReference(this.inner.length);\n }\n return lengthReference;\n } else {\n return _PrimitiveReference.prototype.get.call(this, key);\n }\n };\n\n return StringReference;\n }(PrimitiveReference);\n\n var ValueReference = function (_PrimitiveReference2) {\n _inherits$1(ValueReference, _PrimitiveReference2);\n\n function ValueReference(value) {\n _classCallCheck$1(this, ValueReference);\n\n return _possibleConstructorReturn$1(this, _PrimitiveReference2.call(this, value));\n }\n\n return ValueReference;\n }(PrimitiveReference);\n\n var UNDEFINED_REFERENCE = new ValueReference(undefined);\n var NULL_REFERENCE = new ValueReference(null);\n var TRUE_REFERENCE = new ValueReference(true);\n var FALSE_REFERENCE = new ValueReference(false);\n var ConditionalReference = function () {\n function ConditionalReference(inner) {\n _classCallCheck$1(this, ConditionalReference);\n\n this.inner = inner;\n this.tag = inner.tag;\n }\n\n ConditionalReference.prototype.value = function value() {\n return this.toBool(this.inner.value());\n };\n\n ConditionalReference.prototype.toBool = function toBool(value) {\n return !!value;\n };\n\n return ConditionalReference;\n }();\n\n function _defaults$2(obj, defaults) {\n var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {\n var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {\n Object.defineProperty(obj, key, value);\n }\n }return obj;\n }\n\n function _classCallCheck$2(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _possibleConstructorReturn$2(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n }\n\n function _inherits$2(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults$2(subClass, superClass);\n }\n\n var ConcatReference = function (_CachedReference) {\n _inherits$2(ConcatReference, _CachedReference);\n\n function ConcatReference(parts) {\n _classCallCheck$2(this, ConcatReference);\n\n var _this = _possibleConstructorReturn$2(this, _CachedReference.call(this));\n\n _this.parts = parts;\n _this.tag = (0, _reference2.combineTagged)(parts);\n return _this;\n }\n\n ConcatReference.prototype.compute = function compute() {\n var parts = new Array();\n for (var i = 0; i < this.parts.length; i++) {\n var value = this.parts[i].value();\n if (value !== null && value !== undefined) {\n parts[i] = castToString(value);\n }\n }\n if (parts.length > 0) {\n return parts.join('');\n }\n return null;\n };\n\n return ConcatReference;\n }(_reference2.CachedReference);\n function castToString(value) {\n if (typeof value.toString !== 'function') {\n return '';\n }\n return String(value);\n }\n\n APPEND_OPCODES.add(1 /* Helper */, function (vm, _ref) {\n var _helper = _ref.op1;\n\n var stack = vm.stack;\n var helper = vm.constants.getFunction(_helper);\n var args = stack.pop();\n var value = helper(vm, args);\n args.clear();\n vm.stack.push(value);\n });\n APPEND_OPCODES.add(2 /* Function */, function (vm, _ref2) {\n var _function = _ref2.op1;\n\n var func = vm.constants.getFunction(_function);\n vm.stack.push(func(vm));\n });\n APPEND_OPCODES.add(5 /* GetVariable */, function (vm, _ref3) {\n var symbol = _ref3.op1;\n\n var expr = vm.referenceForSymbol(symbol);\n vm.stack.push(expr);\n });\n APPEND_OPCODES.add(4 /* SetVariable */, function (vm, _ref4) {\n var symbol = _ref4.op1;\n\n var expr = vm.stack.pop();\n vm.scope().bindSymbol(symbol, expr);\n });\n APPEND_OPCODES.add(70 /* ResolveMaybeLocal */, function (vm, _ref5) {\n var _name = _ref5.op1;\n\n var name = vm.constants.getString(_name);\n var locals = vm.scope().getPartialMap();\n var ref = locals[name];\n if (ref === undefined) {\n ref = vm.getSelf().get(name);\n }\n vm.stack.push(ref);\n });\n APPEND_OPCODES.add(19 /* RootScope */, function (vm, _ref6) {\n var symbols = _ref6.op1,\n bindCallerScope = _ref6.op2;\n\n vm.pushRootScope(symbols, !!bindCallerScope);\n });\n APPEND_OPCODES.add(6 /* GetProperty */, function (vm, _ref7) {\n var _key = _ref7.op1;\n\n var key = vm.constants.getString(_key);\n var expr = vm.stack.pop();\n vm.stack.push(expr.get(key));\n });\n APPEND_OPCODES.add(7 /* PushBlock */, function (vm, _ref8) {\n var _block = _ref8.op1;\n\n var block = _block ? vm.constants.getBlock(_block) : null;\n vm.stack.push(block);\n });\n APPEND_OPCODES.add(8 /* GetBlock */, function (vm, _ref9) {\n var _block = _ref9.op1;\n\n vm.stack.push(vm.scope().getBlock(_block));\n });\n APPEND_OPCODES.add(9 /* HasBlock */, function (vm, _ref10) {\n var _block = _ref10.op1;\n\n var hasBlock = !!vm.scope().getBlock(_block);\n vm.stack.push(hasBlock ? TRUE_REFERENCE : FALSE_REFERENCE);\n });\n APPEND_OPCODES.add(10 /* HasBlockParams */, function (vm, _ref11) {\n var _block = _ref11.op1;\n\n var block = vm.scope().getBlock(_block);\n var hasBlockParams = block && block.symbolTable.parameters.length;\n vm.stack.push(hasBlockParams ? TRUE_REFERENCE : FALSE_REFERENCE);\n });\n APPEND_OPCODES.add(11 /* Concat */, function (vm, _ref12) {\n var count = _ref12.op1;\n\n var out = [];\n for (var i = count; i > 0; i--) {\n out.push(vm.stack.pop());\n }\n vm.stack.push(new ConcatReference(out.reverse()));\n });\n\n var _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n }();\n\n function _classCallCheck$4(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n var Arguments = function () {\n function Arguments() {\n _classCallCheck$4(this, Arguments);\n\n this.stack = null;\n this.positional = new PositionalArguments();\n this.named = new NamedArguments();\n }\n\n Arguments.prototype.empty = function empty() {\n this.setup(null, true);\n return this;\n };\n\n Arguments.prototype.setup = function setup(stack, synthetic) {\n this.stack = stack;\n var names = stack.fromTop(0);\n var namedCount = names.length;\n var positionalCount = stack.fromTop(namedCount + 1);\n var start = positionalCount + namedCount + 2;\n var positional = this.positional;\n positional.setup(stack, start, positionalCount);\n var named = this.named;\n named.setup(stack, namedCount, names, synthetic);\n };\n\n Arguments.prototype.at = function at(pos) {\n return this.positional.at(pos);\n };\n\n Arguments.prototype.get = function get(name) {\n return this.named.get(name);\n };\n\n Arguments.prototype.capture = function capture() {\n return {\n tag: this.tag,\n length: this.length,\n positional: this.positional.capture(),\n named: this.named.capture()\n };\n };\n\n Arguments.prototype.clear = function clear() {\n var stack = this.stack,\n length = this.length;\n\n stack.pop(length + 2);\n };\n\n _createClass(Arguments, [{\n key: 'tag',\n get: function () {\n return (0, _reference2.combineTagged)([this.positional, this.named]);\n }\n }, {\n key: 'length',\n get: function () {\n return this.positional.length + this.named.length;\n }\n }]);\n\n return Arguments;\n }();\n\n var PositionalArguments = function () {\n function PositionalArguments() {\n _classCallCheck$4(this, PositionalArguments);\n\n this.length = 0;\n this.stack = null;\n this.start = 0;\n this._tag = null;\n this._references = null;\n }\n\n PositionalArguments.prototype.setup = function setup(stack, start, length) {\n this.stack = stack;\n this.start = start;\n this.length = length;\n this._tag = null;\n this._references = null;\n };\n\n PositionalArguments.prototype.at = function at(position) {\n var start = this.start,\n length = this.length;\n\n if (position < 0 || position >= length) {\n return UNDEFINED_REFERENCE;\n }\n // stack: pos1, pos2, pos3, named1, named2\n // start: 4 (top - 4)\n //\n // at(0) === pos1 === top - start\n // at(1) === pos2 === top - (start - 1)\n // at(2) === pos3 === top - (start - 2)\n var fromTop = start - position - 1;\n return this.stack.fromTop(fromTop);\n };\n\n PositionalArguments.prototype.capture = function capture() {\n return new CapturedPositionalArguments(this.tag, this.references);\n };\n\n _createClass(PositionalArguments, [{\n key: 'tag',\n get: function () {\n var tag = this._tag;\n if (!tag) {\n tag = this._tag = (0, _reference2.combineTagged)(this.references);\n }\n return tag;\n }\n }, {\n key: 'references',\n get: function () {\n var references = this._references;\n if (!references) {\n var length = this.length;\n\n references = this._references = new Array(length);\n for (var i = 0; i < length; i++) {\n references[i] = this.at(i);\n }\n }\n return references;\n }\n }]);\n\n return PositionalArguments;\n }();\n\n var CapturedPositionalArguments = function () {\n function CapturedPositionalArguments(tag, references) {\n var length = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : references.length;\n\n _classCallCheck$4(this, CapturedPositionalArguments);\n\n this.tag = tag;\n this.references = references;\n this.length = length;\n }\n\n CapturedPositionalArguments.prototype.at = function at(position) {\n return this.references[position];\n };\n\n CapturedPositionalArguments.prototype.value = function value() {\n return this.references.map(this.valueOf);\n };\n\n CapturedPositionalArguments.prototype.get = function get(name) {\n var references = this.references,\n length = this.length;\n\n if (name === 'length') {\n return PrimitiveReference.create(length);\n } else {\n var idx = parseInt(name, 10);\n if (idx < 0 || idx >= length) {\n return UNDEFINED_REFERENCE;\n } else {\n return references[idx];\n }\n }\n };\n\n CapturedPositionalArguments.prototype.valueOf = function valueOf(reference$$1) {\n return reference$$1.value();\n };\n\n return CapturedPositionalArguments;\n }();\n\n var NamedArguments = function () {\n function NamedArguments() {\n _classCallCheck$4(this, NamedArguments);\n\n this.length = 0;\n this._tag = null;\n this._references = null;\n this._names = null;\n this._realNames = _util.EMPTY_ARRAY;\n }\n\n NamedArguments.prototype.setup = function setup(stack, length, names, synthetic) {\n this.stack = stack;\n this.length = length;\n this._tag = null;\n this._references = null;\n if (synthetic) {\n this._names = names;\n this._realNames = _util.EMPTY_ARRAY;\n } else {\n this._names = null;\n this._realNames = names;\n }\n };\n\n NamedArguments.prototype.has = function has(name) {\n return this.names.indexOf(name) !== -1;\n };\n\n NamedArguments.prototype.get = function get(name) {\n var names = this.names,\n length = this.length;\n\n var idx = names.indexOf(name);\n if (idx === -1) {\n return UNDEFINED_REFERENCE;\n }\n // stack: pos1, pos2, pos3, named1, named2\n // start: 4 (top - 4)\n // namedDict: { named1: 1, named2: 0 };\n //\n // get('named1') === named1 === top - (start - 1)\n // get('named2') === named2 === top - start\n var fromTop = length - idx;\n return this.stack.fromTop(fromTop);\n };\n\n NamedArguments.prototype.capture = function capture() {\n return new CapturedNamedArguments(this.tag, this.names, this.references);\n };\n\n NamedArguments.prototype.sliceName = function sliceName(name) {\n return name.slice(1);\n };\n\n _createClass(NamedArguments, [{\n key: 'tag',\n get: function () {\n return (0, _reference2.combineTagged)(this.references);\n }\n }, {\n key: 'names',\n get: function () {\n var names = this._names;\n if (!names) {\n names = this._names = this._realNames.map(this.sliceName);\n }\n return names;\n }\n }, {\n key: 'references',\n get: function () {\n var references = this._references;\n if (!references) {\n var names = this.names,\n length = this.length;\n\n references = this._references = [];\n for (var i = 0; i < length; i++) {\n references[i] = this.get(names[i]);\n }\n }\n return references;\n }\n }]);\n\n return NamedArguments;\n }();\n\n var CapturedNamedArguments = function () {\n function CapturedNamedArguments(tag, names, references) {\n _classCallCheck$4(this, CapturedNamedArguments);\n\n this.tag = tag;\n this.names = names;\n this.references = references;\n this.length = names.length;\n this._map = null;\n }\n\n CapturedNamedArguments.prototype.has = function has(name) {\n return this.names.indexOf(name) !== -1;\n };\n\n CapturedNamedArguments.prototype.get = function get(name) {\n var names = this.names,\n references = this.references;\n\n var idx = names.indexOf(name);\n if (idx === -1) {\n return UNDEFINED_REFERENCE;\n } else {\n return references[idx];\n }\n };\n\n CapturedNamedArguments.prototype.value = function value() {\n var names = this.names,\n references = this.references;\n\n var out = (0, _util.dict)();\n for (var i = 0; i < names.length; i++) {\n var name = names[i];\n out[name] = references[i].value();\n }\n return out;\n };\n\n _createClass(CapturedNamedArguments, [{\n key: 'map',\n get: function () {\n var map$$1 = this._map;\n if (!map$$1) {\n var names = this.names,\n references = this.references;\n\n map$$1 = this._map = (0, _util.dict)();\n for (var i = 0; i < names.length; i++) {\n var name = names[i];\n map$$1[name] = references[i];\n }\n }\n return map$$1;\n }\n }]);\n\n return CapturedNamedArguments;\n }();\n\n var ARGS = new Arguments();\n\n function _defaults$5(obj, defaults) {\n var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {\n var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {\n Object.defineProperty(obj, key, value);\n }\n }return obj;\n }\n\n function _classCallCheck$6(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _possibleConstructorReturn$5(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n }\n\n function _inherits$5(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults$5(subClass, superClass);\n }\n\n APPEND_OPCODES.add(20 /* ChildScope */, function (vm) {\n return vm.pushChildScope();\n });\n APPEND_OPCODES.add(21 /* PopScope */, function (vm) {\n return vm.popScope();\n });\n APPEND_OPCODES.add(39 /* PushDynamicScope */, function (vm) {\n return vm.pushDynamicScope();\n });\n APPEND_OPCODES.add(40 /* PopDynamicScope */, function (vm) {\n return vm.popDynamicScope();\n });\n APPEND_OPCODES.add(12 /* Immediate */, function (vm, _ref) {\n var number = _ref.op1;\n\n vm.stack.push(number);\n });\n APPEND_OPCODES.add(13 /* Constant */, function (vm, _ref2) {\n var other = _ref2.op1;\n\n vm.stack.push(vm.constants.getOther(other));\n });\n APPEND_OPCODES.add(14 /* PrimitiveReference */, function (vm, _ref3) {\n var primitive = _ref3.op1;\n\n var stack = vm.stack;\n var flag = (primitive & 3 << 30) >>> 30;\n var value = primitive & ~(3 << 30);\n switch (flag) {\n case 0:\n stack.push(PrimitiveReference.create(value));\n break;\n case 1:\n stack.push(PrimitiveReference.create(vm.constants.getFloat(value)));\n break;\n case 2:\n stack.push(PrimitiveReference.create(vm.constants.getString(value)));\n break;\n case 3:\n switch (value) {\n case 0:\n stack.push(FALSE_REFERENCE);\n break;\n case 1:\n stack.push(TRUE_REFERENCE);\n break;\n case 2:\n stack.push(NULL_REFERENCE);\n break;\n case 3:\n stack.push(UNDEFINED_REFERENCE);\n break;\n }\n break;\n }\n });\n APPEND_OPCODES.add(15 /* Dup */, function (vm, _ref4) {\n var register = _ref4.op1,\n offset = _ref4.op2;\n\n var position = vm.fetchValue(register) - offset;\n vm.stack.dup(position);\n });\n APPEND_OPCODES.add(16 /* Pop */, function (vm, _ref5) {\n var count = _ref5.op1;\n return vm.stack.pop(count);\n });\n APPEND_OPCODES.add(17 /* Load */, function (vm, _ref6) {\n var register = _ref6.op1;\n return vm.load(register);\n });\n APPEND_OPCODES.add(18 /* Fetch */, function (vm, _ref7) {\n var register = _ref7.op1;\n return vm.fetch(register);\n });\n APPEND_OPCODES.add(38 /* BindDynamicScope */, function (vm, _ref8) {\n var _names = _ref8.op1;\n\n var names = vm.constants.getArray(_names);\n vm.bindDynamicScope(names);\n });\n APPEND_OPCODES.add(47 /* PushFrame */, function (vm) {\n return vm.pushFrame();\n });\n APPEND_OPCODES.add(48 /* PopFrame */, function (vm) {\n return vm.popFrame();\n });\n APPEND_OPCODES.add(49 /* Enter */, function (vm, _ref9) {\n var args = _ref9.op1;\n return vm.enter(args);\n });\n APPEND_OPCODES.add(50 /* Exit */, function (vm) {\n return vm.exit();\n });\n APPEND_OPCODES.add(41 /* CompileDynamicBlock */, function (vm) {\n var stack = vm.stack;\n var block = stack.pop();\n stack.push(block ? block.compileDynamic(vm.env) : null);\n });\n APPEND_OPCODES.add(42 /* InvokeStatic */, function (vm, _ref10) {\n var _block = _ref10.op1;\n\n var block = vm.constants.getBlock(_block);\n var compiled = block.compileStatic(vm.env);\n vm.call(compiled.handle);\n });\n APPEND_OPCODES.add(43 /* InvokeDynamic */, function (vm, _ref11) {\n var _invoker = _ref11.op1;\n\n var invoker = vm.constants.getOther(_invoker);\n var block = vm.stack.pop();\n invoker.invoke(vm, block);\n });\n APPEND_OPCODES.add(44 /* Jump */, function (vm, _ref12) {\n var target = _ref12.op1;\n return vm.goto(target);\n });\n APPEND_OPCODES.add(45 /* JumpIf */, function (vm, _ref13) {\n var target = _ref13.op1;\n\n var reference$$1 = vm.stack.pop();\n if ((0, _reference2.isConst)(reference$$1)) {\n if (reference$$1.value()) {\n vm.goto(target);\n }\n } else {\n var cache = new _reference2.ReferenceCache(reference$$1);\n if (cache.peek()) {\n vm.goto(target);\n }\n vm.updateWith(new Assert(cache));\n }\n });\n APPEND_OPCODES.add(46 /* JumpUnless */, function (vm, _ref14) {\n var target = _ref14.op1;\n\n var reference$$1 = vm.stack.pop();\n if ((0, _reference2.isConst)(reference$$1)) {\n if (!reference$$1.value()) {\n vm.goto(target);\n }\n } else {\n var cache = new _reference2.ReferenceCache(reference$$1);\n if (!cache.peek()) {\n vm.goto(target);\n }\n vm.updateWith(new Assert(cache));\n }\n });\n APPEND_OPCODES.add(22 /* Return */, function (vm) {\n return vm.return();\n });\n APPEND_OPCODES.add(23 /* ReturnTo */, function (vm, _ref15) {\n var relative = _ref15.op1;\n\n vm.returnTo(relative);\n });\n var ConstTest = function (ref, _env) {\n return new _reference2.ConstReference(!!ref.value());\n };\n var SimpleTest = function (ref, _env) {\n return ref;\n };\n var EnvironmentTest = function (ref, env) {\n return env.toConditionalReference(ref);\n };\n APPEND_OPCODES.add(51 /* Test */, function (vm, _ref16) {\n var _func = _ref16.op1;\n\n var stack = vm.stack;\n var operand = stack.pop();\n var func = vm.constants.getFunction(_func);\n stack.push(func(operand, vm.env));\n });\n var Assert = function (_UpdatingOpcode) {\n _inherits$5(Assert, _UpdatingOpcode);\n\n function Assert(cache) {\n _classCallCheck$6(this, Assert);\n\n var _this = _possibleConstructorReturn$5(this, _UpdatingOpcode.call(this));\n\n _this.type = 'assert';\n _this.tag = cache.tag;\n _this.cache = cache;\n return _this;\n }\n\n Assert.prototype.evaluate = function evaluate(vm) {\n var cache = this.cache;\n\n if ((0, _reference2.isModified)(cache.revalidate())) {\n vm.throw();\n }\n };\n\n Assert.prototype.toJSON = function toJSON() {\n var type = this.type,\n _guid = this._guid,\n cache = this.cache;\n\n var expected = void 0;\n try {\n expected = JSON.stringify(cache.peek());\n } catch (e) {\n expected = String(cache.peek());\n }\n return {\n args: [],\n details: { expected: expected },\n guid: _guid,\n type: type\n };\n };\n\n return Assert;\n }(UpdatingOpcode);\n var JumpIfNotModifiedOpcode = function (_UpdatingOpcode2) {\n _inherits$5(JumpIfNotModifiedOpcode, _UpdatingOpcode2);\n\n function JumpIfNotModifiedOpcode(tag, target) {\n _classCallCheck$6(this, JumpIfNotModifiedOpcode);\n\n var _this2 = _possibleConstructorReturn$5(this, _UpdatingOpcode2.call(this));\n\n _this2.target = target;\n _this2.type = 'jump-if-not-modified';\n _this2.tag = tag;\n _this2.lastRevision = tag.value();\n return _this2;\n }\n\n JumpIfNotModifiedOpcode.prototype.evaluate = function evaluate(vm) {\n var tag = this.tag,\n target = this.target,\n lastRevision = this.lastRevision;\n\n if (!vm.alwaysRevalidate && tag.validate(lastRevision)) {\n vm.goto(target);\n }\n };\n\n JumpIfNotModifiedOpcode.prototype.didModify = function didModify() {\n this.lastRevision = this.tag.value();\n };\n\n JumpIfNotModifiedOpcode.prototype.toJSON = function toJSON() {\n return {\n args: [JSON.stringify(this.target.inspect())],\n guid: this._guid,\n type: this.type\n };\n };\n\n return JumpIfNotModifiedOpcode;\n }(UpdatingOpcode);\n var DidModifyOpcode = function (_UpdatingOpcode3) {\n _inherits$5(DidModifyOpcode, _UpdatingOpcode3);\n\n function DidModifyOpcode(target) {\n _classCallCheck$6(this, DidModifyOpcode);\n\n var _this3 = _possibleConstructorReturn$5(this, _UpdatingOpcode3.call(this));\n\n _this3.target = target;\n _this3.type = 'did-modify';\n _this3.tag = _reference2.CONSTANT_TAG;\n return _this3;\n }\n\n DidModifyOpcode.prototype.evaluate = function evaluate() {\n this.target.didModify();\n };\n\n return DidModifyOpcode;\n }(UpdatingOpcode);\n var LabelOpcode = function () {\n function LabelOpcode(label) {\n _classCallCheck$6(this, LabelOpcode);\n\n this.tag = _reference2.CONSTANT_TAG;\n this.type = 'label';\n this.label = null;\n this.prev = null;\n this.next = null;\n (0, _util.initializeGuid)(this);\n this.label = label;\n }\n\n LabelOpcode.prototype.evaluate = function evaluate() {};\n\n LabelOpcode.prototype.inspect = function inspect$$1() {\n return this.label + ' [' + this._guid + ']';\n };\n\n LabelOpcode.prototype.toJSON = function toJSON() {\n return {\n args: [JSON.stringify(this.inspect())],\n guid: this._guid,\n type: this.type\n };\n };\n\n return LabelOpcode;\n }();\n\n function _defaults$4(obj, defaults) {\n var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {\n var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {\n Object.defineProperty(obj, key, value);\n }\n }return obj;\n }\n\n function _possibleConstructorReturn$4(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n }\n\n function _inherits$4(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults$4(subClass, superClass);\n }\n\n function _classCallCheck$5(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n APPEND_OPCODES.add(24 /* Text */, function (vm, _ref) {\n var text = _ref.op1;\n\n vm.elements().appendText(vm.constants.getString(text));\n });\n APPEND_OPCODES.add(25 /* Comment */, function (vm, _ref2) {\n var text = _ref2.op1;\n\n vm.elements().appendComment(vm.constants.getString(text));\n });\n APPEND_OPCODES.add(27 /* OpenElement */, function (vm, _ref3) {\n var tag = _ref3.op1;\n\n vm.elements().openElement(vm.constants.getString(tag));\n });\n APPEND_OPCODES.add(28 /* OpenElementWithOperations */, function (vm, _ref4) {\n var tag = _ref4.op1;\n\n var tagName = vm.constants.getString(tag);\n var operations = vm.stack.pop();\n vm.elements().openElement(tagName, operations);\n });\n APPEND_OPCODES.add(29 /* OpenDynamicElement */, function (vm) {\n var operations = vm.stack.pop();\n var tagName = vm.stack.pop().value();\n vm.elements().openElement(tagName, operations);\n });\n APPEND_OPCODES.add(36 /* PushRemoteElement */, function (vm) {\n var elementRef = vm.stack.pop();\n var nextSiblingRef = vm.stack.pop();\n var element = void 0;\n var nextSibling = void 0;\n if ((0, _reference2.isConst)(elementRef)) {\n element = elementRef.value();\n } else {\n var cache = new _reference2.ReferenceCache(elementRef);\n element = cache.peek();\n vm.updateWith(new Assert(cache));\n }\n if ((0, _reference2.isConst)(nextSiblingRef)) {\n nextSibling = nextSiblingRef.value();\n } else {\n var _cache = new _reference2.ReferenceCache(nextSiblingRef);\n nextSibling = _cache.peek();\n vm.updateWith(new Assert(_cache));\n }\n vm.elements().pushRemoteElement(element, nextSibling);\n });\n APPEND_OPCODES.add(37 /* PopRemoteElement */, function (vm) {\n return vm.elements().popRemoteElement();\n });\n\n var ClassList = function () {\n function ClassList() {\n _classCallCheck$5(this, ClassList);\n\n this.list = null;\n this.isConst = true;\n }\n\n ClassList.prototype.append = function append(reference$$1) {\n var list = this.list,\n isConst$$1 = this.isConst;\n\n if (list === null) list = this.list = [];\n list.push(reference$$1);\n this.isConst = isConst$$1 && (0, _reference2.isConst)(reference$$1);\n };\n\n ClassList.prototype.toReference = function toReference() {\n var list = this.list,\n isConst$$1 = this.isConst;\n\n if (!list) return NULL_REFERENCE;\n if (isConst$$1) return PrimitiveReference.create(toClassName(list));\n return new ClassListReference(list);\n };\n\n return ClassList;\n }();\n\n var ClassListReference = function (_CachedReference) {\n _inherits$4(ClassListReference, _CachedReference);\n\n function ClassListReference(list) {\n _classCallCheck$5(this, ClassListReference);\n\n var _this = _possibleConstructorReturn$4(this, _CachedReference.call(this));\n\n _this.list = [];\n _this.tag = (0, _reference2.combineTagged)(list);\n _this.list = list;\n return _this;\n }\n\n ClassListReference.prototype.compute = function compute() {\n return toClassName(this.list);\n };\n\n return ClassListReference;\n }(_reference2.CachedReference);\n\n function toClassName(list) {\n var ret = [];\n for (var i = 0; i < list.length; i++) {\n var value = list[i].value();\n if (value !== false && value !== null && value !== undefined) ret.push(value);\n }\n return ret.length === 0 ? null : ret.join(' ');\n }\n var SimpleElementOperations = function () {\n function SimpleElementOperations(env) {\n _classCallCheck$5(this, SimpleElementOperations);\n\n this.env = env;\n this.opcodes = null;\n this.classList = null;\n }\n\n SimpleElementOperations.prototype.addStaticAttribute = function addStaticAttribute(element, name, value) {\n if (name === 'class') {\n this.addClass(PrimitiveReference.create(value));\n } else {\n this.env.getAppendOperations().setAttribute(element, name, value);\n }\n };\n\n SimpleElementOperations.prototype.addStaticAttributeNS = function addStaticAttributeNS(element, namespace, name, value) {\n this.env.getAppendOperations().setAttribute(element, name, value, namespace);\n };\n\n SimpleElementOperations.prototype.addDynamicAttribute = function addDynamicAttribute(element, name, reference$$1, isTrusting) {\n if (name === 'class') {\n this.addClass(reference$$1);\n } else {\n var attributeManager = this.env.attributeFor(element, name, isTrusting);\n var attribute = new DynamicAttribute(element, attributeManager, name, reference$$1);\n this.addAttribute(attribute);\n }\n };\n\n SimpleElementOperations.prototype.addDynamicAttributeNS = function addDynamicAttributeNS(element, namespace, name, reference$$1, isTrusting) {\n var attributeManager = this.env.attributeFor(element, name, isTrusting, namespace);\n var nsAttribute = new DynamicAttribute(element, attributeManager, name, reference$$1, namespace);\n this.addAttribute(nsAttribute);\n };\n\n SimpleElementOperations.prototype.flush = function flush(element, vm) {\n var env = vm.env;\n var opcodes = this.opcodes,\n classList = this.classList;\n\n for (var i = 0; opcodes && i < opcodes.length; i++) {\n vm.updateWith(opcodes[i]);\n }\n if (classList) {\n var attributeManager = env.attributeFor(element, 'class', false);\n var attribute = new DynamicAttribute(element, attributeManager, 'class', classList.toReference());\n var opcode = attribute.flush(env);\n if (opcode) {\n vm.updateWith(opcode);\n }\n }\n this.opcodes = null;\n this.classList = null;\n };\n\n SimpleElementOperations.prototype.addClass = function addClass(reference$$1) {\n var classList = this.classList;\n\n if (!classList) {\n classList = this.classList = new ClassList();\n }\n classList.append(reference$$1);\n };\n\n SimpleElementOperations.prototype.addAttribute = function addAttribute(attribute) {\n var opcode = attribute.flush(this.env);\n if (opcode) {\n var opcodes = this.opcodes;\n\n if (!opcodes) {\n opcodes = this.opcodes = [];\n }\n opcodes.push(opcode);\n }\n };\n\n return SimpleElementOperations;\n }();\n var ComponentElementOperations = function () {\n function ComponentElementOperations(env) {\n _classCallCheck$5(this, ComponentElementOperations);\n\n this.env = env;\n this.attributeNames = null;\n this.attributes = null;\n this.classList = null;\n }\n\n ComponentElementOperations.prototype.addStaticAttribute = function addStaticAttribute(element, name, value) {\n if (name === 'class') {\n this.addClass(PrimitiveReference.create(value));\n } else if (this.shouldAddAttribute(name)) {\n this.addAttribute(name, new StaticAttribute(element, name, value));\n }\n };\n\n ComponentElementOperations.prototype.addStaticAttributeNS = function addStaticAttributeNS(element, namespace, name, value) {\n if (this.shouldAddAttribute(name)) {\n this.addAttribute(name, new StaticAttribute(element, name, value, namespace));\n }\n };\n\n ComponentElementOperations.prototype.addDynamicAttribute = function addDynamicAttribute(element, name, reference$$1, isTrusting) {\n if (name === 'class') {\n this.addClass(reference$$1);\n } else if (this.shouldAddAttribute(name)) {\n var attributeManager = this.env.attributeFor(element, name, isTrusting);\n var attribute = new DynamicAttribute(element, attributeManager, name, reference$$1);\n this.addAttribute(name, attribute);\n }\n };\n\n ComponentElementOperations.prototype.addDynamicAttributeNS = function addDynamicAttributeNS(element, namespace, name, reference$$1, isTrusting) {\n if (this.shouldAddAttribute(name)) {\n var attributeManager = this.env.attributeFor(element, name, isTrusting, namespace);\n var nsAttribute = new DynamicAttribute(element, attributeManager, name, reference$$1, namespace);\n this.addAttribute(name, nsAttribute);\n }\n };\n\n ComponentElementOperations.prototype.flush = function flush(element, vm) {\n var env = this.env;\n var attributes = this.attributes,\n classList = this.classList;\n\n for (var i = 0; attributes && i < attributes.length; i++) {\n var opcode = attributes[i].flush(env);\n if (opcode) {\n vm.updateWith(opcode);\n }\n }\n if (classList) {\n var attributeManager = env.attributeFor(element, 'class', false);\n var attribute = new DynamicAttribute(element, attributeManager, 'class', classList.toReference());\n var _opcode = attribute.flush(env);\n if (_opcode) {\n vm.updateWith(_opcode);\n }\n }\n };\n\n ComponentElementOperations.prototype.shouldAddAttribute = function shouldAddAttribute(name) {\n return !this.attributeNames || this.attributeNames.indexOf(name) === -1;\n };\n\n ComponentElementOperations.prototype.addClass = function addClass(reference$$1) {\n var classList = this.classList;\n\n if (!classList) {\n classList = this.classList = new ClassList();\n }\n classList.append(reference$$1);\n };\n\n ComponentElementOperations.prototype.addAttribute = function addAttribute(name, attribute) {\n var attributeNames = this.attributeNames,\n attributes = this.attributes;\n\n if (!attributeNames) {\n attributeNames = this.attributeNames = [];\n attributes = this.attributes = [];\n }\n attributeNames.push(name);\n attributes.push(attribute);\n };\n\n return ComponentElementOperations;\n }();\n APPEND_OPCODES.add(33 /* FlushElement */, function (vm) {\n var stack = vm.elements();\n var action = 'FlushElementOpcode#evaluate';\n stack.expectOperations(action).flush(stack.expectConstructing(action), vm);\n stack.flushElement();\n });\n APPEND_OPCODES.add(34 /* CloseElement */, function (vm) {\n return vm.elements().closeElement();\n });\n APPEND_OPCODES.add(30 /* StaticAttr */, function (vm, _ref5) {\n var _name = _ref5.op1,\n _value = _ref5.op2,\n _namespace = _ref5.op3;\n\n var name = vm.constants.getString(_name);\n var value = vm.constants.getString(_value);\n if (_namespace) {\n var namespace = vm.constants.getString(_namespace);\n vm.elements().setStaticAttributeNS(namespace, name, value);\n } else {\n vm.elements().setStaticAttribute(name, value);\n }\n });\n APPEND_OPCODES.add(35 /* Modifier */, function (vm, _ref6) {\n var _manager = _ref6.op1;\n\n var manager = vm.constants.getOther(_manager);\n var stack = vm.stack;\n var args = stack.pop();\n var tag = args.tag;\n\n var _vm$elements = vm.elements(),\n element = _vm$elements.constructing,\n updateOperations = _vm$elements.updateOperations;\n\n var dynamicScope = vm.dynamicScope();\n var modifier = manager.create(element, args, dynamicScope, updateOperations);\n args.clear();\n vm.env.scheduleInstallModifier(modifier, manager);\n var destructor = manager.getDestructor(modifier);\n if (destructor) {\n vm.newDestroyable(destructor);\n }\n vm.updateWith(new UpdateModifierOpcode(tag, manager, modifier));\n });\n var UpdateModifierOpcode = function (_UpdatingOpcode) {\n _inherits$4(UpdateModifierOpcode, _UpdatingOpcode);\n\n function UpdateModifierOpcode(tag, manager, modifier) {\n _classCallCheck$5(this, UpdateModifierOpcode);\n\n var _this2 = _possibleConstructorReturn$4(this, _UpdatingOpcode.call(this));\n\n _this2.tag = tag;\n _this2.manager = manager;\n _this2.modifier = modifier;\n _this2.type = 'update-modifier';\n _this2.lastUpdated = tag.value();\n return _this2;\n }\n\n UpdateModifierOpcode.prototype.evaluate = function evaluate(vm) {\n var manager = this.manager,\n modifier = this.modifier,\n tag = this.tag,\n lastUpdated = this.lastUpdated;\n\n if (!tag.validate(lastUpdated)) {\n vm.env.scheduleUpdateModifier(modifier, manager);\n this.lastUpdated = tag.value();\n }\n };\n\n UpdateModifierOpcode.prototype.toJSON = function toJSON() {\n return {\n guid: this._guid,\n type: this.type\n };\n };\n\n return UpdateModifierOpcode;\n }(UpdatingOpcode);\n var StaticAttribute = function () {\n function StaticAttribute(element, name, value, namespace) {\n _classCallCheck$5(this, StaticAttribute);\n\n this.element = element;\n this.name = name;\n this.value = value;\n this.namespace = namespace;\n }\n\n StaticAttribute.prototype.flush = function flush(env) {\n env.getAppendOperations().setAttribute(this.element, this.name, this.value, this.namespace);\n return null;\n };\n\n return StaticAttribute;\n }();\n var DynamicAttribute = function () {\n function DynamicAttribute(element, attributeManager, name, reference$$1, namespace) {\n _classCallCheck$5(this, DynamicAttribute);\n\n this.element = element;\n this.attributeManager = attributeManager;\n this.name = name;\n this.reference = reference$$1;\n this.namespace = namespace;\n this.cache = null;\n this.tag = reference$$1.tag;\n }\n\n DynamicAttribute.prototype.patch = function patch(env) {\n var element = this.element,\n cache = this.cache;\n\n var value = cache.revalidate();\n if ((0, _reference2.isModified)(value)) {\n this.attributeManager.updateAttribute(env, element, value, this.namespace);\n }\n };\n\n DynamicAttribute.prototype.flush = function flush(env) {\n var reference$$1 = this.reference,\n element = this.element;\n\n if ((0, _reference2.isConst)(reference$$1)) {\n var value = reference$$1.value();\n this.attributeManager.setAttribute(env, element, value, this.namespace);\n return null;\n } else {\n var cache = this.cache = new _reference2.ReferenceCache(reference$$1);\n var _value2 = cache.peek();\n this.attributeManager.setAttribute(env, element, _value2, this.namespace);\n return new PatchElementOpcode(this);\n }\n };\n\n DynamicAttribute.prototype.toJSON = function toJSON() {\n var element = this.element,\n namespace = this.namespace,\n name = this.name,\n cache = this.cache;\n\n var formattedElement = formatElement(element);\n var lastValue = cache.peek();\n if (namespace) {\n return {\n element: formattedElement,\n lastValue: lastValue,\n name: name,\n namespace: namespace,\n type: 'attribute'\n };\n }\n return {\n element: formattedElement,\n lastValue: lastValue,\n name: name,\n namespace: namespace === undefined ? null : namespace,\n type: 'attribute'\n };\n };\n\n return DynamicAttribute;\n }();\n function formatElement(element) {\n return JSON.stringify('<' + element.tagName.toLowerCase() + ' />');\n }\n APPEND_OPCODES.add(32 /* DynamicAttrNS */, function (vm, _ref7) {\n var _name = _ref7.op1,\n _namespace = _ref7.op2,\n trusting = _ref7.op3;\n\n var name = vm.constants.getString(_name);\n var namespace = vm.constants.getString(_namespace);\n var reference$$1 = vm.stack.pop();\n vm.elements().setDynamicAttributeNS(namespace, name, reference$$1, !!trusting);\n });\n APPEND_OPCODES.add(31 /* DynamicAttr */, function (vm, _ref8) {\n var _name = _ref8.op1,\n trusting = _ref8.op2;\n\n var name = vm.constants.getString(_name);\n var reference$$1 = vm.stack.pop();\n vm.elements().setDynamicAttribute(name, reference$$1, !!trusting);\n });\n var PatchElementOpcode = function (_UpdatingOpcode2) {\n _inherits$4(PatchElementOpcode, _UpdatingOpcode2);\n\n function PatchElementOpcode(operation) {\n _classCallCheck$5(this, PatchElementOpcode);\n\n var _this3 = _possibleConstructorReturn$4(this, _UpdatingOpcode2.call(this));\n\n _this3.type = 'patch-element';\n _this3.tag = operation.tag;\n _this3.operation = operation;\n return _this3;\n }\n\n PatchElementOpcode.prototype.evaluate = function evaluate(vm) {\n this.operation.patch(vm.env);\n };\n\n PatchElementOpcode.prototype.toJSON = function toJSON() {\n var _guid = this._guid,\n type = this.type,\n operation = this.operation;\n\n return {\n details: operation.toJSON(),\n guid: _guid,\n type: type\n };\n };\n\n return PatchElementOpcode;\n }(UpdatingOpcode);\n\n function _defaults$3(obj, defaults) {\n var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {\n var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {\n Object.defineProperty(obj, key, value);\n }\n }return obj;\n }\n\n function _classCallCheck$3(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _possibleConstructorReturn$3(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n }\n\n function _inherits$3(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults$3(subClass, superClass);\n }\n\n APPEND_OPCODES.add(56 /* PushComponentManager */, function (vm, _ref) {\n var _definition = _ref.op1;\n\n var definition = vm.constants.getOther(_definition);\n var stack = vm.stack;\n stack.push({ definition: definition, manager: definition.manager, component: null });\n });\n APPEND_OPCODES.add(57 /* PushDynamicComponentManager */, function (vm) {\n var stack = vm.stack;\n var reference$$1 = stack.pop();\n var cache = (0, _reference2.isConst)(reference$$1) ? undefined : new _reference2.ReferenceCache(reference$$1);\n var definition = cache ? cache.peek() : reference$$1.value();\n stack.push({ definition: definition, manager: definition.manager, component: null });\n if (cache) {\n vm.updateWith(new Assert(cache));\n }\n });\n APPEND_OPCODES.add(58 /* PushArgs */, function (vm, _ref2) {\n var synthetic = _ref2.op1;\n\n var stack = vm.stack;\n ARGS.setup(stack, !!synthetic);\n stack.push(ARGS);\n });\n APPEND_OPCODES.add(59 /* PrepareArgs */, function (vm, _ref3) {\n var _state = _ref3.op1;\n\n var stack = vm.stack;\n\n var _vm$fetchValue = vm.fetchValue(_state),\n definition = _vm$fetchValue.definition,\n manager = _vm$fetchValue.manager;\n\n var args = stack.pop();\n var preparedArgs = manager.prepareArgs(definition, args);\n if (preparedArgs) {\n args.clear();\n var positional = preparedArgs.positional,\n named = preparedArgs.named;\n\n var positionalCount = positional.length;\n for (var i = 0; i < positionalCount; i++) {\n stack.push(positional[i]);\n }\n stack.push(positionalCount);\n var names = Object.keys(named);\n var namedCount = names.length;\n var atNames = [];\n for (var _i = 0; _i < namedCount; _i++) {\n var value = named[names[_i]];\n var atName = '@' + names[_i];\n stack.push(value);\n atNames.push(atName);\n }\n stack.push(atNames);\n args.setup(stack, false);\n }\n stack.push(args);\n });\n APPEND_OPCODES.add(60 /* CreateComponent */, function (vm, _ref4) {\n var _vm$fetchValue2;\n\n var flags = _ref4.op1,\n _state = _ref4.op2;\n\n var definition = void 0;\n var manager = void 0;\n var args = vm.stack.pop();\n var dynamicScope = vm.dynamicScope();\n var state = (_vm$fetchValue2 = vm.fetchValue(_state), definition = _vm$fetchValue2.definition, manager = _vm$fetchValue2.manager, _vm$fetchValue2);\n var hasDefaultBlock = flags & 1;\n var component = manager.create(vm.env, definition, args, dynamicScope, vm.getSelf(), !!hasDefaultBlock);\n state.component = component;\n vm.updateWith(new UpdateComponentOpcode(args.tag, definition.name, component, manager, dynamicScope));\n });\n APPEND_OPCODES.add(61 /* RegisterComponentDestructor */, function (vm, _ref5) {\n var _state = _ref5.op1;\n\n var _vm$fetchValue3 = vm.fetchValue(_state),\n manager = _vm$fetchValue3.manager,\n component = _vm$fetchValue3.component;\n\n var destructor = manager.getDestructor(component);\n if (destructor) vm.newDestroyable(destructor);\n });\n APPEND_OPCODES.add(65 /* BeginComponentTransaction */, function (vm) {\n vm.beginCacheGroup();\n vm.elements().pushSimpleBlock();\n });\n APPEND_OPCODES.add(62 /* PushComponentOperations */, function (vm) {\n vm.stack.push(new ComponentElementOperations(vm.env));\n });\n APPEND_OPCODES.add(67 /* DidCreateElement */, function (vm, _ref6) {\n var _state = _ref6.op1;\n\n var _vm$fetchValue4 = vm.fetchValue(_state),\n manager = _vm$fetchValue4.manager,\n component = _vm$fetchValue4.component;\n\n var action = 'DidCreateElementOpcode#evaluate';\n manager.didCreateElement(component, vm.elements().expectConstructing(action), vm.elements().expectOperations(action));\n });\n APPEND_OPCODES.add(63 /* GetComponentSelf */, function (vm, _ref7) {\n var _state = _ref7.op1;\n\n var state = vm.fetchValue(_state);\n vm.stack.push(state.manager.getSelf(state.component));\n });\n APPEND_OPCODES.add(64 /* GetComponentLayout */, function (vm, _ref8) {\n var _state = _ref8.op1;\n\n var _vm$fetchValue5 = vm.fetchValue(_state),\n manager = _vm$fetchValue5.manager,\n definition = _vm$fetchValue5.definition,\n component = _vm$fetchValue5.component;\n\n vm.stack.push(manager.layoutFor(definition, component, vm.env));\n });\n APPEND_OPCODES.add(68 /* DidRenderLayout */, function (vm, _ref9) {\n var _state = _ref9.op1;\n\n var _vm$fetchValue6 = vm.fetchValue(_state),\n manager = _vm$fetchValue6.manager,\n component = _vm$fetchValue6.component;\n\n var bounds = vm.elements().popBlock();\n manager.didRenderLayout(component, bounds);\n vm.env.didCreate(component, manager);\n vm.updateWith(new DidUpdateLayoutOpcode(manager, component, bounds));\n });\n APPEND_OPCODES.add(66 /* CommitComponentTransaction */, function (vm) {\n return vm.commitCacheGroup();\n });\n var UpdateComponentOpcode = function (_UpdatingOpcode) {\n _inherits$3(UpdateComponentOpcode, _UpdatingOpcode);\n\n function UpdateComponentOpcode(tag, name, component, manager, dynamicScope) {\n _classCallCheck$3(this, UpdateComponentOpcode);\n\n var _this = _possibleConstructorReturn$3(this, _UpdatingOpcode.call(this));\n\n _this.name = name;\n _this.component = component;\n _this.manager = manager;\n _this.dynamicScope = dynamicScope;\n _this.type = 'update-component';\n var componentTag = manager.getTag(component);\n if (componentTag) {\n _this.tag = (0, _reference2.combine)([tag, componentTag]);\n } else {\n _this.tag = tag;\n }\n return _this;\n }\n\n UpdateComponentOpcode.prototype.evaluate = function evaluate(_vm) {\n var component = this.component,\n manager = this.manager,\n dynamicScope = this.dynamicScope;\n\n manager.update(component, dynamicScope);\n };\n\n UpdateComponentOpcode.prototype.toJSON = function toJSON() {\n return {\n args: [JSON.stringify(this.name)],\n guid: this._guid,\n type: this.type\n };\n };\n\n return UpdateComponentOpcode;\n }(UpdatingOpcode);\n var DidUpdateLayoutOpcode = function (_UpdatingOpcode2) {\n _inherits$3(DidUpdateLayoutOpcode, _UpdatingOpcode2);\n\n function DidUpdateLayoutOpcode(manager, component, bounds) {\n _classCallCheck$3(this, DidUpdateLayoutOpcode);\n\n var _this2 = _possibleConstructorReturn$3(this, _UpdatingOpcode2.call(this));\n\n _this2.manager = manager;\n _this2.component = component;\n _this2.bounds = bounds;\n _this2.type = 'did-update-layout';\n _this2.tag = _reference2.CONSTANT_TAG;\n return _this2;\n }\n\n DidUpdateLayoutOpcode.prototype.evaluate = function evaluate(vm) {\n var manager = this.manager,\n component = this.component,\n bounds = this.bounds;\n\n manager.didUpdateLayout(component, bounds);\n vm.env.didUpdate(component, manager);\n };\n\n return DidUpdateLayoutOpcode;\n }(UpdatingOpcode);\n\n function _classCallCheck$8(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n var Cursor = function Cursor(element, nextSibling) {\n _classCallCheck$8(this, Cursor);\n\n this.element = element;\n this.nextSibling = nextSibling;\n };\n\n var ConcreteBounds = function () {\n function ConcreteBounds(parentNode, first, last) {\n _classCallCheck$8(this, ConcreteBounds);\n\n this.parentNode = parentNode;\n this.first = first;\n this.last = last;\n }\n\n ConcreteBounds.prototype.parentElement = function parentElement() {\n return this.parentNode;\n };\n\n ConcreteBounds.prototype.firstNode = function firstNode() {\n return this.first;\n };\n\n ConcreteBounds.prototype.lastNode = function lastNode() {\n return this.last;\n };\n\n return ConcreteBounds;\n }();\n var SingleNodeBounds = function () {\n function SingleNodeBounds(parentNode, node) {\n _classCallCheck$8(this, SingleNodeBounds);\n\n this.parentNode = parentNode;\n this.node = node;\n }\n\n SingleNodeBounds.prototype.parentElement = function parentElement() {\n return this.parentNode;\n };\n\n SingleNodeBounds.prototype.firstNode = function firstNode() {\n return this.node;\n };\n\n SingleNodeBounds.prototype.lastNode = function lastNode() {\n return this.node;\n };\n\n return SingleNodeBounds;\n }();\n\n function single(parent, node) {\n return new SingleNodeBounds(parent, node);\n }\n function move(bounds, reference$$1) {\n var parent = bounds.parentElement();\n var first = bounds.firstNode();\n var last = bounds.lastNode();\n var node = first;\n while (node) {\n var next = node.nextSibling;\n parent.insertBefore(node, reference$$1);\n if (node === last) return next;\n node = next;\n }\n return null;\n }\n function clear(bounds) {\n var parent = bounds.parentElement();\n var first = bounds.firstNode();\n var last = bounds.lastNode();\n var node = first;\n while (node) {\n var next = node.nextSibling;\n parent.removeChild(node);\n if (node === last) return next;\n node = next;\n }\n return null;\n }\n\n function _defaults$7(obj, defaults) {\n var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {\n var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {\n Object.defineProperty(obj, key, value);\n }\n }return obj;\n }\n\n function _possibleConstructorReturn$7(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n }\n\n function _inherits$7(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults$7(subClass, superClass);\n }\n\n function _classCallCheck$9(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n var First = function () {\n function First(node) {\n _classCallCheck$9(this, First);\n\n this.node = node;\n }\n\n First.prototype.firstNode = function firstNode() {\n return this.node;\n };\n\n return First;\n }();\n\n var Last = function () {\n function Last(node) {\n _classCallCheck$9(this, Last);\n\n this.node = node;\n }\n\n Last.prototype.lastNode = function lastNode() {\n return this.node;\n };\n\n return Last;\n }();\n\n var Fragment = function () {\n function Fragment(bounds$$1) {\n _classCallCheck$9(this, Fragment);\n\n this.bounds = bounds$$1;\n }\n\n Fragment.prototype.parentElement = function parentElement() {\n return this.bounds.parentElement();\n };\n\n Fragment.prototype.firstNode = function firstNode() {\n return this.bounds.firstNode();\n };\n\n Fragment.prototype.lastNode = function lastNode() {\n return this.bounds.lastNode();\n };\n\n Fragment.prototype.update = function update(bounds$$1) {\n this.bounds = bounds$$1;\n };\n\n return Fragment;\n }();\n var ElementStack = function () {\n function ElementStack(env, parentNode, nextSibling) {\n _classCallCheck$9(this, ElementStack);\n\n this.constructing = null;\n this.operations = null;\n this.elementStack = new _util.Stack();\n this.nextSiblingStack = new _util.Stack();\n this.blockStack = new _util.Stack();\n this.env = env;\n this.dom = env.getAppendOperations();\n this.updateOperations = env.getDOM();\n this.element = parentNode;\n this.nextSibling = nextSibling;\n this.defaultOperations = new SimpleElementOperations(env);\n this.pushSimpleBlock();\n this.elementStack.push(this.element);\n this.nextSiblingStack.push(this.nextSibling);\n }\n\n ElementStack.forInitialRender = function forInitialRender(env, parentNode, nextSibling) {\n return new ElementStack(env, parentNode, nextSibling);\n };\n\n ElementStack.resume = function resume(env, tracker, nextSibling) {\n var parentNode = tracker.parentElement();\n var stack = new ElementStack(env, parentNode, nextSibling);\n stack.pushBlockTracker(tracker);\n return stack;\n };\n\n ElementStack.prototype.expectConstructing = function expectConstructing(method) {\n return this.constructing;\n };\n\n ElementStack.prototype.expectOperations = function expectOperations(method) {\n return this.operations;\n };\n\n ElementStack.prototype.block = function block() {\n return this.blockStack.current;\n };\n\n ElementStack.prototype.popElement = function popElement() {\n var elementStack = this.elementStack,\n nextSiblingStack = this.nextSiblingStack;\n\n var topElement = elementStack.pop();\n nextSiblingStack.pop();\n // LOGGER.debug(`-> element stack ${this.elementStack.toArray().map(e => e.tagName).join(', ')}`);\n this.element = elementStack.current;\n this.nextSibling = nextSiblingStack.current;\n return topElement;\n };\n\n ElementStack.prototype.pushSimpleBlock = function pushSimpleBlock() {\n var tracker = new SimpleBlockTracker(this.element);\n this.pushBlockTracker(tracker);\n return tracker;\n };\n\n ElementStack.prototype.pushUpdatableBlock = function pushUpdatableBlock() {\n var tracker = new UpdatableBlockTracker(this.element);\n this.pushBlockTracker(tracker);\n return tracker;\n };\n\n ElementStack.prototype.pushBlockTracker = function pushBlockTracker(tracker) {\n var isRemote = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n var current = this.blockStack.current;\n if (current !== null) {\n current.newDestroyable(tracker);\n if (!isRemote) {\n current.newBounds(tracker);\n }\n }\n this.blockStack.push(tracker);\n return tracker;\n };\n\n ElementStack.prototype.pushBlockList = function pushBlockList(list) {\n var tracker = new BlockListTracker(this.element, list);\n var current = this.blockStack.current;\n if (current !== null) {\n current.newDestroyable(tracker);\n current.newBounds(tracker);\n }\n this.blockStack.push(tracker);\n return tracker;\n };\n\n ElementStack.prototype.popBlock = function popBlock() {\n this.block().finalize(this);\n return this.blockStack.pop();\n };\n\n ElementStack.prototype.openElement = function openElement(tag, _operations) {\n // workaround argument.length transpile of arg initializer\n var operations = _operations === undefined ? this.defaultOperations : _operations;\n var element = this.dom.createElement(tag, this.element);\n this.constructing = element;\n this.operations = operations;\n return element;\n };\n\n ElementStack.prototype.flushElement = function flushElement() {\n var parent = this.element;\n var element = this.constructing;\n this.dom.insertBefore(parent, element, this.nextSibling);\n this.constructing = null;\n this.operations = null;\n this.pushElement(element, null);\n this.block().openElement(element);\n };\n\n ElementStack.prototype.pushRemoteElement = function pushRemoteElement(element) {\n var nextSibling = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n this.pushElement(element, nextSibling);\n var tracker = new RemoteBlockTracker(element);\n this.pushBlockTracker(tracker, true);\n };\n\n ElementStack.prototype.popRemoteElement = function popRemoteElement() {\n this.popBlock();\n this.popElement();\n };\n\n ElementStack.prototype.pushElement = function pushElement(element, nextSibling) {\n this.element = element;\n this.elementStack.push(element);\n // LOGGER.debug(`-> element stack ${this.elementStack.toArray().map(e => e.tagName).join(', ')}`);\n this.nextSibling = nextSibling;\n this.nextSiblingStack.push(nextSibling);\n };\n\n ElementStack.prototype.newDestroyable = function newDestroyable(d) {\n this.block().newDestroyable(d);\n };\n\n ElementStack.prototype.newBounds = function newBounds(bounds$$1) {\n this.block().newBounds(bounds$$1);\n };\n\n ElementStack.prototype.appendText = function appendText(string) {\n var dom = this.dom;\n\n var text = dom.createTextNode(string);\n dom.insertBefore(this.element, text, this.nextSibling);\n this.block().newNode(text);\n return text;\n };\n\n ElementStack.prototype.appendComment = function appendComment(string) {\n var dom = this.dom;\n\n var comment = dom.createComment(string);\n dom.insertBefore(this.element, comment, this.nextSibling);\n this.block().newNode(comment);\n return comment;\n };\n\n ElementStack.prototype.setStaticAttribute = function setStaticAttribute(name, value) {\n this.expectOperations('setStaticAttribute').addStaticAttribute(this.expectConstructing('setStaticAttribute'), name, value);\n };\n\n ElementStack.prototype.setStaticAttributeNS = function setStaticAttributeNS(namespace, name, value) {\n this.expectOperations('setStaticAttributeNS').addStaticAttributeNS(this.expectConstructing('setStaticAttributeNS'), namespace, name, value);\n };\n\n ElementStack.prototype.setDynamicAttribute = function setDynamicAttribute(name, reference$$1, isTrusting) {\n this.expectOperations('setDynamicAttribute').addDynamicAttribute(this.expectConstructing('setDynamicAttribute'), name, reference$$1, isTrusting);\n };\n\n ElementStack.prototype.setDynamicAttributeNS = function setDynamicAttributeNS(namespace, name, reference$$1, isTrusting) {\n this.expectOperations('setDynamicAttributeNS').addDynamicAttributeNS(this.expectConstructing('setDynamicAttributeNS'), namespace, name, reference$$1, isTrusting);\n };\n\n ElementStack.prototype.closeElement = function closeElement() {\n this.block().closeElement();\n this.popElement();\n };\n\n return ElementStack;\n }();\n var SimpleBlockTracker = function () {\n function SimpleBlockTracker(parent) {\n _classCallCheck$9(this, SimpleBlockTracker);\n\n this.parent = parent;\n this.first = null;\n this.last = null;\n this.destroyables = null;\n this.nesting = 0;\n }\n\n SimpleBlockTracker.prototype.destroy = function destroy() {\n var destroyables = this.destroyables;\n\n if (destroyables && destroyables.length) {\n for (var i = 0; i < destroyables.length; i++) {\n destroyables[i].destroy();\n }\n }\n };\n\n SimpleBlockTracker.prototype.parentElement = function parentElement() {\n return this.parent;\n };\n\n SimpleBlockTracker.prototype.firstNode = function firstNode() {\n return this.first && this.first.firstNode();\n };\n\n SimpleBlockTracker.prototype.lastNode = function lastNode() {\n return this.last && this.last.lastNode();\n };\n\n SimpleBlockTracker.prototype.openElement = function openElement(element) {\n this.newNode(element);\n this.nesting++;\n };\n\n SimpleBlockTracker.prototype.closeElement = function closeElement() {\n this.nesting--;\n };\n\n SimpleBlockTracker.prototype.newNode = function newNode(node) {\n if (this.nesting !== 0) return;\n if (!this.first) {\n this.first = new First(node);\n }\n this.last = new Last(node);\n };\n\n SimpleBlockTracker.prototype.newBounds = function newBounds(bounds$$1) {\n if (this.nesting !== 0) return;\n if (!this.first) {\n this.first = bounds$$1;\n }\n this.last = bounds$$1;\n };\n\n SimpleBlockTracker.prototype.newDestroyable = function newDestroyable(d) {\n this.destroyables = this.destroyables || [];\n this.destroyables.push(d);\n };\n\n SimpleBlockTracker.prototype.finalize = function finalize(stack) {\n if (!this.first) {\n stack.appendComment('');\n }\n };\n\n return SimpleBlockTracker;\n }();\n\n var RemoteBlockTracker = function (_SimpleBlockTracker) {\n _inherits$7(RemoteBlockTracker, _SimpleBlockTracker);\n\n function RemoteBlockTracker() {\n _classCallCheck$9(this, RemoteBlockTracker);\n\n return _possibleConstructorReturn$7(this, _SimpleBlockTracker.apply(this, arguments));\n }\n\n RemoteBlockTracker.prototype.destroy = function destroy() {\n _SimpleBlockTracker.prototype.destroy.call(this);\n clear(this);\n };\n\n return RemoteBlockTracker;\n }(SimpleBlockTracker);\n\n var UpdatableBlockTracker = function (_SimpleBlockTracker2) {\n _inherits$7(UpdatableBlockTracker, _SimpleBlockTracker2);\n\n function UpdatableBlockTracker() {\n _classCallCheck$9(this, UpdatableBlockTracker);\n\n return _possibleConstructorReturn$7(this, _SimpleBlockTracker2.apply(this, arguments));\n }\n\n UpdatableBlockTracker.prototype.reset = function reset(env) {\n var destroyables = this.destroyables;\n\n if (destroyables && destroyables.length) {\n for (var i = 0; i < destroyables.length; i++) {\n env.didDestroy(destroyables[i]);\n }\n }\n var nextSibling = clear(this);\n this.first = null;\n this.last = null;\n this.destroyables = null;\n this.nesting = 0;\n return nextSibling;\n };\n\n return UpdatableBlockTracker;\n }(SimpleBlockTracker);\n\n var BlockListTracker = function () {\n function BlockListTracker(parent, boundList) {\n _classCallCheck$9(this, BlockListTracker);\n\n this.parent = parent;\n this.boundList = boundList;\n this.parent = parent;\n this.boundList = boundList;\n }\n\n BlockListTracker.prototype.destroy = function destroy() {\n this.boundList.forEachNode(function (node) {\n return node.destroy();\n });\n };\n\n BlockListTracker.prototype.parentElement = function parentElement() {\n return this.parent;\n };\n\n BlockListTracker.prototype.firstNode = function firstNode() {\n var head = this.boundList.head();\n return head && head.firstNode();\n };\n\n BlockListTracker.prototype.lastNode = function lastNode() {\n var tail = this.boundList.tail();\n return tail && tail.lastNode();\n };\n\n BlockListTracker.prototype.openElement = function openElement(_element) {\n (0, _util.assert)(false, 'Cannot openElement directly inside a block list');\n };\n\n BlockListTracker.prototype.closeElement = function closeElement() {\n (0, _util.assert)(false, 'Cannot closeElement directly inside a block list');\n };\n\n BlockListTracker.prototype.newNode = function newNode(_node) {\n (0, _util.assert)(false, 'Cannot create a new node directly inside a block list');\n };\n\n BlockListTracker.prototype.newBounds = function newBounds(_bounds) {};\n\n BlockListTracker.prototype.newDestroyable = function newDestroyable(_d) {};\n\n BlockListTracker.prototype.finalize = function finalize(_stack) {};\n\n return BlockListTracker;\n }();\n\n function _classCallCheck$10(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n var COMPONENT_DEFINITION_BRAND = 'COMPONENT DEFINITION [id=e59c754e-61eb-4392-8c4a-2c0ac72bfcd4]';\n function isComponentDefinition(obj) {\n return typeof obj === 'object' && obj !== null && obj[COMPONENT_DEFINITION_BRAND];\n }\n var ComponentDefinition = function ComponentDefinition(name, manager, ComponentClass) {\n _classCallCheck$10(this, ComponentDefinition);\n\n this[COMPONENT_DEFINITION_BRAND] = true;\n this.name = name;\n this.manager = manager;\n this.ComponentClass = ComponentClass;\n };\n\n function _defaults$8(obj, defaults) {\n var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {\n var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {\n Object.defineProperty(obj, key, value);\n }\n }return obj;\n }\n\n function _possibleConstructorReturn$8(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n }\n\n function _inherits$8(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults$8(subClass, superClass);\n }\n\n function _classCallCheck$11(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function isSafeString(value) {\n return typeof value === 'object' && value !== null && typeof value.toHTML === 'function';\n }\n function isNode(value) {\n return typeof value === 'object' && value !== null && typeof value.nodeType === 'number';\n }\n function isString(value) {\n return typeof value === 'string';\n }\n\n var Upsert = function Upsert(bounds$$1) {\n _classCallCheck$11(this, Upsert);\n\n this.bounds = bounds$$1;\n };\n\n function cautiousInsert(dom, cursor, value) {\n if (isString(value)) {\n return TextUpsert.insert(dom, cursor, value);\n }\n if (isSafeString(value)) {\n return SafeStringUpsert.insert(dom, cursor, value);\n }\n if (isNode(value)) {\n return NodeUpsert.insert(dom, cursor, value);\n }\n throw (0, _util.unreachable)();\n }\n function trustingInsert(dom, cursor, value) {\n if (isString(value)) {\n return HTMLUpsert.insert(dom, cursor, value);\n }\n if (isNode(value)) {\n return NodeUpsert.insert(dom, cursor, value);\n }\n throw (0, _util.unreachable)();\n }\n\n var TextUpsert = function (_Upsert) {\n _inherits$8(TextUpsert, _Upsert);\n\n TextUpsert.insert = function insert(dom, cursor, value) {\n var textNode = dom.createTextNode(value);\n dom.insertBefore(cursor.element, textNode, cursor.nextSibling);\n var bounds$$1 = new SingleNodeBounds(cursor.element, textNode);\n return new TextUpsert(bounds$$1, textNode);\n };\n\n function TextUpsert(bounds$$1, textNode) {\n _classCallCheck$11(this, TextUpsert);\n\n var _this = _possibleConstructorReturn$8(this, _Upsert.call(this, bounds$$1));\n\n _this.textNode = textNode;\n return _this;\n }\n\n TextUpsert.prototype.update = function update(_dom, value) {\n if (isString(value)) {\n var textNode = this.textNode;\n\n textNode.nodeValue = value;\n return true;\n } else {\n return false;\n }\n };\n\n return TextUpsert;\n }(Upsert);\n\n var HTMLUpsert = function (_Upsert2) {\n _inherits$8(HTMLUpsert, _Upsert2);\n\n function HTMLUpsert() {\n _classCallCheck$11(this, HTMLUpsert);\n\n return _possibleConstructorReturn$8(this, _Upsert2.apply(this, arguments));\n }\n\n HTMLUpsert.insert = function insert(dom, cursor, value) {\n var bounds$$1 = dom.insertHTMLBefore(cursor.element, cursor.nextSibling, value);\n return new HTMLUpsert(bounds$$1);\n };\n\n HTMLUpsert.prototype.update = function update(dom, value) {\n if (isString(value)) {\n var bounds$$1 = this.bounds;\n\n var parentElement = bounds$$1.parentElement();\n var nextSibling = clear(bounds$$1);\n this.bounds = dom.insertHTMLBefore(parentElement, nextSibling, value);\n return true;\n } else {\n return false;\n }\n };\n\n return HTMLUpsert;\n }(Upsert);\n\n var SafeStringUpsert = function (_Upsert3) {\n _inherits$8(SafeStringUpsert, _Upsert3);\n\n function SafeStringUpsert(bounds$$1, lastStringValue) {\n _classCallCheck$11(this, SafeStringUpsert);\n\n var _this3 = _possibleConstructorReturn$8(this, _Upsert3.call(this, bounds$$1));\n\n _this3.lastStringValue = lastStringValue;\n return _this3;\n }\n\n SafeStringUpsert.insert = function insert(dom, cursor, value) {\n var stringValue = value.toHTML();\n var bounds$$1 = dom.insertHTMLBefore(cursor.element, cursor.nextSibling, stringValue);\n return new SafeStringUpsert(bounds$$1, stringValue);\n };\n\n SafeStringUpsert.prototype.update = function update(dom, value) {\n if (isSafeString(value)) {\n var stringValue = value.toHTML();\n if (stringValue !== this.lastStringValue) {\n var bounds$$1 = this.bounds;\n\n var parentElement = bounds$$1.parentElement();\n var nextSibling = clear(bounds$$1);\n this.bounds = dom.insertHTMLBefore(parentElement, nextSibling, stringValue);\n this.lastStringValue = stringValue;\n }\n return true;\n } else {\n return false;\n }\n };\n\n return SafeStringUpsert;\n }(Upsert);\n\n var NodeUpsert = function (_Upsert4) {\n _inherits$8(NodeUpsert, _Upsert4);\n\n function NodeUpsert() {\n _classCallCheck$11(this, NodeUpsert);\n\n return _possibleConstructorReturn$8(this, _Upsert4.apply(this, arguments));\n }\n\n NodeUpsert.insert = function insert(dom, cursor, node) {\n dom.insertBefore(cursor.element, node, cursor.nextSibling);\n return new NodeUpsert(single(cursor.element, node));\n };\n\n NodeUpsert.prototype.update = function update(dom, value) {\n if (isNode(value)) {\n var bounds$$1 = this.bounds;\n\n var parentElement = bounds$$1.parentElement();\n var nextSibling = clear(bounds$$1);\n this.bounds = dom.insertNodeBefore(parentElement, value, nextSibling);\n return true;\n } else {\n return false;\n }\n };\n\n return NodeUpsert;\n }(Upsert);\n\n function _defaults$6(obj, defaults) {\n var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {\n var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {\n Object.defineProperty(obj, key, value);\n }\n }return obj;\n }\n\n function _possibleConstructorReturn$6(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n }\n\n function _inherits$6(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults$6(subClass, superClass);\n }\n\n function _classCallCheck$7(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n APPEND_OPCODES.add(26 /* DynamicContent */, function (vm, _ref) {\n var append = _ref.op1;\n\n var opcode = vm.constants.getOther(append);\n opcode.evaluate(vm);\n });\n function isEmpty(value) {\n return value === null || value === undefined || typeof value.toString !== 'function';\n }\n function normalizeTextValue(value) {\n if (isEmpty(value)) {\n return '';\n }\n return String(value);\n }\n function normalizeTrustedValue(value) {\n if (isEmpty(value)) {\n return '';\n }\n if (isString(value)) {\n return value;\n }\n if (isSafeString(value)) {\n return value.toHTML();\n }\n if (isNode(value)) {\n return value;\n }\n return String(value);\n }\n function normalizeValue(value) {\n if (isEmpty(value)) {\n return '';\n }\n if (isString(value)) {\n return value;\n }\n if (isSafeString(value) || isNode(value)) {\n return value;\n }\n return String(value);\n }\n var AppendDynamicOpcode = function () {\n function AppendDynamicOpcode() {\n _classCallCheck$7(this, AppendDynamicOpcode);\n }\n\n AppendDynamicOpcode.prototype.evaluate = function evaluate(vm) {\n var reference$$1 = vm.stack.pop();\n var normalized = this.normalize(reference$$1);\n var value = void 0;\n var cache = void 0;\n if ((0, _reference2.isConst)(reference$$1)) {\n value = normalized.value();\n } else {\n cache = new _reference2.ReferenceCache(normalized);\n value = cache.peek();\n }\n var stack = vm.elements();\n var upsert = this.insert(vm.env.getAppendOperations(), stack, value);\n var bounds$$1 = new Fragment(upsert.bounds);\n stack.newBounds(bounds$$1);\n if (cache /* i.e. !isConst(reference) */) {\n vm.updateWith(this.updateWith(vm, reference$$1, cache, bounds$$1, upsert));\n }\n };\n\n return AppendDynamicOpcode;\n }();\n var IsComponentDefinitionReference = function (_ConditionalReference) {\n _inherits$6(IsComponentDefinitionReference, _ConditionalReference);\n\n function IsComponentDefinitionReference() {\n _classCallCheck$7(this, IsComponentDefinitionReference);\n\n return _possibleConstructorReturn$6(this, _ConditionalReference.apply(this, arguments));\n }\n\n IsComponentDefinitionReference.create = function create(inner) {\n return new IsComponentDefinitionReference(inner);\n };\n\n IsComponentDefinitionReference.prototype.toBool = function toBool(value) {\n return isComponentDefinition(value);\n };\n\n return IsComponentDefinitionReference;\n }(ConditionalReference);\n\n var UpdateOpcode = function (_UpdatingOpcode) {\n _inherits$6(UpdateOpcode, _UpdatingOpcode);\n\n function UpdateOpcode(cache, bounds$$1, upsert) {\n _classCallCheck$7(this, UpdateOpcode);\n\n var _this2 = _possibleConstructorReturn$6(this, _UpdatingOpcode.call(this));\n\n _this2.cache = cache;\n _this2.bounds = bounds$$1;\n _this2.upsert = upsert;\n _this2.tag = cache.tag;\n return _this2;\n }\n\n UpdateOpcode.prototype.evaluate = function evaluate(vm) {\n var value = this.cache.revalidate();\n if ((0, _reference2.isModified)(value)) {\n var bounds$$1 = this.bounds,\n upsert = this.upsert;\n var dom = vm.dom;\n\n if (!this.upsert.update(dom, value)) {\n var cursor = new Cursor(bounds$$1.parentElement(), clear(bounds$$1));\n upsert = this.upsert = this.insert(vm.env.getAppendOperations(), cursor, value);\n }\n bounds$$1.update(upsert.bounds);\n }\n };\n\n UpdateOpcode.prototype.toJSON = function toJSON() {\n var guid = this._guid,\n type = this.type,\n cache = this.cache;\n\n return {\n details: { lastValue: JSON.stringify(cache.peek()) },\n guid: guid,\n type: type\n };\n };\n\n return UpdateOpcode;\n }(UpdatingOpcode);\n\n var OptimizedCautiousAppendOpcode = function (_AppendDynamicOpcode) {\n _inherits$6(OptimizedCautiousAppendOpcode, _AppendDynamicOpcode);\n\n function OptimizedCautiousAppendOpcode() {\n _classCallCheck$7(this, OptimizedCautiousAppendOpcode);\n\n var _this3 = _possibleConstructorReturn$6(this, _AppendDynamicOpcode.apply(this, arguments));\n\n _this3.type = 'optimized-cautious-append';\n return _this3;\n }\n\n OptimizedCautiousAppendOpcode.prototype.normalize = function normalize(reference$$1) {\n return (0, _reference2.map)(reference$$1, normalizeValue);\n };\n\n OptimizedCautiousAppendOpcode.prototype.insert = function insert(dom, cursor, value) {\n return cautiousInsert(dom, cursor, value);\n };\n\n OptimizedCautiousAppendOpcode.prototype.updateWith = function updateWith(_vm, _reference, cache, bounds$$1, upsert) {\n return new OptimizedCautiousUpdateOpcode(cache, bounds$$1, upsert);\n };\n\n return OptimizedCautiousAppendOpcode;\n }(AppendDynamicOpcode);\n\n var OptimizedCautiousUpdateOpcode = function (_UpdateOpcode) {\n _inherits$6(OptimizedCautiousUpdateOpcode, _UpdateOpcode);\n\n function OptimizedCautiousUpdateOpcode() {\n _classCallCheck$7(this, OptimizedCautiousUpdateOpcode);\n\n var _this4 = _possibleConstructorReturn$6(this, _UpdateOpcode.apply(this, arguments));\n\n _this4.type = 'optimized-cautious-update';\n return _this4;\n }\n\n OptimizedCautiousUpdateOpcode.prototype.insert = function insert(dom, cursor, value) {\n return cautiousInsert(dom, cursor, value);\n };\n\n return OptimizedCautiousUpdateOpcode;\n }(UpdateOpcode);\n\n var OptimizedTrustingAppendOpcode = function (_AppendDynamicOpcode2) {\n _inherits$6(OptimizedTrustingAppendOpcode, _AppendDynamicOpcode2);\n\n function OptimizedTrustingAppendOpcode() {\n _classCallCheck$7(this, OptimizedTrustingAppendOpcode);\n\n var _this5 = _possibleConstructorReturn$6(this, _AppendDynamicOpcode2.apply(this, arguments));\n\n _this5.type = 'optimized-trusting-append';\n return _this5;\n }\n\n OptimizedTrustingAppendOpcode.prototype.normalize = function normalize(reference$$1) {\n return (0, _reference2.map)(reference$$1, normalizeTrustedValue);\n };\n\n OptimizedTrustingAppendOpcode.prototype.insert = function insert(dom, cursor, value) {\n return trustingInsert(dom, cursor, value);\n };\n\n OptimizedTrustingAppendOpcode.prototype.updateWith = function updateWith(_vm, _reference, cache, bounds$$1, upsert) {\n return new OptimizedTrustingUpdateOpcode(cache, bounds$$1, upsert);\n };\n\n return OptimizedTrustingAppendOpcode;\n }(AppendDynamicOpcode);\n\n var OptimizedTrustingUpdateOpcode = function (_UpdateOpcode2) {\n _inherits$6(OptimizedTrustingUpdateOpcode, _UpdateOpcode2);\n\n function OptimizedTrustingUpdateOpcode() {\n _classCallCheck$7(this, OptimizedTrustingUpdateOpcode);\n\n var _this6 = _possibleConstructorReturn$6(this, _UpdateOpcode2.apply(this, arguments));\n\n _this6.type = 'optimized-trusting-update';\n return _this6;\n }\n\n OptimizedTrustingUpdateOpcode.prototype.insert = function insert(dom, cursor, value) {\n return trustingInsert(dom, cursor, value);\n };\n\n return OptimizedTrustingUpdateOpcode;\n }(UpdateOpcode);\n\n function _classCallCheck$12(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n /* tslint:disable */\n function debugCallback(context, get) {\n console.info('Use `context`, and `get(<path>)` to debug this template.');\n // for example...\n context === get('this');\n debugger;\n }\n /* tslint:enable */\n var callback = debugCallback;\n // For testing purposes\n function setDebuggerCallback(cb) {\n callback = cb;\n }\n function resetDebuggerCallback() {\n callback = debugCallback;\n }\n\n var ScopeInspector = function () {\n function ScopeInspector(scope, symbols, evalInfo) {\n _classCallCheck$12(this, ScopeInspector);\n\n this.scope = scope;\n this.locals = (0, _util.dict)();\n for (var i = 0; i < evalInfo.length; i++) {\n var slot = evalInfo[i];\n var name = symbols[slot - 1];\n var ref = scope.getSymbol(slot);\n this.locals[name] = ref;\n }\n }\n\n ScopeInspector.prototype.get = function get(path) {\n var scope = this.scope,\n locals = this.locals;\n\n var parts = path.split('.');\n\n var _path$split = path.split('.'),\n head = _path$split[0],\n tail = _path$split.slice(1);\n\n var evalScope = scope.getEvalScope();\n var ref = void 0;\n if (head === 'this') {\n ref = scope.getSelf();\n } else if (locals[head]) {\n ref = locals[head];\n } else if (head.indexOf('@') === 0 && evalScope[head]) {\n ref = evalScope[head];\n } else {\n ref = this.scope.getSelf();\n tail = parts;\n }\n return tail.reduce(function (r, part) {\n return r.get(part);\n }, ref);\n };\n\n return ScopeInspector;\n }();\n\n APPEND_OPCODES.add(71 /* Debugger */, function (vm, _ref) {\n var _symbols = _ref.op1,\n _evalInfo = _ref.op2;\n\n var symbols = vm.constants.getOther(_symbols);\n var evalInfo = vm.constants.getArray(_evalInfo);\n var inspector = new ScopeInspector(vm.scope(), symbols, evalInfo);\n callback(vm.getSelf().value(), function (path) {\n return inspector.get(path).value();\n });\n });\n\n APPEND_OPCODES.add(69 /* GetPartialTemplate */, function (vm) {\n var stack = vm.stack;\n var definition = stack.pop();\n stack.push(definition.value().template.asPartial());\n });\n\n function _classCallCheck$13(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n var IterablePresenceReference = function () {\n function IterablePresenceReference(artifacts) {\n _classCallCheck$13(this, IterablePresenceReference);\n\n this.tag = artifacts.tag;\n this.artifacts = artifacts;\n }\n\n IterablePresenceReference.prototype.value = function value() {\n return !this.artifacts.isEmpty();\n };\n\n return IterablePresenceReference;\n }();\n\n APPEND_OPCODES.add(54 /* PutIterator */, function (vm) {\n var stack = vm.stack;\n var listRef = stack.pop();\n var key = stack.pop();\n var iterable = vm.env.iterableFor(listRef, key.value());\n var iterator = new _reference2.ReferenceIterator(iterable);\n stack.push(iterator);\n stack.push(new IterablePresenceReference(iterator.artifacts));\n });\n APPEND_OPCODES.add(52 /* EnterList */, function (vm, _ref) {\n var relativeStart = _ref.op1;\n\n vm.enterList(relativeStart);\n });\n APPEND_OPCODES.add(53 /* ExitList */, function (vm) {\n return vm.exitList();\n });\n APPEND_OPCODES.add(55 /* Iterate */, function (vm, _ref2) {\n var breaks = _ref2.op1;\n\n var stack = vm.stack;\n var item = stack.peek().next();\n if (item) {\n var tryOpcode = vm.iterate(item.memo, item.value);\n vm.enterItem(item.key, tryOpcode);\n } else {\n vm.goto(breaks);\n }\n });\n\n var Ops$2;\n (function (Ops$$1) {\n Ops$$1[Ops$$1[\"OpenComponentElement\"] = 0] = \"OpenComponentElement\";\n Ops$$1[Ops$$1[\"DidCreateElement\"] = 1] = \"DidCreateElement\";\n Ops$$1[Ops$$1[\"DidRenderLayout\"] = 2] = \"DidRenderLayout\";\n Ops$$1[Ops$$1[\"FunctionExpression\"] = 3] = \"FunctionExpression\";\n })(Ops$2 || (Ops$2 = {}));\n\n function _classCallCheck$17(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n var CompiledStaticTemplate = function CompiledStaticTemplate(handle) {\n _classCallCheck$17(this, CompiledStaticTemplate);\n\n this.handle = handle;\n };\n var CompiledDynamicTemplate = function CompiledDynamicTemplate(handle, symbolTable) {\n _classCallCheck$17(this, CompiledDynamicTemplate);\n\n this.handle = handle;\n this.symbolTable = symbolTable;\n };\n\n var _createClass$2 = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n }();\n\n function _classCallCheck$20(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function compileLayout(compilable, env) {\n var builder = new ComponentLayoutBuilder(env);\n compilable.compile(builder);\n return builder.compile();\n }\n\n var ComponentLayoutBuilder = function () {\n function ComponentLayoutBuilder(env) {\n _classCallCheck$20(this, ComponentLayoutBuilder);\n\n this.env = env;\n }\n\n ComponentLayoutBuilder.prototype.wrapLayout = function wrapLayout(layout) {\n this.inner = new WrappedBuilder(this.env, layout);\n };\n\n ComponentLayoutBuilder.prototype.fromLayout = function fromLayout(componentName, layout) {\n this.inner = new UnwrappedBuilder(this.env, componentName, layout);\n };\n\n ComponentLayoutBuilder.prototype.compile = function compile() {\n return this.inner.compile();\n };\n\n _createClass$2(ComponentLayoutBuilder, [{\n key: 'tag',\n get: function () {\n return this.inner.tag;\n }\n }, {\n key: 'attrs',\n get: function () {\n return this.inner.attrs;\n }\n }]);\n\n return ComponentLayoutBuilder;\n }();\n\n var WrappedBuilder = function () {\n function WrappedBuilder(env, layout) {\n _classCallCheck$20(this, WrappedBuilder);\n\n this.env = env;\n this.layout = layout;\n this.tag = new ComponentTagBuilder();\n this.attrs = new ComponentAttrsBuilder();\n }\n\n WrappedBuilder.prototype.compile = function compile() {\n //========DYNAMIC\n // PutValue(TagExpr)\n // Test\n // JumpUnless(BODY)\n // OpenDynamicPrimitiveElement\n // DidCreateElement\n // ...attr statements...\n // FlushElement\n // BODY: Noop\n // ...body statements...\n // PutValue(TagExpr)\n // Test\n // JumpUnless(END)\n // CloseElement\n // END: Noop\n // DidRenderLayout\n // Exit\n //\n //========STATIC\n // OpenPrimitiveElementOpcode\n // DidCreateElement\n // ...attr statements...\n // FlushElement\n // ...body statements...\n // CloseElement\n // DidRenderLayout\n // Exit\n var env = this.env,\n layout = this.layout;\n\n var meta = { templateMeta: layout.meta, symbols: layout.symbols, asPartial: false };\n var dynamicTag = this.tag.getDynamic();\n var staticTag = this.tag.getStatic();\n var b = builder(env, meta);\n b.startLabels();\n if (dynamicTag) {\n b.fetch(Register.s1);\n expr(dynamicTag, b);\n b.dup();\n b.load(Register.s1);\n b.test('simple');\n b.jumpUnless('BODY');\n b.fetch(Register.s1);\n b.pushComponentOperations();\n b.openDynamicElement();\n } else if (staticTag) {\n b.pushComponentOperations();\n b.openElementWithOperations(staticTag);\n }\n if (dynamicTag || staticTag) {\n b.didCreateElement(Register.s0);\n var attrs = this.attrs.buffer;\n for (var i = 0; i < attrs.length; i++) {\n compileStatement(attrs[i], b);\n }\n b.flushElement();\n }\n b.label('BODY');\n b.invokeStatic(layout.asBlock());\n if (dynamicTag) {\n b.fetch(Register.s1);\n b.test('simple');\n b.jumpUnless('END');\n b.closeElement();\n } else if (staticTag) {\n b.closeElement();\n }\n b.label('END');\n b.didRenderLayout(Register.s0);\n if (dynamicTag) {\n b.load(Register.s1);\n }\n b.stopLabels();\n var start = b.start;\n var end = b.finalize();\n return new CompiledDynamicTemplate(start, {\n meta: meta,\n hasEval: layout.hasEval,\n symbols: layout.symbols.concat([ATTRS_BLOCK])\n });\n };\n\n return WrappedBuilder;\n }();\n\n var UnwrappedBuilder = function () {\n function UnwrappedBuilder(env, componentName, layout) {\n _classCallCheck$20(this, UnwrappedBuilder);\n\n this.env = env;\n this.componentName = componentName;\n this.layout = layout;\n this.attrs = new ComponentAttrsBuilder();\n }\n\n UnwrappedBuilder.prototype.compile = function compile() {\n var env = this.env,\n layout = this.layout;\n\n return layout.asLayout(this.componentName, this.attrs.buffer).compileDynamic(env);\n };\n\n _createClass$2(UnwrappedBuilder, [{\n key: 'tag',\n get: function () {\n throw new Error('BUG: Cannot call `tag` on an UnwrappedBuilder');\n }\n }]);\n\n return UnwrappedBuilder;\n }();\n\n var ComponentTagBuilder = function () {\n function ComponentTagBuilder() {\n _classCallCheck$20(this, ComponentTagBuilder);\n\n this.isDynamic = null;\n this.isStatic = null;\n this.staticTagName = null;\n this.dynamicTagName = null;\n }\n\n ComponentTagBuilder.prototype.getDynamic = function getDynamic() {\n if (this.isDynamic) {\n return this.dynamicTagName;\n }\n };\n\n ComponentTagBuilder.prototype.getStatic = function getStatic() {\n if (this.isStatic) {\n return this.staticTagName;\n }\n };\n\n ComponentTagBuilder.prototype.static = function _static(tagName) {\n this.isStatic = true;\n this.staticTagName = tagName;\n };\n\n ComponentTagBuilder.prototype.dynamic = function dynamic(tagName) {\n this.isDynamic = true;\n this.dynamicTagName = [_wireFormat.Ops.ClientSideExpression, Ops$2.FunctionExpression, tagName];\n };\n\n return ComponentTagBuilder;\n }();\n\n var ComponentAttrsBuilder = function () {\n function ComponentAttrsBuilder() {\n _classCallCheck$20(this, ComponentAttrsBuilder);\n\n this.buffer = [];\n }\n\n ComponentAttrsBuilder.prototype.static = function _static(name, value) {\n this.buffer.push([_wireFormat.Ops.StaticAttr, name, value, null]);\n };\n\n ComponentAttrsBuilder.prototype.dynamic = function dynamic(name, value) {\n this.buffer.push([_wireFormat.Ops.DynamicAttr, name, [_wireFormat.Ops.ClientSideExpression, Ops$2.FunctionExpression, value], null]);\n };\n\n return ComponentAttrsBuilder;\n }();\n\n var ComponentBuilder = function () {\n function ComponentBuilder(builder) {\n _classCallCheck$20(this, ComponentBuilder);\n\n this.builder = builder;\n this.env = builder.env;\n }\n\n ComponentBuilder.prototype.static = function _static(definition, args) {\n var params = args[0],\n hash = args[1],\n _default = args[2],\n inverse = args[3];\n var builder = this.builder;\n\n builder.pushComponentManager(definition);\n builder.invokeComponent(null, params, hash, _default, inverse);\n };\n\n ComponentBuilder.prototype.dynamic = function dynamic(definitionArgs, getDefinition, args) {\n var params = args[0],\n hash = args[1],\n block = args[2],\n inverse = args[3];\n var builder = this.builder;\n\n if (!definitionArgs || definitionArgs.length === 0) {\n throw new Error(\"Dynamic syntax without an argument\");\n }\n var meta = this.builder.meta.templateMeta;\n function helper(vm, a) {\n return getDefinition(vm, a, meta);\n }\n builder.startLabels();\n builder.pushFrame();\n builder.returnTo('END');\n builder.compileArgs(definitionArgs[0], definitionArgs[1], true);\n builder.helper(helper);\n builder.dup();\n builder.test('simple');\n builder.enter(2);\n builder.jumpUnless('ELSE');\n builder.pushDynamicComponentManager();\n builder.invokeComponent(null, params, hash, block, inverse);\n builder.label('ELSE');\n builder.exit();\n builder.return();\n builder.label('END');\n builder.popFrame();\n builder.stopLabels();\n };\n\n return ComponentBuilder;\n }();\n function builder(env, meta) {\n return new OpcodeBuilder(env, meta);\n }\n\n function _classCallCheck$21(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n var RawInlineBlock = function () {\n function RawInlineBlock(meta, statements, parameters) {\n _classCallCheck$21(this, RawInlineBlock);\n\n this.meta = meta;\n this.statements = statements;\n this.parameters = parameters;\n }\n\n RawInlineBlock.prototype.scan = function scan() {\n return new CompilableTemplate(this.statements, { parameters: this.parameters, meta: this.meta });\n };\n\n return RawInlineBlock;\n }();\n\n var _createClass$1 = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n }();\n\n function _defaults$9(obj, defaults) {\n var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {\n var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {\n Object.defineProperty(obj, key, value);\n }\n }return obj;\n }\n\n function _possibleConstructorReturn$9(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n }\n\n function _inherits$9(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults$9(subClass, superClass);\n }\n\n function _classCallCheck$19(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n var Labels = function () {\n function Labels() {\n _classCallCheck$19(this, Labels);\n\n this.labels = (0, _util.dict)();\n this.targets = [];\n }\n\n Labels.prototype.label = function label(name, index) {\n this.labels[name] = index;\n };\n\n Labels.prototype.target = function target(at, Target, _target) {\n this.targets.push({ at: at, Target: Target, target: _target });\n };\n\n Labels.prototype.patch = function patch(program) {\n var targets = this.targets,\n labels = this.labels;\n\n for (var i = 0; i < targets.length; i++) {\n var _targets$i = targets[i],\n at = _targets$i.at,\n target = _targets$i.target;\n\n var goto = labels[target] - at;\n program.heap.setbyaddr(at + 1, goto);\n }\n };\n\n return Labels;\n }();\n\n var BasicOpcodeBuilder = function () {\n function BasicOpcodeBuilder(env, meta, program) {\n _classCallCheck$19(this, BasicOpcodeBuilder);\n\n this.env = env;\n this.meta = meta;\n this.program = program;\n this.labelsStack = new _util.Stack();\n this.constants = program.constants;\n this.heap = program.heap;\n this.start = this.heap.malloc();\n }\n\n BasicOpcodeBuilder.prototype.upvars = function upvars(count) {\n return (0, _util.fillNulls)(count);\n };\n\n BasicOpcodeBuilder.prototype.reserve = function reserve(name) {\n this.push(name, 0, 0, 0);\n };\n\n BasicOpcodeBuilder.prototype.push = function push(name) {\n var op1 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var op2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n var op3 = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n\n this.heap.push(name);\n this.heap.push(op1);\n this.heap.push(op2);\n this.heap.push(op3);\n };\n\n BasicOpcodeBuilder.prototype.finalize = function finalize() {\n this.push(22 /* Return */);\n this.heap.finishMalloc(this.start);\n return this.start;\n };\n // args\n\n\n BasicOpcodeBuilder.prototype.pushArgs = function pushArgs(synthetic) {\n this.push(58 /* PushArgs */, synthetic === true ? 1 : 0);\n };\n // helpers\n\n\n BasicOpcodeBuilder.prototype.startLabels = function startLabels() {\n this.labelsStack.push(new Labels());\n };\n\n BasicOpcodeBuilder.prototype.stopLabels = function stopLabels() {\n var label = this.labelsStack.pop();\n label.patch(this.program);\n };\n // components\n\n\n BasicOpcodeBuilder.prototype.pushComponentManager = function pushComponentManager(definition) {\n this.push(56 /* PushComponentManager */, this.other(definition));\n };\n\n BasicOpcodeBuilder.prototype.pushDynamicComponentManager = function pushDynamicComponentManager() {\n this.push(57 /* PushDynamicComponentManager */);\n };\n\n BasicOpcodeBuilder.prototype.prepareArgs = function prepareArgs(state) {\n this.push(59 /* PrepareArgs */, state);\n };\n\n BasicOpcodeBuilder.prototype.createComponent = function createComponent(state, hasDefault, hasInverse) {\n var flag = (hasDefault === true ? 1 : 0) | (hasInverse === true ? 1 : 0) << 1;\n this.push(60 /* CreateComponent */, flag, state);\n };\n\n BasicOpcodeBuilder.prototype.registerComponentDestructor = function registerComponentDestructor(state) {\n this.push(61 /* RegisterComponentDestructor */, state);\n };\n\n BasicOpcodeBuilder.prototype.beginComponentTransaction = function beginComponentTransaction() {\n this.push(65 /* BeginComponentTransaction */);\n };\n\n BasicOpcodeBuilder.prototype.commitComponentTransaction = function commitComponentTransaction() {\n this.push(66 /* CommitComponentTransaction */);\n };\n\n BasicOpcodeBuilder.prototype.pushComponentOperations = function pushComponentOperations() {\n this.push(62 /* PushComponentOperations */);\n };\n\n BasicOpcodeBuilder.prototype.getComponentSelf = function getComponentSelf(state) {\n this.push(63 /* GetComponentSelf */, state);\n };\n\n BasicOpcodeBuilder.prototype.getComponentLayout = function getComponentLayout(state) {\n this.push(64 /* GetComponentLayout */, state);\n };\n\n BasicOpcodeBuilder.prototype.didCreateElement = function didCreateElement(state) {\n this.push(67 /* DidCreateElement */, state);\n };\n\n BasicOpcodeBuilder.prototype.didRenderLayout = function didRenderLayout(state) {\n this.push(68 /* DidRenderLayout */, state);\n };\n // partial\n\n\n BasicOpcodeBuilder.prototype.getPartialTemplate = function getPartialTemplate() {\n this.push(69 /* GetPartialTemplate */);\n };\n\n BasicOpcodeBuilder.prototype.resolveMaybeLocal = function resolveMaybeLocal(name) {\n this.push(70 /* ResolveMaybeLocal */, this.string(name));\n };\n // debugger\n\n\n BasicOpcodeBuilder.prototype.debugger = function _debugger(symbols, evalInfo) {\n this.push(71 /* Debugger */, this.constants.other(symbols), this.constants.array(evalInfo));\n };\n // content\n\n\n BasicOpcodeBuilder.prototype.dynamicContent = function dynamicContent(Opcode) {\n this.push(26 /* DynamicContent */, this.other(Opcode));\n };\n\n BasicOpcodeBuilder.prototype.cautiousAppend = function cautiousAppend() {\n this.dynamicContent(new OptimizedCautiousAppendOpcode());\n };\n\n BasicOpcodeBuilder.prototype.trustingAppend = function trustingAppend() {\n this.dynamicContent(new OptimizedTrustingAppendOpcode());\n };\n // dom\n\n\n BasicOpcodeBuilder.prototype.text = function text(_text) {\n this.push(24 /* Text */, this.constants.string(_text));\n };\n\n BasicOpcodeBuilder.prototype.openPrimitiveElement = function openPrimitiveElement(tag) {\n this.push(27 /* OpenElement */, this.constants.string(tag));\n };\n\n BasicOpcodeBuilder.prototype.openElementWithOperations = function openElementWithOperations(tag) {\n this.push(28 /* OpenElementWithOperations */, this.constants.string(tag));\n };\n\n BasicOpcodeBuilder.prototype.openDynamicElement = function openDynamicElement() {\n this.push(29 /* OpenDynamicElement */);\n };\n\n BasicOpcodeBuilder.prototype.flushElement = function flushElement() {\n this.push(33 /* FlushElement */);\n };\n\n BasicOpcodeBuilder.prototype.closeElement = function closeElement() {\n this.push(34 /* CloseElement */);\n };\n\n BasicOpcodeBuilder.prototype.staticAttr = function staticAttr(_name, _namespace, _value) {\n var name = this.constants.string(_name);\n var namespace = _namespace ? this.constants.string(_namespace) : 0;\n var value = this.constants.string(_value);\n this.push(30 /* StaticAttr */, name, value, namespace);\n };\n\n BasicOpcodeBuilder.prototype.dynamicAttrNS = function dynamicAttrNS(_name, _namespace, trusting) {\n var name = this.constants.string(_name);\n var namespace = this.constants.string(_namespace);\n this.push(32 /* DynamicAttrNS */, name, namespace, trusting === true ? 1 : 0);\n };\n\n BasicOpcodeBuilder.prototype.dynamicAttr = function dynamicAttr(_name, trusting) {\n var name = this.constants.string(_name);\n this.push(31 /* DynamicAttr */, name, trusting === true ? 1 : 0);\n };\n\n BasicOpcodeBuilder.prototype.comment = function comment(_comment) {\n var comment = this.constants.string(_comment);\n this.push(25 /* Comment */, comment);\n };\n\n BasicOpcodeBuilder.prototype.modifier = function modifier(_definition) {\n this.push(35 /* Modifier */, this.other(_definition));\n };\n // lists\n\n\n BasicOpcodeBuilder.prototype.putIterator = function putIterator() {\n this.push(54 /* PutIterator */);\n };\n\n BasicOpcodeBuilder.prototype.enterList = function enterList(start) {\n this.reserve(52 /* EnterList */);\n this.labels.target(this.pos, 52 /* EnterList */, start);\n };\n\n BasicOpcodeBuilder.prototype.exitList = function exitList() {\n this.push(53 /* ExitList */);\n };\n\n BasicOpcodeBuilder.prototype.iterate = function iterate(breaks) {\n this.reserve(55 /* Iterate */);\n this.labels.target(this.pos, 55 /* Iterate */, breaks);\n };\n // expressions\n\n\n BasicOpcodeBuilder.prototype.setVariable = function setVariable(symbol) {\n this.push(4 /* SetVariable */, symbol);\n };\n\n BasicOpcodeBuilder.prototype.getVariable = function getVariable(symbol) {\n this.push(5 /* GetVariable */, symbol);\n };\n\n BasicOpcodeBuilder.prototype.getProperty = function getProperty(key) {\n this.push(6 /* GetProperty */, this.string(key));\n };\n\n BasicOpcodeBuilder.prototype.getBlock = function getBlock(symbol) {\n this.push(8 /* GetBlock */, symbol);\n };\n\n BasicOpcodeBuilder.prototype.hasBlock = function hasBlock(symbol) {\n this.push(9 /* HasBlock */, symbol);\n };\n\n BasicOpcodeBuilder.prototype.hasBlockParams = function hasBlockParams(symbol) {\n this.push(10 /* HasBlockParams */, symbol);\n };\n\n BasicOpcodeBuilder.prototype.concat = function concat(size) {\n this.push(11 /* Concat */, size);\n };\n\n BasicOpcodeBuilder.prototype.function = function _function(f) {\n this.push(2 /* Function */, this.func(f));\n };\n\n BasicOpcodeBuilder.prototype.load = function load(register) {\n this.push(17 /* Load */, register);\n };\n\n BasicOpcodeBuilder.prototype.fetch = function fetch(register) {\n this.push(18 /* Fetch */, register);\n };\n\n BasicOpcodeBuilder.prototype.dup = function dup() {\n var register = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Register.sp;\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n return this.push(15 /* Dup */, register, offset);\n };\n\n BasicOpcodeBuilder.prototype.pop = function pop() {\n var count = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;\n\n return this.push(16 /* Pop */, count);\n };\n // vm\n\n\n BasicOpcodeBuilder.prototype.pushRemoteElement = function pushRemoteElement() {\n this.push(36 /* PushRemoteElement */);\n };\n\n BasicOpcodeBuilder.prototype.popRemoteElement = function popRemoteElement() {\n this.push(37 /* PopRemoteElement */);\n };\n\n BasicOpcodeBuilder.prototype.label = function label(name) {\n this.labels.label(name, this.nextPos);\n };\n\n BasicOpcodeBuilder.prototype.pushRootScope = function pushRootScope(symbols, bindCallerScope) {\n this.push(19 /* RootScope */, symbols, bindCallerScope ? 1 : 0);\n };\n\n BasicOpcodeBuilder.prototype.pushChildScope = function pushChildScope() {\n this.push(20 /* ChildScope */);\n };\n\n BasicOpcodeBuilder.prototype.popScope = function popScope() {\n this.push(21 /* PopScope */);\n };\n\n BasicOpcodeBuilder.prototype.returnTo = function returnTo(label) {\n this.reserve(23 /* ReturnTo */);\n this.labels.target(this.pos, 23 /* ReturnTo */, label);\n };\n\n BasicOpcodeBuilder.prototype.pushDynamicScope = function pushDynamicScope() {\n this.push(39 /* PushDynamicScope */);\n };\n\n BasicOpcodeBuilder.prototype.popDynamicScope = function popDynamicScope() {\n this.push(40 /* PopDynamicScope */);\n };\n\n BasicOpcodeBuilder.prototype.pushImmediate = function pushImmediate(value) {\n this.push(13 /* Constant */, this.other(value));\n };\n\n BasicOpcodeBuilder.prototype.primitive = function primitive(_primitive) {\n var flag = 0;\n var primitive = void 0;\n switch (typeof _primitive) {\n case 'number':\n if (_primitive % 1 === 0 && _primitive > 0) {\n primitive = _primitive;\n } else {\n primitive = this.float(_primitive);\n flag = 1;\n }\n break;\n case 'string':\n primitive = this.string(_primitive);\n flag = 2;\n break;\n case 'boolean':\n primitive = _primitive | 0;\n flag = 3;\n break;\n case 'object':\n // assume null\n primitive = 2;\n flag = 3;\n break;\n case 'undefined':\n primitive = 3;\n flag = 3;\n break;\n default:\n throw new Error('Invalid primitive passed to pushPrimitive');\n }\n this.push(14 /* PrimitiveReference */, flag << 30 | primitive);\n };\n\n BasicOpcodeBuilder.prototype.helper = function helper(func) {\n this.push(1 /* Helper */, this.func(func));\n };\n\n BasicOpcodeBuilder.prototype.pushBlock = function pushBlock(block) {\n this.push(7 /* PushBlock */, this.block(block));\n };\n\n BasicOpcodeBuilder.prototype.bindDynamicScope = function bindDynamicScope(_names) {\n this.push(38 /* BindDynamicScope */, this.names(_names));\n };\n\n BasicOpcodeBuilder.prototype.enter = function enter(args) {\n this.push(49 /* Enter */, args);\n };\n\n BasicOpcodeBuilder.prototype.exit = function exit() {\n this.push(50 /* Exit */);\n };\n\n BasicOpcodeBuilder.prototype.return = function _return() {\n this.push(22 /* Return */);\n };\n\n BasicOpcodeBuilder.prototype.pushFrame = function pushFrame() {\n this.push(47 /* PushFrame */);\n };\n\n BasicOpcodeBuilder.prototype.popFrame = function popFrame() {\n this.push(48 /* PopFrame */);\n };\n\n BasicOpcodeBuilder.prototype.compileDynamicBlock = function compileDynamicBlock() {\n this.push(41 /* CompileDynamicBlock */);\n };\n\n BasicOpcodeBuilder.prototype.invokeDynamic = function invokeDynamic(invoker) {\n this.push(43 /* InvokeDynamic */, this.other(invoker));\n };\n\n BasicOpcodeBuilder.prototype.invokeStatic = function invokeStatic(block) {\n var callerCount = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var parameters = block.symbolTable.parameters;\n\n var calleeCount = parameters.length;\n var count = Math.min(callerCount, calleeCount);\n this.pushFrame();\n if (count) {\n this.pushChildScope();\n for (var i = 0; i < count; i++) {\n this.dup(Register.fp, callerCount - i);\n this.setVariable(parameters[i]);\n }\n }\n var _block = this.constants.block(block);\n this.push(42 /* InvokeStatic */, _block);\n if (count) {\n this.popScope();\n }\n this.popFrame();\n };\n\n BasicOpcodeBuilder.prototype.test = function test(testFunc) {\n var _func = void 0;\n if (testFunc === 'const') {\n _func = ConstTest;\n } else if (testFunc === 'simple') {\n _func = SimpleTest;\n } else if (testFunc === 'environment') {\n _func = EnvironmentTest;\n } else if (typeof testFunc === 'function') {\n _func = testFunc;\n } else {\n throw new Error('unreachable');\n }\n var func = this.constants.function(_func);\n this.push(51 /* Test */, func);\n };\n\n BasicOpcodeBuilder.prototype.jump = function jump(target) {\n this.reserve(44 /* Jump */);\n this.labels.target(this.pos, 44 /* Jump */, target);\n };\n\n BasicOpcodeBuilder.prototype.jumpIf = function jumpIf(target) {\n this.reserve(45 /* JumpIf */);\n this.labels.target(this.pos, 45 /* JumpIf */, target);\n };\n\n BasicOpcodeBuilder.prototype.jumpUnless = function jumpUnless(target) {\n this.reserve(46 /* JumpUnless */);\n this.labels.target(this.pos, 46 /* JumpUnless */, target);\n };\n\n BasicOpcodeBuilder.prototype.string = function string(_string) {\n return this.constants.string(_string);\n };\n\n BasicOpcodeBuilder.prototype.float = function float(num) {\n return this.constants.float(num);\n };\n\n BasicOpcodeBuilder.prototype.names = function names(_names) {\n var names = [];\n for (var i = 0; i < _names.length; i++) {\n var n = _names[i];\n names[i] = this.constants.string(n);\n }\n return this.constants.array(names);\n };\n\n BasicOpcodeBuilder.prototype.symbols = function symbols(_symbols) {\n return this.constants.array(_symbols);\n };\n\n BasicOpcodeBuilder.prototype.other = function other(value) {\n return this.constants.other(value);\n };\n\n BasicOpcodeBuilder.prototype.block = function block(_block2) {\n return _block2 ? this.constants.block(_block2) : 0;\n };\n\n BasicOpcodeBuilder.prototype.func = function func(_func2) {\n return this.constants.function(_func2);\n };\n\n _createClass$1(BasicOpcodeBuilder, [{\n key: 'pos',\n get: function () {\n return (0, _util.typePos)(this.heap.size());\n }\n }, {\n key: 'nextPos',\n get: function () {\n return this.heap.size();\n }\n }, {\n key: 'labels',\n get: function () {\n return this.labelsStack.current;\n }\n }]);\n\n return BasicOpcodeBuilder;\n }();\n\n function isCompilableExpression(expr$$1) {\n return typeof expr$$1 === 'object' && expr$$1 !== null && typeof expr$$1.compile === 'function';\n }\n\n var OpcodeBuilder = function (_BasicOpcodeBuilder) {\n _inherits$9(OpcodeBuilder, _BasicOpcodeBuilder);\n\n function OpcodeBuilder(env, meta) {\n var program = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : env.program;\n\n _classCallCheck$19(this, OpcodeBuilder);\n\n var _this = _possibleConstructorReturn$9(this, _BasicOpcodeBuilder.call(this, env, meta, program));\n\n _this.component = new ComponentBuilder(_this);\n return _this;\n }\n\n OpcodeBuilder.prototype.compileArgs = function compileArgs(params, hash, synthetic) {\n var positional = 0;\n if (params) {\n for (var i = 0; i < params.length; i++) {\n expr(params[i], this);\n }\n positional = params.length;\n }\n this.pushImmediate(positional);\n var names = _util.EMPTY_ARRAY;\n if (hash) {\n names = hash[0];\n var val = hash[1];\n for (var _i = 0; _i < val.length; _i++) {\n expr(val[_i], this);\n }\n }\n this.pushImmediate(names);\n this.pushArgs(synthetic);\n };\n\n OpcodeBuilder.prototype.compile = function compile(expr$$1) {\n if (isCompilableExpression(expr$$1)) {\n return expr$$1.compile(this);\n } else {\n return expr$$1;\n }\n };\n\n OpcodeBuilder.prototype.guardedAppend = function guardedAppend(expression, trusting) {\n this.startLabels();\n this.pushFrame();\n this.returnTo('END');\n expr(expression, this);\n this.dup();\n this.test(function (reference$$1) {\n return IsComponentDefinitionReference.create(reference$$1);\n });\n this.enter(2);\n this.jumpUnless('ELSE');\n this.pushDynamicComponentManager();\n this.invokeComponent(null, null, null, null, null);\n this.exit();\n this.return();\n this.label('ELSE');\n if (trusting) {\n this.trustingAppend();\n } else {\n this.cautiousAppend();\n }\n this.exit();\n this.return();\n this.label('END');\n this.popFrame();\n this.stopLabels();\n };\n\n OpcodeBuilder.prototype.invokeComponent = function invokeComponent(attrs, params, hash, block) {\n var inverse = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;\n\n this.fetch(Register.s0);\n this.dup(Register.sp, 1);\n this.load(Register.s0);\n this.pushBlock(block);\n this.pushBlock(inverse);\n this.compileArgs(params, hash, false);\n this.prepareArgs(Register.s0);\n this.beginComponentTransaction();\n this.pushDynamicScope();\n this.createComponent(Register.s0, block !== null, inverse !== null);\n this.registerComponentDestructor(Register.s0);\n this.getComponentSelf(Register.s0);\n this.getComponentLayout(Register.s0);\n this.invokeDynamic(new InvokeDynamicLayout(attrs && attrs.scan()));\n this.popFrame();\n this.popScope();\n this.popDynamicScope();\n this.commitComponentTransaction();\n this.load(Register.s0);\n };\n\n OpcodeBuilder.prototype.template = function template(block) {\n if (!block) return null;\n return new RawInlineBlock(this.meta, block.statements, block.parameters);\n };\n\n return OpcodeBuilder;\n }(BasicOpcodeBuilder);\n\n function _classCallCheck$18(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n var Ops$3 = _wireFormat.Ops;\n var ATTRS_BLOCK = '&attrs';\n\n var Compilers = function () {\n function Compilers() {\n var offset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\n _classCallCheck$18(this, Compilers);\n\n this.offset = offset;\n this.names = (0, _util.dict)();\n this.funcs = [];\n }\n\n Compilers.prototype.add = function add(name, func) {\n this.funcs.push(func);\n this.names[name] = this.funcs.length - 1;\n };\n\n Compilers.prototype.compile = function compile(sexp, builder) {\n var name = sexp[this.offset];\n var index = this.names[name];\n var func = this.funcs[index];\n (0, _util.assert)(!!func, 'expected an implementation for ' + (this.offset === 0 ? Ops$3[sexp[0]] : Ops$2[sexp[1]]));\n func(sexp, builder);\n };\n\n return Compilers;\n }();\n\n var STATEMENTS = new Compilers();\n var CLIENT_SIDE = new Compilers(1);\n STATEMENTS.add(Ops$3.Text, function (sexp, builder) {\n builder.text(sexp[1]);\n });\n STATEMENTS.add(Ops$3.Comment, function (sexp, builder) {\n builder.comment(sexp[1]);\n });\n STATEMENTS.add(Ops$3.CloseElement, function (_sexp, builder) {\n builder.closeElement();\n });\n STATEMENTS.add(Ops$3.FlushElement, function (_sexp, builder) {\n builder.flushElement();\n });\n STATEMENTS.add(Ops$3.Modifier, function (sexp, builder) {\n var env = builder.env,\n meta = builder.meta;\n var name = sexp[1],\n params = sexp[2],\n hash = sexp[3];\n\n if (env.hasModifier(name, meta.templateMeta)) {\n builder.compileArgs(params, hash, true);\n builder.modifier(env.lookupModifier(name, meta.templateMeta));\n } else {\n throw new Error('Compile Error ' + name + ' is not a modifier: Helpers may not be used in the element form.');\n }\n });\n STATEMENTS.add(Ops$3.StaticAttr, function (sexp, builder) {\n var name = sexp[1],\n value = sexp[2],\n namespace = sexp[3];\n\n builder.staticAttr(name, namespace, value);\n });\n STATEMENTS.add(Ops$3.DynamicAttr, function (sexp, builder) {\n dynamicAttr(sexp, false, builder);\n });\n STATEMENTS.add(Ops$3.TrustingAttr, function (sexp, builder) {\n dynamicAttr(sexp, true, builder);\n });\n function dynamicAttr(sexp, trusting, builder) {\n var name = sexp[1],\n value = sexp[2],\n namespace = sexp[3];\n\n expr(value, builder);\n if (namespace) {\n builder.dynamicAttrNS(name, namespace, trusting);\n } else {\n builder.dynamicAttr(name, trusting);\n }\n }\n STATEMENTS.add(Ops$3.OpenElement, function (sexp, builder) {\n builder.openPrimitiveElement(sexp[1]);\n });\n CLIENT_SIDE.add(Ops$2.OpenComponentElement, function (sexp, builder) {\n builder.pushComponentOperations();\n builder.openElementWithOperations(sexp[2]);\n });\n CLIENT_SIDE.add(Ops$2.DidCreateElement, function (_sexp, builder) {\n builder.didCreateElement(Register.s0);\n });\n CLIENT_SIDE.add(Ops$2.DidRenderLayout, function (_sexp, builder) {\n builder.didRenderLayout(Register.s0);\n });\n STATEMENTS.add(Ops$3.Append, function (sexp, builder) {\n var value = sexp[1],\n trusting = sexp[2];\n\n var _builder$env$macros = builder.env.macros(),\n inlines = _builder$env$macros.inlines;\n\n var returned = inlines.compile(sexp, builder) || value;\n if (returned === true) return;\n var isGet = E.isGet(value);\n var isMaybeLocal = E.isMaybeLocal(value);\n if (trusting) {\n builder.guardedAppend(value, true);\n } else {\n if (isGet || isMaybeLocal) {\n builder.guardedAppend(value, false);\n } else {\n expr(value, builder);\n builder.cautiousAppend();\n }\n }\n });\n STATEMENTS.add(Ops$3.Block, function (sexp, builder) {\n var name = sexp[1],\n params = sexp[2],\n hash = sexp[3],\n _template = sexp[4],\n _inverse = sexp[5];\n\n var template = builder.template(_template);\n var inverse = builder.template(_inverse);\n var templateBlock = template && template.scan();\n var inverseBlock = inverse && inverse.scan();\n\n var _builder$env$macros2 = builder.env.macros(),\n blocks = _builder$env$macros2.blocks;\n\n blocks.compile(name, params, hash, templateBlock, inverseBlock, builder);\n });\n var InvokeDynamicLayout = function () {\n function InvokeDynamicLayout(attrs) {\n _classCallCheck$18(this, InvokeDynamicLayout);\n\n this.attrs = attrs;\n }\n\n InvokeDynamicLayout.prototype.invoke = function invoke(vm, layout) {\n var _layout$symbolTable = layout.symbolTable,\n symbols = _layout$symbolTable.symbols,\n hasEval = _layout$symbolTable.hasEval;\n\n var stack = vm.stack;\n var scope = vm.pushRootScope(symbols.length + 1, true);\n scope.bindSelf(stack.pop());\n scope.bindBlock(symbols.indexOf(ATTRS_BLOCK) + 1, this.attrs);\n var lookup = null;\n var $eval = -1;\n if (hasEval) {\n $eval = symbols.indexOf('$eval') + 1;\n lookup = (0, _util.dict)();\n }\n var callerNames = stack.pop();\n for (var i = callerNames.length - 1; i >= 0; i--) {\n var symbol = symbols.indexOf(callerNames[i]);\n var value = stack.pop();\n if (symbol !== -1) scope.bindSymbol(symbol + 1, value);\n if (hasEval) lookup[callerNames[i]] = value;\n }\n var numPositionalArgs = stack.pop();\n (0, _util.assert)(typeof numPositionalArgs === 'number', '[BUG] Incorrect value of positional argument count found during invoke-dynamic-layout.');\n // Currently we don't support accessing positional args in templates, so just throw them away\n stack.pop(numPositionalArgs);\n var inverseSymbol = symbols.indexOf('&inverse');\n var inverse = stack.pop();\n if (inverseSymbol !== -1) {\n scope.bindBlock(inverseSymbol + 1, inverse);\n }\n if (lookup) lookup['&inverse'] = inverse;\n var defaultSymbol = symbols.indexOf('&default');\n var defaultBlock = stack.pop();\n if (defaultSymbol !== -1) {\n scope.bindBlock(defaultSymbol + 1, defaultBlock);\n }\n if (lookup) lookup['&default'] = defaultBlock;\n if (lookup) scope.bindEvalScope(lookup);\n vm.pushFrame();\n vm.call(layout.handle);\n };\n\n InvokeDynamicLayout.prototype.toJSON = function toJSON() {\n return { GlimmerDebug: '<invoke-dynamic-layout>' };\n };\n\n return InvokeDynamicLayout;\n }();\n STATEMENTS.add(Ops$3.Component, function (sexp, builder) {\n var tag = sexp[1],\n attrs = sexp[2],\n args = sexp[3],\n block = sexp[4];\n\n if (builder.env.hasComponentDefinition(tag, builder.meta.templateMeta)) {\n var child = builder.template(block);\n var attrsBlock = new RawInlineBlock(builder.meta, attrs, _util.EMPTY_ARRAY);\n var definition = builder.env.getComponentDefinition(tag, builder.meta.templateMeta);\n builder.pushComponentManager(definition);\n builder.invokeComponent(attrsBlock, null, args, child && child.scan());\n } else if (block && block.parameters.length) {\n throw new Error('Compile Error: Cannot find component ' + tag);\n } else {\n builder.openPrimitiveElement(tag);\n for (var i = 0; i < attrs.length; i++) {\n STATEMENTS.compile(attrs[i], builder);\n }\n builder.flushElement();\n if (block) {\n var stmts = block.statements;\n for (var _i = 0; _i < stmts.length; _i++) {\n STATEMENTS.compile(stmts[_i], builder);\n }\n }\n builder.closeElement();\n }\n });\n var PartialInvoker = function () {\n function PartialInvoker(outerSymbols, evalInfo) {\n _classCallCheck$18(this, PartialInvoker);\n\n this.outerSymbols = outerSymbols;\n this.evalInfo = evalInfo;\n }\n\n PartialInvoker.prototype.invoke = function invoke(vm, _partial) {\n var partial = _partial;\n var partialSymbols = partial.symbolTable.symbols;\n var outerScope = vm.scope();\n var evalScope = outerScope.getEvalScope();\n var partialScope = vm.pushRootScope(partialSymbols.length, false);\n partialScope.bindCallerScope(outerScope.getCallerScope());\n partialScope.bindEvalScope(evalScope);\n partialScope.bindSelf(outerScope.getSelf());\n var evalInfo = this.evalInfo,\n outerSymbols = this.outerSymbols;\n\n var locals = Object.create(outerScope.getPartialMap());\n for (var i = 0; i < evalInfo.length; i++) {\n var slot = evalInfo[i];\n var name = outerSymbols[slot - 1];\n var ref = outerScope.getSymbol(slot);\n locals[name] = ref;\n }\n if (evalScope) {\n for (var _i2 = 0; _i2 < partialSymbols.length; _i2++) {\n var _name = partialSymbols[_i2];\n var symbol = _i2 + 1;\n var value = evalScope[_name];\n if (value !== undefined) partialScope.bind(symbol, value);\n }\n }\n partialScope.bindPartialMap(locals);\n vm.pushFrame();\n vm.call(partial.handle);\n };\n\n return PartialInvoker;\n }();\n STATEMENTS.add(Ops$3.Partial, function (sexp, builder) {\n var name = sexp[1],\n evalInfo = sexp[2];\n var _builder$meta = builder.meta,\n templateMeta = _builder$meta.templateMeta,\n symbols = _builder$meta.symbols;\n\n function helper(vm, args) {\n var env = vm.env;\n\n var nameRef = args.positional.at(0);\n return (0, _reference2.map)(nameRef, function (n) {\n if (typeof n === 'string' && n) {\n if (!env.hasPartial(n, templateMeta)) {\n throw new Error('Could not find a partial named \"' + n + '\"');\n }\n return env.lookupPartial(n, templateMeta);\n } else if (n) {\n throw new Error('Could not find a partial named \"' + String(n) + '\"');\n } else {\n return null;\n }\n });\n }\n builder.startLabels();\n builder.pushFrame();\n builder.returnTo('END');\n expr(name, builder);\n builder.pushImmediate(1);\n builder.pushImmediate(_util.EMPTY_ARRAY);\n builder.pushArgs(true);\n builder.helper(helper);\n builder.dup();\n builder.test('simple');\n builder.enter(2);\n builder.jumpUnless('ELSE');\n builder.getPartialTemplate();\n builder.compileDynamicBlock();\n builder.invokeDynamic(new PartialInvoker(symbols, evalInfo));\n builder.popScope();\n builder.popFrame();\n builder.label('ELSE');\n builder.exit();\n builder.return();\n builder.label('END');\n builder.popFrame();\n builder.stopLabels();\n });\n\n var InvokeDynamicYield = function () {\n function InvokeDynamicYield(callerCount) {\n _classCallCheck$18(this, InvokeDynamicYield);\n\n this.callerCount = callerCount;\n }\n\n InvokeDynamicYield.prototype.invoke = function invoke(vm, block) {\n var callerCount = this.callerCount;\n\n var stack = vm.stack;\n if (!block) {\n // To balance the pop{Frame,Scope}\n vm.pushFrame();\n vm.pushCallerScope();\n return;\n }\n var table = block.symbolTable;\n var locals = table.parameters; // always present in inline blocks\n var calleeCount = locals ? locals.length : 0;\n var count = Math.min(callerCount, calleeCount);\n vm.pushFrame();\n vm.pushCallerScope(calleeCount > 0);\n var scope = vm.scope();\n for (var i = 0; i < count; i++) {\n scope.bindSymbol(locals[i], stack.fromBase(callerCount - i));\n }\n vm.call(block.handle);\n };\n\n InvokeDynamicYield.prototype.toJSON = function toJSON() {\n return { GlimmerDebug: '<invoke-dynamic-yield caller-count=' + this.callerCount + '>' };\n };\n\n return InvokeDynamicYield;\n }();\n\n STATEMENTS.add(Ops$3.Yield, function (sexp, builder) {\n var to = sexp[1],\n params = sexp[2];\n\n var count = compileList(params, builder);\n builder.getBlock(to);\n builder.compileDynamicBlock();\n builder.invokeDynamic(new InvokeDynamicYield(count));\n builder.popScope();\n builder.popFrame();\n if (count) {\n builder.pop(count);\n }\n });\n STATEMENTS.add(Ops$3.Debugger, function (sexp, builder) {\n var evalInfo = sexp[1];\n\n builder.debugger(builder.meta.symbols, evalInfo);\n });\n STATEMENTS.add(Ops$3.ClientSideStatement, function (sexp, builder) {\n CLIENT_SIDE.compile(sexp, builder);\n });\n var EXPRESSIONS = new Compilers();\n var CLIENT_SIDE_EXPRS = new Compilers(1);\n var E = _wireFormat.Expressions;\n function expr(expression, builder) {\n if (Array.isArray(expression)) {\n EXPRESSIONS.compile(expression, builder);\n } else {\n builder.primitive(expression);\n }\n }\n EXPRESSIONS.add(Ops$3.Unknown, function (sexp, builder) {\n var name = sexp[1];\n if (builder.env.hasHelper(name, builder.meta.templateMeta)) {\n EXPRESSIONS.compile([Ops$3.Helper, name, _util.EMPTY_ARRAY, null], builder);\n } else if (builder.meta.asPartial) {\n builder.resolveMaybeLocal(name);\n } else {\n builder.getVariable(0);\n builder.getProperty(name);\n }\n });\n EXPRESSIONS.add(Ops$3.Concat, function (sexp, builder) {\n var parts = sexp[1];\n for (var i = 0; i < parts.length; i++) {\n expr(parts[i], builder);\n }\n builder.concat(parts.length);\n });\n CLIENT_SIDE_EXPRS.add(Ops$2.FunctionExpression, function (sexp, builder) {\n builder.function(sexp[2]);\n });\n EXPRESSIONS.add(Ops$3.Helper, function (sexp, builder) {\n var env = builder.env,\n meta = builder.meta;\n var name = sexp[1],\n params = sexp[2],\n hash = sexp[3];\n\n if (env.hasHelper(name, meta.templateMeta)) {\n builder.compileArgs(params, hash, true);\n builder.helper(env.lookupHelper(name, meta.templateMeta));\n } else {\n throw new Error('Compile Error: ' + name + ' is not a helper');\n }\n });\n EXPRESSIONS.add(Ops$3.Get, function (sexp, builder) {\n var head = sexp[1],\n path = sexp[2];\n\n builder.getVariable(head);\n for (var i = 0; i < path.length; i++) {\n builder.getProperty(path[i]);\n }\n });\n EXPRESSIONS.add(Ops$3.MaybeLocal, function (sexp, builder) {\n var path = sexp[1];\n\n if (builder.meta.asPartial) {\n var head = path[0];\n path = path.slice(1);\n builder.resolveMaybeLocal(head);\n } else {\n builder.getVariable(0);\n }\n for (var i = 0; i < path.length; i++) {\n builder.getProperty(path[i]);\n }\n });\n EXPRESSIONS.add(Ops$3.Undefined, function (_sexp, builder) {\n return builder.primitive(undefined);\n });\n EXPRESSIONS.add(Ops$3.HasBlock, function (sexp, builder) {\n builder.hasBlock(sexp[1]);\n });\n EXPRESSIONS.add(Ops$3.HasBlockParams, function (sexp, builder) {\n builder.hasBlockParams(sexp[1]);\n });\n EXPRESSIONS.add(Ops$3.ClientSideExpression, function (sexp, builder) {\n CLIENT_SIDE_EXPRS.compile(sexp, builder);\n });\n function compileList(params, builder) {\n if (!params) return 0;\n for (var i = 0; i < params.length; i++) {\n expr(params[i], builder);\n }\n return params.length;\n }\n var Blocks = function () {\n function Blocks() {\n _classCallCheck$18(this, Blocks);\n\n this.names = (0, _util.dict)();\n this.funcs = [];\n }\n\n Blocks.prototype.add = function add(name, func) {\n this.funcs.push(func);\n this.names[name] = this.funcs.length - 1;\n };\n\n Blocks.prototype.addMissing = function addMissing(func) {\n this.missing = func;\n };\n\n Blocks.prototype.compile = function compile(name, params, hash, template, inverse, builder) {\n var index = this.names[name];\n if (index === undefined) {\n (0, _util.assert)(!!this.missing, name + ' not found, and no catch-all block handler was registered');\n var func = this.missing;\n var handled = func(name, params, hash, template, inverse, builder);\n (0, _util.assert)(!!handled, name + ' not found, and the catch-all block handler didn\\'t handle it');\n } else {\n var _func = this.funcs[index];\n _func(params, hash, template, inverse, builder);\n }\n };\n\n return Blocks;\n }();\n var BLOCKS = new Blocks();\n var Inlines = function () {\n function Inlines() {\n _classCallCheck$18(this, Inlines);\n\n this.names = (0, _util.dict)();\n this.funcs = [];\n }\n\n Inlines.prototype.add = function add(name, func) {\n this.funcs.push(func);\n this.names[name] = this.funcs.length - 1;\n };\n\n Inlines.prototype.addMissing = function addMissing(func) {\n this.missing = func;\n };\n\n Inlines.prototype.compile = function compile(sexp, builder) {\n var value = sexp[1];\n // TODO: Fix this so that expression macros can return\n // things like components, so that {{component foo}}\n // is the same as {{(component foo)}}\n if (!Array.isArray(value)) return ['expr', value];\n var name = void 0;\n var params = void 0;\n var hash = void 0;\n if (value[0] === Ops$3.Helper) {\n name = value[1];\n params = value[2];\n hash = value[3];\n } else if (value[0] === Ops$3.Unknown) {\n name = value[1];\n params = hash = null;\n } else {\n return ['expr', value];\n }\n var index = this.names[name];\n if (index === undefined && this.missing) {\n var func = this.missing;\n var returned = func(name, params, hash, builder);\n return returned === false ? ['expr', value] : returned;\n } else if (index !== undefined) {\n var _func2 = this.funcs[index];\n var _returned = _func2(name, params, hash, builder);\n return _returned === false ? ['expr', value] : _returned;\n } else {\n return ['expr', value];\n }\n };\n\n return Inlines;\n }();\n var INLINES = new Inlines();\n populateBuiltins(BLOCKS, INLINES);\n function populateBuiltins() {\n var blocks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : new Blocks();\n var inlines = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Inlines();\n\n blocks.add('if', function (params, _hash, template, inverse, builder) {\n // PutArgs\n // Test(Environment)\n // Enter(BEGIN, END)\n // BEGIN: Noop\n // JumpUnless(ELSE)\n // Evaluate(default)\n // Jump(END)\n // ELSE: Noop\n // Evalulate(inverse)\n // END: Noop\n // Exit\n if (!params || params.length !== 1) {\n throw new Error('SYNTAX ERROR: #if requires a single argument');\n }\n builder.startLabels();\n builder.pushFrame();\n builder.returnTo('END');\n expr(params[0], builder);\n builder.test('environment');\n builder.enter(1);\n builder.jumpUnless('ELSE');\n builder.invokeStatic(template);\n if (inverse) {\n builder.jump('EXIT');\n builder.label('ELSE');\n builder.invokeStatic(inverse);\n builder.label('EXIT');\n builder.exit();\n builder.return();\n } else {\n builder.label('ELSE');\n builder.exit();\n builder.return();\n }\n builder.label('END');\n builder.popFrame();\n builder.stopLabels();\n });\n blocks.add('unless', function (params, _hash, template, inverse, builder) {\n // PutArgs\n // Test(Environment)\n // Enter(BEGIN, END)\n // BEGIN: Noop\n // JumpUnless(ELSE)\n // Evaluate(default)\n // Jump(END)\n // ELSE: Noop\n // Evalulate(inverse)\n // END: Noop\n // Exit\n if (!params || params.length !== 1) {\n throw new Error('SYNTAX ERROR: #unless requires a single argument');\n }\n builder.startLabels();\n builder.pushFrame();\n builder.returnTo('END');\n expr(params[0], builder);\n builder.test('environment');\n builder.enter(1);\n builder.jumpIf('ELSE');\n builder.invokeStatic(template);\n if (inverse) {\n builder.jump('EXIT');\n builder.label('ELSE');\n builder.invokeStatic(inverse);\n builder.label('EXIT');\n builder.exit();\n builder.return();\n } else {\n builder.label('ELSE');\n builder.exit();\n builder.return();\n }\n builder.label('END');\n builder.popFrame();\n builder.stopLabels();\n });\n blocks.add('with', function (params, _hash, template, inverse, builder) {\n // PutArgs\n // Test(Environment)\n // Enter(BEGIN, END)\n // BEGIN: Noop\n // JumpUnless(ELSE)\n // Evaluate(default)\n // Jump(END)\n // ELSE: Noop\n // Evalulate(inverse)\n // END: Noop\n // Exit\n if (!params || params.length !== 1) {\n throw new Error('SYNTAX ERROR: #with requires a single argument');\n }\n builder.startLabels();\n builder.pushFrame();\n builder.returnTo('END');\n expr(params[0], builder);\n builder.dup();\n builder.test('environment');\n builder.enter(2);\n builder.jumpUnless('ELSE');\n builder.invokeStatic(template, 1);\n if (inverse) {\n builder.jump('EXIT');\n builder.label('ELSE');\n builder.invokeStatic(inverse);\n builder.label('EXIT');\n builder.exit();\n builder.return();\n } else {\n builder.label('ELSE');\n builder.exit();\n builder.return();\n }\n builder.label('END');\n builder.popFrame();\n builder.stopLabels();\n });\n blocks.add('each', function (params, hash, template, inverse, builder) {\n // Enter(BEGIN, END)\n // BEGIN: Noop\n // PutArgs\n // PutIterable\n // JumpUnless(ELSE)\n // EnterList(BEGIN2, END2)\n // ITER: Noop\n // NextIter(BREAK)\n // BEGIN2: Noop\n // PushChildScope\n // Evaluate(default)\n // PopScope\n // END2: Noop\n // Exit\n // Jump(ITER)\n // BREAK: Noop\n // ExitList\n // Jump(END)\n // ELSE: Noop\n // Evalulate(inverse)\n // END: Noop\n // Exit\n builder.startLabels();\n builder.pushFrame();\n builder.returnTo('END');\n if (hash && hash[0][0] === 'key') {\n expr(hash[1][0], builder);\n } else {\n builder.primitive(null);\n }\n expr(params[0], builder);\n builder.enter(2);\n builder.putIterator();\n builder.jumpUnless('ELSE');\n builder.pushFrame();\n builder.returnTo('ITER');\n builder.dup(Register.fp, 1);\n builder.enterList('BODY');\n builder.label('ITER');\n builder.iterate('BREAK');\n builder.label('BODY');\n builder.invokeStatic(template, 2);\n builder.pop(2);\n builder.exit();\n builder.return();\n builder.label('BREAK');\n builder.exitList();\n builder.popFrame();\n if (inverse) {\n builder.jump('EXIT');\n builder.label('ELSE');\n builder.invokeStatic(inverse);\n builder.label('EXIT');\n builder.exit();\n builder.return();\n } else {\n builder.label('ELSE');\n builder.exit();\n builder.return();\n }\n builder.label('END');\n builder.popFrame();\n builder.stopLabels();\n });\n blocks.add('-in-element', function (params, hash, template, _inverse, builder) {\n if (!params || params.length !== 1) {\n throw new Error('SYNTAX ERROR: #-in-element requires a single argument');\n }\n builder.startLabels();\n builder.pushFrame();\n builder.returnTo('END');\n if (hash && hash[0].length) {\n var keys = hash[0],\n values = hash[1];\n\n if (keys.length === 1 && keys[0] === 'nextSibling') {\n expr(values[0], builder);\n } else {\n throw new Error('SYNTAX ERROR: #-in-element does not take a `' + keys[0] + '` option');\n }\n } else {\n expr(null, builder);\n }\n expr(params[0], builder);\n builder.dup();\n builder.test('simple');\n builder.enter(3);\n builder.jumpUnless('ELSE');\n builder.pushRemoteElement();\n builder.invokeStatic(template);\n builder.popRemoteElement();\n builder.label('ELSE');\n builder.exit();\n builder.return();\n builder.label('END');\n builder.popFrame();\n builder.stopLabels();\n });\n blocks.add('-with-dynamic-vars', function (_params, hash, template, _inverse, builder) {\n if (hash) {\n var names = hash[0],\n expressions = hash[1];\n\n compileList(expressions, builder);\n builder.pushDynamicScope();\n builder.bindDynamicScope(names);\n builder.invokeStatic(template);\n builder.popDynamicScope();\n } else {\n builder.invokeStatic(template);\n }\n });\n return { blocks: blocks, inlines: inlines };\n }\n function compileStatement(statement, builder) {\n STATEMENTS.compile(statement, builder);\n }\n function compileStatements(statements, meta, env) {\n var b = new OpcodeBuilder(env, meta);\n for (var i = 0; i < statements.length; i++) {\n compileStatement(statements[i], b);\n }\n return b;\n }\n\n function _classCallCheck$16(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n var CompilableTemplate = function () {\n function CompilableTemplate(statements, symbolTable) {\n _classCallCheck$16(this, CompilableTemplate);\n\n this.statements = statements;\n this.symbolTable = symbolTable;\n this.compiledStatic = null;\n this.compiledDynamic = null;\n }\n\n CompilableTemplate.prototype.compileStatic = function compileStatic(env) {\n var compiledStatic = this.compiledStatic;\n\n if (!compiledStatic) {\n var builder = compileStatements(this.statements, this.symbolTable.meta, env);\n builder.finalize();\n var handle = builder.start;\n compiledStatic = this.compiledStatic = new CompiledStaticTemplate(handle);\n }\n return compiledStatic;\n };\n\n CompilableTemplate.prototype.compileDynamic = function compileDynamic(env) {\n var compiledDynamic = this.compiledDynamic;\n\n if (!compiledDynamic) {\n var staticBlock = this.compileStatic(env);\n compiledDynamic = new CompiledDynamicTemplate(staticBlock.handle, this.symbolTable);\n }\n return compiledDynamic;\n };\n\n return CompilableTemplate;\n }();\n\n function _classCallCheck$15(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n var Ops$1 = _wireFormat.Ops;\n\n var Scanner = function () {\n function Scanner(block, env) {\n _classCallCheck$15(this, Scanner);\n\n this.block = block;\n this.env = env;\n }\n\n Scanner.prototype.scanEntryPoint = function scanEntryPoint(meta) {\n var block = this.block;\n var statements = block.statements,\n symbols = block.symbols,\n hasEval = block.hasEval;\n\n return new CompilableTemplate(statements, { meta: meta, symbols: symbols, hasEval: hasEval });\n };\n\n Scanner.prototype.scanBlock = function scanBlock(meta) {\n var block = this.block;\n var statements = block.statements;\n\n return new CompilableTemplate(statements, { meta: meta, parameters: _util.EMPTY_ARRAY });\n };\n\n Scanner.prototype.scanLayout = function scanLayout(meta, attrs, componentName) {\n var block = this.block;\n var statements = block.statements,\n symbols = block.symbols,\n hasEval = block.hasEval;\n\n var symbolTable = { meta: meta, hasEval: hasEval, symbols: symbols };\n var newStatements = [];\n var toplevel = void 0;\n var inTopLevel = false;\n for (var i = 0; i < statements.length; i++) {\n var statement = statements[i];\n if (_wireFormat.Statements.isComponent(statement)) {\n var tagName = statement[1];\n if (!this.env.hasComponentDefinition(tagName, meta.templateMeta)) {\n if (toplevel !== undefined) {\n newStatements.push([Ops$1.OpenElement, tagName]);\n } else {\n toplevel = tagName;\n decorateTopLevelElement(tagName, symbols, attrs, newStatements);\n }\n addFallback(statement, newStatements);\n } else {\n if (toplevel === undefined && tagName === componentName) {\n toplevel = tagName;\n decorateTopLevelElement(tagName, symbols, attrs, newStatements);\n addFallback(statement, newStatements);\n } else {\n newStatements.push(statement);\n }\n }\n } else {\n if (toplevel === undefined && _wireFormat.Statements.isOpenElement(statement)) {\n toplevel = statement[1];\n inTopLevel = true;\n decorateTopLevelElement(toplevel, symbols, attrs, newStatements);\n } else {\n if (inTopLevel) {\n if (_wireFormat.Statements.isFlushElement(statement)) {\n inTopLevel = false;\n } else if (_wireFormat.Statements.isModifier(statement)) {\n throw Error('Found modifier \"' + statement[1] + '\" on the top-level element of \"' + componentName + '\". Modifiers cannot be on the top-level element');\n }\n }\n newStatements.push(statement);\n }\n }\n }\n newStatements.push([Ops$1.ClientSideStatement, Ops$2.DidRenderLayout]);\n return new CompilableTemplate(newStatements, symbolTable);\n };\n\n return Scanner;\n }();\n\n function addFallback(statement, buffer) {\n var attrs = statement[2],\n block = statement[4];\n\n for (var i = 0; i < attrs.length; i++) {\n buffer.push(attrs[i]);\n }\n buffer.push([Ops$1.FlushElement]);\n if (block) {\n var statements = block.statements;\n\n for (var _i = 0; _i < statements.length; _i++) {\n buffer.push(statements[_i]);\n }\n }\n buffer.push([Ops$1.CloseElement]);\n }\n function decorateTopLevelElement(tagName, symbols, attrs, buffer) {\n var attrsSymbol = symbols.push(ATTRS_BLOCK);\n buffer.push([Ops$1.ClientSideStatement, Ops$2.OpenComponentElement, tagName]);\n buffer.push([Ops$1.ClientSideStatement, Ops$2.DidCreateElement]);\n buffer.push([Ops$1.Yield, attrsSymbol, _util.EMPTY_ARRAY]);\n buffer.push.apply(buffer, attrs);\n }\n\n function _classCallCheck$24(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n var Constants = function () {\n function Constants() {\n _classCallCheck$24(this, Constants);\n\n // `0` means NULL\n this.references = [];\n this.strings = [];\n this.expressions = [];\n this.floats = [];\n this.arrays = [];\n this.blocks = [];\n this.functions = [];\n this.others = [];\n }\n\n Constants.prototype.getReference = function getReference(value) {\n return this.references[value - 1];\n };\n\n Constants.prototype.reference = function reference$$1(value) {\n var index = this.references.length;\n this.references.push(value);\n return index + 1;\n };\n\n Constants.prototype.getString = function getString(value) {\n return this.strings[value - 1];\n };\n\n Constants.prototype.getFloat = function getFloat(value) {\n return this.floats[value - 1];\n };\n\n Constants.prototype.float = function float(value) {\n return this.floats.push(value);\n };\n\n Constants.prototype.string = function string(value) {\n var index = this.strings.length;\n this.strings.push(value);\n return index + 1;\n };\n\n Constants.prototype.getExpression = function getExpression(value) {\n return this.expressions[value - 1];\n };\n\n Constants.prototype.getArray = function getArray(value) {\n return this.arrays[value - 1];\n };\n\n Constants.prototype.getNames = function getNames(value) {\n var _names = [];\n var names = this.getArray(value);\n for (var i = 0; i < names.length; i++) {\n var n = names[i];\n _names[i] = this.getString(n);\n }\n return _names;\n };\n\n Constants.prototype.array = function array(values) {\n var index = this.arrays.length;\n this.arrays.push(values);\n return index + 1;\n };\n\n Constants.prototype.getBlock = function getBlock(value) {\n return this.blocks[value - 1];\n };\n\n Constants.prototype.block = function block(_block) {\n var index = this.blocks.length;\n this.blocks.push(_block);\n return index + 1;\n };\n\n Constants.prototype.getFunction = function getFunction(value) {\n return this.functions[value - 1];\n };\n\n Constants.prototype.function = function _function(f) {\n var index = this.functions.length;\n this.functions.push(f);\n return index + 1;\n };\n\n Constants.prototype.getOther = function getOther(value) {\n return this.others[value - 1];\n };\n\n Constants.prototype.other = function other(_other) {\n var index = this.others.length;\n this.others.push(_other);\n return index + 1;\n };\n\n return Constants;\n }();\n\n var badProtocols = ['javascript:', 'vbscript:'];\n var badTags = ['A', 'BODY', 'LINK', 'IMG', 'IFRAME', 'BASE', 'FORM'];\n var badTagsForDataURI = ['EMBED'];\n var badAttributes = ['href', 'src', 'background', 'action'];\n var badAttributesForDataURI = ['src'];\n function has(array, item) {\n return array.indexOf(item) !== -1;\n }\n function checkURI(tagName, attribute) {\n return (tagName === null || has(badTags, tagName)) && has(badAttributes, attribute);\n }\n function checkDataURI(tagName, attribute) {\n if (tagName === null) return false;\n return has(badTagsForDataURI, tagName) && has(badAttributesForDataURI, attribute);\n }\n function requiresSanitization(tagName, attribute) {\n return checkURI(tagName, attribute) || checkDataURI(tagName, attribute);\n }\n function sanitizeAttributeValue(env, element, attribute, value) {\n var tagName = null;\n if (value === null || value === undefined) {\n return value;\n }\n if (isSafeString(value)) {\n return value.toHTML();\n }\n if (!element) {\n tagName = null;\n } else {\n tagName = element.tagName.toUpperCase();\n }\n var str = normalizeTextValue(value);\n if (checkURI(tagName, attribute)) {\n var protocol = env.protocolForURL(str);\n if (has(badProtocols, protocol)) {\n return 'unsafe:' + str;\n }\n }\n if (checkDataURI(tagName, attribute)) {\n return 'unsafe:' + str;\n }\n return str;\n }\n\n /*\n * @method normalizeProperty\n * @param element {HTMLElement}\n * @param slotName {String}\n * @returns {Object} { name, type }\n */\n function normalizeProperty(element, slotName) {\n var type = void 0,\n normalized = void 0;\n if (slotName in element) {\n normalized = slotName;\n type = 'prop';\n } else {\n var lower = slotName.toLowerCase();\n if (lower in element) {\n type = 'prop';\n normalized = lower;\n } else {\n type = 'attr';\n normalized = slotName;\n }\n }\n if (type === 'prop' && (normalized.toLowerCase() === 'style' || preferAttr(element.tagName, normalized))) {\n type = 'attr';\n }\n return { normalized: normalized, type: type };\n }\n\n // properties that MUST be set as attributes, due to:\n // * browser bug\n // * strange spec outlier\n var ATTR_OVERRIDES = {\n // phantomjs < 2.0 lets you set it as a prop but won't reflect it\n // back to the attribute. button.getAttribute('type') === null\n BUTTON: { type: true, form: true },\n INPUT: {\n // Some version of IE (like IE9) actually throw an exception\n // if you set input.type = 'something-unknown'\n type: true,\n form: true,\n // Chrome 46.0.2464.0: 'autocorrect' in document.createElement('input') === false\n // Safari 8.0.7: 'autocorrect' in document.createElement('input') === false\n // Mobile Safari (iOS 8.4 simulator): 'autocorrect' in document.createElement('input') === true\n autocorrect: true,\n // Chrome 54.0.2840.98: 'list' in document.createElement('input') === true\n // Safari 9.1.3: 'list' in document.createElement('input') === false\n list: true\n },\n // element.form is actually a legitimate readOnly property, that is to be\n // mutated, but must be mutated by setAttribute...\n SELECT: { form: true },\n OPTION: { form: true },\n TEXTAREA: { form: true },\n LABEL: { form: true },\n FIELDSET: { form: true },\n LEGEND: { form: true },\n OBJECT: { form: true }\n };\n function preferAttr(tagName, propName) {\n var tag = ATTR_OVERRIDES[tagName.toUpperCase()];\n return tag && tag[propName.toLowerCase()] || false;\n }\n\n function _defaults$12(obj, defaults) {\n var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {\n var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {\n Object.defineProperty(obj, key, value);\n }\n }return obj;\n }\n\n function _classCallCheck$27(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _possibleConstructorReturn$12(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n }\n\n function _inherits$12(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults$12(subClass, superClass);\n }\n\n var innerHTMLWrapper = {\n colgroup: { depth: 2, before: '<table><colgroup>', after: '</colgroup></table>' },\n table: { depth: 1, before: '<table>', after: '</table>' },\n tbody: { depth: 2, before: '<table><tbody>', after: '</tbody></table>' },\n tfoot: { depth: 2, before: '<table><tfoot>', after: '</tfoot></table>' },\n thead: { depth: 2, before: '<table><thead>', after: '</thead></table>' },\n tr: { depth: 3, before: '<table><tbody><tr>', after: '</tr></tbody></table>' }\n };\n // Patch: innerHTML Fix\n // Browsers: IE9\n // Reason: IE9 don't allow us to set innerHTML on col, colgroup, frameset,\n // html, style, table, tbody, tfoot, thead, title, tr.\n // Fix: Wrap the innerHTML we are about to set in its parents, apply the\n // wrapped innerHTML on a div, then move the unwrapped nodes into the\n // target position.\n function domChanges(document, DOMChangesClass) {\n if (!document) return DOMChangesClass;\n if (!shouldApplyFix(document)) {\n return DOMChangesClass;\n }\n var div = document.createElement('div');\n return function (_DOMChangesClass) {\n _inherits$12(DOMChangesWithInnerHTMLFix, _DOMChangesClass);\n\n function DOMChangesWithInnerHTMLFix() {\n _classCallCheck$27(this, DOMChangesWithInnerHTMLFix);\n\n return _possibleConstructorReturn$12(this, _DOMChangesClass.apply(this, arguments));\n }\n\n DOMChangesWithInnerHTMLFix.prototype.insertHTMLBefore = function insertHTMLBefore(parent, nextSibling, html) {\n if (html === null || html === '') {\n return _DOMChangesClass.prototype.insertHTMLBefore.call(this, parent, nextSibling, html);\n }\n var parentTag = parent.tagName.toLowerCase();\n var wrapper = innerHTMLWrapper[parentTag];\n if (wrapper === undefined) {\n return _DOMChangesClass.prototype.insertHTMLBefore.call(this, parent, nextSibling, html);\n }\n return fixInnerHTML(parent, wrapper, div, html, nextSibling);\n };\n\n return DOMChangesWithInnerHTMLFix;\n }(DOMChangesClass);\n }\n function treeConstruction(document, DOMTreeConstructionClass) {\n if (!document) return DOMTreeConstructionClass;\n if (!shouldApplyFix(document)) {\n return DOMTreeConstructionClass;\n }\n var div = document.createElement('div');\n return function (_DOMTreeConstructionC) {\n _inherits$12(DOMTreeConstructionWithInnerHTMLFix, _DOMTreeConstructionC);\n\n function DOMTreeConstructionWithInnerHTMLFix() {\n _classCallCheck$27(this, DOMTreeConstructionWithInnerHTMLFix);\n\n return _possibleConstructorReturn$12(this, _DOMTreeConstructionC.apply(this, arguments));\n }\n\n DOMTreeConstructionWithInnerHTMLFix.prototype.insertHTMLBefore = function insertHTMLBefore(parent, referenceNode, html) {\n if (html === null || html === '') {\n return _DOMTreeConstructionC.prototype.insertHTMLBefore.call(this, parent, referenceNode, html);\n }\n var parentTag = parent.tagName.toLowerCase();\n var wrapper = innerHTMLWrapper[parentTag];\n if (wrapper === undefined) {\n return _DOMTreeConstructionC.prototype.insertHTMLBefore.call(this, parent, referenceNode, html);\n }\n return fixInnerHTML(parent, wrapper, div, html, referenceNode);\n };\n\n return DOMTreeConstructionWithInnerHTMLFix;\n }(DOMTreeConstructionClass);\n }\n function fixInnerHTML(parent, wrapper, div, html, reference$$1) {\n var wrappedHtml = wrapper.before + html + wrapper.after;\n div.innerHTML = wrappedHtml;\n var parentNode = div;\n for (var i = 0; i < wrapper.depth; i++) {\n parentNode = parentNode.childNodes[0];\n }\n\n var _moveNodesBefore = moveNodesBefore(parentNode, parent, reference$$1),\n first = _moveNodesBefore[0],\n last = _moveNodesBefore[1];\n\n return new ConcreteBounds(parent, first, last);\n }\n function shouldApplyFix(document) {\n var table = document.createElement('table');\n try {\n table.innerHTML = '<tbody></tbody>';\n } catch (e) {} finally {\n if (table.childNodes.length !== 0) {\n // It worked as expected, no fix required\n return false;\n }\n }\n return true;\n }\n\n function _defaults$13(obj, defaults) {\n var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {\n var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {\n Object.defineProperty(obj, key, value);\n }\n }return obj;\n }\n\n function _classCallCheck$28(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _possibleConstructorReturn$13(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n }\n\n function _inherits$13(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults$13(subClass, superClass);\n }\n\n var SVG_NAMESPACE$1 = 'http://www.w3.org/2000/svg';\n // Patch: insertAdjacentHTML on SVG Fix\n // Browsers: Safari, IE, Edge, Firefox ~33-34\n // Reason: insertAdjacentHTML does not exist on SVG elements in Safari. It is\n // present but throws an exception on IE and Edge. Old versions of\n // Firefox create nodes in the incorrect namespace.\n // Fix: Since IE and Edge silently fail to create SVG nodes using\n // innerHTML, and because Firefox may create nodes in the incorrect\n // namespace using innerHTML on SVG elements, an HTML-string wrapping\n // approach is used. A pre/post SVG tag is added to the string, then\n // that whole string is added to a div. The created nodes are plucked\n // out and applied to the target location on DOM.\n function domChanges$1(document, DOMChangesClass, svgNamespace) {\n if (!document) return DOMChangesClass;\n if (!shouldApplyFix$1(document, svgNamespace)) {\n return DOMChangesClass;\n }\n var div = document.createElement('div');\n return function (_DOMChangesClass) {\n _inherits$13(DOMChangesWithSVGInnerHTMLFix, _DOMChangesClass);\n\n function DOMChangesWithSVGInnerHTMLFix() {\n _classCallCheck$28(this, DOMChangesWithSVGInnerHTMLFix);\n\n return _possibleConstructorReturn$13(this, _DOMChangesClass.apply(this, arguments));\n }\n\n DOMChangesWithSVGInnerHTMLFix.prototype.insertHTMLBefore = function insertHTMLBefore(parent, nextSibling, html) {\n if (html === null || html === '') {\n return _DOMChangesClass.prototype.insertHTMLBefore.call(this, parent, nextSibling, html);\n }\n if (parent.namespaceURI !== svgNamespace) {\n return _DOMChangesClass.prototype.insertHTMLBefore.call(this, parent, nextSibling, html);\n }\n return fixSVG(parent, div, html, nextSibling);\n };\n\n return DOMChangesWithSVGInnerHTMLFix;\n }(DOMChangesClass);\n }\n function treeConstruction$1(document, TreeConstructionClass, svgNamespace) {\n if (!document) return TreeConstructionClass;\n if (!shouldApplyFix$1(document, svgNamespace)) {\n return TreeConstructionClass;\n }\n var div = document.createElement('div');\n return function (_TreeConstructionClas) {\n _inherits$13(TreeConstructionWithSVGInnerHTMLFix, _TreeConstructionClas);\n\n function TreeConstructionWithSVGInnerHTMLFix() {\n _classCallCheck$28(this, TreeConstructionWithSVGInnerHTMLFix);\n\n return _possibleConstructorReturn$13(this, _TreeConstructionClas.apply(this, arguments));\n }\n\n TreeConstructionWithSVGInnerHTMLFix.prototype.insertHTMLBefore = function insertHTMLBefore(parent, reference$$1, html) {\n if (html === null || html === '') {\n return _TreeConstructionClas.prototype.insertHTMLBefore.call(this, parent, reference$$1, html);\n }\n if (parent.namespaceURI !== svgNamespace) {\n return _TreeConstructionClas.prototype.insertHTMLBefore.call(this, parent, reference$$1, html);\n }\n return fixSVG(parent, div, html, reference$$1);\n };\n\n return TreeConstructionWithSVGInnerHTMLFix;\n }(TreeConstructionClass);\n }\n function fixSVG(parent, div, html, reference$$1) {\n // IE, Edge: also do not correctly support using `innerHTML` on SVG\n // namespaced elements. So here a wrapper is used.\n var wrappedHtml = '<svg>' + html + '</svg>';\n div.innerHTML = wrappedHtml;\n\n var _moveNodesBefore = moveNodesBefore(div.firstChild, parent, reference$$1),\n first = _moveNodesBefore[0],\n last = _moveNodesBefore[1];\n\n return new ConcreteBounds(parent, first, last);\n }\n function shouldApplyFix$1(document, svgNamespace) {\n var svg = document.createElementNS(svgNamespace, 'svg');\n try {\n svg['insertAdjacentHTML']('beforeend', '<circle></circle>');\n } catch (e) {\n // IE, Edge: Will throw, insertAdjacentHTML is unsupported on SVG\n // Safari: Will throw, insertAdjacentHTML is not present on SVG\n } finally {\n // FF: Old versions will create a node in the wrong namespace\n if (svg.childNodes.length === 1 && svg.firstChild.namespaceURI === SVG_NAMESPACE$1) {\n // The test worked as expected, no fix required\n return false;\n }\n return true;\n }\n }\n\n function _defaults$14(obj, defaults) {\n var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {\n var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {\n Object.defineProperty(obj, key, value);\n }\n }return obj;\n }\n\n function _classCallCheck$29(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _possibleConstructorReturn$14(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n }\n\n function _inherits$14(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults$14(subClass, superClass);\n }\n\n // Patch: Adjacent text node merging fix\n // Browsers: IE, Edge, Firefox w/o inspector open\n // Reason: These browsers will merge adjacent text nodes. For exmaple given\n // <div>Hello</div> with div.insertAdjacentHTML(' world') browsers\n // with proper behavior will populate div.childNodes with two items.\n // These browsers will populate it with one merged node instead.\n // Fix: Add these nodes to a wrapper element, then iterate the childNodes\n // of that wrapper and move the nodes to their target location. Note\n // that potential SVG bugs will have been handled before this fix.\n // Note that this fix must only apply to the previous text node, as\n // the base implementation of `insertHTMLBefore` already handles\n // following text nodes correctly.\n function domChanges$2(document, DOMChangesClass) {\n if (!document) return DOMChangesClass;\n if (!shouldApplyFix$2(document)) {\n return DOMChangesClass;\n }\n return function (_DOMChangesClass) {\n _inherits$14(DOMChangesWithTextNodeMergingFix, _DOMChangesClass);\n\n function DOMChangesWithTextNodeMergingFix(document) {\n _classCallCheck$29(this, DOMChangesWithTextNodeMergingFix);\n\n var _this = _possibleConstructorReturn$14(this, _DOMChangesClass.call(this, document));\n\n _this.uselessComment = document.createComment('');\n return _this;\n }\n\n DOMChangesWithTextNodeMergingFix.prototype.insertHTMLBefore = function insertHTMLBefore(parent, nextSibling, html) {\n if (html === null) {\n return _DOMChangesClass.prototype.insertHTMLBefore.call(this, parent, nextSibling, html);\n }\n var didSetUselessComment = false;\n var nextPrevious = nextSibling ? nextSibling.previousSibling : parent.lastChild;\n if (nextPrevious && nextPrevious instanceof Text) {\n didSetUselessComment = true;\n parent.insertBefore(this.uselessComment, nextSibling);\n }\n var bounds = _DOMChangesClass.prototype.insertHTMLBefore.call(this, parent, nextSibling, html);\n if (didSetUselessComment) {\n parent.removeChild(this.uselessComment);\n }\n return bounds;\n };\n\n return DOMChangesWithTextNodeMergingFix;\n }(DOMChangesClass);\n }\n function treeConstruction$2(document, TreeConstructionClass) {\n if (!document) return TreeConstructionClass;\n if (!shouldApplyFix$2(document)) {\n return TreeConstructionClass;\n }\n return function (_TreeConstructionClas) {\n _inherits$14(TreeConstructionWithTextNodeMergingFix, _TreeConstructionClas);\n\n function TreeConstructionWithTextNodeMergingFix(document) {\n _classCallCheck$29(this, TreeConstructionWithTextNodeMergingFix);\n\n var _this2 = _possibleConstructorReturn$14(this, _TreeConstructionClas.call(this, document));\n\n _this2.uselessComment = _this2.createComment('');\n return _this2;\n }\n\n TreeConstructionWithTextNodeMergingFix.prototype.insertHTMLBefore = function insertHTMLBefore(parent, reference$$1, html) {\n if (html === null) {\n return _TreeConstructionClas.prototype.insertHTMLBefore.call(this, parent, reference$$1, html);\n }\n var didSetUselessComment = false;\n var nextPrevious = reference$$1 ? reference$$1.previousSibling : parent.lastChild;\n if (nextPrevious && nextPrevious instanceof Text) {\n didSetUselessComment = true;\n parent.insertBefore(this.uselessComment, reference$$1);\n }\n var bounds = _TreeConstructionClas.prototype.insertHTMLBefore.call(this, parent, reference$$1, html);\n if (didSetUselessComment) {\n parent.removeChild(this.uselessComment);\n }\n return bounds;\n };\n\n return TreeConstructionWithTextNodeMergingFix;\n }(TreeConstructionClass);\n }\n function shouldApplyFix$2(document) {\n var mergingTextDiv = document.createElement('div');\n mergingTextDiv.innerHTML = 'first';\n mergingTextDiv.insertAdjacentHTML('beforeend', 'second');\n if (mergingTextDiv.childNodes.length === 2) {\n // It worked as expected, no fix required\n return false;\n }\n return true;\n }\n\n function _defaults$11(obj, defaults) {\n var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {\n var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {\n Object.defineProperty(obj, key, value);\n }\n }return obj;\n }\n\n function _possibleConstructorReturn$11(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n }\n\n function _inherits$11(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults$11(subClass, superClass);\n }\n\n function _classCallCheck$26(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n var SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n // http://www.w3.org/TR/html/syntax.html#html-integration-point\n var SVG_INTEGRATION_POINTS = { foreignObject: 1, desc: 1, title: 1 };\n // http://www.w3.org/TR/html/syntax.html#adjust-svg-attributes\n // TODO: Adjust SVG attributes\n // http://www.w3.org/TR/html/syntax.html#parsing-main-inforeign\n // TODO: Adjust SVG elements\n // http://www.w3.org/TR/html/syntax.html#parsing-main-inforeign\n var BLACKLIST_TABLE = Object.create(null);\n [\"b\", \"big\", \"blockquote\", \"body\", \"br\", \"center\", \"code\", \"dd\", \"div\", \"dl\", \"dt\", \"em\", \"embed\", \"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"head\", \"hr\", \"i\", \"img\", \"li\", \"listing\", \"main\", \"meta\", \"nobr\", \"ol\", \"p\", \"pre\", \"ruby\", \"s\", \"small\", \"span\", \"strong\", \"strike\", \"sub\", \"sup\", \"table\", \"tt\", \"u\", \"ul\", \"var\"].forEach(function (tag) {\n return BLACKLIST_TABLE[tag] = 1;\n });\n var WHITESPACE = /[\\t-\\r \\xA0\\u1680\\u180E\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000\\uFEFF]/;\n var doc = typeof document === 'undefined' ? null : document;\n function isWhitespace(string) {\n return WHITESPACE.test(string);\n }\n function moveNodesBefore(source, target, nextSibling) {\n var first = source.firstChild;\n var last = null;\n var current = first;\n while (current) {\n last = current;\n current = current.nextSibling;\n target.insertBefore(last, nextSibling);\n }\n return [first, last];\n }\n var DOMOperations = function () {\n function DOMOperations(document) {\n _classCallCheck$26(this, DOMOperations);\n\n this.document = document;\n this.setupUselessElement();\n }\n // split into seperate method so that NodeDOMTreeConstruction\n // can override it.\n\n\n DOMOperations.prototype.setupUselessElement = function setupUselessElement() {\n this.uselessElement = this.document.createElement('div');\n };\n\n DOMOperations.prototype.createElement = function createElement(tag, context) {\n var isElementInSVGNamespace = void 0,\n isHTMLIntegrationPoint = void 0;\n if (context) {\n isElementInSVGNamespace = context.namespaceURI === SVG_NAMESPACE || tag === 'svg';\n isHTMLIntegrationPoint = SVG_INTEGRATION_POINTS[context.tagName];\n } else {\n isElementInSVGNamespace = tag === 'svg';\n isHTMLIntegrationPoint = false;\n }\n if (isElementInSVGNamespace && !isHTMLIntegrationPoint) {\n // FIXME: This does not properly handle <font> with color, face, or\n // size attributes, which is also disallowed by the spec. We should fix\n // this.\n if (BLACKLIST_TABLE[tag]) {\n throw new Error('Cannot create a ' + tag + ' inside an SVG context');\n }\n return this.document.createElementNS(SVG_NAMESPACE, tag);\n } else {\n return this.document.createElement(tag);\n }\n };\n\n DOMOperations.prototype.insertBefore = function insertBefore(parent, node, reference$$1) {\n parent.insertBefore(node, reference$$1);\n };\n\n DOMOperations.prototype.insertHTMLBefore = function insertHTMLBefore(_parent, nextSibling, html) {\n return _insertHTMLBefore(this.uselessElement, _parent, nextSibling, html);\n };\n\n DOMOperations.prototype.createTextNode = function createTextNode(text) {\n return this.document.createTextNode(text);\n };\n\n DOMOperations.prototype.createComment = function createComment(data) {\n return this.document.createComment(data);\n };\n\n return DOMOperations;\n }();\n var DOM;\n (function (DOM) {\n var TreeConstruction = function (_DOMOperations) {\n _inherits$11(TreeConstruction, _DOMOperations);\n\n function TreeConstruction() {\n _classCallCheck$26(this, TreeConstruction);\n\n return _possibleConstructorReturn$11(this, _DOMOperations.apply(this, arguments));\n }\n\n TreeConstruction.prototype.createElementNS = function createElementNS(namespace, tag) {\n return this.document.createElementNS(namespace, tag);\n };\n\n TreeConstruction.prototype.setAttribute = function setAttribute(element, name, value, namespace) {\n if (namespace) {\n element.setAttributeNS(namespace, name, value);\n } else {\n element.setAttribute(name, value);\n }\n };\n\n return TreeConstruction;\n }(DOMOperations);\n\n DOM.TreeConstruction = TreeConstruction;\n var appliedTreeContruction = TreeConstruction;\n appliedTreeContruction = treeConstruction$2(doc, appliedTreeContruction);\n appliedTreeContruction = treeConstruction(doc, appliedTreeContruction);\n appliedTreeContruction = treeConstruction$1(doc, appliedTreeContruction, SVG_NAMESPACE);\n DOM.DOMTreeConstruction = appliedTreeContruction;\n })(DOM || (DOM = {}));\n var DOMChanges = function (_DOMOperations2) {\n _inherits$11(DOMChanges, _DOMOperations2);\n\n function DOMChanges(document) {\n _classCallCheck$26(this, DOMChanges);\n\n var _this2 = _possibleConstructorReturn$11(this, _DOMOperations2.call(this, document));\n\n _this2.document = document;\n _this2.namespace = null;\n return _this2;\n }\n\n DOMChanges.prototype.setAttribute = function setAttribute(element, name, value) {\n element.setAttribute(name, value);\n };\n\n DOMChanges.prototype.setAttributeNS = function setAttributeNS(element, namespace, name, value) {\n element.setAttributeNS(namespace, name, value);\n };\n\n DOMChanges.prototype.removeAttribute = function removeAttribute(element, name) {\n element.removeAttribute(name);\n };\n\n DOMChanges.prototype.removeAttributeNS = function removeAttributeNS(element, namespace, name) {\n element.removeAttributeNS(namespace, name);\n };\n\n DOMChanges.prototype.insertNodeBefore = function insertNodeBefore(parent, node, reference$$1) {\n if (isDocumentFragment(node)) {\n var firstChild = node.firstChild,\n lastChild = node.lastChild;\n\n this.insertBefore(parent, node, reference$$1);\n return new ConcreteBounds(parent, firstChild, lastChild);\n } else {\n this.insertBefore(parent, node, reference$$1);\n return new SingleNodeBounds(parent, node);\n }\n };\n\n DOMChanges.prototype.insertTextBefore = function insertTextBefore(parent, nextSibling, text) {\n var textNode = this.createTextNode(text);\n this.insertBefore(parent, textNode, nextSibling);\n return textNode;\n };\n\n DOMChanges.prototype.insertBefore = function insertBefore(element, node, reference$$1) {\n element.insertBefore(node, reference$$1);\n };\n\n DOMChanges.prototype.insertAfter = function insertAfter(element, node, reference$$1) {\n this.insertBefore(element, node, reference$$1.nextSibling);\n };\n\n return DOMChanges;\n }(DOMOperations);\n function _insertHTMLBefore(_useless, _parent, _nextSibling, html) {\n // TypeScript vendored an old version of the DOM spec where `insertAdjacentHTML`\n // only exists on `HTMLElement` but not on `Element`. We actually work with the\n // newer version of the DOM API here (and monkey-patch this method in `./compat`\n // when we detect older browsers). This is a hack to work around this limitation.\n var parent = _parent;\n var useless = _useless;\n var nextSibling = _nextSibling;\n var prev = nextSibling ? nextSibling.previousSibling : parent.lastChild;\n var last = void 0;\n if (html === null || html === '') {\n return new ConcreteBounds(parent, null, null);\n }\n if (nextSibling === null) {\n parent.insertAdjacentHTML('beforeend', html);\n last = parent.lastChild;\n } else if (nextSibling instanceof HTMLElement) {\n nextSibling.insertAdjacentHTML('beforebegin', html);\n last = nextSibling.previousSibling;\n } else {\n // Non-element nodes do not support insertAdjacentHTML, so add an\n // element and call it on that element. Then remove the element.\n //\n // This also protects Edge, IE and Firefox w/o the inspector open\n // from merging adjacent text nodes. See ./compat/text-node-merging-fix.ts\n parent.insertBefore(useless, nextSibling);\n useless.insertAdjacentHTML('beforebegin', html);\n last = useless.previousSibling;\n parent.removeChild(useless);\n }\n var first = prev ? prev.nextSibling : parent.firstChild;\n return new ConcreteBounds(parent, first, last);\n }\n function isDocumentFragment(node) {\n return node.nodeType === Node.DOCUMENT_FRAGMENT_NODE;\n }\n var helper = DOMChanges;\n helper = domChanges$2(doc, helper);\n helper = domChanges(doc, helper);\n helper = domChanges$1(doc, helper, SVG_NAMESPACE);\n var helper$1 = helper;\n var DOMTreeConstruction = DOM.DOMTreeConstruction;\n\n function _defaults$10(obj, defaults) {\n var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {\n var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {\n Object.defineProperty(obj, key, value);\n }\n }return obj;\n }\n\n function _possibleConstructorReturn$10(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n }\n\n function _inherits$10(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults$10(subClass, superClass);\n }\n\n function _classCallCheck$25(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function defaultManagers(element, attr, _isTrusting, _namespace) {\n var tagName = element.tagName;\n var isSVG = element.namespaceURI === SVG_NAMESPACE;\n if (isSVG) {\n return defaultAttributeManagers(tagName, attr);\n }\n\n var _normalizeProperty = normalizeProperty(element, attr),\n type = _normalizeProperty.type,\n normalized = _normalizeProperty.normalized;\n\n if (type === 'attr') {\n return defaultAttributeManagers(tagName, normalized);\n } else {\n return defaultPropertyManagers(tagName, normalized);\n }\n }\n function defaultPropertyManagers(tagName, attr) {\n if (requiresSanitization(tagName, attr)) {\n return new SafePropertyManager(attr);\n }\n if (isUserInputValue(tagName, attr)) {\n return INPUT_VALUE_PROPERTY_MANAGER;\n }\n if (isOptionSelected(tagName, attr)) {\n return OPTION_SELECTED_MANAGER;\n }\n return new PropertyManager(attr);\n }\n function defaultAttributeManagers(tagName, attr) {\n if (requiresSanitization(tagName, attr)) {\n return new SafeAttributeManager(attr);\n }\n return new AttributeManager(attr);\n }\n function readDOMAttr(element, attr) {\n var isSVG = element.namespaceURI === SVG_NAMESPACE;\n\n var _normalizeProperty2 = normalizeProperty(element, attr),\n type = _normalizeProperty2.type,\n normalized = _normalizeProperty2.normalized;\n\n if (isSVG) {\n return element.getAttribute(normalized);\n }\n if (type === 'attr') {\n return element.getAttribute(normalized);\n }\n {\n return element[normalized];\n }\n }\n\n var AttributeManager = function () {\n function AttributeManager(attr) {\n _classCallCheck$25(this, AttributeManager);\n\n this.attr = attr;\n }\n\n AttributeManager.prototype.setAttribute = function setAttribute(env, element, value, namespace) {\n var dom = env.getAppendOperations();\n var normalizedValue = normalizeAttributeValue(value);\n if (!isAttrRemovalValue(normalizedValue)) {\n dom.setAttribute(element, this.attr, normalizedValue, namespace);\n }\n };\n\n AttributeManager.prototype.updateAttribute = function updateAttribute(env, element, value, namespace) {\n if (value === null || value === undefined || value === false) {\n if (namespace) {\n env.getDOM().removeAttributeNS(element, namespace, this.attr);\n } else {\n env.getDOM().removeAttribute(element, this.attr);\n }\n } else {\n this.setAttribute(env, element, value);\n }\n };\n\n return AttributeManager;\n }();\n\n var PropertyManager = function (_AttributeManager) {\n _inherits$10(PropertyManager, _AttributeManager);\n\n function PropertyManager() {\n _classCallCheck$25(this, PropertyManager);\n\n return _possibleConstructorReturn$10(this, _AttributeManager.apply(this, arguments));\n }\n\n PropertyManager.prototype.setAttribute = function setAttribute(_env, element, value, _namespace) {\n if (!isAttrRemovalValue(value)) {\n element[this.attr] = value;\n }\n };\n\n PropertyManager.prototype.removeAttribute = function removeAttribute(env, element, namespace) {\n // TODO this sucks but to preserve properties first and to meet current\n // semantics we must do this.\n var attr = this.attr;\n\n if (namespace) {\n env.getDOM().removeAttributeNS(element, namespace, attr);\n } else {\n env.getDOM().removeAttribute(element, attr);\n }\n };\n\n PropertyManager.prototype.updateAttribute = function updateAttribute(env, element, value, namespace) {\n // ensure the property is always updated\n element[this.attr] = value;\n if (isAttrRemovalValue(value)) {\n this.removeAttribute(env, element, namespace);\n }\n };\n\n return PropertyManager;\n }(AttributeManager);\n\n function normalizeAttributeValue(value) {\n if (value === false || value === undefined || value === null) {\n return null;\n }\n if (value === true) {\n return '';\n }\n // onclick function etc in SSR\n if (typeof value === 'function') {\n return null;\n }\n return String(value);\n }\n function isAttrRemovalValue(value) {\n return value === null || value === undefined;\n }\n\n var SafePropertyManager = function (_PropertyManager) {\n _inherits$10(SafePropertyManager, _PropertyManager);\n\n function SafePropertyManager() {\n _classCallCheck$25(this, SafePropertyManager);\n\n return _possibleConstructorReturn$10(this, _PropertyManager.apply(this, arguments));\n }\n\n SafePropertyManager.prototype.setAttribute = function setAttribute(env, element, value) {\n _PropertyManager.prototype.setAttribute.call(this, env, element, sanitizeAttributeValue(env, element, this.attr, value));\n };\n\n SafePropertyManager.prototype.updateAttribute = function updateAttribute(env, element, value) {\n _PropertyManager.prototype.updateAttribute.call(this, env, element, sanitizeAttributeValue(env, element, this.attr, value));\n };\n\n return SafePropertyManager;\n }(PropertyManager);\n\n function isUserInputValue(tagName, attribute) {\n return (tagName === 'INPUT' || tagName === 'TEXTAREA') && attribute === 'value';\n }\n\n var InputValuePropertyManager = function (_AttributeManager2) {\n _inherits$10(InputValuePropertyManager, _AttributeManager2);\n\n function InputValuePropertyManager() {\n _classCallCheck$25(this, InputValuePropertyManager);\n\n return _possibleConstructorReturn$10(this, _AttributeManager2.apply(this, arguments));\n }\n\n InputValuePropertyManager.prototype.setAttribute = function setAttribute(_env, element, value) {\n var input = element;\n input.value = normalizeTextValue(value);\n };\n\n InputValuePropertyManager.prototype.updateAttribute = function updateAttribute(_env, element, value) {\n var input = element;\n var currentValue = input.value;\n var normalizedValue = normalizeTextValue(value);\n if (currentValue !== normalizedValue) {\n input.value = normalizedValue;\n }\n };\n\n return InputValuePropertyManager;\n }(AttributeManager);\n\n var INPUT_VALUE_PROPERTY_MANAGER = new InputValuePropertyManager('value');\n function isOptionSelected(tagName, attribute) {\n return tagName === 'OPTION' && attribute === 'selected';\n }\n\n var OptionSelectedManager = function (_PropertyManager2) {\n _inherits$10(OptionSelectedManager, _PropertyManager2);\n\n function OptionSelectedManager() {\n _classCallCheck$25(this, OptionSelectedManager);\n\n return _possibleConstructorReturn$10(this, _PropertyManager2.apply(this, arguments));\n }\n\n OptionSelectedManager.prototype.setAttribute = function setAttribute(_env, element, value) {\n if (value !== null && value !== undefined && value !== false) {\n var option = element;\n option.selected = true;\n }\n };\n\n OptionSelectedManager.prototype.updateAttribute = function updateAttribute(_env, element, value) {\n var option = element;\n if (value) {\n option.selected = true;\n } else {\n option.selected = false;\n }\n };\n\n return OptionSelectedManager;\n }(PropertyManager);\n\n var OPTION_SELECTED_MANAGER = new OptionSelectedManager('selected');\n\n var SafeAttributeManager = function (_AttributeManager3) {\n _inherits$10(SafeAttributeManager, _AttributeManager3);\n\n function SafeAttributeManager() {\n _classCallCheck$25(this, SafeAttributeManager);\n\n return _possibleConstructorReturn$10(this, _AttributeManager3.apply(this, arguments));\n }\n\n SafeAttributeManager.prototype.setAttribute = function setAttribute(env, element, value) {\n _AttributeManager3.prototype.setAttribute.call(this, env, element, sanitizeAttributeValue(env, element, this.attr, value));\n };\n\n SafeAttributeManager.prototype.updateAttribute = function updateAttribute(env, element, value, _namespace) {\n _AttributeManager3.prototype.updateAttribute.call(this, env, element, sanitizeAttributeValue(env, element, this.attr, value));\n };\n\n return SafeAttributeManager;\n }(AttributeManager);\n\n var _createClass$4 = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n }();\n\n function _classCallCheck$23(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n var Scope = function () {\n function Scope(\n // the 0th slot is `self`\n slots, callerScope,\n // named arguments and blocks passed to a layout that uses eval\n evalScope,\n // locals in scope when the partial was invoked\n partialMap) {\n _classCallCheck$23(this, Scope);\n\n this.slots = slots;\n this.callerScope = callerScope;\n this.evalScope = evalScope;\n this.partialMap = partialMap;\n }\n\n Scope.root = function root(self) {\n var size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n var refs = new Array(size + 1);\n for (var i = 0; i <= size; i++) {\n refs[i] = UNDEFINED_REFERENCE;\n }\n return new Scope(refs, null, null, null).init({ self: self });\n };\n\n Scope.sized = function sized() {\n var size = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\n var refs = new Array(size + 1);\n for (var i = 0; i <= size; i++) {\n refs[i] = UNDEFINED_REFERENCE;\n }\n return new Scope(refs, null, null, null);\n };\n\n Scope.prototype.init = function init(_ref) {\n var self = _ref.self;\n\n this.slots[0] = self;\n return this;\n };\n\n Scope.prototype.getSelf = function getSelf() {\n return this.get(0);\n };\n\n Scope.prototype.getSymbol = function getSymbol(symbol) {\n return this.get(symbol);\n };\n\n Scope.prototype.getBlock = function getBlock(symbol) {\n return this.get(symbol);\n };\n\n Scope.prototype.getEvalScope = function getEvalScope() {\n return this.evalScope;\n };\n\n Scope.prototype.getPartialMap = function getPartialMap() {\n return this.partialMap;\n };\n\n Scope.prototype.bind = function bind(symbol, value) {\n this.set(symbol, value);\n };\n\n Scope.prototype.bindSelf = function bindSelf(self) {\n this.set(0, self);\n };\n\n Scope.prototype.bindSymbol = function bindSymbol(symbol, value) {\n this.set(symbol, value);\n };\n\n Scope.prototype.bindBlock = function bindBlock(symbol, value) {\n this.set(symbol, value);\n };\n\n Scope.prototype.bindEvalScope = function bindEvalScope(map$$1) {\n this.evalScope = map$$1;\n };\n\n Scope.prototype.bindPartialMap = function bindPartialMap(map$$1) {\n this.partialMap = map$$1;\n };\n\n Scope.prototype.bindCallerScope = function bindCallerScope(scope) {\n this.callerScope = scope;\n };\n\n Scope.prototype.getCallerScope = function getCallerScope() {\n return this.callerScope;\n };\n\n Scope.prototype.child = function child() {\n return new Scope(this.slots.slice(), this.callerScope, this.evalScope, this.partialMap);\n };\n\n Scope.prototype.get = function get(index) {\n if (index >= this.slots.length) {\n throw new RangeError('BUG: cannot get $' + index + ' from scope; length=' + this.slots.length);\n }\n return this.slots[index];\n };\n\n Scope.prototype.set = function set(index, value) {\n if (index >= this.slots.length) {\n throw new RangeError('BUG: cannot get $' + index + ' from scope; length=' + this.slots.length);\n }\n this.slots[index] = value;\n };\n\n return Scope;\n }();\n\n var Transaction = function () {\n function Transaction() {\n _classCallCheck$23(this, Transaction);\n\n this.scheduledInstallManagers = [];\n this.scheduledInstallModifiers = [];\n this.scheduledUpdateModifierManagers = [];\n this.scheduledUpdateModifiers = [];\n this.createdComponents = [];\n this.createdManagers = [];\n this.updatedComponents = [];\n this.updatedManagers = [];\n this.destructors = [];\n }\n\n Transaction.prototype.didCreate = function didCreate(component, manager) {\n this.createdComponents.push(component);\n this.createdManagers.push(manager);\n };\n\n Transaction.prototype.didUpdate = function didUpdate(component, manager) {\n this.updatedComponents.push(component);\n this.updatedManagers.push(manager);\n };\n\n Transaction.prototype.scheduleInstallModifier = function scheduleInstallModifier(modifier, manager) {\n this.scheduledInstallManagers.push(manager);\n this.scheduledInstallModifiers.push(modifier);\n };\n\n Transaction.prototype.scheduleUpdateModifier = function scheduleUpdateModifier(modifier, manager) {\n this.scheduledUpdateModifierManagers.push(manager);\n this.scheduledUpdateModifiers.push(modifier);\n };\n\n Transaction.prototype.didDestroy = function didDestroy(d) {\n this.destructors.push(d);\n };\n\n Transaction.prototype.commit = function commit() {\n var createdComponents = this.createdComponents,\n createdManagers = this.createdManagers;\n\n for (var i = 0; i < createdComponents.length; i++) {\n var component = createdComponents[i];\n var manager = createdManagers[i];\n manager.didCreate(component);\n }\n var updatedComponents = this.updatedComponents,\n updatedManagers = this.updatedManagers;\n\n for (var _i = 0; _i < updatedComponents.length; _i++) {\n var _component = updatedComponents[_i];\n var _manager = updatedManagers[_i];\n _manager.didUpdate(_component);\n }\n var destructors = this.destructors;\n\n for (var _i2 = 0; _i2 < destructors.length; _i2++) {\n destructors[_i2].destroy();\n }\n var scheduledInstallManagers = this.scheduledInstallManagers,\n scheduledInstallModifiers = this.scheduledInstallModifiers;\n\n for (var _i3 = 0; _i3 < scheduledInstallManagers.length; _i3++) {\n var _manager2 = scheduledInstallManagers[_i3];\n var modifier = scheduledInstallModifiers[_i3];\n _manager2.install(modifier);\n }\n var scheduledUpdateModifierManagers = this.scheduledUpdateModifierManagers,\n scheduledUpdateModifiers = this.scheduledUpdateModifiers;\n\n for (var _i4 = 0; _i4 < scheduledUpdateModifierManagers.length; _i4++) {\n var _manager3 = scheduledUpdateModifierManagers[_i4];\n var _modifier = scheduledUpdateModifiers[_i4];\n _manager3.update(_modifier);\n }\n };\n\n return Transaction;\n }();\n\n var Opcode = function () {\n function Opcode(heap) {\n _classCallCheck$23(this, Opcode);\n\n this.heap = heap;\n this.offset = 0;\n }\n\n _createClass$4(Opcode, [{\n key: 'type',\n get: function () {\n return this.heap.getbyaddr(this.offset);\n }\n }, {\n key: 'op1',\n get: function () {\n return this.heap.getbyaddr(this.offset + 1);\n }\n }, {\n key: 'op2',\n get: function () {\n return this.heap.getbyaddr(this.offset + 2);\n }\n }, {\n key: 'op3',\n get: function () {\n return this.heap.getbyaddr(this.offset + 3);\n }\n }]);\n\n return Opcode;\n }();\n var TableSlotState;\n (function (TableSlotState) {\n TableSlotState[TableSlotState[\"Allocated\"] = 0] = \"Allocated\";\n TableSlotState[TableSlotState[\"Freed\"] = 1] = \"Freed\";\n TableSlotState[TableSlotState[\"Purged\"] = 2] = \"Purged\";\n TableSlotState[TableSlotState[\"Pointer\"] = 3] = \"Pointer\";\n })(TableSlotState || (TableSlotState = {}));\n var Heap = function () {\n function Heap() {\n _classCallCheck$23(this, Heap);\n\n this.heap = [];\n this.offset = 0;\n this.handle = 0;\n /**\n * layout:\n *\n * - pointer into heap\n * - size\n * - freed (0 or 1)\n */\n this.table = [];\n }\n\n Heap.prototype.push = function push(item) {\n this.heap[this.offset++] = item;\n };\n\n Heap.prototype.getbyaddr = function getbyaddr(address) {\n return this.heap[address];\n };\n\n Heap.prototype.setbyaddr = function setbyaddr(address, value) {\n this.heap[address] = value;\n };\n\n Heap.prototype.malloc = function malloc() {\n this.table.push(this.offset, 0, 0);\n var handle = this.handle;\n this.handle += 3;\n return handle;\n };\n\n Heap.prototype.finishMalloc = function finishMalloc(handle) {\n var start = this.table[handle];\n var finish = this.offset;\n this.table[handle + 1] = finish - start;\n };\n\n Heap.prototype.size = function size() {\n return this.offset;\n };\n // It is illegal to close over this address, as compaction\n // may move it. However, it is legal to use this address\n // multiple times between compactions.\n\n\n Heap.prototype.getaddr = function getaddr(handle) {\n return this.table[handle];\n };\n\n Heap.prototype.gethandle = function gethandle(address) {\n this.table.push(address, 0, TableSlotState.Pointer);\n var handle = this.handle;\n this.handle += 3;\n return handle;\n };\n\n Heap.prototype.sizeof = function sizeof(handle) {\n return -1;\n };\n\n Heap.prototype.free = function free(handle) {\n this.table[handle + 2] = 1;\n };\n\n Heap.prototype.compact = function compact() {\n var compactedSize = 0;\n var table = this.table,\n length = this.table.length,\n heap = this.heap;\n\n for (var i = 0; i < length; i += 3) {\n var offset = table[i];\n var size = table[i + 1];\n var state = table[i + 2];\n if (state === TableSlotState.Purged) {\n continue;\n } else if (state === TableSlotState.Freed) {\n // transition to \"already freed\"\n // a good improvement would be to reuse\n // these slots\n table[i + 2] = 2;\n compactedSize += size;\n } else if (state === TableSlotState.Allocated) {\n for (var j = offset; j <= i + size; j++) {\n heap[j - compactedSize] = heap[j];\n }\n table[i] = offset - compactedSize;\n } else if (state === TableSlotState.Pointer) {\n table[i] = offset - compactedSize;\n }\n }\n this.offset = this.offset - compactedSize;\n };\n\n return Heap;\n }();\n var Program = function () {\n function Program() {\n _classCallCheck$23(this, Program);\n\n this.heap = new Heap();\n this._opcode = new Opcode(this.heap);\n this.constants = new Constants();\n }\n\n Program.prototype.opcode = function opcode(offset) {\n this._opcode.offset = offset;\n return this._opcode;\n };\n\n return Program;\n }();\n var Environment = function () {\n function Environment(_ref2) {\n var appendOperations = _ref2.appendOperations,\n updateOperations = _ref2.updateOperations;\n\n _classCallCheck$23(this, Environment);\n\n this._macros = null;\n this._transaction = null;\n this.program = new Program();\n this.appendOperations = appendOperations;\n this.updateOperations = updateOperations;\n }\n\n Environment.prototype.toConditionalReference = function toConditionalReference(reference$$1) {\n return new ConditionalReference(reference$$1);\n };\n\n Environment.prototype.getAppendOperations = function getAppendOperations() {\n return this.appendOperations;\n };\n\n Environment.prototype.getDOM = function getDOM() {\n return this.updateOperations;\n };\n\n Environment.prototype.getIdentity = function getIdentity(object) {\n return (0, _util.ensureGuid)(object) + '';\n };\n\n Environment.prototype.begin = function begin() {\n (0, _util.assert)(!this._transaction, 'a glimmer transaction was begun, but one already exists. You may have a nested transaction');\n this._transaction = new Transaction();\n };\n\n Environment.prototype.didCreate = function didCreate(component, manager) {\n this.transaction.didCreate(component, manager);\n };\n\n Environment.prototype.didUpdate = function didUpdate(component, manager) {\n this.transaction.didUpdate(component, manager);\n };\n\n Environment.prototype.scheduleInstallModifier = function scheduleInstallModifier(modifier, manager) {\n this.transaction.scheduleInstallModifier(modifier, manager);\n };\n\n Environment.prototype.scheduleUpdateModifier = function scheduleUpdateModifier(modifier, manager) {\n this.transaction.scheduleUpdateModifier(modifier, manager);\n };\n\n Environment.prototype.didDestroy = function didDestroy(d) {\n this.transaction.didDestroy(d);\n };\n\n Environment.prototype.commit = function commit() {\n var transaction = this.transaction;\n this._transaction = null;\n transaction.commit();\n };\n\n Environment.prototype.attributeFor = function attributeFor(element, attr, isTrusting, namespace) {\n return defaultManagers(element, attr, isTrusting, namespace === undefined ? null : namespace);\n };\n\n Environment.prototype.macros = function macros() {\n var macros = this._macros;\n if (!macros) {\n this._macros = macros = this.populateBuiltins();\n }\n return macros;\n };\n\n Environment.prototype.populateBuiltins = function populateBuiltins$$1() {\n return populateBuiltins();\n };\n\n _createClass$4(Environment, [{\n key: 'transaction',\n get: function () {\n return this._transaction;\n }\n }]);\n\n return Environment;\n }();\n\n function _defaults$15(obj, defaults) {\n var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {\n var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {\n Object.defineProperty(obj, key, value);\n }\n }return obj;\n }\n\n var _createClass$5 = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n }();\n\n function _possibleConstructorReturn$15(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n }\n\n function _inherits$15(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults$15(subClass, superClass);\n }\n\n function _classCallCheck$30(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n var UpdatingVM = function () {\n function UpdatingVM(env, _ref) {\n var _ref$alwaysRevalidate = _ref.alwaysRevalidate,\n alwaysRevalidate = _ref$alwaysRevalidate === undefined ? false : _ref$alwaysRevalidate;\n\n _classCallCheck$30(this, UpdatingVM);\n\n this.frameStack = new _util.Stack();\n this.env = env;\n this.constants = env.program.constants;\n this.dom = env.getDOM();\n this.alwaysRevalidate = alwaysRevalidate;\n }\n\n UpdatingVM.prototype.execute = function execute(opcodes, handler) {\n var frameStack = this.frameStack;\n\n this.try(opcodes, handler);\n while (true) {\n if (frameStack.isEmpty()) break;\n var opcode = this.frame.nextStatement();\n if (opcode === null) {\n this.frameStack.pop();\n continue;\n }\n opcode.evaluate(this);\n }\n };\n\n UpdatingVM.prototype.goto = function goto(op) {\n this.frame.goto(op);\n };\n\n UpdatingVM.prototype.try = function _try(ops, handler) {\n this.frameStack.push(new UpdatingVMFrame(this, ops, handler));\n };\n\n UpdatingVM.prototype.throw = function _throw() {\n this.frame.handleException();\n this.frameStack.pop();\n };\n\n UpdatingVM.prototype.evaluateOpcode = function evaluateOpcode(opcode) {\n opcode.evaluate(this);\n };\n\n _createClass$5(UpdatingVM, [{\n key: 'frame',\n get: function () {\n return this.frameStack.current;\n }\n }]);\n\n return UpdatingVM;\n }();\n\n var BlockOpcode = function (_UpdatingOpcode) {\n _inherits$15(BlockOpcode, _UpdatingOpcode);\n\n function BlockOpcode(start, state, bounds$$1, children) {\n _classCallCheck$30(this, BlockOpcode);\n\n var _this = _possibleConstructorReturn$15(this, _UpdatingOpcode.call(this));\n\n _this.start = start;\n _this.type = \"block\";\n _this.next = null;\n _this.prev = null;\n var env = state.env,\n scope = state.scope,\n dynamicScope = state.dynamicScope,\n stack = state.stack;\n\n _this.children = children;\n _this.env = env;\n _this.scope = scope;\n _this.dynamicScope = dynamicScope;\n _this.stack = stack;\n _this.bounds = bounds$$1;\n return _this;\n }\n\n BlockOpcode.prototype.parentElement = function parentElement() {\n return this.bounds.parentElement();\n };\n\n BlockOpcode.prototype.firstNode = function firstNode() {\n return this.bounds.firstNode();\n };\n\n BlockOpcode.prototype.lastNode = function lastNode() {\n return this.bounds.lastNode();\n };\n\n BlockOpcode.prototype.evaluate = function evaluate(vm) {\n vm.try(this.children, null);\n };\n\n BlockOpcode.prototype.destroy = function destroy() {\n this.bounds.destroy();\n };\n\n BlockOpcode.prototype.didDestroy = function didDestroy() {\n this.env.didDestroy(this.bounds);\n };\n\n BlockOpcode.prototype.toJSON = function toJSON() {\n var details = (0, _util.dict)();\n details[\"guid\"] = '' + this._guid;\n return {\n guid: this._guid,\n type: this.type,\n details: details,\n children: this.children.toArray().map(function (op) {\n return op.toJSON();\n })\n };\n };\n\n return BlockOpcode;\n }(UpdatingOpcode);\n var TryOpcode = function (_BlockOpcode) {\n _inherits$15(TryOpcode, _BlockOpcode);\n\n function TryOpcode(start, state, bounds$$1, children) {\n _classCallCheck$30(this, TryOpcode);\n\n var _this2 = _possibleConstructorReturn$15(this, _BlockOpcode.call(this, start, state, bounds$$1, children));\n\n _this2.type = \"try\";\n _this2.tag = _this2._tag = _reference2.UpdatableTag.create(_reference2.CONSTANT_TAG);\n return _this2;\n }\n\n TryOpcode.prototype.didInitializeChildren = function didInitializeChildren() {\n this._tag.inner.update((0, _reference2.combineSlice)(this.children));\n };\n\n TryOpcode.prototype.evaluate = function evaluate(vm) {\n vm.try(this.children, this);\n };\n\n TryOpcode.prototype.handleException = function handleException() {\n var _this3 = this;\n\n var env = this.env,\n bounds$$1 = this.bounds,\n children = this.children,\n scope = this.scope,\n dynamicScope = this.dynamicScope,\n start = this.start,\n stack = this.stack,\n prev = this.prev,\n next = this.next;\n\n children.clear();\n var elementStack = ElementStack.resume(env, bounds$$1, bounds$$1.reset(env));\n var vm = new VM(env, scope, dynamicScope, elementStack);\n var updating = new _util.LinkedList();\n vm.execute(start, function (vm) {\n vm.stack = EvaluationStack.restore(stack);\n vm.updatingOpcodeStack.push(updating);\n vm.updateWith(_this3);\n vm.updatingOpcodeStack.push(children);\n });\n this.prev = prev;\n this.next = next;\n };\n\n TryOpcode.prototype.toJSON = function toJSON() {\n var json = _BlockOpcode.prototype.toJSON.call(this);\n var details = json[\"details\"];\n if (!details) {\n details = json[\"details\"] = {};\n }\n return _BlockOpcode.prototype.toJSON.call(this);\n };\n\n return TryOpcode;\n }(BlockOpcode);\n\n var ListRevalidationDelegate = function () {\n function ListRevalidationDelegate(opcode, marker) {\n _classCallCheck$30(this, ListRevalidationDelegate);\n\n this.opcode = opcode;\n this.marker = marker;\n this.didInsert = false;\n this.didDelete = false;\n this.map = opcode.map;\n this.updating = opcode['children'];\n }\n\n ListRevalidationDelegate.prototype.insert = function insert(key, item, memo, before) {\n var map$$1 = this.map,\n opcode = this.opcode,\n updating = this.updating;\n\n var nextSibling = null;\n var reference$$1 = null;\n if (before) {\n reference$$1 = map$$1[before];\n nextSibling = reference$$1['bounds'].firstNode();\n } else {\n nextSibling = this.marker;\n }\n var vm = opcode.vmForInsertion(nextSibling);\n var tryOpcode = null;\n var start = opcode.start;\n\n vm.execute(start, function (vm) {\n map$$1[key] = tryOpcode = vm.iterate(memo, item);\n vm.updatingOpcodeStack.push(new _util.LinkedList());\n vm.updateWith(tryOpcode);\n vm.updatingOpcodeStack.push(tryOpcode.children);\n });\n updating.insertBefore(tryOpcode, reference$$1);\n this.didInsert = true;\n };\n\n ListRevalidationDelegate.prototype.retain = function retain(_key, _item, _memo) {};\n\n ListRevalidationDelegate.prototype.move = function move$$1(key, _item, _memo, before) {\n var map$$1 = this.map,\n updating = this.updating;\n\n var entry = map$$1[key];\n var reference$$1 = map$$1[before] || null;\n if (before) {\n move(entry, reference$$1.firstNode());\n } else {\n move(entry, this.marker);\n }\n updating.remove(entry);\n updating.insertBefore(entry, reference$$1);\n };\n\n ListRevalidationDelegate.prototype.delete = function _delete(key) {\n var map$$1 = this.map;\n\n var opcode = map$$1[key];\n opcode.didDestroy();\n clear(opcode);\n this.updating.remove(opcode);\n delete map$$1[key];\n this.didDelete = true;\n };\n\n ListRevalidationDelegate.prototype.done = function done() {\n this.opcode.didInitializeChildren(this.didInsert || this.didDelete);\n };\n\n return ListRevalidationDelegate;\n }();\n\n var ListBlockOpcode = function (_BlockOpcode2) {\n _inherits$15(ListBlockOpcode, _BlockOpcode2);\n\n function ListBlockOpcode(start, state, bounds$$1, children, artifacts) {\n _classCallCheck$30(this, ListBlockOpcode);\n\n var _this4 = _possibleConstructorReturn$15(this, _BlockOpcode2.call(this, start, state, bounds$$1, children));\n\n _this4.type = \"list-block\";\n _this4.map = (0, _util.dict)();\n _this4.lastIterated = _reference2.INITIAL;\n _this4.artifacts = artifacts;\n var _tag = _this4._tag = _reference2.UpdatableTag.create(_reference2.CONSTANT_TAG);\n _this4.tag = (0, _reference2.combine)([artifacts.tag, _tag]);\n return _this4;\n }\n\n ListBlockOpcode.prototype.didInitializeChildren = function didInitializeChildren() {\n var listDidChange = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n this.lastIterated = this.artifacts.tag.value();\n if (listDidChange) {\n this._tag.inner.update((0, _reference2.combineSlice)(this.children));\n }\n };\n\n ListBlockOpcode.prototype.evaluate = function evaluate(vm) {\n var artifacts = this.artifacts,\n lastIterated = this.lastIterated;\n\n if (!artifacts.tag.validate(lastIterated)) {\n var bounds$$1 = this.bounds;\n var dom = vm.dom;\n\n var marker = dom.createComment('');\n dom.insertAfter(bounds$$1.parentElement(), marker, bounds$$1.lastNode());\n var target = new ListRevalidationDelegate(this, marker);\n var synchronizer = new _reference2.IteratorSynchronizer({ target: target, artifacts: artifacts });\n synchronizer.sync();\n this.parentElement().removeChild(marker);\n }\n // Run now-updated updating opcodes\n _BlockOpcode2.prototype.evaluate.call(this, vm);\n };\n\n ListBlockOpcode.prototype.vmForInsertion = function vmForInsertion(nextSibling) {\n var env = this.env,\n scope = this.scope,\n dynamicScope = this.dynamicScope;\n\n var elementStack = ElementStack.forInitialRender(this.env, this.bounds.parentElement(), nextSibling);\n return new VM(env, scope, dynamicScope, elementStack);\n };\n\n ListBlockOpcode.prototype.toJSON = function toJSON() {\n var json = _BlockOpcode2.prototype.toJSON.call(this);\n var map$$1 = this.map;\n var inner = Object.keys(map$$1).map(function (key) {\n return JSON.stringify(key) + ': ' + map$$1[key]._guid;\n }).join(\", \");\n var details = json[\"details\"];\n if (!details) {\n details = json[\"details\"] = {};\n }\n details[\"map\"] = '{' + inner + '}';\n return json;\n };\n\n return ListBlockOpcode;\n }(BlockOpcode);\n\n var UpdatingVMFrame = function () {\n function UpdatingVMFrame(vm, ops, exceptionHandler) {\n _classCallCheck$30(this, UpdatingVMFrame);\n\n this.vm = vm;\n this.ops = ops;\n this.exceptionHandler = exceptionHandler;\n this.vm = vm;\n this.ops = ops;\n this.current = ops.head();\n }\n\n UpdatingVMFrame.prototype.goto = function goto(op) {\n this.current = op;\n };\n\n UpdatingVMFrame.prototype.nextStatement = function nextStatement() {\n var current = this.current,\n ops = this.ops;\n\n if (current) this.current = ops.nextNode(current);\n return current;\n };\n\n UpdatingVMFrame.prototype.handleException = function handleException() {\n if (this.exceptionHandler) {\n this.exceptionHandler.handleException();\n }\n };\n\n return UpdatingVMFrame;\n }();\n\n function _classCallCheck$31(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n var RenderResult = function () {\n function RenderResult(env, updating, bounds$$1) {\n _classCallCheck$31(this, RenderResult);\n\n this.env = env;\n this.updating = updating;\n this.bounds = bounds$$1;\n }\n\n RenderResult.prototype.rerender = function rerender() {\n var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : { alwaysRevalidate: false },\n _ref$alwaysRevalidate = _ref.alwaysRevalidate,\n alwaysRevalidate = _ref$alwaysRevalidate === undefined ? false : _ref$alwaysRevalidate;\n\n var env = this.env,\n updating = this.updating;\n\n var vm = new UpdatingVM(env, { alwaysRevalidate: alwaysRevalidate });\n vm.execute(updating, this);\n };\n\n RenderResult.prototype.parentElement = function parentElement() {\n return this.bounds.parentElement();\n };\n\n RenderResult.prototype.firstNode = function firstNode() {\n return this.bounds.firstNode();\n };\n\n RenderResult.prototype.lastNode = function lastNode() {\n return this.bounds.lastNode();\n };\n\n RenderResult.prototype.opcodes = function opcodes() {\n return this.updating;\n };\n\n RenderResult.prototype.handleException = function handleException() {\n throw \"this should never happen\";\n };\n\n RenderResult.prototype.destroy = function destroy() {\n this.bounds.destroy();\n clear(this.bounds);\n };\n\n return RenderResult;\n }();\n\n var _createClass$3 = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n }\n }return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n };\n }();\n\n function _classCallCheck$22(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n var EvaluationStack = function () {\n function EvaluationStack(stack, fp, sp) {\n _classCallCheck$22(this, EvaluationStack);\n\n this.stack = stack;\n this.fp = fp;\n this.sp = sp;\n }\n\n EvaluationStack.empty = function empty() {\n return new this([], 0, -1);\n };\n\n EvaluationStack.restore = function restore(snapshot) {\n return new this(snapshot.slice(), 0, snapshot.length - 1);\n };\n\n EvaluationStack.prototype.isEmpty = function isEmpty() {\n return this.sp === -1;\n };\n\n EvaluationStack.prototype.push = function push(value) {\n this.stack[++this.sp] = value;\n };\n\n EvaluationStack.prototype.dup = function dup() {\n var position = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.sp;\n\n this.push(this.stack[position]);\n };\n\n EvaluationStack.prototype.pop = function pop() {\n var n = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;\n\n var top = this.stack[this.sp];\n this.sp -= n;\n return top;\n };\n\n EvaluationStack.prototype.peek = function peek() {\n return this.stack[this.sp];\n };\n\n EvaluationStack.prototype.fromBase = function fromBase(offset) {\n return this.stack[this.fp - offset];\n };\n\n EvaluationStack.prototype.fromTop = function fromTop(offset) {\n return this.stack[this.sp - offset];\n };\n\n EvaluationStack.prototype.capture = function capture(items) {\n var end = this.sp + 1;\n var start = end - items;\n return this.stack.slice(start, end);\n };\n\n EvaluationStack.prototype.reset = function reset() {\n this.stack.length = 0;\n };\n\n EvaluationStack.prototype.toArray = function toArray() {\n return this.stack.slice(this.fp, this.sp + 1);\n };\n\n return EvaluationStack;\n }();\n\n var VM = function () {\n function VM(env, scope, dynamicScope, elementStack) {\n _classCallCheck$22(this, VM);\n\n this.env = env;\n this.elementStack = elementStack;\n this.dynamicScopeStack = new _util.Stack();\n this.scopeStack = new _util.Stack();\n this.updatingOpcodeStack = new _util.Stack();\n this.cacheGroups = new _util.Stack();\n this.listBlockStack = new _util.Stack();\n this.stack = EvaluationStack.empty();\n /* Registers */\n this.pc = -1;\n this.ra = -1;\n this.s0 = null;\n this.s1 = null;\n this.t0 = null;\n this.t1 = null;\n this.env = env;\n this.heap = env.program.heap;\n this.constants = env.program.constants;\n this.elementStack = elementStack;\n this.scopeStack.push(scope);\n this.dynamicScopeStack.push(dynamicScope);\n }\n\n // Fetch a value from a register onto the stack\n VM.prototype.fetch = function fetch(register) {\n this.stack.push(this[Register[register]]);\n };\n // Load a value from the stack into a register\n\n\n VM.prototype.load = function load(register) {\n this[Register[register]] = this.stack.pop();\n };\n // Fetch a value from a register\n\n\n VM.prototype.fetchValue = function fetchValue(register) {\n return this[Register[register]];\n };\n // Load a value into a register\n\n\n VM.prototype.loadValue = function loadValue(register, value) {\n this[Register[register]] = value;\n };\n // Start a new frame and save $ra and $fp on the stack\n\n\n VM.prototype.pushFrame = function pushFrame() {\n this.stack.push(this.ra);\n this.stack.push(this.fp);\n this.fp = this.sp - 1;\n };\n // Restore $ra, $sp and $fp\n\n\n VM.prototype.popFrame = function popFrame() {\n this.sp = this.fp - 1;\n this.ra = this.stack.fromBase(0);\n this.fp = this.stack.fromBase(-1);\n };\n // Jump to an address in `program`\n\n\n VM.prototype.goto = function goto(offset) {\n this.pc = (0, _util.typePos)(this.pc + offset);\n };\n // Save $pc into $ra, then jump to a new address in `program` (jal in MIPS)\n\n\n VM.prototype.call = function call(handle) {\n var pc = this.heap.getaddr(handle);\n this.ra = this.pc;\n this.pc = pc;\n };\n // Put a specific `program` address in $ra\n\n\n VM.prototype.returnTo = function returnTo(offset) {\n this.ra = (0, _util.typePos)(this.pc + offset);\n };\n // Return to the `program` address stored in $ra\n\n\n VM.prototype.return = function _return() {\n this.pc = this.ra;\n };\n\n VM.initial = function initial(env, self, dynamicScope, elementStack, program) {\n var scope = Scope.root(self, program.symbolTable.symbols.length);\n var vm = new VM(env, scope, dynamicScope, elementStack);\n vm.pc = vm.heap.getaddr(program.handle);\n vm.updatingOpcodeStack.push(new _util.LinkedList());\n return vm;\n };\n\n VM.prototype.capture = function capture(args) {\n return {\n dynamicScope: this.dynamicScope(),\n env: this.env,\n scope: this.scope(),\n stack: this.stack.capture(args)\n };\n };\n\n VM.prototype.beginCacheGroup = function beginCacheGroup() {\n this.cacheGroups.push(this.updating().tail());\n };\n\n VM.prototype.commitCacheGroup = function commitCacheGroup() {\n // JumpIfNotModified(END)\n // (head)\n // (....)\n // (tail)\n // DidModify\n // END: Noop\n var END = new LabelOpcode(\"END\");\n var opcodes = this.updating();\n var marker = this.cacheGroups.pop();\n var head = marker ? opcodes.nextNode(marker) : opcodes.head();\n var tail = opcodes.tail();\n var tag = (0, _reference2.combineSlice)(new _util.ListSlice(head, tail));\n var guard = new JumpIfNotModifiedOpcode(tag, END);\n opcodes.insertBefore(guard, head);\n opcodes.append(new DidModifyOpcode(guard));\n opcodes.append(END);\n };\n\n VM.prototype.enter = function enter(args) {\n var updating = new _util.LinkedList();\n var state = this.capture(args);\n var tracker = this.elements().pushUpdatableBlock();\n var tryOpcode = new TryOpcode(this.heap.gethandle(this.pc), state, tracker, updating);\n this.didEnter(tryOpcode);\n };\n\n VM.prototype.iterate = function iterate(memo, value) {\n var stack = this.stack;\n stack.push(value);\n stack.push(memo);\n var state = this.capture(2);\n var tracker = this.elements().pushUpdatableBlock();\n // let ip = this.ip;\n // this.ip = end + 4;\n // this.frames.push(ip);\n return new TryOpcode(this.heap.gethandle(this.pc), state, tracker, new _util.LinkedList());\n };\n\n VM.prototype.enterItem = function enterItem(key, opcode) {\n this.listBlock().map[key] = opcode;\n this.didEnter(opcode);\n };\n\n VM.prototype.enterList = function enterList(relativeStart) {\n var updating = new _util.LinkedList();\n var state = this.capture(0);\n var tracker = this.elements().pushBlockList(updating);\n var artifacts = this.stack.peek().artifacts;\n var start = this.heap.gethandle((0, _util.typePos)(this.pc + relativeStart));\n var opcode = new ListBlockOpcode(start, state, tracker, updating, artifacts);\n this.listBlockStack.push(opcode);\n this.didEnter(opcode);\n };\n\n VM.prototype.didEnter = function didEnter(opcode) {\n this.updateWith(opcode);\n this.updatingOpcodeStack.push(opcode.children);\n };\n\n VM.prototype.exit = function exit() {\n this.elements().popBlock();\n this.updatingOpcodeStack.pop();\n var parent = this.updating().tail();\n parent.didInitializeChildren();\n };\n\n VM.prototype.exitList = function exitList() {\n this.exit();\n this.listBlockStack.pop();\n };\n\n VM.prototype.updateWith = function updateWith(opcode) {\n this.updating().append(opcode);\n };\n\n VM.prototype.listBlock = function listBlock() {\n return this.listBlockStack.current;\n };\n\n VM.prototype.updating = function updating() {\n return this.updatingOpcodeStack.current;\n };\n\n VM.prototype.elements = function elements() {\n return this.elementStack;\n };\n\n VM.prototype.scope = function scope() {\n return this.scopeStack.current;\n };\n\n VM.prototype.dynamicScope = function dynamicScope() {\n return this.dynamicScopeStack.current;\n };\n\n VM.prototype.pushChildScope = function pushChildScope() {\n this.scopeStack.push(this.scope().child());\n };\n\n VM.prototype.pushCallerScope = function pushCallerScope() {\n var childScope = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n var callerScope = this.scope().getCallerScope();\n this.scopeStack.push(childScope ? callerScope.child() : callerScope);\n };\n\n VM.prototype.pushDynamicScope = function pushDynamicScope() {\n var child = this.dynamicScope().child();\n this.dynamicScopeStack.push(child);\n return child;\n };\n\n VM.prototype.pushRootScope = function pushRootScope(size, bindCaller) {\n var scope = Scope.sized(size);\n if (bindCaller) scope.bindCallerScope(this.scope());\n this.scopeStack.push(scope);\n return scope;\n };\n\n VM.prototype.popScope = function popScope() {\n this.scopeStack.pop();\n };\n\n VM.prototype.popDynamicScope = function popDynamicScope() {\n this.dynamicScopeStack.pop();\n };\n\n VM.prototype.newDestroyable = function newDestroyable(d) {\n this.elements().newDestroyable(d);\n };\n /// SCOPE HELPERS\n\n\n VM.prototype.getSelf = function getSelf() {\n return this.scope().getSelf();\n };\n\n VM.prototype.referenceForSymbol = function referenceForSymbol(symbol) {\n return this.scope().getSymbol(symbol);\n };\n /// EXECUTION\n\n\n VM.prototype.execute = function execute(start, initialize) {\n this.pc = this.heap.getaddr(start);\n if (initialize) initialize(this);\n var result = void 0;\n while (true) {\n result = this.next();\n if (result.done) break;\n }\n return result.value;\n };\n\n VM.prototype.next = function next() {\n var env = this.env,\n updatingOpcodeStack = this.updatingOpcodeStack,\n elementStack = this.elementStack;\n\n var opcode = this.nextStatement(env);\n var result = void 0;\n if (opcode !== null) {\n APPEND_OPCODES.evaluate(this, opcode, opcode.type);\n result = { done: false, value: null };\n } else {\n // Unload the stack\n this.stack.reset();\n result = {\n done: true,\n value: new RenderResult(env, updatingOpcodeStack.pop(), elementStack.popBlock())\n };\n }\n return result;\n };\n\n VM.prototype.nextStatement = function nextStatement(env) {\n var pc = this.pc;\n\n if (pc === -1) {\n return null;\n }\n var program = env.program;\n this.pc += 4;\n return program.opcode(pc);\n };\n\n VM.prototype.evaluateOpcode = function evaluateOpcode(opcode) {\n APPEND_OPCODES.evaluate(this, opcode, opcode.type);\n };\n\n VM.prototype.bindDynamicScope = function bindDynamicScope(names) {\n var scope = this.dynamicScope();\n for (var i = names.length - 1; i >= 0; i--) {\n var name = this.constants.getString(names[i]);\n scope.set(name, this.stack.pop());\n }\n };\n\n _createClass$3(VM, [{\n key: 'fp',\n get: function () {\n return this.stack.fp;\n },\n set: function (fp) {\n this.stack.fp = fp;\n }\n }, {\n key: 'sp',\n get: function () {\n return this.stack.sp;\n },\n set: function (sp) {\n this.stack.sp = sp;\n }\n }]);\n\n return VM;\n }();\n\n function _classCallCheck$14(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n var TemplateIterator = function () {\n function TemplateIterator(vm) {\n _classCallCheck$14(this, TemplateIterator);\n\n this.vm = vm;\n }\n\n TemplateIterator.prototype.next = function next() {\n return this.vm.next();\n };\n\n return TemplateIterator;\n }();\n var clientId = 0;\n function templateFactory(_ref) {\n var templateId = _ref.id,\n meta = _ref.meta,\n block = _ref.block;\n\n var parsedBlock = void 0;\n var id = templateId || 'client-' + clientId++;\n var create = function (env, envMeta) {\n var newMeta = envMeta ? (0, _util.assign)({}, envMeta, meta) : meta;\n if (!parsedBlock) {\n parsedBlock = JSON.parse(block);\n }\n return new ScannableTemplate(id, newMeta, env, parsedBlock);\n };\n return { id: id, meta: meta, create: create };\n }\n\n var ScannableTemplate = function () {\n function ScannableTemplate(id, meta, env, rawBlock) {\n _classCallCheck$14(this, ScannableTemplate);\n\n this.id = id;\n this.meta = meta;\n this.env = env;\n this.entryPoint = null;\n this.layout = null;\n this.partial = null;\n this.block = null;\n this.scanner = new Scanner(rawBlock, env);\n this.symbols = rawBlock.symbols;\n this.hasEval = rawBlock.hasEval;\n }\n\n ScannableTemplate.prototype.render = function render(self, appendTo, dynamicScope) {\n var env = this.env;\n\n var elementStack = ElementStack.forInitialRender(env, appendTo, null);\n var compiled = this.asEntryPoint().compileDynamic(env);\n var vm = VM.initial(env, self, dynamicScope, elementStack, compiled);\n return new TemplateIterator(vm);\n };\n\n ScannableTemplate.prototype.asEntryPoint = function asEntryPoint() {\n if (!this.entryPoint) this.entryPoint = this.scanner.scanEntryPoint(this.compilationMeta());\n return this.entryPoint;\n };\n\n ScannableTemplate.prototype.asLayout = function asLayout(componentName, attrs) {\n if (!this.layout) this.layout = this.scanner.scanLayout(this.compilationMeta(), attrs || _util.EMPTY_ARRAY, componentName);\n return this.layout;\n };\n\n ScannableTemplate.prototype.asPartial = function asPartial() {\n if (!this.partial) this.partial = this.scanner.scanEntryPoint(this.compilationMeta(true));\n return this.partial;\n };\n\n ScannableTemplate.prototype.asBlock = function asBlock() {\n if (!this.block) this.block = this.scanner.scanBlock(this.compilationMeta());\n return this.block;\n };\n\n ScannableTemplate.prototype.compilationMeta = function compilationMeta() {\n var asPartial = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n return { templateMeta: this.meta, symbols: this.symbols, asPartial: asPartial };\n };\n\n return ScannableTemplate;\n }();\n\n function _classCallCheck$32(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n var DynamicVarReference = function () {\n function DynamicVarReference(scope, nameRef) {\n _classCallCheck$32(this, DynamicVarReference);\n\n this.scope = scope;\n this.nameRef = nameRef;\n var varTag = this.varTag = _reference2.UpdatableTag.create(_reference2.CONSTANT_TAG);\n this.tag = (0, _reference2.combine)([nameRef.tag, varTag]);\n }\n\n DynamicVarReference.prototype.value = function value() {\n return this.getVar().value();\n };\n\n DynamicVarReference.prototype.get = function get(key) {\n return this.getVar().get(key);\n };\n\n DynamicVarReference.prototype.getVar = function getVar() {\n var name = String(this.nameRef.value());\n var ref = this.scope.get(name);\n this.varTag.inner.update(ref.tag);\n return ref;\n };\n\n return DynamicVarReference;\n }();\n\n function getDynamicVar(vm, args) {\n var scope = vm.dynamicScope();\n var nameRef = args.positional.at(0);\n return new DynamicVarReference(scope, nameRef);\n }\n\n function _classCallCheck$33(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n var PartialDefinition = function PartialDefinition(name, // for debugging\n template) {\n _classCallCheck$33(this, PartialDefinition);\n\n this.name = name;\n this.template = template;\n };\n\n var NodeType;\n (function (NodeType) {\n NodeType[NodeType[\"Element\"] = 0] = \"Element\";\n NodeType[NodeType[\"Attribute\"] = 1] = \"Attribute\";\n NodeType[NodeType[\"Text\"] = 2] = \"Text\";\n NodeType[NodeType[\"CdataSection\"] = 3] = \"CdataSection\";\n NodeType[NodeType[\"EntityReference\"] = 4] = \"EntityReference\";\n NodeType[NodeType[\"Entity\"] = 5] = \"Entity\";\n NodeType[NodeType[\"ProcessingInstruction\"] = 6] = \"ProcessingInstruction\";\n NodeType[NodeType[\"Comment\"] = 7] = \"Comment\";\n NodeType[NodeType[\"Document\"] = 8] = \"Document\";\n NodeType[NodeType[\"DocumentType\"] = 9] = \"DocumentType\";\n NodeType[NodeType[\"DocumentFragment\"] = 10] = \"DocumentFragment\";\n NodeType[NodeType[\"Notation\"] = 11] = \"Notation\";\n })(NodeType || (NodeType = {}));\n\n var interfaces = Object.freeze({\n get NodeType() {\n return NodeType;\n }\n });\n\n exports.Simple = interfaces;\n exports.templateFactory = templateFactory;\n exports.NULL_REFERENCE = NULL_REFERENCE;\n exports.UNDEFINED_REFERENCE = UNDEFINED_REFERENCE;\n exports.PrimitiveReference = PrimitiveReference;\n exports.ConditionalReference = ConditionalReference;\n exports.OpcodeBuilderDSL = OpcodeBuilder;\n exports.compileLayout = compileLayout;\n exports.CompiledStaticTemplate = CompiledStaticTemplate;\n exports.CompiledDynamicTemplate = CompiledDynamicTemplate;\n exports.IAttributeManager = AttributeManager;\n exports.AttributeManager = AttributeManager;\n exports.PropertyManager = PropertyManager;\n exports.INPUT_VALUE_PROPERTY_MANAGER = INPUT_VALUE_PROPERTY_MANAGER;\n exports.defaultManagers = defaultManagers;\n exports.defaultAttributeManagers = defaultAttributeManagers;\n exports.defaultPropertyManagers = defaultPropertyManagers;\n exports.readDOMAttr = readDOMAttr;\n exports.Register = Register;\n exports.debugSlice = debugSlice;\n exports.normalizeTextValue = normalizeTextValue;\n exports.setDebuggerCallback = setDebuggerCallback;\n exports.resetDebuggerCallback = resetDebuggerCallback;\n exports.getDynamicVar = getDynamicVar;\n exports.BlockMacros = Blocks;\n exports.InlineMacros = Inlines;\n exports.compileList = compileList;\n exports.compileExpression = expr;\n exports.UpdatingVM = UpdatingVM;\n exports.RenderResult = RenderResult;\n exports.isSafeString = isSafeString;\n exports.Scope = Scope;\n exports.Environment = Environment;\n exports.PartialDefinition = PartialDefinition;\n exports.ComponentDefinition = ComponentDefinition;\n exports.isComponentDefinition = isComponentDefinition;\n exports.DOMChanges = helper$1;\n exports.IDOMChanges = DOMChanges;\n exports.DOMTreeConstruction = DOMTreeConstruction;\n exports.isWhitespace = isWhitespace;\n exports.insertHTMLBefore = _insertHTMLBefore;\n exports.ElementStack = ElementStack;\n exports.ConcreteBounds = ConcreteBounds;\n});","enifed('@glimmer/util', ['exports'], function (exports) {\n 'use strict';\n\n // There is a small whitelist of namespaced attributes specially\n // enumerated in\n // https://www.w3.org/TR/html/syntax.html#attributes-0\n //\n // > When a foreign element has one of the namespaced attributes given by\n // > the local name and namespace of the first and second cells of a row\n // > from the following table, it must be written using the name given by\n // > the third cell from the same row.\n //\n // In all other cases, colons are interpreted as a regular character\n // with no special meaning:\n //\n // > No other namespaced attribute can be expressed in the HTML syntax.\n var XLINK = 'http://www.w3.org/1999/xlink';\n var XML = 'http://www.w3.org/XML/1998/namespace';\n var XMLNS = 'http://www.w3.org/2000/xmlns/';\n var WHITELIST = {\n 'xlink:actuate': XLINK,\n 'xlink:arcrole': XLINK,\n 'xlink:href': XLINK,\n 'xlink:role': XLINK,\n 'xlink:show': XLINK,\n 'xlink:title': XLINK,\n 'xlink:type': XLINK,\n 'xml:base': XML,\n 'xml:lang': XML,\n 'xml:space': XML,\n 'xmlns': XMLNS,\n 'xmlns:xlink': XMLNS\n };\n function getAttrNamespace(attrName) {\n return WHITELIST[attrName] || null;\n }\n\n function unwrap(val) {\n if (val === null || val === undefined) throw new Error('Expected value to be present');\n return val;\n }\n function expect(val, message) {\n if (val === null || val === undefined) throw new Error(message);\n return val;\n }\n function unreachable() {\n return new Error('unreachable');\n }\n function typePos(lastOperand) {\n return lastOperand - 4;\n }\n\n // import Logger from './logger';\n // let alreadyWarned = false;\n // import Logger from './logger';\n function debugAssert(test, msg) {\n // if (!alreadyWarned) {\n // alreadyWarned = true;\n // Logger.warn(\"Don't leave debug assertions on in public builds\");\n // }\n if (!test) {\n throw new Error(msg || \"assertion failure\");\n }\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n var LogLevel;\n (function (LogLevel) {\n LogLevel[LogLevel[\"Trace\"] = 0] = \"Trace\";\n LogLevel[LogLevel[\"Debug\"] = 1] = \"Debug\";\n LogLevel[LogLevel[\"Warn\"] = 2] = \"Warn\";\n LogLevel[LogLevel[\"Error\"] = 3] = \"Error\";\n })(LogLevel || (exports.LogLevel = LogLevel = {}));\n\n var NullConsole = function () {\n function NullConsole() {\n _classCallCheck(this, NullConsole);\n }\n\n NullConsole.prototype.log = function log(_message) {};\n\n NullConsole.prototype.warn = function warn(_message) {};\n\n NullConsole.prototype.error = function error(_message) {};\n\n NullConsole.prototype.trace = function trace() {};\n\n return NullConsole;\n }();\n\n var ALWAYS = void 0;\n var Logger = function () {\n function Logger(_ref) {\n var console = _ref.console,\n level = _ref.level;\n\n _classCallCheck(this, Logger);\n\n this.f = ALWAYS;\n this.force = ALWAYS;\n this.console = console;\n this.level = level;\n }\n\n Logger.prototype.skipped = function skipped(level) {\n return level < this.level;\n };\n\n Logger.prototype.trace = function trace(message) {\n var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n _ref2$stackTrace = _ref2.stackTrace,\n stackTrace = _ref2$stackTrace === undefined ? false : _ref2$stackTrace;\n\n if (this.skipped(LogLevel.Trace)) return;\n this.console.log(message);\n if (stackTrace) this.console.trace();\n };\n\n Logger.prototype.debug = function debug(message) {\n var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n _ref3$stackTrace = _ref3.stackTrace,\n stackTrace = _ref3$stackTrace === undefined ? false : _ref3$stackTrace;\n\n if (this.skipped(LogLevel.Debug)) return;\n this.console.log(message);\n if (stackTrace) this.console.trace();\n };\n\n Logger.prototype.warn = function warn(message) {\n var _ref4 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n _ref4$stackTrace = _ref4.stackTrace,\n stackTrace = _ref4$stackTrace === undefined ? false : _ref4$stackTrace;\n\n if (this.skipped(LogLevel.Warn)) return;\n this.console.warn(message);\n if (stackTrace) this.console.trace();\n };\n\n Logger.prototype.error = function error(message) {\n if (this.skipped(LogLevel.Error)) return;\n this.console.error(message);\n };\n\n return Logger;\n }();\n var _console = typeof console === 'undefined' ? new NullConsole() : console;\n ALWAYS = new Logger({ console: _console, level: LogLevel.Trace });\n var LOG_LEVEL = LogLevel.Debug;\n var logger = new Logger({ console: _console, level: LOG_LEVEL });\n\n var objKeys = Object.keys;\n\n function assign(obj) {\n for (var i = 1; i < arguments.length; i++) {\n var assignment = arguments[i];\n if (assignment === null || typeof assignment !== 'object') continue;\n var keys = objKeys(assignment);\n for (var j = 0; j < keys.length; j++) {\n var key = keys[j];\n obj[key] = assignment[key];\n }\n }\n return obj;\n }\n function fillNulls(count) {\n var arr = new Array(count);\n for (var i = 0; i < count; i++) {\n arr[i] = null;\n }\n return arr;\n }\n\n var GUID = 0;\n function initializeGuid(object) {\n return object._guid = ++GUID;\n }\n function ensureGuid(object) {\n return object._guid || initializeGuid(object);\n }\n\n function _classCallCheck$1(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n var proto = Object.create(null, {\n // without this, we will always still end up with (new\n // EmptyObject()).constructor === Object\n constructor: {\n value: undefined,\n enumerable: false,\n writable: true\n }\n });\n function EmptyObject() {}\n EmptyObject.prototype = proto;\n function dict() {\n // let d = Object.create(null);\n // d.x = 1;\n // delete d.x;\n // return d;\n return new EmptyObject();\n }\n var DictSet = function () {\n function DictSet() {\n _classCallCheck$1(this, DictSet);\n\n this.dict = dict();\n }\n\n DictSet.prototype.add = function add(obj) {\n if (typeof obj === 'string') this.dict[obj] = obj;else this.dict[ensureGuid(obj)] = obj;\n return this;\n };\n\n DictSet.prototype.delete = function _delete(obj) {\n if (typeof obj === 'string') delete this.dict[obj];else if (obj._guid) delete this.dict[obj._guid];\n };\n\n DictSet.prototype.forEach = function forEach(callback) {\n var dict = this.dict;\n\n var dictKeys = Object.keys(dict);\n for (var i = 0; dictKeys.length; i++) {\n callback(dict[dictKeys[i]]);\n }\n };\n\n DictSet.prototype.toArray = function toArray() {\n return Object.keys(this.dict);\n };\n\n return DictSet;\n }();\n var Stack = function () {\n function Stack() {\n _classCallCheck$1(this, Stack);\n\n this.stack = [];\n this.current = null;\n }\n\n Stack.prototype.toArray = function toArray() {\n return this.stack;\n };\n\n Stack.prototype.push = function push(item) {\n this.current = item;\n this.stack.push(item);\n };\n\n Stack.prototype.pop = function pop() {\n var item = this.stack.pop();\n var len = this.stack.length;\n this.current = len === 0 ? null : this.stack[len - 1];\n return item === undefined ? null : item;\n };\n\n Stack.prototype.isEmpty = function isEmpty() {\n return this.stack.length === 0;\n };\n\n return Stack;\n }();\n\n function _classCallCheck$2(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n var ListNode = function ListNode(value) {\n _classCallCheck$2(this, ListNode);\n\n this.next = null;\n this.prev = null;\n this.value = value;\n };\n var LinkedList = function () {\n function LinkedList() {\n _classCallCheck$2(this, LinkedList);\n\n this.clear();\n }\n\n LinkedList.fromSlice = function fromSlice(slice) {\n var list = new LinkedList();\n slice.forEachNode(function (n) {\n return list.append(n.clone());\n });\n return list;\n };\n\n LinkedList.prototype.head = function head() {\n return this._head;\n };\n\n LinkedList.prototype.tail = function tail() {\n return this._tail;\n };\n\n LinkedList.prototype.clear = function clear() {\n this._head = this._tail = null;\n };\n\n LinkedList.prototype.isEmpty = function isEmpty() {\n return this._head === null;\n };\n\n LinkedList.prototype.toArray = function toArray() {\n var out = [];\n this.forEachNode(function (n) {\n return out.push(n);\n });\n return out;\n };\n\n LinkedList.prototype.splice = function splice(start, end, reference) {\n var before = void 0;\n if (reference === null) {\n before = this._tail;\n this._tail = end;\n } else {\n before = reference.prev;\n end.next = reference;\n reference.prev = end;\n }\n if (before) {\n before.next = start;\n start.prev = before;\n }\n };\n\n LinkedList.prototype.nextNode = function nextNode(node) {\n return node.next;\n };\n\n LinkedList.prototype.prevNode = function prevNode(node) {\n return node.prev;\n };\n\n LinkedList.prototype.forEachNode = function forEachNode(callback) {\n var node = this._head;\n while (node !== null) {\n callback(node);\n node = node.next;\n }\n };\n\n LinkedList.prototype.contains = function contains(needle) {\n var node = this._head;\n while (node !== null) {\n if (node === needle) return true;\n node = node.next;\n }\n return false;\n };\n\n LinkedList.prototype.insertBefore = function insertBefore(node) {\n var reference = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n\n if (reference === null) return this.append(node);\n if (reference.prev) reference.prev.next = node;else this._head = node;\n node.prev = reference.prev;\n node.next = reference;\n reference.prev = node;\n return node;\n };\n\n LinkedList.prototype.append = function append(node) {\n var tail = this._tail;\n if (tail) {\n tail.next = node;\n node.prev = tail;\n node.next = null;\n } else {\n this._head = node;\n }\n return this._tail = node;\n };\n\n LinkedList.prototype.pop = function pop() {\n if (this._tail) return this.remove(this._tail);\n return null;\n };\n\n LinkedList.prototype.prepend = function prepend(node) {\n if (this._head) return this.insertBefore(node, this._head);\n return this._head = this._tail = node;\n };\n\n LinkedList.prototype.remove = function remove(node) {\n if (node.prev) node.prev.next = node.next;else this._head = node.next;\n if (node.next) node.next.prev = node.prev;else this._tail = node.prev;\n return node;\n };\n\n return LinkedList;\n }();\n var ListSlice = function () {\n function ListSlice(head, tail) {\n _classCallCheck$2(this, ListSlice);\n\n this._head = head;\n this._tail = tail;\n }\n\n ListSlice.toList = function toList(slice) {\n var list = new LinkedList();\n slice.forEachNode(function (n) {\n return list.append(n.clone());\n });\n return list;\n };\n\n ListSlice.prototype.forEachNode = function forEachNode(callback) {\n var node = this._head;\n while (node !== null) {\n callback(node);\n node = this.nextNode(node);\n }\n };\n\n ListSlice.prototype.contains = function contains(needle) {\n var node = this._head;\n while (node !== null) {\n if (node === needle) return true;\n node = node.next;\n }\n return false;\n };\n\n ListSlice.prototype.head = function head() {\n return this._head;\n };\n\n ListSlice.prototype.tail = function tail() {\n return this._tail;\n };\n\n ListSlice.prototype.toArray = function toArray() {\n var out = [];\n this.forEachNode(function (n) {\n return out.push(n);\n });\n return out;\n };\n\n ListSlice.prototype.nextNode = function nextNode(node) {\n if (node === this._tail) return null;\n return node.next;\n };\n\n ListSlice.prototype.prevNode = function prevNode(node) {\n if (node === this._head) return null;\n return node.prev;\n };\n\n ListSlice.prototype.isEmpty = function isEmpty() {\n return false;\n };\n\n return ListSlice;\n }();\n var EMPTY_SLICE = new ListSlice(null, null);\n\n var HAS_NATIVE_WEAKMAP = function () {\n // detect if `WeakMap` is even present\n var hasWeakMap = typeof WeakMap === 'function';\n if (!hasWeakMap) {\n return false;\n }\n var instance = new WeakMap();\n // use `Object`'s `.toString` directly to prevent us from detecting\n // polyfills as native weakmaps\n return Object.prototype.toString.call(instance) === '[object WeakMap]';\n }();\n\n var HAS_TYPED_ARRAYS = typeof Uint32Array !== 'undefined';\n var A = void 0;\n if (HAS_TYPED_ARRAYS) {\n A = Uint32Array;\n } else {\n A = Array;\n }\n var A$1 = A;\n var EMPTY_ARRAY = HAS_NATIVE_WEAKMAP ? Object.freeze([]) : [];\n\n exports.getAttrNamespace = getAttrNamespace;\n exports.assert = debugAssert;\n exports.LOGGER = logger;\n exports.Logger = Logger;\n exports.LogLevel = LogLevel;\n exports.assign = assign;\n exports.fillNulls = fillNulls;\n exports.ensureGuid = ensureGuid;\n exports.initializeGuid = initializeGuid;\n exports.Stack = Stack;\n exports.DictSet = DictSet;\n exports.dict = dict;\n exports.EMPTY_SLICE = EMPTY_SLICE;\n exports.LinkedList = LinkedList;\n exports.ListNode = ListNode;\n exports.ListSlice = ListSlice;\n exports.A = A$1;\n exports.EMPTY_ARRAY = EMPTY_ARRAY;\n exports.HAS_NATIVE_WEAKMAP = HAS_NATIVE_WEAKMAP;\n exports.unwrap = unwrap;\n exports.expect = expect;\n exports.unreachable = unreachable;\n exports.typePos = typePos;\n});","enifed(\"@glimmer/wire-format\", [\"exports\"], function (exports) {\n \"use strict\";\n\n var Opcodes;\n (function (Opcodes) {\n // Statements\n Opcodes[Opcodes[\"Text\"] = 0] = \"Text\";\n Opcodes[Opcodes[\"Append\"] = 1] = \"Append\";\n Opcodes[Opcodes[\"Comment\"] = 2] = \"Comment\";\n Opcodes[Opcodes[\"Modifier\"] = 3] = \"Modifier\";\n Opcodes[Opcodes[\"Block\"] = 4] = \"Block\";\n Opcodes[Opcodes[\"Component\"] = 5] = \"Component\";\n Opcodes[Opcodes[\"OpenElement\"] = 6] = \"OpenElement\";\n Opcodes[Opcodes[\"FlushElement\"] = 7] = \"FlushElement\";\n Opcodes[Opcodes[\"CloseElement\"] = 8] = \"CloseElement\";\n Opcodes[Opcodes[\"StaticAttr\"] = 9] = \"StaticAttr\";\n Opcodes[Opcodes[\"DynamicAttr\"] = 10] = \"DynamicAttr\";\n Opcodes[Opcodes[\"Yield\"] = 11] = \"Yield\";\n Opcodes[Opcodes[\"Partial\"] = 12] = \"Partial\";\n Opcodes[Opcodes[\"DynamicArg\"] = 13] = \"DynamicArg\";\n Opcodes[Opcodes[\"StaticArg\"] = 14] = \"StaticArg\";\n Opcodes[Opcodes[\"TrustingAttr\"] = 15] = \"TrustingAttr\";\n Opcodes[Opcodes[\"Debugger\"] = 16] = \"Debugger\";\n Opcodes[Opcodes[\"ClientSideStatement\"] = 17] = \"ClientSideStatement\";\n // Expressions\n Opcodes[Opcodes[\"Unknown\"] = 18] = \"Unknown\";\n Opcodes[Opcodes[\"Get\"] = 19] = \"Get\";\n Opcodes[Opcodes[\"MaybeLocal\"] = 20] = \"MaybeLocal\";\n Opcodes[Opcodes[\"FixThisBeforeWeMerge\"] = 21] = \"FixThisBeforeWeMerge\";\n Opcodes[Opcodes[\"HasBlock\"] = 22] = \"HasBlock\";\n Opcodes[Opcodes[\"HasBlockParams\"] = 23] = \"HasBlockParams\";\n Opcodes[Opcodes[\"Undefined\"] = 24] = \"Undefined\";\n Opcodes[Opcodes[\"Helper\"] = 25] = \"Helper\";\n Opcodes[Opcodes[\"Concat\"] = 26] = \"Concat\";\n Opcodes[Opcodes[\"ClientSideExpression\"] = 27] = \"ClientSideExpression\";\n })(Opcodes || (exports.Ops = Opcodes = {}));\n\n function is(variant) {\n return function (value) {\n return Array.isArray(value) && value[0] === variant;\n };\n }\n var Expressions;\n (function (Expressions) {\n Expressions.isUnknown = is(Opcodes.Unknown);\n Expressions.isGet = is(Opcodes.Get);\n Expressions.isConcat = is(Opcodes.Concat);\n Expressions.isHelper = is(Opcodes.Helper);\n Expressions.isHasBlock = is(Opcodes.HasBlock);\n Expressions.isHasBlockParams = is(Opcodes.HasBlockParams);\n Expressions.isUndefined = is(Opcodes.Undefined);\n Expressions.isClientSide = is(Opcodes.ClientSideExpression);\n Expressions.isMaybeLocal = is(Opcodes.MaybeLocal);\n function isPrimitiveValue(value) {\n if (value === null) {\n return true;\n }\n return typeof value !== 'object';\n }\n Expressions.isPrimitiveValue = isPrimitiveValue;\n })(Expressions || (exports.Expressions = Expressions = {}));\n var Statements;\n (function (Statements) {\n Statements.isText = is(Opcodes.Text);\n Statements.isAppend = is(Opcodes.Append);\n Statements.isComment = is(Opcodes.Comment);\n Statements.isModifier = is(Opcodes.Modifier);\n Statements.isBlock = is(Opcodes.Block);\n Statements.isComponent = is(Opcodes.Component);\n Statements.isOpenElement = is(Opcodes.OpenElement);\n Statements.isFlushElement = is(Opcodes.FlushElement);\n Statements.isCloseElement = is(Opcodes.CloseElement);\n Statements.isStaticAttr = is(Opcodes.StaticAttr);\n Statements.isDynamicAttr = is(Opcodes.DynamicAttr);\n Statements.isYield = is(Opcodes.Yield);\n Statements.isPartial = is(Opcodes.Partial);\n Statements.isDynamicArg = is(Opcodes.DynamicArg);\n Statements.isStaticArg = is(Opcodes.StaticArg);\n Statements.isTrustingAttr = is(Opcodes.TrustingAttr);\n Statements.isDebugger = is(Opcodes.Debugger);\n Statements.isClientSide = is(Opcodes.ClientSideStatement);\n function isAttribute(val) {\n return val[0] === Opcodes.StaticAttr || val[0] === Opcodes.DynamicAttr || val[0] === Opcodes.TrustingAttr;\n }\n Statements.isAttribute = isAttribute;\n function isArgument(val) {\n return val[0] === Opcodes.StaticArg || val[0] === Opcodes.DynamicArg;\n }\n Statements.isArgument = isArgument;\n function isParameter(val) {\n return isAttribute(val) || isArgument(val);\n }\n Statements.isParameter = isParameter;\n function getParameterName(s) {\n return s[1];\n }\n Statements.getParameterName = getParameterName;\n })(Statements || (exports.Statements = Statements = {}));\n\n exports.is = is;\n exports.Expressions = Expressions;\n exports.Statements = Statements;\n exports.Ops = Opcodes;\n});","enifed('backburner', ['exports', 'ember-babel'], function (exports, _emberBabel) {\n 'use strict';\n\n var NUMBER = /\\d+/;\n function isCoercableNumber(suspect) {\n var type = typeof suspect;\n return type === 'number' && suspect === suspect || type === 'string' && NUMBER.test(suspect);\n }\n function getOnError(options) {\n return options.onError || options.onErrorTarget && options.onErrorTarget[options.onErrorMethod];\n }\n function findItem(target, method, collection) {\n var index = -1;\n for (var i = 0, l = collection.length; i < l; i += 4) {\n if (collection[i] === target && collection[i + 1] === method) {\n index = i;\n break;\n }\n }\n return index;\n }\n function findTimer(timer, collection) {\n var index = -1;\n for (var i = 3; i < collection.length; i += 4) {\n if (collection[i] === timer) {\n index = i - 3;\n break;\n }\n }\n return index;\n }\n\n function binarySearch(time, timers) {\n var start = 0;\n var end = timers.length - 6;\n var middle = void 0;\n var l = void 0;\n while (start < end) {\n // since timers is an array of pairs 'l' will always\n // be an integer\n l = (end - start) / 6;\n // compensate for the index in case even number\n // of pairs inside timers\n middle = start + l - l % 6;\n if (time >= timers[middle]) {\n start = middle + 6;\n } else {\n end = middle;\n }\n }\n return time >= timers[start] ? start + 6 : start;\n }\n\n var Queue = function () {\n function Queue(name) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var globalOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n (0, _emberBabel.classCallCheck)(this, Queue);\n\n this._queueBeingFlushed = [];\n this.targetQueues = new Map();\n this.index = 0;\n this._queue = [];\n this.name = name;\n this.options = options;\n this.globalOptions = globalOptions;\n }\n\n Queue.prototype.stackFor = function stackFor(index) {\n if (index < this._queue.length) {\n var entry = this._queue[index * 3 + 4];\n if (entry) {\n return entry.stack;\n } else {\n return null;\n }\n }\n };\n\n Queue.prototype.flush = function flush(sync) {\n var _options = this.options,\n before = _options.before,\n after = _options.after;\n\n var target = void 0;\n var method = void 0;\n var args = void 0;\n var errorRecordedForStack = void 0;\n this.targetQueues.clear();\n if (this._queueBeingFlushed.length === 0) {\n this._queueBeingFlushed = this._queue;\n this._queue = [];\n }\n if (before !== undefined) {\n before();\n }\n var invoke = void 0;\n var queueItems = this._queueBeingFlushed;\n if (queueItems.length > 0) {\n var onError = getOnError(this.globalOptions);\n invoke = onError ? this.invokeWithOnError : this.invoke;\n for (var i = this.index; i < queueItems.length; i += 4) {\n this.index += 4;\n method = queueItems[i + 1];\n // method could have been nullified / canceled during flush\n if (method !== null) {\n //\n // ** Attention intrepid developer **\n //\n // To find out the stack of this task when it was scheduled onto\n // the run loop, add the following to your app.js:\n //\n // Ember.run.backburner.DEBUG = true; // NOTE: This slows your app, don't leave it on in production.\n //\n // Once that is in place, when you are at a breakpoint and navigate\n // here in the stack explorer, you can look at `errorRecordedForStack.stack`,\n // which will be the captured stack when this job was scheduled.\n //\n // One possible long-term solution is the following Chrome issue:\n // https://bugs.chromium.org/p/chromium/issues/detail?id=332624\n //\n target = queueItems[i];\n args = queueItems[i + 2];\n errorRecordedForStack = queueItems[i + 3]; // Debugging assistance\n invoke(target, method, args, onError, errorRecordedForStack);\n }\n if (this.index !== this._queueBeingFlushed.length && this.globalOptions.mustYield && this.globalOptions.mustYield()) {\n return 1 /* Pause */;\n }\n }\n }\n if (after !== undefined) {\n after();\n }\n this._queueBeingFlushed.length = 0;\n this.index = 0;\n if (sync !== false && this._queue.length > 0) {\n // check if new items have been added\n this.flush(true);\n }\n };\n\n Queue.prototype.hasWork = function hasWork() {\n return this._queueBeingFlushed.length > 0 || this._queue.length > 0;\n };\n\n Queue.prototype.cancel = function cancel(_ref) {\n var target = _ref.target,\n method = _ref.method;\n\n var queue = this._queue;\n var targetQueueMap = this.targetQueues.get(target);\n if (targetQueueMap !== undefined) {\n targetQueueMap.delete(method);\n }\n var index = findItem(target, method, queue);\n if (index > -1) {\n queue.splice(index, 4);\n return true;\n }\n // if not found in current queue\n // could be in the queue that is being flushed\n queue = this._queueBeingFlushed;\n index = findItem(target, method, queue);\n if (index > -1) {\n queue[index + 1] = null;\n return true;\n }\n return false;\n };\n\n Queue.prototype.push = function push(target, method, args, stack) {\n this._queue.push(target, method, args, stack);\n return {\n queue: this,\n target: target,\n method: method\n };\n };\n\n Queue.prototype.pushUnique = function pushUnique(target, method, args, stack) {\n var localQueueMap = this.targetQueues.get(target);\n if (localQueueMap === undefined) {\n localQueueMap = new Map();\n this.targetQueues.set(target, localQueueMap);\n }\n var index = localQueueMap.get(method);\n if (index === undefined) {\n var queueIndex = this._queue.push(target, method, args, stack) - 4;\n localQueueMap.set(method, queueIndex);\n } else {\n var queue = this._queue;\n queue[index + 2] = args; // replace args\n queue[index + 3] = stack; // replace stack\n }\n return {\n queue: this,\n target: target,\n method: method\n };\n };\n\n Queue.prototype.invoke = function invoke(target, method, args /*, onError, errorRecordedForStack */) {\n if (args === undefined) {\n method.call(target);\n } else {\n method.apply(target, args);\n }\n };\n\n Queue.prototype.invokeWithOnError = function invokeWithOnError(target, method, args, onError, errorRecordedForStack) {\n try {\n if (args === undefined) {\n method.call(target);\n } else {\n method.apply(target, args);\n }\n } catch (error) {\n onError(error, errorRecordedForStack);\n }\n };\n\n return Queue;\n }();\n\n var DeferredActionQueues = function () {\n function DeferredActionQueues() {\n var queueNames = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n var options = arguments[1];\n (0, _emberBabel.classCallCheck)(this, DeferredActionQueues);\n\n this.queues = {};\n this.queueNameIndex = 0;\n this.queueNames = queueNames;\n queueNames.reduce(function (queues, queueName) {\n queues[queueName] = new Queue(queueName, options[queueName], options);\n return queues;\n }, this.queues);\n }\n /*\n @method schedule\n @param {String} queueName\n @param {Any} target\n @param {Any} method\n @param {Any} args\n @param {Boolean} onceFlag\n @param {Any} stack\n @return queue\n */\n\n\n DeferredActionQueues.prototype.schedule = function schedule(queueName, target, method, args, onceFlag, stack) {\n var queues = this.queues;\n var queue = queues[queueName];\n if (queue === undefined) {\n throw new Error('You attempted to schedule an action in a queue (' + queueName + ') that doesn\\'t exist');\n }\n if (method === undefined || method === null) {\n throw new Error('You attempted to schedule an action in a queue (' + queueName + ') for a method that doesn\\'t exist');\n }\n if (onceFlag) {\n return queue.pushUnique(target, method, args, stack);\n } else {\n return queue.push(target, method, args, stack);\n }\n };\n\n DeferredActionQueues.prototype.flush = function flush() {\n var queue = void 0;\n var queueName = void 0;\n var numberOfQueues = this.queueNames.length;\n while (this.queueNameIndex < numberOfQueues) {\n queueName = this.queueNames[this.queueNameIndex];\n queue = this.queues[queueName];\n if (queue.hasWork() === false) {\n this.queueNameIndex++;\n } else {\n if (queue.flush(false /* async */) === 1 /* Pause */) {\n return 1 /* Pause */;\n }\n this.queueNameIndex = 0; // only reset to first queue if non-pause break\n }\n }\n };\n\n return DeferredActionQueues;\n }();\n\n var iteratorDrain = function (fn) {\n var iterator = fn();\n var result = iterator.next();\n while (result.done === false) {\n result.value();\n result = iterator.next();\n }\n };\n\n var noop = function () {};\n var SET_TIMEOUT = setTimeout;\n function parseArgs() {\n var length = arguments.length;\n var method = void 0;\n var target = void 0;\n var args = void 0;\n if (length === 1) {\n method = arguments[0];\n target = null;\n } else {\n target = arguments[0];\n method = arguments[1];\n if (typeof method === 'string') {\n method = target[method];\n }\n if (length > 2) {\n args = new Array(length - 2);\n for (var i = 0, l = length - 2; i < l; i++) {\n args[i] = arguments[i + 2];\n }\n }\n }\n return [target, method, args];\n }\n var UUID = 0;\n\n var Backburner = function () {\n function Backburner(queueNames) {\n var _this = this;\n\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n (0, _emberBabel.classCallCheck)(this, Backburner);\n\n this.DEBUG = false;\n this.currentInstance = null;\n this.instanceStack = [];\n this._debouncees = [];\n this._throttlers = [];\n this._eventCallbacks = {\n end: [],\n begin: []\n };\n this._timerTimeoutId = null;\n this._timers = [];\n this._autorun = null;\n this.queueNames = queueNames;\n this.options = options;\n if (!this.options.defaultQueue) {\n this.options.defaultQueue = queueNames[0];\n }\n this._onBegin = this.options.onBegin || noop;\n this._onEnd = this.options.onEnd || noop;\n var _platform = this.options._platform || {};\n var platform = Object.create(null);\n platform.setTimeout = _platform.setTimeout || function (fn, ms) {\n return setTimeout(fn, ms);\n };\n platform.clearTimeout = _platform.clearTimeout || function (id) {\n return clearTimeout(id);\n };\n platform.next = _platform.next || function (fn) {\n return SET_TIMEOUT(fn, 0);\n };\n platform.clearNext = _platform.clearNext || platform.clearTimeout;\n platform.now = _platform.now || function () {\n return Date.now();\n };\n this._platform = platform;\n this._boundRunExpiredTimers = function () {\n _this._runExpiredTimers();\n };\n this._boundAutorunEnd = function () {\n _this._autorun = null;\n _this.end();\n };\n }\n /*\n @method begin\n @return instantiated class DeferredActionQueues\n */\n\n\n Backburner.prototype.begin = function begin() {\n var options = this.options;\n var previousInstance = this.currentInstance;\n var current = void 0;\n if (this._autorun !== null) {\n current = previousInstance;\n this._cancelAutorun();\n } else {\n if (previousInstance !== null) {\n this.instanceStack.push(previousInstance);\n }\n current = this.currentInstance = new DeferredActionQueues(this.queueNames, options);\n this._trigger('begin', current, previousInstance);\n }\n this._onBegin(current, previousInstance);\n return current;\n };\n\n Backburner.prototype.end = function end() {\n var currentInstance = this.currentInstance;\n var nextInstance = null;\n if (currentInstance === null) {\n throw new Error('end called without begin');\n }\n // Prevent double-finally bug in Safari 6.0.2 and iOS 6\n // This bug appears to be resolved in Safari 6.0.5 and iOS 7\n var finallyAlreadyCalled = false;\n var result = void 0;\n try {\n result = currentInstance.flush();\n } finally {\n if (!finallyAlreadyCalled) {\n finallyAlreadyCalled = true;\n if (result === 1 /* Pause */) {\n var next = this._platform.next;\n this._autorun = next(this._boundAutorunEnd);\n } else {\n this.currentInstance = null;\n if (this.instanceStack.length > 0) {\n nextInstance = this.instanceStack.pop();\n this.currentInstance = nextInstance;\n }\n this._trigger('end', currentInstance, nextInstance);\n this._onEnd(currentInstance, nextInstance);\n }\n }\n }\n };\n\n Backburner.prototype.on = function on(eventName, callback) {\n if (typeof callback !== 'function') {\n throw new TypeError('Callback must be a function');\n }\n var callbacks = this._eventCallbacks[eventName];\n if (callbacks !== undefined) {\n callbacks.push(callback);\n } else {\n throw new TypeError('Cannot on() event ' + eventName + ' because it does not exist');\n }\n };\n\n Backburner.prototype.off = function off(eventName, callback) {\n var callbacks = this._eventCallbacks[eventName];\n if (!eventName || callbacks === undefined) {\n throw new TypeError('Cannot off() event ' + eventName + ' because it does not exist');\n }\n var callbackFound = false;\n if (callback) {\n for (var i = 0; i < callbacks.length; i++) {\n if (callbacks[i] === callback) {\n callbackFound = true;\n callbacks.splice(i, 1);\n i--;\n }\n }\n }\n if (!callbackFound) {\n throw new TypeError('Cannot off() callback that does not exist');\n }\n };\n\n Backburner.prototype.run = function run() {\n var _parseArgs = parseArgs.apply(undefined, arguments),\n target = _parseArgs[0],\n method = _parseArgs[1],\n args = _parseArgs[2];\n\n return this._run(target, method, args);\n };\n\n Backburner.prototype.join = function join() {\n var _parseArgs2 = parseArgs.apply(undefined, arguments),\n target = _parseArgs2[0],\n method = _parseArgs2[1],\n args = _parseArgs2[2];\n\n return this._join(target, method, args);\n };\n\n Backburner.prototype.defer = function defer(queueName, targetOrMethod) {\n for (var _len = arguments.length, _args = Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n _args[_key - 2] = arguments[_key];\n }\n\n return this.schedule.apply(this, [queueName, targetOrMethod].concat(_args));\n };\n\n Backburner.prototype.schedule = function schedule(queueName) {\n for (var _len2 = arguments.length, _args = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n _args[_key2 - 1] = arguments[_key2];\n }\n\n var _parseArgs3 = parseArgs.apply(undefined, _args),\n target = _parseArgs3[0],\n method = _parseArgs3[1],\n args = _parseArgs3[2];\n\n var stack = this.DEBUG ? new Error() : undefined;\n return this._ensureInstance().schedule(queueName, target, method, args, false, stack);\n };\n\n Backburner.prototype.scheduleIterable = function scheduleIterable(queueName, iterable) {\n var stack = this.DEBUG ? new Error() : undefined;\n return this._ensureInstance().schedule(queueName, null, iteratorDrain, [iterable], false, stack);\n };\n\n Backburner.prototype.deferOnce = function deferOnce(queueName, targetOrMethod) {\n for (var _len3 = arguments.length, args = Array(_len3 > 2 ? _len3 - 2 : 0), _key3 = 2; _key3 < _len3; _key3++) {\n args[_key3 - 2] = arguments[_key3];\n }\n\n return this.scheduleOnce.apply(this, [queueName, targetOrMethod].concat(args));\n };\n\n Backburner.prototype.scheduleOnce = function scheduleOnce(queueName) {\n for (var _len4 = arguments.length, _args = Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) {\n _args[_key4 - 1] = arguments[_key4];\n }\n\n var _parseArgs4 = parseArgs.apply(undefined, _args),\n target = _parseArgs4[0],\n method = _parseArgs4[1],\n args = _parseArgs4[2];\n\n var stack = this.DEBUG ? new Error() : undefined;\n return this._ensureInstance().schedule(queueName, target, method, args, true, stack);\n };\n\n Backburner.prototype.setTimeout = function setTimeout() {\n return this.later.apply(this, arguments);\n };\n\n Backburner.prototype.later = function later() {\n for (var _len5 = arguments.length, args = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {\n args[_key5] = arguments[_key5];\n }\n\n var length = args.length;\n var wait = 0;\n var method = void 0;\n var target = void 0;\n var methodOrTarget = void 0;\n var methodOrArgs = void 0;\n if (length === 0) {\n return;\n } else if (length === 1) {\n method = args.shift();\n } else {\n var last = args[args.length - 1];\n if (isCoercableNumber(last)) {\n wait = parseInt(args.pop(), 10);\n }\n methodOrTarget = args[0];\n methodOrArgs = args[1];\n var type = typeof methodOrArgs;\n if (type === 'function') {\n target = args.shift();\n method = args.shift();\n } else if (methodOrTarget !== null && type === 'string' && methodOrArgs in methodOrTarget) {\n target = args.shift();\n method = target[args.shift()];\n } else {\n method = args.shift();\n }\n }\n return this._setTimeout(target, method, args, wait);\n };\n\n Backburner.prototype.throttle = function throttle(targetOrThisArgOrMethod) {\n var _this2 = this;\n\n var target = void 0;\n var method = void 0;\n var immediate = void 0;\n var isImmediate = void 0;\n var wait = void 0;\n\n for (var _len6 = arguments.length, args = Array(_len6 > 1 ? _len6 - 1 : 0), _key6 = 1; _key6 < _len6; _key6++) {\n args[_key6 - 1] = arguments[_key6];\n }\n\n if (args.length === 1) {\n method = targetOrThisArgOrMethod;\n wait = args.pop();\n target = null;\n isImmediate = true;\n } else {\n target = targetOrThisArgOrMethod;\n method = args.shift();\n immediate = args.pop();\n var type = typeof method;\n if (type === 'string') {\n method = target[method];\n } else if (type !== 'function') {\n args.unshift(method);\n method = target;\n target = null;\n }\n if (isCoercableNumber(immediate)) {\n wait = immediate;\n isImmediate = true;\n } else {\n wait = args.pop();\n isImmediate = immediate === true;\n }\n }\n var index = findItem(target, method, this._throttlers);\n if (index > -1) {\n this._throttlers[index + 2] = args;\n return this._throttlers[index + 3];\n } // throttled\n wait = parseInt(wait, 10);\n var timer = this._platform.setTimeout(function () {\n var i = findTimer(timer, _this2._throttlers);\n\n var _throttlers$splice = _this2._throttlers.splice(i, 4),\n context = _throttlers$splice[0],\n func = _throttlers$splice[1],\n params = _throttlers$splice[2];\n\n if (isImmediate === false) {\n _this2._run(context, func, params);\n }\n }, wait);\n if (isImmediate) {\n this._join(target, method, args);\n }\n this._throttlers.push(target, method, args, timer);\n return timer;\n };\n\n Backburner.prototype.debounce = function debounce(targetOrThisArgOrMethod) {\n var _this3 = this;\n\n var target = void 0;\n var method = void 0;\n var immediate = void 0;\n var isImmediate = void 0;\n var wait = void 0;\n\n for (var _len7 = arguments.length, args = Array(_len7 > 1 ? _len7 - 1 : 0), _key7 = 1; _key7 < _len7; _key7++) {\n args[_key7 - 1] = arguments[_key7];\n }\n\n if (args.length === 1) {\n method = targetOrThisArgOrMethod;\n wait = args.pop();\n target = null;\n isImmediate = false;\n } else {\n target = targetOrThisArgOrMethod;\n method = args.shift();\n immediate = args.pop();\n var type = typeof method;\n if (type === 'string') {\n method = target[method];\n } else if (type !== 'function') {\n args.unshift(method);\n method = target;\n target = null;\n }\n if (isCoercableNumber(immediate)) {\n wait = immediate;\n isImmediate = false;\n } else {\n wait = args.pop();\n isImmediate = immediate === true;\n }\n }\n wait = parseInt(wait, 10);\n // Remove debouncee\n var index = findItem(target, method, this._debouncees);\n if (index > -1) {\n var timerId = this._debouncees[index + 3];\n this._platform.clearTimeout(timerId);\n this._debouncees.splice(index, 4);\n }\n var timer = this._platform.setTimeout(function () {\n var i = findTimer(timer, _this3._debouncees);\n\n var _debouncees$splice = _this3._debouncees.splice(i, 4),\n context = _debouncees$splice[0],\n func = _debouncees$splice[1],\n params = _debouncees$splice[2];\n\n if (isImmediate === false) {\n _this3._run(context, func, params);\n }\n }, wait);\n if (isImmediate && index === -1) {\n this._join(target, method, args);\n }\n this._debouncees.push(target, method, args, timer);\n return timer;\n };\n\n Backburner.prototype.cancelTimers = function cancelTimers() {\n for (var i = 3; i < this._throttlers.length; i += 4) {\n this._platform.clearTimeout(this._throttlers[i]);\n }\n this._throttlers = [];\n for (var t = 3; t < this._debouncees.length; t += 4) {\n this._platform.clearTimeout(this._debouncees[t]);\n }\n this._debouncees = [];\n this._clearTimerTimeout();\n this._timers = [];\n this._cancelAutorun();\n };\n\n Backburner.prototype.hasTimers = function hasTimers() {\n return this._timers.length > 0 || this._debouncees.length > 0 || this._throttlers.length > 0 || this._autorun !== null;\n };\n\n Backburner.prototype.cancel = function cancel(timer) {\n if (!timer) {\n return false;\n }\n var timerType = typeof timer;\n if (timerType === 'number') {\n return this._cancelItem(timer, this._throttlers) || this._cancelItem(timer, this._debouncees);\n } else if (timerType === 'string') {\n return this._cancelLaterTimer(timer);\n } else if (timerType === 'object' && timer.queue && timer.method) {\n return timer.queue.cancel(timer);\n }\n return false;\n };\n\n Backburner.prototype.ensureInstance = function ensureInstance() {\n this._ensureInstance();\n };\n\n Backburner.prototype._join = function _join(target, method, args) {\n if (this.currentInstance === null) {\n return this._run(target, method, args);\n }\n if (target === undefined && args === undefined) {\n return method();\n } else {\n return method.apply(target, args);\n }\n };\n\n Backburner.prototype._run = function _run(target, method, args) {\n var onError = getOnError(this.options);\n this.begin();\n if (onError) {\n try {\n return method.apply(target, args);\n } catch (error) {\n onError(error);\n } finally {\n this.end();\n }\n } else {\n try {\n return method.apply(target, args);\n } finally {\n this.end();\n }\n }\n };\n\n Backburner.prototype._cancelAutorun = function _cancelAutorun() {\n if (this._autorun !== null) {\n this._platform.clearNext(this._autorun);\n this._autorun = null;\n }\n };\n\n Backburner.prototype._setTimeout = function _setTimeout(target, method, args, wait) {\n var stack = this.DEBUG ? new Error() : undefined;\n var executeAt = this._platform.now() + wait;\n var id = UUID++ + '';\n if (this._timers.length === 0) {\n this._timers.push(executeAt, id, target, method, args, stack);\n this._installTimerTimeout();\n return id;\n }\n // find position to insert\n var i = binarySearch(executeAt, this._timers);\n this._timers.splice(i, 0, executeAt, id, target, method, args, stack);\n // we should be the new earliest timer if i == 0\n if (i === 0) {\n this._reinstallTimerTimeout();\n }\n return id;\n };\n\n Backburner.prototype._cancelLaterTimer = function _cancelLaterTimer(timer) {\n for (var i = 1; i < this._timers.length; i += 6) {\n if (this._timers[i] === timer) {\n i = i - 1;\n this._timers.splice(i, 6);\n if (i === 0) {\n this._reinstallTimerTimeout();\n }\n return true;\n }\n }\n return false;\n };\n\n Backburner.prototype._cancelItem = function _cancelItem(timer, array) {\n var index = findTimer(timer, array);\n if (index > -1) {\n this._platform.clearTimeout(timer);\n array.splice(index, 4);\n return true;\n }\n return false;\n };\n\n Backburner.prototype._trigger = function _trigger(eventName, arg1, arg2) {\n var callbacks = this._eventCallbacks[eventName];\n if (callbacks !== undefined) {\n for (var i = 0; i < callbacks.length; i++) {\n callbacks[i](arg1, arg2);\n }\n }\n };\n\n Backburner.prototype._runExpiredTimers = function _runExpiredTimers() {\n this._timerTimeoutId = null;\n if (this._timers.length === 0) {\n return;\n }\n this.begin();\n this._scheduleExpiredTimers();\n this.end();\n };\n\n Backburner.prototype._scheduleExpiredTimers = function _scheduleExpiredTimers() {\n var timers = this._timers;\n var i = 0;\n var l = timers.length;\n var defaultQueue = this.options.defaultQueue;\n var n = this._platform.now();\n for (; i < l; i += 6) {\n var executeAt = timers[i];\n if (executeAt <= n) {\n var target = timers[i + 2];\n var method = timers[i + 3];\n var _args2 = timers[i + 4];\n var stack = timers[i + 5];\n this.currentInstance.schedule(defaultQueue, target, method, _args2, false, stack);\n } else {\n break;\n }\n }\n timers.splice(0, i);\n this._installTimerTimeout();\n };\n\n Backburner.prototype._reinstallTimerTimeout = function _reinstallTimerTimeout() {\n this._clearTimerTimeout();\n this._installTimerTimeout();\n };\n\n Backburner.prototype._clearTimerTimeout = function _clearTimerTimeout() {\n if (this._timerTimeoutId === null) {\n return;\n }\n this._platform.clearTimeout(this._timerTimeoutId);\n this._timerTimeoutId = null;\n };\n\n Backburner.prototype._installTimerTimeout = function _installTimerTimeout() {\n if (this._timers.length === 0) {\n return;\n }\n var minExpiresAt = this._timers[0];\n var n = this._platform.now();\n var wait = Math.max(0, minExpiresAt - n);\n this._timerTimeoutId = this._platform.setTimeout(this._boundRunExpiredTimers, wait);\n };\n\n Backburner.prototype._ensureInstance = function _ensureInstance() {\n var currentInstance = this.currentInstance;\n if (currentInstance === null) {\n currentInstance = this.begin();\n var next = this._platform.next;\n this._autorun = next(this._boundAutorunEnd);\n }\n return currentInstance;\n };\n\n return Backburner;\n }();\n\n Backburner.Queue = Queue;\n\n exports.default = Backburner;\n});","enifed('container', ['exports', 'ember-babel', 'ember-utils', 'ember-debug', 'ember/features', 'ember-environment'], function (exports, _emberBabel, _emberUtils, _emberDebug, _features, _emberEnvironment) {\n 'use strict';\n\n exports.Container = exports.privatize = exports.Registry = undefined;\n\n var Container = function () {\n function Container(registry) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n (0, _emberBabel.classCallCheck)(this, Container);\n\n this.registry = registry;\n this.owner = options.owner || null;\n this.cache = (0, _emberUtils.dictionary)(options.cache || null);\n this.factoryManagerCache = (0, _emberUtils.dictionary)(options.factoryManagerCache || null);\n this.isDestroyed = false;\n\n if (true) {\n this.validationCache = (0, _emberUtils.dictionary)(options.validationCache || null);\n }\n }\n\n /**\n @private\n @property registry\n @type Registry\n @since 1.11.0\n */\n\n /**\n @private\n @property cache\n @type InheritingDict\n */\n\n /**\n @private\n @property validationCache\n @type InheritingDict\n */\n\n /**\n Given a fullName return a corresponding instance.\n The default behavior is for lookup to return a singleton instance.\n The singleton is scoped to the container, allowing multiple containers\n to all have their own locally scoped singletons.\n ```javascript\n let registry = new Registry();\n let container = registry.container();\n registry.register('api:twitter', Twitter);\n let twitter = container.lookup('api:twitter');\n twitter instanceof Twitter; // => true\n // by default the container will return singletons\n let twitter2 = container.lookup('api:twitter');\n twitter2 instanceof Twitter; // => true\n twitter === twitter2; //=> true\n ```\n If singletons are not wanted, an optional flag can be provided at lookup.\n ```javascript\n let registry = new Registry();\n let container = registry.container();\n registry.register('api:twitter', Twitter);\n let twitter = container.lookup('api:twitter', { singleton: false });\n let twitter2 = container.lookup('api:twitter', { singleton: false });\n twitter === twitter2; //=> false\n ```\n @private\n @method lookup\n @param {String} fullName\n @param {Object} [options]\n @param {String} [options.source] The fullname of the request source (used for local lookup)\n @return {any}\n */\n\n\n Container.prototype.lookup = function lookup(fullName, options) {\n (true && !(this.registry.isValidFullName(fullName)) && (0, _emberDebug.assert)('fullName must be a proper full name', this.registry.isValidFullName(fullName)));\n\n return _lookup(this, this.registry.normalize(fullName), options);\n };\n\n Container.prototype.destroy = function destroy() {\n destroyDestroyables(this);\n this.isDestroyed = true;\n };\n\n Container.prototype.reset = function reset(fullName) {\n if (fullName === undefined) {\n resetCache(this);\n } else {\n resetMember(this, this.registry.normalize(fullName));\n }\n };\n\n Container.prototype.ownerInjection = function ownerInjection() {\n var _ref;\n\n return _ref = {}, _ref[_emberUtils.OWNER] = this.owner, _ref;\n };\n\n Container.prototype._resolverCacheKey = function _resolverCacheKey(name, options) {\n return this.registry.resolverCacheKey(name, options);\n };\n\n Container.prototype.factoryFor = function factoryFor(fullName) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n var normalizedName = this.registry.normalize(fullName);\n\n (true && !(this.registry.isValidFullName(normalizedName)) && (0, _emberDebug.assert)('fullName must be a proper full name', this.registry.isValidFullName(normalizedName)));\n\n\n if (options.source) {\n var expandedFullName = this.registry.expandLocalLookup(fullName, options);\n // if expandLocalLookup returns falsey, we do not support local lookup\n if (!_features.EMBER_MODULE_UNIFICATION) {\n if (!expandedFullName) {\n return;\n }\n\n normalizedName = expandedFullName;\n } else if (expandedFullName) {\n // with ember-module-unification, if expandLocalLookup returns something,\n // pass it to the resolve without the source\n normalizedName = expandedFullName;\n options = {};\n }\n }\n\n var cacheKey = this._resolverCacheKey(normalizedName, options);\n var cached = this.factoryManagerCache[cacheKey];\n\n if (cached !== undefined) {\n return cached;\n }\n\n var factory = _features.EMBER_MODULE_UNIFICATION ? this.registry.resolve(normalizedName, options) : this.registry.resolve(normalizedName);\n\n if (factory === undefined) {\n return;\n }\n\n if (true && factory && typeof factory._onLookup === 'function') {\n factory._onLookup(fullName);\n }\n\n var manager = new FactoryManager(this, factory, fullName, normalizedName);\n\n if (true) {\n manager = wrapManagerInDeprecationProxy(manager);\n }\n\n this.factoryManagerCache[cacheKey] = manager;\n return manager;\n };\n\n return Container;\n }();\n\n /*\n * Wrap a factory manager in a proxy which will not permit properties to be\n * set on the manager.\n */\n function wrapManagerInDeprecationProxy(manager) {\n if (_emberUtils.HAS_NATIVE_PROXY) {\n var validator = {\n set: function (obj, prop) {\n throw new Error('You attempted to set \"' + prop + '\" on a factory manager created by container#factoryFor. A factory manager is a read-only construct.');\n }\n };\n\n // Note:\n // We have to proxy access to the manager here so that private property\n // access doesn't cause the above errors to occur.\n var m = manager;\n var proxiedManager = {\n class: m.class,\n create: function (props) {\n return m.create(props);\n }\n };\n\n return new Proxy(proxiedManager, validator);\n }\n\n return manager;\n }\n\n function isSingleton(container, fullName) {\n return container.registry.getOption(fullName, 'singleton') !== false;\n }\n\n function isInstantiatable(container, fullName) {\n return container.registry.getOption(fullName, 'instantiate') !== false;\n }\n\n function _lookup(container, fullName) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n if (options.source) {\n var expandedFullName = container.registry.expandLocalLookup(fullName, options);\n\n if (!_features.EMBER_MODULE_UNIFICATION) {\n // if expandLocalLookup returns falsey, we do not support local lookup\n if (!expandedFullName) {\n return;\n }\n\n fullName = expandedFullName;\n } else if (expandedFullName) {\n // with ember-module-unification, if expandLocalLookup returns something,\n // pass it to the resolve without the source\n fullName = expandedFullName;\n options = {};\n }\n }\n\n if (options.singleton !== false) {\n var cacheKey = container._resolverCacheKey(fullName, options);\n var cached = container.cache[cacheKey];\n if (cached !== undefined) {\n return cached;\n }\n }\n\n return instantiateFactory(container, fullName, options);\n }\n\n function isSingletonClass(container, fullName, _ref2) {\n var instantiate = _ref2.instantiate,\n singleton = _ref2.singleton;\n\n return singleton !== false && !instantiate && isSingleton(container, fullName) && !isInstantiatable(container, fullName);\n }\n\n function isSingletonInstance(container, fullName, _ref3) {\n var instantiate = _ref3.instantiate,\n singleton = _ref3.singleton;\n\n return singleton !== false && instantiate !== false && isSingleton(container, fullName) && isInstantiatable(container, fullName);\n }\n\n function isFactoryClass(container, fullname, _ref4) {\n var instantiate = _ref4.instantiate,\n singleton = _ref4.singleton;\n\n return instantiate === false && (singleton === false || !isSingleton(container, fullname)) && !isInstantiatable(container, fullname);\n }\n\n function isFactoryInstance(container, fullName, _ref5) {\n var instantiate = _ref5.instantiate,\n singleton = _ref5.singleton;\n\n return instantiate !== false && (singleton !== false || isSingleton(container, fullName)) && isInstantiatable(container, fullName);\n }\n\n function instantiateFactory(container, fullName, options) {\n var factoryManager = _features.EMBER_MODULE_UNIFICATION && options && options.source ? container.factoryFor(fullName, options) : container.factoryFor(fullName);\n\n if (factoryManager === undefined) {\n return;\n }\n\n // SomeClass { singleton: true, instantiate: true } | { singleton: true } | { instantiate: true } | {}\n // By default majority of objects fall into this case\n if (isSingletonInstance(container, fullName, options)) {\n var cacheKey = container._resolverCacheKey(fullName, options);\n return container.cache[cacheKey] = factoryManager.create();\n }\n\n // SomeClass { singleton: false, instantiate: true }\n if (isFactoryInstance(container, fullName, options)) {\n return factoryManager.create();\n }\n\n // SomeClass { singleton: true, instantiate: false } | { instantiate: false } | { singleton: false, instantiation: false }\n if (isSingletonClass(container, fullName, options) || isFactoryClass(container, fullName, options)) {\n return factoryManager.class;\n }\n\n throw new Error('Could not create factory');\n }\n\n function buildInjections(container, injections) {\n var hash = {};\n var isDynamic = false;\n\n if (injections.length > 0) {\n if (true) {\n container.registry.validateInjections(injections);\n }\n\n var injection = void 0;\n for (var i = 0; i < injections.length; i++) {\n injection = injections[i];\n hash[injection.property] = _lookup(container, injection.fullName);\n if (!isDynamic) {\n isDynamic = !isSingleton(container, injection.fullName);\n }\n }\n }\n\n return { injections: hash, isDynamic: isDynamic };\n }\n\n function injectionsFor(container, fullName) {\n var registry = container.registry;\n\n var _fullName$split = fullName.split(':'),\n type = _fullName$split[0];\n\n var injections = registry.getTypeInjections(type).concat(registry.getInjections(fullName));\n return buildInjections(container, injections);\n }\n\n function destroyDestroyables(container) {\n var cache = container.cache;\n var keys = Object.keys(cache);\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n var value = cache[key];\n\n if (value.destroy) {\n value.destroy();\n }\n }\n }\n\n function resetCache(container) {\n destroyDestroyables(container);\n container.cache = (0, _emberUtils.dictionary)(null);\n container.factoryManagerCache = (0, _emberUtils.dictionary)(null);\n }\n\n function resetMember(container, fullName) {\n var member = container.cache[fullName];\n\n delete container.factoryManagerCache[fullName];\n\n if (member) {\n delete container.cache[fullName];\n\n if (member.destroy) {\n member.destroy();\n }\n }\n }\n\n var FactoryManager = function () {\n function FactoryManager(container, factory, fullName, normalizedName) {\n (0, _emberBabel.classCallCheck)(this, FactoryManager);\n\n this.container = container;\n this.owner = container.owner;\n this.class = factory;\n this.fullName = fullName;\n this.normalizedName = normalizedName;\n this.madeToString = undefined;\n this.injections = undefined;\n }\n\n FactoryManager.prototype.toString = function toString() {\n if (this.madeToString === undefined) {\n this.madeToString = this.container.registry.makeToString(this.class, this.fullName);\n }\n\n return this.madeToString;\n };\n\n FactoryManager.prototype.create = function create() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n var injectionsCache = this.injections;\n if (injectionsCache === undefined) {\n var _injectionsFor = injectionsFor(this.container, this.normalizedName),\n injections = _injectionsFor.injections,\n isDynamic = _injectionsFor.isDynamic;\n\n injectionsCache = injections;\n if (!isDynamic) {\n this.injections = injections;\n }\n }\n\n var props = (0, _emberUtils.assign)({}, injectionsCache, options);\n\n if (true) {\n var lazyInjections = void 0;\n var validationCache = this.container.validationCache;\n // Ensure that all lazy injections are valid at instantiation time\n if (!validationCache[this.fullName] && this.class && typeof this.class._lazyInjections === 'function') {\n lazyInjections = this.class._lazyInjections();\n lazyInjections = this.container.registry.normalizeInjectionsHash(lazyInjections);\n\n this.container.registry.validateInjections(lazyInjections);\n }\n\n validationCache[this.fullName] = true;\n }\n\n if (!this.class.create) {\n throw new Error('Failed to create an instance of \\'' + this.normalizedName + '\\'. Most likely an improperly defined class or' + ' an invalid module export.');\n }\n\n // required to allow access to things like\n // the customized toString, _debugContainerKey,\n // owner, etc. without a double extend and without\n // modifying the objects properties\n if (typeof this.class._initFactory === 'function') {\n this.class._initFactory(this);\n } else {\n // in the non-EmberObject case we need to still setOwner\n // this is required for supporting glimmer environment and\n // template instantiation which rely heavily on\n // `options[OWNER]` being passed into `create`\n // TODO: clean this up, and remove in future versions\n (0, _emberUtils.setOwner)(props, this.owner);\n }\n\n return this.class.create(props);\n };\n\n return FactoryManager;\n }();\n\n var VALID_FULL_NAME_REGEXP = /^[^:]+:[^:]+$/;\n var missingResolverFunctionsDeprecation = 'Passing a `resolver` function into a Registry is deprecated. Please pass in a Resolver object with a `resolve` method.';\n\n /**\n A registry used to store factory and option information keyed\n by type.\n \n A `Registry` stores the factory and option information needed by a\n `Container` to instantiate and cache objects.\n \n The API for `Registry` is still in flux and should not be considered stable.\n \n @private\n @class Registry\n @since 1.11.0\n */\n\n var Registry = function () {\n function Registry() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n (0, _emberBabel.classCallCheck)(this, Registry);\n\n this.fallback = options.fallback || null;\n this.resolver = options.resolver || null;\n\n if (_emberEnvironment.ENV._ENABLE_RESOLVER_FUNCTION_SUPPORT !== true) {\n (true && !(typeof this.resolver !== 'function') && (0, _emberDebug.assert)(missingResolverFunctionsDeprecation, typeof this.resolver !== 'function'));\n }\n\n if (typeof this.resolver === 'function' && _emberEnvironment.ENV._ENABLE_RESOLVER_FUNCTION_SUPPORT === true) {\n deprecateResolverFunction(this);\n }\n\n this.registrations = (0, _emberUtils.dictionary)(options.registrations || null);\n\n this._typeInjections = (0, _emberUtils.dictionary)(null);\n this._injections = (0, _emberUtils.dictionary)(null);\n\n this._localLookupCache = Object.create(null);\n this._normalizeCache = (0, _emberUtils.dictionary)(null);\n this._resolveCache = (0, _emberUtils.dictionary)(null);\n this._failSet = new Set();\n\n this._options = (0, _emberUtils.dictionary)(null);\n this._typeOptions = (0, _emberUtils.dictionary)(null);\n }\n\n /**\n A backup registry for resolving registrations when no matches can be found.\n @private\n @property fallback\n @type Registry\n */\n\n /**\n An object that has a `resolve` method that resolves a name.\n @private\n @property resolver\n @type Resolver\n */\n\n /**\n @private\n @property registrations\n @type InheritingDict\n */\n\n /**\n @private\n @property _typeInjections\n @type InheritingDict\n */\n\n /**\n @private\n @property _injections\n @type InheritingDict\n */\n\n /**\n @private\n @property _normalizeCache\n @type InheritingDict\n */\n\n /**\n @private\n @property _resolveCache\n @type InheritingDict\n */\n\n /**\n @private\n @property _options\n @type InheritingDict\n */\n\n /**\n @private\n @property _typeOptions\n @type InheritingDict\n */\n\n /**\n Creates a container based on this registry.\n @private\n @method container\n @param {Object} options\n @return {Container} created container\n */\n\n\n Registry.prototype.container = function container(options) {\n return new Container(this, options);\n };\n\n Registry.prototype.register = function register(fullName, factory) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n (true && !(this.isValidFullName(fullName)) && (0, _emberDebug.assert)('fullName must be a proper full name', this.isValidFullName(fullName)));\n (true && !(factory !== undefined) && (0, _emberDebug.assert)('Attempting to register an unknown factory: \\'' + fullName + '\\'', factory !== undefined));\n\n\n var normalizedName = this.normalize(fullName);\n (true && !(!this._resolveCache[normalizedName]) && (0, _emberDebug.assert)('Cannot re-register: \\'' + fullName + '\\', as it has already been resolved.', !this._resolveCache[normalizedName]));\n\n\n this._failSet.delete(normalizedName);\n this.registrations[normalizedName] = factory;\n this._options[normalizedName] = options;\n };\n\n Registry.prototype.unregister = function unregister(fullName) {\n (true && !(this.isValidFullName(fullName)) && (0, _emberDebug.assert)('fullName must be a proper full name', this.isValidFullName(fullName)));\n\n\n var normalizedName = this.normalize(fullName);\n\n this._localLookupCache = Object.create(null);\n\n delete this.registrations[normalizedName];\n delete this._resolveCache[normalizedName];\n delete this._options[normalizedName];\n this._failSet.delete(normalizedName);\n };\n\n Registry.prototype.resolve = function resolve(fullName, options) {\n (true && !(this.isValidFullName(fullName)) && (0, _emberDebug.assert)('fullName must be a proper full name', this.isValidFullName(fullName)));\n\n var factory = _resolve(this, this.normalize(fullName), options);\n if (factory === undefined && this.fallback !== null) {\n var _fallback;\n\n factory = (_fallback = this.fallback).resolve.apply(_fallback, arguments);\n }\n return factory;\n };\n\n Registry.prototype.describe = function describe(fullName) {\n if (this.resolver !== null && this.resolver.lookupDescription) {\n return this.resolver.lookupDescription(fullName);\n } else if (this.fallback !== null) {\n return this.fallback.describe(fullName);\n } else {\n return fullName;\n }\n };\n\n Registry.prototype.normalizeFullName = function normalizeFullName(fullName) {\n if (this.resolver !== null && this.resolver.normalize) {\n return this.resolver.normalize(fullName);\n } else if (this.fallback !== null) {\n return this.fallback.normalizeFullName(fullName);\n } else {\n return fullName;\n }\n };\n\n Registry.prototype.normalize = function normalize(fullName) {\n return this._normalizeCache[fullName] || (this._normalizeCache[fullName] = this.normalizeFullName(fullName));\n };\n\n Registry.prototype.makeToString = function makeToString(factory, fullName) {\n if (this.resolver !== null && this.resolver.makeToString) {\n return this.resolver.makeToString(factory, fullName);\n } else if (this.fallback !== null) {\n return this.fallback.makeToString(factory, fullName);\n } else {\n return factory.toString();\n }\n };\n\n Registry.prototype.has = function has(fullName, options) {\n if (!this.isValidFullName(fullName)) {\n return false;\n }\n\n var source = options && options.source && this.normalize(options.source);\n\n return _has(this, this.normalize(fullName), source);\n };\n\n Registry.prototype.optionsForType = function optionsForType(type, options) {\n this._typeOptions[type] = options;\n };\n\n Registry.prototype.getOptionsForType = function getOptionsForType(type) {\n var optionsForType = this._typeOptions[type];\n if (optionsForType === undefined && this.fallback !== null) {\n optionsForType = this.fallback.getOptionsForType(type);\n }\n return optionsForType;\n };\n\n Registry.prototype.options = function options(fullName) {\n var _options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n var normalizedName = this.normalize(fullName);\n this._options[normalizedName] = _options;\n };\n\n Registry.prototype.getOptions = function getOptions(fullName) {\n var normalizedName = this.normalize(fullName);\n var options = this._options[normalizedName];\n\n if (options === undefined && this.fallback !== null) {\n options = this.fallback.getOptions(fullName);\n }\n return options;\n };\n\n Registry.prototype.getOption = function getOption(fullName, optionName) {\n var options = this._options[fullName];\n\n if (options && options[optionName] !== undefined) {\n return options[optionName];\n }\n\n var type = fullName.split(':')[0];\n options = this._typeOptions[type];\n\n if (options && options[optionName] !== undefined) {\n return options[optionName];\n } else if (this.fallback !== null) {\n return this.fallback.getOption(fullName, optionName);\n }\n };\n\n Registry.prototype.typeInjection = function typeInjection(type, property, fullName) {\n (true && !(this.isValidFullName(fullName)) && (0, _emberDebug.assert)('fullName must be a proper full name', this.isValidFullName(fullName)));\n\n\n var fullNameType = fullName.split(':')[0];\n (true && !(fullNameType !== type) && (0, _emberDebug.assert)('Cannot inject a \\'' + fullName + '\\' on other ' + type + '(s).', fullNameType !== type));\n\n\n var injections = this._typeInjections[type] || (this._typeInjections[type] = []);\n\n injections.push({ property: property, fullName: fullName });\n };\n\n Registry.prototype.injection = function injection(fullName, property, injectionName) {\n (true && !(this.isValidFullName(injectionName)) && (0, _emberDebug.assert)('Invalid injectionName, expected: \\'type:name\\' got: ' + injectionName, this.isValidFullName(injectionName)));\n\n\n var normalizedInjectionName = this.normalize(injectionName);\n\n if (fullName.indexOf(':') === -1) {\n return this.typeInjection(fullName, property, normalizedInjectionName);\n }\n\n (true && !(this.isValidFullName(fullName)) && (0, _emberDebug.assert)('fullName must be a proper full name', this.isValidFullName(fullName)));\n\n var normalizedName = this.normalize(fullName);\n\n var injections = this._injections[normalizedName] || (this._injections[normalizedName] = []);\n\n injections.push({ property: property, fullName: normalizedInjectionName });\n };\n\n Registry.prototype.knownForType = function knownForType(type) {\n var localKnown = (0, _emberUtils.dictionary)(null);\n var registeredNames = Object.keys(this.registrations);\n for (var index = 0; index < registeredNames.length; index++) {\n var fullName = registeredNames[index];\n var itemType = fullName.split(':')[0];\n\n if (itemType === type) {\n localKnown[fullName] = true;\n }\n }\n\n var fallbackKnown = void 0,\n resolverKnown = void 0;\n if (this.fallback !== null) {\n fallbackKnown = this.fallback.knownForType(type);\n }\n\n if (this.resolver !== null && this.resolver.knownForType) {\n resolverKnown = this.resolver.knownForType(type);\n }\n\n return (0, _emberUtils.assign)({}, fallbackKnown, localKnown, resolverKnown);\n };\n\n Registry.prototype.isValidFullName = function isValidFullName(fullName) {\n return VALID_FULL_NAME_REGEXP.test(fullName);\n };\n\n Registry.prototype.getInjections = function getInjections(fullName) {\n var injections = this._injections[fullName] || [];\n if (this.fallback !== null) {\n injections = injections.concat(this.fallback.getInjections(fullName));\n }\n return injections;\n };\n\n Registry.prototype.getTypeInjections = function getTypeInjections(type) {\n var injections = this._typeInjections[type] || [];\n if (this.fallback !== null) {\n injections = injections.concat(this.fallback.getTypeInjections(type));\n }\n return injections;\n };\n\n Registry.prototype.resolverCacheKey = function resolverCacheKey(name, options) {\n if (!_features.EMBER_MODULE_UNIFICATION) {\n return name;\n }\n\n return options && options.source ? options.source + ':' + name : name;\n };\n\n Registry.prototype.expandLocalLookup = function expandLocalLookup(fullName, options) {\n if (this.resolver !== null && this.resolver.expandLocalLookup) {\n (true && !(this.isValidFullName(fullName)) && (0, _emberDebug.assert)('fullName must be a proper full name', this.isValidFullName(fullName)));\n (true && !(options && options.source) && (0, _emberDebug.assert)('options.source must be provided to expandLocalLookup', options && options.source));\n (true && !(this.isValidFullName(options.source)) && (0, _emberDebug.assert)('options.source must be a proper full name', this.isValidFullName(options.source)));\n\n\n var normalizedFullName = this.normalize(fullName);\n var normalizedSource = this.normalize(options.source);\n\n return _expandLocalLookup(this, normalizedFullName, normalizedSource);\n } else if (this.fallback !== null) {\n return this.fallback.expandLocalLookup(fullName, options);\n } else {\n return null;\n }\n };\n\n return Registry;\n }();\n\n function deprecateResolverFunction(registry) {\n (true && !(false) && (0, _emberDebug.deprecate)(missingResolverFunctionsDeprecation, false, { id: 'ember-application.registry-resolver-as-function', until: '3.0.0', url: 'https://emberjs.com/deprecations/v2.x#toc_registry-resolver-as-function' }));\n\n registry.resolver = { resolve: registry.resolver };\n }\n\n if (true) {\n Registry.prototype.normalizeInjectionsHash = function (hash) {\n var injections = [];\n\n for (var key in hash) {\n if (hash.hasOwnProperty(key)) {\n (true && !(this.isValidFullName(hash[key])) && (0, _emberDebug.assert)('Expected a proper full name, given \\'' + hash[key] + '\\'', this.isValidFullName(hash[key])));\n\n\n injections.push({\n property: key,\n fullName: hash[key]\n });\n }\n }\n\n return injections;\n };\n\n Registry.prototype.validateInjections = function (injections) {\n if (!injections) {\n return;\n }\n\n var fullName = void 0;\n\n for (var i = 0; i < injections.length; i++) {\n fullName = injections[i].fullName;\n\n (true && !(this.has(fullName)) && (0, _emberDebug.assert)('Attempting to inject an unknown injection: \\'' + fullName + '\\'', this.has(fullName)));\n }\n };\n }\n\n function _expandLocalLookup(registry, normalizedName, normalizedSource) {\n var cache = registry._localLookupCache;\n var normalizedNameCache = cache[normalizedName];\n\n if (!normalizedNameCache) {\n normalizedNameCache = cache[normalizedName] = Object.create(null);\n }\n\n var cached = normalizedNameCache[normalizedSource];\n\n if (cached !== undefined) {\n return cached;\n }\n\n var expanded = registry.resolver.expandLocalLookup(normalizedName, normalizedSource);\n\n return normalizedNameCache[normalizedSource] = expanded;\n }\n\n function _resolve(registry, normalizedName, options) {\n if (options && options.source) {\n // when `source` is provided expand normalizedName\n // and source into the full normalizedName\n var expandedNormalizedName = registry.expandLocalLookup(normalizedName, options);\n\n // if expandLocalLookup returns falsey, we do not support local lookup\n if (!_features.EMBER_MODULE_UNIFICATION) {\n if (!expandedNormalizedName) {\n return;\n }\n\n normalizedName = expandedNormalizedName;\n } else if (expandedNormalizedName) {\n // with ember-module-unification, if expandLocalLookup returns something,\n // pass it to the resolve without the source\n normalizedName = expandedNormalizedName;\n options = {};\n }\n }\n\n var cacheKey = registry.resolverCacheKey(normalizedName, options);\n var cached = registry._resolveCache[cacheKey];\n if (cached !== undefined) {\n return cached;\n }\n if (registry._failSet.has(cacheKey)) {\n return;\n }\n\n var resolved = void 0;\n\n if (registry.resolver) {\n resolved = registry.resolver.resolve(normalizedName, options && options.source);\n }\n\n if (resolved === undefined) {\n resolved = registry.registrations[normalizedName];\n }\n\n if (resolved === undefined) {\n registry._failSet.add(cacheKey);\n } else {\n registry._resolveCache[cacheKey] = resolved;\n }\n\n return resolved;\n }\n\n function _has(registry, fullName, source) {\n return registry.resolve(fullName, { source: source }) !== undefined;\n }\n\n var privateNames = (0, _emberUtils.dictionary)(null);\n var privateSuffix = ('' + Math.random() + Date.now()).replace('.', '');\n\n function privatize(_ref6) {\n var fullName = _ref6[0];\n\n var name = privateNames[fullName];\n if (name) {\n return name;\n }\n\n var _fullName$split2 = fullName.split(':'),\n type = _fullName$split2[0],\n rawName = _fullName$split2[1];\n\n return privateNames[fullName] = (0, _emberUtils.intern)(type + ':' + rawName + '-' + privateSuffix);\n }\n\n /*\n Public API for the container is still in flux.\n The public API, specified on the application namespace should be considered the stable API.\n // @module container\n @private\n */\n\n exports.Registry = Registry;\n exports.privatize = privatize;\n exports.Container = Container;\n});","enifed(\"dag-map\", [\"exports\"], function (exports) {\n \"use strict\";\n\n /**\n * A topologically ordered map of key/value pairs with a simple API for adding constraints.\n *\n * Edges can forward reference keys that have not been added yet (the forward reference will\n * map the key to undefined).\n */\n var DAG = function () {\n function DAG() {\n this._vertices = new Vertices();\n }\n /**\n * Adds a key/value pair with dependencies on other key/value pairs.\n *\n * @public\n * @param key The key of the vertex to be added.\n * @param value The value of that vertex.\n * @param before A key or array of keys of the vertices that must\n * be visited before this vertex.\n * @param after An string or array of strings with the keys of the\n * vertices that must be after this vertex is visited.\n */\n DAG.prototype.add = function (key, value, before, after) {\n if (!key) throw new Error('argument `key` is required');\n var vertices = this._vertices;\n var v = vertices.add(key);\n v.val = value;\n if (before) {\n if (typeof before === \"string\") {\n vertices.addEdge(v, vertices.add(before));\n } else {\n for (var i = 0; i < before.length; i++) {\n vertices.addEdge(v, vertices.add(before[i]));\n }\n }\n }\n if (after) {\n if (typeof after === \"string\") {\n vertices.addEdge(vertices.add(after), v);\n } else {\n for (var i = 0; i < after.length; i++) {\n vertices.addEdge(vertices.add(after[i]), v);\n }\n }\n }\n };\n /**\n * @deprecated please use add.\n */\n DAG.prototype.addEdges = function (key, value, before, after) {\n this.add(key, value, before, after);\n };\n /**\n * Visits key/value pairs in topological order.\n *\n * @public\n * @param callback The function to be invoked with each key/value.\n */\n DAG.prototype.each = function (callback) {\n this._vertices.walk(callback);\n };\n /**\n * @deprecated please use each.\n */\n DAG.prototype.topsort = function (callback) {\n this.each(callback);\n };\n return DAG;\n }();\n exports.default = DAG;\n\n /** @private */\n var Vertices = function () {\n function Vertices() {\n this.length = 0;\n this.stack = new IntStack();\n this.path = new IntStack();\n this.result = new IntStack();\n }\n Vertices.prototype.add = function (key) {\n if (!key) throw new Error(\"missing key\");\n var l = this.length | 0;\n var vertex;\n for (var i = 0; i < l; i++) {\n vertex = this[i];\n if (vertex.key === key) return vertex;\n }\n this.length = l + 1;\n return this[l] = {\n idx: l,\n key: key,\n val: undefined,\n out: false,\n flag: false,\n length: 0\n };\n };\n Vertices.prototype.addEdge = function (v, w) {\n this.check(v, w.key);\n var l = w.length | 0;\n for (var i = 0; i < l; i++) {\n if (w[i] === v.idx) return;\n }\n w.length = l + 1;\n w[l] = v.idx;\n v.out = true;\n };\n Vertices.prototype.walk = function (cb) {\n this.reset();\n for (var i = 0; i < this.length; i++) {\n var vertex = this[i];\n if (vertex.out) continue;\n this.visit(vertex, \"\");\n }\n this.each(this.result, cb);\n };\n Vertices.prototype.check = function (v, w) {\n if (v.key === w) {\n throw new Error(\"cycle detected: \" + w + \" <- \" + w);\n }\n // quick check\n if (v.length === 0) return;\n // shallow check\n for (var i = 0; i < v.length; i++) {\n var key = this[v[i]].key;\n if (key === w) {\n throw new Error(\"cycle detected: \" + w + \" <- \" + v.key + \" <- \" + w);\n }\n }\n // deep check\n this.reset();\n this.visit(v, w);\n if (this.path.length > 0) {\n var msg_1 = \"cycle detected: \" + w;\n this.each(this.path, function (key) {\n msg_1 += \" <- \" + key;\n });\n throw new Error(msg_1);\n }\n };\n Vertices.prototype.reset = function () {\n this.stack.length = 0;\n this.path.length = 0;\n this.result.length = 0;\n for (var i = 0, l = this.length; i < l; i++) {\n this[i].flag = false;\n }\n };\n Vertices.prototype.visit = function (start, search) {\n var _a = this,\n stack = _a.stack,\n path = _a.path,\n result = _a.result;\n stack.push(start.idx);\n while (stack.length) {\n var index = stack.pop() | 0;\n if (index >= 0) {\n // enter\n var vertex = this[index];\n if (vertex.flag) continue;\n vertex.flag = true;\n path.push(index);\n if (search === vertex.key) break;\n // push exit\n stack.push(~index);\n this.pushIncoming(vertex);\n } else {\n // exit\n path.pop();\n result.push(~index);\n }\n }\n };\n Vertices.prototype.pushIncoming = function (incomming) {\n var stack = this.stack;\n for (var i = incomming.length - 1; i >= 0; i--) {\n var index = incomming[i];\n if (!this[index].flag) {\n stack.push(index);\n }\n }\n };\n Vertices.prototype.each = function (indices, cb) {\n for (var i = 0, l = indices.length; i < l; i++) {\n var vertex = this[indices[i]];\n cb(vertex.key, vertex.val);\n }\n };\n return Vertices;\n }();\n /** @private */\n var IntStack = function () {\n function IntStack() {\n this.length = 0;\n }\n IntStack.prototype.push = function (n) {\n this[this.length++] = n | 0;\n };\n IntStack.prototype.pop = function () {\n return this[--this.length] | 0;\n };\n return IntStack;\n }();\n});","enifed('ember-application/index', ['exports', 'ember-application/system/application', 'ember-application/system/application-instance', 'ember-application/system/resolver', 'ember-application/system/engine', 'ember-application/system/engine-instance', 'ember-application/system/engine-parent', 'ember-application/initializers/dom-templates'], function (exports, _application, _applicationInstance, _resolver, _engine, _engineInstance, _engineParent) {\n 'use strict';\n\n exports.setEngineParent = exports.getEngineParent = exports.EngineInstance = exports.Engine = exports.Resolver = exports.ApplicationInstance = exports.Application = undefined;\n Object.defineProperty(exports, 'Application', {\n enumerable: true,\n get: function () {\n return _application.default;\n }\n });\n Object.defineProperty(exports, 'ApplicationInstance', {\n enumerable: true,\n get: function () {\n return _applicationInstance.default;\n }\n });\n Object.defineProperty(exports, 'Resolver', {\n enumerable: true,\n get: function () {\n return _resolver.default;\n }\n });\n Object.defineProperty(exports, 'Engine', {\n enumerable: true,\n get: function () {\n return _engine.default;\n }\n });\n Object.defineProperty(exports, 'EngineInstance', {\n enumerable: true,\n get: function () {\n return _engineInstance.default;\n }\n });\n Object.defineProperty(exports, 'getEngineParent', {\n enumerable: true,\n get: function () {\n return _engineParent.getEngineParent;\n }\n });\n Object.defineProperty(exports, 'setEngineParent', {\n enumerable: true,\n get: function () {\n return _engineParent.setEngineParent;\n }\n });\n});","enifed('ember-application/initializers/dom-templates', ['require', 'ember-glimmer', 'ember-environment', 'ember-application/system/application'], function (_require2, _emberGlimmer, _emberEnvironment, _application) {\n 'use strict';\n\n var bootstrap = function () {};\n\n _application.default.initializer({\n name: 'domTemplates',\n initialize: function () {\n var bootstrapModuleId = 'ember-template-compiler/system/bootstrap';\n var context = void 0;\n if (_emberEnvironment.environment.hasDOM && (0, _require2.has)(bootstrapModuleId)) {\n bootstrap = (0, _require2.default)(bootstrapModuleId).default;\n context = document;\n }\n\n bootstrap({ context: context, hasTemplate: _emberGlimmer.hasTemplate, setTemplate: _emberGlimmer.setTemplate });\n }\n });\n});","enifed('ember-application/system/application-instance', ['exports', 'ember-utils', 'ember-metal', 'ember-environment', 'ember-views', 'ember-application/system/engine-instance', 'ember-glimmer'], function (exports, _emberUtils, _emberMetal, _emberEnvironment, _emberViews, _engineInstance, _emberGlimmer) {\n 'use strict';\n\n /**\n The `ApplicationInstance` encapsulates all of the stateful aspects of a\n running `Application`.\n \n At a high-level, we break application boot into two distinct phases:\n \n * Definition time, where all of the classes, templates, and other\n dependencies are loaded (typically in the browser).\n * Run time, where we begin executing the application once everything\n has loaded.\n \n Definition time can be expensive and only needs to happen once since it is\n an idempotent operation. For example, between test runs and FastBoot\n requests, the application stays the same. It is only the state that we want\n to reset.\n \n That state is what the `ApplicationInstance` manages: it is responsible for\n creating the container that contains all application state, and disposing of\n it once the particular test run or FastBoot request has finished.\n \n @public\n @class ApplicationInstance\n @extends EngineInstance\n */\n\n /**\n @module @ember/application\n */\n\n var ApplicationInstance = _engineInstance.default.extend({\n /**\n The `Application` for which this is an instance.\n @property {Application} application\n @private\n */\n application: null,\n\n /**\n The DOM events for which the event dispatcher should listen.\n By default, the application's `Ember.EventDispatcher` listens\n for a set of standard DOM events, such as `mousedown` and\n `keyup`, and delegates them to your application's `Ember.View`\n instances.\n @private\n @property {Object} customEvents\n */\n customEvents: null,\n\n /**\n The root DOM element of the Application as an element or a\n [jQuery-compatible selector\n string](http://api.jquery.com/category/selectors/).\n @private\n @property {String|DOMElement} rootElement\n */\n rootElement: null,\n\n init: function () {\n this._super.apply(this, arguments);\n\n // Register this instance in the per-instance registry.\n //\n // Why do we need to register the instance in the first place?\n // Because we need a good way for the root route (a.k.a ApplicationRoute)\n // to notify us when it has created the root-most view. That view is then\n // appended to the rootElement, in the case of apps, to the fixture harness\n // in tests, or rendered to a string in the case of FastBoot.\n this.register('-application-instance:main', this, { instantiate: false });\n },\n _bootSync: function (options) {\n if (this._booted) {\n return this;\n }\n\n options = new BootOptions(options);\n\n this.setupRegistry(options);\n\n if (options.rootElement) {\n this.rootElement = options.rootElement;\n } else {\n this.rootElement = this.application.rootElement;\n }\n\n if (options.location) {\n var router = (0, _emberMetal.get)(this, 'router');\n (0, _emberMetal.set)(router, 'location', options.location);\n }\n\n this.application.runInstanceInitializers(this);\n\n if (options.isInteractive) {\n this.setupEventDispatcher();\n }\n\n this._booted = true;\n\n return this;\n },\n setupRegistry: function (options) {\n this.constructor.setupRegistry(this.__registry__, options);\n },\n\n\n router: (0, _emberMetal.computed)(function () {\n return this.lookup('router:main');\n }).readOnly(),\n\n didCreateRootView: function (view) {\n view.appendTo(this.rootElement);\n },\n startRouting: function () {\n var router = (0, _emberMetal.get)(this, 'router');\n router.startRouting();\n this._didSetupRouter = true;\n },\n setupRouter: function () {\n if (this._didSetupRouter) {\n return;\n }\n this._didSetupRouter = true;\n\n var router = (0, _emberMetal.get)(this, 'router');\n router.setupRouter();\n },\n handleURL: function (url) {\n var router = (0, _emberMetal.get)(this, 'router');\n\n this.setupRouter();\n return router.handleURL(url);\n },\n setupEventDispatcher: function () {\n var dispatcher = this.lookup('event_dispatcher:main');\n var applicationCustomEvents = (0, _emberMetal.get)(this.application, 'customEvents');\n var instanceCustomEvents = (0, _emberMetal.get)(this, 'customEvents');\n\n var customEvents = (0, _emberUtils.assign)({}, applicationCustomEvents, instanceCustomEvents);\n dispatcher.setup(customEvents, this.rootElement);\n\n return dispatcher;\n },\n getURL: function () {\n return (0, _emberMetal.get)(this, 'router.url');\n },\n visit: function (url) {\n var _this = this;\n\n this.setupRouter();\n\n var bootOptions = this.__container__.lookup('-environment:main');\n\n var router = (0, _emberMetal.get)(this, 'router');\n\n var handleTransitionResolve = function () {\n if (!bootOptions.options.shouldRender) {\n // No rendering is needed, and routing has completed, simply return.\n return _this;\n } else {\n // Ensure that the visit promise resolves when all rendering has completed\n return (0, _emberGlimmer.renderSettled)().then(function () {\n return _this;\n });\n }\n };\n\n var handleTransitionReject = function (error) {\n if (error.error) {\n throw error.error;\n } else if (error.name === 'TransitionAborted' && router._routerMicrolib.activeTransition) {\n return router._routerMicrolib.activeTransition.then(handleTransitionResolve, handleTransitionReject);\n } else if (error.name === 'TransitionAborted') {\n throw new Error(error.message);\n } else {\n throw error;\n }\n };\n\n var location = (0, _emberMetal.get)(router, 'location');\n\n // Keeps the location adapter's internal URL in-sync\n location.setURL(url);\n\n // getURL returns the set url with the rootURL stripped off\n return router.handleURL(location.getURL()).then(handleTransitionResolve, handleTransitionReject);\n }\n });\n\n ApplicationInstance.reopenClass({\n setupRegistry: function (registry) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (!options.toEnvironment) {\n options = new BootOptions(options);\n }\n\n registry.register('-environment:main', options.toEnvironment(), { instantiate: false });\n registry.register('service:-document', options.document, { instantiate: false });\n\n this._super(registry, options);\n }\n });\n\n /**\n A list of boot-time configuration options for customizing the behavior of\n an `ApplicationInstance`.\n \n This is an interface class that exists purely to document the available\n options; you do not need to construct it manually. Simply pass a regular\n JavaScript object containing the desired options into methods that require\n one of these options object:\n \n ```javascript\n MyApp.visit(\"/\", { location: \"none\", rootElement: \"#container\" });\n ```\n \n Not all combinations of the supported options are valid. See the documentation\n on `Application#visit` for the supported configurations.\n \n Internal, experimental or otherwise unstable flags are marked as private.\n \n @class BootOptions\n @namespace ApplicationInstance\n @public\n */\n function BootOptions() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n /**\n Provide a specific instance of jQuery. This is useful in conjunction with\n the `document` option, as it allows you to use a copy of `jQuery` that is\n appropriately bound to the foreign `document` (e.g. a jsdom).\n This is highly experimental and support very incomplete at the moment.\n @property jQuery\n @type Object\n @default auto-detected\n @private\n */\n this.jQuery = _emberViews.jQuery; // This default is overridable below\n\n /**\n Interactive mode: whether we need to set up event delegation and invoke\n lifecycle callbacks on Components.\n @property isInteractive\n @type boolean\n @default auto-detected\n @private\n */\n this.isInteractive = _emberEnvironment.environment.hasDOM; // This default is overridable below\n\n /**\n Run in a full browser environment.\n When this flag is set to `false`, it will disable most browser-specific\n and interactive features. Specifically:\n * It does not use `jQuery` to append the root view; the `rootElement`\n (either specified as a subsequent option or on the application itself)\n must already be an `Element` in the given `document` (as opposed to a\n string selector).\n * It does not set up an `EventDispatcher`.\n * It does not run any `Component` lifecycle hooks (such as `didInsertElement`).\n * It sets the `location` option to `\"none\"`. (If you would like to use\n the location adapter specified in the app's router instead, you can also\n specify `{ location: null }` to specifically opt-out.)\n @property isBrowser\n @type boolean\n @default auto-detected\n @public\n */\n if (options.isBrowser !== undefined) {\n this.isBrowser = !!options.isBrowser;\n } else {\n this.isBrowser = _emberEnvironment.environment.hasDOM;\n }\n\n if (!this.isBrowser) {\n this.jQuery = null;\n this.isInteractive = false;\n this.location = 'none';\n }\n\n /**\n Disable rendering completely.\n When this flag is set to `true`, it will disable the entire rendering\n pipeline. Essentially, this puts the app into \"routing-only\" mode. No\n templates will be rendered, and no Components will be created.\n @property shouldRender\n @type boolean\n @default true\n @public\n */\n if (options.shouldRender !== undefined) {\n this.shouldRender = !!options.shouldRender;\n } else {\n this.shouldRender = true;\n }\n\n if (!this.shouldRender) {\n this.jQuery = null;\n this.isInteractive = false;\n }\n\n /**\n If present, render into the given `Document` object instead of the\n global `window.document` object.\n In practice, this is only useful in non-browser environment or in\n non-interactive mode, because Ember's `jQuery` dependency is\n implicitly bound to the current document, causing event delegation\n to not work properly when the app is rendered into a foreign\n document object (such as an iframe's `contentDocument`).\n In non-browser mode, this could be a \"`Document`-like\" object as\n Ember only interact with a small subset of the DOM API in non-\n interactive mode. While the exact requirements have not yet been\n formalized, the `SimpleDOM` library's implementation is known to\n work.\n @property document\n @type Document\n @default the global `document` object\n @public\n */\n if (options.document) {\n this.document = options.document;\n } else {\n this.document = typeof document !== 'undefined' ? document : null;\n }\n\n /**\n If present, overrides the application's `rootElement` property on\n the instance. This is useful for testing environment, where you\n might want to append the root view to a fixture area.\n In non-browser mode, because Ember does not have access to jQuery,\n this options must be specified as a DOM `Element` object instead of\n a selector string.\n See the documentation on `Application`'s `rootElement` for\n details.\n @property rootElement\n @type String|Element\n @default null\n @public\n */\n if (options.rootElement) {\n this.rootElement = options.rootElement;\n }\n\n // Set these options last to give the user a chance to override the\n // defaults from the \"combo\" options like `isBrowser` (although in\n // practice, the resulting combination is probably invalid)\n\n /**\n If present, overrides the router's `location` property with this\n value. This is useful for environments where trying to modify the\n URL would be inappropriate.\n @property location\n @type string\n @default null\n @public\n */\n if (options.location !== undefined) {\n this.location = options.location;\n }\n\n if (options.jQuery !== undefined) {\n this.jQuery = options.jQuery;\n }\n\n if (options.isInteractive !== undefined) {\n this.isInteractive = !!options.isInteractive;\n }\n }\n\n BootOptions.prototype.toEnvironment = function () {\n var env = (0, _emberUtils.assign)({}, _emberEnvironment.environment);\n // For compatibility with existing code\n env.hasDOM = this.isBrowser;\n env.isInteractive = this.isInteractive;\n env.options = this;\n return env;\n };\n\n exports.default = ApplicationInstance;\n});","enifed('ember-application/system/application', ['exports', 'ember-babel', 'ember-utils', 'ember-environment', 'ember-debug', 'ember-metal', 'ember-runtime', 'ember-views', 'ember-routing', 'ember-application/system/application-instance', 'container', 'ember-application/system/engine', 'ember-glimmer', 'ember/features'], function (exports, _emberBabel, _emberUtils, _emberEnvironment, _emberDebug, _emberMetal, _emberRuntime, _emberViews, _emberRouting, _applicationInstance, _container, _engine, _emberGlimmer, _features) {\n 'use strict';\n\n var _templateObject = (0, _emberBabel.taggedTemplateLiteralLoose)(['-bucket-cache:main'], ['-bucket-cache:main']);\n\n var librariesRegistered = false;\n\n /**\n An instance of `Application` is the starting point for every Ember\n application. It helps to instantiate, initialize and coordinate the many\n objects that make up your app.\n \n Each Ember app has one and only one `Application` object. In fact, the\n very first thing you should do in your application is create the instance:\n \n ```javascript\n import Application from '@ember/application';\n \n window.App = Application.create();\n ```\n \n Typically, the application object is the only global variable. All other\n classes in your app should be properties on the `Application` instance,\n which highlights its first role: a global namespace.\n \n For example, if you define a view class, it might look like this:\n \n ```javascript\n import Application from '@ember/application';\n \n App.MyView = Ember.View.extend();\n ```\n \n By default, calling `Application.create()` will automatically initialize\n your application by calling the `Application.initialize()` method. If\n you need to delay initialization, you can call your app's `deferReadiness()`\n method. When you are ready for your app to be initialized, call its\n `advanceReadiness()` method.\n \n You can define a `ready` method on the `Application` instance, which\n will be run by Ember when the application is initialized.\n \n Because `Application` inherits from `Ember.Namespace`, any classes\n you create will have useful string representations when calling `toString()`.\n See the `Ember.Namespace` documentation for more information.\n \n While you can think of your `Application` as a container that holds the\n other classes in your application, there are several other responsibilities\n going on under-the-hood that you may want to understand.\n \n ### Event Delegation\n \n Ember uses a technique called _event delegation_. This allows the framework\n to set up a global, shared event listener instead of requiring each view to\n do it manually. For example, instead of each view registering its own\n `mousedown` listener on its associated element, Ember sets up a `mousedown`\n listener on the `body`.\n \n If a `mousedown` event occurs, Ember will look at the target of the event and\n start walking up the DOM node tree, finding corresponding views and invoking\n their `mouseDown` method as it goes.\n \n `Application` has a number of default events that it listens for, as\n well as a mapping from lowercase events to camel-cased view method names. For\n example, the `keypress` event causes the `keyPress` method on the view to be\n called, the `dblclick` event causes `doubleClick` to be called, and so on.\n \n If there is a bubbling browser event that Ember does not listen for by\n default, you can specify custom events and their corresponding view method\n names by setting the application's `customEvents` property:\n \n ```javascript\n import Application from '@ember/application';\n \n let App = Application.create({\n customEvents: {\n // add support for the paste event\n paste: 'paste'\n }\n });\n ```\n \n To prevent Ember from setting up a listener for a default event,\n specify the event name with a `null` value in the `customEvents`\n property:\n \n ```javascript\n import Application from '@ember/application';\n \n let App = Application.create({\n customEvents: {\n // prevent listeners for mouseenter/mouseleave events\n mouseenter: null,\n mouseleave: null\n }\n });\n ```\n \n By default, the application sets up these event listeners on the document\n body. However, in cases where you are embedding an Ember application inside\n an existing page, you may want it to set up the listeners on an element\n inside the body.\n \n For example, if only events inside a DOM element with the ID of `ember-app`\n should be delegated, set your application's `rootElement` property:\n \n ```javascript\n import Application from '@ember/application';\n \n let App = Application.create({\n rootElement: '#ember-app'\n });\n ```\n \n The `rootElement` can be either a DOM element or a jQuery-compatible selector\n string. Note that *views appended to the DOM outside the root element will\n not receive events.* If you specify a custom root element, make sure you only\n append views inside it!\n \n To learn more about the events Ember components use, see\n \n [components/handling-events](https://guides.emberjs.com/current/components/handling-events/#toc_event-names).\n \n ### Initializers\n \n Libraries on top of Ember can add initializers, like so:\n \n ```javascript\n import Application from '@ember/application';\n \n Application.initializer({\n name: 'api-adapter',\n \n initialize: function(application) {\n application.register('api-adapter:main', ApiAdapter);\n }\n });\n ```\n \n Initializers provide an opportunity to access the internal registry, which\n organizes the different components of an Ember application. Additionally\n they provide a chance to access the instantiated application. Beyond\n being used for libraries, initializers are also a great way to organize\n dependency injection or setup in your own application.\n \n ### Routing\n \n In addition to creating your application's router, `Application` is\n also responsible for telling the router when to start routing. Transitions\n between routes can be logged with the `LOG_TRANSITIONS` flag, and more\n detailed intra-transition logging can be logged with\n the `LOG_TRANSITIONS_INTERNAL` flag:\n \n ```javascript\n import Application from '@ember/application';\n \n let App = Application.create({\n LOG_TRANSITIONS: true, // basic logging of successful transitions\n LOG_TRANSITIONS_INTERNAL: true // detailed logging of all routing steps\n });\n ```\n \n By default, the router will begin trying to translate the current URL into\n application state once the browser emits the `DOMContentReady` event. If you\n need to defer routing, you can call the application's `deferReadiness()`\n method. Once routing can begin, call the `advanceReadiness()` method.\n \n If there is any setup required before routing begins, you can implement a\n `ready()` method on your app that will be invoked immediately before routing\n begins.\n \n @class Application\n @extends Engine\n @uses RegistryProxyMixin\n @public\n */\n\n var Application = _engine.default.extend({\n /**\n The root DOM element of the Application. This can be specified as an\n element or a\n [jQuery-compatible selector string](http://api.jquery.com/category/selectors/).\n This is the element that will be passed to the Application's,\n `eventDispatcher`, which sets up the listeners for event delegation. Every\n view in your application should be a child of the element you specify here.\n @property rootElement\n @type DOMElement\n @default 'body'\n @public\n */\n rootElement: 'body',\n\n /**\n The `Ember.EventDispatcher` responsible for delegating events to this\n application's views.\n The event dispatcher is created by the application at initialization time\n and sets up event listeners on the DOM element described by the\n application's `rootElement` property.\n See the documentation for `Ember.EventDispatcher` for more information.\n @property eventDispatcher\n @type Ember.EventDispatcher\n @default null\n @public\n */\n eventDispatcher: null,\n\n /**\n The DOM events for which the event dispatcher should listen.\n By default, the application's `Ember.EventDispatcher` listens\n for a set of standard DOM events, such as `mousedown` and\n `keyup`, and delegates them to your application's `Ember.View`\n instances.\n If you would like additional bubbling events to be delegated to your\n views, set your `Application`'s `customEvents` property\n to a hash containing the DOM event name as the key and the\n corresponding view method name as the value. Setting an event to\n a value of `null` will prevent a default event listener from being\n added for that event.\n To add new events to be listened to:\n ```javascript\n import Application from '@ember/application';\n let App = Application.create({\n customEvents: {\n // add support for the paste event\n paste: 'paste'\n }\n });\n ```\n To prevent default events from being listened to:\n ```javascript\n import Application from '@ember/application';\n let App = Application.create({\n customEvents: {\n // remove support for mouseenter / mouseleave events\n mouseenter: null,\n mouseleave: null\n }\n });\n ```\n @property customEvents\n @type Object\n @default null\n @public\n */\n customEvents: null,\n\n /**\n Whether the application should automatically start routing and render\n templates to the `rootElement` on DOM ready. While default by true,\n other environments such as FastBoot or a testing harness can set this\n property to `false` and control the precise timing and behavior of the boot\n process.\n @property autoboot\n @type Boolean\n @default true\n @private\n */\n autoboot: true,\n\n /**\n Whether the application should be configured for the legacy \"globals mode\".\n Under this mode, the Application object serves as a global namespace for all\n classes.\n ```javascript\n import Application from '@ember/application';\n import Component from '@ember/component';\n let App = Application.create({\n ...\n });\n App.Router.reopen({\n location: 'none'\n });\n App.Router.map({\n ...\n });\n App.MyComponent = Component.extend({\n ...\n });\n ```\n This flag also exposes other internal APIs that assumes the existence of\n a special \"default instance\", like `App.__container__.lookup(...)`.\n This option is currently not configurable, its value is derived from\n the `autoboot` flag – disabling `autoboot` also implies opting-out of\n globals mode support, although they are ultimately orthogonal concerns.\n Some of the global modes features are already deprecated in 1.x. The\n existence of this flag is to untangle the globals mode code paths from\n the autoboot code paths, so that these legacy features can be reviewed\n for deprecation/removal separately.\n Forcing the (autoboot=true, _globalsMode=false) here and running the tests\n would reveal all the places where we are still relying on these legacy\n behavior internally (mostly just tests).\n @property _globalsMode\n @type Boolean\n @default true\n @private\n */\n _globalsMode: true,\n\n init: function (options) {\n // eslint-disable-line no-unused-vars\n this._super.apply(this, arguments);\n\n if (!this.$) {\n this.$ = _emberViews.jQuery;\n }\n\n registerLibraries();\n\n if (true) {\n logLibraryVersions();\n }\n\n // Start off the number of deferrals at 1. This will be decremented by\n // the Application's own `boot` method.\n this._readinessDeferrals = 1;\n this._booted = false;\n\n this.autoboot = this._globalsMode = !!this.autoboot;\n\n if (this._globalsMode) {\n this._prepareForGlobalsMode();\n }\n\n if (this.autoboot) {\n this.waitForDOMReady();\n }\n },\n buildInstance: function () {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n options.base = this;\n options.application = this;\n return _applicationInstance.default.create(options);\n },\n _prepareForGlobalsMode: function () {\n // Create subclass of Router for this Application instance.\n // This is to ensure that someone reopening `App.Router` does not\n // tamper with the default `Router`.\n this.Router = (this.Router || _emberRouting.Router).extend();\n\n this._buildDeprecatedInstance();\n },\n _buildDeprecatedInstance: function () {\n // Build a default instance\n var instance = this.buildInstance();\n\n // Legacy support for App.__container__ and other global methods\n // on App that rely on a single, default instance.\n this.__deprecatedInstance__ = instance;\n this.__container__ = instance.__container__;\n },\n waitForDOMReady: function () {\n if (!this.$ || this.$.isReady) {\n _emberMetal.run.schedule('actions', this, 'domReady');\n } else {\n this.$().ready(_emberMetal.run.bind(this, 'domReady'));\n }\n },\n domReady: function () {\n if (this.isDestroyed) {\n return;\n }\n\n this._bootSync();\n\n // Continues to `didBecomeReady`\n },\n deferReadiness: function () {\n (true && !(this instanceof Application) && (0, _emberDebug.assert)('You must call deferReadiness on an instance of Application', this instanceof Application));\n (true && !(this._readinessDeferrals > 0) && (0, _emberDebug.assert)('You cannot defer readiness since the `ready()` hook has already been called.', this._readinessDeferrals > 0));\n\n this._readinessDeferrals++;\n },\n advanceReadiness: function () {\n (true && !(this instanceof Application) && (0, _emberDebug.assert)('You must call advanceReadiness on an instance of Application', this instanceof Application));\n\n this._readinessDeferrals--;\n\n if (this._readinessDeferrals === 0) {\n _emberMetal.run.once(this, this.didBecomeReady);\n }\n },\n boot: function () {\n if (this._bootPromise) {\n return this._bootPromise;\n }\n\n try {\n this._bootSync();\n } catch (_) {\n // Ignore th error: in the asynchronous boot path, the error is already reflected\n // in the promise rejection\n }\n\n return this._bootPromise;\n },\n _bootSync: function () {\n if (this._booted) {\n return;\n }\n\n // Even though this returns synchronously, we still need to make sure the\n // boot promise exists for book-keeping purposes: if anything went wrong in\n // the boot process, we need to store the error as a rejection on the boot\n // promise so that a future caller of `boot()` can tell what failed.\n var defer = this._bootResolver = _emberRuntime.RSVP.defer();\n this._bootPromise = defer.promise;\n\n try {\n this.runInitializers();\n (0, _emberRuntime.runLoadHooks)('application', this);\n this.advanceReadiness();\n // Continues to `didBecomeReady`\n } catch (error) {\n // For the asynchronous boot path\n defer.reject(error);\n\n // For the synchronous boot path\n throw error;\n }\n },\n reset: function () {\n (true && !(this._globalsMode && this.autoboot) && (0, _emberDebug.assert)('Calling reset() on instances of `Application` is not\\n supported when globals mode is disabled; call `visit()` to\\n create new `ApplicationInstance`s and dispose them\\n via their `destroy()` method instead.', this._globalsMode && this.autoboot));\n\n\n var instance = this.__deprecatedInstance__;\n\n this._readinessDeferrals = 1;\n this._bootPromise = null;\n this._bootResolver = null;\n this._booted = false;\n\n function handleReset() {\n (0, _emberMetal.run)(instance, 'destroy');\n this._buildDeprecatedInstance();\n _emberMetal.run.schedule('actions', this, '_bootSync');\n }\n\n _emberMetal.run.join(this, handleReset);\n },\n didBecomeReady: function () {\n try {\n // TODO: Is this still needed for _globalsMode = false?\n if (!(0, _emberDebug.isTesting)()) {\n // Eagerly name all classes that are already loaded\n _emberRuntime.Namespace.processAll();\n (0, _emberRuntime.setNamespaceSearchDisabled)(true);\n }\n\n // See documentation on `_autoboot()` for details\n if (this.autoboot) {\n var instance = void 0;\n\n if (this._globalsMode) {\n // If we already have the __deprecatedInstance__ lying around, boot it to\n // avoid unnecessary work\n instance = this.__deprecatedInstance__;\n } else {\n // Otherwise, build an instance and boot it. This is currently unreachable,\n // because we forced _globalsMode to === autoboot; but having this branch\n // allows us to locally toggle that flag for weeding out legacy globals mode\n // dependencies independently\n instance = this.buildInstance();\n }\n\n instance._bootSync();\n\n // TODO: App.ready() is not called when autoboot is disabled, is this correct?\n this.ready();\n\n instance.startRouting();\n }\n\n // For the asynchronous boot path\n this._bootResolver.resolve(this);\n\n // For the synchronous boot path\n this._booted = true;\n } catch (error) {\n // For the asynchronous boot path\n this._bootResolver.reject(error);\n\n // For the synchronous boot path\n throw error;\n }\n },\n ready: function () {\n return this;\n },\n willDestroy: function () {\n this._super.apply(this, arguments);\n (0, _emberRuntime.setNamespaceSearchDisabled)(false);\n this._booted = false;\n this._bootPromise = null;\n this._bootResolver = null;\n\n if (_emberRuntime._loaded.application === this) {\n _emberRuntime._loaded.application = undefined;\n }\n\n if (this._globalsMode && this.__deprecatedInstance__) {\n this.__deprecatedInstance__.destroy();\n }\n },\n visit: function (url, options) {\n var _this = this;\n\n return this.boot().then(function () {\n var instance = _this.buildInstance();\n\n return instance.boot(options).then(function () {\n return instance.visit(url);\n }).catch(function (error) {\n (0, _emberMetal.run)(instance, 'destroy');\n throw error;\n });\n });\n }\n });\n\n Application.reopenClass({\n buildRegistry: function (application) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n // eslint-disable-line no-unused-vars\n var registry = this._super.apply(this, arguments);\n\n commonSetupRegistry(registry);\n\n (0, _emberGlimmer.setupApplicationRegistry)(registry);\n\n return registry;\n }\n });\n\n function commonSetupRegistry(registry) {\n registry.register('router:main', _emberRouting.Router.extend());\n registry.register('-view-registry:main', {\n create: function () {\n return (0, _emberUtils.dictionary)(null);\n }\n });\n\n registry.register('route:basic', _emberRouting.Route);\n registry.register('event_dispatcher:main', _emberViews.EventDispatcher);\n\n registry.injection('router:main', 'namespace', 'application:main');\n\n registry.register('location:auto', _emberRouting.AutoLocation);\n registry.register('location:hash', _emberRouting.HashLocation);\n registry.register('location:history', _emberRouting.HistoryLocation);\n registry.register('location:none', _emberRouting.NoneLocation);\n\n registry.register((0, _container.privatize)(_templateObject), _emberRouting.BucketCache);\n\n if (_features.EMBER_ROUTING_ROUTER_SERVICE) {\n registry.register('service:router', _emberRouting.RouterService);\n registry.injection('service:router', '_router', 'router:main');\n }\n }\n\n function registerLibraries() {\n if (!librariesRegistered) {\n librariesRegistered = true;\n\n if (_emberEnvironment.environment.hasDOM && typeof _emberViews.jQuery === 'function') {\n _emberMetal.libraries.registerCoreLibrary('jQuery', (0, _emberViews.jQuery)().jquery);\n }\n }\n }\n\n function logLibraryVersions() {\n if (true) {\n if (_emberEnvironment.ENV.LOG_VERSION) {\n // we only need to see this once per Application#init\n _emberEnvironment.ENV.LOG_VERSION = false;\n var libs = _emberMetal.libraries._registry;\n\n var nameLengths = libs.map(function (item) {\n return (0, _emberMetal.get)(item, 'name.length');\n });\n\n var maxNameLength = Math.max.apply(this, nameLengths);\n\n (0, _emberDebug.debug)('-------------------------------');\n for (var i = 0; i < libs.length; i++) {\n var lib = libs[i];\n var spaces = new Array(maxNameLength - lib.name.length + 1).join(' ');\n (0, _emberDebug.debug)([lib.name, spaces, ' : ', lib.version].join(''));\n }\n (0, _emberDebug.debug)('-------------------------------');\n }\n }\n }\n\n exports.default = Application;\n});","enifed('ember-application/system/engine-instance', ['exports', 'ember-babel', 'ember-utils', 'ember-runtime', 'ember-debug', 'container', 'ember-application/system/engine-parent'], function (exports, _emberBabel, _emberUtils, _emberRuntime, _emberDebug, _container, _engineParent) {\n 'use strict';\n\n var _templateObject = (0, _emberBabel.taggedTemplateLiteralLoose)(['-bucket-cache:main'], ['-bucket-cache:main']);\n\n /**\n The `EngineInstance` encapsulates all of the stateful aspects of a\n running `Engine`.\n \n @public\n @class EngineInstance\n @extends EmberObject\n @uses RegistryProxyMixin\n @uses ContainerProxyMixin\n */\n\n var EngineInstance = _emberRuntime.Object.extend(_emberRuntime.RegistryProxyMixin, _emberRuntime.ContainerProxyMixin, {\n /**\n The base `Engine` for which this is an instance.\n @property {Engine} engine\n @private\n */\n base: null,\n\n init: function () {\n this._super.apply(this, arguments);\n\n (0, _emberUtils.guidFor)(this);\n\n var base = this.base;\n\n if (!base) {\n base = this.application;\n this.base = base;\n }\n\n // Create a per-instance registry that will use the application's registry\n // as a fallback for resolving registrations.\n var registry = this.__registry__ = new _container.Registry({\n fallback: base.__registry__\n });\n\n // Create a per-instance container from the instance's registry\n this.__container__ = registry.container({ owner: this });\n\n this._booted = false;\n },\n boot: function (options) {\n var _this = this;\n\n if (this._bootPromise) {\n return this._bootPromise;\n }\n\n this._bootPromise = new _emberRuntime.RSVP.Promise(function (resolve) {\n return resolve(_this._bootSync(options));\n });\n\n return this._bootPromise;\n },\n _bootSync: function (options) {\n if (this._booted) {\n return this;\n }\n\n (true && !((0, _engineParent.getEngineParent)(this)) && (0, _emberDebug.assert)('An engine instance\\'s parent must be set via `setEngineParent(engine, parent)` prior to calling `engine.boot()`.', (0, _engineParent.getEngineParent)(this)));\n\n\n this.cloneParentDependencies();\n\n this.setupRegistry(options);\n\n this.base.runInstanceInitializers(this);\n\n this._booted = true;\n\n return this;\n },\n setupRegistry: function () {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.__container__.lookup('-environment:main');\n\n this.constructor.setupRegistry(this.__registry__, options);\n },\n unregister: function (fullName) {\n this.__container__.reset(fullName);\n this._super.apply(this, arguments);\n },\n buildChildEngineInstance: function (name) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n var Engine = this.lookup('engine:' + name);\n\n if (!Engine) {\n throw new _emberDebug.Error('You attempted to mount the engine \\'' + name + '\\', but it is not registered with its parent.');\n }\n\n var engineInstance = Engine.buildInstance(options);\n\n (0, _engineParent.setEngineParent)(engineInstance, this);\n\n return engineInstance;\n },\n cloneParentDependencies: function () {\n var _this2 = this;\n\n var parent = (0, _engineParent.getEngineParent)(this);\n\n var registrations = ['route:basic', 'service:-routing', 'service:-glimmer-environment'];\n\n registrations.forEach(function (key) {\n return _this2.register(key, parent.resolveRegistration(key));\n });\n\n var env = parent.lookup('-environment:main');\n this.register('-environment:main', env, { instantiate: false });\n\n var singletons = ['router:main', (0, _container.privatize)(_templateObject), '-view-registry:main', 'renderer:-' + (env.isInteractive ? 'dom' : 'inert'), 'service:-document'];\n\n if (env.isInteractive) {\n singletons.push('event_dispatcher:main');\n }\n\n singletons.forEach(function (key) {\n return _this2.register(key, parent.lookup(key), { instantiate: false });\n });\n\n this.inject('view', '_environment', '-environment:main');\n this.inject('route', '_environment', '-environment:main');\n }\n });\n\n EngineInstance.reopenClass({\n setupRegistry: function (registry, options) {\n // when no options/environment is present, do nothing\n if (!options) {\n return;\n }\n\n registry.injection('view', '_environment', '-environment:main');\n registry.injection('route', '_environment', '-environment:main');\n\n if (options.isInteractive) {\n registry.injection('view', 'renderer', 'renderer:-dom');\n registry.injection('component', 'renderer', 'renderer:-dom');\n } else {\n registry.injection('view', 'renderer', 'renderer:-inert');\n registry.injection('component', 'renderer', 'renderer:-inert');\n }\n }\n });\n\n exports.default = EngineInstance;\n});","enifed('ember-application/system/engine-parent', ['exports', 'ember-utils'], function (exports, _emberUtils) {\n 'use strict';\n\n exports.ENGINE_PARENT = undefined;\n exports.getEngineParent = getEngineParent;\n exports.setEngineParent = setEngineParent;\n var ENGINE_PARENT = exports.ENGINE_PARENT = (0, _emberUtils.symbol)('ENGINE_PARENT');\n\n /**\n `getEngineParent` retrieves an engine instance's parent instance.\n \n @method getEngineParent\n @param {EngineInstance} engine An engine instance.\n @return {EngineInstance} The parent engine instance.\n @for @ember/engine\n @static\n @private\n */\n function getEngineParent(engine) {\n return engine[ENGINE_PARENT];\n }\n\n /**\n `setEngineParent` sets an engine instance's parent instance.\n \n @method setEngineParent\n @param {EngineInstance} engine An engine instance.\n @param {EngineInstance} parent The parent engine instance.\n @private\n */\n function setEngineParent(engine, parent) {\n engine[ENGINE_PARENT] = parent;\n }\n});","enifed('ember-application/system/engine', ['exports', 'ember-babel', 'ember-utils', 'ember-runtime', 'container', 'dag-map', 'ember-debug', 'ember-metal', 'ember-application/system/resolver', 'ember-application/system/engine-instance', 'ember-routing', 'ember-extension-support', 'ember-views', 'ember-glimmer'], function (exports, _emberBabel, _emberUtils, _emberRuntime, _container, _dagMap, _emberDebug, _emberMetal, _resolver, _engineInstance, _emberRouting, _emberExtensionSupport, _emberViews, _emberGlimmer) {\n 'use strict';\n\n var _templateObject = (0, _emberBabel.taggedTemplateLiteralLoose)(['-bucket-cache:main'], ['-bucket-cache:main']);\n\n function props(obj) {\n var properties = [];\n\n for (var key in obj) {\n properties.push(key);\n }\n\n return properties;\n }\n\n /**\n The `Engine` class contains core functionality for both applications and\n engines.\n \n Each engine manages a registry that's used for dependency injection and\n exposed through `RegistryProxy`.\n \n Engines also manage initializers and instance initializers.\n \n Engines can spawn `EngineInstance` instances via `buildInstance()`.\n \n @class Engine\n @extends Ember.Namespace\n @uses RegistryProxy\n @public\n */\n var Engine = _emberRuntime.Namespace.extend(_emberRuntime.RegistryProxyMixin, {\n init: function () {\n this._super.apply(this, arguments);\n\n this.buildRegistry();\n },\n\n\n /**\n A private flag indicating whether an engine's initializers have run yet.\n @private\n @property _initializersRan\n */\n _initializersRan: false,\n\n ensureInitializers: function () {\n if (!this._initializersRan) {\n this.runInitializers();\n this._initializersRan = true;\n }\n },\n buildInstance: function () {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n this.ensureInitializers();\n options.base = this;\n return _engineInstance.default.create(options);\n },\n buildRegistry: function () {\n var registry = this.__registry__ = this.constructor.buildRegistry(this);\n\n return registry;\n },\n initializer: function (options) {\n this.constructor.initializer(options);\n },\n instanceInitializer: function (options) {\n this.constructor.instanceInitializer(options);\n },\n runInitializers: function () {\n var _this = this;\n\n this._runInitializer('initializers', function (name, initializer) {\n (true && !(!!initializer) && (0, _emberDebug.assert)('No application initializer named \\'' + name + '\\'', !!initializer));\n\n initializer.initialize(_this);\n });\n },\n runInstanceInitializers: function (instance) {\n this._runInitializer('instanceInitializers', function (name, initializer) {\n (true && !(!!initializer) && (0, _emberDebug.assert)('No instance initializer named \\'' + name + '\\'', !!initializer));\n\n initializer.initialize(instance);\n });\n },\n _runInitializer: function (bucketName, cb) {\n var initializersByName = (0, _emberMetal.get)(this.constructor, bucketName);\n var initializers = props(initializersByName);\n var graph = new _dagMap.default();\n var initializer = void 0;\n\n for (var i = 0; i < initializers.length; i++) {\n initializer = initializersByName[initializers[i]];\n graph.add(initializer.name, initializer, initializer.before, initializer.after);\n }\n\n graph.topsort(cb);\n }\n });\n\n Engine.reopenClass({\n initializers: Object.create(null),\n instanceInitializers: Object.create(null),\n\n /**\n The goal of initializers should be to register dependencies and injections.\n This phase runs once. Because these initializers may load code, they are\n allowed to defer application readiness and advance it. If you need to access\n the container or store you should use an InstanceInitializer that will be run\n after all initializers and therefore after all code is loaded and the app is\n ready.\n Initializer receives an object which has the following attributes:\n `name`, `before`, `after`, `initialize`. The only required attribute is\n `initialize`, all others are optional.\n * `name` allows you to specify under which name the initializer is registered.\n This must be a unique name, as trying to register two initializers with the\n same name will result in an error.\n ```app/initializer/named-initializer.js\n import { debug } from '@ember/debug';\n export function initialize() {\n debug('Running namedInitializer!');\n }\n export default {\n name: 'named-initializer',\n initialize\n };\n ```\n * `before` and `after` are used to ensure that this initializer is ran prior\n or after the one identified by the value. This value can be a single string\n or an array of strings, referencing the `name` of other initializers.\n An example of ordering initializers, we create an initializer named `first`:\n ```app/initializer/first.js\n import { debug } from '@ember/debug';\n export function initialize() {\n debug('First initializer!');\n }\n export default {\n name: 'first',\n initialize\n };\n ```\n ```bash\n // DEBUG: First initializer!\n ```\n We add another initializer named `second`, specifying that it should run\n after the initializer named `first`:\n ```app/initializer/second.js\n import { debug } from '@ember/debug';\n export function initialize() {\n debug('Second initializer!');\n }\n export default {\n name: 'second',\n after: 'first',\n initialize\n };\n ```\n ```\n // DEBUG: First initializer!\n // DEBUG: Second initializer!\n ```\n Afterwards we add a further initializer named `pre`, this time specifying\n that it should run before the initializer named `first`:\n ```app/initializer/pre.js\n import { debug } from '@ember/debug';\n export function initialize() {\n debug('Pre initializer!');\n }\n export default {\n name: 'pre',\n before: 'first',\n initialize\n };\n ```\n ```bash\n // DEBUG: Pre initializer!\n // DEBUG: First initializer!\n // DEBUG: Second initializer!\n ```\n Finally we add an initializer named `post`, specifying it should run after\n both the `first` and the `second` initializers:\n ```app/initializer/post.js\n import { debug } from '@ember/debug';\n export function initialize() {\n debug('Post initializer!');\n }\n export default {\n name: 'post',\n after: ['first', 'second'],\n initialize\n };\n ```\n ```bash\n // DEBUG: Pre initializer!\n // DEBUG: First initializer!\n // DEBUG: Second initializer!\n // DEBUG: Post initializer!\n ```\n * `initialize` is a callback function that receives one argument,\n `application`, on which you can operate.\n Example of using `application` to register an adapter:\n ```app/initializer/api-adapter.js\n import ApiAdapter from '../utils/api-adapter';\n export function initialize(application) {\n application.register('api-adapter:main', ApiAdapter);\n }\n export default {\n name: 'post',\n after: ['first', 'second'],\n initialize\n };\n ```\n @method initializer\n @param initializer {Object}\n @public\n */\n\n initializer: buildInitializerMethod('initializers', 'initializer'),\n\n /**\n Instance initializers run after all initializers have run. Because\n instance initializers run after the app is fully set up. We have access\n to the store, container, and other items. However, these initializers run\n after code has loaded and are not allowed to defer readiness.\n Instance initializer receives an object which has the following attributes:\n `name`, `before`, `after`, `initialize`. The only required attribute is\n `initialize`, all others are optional.\n * `name` allows you to specify under which name the instanceInitializer is\n registered. This must be a unique name, as trying to register two\n instanceInitializer with the same name will result in an error.\n ```app/initializer/named-instance-initializer.js\n import { debug } from '@ember/debug';\n export function initialize() {\n debug('Running named-instance-initializer!');\n }\n export default {\n name: 'named-instance-initializer',\n initialize\n };\n ```\n * `before` and `after` are used to ensure that this initializer is ran prior\n or after the one identified by the value. This value can be a single string\n or an array of strings, referencing the `name` of other initializers.\n * See Application.initializer for discussion on the usage of before\n and after.\n Example instanceInitializer to preload data into the store.\n ```app/initializer/preload-data.js\n import $ from 'jquery';\n export function initialize(application) {\n var userConfig, userConfigEncoded, store;\n // We have a HTML escaped JSON representation of the user's basic\n // configuration generated server side and stored in the DOM of the main\n // index.html file. This allows the app to have access to a set of data\n // without making any additional remote calls. Good for basic data that is\n // needed for immediate rendering of the page. Keep in mind, this data,\n // like all local models and data can be manipulated by the user, so it\n // should not be relied upon for security or authorization.\n // Grab the encoded data from the meta tag\n userConfigEncoded = $('head meta[name=app-user-config]').attr('content');\n // Unescape the text, then parse the resulting JSON into a real object\n userConfig = JSON.parse(unescape(userConfigEncoded));\n // Lookup the store\n store = application.lookup('service:store');\n // Push the encoded JSON into the store\n store.pushPayload(userConfig);\n }\n export default {\n name: 'named-instance-initializer',\n initialize\n };\n ```\n @method instanceInitializer\n @param instanceInitializer\n @public\n */\n instanceInitializer: buildInitializerMethod('instanceInitializers', 'instance initializer'),\n\n buildRegistry: function (namespace) {\n var registry = new _container.Registry({\n resolver: resolverFor(namespace)\n });\n\n registry.set = _emberMetal.set;\n\n registry.register('application:main', namespace, { instantiate: false });\n\n commonSetupRegistry(registry);\n (0, _emberGlimmer.setupEngineRegistry)(registry);\n\n return registry;\n },\n\n\n /**\n Set this to provide an alternate class to `DefaultResolver`\n @deprecated Use 'Resolver' instead\n @property resolver\n @public\n */\n resolver: null,\n\n /**\n Set this to provide an alternate class to `DefaultResolver`\n @property resolver\n @public\n */\n Resolver: null\n });\n\n /**\n This function defines the default lookup rules for container lookups:\n \n * templates are looked up on `Ember.TEMPLATES`\n * other names are looked up on the application after classifying the name.\n For example, `controller:post` looks up `App.PostController` by default.\n * if the default lookup fails, look for registered classes on the container\n \n This allows the application to register default injections in the container\n that could be overridden by the normal naming convention.\n \n @private\n @method resolverFor\n @param {Ember.Namespace} namespace the namespace to look for classes\n @return {*} the resolved value for a given lookup\n */\n function resolverFor(namespace) {\n var ResolverClass = namespace.get('Resolver') || _resolver.default;\n\n return ResolverClass.create({\n namespace: namespace\n });\n }\n\n function buildInitializerMethod(bucketName, humanName) {\n return function (initializer) {\n // If this is the first initializer being added to a subclass, we are going to reopen the class\n // to make sure we have a new `initializers` object, which extends from the parent class' using\n // prototypal inheritance. Without this, attempting to add initializers to the subclass would\n // pollute the parent class as well as other subclasses.\n if (this.superclass[bucketName] !== undefined && this.superclass[bucketName] === this[bucketName]) {\n var attrs = {};\n attrs[bucketName] = Object.create(this[bucketName]);\n this.reopenClass(attrs);\n }\n\n (true && !(!this[bucketName][initializer.name]) && (0, _emberDebug.assert)('The ' + humanName + ' \\'' + initializer.name + '\\' has already been registered', !this[bucketName][initializer.name]));\n (true && !((0, _emberUtils.canInvoke)(initializer, 'initialize')) && (0, _emberDebug.assert)('An ' + humanName + ' cannot be registered without an initialize function', (0, _emberUtils.canInvoke)(initializer, 'initialize')));\n (true && !(initializer.name !== undefined) && (0, _emberDebug.assert)('An ' + humanName + ' cannot be registered without a name property', initializer.name !== undefined));\n\n\n this[bucketName][initializer.name] = initializer;\n };\n }\n\n function commonSetupRegistry(registry) {\n registry.optionsForType('component', { singleton: false });\n registry.optionsForType('view', { singleton: false });\n\n registry.register('controller:basic', _emberRuntime.Controller, { instantiate: false });\n\n registry.injection('view', '_viewRegistry', '-view-registry:main');\n registry.injection('renderer', '_viewRegistry', '-view-registry:main');\n registry.injection('event_dispatcher:main', '_viewRegistry', '-view-registry:main');\n\n registry.injection('route', '_topLevelViewTemplate', 'template:-outlet');\n\n registry.injection('view:-outlet', 'namespace', 'application:main');\n\n registry.injection('controller', 'target', 'router:main');\n registry.injection('controller', 'namespace', 'application:main');\n\n registry.injection('router', '_bucketCache', (0, _container.privatize)(_templateObject));\n registry.injection('route', '_bucketCache', (0, _container.privatize)(_templateObject));\n\n registry.injection('route', 'router', 'router:main');\n\n // Register the routing service...\n registry.register('service:-routing', _emberRouting.RoutingService);\n // Then inject the app router into it\n registry.injection('service:-routing', 'router', 'router:main');\n\n // DEBUGGING\n registry.register('resolver-for-debugging:main', registry.resolver, { instantiate: false });\n registry.injection('container-debug-adapter:main', 'resolver', 'resolver-for-debugging:main');\n registry.injection('data-adapter:main', 'containerDebugAdapter', 'container-debug-adapter:main');\n // Custom resolver authors may want to register their own ContainerDebugAdapter with this key\n\n registry.register('container-debug-adapter:main', _emberExtensionSupport.ContainerDebugAdapter);\n\n registry.register('component-lookup:main', _emberViews.ComponentLookup);\n }\n\n exports.default = Engine;\n});","enifed('ember-application/system/resolver', ['exports', 'ember-utils', 'ember-metal', 'ember-debug', 'ember-runtime', 'ember-application/utils/validate-type', 'ember-glimmer'], function (exports, _emberUtils, _emberMetal, _emberDebug, _emberRuntime, _validateType, _emberGlimmer) {\n 'use strict';\n\n exports.Resolver = undefined;\n /**\n @module @ember/application\n */\n\n var Resolver = exports.Resolver = _emberRuntime.Object.extend({\n /*\n This will be set to the Application instance when it is\n created.\n @property namespace\n */\n namespace: null,\n normalize: null, // required\n resolve: null, // required\n parseName: null, // required\n lookupDescription: null, // required\n makeToString: null, // required\n resolveOther: null, // required\n _logLookup: null // required\n });\n\n /**\n The DefaultResolver defines the default lookup rules to resolve\n container lookups before consulting the container for registered\n items:\n \n * templates are looked up on `Ember.TEMPLATES`\n * other names are looked up on the application after converting\n the name. For example, `controller:post` looks up\n `App.PostController` by default.\n * there are some nuances (see examples below)\n \n ### How Resolving Works\n \n The container calls this object's `resolve` method with the\n `fullName` argument.\n \n It first parses the fullName into an object using `parseName`.\n \n Then it checks for the presence of a type-specific instance\n method of the form `resolve[Type]` and calls it if it exists.\n For example if it was resolving 'template:post', it would call\n the `resolveTemplate` method.\n \n Its last resort is to call the `resolveOther` method.\n \n The methods of this object are designed to be easy to override\n in a subclass. For example, you could enhance how a template\n is resolved like so:\n \n ```app/app.js\n import Application from '@ember/application';\n import GlobalsResolver from '@ember/application/globals-resolver';\n \n App = Application.create({\n Resolver: GlobalsResolver.extend({\n resolveTemplate(parsedName) {\n let resolvedTemplate = this._super(parsedName);\n if (resolvedTemplate) { return resolvedTemplate; }\n \n return Ember.TEMPLATES['not_found'];\n }\n })\n });\n ```\n \n Some examples of how names are resolved:\n \n ```text\n 'template:post' //=> Ember.TEMPLATES['post']\n 'template:posts/byline' //=> Ember.TEMPLATES['posts/byline']\n 'template:posts.byline' //=> Ember.TEMPLATES['posts/byline']\n 'template:blogPost' //=> Ember.TEMPLATES['blog-post']\n 'controller:post' //=> App.PostController\n 'controller:posts.index' //=> App.PostsIndexController\n 'controller:blog/post' //=> Blog.PostController\n 'controller:basic' //=> Controller\n 'route:post' //=> App.PostRoute\n 'route:posts.index' //=> App.PostsIndexRoute\n 'route:blog/post' //=> Blog.PostRoute\n 'route:basic' //=> Route\n 'foo:post' //=> App.PostFoo\n 'model:post' //=> App.Post\n ```\n \n @class GlobalsResolver\n @extends EmberObject\n @public\n */\n\n var DefaultResolver = _emberRuntime.Object.extend({\n /**\n This will be set to the Application instance when it is\n created.\n @property namespace\n @public\n */\n namespace: null,\n\n init: function () {\n this._parseNameCache = (0, _emberUtils.dictionary)(null);\n },\n normalize: function (fullName) {\n var _fullName$split = fullName.split(':'),\n type = _fullName$split[0],\n name = _fullName$split[1];\n\n (true && !(fullName.split(':').length === 2) && (0, _emberDebug.assert)('Tried to normalize a container name without a colon (:) in it. ' + 'You probably tried to lookup a name that did not contain a type, ' + 'a colon, and a name. A proper lookup name would be `view:post`.', fullName.split(':').length === 2));\n\n\n if (type !== 'template') {\n var result = name.replace(/(\\.|_|-)./g, function (m) {\n return m.charAt(1).toUpperCase();\n });\n\n return type + ':' + result;\n } else {\n return fullName;\n }\n },\n resolve: function (fullName) {\n var parsedName = this.parseName(fullName);\n var resolveMethodName = parsedName.resolveMethodName;\n var resolved = void 0;\n\n if (this[resolveMethodName]) {\n resolved = this[resolveMethodName](parsedName);\n }\n\n resolved = resolved || this.resolveOther(parsedName);\n\n if (true) {\n if (parsedName.root && parsedName.root.LOG_RESOLVER) {\n this._logLookup(resolved, parsedName);\n }\n }\n\n if (resolved) {\n (0, _validateType.default)(resolved, parsedName);\n }\n\n return resolved;\n },\n parseName: function (fullName) {\n return this._parseNameCache[fullName] || (this._parseNameCache[fullName] = this._parseName(fullName));\n },\n _parseName: function (fullName) {\n var _fullName$split2 = fullName.split(':'),\n type = _fullName$split2[0],\n fullNameWithoutType = _fullName$split2[1];\n\n var name = fullNameWithoutType;\n var namespace = (0, _emberMetal.get)(this, 'namespace');\n var root = namespace;\n var lastSlashIndex = name.lastIndexOf('/');\n var dirname = lastSlashIndex !== -1 ? name.slice(0, lastSlashIndex) : null;\n\n if (type !== 'template' && lastSlashIndex !== -1) {\n var parts = name.split('/');\n name = parts[parts.length - 1];\n var namespaceName = _emberRuntime.String.capitalize(parts.slice(0, -1).join('.'));\n root = _emberRuntime.Namespace.byName(namespaceName);\n\n (true && !(root) && (0, _emberDebug.assert)('You are looking for a ' + name + ' ' + type + ' in the ' + namespaceName + ' namespace, but the namespace could not be found', root));\n }\n\n var resolveMethodName = fullNameWithoutType === 'main' ? 'Main' : _emberRuntime.String.classify(type);\n\n if (!(name && type)) {\n throw new TypeError('Invalid fullName: `' + fullName + '`, must be of the form `type:name` ');\n }\n\n return {\n fullName: fullName,\n type: type,\n fullNameWithoutType: fullNameWithoutType,\n dirname: dirname,\n name: name,\n root: root,\n resolveMethodName: 'resolve' + resolveMethodName\n };\n },\n lookupDescription: function (fullName) {\n var parsedName = this.parseName(fullName);\n var description = void 0;\n\n if (parsedName.type === 'template') {\n return 'template at ' + parsedName.fullNameWithoutType.replace(/\\./g, '/');\n }\n\n description = parsedName.root + '.' + _emberRuntime.String.classify(parsedName.name).replace(/\\./g, '');\n\n if (parsedName.type !== 'model') {\n description += _emberRuntime.String.classify(parsedName.type);\n }\n\n return description;\n },\n makeToString: function (factory) {\n return factory.toString();\n },\n useRouterNaming: function (parsedName) {\n if (parsedName.name === 'basic') {\n parsedName.name = '';\n } else {\n parsedName.name = parsedName.name.replace(/\\./g, '_');\n }\n },\n resolveTemplate: function (parsedName) {\n var templateName = parsedName.fullNameWithoutType.replace(/\\./g, '/');\n\n return (0, _emberGlimmer.getTemplate)(templateName) || (0, _emberGlimmer.getTemplate)(_emberRuntime.String.decamelize(templateName));\n },\n resolveView: function (parsedName) {\n this.useRouterNaming(parsedName);\n return this.resolveOther(parsedName);\n },\n resolveController: function (parsedName) {\n this.useRouterNaming(parsedName);\n return this.resolveOther(parsedName);\n },\n resolveRoute: function (parsedName) {\n this.useRouterNaming(parsedName);\n return this.resolveOther(parsedName);\n },\n resolveModel: function (parsedName) {\n var className = _emberRuntime.String.classify(parsedName.name);\n var factory = (0, _emberMetal.get)(parsedName.root, className);\n\n return factory;\n },\n resolveHelper: function (parsedName) {\n return this.resolveOther(parsedName);\n },\n resolveOther: function (parsedName) {\n var className = _emberRuntime.String.classify(parsedName.name) + _emberRuntime.String.classify(parsedName.type);\n var factory = (0, _emberMetal.get)(parsedName.root, className);\n return factory;\n },\n resolveMain: function (parsedName) {\n var className = _emberRuntime.String.classify(parsedName.type);\n return (0, _emberMetal.get)(parsedName.root, className);\n },\n knownForType: function (type) {\n var namespace = (0, _emberMetal.get)(this, 'namespace');\n var suffix = _emberRuntime.String.classify(type);\n var typeRegexp = new RegExp(suffix + '$');\n\n var known = (0, _emberUtils.dictionary)(null);\n var knownKeys = Object.keys(namespace);\n for (var index = 0; index < knownKeys.length; index++) {\n var name = knownKeys[index];\n\n if (typeRegexp.test(name)) {\n var containerName = this.translateToContainerFullname(type, name);\n\n known[containerName] = true;\n }\n }\n\n return known;\n },\n translateToContainerFullname: function (type, name) {\n var suffix = _emberRuntime.String.classify(type);\n var namePrefix = name.slice(0, suffix.length * -1);\n var dasherizedName = _emberRuntime.String.dasherize(namePrefix);\n\n return type + ':' + dasherizedName;\n }\n });\n\n exports.default = DefaultResolver;\n\n\n if (true) {\n DefaultResolver.reopen({\n _logLookup: function (found, parsedName) {\n var symbol = found ? '[✓]' : '[ ]';\n\n var padding = void 0;\n if (parsedName.fullName.length > 60) {\n padding = '.';\n } else {\n padding = new Array(60 - parsedName.fullName.length).join('.');\n }\n\n (0, _emberDebug.info)(symbol, parsedName.fullName, padding, this.lookupDescription(parsedName.fullName));\n }\n });\n }\n});","enifed('ember-application/utils/validate-type', ['exports', 'ember-debug'], function (exports, _emberDebug) {\n 'use strict';\n\n exports.default = validateType;\n\n\n var VALIDATED_TYPES = {\n route: ['assert', 'isRouteFactory', 'Ember.Route'],\n component: ['deprecate', 'isComponentFactory', 'Ember.Component'],\n view: ['deprecate', 'isViewFactory', 'Ember.View'],\n service: ['deprecate', 'isServiceFactory', 'Ember.Service']\n };\n\n function validateType(resolvedType, parsedName) {\n var validationAttributes = VALIDATED_TYPES[parsedName.type];\n\n if (!validationAttributes) {\n return;\n }\n\n var factoryFlag = validationAttributes[1],\n expectedType = validationAttributes[2];\n (true && !(!!resolvedType[factoryFlag]) && (0, _emberDebug.assert)('Expected ' + parsedName.fullName + ' to resolve to an ' + expectedType + ' but ' + ('instead it was ' + resolvedType + '.'), !!resolvedType[factoryFlag]));\n }\n});","enifed('ember-babel', ['exports'], function (exports) {\n 'use strict';\n\n exports.classCallCheck = classCallCheck;\n exports.inherits = inherits;\n exports.taggedTemplateLiteralLoose = taggedTemplateLiteralLoose;\n exports.createClass = createClass;\n exports.defaults = defaults;\n function classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError('Cannot call a class as a function');\n }\n }\n\n function inherits(subClass, superClass) {\n if (typeof superClass !== 'function' && superClass !== null) {\n throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass);\n }\n\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : defaults(subClass, superClass);\n }\n\n function taggedTemplateLiteralLoose(strings, raw) {\n strings.raw = raw;\n return strings;\n }\n\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if ('value' in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n function createClass(Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n }\n\n function defaults(obj, defaults) {\n var keys = Object.getOwnPropertyNames(defaults);\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n var value = Object.getOwnPropertyDescriptor(defaults, key);\n if (value && value.configurable && obj[key] === undefined) {\n Object.defineProperty(obj, key, value);\n }\n }\n return obj;\n }\n\n var possibleConstructorReturn = exports.possibleConstructorReturn = function (self, call) {\n if (!self) {\n throw new ReferenceError('this hasn\\'t been initialized - super() hasn\\'t been called');\n }\n return call && (typeof call === 'object' || typeof call === 'function') ? call : self;\n };\n\n var slice = exports.slice = Array.prototype.slice;\n});","enifed(\"ember-console\", [\"exports\"], function (exports) {\n \"use strict\";\n\n /**\n @module ember\n */\n /**\n Inside Ember-Metal, simply uses the methods from `imports.console`.\n Override this to provide more robust logging functionality.\n \n @class Logger\n @namespace Ember\n @public\n */\n var index = {\n log: function () {\n var _console;\n\n return (_console = console).log.apply(_console, arguments);\n },\n warn: function () {\n var _console2;\n\n return (_console2 = console).warn.apply(_console2, arguments);\n },\n error: function () {\n var _console3;\n\n return (_console3 = console).error.apply(_console3, arguments);\n },\n info: function () {\n var _console4;\n\n return (_console4 = console).info.apply(_console4, arguments);\n },\n debug: function () {\n var _console6;\n\n /* eslint-disable no-console */\n if (console.debug) {\n var _console5;\n\n return (_console5 = console).debug.apply(_console5, arguments);\n }\n\n return (_console6 = console).info.apply(_console6, arguments);\n /* eslint-enable no-console */\n },\n assert: function () {\n var _console7;\n\n return (_console7 = console).assert.apply(_console7, arguments);\n }\n };\n\n exports.default = index;\n});","enifed('ember-debug/deprecate', ['exports', 'ember-debug/error', 'ember-console', 'ember-environment', 'ember-debug/index', 'ember-debug/handlers'], function (exports, _error, _emberConsole, _emberEnvironment, _index, _handlers) {\n 'use strict';\n\n exports.missingOptionsUntilDeprecation = exports.missingOptionsIdDeprecation = exports.missingOptionsDeprecation = exports.registerHandler = undefined;\n\n /**\n @module @ember/debug\n @public\n */\n /**\n Allows for runtime registration of handler functions that override the default deprecation behavior.\n Deprecations are invoked by calls to [@ember/application/deprecations/deprecate](https://emberjs.com/api/ember/release/classes/@ember%2Fapplication%2Fdeprecations/methods/deprecate?anchor=deprecate).\n The following example demonstrates its usage by registering a handler that throws an error if the\n message contains the word \"should\", otherwise defers to the default handler.\n \n ```javascript\n import { registerDeprecationHandler } from '@ember/debug';\n \n registerDeprecationHandler((message, options, next) => {\n if (message.indexOf('should') !== -1) {\n throw new Error(`Deprecation message with should: ${message}`);\n } else {\n // defer to whatever handler was registered before this one\n next(message, options);\n }\n });\n ```\n \n The handler function takes the following arguments:\n \n <ul>\n <li> <code>message</code> - The message received from the deprecation call.</li>\n <li> <code>options</code> - An object passed in with the deprecation call containing additional information including:</li>\n <ul>\n <li> <code>id</code> - An id of the deprecation in the form of <code>package-name.specific-deprecation</code>.</li>\n <li> <code>until</code> - The Ember version number the feature and deprecation will be removed in.</li>\n </ul>\n <li> <code>next</code> - A function that calls into the previously registered handler.</li>\n </ul>\n \n @public\n @static\n @method registerDeprecationHandler\n @for @ember/debug\n @param handler {Function} A function to handle deprecation calls.\n @since 2.1.0\n */\n /*global __fail__*/\n var registerHandler = function () {};\n var missingOptionsDeprecation = void 0,\n missingOptionsIdDeprecation = void 0,\n missingOptionsUntilDeprecation = void 0,\n deprecate = void 0;\n\n if (true) {\n exports.registerHandler = registerHandler = function registerHandler(handler) {\n (0, _handlers.registerHandler)('deprecate', handler);\n };\n\n var formatMessage = function formatMessage(_message, options) {\n var message = _message;\n\n if (options && options.id) {\n message = message + (' [deprecation id: ' + options.id + ']');\n }\n\n if (options && options.url) {\n message += ' See ' + options.url + ' for more details.';\n }\n\n return message;\n };\n\n registerHandler(function logDeprecationToConsole(message, options) {\n var updatedMessage = formatMessage(message, options);\n\n _emberConsole.default.warn('DEPRECATION: ' + updatedMessage);\n });\n\n var captureErrorForStack = void 0;\n\n if (new Error().stack) {\n captureErrorForStack = function () {\n return new Error();\n };\n } else {\n captureErrorForStack = function () {\n try {\n __fail__.fail();\n } catch (e) {\n return e;\n }\n };\n }\n\n registerHandler(function logDeprecationStackTrace(message, options, next) {\n if (_emberEnvironment.ENV.LOG_STACKTRACE_ON_DEPRECATION) {\n var stackStr = '';\n var error = captureErrorForStack();\n var stack = void 0;\n\n if (error.stack) {\n if (error['arguments']) {\n // Chrome\n stack = error.stack.replace(/^\\s+at\\s+/gm, '').replace(/^([^\\(]+?)([\\n$])/gm, '{anonymous}($1)$2').replace(/^Object.<anonymous>\\s*\\(([^\\)]+)\\)/gm, '{anonymous}($1)').split('\\n');\n stack.shift();\n } else {\n // Firefox\n stack = error.stack.replace(/(?:\\n@:0)?\\s+$/m, '').replace(/^\\(/gm, '{anonymous}(').split('\\n');\n }\n\n stackStr = '\\n ' + stack.slice(2).join('\\n ');\n }\n\n var updatedMessage = formatMessage(message, options);\n\n _emberConsole.default.warn('DEPRECATION: ' + updatedMessage + stackStr);\n } else {\n next.apply(undefined, arguments);\n }\n });\n\n registerHandler(function raiseOnDeprecation(message, options, next) {\n if (_emberEnvironment.ENV.RAISE_ON_DEPRECATION) {\n var updatedMessage = formatMessage(message);\n\n throw new _error.default(updatedMessage);\n } else {\n next.apply(undefined, arguments);\n }\n });\n\n exports.missingOptionsDeprecation = missingOptionsDeprecation = 'When calling `deprecate` you ' + 'must provide an `options` hash as the third parameter. ' + '`options` should include `id` and `until` properties.';\n exports.missingOptionsIdDeprecation = missingOptionsIdDeprecation = 'When calling `deprecate` you must provide `id` in options.';\n exports.missingOptionsUntilDeprecation = missingOptionsUntilDeprecation = 'When calling `deprecate` you must provide `until` in options.';\n /**\n @module @ember/application\n @public\n */\n /**\n Display a deprecation warning with the provided message and a stack trace\n (Chrome and Firefox only).\n * In a production build, this method is defined as an empty function (NOP).\n Uses of this method in Ember itself are stripped from the ember.prod.js build.\n @method deprecate\n @for @ember/application/deprecations\n @param {String} message A description of the deprecation.\n @param {Boolean} test A boolean. If falsy, the deprecation will be displayed.\n @param {Object} options\n @param {String} options.id A unique id for this deprecation. The id can be\n used by Ember debugging tools to change the behavior (raise, log or silence)\n for that specific deprecation. The id should be namespaced by dots, e.g.\n \"view.helper.select\".\n @param {string} options.until The version of Ember when this deprecation\n warning will be removed.\n @param {String} [options.url] An optional url to the transition guide on the\n emberjs.com website.\n @static\n @public\n @since 1.0.0\n */\n deprecate = function deprecate(message, test, options) {\n if (_emberEnvironment.ENV._ENABLE_DEPRECATION_OPTIONS_SUPPORT !== true) {\n (0, _index.assert)(missingOptionsDeprecation, options && (options.id || options.until));\n (0, _index.assert)(missingOptionsIdDeprecation, options.id);\n (0, _index.assert)(missingOptionsUntilDeprecation, options.until);\n }\n\n if ((!options || !options.id && !options.until) && _emberEnvironment.ENV._ENABLE_DEPRECATION_OPTIONS_SUPPORT === true) {\n deprecate(missingOptionsDeprecation, false, {\n id: 'ember-debug.deprecate-options-missing',\n until: '3.0.0',\n url: 'https://emberjs.com/deprecations/v2.x/#toc_ember-debug-function-options'\n });\n }\n\n if (options && !options.id && _emberEnvironment.ENV._ENABLE_DEPRECATION_OPTIONS_SUPPORT === true) {\n deprecate(missingOptionsIdDeprecation, false, {\n id: 'ember-debug.deprecate-id-missing',\n until: '3.0.0',\n url: 'https://emberjs.com/deprecations/v2.x/#toc_ember-debug-function-options'\n });\n }\n\n if (options && !options.until && _emberEnvironment.ENV._ENABLE_DEPRECATION_OPTIONS_SUPPORT === true) {\n deprecate(missingOptionsUntilDeprecation, options && options.until, {\n id: 'ember-debug.deprecate-until-missing',\n until: '3.0.0',\n url: 'https://emberjs.com/deprecations/v2.x/#toc_ember-debug-function-options'\n });\n }\n\n _handlers.invoke.apply(undefined, ['deprecate'].concat(Array.prototype.slice.call(arguments)));\n };\n }\n\n exports.default = deprecate;\n exports.registerHandler = registerHandler;\n exports.missingOptionsDeprecation = missingOptionsDeprecation;\n exports.missingOptionsIdDeprecation = missingOptionsIdDeprecation;\n exports.missingOptionsUntilDeprecation = missingOptionsUntilDeprecation;\n});","enifed(\"ember-debug/error\", [\"exports\", \"ember-babel\"], function (exports, _emberBabel) {\n \"use strict\";\n\n /**\n @module @ember/error\n */\n function ExtendBuiltin(klass) {\n function ExtendableBuiltin() {\n klass.apply(this, arguments);\n }\n\n ExtendableBuiltin.prototype = Object.create(klass.prototype);\n ExtendableBuiltin.prototype.constructor = ExtendableBuiltin;\n return ExtendableBuiltin;\n }\n\n /**\n A subclass of the JavaScript Error object for use in Ember.\n \n @class EmberError\n @extends Error\n @constructor\n @public\n */\n\n var EmberError = function (_ExtendBuiltin) {\n (0, _emberBabel.inherits)(EmberError, _ExtendBuiltin);\n\n function EmberError(message) {\n (0, _emberBabel.classCallCheck)(this, EmberError);\n\n var _this = (0, _emberBabel.possibleConstructorReturn)(this, _ExtendBuiltin.call(this));\n\n if (!(_this instanceof EmberError)) {\n var _ret;\n\n return _ret = new EmberError(message), (0, _emberBabel.possibleConstructorReturn)(_this, _ret);\n }\n\n var error = Error.call(_this, message);\n _this.stack = error.stack;\n _this.description = error.description;\n _this.fileName = error.fileName;\n _this.lineNumber = error.lineNumber;\n _this.message = error.message;\n _this.name = error.name;\n _this.number = error.number;\n _this.code = error.code;\n return _this;\n }\n\n return EmberError;\n }(ExtendBuiltin(Error));\n\n exports.default = EmberError;\n});","enifed('ember-debug/features', ['exports', 'ember-environment', 'ember/features'], function (exports, _emberEnvironment, _features) {\n 'use strict';\n\n exports.default = isEnabled;\n var FEATURES = _features.FEATURES;\n\n\n /**\n @module ember\n */\n\n /**\n The hash of enabled Canary features. Add to this, any canary features\n before creating your application.\n \n Alternatively (and recommended), you can also define `EmberENV.FEATURES`\n if you need to enable features flagged at runtime.\n \n @class FEATURES\n @namespace Ember\n @static\n @since 1.1.0\n @public\n */\n\n // Auto-generated\n\n /**\n Determine whether the specified `feature` is enabled. Used by Ember's\n build tools to exclude experimental features from beta/stable builds.\n \n You can define the following configuration options:\n \n * `EmberENV.ENABLE_OPTIONAL_FEATURES` - enable any features that have not been explicitly\n enabled/disabled.\n \n @method isEnabled\n @param {String} feature The feature to check\n @return {Boolean}\n @for Ember.FEATURES\n @since 1.1.0\n @public\n */\n function isEnabled(feature) {\n var featureValue = FEATURES[feature];\n\n if (featureValue === true || featureValue === false || featureValue === undefined) {\n return featureValue;\n } else if (_emberEnvironment.ENV.ENABLE_OPTIONAL_FEATURES) {\n return true;\n } else {\n return false;\n }\n }\n});","enifed('ember-debug/handlers', ['exports'], function (exports) {\n 'use strict';\n\n var HANDLERS = exports.HANDLERS = {};\n\n var registerHandler = function () {};\n var invoke = function () {};\n\n if (true) {\n exports.registerHandler = registerHandler = function registerHandler(type, callback) {\n var nextHandler = HANDLERS[type] || function () {};\n\n HANDLERS[type] = function (message, options) {\n callback(message, options, nextHandler);\n };\n };\n\n exports.invoke = invoke = function invoke(type, message, test, options) {\n if (test) {\n return;\n }\n\n var handlerForType = HANDLERS[type];\n\n if (handlerForType) {\n handlerForType(message, options);\n }\n };\n }\n\n exports.registerHandler = registerHandler;\n exports.invoke = invoke;\n});","enifed('ember-debug/index', ['exports', 'ember-debug/warn', 'ember-debug/deprecate', 'ember-debug/features', 'ember-debug/error', 'ember-debug/testing', 'ember-environment', 'ember-console', 'ember/features'], function (exports, _warn2, _deprecate2, _features, _error, _testing, _emberEnvironment, _emberConsole, _features2) {\n 'use strict';\n\n exports._warnIfUsingStrippedFeatureFlags = exports.getDebugFunction = exports.setDebugFunction = exports.deprecateFunc = exports.runInDebug = exports.debugFreeze = exports.debugSeal = exports.deprecate = exports.debug = exports.warn = exports.info = exports.assert = exports.setTesting = exports.isTesting = exports.Error = exports.isFeatureEnabled = exports.registerDeprecationHandler = exports.registerWarnHandler = undefined;\n Object.defineProperty(exports, 'registerWarnHandler', {\n enumerable: true,\n get: function () {\n return _warn2.registerHandler;\n }\n });\n Object.defineProperty(exports, 'registerDeprecationHandler', {\n enumerable: true,\n get: function () {\n return _deprecate2.registerHandler;\n }\n });\n Object.defineProperty(exports, 'isFeatureEnabled', {\n enumerable: true,\n get: function () {\n return _features.default;\n }\n });\n Object.defineProperty(exports, 'Error', {\n enumerable: true,\n get: function () {\n return _error.default;\n }\n });\n Object.defineProperty(exports, 'isTesting', {\n enumerable: true,\n get: function () {\n return _testing.isTesting;\n }\n });\n Object.defineProperty(exports, 'setTesting', {\n enumerable: true,\n get: function () {\n return _testing.setTesting;\n }\n });\n var DEFAULT_FEATURES = _features2.DEFAULT_FEATURES,\n FEATURES = _features2.FEATURES;\n\n\n // These are the default production build versions:\n var noop = function () {};\n\n var assert = noop;\n var info = noop;\n var warn = noop;\n var debug = noop;\n var deprecate = noop;\n var debugSeal = noop;\n var debugFreeze = noop;\n var runInDebug = noop;\n var setDebugFunction = noop;\n var getDebugFunction = noop;\n\n var deprecateFunc = function () {\n return arguments[arguments.length - 1];\n };\n\n if (true) {\n exports.setDebugFunction = setDebugFunction = function (type, callback) {\n switch (type) {\n case 'assert':\n return exports.assert = assert = callback;\n case 'info':\n return exports.info = info = callback;\n case 'warn':\n return exports.warn = warn = callback;\n case 'debug':\n return exports.debug = debug = callback;\n case 'deprecate':\n return exports.deprecate = deprecate = callback;\n case 'debugSeal':\n return exports.debugSeal = debugSeal = callback;\n case 'debugFreeze':\n return exports.debugFreeze = debugFreeze = callback;\n case 'runInDebug':\n return exports.runInDebug = runInDebug = callback;\n case 'deprecateFunc':\n return exports.deprecateFunc = deprecateFunc = callback;\n }\n };\n\n exports.getDebugFunction = getDebugFunction = function (type) {\n switch (type) {\n case 'assert':\n return assert;\n case 'info':\n return info;\n case 'warn':\n return warn;\n case 'debug':\n return debug;\n case 'deprecate':\n return deprecate;\n case 'debugSeal':\n return debugSeal;\n case 'debugFreeze':\n return debugFreeze;\n case 'runInDebug':\n return runInDebug;\n case 'deprecateFunc':\n return deprecateFunc;\n }\n };\n }\n\n /**\n @module @ember/debug\n */\n\n if (true) {\n /**\n Define an assertion that will throw an exception if the condition is not met.\n * In a production build, this method is defined as an empty function (NOP).\n Uses of this method in Ember itself are stripped from the ember.prod.js build.\n ```javascript\n import { assert } from '@ember/debug';\n // Test for truthiness\n assert('Must pass a valid object', obj);\n // Fail unconditionally\n assert('This code path should never be run');\n ```\n @method assert\n @static\n @for @ember/debug\n @param {String} desc A description of the assertion. This will become\n the text of the Error thrown if the assertion fails.\n @param {Boolean} test Must be truthy for the assertion to pass. If\n falsy, an exception will be thrown.\n @public\n @since 1.0.0\n */\n setDebugFunction('assert', function assert(desc, test) {\n if (!test) {\n throw new _error.default('Assertion Failed: ' + desc);\n }\n });\n\n /**\n Display a debug notice.\n * In a production build, this method is defined as an empty function (NOP).\n Uses of this method in Ember itself are stripped from the ember.prod.js build.\n ```javascript\n import { debug } from '@ember/debug';\n debug('I\\'m a debug notice!');\n ```\n @method debug\n @for @ember/debug\n @static\n @param {String} message A debug message to display.\n @public\n */\n setDebugFunction('debug', function debug(message) {\n _emberConsole.default.debug('DEBUG: ' + message);\n });\n\n /**\n Display an info notice.\n * In a production build, this method is defined as an empty function (NOP).\n Uses of this method in Ember itself are stripped from the ember.prod.js build.\n @method info\n @private\n */\n setDebugFunction('info', function info() {\n _emberConsole.default.info.apply(undefined, arguments);\n });\n\n /**\n @module @ember/application\n @public\n */\n\n /**\n Alias an old, deprecated method with its new counterpart.\n Display a deprecation warning with the provided message and a stack trace\n (Chrome and Firefox only) when the assigned method is called.\n * In a production build, this method is defined as an empty function (NOP).\n ```javascript\n import { deprecateFunc } from '@ember/application/deprecations';\n Ember.oldMethod = deprecateFunc('Please use the new, updated method', options, Ember.newMethod);\n ```\n @method deprecateFunc\n @static\n @for @ember/application/deprecations\n @param {String} message A description of the deprecation.\n @param {Object} [options] The options object for `deprecate`.\n @param {Function} func The new function called to replace its deprecated counterpart.\n @return {Function} A new function that wraps the original function with a deprecation warning\n @private\n */\n setDebugFunction('deprecateFunc', function deprecateFunc() {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n if (args.length === 3) {\n var message = args[0],\n options = args[1],\n func = args[2];\n\n return function () {\n deprecate(message, false, options);\n return func.apply(this, arguments);\n };\n } else {\n var _message = args[0],\n _func = args[1];\n\n return function () {\n deprecate(_message);\n return _func.apply(this, arguments);\n };\n }\n });\n\n /**\n @module @ember/debug\n @public\n */\n /**\n Run a function meant for debugging.\n * In a production build, this method is defined as an empty function (NOP).\n Uses of this method in Ember itself are stripped from the ember.prod.js build.\n ```javascript\n import Component from '@ember/component';\n import { runInDebug } from '@ember/debug';\n runInDebug(() => {\n Component.reopen({\n didInsertElement() {\n console.log(\"I'm happy\");\n }\n });\n });\n ```\n @method runInDebug\n @for @ember/debug\n @static\n @param {Function} func The function to be executed.\n @since 1.5.0\n @public\n */\n setDebugFunction('runInDebug', function runInDebug(func) {\n func();\n });\n\n setDebugFunction('debugSeal', function debugSeal(obj) {\n Object.seal(obj);\n });\n\n setDebugFunction('debugFreeze', function debugFreeze(obj) {\n Object.freeze(obj);\n });\n\n setDebugFunction('deprecate', _deprecate2.default);\n\n setDebugFunction('warn', _warn2.default);\n }\n\n var _warnIfUsingStrippedFeatureFlags = void 0;\n\n if (true && !(0, _testing.isTesting)()) {\n /**\n Will call `warn()` if ENABLE_OPTIONAL_FEATURES or\n any specific FEATURES flag is truthy.\n This method is called automatically in debug canary builds.\n @private\n @method _warnIfUsingStrippedFeatureFlags\n @return {void}\n */\n exports._warnIfUsingStrippedFeatureFlags = _warnIfUsingStrippedFeatureFlags = function _warnIfUsingStrippedFeatureFlags(FEATURES, knownFeatures, featuresWereStripped) {\n if (featuresWereStripped) {\n warn('Ember.ENV.ENABLE_OPTIONAL_FEATURES is only available in canary builds.', !_emberEnvironment.ENV.ENABLE_OPTIONAL_FEATURES, { id: 'ember-debug.feature-flag-with-features-stripped' });\n\n var keys = Object.keys(FEATURES || {});\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (key === 'isEnabled' || !(key in knownFeatures)) {\n continue;\n }\n\n warn('FEATURE[\"' + key + '\"] is set as enabled, but FEATURE flags are only available in canary builds.', !FEATURES[key], { id: 'ember-debug.feature-flag-with-features-stripped' });\n }\n }\n };\n\n // Complain if they're using FEATURE flags in builds other than canary\n FEATURES['features-stripped-test'] = true;\n var featuresWereStripped = true;\n\n if ((0, _features.default)('features-stripped-test')) {\n featuresWereStripped = false;\n }\n\n delete FEATURES['features-stripped-test'];\n _warnIfUsingStrippedFeatureFlags(_emberEnvironment.ENV.FEATURES, DEFAULT_FEATURES, featuresWereStripped);\n\n // Inform the developer about the Ember Inspector if not installed.\n var isFirefox = _emberEnvironment.environment.isFirefox;\n var isChrome = _emberEnvironment.environment.isChrome;\n\n if (typeof window !== 'undefined' && (isFirefox || isChrome) && window.addEventListener) {\n window.addEventListener('load', function () {\n if (document.documentElement && document.documentElement.dataset && !document.documentElement.dataset.emberExtension) {\n var downloadURL = void 0;\n\n if (isChrome) {\n downloadURL = 'https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi';\n } else if (isFirefox) {\n downloadURL = 'https://addons.mozilla.org/en-US/firefox/addon/ember-inspector/';\n }\n\n debug('For more advanced debugging, install the Ember Inspector from ' + downloadURL);\n }\n }, false);\n }\n }\n\n exports.assert = assert;\n exports.info = info;\n exports.warn = warn;\n exports.debug = debug;\n exports.deprecate = deprecate;\n exports.debugSeal = debugSeal;\n exports.debugFreeze = debugFreeze;\n exports.runInDebug = runInDebug;\n exports.deprecateFunc = deprecateFunc;\n exports.setDebugFunction = setDebugFunction;\n exports.getDebugFunction = getDebugFunction;\n exports._warnIfUsingStrippedFeatureFlags = _warnIfUsingStrippedFeatureFlags;\n});","enifed(\"ember-debug/testing\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.isTesting = isTesting;\n exports.setTesting = setTesting;\n var testing = false;\n\n function isTesting() {\n return testing;\n }\n\n function setTesting(value) {\n testing = !!value;\n }\n});","enifed('ember-debug/warn', ['exports', 'ember-environment', 'ember-console', 'ember-debug/deprecate', 'ember-debug/index', 'ember-debug/handlers'], function (exports, _emberEnvironment, _emberConsole, _deprecate, _index, _handlers) {\n 'use strict';\n\n exports.missingOptionsDeprecation = exports.missingOptionsIdDeprecation = exports.registerHandler = undefined;\n\n\n var registerHandler = function () {};\n var warn = function () {};\n var missingOptionsDeprecation = void 0,\n missingOptionsIdDeprecation = void 0;\n\n /**\n @module @ember/debug\n */\n\n if (true) {\n /**\n Allows for runtime registration of handler functions that override the default warning behavior.\n Warnings are invoked by calls made to [@ember/debug/warn](https://emberjs.com/api/ember/release/classes/@ember%2Fdebug/methods/warn?anchor=warn).\n The following example demonstrates its usage by registering a handler that does nothing overriding Ember's\n default warning behavior.\n ```javascript\n import { registerWarnHandler } from '@ember/debug';\n // next is not called, so no warnings get the default behavior\n registerWarnHandler(() => {});\n ```\n The handler function takes the following arguments:\n <ul>\n <li> <code>message</code> - The message received from the warn call. </li>\n <li> <code>options</code> - An object passed in with the warn call containing additional information including:</li>\n <ul>\n <li> <code>id</code> - An id of the warning in the form of <code>package-name.specific-warning</code>.</li>\n </ul>\n <li> <code>next</code> - A function that calls into the previously registered handler.</li>\n </ul>\n @public\n @static\n @method registerWarnHandler\n @for @ember/debug\n @param handler {Function} A function to handle warnings.\n @since 2.1.0\n */\n exports.registerHandler = registerHandler = function registerHandler(handler) {\n (0, _handlers.registerHandler)('warn', handler);\n };\n\n registerHandler(function logWarning(message) {\n _emberConsole.default.warn('WARNING: ' + message);\n if ('trace' in _emberConsole.default) {\n _emberConsole.default.trace();\n }\n });\n\n exports.missingOptionsDeprecation = missingOptionsDeprecation = 'When calling `warn` you ' + 'must provide an `options` hash as the third parameter. ' + '`options` should include an `id` property.';\n exports.missingOptionsIdDeprecation = missingOptionsIdDeprecation = 'When calling `warn` you must provide `id` in options.';\n\n /**\n Display a warning with the provided message.\n * In a production build, this method is defined as an empty function (NOP).\n Uses of this method in Ember itself are stripped from the ember.prod.js build.\n @method warn\n @for @ember/debug\n @static\n @param {String} message A warning to display.\n @param {Boolean} test An optional boolean. If falsy, the warning\n will be displayed.\n @param {Object} options An object that can be used to pass a unique\n `id` for this warning. The `id` can be used by Ember debugging tools\n to change the behavior (raise, log, or silence) for that specific warning.\n The `id` should be namespaced by dots, e.g. \"ember-debug.feature-flag-with-features-stripped\"\n @public\n @since 1.0.0\n */\n warn = function warn(message, test, options) {\n if (arguments.length === 2 && typeof test === 'object') {\n options = test;\n test = false;\n }\n\n if (_emberEnvironment.ENV._ENABLE_WARN_OPTIONS_SUPPORT !== true) {\n (0, _index.assert)(missingOptionsDeprecation, options);\n (0, _index.assert)(missingOptionsIdDeprecation, options && options.id);\n }\n\n if (!options && _emberEnvironment.ENV._ENABLE_WARN_OPTIONS_SUPPORT === true) {\n (0, _deprecate.default)(missingOptionsDeprecation, false, {\n id: 'ember-debug.warn-options-missing',\n until: '3.0.0',\n url: 'https://emberjs.com/deprecations/v2.x/#toc_ember-debug-function-options'\n });\n }\n\n if (options && !options.id && _emberEnvironment.ENV._ENABLE_WARN_OPTIONS_SUPPORT === true) {\n (0, _deprecate.default)(missingOptionsIdDeprecation, false, {\n id: 'ember-debug.warn-id-missing',\n until: '3.0.0',\n url: 'https://emberjs.com/deprecations/v2.x/#toc_ember-debug-function-options'\n });\n }\n\n (0, _handlers.invoke)('warn', message, test, options);\n };\n }\n\n exports.default = warn;\n exports.registerHandler = registerHandler;\n exports.missingOptionsIdDeprecation = missingOptionsIdDeprecation;\n exports.missingOptionsDeprecation = missingOptionsDeprecation;\n});","enifed('ember-environment', ['exports'], function (exports) {\n 'use strict';\n\n /* globals global, window, self, mainContext */\n\n // from lodash to catch fake globals\n function checkGlobal(value) {\n return value && value.Object === Object ? value : undefined;\n }\n\n // element ids can ruin global miss checks\n function checkElementIdShadowing(value) {\n return value && value.nodeType === undefined ? value : undefined;\n }\n\n // export real global\n var global$1 = checkGlobal(checkElementIdShadowing(typeof global === 'object' && global)) || checkGlobal(typeof self === 'object' && self) || checkGlobal(typeof window === 'object' && window) || mainContext || // set before strict mode in Ember loader/wrapper\n new Function('return this')(); // eval outside of strict mode\n\n function defaultTrue(v) {\n return v === false ? false : true;\n }\n\n function defaultFalse(v) {\n return v === true ? true : false;\n }\n\n function normalizeExtendPrototypes(obj) {\n if (obj === false) {\n return { String: false, Array: false, Function: false };\n } else if (!obj || obj === true) {\n return { String: true, Array: true, Function: true };\n } else {\n return {\n String: defaultTrue(obj.String),\n Array: defaultTrue(obj.Array),\n Function: defaultTrue(obj.Function)\n };\n }\n }\n\n /* globals module */\n /**\n The hash of environment variables used to control various configuration\n settings. To specify your own or override default settings, add the\n desired properties to a global hash named `EmberENV` (or `ENV` for\n backwards compatibility with earlier versions of Ember). The `EmberENV`\n hash must be created before loading Ember.\n \n @class EmberENV\n @type Object\n @public\n */\n var ENV = typeof global$1.EmberENV === 'object' && global$1.EmberENV || typeof global$1.ENV === 'object' && global$1.ENV || {};\n\n // ENABLE_ALL_FEATURES was documented, but you can't actually enable non optional features.\n if (ENV.ENABLE_ALL_FEATURES) {\n ENV.ENABLE_OPTIONAL_FEATURES = true;\n }\n\n /**\n Determines whether Ember should add to `Array`, `Function`, and `String`\n native object prototypes, a few extra methods in order to provide a more\n friendly API.\n \n We generally recommend leaving this option set to true however, if you need\n to turn it off, you can add the configuration property\n `EXTEND_PROTOTYPES` to `EmberENV` and set it to `false`.\n \n Note, when disabled (the default configuration for Ember Addons), you will\n instead have to access all methods and functions from the Ember\n namespace.\n \n @property EXTEND_PROTOTYPES\n @type Boolean\n @default true\n @for EmberENV\n @public\n */\n ENV.EXTEND_PROTOTYPES = normalizeExtendPrototypes(ENV.EXTEND_PROTOTYPES);\n\n /**\n The `LOG_STACKTRACE_ON_DEPRECATION` property, when true, tells Ember to log\n a full stack trace during deprecation warnings.\n \n @property LOG_STACKTRACE_ON_DEPRECATION\n @type Boolean\n @default true\n @for EmberENV\n @public\n */\n ENV.LOG_STACKTRACE_ON_DEPRECATION = defaultTrue(ENV.LOG_STACKTRACE_ON_DEPRECATION);\n\n /**\n The `LOG_VERSION` property, when true, tells Ember to log versions of all\n dependent libraries in use.\n \n @property LOG_VERSION\n @type Boolean\n @default true\n @for EmberENV\n @public\n */\n ENV.LOG_VERSION = defaultTrue(ENV.LOG_VERSION);\n\n /**\n Debug parameter you can turn on. This will log all bindings that fire to\n the console. This should be disabled in production code. Note that you\n can also enable this from the console or temporarily.\n \n @property LOG_BINDINGS\n @for EmberENV\n @type Boolean\n @default false\n @public\n */\n ENV.LOG_BINDINGS = defaultFalse(ENV.LOG_BINDINGS);\n\n ENV.RAISE_ON_DEPRECATION = defaultFalse(ENV.RAISE_ON_DEPRECATION);\n\n // check if window exists and actually is the global\n var hasDOM = typeof window !== 'undefined' && window === global$1 && window.document && window.document.createElement && !ENV.disableBrowserEnvironment; // is this a public thing?\n\n // legacy imports/exports/lookup stuff (should we keep this??)\n var originalContext = global$1.Ember || {};\n\n var context = {\n // import jQuery\n imports: originalContext.imports || global$1,\n // export Ember\n exports: originalContext.exports || global$1,\n // search for Namespaces\n lookup: originalContext.lookup || global$1\n };\n\n // TODO: cleanup single source of truth issues with this stuff\n var environment = hasDOM ? {\n hasDOM: true,\n isChrome: !!window.chrome && !window.opera,\n isFirefox: typeof InstallTrigger !== 'undefined',\n location: window.location,\n history: window.history,\n userAgent: window.navigator.userAgent,\n window: window\n } : {\n hasDOM: false,\n isChrome: false,\n isFirefox: false,\n location: null,\n history: null,\n userAgent: 'Lynx (textmode)',\n window: null\n };\n\n exports.ENV = ENV;\n exports.context = context;\n exports.environment = environment;\n});","enifed('ember-extension-support/container_debug_adapter', ['exports', 'ember-metal', 'ember-runtime'], function (exports, _emberMetal, _emberRuntime) {\n 'use strict';\n\n exports.default = _emberRuntime.Object.extend({\n /**\n The resolver instance of the application\n being debugged. This property will be injected\n on creation.\n @property resolver\n @default null\n @public\n */\n resolver: null,\n\n /**\n Returns true if it is possible to catalog a list of available\n classes in the resolver for a given type.\n @method canCatalogEntriesByType\n @param {String} type The type. e.g. \"model\", \"controller\", \"route\".\n @return {boolean} whether a list is available for this type.\n @public\n */\n canCatalogEntriesByType: function (type) {\n if (type === 'model' || type === 'template') {\n return false;\n }\n\n return true;\n },\n\n\n /**\n Returns the available classes a given type.\n @method catalogEntriesByType\n @param {String} type The type. e.g. \"model\", \"controller\", \"route\".\n @return {Array} An array of strings.\n @public\n */\n catalogEntriesByType: function (type) {\n var namespaces = (0, _emberRuntime.A)(_emberRuntime.Namespace.NAMESPACES);\n var types = (0, _emberRuntime.A)();\n var typeSuffixRegex = new RegExp(_emberRuntime.String.classify(type) + '$');\n\n namespaces.forEach(function (namespace) {\n if (namespace !== _emberMetal.default) {\n for (var key in namespace) {\n if (!namespace.hasOwnProperty(key)) {\n continue;\n }\n if (typeSuffixRegex.test(key)) {\n var klass = namespace[key];\n if ((0, _emberRuntime.typeOf)(klass) === 'class') {\n types.push(_emberRuntime.String.dasherize(key.replace(typeSuffixRegex, '')));\n }\n }\n }\n }\n });\n return types;\n }\n });\n});","enifed('ember-extension-support/data_adapter', ['exports', 'ember-utils', 'ember-metal', 'ember-runtime'], function (exports, _emberUtils, _emberMetal, _emberRuntime) {\n 'use strict';\n\n exports.default = _emberRuntime.Object.extend({\n init: function () {\n this._super.apply(this, arguments);\n this.releaseMethods = (0, _emberRuntime.A)();\n },\n\n\n /**\n The container-debug-adapter which is used\n to list all models.\n @property containerDebugAdapter\n @default undefined\n @since 1.5.0\n @public\n **/\n containerDebugAdapter: undefined,\n\n /**\n The number of attributes to send\n as columns. (Enough to make the record\n identifiable).\n @private\n @property attributeLimit\n @default 3\n @since 1.3.0\n */\n attributeLimit: 3,\n\n /**\n Ember Data > v1.0.0-beta.18\n requires string model names to be passed\n around instead of the actual factories.\n This is a stamp for the Ember Inspector\n to differentiate between the versions\n to be able to support older versions too.\n @public\n @property acceptsModelName\n */\n acceptsModelName: true,\n\n /**\n Stores all methods that clear observers.\n These methods will be called on destruction.\n @private\n @property releaseMethods\n @since 1.3.0\n */\n releaseMethods: (0, _emberRuntime.A)(),\n\n /**\n Specifies how records can be filtered.\n Records returned will need to have a `filterValues`\n property with a key for every name in the returned array.\n @public\n @method getFilters\n @return {Array} List of objects defining filters.\n The object should have a `name` and `desc` property.\n */\n getFilters: function () {\n return (0, _emberRuntime.A)();\n },\n\n\n /**\n Fetch the model types and observe them for changes.\n @public\n @method watchModelTypes\n @param {Function} typesAdded Callback to call to add types.\n Takes an array of objects containing wrapped types (returned from `wrapModelType`).\n @param {Function} typesUpdated Callback to call when a type has changed.\n Takes an array of objects containing wrapped types.\n @return {Function} Method to call to remove all observers\n */\n watchModelTypes: function (typesAdded, typesUpdated) {\n var _this = this;\n\n var modelTypes = this.getModelTypes();\n var releaseMethods = (0, _emberRuntime.A)();\n var typesToSend = void 0;\n\n typesToSend = modelTypes.map(function (type) {\n var klass = type.klass;\n var wrapped = _this.wrapModelType(klass, type.name);\n releaseMethods.push(_this.observeModelType(type.name, typesUpdated));\n return wrapped;\n });\n\n typesAdded(typesToSend);\n\n var release = function () {\n releaseMethods.forEach(function (fn) {\n return fn();\n });\n _this.releaseMethods.removeObject(release);\n };\n this.releaseMethods.pushObject(release);\n return release;\n },\n _nameToClass: function (type) {\n if (typeof type === 'string') {\n var owner = (0, _emberUtils.getOwner)(this);\n var Factory = owner.factoryFor('model:' + type);\n type = Factory && Factory.class;\n }\n return type;\n },\n\n\n /**\n Fetch the records of a given type and observe them for changes.\n @public\n @method watchRecords\n @param {String} modelName The model name.\n @param {Function} recordsAdded Callback to call to add records.\n Takes an array of objects containing wrapped records.\n The object should have the following properties:\n columnValues: {Object} The key and value of a table cell.\n object: {Object} The actual record object.\n @param {Function} recordsUpdated Callback to call when a record has changed.\n Takes an array of objects containing wrapped records.\n @param {Function} recordsRemoved Callback to call when a record has removed.\n Takes the following parameters:\n index: The array index where the records were removed.\n count: The number of records removed.\n @return {Function} Method to call to remove all observers.\n */\n watchRecords: function (modelName, recordsAdded, recordsUpdated, recordsRemoved) {\n var _this2 = this;\n\n var releaseMethods = (0, _emberRuntime.A)();\n var klass = this._nameToClass(modelName);\n var records = this.getRecords(klass, modelName);\n var release = void 0;\n\n function recordUpdated(updatedRecord) {\n recordsUpdated([updatedRecord]);\n }\n\n var recordsToSend = records.map(function (record) {\n releaseMethods.push(_this2.observeRecord(record, recordUpdated));\n return _this2.wrapRecord(record);\n });\n\n var contentDidChange = function (array, idx, removedCount, addedCount) {\n for (var i = idx; i < idx + addedCount; i++) {\n var record = (0, _emberRuntime.objectAt)(array, i);\n var wrapped = _this2.wrapRecord(record);\n releaseMethods.push(_this2.observeRecord(record, recordUpdated));\n recordsAdded([wrapped]);\n }\n\n if (removedCount) {\n recordsRemoved(idx, removedCount);\n }\n };\n\n var observer = { didChange: contentDidChange, willChange: function () {\n return this;\n }\n };\n (0, _emberRuntime.addArrayObserver)(records, this, observer);\n\n release = function () {\n releaseMethods.forEach(function (fn) {\n return fn();\n });\n (0, _emberRuntime.removeArrayObserver)(records, _this2, observer);\n _this2.releaseMethods.removeObject(release);\n };\n\n recordsAdded(recordsToSend);\n\n this.releaseMethods.pushObject(release);\n return release;\n },\n\n\n /**\n Clear all observers before destruction\n @private\n @method willDestroy\n */\n willDestroy: function () {\n this._super.apply(this, arguments);\n this.releaseMethods.forEach(function (fn) {\n return fn();\n });\n },\n\n\n /**\n Detect whether a class is a model.\n Test that against the model class\n of your persistence library.\n @private\n @method detect\n @return boolean Whether the class is a model class or not.\n */\n detect: function () {\n return false;\n },\n\n\n /**\n Get the columns for a given model type.\n @private\n @method columnsForType\n @return {Array} An array of columns of the following format:\n name: {String} The name of the column.\n desc: {String} Humanized description (what would show in a table column name).\n */\n columnsForType: function () {\n return (0, _emberRuntime.A)();\n },\n\n\n /**\n Adds observers to a model type class.\n @private\n @method observeModelType\n @param {String} modelName The model type name.\n @param {Function} typesUpdated Called when a type is modified.\n @return {Function} The function to call to remove observers.\n */\n\n observeModelType: function (modelName, typesUpdated) {\n var _this3 = this;\n\n var klass = this._nameToClass(modelName);\n var records = this.getRecords(klass, modelName);\n\n function onChange() {\n typesUpdated([this.wrapModelType(klass, modelName)]);\n }\n\n var observer = {\n didChange: function (array, idx, removedCount, addedCount) {\n // Only re-fetch records if the record count changed\n // (which is all we care about as far as model types are concerned).\n if (removedCount > 0 || addedCount > 0) {\n _emberMetal.run.scheduleOnce('actions', this, onChange);\n }\n },\n willChange: function () {\n return this;\n }\n };\n\n (0, _emberRuntime.addArrayObserver)(records, this, observer);\n\n var release = function () {\n return (0, _emberRuntime.removeArrayObserver)(records, _this3, observer);\n };\n\n return release;\n },\n\n\n /**\n Wraps a given model type and observes changes to it.\n @private\n @method wrapModelType\n @param {Class} klass A model class.\n @param {String} modelName Name of the class.\n @return {Object} Contains the wrapped type and the function to remove observers\n Format:\n type: {Object} The wrapped type.\n The wrapped type has the following format:\n name: {String} The name of the type.\n count: {Integer} The number of records available.\n columns: {Columns} An array of columns to describe the record.\n object: {Class} The actual Model type class.\n release: {Function} The function to remove observers.\n */\n wrapModelType: function (klass, name) {\n var records = this.getRecords(klass, name);\n var typeToSend = void 0;\n\n typeToSend = {\n name: name,\n count: (0, _emberMetal.get)(records, 'length'),\n columns: this.columnsForType(klass),\n object: klass\n };\n\n return typeToSend;\n },\n\n\n /**\n Fetches all models defined in the application.\n @private\n @method getModelTypes\n @return {Array} Array of model types.\n */\n getModelTypes: function () {\n var _this4 = this;\n\n var containerDebugAdapter = this.get('containerDebugAdapter');\n var types = void 0;\n\n if (containerDebugAdapter.canCatalogEntriesByType('model')) {\n types = containerDebugAdapter.catalogEntriesByType('model');\n } else {\n types = this._getObjectsOnNamespaces();\n }\n\n // New adapters return strings instead of classes.\n types = (0, _emberRuntime.A)(types).map(function (name) {\n return {\n klass: _this4._nameToClass(name),\n name: name\n };\n });\n types = (0, _emberRuntime.A)(types).filter(function (type) {\n return _this4.detect(type.klass);\n });\n\n return (0, _emberRuntime.A)(types);\n },\n\n\n /**\n Loops over all namespaces and all objects\n attached to them.\n @private\n @method _getObjectsOnNamespaces\n @return {Array} Array of model type strings.\n */\n _getObjectsOnNamespaces: function () {\n var _this5 = this;\n\n var namespaces = (0, _emberRuntime.A)(_emberRuntime.Namespace.NAMESPACES);\n var types = (0, _emberRuntime.A)();\n\n namespaces.forEach(function (namespace) {\n for (var key in namespace) {\n if (!namespace.hasOwnProperty(key)) {\n continue;\n }\n // Even though we will filter again in `getModelTypes`,\n // we should not call `lookupFactory` on non-models\n if (!_this5.detect(namespace[key])) {\n continue;\n }\n var name = _emberRuntime.String.dasherize(key);\n types.push(name);\n }\n });\n return types;\n },\n\n\n /**\n Fetches all loaded records for a given type.\n @private\n @method getRecords\n @return {Array} An array of records.\n This array will be observed for changes,\n so it should update when new records are added/removed.\n */\n getRecords: function () {\n return (0, _emberRuntime.A)();\n },\n\n\n /**\n Wraps a record and observers changes to it.\n @private\n @method wrapRecord\n @param {Object} record The record instance.\n @return {Object} The wrapped record. Format:\n columnValues: {Array}\n searchKeywords: {Array}\n */\n wrapRecord: function (record) {\n var recordToSend = { object: record };\n\n recordToSend.columnValues = this.getRecordColumnValues(record);\n recordToSend.searchKeywords = this.getRecordKeywords(record);\n recordToSend.filterValues = this.getRecordFilterValues(record);\n recordToSend.color = this.getRecordColor(record);\n\n return recordToSend;\n },\n\n\n /**\n Gets the values for each column.\n @private\n @method getRecordColumnValues\n @return {Object} Keys should match column names defined\n by the model type.\n */\n getRecordColumnValues: function () {\n return {};\n },\n\n\n /**\n Returns keywords to match when searching records.\n @private\n @method getRecordKeywords\n @return {Array} Relevant keywords for search.\n */\n getRecordKeywords: function () {\n return (0, _emberRuntime.A)();\n },\n\n\n /**\n Returns the values of filters defined by `getFilters`.\n @private\n @method getRecordFilterValues\n @param {Object} record The record instance.\n @return {Object} The filter values.\n */\n getRecordFilterValues: function () {\n return {};\n },\n\n\n /**\n Each record can have a color that represents its state.\n @private\n @method getRecordColor\n @param {Object} record The record instance\n @return {String} The records color.\n Possible options: black, red, blue, green.\n */\n getRecordColor: function () {\n return null;\n },\n\n\n /**\n Observes all relevant properties and re-sends the wrapped record\n when a change occurs.\n @private\n @method observerRecord\n @return {Function} The function to call to remove all observers.\n */\n observeRecord: function () {\n return function () {};\n }\n });\n});","enifed('ember-extension-support/index', ['exports', 'ember-extension-support/data_adapter', 'ember-extension-support/container_debug_adapter'], function (exports, _data_adapter, _container_debug_adapter) {\n 'use strict';\n\n Object.defineProperty(exports, 'DataAdapter', {\n enumerable: true,\n get: function () {\n return _data_adapter.default;\n }\n });\n Object.defineProperty(exports, 'ContainerDebugAdapter', {\n enumerable: true,\n get: function () {\n return _container_debug_adapter.default;\n }\n });\n});","enifed('ember-glimmer/component-managers/abstract', ['exports', 'ember-babel'], function (exports, _emberBabel) {\n 'use strict';\n\n var AbstractManager = function () {\n function AbstractManager() {\n (0, _emberBabel.classCallCheck)(this, AbstractManager);\n\n this.debugStack = undefined;\n }\n\n AbstractManager.prototype.prepareArgs = function prepareArgs(_definition, _args) {\n return null;\n };\n\n AbstractManager.prototype.didCreateElement = function didCreateElement(_component, _element, _operations) {}\n // noop\n\n // inheritors should also call `this.debugStack.pop()` to\n // ensure the rerendering assertion messages are properly\n // maintained\n ;\n\n AbstractManager.prototype.didRenderLayout = function didRenderLayout(_component, _bounds) {\n // noop\n };\n\n AbstractManager.prototype.didCreate = function didCreate(_bucket) {\n // noop\n };\n\n AbstractManager.prototype.getTag = function getTag(_bucket) {\n return null;\n };\n\n AbstractManager.prototype.update = function update(_bucket, _dynamicScope) {}\n // noop\n\n // inheritors should also call `this.debugStack.pop()` to\n // ensure the rerendering assertion messages are properly\n // maintained\n ;\n\n AbstractManager.prototype.didUpdateLayout = function didUpdateLayout(_bucket, _bounds) {\n // noop\n };\n\n AbstractManager.prototype.didUpdate = function didUpdate(_bucket) {\n // noop\n };\n\n return AbstractManager;\n }();\n\n exports.default = AbstractManager;\n\n if (true) {\n AbstractManager.prototype._pushToDebugStack = function (name, environment) {\n this.debugStack = environment.debugStack;\n this.debugStack.push(name);\n };\n AbstractManager.prototype._pushEngineToDebugStack = function (name, environment) {\n this.debugStack = environment.debugStack;\n this.debugStack.pushEngine(name);\n };\n }\n});","enifed('ember-glimmer/component-managers/curly', ['exports', 'ember-babel', '@glimmer/reference', '@glimmer/runtime', 'container', 'ember-debug', 'ember-metal', 'ember-utils', 'ember-views', 'ember-glimmer/component', 'ember-glimmer/utils/bindings', 'ember-glimmer/utils/curly-component-state-bucket', 'ember-glimmer/utils/process-args', 'ember-glimmer/utils/references', 'ember-glimmer/component-managers/abstract'], function (exports, _emberBabel, _reference, _runtime, _container, _emberDebug, _emberMetal, _emberUtils, _emberViews, _component, _bindings, _curlyComponentStateBucket, _processArgs, _references, _abstract) {\n 'use strict';\n\n exports.CurlyComponentDefinition = exports.PositionalArgumentReference = undefined;\n exports.validatePositionalParameters = validatePositionalParameters;\n exports.processComponentInitializationAssertions = processComponentInitializationAssertions;\n exports.initialRenderInstrumentDetails = initialRenderInstrumentDetails;\n exports.rerenderInstrumentDetails = rerenderInstrumentDetails;\n\n var _templateObject = (0, _emberBabel.taggedTemplateLiteralLoose)(['template:components/-default'], ['template:components/-default']);\n\n var DEFAULT_LAYOUT = (0, _container.privatize)(_templateObject);\n function aliasIdToElementId(args, props) {\n if (args.named.has('id')) {\n (true && !(!args.named.has('elementId')) && (0, _emberDebug.assert)('You cannot invoke a component with both \\'id\\' and \\'elementId\\' at the same time.', !args.named.has('elementId')));\n\n props.elementId = props.id;\n }\n }\n // We must traverse the attributeBindings in reverse keeping track of\n // what has already been applied. This is essentially refining the concatenated\n // properties applying right to left.\n function applyAttributeBindings(element, attributeBindings, component, operations) {\n var seen = [];\n var i = attributeBindings.length - 1;\n while (i !== -1) {\n var binding = attributeBindings[i];\n var parsed = _bindings.AttributeBinding.parse(binding);\n var attribute = parsed[1];\n if (seen.indexOf(attribute) === -1) {\n seen.push(attribute);\n _bindings.AttributeBinding.install(element, component, parsed, operations);\n }\n i--;\n }\n if (seen.indexOf('id') === -1) {\n operations.addStaticAttribute(element, 'id', component.elementId);\n }\n if (seen.indexOf('style') === -1) {\n _bindings.IsVisibleBinding.install(element, component, operations);\n }\n }\n function tagName(vm) {\n var dynamicScope = vm.dynamicScope();\n // tslint:disable-next-line:no-shadowed-variable\n var tagName = dynamicScope.view.tagName;\n\n return _runtime.PrimitiveReference.create(tagName === '' ? null : tagName || 'div');\n }\n function ariaRole(vm) {\n return vm.getSelf().get('ariaRole');\n }\n\n var CurlyComponentLayoutCompiler = function () {\n function CurlyComponentLayoutCompiler(template) {\n (0, _emberBabel.classCallCheck)(this, CurlyComponentLayoutCompiler);\n\n this.template = template;\n }\n\n CurlyComponentLayoutCompiler.prototype.compile = function compile(builder) {\n builder.wrapLayout(this.template);\n builder.tag.dynamic(tagName);\n builder.attrs.dynamic('role', ariaRole);\n builder.attrs.static('class', 'ember-view');\n };\n\n return CurlyComponentLayoutCompiler;\n }();\n\n CurlyComponentLayoutCompiler.id = 'curly';\n\n var PositionalArgumentReference = exports.PositionalArgumentReference = function () {\n function PositionalArgumentReference(references) {\n (0, _emberBabel.classCallCheck)(this, PositionalArgumentReference);\n\n this.tag = (0, _reference.combineTagged)(references);\n this._references = references;\n }\n\n PositionalArgumentReference.prototype.value = function value() {\n return this._references.map(function (reference) {\n return reference.value();\n });\n };\n\n PositionalArgumentReference.prototype.get = function get(key) {\n return _references.PropertyReference.create(this, key);\n };\n\n return PositionalArgumentReference;\n }();\n\n var CurlyComponentManager = function (_AbstractManager) {\n (0, _emberBabel.inherits)(CurlyComponentManager, _AbstractManager);\n\n function CurlyComponentManager() {\n (0, _emberBabel.classCallCheck)(this, CurlyComponentManager);\n return (0, _emberBabel.possibleConstructorReturn)(this, _AbstractManager.apply(this, arguments));\n }\n\n CurlyComponentManager.prototype.prepareArgs = function prepareArgs(definition, args) {\n var componentPositionalParamsDefinition = definition.ComponentClass.class.positionalParams;\n if (true && componentPositionalParamsDefinition) {\n validatePositionalParameters(args.named, args.positional, componentPositionalParamsDefinition);\n }\n var componentHasRestStylePositionalParams = typeof componentPositionalParamsDefinition === 'string';\n var componentHasPositionalParams = componentHasRestStylePositionalParams || componentPositionalParamsDefinition.length > 0;\n var needsPositionalParamMunging = componentHasPositionalParams && args.positional.length !== 0;\n var isClosureComponent = definition.args;\n if (!needsPositionalParamMunging && !isClosureComponent) {\n return null;\n }\n var capturedArgs = args.capture();\n // grab raw positional references array\n var positional = capturedArgs.positional.references;\n // handle prep for closure component with positional params\n var curriedNamed = void 0;\n if (definition.args) {\n var remainingDefinitionPositionals = definition.args.positional.slice(positional.length);\n positional = positional.concat(remainingDefinitionPositionals);\n curriedNamed = definition.args.named;\n }\n // handle positionalParams\n var positionalParamsToNamed = void 0;\n if (componentHasRestStylePositionalParams) {\n var _positionalParamsToNa;\n\n positionalParamsToNamed = (_positionalParamsToNa = {}, _positionalParamsToNa[componentPositionalParamsDefinition] = new PositionalArgumentReference(positional), _positionalParamsToNa);\n positional = [];\n } else if (componentHasPositionalParams) {\n positionalParamsToNamed = {};\n var length = Math.min(positional.length, componentPositionalParamsDefinition.length);\n for (var i = 0; i < length; i++) {\n var name = componentPositionalParamsDefinition[i];\n positionalParamsToNamed[name] = positional[i];\n }\n }\n var named = (0, _emberUtils.assign)({}, curriedNamed, positionalParamsToNamed, capturedArgs.named.map);\n return { positional: positional, named: named };\n };\n\n CurlyComponentManager.prototype.create = function create(environment, definition, args, dynamicScope, callerSelfRef, hasBlock) {\n if (true) {\n this._pushToDebugStack('component:' + definition.name, environment);\n }\n var parentView = dynamicScope.view;\n var factory = definition.ComponentClass;\n var capturedArgs = args.named.capture();\n var props = (0, _processArgs.processComponentArgs)(capturedArgs);\n aliasIdToElementId(args, props);\n props.parentView = parentView;\n props[_component.HAS_BLOCK] = hasBlock;\n props._targetObject = callerSelfRef.value();\n var component = factory.create(props);\n var finalizer = (0, _emberMetal._instrumentStart)('render.component', initialRenderInstrumentDetails, component);\n dynamicScope.view = component;\n if (parentView !== null && parentView !== undefined) {\n parentView.appendChild(component);\n }\n // We usually do this in the `didCreateElement`, but that hook doesn't fire for tagless components\n if (component.tagName === '') {\n if (environment.isInteractive) {\n component.trigger('willRender');\n }\n component._transitionTo('hasElement');\n if (environment.isInteractive) {\n component.trigger('willInsertElement');\n }\n }\n var bucket = new _curlyComponentStateBucket.default(environment, component, capturedArgs, finalizer);\n if (args.named.has('class')) {\n bucket.classRef = args.named.get('class');\n }\n if (true) {\n processComponentInitializationAssertions(component, props);\n }\n if (environment.isInteractive && component.tagName !== '') {\n component.trigger('willRender');\n }\n return bucket;\n };\n\n CurlyComponentManager.prototype.layoutFor = function layoutFor(definition, bucket, env) {\n var template = definition.template;\n if (!template) {\n template = this.templateFor(bucket.component, env);\n }\n return env.getCompiledBlock(CurlyComponentLayoutCompiler, template);\n };\n\n CurlyComponentManager.prototype.templateFor = function templateFor(component, env) {\n var Template = (0, _emberMetal.get)(component, 'layout');\n var owner = component[_emberUtils.OWNER];\n if (Template) {\n return env.getTemplate(Template, owner);\n }\n var layoutName = (0, _emberMetal.get)(component, 'layoutName');\n if (layoutName) {\n var template = owner.lookup('template:' + layoutName);\n if (template) {\n return template;\n }\n }\n return owner.lookup(DEFAULT_LAYOUT);\n };\n\n CurlyComponentManager.prototype.getSelf = function getSelf(_ref) {\n var component = _ref.component;\n\n return component[_component.ROOT_REF];\n };\n\n CurlyComponentManager.prototype.didCreateElement = function didCreateElement(_ref2, element, operations) {\n var component = _ref2.component,\n classRef = _ref2.classRef,\n environment = _ref2.environment;\n\n (0, _emberViews.setViewElement)(component, element);\n var attributeBindings = component.attributeBindings,\n classNames = component.classNames,\n classNameBindings = component.classNameBindings;\n\n if (attributeBindings && attributeBindings.length) {\n applyAttributeBindings(element, attributeBindings, component, operations);\n } else {\n operations.addStaticAttribute(element, 'id', component.elementId);\n _bindings.IsVisibleBinding.install(element, component, operations);\n }\n if (classRef) {\n // TODO should make addDynamicAttribute accept an opaque\n operations.addDynamicAttribute(element, 'class', classRef, false);\n }\n if (classNames && classNames.length) {\n classNames.forEach(function (name) {\n operations.addStaticAttribute(element, 'class', name);\n });\n }\n if (classNameBindings && classNameBindings.length) {\n classNameBindings.forEach(function (binding) {\n _bindings.ClassNameBinding.install(element, component, binding, operations);\n });\n }\n component._transitionTo('hasElement');\n if (environment.isInteractive) {\n component.trigger('willInsertElement');\n }\n };\n\n CurlyComponentManager.prototype.didRenderLayout = function didRenderLayout(bucket, bounds) {\n bucket.component[_component.BOUNDS] = bounds;\n bucket.finalize();\n if (true) {\n this.debugStack.pop();\n }\n };\n\n CurlyComponentManager.prototype.getTag = function getTag(_ref3) {\n var component = _ref3.component;\n\n return component[_component.DIRTY_TAG];\n };\n\n CurlyComponentManager.prototype.didCreate = function didCreate(_ref4) {\n var component = _ref4.component,\n environment = _ref4.environment;\n\n if (environment.isInteractive) {\n component._transitionTo('inDOM');\n component.trigger('didInsertElement');\n component.trigger('didRender');\n }\n };\n\n CurlyComponentManager.prototype.update = function update(bucket) {\n var component = bucket.component,\n args = bucket.args,\n argsRevision = bucket.argsRevision,\n environment = bucket.environment;\n\n if (true) {\n this._pushToDebugStack(component._debugContainerKey, environment);\n }\n bucket.finalizer = (0, _emberMetal._instrumentStart)('render.component', rerenderInstrumentDetails, component);\n if (!args.tag.validate(argsRevision)) {\n var props = (0, _processArgs.processComponentArgs)(args);\n bucket.argsRevision = args.tag.value();\n component[_component.IS_DISPATCHING_ATTRS] = true;\n component.setProperties(props);\n component[_component.IS_DISPATCHING_ATTRS] = false;\n component.trigger('didUpdateAttrs');\n component.trigger('didReceiveAttrs');\n }\n if (environment.isInteractive) {\n component.trigger('willUpdate');\n component.trigger('willRender');\n }\n };\n\n CurlyComponentManager.prototype.didUpdateLayout = function didUpdateLayout(bucket) {\n bucket.finalize();\n if (true) {\n this.debugStack.pop();\n }\n };\n\n CurlyComponentManager.prototype.didUpdate = function didUpdate(_ref5) {\n var component = _ref5.component,\n environment = _ref5.environment;\n\n if (environment.isInteractive) {\n component.trigger('didUpdate');\n component.trigger('didRender');\n }\n };\n\n CurlyComponentManager.prototype.getDestructor = function getDestructor(stateBucket) {\n return stateBucket;\n };\n\n return CurlyComponentManager;\n }(_abstract.default);\n\n exports.default = CurlyComponentManager;\n function validatePositionalParameters(named, positional, positionalParamsDefinition) {\n if (true) {\n if (!named || !positional || !positional.length) {\n return;\n }\n var paramType = typeof positionalParamsDefinition;\n if (paramType === 'string') {\n (true && !(!named.has(positionalParamsDefinition)) && (0, _emberDebug.assert)('You cannot specify positional parameters and the hash argument `' + positionalParamsDefinition + '`.', !named.has(positionalParamsDefinition)));\n } else {\n if (positional.length < positionalParamsDefinition.length) {\n positionalParamsDefinition = positionalParamsDefinition.slice(0, positional.length);\n }\n for (var i = 0; i < positionalParamsDefinition.length; i++) {\n var name = positionalParamsDefinition[i];\n (true && !(!named.has(name)) && (0, _emberDebug.assert)('You cannot specify both a positional param (at position ' + i + ') and the hash argument `' + name + '`.', !named.has(name)));\n }\n }\n }\n }\n function processComponentInitializationAssertions(component, props) {\n (true && !(function () {\n var classNameBindings = component.classNameBindings;\n\n for (var i = 0; i < classNameBindings.length; i++) {\n var binding = classNameBindings[i];\n if (typeof binding !== 'string' || binding.length === 0) {\n return false;\n }\n }\n return true;\n }()) && (0, _emberDebug.assert)('classNameBindings must be non-empty strings: ' + component, function () {\n var classNameBindings = component.classNameBindings;\n for (var i = 0; i < classNameBindings.length; i++) {\n var binding = classNameBindings[i];if (typeof binding !== 'string' || binding.length === 0) {\n return false;\n }\n }return true;\n }()));\n (true && !(function () {\n var classNameBindings = component.classNameBindings;\n\n for (var i = 0; i < classNameBindings.length; i++) {\n var binding = classNameBindings[i];\n if (binding.split(' ').length > 1) {\n return false;\n }\n }\n return true;\n }()) && (0, _emberDebug.assert)('classNameBindings must not have spaces in them: ' + component, function () {\n var classNameBindings = component.classNameBindings;\n for (var i = 0; i < classNameBindings.length; i++) {\n var binding = classNameBindings[i];if (binding.split(' ').length > 1) {\n return false;\n }\n }return true;\n }()));\n (true && !(component.tagName !== '' || !component.classNameBindings || component.classNameBindings.length === 0) && (0, _emberDebug.assert)('You cannot use `classNameBindings` on a tag-less component: ' + component, component.tagName !== '' || !component.classNameBindings || component.classNameBindings.length === 0));\n (true && !(component.tagName !== '' || props.id === component.elementId || !component.elementId && component.elementId !== '') && (0, _emberDebug.assert)('You cannot use `elementId` on a tag-less component: ' + component, component.tagName !== '' || props.id === component.elementId || !component.elementId && component.elementId !== ''));\n (true && !(component.tagName !== '' || !component.attributeBindings || component.attributeBindings.length === 0) && (0, _emberDebug.assert)('You cannot use `attributeBindings` on a tag-less component: ' + component, component.tagName !== '' || !component.attributeBindings || component.attributeBindings.length === 0));\n }\n function initialRenderInstrumentDetails(component) {\n return component.instrumentDetails({ initialRender: true });\n }\n function rerenderInstrumentDetails(component) {\n return component.instrumentDetails({ initialRender: false });\n }\n var MANAGER = new CurlyComponentManager();\n\n var CurlyComponentDefinition = exports.CurlyComponentDefinition = function (_ComponentDefinition) {\n (0, _emberBabel.inherits)(CurlyComponentDefinition, _ComponentDefinition);\n\n // tslint:disable-next-line:no-shadowed-variable\n function CurlyComponentDefinition(name, ComponentClass, template, args, customManager) {\n (0, _emberBabel.classCallCheck)(this, CurlyComponentDefinition);\n\n var _this2 = (0, _emberBabel.possibleConstructorReturn)(this, _ComponentDefinition.call(this, name, customManager || MANAGER, ComponentClass));\n\n _this2.template = template;\n _this2.args = args;\n return _this2;\n }\n\n return CurlyComponentDefinition;\n }(_runtime.ComponentDefinition);\n});","enifed('ember-glimmer/component-managers/mount', ['exports', 'ember-babel', '@glimmer/runtime', 'ember-routing', 'ember/features', 'ember-glimmer/utils/references', 'ember-glimmer/component-managers/abstract', 'ember-glimmer/component-managers/outlet'], function (exports, _emberBabel, _runtime, _emberRouting, _features, _references, _abstract, _outlet) {\n 'use strict';\n\n exports.MountDefinition = undefined;\n\n var MountManager = function (_AbstractManager) {\n (0, _emberBabel.inherits)(MountManager, _AbstractManager);\n\n function MountManager() {\n (0, _emberBabel.classCallCheck)(this, MountManager);\n return (0, _emberBabel.possibleConstructorReturn)(this, _AbstractManager.apply(this, arguments));\n }\n\n MountManager.prototype.create = function create(environment, _ref, args) {\n var name = _ref.name;\n\n if (true) {\n this._pushEngineToDebugStack('engine:' + name, environment);\n }\n var engine = environment.owner.buildChildEngineInstance(name);\n engine.boot();\n var bucket = { engine: engine };\n if (_features.EMBER_ENGINES_MOUNT_PARAMS) {\n bucket.modelReference = args.named.get('model');\n }\n return bucket;\n };\n\n MountManager.prototype.layoutFor = function layoutFor(_definition, _ref2, env) {\n var engine = _ref2.engine;\n\n var template = engine.lookup('template:application');\n return env.getCompiledBlock(_outlet.OutletLayoutCompiler, template);\n };\n\n MountManager.prototype.getSelf = function getSelf(bucket) {\n var engine = bucket.engine,\n modelReference = bucket.modelReference;\n\n var applicationFactory = engine.factoryFor('controller:application');\n var controllerFactory = applicationFactory || (0, _emberRouting.generateControllerFactory)(engine, 'application');\n var controller = bucket.controller = controllerFactory.create();\n if (_features.EMBER_ENGINES_MOUNT_PARAMS) {\n var model = modelReference.value();\n bucket.modelRevision = modelReference.tag.value();\n controller.set('model', model);\n }\n return new _references.RootReference(controller);\n };\n\n MountManager.prototype.getDestructor = function getDestructor(_ref3) {\n var engine = _ref3.engine;\n\n return engine;\n };\n\n MountManager.prototype.didRenderLayout = function didRenderLayout() {\n if (true) {\n this.debugStack.pop();\n }\n };\n\n MountManager.prototype.update = function update(bucket) {\n if (_features.EMBER_ENGINES_MOUNT_PARAMS) {\n var controller = bucket.controller,\n modelReference = bucket.modelReference,\n modelRevision = bucket.modelRevision;\n\n if (!modelReference.tag.validate(modelRevision)) {\n var model = modelReference.value();\n bucket.modelRevision = modelReference.tag.value();\n controller.set('model', model);\n }\n }\n };\n\n return MountManager;\n }(_abstract.default);\n\n var MOUNT_MANAGER = new MountManager();\n\n var MountDefinition = exports.MountDefinition = function (_ComponentDefinition) {\n (0, _emberBabel.inherits)(MountDefinition, _ComponentDefinition);\n\n function MountDefinition(name) {\n (0, _emberBabel.classCallCheck)(this, MountDefinition);\n return (0, _emberBabel.possibleConstructorReturn)(this, _ComponentDefinition.call(this, name, MOUNT_MANAGER, null));\n }\n\n return MountDefinition;\n }(_runtime.ComponentDefinition);\n});","enifed('ember-glimmer/component-managers/outlet', ['exports', 'ember-babel', '@glimmer/runtime', 'ember-metal', 'ember-utils', 'ember/features', 'ember-glimmer/utils/references', 'ember-glimmer/component-managers/abstract'], function (exports, _emberBabel, _runtime, _emberMetal, _emberUtils, _features, _references, _abstract) {\n 'use strict';\n\n exports.OutletLayoutCompiler = exports.OutletComponentDefinition = exports.TopLevelOutletComponentDefinition = undefined;\n\n function instrumentationPayload(_ref) {\n var _ref$render = _ref.render,\n name = _ref$render.name,\n outlet = _ref$render.outlet;\n\n return { object: name + ':' + outlet };\n }\n function NOOP() {}\n\n var StateBucket = function () {\n function StateBucket(outletState) {\n (0, _emberBabel.classCallCheck)(this, StateBucket);\n\n this.outletState = outletState;\n this.instrument();\n }\n\n StateBucket.prototype.instrument = function instrument() {\n this.finalizer = (0, _emberMetal._instrumentStart)('render.outlet', instrumentationPayload, this.outletState);\n };\n\n StateBucket.prototype.finalize = function finalize() {\n var finalizer = this.finalizer;\n\n finalizer();\n this.finalizer = NOOP;\n };\n\n return StateBucket;\n }();\n\n var OutletComponentManager = function (_AbstractManager) {\n (0, _emberBabel.inherits)(OutletComponentManager, _AbstractManager);\n\n function OutletComponentManager() {\n (0, _emberBabel.classCallCheck)(this, OutletComponentManager);\n return (0, _emberBabel.possibleConstructorReturn)(this, _AbstractManager.apply(this, arguments));\n }\n\n OutletComponentManager.prototype.create = function create(environment, definition, _args, dynamicScope) {\n if (true) {\n this._pushToDebugStack('template:' + definition.template.meta.moduleName, environment);\n }\n var outletStateReference = dynamicScope.outletState = dynamicScope.outletState.get('outlets').get(definition.outletName);\n var outletState = outletStateReference.value();\n return new StateBucket(outletState);\n };\n\n OutletComponentManager.prototype.layoutFor = function layoutFor(definition, _bucket, env) {\n return env.getCompiledBlock(OutletLayoutCompiler, definition.template);\n };\n\n OutletComponentManager.prototype.getSelf = function getSelf(_ref2) {\n var outletState = _ref2.outletState;\n\n return new _references.RootReference(outletState.render.controller);\n };\n\n OutletComponentManager.prototype.didRenderLayout = function didRenderLayout(bucket) {\n bucket.finalize();\n if (true) {\n this.debugStack.pop();\n }\n };\n\n OutletComponentManager.prototype.getDestructor = function getDestructor() {\n return null;\n };\n\n return OutletComponentManager;\n }(_abstract.default);\n\n var MANAGER = new OutletComponentManager();\n\n var TopLevelOutletComponentManager = function (_OutletComponentManag) {\n (0, _emberBabel.inherits)(TopLevelOutletComponentManager, _OutletComponentManag);\n\n function TopLevelOutletComponentManager() {\n (0, _emberBabel.classCallCheck)(this, TopLevelOutletComponentManager);\n return (0, _emberBabel.possibleConstructorReturn)(this, _OutletComponentManag.apply(this, arguments));\n }\n\n TopLevelOutletComponentManager.prototype.create = function create(environment, definition, _args, dynamicScope) {\n if (true) {\n this._pushToDebugStack('template:' + definition.template.meta.moduleName, environment);\n }\n return new StateBucket(dynamicScope.outletState.value());\n };\n\n return TopLevelOutletComponentManager;\n }(OutletComponentManager);\n\n var TOP_LEVEL_MANAGER = function () {\n if (_features.EMBER_GLIMMER_REMOVE_APPLICATION_TEMPLATE_WRAPPER) {\n return new TopLevelOutletComponentManager();\n } else {\n var WrappedTopLevelOutletLayoutCompiler = function () {\n function WrappedTopLevelOutletLayoutCompiler(template) {\n (0, _emberBabel.classCallCheck)(this, WrappedTopLevelOutletLayoutCompiler);\n\n this.template = template;\n }\n\n WrappedTopLevelOutletLayoutCompiler.prototype.compile = function compile(builder) {\n builder.wrapLayout(this.template);\n builder.tag.static('div');\n builder.attrs.static('id', (0, _emberUtils.guidFor)(this));\n builder.attrs.static('class', 'ember-view');\n };\n\n return WrappedTopLevelOutletLayoutCompiler;\n }();\n\n WrappedTopLevelOutletLayoutCompiler.id = 'wrapped-top-level-outlet';\n\n var WrappedTopLevelOutletComponentManager = function (_TopLevelOutletCompon) {\n (0, _emberBabel.inherits)(WrappedTopLevelOutletComponentManager, _TopLevelOutletCompon);\n\n function WrappedTopLevelOutletComponentManager() {\n (0, _emberBabel.classCallCheck)(this, WrappedTopLevelOutletComponentManager);\n return (0, _emberBabel.possibleConstructorReturn)(this, _TopLevelOutletCompon.apply(this, arguments));\n }\n\n WrappedTopLevelOutletComponentManager.prototype.layoutFor = function layoutFor(definition, _bucket, env) {\n return env.getCompiledBlock(WrappedTopLevelOutletLayoutCompiler, definition.template);\n };\n\n return WrappedTopLevelOutletComponentManager;\n }(TopLevelOutletComponentManager);\n\n return new WrappedTopLevelOutletComponentManager();\n }\n }();\n\n var TopLevelOutletComponentDefinition = exports.TopLevelOutletComponentDefinition = function (_ComponentDefinition) {\n (0, _emberBabel.inherits)(TopLevelOutletComponentDefinition, _ComponentDefinition);\n\n function TopLevelOutletComponentDefinition(instance) {\n (0, _emberBabel.classCallCheck)(this, TopLevelOutletComponentDefinition);\n\n var _this4 = (0, _emberBabel.possibleConstructorReturn)(this, _ComponentDefinition.call(this, 'outlet', TOP_LEVEL_MANAGER, instance));\n\n _this4.template = instance.template;\n (0, _emberUtils.generateGuid)(_this4);\n return _this4;\n }\n\n return TopLevelOutletComponentDefinition;\n }(_runtime.ComponentDefinition);\n\n var OutletComponentDefinition = exports.OutletComponentDefinition = function (_ComponentDefinition2) {\n (0, _emberBabel.inherits)(OutletComponentDefinition, _ComponentDefinition2);\n\n function OutletComponentDefinition(outletName, template) {\n (0, _emberBabel.classCallCheck)(this, OutletComponentDefinition);\n\n var _this5 = (0, _emberBabel.possibleConstructorReturn)(this, _ComponentDefinition2.call(this, 'outlet', MANAGER, null));\n\n _this5.outletName = outletName;\n _this5.template = template;\n (0, _emberUtils.generateGuid)(_this5);\n return _this5;\n }\n\n return OutletComponentDefinition;\n }(_runtime.ComponentDefinition);\n\n var OutletLayoutCompiler = exports.OutletLayoutCompiler = function () {\n function OutletLayoutCompiler(template) {\n (0, _emberBabel.classCallCheck)(this, OutletLayoutCompiler);\n\n this.template = template;\n }\n\n OutletLayoutCompiler.prototype.compile = function compile(builder) {\n builder.wrapLayout(this.template);\n };\n\n return OutletLayoutCompiler;\n }();\n\n OutletLayoutCompiler.id = 'outlet';\n});","enifed('ember-glimmer/component-managers/render', ['exports', 'ember-babel', '@glimmer/runtime', 'ember-debug', 'ember-routing', 'ember-glimmer/utils/references', 'ember-glimmer/component-managers/abstract', 'ember-glimmer/component-managers/outlet'], function (exports, _emberBabel, _runtime, _emberDebug, _emberRouting, _references, _abstract, _outlet) {\n 'use strict';\n\n exports.RenderDefinition = exports.NON_SINGLETON_RENDER_MANAGER = exports.SINGLETON_RENDER_MANAGER = exports.AbstractRenderManager = undefined;\n\n var AbstractRenderManager = exports.AbstractRenderManager = function (_AbstractManager) {\n (0, _emberBabel.inherits)(AbstractRenderManager, _AbstractManager);\n\n function AbstractRenderManager() {\n (0, _emberBabel.classCallCheck)(this, AbstractRenderManager);\n return (0, _emberBabel.possibleConstructorReturn)(this, _AbstractManager.apply(this, arguments));\n }\n\n AbstractRenderManager.prototype.layoutFor = function layoutFor(definition, _bucket, env) {\n // only curly components can have lazy layout\n (true && !(!!definition.template) && (0, _emberDebug.assert)('definition is missing a template', !!definition.template));\n\n return env.getCompiledBlock(_outlet.OutletLayoutCompiler, definition.template);\n };\n\n AbstractRenderManager.prototype.getSelf = function getSelf(_ref) {\n var controller = _ref.controller;\n\n return new _references.RootReference(controller);\n };\n\n return AbstractRenderManager;\n }(_abstract.default);\n\n if (true) {\n AbstractRenderManager.prototype.didRenderLayout = function () {\n this.debugStack.pop();\n };\n }\n\n var SingletonRenderManager = function (_AbstractRenderManage) {\n (0, _emberBabel.inherits)(SingletonRenderManager, _AbstractRenderManage);\n\n function SingletonRenderManager() {\n (0, _emberBabel.classCallCheck)(this, SingletonRenderManager);\n return (0, _emberBabel.possibleConstructorReturn)(this, _AbstractRenderManage.apply(this, arguments));\n }\n\n SingletonRenderManager.prototype.create = function create(env, definition, _args, dynamicScope) {\n var name = definition.name;\n\n var controller = env.owner.lookup('controller:' + name) || (0, _emberRouting.generateController)(env.owner, name);\n if (true) {\n this._pushToDebugStack('controller:' + name + ' (with the render helper)', env);\n }\n if (dynamicScope.rootOutletState) {\n dynamicScope.outletState = dynamicScope.rootOutletState.getOrphan(name);\n }\n return { controller: controller };\n };\n\n SingletonRenderManager.prototype.getDestructor = function getDestructor() {\n return null;\n };\n\n return SingletonRenderManager;\n }(AbstractRenderManager);\n\n var SINGLETON_RENDER_MANAGER = exports.SINGLETON_RENDER_MANAGER = new SingletonRenderManager();\n\n var NonSingletonRenderManager = function (_AbstractRenderManage2) {\n (0, _emberBabel.inherits)(NonSingletonRenderManager, _AbstractRenderManage2);\n\n function NonSingletonRenderManager() {\n (0, _emberBabel.classCallCheck)(this, NonSingletonRenderManager);\n return (0, _emberBabel.possibleConstructorReturn)(this, _AbstractRenderManage2.apply(this, arguments));\n }\n\n NonSingletonRenderManager.prototype.create = function create(environment, definition, args, dynamicScope) {\n var name = definition.name,\n env = definition.env;\n\n var modelRef = args.positional.at(0);\n var controllerFactory = env.owner.factoryFor('controller:' + name);\n var factory = controllerFactory || (0, _emberRouting.generateControllerFactory)(env.owner, name);\n var controller = factory.create({ model: modelRef.value() });\n if (true) {\n this._pushToDebugStack('controller:' + name + ' (with the render helper)', environment);\n }\n if (dynamicScope.rootOutletState) {\n dynamicScope.outletState = dynamicScope.rootOutletState.getOrphan(name);\n }\n return { controller: controller, model: modelRef };\n };\n\n NonSingletonRenderManager.prototype.update = function update(_ref2) {\n var controller = _ref2.controller,\n model = _ref2.model;\n\n controller.set('model', model.value());\n };\n\n NonSingletonRenderManager.prototype.getDestructor = function getDestructor(_ref3) {\n var controller = _ref3.controller;\n\n return controller;\n };\n\n return NonSingletonRenderManager;\n }(AbstractRenderManager);\n\n var NON_SINGLETON_RENDER_MANAGER = exports.NON_SINGLETON_RENDER_MANAGER = new NonSingletonRenderManager();\n\n var RenderDefinition = exports.RenderDefinition = function (_ComponentDefinition) {\n (0, _emberBabel.inherits)(RenderDefinition, _ComponentDefinition);\n\n function RenderDefinition(name, template, env, manager) {\n (0, _emberBabel.classCallCheck)(this, RenderDefinition);\n\n var _this4 = (0, _emberBabel.possibleConstructorReturn)(this, _ComponentDefinition.call(this, 'render', manager, null));\n\n _this4.name = name;\n _this4.template = template;\n _this4.env = env;\n return _this4;\n }\n\n return RenderDefinition;\n }(_runtime.ComponentDefinition);\n});","enifed('ember-glimmer/component-managers/root', ['exports', 'ember-babel', '@glimmer/runtime', 'ember-metal', 'ember-glimmer/utils/curly-component-state-bucket', 'ember-glimmer/component-managers/curly'], function (exports, _emberBabel, _runtime, _emberMetal, _curlyComponentStateBucket, _curly) {\n 'use strict';\n\n exports.RootComponentDefinition = undefined;\n\n var RootComponentManager = function (_CurlyComponentManage) {\n (0, _emberBabel.inherits)(RootComponentManager, _CurlyComponentManage);\n\n function RootComponentManager() {\n (0, _emberBabel.classCallCheck)(this, RootComponentManager);\n return (0, _emberBabel.possibleConstructorReturn)(this, _CurlyComponentManage.apply(this, arguments));\n }\n\n RootComponentManager.prototype.create = function create(environment, definition, args, dynamicScope) {\n var component = definition.ComponentClass.create();\n if (true) {\n this._pushToDebugStack(component._debugContainerKey, environment);\n }\n var finalizer = (0, _emberMetal._instrumentStart)('render.component', _curly.initialRenderInstrumentDetails, component);\n dynamicScope.view = component;\n // We usually do this in the `didCreateElement`, but that hook doesn't fire for tagless components\n if (component.tagName === '') {\n if (environment.isInteractive) {\n component.trigger('willRender');\n }\n component._transitionTo('hasElement');\n if (environment.isInteractive) {\n component.trigger('willInsertElement');\n }\n }\n if (true) {\n (0, _curly.processComponentInitializationAssertions)(component, {});\n }\n return new _curlyComponentStateBucket.default(environment, component, args.named.capture(), finalizer);\n };\n\n return RootComponentManager;\n }(_curly.default);\n\n var ROOT_MANAGER = new RootComponentManager();\n\n var RootComponentDefinition = exports.RootComponentDefinition = function (_ComponentDefinition) {\n (0, _emberBabel.inherits)(RootComponentDefinition, _ComponentDefinition);\n\n function RootComponentDefinition(instance) {\n (0, _emberBabel.classCallCheck)(this, RootComponentDefinition);\n\n var _this2 = (0, _emberBabel.possibleConstructorReturn)(this, _ComponentDefinition.call(this, '-root', ROOT_MANAGER, {\n class: instance.constructor,\n create: function () {\n return instance;\n }\n }));\n\n _this2.template = undefined;\n _this2.args = undefined;\n return _this2;\n }\n\n return RootComponentDefinition;\n }(_runtime.ComponentDefinition);\n});","enifed('ember-glimmer/component-managers/template-only', ['exports', 'ember-babel', '@glimmer/runtime', 'ember-glimmer/component-managers/abstract'], function (exports, _emberBabel, _runtime, _abstract) {\n 'use strict';\n\n exports.TemplateOnlyComponentDefinition = undefined;\n\n var TemplateOnlyComponentLayoutCompiler = function () {\n function TemplateOnlyComponentLayoutCompiler(template) {\n (0, _emberBabel.classCallCheck)(this, TemplateOnlyComponentLayoutCompiler);\n\n this.template = template;\n }\n\n TemplateOnlyComponentLayoutCompiler.prototype.compile = function compile(builder) {\n // TODO: use fromLayout\n builder.wrapLayout(this.template);\n };\n\n return TemplateOnlyComponentLayoutCompiler;\n }();\n\n TemplateOnlyComponentLayoutCompiler.id = 'template-only';\n\n var TemplateOnlyComponentManager = function (_AbstractManager) {\n (0, _emberBabel.inherits)(TemplateOnlyComponentManager, _AbstractManager);\n\n function TemplateOnlyComponentManager() {\n (0, _emberBabel.classCallCheck)(this, TemplateOnlyComponentManager);\n return (0, _emberBabel.possibleConstructorReturn)(this, _AbstractManager.apply(this, arguments));\n }\n\n TemplateOnlyComponentManager.prototype.create = function create() {\n return null;\n };\n\n TemplateOnlyComponentManager.prototype.layoutFor = function layoutFor(_ref, _, env) {\n var template = _ref.template;\n\n return env.getCompiledBlock(TemplateOnlyComponentLayoutCompiler, template);\n };\n\n TemplateOnlyComponentManager.prototype.getSelf = function getSelf() {\n return _runtime.NULL_REFERENCE;\n };\n\n TemplateOnlyComponentManager.prototype.getDestructor = function getDestructor() {\n return null;\n };\n\n return TemplateOnlyComponentManager;\n }(_abstract.default);\n\n exports.default = TemplateOnlyComponentManager;\n\n var MANAGER = new TemplateOnlyComponentManager();\n\n var TemplateOnlyComponentDefinition = exports.TemplateOnlyComponentDefinition = function (_ComponentDefinition) {\n (0, _emberBabel.inherits)(TemplateOnlyComponentDefinition, _ComponentDefinition);\n\n function TemplateOnlyComponentDefinition(name, template) {\n (0, _emberBabel.classCallCheck)(this, TemplateOnlyComponentDefinition);\n\n var _this2 = (0, _emberBabel.possibleConstructorReturn)(this, _ComponentDefinition.call(this, name, MANAGER, null));\n\n _this2.template = template;\n return _this2;\n }\n\n return TemplateOnlyComponentDefinition;\n }(_runtime.ComponentDefinition);\n});","enifed('ember-glimmer/component', ['exports', '@glimmer/reference', '@glimmer/runtime', 'ember-debug', 'ember-metal', 'ember-runtime', 'ember-utils', 'ember-views', 'ember-glimmer/utils/references'], function (exports, _reference, _runtime, _emberDebug, _emberMetal, _emberRuntime, _emberUtils, _emberViews, _references) {\n 'use strict';\n\n exports.BOUNDS = exports.HAS_BLOCK = exports.IS_DISPATCHING_ATTRS = exports.ROOT_REF = exports.ARGS = exports.DIRTY_TAG = undefined;\n\n var _CoreView$extend;\n\n var DIRTY_TAG = exports.DIRTY_TAG = (0, _emberUtils.symbol)('DIRTY_TAG');\n var ARGS = exports.ARGS = (0, _emberUtils.symbol)('ARGS');\n var ROOT_REF = exports.ROOT_REF = (0, _emberUtils.symbol)('ROOT_REF');\n var IS_DISPATCHING_ATTRS = exports.IS_DISPATCHING_ATTRS = (0, _emberUtils.symbol)('IS_DISPATCHING_ATTRS');\n var HAS_BLOCK = exports.HAS_BLOCK = (0, _emberUtils.symbol)('HAS_BLOCK');\n var BOUNDS = exports.BOUNDS = (0, _emberUtils.symbol)('BOUNDS');\n /**\n @module @ember/component\n */\n /**\n A `Component` is a view that is completely\n isolated. Properties accessed in its templates go\n to the view object and actions are targeted at\n the view object. There is no access to the\n surrounding context or outer controller; all\n contextual information must be passed in.\n \n The easiest way to create a `Component` is via\n a template. If you name a template\n `app/components/my-foo.hbs`, you will be able to use\n `{{my-foo}}` in other templates, which will make\n an instance of the isolated component.\n \n ```app/components/my-foo.hbs\n {{person-profile person=currentUser}}\n ```\n \n ```app/components/person-profile.hbs\n <h1>{{person.title}}</h1>\n <img src={{person.avatar}}>\n <p class='signature'>{{person.signature}}</p>\n ```\n \n You can use `yield` inside a template to\n include the **contents** of any block attached to\n the component. The block will be executed in the\n context of the surrounding context or outer controller:\n \n ```handlebars\n {{#person-profile person=currentUser}}\n <p>Admin mode</p>\n {{! Executed in the controller's context. }}\n {{/person-profile}}\n ```\n \n ```app/components/person-profile.hbs\n <h1>{{person.title}}</h1>\n {{! Executed in the component's context. }}\n {{yield}} {{! block contents }}\n ```\n \n If you want to customize the component, in order to\n handle events or actions, you implement a subclass\n of `Component` named after the name of the\n component.\n \n For example, you could implement the action\n `hello` for the `person-profile` component:\n \n ```app/components/person-profile.js\n import Component from '@ember/component';\n \n export default Component.extend({\n actions: {\n hello(name) {\n console.log(\"Hello\", name);\n }\n }\n });\n ```\n \n And then use it in the component's template:\n \n ```app/templates/components/person-profile.hbs\n <h1>{{person.title}}</h1>\n {{yield}} <!-- block contents -->\n <button {{action 'hello' person.name}}>\n Say Hello to {{person.name}}\n </button>\n ```\n \n Components must have a `-` in their name to avoid\n conflicts with built-in controls that wrap HTML\n elements. This is consistent with the same\n requirement in web components.\n \n ## HTML Tag\n \n The default HTML tag name used for a component's DOM representation is `div`.\n This can be customized by setting the `tagName` property.\n The following component class:\n \n ```app/components/emphasized-paragraph.js\n import Component from '@ember/component';\n \n export default Component.extend({\n tagName: 'em'\n });\n ```\n \n Would result in instances with the following HTML:\n \n ```html\n <em id=\"ember1\" class=\"ember-view\"></em>\n ```\n \n ## HTML `class` Attribute\n \n The HTML `class` attribute of a component's tag can be set by providing a\n `classNames` property that is set to an array of strings:\n \n ```app/components/my-widget.js\n import Component from '@ember/component';\n \n export default Component.extend({\n classNames: ['my-class', 'my-other-class']\n });\n ```\n \n Will result in component instances with an HTML representation of:\n \n ```html\n <div id=\"ember1\" class=\"ember-view my-class my-other-class\"></div>\n ```\n \n `class` attribute values can also be set by providing a `classNameBindings`\n property set to an array of properties names for the component. The return value\n of these properties will be added as part of the value for the components's `class`\n attribute. These properties can be computed properties:\n \n ```app/components/my-widget.js\n import Component from '@ember/component';\n import { computed } from '@ember/object';\n \n export default Component.extend({\n classNameBindings: ['propertyA', 'propertyB'],\n \n propertyA: 'from-a',\n propertyB: computed(function() {\n if (someLogic) { return 'from-b'; }\n })\n });\n ```\n \n Will result in component instances with an HTML representation of:\n \n ```html\n <div id=\"ember1\" class=\"ember-view from-a from-b\"></div>\n ```\n \n If the value of a class name binding returns a boolean the property name\n itself will be used as the class name if the property is true.\n The class name will not be added if the value is `false` or `undefined`.\n \n ```app/components/my-widget.js\n import Component from '@ember/component';\n \n export default Component.extend({\n classNameBindings: ['hovered'],\n \n hovered: true\n });\n ```\n \n Will result in component instances with an HTML representation of:\n \n ```html\n <div id=\"ember1\" class=\"ember-view hovered\"></div>\n ```\n \n When using boolean class name bindings you can supply a string value other\n than the property name for use as the `class` HTML attribute by appending the\n preferred value after a \":\" character when defining the binding:\n \n ```app/components/my-widget.js\n import Component from '@ember/component';\n \n export default Component.extend({\n classNameBindings: ['awesome:so-very-cool'],\n \n awesome: true\n });\n ```\n \n Will result in component instances with an HTML representation of:\n \n ```html\n <div id=\"ember1\" class=\"ember-view so-very-cool\"></div>\n ```\n \n Boolean value class name bindings whose property names are in a\n camelCase-style format will be converted to a dasherized format:\n \n ```app/components/my-widget.js\n import Component from '@ember/component';\n \n export default Component.extend({\n classNameBindings: ['isUrgent'],\n \n isUrgent: true\n });\n ```\n \n Will result in component instances with an HTML representation of:\n \n ```html\n <div id=\"ember1\" class=\"ember-view is-urgent\"></div>\n ```\n \n Class name bindings can also refer to object values that are found by\n traversing a path relative to the component itself:\n \n ```app/components/my-widget.js\n import Component from '@ember/component';\n import EmberObject from '@ember/object';\n \n export default Component.extend({\n classNameBindings: ['messages.empty'],\n \n messages: EmberObject.create({\n empty: true\n })\n });\n ```\n \n Will result in component instances with an HTML representation of:\n \n ```html\n <div id=\"ember1\" class=\"ember-view empty\"></div>\n ```\n \n If you want to add a class name for a property which evaluates to true and\n and a different class name if it evaluates to false, you can pass a binding\n like this:\n \n ```app/components/my-widget.js\n import Component from '@ember/component';\n \n export default Component.extend({\n classNameBindings: ['isEnabled:enabled:disabled'],\n isEnabled: true\n });\n ```\n \n Will result in component instances with an HTML representation of:\n \n ```html\n <div id=\"ember1\" class=\"ember-view enabled\"></div>\n ```\n \n When isEnabled is `false`, the resulting HTML representation looks like\n this:\n \n ```html\n <div id=\"ember1\" class=\"ember-view disabled\"></div>\n ```\n \n This syntax offers the convenience to add a class if a property is `false`:\n \n ```app/components/my-widget.js\n import Component from '@ember/component';\n \n // Applies no class when isEnabled is true and class 'disabled' when isEnabled is false\n export default Component.extend({\n classNameBindings: ['isEnabled::disabled'],\n isEnabled: true\n });\n ```\n \n Will result in component instances with an HTML representation of:\n \n ```html\n <div id=\"ember1\" class=\"ember-view\"></div>\n ```\n \n When the `isEnabled` property on the component is set to `false`, it will result\n in component instances with an HTML representation of:\n \n ```html\n <div id=\"ember1\" class=\"ember-view disabled\"></div>\n ```\n \n Updates to the value of a class name binding will result in automatic\n update of the HTML `class` attribute in the component's rendered HTML\n representation. If the value becomes `false` or `undefined` the class name\n will be removed.\n Both `classNames` and `classNameBindings` are concatenated properties. See\n [EmberObject](/api/ember/release/classes/EmberObject) documentation for more\n information about concatenated properties.\n \n ## HTML Attributes\n \n The HTML attribute section of a component's tag can be set by providing an\n `attributeBindings` property set to an array of property names on the component.\n The return value of these properties will be used as the value of the component's\n HTML associated attribute:\n \n ```app/components/my-anchor.js\n import Component from '@ember/component';\n \n export default Component.extend({\n tagName: 'a',\n attributeBindings: ['href'],\n \n href: 'http://google.com'\n });\n ```\n \n Will result in component instances with an HTML representation of:\n \n ```html\n <a id=\"ember1\" class=\"ember-view\" href=\"http://google.com\"></a>\n ```\n \n One property can be mapped on to another by placing a \":\" between\n the source property and the destination property:\n \n ```app/components/my-anchor.js\n import Component from '@ember/component';\n \n export default Component.extend({\n tagName: 'a',\n attributeBindings: ['url:href'],\n \n url: 'http://google.com'\n });\n ```\n \n Will result in component instances with an HTML representation of:\n \n ```html\n <a id=\"ember1\" class=\"ember-view\" href=\"http://google.com\"></a>\n ```\n \n Namespaced attributes (e.g. `xlink:href`) are supported, but have to be\n mapped, since `:` is not a valid character for properties in Javascript:\n \n ```app/components/my-use.js\n import Component from '@ember/component';\n \n export default Component.extend({\n tagName: 'use',\n attributeBindings: ['xlinkHref:xlink:href'],\n \n xlinkHref: '#triangle'\n });\n ```\n \n Will result in component instances with an HTML representation of:\n \n ```html\n <use xlink:href=\"#triangle\"></use>\n ```\n \n If the return value of an `attributeBindings` monitored property is a boolean\n the attribute will be present or absent depending on the value:\n \n ```app/components/my-text-input.js\n import Component from '@ember/component';\n \n export default Component.extend({\n tagName: 'input',\n attributeBindings: ['disabled'],\n \n disabled: false\n });\n ```\n \n Will result in a component instance with an HTML representation of:\n \n ```html\n <input id=\"ember1\" class=\"ember-view\" />\n ```\n \n `attributeBindings` can refer to computed properties:\n \n ```app/components/my-text-input.js\n import Component from '@ember/component';\n import { computed } from '@ember/object';\n \n export default Component.extend({\n tagName: 'input',\n attributeBindings: ['disabled'],\n \n disabled: computed(function() {\n if (someLogic) {\n return true;\n } else {\n return false;\n }\n })\n });\n ```\n \n To prevent setting an attribute altogether, use `null` or `undefined` as the\n return value of the `attributeBindings` monitored property:\n \n ```app/components/my-text-input.js\n import Component from '@ember/component';\n \n export default Component.extend({\n tagName: 'form',\n attributeBindings: ['novalidate'],\n novalidate: null\n });\n ```\n \n Updates to the property of an attribute binding will result in automatic\n update of the HTML attribute in the component's rendered HTML representation.\n `attributeBindings` is a concatenated property. See [EmberObject](/api/ember/release/classes/EmberObject)\n documentation for more information about concatenated properties.\n \n ## Layouts\n \n See [Ember.Templates.helpers.yield](/api/ember/release/classes/Ember.Templates.helpers/methods/yield?anchor=yield)\n for more information.\n \n Layout can be used to wrap content in a component. In addition\n to wrapping content in a Component's template, you can also use\n the public layout API in your Component JavaScript.\n \n ```app/templates/components/person-profile.hbs\n <h1>Person's Title</h1>\n <div class='details'>{{yield}}</div>\n ```\n \n ```app/components/person-profile.js\n import Component from '@ember/component';\n import layout from '../templates/components/person-profile';\n \n export default Component.extend({\n layout\n });\n ```\n \n The above will result in the following HTML output:\n \n ```html\n <h1>Person's Title</h1>\n <div class=\"details\">\n <h2>Chief Basket Weaver</h2>\n <h3>Fisherman Industries</h3>\n </div>\n ```\n \n ## Responding to Browser Events\n \n Components can respond to user-initiated events in one of three ways: method\n implementation, through an event manager, and through `{{action}}` helper use\n in their template or layout.\n \n ### Method Implementation\n \n Components can respond to user-initiated events by implementing a method that\n matches the event name. A `jQuery.Event` object will be passed as the\n argument to this method.\n \n ```app/components/my-widget.js\n import Component from '@ember/component';\n \n export default Component.extend({\n click(event) {\n // will be called when an instance's\n // rendered element is clicked\n }\n });\n ```\n \n ### `{{action}}` Helper\n \n See [Ember.Templates.helpers.action](/api/ember/release/classes/Ember.Templates.helpers/methods/yield?anchor=yield).\n \n ### Event Names\n \n All of the event handling approaches described above respond to the same set\n of events. The names of the built-in events are listed below. (The hash of\n built-in events exists in `Ember.EventDispatcher`.) Additional, custom events\n can be registered by using `Application.customEvents`.\n \n Touch events:\n \n * `touchStart`\n * `touchMove`\n * `touchEnd`\n * `touchCancel`\n \n Keyboard events:\n \n * `keyDown`\n * `keyUp`\n * `keyPress`\n \n Mouse events:\n \n * `mouseDown`\n * `mouseUp`\n * `contextMenu`\n * `click`\n * `doubleClick`\n * `mouseMove`\n * `focusIn`\n * `focusOut`\n * `mouseEnter`\n * `mouseLeave`\n \n Form events:\n \n * `submit`\n * `change`\n * `focusIn`\n * `focusOut`\n * `input`\n \n HTML5 drag and drop events:\n \n * `dragStart`\n * `drag`\n * `dragEnter`\n * `dragLeave`\n * `dragOver`\n * `dragEnd`\n * `drop`\n \n @class Component\n @extends Ember.CoreView\n @uses Ember.TargetActionSupport\n @uses Ember.ClassNamesSupport\n @uses Ember.ActionSupport\n @uses Ember.ViewMixin\n @uses Ember.ViewStateSupport\n @public\n */\n var Component = _emberViews.CoreView.extend(_emberViews.ChildViewsSupport, _emberViews.ViewStateSupport, _emberViews.ClassNamesSupport, _emberRuntime.TargetActionSupport, _emberViews.ActionSupport, _emberViews.ViewMixin, (_CoreView$extend = {\n isComponent: true,\n init: function () {\n var _this = this;\n\n this._super.apply(this, arguments);\n this[IS_DISPATCHING_ATTRS] = false;\n this[DIRTY_TAG] = new _reference.DirtyableTag();\n this[ROOT_REF] = new _references.RootReference(this);\n this[BOUNDS] = null;\n // If in a tagless component, assert that no event handlers are defined\n (true && !(this.tagName !== '' || !this.renderer._destinedForDOM || !function () {\n var eventDispatcher = (0, _emberUtils.getOwner)(_this).lookup('event_dispatcher:main');\n var events = eventDispatcher && eventDispatcher._finalEvents || {};\n // tslint:disable-next-line:forin\n for (var key in events) {\n var methodName = events[key];\n if (typeof _this[methodName] === 'function') {\n return true; // indicate that the assertion should be triggered\n }\n }\n return false;\n }()) && (0, _emberDebug.assert)('You can not define a function that handles DOM events in the `' + this + '` tagless component since it doesn\\'t have any DOM element.', this.tagName !== '' || !this.renderer._destinedForDOM || !function () {\n var eventDispatcher = (0, _emberUtils.getOwner)(_this).lookup('event_dispatcher:main');var events = eventDispatcher && eventDispatcher._finalEvents || {};for (var key in events) {\n var methodName = events[key];if (typeof _this[methodName] === 'function') {\n return true;\n }\n }return false;\n }()));\n },\n rerender: function () {\n this[DIRTY_TAG].dirty();\n this._super();\n },\n __defineNonEnumerable: function (property) {\n this[property.name] = property.descriptor.value;\n }\n }, _CoreView$extend[_emberMetal.PROPERTY_DID_CHANGE] = function (key) {\n if (this[IS_DISPATCHING_ATTRS]) {\n return;\n }\n var args = this[ARGS];\n var reference = args && args[key];\n if (reference) {\n if (reference[_references.UPDATE]) {\n reference[_references.UPDATE]((0, _emberMetal.get)(this, key));\n }\n }\n }, _CoreView$extend.getAttr = function (key) {\n // TODO Intimate API should be deprecated\n return this.get(key);\n }, _CoreView$extend.readDOMAttr = function (name) {\n var element = (0, _emberViews.getViewElement)(this);\n return (0, _runtime.readDOMAttr)(element, name);\n }, _CoreView$extend));\n Component[_emberUtils.NAME_KEY] = 'Ember.Component';\n Component.reopenClass({\n isComponentFactory: true,\n positionalParams: []\n });\n exports.default = Component;\n});","enifed('ember-glimmer/components/checkbox', ['exports', 'ember-metal', 'ember-glimmer/component', 'ember-glimmer/templates/empty'], function (exports, _emberMetal, _component, _empty) {\n 'use strict';\n\n exports.default = _component.default.extend({\n layout: _empty.default,\n classNames: ['ember-checkbox'],\n tagName: 'input',\n attributeBindings: ['type', 'checked', 'indeterminate', 'disabled', 'tabindex', 'name', 'autofocus', 'required', 'form'],\n type: 'checkbox',\n disabled: false,\n indeterminate: false,\n didInsertElement: function () {\n this._super.apply(this, arguments);\n (0, _emberMetal.get)(this, 'element').indeterminate = !!(0, _emberMetal.get)(this, 'indeterminate');\n },\n change: function () {\n (0, _emberMetal.set)(this, 'checked', this.$().prop('checked'));\n }\n });\n});","enifed('ember-glimmer/components/link-to', ['exports', 'ember-debug', 'ember-metal', 'ember-runtime', 'ember-views', 'ember-glimmer/component', 'ember-glimmer/templates/link-to'], function (exports, _emberDebug, _emberMetal, _emberRuntime, _emberViews, _component, _linkTo) {\n 'use strict';\n\n /**\n @module @ember/routing\n */\n /**\n `LinkComponent` renders an element whose `click` event triggers a\n transition of the application's instance of `Router` to\n a supplied route by name.\n \n `LinkComponent` components are invoked with {{#link-to}}. Properties\n of this class can be overridden with `reopen` to customize application-wide\n behavior.\n \n @class LinkComponent\n @extends Component\n @see {Ember.Templates.helpers.link-to}\n @public\n **/\n var LinkComponent = _component.default.extend({\n layout: _linkTo.default,\n tagName: 'a',\n /**\n Used to determine when this `LinkComponent` is active.\n @property current-when\n @public\n */\n 'current-when': null,\n /**\n Sets the `title` attribute of the `LinkComponent`'s HTML element.\n @property title\n @default null\n @public\n **/\n title: null,\n /**\n Sets the `rel` attribute of the `LinkComponent`'s HTML element.\n @property rel\n @default null\n @public\n **/\n rel: null,\n /**\n Sets the `tabindex` attribute of the `LinkComponent`'s HTML element.\n @property tabindex\n @default null\n @public\n **/\n tabindex: null,\n /**\n Sets the `target` attribute of the `LinkComponent`'s HTML element.\n @since 1.8.0\n @property target\n @default null\n @public\n **/\n target: null,\n /**\n The CSS class to apply to `LinkComponent`'s element when its `active`\n property is `true`.\n @property activeClass\n @type String\n @default active\n @public\n **/\n activeClass: 'active',\n /**\n The CSS class to apply to `LinkComponent`'s element when its `loading`\n property is `true`.\n @property loadingClass\n @type String\n @default loading\n @private\n **/\n loadingClass: 'loading',\n /**\n The CSS class to apply to a `LinkComponent`'s element when its `disabled`\n property is `true`.\n @property disabledClass\n @type String\n @default disabled\n @private\n **/\n disabledClass: 'disabled',\n /**\n Determines whether the `LinkComponent` will trigger routing via\n the `replaceWith` routing strategy.\n @property replace\n @type Boolean\n @default false\n @public\n **/\n replace: false,\n /**\n By default the `{{link-to}}` component will bind to the `href` and\n `title` attributes. It's discouraged that you override these defaults,\n however you can push onto the array if needed.\n @property attributeBindings\n @type Array | String\n @default ['title', 'rel', 'tabindex', 'target']\n @public\n */\n attributeBindings: ['href', 'title', 'rel', 'tabindex', 'target'],\n /**\n By default the `{{link-to}}` component will bind to the `active`, `loading`,\n and `disabled` classes. It is discouraged to override these directly.\n @property classNameBindings\n @type Array\n @default ['active', 'loading', 'disabled', 'ember-transitioning-in', 'ember-transitioning-out']\n @public\n */\n classNameBindings: ['active', 'loading', 'disabled', 'transitioningIn', 'transitioningOut'],\n /**\n By default the `{{link-to}}` component responds to the `click` event. You\n can override this globally by setting this property to your custom\n event name.\n This is particularly useful on mobile when one wants to avoid the 300ms\n click delay using some sort of custom `tap` event.\n @property eventName\n @type String\n @default click\n @private\n */\n eventName: 'click',\n init: function () {\n this._super.apply(this, arguments);\n // Map desired event name to invoke function\n var eventName = (0, _emberMetal.get)(this, 'eventName');\n this.on(eventName, this, this._invoke);\n },\n\n _routing: _emberRuntime.inject.service('-routing'),\n /**\n Accessed as a classname binding to apply the `LinkComponent`'s `disabledClass`\n CSS `class` to the element when the link is disabled.\n When `true` interactions with the element will not trigger route changes.\n @property disabled\n @private\n */\n disabled: (0, _emberMetal.computed)({\n get: function (_key) {\n // always returns false for `get` because (due to the `set` just below)\n // the cached return value from the set will prevent this getter from _ever_\n // being called after a set has occured\n return false;\n },\n set: function (_key, value) {\n this._isDisabled = value;\n return value ? (0, _emberMetal.get)(this, 'disabledClass') : false;\n }\n }),\n _isActive: function (routerState) {\n if ((0, _emberMetal.get)(this, 'loading')) {\n return false;\n }\n var currentWhen = (0, _emberMetal.get)(this, 'current-when');\n if (typeof currentWhen === 'boolean') {\n return currentWhen;\n }\n var isCurrentWhenSpecified = !!currentWhen;\n currentWhen = currentWhen || (0, _emberMetal.get)(this, 'qualifiedRouteName');\n currentWhen = currentWhen.split(' ');\n var routing = (0, _emberMetal.get)(this, '_routing');\n var models = (0, _emberMetal.get)(this, 'models');\n var resolvedQueryParams = (0, _emberMetal.get)(this, 'resolvedQueryParams');\n for (var i = 0; i < currentWhen.length; i++) {\n if (routing.isActiveForRoute(models, resolvedQueryParams, currentWhen[i], routerState, isCurrentWhenSpecified)) {\n return true;\n }\n }\n return false;\n },\n\n /**\n Accessed as a classname binding to apply the `LinkComponent`'s `activeClass`\n CSS `class` to the element when the link is active.\n A `LinkComponent` is considered active when its `currentWhen` property is `true`\n or the application's current route is the route the `LinkComponent` would trigger\n transitions into.\n The `currentWhen` property can match against multiple routes by separating\n route names using the ` ` (space) character.\n @property active\n @private\n */\n active: (0, _emberMetal.computed)('activeClass', '_active', function computeLinkToComponentActiveClass() {\n return this.get('_active') ? (0, _emberMetal.get)(this, 'activeClass') : false;\n }),\n _active: (0, _emberMetal.computed)('_routing.currentState', 'attrs.params', function computeLinkToComponentActive() {\n var currentState = (0, _emberMetal.get)(this, '_routing.currentState');\n if (!currentState) {\n return false;\n }\n return this._isActive(currentState);\n }),\n willBeActive: (0, _emberMetal.computed)('_routing.targetState', function computeLinkToComponentWillBeActive() {\n var routing = (0, _emberMetal.get)(this, '_routing');\n var targetState = (0, _emberMetal.get)(routing, 'targetState');\n if ((0, _emberMetal.get)(routing, 'currentState') === targetState) {\n return;\n }\n return this._isActive(targetState);\n }),\n transitioningIn: (0, _emberMetal.computed)('active', 'willBeActive', function computeLinkToComponentTransitioningIn() {\n if ((0, _emberMetal.get)(this, 'willBeActive') === true && !(0, _emberMetal.get)(this, '_active')) {\n return 'ember-transitioning-in';\n } else {\n return false;\n }\n }),\n transitioningOut: (0, _emberMetal.computed)('active', 'willBeActive', function computeLinkToComponentTransitioningOut() {\n if ((0, _emberMetal.get)(this, 'willBeActive') === false && (0, _emberMetal.get)(this, '_active')) {\n return 'ember-transitioning-out';\n } else {\n return false;\n }\n }),\n _invoke: function (event) {\n if (!(0, _emberViews.isSimpleClick)(event)) {\n return true;\n }\n var preventDefault = (0, _emberMetal.get)(this, 'preventDefault');\n var targetAttribute = (0, _emberMetal.get)(this, 'target');\n if (preventDefault !== false) {\n if (!targetAttribute || targetAttribute === '_self') {\n event.preventDefault();\n }\n }\n if ((0, _emberMetal.get)(this, 'bubbles') === false) {\n event.stopPropagation();\n }\n if (this._isDisabled) {\n return false;\n }\n if ((0, _emberMetal.get)(this, 'loading')) {\n (true && (0, _emberDebug.warn)('This link-to is in an inactive loading state because at least one of its parameters presently has a null/undefined value, or the provided route name is invalid.', false));\n\n return false;\n }\n if (targetAttribute && targetAttribute !== '_self') {\n return false;\n }\n var qualifiedRouteName = (0, _emberMetal.get)(this, 'qualifiedRouteName');\n var models = (0, _emberMetal.get)(this, 'models');\n var queryParams = (0, _emberMetal.get)(this, 'queryParams.values');\n var shouldReplace = (0, _emberMetal.get)(this, 'replace');\n var payload = {\n queryParams: queryParams,\n routeName: qualifiedRouteName\n };\n // tslint:disable-next-line:max-line-length\n (0, _emberMetal.flaggedInstrument)('interaction.link-to', payload, this._generateTransition(payload, qualifiedRouteName, models, queryParams, shouldReplace));\n return false;\n },\n _generateTransition: function (payload, qualifiedRouteName, models, queryParams, shouldReplace) {\n var routing = (0, _emberMetal.get)(this, '_routing');\n return function () {\n payload.transition = routing.transitionTo(qualifiedRouteName, models, queryParams, shouldReplace);\n };\n },\n\n queryParams: null,\n qualifiedRouteName: (0, _emberMetal.computed)('targetRouteName', '_routing.currentState', function computeLinkToComponentQualifiedRouteName() {\n var params = (0, _emberMetal.get)(this, 'params');\n var paramsLength = params.length;\n var lastParam = params[paramsLength - 1];\n if (lastParam && lastParam.isQueryParams) {\n paramsLength--;\n }\n var onlyQueryParamsSupplied = this[_component.HAS_BLOCK] ? paramsLength === 0 : paramsLength === 1;\n if (onlyQueryParamsSupplied) {\n return (0, _emberMetal.get)(this, '_routing.currentRouteName');\n }\n return (0, _emberMetal.get)(this, 'targetRouteName');\n }),\n resolvedQueryParams: (0, _emberMetal.computed)('queryParams', function computeLinkToComponentResolvedQueryParams() {\n var resolvedQueryParams = {};\n var queryParams = (0, _emberMetal.get)(this, 'queryParams');\n if (!queryParams) {\n return resolvedQueryParams;\n }\n var values = queryParams.values;\n for (var key in values) {\n if (!values.hasOwnProperty(key)) {\n continue;\n }\n resolvedQueryParams[key] = values[key];\n }\n return resolvedQueryParams;\n }),\n /**\n Sets the element's `href` attribute to the url for\n the `LinkComponent`'s targeted route.\n If the `LinkComponent`'s `tagName` is changed to a value other\n than `a`, this property will be ignored.\n @property href\n @private\n */\n href: (0, _emberMetal.computed)('models', 'qualifiedRouteName', function computeLinkToComponentHref() {\n if ((0, _emberMetal.get)(this, 'tagName') !== 'a') {\n return;\n }\n var qualifiedRouteName = (0, _emberMetal.get)(this, 'qualifiedRouteName');\n var models = (0, _emberMetal.get)(this, 'models');\n if ((0, _emberMetal.get)(this, 'loading')) {\n return (0, _emberMetal.get)(this, 'loadingHref');\n }\n var routing = (0, _emberMetal.get)(this, '_routing');\n var queryParams = (0, _emberMetal.get)(this, 'queryParams.values');\n if (true) {\n /*\n * Unfortunately, to get decent error messages, we need to do this.\n * In some future state we should be able to use a \"feature flag\"\n * which allows us to strip this without needing to call it twice.\n *\n * if (isDebugBuild()) {\n * // Do the useful debug thing, probably including try/catch.\n * } else {\n * // Do the performant thing.\n * }\n */\n try {\n routing.generateURL(qualifiedRouteName, models, queryParams);\n } catch (e) {\n (true && !(false) && (0, _emberDebug.assert)('You attempted to define a `{{link-to \"' + qualifiedRouteName + '\"}}` but did not pass the parameters required for generating its dynamic segments. ' + e.message));\n }\n }\n return routing.generateURL(qualifiedRouteName, models, queryParams);\n }),\n loading: (0, _emberMetal.computed)('_modelsAreLoaded', 'qualifiedRouteName', function computeLinkToComponentLoading() {\n var qualifiedRouteName = (0, _emberMetal.get)(this, 'qualifiedRouteName');\n var modelsAreLoaded = (0, _emberMetal.get)(this, '_modelsAreLoaded');\n if (!modelsAreLoaded || qualifiedRouteName === null || qualifiedRouteName === undefined) {\n return (0, _emberMetal.get)(this, 'loadingClass');\n }\n }),\n _modelsAreLoaded: (0, _emberMetal.computed)('models', function computeLinkToComponentModelsAreLoaded() {\n var models = (0, _emberMetal.get)(this, 'models');\n for (var i = 0; i < models.length; i++) {\n var model = models[i];\n if (model === null || model === undefined) {\n return false;\n }\n }\n return true;\n }),\n _getModels: function (params) {\n var modelCount = params.length - 1;\n var models = new Array(modelCount);\n for (var i = 0; i < modelCount; i++) {\n var value = params[i + 1];\n models[i] = value;\n }\n return models;\n },\n\n /**\n The default href value to use while a link-to is loading.\n Only applies when tagName is 'a'\n @property loadingHref\n @type String\n @default #\n @private\n */\n loadingHref: '#',\n didReceiveAttrs: function () {\n var queryParams = void 0;\n var params = (0, _emberMetal.get)(this, 'params');\n if (params) {\n // Do not mutate params in place\n params = params.slice();\n }\n (true && !(params && params.length) && (0, _emberDebug.assert)('You must provide one or more parameters to the link-to component.', params && params.length));\n\n var disabledWhen = (0, _emberMetal.get)(this, 'disabledWhen');\n if (disabledWhen !== undefined) {\n this.set('disabled', disabledWhen);\n }\n // Process the positional arguments, in order.\n // 1. Inline link title comes first, if present.\n if (!this[_component.HAS_BLOCK]) {\n this.set('linkTitle', params.shift());\n }\n // 2. `targetRouteName` is now always at index 0.\n this.set('targetRouteName', params[0]);\n // 3. The last argument (if still remaining) is the `queryParams` object.\n var lastParam = params[params.length - 1];\n if (lastParam && lastParam.isQueryParams) {\n queryParams = params.pop();\n } else {\n queryParams = { values: {} };\n }\n this.set('queryParams', queryParams);\n // 4. Any remaining indices (excepting `targetRouteName` at 0) are `models`.\n if (params.length > 1) {\n this.set('models', this._getModels(params));\n } else {\n this.set('models', []);\n }\n }\n }); /**\n @module ember\n */\n /**\n The `{{link-to}}` component renders a link to the supplied\n `routeName` passing an optionally supplied model to the\n route as its `model` context of the route. The block\n for `{{link-to}}` becomes the innerHTML of the rendered\n element:\n \n ```handlebars\n {{#link-to 'photoGallery'}}\n Great Hamster Photos\n {{/link-to}}\n ```\n \n You can also use an inline form of `{{link-to}}` component by\n passing the link text as the first argument\n to the component:\n \n ```handlebars\n {{link-to 'Great Hamster Photos' 'photoGallery'}}\n ```\n \n Both will result in:\n \n ```html\n <a href=\"/hamster-photos\">\n Great Hamster Photos\n </a>\n ```\n \n ### Supplying a tagName\n By default `{{link-to}}` renders an `<a>` element. This can\n be overridden for a single use of `{{link-to}}` by supplying\n a `tagName` option:\n \n ```handlebars\n {{#link-to 'photoGallery' tagName=\"li\"}}\n Great Hamster Photos\n {{/link-to}}\n ```\n \n ```html\n <li>\n Great Hamster Photos\n </li>\n ```\n \n To override this option for your entire application, see\n \"Overriding Application-wide Defaults\".\n \n ### Disabling the `link-to` component\n By default `{{link-to}}` is enabled.\n any passed value to the `disabled` component property will disable\n the `link-to` component.\n \n static use: the `disabled` option:\n \n ```handlebars\n {{#link-to 'photoGallery' disabled=true}}\n Great Hamster Photos\n {{/link-to}}\n ```\n \n dynamic use: the `disabledWhen` option:\n \n ```handlebars\n {{#link-to 'photoGallery' disabledWhen=controller.someProperty}}\n Great Hamster Photos\n {{/link-to}}\n ```\n \n any truthy value passed to `disabled` will disable it except `undefined`.\n \n See \"Overriding Application-wide Defaults\" for more.\n \n ### Handling `href`\n `{{link-to}}` will use your application's Router to\n fill the element's `href` property with a url that\n matches the path to the supplied `routeName` for your\n router's configured `Location` scheme, which defaults\n to HashLocation.\n \n ### Handling current route\n `{{link-to}}` will apply a CSS class name of 'active'\n when the application's current route matches\n the supplied routeName. For example, if the application's\n current route is 'photoGallery.recent' the following\n use of `{{link-to}}`:\n \n ```handlebars\n {{#link-to 'photoGallery.recent'}}\n Great Hamster Photos\n {{/link-to}}\n ```\n \n will result in\n \n ```html\n <a href=\"/hamster-photos/this-week\" class=\"active\">\n Great Hamster Photos\n </a>\n ```\n \n The CSS class name used for active classes can be customized\n for a single use of `{{link-to}}` by passing an `activeClass`\n option:\n \n ```handlebars\n {{#link-to 'photoGallery.recent' activeClass=\"current-url\"}}\n Great Hamster Photos\n {{/link-to}}\n ```\n \n ```html\n <a href=\"/hamster-photos/this-week\" class=\"current-url\">\n Great Hamster Photos\n </a>\n ```\n \n To override this option for your entire application, see\n \"Overriding Application-wide Defaults\".\n \n ### Keeping a link active for other routes\n \n If you need a link to be 'active' even when it doesn't match\n the current route, you can use the `current-when` argument.\n \n ```handlebars\n {{#link-to 'photoGallery' current-when='photos'}}\n Photo Gallery\n {{/link-to}}\n ```\n \n This may be helpful for keeping links active for:\n \n * non-nested routes that are logically related\n * some secondary menu approaches\n * 'top navigation' with 'sub navigation' scenarios\n \n A link will be active if `current-when` is `true` or the current\n route is the route this link would transition to.\n \n To match multiple routes 'space-separate' the routes:\n \n ```handlebars\n {{#link-to 'gallery' current-when='photos drawings paintings'}}\n Art Gallery\n {{/link-to}}\n ```\n \n ### Supplying a model\n An optional model argument can be used for routes whose\n paths contain dynamic segments. This argument will become\n the model context of the linked route:\n \n ```javascript\n Router.map(function() {\n this.route(\"photoGallery\", {path: \"hamster-photos/:photo_id\"});\n });\n ```\n \n ```handlebars\n {{#link-to 'photoGallery' aPhoto}}\n {{aPhoto.title}}\n {{/link-to}}\n ```\n \n ```html\n <a href=\"/hamster-photos/42\">\n Tomster\n </a>\n ```\n \n ### Supplying multiple models\n For deep-linking to route paths that contain multiple\n dynamic segments, multiple model arguments can be used.\n As the router transitions through the route path, each\n supplied model argument will become the context for the\n route with the dynamic segments:\n \n ```javascript\n Router.map(function() {\n this.route(\"photoGallery\", { path: \"hamster-photos/:photo_id\" }, function() {\n this.route(\"comment\", {path: \"comments/:comment_id\"});\n });\n });\n ```\n This argument will become the model context of the linked route:\n \n ```handlebars\n {{#link-to 'photoGallery.comment' aPhoto comment}}\n {{comment.body}}\n {{/link-to}}\n ```\n \n ```html\n <a href=\"/hamster-photos/42/comments/718\">\n A+++ would snuggle again.\n </a>\n ```\n \n ### Supplying an explicit dynamic segment value\n If you don't have a model object available to pass to `{{link-to}}`,\n an optional string or integer argument can be passed for routes whose\n paths contain dynamic segments. This argument will become the value\n of the dynamic segment:\n \n ```javascript\n Router.map(function() {\n this.route(\"photoGallery\", { path: \"hamster-photos/:photo_id\" });\n });\n ```\n \n ```handlebars\n {{#link-to 'photoGallery' aPhotoId}}\n {{aPhoto.title}}\n {{/link-to}}\n ```\n \n ```html\n <a href=\"/hamster-photos/42\">\n Tomster\n </a>\n ```\n \n When transitioning into the linked route, the `model` hook will\n be triggered with parameters including this passed identifier.\n \n ### Allowing Default Action\n \n By default the `{{link-to}}` component prevents the default browser action\n by calling `preventDefault()` as this sort of action bubbling is normally\n handled internally and we do not want to take the browser to a new URL (for\n example).\n \n If you need to override this behavior specify `preventDefault=false` in\n your template:\n \n ```handlebars\n {{#link-to 'photoGallery' aPhotoId preventDefault=false}}\n {{aPhotoId.title}}\n {{/link-to}}\n ```\n \n ### Overriding attributes\n You can override any given property of the `LinkComponent`\n that is generated by the `{{link-to}}` component by passing\n key/value pairs, like so:\n \n ```handlebars\n {{#link-to aPhoto tagName='li' title='Following this link will change your life' classNames='pic sweet'}}\n Uh-mazing!\n {{/link-to}}\n ```\n \n See [LinkComponent](/api/ember/release/classes/LinkComponent) for a\n complete list of overrideable properties. Be sure to also\n check out inherited properties of `LinkComponent`.\n \n ### Overriding Application-wide Defaults\n \n ``{{link-to}}`` creates an instance of `LinkComponent` for rendering. To\n override options for your entire application, export your customized\n `LinkComponent` from `app/components/link-to.js` with the desired overrides:\n \n ```javascript\n // app/components/link-to.js\n import LinkComponent from '@ember/routing/link-component';\n \n export default LinkComponent.extend({\n activeClass: \"is-active\",\n tagName: 'li'\n })\n ```\n \n It is also possible to override the default event in this manner:\n \n ```javascript\n import LinkCompoennt from '@ember/routing/link-component';\n \n export default LinkComponent.extend({\n eventName: 'customEventName'\n });\n ```\n \n @method link-to\n @for Ember.Templates.helpers\n @param {String} routeName\n @param {Object} [context]*\n @param [options] {Object} Handlebars key/value pairs of options, you can override any property of Ember.LinkComponent\n @return {String} HTML string\n @see {LinkComponent}\n @public\n */\n\n LinkComponent.toString = function () {\n return 'LinkComponent';\n };\n LinkComponent.reopenClass({\n positionalParams: 'params'\n });\n exports.default = LinkComponent;\n});","enifed('ember-glimmer/components/text_area', ['exports', 'ember-views', 'ember-glimmer/component', 'ember-glimmer/templates/empty'], function (exports, _emberViews, _component, _empty) {\n 'use strict';\n\n exports.default = _component.default.extend(_emberViews.TextSupport, {\n classNames: ['ember-text-area'],\n layout: _empty.default,\n tagName: 'textarea',\n attributeBindings: ['rows', 'cols', 'name', 'selectionEnd', 'selectionStart', 'wrap', 'lang', 'dir', 'value'],\n rows: null,\n cols: null\n });\n});","enifed('ember-glimmer/components/text_field', ['exports', 'ember-environment', 'ember-metal', 'ember-views', 'ember-glimmer/component', 'ember-glimmer/templates/empty'], function (exports, _emberEnvironment, _emberMetal, _emberViews, _component, _empty) {\n 'use strict';\n\n var inputTypes = Object.create(null); /**\n @module @ember/component\n */\n\n function canSetTypeOfInput(type) {\n if (type in inputTypes) {\n return inputTypes[type];\n }\n // if running in outside of a browser always return the\n // original type\n if (!_emberEnvironment.environment.hasDOM) {\n inputTypes[type] = type;\n return type;\n }\n var inputTypeTestElement = document.createElement('input');\n try {\n inputTypeTestElement.type = type;\n } catch (e) {\n // ignored\n }\n return inputTypes[type] = inputTypeTestElement.type === type;\n }\n /**\n \n The internal class used to create text inputs when the `{{input}}`\n helper is used with `type` of `text`.\n \n See [Ember.Templates.helpers.input](/api/ember/release/classes/Ember.Templates.helpers/methods/input?anchor=input) for usage details.\n \n ## Layout and LayoutName properties\n \n Because HTML `input` elements are self closing `layout` and `layoutName`\n properties will not be applied.\n \n @class TextField\n @extends Component\n @uses Ember.TextSupport\n @public\n */\n exports.default = _component.default.extend(_emberViews.TextSupport, {\n layout: _empty.default,\n classNames: ['ember-text-field'],\n tagName: 'input',\n attributeBindings: ['accept', 'autocomplete', 'autosave', 'dir', 'formaction', 'formenctype', 'formmethod', 'formnovalidate', 'formtarget', 'height', 'inputmode', 'lang', 'list', 'type', 'max', 'min', 'multiple', 'name', 'pattern', 'size', 'step', 'value', 'width'],\n /**\n The `value` attribute of the input element. As the user inputs text, this\n property is updated live.\n @property value\n @type String\n @default \"\"\n @public\n */\n value: '',\n /**\n The `type` attribute of the input element.\n @property type\n @type String\n @default \"text\"\n @public\n */\n type: (0, _emberMetal.computed)({\n get: function () {\n return 'text';\n },\n set: function (_key, value) {\n var type = 'text';\n if (canSetTypeOfInput(value)) {\n type = value;\n }\n return type;\n }\n }),\n /**\n The `size` of the text field in characters.\n @property size\n @type String\n @default null\n @public\n */\n size: null,\n /**\n The `pattern` attribute of input element.\n @property pattern\n @type String\n @default null\n @public\n */\n pattern: null,\n /**\n The `min` attribute of input element used with `type=\"number\"` or `type=\"range\"`.\n @property min\n @type String\n @default null\n @since 1.4.0\n @public\n */\n min: null,\n /**\n The `max` attribute of input element used with `type=\"number\"` or `type=\"range\"`.\n @property max\n @type String\n @default null\n @since 1.4.0\n @public\n */\n max: null\n });\n});","enifed('ember-glimmer/dom', ['exports', '@glimmer/runtime', '@glimmer/node'], function (exports, _runtime, _node) {\n 'use strict';\n\n Object.defineProperty(exports, 'DOMChanges', {\n enumerable: true,\n get: function () {\n return _runtime.DOMChanges;\n }\n });\n Object.defineProperty(exports, 'DOMTreeConstruction', {\n enumerable: true,\n get: function () {\n return _runtime.DOMTreeConstruction;\n }\n });\n Object.defineProperty(exports, 'NodeDOMTreeConstruction', {\n enumerable: true,\n get: function () {\n return _node.NodeDOMTreeConstruction;\n }\n });\n});","enifed('ember-glimmer/environment', ['exports', 'ember-babel', '@glimmer/runtime', 'ember-debug', 'ember-metal', 'ember-utils', 'ember-views', 'ember-glimmer/component-managers/curly', 'ember-glimmer/component-managers/template-only', 'ember-glimmer/syntax', 'ember-glimmer/utils/debug-stack', 'ember-glimmer/utils/iterable', 'ember-glimmer/utils/references', 'ember-glimmer/helpers/-class', 'ember-glimmer/helpers/-html-safe', 'ember-glimmer/helpers/-input-type', 'ember-glimmer/helpers/-normalize-class', 'ember-glimmer/helpers/action', 'ember-glimmer/helpers/component', 'ember-glimmer/helpers/concat', 'ember-glimmer/helpers/each-in', 'ember-glimmer/helpers/get', 'ember-glimmer/helpers/hash', 'ember-glimmer/helpers/if-unless', 'ember-glimmer/helpers/log', 'ember-glimmer/helpers/mut', 'ember-glimmer/helpers/query-param', 'ember-glimmer/helpers/readonly', 'ember-glimmer/helpers/unbound', 'ember-glimmer/modifiers/action', 'ember-glimmer/protocol-for-url', 'ember/features'], function (exports, _emberBabel, _runtime, _emberDebug, _emberMetal, _emberUtils, _emberViews, _curly, _templateOnly, _syntax, _debugStack, _iterable, _references, _class, _htmlSafe, _inputType, _normalizeClass, _action, _component, _concat, _eachIn, _get, _hash, _ifUnless, _log, _mut, _queryParam, _readonly, _unbound, _action2, _protocolForUrl, _features) {\n 'use strict';\n\n function instrumentationPayload(name) {\n return { object: 'component:' + name };\n }\n function isTemplateFactory(template) {\n return typeof template.create === 'function';\n }\n\n var Environment = function (_GlimmerEnvironment) {\n (0, _emberBabel.inherits)(Environment, _GlimmerEnvironment);\n\n Environment.create = function create(options) {\n return new this(options);\n };\n\n function Environment(injections) {\n (0, _emberBabel.classCallCheck)(this, Environment);\n\n var _this = (0, _emberBabel.possibleConstructorReturn)(this, _GlimmerEnvironment.call(this, injections));\n\n _this.owner = injections[_emberUtils.OWNER];\n _this.isInteractive = _this.owner.lookup('-environment:main').isInteractive;\n // can be removed once https://github.com/tildeio/glimmer/pull/305 lands\n _this.destroyedComponents = [];\n (0, _protocolForUrl.default)(_this);\n _this._definitionCache = new _emberMetal.Cache(2000, function (_ref) {\n var name = _ref.name,\n source = _ref.source,\n owner = _ref.owner;\n\n var _lookupComponent = (0, _emberViews.lookupComponent)(owner, name, { source: source }),\n componentFactory = _lookupComponent.component,\n layout = _lookupComponent.layout;\n\n var customManager = void 0;\n if (_features.EMBER_GLIMMER_TEMPLATE_ONLY_COMPONENTS && layout && !componentFactory) {\n return new _templateOnly.TemplateOnlyComponentDefinition(name, layout);\n } else if (componentFactory || layout) {\n if (_features.GLIMMER_CUSTOM_COMPONENT_MANAGER) {\n var managerId = layout && layout.meta.managerId;\n if (managerId) {\n customManager = owner.factoryFor('component-manager:' + managerId).class;\n }\n }\n return new _curly.CurlyComponentDefinition(name, componentFactory, layout, undefined, customManager);\n }\n return undefined;\n }, function (_ref2) {\n var name = _ref2.name,\n source = _ref2.source,\n owner = _ref2.owner;\n\n var expandedName = source && _this._resolveLocalLookupName(name, source, owner) || name;\n var ownerGuid = (0, _emberUtils.guidFor)(owner);\n return ownerGuid + '|' + expandedName;\n });\n _this._templateCache = new _emberMetal.Cache(1000, function (_ref3) {\n var Template = _ref3.Template,\n owner = _ref3.owner;\n\n if (isTemplateFactory(Template)) {\n var _Template$create;\n\n // we received a factory\n return Template.create((_Template$create = { env: _this }, _Template$create[_emberUtils.OWNER] = owner, _Template$create));\n } else {\n // we were provided an instance already\n return Template;\n }\n }, function (_ref4) {\n var Template = _ref4.Template,\n owner = _ref4.owner;\n return (0, _emberUtils.guidFor)(owner) + '|' + Template.id;\n });\n _this._compilerCache = new _emberMetal.Cache(10, function (Compiler) {\n return new _emberMetal.Cache(2000, function (template) {\n var compilable = new Compiler(template);\n return (0, _runtime.compileLayout)(compilable, _this);\n }, function (template) {\n var owner = template.meta.owner;\n return (0, _emberUtils.guidFor)(owner) + '|' + template.id;\n });\n }, function (Compiler) {\n return Compiler.id;\n });\n _this.builtInModifiers = {\n action: new _action2.default()\n };\n _this.builtInHelpers = {\n 'if': _ifUnless.inlineIf,\n action: _action.default,\n concat: _concat.default,\n get: _get.default,\n hash: _hash.default,\n log: _log.default,\n mut: _mut.default,\n 'query-params': _queryParam.default,\n readonly: _readonly.default,\n unbound: _unbound.default,\n 'unless': _ifUnless.inlineUnless,\n '-class': _class.default,\n '-each-in': _eachIn.default,\n '-input-type': _inputType.default,\n '-normalize-class': _normalizeClass.default,\n '-html-safe': _htmlSafe.default,\n '-get-dynamic-var': _runtime.getDynamicVar\n };\n if (true) {\n _this.debugStack = new _debugStack.default();\n }\n return _this;\n }\n // this gets clobbered by installPlatformSpecificProtocolForURL\n // it really should just delegate to a platform specific injection\n\n\n Environment.prototype.protocolForURL = function protocolForURL(s) {\n return s;\n };\n\n Environment.prototype._resolveLocalLookupName = function _resolveLocalLookupName(name, source, owner) {\n return _features.EMBER_MODULE_UNIFICATION ? source + ':' + name : owner._resolveLocalLookupName(name, source);\n };\n\n Environment.prototype.macros = function macros() {\n var macros = _GlimmerEnvironment.prototype.macros.call(this);\n (0, _syntax.populateMacros)(macros.blocks, macros.inlines);\n return macros;\n };\n\n Environment.prototype.hasComponentDefinition = function hasComponentDefinition() {\n return false;\n };\n\n Environment.prototype.getComponentDefinition = function getComponentDefinition(name, _ref5) {\n var owner = _ref5.owner,\n moduleName = _ref5.moduleName;\n\n var finalizer = (0, _emberMetal._instrumentStart)('render.getComponentDefinition', instrumentationPayload, name);\n var source = moduleName && 'template:' + moduleName;\n var definition = this._definitionCache.get({ name: name, source: source, owner: owner });\n finalizer();\n // TODO the glimmer-vm wants this to always have a def\n // but internally we need it to sometimes be undefined\n return definition;\n };\n\n Environment.prototype.getTemplate = function getTemplate(Template, owner) {\n return this._templateCache.get({ Template: Template, owner: owner });\n };\n\n Environment.prototype.getCompiledBlock = function getCompiledBlock(Compiler, template) {\n var compilerCache = this._compilerCache.get(Compiler);\n return compilerCache.get(template);\n };\n\n Environment.prototype.hasPartial = function hasPartial(name, meta) {\n return (0, _emberViews.hasPartial)(name, meta.owner);\n };\n\n Environment.prototype.lookupPartial = function lookupPartial(name, meta) {\n var partial = {\n name: name,\n template: (0, _emberViews.lookupPartial)(name, meta.owner)\n };\n if (partial.template) {\n return partial;\n } else {\n throw new Error(name + ' is not a partial');\n }\n };\n\n Environment.prototype.hasHelper = function hasHelper(name, _ref6) {\n var owner = _ref6.owner,\n moduleName = _ref6.moduleName;\n\n if (name === 'component' || this.builtInHelpers[name]) {\n return true;\n }\n var options = { source: 'template:' + moduleName };\n return owner.hasRegistration('helper:' + name, options) || owner.hasRegistration('helper:' + name);\n };\n\n Environment.prototype.lookupHelper = function lookupHelper(name, meta) {\n if (name === 'component') {\n return function (vm, args) {\n return (0, _component.default)(vm, args, meta);\n };\n }\n var owner = meta.owner,\n moduleName = meta.moduleName;\n\n var helper = this.builtInHelpers[name];\n if (helper) {\n return helper;\n }\n var options = moduleName && { source: 'template:' + moduleName } || {};\n var helperFactory = owner.factoryFor('helper:' + name, options) || owner.factoryFor('helper:' + name);\n // TODO: try to unify this into a consistent protocol to avoid wasteful closure allocations\n var HelperReference = void 0;\n if (helperFactory.class.isSimpleHelperFactory) {\n HelperReference = _references.SimpleHelperReference;\n } else if (helperFactory.class.isHelperFactory) {\n HelperReference = _references.ClassBasedHelperReference;\n } else {\n throw new Error(name + ' is not a helper');\n }\n return function (vm, args) {\n return HelperReference.create(helperFactory, vm, args.capture());\n };\n };\n\n Environment.prototype.hasModifier = function hasModifier(name) {\n return !!this.builtInModifiers[name];\n };\n\n Environment.prototype.lookupModifier = function lookupModifier(name) {\n var modifier = this.builtInModifiers[name];\n if (modifier) {\n return modifier;\n } else {\n throw new Error(name + ' is not a modifier');\n }\n };\n\n Environment.prototype.toConditionalReference = function toConditionalReference(reference) {\n return _references.ConditionalReference.create(reference);\n };\n\n Environment.prototype.iterableFor = function iterableFor(ref, key) {\n return (0, _iterable.default)(ref, key);\n };\n\n Environment.prototype.scheduleInstallModifier = function scheduleInstallModifier(modifier, manager) {\n if (this.isInteractive) {\n _GlimmerEnvironment.prototype.scheduleInstallModifier.call(this, modifier, manager);\n }\n };\n\n Environment.prototype.scheduleUpdateModifier = function scheduleUpdateModifier(modifier, manager) {\n if (this.isInteractive) {\n _GlimmerEnvironment.prototype.scheduleUpdateModifier.call(this, modifier, manager);\n }\n };\n\n Environment.prototype.didDestroy = function didDestroy(destroyable) {\n destroyable.destroy();\n };\n\n Environment.prototype.begin = function begin() {\n this.inTransaction = true;\n _GlimmerEnvironment.prototype.begin.call(this);\n };\n\n Environment.prototype.commit = function commit() {\n var destroyedComponents = this.destroyedComponents;\n this.destroyedComponents = [];\n // components queued for destruction must be destroyed before firing\n // `didCreate` to prevent errors when removing and adding a component\n // with the same name (would throw an error when added to view registry)\n for (var i = 0; i < destroyedComponents.length; i++) {\n destroyedComponents[i].destroy();\n }\n _GlimmerEnvironment.prototype.commit.call(this);\n this.inTransaction = false;\n };\n\n return Environment;\n }(_runtime.Environment);\n\n exports.default = Environment;\n\n if (true) {\n var StyleAttributeManager = function (_AttributeManager) {\n (0, _emberBabel.inherits)(StyleAttributeManager, _AttributeManager);\n\n function StyleAttributeManager() {\n (0, _emberBabel.classCallCheck)(this, StyleAttributeManager);\n return (0, _emberBabel.possibleConstructorReturn)(this, _AttributeManager.apply(this, arguments));\n }\n\n StyleAttributeManager.prototype.setAttribute = function setAttribute(dom, element, value) {\n (true && (0, _emberDebug.warn)((0, _emberViews.constructStyleDeprecationMessage)(value), function () {\n if (value === null || value === undefined || (0, _runtime.isSafeString)(value)) {\n return true;\n }\n return false;\n }(), { id: 'ember-htmlbars.style-xss-warning' }));\n\n _AttributeManager.prototype.setAttribute.call(this, dom, element, value);\n };\n\n StyleAttributeManager.prototype.updateAttribute = function updateAttribute(dom, element, value) {\n (true && (0, _emberDebug.warn)((0, _emberViews.constructStyleDeprecationMessage)(value), function () {\n if (value === null || value === undefined || (0, _runtime.isSafeString)(value)) {\n return true;\n }\n return false;\n }(), { id: 'ember-htmlbars.style-xss-warning' }));\n\n _AttributeManager.prototype.updateAttribute.call(this, dom, element, value);\n };\n\n return StyleAttributeManager;\n }(_runtime.AttributeManager);\n\n var STYLE_ATTRIBUTE_MANANGER = new StyleAttributeManager('style');\n Environment.prototype.attributeFor = function (element, attribute, isTrusting) {\n if (attribute === 'style' && !isTrusting) {\n return STYLE_ATTRIBUTE_MANANGER;\n }\n return _runtime.Environment.prototype.attributeFor.call(this, element, attribute, isTrusting);\n };\n }\n});","enifed('ember-glimmer/helper', ['exports', 'ember-babel', '@glimmer/reference', 'ember-runtime', 'ember-utils'], function (exports, _emberBabel, _reference, _emberRuntime, _emberUtils) {\n 'use strict';\n\n exports.SimpleHelper = exports.RECOMPUTE_TAG = undefined;\n exports.helper = helper;\n var RECOMPUTE_TAG = exports.RECOMPUTE_TAG = (0, _emberUtils.symbol)('RECOMPUTE_TAG');\n /**\n Ember Helpers are functions that can compute values, and are used in templates.\n For example, this code calls a helper named `format-currency`:\n \n ```handlebars\n <div>{{format-currency cents currency=\"$\"}}</div>\n ```\n \n Additionally a helper can be called as a nested helper (sometimes called a\n subexpression). In this example, the computed value of a helper is passed\n to a component named `show-money`:\n \n ```handlebars\n {{show-money amount=(format-currency cents currency=\"$\")}}\n ```\n \n Helpers defined using a class must provide a `compute` function. For example:\n \n ```app/helpers/format-currency.js\n import Helper from '@ember/component/helper';\n \n export default Helper.extend({\n compute(params, hash) {\n let cents = params[0];\n let currency = hash.currency;\n return `${currency}${cents * 0.01}`;\n }\n });\n ```\n \n Each time the input to a helper changes, the `compute` function will be\n called again.\n \n As instances, these helpers also have access to the container an will accept\n injected dependencies.\n \n Additionally, class helpers can call `recompute` to force a new computation.\n \n @class Helper\n @public\n @since 1.13.0\n */\n /**\n @module @ember/component\n */\n var Helper = _emberRuntime.FrameworkObject.extend({\n isHelperInstance: true,\n init: function () {\n this._super.apply(this, arguments);\n this[RECOMPUTE_TAG] = new _reference.DirtyableTag();\n },\n recompute: function () {\n this[RECOMPUTE_TAG].dirty();\n }\n });\n Helper.reopenClass({\n isHelperFactory: true\n });\n\n var SimpleHelper = exports.SimpleHelper = function () {\n function SimpleHelper(compute) {\n (0, _emberBabel.classCallCheck)(this, SimpleHelper);\n\n this.compute = compute;\n this.isHelperFactory = true;\n this.isHelperInstance = true;\n this.isSimpleHelperFactory = true;\n }\n\n SimpleHelper.prototype.create = function create() {\n return this;\n };\n\n return SimpleHelper;\n }();\n\n /**\n In many cases, the ceremony of a full `Helper` class is not required.\n The `helper` method create pure-function helpers without instances. For\n example:\n \n ```app/helpers/format-currency.js\n import { helper } from '@ember/component/helper';\n \n export default helper(function(params, hash) {\n let cents = params[0];\n let currency = hash.currency;\n return `${currency}${cents * 0.01}`;\n });\n ```\n \n @static\n @param {Function} helper The helper function\n @method helper\n @for @ember/component/helper\n @public\n @since 1.13.0\n */\n function helper(helperFn) {\n return new SimpleHelper(helperFn);\n }\n exports.default = Helper;\n});","enifed('ember-glimmer/helpers/-class', ['exports', 'ember-runtime', 'ember-glimmer/utils/references'], function (exports, _emberRuntime, _references) {\n 'use strict';\n\n exports.default = function (_vm, args) {\n return new _references.InternalHelperReference(classHelper, args.capture());\n };\n\n function classHelper(_ref) {\n var positional = _ref.positional;\n\n var path = positional.at(0);\n var args = positional.length;\n var value = path.value();\n if (value === true) {\n if (args > 1) {\n return _emberRuntime.String.dasherize(positional.at(1).value());\n }\n return null;\n }\n if (value === false) {\n if (args > 2) {\n return _emberRuntime.String.dasherize(positional.at(2).value());\n }\n return null;\n }\n return value;\n }\n});","enifed('ember-glimmer/helpers/-html-safe', ['exports', 'ember-glimmer/utils/references', 'ember-glimmer/utils/string'], function (exports, _references, _string) {\n 'use strict';\n\n exports.default = function (_vm, args) {\n return new _references.InternalHelperReference(htmlSafe, args.capture());\n };\n\n function htmlSafe(_ref) {\n var positional = _ref.positional;\n\n var path = positional.at(0);\n return new _string.SafeString(path.value());\n }\n});","enifed('ember-glimmer/helpers/-input-type', ['exports', 'ember-glimmer/utils/references'], function (exports, _references) {\n 'use strict';\n\n exports.default = function (_vm, args) {\n return new _references.InternalHelperReference(inputTypeHelper, args.capture());\n };\n\n function inputTypeHelper(_ref) {\n var positional = _ref.positional;\n\n var type = positional.at(0).value();\n if (type === 'checkbox') {\n return '-checkbox';\n }\n return '-text-field';\n }\n});","enifed('ember-glimmer/helpers/-normalize-class', ['exports', 'ember-runtime', 'ember-glimmer/utils/references'], function (exports, _emberRuntime, _references) {\n 'use strict';\n\n exports.default = function (_vm, args) {\n return new _references.InternalHelperReference(normalizeClass, args.capture());\n };\n\n function normalizeClass(_ref) {\n var positional = _ref.positional;\n\n var classNameParts = positional.at(0).value().split('.');\n var className = classNameParts[classNameParts.length - 1];\n var value = positional.at(1).value();\n if (value === true) {\n return _emberRuntime.String.dasherize(className);\n } else if (!value && value !== 0) {\n return '';\n } else {\n return String(value);\n }\n }\n});","enifed('ember-glimmer/helpers/action', ['exports', '@glimmer/reference', 'ember-debug', 'ember-metal', 'ember-utils', 'ember-glimmer/utils/references'], function (exports, _reference, _emberDebug, _emberMetal, _emberUtils, _references) {\n 'use strict';\n\n exports.ACTION = exports.INVOKE = undefined;\n\n exports.default = function (_vm, args) {\n var named = args.named,\n positional = args.positional;\n\n var capturedArgs = positional.capture();\n // The first two argument slots are reserved.\n // pos[0] is the context (or `this`)\n // pos[1] is the action name or function\n // Anything else is an action argument.\n\n var _capturedArgs$referen = capturedArgs.references,\n context = _capturedArgs$referen[0],\n action = _capturedArgs$referen[1],\n restArgs = _capturedArgs$referen.slice(2);\n // TODO: Is there a better way of doing this?\n\n\n var debugKey = action._propertyKey;\n var target = named.has('target') ? named.get('target') : context;\n var processArgs = makeArgsProcessor(named.has('value') && named.get('value'), restArgs);\n var fn = void 0;\n if (typeof action[INVOKE] === 'function') {\n fn = makeClosureAction(action, action, action[INVOKE], processArgs, debugKey);\n } else if ((0, _reference.isConst)(target) && (0, _reference.isConst)(action)) {\n fn = makeClosureAction(context.value(), target.value(), action.value(), processArgs, debugKey);\n } else {\n fn = makeDynamicClosureAction(context.value(), target, action, processArgs, debugKey);\n }\n fn[ACTION] = true;\n return new _references.UnboundReference(fn);\n };\n\n var INVOKE = exports.INVOKE = (0, _emberUtils.symbol)('INVOKE'); /**\n @module ember\n */\n var ACTION = exports.ACTION = (0, _emberUtils.symbol)('ACTION');\n /**\n The `{{action}}` helper provides a way to pass triggers for behavior (usually\n just a function) between components, and into components from controllers.\n \n ### Passing functions with the action helper\n \n There are three contexts an action helper can be used in. The first two\n contexts to discuss are attribute context, and Handlebars value context.\n \n ```handlebars\n {{! An example of attribute context }}\n <div onclick={{action \"save\"}}></div>\n {{! Examples of Handlebars value context }}\n {{input on-input=(action \"save\")}}\n {{yield (action \"refreshData\") andAnotherParam}}\n ```\n \n In these contexts,\n the helper is called a \"closure action\" helper. Its behavior is simple:\n If passed a function name, read that function off the `actions` property\n of the current context. Once that function is read (or if a function was\n passed), create a closure over that function and any arguments.\n The resulting value of an action helper used this way is simply a function.\n \n For example, in the attribute context:\n \n ```handlebars\n {{! An example of attribute context }}\n <div onclick={{action \"save\"}}></div>\n ```\n \n The resulting template render logic would be:\n \n ```js\n var div = document.createElement('div');\n var actionFunction = (function(context){\n return function() {\n return context.actions.save.apply(context, arguments);\n };\n })(context);\n div.onclick = actionFunction;\n ```\n \n Thus when the div is clicked, the action on that context is called.\n Because the `actionFunction` is just a function, closure actions can be\n passed between components and still execute in the correct context.\n \n Here is an example action handler on a component:\n \n ```app/components/my-component.js\n import Component from '@ember/component';\n \n export default Component.extend({\n actions: {\n save() {\n this.get('model').save();\n }\n }\n });\n ```\n \n Actions are always looked up on the `actions` property of the current context.\n This avoids collisions in the naming of common actions, such as `destroy`.\n Two options can be passed to the `action` helper when it is used in this way.\n \n * `target=someProperty` will look to `someProperty` instead of the current\n context for the `actions` hash. This can be useful when targeting a\n service for actions.\n * `value=\"target.value\"` will read the path `target.value` off the first\n argument to the action when it is called and rewrite the first argument\n to be that value. This is useful when attaching actions to event listeners.\n \n ### Invoking an action\n \n Closure actions curry both their scope and any arguments. When invoked, any\n additional arguments are added to the already curried list.\n Actions should be invoked using the [sendAction](/api/ember/release/classes/Component/methods/sendAction?anchor=sendAction)\n method. The first argument to `sendAction` is the action to be called, and\n additional arguments are passed to the action function. This has interesting\n properties combined with currying of arguments. For example:\n \n ```app/components/my-component.js\n import Component from '@ember/component';\n \n export default Component.extend({\n actions: {\n // Usage {{input on-input=(action (action 'setName' model) value=\"target.value\")}}\n setName(model, name) {\n model.set('name', name);\n }\n }\n });\n ```\n \n The first argument (`model`) was curried over, and the run-time argument (`event`)\n becomes a second argument. Action calls can be nested this way because each simply\n returns a function. Any function can be passed to the `{{action}}` helper, including\n other actions.\n \n Actions invoked with `sendAction` have the same currying behavior as demonstrated\n with `on-input` above. For example:\n \n ```app/components/my-input.js\n import Component from '@ember/component';\n \n export default Component.extend({\n actions: {\n setName(model, name) {\n model.set('name', name);\n }\n }\n });\n ```\n \n ```handlebars\n {{my-input submit=(action 'setName' model)}}\n ```\n \n ```app/components/my-component.js\n import Component from '@ember/component';\n \n export default Component.extend({\n click() {\n // Note that model is not passed, it was curried in the template\n this.sendAction('submit', 'bob');\n }\n });\n ```\n \n ### Attaching actions to DOM elements\n \n The third context of the `{{action}}` helper can be called \"element space\".\n For example:\n \n ```handlebars\n {{! An example of element space }}\n <div {{action \"save\"}}></div>\n ```\n \n Used this way, the `{{action}}` helper provides a useful shortcut for\n registering an HTML element in a template for a single DOM event and\n forwarding that interaction to the template's context (controller or component).\n If the context of a template is a controller, actions used this way will\n bubble to routes when the controller does not implement the specified action.\n Once an action hits a route, it will bubble through the route hierarchy.\n \n ### Event Propagation\n \n `{{action}}` helpers called in element space can control event bubbling. Note\n that the closure style actions cannot.\n \n Events triggered through the action helper will automatically have\n `.preventDefault()` called on them. You do not need to do so in your event\n handlers. If you need to allow event propagation (to handle file inputs for\n example) you can supply the `preventDefault=false` option to the `{{action}}` helper:\n \n ```handlebars\n <div {{action \"sayHello\" preventDefault=false}}>\n <input type=\"file\" />\n <input type=\"checkbox\" />\n </div>\n ```\n \n To disable bubbling, pass `bubbles=false` to the helper:\n \n ```handlebars\n <button {{action 'edit' post bubbles=false}}>Edit</button>\n ```\n \n To disable bubbling with closure style actions you must create your own\n wrapper helper that makes use of `event.stopPropagation()`:\n \n ```handlebars\n <div onclick={{disable-bubbling (action \"sayHello\")}}>Hello</div>\n ```\n \n ```app/helpers/disable-bubbling.js\n import { helper } from '@ember/component/helper';\n \n export function disableBubbling([action]) {\n return function(event) {\n event.stopPropagation();\n return action(event);\n };\n }\n export default helper(disableBubbling);\n ```\n \n If you need the default handler to trigger you should either register your\n own event handler, or use event methods on your view class. See\n [\"Responding to Browser Events\"](/api/ember/release/classes/Component)\n in the documentation for `Component` for more information.\n \n ### Specifying DOM event type\n \n `{{action}}` helpers called in element space can specify an event type.\n By default the `{{action}}` helper registers for DOM `click` events. You can\n supply an `on` option to the helper to specify a different DOM event name:\n \n ```handlebars\n <div {{action \"anActionName\" on=\"doubleClick\"}}>\n click me\n </div>\n ```\n \n See [\"Event Names\"](/api/ember/release/classes/Component) for a list of\n acceptable DOM event names.\n \n ### Specifying whitelisted modifier keys\n \n `{{action}}` helpers called in element space can specify modifier keys.\n By default the `{{action}}` helper will ignore click events with pressed modifier\n keys. You can supply an `allowedKeys` option to specify which keys should not be ignored.\n \n ```handlebars\n <div {{action \"anActionName\" allowedKeys=\"alt\"}}>\n click me\n </div>\n ```\n \n This way the action will fire when clicking with the alt key pressed down.\n Alternatively, supply \"any\" to the `allowedKeys` option to accept any combination of modifier keys.\n \n ```handlebars\n <div {{action \"anActionName\" allowedKeys=\"any\"}}>\n click me with any key pressed\n </div>\n ```\n \n ### Specifying a Target\n \n A `target` option can be provided to the helper to change\n which object will receive the method call. This option must be a path\n to an object, accessible in the current context:\n \n ```app/templates/application.hbs\n <div {{action \"anActionName\" target=someService}}>\n click me\n </div>\n ```\n \n ```app/controllers/application.js\n import Controller from '@ember/controller';\n import { inject as service } from '@ember/service';\n \n export default Controller.extend({\n someService: service()\n });\n ```\n \n @method action\n @for Ember.Templates.helpers\n @public\n */\n\n function NOOP(args) {\n return args;\n }\n function makeArgsProcessor(valuePathRef, actionArgsRef) {\n var mergeArgs = void 0;\n if (actionArgsRef.length > 0) {\n mergeArgs = function (args) {\n return actionArgsRef.map(function (ref) {\n return ref.value();\n }).concat(args);\n };\n }\n var readValue = void 0;\n if (valuePathRef) {\n readValue = function (args) {\n var valuePath = valuePathRef.value();\n if (valuePath && args.length > 0) {\n args[0] = (0, _emberMetal.get)(args[0], valuePath);\n }\n return args;\n };\n }\n if (mergeArgs && readValue) {\n return function (args) {\n return readValue(mergeArgs(args));\n };\n } else {\n return mergeArgs || readValue || NOOP;\n }\n }\n function makeDynamicClosureAction(context, targetRef, actionRef, processArgs, debugKey) {\n // We don't allow undefined/null values, so this creates a throw-away action to trigger the assertions\n if (true) {\n makeClosureAction(context, targetRef.value(), actionRef.value(), processArgs, debugKey);\n }\n return function () {\n return makeClosureAction(context, targetRef.value(), actionRef.value(), processArgs, debugKey).apply(undefined, arguments);\n };\n }\n function makeClosureAction(context, target, action, processArgs, debugKey) {\n var self = void 0;\n var fn = void 0;\n (true && !(!(0, _emberMetal.isNone)(action)) && (0, _emberDebug.assert)('Action passed is null or undefined in (action) from ' + target + '.', !(0, _emberMetal.isNone)(action)));\n\n if (typeof action[INVOKE] === 'function') {\n self = action;\n fn = action[INVOKE];\n } else {\n var typeofAction = typeof action;\n if (typeofAction === 'string') {\n self = target;\n fn = target.actions && target.actions[action];\n (true && !(fn) && (0, _emberDebug.assert)('An action named \\'' + action + '\\' was not found in ' + target, fn));\n } else if (typeofAction === 'function') {\n self = context;\n fn = action;\n } else {\n (true && !(false) && (0, _emberDebug.assert)('An action could not be made for `' + (debugKey || action) + '` in ' + target + '. Please confirm that you are using either a quoted action name (i.e. `(action \\'' + (debugKey || 'myAction') + '\\')`) or a function available in ' + target + '.', false));\n }\n }\n return function () {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n var payload = { target: self, args: args, label: '@glimmer/closure-action' };\n return (0, _emberMetal.flaggedInstrument)('interaction.ember-action', payload, function () {\n return _emberMetal.run.join.apply(_emberMetal.run, [self, fn].concat(processArgs(args)));\n });\n };\n }\n});","enifed('ember-glimmer/helpers/component', ['exports', 'ember-babel', '@glimmer/runtime', 'ember-debug', 'ember-utils', 'ember-glimmer/component-managers/curly', 'ember-glimmer/utils/references'], function (exports, _emberBabel, _runtime, _emberDebug, _emberUtils, _curly, _references) {\n 'use strict';\n\n exports.ClosureComponentReference = undefined;\n\n exports.default = function (vm, args, meta) {\n return ClosureComponentReference.create(args.capture(), meta, vm.env);\n };\n\n var ClosureComponentReference = exports.ClosureComponentReference = function (_CachedReference) {\n (0, _emberBabel.inherits)(ClosureComponentReference, _CachedReference);\n\n ClosureComponentReference.create = function create(args, meta, env) {\n return new ClosureComponentReference(args, meta, env);\n };\n\n function ClosureComponentReference(args, meta, env) {\n (0, _emberBabel.classCallCheck)(this, ClosureComponentReference);\n\n var _this = (0, _emberBabel.possibleConstructorReturn)(this, _CachedReference.call(this));\n\n var firstArg = args.positional.at(0);\n _this.defRef = firstArg;\n _this.tag = firstArg.tag;\n _this.args = args;\n _this.meta = meta;\n _this.env = env;\n _this.lastDefinition = undefined;\n _this.lastName = undefined;\n return _this;\n }\n\n ClosureComponentReference.prototype.compute = function compute() {\n // TODO: Figure out how to extract this because it's nearly identical to\n // DynamicComponentReference::compute(). The only differences besides\n // currying are in the assertion messages.\n var args = this.args,\n defRef = this.defRef,\n env = this.env,\n meta = this.meta,\n lastDefinition = this.lastDefinition,\n lastName = this.lastName;\n\n var nameOrDef = defRef.value();\n var definition = void 0;\n if (nameOrDef && nameOrDef === lastName) {\n return lastDefinition;\n }\n this.lastName = nameOrDef;\n if (typeof nameOrDef === 'string') {\n // tslint:disable-next-line:max-line-length\n (true && !(nameOrDef !== 'input') && (0, _emberDebug.assert)('You cannot use the input helper as a contextual helper. Please extend TextField or Checkbox to use it as a contextual component.', nameOrDef !== 'input'));\n // tslint:disable-next-line:max-line-length\n\n (true && !(nameOrDef !== 'textarea') && (0, _emberDebug.assert)('You cannot use the textarea helper as a contextual helper. Please extend TextArea to use it as a contextual component.', nameOrDef !== 'textarea'));\n\n definition = env.getComponentDefinition(nameOrDef, meta);\n // tslint:disable-next-line:max-line-length\n (true && !(!!definition) && (0, _emberDebug.assert)('The component helper cannot be used without a valid component name. You used \"' + nameOrDef + '\" via (component \"' + nameOrDef + '\")', !!definition));\n } else if ((0, _runtime.isComponentDefinition)(nameOrDef)) {\n definition = nameOrDef;\n } else {\n (true && !(nameOrDef) && (0, _emberDebug.assert)('You cannot create a component from ' + nameOrDef + ' using the {{component}} helper', nameOrDef));\n\n return null;\n }\n var newDef = createCurriedDefinition(definition, args);\n this.lastDefinition = newDef;\n return newDef;\n };\n\n return ClosureComponentReference;\n }(_references.CachedReference);\n\n function createCurriedDefinition(definition, args) {\n var curriedArgs = curryArgs(definition, args);\n return new _curly.CurlyComponentDefinition(definition.name, definition.ComponentClass, definition.template, curriedArgs);\n }\n function curryArgs(definition, newArgs) {\n var args = definition.args,\n ComponentClass = definition.ComponentClass;\n\n var positionalParams = ComponentClass.class.positionalParams;\n // The args being passed in are from the (component ...) invocation,\n // so the first positional argument is actually the name or component\n // definition. It needs to be dropped in order for any actual positional\n // args to coincide with the ComponentClass's positionParams.\n // For \"normal\" curly components this slicing is done at the syntax layer,\n // but we don't have that luxury here.\n\n var _newArgs$positional$r = newArgs.positional.references,\n slicedPositionalArgs = _newArgs$positional$r.slice(1);\n\n if (positionalParams && slicedPositionalArgs.length) {\n (0, _curly.validatePositionalParameters)(newArgs.named, slicedPositionalArgs, positionalParams);\n }\n var isRest = typeof positionalParams === 'string';\n // For non-rest position params, we need to perform the position -> name mapping\n // at each layer to avoid a collision later when the args are used to construct\n // the component instance (inside of processArgs(), inside of create()).\n var positionalToNamedParams = {};\n if (!isRest && positionalParams.length > 0) {\n var limit = Math.min(positionalParams.length, slicedPositionalArgs.length);\n for (var i = 0; i < limit; i++) {\n var name = positionalParams[i];\n positionalToNamedParams[name] = slicedPositionalArgs[i];\n }\n slicedPositionalArgs.length = 0; // Throw them away since you're merged in.\n }\n // args (aka 'oldArgs') may be undefined or simply be empty args, so\n // we need to fall back to an empty array or object.\n var oldNamed = args && args.named || {};\n var oldPositional = args && args.positional || [];\n // Merge positional arrays\n var positional = new Array(Math.max(oldPositional.length, slicedPositionalArgs.length));\n positional.splice.apply(positional, [0, oldPositional.length].concat(oldPositional));\n positional.splice.apply(positional, [0, slicedPositionalArgs.length].concat(slicedPositionalArgs));\n // Merge named maps\n var named = (0, _emberUtils.assign)({}, oldNamed, positionalToNamedParams, newArgs.named.map);\n return { positional: positional, named: named };\n }\n});","enifed('ember-glimmer/helpers/concat', ['exports', '@glimmer/runtime', 'ember-glimmer/utils/references'], function (exports, _runtime, _references) {\n 'use strict';\n\n exports.default = function (_vm, args) {\n return new _references.InternalHelperReference(concat, args.capture());\n };\n\n /**\n @module ember\n */\n /**\n Concatenates the given arguments into a string.\n \n Example:\n \n ```handlebars\n {{some-component name=(concat firstName \" \" lastName)}}\n \n {{! would pass name=\"<first name value> <last name value>\" to the component}}\n ```\n \n @public\n @method concat\n @for Ember.Templates.helpers\n @since 1.13.0\n */\n function concat(_ref) {\n var positional = _ref.positional;\n\n return positional.value().map(_runtime.normalizeTextValue).join('');\n }\n});","enifed('ember-glimmer/helpers/each-in', ['exports', 'ember-utils'], function (exports, _emberUtils) {\n 'use strict';\n\n exports.isEachIn = isEachIn;\n\n exports.default = function (_vm, args) {\n var ref = Object.create(args.positional.at(0));\n ref[EACH_IN_REFERENCE] = true;\n return ref;\n };\n\n /**\n The `{{#each}}` helper loops over elements in a collection. It is an extension\n of the base Handlebars `{{#each}}` helper.\n The default behavior of `{{#each}}` is to yield its inner block once for every\n item in an array passing the item as the first block parameter.\n \n ```javascript\n var developers = [{ name: 'Yehuda' },{ name: 'Tom' }, { name: 'Paul' }];\n ```\n \n ```handlebars\n {{#each developers key=\"name\" as |person|}}\n {{person.name}}\n {{! `this` is whatever it was outside the #each }}\n {{/each}}\n ```\n \n The same rules apply to arrays of primitives.\n \n ```javascript\n var developerNames = ['Yehuda', 'Tom', 'Paul']\n ```\n \n ```handlebars\n {{#each developerNames key=\"@index\" as |name|}}\n {{name}}\n {{/each}}\n ```\n \n During iteration, the index of each item in the array is provided as a second block parameter.\n \n ```handlebars\n <ul>\n {{#each people as |person index|}}\n <li>Hello, {{person.name}}! You're number {{index}} in line</li>\n {{/each}}\n </ul>\n ```\n \n ### Specifying Keys\n \n The `key` option is used to tell Ember how to determine if the array being\n iterated over with `{{#each}}` has changed between renders. By helping Ember\n detect that some elements in the array are the same, DOM elements can be\n re-used, significantly improving rendering speed.\n \n For example, here's the `{{#each}}` helper with its `key` set to `id`:\n \n ```handlebars\n {{#each model key=\"id\" as |item|}}\n {{/each}}\n ```\n \n When this `{{#each}}` re-renders, Ember will match up the previously rendered\n items (and reorder the generated DOM elements) based on each item's `id`\n property.\n By default the item's own reference is used.\n \n ### {{else}} condition\n \n `{{#each}}` can have a matching `{{else}}`. The contents of this block will render\n if the collection is empty.\n \n ```handlebars\n {{#each developers as |person|}}\n {{person.name}}\n {{else}}\n <p>Sorry, nobody is available for this task.</p>\n {{/each}}\n ```\n \n @method each\n @for Ember.Templates.helpers\n @public\n */\n /**\n The `{{each-in}}` helper loops over properties on an object.\n \n For example, given a `user` object that looks like:\n \n ```javascript\n {\n \"name\": \"Shelly Sails\",\n \"age\": 42\n }\n ```\n \n This template would display all properties on the `user`\n object in a list:\n \n ```handlebars\n <ul>\n {{#each-in user as |key value|}}\n <li>{{key}}: {{value}}</li>\n {{/each-in}}\n </ul>\n ```\n \n Outputting their name and age.\n \n @method each-in\n @for Ember.Templates.helpers\n @public\n @since 2.1.0\n */\n var EACH_IN_REFERENCE = (0, _emberUtils.symbol)('EACH_IN');\n function isEachIn(ref) {\n return ref && ref[EACH_IN_REFERENCE];\n }\n});","enifed('ember-glimmer/helpers/get', ['exports', 'ember-babel', '@glimmer/reference', '@glimmer/runtime', 'ember-metal', 'ember-glimmer/utils/references'], function (exports, _emberBabel, _reference, _runtime, _emberMetal, _references) {\n 'use strict';\n\n exports.default = function (_vm, args) {\n return GetHelperReference.create(args.positional.at(0), args.positional.at(1));\n };\n\n var GetHelperReference = function (_CachedReference) {\n (0, _emberBabel.inherits)(GetHelperReference, _CachedReference);\n\n GetHelperReference.create = function create(sourceReference, pathReference) {\n if ((0, _reference.isConst)(pathReference)) {\n var path = pathReference.value();\n if (path === undefined || path === null || path === '') {\n return _runtime.NULL_REFERENCE;\n } else if (typeof path === 'string' && path.indexOf('.') > -1) {\n return (0, _reference.referenceFromParts)(sourceReference, path.split('.'));\n } else {\n return sourceReference.get(path);\n }\n } else {\n return new GetHelperReference(sourceReference, pathReference);\n }\n };\n\n function GetHelperReference(sourceReference, pathReference) {\n (0, _emberBabel.classCallCheck)(this, GetHelperReference);\n\n var _this = (0, _emberBabel.possibleConstructorReturn)(this, _CachedReference.call(this));\n\n _this.sourceReference = sourceReference;\n _this.pathReference = pathReference;\n _this.lastPath = null;\n _this.innerReference = _runtime.NULL_REFERENCE;\n var innerTag = _this.innerTag = _reference.UpdatableTag.create(_reference.CONSTANT_TAG);\n _this.tag = (0, _reference.combine)([sourceReference.tag, pathReference.tag, innerTag]);\n return _this;\n }\n\n GetHelperReference.prototype.compute = function compute() {\n var lastPath = this.lastPath,\n innerReference = this.innerReference,\n innerTag = this.innerTag;\n\n var path = this.lastPath = this.pathReference.value();\n if (path !== lastPath) {\n if (path === undefined || path === null || path === '') {\n innerReference = _runtime.NULL_REFERENCE;\n } else if (typeof path === 'string' && path.indexOf('.') > -1) {\n innerReference = (0, _reference.referenceFromParts)(this.sourceReference, path.split('.'));\n } else {\n innerReference = this.sourceReference.get(path);\n }\n innerTag.inner.update(innerReference.tag);\n this.innerReference = innerReference;\n }\n return innerReference.value();\n };\n\n GetHelperReference.prototype[_references.UPDATE] = function (value) {\n (0, _emberMetal.set)(this.sourceReference.value(), this.pathReference.value(), value);\n };\n\n return GetHelperReference;\n }(_references.CachedReference);\n});","enifed(\"ember-glimmer/helpers/hash\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.default = function (_vm, args) {\n return args.named.capture();\n };\n});","enifed('ember-glimmer/helpers/if-unless', ['exports', 'ember-babel', '@glimmer/reference', 'ember-debug', 'ember-glimmer/utils/references'], function (exports, _emberBabel, _reference, _emberDebug, _references) {\n 'use strict';\n\n exports.inlineIf = inlineIf;\n exports.inlineUnless = inlineUnless;\n\n var ConditionalHelperReference = function (_CachedReference) {\n (0, _emberBabel.inherits)(ConditionalHelperReference, _CachedReference);\n\n ConditionalHelperReference.create = function create(_condRef, truthyRef, falsyRef) {\n var condRef = _references.ConditionalReference.create(_condRef);\n if ((0, _reference.isConst)(condRef)) {\n return condRef.value() ? truthyRef : falsyRef;\n } else {\n return new ConditionalHelperReference(condRef, truthyRef, falsyRef);\n }\n };\n\n function ConditionalHelperReference(cond, truthy, falsy) {\n (0, _emberBabel.classCallCheck)(this, ConditionalHelperReference);\n\n var _this = (0, _emberBabel.possibleConstructorReturn)(this, _CachedReference.call(this));\n\n _this.branchTag = _reference.UpdatableTag.create(_reference.CONSTANT_TAG);\n _this.tag = (0, _reference.combine)([cond.tag, _this.branchTag]);\n _this.cond = cond;\n _this.truthy = truthy;\n _this.falsy = falsy;\n return _this;\n }\n\n ConditionalHelperReference.prototype.compute = function compute() {\n var branch = this.cond.value() ? this.truthy : this.falsy;\n this.branchTag.inner.update(branch.tag);\n return branch.value();\n };\n\n return ConditionalHelperReference;\n }(_references.CachedReference);\n\n /**\n The `if` helper allows you to conditionally render one of two branches,\n depending on the \"truthiness\" of a property.\n For example the following values are all falsey: `false`, `undefined`, `null`, `\"\"`, `0`, `NaN` or an empty array.\n \n This helper has two forms, block and inline.\n \n ## Block form\n \n You can use the block form of `if` to conditionally render a section of the template.\n \n To use it, pass the conditional value to the `if` helper,\n using the block form to wrap the section of template you want to conditionally render.\n Like so:\n \n ```handlebars\n {{! will not render if foo is falsey}}\n {{#if foo}}\n Welcome to the {{foo.bar}}\n {{/if}}\n ```\n \n You can also specify a template to show if the property is falsey by using\n the `else` helper.\n \n ```handlebars\n {{! is it raining outside?}}\n {{#if isRaining}}\n Yes, grab an umbrella!\n {{else}}\n No, it's lovely outside!\n {{/if}}\n ```\n \n You are also able to combine `else` and `if` helpers to create more complex\n conditional logic.\n \n ```handlebars\n {{#if isMorning}}\n Good morning\n {{else if isAfternoon}}\n Good afternoon\n {{else}}\n Good night\n {{/if}}\n ```\n \n ## Inline form\n \n The inline `if` helper conditionally renders a single property or string.\n \n In this form, the `if` helper receives three arguments, the conditional value,\n the value to render when truthy, and the value to render when falsey.\n \n For example, if `useLongGreeting` is truthy, the following:\n \n ```handlebars\n {{if useLongGreeting \"Hello\" \"Hi\"}} Alex\n ```\n \n Will render:\n \n ```html\n Hello Alex\n ```\n \n ### Nested `if`\n \n You can use the `if` helper inside another helper as a nested helper:\n \n ```handlebars\n {{some-component height=(if isBig \"100\" \"10\")}}\n ```\n \n One detail to keep in mind is that both branches of the `if` helper will be evaluated,\n so if you have `{{if condition \"foo\" (expensive-operation \"bar\")`,\n `expensive-operation` will always calculate.\n \n @method if\n @for Ember.Templates.helpers\n @public\n */\n function inlineIf(_vm, _ref) {\n var positional = _ref.positional;\n (true && !(positional.length === 3 || positional.length === 2) && (0, _emberDebug.assert)('The inline form of the `if` helper expects two or three arguments, e.g. ' + '`{{if trialExpired \"Expired\" expiryDate}}`.', positional.length === 3 || positional.length === 2));\n\n return ConditionalHelperReference.create(positional.at(0), positional.at(1), positional.at(2));\n }\n /**\n The inline `unless` helper conditionally renders a single property or string.\n This helper acts like a ternary operator. If the first property is falsy,\n the second argument will be displayed, otherwise, the third argument will be\n displayed\n \n ```handlebars\n {{unless useLongGreeting \"Hi\" \"Hello\"}} Ben\n ```\n \n You can use the `unless` helper inside another helper as a subexpression.\n \n ```handlebars\n {{some-component height=(unless isBig \"10\" \"100\")}}\n ```\n \n @method unless\n @for Ember.Templates.helpers\n @public\n */\n function inlineUnless(_vm, _ref2) {\n var positional = _ref2.positional;\n (true && !(positional.length === 3 || positional.length === 2) && (0, _emberDebug.assert)('The inline form of the `unless` helper expects two or three arguments, e.g. ' + '`{{unless isFirstLogin \"Welcome back!\"}}`.', positional.length === 3 || positional.length === 2));\n\n return ConditionalHelperReference.create(positional.at(0), positional.at(2), positional.at(1));\n }\n});","enifed('ember-glimmer/helpers/loc', ['exports', 'ember-glimmer/helper', 'ember-runtime'], function (exports, _helper, _emberRuntime) {\n 'use strict';\n\n exports.default = (0, _helper.helper)(function (params) {\n return _emberRuntime.String.loc.apply(null, params);\n });\n});","enifed('ember-glimmer/helpers/log', ['exports', 'ember-glimmer/utils/references', 'ember-console'], function (exports, _references, _emberConsole) {\n 'use strict';\n\n exports.default = function (_vm, args) {\n return new _references.InternalHelperReference(log, args.capture());\n };\n\n /**\n `log` allows you to output the value of variables in the current rendering\n context. `log` also accepts primitive types such as strings or numbers.\n \n ```handlebars\n {{log \"myVariable:\" myVariable }}\n ```\n \n @method log\n @for Ember.Templates.helpers\n @param {Array} params\n @public\n */\n function log(_ref) {\n var positional = _ref.positional;\n\n _emberConsole.default.log.apply(null, positional.value());\n }\n /**\n @module ember\n */\n});","enifed('ember-glimmer/helpers/mut', ['exports', 'ember-debug', 'ember-utils', 'ember-glimmer/utils/references', 'ember-glimmer/helpers/action'], function (exports, _emberDebug, _emberUtils, _references, _action) {\n 'use strict';\n\n exports.isMut = isMut;\n exports.unMut = unMut;\n\n exports.default = function (_vm, args) {\n var rawRef = args.positional.at(0);\n if (isMut(rawRef)) {\n return rawRef;\n }\n // TODO: Improve this error message. This covers at least two distinct\n // cases:\n //\n // 1. (mut \"not a path\") – passing a literal, result from a helper\n // invocation, etc\n //\n // 2. (mut receivedValue) – passing a value received from the caller\n // that was originally derived from a literal, result from a helper\n // invocation, etc\n //\n // This message is alright for the first case, but could be quite\n // confusing for the second case.\n (true && !(rawRef[_references.UPDATE]) && (0, _emberDebug.assert)('You can only pass a path to mut', rawRef[_references.UPDATE]));\n\n var wrappedRef = Object.create(rawRef);\n wrappedRef[SOURCE] = rawRef;\n wrappedRef[_action.INVOKE] = rawRef[_references.UPDATE];\n wrappedRef[MUT_REFERENCE] = true;\n return wrappedRef;\n };\n\n /**\n The `mut` helper lets you __clearly specify__ that a child `Component` can update the\n (mutable) value passed to it, which will __change the value of the parent component__.\n \n To specify that a parameter is mutable, when invoking the child `Component`:\n \n ```handlebars\n {{my-child childClickCount=(mut totalClicks)}}\n ```\n \n The child `Component` can then modify the parent's value just by modifying its own\n property:\n \n ```javascript\n // my-child.js\n export default Component.extend({\n click() {\n this.incrementProperty('childClickCount');\n }\n });\n ```\n \n Note that for curly components (`{{my-component}}`) the bindings are already mutable,\n making the `mut` unnecessary.\n \n Additionally, the `mut` helper can be combined with the `action` helper to\n mutate a value. For example:\n \n ```handlebars\n {{my-child childClickCount=totalClicks click-count-change=(action (mut totalClicks))}}\n ```\n \n The child `Component` would invoke the action with the new click value:\n \n ```javascript\n // my-child.js\n export default Component.extend({\n click() {\n this.get('click-count-change')(this.get('childClickCount') + 1);\n }\n });\n ```\n \n The `mut` helper changes the `totalClicks` value to what was provided as the action argument.\n \n The `mut` helper, when used with `action`, will return a function that\n sets the value passed to `mut` to its first argument. This works like any other\n closure action and interacts with the other features `action` provides.\n As an example, we can create a button that increments a value passing the value\n directly to the `action`:\n \n ```handlebars\n {{! inc helper is not provided by Ember }}\n <button onclick={{action (mut count) (inc count)}}>\n Increment count\n </button>\n ```\n \n You can also use the `value` option:\n \n ```handlebars\n <input value={{name}} oninput={{action (mut name) value=\"target.value\"}}>\n ```\n \n @method mut\n @param {Object} [attr] the \"two-way\" attribute that can be modified.\n @for Ember.Templates.helpers\n @public\n */\n var MUT_REFERENCE = (0, _emberUtils.symbol)('MUT');\n var SOURCE = (0, _emberUtils.symbol)('SOURCE');\n function isMut(ref) {\n return ref && ref[MUT_REFERENCE];\n }\n function unMut(ref) {\n return ref[SOURCE] || ref;\n }\n});","enifed('ember-glimmer/helpers/query-param', ['exports', 'ember-debug', 'ember-routing', 'ember-utils', 'ember-glimmer/utils/references'], function (exports, _emberDebug, _emberRouting, _emberUtils, _references) {\n 'use strict';\n\n exports.default = function (_vm, args) {\n return new _references.InternalHelperReference(queryParams, args.capture());\n };\n\n /**\n This is a helper to be used in conjunction with the link-to helper.\n It will supply url query parameters to the target route.\n \n Example\n \n ```handlebars\n {{#link-to 'posts' (query-params direction=\"asc\")}}Sort{{/link-to}}\n ```\n \n @method query-params\n @for Ember.Templates.helpers\n @param {Object} hash takes a hash of query parameters\n @return {Object} A `QueryParams` object for `{{link-to}}`\n @public\n */\n function queryParams(_ref) {\n var positional = _ref.positional,\n named = _ref.named;\n (true && !(positional.value().length === 0) && (0, _emberDebug.assert)('The `query-params` helper only accepts hash parameters, e.g. (query-params queryParamPropertyName=\\'foo\\') as opposed to just (query-params \\'foo\\')', positional.value().length === 0));\n\n return _emberRouting.QueryParams.create({\n values: (0, _emberUtils.assign)({}, named.value())\n });\n }\n});","enifed('ember-glimmer/helpers/readonly', ['exports', 'ember-glimmer/utils/references', 'ember-glimmer/helpers/mut'], function (exports, _references, _mut) {\n 'use strict';\n\n exports.default = function (_vm, args) {\n var ref = (0, _mut.unMut)(args.positional.at(0));\n var wrapped = Object.create(ref);\n wrapped[_references.UPDATE] = undefined;\n return wrapped;\n };\n});","enifed('ember-glimmer/helpers/unbound', ['exports', 'ember-debug', 'ember-glimmer/utils/references'], function (exports, _emberDebug, _references) {\n 'use strict';\n\n exports.default = function (_vm, args) {\n (true && !(args.positional.length === 1 && args.named.length === 0) && (0, _emberDebug.assert)('unbound helper cannot be called with multiple params or hash params', args.positional.length === 1 && args.named.length === 0));\n\n return _references.UnboundReference.create(args.positional.at(0).value());\n };\n});","enifed('ember-glimmer/index', ['exports', 'ember-glimmer/helpers/action', 'ember-glimmer/templates/root', 'ember-glimmer/template', 'ember-glimmer/components/checkbox', 'ember-glimmer/components/text_field', 'ember-glimmer/components/text_area', 'ember-glimmer/components/link-to', 'ember-glimmer/component', 'ember-glimmer/helper', 'ember-glimmer/environment', 'ember-glimmer/utils/string', 'ember-glimmer/renderer', 'ember-glimmer/template_registry', 'ember-glimmer/setup-registry', 'ember-glimmer/dom', 'ember-glimmer/syntax', 'ember-glimmer/component-managers/abstract'], function (exports, _action, _root, _template, _checkbox, _text_field, _text_area, _linkTo, _component, _helper, _environment, _string, _renderer, _template_registry, _setupRegistry, _dom, _syntax, _abstract) {\n 'use strict';\n\n Object.defineProperty(exports, 'INVOKE', {\n enumerable: true,\n get: function () {\n return _action.INVOKE;\n }\n });\n Object.defineProperty(exports, 'RootTemplate', {\n enumerable: true,\n get: function () {\n return _root.default;\n }\n });\n Object.defineProperty(exports, 'template', {\n enumerable: true,\n get: function () {\n return _template.default;\n }\n });\n Object.defineProperty(exports, 'Checkbox', {\n enumerable: true,\n get: function () {\n return _checkbox.default;\n }\n });\n Object.defineProperty(exports, 'TextField', {\n enumerable: true,\n get: function () {\n return _text_field.default;\n }\n });\n Object.defineProperty(exports, 'TextArea', {\n enumerable: true,\n get: function () {\n return _text_area.default;\n }\n });\n Object.defineProperty(exports, 'LinkComponent', {\n enumerable: true,\n get: function () {\n return _linkTo.default;\n }\n });\n Object.defineProperty(exports, 'Component', {\n enumerable: true,\n get: function () {\n return _component.default;\n }\n });\n Object.defineProperty(exports, 'Helper', {\n enumerable: true,\n get: function () {\n return _helper.default;\n }\n });\n Object.defineProperty(exports, 'helper', {\n enumerable: true,\n get: function () {\n return _helper.helper;\n }\n });\n Object.defineProperty(exports, 'Environment', {\n enumerable: true,\n get: function () {\n return _environment.default;\n }\n });\n Object.defineProperty(exports, 'SafeString', {\n enumerable: true,\n get: function () {\n return _string.SafeString;\n }\n });\n Object.defineProperty(exports, 'escapeExpression', {\n enumerable: true,\n get: function () {\n return _string.escapeExpression;\n }\n });\n Object.defineProperty(exports, 'htmlSafe', {\n enumerable: true,\n get: function () {\n return _string.htmlSafe;\n }\n });\n Object.defineProperty(exports, 'isHTMLSafe', {\n enumerable: true,\n get: function () {\n return _string.isHTMLSafe;\n }\n });\n Object.defineProperty(exports, 'Renderer', {\n enumerable: true,\n get: function () {\n return _renderer.Renderer;\n }\n });\n Object.defineProperty(exports, 'InertRenderer', {\n enumerable: true,\n get: function () {\n return _renderer.InertRenderer;\n }\n });\n Object.defineProperty(exports, 'InteractiveRenderer', {\n enumerable: true,\n get: function () {\n return _renderer.InteractiveRenderer;\n }\n });\n Object.defineProperty(exports, '_resetRenderers', {\n enumerable: true,\n get: function () {\n return _renderer._resetRenderers;\n }\n });\n Object.defineProperty(exports, 'renderSettled', {\n enumerable: true,\n get: function () {\n return _renderer.renderSettled;\n }\n });\n Object.defineProperty(exports, 'getTemplate', {\n enumerable: true,\n get: function () {\n return _template_registry.getTemplate;\n }\n });\n Object.defineProperty(exports, 'setTemplate', {\n enumerable: true,\n get: function () {\n return _template_registry.setTemplate;\n }\n });\n Object.defineProperty(exports, 'hasTemplate', {\n enumerable: true,\n get: function () {\n return _template_registry.hasTemplate;\n }\n });\n Object.defineProperty(exports, 'getTemplates', {\n enumerable: true,\n get: function () {\n return _template_registry.getTemplates;\n }\n });\n Object.defineProperty(exports, 'setTemplates', {\n enumerable: true,\n get: function () {\n return _template_registry.setTemplates;\n }\n });\n Object.defineProperty(exports, 'setupEngineRegistry', {\n enumerable: true,\n get: function () {\n return _setupRegistry.setupEngineRegistry;\n }\n });\n Object.defineProperty(exports, 'setupApplicationRegistry', {\n enumerable: true,\n get: function () {\n return _setupRegistry.setupApplicationRegistry;\n }\n });\n Object.defineProperty(exports, 'DOMChanges', {\n enumerable: true,\n get: function () {\n return _dom.DOMChanges;\n }\n });\n Object.defineProperty(exports, 'NodeDOMTreeConstruction', {\n enumerable: true,\n get: function () {\n return _dom.NodeDOMTreeConstruction;\n }\n });\n Object.defineProperty(exports, 'DOMTreeConstruction', {\n enumerable: true,\n get: function () {\n return _dom.DOMTreeConstruction;\n }\n });\n Object.defineProperty(exports, '_registerMacros', {\n enumerable: true,\n get: function () {\n return _syntax.registerMacros;\n }\n });\n Object.defineProperty(exports, '_experimentalMacros', {\n enumerable: true,\n get: function () {\n return _syntax.experimentalMacros;\n }\n });\n Object.defineProperty(exports, 'AbstractComponentManager', {\n enumerable: true,\n get: function () {\n return _abstract.default;\n }\n });\n});","enifed('ember-glimmer/modifiers/action', ['exports', 'ember-babel', 'ember-debug', 'ember-metal', 'ember-utils', 'ember-views', 'ember-glimmer/helpers/action'], function (exports, _emberBabel, _emberDebug, _emberMetal, _emberUtils, _emberViews, _action) {\n 'use strict';\n\n exports.ActionState = exports.ActionHelper = undefined;\n\n var MODIFIERS = ['alt', 'shift', 'meta', 'ctrl'];\n var POINTER_EVENT_TYPE_REGEX = /^click|mouse|touch/;\n function isAllowedEvent(event, allowedKeys) {\n if (allowedKeys === null || allowedKeys === undefined) {\n if (POINTER_EVENT_TYPE_REGEX.test(event.type)) {\n return (0, _emberViews.isSimpleClick)(event);\n } else {\n allowedKeys = '';\n }\n }\n if (allowedKeys.indexOf('any') >= 0) {\n return true;\n }\n for (var i = 0; i < MODIFIERS.length; i++) {\n if (event[MODIFIERS[i] + 'Key'] && allowedKeys.indexOf(MODIFIERS[i]) === -1) {\n return false;\n }\n }\n return true;\n }\n var ActionHelper = exports.ActionHelper = {\n // registeredActions is re-exported for compatibility with older plugins\n // that were using this undocumented API.\n registeredActions: _emberViews.ActionManager.registeredActions,\n registerAction: function (actionState) {\n var actionId = actionState.actionId;\n\n _emberViews.ActionManager.registeredActions[actionId] = actionState;\n return actionId;\n },\n unregisterAction: function (actionState) {\n var actionId = actionState.actionId;\n\n delete _emberViews.ActionManager.registeredActions[actionId];\n }\n };\n\n var ActionState = exports.ActionState = function () {\n function ActionState(element, actionId, actionName, actionArgs, namedArgs, positionalArgs, implicitTarget, dom) {\n (0, _emberBabel.classCallCheck)(this, ActionState);\n\n this.element = element;\n this.actionId = actionId;\n this.actionName = actionName;\n this.actionArgs = actionArgs;\n this.namedArgs = namedArgs;\n this.positional = positionalArgs;\n this.implicitTarget = implicitTarget;\n this.dom = dom;\n this.eventName = this.getEventName();\n }\n\n ActionState.prototype.getEventName = function getEventName() {\n return this.namedArgs.get('on').value() || 'click';\n };\n\n ActionState.prototype.getActionArgs = function getActionArgs() {\n var result = new Array(this.actionArgs.length);\n for (var i = 0; i < this.actionArgs.length; i++) {\n result[i] = this.actionArgs[i].value();\n }\n return result;\n };\n\n ActionState.prototype.getTarget = function getTarget() {\n var implicitTarget = this.implicitTarget,\n namedArgs = this.namedArgs;\n\n var target = void 0;\n if (namedArgs.has('target')) {\n target = namedArgs.get('target').value();\n } else {\n target = implicitTarget.value();\n }\n return target;\n };\n\n ActionState.prototype.handler = function handler(event) {\n var _this = this;\n\n var actionName = this.actionName,\n namedArgs = this.namedArgs;\n\n var bubbles = namedArgs.get('bubbles');\n var preventDefault = namedArgs.get('preventDefault');\n var allowedKeys = namedArgs.get('allowedKeys');\n var target = this.getTarget();\n if (!isAllowedEvent(event, allowedKeys.value())) {\n return true;\n }\n if (preventDefault.value() !== false) {\n event.preventDefault();\n }\n if (bubbles.value() === false) {\n event.stopPropagation();\n }\n _emberMetal.run.join(function () {\n var args = _this.getActionArgs();\n var payload = {\n args: args,\n target: target,\n name: null\n };\n if (typeof actionName[_action.INVOKE] === 'function') {\n (0, _emberMetal.flaggedInstrument)('interaction.ember-action', payload, function () {\n actionName[_action.INVOKE].apply(actionName, args);\n });\n return;\n }\n if (typeof actionName === 'function') {\n (0, _emberMetal.flaggedInstrument)('interaction.ember-action', payload, function () {\n actionName.apply(target, args);\n });\n return;\n }\n payload.name = actionName;\n if (target.send) {\n (0, _emberMetal.flaggedInstrument)('interaction.ember-action', payload, function () {\n target.send.apply(target, [actionName].concat(args));\n });\n } else {\n (true && !(typeof target[actionName] === 'function') && (0, _emberDebug.assert)('The action \\'' + actionName + '\\' did not exist on ' + target, typeof target[actionName] === 'function'));\n\n (0, _emberMetal.flaggedInstrument)('interaction.ember-action', payload, function () {\n target[actionName].apply(target, args);\n });\n }\n });\n return false;\n };\n\n ActionState.prototype.destroy = function destroy() {\n ActionHelper.unregisterAction(this);\n };\n\n return ActionState;\n }();\n\n var ActionModifierManager = function () {\n function ActionModifierManager() {\n (0, _emberBabel.classCallCheck)(this, ActionModifierManager);\n }\n\n ActionModifierManager.prototype.create = function create(element, args, _dynamicScope, dom) {\n var _args$capture = args.capture(),\n named = _args$capture.named,\n positional = _args$capture.positional;\n\n var implicitTarget = void 0;\n var actionName = void 0;\n var actionNameRef = void 0;\n if (positional.length > 1) {\n implicitTarget = positional.at(0);\n actionNameRef = positional.at(1);\n if (actionNameRef[_action.INVOKE]) {\n actionName = actionNameRef;\n } else {\n var actionLabel = actionNameRef._propertyKey;\n actionName = actionNameRef.value();\n (true && !(typeof actionName === 'string' || typeof actionName === 'function') && (0, _emberDebug.assert)('You specified a quoteless path, `' + actionLabel + '`, to the ' + '{{action}} helper which did not resolve to an action name (a ' + 'string). Perhaps you meant to use a quoted actionName? (e.g. ' + '{{action \"' + actionLabel + '\"}}).', typeof actionName === 'string' || typeof actionName === 'function'));\n }\n }\n var actionArgs = [];\n // The first two arguments are (1) `this` and (2) the action name.\n // Everything else is a param.\n for (var i = 2; i < positional.length; i++) {\n actionArgs.push(positional.at(i));\n }\n var actionId = (0, _emberUtils.uuid)();\n return new ActionState(element, actionId, actionName, actionArgs, named, positional, implicitTarget, dom);\n };\n\n ActionModifierManager.prototype.install = function install(actionState) {\n var dom = actionState.dom,\n element = actionState.element,\n actionId = actionState.actionId;\n\n ActionHelper.registerAction(actionState);\n dom.setAttribute(element, 'data-ember-action', '');\n dom.setAttribute(element, 'data-ember-action-' + actionId, actionId);\n };\n\n ActionModifierManager.prototype.update = function update(actionState) {\n var positional = actionState.positional;\n\n var actionNameRef = positional.at(1);\n if (!actionNameRef[_action.INVOKE]) {\n actionState.actionName = actionNameRef.value();\n }\n actionState.eventName = actionState.getEventName();\n };\n\n ActionModifierManager.prototype.getDestructor = function getDestructor(modifier) {\n return modifier;\n };\n\n return ActionModifierManager;\n }();\n\n exports.default = ActionModifierManager;\n});","enifed('ember-glimmer/protocol-for-url', ['exports', 'ember-environment', 'node-module'], function (exports, _emberEnvironment, _nodeModule) {\n 'use strict';\n\n exports.default = installProtocolForURL;\n /* globals module, URL */\n var nodeURL = void 0;\n var parsingNode = void 0;\n function installProtocolForURL(environment) {\n var protocol = void 0;\n if (_emberEnvironment.environment.hasDOM) {\n protocol = browserProtocolForURL.call(environment, 'foobar:baz');\n }\n // Test to see if our DOM implementation parses\n // and normalizes URLs.\n if (protocol === 'foobar:') {\n // Swap in the method that doesn't do this test now that\n // we know it works.\n environment.protocolForURL = browserProtocolForURL;\n } else if (typeof URL === 'object') {\n // URL globally provided, likely from FastBoot's sandbox\n nodeURL = URL;\n environment.protocolForURL = nodeProtocolForURL;\n } else if (_nodeModule.IS_NODE) {\n // Otherwise, we need to fall back to our own URL parsing.\n // Global `require` is shadowed by Ember's loader so we have to use the fully\n // qualified `module.require`.\n // tslint:disable-next-line:no-require-imports\n nodeURL = (0, _nodeModule.require)('url');\n environment.protocolForURL = nodeProtocolForURL;\n } else {\n throw new Error('Could not find valid URL parsing mechanism for URL Sanitization');\n }\n }\n function browserProtocolForURL(url) {\n if (!parsingNode) {\n parsingNode = document.createElement('a');\n }\n parsingNode.href = url;\n return parsingNode.protocol;\n }\n function nodeProtocolForURL(url) {\n var protocol = null;\n if (typeof url === 'string') {\n protocol = nodeURL.parse(url).protocol;\n }\n return protocol === null ? ':' : protocol;\n }\n});","enifed('ember-glimmer/renderer', ['exports', 'ember-babel', '@glimmer/reference', 'ember-debug', 'ember-metal', 'ember-views', 'ember-glimmer/component', 'ember-glimmer/component-managers/outlet', 'ember-glimmer/component-managers/root', 'ember-glimmer/utils/references', '@glimmer/runtime', 'rsvp'], function (exports, _emberBabel, _reference, _emberDebug, _emberMetal, _emberViews, _component, _outlet, _root2, _references, _runtime, _rsvp) {\n 'use strict';\n\n exports.InteractiveRenderer = exports.InertRenderer = exports.Renderer = exports.DynamicScope = undefined;\n exports._resetRenderers = _resetRenderers;\n exports.renderSettled = renderSettled;\n var backburner = _emberMetal.run.backburner;\n\n var DynamicScope = exports.DynamicScope = function () {\n function DynamicScope(view, outletState, rootOutletState) {\n (0, _emberBabel.classCallCheck)(this, DynamicScope);\n\n this.view = view;\n this.outletState = outletState;\n this.rootOutletState = rootOutletState;\n }\n\n DynamicScope.prototype.child = function child() {\n return new DynamicScope(this.view, this.outletState, this.rootOutletState);\n };\n\n DynamicScope.prototype.get = function get(key) {\n // tslint:disable-next-line:max-line-length\n (true && !(key === 'outletState') && (0, _emberDebug.assert)('Using `-get-dynamic-scope` is only supported for `outletState` (you used `' + key + '`).', key === 'outletState'));\n\n return this.outletState;\n };\n\n DynamicScope.prototype.set = function set(key, value) {\n // tslint:disable-next-line:max-line-length\n (true && !(key === 'outletState') && (0, _emberDebug.assert)('Using `-with-dynamic-scope` is only supported for `outletState` (you used `' + key + '`).', key === 'outletState'));\n\n this.outletState = value;\n return value;\n };\n\n return DynamicScope;\n }();\n\n var RootState = function () {\n function RootState(root, env, template, self, parentElement, dynamicScope) {\n var _this = this;\n\n (0, _emberBabel.classCallCheck)(this, RootState);\n (true && !(template !== undefined) && (0, _emberDebug.assert)('You cannot render `' + self.value() + '` without a template.', template !== undefined));\n\n this.id = (0, _emberViews.getViewId)(root);\n this.env = env;\n this.root = root;\n this.result = undefined;\n this.shouldReflush = false;\n this.destroyed = false;\n var options = this.options = {\n alwaysRevalidate: false\n };\n this.render = function () {\n var iterator = template.render(self, parentElement, dynamicScope);\n var iteratorResult = void 0;\n do {\n iteratorResult = iterator.next();\n } while (!iteratorResult.done);\n var result = _this.result = iteratorResult.value;\n // override .render function after initial render\n _this.render = function () {\n return result.rerender(options);\n };\n };\n }\n\n RootState.prototype.isFor = function isFor(possibleRoot) {\n return this.root === possibleRoot;\n };\n\n RootState.prototype.destroy = function destroy() {\n var result = this.result,\n env = this.env;\n\n this.destroyed = true;\n this.env = undefined;\n this.root = null;\n this.result = undefined;\n this.render = undefined;\n if (result) {\n /*\n Handles these scenarios:\n * When roots are removed during standard rendering process, a transaction exists already\n `.begin()` / `.commit()` are not needed.\n * When roots are being destroyed manually (`component.append(); component.destroy() case), no\n transaction exists already.\n * When roots are being destroyed during `Renderer#destroy`, no transaction exists\n */\n var needsTransaction = !env.inTransaction;\n if (needsTransaction) {\n env.begin();\n }\n result.destroy();\n if (needsTransaction) {\n env.commit();\n }\n }\n };\n\n return RootState;\n }();\n\n var renderers = [];\n function _resetRenderers() {\n renderers.length = 0;\n }\n (0, _emberMetal.setHasViews)(function () {\n return renderers.length > 0;\n });\n function register(renderer) {\n (true && !(renderers.indexOf(renderer) === -1) && (0, _emberDebug.assert)('Cannot register the same renderer twice', renderers.indexOf(renderer) === -1));\n\n renderers.push(renderer);\n }\n function deregister(renderer) {\n var index = renderers.indexOf(renderer);\n (true && !(index !== -1) && (0, _emberDebug.assert)('Cannot deregister unknown unregistered renderer', index !== -1));\n\n renderers.splice(index, 1);\n }\n function loopBegin() {\n for (var i = 0; i < renderers.length; i++) {\n renderers[i]._scheduleRevalidate();\n }\n }\n function K() {}\n var renderSettledDeferred = null;\n /*\n Returns a promise which will resolve when rendering has settled. Settled in\n this context is defined as when all of the tags in use are \"current\" (e.g.\n `renderers.every(r => r._isValid())`). When this is checked at the _end_ of\n the run loop, this essentially guarantees that all rendering is completed.\n \n @method renderSettled\n @returns {Promise<void>} a promise which fulfills when rendering has settled\n */\n function renderSettled() {\n if (renderSettledDeferred === null) {\n renderSettledDeferred = _rsvp.default.defer();\n // if there is no current runloop, the promise created above will not have\n // a chance to resolve (because its resolved in backburner's \"end\" event)\n if (!_emberMetal.run.currentRunLoop) {\n // ensure a runloop has been kicked off\n backburner.schedule('actions', null, K);\n }\n }\n return renderSettledDeferred.promise;\n }\n function resolveRenderPromise() {\n if (renderSettledDeferred !== null) {\n var resolve = renderSettledDeferred.resolve;\n renderSettledDeferred = null;\n backburner.join(null, resolve);\n }\n }\n var loops = 0;\n function loopEnd() {\n for (var i = 0; i < renderers.length; i++) {\n if (!renderers[i]._isValid()) {\n if (loops > 10) {\n loops = 0;\n // TODO: do something better\n renderers[i].destroy();\n throw new Error('infinite rendering invalidation detected');\n }\n loops++;\n return backburner.join(null, K);\n }\n }\n loops = 0;\n resolveRenderPromise();\n }\n backburner.on('begin', loopBegin);\n backburner.on('end', loopEnd);\n\n var Renderer = exports.Renderer = function () {\n function Renderer(env, rootTemplate) {\n var _viewRegistry = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _emberViews.fallbackViewRegistry;\n\n var destinedForDOM = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n (0, _emberBabel.classCallCheck)(this, Renderer);\n\n this._env = env;\n this._rootTemplate = rootTemplate;\n this._viewRegistry = _viewRegistry;\n this._destinedForDOM = destinedForDOM;\n this._destroyed = false;\n this._roots = [];\n this._lastRevision = -1;\n this._isRenderingRoots = false;\n this._removedRoots = [];\n }\n // renderer HOOKS\n\n\n Renderer.prototype.appendOutletView = function appendOutletView(view, target) {\n var definition = new _outlet.TopLevelOutletComponentDefinition(view);\n var outletStateReference = view.toReference();\n this._appendDefinition(view, definition, target, outletStateReference);\n };\n\n Renderer.prototype.appendTo = function appendTo(view, target) {\n var rootDef = new _root2.RootComponentDefinition(view);\n this._appendDefinition(view, rootDef, target);\n };\n\n Renderer.prototype._appendDefinition = function _appendDefinition(root, definition, target, outletStateReference) {\n var self = new _references.RootReference(definition);\n var dynamicScope = new DynamicScope(null, outletStateReference || _runtime.NULL_REFERENCE, outletStateReference);\n var rootState = new RootState(root, this._env, this._rootTemplate, self, target, dynamicScope);\n this._renderRoot(rootState);\n };\n\n Renderer.prototype.rerender = function rerender() {\n this._scheduleRevalidate();\n };\n\n Renderer.prototype.register = function register(view) {\n var id = (0, _emberViews.getViewId)(view);\n (true && !(!this._viewRegistry[id]) && (0, _emberDebug.assert)('Attempted to register a view with an id already in use: ' + id, !this._viewRegistry[id]));\n\n this._viewRegistry[id] = view;\n };\n\n Renderer.prototype.unregister = function unregister(view) {\n delete this._viewRegistry[(0, _emberViews.getViewId)(view)];\n };\n\n Renderer.prototype.remove = function remove(view) {\n view._transitionTo('destroying');\n this.cleanupRootFor(view);\n (0, _emberViews.setViewElement)(view, null);\n if (this._destinedForDOM) {\n view.trigger('didDestroyElement');\n }\n if (!view.isDestroying) {\n view.destroy();\n }\n };\n\n Renderer.prototype.cleanupRootFor = function cleanupRootFor(view) {\n // no need to cleanup roots if we have already been destroyed\n if (this._destroyed) {\n return;\n }\n var roots = this._roots;\n // traverse in reverse so we can remove items\n // without mucking up the index\n var i = this._roots.length;\n while (i--) {\n var root = roots[i];\n if (root.isFor(view)) {\n root.destroy();\n roots.splice(i, 1);\n }\n }\n };\n\n Renderer.prototype.destroy = function destroy() {\n if (this._destroyed) {\n return;\n }\n this._destroyed = true;\n this._clearAllRoots();\n };\n\n Renderer.prototype.getBounds = function getBounds(view) {\n var bounds = view[_component.BOUNDS];\n var parentElement = bounds.parentElement();\n var firstNode = bounds.firstNode();\n var lastNode = bounds.lastNode();\n return { parentElement: parentElement, firstNode: firstNode, lastNode: lastNode };\n };\n\n Renderer.prototype.createElement = function createElement(tagName) {\n return this._env.getAppendOperations().createElement(tagName);\n };\n\n Renderer.prototype._renderRoot = function _renderRoot(root) {\n var roots = this._roots;\n\n roots.push(root);\n if (roots.length === 1) {\n register(this);\n }\n this._renderRootsTransaction();\n };\n\n Renderer.prototype._renderRoots = function _renderRoots() {\n var roots = this._roots,\n env = this._env,\n removedRoots = this._removedRoots;\n\n var globalShouldReflush = void 0;\n var initialRootsLength = void 0;\n do {\n env.begin();\n // ensure that for the first iteration of the loop\n // each root is processed\n initialRootsLength = roots.length;\n globalShouldReflush = false;\n for (var i = 0; i < roots.length; i++) {\n var root = roots[i];\n if (root.destroyed) {\n // add to the list of roots to be removed\n // they will be removed from `this._roots` later\n removedRoots.push(root);\n // skip over roots that have been marked as destroyed\n continue;\n }\n var shouldReflush = root.shouldReflush;\n // when processing non-initial reflush loops,\n // do not process more roots than needed\n\n if (i >= initialRootsLength && !shouldReflush) {\n continue;\n }\n root.options.alwaysRevalidate = shouldReflush;\n // track shouldReflush based on this roots render result\n shouldReflush = root.shouldReflush = (0, _emberMetal.runInTransaction)(root, 'render');\n // globalShouldReflush should be `true` if *any* of\n // the roots need to reflush\n globalShouldReflush = globalShouldReflush || shouldReflush;\n }\n this._lastRevision = _reference.CURRENT_TAG.value();\n env.commit();\n } while (globalShouldReflush || roots.length > initialRootsLength);\n // remove any roots that were destroyed during this transaction\n while (removedRoots.length) {\n var _root = removedRoots.pop();\n var rootIndex = roots.indexOf(_root);\n roots.splice(rootIndex, 1);\n }\n if (this._roots.length === 0) {\n deregister(this);\n }\n };\n\n Renderer.prototype._renderRootsTransaction = function _renderRootsTransaction() {\n if (this._isRenderingRoots) {\n // currently rendering roots, a new root was added and will\n // be processed by the existing _renderRoots invocation\n return;\n }\n // used to prevent calling _renderRoots again (see above)\n // while we are actively rendering roots\n this._isRenderingRoots = true;\n var completedWithoutError = false;\n try {\n this._renderRoots();\n completedWithoutError = true;\n } finally {\n if (!completedWithoutError) {\n this._lastRevision = _reference.CURRENT_TAG.value();\n if (this._env.inTransaction === true) {\n this._env.commit();\n }\n }\n this._isRenderingRoots = false;\n }\n };\n\n Renderer.prototype._clearAllRoots = function _clearAllRoots() {\n var roots = this._roots;\n for (var i = 0; i < roots.length; i++) {\n var root = roots[i];\n root.destroy();\n }\n this._removedRoots.length = 0;\n this._roots = [];\n // if roots were present before destroying\n // deregister this renderer instance\n if (roots.length) {\n deregister(this);\n }\n };\n\n Renderer.prototype._scheduleRevalidate = function _scheduleRevalidate() {\n backburner.scheduleOnce('render', this, this._revalidate);\n };\n\n Renderer.prototype._isValid = function _isValid() {\n return this._destroyed || this._roots.length === 0 || _reference.CURRENT_TAG.validate(this._lastRevision);\n };\n\n Renderer.prototype._revalidate = function _revalidate() {\n if (this._isValid()) {\n return;\n }\n this._renderRootsTransaction();\n };\n\n return Renderer;\n }();\n\n var InertRenderer = exports.InertRenderer = function (_Renderer) {\n (0, _emberBabel.inherits)(InertRenderer, _Renderer);\n\n function InertRenderer() {\n (0, _emberBabel.classCallCheck)(this, InertRenderer);\n return (0, _emberBabel.possibleConstructorReturn)(this, _Renderer.apply(this, arguments));\n }\n\n InertRenderer.create = function create(_ref) {\n var env = _ref.env,\n rootTemplate = _ref.rootTemplate,\n _viewRegistry = _ref._viewRegistry;\n\n return new this(env, rootTemplate, _viewRegistry, false);\n };\n\n InertRenderer.prototype.getElement = function getElement(_view) {\n throw new Error('Accessing `this.element` is not allowed in non-interactive environments (such as FastBoot).');\n };\n\n return InertRenderer;\n }(Renderer);\n\n var InteractiveRenderer = exports.InteractiveRenderer = function (_Renderer2) {\n (0, _emberBabel.inherits)(InteractiveRenderer, _Renderer2);\n\n function InteractiveRenderer() {\n (0, _emberBabel.classCallCheck)(this, InteractiveRenderer);\n return (0, _emberBabel.possibleConstructorReturn)(this, _Renderer2.apply(this, arguments));\n }\n\n InteractiveRenderer.create = function create(_ref2) {\n var env = _ref2.env,\n rootTemplate = _ref2.rootTemplate,\n _viewRegistry = _ref2._viewRegistry;\n\n return new this(env, rootTemplate, _viewRegistry, true);\n };\n\n InteractiveRenderer.prototype.getElement = function getElement(view) {\n return (0, _emberViews.getViewElement)(view);\n };\n\n return InteractiveRenderer;\n }(Renderer);\n});","enifed('ember-glimmer/setup-registry', ['exports', 'ember-babel', 'container', 'ember-environment', 'ember-glimmer/component', 'ember-glimmer/components/checkbox', 'ember-glimmer/components/link-to', 'ember-glimmer/components/text_area', 'ember-glimmer/components/text_field', 'ember-glimmer/dom', 'ember-glimmer/environment', 'ember-glimmer/renderer', 'ember-glimmer/templates/component', 'ember-glimmer/templates/outlet', 'ember-glimmer/templates/root', 'ember-glimmer/views/outlet', 'ember-glimmer/helpers/loc', 'ember/features'], function (exports, _emberBabel, _container, _emberEnvironment, _component, _checkbox, _linkTo, _text_area, _text_field, _dom, _environment, _renderer, _component2, _outlet, _root, _outlet2, _loc, _features) {\n 'use strict';\n\n exports.setupApplicationRegistry = setupApplicationRegistry;\n exports.setupEngineRegistry = setupEngineRegistry;\n\n var _templateObject = (0, _emberBabel.taggedTemplateLiteralLoose)(['template:-root'], ['template:-root']),\n _templateObject2 = (0, _emberBabel.taggedTemplateLiteralLoose)(['template:components/-default'], ['template:components/-default']),\n _templateObject3 = (0, _emberBabel.taggedTemplateLiteralLoose)(['component:-default'], ['component:-default']);\n\n function setupApplicationRegistry(registry) {\n registry.injection('service:-glimmer-environment', 'appendOperations', 'service:-dom-tree-construction');\n registry.injection('renderer', 'env', 'service:-glimmer-environment');\n registry.register((0, _container.privatize)(_templateObject), _root.default);\n registry.injection('renderer', 'rootTemplate', (0, _container.privatize)(_templateObject));\n registry.register('renderer:-dom', _renderer.InteractiveRenderer);\n registry.register('renderer:-inert', _renderer.InertRenderer);\n if (_emberEnvironment.environment.hasDOM) {\n registry.injection('service:-glimmer-environment', 'updateOperations', 'service:-dom-changes');\n }\n registry.register('service:-dom-changes', {\n create: function (_ref) {\n var document = _ref.document;\n\n return new _dom.DOMChanges(document);\n }\n });\n registry.register('service:-dom-tree-construction', {\n create: function (_ref2) {\n var document = _ref2.document;\n\n var Implementation = _emberEnvironment.environment.hasDOM ? _dom.DOMTreeConstruction : _dom.NodeDOMTreeConstruction;\n return new Implementation(document);\n }\n });\n }\n function setupEngineRegistry(registry) {\n registry.register('view:-outlet', _outlet2.default);\n registry.register('template:-outlet', _outlet.default);\n registry.injection('view:-outlet', 'template', 'template:-outlet');\n registry.injection('service:-dom-changes', 'document', 'service:-document');\n registry.injection('service:-dom-tree-construction', 'document', 'service:-document');\n registry.register((0, _container.privatize)(_templateObject2), _component2.default);\n registry.register('service:-glimmer-environment', _environment.default);\n registry.injection('template', 'env', 'service:-glimmer-environment');\n registry.optionsForType('helper', { instantiate: false });\n registry.register('helper:loc', _loc.default);\n registry.register('component:-text-field', _text_field.default);\n registry.register('component:-text-area', _text_area.default);\n registry.register('component:-checkbox', _checkbox.default);\n registry.register('component:link-to', _linkTo.default);\n if (!_features.EMBER_GLIMMER_TEMPLATE_ONLY_COMPONENTS) {\n registry.register((0, _container.privatize)(_templateObject3), _component.default);\n }\n }\n});","enifed('ember-glimmer/syntax', ['exports', 'ember-debug', 'ember-environment', 'ember-glimmer/syntax/-text-area', 'ember-glimmer/syntax/dynamic-component', 'ember-glimmer/syntax/input', 'ember-glimmer/syntax/mount', 'ember-glimmer/syntax/outlet', 'ember-glimmer/syntax/render', 'ember-glimmer/syntax/utils', 'ember-glimmer/utils/bindings'], function (exports, _emberDebug, _emberEnvironment, _textArea, _dynamicComponent, _input, _mount, _outlet, _render, _utils, _bindings) {\n 'use strict';\n\n exports.experimentalMacros = undefined;\n exports.registerMacros = registerMacros;\n exports.populateMacros = populateMacros;\n\n function refineInlineSyntax(name, params, hash, builder) {\n (true && !(!(builder.env.builtInHelpers[name] && builder.env.owner.hasRegistration('helper:' + name))) && (0, _emberDebug.assert)('You attempted to overwrite the built-in helper \"' + name + '\" which is not allowed. Please rename the helper.', !(builder.env.builtInHelpers[name] && builder.env.owner.hasRegistration('helper:' + name))));\n\n var definition = void 0;\n if (name.indexOf('-') > -1) {\n definition = builder.env.getComponentDefinition(name, builder.meta.templateMeta);\n }\n if (definition) {\n (0, _bindings.wrapComponentClassAttribute)(hash);\n builder.component.static(definition, [params, (0, _utils.hashToArgs)(hash), null, null]);\n return true;\n }\n return false;\n }\n function refineBlockSyntax(name, params, hash, _default, inverse, builder) {\n if (name.indexOf('-') === -1) {\n return false;\n }\n var meta = builder.meta.templateMeta;\n var definition = void 0;\n if (name.indexOf('-') > -1) {\n definition = builder.env.getComponentDefinition(name, meta);\n }\n if (definition) {\n (0, _bindings.wrapComponentClassAttribute)(hash);\n builder.component.static(definition, [params, (0, _utils.hashToArgs)(hash), _default, inverse]);\n return true;\n }\n (true && !(builder.env.hasHelper(name, meta)) && (0, _emberDebug.assert)('A component or helper named \"' + name + '\" could not be found', builder.env.hasHelper(name, meta)));\n (true && !(!builder.env.hasHelper(name, meta)) && (0, _emberDebug.assert)('Helpers may not be used in the block form, for example {{#' + name + '}}{{/' + name + '}}. Please use a component, or alternatively use the helper in combination with a built-in Ember helper, for example {{#if (' + name + ')}}{{/if}}.', !builder.env.hasHelper(name, meta)));\n\n return false;\n }\n var experimentalMacros = exports.experimentalMacros = [];\n // This is a private API to allow for experimental macros\n // to be created in user space. Registering a macro should\n // should be done in an initializer.\n function registerMacros(macro) {\n experimentalMacros.push(macro);\n }\n function populateMacros(blocks, inlines) {\n inlines.add('outlet', _outlet.outletMacro);\n inlines.add('component', _dynamicComponent.inlineComponentMacro);\n if (_emberEnvironment.ENV._ENABLE_RENDER_SUPPORT === true) {\n inlines.add('render', _render.renderMacro);\n }\n inlines.add('mount', _mount.mountMacro);\n inlines.add('input', _input.inputMacro);\n inlines.add('textarea', _textArea.textAreaMacro);\n inlines.addMissing(refineInlineSyntax);\n blocks.add('component', _dynamicComponent.blockComponentMacro);\n blocks.addMissing(refineBlockSyntax);\n for (var i = 0; i < experimentalMacros.length; i++) {\n var macro = experimentalMacros[i];\n macro(blocks, inlines);\n }\n return { blocks: blocks, inlines: inlines };\n }\n});","enifed('ember-glimmer/syntax/-text-area', ['exports', 'ember-glimmer/utils/bindings', 'ember-glimmer/syntax/utils'], function (exports, _bindings, _utils) {\n 'use strict';\n\n exports.textAreaMacro = textAreaMacro;\n function textAreaMacro(_name, params, hash, builder) {\n var definition = builder.env.getComponentDefinition('-text-area', builder.meta.templateMeta);\n (0, _bindings.wrapComponentClassAttribute)(hash);\n builder.component.static(definition, [params, (0, _utils.hashToArgs)(hash), null, null]);\n return true;\n }\n});","enifed('ember-glimmer/syntax/dynamic-component', ['exports', 'ember-babel', '@glimmer/runtime', 'ember-debug', 'ember-glimmer/syntax/utils'], function (exports, _emberBabel, _runtime, _emberDebug, _utils) {\n 'use strict';\n\n exports.dynamicComponentMacro = dynamicComponentMacro;\n exports.blockComponentMacro = blockComponentMacro;\n exports.inlineComponentMacro = inlineComponentMacro;\n\n function dynamicComponentFor(vm, args, meta) {\n var env = vm.env;\n var nameRef = args.positional.at(0);\n return new DynamicComponentReference({ nameRef: nameRef, env: env, meta: meta, args: null });\n }\n function dynamicComponentMacro(params, hash, _default, _inverse, builder) {\n var definitionArgs = [params.slice(0, 1), null, null, null];\n var args = [params.slice(1), (0, _utils.hashToArgs)(hash), null, null];\n builder.component.dynamic(definitionArgs, dynamicComponentFor, args);\n return true;\n }\n function blockComponentMacro(params, hash, _default, inverse, builder) {\n var definitionArgs = [params.slice(0, 1), null, null, null];\n var args = [params.slice(1), (0, _utils.hashToArgs)(hash), _default, inverse];\n builder.component.dynamic(definitionArgs, dynamicComponentFor, args);\n return true;\n }\n function inlineComponentMacro(_name, params, hash, builder) {\n var definitionArgs = [params.slice(0, 1), null, null, null];\n var args = [params.slice(1), (0, _utils.hashToArgs)(hash), null, null];\n builder.component.dynamic(definitionArgs, dynamicComponentFor, args);\n return true;\n }\n\n var DynamicComponentReference = function () {\n function DynamicComponentReference(_ref) {\n var nameRef = _ref.nameRef,\n env = _ref.env,\n meta = _ref.meta,\n args = _ref.args;\n (0, _emberBabel.classCallCheck)(this, DynamicComponentReference);\n\n this.tag = nameRef.tag;\n this.nameRef = nameRef;\n this.env = env;\n this.meta = meta;\n this.args = args;\n }\n\n DynamicComponentReference.prototype.value = function value() {\n var env = this.env,\n nameRef = this.nameRef,\n meta = this.meta;\n\n var nameOrDef = nameRef.value();\n if (typeof nameOrDef === 'string') {\n var definition = env.getComponentDefinition(nameOrDef, meta);\n // tslint:disable-next-line:max-line-length\n (true && !(!!definition) && (0, _emberDebug.assert)('Could not find component named \"' + nameOrDef + '\" (no component or template with that name was found)', !!definition));\n\n return definition;\n } else if ((0, _runtime.isComponentDefinition)(nameOrDef)) {\n return nameOrDef;\n } else {\n return null;\n }\n };\n\n DynamicComponentReference.prototype.get = function get() {};\n\n return DynamicComponentReference;\n }();\n});","enifed('ember-glimmer/syntax/input', ['exports', 'ember-debug', 'ember-glimmer/utils/bindings', 'ember-glimmer/syntax/dynamic-component', 'ember-glimmer/syntax/utils'], function (exports, _emberDebug, _bindings, _dynamicComponent, _utils) {\n 'use strict';\n\n exports.inputMacro = inputMacro;\n /**\n @module ember\n */\n function buildSyntax(type, params, hash, builder) {\n var definition = builder.env.getComponentDefinition(type, builder.meta.templateMeta);\n builder.component.static(definition, [params, (0, _utils.hashToArgs)(hash), null, null]);\n return true;\n }\n /**\n The `{{input}}` helper lets you create an HTML `<input />` component.\n It causes an `TextField` component to be rendered. For more info,\n see the [TextField](/api/ember/release/classes/TextField) docs and\n the [templates guide](https://emberjs.com/guides/templates/input-helpers/).\n \n ```handlebars\n {{input value=\"987\"}}\n ```\n \n renders as:\n \n ```HTML\n <input type=\"text\" value=\"987\" />\n ```\n \n ### Text field\n \n If no `type` option is specified, a default of type 'text' is used.\n Many of the standard HTML attributes may be passed to this helper.\n <table>\n <tr><td>`readonly`</td><td>`required`</td><td>`autofocus`</td></tr>\n <tr><td>`value`</td><td>`placeholder`</td><td>`disabled`</td></tr>\n <tr><td>`size`</td><td>`tabindex`</td><td>`maxlength`</td></tr>\n <tr><td>`name`</td><td>`min`</td><td>`max`</td></tr>\n <tr><td>`pattern`</td><td>`accept`</td><td>`autocomplete`</td></tr>\n <tr><td>`autosave`</td><td>`formaction`</td><td>`formenctype`</td></tr>\n <tr><td>`formmethod`</td><td>`formnovalidate`</td><td>`formtarget`</td></tr>\n <tr><td>`height`</td><td>`inputmode`</td><td>`multiple`</td></tr>\n <tr><td>`step`</td><td>`width`</td><td>`form`</td></tr>\n <tr><td>`selectionDirection`</td><td>`spellcheck`</td><td>&nbsp;</td></tr>\n </table>\n When set to a quoted string, these values will be directly applied to the HTML\n element. When left unquoted, these values will be bound to a property on the\n template's current rendering context (most typically a controller instance).\n A very common use of this helper is to bind the `value` of an input to an Object's attribute:\n \n ```handlebars\n Search:\n {{input value=searchWord}}\n ```\n \n In this example, the initial value in the `<input />` will be set to the value of `searchWord`.\n If the user changes the text, the value of `searchWord` will also be updated.\n \n ### Actions\n \n The helper can send multiple actions based on user events.\n The action property defines the action which is sent when\n the user presses the return key.\n \n ```handlebars\n {{input action=\"submit\"}}\n ```\n \n The helper allows some user events to send actions.\n \n * `enter`\n * `insert-newline`\n * `escape-press`\n * `focus-in`\n * `focus-out`\n * `key-press`\n * `key-up`\n \n For example, if you desire an action to be sent when the input is blurred,\n you only need to setup the action name to the event name property.\n \n ```handlebars\n {{input focus-out=\"alertMessage\"}}\n ```\n See more about [Text Support Actions](/api/ember/release/classes/TextField)\n \n ### Extending `TextField`\n \n Internally, `{{input type=\"text\"}}` creates an instance of `TextField`, passing\n arguments from the helper to `TextField`'s `create` method. You can extend the\n capabilities of text inputs in your applications by reopening this class. For example,\n if you are building a Bootstrap project where `data-*` attributes are used, you\n can add one to the `TextField`'s `attributeBindings` property:\n \n ```javascript\n import TextField from '@ember/component/text-field';\n TextField.reopen({\n attributeBindings: ['data-error']\n });\n ```\n \n Keep in mind when writing `TextField` subclasses that `TextField`\n itself extends `Component`. Expect isolated component semantics, not\n legacy 1.x view semantics (like `controller` being present).\n See more about [Ember components](/api/ember/release/classes/Component)\n \n ### Checkbox\n \n Checkboxes are special forms of the `{{input}}` helper. To create a `<checkbox />`:\n \n ```handlebars\n Emberize Everything:\n {{input type=\"checkbox\" name=\"isEmberized\" checked=isEmberized}}\n ```\n \n This will bind checked state of this checkbox to the value of `isEmberized` -- if either one changes,\n it will be reflected in the other.\n \n The following HTML attributes can be set via the helper:\n \n * `checked`\n * `disabled`\n * `tabindex`\n * `indeterminate`\n * `name`\n * `autofocus`\n * `form`\n \n ### Extending `Checkbox`\n \n Internally, `{{input type=\"checkbox\"}}` creates an instance of `Checkbox`, passing\n arguments from the helper to `Checkbox`'s `create` method. You can extend the\n capablilties of checkbox inputs in your applications by reopening this class. For example,\n if you wanted to add a css class to all checkboxes in your application:\n \n ```javascript\n import Checkbox from '@ember/component/checkbox';\n \n Checkbox.reopen({\n classNames: ['my-app-checkbox']\n });\n ```\n \n @method input\n @for Ember.Templates.helpers\n @param {Hash} options\n @public\n */\n function inputMacro(_name, params, hash, builder) {\n var keys = void 0;\n var values = void 0;\n var typeIndex = -1;\n var valueIndex = -1;\n if (hash) {\n keys = hash[0];\n values = hash[1];\n typeIndex = keys.indexOf('type');\n valueIndex = keys.indexOf('value');\n }\n if (!params) {\n params = [];\n }\n if (typeIndex > -1) {\n var typeArg = values[typeIndex];\n if (Array.isArray(typeArg)) {\n return (0, _dynamicComponent.dynamicComponentMacro)(params, hash, null, null, builder);\n } else if (typeArg === 'checkbox') {\n (true && !(valueIndex === -1) && (0, _emberDebug.assert)('{{input type=\\'checkbox\\'}} does not support setting `value=someBooleanValue`; ' + 'you must use `checked=someBooleanValue` instead.', valueIndex === -1));\n\n (0, _bindings.wrapComponentClassAttribute)(hash);\n return buildSyntax('-checkbox', params, hash, builder);\n }\n }\n return buildSyntax('-text-field', params, hash, builder);\n }\n});","enifed('ember-glimmer/syntax/mount', ['exports', 'ember-babel', 'ember-debug', 'ember/features', 'ember-glimmer/component-managers/mount', 'ember-glimmer/syntax/utils'], function (exports, _emberBabel, _emberDebug, _features, _mount, _utils) {\n 'use strict';\n\n exports.mountMacro = mountMacro;\n\n function dynamicEngineFor(vm, args, meta) {\n var env = vm.env;\n var nameRef = args.positional.at(0);\n return new DynamicEngineReference({ nameRef: nameRef, env: env, meta: meta });\n }\n /**\n The `{{mount}}` helper lets you embed a routeless engine in a template.\n Mounting an engine will cause an instance to be booted and its `application`\n template to be rendered.\n \n For example, the following template mounts the `ember-chat` engine:\n \n ```handlebars\n {{! application.hbs }}\n {{mount \"ember-chat\"}}\n ```\n \n Additionally, you can also pass in a `model` argument that will be\n set as the engines model. This can be an existing object:\n \n ```\n <div>\n {{mount 'admin' model=userSettings}}\n </div>\n ```\n \n Or an inline `hash`, and you can even pass components:\n \n ```\n <div>\n <h1>Application template!</h1>\n {{mount 'admin' model=(hash\n title='Secret Admin'\n signInButton=(component 'sign-in-button')\n )}}\n </div>\n ```\n \n @method mount\n @param {String} name Name of the engine to mount.\n @param {Object} [model] Object that will be set as\n the model of the engine.\n @for Ember.Templates.helpers\n @category ember-application-engines\n @public\n */\n function mountMacro(_name, params, hash, builder) {\n if (_features.EMBER_ENGINES_MOUNT_PARAMS) {\n (true && !(params.length === 1) && (0, _emberDebug.assert)('You can only pass a single positional argument to the {{mount}} helper, e.g. {{mount \"chat-engine\"}}.', params.length === 1));\n } else {\n (true && !(params.length === 1 && hash === null) && (0, _emberDebug.assert)('You can only pass a single argument to the {{mount}} helper, e.g. {{mount \"chat-engine\"}}.', params.length === 1 && hash === null));\n }\n var definitionArgs = [params.slice(0, 1), null, null, null];\n var args = [null, (0, _utils.hashToArgs)(hash), null, null];\n builder.component.dynamic(definitionArgs, dynamicEngineFor, args);\n return true;\n }\n\n var DynamicEngineReference = function () {\n function DynamicEngineReference(_ref) {\n var nameRef = _ref.nameRef,\n env = _ref.env,\n meta = _ref.meta;\n (0, _emberBabel.classCallCheck)(this, DynamicEngineReference);\n\n this.tag = nameRef.tag;\n this.nameRef = nameRef;\n this.env = env;\n this.meta = meta;\n this._lastName = undefined;\n this._lastDef = undefined;\n }\n\n DynamicEngineReference.prototype.value = function value() {\n var env = this.env,\n nameRef = this.nameRef;\n\n var nameOrDef = nameRef.value();\n if (typeof nameOrDef === 'string') {\n if (this._lastName === nameOrDef) {\n return this._lastDef;\n }\n (true && !(env.owner.hasRegistration('engine:' + nameOrDef)) && (0, _emberDebug.assert)('You used `{{mount \\'' + nameOrDef + '\\'}}`, but the engine \\'' + nameOrDef + '\\' can not be found.', env.owner.hasRegistration('engine:' + nameOrDef)));\n\n if (!env.owner.hasRegistration('engine:' + nameOrDef)) {\n return null;\n }\n this._lastName = nameOrDef;\n this._lastDef = new _mount.MountDefinition(nameOrDef);\n return this._lastDef;\n } else {\n (true && !(nameOrDef === null || nameOrDef === undefined) && (0, _emberDebug.assert)('Invalid engine name \\'' + nameOrDef + '\\' specified, engine name must be either a string, null or undefined.', nameOrDef === null || nameOrDef === undefined));\n\n return null;\n }\n };\n\n return DynamicEngineReference;\n }();\n});","enifed('ember-glimmer/syntax/outlet', ['exports', 'ember-babel', '@glimmer/reference', 'ember-glimmer/component-managers/outlet'], function (exports, _emberBabel, _reference, _outlet) {\n 'use strict';\n\n exports.outletMacro = outletMacro;\n\n var OutletComponentReference = function () {\n function OutletComponentReference(outletNameRef, parentOutletStateRef) {\n (0, _emberBabel.classCallCheck)(this, OutletComponentReference);\n\n this.outletNameRef = outletNameRef;\n this.parentOutletStateRef = parentOutletStateRef;\n this.definition = null;\n this.lastState = null;\n var outletStateTag = this.outletStateTag = _reference.UpdatableTag.create(parentOutletStateRef.tag);\n this.tag = (0, _reference.combine)([outletStateTag.inner, outletNameRef.tag]);\n }\n\n OutletComponentReference.prototype.value = function value() {\n var outletNameRef = this.outletNameRef,\n parentOutletStateRef = this.parentOutletStateRef,\n definition = this.definition,\n lastState = this.lastState;\n\n var outletName = outletNameRef.value();\n var outletStateRef = parentOutletStateRef.get('outlets').get(outletName);\n var newState = this.lastState = outletStateRef.value();\n this.outletStateTag.inner.update(outletStateRef.tag);\n definition = revalidate(definition, lastState, newState);\n var hasTemplate = newState && newState.render.template;\n if (definition) {\n return definition;\n } else if (hasTemplate) {\n return this.definition = new _outlet.OutletComponentDefinition(outletName, newState.render.template);\n } else {\n return this.definition = null;\n }\n };\n\n return OutletComponentReference;\n }();\n\n function revalidate(definition, lastState, newState) {\n if (!lastState && !newState) {\n return definition;\n }\n if (!lastState && newState || lastState && !newState) {\n return null;\n }\n if (newState.render.template === lastState.render.template && newState.render.controller === lastState.render.controller) {\n return definition;\n }\n return null;\n }\n function outletComponentFor(vm, args) {\n var _vm$dynamicScope = vm.dynamicScope(),\n outletState = _vm$dynamicScope.outletState;\n\n var outletNameRef = void 0;\n if (args.positional.length === 0) {\n outletNameRef = new _reference.ConstReference('main');\n } else {\n outletNameRef = args.positional.at(0);\n }\n return new OutletComponentReference(outletNameRef, outletState);\n }\n /**\n The `{{outlet}}` helper lets you specify where a child route will render in\n your template. An important use of the `{{outlet}}` helper is in your\n application's `application.hbs` file:\n \n ```handlebars\n {{! app/templates/application.hbs }}\n <!-- header content goes here, and will always display -->\n {{my-header}}\n <div class=\"my-dynamic-content\">\n <!-- this content will change based on the current route, which depends on the current URL -->\n {{outlet}}\n </div>\n <!-- footer content goes here, and will always display -->\n {{my-footer}}\n ```\n \n See [templates guide](https://emberjs.com/guides/templates/the-application-template/) for\n additional information on using `{{outlet}}` in `application.hbs`.\n You may also specify a name for the `{{outlet}}`, which is useful when using more than one\n `{{outlet}}` in a template:\n \n ```handlebars\n {{outlet \"menu\"}}\n {{outlet \"sidebar\"}}\n {{outlet \"main\"}}\n ```\n \n Your routes can then render into a specific one of these `outlet`s by specifying the `outlet`\n attribute in your `renderTemplate` function:\n \n ```app/routes/menu.js\n import Route from '@ember/routing/route';\n \n export default Route.extend({\n renderTemplate() {\n this.render({ outlet: 'menu' });\n }\n });\n ```\n \n See the [routing guide](https://emberjs.com/guides/routing/rendering-a-template/) for more\n information on how your `route` interacts with the `{{outlet}}` helper.\n Note: Your content __will not render__ if there isn't an `{{outlet}}` for it.\n \n @method outlet\n @param {String} [name]\n @for Ember.Templates.helpers\n @public\n */\n function outletMacro(_name, params, _hash, builder) {\n if (!params) {\n params = [];\n }\n var definitionArgs = [params.slice(0, 1), null, null, null];\n var emptyArgs = [[], null, null, null]; // FIXME\n builder.component.dynamic(definitionArgs, outletComponentFor, emptyArgs);\n return true;\n }\n});","enifed('ember-glimmer/syntax/render', ['exports', '@glimmer/reference', 'ember-debug', 'ember-glimmer/component-managers/render', 'ember-glimmer/syntax/utils'], function (exports, _reference, _emberDebug, _render, _utils) {\n 'use strict';\n\n exports.renderMacro = renderMacro;\n /**\n @module ember\n \n Remove after 3.4 once _ENABLE_RENDER_SUPPORT flag is no longer needed.\n */\n function makeComponentDefinition(vm, args) {\n var env = vm.env;\n var nameRef = args.positional.at(0);\n (true && !((0, _reference.isConst)(nameRef)) && (0, _emberDebug.assert)('The first argument of {{render}} must be quoted, e.g. {{render \"sidebar\"}}.', (0, _reference.isConst)(nameRef)));\n (true && !(args.positional.length === 1 || !(0, _reference.isConst)(args.positional.at(1))) && (0, _emberDebug.assert)('The second argument of {{render}} must be a path, e.g. {{render \"post\" post}}.', args.positional.length === 1 || !(0, _reference.isConst)(args.positional.at(1))));\n\n var templateName = nameRef.value();\n // tslint:disable-next-line:max-line-length\n (true && !(env.owner.hasRegistration('template:' + templateName)) && (0, _emberDebug.assert)('You used `{{render \\'' + templateName + '\\'}}`, but \\'' + templateName + '\\' can not be found as a template.', env.owner.hasRegistration('template:' + templateName)));\n\n var template = env.owner.lookup('template:' + templateName);\n var controllerName = void 0;\n if (args.named.has('controller')) {\n var controllerNameRef = args.named.get('controller');\n // tslint:disable-next-line:max-line-length\n (true && !((0, _reference.isConst)(controllerNameRef)) && (0, _emberDebug.assert)('The controller argument for {{render}} must be quoted, e.g. {{render \"sidebar\" controller=\"foo\"}}.', (0, _reference.isConst)(controllerNameRef)));\n\n // TODO should be ensuring this to string here\n controllerName = controllerNameRef.value();\n // tslint:disable-next-line:max-line-length\n (true && !(env.owner.hasRegistration('controller:' + controllerName)) && (0, _emberDebug.assert)('The controller name you supplied \\'' + controllerName + '\\' did not resolve to a controller.', env.owner.hasRegistration('controller:' + controllerName)));\n } else {\n controllerName = templateName;\n }\n if (args.positional.length === 1) {\n return new _reference.ConstReference(new _render.RenderDefinition(controllerName, template, env, _render.SINGLETON_RENDER_MANAGER));\n } else {\n return new _reference.ConstReference(new _render.RenderDefinition(controllerName, template, env, _render.NON_SINGLETON_RENDER_MANAGER));\n }\n }\n /**\n Calling ``{{render}}`` from within a template will insert another\n template that matches the provided name. The inserted template will\n access its properties on its own controller (rather than the controller\n of the parent template).\n \n If a view class with the same name exists, the view class also will be used.\n Note: A given controller may only be used *once* in your app in this manner.\n A singleton instance of the controller will be created for you.\n \n Example:\n \n ```app/controllers/navigation.js\n import Controller from '@ember/controller';\n \n export default Controller.extend({\n who: \"world\"\n });\n ```\n \n ```handlebars\n <!-- navigation.hbs -->\n Hello, {{who}}.\n ```\n \n ```handlebars\n <!-- application.hbs -->\n <h1>My great app</h1>\n {{render \"navigation\"}}\n ```\n \n ```html\n <h1>My great app</h1>\n <div class='ember-view'>\n Hello, world.\n </div>\n ```\n \n Optionally you may provide a second argument: a property path\n that will be bound to the `model` property of the controller.\n If a `model` property path is specified, then a new instance of the\n controller will be created and `{{render}}` can be used multiple times\n with the same name.\n \n For example if you had this `author` template.\n \n ```handlebars\n <div class=\"author\">\n Written by {{firstName}} {{lastName}}.\n Total Posts: {{postCount}}\n </div>\n ```\n \n You could render it inside the `post` template using the `render` helper.\n \n ```handlebars\n <div class=\"post\">\n <h1>{{title}}</h1>\n <div>{{body}}</div>\n {{render \"author\" author}}\n </div>\n ```\n \n @method render\n @for Ember.Templates.helpers\n @param {String} name\n @param {Object?} context\n @param {Hash} options\n @return {String} HTML string\n @public\n @deprecated Use a component instead\n */\n function renderMacro(_name, params, hash, builder) {\n if (!params) {\n params = [];\n }\n var definitionArgs = [params.slice(0), hash, null, null];\n var args = [params.slice(1), (0, _utils.hashToArgs)(hash), null, null];\n builder.component.dynamic(definitionArgs, makeComponentDefinition, args);\n return true;\n }\n});","enifed(\"ember-glimmer/syntax/utils\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.hashToArgs = hashToArgs;\n function hashToArgs(hash) {\n if (hash === null) {\n return null;\n }\n var names = hash[0].map(function (key) {\n return \"@\" + key;\n });\n return [names, hash[1]];\n }\n});","enifed('ember-glimmer/template', ['exports', 'ember-babel', '@glimmer/runtime', 'ember-utils'], function (exports, _emberBabel, _runtime, _emberUtils) {\n 'use strict';\n\n exports.WrappedTemplateFactory = undefined;\n exports.default = template;\n\n var WrappedTemplateFactory = exports.WrappedTemplateFactory = function () {\n function WrappedTemplateFactory(factory) {\n (0, _emberBabel.classCallCheck)(this, WrappedTemplateFactory);\n\n this.factory = factory;\n this.id = factory.id;\n this.meta = factory.meta;\n }\n\n WrappedTemplateFactory.prototype.create = function create(props) {\n var owner = props[_emberUtils.OWNER];\n return this.factory.create(props.env, { owner: owner });\n };\n\n return WrappedTemplateFactory;\n }();\n\n function template(json) {\n var factory = (0, _runtime.templateFactory)(json);\n return new WrappedTemplateFactory(factory);\n }\n});","enifed(\"ember-glimmer/template_registry\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.setTemplates = setTemplates;\n exports.getTemplates = getTemplates;\n exports.getTemplate = getTemplate;\n exports.hasTemplate = hasTemplate;\n exports.setTemplate = setTemplate;\n var TEMPLATES = {};\n function setTemplates(templates) {\n TEMPLATES = templates;\n }\n function getTemplates() {\n return TEMPLATES;\n }\n function getTemplate(name) {\n if (TEMPLATES.hasOwnProperty(name)) {\n return TEMPLATES[name];\n }\n }\n function hasTemplate(name) {\n return TEMPLATES.hasOwnProperty(name);\n }\n function setTemplate(name, template) {\n return TEMPLATES[name] = template;\n }\n});","enifed(\"ember-glimmer/templates/component\", [\"exports\", \"ember-glimmer/template\"], function (exports, _template) {\n \"use strict\";\n\n exports.default = (0, _template.default)({ \"id\": \"RxHsBKwy\", \"block\": \"{\\\"symbols\\\":[\\\"&default\\\"],\\\"statements\\\":[[11,1]],\\\"hasEval\\\":false}\", \"meta\": { \"moduleName\": \"packages/ember-glimmer/lib/templates/component.hbs\" } });\n});","enifed(\"ember-glimmer/templates/empty\", [\"exports\", \"ember-glimmer/template\"], function (exports, _template) {\n \"use strict\";\n\n exports.default = (0, _template.default)({ \"id\": \"5jp2oO+o\", \"block\": \"{\\\"symbols\\\":[],\\\"statements\\\":[],\\\"hasEval\\\":false}\", \"meta\": { \"moduleName\": \"packages/ember-glimmer/lib/templates/empty.hbs\" } });\n});","enifed(\"ember-glimmer/templates/link-to\", [\"exports\", \"ember-glimmer/template\"], function (exports, _template) {\n \"use strict\";\n\n exports.default = (0, _template.default)({ \"id\": \"VZn3uSPL\", \"block\": \"{\\\"symbols\\\":[\\\"&default\\\"],\\\"statements\\\":[[4,\\\"if\\\",[[20,[\\\"linkTitle\\\"]]],null,{\\\"statements\\\":[[1,[18,\\\"linkTitle\\\"],false]],\\\"parameters\\\":[]},{\\\"statements\\\":[[11,1]],\\\"parameters\\\":[]}]],\\\"hasEval\\\":false}\", \"meta\": { \"moduleName\": \"packages/ember-glimmer/lib/templates/link-to.hbs\" } });\n});","enifed(\"ember-glimmer/templates/outlet\", [\"exports\", \"ember-glimmer/template\"], function (exports, _template) {\n \"use strict\";\n\n exports.default = (0, _template.default)({ \"id\": \"/7rqcQ85\", \"block\": \"{\\\"symbols\\\":[],\\\"statements\\\":[[1,[18,\\\"outlet\\\"],false]],\\\"hasEval\\\":false}\", \"meta\": { \"moduleName\": \"packages/ember-glimmer/lib/templates/outlet.hbs\" } });\n});","enifed(\"ember-glimmer/templates/root\", [\"exports\", \"ember-glimmer/template\"], function (exports, _template) {\n \"use strict\";\n\n exports.default = (0, _template.default)({ \"id\": \"AdIsk/cm\", \"block\": \"{\\\"symbols\\\":[],\\\"statements\\\":[[1,[25,\\\"component\\\",[[19,0,[]]],null],false]],\\\"hasEval\\\":false}\", \"meta\": { \"moduleName\": \"packages/ember-glimmer/lib/templates/root.hbs\" } });\n});","enifed('ember-glimmer/utils/bindings', ['exports', 'ember-babel', '@glimmer/reference', '@glimmer/wire-format', 'ember-debug', 'ember-metal', 'ember-runtime', 'ember-glimmer/component', 'ember-glimmer/utils/string'], function (exports, _emberBabel, _reference, _wireFormat, _emberDebug, _emberMetal, _emberRuntime, _component, _string) {\n 'use strict';\n\n exports.ClassNameBinding = exports.IsVisibleBinding = exports.AttributeBinding = undefined;\n exports.wrapComponentClassAttribute = wrapComponentClassAttribute;\n\n function referenceForKey(component, key) {\n return component[_component.ROOT_REF].get(key);\n }\n function referenceForParts(component, parts) {\n var isAttrs = parts[0] === 'attrs';\n // TODO deprecate this\n if (isAttrs) {\n parts.shift();\n if (parts.length === 1) {\n return referenceForKey(component, parts[0]);\n }\n }\n return (0, _reference.referenceFromParts)(component[_component.ROOT_REF], parts);\n }\n // TODO we should probably do this transform at build time\n function wrapComponentClassAttribute(hash) {\n if (!hash) {\n return hash;\n }\n var keys = hash[0],\n values = hash[1];\n\n var index = keys.indexOf('class');\n if (index !== -1) {\n var _values$index = values[index],\n type = _values$index[0];\n\n if (type === _wireFormat.Ops.Get || type === _wireFormat.Ops.MaybeLocal) {\n var getExp = values[index];\n var path = getExp[getExp.length - 1];\n var propName = path[path.length - 1];\n hash[1][index] = [_wireFormat.Ops.Helper, ['-class'], [getExp, propName]];\n }\n }\n return hash;\n }\n var AttributeBinding = exports.AttributeBinding = {\n parse: function (microsyntax) {\n var colonIndex = microsyntax.indexOf(':');\n if (colonIndex === -1) {\n (true && !(microsyntax !== 'class') && (0, _emberDebug.assert)('You cannot use class as an attributeBinding, use classNameBindings instead.', microsyntax !== 'class'));\n\n return [microsyntax, microsyntax, true];\n } else {\n var prop = microsyntax.substring(0, colonIndex);\n var attribute = microsyntax.substring(colonIndex + 1);\n (true && !(attribute !== 'class') && (0, _emberDebug.assert)('You cannot use class as an attributeBinding, use classNameBindings instead.', attribute !== 'class'));\n\n return [prop, attribute, false];\n }\n },\n install: function (element, component, parsed, operations) {\n var prop = parsed[0],\n attribute = parsed[1],\n isSimple = parsed[2];\n\n if (attribute === 'id') {\n var elementId = (0, _emberMetal.get)(component, prop);\n if (elementId === undefined || elementId === null) {\n elementId = component.elementId;\n }\n operations.addStaticAttribute(element, 'id', elementId);\n return;\n }\n var isPath = prop.indexOf('.') > -1;\n var reference = isPath ? referenceForParts(component, prop.split('.')) : referenceForKey(component, prop);\n (true && !(!(isSimple && isPath)) && (0, _emberDebug.assert)('Illegal attributeBinding: \\'' + prop + '\\' is not a valid attribute name.', !(isSimple && isPath)));\n\n if (attribute === 'style') {\n reference = new StyleBindingReference(reference, referenceForKey(component, 'isVisible'));\n }\n operations.addDynamicAttribute(element, attribute, reference, false);\n }\n };\n var DISPLAY_NONE = 'display: none;';\n var SAFE_DISPLAY_NONE = (0, _string.htmlSafe)(DISPLAY_NONE);\n\n var StyleBindingReference = function (_CachedReference) {\n (0, _emberBabel.inherits)(StyleBindingReference, _CachedReference);\n\n function StyleBindingReference(inner, isVisible) {\n (0, _emberBabel.classCallCheck)(this, StyleBindingReference);\n\n var _this = (0, _emberBabel.possibleConstructorReturn)(this, _CachedReference.call(this));\n\n _this.inner = inner;\n _this.isVisible = isVisible;\n _this.tag = (0, _reference.combine)([inner.tag, isVisible.tag]);\n return _this;\n }\n\n StyleBindingReference.prototype.compute = function compute() {\n var value = this.inner.value();\n var isVisible = this.isVisible.value();\n if (isVisible !== false) {\n return value;\n } else if (!value) {\n return SAFE_DISPLAY_NONE;\n } else {\n var style = value + ' ' + DISPLAY_NONE;\n return (0, _string.isHTMLSafe)(value) ? (0, _string.htmlSafe)(style) : style;\n }\n };\n\n return StyleBindingReference;\n }(_reference.CachedReference);\n\n var IsVisibleBinding = exports.IsVisibleBinding = {\n install: function (element, component, operations) {\n var ref = (0, _reference.map)(referenceForKey(component, 'isVisible'), this.mapStyleValue);\n // the upstream type for addDynamicAttribute's `value` argument\n // appears to be incorrect. It is currently a Reference<string>, I\n // think it should be a Reference<string|null>.\n operations.addDynamicAttribute(element, 'style', ref, false);\n },\n mapStyleValue: function (isVisible) {\n return isVisible === false ? SAFE_DISPLAY_NONE : null;\n }\n };\n var ClassNameBinding = exports.ClassNameBinding = {\n install: function (element, component, microsyntax, operations) {\n var _microsyntax$split = microsyntax.split(':'),\n prop = _microsyntax$split[0],\n truthy = _microsyntax$split[1],\n falsy = _microsyntax$split[2];\n\n var isStatic = prop === '';\n if (isStatic) {\n operations.addStaticAttribute(element, 'class', truthy);\n } else {\n var isPath = prop.indexOf('.') > -1;\n var parts = isPath ? prop.split('.') : [];\n var value = isPath ? referenceForParts(component, parts) : referenceForKey(component, prop);\n var ref = void 0;\n if (truthy === undefined) {\n ref = new SimpleClassNameBindingReference(value, isPath ? parts[parts.length - 1] : prop);\n } else {\n ref = new ColonClassNameBindingReference(value, truthy, falsy);\n }\n // the upstream type for addDynamicAttribute's `value` argument\n // appears to be incorrect. It is currently a Reference<string>, I\n // think it should be a Reference<string|null>.\n operations.addDynamicAttribute(element, 'class', ref, false);\n }\n }\n };\n\n var SimpleClassNameBindingReference = function (_CachedReference2) {\n (0, _emberBabel.inherits)(SimpleClassNameBindingReference, _CachedReference2);\n\n function SimpleClassNameBindingReference(inner, path) {\n (0, _emberBabel.classCallCheck)(this, SimpleClassNameBindingReference);\n\n var _this2 = (0, _emberBabel.possibleConstructorReturn)(this, _CachedReference2.call(this));\n\n _this2.inner = inner;\n _this2.path = path;\n _this2.tag = inner.tag;\n _this2.inner = inner;\n _this2.path = path;\n _this2.dasherizedPath = null;\n return _this2;\n }\n\n SimpleClassNameBindingReference.prototype.compute = function compute() {\n var value = this.inner.value();\n if (value === true) {\n var path = this.path,\n dasherizedPath = this.dasherizedPath;\n\n return dasherizedPath || (this.dasherizedPath = _emberRuntime.String.dasherize(path));\n } else if (value || value === 0) {\n return String(value);\n } else {\n return null;\n }\n };\n\n return SimpleClassNameBindingReference;\n }(_reference.CachedReference);\n\n var ColonClassNameBindingReference = function (_CachedReference3) {\n (0, _emberBabel.inherits)(ColonClassNameBindingReference, _CachedReference3);\n\n function ColonClassNameBindingReference(inner) {\n var truthy = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n var falsy = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n (0, _emberBabel.classCallCheck)(this, ColonClassNameBindingReference);\n\n var _this3 = (0, _emberBabel.possibleConstructorReturn)(this, _CachedReference3.call(this));\n\n _this3.inner = inner;\n _this3.truthy = truthy;\n _this3.falsy = falsy;\n _this3.tag = inner.tag;\n return _this3;\n }\n\n ColonClassNameBindingReference.prototype.compute = function compute() {\n var inner = this.inner,\n truthy = this.truthy,\n falsy = this.falsy;\n\n return inner.value() ? truthy : falsy;\n };\n\n return ColonClassNameBindingReference;\n }(_reference.CachedReference);\n});","enifed('ember-glimmer/utils/curly-component-state-bucket', ['exports', 'ember-babel'], function (exports, _emberBabel) {\n 'use strict';\n\n // tslint:disable-next-line:no-empty\n function NOOP() {}\n /**\n @module ember\n */\n /**\n Represents the internal state of the component.\n \n @class ComponentStateBucket\n @private\n */\n\n var ComponentStateBucket = function () {\n function ComponentStateBucket(environment, component, args, finalizer) {\n (0, _emberBabel.classCallCheck)(this, ComponentStateBucket);\n\n this.environment = environment;\n this.component = component;\n this.args = args;\n this.finalizer = finalizer;\n this.classRef = null;\n this.classRef = null;\n this.argsRevision = args.tag.value();\n }\n\n ComponentStateBucket.prototype.destroy = function destroy() {\n var component = this.component,\n environment = this.environment;\n\n if (environment.isInteractive) {\n component.trigger('willDestroyElement');\n component.trigger('willClearRender');\n }\n environment.destroyedComponents.push(component);\n };\n\n ComponentStateBucket.prototype.finalize = function finalize() {\n var finalizer = this.finalizer;\n\n finalizer();\n this.finalizer = NOOP;\n };\n\n return ComponentStateBucket;\n }();\n\n exports.default = ComponentStateBucket;\n});","enifed('ember-glimmer/utils/debug-stack', ['exports', 'ember-babel'], function (exports, _emberBabel) {\n 'use strict';\n\n // @ts-check\n var DebugStack = void 0;\n if (true) {\n var Element = function Element(name) {\n (0, _emberBabel.classCallCheck)(this, Element);\n\n this.name = name;\n };\n\n var TemplateElement = function (_Element) {\n (0, _emberBabel.inherits)(TemplateElement, _Element);\n\n function TemplateElement() {\n (0, _emberBabel.classCallCheck)(this, TemplateElement);\n return (0, _emberBabel.possibleConstructorReturn)(this, _Element.apply(this, arguments));\n }\n\n return TemplateElement;\n }(Element);\n\n var EngineElement = function (_Element2) {\n (0, _emberBabel.inherits)(EngineElement, _Element2);\n\n function EngineElement() {\n (0, _emberBabel.classCallCheck)(this, EngineElement);\n return (0, _emberBabel.possibleConstructorReturn)(this, _Element2.apply(this, arguments));\n }\n\n return EngineElement;\n }(Element);\n\n // tslint:disable-next-line:no-shadowed-variable\n DebugStack = function () {\n function DebugStack() {\n (0, _emberBabel.classCallCheck)(this, DebugStack);\n\n this._stack = [];\n }\n\n DebugStack.prototype.push = function push(name) {\n this._stack.push(new TemplateElement(name));\n };\n\n DebugStack.prototype.pushEngine = function pushEngine(name) {\n this._stack.push(new EngineElement(name));\n };\n\n DebugStack.prototype.pop = function pop() {\n var element = this._stack.pop();\n if (element) {\n return element.name;\n }\n };\n\n DebugStack.prototype.peek = function peek() {\n var template = this._currentTemplate();\n var engine = this._currentEngine();\n if (engine) {\n return '\"' + template + '\" (in \"' + engine + '\")';\n } else if (template) {\n return '\"' + template + '\"';\n }\n };\n\n DebugStack.prototype._currentTemplate = function _currentTemplate() {\n return this._getCurrentByType(TemplateElement);\n };\n\n DebugStack.prototype._currentEngine = function _currentEngine() {\n return this._getCurrentByType(EngineElement);\n };\n\n DebugStack.prototype._getCurrentByType = function _getCurrentByType(type) {\n for (var i = this._stack.length; i >= 0; i--) {\n var element = this._stack[i];\n if (element instanceof type) {\n return element.name;\n }\n }\n };\n\n return DebugStack;\n }();\n }\n exports.default = DebugStack;\n});","enifed('ember-glimmer/utils/iterable', ['exports', 'ember-babel', '@glimmer/reference', 'ember-metal', 'ember-runtime', 'ember-utils', 'ember-glimmer/helpers/each-in', 'ember-glimmer/utils/references'], function (exports, _emberBabel, _reference, _emberMetal, _emberRuntime, _emberUtils, _eachIn, _references) {\n 'use strict';\n\n exports.default = iterableFor;\n\n var ITERATOR_KEY_GUID = 'be277757-bbbe-4620-9fcb-213ef433cca2';\n function iterableFor(ref, keyPath) {\n if ((0, _eachIn.isEachIn)(ref)) {\n return new EachInIterable(ref, keyForEachIn(keyPath));\n } else {\n return new ArrayIterable(ref, keyForArray(keyPath));\n }\n }\n function keyForEachIn(keyPath) {\n switch (keyPath) {\n case '@index':\n case undefined:\n case null:\n return index;\n case '@identity':\n return identity;\n default:\n return function (item) {\n return (0, _emberMetal.get)(item, keyPath);\n };\n }\n }\n function keyForArray(keyPath) {\n switch (keyPath) {\n case '@index':\n return index;\n case '@identity':\n case undefined:\n case null:\n return identity;\n default:\n return function (item) {\n return (0, _emberMetal.get)(item, keyPath);\n };\n }\n }\n function index(_item, i) {\n return String(i);\n }\n function identity(item) {\n switch (typeof item) {\n case 'string':\n case 'number':\n return String(item);\n default:\n return (0, _emberUtils.guidFor)(item);\n }\n }\n function ensureUniqueKey(seen, key) {\n var seenCount = seen[key];\n if (seenCount > 0) {\n seen[key]++;\n return '' + key + ITERATOR_KEY_GUID + seenCount;\n } else {\n seen[key] = 1;\n }\n return key;\n }\n\n var ArrayIterator = function () {\n function ArrayIterator(array, length, keyFor) {\n (0, _emberBabel.classCallCheck)(this, ArrayIterator);\n\n this.array = array;\n this.length = length;\n this.keyFor = keyFor;\n this.position = 0;\n this.seen = Object.create(null);\n }\n\n ArrayIterator.from = function from(array, keyFor) {\n var length = array.length;\n\n if (length > 0) {\n return new this(array, array.length, keyFor);\n } else {\n return EMPTY_ITERATOR;\n }\n };\n\n ArrayIterator.prototype.isEmpty = function isEmpty() {\n return false;\n };\n\n ArrayIterator.prototype.getMemo = function getMemo(position) {\n return position;\n };\n\n ArrayIterator.prototype.getValue = function getValue(position) {\n return this.array[position];\n };\n\n ArrayIterator.prototype.next = function next() {\n var length = this.length,\n keyFor = this.keyFor,\n position = this.position,\n seen = this.seen;\n\n if (position >= length) {\n return null;\n }\n var value = this.getValue(position);\n var memo = this.getMemo(position);\n var key = ensureUniqueKey(seen, keyFor(value, memo));\n this.position++;\n return { key: key, value: value, memo: memo };\n };\n\n return ArrayIterator;\n }();\n\n var EmberArrayIterator = function (_ArrayIterator) {\n (0, _emberBabel.inherits)(EmberArrayIterator, _ArrayIterator);\n\n EmberArrayIterator.from = function from(array, keyFor) {\n var length = (0, _emberMetal.get)(array, 'length');\n if (length > 0) {\n return new this(array, length, keyFor);\n } else {\n return EMPTY_ITERATOR;\n }\n };\n\n function EmberArrayIterator(array, length, keyFor) {\n (0, _emberBabel.classCallCheck)(this, EmberArrayIterator);\n return (0, _emberBabel.possibleConstructorReturn)(this, _ArrayIterator.call(this, array, length, keyFor));\n }\n\n EmberArrayIterator.prototype.getValue = function getValue(position) {\n return (0, _emberRuntime.objectAt)(this.array, position);\n };\n\n return EmberArrayIterator;\n }(ArrayIterator);\n\n var ObjectKeysIterator = function (_ArrayIterator2) {\n (0, _emberBabel.inherits)(ObjectKeysIterator, _ArrayIterator2);\n\n function ObjectKeysIterator(keys, values, length, keyFor) {\n (0, _emberBabel.classCallCheck)(this, ObjectKeysIterator);\n\n var _this2 = (0, _emberBabel.possibleConstructorReturn)(this, _ArrayIterator2.call(this, values, length, keyFor));\n\n _this2.keys = keys;\n return _this2;\n }\n\n ObjectKeysIterator.from = function from(obj, keyFor) {\n var keys = Object.keys(obj);\n var length = keys.length;\n\n if (length > 0) {\n return new this(keys, keys.map(function (key) {\n return obj[key];\n }), length, keyFor);\n } else {\n return EMPTY_ITERATOR;\n }\n };\n\n ObjectKeysIterator.prototype.getMemo = function getMemo(position) {\n return this.keys[position];\n };\n\n return ObjectKeysIterator;\n }(ArrayIterator);\n\n var EmptyIterator = function () {\n function EmptyIterator() {\n (0, _emberBabel.classCallCheck)(this, EmptyIterator);\n }\n\n EmptyIterator.prototype.isEmpty = function isEmpty() {\n return true;\n };\n\n EmptyIterator.prototype.next = function next() {\n throw new Error('Cannot call next() on an empty iterator');\n };\n\n return EmptyIterator;\n }();\n\n var EMPTY_ITERATOR = new EmptyIterator();\n\n var EachInIterable = function () {\n function EachInIterable(ref, keyFor) {\n (0, _emberBabel.classCallCheck)(this, EachInIterable);\n\n this.ref = ref;\n this.keyFor = keyFor;\n var valueTag = this.valueTag = _reference.UpdatableTag.create(_reference.CONSTANT_TAG);\n this.tag = (0, _reference.combine)([ref.tag, valueTag]);\n }\n\n EachInIterable.prototype.iterate = function iterate() {\n var ref = this.ref,\n keyFor = this.keyFor,\n valueTag = this.valueTag;\n\n var iterable = ref.value();\n valueTag.inner.update((0, _emberMetal.tagFor)(iterable));\n if ((0, _emberMetal.isProxy)(iterable)) {\n iterable = (0, _emberMetal.get)(iterable, 'content');\n }\n var typeofIterable = typeof iterable;\n if (iterable !== null && (typeofIterable === 'object' || typeofIterable === 'function')) {\n return ObjectKeysIterator.from(iterable, keyFor);\n } else {\n return EMPTY_ITERATOR;\n }\n };\n\n EachInIterable.prototype.valueReferenceFor = function valueReferenceFor(item) {\n return new _references.UpdatablePrimitiveReference(item.memo);\n };\n\n EachInIterable.prototype.updateValueReference = function updateValueReference(reference, item) {\n reference.update(item.memo);\n };\n\n EachInIterable.prototype.memoReferenceFor = function memoReferenceFor(item) {\n return new _references.UpdatableReference(item.value);\n };\n\n EachInIterable.prototype.updateMemoReference = function updateMemoReference(reference, item) {\n reference.update(item.value);\n };\n\n return EachInIterable;\n }();\n\n var ArrayIterable = function () {\n function ArrayIterable(ref, keyFor) {\n (0, _emberBabel.classCallCheck)(this, ArrayIterable);\n\n this.ref = ref;\n this.keyFor = keyFor;\n var valueTag = this.valueTag = _reference.UpdatableTag.create(_reference.CONSTANT_TAG);\n this.tag = (0, _reference.combine)([ref.tag, valueTag]);\n }\n\n ArrayIterable.prototype.iterate = function iterate() {\n var ref = this.ref,\n keyFor = this.keyFor,\n valueTag = this.valueTag;\n\n var iterable = ref.value();\n valueTag.inner.update((0, _emberMetal.tagForProperty)(iterable, '[]'));\n if (iterable === null || typeof iterable !== 'object') {\n return EMPTY_ITERATOR;\n }\n if (Array.isArray(iterable)) {\n return ArrayIterator.from(iterable, keyFor);\n } else if ((0, _emberRuntime.isEmberArray)(iterable)) {\n return EmberArrayIterator.from(iterable, keyFor);\n } else if (typeof iterable.forEach === 'function') {\n var array = [];\n iterable.forEach(function (item) {\n return array.push(item);\n });\n return ArrayIterator.from(array, keyFor);\n } else {\n return EMPTY_ITERATOR;\n }\n };\n\n ArrayIterable.prototype.valueReferenceFor = function valueReferenceFor(item) {\n return new _references.UpdatableReference(item.value);\n };\n\n ArrayIterable.prototype.updateValueReference = function updateValueReference(reference, item) {\n reference.update(item.value);\n };\n\n ArrayIterable.prototype.memoReferenceFor = function memoReferenceFor(item) {\n return new _references.UpdatablePrimitiveReference(item.memo);\n };\n\n ArrayIterable.prototype.updateMemoReference = function updateMemoReference(reference, item) {\n reference.update(item.memo);\n };\n\n return ArrayIterable;\n }();\n});","enifed('ember-glimmer/utils/process-args', ['exports', 'ember-babel', 'ember-utils', 'ember-views', 'ember-glimmer/component', 'ember-glimmer/helpers/action', 'ember-glimmer/utils/references'], function (exports, _emberBabel, _emberUtils, _emberViews, _component, _action, _references) {\n 'use strict';\n\n exports.processComponentArgs = processComponentArgs;\n\n // ComponentArgs takes EvaluatedNamedArgs and converts them into the\n // inputs needed by CurlyComponents (attrs and props, with mutable\n // cells, etc).\n function processComponentArgs(namedArgs) {\n var keys = namedArgs.names;\n var attrs = namedArgs.value();\n var props = Object.create(null);\n var args = Object.create(null);\n props[_component.ARGS] = args;\n for (var i = 0; i < keys.length; i++) {\n var name = keys[i];\n var ref = namedArgs.get(name);\n var value = attrs[name];\n if (typeof value === 'function' && value[_action.ACTION]) {\n attrs[name] = value;\n } else if (ref[_references.UPDATE]) {\n attrs[name] = new MutableCell(ref, value);\n }\n args[name] = ref;\n props[name] = value;\n }\n props.attrs = attrs;\n return props;\n }\n var REF = (0, _emberUtils.symbol)('REF');\n\n var MutableCell = function () {\n function MutableCell(ref, value) {\n (0, _emberBabel.classCallCheck)(this, MutableCell);\n\n this[_emberViews.MUTABLE_CELL] = true;\n this[REF] = ref;\n this.value = value;\n }\n\n MutableCell.prototype.update = function update(val) {\n this[REF][_references.UPDATE](val);\n };\n\n return MutableCell;\n }();\n});","enifed('ember-glimmer/utils/references', ['exports', 'ember-babel', '@glimmer/reference', '@glimmer/runtime', 'ember-metal', 'ember-utils', 'ember/features', 'ember-glimmer/helper', 'ember-glimmer/utils/to-bool'], function (exports, _emberBabel, _reference, _runtime, _emberMetal, _emberUtils, _features, _helper, _toBool) {\n 'use strict';\n\n exports.UnboundReference = exports.InternalHelperReference = exports.ClassBasedHelperReference = exports.SimpleHelperReference = exports.ConditionalReference = exports.UpdatablePrimitiveReference = exports.UpdatableReference = exports.NestedPropertyReference = exports.RootPropertyReference = exports.PropertyReference = exports.RootReference = exports.CachedReference = exports.UPDATE = undefined;\n var UPDATE = exports.UPDATE = (0, _emberUtils.symbol)('UPDATE');\n var maybeFreeze = void 0;\n if (true) {\n // gaurding this in a DEBUG gaurd (as well as all invocations)\n // so that it is properly stripped during the minification's\n // dead code elimination\n maybeFreeze = function (obj) {\n // re-freezing an already frozen object introduces a significant\n // performance penalty on Chrome (tested through 59).\n //\n // See: https://bugs.chromium.org/p/v8/issues/detail?id=6450\n if (!Object.isFrozen(obj)) {\n Object.freeze(obj);\n }\n };\n }\n // @abstract\n // @implements PathReference\n\n var EmberPathReference = function () {\n function EmberPathReference() {\n (0, _emberBabel.classCallCheck)(this, EmberPathReference);\n }\n\n EmberPathReference.prototype.get = function get(key) {\n return PropertyReference.create(this, key);\n };\n\n return EmberPathReference;\n }();\n\n var CachedReference = exports.CachedReference = function (_EmberPathReference) {\n (0, _emberBabel.inherits)(CachedReference, _EmberPathReference);\n\n function CachedReference() {\n (0, _emberBabel.classCallCheck)(this, CachedReference);\n\n var _this = (0, _emberBabel.possibleConstructorReturn)(this, _EmberPathReference.call(this));\n\n _this._lastRevision = null;\n _this._lastValue = null;\n return _this;\n }\n\n CachedReference.prototype.compute = function compute() {};\n\n CachedReference.prototype.value = function value() {\n var tag = this.tag,\n _lastRevision = this._lastRevision,\n _lastValue = this._lastValue;\n\n if (!_lastRevision || !tag.validate(_lastRevision)) {\n _lastValue = this._lastValue = this.compute();\n this._lastRevision = tag.value();\n }\n return _lastValue;\n };\n\n return CachedReference;\n }(EmberPathReference);\n\n var RootReference = exports.RootReference = function (_ConstReference) {\n (0, _emberBabel.inherits)(RootReference, _ConstReference);\n\n function RootReference(value) {\n (0, _emberBabel.classCallCheck)(this, RootReference);\n\n var _this2 = (0, _emberBabel.possibleConstructorReturn)(this, _ConstReference.call(this, value));\n\n _this2.children = Object.create(null);\n return _this2;\n }\n\n RootReference.prototype.get = function get(propertyKey) {\n var ref = this.children[propertyKey];\n if (ref === undefined) {\n ref = this.children[propertyKey] = new RootPropertyReference(this.inner, propertyKey);\n }\n return ref;\n };\n\n return RootReference;\n }(_reference.ConstReference);\n\n var TwoWayFlushDetectionTag = void 0;\n if (_features.EMBER_GLIMMER_DETECT_BACKTRACKING_RERENDER) {\n TwoWayFlushDetectionTag = function () {\n function TwoWayFlushDetectionTag(tag, key, ref) {\n (0, _emberBabel.classCallCheck)(this, TwoWayFlushDetectionTag);\n\n this.tag = tag;\n this.parent = null;\n this.key = key;\n this.ref = ref;\n }\n\n TwoWayFlushDetectionTag.prototype.value = function value() {\n return this.tag.value();\n };\n\n TwoWayFlushDetectionTag.prototype.validate = function validate(ticket) {\n var parent = this.parent,\n key = this.key;\n\n var isValid = this.tag.validate(ticket);\n if (isValid && parent) {\n (0, _emberMetal.didRender)(parent, key, this.ref);\n }\n return isValid;\n };\n\n TwoWayFlushDetectionTag.prototype.didCompute = function didCompute(parent) {\n this.parent = parent;\n (0, _emberMetal.didRender)(parent, this.key, this.ref);\n };\n\n return TwoWayFlushDetectionTag;\n }();\n }\n\n var PropertyReference = exports.PropertyReference = function (_CachedReference) {\n (0, _emberBabel.inherits)(PropertyReference, _CachedReference);\n\n function PropertyReference() {\n (0, _emberBabel.classCallCheck)(this, PropertyReference);\n return (0, _emberBabel.possibleConstructorReturn)(this, _CachedReference.apply(this, arguments));\n }\n\n PropertyReference.create = function create(parentReference, propertyKey) {\n if ((0, _reference.isConst)(parentReference)) {\n return new RootPropertyReference(parentReference.value(), propertyKey);\n } else {\n return new NestedPropertyReference(parentReference, propertyKey);\n }\n };\n\n PropertyReference.prototype.get = function get(key) {\n return new NestedPropertyReference(this, key);\n };\n\n return PropertyReference;\n }(CachedReference);\n\n var RootPropertyReference = exports.RootPropertyReference = function (_PropertyReference) {\n (0, _emberBabel.inherits)(RootPropertyReference, _PropertyReference);\n\n function RootPropertyReference(parentValue, propertyKey) {\n (0, _emberBabel.classCallCheck)(this, RootPropertyReference);\n\n var _this4 = (0, _emberBabel.possibleConstructorReturn)(this, _PropertyReference.call(this));\n\n _this4._parentValue = parentValue;\n _this4._propertyKey = propertyKey;\n if (_features.EMBER_GLIMMER_DETECT_BACKTRACKING_RERENDER) {\n _this4.tag = new TwoWayFlushDetectionTag((0, _emberMetal.tagForProperty)(parentValue, propertyKey), propertyKey, _this4);\n } else {\n _this4.tag = (0, _emberMetal.tagForProperty)(parentValue, propertyKey);\n }\n if (_features.MANDATORY_SETTER) {\n (0, _emberMetal.watchKey)(parentValue, propertyKey);\n }\n return _this4;\n }\n\n RootPropertyReference.prototype.compute = function compute() {\n var _parentValue = this._parentValue,\n _propertyKey = this._propertyKey;\n\n if (_features.EMBER_GLIMMER_DETECT_BACKTRACKING_RERENDER) {\n this.tag.didCompute(_parentValue);\n }\n return (0, _emberMetal.get)(_parentValue, _propertyKey);\n };\n\n RootPropertyReference.prototype[UPDATE] = function (value) {\n (0, _emberMetal.set)(this._parentValue, this._propertyKey, value);\n };\n\n return RootPropertyReference;\n }(PropertyReference);\n\n var NestedPropertyReference = exports.NestedPropertyReference = function (_PropertyReference2) {\n (0, _emberBabel.inherits)(NestedPropertyReference, _PropertyReference2);\n\n function NestedPropertyReference(parentReference, propertyKey) {\n (0, _emberBabel.classCallCheck)(this, NestedPropertyReference);\n\n var _this5 = (0, _emberBabel.possibleConstructorReturn)(this, _PropertyReference2.call(this));\n\n var parentReferenceTag = parentReference.tag;\n var parentObjectTag = _reference.UpdatableTag.create(_reference.CONSTANT_TAG);\n _this5._parentReference = parentReference;\n _this5._parentObjectTag = parentObjectTag;\n _this5._propertyKey = propertyKey;\n if (_features.EMBER_GLIMMER_DETECT_BACKTRACKING_RERENDER) {\n var tag = (0, _reference.combine)([parentReferenceTag, parentObjectTag]);\n _this5.tag = new TwoWayFlushDetectionTag(tag, propertyKey, _this5);\n } else {\n _this5.tag = (0, _reference.combine)([parentReferenceTag, parentObjectTag]);\n }\n return _this5;\n }\n\n NestedPropertyReference.prototype.compute = function compute() {\n var _parentReference = this._parentReference,\n _parentObjectTag = this._parentObjectTag,\n _propertyKey = this._propertyKey;\n\n var parentValue = _parentReference.value();\n _parentObjectTag.inner.update((0, _emberMetal.tagForProperty)(parentValue, _propertyKey));\n var parentValueType = typeof parentValue;\n if (parentValueType === 'string' && _propertyKey === 'length') {\n return parentValue.length;\n }\n if (parentValueType === 'object' && parentValue !== null || parentValueType === 'function') {\n if (_features.MANDATORY_SETTER) {\n (0, _emberMetal.watchKey)(parentValue, _propertyKey);\n }\n if (_features.EMBER_GLIMMER_DETECT_BACKTRACKING_RERENDER) {\n this.tag.didCompute(parentValue);\n }\n return (0, _emberMetal.get)(parentValue, _propertyKey);\n } else {\n return undefined;\n }\n };\n\n NestedPropertyReference.prototype[UPDATE] = function (value) {\n var parent = this._parentReference.value();\n (0, _emberMetal.set)(parent, this._propertyKey, value);\n };\n\n return NestedPropertyReference;\n }(PropertyReference);\n\n var UpdatableReference = exports.UpdatableReference = function (_EmberPathReference2) {\n (0, _emberBabel.inherits)(UpdatableReference, _EmberPathReference2);\n\n function UpdatableReference(value) {\n (0, _emberBabel.classCallCheck)(this, UpdatableReference);\n\n var _this6 = (0, _emberBabel.possibleConstructorReturn)(this, _EmberPathReference2.call(this));\n\n _this6.tag = _reference.DirtyableTag.create();\n _this6._value = value;\n return _this6;\n }\n\n UpdatableReference.prototype.value = function value() {\n return this._value;\n };\n\n UpdatableReference.prototype.update = function update(value) {\n var _value = this._value;\n\n if (value !== _value) {\n this.tag.inner.dirty();\n this._value = value;\n }\n };\n\n return UpdatableReference;\n }(EmberPathReference);\n\n var UpdatablePrimitiveReference = exports.UpdatablePrimitiveReference = function (_UpdatableReference) {\n (0, _emberBabel.inherits)(UpdatablePrimitiveReference, _UpdatableReference);\n\n function UpdatablePrimitiveReference() {\n (0, _emberBabel.classCallCheck)(this, UpdatablePrimitiveReference);\n return (0, _emberBabel.possibleConstructorReturn)(this, _UpdatableReference.apply(this, arguments));\n }\n\n return UpdatablePrimitiveReference;\n }(UpdatableReference);\n\n var ConditionalReference = exports.ConditionalReference = function (_GlimmerConditionalRe) {\n (0, _emberBabel.inherits)(ConditionalReference, _GlimmerConditionalRe);\n\n ConditionalReference.create = function create(reference) {\n if ((0, _reference.isConst)(reference)) {\n var value = reference.value();\n if ((0, _emberMetal.isProxy)(value)) {\n return new RootPropertyReference(value, 'isTruthy');\n } else {\n return _runtime.PrimitiveReference.create((0, _toBool.default)(value));\n }\n }\n return new ConditionalReference(reference);\n };\n\n function ConditionalReference(reference) {\n (0, _emberBabel.classCallCheck)(this, ConditionalReference);\n\n var _this8 = (0, _emberBabel.possibleConstructorReturn)(this, _GlimmerConditionalRe.call(this, reference));\n\n _this8.objectTag = _reference.UpdatableTag.create(_reference.CONSTANT_TAG);\n _this8.tag = (0, _reference.combine)([reference.tag, _this8.objectTag]);\n return _this8;\n }\n\n ConditionalReference.prototype.toBool = function toBool(predicate) {\n if ((0, _emberMetal.isProxy)(predicate)) {\n this.objectTag.inner.update((0, _emberMetal.tagForProperty)(predicate, 'isTruthy'));\n return (0, _emberMetal.get)(predicate, 'isTruthy');\n } else {\n this.objectTag.inner.update((0, _emberMetal.tagFor)(predicate));\n return (0, _toBool.default)(predicate);\n }\n };\n\n return ConditionalReference;\n }(_runtime.ConditionalReference);\n\n var SimpleHelperReference = exports.SimpleHelperReference = function (_CachedReference2) {\n (0, _emberBabel.inherits)(SimpleHelperReference, _CachedReference2);\n\n SimpleHelperReference.create = function create(Helper, _vm, args) {\n var helper = Helper.create();\n if ((0, _reference.isConst)(args)) {\n var positional = args.positional,\n named = args.named;\n\n var positionalValue = positional.value();\n var namedValue = named.value();\n if (true) {\n maybeFreeze(positionalValue);\n maybeFreeze(namedValue);\n }\n var result = helper.compute(positionalValue, namedValue);\n if (typeof result === 'object' && result !== null || typeof result === 'function') {\n return new RootReference(result);\n } else {\n return _runtime.PrimitiveReference.create(result);\n }\n } else {\n return new SimpleHelperReference(helper.compute, args);\n }\n };\n\n function SimpleHelperReference(helper, args) {\n (0, _emberBabel.classCallCheck)(this, SimpleHelperReference);\n\n var _this9 = (0, _emberBabel.possibleConstructorReturn)(this, _CachedReference2.call(this));\n\n _this9.tag = args.tag;\n _this9.helper = helper;\n _this9.args = args;\n return _this9;\n }\n\n SimpleHelperReference.prototype.compute = function compute() {\n var helper = this.helper,\n _args = this.args,\n positional = _args.positional,\n named = _args.named;\n\n var positionalValue = positional.value();\n var namedValue = named.value();\n if (true) {\n maybeFreeze(positionalValue);\n maybeFreeze(namedValue);\n }\n return helper(positionalValue, namedValue);\n };\n\n return SimpleHelperReference;\n }(CachedReference);\n\n var ClassBasedHelperReference = exports.ClassBasedHelperReference = function (_CachedReference3) {\n (0, _emberBabel.inherits)(ClassBasedHelperReference, _CachedReference3);\n\n ClassBasedHelperReference.create = function create(helperClass, vm, args) {\n var instance = helperClass.create();\n vm.newDestroyable(instance);\n return new ClassBasedHelperReference(instance, args);\n };\n\n function ClassBasedHelperReference(instance, args) {\n (0, _emberBabel.classCallCheck)(this, ClassBasedHelperReference);\n\n var _this10 = (0, _emberBabel.possibleConstructorReturn)(this, _CachedReference3.call(this));\n\n _this10.tag = (0, _reference.combine)([instance[_helper.RECOMPUTE_TAG], args.tag]);\n _this10.instance = instance;\n _this10.args = args;\n return _this10;\n }\n\n ClassBasedHelperReference.prototype.compute = function compute() {\n var instance = this.instance,\n _args2 = this.args,\n positional = _args2.positional,\n named = _args2.named;\n\n var positionalValue = positional.value();\n var namedValue = named.value();\n if (true) {\n maybeFreeze(positionalValue);\n maybeFreeze(namedValue);\n }\n return instance.compute(positionalValue, namedValue);\n };\n\n return ClassBasedHelperReference;\n }(CachedReference);\n\n var InternalHelperReference = exports.InternalHelperReference = function (_CachedReference4) {\n (0, _emberBabel.inherits)(InternalHelperReference, _CachedReference4);\n\n function InternalHelperReference(helper, args) {\n (0, _emberBabel.classCallCheck)(this, InternalHelperReference);\n\n var _this11 = (0, _emberBabel.possibleConstructorReturn)(this, _CachedReference4.call(this));\n\n _this11.tag = args.tag;\n _this11.helper = helper;\n _this11.args = args;\n return _this11;\n }\n\n InternalHelperReference.prototype.compute = function compute() {\n var helper = this.helper,\n args = this.args;\n\n return helper(args);\n };\n\n return InternalHelperReference;\n }(CachedReference);\n\n var UnboundReference = exports.UnboundReference = function (_ConstReference2) {\n (0, _emberBabel.inherits)(UnboundReference, _ConstReference2);\n\n function UnboundReference() {\n (0, _emberBabel.classCallCheck)(this, UnboundReference);\n return (0, _emberBabel.possibleConstructorReturn)(this, _ConstReference2.apply(this, arguments));\n }\n\n UnboundReference.create = function create(value) {\n if (typeof value === 'object' && value !== null) {\n return new UnboundReference(value);\n } else {\n return _runtime.PrimitiveReference.create(value);\n }\n };\n\n UnboundReference.prototype.get = function get(key) {\n return new UnboundReference((0, _emberMetal.get)(this.inner, key));\n };\n\n return UnboundReference;\n }(_reference.ConstReference);\n});","enifed('ember-glimmer/utils/string', ['exports', 'ember-babel'], function (exports, _emberBabel) {\n 'use strict';\n\n exports.SafeString = undefined;\n exports.escapeExpression = escapeExpression;\n exports.htmlSafe = htmlSafe;\n exports.isHTMLSafe = isHTMLSafe;\n\n var SafeString = exports.SafeString = function () {\n function SafeString(string) {\n (0, _emberBabel.classCallCheck)(this, SafeString);\n\n this.string = string;\n }\n\n SafeString.prototype.toString = function toString() {\n return '' + this.string;\n };\n\n SafeString.prototype.toHTML = function toHTML() {\n return this.toString();\n };\n\n return SafeString;\n }();\n\n var escape = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;',\n \"'\": '&#x27;',\n '`': '&#x60;',\n '=': '&#x3D;'\n };\n var possible = /[&<>\"'`=]/;\n var badChars = /[&<>\"'`=]/g;\n function escapeChar(chr) {\n return escape[chr];\n }\n function escapeExpression(string) {\n if (typeof string !== 'string') {\n // don't escape SafeStrings, since they're already safe\n if (string && string.toHTML) {\n return string.toHTML();\n } else if (string === null || string === undefined) {\n return '';\n } else if (!string) {\n return string + '';\n }\n // Force a string conversion as this will be done by the append regardless and\n // the regex test will do this transparently behind the scenes, causing issues if\n // an object's to string has escaped characters in it.\n string = '' + string;\n }\n if (!possible.test(string)) {\n return string;\n }\n return string.replace(badChars, escapeChar);\n }\n /**\n Mark a string as safe for unescaped output with Ember templates. If you\n return HTML from a helper, use this function to\n ensure Ember's rendering layer does not escape the HTML.\n \n ```javascript\n import { htmlSafe } from '@ember/string';\n \n htmlSafe('<div>someString</div>')\n ```\n \n @method htmlSafe\n @for @ember/template\n @static\n @return {Handlebars.SafeString} A string that will not be HTML escaped by Handlebars.\n @public\n */\n function htmlSafe(str) {\n if (str === null || str === undefined) {\n str = '';\n } else if (typeof str !== 'string') {\n str = '' + str;\n }\n return new SafeString(str);\n }\n /**\n Detects if a string was decorated using `htmlSafe`.\n \n ```javascript\n import { htmlSafe, isHTMLSafe } from '@ember/string';\n \n var plainString = 'plain string',\n safeString = htmlSafe('<div>someValue</div>');\n \n isHTMLSafe(plainString); // false\n isHTMLSafe(safeString); // true\n ```\n \n @method isHTMLSafe\n @for @ember/template\n @static\n @return {Boolean} `true` if the string was decorated with `htmlSafe`, `false` otherwise.\n @public\n */\n function isHTMLSafe(str) {\n return str !== null && typeof str === 'object' && typeof str.toHTML === 'function';\n }\n});","enifed('ember-glimmer/utils/to-bool', ['exports', 'ember-metal', 'ember-runtime'], function (exports, _emberMetal, _emberRuntime) {\n 'use strict';\n\n exports.default = toBool;\n function toBool(predicate) {\n if (!predicate) {\n return false;\n }\n if (predicate === true) {\n return true;\n }\n if ((0, _emberRuntime.isArray)(predicate)) {\n return (0, _emberMetal.get)(predicate, 'length') !== 0;\n }\n return true;\n }\n});","enifed('ember-glimmer/views/outlet', ['exports', 'ember-babel', '@glimmer/reference', 'ember-environment', 'ember-metal', 'ember-utils'], function (exports, _emberBabel, _reference, _emberEnvironment, _emberMetal, _emberUtils) {\n 'use strict';\n\n exports.RootOutletStateReference = undefined;\n\n var RootOutletStateReference = exports.RootOutletStateReference = function () {\n function RootOutletStateReference(outletView) {\n (0, _emberBabel.classCallCheck)(this, RootOutletStateReference);\n\n this.outletView = outletView;\n this.tag = outletView._tag;\n }\n\n RootOutletStateReference.prototype.get = function get(key) {\n return new ChildOutletStateReference(this, key);\n };\n\n RootOutletStateReference.prototype.value = function value() {\n return this.outletView.outletState;\n };\n\n RootOutletStateReference.prototype.getOrphan = function getOrphan(name) {\n return new OrphanedOutletStateReference(this, name);\n };\n\n RootOutletStateReference.prototype.update = function update(state) {\n this.outletView.setOutletState(state);\n };\n\n return RootOutletStateReference;\n }();\n\n var OrphanedOutletStateReference = function (_RootOutletStateRefer) {\n (0, _emberBabel.inherits)(OrphanedOutletStateReference, _RootOutletStateRefer);\n\n function OrphanedOutletStateReference(root, name) {\n (0, _emberBabel.classCallCheck)(this, OrphanedOutletStateReference);\n\n var _this = (0, _emberBabel.possibleConstructorReturn)(this, _RootOutletStateRefer.call(this, root.outletView));\n\n _this.root = root;\n _this.name = name;\n return _this;\n }\n\n OrphanedOutletStateReference.prototype.value = function value() {\n var rootState = this.root.value();\n var orphans = rootState.outlets.main.outlets.__ember_orphans__;\n if (!orphans) {\n return null;\n }\n var matched = orphans.outlets[this.name];\n if (!matched) {\n return null;\n }\n var state = Object.create(null);\n state[matched.render.outlet] = matched;\n matched.wasUsed = true;\n return { outlets: state, render: undefined };\n };\n\n return OrphanedOutletStateReference;\n }(RootOutletStateReference);\n\n var ChildOutletStateReference = function () {\n function ChildOutletStateReference(parent, key) {\n (0, _emberBabel.classCallCheck)(this, ChildOutletStateReference);\n\n this.parent = parent;\n this.key = key;\n this.tag = parent.tag;\n }\n\n ChildOutletStateReference.prototype.get = function get(key) {\n return new ChildOutletStateReference(this, key);\n };\n\n ChildOutletStateReference.prototype.value = function value() {\n var parent = this.parent.value();\n return parent && parent[this.key];\n };\n\n return ChildOutletStateReference;\n }();\n\n var OutletView = function () {\n OutletView.extend = function extend(injections) {\n return function (_OutletView) {\n (0, _emberBabel.inherits)(_class, _OutletView);\n\n function _class() {\n (0, _emberBabel.classCallCheck)(this, _class);\n return (0, _emberBabel.possibleConstructorReturn)(this, _OutletView.apply(this, arguments));\n }\n\n _class.create = function create(options) {\n if (options) {\n return _OutletView.create.call(this, (0, _emberUtils.assign)({}, injections, options));\n } else {\n return _OutletView.create.call(this, injections);\n }\n };\n\n return _class;\n }(OutletView);\n };\n\n OutletView.reopenClass = function reopenClass(injections) {\n (0, _emberUtils.assign)(this, injections);\n };\n\n OutletView.create = function create(options) {\n var _environment = options._environment,\n renderer = options.renderer,\n template = options.template;\n\n var owner = options[_emberUtils.OWNER];\n return new OutletView(_environment, renderer, owner, template);\n };\n\n function OutletView(_environment, renderer, owner, template) {\n (0, _emberBabel.classCallCheck)(this, OutletView);\n\n this._environment = _environment;\n this.renderer = renderer;\n this.owner = owner;\n this.template = template;\n this.outletState = null;\n this._tag = _reference.DirtyableTag.create();\n }\n\n OutletView.prototype.appendTo = function appendTo(selector) {\n var env = this._environment || _emberEnvironment.environment;\n var target = void 0;\n if (env.hasDOM) {\n target = typeof selector === 'string' ? document.querySelector(selector) : selector;\n } else {\n target = selector;\n }\n _emberMetal.run.schedule('render', this.renderer, 'appendOutletView', this, target);\n };\n\n OutletView.prototype.rerender = function rerender() {};\n\n OutletView.prototype.setOutletState = function setOutletState(state) {\n this.outletState = {\n outlets: {\n main: state\n },\n render: {\n owner: undefined,\n into: undefined,\n outlet: 'main',\n name: '-top-level',\n controller: undefined,\n template: undefined\n }\n };\n this._tag.inner.dirty();\n };\n\n OutletView.prototype.toReference = function toReference() {\n return new RootOutletStateReference(this);\n };\n\n OutletView.prototype.destroy = function destroy() {};\n\n return OutletView;\n }();\n\n exports.default = OutletView;\n});","enifed('ember-metal', ['exports', 'ember-environment', 'ember-utils', 'ember-debug', 'ember/features', 'ember-babel', '@glimmer/reference', 'require', 'backburner'], function (exports, emberEnvironment, emberUtils, emberDebug, features, emberBabel, reference, require, Backburner) {\n 'use strict';\n\n require = require && require.hasOwnProperty('default') ? require['default'] : require;\n Backburner = Backburner && Backburner.hasOwnProperty('default') ? Backburner['default'] : Backburner;\n\n var Ember = typeof emberEnvironment.context.imports.Ember === 'object' && emberEnvironment.context.imports.Ember || {};\n\n // Make sure these are set whether Ember was already defined or not\n Ember.isNamespace = true;\n Ember.toString = function () {\n return 'Ember';\n };\n\n /*\n When we render a rich template hierarchy, the set of events that\n *might* happen tends to be much larger than the set of events that\n actually happen. This implies that we should make listener creation &\n destruction cheap, even at the cost of making event dispatch more\n expensive.\n \n Thus we store a new listener with a single push and no new\n allocations, without even bothering to do deduplication -- we can\n save that for dispatch time, if an event actually happens.\n */\n\n /* listener flags */\n var ONCE = 1;\n var SUSPENDED = 2;\n\n var protoMethods = {\n addToListeners: function (eventName, target, method, flags) {\n if (this._listeners === undefined) {\n this._listeners = [];\n }\n this._listeners.push(eventName, target, method, flags);\n },\n _finalizeListeners: function () {\n if (this._listenersFinalized) {\n return;\n }\n if (this._listeners === undefined) {\n this._listeners = [];\n }\n var pointer = this.parent;\n while (pointer !== undefined) {\n var listeners = pointer._listeners;\n if (listeners !== undefined) {\n this._listeners = this._listeners.concat(listeners);\n }\n if (pointer._listenersFinalized) {\n break;\n }\n pointer = pointer.parent;\n }\n this._listenersFinalized = true;\n },\n removeFromListeners: function (eventName, target, method, didRemove) {\n var pointer = this;\n while (pointer !== undefined) {\n var listeners = pointer._listeners;\n if (listeners !== undefined) {\n for (var index = listeners.length - 4; index >= 0; index -= 4) {\n if (listeners[index] === eventName && (!method || listeners[index + 1] === target && listeners[index + 2] === method)) {\n if (pointer === this) {\n // we are modifying our own list, so we edit directly\n if (typeof didRemove === 'function') {\n didRemove(eventName, target, listeners[index + 2]);\n }\n listeners.splice(index, 4);\n } else {\n // we are trying to remove an inherited listener, so we do\n // just-in-time copying to detach our own listeners from\n // our inheritance chain.\n this._finalizeListeners();\n return this.removeFromListeners(eventName, target, method);\n }\n }\n }\n }\n if (pointer._listenersFinalized) {\n break;\n }\n pointer = pointer.parent;\n }\n },\n matchingListeners: function (eventName) {\n var pointer = this;\n var result = void 0;\n while (pointer !== undefined) {\n var listeners = pointer._listeners;\n if (listeners !== undefined) {\n for (var index = 0; index < listeners.length; index += 4) {\n if (listeners[index] === eventName) {\n result = result || [];\n pushUniqueListener(result, listeners, index);\n }\n }\n }\n if (pointer._listenersFinalized) {\n break;\n }\n pointer = pointer.parent;\n }\n return result;\n }\n };\n\n function pushUniqueListener(destination, source, index) {\n var target = source[index + 1];\n var method = source[index + 2];\n for (var destinationIndex = 0; destinationIndex < destination.length; destinationIndex += 3) {\n if (destination[destinationIndex] === target && destination[destinationIndex + 1] === method) {\n return;\n }\n }\n destination.push(target, method, source[index + 3]);\n }\n\n /**\n @module @ember/object\n */\n /*\n The event system uses a series of nested hashes to store listeners on an\n object. When a listener is registered, or when an event arrives, these\n hashes are consulted to determine which target and action pair to invoke.\n \n The hashes are stored in the object's meta hash, and look like this:\n \n // Object's meta hash\n {\n listeners: { // variable name: `listenerSet`\n \"foo:changed\": [ // variable name: `actions`\n target, method, flags\n ]\n }\n }\n \n */\n\n /**\n Add an event listener\n \n @method addListener\n @static\n @for @ember/object/events\n @param obj\n @param {String} eventName\n @param {Object|Function} target A target object or a function\n @param {Function|String} method A function or the name of a function to be called on `target`\n @param {Boolean} once A flag whether a function should only be called once\n @public\n */\n function addListener(obj, eventName, target, method, once) {\n true && !(!!obj && !!eventName) && emberDebug.assert('You must pass at least an object and event name to addListener', !!obj && !!eventName);\n\n if (emberEnvironment.ENV._ENABLE_DID_INIT_ATTRS_SUPPORT === true) {\n true && !(eventName !== 'didInitAttrs') && emberDebug.deprecate('didInitAttrs called in ' + (obj && obj.toString && obj.toString()) + '.', eventName !== 'didInitAttrs', {\n id: 'ember-views.did-init-attrs',\n until: '3.0.0',\n url: 'https://emberjs.com/deprecations/v2.x#toc_ember-component-didinitattrs'\n });\n } else {\n true && !(eventName !== 'didInitAttrs') && emberDebug.assert('didInitAttrs called in ' + (obj && obj.toString && obj.toString()) + ' is no longer supported.', eventName !== 'didInitAttrs');\n }\n\n if (!method && 'function' === typeof target) {\n method = target;\n target = null;\n }\n\n var flags = 0;\n if (once) {\n flags |= ONCE;\n }\n\n meta(obj).addToListeners(eventName, target, method, flags);\n\n if ('function' === typeof obj.didAddListener) {\n obj.didAddListener(eventName, target, method);\n }\n }\n\n /**\n Remove an event listener\n \n Arguments should match those passed to `addListener`.\n \n @method removeListener\n @static\n @for @ember/object/events\n @param obj\n @param {String} eventName\n @param {Object|Function} target A target object or a function\n @param {Function|String} method A function or the name of a function to be called on `target`\n @public\n */\n function removeListener(obj, eventName, target, method) {\n true && !(!!obj && !!eventName) && emberDebug.assert('You must pass at least an object and event name to removeListener', !!obj && !!eventName);\n\n if (!method && 'function' === typeof target) {\n method = target;\n target = null;\n }\n\n var func = 'function' === typeof obj.didRemoveListener ? obj.didRemoveListener.bind(obj) : function () {};\n meta(obj).removeFromListeners(eventName, target, method, func);\n }\n\n /**\n Send an event. The execution of suspended listeners\n is skipped, and once listeners are removed. A listener without\n a target is executed on the passed object. If an array of actions\n is not passed, the actions stored on the passed object are invoked.\n \n @method sendEvent\n @static\n @for @ember/object/events\n @param obj\n @param {String} eventName\n @param {Array} params Optional parameters for each listener.\n @param {Array} actions Optional array of actions (listeners).\n @param {Meta} meta Optional meta to lookup listeners\n @return true\n @public\n */\n function sendEvent(obj, eventName, params, actions, _meta) {\n if (actions === undefined) {\n var meta$$1 = _meta === undefined ? peekMeta(obj) : _meta;\n actions = typeof meta$$1 === 'object' && meta$$1 !== null && meta$$1.matchingListeners(eventName);\n }\n\n if (actions === undefined || actions.length === 0) {\n return false;\n }\n\n for (var i = actions.length - 3; i >= 0; i -= 3) {\n // looping in reverse for once listeners\n var target = actions[i];\n var method = actions[i + 1];\n var flags = actions[i + 2];\n\n if (!method) {\n continue;\n }\n if (flags & SUSPENDED) {\n continue;\n }\n if (flags & ONCE) {\n removeListener(obj, eventName, target, method);\n }\n if (!target) {\n target = obj;\n }\n if ('string' === typeof method) {\n if (params) {\n emberUtils.applyStr(target, method, params);\n } else {\n target[method]();\n }\n } else {\n if (params) {\n method.apply(target, params);\n } else {\n method.call(target);\n }\n }\n }\n return true;\n }\n\n /**\n @private\n @method hasListeners\n @static\n @for @ember/object/events\n @param obj\n @param {String} eventName\n */\n function hasListeners(obj, eventName) {\n var meta$$1 = peekMeta(obj);\n if (meta$$1 === undefined) {\n return false;\n }\n var matched = meta$$1.matchingListeners(eventName);\n return matched !== undefined && matched.length > 0;\n }\n\n /**\n Define a property as a function that should be executed when\n a specified event or events are triggered.\n \n \n ``` javascript\n import EmberObject from '@ember/object';\n import { on } from '@ember/object/evented';\n import { sendEvent } from '@ember/object/events';\n \n let Job = EmberObject.extend({\n logCompleted: on('completed', function() {\n console.log('Job completed!');\n })\n });\n \n let job = Job.create();\n \n sendEvent(job, 'completed'); // Logs 'Job completed!'\n ```\n \n @method on\n @static\n @for @ember/object/evented\n @param {String} eventNames*\n @param {Function} func\n @return func\n @public\n */\n function on() {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n var func = args.pop();\n var events = args;\n\n true && !(typeof func === 'function') && emberDebug.assert('on expects function as last argument', typeof func === 'function');\n true && !(events.length > 0 && events.every(function (p) {\n return typeof p === 'string' && p.length;\n })) && emberDebug.assert('on called without valid event names', events.length > 0 && events.every(function (p) {\n return typeof p === 'string' && p.length;\n }));\n\n func.__ember_listens__ = events;\n return func;\n }\n\n var hasViews = function () {\n return false;\n };\n\n function setHasViews(fn) {\n hasViews = fn;\n }\n\n function makeTag() {\n return new reference.DirtyableTag();\n }\n\n function tagForProperty(object, propertyKey, _meta) {\n if (typeof object !== 'object' || object === null) {\n return reference.CONSTANT_TAG;\n }\n\n var meta$$1 = _meta === undefined ? meta(object) : _meta;\n if (meta$$1.isProxy()) {\n return tagFor(object, meta$$1);\n }\n\n var tags = meta$$1.writableTags();\n var tag = tags[propertyKey];\n if (tag) {\n return tag;\n }\n\n return tags[propertyKey] = makeTag();\n }\n\n function tagFor(object, _meta) {\n if (typeof object === 'object' && object !== null) {\n var meta$$1 = _meta === undefined ? meta(object) : _meta;\n return meta$$1.writableTag(makeTag);\n } else {\n return reference.CONSTANT_TAG;\n }\n }\n\n function markObjectAsDirty(meta$$1, propertyKey) {\n var objectTag = meta$$1.readableTag();\n\n if (objectTag !== undefined) {\n objectTag.dirty();\n }\n\n var tags = meta$$1.readableTags();\n var propertyTag = tags !== undefined ? tags[propertyKey] : undefined;\n\n if (propertyTag !== undefined) {\n propertyTag.dirty();\n }\n\n if (propertyKey === 'content' && meta$$1.isProxy()) {\n objectTag.contentDidChange();\n }\n\n if (objectTag !== undefined || propertyTag !== undefined) {\n ensureRunloop();\n }\n }\n\n var backburner = void 0;\n function ensureRunloop() {\n if (backburner === undefined) {\n backburner = require('ember-metal').run.backburner;\n }\n\n if (hasViews()) {\n backburner.ensureInstance();\n }\n }\n\n /*\n this.observerSet = {\n [senderGuid]: { // variable name: `keySet`\n [keyName]: listIndex\n }\n },\n this.observers = [\n {\n sender: obj,\n keyName: keyName,\n eventName: eventName,\n listeners: [\n [target, method, flags]\n ]\n },\n ...\n ]\n */\n\n var ObserverSet = function () {\n function ObserverSet() {\n emberBabel.classCallCheck(this, ObserverSet);\n\n this.clear();\n }\n\n ObserverSet.prototype.add = function add(sender, keyName, eventName) {\n var observerSet = this.observerSet;\n var observers = this.observers;\n var senderGuid = emberUtils.guidFor(sender);\n var keySet = observerSet[senderGuid];\n\n if (keySet === undefined) {\n observerSet[senderGuid] = keySet = {};\n }\n\n var index = keySet[keyName];\n if (index === undefined) {\n index = observers.push({\n sender: sender,\n keyName: keyName,\n eventName: eventName,\n listeners: []\n }) - 1;\n keySet[keyName] = index;\n }\n return observers[index].listeners;\n };\n\n ObserverSet.prototype.flush = function flush() {\n var observers = this.observers;\n var observer = void 0,\n sender = void 0;\n this.clear();\n for (var i = 0; i < observers.length; ++i) {\n observer = observers[i];\n sender = observer.sender;\n if (sender.isDestroying || sender.isDestroyed) {\n continue;\n }\n sendEvent(sender, observer.eventName, [sender, observer.keyName], observer.listeners);\n }\n };\n\n ObserverSet.prototype.clear = function clear() {\n this.observerSet = {};\n this.observers = [];\n };\n\n return ObserverSet;\n }();\n\n exports.runInTransaction = void 0;\n exports.didRender = void 0;\n exports.assertNotRendered = void 0;\n\n // detect-backtracking-rerender by default is debug build only\n if (features.EMBER_GLIMMER_DETECT_BACKTRACKING_RERENDER) {\n\n // there are 2 states\n\n // DEBUG\n // tracks lastRef and lastRenderedIn per rendered object and key during a transaction\n // release everything via normal weakmap semantics by just derefencing the weakmap\n\n // RELEASE\n // tracks transactionId per rendered object and key during a transaction\n // release everything via normal weakmap semantics by just derefencing the weakmap\n\n var TransactionRunner = function () {\n function TransactionRunner() {\n emberBabel.classCallCheck(this, TransactionRunner);\n\n this.transactionId = 0;\n this.inTransaction = false;\n this.shouldReflush = false;\n this.weakMap = new WeakMap();\n {\n // track templates\n this.debugStack = undefined;\n }\n }\n\n TransactionRunner.prototype.runInTransaction = function runInTransaction(context$$1, methodName) {\n this.before(context$$1);\n try {\n context$$1[methodName]();\n } finally {\n this.after();\n }\n return this.shouldReflush;\n };\n\n TransactionRunner.prototype.didRender = function didRender(object, key, reference$$1) {\n if (!this.inTransaction) {\n return;\n }\n {\n this.setKey(object, key, {\n lastRef: reference$$1,\n lastRenderedIn: this.debugStack.peek()\n });\n }\n };\n\n TransactionRunner.prototype.assertNotRendered = function assertNotRendered(object, key) {\n if (!this.inTransaction) {\n return;\n }\n if (this.hasRendered(object, key)) {\n {\n var _getKey = this.getKey(object, key),\n lastRef = _getKey.lastRef,\n lastRenderedIn = _getKey.lastRenderedIn;\n\n var currentlyIn = this.debugStack.peek();\n\n var parts = [];\n var label = void 0;\n\n if (lastRef !== undefined) {\n while (lastRef && lastRef._propertyKey) {\n parts.unshift(lastRef._propertyKey);\n lastRef = lastRef._parentReference;\n }\n\n label = parts.join('.');\n } else {\n label = 'the same value';\n }\n\n true && !false && emberDebug.assert('You modified \"' + label + '\" twice on ' + object + ' in a single render. It was rendered in ' + lastRenderedIn + ' and modified in ' + currentlyIn + '. This was unreliable and slow in Ember 1.x and is no longer supported. See https://github.com/emberjs/ember.js/issues/13948 for more details.', false);\n }\n\n this.shouldReflush = true;\n }\n };\n\n TransactionRunner.prototype.hasRendered = function hasRendered(object, key) {\n if (!this.inTransaction) {\n return false;\n }\n {\n return this.getKey(object, key) !== undefined;\n }\n return this.getKey(object, key) === this.transactionId;\n };\n\n TransactionRunner.prototype.before = function before(context$$1) {\n this.inTransaction = true;\n this.shouldReflush = false;\n {\n this.debugStack = context$$1.env.debugStack;\n }\n };\n\n TransactionRunner.prototype.after = function after() {\n this.transactionId++;\n this.inTransaction = false;\n {\n this.debugStack = undefined;\n }\n this.clearObjectMap();\n };\n\n TransactionRunner.prototype.createMap = function createMap(object) {\n var map = Object.create(null);\n this.weakMap.set(object, map);\n return map;\n };\n\n TransactionRunner.prototype.getOrCreateMap = function getOrCreateMap(object) {\n var map = this.weakMap.get(object);\n if (map === undefined) {\n map = this.createMap(object);\n }\n return map;\n };\n\n TransactionRunner.prototype.setKey = function setKey(object, key, value) {\n var map = this.getOrCreateMap(object);\n map[key] = value;\n };\n\n TransactionRunner.prototype.getKey = function getKey(object, key) {\n var map = this.weakMap.get(object);\n if (map !== undefined) {\n return map[key];\n }\n };\n\n TransactionRunner.prototype.clearObjectMap = function clearObjectMap() {\n this.weakMap = new WeakMap();\n };\n\n return TransactionRunner;\n }();\n\n var runner = new TransactionRunner();\n\n exports.runInTransaction = runner.runInTransaction.bind(runner);\n exports.didRender = runner.didRender.bind(runner);\n exports.assertNotRendered = runner.assertNotRendered.bind(runner);\n } else {\n // in production do nothing to detect reflushes\n exports.runInTransaction = function (context$$1, methodName) {\n context$$1[methodName]();\n return false;\n };\n }\n\n function watchPath(obj, keyPath, meta$$1) {\n if (typeof obj !== 'object' || obj === null) {\n return;\n }\n var m = meta$$1 === undefined ? meta(obj) : meta$$1;\n var counter = m.peekWatching(keyPath) || 0;\n\n m.writeWatching(keyPath, counter + 1);\n if (counter === 0) {\n // activate watching first time\n m.writableChains(makeChainNode).add(keyPath);\n }\n }\n\n function unwatchPath(obj, keyPath, meta$$1) {\n if (typeof obj !== 'object' || obj === null) {\n return;\n }\n var m = meta$$1 === undefined ? peekMeta(obj) : meta$$1;\n\n if (m === undefined) {\n return;\n }\n var counter = m.peekWatching(keyPath) || 0;\n\n if (counter === 1) {\n m.writeWatching(keyPath, 0);\n m.writableChains(makeChainNode).remove(keyPath);\n } else if (counter > 1) {\n m.writeWatching(keyPath, counter - 1);\n }\n }\n\n /**\n @module ember\n */\n /**\n Starts watching a property on an object. Whenever the property changes,\n invokes `Ember.notifyPropertyChange`. This is the primitive used by observers\n and dependent keys; usually you will never call this method directly but instead\n use higher level methods like `addObserver()`.\n \n @private\n @method watch\n @for Ember\n @param obj\n @param {String} _keyPath\n */\n function watch(obj, _keyPath, m) {\n if (isPath(_keyPath)) {\n watchPath(obj, _keyPath, m);\n } else {\n watchKey(obj, _keyPath, m);\n }\n }\n\n function isWatching(obj, key) {\n return watcherCount(obj, key) > 0;\n }\n\n function watcherCount(obj, key) {\n var meta$$1 = peekMeta(obj);\n return meta$$1 !== undefined && meta$$1.peekWatching(key) || 0;\n }\n\n function unwatch(obj, _keyPath, m) {\n if (isPath(_keyPath)) {\n unwatchPath(obj, _keyPath, m);\n } else {\n unwatchKey(obj, _keyPath, m);\n }\n }\n\n /**\n @module @ember/object\n */\n\n var AFTER_OBSERVERS = ':change';\n var BEFORE_OBSERVERS = ':before';\n\n function changeEvent(keyName) {\n return keyName + AFTER_OBSERVERS;\n }\n\n function beforeEvent(keyName) {\n return keyName + BEFORE_OBSERVERS;\n }\n\n /**\n @method addObserver\n @static\n @for @ember/object/observers\n @param obj\n @param {String} _path\n @param {Object|Function} target\n @param {Function|String} [method]\n @public\n */\n function addObserver(obj, _path, target, method) {\n addListener(obj, changeEvent(_path), target, method);\n watch(obj, _path);\n\n return this;\n }\n\n /**\n @method removeObserver\n @static\n @for @ember/object/observers\n @param obj\n @param {String} path\n @param {Object|Function} target\n @param {Function|String} [method]\n @public\n */\n function removeObserver(obj, path, target, method) {\n unwatch(obj, path);\n removeListener(obj, changeEvent(path), target, method);\n\n return this;\n }\n\n /**\n @method _addBeforeObserver\n @static\n @for @ember/object/observers\n @param obj\n @param {String} path\n @param {Object|Function} target\n @param {Function|String} [method]\n @deprecated\n @private\n */\n function _addBeforeObserver(obj, path, target, method) {\n addListener(obj, beforeEvent(path), target, method);\n watch(obj, path);\n\n return this;\n }\n\n /**\n @method removeBeforeObserver\n @static\n @for @ember/object/observers\n @param obj\n @param {String} path\n @param {Object|Function} target\n @param {Function|String} [method]\n @deprecated\n @private\n */\n function _removeBeforeObserver(obj, path, target, method) {\n unwatch(obj, path);\n removeListener(obj, beforeEvent(path), target, method);\n\n return this;\n }\n\n /**\n @module ember\n @private\n */\n\n var PROPERTY_DID_CHANGE = emberUtils.symbol('PROPERTY_DID_CHANGE');\n\n var beforeObserverSet = new ObserverSet();\n var observerSet = new ObserverSet();\n var deferred = 0;\n\n // ..........................................................\n // PROPERTY CHANGES\n //\n\n /**\n This function is called just before an object property is about to change.\n It will notify any before observers and prepare caches among other things.\n \n Normally you will not need to call this method directly but if for some\n reason you can't directly watch a property you can invoke this method\n manually along with `Ember.propertyDidChange()` which you should call just\n after the property value changes.\n \n @method propertyWillChange\n @for Ember\n @param {Object} obj The object with the property that will change\n @param {String} keyName The property key (or path) that will change.\n @return {void}\n @private\n */\n function propertyWillChange(obj, keyName, _meta) {\n var meta$$1 = _meta === undefined ? peekMeta(obj) : _meta;\n if (meta$$1 !== undefined && !meta$$1.isInitialized(obj)) {\n return;\n }\n\n var watching = meta$$1 !== undefined && meta$$1.peekWatching(keyName) > 0;\n var possibleDesc = descriptorFor(obj, keyName, meta$$1);\n\n if (possibleDesc !== undefined && possibleDesc.willChange) {\n possibleDesc.willChange(obj, keyName);\n }\n\n if (watching) {\n dependentKeysWillChange(obj, keyName, meta$$1);\n chainsWillChange(obj, keyName, meta$$1);\n notifyBeforeObservers(obj, keyName, meta$$1);\n }\n }\n\n /**\n This function is called just after an object property has changed.\n It will notify any observers and clear caches among other things.\n \n Normally you will not need to call this method directly but if for some\n reason you can't directly watch a property you can invoke this method\n manually along with `Ember.propertyWillChange()` which you should call just\n before the property value changes.\n \n @method propertyDidChange\n @for Ember\n @param {Object} obj The object with the property that will change\n @param {String} keyName The property key (or path) that will change.\n @param {Meta} meta The objects meta.\n @return {void}\n @private\n */\n function propertyDidChange(obj, keyName, _meta) {\n var meta$$1 = _meta === undefined ? peekMeta(obj) : _meta;\n var hasMeta = meta$$1 !== undefined;\n\n if (hasMeta && !meta$$1.isInitialized(obj)) {\n return;\n }\n\n var possibleDesc = descriptorFor(obj, keyName, meta$$1);\n\n // shouldn't this mean that we're watching this key?\n if (possibleDesc !== undefined && possibleDesc.didChange) {\n possibleDesc.didChange(obj, keyName);\n }\n\n if (hasMeta && meta$$1.peekWatching(keyName) > 0) {\n dependentKeysDidChange(obj, keyName, meta$$1);\n chainsDidChange(obj, keyName, meta$$1);\n notifyObservers(obj, keyName, meta$$1);\n }\n\n if (obj[PROPERTY_DID_CHANGE]) {\n obj[PROPERTY_DID_CHANGE](keyName);\n }\n\n if (hasMeta) {\n if (meta$$1.isSourceDestroying()) {\n return;\n }\n markObjectAsDirty(meta$$1, keyName);\n }\n\n if (features.EMBER_GLIMMER_DETECT_BACKTRACKING_RERENDER) {\n exports.assertNotRendered(obj, keyName, meta$$1);\n }\n }\n\n var WILL_SEEN = void 0;\n var DID_SEEN = void 0;\n // called whenever a property is about to change to clear the cache of any dependent keys (and notify those properties of changes, etc...)\n function dependentKeysWillChange(obj, depKey, meta$$1) {\n if (meta$$1.isSourceDestroying() || !meta$$1.hasDeps(depKey)) {\n return;\n }\n var seen = WILL_SEEN;\n var top = !seen;\n\n if (top) {\n seen = WILL_SEEN = {};\n }\n\n iterDeps(propertyWillChange, obj, depKey, seen, meta$$1);\n\n if (top) {\n WILL_SEEN = null;\n }\n }\n\n // called whenever a property has just changed to update dependent keys\n function dependentKeysDidChange(obj, depKey, meta$$1) {\n if (meta$$1.isSourceDestroying() || !meta$$1.hasDeps(depKey)) {\n return;\n }\n var seen = DID_SEEN;\n var top = !seen;\n\n if (top) {\n seen = DID_SEEN = {};\n }\n\n iterDeps(propertyDidChange, obj, depKey, seen, meta$$1);\n\n if (top) {\n DID_SEEN = null;\n }\n }\n\n function iterDeps(method, obj, depKey, seen, meta$$1) {\n var possibleDesc = void 0;\n var guid = emberUtils.guidFor(obj);\n var current = seen[guid];\n\n if (!current) {\n current = seen[guid] = {};\n }\n\n if (current[depKey]) {\n return;\n }\n\n current[depKey] = true;\n\n meta$$1.forEachInDeps(depKey, function (key, value) {\n if (!value) {\n return;\n }\n\n possibleDesc = descriptorFor(obj, key, meta$$1);\n\n if (possibleDesc !== undefined && possibleDesc._suspended === obj) {\n return;\n }\n\n method(obj, key, meta$$1);\n });\n }\n\n function chainsWillChange(obj, keyName, meta$$1) {\n var chainWatchers = meta$$1.readableChainWatchers();\n if (chainWatchers !== undefined) {\n chainWatchers.notify(keyName, false, propertyWillChange);\n }\n }\n\n function chainsDidChange(obj, keyName, meta$$1) {\n var chainWatchers = meta$$1.readableChainWatchers();\n if (chainWatchers !== undefined) {\n chainWatchers.notify(keyName, true, propertyDidChange);\n }\n }\n\n function overrideChains(obj, keyName, meta$$1) {\n var chainWatchers = meta$$1.readableChainWatchers();\n if (chainWatchers !== undefined) {\n chainWatchers.revalidate(keyName);\n }\n }\n\n /**\n @method beginPropertyChanges\n @chainable\n @private\n */\n function beginPropertyChanges() {\n deferred++;\n }\n\n /**\n @method endPropertyChanges\n @private\n */\n function endPropertyChanges() {\n deferred--;\n if (deferred <= 0) {\n beforeObserverSet.clear();\n observerSet.flush();\n }\n }\n\n /**\n Make a series of property changes together in an\n exception-safe way.\n \n ```javascript\n Ember.changeProperties(function() {\n obj1.set('foo', mayBlowUpWhenSet);\n obj2.set('bar', baz);\n });\n ```\n \n @method changeProperties\n @param {Function} callback\n @private\n */\n function changeProperties(callback) {\n beginPropertyChanges();\n try {\n callback();\n } finally {\n endPropertyChanges();\n }\n }\n\n function indexOf(array, target, method) {\n var index = -1;\n // hashes are added to the end of the event array\n // so it makes sense to start searching at the end\n // of the array and search in reverse\n for (var i = array.length - 3; i >= 0; i -= 3) {\n if (target === array[i] && method === array[i + 1]) {\n index = i;\n break;\n }\n }\n return index;\n }\n\n function accumulateListeners(obj, eventName, otherActions, meta$$1) {\n var actions = meta$$1.matchingListeners(eventName);\n if (actions === undefined) {\n return;\n }\n var newActions = [];\n\n for (var i = actions.length - 3; i >= 0; i -= 3) {\n var target = actions[i];\n var method = actions[i + 1];\n var flags = actions[i + 2];\n var actionIndex = indexOf(otherActions, target, method);\n\n if (actionIndex === -1) {\n otherActions.push(target, method, flags);\n newActions.push(target, method, flags);\n }\n }\n\n return newActions;\n }\n\n function notifyBeforeObservers(obj, keyName, meta$$1) {\n if (meta$$1.isSourceDestroying()) {\n return;\n }\n\n var eventName = beforeEvent(keyName);\n var listeners = void 0,\n added = void 0;\n if (deferred > 0) {\n listeners = beforeObserverSet.add(obj, keyName, eventName);\n added = accumulateListeners(obj, eventName, listeners, meta$$1);\n }\n sendEvent(obj, eventName, [obj, keyName], added);\n }\n\n function notifyObservers(obj, keyName, meta$$1) {\n if (meta$$1.isSourceDestroying()) {\n return;\n }\n\n var eventName = changeEvent(keyName);\n var listeners = void 0;\n if (deferred > 0) {\n listeners = observerSet.add(obj, keyName, eventName);\n accumulateListeners(obj, eventName, listeners, meta$$1);\n } else {\n sendEvent(obj, eventName, [obj, keyName]);\n }\n }\n\n /**\n @module @ember/object\n */\n\n // ..........................................................\n // DESCRIPTOR\n //\n\n /**\n Objects of this type can implement an interface to respond to requests to\n get and set. The default implementation handles simple properties.\n \n @class Descriptor\n @private\n */\n function Descriptor() {\n this.isDescriptor = true;\n }\n\n // ..........................................................\n // DEFINING PROPERTIES API\n //\n\n function MANDATORY_SETTER_FUNCTION(name) {\n function SETTER_FUNCTION(value) {\n var m = peekMeta(this);\n if (!m.isInitialized(this)) {\n m.writeValues(name, value);\n } else {\n true && !false && emberDebug.assert('You must use set() to set the `' + name + '` property (of ' + this + ') to `' + value + '`.', false);\n }\n }\n\n SETTER_FUNCTION.isMandatorySetter = true;\n return SETTER_FUNCTION;\n }\n\n function DEFAULT_GETTER_FUNCTION(name) {\n return function GETTER_FUNCTION() {\n var meta$$1 = peekMeta(this);\n if (meta$$1 !== undefined) {\n return meta$$1.peekValues(name);\n }\n };\n }\n\n function INHERITING_GETTER_FUNCTION(name) {\n function IGETTER_FUNCTION() {\n var meta$$1 = peekMeta(this);\n var val = void 0;\n if (meta$$1 !== undefined) {\n val = meta$$1.readInheritedValue('values', name);\n }\n\n if (val === UNDEFINED) {\n var proto = Object.getPrototypeOf(this);\n return proto && proto[name];\n } else {\n return val;\n }\n }\n\n IGETTER_FUNCTION.isInheritingGetter = true;\n return IGETTER_FUNCTION;\n }\n\n var DESCRIPTOR_GETTER_FUNCTION = void 0;\n\n if (features.EMBER_METAL_ES5_GETTERS) {\n DESCRIPTOR_GETTER_FUNCTION = function (name, descriptor) {\n return function CPGETTER_FUNCTION() {\n return descriptor.get(this, name);\n };\n };\n } else if (features.DESCRIPTOR_TRAP) {\n // Future traveler, although this code looks scary. It merely exists in\n // development to aid in development asertions. Production builds of\n // ember strip this entire branch out.\n var messageFor = function (obj, keyName, property, value) {\n return 'You attempted to access `' + keyName + '.' + String(property) + '` ' + ('(on `' + obj + '`), but `' + keyName + '` is a computed property.\\n\\n') + 'Due to certain internal implementation details of Ember, the ' + ('`' + keyName + '` property previously contained a private \"descriptor\" ') + ('object, therefore `' + keyName + '.' + String(property) + '` would have been ') + ('`' + String(value).replace(/\\n/g, ' ') + '`.\\n\\n') + 'This implementation detail has now changed and the \"descriptor\" ' + 'object is no longer present at this location. Soon, accessing ' + ('`' + keyName + '` on this object will return the computed property\\'s ') + 'current value (see RFC #281 for more details).\\n\\n' + 'If you are seeing this error, you are likely using an addon that ' + 'relies on this now-defunct private implementation detail. If you ' + 'can, identify the addon from the stack trace below and report this ' + 'bug to the addon authors. If you feel stuck, the Ember Community ' + 'Slack (https://ember-community-slackin.herokuapp.com/) may be able ' + 'to offer some help.\\n\\n' + 'If you are an addon author and need help transitioning your code, ' + 'please get in touch in the #dev-ember channel in the Ember Community ' + 'Slack.';\n };\n\n var trapFor = void 0;\n\n if (emberUtils.HAS_NATIVE_PROXY) {\n /* globals Proxy */\n trapFor = function (obj, keyName, descriptor) {\n return new Proxy(descriptor, {\n get: function (descriptor, property) {\n if (property === DESCRIPTOR) {\n return descriptor;\n } else if (property === 'prototype' || property === 'constructor' || property === 'nodeType') {\n return undefined;\n } else if (property === 'toString' || property === 'valueOf' || property === 'inspect' || Symbol && property === Symbol.toPrimitive || Symbol && property === Symbol.toStringTag) {\n return function () {\n return '[COMPUTED PROPERTY]';\n };\n }\n\n true && !false && emberDebug.assert(messageFor(obj, keyName, property, descriptor[property]));\n }\n });\n };\n } else {\n trapFor = function (obj, keyName, descriptor) {\n var trap = Object.create(null);\n\n Object.defineProperty(trap, DESCRIPTOR, {\n configurable: false,\n enumerable: false,\n writable: false,\n value: descriptor\n });\n\n trap.toString = trap.valueOf = function () {\n return '[COMPUTED PROPERTY]';\n };\n\n // Without a proxy, we can only trap the \"likely\" properties\n ['isDescriptor', 'setup', 'teardown', 'get', '_getter', 'set', '_setter', 'meta'].forEach(function (property) {\n Object.defineProperty(trap, property, {\n configurable: false,\n enumerable: false,\n get: function () {\n true && !false && emberDebug.assert(messageFor(obj, keyName, property, descriptor[property]));\n }\n });\n });\n\n return trap;\n };\n }\n\n DESCRIPTOR_GETTER_FUNCTION = function (name, descriptor) {\n var trap = void 0;\n return function CPGETTER_FUNCTION() {\n if (trap) {\n return trap;\n }\n\n trap = trapFor(this, name, descriptor);\n return trap;\n };\n };\n }\n\n /**\n NOTE: This is a low-level method used by other parts of the API. You almost\n never want to call this method directly. Instead you should use\n `mixin()` to define new properties.\n \n Defines a property on an object. This method works much like the ES5\n `Object.defineProperty()` method except that it can also accept computed\n properties and other special descriptors.\n \n Normally this method takes only three parameters. However if you pass an\n instance of `Descriptor` as the third param then you can pass an\n optional value as the fourth parameter. This is often more efficient than\n creating new descriptor hashes for each property.\n \n ## Examples\n \n ```javascript\n import { defineProperty, computed } from '@ember/object';\n \n // ES5 compatible mode\n defineProperty(contact, 'firstName', {\n writable: true,\n configurable: false,\n enumerable: true,\n value: 'Charles'\n });\n \n // define a simple property\n defineProperty(contact, 'lastName', undefined, 'Jolley');\n \n // define a computed property\n defineProperty(contact, 'fullName', computed('firstName', 'lastName', function() {\n return this.firstName+' '+this.lastName;\n }));\n ```\n \n @private\n @method defineProperty\n @for @ember/object\n @param {Object} obj the object to define this property on. This may be a prototype.\n @param {String} keyName the name of the property\n @param {Descriptor} [desc] an instance of `Descriptor` (typically a\n computed property) or an ES5 descriptor.\n You must provide this or `data` but not both.\n @param {*} [data] something other than a descriptor, that will\n become the explicit value of this property.\n */\n function defineProperty(obj, keyName, desc, data, meta$$1) {\n if (meta$$1 === undefined) {\n meta$$1 = meta(obj);\n }\n\n var watchEntry = meta$$1.peekWatching(keyName);\n var watching = watchEntry !== undefined && watchEntry > 0;\n var previousDesc = descriptorFor(obj, keyName, meta$$1);\n var wasDescriptor = previousDesc !== undefined;\n\n if (wasDescriptor) {\n previousDesc.teardown(obj, keyName, meta$$1);\n\n if (features.EMBER_METAL_ES5_GETTERS) {\n meta$$1.removeDescriptors(keyName);\n }\n }\n\n // used to track if the the property being defined be enumerable\n var enumerable = true;\n\n // Ember.NativeArray is a normal Ember.Mixin that we mix into `Array.prototype` when prototype extensions are enabled\n // mutating a native object prototype like this should _not_ result in enumerable properties being added (or we have significant\n // issues with things like deep equality checks from test frameworks, or things like jQuery.extend(true, [], [])).\n //\n // this is a hack, and we should stop mutating the array prototype by default 😫\n if (obj === Array.prototype) {\n enumerable = false;\n }\n\n var value = void 0;\n if (desc instanceof Descriptor) {\n value = desc;\n\n if (features.EMBER_METAL_ES5_GETTERS || features.DESCRIPTOR_TRAP) {\n Object.defineProperty(obj, keyName, {\n configurable: true,\n enumerable: enumerable,\n get: DESCRIPTOR_GETTER_FUNCTION(keyName, value)\n });\n } else if (features.MANDATORY_SETTER && watching) {\n Object.defineProperty(obj, keyName, {\n configurable: true,\n enumerable: enumerable,\n writable: true,\n value: value\n });\n } else if (enumerable === false) {\n Object.defineProperty(obj, keyName, {\n configurable: true,\n writable: true,\n enumerable: enumerable,\n value: value\n });\n } else {\n obj[keyName] = value;\n }\n\n if (features.EMBER_METAL_ES5_GETTERS) {\n meta$$1.writeDescriptors(keyName, value);\n }\n\n didDefineComputedProperty(obj.constructor);\n\n if (typeof desc.setup === 'function') {\n desc.setup(obj, keyName);\n }\n } else if (desc === undefined || desc === null) {\n value = data;\n\n if (features.MANDATORY_SETTER && watching) {\n meta$$1.writeValues(keyName, data);\n\n var defaultDescriptor = {\n configurable: true,\n enumerable: enumerable,\n set: MANDATORY_SETTER_FUNCTION(keyName),\n get: DEFAULT_GETTER_FUNCTION(keyName)\n };\n\n Object.defineProperty(obj, keyName, defaultDescriptor);\n } else if ((features.EMBER_METAL_ES5_GETTERS || features.DESCRIPTOR_TRAP) && wasDescriptor) {\n Object.defineProperty(obj, keyName, {\n configurable: true,\n enumerable: enumerable,\n writable: true,\n value: value\n });\n } else if (enumerable === false) {\n Object.defineProperty(obj, keyName, {\n configurable: true,\n enumerable: enumerable,\n writable: true,\n value: value\n });\n } else {\n obj[keyName] = data;\n }\n } else {\n value = desc;\n\n // fallback to ES5\n Object.defineProperty(obj, keyName, desc);\n }\n\n // if key is being watched, override chains that\n // were initialized with the prototype\n if (watching) {\n overrideChains(obj, keyName, meta$$1);\n }\n\n // The `value` passed to the `didDefineProperty` hook is\n // either the descriptor or data, whichever was passed.\n if (typeof obj.didDefineProperty === 'function') {\n obj.didDefineProperty(obj, keyName, value);\n }\n\n return this;\n }\n\n var hasCachedComputedProperties = false;\n function _hasCachedComputedProperties() {\n hasCachedComputedProperties = true;\n }\n\n function didDefineComputedProperty(constructor) {\n if (hasCachedComputedProperties === false) {\n return;\n }\n var cache = meta(constructor).readableCache();\n\n if (cache && cache._computedProperties !== undefined) {\n cache._computedProperties = undefined;\n }\n }\n\n var handleMandatorySetter = void 0;\n\n function watchKey(obj, keyName, _meta) {\n if (typeof obj !== 'object' || obj === null) {\n return;\n }\n\n var meta$$1 = _meta === undefined ? meta(obj) : _meta;\n var count = meta$$1.peekWatching(keyName) || 0;\n meta$$1.writeWatching(keyName, count + 1);\n\n if (count === 0) {\n // activate watching first time\n var possibleDesc = descriptorFor(obj, keyName, meta$$1);\n\n if (possibleDesc !== undefined && possibleDesc.willWatch) {\n possibleDesc.willWatch(obj, keyName, meta$$1);\n }\n\n if (typeof obj.willWatchProperty === 'function') {\n obj.willWatchProperty(keyName);\n }\n\n if (features.MANDATORY_SETTER) {\n // NOTE: this is dropped for prod + minified builds\n handleMandatorySetter(meta$$1, obj, keyName);\n }\n }\n }\n\n if (features.MANDATORY_SETTER) {\n var _hasOwnProperty = function (obj, key) {\n return Object.prototype.hasOwnProperty.call(obj, key);\n };\n var _propertyIsEnumerable = function (obj, key) {\n return Object.prototype.propertyIsEnumerable.call(obj, key);\n };\n\n // Future traveler, although this code looks scary. It merely exists in\n // development to aid in development asertions. Production builds of\n // ember strip this entire block out\n handleMandatorySetter = function handleMandatorySetter(m, obj, keyName) {\n var descriptor = emberUtils.lookupDescriptor(obj, keyName);\n var hasDescriptor = descriptor !== null;\n var possibleDesc = hasDescriptor && descriptor.value;\n if (isDescriptor(possibleDesc)) {\n return;\n }\n var configurable = hasDescriptor ? descriptor.configurable : true;\n var isWritable = hasDescriptor ? descriptor.writable : true;\n var hasValue = hasDescriptor ? 'value' in descriptor : true;\n\n // this x in Y deopts, so keeping it in this function is better;\n if (configurable && isWritable && hasValue && keyName in obj) {\n var desc = {\n configurable: true,\n set: MANDATORY_SETTER_FUNCTION(keyName),\n enumerable: _propertyIsEnumerable(obj, keyName),\n get: undefined\n };\n\n if (_hasOwnProperty(obj, keyName)) {\n m.writeValues(keyName, obj[keyName]);\n desc.get = DEFAULT_GETTER_FUNCTION(keyName);\n } else {\n desc.get = INHERITING_GETTER_FUNCTION(keyName);\n }\n\n Object.defineProperty(obj, keyName, desc);\n }\n };\n }\n\n function unwatchKey(obj, keyName, _meta) {\n if (typeof obj !== 'object' || obj === null) {\n return;\n }\n var meta$$1 = _meta === undefined ? peekMeta(obj) : _meta;\n\n // do nothing of this object has already been destroyed\n if (meta$$1 === undefined || meta$$1.isSourceDestroyed()) {\n return;\n }\n\n var count = meta$$1.peekWatching(keyName);\n if (count === 1) {\n meta$$1.writeWatching(keyName, 0);\n\n var possibleDesc = descriptorFor(obj, keyName, meta$$1);\n var _isDescriptor = possibleDesc !== undefined;\n\n if (_isDescriptor && possibleDesc.didUnwatch) {\n possibleDesc.didUnwatch(obj, keyName, meta$$1);\n }\n\n if (typeof obj.didUnwatchProperty === 'function') {\n obj.didUnwatchProperty(keyName);\n }\n\n if (features.MANDATORY_SETTER) {\n // It is true, the following code looks quite WAT. But have no fear, It\n // exists purely to improve development ergonomics and is removed from\n // ember.min.js and ember.prod.js builds.\n //\n // Some further context: Once a property is watched by ember, bypassing `set`\n // for mutation, will bypass observation. This code exists to assert when\n // that occurs, and attempt to provide more helpful feedback. The alternative\n // is tricky to debug partially observable properties.\n if (!_isDescriptor && keyName in obj) {\n var maybeMandatoryDescriptor = emberUtils.lookupDescriptor(obj, keyName);\n\n if (maybeMandatoryDescriptor.set && maybeMandatoryDescriptor.set.isMandatorySetter) {\n if (maybeMandatoryDescriptor.get && maybeMandatoryDescriptor.get.isInheritingGetter) {\n var possibleValue = meta$$1.readInheritedValue('values', keyName);\n if (possibleValue === UNDEFINED) {\n delete obj[keyName];\n return;\n }\n }\n\n Object.defineProperty(obj, keyName, {\n configurable: true,\n enumerable: Object.prototype.propertyIsEnumerable.call(obj, keyName),\n writable: true,\n value: meta$$1.peekValues(keyName)\n });\n meta$$1.deleteFromValues(keyName);\n }\n }\n }\n } else if (count > 1) {\n meta$$1.writeWatching(keyName, count - 1);\n }\n }\n\n var FIRST_KEY = /^([^\\.]+)/;\n\n function firstKey(path) {\n return path.match(FIRST_KEY)[0];\n }\n\n function isObject(obj) {\n return typeof obj === 'object' && obj !== null;\n }\n\n function isVolatile(obj, keyName, meta$$1) {\n var desc = descriptorFor(obj, keyName, meta$$1);\n return !(desc !== undefined && desc._volatile === false);\n }\n\n var ChainWatchers = function () {\n function ChainWatchers() {\n emberBabel.classCallCheck(this, ChainWatchers);\n\n // chain nodes that reference a key in this obj by key\n // we only create ChainWatchers when we are going to add them\n // so create this upfront\n this.chains = Object.create(null);\n }\n\n ChainWatchers.prototype.add = function add(key, node) {\n var nodes = this.chains[key];\n if (nodes === undefined) {\n this.chains[key] = [node];\n } else {\n nodes.push(node);\n }\n };\n\n ChainWatchers.prototype.remove = function remove(key, node) {\n var nodes = this.chains[key];\n if (nodes !== undefined) {\n for (var i = 0; i < nodes.length; i++) {\n if (nodes[i] === node) {\n nodes.splice(i, 1);\n break;\n }\n }\n }\n };\n\n ChainWatchers.prototype.has = function has(key, node) {\n var nodes = this.chains[key];\n if (nodes !== undefined) {\n for (var i = 0; i < nodes.length; i++) {\n if (nodes[i] === node) {\n return true;\n }\n }\n }\n return false;\n };\n\n ChainWatchers.prototype.revalidateAll = function revalidateAll() {\n for (var key in this.chains) {\n this.notify(key, true, undefined);\n }\n };\n\n ChainWatchers.prototype.revalidate = function revalidate(key) {\n this.notify(key, true, undefined);\n };\n\n // key: the string key that is part of a path changed\n // revalidate: boolean; the chains that are watching this value should revalidate\n // callback: function that will be called with the object and path that\n // will be/are invalidated by this key change, depending on\n // whether the revalidate flag is passed\n\n\n ChainWatchers.prototype.notify = function notify(key, revalidate, callback) {\n var nodes = this.chains[key];\n if (nodes === undefined || nodes.length === 0) {\n return;\n }\n\n var affected = void 0;\n\n if (callback) {\n affected = [];\n }\n\n for (var i = 0; i < nodes.length; i++) {\n nodes[i].notify(revalidate, affected);\n }\n\n if (callback === undefined) {\n return;\n }\n\n // we gather callbacks so we don't notify them during revalidation\n for (var _i = 0; _i < affected.length; _i += 2) {\n var obj = affected[_i];\n var path = affected[_i + 1];\n callback(obj, path);\n }\n };\n\n return ChainWatchers;\n }();\n\n function makeChainWatcher() {\n return new ChainWatchers();\n }\n\n function makeChainNode(obj) {\n return new ChainNode(null, null, obj);\n }\n\n function addChainWatcher(obj, keyName, node) {\n var m = meta(obj);\n m.writableChainWatchers(makeChainWatcher).add(keyName, node);\n watchKey(obj, keyName, m);\n }\n\n function removeChainWatcher(obj, keyName, node, _meta) {\n if (!isObject(obj)) {\n return;\n }\n\n var meta$$1 = _meta === undefined ? peekMeta(obj) : _meta;\n\n if (meta$$1 === undefined || meta$$1.readableChainWatchers() === undefined) {\n return;\n }\n\n // make meta writable\n meta$$1 = meta(obj);\n\n meta$$1.readableChainWatchers().remove(keyName, node);\n\n unwatchKey(obj, keyName, meta$$1);\n }\n\n // A ChainNode watches a single key on an object. If you provide a starting\n // value for the key then the node won't actually watch it. For a root node\n // pass null for parent and key and object for value.\n\n var ChainNode = function () {\n function ChainNode(parent, key, value) {\n emberBabel.classCallCheck(this, ChainNode);\n\n this._parent = parent;\n this._key = key;\n\n // _watching is true when calling get(this._parent, this._key) will\n // return the value of this node.\n //\n // It is false for the root of a chain (because we have no parent)\n // and for global paths (because the parent node is the object with\n // the observer on it)\n var isWatching = this._watching = value === undefined;\n\n this._chains = undefined;\n this._object = undefined;\n this.count = 0;\n\n this._value = value;\n this._paths = undefined;\n if (isWatching) {\n var obj = parent.value();\n\n if (!isObject(obj)) {\n return;\n }\n\n this._object = obj;\n\n addChainWatcher(this._object, this._key, this);\n }\n }\n\n ChainNode.prototype.value = function value() {\n if (this._value === undefined && this._watching) {\n var obj = this._parent.value();\n this._value = lazyGet(obj, this._key);\n }\n return this._value;\n };\n\n ChainNode.prototype.destroy = function destroy() {\n if (this._watching) {\n removeChainWatcher(this._object, this._key, this);\n this._watching = false; // so future calls do nothing\n }\n };\n\n // copies a top level object only\n\n\n ChainNode.prototype.copy = function copy(obj) {\n var ret = makeChainNode(obj);\n var paths = this._paths;\n if (paths !== undefined) {\n var path = void 0;\n for (path in paths) {\n if (paths[path] > 0) {\n ret.add(path);\n }\n }\n }\n return ret;\n };\n\n // called on the root node of a chain to setup watchers on the specified\n // path.\n\n\n ChainNode.prototype.add = function add(path) {\n var paths = this._paths || (this._paths = {});\n paths[path] = (paths[path] || 0) + 1;\n\n var key = firstKey(path);\n var tail = path.slice(key.length + 1);\n\n this.chain(key, tail);\n };\n\n // called on the root node of a chain to teardown watcher on the specified\n // path\n\n\n ChainNode.prototype.remove = function remove(path) {\n var paths = this._paths;\n if (paths === undefined) {\n return;\n }\n if (paths[path] > 0) {\n paths[path]--;\n }\n\n var key = firstKey(path);\n var tail = path.slice(key.length + 1);\n\n this.unchain(key, tail);\n };\n\n ChainNode.prototype.chain = function chain(key, path) {\n var chains = this._chains;\n var node = void 0;\n if (chains === undefined) {\n chains = this._chains = Object.create(null);\n } else {\n node = chains[key];\n }\n\n if (node === undefined) {\n node = chains[key] = new ChainNode(this, key, undefined);\n }\n\n node.count++; // count chains...\n\n // chain rest of path if there is one\n if (path) {\n key = firstKey(path);\n path = path.slice(key.length + 1);\n node.chain(key, path);\n }\n };\n\n ChainNode.prototype.unchain = function unchain(key, path) {\n var chains = this._chains;\n var node = chains[key];\n\n // unchain rest of path first...\n if (path && path.length > 1) {\n var nextKey = firstKey(path);\n var nextPath = path.slice(nextKey.length + 1);\n node.unchain(nextKey, nextPath);\n }\n\n // delete node if needed.\n node.count--;\n if (node.count <= 0) {\n chains[node._key] = undefined;\n node.destroy();\n }\n };\n\n ChainNode.prototype.notify = function notify(revalidate, affected) {\n if (revalidate && this._watching) {\n var parentValue = this._parent.value();\n\n if (parentValue !== this._object) {\n removeChainWatcher(this._object, this._key, this);\n\n if (isObject(parentValue)) {\n this._object = parentValue;\n addChainWatcher(parentValue, this._key, this);\n } else {\n this._object = undefined;\n }\n }\n this._value = undefined;\n }\n\n // then notify chains...\n var chains = this._chains;\n if (chains !== undefined) {\n var node = void 0;\n for (var key in chains) {\n node = chains[key];\n if (node !== undefined) {\n node.notify(revalidate, affected);\n }\n }\n }\n\n if (affected && this._parent) {\n this._parent.populateAffected(this._key, 1, affected);\n }\n };\n\n ChainNode.prototype.populateAffected = function populateAffected(path, depth, affected) {\n if (this._key) {\n path = this._key + '.' + path;\n }\n\n if (this._parent) {\n this._parent.populateAffected(path, depth + 1, affected);\n } else if (depth > 1) {\n affected.push(this.value(), path);\n }\n };\n\n return ChainNode;\n }();\n\n function lazyGet(obj, key) {\n if (!isObject(obj)) {\n return;\n }\n\n var meta$$1 = peekMeta(obj);\n\n // check if object meant only to be a prototype\n if (meta$$1 !== undefined && meta$$1.proto === obj) {\n return;\n }\n\n // Use `get` if the return value is an EachProxy or an uncacheable value.\n if (isVolatile(obj, key, meta$$1)) {\n return get(obj, key);\n // Otherwise attempt to get the cached value of the computed property\n } else {\n var cache = meta$$1.readableCache();\n if (cache !== undefined) {\n return cacheFor.get(cache, key);\n }\n }\n }\n\n function finishChains(meta$$1) {\n // finish any current chains node watchers that reference obj\n var chainWatchers = meta$$1.readableChainWatchers();\n if (chainWatchers !== undefined) {\n chainWatchers.revalidateAll();\n }\n // ensure that if we have inherited any chains they have been\n // copied onto our own meta.\n if (meta$$1.readableChains() !== undefined) {\n meta$$1.writableChains(makeChainNode);\n }\n }\n\n var counters = void 0;\n {\n counters = {\n peekCalls: 0,\n peekParentCalls: 0,\n peekPrototypeWalks: 0,\n setCalls: 0,\n deleteCalls: 0,\n metaCalls: 0,\n metaInstantiated: 0\n };\n }\n\n /**\n @module ember\n */\n\n var UNDEFINED = emberUtils.symbol('undefined');\n\n // FLAGS\n var SOURCE_DESTROYING = 1 << 1;\n var SOURCE_DESTROYED = 1 << 2;\n var META_DESTROYED = 1 << 3;\n var IS_PROXY = 1 << 4;\n\n var NODE_STACK = [];\n\n var Meta = function () {\n function Meta(obj, parentMeta) {\n emberBabel.classCallCheck(this, Meta);\n\n {\n counters.metaInstantiated++;\n }\n\n this._cache = undefined;\n\n if (features.EMBER_METAL_ES5_GETTERS) {\n this._descriptors = undefined;\n }\n\n this._watching = undefined;\n this._mixins = undefined;\n if (emberEnvironment.ENV._ENABLE_BINDING_SUPPORT) {\n this._bindings = undefined;\n }\n this._values = undefined;\n this._deps = undefined;\n this._chainWatchers = undefined;\n this._chains = undefined;\n this._tag = undefined;\n this._tags = undefined;\n this._factory = undefined;\n\n // initial value for all flags right now is false\n // see FLAGS const for detailed list of flags used\n this._flags = 0;\n\n // used only internally\n this.source = obj;\n\n // when meta(obj).proto === obj, the object is intended to be only a\n // prototype and doesn't need to actually be observable itself\n this.proto = undefined;\n\n // The next meta in our inheritance chain. We (will) track this\n // explicitly instead of using prototypical inheritance because we\n // have detailed knowledge of how each property should really be\n // inherited, and we can optimize it much better than JS runtimes.\n this.parent = parentMeta;\n\n this._listeners = undefined;\n this._listenersFinalized = false;\n }\n\n Meta.prototype.isInitialized = function isInitialized(obj) {\n return this.proto !== obj;\n };\n\n Meta.prototype.destroy = function destroy() {\n if (this.isMetaDestroyed()) {\n return;\n }\n\n // remove chainWatchers to remove circular references that would prevent GC\n var nodes = void 0,\n key = void 0,\n nodeObject = void 0;\n var node = this.readableChains();\n if (node !== undefined) {\n NODE_STACK.push(node);\n // process tree\n while (NODE_STACK.length > 0) {\n node = NODE_STACK.pop();\n // push children\n nodes = node._chains;\n if (nodes !== undefined) {\n for (key in nodes) {\n if (nodes[key] !== undefined) {\n NODE_STACK.push(nodes[key]);\n }\n }\n }\n\n // remove chainWatcher in node object\n if (node._watching) {\n nodeObject = node._object;\n if (nodeObject !== undefined) {\n var foreignMeta = peekMeta(nodeObject);\n // avoid cleaning up chain watchers when both current and\n // foreign objects are being destroyed\n // if both are being destroyed manual cleanup is not needed\n // as they will be GC'ed and no non-destroyed references will\n // be remaining\n if (foreignMeta && !foreignMeta.isSourceDestroying()) {\n removeChainWatcher(nodeObject, node._key, node, foreignMeta);\n }\n }\n }\n }\n }\n\n this.setMetaDestroyed();\n };\n\n Meta.prototype.isSourceDestroying = function isSourceDestroying() {\n return (this._flags & SOURCE_DESTROYING) !== 0;\n };\n\n Meta.prototype.setSourceDestroying = function setSourceDestroying() {\n this._flags |= SOURCE_DESTROYING;\n };\n\n Meta.prototype.isSourceDestroyed = function isSourceDestroyed() {\n return (this._flags & SOURCE_DESTROYED) !== 0;\n };\n\n Meta.prototype.setSourceDestroyed = function setSourceDestroyed() {\n this._flags |= SOURCE_DESTROYED;\n };\n\n Meta.prototype.isMetaDestroyed = function isMetaDestroyed() {\n return (this._flags & META_DESTROYED) !== 0;\n };\n\n Meta.prototype.setMetaDestroyed = function setMetaDestroyed() {\n this._flags |= META_DESTROYED;\n };\n\n Meta.prototype.isProxy = function isProxy() {\n return (this._flags & IS_PROXY) !== 0;\n };\n\n Meta.prototype.setProxy = function setProxy() {\n this._flags |= IS_PROXY;\n };\n\n Meta.prototype._getOrCreateOwnMap = function _getOrCreateOwnMap(key) {\n return this[key] || (this[key] = Object.create(null));\n };\n\n Meta.prototype._getInherited = function _getInherited(key) {\n var pointer = this;\n while (pointer !== undefined) {\n var map = pointer[key];\n if (map !== undefined) {\n return map;\n }\n pointer = pointer.parent;\n }\n };\n\n Meta.prototype._findInherited = function _findInherited(key, subkey) {\n var pointer = this;\n while (pointer !== undefined) {\n var map = pointer[key];\n if (map !== undefined) {\n var value = map[subkey];\n if (value !== undefined) {\n return value;\n }\n }\n pointer = pointer.parent;\n }\n };\n\n // Implements a member that provides a lazily created map of maps,\n // with inheritance at both levels.\n\n\n Meta.prototype.writeDeps = function writeDeps(subkey, itemkey, value) {\n true && !!this.isMetaDestroyed() && emberDebug.assert('Cannot modify dependent keys for `' + itemkey + '` on `' + emberUtils.toString(this.source) + '` after it has been destroyed.', !this.isMetaDestroyed());\n\n var outerMap = this._getOrCreateOwnMap('_deps');\n var innerMap = outerMap[subkey];\n if (innerMap === undefined) {\n innerMap = outerMap[subkey] = Object.create(null);\n }\n innerMap[itemkey] = value;\n };\n\n Meta.prototype.peekDeps = function peekDeps(subkey, itemkey) {\n var pointer = this;\n while (pointer !== undefined) {\n var map = pointer._deps;\n if (map !== undefined) {\n var value = map[subkey];\n if (value !== undefined) {\n var itemvalue = value[itemkey];\n if (itemvalue !== undefined) {\n return itemvalue;\n }\n }\n }\n pointer = pointer.parent;\n }\n };\n\n Meta.prototype.hasDeps = function hasDeps(subkey) {\n var pointer = this;\n while (pointer !== undefined) {\n var deps = pointer._deps;\n if (deps !== undefined && deps[subkey] !== undefined) {\n return true;\n }\n pointer = pointer.parent;\n }\n return false;\n };\n\n Meta.prototype.forEachInDeps = function forEachInDeps(subkey, fn) {\n return this._forEachIn('_deps', subkey, fn);\n };\n\n Meta.prototype._forEachIn = function _forEachIn(key, subkey, fn) {\n var pointer = this;\n var seen = void 0;\n var calls = void 0;\n while (pointer !== undefined) {\n var map = pointer[key];\n if (map !== undefined) {\n var innerMap = map[subkey];\n if (innerMap !== undefined) {\n for (var innerKey in innerMap) {\n seen = seen === undefined ? new Set() : seen;\n if (!seen.has(innerKey)) {\n seen.add(innerKey);\n calls = calls || [];\n calls.push(innerKey, innerMap[innerKey]);\n }\n }\n }\n }\n pointer = pointer.parent;\n }\n\n if (calls !== undefined) {\n for (var i = 0; i < calls.length; i += 2) {\n fn(calls[i], calls[i + 1]);\n }\n }\n };\n\n Meta.prototype.writableCache = function writableCache() {\n return this._getOrCreateOwnMap('_cache');\n };\n\n Meta.prototype.readableCache = function readableCache() {\n return this._cache;\n };\n\n Meta.prototype.writableTags = function writableTags() {\n return this._getOrCreateOwnMap('_tags');\n };\n\n Meta.prototype.readableTags = function readableTags() {\n return this._tags;\n };\n\n Meta.prototype.writableTag = function writableTag(create) {\n true && !!this.isMetaDestroyed() && emberDebug.assert('Cannot create a new tag for `' + emberUtils.toString(this.source) + '` after it has been destroyed.', !this.isMetaDestroyed());\n\n var ret = this._tag;\n if (ret === undefined) {\n ret = this._tag = create(this.source);\n }\n return ret;\n };\n\n Meta.prototype.readableTag = function readableTag() {\n return this._tag;\n };\n\n Meta.prototype.writableChainWatchers = function writableChainWatchers(create) {\n true && !!this.isMetaDestroyed() && emberDebug.assert('Cannot create a new chain watcher for `' + emberUtils.toString(this.source) + '` after it has been destroyed.', !this.isMetaDestroyed());\n\n var ret = this._chainWatchers;\n if (ret === undefined) {\n ret = this._chainWatchers = create(this.source);\n }\n return ret;\n };\n\n Meta.prototype.readableChainWatchers = function readableChainWatchers() {\n return this._chainWatchers;\n };\n\n Meta.prototype.writableChains = function writableChains(create) {\n true && !!this.isMetaDestroyed() && emberDebug.assert('Cannot create a new chains for `' + emberUtils.toString(this.source) + '` after it has been destroyed.', !this.isMetaDestroyed());\n\n var ret = this._chains;\n if (ret === undefined) {\n if (this.parent === undefined) {\n ret = create(this.source);\n } else {\n ret = this.parent.writableChains(create).copy(this.source);\n }\n this._chains = ret;\n }\n return ret;\n };\n\n Meta.prototype.readableChains = function readableChains() {\n return this._getInherited('_chains');\n };\n\n Meta.prototype.writeWatching = function writeWatching(subkey, value) {\n true && !!this.isMetaDestroyed() && emberDebug.assert('Cannot update watchers for `' + subkey + '` on `' + emberUtils.toString(this.source) + '` after it has been destroyed.', !this.isMetaDestroyed());\n\n var map = this._getOrCreateOwnMap('_watching');\n map[subkey] = value;\n };\n\n Meta.prototype.peekWatching = function peekWatching(subkey) {\n return this._findInherited('_watching', subkey);\n };\n\n Meta.prototype.writeMixins = function writeMixins(subkey, value) {\n true && !!this.isMetaDestroyed() && emberDebug.assert('Cannot add mixins for `' + subkey + '` on `' + emberUtils.toString(this.source) + '` call writeMixins after it has been destroyed.', !this.isMetaDestroyed());\n\n var map = this._getOrCreateOwnMap('_mixins');\n map[subkey] = value;\n };\n\n Meta.prototype.peekMixins = function peekMixins(subkey) {\n return this._findInherited('_mixins', subkey);\n };\n\n Meta.prototype.forEachMixins = function forEachMixins(fn) {\n var pointer = this;\n var seen = void 0;\n while (pointer !== undefined) {\n var map = pointer._mixins;\n if (map !== undefined) {\n for (var key in map) {\n seen = seen === undefined ? new Set() : seen;\n if (!seen.has(key)) {\n seen.add(key);\n fn(key, map[key]);\n }\n }\n }\n pointer = pointer.parent;\n }\n };\n\n Meta.prototype.writeBindings = function writeBindings(subkey, value) {\n true && !emberEnvironment.ENV._ENABLE_BINDING_SUPPORT && emberDebug.assert('Cannot invoke `meta.writeBindings` when EmberENV._ENABLE_BINDING_SUPPORT is not set', emberEnvironment.ENV._ENABLE_BINDING_SUPPORT);\n true && !!this.isMetaDestroyed() && emberDebug.assert('Cannot add a binding for `' + subkey + '` on `' + emberUtils.toString(this.source) + '` after it has been destroyed.', !this.isMetaDestroyed());\n\n var map = this._getOrCreateOwnMap('_bindings');\n map[subkey] = value;\n };\n\n Meta.prototype.peekBindings = function peekBindings(subkey) {\n true && !emberEnvironment.ENV._ENABLE_BINDING_SUPPORT && emberDebug.assert('Cannot invoke `meta.peekBindings` when EmberENV._ENABLE_BINDING_SUPPORT is not set', emberEnvironment.ENV._ENABLE_BINDING_SUPPORT);\n\n return this._findInherited('_bindings', subkey);\n };\n\n Meta.prototype.forEachBindings = function forEachBindings(fn) {\n true && !emberEnvironment.ENV._ENABLE_BINDING_SUPPORT && emberDebug.assert('Cannot invoke `meta.forEachBindings` when EmberENV._ENABLE_BINDING_SUPPORT is not set', emberEnvironment.ENV._ENABLE_BINDING_SUPPORT);\n\n var pointer = this;\n var seen = void 0;\n while (pointer !== undefined) {\n var map = pointer._bindings;\n if (map !== undefined) {\n for (var key in map) {\n seen = seen || Object.create(null);\n if (seen[key] === undefined) {\n seen[key] = true;\n fn(key, map[key]);\n }\n }\n }\n pointer = pointer.parent;\n }\n };\n\n Meta.prototype.clearBindings = function clearBindings() {\n true && !emberEnvironment.ENV._ENABLE_BINDING_SUPPORT && emberDebug.assert('Cannot invoke `meta.clearBindings` when EmberENV._ENABLE_BINDING_SUPPORT is not set', emberEnvironment.ENV._ENABLE_BINDING_SUPPORT);\n true && !!this.isMetaDestroyed() && emberDebug.assert('Cannot clear bindings on `' + emberUtils.toString(this.source) + '` after it has been destroyed.', !this.isMetaDestroyed());\n\n this._bindings = undefined;\n };\n\n Meta.prototype.writeValues = function writeValues(subkey, value) {\n true && !!this.isMetaDestroyed() && emberDebug.assert('Cannot set the value of `' + subkey + '` on `' + emberUtils.toString(this.source) + '` after it has been destroyed.', !this.isMetaDestroyed());\n\n var map = this._getOrCreateOwnMap('_values');\n map[subkey] = value;\n };\n\n Meta.prototype.peekValues = function peekValues(subkey) {\n return this._findInherited('_values', subkey);\n };\n\n Meta.prototype.deleteFromValues = function deleteFromValues(subkey) {\n delete this._getOrCreateOwnMap('_values')[subkey];\n };\n\n emberBabel.createClass(Meta, [{\n key: 'factory',\n set: function (factory) {\n this._factory = factory;\n },\n get: function () {\n return this._factory;\n }\n }]);\n\n return Meta;\n }();\n\n for (var name in protoMethods) {\n Meta.prototype[name] = protoMethods[name];\n }\n\n if (features.MANDATORY_SETTER) {\n Meta.prototype.readInheritedValue = function (key, subkey) {\n var internalKey = '_' + key;\n\n var pointer = this;\n\n while (pointer !== undefined) {\n var map = pointer[internalKey];\n if (map !== undefined) {\n var value = map[subkey];\n if (value !== undefined || subkey in map) {\n return value;\n }\n }\n pointer = pointer.parent;\n }\n\n return UNDEFINED;\n };\n\n Meta.prototype.writeValue = function (obj, key, value) {\n var descriptor = emberUtils.lookupDescriptor(obj, key);\n var isMandatorySetter = descriptor !== null && descriptor.set && descriptor.set.isMandatorySetter;\n\n if (isMandatorySetter) {\n this.writeValues(key, value);\n } else {\n obj[key] = value;\n }\n };\n }\n\n if (features.EMBER_METAL_ES5_GETTERS) {\n Meta.prototype.writeDescriptors = function (subkey, value) {\n true && !!this.isMetaDestroyed() && emberDebug.assert('Cannot update descriptors for `' + subkey + '` on `' + emberUtils.toString(this.source) + '` after it has been destroyed.', !this.isMetaDestroyed());\n\n var map = this._getOrCreateOwnMap('_descriptors');\n map[subkey] = value;\n };\n\n Meta.prototype.peekDescriptors = function (subkey) {\n var possibleDesc = this._findInherited('_descriptors', subkey);\n return possibleDesc === UNDEFINED ? undefined : possibleDesc;\n };\n\n Meta.prototype.removeDescriptors = function (subkey) {\n this.writeDescriptors(subkey, UNDEFINED);\n };\n }\n\n var getPrototypeOf = Object.getPrototypeOf;\n var metaStore = new WeakMap();\n\n function setMeta(obj, meta) {\n true && !(obj !== null) && emberDebug.assert('Cannot call `setMeta` on null', obj !== null);\n true && !(obj !== undefined) && emberDebug.assert('Cannot call `setMeta` on undefined', obj !== undefined);\n true && !(typeof obj === 'object' || typeof obj === 'function') && emberDebug.assert('Cannot call `setMeta` on ' + typeof obj, typeof obj === 'object' || typeof obj === 'function');\n\n {\n counters.setCalls++;\n }\n metaStore.set(obj, meta);\n }\n\n function peekMeta(obj) {\n true && !(obj !== null) && emberDebug.assert('Cannot call `peekMeta` on null', obj !== null);\n true && !(obj !== undefined) && emberDebug.assert('Cannot call `peekMeta` on undefined', obj !== undefined);\n true && !(typeof obj === 'object' || typeof obj === 'function') && emberDebug.assert('Cannot call `peekMeta` on ' + typeof obj, typeof obj === 'object' || typeof obj === 'function');\n\n var pointer = obj;\n var meta = void 0;\n while (pointer !== undefined && pointer !== null) {\n meta = metaStore.get(pointer);\n // jshint loopfunc:true\n {\n counters.peekCalls++;\n }\n if (meta !== undefined) {\n return meta;\n }\n\n pointer = getPrototypeOf(pointer);\n {\n counters.peekPrototypeWalks++;\n }\n }\n }\n\n /**\n Tears down the meta on an object so that it can be garbage collected.\n Multiple calls will have no effect.\n \n @method deleteMeta\n @for Ember\n @param {Object} obj the object to destroy\n @return {void}\n @private\n */\n function deleteMeta(obj) {\n true && !(obj !== null) && emberDebug.assert('Cannot call `deleteMeta` on null', obj !== null);\n true && !(obj !== undefined) && emberDebug.assert('Cannot call `deleteMeta` on undefined', obj !== undefined);\n true && !(typeof obj === 'object' || typeof obj === 'function') && emberDebug.assert('Cannot call `deleteMeta` on ' + typeof obj, typeof obj === 'object' || typeof obj === 'function');\n\n {\n counters.deleteCalls++;\n }\n\n var meta = peekMeta(obj);\n if (meta !== undefined) {\n meta.destroy();\n }\n }\n\n /**\n Retrieves the meta hash for an object. If `writable` is true ensures the\n hash is writable for this object as well.\n \n The meta object contains information about computed property descriptors as\n well as any watched properties and other information. You generally will\n not access this information directly but instead work with higher level\n methods that manipulate this hash indirectly.\n \n @method meta\n @for Ember\n @private\n \n @param {Object} obj The object to retrieve meta for\n @param {Boolean} [writable=true] Pass `false` if you do not intend to modify\n the meta hash, allowing the method to avoid making an unnecessary copy.\n @return {Object} the meta hash for an object\n */\n function meta(obj) {\n true && !(obj !== null) && emberDebug.assert('Cannot call `meta` on null', obj !== null);\n true && !(obj !== undefined) && emberDebug.assert('Cannot call `meta` on undefined', obj !== undefined);\n true && !(typeof obj === 'object' || typeof obj === 'function') && emberDebug.assert('Cannot call `meta` on ' + typeof obj, typeof obj === 'object' || typeof obj === 'function');\n\n {\n counters.metaCalls++;\n }\n\n var maybeMeta = peekMeta(obj);\n var parent = void 0;\n\n // remove this code, in-favor of explicit parent\n if (maybeMeta !== undefined) {\n if (maybeMeta.source === obj) {\n return maybeMeta;\n }\n parent = maybeMeta;\n }\n\n var newMeta = new Meta(obj, parent);\n setMeta(obj, newMeta);\n return newMeta;\n }\n\n // Using `symbol()` here causes some node test to fail, presumably\n // because we define the CP with one copy of Ember and boot the app\n // with a different copy, so the random key we generate do not line\n // up. Is that testing a legit scenario?\n var DESCRIPTOR = '__DESCRIPTOR__';\n\n /**\n Returns the CP descriptor assocaited with `obj` and `keyName`, if any.\n \n @method descriptorFor\n @param {Object} obj the object to check\n @param {String} keyName the key to check\n @return {Descriptor}\n @private\n */\n function descriptorFor(obj, keyName, _meta) {\n true && !(obj !== null) && emberDebug.assert('Cannot call `descriptorFor` on null', obj !== null);\n true && !(obj !== undefined) && emberDebug.assert('Cannot call `descriptorFor` on undefined', obj !== undefined);\n true && !(typeof obj === 'object' || typeof obj === 'function') && emberDebug.assert('Cannot call `descriptorFor` on ' + typeof obj, typeof obj === 'object' || typeof obj === 'function');\n\n if (features.EMBER_METAL_ES5_GETTERS) {\n var _meta2 = _meta === undefined ? peekMeta(obj) : _meta;\n\n if (_meta2 !== undefined) {\n return _meta2.peekDescriptors(keyName);\n }\n } else {\n var possibleDesc = obj[keyName];\n\n if (features.DESCRIPTOR_TRAP && isDescriptorTrap(possibleDesc)) {\n return possibleDesc[DESCRIPTOR];\n } else {\n return isDescriptor(possibleDesc) ? possibleDesc : undefined;\n }\n }\n }\n\n function isDescriptorTrap(possibleDesc) {\n if (features.DESCRIPTOR_TRAP) {\n return possibleDesc !== null && typeof possibleDesc === 'object' && possibleDesc[DESCRIPTOR] !== undefined;\n } else {\n throw new Error('Cannot call `isDescriptorTrap` in production');\n }\n }\n\n /**\n Check whether a value is a CP descriptor.\n \n @method descriptorFor\n @param {any} possibleDesc the value to check\n @return {boolean}\n @private\n */\n function isDescriptor(possibleDesc) {\n return possibleDesc !== null && typeof possibleDesc === 'object' && possibleDesc.isDescriptor;\n }\n\n var Cache = function () {\n function Cache(limit, func, key, store) {\n emberBabel.classCallCheck(this, Cache);\n\n this.size = 0;\n this.misses = 0;\n this.hits = 0;\n this.limit = limit;\n this.func = func;\n this.key = key;\n this.store = store || new DefaultStore();\n }\n\n Cache.prototype.get = function get(obj) {\n var key = this.key === undefined ? obj : this.key(obj);\n var value = this.store.get(key);\n if (value === undefined) {\n this.misses++;\n value = this._set(key, this.func(obj));\n } else if (value === UNDEFINED) {\n this.hits++;\n value = undefined;\n } else {\n this.hits++;\n // nothing to translate\n }\n\n return value;\n };\n\n Cache.prototype.set = function set(obj, value) {\n var key = this.key === undefined ? obj : this.key(obj);\n return this._set(key, value);\n };\n\n Cache.prototype._set = function _set(key, value) {\n if (this.limit > this.size) {\n this.size++;\n if (value === undefined) {\n this.store.set(key, UNDEFINED);\n } else {\n this.store.set(key, value);\n }\n }\n\n return value;\n };\n\n Cache.prototype.purge = function purge() {\n this.store.clear();\n this.size = 0;\n this.hits = 0;\n this.misses = 0;\n };\n\n return Cache;\n }();\n\n var DefaultStore = function () {\n function DefaultStore() {\n emberBabel.classCallCheck(this, DefaultStore);\n\n this.data = Object.create(null);\n }\n\n DefaultStore.prototype.get = function get(key) {\n return this.data[key];\n };\n\n DefaultStore.prototype.set = function set(key, value) {\n this.data[key] = value;\n };\n\n DefaultStore.prototype.clear = function clear() {\n this.data = Object.create(null);\n };\n\n return DefaultStore;\n }();\n\n var firstDotIndexCache = new Cache(1000, function (key) {\n return key.indexOf('.');\n });\n\n function isPath(path) {\n return typeof path === 'string' && firstDotIndexCache.get(path) !== -1;\n }\n\n /**\n @module @ember/object\n */\n\n var ALLOWABLE_TYPES = {\n object: true,\n function: true,\n string: true\n };\n\n // ..........................................................\n // GET AND SET\n //\n // If we are on a platform that supports accessors we can use those.\n // Otherwise simulate accessors by looking up the property directly on the\n // object.\n\n /**\n Gets the value of a property on an object. If the property is computed,\n the function will be invoked. If the property is not defined but the\n object implements the `unknownProperty` method then that will be invoked.\n \n ```javascript\n import { get } from '@ember/object';\n get(obj, \"name\");\n ```\n \n If you plan to run on IE8 and older browsers then you should use this\n method anytime you want to retrieve a property on an object that you don't\n know for sure is private. (Properties beginning with an underscore '_'\n are considered private.)\n \n On all newer browsers, you only need to use this method to retrieve\n properties if the property might not be defined on the object and you want\n to respect the `unknownProperty` handler. Otherwise you can ignore this\n method.\n \n Note that if the object itself is `undefined`, this method will throw\n an error.\n \n @method get\n @for @ember/object\n @static\n @param {Object} obj The object to retrieve from.\n @param {String} keyName The property key to retrieve\n @return {Object} the property value or `null`.\n @public\n */\n function get(obj, keyName) {\n true && !(arguments.length === 2) && emberDebug.assert('Get must be called with two arguments; an object and a property key', arguments.length === 2);\n true && !(obj !== undefined && obj !== null) && emberDebug.assert('Cannot call get with \\'' + keyName + '\\' on an undefined object.', obj !== undefined && obj !== null);\n true && !(typeof keyName === 'string' || typeof keyName === 'number' && !isNaN(keyName)) && emberDebug.assert('The key provided to get must be a string or number, you passed ' + keyName, typeof keyName === 'string' || typeof keyName === 'number' && !isNaN(keyName));\n true && !(typeof keyName !== 'string' || keyName.lastIndexOf('this.', 0) !== 0) && emberDebug.assert('\\'this\\' in paths is not supported', typeof keyName !== 'string' || keyName.lastIndexOf('this.', 0) !== 0);\n true && !(keyName !== '') && emberDebug.assert('Cannot call `get` with an empty string', keyName !== '');\n\n var type = typeof obj;\n\n var isObject = type === 'object';\n var isFunction = type === 'function';\n var isObjectLike = isObject || isFunction;\n\n var descriptor = undefined;\n var value = void 0;\n\n if (isObjectLike) {\n if (features.EMBER_METAL_ES5_GETTERS) {\n descriptor = descriptorFor(obj, keyName);\n }\n\n if (!features.EMBER_METAL_ES5_GETTERS || descriptor === undefined) {\n value = obj[keyName];\n\n if (features.DESCRIPTOR_TRAP && isDescriptorTrap(value)) {\n descriptor = value[DESCRIPTOR];\n } else if (isDescriptor(value)) {\n descriptor = value;\n }\n }\n\n if (descriptor !== undefined) {\n return descriptor.get(obj, keyName);\n }\n } else {\n value = obj[keyName];\n }\n\n if (isPath(keyName)) {\n return _getPath(obj, keyName);\n } else if (value === undefined && isObject && !(keyName in obj) && typeof obj.unknownProperty === 'function') {\n return obj.unknownProperty(keyName);\n } else {\n return value;\n }\n }\n\n function _getPath(root, path) {\n var obj = root;\n var parts = path.split('.');\n\n for (var i = 0; i < parts.length; i++) {\n if (!isGettable(obj)) {\n return undefined;\n }\n\n obj = get(obj, parts[i]);\n\n if (obj && obj.isDestroyed) {\n return undefined;\n }\n }\n\n return obj;\n }\n\n function isGettable(obj) {\n return obj !== undefined && obj !== null && ALLOWABLE_TYPES[typeof obj];\n }\n\n /**\n Retrieves the value of a property from an Object, or a default value in the\n case that the property returns `undefined`.\n \n ```javascript\n import { getWithDefault } from '@ember/object';\n getWithDefault(person, 'lastName', 'Doe');\n ```\n \n @method getWithDefault\n @for @ember/object\n @static\n @param {Object} obj The object to retrieve from.\n @param {String} keyName The name of the property to retrieve\n @param {Object} defaultValue The value to return if the property value is undefined\n @return {Object} The property value or the defaultValue.\n @public\n */\n function getWithDefault(root, key, defaultValue) {\n var value = get(root, key);\n\n if (value === undefined) {\n return defaultValue;\n }\n return value;\n }\n\n /**\n @module @ember/object\n */\n /**\n Sets the value of a property on an object, respecting computed properties\n and notifying observers and other listeners of the change. If the\n property is not defined but the object implements the `setUnknownProperty`\n method then that will be invoked as well.\n \n ```javascript\n import { set } from '@ember/object';\n set(obj, \"name\", value);\n ```\n \n @method set\n @static\n @for @ember/object\n @param {Object} obj The object to modify.\n @param {String} keyName The property key to set\n @param {Object} value The value to set\n @return {Object} the passed value.\n @public\n */\n function set(obj, keyName, value, tolerant) {\n true && !(arguments.length === 3 || arguments.length === 4) && emberDebug.assert('Set must be called with three or four arguments; an object, a property key, a value and tolerant true/false', arguments.length === 3 || arguments.length === 4);\n true && !(obj && typeof obj === 'object' || typeof obj === 'function') && emberDebug.assert('Cannot call set with \\'' + keyName + '\\' on an undefined object.', obj && typeof obj === 'object' || typeof obj === 'function');\n true && !(typeof keyName === 'string' || typeof keyName === 'number' && !isNaN(keyName)) && emberDebug.assert('The key provided to set must be a string or number, you passed ' + keyName, typeof keyName === 'string' || typeof keyName === 'number' && !isNaN(keyName));\n true && !(typeof keyName !== 'string' || keyName.lastIndexOf('this.', 0) !== 0) && emberDebug.assert('\\'this\\' in paths is not supported', typeof keyName !== 'string' || keyName.lastIndexOf('this.', 0) !== 0);\n true && !!obj.isDestroyed && emberDebug.assert('calling set on destroyed object: ' + emberUtils.toString(obj) + '.' + keyName + ' = ' + emberUtils.toString(value), !obj.isDestroyed);\n\n if (isPath(keyName)) {\n return setPath(obj, keyName, value, tolerant);\n }\n\n if (features.EMBER_METAL_ES5_GETTERS) {\n var possibleDesc = descriptorFor(obj, keyName);\n\n if (possibleDesc !== undefined) {\n /* computed property */\n possibleDesc.set(obj, keyName, value);\n return value;\n }\n }\n\n var currentValue = obj[keyName];\n\n if (features.DESCRIPTOR_TRAP && isDescriptorTrap(currentValue)) {\n currentValue = currentValue[DESCRIPTOR];\n }\n\n if (isDescriptor(currentValue)) {\n /* computed property */\n currentValue.set(obj, keyName, value);\n } else if (currentValue === undefined && 'object' === typeof obj && !(keyName in obj) && typeof obj.setUnknownProperty === 'function') {\n /* unknown property */\n obj.setUnknownProperty(keyName, value);\n } else if (currentValue === value) {/* no change */\n } else {\n var meta$$1 = peekMeta(obj);\n propertyWillChange(obj, keyName, meta$$1);\n\n if (features.MANDATORY_SETTER) {\n setWithMandatorySetter(meta$$1, obj, keyName, value);\n } else {\n obj[keyName] = value;\n }\n\n propertyDidChange(obj, keyName, meta$$1);\n }\n\n return value;\n }\n\n if (features.MANDATORY_SETTER) {\n var setWithMandatorySetter = function (meta$$1, obj, keyName, value) {\n if (meta$$1 !== undefined && meta$$1.peekWatching(keyName) > 0) {\n makeEnumerable(obj, keyName);\n meta$$1.writeValue(obj, keyName, value);\n } else {\n obj[keyName] = value;\n }\n };\n\n var makeEnumerable = function (obj, key) {\n var desc = Object.getOwnPropertyDescriptor(obj, key);\n\n if (desc && desc.set && desc.set.isMandatorySetter) {\n desc.enumerable = true;\n Object.defineProperty(obj, key, desc);\n }\n };\n }\n\n function setPath(root, path, value, tolerant) {\n var parts = path.split('.');\n var keyName = parts.pop();\n\n true && !(keyName.trim().length > 0) && emberDebug.assert('Property set failed: You passed an empty path', keyName.trim().length > 0);\n\n var newPath = parts.join('.');\n\n var newRoot = _getPath(root, newPath);\n\n if (newRoot) {\n return set(newRoot, keyName, value);\n } else if (!tolerant) {\n throw new emberDebug.Error('Property set failed: object in path \"' + newPath + '\" could not be found or was destroyed.');\n }\n }\n\n /**\n Error-tolerant form of `set`. Will not blow up if any part of the\n chain is `undefined`, `null`, or destroyed.\n \n This is primarily used when syncing bindings, which may try to update after\n an object has been destroyed.\n \n @method trySet\n @static\n @for @ember/object\n @param {Object} root The object to modify.\n @param {String} path The property path to set\n @param {Object} value The value to set\n @public\n */\n function trySet(root, path, value) {\n return set(root, path, value, true);\n }\n\n /**\n @module @ember/object\n */\n\n var END_WITH_EACH_REGEX = /\\.@each$/;\n\n /**\n Expands `pattern`, invoking `callback` for each expansion.\n \n The only pattern supported is brace-expansion, anything else will be passed\n once to `callback` directly.\n \n Example\n \n ```js\n import { expandProperties } from '@ember/object/computed';\n \n function echo(arg){ console.log(arg); }\n \n expandProperties('foo.bar', echo); //=> 'foo.bar'\n expandProperties('{foo,bar}', echo); //=> 'foo', 'bar'\n expandProperties('foo.{bar,baz}', echo); //=> 'foo.bar', 'foo.baz'\n expandProperties('{foo,bar}.baz', echo); //=> 'foo.baz', 'bar.baz'\n expandProperties('foo.{bar,baz}.[]', echo) //=> 'foo.bar.[]', 'foo.baz.[]'\n expandProperties('{foo,bar}.{spam,eggs}', echo) //=> 'foo.spam', 'foo.eggs', 'bar.spam', 'bar.eggs'\n expandProperties('{foo}.bar.{baz}') //=> 'foo.bar.baz'\n ```\n \n @method expandProperties\n @static\n @for @ember/object\n @public\n @param {String} pattern The property pattern to expand.\n @param {Function} callback The callback to invoke. It is invoked once per\n expansion, and is passed the expansion.\n */\n function expandProperties(pattern, callback) {\n true && !(typeof pattern === 'string') && emberDebug.assert('A computed property key must be a string, you passed ' + typeof pattern + ' ' + pattern, typeof pattern === 'string');\n true && !(pattern.indexOf(' ') === -1) && emberDebug.assert('Brace expanded properties cannot contain spaces, e.g. \"user.{firstName, lastName}\" should be \"user.{firstName,lastName}\"', pattern.indexOf(' ') === -1);\n // regex to look for double open, double close, or unclosed braces\n\n true && !(pattern.match(/\\{[^}{]*\\{|\\}[^}{]*\\}|\\{[^}]*$/g) === null) && emberDebug.assert('Brace expanded properties have to be balanced and cannot be nested, pattern: ' + pattern, pattern.match(/\\{[^}{]*\\{|\\}[^}{]*\\}|\\{[^}]*$/g) === null);\n\n var start = pattern.indexOf('{');\n if (start < 0) {\n callback(pattern.replace(END_WITH_EACH_REGEX, '.[]'));\n } else {\n dive('', pattern, start, callback);\n }\n }\n\n function dive(prefix, pattern, start, callback) {\n var end = pattern.indexOf('}'),\n i = 0,\n newStart = void 0,\n arrayLength = void 0;\n var tempArr = pattern.substring(start + 1, end).split(',');\n var after = pattern.substring(end + 1);\n prefix = prefix + pattern.substring(0, start);\n\n arrayLength = tempArr.length;\n while (i < arrayLength) {\n newStart = after.indexOf('{');\n if (newStart < 0) {\n callback((prefix + tempArr[i++] + after).replace(END_WITH_EACH_REGEX, '.[]'));\n } else {\n dive(prefix + tempArr[i++], after, newStart, callback);\n }\n }\n }\n\n // ..........................................................\n // DEPENDENT KEYS\n //\n\n function addDependentKeys(desc, obj, keyName, meta) {\n // the descriptor has a list of dependent keys, so\n // add all of its dependent keys.\n var depKeys = desc._dependentKeys;\n if (depKeys === null || depKeys === undefined) {\n return;\n }\n\n for (var idx = 0; idx < depKeys.length; idx++) {\n var depKey = depKeys[idx];\n // Increment the number of times depKey depends on keyName.\n meta.writeDeps(depKey, keyName, (meta.peekDeps(depKey, keyName) || 0) + 1);\n // Watch the depKey\n watch(obj, depKey, meta);\n }\n }\n\n function removeDependentKeys(desc, obj, keyName, meta) {\n // the descriptor has a list of dependent keys, so\n // remove all of its dependent keys.\n var depKeys = desc._dependentKeys;\n if (depKeys === null || depKeys === undefined) {\n return;\n }\n\n for (var idx = 0; idx < depKeys.length; idx++) {\n var depKey = depKeys[idx];\n // Decrement the number of times depKey depends on keyName.\n meta.writeDeps(depKey, keyName, (meta.peekDeps(depKey, keyName) || 0) - 1);\n // Unwatch the depKey\n unwatch(obj, depKey, meta);\n }\n }\n\n /**\n @module @ember/object\n */\n\n var DEEP_EACH_REGEX = /\\.@each\\.[^.]+\\./;\n\n /**\n A computed property transforms an object literal with object's accessor function(s) into a property.\n \n By default the function backing the computed property will only be called\n once and the result will be cached. You can specify various properties\n that your computed property depends on. This will force the cached\n result to be recomputed if the dependencies are modified.\n \n In the following example we declare a computed property - `fullName` - by calling\n `computed` with property dependencies (`firstName` and `lastName`) as leading arguments and getter accessor function. The `fullName` getter function\n will be called once (regardless of how many times it is accessed) as long\n as its dependencies have not changed. Once `firstName` or `lastName` are updated\n any future calls (or anything bound) to `fullName` will incorporate the new\n values.\n \n ```javascript\n import EmberObject, { computed } from '@ember/object';\n \n let Person = EmberObject.extend({\n // these will be supplied by `create`\n firstName: null,\n lastName: null,\n \n fullName: computed('firstName', 'lastName', function() {\n let firstName = this.get('firstName'),\n lastName = this.get('lastName');\n \n return `${firstName} ${lastName}`;\n })\n });\n \n let tom = Person.create({\n firstName: 'Tom',\n lastName: 'Dale'\n });\n \n tom.get('fullName') // 'Tom Dale'\n ```\n \n You can also define what Ember should do when setting a computed property by providing additional function (`set`) in hash argument.\n If you try to set a computed property, it will try to invoke setter accessor function with the key and\n value you want to set it to as arguments.\n \n ```javascript\n import EmberObject, { computed } from '@ember/object';\n \n let Person = EmberObject.extend({\n // these will be supplied by `create`\n firstName: null,\n lastName: null,\n \n fullName: computed('firstName', 'lastName', {\n get(key) {\n let firstName = this.get('firstName'),\n lastName = this.get('lastName');\n \n return firstName + ' ' + lastName;\n },\n set(key, value) {\n let [firstName, lastName] = value.split(' ');\n \n this.set('firstName', firstName);\n this.set('lastName', lastName);\n \n return value;\n }\n })\n });\n \n let person = Person.create();\n \n person.set('fullName', 'Peter Wagenet');\n person.get('firstName'); // 'Peter'\n person.get('lastName'); // 'Wagenet'\n ```\n \n You can overwrite computed property with normal property (no longer computed), that won't change if dependencies change, if you set computed property and it won't have setter accessor function defined.\n \n You can also mark computed property as `.readOnly()` and block all attempts to set it.\n \n ```javascript\n import EmberObject, { computed } from '@ember/object';\n \n let Person = EmberObject.extend({\n // these will be supplied by `create`\n firstName: null,\n lastName: null,\n \n fullName: computed('firstName', 'lastName', {\n get(key) {\n let firstName = this.get('firstName');\n let lastName = this.get('lastName');\n \n return firstName + ' ' + lastName;\n }\n }).readOnly()\n });\n \n let person = Person.create();\n person.set('fullName', 'Peter Wagenet'); // Uncaught Error: Cannot set read-only property \"fullName\" on object: <(...):emberXXX>\n ```\n \n Additional resources:\n - [New CP syntax RFC](https://github.com/emberjs/rfcs/blob/master/text/0011-improved-cp-syntax.md)\n - [New computed syntax explained in \"Ember 1.12 released\" ](https://emberjs.com/blog/2015/05/13/ember-1-12-released.html#toc_new-computed-syntax)\n \n @class ComputedProperty\n @public\n */\n function ComputedProperty(config, opts) {\n this.isDescriptor = true;\n var hasGetterOnly = typeof config === 'function';\n if (hasGetterOnly) {\n this._getter = config;\n } else {\n true && !(typeof config === 'object' && !Array.isArray(config)) && emberDebug.assert('computed expects a function or an object as last argument.', typeof config === 'object' && !Array.isArray(config));\n true && !Object.keys(config).every(function (key) {\n return key === 'get' || key === 'set';\n }) && emberDebug.assert('Config object passed to computed can only contain `get` or `set` keys.', Object.keys(config).every(function (key) {\n return key === 'get' || key === 'set';\n }));\n\n this._getter = config.get;\n this._setter = config.set;\n }\n true && !(!!this._getter || !!this._setter) && emberDebug.assert('Computed properties must receive a getter or a setter, you passed none.', !!this._getter || !!this._setter);\n\n this._suspended = undefined;\n this._meta = undefined;\n this._volatile = false;\n\n this._dependentKeys = opts && opts.dependentKeys;\n this._readOnly = opts && hasGetterOnly && opts.readOnly === true;\n }\n\n ComputedProperty.prototype = new Descriptor();\n ComputedProperty.prototype.constructor = ComputedProperty;\n\n var ComputedPropertyPrototype = ComputedProperty.prototype;\n\n /**\n Call on a computed property to set it into non-cached mode. When in this\n mode the computed property will not automatically cache the return value.\n \n It also does not automatically fire any change events. You must manually notify\n any changes if you want to observe this property.\n \n Dependency keys have no effect on volatile properties as they are for cache\n invalidation and notification when cached value is invalidated.\n \n ```javascript\n import EmberObject, { computed } from '@ember/object';\n \n let outsideService = EmberObject.extend({\n value: computed(function() {\n return OutsideService.getValue();\n }).volatile()\n }).create();\n ```\n \n @method volatile\n @return {ComputedProperty} this\n @chainable\n @public\n */\n ComputedPropertyPrototype.volatile = function () {\n this._volatile = true;\n return this;\n };\n\n /**\n Call on a computed property to set it into read-only mode. When in this\n mode the computed property will throw an error when set.\n \n ```javascript\n import EmberObject, { computed } from '@ember/object';\n \n let Person = EmberObject.extend({\n guid: computed(function() {\n return 'guid-guid-guid';\n }).readOnly()\n });\n \n let person = Person.create();\n \n person.set('guid', 'new-guid'); // will throw an exception\n ```\n \n @method readOnly\n @return {ComputedProperty} this\n @chainable\n @public\n */\n ComputedPropertyPrototype.readOnly = function () {\n this._readOnly = true;\n true && !!(this._readOnly && this._setter && this._setter !== this._getter) && emberDebug.assert('Computed properties that define a setter using the new syntax cannot be read-only', !(this._readOnly && this._setter && this._setter !== this._getter));\n\n return this;\n };\n\n /**\n Sets the dependent keys on this computed property. Pass any number of\n arguments containing key paths that this computed property depends on.\n \n ```javascript\n import EmberObject, { computed } from '@ember/object';\n \n let President = EmberObject.extend({\n fullName: computed('firstName', 'lastName', function() {\n return this.get('firstName') + ' ' + this.get('lastName');\n \n // Tell Ember that this computed property depends on firstName\n // and lastName\n })\n });\n \n let president = President.create({\n firstName: 'Barack',\n lastName: 'Obama'\n });\n \n president.get('fullName'); // 'Barack Obama'\n ```\n \n @method property\n @param {String} path* zero or more property paths\n @return {ComputedProperty} this\n @chainable\n @public\n */\n ComputedPropertyPrototype.property = function () {\n var args = [];\n\n function addArg(property) {\n true && emberDebug.warn('Dependent keys containing @each only work one level deep. ' + ('You used the key \"' + property + '\" which is invalid. ') + 'Please create an intermediary computed property.', DEEP_EACH_REGEX.test(property) === false, { id: 'ember-metal.computed-deep-each' });\n\n args.push(property);\n }\n\n for (var i = 0; i < arguments.length; i++) {\n expandProperties(arguments[i], addArg);\n }\n\n this._dependentKeys = args;\n return this;\n };\n\n /**\n In some cases, you may want to annotate computed properties with additional\n metadata about how they function or what values they operate on. For example,\n computed property functions may close over variables that are then no longer\n available for introspection.\n \n You can pass a hash of these values to a computed property like this:\n \n ```\n import { computed } from '@ember/object';\n import Person from 'my-app/utils/person';\n \n person: computed(function() {\n let personId = this.get('personId');\n return Person.create({ id: personId });\n }).meta({ type: Person })\n ```\n \n The hash that you pass to the `meta()` function will be saved on the\n computed property descriptor under the `_meta` key. Ember runtime\n exposes a public API for retrieving these values from classes,\n via the `metaForProperty()` function.\n \n @method meta\n @param {Object} meta\n @chainable\n @public\n */\n ComputedPropertyPrototype.meta = function (meta$$1) {\n if (arguments.length === 0) {\n return this._meta || {};\n } else {\n this._meta = meta$$1;\n return this;\n }\n };\n\n // invalidate cache when CP key changes\n ComputedPropertyPrototype.didChange = function (obj, keyName) {\n // _suspended is set via a CP.set to ensure we don't clear\n // the cached value set by the setter\n if (this._volatile || this._suspended === obj) {\n return;\n }\n\n // don't create objects just to invalidate\n var meta$$1 = peekMeta(obj);\n if (meta$$1 === undefined || meta$$1.source !== obj) {\n return;\n }\n\n var cache = meta$$1.readableCache();\n if (cache !== undefined && cache[keyName] !== undefined) {\n cache[keyName] = undefined;\n removeDependentKeys(this, obj, keyName, meta$$1);\n }\n };\n\n ComputedPropertyPrototype.get = function (obj, keyName) {\n if (this._volatile) {\n return this._getter.call(obj, keyName);\n }\n\n var meta$$1 = meta(obj);\n var cache = meta$$1.writableCache();\n\n var result = cache[keyName];\n if (result === UNDEFINED) {\n return undefined;\n } else if (result !== undefined) {\n return result;\n }\n\n var ret = this._getter.call(obj, keyName);\n\n cache[keyName] = ret === undefined ? UNDEFINED : ret;\n\n var chainWatchers = meta$$1.readableChainWatchers();\n if (chainWatchers !== undefined) {\n chainWatchers.revalidate(keyName);\n }\n addDependentKeys(this, obj, keyName, meta$$1);\n\n return ret;\n };\n\n ComputedPropertyPrototype.set = function computedPropertySetEntry(obj, keyName, value) {\n if (this._readOnly) {\n this._throwReadOnlyError(obj, keyName);\n }\n\n if (!this._setter) {\n return this.clobberSet(obj, keyName, value);\n }\n\n if (this._volatile) {\n return this.volatileSet(obj, keyName, value);\n }\n\n return this.setWithSuspend(obj, keyName, value);\n };\n\n ComputedPropertyPrototype._throwReadOnlyError = function computedPropertyThrowReadOnlyError(obj, keyName) {\n throw new emberDebug.Error('Cannot set read-only property \"' + keyName + '\" on object: ' + emberUtils.inspect(obj));\n };\n\n ComputedPropertyPrototype.clobberSet = function computedPropertyClobberSet(obj, keyName, value) {\n var cachedValue = cacheFor(obj, keyName);\n defineProperty(obj, keyName, null, cachedValue);\n set(obj, keyName, value);\n return value;\n };\n\n ComputedPropertyPrototype.volatileSet = function computedPropertyVolatileSet(obj, keyName, value) {\n return this._setter.call(obj, keyName, value);\n };\n\n ComputedPropertyPrototype.setWithSuspend = function computedPropertySetWithSuspend(obj, keyName, value) {\n var oldSuspended = this._suspended;\n this._suspended = obj;\n try {\n return this._set(obj, keyName, value);\n } finally {\n this._suspended = oldSuspended;\n }\n };\n\n ComputedPropertyPrototype._set = function computedPropertySet(obj, keyName, value) {\n var meta$$1 = meta(obj);\n var cache = meta$$1.writableCache();\n\n var val = cache[keyName];\n var hadCachedValue = val !== undefined;\n\n var cachedValue = void 0;\n if (hadCachedValue && val !== UNDEFINED) {\n cachedValue = val;\n }\n\n var ret = this._setter.call(obj, keyName, value, cachedValue);\n\n // allows setter to return the same value that is cached already\n if (hadCachedValue && cachedValue === ret) {\n return ret;\n }\n\n propertyWillChange(obj, keyName, meta$$1);\n\n if (!hadCachedValue) {\n addDependentKeys(this, obj, keyName, meta$$1);\n }\n\n cache[keyName] = ret === undefined ? UNDEFINED : ret;\n\n propertyDidChange(obj, keyName, meta$$1);\n\n return ret;\n };\n\n /* called before property is overridden */\n ComputedPropertyPrototype.teardown = function (obj, keyName, meta$$1) {\n if (this._volatile) {\n return;\n }\n var cache = meta$$1.readableCache();\n if (cache !== undefined && cache[keyName] !== undefined) {\n removeDependentKeys(this, obj, keyName, meta$$1);\n cache[keyName] = undefined;\n }\n };\n\n /**\n This helper returns a new property descriptor that wraps the passed\n computed property function. You can use this helper to define properties\n with mixins or via `defineProperty()`.\n \n If you pass a function as an argument, it will be used as a getter. A computed\n property defined in this way might look like this:\n \n ```js\n import EmberObject, { computed } from '@ember/object';\n \n let Person = EmberObject.extend({\n init() {\n this._super(...arguments);\n \n this.firstName = 'Betty';\n this.lastName = 'Jones';\n },\n \n fullName: computed('firstName', 'lastName', function() {\n return `${this.get('firstName')} ${this.get('lastName')}`;\n })\n });\n \n let client = Person.create();\n \n client.get('fullName'); // 'Betty Jones'\n \n client.set('lastName', 'Fuller');\n client.get('fullName'); // 'Betty Fuller'\n ```\n \n You can pass a hash with two functions, `get` and `set`, as an\n argument to provide both a getter and setter:\n \n ```js\n import EmberObject, { computed } from '@ember/object';\n \n let Person = EmberObject.extend({\n init() {\n this._super(...arguments);\n \n this.firstName = 'Betty';\n this.lastName = 'Jones';\n },\n \n fullName: computed('firstName', 'lastName', {\n get(key) {\n return `${this.get('firstName')} ${this.get('lastName')}`;\n },\n set(key, value) {\n let [firstName, lastName] = value.split(/\\s+/);\n this.setProperties({ firstName, lastName });\n return value;\n }\n })\n });\n \n let client = Person.create();\n client.get('firstName'); // 'Betty'\n \n client.set('fullName', 'Carroll Fuller');\n client.get('firstName'); // 'Carroll'\n ```\n \n The `set` function should accept two parameters, `key` and `value`. The value\n returned from `set` will be the new value of the property.\n \n _Note: This is the preferred way to define computed properties when writing third-party\n libraries that depend on or use Ember, since there is no guarantee that the user\n will have [prototype Extensions](https://emberjs.com/guides/configuring-ember/disabling-prototype-extensions/) enabled._\n \n The alternative syntax, with prototype extensions, might look like:\n \n ```js\n fullName: function() {\n return this.get('firstName') + ' ' + this.get('lastName');\n }.property('firstName', 'lastName')\n ```\n \n @method computed\n @for @ember/object\n @static\n @param {String} [dependentKeys*] Optional dependent keys that trigger this computed property.\n @param {Function} func The computed property function.\n @return {ComputedProperty} property descriptor instance\n @public\n */\n function computed() {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n var func = args.pop();\n\n var cp = new ComputedProperty(func);\n\n if (args.length > 0) {\n cp.property.apply(cp, args);\n }\n\n return cp;\n }\n\n /**\n Returns the cached value for a property, if one exists.\n This can be useful for peeking at the value of a computed\n property that is generated lazily, without accidentally causing\n it to be created.\n \n @method cacheFor\n @static\n @for @ember/object/internals\n @param {Object} obj the object whose property you want to check\n @param {String} key the name of the property whose cached value you want\n to return\n @return {Object} the cached value\n @public\n */\n function cacheFor(obj, key) {\n var meta$$1 = peekMeta(obj);\n var cache = meta$$1 !== undefined ? meta$$1.source === obj && meta$$1.readableCache() : undefined;\n var ret = cache !== undefined ? cache[key] : undefined;\n\n if (ret === UNDEFINED) {\n return undefined;\n }\n return ret;\n }\n\n cacheFor.set = function (cache, key, value) {\n if (value === undefined) {\n cache[key] = UNDEFINED;\n } else {\n cache[key] = value;\n }\n };\n\n cacheFor.get = function (cache, key) {\n var ret = cache[key];\n if (ret === UNDEFINED) {\n return undefined;\n }\n return ret;\n };\n\n cacheFor.remove = function (cache, key) {\n cache[key] = undefined;\n };\n\n var CONSUMED = {};\n\n function alias(altKey) {\n return new AliasedProperty(altKey);\n }\n\n var AliasedProperty = function (_Descriptor) {\n emberBabel.inherits(AliasedProperty, _Descriptor);\n\n function AliasedProperty(altKey) {\n emberBabel.classCallCheck(this, AliasedProperty);\n\n var _this = emberBabel.possibleConstructorReturn(this, _Descriptor.call(this));\n\n _this.isDescriptor = true;\n _this.altKey = altKey;\n _this._dependentKeys = [altKey];\n return _this;\n }\n\n AliasedProperty.prototype.setup = function setup(obj, keyName) {\n true && !(this.altKey !== keyName) && emberDebug.assert('Setting alias \\'' + keyName + '\\' on self', this.altKey !== keyName);\n\n var meta$$1 = meta(obj);\n if (meta$$1.peekWatching(keyName)) {\n addDependentKeys(this, obj, keyName, meta$$1);\n }\n };\n\n AliasedProperty.prototype.teardown = function teardown(obj, keyName, meta$$1) {\n if (meta$$1.peekWatching(keyName)) {\n removeDependentKeys(this, obj, keyName, meta$$1);\n }\n };\n\n AliasedProperty.prototype.willWatch = function willWatch(obj, keyName, meta$$1) {\n addDependentKeys(this, obj, keyName, meta$$1);\n };\n\n AliasedProperty.prototype.didUnwatch = function didUnwatch(obj, keyName, meta$$1) {\n removeDependentKeys(this, obj, keyName, meta$$1);\n };\n\n AliasedProperty.prototype.get = function get$$1(obj, keyName) {\n var ret = get(obj, this.altKey);\n var meta$$1 = meta(obj);\n var cache = meta$$1.writableCache();\n if (cache[keyName] !== CONSUMED) {\n cache[keyName] = CONSUMED;\n addDependentKeys(this, obj, keyName, meta$$1);\n }\n return ret;\n };\n\n AliasedProperty.prototype.set = function set$$1(obj, keyName, value) {\n return set(obj, this.altKey, value);\n };\n\n AliasedProperty.prototype.readOnly = function readOnly() {\n this.set = AliasedProperty_readOnlySet;\n return this;\n };\n\n AliasedProperty.prototype.oneWay = function oneWay() {\n this.set = AliasedProperty_oneWaySet;\n return this;\n };\n\n return AliasedProperty;\n }(Descriptor);\n\n function AliasedProperty_readOnlySet(obj, keyName, value) {\n // eslint-disable-line no-unused-vars\n throw new emberDebug.Error('Cannot set read-only property \\'' + keyName + '\\' on object: ' + emberUtils.inspect(obj));\n }\n\n function AliasedProperty_oneWaySet(obj, keyName, value) {\n defineProperty(obj, keyName, null);\n return set(obj, keyName, value);\n }\n\n // Backwards compatibility with Ember Data.\n AliasedProperty.prototype._meta = undefined;\n AliasedProperty.prototype.meta = ComputedProperty.prototype.meta;\n\n /**\n @module @ember/polyfills\n */\n /**\n Merge the contents of two objects together into the first object.\n \n ```javascript\n import { merge } from '@ember/polyfills';\n \n merge({ first: 'Tom' }, { last: 'Dale' }); // { first: 'Tom', last: 'Dale' }\n var a = { first: 'Yehuda' };\n var b = { last: 'Katz' };\n merge(a, b); // a == { first: 'Yehuda', last: 'Katz' }, b == { last: 'Katz' }\n ```\n \n @method merge\n @static\n @for @ember/polyfills\n @param {Object} original The object to merge into\n @param {Object} updates The object to copy properties from\n @return {Object}\n @public\n */\n function merge(original, updates) {\n if (updates === null || typeof updates !== 'object') {\n return original;\n }\n\n var props = Object.keys(updates);\n var prop = void 0;\n\n for (var i = 0; i < props.length; i++) {\n prop = props[i];\n original[prop] = updates[prop];\n }\n\n return original;\n }\n\n /**\n @module ember\n */\n\n /**\n Used internally to allow changing properties in a backwards compatible way, and print a helpful\n deprecation warning.\n \n @method deprecateProperty\n @param {Object} object The object to add the deprecated property to.\n @param {String} deprecatedKey The property to add (and print deprecation warnings upon accessing).\n @param {String} newKey The property that will be aliased.\n @private\n @since 1.7.0\n */\n\n function deprecateProperty(object, deprecatedKey, newKey, options) {\n function _deprecate() {\n true && !false && emberDebug.deprecate('Usage of `' + deprecatedKey + '` is deprecated, use `' + newKey + '` instead.', false, options);\n }\n\n Object.defineProperty(object, deprecatedKey, {\n configurable: true,\n enumerable: false,\n set: function (value) {\n _deprecate();\n set(this, newKey, value);\n },\n get: function () {\n _deprecate();\n return get(this, newKey);\n }\n });\n }\n\n /* eslint no-console:off */\n /* global console */\n\n /**\n @module @ember/instrumentation\n @private\n */\n\n /**\n The purpose of the Ember Instrumentation module is\n to provide efficient, general-purpose instrumentation\n for Ember.\n \n Subscribe to a listener by using `subscribe`:\n \n ```javascript\n import { subscribe } from '@ember/instrumentation';\n \n subscribe(\"render\", {\n before(name, timestamp, payload) {\n \n },\n \n after(name, timestamp, payload) {\n \n }\n });\n ```\n \n If you return a value from the `before` callback, that same\n value will be passed as a fourth parameter to the `after`\n callback.\n \n Instrument a block of code by using `instrument`:\n \n ```javascript\n import { instrument } from '@ember/instrumentation';\n \n instrument(\"render.handlebars\", payload, function() {\n // rendering logic\n }, binding);\n ```\n \n Event names passed to `instrument` are namespaced\n by periods, from more general to more specific. Subscribers\n can listen for events by whatever level of granularity they\n are interested in.\n \n In the above example, the event is `render.handlebars`,\n and the subscriber listened for all events beginning with\n `render`. It would receive callbacks for events named\n `render`, `render.handlebars`, `render.container`, or\n even `render.handlebars.layout`.\n \n @class Instrumentation\n @static\n @private\n */\n var subscribers = [];\n var cache = {};\n\n function populateListeners(name) {\n var listeners = [];\n var subscriber = void 0;\n\n for (var i = 0; i < subscribers.length; i++) {\n subscriber = subscribers[i];\n if (subscriber.regex.test(name)) {\n listeners.push(subscriber.object);\n }\n }\n\n cache[name] = listeners;\n return listeners;\n }\n\n var time = function () {\n var perf = 'undefined' !== typeof window ? window.performance || {} : {};\n var fn = perf.now || perf.mozNow || perf.webkitNow || perf.msNow || perf.oNow;\n // fn.bind will be available in all the browsers that support the advanced window.performance... ;-)\n return fn ? fn.bind(perf) : function () {\n return +new Date();\n };\n }();\n\n /**\n Notifies event's subscribers, calls `before` and `after` hooks.\n \n @method instrument\n @for @ember/instrumentation\n @static\n @param {String} [name] Namespaced event name.\n @param {Object} _payload\n @param {Function} callback Function that you're instrumenting.\n @param {Object} binding Context that instrument function is called with.\n @private\n */\n function instrument(name, _payload, callback, binding) {\n if (arguments.length <= 3 && typeof _payload === 'function') {\n binding = callback;\n callback = _payload;\n _payload = undefined;\n }\n if (subscribers.length === 0) {\n return callback.call(binding);\n }\n var payload = _payload || {};\n var finalizer = _instrumentStart(name, function () {\n return payload;\n });\n\n if (finalizer) {\n return withFinalizer(callback, finalizer, payload, binding);\n } else {\n return callback.call(binding);\n }\n }\n\n exports.flaggedInstrument = void 0;\n if (features.EMBER_IMPROVED_INSTRUMENTATION) {\n exports.flaggedInstrument = instrument;\n } else {\n exports.flaggedInstrument = function (name, payload, callback) {\n return callback();\n };\n }\n function withFinalizer(callback, finalizer, payload, binding) {\n var result = void 0;\n try {\n result = callback.call(binding);\n } catch (e) {\n payload.exception = e;\n result = payload;\n } finally {\n finalizer();\n }\n return result;\n }\n\n function NOOP() {}\n\n // private for now\n function _instrumentStart(name, _payload, _payloadParam) {\n if (subscribers.length === 0) {\n return NOOP;\n }\n\n var listeners = cache[name];\n\n if (!listeners) {\n listeners = populateListeners(name);\n }\n\n if (listeners.length === 0) {\n return NOOP;\n }\n\n var payload = _payload(_payloadParam);\n\n var STRUCTURED_PROFILE = emberEnvironment.ENV.STRUCTURED_PROFILE;\n var timeName = void 0;\n if (STRUCTURED_PROFILE) {\n timeName = name + ': ' + payload.object;\n console.time(timeName);\n }\n\n var beforeValues = new Array(listeners.length);\n var i = void 0,\n listener = void 0;\n var timestamp = time();\n for (i = 0; i < listeners.length; i++) {\n listener = listeners[i];\n beforeValues[i] = listener.before(name, timestamp, payload);\n }\n\n return function _instrumentEnd() {\n var i = void 0,\n listener = void 0;\n var timestamp = time();\n for (i = 0; i < listeners.length; i++) {\n listener = listeners[i];\n if (typeof listener.after === 'function') {\n listener.after(name, timestamp, payload, beforeValues[i]);\n }\n }\n\n if (STRUCTURED_PROFILE) {\n console.timeEnd(timeName);\n }\n };\n }\n\n /**\n Subscribes to a particular event or instrumented block of code.\n \n @method subscribe\n @for @ember/instrumentation\n @static\n \n @param {String} [pattern] Namespaced event name.\n @param {Object} [object] Before and After hooks.\n \n @return {Subscriber}\n @private\n */\n function subscribe(pattern, object) {\n var paths = pattern.split('.');\n var path = void 0;\n var regex = [];\n\n for (var i = 0; i < paths.length; i++) {\n path = paths[i];\n if (path === '*') {\n regex.push('[^\\\\.]*');\n } else {\n regex.push(path);\n }\n }\n\n regex = regex.join('\\\\.');\n regex = regex + '(\\\\..*)?';\n\n var subscriber = {\n pattern: pattern,\n regex: new RegExp('^' + regex + '$'),\n object: object\n };\n\n subscribers.push(subscriber);\n cache = {};\n\n return subscriber;\n }\n\n /**\n Unsubscribes from a particular event or instrumented block of code.\n \n @method unsubscribe\n @for @ember/instrumentation\n @static\n \n @param {Object} [subscriber]\n @private\n */\n function unsubscribe(subscriber) {\n var index = void 0;\n\n for (var i = 0; i < subscribers.length; i++) {\n if (subscribers[i] === subscriber) {\n index = i;\n }\n }\n\n subscribers.splice(index, 1);\n cache = {};\n }\n\n /**\n Resets `Instrumentation` by flushing list of subscribers.\n \n @method reset\n @for @ember/instrumentation\n @static\n @private\n */\n function reset() {\n subscribers.length = 0;\n cache = {};\n }\n\n var onerror = void 0;\n var onErrorTarget = {\n get onerror() {\n return onerror;\n }\n };\n\n // Ember.onerror getter\n function getOnerror() {\n return onerror;\n }\n // Ember.onerror setter\n function setOnerror(handler) {\n onerror = handler;\n }\n\n var dispatchOverride = void 0;\n\n // allows testing adapter to override dispatch\n function getDispatchOverride() {\n return dispatchOverride;\n }\n function setDispatchOverride(handler) {\n dispatchOverride = handler;\n }\n\n /**\n @module @ember/utils\n */\n /**\n Returns true if the passed value is null or undefined. This avoids errors\n from JSLint complaining about use of ==, which can be technically\n confusing.\n \n ```javascript\n isNone(); // true\n isNone(null); // true\n isNone(undefined); // true\n isNone(''); // false\n isNone([]); // false\n isNone(function() {}); // false\n ```\n \n @method isNone\n @static\n @for @ember/utils\n @param {Object} obj Value to test\n @return {Boolean}\n @public\n */\n function isNone(obj) {\n return obj === null || obj === undefined;\n }\n\n /**\n @module @ember/utils\n */\n /**\n Verifies that a value is `null` or `undefined`, an empty string, or an empty\n array.\n \n Constrains the rules on `isNone` by returning true for empty strings and\n empty arrays.\n \n If the value is an object with a `size` property of type number, it is used\n to check emptiness.\n \n ```javascript\n isEmpty(); // true\n isEmpty(null); // true\n isEmpty(undefined); // true\n isEmpty(''); // true\n isEmpty([]); // true\n isEmpty({ size: 0}); // true\n isEmpty({}); // false\n isEmpty('Adam Hawkins'); // false\n isEmpty([0,1,2]); // false\n isEmpty('\\n\\t'); // false\n isEmpty(' '); // false\n isEmpty({ size: 1 }) // false\n isEmpty({ size: () => 0 }) // false\n ```\n \n @method isEmpty\n @static\n @for @ember/utils\n @param {Object} obj Value to test\n @return {Boolean}\n @public\n */\n function isEmpty(obj) {\n var none = isNone(obj);\n if (none) {\n return none;\n }\n\n if (typeof obj.size === 'number') {\n return !obj.size;\n }\n\n var objectType = typeof obj;\n\n if (objectType === 'object') {\n var size = get(obj, 'size');\n if (typeof size === 'number') {\n return !size;\n }\n }\n\n if (typeof obj.length === 'number' && objectType !== 'function') {\n return !obj.length;\n }\n\n if (objectType === 'object') {\n var length = get(obj, 'length');\n if (typeof length === 'number') {\n return !length;\n }\n }\n\n return false;\n }\n\n /**\n @module @ember/utils\n */\n /**\n A value is blank if it is empty or a whitespace string.\n \n ```javascript\n import { isBlank } from '@ember/utils';\n \n isBlank(); // true\n isBlank(null); // true\n isBlank(undefined); // true\n isBlank(''); // true\n isBlank([]); // true\n isBlank('\\n\\t'); // true\n isBlank(' '); // true\n isBlank({}); // false\n isBlank('\\n\\t Hello'); // false\n isBlank('Hello world'); // false\n isBlank([1,2,3]); // false\n ```\n \n @method isBlank\n @static\n @for @ember/utils\n @param {Object} obj Value to test\n @return {Boolean}\n @since 1.5.0\n @public\n */\n function isBlank(obj) {\n return isEmpty(obj) || typeof obj === 'string' && /\\S/.test(obj) === false;\n }\n\n /**\n @module @ember/utils\n */\n /**\n A value is present if it not `isBlank`.\n \n ```javascript\n isPresent(); // false\n isPresent(null); // false\n isPresent(undefined); // false\n isPresent(''); // false\n isPresent(' '); // false\n isPresent('\\n\\t'); // false\n isPresent([]); // false\n isPresent({ length: 0 }) // false\n isPresent(false); // true\n isPresent(true); // true\n isPresent('string'); // true\n isPresent(0); // true\n isPresent(function() {}) // true\n isPresent({}); // true\n isPresent(false); // true\n isPresent('\\n\\t Hello'); // true\n isPresent([1,2,3]); // true\n ```\n \n @method isPresent\n @static\n @for @ember/utils\n @param {Object} obj Value to test\n @return {Boolean}\n @since 1.8.0\n @public\n */\n function isPresent(obj) {\n return !isBlank(obj);\n }\n\n function onBegin(current) {\n run.currentRunLoop = current;\n }\n\n function onEnd(current, next) {\n run.currentRunLoop = next;\n }\n\n var backburner$1 = new Backburner(['sync', 'actions', 'destroy'], {\n sync: {\n before: beginPropertyChanges,\n after: endPropertyChanges\n },\n defaultQueue: 'actions',\n onBegin: onBegin,\n onEnd: onEnd,\n onErrorTarget: onErrorTarget,\n onErrorMethod: 'onerror'\n });\n\n /**\n @module @ember/runloop\n */\n // ..........................................................\n // run - this is ideally the only public API the dev sees\n //\n\n /**\n Runs the passed target and method inside of a RunLoop, ensuring any\n deferred actions including bindings and views updates are flushed at the\n end.\n \n Normally you should not need to invoke this method yourself. However if\n you are implementing raw event handlers when interfacing with other\n libraries or plugins, you should probably wrap all of your code inside this\n call.\n \n ```javascript\n import { run } from '@ember/runloop';\n \n run(function() {\n // code to be executed within a RunLoop\n });\n ```\n @method run\n @for @ember/runloop\n @static\n @param {Object} [target] target of method to call\n @param {Function|String} method Method to invoke.\n May be a function or a string. If you pass a string\n then it will be looked up on the passed target.\n @param {Object} [args*] Any additional arguments you wish to pass to the method.\n @return {Object} return value from invoking the passed function.\n @public\n */\n function run() {\n return backburner$1.run.apply(backburner$1, arguments);\n }\n\n /**\n If no run-loop is present, it creates a new one. If a run loop is\n present it will queue itself to run on the existing run-loops action\n queue.\n \n Please note: This is not for normal usage, and should be used sparingly.\n \n If invoked when not within a run loop:\n \n ```javascript\n import { join } from '@ember/runloop';\n \n join(function() {\n // creates a new run-loop\n });\n ```\n \n Alternatively, if called within an existing run loop:\n \n ```javascript\n import { run, join } from '@ember/runloop';\n \n run(function() {\n // creates a new run-loop\n \n join(function() {\n // joins with the existing run-loop, and queues for invocation on\n // the existing run-loops action queue.\n });\n });\n ```\n \n @method join\n @static\n @for @ember/runloop\n @param {Object} [target] target of method to call\n @param {Function|String} method Method to invoke.\n May be a function or a string. If you pass a string\n then it will be looked up on the passed target.\n @param {Object} [args*] Any additional arguments you wish to pass to the method.\n @return {Object} Return value from invoking the passed function. Please note,\n when called within an existing loop, no return value is possible.\n @public\n */\n run.join = function () {\n return backburner$1.join.apply(backburner$1, arguments);\n };\n\n /**\n Allows you to specify which context to call the specified function in while\n adding the execution of that function to the Ember run loop. This ability\n makes this method a great way to asynchronously integrate third-party libraries\n into your Ember application.\n \n `bind` takes two main arguments, the desired context and the function to\n invoke in that context. Any additional arguments will be supplied as arguments\n to the function that is passed in.\n \n Let's use the creation of a TinyMCE component as an example. Currently,\n TinyMCE provides a setup configuration option we can use to do some processing\n after the TinyMCE instance is initialized but before it is actually rendered.\n We can use that setup option to do some additional setup for our component.\n The component itself could look something like the following:\n \n ```app/components/rich-text-editor.js\n import Component from '@ember/component';\n import { on } from '@ember/object/evented';\n import { bind } from '@ember/runloop';\n \n export default Component.extend({\n initializeTinyMCE: on('didInsertElement', function() {\n tinymce.init({\n selector: '#' + this.$().prop('id'),\n setup: bind(this, this.setupEditor)\n });\n }),\n \n didInsertElement() {\n tinymce.init({\n selector: '#' + this.$().prop('id'),\n setup: bind(this, this.setupEditor)\n });\n }\n \n setupEditor(editor) {\n this.set('editor', editor);\n \n editor.on('change', function() {\n console.log('content changed!');\n });\n }\n });\n ```\n \n In this example, we use `bind` to bind the setupEditor method to the\n context of the RichTextEditor component and to have the invocation of that\n method be safely handled and executed by the Ember run loop.\n \n @method bind\n @static\n @for @ember/runloop\n @param {Object} [target] target of method to call\n @param {Function|String} method Method to invoke.\n May be a function or a string. If you pass a string\n then it will be looked up on the passed target.\n @param {Object} [args*] Any additional arguments you wish to pass to the method.\n @return {Function} returns a new function that will always have a particular context\n @since 1.4.0\n @public\n */\n run.bind = function () {\n for (var _len = arguments.length, curried = Array(_len), _key = 0; _key < _len; _key++) {\n curried[_key] = arguments[_key];\n }\n\n return function () {\n for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n return run.join.apply(run, curried.concat(args));\n };\n };\n\n run.backburner = backburner$1;\n run.currentRunLoop = null;\n run.queues = backburner$1.queueNames;\n\n /**\n Begins a new RunLoop. Any deferred actions invoked after the begin will\n be buffered until you invoke a matching call to `run.end()`. This is\n a lower-level way to use a RunLoop instead of using `run()`.\n \n ```javascript\n import { begin, end } from '@ember/runloop';\n \n begin();\n // code to be executed within a RunLoop\n end();\n ```\n \n @method begin\n @static\n @for @ember/runloop\n @return {void}\n @public\n */\n run.begin = function () {\n backburner$1.begin();\n };\n\n /**\n Ends a RunLoop. This must be called sometime after you call\n `run.begin()` to flush any deferred actions. This is a lower-level way\n to use a RunLoop instead of using `run()`.\n \n ```javascript\n import { begin, end } from '@ember/runloop';\n \n begin();\n // code to be executed within a RunLoop\n end();\n ```\n \n @method end\n @static\n @for @ember/runloop\n @return {void}\n @public\n */\n run.end = function () {\n backburner$1.end();\n };\n\n /**\n Array of named queues. This array determines the order in which queues\n are flushed at the end of the RunLoop. You can define your own queues by\n simply adding the queue name to this array. Normally you should not need\n to inspect or modify this property.\n \n @property queues\n @type Array\n @default ['actions', 'destroy']\n @private\n */\n\n /**\n Adds the passed target/method and any optional arguments to the named\n queue to be executed at the end of the RunLoop. If you have not already\n started a RunLoop when calling this method one will be started for you\n automatically.\n \n At the end of a RunLoop, any methods scheduled in this way will be invoked.\n Methods will be invoked in an order matching the named queues defined in\n the `run.queues` property.\n \n ```javascript\n import { schedule } from '@ember/runloop';\n \n schedule('actions', this, function() {\n // this will be executed in the 'actions' queue, after bindings have synced.\n console.log('scheduled on actions queue');\n });\n \n // Note the functions will be run in order based on the run queues order.\n // Output would be:\n // scheduled on sync queue\n // scheduled on actions queue\n ```\n \n @method schedule\n @static\n @for @ember/runloop\n @param {String} queue The name of the queue to schedule against. Default queues is 'actions'\n @param {Object} [target] target object to use as the context when invoking a method.\n @param {String|Function} method The method to invoke. If you pass a string it\n will be resolved on the target object at the time the scheduled item is\n invoked allowing you to change the target function.\n @param {Object} [arguments*] Optional arguments to be passed to the queued method.\n @return {*} Timer information for use in canceling, see `run.cancel`.\n @public\n */\n run.schedule = function (queue /*, target, method */) {\n true && !(run.currentRunLoop || !emberDebug.isTesting()) && emberDebug.assert('You have turned on testing mode, which disabled the run-loop\\'s autorun. ' + 'You will need to wrap any code with asynchronous side-effects in a run', run.currentRunLoop || !emberDebug.isTesting());\n true && !(queue !== 'sync') && emberDebug.deprecate('Scheduling into the \\'' + queue + '\\' run loop queue is deprecated.', queue !== 'sync', { id: 'ember-metal.run.sync', until: '3.5.0' });\n\n return backburner$1.schedule.apply(backburner$1, arguments);\n };\n\n // Used by global test teardown\n run.hasScheduledTimers = function () {\n return backburner$1.hasTimers();\n };\n\n // Used by global test teardown\n run.cancelTimers = function () {\n backburner$1.cancelTimers();\n };\n\n /**\n Invokes the passed target/method and optional arguments after a specified\n period of time. The last parameter of this method must always be a number\n of milliseconds.\n \n You should use this method whenever you need to run some action after a\n period of time instead of using `setTimeout()`. This method will ensure that\n items that expire during the same script execution cycle all execute\n together, which is often more efficient than using a real setTimeout.\n \n ```javascript\n import { later } from '@ember/runloop';\n \n later(myContext, function() {\n // code here will execute within a RunLoop in about 500ms with this == myContext\n }, 500);\n ```\n \n @method later\n @static\n @for @ember/runloop\n @param {Object} [target] target of method to invoke\n @param {Function|String} method The method to invoke.\n If you pass a string it will be resolved on the\n target at the time the method is invoked.\n @param {Object} [args*] Optional arguments to pass to the timeout.\n @param {Number} wait Number of milliseconds to wait.\n @return {*} Timer information for use in canceling, see `run.cancel`.\n @public\n */\n run.later = function () /*target, method*/{\n return backburner$1.later.apply(backburner$1, arguments);\n };\n\n /**\n Schedule a function to run one time during the current RunLoop. This is equivalent\n to calling `scheduleOnce` with the \"actions\" queue.\n \n @method once\n @static\n @for @ember/runloop\n @param {Object} [target] The target of the method to invoke.\n @param {Function|String} method The method to invoke.\n If you pass a string it will be resolved on the\n target at the time the method is invoked.\n @param {Object} [args*] Optional arguments to pass to the timeout.\n @return {Object} Timer information for use in canceling, see `run.cancel`.\n @public\n */\n run.once = function () {\n true && !(run.currentRunLoop || !emberDebug.isTesting()) && emberDebug.assert('You have turned on testing mode, which disabled the run-loop\\'s autorun. ' + 'You will need to wrap any code with asynchronous side-effects in a run', run.currentRunLoop || !emberDebug.isTesting());\n\n for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n args[_key3] = arguments[_key3];\n }\n\n args.unshift('actions');\n return backburner$1.scheduleOnce.apply(backburner$1, args);\n };\n\n /**\n Schedules a function to run one time in a given queue of the current RunLoop.\n Calling this method with the same queue/target/method combination will have\n no effect (past the initial call).\n \n Note that although you can pass optional arguments these will not be\n considered when looking for duplicates. New arguments will replace previous\n calls.\n \n ```javascript\n import { run, scheduleOnce } from '@ember/runloop';\n \n function sayHi() {\n console.log('hi');\n }\n \n run(function() {\n scheduleOnce('afterRender', myContext, sayHi);\n scheduleOnce('afterRender', myContext, sayHi);\n // sayHi will only be executed once, in the afterRender queue of the RunLoop\n });\n ```\n \n Also note that for `run.scheduleOnce` to prevent additional calls, you need to\n pass the same function instance. The following case works as expected:\n \n ```javascript\n function log() {\n console.log('Logging only once');\n }\n \n function scheduleIt() {\n scheduleOnce('actions', myContext, log);\n }\n \n scheduleIt();\n scheduleIt();\n ```\n \n But this other case will schedule the function multiple times:\n \n ```javascript\n import { scheduleOnce } from '@ember/runloop';\n \n function scheduleIt() {\n scheduleOnce('actions', myContext, function() {\n console.log('Closure');\n });\n }\n \n scheduleIt();\n scheduleIt();\n \n // \"Closure\" will print twice, even though we're using `run.scheduleOnce`,\n // because the function we pass to it won't match the\n // previously scheduled operation.\n ```\n \n Available queues, and their order, can be found at `run.queues`\n \n @method scheduleOnce\n @static\n @for @ember/runloop\n @param {String} [queue] The name of the queue to schedule against. Default queues is 'actions'.\n @param {Object} [target] The target of the method to invoke.\n @param {Function|String} method The method to invoke.\n If you pass a string it will be resolved on the\n target at the time the method is invoked.\n @param {Object} [args*] Optional arguments to pass to the timeout.\n @return {Object} Timer information for use in canceling, see `run.cancel`.\n @public\n */\n run.scheduleOnce = function (queue /*, target, method*/) {\n true && !(run.currentRunLoop || !emberDebug.isTesting()) && emberDebug.assert('You have turned on testing mode, which disabled the run-loop\\'s autorun. ' + 'You will need to wrap any code with asynchronous side-effects in a run', run.currentRunLoop || !emberDebug.isTesting());\n true && !(queue !== 'sync') && emberDebug.deprecate('Scheduling into the \\'' + queue + '\\' run loop queue is deprecated.', queue !== 'sync', { id: 'ember-metal.run.sync', until: '3.5.0' });\n\n return backburner$1.scheduleOnce.apply(backburner$1, arguments);\n };\n\n /**\n Schedules an item to run from within a separate run loop, after\n control has been returned to the system. This is equivalent to calling\n `run.later` with a wait time of 1ms.\n \n ```javascript\n import { next } from '@ember/runloop';\n \n next(myContext, function() {\n // code to be executed in the next run loop,\n // which will be scheduled after the current one\n });\n ```\n \n Multiple operations scheduled with `run.next` will coalesce\n into the same later run loop, along with any other operations\n scheduled by `run.later` that expire right around the same\n time that `run.next` operations will fire.\n \n Note that there are often alternatives to using `run.next`.\n For instance, if you'd like to schedule an operation to happen\n after all DOM element operations have completed within the current\n run loop, you can make use of the `afterRender` run loop queue (added\n by the `ember-views` package, along with the preceding `render` queue\n where all the DOM element operations happen).\n \n Example:\n \n ```app/components/my-component.js\n import Component from '@ember/component';\n import { scheduleOnce } from '@ember/runloop';\n \n export Component.extend({\n didInsertElement() {\n this._super(...arguments);\n scheduleOnce('afterRender', this, 'processChildElements');\n },\n \n processChildElements() {\n // ... do something with component's child component\n // elements after they've finished rendering, which\n // can't be done within this component's\n // `didInsertElement` hook because that gets run\n // before the child elements have been added to the DOM.\n }\n });\n ```\n \n One benefit of the above approach compared to using `run.next` is\n that you will be able to perform DOM/CSS operations before unprocessed\n elements are rendered to the screen, which may prevent flickering or\n other artifacts caused by delaying processing until after rendering.\n \n The other major benefit to the above approach is that `run.next`\n introduces an element of non-determinism, which can make things much\n harder to test, due to its reliance on `setTimeout`; it's much harder\n to guarantee the order of scheduled operations when they are scheduled\n outside of the current run loop, i.e. with `run.next`.\n \n @method next\n @static\n @for @ember/runloop\n @param {Object} [target] target of method to invoke\n @param {Function|String} method The method to invoke.\n If you pass a string it will be resolved on the\n target at the time the method is invoked.\n @param {Object} [args*] Optional arguments to pass to the timeout.\n @return {Object} Timer information for use in canceling, see `run.cancel`.\n @public\n */\n run.next = function () {\n for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n args[_key4] = arguments[_key4];\n }\n\n args.push(1);\n return backburner$1.later.apply(backburner$1, args);\n };\n\n /**\n Cancels a scheduled item. Must be a value returned by `later()`,\n `once()`, `scheduleOnce()`, `next()`, `debounce()`, or\n `throttle()`.\n \n ```javascript\n import {\n next,\n cancel,\n later,\n scheduleOnce,\n once,\n throttle,\n debounce\n } from '@ember/runloop';\n \n let runNext = next(myContext, function() {\n // will not be executed\n });\n \n cancel(runNext);\n \n let runLater = later(myContext, function() {\n // will not be executed\n }, 500);\n \n cancel(runLater);\n \n let runScheduleOnce = scheduleOnce('afterRender', myContext, function() {\n // will not be executed\n });\n \n cancel(runScheduleOnce);\n \n let runOnce = once(myContext, function() {\n // will not be executed\n });\n \n cancel(runOnce);\n \n let throttle = throttle(myContext, function() {\n // will not be executed\n }, 1, false);\n \n cancel(throttle);\n \n let debounce = debounce(myContext, function() {\n // will not be executed\n }, 1);\n \n cancel(debounce);\n \n let debounceImmediate = debounce(myContext, function() {\n // will be executed since we passed in true (immediate)\n }, 100, true);\n \n // the 100ms delay until this method can be called again will be canceled\n cancel(debounceImmediate);\n ```\n \n @method cancel\n @static\n @for @ember/runloop\n @param {Object} timer Timer object to cancel\n @return {Boolean} true if canceled or false/undefined if it wasn't found\n @public\n */\n run.cancel = function (timer) {\n return backburner$1.cancel(timer);\n };\n\n /**\n Delay calling the target method until the debounce period has elapsed\n with no additional debounce calls. If `debounce` is called again before\n the specified time has elapsed, the timer is reset and the entire period\n must pass again before the target method is called.\n \n This method should be used when an event may be called multiple times\n but the action should only be called once when the event is done firing.\n A common example is for scroll events where you only want updates to\n happen once scrolling has ceased.\n \n ```javascript\n import { debounce } from '@ember/runloop';\n \n function whoRan() {\n console.log(this.name + ' ran.');\n }\n \n let myContext = { name: 'debounce' };\n \n debounce(myContext, whoRan, 150);\n \n // less than 150ms passes\n debounce(myContext, whoRan, 150);\n \n // 150ms passes\n // whoRan is invoked with context myContext\n // console logs 'debounce ran.' one time.\n ```\n \n Immediate allows you to run the function immediately, but debounce\n other calls for this function until the wait time has elapsed. If\n `debounce` is called again before the specified time has elapsed,\n the timer is reset and the entire period must pass again before\n the method can be called again.\n \n ```javascript\n import { debounce } from '@ember/runloop';\n \n function whoRan() {\n console.log(this.name + ' ran.');\n }\n \n let myContext = { name: 'debounce' };\n \n debounce(myContext, whoRan, 150, true);\n \n // console logs 'debounce ran.' one time immediately.\n // 100ms passes\n debounce(myContext, whoRan, 150, true);\n \n // 150ms passes and nothing else is logged to the console and\n // the debouncee is no longer being watched\n debounce(myContext, whoRan, 150, true);\n \n // console logs 'debounce ran.' one time immediately.\n // 150ms passes and nothing else is logged to the console and\n // the debouncee is no longer being watched\n ```\n \n @method debounce\n @static\n @for @ember/runloop\n @param {Object} [target] target of method to invoke\n @param {Function|String} method The method to invoke.\n May be a function or a string. If you pass a string\n then it will be looked up on the passed target.\n @param {Object} [args*] Optional arguments to pass to the timeout.\n @param {Number} wait Number of milliseconds to wait.\n @param {Boolean} immediate Trigger the function on the leading instead\n of the trailing edge of the wait interval. Defaults to false.\n @return {Array} Timer information for use in canceling, see `run.cancel`.\n @public\n */\n run.debounce = function () {\n return backburner$1.debounce.apply(backburner$1, arguments);\n };\n\n /**\n Ensure that the target method is never called more frequently than\n the specified spacing period. The target method is called immediately.\n \n ```javascript\n import { throttle } from '@ember/runloop';\n \n function whoRan() {\n console.log(this.name + ' ran.');\n }\n \n let myContext = { name: 'throttle' };\n \n throttle(myContext, whoRan, 150);\n // whoRan is invoked with context myContext\n // console logs 'throttle ran.'\n \n // 50ms passes\n throttle(myContext, whoRan, 150);\n \n // 50ms passes\n throttle(myContext, whoRan, 150);\n \n // 150ms passes\n throttle(myContext, whoRan, 150);\n // whoRan is invoked with context myContext\n // console logs 'throttle ran.'\n ```\n \n @method throttle\n @static\n @for @ember/runloop\n @param {Object} [target] target of method to invoke\n @param {Function|String} method The method to invoke.\n May be a function or a string. If you pass a string\n then it will be looked up on the passed target.\n @param {Object} [args*] Optional arguments to pass to the timeout.\n @param {Number} spacing Number of milliseconds to space out requests.\n @param {Boolean} immediate Trigger the function on the leading instead\n of the trailing edge of the wait interval. Defaults to true.\n @return {Array} Timer information for use in canceling, see `run.cancel`.\n @public\n */\n run.throttle = function () {\n return backburner$1.throttle.apply(backburner$1, arguments);\n };\n\n /**\n Add a new named queue after the specified queue.\n \n The queue to add will only be added once.\n \n @method _addQueue\n @param {String} name the name of the queue to add.\n @param {String} after the name of the queue to add after.\n @private\n */\n run._addQueue = function (name, after) {\n if (run.queues.indexOf(name) === -1) {\n run.queues.splice(run.queues.indexOf(after) + 1, 0, name);\n }\n };\n\n /**\n @module ember\n */\n /**\n Helper class that allows you to register your library with Ember.\n \n Singleton created at `Ember.libraries`.\n \n @class Libraries\n @constructor\n @private\n */\n var Libraries = function () {\n function Libraries() {\n emberBabel.classCallCheck(this, Libraries);\n\n this._registry = [];\n this._coreLibIndex = 0;\n }\n\n Libraries.prototype._getLibraryByName = function _getLibraryByName(name) {\n var libs = this._registry;\n var count = libs.length;\n\n for (var i = 0; i < count; i++) {\n if (libs[i].name === name) {\n return libs[i];\n }\n }\n };\n\n Libraries.prototype.register = function register(name, version, isCoreLibrary) {\n var index = this._registry.length;\n\n if (!this._getLibraryByName(name)) {\n if (isCoreLibrary) {\n index = this._coreLibIndex++;\n }\n this._registry.splice(index, 0, { name: name, version: version });\n } else {\n true && emberDebug.warn('Library \"' + name + '\" is already registered with Ember.', false, { id: 'ember-metal.libraries-register' });\n }\n };\n\n Libraries.prototype.registerCoreLibrary = function registerCoreLibrary(name, version) {\n this.register(name, version, true);\n };\n\n Libraries.prototype.deRegister = function deRegister(name) {\n var lib = this._getLibraryByName(name);\n var index = void 0;\n\n if (lib) {\n index = this._registry.indexOf(lib);\n this._registry.splice(index, 1);\n }\n };\n\n return Libraries;\n }();\n\n if (features.EMBER_LIBRARIES_ISREGISTERED) {\n Libraries.prototype.isRegistered = function (name) {\n return !!this._getLibraryByName(name);\n };\n }\n\n var libraries = new Libraries();\n\n /**\n @module @ember/map\n @private\n */\n\n /*\n JavaScript (before ES6) does not have a Map implementation. Objects,\n which are often used as dictionaries, may only have Strings as keys.\n \n Because Ember has a way to get a unique identifier for every object\n via `guidFor`, we can implement a performant Map with arbitrary\n keys. Because it is commonly used in low-level bookkeeping, Map is\n implemented as a pure JavaScript object for performance.\n \n This implementation follows the current iteration of the ES6 proposal for\n maps (http://wiki.ecmascript.org/doku.php?id=harmony:simple_maps_and_sets),\n with one exception: as we do not have the luxury of in-VM iteration, we implement a\n forEach method for iteration.\n \n Map is mocked out to look like an Ember object, so you can do\n `EmberMap.create()` for symmetry with other Ember classes.\n */\n\n function copyNull(obj) {\n var output = Object.create(null);\n\n for (var prop in obj) {\n // hasOwnPropery is not needed because obj is Object.create(null);\n output[prop] = obj[prop];\n }\n\n return output;\n }\n\n function copyMap(original, newObject) {\n var keys = original._keys.copy();\n var values = copyNull(original._values);\n\n newObject._keys = keys;\n newObject._values = values;\n newObject.size = original.size;\n\n return newObject;\n }\n\n /**\n This class is used internally by Ember and Ember Data.\n Please do not use it at this time. We plan to clean it up\n and add many tests soon.\n \n @class OrderedSet\n @namespace Ember\n @constructor\n @private\n */\n\n var OrderedSet = function () {\n function OrderedSet() {\n emberBabel.classCallCheck(this, OrderedSet);\n\n this.clear();\n }\n\n /**\n @method create\n @static\n @return {Ember.OrderedSet}\n @private\n */\n\n OrderedSet.create = function create() {\n var Constructor = this;\n return new Constructor();\n };\n\n /**\n @method clear\n @private\n */\n\n OrderedSet.prototype.clear = function clear() {\n this.presenceSet = Object.create(null);\n this.list = [];\n this.size = 0;\n };\n\n /**\n @method add\n @param obj\n @param guid (optional, and for internal use)\n @return {Ember.OrderedSet}\n @private\n */\n\n OrderedSet.prototype.add = function add(obj, _guid) {\n var guid = _guid || emberUtils.guidFor(obj);\n var presenceSet = this.presenceSet;\n var list = this.list;\n\n if (presenceSet[guid] !== true) {\n presenceSet[guid] = true;\n this.size = list.push(obj);\n }\n\n return this;\n };\n\n /**\n @since 1.8.0\n @method delete\n @param obj\n @param _guid (optional and for internal use only)\n @return {Boolean}\n @private\n */\n\n OrderedSet.prototype.delete = function _delete(obj, _guid) {\n var guid = _guid || emberUtils.guidFor(obj);\n var presenceSet = this.presenceSet;\n var list = this.list;\n\n if (presenceSet[guid] === true) {\n delete presenceSet[guid];\n var index = list.indexOf(obj);\n if (index > -1) {\n list.splice(index, 1);\n }\n this.size = list.length;\n return true;\n } else {\n return false;\n }\n };\n\n /**\n @method isEmpty\n @return {Boolean}\n @private\n */\n\n OrderedSet.prototype.isEmpty = function isEmpty() {\n return this.size === 0;\n };\n\n /**\n @method has\n @param obj\n @return {Boolean}\n @private\n */\n\n OrderedSet.prototype.has = function has(obj) {\n if (this.size === 0) {\n return false;\n }\n\n var guid = emberUtils.guidFor(obj);\n var presenceSet = this.presenceSet;\n\n return presenceSet[guid] === true;\n };\n\n /**\n @method forEach\n @param {Function} fn\n @param self\n @private\n */\n\n OrderedSet.prototype.forEach = function forEach(fn /*, ...thisArg*/) {\n true && !(typeof fn === 'function') && emberDebug.assert(Object.prototype.toString.call(fn) + ' is not a function', typeof fn === 'function');\n\n if (this.size === 0) {\n return;\n }\n\n var list = this.list;\n\n if (arguments.length === 2) {\n for (var i = 0; i < list.length; i++) {\n fn.call(arguments[1], list[i]);\n }\n } else {\n for (var _i = 0; _i < list.length; _i++) {\n fn(list[_i]);\n }\n }\n };\n\n /**\n @method toArray\n @return {Array}\n @private\n */\n\n OrderedSet.prototype.toArray = function toArray() {\n return this.list.slice();\n };\n\n /**\n @method copy\n @return {Ember.OrderedSet}\n @private\n */\n\n OrderedSet.prototype.copy = function copy() {\n var Constructor = this.constructor;\n var set = new Constructor();\n\n set.presenceSet = copyNull(this.presenceSet);\n set.list = this.toArray();\n set.size = this.size;\n\n return set;\n };\n\n return OrderedSet;\n }();\n\n /**\n A Map stores values indexed by keys. Unlike JavaScript's\n default Objects, the keys of a Map can be any JavaScript\n object.\n \n Internally, a Map has two data structures:\n \n 1. `keys`: an OrderedSet of all of the existing keys\n 2. `values`: a JavaScript Object indexed by the `guidFor(key)`\n \n When a key/value pair is added for the first time, we\n add the key to the `keys` OrderedSet, and create or\n replace an entry in `values`. When an entry is deleted,\n we delete its entry in `keys` and `values`.\n \n @class Map\n @private\n @constructor\n */\n\n var Map = function () {\n function Map() {\n emberBabel.classCallCheck(this, Map);\n\n this._keys = new OrderedSet();\n this._values = Object.create(null);\n this.size = 0;\n }\n\n /**\n @method create\n @static\n @private\n */\n\n Map.create = function create() {\n var Constructor = this;\n return new Constructor();\n };\n\n /**\n Retrieve the value associated with a given key.\n @method get\n @param {*} key\n @return {*} the value associated with the key, or `undefined`\n @private\n */\n\n Map.prototype.get = function get(key) {\n if (this.size === 0) {\n return;\n }\n\n var values = this._values;\n var guid = emberUtils.guidFor(key);\n\n return values[guid];\n };\n\n /**\n Adds a value to the map. If a value for the given key has already been\n provided, the new value will replace the old value.\n @method set\n @param {*} key\n @param {*} value\n @return {Map}\n @private\n */\n\n Map.prototype.set = function set(key, value) {\n var keys = this._keys;\n var values = this._values;\n var guid = emberUtils.guidFor(key);\n\n // ensure we don't store -0\n var k = key === -0 ? 0 : key;\n\n keys.add(k, guid);\n\n values[guid] = value;\n\n this.size = keys.size;\n\n return this;\n };\n\n /**\n Removes a value from the map for an associated key.\n @since 1.8.0\n @method delete\n @param {*} key\n @return {Boolean} true if an item was removed, false otherwise\n @private\n */\n\n Map.prototype.delete = function _delete(key) {\n if (this.size === 0) {\n return false;\n }\n // don't use ES6 \"delete\" because it will be annoying\n // to use in browsers that are not ES6 friendly;\n var keys = this._keys;\n var values = this._values;\n var guid = emberUtils.guidFor(key);\n\n if (keys.delete(key, guid)) {\n delete values[guid];\n this.size = keys.size;\n return true;\n } else {\n return false;\n }\n };\n\n /**\n Check whether a key is present.\n @method has\n @param {*} key\n @return {Boolean} true if the item was present, false otherwise\n @private\n */\n\n Map.prototype.has = function has(key) {\n return this._keys.has(key);\n };\n\n /**\n Iterate over all the keys and values. Calls the function once\n for each key, passing in value, key, and the map being iterated over,\n in that order.\n The keys are guaranteed to be iterated over in insertion order.\n @method forEach\n @param {Function} callback\n @param {*} self if passed, the `this` value inside the\n callback. By default, `this` is the map.\n @private\n */\n\n Map.prototype.forEach = function forEach(callback /*, ...thisArg*/) {\n true && !(typeof callback === 'function') && emberDebug.assert(Object.prototype.toString.call(callback) + ' is not a function', typeof callback === 'function');\n\n if (this.size === 0) {\n return;\n }\n\n var map = this;\n var cb = void 0,\n thisArg = void 0;\n\n if (arguments.length === 2) {\n thisArg = arguments[1];\n cb = function (key) {\n return callback.call(thisArg, map.get(key), key, map);\n };\n } else {\n cb = function (key) {\n return callback(map.get(key), key, map);\n };\n }\n\n this._keys.forEach(cb);\n };\n\n /**\n @method clear\n @private\n */\n\n Map.prototype.clear = function clear() {\n this._keys.clear();\n this._values = Object.create(null);\n this.size = 0;\n };\n\n /**\n @method copy\n @return {Map}\n @private\n */\n\n Map.prototype.copy = function copy() {\n return copyMap(this, new Map());\n };\n\n return Map;\n }();\n\n /**\n @class MapWithDefault\n @extends Map\n @private\n @constructor\n @param [options]\n @param {*} [options.defaultValue]\n */\n\n var MapWithDefault = function (_Map) {\n emberBabel.inherits(MapWithDefault, _Map);\n\n function MapWithDefault(options) {\n emberBabel.classCallCheck(this, MapWithDefault);\n\n var _this = emberBabel.possibleConstructorReturn(this, _Map.call(this));\n\n _this.defaultValue = options.defaultValue;\n return _this;\n }\n\n /**\n @method create\n @static\n @param [options]\n @param {*} [options.defaultValue]\n @return {MapWithDefault|Map} If options are passed, returns\n `MapWithDefault` otherwise returns `EmberMap`\n @private\n */\n\n MapWithDefault.create = function create(options) {\n if (options) {\n return new MapWithDefault(options);\n } else {\n return new Map();\n }\n };\n\n /**\n Retrieve the value associated with a given key.\n @method get\n @param {*} key\n @return {*} the value associated with the key, or the default value\n @private\n */\n\n MapWithDefault.prototype.get = function get(key) {\n var hasValue = this.has(key);\n\n if (hasValue) {\n return _Map.prototype.get.call(this, key);\n } else {\n var defaultValue = this.defaultValue(key);\n this.set(key, defaultValue);\n return defaultValue;\n }\n };\n\n /**\n @method copy\n @return {MapWithDefault}\n @private\n */\n\n MapWithDefault.prototype.copy = function copy() {\n var Constructor = this.constructor;\n return copyMap(this, new Constructor({\n defaultValue: this.defaultValue\n }));\n };\n\n return MapWithDefault;\n }(Map);\n\n /**\n @module @ember/object\n */\n\n /**\n To get multiple properties at once, call `getProperties`\n with an object followed by a list of strings or an array:\n \n ```javascript\n import { getProperties } from '@ember/object';\n \n getProperties(record, 'firstName', 'lastName', 'zipCode');\n // { firstName: 'John', lastName: 'Doe', zipCode: '10011' }\n ```\n \n is equivalent to:\n \n ```javascript\n import { getProperties } from '@ember/object';\n \n getProperties(record, ['firstName', 'lastName', 'zipCode']);\n // { firstName: 'John', lastName: 'Doe', zipCode: '10011' }\n ```\n \n @method getProperties\n @static\n @for @ember/object\n @param {Object} obj\n @param {String...|Array} list of keys to get\n @return {Object}\n @public\n */\n function getProperties(obj) {\n var ret = {};\n var propertyNames = arguments;\n var i = 1;\n\n if (arguments.length === 2 && Array.isArray(arguments[1])) {\n i = 0;\n propertyNames = arguments[1];\n }\n for (; i < propertyNames.length; i++) {\n ret[propertyNames[i]] = get(obj, propertyNames[i]);\n }\n return ret;\n }\n\n /**\n @module @ember/object\n */\n /**\n Set a list of properties on an object. These properties are set inside\n a single `beginPropertyChanges` and `endPropertyChanges` batch, so\n observers will be buffered.\n \n ```javascript\n import EmberObject from '@ember/object';\n let anObject = EmberObject.create();\n \n anObject.setProperties({\n firstName: 'Stanley',\n lastName: 'Stuart',\n age: 21\n });\n ```\n \n @method setProperties\n @static\n @for @ember/object\n @param obj\n @param {Object} properties\n @return properties\n @public\n */\n function setProperties(obj, properties) {\n if (properties === null || typeof properties !== 'object') {\n return properties;\n }\n changeProperties(function () {\n var props = Object.keys(properties);\n var propertyName = void 0;\n\n for (var i = 0; i < props.length; i++) {\n propertyName = props[i];\n\n set(obj, propertyName, properties[propertyName]);\n }\n });\n return properties;\n }\n\n /**\n @module @ember/object\n */\n var a_concat = Array.prototype.concat;\n var isArray = Array.isArray;\n\n function isMethod(obj) {\n return 'function' === typeof obj && obj.isMethod !== false && obj !== Boolean && obj !== Object && obj !== Number && obj !== Array && obj !== Date && obj !== String;\n }\n\n var CONTINUE = {};\n\n function mixinProperties(mixinsMeta, mixin) {\n var guid = void 0;\n\n if (mixin instanceof Mixin) {\n guid = emberUtils.guidFor(mixin);\n if (mixinsMeta.peekMixins(guid)) {\n return CONTINUE;\n }\n mixinsMeta.writeMixins(guid, mixin);\n return mixin.properties;\n } else {\n return mixin; // apply anonymous mixin properties\n }\n }\n\n function concatenatedMixinProperties(concatProp, props, values, base) {\n // reset before adding each new mixin to pickup concats from previous\n var concats = values[concatProp] || base[concatProp];\n if (props[concatProp]) {\n concats = concats ? a_concat.call(concats, props[concatProp]) : props[concatProp];\n }\n return concats;\n }\n\n function giveDescriptorSuper(meta$$1, key, property, values, descs, base) {\n var superProperty = void 0;\n\n // Computed properties override methods, and do not call super to them\n if (values[key] === undefined) {\n // Find the original descriptor in a parent mixin\n superProperty = descs[key];\n }\n\n // If we didn't find the original descriptor in a parent mixin, find\n // it on the original object.\n if (!superProperty) {\n superProperty = descriptorFor(base, key, meta$$1);\n }\n\n if (superProperty === undefined || !(superProperty instanceof ComputedProperty)) {\n return property;\n }\n\n // Since multiple mixins may inherit from the same parent, we need\n // to clone the computed property so that other mixins do not receive\n // the wrapped version.\n property = Object.create(property);\n property._getter = emberUtils.wrap(property._getter, superProperty._getter);\n if (superProperty._setter) {\n if (property._setter) {\n property._setter = emberUtils.wrap(property._setter, superProperty._setter);\n } else {\n property._setter = superProperty._setter;\n }\n }\n\n return property;\n }\n\n function giveMethodSuper(obj, key, method, values, descs) {\n // Methods overwrite computed properties, and do not call super to them.\n if (descs[key] !== undefined) {\n return method;\n }\n\n // Find the original method in a parent mixin\n var superMethod = values[key];\n\n // If we didn't find the original value in a parent mixin, find it in\n // the original object\n if (superMethod === undefined && (!features.EMBER_METAL_ES5_GETTERS || descriptorFor(obj, key) === undefined)) {\n superMethod = obj[key];\n }\n\n // Only wrap the new method if the original method was a function\n if (typeof superMethod === 'function') {\n return emberUtils.wrap(method, superMethod);\n }\n\n return method;\n }\n\n function applyConcatenatedProperties(obj, key, value, values) {\n var baseValue = values[key] || obj[key];\n var ret = void 0;\n\n if (baseValue === null || baseValue === undefined) {\n ret = emberUtils.makeArray(value);\n } else if (isArray(baseValue)) {\n if (value === null || value === undefined) {\n ret = baseValue;\n } else {\n ret = a_concat.call(baseValue, value);\n }\n } else {\n ret = a_concat.call(emberUtils.makeArray(baseValue), value);\n }\n\n {\n // it is possible to use concatenatedProperties with strings (which cannot be frozen)\n // only freeze objects...\n if (typeof ret === 'object' && ret !== null) {\n // prevent mutating `concatenatedProperties` array after it is applied\n Object.freeze(ret);\n }\n }\n\n return ret;\n }\n\n function applyMergedProperties(obj, key, value, values) {\n var baseValue = values[key] || obj[key];\n\n true && !!isArray(value) && emberDebug.assert('You passed in `' + JSON.stringify(value) + '` as the value for `' + key + '` but `' + key + '` cannot be an Array', !isArray(value));\n\n if (!baseValue) {\n return value;\n }\n\n var newBase = emberUtils.assign({}, baseValue);\n var hasFunction = false;\n\n for (var prop in value) {\n if (!value.hasOwnProperty(prop)) {\n continue;\n }\n\n var propValue = value[prop];\n if (isMethod(propValue)) {\n // TODO: support for Computed Properties, etc?\n hasFunction = true;\n newBase[prop] = giveMethodSuper(obj, prop, propValue, baseValue, {});\n } else {\n newBase[prop] = propValue;\n }\n }\n\n if (hasFunction) {\n newBase._super = emberUtils.ROOT;\n }\n\n return newBase;\n }\n\n function addNormalizedProperty(base, key, value, meta$$1, descs, values, concats, mergings) {\n if (value instanceof Descriptor) {\n if (emberEnvironment.ENV._ENABLE_PROPERTY_REQUIRED_SUPPORT && value === REQUIRED && descs[key]) {\n return CONTINUE;\n }\n\n // Wrap descriptor function to implement\n // _super() if needed\n if (value._getter) {\n value = giveDescriptorSuper(meta$$1, key, value, values, descs, base);\n }\n\n descs[key] = value;\n values[key] = undefined;\n } else {\n if (concats && concats.indexOf(key) >= 0 || key === 'concatenatedProperties' || key === 'mergedProperties') {\n value = applyConcatenatedProperties(base, key, value, values);\n } else if (mergings && mergings.indexOf(key) > -1) {\n value = applyMergedProperties(base, key, value, values);\n } else if (isMethod(value)) {\n value = giveMethodSuper(base, key, value, values, descs);\n }\n\n descs[key] = undefined;\n values[key] = value;\n }\n }\n\n function mergeMixins(mixins, meta$$1, descs, values, base, keys) {\n var currentMixin = void 0,\n props = void 0,\n key = void 0,\n concats = void 0,\n mergings = void 0;\n\n function removeKeys(keyName) {\n delete descs[keyName];\n delete values[keyName];\n }\n\n for (var i = 0; i < mixins.length; i++) {\n currentMixin = mixins[i];\n true && !(typeof currentMixin === 'object' && currentMixin !== null && Object.prototype.toString.call(currentMixin) !== '[object Array]') && emberDebug.assert('Expected hash or Mixin instance, got ' + Object.prototype.toString.call(currentMixin), typeof currentMixin === 'object' && currentMixin !== null && Object.prototype.toString.call(currentMixin) !== '[object Array]');\n\n props = mixinProperties(meta$$1, currentMixin);\n if (props === CONTINUE) {\n continue;\n }\n\n if (props) {\n // remove willMergeMixin after 3.4 as it was used for _actions\n if (base.willMergeMixin) {\n base.willMergeMixin(props);\n }\n concats = concatenatedMixinProperties('concatenatedProperties', props, values, base);\n mergings = concatenatedMixinProperties('mergedProperties', props, values, base);\n\n for (key in props) {\n if (!props.hasOwnProperty(key)) {\n continue;\n }\n keys.push(key);\n addNormalizedProperty(base, key, props[key], meta$$1, descs, values, concats, mergings);\n }\n\n // manually copy toString() because some JS engines do not enumerate it\n if (props.hasOwnProperty('toString')) {\n base.toString = props.toString;\n }\n } else if (currentMixin.mixins) {\n mergeMixins(currentMixin.mixins, meta$$1, descs, values, base, keys);\n if (currentMixin._without) {\n currentMixin._without.forEach(removeKeys);\n }\n }\n }\n }\n\n function followAlias(obj, desc, descs, values) {\n var altKey = desc.methodName;\n var value = void 0;\n var possibleDesc = void 0;\n if (descs[altKey] || values[altKey]) {\n value = values[altKey];\n desc = descs[altKey];\n } else if ((possibleDesc = descriptorFor(obj, altKey)) !== undefined) {\n desc = possibleDesc;\n value = undefined;\n } else {\n desc = undefined;\n value = obj[altKey];\n }\n\n return { desc: desc, value: value };\n }\n\n function updateObserversAndListeners(obj, key, paths, updateMethod) {\n if (paths) {\n for (var i = 0; i < paths.length; i++) {\n updateMethod(obj, paths[i], null, key);\n }\n }\n }\n\n function replaceObserversAndListeners(obj, key, prev, next) {\n if (typeof prev === 'function') {\n updateObserversAndListeners(obj, key, prev.__ember_observesBefore__, _removeBeforeObserver);\n updateObserversAndListeners(obj, key, prev.__ember_observes__, removeObserver);\n updateObserversAndListeners(obj, key, prev.__ember_listens__, removeListener);\n }\n\n if (typeof next === 'function') {\n updateObserversAndListeners(obj, key, next.__ember_observesBefore__, _addBeforeObserver);\n updateObserversAndListeners(obj, key, next.__ember_observes__, addObserver);\n updateObserversAndListeners(obj, key, next.__ember_listens__, addListener);\n }\n }\n\n function applyMixin(obj, mixins, partial) {\n var descs = {};\n var values = {};\n var meta$$1 = meta(obj);\n var keys = [];\n var key = void 0,\n value = void 0,\n desc = void 0;\n\n obj._super = emberUtils.ROOT;\n\n // Go through all mixins and hashes passed in, and:\n //\n // * Handle concatenated properties\n // * Handle merged properties\n // * Set up _super wrapping if necessary\n // * Set up computed property descriptors\n // * Copying `toString` in broken browsers\n mergeMixins(mixins, meta$$1, descs, values, obj, keys);\n\n for (var i = 0; i < keys.length; i++) {\n key = keys[i];\n if (key === 'constructor' || !values.hasOwnProperty(key)) {\n continue;\n }\n\n desc = descs[key];\n value = values[key];\n\n if (emberEnvironment.ENV._ENABLE_PROPERTY_REQUIRED_SUPPORT && desc === REQUIRED) {\n continue;\n }\n\n while (desc && desc instanceof Alias) {\n var followed = followAlias(obj, desc, descs, values);\n desc = followed.desc;\n value = followed.value;\n }\n\n if (desc === undefined && value === undefined) {\n continue;\n }\n\n if (features.EMBER_METAL_ES5_GETTERS && descriptorFor(obj, key) !== undefined) {\n replaceObserversAndListeners(obj, key, null, value);\n } else {\n replaceObserversAndListeners(obj, key, obj[key], value);\n }\n\n if (emberEnvironment.ENV._ENABLE_BINDING_SUPPORT && typeof Mixin.detectBinding === 'function' && Mixin.detectBinding(key)) {\n meta$$1.writeBindings(key, value);\n }\n\n defineProperty(obj, key, desc, value, meta$$1);\n }\n\n if (emberEnvironment.ENV._ENABLE_BINDING_SUPPORT && !partial && typeof Mixin.finishProtype === 'function') {\n Mixin.finishPartial(obj, meta$$1);\n }\n\n return obj;\n }\n\n /**\n @method mixin\n @param obj\n @param mixins*\n @return obj\n @private\n */\n function mixin(obj) {\n for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n applyMixin(obj, args, false);\n return obj;\n }\n\n /**\n The `Mixin` class allows you to create mixins, whose properties can be\n added to other classes. For instance,\n \n ```javascript\n import Mixin from '@ember/object/mixin';\n \n const EditableMixin = Mixin.create({\n edit() {\n console.log('starting to edit');\n this.set('isEditing', true);\n },\n isEditing: false\n });\n ```\n \n ```javascript\n import EmberObject from '@ember/object';\n import EditableMixin from '../mixins/editable';\n \n // Mix mixins into classes by passing them as the first arguments to\n // `.extend.`\n const Comment = EmberObject.extend(EditableMixin, {\n post: null\n });\n \n let comment = Comment.create({\n post: somePost\n });\n \n comment.edit(); // outputs 'starting to edit'\n ```\n \n Note that Mixins are created with `Mixin.create`, not\n `Mixin.extend`.\n \n Note that mixins extend a constructor's prototype so arrays and object literals\n defined as properties will be shared amongst objects that implement the mixin.\n If you want to define a property in a mixin that is not shared, you can define\n it either as a computed property or have it be created on initialization of the object.\n \n ```javascript\n // filters array will be shared amongst any object implementing mixin\n import Mixin from '@ember/object/mixin';\n import { A } from '@ember/array';\n \n const FilterableMixin = Mixin.create({\n filters: A()\n });\n ```\n \n ```javascript\n import Mixin from '@ember/object/mixin';\n import { A } from '@ember/array';\n import { computed } from '@ember/object';\n \n // filters will be a separate array for every object implementing the mixin\n const FilterableMixin = Mixin.create({\n filters: computed(function() {\n return A();\n })\n });\n ```\n \n ```javascript\n import Mixin from '@ember/object/mixin';\n import { A } from '@ember/array';\n \n // filters will be created as a separate array during the object's initialization\n const Filterable = Mixin.create({\n filters: null,\n \n init() {\n this._super(...arguments);\n this.set(\"filters\", A());\n }\n });\n ```\n \n @class Mixin\n @public\n */\n\n var Mixin = function () {\n function Mixin(mixins, properties) {\n emberBabel.classCallCheck(this, Mixin);\n\n this.properties = properties;\n\n var length = mixins && mixins.length;\n\n if (length > 0) {\n var m = new Array(length);\n\n for (var i = 0; i < length; i++) {\n var x = mixins[i];\n if (x instanceof Mixin) {\n m[i] = x;\n } else {\n m[i] = new Mixin(undefined, x);\n }\n }\n\n this.mixins = m;\n } else {\n this.mixins = undefined;\n }\n this.ownerConstructor = undefined;\n this._without = undefined;\n this[emberUtils.GUID_KEY] = null;\n this[emberUtils.NAME_KEY] = null;\n emberDebug.debugSeal(this);\n }\n\n Mixin.applyPartial = function applyPartial(obj) {\n for (var _len2 = arguments.length, args = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n return applyMixin(obj, args, true);\n };\n\n /**\n @method create\n @for @ember/object/mixin\n @static\n @param arguments*\n @public\n */\n\n Mixin.create = function create() {\n // ES6TODO: this relies on a global state?\n unprocessedFlag = true;\n var M = this;\n\n for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n args[_key3] = arguments[_key3];\n }\n\n return new M(args, undefined);\n };\n\n // returns the mixins currently applied to the specified object\n // TODO: Make `mixin`\n\n\n Mixin.mixins = function mixins(obj) {\n var meta$$1 = peekMeta(obj);\n var ret = [];\n if (meta$$1 === undefined) {\n return ret;\n }\n\n meta$$1.forEachMixins(function (key, currentMixin) {\n // skip primitive mixins since these are always anonymous\n if (!currentMixin.properties) {\n ret.push(currentMixin);\n }\n });\n\n return ret;\n };\n\n /**\n @method reopen\n @param arguments*\n @private\n */\n\n Mixin.prototype.reopen = function reopen() {\n var currentMixin = void 0;\n\n if (this.properties) {\n currentMixin = new Mixin(undefined, this.properties);\n this.properties = undefined;\n this.mixins = [currentMixin];\n } else if (!this.mixins) {\n this.mixins = [];\n }\n\n var mixins = this.mixins;\n var idx = void 0;\n\n for (idx = 0; idx < arguments.length; idx++) {\n currentMixin = arguments[idx];\n true && !(typeof currentMixin === 'object' && currentMixin !== null && Object.prototype.toString.call(currentMixin) !== '[object Array]') && emberDebug.assert('Expected hash or Mixin instance, got ' + Object.prototype.toString.call(currentMixin), typeof currentMixin === 'object' && currentMixin !== null && Object.prototype.toString.call(currentMixin) !== '[object Array]');\n\n if (currentMixin instanceof Mixin) {\n mixins.push(currentMixin);\n } else {\n mixins.push(new Mixin(undefined, currentMixin));\n }\n }\n\n return this;\n };\n\n /**\n @method apply\n @param obj\n @return applied object\n @private\n */\n\n Mixin.prototype.apply = function apply(obj) {\n return applyMixin(obj, [this], false);\n };\n\n Mixin.prototype.applyPartial = function applyPartial(obj) {\n return applyMixin(obj, [this], true);\n };\n\n /**\n @method detect\n @param obj\n @return {Boolean}\n @private\n */\n\n Mixin.prototype.detect = function detect(obj) {\n if (typeof obj !== 'object' || obj === null) {\n return false;\n }\n if (obj instanceof Mixin) {\n return _detect(obj, this, {});\n }\n var meta$$1 = peekMeta(obj);\n if (meta$$1 === undefined) {\n return false;\n }\n return !!meta$$1.peekMixins(emberUtils.guidFor(this));\n };\n\n Mixin.prototype.without = function without() {\n var ret = new Mixin([this]);\n\n for (var _len4 = arguments.length, args = Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n args[_key4] = arguments[_key4];\n }\n\n ret._without = args;\n return ret;\n };\n\n Mixin.prototype.keys = function keys() {\n var keys = {};\n var seen = {};\n\n _keys(keys, this, seen);\n var ret = Object.keys(keys);\n return ret;\n };\n\n return Mixin;\n }();\n\n Mixin._apply = applyMixin;\n if (emberEnvironment.ENV._ENABLE_BINDING_SUPPORT) {\n // slotting this so that the legacy addon can add the function here\n // without triggering an error due to the Object.seal done below\n Mixin.finishPartial = null;\n Mixin.detectBinding = null;\n }\n\n var MixinPrototype = Mixin.prototype;\n MixinPrototype.toString = Object.toString;\n\n emberDebug.debugSeal(MixinPrototype);\n\n var unprocessedFlag = false;\n\n function hasUnprocessedMixins() {\n return unprocessedFlag;\n }\n\n function clearUnprocessedMixins() {\n unprocessedFlag = false;\n }\n\n function _detect(curMixin, targetMixin, seen) {\n var guid = emberUtils.guidFor(curMixin);\n\n if (seen[guid]) {\n return false;\n }\n seen[guid] = true;\n\n if (curMixin === targetMixin) {\n return true;\n }\n var mixins = curMixin.mixins;\n var loc = mixins ? mixins.length : 0;\n while (--loc >= 0) {\n if (_detect(mixins[loc], targetMixin, seen)) {\n return true;\n }\n }\n return false;\n }\n\n function _keys(ret, mixin, seen) {\n if (seen[emberUtils.guidFor(mixin)]) {\n return;\n }\n seen[emberUtils.guidFor(mixin)] = true;\n\n if (mixin.properties) {\n var props = Object.keys(mixin.properties);\n for (var i = 0; i < props.length; i++) {\n var key = props[i];\n ret[key] = true;\n }\n } else if (mixin.mixins) {\n mixin.mixins.forEach(function (x) {\n return _keys(ret, x, seen);\n });\n }\n }\n\n var REQUIRED = new Descriptor();\n REQUIRED.toString = function () {\n return '(Required Property)';\n };\n\n /**\n Denotes a required property for a mixin\n \n @method required\n @for Ember\n @private\n */\n function required() {\n true && !false && emberDebug.deprecate('Ember.required is deprecated as its behavior is inconsistent and unreliable.', false, { id: 'ember-metal.required', until: '3.0.0' });\n\n return REQUIRED;\n }\n\n function Alias(methodName) {\n this.isDescriptor = true;\n this.methodName = methodName;\n }\n\n Alias.prototype = new Descriptor();\n\n /**\n Makes a method available via an additional name.\n \n ```app/utils/person.js\n import EmberObject, {\n aliasMethod\n } from '@ember/object';\n \n export default EmberObject.extend({\n name() {\n return 'Tomhuda Katzdale';\n },\n moniker: aliasMethod('name')\n });\n ```\n \n ```javascript\n let goodGuy = Person.create();\n \n goodGuy.name(); // 'Tomhuda Katzdale'\n goodGuy.moniker(); // 'Tomhuda Katzdale'\n ```\n \n @method aliasMethod\n @static\n @for @ember/object\n @param {String} methodName name of the method to alias\n @public\n */\n function aliasMethod(methodName) {\n return new Alias(methodName);\n }\n\n // ..........................................................\n // OBSERVER HELPER\n //\n\n /**\n Specify a method that observes property changes.\n \n ```javascript\n import EmberObject from '@ember/object';\n import { observer } from '@ember/object';\n \n export default EmberObject.extend({\n valueObserver: observer('value', function() {\n // Executes whenever the \"value\" property changes\n })\n });\n ```\n \n Also available as `Function.prototype.observes` if prototype extensions are\n enabled.\n \n @method observer\n @for @ember/object\n @param {String} propertyNames*\n @param {Function} func\n @return func\n @public\n @static\n */\n function observer() {\n for (var _len5 = arguments.length, args = Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {\n args[_key5] = arguments[_key5];\n }\n\n var func = args.pop();\n var _paths = args;\n\n true && !(typeof func === 'function') && emberDebug.assert('observer called without a function', typeof func === 'function');\n true && !(_paths.length > 0 && _paths.every(function (p) {\n return typeof p === 'string' && p.length;\n })) && emberDebug.assert('observer called without valid path', _paths.length > 0 && _paths.every(function (p) {\n return typeof p === 'string' && p.length;\n }));\n\n var paths = [];\n var addWatchedProperty = function (path) {\n return paths.push(path);\n };\n\n for (var i = 0; i < _paths.length; ++i) {\n expandProperties(_paths[i], addWatchedProperty);\n }\n\n func.__ember_observes__ = paths;\n return func;\n }\n\n /**\n When observers fire, they are called with the arguments `obj`, `keyName`.\n \n Note, `@each.property` observer is called per each add or replace of an element\n and it's not called with a specific enumeration item.\n \n A `_beforeObserver` fires before a property changes.\n \n @method beforeObserver\n @for Ember\n @param {String} propertyNames*\n @param {Function} func\n @return func\n @deprecated\n @private\n */\n function _beforeObserver() {\n for (var _len6 = arguments.length, args = Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {\n args[_key6] = arguments[_key6];\n }\n\n var func = args.pop();\n var _paths = args;\n\n true && !(typeof func === 'function') && emberDebug.assert('_beforeObserver called without a function', typeof func === 'function');\n\n var paths = [];\n var addWatchedProperty = function (path) {\n paths.push(path);\n };\n\n for (var i = 0; i < _paths.length; ++i) {\n expandProperties(_paths[i], addWatchedProperty);\n }\n\n func.__ember_observesBefore__ = paths;\n return func;\n }\n\n /**\n @module ember\n @private\n */\n\n /**\n Read-only property that returns the result of a container lookup.\n \n @class InjectedProperty\n @namespace Ember\n @constructor\n @param {String} type The container type the property will lookup\n @param {String} name (optional) The name the property will lookup, defaults\n to the property's name\n @private\n */\n function InjectedProperty(type, name) {\n this.type = type;\n this.name = name;\n\n this._super$Constructor(injectedPropertyGet);\n AliasedPropertyPrototype.oneWay.call(this);\n }\n\n function injectedPropertyGet(keyName) {\n var desc = descriptorFor(this, keyName);\n var owner = emberUtils.getOwner(this) || this.container; // fallback to `container` for backwards compat\n\n true && !(desc && desc.type) && emberDebug.assert('InjectedProperties should be defined with the inject computed property macros.', desc && desc.type);\n true && !owner && emberDebug.assert('Attempting to lookup an injected property on an object without a container, ensure that the object was instantiated via a container.', owner);\n\n return owner.lookup(desc.type + ':' + (desc.name || keyName));\n }\n\n InjectedProperty.prototype = Object.create(Descriptor.prototype);\n\n var InjectedPropertyPrototype = InjectedProperty.prototype;\n var ComputedPropertyPrototype$1 = ComputedProperty.prototype;\n var AliasedPropertyPrototype = AliasedProperty.prototype;\n\n InjectedPropertyPrototype._super$Constructor = ComputedProperty;\n\n InjectedPropertyPrototype.get = ComputedPropertyPrototype$1.get;\n InjectedPropertyPrototype.readOnly = ComputedPropertyPrototype$1.readOnly;\n InjectedPropertyPrototype.teardown = ComputedPropertyPrototype$1.teardown;\n\n var splice = Array.prototype.splice;\n\n function replace(array, idx, amt, objects) {\n var args = [].concat(objects);\n var ret = [];\n // https://code.google.com/p/chromium/issues/detail?id=56588\n var size = 60000;\n var start = idx;\n var ends = amt;\n var count = void 0,\n chunk = void 0;\n\n while (args.length) {\n count = ends > size ? size : ends;\n if (count <= 0) {\n count = 0;\n }\n\n chunk = args.splice(0, size);\n chunk = [start, count].concat(chunk);\n\n start += size;\n ends -= count;\n\n ret = ret.concat(splice.apply(array, chunk));\n }\n return ret;\n }\n\n function isProxy(value) {\n if (typeof value === 'object' && value !== null) {\n var meta$$1 = peekMeta(value);\n return meta$$1 === undefined ? false : meta$$1.isProxy();\n }\n\n return false;\n }\n\n function descriptor(desc) {\n return new Descriptor$1(desc);\n }\n\n /**\n A wrapper for a native ES5 descriptor. In an ideal world, we wouldn't need\n this at all, however, the way we currently flatten/merge our mixins require\n a special value to denote a descriptor.\n \n @class Descriptor\n @private\n */\n\n var Descriptor$1 = function (_EmberDescriptor) {\n emberBabel.inherits(Descriptor$$1, _EmberDescriptor);\n\n function Descriptor$$1(desc) {\n emberBabel.classCallCheck(this, Descriptor$$1);\n\n var _this = emberBabel.possibleConstructorReturn(this, _EmberDescriptor.call(this));\n\n _this.desc = desc;\n return _this;\n }\n\n Descriptor$$1.prototype.setup = function setup(obj, key) {\n Object.defineProperty(obj, key, this.desc);\n };\n\n Descriptor$$1.prototype.get = function get(obj, key) {\n return obj[key];\n };\n\n Descriptor$$1.prototype.set = function set(obj, key, value) {\n return obj[key] = value;\n };\n\n Descriptor$$1.prototype.teardown = function teardown() {};\n\n return Descriptor$$1;\n }(Descriptor);\n\n exports['default'] = Ember;\n exports.computed = computed;\n exports.cacheFor = cacheFor;\n exports.ComputedProperty = ComputedProperty;\n exports.alias = alias;\n exports.merge = merge;\n exports.deprecateProperty = deprecateProperty;\n exports.instrument = instrument;\n exports._instrumentStart = _instrumentStart;\n exports.instrumentationReset = reset;\n exports.instrumentationSubscribe = subscribe;\n exports.instrumentationUnsubscribe = unsubscribe;\n exports.getOnerror = getOnerror;\n exports.setOnerror = setOnerror;\n exports.setDispatchOverride = setDispatchOverride;\n exports.getDispatchOverride = getDispatchOverride;\n exports.descriptorFor = descriptorFor;\n exports.meta = meta;\n exports.peekMeta = peekMeta;\n exports.deleteMeta = deleteMeta;\n exports.Cache = Cache;\n exports._getPath = _getPath;\n exports.get = get;\n exports.getWithDefault = getWithDefault;\n exports.set = set;\n exports.trySet = trySet;\n exports.addListener = addListener;\n exports.hasListeners = hasListeners;\n exports.on = on;\n exports.removeListener = removeListener;\n exports.sendEvent = sendEvent;\n exports.isNone = isNone;\n exports.isEmpty = isEmpty;\n exports.isBlank = isBlank;\n exports.isPresent = isPresent;\n exports.run = run;\n exports.ObserverSet = ObserverSet;\n exports.beginPropertyChanges = beginPropertyChanges;\n exports.changeProperties = changeProperties;\n exports.endPropertyChanges = endPropertyChanges;\n exports.overrideChains = overrideChains;\n exports.propertyDidChange = propertyDidChange;\n exports.propertyWillChange = propertyWillChange;\n exports.PROPERTY_DID_CHANGE = PROPERTY_DID_CHANGE;\n exports.defineProperty = defineProperty;\n exports.Descriptor = Descriptor;\n exports._hasCachedComputedProperties = _hasCachedComputedProperties;\n exports.watchKey = watchKey;\n exports.unwatchKey = unwatchKey;\n exports.ChainNode = ChainNode;\n exports.finishChains = finishChains;\n exports.removeChainWatcher = removeChainWatcher;\n exports.watchPath = watchPath;\n exports.unwatchPath = unwatchPath;\n exports.isWatching = isWatching;\n exports.unwatch = unwatch;\n exports.watch = watch;\n exports.watcherCount = watcherCount;\n exports.libraries = libraries;\n exports.Libraries = Libraries;\n exports.Map = Map;\n exports.MapWithDefault = MapWithDefault;\n exports.OrderedSet = OrderedSet;\n exports.getProperties = getProperties;\n exports.setProperties = setProperties;\n exports.expandProperties = expandProperties;\n exports.addObserver = addObserver;\n exports.removeObserver = removeObserver;\n exports._addBeforeObserver = _addBeforeObserver;\n exports._removeBeforeObserver = _removeBeforeObserver;\n exports.Mixin = Mixin;\n exports.aliasMethod = aliasMethod;\n exports._beforeObserver = _beforeObserver;\n exports.mixin = mixin;\n exports.observer = observer;\n exports.required = required;\n exports.REQUIRED = REQUIRED;\n exports.hasUnprocessedMixins = hasUnprocessedMixins;\n exports.clearUnprocessedMixins = clearUnprocessedMixins;\n exports.InjectedProperty = InjectedProperty;\n exports.setHasViews = setHasViews;\n exports.tagForProperty = tagForProperty;\n exports.tagFor = tagFor;\n exports.markObjectAsDirty = markObjectAsDirty;\n exports.replace = replace;\n exports.isProxy = isProxy;\n exports.descriptor = descriptor;\n\n Object.defineProperty(exports, '__esModule', { value: true });\n});","enifed('ember-routing/ext/controller', ['exports', 'ember-metal', 'ember-runtime', 'ember-routing/utils'], function (exports, _emberMetal, _emberRuntime, _utils) {\n 'use strict';\n\n /**\n @module ember\n */\n\n _emberRuntime.ControllerMixin.reopen({\n concatenatedProperties: ['queryParams'],\n\n /**\n Defines which query parameters the controller accepts.\n If you give the names `['category','page']` it will bind\n the values of these query parameters to the variables\n `this.category` and `this.page`.\n By default, Ember coerces query parameter values using `toggleProperty`.\n This behavior may lead to unexpected results.\n To explicitly configure a query parameter property so it coerces as expected, you must define a type property:\n ```javascript\n queryParams: [{\n category: {\n type: 'boolean'\n }\n }]\n ```\n @property queryParams\n @public\n */\n queryParams: null,\n\n /**\n This property is updated to various different callback functions depending on\n the current \"state\" of the backing route. It is used by\n `Controller.prototype._qpChanged`.\n The methods backing each state can be found in the `Route.prototype._qp` computed\n property return value (the `.states` property). The current values are listed here for\n the sanity of future travelers:\n * `inactive` - This state is used when this controller instance is not part of the active\n route hierarchy. Set in `Route.prototype._reset` (a `router.js` microlib hook) and\n `Route.prototype.actions.finalizeQueryParamChange`.\n * `active` - This state is used when this controller instance is part of the active\n route hierarchy. Set in `Route.prototype.actions.finalizeQueryParamChange`.\n * `allowOverrides` - This state is used in `Route.prototype.setup` (`route.js` microlib hook).\n @method _qpDelegate\n @private\n */\n _qpDelegate: null, _qpChanged: function (controller, _prop) {\n var prop = _prop.substr(0, _prop.length - 3);\n\n var delegate = controller._qpDelegate;\n var value = (0, _emberMetal.get)(controller, prop);\n delegate(prop, value);\n },\n transitionToRoute: function () {\n // target may be either another controller or a router\n var target = (0, _emberMetal.get)(this, 'target');\n var method = target.transitionToRoute || target.transitionTo;\n\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return method.apply(target, (0, _utils.prefixRouteNameArg)(this, args));\n },\n replaceRoute: function () {\n // target may be either another controller or a router\n var target = (0, _emberMetal.get)(this, 'target');\n var method = target.replaceRoute || target.replaceWith;\n\n for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n return method.apply(target, (0, _utils.prefixRouteNameArg)(this, args));\n }\n });\n\n exports.default = _emberRuntime.ControllerMixin;\n});","enifed('ember-routing/ext/run_loop', ['ember-metal'], function (_emberMetal) {\n 'use strict';\n\n // Add a new named queue after the 'actions' queue (where RSVP promises\n // resolve), which is used in router transitions to prevent unnecessary\n // loading state entry if all context promises resolve on the\n // 'actions' queue first.\n _emberMetal.run._addQueue('routerTransitions', 'actions');\n});","enifed('ember-routing/index', ['exports', 'ember-routing/location/api', 'ember-routing/location/none_location', 'ember-routing/location/hash_location', 'ember-routing/location/history_location', 'ember-routing/location/auto_location', 'ember-routing/system/generate_controller', 'ember-routing/system/controller_for', 'ember-routing/system/dsl', 'ember-routing/system/router', 'ember-routing/system/route', 'ember-routing/system/query_params', 'ember-routing/services/routing', 'ember-routing/services/router', 'ember-routing/system/cache', 'ember-routing/ext/run_loop', 'ember-routing/ext/controller'], function (exports, _api, _none_location, _hash_location, _history_location, _auto_location, _generate_controller, _controller_for, _dsl, _router, _route, _query_params, _routing, _router2, _cache) {\n 'use strict';\n\n exports.BucketCache = exports.RouterService = exports.RoutingService = exports.QueryParams = exports.Route = exports.Router = exports.RouterDSL = exports.controllerFor = exports.generateControllerFactory = exports.generateController = exports.AutoLocation = exports.HistoryLocation = exports.HashLocation = exports.NoneLocation = exports.Location = undefined;\n Object.defineProperty(exports, 'Location', {\n enumerable: true,\n get: function () {\n return _api.default;\n }\n });\n Object.defineProperty(exports, 'NoneLocation', {\n enumerable: true,\n get: function () {\n return _none_location.default;\n }\n });\n Object.defineProperty(exports, 'HashLocation', {\n enumerable: true,\n get: function () {\n return _hash_location.default;\n }\n });\n Object.defineProperty(exports, 'HistoryLocation', {\n enumerable: true,\n get: function () {\n return _history_location.default;\n }\n });\n Object.defineProperty(exports, 'AutoLocation', {\n enumerable: true,\n get: function () {\n return _auto_location.default;\n }\n });\n Object.defineProperty(exports, 'generateController', {\n enumerable: true,\n get: function () {\n return _generate_controller.default;\n }\n });\n Object.defineProperty(exports, 'generateControllerFactory', {\n enumerable: true,\n get: function () {\n return _generate_controller.generateControllerFactory;\n }\n });\n Object.defineProperty(exports, 'controllerFor', {\n enumerable: true,\n get: function () {\n return _controller_for.default;\n }\n });\n Object.defineProperty(exports, 'RouterDSL', {\n enumerable: true,\n get: function () {\n return _dsl.default;\n }\n });\n Object.defineProperty(exports, 'Router', {\n enumerable: true,\n get: function () {\n return _router.default;\n }\n });\n Object.defineProperty(exports, 'Route', {\n enumerable: true,\n get: function () {\n return _route.default;\n }\n });\n Object.defineProperty(exports, 'QueryParams', {\n enumerable: true,\n get: function () {\n return _query_params.default;\n }\n });\n Object.defineProperty(exports, 'RoutingService', {\n enumerable: true,\n get: function () {\n return _routing.default;\n }\n });\n Object.defineProperty(exports, 'RouterService', {\n enumerable: true,\n get: function () {\n return _router2.default;\n }\n });\n Object.defineProperty(exports, 'BucketCache', {\n enumerable: true,\n get: function () {\n return _cache.default;\n }\n });\n});","enifed('ember-routing/location/api', ['exports', 'ember-debug', 'ember-environment', 'ember-routing/location/util'], function (exports, _emberDebug, _emberEnvironment, _util) {\n 'use strict';\n\n exports.default = {\n /**\n This is deprecated in favor of using the container to lookup the location\n implementation as desired.\n For example:\n ```javascript\n // Given a location registered as follows:\n container.register('location:history-test', HistoryTestLocation);\n // You could create a new instance via:\n container.lookup('location:history-test');\n ```\n @method create\n @param {Object} options\n @return {Object} an instance of an implementation of the `location` API\n @deprecated Use the container to lookup the location implementation that you\n need.\n @private\n */\n create: function (options) {\n var implementation = options && options.implementation;\n (true && !(!!implementation) && (0, _emberDebug.assert)('Location.create: you must specify a \\'implementation\\' option', !!implementation));\n\n\n var implementationClass = this.implementations[implementation];\n (true && !(!!implementationClass) && (0, _emberDebug.assert)('Location.create: ' + implementation + ' is not a valid implementation', !!implementationClass));\n\n\n return implementationClass.create.apply(implementationClass, arguments);\n },\n\n\n implementations: {},\n _location: _emberEnvironment.environment.location,\n\n /**\n Returns the current `location.hash` by parsing location.href since browsers\n inconsistently URL-decode `location.hash`.\n https://bugzilla.mozilla.org/show_bug.cgi?id=483304\n @private\n @method getHash\n @since 1.4.0\n */\n _getHash: function () {\n return (0, _util.getHash)(this.location);\n }\n };\n});","enifed('ember-routing/location/auto_location', ['exports', 'ember-utils', 'ember-metal', 'ember-debug', 'ember-runtime', 'ember-environment', 'ember-routing/location/util'], function (exports, _emberUtils, _emberMetal, _emberDebug, _emberRuntime, _emberEnvironment, _util) {\n 'use strict';\n\n exports.getHistoryPath = getHistoryPath;\n exports.getHashPath = getHashPath;\n exports.default = _emberRuntime.Object.extend({\n /**\n @private\n The browser's `location` object. This is typically equivalent to\n `window.location`, but may be overridden for testing.\n @property location\n @default environment.location\n */\n location: _emberEnvironment.environment.location,\n\n /**\n @private\n The browser's `history` object. This is typically equivalent to\n `window.history`, but may be overridden for testing.\n @since 1.5.1\n @property history\n @default environment.history\n */\n history: _emberEnvironment.environment.history,\n\n /**\n @private\n The user agent's global variable. In browsers, this will be `window`.\n @since 1.11\n @property global\n @default window\n */\n global: _emberEnvironment.environment.window,\n\n /**\n @private\n The browser's `userAgent`. This is typically equivalent to\n `navigator.userAgent`, but may be overridden for testing.\n @since 1.5.1\n @property userAgent\n @default environment.history\n */\n userAgent: _emberEnvironment.environment.userAgent,\n\n /**\n @private\n This property is used by the router to know whether to cancel the routing\n setup process, which is needed while we redirect the browser.\n @since 1.5.1\n @property cancelRouterSetup\n @default false\n */\n cancelRouterSetup: false,\n\n /**\n @private\n Will be pre-pended to path upon state change.\n @since 1.5.1\n @property rootURL\n @default '/'\n */\n rootURL: '/',\n\n /**\n Called by the router to instruct the location to do any feature detection\n necessary. In the case of AutoLocation, we detect whether to use history\n or hash concrete implementations.\n @private\n */\n detect: function () {\n var rootURL = this.rootURL;\n\n (true && !(rootURL.charAt(rootURL.length - 1) === '/') && (0, _emberDebug.assert)('rootURL must end with a trailing forward slash e.g. \"/app/\"', rootURL.charAt(rootURL.length - 1) === '/'));\n\n\n var implementation = detectImplementation({\n location: this.location,\n history: this.history,\n userAgent: this.userAgent,\n rootURL: rootURL,\n documentMode: this.documentMode,\n global: this.global\n });\n\n if (implementation === false) {\n (0, _emberMetal.set)(this, 'cancelRouterSetup', true);\n implementation = 'none';\n }\n\n var concrete = (0, _emberUtils.getOwner)(this).lookup('location:' + implementation);\n (0, _emberMetal.set)(concrete, 'rootURL', rootURL);\n\n (true && !(!!concrete) && (0, _emberDebug.assert)('Could not find location \\'' + implementation + '\\'.', !!concrete));\n\n\n (0, _emberMetal.set)(this, 'concreteImplementation', concrete);\n },\n\n\n initState: delegateToConcreteImplementation('initState'),\n getURL: delegateToConcreteImplementation('getURL'),\n setURL: delegateToConcreteImplementation('setURL'),\n replaceURL: delegateToConcreteImplementation('replaceURL'),\n onUpdateURL: delegateToConcreteImplementation('onUpdateURL'),\n formatURL: delegateToConcreteImplementation('formatURL'),\n\n willDestroy: function () {\n var concreteImplementation = (0, _emberMetal.get)(this, 'concreteImplementation');\n\n if (concreteImplementation) {\n concreteImplementation.destroy();\n }\n }\n });\n\n\n function delegateToConcreteImplementation(methodName) {\n return function () {\n var concreteImplementation = (0, _emberMetal.get)(this, 'concreteImplementation');\n (true && !(!!concreteImplementation) && (0, _emberDebug.assert)('AutoLocation\\'s detect() method should be called before calling any other hooks.', !!concreteImplementation));\n\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return (0, _emberUtils.tryInvoke)(concreteImplementation, methodName, args);\n };\n }\n\n /*\n Given the browser's `location`, `history` and `userAgent`, and a configured\n root URL, this function detects whether the browser supports the [History\n API](https://developer.mozilla.org/en-US/docs/Web/API/History) and returns a\n string representing the Location object to use based on its determination.\n \n For example, if the page loads in an evergreen browser, this function would\n return the string \"history\", meaning the history API and thus HistoryLocation\n should be used. If the page is loaded in IE8, it will return the string\n \"hash,\" indicating that the History API should be simulated by manipulating the\n hash portion of the location.\n \n */\n\n function detectImplementation(options) {\n var location = options.location;\n var userAgent = options.userAgent;\n var history = options.history;\n var documentMode = options.documentMode;\n var global = options.global;\n var rootURL = options.rootURL;\n\n var implementation = 'none';\n var cancelRouterSetup = false;\n var currentPath = (0, _util.getFullPath)(location);\n\n if ((0, _util.supportsHistory)(userAgent, history)) {\n var historyPath = getHistoryPath(rootURL, location);\n\n // If the browser supports history and we have a history path, we can use\n // the history location with no redirects.\n if (currentPath === historyPath) {\n return 'history';\n } else {\n if (currentPath.substr(0, 2) === '/#') {\n history.replaceState({ path: historyPath }, null, historyPath);\n implementation = 'history';\n } else {\n cancelRouterSetup = true;\n (0, _util.replacePath)(location, historyPath);\n }\n }\n } else if ((0, _util.supportsHashChange)(documentMode, global)) {\n var hashPath = getHashPath(rootURL, location);\n\n // Be sure we're using a hashed path, otherwise let's switch over it to so\n // we start off clean and consistent. We'll count an index path with no\n // hash as \"good enough\" as well.\n if (currentPath === hashPath || currentPath === '/' && hashPath === '/#/') {\n implementation = 'hash';\n } else {\n // Our URL isn't in the expected hash-supported format, so we want to\n // cancel the router setup and replace the URL to start off clean\n cancelRouterSetup = true;\n (0, _util.replacePath)(location, hashPath);\n }\n }\n\n if (cancelRouterSetup) {\n return false;\n }\n\n return implementation;\n }\n\n /**\n @private\n \n Returns the current path as it should appear for HistoryLocation supported\n browsers. This may very well differ from the real current path (e.g. if it\n starts off as a hashed URL)\n */\n function getHistoryPath(rootURL, location) {\n var path = (0, _util.getPath)(location);\n var hash = (0, _util.getHash)(location);\n var query = (0, _util.getQuery)(location);\n var rootURLIndex = path.indexOf(rootURL);\n var routeHash = void 0,\n hashParts = void 0;\n\n (true && !(rootURLIndex === 0) && (0, _emberDebug.assert)('Path ' + path + ' does not start with the provided rootURL ' + rootURL, rootURLIndex === 0));\n\n\n // By convention, Ember.js routes using HashLocation are required to start\n // with `#/`. Anything else should NOT be considered a route and should\n // be passed straight through, without transformation.\n if (hash.substr(0, 2) === '#/') {\n // There could be extra hash segments after the route\n hashParts = hash.substr(1).split('#');\n // The first one is always the route url\n routeHash = hashParts.shift();\n\n // If the path already has a trailing slash, remove the one\n // from the hashed route so we don't double up.\n if (path.charAt(path.length - 1) === '/') {\n routeHash = routeHash.substr(1);\n }\n\n // This is the \"expected\" final order\n path += routeHash + query;\n\n if (hashParts.length) {\n path += '#' + hashParts.join('#');\n }\n } else {\n path += query + hash;\n }\n\n return path;\n }\n\n /**\n @private\n \n Returns the current path as it should appear for HashLocation supported\n browsers. This may very well differ from the real current path.\n \n @method _getHashPath\n */\n function getHashPath(rootURL, location) {\n var path = rootURL;\n var historyPath = getHistoryPath(rootURL, location);\n var routePath = historyPath.substr(rootURL.length);\n\n if (routePath !== '') {\n if (routePath[0] !== '/') {\n routePath = '/' + routePath;\n }\n\n path += '#' + routePath;\n }\n\n return path;\n }\n});","enifed('ember-routing/location/hash_location', ['exports', 'ember-metal', 'ember-runtime', 'ember-routing/location/api'], function (exports, _emberMetal, _emberRuntime, _api) {\n 'use strict';\n\n exports.default = _emberRuntime.Object.extend({\n implementation: 'hash',\n\n init: function () {\n (0, _emberMetal.set)(this, 'location', (0, _emberMetal.get)(this, '_location') || window.location);\n\n this._hashchangeHandler = undefined;\n },\n\n\n /**\n @private\n Returns normalized location.hash\n @since 1.5.1\n @method getHash\n */\n getHash: _api.default._getHash,\n\n /**\n Returns the normalized URL, constructed from `location.hash`.\n e.g. `#/foo` => `/foo` as well as `#/foo#bar` => `/foo#bar`.\n By convention, hashed paths must begin with a forward slash, otherwise they\n are not treated as a path so we can distinguish intent.\n @private\n @method getURL\n */\n getURL: function () {\n var originalPath = this.getHash().substr(1);\n var outPath = originalPath;\n\n if (outPath[0] !== '/') {\n outPath = '/';\n\n // Only add the # if the path isn't empty.\n // We do NOT want `/#` since the ampersand\n // is only included (conventionally) when\n // the location.hash has a value\n if (originalPath) {\n outPath += '#' + originalPath;\n }\n }\n\n return outPath;\n },\n\n\n /**\n Set the `location.hash` and remembers what was set. This prevents\n `onUpdateURL` callbacks from triggering when the hash was set by\n `HashLocation`.\n @private\n @method setURL\n @param path {String}\n */\n setURL: function (path) {\n (0, _emberMetal.get)(this, 'location').hash = path;\n (0, _emberMetal.set)(this, 'lastSetURL', path);\n },\n\n\n /**\n Uses location.replace to update the url without a page reload\n or history modification.\n @private\n @method replaceURL\n @param path {String}\n */\n replaceURL: function (path) {\n (0, _emberMetal.get)(this, 'location').replace('#' + path);\n (0, _emberMetal.set)(this, 'lastSetURL', path);\n },\n\n\n /**\n Register a callback to be invoked when the hash changes. These\n callbacks will execute when the user presses the back or forward\n button, but not after `setURL` is invoked.\n @private\n @method onUpdateURL\n @param callback {Function}\n */\n onUpdateURL: function (callback) {\n this._removeEventListener();\n\n this._hashchangeHandler = _emberMetal.run.bind(this, function () {\n var path = this.getURL();\n if ((0, _emberMetal.get)(this, 'lastSetURL') === path) {\n return;\n }\n\n (0, _emberMetal.set)(this, 'lastSetURL', null);\n\n callback(path);\n });\n\n window.addEventListener('hashchange', this._hashchangeHandler);\n },\n\n\n /**\n Given a URL, formats it to be placed into the page as part\n of an element's `href` attribute.\n This is used, for example, when using the {{action}} helper\n to generate a URL based on an event.\n @private\n @method formatURL\n @param url {String}\n */\n formatURL: function (url) {\n return '#' + url;\n },\n\n\n /**\n Cleans up the HashLocation event listener.\n @private\n @method willDestroy\n */\n willDestroy: function () {\n this._removeEventListener();\n },\n _removeEventListener: function () {\n if (this._hashchangeHandler) {\n window.removeEventListener('hashchange', this._hashchangeHandler);\n }\n }\n });\n});","enifed('ember-routing/location/history_location', ['exports', 'ember-metal', 'ember-runtime', 'ember-routing/location/api'], function (exports, _emberMetal, _emberRuntime, _api) {\n 'use strict';\n\n /**\n @module @ember/routing\n */\n\n var popstateFired = false;\n\n function _uuid() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n var r, v;\n r = Math.random() * 16 | 0;\n v = c === 'x' ? r : r & 3 | 8;\n return v.toString(16);\n });\n }\n\n /**\n HistoryLocation implements the location API using the browser's\n history.pushState API.\n \n Using `HistoryLocation` results in URLs that are indistinguishable from a\n standard URL. This relies upon the browser's `history` API.\n \n Example:\n \n ```app/router.js\n Router.map(function() {\n this.route('posts', function() {\n this.route('new');\n });\n });\n \n Router.reopen({\n location: 'history'\n });\n ```\n \n This will result in a posts.new url of `/posts/new`.\n \n Keep in mind that your server must serve the Ember app at all the routes you\n define.\n \n @class HistoryLocation\n @extends EmberObject\n @protected\n */\n exports.default = _emberRuntime.Object.extend({\n implementation: 'history',\n\n init: function () {\n this._super.apply(this, arguments);\n\n var base = document.querySelector('base');\n var baseURL = '';\n if (base) {\n baseURL = base.getAttribute('href');\n }\n\n (0, _emberMetal.set)(this, 'baseURL', baseURL);\n (0, _emberMetal.set)(this, 'location', (0, _emberMetal.get)(this, 'location') || window.location);\n\n this._popstateHandler = undefined;\n },\n\n\n /**\n Used to set state on first call to setURL\n @private\n @method initState\n */\n initState: function () {\n var history = (0, _emberMetal.get)(this, 'history') || window.history;\n (0, _emberMetal.set)(this, 'history', history);\n\n if (history && 'state' in history) {\n this.supportsHistory = true;\n }\n\n var state = this.getState();\n var path = this.formatURL(this.getURL());\n if (state && state.path === path) {\n // preserve existing state\n // used for webkit workaround, since there will be no initial popstate event\n this._previousURL = this.getURL();\n } else {\n this.replaceState(path);\n }\n },\n\n\n /**\n Will be pre-pended to path upon state change\n @property rootURL\n @default '/'\n @private\n */\n rootURL: '/',\n\n /**\n Returns the current `location.pathname` without `rootURL` or `baseURL`\n @private\n @method getURL\n @return url {String}\n */\n getURL: function () {\n var location = (0, _emberMetal.get)(this, 'location');\n var path = location.pathname;\n\n var rootURL = (0, _emberMetal.get)(this, 'rootURL');\n var baseURL = (0, _emberMetal.get)(this, 'baseURL');\n\n // remove trailing slashes if they exists\n rootURL = rootURL.replace(/\\/$/, '');\n baseURL = baseURL.replace(/\\/$/, '');\n\n // remove baseURL and rootURL from start of path\n var url = path.replace(new RegExp('^' + baseURL + '(?=/|$)'), '').replace(new RegExp('^' + rootURL + '(?=/|$)'), '').replace(/\\/\\/$/g, '/'); // remove extra slashes\n\n var search = location.search || '';\n url += search + this.getHash();\n\n return url;\n },\n\n\n /**\n Uses `history.pushState` to update the url without a page reload.\n @private\n @method setURL\n @param path {String}\n */\n setURL: function (path) {\n var state = this.getState();\n path = this.formatURL(path);\n\n if (!state || state.path !== path) {\n this.pushState(path);\n }\n },\n\n\n /**\n Uses `history.replaceState` to update the url without a page reload\n or history modification.\n @private\n @method replaceURL\n @param path {String}\n */\n replaceURL: function (path) {\n var state = this.getState();\n path = this.formatURL(path);\n\n if (!state || state.path !== path) {\n this.replaceState(path);\n }\n },\n\n\n /**\n Get the current `history.state`. Checks for if a polyfill is\n required and if so fetches this._historyState. The state returned\n from getState may be null if an iframe has changed a window's\n history.\n The object returned will contain a `path` for the given state as well\n as a unique state `id`. The state index will allow the app to distinguish\n between two states with similar paths but should be unique from one another.\n @private\n @method getState\n @return state {Object}\n */\n getState: function () {\n if (this.supportsHistory) {\n return (0, _emberMetal.get)(this, 'history').state;\n }\n\n return this._historyState;\n },\n\n\n /**\n Pushes a new state.\n @private\n @method pushState\n @param path {String}\n */\n pushState: function (path) {\n var state = { path: path, uuid: _uuid() };\n\n (0, _emberMetal.get)(this, 'history').pushState(state, null, path);\n\n this._historyState = state;\n\n // used for webkit workaround\n this._previousURL = this.getURL();\n },\n\n\n /**\n Replaces the current state.\n @private\n @method replaceState\n @param path {String}\n */\n replaceState: function (path) {\n var state = { path: path, uuid: _uuid() };\n\n (0, _emberMetal.get)(this, 'history').replaceState(state, null, path);\n\n this._historyState = state;\n\n // used for webkit workaround\n this._previousURL = this.getURL();\n },\n\n\n /**\n Register a callback to be invoked whenever the browser\n history changes, including using forward and back buttons.\n @private\n @method onUpdateURL\n @param callback {Function}\n */\n onUpdateURL: function (callback) {\n var _this = this;\n\n this._removeEventListener();\n\n this._popstateHandler = function () {\n // Ignore initial page load popstate event in Chrome\n if (!popstateFired) {\n popstateFired = true;\n if (_this.getURL() === _this._previousURL) {\n return;\n }\n }\n callback(_this.getURL());\n };\n\n window.addEventListener('popstate', this._popstateHandler);\n },\n\n\n /**\n Used when using `{{action}}` helper. The url is always appended to the rootURL.\n @private\n @method formatURL\n @param url {String}\n @return formatted url {String}\n */\n formatURL: function (url) {\n var rootURL = (0, _emberMetal.get)(this, 'rootURL');\n var baseURL = (0, _emberMetal.get)(this, 'baseURL');\n\n if (url !== '') {\n // remove trailing slashes if they exists\n rootURL = rootURL.replace(/\\/$/, '');\n baseURL = baseURL.replace(/\\/$/, '');\n } else if (baseURL[0] === '/' && rootURL[0] === '/') {\n // if baseURL and rootURL both start with a slash\n // ... remove trailing slash from baseURL if it exists\n baseURL = baseURL.replace(/\\/$/, '');\n }\n\n return baseURL + rootURL + url;\n },\n\n\n /**\n Cleans up the HistoryLocation event listener.\n @private\n @method willDestroy\n */\n willDestroy: function () {\n this._removeEventListener();\n },\n\n\n /**\n @private\n Returns normalized location.hash\n @method getHash\n */\n getHash: _api.default._getHash,\n\n _removeEventListener: function () {\n if (this._popstateHandler) {\n window.removeEventListener('popstate', this._popstateHandler);\n }\n }\n });\n});","enifed('ember-routing/location/none_location', ['exports', 'ember-metal', 'ember-debug', 'ember-runtime'], function (exports, _emberMetal, _emberDebug, _emberRuntime) {\n 'use strict';\n\n exports.default = _emberRuntime.Object.extend({\n implementation: 'none',\n path: '',\n\n detect: function () {\n var rootURL = this.rootURL;\n\n (true && !(rootURL.charAt(rootURL.length - 1) === '/') && (0, _emberDebug.assert)('rootURL must end with a trailing forward slash e.g. \"/app/\"', rootURL.charAt(rootURL.length - 1) === '/'));\n },\n\n\n /**\n Will be pre-pended to path.\n @private\n @property rootURL\n @default '/'\n */\n rootURL: '/',\n\n /**\n Returns the current path without `rootURL`.\n @private\n @method getURL\n @return {String} path\n */\n getURL: function () {\n var path = (0, _emberMetal.get)(this, 'path');\n var rootURL = (0, _emberMetal.get)(this, 'rootURL');\n\n // remove trailing slashes if they exists\n rootURL = rootURL.replace(/\\/$/, '');\n\n // remove rootURL from url\n return path.replace(new RegExp('^' + rootURL + '(?=/|$)'), '');\n },\n\n\n /**\n Set the path and remembers what was set. Using this method\n to change the path will not invoke the `updateURL` callback.\n @private\n @method setURL\n @param path {String}\n */\n setURL: function (path) {\n (0, _emberMetal.set)(this, 'path', path);\n },\n\n\n /**\n Register a callback to be invoked when the path changes. These\n callbacks will execute when the user presses the back or forward\n button, but not after `setURL` is invoked.\n @private\n @method onUpdateURL\n @param callback {Function}\n */\n onUpdateURL: function (callback) {\n this.updateCallback = callback;\n },\n\n\n /**\n Sets the path and calls the `updateURL` callback.\n @private\n @method handleURL\n @param url {String}\n */\n handleURL: function (url) {\n (0, _emberMetal.set)(this, 'path', url);\n this.updateCallback(url);\n },\n\n\n /**\n Given a URL, formats it to be placed into the page as part\n of an element's `href` attribute.\n This is used, for example, when using the {{action}} helper\n to generate a URL based on an event.\n @private\n @method formatURL\n @param url {String}\n @return {String} url\n */\n formatURL: function (url) {\n var rootURL = (0, _emberMetal.get)(this, 'rootURL');\n\n if (url !== '') {\n // remove trailing slashes if they exists\n rootURL = rootURL.replace(/\\/$/, '');\n }\n\n return rootURL + url;\n }\n });\n});","enifed('ember-routing/location/util', ['exports'], function (exports) {\n 'use strict';\n\n exports.getPath = getPath;\n exports.getQuery = getQuery;\n exports.getHash = getHash;\n exports.getFullPath = getFullPath;\n exports.getOrigin = getOrigin;\n exports.supportsHashChange = supportsHashChange;\n exports.supportsHistory = supportsHistory;\n exports.replacePath = replacePath;\n /**\n @private\n \n Returns the current `location.pathname`, normalized for IE inconsistencies.\n */\n function getPath(location) {\n var pathname = location.pathname;\n // Various versions of IE/Opera don't always return a leading slash\n if (pathname[0] !== '/') {\n pathname = '/' + pathname;\n }\n\n return pathname;\n }\n\n /**\n @private\n \n Returns the current `location.search`.\n */\n function getQuery(location) {\n return location.search;\n }\n\n /**\n @private\n \n Returns the current `location.hash` by parsing location.href since browsers\n inconsistently URL-decode `location.hash`.\n \n Should be passed the browser's `location` object as the first argument.\n \n https://bugzilla.mozilla.org/show_bug.cgi?id=483304\n */\n function getHash(location) {\n var href = location.href;\n var hashIndex = href.indexOf('#');\n\n if (hashIndex === -1) {\n return '';\n } else {\n return href.substr(hashIndex);\n }\n }\n\n function getFullPath(location) {\n return getPath(location) + getQuery(location) + getHash(location);\n }\n\n function getOrigin(location) {\n var origin = location.origin;\n\n // Older browsers, especially IE, don't have origin\n if (!origin) {\n origin = location.protocol + '//' + location.hostname;\n\n if (location.port) {\n origin += ':' + location.port;\n }\n }\n\n return origin;\n }\n\n /*\n `documentMode` only exist in Internet Explorer, and it's tested because IE8 running in\n IE7 compatibility mode claims to support `onhashchange` but actually does not.\n \n `global` is an object that may have an `onhashchange` property.\n \n @private\n @function supportsHashChange\n */\n function supportsHashChange(documentMode, global) {\n return 'onhashchange' in global && (documentMode === undefined || documentMode > 7);\n }\n\n /*\n `userAgent` is a user agent string. We use user agent testing here, because\n the stock Android browser is known to have buggy versions of the History API,\n in some Android versions.\n \n @private\n @function supportsHistory\n */\n function supportsHistory(userAgent, history) {\n // Boosted from Modernizr: https://github.com/Modernizr/Modernizr/blob/master/feature-detects/history.js\n // The stock browser on Android 2.2 & 2.3, and 4.0.x returns positive on history support\n // Unfortunately support is really buggy and there is no clean way to detect\n // these bugs, so we fall back to a user agent sniff :(\n\n // We only want Android 2 and 4.0, stock browser, and not Chrome which identifies\n // itself as 'Mobile Safari' as well, nor Windows Phone.\n if ((userAgent.indexOf('Android 2.') !== -1 || userAgent.indexOf('Android 4.0') !== -1) && userAgent.indexOf('Mobile Safari') !== -1 && userAgent.indexOf('Chrome') === -1 && userAgent.indexOf('Windows Phone') === -1) {\n return false;\n }\n\n return !!(history && 'pushState' in history);\n }\n\n /**\n Replaces the current location, making sure we explicitly include the origin\n to prevent redirecting to a different origin.\n \n @private\n */\n function replacePath(location, path) {\n location.replace(getOrigin(location) + path);\n }\n});","enifed('ember-routing/services/router', ['exports', 'ember-runtime', 'ember-routing/utils'], function (exports, _emberRuntime, _utils) {\n 'use strict';\n\n /**\n The Router service is the public API that provides component/view layer\n access to the router.\n \n @public\n @class RouterService\n @category ember-routing-router-service\n */\n /**\n @module ember\n */\n\n var RouterService = _emberRuntime.Service.extend({\n\n /**\n Name of the current route.\n This property represent the logical name of the route,\n which is comma separated.\n For the following router:\n ```app/router.js\n Router.map(function() {\n this.route('about);\n this.route('blog', function () {\n this.route('post', { path: ':post_id' });\n });\n });\n ```\n It will return:\n * `index` when you visit `/`\n * `about` when you visit `/about`\n * `blog.index` when you visit `/blog`\n * `blog.post` when you visit `/blog/some-post-id`\n @property currentRouteName\n @type String\n @public\n */\n currentRouteName: (0, _emberRuntime.readOnly)('_router.currentRouteName'),\n\n /**\n Current URL for the application.\n This property represent the URL path for this route.\n For the following router:\n ```app/router.js\n Router.map(function() {\n this.route('about);\n this.route('blog', function () {\n this.route('post', { path: ':post_id' });\n });\n });\n ```\n It will return:\n * `/` when you visit `/`\n * `/about` when you visit `/about`\n * `/blog/index` when you visit `/blog`\n * `/blog/post` when you visit `/blog/some-post-id`\n @property currentURL\n @type String\n @public\n */\n currentURL: (0, _emberRuntime.readOnly)('_router.currentURL'),\n\n /**\n The `location` property determines the type of URL's that your\n application will use.\n The following location types are currently available:\n * `auto`\n * `hash`\n * `history`\n * `none`\n @property location\n @default 'hash'\n @see {Location}\n @public\n */\n location: (0, _emberRuntime.readOnly)('_router.location'),\n\n /**\n The `rootURL` property represents the URL of the root of\n the application, '/' by default.\n This prefix is assumed on all routes defined on this app.\n IF you change the `rootURL` in your environment configuration\n like so:\n ```config/environment.js\n 'use strict';\n module.exports = function(environment) {\n let ENV = {\n modulePrefix: 'router-service',\n environment,\n rootURL: '/my-root',\n …\n }\n ]\n ```\n This property will return `/my-root`.\n @property rootURL\n @default '/'\n @public\n */\n rootURL: (0, _emberRuntime.readOnly)('_router.rootURL'),\n _router: null,\n\n transitionTo: function () {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n if ((0, _utils.resemblesURL)(args[0])) {\n return this._router._doURLTransition('transitionTo', args[0]);\n }\n\n var _extractRouteArgs = (0, _utils.extractRouteArgs)(args),\n routeName = _extractRouteArgs.routeName,\n models = _extractRouteArgs.models,\n queryParams = _extractRouteArgs.queryParams;\n\n var transition = this._router._doTransition(routeName, models, queryParams, true);\n transition._keepDefaultQueryParamValues = true;\n\n return transition;\n },\n replaceWith: function () /* routeNameOrUrl, ...models, options */{\n return this.transitionTo.apply(this, arguments).method('replace');\n },\n urlFor: function () /* routeName, ...models, options */{\n var _router;\n\n return (_router = this._router).generate.apply(_router, arguments);\n },\n isActive: function () {\n for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n var _extractRouteArgs2 = (0, _utils.extractRouteArgs)(args),\n routeName = _extractRouteArgs2.routeName,\n models = _extractRouteArgs2.models,\n queryParams = _extractRouteArgs2.queryParams;\n\n var routerMicrolib = this._router._routerMicrolib;\n\n if (!routerMicrolib.isActiveIntent(routeName, models, null)) {\n return false;\n }\n var hasQueryParams = Object.keys(queryParams).length > 0;\n\n if (hasQueryParams) {\n this._router._prepareQueryParams(routeName, models, queryParams, true /* fromRouterService */);\n return (0, _utils.shallowEqual)(queryParams, routerMicrolib.state.queryParams);\n }\n\n return true;\n }\n });\n\n exports.default = RouterService;\n});","enifed('ember-routing/services/routing', ['exports', 'ember-utils', 'ember-runtime', 'ember-metal'], function (exports, _emberUtils, _emberRuntime, _emberMetal) {\n 'use strict';\n\n exports.default = _emberRuntime.Service.extend({\n router: null,\n\n targetState: (0, _emberRuntime.readOnly)('router.targetState'),\n currentState: (0, _emberRuntime.readOnly)('router.currentState'),\n currentRouteName: (0, _emberRuntime.readOnly)('router.currentRouteName'),\n currentPath: (0, _emberRuntime.readOnly)('router.currentPath'),\n\n hasRoute: function (routeName) {\n return (0, _emberMetal.get)(this, 'router').hasRoute(routeName);\n },\n transitionTo: function (routeName, models, queryParams, shouldReplace) {\n var router = (0, _emberMetal.get)(this, 'router');\n\n var transition = router._doTransition(routeName, models, queryParams);\n\n if (shouldReplace) {\n transition.method('replace');\n }\n\n return transition;\n },\n normalizeQueryParams: function (routeName, models, queryParams) {\n (0, _emberMetal.get)(this, 'router')._prepareQueryParams(routeName, models, queryParams);\n },\n generateURL: function (routeName, models, queryParams) {\n var router = (0, _emberMetal.get)(this, 'router');\n // return early when the router microlib is not present, which is the case for {{link-to}} in integration tests\n if (!router._routerMicrolib) {\n return;\n }\n\n var visibleQueryParams = {};\n if (queryParams) {\n (0, _emberUtils.assign)(visibleQueryParams, queryParams);\n this.normalizeQueryParams(routeName, models, visibleQueryParams);\n }\n\n return router.generate.apply(router, [routeName].concat(models, [{ queryParams: visibleQueryParams }]));\n },\n isActiveForRoute: function (contexts, queryParams, routeName, routerState, isCurrentWhenSpecified) {\n var router = (0, _emberMetal.get)(this, 'router');\n\n var handlers = router._routerMicrolib.recognizer.handlersFor(routeName);\n var leafName = handlers[handlers.length - 1].handler;\n var maximumContexts = numberOfContextsAcceptedByHandler(routeName, handlers);\n\n // NOTE: any ugliness in the calculation of activeness is largely\n // due to the fact that we support automatic normalizing of\n // `resource` -> `resource.index`, even though there might be\n // dynamic segments / query params defined on `resource.index`\n // which complicates (and makes somewhat ambiguous) the calculation\n // of activeness for links that link to `resource` instead of\n // directly to `resource.index`.\n\n // if we don't have enough contexts revert back to full route name\n // this is because the leaf route will use one of the contexts\n if (contexts.length > maximumContexts) {\n routeName = leafName;\n }\n\n return routerState.isActiveIntent(routeName, contexts, queryParams, !isCurrentWhenSpecified);\n }\n });\n\n\n function numberOfContextsAcceptedByHandler(handler, handlerInfos) {\n var req = 0;\n for (var i = 0; i < handlerInfos.length; i++) {\n req += handlerInfos[i].names.length;\n if (handlerInfos[i].handler === handler) {\n break;\n }\n }\n\n return req;\n }\n});","enifed('ember-routing/system/cache', ['exports', 'ember-runtime'], function (exports, _emberRuntime) {\n 'use strict';\n\n exports.default = _emberRuntime.Object.extend({\n init: function () {\n this.cache = Object.create(null);\n },\n has: function (bucketKey) {\n return !!this.cache[bucketKey];\n },\n stash: function (bucketKey, key, value) {\n var bucket = this.cache[bucketKey];\n\n if (!bucket) {\n bucket = this.cache[bucketKey] = Object.create(null);\n }\n\n bucket[key] = value;\n },\n lookup: function (bucketKey, prop, defaultValue) {\n var cache = this.cache;\n if (!this.has(bucketKey)) {\n return defaultValue;\n }\n\n var bucket = cache[bucketKey];\n if (prop in bucket && bucket[prop] !== undefined) {\n return bucket[prop];\n } else {\n return defaultValue;\n }\n }\n });\n});","enifed(\"ember-routing/system/controller_for\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.default = controllerFor;\n /**\n @module ember\n */\n\n /**\n Finds a controller instance.\n \n @for Ember\n @method controllerFor\n @private\n */\n function controllerFor(container, controllerName, lookupOptions) {\n return container.lookup(\"controller:\" + controllerName, lookupOptions);\n }\n});","enifed('ember-routing/system/dsl', ['exports', 'ember-babel', 'ember-utils', 'ember-debug'], function (exports, _emberBabel, _emberUtils, _emberDebug) {\n 'use strict';\n\n var uuid = 0;\n\n var DSL = function () {\n function DSL(name, options) {\n (0, _emberBabel.classCallCheck)(this, DSL);\n\n this.parent = name;\n this.enableLoadingSubstates = options && options.enableLoadingSubstates;\n this.matches = [];\n this.explicitIndex = undefined;\n this.options = options;\n }\n\n DSL.prototype.route = function route(name) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var callback = arguments[2];\n\n var dummyErrorRoute = '/_unused_dummy_error_path_route_' + name + '/:error';\n if (arguments.length === 2 && typeof options === 'function') {\n callback = options;\n options = {};\n }\n\n (true && !(function () {\n if (options.overrideNameAssertion === true) {\n return true;\n }\n\n return ['array', 'basic', 'object', 'application'].indexOf(name) === -1;\n }()) && (0, _emberDebug.assert)('\\'' + name + '\\' cannot be used as a route name.', function () {\n if (options.overrideNameAssertion === true) {\n return true;\n }return ['array', 'basic', 'object', 'application'].indexOf(name) === -1;\n }()));\n\n\n if (this.enableLoadingSubstates) {\n createRoute(this, name + '_loading', { resetNamespace: options.resetNamespace });\n createRoute(this, name + '_error', { resetNamespace: options.resetNamespace, path: dummyErrorRoute });\n }\n\n if (callback) {\n var fullName = getFullName(this, name, options.resetNamespace);\n var dsl = new DSL(fullName, this.options);\n\n createRoute(dsl, 'loading');\n createRoute(dsl, 'error', { path: dummyErrorRoute });\n\n callback.call(dsl);\n\n createRoute(this, name, options, dsl.generate());\n } else {\n createRoute(this, name, options);\n }\n };\n\n DSL.prototype.push = function push(url, name, callback, serialize) {\n var parts = name.split('.');\n\n if (this.options.engineInfo) {\n var localFullName = name.slice(this.options.engineInfo.fullName.length + 1);\n var routeInfo = (0, _emberUtils.assign)({ localFullName: localFullName }, this.options.engineInfo);\n\n if (serialize) {\n routeInfo.serializeMethod = serialize;\n }\n\n this.options.addRouteForEngine(name, routeInfo);\n } else if (serialize) {\n throw new Error('Defining a route serializer on route \\'' + name + '\\' outside an Engine is not allowed.');\n }\n\n if (url === '' || url === '/' || parts[parts.length - 1] === 'index') {\n this.explicitIndex = true;\n }\n\n this.matches.push(url, name, callback);\n };\n\n DSL.prototype.generate = function generate() {\n var dslMatches = this.matches;\n\n if (!this.explicitIndex) {\n this.route('index', { path: '/' });\n }\n\n return function (match) {\n for (var i = 0; i < dslMatches.length; i += 3) {\n match(dslMatches[i]).to(dslMatches[i + 1], dslMatches[i + 2]);\n }\n };\n };\n\n DSL.prototype.mount = function mount(_name) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n var engineRouteMap = this.options.resolveRouteMap(_name);\n var name = _name;\n\n if (options.as) {\n name = options.as;\n }\n\n var fullName = getFullName(this, name, options.resetNamespace);\n\n var engineInfo = {\n name: _name,\n instanceId: uuid++,\n mountPoint: fullName,\n fullName: fullName\n };\n\n var path = options.path;\n\n if (typeof path !== 'string') {\n path = '/' + name;\n }\n\n var callback = void 0;\n var dummyErrorRoute = '/_unused_dummy_error_path_route_' + name + '/:error';\n if (engineRouteMap) {\n var shouldResetEngineInfo = false;\n var oldEngineInfo = this.options.engineInfo;\n if (oldEngineInfo) {\n shouldResetEngineInfo = true;\n this.options.engineInfo = engineInfo;\n }\n\n var optionsForChild = (0, _emberUtils.assign)({ engineInfo: engineInfo }, this.options);\n var childDSL = new DSL(fullName, optionsForChild);\n\n createRoute(childDSL, 'loading');\n createRoute(childDSL, 'error', { path: dummyErrorRoute });\n\n engineRouteMap.class.call(childDSL);\n\n callback = childDSL.generate();\n\n if (shouldResetEngineInfo) {\n this.options.engineInfo = oldEngineInfo;\n }\n }\n\n var localFullName = 'application';\n var routeInfo = (0, _emberUtils.assign)({ localFullName: localFullName }, engineInfo);\n\n if (this.enableLoadingSubstates) {\n // These values are important to register the loading routes under their\n // proper names for the Router and within the Engine's registry.\n var substateName = name + '_loading';\n var _localFullName = 'application_loading';\n var _routeInfo = (0, _emberUtils.assign)({ localFullName: _localFullName }, engineInfo);\n createRoute(this, substateName, { resetNamespace: options.resetNamespace });\n this.options.addRouteForEngine(substateName, _routeInfo);\n\n substateName = name + '_error';\n _localFullName = 'application_error';\n _routeInfo = (0, _emberUtils.assign)({ localFullName: _localFullName }, engineInfo);\n createRoute(this, substateName, { resetNamespace: options.resetNamespace, path: dummyErrorRoute });\n this.options.addRouteForEngine(substateName, _routeInfo);\n }\n\n this.options.addRouteForEngine(fullName, routeInfo);\n\n this.push(path, fullName, callback);\n };\n\n return DSL;\n }();\n\n exports.default = DSL;\n\n\n function canNest(dsl) {\n return dsl.parent !== 'application';\n }\n\n function getFullName(dsl, name, resetNamespace) {\n if (canNest(dsl) && resetNamespace !== true) {\n return dsl.parent + '.' + name;\n } else {\n return name;\n }\n }\n\n function createRoute(dsl, name) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var callback = arguments[3];\n\n var fullName = getFullName(dsl, name, options.resetNamespace);\n\n if (typeof options.path !== 'string') {\n options.path = '/' + name;\n }\n\n dsl.push(options.path, fullName, callback, options.serialize);\n }\n\n DSL.map = function (callback) {\n var dsl = new DSL();\n callback.call(dsl);\n return dsl;\n };\n});","enifed('ember-routing/system/generate_controller', ['exports', 'ember-metal', 'ember-debug'], function (exports, _emberMetal, _emberDebug) {\n 'use strict';\n\n exports.generateControllerFactory = generateControllerFactory;\n exports.default = generateController;\n\n /**\n @module ember\n */\n\n /**\n Generates a controller factory\n \n @for Ember\n @method generateControllerFactory\n @private\n */\n\n function generateControllerFactory(owner, controllerName) {\n var Factory = owner.factoryFor('controller:basic').class;\n\n Factory = Factory.extend({\n toString: function () {\n return '(generated ' + controllerName + ' controller)';\n }\n });\n\n var fullName = 'controller:' + controllerName;\n\n owner.register(fullName, Factory);\n\n return Factory;\n }\n\n /**\n Generates and instantiates a controller extending from `controller:basic`\n if present, or `Controller` if not.\n \n @for Ember\n @method generateController\n @private\n @since 1.3.0\n */\n function generateController(owner, controllerName) {\n generateControllerFactory(owner, controllerName);\n\n var fullName = 'controller:' + controllerName;\n var instance = owner.lookup(fullName);\n\n if (true) {\n if ((0, _emberMetal.get)(instance, 'namespace.LOG_ACTIVE_GENERATION')) {\n (0, _emberDebug.info)('generated -> ' + fullName, { fullName: fullName });\n }\n }\n\n return instance;\n }\n});","enifed('ember-routing/system/query_params', ['exports', 'ember-runtime'], function (exports, _emberRuntime) {\n 'use strict';\n\n exports.default = _emberRuntime.Object.extend({\n isQueryParams: true,\n values: null\n });\n});","enifed('ember-routing/system/route', ['exports', 'ember-utils', 'ember-metal', 'ember-debug', 'ember-runtime', 'ember-routing/system/generate_controller', 'ember-routing/utils'], function (exports, _emberUtils, _emberMetal, _emberDebug, _emberRuntime, _generate_controller, _utils) {\n 'use strict';\n\n exports.defaultSerialize = defaultSerialize;\n exports.hasDefaultSerialize = hasDefaultSerialize;\n\n\n function K() {\n return this;\n }\n\n function defaultSerialize(model, params) {\n if (params.length < 1 || !model) {\n return;\n }\n\n var object = {};\n\n if (params.length === 1) {\n var name = params[0];\n if (name in model) {\n object[name] = (0, _emberMetal.get)(model, name);\n } else if (/_id$/.test(name)) {\n object[name] = (0, _emberMetal.get)(model, 'id');\n }\n } else {\n object = (0, _emberMetal.getProperties)(model, params);\n }\n\n return object;\n }\n\n var DEFAULT_SERIALIZE = (0, _emberUtils.symbol)('DEFAULT_SERIALIZE');\n\n defaultSerialize[DEFAULT_SERIALIZE] = true;\n\n function hasDefaultSerialize(route) {\n return !!route.serialize[DEFAULT_SERIALIZE];\n }\n\n /**\n @module @ember/routing\n */\n\n /**\n The `Route` class is used to define individual routes. Refer to\n the [routing guide](https://emberjs.com/guides/routing/) for documentation.\n \n @class Route\n @extends EmberObject\n @uses ActionHandler\n @uses Evented\n @since 1.0.0\n @public\n */\n var Route = _emberRuntime.Object.extend(_emberRuntime.ActionHandler, _emberRuntime.Evented, {\n /**\n Configuration hash for this route's queryParams. The possible\n configuration options and their defaults are as follows\n (assuming a query param whose controller property is `page`):\n ```javascript\n queryParams: {\n page: {\n // By default, controller query param properties don't\n // cause a full transition when they are changed, but\n // rather only cause the URL to update. Setting\n // `refreshModel` to true will cause an \"in-place\"\n // transition to occur, whereby the model hooks for\n // this route (and any child routes) will re-fire, allowing\n // you to reload models (e.g., from the server) using the\n // updated query param values.\n refreshModel: false,\n // By default, changes to controller query param properties\n // cause the URL to update via `pushState`, which means an\n // item will be added to the browser's history, allowing\n // you to use the back button to restore the app to the\n // previous state before the query param property was changed.\n // Setting `replace` to true will use `replaceState` (or its\n // hash location equivalent), which causes no browser history\n // item to be added. This options name and default value are\n // the same as the `link-to` helper's `replace` option.\n replace: false,\n // By default, the query param URL key is the same name as\n // the controller property name. Use `as` to specify a\n // different URL key.\n as: 'page'\n }\n }\n ```\n @property queryParams\n @for Route\n @type Object\n @since 1.6.0\n @public\n */\n queryParams: {},\n\n _setRouteName: function (name) {\n this.routeName = name;\n this.fullRouteName = getEngineRouteName((0, _emberUtils.getOwner)(this), name);\n },\n\n\n /**\n @private\n @property _qp\n */\n _qp: (0, _emberMetal.computed)(function () {\n var _this = this;\n\n var combinedQueryParameterConfiguration = void 0;\n\n var controllerName = this.controllerName || this.routeName;\n var owner = (0, _emberUtils.getOwner)(this);\n var controller = owner.lookup('controller:' + controllerName);\n var queryParameterConfiguraton = (0, _emberMetal.get)(this, 'queryParams');\n var hasRouterDefinedQueryParams = Object.keys(queryParameterConfiguraton).length > 0;\n\n if (controller) {\n // the developer has authored a controller class in their application for\n // this route find its query params and normalize their object shape them\n // merge in the query params for the route. As a mergedProperty,\n // Route#queryParams is always at least `{}`\n\n var controllerDefinedQueryParameterConfiguration = (0, _emberMetal.get)(controller, 'queryParams') || {};\n var normalizedControllerQueryParameterConfiguration = (0, _utils.normalizeControllerQueryParams)(controllerDefinedQueryParameterConfiguration);\n combinedQueryParameterConfiguration = mergeEachQueryParams(normalizedControllerQueryParameterConfiguration, queryParameterConfiguraton);\n } else if (hasRouterDefinedQueryParams) {\n // the developer has not defined a controller but *has* supplied route query params.\n // Generate a class for them so we can later insert default values\n controller = (0, _generate_controller.default)(owner, controllerName);\n combinedQueryParameterConfiguration = queryParameterConfiguraton;\n }\n\n var qps = [];\n var map = {};\n var propertyNames = [];\n\n for (var propName in combinedQueryParameterConfiguration) {\n if (!combinedQueryParameterConfiguration.hasOwnProperty(propName)) {\n continue;\n }\n\n // to support the dubious feature of using unknownProperty\n // on queryParams configuration\n if (propName === 'unknownProperty' || propName === '_super') {\n // possible todo: issue deprecation warning?\n continue;\n }\n\n var desc = combinedQueryParameterConfiguration[propName];\n var scope = desc.scope || 'model';\n var parts = void 0;\n\n if (scope === 'controller') {\n parts = [];\n }\n\n var urlKey = desc.as || this.serializeQueryParamKey(propName);\n var defaultValue = (0, _emberMetal.get)(controller, propName);\n\n if (Array.isArray(defaultValue)) {\n defaultValue = (0, _emberRuntime.A)(defaultValue.slice());\n }\n\n var type = desc.type || (0, _emberRuntime.typeOf)(defaultValue);\n\n var defaultValueSerialized = this.serializeQueryParam(defaultValue, urlKey, type);\n var scopedPropertyName = controllerName + ':' + propName;\n var qp = {\n undecoratedDefaultValue: (0, _emberMetal.get)(controller, propName),\n defaultValue: defaultValue,\n serializedDefaultValue: defaultValueSerialized,\n serializedValue: defaultValueSerialized,\n\n type: type,\n urlKey: urlKey,\n prop: propName,\n scopedPropertyName: scopedPropertyName,\n controllerName: controllerName,\n route: this,\n parts: parts, // provided later when stashNames is called if 'model' scope\n values: null, // provided later when setup is called. no idea why.\n scope: scope\n };\n\n map[propName] = map[urlKey] = map[scopedPropertyName] = qp;\n qps.push(qp);\n propertyNames.push(propName);\n }\n\n return {\n qps: qps,\n map: map,\n propertyNames: propertyNames,\n states: {\n /*\n Called when a query parameter changes in the URL, this route cares\n about that query parameter, but the route is not currently\n in the active route hierarchy.\n */\n inactive: function (prop, value) {\n var qp = map[prop];\n _this._qpChanged(prop, value, qp);\n },\n /*\n Called when a query parameter changes in the URL, this route cares\n about that query parameter, and the route is currently\n in the active route hierarchy.\n */\n active: function (prop, value) {\n var qp = map[prop];\n _this._qpChanged(prop, value, qp);\n return _this._activeQPChanged(qp, value);\n },\n /*\n Called when a value of a query parameter this route handles changes in a controller\n and the route is currently in the active route hierarchy.\n */\n allowOverrides: function (prop, value) {\n var qp = map[prop];\n _this._qpChanged(prop, value, qp);\n return _this._updatingQPChanged(qp);\n }\n }\n };\n }),\n\n /**\n @private\n @property _names\n */\n _names: null,\n\n _stashNames: function (handlerInfo, dynamicParent) {\n if (this._names) {\n return;\n }\n var names = this._names = handlerInfo._names;\n\n if (!names.length) {\n handlerInfo = dynamicParent;\n names = handlerInfo && handlerInfo._names || [];\n }\n\n var qps = (0, _emberMetal.get)(this, '_qp.qps');\n\n var namePaths = new Array(names.length);\n for (var a = 0; a < names.length; ++a) {\n namePaths[a] = handlerInfo.name + '.' + names[a];\n }\n\n for (var i = 0; i < qps.length; ++i) {\n var qp = qps[i];\n if (qp.scope === 'model') {\n qp.parts = namePaths;\n }\n }\n },\n _activeQPChanged: function (qp, value) {\n this.router._activeQPChanged(qp.scopedPropertyName, value);\n },\n _updatingQPChanged: function (qp) {\n this.router._updatingQPChanged(qp.urlKey);\n },\n\n\n mergedProperties: ['queryParams'],\n\n paramsFor: function (name) {\n var _this2 = this;\n\n var route = (0, _emberUtils.getOwner)(this).lookup('route:' + name);\n\n if (!route) {\n return {};\n }\n\n var transition = this.router._routerMicrolib.activeTransition;\n var state = transition ? transition.state : this.router._routerMicrolib.state;\n\n var fullName = route.fullRouteName;\n var params = (0, _emberUtils.assign)({}, state.params[fullName]);\n var queryParams = getQueryParamsFor(route, state);\n\n return Object.keys(queryParams).reduce(function (params, key) {\n (true && !(!params[key]) && (0, _emberDebug.assert)('The route \\'' + _this2.routeName + '\\' has both a dynamic segment and query param with name \\'' + key + '\\'. Please rename one to avoid collisions.', !params[key]));\n\n params[key] = queryParams[key];\n return params;\n }, params);\n },\n serializeQueryParamKey: function (controllerPropertyName) {\n return controllerPropertyName;\n },\n serializeQueryParam: function (value, urlKey, defaultValueType) {\n // urlKey isn't used here, but anyone overriding\n // can use it to provide serialization specific\n // to a certain query param.\n return this.router._serializeQueryParam(value, defaultValueType);\n },\n deserializeQueryParam: function (value, urlKey, defaultValueType) {\n // urlKey isn't used here, but anyone overriding\n // can use it to provide deserialization specific\n // to a certain query param.\n return this.router._deserializeQueryParam(value, defaultValueType);\n },\n _optionsForQueryParam: function (qp) {\n return (0, _emberMetal.get)(this, 'queryParams.' + qp.urlKey) || (0, _emberMetal.get)(this, 'queryParams.' + qp.prop) || {};\n },\n\n\n /**\n A hook you can use to reset controller values either when the model\n changes or the route is exiting.\n ```app/routes/articles.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n resetController(controller, isExiting, transition) {\n if (isExiting && transition.targetName !== 'error') {\n controller.set('page', 1);\n }\n }\n });\n ```\n @method resetController\n @param {Controller} controller instance\n @param {Boolean} isExiting\n @param {Object} transition\n @since 1.7.0\n @public\n */\n resetController: K,\n\n exit: function () {\n this.deactivate();\n this.trigger('deactivate');\n this.teardownViews();\n },\n _reset: function (isExiting, transition) {\n var controller = this.controller;\n controller._qpDelegate = (0, _emberMetal.get)(this, '_qp.states.inactive');\n\n this.resetController(controller, isExiting, transition);\n },\n enter: function () {\n this.connections = [];\n this.activate();\n this.trigger('activate');\n },\n\n\n /**\n The name of the template to use by default when rendering this routes\n template.\n ```app/routes/posts/list.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n templateName: 'posts/list'\n });\n ```\n ```app/routes/posts/index.js\n import PostsList from '../posts/list';\n export default PostsList.extend();\n ```\n ```app/routes/posts/archived.js\n import PostsList from '../posts/list';\n export default PostsList.extend();\n ```\n @property templateName\n @type String\n @default null\n @since 1.4.0\n @public\n */\n templateName: null,\n\n /**\n The name of the controller to associate with this route.\n By default, Ember will lookup a route's controller that matches the name\n of the route (i.e. `App.PostController` for `App.PostRoute`). However,\n if you would like to define a specific controller to use, you can do so\n using this property.\n This is useful in many ways, as the controller specified will be:\n * passed to the `setupController` method.\n * used as the controller for the template being rendered by the route.\n * returned from a call to `controllerFor` for the route.\n @property controllerName\n @type String\n @default null\n @since 1.4.0\n @public\n */\n controllerName: null,\n\n /**\n The `willTransition` action is fired at the beginning of any\n attempted transition with a `Transition` object as the sole\n argument. This action can be used for aborting, redirecting,\n or decorating the transition from the currently active routes.\n A good example is preventing navigation when a form is\n half-filled out:\n ```app/routes/contact-form.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n actions: {\n willTransition(transition) {\n if (this.controller.get('userHasEnteredData')) {\n this.controller.displayNavigationConfirm();\n transition.abort();\n }\n }\n }\n });\n ```\n You can also redirect elsewhere by calling\n `this.transitionTo('elsewhere')` from within `willTransition`.\n Note that `willTransition` will not be fired for the\n redirecting `transitionTo`, since `willTransition` doesn't\n fire when there is already a transition underway. If you want\n subsequent `willTransition` actions to fire for the redirecting\n transition, you must first explicitly call\n `transition.abort()`.\n To allow the `willTransition` event to continue bubbling to the parent\n route, use `return true;`. When the `willTransition` method has a\n return value of `true` then the parent route's `willTransition` method\n will be fired, enabling \"bubbling\" behavior for the event.\n @event willTransition\n @param {Transition} transition\n @since 1.0.0\n @public\n */\n\n /**\n The `didTransition` action is fired after a transition has\n successfully been completed. This occurs after the normal model\n hooks (`beforeModel`, `model`, `afterModel`, `setupController`)\n have resolved. The `didTransition` action has no arguments,\n however, it can be useful for tracking page views or resetting\n state on the controller.\n ```app/routes/login.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n actions: {\n didTransition() {\n this.controller.get('errors.base').clear();\n return true; // Bubble the didTransition event\n }\n }\n });\n ```\n @event didTransition\n @since 1.2.0\n @public\n */\n\n /**\n The `loading` action is fired on the route when a route's `model`\n hook returns a promise that is not already resolved. The current\n `Transition` object is the first parameter and the route that\n triggered the loading event is the second parameter.\n ```app/routes/application.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n actions: {\n loading(transition, route) {\n let controller = this.controllerFor('foo');\n controller.set('currentlyLoading', true);\n transition.finally(function() {\n controller.set('currentlyLoading', false);\n });\n }\n }\n });\n ```\n @event loading\n @param {Transition} transition\n @param {Route} route The route that triggered the loading event\n @since 1.2.0\n @public\n */\n\n /**\n When attempting to transition into a route, any of the hooks\n may return a promise that rejects, at which point an `error`\n action will be fired on the partially-entered routes, allowing\n for per-route error handling logic, or shared error handling\n logic defined on a parent route.\n Here is an example of an error handler that will be invoked\n for rejected promises from the various hooks on the route,\n as well as any unhandled errors from child routes:\n ```app/routes/admin.js\n import { reject } from 'rsvp';\n import Route from '@ember/routing/route';\n export default Route.extend({\n beforeModel() {\n return reject('bad things!');\n },\n actions: {\n error(error, transition) {\n // Assuming we got here due to the error in `beforeModel`,\n // we can expect that error === \"bad things!\",\n // but a promise model rejecting would also\n // call this hook, as would any errors encountered\n // in `afterModel`.\n // The `error` hook is also provided the failed\n // `transition`, which can be stored and later\n // `.retry()`d if desired.\n this.transitionTo('login');\n }\n }\n });\n ```\n `error` actions that bubble up all the way to `ApplicationRoute`\n will fire a default error handler that logs the error. You can\n specify your own global default error handler by overriding the\n `error` handler on `ApplicationRoute`:\n ```app/routes/application.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n actions: {\n error(error, transition) {\n this.controllerFor('banner').displayError(error.message);\n }\n }\n });\n ```\n @event error\n @param {Error} error\n @param {Transition} transition\n @since 1.0.0\n @public\n */\n\n /**\n This event is triggered when the router enters the route. It is\n not executed when the model for the route changes.\n ```app/routes/application.js\n import { on } from '@ember/object/evented';\n import Route from '@ember/routing/route';\n export default Route.extend({\n collectAnalytics: on('activate', function(){\n collectAnalytics();\n })\n });\n ```\n @event activate\n @since 1.9.0\n @public\n */\n\n /**\n This event is triggered when the router completely exits this\n route. It is not executed when the model for the route changes.\n ```app/routes/index.js\n import { on } from '@ember/object/evented';\n import Route from '@ember/routing/route';\n export default Route.extend({\n trackPageLeaveAnalytics: on('deactivate', function(){\n trackPageLeaveAnalytics();\n })\n });\n ```\n @event deactivate\n @since 1.9.0\n @public\n */\n\n /**\n The controller associated with this route.\n Example\n ```app/routes/form.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n actions: {\n willTransition(transition) {\n if (this.controller.get('userHasEnteredData') &&\n !confirm('Are you sure you want to abandon progress?')) {\n transition.abort();\n } else {\n // Bubble the `willTransition` action so that\n // parent routes can decide whether or not to abort.\n return true;\n }\n }\n }\n });\n ```\n @property controller\n @type Controller\n @since 1.6.0\n @public\n */\n\n actions: {\n queryParamsDidChange: function (changed, totalPresent, removed) {\n var qpMap = (0, _emberMetal.get)(this, '_qp').map;\n\n var totalChanged = Object.keys(changed).concat(Object.keys(removed));\n for (var i = 0; i < totalChanged.length; ++i) {\n var qp = qpMap[totalChanged[i]];\n if (qp && (0, _emberMetal.get)(this._optionsForQueryParam(qp), 'refreshModel') && this.router.currentState) {\n this.refresh();\n break;\n }\n }\n\n return true;\n },\n finalizeQueryParamChange: function (params, finalParams, transition) {\n if (this.fullRouteName !== 'application') {\n return true;\n }\n\n // Transition object is absent for intermediate transitions.\n if (!transition) {\n return;\n }\n\n var handlerInfos = transition.state.handlerInfos;\n var router = this.router;\n var qpMeta = router._queryParamsFor(handlerInfos);\n var changes = router._qpUpdates;\n var replaceUrl = void 0;\n\n (0, _utils.stashParamNames)(router, handlerInfos);\n\n for (var i = 0; i < qpMeta.qps.length; ++i) {\n var qp = qpMeta.qps[i];\n var route = qp.route;\n var controller = route.controller;\n var presentKey = qp.urlKey in params && qp.urlKey;\n\n // Do a reverse lookup to see if the changed query\n // param URL key corresponds to a QP property on\n // this controller.\n var value = void 0,\n svalue = void 0;\n if (changes && qp.urlKey in changes) {\n // Value updated in/before setupController\n value = (0, _emberMetal.get)(controller, qp.prop);\n svalue = route.serializeQueryParam(value, qp.urlKey, qp.type);\n } else {\n if (presentKey) {\n svalue = params[presentKey];\n\n if (svalue !== undefined) {\n value = route.deserializeQueryParam(svalue, qp.urlKey, qp.type);\n }\n } else {\n // No QP provided; use default value.\n svalue = qp.serializedDefaultValue;\n value = copyDefaultValue(qp.defaultValue);\n }\n }\n\n controller._qpDelegate = (0, _emberMetal.get)(route, '_qp.states.inactive');\n\n var thisQueryParamChanged = svalue !== qp.serializedValue;\n if (thisQueryParamChanged) {\n if (transition.queryParamsOnly && replaceUrl !== false) {\n var options = route._optionsForQueryParam(qp);\n var replaceConfigValue = (0, _emberMetal.get)(options, 'replace');\n if (replaceConfigValue) {\n replaceUrl = true;\n } else if (replaceConfigValue === false) {\n // Explicit pushState wins over any other replaceStates.\n replaceUrl = false;\n }\n }\n\n (0, _emberMetal.set)(controller, qp.prop, value);\n }\n\n // Stash current serialized value of controller.\n qp.serializedValue = svalue;\n\n var thisQueryParamHasDefaultValue = qp.serializedDefaultValue === svalue;\n if (!thisQueryParamHasDefaultValue || transition._keepDefaultQueryParamValues) {\n finalParams.push({\n value: svalue,\n visible: true,\n key: presentKey || qp.urlKey\n });\n }\n }\n\n if (replaceUrl) {\n transition.method('replace');\n }\n\n qpMeta.qps.forEach(function (qp) {\n var routeQpMeta = (0, _emberMetal.get)(qp.route, '_qp');\n var finalizedController = qp.route.controller;\n finalizedController._qpDelegate = (0, _emberMetal.get)(routeQpMeta, 'states.active');\n });\n\n router._qpUpdates = null;\n }\n },\n\n /**\n This hook is executed when the router completely exits this route. It is\n not executed when the model for the route changes.\n @method deactivate\n @since 1.0.0\n @public\n */\n deactivate: K,\n\n /**\n This hook is executed when the router enters the route. It is not executed\n when the model for the route changes.\n @method activate\n @since 1.0.0\n @public\n */\n activate: K,\n\n transitionTo: function (name, context) {\n var _router;\n\n // eslint-disable-line no-unused-vars\n return (_router = this.router).transitionTo.apply(_router, (0, _utils.prefixRouteNameArg)(this, arguments));\n },\n intermediateTransitionTo: function () {\n var _router2;\n\n (_router2 = this.router).intermediateTransitionTo.apply(_router2, (0, _utils.prefixRouteNameArg)(this, arguments));\n },\n refresh: function () {\n return this.router._routerMicrolib.refresh(this);\n },\n replaceWith: function () {\n var _router3;\n\n return (_router3 = this.router).replaceWith.apply(_router3, (0, _utils.prefixRouteNameArg)(this, arguments));\n },\n send: function () {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n if (this.router && this.router._routerMicrolib || !(0, _emberDebug.isTesting)()) {\n var _router4;\n\n (_router4 = this.router).send.apply(_router4, args);\n } else {\n var name = args.shift();\n var action = this.actions[name];\n if (action) {\n return action.apply(this, args);\n }\n }\n },\n setup: function (context, transition) {\n var controller = void 0;\n\n var controllerName = this.controllerName || this.routeName;\n var definedController = this.controllerFor(controllerName, true);\n\n if (definedController) {\n controller = definedController;\n } else {\n controller = this.generateController(controllerName);\n }\n\n // Assign the route's controller so that it can more easily be\n // referenced in action handlers. Side effects. Side effects everywhere.\n if (!this.controller) {\n var propNames = (0, _emberMetal.get)(this, '_qp.propertyNames');\n addQueryParamsObservers(controller, propNames);\n this.controller = controller;\n }\n\n var queryParams = (0, _emberMetal.get)(this, '_qp');\n\n var states = queryParams.states;\n\n controller._qpDelegate = states.allowOverrides;\n\n if (transition) {\n // Update the model dep values used to calculate cache keys.\n (0, _utils.stashParamNames)(this.router, transition.state.handlerInfos);\n\n var cache = this._bucketCache;\n var params = transition.params;\n var allParams = queryParams.propertyNames;\n\n allParams.forEach(function (prop) {\n var aQp = queryParams.map[prop];\n aQp.values = params;\n\n var cacheKey = (0, _utils.calculateCacheKey)(aQp.route.fullRouteName, aQp.parts, aQp.values);\n var value = cache.lookup(cacheKey, prop, aQp.undecoratedDefaultValue);\n (0, _emberMetal.set)(controller, prop, value);\n });\n\n var qpValues = getQueryParamsFor(this, transition.state);\n (0, _emberMetal.setProperties)(controller, qpValues);\n }\n\n this.setupController(controller, context, transition);\n\n if (this._environment.options.shouldRender) {\n this.renderTemplate(controller, context);\n }\n },\n _qpChanged: function (prop, value, qp) {\n if (!qp) {\n return;\n }\n\n // Update model-dep cache\n var cache = this._bucketCache;\n var cacheKey = (0, _utils.calculateCacheKey)(qp.route.fullRouteName, qp.parts, qp.values);\n cache.stash(cacheKey, prop, value);\n },\n\n\n /**\n This hook is the first of the route entry validation hooks\n called when an attempt is made to transition into a route\n or one of its children. It is called before `model` and\n `afterModel`, and is appropriate for cases when:\n 1) A decision can be made to redirect elsewhere without\n needing to resolve the model first.\n 2) Any async operations need to occur first before the\n model is attempted to be resolved.\n This hook is provided the current `transition` attempt\n as a parameter, which can be used to `.abort()` the transition,\n save it for a later `.retry()`, or retrieve values set\n on it from a previous hook. You can also just call\n `this.transitionTo` to another route to implicitly\n abort the `transition`.\n You can return a promise from this hook to pause the\n transition until the promise resolves (or rejects). This could\n be useful, for instance, for retrieving async code from\n the server that is required to enter a route.\n @method beforeModel\n @param {Transition} transition\n @return {any | Promise<any>} if the value returned from this hook is\n a promise, the transition will pause until the transition\n resolves. Otherwise, non-promise return values are not\n utilized in any way.\n @since 1.0.0\n @public\n */\n beforeModel: K,\n\n /**\n This hook is called after this route's model has resolved.\n It follows identical async/promise semantics to `beforeModel`\n but is provided the route's resolved model in addition to\n the `transition`, and is therefore suited to performing\n logic that can only take place after the model has already\n resolved.\n ```app/routes/posts.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n afterModel(posts, transition) {\n if (posts.get('length') === 1) {\n this.transitionTo('post.show', posts.get('firstObject'));\n }\n }\n });\n ```\n Refer to documentation for `beforeModel` for a description\n of transition-pausing semantics when a promise is returned\n from this hook.\n @method afterModel\n @param {Object} resolvedModel the value returned from `model`,\n or its resolved value if it was a promise\n @param {Transition} transition\n @return {any | Promise<any>} if the value returned from this hook is\n a promise, the transition will pause until the transition\n resolves. Otherwise, non-promise return values are not\n utilized in any way.\n @since 1.0.0\n @public\n */\n afterModel: K,\n\n /**\n A hook you can implement to optionally redirect to another route.\n If you call `this.transitionTo` from inside of this hook, this route\n will not be entered in favor of the other hook.\n `redirect` and `afterModel` behave very similarly and are\n called almost at the same time, but they have an important\n distinction in the case that, from one of these hooks, a\n redirect into a child route of this route occurs: redirects\n from `afterModel` essentially invalidate the current attempt\n to enter this route, and will result in this route's `beforeModel`,\n `model`, and `afterModel` hooks being fired again within\n the new, redirecting transition. Redirects that occur within\n the `redirect` hook, on the other hand, will _not_ cause\n these hooks to be fired again the second time around; in\n other words, by the time the `redirect` hook has been called,\n both the resolved model and attempted entry into this route\n are considered to be fully validated.\n @method redirect\n @param {Object} model the model for this route\n @param {Transition} transition the transition object associated with the current transition\n @since 1.0.0\n @public\n */\n redirect: K,\n\n contextDidChange: function () {\n this.currentModel = this.context;\n },\n model: function (params, transition) {\n var name = void 0,\n sawParams = void 0,\n value = void 0;\n var queryParams = (0, _emberMetal.get)(this, '_qp.map');\n\n for (var prop in params) {\n if (prop === 'queryParams' || queryParams && prop in queryParams) {\n continue;\n }\n\n var match = prop.match(/^(.*)_id$/);\n if (match !== null) {\n name = match[1];\n value = params[prop];\n }\n sawParams = true;\n }\n\n if (!name) {\n if (sawParams) {\n return (0, _emberRuntime.copy)(params);\n } else {\n if (transition.resolveIndex < 1) {\n return;\n }\n return transition.state.handlerInfos[transition.resolveIndex - 1].context;\n }\n }\n\n return this.findModel(name, value);\n },\n deserialize: function (params, transition) {\n return this.model(this.paramsFor(this.routeName), transition);\n },\n findModel: function () {\n var _get;\n\n return (_get = (0, _emberMetal.get)(this, 'store')).find.apply(_get, arguments);\n },\n\n\n /**\n Store property provides a hook for data persistence libraries to inject themselves.\n By default, this store property provides the exact same functionality previously\n in the model hook.\n Currently, the required interface is:\n `store.find(modelName, findArguments)`\n @method store\n @param {Object} store\n @private\n */\n store: (0, _emberMetal.computed)(function () {\n var owner = (0, _emberUtils.getOwner)(this);\n var routeName = this.routeName;\n var namespace = (0, _emberMetal.get)(this, 'router.namespace');\n\n return {\n find: function (name, value) {\n var modelClass = owner.factoryFor('model:' + name);\n\n (true && !(!!modelClass) && (0, _emberDebug.assert)('You used the dynamic segment ' + name + '_id in your route ' + routeName + ', but ' + namespace + '.' + _emberRuntime.String.classify(name) + ' did not exist and you did not override your route\\'s `model` hook.', !!modelClass));\n\n\n if (!modelClass) {\n return;\n }\n\n modelClass = modelClass.class;\n\n (true && !(typeof modelClass.find === 'function') && (0, _emberDebug.assert)(_emberRuntime.String.classify(name) + ' has no method `find`.', typeof modelClass.find === 'function'));\n\n\n return modelClass.find(value);\n }\n };\n }),\n\n /**\n A hook you can implement to convert the route's model into parameters\n for the URL.\n ```app/router.js\n // ...\n Router.map(function() {\n this.route('post', { path: '/posts/:post_id' });\n });\n ```\n ```app/routes/post.js\n import $ from 'jquery';\n import Route from '@ember/routing/route';\n export default Route.extend({\n model(params) {\n // the server returns `{ id: 12 }`\n return $.getJSON('/posts/' + params.post_id);\n },\n serialize(model) {\n // this will make the URL `/posts/12`\n return { post_id: model.id };\n }\n });\n ```\n The default `serialize` method will insert the model's `id` into the\n route's dynamic segment (in this case, `:post_id`) if the segment contains '_id'.\n If the route has multiple dynamic segments or does not contain '_id', `serialize`\n will return `getProperties(model, params)`\n This method is called when `transitionTo` is called with a context\n in order to populate the URL.\n @method serialize\n @param {Object} model the routes model\n @param {Array} params an Array of parameter names for the current\n route (in the example, `['post_id']`.\n @return {Object} the serialized parameters\n @since 1.0.0\n @public\n */\n serialize: defaultSerialize,\n\n setupController: function (controller, context, transition) {\n // eslint-disable-line no-unused-vars\n if (controller && context !== undefined) {\n (0, _emberMetal.set)(controller, 'model', context);\n }\n },\n controllerFor: function (name, _skipAssert) {\n var owner = (0, _emberUtils.getOwner)(this);\n var route = owner.lookup('route:' + name);\n var controller = void 0;\n\n if (route && route.controllerName) {\n name = route.controllerName;\n }\n\n controller = owner.lookup('controller:' + name);\n\n // NOTE: We're specifically checking that skipAssert is true, because according\n // to the old API the second parameter was model. We do not want people who\n // passed a model to skip the assertion.\n (true && !(controller || _skipAssert === true) && (0, _emberDebug.assert)('The controller named \\'' + name + '\\' could not be found. Make sure that this route exists and has already been entered at least once. If you are accessing a controller not associated with a route, make sure the controller class is explicitly defined.', controller || _skipAssert === true));\n\n\n return controller;\n },\n generateController: function (name) {\n var owner = (0, _emberUtils.getOwner)(this);\n\n return (0, _generate_controller.default)(owner, name);\n },\n modelFor: function (_name) {\n var name = void 0;\n var owner = (0, _emberUtils.getOwner)(this);\n var transition = this.router ? this.router._routerMicrolib.activeTransition : null;\n\n // Only change the route name when there is an active transition.\n // Otherwise, use the passed in route name.\n if (owner.routable && transition !== null) {\n name = getEngineRouteName(owner, _name);\n } else {\n name = _name;\n }\n\n var route = owner.lookup('route:' + name);\n // If we are mid-transition, we want to try and look up\n // resolved parent contexts on the current transitionEvent.\n if (transition !== null) {\n var modelLookupName = route && route.routeName || name;\n if (transition.resolvedModels.hasOwnProperty(modelLookupName)) {\n return transition.resolvedModels[modelLookupName];\n }\n }\n\n return route && route.currentModel;\n },\n renderTemplate: function (controller, model) {\n // eslint-disable-line no-unused-vars\n this.render();\n },\n render: function (_name, options) {\n var name = void 0;\n var isDefaultRender = arguments.length === 0;\n if (!isDefaultRender) {\n if (typeof _name === 'object' && !options) {\n name = this.templateName || this.routeName;\n options = _name;\n } else {\n (true && !(!(0, _emberMetal.isEmpty)(_name)) && (0, _emberDebug.assert)('The name in the given arguments is undefined or empty string', !(0, _emberMetal.isEmpty)(_name)));\n\n name = _name;\n }\n }\n\n var renderOptions = buildRenderOptions(this, isDefaultRender, name, options);\n this.connections.push(renderOptions);\n _emberMetal.run.once(this.router, '_setOutlets');\n },\n disconnectOutlet: function (options) {\n var outletName = void 0;\n var parentView = void 0;\n if (options) {\n if (typeof options === 'string') {\n outletName = options;\n } else {\n outletName = options.outlet;\n parentView = options.parentView ? options.parentView.replace(/\\//g, '.') : undefined;\n\n (true && !(!('outlet' in options && options.outlet === undefined)) && (0, _emberDebug.assert)('You passed undefined as the outlet name.', !('outlet' in options && options.outlet === undefined)));\n }\n }\n\n outletName = outletName || 'main';\n this._disconnectOutlet(outletName, parentView);\n var handlerInfos = this.router._routerMicrolib.currentHandlerInfos;\n for (var i = 0; i < handlerInfos.length; i++) {\n // This non-local state munging is sadly necessary to maintain\n // backward compatibility with our existing semantics, which allow\n // any route to disconnectOutlet things originally rendered by any\n // other route. This should all get cut in 2.0.\n handlerInfos[i].handler._disconnectOutlet(outletName, parentView);\n }\n },\n _disconnectOutlet: function (outletName, parentView) {\n var parent = parentRoute(this);\n if (parent && parentView === parent.routeName) {\n parentView = undefined;\n }\n for (var i = 0; i < this.connections.length; i++) {\n var connection = this.connections[i];\n if (connection.outlet === outletName && connection.into === parentView) {\n // This neuters the disconnected outlet such that it doesn't\n // render anything, but it leaves an entry in the outlet\n // hierarchy so that any existing other renders that target it\n // don't suddenly blow up. They will still stick themselves\n // into its outlets, which won't render anywhere. All of this\n // statefulness should get the machete in 2.0.\n this.connections[i] = {\n owner: connection.owner,\n into: connection.into,\n outlet: connection.outlet,\n name: connection.name,\n controller: undefined,\n template: undefined\n };\n _emberMetal.run.once(this.router, '_setOutlets');\n }\n }\n },\n willDestroy: function () {\n this.teardownViews();\n },\n teardownViews: function () {\n if (this.connections && this.connections.length > 0) {\n this.connections = [];\n _emberMetal.run.once(this.router, '_setOutlets');\n }\n }\n });\n\n Route.reopenClass({\n isRouteFactory: true\n });\n\n function parentRoute(route) {\n var handlerInfo = handlerInfoFor(route, route.router._routerMicrolib.state.handlerInfos, -1);\n return handlerInfo && handlerInfo.handler;\n }\n\n function handlerInfoFor(route, handlerInfos) {\n var offset = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;\n\n if (!handlerInfos) {\n return;\n }\n\n var current = void 0;\n for (var i = 0; i < handlerInfos.length; i++) {\n current = handlerInfos[i].handler;\n if (current === route) {\n return handlerInfos[i + offset];\n }\n }\n }\n\n function buildRenderOptions(route, isDefaultRender, _name, options) {\n (true && !(isDefaultRender || !(options && 'outlet' in options && options.outlet === undefined)) && (0, _emberDebug.assert)('You passed undefined as the outlet name.', isDefaultRender || !(options && 'outlet' in options && options.outlet === undefined)));\n\n\n var owner = (0, _emberUtils.getOwner)(route);\n var name = void 0,\n templateName = void 0,\n into = void 0,\n outlet = void 0,\n controller = void 0,\n model = void 0;\n if (options) {\n into = options.into && options.into.replace(/\\//g, '.');\n outlet = options.outlet;\n controller = options.controller;\n model = options.model;\n }\n outlet = outlet || 'main';\n\n if (isDefaultRender) {\n name = route.routeName;\n templateName = route.templateName || name;\n } else {\n name = _name.replace(/\\//g, '.');\n templateName = name;\n }\n\n if (!controller) {\n if (isDefaultRender) {\n controller = route.controllerName || owner.lookup('controller:' + name);\n } else {\n controller = owner.lookup('controller:' + name) || route.controllerName || route.routeName;\n }\n }\n\n if (typeof controller === 'string') {\n var controllerName = controller;\n controller = owner.lookup('controller:' + controllerName);\n (true && !(isDefaultRender || controller) && (0, _emberDebug.assert)('You passed `controller: \\'' + controllerName + '\\'` into the `render` method, but no such controller could be found.', isDefaultRender || controller));\n }\n\n if (model) {\n controller.set('model', model);\n }\n\n var template = owner.lookup('template:' + templateName);\n (true && !(isDefaultRender || template) && (0, _emberDebug.assert)('Could not find \"' + templateName + '\" template, view, or component.', isDefaultRender || template));\n\n\n var parent = void 0;\n if (into && (parent = parentRoute(route)) && into === parent.routeName) {\n into = undefined;\n }\n\n var renderOptions = {\n owner: owner,\n into: into,\n outlet: outlet,\n name: name,\n controller: controller,\n template: template || route._topLevelViewTemplate\n };\n\n if (true) {\n var LOG_VIEW_LOOKUPS = (0, _emberMetal.get)(route.router, 'namespace.LOG_VIEW_LOOKUPS');\n if (LOG_VIEW_LOOKUPS && !template) {\n (0, _emberDebug.info)('Could not find \"' + name + '\" template. Nothing will be rendered', { fullName: 'template:' + name });\n }\n }\n\n return renderOptions;\n }\n\n function getFullQueryParams(router, state) {\n if (state.fullQueryParams) {\n return state.fullQueryParams;\n }\n\n state.fullQueryParams = {};\n (0, _emberUtils.assign)(state.fullQueryParams, state.queryParams);\n\n router._deserializeQueryParams(state.handlerInfos, state.fullQueryParams);\n return state.fullQueryParams;\n }\n\n function getQueryParamsFor(route, state) {\n state.queryParamsFor = state.queryParamsFor || {};\n var name = route.fullRouteName;\n\n if (state.queryParamsFor[name]) {\n return state.queryParamsFor[name];\n }\n\n var fullQueryParams = getFullQueryParams(route.router, state);\n\n var params = state.queryParamsFor[name] = {};\n\n // Copy over all the query params for this route/controller into params hash.\n var qpMeta = (0, _emberMetal.get)(route, '_qp');\n var qps = qpMeta.qps;\n for (var i = 0; i < qps.length; ++i) {\n // Put deserialized qp on params hash.\n var qp = qps[i];\n\n var qpValueWasPassedIn = qp.prop in fullQueryParams;\n params[qp.prop] = qpValueWasPassedIn ? fullQueryParams[qp.prop] : copyDefaultValue(qp.defaultValue);\n }\n\n return params;\n }\n\n function copyDefaultValue(value) {\n if (Array.isArray(value)) {\n return (0, _emberRuntime.A)(value.slice());\n }\n return value;\n }\n\n /*\n Merges all query parameters from a controller with those from\n a route, returning a new object and avoiding any mutations to\n the existing objects.\n */\n function mergeEachQueryParams(controllerQP, routeQP) {\n var qps = {};\n var keysAlreadyMergedOrSkippable = {\n defaultValue: true,\n type: true,\n scope: true,\n as: true\n };\n\n // first loop over all controller qps, merging them with any matching route qps\n // into a new empty object to avoid mutating.\n for (var cqpName in controllerQP) {\n if (!controllerQP.hasOwnProperty(cqpName)) {\n continue;\n }\n\n var newControllerParameterConfiguration = {};\n (0, _emberUtils.assign)(newControllerParameterConfiguration, controllerQP[cqpName], routeQP[cqpName]);\n\n qps[cqpName] = newControllerParameterConfiguration;\n\n // allows us to skip this QP when we check route QPs.\n keysAlreadyMergedOrSkippable[cqpName] = true;\n }\n\n // loop over all route qps, skipping those that were merged in the first pass\n // because they also appear in controller qps\n for (var rqpName in routeQP) {\n if (!routeQP.hasOwnProperty(rqpName) || keysAlreadyMergedOrSkippable[rqpName]) {\n continue;\n }\n\n var newRouteParameterConfiguration = {};\n (0, _emberUtils.assign)(newRouteParameterConfiguration, routeQP[rqpName], controllerQP[rqpName]);\n qps[rqpName] = newRouteParameterConfiguration;\n }\n\n return qps;\n }\n\n function addQueryParamsObservers(controller, propNames) {\n propNames.forEach(function (prop) {\n controller.addObserver(prop + '.[]', controller, controller._qpChanged);\n });\n }\n\n function getEngineRouteName(engine, routeName) {\n if (engine.routable) {\n var prefix = engine.mountPoint;\n\n if (routeName === 'application') {\n return prefix;\n } else {\n return prefix + '.' + routeName;\n }\n }\n\n return routeName;\n }\n\n exports.default = Route;\n});","enifed('ember-routing/system/router', ['exports', 'ember-utils', 'ember-console', 'ember-metal', 'ember-debug', 'ember-runtime', 'ember-routing/system/route', 'ember-routing/system/dsl', 'ember-routing/location/api', 'ember-routing/utils', 'ember-routing/system/router_state', 'router'], function (exports, _emberUtils, _emberConsole, _emberMetal, _emberDebug, _emberRuntime, _route, _dsl, _api, _utils, _router_state, _router) {\n 'use strict';\n\n exports.triggerEvent = triggerEvent;\n\n\n function K() {\n return this;\n }\n\n /**\n @module @ember/routing\n */\n\n var slice = Array.prototype.slice;\n\n\n /**\n The `EmberRouter` class manages the application state and URLs. Refer to\n the [routing guide](https://emberjs.com/guides/routing/) for documentation.\n \n @class EmberRouter\n @extends EmberObject\n @uses Evented\n @public\n */\n var EmberRouter = _emberRuntime.Object.extend(_emberRuntime.Evented, {\n /**\n The `location` property determines the type of URL's that your\n application will use.\n The following location types are currently available:\n * `history` - use the browser's history API to make the URLs look just like any standard URL\n * `hash` - use `#` to separate the server part of the URL from the Ember part: `/blog/#/posts/new`\n * `none` - do not store the Ember URL in the actual browser URL (mainly used for testing)\n * `auto` - use the best option based on browser capabilities: `history` if possible, then `hash` if possible, otherwise `none`\n This value is defaulted to `auto` by the `locationType` setting of `/config/environment.js`\n @property location\n @default 'hash'\n @see {Location}\n @public\n */\n location: 'hash',\n\n /**\n Represents the URL of the root of the application, often '/'. This prefix is\n assumed on all routes defined on this router.\n @property rootURL\n @default '/'\n @public\n */\n rootURL: '/',\n\n _initRouterJs: function () {\n var routerMicrolib = this._routerMicrolib = new _router.default();\n routerMicrolib.triggerEvent = triggerEvent.bind(this);\n\n routerMicrolib._triggerWillChangeContext = K;\n routerMicrolib._triggerWillLeave = K;\n\n var dslCallbacks = this.constructor.dslCallbacks || [K];\n var dsl = this._buildDSL();\n\n dsl.route('application', { path: '/', resetNamespace: true, overrideNameAssertion: true }, function () {\n for (var i = 0; i < dslCallbacks.length; i++) {\n dslCallbacks[i].call(this);\n }\n });\n\n if (true) {\n if ((0, _emberMetal.get)(this, 'namespace.LOG_TRANSITIONS_INTERNAL')) {\n routerMicrolib.log = _emberConsole.default.debug;\n }\n }\n\n routerMicrolib.map(dsl.generate());\n },\n _buildDSL: function () {\n var enableLoadingSubstates = this._hasModuleBasedResolver();\n var options = { enableLoadingSubstates: enableLoadingSubstates };\n\n var owner = (0, _emberUtils.getOwner)(this);\n var router = this;\n\n options.resolveRouteMap = function (name) {\n return owner.factoryFor('route-map:' + name);\n };\n\n options.addRouteForEngine = function (name, engineInfo) {\n if (!router._engineInfoByRoute[name]) {\n router._engineInfoByRoute[name] = engineInfo;\n }\n };\n\n return new _dsl.default(null, options);\n },\n init: function () {\n this._super.apply(this, arguments);\n\n this.currentURL = null;\n this.currentRouteName = null;\n this.currentPath = null;\n\n this._qpCache = Object.create(null);\n this._resetQueuedQueryParameterChanges();\n this._handledErrors = new Set();\n this._engineInstances = Object.create(null);\n this._engineInfoByRoute = Object.create(null);\n },\n _resetQueuedQueryParameterChanges: function () {\n this._queuedQPChanges = {};\n },\n\n\n /**\n Represents the current URL.\n @method url\n @return {String} The current URL.\n @private\n */\n url: (0, _emberMetal.computed)(function () {\n return (0, _emberMetal.get)(this, 'location').getURL();\n }),\n\n _hasModuleBasedResolver: function () {\n var owner = (0, _emberUtils.getOwner)(this);\n if (!owner) {\n return false;\n }\n\n var resolver = (0, _emberMetal.get)(owner, 'application.__registry__.resolver.moduleBasedResolver');\n return !!resolver;\n },\n startRouting: function () {\n var initialURL = (0, _emberMetal.get)(this, 'initialURL');\n\n if (this.setupRouter()) {\n if (initialURL === undefined) {\n initialURL = (0, _emberMetal.get)(this, 'location').getURL();\n }\n var initialTransition = this.handleURL(initialURL);\n if (initialTransition && initialTransition.error) {\n throw initialTransition.error;\n }\n }\n },\n setupRouter: function () {\n var _this = this;\n\n this._initRouterJs();\n this._setupLocation();\n\n var location = (0, _emberMetal.get)(this, 'location');\n\n // Allow the Location class to cancel the router setup while it refreshes\n // the page\n if ((0, _emberMetal.get)(location, 'cancelRouterSetup')) {\n return false;\n }\n\n this._setupRouter(location);\n\n location.onUpdateURL(function (url) {\n _this.handleURL(url);\n });\n\n return true;\n },\n didTransition: function (infos) {\n updatePaths(this);\n\n this._cancelSlowTransitionTimer();\n\n this.notifyPropertyChange('url');\n this.set('currentState', this.targetState);\n\n // Put this in the runloop so url will be accurate. Seems\n // less surprising than didTransition being out of sync.\n _emberMetal.run.once(this, this.trigger, 'didTransition');\n\n if (true) {\n if ((0, _emberMetal.get)(this, 'namespace').LOG_TRANSITIONS) {\n _emberConsole.default.log('Transitioned into \\'' + EmberRouter._routePath(infos) + '\\'');\n }\n }\n },\n _setOutlets: function () {\n // This is triggered async during Route#willDestroy.\n // If the router is also being destroyed we do not want to\n // to create another this._toplevelView (and leak the renderer)\n if (this.isDestroying || this.isDestroyed) {\n return;\n }\n\n var handlerInfos = this._routerMicrolib.currentHandlerInfos;\n var route = void 0;\n var defaultParentState = void 0;\n var liveRoutes = null;\n\n if (!handlerInfos) {\n return;\n }\n\n for (var i = 0; i < handlerInfos.length; i++) {\n route = handlerInfos[i].handler;\n var connections = route.connections;\n var ownState = void 0;\n for (var j = 0; j < connections.length; j++) {\n var appended = appendLiveRoute(liveRoutes, defaultParentState, connections[j]);\n liveRoutes = appended.liveRoutes;\n if (appended.ownState.render.name === route.routeName || appended.ownState.render.outlet === 'main') {\n ownState = appended.ownState;\n }\n }\n if (connections.length === 0) {\n ownState = representEmptyRoute(liveRoutes, defaultParentState, route);\n }\n defaultParentState = ownState;\n }\n\n // when a transitionTo happens after the validation phase\n // during the initial transition _setOutlets is called\n // when no routes are active. However, it will get called\n // again with the correct values during the next turn of\n // the runloop\n if (!liveRoutes) {\n return;\n }\n\n if (!this._toplevelView) {\n var owner = (0, _emberUtils.getOwner)(this);\n var OutletView = owner.factoryFor('view:-outlet');\n this._toplevelView = OutletView.create();\n this._toplevelView.setOutletState(liveRoutes);\n var instance = owner.lookup('-application-instance:main');\n instance.didCreateRootView(this._toplevelView);\n } else {\n this._toplevelView.setOutletState(liveRoutes);\n }\n },\n willTransition: function (oldInfos, newInfos, transition) {\n _emberMetal.run.once(this, this.trigger, 'willTransition', transition);\n\n if (true) {\n if ((0, _emberMetal.get)(this, 'namespace').LOG_TRANSITIONS) {\n _emberConsole.default.log('Preparing to transition from \\'' + EmberRouter._routePath(oldInfos) + '\\' to \\'' + EmberRouter._routePath(newInfos) + '\\'');\n }\n }\n },\n handleURL: function (url) {\n // Until we have an ember-idiomatic way of accessing #hashes, we need to\n // remove it because router.js doesn't know how to handle it.\n var _url = url.split(/#(.+)?/)[0];\n return this._doURLTransition('handleURL', _url);\n },\n _doURLTransition: function (routerJsMethod, url) {\n var transition = this._routerMicrolib[routerJsMethod](url || '/');\n didBeginTransition(transition, this);\n return transition;\n },\n transitionTo: function () {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n if ((0, _utils.resemblesURL)(args[0])) {\n return this._doURLTransition('transitionTo', args[0]);\n }\n\n var _extractRouteArgs = (0, _utils.extractRouteArgs)(args),\n routeName = _extractRouteArgs.routeName,\n models = _extractRouteArgs.models,\n queryParams = _extractRouteArgs.queryParams;\n\n return this._doTransition(routeName, models, queryParams);\n },\n intermediateTransitionTo: function () {\n var _routerMicrolib;\n\n (_routerMicrolib = this._routerMicrolib).intermediateTransitionTo.apply(_routerMicrolib, arguments);\n\n updatePaths(this);\n\n if (true) {\n var infos = this._routerMicrolib.currentHandlerInfos;\n if ((0, _emberMetal.get)(this, 'namespace').LOG_TRANSITIONS) {\n _emberConsole.default.log('Intermediate-transitioned into \\'' + EmberRouter._routePath(infos) + '\\'');\n }\n }\n },\n replaceWith: function () {\n return this.transitionTo.apply(this, arguments).method('replace');\n },\n generate: function () {\n var _routerMicrolib2;\n\n var url = (_routerMicrolib2 = this._routerMicrolib).generate.apply(_routerMicrolib2, arguments);\n return this.location.formatURL(url);\n },\n isActive: function () {\n var _routerMicrolib3;\n\n return (_routerMicrolib3 = this._routerMicrolib).isActive.apply(_routerMicrolib3, arguments);\n },\n isActiveIntent: function (routeName, models, queryParams) {\n return this.currentState.isActiveIntent(routeName, models, queryParams);\n },\n send: function () {\n var _routerMicrolib4;\n\n /*name, context*/\n (_routerMicrolib4 = this._routerMicrolib).trigger.apply(_routerMicrolib4, arguments);\n },\n hasRoute: function (route) {\n return this._routerMicrolib.hasRoute(route);\n },\n reset: function () {\n if (this._routerMicrolib) {\n this._routerMicrolib.reset();\n }\n },\n willDestroy: function () {\n if (this._toplevelView) {\n this._toplevelView.destroy();\n this._toplevelView = null;\n }\n\n this._super.apply(this, arguments);\n\n this.reset();\n\n var instances = this._engineInstances;\n for (var name in instances) {\n for (var id in instances[name]) {\n (0, _emberMetal.run)(instances[name][id], 'destroy');\n }\n }\n },\n _activeQPChanged: function (queryParameterName, newValue) {\n this._queuedQPChanges[queryParameterName] = newValue;\n _emberMetal.run.once(this, this._fireQueryParamTransition);\n },\n _updatingQPChanged: function (queryParameterName) {\n if (!this._qpUpdates) {\n this._qpUpdates = {};\n }\n this._qpUpdates[queryParameterName] = true;\n },\n _fireQueryParamTransition: function () {\n this.transitionTo({ queryParams: this._queuedQPChanges });\n this._resetQueuedQueryParameterChanges();\n },\n _setupLocation: function () {\n var location = (0, _emberMetal.get)(this, 'location');\n var rootURL = (0, _emberMetal.get)(this, 'rootURL');\n var owner = (0, _emberUtils.getOwner)(this);\n\n if ('string' === typeof location && owner) {\n var resolvedLocation = owner.lookup('location:' + location);\n\n if (resolvedLocation !== undefined) {\n location = (0, _emberMetal.set)(this, 'location', resolvedLocation);\n } else {\n // Allow for deprecated registration of custom location API's\n var options = {\n implementation: location\n };\n\n location = (0, _emberMetal.set)(this, 'location', _api.default.create(options));\n }\n }\n\n if (location !== null && typeof location === 'object') {\n if (rootURL) {\n (0, _emberMetal.set)(location, 'rootURL', rootURL);\n }\n\n // Allow the location to do any feature detection, such as AutoLocation\n // detecting history support. This gives it a chance to set its\n // `cancelRouterSetup` property which aborts routing.\n if (typeof location.detect === 'function') {\n location.detect();\n }\n\n // ensure that initState is called AFTER the rootURL is set on\n // the location instance\n if (typeof location.initState === 'function') {\n location.initState();\n }\n }\n },\n _getHandlerFunction: function () {\n var _this2 = this;\n\n var seen = Object.create(null);\n var owner = (0, _emberUtils.getOwner)(this);\n\n return function (name) {\n var routeName = name;\n var routeOwner = owner;\n var engineInfo = _this2._engineInfoByRoute[routeName];\n\n if (engineInfo) {\n var engineInstance = _this2._getEngineInstance(engineInfo);\n\n routeOwner = engineInstance;\n routeName = engineInfo.localFullName;\n }\n\n var fullRouteName = 'route:' + routeName;\n\n var handler = routeOwner.lookup(fullRouteName);\n\n if (seen[name]) {\n return handler;\n }\n\n seen[name] = true;\n\n if (!handler) {\n var DefaultRoute = routeOwner.factoryFor('route:basic').class;\n routeOwner.register(fullRouteName, DefaultRoute.extend());\n handler = routeOwner.lookup(fullRouteName);\n\n if (true) {\n if ((0, _emberMetal.get)(_this2, 'namespace.LOG_ACTIVE_GENERATION')) {\n (0, _emberDebug.info)('generated -> ' + fullRouteName, { fullName: fullRouteName });\n }\n }\n }\n\n handler._setRouteName(routeName);\n\n if (engineInfo && !(0, _route.hasDefaultSerialize)(handler)) {\n throw new Error('Defining a custom serialize method on an Engine route is not supported.');\n }\n\n return handler;\n };\n },\n _getSerializerFunction: function () {\n var _this3 = this;\n\n return function (name) {\n var engineInfo = _this3._engineInfoByRoute[name];\n\n // If this is not an Engine route, we fall back to the handler for serialization\n if (!engineInfo) {\n return;\n }\n\n return engineInfo.serializeMethod || _route.defaultSerialize;\n };\n },\n _setupRouter: function (location) {\n var _this4 = this;\n\n var lastURL = void 0;\n var routerMicrolib = this._routerMicrolib;\n\n routerMicrolib.getHandler = this._getHandlerFunction();\n routerMicrolib.getSerializer = this._getSerializerFunction();\n\n var doUpdateURL = function () {\n location.setURL(lastURL);\n (0, _emberMetal.set)(_this4, 'currentURL', lastURL);\n };\n\n routerMicrolib.updateURL = function (path) {\n lastURL = path;\n _emberMetal.run.once(doUpdateURL);\n };\n\n if (location.replaceURL) {\n var doReplaceURL = function () {\n location.replaceURL(lastURL);\n (0, _emberMetal.set)(_this4, 'currentURL', lastURL);\n };\n\n routerMicrolib.replaceURL = function (path) {\n lastURL = path;\n _emberMetal.run.once(doReplaceURL);\n };\n }\n\n routerMicrolib.didTransition = function (infos) {\n _this4.didTransition(infos);\n };\n\n routerMicrolib.willTransition = function (oldInfos, newInfos, transition) {\n _this4.willTransition(oldInfos, newInfos, transition);\n };\n },\n _serializeQueryParams: function (handlerInfos, queryParams) {\n var _this5 = this;\n\n forEachQueryParam(this, handlerInfos, queryParams, function (key, value, qp) {\n if (qp) {\n delete queryParams[key];\n queryParams[qp.urlKey] = qp.route.serializeQueryParam(value, qp.urlKey, qp.type);\n } else if (value === undefined) {\n return; // We don't serialize undefined values\n } else {\n queryParams[key] = _this5._serializeQueryParam(value, (0, _emberRuntime.typeOf)(value));\n }\n });\n },\n _serializeQueryParam: function (value, type) {\n if (value === null || value === undefined) {\n return value;\n } else if (type === 'array') {\n return JSON.stringify(value);\n }\n\n return '' + value;\n },\n _deserializeQueryParams: function (handlerInfos, queryParams) {\n forEachQueryParam(this, handlerInfos, queryParams, function (key, value, qp) {\n // If we don't have QP meta info for a given key, then we do nothing\n // because all values will be treated as strings\n if (qp) {\n delete queryParams[key];\n queryParams[qp.prop] = qp.route.deserializeQueryParam(value, qp.urlKey, qp.type);\n }\n });\n },\n _deserializeQueryParam: function (value, defaultType) {\n if (value === null || value === undefined) {\n return value;\n } else if (defaultType === 'boolean') {\n return value === 'true';\n } else if (defaultType === 'number') {\n return Number(value).valueOf();\n } else if (defaultType === 'array') {\n return (0, _emberRuntime.A)(JSON.parse(value));\n }\n return value;\n },\n _pruneDefaultQueryParamValues: function (handlerInfos, queryParams) {\n var qps = this._queryParamsFor(handlerInfos);\n for (var key in queryParams) {\n var qp = qps.map[key];\n if (qp && qp.serializedDefaultValue === queryParams[key]) {\n delete queryParams[key];\n }\n }\n },\n _doTransition: function (_targetRouteName, models, _queryParams, _keepDefaultQueryParamValues) {\n var _routerMicrolib5;\n\n var targetRouteName = _targetRouteName || (0, _utils.getActiveTargetName)(this._routerMicrolib);\n (true && !(targetRouteName && this._routerMicrolib.hasRoute(targetRouteName)) && (0, _emberDebug.assert)('The route ' + targetRouteName + ' was not found', targetRouteName && this._routerMicrolib.hasRoute(targetRouteName)));\n\n\n var queryParams = {};\n\n this._processActiveTransitionQueryParams(targetRouteName, models, queryParams, _queryParams);\n\n (0, _emberUtils.assign)(queryParams, _queryParams);\n this._prepareQueryParams(targetRouteName, models, queryParams, _keepDefaultQueryParamValues);\n\n var transition = (_routerMicrolib5 = this._routerMicrolib).transitionTo.apply(_routerMicrolib5, [targetRouteName].concat(models, [{ queryParams: queryParams }]));\n\n didBeginTransition(transition, this);\n\n return transition;\n },\n _processActiveTransitionQueryParams: function (targetRouteName, models, queryParams, _queryParams) {\n // merge in any queryParams from the active transition which could include\n // queryParams from the url on initial load.\n if (!this._routerMicrolib.activeTransition) {\n return;\n }\n\n var unchangedQPs = {};\n var qpUpdates = this._qpUpdates || {};\n var params = this._routerMicrolib.activeTransition.queryParams;\n for (var key in params) {\n if (!qpUpdates[key]) {\n unchangedQPs[key] = params[key];\n }\n }\n\n // We need to fully scope queryParams so that we can create one object\n // that represents both passed-in queryParams and ones that aren't changed\n // from the active transition.\n this._fullyScopeQueryParams(targetRouteName, models, _queryParams);\n this._fullyScopeQueryParams(targetRouteName, models, unchangedQPs);\n (0, _emberUtils.assign)(queryParams, unchangedQPs);\n },\n _prepareQueryParams: function (targetRouteName, models, queryParams, _fromRouterService) {\n var state = calculatePostTransitionState(this, targetRouteName, models);\n this._hydrateUnsuppliedQueryParams(state, queryParams, _fromRouterService);\n this._serializeQueryParams(state.handlerInfos, queryParams);\n\n if (!_fromRouterService) {\n this._pruneDefaultQueryParamValues(state.handlerInfos, queryParams);\n }\n },\n _getQPMeta: function (handlerInfo) {\n var route = handlerInfo.handler;\n return route && (0, _emberMetal.get)(route, '_qp');\n },\n _queryParamsFor: function (handlerInfos) {\n var handlerInfoLength = handlerInfos.length;\n var leafRouteName = handlerInfos[handlerInfoLength - 1].name;\n var cached = this._qpCache[leafRouteName];\n if (cached) {\n return cached;\n }\n\n var shouldCache = true;\n var qpsByUrlKey = {};\n var map = {};\n var qps = [];\n\n for (var i = 0; i < handlerInfoLength; ++i) {\n var qpMeta = this._getQPMeta(handlerInfos[i]);\n\n if (!qpMeta) {\n shouldCache = false;\n continue;\n }\n\n // Loop over each QP to make sure we don't have any collisions by urlKey\n for (var _i = 0; _i < qpMeta.qps.length; _i++) {\n var qp = qpMeta.qps[_i];\n var urlKey = qp.urlKey;\n var qpOther = qpsByUrlKey[urlKey];\n\n if (qpOther && qpOther.controllerName !== qp.controllerName) {\n var otherQP = qpsByUrlKey[urlKey];\n (true && !(false) && (0, _emberDebug.assert)('You\\'re not allowed to have more than one controller property map to the same query param key, but both `' + otherQP.scopedPropertyName + '` and `' + qp.scopedPropertyName + '` map to `' + urlKey + '`. You can fix this by mapping one of the controller properties to a different query param key via the `as` config option, e.g. `' + otherQP.prop + ': { as: \\'other-' + otherQP.prop + '\\' }`', false));\n }\n\n qpsByUrlKey[urlKey] = qp;\n qps.push(qp);\n }\n\n (0, _emberUtils.assign)(map, qpMeta.map);\n }\n\n var finalQPMeta = { qps: qps, map: map };\n\n if (shouldCache) {\n this._qpCache[leafRouteName] = finalQPMeta;\n }\n\n return finalQPMeta;\n },\n _fullyScopeQueryParams: function (leafRouteName, contexts, queryParams) {\n var state = calculatePostTransitionState(this, leafRouteName, contexts);\n var handlerInfos = state.handlerInfos;\n\n for (var i = 0, len = handlerInfos.length; i < len; ++i) {\n var qpMeta = this._getQPMeta(handlerInfos[i]);\n\n if (!qpMeta) {\n continue;\n }\n\n for (var j = 0, qpLen = qpMeta.qps.length; j < qpLen; ++j) {\n var qp = qpMeta.qps[j];\n\n var presentProp = qp.prop in queryParams && qp.prop || qp.scopedPropertyName in queryParams && qp.scopedPropertyName || qp.urlKey in queryParams && qp.urlKey;\n\n if (presentProp) {\n if (presentProp !== qp.scopedPropertyName) {\n queryParams[qp.scopedPropertyName] = queryParams[presentProp];\n delete queryParams[presentProp];\n }\n }\n }\n }\n },\n _hydrateUnsuppliedQueryParams: function (state, queryParams, _fromRouterService) {\n var handlerInfos = state.handlerInfos;\n var appCache = this._bucketCache;\n\n for (var i = 0; i < handlerInfos.length; ++i) {\n var qpMeta = this._getQPMeta(handlerInfos[i]);\n\n if (!qpMeta) {\n continue;\n }\n\n for (var j = 0, qpLen = qpMeta.qps.length; j < qpLen; ++j) {\n var qp = qpMeta.qps[j];\n\n var presentProp = qp.prop in queryParams && qp.prop || qp.scopedPropertyName in queryParams && qp.scopedPropertyName || qp.urlKey in queryParams && qp.urlKey;\n\n (true && !(function () {\n if (qp.urlKey === presentProp) {\n return true;\n }\n\n if (_fromRouterService && presentProp !== false) {\n return false;\n }\n\n return true;\n }()) && (0, _emberDebug.assert)('You passed the `' + presentProp + '` query parameter during a transition into ' + qp.route.routeName + ', please update to ' + qp.urlKey, function () {\n if (qp.urlKey === presentProp) {\n return true;\n }if (_fromRouterService && presentProp !== false) {\n return false;\n }return true;\n }()));\n\n\n if (presentProp) {\n if (presentProp !== qp.scopedPropertyName) {\n queryParams[qp.scopedPropertyName] = queryParams[presentProp];\n delete queryParams[presentProp];\n }\n } else {\n var cacheKey = (0, _utils.calculateCacheKey)(qp.route.fullRouteName, qp.parts, state.params);\n queryParams[qp.scopedPropertyName] = appCache.lookup(cacheKey, qp.prop, qp.defaultValue);\n }\n }\n }\n },\n _scheduleLoadingEvent: function (transition, originRoute) {\n this._cancelSlowTransitionTimer();\n this._slowTransitionTimer = _emberMetal.run.scheduleOnce('routerTransitions', this, '_handleSlowTransition', transition, originRoute);\n },\n\n\n currentState: null,\n targetState: null,\n\n _handleSlowTransition: function (transition, originRoute) {\n if (!this._routerMicrolib.activeTransition) {\n // Don't fire an event if we've since moved on from\n // the transition that put us in a loading state.\n return;\n }\n\n this.set('targetState', _router_state.default.create({\n emberRouter: this,\n routerJs: this._routerMicrolib,\n routerJsState: this._routerMicrolib.activeTransition.state\n }));\n\n transition.trigger(true, 'loading', transition, originRoute);\n },\n _cancelSlowTransitionTimer: function () {\n if (this._slowTransitionTimer) {\n _emberMetal.run.cancel(this._slowTransitionTimer);\n }\n this._slowTransitionTimer = null;\n },\n _markErrorAsHandled: function (error) {\n this._handledErrors.add(error);\n },\n _isErrorHandled: function (error) {\n return this._handledErrors.has(error);\n },\n _clearHandledError: function (error) {\n this._handledErrors.delete(error);\n },\n _getEngineInstance: function (_ref) {\n var name = _ref.name,\n instanceId = _ref.instanceId,\n mountPoint = _ref.mountPoint;\n\n var engineInstances = this._engineInstances;\n\n if (!engineInstances[name]) {\n engineInstances[name] = Object.create(null);\n }\n\n var engineInstance = engineInstances[name][instanceId];\n\n if (!engineInstance) {\n var owner = (0, _emberUtils.getOwner)(this);\n\n (true && !(owner.hasRegistration('engine:' + name)) && (0, _emberDebug.assert)('You attempted to mount the engine \\'' + name + '\\' in your router map, but the engine can not be found.', owner.hasRegistration('engine:' + name)));\n\n\n engineInstance = owner.buildChildEngineInstance(name, {\n routable: true,\n mountPoint: mountPoint\n });\n\n engineInstance.boot();\n\n engineInstances[name][instanceId] = engineInstance;\n }\n\n return engineInstance;\n }\n });\n\n /*\n Helper function for iterating over routes in a set of handlerInfos that are\n at or above the given origin route. Example: if `originRoute` === 'foo.bar'\n and the handlerInfos given were for 'foo.bar.baz', then the given callback\n will be invoked with the routes for 'foo.bar', 'foo', and 'application'\n individually.\n \n If the callback returns anything other than `true`, then iteration will stop.\n \n @private\n @param {Route} originRoute\n @param {Array<HandlerInfo>} handlerInfos\n @param {Function} callback\n @return {Void}\n */\n function forEachRouteAbove(handlerInfos, callback) {\n\n for (var i = handlerInfos.length - 1; i >= 0; --i) {\n var handlerInfo = handlerInfos[i];\n var route = handlerInfo.handler;\n\n // handlerInfo.handler being `undefined` generally means either:\n //\n // 1. an error occurred during creation of the route in question\n // 2. the route is across an async boundary (e.g. within an engine)\n //\n // In both of these cases, we cannot invoke the callback on that specific\n // route, because it just doesn't exist...\n if (route === undefined) {\n continue;\n }\n\n if (callback(route, handlerInfo) !== true) {\n return;\n }\n }\n }\n\n // These get invoked when an action bubbles above ApplicationRoute\n // and are not meant to be overridable.\n var defaultActionHandlers = {\n willResolveModel: function (handlerInfos, transition, originRoute) {\n this._scheduleLoadingEvent(transition, originRoute);\n },\n error: function (handlerInfos, error, transition) {\n var router = this;\n\n var handlerInfoWithError = handlerInfos[handlerInfos.length - 1];\n\n forEachRouteAbove(handlerInfos, function (route, handlerInfo) {\n // We don't check the leaf most handlerInfo since that would\n // technically be below where we're at in the route hierarchy.\n if (handlerInfo !== handlerInfoWithError) {\n // Check for the existence of an 'error' route.\n var errorRouteName = findRouteStateName(route, 'error');\n if (errorRouteName) {\n router._markErrorAsHandled(error);\n router.intermediateTransitionTo(errorRouteName, error);\n return false;\n }\n }\n\n // Check for an 'error' substate route\n var errorSubstateName = findRouteSubstateName(route, 'error');\n if (errorSubstateName) {\n router._markErrorAsHandled(error);\n router.intermediateTransitionTo(errorSubstateName, error);\n return false;\n }\n\n return true;\n });\n\n logError(error, 'Error while processing route: ' + transition.targetName);\n },\n loading: function (handlerInfos, transition) {\n var router = this;\n\n var handlerInfoWithSlowLoading = handlerInfos[handlerInfos.length - 1];\n\n forEachRouteAbove(handlerInfos, function (route, handlerInfo) {\n // We don't check the leaf most handlerInfo since that would\n // technically be below where we're at in the route hierarchy.\n if (handlerInfo !== handlerInfoWithSlowLoading) {\n // Check for the existence of a 'loading' route.\n var loadingRouteName = findRouteStateName(route, 'loading');\n if (loadingRouteName) {\n router.intermediateTransitionTo(loadingRouteName);\n return false;\n }\n }\n\n // Check for loading substate\n var loadingSubstateName = findRouteSubstateName(route, 'loading');\n if (loadingSubstateName) {\n router.intermediateTransitionTo(loadingSubstateName);\n return false;\n }\n\n // Don't bubble above pivot route.\n return transition.pivotHandler !== route;\n });\n }\n };\n\n function logError(_error, initialMessage) {\n var errorArgs = [];\n var error = void 0;\n if (_error && typeof _error === 'object' && typeof _error.errorThrown === 'object') {\n error = _error.errorThrown;\n } else {\n error = _error;\n }\n\n if (initialMessage) {\n errorArgs.push(initialMessage);\n }\n\n if (error) {\n if (error.message) {\n errorArgs.push(error.message);\n }\n if (error.stack) {\n errorArgs.push(error.stack);\n }\n\n if (typeof error === 'string') {\n errorArgs.push(error);\n }\n }\n\n _emberConsole.default.error.apply(this, errorArgs);\n }\n\n /**\n Finds the name of the substate route if it exists for the given route. A\n substate route is of the form `route_state`, such as `foo_loading`.\n \n @private\n @param {Route} route\n @param {String} state\n @return {String}\n */\n function findRouteSubstateName(route, state) {\n var owner = (0, _emberUtils.getOwner)(route);\n var routeName = route.routeName,\n fullRouteName = route.fullRouteName,\n router = route.router;\n\n\n var substateName = routeName + '_' + state;\n var substateNameFull = fullRouteName + '_' + state;\n\n return routeHasBeenDefined(owner, router, substateName, substateNameFull) ? substateNameFull : '';\n }\n\n /**\n Finds the name of the state route if it exists for the given route. A state\n route is of the form `route.state`, such as `foo.loading`. Properly Handles\n `application` named routes.\n \n @private\n @param {Route} route\n @param {String} state\n @return {String}\n */\n function findRouteStateName(route, state) {\n var owner = (0, _emberUtils.getOwner)(route);\n var routeName = route.routeName,\n fullRouteName = route.fullRouteName,\n router = route.router;\n\n\n var stateName = routeName === 'application' ? state : routeName + '.' + state;\n var stateNameFull = fullRouteName === 'application' ? state : fullRouteName + '.' + state;\n\n return routeHasBeenDefined(owner, router, stateName, stateNameFull) ? stateNameFull : '';\n }\n\n /**\n Determines whether or not a route has been defined by checking that the route\n is in the Router's map and the owner has a registration for that route.\n \n @private\n @param {Owner} owner\n @param {Router} router\n @param {String} localName\n @param {String} fullName\n @return {Boolean}\n */\n function routeHasBeenDefined(owner, router, localName, fullName) {\n var routerHasRoute = router.hasRoute(fullName);\n var ownerHasRoute = owner.hasRegistration('template:' + localName) || owner.hasRegistration('route:' + localName);\n return routerHasRoute && ownerHasRoute;\n }\n\n function triggerEvent(handlerInfos, ignoreFailure, args) {\n var name = args.shift();\n\n if (!handlerInfos) {\n if (ignoreFailure) {\n return;\n }\n throw new _emberDebug.Error('Can\\'t trigger action \\'' + name + '\\' because your app hasn\\'t finished transitioning into its first route. To trigger an action on destination routes during a transition, you can call `.send()` on the `Transition` object passed to the `model/beforeModel/afterModel` hooks.');\n }\n\n var eventWasHandled = false;\n var handlerInfo = void 0,\n handler = void 0,\n actionHandler = void 0;\n\n for (var i = handlerInfos.length - 1; i >= 0; i--) {\n handlerInfo = handlerInfos[i];\n handler = handlerInfo.handler;\n actionHandler = handler && handler.actions && handler.actions[name];\n if (actionHandler) {\n if (actionHandler.apply(handler, args) === true) {\n eventWasHandled = true;\n } else {\n // Should only hit here if a non-bubbling error action is triggered on a route.\n if (name === 'error') {\n handler.router._markErrorAsHandled(args[0]);\n }\n return;\n }\n }\n }\n\n var defaultHandler = defaultActionHandlers[name];\n if (defaultHandler) {\n defaultHandler.apply(this, [handlerInfos].concat(args));\n return;\n }\n\n if (!eventWasHandled && !ignoreFailure) {\n throw new _emberDebug.Error('Nothing handled the action \\'' + name + '\\'. If you did handle the action, this error can be caused by returning true from an action handler in a controller, causing the action to bubble.');\n }\n }\n\n function calculatePostTransitionState(emberRouter, leafRouteName, contexts) {\n var state = emberRouter._routerMicrolib.applyIntent(leafRouteName, contexts);\n var handlerInfos = state.handlerInfos,\n params = state.params;\n\n\n for (var i = 0; i < handlerInfos.length; ++i) {\n var handlerInfo = handlerInfos[i];\n\n // If the handlerInfo is not resolved, we serialize the context into params\n if (!handlerInfo.isResolved) {\n params[handlerInfo.name] = handlerInfo.serialize(handlerInfo.context);\n } else {\n params[handlerInfo.name] = handlerInfo.params;\n }\n }\n return state;\n }\n\n function updatePaths(router) {\n var infos = router._routerMicrolib.currentHandlerInfos;\n if (infos.length === 0) {\n return;\n }\n\n var path = EmberRouter._routePath(infos);\n var currentRouteName = infos[infos.length - 1].name;\n var currentURL = router.get('location').getURL();\n\n (0, _emberMetal.set)(router, 'currentPath', path);\n (0, _emberMetal.set)(router, 'currentRouteName', currentRouteName);\n (0, _emberMetal.set)(router, 'currentURL', currentURL);\n\n var appController = (0, _emberUtils.getOwner)(router).lookup('controller:application');\n\n if (!appController) {\n // appController might not exist when top-level loading/error\n // substates have been entered since ApplicationRoute hasn't\n // actually been entered at that point.\n return;\n }\n\n if (!('currentPath' in appController)) {\n (0, _emberMetal.defineProperty)(appController, 'currentPath');\n }\n\n (0, _emberMetal.set)(appController, 'currentPath', path);\n\n if (!('currentRouteName' in appController)) {\n (0, _emberMetal.defineProperty)(appController, 'currentRouteName');\n }\n\n (0, _emberMetal.set)(appController, 'currentRouteName', currentRouteName);\n }\n\n EmberRouter.reopenClass({\n map: function (callback) {\n if (!this.dslCallbacks) {\n this.dslCallbacks = [];\n this.reopenClass({ dslCallbacks: this.dslCallbacks });\n }\n\n this.dslCallbacks.push(callback);\n\n return this;\n },\n _routePath: function (handlerInfos) {\n var path = [];\n\n // We have to handle coalescing resource names that\n // are prefixed with their parent's names, e.g.\n // ['foo', 'foo.bar.baz'] => 'foo.bar.baz', not 'foo.foo.bar.baz'\n\n function intersectionMatches(a1, a2) {\n for (var i = 0; i < a1.length; ++i) {\n if (a1[i] !== a2[i]) {\n return false;\n }\n }\n return true;\n }\n\n var name = void 0,\n nameParts = void 0,\n oldNameParts = void 0;\n for (var i = 1; i < handlerInfos.length; i++) {\n name = handlerInfos[i].name;\n nameParts = name.split('.');\n oldNameParts = slice.call(path);\n\n while (oldNameParts.length) {\n if (intersectionMatches(oldNameParts, nameParts)) {\n break;\n }\n oldNameParts.shift();\n }\n\n path.push.apply(path, nameParts.slice(oldNameParts.length));\n }\n\n return path.join('.');\n }\n });\n\n function didBeginTransition(transition, router) {\n var routerState = _router_state.default.create({\n emberRouter: router,\n routerJs: router._routerMicrolib,\n routerJsState: transition.state\n });\n\n if (!router.currentState) {\n router.set('currentState', routerState);\n }\n router.set('targetState', routerState);\n\n transition.promise = transition.catch(function (error) {\n if (router._isErrorHandled(error)) {\n router._clearHandledError(error);\n } else {\n throw error;\n }\n });\n }\n\n function forEachQueryParam(router, handlerInfos, queryParams, callback) {\n var qpCache = router._queryParamsFor(handlerInfos);\n\n for (var key in queryParams) {\n if (!queryParams.hasOwnProperty(key)) {\n continue;\n }\n var value = queryParams[key];\n var qp = qpCache.map[key];\n\n callback(key, value, qp);\n }\n }\n\n function findLiveRoute(liveRoutes, name) {\n if (!liveRoutes) {\n return;\n }\n var stack = [liveRoutes];\n while (stack.length > 0) {\n var test = stack.shift();\n if (test.render.name === name) {\n return test;\n }\n var outlets = test.outlets;\n for (var outletName in outlets) {\n stack.push(outlets[outletName]);\n }\n }\n }\n\n function appendLiveRoute(liveRoutes, defaultParentState, renderOptions) {\n var target = void 0;\n var myState = {\n render: renderOptions,\n outlets: Object.create(null),\n wasUsed: false\n };\n if (renderOptions.into) {\n target = findLiveRoute(liveRoutes, renderOptions.into);\n } else {\n target = defaultParentState;\n }\n if (target) {\n (0, _emberMetal.set)(target.outlets, renderOptions.outlet, myState);\n } else {\n if (renderOptions.into) {\n (true && !(false) && (0, _emberDebug.deprecate)('Rendering into a {{render}} helper that resolves to an {{outlet}} is deprecated.', false, {\n id: 'ember-routing.top-level-render-helper',\n until: '3.0.0',\n url: 'https://emberjs.com/deprecations/v2.x/#toc_rendering-into-a-render-helper-that-resolves-to-an-outlet'\n }));\n\n\n // Megahax time. Post-3.0-breaking-changes, we will just assert\n // right here that the user tried to target a nonexistent\n // thing. But for now we still need to support the `render`\n // helper, and people are allowed to target templates rendered\n // by the render helper. So instead we defer doing anyting with\n // these orphan renders until afterRender.\n appendOrphan(liveRoutes, renderOptions.into, myState);\n } else {\n liveRoutes = myState;\n }\n }\n return {\n liveRoutes: liveRoutes,\n ownState: myState\n };\n }\n\n function appendOrphan(liveRoutes, into, myState) {\n if (!liveRoutes.outlets.__ember_orphans__) {\n liveRoutes.outlets.__ember_orphans__ = {\n render: {\n name: '__ember_orphans__'\n },\n outlets: Object.create(null)\n };\n }\n liveRoutes.outlets.__ember_orphans__.outlets[into] = myState;\n _emberMetal.run.schedule('afterRender', function () {\n (true && !(liveRoutes.outlets.__ember_orphans__.outlets[into].wasUsed) && (0, _emberDebug.assert)('You attempted to render into \\'' + into + '\\' but it was not found', liveRoutes.outlets.__ember_orphans__.outlets[into].wasUsed));\n });\n }\n\n function representEmptyRoute(liveRoutes, defaultParentState, route) {\n // the route didn't render anything\n var alreadyAppended = findLiveRoute(liveRoutes, route.routeName);\n if (alreadyAppended) {\n // But some other route has already rendered our default\n // template, so that becomes the default target for any\n // children we may have.\n return alreadyAppended;\n } else {\n // Create an entry to represent our default template name,\n // just so other routes can target it and inherit its place\n // in the outlet hierarchy.\n defaultParentState.outlets.main = {\n render: {\n name: route.routeName,\n outlet: 'main'\n },\n outlets: {}\n };\n return defaultParentState;\n }\n }\n\n exports.default = EmberRouter;\n});","enifed('ember-routing/system/router_state', ['exports', 'ember-utils', 'ember-routing/utils', 'ember-runtime'], function (exports, _emberUtils, _utils, _emberRuntime) {\n 'use strict';\n\n exports.default = _emberRuntime.Object.extend({\n emberRouter: null,\n routerJs: null,\n routerJsState: null,\n\n isActiveIntent: function (routeName, models, queryParams, queryParamsMustMatch) {\n var state = this.routerJsState;\n if (!this.routerJs.isActiveIntent(routeName, models, null, state)) {\n return false;\n }\n\n if (queryParamsMustMatch && Object.keys(queryParams).length > 0) {\n var visibleQueryParams = (0, _emberUtils.assign)({}, queryParams);\n\n this.emberRouter._prepareQueryParams(routeName, models, visibleQueryParams);\n return (0, _utils.shallowEqual)(visibleQueryParams, state.queryParams);\n }\n\n return true;\n }\n });\n});","enifed('ember-routing/utils', ['exports', 'ember-utils', 'ember-metal', 'ember-debug'], function (exports, _emberUtils, _emberMetal, _emberDebug) {\n 'use strict';\n\n exports.extractRouteArgs = extractRouteArgs;\n exports.getActiveTargetName = getActiveTargetName;\n exports.stashParamNames = stashParamNames;\n exports.calculateCacheKey = calculateCacheKey;\n exports.normalizeControllerQueryParams = normalizeControllerQueryParams;\n exports.resemblesURL = resemblesURL;\n exports.prefixRouteNameArg = prefixRouteNameArg;\n exports.shallowEqual = shallowEqual;\n\n\n var ALL_PERIODS_REGEX = /\\./g;\n\n function extractRouteArgs(args) {\n args = args.slice();\n var possibleQueryParams = args[args.length - 1];\n\n var queryParams = void 0;\n if (possibleQueryParams && possibleQueryParams.hasOwnProperty('queryParams')) {\n queryParams = args.pop().queryParams;\n } else {\n queryParams = {};\n }\n\n var routeName = args.shift();\n\n return { routeName: routeName, models: args, queryParams: queryParams };\n }\n\n function getActiveTargetName(router) {\n var handlerInfos = router.activeTransition ? router.activeTransition.state.handlerInfos : router.state.handlerInfos;\n return handlerInfos[handlerInfos.length - 1].name;\n }\n\n function stashParamNames(router, handlerInfos) {\n if (handlerInfos._namesStashed) {\n return;\n }\n\n // This helper exists because router.js/route-recognizer.js awkwardly\n // keeps separate a handlerInfo's list of parameter names depending\n // on whether a URL transition or named transition is happening.\n // Hopefully we can remove this in the future.\n var targetRouteName = handlerInfos[handlerInfos.length - 1].name;\n var recogHandlers = router._routerMicrolib.recognizer.handlersFor(targetRouteName);\n var dynamicParent = null;\n\n for (var i = 0; i < handlerInfos.length; ++i) {\n var handlerInfo = handlerInfos[i];\n var names = recogHandlers[i].names;\n\n if (names.length) {\n dynamicParent = handlerInfo;\n }\n\n handlerInfo._names = names;\n\n var route = handlerInfo.handler;\n route._stashNames(handlerInfo, dynamicParent);\n }\n\n handlerInfos._namesStashed = true;\n }\n\n function _calculateCacheValuePrefix(prefix, part) {\n // calculates the dot separated sections from prefix that are also\n // at the start of part - which gives us the route name\n\n // given : prefix = site.article.comments, part = site.article.id\n // - returns: site.article (use get(values[site.article], 'id') to get the dynamic part - used below)\n\n // given : prefix = site.article, part = site.article.id\n // - returns: site.article. (use get(values[site.article], 'id') to get the dynamic part - used below)\n\n var prefixParts = prefix.split('.');\n var currPrefix = '';\n\n for (var i = 0; i < prefixParts.length; i++) {\n var currPart = prefixParts.slice(0, i + 1).join('.');\n if (part.indexOf(currPart) !== 0) {\n break;\n }\n currPrefix = currPart;\n }\n\n return currPrefix;\n }\n\n /*\n Stolen from Controller\n */\n function calculateCacheKey(prefix) {\n var parts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n var values = arguments[2];\n\n var suffixes = '';\n for (var i = 0; i < parts.length; ++i) {\n var part = parts[i];\n var cacheValuePrefix = _calculateCacheValuePrefix(prefix, part);\n var value = void 0;\n if (values) {\n if (cacheValuePrefix && cacheValuePrefix in values) {\n var partRemovedPrefix = part.indexOf(cacheValuePrefix) === 0 ? part.substr(cacheValuePrefix.length + 1) : part;\n value = (0, _emberMetal.get)(values[cacheValuePrefix], partRemovedPrefix);\n } else {\n value = (0, _emberMetal.get)(values, part);\n }\n }\n suffixes += '::' + part + ':' + value;\n }\n return prefix + suffixes.replace(ALL_PERIODS_REGEX, '-');\n }\n\n /*\n Controller-defined query parameters can come in three shapes:\n \n Array\n queryParams: ['foo', 'bar']\n Array of simple objects where value is an alias\n queryParams: [\n {\n 'foo': 'rename_foo_to_this'\n },\n {\n 'bar': 'call_bar_this_instead'\n }\n ]\n Array of fully defined objects\n queryParams: [\n {\n 'foo': {\n as: 'rename_foo_to_this'\n },\n }\n {\n 'bar': {\n as: 'call_bar_this_instead',\n scope: 'controller'\n }\n }\n ]\n \n This helper normalizes all three possible styles into the\n 'Array of fully defined objects' style.\n */\n function normalizeControllerQueryParams(queryParams) {\n var qpMap = {};\n\n for (var i = 0; i < queryParams.length; ++i) {\n accumulateQueryParamDescriptors(queryParams[i], qpMap);\n }\n\n return qpMap;\n }\n\n function accumulateQueryParamDescriptors(_desc, accum) {\n var desc = _desc;\n var tmp = void 0;\n if (typeof desc === 'string') {\n tmp = {};\n tmp[desc] = { as: null };\n desc = tmp;\n }\n\n for (var key in desc) {\n if (!desc.hasOwnProperty(key)) {\n return;\n }\n\n var singleDesc = desc[key];\n if (typeof singleDesc === 'string') {\n singleDesc = { as: singleDesc };\n }\n\n tmp = accum[key] || { as: null, scope: 'model' };\n (0, _emberUtils.assign)(tmp, singleDesc);\n\n accum[key] = tmp;\n }\n }\n\n /*\n Check if a routeName resembles a url instead\n \n @private\n */\n function resemblesURL(str) {\n return typeof str === 'string' && (str === '' || str[0] === '/');\n }\n\n /*\n Returns an arguments array where the route name arg is prefixed based on the mount point\n \n @private\n */\n function prefixRouteNameArg(route, args) {\n var routeName = args[0];\n var owner = (0, _emberUtils.getOwner)(route);\n var prefix = owner.mountPoint;\n\n // only alter the routeName if it's actually referencing a route.\n if (owner.routable && typeof routeName === 'string') {\n if (resemblesURL(routeName)) {\n throw new _emberDebug.Error('Programmatic transitions by URL cannot be used within an Engine. Please use the route name instead.');\n } else {\n routeName = prefix + '.' + routeName;\n args[0] = routeName;\n }\n }\n\n return args;\n }\n\n function shallowEqual(a, b) {\n var k = void 0;\n var aCount = 0;\n var bCount = 0;\n for (k in a) {\n if (a.hasOwnProperty(k)) {\n if (a[k] !== b[k]) {\n return false;\n }\n aCount++;\n }\n }\n\n for (k in b) {\n if (b.hasOwnProperty(k)) {\n bCount++;\n }\n }\n\n return aCount === bCount;\n }\n});","enifed('ember-runtime/compare', ['exports', 'ember-runtime/utils', 'ember-runtime/mixins/comparable'], function (exports, _utils, _comparable) {\n 'use strict';\n\n exports.default = compare;\n\n\n var TYPE_ORDER = {\n 'undefined': 0,\n 'null': 1,\n 'boolean': 2,\n 'number': 3,\n 'string': 4,\n 'array': 5,\n 'object': 6,\n 'instance': 7,\n 'function': 8,\n 'class': 9,\n 'date': 10\n };\n\n //\n // the spaceship operator\n //\n // `. ___\n // __,' __`. _..----....____\n // __...--.'``;. ,. ;``--..__ .' ,-._ _.-'\n // _..-''-------' `' `' `' O ``-''._ (,;') _,'\n // ,'________________ \\`-._`-','\n // `._ ```````````------...___ '-.._'-:\n // ```--.._ ,. ````--...__\\-.\n // `.--. `-` \"INFINITY IS LESS ____ | |`\n // `. `. THAN BEYOND\" ,'`````. ; ;`\n // `._`. __________ `. \\'__/`\n // `-:._____/______/___/____`. \\ `\n // | `._ `. \\\n // `._________`-. `. `.___\n // SSt `------'`\n function spaceship(a, b) {\n var diff = a - b;\n return (diff > 0) - (diff < 0);\n }\n\n /**\n @module @ember/utils\n */\n\n /**\n Compares two javascript values and returns:\n \n - -1 if the first is smaller than the second,\n - 0 if both are equal,\n - 1 if the first is greater than the second.\n \n ```javascript\n import { compare } from '@ember/utils';\n \n compare('hello', 'hello'); // 0\n compare('abc', 'dfg'); // -1\n compare(2, 1); // 1\n ```\n \n If the types of the two objects are different precedence occurs in the\n following order, with types earlier in the list considered `<` types\n later in the list:\n \n - undefined\n - null\n - boolean\n - number\n - string\n - array\n - object\n - instance\n - function\n - class\n - date\n \n ```javascript\n import { compare } from '@ember/utils';\n \n compare('hello', 50); // 1\n compare(50, 'hello'); // -1\n ```\n \n @method compare\n @for @ember/utils\n @static\n @param {Object} v First value to compare\n @param {Object} w Second value to compare\n @return {Number} -1 if v < w, 0 if v = w and 1 if v > w.\n @public\n */\n function compare(v, w) {\n if (v === w) {\n return 0;\n }\n\n var type1 = (0, _utils.typeOf)(v);\n var type2 = (0, _utils.typeOf)(w);\n\n if (_comparable.default) {\n if (type1 === 'instance' && _comparable.default.detect(v) && v.constructor.compare) {\n return v.constructor.compare(v, w);\n }\n\n if (type2 === 'instance' && _comparable.default.detect(w) && w.constructor.compare) {\n return w.constructor.compare(w, v) * -1;\n }\n }\n\n var res = spaceship(TYPE_ORDER[type1], TYPE_ORDER[type2]);\n\n if (res !== 0) {\n return res;\n }\n\n // types are equal - so we have to check values now\n switch (type1) {\n case 'boolean':\n case 'number':\n return spaceship(v, w);\n\n case 'string':\n return spaceship(v.localeCompare(w), 0);\n\n case 'array':\n {\n var vLen = v.length;\n var wLen = w.length;\n var len = Math.min(vLen, wLen);\n\n for (var i = 0; i < len; i++) {\n var r = compare(v[i], w[i]);\n if (r !== 0) {\n return r;\n }\n }\n\n // all elements are equal now\n // shorter array should be ordered first\n return spaceship(vLen, wLen);\n }\n case 'instance':\n if (_comparable.default && _comparable.default.detect(v)) {\n return v.compare(v, w);\n }\n return 0;\n\n case 'date':\n return spaceship(v.getTime(), w.getTime());\n\n default:\n return 0;\n }\n }\n});","enifed('ember-runtime/computed/computed_macros', ['exports', 'ember-metal', 'ember-debug'], function (exports, _emberMetal, _emberDebug) {\n 'use strict';\n\n exports.or = exports.and = undefined;\n exports.empty = empty;\n exports.notEmpty = notEmpty;\n exports.none = none;\n exports.not = not;\n exports.bool = bool;\n exports.match = match;\n exports.equal = equal;\n exports.gt = gt;\n exports.gte = gte;\n exports.lt = lt;\n exports.lte = lte;\n exports.oneWay = oneWay;\n exports.readOnly = readOnly;\n exports.deprecatingAlias = deprecatingAlias;\n\n\n /**\n @module @ember/object\n */\n\n function expandPropertiesToArray(predicateName, properties) {\n var expandedProperties = [];\n\n function extractProperty(entry) {\n expandedProperties.push(entry);\n }\n\n for (var i = 0; i < properties.length; i++) {\n var property = properties[i];\n (true && !(property.indexOf(' ') < 0) && (0, _emberDebug.assert)('Dependent keys passed to computed.' + predicateName + '() can\\'t have spaces.', property.indexOf(' ') < 0));\n\n\n (0, _emberMetal.expandProperties)(property, extractProperty);\n }\n\n return expandedProperties;\n }\n\n function generateComputedWithPredicate(name, predicate) {\n return function () {\n for (var _len = arguments.length, properties = Array(_len), _key = 0; _key < _len; _key++) {\n properties[_key] = arguments[_key];\n }\n\n var dependentKeys = expandPropertiesToArray(name, properties);\n\n var computedFunc = new _emberMetal.ComputedProperty(function () {\n var lastIdx = dependentKeys.length - 1;\n\n for (var i = 0; i < lastIdx; i++) {\n var value = (0, _emberMetal.get)(this, dependentKeys[i]);\n if (!predicate(value)) {\n return value;\n }\n }\n\n return (0, _emberMetal.get)(this, dependentKeys[lastIdx]);\n }, { dependentKeys: dependentKeys });\n\n return computedFunc;\n };\n }\n\n /**\n A computed property that returns true if the value of the dependent\n property is null, an empty string, empty array, or empty function.\n \n Example\n \n ```javascript\n import { empty } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let ToDoList = EmberObject.extend({\n isDone: empty('todos')\n });\n \n let todoList = ToDoList.create({\n todos: ['Unit Test', 'Documentation', 'Release']\n });\n \n todoList.get('isDone'); // false\n todoList.get('todos').clear();\n todoList.get('isDone'); // true\n ```\n \n @since 1.6.0\n @method empty\n @static\n @for @ember/object/computed\n @param {String} dependentKey\n @return {ComputedProperty} computed property which returns true if\n the value of the dependent property is null, an empty string, empty array,\n or empty function and false if the underlying value is not empty.\n \n @public\n */\n function empty(dependentKey) {\n return (0, _emberMetal.computed)(dependentKey + '.length', function () {\n return (0, _emberMetal.isEmpty)((0, _emberMetal.get)(this, dependentKey));\n });\n }\n\n /**\n A computed property that returns true if the value of the dependent\n property is NOT null, an empty string, empty array, or empty function.\n \n Example\n \n ```javascript\n import { notEmpty } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n hasStuff: notEmpty('backpack')\n });\n \n let hamster = Hamster.create({ backpack: ['Food', 'Sleeping Bag', 'Tent'] });\n \n hamster.get('hasStuff'); // true\n hamster.get('backpack').clear(); // []\n hamster.get('hasStuff'); // false\n ```\n \n @method notEmpty\n @static\n @for @ember/object/computed\n @param {String} dependentKey\n @return {ComputedProperty} computed property which returns true if\n original value for property is not empty.\n @public\n */\n function notEmpty(dependentKey) {\n return (0, _emberMetal.computed)(dependentKey + '.length', function () {\n return !(0, _emberMetal.isEmpty)((0, _emberMetal.get)(this, dependentKey));\n });\n }\n\n /**\n A computed property that returns true if the value of the dependent\n property is null or undefined. This avoids errors from JSLint complaining\n about use of ==, which can be technically confusing.\n \n Example\n \n ```javascript\n import { none } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n isHungry: none('food')\n });\n \n let hamster = Hamster.create();\n \n hamster.get('isHungry'); // true\n hamster.set('food', 'Banana');\n hamster.get('isHungry'); // false\n hamster.set('food', null);\n hamster.get('isHungry'); // true\n ```\n \n @method none\n @static\n @for @ember/object/computed\n @param {String} dependentKey\n @return {ComputedProperty} computed property which\n returns true if original value for property is null or undefined.\n @public\n */\n function none(dependentKey) {\n return (0, _emberMetal.computed)(dependentKey, function () {\n return (0, _emberMetal.isNone)((0, _emberMetal.get)(this, dependentKey));\n });\n }\n\n /**\n A computed property that returns the inverse boolean value\n of the original value for the dependent property.\n \n Example\n \n ```javascript\n import { not } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let User = EmberObject.extend({\n isAnonymous: not('loggedIn')\n });\n \n let user = User.create({loggedIn: false});\n \n user.get('isAnonymous'); // true\n user.set('loggedIn', true);\n user.get('isAnonymous'); // false\n ```\n \n @method not\n @static\n @for @ember/object/computed\n @param {String} dependentKey\n @return {ComputedProperty} computed property which returns\n inverse of the original value for property\n @public\n */\n function not(dependentKey) {\n return (0, _emberMetal.computed)(dependentKey, function () {\n return !(0, _emberMetal.get)(this, dependentKey);\n });\n }\n\n /**\n A computed property that converts the provided dependent property\n into a boolean value.\n \n ```javascript\n import { bool } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n hasBananas: bool('numBananas')\n });\n \n let hamster = Hamster.create();\n \n hamster.get('hasBananas'); // false\n hamster.set('numBananas', 0);\n hamster.get('hasBananas'); // false\n hamster.set('numBananas', 1);\n hamster.get('hasBananas'); // true\n hamster.set('numBananas', null);\n hamster.get('hasBananas'); // false\n ```\n \n @method bool\n @static\n @for @ember/object/computed\n @param {String} dependentKey\n @return {ComputedProperty} computed property which converts\n to boolean the original value for property\n @public\n */\n function bool(dependentKey) {\n return (0, _emberMetal.computed)(dependentKey, function () {\n return !!(0, _emberMetal.get)(this, dependentKey);\n });\n }\n\n /**\n A computed property which matches the original value for the\n dependent property against a given RegExp, returning `true`\n if the value matches the RegExp and `false` if it does not.\n \n Example\n \n ```javascript\n import { match } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let User = EmberObject.extend({\n hasValidEmail: match('email', /^.+@.+\\..+$/)\n });\n \n let user = User.create({loggedIn: false});\n \n user.get('hasValidEmail'); // false\n user.set('email', '');\n user.get('hasValidEmail'); // false\n user.set('email', 'ember_hamster@example.com');\n user.get('hasValidEmail'); // true\n ```\n \n @method match\n @static\n @for @ember/object/computed\n @param {String} dependentKey\n @param {RegExp} regexp\n @return {ComputedProperty} computed property which match\n the original value for property against a given RegExp\n @public\n */\n function match(dependentKey, regexp) {\n return (0, _emberMetal.computed)(dependentKey, function () {\n var value = (0, _emberMetal.get)(this, dependentKey);\n return regexp.test(value);\n });\n }\n\n /**\n A computed property that returns true if the provided dependent property\n is equal to the given value.\n \n Example\n \n ```javascript\n import { equal } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n satisfied: equal('percentCarrotsEaten', 100)\n });\n \n let hamster = Hamster.create();\n \n hamster.get('satisfied'); // false\n hamster.set('percentCarrotsEaten', 100);\n hamster.get('satisfied'); // true\n hamster.set('percentCarrotsEaten', 50);\n hamster.get('satisfied'); // false\n ```\n \n @method equal\n @static\n @for @ember/object/computed\n @param {String} dependentKey\n @param {String|Number|Object} value\n @return {ComputedProperty} computed property which returns true if\n the original value for property is equal to the given value.\n @public\n */\n function equal(dependentKey, value) {\n return (0, _emberMetal.computed)(dependentKey, function () {\n return (0, _emberMetal.get)(this, dependentKey) === value;\n });\n }\n\n /**\n A computed property that returns true if the provided dependent property\n is greater than the provided value.\n \n Example\n \n ```javascript\n import { gt } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n hasTooManyBananas: gt('numBananas', 10)\n });\n \n let hamster = Hamster.create();\n \n hamster.get('hasTooManyBananas'); // false\n hamster.set('numBananas', 3);\n hamster.get('hasTooManyBananas'); // false\n hamster.set('numBananas', 11);\n hamster.get('hasTooManyBananas'); // true\n ```\n \n @method gt\n @static\n @for @ember/object/computed\n @param {String} dependentKey\n @param {Number} value\n @return {ComputedProperty} computed property which returns true if\n the original value for property is greater than given value.\n @public\n */\n function gt(dependentKey, value) {\n return (0, _emberMetal.computed)(dependentKey, function () {\n return (0, _emberMetal.get)(this, dependentKey) > value;\n });\n }\n\n /**\n A computed property that returns true if the provided dependent property\n is greater than or equal to the provided value.\n \n Example\n \n ```javascript\n import { gte } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n hasTooManyBananas: gte('numBananas', 10)\n });\n \n let hamster = Hamster.create();\n \n hamster.get('hasTooManyBananas'); // false\n hamster.set('numBananas', 3);\n hamster.get('hasTooManyBananas'); // false\n hamster.set('numBananas', 10);\n hamster.get('hasTooManyBananas'); // true\n ```\n \n @method gte\n @static\n @for @ember/object/computed\n @param {String} dependentKey\n @param {Number} value\n @return {ComputedProperty} computed property which returns true if\n the original value for property is greater or equal then given value.\n @public\n */\n function gte(dependentKey, value) {\n return (0, _emberMetal.computed)(dependentKey, function () {\n return (0, _emberMetal.get)(this, dependentKey) >= value;\n });\n }\n\n /**\n A computed property that returns true if the provided dependent property\n is less than the provided value.\n \n Example\n \n ```javascript\n import { lt } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n needsMoreBananas: lt('numBananas', 3)\n });\n \n let hamster = Hamster.create();\n \n hamster.get('needsMoreBananas'); // true\n hamster.set('numBananas', 3);\n hamster.get('needsMoreBananas'); // false\n hamster.set('numBananas', 2);\n hamster.get('needsMoreBananas'); // true\n ```\n \n @method lt\n @static\n @for @ember/object/computed\n @param {String} dependentKey\n @param {Number} value\n @return {ComputedProperty} computed property which returns true if\n the original value for property is less then given value.\n @public\n */\n function lt(dependentKey, value) {\n return (0, _emberMetal.computed)(dependentKey, function () {\n return (0, _emberMetal.get)(this, dependentKey) < value;\n });\n }\n\n /**\n A computed property that returns true if the provided dependent property\n is less than or equal to the provided value.\n \n Example\n \n ```javascript\n import { lte } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n needsMoreBananas: lte('numBananas', 3)\n });\n \n let hamster = Hamster.create();\n \n hamster.get('needsMoreBananas'); // true\n hamster.set('numBananas', 5);\n hamster.get('needsMoreBananas'); // false\n hamster.set('numBananas', 3);\n hamster.get('needsMoreBananas'); // true\n ```\n \n @method lte\n @static\n @for @ember/object/computed\n @param {String} dependentKey\n @param {Number} value\n @return {ComputedProperty} computed property which returns true if\n the original value for property is less or equal than given value.\n @public\n */\n function lte(dependentKey, value) {\n return (0, _emberMetal.computed)(dependentKey, function () {\n return (0, _emberMetal.get)(this, dependentKey) <= value;\n });\n }\n\n /**\n A computed property that performs a logical `and` on the\n original values for the provided dependent properties.\n \n You may pass in more than two properties and even use\n property brace expansion. The computed property will\n return the first falsy value or last truthy value\n just like JavaScript's `&&` operator.\n \n Example\n \n ```javascript\n import { and } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n readyForCamp: and('hasTent', 'hasBackpack'),\n readyForHike: and('hasWalkingStick', 'hasBackpack')\n });\n \n let tomster = Hamster.create();\n \n tomster.get('readyForCamp'); // false\n tomster.set('hasTent', true);\n tomster.get('readyForCamp'); // false\n tomster.set('hasBackpack', true);\n tomster.get('readyForCamp'); // true\n tomster.set('hasBackpack', 'Yes');\n tomster.get('readyForCamp'); // 'Yes'\n tomster.set('hasWalkingStick', null);\n tomster.get('readyForHike'); // null\n ```\n \n @method and\n @static\n @for @ember/object/computed\n @param {String} dependentKey*\n @return {ComputedProperty} computed property which performs\n a logical `and` on the values of all the original values for properties.\n @public\n */\n var and = exports.and = generateComputedWithPredicate('and', function (value) {\n return value;\n });\n\n /**\n A computed property which performs a logical `or` on the\n original values for the provided dependent properties.\n \n You may pass in more than two properties and even use\n property brace expansion. The computed property will\n return the first truthy value or last falsy value just\n like JavaScript's `||` operator.\n \n Example\n \n ```javascript\n import { or } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n readyForRain: or('hasJacket', 'hasUmbrella'),\n readyForBeach: or('{hasSunscreen,hasUmbrella}')\n });\n \n let tomster = Hamster.create();\n \n tomster.get('readyForRain'); // undefined\n tomster.set('hasUmbrella', true);\n tomster.get('readyForRain'); // true\n tomster.set('hasJacket', 'Yes');\n tomster.get('readyForRain'); // 'Yes'\n tomster.set('hasSunscreen', 'Check');\n tomster.get('readyForBeach'); // 'Check'\n ```\n \n @method or\n @static\n @for @ember/object/computed\n @param {String} dependentKey*\n @return {ComputedProperty} computed property which performs\n a logical `or` on the values of all the original values for properties.\n @public\n */\n var or = exports.or = generateComputedWithPredicate('or', function (value) {\n return !value;\n });\n\n /**\n Creates a new property that is an alias for another property\n on an object. Calls to `get` or `set` this property behave as\n though they were called on the original property.\n \n ```javascript\n import { alias } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Person = EmberObject.extend({\n name: 'Alex Matchneer',\n nomen: alias('name')\n });\n \n let alex = Person.create();\n \n alex.get('nomen'); // 'Alex Matchneer'\n alex.get('name'); // 'Alex Matchneer'\n \n alex.set('nomen', '@machty');\n alex.get('name'); // '@machty'\n ```\n \n @method alias\n @static\n @for @ember/object/computed\n @param {String} dependentKey\n @return {ComputedProperty} computed property which creates an\n alias to the original value for property.\n @public\n */\n\n /**\n Where `computed.alias` aliases `get` and `set`, and allows for bidirectional\n data flow, `computed.oneWay` only provides an aliased `get`. The `set` will\n not mutate the upstream property, rather causes the current property to\n become the value set. This causes the downstream property to permanently\n diverge from the upstream property.\n \n Example\n \n ```javascript\n import { oneWay } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let User = EmberObject.extend({\n firstName: null,\n lastName: null,\n nickName: oneWay('firstName')\n });\n \n let teddy = User.create({\n firstName: 'Teddy',\n lastName: 'Zeenny'\n });\n \n teddy.get('nickName'); // 'Teddy'\n teddy.set('nickName', 'TeddyBear'); // 'TeddyBear'\n teddy.get('firstName'); // 'Teddy'\n ```\n \n @method oneWay\n @static\n @for @ember/object/computed\n @param {String} dependentKey\n @return {ComputedProperty} computed property which creates a\n one way computed property to the original value for property.\n @public\n */\n function oneWay(dependentKey) {\n return (0, _emberMetal.alias)(dependentKey).oneWay();\n }\n\n /**\n This is a more semantically meaningful alias of `computed.oneWay`,\n whose name is somewhat ambiguous as to which direction the data flows.\n \n @method reads\n @static\n @for @ember/object/computed\n @param {String} dependentKey\n @return {ComputedProperty} computed property which creates a\n one way computed property to the original value for property.\n @public\n */\n\n /**\n Where `computed.oneWay` provides oneWay bindings, `computed.readOnly` provides\n a readOnly one way binding. Very often when using `computed.oneWay` one does\n not also want changes to propagate back up, as they will replace the value.\n \n This prevents the reverse flow, and also throws an exception when it occurs.\n \n Example\n \n ```javascript\n import { readOnly } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let User = EmberObject.extend({\n firstName: null,\n lastName: null,\n nickName: readOnly('firstName')\n });\n \n let teddy = User.create({\n firstName: 'Teddy',\n lastName: 'Zeenny'\n });\n \n teddy.get('nickName'); // 'Teddy'\n teddy.set('nickName', 'TeddyBear'); // throws Exception\n // throw new EmberError('Cannot Set: nickName on: <User:ember27288>' );`\n teddy.get('firstName'); // 'Teddy'\n ```\n \n @method readOnly\n @static\n @for @ember/object/computed\n @param {String} dependentKey\n @return {ComputedProperty} computed property which creates a\n one way computed property to the original value for property.\n @since 1.5.0\n @public\n */\n function readOnly(dependentKey) {\n return (0, _emberMetal.alias)(dependentKey).readOnly();\n }\n\n /**\n Creates a new property that is an alias for another property\n on an object. Calls to `get` or `set` this property behave as\n though they were called on the original property, but also\n print a deprecation warning.\n \n ```javascript\n import { deprecatingAlias } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n bananaCount: deprecatingAlias('cavendishCount', {\n id: 'hamster.deprecate-banana',\n until: '3.0.0'\n })\n });\n \n let hamster = Hamster.create();\n \n hamster.set('bananaCount', 5); // Prints a deprecation warning.\n hamster.get('cavendishCount'); // 5\n ```\n \n @method deprecatingAlias\n @static\n @for @ember/object/computed\n @param {String} dependentKey\n @param {Object} options Options for `deprecate`.\n @return {ComputedProperty} computed property which creates an\n alias with a deprecation to the original value for property.\n @since 1.7.0\n @public\n */\n function deprecatingAlias(dependentKey, options) {\n return (0, _emberMetal.computed)(dependentKey, {\n get: function (key) {\n (true && !(false) && (0, _emberDebug.deprecate)('Usage of `' + key + '` is deprecated, use `' + dependentKey + '` instead.', false, options));\n\n return (0, _emberMetal.get)(this, dependentKey);\n },\n set: function (key, value) {\n (true && !(false) && (0, _emberDebug.deprecate)('Usage of `' + key + '` is deprecated, use `' + dependentKey + '` instead.', false, options));\n\n (0, _emberMetal.set)(this, dependentKey, value);\n return value;\n }\n });\n }\n});","enifed('ember-runtime/computed/reduce_computed_macros', ['exports', 'ember-debug', 'ember-metal', 'ember-runtime/compare', 'ember-runtime/utils', 'ember-runtime/system/native_array'], function (exports, _emberDebug, _emberMetal, _compare, _utils, _native_array) {\n 'use strict';\n\n exports.union = undefined;\n exports.sum = sum;\n exports.max = max;\n exports.min = min;\n exports.map = map;\n exports.mapBy = mapBy;\n exports.filter = filter;\n exports.filterBy = filterBy;\n exports.uniq = uniq;\n exports.uniqBy = uniqBy;\n exports.intersect = intersect;\n exports.setDiff = setDiff;\n exports.collect = collect;\n exports.sort = sort;\n\n\n function reduceMacro(dependentKey, callback, initialValue, name) {\n (true && !(!/[\\[\\]\\{\\}]/g.test(dependentKey)) && (0, _emberDebug.assert)('Dependent key passed to `computed.' + name + '` shouldn\\'t contain brace expanding pattern.', !/[\\[\\]\\{\\}]/g.test(dependentKey)));\n\n\n var cp = new _emberMetal.ComputedProperty(function () {\n var arr = (0, _emberMetal.get)(this, dependentKey);\n if (arr === null || typeof arr !== 'object') {\n return initialValue;\n }\n return arr.reduce(callback, initialValue, this);\n }, { dependentKeys: [dependentKey + '.[]'], readOnly: true });\n\n return cp;\n } /**\n @module @ember/object\n */\n\n\n function arrayMacro(dependentKey, callback) {\n // This is a bit ugly\n var propertyName = void 0;\n if (/@each/.test(dependentKey)) {\n propertyName = dependentKey.replace(/\\.@each.*$/, '');\n } else {\n propertyName = dependentKey;\n dependentKey += '.[]';\n }\n\n var cp = new _emberMetal.ComputedProperty(function () {\n var value = (0, _emberMetal.get)(this, propertyName);\n if ((0, _utils.isArray)(value)) {\n return (0, _native_array.A)(callback.call(this, value));\n } else {\n return (0, _native_array.A)();\n }\n }, { readOnly: true });\n\n cp.property(dependentKey); // this forces to expand properties GH #15855\n\n return cp;\n }\n\n function multiArrayMacro(_dependentKeys, callback, name) {\n (true && !(_dependentKeys.every(function (dependentKey) {\n return !/[\\[\\]\\{\\}]/g.test(dependentKey);\n })) && (0, _emberDebug.assert)('Dependent keys passed to `computed.' + name + '` shouldn\\'t contain brace expanding pattern.', _dependentKeys.every(function (dependentKey) {\n return !/[\\[\\]\\{\\}]/g.test(dependentKey);\n })));\n\n var dependentKeys = _dependentKeys.map(function (key) {\n return key + '.[]';\n });\n\n var cp = new _emberMetal.ComputedProperty(function () {\n return (0, _native_array.A)(callback.call(this, _dependentKeys));\n }, { dependentKeys: dependentKeys, readOnly: true });\n\n return cp;\n }\n\n /**\n A computed property that returns the sum of the values\n in the dependent array.\n \n @method sum\n @for @ember/object/computed\n @static\n @param {String} dependentKey\n @return {ComputedProperty} computes the sum of all values in the dependentKey's array\n @since 1.4.0\n @public\n */\n function sum(dependentKey) {\n return reduceMacro(dependentKey, function (sum, item) {\n return sum + item;\n }, 0, 'sum');\n }\n\n /**\n A computed property that calculates the maximum value in the\n dependent array. This will return `-Infinity` when the dependent\n array is empty.\n \n ```javascript\n import { mapBy, max } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Person = EmberObject.extend({\n childAges: mapBy('children', 'age'),\n maxChildAge: max('childAges')\n });\n \n let lordByron = Person.create({ children: [] });\n \n lordByron.get('maxChildAge'); // -Infinity\n lordByron.get('children').pushObject({\n name: 'Augusta Ada Byron', age: 7\n });\n lordByron.get('maxChildAge'); // 7\n lordByron.get('children').pushObjects([{\n name: 'Allegra Byron',\n age: 5\n }, {\n name: 'Elizabeth Medora Leigh',\n age: 8\n }]);\n lordByron.get('maxChildAge'); // 8\n ```\n \n If the types of the arguments are not numbers,\n they will be converted to numbers and the type\n of the return value will always be `Number`.\n For example, the max of a list of Date objects will be\n the highest timestamp as a `Number`.\n This behavior is consistent with `Math.max`.\n \n @method max\n @for @ember/object/computed\n @static\n @param {String} dependentKey\n @return {ComputedProperty} computes the largest value in the dependentKey's array\n @public\n */\n function max(dependentKey) {\n return reduceMacro(dependentKey, function (max, item) {\n return Math.max(max, item);\n }, -Infinity, 'max');\n }\n\n /**\n A computed property that calculates the minimum value in the\n dependent array. This will return `Infinity` when the dependent\n array is empty.\n \n ```javascript\n import { mapBy, min } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Person = EmberObject.extend({\n childAges: mapBy('children', 'age'),\n minChildAge: min('childAges')\n });\n \n let lordByron = Person.create({ children: [] });\n \n lordByron.get('minChildAge'); // Infinity\n lordByron.get('children').pushObject({\n name: 'Augusta Ada Byron', age: 7\n });\n lordByron.get('minChildAge'); // 7\n lordByron.get('children').pushObjects([{\n name: 'Allegra Byron',\n age: 5\n }, {\n name: 'Elizabeth Medora Leigh',\n age: 8\n }]);\n lordByron.get('minChildAge'); // 5\n ```\n \n If the types of the arguments are not numbers,\n they will be converted to numbers and the type\n of the return value will always be `Number`.\n For example, the min of a list of Date objects will be\n the lowest timestamp as a `Number`.\n This behavior is consistent with `Math.min`.\n \n @method min\n @for @ember/object/computed\n @static\n @param {String} dependentKey\n @return {ComputedProperty} computes the smallest value in the dependentKey's array\n @public\n */\n function min(dependentKey) {\n return reduceMacro(dependentKey, function (min, item) {\n return Math.min(min, item);\n }, Infinity, 'min');\n }\n\n /**\n Returns an array mapped via the callback\n \n The callback method you provide should have the following signature.\n `item` is the current item in the iteration.\n `index` is the integer index of the current item in the iteration.\n \n ```javascript\n function(item, index);\n ```\n \n Example\n \n ```javascript\n import { map } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n excitingChores: map('chores', function(chore, index) {\n return chore.toUpperCase() + '!';\n })\n });\n \n let hamster = Hamster.create({\n chores: ['clean', 'write more unit tests']\n });\n \n hamster.get('excitingChores'); // ['CLEAN!', 'WRITE MORE UNIT TESTS!']\n ```\n \n @method map\n @for @ember/object/computed\n @static\n @param {String} dependentKey\n @param {Function} callback\n @return {ComputedProperty} an array mapped via the callback\n @public\n */\n function map(dependentKey, callback) {\n return arrayMacro(dependentKey, function (value) {\n return value.map(callback, this);\n });\n }\n\n /**\n Returns an array mapped to the specified key.\n \n ```javascript\n import { mapBy } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Person = EmberObject.extend({\n childAges: mapBy('children', 'age')\n });\n \n let lordByron = Person.create({ children: [] });\n \n lordByron.get('childAges'); // []\n lordByron.get('children').pushObject({ name: 'Augusta Ada Byron', age: 7 });\n lordByron.get('childAges'); // [7]\n lordByron.get('children').pushObjects([{\n name: 'Allegra Byron',\n age: 5\n }, {\n name: 'Elizabeth Medora Leigh',\n age: 8\n }]);\n lordByron.get('childAges'); // [7, 5, 8]\n ```\n \n @method mapBy\n @for @ember/object/computed\n @static\n @param {String} dependentKey\n @param {String} propertyKey\n @return {ComputedProperty} an array mapped to the specified key\n @public\n */\n function mapBy(dependentKey, propertyKey) {\n (true && !(typeof propertyKey === 'string') && (0, _emberDebug.assert)('\\`computed.mapBy\\` expects a property string for its second argument, ' + 'perhaps you meant to use \"map\"', typeof propertyKey === 'string'));\n (true && !(!/[\\[\\]\\{\\}]/g.test(dependentKey)) && (0, _emberDebug.assert)('Dependent key passed to `computed.mapBy` shouldn\\'t contain brace expanding pattern.', !/[\\[\\]\\{\\}]/g.test(dependentKey)));\n\n\n return map(dependentKey + '.@each.' + propertyKey, function (item) {\n return (0, _emberMetal.get)(item, propertyKey);\n });\n }\n\n /**\n Filters the array by the callback.\n \n The callback method you provide should have the following signature.\n `item` is the current item in the iteration.\n `index` is the integer index of the current item in the iteration.\n `array` is the dependant array itself.\n \n ```javascript\n function(item, index, array);\n ```\n \n ```javascript\n import { filter } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n remainingChores: filter('chores', function(chore, index, array) {\n return !chore.done;\n })\n });\n \n let hamster = Hamster.create({\n chores: [\n { name: 'cook', done: true },\n { name: 'clean', done: true },\n { name: 'write more unit tests', done: false }\n ]\n });\n \n hamster.get('remainingChores'); // [{name: 'write more unit tests', done: false}]\n ```\n \n You can also use `@each.property` in your dependent key, the callback will still use the underlying array:\n \n ```javascript\n import { A } from '@ember/array';\n import { filter } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n remainingChores: filter('chores.@each.done', function(chore, index, array) {\n return !chore.get('done');\n })\n });\n \n let hamster = Hamster.create({\n chores: A([\n EmberObject.create({ name: 'cook', done: true }),\n EmberObject.create({ name: 'clean', done: true }),\n EmberObject.create({ name: 'write more unit tests', done: false })\n ])\n });\n hamster.get('remainingChores'); // [{name: 'write more unit tests', done: false}]\n hamster.get('chores').objectAt(2).set('done', true);\n hamster.get('remainingChores'); // []\n ```\n \n \n @method filter\n @for @ember/object/computed\n @static\n @param {String} dependentKey\n @param {Function} callback\n @return {ComputedProperty} the filtered array\n @public\n */\n function filter(dependentKey, callback) {\n return arrayMacro(dependentKey, function (value) {\n return value.filter(callback, this);\n });\n }\n\n /**\n Filters the array by the property and value\n \n ```javascript\n import { filterBy } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n remainingChores: filterBy('chores', 'done', false)\n });\n \n let hamster = Hamster.create({\n chores: [\n { name: 'cook', done: true },\n { name: 'clean', done: true },\n { name: 'write more unit tests', done: false }\n ]\n });\n \n hamster.get('remainingChores'); // [{ name: 'write more unit tests', done: false }]\n ```\n \n @method filterBy\n @for @ember/object/computed\n @static\n @param {String} dependentKey\n @param {String} propertyKey\n @param {*} value\n @return {ComputedProperty} the filtered array\n @public\n */\n function filterBy(dependentKey, propertyKey, value) {\n (true && !(!/[\\[\\]\\{\\}]/g.test(dependentKey)) && (0, _emberDebug.assert)('Dependent key passed to `computed.filterBy` shouldn\\'t contain brace expanding pattern.', !/[\\[\\]\\{\\}]/g.test(dependentKey)));\n\n\n var callback = void 0;\n if (arguments.length === 2) {\n callback = function (item) {\n return (0, _emberMetal.get)(item, propertyKey);\n };\n } else {\n callback = function (item) {\n return (0, _emberMetal.get)(item, propertyKey) === value;\n };\n }\n\n return filter(dependentKey + '.@each.' + propertyKey, callback);\n }\n\n /**\n A computed property which returns a new array with all the unique\n elements from one or more dependent arrays.\n \n Example\n \n ```javascript\n import { uniq } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n uniqueFruits: uniq('fruits')\n });\n \n let hamster = Hamster.create({\n fruits: [\n 'banana',\n 'grape',\n 'kale',\n 'banana'\n ]\n });\n \n hamster.get('uniqueFruits'); // ['banana', 'grape', 'kale']\n ```\n \n @method uniq\n @for @ember/object/computed\n @static\n @param {String} propertyKey*\n @return {ComputedProperty} computes a new array with all the\n unique elements from the dependent array\n @public\n */\n function uniq() {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return multiArrayMacro(args, function (dependentKeys) {\n var _this = this;\n\n var uniq = (0, _native_array.A)();\n var seen = new Set();\n\n dependentKeys.forEach(function (dependentKey) {\n var value = (0, _emberMetal.get)(_this, dependentKey);\n if ((0, _utils.isArray)(value)) {\n value.forEach(function (item) {\n if (!seen.has(item)) {\n seen.add(item);\n uniq.push(item);\n }\n });\n }\n });\n\n return uniq;\n }, 'uniq');\n }\n\n /**\n A computed property which returns a new array with all the unique\n elements from an array, with uniqueness determined by specific key.\n \n Example\n \n ```javascript\n import { uniqBy } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n uniqueFruits: uniqBy('fruits', 'id')\n });\n let hamster = Hamster.create({\n fruits: [\n { id: 1, 'banana' },\n { id: 2, 'grape' },\n { id: 3, 'peach' },\n { id: 1, 'banana' }\n ]\n });\n hamster.get('uniqueFruits'); // [ { id: 1, 'banana' }, { id: 2, 'grape' }, { id: 3, 'peach' }]\n ```\n \n @method uniqBy\n @for @ember/object/computed\n @static\n @param {String} dependentKey\n @param {String} propertyKey\n @return {ComputedProperty} computes a new array with all the\n unique elements from the dependent array\n @public\n */\n function uniqBy(dependentKey, propertyKey) {\n (true && !(!/[\\[\\]\\{\\}]/g.test(dependentKey)) && (0, _emberDebug.assert)('Dependent key passed to `computed.uniqBy` shouldn\\'t contain brace expanding pattern.', !/[\\[\\]\\{\\}]/g.test(dependentKey)));\n\n\n var cp = new _emberMetal.ComputedProperty(function () {\n var uniq = (0, _native_array.A)();\n var list = (0, _emberMetal.get)(this, dependentKey);\n if ((0, _utils.isArray)(list)) {\n var seen = new Set();\n list.forEach(function (item) {\n var val = (0, _emberMetal.get)(item, propertyKey);\n if (!seen.has(val)) {\n seen.add(val);\n uniq.push(item);\n }\n });\n }\n return uniq;\n }, { dependentKeys: [dependentKey + '.[]'], readOnly: true });\n\n return cp;\n }\n\n /**\n A computed property which returns a new array with all the unique\n elements from one or more dependent arrays.\n \n Example\n \n ```javascript\n import { union } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n uniqueFruits: union('fruits', 'vegetables')\n });\n \n let hamster = Hamster.create({\n fruits: [\n 'banana',\n 'grape',\n 'kale',\n 'banana',\n 'tomato'\n ],\n vegetables: [\n 'tomato',\n 'carrot',\n 'lettuce'\n ]\n });\n \n hamster.get('uniqueFruits'); // ['banana', 'grape', 'kale', 'tomato', 'carrot', 'lettuce']\n ```\n \n @method union\n @for @ember/object/computed\n @static\n @param {String} propertyKey*\n @return {ComputedProperty} computes a new array with all the\n unique elements from the dependent array\n @public\n */\n var union = exports.union = uniq;\n\n /**\n A computed property which returns a new array with all the elements\n two or more dependent arrays have in common.\n \n Example\n \n ```javascript\n import { intersect } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let obj = EmberObject.extend({\n friendsInCommon: intersect('adaFriends', 'charlesFriends')\n }).create({\n adaFriends: ['Charles Babbage', 'John Hobhouse', 'William King', 'Mary Somerville'],\n charlesFriends: ['William King', 'Mary Somerville', 'Ada Lovelace', 'George Peacock']\n });\n \n obj.get('friendsInCommon'); // ['William King', 'Mary Somerville']\n ```\n \n @method intersect\n @for @ember/object/computed\n @static\n @param {String} propertyKey*\n @return {ComputedProperty} computes a new array with all the\n duplicated elements from the dependent arrays\n @public\n */\n function intersect() {\n for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n return multiArrayMacro(args, function (dependentKeys) {\n var _this2 = this;\n\n var arrays = dependentKeys.map(function (dependentKey) {\n var array = (0, _emberMetal.get)(_this2, dependentKey);\n return (0, _utils.isArray)(array) ? array : [];\n });\n\n var results = arrays.pop().filter(function (candidate) {\n for (var i = 0; i < arrays.length; i++) {\n var found = false;\n var array = arrays[i];\n for (var j = 0; j < array.length; j++) {\n if (array[j] === candidate) {\n found = true;\n break;\n }\n }\n\n if (found === false) {\n return false;\n }\n }\n\n return true;\n }, 'intersect');\n\n return (0, _native_array.A)(results);\n });\n }\n\n /**\n A computed property which returns a new array with all the\n properties from the first dependent array that are not in the second\n dependent array.\n \n Example\n \n ```javascript\n import { setDiff } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n likes: ['banana', 'grape', 'kale'],\n wants: setDiff('likes', 'fruits')\n });\n \n let hamster = Hamster.create({\n fruits: [\n 'grape',\n 'kale',\n ]\n });\n \n hamster.get('wants'); // ['banana']\n ```\n \n @method setDiff\n @for @ember/object/computed\n @static\n @param {String} setAProperty\n @param {String} setBProperty\n @return {ComputedProperty} computes a new array with all the\n items from the first dependent array that are not in the second\n dependent array\n @public\n */\n function setDiff(setAProperty, setBProperty) {\n (true && !(arguments.length === 2) && (0, _emberDebug.assert)('\\`computed.setDiff\\` requires exactly two dependent arrays.', arguments.length === 2));\n (true && !(!/[\\[\\]\\{\\}]/g.test(setAProperty) && !/[\\[\\]\\{\\}]/g.test(setBProperty)) && (0, _emberDebug.assert)('Dependent keys passed to `computed.setDiff` shouldn\\'t contain brace expanding pattern.', !/[\\[\\]\\{\\}]/g.test(setAProperty) && !/[\\[\\]\\{\\}]/g.test(setBProperty)));\n\n\n var cp = new _emberMetal.ComputedProperty(function () {\n var setA = this.get(setAProperty);\n var setB = this.get(setBProperty);\n\n if (!(0, _utils.isArray)(setA)) {\n return (0, _native_array.A)();\n }\n if (!(0, _utils.isArray)(setB)) {\n return (0, _native_array.A)(setA);\n }\n\n return setA.filter(function (x) {\n return setB.indexOf(x) === -1;\n });\n }, {\n dependentKeys: [setAProperty + '.[]', setBProperty + '.[]'],\n readOnly: true\n });\n\n return cp;\n }\n\n /**\n A computed property that returns the array of values\n for the provided dependent properties.\n \n Example\n \n ```javascript\n import { collect } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let Hamster = EmberObject.extend({\n clothes: collect('hat', 'shirt')\n });\n \n let hamster = Hamster.create();\n \n hamster.get('clothes'); // [null, null]\n hamster.set('hat', 'Camp Hat');\n hamster.set('shirt', 'Camp Shirt');\n hamster.get('clothes'); // ['Camp Hat', 'Camp Shirt']\n ```\n \n @method collect\n @for @ember/object/computed\n @static\n @param {String} dependentKey*\n @return {ComputedProperty} computed property which maps\n values of all passed in properties to an array.\n @public\n */\n function collect() {\n for (var _len3 = arguments.length, dependentKeys = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n dependentKeys[_key3] = arguments[_key3];\n }\n\n return multiArrayMacro(dependentKeys, function () {\n var properties = (0, _emberMetal.getProperties)(this, dependentKeys);\n var res = (0, _native_array.A)();\n for (var key in properties) {\n if (properties.hasOwnProperty(key)) {\n if (properties[key] === undefined) {\n res.push(null);\n } else {\n res.push(properties[key]);\n }\n }\n }\n return res;\n }, 'collect');\n }\n\n /**\n A computed property which returns a new array with all the\n properties from the first dependent array sorted based on a property\n or sort function.\n \n The callback method you provide should have the following signature:\n \n ```javascript\n function(itemA, itemB);\n ```\n \n - `itemA` the first item to compare.\n - `itemB` the second item to compare.\n \n This function should return negative number (e.g. `-1`) when `itemA` should come before\n `itemB`. It should return positive number (e.g. `1`) when `itemA` should come after\n `itemB`. If the `itemA` and `itemB` are equal this function should return `0`.\n \n Therefore, if this function is comparing some numeric values, simple `itemA - itemB` or\n `itemA.get( 'foo' ) - itemB.get( 'foo' )` can be used instead of series of `if`.\n \n Example\n \n ```javascript\n import { sort } from '@ember/object/computed';\n import EmberObject from '@ember/object';\n \n let ToDoList = EmberObject.extend({\n // using standard ascending sort\n todosSorting: Object.freeze(['name']),\n sortedTodos: sort('todos', 'todosSorting'),\n \n // using descending sort\n todosSortingDesc: Object.freeze(['name:desc']),\n sortedTodosDesc: sort('todos', 'todosSortingDesc'),\n \n // using a custom sort function\n priorityTodos: sort('todos', function(a, b){\n if (a.priority > b.priority) {\n return 1;\n } else if (a.priority < b.priority) {\n return -1;\n }\n \n return 0;\n })\n });\n \n let todoList = ToDoList.create({todos: [\n { name: 'Unit Test', priority: 2 },\n { name: 'Documentation', priority: 3 },\n { name: 'Release', priority: 1 }\n ]});\n \n todoList.get('sortedTodos'); // [{ name:'Documentation', priority:3 }, { name:'Release', priority:1 }, { name:'Unit Test', priority:2 }]\n todoList.get('sortedTodosDesc'); // [{ name:'Unit Test', priority:2 }, { name:'Release', priority:1 }, { name:'Documentation', priority:3 }]\n todoList.get('priorityTodos'); // [{ name:'Release', priority:1 }, { name:'Unit Test', priority:2 }, { name:'Documentation', priority:3 }]\n ```\n \n @method sort\n @for @ember/object/computed\n @static\n @param {String} itemsKey\n @param {String or Function} sortDefinition a dependent key to an\n array of sort properties (add `:desc` to the arrays sort properties to sort descending) or a function to use when sorting\n @return {ComputedProperty} computes a new sorted array based\n on the sort property array or callback function\n @public\n */\n function sort(itemsKey, sortDefinition) {\n (true && !(arguments.length === 2) && (0, _emberDebug.assert)('\\`computed.sort\\` requires two arguments: an array key to sort and ' + 'either a sort properties key or sort function', arguments.length === 2));\n\n\n if (typeof sortDefinition === 'function') {\n return customSort(itemsKey, sortDefinition);\n } else {\n return propertySort(itemsKey, sortDefinition);\n }\n }\n\n function customSort(itemsKey, comparator) {\n return arrayMacro(itemsKey, function (value) {\n var _this3 = this;\n\n return value.slice().sort(function (x, y) {\n return comparator.call(_this3, x, y);\n });\n });\n }\n\n // This one needs to dynamically set up and tear down observers on the itemsKey\n // depending on the sortProperties\n function propertySort(itemsKey, sortPropertiesKey) {\n var cp = new _emberMetal.ComputedProperty(function (key) {\n var _this4 = this;\n\n var sortProperties = (0, _emberMetal.get)(this, sortPropertiesKey);\n\n (true && !((0, _utils.isArray)(sortProperties) && sortProperties.every(function (s) {\n return typeof s === 'string';\n })) && (0, _emberDebug.assert)('The sort definition for \\'' + key + '\\' on ' + this + ' must be a function or an array of strings', (0, _utils.isArray)(sortProperties) && sortProperties.every(function (s) {\n return typeof s === 'string';\n })));\n\n\n // Add/remove property observers as required.\n var activeObserversMap = cp._activeObserverMap || (cp._activeObserverMap = new WeakMap());\n var activeObservers = activeObserversMap.get(this);\n\n if (activeObservers !== undefined) {\n activeObservers.forEach(function (args) {\n return _emberMetal.removeObserver.apply(undefined, args);\n });\n }\n\n function sortPropertyDidChange() {\n this.notifyPropertyChange(key);\n }\n\n var itemsKeyIsAtThis = itemsKey === '@this';\n var normalizedSortProperties = normalizeSortProperties(sortProperties);\n activeObservers = normalizedSortProperties.map(function (_ref) {\n var prop = _ref[0];\n\n var path = itemsKeyIsAtThis ? '@each.' + prop : itemsKey + '.@each.' + prop;\n (0, _emberMetal.addObserver)(_this4, path, sortPropertyDidChange);\n return [_this4, path, sortPropertyDidChange];\n });\n\n activeObserversMap.set(this, activeObservers);\n\n var items = itemsKeyIsAtThis ? this : (0, _emberMetal.get)(this, itemsKey);\n if (!(0, _utils.isArray)(items)) {\n return (0, _native_array.A)();\n }\n\n return sortByNormalizedSortProperties(items, normalizedSortProperties);\n }, { dependentKeys: [sortPropertiesKey + '.[]'], readOnly: true });\n\n cp._activeObserverMap = undefined;\n\n return cp;\n }\n\n function normalizeSortProperties(sortProperties) {\n return sortProperties.map(function (p) {\n var _p$split = p.split(':'),\n prop = _p$split[0],\n direction = _p$split[1];\n\n direction = direction || 'asc';\n\n return [prop, direction];\n });\n }\n\n function sortByNormalizedSortProperties(items, normalizedSortProperties) {\n return (0, _native_array.A)(items.slice().sort(function (itemA, itemB) {\n for (var i = 0; i < normalizedSortProperties.length; i++) {\n var _normalizedSortProper = normalizedSortProperties[i],\n prop = _normalizedSortProper[0],\n direction = _normalizedSortProper[1];\n\n var result = (0, _compare.default)((0, _emberMetal.get)(itemA, prop), (0, _emberMetal.get)(itemB, prop));\n if (result !== 0) {\n return direction === 'desc' ? -1 * result : result;\n }\n }\n return 0;\n }));\n }\n});","enifed('ember-runtime/controllers/controller', ['exports', 'ember-debug', 'ember-runtime/system/object', 'ember-runtime/mixins/controller', 'ember-runtime/inject'], function (exports, _emberDebug, _object, _controller, _inject) {\n 'use strict';\n\n /**\n @module @ember/controller\n */\n\n /**\n @class Controller\n @extends EmberObject\n @uses Ember.ControllerMixin\n @public\n */\n var Controller = _object.default.extend(_controller.default);\n\n function controllerInjectionHelper(factory) {\n (true && !(_controller.default.detect(factory.PrototypeMixin)) && (0, _emberDebug.assert)('Defining an injected controller property on a ' + 'non-controller is not allowed.', _controller.default.detect(factory.PrototypeMixin)));\n }\n\n /**\n Creates a property that lazily looks up another controller in the container.\n Can only be used when defining another controller.\n \n Example:\n \n ```app/controllers/post.js\n import Controller, {\n inject as controller\n } from '@ember/controller';\n \n export default Controller.extend({\n posts: controller()\n });\n ```\n \n This example will create a `posts` property on the `post` controller that\n looks up the `posts` controller in the container, making it easy to\n reference other controllers.\n \n @method inject\n @static\n @for @ember/controller\n @since 1.10.0\n @param {String} name (optional) name of the controller to inject, defaults\n to the property's name\n @return {Ember.InjectedProperty} injection descriptor instance\n @public\n */\n (0, _inject.createInjectionHelper)('controller', controllerInjectionHelper);\n\n exports.default = Controller;\n});","enifed('ember-runtime/copy', ['exports', 'ember-debug', 'ember-runtime/system/object', 'ember-runtime/mixins/copyable'], function (exports, _emberDebug, _object, _copyable) {\n 'use strict';\n\n exports.default = copy;\n\n /**\n @module @ember/object\n */\n function _copy(obj, deep, seen, copies) {\n var ret = void 0,\n loc = void 0,\n key = void 0;\n\n // primitive data types are immutable, just return them.\n if (typeof obj !== 'object' || obj === null) {\n return obj;\n }\n\n // avoid cyclical loops\n if (deep && (loc = seen.indexOf(obj)) >= 0) {\n return copies[loc];\n }\n\n (true && !(!(obj instanceof _object.default) || _copyable.default && _copyable.default.detect(obj)) && (0, _emberDebug.assert)('Cannot clone an EmberObject that does not implement Copyable', !(obj instanceof _object.default) || _copyable.default && _copyable.default.detect(obj)));\n\n\n // IMPORTANT: this specific test will detect a native array only. Any other\n // object will need to implement Copyable.\n if (Array.isArray(obj)) {\n ret = obj.slice();\n\n if (deep) {\n loc = ret.length;\n\n while (--loc >= 0) {\n ret[loc] = _copy(ret[loc], deep, seen, copies);\n }\n }\n } else if (_copyable.default && _copyable.default.detect(obj)) {\n ret = obj.copy(deep, seen, copies);\n } else if (obj instanceof Date) {\n ret = new Date(obj.getTime());\n } else {\n ret = {};\n\n for (key in obj) {\n // support Null prototype\n if (!Object.prototype.hasOwnProperty.call(obj, key)) {\n continue;\n }\n\n // Prevents browsers that don't respect non-enumerability from\n // copying internal Ember properties\n if (key.substring(0, 2) === '__') {\n continue;\n }\n\n ret[key] = deep ? _copy(obj[key], deep, seen, copies) : obj[key];\n }\n }\n\n if (deep) {\n seen.push(obj);\n copies.push(ret);\n }\n\n return ret;\n }\n\n /**\n Creates a shallow copy of the passed object. A deep copy of the object is\n returned if the optional `deep` argument is `true`.\n \n If the passed object implements the `Copyable` interface, then this\n function will delegate to the object's `copy()` method and return the\n result. See `Copyable` for further details.\n \n For primitive values (which are immutable in JavaScript), the passed object\n is simply returned.\n \n @method copy\n @static\n @for @ember/object/internals\n @param {Object} obj The object to clone\n @param {Boolean} [deep=false] If true, a deep copy of the object is made.\n @return {Object} The copied object\n @public\n */\n function copy(obj, deep) {\n // fast paths\n if ('object' !== typeof obj || obj === null) {\n return obj; // can't copy primitives\n }\n\n if (_copyable.default && _copyable.default.detect(obj)) {\n return obj.copy(deep);\n }\n\n return _copy(obj, deep, deep ? [] : null, deep ? [] : null);\n }\n});","enifed('ember-runtime/ext/function', ['ember-environment', 'ember-metal', 'ember-debug'], function (_emberEnvironment, _emberMetal, _emberDebug) {\n 'use strict';\n\n var FunctionPrototype = Function.prototype; /**\n @module ember\n */\n\n if (_emberEnvironment.ENV.EXTEND_PROTOTYPES.Function) {\n /**\n The `property` extension of Javascript's Function prototype is available\n when `EmberENV.EXTEND_PROTOTYPES` or `EmberENV.EXTEND_PROTOTYPES.Function` is\n `true`, which is the default.\n Computed properties allow you to treat a function like a property:\n ```app/utils/president.js\n import EmberObject from '@ember/object';\n export default EmberObject.extend({\n firstName: '',\n lastName: '',\n fullName: function() {\n return this.get('firstName') + ' ' + this.get('lastName');\n }.property() // Call this flag to mark the function as a property\n });\n ```\n ```javascript\n let president = President.create({\n firstName: 'Barack',\n lastName: 'Obama'\n });\n president.get('fullName'); // 'Barack Obama'\n ```\n Treating a function like a property is useful because they can work with\n bindings, just like any other property.\n Many computed properties have dependencies on other properties. For\n example, in the above example, the `fullName` property depends on\n `firstName` and `lastName` to determine its value. You can tell Ember\n about these dependencies like this:\n ```app/utils/president.js\n import EmberObject from '@ember/object';\n export default EmberObject.extend({\n firstName: '',\n lastName: '',\n fullName: function() {\n return this.get('firstName') + ' ' + this.get('lastName');\n // Tell Ember.js that this computed property depends on firstName\n // and lastName\n }.property('firstName', 'lastName')\n });\n ```\n Make sure you list these dependencies so Ember knows when to update\n bindings that connect to a computed property. Changing a dependency\n will not immediately trigger an update of the computed property, but\n will instead clear the cache so that it is updated when the next `get`\n is called on the property.\n See [ComputedProperty](/api/ember/release/classes/ComputedProperty), [@ember/object/computed](/api/ember/release/classes/@ember%2Fobject%2Fcomputed).\n @method property\n @for Function\n @public\n */\n Object.defineProperty(FunctionPrototype, 'property', {\n configurable: true,\n enumerable: false,\n writable: true,\n value: function () {\n return _emberMetal.computed.apply(undefined, Array.prototype.slice.call(arguments).concat([this]));\n }\n });\n\n /**\n The `observes` extension of Javascript's Function prototype is available\n when `EmberENV.EXTEND_PROTOTYPES` or `EmberENV.EXTEND_PROTOTYPES.Function` is\n true, which is the default.\n You can observe property changes simply by adding the `observes`\n call to the end of your method declarations in classes that you write.\n For example:\n ```javascript\n import EmberObject from '@ember/object';\n EmberObject.extend({\n valueObserver: function() {\n // Executes whenever the \"value\" property changes\n }.observes('value')\n });\n ```\n In the future this method may become asynchronous.\n See `observer`.\n @method observes\n @for Function\n @public\n */\n Object.defineProperty(FunctionPrototype, 'observes', {\n configurable: true,\n enumerable: false,\n writable: true,\n value: function () {\n return _emberMetal.observer.apply(undefined, Array.prototype.slice.call(arguments).concat([this]));\n }\n });\n\n Object.defineProperty(FunctionPrototype, '_observesImmediately', {\n configurable: true,\n enumerable: false,\n writable: true,\n value: function () {\n (true && !(function checkIsInternalProperty() {\n for (var i = 0; i < arguments.length; i++) {\n if (arguments[i].indexOf('.') !== -1) {\n return false;\n }\n }\n return true;\n }) && (0, _emberDebug.assert)('Immediate observers must observe internal properties only, ' + 'not properties on other objects.', function checkIsInternalProperty() {\n for (var i = 0; i < arguments.length; i++) {\n if (arguments[i].indexOf('.') !== -1) {\n return false;\n }\n }return true;\n }));\n\n\n // observes handles property expansion\n return this.observes.apply(this, arguments);\n }\n });\n\n /**\n The `on` extension of Javascript's Function prototype is available\n when `EmberENV.EXTEND_PROTOTYPES` or `EmberENV.EXTEND_PROTOTYPES.Function` is\n true, which is the default.\n You can listen for events simply by adding the `on` call to the end of\n your method declarations in classes or mixins that you write. For example:\n ```javascript\n import Mixin from '@ember/mixin';\n Mixin.create({\n doSomethingWithElement: function() {\n // Executes whenever the \"didInsertElement\" event fires\n }.on('didInsertElement')\n });\n ```\n See `@ember/object/evented/on`.\n @method on\n @for Function\n @public\n */\n\n Object.defineProperty(FunctionPrototype, 'on', {\n configurable: true,\n enumerable: false,\n writable: true,\n value: function () {\n return _emberMetal.on.apply(undefined, Array.prototype.slice.call(arguments).concat([this]));\n }\n });\n }\n});","enifed('ember-runtime/ext/rsvp', ['exports', 'rsvp', 'ember-metal', 'ember-debug'], function (exports, _rsvp, _emberMetal, _emberDebug) {\n 'use strict';\n\n exports.onerrorDefault = onerrorDefault;\n\n\n var backburner = _emberMetal.run.backburner;\n _emberMetal.run._addQueue('rsvpAfter', 'destroy');\n\n _rsvp.configure('async', function (callback, promise) {\n backburner.schedule('actions', null, callback, promise);\n });\n\n _rsvp.configure('after', function (cb) {\n backburner.schedule('rsvpAfter', null, cb);\n });\n\n _rsvp.on('error', onerrorDefault);\n\n function onerrorDefault(reason) {\n var error = errorFor(reason);\n if (error) {\n var overrideDispatch = (0, _emberMetal.getDispatchOverride)();\n if (overrideDispatch) {\n overrideDispatch(error);\n } else {\n throw error;\n }\n }\n }\n\n function errorFor(reason) {\n if (!reason) return;\n\n if (reason.errorThrown) {\n return unwrapErrorThrown(reason);\n }\n\n if (reason.name === 'UnrecognizedURLError') {\n (true && !(false) && (0, _emberDebug.assert)('The URL \\'' + reason.message + '\\' did not match any routes in your application', false));\n\n return;\n }\n\n if (reason.name === 'TransitionAborted') {\n return;\n }\n\n return reason;\n }\n\n function unwrapErrorThrown(reason) {\n var error = reason.errorThrown;\n if (typeof error === 'string') {\n error = new Error(error);\n }\n Object.defineProperty(error, '__reason_with_error_thrown__', {\n value: reason,\n enumerable: false\n });\n return error;\n }\n\n exports.default = _rsvp;\n});","enifed('ember-runtime/ext/string', ['ember-environment', 'ember-runtime/system/string'], function (_emberEnvironment, _string) {\n 'use strict';\n\n /**\n @module @ember/string\n */\n\n var StringPrototype = String.prototype;\n\n if (_emberEnvironment.ENV.EXTEND_PROTOTYPES.String) {\n /**\n See [String.w](/api/ember/release/classes/String/methods/w?anchor=w).\n @method w\n @for @ember/string\n @static\n @private\n */\n Object.defineProperty(StringPrototype, 'w', {\n configurable: true,\n enumerable: false,\n writeable: true,\n value: function () {\n return (0, _string.w)(this);\n }\n });\n\n /**\n See [String.loc](/api/ember/release/classes/String/methods/loc?anchor=loc).\n @method loc\n @for @ember/string\n @static\n @private\n */\n Object.defineProperty(StringPrototype, 'loc', {\n configurable: true,\n enumerable: false,\n writeable: true,\n value: function () {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return (0, _string.loc)(this, args);\n }\n });\n\n /**\n See [String.camelize](/api/ember/release/classes/String/methods/camelize?anchor=camelize).\n @method camelize\n @for @ember/string\n @static\n @private\n */\n Object.defineProperty(StringPrototype, 'camelize', {\n configurable: true,\n enumerable: false,\n writeable: true,\n value: function () {\n return (0, _string.camelize)(this);\n }\n });\n\n /**\n See [String.decamelize](/api/ember/release/classes/String/methods/decamelize?anchor=decamelize).\n @method decamelize\n @for @ember/string\n @static\n @private\n */\n Object.defineProperty(StringPrototype, 'decamelize', {\n configurable: true,\n enumerable: false,\n writeable: true,\n value: function () {\n return (0, _string.decamelize)(this);\n }\n });\n\n /**\n See [String.dasherize](/api/ember/release/classes/String/methods/dasherize?anchor=dasherize).\n @method dasherize\n @for @ember/string\n @static\n @private\n */\n Object.defineProperty(StringPrototype, 'dasherize', {\n configurable: true,\n enumerable: false,\n writeable: true,\n value: function () {\n return (0, _string.dasherize)(this);\n }\n });\n\n /**\n See [String.underscore](/api/ember/release/classes/String/methods/underscore?anchor=underscore).\n @method underscore\n @for @ember/string\n @static\n @private\n */\n Object.defineProperty(StringPrototype, 'underscore', {\n configurable: true,\n enumerable: false,\n writeable: true,\n value: function () {\n return (0, _string.underscore)(this);\n }\n });\n\n /**\n See [String.classify](/api/ember/release/classes/String/methods/classify?anchor=classify).\n @method classify\n @for @ember/string\n @static\n @private\n */\n Object.defineProperty(StringPrototype, 'classify', {\n configurable: true,\n enumerable: false,\n writeable: true,\n value: function () {\n return (0, _string.classify)(this);\n }\n });\n\n /**\n See [String.capitalize](/api/ember/release/classes/String/methods/capitalize?anchor=capitalize).\n @method capitalize\n @for @ember/string\n @static\n @private\n */\n Object.defineProperty(StringPrototype, 'capitalize', {\n configurable: true,\n enumerable: false,\n writeable: true,\n value: function () {\n return (0, _string.capitalize)(this);\n }\n });\n }\n});","enifed('ember-runtime/index', ['exports', 'ember-runtime/system/object', 'ember-runtime/system/string', 'ember-runtime/mixins/registry_proxy', 'ember-runtime/mixins/container_proxy', 'ember-runtime/copy', 'ember-runtime/inject', 'ember-runtime/compare', 'ember-runtime/is-equal', 'ember-runtime/mixins/array', 'ember-runtime/mixins/comparable', 'ember-runtime/system/namespace', 'ember-runtime/system/array_proxy', 'ember-runtime/system/object_proxy', 'ember-runtime/system/core_object', 'ember-runtime/system/native_array', 'ember-runtime/mixins/action_handler', 'ember-runtime/mixins/copyable', 'ember-runtime/mixins/enumerable', 'ember-runtime/mixins/-proxy', 'ember-runtime/system/lazy_load', 'ember-runtime/mixins/observable', 'ember-runtime/mixins/mutable_enumerable', 'ember-runtime/mixins/mutable_array', 'ember-runtime/mixins/target_action_support', 'ember-runtime/mixins/evented', 'ember-runtime/mixins/promise_proxy', 'ember-runtime/computed/computed_macros', 'ember-runtime/computed/reduce_computed_macros', 'ember-runtime/controllers/controller', 'ember-runtime/mixins/controller', 'ember-runtime/system/service', 'ember-runtime/ext/rsvp', 'ember-runtime/utils', 'ember-runtime/string_registry', 'ember-runtime/ext/string', 'ember-runtime/ext/function'], function (exports, _object, _string, _registry_proxy, _container_proxy, _copy, _inject, _compare, _isEqual, _array, _comparable, _namespace, _array_proxy, _object_proxy, _core_object, _native_array, _action_handler, _copyable, _enumerable, _proxy, _lazy_load, _observable, _mutable_enumerable, _mutable_array, _target_action_support, _evented, _promise_proxy, _computed_macros, _reduce_computed_macros, _controller, _controller2, _service, _rsvp, _utils, _string_registry) {\n 'use strict';\n\n exports.setStrings = exports.getStrings = exports.typeOf = exports.isArray = exports.onerrorDefault = exports.RSVP = exports.Service = exports.ControllerMixin = exports.Controller = exports.collect = exports.intersect = exports.union = exports.uniqBy = exports.uniq = exports.filterBy = exports.filter = exports.mapBy = exports.setDiff = exports.sort = exports.map = exports.max = exports.min = exports.sum = exports.or = exports.and = exports.deprecatingAlias = exports.readOnly = exports.oneWay = exports.lte = exports.lt = exports.gte = exports.gt = exports.equal = exports.match = exports.bool = exports.not = exports.none = exports.notEmpty = exports.empty = exports.PromiseProxyMixin = exports.Evented = exports.TargetActionSupport = exports.removeAt = exports.MutableArray = exports.MutableEnumerable = exports.Observable = exports._loaded = exports.runLoadHooks = exports.onLoad = exports._ProxyMixin = exports.Enumerable = exports.Copyable = exports.ActionHandler = exports.A = exports.NativeArray = exports.CoreObject = exports.ObjectProxy = exports.ArrayProxy = exports.setNamespaceSearchDisabled = exports.isNamespaceSearchDisabled = exports.Namespace = exports.Comparable = exports.removeArrayObserver = exports.addArrayObserver = exports.isEmberArray = exports.objectAt = exports.Array = exports.isEqual = exports.compare = exports.inject = exports.copy = exports.ContainerProxyMixin = exports.RegistryProxyMixin = exports.String = exports.FrameworkObject = exports.Object = undefined;\n Object.defineProperty(exports, 'Object', {\n enumerable: true,\n get: function () {\n return _object.default;\n }\n });\n Object.defineProperty(exports, 'FrameworkObject', {\n enumerable: true,\n get: function () {\n return _object.FrameworkObject;\n }\n });\n Object.defineProperty(exports, 'String', {\n enumerable: true,\n get: function () {\n return _string.default;\n }\n });\n Object.defineProperty(exports, 'RegistryProxyMixin', {\n enumerable: true,\n get: function () {\n return _registry_proxy.default;\n }\n });\n Object.defineProperty(exports, 'ContainerProxyMixin', {\n enumerable: true,\n get: function () {\n return _container_proxy.default;\n }\n });\n Object.defineProperty(exports, 'copy', {\n enumerable: true,\n get: function () {\n return _copy.default;\n }\n });\n Object.defineProperty(exports, 'inject', {\n enumerable: true,\n get: function () {\n return _inject.default;\n }\n });\n Object.defineProperty(exports, 'compare', {\n enumerable: true,\n get: function () {\n return _compare.default;\n }\n });\n Object.defineProperty(exports, 'isEqual', {\n enumerable: true,\n get: function () {\n return _isEqual.default;\n }\n });\n Object.defineProperty(exports, 'Array', {\n enumerable: true,\n get: function () {\n return _array.default;\n }\n });\n Object.defineProperty(exports, 'objectAt', {\n enumerable: true,\n get: function () {\n return _array.objectAt;\n }\n });\n Object.defineProperty(exports, 'isEmberArray', {\n enumerable: true,\n get: function () {\n return _array.isEmberArray;\n }\n });\n Object.defineProperty(exports, 'addArrayObserver', {\n enumerable: true,\n get: function () {\n return _array.addArrayObserver;\n }\n });\n Object.defineProperty(exports, 'removeArrayObserver', {\n enumerable: true,\n get: function () {\n return _array.removeArrayObserver;\n }\n });\n Object.defineProperty(exports, 'Comparable', {\n enumerable: true,\n get: function () {\n return _comparable.default;\n }\n });\n Object.defineProperty(exports, 'Namespace', {\n enumerable: true,\n get: function () {\n return _namespace.default;\n }\n });\n Object.defineProperty(exports, 'isNamespaceSearchDisabled', {\n enumerable: true,\n get: function () {\n return _namespace.isSearchDisabled;\n }\n });\n Object.defineProperty(exports, 'setNamespaceSearchDisabled', {\n enumerable: true,\n get: function () {\n return _namespace.setSearchDisabled;\n }\n });\n Object.defineProperty(exports, 'ArrayProxy', {\n enumerable: true,\n get: function () {\n return _array_proxy.default;\n }\n });\n Object.defineProperty(exports, 'ObjectProxy', {\n enumerable: true,\n get: function () {\n return _object_proxy.default;\n }\n });\n Object.defineProperty(exports, 'CoreObject', {\n enumerable: true,\n get: function () {\n return _core_object.default;\n }\n });\n Object.defineProperty(exports, 'NativeArray', {\n enumerable: true,\n get: function () {\n return _native_array.default;\n }\n });\n Object.defineProperty(exports, 'A', {\n enumerable: true,\n get: function () {\n return _native_array.A;\n }\n });\n Object.defineProperty(exports, 'ActionHandler', {\n enumerable: true,\n get: function () {\n return _action_handler.default;\n }\n });\n Object.defineProperty(exports, 'Copyable', {\n enumerable: true,\n get: function () {\n return _copyable.default;\n }\n });\n Object.defineProperty(exports, 'Enumerable', {\n enumerable: true,\n get: function () {\n return _enumerable.default;\n }\n });\n Object.defineProperty(exports, '_ProxyMixin', {\n enumerable: true,\n get: function () {\n return _proxy.default;\n }\n });\n Object.defineProperty(exports, 'onLoad', {\n enumerable: true,\n get: function () {\n return _lazy_load.onLoad;\n }\n });\n Object.defineProperty(exports, 'runLoadHooks', {\n enumerable: true,\n get: function () {\n return _lazy_load.runLoadHooks;\n }\n });\n Object.defineProperty(exports, '_loaded', {\n enumerable: true,\n get: function () {\n return _lazy_load._loaded;\n }\n });\n Object.defineProperty(exports, 'Observable', {\n enumerable: true,\n get: function () {\n return _observable.default;\n }\n });\n Object.defineProperty(exports, 'MutableEnumerable', {\n enumerable: true,\n get: function () {\n return _mutable_enumerable.default;\n }\n });\n Object.defineProperty(exports, 'MutableArray', {\n enumerable: true,\n get: function () {\n return _mutable_array.default;\n }\n });\n Object.defineProperty(exports, 'removeAt', {\n enumerable: true,\n get: function () {\n return _mutable_array.removeAt;\n }\n });\n Object.defineProperty(exports, 'TargetActionSupport', {\n enumerable: true,\n get: function () {\n return _target_action_support.default;\n }\n });\n Object.defineProperty(exports, 'Evented', {\n enumerable: true,\n get: function () {\n return _evented.default;\n }\n });\n Object.defineProperty(exports, 'PromiseProxyMixin', {\n enumerable: true,\n get: function () {\n return _promise_proxy.default;\n }\n });\n Object.defineProperty(exports, 'empty', {\n enumerable: true,\n get: function () {\n return _computed_macros.empty;\n }\n });\n Object.defineProperty(exports, 'notEmpty', {\n enumerable: true,\n get: function () {\n return _computed_macros.notEmpty;\n }\n });\n Object.defineProperty(exports, 'none', {\n enumerable: true,\n get: function () {\n return _computed_macros.none;\n }\n });\n Object.defineProperty(exports, 'not', {\n enumerable: true,\n get: function () {\n return _computed_macros.not;\n }\n });\n Object.defineProperty(exports, 'bool', {\n enumerable: true,\n get: function () {\n return _computed_macros.bool;\n }\n });\n Object.defineProperty(exports, 'match', {\n enumerable: true,\n get: function () {\n return _computed_macros.match;\n }\n });\n Object.defineProperty(exports, 'equal', {\n enumerable: true,\n get: function () {\n return _computed_macros.equal;\n }\n });\n Object.defineProperty(exports, 'gt', {\n enumerable: true,\n get: function () {\n return _computed_macros.gt;\n }\n });\n Object.defineProperty(exports, 'gte', {\n enumerable: true,\n get: function () {\n return _computed_macros.gte;\n }\n });\n Object.defineProperty(exports, 'lt', {\n enumerable: true,\n get: function () {\n return _computed_macros.lt;\n }\n });\n Object.defineProperty(exports, 'lte', {\n enumerable: true,\n get: function () {\n return _computed_macros.lte;\n }\n });\n Object.defineProperty(exports, 'oneWay', {\n enumerable: true,\n get: function () {\n return _computed_macros.oneWay;\n }\n });\n Object.defineProperty(exports, 'readOnly', {\n enumerable: true,\n get: function () {\n return _computed_macros.readOnly;\n }\n });\n Object.defineProperty(exports, 'deprecatingAlias', {\n enumerable: true,\n get: function () {\n return _computed_macros.deprecatingAlias;\n }\n });\n Object.defineProperty(exports, 'and', {\n enumerable: true,\n get: function () {\n return _computed_macros.and;\n }\n });\n Object.defineProperty(exports, 'or', {\n enumerable: true,\n get: function () {\n return _computed_macros.or;\n }\n });\n Object.defineProperty(exports, 'sum', {\n enumerable: true,\n get: function () {\n return _reduce_computed_macros.sum;\n }\n });\n Object.defineProperty(exports, 'min', {\n enumerable: true,\n get: function () {\n return _reduce_computed_macros.min;\n }\n });\n Object.defineProperty(exports, 'max', {\n enumerable: true,\n get: function () {\n return _reduce_computed_macros.max;\n }\n });\n Object.defineProperty(exports, 'map', {\n enumerable: true,\n get: function () {\n return _reduce_computed_macros.map;\n }\n });\n Object.defineProperty(exports, 'sort', {\n enumerable: true,\n get: function () {\n return _reduce_computed_macros.sort;\n }\n });\n Object.defineProperty(exports, 'setDiff', {\n enumerable: true,\n get: function () {\n return _reduce_computed_macros.setDiff;\n }\n });\n Object.defineProperty(exports, 'mapBy', {\n enumerable: true,\n get: function () {\n return _reduce_computed_macros.mapBy;\n }\n });\n Object.defineProperty(exports, 'filter', {\n enumerable: true,\n get: function () {\n return _reduce_computed_macros.filter;\n }\n });\n Object.defineProperty(exports, 'filterBy', {\n enumerable: true,\n get: function () {\n return _reduce_computed_macros.filterBy;\n }\n });\n Object.defineProperty(exports, 'uniq', {\n enumerable: true,\n get: function () {\n return _reduce_computed_macros.uniq;\n }\n });\n Object.defineProperty(exports, 'uniqBy', {\n enumerable: true,\n get: function () {\n return _reduce_computed_macros.uniqBy;\n }\n });\n Object.defineProperty(exports, 'union', {\n enumerable: true,\n get: function () {\n return _reduce_computed_macros.union;\n }\n });\n Object.defineProperty(exports, 'intersect', {\n enumerable: true,\n get: function () {\n return _reduce_computed_macros.intersect;\n }\n });\n Object.defineProperty(exports, 'collect', {\n enumerable: true,\n get: function () {\n return _reduce_computed_macros.collect;\n }\n });\n Object.defineProperty(exports, 'Controller', {\n enumerable: true,\n get: function () {\n return _controller.default;\n }\n });\n Object.defineProperty(exports, 'ControllerMixin', {\n enumerable: true,\n get: function () {\n return _controller2.default;\n }\n });\n Object.defineProperty(exports, 'Service', {\n enumerable: true,\n get: function () {\n return _service.default;\n }\n });\n Object.defineProperty(exports, 'RSVP', {\n enumerable: true,\n get: function () {\n return _rsvp.default;\n }\n });\n Object.defineProperty(exports, 'onerrorDefault', {\n enumerable: true,\n get: function () {\n return _rsvp.onerrorDefault;\n }\n });\n Object.defineProperty(exports, 'isArray', {\n enumerable: true,\n get: function () {\n return _utils.isArray;\n }\n });\n Object.defineProperty(exports, 'typeOf', {\n enumerable: true,\n get: function () {\n return _utils.typeOf;\n }\n });\n Object.defineProperty(exports, 'getStrings', {\n enumerable: true,\n get: function () {\n return _string_registry.getStrings;\n }\n });\n Object.defineProperty(exports, 'setStrings', {\n enumerable: true,\n get: function () {\n return _string_registry.setStrings;\n }\n });\n});","enifed('ember-runtime/inject', ['exports', 'ember-metal', 'ember-debug'], function (exports, _emberMetal, _emberDebug) {\n 'use strict';\n\n exports.default = inject;\n exports.createInjectionHelper = createInjectionHelper;\n exports.validatePropertyInjections = validatePropertyInjections;\n\n\n /**\n Namespace for injection helper methods.\n \n @class inject\n @namespace Ember\n @static\n @public\n */\n function inject() {\n (true && !(false) && (0, _emberDebug.assert)('Injected properties must be created through helpers, see \\'' + Object.keys(inject).map(function (k) {\n return '\\'inject.' + k + '\\'';\n }).join(' or ') + '\\''));\n }\n\n // Dictionary of injection validations by type, added to by `createInjectionHelper`\n var typeValidators = {};\n\n /**\n This method allows other Ember modules to register injection helpers for a\n given container type. Helpers are exported to the `inject` namespace as the\n container type itself.\n \n @private\n @method createInjectionHelper\n @since 1.10.0\n @for Ember\n @param {String} type The container type the helper will inject\n @param {Function} validator A validation callback that is executed at mixin-time\n */\n function createInjectionHelper(type, validator) {\n typeValidators[type] = validator;\n\n inject[type] = function (name) {\n return new _emberMetal.InjectedProperty(type, name);\n };\n }\n\n /**\n Validation function that runs per-type validation functions once for each\n injected type encountered.\n \n @private\n @method validatePropertyInjections\n @since 1.10.0\n @for Ember\n @param {Object} factory The factory object\n */\n function validatePropertyInjections(factory) {\n var proto = factory.proto();\n var types = [];\n\n for (var key in proto) {\n var desc = (0, _emberMetal.descriptorFor)(proto, key);\n if (desc instanceof _emberMetal.InjectedProperty && types.indexOf(desc.type) === -1) {\n types.push(desc.type);\n }\n }\n\n if (types.length) {\n for (var i = 0; i < types.length; i++) {\n var validator = typeValidators[types[i]];\n\n if (typeof validator === 'function') {\n validator(factory);\n }\n }\n }\n\n return true;\n }\n});","enifed('ember-runtime/is-equal', ['exports'], function (exports) {\n 'use strict';\n\n exports.default = isEqual;\n /**\n @module @ember/utils\n */\n /**\n Compares two objects, returning true if they are equal.\n \n ```javascript\n import { isEqual } from '@ember/utils';\n \n isEqual('hello', 'hello'); // true\n isEqual(1, 2); // false\n ```\n \n `isEqual` is a more specific comparison than a triple equal comparison.\n It will call the `isEqual` instance method on the objects being\n compared, allowing finer control over when objects should be considered\n equal to each other.\n \n ```javascript\n import { isEqual } from '@ember/utils';\n import EmberObject from '@ember/object';\n \n let Person = EmberObject.extend({\n isEqual(other) { return this.ssn == other.ssn; }\n });\n \n let personA = Person.create({name: 'Muhammad Ali', ssn: '123-45-6789'});\n let personB = Person.create({name: 'Cassius Clay', ssn: '123-45-6789'});\n \n isEqual(personA, personB); // true\n ```\n \n Due to the expense of array comparisons, collections will never be equal to\n each other even if each of their items are equal to each other.\n \n ```javascript\n import { isEqual } from '@ember/utils';\n \n isEqual([4, 2], [4, 2]); // false\n ```\n \n @method isEqual\n @for @ember/utils\n @static\n @param {Object} a first object to compare\n @param {Object} b second object to compare\n @return {Boolean}\n @public\n */\n function isEqual(a, b) {\n if (a && typeof a.isEqual === 'function') {\n return a.isEqual(b);\n }\n\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n\n return a === b;\n }\n});","enifed('ember-runtime/mixins/-proxy', ['exports', 'ember-babel', '@glimmer/reference', 'ember-metal', 'ember-debug', 'ember-runtime/computed/computed_macros'], function (exports, _emberBabel, _reference, _emberMetal, _emberDebug, _computed_macros) {\n 'use strict';\n\n /**\n @module ember\n */\n\n function contentPropertyWillChange(content, contentKey) {\n var key = contentKey.slice(8); // remove \"content.\"\n if (key in this) {\n return;\n } // if shadowed in proxy\n (0, _emberMetal.propertyWillChange)(this, key);\n }\n\n function contentPropertyDidChange(content, contentKey) {\n var key = contentKey.slice(8); // remove \"content.\"\n if (key in this) {\n return;\n } // if shadowed in proxy\n (0, _emberMetal.propertyDidChange)(this, key);\n }\n\n var ProxyTag = function (_CachedTag) {\n (0, _emberBabel.inherits)(ProxyTag, _CachedTag);\n\n function ProxyTag(proxy) {\n (0, _emberBabel.classCallCheck)(this, ProxyTag);\n\n var _this = (0, _emberBabel.possibleConstructorReturn)(this, _CachedTag.call(this));\n\n var content = (0, _emberMetal.get)(proxy, 'content');\n\n _this.proxy = proxy;\n _this.proxyWrapperTag = new _reference.DirtyableTag();\n _this.proxyContentTag = new _reference.UpdatableTag((0, _emberMetal.tagFor)(content));\n return _this;\n }\n\n ProxyTag.prototype.compute = function compute() {\n return Math.max(this.proxyWrapperTag.value(), this.proxyContentTag.value());\n };\n\n ProxyTag.prototype.dirty = function dirty() {\n this.proxyWrapperTag.dirty();\n };\n\n ProxyTag.prototype.contentDidChange = function contentDidChange() {\n var content = (0, _emberMetal.get)(this.proxy, 'content');\n this.proxyContentTag.update((0, _emberMetal.tagFor)(content));\n };\n\n return ProxyTag;\n }(_reference.CachedTag);\n\n exports.default = _emberMetal.Mixin.create({\n /**\n The object whose properties will be forwarded.\n @property content\n @type EmberObject\n @default null\n @private\n */\n content: null,\n\n init: function () {\n this._super.apply(this, arguments);\n var m = (0, _emberMetal.meta)(this);\n m.setProxy();\n m.writableTag(function (source) {\n return new ProxyTag(source);\n });\n },\n\n\n isTruthy: (0, _computed_macros.bool)('content'),\n\n willWatchProperty: function (key) {\n var contentKey = 'content.' + key;\n (0, _emberMetal._addBeforeObserver)(this, contentKey, null, contentPropertyWillChange);\n (0, _emberMetal.addObserver)(this, contentKey, null, contentPropertyDidChange);\n },\n didUnwatchProperty: function (key) {\n var contentKey = 'content.' + key;\n (0, _emberMetal._removeBeforeObserver)(this, contentKey, null, contentPropertyWillChange);\n (0, _emberMetal.removeObserver)(this, contentKey, null, contentPropertyDidChange);\n },\n unknownProperty: function (key) {\n var content = (0, _emberMetal.get)(this, 'content');\n if (content) {\n return (0, _emberMetal.get)(content, key);\n }\n },\n setUnknownProperty: function (key, value) {\n var m = (0, _emberMetal.meta)(this);\n\n if (m.proto === this) {\n // if marked as prototype then just defineProperty\n // rather than delegate\n (0, _emberMetal.defineProperty)(this, key, null, value);\n return value;\n }\n\n var content = (0, _emberMetal.get)(this, 'content');\n (true && !(content) && (0, _emberDebug.assert)('Cannot delegate set(\\'' + key + '\\', ' + value + ') to the \\'content\\' property of object proxy ' + this + ': its \\'content\\' is undefined.', content));\n\n\n return (0, _emberMetal.set)(content, key, value);\n }\n });\n});","enifed('ember-runtime/mixins/action_handler', ['exports', 'ember-metal', 'ember-debug'], function (exports, _emberMetal, _emberDebug) {\n 'use strict';\n\n /**\n `Ember.ActionHandler` is available on some familiar classes including\n `Route`, `Component`, and `Controller`.\n (Internally the mixin is used by `Ember.CoreView`, `Ember.ControllerMixin`,\n and `Route` and available to the above classes through\n inheritance.)\n \n @class ActionHandler\n @namespace Ember\n @private\n */\n /**\n @module ember\n */\n\n var ActionHandler = _emberMetal.Mixin.create({\n mergedProperties: ['actions'],\n\n send: function (actionName) {\n for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n if (this.actions && this.actions[actionName]) {\n var shouldBubble = this.actions[actionName].apply(this, args) === true;\n if (!shouldBubble) {\n return;\n }\n }\n\n var target = (0, _emberMetal.get)(this, 'target');\n if (target) {\n (true && !(typeof target.send === 'function') && (0, _emberDebug.assert)('The `target` for ' + this + ' (' + target + ') does not have a `send` method', typeof target.send === 'function'));\n\n target.send.apply(target, arguments);\n }\n }\n });\n\n exports.default = ActionHandler;\n});","enifed('ember-runtime/mixins/array', ['exports', 'ember-utils', 'ember-metal', 'ember-debug', 'ember-runtime/mixins/enumerable', 'ember-runtime/compare', 'require'], function (exports, _emberUtils, _emberMetal, _emberDebug, _enumerable, _compare, _require2) {\n 'use strict';\n\n exports.addArrayObserver = addArrayObserver;\n exports.removeArrayObserver = removeArrayObserver;\n exports.objectAt = objectAt;\n exports.arrayContentWillChange = arrayContentWillChange;\n exports.arrayContentDidChange = arrayContentDidChange;\n exports.isEmberArray = isEmberArray;\n\n var _Mixin$create;\n\n // Required to break a module cycle\n var _A = void 0;\n function A() {\n if (_A === undefined) {\n _A = (0, _require2.default)('ember-runtime/system/native_array').A;\n }\n return _A();\n }\n\n function arrayObserversHelper(obj, target, opts, operation, notify) {\n var willChange = opts && opts.willChange || 'arrayWillChange';\n var didChange = opts && opts.didChange || 'arrayDidChange';\n var hasObservers = (0, _emberMetal.get)(obj, 'hasArrayObservers');\n\n if (hasObservers === notify) {\n (0, _emberMetal.propertyWillChange)(obj, 'hasArrayObservers');\n }\n\n operation(obj, '@array:before', target, willChange);\n operation(obj, '@array:change', target, didChange);\n\n if (hasObservers === notify) {\n (0, _emberMetal.propertyDidChange)(obj, 'hasArrayObservers');\n }\n\n return obj;\n }\n\n function addArrayObserver(array, target, opts) {\n return arrayObserversHelper(array, target, opts, _emberMetal.addListener, false);\n }\n\n function removeArrayObserver(array, target, opts) {\n return arrayObserversHelper(array, target, opts, _emberMetal.removeListener, true);\n }\n\n function objectAt(content, idx) {\n return typeof content.objectAt === 'function' ? content.objectAt(idx) : content[idx];\n }\n\n function arrayContentWillChange(array, startIdx, removeAmt, addAmt) {\n // if no args are passed assume everything changes\n if (startIdx === undefined) {\n startIdx = 0;\n removeAmt = addAmt = -1;\n } else {\n if (removeAmt === undefined) {\n removeAmt = -1;\n }\n\n if (addAmt === undefined) {\n addAmt = -1;\n }\n }\n\n if (array.__each) {\n array.__each.arrayWillChange(array, startIdx, removeAmt, addAmt);\n }\n\n (0, _emberMetal.sendEvent)(array, '@array:before', [array, startIdx, removeAmt, addAmt]);\n\n (0, _emberMetal.propertyWillChange)(array, '[]');\n\n if (addAmt < 0 || removeAmt < 0 || addAmt - removeAmt !== 0) {\n (0, _emberMetal.propertyWillChange)(array, 'length');\n }\n\n return array;\n }\n\n function arrayContentDidChange(array, startIdx, removeAmt, addAmt) {\n // if no args are passed assume everything changes\n if (startIdx === undefined) {\n startIdx = 0;\n removeAmt = addAmt = -1;\n } else {\n if (removeAmt === undefined) {\n removeAmt = -1;\n }\n\n if (addAmt === undefined) {\n addAmt = -1;\n }\n }\n\n if (addAmt < 0 || removeAmt < 0 || addAmt - removeAmt !== 0) {\n (0, _emberMetal.propertyDidChange)(array, 'length');\n }\n\n (0, _emberMetal.propertyDidChange)(array, '[]');\n\n if (array.__each) {\n array.__each.arrayDidChange(array, startIdx, removeAmt, addAmt);\n }\n\n (0, _emberMetal.sendEvent)(array, '@array:change', [array, startIdx, removeAmt, addAmt]);\n\n var meta = (0, _emberMetal.peekMeta)(array);\n var cache = meta !== undefined ? meta.readableCache() : undefined;\n if (cache !== undefined) {\n var length = (0, _emberMetal.get)(array, 'length');\n var addedAmount = addAmt === -1 ? 0 : addAmt;\n var removedAmount = removeAmt === -1 ? 0 : removeAmt;\n var delta = addedAmount - removedAmount;\n var previousLength = length - delta;\n\n var normalStartIdx = startIdx < 0 ? previousLength + startIdx : startIdx;\n if (cache.firstObject !== undefined && normalStartIdx === 0) {\n (0, _emberMetal.propertyWillChange)(array, 'firstObject', meta);\n (0, _emberMetal.propertyDidChange)(array, 'firstObject', meta);\n }\n\n if (cache.lastObject !== undefined) {\n var previousLastIndex = previousLength - 1;\n var lastAffectedIndex = normalStartIdx + removedAmount;\n if (previousLastIndex < lastAffectedIndex) {\n (0, _emberMetal.propertyWillChange)(array, 'lastObject', meta);\n (0, _emberMetal.propertyDidChange)(array, 'lastObject', meta);\n }\n }\n }\n\n return array;\n }\n\n var EMBER_ARRAY = (0, _emberUtils.symbol)('EMBER_ARRAY');\n\n function isEmberArray(obj) {\n return obj && obj[EMBER_ARRAY];\n }\n\n function iter(key, value) {\n var valueProvided = arguments.length === 2;\n\n return valueProvided ? function (item) {\n return value === (0, _emberMetal.get)(item, key);\n } : function (item) {\n return !!(0, _emberMetal.get)(item, key);\n };\n }\n\n // ..........................................................\n // ARRAY\n //\n /**\n This mixin implements Observer-friendly Array-like behavior. It is not a\n concrete implementation, but it can be used up by other classes that want\n to appear like arrays.\n \n For example, ArrayProxy is a concrete classes that can\n be instantiated to implement array-like behavior. Both of these classes use\n the Array Mixin by way of the MutableArray mixin, which allows observable\n changes to be made to the underlying array.\n \n This mixin defines methods specifically for collections that provide\n index-ordered access to their contents. When you are designing code that\n needs to accept any kind of Array-like object, you should use these methods\n instead of Array primitives because these will properly notify observers of\n changes to the array.\n \n Although these methods are efficient, they do add a layer of indirection to\n your application so it is a good idea to use them only when you need the\n flexibility of using both true JavaScript arrays and \"virtual\" arrays such\n as controllers and collections.\n \n You can use the methods defined in this module to access and modify array\n contents in a KVO-friendly way. You can also be notified whenever the\n membership of an array changes by using `.observes('myArray.[]')`.\n \n To support `EmberArray` in your own class, you must override two\n primitives to use it: `length()` and `objectAt()`.\n \n @class EmberArray\n @uses Enumerable\n @since Ember 0.9.0\n @public\n */\n var ArrayMixin = _emberMetal.Mixin.create(_enumerable.default, (_Mixin$create = {}, _Mixin$create[EMBER_ARRAY] = true, _Mixin$create.length = null, _Mixin$create.objectAt = function (idx) {\n if (idx < 0 || idx >= (0, _emberMetal.get)(this, 'length')) {\n return undefined;\n }\n\n return (0, _emberMetal.get)(this, idx);\n }, _Mixin$create.objectsAt = function (indexes) {\n var _this = this;\n\n return indexes.map(function (idx) {\n return objectAt(_this, idx);\n });\n }, _Mixin$create['[]'] = (0, _emberMetal.computed)({\n get: function (key) {\n // eslint-disable-line no-unused-vars\n return this;\n },\n set: function (key, value) {\n this.replace(0, (0, _emberMetal.get)(this, 'length'), value);\n return this;\n }\n }), _Mixin$create.firstObject = (0, _emberMetal.computed)(function () {\n return objectAt(this, 0);\n }).readOnly(), _Mixin$create.lastObject = (0, _emberMetal.computed)(function () {\n return objectAt(this, (0, _emberMetal.get)(this, 'length') - 1);\n }).readOnly(), _Mixin$create.slice = function (beginIndex, endIndex) {\n var ret = A();\n var length = (0, _emberMetal.get)(this, 'length');\n\n if ((0, _emberMetal.isNone)(beginIndex)) {\n beginIndex = 0;\n } else if (beginIndex < 0) {\n beginIndex = length + beginIndex;\n }\n\n if ((0, _emberMetal.isNone)(endIndex) || endIndex > length) {\n endIndex = length;\n } else if (endIndex < 0) {\n endIndex = length + endIndex;\n }\n\n while (beginIndex < endIndex) {\n ret[ret.length] = objectAt(this, beginIndex++);\n }\n\n return ret;\n }, _Mixin$create.indexOf = function (object, startAt) {\n var len = (0, _emberMetal.get)(this, 'length');\n\n if (startAt === undefined) {\n startAt = 0;\n }\n\n if (startAt < 0) {\n startAt += len;\n }\n\n for (var idx = startAt; idx < len; idx++) {\n if (objectAt(this, idx) === object) {\n return idx;\n }\n }\n\n return -1;\n }, _Mixin$create.lastIndexOf = function (object, startAt) {\n var len = (0, _emberMetal.get)(this, 'length');\n\n if (startAt === undefined || startAt >= len) {\n startAt = len - 1;\n }\n\n if (startAt < 0) {\n startAt += len;\n }\n\n for (var idx = startAt; idx >= 0; idx--) {\n if (objectAt(this, idx) === object) {\n return idx;\n }\n }\n\n return -1;\n }, _Mixin$create.addArrayObserver = function (target, opts) {\n return addArrayObserver(this, target, opts);\n }, _Mixin$create.removeArrayObserver = function (target, opts) {\n return removeArrayObserver(this, target, opts);\n }, _Mixin$create.hasArrayObservers = (0, _emberMetal.computed)(function () {\n return (0, _emberMetal.hasListeners)(this, '@array:change') || (0, _emberMetal.hasListeners)(this, '@array:before');\n }), _Mixin$create.arrayContentWillChange = function (startIdx, removeAmt, addAmt) {\n return arrayContentWillChange(this, startIdx, removeAmt, addAmt);\n }, _Mixin$create.arrayContentDidChange = function (startIdx, removeAmt, addAmt) {\n return arrayContentDidChange(this, startIdx, removeAmt, addAmt);\n }, _Mixin$create.forEach = function (callback) {\n var target = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n (true && !(typeof callback === 'function') && (0, _emberDebug.assert)('forEach expects a function as first argument.', typeof callback === 'function'));\n\n\n var length = (0, _emberMetal.get)(this, 'length');\n\n for (var index = 0; index < length; index++) {\n var item = this.objectAt(index);\n callback.call(target, item, index, this);\n }\n\n return this;\n }, _Mixin$create.getEach = (0, _emberMetal.aliasMethod)('mapBy'), _Mixin$create.setEach = function (key, value) {\n return this.forEach(function (item) {\n return (0, _emberMetal.set)(item, key, value);\n });\n }, _Mixin$create.map = function (callback, target) {\n (true && !(typeof callback === 'function') && (0, _emberDebug.assert)('map expects a function as first argument.', typeof callback === 'function'));\n\n\n var ret = A();\n\n this.forEach(function (x, idx, i) {\n return ret[idx] = callback.call(target, x, idx, i);\n });\n\n return ret;\n }, _Mixin$create.mapBy = function (key) {\n return this.map(function (next) {\n return (0, _emberMetal.get)(next, key);\n });\n }, _Mixin$create.filter = function (callback, target) {\n (true && !(typeof callback === 'function') && (0, _emberDebug.assert)('filter expects a function as first argument.', typeof callback === 'function'));\n\n\n var ret = A();\n\n this.forEach(function (x, idx, i) {\n if (callback.call(target, x, idx, i)) {\n ret.push(x);\n }\n });\n\n return ret;\n }, _Mixin$create.reject = function (callback, target) {\n (true && !(typeof callback === 'function') && (0, _emberDebug.assert)('reject expects a function as first argument.', typeof callback === 'function'));\n\n\n return this.filter(function () {\n return !callback.apply(target, arguments);\n });\n }, _Mixin$create.filterBy = function (key, value) {\n // eslint-disable-line no-unused-vars\n return this.filter(iter.apply(this, arguments));\n }, _Mixin$create.rejectBy = function (key, value) {\n var exactValue = function (item) {\n return (0, _emberMetal.get)(item, key) === value;\n };\n var hasValue = function (item) {\n return !!(0, _emberMetal.get)(item, key);\n };\n var use = arguments.length === 2 ? exactValue : hasValue;\n\n return this.reject(use);\n }, _Mixin$create.find = function (callback) {\n var target = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n (true && !(typeof callback === 'function') && (0, _emberDebug.assert)('find expects a function as first argument.', typeof callback === 'function'));\n\n\n var length = (0, _emberMetal.get)(this, 'length');\n\n for (var index = 0; index < length; index++) {\n var item = this.objectAt(index);\n\n if (callback.call(target, item, index, this)) {\n return item;\n }\n }\n }, _Mixin$create.findBy = function (key, value) {\n // eslint-disable-line no-unused-vars\n return this.find(iter.apply(this, arguments));\n }, _Mixin$create.every = function (callback, target) {\n (true && !(typeof callback === 'function') && (0, _emberDebug.assert)('every expects a function as first argument.', typeof callback === 'function'));\n\n\n return !this.find(function (x, idx, i) {\n return !callback.call(target, x, idx, i);\n });\n }, _Mixin$create.isEvery = function (key, value) {\n // eslint-disable-line no-unused-vars\n return this.every(iter.apply(this, arguments));\n }, _Mixin$create.any = function (callback) {\n var target = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;\n (true && !(typeof callback === 'function') && (0, _emberDebug.assert)('any expects a function as first argument.', typeof callback === 'function'));\n\n\n var length = (0, _emberMetal.get)(this, 'length');\n\n for (var index = 0; index < length; index++) {\n var item = this.objectAt(index);\n\n if (callback.call(target, item, index, this)) {\n return true;\n }\n }\n\n return false;\n }, _Mixin$create.isAny = function (key, value) {\n // eslint-disable-line no-unused-vars\n return this.any(iter.apply(this, arguments));\n }, _Mixin$create.reduce = function (callback, initialValue, reducerProperty) {\n (true && !(typeof callback === 'function') && (0, _emberDebug.assert)('reduce expects a function as first argument.', typeof callback === 'function'));\n\n\n var ret = initialValue;\n\n this.forEach(function (item, i) {\n ret = callback(ret, item, i, this, reducerProperty);\n }, this);\n\n return ret;\n }, _Mixin$create.invoke = function (methodName) {\n for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n var ret = A();\n\n this.forEach(function (x, idx) {\n var method = x && x[methodName];\n\n if ('function' === typeof method) {\n ret[idx] = args.length ? method.apply(x, args) : x[methodName]();\n }\n }, this);\n\n return ret;\n }, _Mixin$create.toArray = function () {\n var ret = A();\n\n this.forEach(function (o, idx) {\n return ret[idx] = o;\n });\n\n return ret;\n }, _Mixin$create.compact = function () {\n return this.filter(function (value) {\n return value != null;\n });\n }, _Mixin$create.includes = function (obj, startAt) {\n var len = (0, _emberMetal.get)(this, 'length');\n\n if (startAt === undefined) {\n startAt = 0;\n }\n\n if (startAt < 0) {\n startAt += len;\n }\n\n for (var idx = startAt; idx < len; idx++) {\n var currentObj = objectAt(this, idx);\n\n // SameValueZero comparison (NaN !== NaN)\n if (obj === currentObj || obj !== obj && currentObj !== currentObj) {\n return true;\n }\n }\n\n return false;\n }, _Mixin$create.sortBy = function () {\n var sortKeys = arguments;\n\n return this.toArray().sort(function (a, b) {\n for (var i = 0; i < sortKeys.length; i++) {\n var key = sortKeys[i];\n var propA = (0, _emberMetal.get)(a, key);\n var propB = (0, _emberMetal.get)(b, key);\n // return 1 or -1 else continue to the next sortKey\n var compareValue = (0, _compare.default)(propA, propB);\n\n if (compareValue) {\n return compareValue;\n }\n }\n return 0;\n });\n }, _Mixin$create.uniq = function () {\n var ret = A();\n\n var seen = new Set();\n this.forEach(function (item) {\n if (!seen.has(item)) {\n seen.add(item);\n ret.push(item);\n }\n });\n\n return ret;\n }, _Mixin$create.uniqBy = function (key) {\n var ret = A();\n var seen = new Set();\n\n this.forEach(function (item) {\n var val = (0, _emberMetal.get)(item, key);\n if (!seen.has(val)) {\n seen.add(val);\n ret.push(item);\n }\n });\n\n return ret;\n }, _Mixin$create.without = function (value) {\n if (!this.includes(value)) {\n return this; // nothing to do\n }\n\n var ret = A();\n\n this.forEach(function (k) {\n // SameValueZero comparison (NaN !== NaN)\n if (!(k === value || k !== k && value !== value)) {\n ret[ret.length] = k;\n }\n });\n\n return ret;\n }, _Mixin$create['@each'] = (0, _emberMetal.computed)(function () {\n // TODO use Symbol or add to meta\n if (!this.__each) {\n this.__each = new EachProxy(this);\n }\n\n return this.__each;\n }).volatile().readOnly(), _Mixin$create));\n\n /**\n This is the object instance returned when you get the `@each` property on an\n array. It uses the unknownProperty handler to automatically create\n EachArray instances for property names.\n @class EachProxy\n @private\n */\n function EachProxy(content) {\n this._content = content;\n this._keys = undefined;\n (0, _emberMetal.meta)(this);\n }\n\n EachProxy.prototype = {\n __defineNonEnumerable: function (property) {\n this[property.name] = property.descriptor.value;\n },\n arrayWillChange: function (content, idx, removedCnt, addedCnt) {\n // eslint-disable-line no-unused-vars\n var keys = this._keys;\n var lim = removedCnt > 0 ? idx + removedCnt : -1;\n var meta = (0, _emberMetal.peekMeta)(this);\n for (var key in keys) {\n if (lim > 0) {\n removeObserverForContentKey(content, key, this, idx, lim);\n }\n (0, _emberMetal.propertyWillChange)(this, key, meta);\n }\n },\n arrayDidChange: function (content, idx, removedCnt, addedCnt) {\n var keys = this._keys;\n var lim = addedCnt > 0 ? idx + addedCnt : -1;\n var meta = (0, _emberMetal.peekMeta)(this);\n for (var key in keys) {\n if (lim > 0) {\n addObserverForContentKey(content, key, this, idx, lim);\n }\n (0, _emberMetal.propertyDidChange)(this, key, meta);\n }\n },\n willWatchProperty: function (property) {\n this.beginObservingContentKey(property);\n },\n didUnwatchProperty: function (property) {\n this.stopObservingContentKey(property);\n },\n beginObservingContentKey: function (keyName) {\n var keys = this._keys;\n if (!keys) {\n keys = this._keys = Object.create(null);\n }\n\n if (!keys[keyName]) {\n keys[keyName] = 1;\n var content = this._content;\n var len = (0, _emberMetal.get)(content, 'length');\n\n addObserverForContentKey(content, keyName, this, 0, len);\n } else {\n keys[keyName]++;\n }\n },\n stopObservingContentKey: function (keyName) {\n var keys = this._keys;\n if (keys && keys[keyName] > 0 && --keys[keyName] <= 0) {\n var content = this._content;\n var len = (0, _emberMetal.get)(content, 'length');\n\n removeObserverForContentKey(content, keyName, this, 0, len);\n }\n },\n contentKeyWillChange: function (obj, keyName) {\n (0, _emberMetal.propertyWillChange)(this, keyName);\n },\n contentKeyDidChange: function (obj, keyName) {\n (0, _emberMetal.propertyDidChange)(this, keyName);\n }\n };\n\n function addObserverForContentKey(content, keyName, proxy, idx, loc) {\n while (--loc >= idx) {\n var item = objectAt(content, loc);\n if (item) {\n (true && !(typeof item === 'object') && (0, _emberDebug.assert)('When using @each to observe the array `' + (0, _emberUtils.toString)(content) + '`, the array must return an object', typeof item === 'object'));\n\n (0, _emberMetal._addBeforeObserver)(item, keyName, proxy, 'contentKeyWillChange');\n (0, _emberMetal.addObserver)(item, keyName, proxy, 'contentKeyDidChange');\n }\n }\n }\n\n function removeObserverForContentKey(content, keyName, proxy, idx, loc) {\n while (--loc >= idx) {\n var item = objectAt(content, loc);\n if (item) {\n (0, _emberMetal._removeBeforeObserver)(item, keyName, proxy, 'contentKeyWillChange');\n (0, _emberMetal.removeObserver)(item, keyName, proxy, 'contentKeyDidChange');\n }\n }\n }\n\n exports.default = ArrayMixin;\n});","enifed('ember-runtime/mixins/comparable', ['exports', 'ember-metal'], function (exports, _emberMetal) {\n 'use strict';\n\n exports.default = _emberMetal.Mixin.create({\n\n /**\n __Required.__ You must implement this method to apply this mixin.\n Override to return the result of the comparison of the two parameters. The\n compare method should return:\n - `-1` if `a < b`\n - `0` if `a == b`\n - `1` if `a > b`\n Default implementation raises an exception.\n @method compare\n @param a {Object} the first object to compare\n @param b {Object} the second object to compare\n @return {Number} the result of the comparison\n @private\n */\n compare: null\n });\n});","enifed('ember-runtime/mixins/container_proxy', ['exports', 'ember-metal'], function (exports, _emberMetal) {\n 'use strict';\n\n /**\n ContainerProxyMixin is used to provide public access to specific\n container functionality.\n \n @class ContainerProxyMixin\n @private\n */\n var containerProxyMixin = {\n /**\n The container stores state.\n @private\n @property {Ember.Container} __container__\n */\n __container__: null,\n\n ownerInjection: function () {\n return this.__container__.ownerInjection();\n },\n lookup: function (fullName, options) {\n return this.__container__.lookup(fullName, options);\n },\n _resolveLocalLookupName: function (name, source) {\n return this.__container__.registry.expandLocalLookup('component:' + name, {\n source: source\n });\n },\n willDestroy: function () {\n this._super.apply(this, arguments);\n\n if (this.__container__) {\n (0, _emberMetal.run)(this.__container__, 'destroy');\n }\n },\n factoryFor: function (fullName) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n return this.__container__.factoryFor(fullName, options);\n }\n }; /**\n @module ember\n */\n exports.default = _emberMetal.Mixin.create(containerProxyMixin);\n});","enifed('ember-runtime/mixins/controller', ['exports', 'ember-metal', 'ember-runtime/computed/computed_macros', 'ember-runtime/mixins/action_handler'], function (exports, _emberMetal, _computed_macros, _action_handler) {\n 'use strict';\n\n exports.default = _emberMetal.Mixin.create(_action_handler.default, {\n /* ducktype as a controller */\n isController: true,\n\n /**\n The object to which actions from the view should be sent.\n For example, when a Handlebars template uses the `{{action}}` helper,\n it will attempt to send the action to the view's controller's `target`.\n By default, the value of the target property is set to the router, and\n is injected when a controller is instantiated. This injection is applied\n as part of the application's initialization process. In most cases the\n `target` property will automatically be set to the logical consumer of\n actions for the controller.\n @property target\n @default null\n @public\n */\n target: null,\n\n store: null,\n\n /**\n The controller's current model. When retrieving or modifying a controller's\n model, this property should be used instead of the `content` property.\n @property model\n @public\n */\n model: null,\n\n /**\n @private\n */\n content: (0, _computed_macros.deprecatingAlias)('model', {\n id: 'ember-runtime.controller.content-alias',\n until: '2.17.0',\n url: 'https://emberjs.com/deprecations/v2.x/#toc_controller-content-alias'\n })\n });\n});","enifed('ember-runtime/mixins/copyable', ['exports', 'ember-metal'], function (exports, _emberMetal) {\n 'use strict';\n\n exports.default = _emberMetal.Mixin.create({\n /**\n __Required.__ You must implement this method to apply this mixin.\n Override to return a copy of the receiver. Default implementation raises\n an exception.\n @method copy\n @param {Boolean} deep if `true`, a deep copy of the object should be made\n @return {Object} copy of receiver\n @private\n */\n copy: null\n });\n});","enifed('ember-runtime/mixins/enumerable', ['exports', 'ember-metal'], function (exports, _emberMetal) {\n 'use strict';\n\n exports.default = _emberMetal.Mixin.create();\n});","enifed('ember-runtime/mixins/evented', ['exports', 'ember-metal'], function (exports, _emberMetal) {\n 'use strict';\n\n exports.default = _emberMetal.Mixin.create({\n\n /**\n Subscribes to a named event with given function.\n ```javascript\n person.on('didLoad', function() {\n // fired once the person has loaded\n });\n ```\n An optional target can be passed in as the 2nd argument that will\n be set as the \"this\" for the callback. This is a good way to give your\n function access to the object triggering the event. When the target\n parameter is used the callback becomes the third argument.\n @method on\n @param {String} name The name of the event\n @param {Object} [target] The \"this\" binding for the callback\n @param {Function} method The callback to execute\n @return this\n @public\n */\n on: function (name, target, method) {\n (0, _emberMetal.addListener)(this, name, target, method);\n return this;\n },\n\n\n /**\n Subscribes a function to a named event and then cancels the subscription\n after the first time the event is triggered. It is good to use ``one`` when\n you only care about the first time an event has taken place.\n This function takes an optional 2nd argument that will become the \"this\"\n value for the callback. If this argument is passed then the 3rd argument\n becomes the function.\n @method one\n @param {String} name The name of the event\n @param {Object} [target] The \"this\" binding for the callback\n @param {Function} method The callback to execute\n @return this\n @public\n */\n one: function (name, target, method) {\n if (!method) {\n method = target;\n target = null;\n }\n\n (0, _emberMetal.addListener)(this, name, target, method, true);\n return this;\n },\n\n\n /**\n Triggers a named event for the object. Any additional arguments\n will be passed as parameters to the functions that are subscribed to the\n event.\n ```javascript\n person.on('didEat', function(food) {\n console.log('person ate some ' + food);\n });\n person.trigger('didEat', 'broccoli');\n // outputs: person ate some broccoli\n ```\n @method trigger\n @param {String} name The name of the event\n @param {Object...} args Optional arguments to pass on\n @public\n */\n trigger: function (name) {\n for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n (0, _emberMetal.sendEvent)(this, name, args);\n },\n\n\n /**\n Cancels subscription for given name, target, and method.\n @method off\n @param {String} name The name of the event\n @param {Object} target The target of the subscription\n @param {Function} method The function of the subscription\n @return this\n @public\n */\n off: function (name, target, method) {\n (0, _emberMetal.removeListener)(this, name, target, method);\n return this;\n },\n\n\n /**\n Checks to see if object has any subscriptions for named event.\n @method has\n @param {String} name The name of the event\n @return {Boolean} does the object have a subscription for event\n @public\n */\n has: function (name) {\n return (0, _emberMetal.hasListeners)(this, name);\n }\n });\n});","enifed('ember-runtime/mixins/mutable_array', ['exports', 'ember-metal', 'ember-runtime/mixins/mutable_enumerable', 'ember-runtime/mixins/array', 'ember-debug'], function (exports, _emberMetal, _mutable_enumerable, _array, _emberDebug) {\n 'use strict';\n\n exports.removeAt = removeAt;\n /**\n @module @ember/array\n */\n\n var OUT_OF_RANGE_EXCEPTION = 'Index out of range';\n var EMPTY = [];\n\n function removeAt(array, start, len) {\n if ('number' === typeof start) {\n if (start < 0 || start >= (0, _emberMetal.get)(array, 'length')) {\n throw new _emberDebug.Error(OUT_OF_RANGE_EXCEPTION);\n }\n\n // fast case\n if (len === undefined) {\n len = 1;\n }\n\n array.replace(start, len, EMPTY);\n }\n\n return array;\n }\n\n /**\n This mixin defines the API for modifying array-like objects. These methods\n can be applied only to a collection that keeps its items in an ordered set.\n It builds upon the Array mixin and adds methods to modify the array.\n One concrete implementations of this class include ArrayProxy.\n \n It is important to use the methods in this class to modify arrays so that\n changes are observable. This allows the binding system in Ember to function\n correctly.\n \n \n Note that an Array can change even if it does not implement this mixin.\n For example, one might implement a SparseArray that cannot be directly\n modified, but if its underlying enumerable changes, it will change also.\n \n @class MutableArray\n @uses EmberArray\n @uses MutableEnumerable\n @public\n */\n exports.default = _emberMetal.Mixin.create(_array.default, _mutable_enumerable.default, {\n\n /**\n __Required.__ You must implement this method to apply this mixin.\n This is one of the primitives you must implement to support `Array`.\n You should replace amt objects started at idx with the objects in the\n passed array. You should also call `this.arrayContentDidChange()`\n @method replace\n @param {Number} idx Starting index in the array to replace. If\n idx >= length, then append to the end of the array.\n @param {Number} amt Number of elements that should be removed from\n the array, starting at *idx*.\n @param {EmberArray} objects An array of zero or more objects that should be\n inserted into the array at *idx*\n @public\n */\n replace: null,\n\n /**\n Remove all elements from the array. This is useful if you\n want to reuse an existing array without having to recreate it.\n ```javascript\n let colors = ['red', 'green', 'blue'];\n colors.length; // 3\n colors.clear(); // []\n colors.length; // 0\n ```\n @method clear\n @return {Array} An empty Array.\n @public\n */\n clear: function () {\n var len = (0, _emberMetal.get)(this, 'length');\n if (len === 0) {\n return this;\n }\n\n this.replace(0, len, EMPTY);\n return this;\n },\n\n\n /**\n This will use the primitive `replace()` method to insert an object at the\n specified index.\n ```javascript\n let colors = ['red', 'green', 'blue'];\n colors.insertAt(2, 'yellow'); // ['red', 'green', 'yellow', 'blue']\n colors.insertAt(5, 'orange'); // Error: Index out of range\n ```\n @method insertAt\n @param {Number} idx index of insert the object at.\n @param {Object} object object to insert\n @return {EmberArray} receiver\n @public\n */\n insertAt: function (idx, object) {\n if (idx > (0, _emberMetal.get)(this, 'length')) {\n throw new _emberDebug.Error(OUT_OF_RANGE_EXCEPTION);\n }\n\n this.replace(idx, 0, [object]);\n return this;\n },\n\n\n /**\n Remove an object at the specified index using the `replace()` primitive\n method. You can pass either a single index, or a start and a length.\n If you pass a start and length that is beyond the\n length this method will throw an `OUT_OF_RANGE_EXCEPTION`.\n ```javascript\n let colors = ['red', 'green', 'blue', 'yellow', 'orange'];\n colors.removeAt(0); // ['green', 'blue', 'yellow', 'orange']\n colors.removeAt(2, 2); // ['green', 'blue']\n colors.removeAt(4, 2); // Error: Index out of range\n ```\n @method removeAt\n @param {Number} start index, start of range\n @param {Number} len length of passing range\n @return {EmberArray} receiver\n @public\n */\n removeAt: function (start, len) {\n return removeAt(this, start, len);\n },\n\n\n /**\n Push the object onto the end of the array. Works just like `push()` but it\n is KVO-compliant.\n ```javascript\n let colors = ['red', 'green'];\n colors.pushObject('black'); // ['red', 'green', 'black']\n colors.pushObject(['yellow']); // ['red', 'green', ['yellow']]\n ```\n @method pushObject\n @param {*} obj object to push\n @return object same object passed as a param\n @public\n */\n pushObject: function (obj) {\n this.insertAt((0, _emberMetal.get)(this, 'length'), obj);\n return obj;\n },\n\n\n /**\n Add the objects in the passed array to the end of the array. Defers\n notifying observers of the change until all objects are added.\n ```javascript\n let colors = ['red'];\n colors.pushObjects(['yellow', 'orange']); // ['red', 'yellow', 'orange']\n ```\n @method pushObjects\n @param {EmberArray} objects the objects to add\n @return {EmberArray} receiver\n @public\n */\n pushObjects: function (objects) {\n if (!Array.isArray(objects)) {\n throw new TypeError('Must pass Enumerable to MutableArray#pushObjects');\n }\n this.replace((0, _emberMetal.get)(this, 'length'), 0, objects);\n return this;\n },\n\n\n /**\n Pop object from array or nil if none are left. Works just like `pop()` but\n it is KVO-compliant.\n ```javascript\n let colors = ['red', 'green', 'blue'];\n colors.popObject(); // 'blue'\n console.log(colors); // ['red', 'green']\n ```\n @method popObject\n @return object\n @public\n */\n popObject: function () {\n var len = (0, _emberMetal.get)(this, 'length');\n if (len === 0) {\n return null;\n }\n\n var ret = (0, _array.objectAt)(this, len - 1);\n this.removeAt(len - 1, 1);\n return ret;\n },\n\n\n /**\n Shift an object from start of array or nil if none are left. Works just\n like `shift()` but it is KVO-compliant.\n ```javascript\n let colors = ['red', 'green', 'blue'];\n colors.shiftObject(); // 'red'\n console.log(colors); // ['green', 'blue']\n ```\n @method shiftObject\n @return object\n @public\n */\n shiftObject: function () {\n if ((0, _emberMetal.get)(this, 'length') === 0) {\n return null;\n }\n\n var ret = (0, _array.objectAt)(this, 0);\n this.removeAt(0);\n return ret;\n },\n\n\n /**\n Unshift an object to start of array. Works just like `unshift()` but it is\n KVO-compliant.\n ```javascript\n let colors = ['red'];\n colors.unshiftObject('yellow'); // ['yellow', 'red']\n colors.unshiftObject(['black']); // [['black'], 'yellow', 'red']\n ```\n @method unshiftObject\n @param {*} obj object to unshift\n @return object same object passed as a param\n @public\n */\n unshiftObject: function (obj) {\n this.insertAt(0, obj);\n return obj;\n },\n\n\n /**\n Adds the named objects to the beginning of the array. Defers notifying\n observers until all objects have been added.\n ```javascript\n let colors = ['red'];\n colors.unshiftObjects(['black', 'white']); // ['black', 'white', 'red']\n colors.unshiftObjects('yellow'); // Type Error: 'undefined' is not a function\n ```\n @method unshiftObjects\n @param {Enumberable} objects the objects to add\n @return {EmberArray} receiver\n @public\n */\n unshiftObjects: function (objects) {\n this.replace(0, 0, objects);\n return this;\n },\n\n\n /**\n Reverse objects in the array. Works just like `reverse()` but it is\n KVO-compliant.\n @method reverseObjects\n @return {EmberArray} receiver\n @public\n */\n reverseObjects: function () {\n var len = (0, _emberMetal.get)(this, 'length');\n if (len === 0) {\n return this;\n }\n\n var objects = this.toArray().reverse();\n this.replace(0, len, objects);\n return this;\n },\n\n\n /**\n Replace all the receiver's content with content of the argument.\n If argument is an empty array receiver will be cleared.\n ```javascript\n let colors = ['red', 'green', 'blue'];\n colors.setObjects(['black', 'white']); // ['black', 'white']\n colors.setObjects([]); // []\n ```\n @method setObjects\n @param {EmberArray} objects array whose content will be used for replacing\n the content of the receiver\n @return {EmberArray} receiver with the new content\n @public\n */\n setObjects: function (objects) {\n if (objects.length === 0) {\n return this.clear();\n }\n\n var len = (0, _emberMetal.get)(this, 'length');\n this.replace(0, len, objects);\n return this;\n },\n\n\n /**\n Remove all occurrences of an object in the array.\n ```javascript\n let cities = ['Chicago', 'Berlin', 'Lima', 'Chicago'];\n cities.removeObject('Chicago'); // ['Berlin', 'Lima']\n cities.removeObject('Lima'); // ['Berlin']\n cities.removeObject('Tokyo') // ['Berlin']\n ```\n @method removeObject\n @param {*} obj object to remove\n @return {EmberArray} receiver\n @public\n */\n removeObject: function (obj) {\n var loc = (0, _emberMetal.get)(this, 'length') || 0;\n while (--loc >= 0) {\n var curObject = (0, _array.objectAt)(this, loc);\n\n if (curObject === obj) {\n this.removeAt(loc);\n }\n }\n return this;\n },\n\n\n /**\n Removes each object in the passed array from the receiver.\n @method removeObjects\n @param {EmberArray} objects the objects to remove\n @return {EmberArray} receiver\n @public\n */\n removeObjects: function (objects) {\n (0, _emberMetal.beginPropertyChanges)(this);\n for (var i = objects.length - 1; i >= 0; i--) {\n this.removeObject(objects[i]);\n }\n (0, _emberMetal.endPropertyChanges)(this);\n return this;\n },\n\n\n /**\n Push the object onto the end of the array if it is not already\n present in the array.\n ```javascript\n let cities = ['Chicago', 'Berlin'];\n cities.addObject('Lima'); // ['Chicago', 'Berlin', 'Lima']\n cities.addObject('Berlin'); // ['Chicago', 'Berlin', 'Lima']\n ```\n @method addObject\n @param {*} obj object to add, if not already present\n @return {EmberArray} receiver\n @public\n */\n addObject: function (obj) {\n var included = this.includes(obj);\n\n if (!included) {\n this.pushObject(obj);\n }\n\n return this;\n },\n\n\n /**\n Adds each object in the passed array to the receiver.\n @method addObjects\n @param {EmberArray} objects the objects to add.\n @return {EmberArray} receiver\n @public\n */\n addObjects: function (objects) {\n var _this = this;\n\n (0, _emberMetal.beginPropertyChanges)(this);\n objects.forEach(function (obj) {\n return _this.addObject(obj);\n });\n (0, _emberMetal.endPropertyChanges)(this);\n return this;\n }\n });\n});","enifed('ember-runtime/mixins/mutable_enumerable', ['exports', 'ember-runtime/mixins/enumerable', 'ember-metal'], function (exports, _enumerable, _emberMetal) {\n 'use strict';\n\n exports.default = _emberMetal.Mixin.create(_enumerable.default);\n});","enifed('ember-runtime/mixins/observable', ['exports', 'ember-metal', 'ember-debug'], function (exports, _emberMetal, _emberDebug) {\n 'use strict';\n\n exports.default = _emberMetal.Mixin.create({\n\n /**\n Retrieves the value of a property from the object.\n This method is usually similar to using `object[keyName]` or `object.keyName`,\n however it supports both computed properties and the unknownProperty\n handler.\n Because `get` unifies the syntax for accessing all these kinds\n of properties, it can make many refactorings easier, such as replacing a\n simple property with a computed property, or vice versa.\n ### Computed Properties\n Computed properties are methods defined with the `property` modifier\n declared at the end, such as:\n ```javascript\n import { computed } from '@ember/object';\n fullName: computed('firstName', 'lastName', function() {\n return this.get('firstName') + ' ' + this.get('lastName');\n })\n ```\n When you call `get` on a computed property, the function will be\n called and the return value will be returned instead of the function\n itself.\n ### Unknown Properties\n Likewise, if you try to call `get` on a property whose value is\n `undefined`, the `unknownProperty()` method will be called on the object.\n If this method returns any value other than `undefined`, it will be returned\n instead. This allows you to implement \"virtual\" properties that are\n not defined upfront.\n @method get\n @param {String} keyName The property to retrieve\n @return {Object} The property value or undefined.\n @public\n */\n get: function (keyName) {\n return (0, _emberMetal.get)(this, keyName);\n },\n\n\n /**\n To get the values of multiple properties at once, call `getProperties`\n with a list of strings or an array:\n ```javascript\n record.getProperties('firstName', 'lastName', 'zipCode');\n // { firstName: 'John', lastName: 'Doe', zipCode: '10011' }\n ```\n is equivalent to:\n ```javascript\n record.getProperties(['firstName', 'lastName', 'zipCode']);\n // { firstName: 'John', lastName: 'Doe', zipCode: '10011' }\n ```\n @method getProperties\n @param {String...|Array} list of keys to get\n @return {Object}\n @public\n */\n getProperties: function () {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return _emberMetal.getProperties.apply(undefined, [this].concat(args));\n },\n\n\n /**\n Sets the provided key or path to the value.\n ```javascript\n record.set(\"key\", value);\n ```\n This method is generally very similar to calling `object[\"key\"] = value` or\n `object.key = value`, except that it provides support for computed\n properties, the `setUnknownProperty()` method and property observers.\n ### Computed Properties\n If you try to set a value on a key that has a computed property handler\n defined (see the `get()` method for an example), then `set()` will call\n that method, passing both the value and key instead of simply changing\n the value itself. This is useful for those times when you need to\n implement a property that is composed of one or more member\n properties.\n ### Unknown Properties\n If you try to set a value on a key that is undefined in the target\n object, then the `setUnknownProperty()` handler will be called instead. This\n gives you an opportunity to implement complex \"virtual\" properties that\n are not predefined on the object. If `setUnknownProperty()` returns\n undefined, then `set()` will simply set the value on the object.\n ### Property Observers\n In addition to changing the property, `set()` will also register a property\n change with the object. Unless you have placed this call inside of a\n `beginPropertyChanges()` and `endPropertyChanges(),` any \"local\" observers\n (i.e. observer methods declared on the same object), will be called\n immediately. Any \"remote\" observers (i.e. observer methods declared on\n another object) will be placed in a queue and called at a later time in a\n coalesced manner.\n @method set\n @param {String} keyName The property to set\n @param {Object} value The value to set or `null`.\n @return {Object} The passed value\n @public\n */\n set: function (keyName, value) {\n return (0, _emberMetal.set)(this, keyName, value);\n },\n\n\n /**\n Sets a list of properties at once. These properties are set inside\n a single `beginPropertyChanges` and `endPropertyChanges` batch, so\n observers will be buffered.\n ```javascript\n record.setProperties({ firstName: 'Charles', lastName: 'Jolley' });\n ```\n @method setProperties\n @param {Object} hash the hash of keys and values to set\n @return {Object} The passed in hash\n @public\n */\n setProperties: function (hash) {\n return (0, _emberMetal.setProperties)(this, hash);\n },\n\n\n /**\n Begins a grouping of property changes.\n You can use this method to group property changes so that notifications\n will not be sent until the changes are finished. If you plan to make a\n large number of changes to an object at one time, you should call this\n method at the beginning of the changes to begin deferring change\n notifications. When you are done making changes, call\n `endPropertyChanges()` to deliver the deferred change notifications and end\n deferring.\n @method beginPropertyChanges\n @return {Observable}\n @private\n */\n beginPropertyChanges: function () {\n (0, _emberMetal.beginPropertyChanges)();\n return this;\n },\n\n\n /**\n Ends a grouping of property changes.\n You can use this method to group property changes so that notifications\n will not be sent until the changes are finished. If you plan to make a\n large number of changes to an object at one time, you should call\n `beginPropertyChanges()` at the beginning of the changes to defer change\n notifications. When you are done making changes, call this method to\n deliver the deferred change notifications and end deferring.\n @method endPropertyChanges\n @return {Observable}\n @private\n */\n endPropertyChanges: function () {\n (0, _emberMetal.endPropertyChanges)();\n return this;\n },\n\n\n /**\n Notify the observer system that a property is about to change.\n Sometimes you need to change a value directly or indirectly without\n actually calling `get()` or `set()` on it. In this case, you can use this\n method and `propertyDidChange()` instead. Calling these two methods\n together will notify all observers that the property has potentially\n changed value.\n Note that you must always call `propertyWillChange` and `propertyDidChange`\n as a pair. If you do not, it may get the property change groups out of\n order and cause notifications to be delivered more often than you would\n like.\n @method propertyWillChange\n @param {String} keyName The property key that is about to change.\n @return {Observable}\n @private\n */\n propertyWillChange: function (keyName) {\n (0, _emberMetal.propertyWillChange)(this, keyName);\n return this;\n },\n\n\n /**\n Notify the observer system that a property has just changed.\n Sometimes you need to change a value directly or indirectly without\n actually calling `get()` or `set()` on it. In this case, you can use this\n method and `propertyWillChange()` instead. Calling these two methods\n together will notify all observers that the property has potentially\n changed value.\n Note that you must always call `propertyWillChange` and `propertyDidChange`\n as a pair. If you do not, it may get the property change groups out of\n order and cause notifications to be delivered more often than you would\n like.\n @method propertyDidChange\n @param {String} keyName The property key that has just changed.\n @return {Observable}\n @private\n */\n propertyDidChange: function (keyName) {\n (0, _emberMetal.propertyDidChange)(this, keyName);\n return this;\n },\n\n\n /**\n Convenience method to call `propertyWillChange` and `propertyDidChange` in\n succession.\n @method notifyPropertyChange\n @param {String} keyName The property key to be notified about.\n @return {Observable}\n @public\n */\n notifyPropertyChange: function (keyName) {\n this.propertyWillChange(keyName);\n this.propertyDidChange(keyName);\n return this;\n },\n\n\n /**\n Adds an observer on a property.\n This is the core method used to register an observer for a property.\n Once you call this method, any time the key's value is set, your observer\n will be notified. Note that the observers are triggered any time the\n value is set, regardless of whether it has actually changed. Your\n observer should be prepared to handle that.\n ### Observer Methods\n Observer methods have the following signature:\n ```app/components/my-component.js\n import Component from '@ember/component';\n export default Component.extend({\n init() {\n this._super(...arguments);\n this.addObserver('foo', this, 'fooDidChange');\n },\n fooDidChange(sender, key, value, rev) {\n // your code\n }\n });\n ```\n The `sender` is the object that changed. The `key` is the property that\n changes. The `value` property is currently reserved and unused. The `rev`\n is the last property revision of the object when it changed, which you can\n use to detect if the key value has really changed or not.\n Usually you will not need the value or revision parameters at\n the end. In this case, it is common to write observer methods that take\n only a sender and key value as parameters or, if you aren't interested in\n any of these values, to write an observer that has no parameters at all.\n @method addObserver\n @param {String} key The key to observe\n @param {Object} target The target object to invoke\n @param {String|Function} method The method to invoke\n @return {Observable}\n @public\n */\n addObserver: function (key, target, method) {\n (0, _emberMetal.addObserver)(this, key, target, method);\n return this;\n },\n\n\n /**\n Remove an observer you have previously registered on this object. Pass\n the same key, target, and method you passed to `addObserver()` and your\n target will no longer receive notifications.\n @method removeObserver\n @param {String} key The key to observe\n @param {Object} target The target object to invoke\n @param {String|Function} method The method to invoke\n @return {Observable}\n @public\n */\n removeObserver: function (key, target, method) {\n (0, _emberMetal.removeObserver)(this, key, target, method);\n return this;\n },\n\n\n /**\n Returns `true` if the object currently has observers registered for a\n particular key. You can use this method to potentially defer performing\n an expensive action until someone begins observing a particular property\n on the object.\n @method hasObserverFor\n @param {String} key Key to check\n @return {Boolean}\n @private\n */\n hasObserverFor: function (key) {\n return (0, _emberMetal.hasListeners)(this, key + ':change');\n },\n\n\n /**\n Retrieves the value of a property, or a default value in the case that the\n property returns `undefined`.\n ```javascript\n person.getWithDefault('lastName', 'Doe');\n ```\n @method getWithDefault\n @param {String} keyName The name of the property to retrieve\n @param {Object} defaultValue The value to return if the property value is undefined\n @return {Object} The property value or the defaultValue.\n @public\n */\n getWithDefault: function (keyName, defaultValue) {\n return (0, _emberMetal.getWithDefault)(this, keyName, defaultValue);\n },\n\n\n /**\n Set the value of a property to the current value plus some amount.\n ```javascript\n person.incrementProperty('age');\n team.incrementProperty('score', 2);\n ```\n @method incrementProperty\n @param {String} keyName The name of the property to increment\n @param {Number} increment The amount to increment by. Defaults to 1\n @return {Number} The new property value\n @public\n */\n incrementProperty: function (keyName, increment) {\n if ((0, _emberMetal.isNone)(increment)) {\n increment = 1;\n }\n (true && !(!isNaN(parseFloat(increment)) && isFinite(increment)) && (0, _emberDebug.assert)('Must pass a numeric value to incrementProperty', !isNaN(parseFloat(increment)) && isFinite(increment)));\n\n return (0, _emberMetal.set)(this, keyName, (parseFloat((0, _emberMetal.get)(this, keyName)) || 0) + increment);\n },\n\n\n /**\n Set the value of a property to the current value minus some amount.\n ```javascript\n player.decrementProperty('lives');\n orc.decrementProperty('health', 5);\n ```\n @method decrementProperty\n @param {String} keyName The name of the property to decrement\n @param {Number} decrement The amount to decrement by. Defaults to 1\n @return {Number} The new property value\n @public\n */\n decrementProperty: function (keyName, decrement) {\n if ((0, _emberMetal.isNone)(decrement)) {\n decrement = 1;\n }\n (true && !(!isNaN(parseFloat(decrement)) && isFinite(decrement)) && (0, _emberDebug.assert)('Must pass a numeric value to decrementProperty', !isNaN(parseFloat(decrement)) && isFinite(decrement)));\n\n return (0, _emberMetal.set)(this, keyName, ((0, _emberMetal.get)(this, keyName) || 0) - decrement);\n },\n\n\n /**\n Set the value of a boolean property to the opposite of its\n current value.\n ```javascript\n starship.toggleProperty('warpDriveEngaged');\n ```\n @method toggleProperty\n @param {String} keyName The name of the property to toggle\n @return {Boolean} The new property value\n @public\n */\n toggleProperty: function (keyName) {\n return (0, _emberMetal.set)(this, keyName, !(0, _emberMetal.get)(this, keyName));\n },\n\n\n /**\n Returns the cached value of a computed property, if it exists.\n This allows you to inspect the value of a computed property\n without accidentally invoking it if it is intended to be\n generated lazily.\n @method cacheFor\n @param {String} keyName\n @return {Object} The cached value of the computed property, if any\n @public\n */\n cacheFor: function (keyName) {\n return (0, _emberMetal.cacheFor)(this, keyName);\n }\n });\n});","enifed('ember-runtime/mixins/promise_proxy', ['exports', 'ember-metal', 'ember-debug', 'ember-runtime/computed/computed_macros'], function (exports, _emberMetal, _emberDebug, _computed_macros) {\n 'use strict';\n\n /**\n @module @ember/object\n */\n\n function tap(proxy, promise) {\n (0, _emberMetal.setProperties)(proxy, {\n isFulfilled: false,\n isRejected: false\n });\n\n return promise.then(function (value) {\n if (!proxy.isDestroyed && !proxy.isDestroying) {\n (0, _emberMetal.setProperties)(proxy, {\n content: value,\n isFulfilled: true\n });\n }\n return value;\n }, function (reason) {\n if (!proxy.isDestroyed && !proxy.isDestroying) {\n (0, _emberMetal.setProperties)(proxy, {\n reason: reason,\n isRejected: true\n });\n }\n throw reason;\n }, 'Ember: PromiseProxy');\n }\n\n /**\n A low level mixin making ObjectProxy promise-aware.\n \n ```javascript\n import { resolve } from 'rsvp';\n import $ from 'jquery';\n import ObjectProxy from '@ember/object/proxy';\n import PromiseProxyMixin from '@ember/object/promise-proxy-mixin';\n \n let ObjectPromiseProxy = ObjectProxy.extend(PromiseProxyMixin);\n \n let proxy = ObjectPromiseProxy.create({\n promise: resolve($.getJSON('/some/remote/data.json'))\n });\n \n proxy.then(function(json){\n // the json\n }, function(reason) {\n // the reason why you have no json\n });\n ```\n \n the proxy has bindable attributes which\n track the promises life cycle\n \n ```javascript\n proxy.get('isPending') //=> true\n proxy.get('isSettled') //=> false\n proxy.get('isRejected') //=> false\n proxy.get('isFulfilled') //=> false\n ```\n \n When the $.getJSON completes, and the promise is fulfilled\n with json, the life cycle attributes will update accordingly.\n Note that $.getJSON doesn't return an ECMA specified promise,\n it is useful to wrap this with an `RSVP.resolve` so that it behaves\n as a spec compliant promise.\n \n ```javascript\n proxy.get('isPending') //=> false\n proxy.get('isSettled') //=> true\n proxy.get('isRejected') //=> false\n proxy.get('isFulfilled') //=> true\n ```\n \n As the proxy is an ObjectProxy, and the json now its content,\n all the json properties will be available directly from the proxy.\n \n ```javascript\n // Assuming the following json:\n {\n firstName: 'Stefan',\n lastName: 'Penner'\n }\n \n // both properties will accessible on the proxy\n proxy.get('firstName') //=> 'Stefan'\n proxy.get('lastName') //=> 'Penner'\n ```\n \n @class PromiseProxyMixin\n @public\n */\n exports.default = _emberMetal.Mixin.create({\n /**\n If the proxied promise is rejected this will contain the reason\n provided.\n @property reason\n @default null\n @public\n */\n reason: null,\n\n /**\n Once the proxied promise has settled this will become `false`.\n @property isPending\n @default true\n @public\n */\n isPending: (0, _computed_macros.not)('isSettled').readOnly(),\n\n /**\n Once the proxied promise has settled this will become `true`.\n @property isSettled\n @default false\n @public\n */\n isSettled: (0, _computed_macros.or)('isRejected', 'isFulfilled').readOnly(),\n\n /**\n Will become `true` if the proxied promise is rejected.\n @property isRejected\n @default false\n @public\n */\n isRejected: false,\n\n /**\n Will become `true` if the proxied promise is fulfilled.\n @property isFulfilled\n @default false\n @public\n */\n isFulfilled: false,\n\n /**\n The promise whose fulfillment value is being proxied by this object.\n This property must be specified upon creation, and should not be\n changed once created.\n Example:\n ```javascript\n import ObjectProxy from '@ember/object/proxy';\n import PromiseProxyMixin from '@ember/object/promise-proxy-mixin';\n ObjectProxy.extend(PromiseProxyMixin).create({\n promise: <thenable>\n });\n ```\n @property promise\n @public\n */\n promise: (0, _emberMetal.computed)({\n get: function () {\n throw new _emberDebug.Error('PromiseProxy\\'s promise must be set');\n },\n set: function (key, promise) {\n return tap(this, promise);\n }\n }),\n\n /**\n An alias to the proxied promise's `then`.\n See RSVP.Promise.then.\n @method then\n @param {Function} callback\n @return {RSVP.Promise}\n @public\n */\n then: promiseAlias('then'),\n\n /**\n An alias to the proxied promise's `catch`.\n See RSVP.Promise.catch.\n @method catch\n @param {Function} callback\n @return {RSVP.Promise}\n @since 1.3.0\n @public\n */\n 'catch': promiseAlias('catch'),\n\n /**\n An alias to the proxied promise's `finally`.\n See RSVP.Promise.finally.\n @method finally\n @param {Function} callback\n @return {RSVP.Promise}\n @since 1.3.0\n @public\n */\n 'finally': promiseAlias('finally')\n\n });\n\n\n function promiseAlias(name) {\n return function () {\n var promise = (0, _emberMetal.get)(this, 'promise');\n return promise[name].apply(promise, arguments);\n };\n }\n});","enifed('ember-runtime/mixins/registry_proxy', ['exports', 'ember-metal'], function (exports, _emberMetal) {\n 'use strict';\n\n exports.default = _emberMetal.Mixin.create({\n __registry__: null,\n\n /**\n Given a fullName return the corresponding factory.\n @public\n @method resolveRegistration\n @param {String} fullName\n @return {Function} fullName's factory\n */\n resolveRegistration: registryAlias('resolve'),\n\n /**\n Registers a factory that can be used for dependency injection (with\n `inject`) or for service lookup. Each factory is registered with\n a full name including two parts: `type:name`.\n A simple example:\n ```javascript\n import Application from '@ember/application';\n import EmberObject from '@ember/object';\n let App = Application.create();\n App.Orange = EmberObject.extend();\n App.register('fruit:favorite', App.Orange);\n ```\n Ember will resolve factories from the `App` namespace automatically.\n For example `App.CarsController` will be discovered and returned if\n an application requests `controller:cars`.\n An example of registering a controller with a non-standard name:\n ```javascript\n import Application from '@ember/application';\n import Controller from '@ember/controller';\n let App = Application.create();\n let Session = Controller.extend();\n App.register('controller:session', Session);\n // The Session controller can now be treated like a normal controller,\n // despite its non-standard name.\n App.ApplicationController = Controller.extend({\n needs: ['session']\n });\n ```\n Registered factories are **instantiated** by having `create`\n called on them. Additionally they are **singletons**, each time\n they are looked up they return the same instance.\n Some examples modifying that default behavior:\n ```javascript\n import Application from '@ember/application';\n import EmberObject from '@ember/object';\n let App = Application.create();\n App.Person = EmberObject.extend();\n App.Orange = EmberObject.extend();\n App.Email = EmberObject.extend();\n App.session = EmberObject.create();\n App.register('model:user', App.Person, { singleton: false });\n App.register('fruit:favorite', App.Orange);\n App.register('communication:main', App.Email, { singleton: false });\n App.register('session', App.session, { instantiate: false });\n ```\n @method register\n @param fullName {String} type:name (e.g., 'model:user')\n @param factory {Function} (e.g., App.Person)\n @param options {Object} (optional) disable instantiation or singleton usage\n @public\n */\n register: registryAlias('register'),\n\n /**\n Unregister a factory.\n ```javascript\n import Application from '@ember/application';\n import EmberObject from '@ember/object';\n let App = Application.create();\n let User = EmberObject.extend();\n App.register('model:user', User);\n App.resolveRegistration('model:user').create() instanceof User //=> true\n App.unregister('model:user')\n App.resolveRegistration('model:user') === undefined //=> true\n ```\n @public\n @method unregister\n @param {String} fullName\n */\n unregister: registryAlias('unregister'),\n\n /**\n Check if a factory is registered.\n @public\n @method hasRegistration\n @param {String} fullName\n @return {Boolean}\n */\n hasRegistration: registryAlias('has'),\n\n /**\n Return a specific registered option for a particular factory.\n @public\n @method registeredOption\n @param {String} fullName\n @param {String} optionName\n @return {Object} options\n */\n registeredOption: registryAlias('getOption'),\n\n /**\n Register options for a particular factory.\n @public\n @method registerOptions\n @param {String} fullName\n @param {Object} options\n */\n registerOptions: registryAlias('options'),\n\n /**\n Return registered options for a particular factory.\n @public\n @method registeredOptions\n @param {String} fullName\n @return {Object} options\n */\n registeredOptions: registryAlias('getOptions'),\n\n /**\n Allow registering options for all factories of a type.\n ```javascript\n import Application from '@ember/application';\n let App = Application.create();\n let appInstance = App.buildInstance();\n // if all of type `connection` must not be singletons\n appInstance.registerOptionsForType('connection', { singleton: false });\n appInstance.register('connection:twitter', TwitterConnection);\n appInstance.register('connection:facebook', FacebookConnection);\n let twitter = appInstance.lookup('connection:twitter');\n let twitter2 = appInstance.lookup('connection:twitter');\n twitter === twitter2; // => false\n let facebook = appInstance.lookup('connection:facebook');\n let facebook2 = appInstance.lookup('connection:facebook');\n facebook === facebook2; // => false\n ```\n @public\n @method registerOptionsForType\n @param {String} type\n @param {Object} options\n */\n registerOptionsForType: registryAlias('optionsForType'),\n\n /**\n Return the registered options for all factories of a type.\n @public\n @method registeredOptionsForType\n @param {String} type\n @return {Object} options\n */\n registeredOptionsForType: registryAlias('getOptionsForType'),\n\n /**\n Define a dependency injection onto a specific factory or all factories\n of a type.\n When Ember instantiates a controller, view, or other framework component\n it can attach a dependency to that component. This is often used to\n provide services to a set of framework components.\n An example of providing a session object to all controllers:\n ```javascript\n import { alias } from '@ember/object/computed';\n import Application from '@ember/application';\n import Controller from '@ember/controller';\n import EmberObject from '@ember/object';\n let App = Application.create();\n let Session = EmberObject.extend({ isAuthenticated: false });\n // A factory must be registered before it can be injected\n App.register('session:main', Session);\n // Inject 'session:main' onto all factories of the type 'controller'\n // with the name 'session'\n App.inject('controller', 'session', 'session:main');\n App.IndexController = Controller.extend({\n isLoggedIn: alias('session.isAuthenticated')\n });\n ```\n Injections can also be performed on specific factories.\n ```javascript\n App.inject(<full_name or type>, <property name>, <full_name>)\n App.inject('route', 'source', 'source:main')\n App.inject('route:application', 'email', 'model:email')\n ```\n It is important to note that injections can only be performed on\n classes that are instantiated by Ember itself. Instantiating a class\n directly (via `create` or `new`) bypasses the dependency injection\n system.\n @public\n @method inject\n @param factoryNameOrType {String}\n @param property {String}\n @param injectionName {String}\n **/\n inject: registryAlias('injection')\n });\n\n\n function registryAlias(name) {\n return function () {\n var _registry__;\n\n return (_registry__ = this.__registry__)[name].apply(_registry__, arguments);\n };\n }\n});","enifed('ember-runtime/mixins/target_action_support', ['exports', 'ember-environment', 'ember-metal', 'ember-debug'], function (exports, _emberEnvironment, _emberMetal, _emberDebug) {\n 'use strict';\n\n exports.default = _emberMetal.Mixin.create({\n target: null,\n targetObject: (0, _emberMetal.descriptor)({\n configurable: true,\n enumerable: false,\n get: function () {\n var message = this + ' Usage of `targetObject` is deprecated. Please use `target` instead.';\n var options = { id: 'ember-runtime.using-targetObject', until: '3.5.0' };\n (true && !(false) && (0, _emberDebug.deprecate)(message, false, options));\n\n return this._targetObject;\n },\n set: function (value) {\n var message = this + ' Usage of `targetObject` is deprecated. Please use `target` instead.';\n var options = { id: 'ember-runtime.using-targetObject', until: '3.5.0' };\n (true && !(false) && (0, _emberDebug.deprecate)(message, false, options));\n\n this._targetObject = value;\n }\n }),\n action: null,\n actionContext: null,\n\n actionContextObject: (0, _emberMetal.computed)('actionContext', function () {\n var actionContext = (0, _emberMetal.get)(this, 'actionContext');\n\n if (typeof actionContext === 'string') {\n var value = (0, _emberMetal.get)(this, actionContext);\n if (value === undefined) {\n value = (0, _emberMetal.get)(_emberEnvironment.context.lookup, actionContext);\n }\n return value;\n } else {\n return actionContext;\n }\n }),\n\n /**\n Send an `action` with an `actionContext` to a `target`. The action, actionContext\n and target will be retrieved from properties of the object. For example:\n ```javascript\n import { alias } from '@ember/object/computed';\n App.SaveButtonView = Ember.View.extend(Ember.TargetActionSupport, {\n target: alias('controller'),\n action: 'save',\n actionContext: alias('context'),\n click() {\n this.triggerAction(); // Sends the `save` action, along with the current context\n // to the current controller\n }\n });\n ```\n The `target`, `action`, and `actionContext` can be provided as properties of\n an optional object argument to `triggerAction` as well.\n ```javascript\n App.SaveButtonView = Ember.View.extend(Ember.TargetActionSupport, {\n click() {\n this.triggerAction({\n action: 'save',\n target: this.get('controller'),\n actionContext: this.get('context')\n }); // Sends the `save` action, along with the current context\n // to the current controller\n }\n });\n ```\n The `actionContext` defaults to the object you are mixing `TargetActionSupport` into.\n But `target` and `action` must be specified either as properties or with the argument\n to `triggerAction`, or a combination:\n ```javascript\n import { alias } from '@ember/object/computed';\n App.SaveButtonView = Ember.View.extend(Ember.TargetActionSupport, {\n target: alias('controller'),\n click() {\n this.triggerAction({\n action: 'save'\n }); // Sends the `save` action, along with a reference to `this`,\n // to the current controller\n }\n });\n ```\n @method triggerAction\n @param opts {Object} (optional, with the optional keys action, target and/or actionContext)\n @return {Boolean} true if the action was sent successfully and did not return false\n @private\n */\n triggerAction: function () {\n var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var action = opts.action,\n target = opts.target,\n actionContext = opts.actionContext;\n\n action = action || (0, _emberMetal.get)(this, 'action');\n target = target || getTarget(this);\n\n if (actionContext === undefined) {\n actionContext = (0, _emberMetal.get)(this, 'actionContextObject') || this;\n }\n\n if (target && action) {\n var ret = void 0;\n\n if (target.send) {\n var _target;\n\n ret = (_target = target).send.apply(_target, [action].concat(actionContext));\n } else {\n var _target2;\n\n (true && !(typeof target[action] === 'function') && (0, _emberDebug.assert)('The action \\'' + action + '\\' did not exist on ' + target, typeof target[action] === 'function'));\n\n ret = (_target2 = target)[action].apply(_target2, [].concat(actionContext));\n }\n\n if (ret !== false) {\n return true;\n }\n }\n\n return false;\n }\n });\n\n\n function getTarget(instance) {\n var target = (0, _emberMetal.get)(instance, 'target');\n if (target) {\n if (typeof target === 'string') {\n var value = (0, _emberMetal.get)(instance, target);\n if (value === undefined) {\n value = (0, _emberMetal.get)(_emberEnvironment.context.lookup, target);\n }\n\n return value;\n } else {\n return target;\n }\n }\n\n // if a `targetObject` CP was provided, use it\n if (target) {\n return target;\n }\n\n // if _targetObject use it\n if (instance._targetObject) {\n return instance._targetObject;\n }\n\n return null;\n }\n});","enifed(\"ember-runtime/string_registry\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.setStrings = setStrings;\n exports.getStrings = getStrings;\n exports.get = get;\n // STATE within a module is frowned upon, this exists\n // to support Ember.STRINGS but shield ember internals from this legacy global\n // API.\n var STRINGS = {};\n\n function setStrings(strings) {\n STRINGS = strings;\n }\n\n function getStrings() {\n return STRINGS;\n }\n\n function get(name) {\n return STRINGS[name];\n }\n});","enifed('ember-runtime/system/application', ['exports', 'ember-runtime/system/namespace'], function (exports, _namespace) {\n 'use strict';\n\n exports.default = _namespace.default.extend();\n});","enifed('ember-runtime/system/array_proxy', ['exports', 'ember-metal', 'ember-runtime/utils', 'ember-runtime/system/object', 'ember-runtime/mixins/mutable_array', 'ember-runtime/mixins/array', 'ember-debug'], function (exports, _emberMetal, _utils, _object, _mutable_array, _array, _emberDebug) {\n 'use strict';\n\n var _EmberObject$extend;\n\n var ARRAY_OBSERVER_MAPPING = {\n willChange: '_arrangedContentArrayWillChange',\n didChange: '_arrangedContentArrayDidChange'\n };\n\n /**\n An ArrayProxy wraps any other object that implements `Array` and/or\n `MutableArray,` forwarding all requests. This makes it very useful for\n a number of binding use cases or other cases where being able to swap\n out the underlying array is useful.\n \n A simple example of usage:\n \n ```javascript\n import { A } from '@ember/array';\n import ArrayProxy from '@ember/array/proxy';\n \n let pets = ['dog', 'cat', 'fish'];\n let ap = ArrayProxy.create({ content: A(pets) });\n \n ap.get('firstObject'); // 'dog'\n ap.set('content', ['amoeba', 'paramecium']);\n ap.get('firstObject'); // 'amoeba'\n ```\n \n This class can also be useful as a layer to transform the contents of\n an array, as they are accessed. This can be done by overriding\n `objectAtContent`:\n \n ```javascript\n import { A } from '@ember/array';\n import ArrayProxy from '@ember/array/proxy';\n \n let pets = ['dog', 'cat', 'fish'];\n let ap = ArrayProxy.create({\n content: A(pets),\n objectAtContent: function(idx) {\n return this.get('content').objectAt(idx).toUpperCase();\n }\n });\n \n ap.get('firstObject'); // . 'DOG'\n ```\n \n @class ArrayProxy\n @extends EmberObject\n @uses MutableArray\n @public\n */\n exports.default = _object.default.extend(_mutable_array.default, (_EmberObject$extend = {\n init: function () {\n this._super.apply(this, arguments);\n\n /*\n `this._objectsDirtyIndex` determines which indexes in the `this._objects`\n cache are dirty.\n If `this._objectsDirtyIndex === -1` then no indexes are dirty.\n Otherwise, an index `i` is dirty if `i >= this._objectsDirtyIndex`.\n Calling `objectAt` with a dirty index will cause the `this._objects`\n cache to be recomputed.\n */\n this._objectsDirtyIndex = 0;\n this._objects = null;\n\n this._lengthDirty = true;\n this._length = 0;\n\n this._arrangedContent = null;\n this._addArrangedContentArrayObsever();\n },\n willDestroy: function () {\n this._removeArrangedContentArrayObsever();\n },\n\n\n /**\n The content array. Must be an object that implements `Array` and/or\n `MutableArray.`\n @property content\n @type EmberArray\n @public\n */\n content: null,\n\n /**\n The array that the proxy pretends to be. In the default `ArrayProxy`\n implementation, this and `content` are the same. Subclasses of `ArrayProxy`\n can override this property to provide things like sorting and filtering.\n @property arrangedContent\n @public\n */\n arrangedContent: (0, _emberMetal.alias)('content'),\n\n /**\n Should actually retrieve the object at the specified index from the\n content. You can override this method in subclasses to transform the\n content item to something new.\n This method will only be called if content is non-`null`.\n @method objectAtContent\n @param {Number} idx The index to retrieve.\n @return {Object} the value or undefined if none found\n @public\n */\n objectAtContent: function (idx) {\n return (0, _array.objectAt)((0, _emberMetal.get)(this, 'arrangedContent'), idx);\n },\n replace: function (idx, amt, objects) {\n (true && !((0, _emberMetal.get)(this, 'arrangedContent') === (0, _emberMetal.get)(this, 'content')) && (0, _emberDebug.assert)('Mutating an arranged ArrayProxy is not allowed', (0, _emberMetal.get)(this, 'arrangedContent') === (0, _emberMetal.get)(this, 'content')));\n\n this.replaceContent(idx, amt, objects);\n },\n\n\n /**\n Should actually replace the specified objects on the content array.\n You can override this method in subclasses to transform the content item\n into something new.\n This method will only be called if content is non-`null`.\n @method replaceContent\n @param {Number} idx The starting index\n @param {Number} amt The number of items to remove from the content.\n @param {EmberArray} objects Optional array of objects to insert or null if no\n objects.\n @return {void}\n @public\n */\n replaceContent: function (idx, amt, objects) {\n (0, _emberMetal.get)(this, 'content').replace(idx, amt, objects);\n },\n\n\n // Overriding objectAt is not supported.\n objectAt: function (idx) {\n if (this._objects === null) {\n this._objects = [];\n }\n\n if (this._objectsDirtyIndex !== -1 && idx >= this._objectsDirtyIndex) {\n var arrangedContent = (0, _emberMetal.get)(this, 'arrangedContent');\n if (arrangedContent) {\n var length = this._objects.length = (0, _emberMetal.get)(arrangedContent, 'length');\n\n for (var i = this._objectsDirtyIndex; i < length; i++) {\n this._objects[i] = this.objectAtContent(i);\n }\n } else {\n this._objects.length = 0;\n }\n this._objectsDirtyIndex = -1;\n }\n\n return this._objects[idx];\n },\n\n\n // Overriding length is not supported.\n length: (0, _emberMetal.computed)(function () {\n if (this._lengthDirty) {\n var arrangedContent = (0, _emberMetal.get)(this, 'arrangedContent');\n this._length = arrangedContent ? (0, _emberMetal.get)(arrangedContent, 'length') : 0;\n this._lengthDirty = false;\n }\n\n return this._length;\n }).volatile()\n\n }, _EmberObject$extend[_emberMetal.PROPERTY_DID_CHANGE] = function (key) {\n if (key === 'arrangedContent') {\n var oldLength = this._objects === null ? 0 : this._objects.length;\n var arrangedContent = (0, _emberMetal.get)(this, 'arrangedContent');\n var newLength = arrangedContent ? (0, _emberMetal.get)(arrangedContent, 'length') : 0;\n\n this._removeArrangedContentArrayObsever();\n this.arrayContentWillChange(0, oldLength, newLength);\n\n this._objectsDirtyIndex = 0;\n this._lengthDirty = true;\n\n this.arrayContentDidChange(0, oldLength, newLength);\n this._addArrangedContentArrayObsever();\n }\n }, _EmberObject$extend._addArrangedContentArrayObsever = function () {\n var arrangedContent = (0, _emberMetal.get)(this, 'arrangedContent');\n if (arrangedContent) {\n (true && !(arrangedContent !== this) && (0, _emberDebug.assert)('Can\\'t set ArrayProxy\\'s content to itself', arrangedContent !== this));\n (true && !((0, _utils.isArray)(arrangedContent) || arrangedContent.isDestroyed) && (0, _emberDebug.assert)('ArrayProxy expects an Array or ArrayProxy, but you passed ' + typeof arrangedContent, (0, _utils.isArray)(arrangedContent) || arrangedContent.isDestroyed));\n\n\n (0, _array.addArrayObserver)(arrangedContent, this, ARRAY_OBSERVER_MAPPING);\n\n this._arrangedContent = arrangedContent;\n }\n }, _EmberObject$extend._removeArrangedContentArrayObsever = function () {\n if (this._arrangedContent) {\n (0, _array.removeArrayObserver)(this._arrangedContent, this, ARRAY_OBSERVER_MAPPING);\n }\n }, _EmberObject$extend._arrangedContentArrayWillChange = function () {}, _EmberObject$extend._arrangedContentArrayDidChange = function (proxy, idx, removedCnt, addedCnt) {\n this.arrayContentWillChange(idx, removedCnt, addedCnt);\n\n var dirtyIndex = idx;\n if (dirtyIndex < 0) {\n var length = (0, _emberMetal.get)(this._arrangedContent, 'length');\n dirtyIndex += length + removedCnt - addedCnt;\n }\n\n if (this._objectsDirtyIndex === -1) {\n this._objectsDirtyIndex = dirtyIndex;\n } else {\n if (this._objectsDirtyIndex > dirtyIndex) {\n this._objectsDirtyIndex = dirtyIndex;\n }\n }\n\n this._lengthDirty = true;\n\n this.arrayContentDidChange(idx, removedCnt, addedCnt);\n }, _EmberObject$extend));\n});","enifed('ember-runtime/system/core_object', ['exports', 'ember-babel', 'ember-utils', 'ember-metal', 'ember-runtime/mixins/action_handler', 'ember-runtime/inject', 'ember-debug', 'ember-environment', 'ember/features'], function (exports, _emberBabel, _emberUtils, _emberMetal, _action_handler, _inject, _emberDebug, _emberEnvironment, _features) {\n 'use strict';\n\n exports.POST_INIT = undefined;\n\n var _Mixin$create, _ClassMixinProps;\n\n var schedule = _emberMetal.run.schedule;\n var applyMixin = _emberMetal.Mixin._apply;\n var reopen = _emberMetal.Mixin.prototype.reopen;\n\n var POST_INIT = exports.POST_INIT = (0, _emberUtils.symbol)('POST_INIT');\n\n function makeCtor() {\n // Note: avoid accessing any properties on the object since it makes the\n // method a lot faster. This is glue code so we want it to be as fast as\n // possible.\n\n var wasApplied = false;\n var initProperties = void 0,\n initFactory = void 0;\n\n var Class = function () {\n function Class() {\n (0, _emberBabel.classCallCheck)(this, Class);\n\n if (!wasApplied) {\n Class.proto(); // prepare prototype...\n }\n\n if (arguments.length > 0) {\n initProperties = [arguments[0]];\n }\n\n this.__defineNonEnumerable(_emberUtils.GUID_KEY_PROPERTY);\n var m = (0, _emberMetal.meta)(this);\n var proto = m.proto;\n m.proto = this;\n\n if (initFactory) {\n m.factory = initFactory;\n initFactory = null;\n }\n if (initProperties) {\n // capture locally so we can clear the closed over variable\n var props = initProperties;\n initProperties = null;\n\n var concatenatedProperties = this.concatenatedProperties;\n var mergedProperties = this.mergedProperties;\n var hasConcatenatedProps = concatenatedProperties && concatenatedProperties.length > 0;\n var hasMergedProps = mergedProperties && mergedProperties.length > 0;\n\n for (var i = 0; i < props.length; i++) {\n var properties = props[i];\n\n (true && !(typeof properties === 'object' || properties === undefined) && (0, _emberDebug.assert)('EmberObject.create only accepts objects.', typeof properties === 'object' || properties === undefined));\n (true && !(!(properties instanceof _emberMetal.Mixin)) && (0, _emberDebug.assert)('EmberObject.create no longer supports mixing in other ' + 'definitions, use .extend & .create separately instead.', !(properties instanceof _emberMetal.Mixin)));\n\n\n if (!properties) {\n continue;\n }\n\n var keyNames = Object.keys(properties);\n\n for (var j = 0; j < keyNames.length; j++) {\n var keyName = keyNames[j];\n var value = properties[keyName];\n\n if (_emberEnvironment.ENV._ENABLE_BINDING_SUPPORT && _emberMetal.Mixin.detectBinding(keyName)) {\n m.writeBindings(keyName, value);\n }\n\n (true && !(!(value instanceof _emberMetal.ComputedProperty)) && (0, _emberDebug.assert)('EmberObject.create no longer supports defining computed ' + 'properties. Define computed properties using extend() or reopen() ' + 'before calling create().', !(value instanceof _emberMetal.ComputedProperty)));\n (true && !(!(typeof value === 'function' && value.toString().indexOf('._super') !== -1)) && (0, _emberDebug.assert)('EmberObject.create no longer supports defining methods that call _super.', !(typeof value === 'function' && value.toString().indexOf('._super') !== -1)));\n (true && !(!(keyName === 'actions' && _action_handler.default.detect(this))) && (0, _emberDebug.assert)('`actions` must be provided at extend time, not at create time, ' + 'when ActionHandler is used (i.e. views, controllers & routes).', !(keyName === 'actions' && _action_handler.default.detect(this))));\n\n\n var possibleDesc = (0, _emberMetal.descriptorFor)(this, keyName, m);\n var isDescriptor = possibleDesc !== undefined;\n\n if (!isDescriptor) {\n var baseValue = this[keyName];\n\n if (hasConcatenatedProps && concatenatedProperties.indexOf(keyName) > -1) {\n if (baseValue) {\n value = (0, _emberUtils.makeArray)(baseValue).concat(value);\n } else {\n value = (0, _emberUtils.makeArray)(value);\n }\n }\n\n if (hasMergedProps && mergedProperties.indexOf(keyName) > -1) {\n value = (0, _emberUtils.assign)({}, baseValue, value);\n }\n }\n\n if (isDescriptor) {\n possibleDesc.set(this, keyName, value);\n } else if (typeof this.setUnknownProperty === 'function' && !(keyName in this)) {\n this.setUnknownProperty(keyName, value);\n } else {\n if (_features.MANDATORY_SETTER) {\n (0, _emberMetal.defineProperty)(this, keyName, null, value); // setup mandatory setter\n } else {\n this[keyName] = value;\n }\n }\n }\n }\n }\n\n if (_emberEnvironment.ENV._ENABLE_BINDING_SUPPORT) {\n _emberMetal.Mixin.finishPartial(this, m);\n }\n\n this.init.apply(this, arguments);\n\n this[POST_INIT]();\n\n m.proto = proto;\n (0, _emberMetal.finishChains)(m);\n (0, _emberMetal.sendEvent)(this, 'init', undefined, undefined, undefined, m);\n }\n\n Class.willReopen = function willReopen() {\n if (wasApplied) {\n Class.PrototypeMixin = _emberMetal.Mixin.create(Class.PrototypeMixin);\n }\n\n wasApplied = false;\n };\n\n Class._initProperties = function _initProperties(args) {\n initProperties = args;\n };\n\n Class._initFactory = function _initFactory(factory) {\n initFactory = factory;\n };\n\n Class.proto = function proto() {\n var superclass = Class.superclass;\n if (superclass) {\n superclass.proto();\n }\n\n if (!wasApplied) {\n wasApplied = true;\n Class.PrototypeMixin.applyPartial(Class.prototype);\n }\n\n return this.prototype;\n };\n\n return Class;\n }();\n\n Class.toString = _emberMetal.Mixin.prototype.toString;\n\n return Class;\n }\n\n var IS_DESTROYED = (0, _emberMetal.descriptor)({\n configurable: true,\n enumerable: false,\n\n get: function () {\n return (0, _emberMetal.peekMeta)(this).isSourceDestroyed();\n },\n set: function (value) {\n (true && !(value === IS_DESTROYED) && (0, _emberDebug.assert)('You cannot set `' + this + '.isDestroyed` directly, please use `.destroy()`.', value === IS_DESTROYED));\n }\n });\n\n var IS_DESTROYING = (0, _emberMetal.descriptor)({\n configurable: true,\n enumerable: false,\n\n get: function () {\n return (0, _emberMetal.peekMeta)(this).isSourceDestroying();\n },\n set: function (value) {\n (true && !(value === IS_DESTROYING) && (0, _emberDebug.assert)('You cannot set `' + this + '.isDestroying` directly, please use `.destroy()`.', value === IS_DESTROYING));\n }\n });\n\n /**\n @class CoreObject\n @public\n */\n var CoreObject = makeCtor();\n CoreObject.toString = function () {\n return 'Ember.CoreObject';\n };\n CoreObject.PrototypeMixin = _emberMetal.Mixin.create((_Mixin$create = {\n reopen: function () {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n applyMixin(this, args, true);\n return this;\n },\n init: function () {}\n }, _Mixin$create[POST_INIT] = function () {}, _Mixin$create.__defineNonEnumerable = function (property) {\n Object.defineProperty(this, property.name, property.descriptor);\n //this[property.name] = property.descriptor.value;\n }, _Mixin$create.concatenatedProperties = null, _Mixin$create.mergedProperties = null, _Mixin$create.isDestroyed = IS_DESTROYED, _Mixin$create.isDestroying = IS_DESTROYING, _Mixin$create.destroy = function () {\n var m = (0, _emberMetal.peekMeta)(this);\n if (m.isSourceDestroying()) {\n return;\n }\n\n m.setSourceDestroying();\n\n schedule('actions', this, this.willDestroy);\n schedule('destroy', this, this._scheduledDestroy, m);\n\n return this;\n }, _Mixin$create.willDestroy = function () {}, _Mixin$create._scheduledDestroy = function (m) {\n if (m.isSourceDestroyed()) {\n return;\n }\n (0, _emberMetal.deleteMeta)(this);\n m.setSourceDestroyed();\n }, _Mixin$create.toString = function () {\n var hasToStringExtension = typeof this.toStringExtension === 'function';\n var extension = hasToStringExtension ? ':' + this.toStringExtension() : '';\n\n var ret = '<' + (this[_emberUtils.NAME_KEY] || (0, _emberMetal.peekMeta)(this).factory || this.constructor.toString()) + ':' + (0, _emberUtils.guidFor)(this) + extension + '>';\n\n return ret;\n }, _Mixin$create));\n\n CoreObject.PrototypeMixin.ownerConstructor = CoreObject;\n\n CoreObject.__super__ = null;\n\n var ClassMixinProps = (_ClassMixinProps = {\n\n isClass: true,\n\n isMethod: false\n }, _ClassMixinProps[_emberUtils.NAME_KEY] = null, _ClassMixinProps[_emberUtils.GUID_KEY] = null, _ClassMixinProps.extend = function () {\n var Class = makeCtor();\n var proto = void 0;\n Class.ClassMixin = _emberMetal.Mixin.create(this.ClassMixin);\n Class.PrototypeMixin = _emberMetal.Mixin.create(this.PrototypeMixin);\n\n Class.ClassMixin.ownerConstructor = Class;\n Class.PrototypeMixin.ownerConstructor = Class;\n\n reopen.apply(Class.PrototypeMixin, arguments);\n\n Class.superclass = this;\n Class.__super__ = this.prototype;\n\n proto = Class.prototype = Object.create(this.prototype);\n proto.constructor = Class;\n (0, _emberUtils.generateGuid)(proto);\n (0, _emberMetal.meta)(proto).proto = proto; // this will disable observers on prototype\n\n Class.ClassMixin.apply(Class);\n return Class;\n }, _ClassMixinProps.create = function () {\n var C = this;\n\n for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n if (args.length > 0) {\n this._initProperties(args);\n }\n return new C();\n }, _ClassMixinProps.reopen = function () {\n this.willReopen();\n reopen.apply(this.PrototypeMixin, arguments);\n return this;\n }, _ClassMixinProps.reopenClass = function () {\n reopen.apply(this.ClassMixin, arguments);\n applyMixin(this, arguments, false);\n return this;\n }, _ClassMixinProps.detect = function (obj) {\n if ('function' !== typeof obj) {\n return false;\n }\n while (obj) {\n if (obj === this) {\n return true;\n }\n obj = obj.superclass;\n }\n return false;\n }, _ClassMixinProps.detectInstance = function (obj) {\n return obj instanceof this;\n }, _ClassMixinProps.metaForProperty = function (key) {\n var proto = this.proto();\n var possibleDesc = (0, _emberMetal.descriptorFor)(proto, key);\n\n (true && !(possibleDesc !== undefined) && (0, _emberDebug.assert)('metaForProperty() could not find a computed property with key \\'' + key + '\\'.', possibleDesc !== undefined));\n\n return possibleDesc._meta || {};\n }, _ClassMixinProps._computedProperties = (0, _emberMetal.computed)(function () {\n (0, _emberMetal._hasCachedComputedProperties)();\n var proto = this.proto();\n var possibleDesc = void 0;\n var properties = [];\n\n for (var name in proto) {\n possibleDesc = (0, _emberMetal.descriptorFor)(proto, name);\n\n if (possibleDesc !== undefined) {\n properties.push({\n name: name,\n meta: possibleDesc._meta\n });\n }\n }\n return properties;\n }).readOnly(), _ClassMixinProps.eachComputedProperty = function (callback, binding) {\n var property = void 0;\n var empty = {};\n\n var properties = (0, _emberMetal.get)(this, '_computedProperties');\n\n for (var i = 0; i < properties.length; i++) {\n property = properties[i];\n callback.call(binding || this, property.name, property.meta || empty);\n }\n }, _ClassMixinProps);\n\n if (_emberEnvironment.ENV._ENABLE_PROPERTY_REQUIRED_SUPPORT) {\n ClassMixinProps.ClassMixin = _emberMetal.REQUIRED;\n ClassMixinProps.PrototypeMixin = _emberMetal.REQUIRED;\n }\n\n function injectedPropertyAssertion() {\n (true && !((0, _inject.validatePropertyInjections)(this)) && (0, _emberDebug.assert)('Injected properties are invalid', (0, _inject.validatePropertyInjections)(this)));\n }\n\n if (true) {\n /**\n Provides lookup-time type validation for injected properties.\n @private\n @method _onLookup\n */\n ClassMixinProps._onLookup = injectedPropertyAssertion;\n /**\n Returns a hash of property names and container names that injected\n properties will lookup on the container lazily.\n @method _lazyInjections\n @return {Object} Hash of all lazy injected property keys to container names\n @private\n */\n ClassMixinProps._lazyInjections = function () {\n var injections = {};\n var proto = this.proto();\n var key = void 0;\n var desc = void 0;\n\n for (key in proto) {\n desc = (0, _emberMetal.descriptorFor)(proto, key);\n if (desc instanceof _emberMetal.InjectedProperty) {\n injections[key] = desc.type + ':' + (desc.name || key);\n }\n }\n\n return injections;\n };\n }\n\n var ClassMixin = _emberMetal.Mixin.create(ClassMixinProps);\n\n ClassMixin.ownerConstructor = CoreObject;\n\n CoreObject.ClassMixin = ClassMixin;\n\n ClassMixin.apply(CoreObject);\n exports.default = CoreObject;\n});","enifed('ember-runtime/system/lazy_load', ['exports', 'ember-environment'], function (exports, _emberEnvironment) {\n 'use strict';\n\n exports._loaded = undefined;\n exports.onLoad = onLoad;\n exports.runLoadHooks = runLoadHooks;\n\n\n /**\n @module @ember/application\n */\n\n var loadHooks = _emberEnvironment.ENV.EMBER_LOAD_HOOKS || {}; /*globals CustomEvent */\n\n var loaded = {};\n var _loaded = exports._loaded = loaded;\n\n /**\n Detects when a specific package of Ember (e.g. 'Application')\n has fully loaded and is available for extension.\n \n The provided `callback` will be called with the `name` passed\n resolved from a string into the object:\n \n ``` javascript\n import { onLoad } from '@ember/application';\n \n onLoad('Ember.Application' function(hbars) {\n hbars.registerHelper(...);\n });\n ```\n \n @method onLoad\n @static\n @for @ember/application\n @param name {String} name of hook\n @param callback {Function} callback to be called\n @private\n */\n function onLoad(name, callback) {\n var object = loaded[name];\n\n loadHooks[name] = loadHooks[name] || [];\n loadHooks[name].push(callback);\n\n if (object) {\n callback(object);\n }\n }\n\n /**\n Called when an Ember.js package (e.g Application) has finished\n loading. Triggers any callbacks registered for this event.\n \n @method runLoadHooks\n @static\n @for @ember/application\n @param name {String} name of hook\n @param object {Object} object to pass to callbacks\n @private\n */\n function runLoadHooks(name, object) {\n loaded[name] = object;\n var window = _emberEnvironment.environment.window;\n\n if (window && typeof CustomEvent === 'function') {\n var event = new CustomEvent(name, { detail: object, name: name });\n window.dispatchEvent(event);\n }\n\n if (loadHooks[name]) {\n loadHooks[name].forEach(function (callback) {\n return callback(object);\n });\n }\n }\n});","enifed('ember-runtime/system/namespace', ['exports', 'ember-utils', 'ember-metal', 'ember-environment', 'ember-runtime/system/object'], function (exports, _emberUtils, _emberMetal, _emberEnvironment, _object) {\n 'use strict';\n\n exports.isSearchDisabled = isSearchDisabled;\n exports.setSearchDisabled = setSearchDisabled;\n\n\n var searchDisabled = false; // Preloaded into namespaces\n /**\n @module ember\n */\n function isSearchDisabled() {\n return searchDisabled;\n }\n\n function setSearchDisabled(flag) {\n searchDisabled = !!flag;\n }\n\n /**\n A Namespace is an object usually used to contain other objects or methods\n such as an application or framework. Create a namespace anytime you want\n to define one of these new containers.\n \n # Example Usage\n \n ```javascript\n MyFramework = Ember.Namespace.create({\n VERSION: '1.0.0'\n });\n ```\n \n @class Namespace\n @namespace Ember\n @extends EmberObject\n @public\n */\n var Namespace = _object.default.extend({\n isNamespace: true,\n\n init: function () {\n Namespace.NAMESPACES.push(this);\n Namespace.PROCESSED = false;\n },\n toString: function () {\n var name = (0, _emberMetal.get)(this, 'name') || (0, _emberMetal.get)(this, 'modulePrefix');\n if (name) {\n return name;\n }\n\n findNamespaces();\n return this[_emberUtils.NAME_KEY];\n },\n nameClasses: function () {\n processNamespace([this.toString()], this, {});\n },\n destroy: function () {\n var namespaces = Namespace.NAMESPACES;\n var toString = this.toString();\n\n if (toString) {\n _emberEnvironment.context.lookup[toString] = undefined;\n delete Namespace.NAMESPACES_BY_ID[toString];\n }\n namespaces.splice(namespaces.indexOf(this), 1);\n this._super.apply(this, arguments);\n }\n });\n\n Namespace.reopenClass({\n NAMESPACES: [_emberMetal.default],\n NAMESPACES_BY_ID: {\n Ember: _emberMetal.default\n },\n PROCESSED: false,\n processAll: processAllNamespaces,\n byName: function (name) {\n if (!searchDisabled) {\n processAllNamespaces();\n }\n\n return NAMESPACES_BY_ID[name];\n }\n });\n\n var NAMESPACES_BY_ID = Namespace.NAMESPACES_BY_ID;\n\n var hasOwnProp = {}.hasOwnProperty;\n\n function processNamespace(paths, root, seen) {\n var idx = paths.length;\n\n NAMESPACES_BY_ID[paths.join('.')] = root;\n\n // Loop over all of the keys in the namespace, looking for classes\n for (var key in root) {\n if (!hasOwnProp.call(root, key)) {\n continue;\n }\n var obj = root[key];\n\n // If we are processing the `Ember` namespace, for example, the\n // `paths` will start with `[\"Ember\"]`. Every iteration through\n // the loop will update the **second** element of this list with\n // the key, so processing `Ember.View` will make the Array\n // `['Ember', 'View']`.\n paths[idx] = key;\n\n // If we have found an unprocessed class\n if (obj && obj.toString === classToString && !obj[_emberUtils.NAME_KEY]) {\n // Replace the class' `toString` with the dot-separated path\n // and set its `NAME_KEY`\n obj[_emberUtils.NAME_KEY] = paths.join('.');\n\n // Support nested namespaces\n } else if (obj && obj.isNamespace) {\n // Skip aliased namespaces\n if (seen[(0, _emberUtils.guidFor)(obj)]) {\n continue;\n }\n seen[(0, _emberUtils.guidFor)(obj)] = true;\n\n // Process the child namespace\n processNamespace(paths, obj, seen);\n }\n }\n\n paths.length = idx; // cut out last item\n }\n\n function isUppercase(code) {\n return code >= 65 && // A\n code <= 90; // Z\n }\n\n function tryIsNamespace(lookup, prop) {\n try {\n var obj = lookup[prop];\n return obj && obj.isNamespace && obj;\n } catch (e) {\n // continue\n }\n }\n\n function findNamespaces() {\n if (Namespace.PROCESSED) {\n return;\n }\n var lookup = _emberEnvironment.context.lookup;\n var keys = Object.keys(lookup);\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n // Only process entities that start with uppercase A-Z\n if (!isUppercase(key.charCodeAt(0))) {\n continue;\n }\n var obj = tryIsNamespace(lookup, key);\n if (obj) {\n obj[_emberUtils.NAME_KEY] = key;\n }\n }\n }\n\n function superClassString(mixin) {\n var superclass = mixin.superclass;\n if (superclass) {\n if (superclass[_emberUtils.NAME_KEY]) {\n return superclass[_emberUtils.NAME_KEY];\n }\n return superClassString(superclass);\n }\n }\n\n function calculateToString(target) {\n var str = void 0;\n\n if (!searchDisabled) {\n processAllNamespaces();\n // can also be set by processAllNamespaces\n str = target[_emberUtils.NAME_KEY];\n if (str) {\n return str;\n } else {\n str = superClassString(target);\n str = str ? '(subclass of ' + str + ')' : str;\n }\n }\n if (str) {\n return str;\n } else {\n return '(unknown mixin)';\n }\n }\n\n function classToString() {\n var name = this[_emberUtils.NAME_KEY];\n if (name) {\n return name;\n }\n\n return this[_emberUtils.NAME_KEY] = calculateToString(this);\n }\n\n function processAllNamespaces() {\n var unprocessedNamespaces = !Namespace.PROCESSED;\n var unprocessedMixins = (0, _emberMetal.hasUnprocessedMixins)();\n\n if (unprocessedNamespaces) {\n findNamespaces();\n Namespace.PROCESSED = true;\n }\n\n if (unprocessedNamespaces || unprocessedMixins) {\n var namespaces = Namespace.NAMESPACES;\n var namespace = void 0;\n\n for (var i = 0; i < namespaces.length; i++) {\n namespace = namespaces[i];\n processNamespace([namespace.toString()], namespace, {});\n }\n\n (0, _emberMetal.clearUnprocessedMixins)();\n }\n }\n\n _emberMetal.Mixin.prototype.toString = classToString; // ES6TODO: altering imported objects. SBB.\n\n exports.default = Namespace;\n});","enifed('ember-runtime/system/native_array', ['exports', 'ember-metal', 'ember-environment', 'ember-runtime/mixins/array', 'ember-runtime/mixins/mutable_array', 'ember-runtime/mixins/observable', 'ember-runtime/mixins/copyable', 'ember-debug', 'ember-runtime/copy'], function (exports, _emberMetal, _emberEnvironment, _array, _mutable_array, _observable, _copyable, _emberDebug, _copy) {\n 'use strict';\n\n exports.NativeArray = exports.A = undefined;\n\n var _NativeArray;\n\n // Add Ember.Array to Array.prototype. Remove methods with native\n // implementations and supply some more optimized versions of generic methods\n // because they are so common.\n\n /**\n The NativeArray mixin contains the properties needed to make the native\n Array support MutableArray and all of its dependent APIs. Unless you\n have `EmberENV.EXTEND_PROTOTYPES` or `EmberENV.EXTEND_PROTOTYPES.Array` set to\n false, this will be applied automatically. Otherwise you can apply the mixin\n at anytime by calling `Ember.NativeArray.apply(Array.prototype)`.\n \n @class Ember.NativeArray\n @uses MutableArray\n @uses Observable\n @uses Ember.Copyable\n @public\n */\n var NativeArray = _emberMetal.Mixin.create(_mutable_array.default, _observable.default, _copyable.default, {\n get: function (key) {\n if ('number' === typeof key) {\n return this[key];\n } else {\n return this._super(key);\n }\n },\n objectAt: function (idx) {\n return this[idx];\n },\n replace: function (idx, amt, objects) {\n (true && !(objects === null || objects === undefined || Array.isArray(objects)) && (0, _emberDebug.assert)('The third argument to replace needs to be an array.', objects === null || objects === undefined || Array.isArray(objects)));\n\n\n // if we replaced exactly the same number of items, then pass only the\n // replaced range. Otherwise, pass the full remaining array length\n // since everything has shifted\n var len = objects ? (0, _emberMetal.get)(objects, 'length') : 0;\n (0, _array.arrayContentWillChange)(this, idx, amt, len);\n\n if (len === 0) {\n this.splice(idx, amt);\n } else {\n (0, _emberMetal.replace)(this, idx, amt, objects);\n }\n\n (0, _array.arrayContentDidChange)(this, idx, amt, len);\n return this;\n },\n unknownProperty: function (key, value) {\n var ret = void 0; // = this.reducedProperty(key, value);\n if (value !== undefined && ret === undefined) {\n ret = this[key] = value;\n }\n return ret;\n },\n\n\n indexOf: Array.prototype.indexOf,\n lastIndexOf: Array.prototype.lastIndexOf,\n\n copy: function (deep) {\n if (deep) {\n return this.map(function (item) {\n return (0, _copy.default)(item, true);\n });\n }\n\n return this.slice();\n }\n });\n\n // Remove any methods implemented natively so we don't override them\n var ignore = ['length'];\n NativeArray.keys().forEach(function (methodName) {\n if (Array.prototype[methodName]) {\n ignore.push(methodName);\n }\n });\n\n exports.NativeArray = NativeArray = (_NativeArray = NativeArray).without.apply(_NativeArray, ignore);\n /**\n @module @ember/array\n */\n /**\n Creates an `Ember.NativeArray` from an Array-like object.\n Does not modify the original object's contents. `A()` is not needed if\n `EmberENV.EXTEND_PROTOTYPES` is `true` (the default value). However,\n it is recommended that you use `A()` when creating addons for\n ember or when you can not guarantee that `EmberENV.EXTEND_PROTOTYPES`\n will be `true`.\n \n Example\n \n ```app/components/my-component.js\n import Component from '@ember/component';\n import { A } from '@ember/array';\n \n export default Component.extend({\n tagName: 'ul',\n classNames: ['pagination'],\n \n init() {\n this._super(...arguments);\n \n if (!this.get('content')) {\n this.set('content', A());\n this.set('otherContent', A([1,2,3]));\n }\n }\n });\n ```\n \n @method A\n @static\n @for @ember/array\n @return {Ember.NativeArray}\n @public\n */\n var A = void 0;\n\n if (_emberEnvironment.ENV.EXTEND_PROTOTYPES.Array) {\n NativeArray.apply(Array.prototype);\n exports.A = A = function (arr) {\n return arr || [];\n };\n } else {\n exports.A = A = function (arr) {\n if (!arr) {\n arr = [];\n }\n return _array.default.detect(arr) ? arr : NativeArray.apply(arr);\n };\n }\n\n _emberMetal.default.A = A;\n exports.A = A;\n exports.NativeArray = NativeArray;\n exports.default = NativeArray;\n});","enifed('ember-runtime/system/object', ['exports', 'ember-utils', 'ember-metal', 'ember-runtime/system/core_object', 'ember-runtime/mixins/observable', 'ember-debug'], function (exports, _emberUtils, _emberMetal, _core_object, _observable, _emberDebug) {\n 'use strict';\n\n exports.FrameworkObject = undefined;\n\n var _CoreObject$extend;\n\n var OVERRIDE_OWNER = (0, _emberUtils.symbol)('OVERRIDE_OWNER');\n\n /**\n `EmberObject` is the main base class for all Ember objects. It is a subclass\n of `CoreObject` with the `Observable` mixin applied. For details,\n see the documentation for each of these.\n \n @class EmberObject\n @extends CoreObject\n @uses Observable\n @public\n */\n var EmberObject = _core_object.default.extend(_observable.default, (_CoreObject$extend = {\n _debugContainerKey: (0, _emberMetal.descriptor)({\n enumerable: false,\n get: function () {\n var meta = (0, _emberMetal.peekMeta)(this);\n var factory = meta.factory;\n\n\n return factory && factory.fullName;\n }\n })\n\n }, _CoreObject$extend[_emberUtils.OWNER] = (0, _emberMetal.descriptor)({\n enumerable: false,\n get: function () {\n if (this[OVERRIDE_OWNER]) {\n return this[OVERRIDE_OWNER];\n }\n\n var meta = (0, _emberMetal.peekMeta)(this);\n var factory = meta.factory;\n\n\n return factory && factory.owner;\n },\n set: function (value) {\n this[OVERRIDE_OWNER] = value;\n }\n }), _CoreObject$extend));\n\n EmberObject.toString = function () {\n return 'Ember.Object';\n };\n\n var FrameworkObject = exports.FrameworkObject = EmberObject;\n\n if (true) {\n var _EmberObject$extend;\n\n var INIT_WAS_CALLED = (0, _emberUtils.symbol)('INIT_WAS_CALLED');\n var ASSERT_INIT_WAS_CALLED = (0, _emberUtils.symbol)('ASSERT_INIT_WAS_CALLED');\n\n exports.FrameworkObject = FrameworkObject = EmberObject.extend((_EmberObject$extend = {\n init: function () {\n this._super.apply(this, arguments);\n this[INIT_WAS_CALLED] = true;\n }\n }, _EmberObject$extend[ASSERT_INIT_WAS_CALLED] = (0, _emberMetal.on)('init', function () {\n (true && !(this[INIT_WAS_CALLED]) && (0, _emberDebug.assert)('You must call `this._super(...arguments);` when overriding `init` on a framework object. Please update ' + this + ' to call `this._super(...arguments);` from `init`.', this[INIT_WAS_CALLED]));\n }), _EmberObject$extend));\n }\n\n exports.default = EmberObject;\n});","enifed('ember-runtime/system/object_proxy', ['exports', 'ember-runtime/system/object', 'ember-runtime/mixins/-proxy'], function (exports, _object, _proxy) {\n 'use strict';\n\n exports.default = _object.default.extend(_proxy.default);\n});","enifed('ember-runtime/system/service', ['exports', 'ember-runtime/system/object', 'ember-runtime/inject'], function (exports, _object, _inject) {\n 'use strict';\n\n /**\n @module @ember/service\n @public\n */\n\n /**\n Creates a property that lazily looks up a service in the container. There\n are no restrictions as to what objects a service can be injected into.\n \n Example:\n \n ```app/routes/application.js\n import Route from '@ember/routing/route';\n import { inject as service } from '@ember/service';\n \n export default Route.extend({\n authManager: service('auth'),\n \n model() {\n return this.get('authManager').findCurrentUser();\n }\n });\n ```\n \n This example will create an `authManager` property on the application route\n that looks up the `auth` service in the container, making it easily\n accessible in the `model` hook.\n \n @method inject\n @static\n @since 1.10.0\n @for @ember/service\n @param {String} name (optional) name of the service to inject, defaults to\n the property's name\n @return {Ember.InjectedProperty} injection descriptor instance\n @public\n */\n (0, _inject.createInjectionHelper)('service');\n\n /**\n @class Service\n @extends EmberObject\n @since 1.10.0\n @public\n */\n var Service = _object.default.extend();\n\n Service.reopenClass({\n isServiceFactory: true\n });\n\n exports.default = Service;\n});","enifed('ember-runtime/system/string', ['exports', 'ember-metal', 'ember-utils', 'ember-runtime/utils', 'ember-runtime/string_registry'], function (exports, _emberMetal, _emberUtils, _utils, _string_registry) {\n 'use strict';\n\n exports.capitalize = exports.underscore = exports.classify = exports.camelize = exports.dasherize = exports.decamelize = exports.w = exports.loc = undefined;\n /**\n @module @ember/string\n */\n var STRING_DASHERIZE_REGEXP = /[ _]/g;\n\n var STRING_DASHERIZE_CACHE = new _emberMetal.Cache(1000, function (key) {\n return decamelize(key).replace(STRING_DASHERIZE_REGEXP, '-');\n });\n\n var STRING_CAMELIZE_REGEXP_1 = /(\\-|\\_|\\.|\\s)+(.)?/g;\n var STRING_CAMELIZE_REGEXP_2 = /(^|\\/)([A-Z])/g;\n\n var CAMELIZE_CACHE = new _emberMetal.Cache(1000, function (key) {\n return key.replace(STRING_CAMELIZE_REGEXP_1, function (match, separator, chr) {\n return chr ? chr.toUpperCase() : '';\n }).replace(STRING_CAMELIZE_REGEXP_2, function (match /*, separator, chr */) {\n return match.toLowerCase();\n });\n });\n\n var STRING_CLASSIFY_REGEXP_1 = /^(\\-|_)+(.)?/;\n var STRING_CLASSIFY_REGEXP_2 = /(.)(\\-|\\_|\\.|\\s)+(.)?/g;\n var STRING_CLASSIFY_REGEXP_3 = /(^|\\/|\\.)([a-z])/g;\n\n var CLASSIFY_CACHE = new _emberMetal.Cache(1000, function (str) {\n var replace1 = function (match, separator, chr) {\n return chr ? '_' + chr.toUpperCase() : '';\n };\n var replace2 = function (match, initialChar, separator, chr) {\n return initialChar + (chr ? chr.toUpperCase() : '');\n };\n var parts = str.split('/');\n for (var i = 0; i < parts.length; i++) {\n parts[i] = parts[i].replace(STRING_CLASSIFY_REGEXP_1, replace1).replace(STRING_CLASSIFY_REGEXP_2, replace2);\n }\n return parts.join('/').replace(STRING_CLASSIFY_REGEXP_3, function (match /*, separator, chr */) {\n return match.toUpperCase();\n });\n });\n\n var STRING_UNDERSCORE_REGEXP_1 = /([a-z\\d])([A-Z]+)/g;\n var STRING_UNDERSCORE_REGEXP_2 = /\\-|\\s+/g;\n\n var UNDERSCORE_CACHE = new _emberMetal.Cache(1000, function (str) {\n return str.replace(STRING_UNDERSCORE_REGEXP_1, '$1_$2').replace(STRING_UNDERSCORE_REGEXP_2, '_').toLowerCase();\n });\n\n var STRING_CAPITALIZE_REGEXP = /(^|\\/)([a-z\\u00C0-\\u024F])/g;\n\n var CAPITALIZE_CACHE = new _emberMetal.Cache(1000, function (str) {\n return str.replace(STRING_CAPITALIZE_REGEXP, function (match /*, separator, chr */) {\n return match.toUpperCase();\n });\n });\n\n var STRING_DECAMELIZE_REGEXP = /([a-z\\d])([A-Z])/g;\n\n var DECAMELIZE_CACHE = new _emberMetal.Cache(1000, function (str) {\n return str.replace(STRING_DECAMELIZE_REGEXP, '$1_$2').toLowerCase();\n });\n\n function _fmt(str, formats) {\n var cachedFormats = formats;\n\n if (!(0, _utils.isArray)(cachedFormats) || arguments.length > 2) {\n cachedFormats = new Array(arguments.length - 1);\n\n for (var i = 1; i < arguments.length; i++) {\n cachedFormats[i - 1] = arguments[i];\n }\n }\n\n // first, replace any ORDERED replacements.\n var idx = 0; // the current index for non-numerical replacements\n return str.replace(/%@([0-9]+)?/g, function (s, argIndex) {\n argIndex = argIndex ? parseInt(argIndex, 10) - 1 : idx++;\n s = cachedFormats[argIndex];\n return s === null ? '(null)' : s === undefined ? '' : (0, _emberUtils.inspect)(s);\n });\n }\n\n function loc(str, formats) {\n if (!(0, _utils.isArray)(formats) || arguments.length > 2) {\n formats = Array.prototype.slice.call(arguments, 1);\n }\n\n str = (0, _string_registry.get)(str) || str;\n return _fmt(str, formats);\n }\n\n function w(str) {\n return str.split(/\\s+/);\n }\n\n function decamelize(str) {\n return DECAMELIZE_CACHE.get(str);\n }\n\n function dasherize(str) {\n return STRING_DASHERIZE_CACHE.get(str);\n }\n\n function camelize(str) {\n return CAMELIZE_CACHE.get(str);\n }\n\n function classify(str) {\n return CLASSIFY_CACHE.get(str);\n }\n\n function underscore(str) {\n return UNDERSCORE_CACHE.get(str);\n }\n\n function capitalize(str) {\n return CAPITALIZE_CACHE.get(str);\n }\n\n /**\n Defines string helper methods including string formatting and localization.\n Unless `EmberENV.EXTEND_PROTOTYPES.String` is `false` these methods will also be\n added to the `String.prototype` as well.\n \n @class String\n @public\n */\n exports.default = {\n /**\n Formats the passed string, but first looks up the string in the localized\n strings hash. This is a convenient way to localize text.\n Note that it is traditional but not required to prefix localized string\n keys with an underscore or other character so you can easily identify\n localized strings.\n ```javascript\n import { loc } from '@ember/string';\n Ember.STRINGS = {\n '_Hello World': 'Bonjour le monde',\n '_Hello %@ %@': 'Bonjour %@ %@'\n };\n loc(\"_Hello World\"); // 'Bonjour le monde';\n loc(\"_Hello %@ %@\", [\"John\", \"Smith\"]); // \"Bonjour John Smith\";\n ```\n @method loc\n @param {String} str The string to format\n @param {Array} formats Optional array of parameters to interpolate into string.\n @return {String} formatted string\n @public\n */\n loc: loc,\n\n /**\n Splits a string into separate units separated by spaces, eliminating any\n empty strings in the process. This is a convenience method for split that\n is mostly useful when applied to the `String.prototype`.\n ```javascript\n import { w } from '@ember/string';\n w(\"alpha beta gamma\").forEach(function(key) {\n console.log(key);\n });\n // > alpha\n // > beta\n // > gamma\n ```\n @method w\n @param {String} str The string to split\n @return {Array} array containing the split strings\n @public\n */\n w: w,\n\n /**\n Converts a camelized string into all lower case separated by underscores.\n ```javascript\n 'innerHTML'.decamelize(); // 'inner_html'\n 'action_name'.decamelize(); // 'action_name'\n 'css-class-name'.decamelize(); // 'css-class-name'\n 'my favorite items'.decamelize(); // 'my favorite items'\n ```\n @method decamelize\n @param {String} str The string to decamelize.\n @return {String} the decamelized string.\n @public\n */\n decamelize: decamelize,\n\n /**\n Replaces underscores, spaces, or camelCase with dashes.\n ```javascript\n 'innerHTML'.dasherize(); // 'inner-html'\n 'action_name'.dasherize(); // 'action-name'\n 'css-class-name'.dasherize(); // 'css-class-name'\n 'my favorite items'.dasherize(); // 'my-favorite-items'\n 'privateDocs/ownerInvoice'.dasherize(); // 'private-docs/owner-invoice'\n ```\n @method dasherize\n @param {String} str The string to dasherize.\n @return {String} the dasherized string.\n @public\n */\n dasherize: dasherize,\n\n /**\n Returns the lowerCamelCase form of a string.\n ```javascript\n 'innerHTML'.camelize(); // 'innerHTML'\n 'action_name'.camelize(); // 'actionName'\n 'css-class-name'.camelize(); // 'cssClassName'\n 'my favorite items'.camelize(); // 'myFavoriteItems'\n 'My Favorite Items'.camelize(); // 'myFavoriteItems'\n 'private-docs/owner-invoice'.camelize(); // 'privateDocs/ownerInvoice'\n ```\n @method camelize\n @param {String} str The string to camelize.\n @return {String} the camelized string.\n @public\n */\n camelize: camelize,\n\n /**\n Returns the UpperCamelCase form of a string.\n ```javascript\n 'innerHTML'.classify(); // 'InnerHTML'\n 'action_name'.classify(); // 'ActionName'\n 'css-class-name'.classify(); // 'CssClassName'\n 'my favorite items'.classify(); // 'MyFavoriteItems'\n 'private-docs/owner-invoice'.classify(); // 'PrivateDocs/OwnerInvoice'\n ```\n @method classify\n @param {String} str the string to classify\n @return {String} the classified string\n @public\n */\n classify: classify,\n\n /**\n More general than decamelize. Returns the lower\\_case\\_and\\_underscored\n form of a string.\n ```javascript\n 'innerHTML'.underscore(); // 'inner_html'\n 'action_name'.underscore(); // 'action_name'\n 'css-class-name'.underscore(); // 'css_class_name'\n 'my favorite items'.underscore(); // 'my_favorite_items'\n 'privateDocs/ownerInvoice'.underscore(); // 'private_docs/owner_invoice'\n ```\n @method underscore\n @param {String} str The string to underscore.\n @return {String} the underscored string.\n @public\n */\n underscore: underscore,\n\n /**\n Returns the Capitalized form of a string\n ```javascript\n 'innerHTML'.capitalize() // 'InnerHTML'\n 'action_name'.capitalize() // 'Action_name'\n 'css-class-name'.capitalize() // 'Css-class-name'\n 'my favorite items'.capitalize() // 'My favorite items'\n 'privateDocs/ownerInvoice'.capitalize(); // 'PrivateDocs/ownerInvoice'\n ```\n @method capitalize\n @param {String} str The string to capitalize.\n @return {String} The capitalized string.\n @public\n */\n capitalize: capitalize\n };\n exports.loc = loc;\n exports.w = w;\n exports.decamelize = decamelize;\n exports.dasherize = dasherize;\n exports.camelize = camelize;\n exports.classify = classify;\n exports.underscore = underscore;\n exports.capitalize = capitalize;\n});","enifed('ember-runtime/utils', ['exports', 'ember-runtime/mixins/array', 'ember-runtime/system/object'], function (exports, _array, _object) {\n 'use strict';\n\n exports.isArray = isArray;\n exports.typeOf = typeOf;\n\n\n // ........................................\n // TYPING & ARRAY MESSAGING\n //\n var TYPE_MAP = {\n '[object Boolean]': 'boolean',\n '[object Number]': 'number',\n '[object String]': 'string',\n '[object Function]': 'function',\n '[object Array]': 'array',\n '[object Date]': 'date',\n '[object RegExp]': 'regexp',\n '[object Object]': 'object',\n '[object FileList]': 'filelist'\n };\n\n var toString = Object.prototype.toString;\n\n /**\n @module @ember/array\n */\n /**\n Returns true if the passed object is an array or Array-like.\n \n Objects are considered Array-like if any of the following are true:\n \n - the object is a native Array\n - the object has an objectAt property\n - the object is an Object, and has a length property\n \n Unlike `typeOf` this method returns true even if the passed object is\n not formally an array but appears to be array-like (i.e. implements `Array`)\n \n ```javascript\n import { isArray } from '@ember/array';\n import ArrayProxy from '@ember/array/proxy';\n \n isArray(); // false\n isArray([]); // true\n isArray(ArrayProxy.create({ content: [] })); // true\n ```\n \n @method isArray\n @static\n @for @ember/array\n @param {Object} obj The object to test\n @return {Boolean} true if the passed object is an array or Array-like\n @public\n */\n function isArray(obj) {\n if (!obj || obj.setInterval) {\n return false;\n }\n if (Array.isArray(obj)) {\n return true;\n }\n if (_array.default.detect(obj)) {\n return true;\n }\n\n var type = typeOf(obj);\n if ('array' === type) {\n return true;\n }\n var length = obj.length;\n if (typeof length === 'number' && length === length && 'object' === type) {\n return true;\n }\n return false;\n }\n /**\n @module @ember/utils\n */\n /**\n Returns a consistent type for the passed object.\n \n Use this instead of the built-in `typeof` to get the type of an item.\n It will return the same result across all browsers and includes a bit\n more detail. Here is what will be returned:\n \n | Return Value | Meaning |\n |---------------|------------------------------------------------------|\n | 'string' | String primitive or String object. |\n | 'number' | Number primitive or Number object. |\n | 'boolean' | Boolean primitive or Boolean object. |\n | 'null' | Null value |\n | 'undefined' | Undefined value |\n | 'function' | A function |\n | 'array' | An instance of Array |\n | 'regexp' | An instance of RegExp |\n | 'date' | An instance of Date |\n | 'filelist' | An instance of FileList |\n | 'class' | An Ember class (created using EmberObject.extend()) |\n | 'instance' | An Ember object instance |\n | 'error' | An instance of the Error object |\n | 'object' | A JavaScript object not inheriting from EmberObject |\n \n Examples:\n \n ```javascript\n import { A } from '@ember/array';\n import { typeOf } from '@ember/utils';\n import EmberObject from '@ember/object';\n \n typeOf(); // 'undefined'\n typeOf(null); // 'null'\n typeOf(undefined); // 'undefined'\n typeOf('michael'); // 'string'\n typeOf(new String('michael')); // 'string'\n typeOf(101); // 'number'\n typeOf(new Number(101)); // 'number'\n typeOf(true); // 'boolean'\n typeOf(new Boolean(true)); // 'boolean'\n typeOf(A); // 'function'\n typeOf([1, 2, 90]); // 'array'\n typeOf(/abc/); // 'regexp'\n typeOf(new Date()); // 'date'\n typeOf(event.target.files); // 'filelist'\n typeOf(EmberObject.extend()); // 'class'\n typeOf(EmberObject.create()); // 'instance'\n typeOf(new Error('teamocil')); // 'error'\n \n // 'normal' JavaScript object\n typeOf({ a: 'b' }); // 'object'\n ```\n \n @method typeOf\n @for @ember/utils\n @param {Object} item the item to check\n @return {String} the type\n @public\n @static\n */\n function typeOf(item) {\n if (item === null) {\n return 'null';\n }\n if (item === undefined) {\n return 'undefined';\n }\n var ret = TYPE_MAP[toString.call(item)] || 'object';\n\n if (ret === 'function') {\n if (_object.default.detect(item)) {\n ret = 'class';\n }\n } else if (ret === 'object') {\n if (item instanceof Error) {\n ret = 'error';\n } else if (item instanceof _object.default) {\n ret = 'instance';\n } else if (item instanceof Date) {\n ret = 'date';\n }\n }\n\n return ret;\n }\n});","enifed('ember-template-compiler/compat', ['ember-metal', 'ember-template-compiler/system/precompile', 'ember-template-compiler/system/compile', 'ember-template-compiler/system/compile-options'], function (_emberMetal, _precompile, _compile, _compileOptions) {\n 'use strict';\n\n var EmberHandlebars = _emberMetal.default.Handlebars = _emberMetal.default.Handlebars || {}; // reexports\n\n var EmberHTMLBars = _emberMetal.default.HTMLBars = _emberMetal.default.HTMLBars || {};\n\n EmberHTMLBars.precompile = EmberHandlebars.precompile = _precompile.default;\n EmberHTMLBars.compile = EmberHandlebars.compile = _compile.default;\n EmberHTMLBars.registerPlugin = _compileOptions.registerPlugin;\n});","enifed('ember-template-compiler/index', ['exports', 'ember-template-compiler/system/precompile', 'ember-template-compiler/system/compile', 'ember-template-compiler/system/compile-options', 'ember-template-compiler/plugins', 'ember-metal', 'ember/features', 'ember-environment', 'ember/version', 'ember-template-compiler/compat', 'ember-template-compiler/system/bootstrap'], function (exports, _precompile, _compile, _compileOptions, _plugins, _emberMetal, _features, _emberEnvironment, _version) {\n 'use strict';\n\n exports.defaultPlugins = exports.unregisterPlugin = exports.registerPlugin = exports.compileOptions = exports.compile = exports.precompile = exports._Ember = undefined;\n Object.defineProperty(exports, 'precompile', {\n enumerable: true,\n get: function () {\n return _precompile.default;\n }\n });\n Object.defineProperty(exports, 'compile', {\n enumerable: true,\n get: function () {\n return _compile.default;\n }\n });\n Object.defineProperty(exports, 'compileOptions', {\n enumerable: true,\n get: function () {\n return _compileOptions.default;\n }\n });\n Object.defineProperty(exports, 'registerPlugin', {\n enumerable: true,\n get: function () {\n return _compileOptions.registerPlugin;\n }\n });\n Object.defineProperty(exports, 'unregisterPlugin', {\n enumerable: true,\n get: function () {\n return _compileOptions.unregisterPlugin;\n }\n });\n Object.defineProperty(exports, 'defaultPlugins', {\n enumerable: true,\n get: function () {\n return _plugins.default;\n }\n });\n\n\n // private API used by ember-cli-htmlbars to setup ENV and FEATURES\n if (!_emberMetal.default.ENV) {\n _emberMetal.default.ENV = _emberEnvironment.ENV;\n }\n if (!_emberMetal.default.FEATURES) {\n _emberMetal.default.FEATURES = _features.FEATURES;\n }\n if (!_emberMetal.default.VERSION) {\n _emberMetal.default.VERSION = _version.default;\n }\n\n exports._Ember = _emberMetal.default;\n});","enifed('ember-template-compiler/plugins/assert-input-helper-without-block', ['exports', 'ember-debug', 'ember-template-compiler/system/calculate-location-display'], function (exports, _emberDebug, _calculateLocationDisplay) {\n 'use strict';\n\n exports.default = errorOnInputWithContent;\n function errorOnInputWithContent(env) {\n var moduleName = env.meta.moduleName;\n\n\n return {\n name: 'assert-input-helper-without-block',\n\n visitors: {\n BlockStatement: function (node) {\n if (node.path.original !== 'input') {\n return;\n }\n\n (true && !(false) && (0, _emberDebug.assert)(assertMessage(moduleName, node)));\n }\n }\n };\n }\n\n function assertMessage(moduleName, node) {\n var sourceInformation = (0, _calculateLocationDisplay.default)(moduleName, node.loc);\n\n return 'The {{input}} helper cannot be used in block form. ' + sourceInformation;\n }\n});","enifed('ember-template-compiler/plugins/assert-reserved-named-arguments', ['exports', 'ember-debug', 'ember/features', 'ember-template-compiler/system/calculate-location-display'], function (exports, _emberDebug, _features, _calculateLocationDisplay) {\n 'use strict';\n\n exports.default = assertReservedNamedArguments;\n\n\n var RESERVED = ['@arguments', '@args'];\n\n var isReserved = void 0,\n assertMessage = void 0;\n\n function assertReservedNamedArguments(env) {\n var moduleName = env.meta.moduleName;\n\n\n return {\n name: 'assert-reserved-named-arguments',\n\n visitors: {\n PathExpression: function (_ref) {\n var original = _ref.original,\n loc = _ref.loc;\n\n if (isReserved(original)) {\n (true && !(false) && (0, _emberDebug.assert)(assertMessage(original) + ' ' + (0, _calculateLocationDisplay.default)(moduleName, loc)));\n }\n }\n }\n };\n }\n\n if (_features.EMBER_GLIMMER_NAMED_ARGUMENTS) {\n isReserved = function (name) {\n return RESERVED.indexOf(name) !== -1 || name.match(/^@[^a-z]/);\n };\n assertMessage = function (name) {\n return '\\'' + name + '\\' is reserved.';\n };\n } else {\n isReserved = function (name) {\n return name[0] === '@';\n };\n assertMessage = function (name) {\n return '\\'' + name + '\\' is not a valid path.';\n };\n }\n});","enifed('ember-template-compiler/plugins/deprecate-render-model', ['exports', 'ember-debug', 'ember-template-compiler/system/calculate-location-display'], function (exports, _emberDebug, _calculateLocationDisplay) {\n 'use strict';\n\n exports.default = deprecateRenderModel;\n\n\n /*\n * Remove after 3.4 once _ENABLE_RENDER_SUPPORT flag is no\n * longer needed.\n */\n function deprecateRenderModel(env) {\n var moduleName = env.meta.moduleName;\n\n\n return {\n name: 'deprecate-render-model',\n\n visitors: {\n MustacheStatement: function (node) {\n if (node.path.original === 'render' && node.params.length > 1) {\n node.params.forEach(function (param) {\n if (param.type !== 'PathExpression') {\n return;\n }\n\n (true && !(false) && (0, _emberDebug.deprecate)(deprecationMessage(moduleName, node, param), false, {\n id: 'ember-template-compiler.deprecate-render-model',\n until: '3.0.0',\n url: 'https://emberjs.com/deprecations/v2.x#toc_model-param-in-code-render-code-helper'\n }));\n });\n }\n }\n }\n };\n }\n\n function deprecationMessage(moduleName, node, param) {\n var sourceInformation = (0, _calculateLocationDisplay.default)(moduleName, node.loc);\n var componentName = node.params[0].original;\n var modelName = param.original;\n var original = '{{render \"' + componentName + '\" ' + modelName + '}}';\n var preferred = '{{' + componentName + ' model=' + modelName + '}}';\n\n return 'Please refactor `' + original + '` to a component and invoke via' + (' `' + preferred + '`. ' + sourceInformation);\n }\n});","enifed('ember-template-compiler/plugins/deprecate-render', ['exports', 'ember-debug', 'ember-template-compiler/system/calculate-location-display'], function (exports, _emberDebug, _calculateLocationDisplay) {\n 'use strict';\n\n exports.default = deprecateRender;\n\n\n /*\n * Remove after 3.4 once _ENABLE_RENDER_SUPPORT flag is no\n * longer needed.\n */\n function deprecateRender(env) {\n var moduleName = env.meta.moduleName;\n\n\n return {\n name: 'deprecate-render',\n\n visitors: {\n MustacheStatement: function (node) {\n if (node.path.original !== 'render') {\n return;\n }\n if (node.params.length !== 1) {\n return;\n }\n\n each(node.params, function (param) {\n if (param.type !== 'StringLiteral') {\n return;\n }\n\n (true && !(false) && (0, _emberDebug.deprecate)(deprecationMessage(moduleName, node), false, {\n id: 'ember-template-compiler.deprecate-render',\n until: '3.0.0',\n url: 'https://emberjs.com/deprecations/v2.x#toc_code-render-code-helper'\n }));\n });\n }\n }\n };\n }\n\n function each(list, callback) {\n for (var i = 0, l = list.length; i < l; i++) {\n callback(list[i]);\n }\n }\n\n function deprecationMessage(moduleName, node) {\n var sourceInformation = (0, _calculateLocationDisplay.default)(moduleName, node.loc);\n var componentName = node.params[0].original;\n var original = '{{render \"' + componentName + '\"}}';\n var preferred = '{{' + componentName + '}}';\n\n return 'Please refactor `' + original + '` to a component and invoke via' + (' `' + preferred + '`. ' + sourceInformation);\n }\n});","enifed('ember-template-compiler/plugins/extract-pragma-tag', ['exports'], function (exports) {\n 'use strict';\n\n exports.default = extractPragmaTag;\n var PRAGMA_TAG = 'use-component-manager';\n\n function extractPragmaTag(env) {\n var meta = env.meta;\n\n\n return {\n name: 'exract-pragma-tag',\n\n visitors: {\n MustacheStatement: {\n enter: function (node) {\n if (node.path.type === 'PathExpression' && node.path.original === PRAGMA_TAG) {\n meta.managerId = node.params[0].value;\n return null;\n }\n }\n }\n }\n };\n }\n});","enifed('ember-template-compiler/plugins/index', ['exports', 'ember-template-compiler/plugins/transform-old-binding-syntax', 'ember-template-compiler/plugins/transform-angle-bracket-components', 'ember-template-compiler/plugins/transform-top-level-components', 'ember-template-compiler/plugins/transform-inline-link-to', 'ember-template-compiler/plugins/transform-old-class-binding-syntax', 'ember-template-compiler/plugins/transform-quoted-bindings-into-just-bindings', 'ember-template-compiler/plugins/deprecate-render-model', 'ember-template-compiler/plugins/deprecate-render', 'ember-template-compiler/plugins/assert-reserved-named-arguments', 'ember-template-compiler/plugins/transform-action-syntax', 'ember-template-compiler/plugins/transform-input-type-syntax', 'ember-template-compiler/plugins/transform-attrs-into-args', 'ember-template-compiler/plugins/transform-each-in-into-each', 'ember-template-compiler/plugins/transform-has-block-syntax', 'ember-template-compiler/plugins/transform-dot-component-invocation', 'ember-template-compiler/plugins/extract-pragma-tag', 'ember-template-compiler/plugins/assert-input-helper-without-block', 'ember/features'], function (exports, _transformOldBindingSyntax, _transformAngleBracketComponents, _transformTopLevelComponents, _transformInlineLinkTo, _transformOldClassBindingSyntax, _transformQuotedBindingsIntoJustBindings, _deprecateRenderModel, _deprecateRender, _assertReservedNamedArguments, _transformActionSyntax, _transformInputTypeSyntax, _transformAttrsIntoArgs, _transformEachInIntoEach, _transformHasBlockSyntax, _transformDotComponentInvocation, _extractPragmaTag, _assertInputHelperWithoutBlock, _features) {\n 'use strict';\n\n var transforms = [_transformDotComponentInvocation.default, _transformOldBindingSyntax.default, _transformAngleBracketComponents.default, _transformTopLevelComponents.default, _transformInlineLinkTo.default, _transformOldClassBindingSyntax.default, _transformQuotedBindingsIntoJustBindings.default, _deprecateRenderModel.default, _deprecateRender.default, _assertReservedNamedArguments.default, _transformActionSyntax.default, _transformInputTypeSyntax.default, _transformAttrsIntoArgs.default, _transformEachInIntoEach.default, _transformHasBlockSyntax.default, _assertInputHelperWithoutBlock.default];\n\n if (_features.GLIMMER_CUSTOM_COMPONENT_MANAGER) {\n transforms.push(_extractPragmaTag.default);\n }\n\n exports.default = Object.freeze(transforms);\n});","enifed('ember-template-compiler/plugins/transform-action-syntax', ['exports'], function (exports) {\n 'use strict';\n\n exports.default = transformActionSyntax;\n /**\n @module ember\n */\n\n /**\n A Glimmer2 AST transformation that replaces all instances of\n \n ```handlebars\n <button {{action 'foo'}}>\n <button onblur={{action 'foo'}}>\n <button onblur={{action (action 'foo') 'bar'}}>\n ```\n \n with\n \n ```handlebars\n <button {{action this 'foo'}}>\n <button onblur={{action this 'foo'}}>\n <button onblur={{action this (action this 'foo') 'bar'}}>\n ```\n \n @private\n @class TransformActionSyntax\n */\n\n function transformActionSyntax(_ref) {\n var syntax = _ref.syntax;\n var b = syntax.builders;\n\n\n return {\n name: 'transform-action-syntax',\n\n visitors: {\n ElementModifierStatement: function (node) {\n if (isAction(node)) {\n insertThisAsFirstParam(node, b);\n }\n },\n MustacheStatement: function (node) {\n if (isAction(node)) {\n insertThisAsFirstParam(node, b);\n }\n },\n SubExpression: function (node) {\n if (isAction(node)) {\n insertThisAsFirstParam(node, b);\n }\n }\n }\n };\n }\n\n function isAction(node) {\n return node.path.original === 'action';\n }\n\n function insertThisAsFirstParam(node, builders) {\n node.params.unshift(builders.path('this'));\n }\n});","enifed('ember-template-compiler/plugins/transform-angle-bracket-components', ['exports'], function (exports) {\n 'use strict';\n\n exports.default = transformAngleBracketComponents;\n function transformAngleBracketComponents() /* env */{\n return {\n name: 'transform-angle-bracket-components',\n\n visitors: {\n ComponentNode: function (node) {\n node.tag = '<' + node.tag + '>';\n }\n }\n };\n }\n});","enifed('ember-template-compiler/plugins/transform-attrs-into-args', ['exports'], function (exports) {\n 'use strict';\n\n exports.default = transformAttrsIntoArgs;\n /**\n @module ember\n */\n\n /**\n A Glimmer2 AST transformation that replaces all instances of\n \n ```handlebars\n {{attrs.foo.bar}}\n ```\n \n to\n \n ```handlebars\n {{@foo.bar}}\n ```\n \n as well as `{{#if attrs.foo}}`, `{{deeply (nested attrs.foobar.baz)}}`,\n `{{this.attrs.foo}}` etc\n \n @private\n @class TransformAttrsToProps\n */\n\n function transformAttrsIntoArgs(env) {\n var b = env.syntax.builders;\n\n\n var stack = [[]];\n\n return {\n name: 'transform-attrs-into-args',\n\n visitors: {\n Program: {\n enter: function (node) {\n var parent = stack[stack.length - 1];\n stack.push(parent.concat(node.blockParams));\n },\n exit: function () {\n stack.pop();\n }\n },\n\n PathExpression: function (node) {\n if (isAttrs(node, stack[stack.length - 1])) {\n var path = b.path(node.original.substr(6));\n path.original = '@' + path.original;\n path.data = true;\n return path;\n }\n }\n }\n };\n }\n\n function isAttrs(node, symbols) {\n var name = node.parts[0];\n\n if (symbols.indexOf(name) !== -1) {\n return false;\n }\n\n if (name === 'attrs') {\n if (node.this === true) {\n node.parts.shift();\n node.original = node.original.slice(5);\n }\n\n return true;\n }\n\n return false;\n }\n});","enifed('ember-template-compiler/plugins/transform-dot-component-invocation', ['exports'], function (exports) {\n 'use strict';\n\n exports.default = transformDotComponentInvocation;\n\n /**\n Transforms dot invocation of closure components to be wrapped\n with the component helper. This allows for a more static invocation\n of the component.\n \n ```handlebars\n {{#my-component as |comps|}}\n {{comp.dropdown isOpen=false}}\n {{/my-component}}\n ```\n \n with\n \n ```handlebars\n {{#my-component as |comps|}}\n {{component comp.dropdown isOpen=false}}\n {{/my-component}}\n ```\n and\n \n ```handlebars\n {{#my-component as |comps|}}\n {{comp.dropdown isOpen}}\n {{/my-component}}\n ```\n \n with\n \n ```handlebars\n {{#my-component as |comps|}}\n {{component comp.dropdown isOpen}}\n {{/my-component}}\n ```\n \n and\n \n ```handlebars\n {{#my-component as |comps|}}\n {{#comp.dropdown}}Open{{/comp.dropdown}}\n {{/my-component}}\n ```\n \n with\n \n ```handlebars\n {{#my-component as |comps|}}\n {{#component comp.dropdown}}Open{{/component}}\n {{/my-component}}\n ```\n \n @private\n @class TransFormDotComponentInvocation\n */\n function transformDotComponentInvocation(env) {\n var b = env.syntax.builders;\n\n\n return {\n name: 'transform-dot-component-invocation',\n\n visitors: {\n MustacheStatement: function (node) {\n if (isInlineInvocation(node.path, node.params, node.hash)) {\n wrapInComponent(node, b);\n }\n },\n BlockStatement: function (node) {\n if (isMultipartPath(node.path)) {\n wrapInComponent(node, b);\n }\n }\n }\n };\n }\n\n function isMultipartPath(path) {\n return path.parts && path.parts.length > 1;\n }\n\n function isInlineInvocation(path, params, hash) {\n if (isMultipartPath(path)) {\n if (params.length > 0 || hash.pairs.length > 0) {\n return true;\n }\n }\n\n return false;\n }\n\n function wrapInComponent(node, builder) {\n var component = node.path;\n var componentHelper = builder.path('component');\n node.path = componentHelper;\n node.params.unshift(component);\n }\n});","enifed('ember-template-compiler/plugins/transform-each-in-into-each', ['exports'], function (exports) {\n 'use strict';\n\n exports.default = transformEachInIntoEach;\n /**\n @module ember\n */\n\n /**\n A Glimmer2 AST transformation that replaces all instances of\n \n ```handlebars\n {{#each-in iterableThing as |key value|}}\n ```\n \n with\n \n ```handlebars\n {{#each (-each-in iterableThing) as |key value|}}\n ```\n \n @private\n @class TransformHasBlockSyntax\n */\n function transformEachInIntoEach(env) {\n var b = env.syntax.builders;\n\n\n return {\n name: 'transform-each-in-into-each',\n\n visitors: {\n BlockStatement: function (node) {\n if (node.path.original === 'each-in') {\n node.params[0] = b.sexpr(b.path('-each-in'), [node.params[0]]);\n return b.block(b.path('each'), node.params, node.hash, node.program, node.inverse, node.loc);\n }\n }\n }\n };\n }\n});","enifed('ember-template-compiler/plugins/transform-has-block-syntax', ['exports'], function (exports) {\n 'use strict';\n\n exports.default = transformHasBlockSyntax;\n /**\n @module ember\n */\n\n /**\n A Glimmer2 AST transformation that replaces all instances of\n \n ```handlebars\n {{hasBlock}}\n ```\n \n with\n \n ```handlebars\n {{has-block}}\n ```\n \n @private\n @class TransformHasBlockSyntax\n */\n\n var TRANSFORMATIONS = {\n hasBlock: 'has-block',\n hasBlockParams: 'has-block-params'\n };\n\n function transformHasBlockSyntax(env) {\n var b = env.syntax.builders;\n\n\n return {\n name: 'transform-has-block-syntax',\n\n visitors: {\n PathExpression: function (node) {\n if (TRANSFORMATIONS[node.original]) {\n return b.sexpr(b.path(TRANSFORMATIONS[node.original]));\n }\n },\n MustacheStatement: function (node) {\n if (TRANSFORMATIONS[node.path.original]) {\n return b.mustache(b.path(TRANSFORMATIONS[node.path.original]), node.params, node.hash, null, node.loc);\n }\n },\n SubExpression: function (node) {\n if (TRANSFORMATIONS[node.path.original]) {\n return b.sexpr(b.path(TRANSFORMATIONS[node.path.original]), node.params, node.hash);\n }\n }\n }\n };\n }\n});","enifed('ember-template-compiler/plugins/transform-inline-link-to', ['exports'], function (exports) {\n 'use strict';\n\n exports.default = transformInlineLinkTo;\n function buildProgram(b, content, loc) {\n return b.program([buildStatement(b, content, loc)], null, loc);\n }\n\n function buildStatement(b, content, loc) {\n switch (content.type) {\n case 'PathExpression':\n return b.mustache(content, null, null, null, loc);\n\n case 'SubExpression':\n return b.mustache(content.path, content.params, content.hash, null, loc);\n\n // The default case handles literals.\n default:\n return b.text('' + content.value, loc);\n }\n }\n\n function unsafeHtml(b, expr) {\n return b.sexpr('-html-safe', [expr]);\n }\n\n function transformInlineLinkTo(env) {\n var b = env.syntax.builders;\n\n\n return {\n name: 'transform-inline-link-to',\n\n visitors: {\n MustacheStatement: function (node) {\n if (node.path.original === 'link-to') {\n var content = node.escaped ? node.params[0] : unsafeHtml(b, node.params[0]);\n return b.block('link-to', node.params.slice(1), node.hash, buildProgram(b, content, node.loc), null, node.loc);\n }\n }\n }\n };\n }\n});","enifed('ember-template-compiler/plugins/transform-input-type-syntax', ['exports'], function (exports) {\n 'use strict';\n\n exports.default = transformInputTypeSyntax;\n /**\n @module ember\n */\n\n /**\n A Glimmer2 AST transformation that replaces all instances of\n \n ```handlebars\n {{input type=boundType}}\n ```\n \n with\n \n ```handlebars\n {{input (-input-type boundType) type=boundType}}\n ```\n \n Note that the type parameters is not removed as the -input-type helpers\n is only used to select the component class. The component still needs\n the type parameter to function.\n \n @private\n @class TransformInputTypeSyntax\n */\n\n function transformInputTypeSyntax(env) {\n var b = env.syntax.builders;\n\n return {\n name: 'transform-input-type-syntax',\n\n visitors: {\n MustacheStatement: function (node) {\n if (isInput(node)) {\n insertTypeHelperParameter(node, b);\n }\n }\n }\n };\n }\n\n function isInput(node) {\n return node.path.original === 'input';\n }\n\n function insertTypeHelperParameter(node, builders) {\n var pairs = node.hash.pairs;\n var pair = null;\n for (var i = 0; i < pairs.length; i++) {\n if (pairs[i].key === 'type') {\n pair = pairs[i];\n break;\n }\n }\n if (pair && pair.value.type !== 'StringLiteral') {\n node.params.unshift(builders.sexpr('-input-type', [pair.value], null, pair.loc));\n }\n }\n});","enifed('ember-template-compiler/plugins/transform-old-binding-syntax', ['exports', 'ember-debug', 'ember-template-compiler/system/calculate-location-display'], function (exports, _emberDebug, _calculateLocationDisplay) {\n 'use strict';\n\n exports.default = transformOldBindingSyntax;\n function transformOldBindingSyntax(env) {\n var moduleName = env.meta.moduleName;\n\n var b = env.syntax.builders;\n\n return {\n name: 'transform-old-binding-syntax',\n\n visitors: {\n BlockStatement: function (node) {\n processHash(b, node, moduleName);\n },\n MustacheStatement: function (node) {\n processHash(b, node, moduleName);\n }\n }\n };\n }\n\n function processHash(b, node, moduleName) {\n for (var i = 0; i < node.hash.pairs.length; i++) {\n var pair = node.hash.pairs[i];\n var key = pair.key,\n value = pair.value;\n\n\n var sourceInformation = (0, _calculateLocationDisplay.default)(moduleName, pair.loc);\n\n if (key === 'classBinding') {\n return;\n }\n\n (true && !(key !== 'attributeBindings') && (0, _emberDebug.assert)('Setting \\'attributeBindings\\' via template helpers is not allowed ' + sourceInformation, key !== 'attributeBindings'));\n\n\n if (key.substr(-7) === 'Binding') {\n var newKey = key.slice(0, -7);\n\n (true && !(false) && (0, _emberDebug.deprecate)('You\\'re using legacy binding syntax: ' + key + '=' + exprToString(value) + ' ' + sourceInformation + '. Please replace with ' + newKey + '=' + value.original, false, { id: 'ember-template-compiler.transform-old-binding-syntax', until: '3.0.0' }));\n\n\n pair.key = newKey;\n if (value.type === 'StringLiteral') {\n pair.value = b.path(value.original);\n }\n }\n }\n }\n\n function exprToString(expr) {\n switch (expr.type) {\n case 'StringLiteral':\n return '\"' + expr.original + '\"';\n case 'PathExpression':\n return expr.original;\n }\n }\n});","enifed('ember-template-compiler/plugins/transform-old-class-binding-syntax', ['exports'], function (exports) {\n 'use strict';\n\n exports.default = transformOldClassBindingSyntax;\n function transformOldClassBindingSyntax(env) {\n var b = env.syntax.builders;\n\n return {\n name: 'transform-old-class-binding-syntax',\n\n visitors: {\n MustacheStatement: function (node) {\n process(b, node);\n },\n BlockStatement: function (node) {\n process(b, node);\n }\n }\n };\n }\n\n function process(b, node) {\n var allOfTheMicrosyntaxes = [];\n var allOfTheMicrosyntaxIndexes = [];\n var classPair = void 0;\n\n each(node.hash.pairs, function (pair, index) {\n var key = pair.key;\n\n\n if (key === 'classBinding' || key === 'classNameBindings') {\n allOfTheMicrosyntaxIndexes.push(index);\n allOfTheMicrosyntaxes.push(pair);\n } else if (key === 'class') {\n classPair = pair;\n }\n });\n\n if (allOfTheMicrosyntaxes.length === 0) {\n return;\n }\n\n var classValue = [];\n\n if (classPair) {\n classValue.push(classPair.value);\n classValue.push(b.string(' '));\n } else {\n classPair = b.pair('class', null);\n node.hash.pairs.push(classPair);\n }\n\n each(allOfTheMicrosyntaxIndexes, function (index) {\n node.hash.pairs.splice(index, 1);\n });\n\n each(allOfTheMicrosyntaxes, function (_ref) {\n var value = _ref.value;\n\n var sexprs = [];\n // TODO: add helpful deprecation when both `classNames` and `classNameBindings` can\n // be removed.\n\n if (value.type === 'StringLiteral') {\n var microsyntax = parseMicrosyntax(value.original);\n\n buildSexprs(microsyntax, sexprs, b);\n\n classValue.push.apply(classValue, sexprs);\n }\n });\n\n var hash = b.hash();\n classPair.value = b.sexpr(b.path('concat'), classValue, hash);\n }\n\n function buildSexprs(microsyntax, sexprs, b) {\n for (var i = 0; i < microsyntax.length; i++) {\n var _microsyntax$i = microsyntax[i],\n propName = _microsyntax$i[0],\n activeClass = _microsyntax$i[1],\n inactiveClass = _microsyntax$i[2];\n\n var sexpr = void 0;\n\n // :my-class-name microsyntax for static values\n if (propName === '') {\n sexpr = b.string(activeClass);\n } else {\n var params = [b.path(propName)];\n\n if (activeClass || activeClass === '') {\n params.push(b.string(activeClass));\n } else {\n var sexprParams = [b.string(propName), b.path(propName)];\n\n var hash = b.hash();\n if (activeClass !== undefined) {\n hash.pairs.push(b.pair('activeClass', b.string(activeClass)));\n }\n\n if (inactiveClass !== undefined) {\n hash.pairs.push(b.pair('inactiveClass', b.string(inactiveClass)));\n }\n\n params.push(b.sexpr(b.path('-normalize-class'), sexprParams, hash));\n }\n\n if (inactiveClass || inactiveClass === '') {\n params.push(b.string(inactiveClass));\n }\n\n sexpr = b.sexpr(b.path('if'), params);\n }\n\n sexprs.push(sexpr);\n sexprs.push(b.string(' '));\n }\n }\n\n function each(list, callback) {\n for (var i = 0; i < list.length; i++) {\n callback(list[i], i);\n }\n }\n\n function parseMicrosyntax(string) {\n var segments = string.split(' ');\n\n for (var i = 0; i < segments.length; i++) {\n segments[i] = segments[i].split(':');\n }\n\n return segments;\n }\n});","enifed('ember-template-compiler/plugins/transform-quoted-bindings-into-just-bindings', ['exports'], function (exports) {\n 'use strict';\n\n exports.default = transformQuotedBindingsIntoJustBindings;\n function transformQuotedBindingsIntoJustBindings() /* env */{\n\n return {\n name: 'transform-quoted-bindings-into-just-bindings',\n\n visitors: {\n ElementNode: function (node) {\n var styleAttr = getStyleAttr(node);\n\n if (!validStyleAttr(styleAttr)) {\n return;\n }\n\n styleAttr.value = styleAttr.value.parts[0];\n }\n }\n };\n }\n\n function validStyleAttr(attr) {\n if (!attr) {\n return false;\n }\n\n var value = attr.value;\n\n if (!value || value.type !== 'ConcatStatement' || value.parts.length !== 1) {\n return false;\n }\n\n var onlyPart = value.parts[0];\n\n return onlyPart.type === 'MustacheStatement';\n }\n\n function getStyleAttr(node) {\n var attributes = node.attributes;\n\n for (var i = 0; i < attributes.length; i++) {\n if (attributes[i].name === 'style') {\n return attributes[i];\n }\n }\n }\n});","enifed('ember-template-compiler/plugins/transform-top-level-components', ['exports'], function (exports) {\n 'use strict';\n\n exports.default = transformTopLevelComponent;\n function transformTopLevelComponent() /* env */{\n return {\n name: 'transform-top-level-component',\n\n visitors: {\n Program: function (node) {\n hasSingleComponentNode(node, function (component) {\n component.tag = '@' + component.tag;\n component.isStatic = true;\n });\n }\n }\n };\n }\n\n function hasSingleComponentNode(program, componentCallback) {\n var loc = program.loc,\n body = program.body;\n\n if (!loc || loc.start.line !== 1 || loc.start.column !== 0) {\n return;\n }\n\n var lastComponentNode = void 0;\n var nodeCount = 0;\n\n for (var i = 0; i < body.length; i++) {\n var curr = body[i];\n\n // text node with whitespace only\n if (curr.type === 'TextNode' && /^[\\s]*$/.test(curr.chars)) {\n continue;\n }\n\n // has multiple root elements if we've been here before\n if (nodeCount++ > 0) {\n return false;\n }\n\n if (curr.type === 'ComponentNode' || curr.type === 'ElementNode') {\n lastComponentNode = curr;\n }\n }\n\n if (!lastComponentNode) {\n return;\n }\n\n if (lastComponentNode.type === 'ComponentNode') {\n componentCallback(lastComponentNode);\n }\n }\n});","enifed('ember-template-compiler/system/bootstrap', ['exports', 'ember-debug', 'ember-template-compiler/system/compile'], function (exports, _emberDebug, _compile) {\n 'use strict';\n\n /**\n Find templates stored in the head tag as script tags and make them available\n to `Ember.CoreView` in the global `Ember.TEMPLATES` object.\n \n Script tags with `text/x-handlebars` will be compiled\n with Ember's template compiler and are suitable for use as a view's template.\n \n @private\n @method bootstrap\n @for Ember.HTMLBars\n @static\n @param ctx\n */\n /**\n @module ember\n */\n\n function bootstrap(_ref) {\n var context = _ref.context,\n hasTemplate = _ref.hasTemplate,\n setTemplate = _ref.setTemplate;\n\n if (!context) {\n context = document;\n }\n\n var selector = 'script[type=\"text/x-handlebars\"]';\n\n var elements = context.querySelectorAll(selector);\n\n for (var i = 0; i < elements.length; i++) {\n var script = elements[i];\n\n // Get the name of the script\n // First look for data-template-name attribute, then fall back to its\n // id if no name is found.\n var templateName = script.getAttribute('data-template-name') || script.getAttribute('id') || 'application';\n var template = void 0;\n\n template = (0, _compile.default)(script.innerHTML, {\n moduleName: templateName\n });\n\n // Check if template of same name already exists.\n if (hasTemplate(templateName)) {\n throw new _emberDebug.Error('Template named \"' + templateName + '\" already exists.');\n }\n\n // For templates which have a name, we save them and then remove them from the DOM.\n setTemplate(templateName, template);\n\n // Remove script tag from DOM.\n script.parentNode.removeChild(script);\n }\n }\n\n exports.default = bootstrap;\n});","enifed('ember-template-compiler/system/calculate-location-display', ['exports'], function (exports) {\n 'use strict';\n\n exports.default = calculateLocationDisplay;\n function calculateLocationDisplay(moduleName) {\n var loc = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n var _ref = loc.start || {},\n column = _ref.column,\n line = _ref.line;\n\n var moduleInfo = '';\n if (moduleName) {\n moduleInfo += '\\'' + moduleName + '\\' ';\n }\n\n if (line !== undefined && column !== undefined) {\n if (moduleName) {\n // only prepend @ if the moduleName was present\n moduleInfo += '@ ';\n }\n moduleInfo += 'L' + line + ':C' + column;\n }\n\n if (moduleInfo) {\n moduleInfo = '(' + moduleInfo + ') ';\n }\n\n return moduleInfo;\n }\n});","enifed('ember-template-compiler/system/compile-options', ['exports', 'ember-utils', 'ember-template-compiler/plugins'], function (exports, _emberUtils, _plugins) {\n 'use strict';\n\n exports.default = compileOptions;\n exports.registerPlugin = registerPlugin;\n exports.unregisterPlugin = unregisterPlugin;\n\n\n var USER_PLUGINS = [];\n\n function compileOptions(_options) {\n var options = (0, _emberUtils.assign)({ meta: {} }, _options);\n\n // move `moduleName` into `meta` property\n if (options.moduleName) {\n var meta = options.meta;\n meta.moduleName = options.moduleName;\n }\n\n if (!options.plugins) {\n options.plugins = { ast: [].concat(USER_PLUGINS, _plugins.default) };\n } else {\n var potententialPugins = [].concat(USER_PLUGINS, _plugins.default);\n var providedPlugins = options.plugins.ast.map(function (plugin) {\n return wrapLegacyPluginIfNeeded(plugin);\n });\n var pluginsToAdd = potententialPugins.filter(function (plugin) {\n return options.plugins.ast.indexOf(plugin) === -1;\n });\n options.plugins.ast = providedPlugins.concat(pluginsToAdd);\n }\n\n return options;\n }\n\n function wrapLegacyPluginIfNeeded(_plugin) {\n var plugin = _plugin;\n if (_plugin.prototype && _plugin.prototype.transform) {\n plugin = function (env) {\n var pluginInstantiated = false;\n\n return {\n name: _plugin.constructor && _plugin.constructor.name,\n\n visitors: {\n Program: function (node) {\n if (!pluginInstantiated) {\n\n pluginInstantiated = true;\n var _plugin2 = new _plugin(env);\n\n _plugin2.syntax = env.syntax;\n\n return _plugin2.transform(node);\n }\n }\n }\n };\n };\n\n plugin.__raw = _plugin;\n }\n\n return plugin;\n }\n\n function registerPlugin(type, _plugin) {\n if (type !== 'ast') {\n throw new Error('Attempting to register ' + _plugin + ' as \"' + type + '\" which is not a valid Glimmer plugin type.');\n }\n\n for (var i = 0; i < USER_PLUGINS.length; i++) {\n var PLUGIN = USER_PLUGINS[i];\n if (PLUGIN === _plugin || PLUGIN.__raw === _plugin) {\n return;\n }\n }\n\n var plugin = wrapLegacyPluginIfNeeded(_plugin);\n\n USER_PLUGINS = [plugin].concat(USER_PLUGINS);\n }\n\n function unregisterPlugin(type, PluginClass) {\n if (type !== 'ast') {\n throw new Error('Attempting to unregister ' + PluginClass + ' as \"' + type + '\" which is not a valid Glimmer plugin type.');\n }\n\n USER_PLUGINS = USER_PLUGINS.filter(function (plugin) {\n return plugin !== PluginClass && plugin.__raw !== PluginClass;\n });\n }\n});","enifed('ember-template-compiler/system/compile', ['exports', 'require', 'ember-template-compiler/system/precompile'], function (exports, _require2, _precompile) {\n 'use strict';\n\n exports.default = compile;\n /**\n @module ember\n */\n var template = void 0;\n\n /**\n Uses HTMLBars `compile` function to process a string into a compiled template.\n \n This is not present in production builds.\n \n @private\n @method compile\n @param {String} templateString This is the string to be compiled by HTMLBars.\n @param {Object} options This is an options hash to augment the compiler options.\n */\n function compile(templateString, options) {\n if (!template && (0, _require2.has)('ember-glimmer')) {\n template = (0, _require2.default)('ember-glimmer').template;\n }\n\n if (!template) {\n throw new Error('Cannot call `compile` with only the template compiler loaded. Please load `ember.debug.js` or `ember.prod.js` prior to calling `compile`.');\n }\n\n var precompiledTemplateString = (0, _precompile.default)(templateString, options);\n var templateJS = new Function('return ' + precompiledTemplateString)();\n return template(templateJS);\n }\n});","enifed('ember-template-compiler/system/precompile', ['exports', 'ember-template-compiler/system/compile-options', 'require'], function (exports, _compileOptions, _require2) {\n 'use strict';\n\n exports.default = precompile;\n /**\n @module ember\n */\n\n var glimmerPrecompile = void 0;\n\n /**\n Uses HTMLBars `compile` function to process a string into a compiled template string.\n The returned string must be passed through `Ember.HTMLBars.template`.\n \n This is not present in production builds.\n \n @private\n @method precompile\n @param {String} templateString This is the string to be compiled by HTMLBars.\n */\n function precompile(templateString, options) {\n if (!glimmerPrecompile && (0, _require2.has)('@glimmer/compiler')) {\n glimmerPrecompile = (0, _require2.default)('@glimmer/compiler').precompile;\n }\n\n if (!glimmerPrecompile) {\n throw new Error('Cannot call `compile` without the template compiler loaded. Please load `ember-template-compiler.js` prior to calling `compile`.');\n }\n\n return glimmerPrecompile(templateString, (0, _compileOptions.default)(options));\n }\n});","enifed('ember-testing/adapters/adapter', ['exports', 'ember-runtime'], function (exports, _emberRuntime) {\n 'use strict';\n\n function K() {\n return this;\n }\n\n /**\n @module @ember/test\n */\n\n /**\n The primary purpose of this class is to create hooks that can be implemented\n by an adapter for various test frameworks.\n \n @class TestAdapter\n @public\n */\n exports.default = _emberRuntime.Object.extend({\n /**\n This callback will be called whenever an async operation is about to start.\n Override this to call your framework's methods that handle async\n operations.\n @public\n @method asyncStart\n */\n asyncStart: K,\n\n /**\n This callback will be called whenever an async operation has completed.\n @public\n @method asyncEnd\n */\n asyncEnd: K,\n\n /**\n Override this method with your testing framework's false assertion.\n This function is called whenever an exception occurs causing the testing\n promise to fail.\n QUnit example:\n ```javascript\n exception: function(error) {\n ok(false, error);\n };\n ```\n @public\n @method exception\n @param {String} error The exception to be raised.\n */\n exception: function (error) {\n throw error;\n }\n });\n});","enifed('ember-testing/adapters/qunit', ['exports', 'ember-utils', 'ember-testing/adapters/adapter'], function (exports, _emberUtils, _adapter) {\n 'use strict';\n\n exports.default = _adapter.default.extend({\n asyncStart: function () {\n QUnit.stop();\n },\n asyncEnd: function () {\n QUnit.start();\n },\n exception: function (error) {\n QUnit.config.current.assert.ok(false, (0, _emberUtils.inspect)(error));\n }\n });\n});","enifed('ember-testing/events', ['exports', 'ember-views', 'ember-metal'], function (exports, _emberViews, _emberMetal) {\n 'use strict';\n\n exports.focus = focus;\n exports.fireEvent = fireEvent;\n\n\n var DEFAULT_EVENT_OPTIONS = { canBubble: true, cancelable: true };\n var KEYBOARD_EVENT_TYPES = ['keydown', 'keypress', 'keyup'];\n var MOUSE_EVENT_TYPES = ['click', 'mousedown', 'mouseup', 'dblclick', 'mouseenter', 'mouseleave', 'mousemove', 'mouseout', 'mouseover'];\n\n function focus(el) {\n if (!el) {\n return;\n }\n var $el = (0, _emberViews.jQuery)(el);\n if ($el.is(':input, [contenteditable=true]')) {\n var type = $el.prop('type');\n if (type !== 'checkbox' && type !== 'radio' && type !== 'hidden') {\n (0, _emberMetal.run)(null, function () {\n // Firefox does not trigger the `focusin` event if the window\n // does not have focus. If the document doesn't have focus just\n // use trigger('focusin') instead.\n\n if (!document.hasFocus || document.hasFocus()) {\n el.focus();\n } else {\n $el.trigger('focusin');\n }\n });\n }\n }\n }\n\n function fireEvent(element, type) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n if (!element) {\n return;\n }\n var event = void 0;\n if (KEYBOARD_EVENT_TYPES.indexOf(type) > -1) {\n event = buildKeyboardEvent(type, options);\n } else if (MOUSE_EVENT_TYPES.indexOf(type) > -1) {\n var rect = element.getBoundingClientRect();\n var x = rect.left + 1;\n var y = rect.top + 1;\n var simulatedCoordinates = {\n screenX: x + 5,\n screenY: y + 95,\n clientX: x,\n clientY: y\n };\n event = buildMouseEvent(type, _emberViews.jQuery.extend(simulatedCoordinates, options));\n } else {\n event = buildBasicEvent(type, options);\n }\n element.dispatchEvent(event);\n }\n\n function buildBasicEvent(type) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n var event = document.createEvent('Events');\n event.initEvent(type, true, true);\n _emberViews.jQuery.extend(event, options);\n return event;\n }\n\n function buildMouseEvent(type) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n var event = void 0;\n try {\n event = document.createEvent('MouseEvents');\n var eventOpts = _emberViews.jQuery.extend({}, DEFAULT_EVENT_OPTIONS, options);\n event.initMouseEvent(type, eventOpts.canBubble, eventOpts.cancelable, window, eventOpts.detail, eventOpts.screenX, eventOpts.screenY, eventOpts.clientX, eventOpts.clientY, eventOpts.ctrlKey, eventOpts.altKey, eventOpts.shiftKey, eventOpts.metaKey, eventOpts.button, eventOpts.relatedTarget);\n } catch (e) {\n event = buildBasicEvent(type, options);\n }\n return event;\n }\n\n function buildKeyboardEvent(type) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n var event = void 0;\n try {\n event = document.createEvent('KeyEvents');\n var eventOpts = _emberViews.jQuery.extend({}, DEFAULT_EVENT_OPTIONS, options);\n event.initKeyEvent(type, eventOpts.canBubble, eventOpts.cancelable, window, eventOpts.ctrlKey, eventOpts.altKey, eventOpts.shiftKey, eventOpts.metaKey, eventOpts.keyCode, eventOpts.charCode);\n } catch (e) {\n event = buildBasicEvent(type, options);\n }\n return event;\n }\n});","enifed('ember-testing/ext/application', ['ember-application', 'ember-testing/setup_for_testing', 'ember-testing/test/helpers', 'ember-testing/test/promise', 'ember-testing/test/run', 'ember-testing/test/on_inject_helpers', 'ember-testing/test/adapter'], function (_emberApplication, _setup_for_testing, _helpers, _promise, _run, _on_inject_helpers, _adapter) {\n 'use strict';\n\n _emberApplication.Application.reopen({\n /**\n This property contains the testing helpers for the current application. These\n are created once you call `injectTestHelpers` on your `Application`\n instance. The included helpers are also available on the `window` object by\n default, but can be used from this object on the individual application also.\n @property testHelpers\n @type {Object}\n @default {}\n @public\n */\n testHelpers: {},\n\n /**\n This property will contain the original methods that were registered\n on the `helperContainer` before `injectTestHelpers` is called.\n When `removeTestHelpers` is called, these methods are restored to the\n `helperContainer`.\n @property originalMethods\n @type {Object}\n @default {}\n @private\n @since 1.3.0\n */\n originalMethods: {},\n\n /**\n This property indicates whether or not this application is currently in\n testing mode. This is set when `setupForTesting` is called on the current\n application.\n @property testing\n @type {Boolean}\n @default false\n @since 1.3.0\n @public\n */\n testing: false,\n\n setupForTesting: function () {\n (0, _setup_for_testing.default)();\n\n this.testing = true;\n\n this.resolveRegistration('router:main').reopen({\n location: 'none'\n });\n },\n\n\n /**\n This will be used as the container to inject the test helpers into. By\n default the helpers are injected into `window`.\n @property helperContainer\n @type {Object} The object to be used for test helpers.\n @default window\n @since 1.2.0\n @private\n */\n helperContainer: null,\n\n injectTestHelpers: function (helperContainer) {\n if (helperContainer) {\n this.helperContainer = helperContainer;\n } else {\n this.helperContainer = window;\n }\n\n this.reopen({\n willDestroy: function () {\n this._super.apply(this, arguments);\n this.removeTestHelpers();\n }\n });\n\n this.testHelpers = {};\n for (var name in _helpers.helpers) {\n this.originalMethods[name] = this.helperContainer[name];\n this.testHelpers[name] = this.helperContainer[name] = helper(this, name);\n protoWrap(_promise.default.prototype, name, helper(this, name), _helpers.helpers[name].meta.wait);\n }\n\n (0, _on_inject_helpers.invokeInjectHelpersCallbacks)(this);\n },\n removeTestHelpers: function () {\n if (!this.helperContainer) {\n return;\n }\n\n for (var name in _helpers.helpers) {\n this.helperContainer[name] = this.originalMethods[name];\n delete _promise.default.prototype[name];\n delete this.testHelpers[name];\n delete this.originalMethods[name];\n }\n }\n });\n\n // This method is no longer needed\n // But still here for backwards compatibility\n // of helper chaining\n function protoWrap(proto, name, callback, isAsync) {\n proto[name] = function () {\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n if (isAsync) {\n return callback.apply(this, args);\n } else {\n return this.then(function () {\n return callback.apply(this, args);\n });\n }\n };\n }\n\n function helper(app, name) {\n var fn = _helpers.helpers[name].method;\n var meta = _helpers.helpers[name].meta;\n if (!meta.wait) {\n return function () {\n for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n return fn.apply(app, [app].concat(args));\n };\n }\n\n return function () {\n for (var _len3 = arguments.length, args = Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n args[_key3] = arguments[_key3];\n }\n\n var lastPromise = (0, _run.default)(function () {\n return (0, _promise.resolve)((0, _promise.getLastPromise)());\n });\n\n // wait for last helper's promise to resolve and then\n // execute. To be safe, we need to tell the adapter we're going\n // asynchronous here, because fn may not be invoked before we\n // return.\n (0, _adapter.asyncStart)();\n return lastPromise.then(function () {\n return fn.apply(app, [app].concat(args));\n }).finally(_adapter.asyncEnd);\n };\n }\n});","enifed('ember-testing/ext/rsvp', ['exports', 'ember-runtime', 'ember-metal', 'ember-debug', 'ember-testing/test/adapter'], function (exports, _emberRuntime, _emberMetal, _emberDebug, _adapter) {\n 'use strict';\n\n _emberRuntime.RSVP.configure('async', function (callback, promise) {\n // if schedule will cause autorun, we need to inform adapter\n if ((0, _emberDebug.isTesting)() && !_emberMetal.run.backburner.currentInstance) {\n (0, _adapter.asyncStart)();\n _emberMetal.run.backburner.schedule('actions', function () {\n (0, _adapter.asyncEnd)();\n callback(promise);\n });\n } else {\n _emberMetal.run.backburner.schedule('actions', function () {\n return callback(promise);\n });\n }\n });\n\n exports.default = _emberRuntime.RSVP;\n});","enifed('ember-testing/helpers', ['ember-testing/test/helpers', 'ember-testing/helpers/and_then', 'ember-testing/helpers/click', 'ember-testing/helpers/current_path', 'ember-testing/helpers/current_route_name', 'ember-testing/helpers/current_url', 'ember-testing/helpers/fill_in', 'ember-testing/helpers/find', 'ember-testing/helpers/find_with_assert', 'ember-testing/helpers/key_event', 'ember-testing/helpers/pause_test', 'ember-testing/helpers/trigger_event', 'ember-testing/helpers/visit', 'ember-testing/helpers/wait'], function (_helpers, _and_then, _click, _current_path, _current_route_name, _current_url, _fill_in, _find, _find_with_assert, _key_event, _pause_test, _trigger_event, _visit, _wait) {\n 'use strict';\n\n (0, _helpers.registerAsyncHelper)('visit', _visit.default);\n (0, _helpers.registerAsyncHelper)('click', _click.default);\n (0, _helpers.registerAsyncHelper)('keyEvent', _key_event.default);\n (0, _helpers.registerAsyncHelper)('fillIn', _fill_in.default);\n (0, _helpers.registerAsyncHelper)('wait', _wait.default);\n (0, _helpers.registerAsyncHelper)('andThen', _and_then.default);\n (0, _helpers.registerAsyncHelper)('pauseTest', _pause_test.pauseTest);\n (0, _helpers.registerAsyncHelper)('triggerEvent', _trigger_event.default);\n\n (0, _helpers.registerHelper)('find', _find.default);\n (0, _helpers.registerHelper)('findWithAssert', _find_with_assert.default);\n (0, _helpers.registerHelper)('currentRouteName', _current_route_name.default);\n (0, _helpers.registerHelper)('currentPath', _current_path.default);\n (0, _helpers.registerHelper)('currentURL', _current_url.default);\n (0, _helpers.registerHelper)('resumeTest', _pause_test.resumeTest);\n});","enifed(\"ember-testing/helpers/and_then\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.default = andThen;\n function andThen(app, callback) {\n return app.testHelpers.wait(callback(app));\n }\n});","enifed('ember-testing/helpers/click', ['exports', 'ember-testing/events'], function (exports, _events) {\n 'use strict';\n\n exports.default = click;\n\n\n /**\n Clicks an element and triggers any actions triggered by the element's `click`\n event.\n \n Example:\n \n ```javascript\n click('.some-jQuery-selector').then(function() {\n // assert something\n });\n ```\n \n @method click\n @param {String} selector jQuery selector for finding element on the DOM\n @param {Object} context A DOM Element, Document, or jQuery to use as context\n @return {RSVP.Promise<undefined>}\n @public\n */\n function click(app, selector, context) {\n var $el = app.testHelpers.findWithAssert(selector, context);\n var el = $el[0];\n\n (0, _events.fireEvent)(el, 'mousedown');\n\n (0, _events.focus)(el);\n\n (0, _events.fireEvent)(el, 'mouseup');\n (0, _events.fireEvent)(el, 'click');\n\n return app.testHelpers.wait();\n } /**\n @module ember\n */\n});","enifed('ember-testing/helpers/current_path', ['exports', 'ember-metal'], function (exports, _emberMetal) {\n 'use strict';\n\n exports.default = currentPath;\n\n\n /**\n Returns the current path.\n \n Example:\n \n ```javascript\n function validateURL() {\n equal(currentPath(), 'some.path.index', \"correct path was transitioned into.\");\n }\n \n click('#some-link-id').then(validateURL);\n ```\n \n @method currentPath\n @return {Object} The currently active path.\n @since 1.5.0\n @public\n */\n function currentPath(app) {\n var routingService = app.__container__.lookup('service:-routing');\n return (0, _emberMetal.get)(routingService, 'currentPath');\n } /**\n @module ember\n */\n});","enifed('ember-testing/helpers/current_route_name', ['exports', 'ember-metal'], function (exports, _emberMetal) {\n 'use strict';\n\n exports.default = currentRouteName;\n\n /**\n Returns the currently active route name.\n \n Example:\n \n ```javascript\n function validateRouteName() {\n equal(currentRouteName(), 'some.path', \"correct route was transitioned into.\");\n }\n visit('/some/path').then(validateRouteName)\n ```\n \n @method currentRouteName\n @return {Object} The name of the currently active route.\n @since 1.5.0\n @public\n */\n function currentRouteName(app) {\n var routingService = app.__container__.lookup('service:-routing');\n return (0, _emberMetal.get)(routingService, 'currentRouteName');\n } /**\n @module ember\n */\n});","enifed('ember-testing/helpers/current_url', ['exports', 'ember-metal'], function (exports, _emberMetal) {\n 'use strict';\n\n exports.default = currentURL;\n\n\n /**\n Returns the current URL.\n \n Example:\n \n ```javascript\n function validateURL() {\n equal(currentURL(), '/some/path', \"correct URL was transitioned into.\");\n }\n \n click('#some-link-id').then(validateURL);\n ```\n \n @method currentURL\n @return {Object} The currently active URL.\n @since 1.5.0\n @public\n */\n function currentURL(app) {\n var router = app.__container__.lookup('router:main');\n return (0, _emberMetal.get)(router, 'location').getURL();\n } /**\n @module ember\n */\n});","enifed('ember-testing/helpers/fill_in', ['exports', 'ember-testing/events'], function (exports, _events) {\n 'use strict';\n\n exports.default = fillIn;\n\n\n /**\n Fills in an input element with some text.\n \n Example:\n \n ```javascript\n fillIn('#email', 'you@example.com').then(function() {\n // assert something\n });\n ```\n \n @method fillIn\n @param {String} selector jQuery selector finding an input element on the DOM\n to fill text with\n @param {String} text text to place inside the input element\n @return {RSVP.Promise<undefined>}\n @public\n */\n function fillIn(app, selector, contextOrText, text) {\n var $el = void 0,\n el = void 0,\n context = void 0;\n if (text === undefined) {\n text = contextOrText;\n } else {\n context = contextOrText;\n }\n $el = app.testHelpers.findWithAssert(selector, context);\n el = $el[0];\n (0, _events.focus)(el);\n\n $el.eq(0).val(text);\n (0, _events.fireEvent)(el, 'input');\n (0, _events.fireEvent)(el, 'change');\n\n return app.testHelpers.wait();\n } /**\n @module ember\n */\n});","enifed('ember-testing/helpers/find', ['exports', 'ember-metal'], function (exports, _emberMetal) {\n 'use strict';\n\n exports.default = find;\n\n\n /**\n Finds an element in the context of the app's container element. A simple alias\n for `app.$(selector)`.\n \n Example:\n \n ```javascript\n var $el = find('.my-selector');\n ```\n \n With the `context` param:\n \n ```javascript\n var $el = find('.my-selector', '.parent-element-class');\n ```\n \n @method find\n @param {String} selector jQuery string selector for element lookup\n @param {String} [context] (optional) jQuery selector that will limit the selector\n argument to find only within the context's children\n @return {Object} jQuery object representing the results of the query\n @public\n */\n function find(app, selector, context) {\n var $el = void 0;\n context = context || (0, _emberMetal.get)(app, 'rootElement');\n $el = app.$(selector, context);\n return $el;\n } /**\n @module ember\n */\n});","enifed('ember-testing/helpers/find_with_assert', ['exports'], function (exports) {\n 'use strict';\n\n exports.default = findWithAssert;\n /**\n @module ember\n */\n /**\n Like `find`, but throws an error if the element selector returns no results.\n \n Example:\n \n ```javascript\n var $el = findWithAssert('.doesnt-exist'); // throws error\n ```\n \n With the `context` param:\n \n ```javascript\n var $el = findWithAssert('.selector-id', '.parent-element-class'); // assert will pass\n ```\n \n @method findWithAssert\n @param {String} selector jQuery selector string for finding an element within\n the DOM\n @param {String} [context] (optional) jQuery selector that will limit the\n selector argument to find only within the context's children\n @return {Object} jQuery object representing the results of the query\n @throws {Error} throws error if jQuery object returned has a length of 0\n @public\n */\n function findWithAssert(app, selector, context) {\n var $el = app.testHelpers.find(selector, context);\n if ($el.length === 0) {\n throw new Error('Element ' + selector + ' not found.');\n }\n return $el;\n }\n});","enifed(\"ember-testing/helpers/key_event\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.default = keyEvent;\n /**\n @module ember\n */\n /**\n Simulates a key event, e.g. `keypress`, `keydown`, `keyup` with the desired keyCode\n Example:\n ```javascript\n keyEvent('.some-jQuery-selector', 'keypress', 13).then(function() {\n // assert something\n });\n ```\n @method keyEvent\n @param {String} selector jQuery selector for finding element on the DOM\n @param {String} type the type of key event, e.g. `keypress`, `keydown`, `keyup`\n @param {Number} keyCode the keyCode of the simulated key event\n @return {RSVP.Promise<undefined>}\n @since 1.5.0\n @public\n */\n function keyEvent(app, selector, contextOrType, typeOrKeyCode, keyCode) {\n var context = void 0,\n type = void 0;\n\n if (keyCode === undefined) {\n context = null;\n keyCode = typeOrKeyCode;\n type = contextOrType;\n } else {\n context = contextOrType;\n type = typeOrKeyCode;\n }\n\n return app.testHelpers.triggerEvent(selector, context, type, { keyCode: keyCode, which: keyCode });\n }\n});","enifed('ember-testing/helpers/pause_test', ['exports', 'ember-runtime', 'ember-console', 'ember-debug'], function (exports, _emberRuntime, _emberConsole, _emberDebug) {\n 'use strict';\n\n exports.resumeTest = resumeTest;\n exports.pauseTest = pauseTest;\n\n\n var resume = void 0;\n\n /**\n Resumes a test paused by `pauseTest`.\n \n @method resumeTest\n @return {void}\n @public\n */\n /**\n @module ember\n */\n function resumeTest() {\n (true && !(resume) && (0, _emberDebug.assert)('Testing has not been paused. There is nothing to resume.', resume));\n\n resume();\n resume = undefined;\n }\n\n /**\n Pauses the current test - this is useful for debugging while testing or for test-driving.\n It allows you to inspect the state of your application at any point.\n Example (The test will pause before clicking the button):\n \n ```javascript\n visit('/')\n return pauseTest();\n click('.btn');\n ```\n \n You may want to turn off the timeout before pausing.\n \n qunit (as of 2.4.0):\n \n ```\n visit('/');\n assert.timeout(0);\n return pauseTest();\n click('.btn');\n ```\n \n mocha:\n \n ```\n visit('/');\n this.timeout(0);\n return pauseTest();\n click('.btn');\n ```\n \n \n @since 1.9.0\n @method pauseTest\n @return {Object} A promise that will never resolve\n @public\n */\n function pauseTest() {\n _emberConsole.default.info('Testing paused. Use `resumeTest()` to continue.');\n\n return new _emberRuntime.RSVP.Promise(function (resolve) {\n resume = resolve;\n }, 'TestAdapter paused promise');\n }\n});","enifed('ember-testing/helpers/trigger_event', ['exports', 'ember-testing/events'], function (exports, _events) {\n 'use strict';\n\n exports.default = triggerEvent;\n\n /**\n Triggers the given DOM event on the element identified by the provided selector.\n Example:\n ```javascript\n triggerEvent('#some-elem-id', 'blur');\n ```\n This is actually used internally by the `keyEvent` helper like so:\n ```javascript\n triggerEvent('#some-elem-id', 'keypress', { keyCode: 13 });\n ```\n @method triggerEvent\n @param {String} selector jQuery selector for finding element on the DOM\n @param {String} [context] jQuery selector that will limit the selector\n argument to find only within the context's children\n @param {String} type The event type to be triggered.\n @param {Object} [options] The options to be passed to jQuery.Event.\n @return {RSVP.Promise<undefined>}\n @since 1.5.0\n @public\n */\n function triggerEvent(app, selector, contextOrType, typeOrOptions, possibleOptions) {\n var arity = arguments.length;\n var context = void 0,\n type = void 0,\n options = void 0;\n\n if (arity === 3) {\n // context and options are optional, so this is\n // app, selector, type\n context = null;\n type = contextOrType;\n options = {};\n } else if (arity === 4) {\n // context and options are optional, so this is\n if (typeof typeOrOptions === 'object') {\n // either\n // app, selector, type, options\n context = null;\n type = contextOrType;\n options = typeOrOptions;\n } else {\n // or\n // app, selector, context, type\n context = contextOrType;\n type = typeOrOptions;\n options = {};\n }\n } else {\n context = contextOrType;\n type = typeOrOptions;\n options = possibleOptions;\n }\n\n var $el = app.testHelpers.findWithAssert(selector, context);\n var el = $el[0];\n\n (0, _events.fireEvent)(el, type, options);\n\n return app.testHelpers.wait();\n } /**\n @module ember\n */\n});","enifed('ember-testing/helpers/visit', ['exports', 'ember-metal'], function (exports, _emberMetal) {\n 'use strict';\n\n exports.default = visit;\n\n\n /**\n Loads a route, sets up any controllers, and renders any templates associated\n with the route as though a real user had triggered the route change while\n using your app.\n \n Example:\n \n ```javascript\n visit('posts/index').then(function() {\n // assert something\n });\n ```\n \n @method visit\n @param {String} url the name of the route\n @return {RSVP.Promise<undefined>}\n @public\n */\n function visit(app, url) {\n var router = app.__container__.lookup('router:main');\n var shouldHandleURL = false;\n\n app.boot().then(function () {\n router.location.setURL(url);\n\n if (shouldHandleURL) {\n (0, _emberMetal.run)(app.__deprecatedInstance__, 'handleURL', url);\n }\n });\n\n if (app._readinessDeferrals > 0) {\n router['initialURL'] = url;\n (0, _emberMetal.run)(app, 'advanceReadiness');\n delete router['initialURL'];\n } else {\n shouldHandleURL = true;\n }\n\n return app.testHelpers.wait();\n } /**\n @module ember\n */\n});","enifed('ember-testing/helpers/wait', ['exports', 'ember-testing/test/waiters', 'ember-runtime', 'ember-metal', 'ember-testing/test/pending_requests'], function (exports, _waiters, _emberRuntime, _emberMetal, _pending_requests) {\n 'use strict';\n\n exports.default = wait;\n\n\n /**\n Causes the run loop to process any pending events. This is used to ensure that\n any async operations from other helpers (or your assertions) have been processed.\n \n This is most often used as the return value for the helper functions (see 'click',\n 'fillIn','visit',etc). However, there is a method to register a test helper which\n utilizes this method without the need to actually call `wait()` in your helpers.\n \n The `wait` helper is built into `registerAsyncHelper` by default. You will not need\n to `return app.testHelpers.wait();` - the wait behavior is provided for you.\n \n Example:\n \n ```javascript\n import { registerAsyncHelper } from '@ember/test';\n \n registerAsyncHelper('loginUser', function(app, username, password) {\n visit('secured/path/here')\n .fillIn('#username', username)\n .fillIn('#password', password)\n .click('.submit');\n });\n ```\n \n @method wait\n @param {Object} value The value to be returned.\n @return {RSVP.Promise<any>} Promise that resolves to the passed value.\n @public\n @since 1.0.0\n */\n /**\n @module ember\n */\n function wait(app, value) {\n return new _emberRuntime.RSVP.Promise(function (resolve) {\n var router = app.__container__.lookup('router:main');\n\n // Every 10ms, poll for the async thing to have finished\n var watcher = setInterval(function () {\n // 1. If the router is loading, keep polling\n var routerIsLoading = router._routerMicrolib && !!router._routerMicrolib.activeTransition;\n if (routerIsLoading) {\n return;\n }\n\n // 2. If there are pending Ajax requests, keep polling\n if ((0, _pending_requests.pendingRequests)()) {\n return;\n }\n\n // 3. If there are scheduled timers or we are inside of a run loop, keep polling\n if (_emberMetal.run.hasScheduledTimers() || _emberMetal.run.currentRunLoop) {\n return;\n }\n\n if ((0, _waiters.checkWaiters)()) {\n return;\n }\n\n // Stop polling\n clearInterval(watcher);\n\n // Synchronously resolve the promise\n (0, _emberMetal.run)(null, resolve, value);\n }, 10);\n });\n }\n});","enifed('ember-testing/index', ['exports', 'ember-testing/test', 'ember-testing/adapters/adapter', 'ember-testing/setup_for_testing', 'ember-testing/adapters/qunit', 'ember-testing/support', 'ember-testing/ext/application', 'ember-testing/ext/rsvp', 'ember-testing/helpers', 'ember-testing/initializers'], function (exports, _test, _adapter, _setup_for_testing, _qunit) {\n 'use strict';\n\n exports.QUnitAdapter = exports.setupForTesting = exports.Adapter = exports.Test = undefined;\n Object.defineProperty(exports, 'Test', {\n enumerable: true,\n get: function () {\n return _test.default;\n }\n });\n Object.defineProperty(exports, 'Adapter', {\n enumerable: true,\n get: function () {\n return _adapter.default;\n }\n });\n Object.defineProperty(exports, 'setupForTesting', {\n enumerable: true,\n get: function () {\n return _setup_for_testing.default;\n }\n });\n Object.defineProperty(exports, 'QUnitAdapter', {\n enumerable: true,\n get: function () {\n return _qunit.default;\n }\n });\n});","enifed('ember-testing/initializers', ['ember-runtime'], function (_emberRuntime) {\n 'use strict';\n\n var name = 'deferReadiness in `testing` mode';\n\n (0, _emberRuntime.onLoad)('Ember.Application', function (Application) {\n if (!Application.initializers[name]) {\n Application.initializer({\n name: name,\n\n initialize: function (application) {\n if (application.testing) {\n application.deferReadiness();\n }\n }\n });\n }\n });\n});","enifed('ember-testing/setup_for_testing', ['exports', 'ember-debug', 'ember-views', 'ember-testing/test/adapter', 'ember-testing/test/pending_requests', 'ember-testing/adapters/adapter', 'ember-testing/adapters/qunit'], function (exports, _emberDebug, _emberViews, _adapter, _pending_requests, _adapter2, _qunit) {\n 'use strict';\n\n exports.default = setupForTesting;\n\n\n /**\n Sets Ember up for testing. This is useful to perform\n basic setup steps in order to unit test.\n \n Use `App.setupForTesting` to perform integration tests (full\n application testing).\n \n @method setupForTesting\n @namespace Ember\n @since 1.5.0\n @private\n */\n /* global self */\n\n function setupForTesting() {\n (0, _emberDebug.setTesting)(true);\n\n var adapter = (0, _adapter.getAdapter)();\n // if adapter is not manually set default to QUnit\n if (!adapter) {\n (0, _adapter.setAdapter)(typeof self.QUnit === 'undefined' ? new _adapter2.default() : new _qunit.default());\n }\n\n if (_emberViews.jQuery) {\n (0, _emberViews.jQuery)(document).off('ajaxSend', _pending_requests.incrementPendingRequests);\n (0, _emberViews.jQuery)(document).off('ajaxComplete', _pending_requests.decrementPendingRequests);\n\n (0, _pending_requests.clearPendingRequests)();\n\n (0, _emberViews.jQuery)(document).on('ajaxSend', _pending_requests.incrementPendingRequests);\n (0, _emberViews.jQuery)(document).on('ajaxComplete', _pending_requests.decrementPendingRequests);\n }\n }\n});","enifed('ember-testing/support', ['ember-debug', 'ember-views', 'ember-environment'], function (_emberDebug, _emberViews, _emberEnvironment) {\n 'use strict';\n\n /**\n @module ember\n */\n\n var $ = _emberViews.jQuery;\n\n /**\n This method creates a checkbox and triggers the click event to fire the\n passed in handler. It is used to correct for a bug in older versions\n of jQuery (e.g 1.8.3).\n \n @private\n @method testCheckboxClick\n */\n function testCheckboxClick(handler) {\n var input = document.createElement('input');\n $(input).attr('type', 'checkbox').css({ position: 'absolute', left: '-1000px', top: '-1000px' }).appendTo('body').on('click', handler).trigger('click').remove();\n }\n\n if (_emberEnvironment.environment.hasDOM && typeof $ === 'function') {\n $(function () {\n /*\n Determine whether a checkbox checked using jQuery's \"click\" method will have\n the correct value for its checked property.\n If we determine that the current jQuery version exhibits this behavior,\n patch it to work correctly as in the commit for the actual fix:\n https://github.com/jquery/jquery/commit/1fb2f92.\n */\n testCheckboxClick(function () {\n if (!this.checked && !$.event.special.click) {\n $.event.special.click = {\n trigger: function () {\n if ($.nodeName(this, 'input') && this.type === 'checkbox' && this.click) {\n this.click();\n return false;\n }\n }\n };\n }\n });\n\n // Try again to verify that the patch took effect or blow up.\n testCheckboxClick(function () {\n (true && (0, _emberDebug.warn)('clicked checkboxes should be checked! the jQuery patch didn\\'t work', this.checked, { id: 'ember-testing.test-checkbox-click' }));\n });\n });\n }\n});","enifed('ember-testing/test', ['exports', 'ember-testing/test/helpers', 'ember-testing/test/on_inject_helpers', 'ember-testing/test/promise', 'ember-testing/test/waiters', 'ember-testing/test/adapter'], function (exports, _helpers, _on_inject_helpers, _promise, _waiters, _adapter) {\n 'use strict';\n\n /**\n This is a container for an assortment of testing related functionality:\n \n * Choose your default test adapter (for your framework of choice).\n * Register/Unregister additional test helpers.\n * Setup callbacks to be fired when the test helpers are injected into\n your application.\n \n @class Test\n @namespace Ember\n @public\n */\n var Test = {\n /**\n Hash containing all known test helpers.\n @property _helpers\n @private\n @since 1.7.0\n */\n _helpers: _helpers.helpers,\n\n registerHelper: _helpers.registerHelper,\n registerAsyncHelper: _helpers.registerAsyncHelper,\n unregisterHelper: _helpers.unregisterHelper,\n onInjectHelpers: _on_inject_helpers.onInjectHelpers,\n Promise: _promise.default,\n promise: _promise.promise,\n resolve: _promise.resolve,\n registerWaiter: _waiters.registerWaiter,\n unregisterWaiter: _waiters.unregisterWaiter,\n checkWaiters: _waiters.checkWaiters\n };\n\n /**\n Used to allow ember-testing to communicate with a specific testing\n framework.\n \n You can manually set it before calling `App.setupForTesting()`.\n \n Example:\n \n ```javascript\n Ember.Test.adapter = MyCustomAdapter.create()\n ```\n \n If you do not set it, ember-testing will default to `Ember.Test.QUnitAdapter`.\n \n @public\n @for Ember.Test\n @property adapter\n @type {Class} The adapter to be used.\n @default Ember.Test.QUnitAdapter\n */\n /**\n @module ember\n */\n Object.defineProperty(Test, 'adapter', {\n get: _adapter.getAdapter,\n set: _adapter.setAdapter\n });\n\n exports.default = Test;\n});","enifed('ember-testing/test/adapter', ['exports', 'ember-console', 'ember-metal'], function (exports, _emberConsole, _emberMetal) {\n 'use strict';\n\n exports.getAdapter = getAdapter;\n exports.setAdapter = setAdapter;\n exports.asyncStart = asyncStart;\n exports.asyncEnd = asyncEnd;\n\n\n var adapter = void 0;\n function getAdapter() {\n return adapter;\n }\n\n function setAdapter(value) {\n adapter = value;\n if (value && typeof value.exception === 'function') {\n (0, _emberMetal.setDispatchOverride)(adapterDispatch);\n } else {\n (0, _emberMetal.setDispatchOverride)(null);\n }\n }\n\n function asyncStart() {\n if (adapter) {\n adapter.asyncStart();\n }\n }\n\n function asyncEnd() {\n if (adapter) {\n adapter.asyncEnd();\n }\n }\n\n function adapterDispatch(error) {\n adapter.exception(error);\n _emberConsole.default.error(error.stack);\n }\n});","enifed('ember-testing/test/helpers', ['exports', 'ember-testing/test/promise'], function (exports, _promise) {\n 'use strict';\n\n exports.helpers = undefined;\n exports.registerHelper = registerHelper;\n exports.registerAsyncHelper = registerAsyncHelper;\n exports.unregisterHelper = unregisterHelper;\n var helpers = exports.helpers = {};\n /**\n @module @ember/test\n */\n\n /**\n `registerHelper` is used to register a test helper that will be injected\n when `App.injectTestHelpers` is called.\n \n The helper method will always be called with the current Application as\n the first parameter.\n \n For example:\n \n ```javascript\n import { registerHelper } from '@ember/test';\n import { run } from '@ember/runloop';\n \n registerHelper('boot', function(app) {\n run(app, app.advanceReadiness);\n });\n ```\n \n This helper can later be called without arguments because it will be\n called with `app` as the first parameter.\n \n ```javascript\n import Application from '@ember/application';\n \n App = Application.create();\n App.injectTestHelpers();\n boot();\n ```\n \n @public\n @for @ember/test\n @static\n @method registerHelper\n @param {String} name The name of the helper method to add.\n @param {Function} helperMethod\n @param options {Object}\n */\n function registerHelper(name, helperMethod) {\n helpers[name] = {\n method: helperMethod,\n meta: { wait: false }\n };\n }\n\n /**\n `registerAsyncHelper` is used to register an async test helper that will be injected\n when `App.injectTestHelpers` is called.\n \n The helper method will always be called with the current Application as\n the first parameter.\n \n For example:\n \n ```javascript\n import { registerAsyncHelper } from '@ember/test';\n import { run } from '@ember/runloop';\n \n registerAsyncHelper('boot', function(app) {\n run(app, app.advanceReadiness);\n });\n ```\n \n The advantage of an async helper is that it will not run\n until the last async helper has completed. All async helpers\n after it will wait for it complete before running.\n \n \n For example:\n \n ```javascript\n import { registerAsyncHelper } from '@ember/test';\n \n registerAsyncHelper('deletePost', function(app, postId) {\n click('.delete-' + postId);\n });\n \n // ... in your test\n visit('/post/2');\n deletePost(2);\n visit('/post/3');\n deletePost(3);\n ```\n \n @public\n @for @ember/test\n @method registerAsyncHelper\n @param {String} name The name of the helper method to add.\n @param {Function} helperMethod\n @since 1.2.0\n */\n function registerAsyncHelper(name, helperMethod) {\n helpers[name] = {\n method: helperMethod,\n meta: { wait: true }\n };\n }\n\n /**\n Remove a previously added helper method.\n \n Example:\n \n ```javascript\n import { unregisterHelper } from '@ember/test';\n \n unregisterHelper('wait');\n ```\n \n @public\n @method unregisterHelper\n @static\n @for @ember/test\n @param {String} name The helper to remove.\n */\n function unregisterHelper(name) {\n delete helpers[name];\n delete _promise.default.prototype[name];\n }\n});","enifed(\"ember-testing/test/on_inject_helpers\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.onInjectHelpers = onInjectHelpers;\n exports.invokeInjectHelpersCallbacks = invokeInjectHelpersCallbacks;\n var callbacks = exports.callbacks = [];\n\n /**\n Used to register callbacks to be fired whenever `App.injectTestHelpers`\n is called.\n \n The callback will receive the current application as an argument.\n \n Example:\n \n ```javascript\n import $ from 'jquery';\n \n Ember.Test.onInjectHelpers(function() {\n $(document).ajaxSend(function() {\n Test.pendingRequests++;\n });\n \n $(document).ajaxComplete(function() {\n Test.pendingRequests--;\n });\n });\n ```\n \n @public\n @for Ember.Test\n @method onInjectHelpers\n @param {Function} callback The function to be called.\n */\n function onInjectHelpers(callback) {\n callbacks.push(callback);\n }\n\n function invokeInjectHelpersCallbacks(app) {\n for (var i = 0; i < callbacks.length; i++) {\n callbacks[i](app);\n }\n }\n});","enifed(\"ember-testing/test/pending_requests\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.pendingRequests = pendingRequests;\n exports.clearPendingRequests = clearPendingRequests;\n exports.incrementPendingRequests = incrementPendingRequests;\n exports.decrementPendingRequests = decrementPendingRequests;\n var requests = [];\n\n function pendingRequests() {\n return requests.length;\n }\n\n function clearPendingRequests() {\n requests.length = 0;\n }\n\n function incrementPendingRequests(_, xhr) {\n requests.push(xhr);\n }\n\n function decrementPendingRequests(_, xhr) {\n for (var i = 0; i < requests.length; i++) {\n if (xhr === requests[i]) {\n requests.splice(i, 1);\n break;\n }\n }\n }\n});","enifed('ember-testing/test/promise', ['exports', 'ember-babel', 'ember-runtime', 'ember-testing/test/run'], function (exports, _emberBabel, _emberRuntime, _run) {\n 'use strict';\n\n exports.promise = promise;\n exports.resolve = resolve;\n exports.getLastPromise = getLastPromise;\n\n\n var lastPromise = void 0;\n\n var TestPromise = function (_RSVP$Promise) {\n (0, _emberBabel.inherits)(TestPromise, _RSVP$Promise);\n\n function TestPromise() {\n (0, _emberBabel.classCallCheck)(this, TestPromise);\n\n var _this = (0, _emberBabel.possibleConstructorReturn)(this, _RSVP$Promise.apply(this, arguments));\n\n lastPromise = _this;\n return _this;\n }\n\n TestPromise.prototype.then = function then(_onFulfillment) {\n var _RSVP$Promise$prototy;\n\n var onFulfillment = typeof _onFulfillment === 'function' ? function (result) {\n return isolate(_onFulfillment, result);\n } : undefined;\n\n for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n return (_RSVP$Promise$prototy = _RSVP$Promise.prototype.then).call.apply(_RSVP$Promise$prototy, [this, onFulfillment].concat(args));\n };\n\n return TestPromise;\n }(_emberRuntime.RSVP.Promise);\n\n exports.default = TestPromise;\n\n\n /**\n This returns a thenable tailored for testing. It catches failed\n `onSuccess` callbacks and invokes the `Ember.Test.adapter.exception`\n callback in the last chained then.\n \n This method should be returned by async helpers such as `wait`.\n \n @public\n @for Ember.Test\n @method promise\n @param {Function} resolver The function used to resolve the promise.\n @param {String} label An optional string for identifying the promise.\n */\n function promise(resolver, label) {\n var fullLabel = 'Ember.Test.promise: ' + (label || '<Unknown Promise>');\n return new TestPromise(resolver, fullLabel);\n }\n\n /**\n Replacement for `Ember.RSVP.resolve`\n The only difference is this uses\n an instance of `Ember.Test.Promise`\n \n @public\n @for Ember.Test\n @method resolve\n @param {Mixed} The value to resolve\n @since 1.2.0\n */\n function resolve(result, label) {\n return TestPromise.resolve(result, label);\n }\n\n function getLastPromise() {\n return lastPromise;\n }\n\n // This method isolates nested async methods\n // so that they don't conflict with other last promises.\n //\n // 1. Set `Ember.Test.lastPromise` to null\n // 2. Invoke method\n // 3. Return the last promise created during method\n function isolate(onFulfillment, result) {\n // Reset lastPromise for nested helpers\n lastPromise = null;\n\n var value = onFulfillment(result);\n\n var promise = lastPromise;\n lastPromise = null;\n\n // If the method returned a promise\n // return that promise. If not,\n // return the last async helper's promise\n if (value && value instanceof TestPromise || !promise) {\n return value;\n } else {\n return (0, _run.default)(function () {\n return resolve(promise).then(function () {\n return value;\n });\n });\n }\n }\n});","enifed('ember-testing/test/run', ['exports', 'ember-metal'], function (exports, _emberMetal) {\n 'use strict';\n\n exports.default = run;\n function run(fn) {\n if (!_emberMetal.run.currentRunLoop) {\n return (0, _emberMetal.run)(fn);\n } else {\n return fn();\n }\n }\n});","enifed(\"ember-testing/test/waiters\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.registerWaiter = registerWaiter;\n exports.unregisterWaiter = unregisterWaiter;\n exports.checkWaiters = checkWaiters;\n /**\n @module @ember/test\n */\n var contexts = [];\n var callbacks = [];\n\n /**\n This allows ember-testing to play nicely with other asynchronous\n events, such as an application that is waiting for a CSS3\n transition or an IndexDB transaction. The waiter runs periodically\n after each async helper (i.e. `click`, `andThen`, `visit`, etc) has executed,\n until the returning result is truthy. After the waiters finish, the next async helper\n is executed and the process repeats.\n \n For example:\n \n ```javascript\n import { registerWaiter } from '@ember/test';\n \n registerWaiter(function() {\n return myPendingTransactions() == 0;\n });\n ```\n The `context` argument allows you to optionally specify the `this`\n with which your callback will be invoked.\n \n For example:\n \n ```javascript\n import { registerWaiter } from '@ember/test';\n \n registerWaiter(MyDB, MyDB.hasPendingTransactions);\n ```\n \n @public\n @for @ember/test\n @static\n @method registerWaiter\n @param {Object} context (optional)\n @param {Function} callback\n @since 1.2.0\n */\n function registerWaiter(context, callback) {\n if (arguments.length === 1) {\n callback = context;\n context = null;\n }\n if (indexOf(context, callback) > -1) {\n return;\n }\n contexts.push(context);\n callbacks.push(callback);\n }\n\n /**\n `unregisterWaiter` is used to unregister a callback that was\n registered with `registerWaiter`.\n \n @public\n @for @ember/test\n @static\n @method unregisterWaiter\n @param {Object} context (optional)\n @param {Function} callback\n @since 1.2.0\n */\n function unregisterWaiter(context, callback) {\n if (!callbacks.length) {\n return;\n }\n if (arguments.length === 1) {\n callback = context;\n context = null;\n }\n var i = indexOf(context, callback);\n if (i === -1) {\n return;\n }\n contexts.splice(i, 1);\n callbacks.splice(i, 1);\n }\n\n /**\n Iterates through each registered test waiter, and invokes\n its callback. If any waiter returns false, this method will return\n true indicating that the waiters have not settled yet.\n \n This is generally used internally from the acceptance/integration test\n infrastructure.\n \n @public\n @for @ember/test\n @static\n @method checkWaiters\n */\n function checkWaiters() {\n if (!callbacks.length) {\n return false;\n }\n for (var i = 0; i < callbacks.length; i++) {\n var context = contexts[i];\n var callback = callbacks[i];\n if (!callback.call(context)) {\n return true;\n }\n }\n return false;\n }\n\n function indexOf(context, callback) {\n for (var i = 0; i < callbacks.length; i++) {\n if (callbacks[i] === callback && contexts[i] === context) {\n return i;\n }\n }\n return -1;\n }\n});","enifed('ember-utils', ['exports'], function (exports) {\n 'use strict';\n\n /**\n Strongly hint runtimes to intern the provided string.\n \n When do I need to use this function?\n \n For the most part, never. Pre-mature optimization is bad, and often the\n runtime does exactly what you need it to, and more often the trade-off isn't\n worth it.\n \n Why?\n \n Runtimes store strings in at least 2 different representations:\n Ropes and Symbols (interned strings). The Rope provides a memory efficient\n data-structure for strings created from concatenation or some other string\n manipulation like splitting.\n \n Unfortunately checking equality of different ropes can be quite costly as\n runtimes must resort to clever string comparison algorithms. These\n algorithms typically cost in proportion to the length of the string.\n Luckily, this is where the Symbols (interned strings) shine. As Symbols are\n unique by their string content, equality checks can be done by pointer\n comparison.\n \n How do I know if my string is a rope or symbol?\n \n Typically (warning general sweeping statement, but truthy in runtimes at\n present) static strings created as part of the JS source are interned.\n Strings often used for comparisons can be interned at runtime if some\n criteria are met. One of these criteria can be the size of the entire rope.\n For example, in chrome 38 a rope longer then 12 characters will not\n intern, nor will segments of that rope.\n \n Some numbers: http://jsperf.com/eval-vs-keys/8\n \n Known Trick™\n \n @private\n @return {String} interned version of the provided string\n */\n function intern(str) {\n var obj = {};\n obj[str] = 1;\n for (var key in obj) {\n if (key === str) {\n return key;\n }\n }\n return str;\n }\n\n /**\n @module @ember/object\n */\n\n /**\n Previously we used `Ember.$.uuid`, however `$.uuid` has been removed from\n jQuery master. We'll just bootstrap our own uuid now.\n \n @private\n @return {Number} the uuid\n */\n var _uuid = 0;\n\n /**\n Generates a universally unique identifier. This method\n is used internally by Ember for assisting with\n the generation of GUID's and other unique identifiers.\n \n @public\n @return {Number} [description]\n */\n function uuid() {\n return ++_uuid;\n }\n\n /**\n Prefix used for guids through out Ember.\n @private\n @property GUID_PREFIX\n @for Ember\n @type String\n @final\n */\n var GUID_PREFIX = 'ember';\n\n // Used for guid generation...\n var numberCache = [];\n var stringCache = {};\n\n /**\n A unique key used to assign guids and other private metadata to objects.\n If you inspect an object in your browser debugger you will often see these.\n They can be safely ignored.\n \n On browsers that support it, these properties are added with enumeration\n disabled so they won't show up when you iterate over your properties.\n \n @private\n @property GUID_KEY\n @for Ember\n @type String\n @final\n */\n var GUID_KEY = intern('__ember' + +new Date());\n\n var GUID_DESC = {\n writable: true,\n configurable: true,\n enumerable: false,\n value: null\n };\n\n var nullDescriptor = {\n configurable: true,\n writable: true,\n enumerable: false,\n value: null\n };\n\n var GUID_KEY_PROPERTY = {\n name: GUID_KEY,\n descriptor: nullDescriptor\n };\n\n /**\n Generates a new guid, optionally saving the guid to the object that you\n pass in. You will rarely need to use this method. Instead you should\n call `guidFor(obj)`, which return an existing guid if available.\n \n @private\n @method generateGuid\n @static\n @for @ember/object/internals\n @param {Object} [obj] Object the guid will be used for. If passed in, the guid will\n be saved on the object and reused whenever you pass the same object\n again.\n \n If no object is passed, just generate a new guid.\n @param {String} [prefix] Prefix to place in front of the guid. Useful when you want to\n separate the guid into separate namespaces.\n @return {String} the guid\n */\n function generateGuid(obj) {\n var prefix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : GUID_PREFIX;\n\n var ret = prefix + uuid();\n if (obj !== undefined && obj !== null) {\n if (obj[GUID_KEY] === null) {\n obj[GUID_KEY] = ret;\n } else {\n GUID_DESC.value = ret;\n if (obj.__defineNonEnumerable) {\n obj.__defineNonEnumerable(GUID_KEY_PROPERTY);\n } else {\n Object.defineProperty(obj, GUID_KEY, GUID_DESC);\n }\n }\n }\n return ret;\n }\n\n /**\n Returns a unique id for the object. If the object does not yet have a guid,\n one will be assigned to it. You can call this on any object,\n `EmberObject`-based or not, but be aware that it will add a `_guid`\n property.\n \n You can also use this method on DOM Element objects.\n \n @public\n @static\n @method guidFor\n @for @ember/object/internals\n @param {Object} obj any object, string, number, Element, or primitive\n @return {String} the unique guid for this instance.\n */\n function guidFor(obj) {\n // special cases where we don't want to add a key to object\n if (obj === undefined) {\n return '(undefined)';\n }\n\n if (obj === null) {\n return '(null)';\n }\n\n var type = typeof obj;\n if ((type === 'object' || type === 'function') && obj[GUID_KEY]) {\n return obj[GUID_KEY];\n }\n\n var ret = void 0;\n // Don't allow prototype changes to String etc. to change the guidFor\n switch (type) {\n case 'number':\n ret = numberCache[obj];\n\n if (!ret) {\n ret = numberCache[obj] = 'nu' + obj;\n }\n\n return ret;\n\n case 'string':\n ret = stringCache[obj];\n\n if (!ret) {\n ret = stringCache[obj] = 'st' + uuid();\n }\n\n return ret;\n\n case 'boolean':\n return obj ? '(true)' : '(false)';\n\n default:\n if (obj === Object) {\n return '(Object)';\n }\n\n if (obj === Array) {\n return '(Array)';\n }\n\n return generateGuid(obj);\n }\n }\n\n function symbol(debugName) {\n // TODO: Investigate using platform symbols, but we do not\n // want to require non-enumerability for this API, which\n // would introduce a large cost.\n var id = GUID_KEY + Math.floor(Math.random() * new Date());\n return intern('__' + debugName + id + '__');\n }\n\n /**\n @module @ember/application\n */\n\n var OWNER = symbol('OWNER');\n\n /**\n Framework objects in an Ember application (components, services, routes, etc.)\n are created via a factory and dependency injection system. Each of these\n objects is the responsibility of an \"owner\", which handled its\n instantiation and manages its lifetime.\n \n `getOwner` fetches the owner object responsible for an instance. This can\n be used to lookup or resolve other class instances, or register new factories\n into the owner.\n \n For example, this component dynamically looks up a service based on the\n `audioType` passed as an attribute:\n \n ```app/components/play-audio.js\n import Component from '@ember/component';\n import { computed } from '@ember/object';\n import { getOwner } from '@ember/application';\n \n // Usage:\n //\n // {{play-audio audioType=model.audioType audioFile=model.file}}\n //\n export default Component.extend({\n audioService: computed('audioType', function() {\n let owner = getOwner(this);\n return owner.lookup(`service:${this.get('audioType')}`);\n }),\n \n click() {\n let player = this.get('audioService');\n player.play(this.get('audioFile'));\n }\n });\n ```\n \n @method getOwner\n @static\n @for @ember/application\n @param {Object} object An object with an owner.\n @return {Object} An owner object.\n @since 2.3.0\n @public\n */\n function getOwner(object) {\n return object[OWNER];\n }\n\n /**\n `setOwner` forces a new owner on a given object instance. This is primarily\n useful in some testing cases.\n \n @method setOwner\n @static\n @for @ember/application\n @param {Object} object An object instance.\n @param {Object} object The new owner object of the object instance.\n @since 2.3.0\n @public\n */\n function setOwner(object, owner) {\n object[OWNER] = owner;\n }\n\n /**\n @module @ember/polyfills\n */\n /**\n Copy properties from a source object to a target object.\n \n ```javascript\n import { assign } from '@ember/polyfills';\n \n var a = { first: 'Yehuda' };\n var b = { last: 'Katz' };\n var c = { company: 'Tilde Inc.' };\n assign(a, b, c); // a === { first: 'Yehuda', last: 'Katz', company: 'Tilde Inc.' }, b === { last: 'Katz' }, c === { company: 'Tilde Inc.' }\n ```\n \n @method assign\n @for @ember/polyfills\n @param {Object} original The object to assign into\n @param {Object} ...args The objects to copy properties from\n @return {Object}\n @public\n @static\n */\n function assign(original) {\n for (var i = 1; i < arguments.length; i++) {\n var arg = arguments[i];\n if (!arg) {\n continue;\n }\n\n var updates = Object.keys(arg);\n\n for (var _i = 0; _i < updates.length; _i++) {\n var prop = updates[_i];\n original[prop] = arg[prop];\n }\n }\n\n return original;\n }\n\n var assign$1 = Object.assign || assign;\n\n // the delete is meant to hint at runtimes that this object should remain in\n // dictionary mode. This is clearly a runtime specific hack, but currently it\n // appears worthwhile in some usecases. Please note, these deletes do increase\n // the cost of creation dramatically over a plain Object.create. And as this\n // only makes sense for long-lived dictionaries that aren't instantiated often.\n function makeDictionary(parent) {\n var dict = Object.create(parent);\n dict['_dict'] = null;\n delete dict['_dict'];\n return dict;\n }\n\n var HAS_SUPER_PATTERN = /\\.(_super|call\\(this|apply\\(this)/;\n var fnToString = Function.prototype.toString;\n\n var checkHasSuper = function () {\n var sourceAvailable = fnToString.call(function () {\n return this;\n }).indexOf('return this') > -1;\n\n if (sourceAvailable) {\n return function checkHasSuper(func) {\n return HAS_SUPER_PATTERN.test(fnToString.call(func));\n };\n }\n\n return function checkHasSuper() {\n return true;\n };\n }();\n\n function ROOT() {}\n ROOT.__hasSuper = false;\n\n function hasSuper(func) {\n if (func.__hasSuper === undefined) {\n func.__hasSuper = checkHasSuper(func);\n }\n return func.__hasSuper;\n }\n\n /**\n Wraps the passed function so that `this._super` will point to the superFunc\n when the function is invoked. This is the primitive we use to implement\n calls to super.\n \n @private\n @method wrap\n @for Ember\n @param {Function} func The function to call\n @param {Function} superFunc The super function.\n @return {Function} wrapped function.\n */\n function wrap(func, superFunc) {\n if (!hasSuper(func)) {\n return func;\n }\n // ensure an unwrapped super that calls _super is wrapped with a terminal _super\n if (!superFunc.wrappedFunction && hasSuper(superFunc)) {\n return _wrap(func, _wrap(superFunc, ROOT));\n }\n return _wrap(func, superFunc);\n }\n\n function _wrap(func, superFunc) {\n function superWrapper() {\n var orig = this._super;\n this._super = superFunc;\n var ret = func.apply(this, arguments);\n this._super = orig;\n return ret;\n }\n\n superWrapper.wrappedFunction = func;\n superWrapper.__ember_observes__ = func.__ember_observes__;\n superWrapper.__ember_observesBefore__ = func.__ember_observesBefore__;\n superWrapper.__ember_listens__ = func.__ember_listens__;\n\n return superWrapper;\n }\n\n var objectToString = Object.prototype.toString;\n /**\n @module @ember/debug\n */\n /**\n Convenience method to inspect an object. This method will attempt to\n convert the object into a useful string description.\n \n It is a pretty simple implementation. If you want something more robust,\n use something like JSDump: https://github.com/NV/jsDump\n \n @method inspect\n @static\n @param {Object} obj The object you want to inspect.\n @return {String} A description of the object\n @since 1.4.0\n @private\n */\n function inspect(obj) {\n if (obj === null) {\n return 'null';\n }\n if (obj === undefined) {\n return 'undefined';\n }\n if (Array.isArray(obj)) {\n return '[' + obj + ']';\n }\n // for non objects\n var type = typeof obj;\n if (type !== 'object' && type !== 'symbol') {\n return '' + obj;\n }\n // overridden toString\n if (typeof obj.toString === 'function' && obj.toString !== objectToString) {\n return obj.toString();\n }\n\n // Object.prototype.toString === {}.toString\n var v = void 0;\n var ret = [];\n for (var key in obj) {\n if (obj.hasOwnProperty(key)) {\n v = obj[key];\n if (v === 'toString') {\n continue;\n } // ignore useless items\n if (typeof v === 'function') {\n v = 'function() { ... }';\n }\n\n if (v && typeof v.toString !== 'function') {\n ret.push(key + ': ' + objectToString.call(v));\n } else {\n ret.push(key + ': ' + v);\n }\n }\n }\n return '{' + ret.join(', ') + '}';\n }\n\n function lookupDescriptor(obj, keyName) {\n var current = obj;\n while (current) {\n var descriptor = Object.getOwnPropertyDescriptor(current, keyName);\n\n if (descriptor) {\n return descriptor;\n }\n\n current = Object.getPrototypeOf(current);\n }\n\n return null;\n }\n\n /**\n @param {Object} t target\n @param {String} m method\n @param {Array} a args\n @private\n */\n function applyStr(t, m, a) {\n var l = a && a.length;\n if (!a || !l) {\n return t[m]();\n }\n switch (l) {\n case 1:\n return t[m](a[0]);\n case 2:\n return t[m](a[0], a[1]);\n case 3:\n return t[m](a[0], a[1], a[2]);\n case 4:\n return t[m](a[0], a[1], a[2], a[3]);\n case 5:\n return t[m](a[0], a[1], a[2], a[3], a[4]);\n default:\n return t[m].apply(t, a);\n }\n }\n\n /**\n Checks to see if the `methodName` exists on the `obj`.\n \n ```javascript\n let foo = { bar: function() { return 'bar'; }, baz: null };\n \n Ember.canInvoke(foo, 'bar'); // true\n Ember.canInvoke(foo, 'baz'); // false\n Ember.canInvoke(foo, 'bat'); // false\n ```\n \n @method canInvoke\n @for Ember\n @param {Object} obj The object to check for the method\n @param {String} methodName The method name to check for\n @return {Boolean}\n @private\n */\n function canInvoke(obj, methodName) {\n return obj !== null && obj !== undefined && typeof obj[methodName] === 'function';\n }\n\n /**\n @module @ember/utils\n */\n\n /**\n Checks to see if the `methodName` exists on the `obj`,\n and if it does, invokes it with the arguments passed.\n \n ```javascript\n import { tryInvoke } from '@ember/utils';\n \n let d = new Date('03/15/2013');\n \n tryInvoke(d, 'getTime'); // 1363320000000\n tryInvoke(d, 'setFullYear', [2014]); // 1394856000000\n tryInvoke(d, 'noSuchMethod', [2014]); // undefined\n ```\n \n @method tryInvoke\n @for @ember/utils\n @static\n @param {Object} obj The object to check for the method\n @param {String} methodName The method name to check for\n @param {Array} [args] The arguments to pass to the method\n @return {*} the return value of the invoked method or undefined if it cannot be invoked\n @public\n */\n function tryInvoke(obj, methodName, args) {\n if (canInvoke(obj, methodName)) {\n return applyStr(obj, methodName, args);\n }\n }\n\n var isArray = Array.isArray;\n\n /**\n @module @ember/array\n */\n /**\n Forces the passed object to be part of an array. If the object is already\n an array, it will return the object. Otherwise, it will add the object to\n an array. If obj is `null` or `undefined`, it will return an empty array.\n \n ```javascript\n import { makeArray } from '@ember/array';\n import ArrayProxy from '@ember/array/proxy';\n \n makeArray(); // []\n makeArray(null); // []\n makeArray(undefined); // []\n makeArray('lindsay'); // ['lindsay']\n makeArray([1, 2, 42]); // [1, 2, 42]\n \n let controller = ArrayProxy.create({ content: [] });\n \n makeArray(controller) === controller; // true\n ```\n \n @method makeArray\n @static\n @for @ember/array\n @param {Object} obj the object\n @return {Array}\n @private\n */\n function makeArray(obj) {\n if (obj === null || obj === undefined) {\n return [];\n }\n return isArray(obj) ? obj : [obj];\n }\n\n var name = symbol('NAME_KEY');\n\n var objectToString$1 = Object.prototype.toString;\n\n function isNone(obj) {\n return obj === null || obj === undefined;\n }\n\n /*\n A `toString` util function that supports objects without a `toString`\n method, e.g. an object created with `Object.create(null)`.\n */\n function toString(obj) {\n var type = typeof obj;\n if (type === \"string\") {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n // Reimplement Array.prototype.join according to spec (22.1.3.13)\n // Changing ToString(element) with this safe version of ToString.\n var len = obj.length;\n var r = '';\n\n for (var k = 0; k < len; k++) {\n if (k > 0) {\n r += ',';\n }\n\n if (!isNone(obj[k])) {\n r += toString(obj[k]);\n }\n }\n\n return r;\n } else if (obj != null && typeof obj.toString === 'function') {\n return obj.toString();\n } else {\n return objectToString$1.call(obj);\n }\n }\n\n var HAS_NATIVE_PROXY = typeof Proxy === 'function';\n\n /*\n This package will be eagerly parsed and should have no dependencies on external\n packages.\n \n It is intended to be used to share utility methods that will be needed\n by every Ember application (and is **not** a dumping ground of useful utilities).\n \n Utility methods that are needed in < 80% of cases should be placed\n elsewhere (so they can be lazily evaluated / parsed).\n */\n\n exports.symbol = symbol;\n exports.getOwner = getOwner;\n exports.setOwner = setOwner;\n exports.OWNER = OWNER;\n exports.assign = assign$1;\n exports.assignPolyfill = assign;\n exports.dictionary = makeDictionary;\n exports.uuid = uuid;\n exports.GUID_KEY = GUID_KEY;\n exports.GUID_DESC = GUID_DESC;\n exports.GUID_KEY_PROPERTY = GUID_KEY_PROPERTY;\n exports.generateGuid = generateGuid;\n exports.guidFor = guidFor;\n exports.intern = intern;\n exports.checkHasSuper = checkHasSuper;\n exports.ROOT = ROOT;\n exports.wrap = wrap;\n exports.inspect = inspect;\n exports.lookupDescriptor = lookupDescriptor;\n exports.canInvoke = canInvoke;\n exports.tryInvoke = tryInvoke;\n exports.makeArray = makeArray;\n exports.applyStr = applyStr;\n exports.NAME_KEY = name;\n exports.toString = toString;\n exports.HAS_NATIVE_PROXY = HAS_NATIVE_PROXY;\n});","enifed('ember-views/compat/attrs', ['exports', 'ember-utils'], function (exports, _emberUtils) {\n 'use strict';\n\n exports.MUTABLE_CELL = undefined;\n var MUTABLE_CELL = exports.MUTABLE_CELL = (0, _emberUtils.symbol)('MUTABLE_CELL');\n});","enifed('ember-views/compat/fallback-view-registry', ['exports', 'ember-utils'], function (exports, _emberUtils) {\n 'use strict';\n\n exports.default = (0, _emberUtils.dictionary)(null);\n});","enifed('ember-views/component_lookup', ['exports', 'ember-debug', 'ember-runtime'], function (exports, _emberDebug, _emberRuntime) {\n 'use strict';\n\n exports.default = _emberRuntime.Object.extend({\n componentFor: function (name, owner, options) {\n (true && !(~name.indexOf('-')) && (0, _emberDebug.assert)('You cannot use \\'' + name + '\\' as a component name. Component names must contain a hyphen.', ~name.indexOf('-')));\n\n var fullName = 'component:' + name;\n return owner.factoryFor(fullName, options);\n },\n layoutFor: function (name, owner, options) {\n (true && !(~name.indexOf('-')) && (0, _emberDebug.assert)('You cannot use \\'' + name + '\\' as a component name. Component names must contain a hyphen.', ~name.indexOf('-')));\n\n\n var templateFullName = 'template:components/' + name;\n return owner.lookup(templateFullName, options);\n }\n });\n});","enifed('ember-views/index', ['exports', 'ember-views/system/jquery', 'ember-views/system/utils', 'ember-views/system/event_dispatcher', 'ember-views/component_lookup', 'ember-views/mixins/text_support', 'ember-views/views/core_view', 'ember-views/mixins/class_names_support', 'ember-views/mixins/child_views_support', 'ember-views/mixins/view_state_support', 'ember-views/mixins/view_support', 'ember-views/mixins/action_support', 'ember-views/compat/attrs', 'ember-views/system/lookup_partial', 'ember-views/utils/lookup-component', 'ember-views/system/action_manager', 'ember-views/compat/fallback-view-registry', 'ember-views/system/ext'], function (exports, _jquery, _utils, _event_dispatcher, _component_lookup, _text_support, _core_view, _class_names_support, _child_views_support, _view_state_support, _view_support, _action_support, _attrs, _lookup_partial, _lookupComponent, _action_manager, _fallbackViewRegistry) {\n 'use strict';\n\n exports.fallbackViewRegistry = exports.ActionManager = exports.lookupComponent = exports.hasPartial = exports.lookupPartial = exports.MUTABLE_CELL = exports.ActionSupport = exports.ViewMixin = exports.ViewStateSupport = exports.ChildViewsSupport = exports.ClassNamesSupport = exports.CoreView = exports.TextSupport = exports.ComponentLookup = exports.EventDispatcher = exports.constructStyleDeprecationMessage = exports.setViewElement = exports.getViewElement = exports.getViewId = exports.getChildViews = exports.getRootViews = exports.getViewBoundingClientRect = exports.getViewClientRects = exports.getViewBounds = exports.isSimpleClick = exports.jQuery = undefined;\n Object.defineProperty(exports, 'jQuery', {\n enumerable: true,\n get: function () {\n return _jquery.default;\n }\n });\n Object.defineProperty(exports, 'isSimpleClick', {\n enumerable: true,\n get: function () {\n return _utils.isSimpleClick;\n }\n });\n Object.defineProperty(exports, 'getViewBounds', {\n enumerable: true,\n get: function () {\n return _utils.getViewBounds;\n }\n });\n Object.defineProperty(exports, 'getViewClientRects', {\n enumerable: true,\n get: function () {\n return _utils.getViewClientRects;\n }\n });\n Object.defineProperty(exports, 'getViewBoundingClientRect', {\n enumerable: true,\n get: function () {\n return _utils.getViewBoundingClientRect;\n }\n });\n Object.defineProperty(exports, 'getRootViews', {\n enumerable: true,\n get: function () {\n return _utils.getRootViews;\n }\n });\n Object.defineProperty(exports, 'getChildViews', {\n enumerable: true,\n get: function () {\n return _utils.getChildViews;\n }\n });\n Object.defineProperty(exports, 'getViewId', {\n enumerable: true,\n get: function () {\n return _utils.getViewId;\n }\n });\n Object.defineProperty(exports, 'getViewElement', {\n enumerable: true,\n get: function () {\n return _utils.getViewElement;\n }\n });\n Object.defineProperty(exports, 'setViewElement', {\n enumerable: true,\n get: function () {\n return _utils.setViewElement;\n }\n });\n Object.defineProperty(exports, 'constructStyleDeprecationMessage', {\n enumerable: true,\n get: function () {\n return _utils.constructStyleDeprecationMessage;\n }\n });\n Object.defineProperty(exports, 'EventDispatcher', {\n enumerable: true,\n get: function () {\n return _event_dispatcher.default;\n }\n });\n Object.defineProperty(exports, 'ComponentLookup', {\n enumerable: true,\n get: function () {\n return _component_lookup.default;\n }\n });\n Object.defineProperty(exports, 'TextSupport', {\n enumerable: true,\n get: function () {\n return _text_support.default;\n }\n });\n Object.defineProperty(exports, 'CoreView', {\n enumerable: true,\n get: function () {\n return _core_view.default;\n }\n });\n Object.defineProperty(exports, 'ClassNamesSupport', {\n enumerable: true,\n get: function () {\n return _class_names_support.default;\n }\n });\n Object.defineProperty(exports, 'ChildViewsSupport', {\n enumerable: true,\n get: function () {\n return _child_views_support.default;\n }\n });\n Object.defineProperty(exports, 'ViewStateSupport', {\n enumerable: true,\n get: function () {\n return _view_state_support.default;\n }\n });\n Object.defineProperty(exports, 'ViewMixin', {\n enumerable: true,\n get: function () {\n return _view_support.default;\n }\n });\n Object.defineProperty(exports, 'ActionSupport', {\n enumerable: true,\n get: function () {\n return _action_support.default;\n }\n });\n Object.defineProperty(exports, 'MUTABLE_CELL', {\n enumerable: true,\n get: function () {\n return _attrs.MUTABLE_CELL;\n }\n });\n Object.defineProperty(exports, 'lookupPartial', {\n enumerable: true,\n get: function () {\n return _lookup_partial.default;\n }\n });\n Object.defineProperty(exports, 'hasPartial', {\n enumerable: true,\n get: function () {\n return _lookup_partial.hasPartial;\n }\n });\n Object.defineProperty(exports, 'lookupComponent', {\n enumerable: true,\n get: function () {\n return _lookupComponent.default;\n }\n });\n Object.defineProperty(exports, 'ActionManager', {\n enumerable: true,\n get: function () {\n return _action_manager.default;\n }\n });\n Object.defineProperty(exports, 'fallbackViewRegistry', {\n enumerable: true,\n get: function () {\n return _fallbackViewRegistry.default;\n }\n });\n});","enifed('ember-views/mixins/action_support', ['exports', 'ember-utils', 'ember-metal', 'ember-debug', 'ember-views/compat/attrs'], function (exports, _emberUtils, _emberMetal, _emberDebug, _attrs) {\n 'use strict';\n\n /**\n @module ember\n */\n function validateAction(component, actionName) {\n if (actionName && actionName[_attrs.MUTABLE_CELL]) {\n actionName = actionName.value;\n }\n\n (true && !((0, _emberMetal.isNone)(actionName) || typeof actionName === 'string' || typeof actionName === 'function') && (0, _emberDebug.assert)('The default action was triggered on the component ' + component.toString() + ', but the action name (' + actionName + ') was not a string.', (0, _emberMetal.isNone)(actionName) || typeof actionName === 'string' || typeof actionName === 'function'));\n\n return actionName;\n }\n\n /**\n @class ActionSupport\n @namespace Ember\n @private\n */\n exports.default = _emberMetal.Mixin.create({\n /**\n Calls an action passed to a component.\n For example a component for playing or pausing music may translate click events\n into action notifications of \"play\" or \"stop\" depending on some internal state\n of the component:\n ```app/components/play-button.js\n import Component from '@ember/component';\n export default Component.extend({\n click() {\n if (this.get('isPlaying')) {\n this.sendAction('play');\n } else {\n this.sendAction('stop');\n }\n }\n });\n ```\n The actions \"play\" and \"stop\" must be passed to this `play-button` component:\n ```handlebars\n {{! app/templates/application.hbs }}\n {{play-button play=(action \"musicStarted\") stop=(action \"musicStopped\")}}\n ```\n When the component receives a browser `click` event it translate this\n interaction into application-specific semantics (\"play\" or \"stop\") and\n calls the specified action.\n ```app/controller/application.js\n import Controller from '@ember/controller';\n export default Controller.extend({\n actions: {\n musicStarted() {\n // called when the play button is clicked\n // and the music started playing\n },\n musicStopped() {\n // called when the play button is clicked\n // and the music stopped playing\n }\n }\n });\n ```\n If no action is passed to `sendAction` a default name of \"action\"\n is assumed.\n ```app/components/next-button.js\n import Component from '@ember/component';\n export default Component.extend({\n click() {\n this.sendAction();\n }\n });\n ```\n ```handlebars\n {{! app/templates/application.hbs }}\n {{next-button action=(action \"playNextSongInAlbum\")}}\n ```\n ```app/controllers/application.js\n import Controller from '@ember/controller';\n export default Controller.extend({\n actions: {\n playNextSongInAlbum() {\n ...\n }\n }\n });\n ```\n @method sendAction\n @param [action] {String} the action to call\n @param [params] {*} arguments for the action\n @public\n */\n sendAction: function (action) {\n for (var _len = arguments.length, contexts = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n contexts[_key - 1] = arguments[_key];\n }\n\n var actionName = void 0;\n\n // Send the default action\n if (action === undefined) {\n action = 'action';\n }\n actionName = (0, _emberMetal.get)(this, 'attrs.' + action) || (0, _emberMetal.get)(this, action);\n actionName = validateAction(this, actionName);\n\n // If no action name for that action could be found, just abort.\n if (actionName === undefined) {\n return;\n }\n\n if (typeof actionName === 'function') {\n actionName.apply(undefined, contexts);\n } else {\n this.triggerAction({\n action: actionName,\n actionContext: contexts\n });\n }\n },\n send: function (actionName) {\n for (var _len2 = arguments.length, args = Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n var action = this.actions && this.actions[actionName];\n\n if (action) {\n var shouldBubble = action.apply(this, args) === true;\n if (!shouldBubble) {\n return;\n }\n }\n\n var target = (0, _emberMetal.get)(this, 'target');\n if (target) {\n (true && !(typeof target.send === 'function') && (0, _emberDebug.assert)('The `target` for ' + this + ' (' + target + ') does not have a `send` method', typeof target.send === 'function'));\n\n target.send.apply(target, arguments);\n } else {\n (true && !(action) && (0, _emberDebug.assert)((0, _emberUtils.inspect)(this) + ' had no action handler for: ' + actionName, action));\n }\n }\n });\n});","enifed('ember-views/mixins/child_views_support', ['exports', 'ember-utils', 'ember-metal', 'ember-views/system/utils'], function (exports, _emberUtils, _emberMetal, _utils) {\n 'use strict';\n\n exports.default = _emberMetal.Mixin.create({\n init: function () {\n this._super.apply(this, arguments);\n (0, _utils.initChildViews)(this);\n },\n\n\n /**\n Array of child views. You should never edit this array directly.\n @property childViews\n @type Array\n @default []\n @private\n */\n childViews: (0, _emberMetal.descriptor)({\n configurable: false,\n enumerable: false,\n get: function () {\n return (0, _utils.getChildViews)(this);\n }\n }),\n\n appendChild: function (view) {\n this.linkChild(view);\n (0, _utils.addChildView)(this, view);\n },\n linkChild: function (instance) {\n if (!(0, _emberUtils.getOwner)(instance)) {\n (0, _emberUtils.setOwner)(instance, (0, _emberUtils.getOwner)(this));\n }\n }\n });\n});","enifed('ember-views/mixins/class_names_support', ['exports', 'ember-metal', 'ember-debug'], function (exports, _emberMetal, _emberDebug) {\n 'use strict';\n\n /**\n @module ember\n */\n\n var EMPTY_ARRAY = Object.freeze([]);\n\n /**\n @class ClassNamesSupport\n @namespace Ember\n @private\n */\n exports.default = _emberMetal.Mixin.create({\n concatenatedProperties: ['classNames', 'classNameBindings'],\n\n init: function () {\n this._super.apply(this, arguments);\n\n (true && !((0, _emberMetal.descriptorFor)(this, 'classNameBindings') === undefined && Array.isArray(this.classNameBindings)) && (0, _emberDebug.assert)('Only arrays are allowed for \\'classNameBindings\\'', (0, _emberMetal.descriptorFor)(this, 'classNameBindings') === undefined && Array.isArray(this.classNameBindings)));\n (true && !((0, _emberMetal.descriptorFor)(this, 'classNames') === undefined && Array.isArray(this.classNames)) && (0, _emberDebug.assert)('Only arrays of static class strings are allowed for \\'classNames\\'. For dynamic classes, use \\'classNameBindings\\'.', (0, _emberMetal.descriptorFor)(this, 'classNames') === undefined && Array.isArray(this.classNames)));\n },\n\n\n /**\n Standard CSS class names to apply to the view's outer element. This\n property automatically inherits any class names defined by the view's\n superclasses as well.\n @property classNames\n @type Array\n @default ['ember-view']\n @public\n */\n classNames: EMPTY_ARRAY,\n\n /**\n A list of properties of the view to apply as class names. If the property\n is a string value, the value of that string will be applied as a class\n name.\n ```javascript\n // Applies the 'high' class to the view element\n import Component from '@ember/component';\n Component.extend({\n classNameBindings: ['priority'],\n priority: 'high'\n });\n ```\n If the value of the property is a Boolean, the name of that property is\n added as a dasherized class name.\n ```javascript\n // Applies the 'is-urgent' class to the view element\n import Component from '@ember/component';\n Component.extend({\n classNameBindings: ['isUrgent'],\n isUrgent: true\n });\n ```\n If you would prefer to use a custom value instead of the dasherized\n property name, you can pass a binding like this:\n ```javascript\n // Applies the 'urgent' class to the view element\n import Component from '@ember/component';\n Component.extend({\n classNameBindings: ['isUrgent:urgent'],\n isUrgent: true\n });\n ```\n This list of properties is inherited from the component's superclasses as well.\n @property classNameBindings\n @type Array\n @default []\n @public\n */\n classNameBindings: EMPTY_ARRAY\n });\n});","enifed('ember-views/mixins/text_support', ['exports', 'ember-metal', 'ember-runtime'], function (exports, _emberMetal, _emberRuntime) {\n 'use strict';\n\n /**\n @module ember\n */\n\n var KEY_EVENTS = {\n 13: 'insertNewline',\n 27: 'cancel'\n };\n\n /**\n `TextSupport` is a shared mixin used by both `TextField` and\n `TextArea`. `TextSupport` adds a number of methods that allow you to\n specify a controller action to invoke when a certain event is fired on your\n text field or textarea. The specified controller action would get the current\n value of the field passed in as the only argument unless the value of\n the field is empty. In that case, the instance of the field itself is passed\n in as the only argument.\n \n Let's use the pressing of the escape key as an example. If you wanted to\n invoke a controller action when a user presses the escape key while on your\n field, you would use the `escape-press` attribute on your field like so:\n \n ```handlebars\n {{! application.hbs}}\n \n {{input escape-press='alertUser'}}\n ```\n \n ```javascript\n import Application from '@ember/application';\n import Controller from '@ember/controller';\n App = Application.create();\n \n App.ApplicationController = Controller.extend({\n actions: {\n alertUser: function ( currentValue ) {\n alert( 'escape pressed, current value: ' + currentValue );\n }\n }\n });\n ```\n \n The following chart is a visual representation of what takes place when the\n escape key is pressed in this scenario:\n \n ```\n The Template\n +---------------------------+\n | |\n | escape-press='alertUser' |\n | | TextSupport Mixin\n +----+----------------------+ +-------------------------------+\n | | cancel method |\n | escape button pressed | |\n +-------------------------------> | checks for the `escape-press` |\n | attribute and pulls out the |\n +-------------------------------+ | `alertUser` value |\n | action name 'alertUser' +-------------------------------+\n | sent to controller\n v\n Controller\n +------------------------------------------ +\n | |\n | actions: { |\n | alertUser: function( currentValue ){ |\n | alert( 'the esc key was pressed!' ) |\n | } |\n | } |\n | |\n +-------------------------------------------+\n ```\n \n Here are the events that we currently support along with the name of the\n attribute you would need to use on your field. To reiterate, you would use the\n attribute name like so:\n \n ```handlebars\n {{input attribute-name='controllerAction'}}\n ```\n \n ```\n +--------------------+----------------+\n | | |\n | event | attribute name |\n +--------------------+----------------+\n | new line inserted | insert-newline |\n | | |\n | enter key pressed | insert-newline |\n | | |\n | cancel key pressed | escape-press |\n | | |\n | focusin | focus-in |\n | | |\n | focusout | focus-out |\n | | |\n | keypress | key-press |\n | | |\n | keyup | key-up |\n | | |\n | keydown | key-down |\n +--------------------+----------------+\n ```\n \n @class TextSupport\n @namespace Ember\n @uses Ember.TargetActionSupport\n @extends Mixin\n @private\n */\n exports.default = _emberMetal.Mixin.create(_emberRuntime.TargetActionSupport, {\n value: '',\n\n attributeBindings: ['autocapitalize', 'autocorrect', 'autofocus', 'disabled', 'form', 'maxlength', 'minlength', 'placeholder', 'readonly', 'required', 'selectionDirection', 'spellcheck', 'tabindex', 'title'],\n placeholder: null,\n disabled: false,\n maxlength: null,\n\n init: function () {\n this._super.apply(this, arguments);\n this.on('paste', this, this._elementValueDidChange);\n this.on('cut', this, this._elementValueDidChange);\n this.on('input', this, this._elementValueDidChange);\n },\n\n\n /**\n Whether the `keyUp` event that triggers an `action` to be sent continues\n propagating to other views.\n By default, when the user presses the return key on their keyboard and\n the text field has an `action` set, the action will be sent to the view's\n controller and the key event will stop propagating.\n If you would like parent views to receive the `keyUp` event even after an\n action has been dispatched, set `bubbles` to true.\n @property bubbles\n @type Boolean\n @default false\n @private\n */\n bubbles: false,\n\n interpretKeyEvents: function (event) {\n var map = KEY_EVENTS;\n var method = map[event.keyCode];\n\n this._elementValueDidChange();\n if (method) {\n return this[method](event);\n }\n },\n _elementValueDidChange: function () {\n (0, _emberMetal.set)(this, 'value', this.element.value);\n },\n change: function (event) {\n this._elementValueDidChange(event);\n },\n\n\n /**\n Allows you to specify a controller action to invoke when either the `enter`\n key is pressed or, in the case of the field being a textarea, when a newline\n is inserted. To use this method, give your field an `insert-newline`\n attribute. The value of that attribute should be the name of the action\n in your controller that you wish to invoke.\n For an example on how to use the `insert-newline` attribute, please\n reference the example near the top of this file.\n @method insertNewline\n @param {Event} event\n @private\n */\n insertNewline: function (event) {\n sendAction('enter', this, event);\n sendAction('insert-newline', this, event);\n },\n\n\n /**\n Allows you to specify a controller action to invoke when the escape button\n is pressed. To use this method, give your field an `escape-press`\n attribute. The value of that attribute should be the name of the action\n in your controller that you wish to invoke.\n For an example on how to use the `escape-press` attribute, please reference\n the example near the top of this file.\n @method cancel\n @param {Event} event\n @private\n */\n cancel: function (event) {\n sendAction('escape-press', this, event);\n },\n\n\n /**\n Allows you to specify a controller action to invoke when a field receives\n focus. To use this method, give your field a `focus-in` attribute. The value\n of that attribute should be the name of the action in your controller\n that you wish to invoke.\n For an example on how to use the `focus-in` attribute, please reference the\n example near the top of this file.\n @method focusIn\n @param {Event} event\n @private\n */\n focusIn: function (event) {\n sendAction('focus-in', this, event);\n },\n\n\n /**\n Allows you to specify a controller action to invoke when a field loses\n focus. To use this method, give your field a `focus-out` attribute. The value\n of that attribute should be the name of the action in your controller\n that you wish to invoke.\n For an example on how to use the `focus-out` attribute, please reference the\n example near the top of this file.\n @method focusOut\n @param {Event} event\n @private\n */\n focusOut: function (event) {\n this._elementValueDidChange(event);\n sendAction('focus-out', this, event);\n },\n\n\n /**\n Allows you to specify a controller action to invoke when a key is pressed.\n To use this method, give your field a `key-press` attribute. The value of\n that attribute should be the name of the action in your controller you\n that wish to invoke.\n For an example on how to use the `key-press` attribute, please reference the\n example near the top of this file.\n @method keyPress\n @param {Event} event\n @private\n */\n keyPress: function (event) {\n sendAction('key-press', this, event);\n },\n\n\n /**\n Allows you to specify a controller action to invoke when a key-up event is\n fired. To use this method, give your field a `key-up` attribute. The value\n of that attribute should be the name of the action in your controller\n that you wish to invoke.\n For an example on how to use the `key-up` attribute, please reference the\n example near the top of this file.\n @method keyUp\n @param {Event} event\n @private\n */\n keyUp: function (event) {\n this.interpretKeyEvents(event);\n\n this.sendAction('key-up', (0, _emberMetal.get)(this, 'value'), event);\n },\n\n\n /**\n Allows you to specify a controller action to invoke when a key-down event is\n fired. To use this method, give your field a `key-down` attribute. The value\n of that attribute should be the name of the action in your controller that\n you wish to invoke.\n For an example on how to use the `key-down` attribute, please reference the\n example near the top of this file.\n @method keyDown\n @param {Event} event\n @private\n */\n keyDown: function (event) {\n this.sendAction('key-down', (0, _emberMetal.get)(this, 'value'), event);\n }\n });\n\n\n // In principle, this shouldn't be necessary, but the legacy\n // sendAction semantics for TextField are different from\n // the component semantics so this method normalizes them.\n function sendAction(eventName, view, event) {\n var action = (0, _emberMetal.get)(view, 'attrs.' + eventName) || (0, _emberMetal.get)(view, eventName);\n var value = (0, _emberMetal.get)(view, 'value');\n\n view.sendAction(eventName, value);\n\n if (action && !(0, _emberMetal.get)(view, 'bubbles')) {\n event.stopPropagation();\n }\n }\n});","enifed('ember-views/mixins/view_state_support', ['exports', 'ember-metal'], function (exports, _emberMetal) {\n 'use strict';\n\n exports.default = _emberMetal.Mixin.create({\n _transitionTo: function (state) {\n var priorState = this._currentState;\n var currentState = this._currentState = this._states[state];\n this._state = state;\n\n if (priorState && priorState.exit) {\n priorState.exit(this);\n }\n if (currentState.enter) {\n currentState.enter(this);\n }\n }\n });\n});","enifed('ember-views/mixins/view_support', ['exports', 'ember-utils', 'ember-metal', 'ember-debug', 'ember-environment', 'ember-views/system/utils', 'ember-runtime/system/core_object', 'ember-views/system/jquery'], function (exports, _emberUtils, _emberMetal, _emberDebug, _emberEnvironment, _utils, _core_object, _jquery) {\n 'use strict';\n\n var _Mixin$create;\n\n function K() {\n return this;\n }\n\n /**\n @class ViewMixin\n @namespace Ember\n @private\n */\n exports.default = _emberMetal.Mixin.create((_Mixin$create = {\n /**\n A list of properties of the view to apply as attributes. If the property\n is a string value, the value of that string will be applied as the value\n for an attribute of the property's name.\n The following example creates a tag like `<div priority=\"high\" />`.\n ```app/components/my-component.js\n import Component from '@ember/component';\n export default Component.extend({\n attributeBindings: ['priority'],\n priority: 'high'\n });\n ```\n If the value of the property is a Boolean, the attribute is treated as\n an HTML Boolean attribute. It will be present if the property is `true`\n and omitted if the property is `false`.\n The following example creates markup like `<div visible />`.\n ```app/components/my-component.js\n import Component from '@ember/component';\n export default Component.extend({\n attributeBindings: ['visible'],\n visible: true\n });\n ```\n If you would prefer to use a custom value instead of the property name,\n you can create the same markup as the last example with a binding like\n this:\n ```app/components/my-component.js\n import Component from '@ember/component';\n export default Component.extend({\n attributeBindings: ['isVisible:visible'],\n isVisible: true\n });\n ```\n This list of attributes is inherited from the component's superclasses,\n as well.\n @property attributeBindings\n @type Array\n @default []\n @public\n */\n concatenatedProperties: ['attributeBindings']\n\n }, _Mixin$create[_core_object.POST_INIT] = function () {\n if (_emberEnvironment.ENV._ENABLE_DID_INIT_ATTRS_SUPPORT === true) {\n this.trigger('didInitAttrs');\n }\n this.trigger('didReceiveAttrs');\n }, _Mixin$create.nearestOfType = function (klass) {\n var view = this.parentView;\n var isOfType = klass instanceof _emberMetal.Mixin ? function (view) {\n return klass.detect(view);\n } : function (view) {\n return klass.detect(view.constructor);\n };\n\n while (view) {\n if (isOfType(view)) {\n return view;\n }\n view = view.parentView;\n }\n }, _Mixin$create.nearestWithProperty = function (property) {\n var view = this.parentView;\n\n while (view) {\n if (property in view) {\n return view;\n }\n view = view.parentView;\n }\n }, _Mixin$create.rerender = function () {\n return this._currentState.rerender(this);\n }, _Mixin$create.element = (0, _emberMetal.descriptor)({\n configurable: false,\n enumerable: false,\n get: function () {\n return this.renderer.getElement(this);\n }\n }), _Mixin$create.$ = function (sel) {\n (true && !(this.tagName !== '') && (0, _emberDebug.assert)('You cannot access this.$() on a component with `tagName: \\'\\'` specified.', this.tagName !== ''));\n\n if (this.element) {\n return sel ? (0, _jquery.default)(sel, this.element) : (0, _jquery.default)(this.element);\n }\n }, _Mixin$create.appendTo = function (selector) {\n var env = this._environment || _emberEnvironment.environment;\n var target = void 0;\n\n if (env.hasDOM) {\n target = typeof selector === 'string' ? document.querySelector(selector) : selector;\n\n (true && !(target) && (0, _emberDebug.assert)('You tried to append to (' + selector + ') but that isn\\'t in the DOM', target));\n (true && !(!(0, _utils.matches)(target, '.ember-view')) && (0, _emberDebug.assert)('You cannot append to an existing Ember.View.', !(0, _utils.matches)(target, '.ember-view')));\n (true && !(function () {\n var node = target.parentNode;\n while (node) {\n if (node.nodeType !== 9 && (0, _utils.matches)(node, '.ember-view')) {\n return false;\n }\n\n node = node.parentNode;\n }\n\n return true;\n }()) && (0, _emberDebug.assert)('You cannot append to an existing Ember.View.', function () {\n var node = target.parentNode;while (node) {\n if (node.nodeType !== 9 && (0, _utils.matches)(node, '.ember-view')) {\n return false;\n }node = node.parentNode;\n }return true;\n }()));\n } else {\n target = selector;\n\n (true && !(typeof target !== 'string') && (0, _emberDebug.assert)('You tried to append to a selector string (' + selector + ') in an environment without jQuery', typeof target !== 'string'));\n (true && !(typeof selector.appendChild === 'function') && (0, _emberDebug.assert)('You tried to append to a non-Element (' + selector + ') in an environment without jQuery', typeof selector.appendChild === 'function'));\n }\n\n this.renderer.appendTo(this, target);\n\n return this;\n }, _Mixin$create.append = function () {\n return this.appendTo(document.body);\n }, _Mixin$create.elementId = null, _Mixin$create.findElementInParentElement = function (parentElem) {\n var id = '#' + this.elementId;\n return (0, _jquery.default)(id)[0] || (0, _jquery.default)(id, parentElem)[0];\n }, _Mixin$create.willInsertElement = K, _Mixin$create.didInsertElement = K, _Mixin$create.willClearRender = K, _Mixin$create.destroy = function () {\n this._super.apply(this, arguments);\n this._currentState.destroy(this);\n }, _Mixin$create.willDestroyElement = K, _Mixin$create.parentViewDidChange = K, _Mixin$create.tagName = null, _Mixin$create.init = function () {\n this._super.apply(this, arguments);\n\n // tslint:disable-next-line:max-line-length\n (true && !((0, _emberMetal.descriptorFor)(this, 'elementId') === undefined) && (0, _emberDebug.assert)('You cannot use a computed property for the component\\'s `elementId` (' + this + ').', (0, _emberMetal.descriptorFor)(this, 'elementId') === undefined));\n\n // tslint:disable-next-line:max-line-length\n\n (true && !((0, _emberMetal.descriptorFor)(this, 'tagName') === undefined) && (0, _emberDebug.assert)('You cannot use a computed property for the component\\'s `tagName` (' + this + ').', (0, _emberMetal.descriptorFor)(this, 'tagName') === undefined));\n\n\n if (!this.elementId && this.tagName !== '') {\n this.elementId = (0, _emberUtils.guidFor)(this);\n }\n\n if (_emberEnvironment.environment._ENABLE_DID_INIT_ATTRS_SUPPORT) {\n (true && !(typeof this.didInitAttrs !== 'function') && (0, _emberDebug.deprecate)('[DEPRECATED] didInitAttrs called in ' + this.toString() + '.', typeof this.didInitAttrs !== 'function', {\n id: 'ember-views.did-init-attrs',\n until: '3.0.0',\n url: 'https://emberjs.com/deprecations/v2.x#toc_ember-component-didinitattrs'\n }));\n } else {\n (true && !(typeof this.didInitAttrs !== 'function') && (0, _emberDebug.assert)('didInitAttrs called in ' + this.toString() + ' is no longer supported.', typeof this.didInitAttrs !== 'function'));\n }\n\n (true && !(!this.render) && (0, _emberDebug.assert)('Using a custom `.render` function is no longer supported.', !this.render));\n }, _Mixin$create.__defineNonEnumerable = function (property) {\n this[property.name] = property.descriptor.value;\n }, _Mixin$create.handleEvent = function (eventName, evt) {\n return this._currentState.handleEvent(this, eventName, evt);\n }, _Mixin$create));\n});","enifed(\"ember-views/system/action_manager\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.default = ActionManager;\n /**\n @module ember\n */\n\n function ActionManager() {}\n\n /**\n Global action id hash.\n \n @private\n @property registeredActions\n @type Object\n */\n ActionManager.registeredActions = {};\n});","enifed('ember-views/system/event_dispatcher', ['exports', 'ember-utils', 'ember-debug', 'ember-metal', 'ember-runtime', 'ember-views/system/jquery', 'ember-views/system/action_manager', 'ember-views/compat/fallback-view-registry'], function (exports, _emberUtils, _emberDebug, _emberMetal, _emberRuntime, _jquery, _action_manager, _fallbackViewRegistry) {\n 'use strict';\n\n var HAS_JQUERY = _jquery.default !== undefined; /**\n @module ember\n */\n\n var ROOT_ELEMENT_CLASS = 'ember-application';\n var ROOT_ELEMENT_SELECTOR = '.' + ROOT_ELEMENT_CLASS;\n\n /**\n `Ember.EventDispatcher` handles delegating browser events to their\n corresponding `Ember.Views.` For example, when you click on a view,\n `Ember.EventDispatcher` ensures that that view's `mouseDown` method gets\n called.\n \n @class EventDispatcher\n @namespace Ember\n @private\n @extends Ember.Object\n */\n exports.default = _emberRuntime.Object.extend({\n\n /**\n The set of events names (and associated handler function names) to be setup\n and dispatched by the `EventDispatcher`. Modifications to this list can be done\n at setup time, generally via the `Application.customEvents` hash.\n To add new events to be listened to:\n ```javascript\n import Application from '@ember/application';\n let App = Application.create({\n customEvents: {\n paste: 'paste'\n }\n });\n ```\n To prevent default events from being listened to:\n ```javascript\n import Application from '@ember/application';\n let App = Application.create({\n customEvents: {\n mouseenter: null,\n mouseleave: null\n }\n });\n ```\n @property events\n @type Object\n @private\n */\n events: {\n touchstart: 'touchStart',\n touchmove: 'touchMove',\n touchend: 'touchEnd',\n touchcancel: 'touchCancel',\n keydown: 'keyDown',\n keyup: 'keyUp',\n keypress: 'keyPress',\n mousedown: 'mouseDown',\n mouseup: 'mouseUp',\n contextmenu: 'contextMenu',\n click: 'click',\n dblclick: 'doubleClick',\n mousemove: 'mouseMove',\n focusin: 'focusIn',\n focusout: 'focusOut',\n mouseenter: 'mouseEnter',\n mouseleave: 'mouseLeave',\n submit: 'submit',\n input: 'input',\n change: 'change',\n dragstart: 'dragStart',\n drag: 'drag',\n dragenter: 'dragEnter',\n dragleave: 'dragLeave',\n dragover: 'dragOver',\n drop: 'drop',\n dragend: 'dragEnd'\n },\n\n /**\n The root DOM element to which event listeners should be attached. Event\n listeners will be attached to the document unless this is overridden.\n Can be specified as a DOMElement or a selector string.\n The default body is a string since this may be evaluated before document.body\n exists in the DOM.\n @private\n @property rootElement\n @type DOMElement\n @default 'body'\n */\n rootElement: 'body',\n\n init: function () {\n var _this = this;\n\n this._super();\n\n (true && !(function () {\n var owner = (0, _emberUtils.getOwner)(_this);\n var environment = owner.lookup('-environment:main');\n\n return environment.isInteractive;\n }()) && (0, _emberDebug.assert)('EventDispatcher should never be instantiated in fastboot mode. Please report this as an Ember bug.', function () {\n var owner = (0, _emberUtils.getOwner)(_this);var environment = owner.lookup('-environment:main');return environment.isInteractive;\n }()));\n\n\n this._eventHandlers = Object.create(null);\n },\n\n\n /**\n Sets up event listeners for standard browser events.\n This will be called after the browser sends a `DOMContentReady` event. By\n default, it will set up all of the listeners on the document body. If you\n would like to register the listeners on a different element, set the event\n dispatcher's `root` property.\n @private\n @method setup\n @param addedEvents {Object}\n */\n setup: function (addedEvents, _rootElement) {\n var event = void 0,\n rootElement = void 0;\n var events = this._finalEvents = (0, _emberUtils.assign)({}, (0, _emberMetal.get)(this, 'events'), addedEvents);\n\n if (!(0, _emberMetal.isNone)(_rootElement)) {\n (0, _emberMetal.set)(this, 'rootElement', _rootElement);\n }\n\n var rootElementSelector = (0, _emberMetal.get)(this, 'rootElement');\n if (HAS_JQUERY) {\n rootElement = (0, _jquery.default)(rootElementSelector);\n (true && !(!rootElement.is(ROOT_ELEMENT_SELECTOR)) && (0, _emberDebug.assert)('You cannot use the same root element (' + (rootElement.selector || rootElement[0].tagName) + ') multiple times in an Ember.Application', !rootElement.is(ROOT_ELEMENT_SELECTOR)));\n (true && !(!rootElement.closest(ROOT_ELEMENT_SELECTOR).length) && (0, _emberDebug.assert)('You cannot make a new Ember.Application using a root element that is a descendent of an existing Ember.Application', !rootElement.closest(ROOT_ELEMENT_SELECTOR).length));\n (true && !(!rootElement.find(ROOT_ELEMENT_SELECTOR).length) && (0, _emberDebug.assert)('You cannot make a new Ember.Application using a root element that is an ancestor of an existing Ember.Application', !rootElement.find(ROOT_ELEMENT_SELECTOR).length));\n\n\n rootElement.addClass(ROOT_ELEMENT_CLASS);\n\n if (!rootElement.is(ROOT_ELEMENT_SELECTOR)) {\n throw new TypeError('Unable to add \\'' + ROOT_ELEMENT_CLASS + '\\' class to root element (' + (rootElement.selector || rootElement[0].tagName) + '). Make sure you set rootElement to the body or an element in the body.');\n }\n } else {\n if (typeof rootElementSelector !== 'string') {\n rootElement = rootElementSelector;\n } else {\n rootElement = document.querySelector(rootElementSelector);\n }\n\n (true && !(!rootElement.classList.contains(ROOT_ELEMENT_CLASS)) && (0, _emberDebug.assert)('You cannot use the same root element (' + ((0, _emberMetal.get)(this, 'rootElement') || rootElement.tagName) + ') multiple times in an Ember.Application', !rootElement.classList.contains(ROOT_ELEMENT_CLASS)));\n (true && !(function () {\n var target = rootElement.parentNode;\n do {\n if (target.classList.contains(ROOT_ELEMENT_CLASS)) {\n return false;\n }\n\n target = target.parentNode;\n } while (target && target.nodeType === 1);\n\n return true;\n }()) && (0, _emberDebug.assert)('You cannot make a new Ember.Application using a root element that is a descendent of an existing Ember.Application', function () {\n var target = rootElement.parentNode;do {\n if (target.classList.contains(ROOT_ELEMENT_CLASS)) {\n return false;\n }target = target.parentNode;\n } while (target && target.nodeType === 1);return true;\n }()));\n (true && !(!rootElement.querySelector(ROOT_ELEMENT_SELECTOR)) && (0, _emberDebug.assert)('You cannot make a new Ember.Application using a root element that is an ancestor of an existing Ember.Application', !rootElement.querySelector(ROOT_ELEMENT_SELECTOR)));\n\n\n rootElement.classList.add(ROOT_ELEMENT_CLASS);\n\n (true && !(rootElement.classList.contains(ROOT_ELEMENT_CLASS)) && (0, _emberDebug.assert)('Unable to add \\'' + ROOT_ELEMENT_CLASS + '\\' class to root element (' + ((0, _emberMetal.get)(this, 'rootElement') || rootElement.tagName) + '). Make sure you set rootElement to the body or an element in the body.', rootElement.classList.contains(ROOT_ELEMENT_CLASS)));\n }\n\n var viewRegistry = this._getViewRegistry();\n\n for (event in events) {\n if (events.hasOwnProperty(event)) {\n this.setupHandler(rootElement, event, events[event], viewRegistry);\n }\n }\n },\n\n\n /**\n Registers an event listener on the rootElement. If the given event is\n triggered, the provided event handler will be triggered on the target view.\n If the target view does not implement the event handler, or if the handler\n returns `false`, the parent view will be called. The event will continue to\n bubble to each successive parent view until it reaches the top.\n @private\n @method setupHandler\n @param {Element} rootElement\n @param {String} event the browser-originated event to listen to\n @param {String} eventName the name of the method to call on the view\n @param {Object} viewRegistry\n */\n setupHandler: function (rootElement, event, eventName, viewRegistry) {\n if (eventName === null) {\n return;\n }\n\n if (HAS_JQUERY) {\n rootElement.on(event + '.ember', '.ember-view', function (evt) {\n var view = viewRegistry[this.id];\n var result = true;\n\n if (view) {\n result = view.handleEvent(eventName, evt);\n }\n\n return result;\n });\n\n rootElement.on(event + '.ember', '[data-ember-action]', function (evt) {\n var attributes = evt.currentTarget.attributes;\n var handledActions = [];\n\n for (var i = 0; i < attributes.length; i++) {\n var attr = attributes.item(i);\n var attrName = attr.name;\n\n if (attrName.lastIndexOf('data-ember-action-', 0) !== -1) {\n var action = _action_manager.default.registeredActions[attr.value];\n\n // We have to check for action here since in some cases, jQuery will trigger\n // an event on `removeChild` (i.e. focusout) after we've already torn down the\n // action handlers for the view.\n if (action && action.eventName === eventName && handledActions.indexOf(action) === -1) {\n action.handler(evt);\n // Action handlers can mutate state which in turn creates new attributes on the element.\n // This effect could cause the `data-ember-action` attribute to shift down and be invoked twice.\n // To avoid this, we keep track of which actions have been handled.\n handledActions.push(action);\n }\n }\n }\n });\n } else {\n var viewHandler = function (target, event) {\n var view = viewRegistry[target.id];\n var result = true;\n\n if (view) {\n result = view.handleEvent(eventName, event);\n }\n\n return result;\n };\n\n var actionHandler = function (target, event) {\n var actionId = target.getAttribute('data-ember-action');\n var actions = _action_manager.default.registeredActions[actionId];\n\n // In Glimmer2 this attribute is set to an empty string and an additional\n // attribute it set for each action on a given element. In this case, the\n // attributes need to be read so that a proper set of action handlers can\n // be coalesced.\n if (actionId === '') {\n var attributes = target.attributes;\n var attributeCount = attributes.length;\n\n actions = [];\n\n for (var i = 0; i < attributeCount; i++) {\n var attr = attributes.item(i);\n var attrName = attr.name;\n\n if (attrName.indexOf('data-ember-action-') === 0) {\n actions = actions.concat(_action_manager.default.registeredActions[attr.value]);\n }\n }\n }\n\n // We have to check for actions here since in some cases, jQuery will trigger\n // an event on `removeChild` (i.e. focusout) after we've already torn down the\n // action handlers for the view.\n if (!actions) {\n return;\n }\n\n for (var index = 0; index < actions.length; index++) {\n var action = actions[index];\n\n if (action && action.eventName === eventName) {\n return action.handler(event);\n }\n }\n };\n\n var handleEvent = this._eventHandlers[event] = function (event) {\n var target = event.target;\n\n do {\n if (viewRegistry[target.id]) {\n if (viewHandler(target, event) === false) {\n event.preventDefault();\n event.stopPropagation();\n break;\n }\n } else if (target.hasAttribute('data-ember-action')) {\n actionHandler(target, event);\n break;\n }\n\n target = target.parentNode;\n } while (target && target.nodeType === 1);\n };\n\n rootElement.addEventListener(event, handleEvent);\n }\n },\n _getViewRegistry: function () {\n var owner = (0, _emberUtils.getOwner)(this);\n var viewRegistry = owner && owner.lookup('-view-registry:main') || _fallbackViewRegistry.default;\n\n return viewRegistry;\n },\n destroy: function () {\n var rootElementSelector = (0, _emberMetal.get)(this, 'rootElement');\n var rootElement = void 0;\n if (rootElementSelector.nodeType) {\n rootElement = rootElementSelector;\n } else {\n rootElement = document.querySelector(rootElementSelector);\n }\n\n if (!rootElement) {\n return;\n }\n\n if (HAS_JQUERY) {\n (0, _jquery.default)(rootElementSelector).off('.ember', '**');\n } else {\n for (var event in this._eventHandlers) {\n rootElement.removeEventListener(event, this._eventHandlers[event]);\n }\n }\n\n rootElement.classList.remove(ROOT_ELEMENT_CLASS);\n\n return this._super.apply(this, arguments);\n },\n toString: function () {\n return '(EventDispatcher)';\n }\n });\n});","enifed('ember-views/system/ext', ['ember-metal'], function (_emberMetal) {\n 'use strict';\n\n // Add a new named queue for rendering views that happens\n // after bindings have synced, and a queue for scheduling actions\n // that should occur after view rendering.\n _emberMetal.run._addQueue('render', 'actions');\n _emberMetal.run._addQueue('afterRender', 'render');\n});","enifed('ember-views/system/jquery', ['exports', 'ember-environment'], function (exports, _emberEnvironment) {\n 'use strict';\n\n var jQuery = void 0;\n\n if (_emberEnvironment.environment.hasDOM) {\n jQuery = _emberEnvironment.context.imports.jQuery;\n\n if (jQuery) {\n if (jQuery.event.addProp) {\n jQuery.event.addProp('dataTransfer');\n } else {\n // http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#dndevents\n ['dragstart', 'drag', 'dragenter', 'dragleave', 'dragover', 'drop', 'dragend'].forEach(function (eventName) {\n jQuery.event.fixHooks[eventName] = {\n props: ['dataTransfer']\n };\n });\n }\n }\n }\n\n exports.default = jQuery;\n});","enifed('ember-views/system/lookup_partial', ['exports', 'ember-debug'], function (exports, _emberDebug) {\n 'use strict';\n\n exports.default = lookupPartial;\n exports.hasPartial = hasPartial;\n\n\n function parseUnderscoredName(templateName) {\n var nameParts = templateName.split('/');\n var lastPart = nameParts[nameParts.length - 1];\n\n nameParts[nameParts.length - 1] = '_' + lastPart;\n\n return nameParts.join('/');\n }\n\n function lookupPartial(templateName, owner) {\n if (templateName == null) {\n return;\n }\n\n var template = templateFor(owner, parseUnderscoredName(templateName), templateName);\n\n (true && !(!!template) && (0, _emberDebug.assert)('Unable to find partial with name \"' + templateName + '\"', !!template));\n\n\n return template;\n }\n\n function hasPartial(name, owner) {\n if (!owner) {\n throw new _emberDebug.Error('Container was not found when looking up a views template. ' + 'This is most likely due to manually instantiating an Ember.View. ' + 'See: http://git.io/EKPpnA');\n }\n\n return owner.hasRegistration('template:' + parseUnderscoredName(name)) || owner.hasRegistration('template:' + name);\n }\n\n function templateFor(owner, underscored, name) {\n if (!name) {\n return;\n }\n (true && !(name.indexOf('.') === -1) && (0, _emberDebug.assert)('templateNames are not allowed to contain periods: ' + name, name.indexOf('.') === -1));\n\n\n if (!owner) {\n throw new _emberDebug.Error('Container was not found when looking up a views template. ' + 'This is most likely due to manually instantiating an Ember.View. ' + 'See: http://git.io/EKPpnA');\n }\n\n return owner.lookup('template:' + underscored) || owner.lookup('template:' + name);\n }\n});","enifed('ember-views/system/utils', ['exports', 'ember-utils'], function (exports, _emberUtils) {\n 'use strict';\n\n exports.elMatches = undefined;\n exports.isSimpleClick = isSimpleClick;\n exports.constructStyleDeprecationMessage = constructStyleDeprecationMessage;\n exports.getRootViews = getRootViews;\n exports.getViewId = getViewId;\n exports.getViewElement = getViewElement;\n exports.initViewElement = initViewElement;\n exports.setViewElement = setViewElement;\n exports.getChildViews = getChildViews;\n exports.initChildViews = initChildViews;\n exports.addChildView = addChildView;\n exports.collectChildViews = collectChildViews;\n exports.getViewBounds = getViewBounds;\n exports.getViewRange = getViewRange;\n exports.getViewClientRects = getViewClientRects;\n exports.getViewBoundingClientRect = getViewBoundingClientRect;\n exports.matches = matches;\n\n\n /**\n @module ember\n */\n\n function isSimpleClick(event) {\n var modifier = event.shiftKey || event.metaKey || event.altKey || event.ctrlKey;\n var secondaryClick = event.which > 1; // IE9 may return undefined\n\n return !modifier && !secondaryClick;\n } /* globals Element */\n function constructStyleDeprecationMessage(affectedStyle) {\n return '' + 'Binding style attributes may introduce cross-site scripting vulnerabilities; ' + 'please ensure that values being bound are properly escaped. For more information, ' + 'including how to disable this warning, see ' + 'https://emberjs.com/deprecations/v1.x/#toc_binding-style-attributes. ' + 'Style affected: \"' + affectedStyle + '\"';\n }\n\n /**\n @private\n @method getRootViews\n @param {Object} owner\n */\n function getRootViews(owner) {\n var registry = owner.lookup('-view-registry:main');\n\n var rootViews = [];\n\n Object.keys(registry).forEach(function (id) {\n var view = registry[id];\n\n if (view.parentView === null) {\n rootViews.push(view);\n }\n });\n\n return rootViews;\n }\n\n /**\n @private\n @method getViewId\n @param {Ember.View} view\n */\n function getViewId(view) {\n if (view.tagName === '') {\n return (0, _emberUtils.guidFor)(view);\n } else {\n return view.elementId || (0, _emberUtils.guidFor)(view);\n }\n }\n\n var VIEW_ELEMENT = (0, _emberUtils.symbol)('VIEW_ELEMENT');\n\n /**\n @private\n @method getViewElement\n @param {Ember.View} view\n */\n function getViewElement(view) {\n return view[VIEW_ELEMENT];\n }\n\n function initViewElement(view) {\n view[VIEW_ELEMENT] = null;\n }\n\n function setViewElement(view, element) {\n return view[VIEW_ELEMENT] = element;\n }\n\n var CHILD_VIEW_IDS = (0, _emberUtils.symbol)('CHILD_VIEW_IDS');\n\n /**\n @private\n @method getChildViews\n @param {Ember.View} view\n */\n function getChildViews(view) {\n var owner = (0, _emberUtils.getOwner)(view);\n var registry = owner.lookup('-view-registry:main');\n return collectChildViews(view, registry);\n }\n\n function initChildViews(view) {\n view[CHILD_VIEW_IDS] = [];\n }\n\n function addChildView(parent, child) {\n parent[CHILD_VIEW_IDS].push(getViewId(child));\n }\n\n function collectChildViews(view, registry) {\n var ids = [];\n var views = [];\n\n view[CHILD_VIEW_IDS].forEach(function (id) {\n var view = registry[id];\n\n if (view && !view.isDestroying && !view.isDestroyed && ids.indexOf(id) === -1) {\n ids.push(id);\n views.push(view);\n }\n });\n\n view[CHILD_VIEW_IDS] = ids;\n\n return views;\n }\n\n /**\n @private\n @method getViewBounds\n @param {Ember.View} view\n */\n function getViewBounds(view) {\n return view.renderer.getBounds(view);\n }\n\n /**\n @private\n @method getViewRange\n @param {Ember.View} view\n */\n function getViewRange(view) {\n var bounds = getViewBounds(view);\n\n var range = document.createRange();\n range.setStartBefore(bounds.firstNode);\n range.setEndAfter(bounds.lastNode);\n\n return range;\n }\n\n /**\n `getViewClientRects` provides information about the position of the border\n box edges of a view relative to the viewport.\n \n It is only intended to be used by development tools like the Ember Inspector\n and may not work on older browsers.\n \n @private\n @method getViewClientRects\n @param {Ember.View} view\n */\n function getViewClientRects(view) {\n var range = getViewRange(view);\n return range.getClientRects();\n }\n\n /**\n `getViewBoundingClientRect` provides information about the position of the\n bounding border box edges of a view relative to the viewport.\n \n It is only intended to be used by development tools like the Ember Inspector\n and may not work on older browsers.\n \n @private\n @method getViewBoundingClientRect\n @param {Ember.View} view\n */\n function getViewBoundingClientRect(view) {\n var range = getViewRange(view);\n return range.getBoundingClientRect();\n }\n\n /**\n Determines if the element matches the specified selector.\n \n @private\n @method matches\n @param {DOMElement} el\n @param {String} selector\n */\n var elMatches = exports.elMatches = typeof Element !== 'undefined' && (Element.prototype.matches || Element.prototype.matchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.webkitMatchesSelector);\n\n function matches(el, selector) {\n return elMatches.call(el, selector);\n }\n});","enifed('ember-views/utils/lookup-component', ['exports', 'ember-babel', 'container', 'ember/features'], function (exports, _emberBabel, _container, _features) {\n 'use strict';\n\n exports.default = lookupComponent;\n\n var _templateObject = (0, _emberBabel.taggedTemplateLiteralLoose)(['component:-default'], ['component:-default']);\n\n function lookupModuleUnificationComponentPair(componentLookup, owner, name, options) {\n var localComponent = componentLookup.componentFor(name, owner, options);\n var localLayout = componentLookup.layoutFor(name, owner, options);\n\n var globalComponent = componentLookup.componentFor(name, owner);\n var globalLayout = componentLookup.layoutFor(name, owner);\n\n var localAndUniqueComponent = !!localComponent && (!globalComponent || localComponent.class !== globalComponent.class);\n var localAndUniqueLayout = !!localLayout && (!globalLayout || localLayout.meta.moduleName !== globalLayout.meta.moduleName);\n\n if (localAndUniqueComponent && localAndUniqueLayout) {\n return { layout: localLayout, component: localComponent };\n }\n\n if (localAndUniqueComponent && !localAndUniqueLayout) {\n return { layout: null, component: localComponent };\n }\n\n var defaultComponentFactory = null;\n\n if (!_features.EMBER_GLIMMER_TEMPLATE_ONLY_COMPONENTS) {\n defaultComponentFactory = owner.factoryFor((0, _container.privatize)(_templateObject));\n }\n\n if (!localAndUniqueComponent && localAndUniqueLayout) {\n return { layout: localLayout, component: defaultComponentFactory };\n }\n\n var component = globalComponent || globalLayout && defaultComponentFactory;\n return { layout: globalLayout, component: component };\n }\n\n function lookupComponentPair(componentLookup, owner, name, options) {\n if (_features.EMBER_MODULE_UNIFICATION) {\n return lookupModuleUnificationComponentPair(componentLookup, owner, name, options);\n }\n\n var component = componentLookup.componentFor(name, owner, options);\n var layout = componentLookup.layoutFor(name, owner, options);\n\n var result = { layout: layout, component: component };\n\n if (!_features.EMBER_GLIMMER_TEMPLATE_ONLY_COMPONENTS && layout && !component) {\n result.component = owner.factoryFor((0, _container.privatize)(_templateObject));\n }\n\n return result;\n }\n\n function lookupComponent(owner, name, options) {\n var componentLookup = owner.lookup('component-lookup:main');\n\n var source = options && options.source;\n\n if (source) {\n var localResult = lookupComponentPair(componentLookup, owner, name, options);\n\n if (localResult.component || localResult.layout) {\n return localResult;\n }\n }\n\n return lookupComponentPair(componentLookup, owner, name);\n }\n});","enifed('ember-views/views/core_view', ['exports', 'ember-runtime', 'ember-views/system/utils', 'ember-views/views/states'], function (exports, _emberRuntime, _utils, _states) {\n 'use strict';\n\n /**\n `Ember.CoreView` is an abstract class that exists to give view-like behavior\n to both Ember's main view class `Component` and other classes that don't need\n the full functionality of `Component`.\n \n Unless you have specific needs for `CoreView`, you will use `Component`\n in your applications.\n \n @class CoreView\n @namespace Ember\n @extends EmberObject\n @deprecated Use `Component` instead.\n @uses Evented\n @uses Ember.ActionHandler\n @private\n */\n var CoreView = _emberRuntime.FrameworkObject.extend(_emberRuntime.Evented, _emberRuntime.ActionHandler, {\n isView: true,\n\n _states: (0, _states.cloneStates)(_states.states),\n\n init: function () {\n this._super.apply(this, arguments);\n this._state = 'preRender';\n this._currentState = this._states.preRender;\n\n (0, _utils.initViewElement)(this);\n\n if (!this.renderer) {\n throw new Error('Cannot instantiate a component without a renderer. Please ensure that you are creating ' + this + ' with a proper container/registry.');\n }\n },\n\n\n /**\n If the view is currently inserted into the DOM of a parent view, this\n property will point to the parent of the view.\n @property parentView\n @type Ember.View\n @default null\n @private\n */\n parentView: null,\n\n instrumentDetails: function (hash) {\n hash.object = this.toString();\n hash.containerKey = this._debugContainerKey;\n hash.view = this;\n return hash;\n },\n trigger: function (name) {\n for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n this._super.apply(this, arguments);\n var method = this[name];\n if (typeof method === 'function') {\n return method.apply(this, args);\n }\n },\n has: function (name) {\n return typeof this[name] === 'function' || this._super(name);\n }\n });\n\n CoreView.reopenClass({\n isViewFactory: true\n });\n\n exports.default = CoreView;\n});","enifed('ember-views/views/states', ['exports', 'ember-utils', 'ember-views/views/states/default', 'ember-views/views/states/pre_render', 'ember-views/views/states/has_element', 'ember-views/views/states/in_dom', 'ember-views/views/states/destroying'], function (exports, _emberUtils, _default2, _pre_render, _has_element, _in_dom, _destroying) {\n 'use strict';\n\n exports.states = undefined;\n exports.cloneStates = cloneStates;\n function cloneStates(from) {\n var into = {};\n\n into._default = {};\n into.preRender = Object.create(into._default);\n into.destroying = Object.create(into._default);\n into.hasElement = Object.create(into._default);\n into.inDOM = Object.create(into.hasElement);\n\n for (var stateName in from) {\n if (!from.hasOwnProperty(stateName)) {\n continue;\n }\n (0, _emberUtils.assign)(into[stateName], from[stateName]);\n }\n\n return into;\n }\n\n /*\n Describe how the specified actions should behave in the various\n states that a view can exist in. Possible states:\n \n * preRender: when a view is first instantiated, and after its\n element was destroyed, it is in the preRender state\n * hasElement: the DOM representation of the view is created,\n and is ready to be inserted\n * inDOM: once a view has been inserted into the DOM it is in\n the inDOM state. A view spends the vast majority of its\n existence in this state.\n * destroyed: once a view has been destroyed (using the destroy\n method), it is in this state. No further actions can be invoked\n on a destroyed view.\n */\n var states = exports.states = {\n _default: _default2.default,\n preRender: _pre_render.default,\n inDOM: _in_dom.default,\n hasElement: _has_element.default,\n destroying: _destroying.default\n };\n});","enifed('ember-views/views/states/default', ['exports', 'ember-debug'], function (exports, _emberDebug) {\n 'use strict';\n\n exports.default = {\n // appendChild is only legal while rendering the buffer.\n appendChild: function () {\n throw new _emberDebug.EmberError('You can\\'t use appendChild outside of the rendering process');\n },\n\n\n // Handle events from `Ember.EventDispatcher`\n handleEvent: function () {\n return true; // continue event propagation\n },\n rerender: function () {},\n destroy: function () {}\n };\n});","enifed('ember-views/views/states/destroying', ['exports', 'ember-utils', 'ember-debug', 'ember-views/views/states/default'], function (exports, _emberUtils, _emberDebug, _default2) {\n 'use strict';\n\n var destroying = Object.create(_default2.default);\n\n (0, _emberUtils.assign)(destroying, {\n appendChild: function () {\n throw new _emberDebug.Error('You can\\'t call appendChild on a view being destroyed');\n },\n rerender: function () {\n throw new _emberDebug.Error('You can\\'t call rerender on a view being destroyed');\n }\n });\n\n exports.default = destroying;\n});","enifed('ember-views/views/states/has_element', ['exports', 'ember-utils', 'ember-views/views/states/default', 'ember-metal'], function (exports, _emberUtils, _default2, _emberMetal) {\n 'use strict';\n\n var hasElement = Object.create(_default2.default);\n\n (0, _emberUtils.assign)(hasElement, {\n rerender: function (view) {\n view.renderer.rerender(view);\n },\n destroy: function (view) {\n view.renderer.remove(view);\n },\n handleEvent: function (view, eventName, event) {\n if (view.has(eventName)) {\n // Handler should be able to re-dispatch events, so we don't\n // preventDefault or stopPropagation.\n return (0, _emberMetal.flaggedInstrument)('interaction.' + eventName, { event: event, view: view }, function () {\n return _emberMetal.run.join(view, view.trigger, eventName, event);\n });\n } else {\n return true; // continue event propagation\n }\n }\n });\n\n exports.default = hasElement;\n});","enifed('ember-views/views/states/in_dom', ['exports', 'ember-utils', 'ember-metal', 'ember-debug', 'ember-views/views/states/has_element'], function (exports, _emberUtils, _emberMetal, _emberDebug, _has_element) {\n 'use strict';\n\n var inDOM = Object.create(_has_element.default);\n\n (0, _emberUtils.assign)(inDOM, {\n enter: function (view) {\n // Register the view for event handling. This hash is used by\n // Ember.EventDispatcher to dispatch incoming events.\n view.renderer.register(view);\n\n if (true) {\n (0, _emberMetal._addBeforeObserver)(view, 'elementId', function () {\n throw new _emberDebug.Error('Changing a view\\'s elementId after creation is not allowed');\n });\n }\n },\n exit: function (view) {\n view.renderer.unregister(view);\n }\n });\n\n exports.default = inDOM;\n});","enifed('ember-views/views/states/pre_render', ['exports', 'ember-views/views/states/default'], function (exports, _default2) {\n 'use strict';\n\n exports.default = Object.create(_default2.default);\n});","enifed('ember/features', ['exports', 'ember-environment', 'ember-utils'], function (exports, _emberEnvironment, _emberUtils) {\n 'use strict';\n\n exports.EMBER_GLIMMER_DETECT_BACKTRACKING_RERENDER = exports.MANDATORY_SETTER = exports.DESCRIPTOR_TRAP = exports.GLIMMER_CUSTOM_COMPONENT_MANAGER = exports.EMBER_MODULE_UNIFICATION = exports.EMBER_ENGINES_MOUNT_PARAMS = exports.EMBER_ROUTING_ROUTER_SERVICE = exports.EMBER_METAL_ES5_GETTERS = exports.EMBER_GLIMMER_TEMPLATE_ONLY_COMPONENTS = exports.EMBER_GLIMMER_REMOVE_APPLICATION_TEMPLATE_WRAPPER = exports.EMBER_GLIMMER_NAMED_ARGUMENTS = exports.EMBER_IMPROVED_INSTRUMENTATION = exports.EMBER_LIBRARIES_ISREGISTERED = exports.FEATURES_STRIPPED_TEST = exports.FEATURES = exports.DEFAULT_FEATURES = undefined;\n var DEFAULT_FEATURES = exports.DEFAULT_FEATURES = { \"features-stripped-test\": false, \"ember-libraries-isregistered\": false, \"ember-improved-instrumentation\": false, \"ember-glimmer-named-arguments\": false, \"ember-glimmer-remove-application-template-wrapper\": false, \"ember-glimmer-template-only-components\": false, \"ember-metal-es5-getters\": false, \"ember-routing-router-service\": true, \"ember-engines-mount-params\": true, \"ember-module-unification\": false, \"glimmer-custom-component-manager\": false, \"descriptor-trap\": true, \"mandatory-setter\": true, \"ember-glimmer-detect-backtracking-rerender\": true };\n var FEATURES = exports.FEATURES = (0, _emberUtils.assign)(DEFAULT_FEATURES, _emberEnvironment.ENV.FEATURES);\n\n var FEATURES_STRIPPED_TEST = exports.FEATURES_STRIPPED_TEST = FEATURES[\"features-stripped-test\"];\n var EMBER_LIBRARIES_ISREGISTERED = exports.EMBER_LIBRARIES_ISREGISTERED = FEATURES[\"ember-libraries-isregistered\"];\n var EMBER_IMPROVED_INSTRUMENTATION = exports.EMBER_IMPROVED_INSTRUMENTATION = FEATURES[\"ember-improved-instrumentation\"];\n var EMBER_GLIMMER_NAMED_ARGUMENTS = exports.EMBER_GLIMMER_NAMED_ARGUMENTS = FEATURES[\"ember-glimmer-named-arguments\"];\n var EMBER_GLIMMER_REMOVE_APPLICATION_TEMPLATE_WRAPPER = exports.EMBER_GLIMMER_REMOVE_APPLICATION_TEMPLATE_WRAPPER = FEATURES[\"ember-glimmer-remove-application-template-wrapper\"];\n var EMBER_GLIMMER_TEMPLATE_ONLY_COMPONENTS = exports.EMBER_GLIMMER_TEMPLATE_ONLY_COMPONENTS = FEATURES[\"ember-glimmer-template-only-components\"];\n var EMBER_METAL_ES5_GETTERS = exports.EMBER_METAL_ES5_GETTERS = FEATURES[\"ember-metal-es5-getters\"];\n var EMBER_ROUTING_ROUTER_SERVICE = exports.EMBER_ROUTING_ROUTER_SERVICE = FEATURES[\"ember-routing-router-service\"];\n var EMBER_ENGINES_MOUNT_PARAMS = exports.EMBER_ENGINES_MOUNT_PARAMS = FEATURES[\"ember-engines-mount-params\"];\n var EMBER_MODULE_UNIFICATION = exports.EMBER_MODULE_UNIFICATION = FEATURES[\"ember-module-unification\"];\n var GLIMMER_CUSTOM_COMPONENT_MANAGER = exports.GLIMMER_CUSTOM_COMPONENT_MANAGER = FEATURES[\"glimmer-custom-component-manager\"];\n var DESCRIPTOR_TRAP = exports.DESCRIPTOR_TRAP = FEATURES[\"descriptor-trap\"];\n var MANDATORY_SETTER = exports.MANDATORY_SETTER = FEATURES[\"mandatory-setter\"];\n var EMBER_GLIMMER_DETECT_BACKTRACKING_RERENDER = exports.EMBER_GLIMMER_DETECT_BACKTRACKING_RERENDER = FEATURES[\"ember-glimmer-detect-backtracking-rerender\"];\n});","enifed('ember/index', ['exports', 'require', 'ember-environment', 'node-module', 'ember-utils', 'container', 'ember-metal', 'ember/features', 'ember-debug', 'backburner', 'ember-console', 'ember-runtime', 'ember-glimmer', 'ember/version', 'ember-views', 'ember-routing', 'ember-application', 'ember-extension-support'], function (exports, _require2, _emberEnvironment, _nodeModule, _emberUtils, _container, _emberMetal, _features, _emberDebug, _backburner, _emberConsole, _emberRuntime, _emberGlimmer, _version, _emberViews, _emberRouting, _emberApplication, _emberExtensionSupport) {\n 'use strict';\n\n exports.VERSION = undefined;\n\n\n // ember-utils exports\n\n\n // ****ember-metal****\n\n\n // ****ember-environment****\n _emberMetal.default.getOwner = _emberUtils.getOwner;\n _emberMetal.default.setOwner = _emberUtils.setOwner;\n _emberMetal.default.generateGuid = _emberUtils.generateGuid;\n _emberMetal.default.GUID_KEY = _emberUtils.GUID_KEY;\n _emberMetal.default.guidFor = _emberUtils.guidFor;\n _emberMetal.default.inspect = _emberUtils.inspect;\n _emberMetal.default.makeArray = _emberUtils.makeArray;\n _emberMetal.default.canInvoke = _emberUtils.canInvoke;\n _emberMetal.default.tryInvoke = _emberUtils.tryInvoke;\n _emberMetal.default.wrap = _emberUtils.wrap;\n _emberMetal.default.applyStr = _emberUtils.applyStr;\n _emberMetal.default.uuid = _emberUtils.uuid;\n _emberMetal.default.assign = _emberUtils.assign;\n\n // container exports\n _emberMetal.default.Container = _container.Container;\n _emberMetal.default.Registry = _container.Registry;\n\n // need to import this directly, to ensure the babel feature\n // flag plugin works properly\n\n\n var computed = _emberMetal.computed;\n computed.alias = _emberMetal.alias;\n _emberMetal.default.computed = computed;\n _emberMetal.default.ComputedProperty = _emberMetal.ComputedProperty;\n _emberMetal.default.cacheFor = _emberMetal.cacheFor;\n\n _emberMetal.default.assert = _emberDebug.assert;\n _emberMetal.default.warn = _emberDebug.warn;\n _emberMetal.default.debug = _emberDebug.debug;\n _emberMetal.default.deprecate = _emberDebug.deprecate;\n _emberMetal.default.deprecateFunc = _emberDebug.deprecateFunc;\n _emberMetal.default.runInDebug = _emberDebug.runInDebug;\n /**\n @public\n @class Ember.Debug\n */\n _emberMetal.default.Debug = {\n registerDeprecationHandler: _emberDebug.registerDeprecationHandler,\n registerWarnHandler: _emberDebug.registerWarnHandler\n };\n _emberMetal.default.merge = _emberMetal.merge;\n\n _emberMetal.default.instrument = _emberMetal.instrument;\n _emberMetal.default.subscribe = _emberMetal.instrumentationSubscribe;\n _emberMetal.default.Instrumentation = {\n instrument: _emberMetal.instrument,\n subscribe: _emberMetal.instrumentationSubscribe,\n unsubscribe: _emberMetal.instrumentationUnsubscribe,\n reset: _emberMetal.instrumentationReset\n };\n\n _emberMetal.default.Error = _emberDebug.Error;\n _emberMetal.default.meta = _emberMetal.meta;\n _emberMetal.default.get = _emberMetal.get;\n _emberMetal.default.getWithDefault = _emberMetal.getWithDefault;\n _emberMetal.default._getPath = _emberMetal._getPath;\n _emberMetal.default.set = _emberMetal.set;\n _emberMetal.default.trySet = _emberMetal.trySet;\n _emberMetal.default.FEATURES = _features.FEATURES;\n _emberMetal.default.FEATURES.isEnabled = _emberDebug.isFeatureEnabled;\n _emberMetal.default._Cache = _emberMetal.Cache;\n _emberMetal.default.on = _emberMetal.on;\n _emberMetal.default.addListener = _emberMetal.addListener;\n _emberMetal.default.removeListener = _emberMetal.removeListener;\n _emberMetal.default.sendEvent = _emberMetal.sendEvent;\n _emberMetal.default.hasListeners = _emberMetal.hasListeners;\n _emberMetal.default.isNone = _emberMetal.isNone;\n _emberMetal.default.isEmpty = _emberMetal.isEmpty;\n _emberMetal.default.isBlank = _emberMetal.isBlank;\n _emberMetal.default.isPresent = _emberMetal.isPresent;\n _emberMetal.default.run = _emberMetal.run;\n _emberMetal.default._ObserverSet = _emberMetal.ObserverSet;\n _emberMetal.default.propertyWillChange = _emberMetal.propertyWillChange;\n _emberMetal.default.propertyDidChange = _emberMetal.propertyDidChange;\n _emberMetal.default.overrideChains = _emberMetal.overrideChains;\n _emberMetal.default.beginPropertyChanges = _emberMetal.beginPropertyChanges;\n _emberMetal.default.endPropertyChanges = _emberMetal.endPropertyChanges;\n _emberMetal.default.changeProperties = _emberMetal.changeProperties;\n _emberMetal.default.platform = {\n defineProperty: true,\n hasPropertyAccessors: true\n };\n _emberMetal.default.defineProperty = _emberMetal.defineProperty;\n _emberMetal.default.watchKey = _emberMetal.watchKey;\n _emberMetal.default.unwatchKey = _emberMetal.unwatchKey;\n _emberMetal.default.removeChainWatcher = _emberMetal.removeChainWatcher;\n _emberMetal.default._ChainNode = _emberMetal.ChainNode;\n _emberMetal.default.finishChains = _emberMetal.finishChains;\n _emberMetal.default.watchPath = _emberMetal.watchPath;\n _emberMetal.default.unwatchPath = _emberMetal.unwatchPath;\n _emberMetal.default.watch = _emberMetal.watch;\n _emberMetal.default.isWatching = _emberMetal.isWatching;\n _emberMetal.default.unwatch = _emberMetal.unwatch;\n _emberMetal.default.destroy = _emberMetal.deleteMeta;\n _emberMetal.default.libraries = _emberMetal.libraries;\n _emberMetal.default.OrderedSet = _emberMetal.OrderedSet;\n _emberMetal.default.Map = _emberMetal.Map;\n _emberMetal.default.MapWithDefault = _emberMetal.MapWithDefault;\n _emberMetal.default.getProperties = _emberMetal.getProperties;\n _emberMetal.default.setProperties = _emberMetal.setProperties;\n _emberMetal.default.expandProperties = _emberMetal.expandProperties;\n _emberMetal.default.NAME_KEY = _emberUtils.NAME_KEY;\n _emberMetal.default.addObserver = _emberMetal.addObserver;\n _emberMetal.default.removeObserver = _emberMetal.removeObserver;\n if (_emberEnvironment.ENV._ENABLE_PROPERTY_REQUIRED_SUPPORT) {\n _emberMetal.default.required = _emberMetal.required;\n }\n _emberMetal.default.aliasMethod = _emberMetal.aliasMethod;\n _emberMetal.default.observer = _emberMetal.observer;\n _emberMetal.default.mixin = _emberMetal.mixin;\n _emberMetal.default.Mixin = _emberMetal.Mixin;\n _emberMetal.default.bind = _emberMetal.bind;\n _emberMetal.default.Binding = _emberMetal.Binding;\n\n Object.defineProperty(_emberMetal.default, 'ENV', {\n get: function () {\n return _emberEnvironment.ENV;\n },\n\n enumerable: false\n });\n\n /**\n The context that Ember searches for namespace instances on.\n \n @private\n */\n Object.defineProperty(_emberMetal.default, 'lookup', {\n get: function () {\n return _emberEnvironment.context.lookup;\n },\n set: function (value) {\n _emberEnvironment.context.lookup = value;\n },\n\n enumerable: false\n });\n\n _emberMetal.default.EXTEND_PROTOTYPES = _emberEnvironment.ENV.EXTEND_PROTOTYPES;\n\n // BACKWARDS COMPAT ACCESSORS FOR ENV FLAGS\n Object.defineProperty(_emberMetal.default, 'LOG_STACKTRACE_ON_DEPRECATION', {\n get: function () {\n return _emberEnvironment.ENV.LOG_STACKTRACE_ON_DEPRECATION;\n },\n set: function (value) {\n _emberEnvironment.ENV.LOG_STACKTRACE_ON_DEPRECATION = !!value;\n },\n\n enumerable: false\n });\n\n Object.defineProperty(_emberMetal.default, 'LOG_VERSION', {\n get: function () {\n return _emberEnvironment.ENV.LOG_VERSION;\n },\n set: function (value) {\n _emberEnvironment.ENV.LOG_VERSION = !!value;\n },\n\n enumerable: false\n });\n\n if (true) {\n Object.defineProperty(_emberMetal.default, 'MODEL_FACTORY_INJECTIONS', {\n get: function () {\n return false;\n },\n set: function () {\n (true && !(false) && (0, _emberDebug.deprecate)('Ember.MODEL_FACTORY_INJECTIONS is no longer required', false, {\n id: 'ember-metal.model_factory_injections',\n until: '2.17.0',\n url: 'https://emberjs.com/deprecations/v2.x/#toc_id-ember-metal-model_factory_injections'\n }));\n },\n\n enumerable: false\n });\n }\n\n Object.defineProperty(_emberMetal.default, 'LOG_BINDINGS', {\n get: function () {\n return _emberEnvironment.ENV.LOG_BINDINGS;\n },\n set: function (value) {\n _emberEnvironment.ENV.LOG_BINDINGS = !!value;\n },\n\n enumerable: false\n });\n\n /**\n A function may be assigned to `Ember.onerror` to be called when Ember\n internals encounter an error. This is useful for specialized error handling\n and reporting code.\n \n ```javascript\n import $ from 'jquery';\n \n Ember.onerror = function(error) {\n $.ajax('/report-error', 'POST', {\n stack: error.stack,\n otherInformation: 'whatever app state you want to provide'\n });\n };\n ```\n \n Internally, `Ember.onerror` is used as Backburner's error handler.\n \n @event onerror\n @for Ember\n @param {Exception} error the error object\n @public\n */\n Object.defineProperty(_emberMetal.default, 'onerror', {\n get: _emberMetal.getOnerror,\n set: _emberMetal.setOnerror,\n enumerable: false\n });\n\n Object.defineProperty(_emberMetal.default, 'testing', {\n get: _emberDebug.isTesting,\n set: _emberDebug.setTesting,\n enumerable: false\n });\n\n _emberMetal.default._Backburner = _backburner.default;\n\n _emberMetal.default.Logger = _emberConsole.default;\n\n // ****ember-runtime****\n\n _emberMetal.default.String = _emberRuntime.String;\n _emberMetal.default.Object = _emberRuntime.Object;\n _emberMetal.default._RegistryProxyMixin = _emberRuntime.RegistryProxyMixin;\n _emberMetal.default._ContainerProxyMixin = _emberRuntime.ContainerProxyMixin;\n _emberMetal.default.compare = _emberRuntime.compare;\n _emberMetal.default.copy = _emberRuntime.copy;\n _emberMetal.default.isEqual = _emberRuntime.isEqual;\n _emberMetal.default.inject = _emberRuntime.inject;\n _emberMetal.default.Array = _emberRuntime.Array;\n _emberMetal.default.Comparable = _emberRuntime.Comparable;\n _emberMetal.default.Enumerable = _emberRuntime.Enumerable;\n _emberMetal.default.ArrayProxy = _emberRuntime.ArrayProxy;\n _emberMetal.default.ObjectProxy = _emberRuntime.ObjectProxy;\n _emberMetal.default.ActionHandler = _emberRuntime.ActionHandler;\n _emberMetal.default.CoreObject = _emberRuntime.CoreObject;\n _emberMetal.default.NativeArray = _emberRuntime.NativeArray;\n _emberMetal.default.Copyable = _emberRuntime.Copyable;\n _emberMetal.default.MutableEnumerable = _emberRuntime.MutableEnumerable;\n _emberMetal.default.MutableArray = _emberRuntime.MutableArray;\n _emberMetal.default.TargetActionSupport = _emberRuntime.TargetActionSupport;\n _emberMetal.default.Evented = _emberRuntime.Evented;\n _emberMetal.default.PromiseProxyMixin = _emberRuntime.PromiseProxyMixin;\n _emberMetal.default.Observable = _emberRuntime.Observable;\n _emberMetal.default.typeOf = _emberRuntime.typeOf;\n _emberMetal.default.isArray = _emberRuntime.isArray;\n _emberMetal.default.Object = _emberRuntime.Object;\n _emberMetal.default.onLoad = _emberRuntime.onLoad;\n _emberMetal.default.runLoadHooks = _emberRuntime.runLoadHooks;\n _emberMetal.default.Controller = _emberRuntime.Controller;\n _emberMetal.default.ControllerMixin = _emberRuntime.ControllerMixin;\n _emberMetal.default.Service = _emberRuntime.Service;\n _emberMetal.default._ProxyMixin = _emberRuntime._ProxyMixin;\n _emberMetal.default.RSVP = _emberRuntime.RSVP;\n _emberMetal.default.Namespace = _emberRuntime.Namespace;\n\n // ES6TODO: this seems a less than ideal way/place to add properties to Ember.computed\n computed.empty = _emberRuntime.empty;\n computed.notEmpty = _emberRuntime.notEmpty;\n computed.none = _emberRuntime.none;\n computed.not = _emberRuntime.not;\n computed.bool = _emberRuntime.bool;\n computed.match = _emberRuntime.match;\n computed.equal = _emberRuntime.equal;\n computed.gt = _emberRuntime.gt;\n computed.gte = _emberRuntime.gte;\n computed.lt = _emberRuntime.lt;\n computed.lte = _emberRuntime.lte;\n computed.oneWay = _emberRuntime.oneWay;\n computed.reads = _emberRuntime.oneWay;\n computed.readOnly = _emberRuntime.readOnly;\n computed.deprecatingAlias = _emberRuntime.deprecatingAlias;\n computed.and = _emberRuntime.and;\n computed.or = _emberRuntime.or;\n computed.any = _emberRuntime.any;\n\n computed.sum = _emberRuntime.sum;\n computed.min = _emberRuntime.min;\n computed.max = _emberRuntime.max;\n computed.map = _emberRuntime.map;\n computed.sort = _emberRuntime.sort;\n computed.setDiff = _emberRuntime.setDiff;\n computed.mapBy = _emberRuntime.mapBy;\n computed.filter = _emberRuntime.filter;\n computed.filterBy = _emberRuntime.filterBy;\n computed.uniq = _emberRuntime.uniq;\n\n computed.uniqBy = _emberRuntime.uniqBy;\n computed.union = _emberRuntime.union;\n computed.intersect = _emberRuntime.intersect;\n computed.collect = _emberRuntime.collect;\n\n /**\n Defines the hash of localized strings for the current language. Used by\n the `String.loc` helper. To localize, add string values to this\n hash.\n \n @property STRINGS\n @for Ember\n @type Object\n @private\n */\n Object.defineProperty(_emberMetal.default, 'STRINGS', {\n configurable: false,\n get: _emberRuntime.getStrings,\n set: _emberRuntime.setStrings\n });\n\n /**\n Whether searching on the global for new Namespace instances is enabled.\n \n This is only exported here as to not break any addons. Given the new\n visit API, you will have issues if you treat this as a indicator of\n booted.\n \n Internally this is only exposing a flag in Namespace.\n \n @property BOOTED\n @for Ember\n @type Boolean\n @private\n */\n Object.defineProperty(_emberMetal.default, 'BOOTED', {\n configurable: false,\n enumerable: false,\n get: _emberRuntime.isNamespaceSearchDisabled,\n set: _emberRuntime.setNamespaceSearchDisabled\n });\n\n _emberMetal.default.Component = _emberGlimmer.Component;\n _emberGlimmer.Helper.helper = _emberGlimmer.helper;\n _emberMetal.default.Helper = _emberGlimmer.Helper;\n _emberMetal.default.Checkbox = _emberGlimmer.Checkbox;\n _emberMetal.default.TextField = _emberGlimmer.TextField;\n _emberMetal.default.TextArea = _emberGlimmer.TextArea;\n _emberMetal.default.LinkComponent = _emberGlimmer.LinkComponent;\n\n if (_emberEnvironment.ENV.EXTEND_PROTOTYPES.String) {\n String.prototype.htmlSafe = function () {\n return (0, _emberGlimmer.htmlSafe)(this);\n };\n }\n\n var EmberHandlebars = _emberMetal.default.Handlebars = _emberMetal.default.Handlebars || {};\n var EmberHTMLBars = _emberMetal.default.HTMLBars = _emberMetal.default.HTMLBars || {};\n var EmberHandleBarsUtils = EmberHandlebars.Utils = EmberHandlebars.Utils || {};\n\n EmberHTMLBars.template = EmberHandlebars.template = _emberGlimmer.template;\n EmberHandleBarsUtils.escapeExpression = _emberGlimmer.escapeExpression;\n _emberRuntime.String.htmlSafe = _emberGlimmer.htmlSafe;\n\n _emberRuntime.String.isHTMLSafe = _emberGlimmer.isHTMLSafe;\n\n /**\n Global hash of shared templates. This will automatically be populated\n by the build tools so that you can store your Handlebars templates in\n separate files that get loaded into JavaScript at buildtime.\n \n @property TEMPLATES\n @for Ember\n @type Object\n @private\n */\n Object.defineProperty(_emberMetal.default, 'TEMPLATES', {\n get: _emberGlimmer.getTemplates,\n set: _emberGlimmer.setTemplates,\n configurable: false,\n enumerable: false\n });\n\n exports.VERSION = _version.default;\n\n\n /**\n The semantic version\n \n @property VERSION\n @type String\n @public\n */\n _emberMetal.default.VERSION = _version.default;\n\n _emberMetal.libraries.registerCoreLibrary('Ember', _version.default);\n\n // require the main entry points for each of these packages\n // this is so that the global exports occur properly\n\n\n _emberMetal.default.$ = _emberViews.jQuery;\n\n _emberMetal.default.ViewTargetActionSupport = _emberViews.ViewTargetActionSupport;\n\n _emberMetal.default.ViewUtils = {\n isSimpleClick: _emberViews.isSimpleClick,\n getViewElement: _emberViews.getViewElement,\n getViewBounds: _emberViews.getViewBounds,\n getViewClientRects: _emberViews.getViewClientRects,\n getViewBoundingClientRect: _emberViews.getViewBoundingClientRect,\n getRootViews: _emberViews.getRootViews,\n getChildViews: _emberViews.getChildViews\n };\n\n _emberMetal.default.TextSupport = _emberViews.TextSupport;\n _emberMetal.default.ComponentLookup = _emberViews.ComponentLookup;\n _emberMetal.default.EventDispatcher = _emberViews.EventDispatcher;\n\n _emberMetal.default.Location = _emberRouting.Location;\n _emberMetal.default.AutoLocation = _emberRouting.AutoLocation;\n _emberMetal.default.HashLocation = _emberRouting.HashLocation;\n _emberMetal.default.HistoryLocation = _emberRouting.HistoryLocation;\n _emberMetal.default.NoneLocation = _emberRouting.NoneLocation;\n _emberMetal.default.controllerFor = _emberRouting.controllerFor;\n _emberMetal.default.generateControllerFactory = _emberRouting.generateControllerFactory;\n _emberMetal.default.generateController = _emberRouting.generateController;\n _emberMetal.default.RouterDSL = _emberRouting.RouterDSL;\n _emberMetal.default.Router = _emberRouting.Router;\n _emberMetal.default.Route = _emberRouting.Route;\n\n _emberMetal.default.Application = _emberApplication.Application;\n _emberMetal.default.ApplicationInstance = _emberApplication.ApplicationInstance;\n _emberMetal.default.Engine = _emberApplication.Engine;\n _emberMetal.default.EngineInstance = _emberApplication.EngineInstance;\n _emberMetal.default.DefaultResolver = _emberMetal.default.Resolver = _emberApplication.Resolver;\n\n (0, _emberRuntime.runLoadHooks)('Ember.Application', _emberApplication.Application);\n\n _emberMetal.default.DataAdapter = _emberExtensionSupport.DataAdapter;\n _emberMetal.default.ContainerDebugAdapter = _emberExtensionSupport.ContainerDebugAdapter;\n\n if ((0, _require2.has)('ember-template-compiler')) {\n (0, _require2.default)('ember-template-compiler');\n }\n\n // do this to ensure that Ember.Test is defined properly on the global\n // if it is present.\n if ((0, _require2.has)('ember-testing')) {\n var testing = (0, _require2.default)('ember-testing');\n\n _emberMetal.default.Test = testing.Test;\n _emberMetal.default.Test.Adapter = testing.Adapter;\n _emberMetal.default.Test.QUnitAdapter = testing.QUnitAdapter;\n _emberMetal.default.setupForTesting = testing.setupForTesting;\n }\n\n (0, _emberRuntime.runLoadHooks)('Ember');\n\n /**\n @module ember\n @private\n */\n exports.default = _emberMetal.default;\n\n\n /* globals module */\n if (_nodeModule.IS_NODE) {\n _nodeModule.module.exports = _emberMetal.default;\n } else {\n _emberEnvironment.context.exports.Ember = _emberEnvironment.context.exports.Em = _emberMetal.default;\n }\n\n /**\n @module jquery\n @public\n */\n\n /**\n @class jquery\n @public\n @static\n */\n\n /**\n Alias for jQuery\n \n @for jquery\n @method $\n @static\n @public\n */\n});","enifed(\"ember/version\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.default = \"3.0.0\";\n});","enifed(\"handlebars\", [\"exports\"], function (exports) {\n \"use strict\";\n\n // File ignored in coverage tests via setting in .istanbul.yml\n /* Jison generated parser */\n var handlebars = function () {\n var parser = { trace: function trace() {},\n yy: {},\n symbols_: { \"error\": 2, \"root\": 3, \"program\": 4, \"EOF\": 5, \"program_repetition0\": 6, \"statement\": 7, \"mustache\": 8, \"block\": 9, \"rawBlock\": 10, \"partial\": 11, \"partialBlock\": 12, \"content\": 13, \"COMMENT\": 14, \"CONTENT\": 15, \"openRawBlock\": 16, \"rawBlock_repetition_plus0\": 17, \"END_RAW_BLOCK\": 18, \"OPEN_RAW_BLOCK\": 19, \"helperName\": 20, \"openRawBlock_repetition0\": 21, \"openRawBlock_option0\": 22, \"CLOSE_RAW_BLOCK\": 23, \"openBlock\": 24, \"block_option0\": 25, \"closeBlock\": 26, \"openInverse\": 27, \"block_option1\": 28, \"OPEN_BLOCK\": 29, \"openBlock_repetition0\": 30, \"openBlock_option0\": 31, \"openBlock_option1\": 32, \"CLOSE\": 33, \"OPEN_INVERSE\": 34, \"openInverse_repetition0\": 35, \"openInverse_option0\": 36, \"openInverse_option1\": 37, \"openInverseChain\": 38, \"OPEN_INVERSE_CHAIN\": 39, \"openInverseChain_repetition0\": 40, \"openInverseChain_option0\": 41, \"openInverseChain_option1\": 42, \"inverseAndProgram\": 43, \"INVERSE\": 44, \"inverseChain\": 45, \"inverseChain_option0\": 46, \"OPEN_ENDBLOCK\": 47, \"OPEN\": 48, \"mustache_repetition0\": 49, \"mustache_option0\": 50, \"OPEN_UNESCAPED\": 51, \"mustache_repetition1\": 52, \"mustache_option1\": 53, \"CLOSE_UNESCAPED\": 54, \"OPEN_PARTIAL\": 55, \"partialName\": 56, \"partial_repetition0\": 57, \"partial_option0\": 58, \"openPartialBlock\": 59, \"OPEN_PARTIAL_BLOCK\": 60, \"openPartialBlock_repetition0\": 61, \"openPartialBlock_option0\": 62, \"param\": 63, \"sexpr\": 64, \"OPEN_SEXPR\": 65, \"sexpr_repetition0\": 66, \"sexpr_option0\": 67, \"CLOSE_SEXPR\": 68, \"hash\": 69, \"hash_repetition_plus0\": 70, \"hashSegment\": 71, \"ID\": 72, \"EQUALS\": 73, \"blockParams\": 74, \"OPEN_BLOCK_PARAMS\": 75, \"blockParams_repetition_plus0\": 76, \"CLOSE_BLOCK_PARAMS\": 77, \"path\": 78, \"dataName\": 79, \"STRING\": 80, \"NUMBER\": 81, \"BOOLEAN\": 82, \"UNDEFINED\": 83, \"NULL\": 84, \"DATA\": 85, \"pathSegments\": 86, \"SEP\": 87, \"$accept\": 0, \"$end\": 1 },\n terminals_: { 2: \"error\", 5: \"EOF\", 14: \"COMMENT\", 15: \"CONTENT\", 18: \"END_RAW_BLOCK\", 19: \"OPEN_RAW_BLOCK\", 23: \"CLOSE_RAW_BLOCK\", 29: \"OPEN_BLOCK\", 33: \"CLOSE\", 34: \"OPEN_INVERSE\", 39: \"OPEN_INVERSE_CHAIN\", 44: \"INVERSE\", 47: \"OPEN_ENDBLOCK\", 48: \"OPEN\", 51: \"OPEN_UNESCAPED\", 54: \"CLOSE_UNESCAPED\", 55: \"OPEN_PARTIAL\", 60: \"OPEN_PARTIAL_BLOCK\", 65: \"OPEN_SEXPR\", 68: \"CLOSE_SEXPR\", 72: \"ID\", 73: \"EQUALS\", 75: \"OPEN_BLOCK_PARAMS\", 77: \"CLOSE_BLOCK_PARAMS\", 80: \"STRING\", 81: \"NUMBER\", 82: \"BOOLEAN\", 83: \"UNDEFINED\", 84: \"NULL\", 85: \"DATA\", 87: \"SEP\" },\n productions_: [0, [3, 2], [4, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [7, 1], [13, 1], [10, 3], [16, 5], [9, 4], [9, 4], [24, 6], [27, 6], [38, 6], [43, 2], [45, 3], [45, 1], [26, 3], [8, 5], [8, 5], [11, 5], [12, 3], [59, 5], [63, 1], [63, 1], [64, 5], [69, 1], [71, 3], [74, 3], [20, 1], [20, 1], [20, 1], [20, 1], [20, 1], [20, 1], [20, 1], [56, 1], [56, 1], [79, 2], [78, 1], [86, 3], [86, 1], [6, 0], [6, 2], [17, 1], [17, 2], [21, 0], [21, 2], [22, 0], [22, 1], [25, 0], [25, 1], [28, 0], [28, 1], [30, 0], [30, 2], [31, 0], [31, 1], [32, 0], [32, 1], [35, 0], [35, 2], [36, 0], [36, 1], [37, 0], [37, 1], [40, 0], [40, 2], [41, 0], [41, 1], [42, 0], [42, 1], [46, 0], [46, 1], [49, 0], [49, 2], [50, 0], [50, 1], [52, 0], [52, 2], [53, 0], [53, 1], [57, 0], [57, 2], [58, 0], [58, 1], [61, 0], [61, 2], [62, 0], [62, 1], [66, 0], [66, 2], [67, 0], [67, 1], [70, 1], [70, 2], [76, 1], [76, 2]],\n performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$\n /**/) {\n\n var $0 = $$.length - 1;\n switch (yystate) {\n case 1:\n return $$[$0 - 1];\n break;\n case 2:\n this.$ = yy.prepareProgram($$[$0]);\n break;\n case 3:\n this.$ = $$[$0];\n break;\n case 4:\n this.$ = $$[$0];\n break;\n case 5:\n this.$ = $$[$0];\n break;\n case 6:\n this.$ = $$[$0];\n break;\n case 7:\n this.$ = $$[$0];\n break;\n case 8:\n this.$ = $$[$0];\n break;\n case 9:\n this.$ = {\n type: 'CommentStatement',\n value: yy.stripComment($$[$0]),\n strip: yy.stripFlags($$[$0], $$[$0]),\n loc: yy.locInfo(this._$)\n };\n\n break;\n case 10:\n this.$ = {\n type: 'ContentStatement',\n original: $$[$0],\n value: $$[$0],\n loc: yy.locInfo(this._$)\n };\n\n break;\n case 11:\n this.$ = yy.prepareRawBlock($$[$0 - 2], $$[$0 - 1], $$[$0], this._$);\n break;\n case 12:\n this.$ = { path: $$[$0 - 3], params: $$[$0 - 2], hash: $$[$0 - 1] };\n break;\n case 13:\n this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], false, this._$);\n break;\n case 14:\n this.$ = yy.prepareBlock($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0], true, this._$);\n break;\n case 15:\n this.$ = { open: $$[$0 - 5], path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) };\n break;\n case 16:\n this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) };\n break;\n case 17:\n this.$ = { path: $$[$0 - 4], params: $$[$0 - 3], hash: $$[$0 - 2], blockParams: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 5], $$[$0]) };\n break;\n case 18:\n this.$ = { strip: yy.stripFlags($$[$0 - 1], $$[$0 - 1]), program: $$[$0] };\n break;\n case 19:\n var inverse = yy.prepareBlock($$[$0 - 2], $$[$0 - 1], $$[$0], $$[$0], false, this._$),\n program = yy.prepareProgram([inverse], $$[$0 - 1].loc);\n program.chained = true;\n\n this.$ = { strip: $$[$0 - 2].strip, program: program, chain: true };\n\n break;\n case 20:\n this.$ = $$[$0];\n break;\n case 21:\n this.$ = { path: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 2], $$[$0]) };\n break;\n case 22:\n this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$);\n break;\n case 23:\n this.$ = yy.prepareMustache($$[$0 - 3], $$[$0 - 2], $$[$0 - 1], $$[$0 - 4], yy.stripFlags($$[$0 - 4], $$[$0]), this._$);\n break;\n case 24:\n this.$ = {\n type: 'PartialStatement',\n name: $$[$0 - 3],\n params: $$[$0 - 2],\n hash: $$[$0 - 1],\n indent: '',\n strip: yy.stripFlags($$[$0 - 4], $$[$0]),\n loc: yy.locInfo(this._$)\n };\n\n break;\n case 25:\n this.$ = yy.preparePartialBlock($$[$0 - 2], $$[$0 - 1], $$[$0], this._$);\n break;\n case 26:\n this.$ = { path: $$[$0 - 3], params: $$[$0 - 2], hash: $$[$0 - 1], strip: yy.stripFlags($$[$0 - 4], $$[$0]) };\n break;\n case 27:\n this.$ = $$[$0];\n break;\n case 28:\n this.$ = $$[$0];\n break;\n case 29:\n this.$ = {\n type: 'SubExpression',\n path: $$[$0 - 3],\n params: $$[$0 - 2],\n hash: $$[$0 - 1],\n loc: yy.locInfo(this._$)\n };\n\n break;\n case 30:\n this.$ = { type: 'Hash', pairs: $$[$0], loc: yy.locInfo(this._$) };\n break;\n case 31:\n this.$ = { type: 'HashPair', key: yy.id($$[$0 - 2]), value: $$[$0], loc: yy.locInfo(this._$) };\n break;\n case 32:\n this.$ = yy.id($$[$0 - 1]);\n break;\n case 33:\n this.$ = $$[$0];\n break;\n case 34:\n this.$ = $$[$0];\n break;\n case 35:\n this.$ = { type: 'StringLiteral', value: $$[$0], original: $$[$0], loc: yy.locInfo(this._$) };\n break;\n case 36:\n this.$ = { type: 'NumberLiteral', value: Number($$[$0]), original: Number($$[$0]), loc: yy.locInfo(this._$) };\n break;\n case 37:\n this.$ = { type: 'BooleanLiteral', value: $$[$0] === 'true', original: $$[$0] === 'true', loc: yy.locInfo(this._$) };\n break;\n case 38:\n this.$ = { type: 'UndefinedLiteral', original: undefined, value: undefined, loc: yy.locInfo(this._$) };\n break;\n case 39:\n this.$ = { type: 'NullLiteral', original: null, value: null, loc: yy.locInfo(this._$) };\n break;\n case 40:\n this.$ = $$[$0];\n break;\n case 41:\n this.$ = $$[$0];\n break;\n case 42:\n this.$ = yy.preparePath(true, $$[$0], this._$);\n break;\n case 43:\n this.$ = yy.preparePath(false, $$[$0], this._$);\n break;\n case 44:\n $$[$0 - 2].push({ part: yy.id($$[$0]), original: $$[$0], separator: $$[$0 - 1] });this.$ = $$[$0 - 2];\n break;\n case 45:\n this.$ = [{ part: yy.id($$[$0]), original: $$[$0] }];\n break;\n case 46:\n this.$ = [];\n break;\n case 47:\n $$[$0 - 1].push($$[$0]);\n break;\n case 48:\n this.$ = [$$[$0]];\n break;\n case 49:\n $$[$0 - 1].push($$[$0]);\n break;\n case 50:\n this.$ = [];\n break;\n case 51:\n $$[$0 - 1].push($$[$0]);\n break;\n case 58:\n this.$ = [];\n break;\n case 59:\n $$[$0 - 1].push($$[$0]);\n break;\n case 64:\n this.$ = [];\n break;\n case 65:\n $$[$0 - 1].push($$[$0]);\n break;\n case 70:\n this.$ = [];\n break;\n case 71:\n $$[$0 - 1].push($$[$0]);\n break;\n case 78:\n this.$ = [];\n break;\n case 79:\n $$[$0 - 1].push($$[$0]);\n break;\n case 82:\n this.$ = [];\n break;\n case 83:\n $$[$0 - 1].push($$[$0]);\n break;\n case 86:\n this.$ = [];\n break;\n case 87:\n $$[$0 - 1].push($$[$0]);\n break;\n case 90:\n this.$ = [];\n break;\n case 91:\n $$[$0 - 1].push($$[$0]);\n break;\n case 94:\n this.$ = [];\n break;\n case 95:\n $$[$0 - 1].push($$[$0]);\n break;\n case 98:\n this.$ = [$$[$0]];\n break;\n case 99:\n $$[$0 - 1].push($$[$0]);\n break;\n case 100:\n this.$ = [$$[$0]];\n break;\n case 101:\n $$[$0 - 1].push($$[$0]);\n break;\n }\n },\n table: [{ 3: 1, 4: 2, 5: [2, 46], 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 1: [3] }, { 5: [1, 4] }, { 5: [2, 2], 7: 5, 8: 6, 9: 7, 10: 8, 11: 9, 12: 10, 13: 11, 14: [1, 12], 15: [1, 20], 16: 17, 19: [1, 23], 24: 15, 27: 16, 29: [1, 21], 34: [1, 22], 39: [2, 2], 44: [2, 2], 47: [2, 2], 48: [1, 13], 51: [1, 14], 55: [1, 18], 59: 19, 60: [1, 24] }, { 1: [2, 1] }, { 5: [2, 47], 14: [2, 47], 15: [2, 47], 19: [2, 47], 29: [2, 47], 34: [2, 47], 39: [2, 47], 44: [2, 47], 47: [2, 47], 48: [2, 47], 51: [2, 47], 55: [2, 47], 60: [2, 47] }, { 5: [2, 3], 14: [2, 3], 15: [2, 3], 19: [2, 3], 29: [2, 3], 34: [2, 3], 39: [2, 3], 44: [2, 3], 47: [2, 3], 48: [2, 3], 51: [2, 3], 55: [2, 3], 60: [2, 3] }, { 5: [2, 4], 14: [2, 4], 15: [2, 4], 19: [2, 4], 29: [2, 4], 34: [2, 4], 39: [2, 4], 44: [2, 4], 47: [2, 4], 48: [2, 4], 51: [2, 4], 55: [2, 4], 60: [2, 4] }, { 5: [2, 5], 14: [2, 5], 15: [2, 5], 19: [2, 5], 29: [2, 5], 34: [2, 5], 39: [2, 5], 44: [2, 5], 47: [2, 5], 48: [2, 5], 51: [2, 5], 55: [2, 5], 60: [2, 5] }, { 5: [2, 6], 14: [2, 6], 15: [2, 6], 19: [2, 6], 29: [2, 6], 34: [2, 6], 39: [2, 6], 44: [2, 6], 47: [2, 6], 48: [2, 6], 51: [2, 6], 55: [2, 6], 60: [2, 6] }, { 5: [2, 7], 14: [2, 7], 15: [2, 7], 19: [2, 7], 29: [2, 7], 34: [2, 7], 39: [2, 7], 44: [2, 7], 47: [2, 7], 48: [2, 7], 51: [2, 7], 55: [2, 7], 60: [2, 7] }, { 5: [2, 8], 14: [2, 8], 15: [2, 8], 19: [2, 8], 29: [2, 8], 34: [2, 8], 39: [2, 8], 44: [2, 8], 47: [2, 8], 48: [2, 8], 51: [2, 8], 55: [2, 8], 60: [2, 8] }, { 5: [2, 9], 14: [2, 9], 15: [2, 9], 19: [2, 9], 29: [2, 9], 34: [2, 9], 39: [2, 9], 44: [2, 9], 47: [2, 9], 48: [2, 9], 51: [2, 9], 55: [2, 9], 60: [2, 9] }, { 20: 25, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 36, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 4: 37, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 39: [2, 46], 44: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 4: 38, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 44: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 13: 40, 15: [1, 20], 17: 39 }, { 20: 42, 56: 41, 64: 43, 65: [1, 44], 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 4: 45, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 5: [2, 10], 14: [2, 10], 15: [2, 10], 18: [2, 10], 19: [2, 10], 29: [2, 10], 34: [2, 10], 39: [2, 10], 44: [2, 10], 47: [2, 10], 48: [2, 10], 51: [2, 10], 55: [2, 10], 60: [2, 10] }, { 20: 46, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 47, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 48, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 42, 56: 49, 64: 43, 65: [1, 44], 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 33: [2, 78], 49: 50, 65: [2, 78], 72: [2, 78], 80: [2, 78], 81: [2, 78], 82: [2, 78], 83: [2, 78], 84: [2, 78], 85: [2, 78] }, { 23: [2, 33], 33: [2, 33], 54: [2, 33], 65: [2, 33], 68: [2, 33], 72: [2, 33], 75: [2, 33], 80: [2, 33], 81: [2, 33], 82: [2, 33], 83: [2, 33], 84: [2, 33], 85: [2, 33] }, { 23: [2, 34], 33: [2, 34], 54: [2, 34], 65: [2, 34], 68: [2, 34], 72: [2, 34], 75: [2, 34], 80: [2, 34], 81: [2, 34], 82: [2, 34], 83: [2, 34], 84: [2, 34], 85: [2, 34] }, { 23: [2, 35], 33: [2, 35], 54: [2, 35], 65: [2, 35], 68: [2, 35], 72: [2, 35], 75: [2, 35], 80: [2, 35], 81: [2, 35], 82: [2, 35], 83: [2, 35], 84: [2, 35], 85: [2, 35] }, { 23: [2, 36], 33: [2, 36], 54: [2, 36], 65: [2, 36], 68: [2, 36], 72: [2, 36], 75: [2, 36], 80: [2, 36], 81: [2, 36], 82: [2, 36], 83: [2, 36], 84: [2, 36], 85: [2, 36] }, { 23: [2, 37], 33: [2, 37], 54: [2, 37], 65: [2, 37], 68: [2, 37], 72: [2, 37], 75: [2, 37], 80: [2, 37], 81: [2, 37], 82: [2, 37], 83: [2, 37], 84: [2, 37], 85: [2, 37] }, { 23: [2, 38], 33: [2, 38], 54: [2, 38], 65: [2, 38], 68: [2, 38], 72: [2, 38], 75: [2, 38], 80: [2, 38], 81: [2, 38], 82: [2, 38], 83: [2, 38], 84: [2, 38], 85: [2, 38] }, { 23: [2, 39], 33: [2, 39], 54: [2, 39], 65: [2, 39], 68: [2, 39], 72: [2, 39], 75: [2, 39], 80: [2, 39], 81: [2, 39], 82: [2, 39], 83: [2, 39], 84: [2, 39], 85: [2, 39] }, { 23: [2, 43], 33: [2, 43], 54: [2, 43], 65: [2, 43], 68: [2, 43], 72: [2, 43], 75: [2, 43], 80: [2, 43], 81: [2, 43], 82: [2, 43], 83: [2, 43], 84: [2, 43], 85: [2, 43], 87: [1, 51] }, { 72: [1, 35], 86: 52 }, { 23: [2, 45], 33: [2, 45], 54: [2, 45], 65: [2, 45], 68: [2, 45], 72: [2, 45], 75: [2, 45], 80: [2, 45], 81: [2, 45], 82: [2, 45], 83: [2, 45], 84: [2, 45], 85: [2, 45], 87: [2, 45] }, { 52: 53, 54: [2, 82], 65: [2, 82], 72: [2, 82], 80: [2, 82], 81: [2, 82], 82: [2, 82], 83: [2, 82], 84: [2, 82], 85: [2, 82] }, { 25: 54, 38: 56, 39: [1, 58], 43: 57, 44: [1, 59], 45: 55, 47: [2, 54] }, { 28: 60, 43: 61, 44: [1, 59], 47: [2, 56] }, { 13: 63, 15: [1, 20], 18: [1, 62] }, { 15: [2, 48], 18: [2, 48] }, { 33: [2, 86], 57: 64, 65: [2, 86], 72: [2, 86], 80: [2, 86], 81: [2, 86], 82: [2, 86], 83: [2, 86], 84: [2, 86], 85: [2, 86] }, { 33: [2, 40], 65: [2, 40], 72: [2, 40], 80: [2, 40], 81: [2, 40], 82: [2, 40], 83: [2, 40], 84: [2, 40], 85: [2, 40] }, { 33: [2, 41], 65: [2, 41], 72: [2, 41], 80: [2, 41], 81: [2, 41], 82: [2, 41], 83: [2, 41], 84: [2, 41], 85: [2, 41] }, { 20: 65, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 26: 66, 47: [1, 67] }, { 30: 68, 33: [2, 58], 65: [2, 58], 72: [2, 58], 75: [2, 58], 80: [2, 58], 81: [2, 58], 82: [2, 58], 83: [2, 58], 84: [2, 58], 85: [2, 58] }, { 33: [2, 64], 35: 69, 65: [2, 64], 72: [2, 64], 75: [2, 64], 80: [2, 64], 81: [2, 64], 82: [2, 64], 83: [2, 64], 84: [2, 64], 85: [2, 64] }, { 21: 70, 23: [2, 50], 65: [2, 50], 72: [2, 50], 80: [2, 50], 81: [2, 50], 82: [2, 50], 83: [2, 50], 84: [2, 50], 85: [2, 50] }, { 33: [2, 90], 61: 71, 65: [2, 90], 72: [2, 90], 80: [2, 90], 81: [2, 90], 82: [2, 90], 83: [2, 90], 84: [2, 90], 85: [2, 90] }, { 20: 75, 33: [2, 80], 50: 72, 63: 73, 64: 76, 65: [1, 44], 69: 74, 70: 77, 71: 78, 72: [1, 79], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 72: [1, 80] }, { 23: [2, 42], 33: [2, 42], 54: [2, 42], 65: [2, 42], 68: [2, 42], 72: [2, 42], 75: [2, 42], 80: [2, 42], 81: [2, 42], 82: [2, 42], 83: [2, 42], 84: [2, 42], 85: [2, 42], 87: [1, 51] }, { 20: 75, 53: 81, 54: [2, 84], 63: 82, 64: 76, 65: [1, 44], 69: 83, 70: 77, 71: 78, 72: [1, 79], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 26: 84, 47: [1, 67] }, { 47: [2, 55] }, { 4: 85, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 39: [2, 46], 44: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 47: [2, 20] }, { 20: 86, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 4: 87, 6: 3, 14: [2, 46], 15: [2, 46], 19: [2, 46], 29: [2, 46], 34: [2, 46], 47: [2, 46], 48: [2, 46], 51: [2, 46], 55: [2, 46], 60: [2, 46] }, { 26: 88, 47: [1, 67] }, { 47: [2, 57] }, { 5: [2, 11], 14: [2, 11], 15: [2, 11], 19: [2, 11], 29: [2, 11], 34: [2, 11], 39: [2, 11], 44: [2, 11], 47: [2, 11], 48: [2, 11], 51: [2, 11], 55: [2, 11], 60: [2, 11] }, { 15: [2, 49], 18: [2, 49] }, { 20: 75, 33: [2, 88], 58: 89, 63: 90, 64: 76, 65: [1, 44], 69: 91, 70: 77, 71: 78, 72: [1, 79], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 65: [2, 94], 66: 92, 68: [2, 94], 72: [2, 94], 80: [2, 94], 81: [2, 94], 82: [2, 94], 83: [2, 94], 84: [2, 94], 85: [2, 94] }, { 5: [2, 25], 14: [2, 25], 15: [2, 25], 19: [2, 25], 29: [2, 25], 34: [2, 25], 39: [2, 25], 44: [2, 25], 47: [2, 25], 48: [2, 25], 51: [2, 25], 55: [2, 25], 60: [2, 25] }, { 20: 93, 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 75, 31: 94, 33: [2, 60], 63: 95, 64: 76, 65: [1, 44], 69: 96, 70: 77, 71: 78, 72: [1, 79], 75: [2, 60], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 75, 33: [2, 66], 36: 97, 63: 98, 64: 76, 65: [1, 44], 69: 99, 70: 77, 71: 78, 72: [1, 79], 75: [2, 66], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 75, 22: 100, 23: [2, 52], 63: 101, 64: 76, 65: [1, 44], 69: 102, 70: 77, 71: 78, 72: [1, 79], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 20: 75, 33: [2, 92], 62: 103, 63: 104, 64: 76, 65: [1, 44], 69: 105, 70: 77, 71: 78, 72: [1, 79], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 33: [1, 106] }, { 33: [2, 79], 65: [2, 79], 72: [2, 79], 80: [2, 79], 81: [2, 79], 82: [2, 79], 83: [2, 79], 84: [2, 79], 85: [2, 79] }, { 33: [2, 81] }, { 23: [2, 27], 33: [2, 27], 54: [2, 27], 65: [2, 27], 68: [2, 27], 72: [2, 27], 75: [2, 27], 80: [2, 27], 81: [2, 27], 82: [2, 27], 83: [2, 27], 84: [2, 27], 85: [2, 27] }, { 23: [2, 28], 33: [2, 28], 54: [2, 28], 65: [2, 28], 68: [2, 28], 72: [2, 28], 75: [2, 28], 80: [2, 28], 81: [2, 28], 82: [2, 28], 83: [2, 28], 84: [2, 28], 85: [2, 28] }, { 23: [2, 30], 33: [2, 30], 54: [2, 30], 68: [2, 30], 71: 107, 72: [1, 108], 75: [2, 30] }, { 23: [2, 98], 33: [2, 98], 54: [2, 98], 68: [2, 98], 72: [2, 98], 75: [2, 98] }, { 23: [2, 45], 33: [2, 45], 54: [2, 45], 65: [2, 45], 68: [2, 45], 72: [2, 45], 73: [1, 109], 75: [2, 45], 80: [2, 45], 81: [2, 45], 82: [2, 45], 83: [2, 45], 84: [2, 45], 85: [2, 45], 87: [2, 45] }, { 23: [2, 44], 33: [2, 44], 54: [2, 44], 65: [2, 44], 68: [2, 44], 72: [2, 44], 75: [2, 44], 80: [2, 44], 81: [2, 44], 82: [2, 44], 83: [2, 44], 84: [2, 44], 85: [2, 44], 87: [2, 44] }, { 54: [1, 110] }, { 54: [2, 83], 65: [2, 83], 72: [2, 83], 80: [2, 83], 81: [2, 83], 82: [2, 83], 83: [2, 83], 84: [2, 83], 85: [2, 83] }, { 54: [2, 85] }, { 5: [2, 13], 14: [2, 13], 15: [2, 13], 19: [2, 13], 29: [2, 13], 34: [2, 13], 39: [2, 13], 44: [2, 13], 47: [2, 13], 48: [2, 13], 51: [2, 13], 55: [2, 13], 60: [2, 13] }, { 38: 56, 39: [1, 58], 43: 57, 44: [1, 59], 45: 112, 46: 111, 47: [2, 76] }, { 33: [2, 70], 40: 113, 65: [2, 70], 72: [2, 70], 75: [2, 70], 80: [2, 70], 81: [2, 70], 82: [2, 70], 83: [2, 70], 84: [2, 70], 85: [2, 70] }, { 47: [2, 18] }, { 5: [2, 14], 14: [2, 14], 15: [2, 14], 19: [2, 14], 29: [2, 14], 34: [2, 14], 39: [2, 14], 44: [2, 14], 47: [2, 14], 48: [2, 14], 51: [2, 14], 55: [2, 14], 60: [2, 14] }, { 33: [1, 114] }, { 33: [2, 87], 65: [2, 87], 72: [2, 87], 80: [2, 87], 81: [2, 87], 82: [2, 87], 83: [2, 87], 84: [2, 87], 85: [2, 87] }, { 33: [2, 89] }, { 20: 75, 63: 116, 64: 76, 65: [1, 44], 67: 115, 68: [2, 96], 69: 117, 70: 77, 71: 78, 72: [1, 79], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 33: [1, 118] }, { 32: 119, 33: [2, 62], 74: 120, 75: [1, 121] }, { 33: [2, 59], 65: [2, 59], 72: [2, 59], 75: [2, 59], 80: [2, 59], 81: [2, 59], 82: [2, 59], 83: [2, 59], 84: [2, 59], 85: [2, 59] }, { 33: [2, 61], 75: [2, 61] }, { 33: [2, 68], 37: 122, 74: 123, 75: [1, 121] }, { 33: [2, 65], 65: [2, 65], 72: [2, 65], 75: [2, 65], 80: [2, 65], 81: [2, 65], 82: [2, 65], 83: [2, 65], 84: [2, 65], 85: [2, 65] }, { 33: [2, 67], 75: [2, 67] }, { 23: [1, 124] }, { 23: [2, 51], 65: [2, 51], 72: [2, 51], 80: [2, 51], 81: [2, 51], 82: [2, 51], 83: [2, 51], 84: [2, 51], 85: [2, 51] }, { 23: [2, 53] }, { 33: [1, 125] }, { 33: [2, 91], 65: [2, 91], 72: [2, 91], 80: [2, 91], 81: [2, 91], 82: [2, 91], 83: [2, 91], 84: [2, 91], 85: [2, 91] }, { 33: [2, 93] }, { 5: [2, 22], 14: [2, 22], 15: [2, 22], 19: [2, 22], 29: [2, 22], 34: [2, 22], 39: [2, 22], 44: [2, 22], 47: [2, 22], 48: [2, 22], 51: [2, 22], 55: [2, 22], 60: [2, 22] }, { 23: [2, 99], 33: [2, 99], 54: [2, 99], 68: [2, 99], 72: [2, 99], 75: [2, 99] }, { 73: [1, 109] }, { 20: 75, 63: 126, 64: 76, 65: [1, 44], 72: [1, 35], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 5: [2, 23], 14: [2, 23], 15: [2, 23], 19: [2, 23], 29: [2, 23], 34: [2, 23], 39: [2, 23], 44: [2, 23], 47: [2, 23], 48: [2, 23], 51: [2, 23], 55: [2, 23], 60: [2, 23] }, { 47: [2, 19] }, { 47: [2, 77] }, { 20: 75, 33: [2, 72], 41: 127, 63: 128, 64: 76, 65: [1, 44], 69: 129, 70: 77, 71: 78, 72: [1, 79], 75: [2, 72], 78: 26, 79: 27, 80: [1, 28], 81: [1, 29], 82: [1, 30], 83: [1, 31], 84: [1, 32], 85: [1, 34], 86: 33 }, { 5: [2, 24], 14: [2, 24], 15: [2, 24], 19: [2, 24], 29: [2, 24], 34: [2, 24], 39: [2, 24], 44: [2, 24], 47: [2, 24], 48: [2, 24], 51: [2, 24], 55: [2, 24], 60: [2, 24] }, { 68: [1, 130] }, { 65: [2, 95], 68: [2, 95], 72: [2, 95], 80: [2, 95], 81: [2, 95], 82: [2, 95], 83: [2, 95], 84: [2, 95], 85: [2, 95] }, { 68: [2, 97] }, { 5: [2, 21], 14: [2, 21], 15: [2, 21], 19: [2, 21], 29: [2, 21], 34: [2, 21], 39: [2, 21], 44: [2, 21], 47: [2, 21], 48: [2, 21], 51: [2, 21], 55: [2, 21], 60: [2, 21] }, { 33: [1, 131] }, { 33: [2, 63] }, { 72: [1, 133], 76: 132 }, { 33: [1, 134] }, { 33: [2, 69] }, { 15: [2, 12] }, { 14: [2, 26], 15: [2, 26], 19: [2, 26], 29: [2, 26], 34: [2, 26], 47: [2, 26], 48: [2, 26], 51: [2, 26], 55: [2, 26], 60: [2, 26] }, { 23: [2, 31], 33: [2, 31], 54: [2, 31], 68: [2, 31], 72: [2, 31], 75: [2, 31] }, { 33: [2, 74], 42: 135, 74: 136, 75: [1, 121] }, { 33: [2, 71], 65: [2, 71], 72: [2, 71], 75: [2, 71], 80: [2, 71], 81: [2, 71], 82: [2, 71], 83: [2, 71], 84: [2, 71], 85: [2, 71] }, { 33: [2, 73], 75: [2, 73] }, { 23: [2, 29], 33: [2, 29], 54: [2, 29], 65: [2, 29], 68: [2, 29], 72: [2, 29], 75: [2, 29], 80: [2, 29], 81: [2, 29], 82: [2, 29], 83: [2, 29], 84: [2, 29], 85: [2, 29] }, { 14: [2, 15], 15: [2, 15], 19: [2, 15], 29: [2, 15], 34: [2, 15], 39: [2, 15], 44: [2, 15], 47: [2, 15], 48: [2, 15], 51: [2, 15], 55: [2, 15], 60: [2, 15] }, { 72: [1, 138], 77: [1, 137] }, { 72: [2, 100], 77: [2, 100] }, { 14: [2, 16], 15: [2, 16], 19: [2, 16], 29: [2, 16], 34: [2, 16], 44: [2, 16], 47: [2, 16], 48: [2, 16], 51: [2, 16], 55: [2, 16], 60: [2, 16] }, { 33: [1, 139] }, { 33: [2, 75] }, { 33: [2, 32] }, { 72: [2, 101], 77: [2, 101] }, { 14: [2, 17], 15: [2, 17], 19: [2, 17], 29: [2, 17], 34: [2, 17], 39: [2, 17], 44: [2, 17], 47: [2, 17], 48: [2, 17], 51: [2, 17], 55: [2, 17], 60: [2, 17] }],\n defaultActions: { 4: [2, 1], 55: [2, 55], 57: [2, 20], 61: [2, 57], 74: [2, 81], 83: [2, 85], 87: [2, 18], 91: [2, 89], 102: [2, 53], 105: [2, 93], 111: [2, 19], 112: [2, 77], 117: [2, 97], 120: [2, 63], 123: [2, 69], 124: [2, 12], 136: [2, 75], 137: [2, 32] },\n parseError: function parseError(str, hash) {\n throw new Error(str);\n },\n parse: function parse(input) {\n var self = this,\n stack = [0],\n vstack = [null],\n lstack = [],\n table = this.table,\n yytext = \"\",\n yylineno = 0,\n yyleng = 0,\n recovering = 0;\n this.lexer.setInput(input);\n this.lexer.yy = this.yy;\n this.yy.lexer = this.lexer;\n this.yy.parser = this;\n if (typeof this.lexer.yylloc == \"undefined\") this.lexer.yylloc = {};\n var yyloc = this.lexer.yylloc;\n lstack.push(yyloc);\n var ranges = this.lexer.options && this.lexer.options.ranges;\n if (typeof this.yy.parseError === \"function\") this.parseError = this.yy.parseError;\n function lex() {\n var token;\n token = self.lexer.lex() || 1;\n if (typeof token !== \"number\") {\n token = self.symbols_[token] || token;\n }\n return token;\n }\n var symbol,\n preErrorSymbol,\n state,\n action,\n a,\n r,\n yyval = {},\n p,\n len,\n newState,\n expected;\n while (true) {\n state = stack[stack.length - 1];\n if (this.defaultActions[state]) {\n action = this.defaultActions[state];\n } else {\n if (symbol === null || typeof symbol == \"undefined\") {\n symbol = lex();\n }\n action = table[state] && table[state][symbol];\n }\n if (typeof action === \"undefined\" || !action.length || !action[0]) {\n var errStr = \"\";\n if (!recovering) {\n expected = [];\n for (p in table[state]) {\n if (this.terminals_[p] && p > 2) {\n expected.push(\"'\" + this.terminals_[p] + \"'\");\n }\n }if (this.lexer.showPosition) {\n errStr = \"Parse error on line \" + (yylineno + 1) + \":\\n\" + this.lexer.showPosition() + \"\\nExpecting \" + expected.join(\", \") + \", got '\" + (this.terminals_[symbol] || symbol) + \"'\";\n } else {\n errStr = \"Parse error on line \" + (yylineno + 1) + \": Unexpected \" + (symbol == 1 ? \"end of input\" : \"'\" + (this.terminals_[symbol] || symbol) + \"'\");\n }\n this.parseError(errStr, { text: this.lexer.match, token: this.terminals_[symbol] || symbol, line: this.lexer.yylineno, loc: yyloc, expected: expected });\n }\n }\n if (action[0] instanceof Array && action.length > 1) {\n throw new Error(\"Parse Error: multiple actions possible at state: \" + state + \", token: \" + symbol);\n }\n switch (action[0]) {\n case 1:\n stack.push(symbol);\n vstack.push(this.lexer.yytext);\n lstack.push(this.lexer.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = this.lexer.yyleng;\n yytext = this.lexer.yytext;\n yylineno = this.lexer.yylineno;\n yyloc = this.lexer.yylloc;\n if (recovering > 0) recovering--;\n } else {\n symbol = preErrorSymbol;\n preErrorSymbol = null;\n }\n break;\n case 2:\n len = this.productions_[action[1]][1];\n yyval.$ = vstack[vstack.length - len];\n yyval._$ = { first_line: lstack[lstack.length - (len || 1)].first_line, last_line: lstack[lstack.length - 1].last_line, first_column: lstack[lstack.length - (len || 1)].first_column, last_column: lstack[lstack.length - 1].last_column };\n if (ranges) {\n yyval._$.range = [lstack[lstack.length - (len || 1)].range[0], lstack[lstack.length - 1].range[1]];\n }\n r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack);\n if (typeof r !== \"undefined\") {\n return r;\n }\n if (len) {\n stack = stack.slice(0, -1 * len * 2);\n vstack = vstack.slice(0, -1 * len);\n lstack = lstack.slice(0, -1 * len);\n }\n stack.push(this.productions_[action[1]][0]);\n vstack.push(yyval.$);\n lstack.push(yyval._$);\n newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n stack.push(newState);\n break;\n case 3:\n return true;\n }\n }\n return true;\n }\n };\n /* Jison generated lexer */\n var lexer = function () {\n var lexer = { EOF: 1,\n parseError: function parseError(str, hash) {\n if (this.yy.parser) {\n this.yy.parser.parseError(str, hash);\n } else {\n throw new Error(str);\n }\n },\n setInput: function (input) {\n this._input = input;\n this._more = this._less = this.done = false;\n this.yylineno = this.yyleng = 0;\n this.yytext = this.matched = this.match = '';\n this.conditionStack = ['INITIAL'];\n this.yylloc = { first_line: 1, first_column: 0, last_line: 1, last_column: 0 };\n if (this.options.ranges) this.yylloc.range = [0, 0];\n this.offset = 0;\n return this;\n },\n input: function () {\n var ch = this._input[0];\n this.yytext += ch;\n this.yyleng++;\n this.offset++;\n this.match += ch;\n this.matched += ch;\n var lines = ch.match(/(?:\\r\\n?|\\n).*/g);\n if (lines) {\n this.yylineno++;\n this.yylloc.last_line++;\n } else {\n this.yylloc.last_column++;\n }\n if (this.options.ranges) this.yylloc.range[1]++;\n\n this._input = this._input.slice(1);\n return ch;\n },\n unput: function (ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - len - 1);\n //this.yyleng -= len;\n this.offset -= len;\n var oldLines = this.match.split(/(?:\\r\\n?|\\n)/g);\n this.match = this.match.substr(0, this.match.length - 1);\n this.matched = this.matched.substr(0, this.matched.length - 1);\n\n if (lines.length - 1) this.yylineno -= lines.length - 1;\n var r = this.yylloc.range;\n\n this.yylloc = { first_line: this.yylloc.first_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.first_column,\n last_column: lines ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len\n };\n\n if (this.options.ranges) {\n this.yylloc.range = [r[0], r[0] + this.yyleng - len];\n }\n return this;\n },\n more: function () {\n this._more = true;\n return this;\n },\n less: function (n) {\n this.unput(this.match.slice(n));\n },\n pastInput: function () {\n var past = this.matched.substr(0, this.matched.length - this.match.length);\n return (past.length > 20 ? '...' : '') + past.substr(-20).replace(/\\n/g, \"\");\n },\n upcomingInput: function () {\n var next = this.match;\n if (next.length < 20) {\n next += this._input.substr(0, 20 - next.length);\n }\n return (next.substr(0, 20) + (next.length > 20 ? '...' : '')).replace(/\\n/g, \"\");\n },\n showPosition: function () {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n },\n next: function () {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) this.done = true;\n\n var token, match, tempMatch, index, col, lines;\n if (!this._more) {\n this.yytext = '';\n this.match = '';\n }\n var rules = this._currentRules();\n for (var i = 0; i < rules.length; i++) {\n tempMatch = this._input.match(this.rules[rules[i]]);\n if (tempMatch && (!match || tempMatch[0].length > match[0].length)) {\n match = tempMatch;\n index = i;\n if (!this.options.flex) break;\n }\n }\n if (match) {\n lines = match[0].match(/(?:\\r\\n?|\\n).*/g);\n if (lines) this.yylineno += lines.length;\n this.yylloc = { first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: lines ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length : this.yylloc.last_column + match[0].length };\n this.yytext += match[0];\n this.match += match[0];\n this.matches = match;\n this.yyleng = this.yytext.length;\n if (this.options.ranges) {\n this.yylloc.range = [this.offset, this.offset += this.yyleng];\n }\n this._more = false;\n this._input = this._input.slice(match[0].length);\n this.matched += match[0];\n token = this.performAction.call(this, this.yy, this, rules[index], this.conditionStack[this.conditionStack.length - 1]);\n if (this.done && this._input) this.done = false;\n if (token) return token;else return;\n }\n if (this._input === \"\") {\n return this.EOF;\n } else {\n return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\\n' + this.showPosition(), { text: \"\", token: null, line: this.yylineno });\n }\n },\n lex: function lex() {\n var r = this.next();\n if (typeof r !== 'undefined') {\n return r;\n } else {\n return this.lex();\n }\n },\n begin: function begin(condition) {\n this.conditionStack.push(condition);\n },\n popState: function popState() {\n return this.conditionStack.pop();\n },\n _currentRules: function _currentRules() {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n },\n topState: function () {\n return this.conditionStack[this.conditionStack.length - 2];\n },\n pushState: function begin(condition) {\n this.begin(condition);\n } };\n lexer.options = {};\n lexer.performAction = function anonymous(yy, yy_, $avoiding_name_collisions, YY_START\n /**/) {\n\n function strip(start, end) {\n return yy_.yytext = yy_.yytext.substr(start, yy_.yyleng - end);\n }\n\n switch ($avoiding_name_collisions) {\n case 0:\n if (yy_.yytext.slice(-2) === \"\\\\\\\\\") {\n strip(0, 1);\n this.begin(\"mu\");\n } else if (yy_.yytext.slice(-1) === \"\\\\\") {\n strip(0, 1);\n this.begin(\"emu\");\n } else {\n this.begin(\"mu\");\n }\n if (yy_.yytext) return 15;\n\n break;\n case 1:\n return 15;\n break;\n case 2:\n this.popState();\n return 15;\n\n break;\n case 3:\n this.begin('raw');return 15;\n break;\n case 4:\n this.popState();\n // Should be using `this.topState()` below, but it currently\n // returns the second top instead of the first top. Opened an\n // issue about it at https://github.com/zaach/jison/issues/291\n if (this.conditionStack[this.conditionStack.length - 1] === 'raw') {\n return 15;\n } else {\n yy_.yytext = yy_.yytext.substr(5, yy_.yyleng - 9);\n return 'END_RAW_BLOCK';\n }\n\n break;\n case 5:\n return 15;\n break;\n case 6:\n this.popState();\n return 14;\n\n break;\n case 7:\n return 65;\n break;\n case 8:\n return 68;\n break;\n case 9:\n return 19;\n break;\n case 10:\n this.popState();\n this.begin('raw');\n return 23;\n\n break;\n case 11:\n return 55;\n break;\n case 12:\n return 60;\n break;\n case 13:\n return 29;\n break;\n case 14:\n return 47;\n break;\n case 15:\n this.popState();return 44;\n break;\n case 16:\n this.popState();return 44;\n break;\n case 17:\n return 34;\n break;\n case 18:\n return 39;\n break;\n case 19:\n return 51;\n break;\n case 20:\n return 48;\n break;\n case 21:\n this.unput(yy_.yytext);\n this.popState();\n this.begin('com');\n\n break;\n case 22:\n this.popState();\n return 14;\n\n break;\n case 23:\n return 48;\n break;\n case 24:\n return 73;\n break;\n case 25:\n return 72;\n break;\n case 26:\n return 72;\n break;\n case 27:\n return 87;\n break;\n case 28:\n // ignore whitespace\n break;\n case 29:\n this.popState();return 54;\n break;\n case 30:\n this.popState();return 33;\n break;\n case 31:\n yy_.yytext = strip(1, 2).replace(/\\\\\"/g, '\"');return 80;\n break;\n case 32:\n yy_.yytext = strip(1, 2).replace(/\\\\'/g, \"'\");return 80;\n break;\n case 33:\n return 85;\n break;\n case 34:\n return 82;\n break;\n case 35:\n return 82;\n break;\n case 36:\n return 83;\n break;\n case 37:\n return 84;\n break;\n case 38:\n return 81;\n break;\n case 39:\n return 75;\n break;\n case 40:\n return 77;\n break;\n case 41:\n return 72;\n break;\n case 42:\n yy_.yytext = yy_.yytext.replace(/\\\\([\\\\\\]])/g, '$1');return 72;\n break;\n case 43:\n return 'INVALID';\n break;\n case 44:\n return 5;\n break;\n }\n };\n lexer.rules = [/^(?:[^\\x00]*?(?=(\\{\\{)))/, /^(?:[^\\x00]+)/, /^(?:[^\\x00]{2,}?(?=(\\{\\{|\\\\\\{\\{|\\\\\\\\\\{\\{|$)))/, /^(?:\\{\\{\\{\\{(?=[^\\/]))/, /^(?:\\{\\{\\{\\{\\/[^\\s!\"#%-,\\.\\/;->@\\[-\\^`\\{-~]+(?=[=}\\s\\/.])\\}\\}\\}\\})/, /^(?:[^\\x00]*?(?=(\\{\\{\\{\\{)))/, /^(?:[\\s\\S]*?--(~)?\\}\\})/, /^(?:\\()/, /^(?:\\))/, /^(?:\\{\\{\\{\\{)/, /^(?:\\}\\}\\}\\})/, /^(?:\\{\\{(~)?>)/, /^(?:\\{\\{(~)?#>)/, /^(?:\\{\\{(~)?#\\*?)/, /^(?:\\{\\{(~)?\\/)/, /^(?:\\{\\{(~)?\\^\\s*(~)?\\}\\})/, /^(?:\\{\\{(~)?\\s*else\\s*(~)?\\}\\})/, /^(?:\\{\\{(~)?\\^)/, /^(?:\\{\\{(~)?\\s*else\\b)/, /^(?:\\{\\{(~)?\\{)/, /^(?:\\{\\{(~)?&)/, /^(?:\\{\\{(~)?!--)/, /^(?:\\{\\{(~)?![\\s\\S]*?\\}\\})/, /^(?:\\{\\{(~)?\\*?)/, /^(?:=)/, /^(?:\\.\\.)/, /^(?:\\.(?=([=~}\\s\\/.)|])))/, /^(?:[\\/.])/, /^(?:\\s+)/, /^(?:\\}(~)?\\}\\})/, /^(?:(~)?\\}\\})/, /^(?:\"(\\\\[\"]|[^\"])*\")/, /^(?:'(\\\\[']|[^'])*')/, /^(?:@)/, /^(?:true(?=([~}\\s)])))/, /^(?:false(?=([~}\\s)])))/, /^(?:undefined(?=([~}\\s)])))/, /^(?:null(?=([~}\\s)])))/, /^(?:-?[0-9]+(?:\\.[0-9]+)?(?=([~}\\s)])))/, /^(?:as\\s+\\|)/, /^(?:\\|)/, /^(?:([^\\s!\"#%-,\\.\\/;->@\\[-\\^`\\{-~]+(?=([=~}\\s\\/.)|]))))/, /^(?:\\[(\\\\\\]|[^\\]])*\\])/, /^(?:.)/, /^(?:$)/];\n lexer.conditions = { \"mu\": { \"rules\": [7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44], \"inclusive\": false }, \"emu\": { \"rules\": [2], \"inclusive\": false }, \"com\": { \"rules\": [6], \"inclusive\": false }, \"raw\": { \"rules\": [3, 4, 5], \"inclusive\": false }, \"INITIAL\": { \"rules\": [0, 1, 44], \"inclusive\": true } };\n return lexer;\n }();\n parser.lexer = lexer;\n function Parser() {\n this.yy = {};\n }Parser.prototype = parser;parser.Parser = Parser;\n return new Parser();\n }();\n\n var errorProps = ['description', 'fileName', 'lineNumber', 'message', 'name', 'number', 'stack'];\n\n function Exception(message, node) {\n var loc = node && node.loc,\n line = void 0,\n column = void 0;\n if (loc) {\n line = loc.start.line;\n column = loc.start.column;\n\n message += ' - ' + line + ':' + column;\n }\n\n var tmp = Error.prototype.constructor.call(this, message);\n\n // Unfortunately errors are not enumerable in Chrome (at least), so `for prop in tmp` doesn't work.\n for (var idx = 0; idx < errorProps.length; idx++) {\n this[errorProps[idx]] = tmp[errorProps[idx]];\n }\n\n /* istanbul ignore else */\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, Exception);\n }\n\n try {\n if (loc) {\n this.lineNumber = line;\n\n // Work around issue under safari where we can't directly set the column value\n /* istanbul ignore next */\n if (Object.defineProperty) {\n Object.defineProperty(this, 'column', {\n value: column,\n enumerable: true\n });\n } else {\n this.column = column;\n }\n }\n } catch (nop) {\n /* Ignore if the browser is very particular */\n }\n }\n\n Exception.prototype = new Error();\n\n function Visitor() {\n this.parents = [];\n }\n\n Visitor.prototype = {\n constructor: Visitor,\n mutating: false,\n\n // Visits a given value. If mutating, will replace the value if necessary.\n acceptKey: function (node, name) {\n var value = this.accept(node[name]);\n if (this.mutating) {\n // Hacky sanity check: This may have a few false positives for type for the helper\n // methods but will generally do the right thing without a lot of overhead.\n if (value && !Visitor.prototype[value.type]) {\n throw new Exception('Unexpected node type \"' + value.type + '\" found when accepting ' + name + ' on ' + node.type);\n }\n node[name] = value;\n }\n },\n\n // Performs an accept operation with added sanity check to ensure\n // required keys are not removed.\n acceptRequired: function (node, name) {\n this.acceptKey(node, name);\n\n if (!node[name]) {\n throw new Exception(node.type + ' requires ' + name);\n }\n },\n\n // Traverses a given array. If mutating, empty respnses will be removed\n // for child elements.\n acceptArray: function (array) {\n for (var i = 0, l = array.length; i < l; i++) {\n this.acceptKey(array, i);\n\n if (!array[i]) {\n array.splice(i, 1);\n i--;\n l--;\n }\n }\n },\n\n accept: function (object) {\n if (!object) {\n return;\n }\n\n /* istanbul ignore next: Sanity code */\n if (!this[object.type]) {\n throw new Exception('Unknown type: ' + object.type, object);\n }\n\n if (this.current) {\n this.parents.unshift(this.current);\n }\n this.current = object;\n\n var ret = this[object.type](object);\n\n this.current = this.parents.shift();\n\n if (!this.mutating || ret) {\n return ret;\n } else if (ret !== false) {\n return object;\n }\n },\n\n Program: function (program) {\n this.acceptArray(program.body);\n },\n\n MustacheStatement: visitSubExpression,\n Decorator: visitSubExpression,\n\n BlockStatement: visitBlock,\n DecoratorBlock: visitBlock,\n\n PartialStatement: visitPartial,\n PartialBlockStatement: function (partial) {\n visitPartial.call(this, partial);\n\n this.acceptKey(partial, 'program');\n },\n\n ContentStatement: function () /* content */{},\n CommentStatement: function () /* comment */{},\n\n SubExpression: visitSubExpression,\n\n PathExpression: function () /* path */{},\n\n StringLiteral: function () /* string */{},\n NumberLiteral: function () /* number */{},\n BooleanLiteral: function () /* bool */{},\n UndefinedLiteral: function () /* literal */{},\n NullLiteral: function () /* literal */{},\n\n Hash: function (hash) {\n this.acceptArray(hash.pairs);\n },\n HashPair: function (pair) {\n this.acceptRequired(pair, 'value');\n }\n };\n\n function visitSubExpression(mustache) {\n this.acceptRequired(mustache, 'path');\n this.acceptArray(mustache.params);\n this.acceptKey(mustache, 'hash');\n }\n function visitBlock(block) {\n visitSubExpression.call(this, block);\n\n this.acceptKey(block, 'program');\n this.acceptKey(block, 'inverse');\n }\n function visitPartial(partial) {\n this.acceptRequired(partial, 'name');\n this.acceptArray(partial.params);\n this.acceptKey(partial, 'hash');\n }\n\n function WhitespaceControl() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n this.options = options;\n }\n WhitespaceControl.prototype = new Visitor();\n\n WhitespaceControl.prototype.Program = function (program) {\n var doStandalone = !this.options.ignoreStandalone;\n\n var isRoot = !this.isRootSeen;\n this.isRootSeen = true;\n\n var body = program.body;\n for (var i = 0, l = body.length; i < l; i++) {\n var current = body[i],\n strip = this.accept(current);\n\n if (!strip) {\n continue;\n }\n\n var _isPrevWhitespace = isPrevWhitespace(body, i, isRoot),\n _isNextWhitespace = isNextWhitespace(body, i, isRoot),\n openStandalone = strip.openStandalone && _isPrevWhitespace,\n closeStandalone = strip.closeStandalone && _isNextWhitespace,\n inlineStandalone = strip.inlineStandalone && _isPrevWhitespace && _isNextWhitespace;\n\n if (strip.close) {\n omitRight(body, i, true);\n }\n if (strip.open) {\n omitLeft(body, i, true);\n }\n\n if (doStandalone && inlineStandalone) {\n omitRight(body, i);\n\n if (omitLeft(body, i)) {\n // If we are on a standalone node, save the indent info for partials\n if (current.type === 'PartialStatement') {\n // Pull out the whitespace from the final line\n current.indent = /([ \\t]+$)/.exec(body[i - 1].original)[1];\n }\n }\n }\n if (doStandalone && openStandalone) {\n omitRight((current.program || current.inverse).body);\n\n // Strip out the previous content node if it's whitespace only\n omitLeft(body, i);\n }\n if (doStandalone && closeStandalone) {\n // Always strip the next node\n omitRight(body, i);\n\n omitLeft((current.inverse || current.program).body);\n }\n }\n\n return program;\n };\n\n WhitespaceControl.prototype.BlockStatement = WhitespaceControl.prototype.DecoratorBlock = WhitespaceControl.prototype.PartialBlockStatement = function (block) {\n this.accept(block.program);\n this.accept(block.inverse);\n\n // Find the inverse program that is involed with whitespace stripping.\n var program = block.program || block.inverse,\n inverse = block.program && block.inverse,\n firstInverse = inverse,\n lastInverse = inverse;\n\n if (inverse && inverse.chained) {\n firstInverse = inverse.body[0].program;\n\n // Walk the inverse chain to find the last inverse that is actually in the chain.\n while (lastInverse.chained) {\n lastInverse = lastInverse.body[lastInverse.body.length - 1].program;\n }\n }\n\n var strip = {\n open: block.openStrip.open,\n close: block.closeStrip.close,\n\n // Determine the standalone candiacy. Basically flag our content as being possibly standalone\n // so our parent can determine if we actually are standalone\n openStandalone: isNextWhitespace(program.body),\n closeStandalone: isPrevWhitespace((firstInverse || program).body)\n };\n\n if (block.openStrip.close) {\n omitRight(program.body, null, true);\n }\n\n if (inverse) {\n var inverseStrip = block.inverseStrip;\n\n if (inverseStrip.open) {\n omitLeft(program.body, null, true);\n }\n\n if (inverseStrip.close) {\n omitRight(firstInverse.body, null, true);\n }\n if (block.closeStrip.open) {\n omitLeft(lastInverse.body, null, true);\n }\n\n // Find standalone else statments\n if (!this.options.ignoreStandalone && isPrevWhitespace(program.body) && isNextWhitespace(firstInverse.body)) {\n omitLeft(program.body);\n omitRight(firstInverse.body);\n }\n } else if (block.closeStrip.open) {\n omitLeft(program.body, null, true);\n }\n\n return strip;\n };\n\n WhitespaceControl.prototype.Decorator = WhitespaceControl.prototype.MustacheStatement = function (mustache) {\n return mustache.strip;\n };\n\n WhitespaceControl.prototype.PartialStatement = WhitespaceControl.prototype.CommentStatement = function (node) {\n /* istanbul ignore next */\n var strip = node.strip || {};\n return {\n inlineStandalone: true,\n open: strip.open,\n close: strip.close\n };\n };\n\n function isPrevWhitespace(body, i, isRoot) {\n if (i === undefined) {\n i = body.length;\n }\n\n // Nodes that end with newlines are considered whitespace (but are special\n // cased for strip operations)\n var prev = body[i - 1],\n sibling = body[i - 2];\n if (!prev) {\n return isRoot;\n }\n\n if (prev.type === 'ContentStatement') {\n return (sibling || !isRoot ? /\\r?\\n\\s*?$/ : /(^|\\r?\\n)\\s*?$/).test(prev.original);\n }\n }\n function isNextWhitespace(body, i, isRoot) {\n if (i === undefined) {\n i = -1;\n }\n\n var next = body[i + 1],\n sibling = body[i + 2];\n if (!next) {\n return isRoot;\n }\n\n if (next.type === 'ContentStatement') {\n return (sibling || !isRoot ? /^\\s*?\\r?\\n/ : /^\\s*?(\\r?\\n|$)/).test(next.original);\n }\n }\n\n // Marks the node to the right of the position as omitted.\n // I.e. {{foo}}' ' will mark the ' ' node as omitted.\n //\n // If i is undefined, then the first child will be marked as such.\n //\n // If mulitple is truthy then all whitespace will be stripped out until non-whitespace\n // content is met.\n function omitRight(body, i, multiple) {\n var current = body[i == null ? 0 : i + 1];\n if (!current || current.type !== 'ContentStatement' || !multiple && current.rightStripped) {\n return;\n }\n\n var original = current.value;\n current.value = current.value.replace(multiple ? /^\\s+/ : /^[ \\t]*\\r?\\n?/, '');\n current.rightStripped = current.value !== original;\n }\n\n // Marks the node to the left of the position as omitted.\n // I.e. ' '{{foo}} will mark the ' ' node as omitted.\n //\n // If i is undefined then the last child will be marked as such.\n //\n // If mulitple is truthy then all whitespace will be stripped out until non-whitespace\n // content is met.\n function omitLeft(body, i, multiple) {\n var current = body[i == null ? body.length - 1 : i - 1];\n if (!current || current.type !== 'ContentStatement' || !multiple && current.leftStripped) {\n return;\n }\n\n // We omit the last node if it's whitespace only and not preceeded by a non-content node.\n var original = current.value;\n current.value = current.value.replace(multiple ? /\\s+$/ : /[ \\t]+$/, '');\n current.leftStripped = current.value !== original;\n return current.leftStripped;\n }\n\n function validateClose(open, close) {\n close = close.path ? close.path.original : close;\n\n if (open.path.original !== close) {\n var errorNode = { loc: open.path.loc };\n\n throw new Exception(open.path.original + \" doesn't match \" + close, errorNode);\n }\n }\n\n function SourceLocation(source, locInfo) {\n this.source = source;\n this.start = {\n line: locInfo.first_line,\n column: locInfo.first_column\n };\n this.end = {\n line: locInfo.last_line,\n column: locInfo.last_column\n };\n }\n\n function id(token) {\n if (/^\\[.*\\]$/.test(token)) {\n return token.substr(1, token.length - 2);\n } else {\n return token;\n }\n }\n\n function stripFlags(open, close) {\n return {\n open: open.charAt(2) === '~',\n close: close.charAt(close.length - 3) === '~'\n };\n }\n\n function stripComment(comment) {\n return comment.replace(/^\\{\\{~?\\!-?-?/, '').replace(/-?-?~?\\}\\}$/, '');\n }\n\n function preparePath(data, parts, loc) {\n loc = this.locInfo(loc);\n\n var original = data ? '@' : '',\n dig = [],\n depth = 0;\n\n for (var i = 0, l = parts.length; i < l; i++) {\n var part = parts[i].part,\n\n // If we have [] syntax then we do not treat path references as operators,\n // i.e. foo.[this] resolves to approximately context.foo['this']\n isLiteral = parts[i].original !== part;\n original += (parts[i].separator || '') + part;\n\n if (!isLiteral && (part === '..' || part === '.' || part === 'this')) {\n if (dig.length > 0) {\n throw new Exception('Invalid path: ' + original, { loc: loc });\n } else if (part === '..') {\n depth++;\n }\n } else {\n dig.push(part);\n }\n }\n\n return {\n type: 'PathExpression',\n data: data,\n depth: depth,\n parts: dig,\n original: original,\n loc: loc\n };\n }\n\n function prepareMustache(path, params, hash, open, strip, locInfo) {\n // Must use charAt to support IE pre-10\n var escapeFlag = open.charAt(3) || open.charAt(2),\n escaped = escapeFlag !== '{' && escapeFlag !== '&';\n\n var decorator = /\\*/.test(open);\n return {\n type: decorator ? 'Decorator' : 'MustacheStatement',\n path: path,\n params: params,\n hash: hash,\n escaped: escaped,\n strip: strip,\n loc: this.locInfo(locInfo)\n };\n }\n\n function prepareRawBlock(openRawBlock, contents, close, locInfo) {\n validateClose(openRawBlock, close);\n\n locInfo = this.locInfo(locInfo);\n var program = {\n type: 'Program',\n body: contents,\n strip: {},\n loc: locInfo\n };\n\n return {\n type: 'BlockStatement',\n path: openRawBlock.path,\n params: openRawBlock.params,\n hash: openRawBlock.hash,\n program: program,\n openStrip: {},\n inverseStrip: {},\n closeStrip: {},\n loc: locInfo\n };\n }\n\n function prepareBlock(openBlock, program, inverseAndProgram, close, inverted, locInfo) {\n if (close && close.path) {\n validateClose(openBlock, close);\n }\n\n var decorator = /\\*/.test(openBlock.open);\n\n program.blockParams = openBlock.blockParams;\n\n var inverse = void 0,\n inverseStrip = void 0;\n\n if (inverseAndProgram) {\n if (decorator) {\n throw new Exception('Unexpected inverse block on decorator', inverseAndProgram);\n }\n\n if (inverseAndProgram.chain) {\n inverseAndProgram.program.body[0].closeStrip = close.strip;\n }\n\n inverseStrip = inverseAndProgram.strip;\n inverse = inverseAndProgram.program;\n }\n\n if (inverted) {\n inverted = inverse;\n inverse = program;\n program = inverted;\n }\n\n return {\n type: decorator ? 'DecoratorBlock' : 'BlockStatement',\n path: openBlock.path,\n params: openBlock.params,\n hash: openBlock.hash,\n program: program,\n inverse: inverse,\n openStrip: openBlock.strip,\n inverseStrip: inverseStrip,\n closeStrip: close && close.strip,\n loc: this.locInfo(locInfo)\n };\n }\n\n function prepareProgram(statements, loc) {\n if (!loc && statements.length) {\n var firstLoc = statements[0].loc,\n lastLoc = statements[statements.length - 1].loc;\n\n /* istanbul ignore else */\n if (firstLoc && lastLoc) {\n loc = {\n source: firstLoc.source,\n start: {\n line: firstLoc.start.line,\n column: firstLoc.start.column\n },\n end: {\n line: lastLoc.end.line,\n column: lastLoc.end.column\n }\n };\n }\n }\n\n return {\n type: 'Program',\n body: statements,\n strip: {},\n loc: loc\n };\n }\n\n function preparePartialBlock(open, program, close, locInfo) {\n validateClose(open, close);\n\n return {\n type: 'PartialBlockStatement',\n name: open.path,\n params: open.params,\n hash: open.hash,\n program: program,\n openStrip: open.strip,\n closeStrip: close && close.strip,\n loc: this.locInfo(locInfo)\n };\n }\n\n var Helpers = Object.freeze({\n SourceLocation: SourceLocation,\n id: id,\n stripFlags: stripFlags,\n stripComment: stripComment,\n preparePath: preparePath,\n prepareMustache: prepareMustache,\n prepareRawBlock: prepareRawBlock,\n prepareBlock: prepareBlock,\n prepareProgram: prepareProgram,\n preparePartialBlock: preparePartialBlock\n });\n\n function extend(obj /* , ...source */) {\n for (var i = 1; i < arguments.length; i++) {\n for (var key in arguments[i]) {\n if (Object.prototype.hasOwnProperty.call(arguments[i], key)) {\n obj[key] = arguments[i][key];\n }\n }\n }\n\n return obj;\n }\n\n var toString = Object.prototype.toString;\n\n // Sourced from lodash\n // https://github.com/bestiejs/lodash/blob/master/LICENSE.txt\n /* eslint-disable func-style */\n var isFunction = function (value) {\n return typeof value === 'function';\n };\n // fallback for older versions of Chrome and Safari\n /* istanbul ignore next */\n if (isFunction(/x/)) {\n isFunction = function (value) {\n return typeof value === 'function' && toString.call(value) === '[object Function]';\n };\n }\n /* eslint-enable func-style */\n\n /* istanbul ignore next */\n\n // Older IE versions do not directly support indexOf so we must implement our own, sadly.\n\n var yy = {};\n extend(yy, Helpers);\n\n function parse(input, options) {\n // Just return if an already-compiled AST was passed in.\n if (input.type === 'Program') {\n return input;\n }\n\n handlebars.yy = yy;\n\n // Altering the shared object here, but this is ok as parser is a sync operation\n yy.locInfo = function (locInfo) {\n return new yy.SourceLocation(options && options.srcName, locInfo);\n };\n\n var strip = new WhitespaceControl(options);\n return strip.accept(handlebars.parse(input));\n }\n\n exports.parser = handlebars;\n exports.parse = parse;\n});","/*global enifed */\nenifed('node-module', ['exports'], function(_exports) {\n var IS_NODE = typeof module === 'object' && typeof module.require === 'function';\n if (IS_NODE) {\n _exports.require = module.require;\n _exports.module = module;\n _exports.IS_NODE = IS_NODE;\n } else {\n _exports.require = null;\n _exports.module = null;\n _exports.IS_NODE = IS_NODE;\n }\n});","enifed(\"route-recognizer\", [\"exports\"], function (exports) {\n \"use strict\";\n\n var createObject = Object.create;\n function createMap() {\n var map = createObject(null);\n map[\"__\"] = undefined;\n delete map[\"__\"];\n return map;\n }\n\n var Target = function Target(path, matcher, delegate) {\n this.path = path;\n this.matcher = matcher;\n this.delegate = delegate;\n };\n Target.prototype.to = function to(target, callback) {\n var delegate = this.delegate;\n if (delegate && delegate.willAddRoute) {\n target = delegate.willAddRoute(this.matcher.target, target);\n }\n this.matcher.add(this.path, target);\n if (callback) {\n if (callback.length === 0) {\n throw new Error(\"You must have an argument in the function passed to `to`\");\n }\n this.matcher.addChild(this.path, target, callback, this.delegate);\n }\n };\n var Matcher = function Matcher(target) {\n this.routes = createMap();\n this.children = createMap();\n this.target = target;\n };\n Matcher.prototype.add = function add(path, target) {\n this.routes[path] = target;\n };\n Matcher.prototype.addChild = function addChild(path, target, callback, delegate) {\n var matcher = new Matcher(target);\n this.children[path] = matcher;\n var match = generateMatch(path, matcher, delegate);\n if (delegate && delegate.contextEntered) {\n delegate.contextEntered(target, match);\n }\n callback(match);\n };\n function generateMatch(startingPath, matcher, delegate) {\n function match(path, callback) {\n var fullPath = startingPath + path;\n if (callback) {\n callback(generateMatch(fullPath, matcher, delegate));\n } else {\n return new Target(fullPath, matcher, delegate);\n }\n }\n\n return match;\n }\n function addRoute(routeArray, path, handler) {\n var len = 0;\n for (var i = 0; i < routeArray.length; i++) {\n len += routeArray[i].path.length;\n }\n path = path.substr(len);\n var route = { path: path, handler: handler };\n routeArray.push(route);\n }\n function eachRoute(baseRoute, matcher, callback, binding) {\n var routes = matcher.routes;\n var paths = Object.keys(routes);\n for (var i = 0; i < paths.length; i++) {\n var path = paths[i];\n var routeArray = baseRoute.slice();\n addRoute(routeArray, path, routes[path]);\n var nested = matcher.children[path];\n if (nested) {\n eachRoute(routeArray, nested, callback, binding);\n } else {\n callback.call(binding, routeArray);\n }\n }\n }\n var map = function (callback, addRouteCallback) {\n var matcher = new Matcher();\n callback(generateMatch(\"\", matcher, this.delegate));\n eachRoute([], matcher, function (routes) {\n if (addRouteCallback) {\n addRouteCallback(this, routes);\n } else {\n this.add(routes);\n }\n }, this);\n };\n\n // Normalizes percent-encoded values in `path` to upper-case and decodes percent-encoded\n // values that are not reserved (i.e., unicode characters, emoji, etc). The reserved\n // chars are \"/\" and \"%\".\n // Safe to call multiple times on the same path.\n // Normalizes percent-encoded values in `path` to upper-case and decodes percent-encoded\n function normalizePath(path) {\n return path.split(\"/\").map(normalizeSegment).join(\"/\");\n }\n // We want to ensure the characters \"%\" and \"/\" remain in percent-encoded\n // form when normalizing paths, so replace them with their encoded form after\n // decoding the rest of the path\n var SEGMENT_RESERVED_CHARS = /%|\\//g;\n function normalizeSegment(segment) {\n if (segment.length < 3 || segment.indexOf(\"%\") === -1) {\n return segment;\n }\n return decodeURIComponent(segment).replace(SEGMENT_RESERVED_CHARS, encodeURIComponent);\n }\n // We do not want to encode these characters when generating dynamic path segments\n // See https://tools.ietf.org/html/rfc3986#section-3.3\n // sub-delims: \"!\", \"$\", \"&\", \"'\", \"(\", \")\", \"*\", \"+\", \",\", \";\", \"=\"\n // others allowed by RFC 3986: \":\", \"@\"\n //\n // First encode the entire path segment, then decode any of the encoded special chars.\n //\n // The chars \"!\", \"'\", \"(\", \")\", \"*\" do not get changed by `encodeURIComponent`,\n // so the possible encoded chars are:\n // ['%24', '%26', '%2B', '%2C', '%3B', '%3D', '%3A', '%40'].\n var PATH_SEGMENT_ENCODINGS = /%(?:2(?:4|6|B|C)|3(?:B|D|A)|40)/g;\n function encodePathSegment(str) {\n return encodeURIComponent(str).replace(PATH_SEGMENT_ENCODINGS, decodeURIComponent);\n }\n\n var escapeRegex = /(\\/|\\.|\\*|\\+|\\?|\\||\\(|\\)|\\[|\\]|\\{|\\}|\\\\)/g;\n var isArray = Array.isArray;\n var hasOwnProperty = Object.prototype.hasOwnProperty;\n function getParam(params, key) {\n if (typeof params !== \"object\" || params === null) {\n throw new Error(\"You must pass an object as the second argument to `generate`.\");\n }\n if (!hasOwnProperty.call(params, key)) {\n throw new Error(\"You must provide param `\" + key + \"` to `generate`.\");\n }\n var value = params[key];\n var str = typeof value === \"string\" ? value : \"\" + value;\n if (str.length === 0) {\n throw new Error(\"You must provide a param `\" + key + \"`.\");\n }\n return str;\n }\n var eachChar = [];\n eachChar[0 /* Static */] = function (segment, currentState) {\n var state = currentState;\n var value = segment.value;\n for (var i = 0; i < value.length; i++) {\n var ch = value.charCodeAt(i);\n state = state.put(ch, false, false);\n }\n return state;\n };\n eachChar[1 /* Dynamic */] = function (_, currentState) {\n return currentState.put(47 /* SLASH */, true, true);\n };\n eachChar[2 /* Star */] = function (_, currentState) {\n return currentState.put(-1 /* ANY */, false, true);\n };\n eachChar[4 /* Epsilon */] = function (_, currentState) {\n return currentState;\n };\n var regex = [];\n regex[0 /* Static */] = function (segment) {\n return segment.value.replace(escapeRegex, \"\\\\$1\");\n };\n regex[1 /* Dynamic */] = function () {\n return \"([^/]+)\";\n };\n regex[2 /* Star */] = function () {\n return \"(.+)\";\n };\n regex[4 /* Epsilon */] = function () {\n return \"\";\n };\n var generate = [];\n generate[0 /* Static */] = function (segment) {\n return segment.value;\n };\n generate[1 /* Dynamic */] = function (segment, params) {\n var value = getParam(params, segment.value);\n if (RouteRecognizer.ENCODE_AND_DECODE_PATH_SEGMENTS) {\n return encodePathSegment(value);\n } else {\n return value;\n }\n };\n generate[2 /* Star */] = function (segment, params) {\n return getParam(params, segment.value);\n };\n generate[4 /* Epsilon */] = function () {\n return \"\";\n };\n var EmptyObject = Object.freeze({});\n var EmptyArray = Object.freeze([]);\n // The `names` will be populated with the paramter name for each dynamic/star\n // segment. `shouldDecodes` will be populated with a boolean for each dyanamic/star\n // segment, indicating whether it should be decoded during recognition.\n function parse(segments, route, types) {\n // normalize route as not starting with a \"/\". Recognition will\n // also normalize.\n if (route.length > 0 && route.charCodeAt(0) === 47 /* SLASH */) {\n route = route.substr(1);\n }\n var parts = route.split(\"/\");\n var names = undefined;\n var shouldDecodes = undefined;\n for (var i = 0; i < parts.length; i++) {\n var part = parts[i];\n var flags = 0;\n var type = 0;\n if (part === \"\") {\n type = 4 /* Epsilon */;\n } else if (part.charCodeAt(0) === 58 /* COLON */) {\n type = 1 /* Dynamic */;\n } else if (part.charCodeAt(0) === 42 /* STAR */) {\n type = 2 /* Star */;\n } else {\n type = 0 /* Static */;\n }\n flags = 2 << type;\n if (flags & 12 /* Named */) {\n part = part.slice(1);\n names = names || [];\n names.push(part);\n shouldDecodes = shouldDecodes || [];\n shouldDecodes.push((flags & 4 /* Decoded */) !== 0);\n }\n if (flags & 14 /* Counted */) {\n types[type]++;\n }\n segments.push({\n type: type,\n value: normalizeSegment(part)\n });\n }\n return {\n names: names || EmptyArray,\n shouldDecodes: shouldDecodes || EmptyArray\n };\n }\n function isEqualCharSpec(spec, char, negate) {\n return spec.char === char && spec.negate === negate;\n }\n // A State has a character specification and (`charSpec`) and a list of possible\n // subsequent states (`nextStates`).\n //\n // If a State is an accepting state, it will also have several additional\n // properties:\n //\n // * `regex`: A regular expression that is used to extract parameters from paths\n // that reached this accepting state.\n // * `handlers`: Information on how to convert the list of captures into calls\n // to registered handlers with the specified parameters\n // * `types`: How many static, dynamic or star segments in this route. Used to\n // decide which route to use if multiple registered routes match a path.\n //\n // Currently, State is implemented naively by looping over `nextStates` and\n // comparing a character specification against a character. A more efficient\n // implementation would use a hash of keys pointing at one or more next states.\n var State = function State(states, id, char, negate, repeat) {\n this.states = states;\n this.id = id;\n this.char = char;\n this.negate = negate;\n this.nextStates = repeat ? id : null;\n this.pattern = \"\";\n this._regex = undefined;\n this.handlers = undefined;\n this.types = undefined;\n };\n State.prototype.regex = function regex$1() {\n if (!this._regex) {\n this._regex = new RegExp(this.pattern);\n }\n return this._regex;\n };\n State.prototype.get = function get(char, negate) {\n var this$1 = this;\n\n var nextStates = this.nextStates;\n if (nextStates === null) {\n return;\n }\n if (isArray(nextStates)) {\n for (var i = 0; i < nextStates.length; i++) {\n var child = this$1.states[nextStates[i]];\n if (isEqualCharSpec(child, char, negate)) {\n return child;\n }\n }\n } else {\n var child$1 = this.states[nextStates];\n if (isEqualCharSpec(child$1, char, negate)) {\n return child$1;\n }\n }\n };\n State.prototype.put = function put(char, negate, repeat) {\n var state;\n // If the character specification already exists in a child of the current\n // state, just return that state.\n if (state = this.get(char, negate)) {\n return state;\n }\n // Make a new state for the character spec\n var states = this.states;\n state = new State(states, states.length, char, negate, repeat);\n states[states.length] = state;\n // Insert the new state as a child of the current state\n if (this.nextStates == null) {\n this.nextStates = state.id;\n } else if (isArray(this.nextStates)) {\n this.nextStates.push(state.id);\n } else {\n this.nextStates = [this.nextStates, state.id];\n }\n // Return the new state\n return state;\n };\n // Find a list of child states matching the next character\n State.prototype.match = function match(ch) {\n var this$1 = this;\n\n var nextStates = this.nextStates;\n if (!nextStates) {\n return [];\n }\n var returned = [];\n if (isArray(nextStates)) {\n for (var i = 0; i < nextStates.length; i++) {\n var child = this$1.states[nextStates[i]];\n if (isMatch(child, ch)) {\n returned.push(child);\n }\n }\n } else {\n var child$1 = this.states[nextStates];\n if (isMatch(child$1, ch)) {\n returned.push(child$1);\n }\n }\n return returned;\n };\n function isMatch(spec, char) {\n return spec.negate ? spec.char !== char && spec.char !== -1 /* ANY */ : spec.char === char || spec.char === -1 /* ANY */;\n }\n // This is a somewhat naive strategy, but should work in a lot of cases\n // A better strategy would properly resolve /posts/:id/new and /posts/edit/:id.\n //\n // This strategy generally prefers more static and less dynamic matching.\n // Specifically, it\n //\n // * prefers fewer stars to more, then\n // * prefers using stars for less of the match to more, then\n // * prefers fewer dynamic segments to more, then\n // * prefers more static segments to more\n function sortSolutions(states) {\n return states.sort(function (a, b) {\n var ref = a.types || [0, 0, 0];\n var astatics = ref[0];\n var adynamics = ref[1];\n var astars = ref[2];\n var ref$1 = b.types || [0, 0, 0];\n var bstatics = ref$1[0];\n var bdynamics = ref$1[1];\n var bstars = ref$1[2];\n if (astars !== bstars) {\n return astars - bstars;\n }\n if (astars) {\n if (astatics !== bstatics) {\n return bstatics - astatics;\n }\n if (adynamics !== bdynamics) {\n return bdynamics - adynamics;\n }\n }\n if (adynamics !== bdynamics) {\n return adynamics - bdynamics;\n }\n if (astatics !== bstatics) {\n return bstatics - astatics;\n }\n return 0;\n });\n }\n function recognizeChar(states, ch) {\n var nextStates = [];\n for (var i = 0, l = states.length; i < l; i++) {\n var state = states[i];\n nextStates = nextStates.concat(state.match(ch));\n }\n return nextStates;\n }\n var RecognizeResults = function RecognizeResults(queryParams) {\n this.length = 0;\n this.queryParams = queryParams || {};\n };\n\n RecognizeResults.prototype.splice = Array.prototype.splice;\n RecognizeResults.prototype.slice = Array.prototype.slice;\n RecognizeResults.prototype.push = Array.prototype.push;\n function findHandler(state, originalPath, queryParams) {\n var handlers = state.handlers;\n var regex = state.regex();\n if (!regex || !handlers) {\n throw new Error(\"state not initialized\");\n }\n var captures = originalPath.match(regex);\n var currentCapture = 1;\n var result = new RecognizeResults(queryParams);\n result.length = handlers.length;\n for (var i = 0; i < handlers.length; i++) {\n var handler = handlers[i];\n var names = handler.names;\n var shouldDecodes = handler.shouldDecodes;\n var params = EmptyObject;\n var isDynamic = false;\n if (names !== EmptyArray && shouldDecodes !== EmptyArray) {\n for (var j = 0; j < names.length; j++) {\n isDynamic = true;\n var name = names[j];\n var capture = captures && captures[currentCapture++];\n if (params === EmptyObject) {\n params = {};\n }\n if (RouteRecognizer.ENCODE_AND_DECODE_PATH_SEGMENTS && shouldDecodes[j]) {\n params[name] = capture && decodeURIComponent(capture);\n } else {\n params[name] = capture;\n }\n }\n }\n result[i] = {\n handler: handler.handler,\n params: params,\n isDynamic: isDynamic\n };\n }\n return result;\n }\n function decodeQueryParamPart(part) {\n // http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1\n part = part.replace(/\\+/gm, \"%20\");\n var result;\n try {\n result = decodeURIComponent(part);\n } catch (error) {\n result = \"\";\n }\n return result;\n }\n var RouteRecognizer = function RouteRecognizer() {\n this.names = createMap();\n var states = [];\n var state = new State(states, 0, -1 /* ANY */, true, false);\n states[0] = state;\n this.states = states;\n this.rootState = state;\n };\n RouteRecognizer.prototype.add = function add(routes, options) {\n var currentState = this.rootState;\n var pattern = \"^\";\n var types = [0, 0, 0];\n var handlers = new Array(routes.length);\n var allSegments = [];\n var isEmpty = true;\n var j = 0;\n for (var i = 0; i < routes.length; i++) {\n var route = routes[i];\n var ref = parse(allSegments, route.path, types);\n var names = ref.names;\n var shouldDecodes = ref.shouldDecodes;\n // preserve j so it points to the start of newly added segments\n for (; j < allSegments.length; j++) {\n var segment = allSegments[j];\n if (segment.type === 4 /* Epsilon */) {\n continue;\n }\n isEmpty = false;\n // Add a \"/\" for the new segment\n currentState = currentState.put(47 /* SLASH */, false, false);\n pattern += \"/\";\n // Add a representation of the segment to the NFA and regex\n currentState = eachChar[segment.type](segment, currentState);\n pattern += regex[segment.type](segment);\n }\n handlers[i] = {\n handler: route.handler,\n names: names,\n shouldDecodes: shouldDecodes\n };\n }\n if (isEmpty) {\n currentState = currentState.put(47 /* SLASH */, false, false);\n pattern += \"/\";\n }\n currentState.handlers = handlers;\n currentState.pattern = pattern + \"$\";\n currentState.types = types;\n var name;\n if (typeof options === \"object\" && options !== null && options.as) {\n name = options.as;\n }\n if (name) {\n // if (this.names[name]) {\n // throw new Error(\"You may not add a duplicate route named `\" + name + \"`.\");\n // }\n this.names[name] = {\n segments: allSegments,\n handlers: handlers\n };\n }\n };\n RouteRecognizer.prototype.handlersFor = function handlersFor(name) {\n var route = this.names[name];\n if (!route) {\n throw new Error(\"There is no route named \" + name);\n }\n var result = new Array(route.handlers.length);\n for (var i = 0; i < route.handlers.length; i++) {\n var handler = route.handlers[i];\n result[i] = handler;\n }\n return result;\n };\n RouteRecognizer.prototype.hasRoute = function hasRoute(name) {\n return !!this.names[name];\n };\n RouteRecognizer.prototype.generate = function generate$1(name, params) {\n var route = this.names[name];\n var output = \"\";\n if (!route) {\n throw new Error(\"There is no route named \" + name);\n }\n var segments = route.segments;\n for (var i = 0; i < segments.length; i++) {\n var segment = segments[i];\n if (segment.type === 4 /* Epsilon */) {\n continue;\n }\n output += \"/\";\n output += generate[segment.type](segment, params);\n }\n if (output.charAt(0) !== \"/\") {\n output = \"/\" + output;\n }\n if (params && params.queryParams) {\n output += this.generateQueryString(params.queryParams);\n }\n return output;\n };\n RouteRecognizer.prototype.generateQueryString = function generateQueryString(params) {\n var pairs = [];\n var keys = Object.keys(params);\n keys.sort();\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n var value = params[key];\n if (value == null) {\n continue;\n }\n var pair = encodeURIComponent(key);\n if (isArray(value)) {\n for (var j = 0; j < value.length; j++) {\n var arrayPair = key + \"[]\" + \"=\" + encodeURIComponent(value[j]);\n pairs.push(arrayPair);\n }\n } else {\n pair += \"=\" + encodeURIComponent(value);\n pairs.push(pair);\n }\n }\n if (pairs.length === 0) {\n return \"\";\n }\n return \"?\" + pairs.join(\"&\");\n };\n RouteRecognizer.prototype.parseQueryString = function parseQueryString(queryString) {\n var pairs = queryString.split(\"&\");\n var queryParams = {};\n for (var i = 0; i < pairs.length; i++) {\n var pair = pairs[i].split(\"=\"),\n key = decodeQueryParamPart(pair[0]),\n keyLength = key.length,\n isArray = false,\n value = void 0;\n if (pair.length === 1) {\n value = \"true\";\n } else {\n // Handle arrays\n if (keyLength > 2 && key.slice(keyLength - 2) === \"[]\") {\n isArray = true;\n key = key.slice(0, keyLength - 2);\n if (!queryParams[key]) {\n queryParams[key] = [];\n }\n }\n value = pair[1] ? decodeQueryParamPart(pair[1]) : \"\";\n }\n if (isArray) {\n queryParams[key].push(value);\n } else {\n queryParams[key] = value;\n }\n }\n return queryParams;\n };\n RouteRecognizer.prototype.recognize = function recognize(path) {\n var results;\n var states = [this.rootState];\n var queryParams = {};\n var isSlashDropped = false;\n var hashStart = path.indexOf(\"#\");\n if (hashStart !== -1) {\n path = path.substr(0, hashStart);\n }\n var queryStart = path.indexOf(\"?\");\n if (queryStart !== -1) {\n var queryString = path.substr(queryStart + 1, path.length);\n path = path.substr(0, queryStart);\n queryParams = this.parseQueryString(queryString);\n }\n if (path.charAt(0) !== \"/\") {\n path = \"/\" + path;\n }\n var originalPath = path;\n if (RouteRecognizer.ENCODE_AND_DECODE_PATH_SEGMENTS) {\n path = normalizePath(path);\n } else {\n path = decodeURI(path);\n originalPath = decodeURI(originalPath);\n }\n var pathLen = path.length;\n if (pathLen > 1 && path.charAt(pathLen - 1) === \"/\") {\n path = path.substr(0, pathLen - 1);\n originalPath = originalPath.substr(0, originalPath.length - 1);\n isSlashDropped = true;\n }\n for (var i = 0; i < path.length; i++) {\n states = recognizeChar(states, path.charCodeAt(i));\n if (!states.length) {\n break;\n }\n }\n var solutions = [];\n for (var i$1 = 0; i$1 < states.length; i$1++) {\n if (states[i$1].handlers) {\n solutions.push(states[i$1]);\n }\n }\n states = sortSolutions(solutions);\n var state = solutions[0];\n if (state && state.handlers) {\n // if a trailing slash was dropped and a star segment is the last segment\n // specified, put the trailing slash back\n if (isSlashDropped && state.pattern && state.pattern.slice(-5) === \"(.+)$\") {\n originalPath = originalPath + \"/\";\n }\n results = findHandler(state, originalPath, queryParams);\n }\n return results;\n };\n RouteRecognizer.VERSION = \"0.3.3\";\n // Set to false to opt-out of encoding and decoding path segments.\n // See https://github.com/tildeio/route-recognizer/pull/55\n RouteRecognizer.ENCODE_AND_DECODE_PATH_SEGMENTS = true;\n RouteRecognizer.Normalizer = {\n normalizeSegment: normalizeSegment, normalizePath: normalizePath, encodePathSegment: encodePathSegment\n };\n RouteRecognizer.prototype.map = map;\n\n exports.default = RouteRecognizer;\n});","enifed('router', ['exports', 'ember-babel', 'route-recognizer', 'rsvp'], function (exports, _emberBabel, _routeRecognizer, _rsvp) {\n 'use strict';\n\n exports.Transition = undefined;\n\n\n var slice = Array.prototype.slice;\n var hasOwnProperty = Object.prototype.hasOwnProperty;\n\n /**\n Determines if an object is Promise by checking if it is \"thenable\".\n **/\n function isPromise(obj) {\n return (typeof obj === 'object' && obj !== null || typeof obj === 'function') && typeof obj.then === 'function';\n }\n\n function merge(hash, other) {\n for (var prop in other) {\n if (hasOwnProperty.call(other, prop)) {\n hash[prop] = other[prop];\n }\n }\n }\n\n /**\n @private\n \n Extracts query params from the end of an array\n **/\n function extractQueryParams(array) {\n var len = array && array.length,\n head = void 0,\n queryParams = void 0;\n\n if (len && len > 0 && array[len - 1] && array[len - 1].hasOwnProperty('queryParams')) {\n queryParams = array[len - 1].queryParams;\n head = slice.call(array, 0, len - 1);\n return [head, queryParams];\n } else {\n return [array, null];\n }\n }\n\n /**\n @private\n \n Coerces query param properties and array elements into strings.\n **/\n function coerceQueryParamsToString(queryParams) {\n for (var key in queryParams) {\n if (typeof queryParams[key] === 'number') {\n queryParams[key] = '' + queryParams[key];\n } else if (Array.isArray(queryParams[key])) {\n for (var i = 0, l = queryParams[key].length; i < l; i++) {\n queryParams[key][i] = '' + queryParams[key][i];\n }\n }\n }\n }\n /**\n @private\n */\n function _log(router, sequence, msg) {\n if (!router.log) {\n return;\n }\n\n if (arguments.length === 3) {\n router.log('Transition #' + sequence + ': ' + msg);\n } else {\n msg = sequence;\n router.log(msg);\n }\n }\n\n function isParam(object) {\n return typeof object === 'string' || object instanceof String || typeof object === 'number' || object instanceof Number;\n }\n\n function forEach(array, callback) {\n for (var i = 0, l = array.length; i < l && false !== callback(array[i]); i++) {\n // empty intentionally\n }\n }\n\n function _trigger(router, handlerInfos, ignoreFailure, args) {\n if (router.triggerEvent) {\n router.triggerEvent(handlerInfos, ignoreFailure, args);\n return;\n }\n\n var name = args.shift();\n\n if (!handlerInfos) {\n if (ignoreFailure) {\n return;\n }\n throw new Error(\"Could not trigger event '\" + name + \"'. There are no active handlers\");\n }\n\n var eventWasHandled = false;\n\n function delayedEvent(name, args, handler) {\n handler.events[name].apply(handler, args);\n }\n\n for (var i = handlerInfos.length - 1; i >= 0; i--) {\n var handlerInfo = handlerInfos[i],\n handler = handlerInfo.handler;\n\n // If there is no handler, it means the handler hasn't resolved yet which\n // means that we should trigger the event later when the handler is available\n if (!handler) {\n handlerInfo.handlerPromise.then(delayedEvent.bind(null, name, args));\n continue;\n }\n\n if (handler.events && handler.events[name]) {\n if (handler.events[name].apply(handler, args) === true) {\n eventWasHandled = true;\n } else {\n return;\n }\n }\n }\n\n // In the case that we got an UnrecognizedURLError as an event with no handler,\n // let it bubble up\n if (name === 'error' && args[0].name === 'UnrecognizedURLError') {\n throw args[0];\n } else if (!eventWasHandled && !ignoreFailure) {\n throw new Error(\"Nothing handled the event '\" + name + \"'.\");\n }\n }\n\n function getChangelist(oldObject, newObject) {\n var key = void 0;\n var results = {\n all: {},\n changed: {},\n removed: {}\n };\n\n merge(results.all, newObject);\n\n var didChange = false;\n coerceQueryParamsToString(oldObject);\n coerceQueryParamsToString(newObject);\n\n // Calculate removals\n for (key in oldObject) {\n if (hasOwnProperty.call(oldObject, key)) {\n if (!hasOwnProperty.call(newObject, key)) {\n didChange = true;\n results.removed[key] = oldObject[key];\n }\n }\n }\n\n // Calculate changes\n for (key in newObject) {\n if (hasOwnProperty.call(newObject, key)) {\n if (Array.isArray(oldObject[key]) && Array.isArray(newObject[key])) {\n if (oldObject[key].length !== newObject[key].length) {\n results.changed[key] = newObject[key];\n didChange = true;\n } else {\n for (var i = 0, l = oldObject[key].length; i < l; i++) {\n if (oldObject[key][i] !== newObject[key][i]) {\n results.changed[key] = newObject[key];\n didChange = true;\n }\n }\n }\n } else {\n if (oldObject[key] !== newObject[key]) {\n results.changed[key] = newObject[key];\n didChange = true;\n }\n }\n }\n }\n\n return didChange && results;\n }\n\n function _promiseLabel(label) {\n return 'Router: ' + label;\n }\n\n function resolveHook(obj, hookName) {\n if (!obj) {\n return;\n }\n var underscored = '_' + hookName;\n return obj[underscored] && underscored || obj[hookName] && hookName;\n }\n\n function callHook(obj, _hookName, arg1, arg2) {\n var hookName = resolveHook(obj, _hookName);\n return hookName && obj[hookName].call(obj, arg1, arg2);\n }\n\n function applyHook(obj, _hookName, args) {\n var hookName = resolveHook(obj, _hookName);\n if (hookName) {\n if (args.length === 0) {\n return obj[hookName].call(obj);\n } else if (args.length === 1) {\n return obj[hookName].call(obj, args[0]);\n } else if (args.length === 2) {\n return obj[hookName].call(obj, args[0], args[1]);\n } else {\n return obj[hookName].apply(obj, args);\n }\n }\n }\n\n function TransitionState() {\n this.handlerInfos = [];\n this.queryParams = {};\n this.params = {};\n }\n\n TransitionState.prototype = {\n promiseLabel: function (label) {\n var targetName = '';\n forEach(this.handlerInfos, function (handlerInfo) {\n if (targetName !== '') {\n targetName += '.';\n }\n targetName += handlerInfo.name;\n });\n return _promiseLabel(\"'\" + targetName + \"': \" + label);\n },\n\n resolve: function (shouldContinue, payload) {\n // First, calculate params for this state. This is useful\n // information to provide to the various route hooks.\n var params = this.params;\n forEach(this.handlerInfos, function (handlerInfo) {\n params[handlerInfo.name] = handlerInfo.params || {};\n });\n\n payload = payload || {};\n payload.resolveIndex = 0;\n\n var currentState = this;\n var wasAborted = false;\n\n // The prelude RSVP.resolve() asyncs us into the promise land.\n return _rsvp.Promise.resolve(null, this.promiseLabel('Start transition')).then(resolveOneHandlerInfo, null, this.promiseLabel('Resolve handler')).catch(handleError, this.promiseLabel('Handle error'));\n\n function innerShouldContinue() {\n return _rsvp.Promise.resolve(shouldContinue(), currentState.promiseLabel('Check if should continue')).catch(function (reason) {\n // We distinguish between errors that occurred\n // during resolution (e.g. before\"Model/model/afterModel),\n // and aborts due to a rejecting promise from shouldContinue().\n wasAborted = true;\n return _rsvp.Promise.reject(reason);\n }, currentState.promiseLabel('Handle abort'));\n }\n\n function handleError(error) {\n // This is the only possible\n // reject value of TransitionState#resolve\n var handlerInfos = currentState.handlerInfos;\n var errorHandlerIndex = payload.resolveIndex >= handlerInfos.length ? handlerInfos.length - 1 : payload.resolveIndex;\n return _rsvp.Promise.reject({\n error: error,\n handlerWithError: currentState.handlerInfos[errorHandlerIndex].handler,\n wasAborted: wasAborted,\n state: currentState\n });\n }\n\n function proceed(resolvedHandlerInfo) {\n var wasAlreadyResolved = currentState.handlerInfos[payload.resolveIndex].isResolved;\n\n // Swap the previously unresolved handlerInfo with\n // the resolved handlerInfo\n currentState.handlerInfos[payload.resolveIndex++] = resolvedHandlerInfo;\n\n if (!wasAlreadyResolved) {\n // Call the redirect hook. The reason we call it here\n // vs. afterModel is so that redirects into child\n // routes don't re-run the model hooks for this\n // already-resolved route.\n var handler = resolvedHandlerInfo.handler;\n callHook(handler, 'redirect', resolvedHandlerInfo.context, payload);\n }\n\n // Proceed after ensuring that the redirect hook\n // didn't abort this transition by transitioning elsewhere.\n return innerShouldContinue().then(resolveOneHandlerInfo, null, currentState.promiseLabel('Resolve handler'));\n }\n\n function resolveOneHandlerInfo() {\n if (payload.resolveIndex === currentState.handlerInfos.length) {\n // This is is the only possible\n // fulfill value of TransitionState#resolve\n return {\n error: null,\n state: currentState\n };\n }\n\n var handlerInfo = currentState.handlerInfos[payload.resolveIndex];\n\n return handlerInfo.resolve(innerShouldContinue, payload).then(proceed, null, currentState.promiseLabel('Proceed'));\n }\n }\n };\n\n function TransitionAbortedError(message) {\n if (!(this instanceof TransitionAbortedError)) {\n return new TransitionAbortedError(message);\n }\n\n var error = Error.call(this, message);\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, TransitionAbortedError);\n } else {\n this.stack = error.stack;\n }\n\n this.description = error.description;\n this.fileName = error.fileName;\n this.lineNumber = error.lineNumber;\n this.message = error.message || 'TransitionAborted';\n this.name = 'TransitionAborted';\n this.number = error.number;\n this.code = error.code;\n }\n\n TransitionAbortedError.prototype = Object.create(Error.prototype);\n\n /**\n A Transition is a thennable (a promise-like object) that represents\n an attempt to transition to another route. It can be aborted, either\n explicitly via `abort` or by attempting another transition while a\n previous one is still underway. An aborted transition can also\n be `retry()`d later.\n \n @class Transition\n @constructor\n @param {Object} router\n @param {Object} intent\n @param {Object} state\n @param {Object} error\n @private\n */\n\n var Transition = function () {\n function Transition(router, intent, state, error, previousTransition) {\n var _this = this;\n\n (0, _emberBabel.classCallCheck)(this, Transition);\n\n this.state = state || router.state;\n this.intent = intent;\n this.router = router;\n this.data = this.intent && this.intent.data || {};\n this.resolvedModels = {};\n this.queryParams = {};\n this.promise = undefined;\n this.error = undefined;\n this.params = undefined;\n this.handlerInfos = undefined;\n this.targetName = undefined;\n this.pivotHandler = undefined;\n this.sequence = undefined;\n this.isAborted = false;\n this.isActive = true;\n this.urlMethod = 'update';\n this.resolveIndex = 0;\n this.queryParamsOnly = false;\n this.isTransition = true;\n\n if (error) {\n this.promise = _rsvp.Promise.reject(error);\n this.error = error;\n return;\n }\n\n // if you're doing multiple redirects, need the new transition to know if it\n // is actually part of the first transition or not. Any further redirects\n // in the initial transition also need to know if they are part of the\n // initial transition\n this.isCausedByAbortingTransition = !!previousTransition;\n this.isCausedByInitialTransition = previousTransition && (previousTransition.isCausedByInitialTransition || previousTransition.sequence === 0);\n\n if (state) {\n this.params = state.params;\n this.queryParams = state.queryParams;\n this.handlerInfos = state.handlerInfos;\n\n var len = state.handlerInfos.length;\n if (len) {\n this.targetName = state.handlerInfos[len - 1].name;\n }\n\n for (var i = 0; i < len; ++i) {\n var handlerInfo = state.handlerInfos[i];\n\n // TODO: this all seems hacky\n if (!handlerInfo.isResolved) {\n break;\n }\n this.pivotHandler = handlerInfo.handler;\n }\n\n this.sequence = router.currentSequence++;\n this.promise = state.resolve(function () {\n if (_this.isAborted) {\n return _rsvp.Promise.reject(undefined, _promiseLabel('Transition aborted - reject'));\n }\n }, this).catch(function (result) {\n if (result.wasAborted || _this.isAborted) {\n return _rsvp.Promise.reject(logAbort(_this));\n } else {\n _this.trigger('error', result.error, _this, result.handlerWithError);\n _this.abort();\n return _rsvp.Promise.reject(result.error);\n }\n }, _promiseLabel('Handle Abort'));\n } else {\n this.promise = _rsvp.Promise.resolve(this.state);\n this.params = {};\n }\n }\n\n Transition.prototype.isExiting = function isExiting(handler) {\n var handlerInfos = this.handlerInfos;\n for (var i = 0, len = handlerInfos.length; i < len; ++i) {\n var handlerInfo = handlerInfos[i];\n if (handlerInfo.name === handler || handlerInfo.handler === handler) {\n return false;\n }\n }\n return true;\n };\n\n Transition.prototype.then = function then(onFulfilled, onRejected, label) {\n return this.promise.then(onFulfilled, onRejected, label);\n };\n\n Transition.prototype.catch = function _catch(onRejection, label) {\n return this.promise.catch(onRejection, label);\n };\n\n Transition.prototype.finally = function _finally(callback, label) {\n return this.promise.finally(callback, label);\n };\n\n Transition.prototype.abort = function abort() {\n if (this.isAborted) {\n return this;\n }\n _log(this.router, this.sequence, this.targetName + ': transition was aborted');\n this.intent.preTransitionState = this.router.state;\n this.isAborted = true;\n this.isActive = false;\n this.router.activeTransition = null;\n return this;\n };\n\n Transition.prototype.retry = function retry() {\n // TODO: add tests for merged state retry()s\n this.abort();\n var newTransition = this.router.transitionByIntent(this.intent, false);\n\n // inheriting a `null` urlMethod is not valid\n // the urlMethod is only set to `null` when\n // the transition is initiated *after* the url\n // has been updated (i.e. `router.handleURL`)\n //\n // in that scenario, the url method cannot be\n // inherited for a new transition because then\n // the url would not update even though it should\n if (this.urlMethod !== null) {\n newTransition.method(this.urlMethod);\n }\n return newTransition;\n };\n\n Transition.prototype.method = function method(_method) {\n this.urlMethod = _method;\n return this;\n };\n\n Transition.prototype.trigger = function trigger(ignoreFailure) {\n var args = slice.call(arguments);\n if (typeof ignoreFailure === 'boolean') {\n args.shift();\n } else {\n // Throw errors on unhandled trigger events by default\n ignoreFailure = false;\n }\n _trigger(this.router, this.state.handlerInfos.slice(0, this.resolveIndex + 1), ignoreFailure, args);\n };\n\n Transition.prototype.followRedirects = function followRedirects() {\n var router = this.router;\n return this.promise.catch(function (reason) {\n if (router.activeTransition) {\n return router.activeTransition.followRedirects();\n }\n return _rsvp.Promise.reject(reason);\n });\n };\n\n Transition.prototype.toString = function toString() {\n return 'Transition (sequence ' + this.sequence + ')';\n };\n\n Transition.prototype.log = function log(message) {\n _log(this.router, this.sequence, message);\n };\n\n return Transition;\n }();\n\n // Alias 'trigger' as 'send'\n Transition.prototype.send = Transition.prototype.trigger;\n\n /**\n @private\n \n Logs and returns an instance of TransitionAborted.\n */\n function logAbort(transition) {\n _log(transition.router, transition.sequence, 'detected abort.');\n return new TransitionAbortedError();\n }\n\n var TransitionIntent = function TransitionIntent() {\n (0, _emberBabel.classCallCheck)(this, TransitionIntent);\n\n this.data = this.data || {};\n };\n\n var DEFAULT_HANDLER = Object.freeze({});\n\n var HandlerInfo = function () {\n function HandlerInfo(_props) {\n (0, _emberBabel.classCallCheck)(this, HandlerInfo);\n\n var props = _props || {};\n\n // initialize local properties to ensure consistent object shape\n this._handler = DEFAULT_HANDLER;\n this._handlerPromise = null;\n this.factory = null; // Injected by the handler info factory\n this.name = props.name;\n\n for (var prop in props) {\n if (prop === 'handler') {\n this._processHandler(props.handler);\n } else {\n this[prop] = props[prop];\n }\n }\n }\n\n HandlerInfo.prototype.getHandler = function getHandler() {};\n\n HandlerInfo.prototype.fetchHandler = function fetchHandler() {\n var handler = this.getHandler(this.name);\n\n return this._processHandler(handler);\n };\n\n HandlerInfo.prototype._processHandler = function _processHandler(handler) {\n var _this2 = this;\n\n // Setup a handlerPromise so that we can wait for asynchronously loaded handlers\n this.handlerPromise = _rsvp.Promise.resolve(handler);\n\n // Wait until the 'handler' property has been updated when chaining to a handler\n // that is a promise\n if (isPromise(handler)) {\n this.handlerPromise = this.handlerPromise.then(function (h) {\n return _this2.updateHandler(h);\n });\n // set to undefined to avoid recursive loop in the handler getter\n return this.handler = undefined;\n } else if (handler) {\n return this.updateHandler(handler);\n }\n };\n\n HandlerInfo.prototype.log = function log(payload, message) {\n if (payload.log) {\n payload.log(this.name + ': ' + message);\n }\n };\n\n HandlerInfo.prototype.promiseLabel = function promiseLabel(label) {\n return _promiseLabel(\"'\" + this.name + \"' \" + label);\n };\n\n HandlerInfo.prototype.getUnresolved = function getUnresolved() {\n return this;\n };\n\n HandlerInfo.prototype.serialize = function serialize() {\n return this.params || {};\n };\n\n HandlerInfo.prototype.updateHandler = function updateHandler(handler) {\n // Store the name of the handler on the handler for easy checks later\n handler._handlerName = this.name;\n return this.handler = handler;\n };\n\n HandlerInfo.prototype.resolve = function resolve(shouldContinue, payload) {\n var checkForAbort = this.checkForAbort.bind(this, shouldContinue),\n beforeModel = this.runBeforeModelHook.bind(this, payload),\n model = this.getModel.bind(this, payload),\n afterModel = this.runAfterModelHook.bind(this, payload),\n becomeResolved = this.becomeResolved.bind(this, payload),\n self = this;\n\n return _rsvp.Promise.resolve(this.handlerPromise, this.promiseLabel('Start handler')).then(function (handler) {\n // We nest this chain in case the handlerPromise has an error so that\n // we don't have to bubble it through every step\n return _rsvp.Promise.resolve(handler).then(checkForAbort, null, self.promiseLabel('Check for abort')).then(beforeModel, null, self.promiseLabel('Before model')).then(checkForAbort, null, self.promiseLabel(\"Check if aborted during 'beforeModel' hook\")).then(model, null, self.promiseLabel('Model')).then(checkForAbort, null, self.promiseLabel(\"Check if aborted in 'model' hook\")).then(afterModel, null, self.promiseLabel('After model')).then(checkForAbort, null, self.promiseLabel(\"Check if aborted in 'afterModel' hook\")).then(becomeResolved, null, self.promiseLabel('Become resolved'));\n }, function (error) {\n throw error;\n });\n };\n\n HandlerInfo.prototype.runBeforeModelHook = function runBeforeModelHook(payload) {\n if (payload.trigger) {\n payload.trigger(true, 'willResolveModel', payload, this.handler);\n }\n return this.runSharedModelHook(payload, 'beforeModel', []);\n };\n\n HandlerInfo.prototype.runAfterModelHook = function runAfterModelHook(payload, resolvedModel) {\n // Stash the resolved model on the payload.\n // This makes it possible for users to swap out\n // the resolved model in afterModel.\n var name = this.name;\n this.stashResolvedModel(payload, resolvedModel);\n\n return this.runSharedModelHook(payload, 'afterModel', [resolvedModel]).then(function () {\n // Ignore the fulfilled value returned from afterModel.\n // Return the value stashed in resolvedModels, which\n // might have been swapped out in afterModel.\n return payload.resolvedModels[name];\n }, null, this.promiseLabel('Ignore fulfillment value and return model value'));\n };\n\n HandlerInfo.prototype.runSharedModelHook = function runSharedModelHook(payload, hookName, args) {\n this.log(payload, 'calling ' + hookName + ' hook');\n\n if (this.queryParams) {\n args.push(this.queryParams);\n }\n args.push(payload);\n\n var result = applyHook(this.handler, hookName, args);\n\n if (result && result.isTransition) {\n result = null;\n }\n\n return _rsvp.Promise.resolve(result, this.promiseLabel('Resolve value returned from one of the model hooks'));\n };\n\n HandlerInfo.prototype.getModel = function getModel() {};\n\n HandlerInfo.prototype.checkForAbort = function checkForAbort(shouldContinue, promiseValue) {\n return _rsvp.Promise.resolve(shouldContinue(), this.promiseLabel('Check for abort')).then(function () {\n // We don't care about shouldContinue's resolve value;\n // pass along the original value passed to this fn.\n return promiseValue;\n }, null, this.promiseLabel('Ignore fulfillment value and continue'));\n };\n\n HandlerInfo.prototype.stashResolvedModel = function stashResolvedModel(payload, resolvedModel) {\n payload.resolvedModels = payload.resolvedModels || {};\n payload.resolvedModels[this.name] = resolvedModel;\n };\n\n HandlerInfo.prototype.becomeResolved = function becomeResolved(payload, resolvedContext) {\n var params = this.serialize(resolvedContext);\n\n if (payload) {\n this.stashResolvedModel(payload, resolvedContext);\n payload.params = payload.params || {};\n payload.params[this.name] = params;\n }\n\n return this.factory('resolved', {\n context: resolvedContext,\n name: this.name,\n handler: this.handler,\n params: params\n });\n };\n\n HandlerInfo.prototype.shouldSupercede = function shouldSupercede(other) {\n // Prefer this newer handlerInfo over `other` if:\n // 1) The other one doesn't exist\n // 2) The names don't match\n // 3) This handler has a context that doesn't match\n // the other one (or the other one doesn't have one).\n // 4) This handler has parameters that don't match the other.\n if (!other) {\n return true;\n }\n\n var contextsMatch = other.context === this.context;\n return other.name !== this.name || this.hasOwnProperty('context') && !contextsMatch || this.hasOwnProperty('params') && !paramsMatch(this.params, other.params);\n };\n\n (0, _emberBabel.createClass)(HandlerInfo, [{\n key: 'handler',\n get: function () {\n // _handler could be set to either a handler object or undefined, so we\n // compare against a default reference to know when it's been set\n if (this._handler !== DEFAULT_HANDLER) {\n return this._handler;\n }\n\n return this.fetchHandler();\n },\n set: function (handler) {\n return this._handler = handler;\n }\n }, {\n key: 'handlerPromise',\n get: function () {\n if (this._handlerPromise !== null) {\n return this._handlerPromise;\n }\n\n this.fetchHandler();\n\n return this._handlerPromise;\n },\n set: function (handlerPromise) {\n this._handlerPromise = handlerPromise;\n\n return handlerPromise;\n }\n }]);\n return HandlerInfo;\n }();\n\n // this is bonkers, we require that `context` be set on on the\n // HandlerInfo prototype to null because the checks in\n // `NamedTransitionIntent.prototype.applyToHandlers` here\n // https://github.com/tildeio/router.js/blob/v1.2.8/lib/router/transition-intent/named-transition-intent.js#L76-L81\n // check of `oldHandlerInfo.context === newHandlerInfo.context` and assumes\n // that the params _must_ match also in that case.\n //\n // The only reason `oldHandlerInfo.context` and `newHandlerInfo.context` did not\n // match in prior versions is because if the context isn't set yet (on newHandlerInfo)\n // is because it inherits the `null` from the prototype vs `undefined` (on\n // the oldHandlerInfo).\n //\n // A future refactoring should remove that conditional, and fix the hand full of\n // failing tests.\n HandlerInfo.prototype.context = null;\n\n function paramsMatch(a, b) {\n if (!a ^ !b) {\n // Only one is null.\n return false;\n }\n\n if (!a) {\n // Both must be null.\n return true;\n }\n\n // Note: this assumes that both params have the same\n // number of keys, but since we're comparing the\n // same handlers, they should.\n for (var k in a) {\n if (a.hasOwnProperty(k) && a[k] !== b[k]) {\n return false;\n }\n }\n return true;\n }\n\n var ResolvedHandlerInfo = function (_HandlerInfo) {\n (0, _emberBabel.inherits)(ResolvedHandlerInfo, _HandlerInfo);\n\n function ResolvedHandlerInfo(props) {\n (0, _emberBabel.classCallCheck)(this, ResolvedHandlerInfo);\n\n var _this3 = (0, _emberBabel.possibleConstructorReturn)(this, _HandlerInfo.call(this, props));\n\n _this3.isResolved = true;\n return _this3;\n }\n\n ResolvedHandlerInfo.prototype.resolve = function resolve(shouldContinue, payload) {\n // A ResolvedHandlerInfo just resolved with itself.\n if (payload && payload.resolvedModels) {\n payload.resolvedModels[this.name] = this.context;\n }\n return _rsvp.Promise.resolve(this, this.promiseLabel('Resolve'));\n };\n\n ResolvedHandlerInfo.prototype.getUnresolved = function getUnresolved() {\n return this.factory('param', {\n name: this.name,\n handler: this.handler,\n params: this.params\n });\n };\n\n return ResolvedHandlerInfo;\n }(HandlerInfo);\n\n var UnresolvedHandlerInfoByObject = function (_HandlerInfo2) {\n (0, _emberBabel.inherits)(UnresolvedHandlerInfoByObject, _HandlerInfo2);\n\n function UnresolvedHandlerInfoByObject(props) {\n (0, _emberBabel.classCallCheck)(this, UnresolvedHandlerInfoByObject);\n\n var _this4 = (0, _emberBabel.possibleConstructorReturn)(this, _HandlerInfo2.call(this, props));\n\n _this4.names = _this4.names || [];\n return _this4;\n }\n\n UnresolvedHandlerInfoByObject.prototype.getModel = function getModel(payload) {\n this.log(payload, this.name + ': resolving provided model');\n return _rsvp.Promise.resolve(this.context);\n };\n\n UnresolvedHandlerInfoByObject.prototype.serialize = function serialize(_model) {\n var model = _model || this.context,\n names = this.names;\n\n var object = {};\n if (isParam(model)) {\n object[names[0]] = model;\n return object;\n }\n\n // Use custom serialize if it exists.\n if (this.serializer) {\n // invoke this.serializer unbound (getSerializer returns a stateless function)\n return this.serializer.call(null, model, names);\n } else if (this.handler && this.handler.serialize) {\n return this.handler.serialize(model, names);\n }\n\n if (names.length !== 1) {\n return;\n }\n\n var name = names[0];\n\n if (/_id$/.test(name)) {\n object[name] = model.id;\n } else {\n object[name] = model;\n }\n return object;\n };\n\n return UnresolvedHandlerInfoByObject;\n }(HandlerInfo);\n\n var UnresolvedHandlerInfoByParam = function (_HandlerInfo3) {\n (0, _emberBabel.inherits)(UnresolvedHandlerInfoByParam, _HandlerInfo3);\n\n function UnresolvedHandlerInfoByParam(props) {\n (0, _emberBabel.classCallCheck)(this, UnresolvedHandlerInfoByParam);\n\n var _this5 = (0, _emberBabel.possibleConstructorReturn)(this, _HandlerInfo3.call(this, props));\n\n _this5.params = _this5.params || {};\n return _this5;\n }\n\n UnresolvedHandlerInfoByParam.prototype.getModel = function getModel(payload) {\n var fullParams = this.params;\n if (payload && payload.queryParams) {\n fullParams = {};\n merge(fullParams, this.params);\n fullParams.queryParams = payload.queryParams;\n }\n\n var handler = this.handler;\n var hookName = resolveHook(handler, 'deserialize') || resolveHook(handler, 'model');\n\n return this.runSharedModelHook(payload, hookName, [fullParams]);\n };\n\n return UnresolvedHandlerInfoByParam;\n }(HandlerInfo);\n\n handlerInfoFactory.klasses = {\n resolved: ResolvedHandlerInfo,\n param: UnresolvedHandlerInfoByParam,\n object: UnresolvedHandlerInfoByObject\n };\n\n function handlerInfoFactory(name, props) {\n var klass = handlerInfoFactory.klasses[name];\n var handlerInfo = new klass(props || {});\n handlerInfo.factory = handlerInfoFactory;\n return handlerInfo;\n }\n\n var NamedTransitionIntent = function (_TransitionIntent) {\n (0, _emberBabel.inherits)(NamedTransitionIntent, _TransitionIntent);\n\n function NamedTransitionIntent(props) {\n (0, _emberBabel.classCallCheck)(this, NamedTransitionIntent);\n\n var _this6 = (0, _emberBabel.possibleConstructorReturn)(this, _TransitionIntent.call(this, props));\n\n _this6.name = props.name;\n _this6.pivotHandler = props.pivotHandler;\n _this6.contexts = props.contexts || [];\n _this6.queryParams = props.queryParams;\n return _this6;\n }\n\n NamedTransitionIntent.prototype.applyToState = function applyToState(oldState, recognizer, getHandler, isIntermediate, getSerializer) {\n var partitionedArgs = extractQueryParams([this.name].concat(this.contexts)),\n pureArgs = partitionedArgs[0],\n handlers = recognizer.handlersFor(pureArgs[0]);\n\n var targetRouteName = handlers[handlers.length - 1].handler;\n\n return this.applyToHandlers(oldState, handlers, getHandler, targetRouteName, isIntermediate, null, getSerializer);\n };\n\n NamedTransitionIntent.prototype.applyToHandlers = function applyToHandlers(oldState, handlers, getHandler, targetRouteName, isIntermediate, checkingIfActive, getSerializer) {\n var i, len;\n var newState = new TransitionState();\n var objects = this.contexts.slice(0);\n\n var invalidateIndex = handlers.length;\n\n // Pivot handlers are provided for refresh transitions\n if (this.pivotHandler) {\n for (i = 0, len = handlers.length; i < len; ++i) {\n if (handlers[i].handler === this.pivotHandler._handlerName) {\n invalidateIndex = i;\n break;\n }\n }\n }\n\n for (i = handlers.length - 1; i >= 0; --i) {\n var result = handlers[i];\n var name = result.handler;\n\n var oldHandlerInfo = oldState.handlerInfos[i];\n var newHandlerInfo = null;\n\n if (result.names.length > 0) {\n if (i >= invalidateIndex) {\n newHandlerInfo = this.createParamHandlerInfo(name, getHandler, result.names, objects, oldHandlerInfo);\n } else {\n var serializer = getSerializer(name);\n newHandlerInfo = this.getHandlerInfoForDynamicSegment(name, getHandler, result.names, objects, oldHandlerInfo, targetRouteName, i, serializer);\n }\n } else {\n // This route has no dynamic segment.\n // Therefore treat as a param-based handlerInfo\n // with empty params. This will cause the `model`\n // hook to be called with empty params, which is desirable.\n newHandlerInfo = this.createParamHandlerInfo(name, getHandler, result.names, objects, oldHandlerInfo);\n }\n\n if (checkingIfActive) {\n // If we're performing an isActive check, we want to\n // serialize URL params with the provided context, but\n // ignore mismatches between old and new context.\n newHandlerInfo = newHandlerInfo.becomeResolved(null, newHandlerInfo.context);\n var oldContext = oldHandlerInfo && oldHandlerInfo.context;\n if (result.names.length > 0 && newHandlerInfo.context === oldContext) {\n // If contexts match in isActive test, assume params also match.\n // This allows for flexibility in not requiring that every last\n // handler provide a `serialize` method\n newHandlerInfo.params = oldHandlerInfo && oldHandlerInfo.params;\n }\n newHandlerInfo.context = oldContext;\n }\n\n var handlerToUse = oldHandlerInfo;\n if (i >= invalidateIndex || newHandlerInfo.shouldSupercede(oldHandlerInfo)) {\n invalidateIndex = Math.min(i, invalidateIndex);\n handlerToUse = newHandlerInfo;\n }\n\n if (isIntermediate && !checkingIfActive) {\n handlerToUse = handlerToUse.becomeResolved(null, handlerToUse.context);\n }\n\n newState.handlerInfos.unshift(handlerToUse);\n }\n\n if (objects.length > 0) {\n throw new Error('More context objects were passed than there are dynamic segments for the route: ' + targetRouteName);\n }\n\n if (!isIntermediate) {\n this.invalidateChildren(newState.handlerInfos, invalidateIndex);\n }\n\n merge(newState.queryParams, this.queryParams || {});\n\n return newState;\n };\n\n NamedTransitionIntent.prototype.invalidateChildren = function invalidateChildren(handlerInfos, invalidateIndex) {\n for (var i = invalidateIndex, l = handlerInfos.length; i < l; ++i) {\n var handlerInfo = handlerInfos[i];\n handlerInfos[i] = handlerInfo.getUnresolved();\n }\n };\n\n NamedTransitionIntent.prototype.getHandlerInfoForDynamicSegment = function getHandlerInfoForDynamicSegment(name, getHandler, names, objects, oldHandlerInfo, targetRouteName, i, serializer) {\n var objectToUse;\n if (objects.length > 0) {\n // Use the objects provided for this transition.\n objectToUse = objects[objects.length - 1];\n if (isParam(objectToUse)) {\n return this.createParamHandlerInfo(name, getHandler, names, objects, oldHandlerInfo);\n } else {\n objects.pop();\n }\n } else if (oldHandlerInfo && oldHandlerInfo.name === name) {\n // Reuse the matching oldHandlerInfo\n return oldHandlerInfo;\n } else {\n if (this.preTransitionState) {\n var preTransitionHandlerInfo = this.preTransitionState.handlerInfos[i];\n objectToUse = preTransitionHandlerInfo && preTransitionHandlerInfo.context;\n } else {\n // Ideally we should throw this error to provide maximal\n // information to the user that not enough context objects\n // were provided, but this proves too cumbersome in Ember\n // in cases where inner template helpers are evaluated\n // before parent helpers un-render, in which cases this\n // error somewhat prematurely fires.\n //throw new Error(\"Not enough context objects were provided to complete a transition to \" + targetRouteName + \". Specifically, the \" + name + \" route needs an object that can be serialized into its dynamic URL segments [\" + names.join(', ') + \"]\");\n return oldHandlerInfo;\n }\n }\n\n return handlerInfoFactory('object', {\n name: name,\n getHandler: getHandler,\n serializer: serializer,\n context: objectToUse,\n names: names\n });\n };\n\n NamedTransitionIntent.prototype.createParamHandlerInfo = function createParamHandlerInfo(name, getHandler, names, objects, oldHandlerInfo) {\n var params = {};\n\n // Soak up all the provided string/numbers\n var numNames = names.length;\n while (numNames--) {\n // Only use old params if the names match with the new handler\n var oldParams = oldHandlerInfo && name === oldHandlerInfo.name && oldHandlerInfo.params || {};\n\n var peek = objects[objects.length - 1];\n var paramName = names[numNames];\n if (isParam(peek)) {\n params[paramName] = '' + objects.pop();\n } else {\n // If we're here, this means only some of the params\n // were string/number params, so try and use a param\n // value from a previous handler.\n if (oldParams.hasOwnProperty(paramName)) {\n params[paramName] = oldParams[paramName];\n } else {\n throw new Error(\"You didn't provide enough string/numeric parameters to satisfy all of the dynamic segments for route \" + name);\n }\n }\n }\n\n return handlerInfoFactory('param', {\n name: name,\n getHandler: getHandler,\n params: params\n });\n };\n\n return NamedTransitionIntent;\n }(TransitionIntent);\n\n function UnrecognizedURLError(message) {\n if (!(this instanceof UnrecognizedURLError)) {\n return new UnrecognizedURLError(message);\n }\n\n var error = Error.call(this, message);\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, UnrecognizedURLError);\n } else {\n this.stack = error.stack;\n }\n\n this.description = error.description;\n this.fileName = error.fileName;\n this.lineNumber = error.lineNumber;\n this.message = error.message || 'UnrecognizedURL';\n this.name = 'UnrecognizedURLError';\n this.number = error.number;\n this.code = error.code;\n }\n\n UnrecognizedURLError.prototype = Object.create(Error.prototype);\n\n var URLTransitionIntent = function (_TransitionIntent2) {\n (0, _emberBabel.inherits)(URLTransitionIntent, _TransitionIntent2);\n\n function URLTransitionIntent(props) {\n (0, _emberBabel.classCallCheck)(this, URLTransitionIntent);\n\n var _this7 = (0, _emberBabel.possibleConstructorReturn)(this, _TransitionIntent2.call(this, props));\n\n _this7.url = props.url;\n return _this7;\n }\n\n URLTransitionIntent.prototype.applyToState = function applyToState(oldState, recognizer, getHandler) {\n var newState = new TransitionState();\n\n var results = recognizer.recognize(this.url),\n i,\n len;\n\n if (!results) {\n throw new UnrecognizedURLError(this.url);\n }\n\n var statesDiffer = false;\n var url = this.url;\n\n // Checks if a handler is accessible by URL. If it is not, an error is thrown.\n // For the case where the handler is loaded asynchronously, the error will be\n // thrown once it is loaded.\n function checkHandlerAccessibility(handler) {\n if (handler && handler.inaccessibleByURL) {\n throw new UnrecognizedURLError(url);\n }\n\n return handler;\n }\n\n for (i = 0, len = results.length; i < len; ++i) {\n var result = results[i];\n var name = result.handler;\n var newHandlerInfo = handlerInfoFactory('param', {\n name: name,\n getHandler: getHandler,\n params: result.params\n });\n var handler = newHandlerInfo.handler;\n\n if (handler) {\n checkHandlerAccessibility(handler);\n } else {\n // If the hanlder is being loaded asynchronously, check if we can\n // access it after it has resolved\n newHandlerInfo.handlerPromise = newHandlerInfo.handlerPromise.then(checkHandlerAccessibility);\n }\n\n var oldHandlerInfo = oldState.handlerInfos[i];\n if (statesDiffer || newHandlerInfo.shouldSupercede(oldHandlerInfo)) {\n statesDiffer = true;\n newState.handlerInfos[i] = newHandlerInfo;\n } else {\n newState.handlerInfos[i] = oldHandlerInfo;\n }\n }\n\n merge(newState.queryParams, results.queryParams);\n\n return newState;\n };\n\n return URLTransitionIntent;\n }(TransitionIntent);\n\n var pop = Array.prototype.pop;\n\n function Router(_options) {\n var options = _options || {};\n this.getHandler = options.getHandler || this.getHandler;\n this.getSerializer = options.getSerializer || this.getSerializer;\n this.updateURL = options.updateURL || this.updateURL;\n this.replaceURL = options.replaceURL || this.replaceURL;\n this.didTransition = options.didTransition || this.didTransition;\n this.willTransition = options.willTransition || this.willTransition;\n this.delegate = options.delegate || this.delegate;\n this.triggerEvent = options.triggerEvent || this.triggerEvent;\n this.log = options.log || this.log;\n this.dslCallBacks = []; // NOTE: set by Ember\n this.state = undefined;\n this.activeTransition = undefined;\n this._changedQueryParams = undefined;\n this.oldState = undefined;\n this.currentHandlerInfos = undefined;\n this.currentSequence = 0;\n\n this.recognizer = new _routeRecognizer.default();\n this.reset();\n }\n\n function getTransitionByIntent(intent, isIntermediate) {\n var wasTransitioning = !!this.activeTransition;\n var oldState = wasTransitioning ? this.activeTransition.state : this.state;\n var newTransition;\n\n var newState = intent.applyToState(oldState, this.recognizer, this.getHandler, isIntermediate, this.getSerializer);\n var queryParamChangelist = getChangelist(oldState.queryParams, newState.queryParams);\n\n if (handlerInfosEqual(newState.handlerInfos, oldState.handlerInfos)) {\n // This is a no-op transition. See if query params changed.\n if (queryParamChangelist) {\n newTransition = this.queryParamsTransition(queryParamChangelist, wasTransitioning, oldState, newState);\n if (newTransition) {\n newTransition.queryParamsOnly = true;\n return newTransition;\n }\n }\n\n // No-op. No need to create a new transition.\n return this.activeTransition || new Transition(this);\n }\n\n if (isIntermediate) {\n setupContexts(this, newState);\n return;\n }\n\n // Create a new transition to the destination route.\n newTransition = new Transition(this, intent, newState, undefined, this.activeTransition);\n\n // transition is to same route with same params, only query params differ.\n // not caught above probably because refresh() has been used\n if (handlerInfosSameExceptQueryParams(newState.handlerInfos, oldState.handlerInfos)) {\n newTransition.queryParamsOnly = true;\n }\n\n // Abort and usurp any previously active transition.\n if (this.activeTransition) {\n this.activeTransition.abort();\n }\n this.activeTransition = newTransition;\n\n // Transition promises by default resolve with resolved state.\n // For our purposes, swap out the promise to resolve\n // after the transition has been finalized.\n newTransition.promise = newTransition.promise.then(function (result) {\n return finalizeTransition(newTransition, result.state);\n }, null, _promiseLabel('Settle transition promise when transition is finalized'));\n\n if (!wasTransitioning) {\n notifyExistingHandlers(this, newState, newTransition);\n }\n\n fireQueryParamDidChange(this, newState, queryParamChangelist);\n\n return newTransition;\n }\n\n Router.prototype = {\n /**\n The main entry point into the router. The API is essentially\n the same as the `map` method in `route-recognizer`.\n This method extracts the String handler at the last `.to()`\n call and uses it as the name of the whole route.\n @param {Function} callback\n */\n map: function (callback) {\n this.recognizer.delegate = this.delegate;\n\n this.recognizer.map(callback, function (recognizer, routes) {\n for (var i = routes.length - 1, proceed = true; i >= 0 && proceed; --i) {\n var route = routes[i];\n recognizer.add(routes, { as: route.handler });\n proceed = route.path === '/' || route.path === '' || route.handler.slice(-6) === '.index';\n }\n });\n },\n\n hasRoute: function (route) {\n return this.recognizer.hasRoute(route);\n },\n\n getHandler: function () {},\n\n getSerializer: function () {},\n\n queryParamsTransition: function (changelist, wasTransitioning, oldState, newState) {\n var router = this;\n\n fireQueryParamDidChange(this, newState, changelist);\n\n if (!wasTransitioning && this.activeTransition) {\n // One of the handlers in queryParamsDidChange\n // caused a transition. Just return that transition.\n return this.activeTransition;\n } else {\n // Running queryParamsDidChange didn't change anything.\n // Just update query params and be on our way.\n\n // We have to return a noop transition that will\n // perform a URL update at the end. This gives\n // the user the ability to set the url update\n // method (default is replaceState).\n var newTransition = new Transition(this);\n newTransition.queryParamsOnly = true;\n\n oldState.queryParams = finalizeQueryParamChange(this, newState.handlerInfos, newState.queryParams, newTransition);\n\n newTransition.promise = newTransition.promise.then(function (result) {\n updateURL(newTransition, oldState, true);\n if (router.didTransition) {\n router.didTransition(router.currentHandlerInfos);\n }\n return result;\n }, null, _promiseLabel('Transition complete'));\n return newTransition;\n }\n },\n\n // NOTE: this doesn't really belong here, but here\n // it shall remain until our ES6 transpiler can\n // handle cyclical deps.\n transitionByIntent: function (intent /*, isIntermediate*/) {\n try {\n return getTransitionByIntent.apply(this, arguments);\n } catch (e) {\n return new Transition(this, intent, null, e);\n }\n },\n\n /**\n Clears the current and target route handlers and triggers exit\n on each of them starting at the leaf and traversing up through\n its ancestors.\n */\n reset: function () {\n if (this.state) {\n forEach(this.state.handlerInfos.slice().reverse(), function (handlerInfo) {\n var handler = handlerInfo.handler;\n callHook(handler, 'exit');\n });\n }\n\n this.oldState = undefined;\n this.state = new TransitionState();\n this.currentHandlerInfos = null;\n },\n\n activeTransition: null,\n\n /**\n var handler = handlerInfo.handler;\n The entry point for handling a change to the URL (usually\n via the back and forward button).\n Returns an Array of handlers and the parameters associated\n with those parameters.\n @param {String} url a URL to process\n @return {Array} an Array of `[handler, parameter]` tuples\n */\n handleURL: function (url) {\n // Perform a URL-based transition, but don't change\n // the URL afterward, since it already happened.\n var args = slice.call(arguments);\n if (url.charAt(0) !== '/') {\n args[0] = '/' + url;\n }\n\n return doTransition(this, args).method(null);\n },\n\n /**\n Hook point for updating the URL.\n @param {String} url a URL to update to\n */\n updateURL: function () {\n throw new Error('updateURL is not implemented');\n },\n\n /**\n Hook point for replacing the current URL, i.e. with replaceState\n By default this behaves the same as `updateURL`\n @param {String} url a URL to update to\n */\n replaceURL: function (url) {\n this.updateURL(url);\n },\n\n /**\n Transition into the specified named route.\n If necessary, trigger the exit callback on any handlers\n that are no longer represented by the target route.\n @param {String} name the name of the route\n */\n transitionTo: function () /*name*/{\n return doTransition(this, arguments);\n },\n\n intermediateTransitionTo: function () /*name*/{\n return doTransition(this, arguments, true);\n },\n\n refresh: function (pivotHandler) {\n var previousTransition = this.activeTransition;\n var state = previousTransition ? previousTransition.state : this.state;\n var handlerInfos = state.handlerInfos;\n\n _log(this, 'Starting a refresh transition');\n var intent = new NamedTransitionIntent({\n name: handlerInfos[handlerInfos.length - 1].name,\n pivotHandler: pivotHandler || handlerInfos[0].handler,\n contexts: [], // TODO collect contexts...?\n queryParams: this._changedQueryParams || state.queryParams || {}\n });\n\n var newTransition = this.transitionByIntent(intent, false);\n\n // if the previous transition is a replace transition, that needs to be preserved\n if (previousTransition && previousTransition.urlMethod === 'replace') {\n newTransition.method(previousTransition.urlMethod);\n }\n\n return newTransition;\n },\n\n /**\n Identical to `transitionTo` except that the current URL will be replaced\n if possible.\n This method is intended primarily for use with `replaceState`.\n @param {String} name the name of the route\n */\n replaceWith: function () /*name*/{\n return doTransition(this, arguments).method('replace');\n },\n\n /**\n Take a named route and context objects and generate a\n URL.\n @param {String} name the name of the route to generate\n a URL for\n @param {...Object} objects a list of objects to serialize\n @return {String} a URL\n */\n generate: function (handlerName) {\n var partitionedArgs = extractQueryParams(slice.call(arguments, 1)),\n suppliedParams = partitionedArgs[0],\n queryParams = partitionedArgs[1];\n\n // Construct a TransitionIntent with the provided params\n // and apply it to the present state of the router.\n var intent = new NamedTransitionIntent({\n name: handlerName,\n contexts: suppliedParams\n });\n var state = intent.applyToState(this.state, this.recognizer, this.getHandler, null, this.getSerializer);\n var params = {};\n\n for (var i = 0, len = state.handlerInfos.length; i < len; ++i) {\n var handlerInfo = state.handlerInfos[i];\n var handlerParams = handlerInfo.serialize();\n merge(params, handlerParams);\n }\n params.queryParams = queryParams;\n\n return this.recognizer.generate(handlerName, params);\n },\n\n applyIntent: function (handlerName, contexts) {\n var intent = new NamedTransitionIntent({\n name: handlerName,\n contexts: contexts\n });\n\n var state = this.activeTransition && this.activeTransition.state || this.state;\n return intent.applyToState(state, this.recognizer, this.getHandler, null, this.getSerializer);\n },\n\n isActiveIntent: function (handlerName, contexts, queryParams, _state) {\n var state = _state || this.state,\n targetHandlerInfos = state.handlerInfos,\n handlerInfo,\n len;\n\n if (!targetHandlerInfos.length) {\n return false;\n }\n\n var targetHandler = targetHandlerInfos[targetHandlerInfos.length - 1].name;\n var recogHandlers = this.recognizer.handlersFor(targetHandler);\n\n var index = 0;\n for (len = recogHandlers.length; index < len; ++index) {\n handlerInfo = targetHandlerInfos[index];\n if (handlerInfo.name === handlerName) {\n break;\n }\n }\n\n if (index === recogHandlers.length) {\n // The provided route name isn't even in the route hierarchy.\n return false;\n }\n\n var testState = new TransitionState();\n testState.handlerInfos = targetHandlerInfos.slice(0, index + 1);\n recogHandlers = recogHandlers.slice(0, index + 1);\n\n var intent = new NamedTransitionIntent({\n name: targetHandler,\n contexts: contexts\n });\n\n var newState = intent.applyToHandlers(testState, recogHandlers, this.getHandler, targetHandler, true, true, this.getSerializer);\n\n var handlersEqual = handlerInfosEqual(newState.handlerInfos, testState.handlerInfos);\n if (!queryParams || !handlersEqual) {\n return handlersEqual;\n }\n\n // Get a hash of QPs that will still be active on new route\n var activeQPsOnNewHandler = {};\n merge(activeQPsOnNewHandler, queryParams);\n\n var activeQueryParams = state.queryParams;\n for (var key in activeQueryParams) {\n if (activeQueryParams.hasOwnProperty(key) && activeQPsOnNewHandler.hasOwnProperty(key)) {\n activeQPsOnNewHandler[key] = activeQueryParams[key];\n }\n }\n\n return handlersEqual && !getChangelist(activeQPsOnNewHandler, queryParams);\n },\n\n isActive: function (handlerName) {\n var partitionedArgs = extractQueryParams(slice.call(arguments, 1));\n return this.isActiveIntent(handlerName, partitionedArgs[0], partitionedArgs[1]);\n },\n\n trigger: function () /*name*/{\n var args = slice.call(arguments);\n _trigger(this, this.currentHandlerInfos, false, args);\n },\n\n /**\n Hook point for logging transition status updates.\n @param {String} message The message to log.\n */\n log: null\n };\n\n /**\n @private\n \n Fires queryParamsDidChange event\n */\n function fireQueryParamDidChange(router, newState, queryParamChangelist) {\n // If queryParams changed trigger event\n if (queryParamChangelist) {\n // This is a little hacky but we need some way of storing\n // changed query params given that no activeTransition\n // is guaranteed to have occurred.\n router._changedQueryParams = queryParamChangelist.all;\n _trigger(router, newState.handlerInfos, true, ['queryParamsDidChange', queryParamChangelist.changed, queryParamChangelist.all, queryParamChangelist.removed]);\n router._changedQueryParams = null;\n }\n }\n\n /**\n @private\n \n Takes an Array of `HandlerInfo`s, figures out which ones are\n exiting, entering, or changing contexts, and calls the\n proper handler hooks.\n \n For example, consider the following tree of handlers. Each handler is\n followed by the URL segment it handles.\n \n ```\n |~index (\"/\")\n | |~posts (\"/posts\")\n | | |-showPost (\"/:id\")\n | | |-newPost (\"/new\")\n | | |-editPost (\"/edit\")\n | |~about (\"/about/:id\")\n ```\n \n Consider the following transitions:\n \n 1. A URL transition to `/posts/1`.\n 1. Triggers the `*model` callbacks on the\n `index`, `posts`, and `showPost` handlers\n 2. Triggers the `enter` callback on the same\n 3. Triggers the `setup` callback on the same\n 2. A direct transition to `newPost`\n 1. Triggers the `exit` callback on `showPost`\n 2. Triggers the `enter` callback on `newPost`\n 3. Triggers the `setup` callback on `newPost`\n 3. A direct transition to `about` with a specified\n context object\n 1. Triggers the `exit` callback on `newPost`\n and `posts`\n 2. Triggers the `serialize` callback on `about`\n 3. Triggers the `enter` callback on `about`\n 4. Triggers the `setup` callback on `about`\n \n @param {Router} transition\n @param {TransitionState} newState\n */\n function setupContexts(router, newState, transition) {\n var partition = partitionHandlers(router.state, newState);\n var i, l, handler;\n\n for (i = 0, l = partition.exited.length; i < l; i++) {\n handler = partition.exited[i].handler;\n delete handler.context;\n\n callHook(handler, 'reset', true, transition);\n callHook(handler, 'exit', transition);\n }\n\n var oldState = router.oldState = router.state;\n router.state = newState;\n var currentHandlerInfos = router.currentHandlerInfos = partition.unchanged.slice();\n\n try {\n for (i = 0, l = partition.reset.length; i < l; i++) {\n handler = partition.reset[i].handler;\n callHook(handler, 'reset', false, transition);\n }\n\n for (i = 0, l = partition.updatedContext.length; i < l; i++) {\n handlerEnteredOrUpdated(currentHandlerInfos, partition.updatedContext[i], false, transition);\n }\n\n for (i = 0, l = partition.entered.length; i < l; i++) {\n handlerEnteredOrUpdated(currentHandlerInfos, partition.entered[i], true, transition);\n }\n } catch (e) {\n router.state = oldState;\n router.currentHandlerInfos = oldState.handlerInfos;\n throw e;\n }\n\n router.state.queryParams = finalizeQueryParamChange(router, currentHandlerInfos, newState.queryParams, transition);\n }\n\n /**\n @private\n \n Helper method used by setupContexts. Handles errors or redirects\n that may happen in enter/setup.\n */\n function handlerEnteredOrUpdated(currentHandlerInfos, handlerInfo, enter, transition) {\n var handler = handlerInfo.handler,\n context = handlerInfo.context;\n\n function _handlerEnteredOrUpdated(handler) {\n if (enter) {\n callHook(handler, 'enter', transition);\n }\n\n if (transition && transition.isAborted) {\n throw new TransitionAbortedError();\n }\n\n handler.context = context;\n callHook(handler, 'contextDidChange');\n\n callHook(handler, 'setup', context, transition);\n if (transition && transition.isAborted) {\n throw new TransitionAbortedError();\n }\n\n currentHandlerInfos.push(handlerInfo);\n }\n\n // If the handler doesn't exist, it means we haven't resolved the handler promise yet\n if (!handler) {\n handlerInfo.handlerPromise = handlerInfo.handlerPromise.then(_handlerEnteredOrUpdated);\n } else {\n _handlerEnteredOrUpdated(handler);\n }\n\n return true;\n }\n\n /**\n @private\n \n This function is called when transitioning from one URL to\n another to determine which handlers are no longer active,\n which handlers are newly active, and which handlers remain\n active but have their context changed.\n \n Take a list of old handlers and new handlers and partition\n them into four buckets:\n \n * unchanged: the handler was active in both the old and\n new URL, and its context remains the same\n * updated context: the handler was active in both the\n old and new URL, but its context changed. The handler's\n `setup` method, if any, will be called with the new\n context.\n * exited: the handler was active in the old URL, but is\n no longer active.\n * entered: the handler was not active in the old URL, but\n is now active.\n \n The PartitionedHandlers structure has four fields:\n \n * `updatedContext`: a list of `HandlerInfo` objects that\n represent handlers that remain active but have a changed\n context\n * `entered`: a list of `HandlerInfo` objects that represent\n handlers that are newly active\n * `exited`: a list of `HandlerInfo` objects that are no\n longer active.\n * `unchanged`: a list of `HanderInfo` objects that remain active.\n \n @param {Array[HandlerInfo]} oldHandlers a list of the handler\n information for the previous URL (or `[]` if this is the\n first handled transition)\n @param {Array[HandlerInfo]} newHandlers a list of the handler\n information for the new URL\n \n @return {Partition}\n */\n function partitionHandlers(oldState, newState) {\n var oldHandlers = oldState.handlerInfos;\n var newHandlers = newState.handlerInfos;\n\n var handlers = {\n updatedContext: [],\n exited: [],\n entered: [],\n unchanged: [],\n reset: undefined\n };\n\n var handlerChanged,\n contextChanged = false,\n i,\n l;\n\n for (i = 0, l = newHandlers.length; i < l; i++) {\n var oldHandler = oldHandlers[i],\n newHandler = newHandlers[i];\n\n if (!oldHandler || oldHandler.handler !== newHandler.handler) {\n handlerChanged = true;\n }\n\n if (handlerChanged) {\n handlers.entered.push(newHandler);\n if (oldHandler) {\n handlers.exited.unshift(oldHandler);\n }\n } else if (contextChanged || oldHandler.context !== newHandler.context) {\n contextChanged = true;\n handlers.updatedContext.push(newHandler);\n } else {\n handlers.unchanged.push(oldHandler);\n }\n }\n\n for (i = newHandlers.length, l = oldHandlers.length; i < l; i++) {\n handlers.exited.unshift(oldHandlers[i]);\n }\n\n handlers.reset = handlers.updatedContext.slice();\n handlers.reset.reverse();\n\n return handlers;\n }\n\n function updateURL(transition, state /*, inputUrl*/) {\n var urlMethod = transition.urlMethod;\n\n if (!urlMethod) {\n return;\n }\n\n var router = transition.router,\n handlerInfos = state.handlerInfos,\n handlerName = handlerInfos[handlerInfos.length - 1].name,\n params = {};\n\n for (var i = handlerInfos.length - 1; i >= 0; --i) {\n var handlerInfo = handlerInfos[i];\n merge(params, handlerInfo.params);\n if (handlerInfo.handler.inaccessibleByURL) {\n urlMethod = null;\n }\n }\n\n if (urlMethod) {\n params.queryParams = transition._visibleQueryParams || state.queryParams;\n var url = router.recognizer.generate(handlerName, params);\n\n // transitions during the initial transition must always use replaceURL.\n // When the app boots, you are at a url, e.g. /foo. If some handler\n // redirects to bar as part of the initial transition, you don't want to\n // add a history entry for /foo. If you do, pressing back will immediately\n // hit the redirect again and take you back to /bar, thus killing the back\n // button\n var initial = transition.isCausedByInitialTransition;\n\n // say you are at / and you click a link to route /foo. In /foo's\n // handler, the transition is aborted using replacewith('/bar').\n // Because the current url is still /, the history entry for / is\n // removed from the history. Clicking back will take you to the page\n // you were on before /, which is often not even the app, thus killing\n // the back button. That's why updateURL is always correct for an\n // aborting transition that's not the initial transition\n var replaceAndNotAborting = urlMethod === 'replace' && !transition.isCausedByAbortingTransition;\n\n // because calling refresh causes an aborted transition, this needs to be\n // special cased - if the initial transition is a replace transition, the\n // urlMethod should be honored here.\n var isQueryParamsRefreshTransition = transition.queryParamsOnly && urlMethod === 'replace';\n\n if (initial || replaceAndNotAborting || isQueryParamsRefreshTransition) {\n router.replaceURL(url);\n } else {\n router.updateURL(url);\n }\n }\n }\n\n /**\n @private\n \n Updates the URL (if necessary) and calls `setupContexts`\n to update the router's array of `currentHandlerInfos`.\n */\n function finalizeTransition(transition, newState) {\n try {\n _log(transition.router, transition.sequence, 'Resolved all models on destination route; finalizing transition.');\n\n var router = transition.router,\n handlerInfos = newState.handlerInfos;\n\n // Run all the necessary enter/setup/exit hooks\n setupContexts(router, newState, transition);\n\n // Check if a redirect occurred in enter/setup\n if (transition.isAborted) {\n // TODO: cleaner way? distinguish b/w targetHandlerInfos?\n router.state.handlerInfos = router.currentHandlerInfos;\n return _rsvp.Promise.reject(logAbort(transition));\n }\n\n updateURL(transition, newState, transition.intent.url);\n\n transition.isActive = false;\n router.activeTransition = null;\n\n _trigger(router, router.currentHandlerInfos, true, ['didTransition']);\n\n if (router.didTransition) {\n router.didTransition(router.currentHandlerInfos);\n }\n\n _log(router, transition.sequence, 'TRANSITION COMPLETE.');\n\n // Resolve with the final handler.\n return handlerInfos[handlerInfos.length - 1].handler;\n } catch (e) {\n if (!(e instanceof TransitionAbortedError)) {\n //var erroneousHandler = handlerInfos.pop();\n var infos = transition.state.handlerInfos;\n transition.trigger(true, 'error', e, transition, infos[infos.length - 1].handler);\n transition.abort();\n }\n\n throw e;\n }\n }\n\n /**\n @private\n \n Begins and returns a Transition based on the provided\n arguments. Accepts arguments in the form of both URL\n transitions and named transitions.\n \n @param {Router} router\n @param {Array[Object]} args arguments passed to transitionTo,\n replaceWith, or handleURL\n */\n function doTransition(router, args, isIntermediate) {\n // Normalize blank transitions to root URL transitions.\n var name = args[0] || '/';\n\n var lastArg = args[args.length - 1];\n var queryParams = {};\n if (lastArg && lastArg.hasOwnProperty('queryParams')) {\n queryParams = pop.call(args).queryParams;\n }\n\n var intent;\n if (args.length === 0) {\n _log(router, 'Updating query params');\n\n // A query param update is really just a transition\n // into the route you're already on.\n var handlerInfos = router.state.handlerInfos;\n intent = new NamedTransitionIntent({\n name: handlerInfos[handlerInfos.length - 1].name,\n contexts: [],\n queryParams: queryParams\n });\n } else if (name.charAt(0) === '/') {\n _log(router, 'Attempting URL transition to ' + name);\n intent = new URLTransitionIntent({ url: name });\n } else {\n _log(router, 'Attempting transition to ' + name);\n intent = new NamedTransitionIntent({\n name: args[0],\n contexts: slice.call(args, 1),\n queryParams: queryParams\n });\n }\n\n return router.transitionByIntent(intent, isIntermediate);\n }\n\n function handlerInfosEqual(handlerInfos, otherHandlerInfos) {\n if (handlerInfos.length !== otherHandlerInfos.length) {\n return false;\n }\n\n for (var i = 0, len = handlerInfos.length; i < len; ++i) {\n if (handlerInfos[i] !== otherHandlerInfos[i]) {\n return false;\n }\n }\n return true;\n }\n\n function handlerInfosSameExceptQueryParams(handlerInfos, otherHandlerInfos) {\n if (handlerInfos.length !== otherHandlerInfos.length) {\n return false;\n }\n\n for (var i = 0, len = handlerInfos.length; i < len; ++i) {\n if (handlerInfos[i].name !== otherHandlerInfos[i].name) {\n return false;\n }\n\n if (!paramsEqual(handlerInfos[i].params, otherHandlerInfos[i].params)) {\n return false;\n }\n }\n return true;\n }\n\n function paramsEqual(params, otherParams) {\n if (!params && !otherParams) {\n return true;\n } else if (!params && !!otherParams || !!params && !otherParams) {\n // one is falsy but other is not;\n return false;\n }\n var keys = Object.keys(params);\n var otherKeys = Object.keys(otherParams);\n\n if (keys.length !== otherKeys.length) {\n return false;\n }\n\n for (var i = 0, len = keys.length; i < len; ++i) {\n var key = keys[i];\n\n if (params[key] !== otherParams[key]) {\n return false;\n }\n }\n\n return true;\n }\n\n function finalizeQueryParamChange(router, resolvedHandlers, newQueryParams, transition) {\n // We fire a finalizeQueryParamChange event which\n // gives the new route hierarchy a chance to tell\n // us which query params it's consuming and what\n // their final values are. If a query param is\n // no longer consumed in the final route hierarchy,\n // its serialized segment will be removed\n // from the URL.\n\n for (var k in newQueryParams) {\n if (newQueryParams.hasOwnProperty(k) && newQueryParams[k] === null) {\n delete newQueryParams[k];\n }\n }\n\n var finalQueryParamsArray = [];\n _trigger(router, resolvedHandlers, true, ['finalizeQueryParamChange', newQueryParams, finalQueryParamsArray, transition]);\n\n if (transition) {\n transition._visibleQueryParams = {};\n }\n\n var finalQueryParams = {};\n for (var i = 0, len = finalQueryParamsArray.length; i < len; ++i) {\n var qp = finalQueryParamsArray[i];\n finalQueryParams[qp.key] = qp.value;\n if (transition && qp.visible !== false) {\n transition._visibleQueryParams[qp.key] = qp.value;\n }\n }\n return finalQueryParams;\n }\n\n function notifyExistingHandlers(router, newState, newTransition) {\n var oldHandlers = router.state.handlerInfos,\n changing = [],\n i,\n oldHandlerLen,\n oldHandler,\n newHandler;\n\n oldHandlerLen = oldHandlers.length;\n for (i = 0; i < oldHandlerLen; i++) {\n oldHandler = oldHandlers[i];\n newHandler = newState.handlerInfos[i];\n\n if (!newHandler || oldHandler.name !== newHandler.name) {\n break;\n }\n\n if (!newHandler.isResolved) {\n changing.push(oldHandler);\n }\n }\n\n _trigger(router, oldHandlers, true, ['willTransition', newTransition]);\n\n if (router.willTransition) {\n router.willTransition(oldHandlers, newState.handlerInfos, newTransition);\n }\n }\n\n exports.Transition = Transition;\n exports.default = Router;\n});","enifed('rsvp', ['exports', 'ember-babel', 'node-module'], function (exports, _emberBabel, _nodeModule) {\n 'use strict';\n\n exports.filter = exports.async = exports.map = exports.reject = exports.resolve = exports.off = exports.on = exports.configure = exports.denodeify = exports.defer = exports.rethrow = exports.hashSettled = exports.hash = exports.race = exports.allSettled = exports.all = exports.EventTarget = exports.Promise = exports.cast = exports.asap = undefined;\n\n var _rsvp;\n\n function callbacksFor(object) {\n var callbacks = object._promiseCallbacks;\n\n if (!callbacks) {\n callbacks = object._promiseCallbacks = {};\n }\n\n return callbacks;\n }\n\n /**\n @class RSVP.EventTarget\n */\n var EventTarget = {\n mixin: function (object) {\n object['on'] = this['on'];\n object['off'] = this['off'];\n object['trigger'] = this['trigger'];\n object._promiseCallbacks = undefined;\n return object;\n },\n on: function (eventName, callback) {\n if (typeof callback !== 'function') {\n throw new TypeError('Callback must be a function');\n }\n\n var allCallbacks = callbacksFor(this),\n callbacks = void 0;\n\n callbacks = allCallbacks[eventName];\n\n if (!callbacks) {\n callbacks = allCallbacks[eventName] = [];\n }\n\n if (callbacks.indexOf(callback)) {\n callbacks.push(callback);\n }\n },\n off: function (eventName, callback) {\n var allCallbacks = callbacksFor(this),\n callbacks = void 0,\n index = void 0;\n\n if (!callback) {\n allCallbacks[eventName] = [];\n return;\n }\n\n callbacks = allCallbacks[eventName];\n\n index = callbacks.indexOf(callback);\n\n if (index !== -1) {\n callbacks.splice(index, 1);\n }\n },\n trigger: function (eventName, options, label) {\n var allCallbacks = callbacksFor(this),\n callbacks = void 0,\n callback = void 0;\n\n if (callbacks = allCallbacks[eventName]) {\n // Don't cache the callbacks.length since it may grow\n for (var i = 0; i < callbacks.length; i++) {\n callback = callbacks[i];\n\n callback(options, label);\n }\n }\n }\n };\n\n var config = {\n instrument: false\n };\n\n EventTarget['mixin'](config);\n\n function configure(name, value) {\n if (arguments.length === 2) {\n config[name] = value;\n } else {\n return config[name];\n }\n }\n\n var queue = [];\n\n function scheduleFlush() {\n setTimeout(function () {\n for (var i = 0; i < queue.length; i++) {\n var entry = queue[i];\n\n var payload = entry.payload;\n\n payload.guid = payload.key + payload.id;\n payload.childGuid = payload.key + payload.childId;\n if (payload.error) {\n payload.stack = payload.error.stack;\n }\n\n config['trigger'](entry.name, entry.payload);\n }\n queue.length = 0;\n }, 50);\n }\n\n function instrument(eventName, promise, child) {\n if (1 === queue.push({\n name: eventName,\n payload: {\n key: promise._guidKey,\n id: promise._id,\n eventName: eventName,\n detail: promise._result,\n childId: child && child._id,\n label: promise._label,\n timeStamp: Date.now(),\n error: config[\"instrument-with-stack\"] ? new Error(promise._label) : null\n } })) {\n scheduleFlush();\n }\n }\n\n /**\n `RSVP.Promise.resolve` returns a promise that will become resolved with the\n passed `value`. It is shorthand for the following:\n \n ```javascript\n let promise = new RSVP.Promise(function(resolve, reject){\n resolve(1);\n });\n \n promise.then(function(value){\n // value === 1\n });\n ```\n \n Instead of writing the above, your code now simply becomes the following:\n \n ```javascript\n let promise = RSVP.Promise.resolve(1);\n \n promise.then(function(value){\n // value === 1\n });\n ```\n \n @method resolve\n @static\n @param {*} object value that the returned promise will be resolved with\n @param {String} label optional string for identifying the returned promise.\n Useful for tooling.\n @return {Promise} a promise that will become fulfilled with the given\n `value`\n */\n function resolve$1(object, label) {\n /*jshint validthis:true */\n var Constructor = this;\n\n if (object && typeof object === 'object' && object.constructor === Constructor) {\n return object;\n }\n\n var promise = new Constructor(noop, label);\n resolve(promise, object);\n return promise;\n }\n\n function withOwnPromise() {\n return new TypeError('A promises callback cannot return that same promise.');\n }\n\n function objectOrFunction(x) {\n var type = typeof x;\n return x !== null && (type === 'object' || type === 'function');\n }\n\n function noop() {}\n\n var PENDING = void 0;\n var FULFILLED = 1;\n var REJECTED = 2;\n\n function ErrorObject() {\n this.error = null;\n }\n\n var GET_THEN_ERROR = new ErrorObject();\n\n function getThen(promise) {\n try {\n return promise.then;\n } catch (error) {\n GET_THEN_ERROR.error = error;\n return GET_THEN_ERROR;\n }\n }\n\n var TRY_CATCH_ERROR = new ErrorObject();\n\n var tryCatchCallback = void 0;\n function tryCatcher() {\n try {\n var target = tryCatchCallback;\n tryCatchCallback = null;\n return target.apply(this, arguments);\n } catch (e) {\n TRY_CATCH_ERROR.error = e;\n return TRY_CATCH_ERROR;\n }\n }\n\n function tryCatch(fn) {\n tryCatchCallback = fn;\n return tryCatcher;\n }\n\n function tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) {\n try {\n then$$1.call(value, fulfillmentHandler, rejectionHandler);\n } catch (e) {\n return e;\n }\n }\n\n function handleForeignThenable(promise, thenable, then$$1) {\n config.async(function (promise) {\n var sealed = false;\n var error = tryThen(then$$1, thenable, function (value) {\n if (sealed) {\n return;\n }\n sealed = true;\n if (thenable !== value) {\n resolve(promise, value, undefined);\n } else {\n fulfill(promise, value);\n }\n }, function (reason) {\n if (sealed) {\n return;\n }\n sealed = true;\n\n reject(promise, reason);\n }, 'Settle: ' + (promise._label || ' unknown promise'));\n\n if (!sealed && error) {\n sealed = true;\n reject(promise, error);\n }\n }, promise);\n }\n\n function handleOwnThenable(promise, thenable) {\n if (thenable._state === FULFILLED) {\n fulfill(promise, thenable._result);\n } else if (thenable._state === REJECTED) {\n thenable._onError = null;\n reject(promise, thenable._result);\n } else {\n subscribe(thenable, undefined, function (value) {\n if (thenable === value) {\n fulfill(promise, value);\n } else {\n resolve(promise, value);\n }\n }, function (reason) {\n return reject(promise, reason);\n });\n }\n }\n\n function handleMaybeThenable(promise, maybeThenable, then$$1) {\n var isOwnThenable = maybeThenable.constructor === promise.constructor && then$$1 === then && promise.constructor.resolve === resolve$1;\n\n if (isOwnThenable) {\n handleOwnThenable(promise, maybeThenable);\n } else if (then$$1 === GET_THEN_ERROR) {\n var error = GET_THEN_ERROR.error;\n GET_THEN_ERROR.error = null;\n reject(promise, error);\n } else if (typeof then$$1 === 'function') {\n handleForeignThenable(promise, maybeThenable, then$$1);\n } else {\n fulfill(promise, maybeThenable);\n }\n }\n\n function resolve(promise, value) {\n if (promise === value) {\n fulfill(promise, value);\n } else if (objectOrFunction(value)) {\n handleMaybeThenable(promise, value, getThen(value));\n } else {\n fulfill(promise, value);\n }\n }\n\n function publishRejection(promise) {\n if (promise._onError) {\n promise._onError(promise._result);\n }\n\n publish(promise);\n }\n\n function fulfill(promise, value) {\n if (promise._state !== PENDING) {\n return;\n }\n\n promise._result = value;\n promise._state = FULFILLED;\n\n if (promise._subscribers.length === 0) {\n if (config.instrument) {\n instrument('fulfilled', promise);\n }\n } else {\n config.async(publish, promise);\n }\n }\n\n function reject(promise, reason) {\n if (promise._state !== PENDING) {\n return;\n }\n promise._state = REJECTED;\n promise._result = reason;\n config.async(publishRejection, promise);\n }\n\n function subscribe(parent, child, onFulfillment, onRejection) {\n var subscribers = parent._subscribers;\n var length = subscribers.length;\n\n parent._onError = null;\n\n subscribers[length] = child;\n subscribers[length + FULFILLED] = onFulfillment;\n subscribers[length + REJECTED] = onRejection;\n\n if (length === 0 && parent._state) {\n config.async(publish, parent);\n }\n }\n\n function publish(promise) {\n var subscribers = promise._subscribers;\n var settled = promise._state;\n\n if (config.instrument) {\n instrument(settled === FULFILLED ? 'fulfilled' : 'rejected', promise);\n }\n\n if (subscribers.length === 0) {\n return;\n }\n\n var child = void 0,\n callback = void 0,\n result = promise._result;\n\n for (var i = 0; i < subscribers.length; i += 3) {\n child = subscribers[i];\n callback = subscribers[i + settled];\n\n if (child) {\n invokeCallback(settled, child, callback, result);\n } else {\n callback(result);\n }\n }\n\n promise._subscribers.length = 0;\n }\n\n function invokeCallback(state, promise, callback, result) {\n var hasCallback = typeof callback === 'function';\n var value = void 0;\n\n if (hasCallback) {\n value = tryCatch(callback)(result);\n } else {\n value = result;\n }\n\n if (promise._state !== PENDING) {\n // noop\n } else if (value === promise) {\n reject(promise, withOwnPromise());\n } else if (value === TRY_CATCH_ERROR) {\n var error = value.error;\n value.error = null; // release\n reject(promise, error);\n } else if (hasCallback) {\n resolve(promise, value);\n } else if (state === FULFILLED) {\n fulfill(promise, value);\n } else if (state === REJECTED) {\n reject(promise, value);\n }\n }\n\n function initializePromise(promise, resolver) {\n var resolved = false;\n try {\n resolver(function (value) {\n if (resolved) {\n return;\n }\n resolved = true;\n resolve(promise, value);\n }, function (reason) {\n if (resolved) {\n return;\n }\n resolved = true;\n reject(promise, reason);\n });\n } catch (e) {\n reject(promise, e);\n }\n }\n\n function then(onFulfillment, onRejection, label) {\n var parent = this;\n var state = parent._state;\n\n if (state === FULFILLED && !onFulfillment || state === REJECTED && !onRejection) {\n config.instrument && instrument('chained', parent, parent);\n return parent;\n }\n\n parent._onError = null;\n\n var child = new parent.constructor(noop, label);\n var result = parent._result;\n\n config.instrument && instrument('chained', parent, child);\n\n if (state === PENDING) {\n subscribe(parent, child, onFulfillment, onRejection);\n } else {\n var callback = state === FULFILLED ? onFulfillment : onRejection;\n config.async(function () {\n return invokeCallback(state, child, callback, result);\n });\n }\n\n return child;\n }\n\n var Enumerator = function () {\n function Enumerator(Constructor, input, abortOnReject, label) {\n (0, _emberBabel.classCallCheck)(this, Enumerator);\n\n this._instanceConstructor = Constructor;\n this.promise = new Constructor(noop, label);\n this._abortOnReject = abortOnReject;\n this.isUsingOwnPromise = Constructor === Promise;\n\n this._init.apply(this, arguments);\n }\n\n Enumerator.prototype._init = function _init(Constructor, input) {\n var len = input.length || 0;\n this.length = len;\n this._remaining = len;\n this._result = new Array(len);\n\n this._enumerate(input);\n };\n\n Enumerator.prototype._enumerate = function _enumerate(input) {\n var length = this.length;\n var promise = this.promise;\n\n for (var i = 0; promise._state === PENDING && i < length; i++) {\n this._eachEntry(input[i], i, true);\n }\n\n this._checkFullfillment();\n };\n\n Enumerator.prototype._checkFullfillment = function _checkFullfillment() {\n if (this._remaining === 0) {\n fulfill(this.promise, this._result);\n }\n };\n\n Enumerator.prototype._settleMaybeThenable = function _settleMaybeThenable(entry, i, firstPass) {\n var c = this._instanceConstructor;\n var resolve$$1 = c.resolve;\n\n if (resolve$$1 === resolve$1) {\n var then$$1 = getThen(entry);\n\n if (then$$1 === then && entry._state !== PENDING) {\n entry._onError = null;\n this._settledAt(entry._state, i, entry._result, firstPass);\n } else if (typeof then$$1 !== 'function') {\n this._settledAt(FULFILLED, i, entry, firstPass);\n } else if (this.isUsingOwnPromise) {\n var promise = new c(noop);\n handleMaybeThenable(promise, entry, then$$1);\n this._willSettleAt(promise, i, firstPass);\n } else {\n this._willSettleAt(new c(function (resolve$$1) {\n return resolve$$1(entry);\n }), i, firstPass);\n }\n } else {\n this._willSettleAt(resolve$$1(entry), i, firstPass);\n }\n };\n\n Enumerator.prototype._eachEntry = function _eachEntry(entry, i, firstPass) {\n if (entry !== null && typeof entry === 'object') {\n this._settleMaybeThenable(entry, i, firstPass);\n } else {\n this._setResultAt(FULFILLED, i, entry, firstPass);\n }\n };\n\n Enumerator.prototype._settledAt = function _settledAt(state, i, value, firstPass) {\n var promise = this.promise;\n\n if (promise._state === PENDING) {\n if (this._abortOnReject && state === REJECTED) {\n reject(promise, value);\n } else {\n this._setResultAt(state, i, value, firstPass);\n this._checkFullfillment();\n }\n }\n };\n\n Enumerator.prototype._setResultAt = function _setResultAt(state, i, value, firstPass) {\n this._remaining--;\n this._result[i] = value;\n };\n\n Enumerator.prototype._willSettleAt = function _willSettleAt(promise, i, firstPass) {\n var _this = this;\n\n subscribe(promise, undefined, function (value) {\n return _this._settledAt(FULFILLED, i, value, firstPass);\n }, function (reason) {\n return _this._settledAt(REJECTED, i, reason, firstPass);\n });\n };\n\n return Enumerator;\n }();\n\n function setSettledResult(state, i, value) {\n this._remaining--;\n if (state === FULFILLED) {\n this._result[i] = {\n state: 'fulfilled',\n value: value\n };\n } else {\n this._result[i] = {\n state: 'rejected',\n reason: value\n };\n }\n }\n\n /**\n `RSVP.Promise.all` accepts an array of promises, and returns a new promise which\n is fulfilled with an array of fulfillment values for the passed promises, or\n rejected with the reason of the first passed promise to be rejected. It casts all\n elements of the passed iterable to promises as it runs this algorithm.\n \n Example:\n \n ```javascript\n let promise1 = RSVP.resolve(1);\n let promise2 = RSVP.resolve(2);\n let promise3 = RSVP.resolve(3);\n let promises = [ promise1, promise2, promise3 ];\n \n RSVP.Promise.all(promises).then(function(array){\n // The array here would be [ 1, 2, 3 ];\n });\n ```\n \n If any of the `promises` given to `RSVP.all` are rejected, the first promise\n that is rejected will be given as an argument to the returned promises's\n rejection handler. For example:\n \n Example:\n \n ```javascript\n let promise1 = RSVP.resolve(1);\n let promise2 = RSVP.reject(new Error(\"2\"));\n let promise3 = RSVP.reject(new Error(\"3\"));\n let promises = [ promise1, promise2, promise3 ];\n \n RSVP.Promise.all(promises).then(function(array){\n // Code here never runs because there are rejected promises!\n }, function(error) {\n // error.message === \"2\"\n });\n ```\n \n @method all\n @static\n @param {Array} entries array of promises\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled when all `promises` have been\n fulfilled, or rejected if any of them become rejected.\n @static\n */\n function all(entries, label) {\n if (!Array.isArray(entries)) {\n return this.reject(new TypeError(\"Promise.all must be called with an array\"), label);\n }\n return new Enumerator(this, entries, true /* abort on reject */, label).promise;\n }\n\n /**\n `RSVP.Promise.race` returns a new promise which is settled in the same way as the\n first passed promise to settle.\n \n Example:\n \n ```javascript\n let promise1 = new RSVP.Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n \n let promise2 = new RSVP.Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 2');\n }, 100);\n });\n \n RSVP.Promise.race([promise1, promise2]).then(function(result){\n // result === 'promise 2' because it was resolved before promise1\n // was resolved.\n });\n ```\n \n `RSVP.Promise.race` is deterministic in that only the state of the first\n settled promise matters. For example, even if other promises given to the\n `promises` array argument are resolved, but the first settled promise has\n become rejected before the other promises became fulfilled, the returned\n promise will become rejected:\n \n ```javascript\n let promise1 = new RSVP.Promise(function(resolve, reject){\n setTimeout(function(){\n resolve('promise 1');\n }, 200);\n });\n \n let promise2 = new RSVP.Promise(function(resolve, reject){\n setTimeout(function(){\n reject(new Error('promise 2'));\n }, 100);\n });\n \n RSVP.Promise.race([promise1, promise2]).then(function(result){\n // Code here never runs\n }, function(reason){\n // reason.message === 'promise 2' because promise 2 became rejected before\n // promise 1 became fulfilled\n });\n ```\n \n An example real-world use case is implementing timeouts:\n \n ```javascript\n RSVP.Promise.race([ajax('foo.json'), timeout(5000)])\n ```\n \n @method race\n @static\n @param {Array} entries array of promises to observe\n @param {String} label optional string for describing the promise returned.\n Useful for tooling.\n @return {Promise} a promise which settles in the same way as the first passed\n promise to settle.\n */\n function race(entries, label) {\n /*jshint validthis:true */\n var Constructor = this;\n\n var promise = new Constructor(noop, label);\n\n if (!Array.isArray(entries)) {\n reject(promise, new TypeError('Promise.race must be called with an array'));\n return promise;\n }\n\n for (var i = 0; promise._state === PENDING && i < entries.length; i++) {\n subscribe(Constructor.resolve(entries[i]), undefined, function (value) {\n return resolve(promise, value);\n }, function (reason) {\n return reject(promise, reason);\n });\n }\n\n return promise;\n }\n\n /**\n `RSVP.Promise.reject` returns a promise rejected with the passed `reason`.\n It is shorthand for the following:\n \n ```javascript\n let promise = new RSVP.Promise(function(resolve, reject){\n reject(new Error('WHOOPS'));\n });\n \n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n \n Instead of writing the above, your code now simply becomes the following:\n \n ```javascript\n let promise = RSVP.Promise.reject(new Error('WHOOPS'));\n \n promise.then(function(value){\n // Code here doesn't run because the promise is rejected!\n }, function(reason){\n // reason.message === 'WHOOPS'\n });\n ```\n \n @method reject\n @static\n @param {*} reason value that the returned promise will be rejected with.\n @param {String} label optional string for identifying the returned promise.\n Useful for tooling.\n @return {Promise} a promise rejected with the given `reason`.\n */\n function reject$1(reason, label) {\n /*jshint validthis:true */\n var Constructor = this;\n var promise = new Constructor(noop, label);\n reject(promise, reason);\n return promise;\n }\n\n var guidKey = 'rsvp_' + Date.now() + '-';\n var counter = 0;\n\n function needsResolver() {\n throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');\n }\n\n function needsNew() {\n throw new TypeError(\"Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.\");\n }\n\n /**\n Promise objects represent the eventual result of an asynchronous operation. The\n primary way of interacting with a promise is through its `then` method, which\n registers callbacks to receive either a promise’s eventual value or the reason\n why the promise cannot be fulfilled.\n \n Terminology\n -----------\n \n - `promise` is an object or function with a `then` method whose behavior conforms to this specification.\n - `thenable` is an object or function that defines a `then` method.\n - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).\n - `exception` is a value that is thrown using the throw statement.\n - `reason` is a value that indicates why a promise was rejected.\n - `settled` the final resting state of a promise, fulfilled or rejected.\n \n A promise can be in one of three states: pending, fulfilled, or rejected.\n \n Promises that are fulfilled have a fulfillment value and are in the fulfilled\n state. Promises that are rejected have a rejection reason and are in the\n rejected state. A fulfillment value is never a thenable.\n \n Promises can also be said to *resolve* a value. If this value is also a\n promise, then the original promise's settled state will match the value's\n settled state. So a promise that *resolves* a promise that rejects will\n itself reject, and a promise that *resolves* a promise that fulfills will\n itself fulfill.\n \n \n Basic Usage:\n ------------\n \n ```js\n let promise = new Promise(function(resolve, reject) {\n // on success\n resolve(value);\n \n // on failure\n reject(reason);\n });\n \n promise.then(function(value) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n \n Advanced Usage:\n ---------------\n \n Promises shine when abstracting away asynchronous interactions such as\n `XMLHttpRequest`s.\n \n ```js\n function getJSON(url) {\n return new Promise(function(resolve, reject){\n let xhr = new XMLHttpRequest();\n \n xhr.open('GET', url);\n xhr.onreadystatechange = handler;\n xhr.responseType = 'json';\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.send();\n \n function handler() {\n if (this.readyState === this.DONE) {\n if (this.status === 200) {\n resolve(this.response);\n } else {\n reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));\n }\n }\n };\n });\n }\n \n getJSON('/posts.json').then(function(json) {\n // on fulfillment\n }, function(reason) {\n // on rejection\n });\n ```\n \n Unlike callbacks, promises are great composable primitives.\n \n ```js\n Promise.all([\n getJSON('/posts'),\n getJSON('/comments')\n ]).then(function(values){\n values[0] // => postsJSON\n values[1] // => commentsJSON\n \n return values;\n });\n ```\n \n @class RSVP.Promise\n @param {function} resolver\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @constructor\n */\n\n var Promise = function () {\n function Promise(resolver, label) {\n (0, _emberBabel.classCallCheck)(this, Promise);\n\n this._id = counter++;\n this._label = label;\n this._state = undefined;\n this._result = undefined;\n this._subscribers = [];\n\n config.instrument && instrument('created', this);\n\n if (noop !== resolver) {\n typeof resolver !== 'function' && needsResolver();\n this instanceof Promise ? initializePromise(this, resolver) : needsNew();\n }\n }\n\n Promise.prototype._onError = function _onError(reason) {\n var _this2 = this;\n\n config.after(function () {\n if (_this2._onError) {\n config.trigger('error', reason, _this2._label);\n }\n });\n };\n\n Promise.prototype.catch = function _catch(onRejection, label) {\n return this.then(undefined, onRejection, label);\n };\n\n Promise.prototype.finally = function _finally(callback, label) {\n var promise = this;\n var constructor = promise.constructor;\n\n return promise.then(function (value) {\n return constructor.resolve(callback()).then(function () {\n return value;\n });\n }, function (reason) {\n return constructor.resolve(callback()).then(function () {\n throw reason;\n });\n }, label);\n };\n\n return Promise;\n }();\n\n Promise.cast = resolve$1; // deprecated\n Promise.all = all;\n Promise.race = race;\n Promise.resolve = resolve$1;\n Promise.reject = reject$1;\n\n Promise.prototype._guidKey = guidKey;\n\n /**\n The primary way of interacting with a promise is through its `then` method,\n which registers callbacks to receive either a promise's eventual value or the\n reason why the promise cannot be fulfilled.\n \n ```js\n findUser().then(function(user){\n // user is available\n }, function(reason){\n // user is unavailable, and you are given the reason why\n });\n ```\n \n Chaining\n --------\n \n The return value of `then` is itself a promise. This second, 'downstream'\n promise is resolved with the return value of the first promise's fulfillment\n or rejection handler, or rejected if the handler throws an exception.\n \n ```js\n findUser().then(function (user) {\n return user.name;\n }, function (reason) {\n return 'default name';\n }).then(function (userName) {\n // If `findUser` fulfilled, `userName` will be the user's name, otherwise it\n // will be `'default name'`\n });\n \n findUser().then(function (user) {\n throw new Error('Found user, but still unhappy');\n }, function (reason) {\n throw new Error('`findUser` rejected and we\\'re unhappy');\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.\n // If `findUser` rejected, `reason` will be '`findUser` rejected and we\\'re unhappy'.\n });\n ```\n If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.\n \n ```js\n findUser().then(function (user) {\n throw new PedagogicalException('Upstream error');\n }).then(function (value) {\n // never reached\n }).then(function (value) {\n // never reached\n }, function (reason) {\n // The `PedgagocialException` is propagated all the way down to here\n });\n ```\n \n Assimilation\n ------------\n \n Sometimes the value you want to propagate to a downstream promise can only be\n retrieved asynchronously. This can be achieved by returning a promise in the\n fulfillment or rejection handler. The downstream promise will then be pending\n until the returned promise is settled. This is called *assimilation*.\n \n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // The user's comments are now available\n });\n ```\n \n If the assimliated promise rejects, then the downstream promise will also reject.\n \n ```js\n findUser().then(function (user) {\n return findCommentsByAuthor(user);\n }).then(function (comments) {\n // If `findCommentsByAuthor` fulfills, we'll have the value here\n }, function (reason) {\n // If `findCommentsByAuthor` rejects, we'll have the reason here\n });\n ```\n \n Simple Example\n --------------\n \n Synchronous Example\n \n ```javascript\n let result;\n \n try {\n result = findResult();\n // success\n } catch(reason) {\n // failure\n }\n ```\n \n Errback Example\n \n ```js\n findResult(function(result, err){\n if (err) {\n // failure\n } else {\n // success\n }\n });\n ```\n \n Promise Example;\n \n ```javascript\n findResult().then(function(result){\n // success\n }, function(reason){\n // failure\n });\n ```\n \n Advanced Example\n --------------\n \n Synchronous Example\n \n ```javascript\n let author, books;\n \n try {\n author = findAuthor();\n books = findBooksByAuthor(author);\n // success\n } catch(reason) {\n // failure\n }\n ```\n \n Errback Example\n \n ```js\n \n function foundBooks(books) {\n \n }\n \n function failure(reason) {\n \n }\n \n findAuthor(function(author, err){\n if (err) {\n failure(err);\n // failure\n } else {\n try {\n findBoooksByAuthor(author, function(books, err) {\n if (err) {\n failure(err);\n } else {\n try {\n foundBooks(books);\n } catch(reason) {\n failure(reason);\n }\n }\n });\n } catch(error) {\n failure(err);\n }\n // success\n }\n });\n ```\n \n Promise Example;\n \n ```javascript\n findAuthor().\n then(findBooksByAuthor).\n then(function(books){\n // found books\n }).catch(function(reason){\n // something went wrong\n });\n ```\n \n @method then\n @param {Function} onFulfillment\n @param {Function} onRejection\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise}\n */\n Promise.prototype.then = then;\n\n function Result() {\n this.value = undefined;\n }\n\n var ERROR = new Result();\n var GET_THEN_ERROR$1 = new Result();\n\n function getThen$1(obj) {\n try {\n return obj.then;\n } catch (error) {\n ERROR.value = error;\n return ERROR;\n }\n }\n\n function tryApply(f, s, a) {\n try {\n f.apply(s, a);\n } catch (error) {\n ERROR.value = error;\n return ERROR;\n }\n }\n\n function makeObject(_, argumentNames) {\n var obj = {};\n var length = _.length;\n var args = new Array(length);\n\n for (var x = 0; x < length; x++) {\n args[x] = _[x];\n }\n\n for (var i = 0; i < argumentNames.length; i++) {\n var name = argumentNames[i];\n obj[name] = args[i + 1];\n }\n\n return obj;\n }\n\n function arrayResult(_) {\n var length = _.length;\n var args = new Array(length - 1);\n\n for (var i = 1; i < length; i++) {\n args[i - 1] = _[i];\n }\n\n return args;\n }\n\n function wrapThenable(then, promise) {\n return {\n then: function (onFulFillment, onRejection) {\n return then.call(promise, onFulFillment, onRejection);\n }\n };\n }\n\n /**\n `RSVP.denodeify` takes a 'node-style' function and returns a function that\n will return an `RSVP.Promise`. You can use `denodeify` in Node.js or the\n browser when you'd prefer to use promises over using callbacks. For example,\n `denodeify` transforms the following:\n \n ```javascript\n let fs = require('fs');\n \n fs.readFile('myfile.txt', function(err, data){\n if (err) return handleError(err);\n handleData(data);\n });\n ```\n \n into:\n \n ```javascript\n let fs = require('fs');\n let readFile = RSVP.denodeify(fs.readFile);\n \n readFile('myfile.txt').then(handleData, handleError);\n ```\n \n If the node function has multiple success parameters, then `denodeify`\n just returns the first one:\n \n ```javascript\n let request = RSVP.denodeify(require('request'));\n \n request('http://example.com').then(function(res) {\n // ...\n });\n ```\n \n However, if you need all success parameters, setting `denodeify`'s\n second parameter to `true` causes it to return all success parameters\n as an array:\n \n ```javascript\n let request = RSVP.denodeify(require('request'), true);\n \n request('http://example.com').then(function(result) {\n // result[0] -> res\n // result[1] -> body\n });\n ```\n \n Or if you pass it an array with names it returns the parameters as a hash:\n \n ```javascript\n let request = RSVP.denodeify(require('request'), ['res', 'body']);\n \n request('http://example.com').then(function(result) {\n // result.res\n // result.body\n });\n ```\n \n Sometimes you need to retain the `this`:\n \n ```javascript\n let app = require('express')();\n let render = RSVP.denodeify(app.render.bind(app));\n ```\n \n The denodified function inherits from the original function. It works in all\n environments, except IE 10 and below. Consequently all properties of the original\n function are available to you. However, any properties you change on the\n denodeified function won't be changed on the original function. Example:\n \n ```javascript\n let request = RSVP.denodeify(require('request')),\n cookieJar = request.jar(); // <- Inheritance is used here\n \n request('http://example.com', {jar: cookieJar}).then(function(res) {\n // cookieJar.cookies holds now the cookies returned by example.com\n });\n ```\n \n Using `denodeify` makes it easier to compose asynchronous operations instead\n of using callbacks. For example, instead of:\n \n ```javascript\n let fs = require('fs');\n \n fs.readFile('myfile.txt', function(err, data){\n if (err) { ... } // Handle error\n fs.writeFile('myfile2.txt', data, function(err){\n if (err) { ... } // Handle error\n console.log('done')\n });\n });\n ```\n \n you can chain the operations together using `then` from the returned promise:\n \n ```javascript\n let fs = require('fs');\n let readFile = RSVP.denodeify(fs.readFile);\n let writeFile = RSVP.denodeify(fs.writeFile);\n \n readFile('myfile.txt').then(function(data){\n return writeFile('myfile2.txt', data);\n }).then(function(){\n console.log('done')\n }).catch(function(error){\n // Handle error\n });\n ```\n \n @method denodeify\n @static\n @for RSVP\n @param {Function} nodeFunc a 'node-style' function that takes a callback as\n its last argument. The callback expects an error to be passed as its first\n argument (if an error occurred, otherwise null), and the value from the\n operation as its second argument ('function(err, value){ }').\n @param {Boolean|Array} [options] An optional paramter that if set\n to `true` causes the promise to fulfill with the callback's success arguments\n as an array. This is useful if the node function has multiple success\n paramters. If you set this paramter to an array with names, the promise will\n fulfill with a hash with these names as keys and the success parameters as\n values.\n @return {Function} a function that wraps `nodeFunc` to return an\n `RSVP.Promise`\n @static\n */\n function denodeify(nodeFunc, options) {\n var fn = function () {\n var self = this;\n var l = arguments.length;\n var args = new Array(l + 1);\n var promiseInput = false;\n\n for (var i = 0; i < l; ++i) {\n var arg = arguments[i];\n\n if (!promiseInput) {\n // TODO: clean this up\n promiseInput = needsPromiseInput(arg);\n if (promiseInput === GET_THEN_ERROR$1) {\n var p = new Promise(noop);\n reject(p, GET_THEN_ERROR$1.value);\n return p;\n } else if (promiseInput && promiseInput !== true) {\n arg = wrapThenable(promiseInput, arg);\n }\n }\n args[i] = arg;\n }\n\n var promise = new Promise(noop);\n\n args[l] = function (err, val) {\n if (err) reject(promise, err);else if (options === undefined) resolve(promise, val);else if (options === true) resolve(promise, arrayResult(arguments));else if (Array.isArray(options)) resolve(promise, makeObject(arguments, options));else resolve(promise, val);\n };\n\n if (promiseInput) {\n return handlePromiseInput(promise, args, nodeFunc, self);\n } else {\n return handleValueInput(promise, args, nodeFunc, self);\n }\n };\n\n (0, _emberBabel.defaults)(fn, nodeFunc);\n\n\n return fn;\n }\n\n function handleValueInput(promise, args, nodeFunc, self) {\n var result = tryApply(nodeFunc, self, args);\n if (result === ERROR) {\n reject(promise, result.value);\n }\n return promise;\n }\n\n function handlePromiseInput(promise, args, nodeFunc, self) {\n return Promise.all(args).then(function (args) {\n var result = tryApply(nodeFunc, self, args);\n if (result === ERROR) {\n reject(promise, result.value);\n }\n return promise;\n });\n }\n\n function needsPromiseInput(arg) {\n if (arg && typeof arg === 'object') {\n if (arg.constructor === Promise) {\n return true;\n } else {\n return getThen$1(arg);\n }\n } else {\n return false;\n }\n }\n\n /**\n This is a convenient alias for `RSVP.Promise.all`.\n \n @method all\n @static\n @for RSVP\n @param {Array} array Array of promises.\n @param {String} label An optional label. This is useful\n for tooling.\n */\n function all$1(array, label) {\n return Promise.all(array, label);\n }\n\n var AllSettled = function (_Enumerator) {\n (0, _emberBabel.inherits)(AllSettled, _Enumerator);\n\n function AllSettled(Constructor, entries, label) {\n (0, _emberBabel.classCallCheck)(this, AllSettled);\n return (0, _emberBabel.possibleConstructorReturn)(this, _Enumerator.call(this, Constructor, entries, false /* don't abort on reject */, label));\n }\n\n return AllSettled;\n }(Enumerator);\n\n AllSettled.prototype._setResultAt = setSettledResult;\n\n /**\n `RSVP.allSettled` is similar to `RSVP.all`, but instead of implementing\n a fail-fast method, it waits until all the promises have returned and\n shows you all the results. This is useful if you want to handle multiple\n promises' failure states together as a set.\n Returns a promise that is fulfilled when all the given promises have been\n settled. The return promise is fulfilled with an array of the states of\n the promises passed into the `promises` array argument.\n Each state object will either indicate fulfillment or rejection, and\n provide the corresponding value or reason. The states will take one of\n the following formats:\n ```javascript\n { state: 'fulfilled', value: value }\n or\n { state: 'rejected', reason: reason }\n ```\n Example:\n ```javascript\n let promise1 = RSVP.Promise.resolve(1);\n let promise2 = RSVP.Promise.reject(new Error('2'));\n let promise3 = RSVP.Promise.reject(new Error('3'));\n let promises = [ promise1, promise2, promise3 ];\n RSVP.allSettled(promises).then(function(array){\n // array == [\n // { state: 'fulfilled', value: 1 },\n // { state: 'rejected', reason: Error },\n // { state: 'rejected', reason: Error }\n // ]\n // Note that for the second item, reason.message will be '2', and for the\n // third item, reason.message will be '3'.\n }, function(error) {\n // Not run. (This block would only be called if allSettled had failed,\n // for instance if passed an incorrect argument type.)\n });\n ```\n @method allSettled\n @static\n @for RSVP\n @param {Array} entries\n @param {String} label - optional string that describes the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled with an array of the settled\n states of the constituent promises.\n */\n\n function allSettled(entries, label) {\n if (!Array.isArray(entries)) {\n return Promise.reject(new TypeError(\"Promise.allSettled must be called with an array\"), label);\n }\n\n return new AllSettled(Promise, entries, label).promise;\n }\n\n /**\n This is a convenient alias for `RSVP.Promise.race`.\n \n @method race\n @static\n @for RSVP\n @param {Array} array Array of promises.\n @param {String} label An optional label. This is useful\n for tooling.\n */\n function race$1(array, label) {\n return Promise.race(array, label);\n }\n\n var hasOwnProperty = Object.prototype.hasOwnProperty;\n\n var PromiseHash = function (_Enumerator2) {\n (0, _emberBabel.inherits)(PromiseHash, _Enumerator2);\n\n function PromiseHash(Constructor, object) {\n var abortOnReject = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n var label = arguments[3];\n (0, _emberBabel.classCallCheck)(this, PromiseHash);\n return (0, _emberBabel.possibleConstructorReturn)(this, _Enumerator2.call(this, Constructor, object, abortOnReject, label));\n }\n\n PromiseHash.prototype._init = function _init(Constructor, object) {\n this._result = {};\n\n this._enumerate(object);\n if (this._remaining === 0) {\n fulfill(this.promise, this._result);\n }\n };\n\n PromiseHash.prototype._enumerate = function _enumerate(input) {\n var promise = this.promise;\n var results = [];\n\n for (var key in input) {\n if (hasOwnProperty.call(input, key)) {\n results.push({\n position: key,\n entry: input[key]\n });\n }\n }\n\n var length = results.length;\n this._remaining = length;\n var result = void 0;\n\n for (var i = 0; promise._state === PENDING && i < length; i++) {\n result = results[i];\n this._eachEntry(result.entry, result.position);\n }\n };\n\n return PromiseHash;\n }(Enumerator);\n\n /**\n `RSVP.hash` is similar to `RSVP.all`, but takes an object instead of an array\n for its `promises` argument.\n \n Returns a promise that is fulfilled when all the given promises have been\n fulfilled, or rejected if any of them become rejected. The returned promise\n is fulfilled with a hash that has the same key names as the `promises` object\n argument. If any of the values in the object are not promises, they will\n simply be copied over to the fulfilled object.\n \n Example:\n \n ```javascript\n let promises = {\n myPromise: RSVP.resolve(1),\n yourPromise: RSVP.resolve(2),\n theirPromise: RSVP.resolve(3),\n notAPromise: 4\n };\n \n RSVP.hash(promises).then(function(hash){\n // hash here is an object that looks like:\n // {\n // myPromise: 1,\n // yourPromise: 2,\n // theirPromise: 3,\n // notAPromise: 4\n // }\n });\n ````\n \n If any of the `promises` given to `RSVP.hash` are rejected, the first promise\n that is rejected will be given as the reason to the rejection handler.\n \n Example:\n \n ```javascript\n let promises = {\n myPromise: RSVP.resolve(1),\n rejectedPromise: RSVP.reject(new Error('rejectedPromise')),\n anotherRejectedPromise: RSVP.reject(new Error('anotherRejectedPromise')),\n };\n \n RSVP.hash(promises).then(function(hash){\n // Code here never runs because there are rejected promises!\n }, function(reason) {\n // reason.message === 'rejectedPromise'\n });\n ```\n \n An important note: `RSVP.hash` is intended for plain JavaScript objects that\n are just a set of keys and values. `RSVP.hash` will NOT preserve prototype\n chains.\n \n Example:\n \n ```javascript\n function MyConstructor(){\n this.example = RSVP.resolve('Example');\n }\n \n MyConstructor.prototype = {\n protoProperty: RSVP.resolve('Proto Property')\n };\n \n let myObject = new MyConstructor();\n \n RSVP.hash(myObject).then(function(hash){\n // protoProperty will not be present, instead you will just have an\n // object that looks like:\n // {\n // example: 'Example'\n // }\n //\n // hash.hasOwnProperty('protoProperty'); // false\n // 'undefined' === typeof hash.protoProperty\n });\n ```\n \n @method hash\n @static\n @for RSVP\n @param {Object} object\n @param {String} label optional string that describes the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled when all properties of `promises`\n have been fulfilled, or rejected if any of them become rejected.\n */\n function hash(object, label) {\n if (object === null || typeof object !== 'object') {\n return Promise.reject(new TypeError(\"Promise.hash must be called with an object\"), label);\n }\n\n return new PromiseHash(Promise, object, label).promise;\n }\n\n var HashSettled = function (_PromiseHash) {\n (0, _emberBabel.inherits)(HashSettled, _PromiseHash);\n\n function HashSettled(Constructor, object, label) {\n (0, _emberBabel.classCallCheck)(this, HashSettled);\n return (0, _emberBabel.possibleConstructorReturn)(this, _PromiseHash.call(this, Constructor, object, false, label));\n }\n\n return HashSettled;\n }(PromiseHash);\n\n HashSettled.prototype._setResultAt = setSettledResult;\n\n /**\n `RSVP.hashSettled` is similar to `RSVP.allSettled`, but takes an object\n instead of an array for its `promises` argument.\n \n Unlike `RSVP.all` or `RSVP.hash`, which implement a fail-fast method,\n but like `RSVP.allSettled`, `hashSettled` waits until all the\n constituent promises have returned and then shows you all the results\n with their states and values/reasons. This is useful if you want to\n handle multiple promises' failure states together as a set.\n \n Returns a promise that is fulfilled when all the given promises have been\n settled, or rejected if the passed parameters are invalid.\n \n The returned promise is fulfilled with a hash that has the same key names as\n the `promises` object argument. If any of the values in the object are not\n promises, they will be copied over to the fulfilled object and marked with state\n 'fulfilled'.\n \n Example:\n \n ```javascript\n let promises = {\n myPromise: RSVP.Promise.resolve(1),\n yourPromise: RSVP.Promise.resolve(2),\n theirPromise: RSVP.Promise.resolve(3),\n notAPromise: 4\n };\n \n RSVP.hashSettled(promises).then(function(hash){\n // hash here is an object that looks like:\n // {\n // myPromise: { state: 'fulfilled', value: 1 },\n // yourPromise: { state: 'fulfilled', value: 2 },\n // theirPromise: { state: 'fulfilled', value: 3 },\n // notAPromise: { state: 'fulfilled', value: 4 }\n // }\n });\n ```\n \n If any of the `promises` given to `RSVP.hash` are rejected, the state will\n be set to 'rejected' and the reason for rejection provided.\n \n Example:\n \n ```javascript\n let promises = {\n myPromise: RSVP.Promise.resolve(1),\n rejectedPromise: RSVP.Promise.reject(new Error('rejection')),\n anotherRejectedPromise: RSVP.Promise.reject(new Error('more rejection')),\n };\n \n RSVP.hashSettled(promises).then(function(hash){\n // hash here is an object that looks like:\n // {\n // myPromise: { state: 'fulfilled', value: 1 },\n // rejectedPromise: { state: 'rejected', reason: Error },\n // anotherRejectedPromise: { state: 'rejected', reason: Error },\n // }\n // Note that for rejectedPromise, reason.message == 'rejection',\n // and for anotherRejectedPromise, reason.message == 'more rejection'.\n });\n ```\n \n An important note: `RSVP.hashSettled` is intended for plain JavaScript objects that\n are just a set of keys and values. `RSVP.hashSettled` will NOT preserve prototype\n chains.\n \n Example:\n \n ```javascript\n function MyConstructor(){\n this.example = RSVP.Promise.resolve('Example');\n }\n \n MyConstructor.prototype = {\n protoProperty: RSVP.Promise.resolve('Proto Property')\n };\n \n let myObject = new MyConstructor();\n \n RSVP.hashSettled(myObject).then(function(hash){\n // protoProperty will not be present, instead you will just have an\n // object that looks like:\n // {\n // example: { state: 'fulfilled', value: 'Example' }\n // }\n //\n // hash.hasOwnProperty('protoProperty'); // false\n // 'undefined' === typeof hash.protoProperty\n });\n ```\n \n @method hashSettled\n @for RSVP\n @param {Object} object\n @param {String} label optional string that describes the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled when when all properties of `promises`\n have been settled.\n @static\n */\n\n function hashSettled(object, label) {\n if (object === null || typeof object !== 'object') {\n return Promise.reject(new TypeError(\"RSVP.hashSettled must be called with an object\"), label);\n }\n\n return new HashSettled(Promise, object, false, label).promise;\n }\n\n /**\n `RSVP.rethrow` will rethrow an error on the next turn of the JavaScript event\n loop in order to aid debugging.\n \n Promises A+ specifies that any exceptions that occur with a promise must be\n caught by the promises implementation and bubbled to the last handler. For\n this reason, it is recommended that you always specify a second rejection\n handler function to `then`. However, `RSVP.rethrow` will throw the exception\n outside of the promise, so it bubbles up to your console if in the browser,\n or domain/cause uncaught exception in Node. `rethrow` will also throw the\n error again so the error can be handled by the promise per the spec.\n \n ```javascript\n function throws(){\n throw new Error('Whoops!');\n }\n \n let promise = new RSVP.Promise(function(resolve, reject){\n throws();\n });\n \n promise.catch(RSVP.rethrow).then(function(){\n // Code here doesn't run because the promise became rejected due to an\n // error!\n }, function (err){\n // handle the error here\n });\n ```\n \n The 'Whoops' error will be thrown on the next turn of the event loop\n and you can watch for it in your console. You can also handle it using a\n rejection handler given to `.then` or `.catch` on the returned promise.\n \n @method rethrow\n @static\n @for RSVP\n @param {Error} reason reason the promise became rejected.\n @throws Error\n @static\n */\n function rethrow(reason) {\n setTimeout(function () {\n throw reason;\n });\n throw reason;\n }\n\n /**\n `RSVP.defer` returns an object similar to jQuery's `$.Deferred`.\n `RSVP.defer` should be used when porting over code reliant on `$.Deferred`'s\n interface. New code should use the `RSVP.Promise` constructor instead.\n \n The object returned from `RSVP.defer` is a plain object with three properties:\n \n * promise - an `RSVP.Promise`.\n * reject - a function that causes the `promise` property on this object to\n become rejected\n * resolve - a function that causes the `promise` property on this object to\n become fulfilled.\n \n Example:\n \n ```javascript\n let deferred = RSVP.defer();\n \n deferred.resolve(\"Success!\");\n \n deferred.promise.then(function(value){\n // value here is \"Success!\"\n });\n ```\n \n @method defer\n @static\n @for RSVP\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Object}\n */\n\n function defer(label) {\n var deferred = { resolve: undefined, reject: undefined };\n\n deferred.promise = new Promise(function (resolve, reject) {\n deferred.resolve = resolve;\n deferred.reject = reject;\n }, label);\n\n return deferred;\n }\n\n var MapEnumerator = function (_Enumerator3) {\n (0, _emberBabel.inherits)(MapEnumerator, _Enumerator3);\n\n function MapEnumerator(Constructor, entries, mapFn, label) {\n (0, _emberBabel.classCallCheck)(this, MapEnumerator);\n return (0, _emberBabel.possibleConstructorReturn)(this, _Enumerator3.call(this, Constructor, entries, true, label, mapFn));\n }\n\n MapEnumerator.prototype._init = function _init(Constructor, input, bool, label, mapFn) {\n var len = input.length || 0;\n this.length = len;\n this._remaining = len;\n this._result = new Array(len);\n this._mapFn = mapFn;\n\n this._enumerate(input);\n };\n\n MapEnumerator.prototype._setResultAt = function _setResultAt(state, i, value, firstPass) {\n if (firstPass) {\n var val = tryCatch(this._mapFn)(value, i);\n if (val === TRY_CATCH_ERROR) {\n this._settledAt(REJECTED, i, val.error, false);\n } else {\n this._eachEntry(val, i, false);\n }\n } else {\n this._remaining--;\n this._result[i] = value;\n }\n };\n\n return MapEnumerator;\n }(Enumerator);\n\n /**\n `RSVP.map` is similar to JavaScript's native `map` method. `mapFn` is eagerly called\n meaning that as soon as any promise resolves its value will be passed to `mapFn`.\n `RSVP.map` returns a promise that will become fulfilled with the result of running\n `mapFn` on the values the promises become fulfilled with.\n \n For example:\n \n ```javascript\n \n let promise1 = RSVP.resolve(1);\n let promise2 = RSVP.resolve(2);\n let promise3 = RSVP.resolve(3);\n let promises = [ promise1, promise2, promise3 ];\n \n let mapFn = function(item){\n return item + 1;\n };\n \n RSVP.map(promises, mapFn).then(function(result){\n // result is [ 2, 3, 4 ]\n });\n ```\n \n If any of the `promises` given to `RSVP.map` are rejected, the first promise\n that is rejected will be given as an argument to the returned promise's\n rejection handler. For example:\n \n ```javascript\n let promise1 = RSVP.resolve(1);\n let promise2 = RSVP.reject(new Error('2'));\n let promise3 = RSVP.reject(new Error('3'));\n let promises = [ promise1, promise2, promise3 ];\n \n let mapFn = function(item){\n return item + 1;\n };\n \n RSVP.map(promises, mapFn).then(function(array){\n // Code here never runs because there are rejected promises!\n }, function(reason) {\n // reason.message === '2'\n });\n ```\n \n `RSVP.map` will also wait if a promise is returned from `mapFn`. For example,\n say you want to get all comments from a set of blog posts, but you need\n the blog posts first because they contain a url to those comments.\n \n ```javscript\n \n let mapFn = function(blogPost){\n // getComments does some ajax and returns an RSVP.Promise that is fulfilled\n // with some comments data\n return getComments(blogPost.comments_url);\n };\n \n // getBlogPosts does some ajax and returns an RSVP.Promise that is fulfilled\n // with some blog post data\n RSVP.map(getBlogPosts(), mapFn).then(function(comments){\n // comments is the result of asking the server for the comments\n // of all blog posts returned from getBlogPosts()\n });\n ```\n \n @method map\n @static\n @for RSVP\n @param {Array} promises\n @param {Function} mapFn function to be called on each fulfilled promise.\n @param {String} label optional string for labeling the promise.\n Useful for tooling.\n @return {Promise} promise that is fulfilled with the result of calling\n `mapFn` on each fulfilled promise or value when they become fulfilled.\n The promise will be rejected if any of the given `promises` become rejected.\n @static\n */\n function map(promises, mapFn, label) {\n if (!Array.isArray(promises)) {\n return Promise.reject(new TypeError(\"RSVP.map must be called with an array\"), label);\n }\n\n if (typeof mapFn !== 'function') {\n return Promise.reject(new TypeError(\"RSVP.map expects a function as a second argument\"), label);\n }\n\n return new MapEnumerator(Promise, promises, mapFn, label).promise;\n }\n\n /**\n This is a convenient alias for `RSVP.Promise.resolve`.\n \n @method resolve\n @static\n @for RSVP\n @param {*} value value that the returned promise will be resolved with\n @param {String} label optional string for identifying the returned promise.\n Useful for tooling.\n @return {Promise} a promise that will become fulfilled with the given\n `value`\n */\n function resolve$2(value, label) {\n return Promise.resolve(value, label);\n }\n\n /**\n This is a convenient alias for `RSVP.Promise.reject`.\n \n @method reject\n @static\n @for RSVP\n @param {*} reason value that the returned promise will be rejected with.\n @param {String} label optional string for identifying the returned promise.\n Useful for tooling.\n @return {Promise} a promise rejected with the given `reason`.\n */\n function reject$2(reason, label) {\n return Promise.reject(reason, label);\n }\n\n var EMPTY_OBJECT = {};\n\n var FilterEnumerator = function (_Enumerator4) {\n (0, _emberBabel.inherits)(FilterEnumerator, _Enumerator4);\n\n function FilterEnumerator(Constructor, entries, filterFn, label) {\n (0, _emberBabel.classCallCheck)(this, FilterEnumerator);\n return (0, _emberBabel.possibleConstructorReturn)(this, _Enumerator4.call(this, Constructor, entries, true, label, filterFn));\n }\n\n FilterEnumerator.prototype._init = function _init(Constructor, input, bool, label, filterFn) {\n var len = input.length || 0;\n this.length = len;\n this._remaining = len;\n\n this._result = new Array(len);\n this._filterFn = filterFn;\n\n this._enumerate(input);\n };\n\n FilterEnumerator.prototype._checkFullfillment = function _checkFullfillment() {\n if (this._remaining === 0) {\n this._result = this._result.filter(function (val) {\n return val !== EMPTY_OBJECT;\n });\n fulfill(this.promise, this._result);\n }\n };\n\n FilterEnumerator.prototype._setResultAt = function _setResultAt(state, i, value, firstPass) {\n if (firstPass) {\n this._result[i] = value;\n var val = tryCatch(this._filterFn)(value, i);\n if (val === TRY_CATCH_ERROR) {\n this._settledAt(REJECTED, i, val.error, false);\n } else {\n this._eachEntry(val, i, false);\n }\n } else {\n this._remaining--;\n if (!value) {\n this._result[i] = EMPTY_OBJECT;\n }\n }\n };\n\n return FilterEnumerator;\n }(Enumerator);\n\n /**\n `RSVP.filter` is similar to JavaScript's native `filter` method.\n `filterFn` is eagerly called meaning that as soon as any promise\n resolves its value will be passed to `filterFn`. `RSVP.filter` returns\n a promise that will become fulfilled with the result of running\n `filterFn` on the values the promises become fulfilled with.\n \n For example:\n \n ```javascript\n \n let promise1 = RSVP.resolve(1);\n let promise2 = RSVP.resolve(2);\n let promise3 = RSVP.resolve(3);\n \n let promises = [promise1, promise2, promise3];\n \n let filterFn = function(item){\n return item > 1;\n };\n \n RSVP.filter(promises, filterFn).then(function(result){\n // result is [ 2, 3 ]\n });\n ```\n \n If any of the `promises` given to `RSVP.filter` are rejected, the first promise\n that is rejected will be given as an argument to the returned promise's\n rejection handler. For example:\n \n ```javascript\n let promise1 = RSVP.resolve(1);\n let promise2 = RSVP.reject(new Error('2'));\n let promise3 = RSVP.reject(new Error('3'));\n let promises = [ promise1, promise2, promise3 ];\n \n let filterFn = function(item){\n return item > 1;\n };\n \n RSVP.filter(promises, filterFn).then(function(array){\n // Code here never runs because there are rejected promises!\n }, function(reason) {\n // reason.message === '2'\n });\n ```\n \n `RSVP.filter` will also wait for any promises returned from `filterFn`.\n For instance, you may want to fetch a list of users then return a subset\n of those users based on some asynchronous operation:\n \n ```javascript\n \n let alice = { name: 'alice' };\n let bob = { name: 'bob' };\n let users = [ alice, bob ];\n \n let promises = users.map(function(user){\n return RSVP.resolve(user);\n });\n \n let filterFn = function(user){\n // Here, Alice has permissions to create a blog post, but Bob does not.\n return getPrivilegesForUser(user).then(function(privs){\n return privs.can_create_blog_post === true;\n });\n };\n RSVP.filter(promises, filterFn).then(function(users){\n // true, because the server told us only Alice can create a blog post.\n users.length === 1;\n // false, because Alice is the only user present in `users`\n users[0] === bob;\n });\n ```\n \n @method filter\n @static\n @for RSVP\n @param {Array} promises\n @param {Function} filterFn - function to be called on each resolved value to\n filter the final results.\n @param {String} label optional string describing the promise. Useful for\n tooling.\n @return {Promise}\n */\n\n function filter(promises, filterFn, label) {\n if (!Array.isArray(promises) && !(promises !== null && typeof promises === 'object' && promises.then !== undefined)) {\n return Promise.reject(new TypeError(\"RSVP.filter must be called with an array or promise\"), label);\n }\n\n if (typeof filterFn !== 'function') {\n return Promise.reject(new TypeError(\"RSVP.filter expects function as a second argument\"), label);\n }\n\n return Promise.resolve(promises, label).then(function (promises) {\n return new FilterEnumerator(Promise, promises, filterFn, label).promise;\n });\n }\n\n var len = 0;\n var vertxNext = void 0;\n function asap(callback, arg) {\n queue$1[len] = callback;\n queue$1[len + 1] = arg;\n len += 2;\n if (len === 2) {\n // If len is 1, that means that we need to schedule an async flush.\n // If additional callbacks are queued before the queue is flushed, they\n // will be processed by this flush that we are scheduling.\n scheduleFlush$1();\n }\n }\n\n var browserWindow = typeof window !== 'undefined' ? window : undefined;\n var browserGlobal = browserWindow || {};\n var BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;\n var isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n // test for web worker but not in IE10\n var isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';\n\n // node\n function useNextTick() {\n var nextTick = process.nextTick;\n // node version 0.10.x displays a deprecation warning when nextTick is used recursively\n // setImmediate should be used instead instead\n var version = process.versions.node.match(/^(?:(\\d+)\\.)?(?:(\\d+)\\.)?(\\*|\\d+)$/);\n if (Array.isArray(version) && version[1] === '0' && version[2] === '10') {\n nextTick = setImmediate;\n }\n return function () {\n return nextTick(flush);\n };\n }\n\n // vertx\n function useVertxTimer() {\n if (typeof vertxNext !== 'undefined') {\n return function () {\n vertxNext(flush);\n };\n }\n return useSetTimeout();\n }\n\n function useMutationObserver() {\n var iterations = 0;\n var observer = new BrowserMutationObserver(flush);\n var node = document.createTextNode('');\n observer.observe(node, { characterData: true });\n\n return function () {\n return node.data = iterations = ++iterations % 2;\n };\n }\n\n // web worker\n function useMessageChannel() {\n var channel = new MessageChannel();\n channel.port1.onmessage = flush;\n return function () {\n return channel.port2.postMessage(0);\n };\n }\n\n function useSetTimeout() {\n return function () {\n return setTimeout(flush, 1);\n };\n }\n\n var queue$1 = new Array(1000);\n\n function flush() {\n for (var i = 0; i < len; i += 2) {\n var callback = queue$1[i];\n var arg = queue$1[i + 1];\n\n callback(arg);\n\n queue$1[i] = undefined;\n queue$1[i + 1] = undefined;\n }\n\n len = 0;\n }\n\n function attemptVertex() {\n try {\n var r = _nodeModule.require;\n var vertx = r('vertx');\n vertxNext = vertx.runOnLoop || vertx.runOnContext;\n return useVertxTimer();\n } catch (e) {\n return useSetTimeout();\n }\n }\n\n var scheduleFlush$1 = void 0;\n // Decide what async method to use to triggering processing of queued callbacks:\n if (isNode) {\n scheduleFlush$1 = useNextTick();\n } else if (BrowserMutationObserver) {\n scheduleFlush$1 = useMutationObserver();\n } else if (isWorker) {\n scheduleFlush$1 = useMessageChannel();\n } else if (browserWindow === undefined && typeof _nodeModule.require === 'function') {\n scheduleFlush$1 = attemptVertex();\n } else {\n scheduleFlush$1 = useSetTimeout();\n }\n\n /* global self */\n if (typeof self === 'object') {\n\n /* global global */\n } else if (typeof global === 'object') {} else {\n throw new Error('no global: `self` or `global` found');\n }\n\n // defaults\n config.async = asap;\n config.after = function (cb) {\n return setTimeout(cb, 0);\n };\n var cast = resolve$2;\n\n var async = function (callback, arg) {\n return config.async(callback, arg);\n };\n\n function on() {\n config['on'].apply(config, arguments);\n }\n\n function off() {\n config['off'].apply(config, arguments);\n }\n\n // Set up instrumentation through `window.__PROMISE_INTRUMENTATION__`\n if (typeof window !== 'undefined' && typeof window['__PROMISE_INSTRUMENTATION__'] === 'object') {\n var callbacks = window['__PROMISE_INSTRUMENTATION__'];\n configure('instrument', true);\n for (var eventName in callbacks) {\n if (callbacks.hasOwnProperty(eventName)) {\n on(eventName, callbacks[eventName]);\n }\n }\n }\n\n // the default export here is for backwards compat:\n // https://github.com/tildeio/rsvp.js/issues/434\n var rsvp = (_rsvp = {\n asap: asap,\n cast: cast,\n Promise: Promise,\n EventTarget: EventTarget,\n all: all$1,\n allSettled: allSettled,\n race: race$1,\n hash: hash,\n hashSettled: hashSettled,\n rethrow: rethrow,\n defer: defer,\n denodeify: denodeify,\n configure: configure,\n on: on,\n off: off,\n resolve: resolve$2,\n reject: reject$2,\n map: map\n }, _rsvp['async'] = async, _rsvp.filter = filter, _rsvp);\n\n exports.asap = asap;\n exports.cast = cast;\n exports.Promise = Promise;\n exports.EventTarget = EventTarget;\n exports.all = all$1;\n exports.allSettled = allSettled;\n exports.race = race$1;\n exports.hash = hash;\n exports.hashSettled = hashSettled;\n exports.rethrow = rethrow;\n exports.defer = defer;\n exports.denodeify = denodeify;\n exports.configure = configure;\n exports.on = on;\n exports.off = off;\n exports.resolve = resolve$2;\n exports.reject = reject$2;\n exports.map = map;\n exports.async = async;\n exports.filter = filter;\n exports.default = rsvp;\n});","requireModule('ember')","(function() {\n define('ember-cli-shims/deprecations', [], function() {\n var values = {\"ember-application\":{\"default\":[\"@ember/application\"]},\"ember-array\":{\"default\":[\"@ember/array\"]},\"ember-array/mutable\":{\"default\":[\"@ember/array/mutable\"]},\"ember-array/utils\":{\"A\":[\"@ember/array\",\"A\"],\"isEmberArray\":[\"@ember/array\",\"isArray\"],\"wrap\":[\"@ember/array\",\"makeArray\"]},\"ember-component\":{\"default\":[\"@ember/component\"]},\"ember-components/checkbox\":{\"default\":[\"@ember/component/checkbox\"]},\"ember-components/text-area\":{\"default\":[\"@ember/component/text-area\"]},\"ember-components/text-field\":{\"default\":[\"@ember/component/text-field\"]},\"ember-controller\":{\"default\":[\"@ember/controller\"]},\"ember-controller/inject\":{\"default\":[\"@ember/controller\",\"inject\"]},\"ember-controller/proxy\":{\"default\":[\"@ember/array/proxy\"]},\"ember-debug\":{\"log\":[\"@ember/debug\",\"debug\"],\"inspect\":[\"@ember/debug\",\"inspect\"],\"run\":[\"@ember/debug\",\"runInDebug\"],\"warn\":[\"@ember/debug\",\"warn\"]},\"ember-debug/container-debug-adapter\":{\"default\":[\"@ember/debug/container-debug-adapter\"]},\"ember-debug/data-adapter\":{\"default\":[\"@ember/debug/data-adapter\"]},\"ember-deprecations\":{\"deprecate\":[\"@ember/application/deprecations\",\"deprecate\"],\"deprecateFunc\":[\"@ember/application/deprecations\",\"deprecateFunc\"]},\"ember-enumerable\":{\"default\":[\"@ember/enumerable\"]},\"ember-evented\":{\"default\":[\"@ember/object/evented\"]},\"ember-evented/on\":{\"default\":[\"@ember/object/evented\",\"on\"]},\"ember-globals-resolver\":{\"default\":[\"@ember/application/globals-resolver\"]},\"ember-helper\":{\"default\":[\"@ember/component/helper\"],\"helper\":[\"@ember/component/helper\",\"helper\"]},\"ember-instrumentation\":{\"instrument\":[\"@ember/instrumentation\",\"instrument\"],\"reset\":[\"@ember/instrumentation\",\"reset\"],\"subscribe\":[\"@ember/instrumentation\",\"subscribe\"],\"unsubscribe\":[\"@ember/instrumentation\",\"unsubscribe\"]},\"ember-locations/hash\":{\"default\":[\"@ember/routing/hash-location\"]},\"ember-locations/history\":{\"default\":[\"@ember/routing/history-location\"]},\"ember-locations/none\":{\"default\":[\"@ember/routing/none-location\"]},\"ember-map\":{\"default\":[\"@ember/map\"],\"withDefault\":[\"@ember/map/with-default\"]},\"ember-metal/events\":{\"addListener\":[\"@ember/object/events\",\"addListener\"],\"removeListener\":[\"@ember/object/events\",\"removeListener\"],\"send\":[\"@ember/object/events\",\"sendEvent\"]},\"ember-metal/get\":{\"default\":[\"@ember/object\",\"get\"],\"getProperties\":[\"@ember/object\",\"getProperties\"]},\"ember-metal/mixin\":{\"default\":[\"@ember/object/mixin\"]},\"ember-metal/observer\":{\"default\":[\"@ember/object\",\"observer\"],\"addObserver\":[\"@ember/object/observers\",\"addObserver\"],\"removeObserver\":[\"@ember/object/observers\",\"removeObserver\"]},\"ember-metal/on-load\":{\"default\":[\"@ember/application\",\"onLoad\"],\"run\":[\"@ember/application\",\"runLoadHooks\"]},\"ember-metal/set\":{\"default\":[\"@ember/object\",\"set\"],\"setProperties\":[\"@ember/object\",\"setProperties\"],\"trySet\":[\"@ember/object\",\"trySet\"]},\"ember-metal/utils\":{\"aliasMethod\":[\"@ember/object\",\"aliasMethod\"],\"assert\":[\"@ember/debug\",\"assert\"],\"cacheFor\":[\"@ember/object/internals\",\"cacheFor\"],\"copy\":[\"@ember/object/internals\",\"copy\"],\"guidFor\":[\"@ember/object/internals\",\"guidFor\"]},\"ember-object\":{\"default\":[\"@ember/object\"]},\"ember-owner/get\":{\"default\":[\"@ember/application\",\"getOwner\"]},\"ember-owner/set\":{\"default\":[\"@ember/application\",\"setOwner\"]},\"ember-platform\":{\"assign\":[\"@ember/polyfills\",\"assign\"],\"create\":[\"@ember/polyfills\",\"create\"],\"hasAccessors\":[\"@ember/polyfills\",\"hasPropertyAccessors\"],\"keys\":[\"@ember/polyfills\",\"keys\"]},\"ember-route\":{\"default\":[\"@ember/routing/route\"]},\"ember-router\":{\"default\":[\"@ember/routing/router\"]},\"ember-runloop\":{\"default\":[\"@ember/runloop\",\"run\"],\"begin\":[\"@ember/runloop\",\"begin\"],\"bind\":[\"@ember/runloop\",\"bind\"],\"cancel\":[\"@ember/runloop\",\"cancel\"],\"debounce\":[\"@ember/runloop\",\"debounce\"],\"end\":[\"@ember/runloop\",\"end\"],\"join\":[\"@ember/runloop\",\"join\"],\"later\":[\"@ember/runloop\",\"later\"],\"next\":[\"@ember/runloop\",\"next\"],\"once\":[\"@ember/runloop\",\"once\"],\"schedule\":[\"@ember/runloop\",\"schedule\"],\"scheduleOnce\":[\"@ember/runloop\",\"scheduleOnce\"],\"throttle\":[\"@ember/runloop\",\"throttle\"]},\"ember-service\":{\"default\":[\"@ember/service\"]},\"ember-service/inject\":{\"default\":[\"@ember/service\",\"inject\"]},\"ember-string\":{\"camelize\":[\"@ember/string\",\"camelize\"],\"capitalize\":[\"@ember/string\",\"capitalize\"],\"classify\":[\"@ember/string\",\"classify\"],\"dasherize\":[\"@ember/string\",\"dasherize\"],\"decamelize\":[\"@ember/string\",\"decamelize\"],\"fmt\":[\"@ember/string\",\"fmt\"],\"htmlSafe\":[\"@ember/string\",\"htmlSafe\"],\"loc\":[\"@ember/string\",\"loc\"],\"underscore\":[\"@ember/string\",\"underscore\"],\"w\":[\"@ember/string\",\"w\"]},\"ember-utils\":{\"isBlank\":[\"@ember/utils\",\"isBlank\"],\"isEmpty\":[\"@ember/utils\",\"isEmpty\"],\"isNone\":[\"@ember/utils\",\"isNone\"],\"isPresent\":[\"@ember/utils\",\"isPresent\"],\"tryInvoke\":[\"@ember/utils\",\"tryInvoke\"],\"typeOf\":[\"@ember/utils\",\"typeOf\"]},\"ember-computed\":{\"default\":[\"@ember/object\",\"computed\"],\"empty\":[\"@ember/object/computed\",\"empty\"],\"notEmpty\":[\"@ember/object/computed\",\"notEmpty\"],\"none\":[\"@ember/object/computed\",\"none\"],\"not\":[\"@ember/object/computed\",\"not\"],\"bool\":[\"@ember/object/computed\",\"bool\"],\"match\":[\"@ember/object/computed\",\"match\"],\"equal\":[\"@ember/object/computed\",\"equal\"],\"gt\":[\"@ember/object/computed\",\"gt\"],\"gte\":[\"@ember/object/computed\",\"gte\"],\"lt\":[\"@ember/object/computed\",\"lt\"],\"lte\":[\"@ember/object/computed\",\"lte\"],\"alias\":[\"@ember/object/computed\",\"alias\"],\"oneWay\":[\"@ember/object/computed\",\"oneWay\"],\"reads\":[\"@ember/object/computed\",\"reads\"],\"readOnly\":[\"@ember/object/computed\",\"readOnly\"],\"deprecatingAlias\":[\"@ember/object/computed\",\"deprecatingAlias\"],\"and\":[\"@ember/object/computed\",\"and\"],\"or\":[\"@ember/object/computed\",\"or\"],\"collect\":[\"@ember/object/computed\",\"collect\"],\"sum\":[\"@ember/object/computed\",\"sum\"],\"min\":[\"@ember/object/computed\",\"min\"],\"max\":[\"@ember/object/computed\",\"max\"],\"map\":[\"@ember/object/computed\",\"map\"],\"sort\":[\"@ember/object/computed\",\"sort\"],\"setDiff\":[\"@ember/object/computed\",\"setDiff\"],\"mapBy\":[\"@ember/object/computed\",\"mapBy\"],\"mapProperty\":[\"@ember/object/computed\",\"mapProperty\"],\"filter\":[\"@ember/object/computed\",\"filter\"],\"filterBy\":[\"@ember/object/computed\",\"filterBy\"],\"filterProperty\":[\"@ember/object/computed\",\"filterProperty\"],\"uniq\":[\"@ember/object/computed\",\"uniq\"],\"union\":[\"@ember/object/computed\",\"union\"],\"intersect\":[\"@ember/object/computed\",\"intersect\"]},\"ember-test/adapter\":{\"default\":[\"@ember/test/adapter\"]}};\n \n Object.defineProperty(values, '__esModule', {\n value: true\n });\n\n return values;\n });\n})();","(function() {\n/* globals define, Ember, jQuery */\n\n function processEmberShims() {\n var shims = {\n 'ember-application': {\n 'default': Ember.Application\n },\n 'ember-array': {\n 'default': Ember.Array\n },\n 'ember-array/mutable': {\n 'default': Ember.MutableArray\n },\n 'ember-array/utils': {\n 'A': Ember.A,\n 'isEmberArray': Ember.isArray,\n 'wrap': Ember.makeArray\n },\n 'ember-component': {\n 'default': Ember.Component\n },\n 'ember-components/checkbox': {\n 'default': Ember.Checkbox\n },\n 'ember-components/text-area': {\n 'default': Ember.TextArea\n },\n 'ember-components/text-field': {\n 'default': Ember.TextField\n },\n 'ember-controller': {\n 'default': Ember.Controller\n },\n 'ember-controller/inject': {\n 'default': Ember.inject.controller\n },\n 'ember-controller/proxy': {\n 'default': Ember.ArrayProxy\n },\n 'ember-controllers/sortable': {\n 'default': Ember.SortableMixin\n },\n 'ember-debug': {\n 'log': Ember.debug,\n 'inspect': Ember.inspect,\n 'run': Ember.runInDebug,\n 'warn': Ember.warn\n },\n 'ember-debug/container-debug-adapter': {\n 'default': Ember.ContainerDebugAdapter\n },\n 'ember-debug/data-adapter': {\n 'default': Ember.DataAdapter\n },\n 'ember-deprecations': {\n 'deprecate': Ember.deprecate,\n 'deprecateFunc': Ember.deprecateFunc\n },\n 'ember-enumerable': {\n 'default': Ember.Enumerable\n },\n 'ember-evented': {\n 'default': Ember.Evented\n },\n 'ember-evented/on': {\n 'default': Ember.on\n },\n 'ember-globals-resolver': {\n 'default': Ember.DefaultResolver\n },\n 'ember-helper': {\n 'default': Ember.Helper,\n 'helper': Ember.Helper && Ember.Helper.helper\n },\n 'ember-instrumentation': {\n 'instrument': Ember.Instrumentation.instrument,\n 'reset': Ember.Instrumentation.reset,\n 'subscribe': Ember.Instrumentation.subscribe,\n 'unsubscribe': Ember.Instrumentation.unsubscribe\n },\n 'ember-locations/hash': {\n 'default': Ember.HashLocation\n },\n 'ember-locations/history': {\n 'default': Ember.HistoryLocation\n },\n 'ember-locations/none': {\n 'default': Ember.NoneLocation\n },\n 'ember-map': {\n 'default': Ember.Map,\n 'withDefault': Ember.MapWithDefault\n },\n 'ember-metal/destroy': {\n 'default': Ember.destroy\n },\n 'ember-metal/events': {\n 'addListener': Ember.addListener,\n 'removeListener': Ember.removeListener,\n 'send': Ember.sendEvent\n },\n 'ember-metal/get': {\n 'default': Ember.get,\n 'getProperties': Ember.getProperties\n },\n 'ember-metal/mixin': {\n 'default': Ember.Mixin\n },\n 'ember-metal/observer': {\n 'default': Ember.observer,\n 'addObserver': Ember.addObserver,\n 'removeObserver': Ember.removeObserver\n },\n 'ember-metal/on-load': {\n 'default': Ember.onLoad,\n 'run': Ember.runLoadHooks\n },\n 'ember-metal/set': {\n 'default': Ember.set,\n 'setProperties': Ember.setProperties,\n 'trySet': Ember.trySet\n },\n 'ember-metal/utils': {\n 'aliasMethod': Ember.aliasMethod,\n 'assert': Ember.assert,\n 'cacheFor': Ember.cacheFor,\n 'copy': Ember.copy,\n 'guidFor': Ember.guidFor\n },\n 'ember-object': {\n 'default': Ember.Object\n },\n 'ember-owner/get': {\n 'default': Ember.getOwner\n },\n 'ember-owner/set': {\n 'default': Ember.setOwner\n },\n 'ember-platform': {\n 'assign': Ember.assign || Ember.merge,\n 'create': Ember.create,\n 'defineProperty': Ember.platform.defineProperty,\n 'hasAccessors': Ember.platform.hasPropertyAccessors,\n 'keys': Ember.keys\n },\n 'ember-route': {\n 'default': Ember.Route\n },\n 'ember-router': {\n 'default': Ember.Router\n },\n 'ember-runloop': {\n 'default': Ember.run,\n 'begin': Ember.run.begin,\n 'bind': Ember.run.bind,\n 'cancel': Ember.run.cancel,\n 'debounce': Ember.run.debounce,\n 'end': Ember.run.end,\n 'join': Ember.run.join,\n 'later': Ember.run.later,\n 'next': Ember.run.next,\n 'once': Ember.run.once,\n 'schedule': Ember.run.schedule,\n 'scheduleOnce': Ember.run.scheduleOnce,\n 'throttle': Ember.run.throttle\n },\n 'ember-service': {\n 'default': Ember.Service\n },\n 'ember-service/inject': {\n 'default': Ember.inject.service\n },\n 'ember-set/ordered': {\n 'default': Ember.OrderedSet\n },\n 'ember-string': {\n 'camelize': Ember.String.camelize,\n 'capitalize': Ember.String.capitalize,\n 'classify': Ember.String.classify,\n 'dasherize': Ember.String.dasherize,\n 'decamelize': Ember.String.decamelize,\n 'fmt': Ember.String.fmt,\n 'htmlSafe': Ember.String.htmlSafe,\n 'loc': Ember.String.loc,\n 'underscore': Ember.String.underscore,\n 'w': Ember.String.w\n },\n 'ember-utils': {\n 'isBlank': Ember.isBlank,\n 'isEmpty': Ember.isEmpty,\n 'isNone': Ember.isNone,\n 'isPresent': Ember.isPresent,\n 'tryInvoke': Ember.tryInvoke,\n 'typeOf': Ember.typeOf\n }\n };\n\n // populate `ember/computed` named exports\n shims['ember-computed'] = {\n 'default': Ember.computed\n };\n var computedMacros = [\n \"empty\",\"notEmpty\", \"none\", \"not\", \"bool\", \"match\",\n \"equal\", \"gt\", \"gte\", \"lt\", \"lte\", \"alias\", \"oneWay\",\n \"reads\", \"readOnly\", \"deprecatingAlias\",\n \"and\", \"or\", \"collect\", \"sum\", \"min\", \"max\",\n \"map\", \"sort\", \"setDiff\", \"mapBy\", \"mapProperty\",\n \"filter\", \"filterBy\", \"filterProperty\", \"uniq\",\n \"union\", \"intersect\"\n ];\n for (var i = 0, l = computedMacros.length; i < l; i++) {\n var key = computedMacros[i];\n shims['ember-computed'][key] = Ember.computed[key];\n }\n\n for (var moduleName in shims) {\n generateModule(moduleName, shims[moduleName], true);\n }\n }\n\n function processTestShims() {\n if (Ember.Test) {\n var testShims = {\n 'ember-test': {\n 'default': Ember.Test\n },\n 'ember-test/adapter': {\n 'default': Ember.Test.Adapter\n },\n 'ember-test/qunit-adapter': {\n 'default': Ember.Test.QUnitAdapter\n }\n };\n\n for (var moduleName in testShims) {\n generateModule(moduleName, testShims[moduleName]);\n }\n }\n }\n\n function generateModule(name, values, deprecated) {\n define(name, ['ember-cli-shims/deprecations'], function(deprecations) {\n 'use strict';\n\n if (deprecated) {\n var moduleDeprecations = deprecations[name];\n\n var message = 'Importing from the `' + name + '` module has been deprecated. ';\n if (moduleDeprecations) {\n message += 'Please use the new module imports:\\n\\n';\n Object.keys(moduleDeprecations).forEach(function(key) {\n var newImport = moduleDeprecations[key];\n if (newImport[1]) {\n message += 'import { ' + newImport[1] + ' } from \\'' + newImport[0] + '\\'\\n';\n } else {\n var importName = Ember.String.classify(newImport[0].split('/').pop());\n message += 'import ' + importName + ' from \\'' + newImport[0] + '\\'\\n';\n }\n });\n message += '\\n';\n\n } else {\n message += 'Please use globals instead.';\n }\n\n Ember.deprecate(message, false, {\n id: 'ember-cli-shims.deprecated-shims',\n until: '3.0.0',\n url: 'https://github.com/emberjs/rfcs/blob/master/text/0176-javascript-module-api.md'\n });\n }\n\n Object.defineProperty(values, '__esModule', {\n value: true\n });\n\n return values;\n });\n }\n\n generateModule('ember', { default: Ember });\n processEmberShims();\n processTestShims();\n generateModule('jquery', { 'default': self.jQuery });\n generateModule('rsvp', { 'default': Ember.RSVP });\n})();\n","/* globals define */\n\nfunction createDeprecatedModule(moduleId) {\n define(moduleId, ['exports', 'ember-resolver/resolver', 'ember'], function(exports, Resolver, Ember) {\n Ember['default'].deprecate(\n 'Usage of `' + moduleId + '` module is deprecated, please update to `ember-resolver`.',\n false,\n { id: 'ember-resolver.legacy-shims', until: '3.0.0' }\n );\n\n exports['default'] = Resolver['default'];\n });\n}\n\ncreateDeprecatedModule('ember/resolver');\ncreateDeprecatedModule('resolver');\n","define('ember-ajax/-private/promise', ['exports'], function (exports) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n\n /**\n * AJAX Promise\n *\n * Sub-class of RSVP Promise that passes the XHR property on to the\n * child promise\n *\n * @extends RSVP.Promise\n * @private\n */\n class AJAXPromise extends Ember.RSVP.Promise {\n /**\n * Overriding `.then` to add XHR to child promise\n *\n * @public\n * @return {AJAXPromise} child promise\n */\n then() {\n const child = super.then(...arguments);\n\n child.xhr = this.xhr;\n\n return child;\n }\n }\n exports.default = AJAXPromise;\n});","define('ember-ajax/-private/utils/get-header', ['exports'], function (exports) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = getHeader;\n\n\n /**\n * Do a case-insensitive lookup of an HTTP header\n *\n * @function getHeader\n * @private\n * @param {Object} headers\n * @param {string} name\n * @return {string}\n */\n function getHeader(headers, name) {\n if (Ember.isNone(headers) || Ember.isNone(name)) {\n return; // ask for nothing, get nothing.\n }\n\n const matchedKey = Ember.A(Object.keys(headers)).find(key => {\n return key.toLowerCase() === name.toLowerCase();\n });\n\n return headers[matchedKey];\n }\n});","define('ember-ajax/-private/utils/is-fastboot', ['exports'], function (exports) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n /* global FastBoot */\n const isFastBoot = typeof FastBoot !== 'undefined';\n exports.default = isFastBoot;\n});","define('ember-ajax/-private/utils/is-string', ['exports'], function (exports) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = isString;\n function isString(object) {\n return typeof object === 'string';\n }\n});","define('ember-ajax/-private/utils/parse-response-headers', ['exports'], function (exports) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = parseResponseHeaders;\n const CRLF = exports.CRLF = '\\u000d\\u000a';\n\n function parseResponseHeaders(headersString) {\n const headers = {};\n\n if (!headersString) {\n return headers;\n }\n\n return headersString.split(CRLF).reduce((hash, header) => {\n let [field, ...value] = header.split(':');\n\n field = field.trim();\n value = value.join(':').trim();\n\n if (value) {\n hash[field] = value;\n }\n\n return hash;\n }, headers);\n }\n});","define('ember-ajax/-private/utils/url-helpers', ['exports', 'require', 'ember-ajax/-private/utils/is-fastboot'], function (exports, _require2, _isFastboot) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.parseURL = parseURL;\n exports.isFullURL = isFullURL;\n exports.haveSameHost = haveSameHost;\n /* eslint-env browser, node */\n\n const completeUrlRegex = /^(http|https)/;\n\n /*\n * Isomorphic URL parsing\n * Borrowed from\n * http://www.sitepoint.com/url-parsing-isomorphic-javascript/\n */\n const isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';\n\n const url = function () {\n if (_isFastboot.default) {\n // ember-fastboot-server provides the node url module as URL global\n return URL;\n }\n\n if (isNode) {\n return (0, _require2.default)('url');\n }\n\n return document.createElement('a');\n }();\n\n /**\n * Parse a URL string into an object that defines its structure\n *\n * The returned object will have the following properties:\n *\n * href: the full URL\n * protocol: the request protocol\n * hostname: the target for the request\n * port: the port for the request\n * pathname: any URL after the host\n * search: query parameters\n * hash: the URL hash\n *\n * @function parseURL\n * @private\n * @param {string} str The string to parse\n * @return {Object} URL structure\n */\n function parseURL(str) {\n let fullObject;\n\n if (isNode || _isFastboot.default) {\n fullObject = url.parse(str);\n } else {\n url.href = str;\n fullObject = url;\n }\n\n const desiredProps = {};\n desiredProps.href = fullObject.href;\n desiredProps.protocol = fullObject.protocol;\n desiredProps.hostname = fullObject.hostname;\n desiredProps.port = fullObject.port;\n desiredProps.pathname = fullObject.pathname;\n desiredProps.search = fullObject.search;\n desiredProps.hash = fullObject.hash;\n return desiredProps;\n }\n\n function isFullURL(url) {\n return url.match(completeUrlRegex);\n }\n\n function haveSameHost(a, b) {\n a = parseURL(a);\n b = parseURL(b);\n\n return a.protocol === b.protocol && a.hostname === b.hostname && a.port === b.port;\n }\n});","define('ember-ajax/ajax-request', ['exports', 'ember-ajax/mixins/ajax-request'], function (exports, _ajaxRequest) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = Ember.Object.extend(_ajaxRequest.default);\n});","define('ember-ajax/errors', ['exports'], function (exports) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.AjaxError = AjaxError;\n exports.InvalidError = InvalidError;\n exports.UnauthorizedError = UnauthorizedError;\n exports.ForbiddenError = ForbiddenError;\n exports.BadRequestError = BadRequestError;\n exports.NotFoundError = NotFoundError;\n exports.TimeoutError = TimeoutError;\n exports.AbortError = AbortError;\n exports.ConflictError = ConflictError;\n exports.ServerError = ServerError;\n exports.isAjaxError = isAjaxError;\n exports.isUnauthorizedError = isUnauthorizedError;\n exports.isForbiddenError = isForbiddenError;\n exports.isInvalidError = isInvalidError;\n exports.isBadRequestError = isBadRequestError;\n exports.isNotFoundError = isNotFoundError;\n exports.isTimeoutError = isTimeoutError;\n exports.isAbortError = isAbortError;\n exports.isConflictError = isConflictError;\n exports.isServerError = isServerError;\n exports.isSuccess = isSuccess;\n\n\n /**\n * @class AjaxError\n * @public\n * @extends Ember.Error\n */\n function AjaxError(payload, message = 'Ajax operation failed', status) {\n Ember.Error.call(this, message);\n\n this.payload = payload;\n this.status = status;\n }\n\n AjaxError.prototype = Object.create(Ember.Error.prototype);\n\n /**\n * @class InvalidError\n * @public\n * @extends AjaxError\n */\n function InvalidError(payload) {\n AjaxError.call(this, payload, 'Request was rejected because it was invalid', 422);\n }\n\n InvalidError.prototype = Object.create(AjaxError.prototype);\n\n /**\n * @class UnauthorizedError\n * @public\n * @extends AjaxError\n */\n function UnauthorizedError(payload) {\n AjaxError.call(this, payload, 'Ajax authorization failed', 401);\n }\n\n UnauthorizedError.prototype = Object.create(AjaxError.prototype);\n\n /**\n * @class ForbiddenError\n * @public\n * @extends AjaxError\n */\n function ForbiddenError(payload) {\n AjaxError.call(this, payload, 'Request was rejected because user is not permitted to perform this operation.', 403);\n }\n\n ForbiddenError.prototype = Object.create(AjaxError.prototype);\n\n /**\n * @class BadRequestError\n * @public\n * @extends AjaxError\n */\n function BadRequestError(payload) {\n AjaxError.call(this, payload, 'Request was formatted incorrectly.', 400);\n }\n\n BadRequestError.prototype = Object.create(AjaxError.prototype);\n\n /**\n * @class NotFoundError\n * @public\n * @extends AjaxError\n */\n function NotFoundError(payload) {\n AjaxError.call(this, payload, 'Resource was not found.', 404);\n }\n\n NotFoundError.prototype = Object.create(AjaxError.prototype);\n\n /**\n * @class TimeoutError\n * @public\n * @extends AjaxError\n */\n function TimeoutError() {\n AjaxError.call(this, null, 'The ajax operation timed out', -1);\n }\n\n TimeoutError.prototype = Object.create(AjaxError.prototype);\n\n /**\n * @class AbortError\n * @public\n * @extends AjaxError\n */\n function AbortError() {\n AjaxError.call(this, null, 'The ajax operation was aborted', 0);\n }\n\n AbortError.prototype = Object.create(AjaxError.prototype);\n\n /**\n * @class ConflictError\n * @public\n * @extends AjaxError\n */\n function ConflictError(payload) {\n AjaxError.call(this, payload, 'The ajax operation failed due to a conflict', 409);\n }\n\n ConflictError.prototype = Object.create(AjaxError.prototype);\n\n /**\n * @class ServerError\n * @public\n * @extends AjaxError\n */\n function ServerError(payload, status) {\n AjaxError.call(this, payload, 'Request was rejected due to server error', status);\n }\n\n ServerError.prototype = Object.create(AjaxError.prototype);\n\n /**\n * Checks if the given error is or inherits from AjaxError\n *\n * @method isAjaxError\n * @public\n * @param {Error} error\n * @return {Boolean}\n */\n function isAjaxError(error) {\n return error instanceof AjaxError;\n }\n\n /**\n * Checks if the given status code or AjaxError object represents an\n * unauthorized request error\n *\n * @method isUnauthorizedError\n * @public\n * @param {Number | AjaxError} error\n * @return {Boolean}\n */\n function isUnauthorizedError(error) {\n if (isAjaxError(error)) {\n return error instanceof UnauthorizedError;\n } else {\n return error === 401;\n }\n }\n\n /**\n * Checks if the given status code or AjaxError object represents a forbidden\n * request error\n *\n * @method isForbiddenError\n * @public\n * @param {Number | AjaxError} error\n * @return {Boolean}\n */\n function isForbiddenError(error) {\n if (isAjaxError(error)) {\n return error instanceof ForbiddenError;\n } else {\n return error === 403;\n }\n }\n\n /**\n * Checks if the given status code or AjaxError object represents an invalid\n * request error\n *\n * @method isInvalidError\n * @public\n * @param {Number | AjaxError} error\n * @return {Boolean}\n */\n function isInvalidError(error) {\n if (isAjaxError(error)) {\n return error instanceof InvalidError;\n } else {\n return error === 422;\n }\n }\n\n /**\n * Checks if the given status code or AjaxError object represents a bad request\n * error\n *\n * @method isBadRequestError\n * @public\n * @param {Number | AjaxError} error\n * @return {Boolean}\n */\n function isBadRequestError(error) {\n if (isAjaxError(error)) {\n return error instanceof BadRequestError;\n } else {\n return error === 400;\n }\n }\n\n /**\n * Checks if the given status code or AjaxError object represents a\n * \"not found\" error\n *\n * @method isNotFoundError\n * @public\n * @param {Number | AjaxError} error\n * @return {Boolean}\n */\n function isNotFoundError(error) {\n if (isAjaxError(error)) {\n return error instanceof NotFoundError;\n } else {\n return error === 404;\n }\n }\n\n /**\n * Checks if the given status code or AjaxError object represents a\n * \"timeout\" error\n *\n * @method isTimeoutError\n * @public\n * @param {AjaxError} error\n * @return {Boolean}\n */\n function isTimeoutError(error) {\n return error instanceof TimeoutError;\n }\n\n /**\n * Checks if the given status code or AjaxError object represents an\n * \"abort\" error\n *\n * @method isAbortError\n * @public\n * @param {AjaxError} error\n * @return {Boolean}\n */\n function isAbortError(error) {\n if (isAjaxError(error)) {\n return error instanceof AbortError;\n } else {\n return error === 0;\n }\n }\n\n /**\n * Checks if the given status code or AjaxError object represents a\n * conflict error\n *\n * @method isConflictError\n * @public\n * @param {Number | AjaxError} error\n * @return {Boolean}\n */\n function isConflictError(error) {\n if (isAjaxError(error)) {\n return error instanceof ConflictError;\n } else {\n return error === 409;\n }\n }\n\n /**\n * Checks if the given status code or AjaxError object represents a server error\n *\n * @method isServerError\n * @public\n * @param {Number | AjaxError} error\n * @return {Boolean}\n */\n function isServerError(error) {\n if (isAjaxError(error)) {\n return error instanceof ServerError;\n } else {\n return error >= 500 && error < 600;\n }\n }\n\n /**\n * Checks if the given status code represents a successful request\n *\n * @method isSuccess\n * @public\n * @param {Number} status\n * @return {Boolean}\n */\n function isSuccess(status) {\n const s = parseInt(status, 10);\n\n return s >= 200 && s < 300 || s === 304;\n }\n});","define('ember-ajax/index', ['exports', 'ember-ajax/request'], function (exports, _request) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n Object.defineProperty(exports, 'default', {\n enumerable: true,\n get: function () {\n return _request.default;\n }\n });\n});","define('ember-ajax/mixins/ajax-request', ['exports', 'ember-ajax/errors', 'ember-ajax/utils/ajax', 'ember-ajax/-private/utils/parse-response-headers', 'ember-ajax/-private/utils/get-header', 'ember-ajax/-private/utils/url-helpers', 'ember-ajax/-private/utils/is-string', 'ember-ajax/-private/promise'], function (exports, _errors, _ajax, _parseResponseHeaders, _getHeader, _urlHelpers, _isString, _promise) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n\n const { Logger, Test, testing } = Ember;\n const JSONContentType = /^application\\/(?:vnd\\.api\\+)?json/i;\n\n function isJSONContentType(header) {\n if (!(0, _isString.default)(header)) {\n return false;\n }\n return !!header.match(JSONContentType);\n }\n\n function isJSONStringifyable(method, { contentType, data, headers }) {\n if (method === 'GET') {\n return false;\n }\n\n if (!isJSONContentType(contentType) && !isJSONContentType((0, _getHeader.default)(headers, 'Content-Type'))) {\n return false;\n }\n\n if (typeof data !== 'object') {\n return false;\n }\n\n return true;\n }\n\n function startsWithSlash(string) {\n return string.charAt(0) === '/';\n }\n\n function endsWithSlash(string) {\n return string.charAt(string.length - 1) === '/';\n }\n\n function removeLeadingSlash(string) {\n return string.substring(1);\n }\n\n function stripSlashes(path) {\n // make sure path starts with `/`\n if (startsWithSlash(path)) {\n path = removeLeadingSlash(path);\n }\n\n // remove end `/`\n if (endsWithSlash(path)) {\n path = path.slice(0, -1);\n }\n return path;\n }\n\n let pendingRequestCount = 0;\n if (testing) {\n Test.registerWaiter(function () {\n return pendingRequestCount === 0;\n });\n }\n\n /**\n * AjaxRequest Mixin\n *\n * @public\n * @mixin\n */\n exports.default = Ember.Mixin.create({\n /**\n * The default value for the request `contentType`\n *\n * For now, defaults to the same value that jQuery would assign. In the\n * future, the default value will be for JSON requests.\n * @property {string} contentType\n * @public\n * @default\n */\n contentType: 'application/x-www-form-urlencoded; charset=UTF-8',\n\n /**\n * Headers to include on the request\n *\n * Some APIs require HTTP headers, e.g. to provide an API key. Arbitrary\n * headers can be set as key/value pairs on the `RESTAdapter`'s `headers`\n * object and Ember Data will send them along with each ajax request.\n *\n * ```javascript\n * // app/services/ajax.js\n * import AjaxService from 'ember-ajax/services/ajax';\n *\n * export default AjaxService.extend({\n * headers: {\n * 'API_KEY': 'secret key',\n * 'ANOTHER_HEADER': 'Some header value'\n * }\n * });\n * ```\n *\n * `headers` can also be used as a computed property to support dynamic\n * headers.\n *\n * ```javascript\n * // app/services/ajax.js\n * import Ember from 'ember';\n * import AjaxService from 'ember-ajax/services/ajax';\n *\n * const {\n * computed,\n * get,\n * inject: { service }\n * } = Ember;\n *\n * export default AjaxService.extend({\n * session: service(),\n * headers: computed('session.authToken', function() {\n * return {\n * 'API_KEY': get(this, 'session.authToken'),\n * 'ANOTHER_HEADER': 'Some header value'\n * };\n * })\n * });\n * ```\n *\n * In some cases, your dynamic headers may require data from some object\n * outside of Ember's observer system (for example `document.cookie`). You\n * can use the `volatile` function to set the property into a non-cached mode\n * causing the headers to be recomputed with every request.\n *\n * ```javascript\n * // app/services/ajax.js\n * import Ember from 'ember';\n * import AjaxService from 'ember-ajax/services/ajax';\n *\n * const {\n * computed,\n * get,\n * inject: { service }\n * } = Ember;\n *\n * export default AjaxService.extend({\n * session: service(),\n * headers: computed('session.authToken', function() {\n * return {\n * 'API_KEY': get(document.cookie.match(/apiKey\\=([^;]*)/), '1'),\n * 'ANOTHER_HEADER': 'Some header value'\n * };\n * }).volatile()\n * });\n * ```\n *\n * @property {Object} headers\n * @public\n * @default\n */\n headers: {},\n\n /**\n * Make an AJAX request, ignoring the raw XHR object and dealing only with\n * the response\n *\n * @method request\n * @public\n * @param {string} url The url to make a request to\n * @param {Object} options The options for the request\n * @return {Promise} The result of the request\n */\n request(url, options) {\n const hash = this.options(url, options);\n const internalPromise = this._makeRequest(hash);\n\n const ajaxPromise = new _promise.default((resolve, reject) => {\n internalPromise.then(({ response }) => {\n resolve(response);\n }).catch(({ response }) => {\n reject(response);\n });\n }, `ember-ajax: ${hash.type} ${hash.url} response`);\n\n ajaxPromise.xhr = internalPromise.xhr;\n\n return ajaxPromise;\n },\n\n /**\n * Make an AJAX request, returning the raw XHR object along with the response\n *\n * @method raw\n * @public\n * @param {string} url The url to make a request to\n * @param {Object} options The options for the request\n * @return {Promise} The result of the request\n */\n raw(url, options) {\n const hash = this.options(url, options);\n return this._makeRequest(hash);\n },\n\n /**\n * Shared method to actually make an AJAX request\n *\n * @method _makeRequest\n * @private\n * @param {Object} hash The options for the request\n * @param {string} hash.url The URL to make the request to\n * @return {Promise} The result of the request\n */\n _makeRequest(hash) {\n const method = hash.method || hash.type || 'GET';\n const requestData = { method, type: method, url: hash.url };\n\n if (isJSONStringifyable(method, hash)) {\n hash.data = JSON.stringify(hash.data);\n }\n\n pendingRequestCount = pendingRequestCount + 1;\n\n const jqXHR = (0, _ajax.default)(hash);\n\n const promise = new _promise.default((resolve, reject) => {\n jqXHR.done((payload, textStatus, jqXHR) => {\n const response = this.handleResponse(jqXHR.status, (0, _parseResponseHeaders.default)(jqXHR.getAllResponseHeaders()), payload, requestData);\n\n if ((0, _errors.isAjaxError)(response)) {\n Ember.run.join(null, reject, { payload, textStatus, jqXHR, response });\n } else {\n Ember.run.join(null, resolve, { payload, textStatus, jqXHR, response });\n }\n }).fail((jqXHR, textStatus, errorThrown) => {\n Ember.runInDebug(function () {\n const message = `The server returned an empty string for ${requestData.type} ${requestData.url}, which cannot be parsed into a valid JSON. Return either null or {}.`;\n const validJSONString = !(textStatus === 'parsererror' && jqXHR.responseText === '');\n\n (true && Ember.warn(message, validJSONString, {\n id: 'ds.adapter.returned-empty-string-as-JSON'\n }));\n });\n\n const payload = this.parseErrorResponse(jqXHR.responseText) || errorThrown;\n let response;\n\n if (errorThrown instanceof Error) {\n response = errorThrown;\n } else if (textStatus === 'timeout') {\n response = new _errors.TimeoutError();\n } else if (textStatus === 'abort') {\n response = new _errors.AbortError();\n } else {\n response = this.handleResponse(jqXHR.status, (0, _parseResponseHeaders.default)(jqXHR.getAllResponseHeaders()), payload, requestData);\n }\n\n Ember.run.join(null, reject, { payload, textStatus, jqXHR, errorThrown, response });\n }).always(() => {\n pendingRequestCount = pendingRequestCount - 1;\n });\n }, `ember-ajax: ${hash.type} ${hash.url}`);\n\n promise.xhr = jqXHR;\n\n return promise;\n },\n\n /**\n * calls `request()` but forces `options.type` to `POST`\n *\n * @method post\n * @public\n * @param {string} url The url to make a request to\n * @param {Object} options The options for the request\n * @return {Promise} The result of the request\n */\n post(url, options) {\n return this.request(url, this._addTypeToOptionsFor(options, 'POST'));\n },\n\n /**\n * calls `request()` but forces `options.type` to `PUT`\n *\n * @method put\n * @public\n * @param {string} url The url to make a request to\n * @param {Object} options The options for the request\n * @return {Promise} The result of the request\n */\n put(url, options) {\n return this.request(url, this._addTypeToOptionsFor(options, 'PUT'));\n },\n\n /**\n * calls `request()` but forces `options.type` to `PATCH`\n *\n * @method patch\n * @public\n * @param {string} url The url to make a request to\n * @param {Object} options The options for the request\n * @return {Promise} The result of the request\n */\n patch(url, options) {\n return this.request(url, this._addTypeToOptionsFor(options, 'PATCH'));\n },\n\n /**\n * calls `request()` but forces `options.type` to `DELETE`\n *\n * @method del\n * @public\n * @param {string} url The url to make a request to\n * @param {Object} options The options for the request\n * @return {Promise} The result of the request\n */\n del(url, options) {\n return this.request(url, this._addTypeToOptionsFor(options, 'DELETE'));\n },\n\n /**\n * calls `request()` but forces `options.type` to `DELETE`\n *\n * Alias for `del()`\n *\n * @method delete\n * @public\n * @param {string} url The url to make a request to\n * @param {Object} options The options for the request\n * @return {Promise} The result of the request\n */\n delete() {\n return this.del(...arguments);\n },\n\n /**\n * Wrap the `.get` method so that we issue a warning if\n *\n * Since `.get` is both an AJAX pattern _and_ an Ember pattern, we want to try\n * to warn users when they try using `.get` to make a request\n *\n * @method get\n * @public\n */\n get(url) {\n if (arguments.length > 1 || url.indexOf('/') !== -1) {\n throw new Ember.Error('It seems you tried to use `.get` to make a request! Use the `.request` method instead.');\n }\n return this._super(...arguments);\n },\n\n /**\n * Manipulates the options hash to include the HTTP method on the type key\n *\n * @method _addTypeToOptionsFor\n * @private\n * @param {Object} options The original request options\n * @param {string} method The method to enforce\n * @return {Object} The new options, with the method set\n */\n _addTypeToOptionsFor(options, method) {\n options = options || {};\n options.type = method;\n return options;\n },\n\n /**\n * Get the full \"headers\" hash, combining the service-defined headers with\n * the ones provided for the request\n *\n * @method _getFullHeadersHash\n * @private\n * @param {Object} headers\n * @return {Object}\n */\n _getFullHeadersHash(headers) {\n const classHeaders = Ember.get(this, 'headers');\n const _headers = Ember.merge({}, classHeaders);\n return Ember.merge(_headers, headers);\n },\n\n /**\n * @method options\n * @private\n * @param {string} url\n * @param {Object} options\n * @return {Object}\n */\n options(url, options = {}) {\n options = Ember.merge({}, options);\n options.url = this._buildURL(url, options);\n options.type = options.type || 'GET';\n options.dataType = options.dataType || 'json';\n options.contentType = Ember.isEmpty(options.contentType) ? Ember.get(this, 'contentType') : options.contentType;\n\n if (this._shouldSendHeaders(options)) {\n options.headers = this._getFullHeadersHash(options.headers);\n } else {\n options.headers = options.headers || {};\n }\n\n return options;\n },\n\n /**\n * Build a URL for a request\n *\n * If the provided `url` is deemed to be a complete URL, it will be returned\n * directly. If it is not complete, then the segment provided will be combined\n * with the `host` and `namespace` options of the request class to create the\n * full URL.\n *\n * @private\n * @param {string} url the url, or url segment, to request\n * @param {Object} [options={}] the options for the request being made\n * @param {string} [options.host] the host to use for this request\n * @returns {string} the URL to make a request to\n */\n _buildURL(url, options = {}) {\n if ((0, _urlHelpers.isFullURL)(url)) {\n return url;\n }\n\n const urlParts = [];\n\n let host = options.host || Ember.get(this, 'host');\n if (host) {\n host = stripSlashes(host);\n }\n urlParts.push(host);\n\n let namespace = options.namespace || Ember.get(this, 'namespace');\n if (namespace) {\n namespace = stripSlashes(namespace);\n urlParts.push(namespace);\n }\n\n // If the URL has already been constructed (presumably, by Ember Data), then we should just leave it alone\n const hasNamespaceRegex = new RegExp(`^(/)?${namespace}`);\n if (hasNamespaceRegex.test(url)) {\n return url;\n }\n\n // *Only* remove a leading slash -- we need to maintain a trailing slash for\n // APIs that differentiate between it being and not being present\n if (startsWithSlash(url)) {\n url = removeLeadingSlash(url);\n }\n urlParts.push(url);\n\n return urlParts.join('/');\n },\n\n /**\n * Takes an ajax response, and returns the json payload or an error.\n *\n * By default this hook just returns the json payload passed to it.\n * You might want to override it in two cases:\n *\n * 1. Your API might return useful results in the response headers.\n * Response headers are passed in as the second argument.\n *\n * 2. Your API might return errors as successful responses with status code\n * 200 and an Errors text or object.\n *\n * @method handleResponse\n * @private\n * @param {Number} status\n * @param {Object} headers\n * @param {Object} payload\n * @param {Object} requestData the original request information\n * @return {Object | AjaxError} response\n */\n handleResponse(status, headers, payload, requestData) {\n if (this.isSuccess(status, headers, payload)) {\n return payload;\n }\n\n // Allow overriding of error payload\n payload = this.normalizeErrorResponse(status, headers, payload);\n\n return this._createCorrectError(status, headers, payload, requestData);\n },\n\n _createCorrectError(status, headers, payload, requestData) {\n let error;\n\n if (this.isUnauthorizedError(status, headers, payload)) {\n error = new _errors.UnauthorizedError(payload);\n } else if (this.isForbiddenError(status, headers, payload)) {\n error = new _errors.ForbiddenError(payload);\n } else if (this.isInvalidError(status, headers, payload)) {\n error = new _errors.InvalidError(payload);\n } else if (this.isBadRequestError(status, headers, payload)) {\n error = new _errors.BadRequestError(payload);\n } else if (this.isNotFoundError(status, headers, payload)) {\n error = new _errors.NotFoundError(payload);\n } else if (this.isAbortError(status, headers, payload)) {\n error = new _errors.AbortError(payload);\n } else if (this.isConflictError(status, headers, payload)) {\n error = new _errors.ConflictError(payload);\n } else if (this.isServerError(status, headers, payload)) {\n error = new _errors.ServerError(payload, status);\n } else {\n const detailedMessage = this.generateDetailedMessage(status, headers, payload, requestData);\n\n error = new _errors.AjaxError(payload, detailedMessage, status);\n }\n\n return error;\n },\n\n /**\n * Match the host to a provided array of strings or regexes that can match to a host\n *\n * @method matchHosts\n * @private\n * @param {string} host the host you are sending too\n * @param {RegExp | string} matcher a string or regex that you can match the host to.\n * @returns {Boolean} if the host passed the matcher\n */\n _matchHosts(host, matcher) {\n if (matcher.constructor === RegExp) {\n return matcher.test(host);\n } else if (typeof matcher === 'string') {\n return matcher === host;\n } else {\n Logger.warn('trustedHosts only handles strings or regexes.', matcher, 'is neither.');\n return false;\n }\n },\n\n /**\n * Determine whether the headers should be added for this request\n *\n * This hook is used to help prevent sending headers to every host, regardless\n * of the destination, since this could be a security issue if authentication\n * tokens are accidentally leaked to third parties.\n *\n * To avoid that problem, subclasses should utilize the `headers` computed\n * property to prevent authentication from being sent to third parties, or\n * implement this hook for more fine-grain control over when headers are sent.\n *\n * By default, the headers are sent if the host of the request matches the\n * `host` property designated on the class.\n *\n * @method _shouldSendHeaders\n * @private\n * @property {Object} hash request options hash\n * @returns {Boolean} whether or not headers should be sent\n */\n _shouldSendHeaders({ url, host }) {\n url = url || '';\n host = host || Ember.get(this, 'host') || '';\n\n const trustedHosts = Ember.get(this, 'trustedHosts') || Ember.A();\n const { hostname } = (0, _urlHelpers.parseURL)(url);\n\n // Add headers on relative URLs\n if (!(0, _urlHelpers.isFullURL)(url)) {\n return true;\n } else if (trustedHosts.find(matcher => this._matchHosts(hostname, matcher))) {\n return true;\n }\n\n // Add headers on matching host\n return (0, _urlHelpers.haveSameHost)(url, host);\n },\n\n /**\n * Generates a detailed (\"friendly\") error message, with plenty\n * of information for debugging (good luck!)\n *\n * @method generateDetailedMessage\n * @private\n * @param {Number} status\n * @param {Object} headers\n * @param {Object} payload\n * @param {Object} requestData the original request information\n * @return {Object} request information\n */\n generateDetailedMessage(status, headers, payload, requestData) {\n let shortenedPayload;\n const payloadContentType = (0, _getHeader.default)(headers, 'Content-Type') || 'Empty Content-Type';\n\n if (payloadContentType.toLowerCase() === 'text/html' && payload.length > 250) {\n shortenedPayload = '[Omitted Lengthy HTML]';\n } else {\n shortenedPayload = JSON.stringify(payload);\n }\n\n const requestDescription = `${requestData.type} ${requestData.url}`;\n const payloadDescription = `Payload (${payloadContentType})`;\n\n return [`Ember AJAX Request ${requestDescription} returned a ${status}`, payloadDescription, shortenedPayload].join('\\n');\n },\n\n /**\n * Default `handleResponse` implementation uses this hook to decide if the\n * response is a an authorized error.\n *\n * @method isUnauthorizedError\n * @private\n * @param {Number} status\n * @param {Object} headers\n * @param {Object} payload\n * @return {Boolean}\n */\n isUnauthorizedError(status) {\n return (0, _errors.isUnauthorizedError)(status);\n },\n\n /**\n * Default `handleResponse` implementation uses this hook to decide if the\n * response is a forbidden error.\n *\n * @method isForbiddenError\n * @private\n * @param {Number} status\n * @param {Object} headers\n * @param {Object} payload\n * @return {Boolean}\n */\n isForbiddenError(status) {\n return (0, _errors.isForbiddenError)(status);\n },\n\n /**\n * Default `handleResponse` implementation uses this hook to decide if the\n * response is a an invalid error.\n *\n * @method isInvalidError\n * @private\n * @param {Number} status\n * @param {Object} headers\n * @param {Object} payload\n * @return {Boolean}\n */\n isInvalidError(status) {\n return (0, _errors.isInvalidError)(status);\n },\n\n /**\n * Default `handleResponse` implementation uses this hook to decide if the\n * response is a bad request error.\n *\n * @method isBadRequestError\n * @private\n * @param {Number} status\n * @param {Object} headers\n * @param {Object} payload\n * @return {Boolean}\n */\n isBadRequestError(status) {\n return (0, _errors.isBadRequestError)(status);\n },\n\n /**\n * Default `handleResponse` implementation uses this hook to decide if the\n * response is a \"not found\" error.\n *\n * @method isNotFoundError\n * @private\n * @param {Number} status\n * @param {Object} headers\n * @param {Object} payload\n * @return {Boolean}\n */\n isNotFoundError(status) {\n return (0, _errors.isNotFoundError)(status);\n },\n\n /**\n * Default `handleResponse` implementation uses this hook to decide if the\n * response is an \"abort\" error.\n *\n * @method isAbortError\n * @private\n * @param {Number} status\n * @param {Object} headers\n * @param {Object} payload\n * @return {Boolean}\n */\n isAbortError(status) {\n return (0, _errors.isAbortError)(status);\n },\n\n /**\n * Default `handleResponse` implementation uses this hook to decide if the\n * response is a \"conflict\" error.\n *\n * @method isConflictError\n * @private\n * @param {Number} status\n * @param {Object} headers\n * @param {Object} payload\n * @return {Boolean}\n */\n isConflictError(status) {\n return (0, _errors.isConflictError)(status);\n },\n\n /**\n * Default `handleResponse` implementation uses this hook to decide if the\n * response is a server error.\n *\n * @method isServerError\n * @private\n * @param {Number} status\n * @param {Object} headers\n * @param {Object} payload\n * @return {Boolean}\n */\n isServerError(status) {\n return (0, _errors.isServerError)(status);\n },\n\n /**\n * Default `handleResponse` implementation uses this hook to decide if the\n * response is a success.\n *\n * @method isSuccess\n * @private\n * @param {Number} status\n * @param {Object} headers\n * @param {Object} payload\n * @return {Boolean}\n */\n isSuccess(status) {\n return (0, _errors.isSuccess)(status);\n },\n\n /**\n * @method parseErrorResponse\n * @private\n * @param {string} responseText\n * @return {Object}\n */\n parseErrorResponse(responseText) {\n try {\n return JSON.parse(responseText);\n } catch (e) {\n return responseText;\n }\n },\n\n /**\n * Can be overwritten to allow re-formatting of error messages\n *\n * @method normalizeErrorResponse\n * @private\n * @param {Number} status\n * @param {Object} headers\n * @param {Object} payload\n * @return {*} error response\n */\n normalizeErrorResponse(status, headers, payload) {\n return payload;\n }\n });\n});","define('ember-ajax/mixins/ajax-support', ['exports'], function (exports) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = Ember.Mixin.create({\n /**\n * The AJAX service to send requests through\n *\n * @property {AjaxService} ajaxService\n * @public\n */\n ajaxService: Ember.inject.service('ajax'),\n\n /**\n * @property {string} host\n * @public\n */\n host: Ember.computed.alias('ajaxService.host'),\n\n /**\n * @property {string} namespace\n * @public\n */\n namespace: Ember.computed.alias('ajaxService.namespace'),\n\n /**\n * @property {object} headers\n * @public\n */\n headers: Ember.computed.alias('ajaxService.headers'),\n\n ajax(url) {\n const augmentedOptions = this.ajaxOptions(...arguments);\n\n return this.get('ajaxService').request(url, augmentedOptions);\n }\n });\n});","define('ember-ajax/mixins/legacy/normalize-error-response', ['exports', 'ember-ajax/-private/utils/is-string'], function (exports, _isString) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n\n function isObject(object) {\n return typeof object === 'object';\n }\n\n exports.default = Ember.Mixin.create({\n /**\n * Normalize the error from the server into the same format\n *\n * The format we normalize to is based on the JSON API specification. The\n * return value should be an array of objects that match the format they\n * describe. More details about the object format can be found\n * [here](http://jsonapi.org/format/#error-objects)\n *\n * The basics of the format are as follows:\n *\n * ```javascript\n * [\n * {\n * status: 'The status code for the error',\n * title: 'The human-readable title of the error'\n * detail: 'The human-readable details of the error'\n * }\n * ]\n * ```\n *\n * In cases where the server returns an array, then there should be one item\n * in the array for each of the payload. If your server returns a JSON API\n * formatted payload already, it will just be returned directly.\n *\n * If your server returns something other than a JSON API format, it's\n * suggested that you override this method to convert your own errors into the\n * one described above.\n *\n * @method normalizeErrorResponse\n * @private\n * @param {Number} status\n * @param {Object} headers\n * @param {Object} payload\n * @return {Array} An array of JSON API-formatted error objects\n */\n normalizeErrorResponse(status, headers, payload) {\n payload = Ember.isNone(payload) ? {} : payload;\n\n if (Ember.isArray(payload.errors)) {\n return payload.errors.map(function (error) {\n if (isObject(error)) {\n const ret = Ember.merge({}, error);\n ret.status = `${error.status}`;\n return ret;\n } else {\n return {\n status: `${status}`,\n title: error\n };\n }\n });\n } else if (Ember.isArray(payload)) {\n return payload.map(function (error) {\n if (isObject(error)) {\n return {\n status: `${status}`,\n title: error.title || 'The backend responded with an error',\n detail: error\n };\n } else {\n return {\n status: `${status}`,\n title: `${error}`\n };\n }\n });\n } else if ((0, _isString.default)(payload)) {\n return [{\n status: `${status}`,\n title: payload\n }];\n } else {\n return [{\n status: `${status}`,\n title: payload.title || 'The backend responded with an error',\n detail: payload\n }];\n }\n }\n });\n});","define('ember-ajax/raw', ['exports', 'ember-ajax/ajax-request'], function (exports, _ajaxRequest) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = raw;\n\n\n /**\n * Same as `request` except it resolves an object with\n *\n * {response, textStatus, jqXHR}\n *\n * Useful if you need access to the jqXHR object for headers, etc.\n *\n * @public\n */\n function raw() {\n const ajax = new _ajaxRequest.default();\n return ajax.raw(...arguments);\n }\n});","define('ember-ajax/request', ['exports', 'ember-ajax/ajax-request'], function (exports, _ajaxRequest) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = request;\n\n\n /**\n * Helper function that allows you to use the default `ember-ajax` to make\n * requests without using the service.\n *\n * Note: Unlike `ic-ajax`'s `request` helper function, this will *not* return a\n * jqXHR object in the error handler. If you need jqXHR, you can use the `raw`\n * function instead.\n *\n * @public\n */\n function request() {\n const ajax = new _ajaxRequest.default();\n return ajax.request(...arguments);\n }\n});","define('ember-ajax/services/ajax', ['exports', 'ember-ajax/mixins/ajax-request'], function (exports, _ajaxRequest) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = Ember.Service.extend(_ajaxRequest.default);\n});","define('ember-ajax/utils/ajax', ['exports', 'ember-ajax/-private/utils/is-fastboot'], function (exports, _isFastboot) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = _isFastboot.default ? najax : Ember.$.ajax;\n});","define('ember-cli-app-version/initializer-factory', ['exports'], function (exports) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = initializerFactory;\n\n\n const {\n String: { classify },\n libraries\n } = Ember;\n\n function initializerFactory(name, version) {\n let registered = false;\n\n return function () {\n if (!registered && name && version) {\n var appName = classify(name);\n libraries.register(appName, version);\n registered = true;\n }\n };\n }\n});","define(\"ember-cli-app-version/utils/regexp\", [\"exports\"], function (exports) {\n \"use strict\";\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n const versionRegExp = exports.versionRegExp = /\\d[.]\\d[.]\\d/;\n const shaRegExp = exports.shaRegExp = /[a-z\\d]{8}/;\n});","define('ember-inflector/index', ['exports', 'ember-inflector/lib/system', 'ember-inflector/lib/ext/string'], function (exports, _system) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.defaultRules = exports.singularize = exports.pluralize = undefined;\n\n\n _system.Inflector.defaultRules = _system.defaultRules;\n\n Object.defineProperty(Ember, 'Inflector', {\n get() {\n Ember.deprecate(`Ember.Inflector is deprecated. Please explicitly: import Inflector from 'ember-inflector';`, false, {\n id: 'ember-inflector.globals',\n until: '3.0.0'\n });\n\n return _system.Inflector;\n }\n });\n\n Object.defineProperty(Ember.String, 'singularize', {\n get() {\n Ember.deprecate(`Ember.String.singularize() is deprecated. Please explicitly: import { singularize } from 'ember-inflector';`, false, {\n id: 'ember-inflector.globals',\n until: '3.0.0'\n });\n\n return _system.singularize;\n }\n });\n\n Object.defineProperty(Ember.String, 'pluralize', {\n get() {\n Ember.deprecate(`Ember.String.pluralize() is deprecated. Please explicitly: import { pluralize } from 'ember-inflector';`, false, {\n id: 'ember-inflector.globals',\n until: '3.0.0'\n });\n\n return _system.pluralize;\n }\n });\n\n exports.default = _system.Inflector;\n exports.pluralize = _system.pluralize;\n exports.singularize = _system.singularize;\n exports.defaultRules = _system.defaultRules;\n});","define('ember-inflector/lib/ext/string', ['ember-inflector/lib/system/string'], function (_string) {\n 'use strict';\n\n if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.String) {\n /**\n See {{#crossLink \"Ember.String/pluralize\"}}{{/crossLink}}\n @method pluralize\n @for String\n */\n Object.defineProperty(String.prototype, 'pluralize', {\n get() {\n Ember.deprecate(`String.prototype.pluralize() is deprecated. Please explicitly: import { pluralize } from 'ember-inflector';`, false, {\n id: 'ember-inflector.globals',\n until: '3.0.0'\n });\n\n return function () {\n return (0, _string.pluralize)(this);\n };\n }\n });\n\n /**\n See {{#crossLink \"Ember.String/singularize\"}}{{/crossLink}}\n @method singularize\n @for String\n */\n Object.defineProperty(String.prototype, 'singularize', {\n get() {\n Ember.deprecate(`String.prototype.singularize() is deprecated. Please explicitly: import { singularize } from 'ember-inflector';`, false, {\n id: 'ember-inflector.globals',\n until: '3.0.0'\n });\n\n return function () {\n return (0, _string.singularize)(this);\n };\n }\n });\n }\n});","define('ember-inflector/lib/helpers/pluralize', ['exports', 'ember-inflector', 'ember-inflector/lib/utils/make-helper'], function (exports, _emberInflector, _makeHelper) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = (0, _makeHelper.default)(function (params, hash) {\n let count,\n word,\n withoutCount = false;\n\n if (params.length === 1) {\n word = params[0];\n return (0, _emberInflector.pluralize)(word);\n } else {\n count = params[0];\n word = params[1];\n\n if (hash[\"without-count\"]) {\n withoutCount = hash[\"without-count\"];\n }\n\n if (parseFloat(count) !== 1) {\n word = (0, _emberInflector.pluralize)(word);\n }\n\n return withoutCount ? word : count + \" \" + word;\n }\n });\n});","define('ember-inflector/lib/helpers/singularize', ['exports', 'ember-inflector', 'ember-inflector/lib/utils/make-helper'], function (exports, _emberInflector, _makeHelper) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = (0, _makeHelper.default)(function (params) {\n return (0, _emberInflector.singularize)(params[0]);\n });\n});","define(\"ember-inflector/lib/system\", [\"exports\", \"ember-inflector/lib/system/inflector\", \"ember-inflector/lib/system/string\", \"ember-inflector/lib/system/inflections\"], function (exports, _inflector, _string, _inflections) {\n \"use strict\";\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.defaultRules = exports.pluralize = exports.singularize = exports.Inflector = undefined;\n\n\n _inflector.default.inflector = new _inflector.default(_inflections.default);\n\n exports.Inflector = _inflector.default;\n exports.singularize = _string.singularize;\n exports.pluralize = _string.pluralize;\n exports.defaultRules = _inflections.default;\n});","define('ember-inflector/lib/system/inflections', ['exports'], function (exports) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = {\n plurals: [[/$/, 's'], [/s$/i, 's'], [/^(ax|test)is$/i, '$1es'], [/(octop|vir)us$/i, '$1i'], [/(octop|vir)i$/i, '$1i'], [/(alias|status|bonus)$/i, '$1es'], [/(bu)s$/i, '$1ses'], [/(buffal|tomat)o$/i, '$1oes'], [/([ti])um$/i, '$1a'], [/([ti])a$/i, '$1a'], [/sis$/i, 'ses'], [/(?:([^f])fe|([lr])f)$/i, '$1$2ves'], [/(hive)$/i, '$1s'], [/([^aeiouy]|qu)y$/i, '$1ies'], [/(x|ch|ss|sh)$/i, '$1es'], [/(matr|vert|ind)(?:ix|ex)$/i, '$1ices'], [/^(m|l)ouse$/i, '$1ice'], [/^(m|l)ice$/i, '$1ice'], [/^(ox)$/i, '$1en'], [/^(oxen)$/i, '$1'], [/(quiz)$/i, '$1zes']],\n\n singular: [[/s$/i, ''], [/(ss)$/i, '$1'], [/(n)ews$/i, '$1ews'], [/([ti])a$/i, '$1um'], [/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)(sis|ses)$/i, '$1sis'], [/(^analy)(sis|ses)$/i, '$1sis'], [/([^f])ves$/i, '$1fe'], [/(hive)s$/i, '$1'], [/(tive)s$/i, '$1'], [/([lr])ves$/i, '$1f'], [/([^aeiouy]|qu)ies$/i, '$1y'], [/(s)eries$/i, '$1eries'], [/(m)ovies$/i, '$1ovie'], [/(x|ch|ss|sh)es$/i, '$1'], [/^(m|l)ice$/i, '$1ouse'], [/(bus)(es)?$/i, '$1'], [/(o)es$/i, '$1'], [/(shoe)s$/i, '$1'], [/(cris|test)(is|es)$/i, '$1is'], [/^(a)x[ie]s$/i, '$1xis'], [/(octop|vir)(us|i)$/i, '$1us'], [/(alias|status|bonus)(es)?$/i, '$1'], [/^(ox)en/i, '$1'], [/(vert|ind)ices$/i, '$1ex'], [/(matr)ices$/i, '$1ix'], [/(quiz)zes$/i, '$1'], [/(database)s$/i, '$1']],\n\n irregularPairs: [['person', 'people'], ['man', 'men'], ['child', 'children'], ['sex', 'sexes'], ['move', 'moves'], ['cow', 'kine'], ['zombie', 'zombies']],\n\n uncountable: ['equipment', 'information', 'rice', 'money', 'species', 'series', 'fish', 'sheep', 'jeans', 'police']\n };\n});","define('ember-inflector/lib/system/inflector', ['exports'], function (exports) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n\n var capitalize = Ember.String.capitalize;\n\n var BLANK_REGEX = /^\\s*$/;\n var LAST_WORD_DASHED_REGEX = /([\\w/-]+[_/\\s-])([a-z\\d]+$)/;\n var LAST_WORD_CAMELIZED_REGEX = /([\\w/\\s-]+)([A-Z][a-z\\d]*$)/;\n var CAMELIZED_REGEX = /[A-Z][a-z\\d]*$/;\n\n function loadUncountable(rules, uncountable) {\n for (var i = 0, length = uncountable.length; i < length; i++) {\n rules.uncountable[uncountable[i].toLowerCase()] = true;\n }\n }\n\n function loadIrregular(rules, irregularPairs) {\n var pair;\n\n for (var i = 0, length = irregularPairs.length; i < length; i++) {\n pair = irregularPairs[i];\n\n //pluralizing\n rules.irregular[pair[0].toLowerCase()] = pair[1];\n rules.irregular[pair[1].toLowerCase()] = pair[1];\n\n //singularizing\n rules.irregularInverse[pair[1].toLowerCase()] = pair[0];\n rules.irregularInverse[pair[0].toLowerCase()] = pair[0];\n }\n }\n\n /**\n Inflector.Ember provides a mechanism for supplying inflection rules for your\n application. Ember includes a default set of inflection rules, and provides an\n API for providing additional rules.\n \n Examples:\n \n Creating an inflector with no rules.\n \n ```js\n var inflector = new Ember.Inflector();\n ```\n \n Creating an inflector with the default ember ruleset.\n \n ```js\n var inflector = new Ember.Inflector(Ember.Inflector.defaultRules);\n \n inflector.pluralize('cow'); //=> 'kine'\n inflector.singularize('kine'); //=> 'cow'\n ```\n \n Creating an inflector and adding rules later.\n \n ```javascript\n var inflector = Ember.Inflector.inflector;\n \n inflector.pluralize('advice'); // => 'advices'\n inflector.uncountable('advice');\n inflector.pluralize('advice'); // => 'advice'\n \n inflector.pluralize('formula'); // => 'formulas'\n inflector.irregular('formula', 'formulae');\n inflector.pluralize('formula'); // => 'formulae'\n \n // you would not need to add these as they are the default rules\n inflector.plural(/$/, 's');\n inflector.singular(/s$/i, '');\n ```\n \n Creating an inflector with a nondefault ruleset.\n \n ```javascript\n var rules = {\n plurals: [\n [ /$/, 's' ]\n ],\n singular: [\n [ /\\s$/, '' ]\n ],\n irregularPairs: [\n [ 'cow', 'kine' ]\n ],\n uncountable: [ 'fish' ]\n };\n \n var inflector = new Ember.Inflector(rules);\n ```\n \n @class Inflector\n @namespace Ember\n */\n function Inflector(ruleSet) {\n ruleSet = ruleSet || {};\n ruleSet.uncountable = ruleSet.uncountable || makeDictionary();\n ruleSet.irregularPairs = ruleSet.irregularPairs || makeDictionary();\n\n var rules = this.rules = {\n plurals: ruleSet.plurals || [],\n singular: ruleSet.singular || [],\n irregular: makeDictionary(),\n irregularInverse: makeDictionary(),\n uncountable: makeDictionary()\n };\n\n loadUncountable(rules, ruleSet.uncountable);\n loadIrregular(rules, ruleSet.irregularPairs);\n\n this.enableCache();\n }\n\n if (!Object.create && !Object.create(null).hasOwnProperty) {\n throw new Error(\"This browser does not support Object.create(null), please polyfil with es5-sham: http://git.io/yBU2rg\");\n }\n\n function makeDictionary() {\n var cache = Object.create(null);\n cache['_dict'] = null;\n delete cache['_dict'];\n return cache;\n }\n\n Inflector.prototype = {\n /**\n @public\n As inflections can be costly, and commonly the same subset of words are repeatedly\n inflected an optional cache is provided.\n @method enableCache\n */\n enableCache: function () {\n this.purgeCache();\n\n this.singularize = function (word) {\n this._cacheUsed = true;\n return this._sCache[word] || (this._sCache[word] = this._singularize(word));\n };\n\n this.pluralize = function (word) {\n this._cacheUsed = true;\n return this._pCache[word] || (this._pCache[word] = this._pluralize(word));\n };\n },\n\n /**\n @public\n @method purgedCache\n */\n purgeCache: function () {\n this._cacheUsed = false;\n this._sCache = makeDictionary();\n this._pCache = makeDictionary();\n },\n\n /**\n @public\n disable caching\n @method disableCache;\n */\n disableCache: function () {\n this._sCache = null;\n this._pCache = null;\n this.singularize = function (word) {\n return this._singularize(word);\n };\n\n this.pluralize = function (word) {\n return this._pluralize(word);\n };\n },\n\n /**\n @method plural\n @param {RegExp} regex\n @param {String} string\n */\n plural: function (regex, string) {\n if (this._cacheUsed) {\n this.purgeCache();\n }\n this.rules.plurals.push([regex, string.toLowerCase()]);\n },\n\n /**\n @method singular\n @param {RegExp} regex\n @param {String} string\n */\n singular: function (regex, string) {\n if (this._cacheUsed) {\n this.purgeCache();\n }\n this.rules.singular.push([regex, string.toLowerCase()]);\n },\n\n /**\n @method uncountable\n @param {String} regex\n */\n uncountable: function (string) {\n if (this._cacheUsed) {\n this.purgeCache();\n }\n loadUncountable(this.rules, [string.toLowerCase()]);\n },\n\n /**\n @method irregular\n @param {String} singular\n @param {String} plural\n */\n irregular: function (singular, plural) {\n if (this._cacheUsed) {\n this.purgeCache();\n }\n loadIrregular(this.rules, [[singular, plural]]);\n },\n\n /**\n @method pluralize\n @param {String} word\n */\n pluralize: function (word) {\n return this._pluralize(word);\n },\n\n _pluralize: function (word) {\n return this.inflect(word, this.rules.plurals, this.rules.irregular);\n },\n /**\n @method singularize\n @param {String} word\n */\n singularize: function (word) {\n return this._singularize(word);\n },\n\n _singularize: function (word) {\n return this.inflect(word, this.rules.singular, this.rules.irregularInverse);\n },\n\n /**\n @protected\n @method inflect\n @param {String} word\n @param {Object} typeRules\n @param {Object} irregular\n */\n inflect: function (word, typeRules, irregular) {\n var inflection, substitution, result, lowercase, wordSplit, firstPhrase, lastWord, isBlank, isCamelized, rule, isUncountable;\n\n isBlank = !word || BLANK_REGEX.test(word);\n\n isCamelized = CAMELIZED_REGEX.test(word);\n firstPhrase = \"\";\n\n if (isBlank) {\n return word;\n }\n\n lowercase = word.toLowerCase();\n wordSplit = LAST_WORD_DASHED_REGEX.exec(word) || LAST_WORD_CAMELIZED_REGEX.exec(word);\n\n if (wordSplit) {\n firstPhrase = wordSplit[1];\n lastWord = wordSplit[2].toLowerCase();\n }\n\n isUncountable = this.rules.uncountable[lowercase] || this.rules.uncountable[lastWord];\n\n if (isUncountable) {\n return word;\n }\n\n for (rule in irregular) {\n if (lowercase.match(rule + \"$\")) {\n substitution = irregular[rule];\n\n if (isCamelized && irregular[lastWord]) {\n substitution = capitalize(substitution);\n rule = capitalize(rule);\n }\n\n return word.replace(new RegExp(rule, 'i'), substitution);\n }\n }\n\n for (var i = typeRules.length, min = 0; i > min; i--) {\n inflection = typeRules[i - 1];\n rule = inflection[0];\n\n if (rule.test(word)) {\n break;\n }\n }\n\n inflection = inflection || [];\n\n rule = inflection[0];\n substitution = inflection[1];\n\n result = word.replace(rule, substitution);\n\n return result;\n }\n };\n\n exports.default = Inflector;\n});","define('ember-inflector/lib/system/string', ['exports', 'ember-inflector/lib/system/inflector'], function (exports, _inflector) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.singularize = exports.pluralize = undefined;\n\n\n function pluralize(word) {\n return _inflector.default.inflector.pluralize(word);\n }\n\n function singularize(word) {\n return _inflector.default.inflector.singularize(word);\n }\n\n exports.pluralize = pluralize;\n exports.singularize = singularize;\n});","define('ember-inflector/lib/utils/make-helper', ['exports'], function (exports) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = makeHelper;\n function makeHelper(helperFunction) {\n if (Ember.Helper) {\n return Ember.Helper.helper(helperFunction);\n }\n if (Ember.HTMLBars) {\n return Ember.HTMLBars.makeBoundHelper(helperFunction);\n }\n return Ember.Handlebars.makeBoundHelper(helperFunction);\n }\n});","define('ember-load-initializers/index', ['exports'], function (exports) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n exports.default = function (app, prefix) {\n var initializerPrefix = prefix + '/initializers/';\n var instanceInitializerPrefix = prefix + '/instance-initializers/';\n var initializers = [];\n var instanceInitializers = [];\n // this is 2 pass because generally the first pass is the problem\n // and is reduced, and resolveInitializer has potential to deopt\n var moduleNames = Object.keys(requirejs._eak_seen);\n for (var i = 0; i < moduleNames.length; i++) {\n var moduleName = moduleNames[i];\n if (moduleName.lastIndexOf(initializerPrefix, 0) === 0) {\n initializers.push(moduleName);\n } else if (moduleName.lastIndexOf(instanceInitializerPrefix, 0) === 0) {\n instanceInitializers.push(moduleName);\n }\n }\n registerInitializers(app, initializers);\n registerInstanceInitializers(app, instanceInitializers);\n };\n\n function resolveInitializer(moduleName) {\n var module = require(moduleName, null, null, true);\n if (!module) {\n throw new Error(moduleName + ' must export an initializer.');\n }\n var initializer = module['default'];\n if (!initializer.name) {\n initializer.name = moduleName.slice(moduleName.lastIndexOf('/') + 1);\n }\n return initializer;\n }\n\n function registerInitializers(app, moduleNames) {\n for (var i = 0; i < moduleNames.length; i++) {\n app.initializer(resolveInitializer(moduleNames[i]));\n }\n }\n\n function registerInstanceInitializers(app, moduleNames) {\n for (var i = 0; i < moduleNames.length; i++) {\n app.instanceInitializer(resolveInitializer(moduleNames[i]));\n }\n }\n});","/*\n * This is a stub file, it must be on disk b/c babel-plugin-debug-macros\n * does not strip the module require when the transpiled variable usage is\n * stripped.\n */\ndefine(\"ember-resolver/features\", [], function () {\n \"use strict\";\n});","define('ember-resolver/index', ['exports', 'ember-resolver/resolvers/classic'], function (exports, _classic) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n Object.defineProperty(exports, 'default', {\n enumerable: true,\n get: function () {\n return _classic.default;\n }\n });\n});","define('ember-resolver/resolver', ['exports', 'ember-resolver/resolvers/classic'], function (exports, _classic) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n Object.defineProperty(exports, 'default', {\n enumerable: true,\n get: function () {\n return _classic.default;\n }\n });\n});","define('ember-resolver/resolvers/classic/container-debug-adapter', ['exports', 'ember-resolver/resolvers/classic/index'], function (exports, _index) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n\n const { ContainerDebugAdapter } = Ember;\n\n function getPod(type, key, prefix) {\n let match = key.match(new RegExp('^/?' + prefix + '/(.+)/' + type + '$'));\n if (match !== null) {\n return match[1];\n }\n }\n\n /*\n * This module defines a subclass of Ember.ContainerDebugAdapter that adds\n * support for resolving from modules.\n *\n */\n exports.default = ContainerDebugAdapter.extend({\n _moduleRegistry: null,\n\n init() {\n this._super(...arguments);\n\n if (!this._moduleRegistry) {\n this._moduleRegistry = new _index.ModuleRegistry();\n }\n },\n\n /**\n The container of the application being debugged.\n This property will be injected\n on creation.\n @property container\n @default null\n */\n\n /**\n The resolver instance of the application\n being debugged. This property will be injected\n on creation.\n @property resolver\n @default null\n */\n\n /**\n Returns true if it is possible to catalog a list of available\n classes in the resolver for a given type.\n @method canCatalogEntriesByType\n @param {string} type The type. e.g. \"model\", \"controller\", \"route\"\n @return {boolean} whether a list is available for this type.\n */\n canCatalogEntriesByType(type) {\n if (type === 'model') {\n return true;\n }\n return this._super(...arguments);\n },\n\n /**\n Returns the available classes a given type.\n @method catalogEntriesByType\n @param {string} type The type. e.g. \"model\", \"controller\", \"route\"\n @return {Array} An array of classes.\n */\n catalogEntriesByType(type) {\n let moduleNames = this._moduleRegistry.moduleNames();\n let types = Ember.A();\n\n let prefix = this.namespace.modulePrefix;\n\n for (let i = 0, l = moduleNames.length; i < l; i++) {\n let key = moduleNames[i];\n\n if (key.indexOf(type) !== -1) {\n // Check if it's a pod module\n let name = getPod(type, key, this.namespace.podModulePrefix || prefix);\n if (!name) {\n // Not pod\n name = key.split(type + 's/').pop();\n\n // Support for different prefix (such as ember-cli addons).\n // Uncomment the code below when\n // https://github.com/ember-cli/ember-resolver/pull/80 is merged.\n\n //let match = key.match('^/?(.+)/' + type);\n //if (match && match[1] !== prefix) {\n // Different prefix such as an addon\n //name = match[1] + '@' + name;\n //}\n }\n types.addObject(name);\n }\n }\n return types;\n }\n });\n});","define('ember-resolver/resolvers/classic/index', ['exports', 'ember-resolver/utils/class-factory', 'ember-resolver/utils/make-dictionary'], function (exports, _classFactory, _makeDictionary) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.ModuleRegistry = undefined;\n\n\n if (typeof requirejs.entries === 'undefined') {\n requirejs.entries = requirejs._eak_seen;\n } /* globals requirejs, require */\n\n class ModuleRegistry {\n constructor(entries) {\n this._entries = entries || requirejs.entries;\n }\n moduleNames() {\n return Object.keys(this._entries);\n }\n has(moduleName) {\n return moduleName in this._entries;\n }\n get(moduleName) {\n return require(moduleName);\n }\n }\n\n exports.ModuleRegistry = ModuleRegistry;\n /*\n * This module defines a subclass of Ember.DefaultResolver that adds two\n * important features:\n *\n * 1) The resolver makes the container aware of es6 modules via the AMD\n * output. The loader's _moduleEntries is consulted so that classes can be\n * resolved directly via the module loader, without needing a manual\n * `import`.\n * 2) is able to provide injections to classes that implement `extend`\n * (as is typical with Ember).\n */\n\n const {\n underscore,\n classify,\n dasherize\n } = Ember.String;\n const {\n get,\n DefaultResolver\n } = Ember;\n\n function parseName(fullName) {\n if (fullName.parsedName === true) {\n return fullName;\n }\n\n let prefix, type, name;\n let fullNameParts = fullName.split('@');\n\n // HTMLBars uses helper:@content-helper which collides\n // with ember-cli namespace detection.\n // This will be removed in a future release of HTMLBars.\n if (fullName !== 'helper:@content-helper' && fullNameParts.length === 2) {\n let prefixParts = fullNameParts[0].split(':');\n\n if (prefixParts.length === 2) {\n prefix = prefixParts[1];\n type = prefixParts[0];\n name = fullNameParts[1];\n } else {\n let nameParts = fullNameParts[1].split(':');\n\n prefix = fullNameParts[0];\n type = nameParts[0];\n name = nameParts[1];\n }\n\n if (type === 'template' && prefix.lastIndexOf('components/', 0) === 0) {\n name = `components/${name}`;\n prefix = prefix.slice(11);\n }\n } else {\n fullNameParts = fullName.split(':');\n type = fullNameParts[0];\n name = fullNameParts[1];\n }\n\n let fullNameWithoutType = name;\n let namespace = get(this, 'namespace');\n let root = namespace;\n\n return {\n parsedName: true,\n fullName: fullName,\n prefix: prefix || this.prefix({ type: type }),\n type: type,\n fullNameWithoutType: fullNameWithoutType,\n name: name,\n root: root,\n resolveMethodName: \"resolve\" + classify(type)\n };\n }\n\n function resolveOther(parsedName) {\n Ember.assert('`modulePrefix` must be defined', this.namespace.modulePrefix);\n\n let normalizedModuleName = this.findModuleName(parsedName);\n\n if (normalizedModuleName) {\n let defaultExport = this._extractDefaultExport(normalizedModuleName, parsedName);\n\n if (defaultExport === undefined) {\n throw new Error(` Expected to find: '${parsedName.fullName}' within '${normalizedModuleName}' but got 'undefined'. Did you forget to 'export default' within '${normalizedModuleName}'?`);\n }\n\n if (this.shouldWrapInClassFactory(defaultExport, parsedName)) {\n defaultExport = (0, _classFactory.default)(defaultExport);\n }\n\n return defaultExport;\n } else {\n return this._super(parsedName);\n }\n }\n\n // Ember.DefaultResolver docs:\n // https://github.com/emberjs/ember.js/blob/master/packages/ember-application/lib/system/resolver.js\n const Resolver = DefaultResolver.extend({\n resolveOther,\n parseName,\n resolveTemplate: resolveOther,\n pluralizedTypes: null,\n moduleRegistry: null,\n\n makeToString(factory, fullName) {\n return '' + this.namespace.modulePrefix + '@' + fullName + ':';\n },\n\n shouldWrapInClassFactory() /* module, parsedName */{\n return false;\n },\n\n init() {\n this._super();\n this.moduleBasedResolver = true;\n\n if (!this._moduleRegistry) {\n this._moduleRegistry = new ModuleRegistry();\n }\n\n this._normalizeCache = (0, _makeDictionary.default)();\n\n this.pluralizedTypes = this.pluralizedTypes || (0, _makeDictionary.default)();\n\n if (!this.pluralizedTypes.config) {\n this.pluralizedTypes.config = 'config';\n }\n this._deprecatedPodModulePrefix = false;\n },\n\n normalize(fullName) {\n return this._normalizeCache[fullName] || (this._normalizeCache[fullName] = this._normalize(fullName));\n },\n\n _normalize(fullName) {\n // A) Convert underscores to dashes\n // B) Convert camelCase to dash-case, except for helpers where we want to avoid shadowing camelCase expressions\n // C) replace `.` with `/` in order to make nested controllers work in the following cases\n // 1. `needs: ['posts/post']`\n // 2. `{{render \"posts/post\"}}`\n // 3. `this.render('posts/post')` from Route\n\n let split = fullName.split(':');\n if (split.length > 1) {\n if (split[0] === 'helper') {\n return split[0] + ':' + split[1].replace(/_/g, '-');\n } else {\n return split[0] + ':' + dasherize(split[1].replace(/\\./g, '/'));\n }\n } else {\n return fullName;\n }\n },\n\n pluralize(type) {\n return this.pluralizedTypes[type] || (this.pluralizedTypes[type] = type + 's');\n },\n\n podBasedLookupWithPrefix(podPrefix, parsedName) {\n let fullNameWithoutType = parsedName.fullNameWithoutType;\n\n if (parsedName.type === 'template') {\n fullNameWithoutType = fullNameWithoutType.replace(/^components\\//, '');\n }\n\n return podPrefix + '/' + fullNameWithoutType + '/' + parsedName.type;\n },\n\n podBasedModuleName(parsedName) {\n let podPrefix = this.namespace.podModulePrefix || this.namespace.modulePrefix;\n\n return this.podBasedLookupWithPrefix(podPrefix, parsedName);\n },\n\n podBasedComponentsInSubdir(parsedName) {\n let podPrefix = this.namespace.podModulePrefix || this.namespace.modulePrefix;\n podPrefix = podPrefix + '/components';\n\n if (parsedName.type === 'component' || /^components/.test(parsedName.fullNameWithoutType)) {\n return this.podBasedLookupWithPrefix(podPrefix, parsedName);\n }\n },\n\n resolveEngine(parsedName) {\n let engineName = parsedName.fullNameWithoutType;\n let engineModule = engineName + '/engine';\n\n if (this._moduleRegistry.has(engineModule)) {\n return this._extractDefaultExport(engineModule);\n }\n },\n\n resolveRouteMap(parsedName) {\n let engineName = parsedName.fullNameWithoutType;\n let engineRoutesModule = engineName + '/routes';\n\n if (this._moduleRegistry.has(engineRoutesModule)) {\n let routeMap = this._extractDefaultExport(engineRoutesModule);\n\n Ember.assert(`The route map for ${engineName} should be wrapped by 'buildRoutes' before exporting.`, routeMap.isRouteMap);\n\n return routeMap;\n }\n },\n\n mainModuleName(parsedName) {\n // if router:main or adapter:main look for a module with just the type first\n let tmpModuleName = parsedName.prefix + '/' + parsedName.type;\n\n if (parsedName.fullNameWithoutType === 'main') {\n return tmpModuleName;\n }\n },\n\n defaultModuleName(parsedName) {\n return parsedName.prefix + '/' + this.pluralize(parsedName.type) + '/' + parsedName.fullNameWithoutType;\n },\n\n prefix(parsedName) {\n let tmpPrefix = this.namespace.modulePrefix;\n\n if (this.namespace[parsedName.type + 'Prefix']) {\n tmpPrefix = this.namespace[parsedName.type + 'Prefix'];\n }\n\n return tmpPrefix;\n },\n\n /**\n A listing of functions to test for moduleName's based on the provided\n `parsedName`. This allows easy customization of additional module based\n lookup patterns.\n @property moduleNameLookupPatterns\n @returns {Ember.Array}\n */\n moduleNameLookupPatterns: Ember.computed(function () {\n return [this.podBasedModuleName, this.podBasedComponentsInSubdir, this.mainModuleName, this.defaultModuleName];\n }).readOnly(),\n\n findModuleName(parsedName, loggingDisabled) {\n let moduleNameLookupPatterns = this.get('moduleNameLookupPatterns');\n let moduleName;\n\n for (let index = 0, length = moduleNameLookupPatterns.length; index < length; index++) {\n let item = moduleNameLookupPatterns[index];\n\n let tmpModuleName = item.call(this, parsedName);\n\n // allow treat all dashed and all underscored as the same thing\n // supports components with dashes and other stuff with underscores.\n if (tmpModuleName) {\n tmpModuleName = this.chooseModuleName(tmpModuleName, parsedName);\n }\n\n if (tmpModuleName && this._moduleRegistry.has(tmpModuleName)) {\n moduleName = tmpModuleName;\n }\n\n if (!loggingDisabled) {\n this._logLookup(moduleName, parsedName, tmpModuleName);\n }\n\n if (moduleName) {\n return moduleName;\n }\n }\n },\n\n chooseModuleName(moduleName, parsedName) {\n let underscoredModuleName = underscore(moduleName);\n\n if (moduleName !== underscoredModuleName && this._moduleRegistry.has(moduleName) && this._moduleRegistry.has(underscoredModuleName)) {\n throw new TypeError(`Ambiguous module names: '${moduleName}' and '${underscoredModuleName}'`);\n }\n\n if (this._moduleRegistry.has(moduleName)) {\n return moduleName;\n } else if (this._moduleRegistry.has(underscoredModuleName)) {\n return underscoredModuleName;\n }\n // workaround for dasherized partials:\n // something/something/-something => something/something/_something\n let partializedModuleName = moduleName.replace(/\\/-([^/]*)$/, '/_$1');\n\n if (this._moduleRegistry.has(partializedModuleName)) {\n Ember.deprecate('Modules should not contain underscores. ' + 'Attempted to lookup \"' + moduleName + '\" which ' + 'was not found. Please rename \"' + partializedModuleName + '\" ' + 'to \"' + moduleName + '\" instead.', false, { id: 'ember-resolver.underscored-modules', until: '3.0.0' });\n\n return partializedModuleName;\n }\n\n Ember.runInDebug(() => {\n let isCamelCaseHelper = parsedName.type === 'helper' && /[a-z]+[A-Z]+/.test(moduleName);\n if (isCamelCaseHelper) {\n this._camelCaseHelperWarnedNames = this._camelCaseHelperWarnedNames || [];\n let alreadyWarned = this._camelCaseHelperWarnedNames.indexOf(parsedName.fullName) > -1;\n if (!alreadyWarned && this._moduleRegistry.has(dasherize(moduleName))) {\n this._camelCaseHelperWarnedNames.push(parsedName.fullName);\n Ember.warn('Attempted to lookup \"' + parsedName.fullName + '\" which ' + 'was not found. In previous versions of ember-resolver, a bug would have ' + 'caused the module at \"' + dasherize(moduleName) + '\" to be ' + 'returned for this camel case helper name. This has been fixed. ' + 'Use the dasherized name to resolve the module that would have been ' + 'returned in previous versions.', false, { id: 'ember-resolver.camelcase-helper-names', until: '3.0.0' });\n }\n }\n });\n },\n\n // used by Ember.DefaultResolver.prototype._logLookup\n lookupDescription(fullName) {\n let parsedName = this.parseName(fullName);\n\n let moduleName = this.findModuleName(parsedName, true);\n\n return moduleName;\n },\n\n // only needed until 1.6.0-beta.2 can be required\n _logLookup(found, parsedName, description) {\n if (!Ember.ENV.LOG_MODULE_RESOLVER && !parsedName.root.LOG_RESOLVER) {\n return;\n }\n\n let padding;\n let symbol = found ? '[✓]' : '[ ]';\n\n if (parsedName.fullName.length > 60) {\n padding = '.';\n } else {\n padding = new Array(60 - parsedName.fullName.length).join('.');\n }\n\n if (!description) {\n description = this.lookupDescription(parsedName);\n }\n\n if (console && console.info) {\n // eslint-disable-next-line no-console\n console.info(symbol, parsedName.fullName, padding, description);\n }\n },\n\n knownForType(type) {\n let moduleKeys = this._moduleRegistry.moduleNames();\n\n let items = (0, _makeDictionary.default)();\n for (let index = 0, length = moduleKeys.length; index < length; index++) {\n let moduleName = moduleKeys[index];\n let fullname = this.translateToContainerFullname(type, moduleName);\n\n if (fullname) {\n items[fullname] = true;\n }\n }\n\n return items;\n },\n\n translateToContainerFullname(type, moduleName) {\n let prefix = this.prefix({ type });\n\n // Note: using string manipulation here rather than regexes for better performance.\n // pod modules\n // '^' + prefix + '/(.+)/' + type + '$'\n let podPrefix = prefix + '/';\n let podSuffix = '/' + type;\n let start = moduleName.indexOf(podPrefix);\n let end = moduleName.indexOf(podSuffix);\n\n if (start === 0 && end === moduleName.length - podSuffix.length && moduleName.length > podPrefix.length + podSuffix.length) {\n return type + ':' + moduleName.slice(start + podPrefix.length, end);\n }\n\n // non-pod modules\n // '^' + prefix + '/' + pluralizedType + '/(.+)$'\n let pluralizedType = this.pluralize(type);\n let nonPodPrefix = prefix + '/' + pluralizedType + '/';\n\n if (moduleName.indexOf(nonPodPrefix) === 0 && moduleName.length > nonPodPrefix.length) {\n return type + ':' + moduleName.slice(nonPodPrefix.length);\n }\n },\n\n _extractDefaultExport(normalizedModuleName) {\n let module = require(normalizedModuleName, null, null, true /* force sync */);\n\n if (module && module['default']) {\n module = module['default'];\n }\n\n return module;\n }\n });\n\n Resolver.reopenClass({\n moduleBasedResolver: true\n });\n\n exports.default = Resolver;\n});","define('ember-resolver/utils/class-factory', ['exports'], function (exports) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = classFactory;\n function classFactory(klass) {\n return {\n create(injections) {\n if (typeof klass.extend === 'function') {\n return klass.extend(injections);\n } else {\n return klass;\n }\n }\n };\n }\n});","define('ember-resolver/utils/make-dictionary', ['exports'], function (exports) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = makeDictionary;\n function makeDictionary() {\n let cache = Object.create(null);\n cache['_dict'] = null;\n delete cache['_dict'];\n return cache;\n }\n});","define('ember-welcome-page/components/welcome-page', ['exports', 'ember-welcome-page/templates/components/welcome-page'], function (exports, _welcomePage) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = Ember.Component.extend({\n layout: _welcomePage.default,\n\n emberVersion: Ember.computed(function () {\n let [major, minor] = Ember.VERSION.split(\".\");\n\n return `${major}.${minor}.0`;\n })\n });\n});","define(\"ember-welcome-page/templates/components/welcome-page\", [\"exports\"], function (exports) {\n \"use strict\";\n\n exports.__esModule = true;\n exports.default = Ember.HTMLBars.template({ \"id\": \"D2iezqDS\", \"block\": \"{\\\"symbols\\\":[],\\\"statements\\\":[[6,\\\"div\\\"],[9,\\\"id\\\",\\\"ember-welcome-page-id-selector\\\"],[10,\\\"data-ember-version\\\",[26,[[18,\\\"emberVersion\\\"]]]],[7],[0,\\\"\\\\n \\\"],[6,\\\"div\\\"],[9,\\\"class\\\",\\\"columns\\\"],[7],[0,\\\"\\\\n \\\"],[6,\\\"div\\\"],[9,\\\"class\\\",\\\"tomster\\\"],[7],[0,\\\"\\\\n \\\"],[6,\\\"img\\\"],[9,\\\"src\\\",\\\"ember-welcome-page/images/construction.png\\\"],[9,\\\"alt\\\",\\\"Under construction\\\"],[7],[8],[0,\\\"\\\\n \\\"],[8],[0,\\\"\\\\n \\\"],[6,\\\"div\\\"],[9,\\\"class\\\",\\\"welcome\\\"],[7],[0,\\\"\\\\n \\\"],[6,\\\"h2\\\"],[9,\\\"id\\\",\\\"title\\\"],[7],[0,\\\"Congratulations, you made it!\\\"],[8],[0,\\\"\\\\n\\\\n \\\"],[6,\\\"p\\\"],[7],[0,\\\"You’ve officially spun up your very first Ember app :-)\\\"],[8],[0,\\\"\\\\n \\\"],[6,\\\"p\\\"],[7],[0,\\\"You’ve got one more decision to make: what do you want to do next? We’d suggest one of the following to help you get going:\\\"],[8],[0,\\\"\\\\n \\\"],[6,\\\"ol\\\"],[7],[0,\\\"\\\\n \\\"],[6,\\\"li\\\"],[7],[6,\\\"a\\\"],[10,\\\"href\\\",[26,[\\\"https://guides.emberjs.com/v\\\",[18,\\\"emberVersion\\\"],\\\"/getting-started/quick-start/\\\"]]],[7],[0,\\\"Quick Start\\\"],[8],[0,\\\" - a quick introduction to how Ember works. Learn about defining your first route, writing a UI component and deploying your application.\\\"],[8],[0,\\\"\\\\n \\\"],[6,\\\"li\\\"],[7],[6,\\\"a\\\"],[10,\\\"href\\\",[26,[\\\"https://guides.emberjs.com/v\\\",[18,\\\"emberVersion\\\"],\\\"/tutorial/ember-cli/\\\"]]],[7],[0,\\\"Ember Guides\\\"],[8],[0,\\\" - this is our more thorough, hands-on intro to Ember. Your crash course in Ember philosophy, background and some in-depth discussion of how things work (and why they work the way they do).\\\"],[8],[0,\\\"\\\\n \\\"],[8],[0,\\\"\\\\n \\\"],[6,\\\"p\\\"],[7],[0,\\\"If you run into problems, you can check \\\"],[6,\\\"a\\\"],[9,\\\"href\\\",\\\"http://stackoverflow.com/questions/tagged/ember.js\\\"],[7],[0,\\\"Stack Overflow\\\"],[8],[0,\\\" or \\\"],[6,\\\"a\\\"],[9,\\\"href\\\",\\\"http://discuss.emberjs.com/\\\"],[7],[0,\\\"our forums\\\"],[8],[0,\\\" for ideas and answers—someone’s probably been through the same thing and already posted an answer. If not, you can post your \\\"],[6,\\\"strong\\\"],[7],[0,\\\"own\\\"],[8],[0,\\\" question. People love to help new Ember developers get started, and our community is incredibly supportive \\\"],[8],[0,\\\"\\\\n \\\"],[8],[0,\\\"\\\\n \\\"],[8],[0,\\\"\\\\n \\\"],[6,\\\"p\\\"],[9,\\\"class\\\",\\\"postscript\\\"],[7],[0,\\\"To remove this welcome message, remove the \\\"],[6,\\\"code\\\"],[7],[0,\\\"{{welcome-page}}\\\"],[8],[0,\\\" component from your \\\"],[6,\\\"code\\\"],[7],[0,\\\"application.hbs\\\"],[8],[0,\\\" file.\\\"],[6,\\\"br\\\"],[7],[8],[0,\\\"You'll see this page update soon after!\\\"],[8],[0,\\\"\\\\n\\\"],[8],[0,\\\"\\\\n\\\"]],\\\"hasEval\\\":false}\", \"meta\": { \"moduleName\": \"ember-welcome-page/templates/components/welcome-page.hbs\" } });\n});","define('ember-data/-debug/index', ['exports'], function (exports) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.instrument = instrument;\n function instrument(method) {\n return method();\n }\n\n /*\n Assert that `addedRecord` has a valid type so it can be added to the\n relationship of the `record`.\n \n The assert basically checks if the `addedRecord` can be added to the\n relationship (specified via `relationshipMeta`) of the `record`.\n \n This utility should only be used internally, as both record parameters must\n be an InternalModel and the `relationshipMeta` needs to be the meta\n information about the relationship, retrieved via\n `record.relationshipFor(key)`.\n \n @method assertPolymorphicType\n @param {InternalModel} internalModel\n @param {RelationshipMeta} relationshipMeta retrieved via\n `record.relationshipFor(key)`\n @param {InternalModel} addedRecord record which\n should be added/set for the relationship\n */\n var assertPolymorphicType = void 0;\n\n if (true) {\n var checkPolymorphic = function checkPolymorphic(modelClass, addedModelClass) {\n if (modelClass.__isMixin) {\n //TODO Need to do this in order to support mixins, should convert to public api\n //once it exists in Ember\n return modelClass.__mixin.detect(addedModelClass.PrototypeMixin);\n }\n if (Ember.MODEL_FACTORY_INJECTIONS) {\n modelClass = modelClass.superclass;\n }\n return modelClass.detect(addedModelClass);\n };\n\n exports.assertPolymorphicType = assertPolymorphicType = function assertPolymorphicType(parentInternalModel, relationshipMeta, addedInternalModel) {\n var addedModelName = addedInternalModel.modelName;\n var parentModelName = parentInternalModel.modelName;\n var key = relationshipMeta.key;\n var relationshipModelName = relationshipMeta.type;\n var relationshipClass = parentInternalModel.store.modelFor(relationshipModelName);\n var assertionMessage = `You cannot add a record of modelClass '${addedModelName}' to the '${parentModelName}.${key}' relationship (only '${relationshipModelName}' allowed)`;\n\n (true && !(checkPolymorphic(relationshipClass, addedInternalModel.modelClass)) && Ember.assert(assertionMessage, checkPolymorphic(relationshipClass, addedInternalModel.modelClass)));\n };\n }\n\n exports.assertPolymorphicType = assertPolymorphicType;\n});","define('ember-data/-private', ['exports', 'ember-inflector', 'ember-data/-debug', 'ember-data/version'], function (exports, emberInflector, emberData_Debug, VERSION) { 'use strict';\n\nVERSION = 'default' in VERSION ? VERSION['default'] : VERSION;\n\n/**\n A `PromiseArray` is an object that acts like both an `Ember.Array`\n and a promise. When the promise is resolved the resulting value\n will be set to the `PromiseArray`'s `content` property. This makes\n it easy to create data bindings with the `PromiseArray` that will be\n updated when the promise resolves.\n\n For more information see the [Ember.PromiseProxyMixin\n documentation](/api/classes/Ember.PromiseProxyMixin.html).\n\n Example\n\n ```javascript\n let promiseArray = DS.PromiseArray.create({\n promise: $.getJSON('/some/remote/data.json')\n });\n\n promiseArray.get('length'); // 0\n\n promiseArray.then(function() {\n promiseArray.get('length'); // 100\n });\n ```\n\n @class PromiseArray\n @namespace DS\n @extends Ember.ArrayProxy\n @uses Ember.PromiseProxyMixin\n*/\nvar PromiseArray = Ember.ArrayProxy.extend(Ember.PromiseProxyMixin, {\n meta: Ember.computed.reads('content.meta')\n});\n\n/**\n A `PromiseObject` is an object that acts like both an `Ember.Object`\n and a promise. When the promise is resolved, then the resulting value\n will be set to the `PromiseObject`'s `content` property. This makes\n it easy to create data bindings with the `PromiseObject` that will\n be updated when the promise resolves.\n\n For more information see the [Ember.PromiseProxyMixin\n documentation](/api/classes/Ember.PromiseProxyMixin.html).\n\n Example\n\n ```javascript\n let promiseObject = DS.PromiseObject.create({\n promise: $.getJSON('/some/remote/data.json')\n });\n\n promiseObject.get('name'); // null\n\n promiseObject.then(function() {\n promiseObject.get('name'); // 'Tomster'\n });\n ```\n\n @class PromiseObject\n @namespace DS\n @extends Ember.ObjectProxy\n @uses Ember.PromiseProxyMixin\n*/\nvar PromiseObject = Ember.ObjectProxy.extend(Ember.PromiseProxyMixin);\n\nfunction promiseObject(promise, label) {\n return PromiseObject.create({\n promise: Ember.RSVP.Promise.resolve(promise, label)\n });\n}\n\nfunction promiseArray(promise, label) {\n return PromiseArray.create({\n promise: Ember.RSVP.Promise.resolve(promise, label)\n });\n}\n\n/**\n A PromiseManyArray is a PromiseArray that also proxies certain method calls\n to the underlying manyArray.\n Right now we proxy:\n\n * `reload()`\n * `createRecord()`\n * `on()`\n * `one()`\n * `trigger()`\n * `off()`\n * `has()`\n\n @class PromiseManyArray\n @namespace DS\n @extends Ember.ArrayProxy\n*/\n\nfunction proxyToContent(method) {\n return function () {\n return Ember.get(this, 'content')[method](...arguments);\n };\n}\n\nvar PromiseManyArray = PromiseArray.extend({\n reload() {\n (true && !(Ember.get(this, 'content')) && Ember.assert('You are trying to reload an async manyArray before it has been created', Ember.get(this, 'content')));\n\n this.set('promise', this.get('content').reload());\n return this;\n },\n\n createRecord: proxyToContent('createRecord'),\n\n on: proxyToContent('on'),\n\n one: proxyToContent('one'),\n\n trigger: proxyToContent('trigger'),\n\n off: proxyToContent('off'),\n\n has: proxyToContent('has')\n});\n\n/**\n@module ember-data\n*/\n\n/**\n Holds validation errors for a given record, organized by attribute names.\n\n Every `DS.Model` has an `errors` property that is an instance of\n `DS.Errors`. This can be used to display validation error\n messages returned from the server when a `record.save()` rejects.\n\n For Example, if you had a `User` model that looked like this:\n\n ```app/models/user.js\n import DS from 'ember-data';\n\n export default DS.Model.extend({\n username: DS.attr('string'),\n email: DS.attr('string')\n });\n ```\n And you attempted to save a record that did not validate on the backend:\n\n ```javascript\n let user = store.createRecord('user', {\n username: 'tomster',\n email: 'invalidEmail'\n });\n user.save();\n ```\n\n Your backend would be expected to return an error response that described\n the problem, so that error messages can be generated on the app.\n\n API responses will be translated into instances of `DS.Errors` differently,\n depending on the specific combination of adapter and serializer used. You\n may want to check the documentation or the source code of the libraries\n that you are using, to know how they expect errors to be communicated.\n\n Errors can be displayed to the user by accessing their property name\n to get an array of all the error objects for that property. Each\n error object is a JavaScript object with two keys:\n\n - `message` A string containing the error message from the backend\n - `attribute` The name of the property associated with this error message\n\n ```handlebars\n <label>Username: {{input value=username}} </label>\n {{#each model.errors.username as |error|}}\n <div class=\"error\">\n {{error.message}}\n </div>\n {{/each}}\n\n <label>Email: {{input value=email}} </label>\n {{#each model.errors.email as |error|}}\n <div class=\"error\">\n {{error.message}}\n </div>\n {{/each}}\n ```\n\n You can also access the special `messages` property on the error\n object to get an array of all the error strings.\n\n ```handlebars\n {{#each model.errors.messages as |message|}}\n <div class=\"error\">\n {{message}}\n </div>\n {{/each}}\n ```\n\n @class Errors\n @namespace DS\n @extends Ember.Object\n @uses Ember.Enumerable\n @uses Ember.Evented\n */\nvar Errors = Ember.ArrayProxy.extend(Ember.Evented, {\n /**\n Register with target handler\n @method registerHandlers\n @param {Object} target\n @param {Function} becameInvalid\n @param {Function} becameValid\n @deprecated\n */\n registerHandlers(target, becameInvalid, becameValid) {\n (true && !(false) && Ember.deprecate(`Record errors will no longer be evented.`, false, {\n id: 'ds.errors.registerHandlers',\n until: '3.0.0'\n }));\n\n\n this._registerHandlers(target, becameInvalid, becameValid);\n },\n\n /**\n Register with target handler\n @method _registerHandlers\n @private\n */\n _registerHandlers(target, becameInvalid, becameValid) {\n this.on('becameInvalid', target, becameInvalid);\n this.on('becameValid', target, becameValid);\n },\n\n /**\n @property errorsByAttributeName\n @type {Ember.MapWithDefault}\n @private\n */\n errorsByAttributeName: Ember.computed(function () {\n return Ember.MapWithDefault.create({\n defaultValue() {\n return Ember.A();\n }\n });\n }),\n\n /**\n Returns errors for a given attribute\n ```javascript\n let user = store.createRecord('user', {\n username: 'tomster',\n email: 'invalidEmail'\n });\n user.save().catch(function(){\n user.get('errors').errorsFor('email'); // returns:\n // [{attribute: \"email\", message: \"Doesn't look like a valid email.\"}]\n });\n ```\n @method errorsFor\n @param {String} attribute\n @return {Array}\n */\n errorsFor(attribute) {\n return Ember.get(this, 'errorsByAttributeName').get(attribute);\n },\n\n /**\n An array containing all of the error messages for this\n record. This is useful for displaying all errors to the user.\n ```handlebars\n {{#each model.errors.messages as |message|}}\n <div class=\"error\">\n {{message}}\n </div>\n {{/each}}\n ```\n @property messages\n @type {Array}\n */\n messages: Ember.computed.mapBy('content', 'message'),\n\n /**\n @property content\n @type {Array}\n @private\n */\n content: Ember.computed(function () {\n return Ember.A();\n }),\n\n /**\n @method unknownProperty\n @private\n */\n unknownProperty(attribute) {\n var errors = this.errorsFor(attribute);\n if (Ember.isEmpty(errors)) {\n return undefined;\n }\n return errors;\n },\n\n /**\n Total number of errors.\n @property length\n @type {Number}\n @readOnly\n */\n\n /**\n @property isEmpty\n @type {Boolean}\n @readOnly\n */\n isEmpty: Ember.computed.not('length').readOnly(),\n\n /**\n Adds error messages to a given attribute and sends\n `becameInvalid` event to the record.\n Example:\n ```javascript\n if (!user.get('username') {\n user.get('errors').add('username', 'This field is required');\n }\n ```\n @method add\n @param {String} attribute\n @param {(Array|String)} messages\n @deprecated\n */\n add(attribute, messages) {\n (true && Ember.warn(`Interacting with a record errors object will no longer change the record state.`, false, {\n id: 'ds.errors.add'\n }));\n\n\n var wasEmpty = Ember.get(this, 'isEmpty');\n\n this._add(attribute, messages);\n\n if (wasEmpty && !Ember.get(this, 'isEmpty')) {\n this.trigger('becameInvalid');\n }\n },\n\n /**\n Adds error messages to a given attribute without sending event.\n @method _add\n @private\n */\n _add(attribute, messages) {\n messages = this._findOrCreateMessages(attribute, messages);\n this.addObjects(messages);\n Ember.get(this, 'errorsByAttributeName').get(attribute).addObjects(messages);\n\n this.notifyPropertyChange(attribute);\n },\n\n /**\n @method _findOrCreateMessages\n @private\n */\n _findOrCreateMessages(attribute, messages) {\n var errors = this.errorsFor(attribute);\n var messagesArray = Ember.makeArray(messages);\n var _messages = new Array(messagesArray.length);\n\n for (var i = 0; i < messagesArray.length; i++) {\n var message = messagesArray[i];\n var err = errors.findBy('message', message);\n if (err) {\n _messages[i] = err;\n } else {\n _messages[i] = {\n attribute: attribute,\n message: message\n };\n }\n }\n\n return _messages;\n },\n\n /**\n Removes all error messages from the given attribute and sends\n `becameValid` event to the record if there no more errors left.\n Example:\n ```app/models/user.js\n import DS from 'ember-data';\n export default DS.Model.extend({\n email: DS.attr('string'),\n twoFactorAuth: DS.attr('boolean'),\n phone: DS.attr('string')\n });\n ```\n ```app/routes/user/edit.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n actions: {\n save: function(user) {\n if (!user.get('twoFactorAuth')) {\n user.get('errors').remove('phone');\n }\n user.save();\n }\n }\n });\n ```\n @method remove\n @param {String} attribute\n @deprecated\n */\n remove(attribute) {\n (true && Ember.warn(`Interacting with a record errors object will no longer change the record state.`, false, {\n id: 'ds.errors.remove'\n }));\n\n\n if (Ember.get(this, 'isEmpty')) {\n return;\n }\n\n this._remove(attribute);\n\n if (Ember.get(this, 'isEmpty')) {\n this.trigger('becameValid');\n }\n },\n\n /**\n Removes all error messages from the given attribute without sending event.\n @method _remove\n @private\n */\n _remove(attribute) {\n if (Ember.get(this, 'isEmpty')) {\n return;\n }\n\n var content = this.rejectBy('attribute', attribute);\n Ember.set(this, 'content', content);\n Ember.get(this, 'errorsByAttributeName').delete(attribute);\n\n this.notifyPropertyChange(attribute);\n this.notifyPropertyChange('length');\n },\n\n /**\n Removes all error messages and sends `becameValid` event\n to the record.\n Example:\n ```app/routes/user/edit.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n actions: {\n retrySave: function(user) {\n user.get('errors').clear();\n user.save();\n }\n }\n });\n ```\n @method clear\n @deprecated\n */\n clear() {\n (true && Ember.warn(`Interacting with a record errors object will no longer change the record state.`, false, {\n id: 'ds.errors.clear'\n }));\n\n\n if (Ember.get(this, 'isEmpty')) {\n return;\n }\n\n this._clear();\n this.trigger('becameValid');\n },\n\n /**\n Removes all error messages.\n to the record.\n @method _clear\n @private\n */\n _clear() {\n if (Ember.get(this, 'isEmpty')) {\n return;\n }\n\n var errorsByAttributeName = Ember.get(this, 'errorsByAttributeName');\n var attributes = Ember.A();\n\n errorsByAttributeName.forEach(function (_, attribute) {\n attributes.push(attribute);\n });\n\n errorsByAttributeName.clear();\n attributes.forEach(function (attribute) {\n this.notifyPropertyChange(attribute);\n }, this);\n\n Ember.ArrayProxy.prototype.clear.call(this);\n },\n\n /**\n Checks if there is error messages for the given attribute.\n ```app/routes/user/edit.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n actions: {\n save: function(user) {\n if (user.get('errors').has('email')) {\n return alert('Please update your email before attempting to save.');\n }\n user.save();\n }\n }\n });\n ```\n @method has\n @param {String} attribute\n @return {Boolean} true if there some errors on given attribute\n */\n has(attribute) {\n return !Ember.isEmpty(this.errorsFor(attribute));\n }\n});\n\nfunction isEnabled() {\n return Ember.FEATURES.isEnabled(...arguments);\n}\n\n/*\n This file encapsulates the various states that a record can transition\n through during its lifecycle.\n*/\n/**\n ### State\n\n Each record has a `currentState` property that explicitly tracks what\n state a record is in at any given time. For instance, if a record is\n newly created and has not yet been sent to the adapter to be saved,\n it would be in the `root.loaded.created.uncommitted` state. If a\n record has had local modifications made to it that are in the\n process of being saved, the record would be in the\n `root.loaded.updated.inFlight` state. (This state paths will be\n explained in more detail below.)\n\n Events are sent by the record or its store to the record's\n `currentState` property. How the state reacts to these events is\n dependent on which state it is in. In some states, certain events\n will be invalid and will cause an exception to be raised.\n\n States are hierarchical and every state is a substate of the\n `RootState`. For example, a record can be in the\n `root.deleted.uncommitted` state, then transition into the\n `root.deleted.inFlight` state. If a child state does not implement\n an event handler, the state manager will attempt to invoke the event\n on all parent states until the root state is reached. The state\n hierarchy of a record is described in terms of a path string. You\n can determine a record's current state by getting the state's\n `stateName` property:\n\n ```javascript\n record.get('currentState.stateName');\n //=> \"root.created.uncommitted\"\n ```\n\n The hierarchy of valid states that ship with ember data looks like\n this:\n\n ```text\n * root\n * deleted\n * saved\n * uncommitted\n * inFlight\n * empty\n * loaded\n * created\n * uncommitted\n * inFlight\n * saved\n * updated\n * uncommitted\n * inFlight\n * loading\n ```\n\n The `DS.Model` states are themselves stateless. What that means is\n that, the hierarchical states that each of *those* points to is a\n shared data structure. For performance reasons, instead of each\n record getting its own copy of the hierarchy of states, each record\n points to this global, immutable shared instance. How does a state\n know which record it should be acting on? We pass the record\n instance into the state's event handlers as the first argument.\n\n The record passed as the first parameter is where you should stash\n state about the record if needed; you should never store data on the state\n object itself.\n\n ### Events and Flags\n\n A state may implement zero or more events and flags.\n\n #### Events\n\n Events are named functions that are invoked when sent to a record. The\n record will first look for a method with the given name on the\n current state. If no method is found, it will search the current\n state's parent, and then its grandparent, and so on until reaching\n the top of the hierarchy. If the root is reached without an event\n handler being found, an exception will be raised. This can be very\n helpful when debugging new features.\n\n Here's an example implementation of a state with a `myEvent` event handler:\n\n ```javascript\n aState: DS.State.create({\n myEvent: function(manager, param) {\n console.log(\"Received myEvent with\", param);\n }\n })\n ```\n\n To trigger this event:\n\n ```javascript\n record.send('myEvent', 'foo');\n //=> \"Received myEvent with foo\"\n ```\n\n Note that an optional parameter can be sent to a record's `send()` method,\n which will be passed as the second parameter to the event handler.\n\n Events should transition to a different state if appropriate. This can be\n done by calling the record's `transitionTo()` method with a path to the\n desired state. The state manager will attempt to resolve the state path\n relative to the current state. If no state is found at that path, it will\n attempt to resolve it relative to the current state's parent, and then its\n parent, and so on until the root is reached. For example, imagine a hierarchy\n like this:\n\n * created\n * uncommitted <-- currentState\n * inFlight\n * updated\n * inFlight\n\n If we are currently in the `uncommitted` state, calling\n `transitionTo('inFlight')` would transition to the `created.inFlight` state,\n while calling `transitionTo('updated.inFlight')` would transition to\n the `updated.inFlight` state.\n\n Remember that *only events* should ever cause a state transition. You should\n never call `transitionTo()` from outside a state's event handler. If you are\n tempted to do so, create a new event and send that to the state manager.\n\n #### Flags\n\n Flags are Boolean values that can be used to introspect a record's current\n state in a more user-friendly way than examining its state path. For example,\n instead of doing this:\n\n ```javascript\n var statePath = record.get('stateManager.currentPath');\n if (statePath === 'created.inFlight') {\n doSomething();\n }\n ```\n\n You can say:\n\n ```javascript\n if (record.get('isNew') && record.get('isSaving')) {\n doSomething();\n }\n ```\n\n If your state does not set a value for a given flag, the value will\n be inherited from its parent (or the first place in the state hierarchy\n where it is defined).\n\n The current set of flags are defined below. If you want to add a new flag,\n in addition to the area below, you will also need to declare it in the\n `DS.Model` class.\n\n\n * [isEmpty](DS.Model.html#property_isEmpty)\n * [isLoading](DS.Model.html#property_isLoading)\n * [isLoaded](DS.Model.html#property_isLoaded)\n * [hasDirtyAttributes](DS.Model.html#property_hasDirtyAttributes)\n * [isSaving](DS.Model.html#property_isSaving)\n * [isDeleted](DS.Model.html#property_isDeleted)\n * [isNew](DS.Model.html#property_isNew)\n * [isValid](DS.Model.html#property_isValid)\n\n @namespace DS\n @class RootState\n*/\n\nfunction didSetProperty(internalModel, context) {\n if (context.value === context.originalValue) {\n delete internalModel._attributes[context.name];\n internalModel.send('propertyWasReset', context.name);\n } else if (context.value !== context.oldValue) {\n internalModel.send('becomeDirty');\n }\n\n internalModel.updateRecordArrays();\n}\n\n// Implementation notes:\n//\n// Each state has a boolean value for all of the following flags:\n//\n// * isLoaded: The record has a populated `data` property. When a\n// record is loaded via `store.find`, `isLoaded` is false\n// until the adapter sets it. When a record is created locally,\n// its `isLoaded` property is always true.\n// * isDirty: The record has local changes that have not yet been\n// saved by the adapter. This includes records that have been\n// created (but not yet saved) or deleted.\n// * isSaving: The record has been committed, but\n// the adapter has not yet acknowledged that the changes have\n// been persisted to the backend.\n// * isDeleted: The record was marked for deletion. When `isDeleted`\n// is true and `isDirty` is true, the record is deleted locally\n// but the deletion was not yet persisted. When `isSaving` is\n// true, the change is in-flight. When both `isDirty` and\n// `isSaving` are false, the change has persisted.\n// * isNew: The record was created on the client and the adapter\n// did not yet report that it was successfully saved.\n// * isValid: The adapter did not report any server-side validation\n// failures.\n\n// The dirty state is a abstract state whose functionality is\n// shared between the `created` and `updated` states.\n//\n// The deleted state shares the `isDirty` flag with the\n// subclasses of `DirtyState`, but with a very different\n// implementation.\n//\n// Dirty states have three child states:\n//\n// `uncommitted`: the store has not yet handed off the record\n// to be saved.\n// `inFlight`: the store has handed off the record to be saved,\n// but the adapter has not yet acknowledged success.\n// `invalid`: the record has invalid information and cannot be\n// sent to the adapter yet.\n/**\n @module ember-data\n*/\nvar DirtyState = {\n initialState: 'uncommitted',\n\n // FLAGS\n isDirty: true,\n\n // SUBSTATES\n\n // When a record first becomes dirty, it is `uncommitted`.\n // This means that there are local pending changes, but they\n // have not yet begun to be saved, and are not invalid.\n uncommitted: {\n // EVENTS\n didSetProperty,\n\n //TODO(Igor) reloading now triggers a\n //loadingData event, though it seems fine?\n loadingData() {},\n\n propertyWasReset(internalModel, name) {\n if (!internalModel.hasChangedAttributes()) {\n internalModel.send('rolledBack');\n }\n },\n\n pushedData(internalModel) {\n internalModel.updateChangedAttributes();\n\n if (!internalModel.hasChangedAttributes()) {\n internalModel.transitionTo('loaded.saved');\n }\n },\n\n becomeDirty() {},\n\n willCommit(internalModel) {\n internalModel.transitionTo('inFlight');\n },\n\n reloadRecord(internalModel, resolve) {\n resolve(internalModel.store._reloadRecord(internalModel));\n },\n\n rolledBack(internalModel) {\n internalModel.transitionTo('loaded.saved');\n },\n\n becameInvalid(internalModel) {\n internalModel.transitionTo('invalid');\n },\n\n rollback(internalModel) {\n internalModel.rollbackAttributes();\n internalModel.triggerLater('ready');\n }\n },\n\n // Once a record has been handed off to the adapter to be\n // saved, it is in the 'in flight' state. Changes to the\n // record cannot be made during this window.\n inFlight: {\n // FLAGS\n isSaving: true,\n\n // EVENTS\n didSetProperty,\n becomeDirty() {},\n pushedData() {},\n\n unloadRecord: assertAgainstUnloadRecord,\n\n // TODO: More robust semantics around save-while-in-flight\n willCommit() {},\n\n didCommit(internalModel) {\n internalModel.transitionTo('saved');\n internalModel.send('invokeLifecycleCallbacks', this.dirtyType);\n },\n\n becameInvalid(internalModel) {\n internalModel.transitionTo('invalid');\n internalModel.send('invokeLifecycleCallbacks');\n },\n\n becameError(internalModel) {\n internalModel.transitionTo('uncommitted');\n internalModel.triggerLater('becameError', internalModel);\n }\n },\n\n // A record is in the `invalid` if the adapter has indicated\n // the the record failed server-side invalidations.\n invalid: {\n // FLAGS\n isValid: false,\n\n // EVENTS\n deleteRecord(internalModel) {\n internalModel.transitionTo('deleted.uncommitted');\n },\n\n didSetProperty(internalModel, context) {\n internalModel.removeErrorMessageFromAttribute(context.name);\n\n didSetProperty(internalModel, context);\n\n if (!internalModel.hasErrors()) {\n this.becameValid(internalModel);\n }\n },\n\n becameInvalid() {},\n becomeDirty() {},\n pushedData() {},\n\n willCommit(internalModel) {\n internalModel.clearErrorMessages();\n internalModel.transitionTo('inFlight');\n },\n\n rolledBack(internalModel) {\n internalModel.clearErrorMessages();\n internalModel.transitionTo('loaded.saved');\n internalModel.triggerLater('ready');\n },\n\n becameValid(internalModel) {\n internalModel.transitionTo('uncommitted');\n },\n\n invokeLifecycleCallbacks(internalModel) {\n internalModel.triggerLater('becameInvalid', internalModel);\n }\n }\n};\n\n// The created and updated states are created outside the state\n// chart so we can reopen their substates and add mixins as\n// necessary.\n\nfunction deepClone(object) {\n var clone = {};\n var value = void 0;\n\n for (var prop in object) {\n value = object[prop];\n if (value && typeof value === 'object') {\n clone[prop] = deepClone(value);\n } else {\n clone[prop] = value;\n }\n }\n\n return clone;\n}\n\nfunction mixin(original, hash) {\n for (var prop in hash) {\n original[prop] = hash[prop];\n }\n\n return original;\n}\n\nfunction dirtyState(options) {\n var newState = deepClone(DirtyState);\n return mixin(newState, options);\n}\n\nvar createdState = dirtyState({\n dirtyType: 'created',\n // FLAGS\n isNew: true\n});\n\ncreatedState.invalid.rolledBack = function (internalModel) {\n internalModel.transitionTo('deleted.saved');\n};\n\ncreatedState.uncommitted.rolledBack = function (internalModel) {\n internalModel.transitionTo('deleted.saved');\n};\n\nvar updatedState = dirtyState({\n dirtyType: 'updated'\n});\n\nfunction createdStateDeleteRecord(internalModel) {\n internalModel.transitionTo('deleted.saved');\n internalModel.send('invokeLifecycleCallbacks');\n}\n\ncreatedState.uncommitted.deleteRecord = createdStateDeleteRecord;\n\ncreatedState.invalid.deleteRecord = createdStateDeleteRecord;\n\ncreatedState.uncommitted.rollback = function (internalModel) {\n DirtyState.uncommitted.rollback.apply(this, arguments);\n internalModel.transitionTo('deleted.saved');\n};\n\ncreatedState.uncommitted.pushedData = function (internalModel) {\n internalModel.transitionTo('loaded.updated.uncommitted');\n internalModel.triggerLater('didLoad');\n};\n\ncreatedState.uncommitted.propertyWasReset = function () {};\n\nfunction assertAgainstUnloadRecord(internalModel) {\n (true && !(false) && Ember.assert(\"You can only unload a record which is not inFlight. `\" + internalModel + \"`\", false));\n}\n\nupdatedState.invalid.becameValid = function (internalModel) {\n // we're eagerly transition into the loaded.saved state, even though we could\n // be still dirty; but the setup hook of the loaded.saved state checks for\n // dirty attributes and transitions into the corresponding dirty state\n internalModel.transitionTo('loaded.saved');\n};\n\nupdatedState.inFlight.unloadRecord = assertAgainstUnloadRecord;\n\nupdatedState.uncommitted.deleteRecord = function (internalModel) {\n internalModel.transitionTo('deleted.uncommitted');\n};\n\nvar RootState = {\n // FLAGS\n isEmpty: false,\n isLoading: false,\n isLoaded: false,\n isDirty: false,\n isSaving: false,\n isDeleted: false,\n isNew: false,\n isValid: true,\n\n // DEFAULT EVENTS\n\n // Trying to roll back if you're not in the dirty state\n // doesn't change your state. For example, if you're in the\n // in-flight state, rolling back the record doesn't move\n // you out of the in-flight state.\n rolledBack() {},\n unloadRecord(internalModel) {},\n\n propertyWasReset() {},\n\n // SUBSTATES\n\n // A record begins its lifecycle in the `empty` state.\n // If its data will come from the adapter, it will\n // transition into the `loading` state. Otherwise, if\n // the record is being created on the client, it will\n // transition into the `created` state.\n empty: {\n isEmpty: true,\n\n // EVENTS\n loadingData(internalModel, promise) {\n internalModel._loadingPromise = promise;\n internalModel.transitionTo('loading');\n },\n\n loadedData(internalModel) {\n internalModel.transitionTo('loaded.created.uncommitted');\n internalModel.triggerLater('ready');\n },\n\n pushedData(internalModel) {\n internalModel.transitionTo('loaded.saved');\n internalModel.triggerLater('didLoad');\n internalModel.triggerLater('ready');\n }\n },\n\n // A record enters this state when the store asks\n // the adapter for its data. It remains in this state\n // until the adapter provides the requested data.\n //\n // Usually, this process is asynchronous, using an\n // XHR to retrieve the data.\n loading: {\n // FLAGS\n isLoading: true,\n\n exit(internalModel) {\n internalModel._loadingPromise = null;\n },\n\n // EVENTS\n pushedData(internalModel) {\n internalModel.transitionTo('loaded.saved');\n internalModel.triggerLater('didLoad');\n internalModel.triggerLater('ready');\n //TODO this seems out of place here\n internalModel.didCleanError();\n },\n\n becameError(internalModel) {\n internalModel.triggerLater('becameError', internalModel);\n },\n\n notFound(internalModel) {\n internalModel.transitionTo('empty');\n }\n },\n\n // A record enters this state when its data is populated.\n // Most of a record's lifecycle is spent inside substates\n // of the `loaded` state.\n loaded: {\n initialState: 'saved',\n\n // FLAGS\n isLoaded: true,\n\n //TODO(Igor) Reloading now triggers a loadingData event,\n //but it should be ok?\n loadingData() {},\n\n // SUBSTATES\n\n // If there are no local changes to a record, it remains\n // in the `saved` state.\n saved: {\n setup(internalModel) {\n if (internalModel.hasChangedAttributes()) {\n internalModel.adapterDidDirty();\n }\n },\n\n // EVENTS\n didSetProperty,\n\n pushedData() {},\n\n becomeDirty(internalModel) {\n internalModel.transitionTo('updated.uncommitted');\n },\n\n willCommit(internalModel) {\n internalModel.transitionTo('updated.inFlight');\n },\n\n reloadRecord(internalModel, resolve) {\n resolve(internalModel.store._reloadRecord(internalModel));\n },\n\n deleteRecord(internalModel) {\n internalModel.transitionTo('deleted.uncommitted');\n },\n\n unloadRecord(internalModel) {},\n\n didCommit() {},\n\n // loaded.saved.notFound would be triggered by a failed\n // `reload()` on an unchanged record\n notFound() {}\n },\n\n // A record is in this state after it has been locally\n // created but before the adapter has indicated that\n // it has been saved.\n created: createdState,\n\n // A record is in this state if it has already been\n // saved to the server, but there are new local changes\n // that have not yet been saved.\n updated: updatedState\n },\n\n // A record is in this state if it was deleted from the store.\n deleted: {\n initialState: 'uncommitted',\n dirtyType: 'deleted',\n\n // FLAGS\n isDeleted: true,\n isLoaded: true,\n isDirty: true,\n\n // TRANSITIONS\n setup(internalModel) {\n internalModel.updateRecordArrays();\n },\n\n // SUBSTATES\n\n // When a record is deleted, it enters the `start`\n // state. It will exit this state when the record\n // starts to commit.\n uncommitted: {\n\n // EVENTS\n\n willCommit(internalModel) {\n internalModel.transitionTo('inFlight');\n },\n\n rollback(internalModel) {\n internalModel.rollbackAttributes();\n internalModel.triggerLater('ready');\n },\n\n pushedData() {},\n becomeDirty() {},\n deleteRecord() {},\n\n rolledBack(internalModel) {\n internalModel.transitionTo('loaded.saved');\n internalModel.triggerLater('ready');\n }\n },\n\n // After a record starts committing, but\n // before the adapter indicates that the deletion\n // has saved to the server, a record is in the\n // `inFlight` substate of `deleted`.\n inFlight: {\n // FLAGS\n isSaving: true,\n\n // EVENTS\n\n unloadRecord: assertAgainstUnloadRecord,\n\n // TODO: More robust semantics around save-while-in-flight\n willCommit() {},\n didCommit(internalModel) {\n internalModel.transitionTo('saved');\n\n internalModel.send('invokeLifecycleCallbacks');\n },\n\n becameError(internalModel) {\n internalModel.transitionTo('uncommitted');\n internalModel.triggerLater('becameError', internalModel);\n },\n\n becameInvalid(internalModel) {\n internalModel.transitionTo('invalid');\n internalModel.triggerLater('becameInvalid', internalModel);\n }\n },\n\n // Once the adapter indicates that the deletion has\n // been saved, the record enters the `saved` substate\n // of `deleted`.\n saved: {\n // FLAGS\n isDirty: false,\n\n setup(internalModel) {\n internalModel.removeFromInverseRelationships();\n },\n\n invokeLifecycleCallbacks(internalModel) {\n internalModel.triggerLater('didDelete', internalModel);\n internalModel.triggerLater('didCommit', internalModel);\n },\n\n willCommit() {},\n didCommit() {}\n },\n\n invalid: {\n isValid: false,\n\n didSetProperty(internalModel, context) {\n internalModel.removeErrorMessageFromAttribute(context.name);\n\n didSetProperty(internalModel, context);\n\n if (!internalModel.hasErrors()) {\n this.becameValid(internalModel);\n }\n },\n\n becameInvalid() {},\n becomeDirty() {},\n deleteRecord() {},\n willCommit() {},\n\n rolledBack(internalModel) {\n internalModel.clearErrorMessages();\n internalModel.transitionTo('loaded.saved');\n internalModel.triggerLater('ready');\n },\n\n becameValid(internalModel) {\n internalModel.transitionTo('uncommitted');\n }\n\n }\n },\n\n invokeLifecycleCallbacks(internalModel, dirtyType) {\n if (dirtyType === 'created') {\n internalModel.triggerLater('didCreate', internalModel);\n } else {\n internalModel.triggerLater('didUpdate', internalModel);\n }\n\n internalModel.triggerLater('didCommit', internalModel);\n }\n};\n\nfunction wireState(object, parent, name) {\n // TODO: Use Object.create and copy instead\n object = mixin(parent ? Object.create(parent) : {}, object);\n object.parentState = parent;\n object.stateName = name;\n\n for (var prop in object) {\n if (!object.hasOwnProperty(prop) || prop === 'parentState' || prop === 'stateName') {\n continue;\n }\n if (typeof object[prop] === 'object') {\n object[prop] = wireState(object[prop], object, name + '.' + prop);\n }\n }\n\n return object;\n}\n\nvar RootState$1 = wireState(RootState, null, 'root');\n\n// All modelNames are dasherized internally. Changing this function may\n// require changes to other normalization hooks (such as typeForRoot).\n\n/**\n This method normalizes a modelName into the format Ember Data uses\n internally.\n\n @method normalizeModelName\n @public\n @param {String} modelName\n @return {String} normalizedModelName\n @for DS\n*/\nfunction normalizeModelName(modelName) {\n return Ember.String.dasherize(modelName);\n}\n\nfunction typeForRelationshipMeta(meta) {\n var modelName = void 0;\n\n modelName = meta.type || meta.key;\n if (meta.kind === 'hasMany') {\n modelName = emberInflector.singularize(normalizeModelName(modelName));\n }\n return modelName;\n}\n\nfunction relationshipFromMeta(meta) {\n return {\n key: meta.key,\n kind: meta.kind,\n type: typeForRelationshipMeta(meta),\n options: meta.options,\n name: meta.name,\n parentType: meta.parentType,\n isRelationship: true\n };\n}\n\nvar relationshipsDescriptor = Ember.computed(function () {\n var map = new Ember.MapWithDefault({\n defaultValue() {\n return [];\n }\n });\n\n // Loop through each computed property on the class\n this.eachComputedProperty((name, meta) => {\n // If the computed property is a relationship, add\n // it to the map.\n if (meta.isRelationship) {\n meta.key = name;\n var relationshipsForType = map.get(typeForRelationshipMeta(meta));\n\n relationshipsForType.push({\n name: name,\n kind: meta.kind\n });\n }\n });\n\n return map;\n}).readOnly();\n\nvar relatedTypesDescriptor = Ember.computed(function () {\n var modelName = void 0;\n var types = Ember.A();\n\n // Loop through each computed property on the class,\n // and create an array of the unique types involved\n // in relationships\n this.eachComputedProperty((name, meta) => {\n if (meta.isRelationship) {\n meta.key = name;\n modelName = typeForRelationshipMeta(meta);\n\n (true && !(modelName) && Ember.assert(`You specified a hasMany (${meta.type}) on ${meta.parentType} but ${meta.type} was not found.`, modelName));\n\n\n if (!types.includes(modelName)) {\n (true && !(!!modelName) && Ember.assert(`Trying to sideload ${name} on ${this.toString()} but the type doesn't exist.`, !!modelName));\n\n types.push(modelName);\n }\n }\n });\n\n return types;\n}).readOnly();\n\nvar relationshipsByNameDescriptor = Ember.computed(function () {\n var map = Ember.Map.create();\n\n this.eachComputedProperty((name, meta) => {\n if (meta.isRelationship) {\n meta.key = name;\n var relationship = relationshipFromMeta(meta);\n relationship.type = typeForRelationshipMeta(meta);\n map.set(name, relationship);\n }\n });\n\n return map;\n}).readOnly();\n\n/**\n @module ember-data\n*/\n\nfunction findPossibleInverses(type, inverseType, name, relationshipsSoFar) {\n var possibleRelationships = relationshipsSoFar || [];\n\n var relationshipMap = Ember.get(inverseType, 'relationships');\n if (!relationshipMap) {\n return possibleRelationships;\n }\n\n var relationships = relationshipMap.get(type.modelName).filter(relationship => {\n var optionsForRelationship = inverseType.metaForProperty(relationship.name).options;\n\n if (!optionsForRelationship.inverse && optionsForRelationship.inverse !== null) {\n return true;\n }\n\n return name === optionsForRelationship.inverse;\n });\n\n if (relationships) {\n possibleRelationships.push.apply(possibleRelationships, relationships);\n }\n\n //Recurse to support polymorphism\n if (type.superclass) {\n findPossibleInverses(type.superclass, inverseType, name, possibleRelationships);\n }\n\n return possibleRelationships;\n}\n\nfunction intersection(array1, array2) {\n var result = [];\n array1.forEach(element => {\n if (array2.indexOf(element) >= 0) {\n result.push(element);\n }\n });\n\n return result;\n}\n\nvar RESERVED_MODEL_PROPS = ['currentState', 'data', 'store'];\n\nvar retrieveFromCurrentState = Ember.computed('currentState', function (key) {\n return Ember.get(this._internalModel.currentState, key);\n}).readOnly();\n\n/**\n\n The model class that all Ember Data records descend from.\n This is the public API of Ember Data models. If you are using Ember Data\n in your application, this is the class you should use.\n If you are working on Ember Data internals, you most likely want to be dealing\n with `InternalModel`\n\n @class Model\n @namespace DS\n @extends Ember.Object\n @uses Ember.Evented\n*/\nvar Model = Ember.Object.extend(Ember.Evented, {\n _internalModel: null,\n store: null,\n __defineNonEnumerable(property) {\n this[property.name] = property.descriptor.value;\n },\n\n /**\n If this property is `true` the record is in the `empty`\n state. Empty is the first state all records enter after they have\n been created. Most records created by the store will quickly\n transition to the `loading` state if data needs to be fetched from\n the server or the `created` state if the record is created on the\n client. A record can also enter the empty state if the adapter is\n unable to locate the record.\n @property isEmpty\n @type {Boolean}\n @readOnly\n */\n isEmpty: retrieveFromCurrentState,\n /**\n If this property is `true` the record is in the `loading` state. A\n record enters this state when the store asks the adapter for its\n data. It remains in this state until the adapter provides the\n requested data.\n @property isLoading\n @type {Boolean}\n @readOnly\n */\n isLoading: retrieveFromCurrentState,\n /**\n If this property is `true` the record is in the `loaded` state. A\n record enters this state when its data is populated. Most of a\n record's lifecycle is spent inside substates of the `loaded`\n state.\n Example\n ```javascript\n let record = store.createRecord('model');\n record.get('isLoaded'); // true\n store.findRecord('model', 1).then(function(model) {\n model.get('isLoaded'); // true\n });\n ```\n @property isLoaded\n @type {Boolean}\n @readOnly\n */\n isLoaded: retrieveFromCurrentState,\n /**\n If this property is `true` the record is in the `dirty` state. The\n record has local changes that have not yet been saved by the\n adapter. This includes records that have been created (but not yet\n saved) or deleted.\n Example\n ```javascript\n let record = store.createRecord('model');\n record.get('hasDirtyAttributes'); // true\n store.findRecord('model', 1).then(function(model) {\n model.get('hasDirtyAttributes'); // false\n model.set('foo', 'some value');\n model.get('hasDirtyAttributes'); // true\n });\n ```\n @since 1.13.0\n @property hasDirtyAttributes\n @type {Boolean}\n @readOnly\n */\n hasDirtyAttributes: Ember.computed('currentState.isDirty', function () {\n return this.get('currentState.isDirty');\n }),\n /**\n If this property is `true` the record is in the `saving` state. A\n record enters the saving state when `save` is called, but the\n adapter has not yet acknowledged that the changes have been\n persisted to the backend.\n Example\n ```javascript\n let record = store.createRecord('model');\n record.get('isSaving'); // false\n let promise = record.save();\n record.get('isSaving'); // true\n promise.then(function() {\n record.get('isSaving'); // false\n });\n ```\n @property isSaving\n @type {Boolean}\n @readOnly\n */\n isSaving: retrieveFromCurrentState,\n /**\n If this property is `true` the record is in the `deleted` state\n and has been marked for deletion. When `isDeleted` is true and\n `hasDirtyAttributes` is true, the record is deleted locally but the deletion\n was not yet persisted. When `isSaving` is true, the change is\n in-flight. When both `hasDirtyAttributes` and `isSaving` are false, the\n change has persisted.\n Example\n ```javascript\n let record = store.createRecord('model');\n record.get('isDeleted'); // false\n record.deleteRecord();\n // Locally deleted\n record.get('isDeleted'); // true\n record.get('hasDirtyAttributes'); // true\n record.get('isSaving'); // false\n // Persisting the deletion\n let promise = record.save();\n record.get('isDeleted'); // true\n record.get('isSaving'); // true\n // Deletion Persisted\n promise.then(function() {\n record.get('isDeleted'); // true\n record.get('isSaving'); // false\n record.get('hasDirtyAttributes'); // false\n });\n ```\n @property isDeleted\n @type {Boolean}\n @readOnly\n */\n isDeleted: retrieveFromCurrentState,\n /**\n If this property is `true` the record is in the `new` state. A\n record will be in the `new` state when it has been created on the\n client and the adapter has not yet report that it was successfully\n saved.\n Example\n ```javascript\n let record = store.createRecord('model');\n record.get('isNew'); // true\n record.save().then(function(model) {\n model.get('isNew'); // false\n });\n ```\n @property isNew\n @type {Boolean}\n @readOnly\n */\n isNew: retrieveFromCurrentState,\n /**\n If this property is `true` the record is in the `valid` state.\n A record will be in the `valid` state when the adapter did not report any\n server-side validation failures.\n @property isValid\n @type {Boolean}\n @readOnly\n */\n isValid: retrieveFromCurrentState,\n /**\n If the record is in the dirty state this property will report what\n kind of change has caused it to move into the dirty\n state. Possible values are:\n - `created` The record has been created by the client and not yet saved to the adapter.\n - `updated` The record has been updated by the client and not yet saved to the adapter.\n - `deleted` The record has been deleted by the client and not yet saved to the adapter.\n Example\n ```javascript\n let record = store.createRecord('model');\n record.get('dirtyType'); // 'created'\n ```\n @property dirtyType\n @type {String}\n @readOnly\n */\n dirtyType: retrieveFromCurrentState,\n\n /**\n If `true` the adapter reported that it was unable to save local\n changes to the backend for any reason other than a server-side\n validation error.\n Example\n ```javascript\n record.get('isError'); // false\n record.set('foo', 'valid value');\n record.save().then(null, function() {\n record.get('isError'); // true\n });\n ```\n @property isError\n @type {Boolean}\n @readOnly\n */\n isError: false,\n\n /**\n If `true` the store is attempting to reload the record from the adapter.\n Example\n ```javascript\n record.get('isReloading'); // false\n record.reload();\n record.get('isReloading'); // true\n ```\n @property isReloading\n @type {Boolean}\n @readOnly\n */\n isReloading: false,\n\n /**\n All ember models have an id property. This is an identifier\n managed by an external source. These are always coerced to be\n strings before being used internally. Note when declaring the\n attributes for a model it is an error to declare an id\n attribute.\n ```javascript\n let record = store.createRecord('model');\n record.get('id'); // null\n store.findRecord('model', 1).then(function(model) {\n model.get('id'); // '1'\n });\n ```\n @property id\n @type {String}\n */\n id: null,\n\n /**\n @property currentState\n @private\n @type {Object}\n */\n currentState: RootState$1.empty,\n\n /**\n When the record is in the `invalid` state this object will contain\n any errors returned by the adapter. When present the errors hash\n contains keys corresponding to the invalid property names\n and values which are arrays of Javascript objects with two keys:\n - `message` A string containing the error message from the backend\n - `attribute` The name of the property associated with this error message\n ```javascript\n record.get('errors.length'); // 0\n record.set('foo', 'invalid value');\n record.save().catch(function() {\n record.get('errors').get('foo');\n // [{message: 'foo should be a number.', attribute: 'foo'}]\n });\n ```\n The `errors` property us useful for displaying error messages to\n the user.\n ```handlebars\n <label>Username: {{input value=username}} </label>\n {{#each model.errors.username as |error|}}\n <div class=\"error\">\n {{error.message}}\n </div>\n {{/each}}\n <label>Email: {{input value=email}} </label>\n {{#each model.errors.email as |error|}}\n <div class=\"error\">\n {{error.message}}\n </div>\n {{/each}}\n ```\n You can also access the special `messages` property on the error\n object to get an array of all the error strings.\n ```handlebars\n {{#each model.errors.messages as |message|}}\n <div class=\"error\">\n {{message}}\n </div>\n {{/each}}\n ```\n @property errors\n @type {DS.Errors}\n */\n errors: Ember.computed(function () {\n var errors = Errors.create();\n\n errors._registerHandlers(this._internalModel, function () {\n this.send('becameInvalid');\n }, function () {\n this.send('becameValid');\n });\n return errors;\n }).readOnly(),\n\n /**\n This property holds the `DS.AdapterError` object with which\n last adapter operation was rejected.\n @property adapterError\n @type {DS.AdapterError}\n */\n adapterError: null,\n\n /**\n Create a JSON representation of the record, using the serialization\n strategy of the store's adapter.\n `serialize` takes an optional hash as a parameter, currently\n supported options are:\n - `includeId`: `true` if the record's ID should be included in the\n JSON representation.\n @method serialize\n @param {Object} options\n @return {Object} an object whose values are primitive JSON values only\n */\n serialize(options) {\n return this._internalModel.createSnapshot().serialize(options);\n },\n\n /**\n Use [DS.JSONSerializer](DS.JSONSerializer.html) to\n get the JSON representation of a record.\n `toJSON` takes an optional hash as a parameter, currently\n supported options are:\n - `includeId`: `true` if the record's ID should be included in the\n JSON representation.\n @method toJSON\n @param {Object} options\n @return {Object} A JSON representation of the object.\n */\n toJSON(options) {\n // container is for lazy transform lookups\n var serializer = this.store.serializerFor('-default');\n var snapshot = this._internalModel.createSnapshot();\n\n return serializer.serialize(snapshot, options);\n },\n\n /**\n Fired when the record is ready to be interacted with,\n that is either loaded from the server or created locally.\n @event ready\n */\n ready: null,\n\n /**\n Fired when the record is loaded from the server.\n @event didLoad\n */\n didLoad: null,\n\n /**\n Fired when the record is updated.\n @event didUpdate\n */\n didUpdate: null,\n\n /**\n Fired when a new record is commited to the server.\n @event didCreate\n */\n didCreate: null,\n\n /**\n Fired when the record is deleted.\n @event didDelete\n */\n didDelete: null,\n\n /**\n Fired when the record becomes invalid.\n @event becameInvalid\n */\n becameInvalid: null,\n\n /**\n Fired when the record enters the error state.\n @event becameError\n */\n becameError: null,\n\n /**\n Fired when the record is rolled back.\n @event rolledBack\n */\n rolledBack: null,\n\n //TODO Do we want to deprecate these?\n /**\n @method send\n @private\n @param {String} name\n @param {Object} context\n */\n send(name, context) {\n return this._internalModel.send(name, context);\n },\n\n /**\n @method transitionTo\n @private\n @param {String} name\n */\n transitionTo(name) {\n return this._internalModel.transitionTo(name);\n },\n\n /**\n Marks the record as deleted but does not save it. You must call\n `save` afterwards if you want to persist it. You might use this\n method if you want to allow the user to still `rollbackAttributes()`\n after a delete was made.\n Example\n ```app/routes/model/delete.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n actions: {\n softDelete() {\n this.get('controller.model').deleteRecord();\n },\n confirm() {\n this.get('controller.model').save();\n },\n undo() {\n this.get('controller.model').rollbackAttributes();\n }\n }\n });\n ```\n @method deleteRecord\n */\n deleteRecord() {\n this._internalModel.deleteRecord();\n },\n\n /**\n Same as `deleteRecord`, but saves the record immediately.\n Example\n ```app/routes/model/delete.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n actions: {\n delete() {\n this.get('controller.model').destroyRecord().then(function() {\n controller.transitionToRoute('model.index');\n });\n }\n }\n });\n ```\n If you pass an object on the `adapterOptions` property of the options\n argument it will be passed to your adapter via the snapshot\n ```js\n record.destroyRecord({ adapterOptions: { subscribe: false } });\n ```\n ```app/adapters/post.js\n import MyCustomAdapter from './custom-adapter';\n export default MyCustomAdapter.extend({\n deleteRecord(store, type, snapshot) {\n if (snapshot.adapterOptions.subscribe) {\n // ...\n }\n // ...\n }\n });\n ```\n @method destroyRecord\n @param {Object} options\n @return {Promise} a promise that will be resolved when the adapter returns\n successfully or rejected if the adapter returns with an error.\n */\n destroyRecord(options) {\n this.deleteRecord();\n return this.save(options);\n },\n\n /**\n Unloads the record from the store. This will cause the record to be destroyed and freed up for garbage collection.\n @method unloadRecord\n */\n unloadRecord() {\n if (this.isDestroyed) {\n return;\n }\n this._internalModel.unloadRecord();\n },\n\n /**\n @method _notifyProperties\n @private\n */\n _notifyProperties(keys) {\n Ember.beginPropertyChanges();\n var key = void 0;\n for (var i = 0, length = keys.length; i < length; i++) {\n key = keys[i];\n this.notifyPropertyChange(key);\n }\n Ember.endPropertyChanges();\n },\n\n /**\n Returns an object, whose keys are changed properties, and value is\n an [oldProp, newProp] array.\n The array represents the diff of the canonical state with the local state\n of the model. Note: if the model is created locally, the canonical state is\n empty since the adapter hasn't acknowledged the attributes yet:\n Example\n ```app/models/mascot.js\n import DS from 'ember-data';\n export default DS.Model.extend({\n name: DS.attr('string'),\n isAdmin: DS.attr('boolean', {\n defaultValue: false\n })\n });\n ```\n ```javascript\n let mascot = store.createRecord('mascot');\n mascot.changedAttributes(); // {}\n mascot.set('name', 'Tomster');\n mascot.changedAttributes(); // { name: [undefined, 'Tomster'] }\n mascot.set('isAdmin', true);\n mascot.changedAttributes(); // { isAdmin: [undefined, true], name: [undefined, 'Tomster'] }\n mascot.save().then(function() {\n mascot.changedAttributes(); // {}\n mascot.set('isAdmin', false);\n mascot.changedAttributes(); // { isAdmin: [true, false] }\n });\n ```\n @method changedAttributes\n @return {Object} an object, whose keys are changed properties,\n and value is an [oldProp, newProp] array.\n */\n changedAttributes() {\n return this._internalModel.changedAttributes();\n },\n\n //TODO discuss with tomhuda about events/hooks\n //Bring back as hooks?\n /**\n @method adapterWillCommit\n @private\n adapterWillCommit: function() {\n this.send('willCommit');\n },\n /**\n @method adapterDidDirty\n @private\n adapterDidDirty: function() {\n this.send('becomeDirty');\n this.updateRecordArraysLater();\n },\n */\n\n /**\n If the model `hasDirtyAttributes` this function will discard any unsaved\n changes. If the model `isNew` it will be removed from the store.\n Example\n ```javascript\n record.get('name'); // 'Untitled Document'\n record.set('name', 'Doc 1');\n record.get('name'); // 'Doc 1'\n record.rollbackAttributes();\n record.get('name'); // 'Untitled Document'\n ```\n @since 1.13.0\n @method rollbackAttributes\n */\n rollbackAttributes() {\n this._internalModel.rollbackAttributes();\n },\n\n /*\n @method _createSnapshot\n @private\n */\n _createSnapshot() {\n return this._internalModel.createSnapshot();\n },\n\n toStringExtension() {\n return Ember.get(this, 'id');\n },\n\n /**\n Save the record and persist any changes to the record to an\n external source via the adapter.\n Example\n ```javascript\n record.set('name', 'Tomster');\n record.save().then(function() {\n // Success callback\n }, function() {\n // Error callback\n });\n ```\n If you pass an object using the `adapterOptions` property of the options\n argument it will be passed to your adapter via the snapshot.\n ```js\n record.save({ adapterOptions: { subscribe: false } });\n ```\n ```app/adapters/post.js\n import MyCustomAdapter from './custom-adapter';\n export default MyCustomAdapter.extend({\n updateRecord(store, type, snapshot) {\n if (snapshot.adapterOptions.subscribe) {\n // ...\n }\n // ...\n }\n });\n ```\n @method save\n @param {Object} options\n @return {Promise} a promise that will be resolved when the adapter returns\n successfully or rejected if the adapter returns with an error.\n */\n save(options) {\n return PromiseObject.create({\n promise: this._internalModel.save(options).then(() => this)\n });\n },\n\n /**\n Reload the record from the adapter.\n This will only work if the record has already finished loading.\n Example\n ```app/routes/model/view.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n actions: {\n reload() {\n this.controller.get('model').reload().then(function(model) {\n // do something with the reloaded model\n });\n }\n }\n });\n ```\n @method reload\n @return {Promise} a promise that will be resolved with the record when the\n adapter returns successfully or rejected if the adapter returns\n with an error.\n */\n reload() {\n return PromiseObject.create({\n promise: this._internalModel.reload().then(() => this)\n });\n },\n\n /**\n Override the default event firing from Ember.Evented to\n also call methods with the given name.\n @method trigger\n @private\n @param {String} name\n */\n trigger(name) {\n var fn = this[name];\n\n if (typeof fn === 'function') {\n var length = arguments.length;\n var args = new Array(length - 1);\n\n for (var i = 1; i < length; i++) {\n args[i - 1] = arguments[i];\n }\n fn.apply(this, args);\n }\n\n this._super(...arguments);\n },\n\n attr() {\n (true && !(false) && Ember.assert(\"The `attr` method is not available on DS.Model, a DS.Snapshot was probably expected. Are you passing a DS.Model instead of a DS.Snapshot to your serializer?\", false));\n },\n\n /**\n Get the reference for the specified belongsTo relationship.\n Example\n ```app/models/blog.js\n export default DS.Model.extend({\n user: DS.belongsTo({ async: true })\n });\n ```\n ```javascript\n let blog = store.push({\n data: {\n type: 'blog',\n id: 1,\n relationships: {\n user: {\n data: { type: 'user', id: 1 }\n }\n }\n }\n });\n let userRef = blog.belongsTo('user');\n // check if the user relationship is loaded\n let isLoaded = userRef.value() !== null;\n // get the record of the reference (null if not yet available)\n let user = userRef.value();\n // get the identifier of the reference\n if (userRef.remoteType() === \"id\") {\n let id = userRef.id();\n } else if (userRef.remoteType() === \"link\") {\n let link = userRef.link();\n }\n // load user (via store.findRecord or store.findBelongsTo)\n userRef.load().then(...)\n // or trigger a reload\n userRef.reload().then(...)\n // provide data for reference\n userRef.push({\n type: 'user',\n id: 1,\n attributes: {\n username: \"@user\"\n }\n }).then(function(user) {\n userRef.value() === user;\n });\n ```\n @method belongsTo\n @param {String} name of the relationship\n @since 2.5.0\n @return {BelongsToReference} reference for this relationship\n */\n belongsTo(name) {\n return this._internalModel.referenceFor('belongsTo', name);\n },\n\n /**\n Get the reference for the specified hasMany relationship.\n Example\n ```javascript\n // models/blog.js\n export default DS.Model.extend({\n comments: DS.hasMany({ async: true })\n });\n let blog = store.push({\n data: {\n type: 'blog',\n id: 1,\n relationships: {\n comments: {\n data: [\n { type: 'comment', id: 1 },\n { type: 'comment', id: 2 }\n ]\n }\n }\n }\n });\n let commentsRef = blog.hasMany('comments');\n // check if the comments are loaded already\n let isLoaded = commentsRef.value() !== null;\n // get the records of the reference (null if not yet available)\n let comments = commentsRef.value();\n // get the identifier of the reference\n if (commentsRef.remoteType() === \"ids\") {\n let ids = commentsRef.ids();\n } else if (commentsRef.remoteType() === \"link\") {\n let link = commentsRef.link();\n }\n // load comments (via store.findMany or store.findHasMany)\n commentsRef.load().then(...)\n // or trigger a reload\n commentsRef.reload().then(...)\n // provide data for reference\n commentsRef.push([{ type: 'comment', id: 1 }, { type: 'comment', id: 2 }]).then(function(comments) {\n commentsRef.value() === comments;\n });\n ```\n @method hasMany\n @param {String} name of the relationship\n @since 2.5.0\n @return {HasManyReference} reference for this relationship\n */\n hasMany(name) {\n return this._internalModel.referenceFor('hasMany', name);\n },\n\n setId: Ember.observer('id', function () {\n this._internalModel.setId(this.get('id'));\n }),\n\n /**\n Provides info about the model for debugging purposes\n by grouping the properties into more semantic groups.\n Meant to be used by debugging tools such as the Chrome Ember Extension.\n - Groups all attributes in \"Attributes\" group.\n - Groups all belongsTo relationships in \"Belongs To\" group.\n - Groups all hasMany relationships in \"Has Many\" group.\n - Groups all flags in \"Flags\" group.\n - Flags relationship CPs as expensive properties.\n @method _debugInfo\n @for DS.Model\n @private\n */\n _debugInfo() {\n var attributes = ['id'];\n var relationships = {};\n var expensiveProperties = [];\n\n this.eachAttribute((name, meta) => attributes.push(name));\n\n var groups = [{\n name: 'Attributes',\n properties: attributes,\n expand: true\n }];\n\n this.eachRelationship((name, relationship) => {\n var properties = relationships[relationship.kind];\n\n if (properties === undefined) {\n properties = relationships[relationship.kind] = [];\n groups.push({\n name: relationship.name,\n properties,\n expand: true\n });\n }\n properties.push(name);\n expensiveProperties.push(name);\n });\n\n groups.push({\n name: 'Flags',\n properties: ['isLoaded', 'hasDirtyAttributes', 'isSaving', 'isDeleted', 'isError', 'isNew', 'isValid']\n });\n\n return {\n propertyInfo: {\n // include all other mixins / properties (not just the grouped ones)\n includeOtherProperties: true,\n groups: groups,\n // don't pre-calculate unless cached\n expensiveProperties: expensiveProperties\n }\n };\n },\n\n notifyBelongsToChanged(key) {\n this.notifyPropertyChange(key);\n },\n /**\n Given a callback, iterates over each of the relationships in the model,\n invoking the callback with the name of each relationship and its relationship\n descriptor.\n The callback method you provide should have the following signature (all\n parameters are optional):\n ```javascript\n function(name, descriptor);\n ```\n - `name` the name of the current property in the iteration\n - `descriptor` the meta object that describes this relationship\n The relationship descriptor argument is an object with the following properties.\n - **key** <span class=\"type\">String</span> the name of this relationship on the Model\n - **kind** <span class=\"type\">String</span> \"hasMany\" or \"belongsTo\"\n - **options** <span class=\"type\">Object</span> the original options hash passed when the relationship was declared\n - **parentType** <span class=\"type\">DS.Model</span> the type of the Model that owns this relationship\n - **type** <span class=\"type\">String</span> the type name of the related Model\n Note that in addition to a callback, you can also pass an optional target\n object that will be set as `this` on the context.\n Example\n ```app/serializers/application.js\n import DS from 'ember-data';\n export default DS.JSONSerializer.extend({\n serialize: function(record, options) {\n let json = {};\n record.eachRelationship(function(name, descriptor) {\n if (descriptor.kind === 'hasMany') {\n let serializedHasManyName = name.toUpperCase() + '_IDS';\n json[serializedHasManyName] = record.get(name).mapBy('id');\n }\n });\n return json;\n }\n });\n ```\n @method eachRelationship\n @param {Function} callback the callback to invoke\n @param {any} binding the value to which the callback's `this` should be bound\n */\n eachRelationship(callback, binding) {\n this.constructor.eachRelationship(callback, binding);\n },\n\n relationshipFor(name) {\n return Ember.get(this.constructor, 'relationshipsByName').get(name);\n },\n\n inverseFor(key) {\n return this.constructor.inverseFor(key, this.store);\n },\n\n notifyHasManyAdded(key) {\n //We need to notifyPropertyChange in the adding case because we need to make sure\n //we fetch the newly added record in case it is unloaded\n //TODO(Igor): Consider whether we could do this only if the record state is unloaded\n\n //Goes away once hasMany is double promisified\n this.notifyPropertyChange(key);\n },\n\n eachAttribute(callback, binding) {\n this.constructor.eachAttribute(callback, binding);\n }\n});\n\n/**\n @property data\n @private\n @type {Object}\n */\nObject.defineProperty(Model.prototype, 'data', {\n get() {\n return this._internalModel._data;\n }\n});\n\n{\n Model.reopen({\n init() {\n this._super(...arguments);\n\n if (!this._internalModel) {\n throw new Ember.Error('You should not call `create` on a model. Instead, call `store.createRecord` with the attributes you would like to set.');\n }\n }\n });\n}\n\nModel.reopenClass({\n isModel: true,\n\n /**\n Override the class' `create()` method to raise an error. This\n prevents end users from inadvertently calling `create()` instead\n of `createRecord()`. The store is still able to create instances\n by calling the `_create()` method. To create an instance of a\n `DS.Model` use [store.createRecord](DS.Store.html#method_createRecord).\n @method create\n @private\n @static\n */\n /**\n Represents the model's class name as a string. This can be used to look up the model's class name through\n `DS.Store`'s modelFor method.\n `modelName` is generated for you by Ember Data. It will be a lowercased, dasherized string.\n For example:\n ```javascript\n store.modelFor('post').modelName; // 'post'\n store.modelFor('blog-post').modelName; // 'blog-post'\n ```\n The most common place you'll want to access `modelName` is in your serializer's `payloadKeyFromModelName` method. For example, to change payload\n keys to underscore (instead of dasherized), you might use the following code:\n ```javascript\n import { underscore } from '@ember/string';\n export default const PostSerializer = DS.RESTSerializer.extend({\n payloadKeyFromModelName(modelName) {\n return underscore(modelName);\n }\n });\n ```\n @property modelName\n @type String\n @readonly\n @static\n */\n modelName: null,\n\n /*\n These class methods below provide relationship\n introspection abilities about relationships.\n A note about the computed properties contained here:\n **These properties are effectively sealed once called for the first time.**\n To avoid repeatedly doing expensive iteration over a model's fields, these\n values are computed once and then cached for the remainder of the runtime of\n your application.\n If your application needs to modify a class after its initial definition\n (for example, using `reopen()` to add additional attributes), make sure you\n do it before using your model with the store, which uses these properties\n extensively.\n */\n\n /**\n For a given relationship name, returns the model type of the relationship.\n For example, if you define a model like this:\n ```app/models/post.js\n import DS from 'ember-data';\n export default DS.Model.extend({\n comments: DS.hasMany('comment')\n });\n ```\n Calling `store.modelFor('post').typeForRelationship('comments', store)` will return `Comment`.\n @method typeForRelationship\n @static\n @param {String} name the name of the relationship\n @param {store} store an instance of DS.Store\n @return {DS.Model} the type of the relationship, or undefined\n */\n typeForRelationship(name, store) {\n var relationship = Ember.get(this, 'relationshipsByName').get(name);\n return relationship && store.modelFor(relationship.type);\n },\n\n inverseMap: Ember.computed(function () {\n return Object.create(null);\n }),\n\n /**\n Find the relationship which is the inverse of the one asked for.\n For example, if you define models like this:\n ```app/models/post.js\n import DS from 'ember-data';\n export default DS.Model.extend({\n comments: DS.hasMany('message')\n });\n ```\n ```app/models/message.js\n import DS from 'ember-data';\n export default DS.Model.extend({\n owner: DS.belongsTo('post')\n });\n ```\n ``` js\n store.modelFor('post').inverseFor('comments', store) // { type: App.Message, name: 'owner', kind: 'belongsTo' }\n store.modelFor('message').inverseFor('owner', store) // { type: App.Post, name: 'comments', kind: 'hasMany' }\n ```\n @method inverseFor\n @static\n @param {String} name the name of the relationship\n @param {DS.Store} store\n @return {Object} the inverse relationship, or null\n */\n inverseFor(name, store) {\n var inverseMap = Ember.get(this, 'inverseMap');\n if (inverseMap[name] !== undefined) {\n return inverseMap[name];\n } else {\n var relationship = Ember.get(this, 'relationshipsByName').get(name);\n if (!relationship) {\n inverseMap[name] = null;\n return null;\n }\n\n var options = relationship.options;\n if (options && options.inverse === null) {\n // populate the cache with a miss entry so we can skip getting and going\n // through `relationshipsByName`\n inverseMap[name] = null;\n return null;\n }\n\n return inverseMap[name] = this._findInverseFor(name, store);\n }\n },\n\n //Calculate the inverse, ignoring the cache\n _findInverseFor(name, store) {\n\n var inverseType = this.typeForRelationship(name, store);\n if (!inverseType) {\n return null;\n }\n\n var propertyMeta = this.metaForProperty(name);\n //If inverse is manually specified to be null, like `comments: DS.hasMany('message', { inverse: null })`\n var options = propertyMeta.options;\n if (options.inverse === null) {\n return null;\n }\n\n var inverseName = void 0,\n inverseKind = void 0,\n inverse = void 0;\n\n //If inverse is specified manually, return the inverse\n if (options.inverse) {\n inverseName = options.inverse;\n inverse = Ember.get(inverseType, 'relationshipsByName').get(inverseName);\n\n (true && !(!Ember.isNone(inverse)) && Ember.assert(\"We found no inverse relationships by the name of '\" + inverseName + \"' on the '\" + inverseType.modelName + \"' model. This is most likely due to a missing attribute on your model definition.\", !Ember.isNone(inverse)));\n\n\n inverseKind = inverse.kind;\n } else {\n //No inverse was specified manually, we need to use a heuristic to guess one\n if (propertyMeta.parentType && propertyMeta.type === propertyMeta.parentType.modelName) {\n (true && Ember.warn(`Detected a reflexive relationship by the name of '${name}' without an inverse option. Look at https://guides.emberjs.com/current/models/relationships/#toc_reflexive-relations for how to explicitly specify inverses.`, false, {\n id: 'ds.model.reflexive-relationship-without-inverse'\n }));\n }\n\n var possibleRelationships = findPossibleInverses(this, inverseType, name);\n\n if (possibleRelationships.length === 0) {\n return null;\n }\n\n var filteredRelationships = possibleRelationships.filter(possibleRelationship => {\n var optionsForRelationship = inverseType.metaForProperty(possibleRelationship.name).options;\n return name === optionsForRelationship.inverse;\n });\n\n (true && !(filteredRelationships.length < 2) && Ember.assert(\"You defined the '\" + name + \"' relationship on \" + this + \", but you defined the inverse relationships of type \" + inverseType.toString() + \" multiple times. Look at https://guides.emberjs.com/current/models/relationships/#toc_explicit-inverses for how to explicitly specify inverses\", filteredRelationships.length < 2));\n\n\n if (filteredRelationships.length === 1) {\n possibleRelationships = filteredRelationships;\n }\n\n (true && !(possibleRelationships.length === 1) && Ember.assert(\"You defined the '\" + name + \"' relationship on \" + this + \", but multiple possible inverse relationships of type \" + this + \" were found on \" + inverseType + \". Look at https://guides.emberjs.com/current/models/relationships/#toc_explicit-inverses for how to explicitly specify inverses\", possibleRelationships.length === 1));\n\n\n inverseName = possibleRelationships[0].name;\n inverseKind = possibleRelationships[0].kind;\n }\n\n return {\n type: inverseType,\n name: inverseName,\n kind: inverseKind\n };\n },\n\n /**\n The model's relationships as a map, keyed on the type of the\n relationship. The value of each entry is an array containing a descriptor\n for each relationship with that type, describing the name of the relationship\n as well as the type.\n For example, given the following model definition:\n ```app/models/blog.js\n import DS from 'ember-data';\n export default DS.Model.extend({\n users: DS.hasMany('user'),\n owner: DS.belongsTo('user'),\n posts: DS.hasMany('post')\n });\n ```\n This computed property would return a map describing these\n relationships, like this:\n ```javascript\n import Ember from 'ember';\n import Blog from 'app/models/blog';\n import User from 'app/models/user';\n import Post from 'app/models/post';\n let relationships = Ember.get(Blog, 'relationships');\n relationships.get(User);\n //=> [ { name: 'users', kind: 'hasMany' },\n // { name: 'owner', kind: 'belongsTo' } ]\n relationships.get(Post);\n //=> [ { name: 'posts', kind: 'hasMany' } ]\n ```\n @property relationships\n @static\n @type Ember.Map\n @readOnly\n */\n\n relationships: relationshipsDescriptor,\n\n /**\n A hash containing lists of the model's relationships, grouped\n by the relationship kind. For example, given a model with this\n definition:\n ```app/models/blog.js\n import DS from 'ember-data';\n export default DS.Model.extend({\n users: DS.hasMany('user'),\n owner: DS.belongsTo('user'),\n posts: DS.hasMany('post')\n });\n ```\n This property would contain the following:\n ```javascript\n import Ember from 'ember';\n import Blog from 'app/models/blog';\n let relationshipNames = Ember.get(Blog, 'relationshipNames');\n relationshipNames.hasMany;\n //=> ['users', 'posts']\n relationshipNames.belongsTo;\n //=> ['owner']\n ```\n @property relationshipNames\n @static\n @type Object\n @readOnly\n */\n relationshipNames: Ember.computed(function () {\n var names = {\n hasMany: [],\n belongsTo: []\n };\n\n this.eachComputedProperty((name, meta) => {\n if (meta.isRelationship) {\n names[meta.kind].push(name);\n }\n });\n\n return names;\n }),\n\n /**\n An array of types directly related to a model. Each type will be\n included once, regardless of the number of relationships it has with\n the model.\n For example, given a model with this definition:\n ```app/models/blog.js\n import DS from 'ember-data';\n export default DS.Model.extend({\n users: DS.hasMany('user'),\n owner: DS.belongsTo('user'),\n posts: DS.hasMany('post')\n });\n ```\n This property would contain the following:\n ```javascript\n import Ember from 'ember';\n import Blog from 'app/models/blog';\n let relatedTypes = Ember.get(Blog, 'relatedTypes');\n //=> [ User, Post ]\n ```\n @property relatedTypes\n @static\n @type Ember.Array\n @readOnly\n */\n relatedTypes: relatedTypesDescriptor,\n\n /**\n A map whose keys are the relationships of a model and whose values are\n relationship descriptors.\n For example, given a model with this\n definition:\n ```app/models/blog.js\n import DS from 'ember-data';\n export default DS.Model.extend({\n users: DS.hasMany('user'),\n owner: DS.belongsTo('user'),\n posts: DS.hasMany('post')\n });\n ```\n This property would contain the following:\n ```javascript\n import Ember from 'ember';\n import Blog from 'app/models/blog';\n let relationshipsByName = Ember.get(Blog, 'relationshipsByName');\n relationshipsByName.get('users');\n //=> { key: 'users', kind: 'hasMany', type: 'user', options: Object, isRelationship: true }\n relationshipsByName.get('owner');\n //=> { key: 'owner', kind: 'belongsTo', type: 'user', options: Object, isRelationship: true }\n ```\n @property relationshipsByName\n @static\n @type Ember.Map\n @readOnly\n */\n relationshipsByName: relationshipsByNameDescriptor,\n\n /**\n A map whose keys are the fields of the model and whose values are strings\n describing the kind of the field. A model's fields are the union of all of its\n attributes and relationships.\n For example:\n ```app/models/blog.js\n import DS from 'ember-data';\n export default DS.Model.extend({\n users: DS.hasMany('user'),\n owner: DS.belongsTo('user'),\n posts: DS.hasMany('post'),\n title: DS.attr('string')\n });\n ```\n ```js\n import Ember from 'ember';\n import Blog from 'app/models/blog';\n let fields = Ember.get(Blog, 'fields');\n fields.forEach(function(kind, field) {\n console.log(field, kind);\n });\n // prints:\n // users, hasMany\n // owner, belongsTo\n // posts, hasMany\n // title, attribute\n ```\n @property fields\n @static\n @type Ember.Map\n @readOnly\n */\n fields: Ember.computed(function () {\n var map = Ember.Map.create();\n\n this.eachComputedProperty((name, meta) => {\n if (meta.isRelationship) {\n map.set(name, meta.kind);\n } else if (meta.isAttribute) {\n map.set(name, 'attribute');\n }\n });\n\n return map;\n }).readOnly(),\n\n /**\n Given a callback, iterates over each of the relationships in the model,\n invoking the callback with the name of each relationship and its relationship\n descriptor.\n @method eachRelationship\n @static\n @param {Function} callback the callback to invoke\n @param {any} binding the value to which the callback's `this` should be bound\n */\n eachRelationship(callback, binding) {\n Ember.get(this, 'relationshipsByName').forEach((relationship, name) => {\n callback.call(binding, name, relationship);\n });\n },\n\n /**\n Given a callback, iterates over each of the types related to a model,\n invoking the callback with the related type's class. Each type will be\n returned just once, regardless of how many different relationships it has\n with a model.\n @method eachRelatedType\n @static\n @param {Function} callback the callback to invoke\n @param {any} binding the value to which the callback's `this` should be bound\n */\n eachRelatedType(callback, binding) {\n var relationshipTypes = Ember.get(this, 'relatedTypes');\n\n for (var i = 0; i < relationshipTypes.length; i++) {\n var type = relationshipTypes[i];\n callback.call(binding, type);\n }\n },\n\n determineRelationshipType(knownSide, store) {\n var knownKey = knownSide.key;\n var knownKind = knownSide.kind;\n var inverse = this.inverseFor(knownKey, store);\n // let key;\n var otherKind = void 0;\n\n if (!inverse) {\n return knownKind === 'belongsTo' ? 'oneToNone' : 'manyToNone';\n }\n\n // key = inverse.name;\n otherKind = inverse.kind;\n\n if (otherKind === 'belongsTo') {\n return knownKind === 'belongsTo' ? 'oneToOne' : 'manyToOne';\n } else {\n return knownKind === 'belongsTo' ? 'oneToMany' : 'manyToMany';\n }\n },\n\n /**\n A map whose keys are the attributes of the model (properties\n described by DS.attr) and whose values are the meta object for the\n property.\n Example\n ```app/models/person.js\n import DS from 'ember-data';\n export default DS.Model.extend({\n firstName: DS.attr('string'),\n lastName: DS.attr('string'),\n birthday: DS.attr('date')\n });\n ```\n ```javascript\n import Ember from 'ember';\n import Person from 'app/models/person';\n let attributes = Ember.get(Person, 'attributes')\n attributes.forEach(function(meta, name) {\n console.log(name, meta);\n });\n // prints:\n // firstName {type: \"string\", isAttribute: true, options: Object, parentType: function, name: \"firstName\"}\n // lastName {type: \"string\", isAttribute: true, options: Object, parentType: function, name: \"lastName\"}\n // birthday {type: \"date\", isAttribute: true, options: Object, parentType: function, name: \"birthday\"}\n ```\n @property attributes\n @static\n @type {Ember.Map}\n @readOnly\n */\n attributes: Ember.computed(function () {\n var map = Ember.Map.create();\n\n this.eachComputedProperty((name, meta) => {\n if (meta.isAttribute) {\n (true && !(name !== 'id') && Ember.assert(\"You may not set `id` as an attribute on your model. Please remove any lines that look like: `id: DS.attr('<type>')` from \" + this.toString(), name !== 'id'));\n\n\n meta.name = name;\n map.set(name, meta);\n }\n });\n\n return map;\n }).readOnly(),\n\n /**\n A map whose keys are the attributes of the model (properties\n described by DS.attr) and whose values are type of transformation\n applied to each attribute. This map does not include any\n attributes that do not have an transformation type.\n Example\n ```app/models/person.js\n import DS from 'ember-data';\n export default DS.Model.extend({\n firstName: DS.attr(),\n lastName: DS.attr('string'),\n birthday: DS.attr('date')\n });\n ```\n ```javascript\n import Ember from 'ember';\n import Person from 'app/models/person';\n let transformedAttributes = Ember.get(Person, 'transformedAttributes')\n transformedAttributes.forEach(function(field, type) {\n console.log(field, type);\n });\n // prints:\n // lastName string\n // birthday date\n ```\n @property transformedAttributes\n @static\n @type {Ember.Map}\n @readOnly\n */\n transformedAttributes: Ember.computed(function () {\n var map = Ember.Map.create();\n\n this.eachAttribute((key, meta) => {\n if (meta.type) {\n map.set(key, meta.type);\n }\n });\n\n return map;\n }).readOnly(),\n\n /**\n Iterates through the attributes of the model, calling the passed function on each\n attribute.\n The callback method you provide should have the following signature (all\n parameters are optional):\n ```javascript\n function(name, meta);\n ```\n - `name` the name of the current property in the iteration\n - `meta` the meta object for the attribute property in the iteration\n Note that in addition to a callback, you can also pass an optional target\n object that will be set as `this` on the context.\n Example\n ```javascript\n import DS from 'ember-data';\n let Person = DS.Model.extend({\n firstName: DS.attr('string'),\n lastName: DS.attr('string'),\n birthday: DS.attr('date')\n });\n Person.eachAttribute(function(name, meta) {\n console.log(name, meta);\n });\n // prints:\n // firstName {type: \"string\", isAttribute: true, options: Object, parentType: function, name: \"firstName\"}\n // lastName {type: \"string\", isAttribute: true, options: Object, parentType: function, name: \"lastName\"}\n // birthday {type: \"date\", isAttribute: true, options: Object, parentType: function, name: \"birthday\"}\n ```\n @method eachAttribute\n @param {Function} callback The callback to execute\n @param {Object} [binding] the value to which the callback's `this` should be bound\n @static\n */\n eachAttribute(callback, binding) {\n Ember.get(this, 'attributes').forEach((meta, name) => {\n callback.call(binding, name, meta);\n });\n },\n\n /**\n Iterates through the transformedAttributes of the model, calling\n the passed function on each attribute. Note the callback will not be\n called for any attributes that do not have an transformation type.\n The callback method you provide should have the following signature (all\n parameters are optional):\n ```javascript\n function(name, type);\n ```\n - `name` the name of the current property in the iteration\n - `type` a string containing the name of the type of transformed\n applied to the attribute\n Note that in addition to a callback, you can also pass an optional target\n object that will be set as `this` on the context.\n Example\n ```javascript\n import DS from 'ember-data';\n let Person = DS.Model.extend({\n firstName: DS.attr(),\n lastName: DS.attr('string'),\n birthday: DS.attr('date')\n });\n Person.eachTransformedAttribute(function(name, type) {\n console.log(name, type);\n });\n // prints:\n // lastName string\n // birthday date\n ```\n @method eachTransformedAttribute\n @param {Function} callback The callback to execute\n @param {Object} [binding] the value to which the callback's `this` should be bound\n @static\n */\n eachTransformedAttribute(callback, binding) {\n Ember.get(this, 'transformedAttributes').forEach((type, name) => {\n callback.call(binding, name, type);\n });\n }\n});\n\nif (isEnabled('ds-rollback-attribute')) {\n Model.reopen({\n /**\n Discards any unsaved changes to the given attribute. This feature is not enabled by default. You must enable `ds-rollback-attribute` and be running a canary build.\n Example\n ```javascript\n record.get('name'); // 'Untitled Document'\n record.set('name', 'Doc 1');\n record.get('name'); // 'Doc 1'\n record.rollbackAttribute('name');\n record.get('name'); // 'Untitled Document'\n ```\n @method rollbackAttribute\n */\n rollbackAttribute(attributeName) {\n if (attributeName in this._internalModel._attributes) {\n this.set(attributeName, this._internalModel.lastAcknowledgedValue(attributeName));\n }\n }\n });\n}\n\n{\n Model.reopen({\n // This is a temporary solution until we refactor DS.Model to not\n // rely on the data property.\n willMergeMixin(props) {\n var constructor = this.constructor;\n (true && !(!intersection(Object.keys(props), RESERVED_MODEL_PROPS)[0]) && Ember.assert('`' + intersection(Object.keys(props), RESERVED_MODEL_PROPS)[0] + '` is a reserved property name on DS.Model objects. Please choose a different property name for ' + constructor.toString(), !intersection(Object.keys(props), RESERVED_MODEL_PROPS)[0]));\n (true && !(Object.keys(props).indexOf('id') === -1) && Ember.assert(\"You may not set `id` as an attribute on your model. Please remove any lines that look like: `id: DS.attr('<type>')` from \" + constructor.toString(), Object.keys(props).indexOf('id') === -1));\n },\n\n /**\n This Ember.js hook allows an object to be notified when a property\n is defined.\n In this case, we use it to be notified when an Ember Data user defines a\n belongs-to relationship. In that case, we need to set up observers for\n each one, allowing us to track relationship changes and automatically\n reflect changes in the inverse has-many array.\n This hook passes the class being set up, as well as the key and value\n being defined. So, for example, when the user does this:\n ```javascript\n DS.Model.extend({\n parent: DS.belongsTo('user')\n });\n ```\n This hook would be called with \"parent\" as the key and the computed\n property returned by `DS.belongsTo` as the value.\n @method didDefineProperty\n @param {Object} proto\n @param {String} key\n @param {Ember.ComputedProperty} value\n */\n didDefineProperty(proto, key, value) {\n // Check if the value being set is a computed property.\n if (value instanceof Ember.ComputedProperty) {\n\n // If it is, get the metadata for the relationship. This is\n // populated by the `DS.belongsTo` helper when it is creating\n // the computed property.\n var meta = value.meta();\n\n /*\n This is buggy because if the parent has never been looked up\n via `modelFor` it will not have `modelName` set.\n */\n meta.parentType = proto.constructor;\n }\n }\n });\n}\n\nvar SOURCE_POINTER_REGEXP = /^\\/?data\\/(attributes|relationships)\\/(.*)/;\nvar SOURCE_POINTER_PRIMARY_REGEXP = /^\\/?data/;\nvar PRIMARY_ATTRIBUTE_KEY = 'base';\n\n/**\n A `DS.AdapterError` is used by an adapter to signal that an error occurred\n during a request to an external API. It indicates a generic error, and\n subclasses are used to indicate specific error states. The following\n subclasses are provided:\n\n - `DS.InvalidError`\n - `DS.TimeoutError`\n - `DS.AbortError`\n - `DS.UnauthorizedError`\n - `DS.ForbiddenError`\n - `DS.NotFoundError`\n - `DS.ConflictError`\n - `DS.ServerError`\n\n To create a custom error to signal a specific error state in communicating\n with an external API, extend the `DS.AdapterError`. For example if the\n external API exclusively used HTTP `503 Service Unavailable` to indicate\n it was closed for maintenance:\n\n ```app/adapters/maintenance-error.js\n import DS from 'ember-data';\n\n export default DS.AdapterError.extend({ message: \"Down for maintenance.\" });\n ```\n\n This error would then be returned by an adapter's `handleResponse` method:\n\n ```app/adapters/application.js\n import DS from 'ember-data';\n import MaintenanceError from './maintenance-error';\n\n export default DS.JSONAPIAdapter.extend({\n handleResponse(status) {\n if (503 === status) {\n return new MaintenanceError();\n }\n\n return this._super(...arguments);\n }\n });\n ```\n\n And can then be detected in an application and used to send the user to an\n `under-maintenance` route:\n\n ```app/routes/application.js\n import Route from '@ember/routing/route';\n import MaintenanceError from '../adapters/maintenance-error';\n\n export default Route.extend({\n actions: {\n error(error, transition) {\n if (error instanceof MaintenanceError) {\n this.transitionTo('under-maintenance');\n return;\n }\n\n // ...other error handling logic\n }\n }\n });\n ```\n\n @class AdapterError\n @namespace DS\n*/\nfunction AdapterError(errors, message = 'Adapter operation failed') {\n this.isAdapterError = true;\n Ember.Error.call(this, message);\n\n this.errors = errors || [{\n title: 'Adapter Error',\n detail: message\n }];\n}\n\nfunction extendFn(ErrorClass) {\n return function ({ message: defaultMessage } = {}) {\n return extend(ErrorClass, defaultMessage);\n };\n}\n\nfunction extend(ParentErrorClass, defaultMessage) {\n var ErrorClass = function (errors, message) {\n (true && !(Array.isArray(errors || [])) && Ember.assert('`AdapterError` expects json-api formatted errors array.', Array.isArray(errors || [])));\n\n ParentErrorClass.call(this, errors, message || defaultMessage);\n };\n ErrorClass.prototype = Object.create(ParentErrorClass.prototype);\n ErrorClass.extend = extendFn(ErrorClass);\n\n return ErrorClass;\n}\n\nAdapterError.prototype = Object.create(Ember.Error.prototype);\n\nAdapterError.extend = extendFn(AdapterError);\n\n/**\n A `DS.InvalidError` is used by an adapter to signal the external API\n was unable to process a request because the content was not\n semantically correct or meaningful per the API. Usually this means a\n record failed some form of server side validation. When a promise\n from an adapter is rejected with a `DS.InvalidError` the record will\n transition to the `invalid` state and the errors will be set to the\n `errors` property on the record.\n\n For Ember Data to correctly map errors to their corresponding\n properties on the model, Ember Data expects each error to be\n a valid json-api error object with a `source/pointer` that matches\n the property name. For example if you had a Post model that\n looked like this.\n\n ```app/models/post.js\n import DS from 'ember-data';\n\n export default DS.Model.extend({\n title: DS.attr('string'),\n content: DS.attr('string')\n });\n ```\n\n To show an error from the server related to the `title` and\n `content` properties your adapter could return a promise that\n rejects with a `DS.InvalidError` object that looks like this:\n\n ```app/adapters/post.js\n import RSVP from 'RSVP';\n import DS from 'ember-data';\n\n export default DS.RESTAdapter.extend({\n updateRecord() {\n // Fictional adapter that always rejects\n return RSVP.reject(new DS.InvalidError([\n {\n detail: 'Must be unique',\n source: { pointer: '/data/attributes/title' }\n },\n {\n detail: 'Must not be blank',\n source: { pointer: '/data/attributes/content'}\n }\n ]));\n }\n });\n ```\n\n Your backend may use different property names for your records the\n store will attempt extract and normalize the errors using the\n serializer's `extractErrors` method before the errors get added to\n the the model. As a result, it is safe for the `InvalidError` to\n wrap the error payload unaltered.\n\n @class InvalidError\n @namespace DS\n*/\nvar InvalidError = extend(AdapterError, 'The adapter rejected the commit because it was invalid');\n\n/**\n A `DS.TimeoutError` is used by an adapter to signal that a request\n to the external API has timed out. I.e. no response was received from\n the external API within an allowed time period.\n\n An example use case would be to warn the user to check their internet\n connection if an adapter operation has timed out:\n\n ```app/routes/application.js\n import Route from '@ember/routing/route';\n import DS from 'ember-data';\n\n const { TimeoutError } = DS;\n\n export default Route.extend({\n actions: {\n error(error, transition) {\n if (error instanceof TimeoutError) {\n // alert the user\n alert('Are you still connected to the internet?');\n return;\n }\n\n // ...other error handling logic\n }\n }\n });\n ```\n\n @class TimeoutError\n @namespace DS\n*/\nvar TimeoutError = extend(AdapterError, 'The adapter operation timed out');\n\n/**\n A `DS.AbortError` is used by an adapter to signal that a request to\n the external API was aborted. For example, this can occur if the user\n navigates away from the current page after a request to the external API\n has been initiated but before a response has been received.\n\n @class AbortError\n @namespace DS\n*/\nvar AbortError = extend(AdapterError, 'The adapter operation was aborted');\n\n/**\n A `DS.UnauthorizedError` equates to a HTTP `401 Unauthorized` response\n status. It is used by an adapter to signal that a request to the external\n API was rejected because authorization is required and has failed or has not\n yet been provided.\n\n An example use case would be to redirect the user to a log in route if a\n request is unauthorized:\n\n ```app/routes/application.js\n import Route from '@ember/routing/route';\n import DS from 'ember-data';\n\n const { UnauthorizedError } = DS;\n\n export default Route.extend({\n actions: {\n error(error, transition) {\n if (error instanceof UnauthorizedError) {\n // go to the sign in route\n this.transitionTo('login');\n return;\n }\n\n // ...other error handling logic\n }\n }\n });\n ```\n\n @class UnauthorizedError\n @namespace DS\n*/\nvar UnauthorizedError = extend(AdapterError, 'The adapter operation is unauthorized');\n\n/**\n A `DS.ForbiddenError` equates to a HTTP `403 Forbidden` response status.\n It is used by an adapter to signal that a request to the external API was\n valid but the server is refusing to respond to it. If authorization was\n provided and is valid, then the authenticated user does not have the\n necessary permissions for the request.\n\n @class ForbiddenError\n @namespace DS\n*/\nvar ForbiddenError = extend(AdapterError, 'The adapter operation is forbidden');\n\n/**\n A `DS.NotFoundError` equates to a HTTP `404 Not Found` response status.\n It is used by an adapter to signal that a request to the external API\n was rejected because the resource could not be found on the API.\n\n An example use case would be to detect if the user has entered a route\n for a specific model that does not exist. For example:\n\n ```app/routes/post.js\n import Route from '@ember/routing/route';\n import DS from 'ember-data';\n\n const { NotFoundError } = DS;\n\n export default Route.extend({\n model(params) {\n return this.get('store').findRecord('post', params.post_id);\n },\n\n actions: {\n error(error, transition) {\n if (error instanceof NotFoundError) {\n // redirect to a list of all posts instead\n this.transitionTo('posts');\n } else {\n // otherwise let the error bubble\n return true;\n }\n }\n }\n });\n ```\n\n @class NotFoundError\n @namespace DS\n*/\nvar NotFoundError = extend(AdapterError, 'The adapter could not find the resource');\n\n/**\n A `DS.ConflictError` equates to a HTTP `409 Conflict` response status.\n It is used by an adapter to indicate that the request could not be processed\n because of a conflict in the request. An example scenario would be when\n creating a record with a client generated id but that id is already known\n to the external API.\n\n @class ConflictError\n @namespace DS\n*/\nvar ConflictError = extend(AdapterError, 'The adapter operation failed due to a conflict');\n\n/**\n A `DS.ServerError` equates to a HTTP `500 Internal Server Error` response\n status. It is used by the adapter to indicate that a request has failed\n because of an error in the external API.\n\n @class ServerError\n @namespace DS\n*/\nvar ServerError = extend(AdapterError, 'The adapter operation failed due to a server error');\n\n/**\n Convert an hash of errors into an array with errors in JSON-API format.\n\n ```javascript\n import DS from 'ember-data';\n\n const { errorsHashToArray } = DS;\n\n let errors = {\n base: 'Invalid attributes on saving this record',\n name: 'Must be present',\n age: ['Must be present', 'Must be a number']\n };\n\n let errorsArray = errorsHashToArray(errors);\n // [\n // {\n // title: \"Invalid Document\",\n // detail: \"Invalid attributes on saving this record\",\n // source: { pointer: \"/data\" }\n // },\n // {\n // title: \"Invalid Attribute\",\n // detail: \"Must be present\",\n // source: { pointer: \"/data/attributes/name\" }\n // },\n // {\n // title: \"Invalid Attribute\",\n // detail: \"Must be present\",\n // source: { pointer: \"/data/attributes/age\" }\n // },\n // {\n // title: \"Invalid Attribute\",\n // detail: \"Must be a number\",\n // source: { pointer: \"/data/attributes/age\" }\n // }\n // ]\n ```\n\n @method errorsHashToArray\n @public\n @namespace\n @for DS\n @param {Object} errors hash with errors as properties\n @return {Array} array of errors in JSON-API format\n*/\nfunction errorsHashToArray(errors) {\n var out = [];\n\n if (Ember.isPresent(errors)) {\n Object.keys(errors).forEach(key => {\n var messages = Ember.makeArray(errors[key]);\n for (var i = 0; i < messages.length; i++) {\n var title = 'Invalid Attribute';\n var pointer = `/data/attributes/${key}`;\n if (key === PRIMARY_ATTRIBUTE_KEY) {\n title = 'Invalid Document';\n pointer = `/data`;\n }\n out.push({\n title: title,\n detail: messages[i],\n source: {\n pointer: pointer\n }\n });\n }\n });\n }\n\n return out;\n}\n\n/**\n Convert an array of errors in JSON-API format into an object.\n\n ```javascript\n import DS from 'ember-data';\n\n const { errorsArrayToHash } = DS;\n\n let errorsArray = [\n {\n title: 'Invalid Attribute',\n detail: 'Must be present',\n source: { pointer: '/data/attributes/name' }\n },\n {\n title: 'Invalid Attribute',\n detail: 'Must be present',\n source: { pointer: '/data/attributes/age' }\n },\n {\n title: 'Invalid Attribute',\n detail: 'Must be a number',\n source: { pointer: '/data/attributes/age' }\n }\n ];\n\n let errors = errorsArrayToHash(errorsArray);\n // {\n // \"name\": [\"Must be present\"],\n // \"age\": [\"Must be present\", \"must be a number\"]\n // }\n ```\n\n @method errorsArrayToHash\n @public\n @namespace\n @for DS\n @param {Array} errors array of errors in JSON-API format\n @return {Object}\n*/\nfunction errorsArrayToHash(errors) {\n var out = {};\n\n if (Ember.isPresent(errors)) {\n errors.forEach(error => {\n if (error.source && error.source.pointer) {\n var key = error.source.pointer.match(SOURCE_POINTER_REGEXP);\n\n if (key) {\n key = key[2];\n } else if (error.source.pointer.search(SOURCE_POINTER_PRIMARY_REGEXP) !== -1) {\n key = PRIMARY_ATTRIBUTE_KEY;\n }\n\n if (key) {\n out[key] = out[key] || [];\n out[key].push(error.detail || error.title);\n }\n }\n });\n }\n\n return out;\n}\n\nvar EmberOrderedSet = Ember.OrderedSet;\n\nfunction OrderedSet() {\n this._super$constructor();\n}\n\nOrderedSet.create = function () {\n var Constructor = this;\n return new Constructor();\n};\n\nOrderedSet.prototype = Object.create(EmberOrderedSet.prototype);\nOrderedSet.prototype.constructor = OrderedSet;\nOrderedSet.prototype._super$constructor = EmberOrderedSet;\n\nOrderedSet.prototype.addWithIndex = function (obj, idx) {\n var guid = Ember.guidFor(obj);\n var presenceSet = this.presenceSet;\n var list = this.list;\n\n if (presenceSet[guid] === true) {\n return;\n }\n\n presenceSet[guid] = true;\n\n if (idx === undefined || idx === null) {\n list.push(obj);\n } else {\n list.splice(idx, 0, obj);\n }\n\n this.size += 1;\n\n return this;\n};\n\n/*\n This method normalizes a link to an \"links object\". If the passed link is\n already an object it's returned without any modifications.\n\n See http://jsonapi.org/format/#document-links for more information.\n\n @method _normalizeLink\n @private\n @param {String} link\n @return {Object|null}\n @for DS\n*/\nfunction _normalizeLink(link) {\n switch (typeof link) {\n case 'object':\n return link;\n case 'string':\n return { href: link };\n }\n return null;\n}\n\nclass Relationship {\n constructor(store, internalModel, inverseKey, relationshipMeta) {\n var async = relationshipMeta.options.async;\n var polymorphic = relationshipMeta.options.polymorphic;\n this.members = new OrderedSet();\n this.canonicalMembers = new OrderedSet();\n this.store = store;\n this.key = relationshipMeta.key;\n this.inverseKey = inverseKey;\n this.internalModel = internalModel;\n this.isAsync = typeof async === 'undefined' ? true : async;\n this.isPolymorphic = typeof polymorphic === 'undefined' ? true : polymorphic;\n this.relationshipMeta = relationshipMeta;\n //This probably breaks for polymorphic relationship in complex scenarios, due to\n //multiple possible modelNames\n this.inverseKeyForImplicit = this.internalModel.modelName + this.key;\n this.linkPromise = null;\n this.meta = null;\n this.hasData = false;\n this.hasLoaded = false;\n this.__inverseMeta = undefined;\n }\n\n _inverseIsAsync() {\n var inverseMeta = this._inverseMeta;\n if (!inverseMeta) {\n return false;\n }\n\n var inverseAsync = inverseMeta.options.async;\n return typeof inverseAsync === 'undefined' ? true : inverseAsync;\n }\n\n _inverseIsSync() {\n var inverseMeta = this._inverseMeta;\n if (!inverseMeta) {\n return false;\n }\n\n var inverseAsync = inverseMeta.options.async;\n return typeof inverseAsync === 'undefined' ? false : !inverseAsync;\n }\n\n get _inverseMeta() {\n if (this.__inverseMeta === undefined) {\n var inverseMeta = null;\n\n if (this.inverseKey) {\n var inverseModelClass = this.store.modelFor(this.relationshipMeta.type);\n var inverseRelationships = Ember.get(inverseModelClass, 'relationshipsByName');\n inverseMeta = inverseRelationships.get(this.inverseKey);\n }\n\n this.__inverseMeta = inverseMeta;\n }\n\n return this.__inverseMeta;\n }\n\n get parentType() {\n return this.internalModel.modelName;\n }\n\n internalModelDidDematerialize() {\n if (!this.inverseKey) {\n return;\n }\n\n this.forAllMembers(inverseInternalModel => {\n var relationship = inverseInternalModel._relationships.get(this.inverseKey);\n relationship.inverseDidDematerialize(this.internalModel);\n });\n }\n\n inverseDidDematerialize(inverseInternalModel) {\n if (!this.isAsync) {\n // unloading inverse of a sync relationship is treated as a client-side\n // delete, so actually remove the models don't merely invalidate the cp\n // cache.\n this.removeInternalModelFromOwn(inverseInternalModel);\n this.removeCanonicalInternalModelFromOwn(inverseInternalModel);\n }\n }\n\n updateMeta(meta) {\n this.meta = meta;\n }\n\n clear() {\n\n var members = this.members.list;\n while (members.length > 0) {\n var member = members[0];\n this.removeInternalModel(member);\n }\n\n var canonicalMembers = this.canonicalMembers.list;\n while (canonicalMembers.length > 0) {\n var _member = canonicalMembers[0];\n this.removeCanonicalInternalModel(_member);\n }\n }\n\n removeAllInternalModelsFromOwn() {\n this.members.clear();\n this.internalModel.updateRecordArrays();\n }\n\n removeAllCanonicalInternalModelsFromOwn() {\n this.canonicalMembers.clear();\n this.flushCanonicalLater();\n }\n\n removeInternalModels(internalModels) {\n internalModels.forEach(internalModel => this.removeInternalModel(internalModel));\n }\n\n addInternalModels(internalModels, idx) {\n internalModels.forEach(internalModel => {\n this.addInternalModel(internalModel, idx);\n if (idx !== undefined) {\n idx++;\n }\n });\n }\n\n addCanonicalInternalModels(internalModels, idx) {\n for (var i = 0; i < internalModels.length; i++) {\n if (idx !== undefined) {\n this.addCanonicalInternalModel(internalModels[i], i + idx);\n } else {\n this.addCanonicalInternalModel(internalModels[i]);\n }\n }\n }\n\n addCanonicalInternalModel(internalModel, idx) {\n if (!this.canonicalMembers.has(internalModel)) {\n this.canonicalMembers.add(internalModel);\n this.setupInverseRelationship(internalModel);\n }\n this.flushCanonicalLater();\n this.setHasData(true);\n }\n\n setupInverseRelationship(internalModel) {\n if (this.inverseKey) {\n var relationships = internalModel._relationships;\n var relationshipExisted = relationships.has(this.inverseKey);\n var relationship = relationships.get(this.inverseKey);\n if (relationshipExisted || this.isPolymorphic) {\n // if we have only just initialized the inverse relationship, then it\n // already has this.internalModel in its canonicalMembers, so skip the\n // unnecessary work. The exception to this is polymorphic\n // relationships whose members are determined by their inverse, as those\n // relationships cannot efficiently find their inverse payloads.\n relationship.addCanonicalInternalModel(this.internalModel);\n }\n } else {\n var _relationships = internalModel._implicitRelationships;\n var _relationship = _relationships[this.inverseKeyForImplicit];\n if (!_relationship) {\n _relationship = _relationships[this.inverseKeyForImplicit] = new Relationship(this.store, internalModel, this.key, { options: { async: this.isAsync }, type: this.parentType });\n }\n _relationship.addCanonicalInternalModel(this.internalModel);\n }\n }\n\n removeCanonicalInternalModels(internalModels, idx) {\n for (var i = 0; i < internalModels.length; i++) {\n if (idx !== undefined) {\n this.removeCanonicalInternalModel(internalModels[i], i + idx);\n } else {\n this.removeCanonicalInternalModel(internalModels[i]);\n }\n }\n }\n\n removeCanonicalInternalModel(internalModel, idx) {\n if (this.canonicalMembers.has(internalModel)) {\n this.removeCanonicalInternalModelFromOwn(internalModel);\n if (this.inverseKey) {\n this.removeCanonicalInternalModelFromInverse(internalModel);\n } else {\n if (internalModel._implicitRelationships[this.inverseKeyForImplicit]) {\n internalModel._implicitRelationships[this.inverseKeyForImplicit].removeCanonicalInternalModel(this.internalModel);\n }\n }\n }\n this.flushCanonicalLater();\n }\n\n addInternalModel(internalModel, idx) {\n if (!this.members.has(internalModel)) {\n this.members.addWithIndex(internalModel, idx);\n this.notifyRecordRelationshipAdded(internalModel, idx);\n if (this.inverseKey) {\n internalModel._relationships.get(this.inverseKey).addInternalModel(this.internalModel);\n } else {\n if (!internalModel._implicitRelationships[this.inverseKeyForImplicit]) {\n internalModel._implicitRelationships[this.inverseKeyForImplicit] = new Relationship(this.store, internalModel, this.key, { options: { async: this.isAsync }, type: this.parentType });\n }\n internalModel._implicitRelationships[this.inverseKeyForImplicit].addInternalModel(this.internalModel);\n }\n this.internalModel.updateRecordArrays();\n }\n this.setHasData(true);\n }\n\n removeInternalModel(internalModel) {\n if (this.members.has(internalModel)) {\n this.removeInternalModelFromOwn(internalModel);\n if (this.inverseKey) {\n this.removeInternalModelFromInverse(internalModel);\n } else {\n if (internalModel._implicitRelationships[this.inverseKeyForImplicit]) {\n internalModel._implicitRelationships[this.inverseKeyForImplicit].removeInternalModel(this.internalModel);\n }\n }\n }\n }\n\n removeInternalModelFromInverse(internalModel) {\n var inverseRelationship = internalModel._relationships.get(this.inverseKey);\n //Need to check for existence, as the record might unloading at the moment\n if (inverseRelationship) {\n inverseRelationship.removeInternalModelFromOwn(this.internalModel);\n }\n }\n\n removeInternalModelFromOwn(internalModel) {\n this.members.delete(internalModel);\n this.internalModel.updateRecordArrays();\n }\n\n removeCanonicalInternalModelFromInverse(internalModel) {\n var inverseRelationship = internalModel._relationships.get(this.inverseKey);\n //Need to check for existence, as the record might unloading at the moment\n if (inverseRelationship) {\n inverseRelationship.removeCanonicalInternalModelFromOwn(this.internalModel);\n }\n }\n\n removeCanonicalInternalModelFromOwn(internalModel) {\n this.canonicalMembers.delete(internalModel);\n this.flushCanonicalLater();\n }\n\n /*\n Call this method once a record deletion has been persisted\n to purge it from BOTH current and canonical state of all\n relationships.\n @method removeCompletelyFromInverse\n @private\n */\n removeCompletelyFromInverse() {\n if (!this.inverseKey) {\n return;\n }\n\n // we actually want a union of members and canonicalMembers\n // they should be disjoint but currently are not due to a bug\n var seen = Object.create(null);\n var internalModel = this.internalModel;\n\n var unload = inverseInternalModel => {\n var id = Ember.guidFor(inverseInternalModel);\n\n if (seen[id] === undefined) {\n var relationship = inverseInternalModel._relationships.get(this.inverseKey);\n relationship.removeCompletelyFromOwn(internalModel);\n seen[id] = true;\n }\n };\n\n this.members.forEach(unload);\n this.canonicalMembers.forEach(unload);\n\n if (!this.isAsync) {\n this.clear();\n }\n }\n\n forAllMembers(callback) {\n var seen = Object.create(null);\n\n for (var i = 0; i < this.members.list.length; i++) {\n var inverseInternalModel = this.members.list[i];\n var id = Ember.guidFor(inverseInternalModel);\n if (!seen[id]) {\n seen[id] = true;\n callback(inverseInternalModel);\n }\n }\n\n for (var _i = 0; _i < this.canonicalMembers.list.length; _i++) {\n var _inverseInternalModel = this.canonicalMembers.list[_i];\n var _id = Ember.guidFor(_inverseInternalModel);\n if (!seen[_id]) {\n seen[_id] = true;\n callback(_inverseInternalModel);\n }\n }\n }\n\n /*\n Removes the given internalModel from BOTH canonical AND current state.\n This method is useful when either a deletion or a rollback on a new record\n needs to entirely purge itself from an inverse relationship.\n */\n removeCompletelyFromOwn(internalModel) {\n this.canonicalMembers.delete(internalModel);\n this.members.delete(internalModel);\n this.internalModel.updateRecordArrays();\n }\n\n flushCanonical() {\n var list = this.members.list;\n this.willSync = false;\n //a hack for not removing new internalModels\n //TODO remove once we have proper diffing\n var newInternalModels = [];\n for (var i = 0; i < list.length; i++) {\n if (list[i].isNew()) {\n newInternalModels.push(list[i]);\n }\n }\n\n //TODO(Igor) make this less abysmally slow\n this.members = this.canonicalMembers.copy();\n for (var _i2 = 0; _i2 < newInternalModels.length; _i2++) {\n this.members.add(newInternalModels[_i2]);\n }\n }\n\n flushCanonicalLater() {\n if (this.willSync) {\n return;\n }\n this.willSync = true;\n this.store._updateRelationshipState(this);\n }\n\n updateLink(link, initial) {\n (true && Ember.warn(`You pushed a record of type '${this.internalModel.modelName}' with a relationship '${this.key}' configured as 'async: false'. You've included a link but no primary data, this may be an error in your payload.`, this.isAsync || this.hasData, {\n id: 'ds.store.push-link-for-sync-relationship'\n }));\n (true && !(typeof link === 'string' || link === null) && Ember.assert(`You have pushed a record of type '${this.internalModel.modelName}' with '${this.key}' as a link, but the value of that link is not a string.`, typeof link === 'string' || link === null));\n\n\n this.link = link;\n this.linkPromise = null;\n\n if (!initial) {\n this.internalModel.notifyPropertyChange(this.key);\n }\n }\n\n findLink() {\n if (this.linkPromise) {\n return this.linkPromise;\n } else {\n var promise = this.fetchLink();\n this.linkPromise = promise;\n return promise.then(result => result);\n }\n }\n\n updateInternalModelsFromAdapter(internalModels) {\n this.setHasData(true);\n //TODO(Igor) move this to a proper place\n //TODO Once we have adapter support, we need to handle updated and canonical changes\n this.computeChanges(internalModels);\n }\n\n notifyRecordRelationshipAdded() {}\n\n /*\n `hasData` for a relationship is a flag to indicate if we consider the\n content of this relationship \"known\". Snapshots uses this to tell the\n difference between unknown (`undefined`) or empty (`null`). The reason for\n this is that we wouldn't want to serialize unknown relationships as `null`\n as that might overwrite remote state.\n All relationships for a newly created (`store.createRecord()`) are\n considered known (`hasData === true`).\n */\n setHasData(value) {\n this.hasData = value;\n }\n\n /*\n `hasLoaded` is a flag to indicate if we have gotten data from the adapter or\n not when the relationship has a link.\n This is used to be able to tell when to fetch the link and when to return\n the local data in scenarios where the local state is considered known\n (`hasData === true`).\n Updating the link will automatically set `hasLoaded` to `false`.\n */\n setHasLoaded(value) {\n this.hasLoaded = value;\n }\n\n /*\n `push` for a relationship allows the store to push a JSON API Relationship\n Object onto the relationship. The relationship will then extract and set the\n meta, data and links of that relationship.\n `push` use `updateMeta`, `updateData` and `updateLink` to update the state\n of the relationship.\n */\n push(payload, initial) {\n\n var hasData = false;\n var hasLink = false;\n\n if (payload.meta) {\n this.updateMeta(payload.meta);\n }\n\n if (payload.data !== undefined) {\n hasData = true;\n this.updateData(payload.data, initial);\n }\n\n if (payload.links && payload.links.related) {\n var relatedLink = _normalizeLink(payload.links.related);\n if (relatedLink && relatedLink.href && relatedLink.href !== this.link) {\n hasLink = true;\n this.updateLink(relatedLink.href, initial);\n }\n }\n\n /*\n Data being pushed into the relationship might contain only data or links,\n or a combination of both.\n If we got data we want to set both hasData and hasLoaded to true since\n this would indicate that we should prefer the local state instead of\n trying to fetch the link or call findRecord().\n If we have no data but a link is present we want to set hasLoaded to false\n without modifying the hasData flag. This will ensure we fetch the updated\n link next time the relationship is accessed.\n */\n if (hasData) {\n this.setHasData(true);\n this.setHasLoaded(true);\n } else if (hasLink) {\n this.setHasLoaded(false);\n }\n }\n\n updateData() {}\n\n destroy() {}\n}\n\nfunction _bind(fn, ...args) {\n\n return function () {\n return fn.apply(undefined, args);\n };\n}\n\nfunction _guard(promise, test) {\n var guarded = promise['finally'](function () {\n if (!test()) {\n guarded._subscribers.length = 0;\n }\n });\n\n return guarded;\n}\n\nfunction _objectIsAlive(object) {\n return !(Ember.get(object, \"isDestroyed\") || Ember.get(object, \"isDestroying\"));\n}\n\n/**\n @namespace\n @method diffArray\n @private\n @param {Array} oldArray the old array\n @param {Array} newArray the new array\n @return {hash} {\n firstChangeIndex: <integer>, // null if no change\n addedCount: <integer>, // 0 if no change\n removedCount: <integer> // 0 if no change\n }\n*/\nfunction diffArray(oldArray, newArray) {\n var oldLength = oldArray.length;\n var newLength = newArray.length;\n\n var shortestLength = Math.min(oldLength, newLength);\n var firstChangeIndex = null; // null signifies no changes\n\n // find the first change\n for (var i = 0; i < shortestLength; i++) {\n // compare each item in the array\n if (oldArray[i] !== newArray[i]) {\n firstChangeIndex = i;\n break;\n }\n }\n\n if (firstChangeIndex === null && newLength !== oldLength) {\n // no change found in the overlapping block\n // and array lengths differ,\n // so change starts at end of overlap\n firstChangeIndex = shortestLength;\n }\n\n var addedCount = 0;\n var removedCount = 0;\n if (firstChangeIndex !== null) {\n // we found a change, find the end of the change\n var unchangedEndBlockLength = shortestLength - firstChangeIndex;\n // walk back from the end of both arrays until we find a change\n for (var _i = 1; _i <= shortestLength; _i++) {\n // compare each item in the array\n if (oldArray[oldLength - _i] !== newArray[newLength - _i]) {\n unchangedEndBlockLength = _i - 1;\n break;\n }\n }\n addedCount = newLength - unchangedEndBlockLength - firstChangeIndex;\n removedCount = oldLength - unchangedEndBlockLength - firstChangeIndex;\n }\n\n return {\n firstChangeIndex,\n addedCount,\n removedCount\n };\n}\n\n/**\n A `ManyArray` is a `MutableArray` that represents the contents of a has-many\n relationship.\n\n The `ManyArray` is instantiated lazily the first time the relationship is\n requested.\n\n ### Inverses\n\n Often, the relationships in Ember Data applications will have\n an inverse. For example, imagine the following models are\n defined:\n\n ```app/models/post.js\n import DS from 'ember-data';\n\n export default DS.Model.extend({\n comments: DS.hasMany('comment')\n });\n ```\n\n ```app/models/comment.js\n import DS from 'ember-data';\n\n export default DS.Model.extend({\n post: DS.belongsTo('post')\n });\n ```\n\n If you created a new instance of `App.Post` and added\n a `App.Comment` record to its `comments` has-many\n relationship, you would expect the comment's `post`\n property to be set to the post that contained\n the has-many.\n\n We call the record to which a relationship belongs the\n relationship's _owner_.\n\n @class ManyArray\n @namespace DS\n @extends Ember.Object\n @uses Ember.MutableArray, Ember.Evented\n*/\nvar ManyArray = Ember.Object.extend(Ember.MutableArray, Ember.Evented, {\n init() {\n this._super(...arguments);\n\n /**\n The loading state of this array\n @property {Boolean} isLoaded\n */\n this.isLoaded = false;\n this.length = 0;\n\n /**\n Used for async `hasMany` arrays\n to keep track of when they will resolve.\n @property {Ember.RSVP.Promise} promise\n @private\n */\n this.promise = null;\n\n /**\n Metadata associated with the request for async hasMany relationships.\n Example\n Given that the server returns the following JSON payload when fetching a\n hasMany relationship:\n ```js\n {\n \"comments\": [{\n \"id\": 1,\n \"comment\": \"This is the first comment\",\n }, {\n // ...\n }],\n \"meta\": {\n \"page\": 1,\n \"total\": 5\n }\n }\n ```\n You can then access the metadata via the `meta` property:\n ```js\n post.get('comments').then(function(comments) {\n var meta = comments.get('meta');\n // meta.page => 1\n // meta.total => 5\n });\n ```\n @property {Object} meta\n @public\n */\n this.meta = this.meta || null;\n\n /**\n `true` if the relationship is polymorphic, `false` otherwise.\n @property {Boolean} isPolymorphic\n @private\n */\n this.isPolymorphic = this.isPolymorphic || false;\n\n /**\n The relationship which manages this array.\n @property {ManyRelationship} relationship\n @private\n */\n this.relationship = this.relationship || null;\n\n this.currentState = [];\n this.flushCanonical(false);\n },\n\n objectAt(index) {\n var internalModel = this.currentState[index];\n if (internalModel === undefined) {\n return;\n }\n\n return internalModel.getRecord();\n },\n\n flushCanonical(isInitialized = true) {\n // It’s possible the parent side of the relationship may have been unloaded by this point\n if (!_objectIsAlive(this)) {\n return;\n }\n var toSet = this.canonicalState;\n\n //a hack for not removing new records\n //TODO remove once we have proper diffing\n var newInternalModels = this.currentState.filter(\n // only add new internalModels which are not yet in the canonical state of this\n // relationship (a new internalModel can be in the canonical state if it has\n // been 'acknowleged' to be in the relationship via a store.push)\n internalModel => internalModel.isNew() && toSet.indexOf(internalModel) === -1);\n toSet = toSet.concat(newInternalModels);\n\n // diff to find changes\n var diff = diffArray(this.currentState, toSet);\n\n if (diff.firstChangeIndex !== null) {\n // it's null if no change found\n // we found a change\n this.arrayContentWillChange(diff.firstChangeIndex, diff.removedCount, diff.addedCount);\n this.set('length', toSet.length);\n this.currentState = toSet;\n this.arrayContentDidChange(diff.firstChangeIndex, diff.removedCount, diff.addedCount);\n if (isInitialized && diff.addedCount > 0) {\n //notify only on additions\n //TODO only notify if unloaded\n this.relationship.notifyHasManyChanged();\n }\n }\n },\n\n internalReplace(idx, amt, objects) {\n if (!objects) {\n objects = [];\n }\n this.arrayContentWillChange(idx, amt, objects.length);\n this.currentState.splice.apply(this.currentState, [idx, amt].concat(objects));\n this.set('length', this.currentState.length);\n this.arrayContentDidChange(idx, amt, objects.length);\n },\n\n //TODO(Igor) optimize\n _removeInternalModels(internalModels) {\n for (var i = 0; i < internalModels.length; i++) {\n var index = this.currentState.indexOf(internalModels[i]);\n this.internalReplace(index, 1);\n }\n },\n\n //TODO(Igor) optimize\n _addInternalModels(internalModels, idx) {\n if (idx === undefined) {\n idx = this.currentState.length;\n }\n this.internalReplace(idx, 0, internalModels);\n },\n\n replace(idx, amt, objects) {\n var internalModels = void 0;\n if (amt > 0) {\n internalModels = this.currentState.slice(idx, idx + amt);\n this.get('relationship').removeInternalModels(internalModels);\n }\n if (objects) {\n this.get('relationship').addInternalModels(objects.map(obj => obj._internalModel), idx);\n }\n },\n\n /**\n Reloads all of the records in the manyArray. If the manyArray\n holds a relationship that was originally fetched using a links url\n Ember Data will revisit the original links url to repopulate the\n relationship.\n If the manyArray holds the result of a `store.query()` reload will\n re-run the original query.\n Example\n ```javascript\n var user = store.peekRecord('user', 1)\n user.login().then(function() {\n user.get('permissions').then(function(permissions) {\n return permissions.reload();\n });\n });\n ```\n @method reload\n @public\n */\n reload() {\n return this.relationship.reload();\n },\n\n /**\n Saves all of the records in the `ManyArray`.\n Example\n ```javascript\n store.findRecord('inbox', 1).then(function(inbox) {\n inbox.get('messages').then(function(messages) {\n messages.forEach(function(message) {\n message.set('isRead', true);\n });\n messages.save()\n });\n });\n ```\n @method save\n @return {DS.PromiseArray} promise\n */\n save() {\n var manyArray = this;\n var promiseLabel = 'DS: ManyArray#save ' + Ember.get(this, 'type');\n var promise = Ember.RSVP.all(this.invoke(\"save\"), promiseLabel).then(() => manyArray, null, 'DS: ManyArray#save return ManyArray');\n\n return PromiseArray.create({ promise });\n },\n\n /**\n Create a child record within the owner\n @method createRecord\n @private\n @param {Object} hash\n @return {DS.Model} record\n */\n createRecord(hash) {\n var store = Ember.get(this, 'store');\n var type = Ember.get(this, 'type');\n\n (true && !(!Ember.get(this, 'isPolymorphic')) && Ember.assert(`You cannot add '${type.modelName}' records to this polymorphic relationship.`, !Ember.get(this, 'isPolymorphic')));\n\n var record = store.createRecord(type.modelName, hash);\n this.pushObject(record);\n\n return record;\n }\n});\n\nclass ManyRelationship extends Relationship {\n constructor(store, internalModel, inverseKey, relationshipMeta) {\n super(store, internalModel, inverseKey, relationshipMeta);\n this.belongsToType = relationshipMeta.type;\n this.canonicalState = [];\n this.isPolymorphic = relationshipMeta.options.polymorphic;\n // The ManyArray for this relationship\n this._manyArray = null;\n // The previous ManyArray for this relationship. It will be destroyed when\n // we create a new many array, but in the interim it will be updated if\n // inverse internal models are unloaded.\n this._retainedManyArray = null;\n this.__loadingPromise = null;\n }\n\n get _loadingPromise() {\n return this.__loadingPromise;\n }\n _updateLoadingPromise(promise, content) {\n if (this.__loadingPromise) {\n if (content) {\n this.__loadingPromise.set('content', content);\n }\n this.__loadingPromise.set('promise', promise);\n } else {\n this.__loadingPromise = PromiseManyArray.create({\n promise,\n content\n });\n }\n\n return this.__loadingPromise;\n }\n\n get manyArray() {\n (true && !(this._manyArray === null || this._retainedManyArray === null) && Ember.assert(`Error: relationship ${this.parentType}:${this.key} has both many array and retained many array`, this._manyArray === null || this._retainedManyArray === null));\n\n\n if (!this._manyArray) {\n this._manyArray = ManyArray.create({\n canonicalState: this.canonicalState,\n store: this.store,\n relationship: this,\n type: this.store.modelFor(this.belongsToType),\n record: this.internalModel,\n meta: this.meta,\n isPolymorphic: this.isPolymorphic\n });\n\n if (this._retainedManyArray !== null) {\n this._retainedManyArray.destroy();\n this._retainedManyArray = null;\n }\n }\n\n return this._manyArray;\n }\n\n removeInverseRelationships() {\n super.removeInverseRelationships();\n if (this._manyArray) {\n this._manyArray.destroy();\n this._manyArray = null;\n }\n\n if (this._loadingPromise) {\n this._loadingPromise.destroy();\n }\n }\n\n updateMeta(meta) {\n super.updateMeta(meta);\n if (this._manyArray) {\n this._manyArray.set('meta', meta);\n }\n }\n\n addCanonicalInternalModel(internalModel, idx) {\n if (this.canonicalMembers.has(internalModel)) {\n return;\n }\n if (idx !== undefined) {\n this.canonicalState.splice(idx, 0, internalModel);\n } else {\n this.canonicalState.push(internalModel);\n }\n super.addCanonicalInternalModel(internalModel, idx);\n }\n\n inverseDidDematerialize(inverseInternalModel) {\n super.inverseDidDematerialize(inverseInternalModel);\n if (this.isAsync) {\n if (this._manyArray) {\n this._retainedManyArray = this._manyArray;\n this._manyArray = null;\n }\n this._removeInternalModelFromManyArray(this._retainedManyArray, inverseInternalModel);\n }\n this.notifyHasManyChanged();\n }\n\n addInternalModel(internalModel, idx) {\n if (this.members.has(internalModel)) {\n return;\n }\n\n emberData_Debug.assertPolymorphicType(this.internalModel, this.relationshipMeta, internalModel);\n super.addInternalModel(internalModel, idx);\n // make lazy later\n this.manyArray._addInternalModels([internalModel], idx);\n }\n\n removeCanonicalInternalModelFromOwn(internalModel, idx) {\n var i = idx;\n if (!this.canonicalMembers.has(internalModel)) {\n return;\n }\n if (i === undefined) {\n i = this.canonicalState.indexOf(internalModel);\n }\n if (i > -1) {\n this.canonicalState.splice(i, 1);\n }\n super.removeCanonicalInternalModelFromOwn(internalModel, idx);\n }\n\n removeAllCanonicalInternalModelsFromOwn() {\n super.removeAllCanonicalInternalModelsFromOwn();\n this.canonicalMembers.clear();\n this.canonicalState.splice(0, this.canonicalState.length);\n }\n\n removeCompletelyFromOwn(internalModel) {\n super.removeCompletelyFromOwn(internalModel);\n\n var canonicalIndex = this.canonicalState.indexOf(internalModel);\n\n if (canonicalIndex !== -1) {\n this.canonicalState.splice(canonicalIndex, 1);\n }\n\n var manyArray = this._manyArray;\n\n if (manyArray) {\n var idx = manyArray.currentState.indexOf(internalModel);\n\n if (idx !== -1) {\n manyArray.internalReplace(idx, 1);\n }\n }\n }\n\n flushCanonical() {\n if (this._manyArray) {\n this._manyArray.flushCanonical();\n }\n super.flushCanonical();\n }\n\n removeInternalModelFromOwn(internalModel, idx) {\n if (!this.members.has(internalModel)) {\n return;\n }\n super.removeInternalModelFromOwn(internalModel, idx);\n // note that ensuring the many array is created, via `this.manyArray`\n // (instead of `this._manyArray`) is intentional.\n //\n // Because we're removing from local, and not canonical, state, it is\n // important that the many array is initialized now with those changes,\n // otherwise it will be initialized with canonical state and we'll have\n // lost the fact that this internalModel was removed.\n this._removeInternalModelFromManyArray(this.manyArray, internalModel, idx);\n this._removeInternalModelFromManyArray(this._retainedManyArray, internalModel, idx);\n }\n\n removeAllInternalModelsFromOwn() {\n super.removeAllInternalModelsFromOwn();\n // as with removeInternalModelFromOwn, we make sure the many array is\n // instantiated, or we'll lose local removals, as we're not updating\n // canonical state here.\n this.manyArray.clear();\n if (this._retainedManyArray) {\n this._retainedManyArray.clear();\n }\n }\n\n _removeInternalModelFromManyArray(manyArray, internalModel, idx) {\n if (manyArray === null) {\n return;\n }\n\n if (idx !== undefined) {\n //TODO(Igor) not used currently, fix\n manyArray.currentState.removeAt(idx);\n } else {\n manyArray._removeInternalModels([internalModel]);\n }\n }\n\n notifyRecordRelationshipAdded(internalModel, idx) {\n this.internalModel.notifyHasManyAdded(this.key, internalModel, idx);\n }\n\n reload() {\n var manyArray = this.manyArray;\n var manyArrayLoadedState = manyArray.get('isLoaded');\n\n if (this._loadingPromise) {\n if (this._loadingPromise.get('isPending')) {\n return this._loadingPromise;\n }\n if (this._loadingPromise.get('isRejected')) {\n manyArray.set('isLoaded', manyArrayLoadedState);\n }\n }\n\n var promise = void 0;\n if (this.link) {\n promise = this.fetchLink();\n } else {\n promise = this.store._scheduleFetchMany(manyArray.currentState).then(() => manyArray);\n }\n\n this._updateLoadingPromise(promise);\n return this._loadingPromise;\n }\n\n computeChanges(internalModels = []) {\n var members = this.canonicalMembers;\n var internalModelsToRemove = [];\n var internalModelSet = setForArray(internalModels);\n\n members.forEach(member => {\n if (internalModelSet.has(member)) {\n return;\n }\n\n internalModelsToRemove.push(member);\n });\n\n this.removeCanonicalInternalModels(internalModelsToRemove);\n\n for (var i = 0, l = internalModels.length; i < l; i++) {\n var internalModel = internalModels[i];\n this.removeCanonicalInternalModel(internalModel);\n this.addCanonicalInternalModel(internalModel, i);\n }\n }\n\n setInitialInternalModels(internalModels) {\n if (Array.isArray(internalModels) === false || internalModels.length === 0) {\n return;\n }\n\n for (var i = 0; i < internalModels.length; i++) {\n var internalModel = internalModels[i];\n if (this.canonicalMembers.has(internalModel)) {\n continue;\n }\n\n this.canonicalMembers.add(internalModel);\n this.members.add(internalModel);\n this.setupInverseRelationship(internalModel);\n }\n\n this.canonicalState = this.canonicalMembers.toArray();\n }\n\n fetchLink() {\n return this.store.findHasMany(this.internalModel, this.link, this.relationshipMeta).then(records => {\n if (records.hasOwnProperty('meta')) {\n this.updateMeta(records.meta);\n }\n this.store._backburner.join(() => {\n this.updateInternalModelsFromAdapter(records);\n this.manyArray.set('isLoaded', true);\n this.setHasData(true);\n });\n return this.manyArray;\n });\n }\n\n findRecords() {\n var manyArray = this.manyArray;\n var internalModels = manyArray.currentState;\n\n //TODO CLEANUP\n return this.store.findMany(internalModels).then(() => {\n if (!manyArray.get('isDestroyed')) {\n //Goes away after the manyArray refactor\n manyArray.set('isLoaded', true);\n }\n return manyArray;\n });\n }\n\n notifyHasManyChanged() {\n this.internalModel.notifyHasManyAdded(this.key);\n }\n\n getRecords() {\n //TODO(Igor) sync server here, once our syncing is not stupid\n var manyArray = this.manyArray;\n if (this.isAsync) {\n var promise = void 0;\n if (this.link) {\n if (this.hasLoaded) {\n promise = this.findRecords();\n } else {\n promise = this.findLink().then(() => this.findRecords());\n }\n } else {\n promise = this.findRecords();\n }\n return this._updateLoadingPromise(promise, manyArray);\n } else {\n (true && !(manyArray.isEvery('isEmpty', false)) && Ember.assert(`You looked up the '${this.key}' relationship on a '${this.internalModel.type.modelName}' with id ${this.internalModel.id} but some of the associated records were not loaded. Either make sure they are all loaded together with the parent record, or specify that the relationship is async ('DS.hasMany({ async: true })')`, manyArray.isEvery('isEmpty', false)));\n\n //TODO(Igor) WTF DO I DO HERE?\n // TODO @runspired equal WTFs to Igor\n\n if (!manyArray.get('isDestroyed')) {\n manyArray.set('isLoaded', true);\n }\n return manyArray;\n }\n }\n\n updateData(data, initial) {\n var internalModels = this.store._pushResourceIdentifiers(this, data);\n if (initial) {\n this.setInitialInternalModels(internalModels);\n } else {\n this.updateInternalModelsFromAdapter(internalModels);\n }\n }\n\n destroy() {\n super.destroy();\n var manyArray = this._manyArray;\n if (manyArray) {\n manyArray.destroy();\n this._manyArray = null;\n }\n\n var proxy = this.__loadingPromise;\n\n if (proxy) {\n proxy.destroy();\n this.__loadingPromise = null;\n }\n }\n}\n\nfunction setForArray(array) {\n var set = new OrderedSet();\n\n if (array) {\n for (var i = 0, l = array.length; i < l; i++) {\n set.add(array[i]);\n }\n }\n\n return set;\n}\n\nclass BelongsToRelationship extends Relationship {\n constructor(store, internalModel, inverseKey, relationshipMeta) {\n super(store, internalModel, inverseKey, relationshipMeta);\n this.internalModel = internalModel;\n this.key = relationshipMeta.key;\n this.inverseInternalModel = null;\n this.canonicalState = null;\n }\n\n setInternalModel(internalModel) {\n if (internalModel) {\n this.addInternalModel(internalModel);\n } else if (this.inverseInternalModel) {\n this.removeInternalModel(this.inverseInternalModel);\n }\n this.setHasData(true);\n this.setHasLoaded(true);\n }\n\n setCanonicalInternalModel(internalModel) {\n if (internalModel) {\n this.addCanonicalInternalModel(internalModel);\n } else if (this.canonicalState) {\n this.removeCanonicalInternalModel(this.canonicalState);\n }\n this.flushCanonicalLater();\n }\n\n setInitialCanonicalInternalModel(internalModel) {\n if (!internalModel) {\n return;\n }\n\n // When we initialize a belongsTo relationship, we want to avoid work like\n // notifying our internalModel that we've \"changed\" and excessive thrash on\n // setting up inverse relationships\n this.canonicalMembers.add(internalModel);\n this.members.add(internalModel);\n this.inverseInternalModel = this.canonicalState = internalModel;\n this.setupInverseRelationship(internalModel);\n }\n\n addCanonicalInternalModel(internalModel) {\n if (this.canonicalMembers.has(internalModel)) {\n return;\n }\n\n if (this.canonicalState) {\n this.removeCanonicalInternalModel(this.canonicalState);\n }\n\n this.canonicalState = internalModel;\n super.addCanonicalInternalModel(internalModel);\n }\n\n inverseDidDematerialize() {\n super.inverseDidDematerialize(this.inverseInternalModel);\n this.notifyBelongsToChanged();\n }\n\n removeCompletelyFromOwn(internalModel) {\n super.removeCompletelyFromOwn(internalModel);\n\n if (this.canonicalState === internalModel) {\n this.canonicalState = null;\n }\n\n if (this.inverseInternalModel === internalModel) {\n this.inverseInternalModel = null;\n this.notifyBelongsToChanged();\n }\n }\n\n removeCompletelyFromInverse() {\n super.removeCompletelyFromInverse();\n\n this.inverseInternalModel = null;\n }\n\n flushCanonical() {\n //temporary fix to not remove newly created records if server returned null.\n //TODO remove once we have proper diffing\n if (this.inverseInternalModel && this.inverseInternalModel.isNew() && !this.canonicalState) {\n return;\n }\n if (this.inverseInternalModel !== this.canonicalState) {\n this.inverseInternalModel = this.canonicalState;\n this.notifyBelongsToChanged();\n }\n\n super.flushCanonical();\n }\n\n addInternalModel(internalModel) {\n if (this.members.has(internalModel)) {\n return;\n }\n\n emberData_Debug.assertPolymorphicType(this.internalModel, this.relationshipMeta, internalModel);\n\n if (this.inverseInternalModel) {\n this.removeInternalModel(this.inverseInternalModel);\n }\n\n this.inverseInternalModel = internalModel;\n super.addInternalModel(internalModel);\n this.notifyBelongsToChanged();\n }\n\n setRecordPromise(newPromise) {\n var content = newPromise.get && newPromise.get('content');\n (true && !(content !== undefined) && Ember.assert(\"You passed in a promise that did not originate from an EmberData relationship. You can only pass promises that come from a belongsTo or hasMany relationship to the get call.\", content !== undefined));\n\n this.setInternalModel(content ? content._internalModel : content);\n }\n\n removeInternalModelFromOwn(internalModel) {\n if (!this.members.has(internalModel)) {\n return;\n }\n this.inverseInternalModel = null;\n super.removeInternalModelFromOwn(internalModel);\n this.notifyBelongsToChanged();\n }\n\n removeAllInternalModelsFromOwn() {\n super.removeAllInternalModelsFromOwn();\n this.inverseInternalModel = null;\n this.notifyBelongsToChanged();\n }\n\n notifyBelongsToChanged() {\n this.internalModel.notifyBelongsToChanged(this.key);\n }\n\n removeCanonicalInternalModelFromOwn(internalModel) {\n if (!this.canonicalMembers.has(internalModel)) {\n return;\n }\n this.canonicalState = null;\n super.removeCanonicalInternalModelFromOwn(internalModel);\n }\n\n removeAllCanonicalInternalModelsFromOwn() {\n super.removeAllCanonicalInternalModelsFromOwn();\n this.canonicalState = null;\n }\n\n findRecord() {\n if (this.inverseInternalModel) {\n return this.store._findByInternalModel(this.inverseInternalModel);\n } else {\n return Ember.RSVP.Promise.resolve(null);\n }\n }\n\n fetchLink() {\n return this.store.findBelongsTo(this.internalModel, this.link, this.relationshipMeta).then(internalModel => {\n if (internalModel) {\n this.addInternalModel(internalModel);\n }\n return internalModel;\n });\n }\n\n getRecord() {\n //TODO(Igor) flushCanonical here once our syncing is not stupid\n if (this.isAsync) {\n var promise = void 0;\n if (this.link) {\n if (this.hasLoaded) {\n promise = this.findRecord();\n } else {\n promise = this.findLink().then(() => this.findRecord());\n }\n } else {\n promise = this.findRecord();\n }\n\n return PromiseObject.create({\n promise: promise,\n content: this.inverseInternalModel ? this.inverseInternalModel.getRecord() : null\n });\n } else {\n if (this.inverseInternalModel === null) {\n return null;\n }\n var toReturn = this.inverseInternalModel.getRecord();\n (true && !(toReturn === null || !toReturn.get('isEmpty')) && Ember.assert(\"You looked up the '\" + this.key + \"' relationship on a '\" + this.internalModel.modelName + \"' with id \" + this.internalModel.id + \" but some of the associated records were not loaded. Either make sure they are all loaded together with the parent record, or specify that the relationship is async (`DS.belongsTo({ async: true })`)\", toReturn === null || !toReturn.get('isEmpty')));\n\n return toReturn;\n }\n }\n\n reload() {\n // TODO handle case when reload() is triggered multiple times\n\n if (this.link) {\n return this.fetchLink();\n }\n\n // reload record, if it is already loaded\n if (this.inverseInternalModel && this.inverseInternalModel.hasRecord) {\n return this.inverseInternalModel.getRecord().reload();\n }\n\n return this.findRecord();\n }\n\n updateData(data, initial) {\n (true && !(data === null || data.id !== undefined && data.type !== undefined) && Ember.assert(`Ember Data expected the data for the ${this.key} relationship on a ${this.internalModel.toString()} to be in a JSON API format and include an \\`id\\` and \\`type\\` property but it found ${Ember.inspect(data)}. Please check your serializer and make sure it is serializing the relationship payload into a JSON API format.`, data === null || data.id !== undefined && data.type !== undefined));\n\n var internalModel = this.store._pushResourceIdentifier(this, data);\n if (initial) {\n this.setInitialCanonicalInternalModel(internalModel);\n } else {\n this.setCanonicalInternalModel(internalModel);\n }\n }\n}\n\nfunction shouldFindInverse(relationshipMeta) {\n var options = relationshipMeta.options;\n return !(options && options.inverse === null);\n}\n\nfunction createRelationshipFor(internalModel, relationshipMeta, store) {\n var inverseKey = void 0;\n var inverse = null;\n\n if (shouldFindInverse(relationshipMeta)) {\n inverse = internalModel.type.inverseFor(relationshipMeta.key, store);\n } else {\n internalModel.type.typeForRelationship(relationshipMeta.key, store);\n }\n\n if (inverse) {\n inverseKey = inverse.name;\n }\n\n if (relationshipMeta.kind === 'hasMany') {\n return new ManyRelationship(store, internalModel, inverseKey, relationshipMeta);\n } else {\n return new BelongsToRelationship(store, internalModel, inverseKey, relationshipMeta);\n }\n}\n\nclass Relationships {\n constructor(internalModel) {\n this.internalModel = internalModel;\n this.initializedRelationships = Object.create(null);\n }\n\n // TODO @runspired deprecate this as it was never truly a record instance\n get record() {\n return this.internalModel;\n }\n\n has(key) {\n return !!this.initializedRelationships[key];\n }\n\n forEach(cb) {\n var rels = this.initializedRelationships;\n Object.keys(rels).forEach(name => {\n cb(name, rels[name]);\n });\n }\n\n get(key) {\n var relationships = this.initializedRelationships;\n var relationship = relationships[key];\n var internalModel = this.internalModel;\n\n if (!relationship) {\n var relationshipsByName = Ember.get(internalModel.type, 'relationshipsByName');\n var rel = relationshipsByName.get(key);\n\n if (!rel) {\n return undefined;\n }\n\n var relationshipPayload = internalModel.store._relationshipsPayloads.get(internalModel.modelName, internalModel.id, key);\n\n relationship = relationships[key] = createRelationshipFor(internalModel, rel, internalModel.store);\n\n if (relationshipPayload) {\n relationship.push(relationshipPayload, true);\n }\n }\n\n return relationship;\n }\n}\n\n/**\n @class Snapshot\n @namespace DS\n @private\n @constructor\n @param {DS.Model} internalModel The model to create a snapshot from\n*/\n/**\n @module ember-data\n*/\n\nclass Snapshot {\n constructor(internalModel, options = {}) {\n this._attributes = Object.create(null);\n this._belongsToRelationships = Object.create(null);\n this._belongsToIds = Object.create(null);\n this._hasManyRelationships = Object.create(null);\n this._hasManyIds = Object.create(null);\n this._internalModel = internalModel;\n\n var record = internalModel.getRecord();\n\n /**\n The underlying record for this snapshot. Can be used to access methods and\n properties defined on the record.\n Example\n ```javascript\n let json = snapshot.record.toJSON();\n ```\n @property record\n @type {DS.Model}\n */\n this.record = record;\n record.eachAttribute(keyName => this._attributes[keyName] = Ember.get(record, keyName));\n\n /**\n The id of the snapshot's underlying record\n Example\n ```javascript\n // store.push('post', { id: 1, author: 'Tomster', title: 'Ember.js rocks' });\n postSnapshot.id; // => '1'\n ```\n @property id\n @type {String}\n */\n this.id = internalModel.id;\n\n /**\n A hash of adapter options\n @property adapterOptions\n @type {Object}\n */\n this.adapterOptions = options.adapterOptions;\n this.include = options.include;\n\n /**\n The name of the type of the underlying record for this snapshot, as a string.\n @property modelName\n @type {String}\n */\n this.modelName = internalModel.modelName;\n\n this._changedAttributes = record.changedAttributes();\n }\n\n /**\n The type of the underlying record for this snapshot, as a DS.Model.\n @property type\n @type {DS.Model}\n */\n get type() {\n // TODO @runspired we should deprecate this in favor of modelClass but only once\n // we've cleaned up the internals enough that a public change to follow suite is\n // uncontroversial.\n return this._internalModel.modelClass;\n }\n\n /**\n Returns the value of an attribute.\n Example\n ```javascript\n // store.push('post', { id: 1, author: 'Tomster', title: 'Ember.js rocks' });\n postSnapshot.attr('author'); // => 'Tomster'\n postSnapshot.attr('title'); // => 'Ember.js rocks'\n ```\n Note: Values are loaded eagerly and cached when the snapshot is created.\n @method attr\n @param {String} keyName\n @return {Object} The attribute value or undefined\n */\n attr(keyName) {\n if (keyName in this._attributes) {\n return this._attributes[keyName];\n }\n throw new Ember.Error(\"Model '\" + Ember.inspect(this.record) + \"' has no attribute named '\" + keyName + \"' defined.\");\n }\n\n /**\n Returns all attributes and their corresponding values.\n Example\n ```javascript\n // store.push('post', { id: 1, author: 'Tomster', title: 'Ember.js rocks' });\n postSnapshot.attributes(); // => { author: 'Tomster', title: 'Ember.js rocks' }\n ```\n @method attributes\n @return {Object} All attributes of the current snapshot\n */\n attributes() {\n return Ember.copy(this._attributes);\n }\n\n /**\n Returns all changed attributes and their old and new values.\n Example\n ```javascript\n // store.push('post', { id: 1, author: 'Tomster', title: 'Ember.js rocks' });\n postModel.set('title', 'Ember.js rocks!');\n postSnapshot.changedAttributes(); // => { title: ['Ember.js rocks', 'Ember.js rocks!'] }\n ```\n @method changedAttributes\n @return {Object} All changed attributes of the current snapshot\n */\n changedAttributes() {\n var changedAttributes = Object.create(null);\n var changedAttributeKeys = Object.keys(this._changedAttributes);\n\n for (var i = 0, length = changedAttributeKeys.length; i < length; i++) {\n var key = changedAttributeKeys[i];\n changedAttributes[key] = Ember.copy(this._changedAttributes[key]);\n }\n\n return changedAttributes;\n }\n\n /**\n Returns the current value of a belongsTo relationship.\n `belongsTo` takes an optional hash of options as a second parameter,\n currently supported options are:\n - `id`: set to `true` if you only want the ID of the related record to be\n returned.\n Example\n ```javascript\n // store.push('post', { id: 1, title: 'Hello World' });\n // store.createRecord('comment', { body: 'Lorem ipsum', post: post });\n commentSnapshot.belongsTo('post'); // => DS.Snapshot\n commentSnapshot.belongsTo('post', { id: true }); // => '1'\n // store.push('comment', { id: 1, body: 'Lorem ipsum' });\n commentSnapshot.belongsTo('post'); // => undefined\n ```\n Calling `belongsTo` will return a new Snapshot as long as there's any known\n data for the relationship available, such as an ID. If the relationship is\n known but unset, `belongsTo` will return `null`. If the contents of the\n relationship is unknown `belongsTo` will return `undefined`.\n Note: Relationships are loaded lazily and cached upon first access.\n @method belongsTo\n @param {String} keyName\n @param {Object} [options]\n @return {(DS.Snapshot|String|null|undefined)} A snapshot or ID of a known\n relationship or null if the relationship is known but unset. undefined\n will be returned if the contents of the relationship is unknown.\n */\n belongsTo(keyName, options) {\n var id = options && options.id;\n var relationship = void 0,\n inverseInternalModel = void 0,\n hasData = void 0;\n var result = void 0;\n\n if (id && keyName in this._belongsToIds) {\n return this._belongsToIds[keyName];\n }\n\n if (!id && keyName in this._belongsToRelationships) {\n return this._belongsToRelationships[keyName];\n }\n\n relationship = this._internalModel._relationships.get(keyName);\n if (!(relationship && relationship.relationshipMeta.kind === 'belongsTo')) {\n throw new Ember.Error(\"Model '\" + Ember.inspect(this.record) + \"' has no belongsTo relationship named '\" + keyName + \"' defined.\");\n }\n\n hasData = Ember.get(relationship, 'hasData');\n inverseInternalModel = Ember.get(relationship, 'inverseInternalModel');\n\n if (hasData) {\n if (inverseInternalModel && !inverseInternalModel.isDeleted()) {\n if (id) {\n result = Ember.get(inverseInternalModel, 'id');\n } else {\n result = inverseInternalModel.createSnapshot();\n }\n } else {\n result = null;\n }\n }\n\n if (id) {\n this._belongsToIds[keyName] = result;\n } else {\n this._belongsToRelationships[keyName] = result;\n }\n\n return result;\n }\n\n /**\n Returns the current value of a hasMany relationship.\n `hasMany` takes an optional hash of options as a second parameter,\n currently supported options are:\n - `ids`: set to `true` if you only want the IDs of the related records to be\n returned.\n Example\n ```javascript\n // store.push('post', { id: 1, title: 'Hello World', comments: [2, 3] });\n postSnapshot.hasMany('comments'); // => [DS.Snapshot, DS.Snapshot]\n postSnapshot.hasMany('comments', { ids: true }); // => ['2', '3']\n // store.push('post', { id: 1, title: 'Hello World' });\n postSnapshot.hasMany('comments'); // => undefined\n ```\n Note: Relationships are loaded lazily and cached upon first access.\n @method hasMany\n @param {String} keyName\n @param {Object} [options]\n @return {(Array|undefined)} An array of snapshots or IDs of a known\n relationship or an empty array if the relationship is known but unset.\n undefined will be returned if the contents of the relationship is unknown.\n */\n hasMany(keyName, options) {\n var ids = options && options.ids;\n var relationship = void 0,\n members = void 0,\n hasData = void 0;\n var results = void 0;\n\n if (ids && keyName in this._hasManyIds) {\n return this._hasManyIds[keyName];\n }\n\n if (!ids && keyName in this._hasManyRelationships) {\n return this._hasManyRelationships[keyName];\n }\n\n relationship = this._internalModel._relationships.get(keyName);\n if (!(relationship && relationship.relationshipMeta.kind === 'hasMany')) {\n throw new Ember.Error(\"Model '\" + Ember.inspect(this.record) + \"' has no hasMany relationship named '\" + keyName + \"' defined.\");\n }\n\n hasData = Ember.get(relationship, 'hasData');\n members = Ember.get(relationship, 'members');\n\n if (hasData) {\n results = [];\n members.forEach(member => {\n if (!member.isDeleted()) {\n if (ids) {\n results.push(member.id);\n } else {\n results.push(member.createSnapshot());\n }\n }\n });\n }\n\n if (ids) {\n this._hasManyIds[keyName] = results;\n } else {\n this._hasManyRelationships[keyName] = results;\n }\n\n return results;\n }\n\n /**\n Iterates through all the attributes of the model, calling the passed\n function on each attribute.\n Example\n ```javascript\n snapshot.eachAttribute(function(name, meta) {\n // ...\n });\n ```\n @method eachAttribute\n @param {Function} callback the callback to execute\n @param {Object} [binding] the value to which the callback's `this` should be bound\n */\n eachAttribute(callback, binding) {\n this.record.eachAttribute(callback, binding);\n }\n\n /**\n Iterates through all the relationships of the model, calling the passed\n function on each relationship.\n Example\n ```javascript\n snapshot.eachRelationship(function(name, relationship) {\n // ...\n });\n ```\n @method eachRelationship\n @param {Function} callback the callback to execute\n @param {Object} [binding] the value to which the callback's `this` should be bound\n */\n eachRelationship(callback, binding) {\n this.record.eachRelationship(callback, binding);\n }\n\n /**\n Serializes the snapshot using the serializer for the model.\n Example\n ```app/adapters/application.js\n import DS from 'ember-data';\n export default DS.Adapter.extend({\n createRecord(store, type, snapshot) {\n var data = snapshot.serialize({ includeId: true });\n var url = `/${type.modelName}`;\n return fetch(url, {\n method: 'POST',\n body: data,\n }).then((response) => response.json())\n }\n });\n ```\n @method serialize\n @param {Object} options\n @return {Object} an object whose values are primitive JSON values only\n */\n serialize(options) {\n return this.record.store.serializerFor(this.modelName).serialize(this, options);\n }\n}\n\n/*\n Check if the passed model has a `type` attribute or a relationship named `type`.\n\n @method modelHasAttributeOrRelationshipNamedType\n @param modelClass\n */\nfunction modelHasAttributeOrRelationshipNamedType(modelClass) {\n return Ember.get(modelClass, 'attributes').has('type') || Ember.get(modelClass, 'relationshipsByName').has('type');\n}\n\n/*\n ember-container-inject-owner is a new feature in Ember 2.3 that finally provides a public\n API for looking items up. This function serves as a super simple polyfill to avoid\n triggering deprecations.\n */\nfunction getOwner(context) {\n var owner = void 0;\n\n if (Ember.getOwner) {\n owner = Ember.getOwner(context);\n } else if (context.container) {\n owner = context.container;\n }\n\n if (owner && owner.lookupFactory && !owner._lookupFactory) {\n // `owner` is a container, we are just making this work\n owner._lookupFactory = function () {\n return owner.lookupFactory(...arguments);\n };\n\n owner.register = function () {\n var registry = owner.registry || owner._registry || owner;\n\n return registry.register(...arguments);\n };\n }\n\n return owner;\n}\n\nvar Reference = function (store, internalModel) {\n this.store = store;\n this.internalModel = internalModel;\n};\n\nReference.prototype = {\n constructor: Reference\n};\n\n/**\n An RecordReference is a low level API that allows users and\n addon author to perform meta-operations on a record.\n\n @class RecordReference\n @namespace DS\n*/\nvar RecordReference = function (store, internalModel) {\n this._super$constructor(store, internalModel);\n this.type = internalModel.modelName;\n this._id = internalModel.id;\n};\n\nRecordReference.prototype = Object.create(Reference.prototype);\nRecordReference.prototype.constructor = RecordReference;\nRecordReference.prototype._super$constructor = Reference;\n\n/**\n The `id` of the record that this reference refers to.\n\n Together, the `type` and `id` properties form a composite key for\n the identity map.\n\n Example\n\n ```javascript\n let userRef = store.getReference('user', 1);\n\n userRef.id(); // '1'\n ```\n\n @method id\n @return {String} The id of the record.\n*/\nRecordReference.prototype.id = function () {\n return this._id;\n};\n\n/**\n How the reference will be looked up when it is loaded: Currently\n this always return `identity` to signifying that a record will be\n loaded by the `type` and `id`.\n\n Example\n\n ```javascript\n const userRef = store.getReference('user', 1);\n\n userRef.remoteType(); // 'identity'\n ```\n\n @method remoteType\n @return {String} 'identity'\n*/\nRecordReference.prototype.remoteType = function () {\n return 'identity';\n};\n\n/**\n This API allows you to provide a reference with new data. The\n simplest usage of this API is similar to `store.push`: you provide a\n normalized hash of data and the object represented by the reference\n will update.\n\n If you pass a promise to `push`, Ember Data will not ask the adapter\n for the data if another attempt to fetch it is made in the\n interim. When the promise resolves, the underlying object is updated\n with the new data, and the promise returned by *this function* is resolved\n with that object.\n\n For example, `recordReference.push(promise)` will be resolved with a\n record.\n\n Example\n\n ```javascript\n let userRef = store.getReference('user', 1);\n\n // provide data for reference\n userRef.push({ data: { id: 1, username: \"@user\" }}).then(function(user) {\n userRef.value() === user;\n });\n ```\n\n @method push\n @param {Promise|Object}\n @return Promise<record> a promise for the value (record or relationship)\n*/\nRecordReference.prototype.push = function (objectOrPromise) {\n return Ember.RSVP.resolve(objectOrPromise).then(data => {\n return this.store.push(data);\n });\n};\n\n/**\n If the entity referred to by the reference is already loaded, it is\n present as `reference.value`. Otherwise the value returned by this function\n is `null`.\n\n Example\n\n ```javascript\n let userRef = store.getReference('user', 1);\n\n userRef.value(); // user\n ```\n\n @method value\n @return {DS.Model} the record for this RecordReference\n*/\nRecordReference.prototype.value = function () {\n if (this.internalModel.hasRecord) {\n return this.internalModel.getRecord();\n }\n return null;\n};\n\n/**\n Triggers a fetch for the backing entity based on its `remoteType`\n (see `remoteType` definitions per reference type).\n\n Example\n\n ```javascript\n let userRef = store.getReference('user', 1);\n\n // load user (via store.find)\n userRef.load().then(...)\n ```\n\n @method load\n @return {Promise<record>} the record for this RecordReference\n*/\nRecordReference.prototype.load = function () {\n return this.store.findRecord(this.type, this._id);\n};\n\n/**\n Reloads the record if it is already loaded. If the record is not\n loaded it will load the record via `store.findRecord`\n\n Example\n\n ```javascript\n let userRef = store.getReference('user', 1);\n\n // or trigger a reload\n userRef.reload().then(...)\n ```\n\n @method reload\n @return {Promise<record>} the record for this RecordReference\n*/\nRecordReference.prototype.reload = function () {\n var record = this.value();\n if (record) {\n return record.reload();\n }\n\n return this.load();\n};\n\n/**\n A BelongsToReference is a low level API that allows users and\n addon author to perform meta-operations on a belongs-to\n relationship.\n\n @class BelongsToReference\n @namespace DS\n @extends DS.Reference\n*/\nvar BelongsToReference = function (store, parentInternalModel, belongsToRelationship) {\n this._super$constructor(store, parentInternalModel);\n this.belongsToRelationship = belongsToRelationship;\n this.type = belongsToRelationship.relationshipMeta.type;\n this.parent = parentInternalModel.recordReference;\n\n // TODO inverse\n};\n\nBelongsToReference.prototype = Object.create(Reference.prototype);\nBelongsToReference.prototype.constructor = BelongsToReference;\nBelongsToReference.prototype._super$constructor = Reference;\n\n/**\n This returns a string that represents how the reference will be\n looked up when it is loaded. If the relationship has a link it will\n use the \"link\" otherwise it defaults to \"id\".\n\n Example\n\n ```javascript\n // models/blog.js\n export default DS.Model.extend({\n user: DS.belongsTo({ async: true })\n });\n\n let blog = store.push({\n type: 'blog',\n id: 1,\n relationships: {\n user: {\n data: { type: 'user', id: 1 }\n }\n }\n });\n let userRef = blog.belongsTo('user');\n\n // get the identifier of the reference\n if (userRef.remoteType() === \"id\") {\n let id = userRef.id();\n } else if (userRef.remoteType() === \"link\") {\n let link = userRef.link();\n }\n ```\n\n @method remoteType\n @return {String} The name of the remote type. This should either be \"link\" or \"id\"\n*/\nBelongsToReference.prototype.remoteType = function () {\n if (this.belongsToRelationship.link) {\n return \"link\";\n }\n\n return \"id\";\n};\n\n/**\n The `id` of the record that this reference refers to. Together, the\n `type()` and `id()` methods form a composite key for the identity\n map. This can be used to access the id of an async relationship\n without triggering a fetch that would normally happen if you\n attempted to use `record.get('relationship.id')`.\n\n Example\n\n ```javascript\n // models/blog.js\n export default DS.Model.extend({\n user: DS.belongsTo({ async: true })\n });\n\n let blog = store.push({\n data: {\n type: 'blog',\n id: 1,\n relationships: {\n user: {\n data: { type: 'user', id: 1 }\n }\n }\n }\n });\n let userRef = blog.belongsTo('user');\n\n // get the identifier of the reference\n if (userRef.remoteType() === \"id\") {\n let id = userRef.id();\n }\n ```\n\n @method id\n @return {String} The id of the record in this belongsTo relationship.\n*/\nBelongsToReference.prototype.id = function () {\n var inverseInternalModel = this.belongsToRelationship.inverseInternalModel;\n return inverseInternalModel && inverseInternalModel.id;\n};\n\n/**\n The link Ember Data will use to fetch or reload this belongs-to\n relationship.\n\n Example\n\n ```javascript\n // models/blog.js\n export default DS.Model.extend({\n user: DS.belongsTo({ async: true })\n });\n\n let blog = store.push({\n data: {\n type: 'blog',\n id: 1,\n relationships: {\n user: {\n links: {\n related: '/articles/1/author'\n }\n }\n }\n }\n });\n let userRef = blog.belongsTo('user');\n\n // get the identifier of the reference\n if (userRef.remoteType() === \"link\") {\n let link = userRef.link();\n }\n ```\n\n @method link\n @return {String} The link Ember Data will use to fetch or reload this belongs-to relationship.\n*/\nBelongsToReference.prototype.link = function () {\n return this.belongsToRelationship.link;\n};\n\n/**\n The meta data for the belongs-to relationship.\n\n Example\n\n ```javascript\n // models/blog.js\n export default DS.Model.extend({\n user: DS.belongsTo({ async: true })\n });\n\n let blog = store.push({\n data: {\n type: 'blog',\n id: 1,\n relationships: {\n user: {\n links: {\n related: {\n href: '/articles/1/author',\n meta: {\n lastUpdated: 1458014400000\n }\n }\n }\n }\n }\n }\n });\n\n let userRef = blog.belongsTo('user');\n\n userRef.meta() // { lastUpdated: 1458014400000 }\n ```\n\n @method meta\n @return {Object} The meta information for the belongs-to relationship.\n*/\nBelongsToReference.prototype.meta = function () {\n return this.belongsToRelationship.meta;\n};\n\n/**\n `push` can be used to update the data in the relationship and Ember\n Data will treat the new data as the conanical value of this\n relationship on the backend.\n\n Example\n\n ```javascript\n // models/blog.js\n export default DS.Model.extend({\n user: DS.belongsTo({ async: true })\n });\n\n let blog = store.push({\n data: {\n type: 'blog',\n id: 1,\n relationships: {\n user: {\n data: { type: 'user', id: 1 }\n }\n }\n }\n });\n let userRef = blog.belongsTo('user');\n\n // provide data for reference\n userRef.push({\n data: {\n type: 'user',\n id: 1,\n attributes: {\n username: \"@user\"\n }\n }\n }).then(function(user) {\n userRef.value() === user;\n });\n ```\n\n @method push\n @param {Object|Promise} objectOrPromise a promise that resolves to a JSONAPI document object describing the new value of this relationship.\n @return {Promise<record>} A promise that resolves with the new value in this belongs-to relationship.\n*/\nBelongsToReference.prototype.push = function (objectOrPromise) {\n return Ember.RSVP.resolve(objectOrPromise).then(data => {\n var record = void 0;\n\n if (data instanceof Model) {\n if (isEnabled('ds-overhaul-references')) {\n (true && !(false) && Ember.deprecate(\"BelongsToReference#push(DS.Model) is deprecated. Update relationship via `model.set('relationshipName', value)` instead.\", false, {\n id: 'ds.references.belongs-to.push-record',\n until: '4.0.0'\n }));\n }\n record = data;\n } else {\n record = this.store.push(data);\n }\n\n emberData_Debug.assertPolymorphicType(this.internalModel, this.belongsToRelationship.relationshipMeta, record._internalModel);\n\n this.belongsToRelationship.setCanonicalInternalModel(record._internalModel);\n\n return record;\n });\n};\n\n/**\n `value()` synchronously returns the current value of the belongs-to\n relationship. Unlike `record.get('relationshipName')`, calling\n `value()` on a reference does not trigger a fetch if the async\n relationship is not yet loaded. If the relationship is not loaded\n it will always return `null`.\n\n Example\n\n ```javascript\n // models/blog.js\n export default DS.Model.extend({\n user: DS.belongsTo({ async: true })\n });\n\n let blog = store.push({\n data: {\n type: 'blog',\n id: 1,\n relationships: {\n user: {\n data: { type: 'user', id: 1 }\n }\n }\n }\n });\n let userRef = blog.belongsTo('user');\n\n userRef.value(); // null\n\n // provide data for reference\n userRef.push({\n data: {\n type: 'user',\n id: 1,\n attributes: {\n username: \"@user\"\n }\n }\n }).then(function(user) {\n userRef.value(); // user\n });\n ```\n\n @method value\n @return {DS.Model} the record in this relationship\n*/\nBelongsToReference.prototype.value = function () {\n var inverseInternalModel = this.belongsToRelationship.inverseInternalModel;\n\n if (inverseInternalModel && inverseInternalModel.isLoaded()) {\n return inverseInternalModel.getRecord();\n }\n\n return null;\n};\n\n/**\n Loads a record in a belongs to relationship if it is not already\n loaded. If the relationship is already loaded this method does not\n trigger a new load.\n\n Example\n\n ```javascript\n // models/blog.js\n export default DS.Model.extend({\n user: DS.belongsTo({ async: true })\n });\n\n let blog = store.push({\n data: {\n type: 'blog',\n id: 1,\n relationships: {\n user: {\n data: { type: 'user', id: 1 }\n }\n }\n }\n });\n let userRef = blog.belongsTo('user');\n\n userRef.value(); // null\n\n userRef.load().then(function(user) {\n userRef.value() === user\n });\n ```\n\n @method load\n @return {Promise} a promise that resolves with the record in this belongs-to relationship.\n*/\nBelongsToReference.prototype.load = function () {\n if (this.remoteType() === \"id\") {\n return this.belongsToRelationship.getRecord();\n }\n\n if (this.remoteType() === \"link\") {\n return this.belongsToRelationship.findLink().then(internalModel => {\n return this.value();\n });\n }\n};\n\n/**\n Triggers a reload of the value in this relationship. If the\n remoteType is `\"link\"` Ember Data will use the relationship link to\n reload the relationship. Otherwise it will reload the record by its\n id.\n\n Example\n\n ```javascript\n // models/blog.js\n export default DS.Model.extend({\n user: DS.belongsTo({ async: true })\n });\n\n let blog = store.push({\n data: {\n type: 'blog',\n id: 1,\n relationships: {\n user: {\n data: { type: 'user', id: 1 }\n }\n }\n }\n });\n let userRef = blog.belongsTo('user');\n\n userRef.reload().then(function(user) {\n userRef.value() === user\n });\n ```\n\n @method reload\n @return {Promise} a promise that resolves with the record in this belongs-to relationship after the reload has completed.\n*/\nBelongsToReference.prototype.reload = function () {\n return this.belongsToRelationship.reload().then(internalModel => {\n return this.value();\n });\n};\n\n/**\n A HasManyReference is a low level API that allows users and addon\n author to perform meta-operations on a has-many relationship.\n\n @class HasManyReference\n @namespace DS\n*/\nvar HasManyReference = function (store, parentInternalModel, hasManyRelationship) {\n this._super$constructor(store, parentInternalModel);\n this.hasManyRelationship = hasManyRelationship;\n this.type = hasManyRelationship.relationshipMeta.type;\n this.parent = parentInternalModel.recordReference;\n\n // TODO inverse\n};\n\nHasManyReference.prototype = Object.create(Reference.prototype);\nHasManyReference.prototype.constructor = HasManyReference;\nHasManyReference.prototype._super$constructor = Reference;\n\n/**\n This returns a string that represents how the reference will be\n looked up when it is loaded. If the relationship has a link it will\n use the \"link\" otherwise it defaults to \"id\".\n\n Example\n\n ```app/models/post.js\n export default DS.Model.extend({\n comments: DS.hasMany({ async: true })\n });\n ```\n\n ```javascript\n let post = store.push({\n data: {\n type: 'post',\n id: 1,\n relationships: {\n comments: {\n data: [{ type: 'comment', id: 1 }]\n }\n }\n }\n });\n\n let commentsRef = post.hasMany('comments');\n\n // get the identifier of the reference\n if (commentsRef.remoteType() === \"ids\") {\n let ids = commentsRef.ids();\n } else if (commentsRef.remoteType() === \"link\") {\n let link = commentsRef.link();\n }\n ```\n\n @method remoteType\n @return {String} The name of the remote type. This should either be \"link\" or \"ids\"\n*/\nHasManyReference.prototype.remoteType = function () {\n if (this.hasManyRelationship.link) {\n return \"link\";\n }\n\n return \"ids\";\n};\n\n/**\n The link Ember Data will use to fetch or reload this has-many\n relationship.\n\n Example\n\n ```app/models/post.js\n export default DS.Model.extend({\n comments: DS.hasMany({ async: true })\n });\n ```\n\n ```javascript\n let post = store.push({\n data: {\n type: 'post',\n id: 1,\n relationships: {\n comments: {\n links: {\n related: '/posts/1/comments'\n }\n }\n }\n }\n });\n\n let commentsRef = post.hasMany('comments');\n\n commentsRef.link(); // '/posts/1/comments'\n ```\n\n @method link\n @return {String} The link Ember Data will use to fetch or reload this has-many relationship.\n*/\nHasManyReference.prototype.link = function () {\n return this.hasManyRelationship.link;\n};\n\n/**\n `ids()` returns an array of the record ids in this relationship.\n\n Example\n\n ```app/models/post.js\n export default DS.Model.extend({\n comments: DS.hasMany({ async: true })\n });\n ```\n\n ```javascript\n let post = store.push({\n data: {\n type: 'post',\n id: 1,\n relationships: {\n comments: {\n data: [{ type: 'comment', id: 1 }]\n }\n }\n }\n });\n\n let commentsRef = post.hasMany('comments');\n\n commentsRef.ids(); // ['1']\n ```\n\n @method ids\n @return {Array} The ids in this has-many relationship\n*/\nHasManyReference.prototype.ids = function () {\n var members = this.hasManyRelationship.members.toArray();\n\n return members.map(function (internalModel) {\n return internalModel.id;\n });\n};\n\n/**\n The meta data for the has-many relationship.\n\n Example\n\n ```app/models/post.js\n export default DS.Model.extend({\n comments: DS.hasMany({ async: true })\n });\n ```\n\n ```javascript\n let post = store.push({\n data: {\n type: 'post',\n id: 1,\n relationships: {\n comments: {\n links: {\n related: {\n href: '/posts/1/comments',\n meta: {\n count: 10\n }\n }\n }\n }\n }\n }\n });\n\n let commentsRef = post.hasMany('comments');\n\n commentsRef.meta(); // { count: 10 }\n ```\n\n @method meta\n @return {Object} The meta information for the has-many relationship.\n*/\nHasManyReference.prototype.meta = function () {\n return this.hasManyRelationship.meta;\n};\n\n/**\n `push` can be used to update the data in the relationship and Ember\n Data will treat the new data as the canonical value of this\n relationship on the backend.\n\n Example\n\n ```app/models/post.js\n export default DS.Model.extend({\n comments: DS.hasMany({ async: true })\n });\n ```\n\n ```\n let post = store.push({\n data: {\n type: 'post',\n id: 1,\n relationships: {\n comments: {\n data: [{ type: 'comment', id: 1 }]\n }\n }\n }\n });\n\n let commentsRef = post.hasMany('comments');\n\n commentsRef.ids(); // ['1']\n\n commentsRef.push([\n [{ type: 'comment', id: 2 }],\n [{ type: 'comment', id: 3 }],\n ])\n\n commentsRef.ids(); // ['2', '3']\n ```\n\n @method push\n @param {Array|Promise} objectOrPromise a promise that resolves to a JSONAPI document object describing the new value of this relationship.\n @return {DS.ManyArray}\n*/\nHasManyReference.prototype.push = function (objectOrPromise) {\n return Ember.RSVP.resolve(objectOrPromise).then(payload => {\n var array = payload;\n\n if (isEnabled(\"ds-overhaul-references\")) {\n (true && !(!Array.isArray(payload)) && Ember.deprecate(\"HasManyReference#push(array) is deprecated. Push a JSON-API document instead.\", !Array.isArray(payload), {\n id: 'ds.references.has-many.push-array',\n until: '4.0.0'\n }));\n }\n\n var useLegacyArrayPush = true;\n if (typeof payload === \"object\" && payload.data) {\n array = payload.data;\n useLegacyArrayPush = array.length && array[0].data;\n\n if (isEnabled('ds-overhaul-references')) {\n (true && !(!useLegacyArrayPush) && Ember.deprecate(\"HasManyReference#push() expects a valid JSON-API document.\", !useLegacyArrayPush, {\n id: 'ds.references.has-many.push-invalid-json-api',\n until: '4.0.0'\n }));\n }\n }\n\n if (!isEnabled('ds-overhaul-references')) {\n useLegacyArrayPush = true;\n }\n\n var internalModels = void 0;\n if (useLegacyArrayPush) {\n internalModels = array.map(obj => {\n var record = this.store.push(obj);\n\n {\n var relationshipMeta = this.hasManyRelationship.relationshipMeta;\n emberData_Debug.assertPolymorphicType(this.internalModel, relationshipMeta, record._internalModel);\n }\n\n return record._internalModel;\n });\n } else {\n var records = this.store.push(payload);\n internalModels = Ember.A(records).mapBy('_internalModel');\n\n {\n internalModels.forEach(internalModel => {\n var relationshipMeta = this.hasManyRelationship.relationshipMeta;\n emberData_Debug.assertPolymorphicType(this.internalModel, relationshipMeta, internalModel);\n });\n }\n }\n\n this.hasManyRelationship.computeChanges(internalModels);\n\n return this.hasManyRelationship.manyArray;\n });\n};\n\nHasManyReference.prototype._isLoaded = function () {\n var hasData = Ember.get(this.hasManyRelationship, 'hasData');\n if (!hasData) {\n return false;\n }\n\n var members = this.hasManyRelationship.members.toArray();\n\n return members.every(function (internalModel) {\n return internalModel.isLoaded() === true;\n });\n};\n\n/**\n `value()` synchronously returns the current value of the has-many\n relationship. Unlike `record.get('relationshipName')`, calling\n `value()` on a reference does not trigger a fetch if the async\n relationship is not yet loaded. If the relationship is not loaded\n it will always return `null`.\n\n Example\n\n ```app/models/post.js\n export default DS.Model.extend({\n comments: DS.hasMany({ async: true })\n });\n ```\n\n ```javascript\n let post = store.push({\n data: {\n type: 'post',\n id: 1,\n relationships: {\n comments: {\n data: [{ type: 'comment', id: 1 }]\n }\n }\n }\n });\n\n let commentsRef = post.hasMany('comments');\n\n post.get('comments').then(function(comments) {\n commentsRef.value() === comments\n })\n ```\n\n @method value\n @return {DS.ManyArray}\n*/\nHasManyReference.prototype.value = function () {\n if (this._isLoaded()) {\n return this.hasManyRelationship.manyArray;\n }\n\n return null;\n};\n\n/**\n Loads the relationship if it is not already loaded. If the\n relationship is already loaded this method does not trigger a new\n load.\n\n Example\n\n ```app/models/post.js\n export default DS.Model.extend({\n comments: DS.hasMany({ async: true })\n });\n ```\n\n ```javascript\n let post = store.push({\n data: {\n type: 'post',\n id: 1,\n relationships: {\n comments: {\n data: [{ type: 'comment', id: 1 }]\n }\n }\n }\n });\n\n let commentsRef = post.hasMany('comments');\n\n commentsRef.load().then(function(comments) {\n //...\n });\n ```\n\n @method load\n @return {Promise} a promise that resolves with the ManyArray in\n this has-many relationship.\n*/\nHasManyReference.prototype.load = function () {\n if (!this._isLoaded()) {\n return this.hasManyRelationship.getRecords();\n }\n\n return Ember.RSVP.resolve(this.hasManyRelationship.manyArray);\n};\n\n/**\n Reloads this has-many relationship.\n\n Example\n\n ```app/models/post.js\n export default DS.Model.extend({\n comments: DS.hasMany({ async: true })\n });\n ```\n\n ```javascript\n let post = store.push({\n data: {\n type: 'post',\n id: 1,\n relationships: {\n comments: {\n data: [{ type: 'comment', id: 1 }]\n }\n }\n }\n });\n\n let commentsRef = post.hasMany('comments');\n\n commentsRef.reload().then(function(comments) {\n //...\n });\n ```\n\n @method reload\n @return {Promise} a promise that resolves with the ManyArray in this has-many relationship.\n*/\nHasManyReference.prototype.reload = function () {\n return this.hasManyRelationship.reload();\n};\n\nvar emberAssign = Ember.assign || Ember.merge;\n\n/*\n The TransitionChainMap caches the `state.enters`, `state.setups`, and final state reached\n when transitioning from one state to another, so that future transitions can replay the\n transition without needing to walk the state tree, collect these hook calls and determine\n the state to transition into.\n\n A future optimization would be to build a single chained method out of the collected enters\n and setups. It may also be faster to do a two level cache (from: { to }) instead of caching based\n on a key that adds the two together.\n */\nvar TransitionChainMap = Object.create(null);\n\nvar _extractPivotNameCache = Object.create(null);\nvar _splitOnDotCache = Object.create(null);\n\nfunction splitOnDot(name) {\n return _splitOnDotCache[name] || (_splitOnDotCache[name] = name.split('.'));\n}\n\nfunction extractPivotName(name) {\n return _extractPivotNameCache[name] || (_extractPivotNameCache[name] = splitOnDot(name)[0]);\n}\n\nfunction areAllModelsUnloaded(internalModels) {\n for (var i = 0; i < internalModels.length; ++i) {\n var record = internalModels[i]._record;\n if (record && !(record.get('isDestroyed') || record.get('isDestroying'))) {\n return false;\n }\n }\n return true;\n}\n\n// Handle dematerialization for relationship `rel`. In all cases, notify the\n// relatinoship of the dematerialization: this is done so the relationship can\n// notify its inverse which needs to update state\n//\n// If the inverse is sync, unloading this record is treated as a client-side\n// delete, so we remove the inverse records from this relationship to\n// disconnect the graph. Because it's not async, we don't need to keep around\n// the internalModel as an id-wrapper for references and because the graph is\n// disconnected we can actually destroy the internalModel when checking for\n// orphaned models.\nfunction destroyRelationship(rel) {\n rel.internalModelDidDematerialize();\n\n if (rel._inverseIsSync()) {\n // disconnect the graph so that the sync inverse relationship does not\n // prevent us from cleaning up during `_cleanupOrphanedInternalModels`\n rel.removeAllInternalModelsFromOwn();\n rel.removeAllCanonicalInternalModelsFromOwn();\n }\n}\n// this (and all heimdall instrumentation) will be stripped by a babel transform\n// https://github.com/heimdalljs/babel5-plugin-strip-heimdall\n\n\nvar InternalModelReferenceId = 1;\nvar nextBfsId = 1;\n\n/*\n `InternalModel` is the Model class that we use internally inside Ember Data to represent models.\n Internal ED methods should only deal with `InternalModel` objects. It is a fast, plain Javascript class.\n\n We expose `DS.Model` to application code, by materializing a `DS.Model` from `InternalModel` lazily, as\n a performance optimization.\n\n `InternalModel` should never be exposed to application code. At the boundaries of the system, in places\n like `find`, `push`, etc. we convert between Models and InternalModels.\n\n We need to make sure that the properties from `InternalModel` are correctly exposed/proxied on `Model`\n if they are needed.\n\n @private\n @class InternalModel\n*/\nclass InternalModel {\n constructor(modelName, id, store, data) {\n this.id = id;\n\n // this ensure ordered set can quickly identify this as unique\n this[Ember.GUID_KEY] = InternalModelReferenceId++ + 'internal-model';\n\n this.store = store;\n this.modelName = modelName;\n this._loadingPromise = null;\n this._record = null;\n this._isDestroyed = false;\n this.isError = false;\n this._isUpdatingRecordArrays = false; // used by the recordArrayManager\n\n // During dematerialization we don't want to rematerialize the record. The\n // reason this might happen is that dematerialization removes records from\n // record arrays, and Ember arrays will always `objectAt(0)` and\n // `objectAt(len - 1)` to test whether or not `firstObject` or `lastObject`\n // have changed.\n this._isDematerializing = false;\n this._scheduledDestroy = null;\n\n this.resetRecord();\n\n if (data) {\n this.__data = data;\n }\n\n // caches for lazy getters\n this._modelClass = null;\n this.__deferredTriggers = null;\n this.__recordArrays = null;\n this._references = null;\n this._recordReference = null;\n this.__relationships = null;\n this.__implicitRelationships = null;\n\n // Used during the mark phase of unloading to avoid checking the same internal\n // model twice in the same scan\n this._bfsId = 0;\n }\n\n get modelClass() {\n return this._modelClass || (this._modelClass = this.store._modelFor(this.modelName));\n }\n\n get type() {\n return this.modelClass;\n }\n\n get recordReference() {\n if (this._recordReference === null) {\n this._recordReference = new RecordReference(this.store, this);\n }\n return this._recordReference;\n }\n\n get _recordArrays() {\n if (this.__recordArrays === null) {\n this.__recordArrays = OrderedSet.create();\n }\n return this.__recordArrays;\n }\n\n get references() {\n if (this._references === null) {\n this._references = Object.create(null);\n }\n return this._references;\n }\n\n get _deferredTriggers() {\n if (this.__deferredTriggers === null) {\n this.__deferredTriggers = [];\n }\n return this.__deferredTriggers;\n }\n\n get _attributes() {\n if (this.__attributes === null) {\n this.__attributes = Object.create(null);\n }\n return this.__attributes;\n }\n\n set _attributes(v) {\n this.__attributes = v;\n }\n\n get _relationships() {\n if (this.__relationships === null) {\n this.__relationships = new Relationships(this);\n }\n\n return this.__relationships;\n }\n\n get _inFlightAttributes() {\n if (this.__inFlightAttributes === null) {\n this.__inFlightAttributes = Object.create(null);\n }\n return this.__inFlightAttributes;\n }\n\n set _inFlightAttributes(v) {\n this.__inFlightAttributes = v;\n }\n\n get _data() {\n if (this.__data === null) {\n this.__data = Object.create(null);\n }\n return this.__data;\n }\n\n set _data(v) {\n this.__data = v;\n }\n\n /*\n implicit relationships are relationship which have not been declared but the inverse side exists on\n another record somewhere\n For example if there was\n ```app/models/comment.js\n import DS from 'ember-data';\n export default DS.Model.extend({\n name: DS.attr()\n })\n ```\n but there is also\n ```app/models/post.js\n import DS from 'ember-data';\n export default DS.Model.extend({\n name: DS.attr(),\n comments: DS.hasMany('comment')\n })\n ```\n would have a implicit post relationship in order to be do things like remove ourselves from the post\n when we are deleted\n */\n get _implicitRelationships() {\n if (this.__implicitRelationships === null) {\n this.__implicitRelationships = Object.create(null);\n }\n return this.__implicitRelationships;\n }\n\n isHiddenFromRecordArrays() {\n // During dematerialization we don't want to rematerialize the record.\n // recordWasDeleted can cause other records to rematerialize because it\n // removes the internal model from the array and Ember arrays will always\n // `objectAt(0)` and `objectAt(len -1)` to check whether `firstObject` or\n // `lastObject` have changed. When this happens we don't want those\n // models to rematerialize their records.\n\n return this._isDematerializing || this.isDestroyed || this.currentState.stateName === 'root.deleted.saved' || this.isEmpty();\n }\n\n isEmpty() {\n return this.currentState.isEmpty;\n }\n\n isLoading() {\n return this.currentState.isLoading;\n }\n\n isLoaded() {\n return this.currentState.isLoaded;\n }\n\n hasDirtyAttributes() {\n return this.currentState.hasDirtyAttributes;\n }\n\n isSaving() {\n return this.currentState.isSaving;\n }\n\n isDeleted() {\n return this.currentState.isDeleted;\n }\n\n isNew() {\n return this.currentState.isNew;\n }\n\n isValid() {\n return this.currentState.isValid;\n }\n\n dirtyType() {\n return this.currentState.dirtyType;\n }\n\n getRecord(properties) {\n if (!this._record && !this._isDematerializing) {\n\n // lookupFactory should really return an object that creates\n // instances with the injections applied\n var createOptions = {\n store: this.store,\n _internalModel: this,\n id: this.id,\n currentState: this.currentState,\n isError: this.isError,\n adapterError: this.error\n };\n\n if (typeof properties === 'object' && properties !== null) {\n emberAssign(createOptions, properties);\n }\n\n if (Ember.setOwner) {\n // ensure that `getOwner(this)` works inside a model instance\n Ember.setOwner(createOptions, getOwner(this.store));\n } else {\n createOptions.container = this.store.container;\n }\n\n this._record = this.store.modelFactoryFor(this.modelName).create(createOptions);\n\n this._triggerDeferredTriggers();\n }\n\n return this._record;\n }\n\n resetRecord() {\n this._record = null;\n this.isReloading = false;\n this.error = null;\n this.currentState = RootState$1.empty;\n this.__attributes = null;\n this.__inFlightAttributes = null;\n this._data = null;\n }\n\n dematerializeRecord() {\n if (this._record) {\n this._isDematerializing = true;\n this._record.destroy();\n this.destroyRelationships();\n this.updateRecordArrays();\n this.resetRecord();\n }\n }\n\n deleteRecord() {\n this.send('deleteRecord');\n }\n\n save(options) {\n var promiseLabel = \"DS: Model#save \" + this;\n var resolver = Ember.RSVP.defer(promiseLabel);\n\n this.store.scheduleSave(this, resolver, options);\n return resolver.promise;\n }\n\n startedReloading() {\n this.isReloading = true;\n if (this.hasRecord) {\n Ember.set(this._record, 'isReloading', true);\n }\n }\n\n finishedReloading() {\n this.isReloading = false;\n if (this.hasRecord) {\n Ember.set(this._record, 'isReloading', false);\n }\n }\n\n reload() {\n this.startedReloading();\n var internalModel = this;\n var promiseLabel = \"DS: Model#reload of \" + this;\n\n return new Ember.RSVP.Promise(function (resolve) {\n internalModel.send('reloadRecord', resolve);\n }, promiseLabel).then(function () {\n internalModel.didCleanError();\n return internalModel;\n }, function (error) {\n internalModel.didError(error);\n throw error;\n }, \"DS: Model#reload complete, update flags\").finally(function () {\n internalModel.finishedReloading();\n internalModel.updateRecordArrays();\n });\n }\n\n /**\n Computes the set of internal models reachable from `this` across exactly one\n relationship.\n @return {Array} An array containing the internal models that `this` belongs\n to or has many.\n */\n _directlyRelatedInternalModels() {\n var array = [];\n\n this._relationships.forEach((name, rel) => {\n array = array.concat(rel.members.list, rel.canonicalMembers.list);\n });\n return array;\n }\n\n /**\n Computes the set of internal models reachable from this internal model.\n Reachability is determined over the relationship graph (ie a graph where\n nodes are internal models and edges are belongs to or has many\n relationships).\n @return {Array} An array including `this` and all internal models reachable\n from `this`.\n */\n _allRelatedInternalModels() {\n var array = [];\n var queue = [];\n var bfsId = nextBfsId++;\n queue.push(this);\n this._bfsId = bfsId;\n while (queue.length > 0) {\n var node = queue.shift();\n array.push(node);\n var related = node._directlyRelatedInternalModels();\n for (var i = 0; i < related.length; ++i) {\n var internalModel = related[i];\n (true && !(internalModel._bfsId <= bfsId) && Ember.assert('Internal Error: seen a future bfs iteration', internalModel._bfsId <= bfsId));\n\n if (internalModel._bfsId < bfsId) {\n queue.push(internalModel);\n internalModel._bfsId = bfsId;\n }\n }\n }\n return array;\n }\n\n /**\n Unload the record for this internal model. This will cause the record to be\n destroyed and freed up for garbage collection. It will also do a check\n for cleaning up internal models.\n This check is performed by first computing the set of related internal\n models. If all records in this set are unloaded, then the entire set is\n destroyed. Otherwise, nothing in the set is destroyed.\n This means that this internal model will be freed up for garbage collection\n once all models that refer to it via some relationship are also unloaded.\n */\n unloadRecord() {\n if (this.isDestroyed) {\n return;\n }\n this.send('unloadRecord');\n this.dematerializeRecord();\n\n if (this._scheduledDestroy === null) {\n // TODO: use run.schedule once we drop 1.13\n if (!Ember.run.currentRunLoop) {\n (true && !(Ember.testing) && Ember.assert('You have turned on testing mode, which disabled the run-loop\\'s autorun.\\n You will need to wrap any code with asynchronous side-effects in a run', Ember.testing));\n }\n this._scheduledDestroy = Ember.run.backburner.schedule('destroy', this, '_checkForOrphanedInternalModels');\n }\n }\n\n hasScheduledDestroy() {\n return !!this._scheduledDestroy;\n }\n\n cancelDestroy() {\n (true && !(!this.isDestroyed) && Ember.assert(`You cannot cancel the destruction of an InternalModel once it has already been destroyed`, !this.isDestroyed));\n\n\n this._isDematerializing = false;\n Ember.run.cancel(this._scheduledDestroy);\n this._scheduledDestroy = null;\n }\n\n // typically, we prefer to async destroy this lets us batch cleanup work.\n // Unfortunately, some scenarios where that is not possible. Such as:\n //\n // ```js\n // const record = store.find(‘record’, 1);\n // record.unloadRecord();\n // store.createRecord(‘record’, 1);\n // ```\n //\n // In those scenarios, we make that model's cleanup work, sync.\n //\n destroySync() {\n if (this._isDematerializing) {\n this.cancelDestroy();\n }\n this._checkForOrphanedInternalModels();\n if (this.isDestroyed || this.isDestroying) {\n return;\n }\n\n // just in-case we are not one of the orphaned, we should still\n // still destroy ourselves\n this.destroy();\n }\n\n _checkForOrphanedInternalModels() {\n this._isDematerializing = false;\n this._scheduledDestroy = null;\n if (this.isDestroyed) {\n return;\n }\n\n this._cleanupOrphanedInternalModels();\n }\n\n _cleanupOrphanedInternalModels() {\n var relatedInternalModels = this._allRelatedInternalModels();\n if (areAllModelsUnloaded(relatedInternalModels)) {\n for (var i = 0; i < relatedInternalModels.length; ++i) {\n var internalModel = relatedInternalModels[i];\n if (!internalModel.isDestroyed) {\n internalModel.destroy();\n }\n }\n }\n }\n\n eachRelationship(callback, binding) {\n return this.modelClass.eachRelationship(callback, binding);\n }\n\n destroy() {\n (true && !(!this._record || this._record.get('isDestroyed') || this._record.get('isDestroying')) && Ember.assert(\"Cannot destroy an internalModel while its record is materialized\", !this._record || this._record.get('isDestroyed') || this._record.get('isDestroying')));\n\n\n this.store._internalModelDestroyed(this);\n\n this._relationships.forEach((name, rel) => rel.destroy());\n\n this._isDestroyed = true;\n }\n\n eachAttribute(callback, binding) {\n return this.modelClass.eachAttribute(callback, binding);\n }\n\n inverseFor(key) {\n return this.modelClass.inverseFor(key);\n }\n\n setupData(data) {\n this.store._internalModelDidReceiveRelationshipData(this.modelName, this.id, data.relationships);\n\n var changedKeys = void 0;\n\n if (this.hasRecord) {\n changedKeys = this._changedKeys(data.attributes);\n }\n\n emberAssign(this._data, data.attributes);\n this.pushedData();\n\n if (this.hasRecord) {\n this._record._notifyProperties(changedKeys);\n }\n }\n\n get isDestroyed() {\n return this._isDestroyed;\n }\n\n get hasRecord() {\n return !!this._record;\n }\n\n /*\n @method createSnapshot\n @private\n */\n createSnapshot(options) {\n return new Snapshot(this, options);\n }\n\n /*\n @method loadingData\n @private\n @param {Promise} promise\n */\n loadingData(promise) {\n this.send('loadingData', promise);\n }\n\n /*\n @method loadedData\n @private\n */\n loadedData() {\n this.send('loadedData');\n }\n\n /*\n @method notFound\n @private\n */\n notFound() {\n this.send('notFound');\n }\n\n /*\n @method pushedData\n @private\n */\n pushedData() {\n this.send('pushedData');\n }\n\n flushChangedAttributes() {\n this._inFlightAttributes = this._attributes;\n this._attributes = null;\n }\n\n hasChangedAttributes() {\n return this.__attributes !== null && Object.keys(this.__attributes).length > 0;\n }\n\n /*\n Checks if the attributes which are considered as changed are still\n different to the state which is acknowledged by the server.\n This method is needed when data for the internal model is pushed and the\n pushed data might acknowledge dirty attributes as confirmed.\n @method updateChangedAttributes\n @private\n */\n updateChangedAttributes() {\n var changedAttributes = this.changedAttributes();\n var changedAttributeNames = Object.keys(changedAttributes);\n var attrs = this._attributes;\n\n for (var i = 0, length = changedAttributeNames.length; i < length; i++) {\n var attribute = changedAttributeNames[i];\n var data = changedAttributes[attribute];\n var oldData = data[0];\n var newData = data[1];\n\n if (oldData === newData) {\n delete attrs[attribute];\n }\n }\n }\n\n /*\n Returns an object, whose keys are changed properties, and value is an\n [oldProp, newProp] array.\n @method changedAttributes\n @private\n */\n changedAttributes() {\n var oldData = this._data;\n var currentData = this._attributes;\n var inFlightData = this._inFlightAttributes;\n var newData = emberAssign(Ember.copy(inFlightData), currentData);\n var diffData = Object.create(null);\n var newDataKeys = Object.keys(newData);\n\n for (var i = 0, length = newDataKeys.length; i < length; i++) {\n var key = newDataKeys[i];\n diffData[key] = [oldData[key], newData[key]];\n }\n\n return diffData;\n }\n\n /*\n @method adapterWillCommit\n @private\n */\n adapterWillCommit() {\n this.send('willCommit');\n }\n\n /*\n @method adapterDidDirty\n @private\n */\n adapterDidDirty() {\n this.send('becomeDirty');\n this.updateRecordArrays();\n }\n\n /*\n @method send\n @private\n @param {String} name\n @param {Object} context\n */\n send(name, context) {\n var currentState = this.currentState;\n\n if (!currentState[name]) {\n this._unhandledEvent(currentState, name, context);\n }\n\n return currentState[name](this, context);\n }\n\n notifyHasManyAdded(key, record, idx) {\n if (this.hasRecord) {\n this._record.notifyHasManyAdded(key, record, idx);\n }\n }\n\n notifyBelongsToChanged(key, record) {\n if (this.hasRecord) {\n this._record.notifyBelongsToChanged(key, record);\n }\n }\n\n notifyPropertyChange(key) {\n if (this.hasRecord) {\n this._record.notifyPropertyChange(key);\n }\n }\n\n rollbackAttributes() {\n var dirtyKeys = void 0;\n if (this.hasChangedAttributes()) {\n dirtyKeys = Object.keys(this._attributes);\n this._attributes = null;\n }\n\n if (Ember.get(this, 'isError')) {\n this._inFlightAttributes = null;\n this.didCleanError();\n }\n\n if (this.isNew()) {\n this.removeFromInverseRelationships();\n }\n\n if (this.isValid()) {\n this._inFlightAttributes = null;\n }\n\n this.send('rolledBack');\n\n if (dirtyKeys && dirtyKeys.length > 0) {\n this._record._notifyProperties(dirtyKeys);\n }\n }\n\n /*\n @method transitionTo\n @private\n @param {String} name\n */\n transitionTo(name) {\n // POSSIBLE TODO: Remove this code and replace with\n // always having direct reference to state objects\n\n var pivotName = extractPivotName(name);\n var state = this.currentState;\n var transitionMapId = `${state.stateName}->${name}`;\n\n do {\n if (state.exit) {\n state.exit(this);\n }\n state = state.parentState;\n } while (!state[pivotName]);\n\n var setups = void 0;\n var enters = void 0;\n var i = void 0;\n var l = void 0;\n var map = TransitionChainMap[transitionMapId];\n\n if (map) {\n setups = map.setups;\n enters = map.enters;\n state = map.state;\n } else {\n setups = [];\n enters = [];\n\n var path = splitOnDot(name);\n\n for (i = 0, l = path.length; i < l; i++) {\n state = state[path[i]];\n\n if (state.enter) {\n enters.push(state);\n }\n if (state.setup) {\n setups.push(state);\n }\n }\n\n TransitionChainMap[transitionMapId] = { setups, enters, state };\n }\n\n for (i = 0, l = enters.length; i < l; i++) {\n enters[i].enter(this);\n }\n\n this.currentState = state;\n if (this.hasRecord) {\n Ember.set(this._record, 'currentState', state);\n }\n\n for (i = 0, l = setups.length; i < l; i++) {\n setups[i].setup(this);\n }\n\n this.updateRecordArrays();\n }\n\n _unhandledEvent(state, name, context) {\n var errorMessage = \"Attempted to handle event `\" + name + \"` \";\n errorMessage += \"on \" + String(this) + \" while in state \";\n errorMessage += state.stateName + \". \";\n\n if (context !== undefined) {\n errorMessage += \"Called with \" + Ember.inspect(context) + \".\";\n }\n\n throw new Ember.Error(errorMessage);\n }\n\n triggerLater(...args) {\n if (this._deferredTriggers.push(args) !== 1) {\n return;\n }\n\n this.store._updateInternalModel(this);\n }\n\n _triggerDeferredTriggers() {\n //TODO: Before 1.0 we want to remove all the events that happen on the pre materialized record,\n //but for now, we queue up all the events triggered before the record was materialized, and flush\n //them once we have the record\n if (!this.hasRecord) {\n return;\n }\n var triggers = this._deferredTriggers;\n var record = this._record;\n var trigger = record.trigger;\n for (var i = 0, l = triggers.length; i < l; i++) {\n trigger.apply(record, triggers[i]);\n }\n\n triggers.length = 0;\n }\n\n /*\n This method should only be called by records in the `isNew()` state OR once the record\n has been deleted and that deletion has been persisted.\n It will remove this record from any associated relationships.\n @method removeFromInverseRelationships\n @private\n */\n removeFromInverseRelationships() {\n this._relationships.forEach((name, rel) => {\n rel.removeCompletelyFromInverse();\n rel.clear();\n });\n\n var implicitRelationships = this._implicitRelationships;\n this.__implicitRelationships = null;\n\n Object.keys(implicitRelationships).forEach(key => {\n var rel = implicitRelationships[key];\n\n rel.removeCompletelyFromInverse();\n rel.clear();\n });\n }\n\n /*\n Notify all inverses that this internalModel has been dematerialized\n and destroys any ManyArrays.\n */\n destroyRelationships() {\n var relationships = this._relationships;\n relationships.forEach((name, rel) => destroyRelationship(rel));\n\n var implicitRelationships = this._implicitRelationships;\n this.__implicitRelationships = null;\n Object.keys(implicitRelationships).forEach(key => {\n var rel = implicitRelationships[key];\n destroyRelationship(rel);\n });\n }\n\n /*\n When a find request is triggered on the store, the user can optionally pass in\n attributes and relationships to be preloaded. These are meant to behave as if they\n came back from the server, except the user obtained them out of band and is informing\n the store of their existence. The most common use case is for supporting client side\n nested URLs, such as `/posts/1/comments/2` so the user can do\n `store.findRecord('comment', 2, { preload: { post: 1 } })` without having to fetch the post.\n Preloaded data can be attributes and relationships passed in either as IDs or as actual\n models.\n @method preloadData\n @private\n @param {Object} preload\n */\n preloadData(preload) {\n //TODO(Igor) consider the polymorphic case\n Object.keys(preload).forEach(key => {\n var preloadValue = Ember.get(preload, key);\n var relationshipMeta = this.modelClass.metaForProperty(key);\n if (relationshipMeta.isRelationship) {\n this._preloadRelationship(key, preloadValue);\n } else {\n this._data[key] = preloadValue;\n }\n });\n }\n\n _preloadRelationship(key, preloadValue) {\n var relationshipMeta = this.modelClass.metaForProperty(key);\n var modelClass = relationshipMeta.type;\n if (relationshipMeta.kind === 'hasMany') {\n this._preloadHasMany(key, preloadValue, modelClass);\n } else {\n this._preloadBelongsTo(key, preloadValue, modelClass);\n }\n }\n\n _preloadHasMany(key, preloadValue, modelClass) {\n (true && !(Array.isArray(preloadValue)) && Ember.assert(\"You need to pass in an array to set a hasMany property on a record\", Array.isArray(preloadValue)));\n\n var recordsToSet = new Array(preloadValue.length);\n\n for (var i = 0; i < preloadValue.length; i++) {\n var recordToPush = preloadValue[i];\n recordsToSet[i] = this._convertStringOrNumberIntoInternalModel(recordToPush, modelClass);\n }\n\n //We use the pathway of setting the hasMany as if it came from the adapter\n //because the user told us that they know this relationships exists already\n this._relationships.get(key).updateInternalModelsFromAdapter(recordsToSet);\n }\n\n _preloadBelongsTo(key, preloadValue, modelClass) {\n var internalModelToSet = this._convertStringOrNumberIntoInternalModel(preloadValue, modelClass);\n\n //We use the pathway of setting the hasMany as if it came from the adapter\n //because the user told us that they know this relationships exists already\n this._relationships.get(key).setInternalModel(internalModelToSet);\n }\n\n _convertStringOrNumberIntoInternalModel(value, modelClass) {\n if (typeof value === 'string' || typeof value === 'number') {\n return this.store._internalModelForId(modelClass, value);\n }\n if (value._internalModel) {\n return value._internalModel;\n }\n return value;\n }\n\n /*\n Used to notify the store to update FilteredRecordArray membership.\n @method updateRecordArrays\n @private\n */\n updateRecordArrays() {\n this.store.recordArrayManager.recordDidChange(this);\n }\n\n setId(id) {\n (true && !(this.id === null || this.id === id || this.isNew()) && Ember.assert('A record\\'s id cannot be changed once it is in the loaded state', this.id === null || this.id === id || this.isNew()));\n\n this.id = id;\n if (this._record.get('id') !== id) {\n this._record.set('id', id);\n }\n }\n\n didError(error) {\n this.error = error;\n this.isError = true;\n\n if (this.hasRecord) {\n this._record.setProperties({\n isError: true,\n adapterError: error\n });\n }\n }\n\n didCleanError() {\n this.error = null;\n this.isError = false;\n\n if (this.hasRecord) {\n this._record.setProperties({\n isError: false,\n adapterError: null\n });\n }\n }\n\n /*\n If the adapter did not return a hash in response to a commit,\n merge the changed attributes and relationships into the existing\n saved data.\n @method adapterDidCommit\n */\n adapterDidCommit(data) {\n if (data) {\n this.store._internalModelDidReceiveRelationshipData(this.modelName, this.id, data.relationships);\n\n data = data.attributes;\n }\n\n this.didCleanError();\n var changedKeys = this._changedKeys(data);\n\n emberAssign(this._data, this._inFlightAttributes);\n if (data) {\n emberAssign(this._data, data);\n }\n\n this._inFlightAttributes = null;\n\n this.send('didCommit');\n this.updateRecordArrays();\n\n if (!data) {\n return;\n }\n\n this._record._notifyProperties(changedKeys);\n }\n\n addErrorMessageToAttribute(attribute, message) {\n Ember.get(this.getRecord(), 'errors')._add(attribute, message);\n }\n\n removeErrorMessageFromAttribute(attribute) {\n Ember.get(this.getRecord(), 'errors')._remove(attribute);\n }\n\n clearErrorMessages() {\n Ember.get(this.getRecord(), 'errors')._clear();\n }\n\n hasErrors() {\n var errors = Ember.get(this.getRecord(), 'errors');\n\n return !Ember.isEmpty(errors);\n }\n\n // FOR USE DURING COMMIT PROCESS\n\n /*\n @method adapterDidInvalidate\n @private\n */\n adapterDidInvalidate(errors) {\n var attribute = void 0;\n\n for (attribute in errors) {\n if (errors.hasOwnProperty(attribute)) {\n this.addErrorMessageToAttribute(attribute, errors[attribute]);\n }\n }\n\n this.send('becameInvalid');\n\n this._saveWasRejected();\n }\n\n /*\n @method adapterDidError\n @private\n */\n adapterDidError(error) {\n this.send('becameError');\n this.didError(error);\n this._saveWasRejected();\n }\n\n _saveWasRejected() {\n var keys = Object.keys(this._inFlightAttributes);\n if (keys.length > 0) {\n var attrs = this._attributes;\n for (var i = 0; i < keys.length; i++) {\n if (attrs[keys[i]] === undefined) {\n attrs[keys[i]] = this._inFlightAttributes[keys[i]];\n }\n }\n }\n this._inFlightAttributes = null;\n }\n\n /*\n Ember Data has 3 buckets for storing the value of an attribute on an internalModel.\n `_data` holds all of the attributes that have been acknowledged by\n a backend via the adapter. When rollbackAttributes is called on a model all\n attributes will revert to the record's state in `_data`.\n `_attributes` holds any change the user has made to an attribute\n that has not been acknowledged by the adapter. Any values in\n `_attributes` are have priority over values in `_data`.\n `_inFlightAttributes`. When a record is being synced with the\n backend the values in `_attributes` are copied to\n `_inFlightAttributes`. This way if the backend acknowledges the\n save but does not return the new state Ember Data can copy the\n values from `_inFlightAttributes` to `_data`. Without having to\n worry about changes made to `_attributes` while the save was\n happenign.\n Changed keys builds a list of all of the values that may have been\n changed by the backend after a successful save.\n It does this by iterating over each key, value pair in the payload\n returned from the server after a save. If the `key` is found in\n `_attributes` then the user has a local changed to the attribute\n that has not been synced with the server and the key is not\n included in the list of changed keys.\n \n If the value, for a key differs from the value in what Ember Data\n believes to be the truth about the backend state (A merger of the\n `_data` and `_inFlightAttributes` objects where\n `_inFlightAttributes` has priority) then that means the backend\n has updated the value and the key is added to the list of changed\n keys.\n @method _changedKeys\n @private\n */\n _changedKeys(updates) {\n var changedKeys = [];\n\n if (updates) {\n var original = void 0,\n i = void 0,\n value = void 0,\n key = void 0;\n var keys = Object.keys(updates);\n var length = keys.length;\n var hasAttrs = this.hasChangedAttributes();\n var attrs = void 0;\n if (hasAttrs) {\n attrs = this._attributes;\n }\n\n original = emberAssign(Object.create(null), this._data);\n original = emberAssign(original, this._inFlightAttributes);\n\n for (i = 0; i < length; i++) {\n key = keys[i];\n value = updates[key];\n\n // A value in _attributes means the user has a local change to\n // this attributes. We never override this value when merging\n // updates from the backend so we should not sent a change\n // notification if the server value differs from the original.\n if (hasAttrs === true && attrs[key] !== undefined) {\n continue;\n }\n\n if (!Ember.isEqual(original[key], value)) {\n changedKeys.push(key);\n }\n }\n }\n\n return changedKeys;\n }\n\n toString() {\n return `<${this.modelName}:${this.id}>`;\n }\n\n referenceFor(kind, name) {\n var reference = this.references[name];\n\n if (!reference) {\n var relationship = this._relationships.get(name);\n\n {\n var modelName = this.modelName;\n (true && !(relationship) && Ember.assert(`There is no ${kind} relationship named '${name}' on a model of modelClass '${modelName}'`, relationship));\n\n\n var actualRelationshipKind = relationship.relationshipMeta.kind;\n (true && !(actualRelationshipKind === kind) && Ember.assert(`You tried to get the '${name}' relationship on a '${modelName}' via record.${kind}('${name}'), but the relationship is of kind '${actualRelationshipKind}'. Use record.${actualRelationshipKind}('${name}') instead.`, actualRelationshipKind === kind));\n }\n\n if (kind === \"belongsTo\") {\n reference = new BelongsToReference(this.store, this, relationship);\n } else if (kind === \"hasMany\") {\n reference = new HasManyReference(this.store, this, relationship);\n }\n\n this.references[name] = reference;\n }\n\n return reference;\n }\n}\n\nif (isEnabled('ds-rollback-attribute')) {\n /*\n Returns the latest truth for an attribute - the canonical value, or the\n in-flight value.\n @method lastAcknowledgedValue\n @private\n */\n InternalModel.prototype.lastAcknowledgedValue = function lastAcknowledgedValue(key) {\n if (key in this._inFlightAttributes) {\n return this._inFlightAttributes[key];\n } else {\n return this._data[key];\n }\n };\n}\n\n/**\n `InternalModelMap` is a custom storage map for internalModels of a given modelName\n used by `IdentityMap`.\n\n It was extracted from an implicit pojo based \"internalModel map\" and preserves\n that interface while we work towards a more official API.\n\n @class InternalModelMap\n @private\n */\nclass InternalModelMap {\n constructor(modelName) {\n this.modelName = modelName;\n this._idToModel = Object.create(null);\n this._models = [];\n this._metadata = null;\n }\n\n /**\n *\n * @param id\n * @returns {InternalModel}\n */\n get(id) {\n return this._idToModel[id];\n }\n\n has(id) {\n return !!this._idToModel[id];\n }\n\n get length() {\n return this._models.length;\n }\n\n set(id, internalModel) {\n (true && !(id) && Ember.assert(`You cannot index an internalModel by an empty id'`, id));\n (true && !(internalModel instanceof InternalModel) && Ember.assert(`You cannot set an index for an internalModel to something other than an internalModel`, internalModel instanceof InternalModel));\n (true && !(this.contains(internalModel)) && Ember.assert(`You cannot set an index for an internalModel that is not in the InternalModelMap`, this.contains(internalModel)));\n (true && !(!this.has(id) || this.get(id) === internalModel) && Ember.assert(`You cannot update the id index of an InternalModel once set. Attempted to update ${id}.`, !this.has(id) || this.get(id) === internalModel));\n\n\n this._idToModel[id] = internalModel;\n }\n\n add(internalModel, id) {\n (true && !(!this.contains(internalModel)) && Ember.assert(`You cannot re-add an already present InternalModel to the InternalModelMap.`, !this.contains(internalModel)));\n\n\n if (id) {\n this._idToModel[id] = internalModel;\n }\n\n this._models.push(internalModel);\n }\n\n remove(internalModel, id) {\n delete this._idToModel[id];\n\n var loc = this._models.indexOf(internalModel);\n\n if (loc !== -1) {\n this._models.splice(loc, 1);\n }\n }\n\n contains(internalModel) {\n return this._models.indexOf(internalModel) !== -1;\n }\n\n /**\n An array of all models of this modelName\n */\n get models() {\n return this._models;\n }\n\n /**\n * meta information about internalModels\n */\n get metadata() {\n return this._metadata || (this._metadata = Object.create(null));\n }\n\n /**\n deprecated (and unsupported) way of accessing modelClass\n @deprecated\n */\n get type() {\n throw new Error('InternalModelMap.type is no longer available');\n }\n\n /**\n Destroy all models in the internalModelTest and wipe metadata.\n @method clear\n */\n clear() {\n var models = this._models;\n this._models = [];\n\n for (var i = 0; i < models.length; i++) {\n var model = models[i];\n model.unloadRecord();\n }\n\n this._metadata = null;\n }\n\n}\n\n/**\n `IdentityMap` is a custom storage map for records by modelName\n used by `DS.Store`.\n\n @class IdentityMap\n @private\n */\nclass IdentityMap {\n constructor() {\n this._map = Object.create(null);\n }\n\n /**\n Retrieves the `InternalModelMap` for a given modelName,\n creating one if one did not already exist. This is\n similar to `getWithDefault` or `get` on a `MapWithDefault`\n @method retrieve\n @param modelName a previously normalized modelName\n @returns {InternalModelMap} the InternalModelMap for the given modelName\n */\n retrieve(modelName) {\n var map = this._map[modelName];\n\n if (map === undefined) {\n map = this._map[modelName] = new InternalModelMap(modelName);\n }\n\n return map;\n }\n\n /**\n Clears the contents of all known `RecordMaps`, but does\n not remove the InternalModelMap instances.\n @method clear\n */\n clear() {\n var map = this._map;\n var keys = Object.keys(map);\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n map[key].clear();\n }\n }\n}\n\n/*\n This is a helper method that validates a JSON API top-level document\n\n The format of a document is described here:\n http://jsonapi.org/format/#document-top-level\n\n @method validateDocumentStructure\n @param {Object} doc JSON API document\n @return {array} An array of errors found in the document structure\n*/\nfunction validateDocumentStructure(doc) {\n var errors = [];\n if (!doc || typeof doc !== 'object') {\n errors.push('Top level of a JSON API document must be an object');\n } else {\n if (!('data' in doc) && !('errors' in doc) && !('meta' in doc)) {\n errors.push('One or more of the following keys must be present: \"data\", \"errors\", \"meta\".');\n } else {\n if ('data' in doc && 'errors' in doc) {\n errors.push('Top level keys \"errors\" and \"data\" cannot both be present in a JSON API document');\n }\n }\n if ('data' in doc) {\n if (!(doc.data === null || Array.isArray(doc.data) || typeof doc.data === 'object')) {\n errors.push('data must be null, an object, or an array');\n }\n }\n if ('meta' in doc) {\n if (typeof doc.meta !== 'object') {\n errors.push('meta must be an object');\n }\n }\n if ('errors' in doc) {\n if (!Array.isArray(doc.errors)) {\n errors.push('errors must be an array');\n }\n }\n if ('links' in doc) {\n if (typeof doc.links !== 'object') {\n errors.push('links must be an object');\n }\n }\n if ('jsonapi' in doc) {\n if (typeof doc.jsonapi !== 'object') {\n errors.push('jsonapi must be an object');\n }\n }\n if ('included' in doc) {\n if (typeof doc.included !== 'object') {\n errors.push('included must be an array');\n }\n }\n }\n\n return errors;\n}\n\n/*\n This is a helper method that always returns a JSON-API Document.\n\n @method normalizeResponseHelper\n @param {DS.Serializer} serializer\n @param {DS.Store} store\n @param {subclass of DS.Model} modelClass\n @param {Object} payload\n @param {String|Number} id\n @param {String} requestType\n @return {Object} JSON-API Document\n*/\nfunction normalizeResponseHelper(serializer, store, modelClass, payload, id, requestType) {\n var normalizedResponse = serializer.normalizeResponse(store, modelClass, payload, id, requestType);\n var validationErrors = [];\n {\n validationErrors = validateDocumentStructure(normalizedResponse);\n }\n (true && !(Ember.isEmpty(validationErrors)) && Ember.assert(`normalizeResponse must return a valid JSON API document:\\n\\t* ${validationErrors.join('\\n\\t* ')}`, Ember.isEmpty(validationErrors)));\n\n\n return normalizedResponse;\n}\n\nfunction serializerForAdapter(store, adapter, modelName) {\n var serializer = adapter.serializer;\n\n if (serializer === undefined) {\n serializer = store.serializerFor(modelName);\n }\n\n if (serializer === null || serializer === undefined) {\n serializer = {\n extract(store, type, payload) {\n return payload;\n }\n };\n }\n\n return serializer;\n}\n\n// TODO this is now VERY similar to the identity/internal-model map\n// so we should probably generalize\nclass TypeCache {\n constructor() {\n this.types = Object.create(null);\n }\n get(modelName, id) {\n var { types } = this;\n\n if (types[modelName] !== undefined) {\n return types[modelName][id];\n }\n }\n\n set(modelName, id, payload) {\n var { types } = this;\n var typeMap = types[modelName];\n\n if (typeMap === undefined) {\n typeMap = types[modelName] = Object.create(null);\n }\n\n typeMap[id] = payload;\n }\n\n delete(modelName, id) {\n var { types } = this;\n\n if (types[modelName] !== undefined) {\n delete types[modelName][id];\n }\n }\n}\n\n/**\n Manages the payloads for both sides of a single relationship, across all model\n instances.\n\n For example, with\n\n const User = DS.Model.extend({\n hobbies: DS.hasMany('hobby')\n });\n\n const Hobby = DS.Model.extend({\n user: DS.belongsTo('user')\n });\n\n let relationshipPayloads = new RelationshipPayloads('user', 'hobbies', 'hobby', 'user');\n\n let userPayload = {\n data: {\n id: 1,\n type: 'user',\n relationships: {\n hobbies: {\n data: [{\n id: 2,\n type: 'hobby',\n }]\n }\n }\n }\n };\n\n // here we expect the payload of the individual relationship\n relationshipPayloads.push('user', 1, 'hobbies', userPayload.data.relationships.hobbies);\n\n relationshipPayloads.get('user', 1, 'hobbies');\n relationshipPayloads.get('hobby', 2, 'user');\n\n @class RelationshipPayloads\n @private\n */\nclass RelationshipPayloads {\n constructor(relInfo) {\n this._relInfo = relInfo;\n\n // a map of id -> payloads for the left hand side of the relationship.\n this.lhs_payloads = new TypeCache();\n this.rhs_payloads = relInfo.isReflexive ? this.lhs_payloads : new TypeCache();\n\n // When we push relationship payloads, just stash them in a queue until\n // somebody actually asks for one of them.\n //\n // This is a queue of the relationship payloads that have been pushed for\n // either side of this relationship\n this._pendingPayloads = [];\n }\n\n /**\n Get the payload for the relationship of an individual record.\n This might return the raw payload as pushed into the store, or one computed\n from the payload of the inverse relationship.\n @method\n */\n get(modelName, id, relationshipName) {\n this._flushPending();\n\n if (this._isLHS(modelName, relationshipName)) {\n return this.lhs_payloads.get(modelName, id);\n } else {\n (true && !(this._isRHS(modelName, relationshipName)) && Ember.assert(`${modelName}:${relationshipName} is not either side of this relationship, ${this._relInfo.lhs_key}<->${this._relInfo.rhs_key}`, this._isRHS(modelName, relationshipName)));\n\n return this.rhs_payloads.get(modelName, id);\n }\n }\n\n /**\n Push a relationship payload for an individual record.\n This will make the payload available later for both this relationship and its inverse.\n @method\n */\n push(modelName, id, relationshipName, relationshipData) {\n this._pendingPayloads.push([modelName, id, relationshipName, relationshipData]);\n }\n\n /**\n Unload the relationship payload for an individual record.\n This does not unload the inverse relationship payload.\n @method\n */\n unload(modelName, id, relationshipName) {\n this._flushPending();\n\n if (this._isLHS(modelName, relationshipName)) {\n delete this.lhs_payloads.delete(modelName, id);\n } else {\n (true && !(this._isRHS(modelName, relationshipName)) && Ember.assert(`${modelName}:${relationshipName} is not either side of this relationship, ${this._relInfo.lhs_baseModelName}:${this._relInfo.lhs_relationshipName}<->${this._relInfo.rhs_baseModelName}:${this._relInfo.rhs_relationshipName}`, this._isRHS(modelName, relationshipName)));\n\n delete this.rhs_payloads.delete(modelName, id);\n }\n }\n\n /**\n @return {boolean} true iff `modelName` and `relationshipName` refer to the\n left hand side of this relationship, as opposed to the right hand side.\n @method\n */\n _isLHS(modelName, relationshipName) {\n var relInfo = this._relInfo;\n var isSelfReferential = relInfo.isSelfReferential;\n var isRelationship = relationshipName === relInfo.lhs_relationshipName;\n\n if (isRelationship === true) {\n return isSelfReferential === true || // itself\n modelName === relInfo.lhs_baseModelName || // base or non-polymorphic\n relInfo.lhs_modelNames.indexOf(modelName) !== -1; // polymorphic\n }\n\n return false;\n }\n\n /**\n @return {boolean} true iff `modelName` and `relationshipName` refer to the\n right hand side of this relationship, as opposed to the left hand side.\n @method\n */\n _isRHS(modelName, relationshipName) {\n var relInfo = this._relInfo;\n var isSelfReferential = relInfo.isSelfReferential;\n var isRelationship = relationshipName === relInfo.rhs_relationshipName;\n\n if (isRelationship === true) {\n return isSelfReferential === true || // itself\n modelName === relInfo.rhs_baseModelName || // base or non-polymorphic\n relInfo.rhs_modelNames.indexOf(modelName) !== -1; // polymorphic\n }\n\n return false;\n }\n\n _flushPending() {\n if (this._pendingPayloads.length === 0) {\n return;\n }\n\n var payloadsToBeProcessed = this._pendingPayloads.splice(0, this._pendingPayloads.length);\n for (var i = 0; i < payloadsToBeProcessed.length; ++i) {\n var modelName = payloadsToBeProcessed[i][0];\n var id = payloadsToBeProcessed[i][1];\n var relationshipName = payloadsToBeProcessed[i][2];\n var relationshipData = payloadsToBeProcessed[i][3];\n\n // TODO: maybe delay this allocation slightly?\n var inverseRelationshipData = {\n data: {\n id: id,\n type: modelName\n }\n };\n\n // start flushing this individual payload. The logic is the same whether\n // it's for the left hand side of the relationship or the right hand side,\n // except the role of primary and inverse idToPayloads is reversed\n //\n var previousPayload = void 0;\n var payloadMap = void 0;\n var inversePayloadMap = void 0;\n var inverseIsMany = void 0;\n\n if (this._isLHS(modelName, relationshipName)) {\n previousPayload = this.lhs_payloads.get(modelName, id);\n payloadMap = this.lhs_payloads;\n inversePayloadMap = this.rhs_payloads;\n inverseIsMany = this._rhsRelationshipIsMany;\n } else {\n (true && !(this._isRHS(modelName, relationshipName)) && Ember.assert(`${modelName}:${relationshipName} is not either side of this relationship, ${this._relInfo.lhs_key}<->${this._relInfo.rhs_key}`, this._isRHS(modelName, relationshipName)));\n\n previousPayload = this.rhs_payloads.get(modelName, id);\n payloadMap = this.rhs_payloads;\n inversePayloadMap = this.lhs_payloads;\n inverseIsMany = this._lhsRelationshipIsMany;\n }\n\n // actually flush this individual payload\n //\n // We remove the previous inverse before populating our current one\n // because we may have multiple payloads for the same relationship, in\n // which case the last one wins.\n //\n // eg if user hasMany helicopters, and helicopter belongsTo user and we see\n //\n // [{\n // data: {\n // id: 1,\n // type: 'helicopter',\n // relationships: {\n // user: {\n // id: 2,\n // type: 'user'\n // }\n // }\n // }\n // }, {\n // data: {\n // id: 1,\n // type: 'helicopter',\n // relationships: {\n // user: {\n // id: 4,\n // type: 'user'\n // }\n // }\n // }\n // }]\n //\n // Then we will initially have set user:2 as having helicopter:1, which we\n // need to remove before adding helicopter:1 to user:4\n //\n // only remove relationship information before adding if there is relationshipData.data\n // * null is considered new information \"empty\", and it should win\n // * undefined is NOT considered new information, we should keep original state\n // * anything else is considered new information, and it should win\n if (relationshipData.data !== undefined) {\n this._removeInverse(id, previousPayload, inversePayloadMap);\n }\n payloadMap.set(modelName, id, relationshipData);\n this._populateInverse(relationshipData, inverseRelationshipData, inversePayloadMap, inverseIsMany);\n }\n }\n\n /**\n Populate the inverse relationship for `relationshipData`.\n If `relationshipData` is an array (eg because the relationship is hasMany)\n this means populate each inverse, otherwise populate only the single\n inverse.\n @private\n @method\n */\n _populateInverse(relationshipData, inversePayload, inversePayloadMap, inverseIsMany) {\n if (!relationshipData.data) {\n // This id doesn't have an inverse, eg a belongsTo with a payload\n // { data: null }, so there's nothing to populate\n return;\n }\n\n if (Array.isArray(relationshipData.data)) {\n for (var i = 0; i < relationshipData.data.length; ++i) {\n var resourceIdentifier = relationshipData.data[i];\n this._addToInverse(inversePayload, resourceIdentifier, inversePayloadMap, inverseIsMany);\n }\n } else {\n var _resourceIdentifier = relationshipData.data;\n this._addToInverse(inversePayload, _resourceIdentifier, inversePayloadMap, inverseIsMany);\n }\n }\n\n /**\n Actually add `inversePayload` to `inverseIdToPayloads`. This is part of\n `_populateInverse` after we've normalized the case of `relationshipData`\n being either an array or a pojo.\n We still have to handle the case that the *inverse* relationship payload may\n be an array or pojo.\n @private\n @method\n */\n _addToInverse(inversePayload, resourceIdentifier, inversePayloadMap, inverseIsMany) {\n var relInfo = this._relInfo;\n\n if (relInfo.isReflexive && inversePayload.data.id === resourceIdentifier.id) {\n // eg <user:1>.friends = [{ id: 1, type: 'user' }]\n return;\n }\n\n var existingPayload = inversePayloadMap.get(resourceIdentifier.type, resourceIdentifier.id);\n var existingData = existingPayload && existingPayload.data;\n\n if (existingData) {\n // There already is an inverse, either add or overwrite depehnding on\n // whether the inverse is a many relationship or not\n //\n if (Array.isArray(existingData)) {\n existingData.push(inversePayload.data);\n } else {\n inversePayloadMap.set(resourceIdentifier.type, resourceIdentifier.id, inversePayload);\n }\n } else {\n // first time we're populating the inverse side\n //\n if (inverseIsMany) {\n inversePayloadMap.set(resourceIdentifier.type, resourceIdentifier.id, {\n data: [inversePayload.data]\n });\n } else {\n inversePayloadMap.set(resourceIdentifier.type, resourceIdentifier.id, inversePayload);\n }\n }\n }\n\n get _lhsRelationshipIsMany() {\n var meta = this._relInfo.lhs_relationshipMeta;\n return meta !== null && meta.kind === 'hasMany';\n }\n\n get _rhsRelationshipIsMany() {\n var meta = this._relInfo.rhs_relationshipMeta;\n return meta !== null && meta.kind === 'hasMany';\n }\n\n /**\n Remove the relationship in `previousPayload` from its inverse(s), because\n this relationship payload has just been updated (eg because the same\n relationship had multiple payloads pushed before the relationship was\n initialized).\n @method\n */\n _removeInverse(id, previousPayload, inversePayloadMap) {\n var data = previousPayload && previousPayload.data;\n if (!data) {\n // either this is the first time we've seen a payload for this id, or its\n // previous payload indicated that it had no inverse, eg a belongsTo\n // relationship with payload { data: null }\n //\n // In either case there's nothing that needs to be removed from the\n // inverse map of payloads\n return;\n }\n\n if (Array.isArray(data)) {\n // TODO: diff rather than removeall addall?\n for (var i = 0; i < data.length; ++i) {\n var resourceIdentifier = data[i];\n this._removeFromInverse(id, resourceIdentifier, inversePayloadMap);\n }\n } else {\n this._removeFromInverse(id, data, inversePayloadMap);\n }\n }\n\n /**\n Remove `id` from its inverse record with id `inverseId`. If the inverse\n relationship is a belongsTo, this means just setting it to null, if the\n inverse relationship is a hasMany, then remove that id from its array of ids.\n @method\n */\n _removeFromInverse(id, resourceIdentifier, inversePayloads) {\n var inversePayload = inversePayloads.get(resourceIdentifier.type, resourceIdentifier.id);\n var data = inversePayload && inversePayload.data;\n\n if (!data) {\n return;\n }\n\n if (Array.isArray(data)) {\n inversePayload.data = data.filter(x => x.id !== id);\n } else {\n inversePayloads.set(resourceIdentifier.type, resourceIdentifier.id, {\n data: null\n });\n }\n }\n}\n\n/**\n Manages relationship payloads for a given store, for uninitialized\n relationships. Acts as a single source of truth (of payloads) for both sides\n of an uninitialized relationship so they can agree on the most up-to-date\n payload received without needing too much eager processing when those payloads\n are pushed into the store.\n\n This minimizes the work spent on relationships that are never initialized.\n\n Once relationships are initialized, their state is managed in a relationship\n state object (eg BelongsToRelationship or ManyRelationship).\n\n\n @example\n\n let relationshipPayloadsManager = new RelationshipPayloadsManager(store);\n\n const User = DS.Model.extend({\n hobbies: DS.hasMany('hobby')\n });\n\n const Hobby = DS.Model.extend({\n user: DS.belongsTo('user')\n });\n\n let userPayload = {\n data: {\n id: 1,\n type: 'user',\n relationships: {\n hobbies: {\n data: [{\n id: 2,\n type: 'hobby'\n }]\n }\n }\n },\n };\n relationshipPayloadsManager.push('user', 1, userPayload.data.relationships);\n\n relationshipPayloadsManager.get('hobby', 2, 'user') === {\n {\n data: {\n id: 1,\n type: 'user'\n }\n }\n }\n\n @private\n @class RelationshipPayloadsManager\n*/\n\n// import { DEBUG } from '@glimmer/env';\nclass RelationshipPayloadsManager {\n constructor(store) {\n this._store = store;\n // cache of `RelationshipPayload`s\n this._cache = Object.create(null);\n this._inverseLookupCache = new TypeCache();\n }\n\n /**\n Find the payload for the given relationship of the given model.\n Returns the payload for the given relationship, whether raw or computed from\n the payload of the inverse relationship.\n @example\n relationshipPayloadsManager.get('hobby', 2, 'user') === {\n {\n data: {\n id: 1,\n type: 'user'\n }\n }\n }\n @method\n */\n get(modelName, id, relationshipName) {\n var relationshipPayloads = this._getRelationshipPayloads(modelName, relationshipName, false);\n return relationshipPayloads && relationshipPayloads.get(modelName, id, relationshipName);\n }\n\n /**\n Push a model's relationships payload into this cache.\n @example\n let userPayload = {\n data: {\n id: 1,\n type: 'user',\n relationships: {\n hobbies: {\n data: [{\n id: 2,\n type: 'hobby'\n }]\n }\n }\n },\n };\n relationshipPayloadsManager.push('user', 1, userPayload.data.relationships);\n @method\n */\n push(modelName, id, relationshipsData) {\n if (!relationshipsData) {\n return;\n }\n\n Object.keys(relationshipsData).forEach(key => {\n var relationshipPayloads = this._getRelationshipPayloads(modelName, key, true);\n if (relationshipPayloads) {\n relationshipPayloads.push(modelName, id, key, relationshipsData[key]);\n }\n });\n }\n\n /**\n Unload a model's relationships payload.\n @method\n */\n unload(modelName, id) {\n var modelClass = this._store._modelFor(modelName);\n var relationshipsByName = Ember.get(modelClass, 'relationshipsByName');\n relationshipsByName.forEach((_, relationshipName) => {\n var relationshipPayloads = this._getRelationshipPayloads(modelName, relationshipName, false);\n if (relationshipPayloads) {\n relationshipPayloads.unload(modelName, id, relationshipName);\n }\n });\n }\n\n /**\n Find the RelationshipPayloads object for the given relationship. The same\n RelationshipPayloads object is returned for either side of a relationship.\n @example\n const User = DS.Model.extend({\n hobbies: DS.hasMany('hobby')\n });\n const Hobby = DS.Model.extend({\n user: DS.belongsTo('user')\n });\n relationshipPayloads.get('user', 'hobbies') === relationshipPayloads.get('hobby', 'user');\n The signature has a somewhat large arity to avoid extra work, such as\n a) string manipulation & allocation with `modelName` and\n `relationshipName`\n b) repeatedly getting `relationshipsByName` via `Ember.get`\n @private\n @method\n */\n _getRelationshipPayloads(modelName, relationshipName, init) {\n var relInfo = this.getRelationshipInfo(modelName, relationshipName);\n\n if (relInfo === null) {\n return;\n }\n\n var cache = this._cache[relInfo.lhs_key];\n\n if (!cache && init) {\n return this._initializeRelationshipPayloads(relInfo);\n }\n\n return cache;\n }\n\n getRelationshipInfo(modelName, relationshipName) {\n var inverseCache = this._inverseLookupCache;\n var store = this._store;\n var cached = inverseCache.get(modelName, relationshipName);\n\n // CASE: We have a cached resolution (null if no relationship exists)\n if (cached !== undefined) {\n return cached;\n }\n\n var modelClass = store._modelFor(modelName);\n var relationshipsByName = Ember.get(modelClass, 'relationshipsByName');\n\n // CASE: We don't have a relationship at all\n if (!relationshipsByName.has(relationshipName)) {\n inverseCache.set(modelName, relationshipName, null);\n return null;\n }\n\n var inverseMeta = modelClass.inverseFor(relationshipName, store);\n var relationshipMeta = relationshipsByName.get(relationshipName);\n var selfIsPolymorphic = relationshipMeta.options !== undefined && relationshipMeta.options.polymorphic === true;\n var inverseBaseModelName = relationshipMeta.type;\n\n // CASE: We have no inverse\n if (!inverseMeta) {\n var _info = {\n lhs_key: `${modelName}:${relationshipName}`,\n lhs_modelNames: [modelName],\n lhs_baseModelName: modelName,\n lhs_relationshipName: relationshipName,\n lhs_relationshipMeta: relationshipMeta,\n lhs_isPolymorphic: selfIsPolymorphic,\n rhs_key: '',\n rhs_modelNames: [],\n rhs_baseModelName: inverseBaseModelName,\n rhs_relationshipName: '',\n rhs_relationshipMeta: null,\n rhs_isPolymorphic: false,\n hasInverse: false,\n isSelfReferential: false, // modelName === inverseBaseModelName,\n isReflexive: false\n };\n\n inverseCache.set(modelName, relationshipName, _info);\n\n return _info;\n }\n\n // CASE: We do have an inverse\n\n var inverseRelationshipName = inverseMeta.name;\n var inverseRelationshipMeta = Ember.get(inverseMeta.type, 'relationshipsByName').get(inverseRelationshipName);\n var baseModelName = inverseRelationshipMeta.type;\n var isSelfReferential = baseModelName === inverseBaseModelName;\n\n // TODO we want to assert this but this breaks all of our shoddily written tests\n /*\n if (DEBUG) {\n let inverseDoubleCheck = inverseMeta.type.inverseFor(inverseRelationshipName, store);\n assert(`The ${inverseBaseModelName}:${inverseRelationshipName} relationship declares 'inverse: null', but it was resolved as the inverse for ${baseModelName}:${relationshipName}.`, inverseDoubleCheck);\n }\n */\n\n // CASE: We may have already discovered the inverse for the baseModelName\n // CASE: We have already discovered the inverse\n cached = inverseCache.get(baseModelName, relationshipName) || inverseCache.get(inverseBaseModelName, inverseRelationshipName);\n if (cached) {\n // TODO this assert can be removed if the above assert is enabled\n (true && !(cached.hasInverse !== false) && Ember.assert(`The ${inverseBaseModelName}:${inverseRelationshipName} relationship declares 'inverse: null', but it was resolved as the inverse for ${baseModelName}:${relationshipName}.`, cached.hasInverse !== false));\n\n\n var isLHS = cached.lhs_baseModelName === baseModelName;\n var modelNames = isLHS ? cached.lhs_modelNames : cached.rhs_modelNames;\n // make this lookup easier in the future by caching the key\n modelNames.push(modelName);\n inverseCache.set(modelName, relationshipName, cached);\n\n return cached;\n }\n\n var info = {\n lhs_key: `${baseModelName}:${relationshipName}`,\n lhs_modelNames: [modelName],\n lhs_baseModelName: baseModelName,\n lhs_relationshipName: relationshipName,\n lhs_relationshipMeta: relationshipMeta,\n lhs_isPolymorphic: selfIsPolymorphic,\n rhs_key: `${inverseBaseModelName}:${inverseRelationshipName}`,\n rhs_modelNames: [],\n rhs_baseModelName: inverseBaseModelName,\n rhs_relationshipName: inverseRelationshipName,\n rhs_relationshipMeta: inverseRelationshipMeta,\n rhs_isPolymorphic: inverseRelationshipMeta.options !== undefined && inverseRelationshipMeta.options.polymorphic === true,\n hasInverse: true,\n isSelfReferential,\n isReflexive: isSelfReferential && relationshipName === inverseRelationshipName\n };\n\n // Create entries for the baseModelName as well as modelName to speed up\n // inverse lookups\n inverseCache.set(baseModelName, relationshipName, info);\n inverseCache.set(modelName, relationshipName, info);\n\n // Greedily populate the inverse\n inverseCache.set(inverseBaseModelName, inverseRelationshipName, info);\n\n return info;\n }\n\n /**\n Create the `RelationshipsPayload` for the relationship `modelName`, `relationshipName`, and its inverse.\n @private\n @method\n */\n _initializeRelationshipPayloads(relInfo) {\n var lhsKey = relInfo.lhs_key;\n var rhsKey = relInfo.rhs_key;\n var existingPayloads = this._cache[lhsKey];\n\n if (relInfo.hasInverse === true && relInfo.rhs_isPolymorphic === true) {\n existingPayloads = this._cache[rhsKey];\n\n if (existingPayloads !== undefined) {\n this._cache[lhsKey] = existingPayloads;\n return existingPayloads;\n }\n }\n\n // populate the cache for both sides of the relationship, as they both use\n // the same `RelationshipPayloads`.\n //\n // This works out better than creating a single common key, because to\n // compute that key we would need to do work to look up the inverse\n //\n var cache = this._cache[lhsKey] = new RelationshipPayloads(relInfo);\n\n if (relInfo.hasInverse === true) {\n this._cache[rhsKey] = cache;\n }\n\n return cache;\n }\n}\n\nfunction payloadIsNotBlank(adapterPayload) {\n if (Array.isArray(adapterPayload)) {\n return true;\n } else {\n return Object.keys(adapterPayload || {}).length;\n }\n}\n\nfunction _find(adapter, store, modelClass, id, internalModel, options) {\n var snapshot = internalModel.createSnapshot(options);\n var { modelName } = internalModel;\n var promise = adapter.findRecord(store, modelClass, id, snapshot);\n var label = `DS: Handle Adapter#findRecord of '${modelName}' with id: '${id}'`;\n\n promise = Ember.RSVP.Promise.resolve(promise, label);\n promise = _guard(promise, _bind(_objectIsAlive, store));\n\n return promise.then(adapterPayload => {\n (true && !(payloadIsNotBlank(adapterPayload)) && Ember.assert(`You made a 'findRecord' request for a '${modelName}' with id '${id}', but the adapter's response did not have any data`, payloadIsNotBlank(adapterPayload)));\n\n var serializer = serializerForAdapter(store, adapter, modelName);\n var payload = normalizeResponseHelper(serializer, store, modelClass, adapterPayload, id, 'findRecord');\n (true && !(!Array.isArray(payload.data)) && Ember.assert(`Ember Data expected the primary data returned from a 'findRecord' response to be an object but instead it found an array.`, !Array.isArray(payload.data)));\n (true && Ember.warn(`You requested a record of type '${modelName}' with id '${id}' but the adapter returned a payload with primary data having an id of '${payload.data.id}'. Use 'store.findRecord()' when the requested id is the same as the one returned by the adapter. In other cases use 'store.queryRecord()' instead https://emberjs.com/api/data/classes/DS.Store.html#method_queryRecord`, payload.data.id === id, {\n id: 'ds.store.findRecord.id-mismatch'\n }));\n\n\n return store._push(payload);\n }, error => {\n internalModel.notFound();\n if (internalModel.isEmpty()) {\n internalModel.unloadRecord();\n }\n\n throw error;\n }, `DS: Extract payload of '${modelName}'`);\n}\n\nfunction _findMany(adapter, store, modelName, ids, internalModels) {\n var snapshots = Ember.A(internalModels).invoke('createSnapshot');\n var modelClass = store.modelFor(modelName); // `adapter.findMany` gets the modelClass still\n var promise = adapter.findMany(store, modelClass, ids, snapshots);\n var label = `DS: Handle Adapter#findMany of '${modelName}'`;\n\n if (promise === undefined) {\n throw new Error('adapter.findMany returned undefined, this was very likely a mistake');\n }\n\n promise = Ember.RSVP.Promise.resolve(promise, label);\n promise = _guard(promise, _bind(_objectIsAlive, store));\n\n return promise.then(adapterPayload => {\n (true && !(payloadIsNotBlank(adapterPayload)) && Ember.assert(`You made a 'findMany' request for '${modelName}' records with ids '[${ids}]', but the adapter's response did not have any data`, payloadIsNotBlank(adapterPayload)));\n\n var serializer = serializerForAdapter(store, adapter, modelName);\n var payload = normalizeResponseHelper(serializer, store, modelClass, adapterPayload, null, 'findMany');\n return store._push(payload);\n }, null, `DS: Extract payload of ${modelName}`);\n}\n\nfunction _findHasMany(adapter, store, internalModel, link, relationship) {\n var snapshot = internalModel.createSnapshot();\n var modelClass = store.modelFor(relationship.type);\n var promise = adapter.findHasMany(store, snapshot, link, relationship);\n var label = `DS: Handle Adapter#findHasMany of '${internalModel.modelName}' : '${relationship.type}'`;\n\n promise = Ember.RSVP.Promise.resolve(promise, label);\n promise = _guard(promise, _bind(_objectIsAlive, store));\n promise = _guard(promise, _bind(_objectIsAlive, internalModel));\n\n return promise.then(adapterPayload => {\n (true && !(payloadIsNotBlank(adapterPayload)) && Ember.assert(`You made a 'findHasMany' request for a ${internalModel.modelName}'s '${relationship.key}' relationship, using link '${link}' , but the adapter's response did not have any data`, payloadIsNotBlank(adapterPayload)));\n\n var serializer = serializerForAdapter(store, adapter, relationship.type);\n var payload = normalizeResponseHelper(serializer, store, modelClass, adapterPayload, null, 'findHasMany');\n var internalModelArray = store._push(payload);\n\n internalModelArray.meta = payload.meta;\n return internalModelArray;\n }, null, `DS: Extract payload of '${internalModel.modelName}' : hasMany '${relationship.type}'`);\n}\n\nfunction _findBelongsTo(adapter, store, internalModel, link, relationship) {\n var snapshot = internalModel.createSnapshot();\n var modelClass = store.modelFor(relationship.type);\n var promise = adapter.findBelongsTo(store, snapshot, link, relationship);\n var label = `DS: Handle Adapter#findBelongsTo of ${internalModel.modelName} : ${relationship.type}`;\n\n promise = Ember.RSVP.Promise.resolve(promise, label);\n promise = _guard(promise, _bind(_objectIsAlive, store));\n promise = _guard(promise, _bind(_objectIsAlive, internalModel));\n\n return promise.then(adapterPayload => {\n var serializer = serializerForAdapter(store, adapter, relationship.type);\n var payload = normalizeResponseHelper(serializer, store, modelClass, adapterPayload, null, 'findBelongsTo');\n\n if (!payload.data) {\n return null;\n }\n\n return store._push(payload);\n }, null, `DS: Extract payload of ${internalModel.modelName} : ${relationship.type}`);\n}\n\nfunction _findAll(adapter, store, modelName, sinceToken, options) {\n var modelClass = store.modelFor(modelName); // adapter.findAll depends on the class\n var recordArray = store.peekAll(modelName);\n var snapshotArray = recordArray._createSnapshot(options);\n var promise = adapter.findAll(store, modelClass, sinceToken, snapshotArray);\n var label = \"DS: Handle Adapter#findAll of \" + modelClass;\n\n promise = Ember.RSVP.Promise.resolve(promise, label);\n promise = _guard(promise, _bind(_objectIsAlive, store));\n\n return promise.then(adapterPayload => {\n (true && !(payloadIsNotBlank(adapterPayload)) && Ember.assert(`You made a 'findAll' request for '${modelName}' records, but the adapter's response did not have any data`, payloadIsNotBlank(adapterPayload)));\n\n var serializer = serializerForAdapter(store, adapter, modelName);\n var payload = normalizeResponseHelper(serializer, store, modelClass, adapterPayload, null, 'findAll');\n\n store._push(payload);\n store._didUpdateAll(modelName);\n\n return recordArray;\n }, null, 'DS: Extract payload of findAll ${modelName}');\n}\n\nfunction _query(adapter, store, modelName, query, recordArray) {\n var modelClass = store.modelFor(modelName); // adapter.query needs the class\n\n var promise = void 0;\n if (adapter.query.length > 3) {\n recordArray = recordArray || store.recordArrayManager.createAdapterPopulatedRecordArray(modelName, query);\n promise = adapter.query(store, modelClass, query, recordArray);\n } else {\n promise = adapter.query(store, modelClass, query);\n }\n\n var label = `DS: Handle Adapter#query of ${modelClass}`;\n\n promise = Ember.RSVP.Promise.resolve(promise, label);\n promise = _guard(promise, _bind(_objectIsAlive, store));\n\n return promise.then(adapterPayload => {\n var serializer = serializerForAdapter(store, adapter, modelName);\n\n var payload = normalizeResponseHelper(serializer, store, modelClass, adapterPayload, null, 'query');\n\n var internalModels = store._push(payload);\n\n (true && !(Array.isArray(internalModels)) && Ember.assert('The response to store.query is expected to be an array but it was a single record. Please wrap your response in an array or use `store.queryRecord` to query for a single record.', Array.isArray(internalModels)));\n\n if (recordArray) {\n recordArray._setInternalModels(internalModels, payload);\n } else {\n recordArray = store.recordArrayManager.createAdapterPopulatedRecordArray(modelName, query, internalModels, payload);\n }\n\n return recordArray;\n }, null, `DS: Extract payload of query ${modelName}`);\n}\n\nfunction _queryRecord(adapter, store, modelName, query) {\n var modelClass = store.modelFor(modelName); // adapter.queryRecord needs the class\n var promise = adapter.queryRecord(store, modelClass, query);\n var label = `DS: Handle Adapter#queryRecord of ${modelName}`;\n\n promise = Ember.RSVP.Promise.resolve(promise, label);\n promise = _guard(promise, _bind(_objectIsAlive, store));\n\n return promise.then(adapterPayload => {\n var serializer = serializerForAdapter(store, adapter, modelName);\n var payload = normalizeResponseHelper(serializer, store, modelClass, adapterPayload, null, 'queryRecord');\n\n (true && !(!Array.isArray(payload.data)) && Ember.assert(`Expected the primary data returned by the serializer for a 'queryRecord' response to be a single object or null but instead it was an array.`, !Array.isArray(payload.data), {\n id: 'ds.store.queryRecord-array-response'\n }));\n\n\n return store._push(payload);\n }, null, `DS: Extract payload of queryRecord ${modelName}`);\n}\n\n// Used by the store to normalize IDs entering the store. Despite the fact\n// that developers may provide IDs as numbers (e.g., `store.findRecord('person', 1)`),\n// it is important that internally we use strings, since IDs may be serialized\n// and lose type information. For example, Ember's router may put a record's\n// ID into the URL, and if we later try to deserialize that URL and find the\n// corresponding record, we will not know if it is a string or a number.\nfunction coerceId(id) {\n if (id === null || id === undefined || id === '') {\n return null;\n }\n if (typeof id === 'string') {\n return id;\n }\n return '' + id;\n}\n\n/**\n @module ember-data\n*/\n\n/**\n @class SnapshotRecordArray\n @namespace DS\n @private\n @constructor\n @param {Array} snapshots An array of snapshots\n @param {Object} meta\n*/\nclass SnapshotRecordArray {\n constructor(recordArray, meta, options = {}) {\n /**\n An array of snapshots\n @private\n @property _snapshots\n @type {Array}\n */\n this._snapshots = null;\n\n /**\n An array of records\n @private\n @property _recordArray\n @type {Array}\n */\n this._recordArray = recordArray;\n\n /**\n Number of records in the array\n Example\n ```app/adapters/post.js\n import DS from 'ember-data'\n export default DS.JSONAPIAdapter.extend({\n shouldReloadAll(store, snapshotRecordArray) {\n return !snapshotRecordArray.length;\n },\n });\n ```\n @property length\n @type {Number}\n */\n this.length = recordArray.get('length');\n\n this._type = null;\n\n /**\n Meta objects for the record array.\n Example\n ```app/adapters/post.js\n import DS from 'ember-data'\n export default DS.JSONAPIAdapter.extend({\n shouldReloadAll(store, snapshotRecordArray) {\n var lastRequestTime = snapshotRecordArray.meta.lastRequestTime;\n var twentyMinutes = 20 * 60 * 1000;\n return Date.now() > lastRequestTime + twentyMinutes;\n },\n });\n ```\n @property meta\n @type {Object}\n */\n this.meta = meta;\n\n /**\n A hash of adapter options passed into the store method for this request.\n Example\n ```app/adapters/post.js\n import MyCustomAdapter from './custom-adapter';\n export default MyCustomAdapter.extend({\n findAll(store, type, sinceToken, snapshotRecordArray) {\n if (snapshotRecordArray.adapterOptions.subscribe) {\n // ...\n }\n // ...\n }\n });\n ```\n @property adapterOptions\n @type {Object}\n */\n this.adapterOptions = options.adapterOptions;\n\n /**\n The relationships to include for this request.\n Example\n ```app/adapters/application.js\n import DS from 'ember-data';\n export default DS.Adapter.extend({\n findAll(store, type, snapshotRecordArray) {\n var url = `/${type.modelName}?include=${encodeURIComponent(snapshotRecordArray.include)}`;\n return fetch(url).then((response) => response.json())\n }\n });\n @property include\n @type {String|Array}\n */\n this.include = options.include;\n }\n\n /**\n The type of the underlying records for the snapshots in the array, as a DS.Model\n @property type\n @type {DS.Model}\n */\n get type() {\n return this._type || (this._type = this._recordArray.get('type'));\n }\n\n /**\n Get snapshots of the underlying record array\n Example\n ```app/adapters/post.js\n import DS from 'ember-data'\n export default DS.JSONAPIAdapter.extend({\n shouldReloadAll(store, snapshotArray) {\n var snapshots = snapshotArray.snapshots();\n return snapshots.any(function(ticketSnapshot) {\n var timeDiff = moment().diff(ticketSnapshot.attr('lastAccessedAt'), 'minutes');\n if (timeDiff > 20) {\n return true;\n } else {\n return false;\n }\n });\n }\n });\n ```\n @method snapshots\n @return {Array} Array of snapshots\n */\n snapshots() {\n if (this._snapshots !== null) {\n return this._snapshots;\n }\n\n this._snapshots = this._recordArray._takeSnapshot();\n\n return this._snapshots;\n }\n}\n\n/**\n @module ember-data\n*/\n\n/**\n A record array is an array that contains records of a certain modelName. The record\n array materializes records as needed when they are retrieved for the first\n time. You should not create record arrays yourself. Instead, an instance of\n `DS.RecordArray` or its subclasses will be returned by your application's store\n in response to queries.\n\n @class RecordArray\n @namespace DS\n @extends Ember.ArrayProxy\n @uses Ember.Evented\n*/\n\nvar RecordArray = Ember.ArrayProxy.extend(Ember.Evented, {\n init() {\n this._super(...arguments);\n\n /**\n The array of client ids backing the record array. When a\n record is requested from the record array, the record\n for the client id at the same index is materialized, if\n necessary, by the store.\n @property content\n @private\n @type Ember.Array\n */\n this.set('content', this.content || null);\n\n /**\n The flag to signal a `RecordArray` is finished loading data.\n Example\n ```javascript\n var people = store.peekAll('person');\n people.get('isLoaded'); // true\n ```\n @property isLoaded\n @type Boolean\n */\n this.isLoaded = this.isLoaded || false;\n /**\n The flag to signal a `RecordArray` is currently loading data.\n Example\n ```javascript\n var people = store.peekAll('person');\n people.get('isUpdating'); // false\n people.update();\n people.get('isUpdating'); // true\n ```\n @property isUpdating\n @type Boolean\n */\n this.isUpdating = false;\n\n /**\n The store that created this record array.\n @property store\n @private\n @type DS.Store\n */\n this.store = this.store || null;\n this._updatingPromise = null;\n },\n\n replace() {\n throw new Error(`The result of a server query (for all ${this.modelName} types) is immutable. To modify contents, use toArray()`);\n },\n\n /**\n The modelClass represented by this record array.\n @property type\n @type DS.Model\n */\n type: Ember.computed('modelName', function () {\n if (!this.modelName) {\n return null;\n }\n return this.store._modelFor(this.modelName);\n }).readOnly(),\n\n /**\n Retrieves an object from the content by index.\n @method objectAtContent\n @private\n @param {Number} index\n @return {DS.Model} record\n */\n objectAtContent(index) {\n var internalModel = Ember.get(this, 'content').objectAt(index);\n return internalModel && internalModel.getRecord();\n },\n\n /**\n Used to get the latest version of all of the records in this array\n from the adapter.\n Example\n ```javascript\n var people = store.peekAll('person');\n people.get('isUpdating'); // false\n people.update().then(function() {\n people.get('isUpdating'); // false\n });\n people.get('isUpdating'); // true\n ```\n @method update\n */\n update() {\n if (Ember.get(this, 'isUpdating')) {\n return this._updatingPromise;\n }\n\n this.set('isUpdating', true);\n\n var updatingPromise = this._update().finally(() => {\n this._updatingPromise = null;\n if (this.get('isDestroying') || this.get('isDestroyed')) {\n return;\n }\n this.set('isUpdating', false);\n });\n\n this._updatingPromise = updatingPromise;\n\n return updatingPromise;\n },\n\n /*\n Update this RecordArray and return a promise which resolves once the update\n is finished.\n */\n _update() {\n return this.store.findAll(this.modelName, { reload: true });\n },\n\n /**\n Adds an internal model to the `RecordArray` without duplicates\n @method _pushInternalModels\n @private\n @param {InternalModel} internalModel\n */\n _pushInternalModels(internalModels) {\n // pushObjects because the internalModels._recordArrays set was already\n // consulted for inclusion, so addObject and its on .contains call is not\n // required.\n Ember.get(this, 'content').pushObjects(internalModels);\n },\n\n /**\n Removes an internalModel to the `RecordArray`.\n @method removeInternalModel\n @private\n @param {InternalModel} internalModel\n */\n _removeInternalModels(internalModels) {\n Ember.get(this, 'content').removeObjects(internalModels);\n },\n\n /**\n Saves all of the records in the `RecordArray`.\n Example\n ```javascript\n var messages = store.peekAll('message');\n messages.forEach(function(message) {\n message.set('hasBeenSeen', true);\n });\n messages.save();\n ```\n @method save\n @return {DS.PromiseArray} promise\n */\n save() {\n var promiseLabel = `DS: RecordArray#save ${this.modelName}`;\n var promise = Ember.RSVP.Promise.all(this.invoke('save'), promiseLabel).then(() => this, null, 'DS: RecordArray#save return RecordArray');\n\n return PromiseArray.create({ promise });\n },\n\n _dissociateFromOwnRecords() {\n this.get('content').forEach(internalModel => {\n var recordArrays = internalModel.__recordArrays;\n\n if (recordArrays) {\n recordArrays.delete(this);\n }\n });\n },\n\n /**\n @method _unregisterFromManager\n @private\n */\n _unregisterFromManager() {\n this.manager.unregisterRecordArray(this);\n },\n\n willDestroy() {\n this._unregisterFromManager();\n this._dissociateFromOwnRecords();\n // TODO: we should not do work during destroy:\n // * when objects are destroyed, they should simply be left to do\n // * if logic errors do to this, that logic needs to be more careful during\n // teardown (ember provides isDestroying/isDestroyed) for this reason\n // * the exception being: if an dominator has a reference to this object,\n // and must be informed to release e.g. e.g. removing itself from th\n // recordArrayMananger\n Ember.set(this, 'content', null);\n Ember.set(this, 'length', 0);\n this._super(...arguments);\n },\n\n /*\n @method _createSnapshot\n @private\n */\n _createSnapshot(options) {\n // this is private for users, but public for ember-data internals\n return new SnapshotRecordArray(this, this.get('meta'), options);\n },\n\n /*\n @method _takeSnapshot\n @private\n */\n _takeSnapshot() {\n return Ember.get(this, 'content').map(internalModel => internalModel.createSnapshot());\n }\n});\n\n/**\n Represents a list of records whose membership is determined by the\n store. As records are created, loaded, or modified, the store\n evaluates them to determine if they should be part of the record\n array.\n\n @class FilteredRecordArray\n @namespace DS\n @extends DS.RecordArray\n*/\nvar FilteredRecordArray = RecordArray.extend({\n init() {\n this._super(...arguments);\n\n this.set('filterFunction', this.get('filterFunction') || null);\n this.isLoaded = true;\n },\n /**\n The filterFunction is a function used to test records from the store to\n determine if they should be part of the record array.\n Example\n ```javascript\n var allPeople = store.peekAll('person');\n allPeople.mapBy('name'); // [\"Tom Dale\", \"Yehuda Katz\", \"Trek Glowacki\"]\n var people = store.filter('person', function(person) {\n if (person.get('name').match(/Katz$/)) { return true; }\n });\n people.mapBy('name'); // [\"Yehuda Katz\"]\n var notKatzFilter = function(person) {\n return !person.get('name').match(/Katz$/);\n };\n people.set('filterFunction', notKatzFilter);\n people.mapBy('name'); // [\"Tom Dale\", \"Trek Glowacki\"]\n ```\n @method filterFunction\n @param {DS.Model} record\n @return {Boolean} `true` if the record should be in the array\n */\n\n replace() {\n throw new Error(`The result of a client-side filter (on ${this.modelName}) is immutable.`);\n },\n\n /**\n @method updateFilter\n @private\n */\n _updateFilter() {\n if (Ember.get(this, 'isDestroying') || Ember.get(this, 'isDestroyed')) {\n return;\n }\n Ember.get(this, 'manager').updateFilter(this, this.modelName, Ember.get(this, 'filterFunction'));\n },\n\n updateFilter: Ember.observer('filterFunction', function () {\n Ember.run.once(this, this._updateFilter);\n })\n});\n\nfunction cloneNull(source) {\n var clone = Object.create(null);\n for (var key in source) {\n clone[key] = source[key];\n }\n return clone;\n}\n\n/**\n Represents an ordered list of records whose order and membership is\n determined by the adapter. For example, a query sent to the adapter\n may trigger a search on the server, whose results would be loaded\n into an instance of the `AdapterPopulatedRecordArray`.\n\n ---\n\n If you want to update the array and get the latest records from the\n adapter, you can invoke [`update()`](#method_update):\n\n Example\n\n ```javascript\n // GET /users?isAdmin=true\n var admins = store.query('user', { isAdmin: true });\n\n admins.then(function() {\n console.log(admins.get(\"length\")); // 42\n });\n\n // somewhere later in the app code, when new admins have been created\n // in the meantime\n //\n // GET /users?isAdmin=true\n admins.update().then(function() {\n admins.get('isUpdating'); // false\n console.log(admins.get(\"length\")); // 123\n });\n\n admins.get('isUpdating'); // true\n ```\n\n @class AdapterPopulatedRecordArray\n @namespace DS\n @extends DS.RecordArray\n*/\nvar AdapterPopulatedRecordArray = RecordArray.extend({\n init() {\n // yes we are touching `this` before super, but ArrayProxy has a bug that requires this.\n this.set('content', this.get('content') || Ember.A());\n\n this._super(...arguments);\n this.query = this.query || null;\n this.links = this.links || null;\n },\n\n replace() {\n throw new Error(`The result of a server query (on ${this.modelName}) is immutable.`);\n },\n\n _update() {\n var store = Ember.get(this, 'store');\n var query = Ember.get(this, 'query');\n\n return store._query(this.modelName, query, this);\n },\n\n /**\n @method _setInternalModels\n @param {Array} internalModels\n @param {Object} payload normalized payload\n @private\n */\n _setInternalModels(internalModels, payload) {\n\n // TODO: initial load should not cause change events at all, only\n // subsequent. This requires changing the public api of adapter.query, but\n // hopefully we can do that soon.\n this.get('content').setObjects(internalModels);\n\n this.setProperties({\n isLoaded: true,\n isUpdating: false,\n meta: cloneNull(payload.meta),\n links: cloneNull(payload.links)\n });\n\n associateWithRecordArray(internalModels, this);\n\n // TODO: should triggering didLoad event be the last action of the runLoop?\n Ember.run.once(this, 'trigger', 'didLoad');\n }\n});\n\n/**\n @module ember-data\n*/\n\n/**\n @class RecordArrayManager\n @namespace DS\n @private\n*/\nclass RecordArrayManager {\n constructor(options) {\n this.store = options.store;\n this.isDestroying = false;\n this.isDestroyed = false;\n this._filteredRecordArrays = Object.create(null);\n this._liveRecordArrays = Object.create(null);\n this._pending = Object.create(null);\n this._adapterPopulatedRecordArrays = [];\n }\n\n recordDidChange(internalModel) {\n // TODO: change name\n // TODO: track that it was also a change\n this.internalModelDidChange(internalModel);\n }\n\n recordWasLoaded(internalModel) {\n // TODO: change name\n // TODO: track that it was also that it was first loaded\n this.internalModelDidChange(internalModel);\n }\n\n internalModelDidChange(internalModel) {\n\n var modelName = internalModel.modelName;\n\n if (internalModel._pendingRecordArrayManagerFlush) {\n return;\n }\n\n internalModel._pendingRecordArrayManagerFlush = true;\n\n var pending = this._pending;\n var models = pending[modelName] = pending[modelName] || [];\n if (models.push(internalModel) !== 1) {\n return;\n }\n\n Ember.run.schedule('actions', this, this._flush);\n }\n\n _flush() {\n\n var pending = this._pending;\n this._pending = Object.create(null);\n var modelsToRemove = [];\n\n for (var modelName in pending) {\n var internalModels = pending[modelName];\n for (var j = 0; j < internalModels.length; j++) {\n var internalModel = internalModels[j];\n // mark internalModels, so they can once again be processed by the\n // recordArrayManager\n internalModel._pendingRecordArrayManagerFlush = false;\n // build up a set of models to ensure we have purged correctly;\n if (internalModel.isHiddenFromRecordArrays()) {\n modelsToRemove.push(internalModel);\n }\n }\n\n // process filteredRecordArrays\n if (this._filteredRecordArrays[modelName]) {\n var recordArrays = this.filteredRecordArraysFor(modelName);\n for (var i = 0; i < recordArrays.length; i++) {\n this.updateFilterRecordArray(recordArrays[i], modelName, internalModels);\n }\n }\n\n var array = this._liveRecordArrays[modelName];\n if (array) {\n // TODO: skip if it only changed\n // process liveRecordArrays\n this.updateLiveRecordArray(array, internalModels);\n }\n\n // process adapterPopulatedRecordArrays\n if (modelsToRemove.length > 0) {\n removeFromAdapterPopulatedRecordArrays(modelsToRemove);\n }\n }\n }\n\n updateLiveRecordArray(array, internalModels) {\n return updateLiveRecordArray(array, internalModels);\n }\n\n /**\n Update an individual filter.\n @private\n @method updateFilterRecordArray\n @param {DS.FilteredRecordArray} array\n @param {String} modelName\n @param {Array} internalModels\n */\n updateFilterRecordArray(array, modelName, internalModels) {\n\n var filter = Ember.get(array, 'filterFunction');\n\n var shouldBeInAdded = [];\n var shouldBeRemoved = [];\n\n for (var i = 0; i < internalModels.length; i++) {\n var internalModel = internalModels[i];\n if (internalModel.isHiddenFromRecordArrays() === false && filter(internalModel.getRecord())) {\n if (internalModel._recordArrays.has(array)) {\n continue;\n }\n shouldBeInAdded.push(internalModel);\n internalModel._recordArrays.add(array);\n } else {\n if (internalModel._recordArrays.delete(array)) {\n shouldBeRemoved.push(internalModel);\n }\n }\n }\n\n if (shouldBeInAdded.length > 0) {\n array._pushInternalModels(shouldBeInAdded);\n }\n if (shouldBeRemoved.length > 0) {\n array._removeInternalModels(shouldBeRemoved);\n }\n }\n\n // TODO: remove, utilize existing flush code but make it flush sync based on 1 modelName\n _syncLiveRecordArray(array, modelName) {\n (true && !(typeof modelName === 'string') && Ember.assert(`recordArrayManger.syncLiveRecordArray expects modelName not modelClass as the second param`, typeof modelName === 'string'));\n\n var hasNoPotentialDeletions = Object.keys(this._pending).length === 0;\n var map = this.store._internalModelsFor(modelName);\n var hasNoInsertionsOrRemovals = Ember.get(map, 'length') === Ember.get(array, 'length');\n\n /*\n Ideally the recordArrayManager has knowledge of the changes to be applied to\n liveRecordArrays, and is capable of strategically flushing those changes and applying\n small diffs if desired. However, until we've refactored recordArrayManager, this dirty\n check prevents us from unnecessarily wiping out live record arrays returned by peekAll.\n */\n if (hasNoPotentialDeletions && hasNoInsertionsOrRemovals) {\n return;\n }\n\n var internalModels = this._visibleInternalModelsByType(modelName);\n var modelsToAdd = [];\n for (var i = 0; i < internalModels.length; i++) {\n var internalModel = internalModels[i];\n var recordArrays = internalModel._recordArrays;\n if (recordArrays.has(array) === false) {\n recordArrays.add(array);\n modelsToAdd.push(internalModel);\n }\n }\n\n array._pushInternalModels(modelsToAdd);\n }\n\n /**\n This method is invoked if the `filterFunction` property is\n changed on a `DS.FilteredRecordArray`.\n It essentially re-runs the filter from scratch. This same\n method is invoked when the filter is created in th first place.\n @method updateFilter\n @param {Array} array\n @param {String} modelName\n @param {Function} filter\n */\n updateFilter(array, modelName, filter) {\n (true && !(typeof modelName === 'string') && Ember.assert(`recordArrayManger.updateFilter expects modelName not modelClass as the second param, received ${modelName}`, typeof modelName === 'string'));\n\n var modelMap = this.store._internalModelsFor(modelName);\n var internalModels = modelMap.models;\n\n this.updateFilterRecordArray(array, filter, internalModels);\n }\n\n _didUpdateAll(modelName) {\n var recordArray = this._liveRecordArrays[modelName];\n if (recordArray) {\n Ember.set(recordArray, 'isUpdating', false);\n }\n }\n\n /**\n Get the `DS.RecordArray` for a modelName, which contains all loaded records of\n given modelName.\n @method liveRecordArrayFor\n @param {String} modelName\n @return {DS.RecordArray}\n */\n liveRecordArrayFor(modelName) {\n (true && !(typeof modelName === 'string') && Ember.assert(`recordArrayManger.liveRecordArrayFor expects modelName not modelClass as the param`, typeof modelName === 'string'));\n\n\n var array = this._liveRecordArrays[modelName];\n\n if (array) {\n // if the array already exists, synchronize\n this._syncLiveRecordArray(array, modelName);\n } else {\n // if the array is being newly created merely create it with its initial\n // content already set. This prevents unneeded change events.\n var internalModels = this._visibleInternalModelsByType(modelName);\n array = this.createRecordArray(modelName, internalModels);\n this._liveRecordArrays[modelName] = array;\n }\n\n return array;\n }\n\n _visibleInternalModelsByType(modelName) {\n var all = this.store._internalModelsFor(modelName)._models;\n var visible = [];\n for (var i = 0; i < all.length; i++) {\n var model = all[i];\n if (model.isHiddenFromRecordArrays() === false) {\n visible.push(model);\n }\n }\n return visible;\n }\n /**\n Get the `DS.RecordArray` for a modelName, which contains all loaded records of\n given modelName.\n @method filteredRecordArraysFor\n @param {String} modelName\n @return {DS.RecordArray}\n */\n filteredRecordArraysFor(modelName) {\n (true && !(typeof modelName === 'string') && Ember.assert(`recordArrayManger.filteredRecordArraysFor expects modelName not modelClass as the param`, typeof modelName === 'string'));\n\n\n return this._filteredRecordArrays[modelName] || (this._filteredRecordArrays[modelName] = []);\n }\n /**\n Create a `DS.RecordArray` for a modelName.\n @method createRecordArray\n @param {String} modelName\n @param {Array} _content (optional|private)\n @return {DS.RecordArray}\n */\n createRecordArray(modelName, content) {\n (true && !(typeof modelName === 'string') && Ember.assert(`recordArrayManger.createRecordArray expects modelName not modelClass as the param`, typeof modelName === 'string'));\n\n\n var array = RecordArray.create({\n modelName,\n content: Ember.A(content || []),\n store: this.store,\n isLoaded: true,\n manager: this\n });\n\n if (Array.isArray(content)) {\n associateWithRecordArray(content, array);\n }\n\n return array;\n }\n\n /**\n Create a `DS.FilteredRecordArray` for a modelName and register it for updates.\n @method createFilteredRecordArray\n @param {String} modelName\n @param {Function} filter\n @param {Object} query (optional\n @return {DS.FilteredRecordArray}\n */\n createFilteredRecordArray(modelName, filter, query) {\n (true && !(typeof modelName === 'string') && Ember.assert(`recordArrayManger.createFilteredRecordArray expects modelName not modelClass as the first param, received ${modelName}`, typeof modelName === 'string'));\n\n var array = FilteredRecordArray.create({\n query,\n modelName,\n content: Ember.A(),\n store: this.store,\n manager: this,\n filterFunction: filter\n });\n\n this.registerFilteredRecordArray(array, modelName, filter);\n\n return array;\n }\n\n /**\n Create a `DS.AdapterPopulatedRecordArray` for a modelName with given query.\n @method createAdapterPopulatedRecordArray\n @param {String} modelName\n @param {Object} query\n @return {DS.AdapterPopulatedRecordArray}\n */\n createAdapterPopulatedRecordArray(modelName, query, internalModels, payload) {\n (true && !(typeof modelName === 'string') && Ember.assert(`recordArrayManger.createAdapterPopulatedRecordArray expects modelName not modelClass as the first param, received ${modelName}`, typeof modelName === 'string'));\n\n\n var array = void 0;\n if (Array.isArray(internalModels)) {\n array = AdapterPopulatedRecordArray.create({\n modelName,\n query: query,\n content: Ember.A(internalModels),\n store: this.store,\n manager: this,\n isLoaded: true,\n isUpdating: false,\n meta: cloneNull(payload.meta),\n links: cloneNull(payload.links)\n });\n\n associateWithRecordArray(internalModels, array);\n } else {\n array = AdapterPopulatedRecordArray.create({\n modelName,\n query: query,\n content: Ember.A(),\n store: this.store,\n manager: this\n });\n }\n\n this._adapterPopulatedRecordArrays.push(array);\n\n return array;\n }\n\n /**\n Register a RecordArray for a given modelName to be backed by\n a filter function. This will cause the array to update\n automatically when records of that modelName change attribute\n values or states.\n @method registerFilteredRecordArray\n @param {DS.RecordArray} array\n @param {String} modelName\n @param {Function} filter\n */\n registerFilteredRecordArray(array, modelName, filter) {\n (true && !(typeof modelName === 'string') && Ember.assert(`recordArrayManger.registerFilteredRecordArray expects modelName not modelClass as the second param, received ${modelName}`, typeof modelName === 'string'));\n\n\n this.filteredRecordArraysFor(modelName).push(array);\n this.updateFilter(array, modelName, filter);\n }\n\n /**\n Unregister a RecordArray.\n So manager will not update this array.\n @method unregisterRecordArray\n @param {DS.RecordArray} array\n */\n unregisterRecordArray(array) {\n\n var modelName = array.modelName;\n\n // unregister filtered record array\n var recordArrays = this.filteredRecordArraysFor(modelName);\n var removedFromFiltered = remove(recordArrays, array);\n\n // remove from adapter populated record array\n var removedFromAdapterPopulated = remove(this._adapterPopulatedRecordArrays, array);\n\n if (!removedFromFiltered && !removedFromAdapterPopulated) {\n\n var liveRecordArrayForType = this._liveRecordArrays[modelName];\n // unregister live record array\n if (liveRecordArrayForType) {\n if (array === liveRecordArrayForType) {\n delete this._liveRecordArrays[modelName];\n }\n }\n }\n }\n\n willDestroy() {\n Object.keys(this._filteredRecordArrays).forEach(modelName => flatten(this._filteredRecordArrays[modelName]).forEach(destroy));\n Object.keys(this._liveRecordArrays).forEach(modelName => this._liveRecordArrays[modelName].destroy());\n this._adapterPopulatedRecordArrays.forEach(destroy);\n this.isDestroyed = true;\n }\n\n destroy() {\n this.isDestroying = true;\n Ember.run.schedule('actions', this, this.willDestroy);\n }\n}\n\nfunction destroy(entry) {\n entry.destroy();\n}\n\nfunction flatten(list) {\n var length = list.length;\n var result = [];\n\n for (var i = 0; i < length; i++) {\n result = result.concat(list[i]);\n }\n\n return result;\n}\n\nfunction remove(array, item) {\n var index = array.indexOf(item);\n\n if (index !== -1) {\n array.splice(index, 1);\n return true;\n }\n\n return false;\n}\n\nfunction updateLiveRecordArray(array, internalModels) {\n var modelsToAdd = [];\n var modelsToRemove = [];\n\n for (var i = 0; i < internalModels.length; i++) {\n var internalModel = internalModels[i];\n var isDeleted = internalModel.isHiddenFromRecordArrays();\n var recordArrays = internalModel._recordArrays;\n\n if (!isDeleted && !internalModel.isEmpty()) {\n if (!recordArrays.has(array)) {\n modelsToAdd.push(internalModel);\n recordArrays.add(array);\n }\n }\n\n if (isDeleted) {\n modelsToRemove.push(internalModel);\n recordArrays.delete(array);\n }\n }\n\n if (modelsToAdd.length > 0) {\n array._pushInternalModels(modelsToAdd);\n }\n if (modelsToRemove.length > 0) {\n array._removeInternalModels(modelsToRemove);\n }\n}\n\nfunction removeFromAdapterPopulatedRecordArrays(internalModels) {\n for (var i = 0; i < internalModels.length; i++) {\n var internalModel = internalModels[i];\n var list = internalModel._recordArrays.list;\n\n for (var j = 0; j < list.length; j++) {\n // TODO: group by arrays, so we can batch remove\n list[j]._removeInternalModels([internalModel]);\n }\n\n internalModel._recordArrays.clear();\n }\n}\n\nfunction associateWithRecordArray(internalModels, array) {\n for (var i = 0, l = internalModels.length; i < l; i++) {\n var internalModel = internalModels[i];\n internalModel._recordArrays.add(array);\n }\n}\n\n/**\n @module ember-data\n*/\n\nvar badIdFormatAssertion = '`id` passed to `findRecord()` has to be non-empty string or number';\n\nvar {\n _Backburner: Backburner,\n ENV\n} = Ember;\n\nvar { Promise } = Ember.RSVP;\n\n//Get the materialized model from the internalModel/promise that returns\n//an internal model and return it in a promiseObject. Useful for returning\n//from find methods\nfunction promiseRecord(internalModelPromise, label) {\n var toReturn = internalModelPromise.then(internalModel => internalModel.getRecord());\n\n return promiseObject(toReturn, label);\n}\n\nvar Store = void 0;\n\n// Implementors Note:\n//\n// The variables in this file are consistently named according to the following\n// scheme:\n//\n// * +id+ means an identifier managed by an external source, provided inside\n// the data provided by that source. These are always coerced to be strings\n// before being used internally.\n// * +clientId+ means a transient numerical identifier generated at runtime by\n// the data store. It is important primarily because newly created objects may\n// not yet have an externally generated id.\n// * +internalModel+ means a record internalModel object, which holds metadata about a\n// record, even if it has not yet been fully materialized.\n// * +type+ means a DS.Model.\n\n/**\n The store contains all of the data for records loaded from the server.\n It is also responsible for creating instances of `DS.Model` that wrap\n the individual data for a record, so that they can be bound to in your\n Handlebars templates.\n\n Define your application's store like this:\n\n ```app/services/store.js\n import DS from 'ember-data';\n\n export default DS.Store.extend({\n });\n ```\n\n Most Ember.js applications will only have a single `DS.Store` that is\n automatically created by their `Ember.Application`.\n\n You can retrieve models from the store in several ways. To retrieve a record\n for a specific id, use `DS.Store`'s `findRecord()` method:\n\n ```javascript\n store.findRecord('person', 123).then(function (person) {\n });\n ```\n\n By default, the store will talk to your backend using a standard\n REST mechanism. You can customize how the store talks to your\n backend by specifying a custom adapter:\n\n ```app/adapters/application.js\n import DS from 'ember-data';\n\n export default DS.Adapter.extend({\n });\n ```\n\n You can learn more about writing a custom adapter by reading the `DS.Adapter`\n documentation.\n\n ### Store createRecord() vs. push() vs. pushPayload()\n\n The store provides multiple ways to create new record objects. They have\n some subtle differences in their use which are detailed below:\n\n [createRecord](#method_createRecord) is used for creating new\n records on the client side. This will return a new record in the\n `created.uncommitted` state. In order to persist this record to the\n backend you will need to call `record.save()`.\n\n [push](#method_push) is used to notify Ember Data's store of new or\n updated records that exist in the backend. This will return a record\n in the `loaded.saved` state. The primary use-case for `store#push` is\n to notify Ember Data about record updates (full or partial) that happen\n outside of the normal adapter methods (for example\n [SSE](http://dev.w3.org/html5/eventsource/) or [Web\n Sockets](http://www.w3.org/TR/2009/WD-websockets-20091222/)).\n\n [pushPayload](#method_pushPayload) is a convenience wrapper for\n `store#push` that will deserialize payloads if the\n Serializer implements a `pushPayload` method.\n\n Note: When creating a new record using any of the above methods\n Ember Data will update `DS.RecordArray`s such as those returned by\n `store#peekAll()` or `store#findAll()`. This means any\n data bindings or computed properties that depend on the RecordArray\n will automatically be synced to include the new or updated record\n values.\n\n @class Store\n @namespace DS\n @extends Ember.Service\n*/\nStore = Ember.Service.extend({\n\n /**\n @method init\n @private\n */\n init() {\n this._super(...arguments);\n this._backburner = new Backburner(['normalizeRelationships', 'syncRelationships', 'finished']);\n // internal bookkeeping; not observable\n this.recordArrayManager = new RecordArrayManager({ store: this });\n this._identityMap = new IdentityMap();\n this._pendingSave = [];\n this._modelFactoryCache = Object.create(null);\n this._relationshipsPayloads = new RelationshipPayloadsManager(this);\n\n /*\n Ember Data uses several specialized micro-queues for organizing\n and coalescing similar async work.\n These queues are currently controlled by a flush scheduled into\n ember-data's custom backburner instance.\n */\n // used for coalescing record save requests\n this._pendingSave = [];\n // used for coalescing relationship updates\n this._updatedRelationships = [];\n // used for coalescing relationship setup needs\n this._pushedInternalModels = [];\n // used for coalescing internal model updates\n this._updatedInternalModels = [];\n\n // used to keep track of all the find requests that need to be coalesced\n this._pendingFetch = Ember.MapWithDefault.create({ defaultValue() {\n return [];\n } });\n\n this._adapterCache = Object.create(null);\n this._serializerCache = Object.create(null);\n },\n\n /**\n The default adapter to use to communicate to a backend server or\n other persistence layer. This will be overridden by an application\n adapter if present.\n If you want to specify `app/adapters/custom.js` as a string, do:\n ```js\n import DS from 'ember-data';\n export default DS.Store.extend({\n adapter: 'custom',\n });\n ```\n @property adapter\n @default '-json-api'\n @type {String}\n */\n adapter: '-json-api',\n\n /**\n Returns a JSON representation of the record using a custom\n type-specific serializer, if one exists.\n The available options are:\n * `includeId`: `true` if the record's ID should be included in\n the JSON representation\n @method serialize\n @private\n @deprecated\n @param {DS.Model} record the record to serialize\n @param {Object} options an options hash\n */\n serialize(record, options) {\n if (isEnabled('ds-deprecate-store-serialize')) {\n (true && !(false) && Ember.deprecate('Use of store.serialize is deprecated, use record.serialize instead.', false, {\n id: 'ds.store.serialize',\n until: '3.0'\n }));\n }\n var snapshot = record._internalModel.createSnapshot();\n return snapshot.serialize(options);\n },\n\n /**\n This property returns the adapter, after resolving a possible\n string key.\n If the supplied `adapter` was a class, or a String property\n path resolved to a class, this property will instantiate the\n class.\n This property is cacheable, so the same instance of a specified\n adapter class should be used for the lifetime of the store.\n @property defaultAdapter\n @private\n @return DS.Adapter\n */\n defaultAdapter: Ember.computed('adapter', function () {\n var adapter = Ember.get(this, 'adapter');\n\n (true && !(typeof adapter === 'string') && Ember.assert('You tried to set `adapter` property to an instance of `DS.Adapter`, where it should be a name', typeof adapter === 'string'));\n\n\n return this.adapterFor(adapter);\n }),\n\n // .....................\n // . CREATE NEW RECORD .\n // .....................\n\n /**\n Create a new record in the current store. The properties passed\n to this method are set on the newly created record.\n To create a new instance of a `Post`:\n ```js\n store.createRecord('post', {\n title: 'Rails is omakase'\n });\n ```\n To create a new instance of a `Post` that has a relationship with a `User` record:\n ```js\n let user = this.store.peekRecord('user', 1);\n store.createRecord('post', {\n title: 'Rails is omakase',\n user: user\n });\n ```\n @method createRecord\n @param {String} modelName\n @param {Object} inputProperties a hash of properties to set on the\n newly created record.\n @return {DS.Model} record\n */\n createRecord(modelName, inputProperties) {\n (true && !(Ember.isPresent(modelName)) && Ember.assert(`You need to pass a model name to the store's createRecord method`, Ember.isPresent(modelName)));\n (true && !(typeof modelName === 'string') && Ember.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));\n\n var normalizedModelName = normalizeModelName(modelName);\n var properties = Ember.copy(inputProperties) || Object.create(null);\n\n // If the passed properties do not include a primary key,\n // give the adapter an opportunity to generate one. Typically,\n // client-side ID generators will use something like uuid.js\n // to avoid conflicts.\n\n if (Ember.isNone(properties.id)) {\n properties.id = this._generateId(normalizedModelName, properties);\n }\n\n // Coerce ID to a string\n properties.id = coerceId(properties.id);\n\n var internalModel = this._buildInternalModel(normalizedModelName, properties.id);\n internalModel.loadedData();\n var record = internalModel.getRecord(properties);\n\n // TODO @runspired this should also be coalesced into some form of internalModel.setState()\n internalModel.eachRelationship((key, descriptor) => {\n if (properties[key] !== undefined) {\n internalModel._relationships.get(key).setHasData(true);\n }\n });\n\n return record;\n },\n\n /**\n If possible, this method asks the adapter to generate an ID for\n a newly created record.\n @method _generateId\n @private\n @param {String} modelName\n @param {Object} properties from the new record\n @return {String} if the adapter can generate one, an ID\n */\n _generateId(modelName, properties) {\n var adapter = this.adapterFor(modelName);\n\n if (adapter && adapter.generateIdForRecord) {\n return adapter.generateIdForRecord(this, modelName, properties);\n }\n\n return null;\n },\n\n // .................\n // . DELETE RECORD .\n // .................\n\n /**\n For symmetry, a record can be deleted via the store.\n Example\n ```javascript\n let post = store.createRecord('post', {\n title: 'Rails is omakase'\n });\n store.deleteRecord(post);\n ```\n @method deleteRecord\n @param {DS.Model} record\n */\n deleteRecord(record) {\n record.deleteRecord();\n },\n\n /**\n For symmetry, a record can be unloaded via the store.\n This will cause the record to be destroyed and freed up for garbage collection.\n Example\n ```javascript\n store.findRecord('post', 1).then(function(post) {\n store.unloadRecord(post);\n });\n ```\n @method unloadRecord\n @param {DS.Model} record\n */\n unloadRecord(record) {\n record.unloadRecord();\n },\n\n // ................\n // . FIND RECORDS .\n // ................\n\n /**\n @method find\n @param {String} modelName\n @param {String|Integer} id\n @param {Object} options\n @return {Promise} promise\n @private\n */\n find(modelName, id, options) {\n // The default `model` hook in Route calls `find(modelName, id)`,\n // that's why we have to keep this method around even though `findRecord` is\n // the public way to get a record by modelName and id.\n (true && !(arguments.length !== 1) && Ember.assert(`Using store.find(type) has been removed. Use store.findAll(modelName) to retrieve all records for a given type.`, arguments.length !== 1));\n (true && !(!options) && Ember.assert(`Calling store.find(modelName, id, { preload: preload }) is no longer supported. Use store.findRecord(modelName, id, { preload: preload }) instead.`, !options));\n (true && !(arguments.length === 2) && Ember.assert(`You need to pass the model name and id to the store's find method`, arguments.length === 2));\n (true && !(typeof id === 'string' || typeof id === 'number') && Ember.assert(`You cannot pass '${id}' as id to the store's find method`, typeof id === 'string' || typeof id === 'number'));\n (true && !(typeof id !== 'object') && Ember.assert(`Calling store.find() with a query object is no longer supported. Use store.query() instead.`, typeof id !== 'object'));\n (true && !(typeof modelName === 'string') && Ember.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));\n\n\n var normalizedModelName = normalizeModelName(modelName);\n\n return this.findRecord(normalizedModelName, id);\n },\n\n /**\n This method returns a record for a given type and id combination.\n The `findRecord` method will always resolve its promise with the same\n object for a given type and `id`.\n The `findRecord` method will always return a **promise** that will be\n resolved with the record.\n Example\n ```app/routes/post.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n model(params) {\n return this.store.findRecord('post', params.post_id);\n }\n });\n ```\n If the record is not yet available, the store will ask the adapter's `find`\n method to find the necessary data. If the record is already present in the\n store, it depends on the reload behavior _when_ the returned promise\n resolves.\n ### Preloading\n You can optionally `preload` specific attributes and relationships that you know of\n by passing them via the passed `options`.\n For example, if your Ember route looks like `/posts/1/comments/2` and your API route\n for the comment also looks like `/posts/1/comments/2` if you want to fetch the comment\n without fetching the post you can pass in the post to the `findRecord` call:\n ```javascript\n store.findRecord('comment', 2, { preload: { post: 1 } });\n ```\n If you have access to the post model you can also pass the model itself:\n ```javascript\n store.findRecord('post', 1).then(function (myPostModel) {\n store.findRecord('comment', 2, { post: myPostModel });\n });\n ```\n ### Reloading\n The reload behavior is configured either via the passed `options` hash or\n the result of the adapter's `shouldReloadRecord`.\n If `{ reload: true }` is passed or `adapter.shouldReloadRecord` evaluates\n to `true`, then the returned promise resolves once the adapter returns\n data, regardless if the requested record is already in the store:\n ```js\n store.push({\n data: {\n id: 1,\n type: 'post',\n revision: 1\n }\n });\n // adapter#findRecord resolves with\n // [\n // {\n // id: 1,\n // type: 'post',\n // revision: 2\n // }\n // ]\n store.findRecord('post', 1, { reload: true }).then(function(post) {\n post.get('revision'); // 2\n });\n ```\n If no reload is indicated via the abovementioned ways, then the promise\n immediately resolves with the cached version in the store.\n ### Background Reloading\n Optionally, if `adapter.shouldBackgroundReloadRecord` evaluates to `true`,\n then a background reload is started, which updates the records' data, once\n it is available:\n ```js\n // app/adapters/post.js\n import ApplicationAdapter from \"./application\";\n export default ApplicationAdapter.extend({\n shouldReloadRecord(store, snapshot) {\n return false;\n },\n shouldBackgroundReloadRecord(store, snapshot) {\n return true;\n }\n });\n // ...\n store.push({\n data: {\n id: 1,\n type: 'post',\n revision: 1\n }\n });\n let blogPost = store.findRecord('post', 1).then(function(post) {\n post.get('revision'); // 1\n });\n // later, once adapter#findRecord resolved with\n // [\n // {\n // id: 1,\n // type: 'post',\n // revision: 2\n // }\n // ]\n blogPost.get('revision'); // 2\n ```\n If you would like to force or prevent background reloading, you can set a\n boolean value for `backgroundReload` in the options object for\n `findRecord`.\n ```app/routes/post/edit.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n model(params) {\n return this.store.findRecord('post', params.post_id, { backgroundReload: false });\n }\n });\n ```\n If you pass an object on the `adapterOptions` property of the options\n argument it will be passed to you adapter via the snapshot\n ```app/routes/post/edit.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n model(params) {\n return this.store.findRecord('post', params.post_id, {\n adapterOptions: { subscribe: false }\n });\n }\n });\n ```\n ```app/adapters/post.js\n import MyCustomAdapter from './custom-adapter';\n export default MyCustomAdapter.extend({\n findRecord(store, type, id, snapshot) {\n if (snapshot.adapterOptions.subscribe) {\n // ...\n }\n // ...\n }\n });\n ```\n See [peekRecord](#method_peekRecord) to get the cached version of a record.\n ### Retrieving Related Model Records\n If you use an adapter such as Ember's default\n [`JSONAPIAdapter`](https://emberjs.com/api/data/classes/DS.JSONAPIAdapter.html)\n that supports the [JSON API specification](http://jsonapi.org/) and if your server\n endpoint supports the use of an\n ['include' query parameter](http://jsonapi.org/format/#fetching-includes),\n you can use `findRecord()` to automatically retrieve additional records related to\n the one you request by supplying an `include` parameter in the `options` object.\n For example, given a `post` model that has a `hasMany` relationship with a `comment`\n model, when we retrieve a specific post we can have the server also return that post's\n comments in the same request:\n ```app/routes/post.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n model(params) {\n return this.store.findRecord('post', params.post_id, { include: 'comments' });\n }\n });\n ```\n In this case, the post's comments would then be available in your template as\n `model.comments`.\n Multiple relationships can be requested using an `include` parameter consisting of a\n comma-separated list (without white-space) while nested relationships can be specified\n using a dot-separated sequence of relationship names. So to request both the post's\n comments and the authors of those comments the request would look like this:\n ```app/routes/post.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n model(params) {\n return this.store.findRecord('post', params.post_id, { include: 'comments,comments.author' });\n }\n });\n ```\n @since 1.13.0\n @method findRecord\n @param {String} modelName\n @param {(String|Integer)} id\n @param {Object} options\n @return {Promise} promise\n */\n findRecord(modelName, id, options) {\n (true && !(Ember.isPresent(modelName)) && Ember.assert(`You need to pass a model name to the store's findRecord method`, Ember.isPresent(modelName)));\n (true && !(typeof modelName === 'string') && Ember.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));\n (true && !(typeof id === 'string' && id.length > 0 || typeof id === 'number' && !isNaN(id)) && Ember.assert(badIdFormatAssertion, typeof id === 'string' && id.length > 0 || typeof id === 'number' && !isNaN(id)));\n\n\n var normalizedModelName = normalizeModelName(modelName);\n\n var internalModel = this._internalModelForId(normalizedModelName, id);\n options = options || {};\n\n if (!this.hasRecordForId(normalizedModelName, id)) {\n return this._findByInternalModel(internalModel, options);\n }\n\n var fetchedInternalModel = this._findRecord(internalModel, options);\n\n return promiseRecord(fetchedInternalModel, `DS: Store#findRecord ${normalizedModelName} with id: ${id}`);\n },\n\n _findRecord(internalModel, options) {\n // Refetch if the reload option is passed\n if (options.reload) {\n return this._scheduleFetch(internalModel, options);\n }\n\n var snapshot = internalModel.createSnapshot(options);\n var adapter = this.adapterFor(internalModel.modelName);\n\n // Refetch the record if the adapter thinks the record is stale\n if (adapter.shouldReloadRecord(this, snapshot)) {\n return this._scheduleFetch(internalModel, options);\n }\n\n if (options.backgroundReload === false) {\n return Promise.resolve(internalModel);\n }\n\n // Trigger the background refetch if backgroundReload option is passed\n if (options.backgroundReload || adapter.shouldBackgroundReloadRecord(this, snapshot)) {\n this._scheduleFetch(internalModel, options);\n }\n\n // Return the cached record\n return Promise.resolve(internalModel);\n },\n\n _findByInternalModel(internalModel, options = {}) {\n if (options.preload) {\n internalModel.preloadData(options.preload);\n }\n\n var fetchedInternalModel = this._findEmptyInternalModel(internalModel, options);\n\n return promiseRecord(fetchedInternalModel, `DS: Store#findRecord ${internalModel.modelName} with id: ${internalModel.id}`);\n },\n\n _findEmptyInternalModel(internalModel, options) {\n if (internalModel.isEmpty()) {\n return this._scheduleFetch(internalModel, options);\n }\n\n //TODO double check about reloading\n if (internalModel.isLoading()) {\n return internalModel._loadingPromise;\n }\n\n return Promise.resolve(internalModel);\n },\n\n /**\n This method makes a series of requests to the adapter's `find` method\n and returns a promise that resolves once they are all loaded.\n @private\n @method findByIds\n @param {String} modelName\n @param {Array} ids\n @return {Promise} promise\n */\n findByIds(modelName, ids) {\n (true && !(Ember.isPresent(modelName)) && Ember.assert(`You need to pass a model name to the store's findByIds method`, Ember.isPresent(modelName)));\n (true && !(typeof modelName === 'string') && Ember.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));\n\n\n var promises = new Array(ids.length);\n\n var normalizedModelName = normalizeModelName(modelName);\n\n for (var i = 0; i < ids.length; i++) {\n promises[i] = this.findRecord(normalizedModelName, ids[i]);\n }\n\n return promiseArray(Ember.RSVP.all(promises).then(Ember.A, null, `DS: Store#findByIds of ${normalizedModelName} complete`));\n },\n\n /**\n This method is called by `findRecord` if it discovers that a particular\n type/id pair hasn't been loaded yet to kick off a request to the\n adapter.\n @method _fetchRecord\n @private\n @param {InternalModel} internalModel model\n @return {Promise} promise\n */\n _fetchRecord(internalModel, options) {\n var modelName = internalModel.modelName;\n var adapter = this.adapterFor(modelName);\n\n (true && !(adapter) && Ember.assert(`You tried to find a record but you have no adapter (for ${modelName})`, adapter));\n (true && !(typeof adapter.findRecord === 'function') && Ember.assert(`You tried to find a record but your adapter (for ${modelName}) does not implement 'findRecord'`, typeof adapter.findRecord === 'function'));\n\n\n return _find(adapter, this, internalModel.type, internalModel.id, internalModel, options);\n },\n\n _scheduleFetchMany(internalModels) {\n var fetches = new Array(internalModels.length);\n\n for (var i = 0; i < internalModels.length; i++) {\n fetches[i] = this._scheduleFetch(internalModels[i]);\n }\n\n return Promise.all(fetches);\n },\n\n _scheduleFetch(internalModel, options) {\n if (internalModel._loadingPromise) {\n return internalModel._loadingPromise;\n }\n\n var { id, modelName } = internalModel;\n var resolver = Ember.RSVP.defer(`Fetching ${modelName}' with id: ${id}`);\n var pendingFetchItem = {\n internalModel,\n resolver,\n options\n };\n\n var promise = resolver.promise;\n\n internalModel.loadingData(promise);\n if (this._pendingFetch.size === 0) {\n Ember.run.schedule('afterRender', this, this.flushAllPendingFetches);\n }\n\n this._pendingFetch.get(modelName).push(pendingFetchItem);\n\n return promise;\n },\n\n flushAllPendingFetches() {\n if (this.isDestroyed || this.isDestroying) {\n return;\n }\n\n this._pendingFetch.forEach(this._flushPendingFetchForType, this);\n this._pendingFetch.clear();\n },\n\n _flushPendingFetchForType(pendingFetchItems, modelName) {\n var store = this;\n var adapter = store.adapterFor(modelName);\n var shouldCoalesce = !!adapter.findMany && adapter.coalesceFindRequests;\n var totalItems = pendingFetchItems.length;\n var internalModels = new Array(totalItems);\n var seeking = Object.create(null);\n\n for (var _i = 0; _i < totalItems; _i++) {\n var pendingItem = pendingFetchItems[_i];\n var _internalModel = pendingItem.internalModel;\n internalModels[_i] = _internalModel;\n seeking[_internalModel.id] = pendingItem;\n }\n\n function _fetchRecord(recordResolverPair) {\n var recordFetch = store._fetchRecord(recordResolverPair.internalModel, recordResolverPair.options); // TODO adapter options\n\n recordResolverPair.resolver.resolve(recordFetch);\n }\n\n function handleFoundRecords(foundInternalModels, expectedInternalModels) {\n // resolve found records\n var found = Object.create(null);\n for (var _i2 = 0, _l = foundInternalModels.length; _i2 < _l; _i2++) {\n var _internalModel2 = foundInternalModels[_i2];\n var _pair = seeking[_internalModel2.id];\n found[_internalModel2.id] = _internalModel2;\n\n if (_pair) {\n var resolver = _pair.resolver;\n resolver.resolve(_internalModel2);\n }\n }\n\n // reject missing records\n var missingInternalModels = [];\n\n for (var _i3 = 0, _l2 = expectedInternalModels.length; _i3 < _l2; _i3++) {\n var _internalModel3 = expectedInternalModels[_i3];\n\n if (!found[_internalModel3.id]) {\n missingInternalModels.push(_internalModel3);\n }\n }\n\n if (missingInternalModels.length) {\n (true && Ember.warn('Ember Data expected to find records with the following ids in the adapter response but they were missing: ' + Ember.inspect(missingInternalModels.map(r => r.id)), false, {\n id: 'ds.store.missing-records-from-adapter'\n }));\n\n rejectInternalModels(missingInternalModels);\n }\n }\n\n function rejectInternalModels(internalModels, error) {\n for (var _i4 = 0, _l3 = internalModels.length; _i4 < _l3; _i4++) {\n var _internalModel4 = internalModels[_i4];\n var _pair2 = seeking[_internalModel4.id];\n\n if (_pair2) {\n _pair2.resolver.reject(error || new Error(`Expected: '${_internalModel4}' to be present in the adapter provided payload, but it was not found.`));\n }\n }\n }\n\n if (shouldCoalesce) {\n // TODO: Improve records => snapshots => records => snapshots\n //\n // We want to provide records to all store methods and snapshots to all\n // adapter methods. To make sure we're doing that we're providing an array\n // of snapshots to adapter.groupRecordsForFindMany(), which in turn will\n // return grouped snapshots instead of grouped records.\n //\n // But since the _findMany() finder is a store method we need to get the\n // records from the grouped snapshots even though the _findMany() finder\n // will once again convert the records to snapshots for adapter.findMany()\n var snapshots = new Array(totalItems);\n for (var _i5 = 0; _i5 < totalItems; _i5++) {\n snapshots[_i5] = internalModels[_i5].createSnapshot();\n }\n\n var groups = adapter.groupRecordsForFindMany(this, snapshots);\n\n for (var i = 0, l = groups.length; i < l; i++) {\n var group = groups[i];\n var totalInGroup = groups[i].length;\n var ids = new Array(totalInGroup);\n var groupedInternalModels = new Array(totalInGroup);\n\n for (var j = 0; j < totalInGroup; j++) {\n var internalModel = group[j]._internalModel;\n\n groupedInternalModels[j] = internalModel;\n ids[j] = internalModel.id;\n }\n\n if (totalInGroup > 1) {\n (function (groupedInternalModels) {\n _findMany(adapter, store, modelName, ids, groupedInternalModels).then(function (foundInternalModels) {\n handleFoundRecords(foundInternalModels, groupedInternalModels);\n }).catch(function (error) {\n rejectInternalModels(groupedInternalModels, error);\n });\n })(groupedInternalModels);\n } else if (ids.length === 1) {\n var pair = seeking[groupedInternalModels[0].id];\n _fetchRecord(pair);\n } else {\n (true && !(false) && Ember.assert(\"You cannot return an empty array from adapter's method groupRecordsForFindMany\", false));\n }\n }\n } else {\n for (var _i6 = 0; _i6 < totalItems; _i6++) {\n _fetchRecord(pendingFetchItems[_i6]);\n }\n }\n },\n\n /**\n Get the reference for the specified record.\n Example\n ```javascript\n let userRef = store.getReference('user', 1);\n // check if the user is loaded\n let isLoaded = userRef.value() !== null;\n // get the record of the reference (null if not yet available)\n let user = userRef.value();\n // get the identifier of the reference\n if (userRef.remoteType() === 'id') {\n let id = userRef.id();\n }\n // load user (via store.find)\n userRef.load().then(...)\n // or trigger a reload\n userRef.reload().then(...)\n // provide data for reference\n userRef.push({ id: 1, username: '@user' }).then(function(user) {\n userRef.value() === user;\n });\n ```\n @method getReference\n @param {String} modelName\n @param {String|Integer} id\n @since 2.5.0\n @return {RecordReference}\n */\n getReference(modelName, id) {\n var normalizedModelName = normalizeModelName(modelName);\n\n return this._internalModelForId(normalizedModelName, id).recordReference;\n },\n\n /**\n Get a record by a given type and ID without triggering a fetch.\n This method will synchronously return the record if it is available in the store,\n otherwise it will return `null`. A record is available if it has been fetched earlier, or\n pushed manually into the store.\n See [findRecord](#method_findRecord) if you would like to request this record from the backend.\n _Note: This is a synchronous method and does not return a promise._\n ```js\n let post = store.peekRecord('post', 1);\n post.get('id'); // 1\n ```\n @since 1.13.0\n @method peekRecord\n @param {String} modelName\n @param {String|Integer} id\n @return {DS.Model|null} record\n */\n peekRecord(modelName, id) {\n (true && !(Ember.isPresent(modelName)) && Ember.assert(`You need to pass a model name to the store's peekRecord method`, Ember.isPresent(modelName)));\n (true && !(Ember.isPresent(modelName) && Ember.isPresent(id)) && Ember.assert(`You need to pass both a model name and id to the store's peekRecord method`, Ember.isPresent(modelName) && Ember.isPresent(id)));\n (true && !(typeof modelName === 'string') && Ember.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));\n\n var normalizedModelName = normalizeModelName(modelName);\n\n if (this.hasRecordForId(normalizedModelName, id)) {\n return this._internalModelForId(normalizedModelName, id).getRecord();\n } else {\n return null;\n }\n },\n\n /**\n This method is called by the record's `reload` method.\n This method calls the adapter's `find` method, which returns a promise. When\n **that** promise resolves, `reloadRecord` will resolve the promise returned\n by the record's `reload`.\n @method reloadRecord\n @private\n @param {DS.Model} internalModel\n @return {Promise} promise\n */\n _reloadRecord(internalModel) {\n var { id, modelName } = internalModel;\n var adapter = this.adapterFor(modelName);\n\n (true && !(id) && Ember.assert(`You cannot reload a record without an ID`, id));\n (true && !(adapter) && Ember.assert(`You tried to reload a record but you have no adapter (for ${modelName})`, adapter));\n (true && !(typeof adapter.findRecord === 'function' || typeof adapter.find === 'function') && Ember.assert(`You tried to reload a record but your adapter does not implement 'findRecord'`, typeof adapter.findRecord === 'function' || typeof adapter.find === 'function'));\n\n\n return this._scheduleFetch(internalModel);\n },\n\n /**\n This method returns true if a record for a given modelName and id is already\n loaded in the store. Use this function to know beforehand if a findRecord()\n will result in a request or that it will be a cache hit.\n Example\n ```javascript\n store.hasRecordForId('post', 1); // false\n store.findRecord('post', 1).then(function() {\n store.hasRecordForId('post', 1); // true\n });\n ```\n @method hasRecordForId\n @param {String} modelName\n @param {(String|Integer)} id\n @return {Boolean}\n */\n hasRecordForId(modelName, id) {\n (true && !(Ember.isPresent(modelName)) && Ember.assert(`You need to pass a model name to the store's hasRecordForId method`, Ember.isPresent(modelName)));\n (true && !(typeof modelName === 'string') && Ember.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));\n\n\n var normalizedModelName = normalizeModelName(modelName);\n\n var trueId = coerceId(id);\n var internalModel = this._internalModelsFor(normalizedModelName).get(trueId);\n\n return !!internalModel && internalModel.isLoaded();\n },\n\n /**\n Returns id record for a given type and ID. If one isn't already loaded,\n it builds a new record and leaves it in the `empty` state.\n @method recordForId\n @private\n @param {String} modelName\n @param {(String|Integer)} id\n @return {DS.Model} record\n */\n recordForId(modelName, id) {\n (true && !(Ember.isPresent(modelName)) && Ember.assert(`You need to pass a model name to the store's recordForId method`, Ember.isPresent(modelName)));\n (true && !(typeof modelName === 'string') && Ember.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));\n\n\n return this._internalModelForId(modelName, id).getRecord();\n },\n\n _internalModelForId(modelName, id) {\n var trueId = coerceId(id);\n var internalModel = this._internalModelsFor(modelName).get(trueId);\n\n if (internalModel) {\n if (internalModel.hasScheduledDestroy()) {\n internalModel.destroySync();\n return this._buildInternalModel(modelName, trueId);\n } else {\n return internalModel;\n }\n } else {\n return this._buildInternalModel(modelName, trueId);\n }\n },\n\n _internalModelDidReceiveRelationshipData(modelName, id, relationshipData) {\n this._relationshipsPayloads.push(modelName, id, relationshipData);\n },\n\n _internalModelDestroyed(internalModel) {\n this._removeFromIdMap(internalModel);\n this._relationshipsPayloads.unload(internalModel.modelName, internalModel.id);\n },\n\n /**\n @method findMany\n @private\n @param {Array} internalModels\n @return {Promise} promise\n */\n findMany(internalModels) {\n var finds = new Array(internalModels.length);\n\n for (var i = 0; i < internalModels.length; i++) {\n finds[i] = this._findEmptyInternalModel(internalModels[i]);\n }\n\n return Promise.all(finds);\n },\n\n /**\n If a relationship was originally populated by the adapter as a link\n (as opposed to a list of IDs), this method is called when the\n relationship is fetched.\n The link (which is usually a URL) is passed through unchanged, so the\n adapter can make whatever request it wants.\n The usual use-case is for the server to register a URL as a link, and\n then use that URL in the future to make a request for the relationship.\n @method findHasMany\n @private\n @param {InternalModel} internalModel\n @param {any} link\n @param {(Relationship)} relationship\n @return {Promise} promise\n */\n findHasMany(internalModel, link, relationship) {\n var adapter = this.adapterFor(internalModel.modelName);\n\n (true && !(adapter) && Ember.assert(`You tried to load a hasMany relationship but you have no adapter (for ${internalModel.modelName})`, adapter));\n (true && !(typeof adapter.findHasMany === 'function') && Ember.assert(`You tried to load a hasMany relationship from a specified 'link' in the original payload but your adapter does not implement 'findHasMany'`, typeof adapter.findHasMany === 'function'));\n\n\n return _findHasMany(adapter, this, internalModel, link, relationship);\n },\n\n /**\n @method findBelongsTo\n @private\n @param {InternalModel} internalModel\n @param {any} link\n @param {Relationship} relationship\n @return {Promise} promise\n */\n findBelongsTo(internalModel, link, relationship) {\n var adapter = this.adapterFor(internalModel.modelName);\n\n (true && !(adapter) && Ember.assert(`You tried to load a belongsTo relationship but you have no adapter (for ${internalModel.modelName})`, adapter));\n (true && !(typeof adapter.findBelongsTo === 'function') && Ember.assert(`You tried to load a belongsTo relationship from a specified 'link' in the original payload but your adapter does not implement 'findBelongsTo'`, typeof adapter.findBelongsTo === 'function'));\n\n\n return _findBelongsTo(adapter, this, internalModel, link, relationship);\n },\n\n /**\n This method delegates a query to the adapter. This is the one place where\n adapter-level semantics are exposed to the application.\n Each time this method is called a new request is made through the adapter.\n Exposing queries this way seems preferable to creating an abstract query\n language for all server-side queries, and then require all adapters to\n implement them.\n ---\n If you do something like this:\n ```javascript\n store.query('person', { page: 1 });\n ```\n The call made to the server, using a Rails backend, will look something like this:\n ```\n Started GET \"/api/v1/person?page=1\"\n Processing by Api::V1::PersonsController#index as HTML\n Parameters: { \"page\"=>\"1\" }\n ```\n ---\n If you do something like this:\n ```javascript\n store.query('person', { ids: [1, 2, 3] });\n ```\n The call to the server, using a Rails backend, will look something like this:\n ```\n Started GET \"/api/v1/person?ids%5B%5D=1&ids%5B%5D=2&ids%5B%5D=3\"\n Processing by Api::V1::PersonsController#index as HTML\n Parameters: { \"ids\" => [\"1\", \"2\", \"3\"] }\n ```\n This method returns a promise, which is resolved with an\n [`AdapterPopulatedRecordArray`](https://emberjs.com/api/data/classes/DS.AdapterPopulatedRecordArray.html)\n once the server returns.\n @since 1.13.0\n @method query\n @param {String} modelName\n @param {any} query an opaque query to be used by the adapter\n @return {Promise} promise\n */\n query(modelName, query) {\n (true && !(Ember.isPresent(modelName)) && Ember.assert(`You need to pass a model name to the store's query method`, Ember.isPresent(modelName)));\n (true && !(query) && Ember.assert(`You need to pass a query hash to the store's query method`, query));\n (true && !(typeof modelName === 'string') && Ember.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));\n\n\n var normalizedModelName = normalizeModelName(modelName);\n return this._query(normalizedModelName, query);\n },\n\n _query(modelName, query, array) {\n (true && !(Ember.isPresent(modelName)) && Ember.assert(`You need to pass a model name to the store's query method`, Ember.isPresent(modelName)));\n (true && !(query) && Ember.assert(`You need to pass a query hash to the store's query method`, query));\n (true && !(typeof modelName === 'string') && Ember.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));\n\n var adapter = this.adapterFor(modelName);\n (true && !(adapter) && Ember.assert(`You tried to load a query but you have no adapter (for ${modelName})`, adapter));\n (true && !(typeof adapter.query === 'function') && Ember.assert(`You tried to load a query but your adapter does not implement 'query'`, typeof adapter.query === 'function'));\n\n\n var pA = promiseArray(_query(adapter, this, modelName, query, array));\n\n return pA;\n },\n\n /**\n This method makes a request for one record, where the `id` is not known\n beforehand (if the `id` is known, use [`findRecord`](#method_findRecord)\n instead).\n This method can be used when it is certain that the server will return a\n single object for the primary data.\n Each time this method is called a new request is made through the adapter.\n Let's assume our API provides an endpoint for the currently logged in user\n via:\n ```\n // GET /api/current_user\n {\n user: {\n id: 1234,\n username: 'admin'\n }\n }\n ```\n Since the specific `id` of the `user` is not known beforehand, we can use\n `queryRecord` to get the user:\n ```javascript\n store.queryRecord('user', {}).then(function(user) {\n let username = user.get('username');\n console.log(`Currently logged in as ${username}`);\n });\n ```\n The request is made through the adapters' `queryRecord`:\n ```app/adapters/user.js\n import $ from 'jquery';\n import DS from 'ember-data';\n export default DS.Adapter.extend({\n queryRecord(modelName, query) {\n return $.getJSON('/api/current_user');\n }\n });\n ```\n Note: the primary use case for `store.queryRecord` is when a single record\n is queried and the `id` is not known beforehand. In all other cases\n `store.query` and using the first item of the array is likely the preferred\n way:\n ```\n // GET /users?username=unique\n {\n data: [{\n id: 1234,\n type: 'user',\n attributes: {\n username: \"unique\"\n }\n }]\n }\n ```\n ```javascript\n store.query('user', { username: 'unique' }).then(function(users) {\n return users.get('firstObject');\n }).then(function(user) {\n let id = user.get('id');\n });\n ```\n This method returns a promise, which resolves with the found record.\n If the adapter returns no data for the primary data of the payload, then\n `queryRecord` resolves with `null`:\n ```\n // GET /users?username=unique\n {\n data: null\n }\n ```\n ```javascript\n store.queryRecord('user', { username: 'unique' }).then(function(user) {\n console.log(user); // null\n });\n ```\n @since 1.13.0\n @method queryRecord\n @param {String} modelName\n @param {any} query an opaque query to be used by the adapter\n @return {Promise} promise which resolves with the found record or `null`\n */\n queryRecord(modelName, query) {\n (true && !(Ember.isPresent(modelName)) && Ember.assert(`You need to pass a model name to the store's queryRecord method`, Ember.isPresent(modelName)));\n (true && !(query) && Ember.assert(`You need to pass a query hash to the store's queryRecord method`, query));\n (true && !(typeof modelName === 'string') && Ember.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));\n\n\n var normalizedModelName = normalizeModelName(modelName);\n\n var adapter = this.adapterFor(normalizedModelName);\n\n (true && !(adapter) && Ember.assert(`You tried to make a query but you have no adapter (for ${normalizedModelName})`, adapter));\n (true && !(typeof adapter.queryRecord === 'function') && Ember.assert(`You tried to make a query but your adapter does not implement 'queryRecord'`, typeof adapter.queryRecord === 'function'));\n\n\n return promiseObject(_queryRecord(adapter, this, modelName, query).then(internalModel => {\n // the promise returned by store.queryRecord is expected to resolve with\n // an instance of DS.Model\n if (internalModel) {\n return internalModel.getRecord();\n }\n\n return null;\n }));\n },\n\n /**\n `findAll` asks the adapter's `findAll` method to find the records for the\n given type, and returns a promise which will resolve with all records of\n this type present in the store, even if the adapter only returns a subset\n of them.\n ```app/routes/authors.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n model(params) {\n return this.store.findAll('author');\n }\n });\n ```\n _When_ the returned promise resolves depends on the reload behavior,\n configured via the passed `options` hash and the result of the adapter's\n `shouldReloadAll` method.\n ### Reloading\n If `{ reload: true }` is passed or `adapter.shouldReloadAll` evaluates to\n `true`, then the returned promise resolves once the adapter returns data,\n regardless if there are already records in the store:\n ```js\n store.push({\n data: {\n id: 'first',\n type: 'author'\n }\n });\n // adapter#findAll resolves with\n // [\n // {\n // id: 'second',\n // type: 'author'\n // }\n // ]\n store.findAll('author', { reload: true }).then(function(authors) {\n authors.getEach('id'); // ['first', 'second']\n });\n ```\n If no reload is indicated via the abovementioned ways, then the promise\n immediately resolves with all the records currently loaded in the store.\n ### Background Reloading\n Optionally, if `adapter.shouldBackgroundReloadAll` evaluates to `true`,\n then a background reload is started. Once this resolves, the array with\n which the promise resolves, is updated automatically so it contains all the\n records in the store:\n ```app/adapters/application.js\n import DS from 'ember-data';\n export default DS.Adapter.extend({\n shouldReloadAll(store, snapshotsArray) {\n return false;\n },\n shouldBackgroundReloadAll(store, snapshotsArray) {\n return true;\n }\n });\n // ...\n store.push({\n data: {\n id: 'first',\n type: 'author'\n }\n });\n let allAuthors;\n store.findAll('author').then(function(authors) {\n authors.getEach('id'); // ['first']\n allAuthors = authors;\n });\n // later, once adapter#findAll resolved with\n // [\n // {\n // id: 'second',\n // type: 'author'\n // }\n // ]\n allAuthors.getEach('id'); // ['first', 'second']\n ```\n If you would like to force or prevent background reloading, you can set a\n boolean value for `backgroundReload` in the options object for\n `findAll`.\n ```app/routes/post/edit.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n model() {\n return this.store.findAll('post', { backgroundReload: false });\n }\n });\n ```\n If you pass an object on the `adapterOptions` property of the options\n argument it will be passed to you adapter via the `snapshotRecordArray`\n ```app/routes/posts.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n model(params) {\n return this.store.findAll('post', {\n adapterOptions: { subscribe: false }\n });\n }\n });\n ```\n ```app/adapters/post.js\n import MyCustomAdapter from './custom-adapter';\n export default MyCustomAdapter.extend({\n findAll(store, type, sinceToken, snapshotRecordArray) {\n if (snapshotRecordArray.adapterOptions.subscribe) {\n // ...\n }\n // ...\n }\n });\n ```\n See [peekAll](#method_peekAll) to get an array of current records in the\n store, without waiting until a reload is finished.\n ### Retrieving Related Model Records\n If you use an adapter such as Ember's default\n [`JSONAPIAdapter`](https://emberjs.com/api/data/classes/DS.JSONAPIAdapter.html)\n that supports the [JSON API specification](http://jsonapi.org/) and if your server\n endpoint supports the use of an\n ['include' query parameter](http://jsonapi.org/format/#fetching-includes),\n you can use `findAll()` to automatically retrieve additional records related to\n those requested by supplying an `include` parameter in the `options` object.\n For example, given a `post` model that has a `hasMany` relationship with a `comment`\n model, when we retrieve all of the post records we can have the server also return\n all of the posts' comments in the same request:\n ```app/routes/posts.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n model() {\n return this.store.findAll('post', { include: 'comments' });\n }\n });\n ```\n Multiple relationships can be requested using an `include` parameter consisting of a\n comma-separated list (without white-space) while nested relationships can be specified\n using a dot-separated sequence of relationship names. So to request both the posts'\n comments and the authors of those comments the request would look like this:\n ```app/routes/posts.js\n import Route from '@ember/routing/route';\n export default Route.extend({\n model() {\n return this.store.findAll('post', { include: 'comments,comments.author' });\n }\n });\n ```\n See [query](#method_query) to only get a subset of records from the server.\n @since 1.13.0\n @method findAll\n @param {String} modelName\n @param {Object} options\n @return {Promise} promise\n */\n findAll(modelName, options) {\n (true && !(Ember.isPresent(modelName)) && Ember.assert(`You need to pass a model name to the store's findAll method`, Ember.isPresent(modelName)));\n (true && !(typeof modelName === 'string') && Ember.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));\n\n var normalizedModelName = normalizeModelName(modelName);\n var fetch = this._fetchAll(normalizedModelName, this.peekAll(normalizedModelName), options);\n\n return fetch;\n },\n\n /**\n @method _fetchAll\n @private\n @param {DS.Model} modelName\n @param {DS.RecordArray} array\n @return {Promise} promise\n */\n _fetchAll(modelName, array, options = {}) {\n var adapter = this.adapterFor(modelName);\n var sinceToken = this._internalModelsFor(modelName).metadata.since;\n\n (true && !(adapter) && Ember.assert(`You tried to load all records but you have no adapter (for ${modelName})`, adapter));\n (true && !(typeof adapter.findAll === 'function') && Ember.assert(`You tried to load all records but your adapter does not implement 'findAll'`, typeof adapter.findAll === 'function'));\n\n\n if (options.reload) {\n Ember.set(array, 'isUpdating', true);\n return promiseArray(_findAll(adapter, this, modelName, sinceToken, options));\n }\n\n var snapshotArray = array._createSnapshot(options);\n\n if (adapter.shouldReloadAll(this, snapshotArray)) {\n Ember.set(array, 'isUpdating', true);\n return promiseArray(_findAll(adapter, this, modelName, sinceToken, options));\n }\n\n if (options.backgroundReload === false) {\n return promiseArray(Promise.resolve(array));\n }\n\n if (options.backgroundReload || adapter.shouldBackgroundReloadAll(this, snapshotArray)) {\n Ember.set(array, 'isUpdating', true);\n _findAll(adapter, this, modelName, sinceToken, options);\n }\n\n return promiseArray(Promise.resolve(array));\n },\n\n /**\n @method _didUpdateAll\n @param {String} modelName\n @private\n */\n _didUpdateAll(modelName) {\n this.recordArrayManager._didUpdateAll(modelName);\n },\n\n didUpdateAll(modelName) {\n (true && !(false) && Ember.deprecate('didUpdateAll was documented as private and will be removed in the next version of Ember Data.', false, { id: 'ember-data.didUpdateAll', until: '2.17.0' }));\n\n return this._didUpdateAll(modelName);\n },\n\n /**\n This method returns a filtered array that contains all of the\n known records for a given type in the store.\n Note that because it's just a filter, the result will contain any\n locally created records of the type, however, it will not make a\n request to the backend to retrieve additional records. If you\n would like to request all the records from the backend please use\n [store.findAll](#method_findAll).\n Also note that multiple calls to `peekAll` for a given type will always\n return the same `RecordArray`.\n Example\n ```javascript\n let localPosts = store.peekAll('post');\n ```\n @since 1.13.0\n @method peekAll\n @param {String} modelName\n @return {DS.RecordArray}\n */\n peekAll(modelName) {\n (true && !(Ember.isPresent(modelName)) && Ember.assert(`You need to pass a model name to the store's peekAll method`, Ember.isPresent(modelName)));\n (true && !(typeof modelName === 'string') && Ember.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));\n\n var normalizedModelName = normalizeModelName(modelName);\n return this.recordArrayManager.liveRecordArrayFor(normalizedModelName);\n },\n\n /**\n This method unloads all records in the store.\n It schedules unloading to happen during the next run loop.\n Optionally you can pass a type which unload all records for a given type.\n ```javascript\n store.unloadAll();\n store.unloadAll('post');\n ```\n @method unloadAll\n @param {String} modelName\n */\n unloadAll(modelName) {\n (true && !(!modelName || typeof modelName === 'string') && Ember.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, !modelName || typeof modelName === 'string'));\n\n\n if (arguments.length === 0) {\n this._identityMap.clear();\n } else {\n var normalizedModelName = normalizeModelName(modelName);\n this._internalModelsFor(normalizedModelName).clear();\n }\n },\n\n /**\n Takes a type and filter function, and returns a live RecordArray that\n remains up to date as new records are loaded into the store or created\n locally.\n The filter function takes a materialized record, and returns true\n if the record should be included in the filter and false if it should\n not.\n Example\n ```javascript\n store.filter('post', function(post) {\n return post.get('unread');\n });\n ```\n The filter function is called once on all records for the type when\n it is created, and then once on each newly loaded or created record.\n If any of a record's properties change, or if it changes state, the\n filter function will be invoked again to determine whether it should\n still be in the array.\n Optionally you can pass a query, which is the equivalent of calling\n [query](#method_query) with that same query, to fetch additional records\n from the server. The results returned by the server could then appear\n in the filter if they match the filter function.\n The query itself is not used to filter records, it's only sent to your\n server for you to be able to do server-side filtering. The filter\n function will be applied on the returned results regardless.\n Example\n ```javascript\n store.filter('post', { unread: true }, function(post) {\n return post.get('unread');\n }).then(function(unreadPosts) {\n unreadPosts.get('length'); // 5\n let unreadPost = unreadPosts.objectAt(0);\n unreadPost.set('unread', false);\n unreadPosts.get('length'); // 4\n });\n ```\n @method filter\n @private\n @param {String} modelName\n @param {Object} query optional query\n @param {Function} filter\n @return {DS.PromiseArray}\n @deprecated\n */\n filter(modelName, query, filter) {\n (true && !(Ember.isPresent(modelName)) && Ember.assert(`You need to pass a model name to the store's filter method`, Ember.isPresent(modelName)));\n (true && !(typeof modelName === 'string') && Ember.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));\n\n\n if (!ENV.ENABLE_DS_FILTER) {\n (true && !(false) && Ember.assert('The filter API has been moved to a plugin. To enable store.filter using an environment flag, or to use an alternative, you can visit the ember-data-filter addon page. https://github.com/ember-data/ember-data-filter', false));\n }\n\n var promise = void 0;\n var length = arguments.length;\n var array = void 0;\n var hasQuery = length === 3;\n\n var normalizedModelName = normalizeModelName(modelName);\n\n // allow an optional server query\n if (hasQuery) {\n promise = this.query(normalizedModelName, query);\n } else if (arguments.length === 2) {\n filter = query;\n }\n\n if (hasQuery) {\n array = this.recordArrayManager.createFilteredRecordArray(normalizedModelName, filter, query);\n } else {\n array = this.recordArrayManager.createFilteredRecordArray(normalizedModelName, filter);\n }\n\n promise = promise || Promise.resolve(array);\n\n return promiseArray(promise.then(() => array, null, `DS: Store#filter of ${normalizedModelName}`));\n },\n\n /**\n This method has been deprecated and is an alias for store.hasRecordForId, which should\n be used instead.\n @deprecated\n @method recordIsLoaded\n @param {String} modelName\n @param {string} id\n @return {boolean}\n */\n recordIsLoaded(modelName, id) {\n (true && !(false) && Ember.deprecate(`Use of recordIsLoaded is deprecated, use hasRecordForId instead.`, false, {\n id: 'ds.store.recordIsLoaded',\n until: '3.0'\n }));\n\n return this.hasRecordForId(modelName, id);\n },\n\n // ..............\n // . PERSISTING .\n // ..............\n\n /**\n This method is called by `record.save`, and gets passed a\n resolver for the promise that `record.save` returns.\n It schedules saving to happen at the end of the run loop.\n @method scheduleSave\n @private\n @param {InternalModel} internalModel\n @param {Resolver} resolver\n @param {Object} options\n */\n scheduleSave(internalModel, resolver, options) {\n var snapshot = internalModel.createSnapshot(options);\n internalModel.flushChangedAttributes();\n internalModel.adapterWillCommit();\n this._pendingSave.push({\n snapshot: snapshot,\n resolver: resolver\n });\n Ember.run.once(this, this.flushPendingSave);\n },\n\n /**\n This method is called at the end of the run loop, and\n flushes any records passed into `scheduleSave`\n @method flushPendingSave\n @private\n */\n flushPendingSave() {\n var pending = this._pendingSave.slice();\n this._pendingSave = [];\n\n for (var i = 0, j = pending.length; i < j; i++) {\n var pendingItem = pending[i];\n var snapshot = pendingItem.snapshot;\n var resolver = pendingItem.resolver;\n var internalModel = snapshot._internalModel;\n var adapter = this.adapterFor(internalModel.modelName);\n var operation = void 0;\n\n if (internalModel.currentState.stateName === 'root.deleted.saved') {\n resolver.resolve();\n continue;\n } else if (internalModel.isNew()) {\n operation = 'createRecord';\n } else if (internalModel.isDeleted()) {\n operation = 'deleteRecord';\n } else {\n operation = 'updateRecord';\n }\n\n resolver.resolve(_commit(adapter, this, operation, snapshot));\n }\n },\n\n /**\n This method is called once the promise returned by an\n adapter's `createRecord`, `updateRecord` or `deleteRecord`\n is resolved.\n If the data provides a server-generated ID, it will\n update the record and the store's indexes.\n @method didSaveRecord\n @private\n @param {InternalModel} internalModel the in-flight internal model\n @param {Object} data optional data (see above)\n */\n didSaveRecord(internalModel, dataArg) {\n var data = void 0;\n if (dataArg) {\n data = dataArg.data;\n }\n if (data) {\n // normalize relationship IDs into records\n this.updateId(internalModel, data);\n this._setupRelationshipsForModel(internalModel, data);\n } else {\n (true && !(internalModel.id) && Ember.assert(`Your ${internalModel.modelName} record was saved to the server, but the response does not have an id and no id has been set client side. Records must have ids. Please update the server response to provide an id in the response or generate the id on the client side either before saving the record or while normalizing the response.`, internalModel.id));\n }\n\n //We first make sure the primary data has been updated\n //TODO try to move notification to the user to the end of the runloop\n internalModel.adapterDidCommit(data);\n },\n\n /**\n This method is called once the promise returned by an\n adapter's `createRecord`, `updateRecord` or `deleteRecord`\n is rejected with a `DS.InvalidError`.\n @method recordWasInvalid\n @private\n @param {InternalModel} internalModel\n @param {Object} errors\n */\n recordWasInvalid(internalModel, errors) {\n internalModel.adapterDidInvalidate(errors);\n },\n\n /**\n This method is called once the promise returned by an\n adapter's `createRecord`, `updateRecord` or `deleteRecord`\n is rejected (with anything other than a `DS.InvalidError`).\n @method recordWasError\n @private\n @param {InternalModel} internalModel\n @param {Error} error\n */\n recordWasError(internalModel, error) {\n internalModel.adapterDidError(error);\n },\n\n /**\n When an adapter's `createRecord`, `updateRecord` or `deleteRecord`\n resolves with data, this method extracts the ID from the supplied\n data.\n @method updateId\n @private\n @param {InternalModel} internalModel\n @param {Object} data\n */\n updateId(internalModel, data) {\n var oldId = internalModel.id;\n var modelName = internalModel.modelName;\n var id = coerceId(data.id);\n\n // ID absolutely can't be missing if the oldID is empty (missing Id in response for a new record)\n (true && !(!(id === null && oldId === null)) && Ember.assert(`'${modelName}' was saved to the server, but the response does not have an id and your record does not either.`, !(id === null && oldId === null)));\n\n // ID absolutely can't be different than oldID if oldID is not null\n\n (true && !(!(oldId !== null && id !== oldId)) && Ember.assert(`'${modelName}:${oldId}' was saved to the server, but the response returned the new id '${id}'. The store cannot assign a new id to a record that already has an id.`, !(oldId !== null && id !== oldId)));\n\n // ID can be null if oldID is not null (altered ID in response for a record)\n // however, this is more than likely a developer error.\n\n if (oldId !== null && id === null) {\n (true && Ember.warn(`Your ${modelName} record was saved to the server, but the response does not have an id.`, !(oldId !== null && id === null)));\n\n return;\n }\n\n var existingInternalModel = this._existingInternalModelForId(modelName, id);\n\n (true && !(Ember.isNone(existingInternalModel) || existingInternalModel === internalModel) && Ember.assert(`'${modelName}' was saved to the server, but the response returned the new id '${id}', which has already been used with another record.'`, Ember.isNone(existingInternalModel) || existingInternalModel === internalModel));\n\n\n this._internalModelsFor(internalModel.modelName).set(id, internalModel);\n\n internalModel.setId(id);\n },\n\n /**\n Returns a map of IDs to client IDs for a given modelName.\n @method _internalModelsFor\n @private\n @param {String} modelName\n @return {Object} recordMap\n */\n _internalModelsFor(modelName) {\n return this._identityMap.retrieve(modelName);\n },\n\n // ................\n // . LOADING DATA .\n // ................\n\n /**\n This internal method is used by `push`.\n @method _load\n @private\n @param {Object} data\n */\n _load(data) {\n var modelName = normalizeModelName(data.type);\n var internalModel = this._internalModelForId(modelName, data.id);\n\n var isUpdate = internalModel.currentState.isEmpty === false;\n\n internalModel.setupData(data);\n\n if (isUpdate) {\n this.recordArrayManager.recordDidChange(internalModel);\n } else {\n this.recordArrayManager.recordWasLoaded(internalModel);\n }\n\n return internalModel;\n },\n\n /*\n In case someone defined a relationship to a mixin, for example:\n ```\n let Comment = DS.Model.extend({\n owner: belongsTo('commentable'. { polymorphic: true })\n });\n let Commentable = Ember.Mixin.create({\n comments: hasMany('comment')\n });\n ```\n we want to look up a Commentable class which has all the necessary\n relationship metadata. Thus, we look up the mixin and create a mock\n DS.Model, so we can access the relationship CPs of the mixin (`comments`)\n in this case\n @private\n */\n _modelForMixin(normalizedModelName) {\n // container.registry = 2.1\n // container._registry = 1.11 - 2.0\n // container = < 1.11\n var owner = getOwner(this);\n var mixin = void 0;\n\n if (owner.factoryFor) {\n var MaybeMixin = owner.factoryFor(`mixin:${normalizedModelName}`);\n mixin = MaybeMixin && MaybeMixin.class;\n } else {\n mixin = owner._lookupFactory(`mixin:${normalizedModelName}`);\n }\n\n if (mixin) {\n var ModelForMixin = Model.extend(mixin);\n ModelForMixin.reopenClass({\n __isMixin: true,\n __mixin: mixin\n });\n\n //Cache the class as a model\n owner.register('model:' + normalizedModelName, ModelForMixin);\n }\n\n return this.modelFactoryFor(normalizedModelName);\n },\n\n /**\n Returns the model class for the particular `modelName`.\n The class of a model might be useful if you want to get a list of all the\n relationship names of the model, see\n [`relationshipNames`](https://emberjs.com/api/data/classes/DS.Model.html#property_relationshipNames)\n for example.\n @method modelFor\n @param {String} modelName\n @return {DS.Model}\n */\n modelFor(modelName) {\n (true && !(Ember.isPresent(modelName)) && Ember.assert(`You need to pass a model name to the store's modelFor method`, Ember.isPresent(modelName)));\n (true && !(typeof modelName === 'string') && Ember.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));\n\n\n var normalizedModelName = normalizeModelName(modelName);\n\n return this._modelFor(normalizedModelName);\n },\n\n /*\n @private\n */\n _modelFor(modelName) {\n var maybeFactory = this._modelFactoryFor(modelName);\n // for factorFor factory/class split\n return maybeFactory.class ? maybeFactory.class : maybeFactory;\n },\n\n _modelFactoryFor(modelName) {\n var factory = this._modelFactoryCache[modelName];\n\n if (!factory) {\n factory = this.modelFactoryFor(modelName);\n\n if (!factory) {\n //Support looking up mixins as base types for polymorphic relationships\n factory = this._modelForMixin(modelName);\n }\n if (!factory) {\n throw new Ember.Error(`No model was found for '${modelName}'`);\n }\n\n // interopt with the future\n var klass = getOwner(this).factoryFor ? factory.class : factory;\n\n (true && !(klass.isModel) && Ember.assert(`'${Ember.inspect(klass)}' does not appear to be an ember-data model`, klass.isModel));\n\n // TODO: deprecate this\n\n klass.modelName = klass.modelName || modelName;\n\n this._modelFactoryCache[modelName] = factory;\n }\n\n return factory;\n },\n\n /*\n @private\n */\n modelFactoryFor(modelName) {\n (true && !(Ember.isPresent(modelName)) && Ember.assert(`You need to pass a model name to the store's modelFactoryFor method`, Ember.isPresent(modelName)));\n (true && !(typeof modelName === 'string') && Ember.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));\n\n\n var normalizedModelName = normalizeModelName(modelName);\n var owner = getOwner(this);\n\n if (owner.factoryFor) {\n return owner.factoryFor(`model:${normalizedModelName}`);\n } else {\n return owner._lookupFactory(`model:${normalizedModelName}`);\n }\n },\n\n /**\n Push some data for a given type into the store.\n This method expects normalized [JSON API](http://jsonapi.org/) document. This means you have to follow [JSON API specification](http://jsonapi.org/format/) with few minor adjustments:\n - record's `type` should always be in singular, dasherized form\n - members (properties) should be camelCased\n [Your primary data should be wrapped inside `data` property](http://jsonapi.org/format/#document-top-level):\n ```js\n store.push({\n data: {\n // primary data for single record of type `Person`\n id: '1',\n type: 'person',\n attributes: {\n firstName: 'Daniel',\n lastName: 'Kmak'\n }\n }\n });\n ```\n [Demo.](http://ember-twiddle.com/fb99f18cd3b4d3e2a4c7)\n `data` property can also hold an array (of records):\n ```js\n store.push({\n data: [\n // an array of records\n {\n id: '1',\n type: 'person',\n attributes: {\n firstName: 'Daniel',\n lastName: 'Kmak'\n }\n },\n {\n id: '2',\n type: 'person',\n attributes: {\n firstName: 'Tom',\n lastName: 'Dale'\n }\n }\n ]\n });\n ```\n [Demo.](http://ember-twiddle.com/69cdbeaa3702159dc355)\n There are some typical properties for `JSONAPI` payload:\n * `id` - mandatory, unique record's key\n * `type` - mandatory string which matches `model`'s dasherized name in singular form\n * `attributes` - object which holds data for record attributes - `DS.attr`'s declared in model\n * `relationships` - object which must contain any of the following properties under each relationships' respective key (example path is `relationships.achievements.data`):\n - [`links`](http://jsonapi.org/format/#document-links)\n - [`data`](http://jsonapi.org/format/#document-resource-object-linkage) - place for primary data\n - [`meta`](http://jsonapi.org/format/#document-meta) - object which contains meta-information about relationship\n For this model:\n ```app/models/person.js\n import DS from 'ember-data';\n export default DS.Model.extend({\n firstName: DS.attr('string'),\n lastName: DS.attr('string'),\n children: DS.hasMany('person')\n });\n ```\n To represent the children as IDs:\n ```js\n {\n data: {\n id: '1',\n type: 'person',\n attributes: {\n firstName: 'Tom',\n lastName: 'Dale'\n },\n relationships: {\n children: {\n data: [\n {\n id: '2',\n type: 'person'\n },\n {\n id: '3',\n type: 'person'\n },\n {\n id: '4',\n type: 'person'\n }\n ]\n }\n }\n }\n }\n ```\n [Demo.](http://ember-twiddle.com/343e1735e034091f5bde)\n To represent the children relationship as a URL:\n ```js\n {\n data: {\n id: '1',\n type: 'person',\n attributes: {\n firstName: 'Tom',\n lastName: 'Dale'\n },\n relationships: {\n children: {\n links: {\n related: '/people/1/children'\n }\n }\n }\n }\n }\n ```\n If you're streaming data or implementing an adapter, make sure\n that you have converted the incoming data into this form. The\n store's [normalize](#method_normalize) method is a convenience\n helper for converting a json payload into the form Ember Data\n expects.\n ```js\n store.push(store.normalize('person', data));\n ```\n This method can be used both to push in brand new\n records, as well as to update existing records.\n @method push\n @param {Object} data\n @return {DS.Model|Array} the record(s) that was created or\n updated.\n */\n push(data) {\n var pushed = this._push(data);\n\n if (Array.isArray(pushed)) {\n var records = pushed.map(internalModel => internalModel.getRecord());\n\n return records;\n }\n\n if (pushed === null) {\n return null;\n }\n\n var record = pushed.getRecord();\n\n return record;\n },\n\n /*\n Push some data in the form of a json-api document into the store,\n without creating materialized records.\n @method _push\n @private\n @param {Object} jsonApiDoc\n @return {DS.InternalModel|Array<DS.InternalModel>} pushed InternalModel(s)\n */\n _push(jsonApiDoc) {\n var internalModelOrModels = this._backburner.join(() => {\n var included = jsonApiDoc.included;\n var i = void 0,\n length = void 0;\n\n if (included) {\n for (i = 0, length = included.length; i < length; i++) {\n this._pushInternalModel(included[i]);\n }\n }\n\n if (Array.isArray(jsonApiDoc.data)) {\n length = jsonApiDoc.data.length;\n var internalModels = new Array(length);\n\n for (i = 0; i < length; i++) {\n internalModels[i] = this._pushInternalModel(jsonApiDoc.data[i]);\n }\n return internalModels;\n }\n\n if (jsonApiDoc.data === null) {\n return null;\n }\n\n (true && !(Ember.typeOf(jsonApiDoc.data) === 'object') && Ember.assert(`Expected an object in the 'data' property in a call to 'push' for ${jsonApiDoc.type}, but was ${Ember.typeOf(jsonApiDoc.data)}`, Ember.typeOf(jsonApiDoc.data) === 'object'));\n\n\n return this._pushInternalModel(jsonApiDoc.data);\n });\n\n return internalModelOrModels;\n },\n\n _hasModelFor(modelName) {\n var owner = getOwner(this);\n modelName = normalizeModelName(modelName);\n\n if (owner.factoryFor) {\n return !!owner.factoryFor(`model:${modelName}`);\n } else {\n return !!owner._lookupFactory(`model:${modelName}`);\n }\n },\n\n _pushInternalModel(data) {\n var modelName = data.type;\n (true && !(data.id !== null && data.id !== undefined && data.id !== '') && Ember.assert(`You must include an 'id' for ${modelName} in an object passed to 'push'`, data.id !== null && data.id !== undefined && data.id !== ''));\n (true && !(this._hasModelFor(modelName)) && Ember.assert(`You tried to push data with a type '${modelName}' but no model could be found with that name.`, this._hasModelFor(modelName)));\n\n\n {\n // If ENV.DS_WARN_ON_UNKNOWN_KEYS is set to true and the payload\n // contains unknown attributes or relationships, log a warning.\n\n if (ENV.DS_WARN_ON_UNKNOWN_KEYS) {\n var modelClass = this._modelFor(modelName);\n\n // Check unknown attributes\n var unknownAttributes = Object.keys(data.attributes || {}).filter(key => {\n return !Ember.get(modelClass, 'fields').has(key);\n });\n var unknownAttributesMessage = `The payload for '${modelName}' contains these unknown attributes: ${unknownAttributes}. Make sure they've been defined in your model.`;\n (true && Ember.warn(unknownAttributesMessage, unknownAttributes.length === 0, { id: 'ds.store.unknown-keys-in-payload' }));\n\n // Check unknown relationships\n\n var unknownRelationships = Object.keys(data.relationships || {}).filter(key => {\n return !Ember.get(modelClass, 'fields').has(key);\n });\n var unknownRelationshipsMessage = `The payload for '${modelName}' contains these unknown relationships: ${unknownRelationships}. Make sure they've been defined in your model.`;\n (true && Ember.warn(unknownRelationshipsMessage, unknownRelationships.length === 0, { id: 'ds.store.unknown-keys-in-payload' }));\n }\n }\n\n // Actually load the record into the store.\n var internalModel = this._load(data);\n\n this._setupRelationshipsForModel(internalModel, data);\n\n return internalModel;\n },\n\n _setupRelationshipsForModel(internalModel, data) {\n if (data.relationships === undefined) {\n return;\n }\n\n if (this._pushedInternalModels.push(internalModel, data) !== 2) {\n return;\n }\n\n this._backburner.schedule('normalizeRelationships', this, this._setupRelationships);\n },\n\n _setupRelationships() {\n var pushed = this._pushedInternalModels;\n\n // Cache the inverse maps for each modelClass that we visit during this\n // payload push. In the common case where we are pushing many more\n // instances than types we want to minimize the cost of looking up the\n // inverse map and the overhead of Ember.get adds up.\n var modelNameToInverseMap = void 0;\n\n for (var i = 0, l = pushed.length; i < l; i += 2) {\n modelNameToInverseMap = modelNameToInverseMap || Object.create(null);\n // This will convert relationships specified as IDs into DS.Model instances\n // (possibly unloaded) and also create the data structures used to track\n // relationships.\n var internalModel = pushed[i];\n var data = pushed[i + 1];\n setupRelationships(this, internalModel, data, modelNameToInverseMap);\n }\n\n pushed.length = 0;\n },\n\n /**\n Push some raw data into the store.\n This method can be used both to push in brand new\n records, as well as to update existing records. You\n can push in more than one type of object at once.\n All objects should be in the format expected by the\n serializer.\n ```app/serializers/application.js\n import DS from 'ember-data';\n export default DS.ActiveModelSerializer;\n ```\n ```js\n let pushData = {\n posts: [\n { id: 1, post_title: \"Great post\", comment_ids: [2] }\n ],\n comments: [\n { id: 2, comment_body: \"Insightful comment\" }\n ]\n }\n store.pushPayload(pushData);\n ```\n By default, the data will be deserialized using a default\n serializer (the application serializer if it exists).\n Alternatively, `pushPayload` will accept a model type which\n will determine which serializer will process the payload.\n ```app/serializers/application.js\n import DS from 'ember-data';\n export default DS.ActiveModelSerializer;\n ```\n ```app/serializers/post.js\n import DS from 'ember-data';\n export default DS.JSONSerializer;\n ```\n ```js\n store.pushPayload(pushData); // Will use the application serializer\n store.pushPayload('post', pushData); // Will use the post serializer\n ```\n @method pushPayload\n @param {String} modelName Optionally, a model type used to determine which serializer will be used\n @param {Object} inputPayload\n */\n pushPayload(modelName, inputPayload) {\n var serializer = void 0;\n var payload = void 0;\n if (!inputPayload) {\n payload = modelName;\n serializer = defaultSerializer(this);\n (true && !(typeof serializer.pushPayload === 'function') && Ember.assert(`You cannot use 'store#pushPayload' without a modelName unless your default serializer defines 'pushPayload'`, typeof serializer.pushPayload === 'function'));\n } else {\n payload = inputPayload;\n (true && !(typeof modelName === 'string') && Ember.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));\n\n var normalizedModelName = normalizeModelName(modelName);\n serializer = this.serializerFor(normalizedModelName);\n }\n if (isEnabled('ds-pushpayload-return')) {\n return serializer.pushPayload(this, payload);\n } else {\n serializer.pushPayload(this, payload);\n }\n },\n\n /**\n `normalize` converts a json payload into the normalized form that\n [push](#method_push) expects.\n Example\n ```js\n socket.on('message', function(message) {\n let modelName = message.model;\n let data = message.data;\n store.push(store.normalize(modelName, data));\n });\n ```\n @method normalize\n @param {String} modelName The name of the model type for this payload\n @param {Object} payload\n @return {Object} The normalized payload\n */\n normalize(modelName, payload) {\n (true && !(Ember.isPresent(modelName)) && Ember.assert(`You need to pass a model name to the store's normalize method`, Ember.isPresent(modelName)));\n (true && !(typeof modelName === 'string') && Ember.assert(`Passing classes to store methods has been removed. Please pass a dasherized string instead of ${Ember.inspect(modelName)}`, typeof modelName === 'string'));\n\n var normalizedModelName = normalizeModelName(modelName);\n var serializer = this.serializerFor(normalizedModelName);\n var model = this._modelFor(normalizedModelName);\n return serializer.normalize(model, payload);\n },\n\n /**\n Build a brand new record for a given type, ID, and\n initial data.\n @method _buildInternalModel\n @private\n @param {String} modelName\n @param {String} id\n @param {Object} data\n @return {InternalModel} internal model\n */\n _buildInternalModel(modelName, id, data) {\n (true && !(typeof modelName === 'string') && Ember.assert(`You can no longer pass a modelClass as the first argument to store._buildInternalModel. Pass modelName instead.`, typeof modelName === 'string'));\n\n\n var existingInternalModel = this._existingInternalModelForId(modelName, id);\n\n (true && !(!existingInternalModel) && Ember.assert(`The id ${id} has already been used with another record for modelClass '${modelName}'.`, !existingInternalModel));\n\n // lookupFactory should really return an object that creates\n // instances with the injections applied\n\n var internalModel = new InternalModel(modelName, id, this, data);\n\n this._internalModelsFor(modelName).add(internalModel, id);\n\n return internalModel;\n },\n\n _existingInternalModelForId(modelName, id) {\n var internalModel = this._internalModelsFor(modelName).get(id);\n\n if (internalModel && internalModel.hasScheduledDestroy()) {\n // unloadRecord is async, if one attempts to unload + then sync create,\n // we must ensure the unload is complete before starting the create\n internalModel.destroySync();\n internalModel = null;\n }\n return internalModel;\n },\n\n buildInternalModel(modelName, id, data) {\n (true && !(false) && Ember.deprecate('buildInternalModel was documented as private and will be removed in the next version of Ember Data.', false, { id: 'ember-data.buildInternalModel', until: '2.17.0' }));\n\n return this._buildInternalModel(modelName, id, data);\n },\n\n //Called by the state machine to notify the store that the record is ready to be interacted with\n recordWasLoaded(record) {\n this.recordArrayManager.recordWasLoaded(record);\n },\n\n // ...............\n // . DESTRUCTION .\n // ...............\n\n /**\n When a record is destroyed, this un-indexes it and\n removes it from any record arrays so it can be GCed.\n @method _removeFromIdMap\n @private\n @param {InternalModel} internalModel\n */\n _removeFromIdMap(internalModel) {\n var recordMap = this._internalModelsFor(internalModel.modelName);\n var id = internalModel.id;\n\n recordMap.remove(internalModel, id);\n },\n\n // ......................\n // . PER-TYPE ADAPTERS\n // ......................\n\n /**\n Returns an instance of the adapter for a given type. For\n example, `adapterFor('person')` will return an instance of\n `App.PersonAdapter`.\n If no `App.PersonAdapter` is found, this method will look\n for an `App.ApplicationAdapter` (the default adapter for\n your entire application).\n If no `App.ApplicationAdapter` is found, it will return\n the value of the `defaultAdapter`.\n @method adapterFor\n @public\n @param {String} modelName\n @return DS.Adapter\n */\n adapterFor(modelName) {\n (true && !(Ember.isPresent(modelName)) && Ember.assert(`You need to pass a model name to the store's adapterFor method`, Ember.isPresent(modelName)));\n (true && !(typeof modelName === 'string') && Ember.assert(`Passing classes to store.adapterFor has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));\n\n var normalizedModelName = normalizeModelName(modelName);\n\n var { _adapterCache } = this;\n var adapter = _adapterCache[normalizedModelName];\n if (adapter) {\n return adapter;\n }\n\n var owner = getOwner(this);\n\n adapter = owner.lookup(`adapter:${normalizedModelName}`);\n if (adapter !== undefined) {\n Ember.set(adapter, 'store', this);\n _adapterCache[normalizedModelName] = adapter;\n return adapter;\n }\n\n // no adapter found for the specific model, fallback and check for application adapter\n adapter = _adapterCache.application || owner.lookup('adapter:application');\n if (adapter !== undefined) {\n Ember.set(adapter, 'store', this);\n _adapterCache[normalizedModelName] = adapter;\n _adapterCache.application = adapter;\n return adapter;\n }\n\n // no model specific adapter or application adapter, check for an `adapter`\n // property defined on the store\n var adapterName = this.get('adapter');\n adapter = _adapterCache[adapterName] || owner.lookup(`adapter:${adapterName}`);\n if (adapter !== undefined) {\n Ember.set(adapter, 'store', this);\n _adapterCache[normalizedModelName] = adapter;\n _adapterCache[adapterName] = adapter;\n return adapter;\n }\n\n // final fallback, no model specific adapter, no application adapter, no\n // `adapter` property on store: use json-api adapter\n adapter = _adapterCache['-json-api'] || owner.lookup('adapter:-json-api');\n Ember.set(adapter, 'store', this);\n _adapterCache[normalizedModelName] = adapter;\n _adapterCache['-json-api'] = adapter;\n return adapter;\n },\n\n // ..............................\n // . RECORD CHANGE NOTIFICATION .\n // ..............................\n\n /**\n Returns an instance of the serializer for a given type. For\n example, `serializerFor('person')` will return an instance of\n `App.PersonSerializer`.\n If no `App.PersonSerializer` is found, this method will look\n for an `App.ApplicationSerializer` (the default serializer for\n your entire application).\n if no `App.ApplicationSerializer` is found, it will attempt\n to get the `defaultSerializer` from the `PersonAdapter`\n (`adapterFor('person')`).\n If a serializer cannot be found on the adapter, it will fall back\n to an instance of `DS.JSONSerializer`.\n @method serializerFor\n @public\n @param {String} modelName the record to serialize\n @return {DS.Serializer}\n */\n serializerFor(modelName) {\n (true && !(Ember.isPresent(modelName)) && Ember.assert(`You need to pass a model name to the store's serializerFor method`, Ember.isPresent(modelName)));\n (true && !(typeof modelName === 'string') && Ember.assert(`Passing classes to store.serializerFor has been removed. Please pass a dasherized string instead of ${modelName}`, typeof modelName === 'string'));\n\n var normalizedModelName = normalizeModelName(modelName);\n\n var { _serializerCache } = this;\n var serializer = _serializerCache[normalizedModelName];\n if (serializer) {\n return serializer;\n }\n\n var owner = getOwner(this);\n\n serializer = owner.lookup(`serializer:${normalizedModelName}`);\n if (serializer !== undefined) {\n Ember.set(serializer, 'store', this);\n _serializerCache[normalizedModelName] = serializer;\n return serializer;\n }\n\n // no serializer found for the specific model, fallback and check for application serializer\n serializer = _serializerCache.application || owner.lookup('serializer:application');\n if (serializer !== undefined) {\n Ember.set(serializer, 'store', this);\n _serializerCache[normalizedModelName] = serializer;\n _serializerCache.application = serializer;\n return serializer;\n }\n\n // no model specific serializer or application serializer, check for the `defaultSerializer`\n // property defined on the adapter\n var adapter = this.adapterFor(modelName);\n var serializerName = Ember.get(adapter, 'defaultSerializer');\n serializer = _serializerCache[serializerName] || owner.lookup(`serializer:${serializerName}`);\n if (serializer !== undefined) {\n Ember.set(serializer, 'store', this);\n _serializerCache[normalizedModelName] = serializer;\n _serializerCache[serializerName] = serializer;\n return serializer;\n }\n\n // final fallback, no model specific serializer, no application serializer, no\n // `serializer` property on store: use json-api serializer\n serializer = _serializerCache['-default'] || owner.lookup('serializer:-default');\n Ember.set(serializer, 'store', this);\n _serializerCache[normalizedModelName] = serializer;\n _serializerCache['-default'] = serializer;\n\n return serializer;\n },\n\n lookupAdapter(name) {\n (true && !(false) && Ember.deprecate(`Use of lookupAdapter is deprecated, use adapterFor instead.`, false, {\n id: 'ds.store.lookupAdapter',\n until: '3.0'\n }));\n\n return this.adapterFor(name);\n },\n\n lookupSerializer(name) {\n (true && !(false) && Ember.deprecate(`Use of lookupSerializer is deprecated, use serializerFor instead.`, false, {\n id: 'ds.store.lookupSerializer',\n until: '3.0'\n }));\n\n return this.serializerFor(name);\n },\n\n willDestroy() {\n this._super(...arguments);\n this._pushedInternalModels = null;\n this.recordArrayManager.destroy();\n\n this._adapterCache = null;\n this._serializerCache = null;\n\n this.unloadAll();\n },\n\n _updateRelationshipState(relationship) {\n if (this._updatedRelationships.push(relationship) !== 1) {\n return;\n }\n\n this._backburner.join(() => {\n this._backburner.schedule('syncRelationships', this, this._flushUpdatedRelationships);\n });\n },\n\n _flushUpdatedRelationships() {\n var updated = this._updatedRelationships;\n\n for (var i = 0, l = updated.length; i < l; i++) {\n updated[i].flushCanonical();\n }\n\n updated.length = 0;\n },\n\n _updateInternalModel(internalModel) {\n if (this._updatedInternalModels.push(internalModel) !== 1) {\n return;\n }\n\n Ember.run.schedule('actions', this, this._flushUpdatedInternalModels);\n },\n\n _flushUpdatedInternalModels() {\n var updated = this._updatedInternalModels;\n\n for (var i = 0, l = updated.length; i < l; i++) {\n updated[i]._triggerDeferredTriggers();\n }\n\n updated.length = 0;\n },\n\n _pushResourceIdentifier(relationship, resourceIdentifier) {\n if (Ember.isNone(resourceIdentifier)) {\n return;\n }\n\n (true && !(!Array.isArray(resourceIdentifier)) && Ember.assert(`A ${relationship.internalModel.modelName} record was pushed into the store with the value of ${relationship.key} being ${Ember.inspect(resourceIdentifier)}, but ${relationship.key} is a belongsTo relationship so the value must not be an array. You should probably check your data payload or serializer.`, !Array.isArray(resourceIdentifier)));\n\n //TODO:Better asserts\n\n return this._internalModelForId(resourceIdentifier.type, resourceIdentifier.id);\n },\n\n _pushResourceIdentifiers(relationship, resourceIdentifiers) {\n if (Ember.isNone(resourceIdentifiers)) {\n return;\n }\n\n (true && !(Array.isArray(resourceIdentifiers)) && Ember.assert(`A ${relationship.internalModel.modelName} record was pushed into the store with the value of ${relationship.key} being '${Ember.inspect(resourceIdentifiers)}', but ${relationship.key} is a hasMany relationship so the value must be an array. You should probably check your data payload or serializer.`, Array.isArray(resourceIdentifiers)));\n\n\n var _internalModels = new Array(resourceIdentifiers.length);\n for (var i = 0; i < resourceIdentifiers.length; i++) {\n _internalModels[i] = this._pushResourceIdentifier(relationship, resourceIdentifiers[i]);\n }\n return _internalModels;\n }\n});\n\n// Delegation to the adapter and promise management\n\n\nfunction defaultSerializer(store) {\n return store.serializerFor('application');\n}\n\nfunction _commit(adapter, store, operation, snapshot) {\n var internalModel = snapshot._internalModel;\n var modelName = snapshot.modelName;\n var modelClass = store._modelFor(modelName);\n (true && !(adapter) && Ember.assert(`You tried to update a record but you have no adapter (for ${modelName})`, adapter));\n (true && !(typeof adapter[operation] === 'function') && Ember.assert(`You tried to update a record but your adapter (for ${modelName}) does not implement '${operation}'`, typeof adapter[operation] === 'function'));\n\n var promise = adapter[operation](store, modelClass, snapshot);\n var serializer = serializerForAdapter(store, adapter, modelName);\n var label = `DS: Extract and notify about ${operation} completion of ${internalModel}`;\n\n (true && !(promise !== undefined) && Ember.assert(`Your adapter's '${operation}' method must return a value, but it returned 'undefined'`, promise !== undefined));\n\n\n promise = Promise.resolve(promise, label);\n promise = _guard(promise, _bind(_objectIsAlive, store));\n promise = _guard(promise, _bind(_objectIsAlive, internalModel));\n\n return promise.then(adapterPayload => {\n /*\n Note to future spelunkers hoping to optimize.\n We rely on this `run` to create a run loop if needed\n that `store._push` and `store.didSaveRecord` will both share.\n We use `join` because it is often the case that we\n have an outer run loop available still from the first\n call to `store._push`;\n */\n store._backburner.join(() => {\n var payload = void 0,\n data = void 0;\n if (adapterPayload) {\n payload = normalizeResponseHelper(serializer, store, modelClass, adapterPayload, snapshot.id, operation);\n if (payload.included) {\n store._push({ data: null, included: payload.included });\n }\n data = payload.data;\n }\n store.didSaveRecord(internalModel, { data });\n });\n\n return internalModel;\n }, function (error) {\n if (error instanceof InvalidError) {\n var errors = serializer.extractErrors(store, modelClass, error, snapshot.id);\n\n store.recordWasInvalid(internalModel, errors);\n } else {\n store.recordWasError(internalModel, error);\n }\n\n throw error;\n }, label);\n}\n\nfunction isInverseRelationshipInitialized(store, internalModel, data, key, modelNameToInverseMap) {\n var relationshipData = data.relationships[key].data;\n\n if (!relationshipData) {\n // can't check inverse for eg { comments: { links: { related: URL }}}\n return false;\n }\n\n var inverseMap = modelNameToInverseMap[internalModel.modelName];\n if (!inverseMap) {\n inverseMap = modelNameToInverseMap[internalModel.modelName] = Ember.get(internalModel.type, 'inverseMap');\n }\n var inverseRelationshipMetadata = inverseMap[key];\n if (inverseRelationshipMetadata === undefined) {\n inverseRelationshipMetadata = internalModel.type.inverseFor(key, store);\n }\n\n if (!inverseRelationshipMetadata) {\n return false;\n }\n\n var { name: inverseRelationshipName } = inverseRelationshipMetadata;\n\n if (Array.isArray(relationshipData)) {\n for (var i = 0; i < relationshipData.length; ++i) {\n var inverseInternalModel = store._internalModelsFor(relationshipData[i].type).get(relationshipData[i].id);\n if (inverseInternalModel && inverseInternalModel._relationships.has(inverseRelationshipName)) {\n return true;\n }\n }\n\n return false;\n } else {\n var _inverseInternalModel = store._internalModelsFor(relationshipData.type).get(relationshipData.id);\n return _inverseInternalModel && _inverseInternalModel._relationships.has(inverseRelationshipName);\n }\n}\n\nfunction setupRelationships(store, internalModel, data, modelNameToInverseMap) {\n Object.keys(data.relationships).forEach(relationshipName => {\n var relationships = internalModel._relationships;\n var relationshipRequiresNotification = relationships.has(relationshipName) || isInverseRelationshipInitialized(store, internalModel, data, relationshipName, modelNameToInverseMap);\n\n if (relationshipRequiresNotification) {\n var relationshipData = data.relationships[relationshipName];\n relationships.get(relationshipName).push(relationshipData, false);\n }\n\n // in debug, assert payload validity eagerly\n {\n var relationshipMeta = Ember.get(internalModel.type, 'relationshipsByName').get(relationshipName);\n var _relationshipData = data.relationships[relationshipName];\n if (!_relationshipData || !relationshipMeta) {\n return;\n }\n\n if (_relationshipData.links) {\n var isAsync = relationshipMeta.options && relationshipMeta.options.async !== false;\n (true && Ember.warn(`You pushed a record of type '${internalModel.type.modelName}' with a relationship '${relationshipName}' configured as 'async: false'. You've included a link but no primary data, this may be an error in your payload.`, isAsync || _relationshipData.data, {\n id: 'ds.store.push-link-for-sync-relationship'\n }));\n } else if (_relationshipData.data) {\n if (relationshipMeta.kind === 'belongsTo') {\n (true && !(!Array.isArray(_relationshipData.data)) && Ember.assert(`A ${internalModel.type.modelName} record was pushed into the store with the value of ${relationshipName} being ${Ember.inspect(_relationshipData.data)}, but ${relationshipName} is a belongsTo relationship so the value must not be an array. You should probably check your data payload or serializer.`, !Array.isArray(_relationshipData.data)));\n } else if (relationshipMeta.kind === 'hasMany') {\n (true && !(Array.isArray(_relationshipData.data)) && Ember.assert(`A ${internalModel.type.modelName} record was pushed into the store with the value of ${relationshipName} being '${Ember.inspect(_relationshipData.data)}', but ${relationshipName} is a hasMany relationship so the value must be an array. You should probably check your data payload or serializer.`, Array.isArray(_relationshipData.data)));\n }\n }\n }\n });\n}\n\nvar Store$1 = Store;\n\n/**\n @module ember-data\n*/\n\n/**\n All Ember Data classes, methods and functions are defined inside of this namespace.\n\n @class DS\n @static\n*/\n\n/**\n @property VERSION\n @type String\n @static\n*/\nvar DS = Ember.Namespace.create({\n VERSION: VERSION,\n name: \"DS\"\n});\n\nif (Ember.libraries) {\n Ember.libraries.registerCoreLibrary('Ember Data', DS.VERSION);\n}\n\n/**\n `DS.belongsTo` is used to define One-To-One and One-To-Many\n relationships on a [DS.Model](/api/data/classes/DS.Model.html).\n\n\n `DS.belongsTo` takes an optional hash as a second parameter, currently\n supported options are:\n\n - `async`: A boolean value used to explicitly declare this to be an async relationship.\n - `inverse`: A string used to identify the inverse property on a\n related model in a One-To-Many relationship. See [Explicit Inverses](#toc_explicit-inverses)\n\n #### One-To-One\n To declare a one-to-one relationship between two models, use\n `DS.belongsTo`:\n\n ```app/models/user.js\n import DS from 'ember-data';\n\n export default DS.Model.extend({\n profile: DS.belongsTo('profile')\n });\n ```\n\n ```app/models/profile.js\n import DS from 'ember-data';\n\n export default DS.Model.extend({\n user: DS.belongsTo('user')\n });\n ```\n\n #### One-To-Many\n To declare a one-to-many relationship between two models, use\n `DS.belongsTo` in combination with `DS.hasMany`, like this:\n\n ```app/models/post.js\n import DS from 'ember-data';\n\n export default DS.Model.extend({\n comments: DS.hasMany('comment')\n });\n ```\n\n ```app/models/comment.js\n import DS from 'ember-data';\n\n export default DS.Model.extend({\n post: DS.belongsTo('post')\n });\n ```\n\n You can avoid passing a string as the first parameter. In that case Ember Data\n will infer the type from the key name.\n\n ```app/models/comment.js\n import DS from 'ember-data';\n\n export default DS.Model.extend({\n post: DS.belongsTo()\n });\n ```\n\n will lookup for a Post type.\n\n @namespace\n @method belongsTo\n @for DS\n @param {String} modelName (optional) type of the relationship\n @param {Object} options (optional) a hash of options\n @return {Ember.computed} relationship\n*/\nfunction belongsTo(modelName, options) {\n var opts = void 0,\n userEnteredModelName = void 0;\n if (typeof modelName === 'object') {\n opts = modelName;\n userEnteredModelName = undefined;\n } else {\n opts = options;\n userEnteredModelName = modelName;\n }\n\n if (typeof userEnteredModelName === 'string') {\n userEnteredModelName = normalizeModelName(userEnteredModelName);\n }\n\n (true && !(typeof userEnteredModelName === 'string' || typeof userEnteredModelName === 'undefined') && Ember.assert(\"The first argument to DS.belongsTo must be a string representing a model type key, not an instance of \" + Ember.inspect(userEnteredModelName) + \". E.g., to define a relation to the Person model, use DS.belongsTo('person')\", typeof userEnteredModelName === 'string' || typeof userEnteredModelName === 'undefined'));\n\n\n opts = opts || {};\n\n var meta = {\n type: userEnteredModelName,\n isRelationship: true,\n options: opts,\n kind: 'belongsTo',\n name: 'Belongs To',\n key: null\n };\n\n return Ember.computed({\n get(key) {\n if (opts.hasOwnProperty('serialize')) {\n (true && Ember.warn(`You provided a serialize option on the \"${key}\" property in the \"${this._internalModel.modelName}\" class, this belongs in the serializer. See DS.Serializer and it's implementations https://emberjs.com/api/data/classes/DS.Serializer.html`, false, {\n id: 'ds.model.serialize-option-in-belongs-to'\n }));\n }\n\n if (opts.hasOwnProperty('embedded')) {\n (true && Ember.warn(`You provided an embedded option on the \"${key}\" property in the \"${this._internalModel.modelName}\" class, this belongs in the serializer. See DS.EmbeddedRecordsMixin https://emberjs.com/api/data/classes/DS.EmbeddedRecordsMixin.html`, false, {\n id: 'ds.model.embedded-option-in-belongs-to'\n }));\n }\n\n return this._internalModel._relationships.get(key).getRecord();\n },\n set(key, value) {\n if (value === undefined) {\n value = null;\n }\n if (value && value.then) {\n this._internalModel._relationships.get(key).setRecordPromise(value);\n } else if (value) {\n this._internalModel._relationships.get(key).setInternalModel(value._internalModel);\n } else {\n this._internalModel._relationships.get(key).setInternalModel(value);\n }\n\n return this._internalModel._relationships.get(key).getRecord();\n }\n }).meta(meta);\n}\n\n/*\n We're using this to detect arrays and \"array-like\" objects.\n\n This is a copy of the `isArray` method found in `ember-runtime/utils` as we're\n currently unable to import non-exposed modules.\n\n This method was previously exposed as `Ember.isArray` but since\n https://github.com/emberjs/ember.js/pull/11463 `Ember.isArray` is an alias of\n `Array.isArray` hence removing the \"array-like\" part.\n */\nfunction isArrayLike(obj) {\n if (!obj || obj.setInterval) {\n return false;\n }\n if (Array.isArray(obj)) {\n return true;\n }\n if (Ember.Array.detect(obj)) {\n return true;\n }\n\n var type = Ember.typeOf(obj);\n if ('array' === type) {\n return true;\n }\n if (obj.length !== undefined && 'object' === type) {\n return true;\n }\n return false;\n}\n\n/**\n `DS.hasMany` is used to define One-To-Many and Many-To-Many\n relationships on a [DS.Model](/api/data/classes/DS.Model.html).\n\n `DS.hasMany` takes an optional hash as a second parameter, currently\n supported options are:\n\n - `async`: A boolean value used to explicitly declare this to be an async relationship.\n - `inverse`: A string used to identify the inverse property on a related model.\n\n #### One-To-Many\n To declare a one-to-many relationship between two models, use\n `DS.belongsTo` in combination with `DS.hasMany`, like this:\n\n ```app/models/post.js\n import DS from 'ember-data';\n\n export default DS.Model.extend({\n comments: DS.hasMany('comment')\n });\n ```\n\n ```app/models/comment.js\n import DS from 'ember-data';\n\n export default DS.Model.extend({\n post: DS.belongsTo('post')\n });\n ```\n\n #### Many-To-Many\n To declare a many-to-many relationship between two models, use\n `DS.hasMany`:\n\n ```app/models/post.js\n import DS from 'ember-data';\n\n export default DS.Model.extend({\n tags: DS.hasMany('tag')\n });\n ```\n\n ```app/models/tag.js\n import DS from 'ember-data';\n\n export default DS.Model.extend({\n posts: DS.hasMany('post')\n });\n ```\n\n You can avoid passing a string as the first parameter. In that case Ember Data\n will infer the type from the singularized key name.\n\n ```app/models/post.js\n import DS from 'ember-data';\n\n export default DS.Model.extend({\n tags: DS.hasMany()\n });\n ```\n\n will lookup for a Tag type.\n\n #### Explicit Inverses\n\n Ember Data will do its best to discover which relationships map to\n one another. In the one-to-many code above, for example, Ember Data\n can figure out that changing the `comments` relationship should update\n the `post` relationship on the inverse because post is the only\n relationship to that model.\n\n However, sometimes you may have multiple `belongsTo`/`hasMany` for the\n same type. You can specify which property on the related model is\n the inverse using `DS.hasMany`'s `inverse` option:\n\n ```app/models/comment.js\n import DS from 'ember-data';\n\n export default DS.Model.extend({\n onePost: DS.belongsTo('post'),\n twoPost: DS.belongsTo('post'),\n redPost: DS.belongsTo('post'),\n bluePost: DS.belongsTo('post')\n });\n ```\n\n ```app/models/post.js\n import DS from 'ember-data';\n\n export default DS.Model.extend({\n comments: DS.hasMany('comment', {\n inverse: 'redPost'\n })\n });\n ```\n\n You can also specify an inverse on a `belongsTo`, which works how\n you'd expect.\n\n @namespace\n @method hasMany\n @for DS\n @param {String} type (optional) type of the relationship\n @param {Object} options (optional) a hash of options\n @return {Ember.computed} relationship\n*/\nfunction hasMany(type, options) {\n if (typeof type === 'object') {\n options = type;\n type = undefined;\n }\n\n (true && !(typeof type === 'string' || typeof type === 'undefined') && Ember.assert(`The first argument to DS.hasMany must be a string representing a model type key, not an instance of ${Ember.inspect(type)}. E.g., to define a relation to the Comment model, use DS.hasMany('comment')`, typeof type === 'string' || typeof type === 'undefined'));\n\n\n options = options || {};\n\n if (typeof type === 'string') {\n type = normalizeModelName(type);\n }\n\n // Metadata about relationships is stored on the meta of\n // the relationship. This is used for introspection and\n // serialization. Note that `key` is populated lazily\n // the first time the CP is called.\n var meta = {\n type,\n options,\n isRelationship: true,\n kind: 'hasMany',\n name: 'Has Many',\n key: null\n };\n\n return Ember.computed({\n get(key) {\n return this._internalModel._relationships.get(key).getRecords();\n },\n set(key, records) {\n (true && !(isArrayLike(records)) && Ember.assert(`You must pass an array of records to set a hasMany relationship`, isArrayLike(records)));\n (true && !(function () {\n return Ember.A(records).every(record => record.hasOwnProperty('_internalModel') === true);\n }()) && Ember.assert(`All elements of a hasMany relationship must be instances of DS.Model, you passed ${Ember.inspect(records)}`, function () {\n return Ember.A(records).every(record => record.hasOwnProperty('_internalModel') === true);\n }()));\n\n\n var relationship = this._internalModel._relationships.get(key);\n relationship.clear();\n relationship.addInternalModels(records.map(record => Ember.get(record, '_internalModel')));\n return relationship.getRecords();\n }\n }).meta(meta);\n}\n\n/**\n\n WARNING: This interface is likely to change in order to accomodate https://github.com/emberjs/rfcs/pull/4\n\n ## Using BuildURLMixin\n\n To use url building, include the mixin when extending an adapter, and call `buildURL` where needed.\n The default behaviour is designed for RESTAdapter.\n\n ### Example\n\n ```javascript\n export default DS.Adapter.extend(BuildURLMixin, {\n findRecord: function(store, type, id, snapshot) {\n var url = this.buildURL(type.modelName, id, snapshot, 'findRecord');\n return this.ajax(url, 'GET');\n }\n });\n ```\n\n ### Attributes\n\n The `host` and `namespace` attributes will be used if defined, and are optional.\n\n @class BuildURLMixin\n @namespace DS\n*/\nvar buildUrlMixin = Ember.Mixin.create({\n /**\n Builds a URL for a given type and optional ID.\n By default, it pluralizes the type's name (for example, 'post'\n becomes 'posts' and 'person' becomes 'people'). To override the\n pluralization see [pathForType](#method_pathForType).\n If an ID is specified, it adds the ID to the path generated\n for the type, separated by a `/`.\n When called by RESTAdapter.findMany() the `id` and `snapshot` parameters\n will be arrays of ids and snapshots.\n @method buildURL\n @param {String} modelName\n @param {(String|Array|Object)} id single id or array of ids or query\n @param {(DS.Snapshot|Array)} snapshot single snapshot or array of snapshots\n @param {String} requestType\n @param {Object} query object of query parameters to send for query requests.\n @return {String} url\n */\n buildURL(modelName, id, snapshot, requestType, query) {\n switch (requestType) {\n case 'findRecord':\n return this.urlForFindRecord(id, modelName, snapshot);\n case 'findAll':\n return this.urlForFindAll(modelName, snapshot);\n case 'query':\n return this.urlForQuery(query, modelName);\n case 'queryRecord':\n return this.urlForQueryRecord(query, modelName);\n case 'findMany':\n return this.urlForFindMany(id, modelName, snapshot);\n case 'findHasMany':\n return this.urlForFindHasMany(id, modelName, snapshot);\n case 'findBelongsTo':\n return this.urlForFindBelongsTo(id, modelName, snapshot);\n case 'createRecord':\n return this.urlForCreateRecord(modelName, snapshot);\n case 'updateRecord':\n return this.urlForUpdateRecord(id, modelName, snapshot);\n case 'deleteRecord':\n return this.urlForDeleteRecord(id, modelName, snapshot);\n default:\n return this._buildURL(modelName, id);\n }\n },\n\n /**\n @method _buildURL\n @private\n @param {String} modelName\n @param {String} id\n @return {String} url\n */\n _buildURL(modelName, id) {\n var path = void 0;\n var url = [];\n var host = Ember.get(this, 'host');\n var prefix = this.urlPrefix();\n\n if (modelName) {\n path = this.pathForType(modelName);\n if (path) {\n url.push(path);\n }\n }\n\n if (id) {\n url.push(encodeURIComponent(id));\n }\n if (prefix) {\n url.unshift(prefix);\n }\n\n url = url.join('/');\n if (!host && url && url.charAt(0) !== '/') {\n url = '/' + url;\n }\n\n return url;\n },\n\n /**\n Builds a URL for a `store.findRecord(type, id)` call.\n Example:\n ```app/adapters/user.js\n import DS from 'ember-data';\n export default DS.JSONAPIAdapter.extend({\n urlForFindRecord(id, modelName, snapshot) {\n let baseUrl = this.buildURL(modelName, id, snapshot);\n return `${baseUrl}/users/${snapshot.adapterOptions.user_id}/playlists/${id}`;\n }\n });\n ```\n @method urlForFindRecord\n @param {String} id\n @param {String} modelName\n @param {DS.Snapshot} snapshot\n @return {String} url\n */\n urlForFindRecord(id, modelName, snapshot) {\n return this._buildURL(modelName, id);\n },\n\n /**\n Builds a URL for a `store.findAll(type)` call.\n Example:\n ```app/adapters/comment.js\n import DS from 'ember-data';\n export default DS.JSONAPIAdapter.extend({\n urlForFindAll(modelName, snapshot) {\n return 'data/comments.json';\n }\n });\n ```\n @method urlForFindAll\n @param {String} modelName\n @param {DS.SnapshotRecordArray} snapshot\n @return {String} url\n */\n urlForFindAll(modelName, snapshot) {\n return this._buildURL(modelName);\n },\n\n /**\n Builds a URL for a `store.query(type, query)` call.\n Example:\n ```app/adapters/application.js\n import DS from 'ember-data';\n export default DS.RESTAdapter.extend({\n host: 'https://api.github.com',\n urlForQuery (query, modelName) {\n switch(modelName) {\n case 'repo':\n return `https://api.github.com/orgs/${query.orgId}/repos`;\n default:\n return this._super(...arguments);\n }\n }\n });\n ```\n @method urlForQuery\n @param {Object} query\n @param {String} modelName\n @return {String} url\n */\n urlForQuery(query, modelName) {\n return this._buildURL(modelName);\n },\n\n /**\n Builds a URL for a `store.queryRecord(type, query)` call.\n Example:\n ```app/adapters/application.js\n import DS from 'ember-data';\n export default DS.RESTAdapter.extend({\n urlForQueryRecord({ slug }, modelName) {\n let baseUrl = this.buildURL();\n return `${baseUrl}/${encodeURIComponent(slug)}`;\n }\n });\n ```\n @method urlForQueryRecord\n @param {Object} query\n @param {String} modelName\n @return {String} url\n */\n urlForQueryRecord(query, modelName) {\n return this._buildURL(modelName);\n },\n\n /**\n Builds a URL for coalesceing multiple `store.findRecord(type, id)`\n records into 1 request when the adapter's `coalesceFindRequests`\n property is true.\n Example:\n ```app/adapters/application.js\n import DS from 'ember-data';\n export default DS.RESTAdapter.extend({\n urlForFindMany(ids, modelName) {\n let baseUrl = this.buildURL();\n return `${baseUrl}/coalesce`;\n }\n });\n ```\n @method urlForFindMany\n @param {Array} ids\n @param {String} modelName\n @param {Array} snapshots\n @return {String} url\n */\n urlForFindMany(ids, modelName, snapshots) {\n return this._buildURL(modelName);\n },\n\n /**\n Builds a URL for fetching a async hasMany relationship when a url\n is not provided by the server.\n Example:\n ```app/adapters/application.js\n import DS from 'ember-data';\n export default DS.JSONAPIAdapter.extend({\n urlForFindHasMany(id, modelName, snapshot) {\n let baseUrl = this.buildURL(id, modelName);\n return `${baseUrl}/relationships`;\n }\n });\n ```\n @method urlForFindHasMany\n @param {String} id\n @param {String} modelName\n @param {DS.Snapshot} snapshot\n @return {String} url\n */\n urlForFindHasMany(id, modelName, snapshot) {\n return this._buildURL(modelName, id);\n },\n\n /**\n Builds a URL for fetching a async belongsTo relationship when a url\n is not provided by the server.\n Example:\n ```app/adapters/application.js\n import DS from 'ember-data';\n export default DS.JSONAPIAdapter.extend({\n urlForFindBelongsTo(id, modelName, snapshot) {\n let baseUrl = this.buildURL(id, modelName);\n return `${baseUrl}/relationships`;\n }\n });\n ```\n @method urlForFindBelongsTo\n @param {String} id\n @param {String} modelName\n @param {DS.Snapshot} snapshot\n @return {String} url\n */\n urlForFindBelongsTo(id, modelName, snapshot) {\n return this._buildURL(modelName, id);\n },\n\n /**\n Builds a URL for a `record.save()` call when the record was created\n locally using `store.createRecord()`.\n Example:\n ```app/adapters/application.js\n import DS from 'ember-data';\n export default DS.RESTAdapter.extend({\n urlForCreateRecord(modelName, snapshot) {\n return this._super(...arguments) + '/new';\n }\n });\n ```\n @method urlForCreateRecord\n @param {String} modelName\n @param {DS.Snapshot} snapshot\n @return {String} url\n */\n urlForCreateRecord(modelName, snapshot) {\n return this._buildURL(modelName);\n },\n\n /**\n Builds a URL for a `record.save()` call when the record has been update locally.\n Example:\n ```app/adapters/application.js\n import DS from 'ember-data';\n export default DS.RESTAdapter.extend({\n urlForUpdateRecord(id, modelName, snapshot) {\n return `/${id}/feed?access_token=${snapshot.adapterOptions.token}`;\n }\n });\n ```\n @method urlForUpdateRecord\n @param {String} id\n @param {String} modelName\n @param {DS.Snapshot} snapshot\n @return {String} url\n */\n urlForUpdateRecord(id, modelName, snapshot) {\n return this._buildURL(modelName, id);\n },\n\n /**\n Builds a URL for a `record.save()` call when the record has been deleted locally.\n Example:\n ```app/adapters/application.js\n import DS from 'ember-data';\n export default DS.RESTAdapter.extend({\n urlForDeleteRecord(id, modelName, snapshot) {\n return this._super(...arguments) + '/destroy';\n }\n });\n ```\n @method urlForDeleteRecord\n @param {String} id\n @param {String} modelName\n @param {DS.Snapshot} snapshot\n @return {String} url\n */\n urlForDeleteRecord(id, modelName, snapshot) {\n return this._buildURL(modelName, id);\n },\n\n /**\n @method urlPrefix\n @private\n @param {String} path\n @param {String} parentURL\n @return {String} urlPrefix\n */\n urlPrefix(path, parentURL) {\n var host = Ember.get(this, 'host');\n var namespace = Ember.get(this, 'namespace');\n\n if (!host || host === '/') {\n host = '';\n }\n\n if (path) {\n // Protocol relative url\n if (/^\\/\\//.test(path) || /http(s)?:\\/\\//.test(path)) {\n // Do nothing, the full host is already included.\n return path;\n\n // Absolute path\n } else if (path.charAt(0) === '/') {\n return `${host}${path}`;\n // Relative path\n } else {\n return `${parentURL}/${path}`;\n }\n }\n\n // No path provided\n var url = [];\n if (host) {\n url.push(host);\n }\n if (namespace) {\n url.push(namespace);\n }\n return url.join('/');\n },\n\n /**\n Determines the pathname for a given type.\n By default, it pluralizes the type's name (for example,\n 'post' becomes 'posts' and 'person' becomes 'people').\n ### Pathname customization\n For example if you have an object LineItem with an\n endpoint of \"/line_items/\".\n ```app/adapters/application.js\n import DS from 'ember-data';\n import { decamelize } from '@ember/string';\n import { pluralize } from 'ember-inflector';\n export default DS.RESTAdapter.extend({\n pathForType: function(modelName) {\n var decamelized = decamelize(modelName);\n return pluralize(decamelized);\n }\n });\n ```\n @method pathForType\n @param {String} modelName\n @return {String} path\n **/\n pathForType(modelName) {\n var camelized = Ember.String.camelize(modelName);\n return emberInflector.pluralize(camelized);\n }\n});\n\nvar CLRF = '\\u000d\\u000a';\n\nfunction parseResponseHeaders(headersString) {\n var headers = Object.create(null);\n\n if (!headersString) {\n return headers;\n }\n\n var headerPairs = headersString.split(CLRF);\n for (var i = 0; i < headerPairs.length; i++) {\n var header = headerPairs[i];\n var j = 0;\n var foundSep = false;\n\n for (; j < header.length; j++) {\n if (header.charCodeAt(j) === 58 /* ':' */) {\n foundSep = true;\n break;\n }\n }\n\n if (foundSep === false) {\n continue;\n }\n\n var field = header.substring(0, j).trim();\n var value = header.substring(j + 1, header.length).trim();\n\n if (value) {\n headers[field] = value;\n }\n }\n\n return headers;\n}\n\n/*\n Extend `Ember.DataAdapter` with ED specific code.\n\n @class DebugAdapter\n @namespace DS\n @extends Ember.DataAdapter\n @private\n*/\n/**\n @module ember-data\n*/\nvar debugAdapter = Ember.DataAdapter.extend({\n getFilters() {\n return [{ name: 'isNew', desc: 'New' }, { name: 'isModified', desc: 'Modified' }, { name: 'isClean', desc: 'Clean' }];\n },\n\n detect(typeClass) {\n return typeClass !== Model && Model.detect(typeClass);\n },\n\n columnsForType(typeClass) {\n var columns = [{\n name: 'id',\n desc: 'Id'\n }];\n var count = 0;\n var self = this;\n Ember.get(typeClass, 'attributes').forEach((meta, name) => {\n if (count++ > self.attributeLimit) {\n return false;\n }\n var desc = Ember.String.capitalize(Ember.String.underscore(name).replace('_', ' '));\n columns.push({ name: name, desc: desc });\n });\n return columns;\n },\n\n getRecords(modelClass, modelName) {\n if (arguments.length < 2) {\n // Legacy Ember.js < 1.13 support\n var containerKey = modelClass._debugContainerKey;\n if (containerKey) {\n var match = containerKey.match(/model:(.*)/);\n if (match !== null) {\n modelName = match[1];\n }\n }\n }\n (true && !(!!modelName) && Ember.assert(\"Cannot find model name. Please upgrade to Ember.js >= 1.13 for Ember Inspector support\", !!modelName));\n\n return this.get('store').peekAll(modelName);\n },\n\n getRecordColumnValues(record) {\n var count = 0;\n var columnValues = { id: Ember.get(record, 'id') };\n\n record.eachAttribute(key => {\n if (count++ > this.attributeLimit) {\n return false;\n }\n columnValues[key] = Ember.get(record, key);\n });\n return columnValues;\n },\n\n getRecordKeywords(record) {\n var keywords = [];\n var keys = Ember.A(['id']);\n record.eachAttribute(key => keys.push(key));\n keys.forEach(key => keywords.push(Ember.get(record, key)));\n return keywords;\n },\n\n getRecordFilterValues(record) {\n return {\n isNew: record.get('isNew'),\n isModified: record.get('hasDirtyAttributes') && !record.get('isNew'),\n isClean: !record.get('hasDirtyAttributes')\n };\n },\n\n getRecordColor(record) {\n var color = 'black';\n if (record.get('isNew')) {\n color = 'green';\n } else if (record.get('hasDirtyAttributes')) {\n color = 'blue';\n }\n return color;\n },\n\n observeRecord(record, recordUpdated) {\n var releaseMethods = Ember.A();\n var keysToObserve = Ember.A(['id', 'isNew', 'hasDirtyAttributes']);\n\n record.eachAttribute(key => keysToObserve.push(key));\n var adapter = this;\n\n keysToObserve.forEach(function (key) {\n var handler = function () {\n recordUpdated(adapter.wrapRecord(record));\n };\n Ember.addObserver(record, key, handler);\n releaseMethods.push(function () {\n Ember.removeObserver(record, key, handler);\n });\n });\n\n var release = function () {\n releaseMethods.forEach(fn => fn());\n };\n\n return release;\n }\n});\n\n// public\n\nexports.Model = Model;\nexports.Errors = Errors;\nexports.Store = Store$1;\nexports.DS = DS;\nexports.belongsTo = belongsTo;\nexports.hasMany = hasMany;\nexports.BuildURLMixin = buildUrlMixin;\nexports.Snapshot = Snapshot;\nexports.AdapterError = AdapterError;\nexports.InvalidError = InvalidError;\nexports.UnauthorizedError = UnauthorizedError;\nexports.ForbiddenError = ForbiddenError;\nexports.NotFoundError = NotFoundError;\nexports.ConflictError = ConflictError;\nexports.ServerError = ServerError;\nexports.TimeoutError = TimeoutError;\nexports.AbortError = AbortError;\nexports.errorsHashToArray = errorsHashToArray;\nexports.errorsArrayToHash = errorsArrayToHash;\nexports.normalizeModelName = normalizeModelName;\nexports.getOwner = getOwner;\nexports.modelHasAttributeOrRelationshipNamedType = modelHasAttributeOrRelationshipNamedType;\nexports.coerceId = coerceId;\nexports.parseResponseHeaders = parseResponseHeaders;\nexports.isEnabled = isEnabled;\nexports.RootState = RootState$1;\nexports.InternalModel = InternalModel;\nexports.PromiseArray = PromiseArray;\nexports.PromiseObject = PromiseObject;\nexports.PromiseManyArray = PromiseManyArray;\nexports.RecordArray = RecordArray;\nexports.FilteredRecordArray = FilteredRecordArray;\nexports.AdapterPopulatedRecordArray = AdapterPopulatedRecordArray;\nexports.ManyArray = ManyArray;\nexports.RecordArrayManager = RecordArrayManager;\nexports.Relationship = Relationship;\nexports.DebugAdapter = debugAdapter;\nexports.diffArray = diffArray;\nexports.RelationshipPayloadsManager = RelationshipPayloadsManager;\nexports.RelationshipPayloads = RelationshipPayloads;\nexports.SnapshotRecordArray = SnapshotRecordArray;\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n});\n","define('ember-data/adapter', ['exports'], function (exports) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = Ember.Object.extend({\n\n /**\n If you would like your adapter to use a custom serializer you can\n set the `defaultSerializer` property to be the name of the custom\n serializer.\n Note the `defaultSerializer` serializer has a lower priority than\n a model specific serializer (i.e. `PostSerializer`) or the\n `application` serializer.\n ```app/adapters/django.js\n import DS from 'ember-data';\n export default DS.Adapter.extend({\n defaultSerializer: 'django'\n });\n ```\n @property defaultSerializer\n @type {String}\n */\n defaultSerializer: '-default',\n\n /**\n The `findRecord()` method is invoked when the store is asked for a record that\n has not previously been loaded. In response to `findRecord()` being called, you\n should query your persistence layer for a record with the given ID. The `findRecord`\n method should return a promise that will resolve to a JavaScript object that will be\n normalized by the serializer.\n Here is an example `findRecord` implementation:\n ```app/adapters/application.js\n import DS from 'ember-data';\n import RSVP from 'RSVP';\n import $ from 'jquery';\n export default DS.Adapter.extend({\n findRecord(store, type, id, snapshot) {\n return new RSVP.Promise(function(resolve, reject) {\n $.getJSON(`/${type.modelName}/${id}`).then(function(data) {\n resolve(data);\n }, function(jqXHR) {\n reject(jqXHR);\n });\n });\n }\n });\n ```\n @method findRecord\n @param {DS.Store} store\n @param {DS.Model} type\n @param {String} id\n @param {DS.Snapshot} snapshot\n @return {Promise} promise\n */\n findRecord: null,\n\n /**\n The `findAll()` method is used to retrieve all records for a given type.\n Example\n ```app/adapters/application.js\n import DS from 'ember-data';\n import RSVP from 'RSVP';\n import $ from 'jquery';\n export default DS.Adapter.extend({\n findAll(store, type, sinceToken) {\n let query = { since: sinceToken };\n return new RSVP.Promise(function(resolve, reject) {\n $.getJSON(`/${type.modelName}`, query).then(function(data) {\n resolve(data);\n }, function(jqXHR) {\n reject(jqXHR);\n });\n });\n }\n });\n ```\n @method findAll\n @param {DS.Store} store\n @param {DS.Model} type\n @param {String} sinceToken\n @param {DS.SnapshotRecordArray} snapshotRecordArray\n @return {Promise} promise\n */\n findAll: null,\n\n /**\n This method is called when you call `query` on the store.\n Example\n ```app/adapters/application.js\n import DS from 'ember-data';\n import RSVP from 'RSVP';\n import $ from 'jquery';\n export default DS.Adapter.extend({\n query(store, type, query) {\n return new RSVP.Promise(function(resolve, reject) {\n $.getJSON(`/${type.modelName}`, query).then(function(data) {\n resolve(data);\n }, function(jqXHR) {\n reject(jqXHR);\n });\n });\n }\n });\n ```\n @method query\n @param {DS.Store} store\n @param {DS.Model} type\n @param {Object} query\n @param {DS.AdapterPopulatedRecordArray} recordArray\n @return {Promise} promise\n */\n query: null,\n\n /**\n The `queryRecord()` method is invoked when the store is asked for a single\n record through a query object.\n In response to `queryRecord()` being called, you should always fetch fresh\n data. Once found, you can asynchronously call the store's `push()` method\n to push the record into the store.\n Here is an example `queryRecord` implementation:\n Example\n ```app/adapters/application.js\n import DS from 'ember-data';\n import RSVP from 'RSVP';\n import $ from 'jquery';\n export default DS.Adapter.extend(DS.BuildURLMixin, {\n queryRecord(store, type, query) {\n return new RSVP.Promise(function(resolve, reject) {\n $.getJSON(`/${type.modelName}`, query).then(function(data) {\n resolve(data);\n }, function(jqXHR) {\n reject(jqXHR);\n });\n });\n }\n });\n ```\n @method queryRecord\n @param {DS.Store} store\n @param {subclass of DS.Model} type\n @param {Object} query\n @return {Promise} promise\n */\n queryRecord: null,\n\n /**\n If the globally unique IDs for your records should be generated on the client,\n implement the `generateIdForRecord()` method. This method will be invoked\n each time you create a new record, and the value returned from it will be\n assigned to the record's `primaryKey`.\n Most traditional REST-like HTTP APIs will not use this method. Instead, the ID\n of the record will be set by the server, and your adapter will update the store\n with the new ID when it calls `didCreateRecord()`. Only implement this method if\n you intend to generate record IDs on the client-side.\n The `generateIdForRecord()` method will be invoked with the requesting store as\n the first parameter and the newly created record as the second parameter:\n ```javascript\n import DS from 'ember-data';\n import { v4 } from 'uuid';\n export default DS.Adapter.extend({\n generateIdForRecord(store, inputProperties) {\n return v4();\n }\n });\n ```\n @method generateIdForRecord\n @param {DS.Store} store\n @param {DS.Model} type the DS.Model class of the record\n @param {Object} inputProperties a hash of properties to set on the\n newly created record.\n @return {(String|Number)} id\n */\n generateIdForRecord: null,\n\n /**\n Proxies to the serializer's `serialize` method.\n Example\n ```app/adapters/application.js\n import DS from 'ember-data';\n export default DS.Adapter.extend({\n createRecord(store, type, snapshot) {\n let data = this.serialize(snapshot, { includeId: true });\n let url = `/${type.modelName}`;\n // ...\n }\n });\n ```\n @method serialize\n @param {DS.Snapshot} snapshot\n @param {Object} options\n @return {Object} serialized snapshot\n */\n serialize(snapshot, options) {\n return snapshot.serialize(options);\n },\n\n /**\n Implement this method in a subclass to handle the creation of\n new records.\n Serializes the record and sends it to the server.\n Example\n ```app/adapters/application.js\n import DS from 'ember-data';\n import { run } from '@ember/runloop';\n import RSVP from 'RSVP';\n import $ from 'jquery';\n export default DS.Adapter.extend({\n createRecord(store, type, snapshot) {\n let data = this.serialize(snapshot, { includeId: true });\n return new RSVP.Promise(function(resolve, reject) {\n $.ajax({\n type: 'POST',\n url: `/${type.modelName}`,\n dataType: 'json',\n data: data\n }).then(function(data) {\n run(null, resolve, data);\n }, function(jqXHR) {\n jqXHR.then = null; // tame jQuery's ill mannered promises\n run(null, reject, jqXHR);\n });\n });\n }\n });\n ```\n @method createRecord\n @param {DS.Store} store\n @param {DS.Model} type the DS.Model class of the record\n @param {DS.Snapshot} snapshot\n @return {Promise} promise\n */\n createRecord: null,\n\n /**\n Implement this method in a subclass to handle the updating of\n a record.\n Serializes the record update and sends it to the server.\n The updateRecord method is expected to return a promise that will\n resolve with the serialized record. This allows the backend to\n inform the Ember Data store the current state of this record after\n the update. If it is not possible to return a serialized record\n the updateRecord promise can also resolve with `undefined` and the\n Ember Data store will assume all of the updates were successfully\n applied on the backend.\n Example\n ```app/adapters/application.js\n import DS from 'ember-data';\n import { run } from '@ember/runloop';\n import RSVP from 'RSVP';\n import $ from 'jquery';\n export default DS.Adapter.extend({\n updateRecord(store, type, snapshot) {\n let data = this.serialize(snapshot, { includeId: true });\n let id = snapshot.id;\n return new RSVP.Promise(function(resolve, reject) {\n $.ajax({\n type: 'PUT',\n url: `/${type.modelName}/${id}`,\n dataType: 'json',\n data: data\n }).then(function(data) {\n run(null, resolve, data);\n }, function(jqXHR) {\n jqXHR.then = null; // tame jQuery's ill mannered promises\n run(null, reject, jqXHR);\n });\n });\n }\n });\n ```\n @method updateRecord\n @param {DS.Store} store\n @param {DS.Model} type the DS.Model class of the record\n @param {DS.Snapshot} snapshot\n @return {Promise} promise\n */\n updateRecord: null,\n\n /**\n Implement this method in a subclass to handle the deletion of\n a record.\n Sends a delete request for the record to the server.\n Example\n ```app/adapters/application.js\n import DS from 'ember-data';\n import { run } from '@ember/runloop';\n import RSVP from 'RSVP';\n import $ from 'jquery';\n export default DS.Adapter.extend({\n deleteRecord(store, type, snapshot) {\n let data = this.serialize(snapshot, { includeId: true });\n let id = snapshot.id;\n return new RSVP.Promise(function(resolve, reject) {\n $.ajax({\n type: 'DELETE',\n url: `/${type.modelName}/${id}`,\n dataType: 'json',\n data: data\n }).then(function(data) {\n run(null, resolve, data);\n }, function(jqXHR) {\n jqXHR.then = null; // tame jQuery's ill mannered promises\n run(null, reject, jqXHR);\n });\n });\n }\n });\n ```\n @method deleteRecord\n @param {DS.Store} store\n @param {DS.Model} type the DS.Model class of the record\n @param {DS.Snapshot} snapshot\n @return {Promise} promise\n */\n deleteRecord: null,\n\n /**\n By default the store will try to coalesce all `fetchRecord` calls within the same runloop\n into as few requests as possible by calling groupRecordsForFindMany and passing it into a findMany call.\n You can opt out of this behaviour by either not implementing the findMany hook or by setting\n coalesceFindRequests to false.\n @property coalesceFindRequests\n @type {boolean}\n */\n coalesceFindRequests: true,\n\n /**\n The store will call `findMany` instead of multiple `findRecord`\n requests to find multiple records at once if coalesceFindRequests\n is true.\n ```app/adapters/application.js\n import DS from 'ember-data';\n import { run } from '@ember/runloop';\n import RSVP from 'RSVP';\n import $ from 'jquery';\n export default DS.Adapter.extend({\n findMany(store, type, ids, snapshots) {\n return new RSVP.Promise(function(resolve, reject) {\n $.ajax({\n type: 'GET',\n url: `/${type.modelName}/`,\n dataType: 'json',\n data: { filter: { id: ids.join(',') } }\n }).then(function(data) {\n run(null, resolve, data);\n }, function(jqXHR) {\n jqXHR.then = null; // tame jQuery's ill mannered promises\n run(null, reject, jqXHR);\n });\n });\n }\n });\n ```\n @method findMany\n @param {DS.Store} store\n @param {DS.Model} type the DS.Model class of the records\n @param {Array} ids\n @param {Array} snapshots\n @return {Promise} promise\n */\n findMany: null,\n\n /**\n Organize records into groups, each of which is to be passed to separate\n calls to `findMany`.\n For example, if your api has nested URLs that depend on the parent, you will\n want to group records by their parent.\n The default implementation returns the records as a single group.\n @method groupRecordsForFindMany\n @param {DS.Store} store\n @param {Array} snapshots\n @return {Array} an array of arrays of records, each of which is to be\n loaded separately by `findMany`.\n */\n groupRecordsForFindMany(store, snapshots) {\n return [snapshots];\n },\n\n /**\n This method is used by the store to determine if the store should\n reload a record from the adapter when a record is requested by\n `store.findRecord`.\n If this method returns `true`, the store will re-fetch a record from\n the adapter. If this method returns `false`, the store will resolve\n immediately using the cached record.\n For example, if you are building an events ticketing system, in which users\n can only reserve tickets for 20 minutes at a time, and want to ensure that\n in each route you have data that is no more than 20 minutes old you could\n write:\n ```javascript\n shouldReloadRecord(store, ticketSnapshot) {\n let lastAccessedAt = ticketSnapshot.attr('lastAccessedAt');\n let timeDiff = moment().diff(lastAccessedAt, 'minutes');\n if (timeDiff > 20) {\n return true;\n } else {\n return false;\n }\n }\n ```\n This method would ensure that whenever you do `store.findRecord('ticket',\n id)` you will always get a ticket that is no more than 20 minutes old. In\n case the cached version is more than 20 minutes old, `findRecord` will not\n resolve until you fetched the latest version.\n By default this hook returns `false`, as most UIs should not block user\n interactions while waiting on data update.\n Note that, with default settings, `shouldBackgroundReloadRecord` will always\n re-fetch the records in the background even if `shouldReloadRecord` returns\n `false`. You can override `shouldBackgroundReloadRecord` if this does not\n suit your use case.\n @since 1.13.0\n @method shouldReloadRecord\n @param {DS.Store} store\n @param {DS.Snapshot} snapshot\n @return {Boolean}\n */\n shouldReloadRecord(store, snapshot) {\n return false;\n },\n\n /**\n This method is used by the store to determine if the store should\n reload all records from the adapter when records are requested by\n `store.findAll`.\n If this method returns `true`, the store will re-fetch all records from\n the adapter. If this method returns `false`, the store will resolve\n immediately using the cached records.\n For example, if you are building an events ticketing system, in which users\n can only reserve tickets for 20 minutes at a time, and want to ensure that\n in each route you have data that is no more than 20 minutes old you could\n write:\n ```javascript\n shouldReloadAll(store, snapshotArray) {\n let snapshots = snapshotArray.snapshots();\n return snapshots.any((ticketSnapshot) => {\n let lastAccessedAt = ticketSnapshot.attr('lastAccessedAt');\n let timeDiff = moment().diff(lastAccessedAt, 'minutes');\n if (timeDiff > 20) {\n return true;\n } else {\n return false;\n }\n });\n }\n ```\n This method would ensure that whenever you do `store.findAll('ticket')` you\n will always get a list of tickets that are no more than 20 minutes old. In\n case a cached version is more than 20 minutes old, `findAll` will not\n resolve until you fetched the latest versions.\n By default this methods returns `true` if the passed `snapshotRecordArray`\n is empty (meaning that there are no records locally available yet),\n otherwise it returns `false`.\n Note that, with default settings, `shouldBackgroundReloadAll` will always\n re-fetch all the records in the background even if `shouldReloadAll` returns\n `false`. You can override `shouldBackgroundReloadAll` if this does not suit\n your use case.\n @since 1.13.0\n @method shouldReloadAll\n @param {DS.Store} store\n @param {DS.SnapshotRecordArray} snapshotRecordArray\n @return {Boolean}\n */\n shouldReloadAll(store, snapshotRecordArray) {\n return !snapshotRecordArray.length;\n },\n\n /**\n This method is used by the store to determine if the store should\n reload a record after the `store.findRecord` method resolves a\n cached record.\n This method is *only* checked by the store when the store is\n returning a cached record.\n If this method returns `true` the store will re-fetch a record from\n the adapter.\n For example, if you do not want to fetch complex data over a mobile\n connection, or if the network is down, you can implement\n `shouldBackgroundReloadRecord` as follows:\n ```javascript\n shouldBackgroundReloadRecord(store, snapshot) {\n let connection = window.navigator.connection;\n if (connection === 'cellular' || connection === 'none') {\n return false;\n } else {\n return true;\n }\n }\n ```\n By default this hook returns `true` so the data for the record is updated\n in the background.\n @since 1.13.0\n @method shouldBackgroundReloadRecord\n @param {DS.Store} store\n @param {DS.Snapshot} snapshot\n @return {Boolean}\n */\n shouldBackgroundReloadRecord(store, snapshot) {\n return true;\n },\n\n /**\n This method is used by the store to determine if the store should\n reload a record array after the `store.findAll` method resolves\n with a cached record array.\n This method is *only* checked by the store when the store is\n returning a cached record array.\n If this method returns `true` the store will re-fetch all records\n from the adapter.\n For example, if you do not want to fetch complex data over a mobile\n connection, or if the network is down, you can implement\n `shouldBackgroundReloadAll` as follows:\n ```javascript\n shouldBackgroundReloadAll(store, snapshotArray) {\n let connection = window.navigator.connection;\n if (connection === 'cellular' || connection === 'none') {\n return false;\n } else {\n return true;\n }\n }\n ```\n By default this method returns `true`, indicating that a background reload\n should always be triggered.\n @since 1.13.0\n @method shouldBackgroundReloadAll\n @param {DS.Store} store\n @param {DS.SnapshotRecordArray} snapshotRecordArray\n @return {Boolean}\n */\n shouldBackgroundReloadAll(store, snapshotRecordArray) {\n return true;\n }\n });\n});","define('ember-data/adapters/errors', ['exports', 'ember-data/-private'], function (exports, _private) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n Object.defineProperty(exports, 'AdapterError', {\n enumerable: true,\n get: function () {\n return _private.AdapterError;\n }\n });\n Object.defineProperty(exports, 'InvalidError', {\n enumerable: true,\n get: function () {\n return _private.InvalidError;\n }\n });\n Object.defineProperty(exports, 'UnauthorizedError', {\n enumerable: true,\n get: function () {\n return _private.UnauthorizedError;\n }\n });\n Object.defineProperty(exports, 'ForbiddenError', {\n enumerable: true,\n get: function () {\n return _private.ForbiddenError;\n }\n });\n Object.defineProperty(exports, 'NotFoundError', {\n enumerable: true,\n get: function () {\n return _private.NotFoundError;\n }\n });\n Object.defineProperty(exports, 'ConflictError', {\n enumerable: true,\n get: function () {\n return _private.ConflictError;\n }\n });\n Object.defineProperty(exports, 'ServerError', {\n enumerable: true,\n get: function () {\n return _private.ServerError;\n }\n });\n Object.defineProperty(exports, 'TimeoutError', {\n enumerable: true,\n get: function () {\n return _private.TimeoutError;\n }\n });\n Object.defineProperty(exports, 'AbortError', {\n enumerable: true,\n get: function () {\n return _private.AbortError;\n }\n });\n Object.defineProperty(exports, 'errorsHashToArray', {\n enumerable: true,\n get: function () {\n return _private.errorsHashToArray;\n }\n });\n Object.defineProperty(exports, 'errorsArrayToHash', {\n enumerable: true,\n get: function () {\n return _private.errorsArrayToHash;\n }\n });\n});","define('ember-data/adapters/json-api', ['exports', 'ember-data/adapters/rest', 'ember-data/-private', 'ember-inflector'], function (exports, _rest, _private, _emberInflector) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n\n /**\n The `JSONAPIAdapter` is the default adapter used by Ember Data. It\n is responsible for transforming the store's requests into HTTP\n requests that follow the [JSON API](http://jsonapi.org/format/)\n format.\n \n ## JSON API Conventions\n \n The JSONAPIAdapter uses JSON API conventions for building the url\n for a record and selecting the HTTP verb to use with a request. The\n actions you can take on a record map onto the following URLs in the\n JSON API adapter:\n \n <table>\n <tr>\n <th>\n Action\n </th>\n <th>\n HTTP Verb\n </th>\n <th>\n URL\n </th>\n </tr>\n <tr>\n <th>\n `store.findRecord('post', 123)`\n </th>\n <td>\n GET\n </td>\n <td>\n /posts/123\n </td>\n </tr>\n <tr>\n <th>\n `store.findAll('post')`\n </th>\n <td>\n GET\n </td>\n <td>\n /posts\n </td>\n </tr>\n <tr>\n <th>\n Update `postRecord.save()`\n </th>\n <td>\n PATCH\n </td>\n <td>\n /posts/123\n </td>\n </tr>\n <tr>\n <th>\n Create `store.createRecord('post').save()`\n </th>\n <td>\n POST\n </td>\n <td>\n /posts\n </td>\n </tr>\n <tr>\n <th>\n Delete `postRecord.destroyRecord()`\n </th>\n <td>\n DELETE\n </td>\n <td>\n /posts/123\n </td>\n </tr>\n </table>\n \n ## Success and failure\n \n The JSONAPIAdapter will consider a success any response with a\n status code of the 2xx family (\"Success\"), as well as 304 (\"Not\n Modified\"). Any other status code will be considered a failure.\n \n On success, the request promise will be resolved with the full\n response payload.\n \n Failed responses with status code 422 (\"Unprocessable Entity\") will\n be considered \"invalid\". The response will be discarded, except for\n the `errors` key. The request promise will be rejected with a\n `DS.InvalidError`. This error object will encapsulate the saved\n `errors` value.\n \n Any other status codes will be treated as an adapter error. The\n request promise will be rejected, similarly to the invalid case,\n but with an instance of `DS.AdapterError` instead.\n \n ### Endpoint path customization\n \n Endpoint paths can be prefixed with a `namespace` by setting the\n namespace property on the adapter:\n \n ```app/adapters/application.js\n import DS from 'ember-data';\n \n export default DS.JSONAPIAdapter.extend({\n namespace: 'api/1'\n });\n ```\n Requests for the `person` model would now target `/api/1/people/1`.\n \n ### Host customization\n \n An adapter can target other hosts by setting the `host` property.\n \n ```app/adapters/application.js\n import DS from 'ember-data';\n \n export default DS.JSONAPIAdapter.extend({\n host: 'https://api.example.com'\n });\n ```\n \n Requests for the `person` model would now target\n `https://api.example.com/people/1`.\n \n @since 1.13.0\n @class JSONAPIAdapter\n @constructor\n @namespace DS\n @extends DS.RESTAdapter\n */\n var JSONAPIAdapter = _rest.default.extend({\n defaultSerializer: '-json-api',\n\n /**\n @method ajaxOptions\n @private\n @param {String} url\n @param {String} type The request type GET, POST, PUT, DELETE etc.\n @param {Object} options\n @return {Object}\n */\n ajaxOptions(url, type, options) {\n var hash = this._super(...arguments);\n\n if (hash.contentType) {\n hash.contentType = 'application/vnd.api+json';\n }\n\n var beforeSend = hash.beforeSend;\n hash.beforeSend = function (xhr) {\n xhr.setRequestHeader('Accept', 'application/vnd.api+json');\n if (beforeSend) {\n beforeSend(xhr);\n }\n };\n\n return hash;\n },\n\n /**\n By default the JSONAPIAdapter will send each find request coming from a `store.find`\n or from accessing a relationship separately to the server. If your server supports passing\n ids as a query string, you can set coalesceFindRequests to true to coalesce all find requests\n within a single runloop.\n For example, if you have an initial payload of:\n ```javascript\n {\n data: {\n id: 1,\n type: 'post',\n relationship: {\n comments: {\n data: [\n { id: 1, type: 'comment' },\n { id: 2, type: 'comment' }\n ]\n }\n }\n }\n }\n ```\n By default calling `post.get('comments')` will trigger the following requests(assuming the\n comments haven't been loaded before):\n ```\n GET /comments/1\n GET /comments/2\n ```\n If you set coalesceFindRequests to `true` it will instead trigger the following request:\n ```\n GET /comments?filter[id]=1,2\n ```\n Setting coalesceFindRequests to `true` also works for `store.find` requests and `belongsTo`\n relationships accessed within the same runloop. If you set `coalesceFindRequests: true`\n ```javascript\n store.findRecord('comment', 1);\n store.findRecord('comment', 2);\n ```\n will also send a request to: `GET /comments?filter[id]=1,2`\n Note: Requests coalescing rely on URL building strategy. So if you override `buildURL` in your app\n `groupRecordsForFindMany` more likely should be overridden as well in order for coalescing to work.\n @property coalesceFindRequests\n @type {boolean}\n */\n coalesceFindRequests: false,\n\n findMany(store, type, ids, snapshots) {\n if ((0, _private.isEnabled)('ds-improved-ajax') && !this._hasCustomizedAjax()) {\n return this._super(...arguments);\n } else {\n var url = this.buildURL(type.modelName, ids, snapshots, 'findMany');\n return this.ajax(url, 'GET', { data: { filter: { id: ids.join(',') } } });\n }\n },\n\n pathForType(modelName) {\n var dasherized = Ember.String.dasherize(modelName);\n return (0, _emberInflector.pluralize)(dasherized);\n },\n\n // TODO: Remove this once we have a better way to override HTTP verbs.\n updateRecord(store, type, snapshot) {\n if ((0, _private.isEnabled)('ds-improved-ajax') && !this._hasCustomizedAjax()) {\n return this._super(...arguments);\n } else {\n var data = {};\n var serializer = store.serializerFor(type.modelName);\n\n serializer.serializeIntoHash(data, type, snapshot, { includeId: true });\n\n var url = this.buildURL(type.modelName, snapshot.id, snapshot, 'updateRecord');\n\n return this.ajax(url, 'PATCH', { data: data });\n }\n },\n\n _hasCustomizedAjax() {\n if (this.ajax !== JSONAPIAdapter.prototype.ajax) {\n (true && !(false) && Ember.deprecate('JSONAPIAdapter#ajax has been deprecated please use. `methodForRequest`, `urlForRequest`, `headersForRequest` or `dataForRequest` instead.', false, {\n id: 'ds.json-api-adapter.ajax',\n until: '3.0.0'\n }));\n\n return true;\n }\n\n if (this.ajaxOptions !== JSONAPIAdapter.prototype.ajaxOptions) {\n (true && !(false) && Ember.deprecate('JSONAPIAdapterr#ajaxOptions has been deprecated please use. `methodForRequest`, `urlForRequest`, `headersForRequest` or `dataForRequest` instead.', false, {\n id: 'ds.json-api-adapter.ajax-options',\n until: '3.0.0'\n }));\n\n return true;\n }\n\n return false;\n }\n }); /* global heimdall */\n /**\n @module ember-data\n */\n\n\n if ((0, _private.isEnabled)('ds-improved-ajax')) {\n\n JSONAPIAdapter.reopen({\n\n methodForRequest(params) {\n if (params.requestType === 'updateRecord') {\n return 'PATCH';\n }\n\n return this._super(...arguments);\n },\n\n dataForRequest(params) {\n var { requestType, ids } = params;\n\n if (requestType === 'findMany') {\n return {\n filter: { id: ids.join(',') }\n };\n }\n\n if (requestType === 'updateRecord') {\n var { store, type, snapshot } = params;\n var data = {};\n var serializer = store.serializerFor(type.modelName);\n\n serializer.serializeIntoHash(data, type, snapshot, { includeId: true });\n\n return data;\n }\n\n return this._super(...arguments);\n },\n\n headersForRequest() {\n var headers = this._super(...arguments) || {};\n\n headers['Accept'] = 'application/vnd.api+json';\n\n return headers;\n },\n\n _requestToJQueryAjaxHash() {\n var hash = this._super(...arguments);\n\n if (hash.contentType) {\n hash.contentType = 'application/vnd.api+json';\n }\n\n return hash;\n }\n\n });\n }\n\n exports.default = JSONAPIAdapter;\n});","define('ember-data/adapters/rest', ['exports', 'ember-data/adapter', 'ember-data/-private'], function (exports, _adapter, _private) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n\n var Promise = Ember.RSVP.Promise;\n\n /**\n The REST adapter allows your store to communicate with an HTTP server by\n transmitting JSON via XHR. Most Ember.js apps that consume a JSON API\n should use the REST adapter.\n \n This adapter is designed around the idea that the JSON exchanged with\n the server should be conventional.\n \n ## Success and failure\n \n The REST adapter will consider a success any response with a status code\n of the 2xx family (\"Success\"), as well as 304 (\"Not Modified\"). Any other\n status code will be considered a failure.\n \n On success, the request promise will be resolved with the full response\n payload.\n \n Failed responses with status code 422 (\"Unprocessable Entity\") will be\n considered \"invalid\". The response will be discarded, except for the\n `errors` key. The request promise will be rejected with a `DS.InvalidError`.\n This error object will encapsulate the saved `errors` value.\n \n Any other status codes will be treated as an \"adapter error\". The request\n promise will be rejected, similarly to the \"invalid\" case, but with\n an instance of `DS.AdapterError` instead.\n \n ## JSON Structure\n \n The REST adapter expects the JSON returned from your server to follow\n these conventions.\n \n ### Object Root\n \n The JSON payload should be an object that contains the record inside a\n root property. For example, in response to a `GET` request for\n `/posts/1`, the JSON should look like this:\n \n ```js\n {\n \"posts\": {\n \"id\": 1,\n \"title\": \"I'm Running to Reform the W3C's Tag\",\n \"author\": \"Yehuda Katz\"\n }\n }\n ```\n \n Similarly, in response to a `GET` request for `/posts`, the JSON should\n look like this:\n \n ```js\n {\n \"posts\": [\n {\n \"id\": 1,\n \"title\": \"I'm Running to Reform the W3C's Tag\",\n \"author\": \"Yehuda Katz\"\n },\n {\n \"id\": 2,\n \"title\": \"Rails is omakase\",\n \"author\": \"D2H\"\n }\n ]\n }\n ```\n \n Note that the object root can be pluralized for both a single-object response\n and an array response: the REST adapter is not strict on this. Further, if the\n HTTP server responds to a `GET` request to `/posts/1` (e.g. the response to a\n `findRecord` query) with more than one object in the array, Ember Data will\n only display the object with the matching ID.\n \n ### Conventional Names\n \n Attribute names in your JSON payload should be the camelCased versions of\n the attributes in your Ember.js models.\n \n For example, if you have a `Person` model:\n \n ```app/models/person.js\n import DS from 'ember-data';\n \n export default DS.Model.extend({\n firstName: DS.attr('string'),\n lastName: DS.attr('string'),\n occupation: DS.attr('string')\n });\n ```\n \n The JSON returned should look like this:\n \n ```js\n {\n \"people\": {\n \"id\": 5,\n \"firstName\": \"Zaphod\",\n \"lastName\": \"Beeblebrox\",\n \"occupation\": \"President\"\n }\n }\n ```\n \n #### Relationships\n \n Relationships are usually represented by ids to the record in the\n relationship. The related records can then be sideloaded in the\n response under a key for the type.\n \n ```js\n {\n \"posts\": {\n \"id\": 5,\n \"title\": \"I'm Running to Reform the W3C's Tag\",\n \"author\": \"Yehuda Katz\",\n \"comments\": [1, 2]\n },\n \"comments\": [{\n \"id\": 1,\n \"author\": \"User 1\",\n \"message\": \"First!\",\n }, {\n \"id\": 2,\n \"author\": \"User 2\",\n \"message\": \"Good Luck!\",\n }]\n }\n ```\n \n If the records in the relationship are not known when the response\n is serialized its also possible to represent the relationship as a\n url using the `links` key in the response. Ember Data will fetch\n this url to resolve the relationship when it is accessed for the\n first time.\n \n ```js\n {\n \"posts\": {\n \"id\": 5,\n \"title\": \"I'm Running to Reform the W3C's Tag\",\n \"author\": \"Yehuda Katz\",\n \"links\": {\n \"comments\": \"/posts/5/comments\"\n }\n }\n }\n ```\n \n ### Errors\n \n If a response is considered a failure, the JSON payload is expected to include\n a top-level key `errors`, detailing any specific issues. For example:\n \n ```js\n {\n \"errors\": {\n \"msg\": \"Something went wrong\"\n }\n }\n ```\n \n This adapter does not make any assumptions as to the format of the `errors`\n object. It will simply be passed along as is, wrapped in an instance\n of `DS.InvalidError` or `DS.AdapterError`. The serializer can interpret it\n afterwards.\n \n ## Customization\n \n ### Endpoint path customization\n \n Endpoint paths can be prefixed with a `namespace` by setting the namespace\n property on the adapter:\n \n ```app/adapters/application.js\n import DS from 'ember-data';\n \n export default DS.RESTAdapter.extend({\n namespace: 'api/1'\n });\n ```\n Requests for the `Person` model would now target `/api/1/people/1`.\n \n ### Host customization\n \n An adapter can target other hosts by setting the `host` property.\n \n ```app/adapters/application.js\n import DS from 'ember-data';\n \n export default DS.RESTAdapter.extend({\n host: 'https://api.example.com'\n });\n ```\n \n ### Headers customization\n \n Some APIs require HTTP headers, e.g. to provide an API key. Arbitrary\n headers can be set as key/value pairs on the `RESTAdapter`'s `headers`\n object and Ember Data will send them along with each ajax request.\n \n \n ```app/adapters/application.js\n import DS from 'ember-data';\n import { computed } from '@ember/object';\n \n export default DS.RESTAdapter.extend({\n headers: computed(function() {\n return {\n 'API_KEY': 'secret key',\n 'ANOTHER_HEADER': 'Some header value'\n };\n }\n });\n ```\n \n `headers` can also be used as a computed property to support dynamic\n headers. In the example below, the `session` object has been\n injected into an adapter by Ember's container.\n \n ```app/adapters/application.js\n import DS from 'ember-data';\n import { computed } from '@ember/object';\n \n export default DS.RESTAdapter.extend({\n headers: computed('session.authToken', function() {\n return {\n 'API_KEY': this.get('session.authToken'),\n 'ANOTHER_HEADER': 'Some header value'\n };\n })\n });\n ```\n \n In some cases, your dynamic headers may require data from some\n object outside of Ember's observer system (for example\n `document.cookie`). You can use the\n [volatile](/api/classes/Ember.ComputedProperty.html#method_volatile)\n function to set the property into a non-cached mode causing the headers to\n be recomputed with every request.\n \n ```app/adapters/application.js\n import DS from 'ember-data';\n import { get } from '@ember/object';\n import { computed } from '@ember/object';\n \n export default DS.RESTAdapter.extend({\n headers: computed(function() {\n return {\n 'API_KEY': get(document.cookie.match(/apiKey\\=([^;]*)/), '1'),\n 'ANOTHER_HEADER': 'Some header value'\n };\n }).volatile()\n });\n ```\n \n @class RESTAdapter\n @constructor\n @namespace DS\n @extends DS.Adapter\n @uses DS.BuildURLMixin\n */\n /* global heimdall */\n /**\n @module ember-data\n */\n\n var RESTAdapter = _adapter.default.extend(_private.BuildURLMixin, {\n defaultSerializer: '-rest',\n\n /**\n By default, the RESTAdapter will send the query params sorted alphabetically to the\n server.\n For example:\n ```js\n store.query('posts', { sort: 'price', category: 'pets' });\n ```\n will generate a requests like this `/posts?category=pets&sort=price`, even if the\n parameters were specified in a different order.\n That way the generated URL will be deterministic and that simplifies caching mechanisms\n in the backend.\n Setting `sortQueryParams` to a falsey value will respect the original order.\n In case you want to sort the query parameters with a different criteria, set\n `sortQueryParams` to your custom sort function.\n ```app/adapters/application.js\n import DS from 'ember-data';\n export default DS.RESTAdapter.extend({\n sortQueryParams(params) {\n let sortedKeys = Object.keys(params).sort().reverse();\n let len = sortedKeys.length, newParams = {};\n for (let i = 0; i < len; i++) {\n newParams[sortedKeys[i]] = params[sortedKeys[i]];\n }\n return newParams;\n }\n });\n ```\n @method sortQueryParams\n @param {Object} obj\n @return {Object}\n */\n sortQueryParams(obj) {\n var keys = Object.keys(obj);\n var len = keys.length;\n if (len < 2) {\n return obj;\n }\n var newQueryParams = {};\n var sortedKeys = keys.sort();\n\n for (var i = 0; i < len; i++) {\n newQueryParams[sortedKeys[i]] = obj[sortedKeys[i]];\n }\n return newQueryParams;\n },\n\n /**\n By default the RESTAdapter will send each find request coming from a `store.find`\n or from accessing a relationship separately to the server. If your server supports passing\n ids as a query string, you can set coalesceFindRequests to true to coalesce all find requests\n within a single runloop.\n For example, if you have an initial payload of:\n ```javascript\n {\n post: {\n id: 1,\n comments: [1, 2]\n }\n }\n ```\n By default calling `post.get('comments')` will trigger the following requests(assuming the\n comments haven't been loaded before):\n ```\n GET /comments/1\n GET /comments/2\n ```\n If you set coalesceFindRequests to `true` it will instead trigger the following request:\n ```\n GET /comments?ids[]=1&ids[]=2\n ```\n Setting coalesceFindRequests to `true` also works for `store.find` requests and `belongsTo`\n relationships accessed within the same runloop. If you set `coalesceFindRequests: true`\n ```javascript\n store.findRecord('comment', 1);\n store.findRecord('comment', 2);\n ```\n will also send a request to: `GET /comments?ids[]=1&ids[]=2`\n Note: Requests coalescing rely on URL building strategy. So if you override `buildURL` in your app\n `groupRecordsForFindMany` more likely should be overridden as well in order for coalescing to work.\n @property coalesceFindRequests\n @type {boolean}\n */\n coalesceFindRequests: false,\n\n /**\n Endpoint paths can be prefixed with a `namespace` by setting the namespace\n property on the adapter:\n ```app/adapters/application.js\n import DS from 'ember-data';\n export default DS.RESTAdapter.extend({\n namespace: 'api/1'\n });\n ```\n Requests for the `Post` model would now target `/api/1/post/`.\n @property namespace\n @type {String}\n */\n\n /**\n An adapter can target other hosts by setting the `host` property.\n ```app/adapters/application.js\n import DS from 'ember-data';\n export default DS.RESTAdapter.extend({\n host: 'https://api.example.com'\n });\n ```\n Requests for the `Post` model would now target `https://api.example.com/post/`.\n @property host\n @type {String}\n */\n\n /**\n Some APIs require HTTP headers, e.g. to provide an API\n key. Arbitrary headers can be set as key/value pairs on the\n `RESTAdapter`'s `headers` object and Ember Data will send them\n along with each ajax request. For dynamic headers see [headers\n customization](/api/data/classes/DS.RESTAdapter.html#toc_headers-customization).\n ```app/adapters/application.js\n import DS from 'ember-data';\n import { computed } from '@ember/object';\n export default DS.RESTAdapter.extend({\n headers: computed(function() {\n return {\n 'API_KEY': 'secret key',\n 'ANOTHER_HEADER': 'Some header value'\n };\n })\n });\n ```\n @property headers\n @type {Object}\n */\n\n /**\n Called by the store in order to fetch the JSON for a given\n type and ID.\n The `findRecord` method makes an Ajax request to a URL computed by\n `buildURL`, and returns a promise for the resulting payload.\n This method performs an HTTP `GET` request with the id provided as part of the query string.\n @since 1.13.0\n @method findRecord\n @param {DS.Store} store\n @param {DS.Model} type\n @param {String} id\n @param {DS.Snapshot} snapshot\n @return {Promise} promise\n */\n findRecord(store, type, id, snapshot) {\n if ((0, _private.isEnabled)('ds-improved-ajax') && !this._hasCustomizedAjax()) {\n var request = this._requestFor({\n store, type, id, snapshot,\n requestType: 'findRecord'\n });\n\n return this._makeRequest(request);\n } else {\n var url = this.buildURL(type.modelName, id, snapshot, 'findRecord');\n var query = this.buildQuery(snapshot);\n\n return this.ajax(url, 'GET', { data: query });\n }\n },\n\n /**\n Called by the store in order to fetch a JSON array for all\n of the records for a given type.\n The `findAll` method makes an Ajax (HTTP GET) request to a URL computed by `buildURL`, and returns a\n promise for the resulting payload.\n @method findAll\n @param {DS.Store} store\n @param {DS.Model} type\n @param {String} sinceToken\n @param {DS.SnapshotRecordArray} snapshotRecordArray\n @return {Promise} promise\n */\n findAll(store, type, sinceToken, snapshotRecordArray) {\n var query = this.buildQuery(snapshotRecordArray);\n\n if ((0, _private.isEnabled)('ds-improved-ajax') && !this._hasCustomizedAjax()) {\n var request = this._requestFor({\n store, type, sinceToken, query,\n snapshots: snapshotRecordArray,\n requestType: 'findAll'\n });\n\n return this._makeRequest(request);\n } else {\n var url = this.buildURL(type.modelName, null, snapshotRecordArray, 'findAll');\n\n if (sinceToken) {\n query.since = sinceToken;\n }\n\n return this.ajax(url, 'GET', { data: query });\n }\n },\n\n /**\n Called by the store in order to fetch a JSON array for\n the records that match a particular query.\n The `query` method makes an Ajax (HTTP GET) request to a URL\n computed by `buildURL`, and returns a promise for the resulting\n payload.\n The `query` argument is a simple JavaScript object that will be passed directly\n to the server as parameters.\n @method query\n @param {DS.Store} store\n @param {DS.Model} type\n @param {Object} query\n @return {Promise} promise\n */\n query(store, type, query) {\n if ((0, _private.isEnabled)('ds-improved-ajax') && !this._hasCustomizedAjax()) {\n var request = this._requestFor({\n store, type, query,\n requestType: 'query'\n });\n\n return this._makeRequest(request);\n } else {\n var url = this.buildURL(type.modelName, null, null, 'query', query);\n\n if (this.sortQueryParams) {\n query = this.sortQueryParams(query);\n }\n\n return this.ajax(url, 'GET', { data: query });\n }\n },\n\n /**\n Called by the store in order to fetch a JSON object for\n the record that matches a particular query.\n The `queryRecord` method makes an Ajax (HTTP GET) request to a URL\n computed by `buildURL`, and returns a promise for the resulting\n payload.\n The `query` argument is a simple JavaScript object that will be passed directly\n to the server as parameters.\n @since 1.13.0\n @method queryRecord\n @param {DS.Store} store\n @param {DS.Model} type\n @param {Object} query\n @return {Promise} promise\n */\n queryRecord(store, type, query) {\n if ((0, _private.isEnabled)('ds-improved-ajax') && !this._hasCustomizedAjax()) {\n var request = this._requestFor({\n store, type, query,\n requestType: 'queryRecord'\n });\n\n return this._makeRequest(request);\n } else {\n var url = this.buildURL(type.modelName, null, null, 'queryRecord', query);\n\n if (this.sortQueryParams) {\n query = this.sortQueryParams(query);\n }\n\n return this.ajax(url, 'GET', { data: query });\n }\n },\n\n /**\n Called by the store in order to fetch several records together if `coalesceFindRequests` is true\n For example, if the original payload looks like:\n ```js\n {\n \"id\": 1,\n \"title\": \"Rails is omakase\",\n \"comments\": [ 1, 2, 3 ]\n }\n ```\n The IDs will be passed as a URL-encoded Array of IDs, in this form:\n ```\n ids[]=1&ids[]=2&ids[]=3\n ```\n Many servers, such as Rails and PHP, will automatically convert this URL-encoded array\n into an Array for you on the server-side. If you want to encode the\n IDs, differently, just override this (one-line) method.\n The `findMany` method makes an Ajax (HTTP GET) request to a URL computed by `buildURL`, and returns a\n promise for the resulting payload.\n @method findMany\n @param {DS.Store} store\n @param {DS.Model} type\n @param {Array} ids\n @param {Array} snapshots\n @return {Promise} promise\n */\n findMany(store, type, ids, snapshots) {\n if ((0, _private.isEnabled)('ds-improved-ajax') && !this._hasCustomizedAjax()) {\n var request = this._requestFor({\n store, type, ids, snapshots,\n requestType: 'findMany'\n });\n\n return this._makeRequest(request);\n } else {\n var url = this.buildURL(type.modelName, ids, snapshots, 'findMany');\n return this.ajax(url, 'GET', { data: { ids: ids } });\n }\n },\n\n /**\n Called by the store in order to fetch a JSON array for\n the unloaded records in a has-many relationship that were originally\n specified as a URL (inside of `links`).\n For example, if your original payload looks like this:\n ```js\n {\n \"post\": {\n \"id\": 1,\n \"title\": \"Rails is omakase\",\n \"links\": { \"comments\": \"/posts/1/comments\" }\n }\n }\n ```\n This method will be called with the parent record and `/posts/1/comments`.\n The `findHasMany` method will make an Ajax (HTTP GET) request to the originally specified URL.\n The format of your `links` value will influence the final request URL via the `urlPrefix` method:\n * Links beginning with `//`, `http://`, `https://`, will be used as is, with no further manipulation.\n * Links beginning with a single `/` will have the current adapter's `host` value prepended to it.\n * Links with no beginning `/` will have a parentURL prepended to it, via the current adapter's `buildURL`.\n @method findHasMany\n @param {DS.Store} store\n @param {DS.Snapshot} snapshot\n @param {String} url\n @param {Object} relationship meta object describing the relationship\n @return {Promise} promise\n */\n findHasMany(store, snapshot, url, relationship) {\n if ((0, _private.isEnabled)('ds-improved-ajax') && !this._hasCustomizedAjax()) {\n var request = this._requestFor({\n store, snapshot, url, relationship,\n requestType: 'findHasMany'\n });\n\n return this._makeRequest(request);\n } else {\n var id = snapshot.id;\n var type = snapshot.modelName;\n\n url = this.urlPrefix(url, this.buildURL(type, id, snapshot, 'findHasMany'));\n\n return this.ajax(url, 'GET');\n }\n },\n\n /**\n Called by the store in order to fetch the JSON for the unloaded record in a\n belongs-to relationship that was originally specified as a URL (inside of\n `links`).\n For example, if your original payload looks like this:\n ```js\n {\n \"person\": {\n \"id\": 1,\n \"name\": \"Tom Dale\",\n \"links\": { \"group\": \"/people/1/group\" }\n }\n }\n ```\n This method will be called with the parent record and `/people/1/group`.\n The `findBelongsTo` method will make an Ajax (HTTP GET) request to the originally specified URL.\n The format of your `links` value will influence the final request URL via the `urlPrefix` method:\n * Links beginning with `//`, `http://`, `https://`, will be used as is, with no further manipulation.\n * Links beginning with a single `/` will have the current adapter's `host` value prepended to it.\n * Links with no beginning `/` will have a parentURL prepended to it, via the current adapter's `buildURL`.\n @method findBelongsTo\n @param {DS.Store} store\n @param {DS.Snapshot} snapshot\n @param {String} url\n @param {Object} relationship meta object describing the relationship\n @return {Promise} promise\n */\n findBelongsTo(store, snapshot, url, relationship) {\n if ((0, _private.isEnabled)('ds-improved-ajax') && !this._hasCustomizedAjax()) {\n var request = this._requestFor({\n store, snapshot, url, relationship,\n requestType: 'findBelongsTo'\n });\n\n return this._makeRequest(request);\n } else {\n var id = snapshot.id;\n var type = snapshot.modelName;\n\n url = this.urlPrefix(url, this.buildURL(type, id, snapshot, 'findBelongsTo'));\n return this.ajax(url, 'GET');\n }\n },\n\n /**\n Called by the store when a newly created record is\n saved via the `save` method on a model record instance.\n The `createRecord` method serializes the record and makes an Ajax (HTTP POST) request\n to a URL computed by `buildURL`.\n See `serialize` for information on how to customize the serialized form\n of a record.\n @method createRecord\n @param {DS.Store} store\n @param {DS.Model} type\n @param {DS.Snapshot} snapshot\n @return {Promise} promise\n */\n createRecord(store, type, snapshot) {\n if ((0, _private.isEnabled)('ds-improved-ajax') && !this._hasCustomizedAjax()) {\n var request = this._requestFor({\n store, type, snapshot,\n requestType: 'createRecord'\n });\n\n return this._makeRequest(request);\n } else {\n var data = {};\n var serializer = store.serializerFor(type.modelName);\n var url = this.buildURL(type.modelName, null, snapshot, 'createRecord');\n\n serializer.serializeIntoHash(data, type, snapshot, { includeId: true });\n\n return this.ajax(url, \"POST\", { data: data });\n }\n },\n\n /**\n Called by the store when an existing record is saved\n via the `save` method on a model record instance.\n The `updateRecord` method serializes the record and makes an Ajax (HTTP PUT) request\n to a URL computed by `buildURL`.\n See `serialize` for information on how to customize the serialized form\n of a record.\n @method updateRecord\n @param {DS.Store} store\n @param {DS.Model} type\n @param {DS.Snapshot} snapshot\n @return {Promise} promise\n */\n updateRecord(store, type, snapshot) {\n if ((0, _private.isEnabled)('ds-improved-ajax') && !this._hasCustomizedAjax()) {\n var request = this._requestFor({\n store, type, snapshot,\n requestType: 'updateRecord'\n });\n\n return this._makeRequest(request);\n } else {\n var data = {};\n var serializer = store.serializerFor(type.modelName);\n\n serializer.serializeIntoHash(data, type, snapshot);\n\n var id = snapshot.id;\n var url = this.buildURL(type.modelName, id, snapshot, 'updateRecord');\n\n return this.ajax(url, \"PUT\", { data: data });\n }\n },\n\n /**\n Called by the store when a record is deleted.\n The `deleteRecord` method makes an Ajax (HTTP DELETE) request to a URL computed by `buildURL`.\n @method deleteRecord\n @param {DS.Store} store\n @param {DS.Model} type\n @param {DS.Snapshot} snapshot\n @return {Promise} promise\n */\n deleteRecord(store, type, snapshot) {\n if ((0, _private.isEnabled)('ds-improved-ajax') && !this._hasCustomizedAjax()) {\n var request = this._requestFor({\n store, type, snapshot,\n requestType: 'deleteRecord'\n });\n\n return this._makeRequest(request);\n } else {\n var id = snapshot.id;\n\n return this.ajax(this.buildURL(type.modelName, id, snapshot, 'deleteRecord'), \"DELETE\");\n }\n },\n\n _stripIDFromURL(store, snapshot) {\n var url = this.buildURL(snapshot.modelName, snapshot.id, snapshot);\n\n var expandedURL = url.split('/');\n // Case when the url is of the format ...something/:id\n // We are decodeURIComponent-ing the lastSegment because if it represents\n // the id, it has been encodeURIComponent-ified within `buildURL`. If we\n // don't do this, then records with id having special characters are not\n // coalesced correctly (see GH #4190 for the reported bug)\n var lastSegment = expandedURL[expandedURL.length - 1];\n var id = snapshot.id;\n if (decodeURIComponent(lastSegment) === id) {\n expandedURL[expandedURL.length - 1] = \"\";\n } else if (endsWith(lastSegment, '?id=' + id)) {\n //Case when the url is of the format ...something?id=:id\n expandedURL[expandedURL.length - 1] = lastSegment.substring(0, lastSegment.length - id.length - 1);\n }\n\n return expandedURL.join('/');\n },\n\n // http://stackoverflow.com/questions/417142/what-is-the-maximum-length-of-a-url-in-different-browsers\n maxURLLength: 2048,\n\n /**\n Organize records into groups, each of which is to be passed to separate\n calls to `findMany`.\n This implementation groups together records that have the same base URL but\n differing ids. For example `/comments/1` and `/comments/2` will be grouped together\n because we know findMany can coalesce them together as `/comments?ids[]=1&ids[]=2`\n It also supports urls where ids are passed as a query param, such as `/comments?id=1`\n but not those where there is more than 1 query param such as `/comments?id=2&name=David`\n Currently only the query param of `id` is supported. If you need to support others, please\n override this or the `_stripIDFromURL` method.\n It does not group records that have differing base urls, such as for example: `/posts/1/comments/2`\n and `/posts/2/comments/3`\n @method groupRecordsForFindMany\n @param {DS.Store} store\n @param {Array} snapshots\n @return {Array} an array of arrays of records, each of which is to be\n loaded separately by `findMany`.\n */\n groupRecordsForFindMany(store, snapshots) {\n var groups = Ember.MapWithDefault.create({ defaultValue() {\n return [];\n } });\n var adapter = this;\n var maxURLLength = this.maxURLLength;\n\n snapshots.forEach(snapshot => {\n var baseUrl = adapter._stripIDFromURL(store, snapshot);\n groups.get(baseUrl).push(snapshot);\n });\n\n function splitGroupToFitInUrl(group, maxURLLength, paramNameLength) {\n var idsSize = 0;\n var baseUrl = adapter._stripIDFromURL(store, group[0]);\n var splitGroups = [[]];\n\n group.forEach(snapshot => {\n var additionalLength = encodeURIComponent(snapshot.id).length + paramNameLength;\n if (baseUrl.length + idsSize + additionalLength >= maxURLLength) {\n idsSize = 0;\n splitGroups.push([]);\n }\n\n idsSize += additionalLength;\n\n var lastGroupIndex = splitGroups.length - 1;\n splitGroups[lastGroupIndex].push(snapshot);\n });\n\n return splitGroups;\n }\n\n var groupsArray = [];\n groups.forEach((group, key) => {\n var paramNameLength = '&ids%5B%5D='.length;\n var splitGroups = splitGroupToFitInUrl(group, maxURLLength, paramNameLength);\n\n splitGroups.forEach(splitGroup => groupsArray.push(splitGroup));\n });\n\n return groupsArray;\n },\n\n /**\n Takes an ajax response, and returns the json payload or an error.\n By default this hook just returns the json payload passed to it.\n You might want to override it in two cases:\n 1. Your API might return useful results in the response headers.\n Response headers are passed in as the second argument.\n 2. Your API might return errors as successful responses with status code\n 200 and an Errors text or object. You can return a `DS.InvalidError` or a\n `DS.AdapterError` (or a sub class) from this hook and it will automatically\n reject the promise and put your record into the invalid or error state.\n Returning a `DS.InvalidError` from this method will cause the\n record to transition into the `invalid` state and make the\n `errors` object available on the record. When returning an\n `DS.InvalidError` the store will attempt to normalize the error data\n returned from the server using the serializer's `extractErrors`\n method.\n @since 1.13.0\n @method handleResponse\n @param {Number} status\n @param {Object} headers\n @param {Object} payload\n @param {Object} requestData - the original request information\n @return {Object | DS.AdapterError} response\n */\n handleResponse(status, headers, payload, requestData) {\n if (this.isSuccess(status, headers, payload)) {\n return payload;\n } else if (this.isInvalid(status, headers, payload)) {\n return new _private.InvalidError(payload.errors);\n }\n\n var errors = this.normalizeErrorResponse(status, headers, payload);\n var detailedMessage = this.generatedDetailedMessage(status, headers, payload, requestData);\n\n switch (status) {\n case 401:\n return new _private.UnauthorizedError(errors, detailedMessage);\n case 403:\n return new _private.ForbiddenError(errors, detailedMessage);\n case 404:\n return new _private.NotFoundError(errors, detailedMessage);\n case 409:\n return new _private.ConflictError(errors, detailedMessage);\n default:\n if (status >= 500) {\n return new _private.ServerError(errors, detailedMessage);\n }\n }\n\n return new _private.AdapterError(errors, detailedMessage);\n },\n\n /**\n Default `handleResponse` implementation uses this hook to decide if the\n response is a success.\n @since 1.13.0\n @method isSuccess\n @param {Number} status\n @param {Object} headers\n @param {Object} payload\n @return {Boolean}\n */\n isSuccess(status, headers, payload) {\n return status >= 200 && status < 300 || status === 304;\n },\n\n /**\n Default `handleResponse` implementation uses this hook to decide if the\n response is an invalid error.\n @since 1.13.0\n @method isInvalid\n @param {Number} status\n @param {Object} headers\n @param {Object} payload\n @return {Boolean}\n */\n isInvalid(status, headers, payload) {\n return status === 422;\n },\n\n /**\n Takes a URL, an HTTP method and a hash of data, and makes an\n HTTP request.\n When the server responds with a payload, Ember Data will call into `extractSingle`\n or `extractArray` (depending on whether the original query was for one record or\n many records).\n By default, `ajax` method has the following behavior:\n * It sets the response `dataType` to `\"json\"`\n * If the HTTP method is not `\"GET\"`, it sets the `Content-Type` to be\n `application/json; charset=utf-8`\n * If the HTTP method is not `\"GET\"`, it stringifies the data passed in. The\n data is the serialized record in the case of a save.\n * Registers success and failure handlers.\n @method ajax\n @private\n @param {String} url\n @param {String} type The request type GET, POST, PUT, DELETE etc.\n @param {Object} options\n @return {Promise} promise\n */\n ajax(url, type, options) {\n var adapter = this;\n\n var requestData = {\n url: url,\n method: type\n };\n\n return new Promise(function (resolve, reject) {\n var hash = adapter.ajaxOptions(url, type, options);\n\n hash.success = function (payload, textStatus, jqXHR) {\n var response = ajaxSuccess(adapter, jqXHR, payload, requestData);\n Ember.run.join(null, resolve, response);\n };\n\n hash.error = function (jqXHR, textStatus, errorThrown) {\n var responseData = {\n textStatus,\n errorThrown\n };\n var error = ajaxError(adapter, jqXHR, requestData, responseData);\n Ember.run.join(null, reject, error);\n };\n\n adapter._ajaxRequest(hash);\n }, 'DS: RESTAdapter#ajax ' + type + ' to ' + url);\n },\n\n /**\n @method _ajaxRequest\n @private\n @param {Object} options jQuery ajax options to be used for the ajax request\n */\n _ajaxRequest(options) {\n Ember.$.ajax(options);\n },\n\n /**\n @method ajaxOptions\n @private\n @param {String} url\n @param {String} type The request type GET, POST, PUT, DELETE etc.\n @param {Object} options\n @return {Object}\n */\n ajaxOptions(url, type, options) {\n var hash = options || {};\n hash.url = url;\n hash.type = type;\n hash.dataType = 'json';\n hash.context = this;\n\n if (hash.data && type !== 'GET') {\n hash.contentType = 'application/json; charset=utf-8';\n hash.data = JSON.stringify(hash.data);\n }\n\n var headers = Ember.get(this, 'headers');\n if (headers !== undefined) {\n hash.beforeSend = function (xhr) {\n Object.keys(headers).forEach(key => xhr.setRequestHeader(key, headers[key]));\n };\n }\n\n return hash;\n },\n\n /**\n @method parseErrorResponse\n @private\n @param {String} responseText\n @return {Object}\n */\n parseErrorResponse(responseText) {\n var json = responseText;\n\n try {\n json = Ember.$.parseJSON(responseText);\n } catch (e) {\n // ignored\n }\n\n return json;\n },\n\n /**\n @method normalizeErrorResponse\n @private\n @param {Number} status\n @param {Object} headers\n @param {Object} payload\n @return {Array} errors payload\n */\n normalizeErrorResponse(status, headers, payload) {\n if (payload && typeof payload === 'object' && payload.errors) {\n return payload.errors;\n } else {\n return [{\n status: `${status}`,\n title: \"The backend responded with an error\",\n detail: `${payload}`\n }];\n }\n },\n\n /**\n Generates a detailed (\"friendly\") error message, with plenty\n of information for debugging (good luck!)\n @method generatedDetailedMessage\n @private\n @param {Number} status\n @param {Object} headers\n @param {Object} payload\n @param {Object} requestData\n @return {String} detailed error message\n */\n generatedDetailedMessage: function (status, headers, payload, requestData) {\n var shortenedPayload = void 0;\n var payloadContentType = headers[\"Content-Type\"] || \"Empty Content-Type\";\n\n if (payloadContentType === \"text/html\" && payload.length > 250) {\n shortenedPayload = \"[Omitted Lengthy HTML]\";\n } else {\n shortenedPayload = payload;\n }\n\n var requestDescription = requestData.method + ' ' + requestData.url;\n var payloadDescription = 'Payload (' + payloadContentType + ')';\n\n return ['Ember Data Request ' + requestDescription + ' returned a ' + status, payloadDescription, shortenedPayload].join('\\n');\n },\n\n // @since 2.5.0\n buildQuery(snapshot) {\n var query = {};\n\n if (snapshot) {\n var { include } = snapshot;\n\n if (include) {\n query.include = include;\n }\n }\n\n return query;\n },\n\n _hasCustomizedAjax() {\n if (this.ajax !== RESTAdapter.prototype.ajax) {\n (true && !(false) && Ember.deprecate('RESTAdapter#ajax has been deprecated please use. `methodForRequest`, `urlForRequest`, `headersForRequest` or `dataForRequest` instead.', false, {\n id: 'ds.rest-adapter.ajax',\n until: '3.0.0'\n }));\n\n return true;\n }\n\n if (this.ajaxOptions !== RESTAdapter.prototype.ajaxOptions) {\n (true && !(false) && Ember.deprecate('RESTAdapter#ajaxOptions has been deprecated please use. `methodForRequest`, `urlForRequest`, `headersForRequest` or `dataForRequest` instead.', false, {\n id: 'ds.rest-adapter.ajax-options',\n until: '3.0.0'\n }));\n\n return true;\n }\n\n return false;\n }\n });\n\n if ((0, _private.isEnabled)('ds-improved-ajax')) {\n\n RESTAdapter.reopen({\n\n /*\n * Get the data (body or query params) for a request.\n *\n * @public\n * @method dataForRequest\n * @param {Object} params\n * @return {Object} data\n */\n dataForRequest(params) {\n var { store, type, snapshot, requestType, query } = params;\n\n // type is not passed to findBelongsTo and findHasMany\n type = type || snapshot && snapshot.type;\n\n var serializer = store.serializerFor(type.modelName);\n var data = {};\n\n switch (requestType) {\n case 'createRecord':\n serializer.serializeIntoHash(data, type, snapshot, { includeId: true });\n break;\n\n case 'updateRecord':\n serializer.serializeIntoHash(data, type, snapshot);\n break;\n\n case 'findRecord':\n data = this.buildQuery(snapshot);\n break;\n\n case 'findAll':\n if (params.sinceToken) {\n query = query || {};\n query.since = params.sinceToken;\n }\n data = query;\n break;\n\n case 'query':\n case 'queryRecord':\n if (this.sortQueryParams) {\n query = this.sortQueryParams(query);\n }\n data = query;\n break;\n\n case 'findMany':\n data = { ids: params.ids };\n break;\n\n default:\n data = undefined;\n break;\n }\n\n return data;\n },\n\n /*\n * Get the HTTP method for a request.\n *\n * @public\n * @method methodForRequest\n * @param {Object} params\n * @return {String} HTTP method\n */\n methodForRequest(params) {\n var { requestType } = params;\n\n switch (requestType) {\n case 'createRecord':\n return 'POST';\n case 'updateRecord':\n return 'PUT';\n case 'deleteRecord':\n return 'DELETE';\n }\n\n return 'GET';\n },\n\n /*\n * Get the URL for a request.\n *\n * @public\n * @method urlForRequest\n * @param {Object} params\n * @return {String} URL\n */\n urlForRequest(params) {\n var { type, id, ids, snapshot, snapshots, requestType, query } = params;\n\n // type and id are not passed from updateRecord and deleteRecord, hence they\n // are defined if not set\n type = type || snapshot && snapshot.type;\n id = id || snapshot && snapshot.id;\n\n switch (requestType) {\n case 'findAll':\n return this.buildURL(type.modelName, null, snapshots, requestType);\n\n case 'query':\n case 'queryRecord':\n return this.buildURL(type.modelName, null, null, requestType, query);\n\n case 'findMany':\n return this.buildURL(type.modelName, ids, snapshots, requestType);\n\n case 'findHasMany':\n case 'findBelongsTo':\n {\n var url = this.buildURL(type.modelName, id, snapshot, requestType);\n return this.urlPrefix(params.url, url);\n }\n }\n\n return this.buildURL(type.modelName, id, snapshot, requestType, query);\n },\n\n /*\n * Get the headers for a request.\n *\n * By default the value of the `headers` property of the adapter is\n * returned.\n *\n * @public\n * @method headersForRequest\n * @param {Object} params\n * @return {Object} headers\n */\n headersForRequest(params) {\n return this.get('headers');\n },\n\n /*\n * Get an object which contains all properties for a request which should\n * be made.\n *\n * @private\n * @method _requestFor\n * @param {Object} params\n * @return {Object} request object\n */\n _requestFor(params) {\n var method = this.methodForRequest(params);\n var url = this.urlForRequest(params);\n var headers = this.headersForRequest(params);\n var data = this.dataForRequest(params);\n\n return { method, url, headers, data };\n },\n\n /*\n * Convert a request object into a hash which can be passed to `jQuery.ajax`.\n *\n * @private\n * @method _requestToJQueryAjaxHash\n * @param {Object} request\n * @return {Object} jQuery ajax hash\n */\n _requestToJQueryAjaxHash(request) {\n var hash = {};\n\n hash.type = request.method;\n hash.url = request.url;\n hash.dataType = 'json';\n hash.context = this;\n\n if (request.data) {\n if (request.method !== 'GET') {\n hash.contentType = 'application/json; charset=utf-8';\n hash.data = JSON.stringify(request.data);\n } else {\n hash.data = request.data;\n }\n }\n\n var headers = request.headers;\n if (headers !== undefined) {\n hash.beforeSend = function (xhr) {\n Object.keys(headers).forEach(key => xhr.setRequestHeader(key, headers[key]));\n };\n }\n\n return hash;\n },\n\n /*\n * Make a request using `jQuery.ajax`.\n *\n * @private\n * @method _makeRequest\n * @param {Object} request\n * @return {Promise} promise\n */\n _makeRequest(request) {\n var adapter = this;\n var hash = this._requestToJQueryAjaxHash(request);\n\n var { method, url } = request;\n var requestData = { method, url };\n\n return new Promise((resolve, reject) => {\n\n hash.success = function (payload, textStatus, jqXHR) {\n var response = ajaxSuccess(adapter, jqXHR, payload, requestData);\n Ember.run.join(null, resolve, response);\n };\n\n hash.error = function (jqXHR, textStatus, errorThrown) {\n var responseData = {\n textStatus,\n errorThrown\n };\n var error = ajaxError(adapter, jqXHR, requestData, responseData);\n Ember.run.join(null, reject, error);\n };\n\n adapter._ajaxRequest(hash);\n }, `DS: RESTAdapter#makeRequest: ${method} ${url}`);\n }\n });\n }\n\n function ajaxSuccess(adapter, jqXHR, payload, requestData) {\n var response = void 0;\n try {\n response = adapter.handleResponse(jqXHR.status, (0, _private.parseResponseHeaders)(jqXHR.getAllResponseHeaders()), payload, requestData);\n } catch (error) {\n return Promise.reject(error);\n }\n\n if (response && response.isAdapterError) {\n return Promise.reject(response);\n } else {\n return response;\n }\n }\n\n function ajaxError(adapter, jqXHR, requestData, responseData) {\n if (true) {\n var message = `The server returned an empty string for ${requestData.method} ${requestData.url}, which cannot be parsed into a valid JSON. Return either null or {}.`;\n var validJSONString = !(responseData.textStatus === \"parsererror\" && jqXHR.responseText === \"\");\n (true && Ember.warn(message, validJSONString, {\n id: 'ds.adapter.returned-empty-string-as-JSON'\n }));\n }\n\n var error = void 0;\n\n if (responseData.errorThrown instanceof Error) {\n error = responseData.errorThrown;\n } else if (responseData.textStatus === 'timeout') {\n error = new _private.TimeoutError();\n } else if (responseData.textStatus === 'abort' || jqXHR.status === 0) {\n error = new _private.AbortError();\n } else {\n try {\n error = adapter.handleResponse(jqXHR.status, (0, _private.parseResponseHeaders)(jqXHR.getAllResponseHeaders()), adapter.parseErrorResponse(jqXHR.responseText) || responseData.errorThrown, requestData);\n } catch (e) {\n error = e;\n }\n }\n\n return error;\n }\n\n //From http://stackoverflow.com/questions/280634/endswith-in-javascript\n function endsWith(string, suffix) {\n if (typeof String.prototype.endsWith !== 'function') {\n return string.indexOf(suffix, string.length - suffix.length) !== -1;\n } else {\n return string.endsWith(suffix);\n }\n }\n\n exports.default = RESTAdapter;\n});","define('ember-data/attr', ['exports'], function (exports) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = attr;\n\n\n /**\n @module ember-data\n */\n\n function getDefaultValue(record, options, key) {\n if (typeof options.defaultValue === 'function') {\n return options.defaultValue.apply(null, arguments);\n } else {\n var defaultValue = options.defaultValue;\n (true && !(typeof defaultValue !== 'object' || defaultValue === null) && Ember.assert(`Non primitive defaultValues are not supported because they are shared between all instances. If you would like to use a complex object as a default value please provide a function that returns the complex object.`, typeof defaultValue !== 'object' || defaultValue === null));\n\n return defaultValue;\n }\n }\n\n function hasValue(record, key) {\n return key in record._attributes || key in record._inFlightAttributes || key in record._data;\n }\n\n function getValue(record, key) {\n if (key in record._attributes) {\n return record._attributes[key];\n } else if (key in record._inFlightAttributes) {\n return record._inFlightAttributes[key];\n } else {\n return record._data[key];\n }\n }\n\n /**\n `DS.attr` defines an attribute on a [DS.Model](/api/data/classes/DS.Model.html).\n By default, attributes are passed through as-is, however you can specify an\n optional type to have the value automatically transformed.\n Ember Data ships with four basic transform types: `string`, `number`,\n `boolean` and `date`. You can define your own transforms by subclassing\n [DS.Transform](/api/data/classes/DS.Transform.html).\n \n Note that you cannot use `attr` to define an attribute of `id`.\n \n `DS.attr` takes an optional hash as a second parameter, currently\n supported options are:\n \n - `defaultValue`: Pass a string or a function to be called to set the attribute\n to a default value if none is supplied.\n \n Example\n \n ```app/models/user.js\n import DS from 'ember-data';\n \n export default DS.Model.extend({\n username: DS.attr('string'),\n email: DS.attr('string'),\n verified: DS.attr('boolean', { defaultValue: false })\n });\n ```\n \n Default value can also be a function. This is useful it you want to return\n a new object for each attribute.\n \n ```app/models/user.js\n import DS from 'ember-data';\n \n export default DS.Model.extend({\n username: DS.attr('string'),\n email: DS.attr('string'),\n settings: DS.attr({\n defaultValue() {\n return {};\n }\n })\n });\n ```\n \n The `options` hash is passed as second argument to a transforms'\n `serialize` and `deserialize` method. This allows to configure a\n transformation and adapt the corresponding value, based on the config:\n \n ```app/models/post.js\n import DS from 'ember-data';\n \n export default DS.Model.extend({\n text: DS.attr('text', {\n uppercase: true\n })\n });\n ```\n \n ```app/transforms/text.js\n import DS from 'ember-data';\n \n export default DS.Transform.extend({\n serialize(value, options) {\n if (options.uppercase) {\n return value.toUpperCase();\n }\n \n return value;\n },\n \n deserialize(value) {\n return value;\n }\n })\n ```\n \n @namespace\n @method attr\n @for DS\n @param {String|Object} type the attribute type\n @param {Object} options a hash of options\n @return {Attribute}\n */\n\n function attr(type, options) {\n if (typeof type === 'object') {\n options = type;\n type = undefined;\n } else {\n options = options || {};\n }\n\n var meta = {\n type: type,\n isAttribute: true,\n options: options\n };\n\n return Ember.computed({\n get(key) {\n var internalModel = this._internalModel;\n if (hasValue(internalModel, key)) {\n return getValue(internalModel, key);\n } else {\n return getDefaultValue(this, options, key);\n }\n },\n set(key, value) {\n var internalModel = this._internalModel;\n var oldValue = getValue(internalModel, key);\n var originalValue = void 0;\n\n if (value !== oldValue) {\n // Add the new value to the changed attributes hash; it will get deleted by\n // the 'didSetProperty' handler if it is no different from the original value\n internalModel._attributes[key] = value;\n\n if (key in internalModel._inFlightAttributes) {\n originalValue = internalModel._inFlightAttributes[key];\n } else {\n originalValue = internalModel._data[key];\n }\n\n this._internalModel.send('didSetProperty', {\n name: key,\n oldValue: oldValue,\n originalValue: originalValue,\n value: value\n });\n }\n\n return value;\n }\n }).meta(meta);\n }\n});","define(\"ember-data/index\", [\"exports\", \"ember-data/-private\", \"ember-data/setup-container\", \"ember-data/initialize-store-service\", \"ember-data/transforms/transform\", \"ember-data/transforms/number\", \"ember-data/transforms/date\", \"ember-data/transforms/string\", \"ember-data/transforms/boolean\", \"ember-data/adapter\", \"ember-data/adapters/json-api\", \"ember-data/adapters/rest\", \"ember-data/serializer\", \"ember-data/serializers/json-api\", \"ember-data/serializers/json\", \"ember-data/serializers/rest\", \"ember-data/serializers/embedded-records-mixin\", \"ember-data/attr\", \"ember-inflector\"], function (exports, _private, _setupContainer, _initializeStoreService, _transform, _number, _date, _string, _boolean, _adapter, _jsonApi, _rest, _serializer, _jsonApi2, _json, _rest2, _embeddedRecordsMixin, _attr) {\n \"use strict\";\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n\n /**\n Ember Data\n @module ember-data\n @main ember-data\n */\n\n if (Ember.VERSION.match(/^1\\.([0-9]|1[0-2])\\./)) {\n throw new Ember.Error(\"Ember Data requires at least Ember 1.13.0, but you have \" + Ember.VERSION + \". Please upgrade your version of Ember, then upgrade Ember Data.\");\n }\n\n _private.DS.Store = _private.Store;\n _private.DS.PromiseArray = _private.PromiseArray;\n _private.DS.PromiseObject = _private.PromiseObject;\n\n _private.DS.PromiseManyArray = _private.PromiseManyArray;\n\n _private.DS.Model = _private.Model;\n _private.DS.RootState = _private.RootState;\n _private.DS.attr = _attr.default;\n _private.DS.Errors = _private.Errors;\n\n _private.DS.InternalModel = _private.InternalModel;\n _private.DS.Snapshot = _private.Snapshot;\n\n _private.DS.Adapter = _adapter.default;\n\n _private.DS.AdapterError = _private.AdapterError;\n _private.DS.InvalidError = _private.InvalidError;\n _private.DS.TimeoutError = _private.TimeoutError;\n _private.DS.AbortError = _private.AbortError;\n\n _private.DS.UnauthorizedError = _private.UnauthorizedError;\n _private.DS.ForbiddenError = _private.ForbiddenError;\n _private.DS.NotFoundError = _private.NotFoundError;\n _private.DS.ConflictError = _private.ConflictError;\n _private.DS.ServerError = _private.ServerError;\n\n _private.DS.errorsHashToArray = _private.errorsHashToArray;\n _private.DS.errorsArrayToHash = _private.errorsArrayToHash;\n\n _private.DS.Serializer = _serializer.default;\n\n _private.DS.DebugAdapter = _private.DebugAdapter;\n\n _private.DS.RecordArray = _private.RecordArray;\n _private.DS.FilteredRecordArray = _private.FilteredRecordArray;\n _private.DS.AdapterPopulatedRecordArray = _private.AdapterPopulatedRecordArray;\n _private.DS.ManyArray = _private.ManyArray;\n\n _private.DS.RecordArrayManager = _private.RecordArrayManager;\n\n _private.DS.RESTAdapter = _rest.default;\n _private.DS.BuildURLMixin = _private.BuildURLMixin;\n\n _private.DS.RESTSerializer = _rest2.default;\n _private.DS.JSONSerializer = _json.default;\n\n _private.DS.JSONAPIAdapter = _jsonApi.default;\n _private.DS.JSONAPISerializer = _jsonApi2.default;\n\n _private.DS.Transform = _transform.default;\n _private.DS.DateTransform = _date.default;\n _private.DS.StringTransform = _string.default;\n _private.DS.NumberTransform = _number.default;\n _private.DS.BooleanTransform = _boolean.default;\n\n _private.DS.EmbeddedRecordsMixin = _embeddedRecordsMixin.default;\n\n _private.DS.belongsTo = _private.belongsTo;\n _private.DS.hasMany = _private.hasMany;\n\n _private.DS.Relationship = _private.Relationship;\n\n _private.DS._setupContainer = _setupContainer.default;\n _private.DS._initializeStoreService = _initializeStoreService.default;\n\n Object.defineProperty(_private.DS, 'normalizeModelName', {\n enumerable: true,\n writable: false,\n configurable: false,\n value: _private.normalizeModelName\n });\n\n exports.default = _private.DS;\n});","define('ember-data/initialize-store-service', ['exports'], function (exports) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = initializeStoreService;\n /*\n Configures a registry for use with an Ember-Data\n store.\n \n @method initializeStoreService\n @param {Ember.ApplicationInstance | Ember.EngineInstance} instance\n */\n function initializeStoreService(instance) {\n // instance.lookup supports Ember 2.1 and higher\n // instance.container supports Ember 1.11 - 2.0\n var container = instance.lookup ? instance : instance.container;\n\n // Eagerly generate the store so defaultStore is populated.\n container.lookup('service:store');\n }\n});","define('ember-data/model', ['exports', 'ember-data/-private'], function (exports, _private) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n Object.defineProperty(exports, 'default', {\n enumerable: true,\n get: function () {\n return _private.Model;\n }\n });\n});","define('ember-data/relationships', ['exports', 'ember-data/-private'], function (exports, _private) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n Object.defineProperty(exports, 'belongsTo', {\n enumerable: true,\n get: function () {\n return _private.belongsTo;\n }\n });\n Object.defineProperty(exports, 'hasMany', {\n enumerable: true,\n get: function () {\n return _private.hasMany;\n }\n });\n});","define('ember-data/serializer', ['exports'], function (exports) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = Ember.Object.extend({\n\n /**\n The `store` property is the application's `store` that contains\n all records. It can be used to look up serializers for other model\n types that may be nested inside the payload response.\n Example:\n ```js\n Serializer.extend({\n extractRelationship(relationshipModelName, relationshipHash) {\n var modelClass = this.store.modelFor(relationshipModelName);\n var relationshipSerializer = this.store.serializerFor(relationshipModelName);\n return relationshipSerializer.normalize(modelClass, relationshipHash);\n }\n });\n ```\n @property store\n @type {DS.Store}\n @public\n */\n\n /**\n The `normalizeResponse` method is used to normalize a payload from the\n server to a JSON-API Document.\n http://jsonapi.org/format/#document-structure\n Example:\n ```js\n Serializer.extend({\n normalizeResponse(store, primaryModelClass, payload, id, requestType) {\n if (requestType === 'findRecord') {\n return this.normalize(primaryModelClass, payload);\n } else {\n return payload.reduce(function(documentHash, item) {\n let { data, included } = this.normalize(primaryModelClass, item);\n documentHash.included.push(...included);\n documentHash.data.push(data);\n return documentHash;\n }, { data: [], included: [] })\n }\n }\n });\n ```\n @since 1.13.0\n @method normalizeResponse\n @param {DS.Store} store\n @param {DS.Model} primaryModelClass\n @param {Object} payload\n @param {String|Number} id\n @param {String} requestType\n @return {Object} JSON-API Document\n */\n normalizeResponse: null,\n\n /**\n The `serialize` method is used when a record is saved in order to convert\n the record into the form that your external data source expects.\n `serialize` takes an optional `options` hash with a single option:\n - `includeId`: If this is `true`, `serialize` should include the ID\n in the serialized object it builds.\n Example:\n ```js\n Serializer.extend({\n serialize(snapshot, options) {\n var json = {\n id: snapshot.id\n };\n snapshot.eachAttribute((key, attribute) => {\n json[key] = snapshot.attr(key);\n });\n snapshot.eachRelationship((key, relationship) => {\n if (relationship.kind === 'belongsTo') {\n json[key] = snapshot.belongsTo(key, { id: true });\n } else if (relationship.kind === 'hasMany') {\n json[key] = snapshot.hasMany(key, { ids: true });\n }\n });\n return json;\n },\n });\n ```\n @method serialize\n @param {DS.Snapshot} snapshot\n @param {Object} [options]\n @return {Object}\n */\n serialize: null,\n\n /**\n The `normalize` method is used to convert a payload received from your\n external data source into the normalized form `store.push()` expects. You\n should override this method, munge the hash and return the normalized\n payload.\n Example:\n ```js\n Serializer.extend({\n normalize(modelClass, resourceHash) {\n var data = {\n id: resourceHash.id,\n type: modelClass.modelName,\n attributes: resourceHash\n };\n return { data: data };\n }\n })\n ```\n @method normalize\n @param {DS.Model} typeClass\n @param {Object} hash\n @return {Object}\n */\n normalize(typeClass, hash) {\n return hash;\n }\n\n });\n});","define('ember-data/serializers/embedded-records-mixin', ['exports'], function (exports) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = Ember.Mixin.create({\n\n /**\n Normalize the record and recursively normalize/extract all the embedded records\n while pushing them into the store as they are encountered\n A payload with an attr configured for embedded records needs to be extracted:\n ```js\n {\n \"post\": {\n \"id\": \"1\"\n \"title\": \"Rails is omakase\",\n \"comments\": [{\n \"id\": \"1\",\n \"body\": \"Rails is unagi\"\n }, {\n \"id\": \"2\",\n \"body\": \"Omakase O_o\"\n }]\n }\n }\n ```\n @method normalize\n @param {DS.Model} typeClass\n @param {Object} hash to be normalized\n @param {String} prop the hash has been referenced by\n @return {Object} the normalized hash\n **/\n normalize(typeClass, hash, prop) {\n var normalizedHash = this._super(typeClass, hash, prop);\n return this._extractEmbeddedRecords(this, this.store, typeClass, normalizedHash);\n },\n\n keyForRelationship(key, typeClass, method) {\n if (method === 'serialize' && this.hasSerializeRecordsOption(key) || method === 'deserialize' && this.hasDeserializeRecordsOption(key)) {\n return this.keyForAttribute(key, method);\n } else {\n return this._super(key, typeClass, method) || key;\n }\n },\n\n /**\n Serialize `belongsTo` relationship when it is configured as an embedded object.\n This example of an author model belongs to a post model:\n ```js\n Post = DS.Model.extend({\n title: DS.attr('string'),\n body: DS.attr('string'),\n author: DS.belongsTo('author')\n });\n Author = DS.Model.extend({\n name: DS.attr('string'),\n post: DS.belongsTo('post')\n });\n ```\n Use a custom (type) serializer for the post model to configure embedded author\n ```app/serializers/post.js\n import DS from 'ember-data';\n export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {\n attrs: {\n author: { embedded: 'always' }\n }\n })\n ```\n A payload with an attribute configured for embedded records can serialize\n the records together under the root attribute's payload:\n ```js\n {\n \"post\": {\n \"id\": \"1\"\n \"title\": \"Rails is omakase\",\n \"author\": {\n \"id\": \"2\"\n \"name\": \"dhh\"\n }\n }\n }\n ```\n @method serializeBelongsTo\n @param {DS.Snapshot} snapshot\n @param {Object} json\n @param {Object} relationship\n */\n serializeBelongsTo(snapshot, json, relationship) {\n var attr = relationship.key;\n if (this.noSerializeOptionSpecified(attr)) {\n this._super(snapshot, json, relationship);\n return;\n }\n var includeIds = this.hasSerializeIdsOption(attr);\n var includeRecords = this.hasSerializeRecordsOption(attr);\n var embeddedSnapshot = snapshot.belongsTo(attr);\n if (includeIds) {\n var serializedKey = this._getMappedKey(relationship.key, snapshot.type);\n if (serializedKey === relationship.key && this.keyForRelationship) {\n serializedKey = this.keyForRelationship(relationship.key, relationship.kind, \"serialize\");\n }\n\n if (!embeddedSnapshot) {\n json[serializedKey] = null;\n } else {\n json[serializedKey] = embeddedSnapshot.id;\n\n if (relationship.options.polymorphic) {\n this.serializePolymorphicType(snapshot, json, relationship);\n }\n }\n } else if (includeRecords) {\n this._serializeEmbeddedBelongsTo(snapshot, json, relationship);\n }\n },\n\n _serializeEmbeddedBelongsTo(snapshot, json, relationship) {\n var embeddedSnapshot = snapshot.belongsTo(relationship.key);\n var serializedKey = this._getMappedKey(relationship.key, snapshot.type);\n if (serializedKey === relationship.key && this.keyForRelationship) {\n serializedKey = this.keyForRelationship(relationship.key, relationship.kind, \"serialize\");\n }\n\n if (!embeddedSnapshot) {\n json[serializedKey] = null;\n } else {\n json[serializedKey] = embeddedSnapshot.serialize({ includeId: true });\n this.removeEmbeddedForeignKey(snapshot, embeddedSnapshot, relationship, json[serializedKey]);\n\n if (relationship.options.polymorphic) {\n this.serializePolymorphicType(snapshot, json, relationship);\n }\n }\n },\n\n /**\n Serializes `hasMany` relationships when it is configured as embedded objects.\n This example of a post model has many comments:\n ```js\n Post = DS.Model.extend({\n title: DS.attr('string'),\n body: DS.attr('string'),\n comments: DS.hasMany('comment')\n });\n Comment = DS.Model.extend({\n body: DS.attr('string'),\n post: DS.belongsTo('post')\n });\n ```\n Use a custom (type) serializer for the post model to configure embedded comments\n ```app/serializers/post.js\n import DS from 'ember-data;\n export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {\n attrs: {\n comments: { embedded: 'always' }\n }\n })\n ```\n A payload with an attribute configured for embedded records can serialize\n the records together under the root attribute's payload:\n ```js\n {\n \"post\": {\n \"id\": \"1\"\n \"title\": \"Rails is omakase\",\n \"body\": \"I want this for my ORM, I want that for my template language...\"\n \"comments\": [{\n \"id\": \"1\",\n \"body\": \"Rails is unagi\"\n }, {\n \"id\": \"2\",\n \"body\": \"Omakase O_o\"\n }]\n }\n }\n ```\n The attrs options object can use more specific instruction for extracting and\n serializing. When serializing, an option to embed `ids`, `ids-and-types` or `records` can be set.\n When extracting the only option is `records`.\n So `{ embedded: 'always' }` is shorthand for:\n `{ serialize: 'records', deserialize: 'records' }`\n To embed the `ids` for a related object (using a hasMany relationship):\n ```app/serializers/post.js\n import DS from 'ember-data;\n export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {\n attrs: {\n comments: { serialize: 'ids', deserialize: 'records' }\n }\n })\n ```\n ```js\n {\n \"post\": {\n \"id\": \"1\"\n \"title\": \"Rails is omakase\",\n \"body\": \"I want this for my ORM, I want that for my template language...\"\n \"comments\": [\"1\", \"2\"]\n }\n }\n ```\n To embed the relationship as a collection of objects with `id` and `type` keys, set\n `ids-and-types` for the related object.\n This is particularly useful for polymorphic relationships where records don't share\n the same table and the `id` is not enough information.\n By example having a user that has many pets:\n ```js\n User = DS.Model.extend({\n name: DS.attr('string'),\n pets: DS.hasMany('pet', { polymorphic: true })\n });\n Pet = DS.Model.extend({\n name: DS.attr('string'),\n });\n Cat = Pet.extend({\n // ...\n });\n Parrot = Pet.extend({\n // ...\n });\n ```\n ```app/serializers/user.js\n import DS from 'ember-data;\n export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {\n attrs: {\n pets: { serialize: 'ids-and-types', deserialize: 'records' }\n }\n });\n ```\n ```js\n {\n \"user\": {\n \"id\": \"1\"\n \"name\": \"Bertin Osborne\",\n \"pets\": [\n { \"id\": \"1\", \"type\": \"Cat\" },\n { \"id\": \"1\", \"type\": \"Parrot\"}\n ]\n }\n }\n ```\n @method serializeHasMany\n @param {DS.Snapshot} snapshot\n @param {Object} json\n @param {Object} relationship\n */\n serializeHasMany(snapshot, json, relationship) {\n var attr = relationship.key;\n if (this.noSerializeOptionSpecified(attr)) {\n this._super(snapshot, json, relationship);\n return;\n }\n\n if (this.hasSerializeIdsOption(attr)) {\n var serializedKey = this._getMappedKey(relationship.key, snapshot.type);\n if (serializedKey === relationship.key && this.keyForRelationship) {\n serializedKey = this.keyForRelationship(relationship.key, relationship.kind, \"serialize\");\n }\n\n json[serializedKey] = snapshot.hasMany(attr, { ids: true });\n } else if (this.hasSerializeRecordsOption(attr)) {\n this._serializeEmbeddedHasMany(snapshot, json, relationship);\n } else {\n if (this.hasSerializeIdsAndTypesOption(attr)) {\n this._serializeHasManyAsIdsAndTypes(snapshot, json, relationship);\n }\n }\n },\n\n /*\n Serializes a hasMany relationship as an array of objects containing only `id` and `type`\n keys.\n This has its use case on polymorphic hasMany relationships where the server is not storing\n all records in the same table using STI, and therefore the `id` is not enough information\n TODO: Make the default in Ember-data 3.0??\n */\n _serializeHasManyAsIdsAndTypes(snapshot, json, relationship) {\n var serializedKey = this.keyForAttribute(relationship.key, 'serialize');\n var hasMany = snapshot.hasMany(relationship.key);\n\n json[serializedKey] = Ember.A(hasMany).map(function (recordSnapshot) {\n //\n // I'm sure I'm being utterly naive here. Propably id is a configurate property and\n // type too, and the modelName has to be normalized somehow.\n //\n return { id: recordSnapshot.id, type: recordSnapshot.modelName };\n });\n },\n\n _serializeEmbeddedHasMany(snapshot, json, relationship) {\n var serializedKey = this._getMappedKey(relationship.key, snapshot.type);\n if (serializedKey === relationship.key && this.keyForRelationship) {\n serializedKey = this.keyForRelationship(relationship.key, relationship.kind, \"serialize\");\n }\n\n (true && Ember.warn(`The embedded relationship '${serializedKey}' is undefined for '${snapshot.modelName}' with id '${snapshot.id}'. Please include it in your original payload.`, Ember.typeOf(snapshot.hasMany(relationship.key)) !== 'undefined', { id: 'ds.serializer.embedded-relationship-undefined' }));\n\n\n json[serializedKey] = this._generateSerializedHasMany(snapshot, relationship);\n },\n\n /*\n Returns an array of embedded records serialized to JSON\n */\n _generateSerializedHasMany(snapshot, relationship) {\n var hasMany = snapshot.hasMany(relationship.key);\n var manyArray = Ember.A(hasMany);\n var ret = new Array(manyArray.length);\n\n for (var i = 0; i < manyArray.length; i++) {\n var embeddedSnapshot = manyArray[i];\n var embeddedJson = embeddedSnapshot.serialize({ includeId: true });\n this.removeEmbeddedForeignKey(snapshot, embeddedSnapshot, relationship, embeddedJson);\n ret[i] = embeddedJson;\n }\n\n return ret;\n },\n\n /**\n When serializing an embedded record, modify the property (in the json payload)\n that refers to the parent record (foreign key for relationship).\n Serializing a `belongsTo` relationship removes the property that refers to the\n parent record\n Serializing a `hasMany` relationship does not remove the property that refers to\n the parent record.\n @method removeEmbeddedForeignKey\n @param {DS.Snapshot} snapshot\n @param {DS.Snapshot} embeddedSnapshot\n @param {Object} relationship\n @param {Object} json\n */\n removeEmbeddedForeignKey(snapshot, embeddedSnapshot, relationship, json) {\n if (relationship.kind === 'belongsTo') {\n var parentRecord = snapshot.type.inverseFor(relationship.key, this.store);\n if (parentRecord) {\n var name = parentRecord.name;\n var embeddedSerializer = this.store.serializerFor(embeddedSnapshot.modelName);\n var parentKey = embeddedSerializer.keyForRelationship(name, parentRecord.kind, 'deserialize');\n if (parentKey) {\n delete json[parentKey];\n }\n }\n } /*else if (relationship.kind === 'hasMany') {\n return;\n }*/\n },\n\n // checks config for attrs option to embedded (always) - serialize and deserialize\n hasEmbeddedAlwaysOption(attr) {\n var option = this.attrsOption(attr);\n return option && option.embedded === 'always';\n },\n\n // checks config for attrs option to serialize ids\n hasSerializeRecordsOption(attr) {\n var alwaysEmbed = this.hasEmbeddedAlwaysOption(attr);\n var option = this.attrsOption(attr);\n return alwaysEmbed || option && option.serialize === 'records';\n },\n\n // checks config for attrs option to serialize records\n hasSerializeIdsOption(attr) {\n var option = this.attrsOption(attr);\n return option && (option.serialize === 'ids' || option.serialize === 'id');\n },\n\n // checks config for attrs option to serialize records as objects containing id and types\n hasSerializeIdsAndTypesOption(attr) {\n var option = this.attrsOption(attr);\n return option && (option.serialize === 'ids-and-types' || option.serialize === 'id-and-type');\n },\n\n // checks config for attrs option to serialize records\n noSerializeOptionSpecified(attr) {\n var option = this.attrsOption(attr);\n return !(option && (option.serialize || option.embedded));\n },\n\n // checks config for attrs option to deserialize records\n // a defined option object for a resource is treated the same as\n // `deserialize: 'records'`\n hasDeserializeRecordsOption(attr) {\n var alwaysEmbed = this.hasEmbeddedAlwaysOption(attr);\n var option = this.attrsOption(attr);\n return alwaysEmbed || option && option.deserialize === 'records';\n },\n\n attrsOption(attr) {\n var attrs = this.get('attrs');\n return attrs && (attrs[Ember.String.camelize(attr)] || attrs[attr]);\n },\n\n /**\n @method _extractEmbeddedRecords\n @private\n */\n _extractEmbeddedRecords(serializer, store, typeClass, partial) {\n typeClass.eachRelationship((key, relationship) => {\n if (serializer.hasDeserializeRecordsOption(key)) {\n if (relationship.kind === \"hasMany\") {\n this._extractEmbeddedHasMany(store, key, partial, relationship);\n }\n if (relationship.kind === \"belongsTo\") {\n this._extractEmbeddedBelongsTo(store, key, partial, relationship);\n }\n }\n });\n return partial;\n },\n\n /**\n @method _extractEmbeddedHasMany\n @private\n */\n _extractEmbeddedHasMany(store, key, hash, relationshipMeta) {\n var relationshipHash = Ember.get(hash, `data.relationships.${key}.data`);\n\n if (!relationshipHash) {\n return;\n }\n\n var hasMany = new Array(relationshipHash.length);\n\n for (var i = 0; i < relationshipHash.length; i++) {\n var item = relationshipHash[i];\n var { data, included } = this._normalizeEmbeddedRelationship(store, relationshipMeta, item);\n hash.included = hash.included || [];\n hash.included.push(data);\n if (included) {\n hash.included.push(...included);\n }\n\n hasMany[i] = { id: data.id, type: data.type };\n }\n\n var relationship = { data: hasMany };\n Ember.set(hash, `data.relationships.${key}`, relationship);\n },\n\n /**\n @method _extractEmbeddedBelongsTo\n @private\n */\n _extractEmbeddedBelongsTo(store, key, hash, relationshipMeta) {\n var relationshipHash = Ember.get(hash, `data.relationships.${key}.data`);\n if (!relationshipHash) {\n return;\n }\n\n var { data, included } = this._normalizeEmbeddedRelationship(store, relationshipMeta, relationshipHash);\n hash.included = hash.included || [];\n hash.included.push(data);\n if (included) {\n hash.included.push(...included);\n }\n\n var belongsTo = { id: data.id, type: data.type };\n var relationship = { data: belongsTo };\n\n Ember.set(hash, `data.relationships.${key}`, relationship);\n },\n\n /**\n @method _normalizeEmbeddedRelationship\n @private\n */\n _normalizeEmbeddedRelationship(store, relationshipMeta, relationshipHash) {\n var modelName = relationshipMeta.type;\n if (relationshipMeta.options.polymorphic) {\n modelName = relationshipHash.type;\n }\n var modelClass = store.modelFor(modelName);\n var serializer = store.serializerFor(modelName);\n\n return serializer.normalize(modelClass, relationshipHash, null);\n },\n isEmbeddedRecordsMixin: true\n });\n});","define('ember-data/serializers/json-api', ['exports', 'ember-inflector', 'ember-data/serializers/json', 'ember-data/-private'], function (exports, _emberInflector, _json, _private) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n\n /**\n Ember Data 2.0 Serializer:\n \n In Ember Data a Serializer is used to serialize and deserialize\n records when they are transferred in and out of an external source.\n This process involves normalizing property names, transforming\n attribute values and serializing relationships.\n \n `JSONAPISerializer` supports the http://jsonapi.org/ spec and is the\n serializer recommended by Ember Data.\n \n This serializer normalizes a JSON API payload that looks like:\n \n ```app/models/player.js\n import DS from 'ember-data';\n \n export default DS.Model.extend({\n name: DS.attr('string'),\n skill: DS.attr('string'),\n gamesPlayed: DS.attr('number'),\n club: DS.belongsTo('club')\n });\n ```\n \n ```app/models/club.js\n import DS from 'ember-data';\n \n export default DS.Model.extend({\n name: DS.attr('string'),\n location: DS.attr('string'),\n players: DS.hasMany('player')\n });\n ```\n \n ```js\n {\n \"data\": [\n {\n \"attributes\": {\n \"name\": \"Benfica\",\n \"location\": \"Portugal\"\n },\n \"id\": \"1\",\n \"relationships\": {\n \"players\": {\n \"data\": [\n {\n \"id\": \"3\",\n \"type\": \"players\"\n }\n ]\n }\n },\n \"type\": \"clubs\"\n }\n ],\n \"included\": [\n {\n \"attributes\": {\n \"name\": \"Eusebio Silva Ferreira\",\n \"skill\": \"Rocket shot\",\n \"games-played\": 431\n },\n \"id\": \"3\",\n \"relationships\": {\n \"club\": {\n \"data\": {\n \"id\": \"1\",\n \"type\": \"clubs\"\n }\n }\n },\n \"type\": \"players\"\n }\n ]\n }\n ```\n \n to the format that the Ember Data store expects.\n \n ### Customizing meta\n \n Since a JSON API Document can have meta defined in multiple locations you can\n use the specific serializer hooks if you need to customize the meta.\n \n One scenario would be to camelCase the meta keys of your payload. The example\n below shows how this could be done using `normalizeArrayResponse` and\n `extractRelationship`.\n \n ```app/serializers/application.js\n export default JSONAPISerializer.extend({\n normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n let normalizedDocument = this._super(...arguments);\n \n // Customize document meta\n normalizedDocument.meta = camelCaseKeys(normalizedDocument.meta);\n \n return normalizedDocument;\n },\n \n extractRelationship(relationshipHash) {\n let normalizedRelationship = this._super(...arguments);\n \n // Customize relationship meta\n normalizedRelationship.meta = camelCaseKeys(normalizedRelationship.meta);\n \n return normalizedRelationship;\n }\n });\n ```\n \n @since 1.13.0\n @class JSONAPISerializer\n @namespace DS\n @extends DS.JSONSerializer\n */\n var JSONAPISerializer = _json.default.extend({\n\n /**\n @method _normalizeDocumentHelper\n @param {Object} documentHash\n @return {Object}\n @private\n */\n _normalizeDocumentHelper(documentHash) {\n\n if (Ember.typeOf(documentHash.data) === 'object') {\n documentHash.data = this._normalizeResourceHelper(documentHash.data);\n } else if (Array.isArray(documentHash.data)) {\n var ret = new Array(documentHash.data.length);\n\n for (var i = 0; i < documentHash.data.length; i++) {\n var data = documentHash.data[i];\n ret[i] = this._normalizeResourceHelper(data);\n }\n\n documentHash.data = ret;\n }\n\n if (Array.isArray(documentHash.included)) {\n var _ret = new Array();\n for (var _i = 0; _i < documentHash.included.length; _i++) {\n var included = documentHash.included[_i];\n var normalized = this._normalizeResourceHelper(included);\n if (normalized !== null) {\n // can be null when unknown type is encountered\n _ret.push(normalized);\n }\n }\n\n documentHash.included = _ret;\n }\n\n return documentHash;\n },\n\n /**\n @method _normalizeRelationshipDataHelper\n @param {Object} relationshipDataHash\n @return {Object}\n @private\n */\n _normalizeRelationshipDataHelper(relationshipDataHash) {\n if ((0, _private.isEnabled)(\"ds-payload-type-hooks\")) {\n var modelName = this.modelNameFromPayloadType(relationshipDataHash.type);\n var deprecatedModelNameLookup = this.modelNameFromPayloadKey(relationshipDataHash.type);\n\n if (modelName !== deprecatedModelNameLookup && this._hasCustomModelNameFromPayloadKey()) {\n (true && !(false) && Ember.deprecate(\"You are using modelNameFromPayloadKey to normalize the type for a relationship. This has been deprecated in favor of modelNameFromPayloadType\", false, {\n id: 'ds.json-api-serializer.deprecated-model-name-for-relationship',\n until: '4.0.0'\n }));\n\n\n modelName = deprecatedModelNameLookup;\n }\n\n relationshipDataHash.type = modelName;\n } else {\n relationshipDataHash.type = this.modelNameFromPayloadKey(relationshipDataHash.type);\n }\n\n return relationshipDataHash;\n },\n\n /**\n @method _normalizeResourceHelper\n @param {Object} resourceHash\n @return {Object}\n @private\n */\n _normalizeResourceHelper(resourceHash) {\n (true && !(!Ember.isNone(resourceHash.type)) && Ember.assert(this.warnMessageForUndefinedType(), !Ember.isNone(resourceHash.type), {\n id: 'ds.serializer.type-is-undefined'\n }));\n\n\n var modelName = void 0,\n usedLookup = void 0;\n\n if ((0, _private.isEnabled)(\"ds-payload-type-hooks\")) {\n modelName = this.modelNameFromPayloadType(resourceHash.type);\n var deprecatedModelNameLookup = this.modelNameFromPayloadKey(resourceHash.type);\n\n usedLookup = 'modelNameFromPayloadType';\n\n if (modelName !== deprecatedModelNameLookup && this._hasCustomModelNameFromPayloadKey()) {\n (true && !(false) && Ember.deprecate(\"You are using modelNameFromPayloadKey to normalize the type for a resource. This has been deprecated in favor of modelNameFromPayloadType\", false, {\n id: 'ds.json-api-serializer.deprecated-model-name-for-resource',\n until: '4.0.0'\n }));\n\n\n modelName = deprecatedModelNameLookup;\n usedLookup = 'modelNameFromPayloadKey';\n }\n } else {\n modelName = this.modelNameFromPayloadKey(resourceHash.type);\n usedLookup = 'modelNameFromPayloadKey';\n }\n\n if (!this.store._hasModelFor(modelName)) {\n (true && Ember.warn(this.warnMessageNoModelForType(modelName, resourceHash.type, usedLookup), false, {\n id: 'ds.serializer.model-for-type-missing'\n }));\n\n return null;\n }\n\n var modelClass = this.store._modelFor(modelName);\n var serializer = this.store.serializerFor(modelName);\n var { data } = serializer.normalize(modelClass, resourceHash);\n return data;\n },\n\n /**\n @method pushPayload\n @param {DS.Store} store\n @param {Object} payload\n */\n pushPayload(store, payload) {\n var normalizedPayload = this._normalizeDocumentHelper(payload);\n if ((0, _private.isEnabled)('ds-pushpayload-return')) {\n return store.push(normalizedPayload);\n } else {\n store.push(normalizedPayload);\n }\n },\n\n /**\n @method _normalizeResponse\n @param {DS.Store} store\n @param {DS.Model} primaryModelClass\n @param {Object} payload\n @param {String|Number} id\n @param {String} requestType\n @param {Boolean} isSingle\n @return {Object} JSON-API Document\n @private\n */\n _normalizeResponse(store, primaryModelClass, payload, id, requestType, isSingle) {\n var normalizedPayload = this._normalizeDocumentHelper(payload);\n return normalizedPayload;\n },\n\n normalizeQueryRecordResponse() {\n var normalized = this._super(...arguments);\n\n (true && !(!Array.isArray(normalized.data)) && Ember.assert('Expected the primary data returned by the serializer for a `queryRecord` response to be a single object but instead it was an array.', !Array.isArray(normalized.data), {\n id: 'ds.serializer.json-api.queryRecord-array-response'\n }));\n\n\n return normalized;\n },\n\n extractAttributes(modelClass, resourceHash) {\n var attributes = {};\n\n if (resourceHash.attributes) {\n modelClass.eachAttribute(key => {\n var attributeKey = this.keyForAttribute(key, 'deserialize');\n if (resourceHash.attributes[attributeKey] !== undefined) {\n attributes[key] = resourceHash.attributes[attributeKey];\n }\n if (true) {\n if (resourceHash.attributes[attributeKey] === undefined && resourceHash.attributes[key] !== undefined) {\n (true && !(false) && Ember.assert(`Your payload for '${modelClass.modelName}' contains '${key}', but your serializer is setup to look for '${attributeKey}'. This is most likely because Ember Data's JSON API serializer dasherizes attribute keys by default. You should subclass JSONAPISerializer and implement 'keyForAttribute(key) { return key; }' to prevent Ember Data from customizing your attribute keys.`, false));\n }\n }\n });\n }\n\n return attributes;\n },\n\n /**\n Returns a relationship formatted as a JSON-API \"relationship object\".\n http://jsonapi.org/format/#document-resource-object-relationships\n @method extractRelationship\n @param {Object} relationshipHash\n @return {Object}\n */\n extractRelationship(relationshipHash) {\n\n if (Ember.typeOf(relationshipHash.data) === 'object') {\n relationshipHash.data = this._normalizeRelationshipDataHelper(relationshipHash.data);\n }\n\n if (Array.isArray(relationshipHash.data)) {\n var ret = new Array(relationshipHash.data.length);\n\n for (var i = 0; i < relationshipHash.data.length; i++) {\n var data = relationshipHash.data[i];\n ret[i] = this._normalizeRelationshipDataHelper(data);\n }\n\n relationshipHash.data = ret;\n }\n\n return relationshipHash;\n },\n\n /**\n Returns the resource's relationships formatted as a JSON-API \"relationships object\".\n http://jsonapi.org/format/#document-resource-object-relationships\n @method extractRelationships\n @param {Object} modelClass\n @param {Object} resourceHash\n @return {Object}\n */\n extractRelationships(modelClass, resourceHash) {\n var relationships = {};\n\n if (resourceHash.relationships) {\n modelClass.eachRelationship((key, relationshipMeta) => {\n var relationshipKey = this.keyForRelationship(key, relationshipMeta.kind, 'deserialize');\n if (resourceHash.relationships[relationshipKey] !== undefined) {\n\n var relationshipHash = resourceHash.relationships[relationshipKey];\n relationships[key] = this.extractRelationship(relationshipHash);\n }\n if (true) {\n if (resourceHash.relationships[relationshipKey] === undefined && resourceHash.relationships[key] !== undefined) {\n (true && !(false) && Ember.assert(`Your payload for '${modelClass.modelName}' contains '${key}', but your serializer is setup to look for '${relationshipKey}'. This is most likely because Ember Data's JSON API serializer dasherizes relationship keys by default. You should subclass JSONAPISerializer and implement 'keyForRelationship(key) { return key; }' to prevent Ember Data from customizing your relationship keys.`, false));\n }\n }\n });\n }\n\n return relationships;\n },\n\n /**\n @method _extractType\n @param {DS.Model} modelClass\n @param {Object} resourceHash\n @return {String}\n @private\n */\n _extractType(modelClass, resourceHash) {\n if ((0, _private.isEnabled)(\"ds-payload-type-hooks\")) {\n var modelName = this.modelNameFromPayloadType(resourceHash.type);\n var deprecatedModelNameLookup = this.modelNameFromPayloadKey(resourceHash.type);\n\n if (modelName !== deprecatedModelNameLookup && this._hasCustomModelNameFromPayloadKey()) {\n (true && !(false) && Ember.deprecate(\"You are using modelNameFromPayloadKey to normalize the type for a polymorphic relationship. This has been deprecated in favor of modelNameFromPayloadType\", false, {\n id: 'ds.json-api-serializer.deprecated-model-name-for-polymorphic-type',\n until: '3.0.0'\n }));\n\n\n modelName = deprecatedModelNameLookup;\n }\n\n return modelName;\n } else {\n return this.modelNameFromPayloadKey(resourceHash.type);\n }\n },\n\n /**\n Dasherizes and singularizes the model name in the payload to match\n the format Ember Data uses internally for the model name.\n For example the key `posts` would be converted to `post` and the\n key `studentAssesments` would be converted to `student-assesment`.\n @method modelNameFromPayloadKey\n @param {String} key\n @return {String} the model's modelName\n */\n // TODO @deprecated Use modelNameFromPayloadType instead\n modelNameFromPayloadKey(key) {\n return (0, _emberInflector.singularize)((0, _private.normalizeModelName)(key));\n },\n\n /**\n Converts the model name to a pluralized version of the model name.\n For example `post` would be converted to `posts` and\n `student-assesment` would be converted to `student-assesments`.\n @method payloadKeyFromModelName\n @param {String} modelName\n @return {String}\n */\n // TODO @deprecated Use payloadTypeFromModelName instead\n payloadKeyFromModelName(modelName) {\n return (0, _emberInflector.pluralize)(modelName);\n },\n\n normalize(modelClass, resourceHash) {\n if (resourceHash.attributes) {\n this.normalizeUsingDeclaredMapping(modelClass, resourceHash.attributes);\n }\n\n if (resourceHash.relationships) {\n this.normalizeUsingDeclaredMapping(modelClass, resourceHash.relationships);\n }\n\n var data = {\n id: this.extractId(modelClass, resourceHash),\n type: this._extractType(modelClass, resourceHash),\n attributes: this.extractAttributes(modelClass, resourceHash),\n relationships: this.extractRelationships(modelClass, resourceHash)\n };\n\n this.applyTransforms(modelClass, data.attributes);\n\n return { data };\n },\n\n /**\n `keyForAttribute` can be used to define rules for how to convert an\n attribute name in your model to a key in your JSON.\n By default `JSONAPISerializer` follows the format used on the examples of\n http://jsonapi.org/format and uses dashes as the word separator in the JSON\n attribute keys.\n This behaviour can be easily customized by extending this method.\n Example\n ```app/serializers/application.js\n import DS from 'ember-data';\n import { dasherize } from '@ember/string';\n export default DS.JSONAPISerializer.extend({\n keyForAttribute(attr, method) {\n return dasherize(attr).toUpperCase();\n }\n });\n ```\n @method keyForAttribute\n @param {String} key\n @param {String} method\n @return {String} normalized key\n */\n keyForAttribute(key, method) {\n return Ember.String.dasherize(key);\n },\n\n /**\n `keyForRelationship` can be used to define a custom key when\n serializing and deserializing relationship properties.\n By default `JSONAPISerializer` follows the format used on the examples of\n http://jsonapi.org/format and uses dashes as word separators in\n relationship properties.\n This behaviour can be easily customized by extending this method.\n Example\n ```app/serializers/post.js\n import DS from 'ember-data';\n import { underscore } from '@ember/string';\n export default DS.JSONAPISerializer.extend({\n keyForRelationship(key, relationship, method) {\n return underscore(key);\n }\n });\n ```\n @method keyForRelationship\n @param {String} key\n @param {String} typeClass\n @param {String} method\n @return {String} normalized key\n */\n keyForRelationship(key, typeClass, method) {\n return Ember.String.dasherize(key);\n },\n\n serialize(snapshot, options) {\n var data = this._super(...arguments);\n\n var payloadType = void 0;\n if ((0, _private.isEnabled)(\"ds-payload-type-hooks\")) {\n payloadType = this.payloadTypeFromModelName(snapshot.modelName);\n var deprecatedPayloadTypeLookup = this.payloadKeyFromModelName(snapshot.modelName);\n\n if (payloadType !== deprecatedPayloadTypeLookup && this._hasCustomPayloadKeyFromModelName()) {\n (true && !(false) && Ember.deprecate(\"You used payloadKeyFromModelName to customize how a type is serialized. Use payloadTypeFromModelName instead.\", false, {\n id: 'ds.json-api-serializer.deprecated-payload-type-for-model',\n until: '4.0.0'\n }));\n\n\n payloadType = deprecatedPayloadTypeLookup;\n }\n } else {\n payloadType = this.payloadKeyFromModelName(snapshot.modelName);\n }\n\n data.type = payloadType;\n return { data };\n },\n\n serializeAttribute(snapshot, json, key, attribute) {\n var type = attribute.type;\n\n if (this._canSerialize(key)) {\n json.attributes = json.attributes || {};\n\n var value = snapshot.attr(key);\n if (type) {\n var transform = this.transformFor(type);\n value = transform.serialize(value, attribute.options);\n }\n\n var payloadKey = this._getMappedKey(key, snapshot.type);\n\n if (payloadKey === key) {\n payloadKey = this.keyForAttribute(key, 'serialize');\n }\n\n json.attributes[payloadKey] = value;\n }\n },\n\n serializeBelongsTo(snapshot, json, relationship) {\n var key = relationship.key;\n\n if (this._canSerialize(key)) {\n var belongsTo = snapshot.belongsTo(key);\n if (belongsTo !== undefined) {\n\n json.relationships = json.relationships || {};\n\n var payloadKey = this._getMappedKey(key, snapshot.type);\n if (payloadKey === key) {\n payloadKey = this.keyForRelationship(key, 'belongsTo', 'serialize');\n }\n\n var data = null;\n if (belongsTo) {\n var payloadType = void 0;\n\n if ((0, _private.isEnabled)(\"ds-payload-type-hooks\")) {\n payloadType = this.payloadTypeFromModelName(belongsTo.modelName);\n var deprecatedPayloadTypeLookup = this.payloadKeyFromModelName(belongsTo.modelName);\n\n if (payloadType !== deprecatedPayloadTypeLookup && this._hasCustomPayloadKeyFromModelName()) {\n (true && !(false) && Ember.deprecate(\"You used payloadKeyFromModelName to serialize type for belongs-to relationship. Use payloadTypeFromModelName instead.\", false, {\n id: 'ds.json-api-serializer.deprecated-payload-type-for-belongs-to',\n until: '4.0.0'\n }));\n\n\n payloadType = deprecatedPayloadTypeLookup;\n }\n } else {\n payloadType = this.payloadKeyFromModelName(belongsTo.modelName);\n }\n\n data = {\n type: payloadType,\n id: belongsTo.id\n };\n }\n\n json.relationships[payloadKey] = { data };\n }\n }\n },\n\n serializeHasMany(snapshot, json, relationship) {\n var key = relationship.key;\n\n if (this.shouldSerializeHasMany(snapshot, key, relationship)) {\n var hasMany = snapshot.hasMany(key);\n if (hasMany !== undefined) {\n\n json.relationships = json.relationships || {};\n\n var payloadKey = this._getMappedKey(key, snapshot.type);\n if (payloadKey === key && this.keyForRelationship) {\n payloadKey = this.keyForRelationship(key, 'hasMany', 'serialize');\n }\n\n var data = new Array(hasMany.length);\n\n for (var i = 0; i < hasMany.length; i++) {\n var item = hasMany[i];\n\n var payloadType = void 0;\n\n if ((0, _private.isEnabled)(\"ds-payload-type-hooks\")) {\n payloadType = this.payloadTypeFromModelName(item.modelName);\n var deprecatedPayloadTypeLookup = this.payloadKeyFromModelName(item.modelName);\n\n if (payloadType !== deprecatedPayloadTypeLookup && this._hasCustomPayloadKeyFromModelName()) {\n (true && !(false) && Ember.deprecate(\"You used payloadKeyFromModelName to serialize type for belongs-to relationship. Use payloadTypeFromModelName instead.\", false, {\n id: 'ds.json-api-serializer.deprecated-payload-type-for-has-many',\n until: '4.0.0'\n }));\n\n\n payloadType = deprecatedPayloadTypeLookup;\n }\n } else {\n payloadType = this.payloadKeyFromModelName(item.modelName);\n }\n\n data[i] = {\n type: payloadType,\n id: item.id\n };\n }\n\n json.relationships[payloadKey] = { data };\n }\n }\n }\n }); /**\n @module ember-data\n */\n\n if ((0, _private.isEnabled)(\"ds-payload-type-hooks\")) {\n\n JSONAPISerializer.reopen({\n\n /**\n `modelNameFromPayloadType` can be used to change the mapping for a DS model\n name, taken from the value in the payload.\n Say your API namespaces the type of a model and returns the following\n payload for the `post` model:\n ```javascript\n // GET /api/posts/1\n {\n \"data\": {\n \"id\": 1,\n \"type: \"api::v1::post\"\n }\n }\n ```\n By overwriting `modelNameFromPayloadType` you can specify that the\n `post` model should be used:\n ```app/serializers/application.js\n import DS from 'ember-data';\n export default DS.JSONAPISerializer.extend({\n modelNameFromPayloadType(payloadType) {\n return payloadType.replace('api::v1::', '');\n }\n });\n ```\n By default the modelName for a model is its singularized name in dasherized\n form. Usually, Ember Data can use the correct inflection to do this for\n you. Most of the time, you won't need to override\n `modelNameFromPayloadType` for this purpose.\n Also take a look at\n [payloadTypeFromModelName](#method_payloadTypeFromModelName) to customize\n how the type of a record should be serialized.\n @method modelNameFromPayloadType\n @public\n @param {String} payloadType type from payload\n @return {String} modelName\n */\n modelNameFromPayloadType(type) {\n return (0, _emberInflector.singularize)((0, _private.normalizeModelName)(type));\n },\n\n /**\n `payloadTypeFromModelName` can be used to change the mapping for the type in\n the payload, taken from the model name.\n Say your API namespaces the type of a model and expects the following\n payload when you update the `post` model:\n ```javascript\n // POST /api/posts/1\n {\n \"data\": {\n \"id\": 1,\n \"type\": \"api::v1::post\"\n }\n }\n ```\n By overwriting `payloadTypeFromModelName` you can specify that the\n namespaces model name for the `post` should be used:\n ```app/serializers/application.js\n import DS from 'ember-data';\n export default JSONAPISerializer.extend({\n payloadTypeFromModelName(modelName) {\n return 'api::v1::' + modelName;\n }\n });\n ```\n By default the payload type is the pluralized model name. Usually, Ember\n Data can use the correct inflection to do this for you. Most of the time,\n you won't need to override `payloadTypeFromModelName` for this purpose.\n Also take a look at\n [modelNameFromPayloadType](#method_modelNameFromPayloadType) to customize\n how the model name from should be mapped from the payload.\n @method payloadTypeFromModelName\n @public\n @param {String} modelname modelName from the record\n @return {String} payloadType\n */\n payloadTypeFromModelName(modelName) {\n return (0, _emberInflector.pluralize)(modelName);\n },\n\n _hasCustomModelNameFromPayloadKey() {\n return this.modelNameFromPayloadKey !== JSONAPISerializer.prototype.modelNameFromPayloadKey;\n },\n\n _hasCustomPayloadKeyFromModelName() {\n return this.payloadKeyFromModelName !== JSONAPISerializer.prototype.payloadKeyFromModelName;\n }\n\n });\n }\n\n if (true) {\n JSONAPISerializer.reopen({\n willMergeMixin(props) {\n var constructor = this.constructor;\n (true && Ember.warn(`You've defined 'extractMeta' in ${constructor.toString()} which is not used for serializers extending JSONAPISerializer. Read more at https://emberjs.com/api/data/classes/DS.JSONAPISerializer.html#toc_customizing-meta on how to customize meta when using JSON API.`, Ember.isNone(props.extractMeta) || props.extractMeta === _json.default.prototype.extractMeta, {\n id: 'ds.serializer.json-api.extractMeta'\n }));\n (true && Ember.warn('The JSONAPISerializer does not work with the EmbeddedRecordsMixin because the JSON API spec does not describe how to format embedded resources.', !props.isEmbeddedRecordsMixin, {\n id: 'ds.serializer.embedded-records-mixin-not-supported'\n }));\n },\n warnMessageForUndefinedType() {\n return 'Encountered a resource object with an undefined type (resolved resource using ' + this.constructor.toString() + ')';\n },\n warnMessageNoModelForType(modelName, originalType, usedLookup) {\n return `Encountered a resource object with type \"${originalType}\", but no model was found for model name \"${modelName}\" (resolved model name using '${this.constructor.toString()}.${usedLookup}(\"${originalType}\")').`;\n }\n });\n }\n\n exports.default = JSONAPISerializer;\n});","define('ember-data/serializers/json', ['exports', 'ember-data/serializer', 'ember-data/-private'], function (exports, _serializer, _private) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n\n var emberAssign = Ember.assign || Ember.merge;\n\n /**\n Ember Data 2.0 Serializer:\n \n In Ember Data a Serializer is used to serialize and deserialize\n records when they are transferred in and out of an external source.\n This process involves normalizing property names, transforming\n attribute values and serializing relationships.\n \n By default, Ember Data uses and recommends the `JSONAPISerializer`.\n \n `JSONSerializer` is useful for simpler or legacy backends that may\n not support the http://jsonapi.org/ spec.\n \n For example, given the following `User` model and JSON payload:\n \n ```app/models/user.js\n import DS from 'ember-data';\n \n export default DS.Model.extend({\n friends: DS.hasMany('user'),\n house: DS.belongsTo('location'),\n \n name: DS.attr('string')\n });\n ```\n \n ```js\n {\n id: 1,\n name: 'Sebastian',\n friends: [3, 4],\n links: {\n house: '/houses/lefkada'\n }\n }\n ```\n \n `JSONSerializer` will normalize the JSON payload to the JSON API format that the\n Ember Data store expects.\n \n You can customize how JSONSerializer processes its payload by passing options in\n the `attrs` hash or by subclassing the `JSONSerializer` and overriding hooks:\n \n - To customize how a single record is normalized, use the `normalize` hook.\n - To customize how `JSONSerializer` normalizes the whole server response, use the\n `normalizeResponse` hook.\n - To customize how `JSONSerializer` normalizes a specific response from the server,\n use one of the many specific `normalizeResponse` hooks.\n - To customize how `JSONSerializer` normalizes your id, attributes or relationships,\n use the `extractId`, `extractAttributes` and `extractRelationships` hooks.\n \n The `JSONSerializer` normalization process follows these steps:\n \n - `normalizeResponse` - entry method to the serializer.\n - `normalizeCreateRecordResponse` - a `normalizeResponse` for a specific operation is called.\n - `normalizeSingleResponse`|`normalizeArrayResponse` - for methods like `createRecord` we expect\n a single record back, while for methods like `findAll` we expect multiple records back.\n - `normalize` - `normalizeArray` iterates and calls `normalize` for each of its records while `normalizeSingle`\n calls it once. This is the method you most likely want to subclass.\n - `extractId` | `extractAttributes` | `extractRelationships` - `normalize` delegates to these methods to\n turn the record payload into the JSON API format.\n \n @class JSONSerializer\n @namespace DS\n @extends DS.Serializer\n */\n var JSONSerializer = _serializer.default.extend({\n\n /**\n The `primaryKey` is used when serializing and deserializing\n data. Ember Data always uses the `id` property to store the id of\n the record. The external source may not always follow this\n convention. In these cases it is useful to override the\n `primaryKey` property to match the `primaryKey` of your external\n store.\n Example\n ```app/serializers/application.js\n import DS from 'ember-data';\n export default DS.JSONSerializer.extend({\n primaryKey: '_id'\n });\n ```\n @property primaryKey\n @type {String}\n @default 'id'\n */\n primaryKey: 'id',\n\n /**\n The `attrs` object can be used to declare a simple mapping between\n property names on `DS.Model` records and payload keys in the\n serialized JSON object representing the record. An object with the\n property `key` can also be used to designate the attribute's key on\n the response payload.\n Example\n ```app/models/person.js\n import DS from 'ember-data';\n export default DS.Model.extend({\n firstName: DS.attr('string'),\n lastName: DS.attr('string'),\n occupation: DS.attr('string'),\n admin: DS.attr('boolean')\n });\n ```\n ```app/serializers/person.js\n import DS from 'ember-data';\n export default DS.JSONSerializer.extend({\n attrs: {\n admin: 'is_admin',\n occupation: { key: 'career' }\n }\n });\n ```\n You can also remove attributes by setting the `serialize` key to\n `false` in your mapping object.\n Example\n ```app/serializers/person.js\n import DS from 'ember-data';\n export default DS.JSONSerializer.extend({\n attrs: {\n admin: { serialize: false },\n occupation: { key: 'career' }\n }\n });\n ```\n When serialized:\n ```javascript\n {\n \"firstName\": \"Harry\",\n \"lastName\": \"Houdini\",\n \"career\": \"magician\"\n }\n ```\n Note that the `admin` is now not included in the payload.\n @property attrs\n @type {Object}\n */\n mergedProperties: ['attrs'],\n\n /**\n Given a subclass of `DS.Model` and a JSON object this method will\n iterate through each attribute of the `DS.Model` and invoke the\n `DS.Transform#deserialize` method on the matching property of the\n JSON object. This method is typically called after the\n serializer's `normalize` method.\n @method applyTransforms\n @private\n @param {DS.Model} typeClass\n @param {Object} data The data to transform\n @return {Object} data The transformed data object\n */\n applyTransforms(typeClass, data) {\n var attributes = Ember.get(typeClass, 'attributes');\n\n typeClass.eachTransformedAttribute((key, typeClass) => {\n if (data[key] === undefined) {\n return;\n }\n\n var transform = this.transformFor(typeClass);\n var transformMeta = attributes.get(key);\n data[key] = transform.deserialize(data[key], transformMeta.options);\n });\n\n return data;\n },\n\n /**\n The `normalizeResponse` method is used to normalize a payload from the\n server to a JSON-API Document.\n http://jsonapi.org/format/#document-structure\n This method delegates to a more specific normalize method based on\n the `requestType`.\n To override this method with a custom one, make sure to call\n `return this._super(store, primaryModelClass, payload, id, requestType)` with your\n pre-processed data.\n Here's an example of using `normalizeResponse` manually:\n ```javascript\n socket.on('message', function(message) {\n var data = message.data;\n var modelClass = store.modelFor(data.modelName);\n var serializer = store.serializerFor(data.modelName);\n var normalized = serializer.normalizeSingleResponse(store, modelClass, data, data.id);\n store.push(normalized);\n });\n ```\n @since 1.13.0\n @method normalizeResponse\n @param {DS.Store} store\n @param {DS.Model} primaryModelClass\n @param {Object} payload\n @param {String|Number} id\n @param {String} requestType\n @return {Object} JSON-API Document\n */\n normalizeResponse(store, primaryModelClass, payload, id, requestType) {\n switch (requestType) {\n case 'findRecord':\n return this.normalizeFindRecordResponse(...arguments);\n case 'queryRecord':\n return this.normalizeQueryRecordResponse(...arguments);\n case 'findAll':\n return this.normalizeFindAllResponse(...arguments);\n case 'findBelongsTo':\n return this.normalizeFindBelongsToResponse(...arguments);\n case 'findHasMany':\n return this.normalizeFindHasManyResponse(...arguments);\n case 'findMany':\n return this.normalizeFindManyResponse(...arguments);\n case 'query':\n return this.normalizeQueryResponse(...arguments);\n case 'createRecord':\n return this.normalizeCreateRecordResponse(...arguments);\n case 'deleteRecord':\n return this.normalizeDeleteRecordResponse(...arguments);\n case 'updateRecord':\n return this.normalizeUpdateRecordResponse(...arguments);\n }\n },\n\n /**\n @since 1.13.0\n @method normalizeFindRecordResponse\n @param {DS.Store} store\n @param {DS.Model} primaryModelClass\n @param {Object} payload\n @param {String|Number} id\n @param {String} requestType\n @return {Object} JSON-API Document\n */\n normalizeFindRecordResponse(store, primaryModelClass, payload, id, requestType) {\n return this.normalizeSingleResponse(...arguments);\n },\n\n /**\n @since 1.13.0\n @method normalizeQueryRecordResponse\n @param {DS.Store} store\n @param {DS.Model} primaryModelClass\n @param {Object} payload\n @param {String|Number} id\n @param {String} requestType\n @return {Object} JSON-API Document\n */\n normalizeQueryRecordResponse(store, primaryModelClass, payload, id, requestType) {\n return this.normalizeSingleResponse(...arguments);\n },\n\n /**\n @since 1.13.0\n @method normalizeFindAllResponse\n @param {DS.Store} store\n @param {DS.Model} primaryModelClass\n @param {Object} payload\n @param {String|Number} id\n @param {String} requestType\n @return {Object} JSON-API Document\n */\n normalizeFindAllResponse(store, primaryModelClass, payload, id, requestType) {\n return this.normalizeArrayResponse(...arguments);\n },\n\n /**\n @since 1.13.0\n @method normalizeFindBelongsToResponse\n @param {DS.Store} store\n @param {DS.Model} primaryModelClass\n @param {Object} payload\n @param {String|Number} id\n @param {String} requestType\n @return {Object} JSON-API Document\n */\n normalizeFindBelongsToResponse(store, primaryModelClass, payload, id, requestType) {\n return this.normalizeSingleResponse(...arguments);\n },\n\n /**\n @since 1.13.0\n @method normalizeFindHasManyResponse\n @param {DS.Store} store\n @param {DS.Model} primaryModelClass\n @param {Object} payload\n @param {String|Number} id\n @param {String} requestType\n @return {Object} JSON-API Document\n */\n normalizeFindHasManyResponse(store, primaryModelClass, payload, id, requestType) {\n return this.normalizeArrayResponse(...arguments);\n },\n\n /**\n @since 1.13.0\n @method normalizeFindManyResponse\n @param {DS.Store} store\n @param {DS.Model} primaryModelClass\n @param {Object} payload\n @param {String|Number} id\n @param {String} requestType\n @return {Object} JSON-API Document\n */\n normalizeFindManyResponse(store, primaryModelClass, payload, id, requestType) {\n return this.normalizeArrayResponse(...arguments);\n },\n\n /**\n @since 1.13.0\n @method normalizeQueryResponse\n @param {DS.Store} store\n @param {DS.Model} primaryModelClass\n @param {Object} payload\n @param {String|Number} id\n @param {String} requestType\n @return {Object} JSON-API Document\n */\n normalizeQueryResponse(store, primaryModelClass, payload, id, requestType) {\n return this.normalizeArrayResponse(...arguments);\n },\n\n /**\n @since 1.13.0\n @method normalizeCreateRecordResponse\n @param {DS.Store} store\n @param {DS.Model} primaryModelClass\n @param {Object} payload\n @param {String|Number} id\n @param {String} requestType\n @return {Object} JSON-API Document\n */\n normalizeCreateRecordResponse(store, primaryModelClass, payload, id, requestType) {\n return this.normalizeSaveResponse(...arguments);\n },\n\n /**\n @since 1.13.0\n @method normalizeDeleteRecordResponse\n @param {DS.Store} store\n @param {DS.Model} primaryModelClass\n @param {Object} payload\n @param {String|Number} id\n @param {String} requestType\n @return {Object} JSON-API Document\n */\n normalizeDeleteRecordResponse(store, primaryModelClass, payload, id, requestType) {\n return this.normalizeSaveResponse(...arguments);\n },\n\n /**\n @since 1.13.0\n @method normalizeUpdateRecordResponse\n @param {DS.Store} store\n @param {DS.Model} primaryModelClass\n @param {Object} payload\n @param {String|Number} id\n @param {String} requestType\n @return {Object} JSON-API Document\n */\n normalizeUpdateRecordResponse(store, primaryModelClass, payload, id, requestType) {\n return this.normalizeSaveResponse(...arguments);\n },\n\n /**\n @since 1.13.0\n @method normalizeSaveResponse\n @param {DS.Store} store\n @param {DS.Model} primaryModelClass\n @param {Object} payload\n @param {String|Number} id\n @param {String} requestType\n @return {Object} JSON-API Document\n */\n normalizeSaveResponse(store, primaryModelClass, payload, id, requestType) {\n return this.normalizeSingleResponse(...arguments);\n },\n\n /**\n @since 1.13.0\n @method normalizeSingleResponse\n @param {DS.Store} store\n @param {DS.Model} primaryModelClass\n @param {Object} payload\n @param {String|Number} id\n @param {String} requestType\n @return {Object} JSON-API Document\n */\n normalizeSingleResponse(store, primaryModelClass, payload, id, requestType) {\n return this._normalizeResponse(store, primaryModelClass, payload, id, requestType, true);\n },\n\n /**\n @since 1.13.0\n @method normalizeArrayResponse\n @param {DS.Store} store\n @param {DS.Model} primaryModelClass\n @param {Object} payload\n @param {String|Number} id\n @param {String} requestType\n @return {Object} JSON-API Document\n */\n normalizeArrayResponse(store, primaryModelClass, payload, id, requestType) {\n return this._normalizeResponse(store, primaryModelClass, payload, id, requestType, false);\n },\n\n /**\n @method _normalizeResponse\n @param {DS.Store} store\n @param {DS.Model} primaryModelClass\n @param {Object} payload\n @param {String|Number} id\n @param {String} requestType\n @param {Boolean} isSingle\n @return {Object} JSON-API Document\n @private\n */\n _normalizeResponse(store, primaryModelClass, payload, id, requestType, isSingle) {\n var documentHash = {\n data: null,\n included: []\n };\n\n var meta = this.extractMeta(store, primaryModelClass, payload);\n if (meta) {\n (true && !(Ember.typeOf(meta) === 'object') && Ember.assert('The `meta` returned from `extractMeta` has to be an object, not \"' + Ember.typeOf(meta) + '\".', Ember.typeOf(meta) === 'object'));\n\n documentHash.meta = meta;\n }\n\n if (isSingle) {\n var { data, included } = this.normalize(primaryModelClass, payload);\n documentHash.data = data;\n if (included) {\n documentHash.included = included;\n }\n } else {\n var ret = new Array(payload.length);\n for (var i = 0, l = payload.length; i < l; i++) {\n var item = payload[i];\n var { data: _data, included: _included } = this.normalize(primaryModelClass, item);\n if (_included) {\n documentHash.included.push(..._included);\n }\n ret[i] = _data;\n }\n\n documentHash.data = ret;\n }\n\n return documentHash;\n },\n\n /**\n Normalizes a part of the JSON payload returned by\n the server. You should override this method, munge the hash\n and call super if you have generic normalization to do.\n It takes the type of the record that is being normalized\n (as a DS.Model class), the property where the hash was\n originally found, and the hash to normalize.\n You can use this method, for example, to normalize underscored keys to camelized\n or other general-purpose normalizations.\n Example\n ```app/serializers/application.js\n import DS from 'ember-data';\n import { underscore } from '@ember/string';\n import { get } from '@ember/object';\n export default DS.JSONSerializer.extend({\n normalize(typeClass, hash) {\n var fields = get(typeClass, 'fields');\n fields.forEach(function(field) {\n var payloadField = underscore(field);\n if (field === payloadField) { return; }\n hash[field] = hash[payloadField];\n delete hash[payloadField];\n });\n return this._super.apply(this, arguments);\n }\n });\n ```\n @method normalize\n @param {DS.Model} typeClass\n @param {Object} hash\n @return {Object}\n */\n normalize(modelClass, resourceHash) {\n var data = null;\n\n if (resourceHash) {\n this.normalizeUsingDeclaredMapping(modelClass, resourceHash);\n if (Ember.typeOf(resourceHash.links) === 'object') {\n this.normalizeUsingDeclaredMapping(modelClass, resourceHash.links);\n }\n\n data = {\n id: this.extractId(modelClass, resourceHash),\n type: modelClass.modelName,\n attributes: this.extractAttributes(modelClass, resourceHash),\n relationships: this.extractRelationships(modelClass, resourceHash)\n };\n\n this.applyTransforms(modelClass, data.attributes);\n }\n\n return { data };\n },\n\n /**\n Returns the resource's ID.\n @method extractId\n @param {Object} modelClass\n @param {Object} resourceHash\n @return {String}\n */\n extractId(modelClass, resourceHash) {\n var primaryKey = Ember.get(this, 'primaryKey');\n var id = resourceHash[primaryKey];\n return (0, _private.coerceId)(id);\n },\n\n /**\n Returns the resource's attributes formatted as a JSON-API \"attributes object\".\n http://jsonapi.org/format/#document-resource-object-attributes\n @method extractAttributes\n @param {Object} modelClass\n @param {Object} resourceHash\n @return {Object}\n */\n extractAttributes(modelClass, resourceHash) {\n var attributeKey = void 0;\n var attributes = {};\n\n modelClass.eachAttribute(key => {\n attributeKey = this.keyForAttribute(key, 'deserialize');\n if (resourceHash[attributeKey] !== undefined) {\n attributes[key] = resourceHash[attributeKey];\n }\n });\n\n return attributes;\n },\n\n /**\n Returns a relationship formatted as a JSON-API \"relationship object\".\n http://jsonapi.org/format/#document-resource-object-relationships\n @method extractRelationship\n @param {Object} relationshipModelName\n @param {Object} relationshipHash\n @return {Object}\n */\n extractRelationship(relationshipModelName, relationshipHash) {\n if (Ember.isNone(relationshipHash)) {\n return null;\n }\n /*\n When `relationshipHash` is an object it usually means that the relationship\n is polymorphic. It could however also be embedded resources that the\n EmbeddedRecordsMixin has be able to process.\n */\n if (Ember.typeOf(relationshipHash) === 'object') {\n if (relationshipHash.id) {\n relationshipHash.id = (0, _private.coerceId)(relationshipHash.id);\n }\n\n var modelClass = this.store.modelFor(relationshipModelName);\n if (relationshipHash.type && !(0, _private.modelHasAttributeOrRelationshipNamedType)(modelClass)) {\n\n if ((0, _private.isEnabled)(\"ds-payload-type-hooks\")) {\n var modelName = this.modelNameFromPayloadType(relationshipHash.type);\n var deprecatedModelNameLookup = this.modelNameFromPayloadKey(relationshipHash.type);\n\n if (modelName !== deprecatedModelNameLookup && this._hasCustomModelNameFromPayloadKey()) {\n (true && !(false) && Ember.deprecate(\"You used modelNameFromPayloadKey to customize how a type is normalized. Use modelNameFromPayloadType instead\", false, {\n id: 'ds.json-serializer.deprecated-type-for-polymorphic-relationship',\n until: '3.0.0'\n }));\n\n\n modelName = deprecatedModelNameLookup;\n }\n\n relationshipHash.type = modelName;\n } else {\n relationshipHash.type = this.modelNameFromPayloadKey(relationshipHash.type);\n }\n }\n return relationshipHash;\n }\n return { id: (0, _private.coerceId)(relationshipHash), type: relationshipModelName };\n },\n\n /**\n Returns a polymorphic relationship formatted as a JSON-API \"relationship object\".\n http://jsonapi.org/format/#document-resource-object-relationships\n `relationshipOptions` is a hash which contains more information about the\n polymorphic relationship which should be extracted:\n - `resourceHash` complete hash of the resource the relationship should be\n extracted from\n - `relationshipKey` key under which the value for the relationship is\n extracted from the resourceHash\n - `relationshipMeta` meta information about the relationship\n @method extractPolymorphicRelationship\n @param {Object} relationshipModelName\n @param {Object} relationshipHash\n @param {Object} relationshipOptions\n @return {Object}\n */\n extractPolymorphicRelationship(relationshipModelName, relationshipHash, relationshipOptions) {\n return this.extractRelationship(relationshipModelName, relationshipHash);\n },\n\n /**\n Returns the resource's relationships formatted as a JSON-API \"relationships object\".\n http://jsonapi.org/format/#document-resource-object-relationships\n @method extractRelationships\n @param {Object} modelClass\n @param {Object} resourceHash\n @return {Object}\n */\n extractRelationships(modelClass, resourceHash) {\n var relationships = {};\n\n modelClass.eachRelationship((key, relationshipMeta) => {\n var relationship = null;\n var relationshipKey = this.keyForRelationship(key, relationshipMeta.kind, 'deserialize');\n if (resourceHash[relationshipKey] !== undefined) {\n var data = null;\n var relationshipHash = resourceHash[relationshipKey];\n if (relationshipMeta.kind === 'belongsTo') {\n if (relationshipMeta.options.polymorphic) {\n // extracting a polymorphic belongsTo may need more information\n // than the type and the hash (which might only be an id) for the\n // relationship, hence we pass the key, resource and\n // relationshipMeta too\n data = this.extractPolymorphicRelationship(relationshipMeta.type, relationshipHash, { key, resourceHash, relationshipMeta });\n } else {\n data = this.extractRelationship(relationshipMeta.type, relationshipHash);\n }\n } else if (relationshipMeta.kind === 'hasMany') {\n if (!Ember.isNone(relationshipHash)) {\n data = new Array(relationshipHash.length);\n for (var i = 0, l = relationshipHash.length; i < l; i++) {\n var item = relationshipHash[i];\n data[i] = this.extractRelationship(relationshipMeta.type, item);\n }\n }\n }\n relationship = { data };\n }\n\n var linkKey = this.keyForLink(key, relationshipMeta.kind);\n if (resourceHash.links && resourceHash.links[linkKey] !== undefined) {\n var related = resourceHash.links[linkKey];\n relationship = relationship || {};\n relationship.links = { related };\n }\n\n if (relationship) {\n relationships[key] = relationship;\n }\n });\n\n return relationships;\n },\n\n /**\n @method modelNameFromPayloadKey\n @param {String} key\n @return {String} the model's modelName\n */\n // TODO @deprecated Use modelNameFromPayloadType instead\n modelNameFromPayloadKey(key) {\n return (0, _private.normalizeModelName)(key);\n },\n\n /**\n @method normalizeRelationships\n @private\n */\n normalizeRelationships(typeClass, hash) {\n var payloadKey = void 0;\n\n if (this.keyForRelationship) {\n typeClass.eachRelationship((key, relationship) => {\n payloadKey = this.keyForRelationship(key, relationship.kind, 'deserialize');\n if (key === payloadKey) {\n return;\n }\n if (hash[payloadKey] === undefined) {\n return;\n }\n\n hash[key] = hash[payloadKey];\n delete hash[payloadKey];\n });\n }\n },\n\n /**\n @method normalizeUsingDeclaredMapping\n @private\n */\n normalizeUsingDeclaredMapping(modelClass, hash) {\n var attrs = Ember.get(this, 'attrs');\n var normalizedKey = void 0;\n var payloadKey = void 0;\n\n if (attrs) {\n for (var key in attrs) {\n normalizedKey = payloadKey = this._getMappedKey(key, modelClass);\n\n if (hash[payloadKey] === undefined) {\n continue;\n }\n\n if (Ember.get(modelClass, 'attributes').has(key)) {\n normalizedKey = this.keyForAttribute(key);\n }\n\n if (Ember.get(modelClass, 'relationshipsByName').has(key)) {\n normalizedKey = this.keyForRelationship(key);\n }\n\n if (payloadKey !== normalizedKey) {\n hash[normalizedKey] = hash[payloadKey];\n delete hash[payloadKey];\n }\n }\n }\n },\n\n /**\n Looks up the property key that was set by the custom `attr` mapping\n passed to the serializer.\n @method _getMappedKey\n @private\n @param {String} key\n @return {String} key\n */\n _getMappedKey(key, modelClass) {\n (true && Ember.warn('There is no attribute or relationship with the name `' + key + '` on `' + modelClass.modelName + '`. Check your serializers attrs hash.', Ember.get(modelClass, 'attributes').has(key) || Ember.get(modelClass, 'relationshipsByName').has(key), {\n id: 'ds.serializer.no-mapped-attrs-key'\n }));\n\n\n var attrs = Ember.get(this, 'attrs');\n var mappedKey = void 0;\n if (attrs && attrs[key]) {\n mappedKey = attrs[key];\n //We need to account for both the { title: 'post_title' } and\n //{ title: { key: 'post_title' }} forms\n if (mappedKey.key) {\n mappedKey = mappedKey.key;\n }\n if (typeof mappedKey === 'string') {\n key = mappedKey;\n }\n }\n\n return key;\n },\n\n /**\n Check attrs.key.serialize property to inform if the `key`\n can be serialized\n @method _canSerialize\n @private\n @param {String} key\n @return {boolean} true if the key can be serialized\n */\n _canSerialize(key) {\n var attrs = Ember.get(this, 'attrs');\n\n return !attrs || !attrs[key] || attrs[key].serialize !== false;\n },\n\n /**\n When attrs.key.serialize is set to true then\n it takes priority over the other checks and the related\n attribute/relationship will be serialized\n @method _mustSerialize\n @private\n @param {String} key\n @return {boolean} true if the key must be serialized\n */\n _mustSerialize(key) {\n var attrs = Ember.get(this, 'attrs');\n\n return attrs && attrs[key] && attrs[key].serialize === true;\n },\n\n /**\n Check if the given hasMany relationship should be serialized\n @method shouldSerializeHasMany\n @param {DS.Snapshot} snapshot\n @param {String} key\n @param {String} relationshipType\n @return {boolean} true if the hasMany relationship should be serialized\n */\n shouldSerializeHasMany(snapshot, key, relationship) {\n var relationshipType = snapshot.type.determineRelationshipType(relationship, this.store);\n if (this._mustSerialize(key)) {\n return true;\n }\n return this._canSerialize(key) && (relationshipType === 'manyToNone' || relationshipType === 'manyToMany');\n },\n\n // SERIALIZE\n /**\n Called when a record is saved in order to convert the\n record into JSON.\n By default, it creates a JSON object with a key for\n each attribute and belongsTo relationship.\n For example, consider this model:\n ```app/models/comment.js\n import DS from 'ember-data';\n export default DS.Model.extend({\n title: DS.attr(),\n body: DS.attr(),\n author: DS.belongsTo('user')\n });\n ```\n The default serialization would create a JSON object like:\n ```javascript\n {\n \"title\": \"Rails is unagi\",\n \"body\": \"Rails? Omakase? O_O\",\n \"author\": 12\n }\n ```\n By default, attributes are passed through as-is, unless\n you specified an attribute type (`DS.attr('date')`). If\n you specify a transform, the JavaScript value will be\n serialized when inserted into the JSON hash.\n By default, belongs-to relationships are converted into\n IDs when inserted into the JSON hash.\n ## IDs\n `serialize` takes an options hash with a single option:\n `includeId`. If this option is `true`, `serialize` will,\n by default include the ID in the JSON object it builds.\n The adapter passes in `includeId: true` when serializing\n a record for `createRecord`, but not for `updateRecord`.\n ## Customization\n Your server may expect a different JSON format than the\n built-in serialization format.\n In that case, you can implement `serialize` yourself and\n return a JSON hash of your choosing.\n ```app/serializers/post.js\n import DS from 'ember-data';\n export default DS.JSONSerializer.extend({\n serialize(snapshot, options) {\n var json = {\n POST_TTL: snapshot.attr('title'),\n POST_BDY: snapshot.attr('body'),\n POST_CMS: snapshot.hasMany('comments', { ids: true })\n };\n if (options.includeId) {\n json.POST_ID_ = snapshot.id;\n }\n return json;\n }\n });\n ```\n ## Customizing an App-Wide Serializer\n If you want to define a serializer for your entire\n application, you'll probably want to use `eachAttribute`\n and `eachRelationship` on the record.\n ```app/serializers/application.js\n import DS from 'ember-data';\n import { singularize } from 'ember-inflector';\n export default DS.JSONSerializer.extend({\n serialize(snapshot, options) {\n var json = {};\n snapshot.eachAttribute(function(name) {\n json[serverAttributeName(name)] = snapshot.attr(name);\n });\n snapshot.eachRelationship(function(name, relationship) {\n if (relationship.kind === 'hasMany') {\n json[serverHasManyName(name)] = snapshot.hasMany(name, { ids: true });\n }\n });\n if (options.includeId) {\n json.ID_ = snapshot.id;\n }\n return json;\n }\n });\n function serverAttributeName(attribute) {\n return attribute.underscore().toUpperCase();\n }\n function serverHasManyName(name) {\n return serverAttributeName(singularize(name)) + \"_IDS\";\n }\n ```\n This serializer will generate JSON that looks like this:\n ```javascript\n {\n \"TITLE\": \"Rails is omakase\",\n \"BODY\": \"Yep. Omakase.\",\n \"COMMENT_IDS\": [ 1, 2, 3 ]\n }\n ```\n ## Tweaking the Default JSON\n If you just want to do some small tweaks on the default JSON,\n you can call super first and make the tweaks on the returned\n JSON.\n ```app/serializers/post.js\n import DS from 'ember-data';\n export default DS.JSONSerializer.extend({\n serialize(snapshot, options) {\n var json = this._super(...arguments);\n json.subject = json.title;\n delete json.title;\n return json;\n }\n });\n ```\n @method serialize\n @param {DS.Snapshot} snapshot\n @param {Object} options\n @return {Object} json\n */\n serialize(snapshot, options) {\n var json = {};\n\n if (options && options.includeId) {\n if ((0, _private.isEnabled)('ds-serialize-id')) {\n this.serializeId(snapshot, json, Ember.get(this, 'primaryKey'));\n } else {\n var id = snapshot.id;\n if (id) {\n json[Ember.get(this, 'primaryKey')] = id;\n }\n }\n }\n\n snapshot.eachAttribute((key, attribute) => {\n this.serializeAttribute(snapshot, json, key, attribute);\n });\n\n snapshot.eachRelationship((key, relationship) => {\n if (relationship.kind === 'belongsTo') {\n this.serializeBelongsTo(snapshot, json, relationship);\n } else if (relationship.kind === 'hasMany') {\n this.serializeHasMany(snapshot, json, relationship);\n }\n });\n\n return json;\n },\n\n /**\n You can use this method to customize how a serialized record is added to the complete\n JSON hash to be sent to the server. By default the JSON Serializer does not namespace\n the payload and just sends the raw serialized JSON object.\n If your server expects namespaced keys, you should consider using the RESTSerializer.\n Otherwise you can override this method to customize how the record is added to the hash.\n The hash property should be modified by reference.\n For example, your server may expect underscored root objects.\n ```app/serializers/application.js\n import DS from 'ember-data';\n import { decamelize } from '@ember/string';\n export default DS.RESTSerializer.extend({\n serializeIntoHash(data, type, snapshot, options) {\n var root = decamelize(type.modelName);\n data[root] = this.serialize(snapshot, options);\n }\n });\n ```\n @method serializeIntoHash\n @param {Object} hash\n @param {DS.Model} typeClass\n @param {DS.Snapshot} snapshot\n @param {Object} options\n */\n serializeIntoHash(hash, typeClass, snapshot, options) {\n emberAssign(hash, this.serialize(snapshot, options));\n },\n\n /**\n `serializeAttribute` can be used to customize how `DS.attr`\n properties are serialized\n For example if you wanted to ensure all your attributes were always\n serialized as properties on an `attributes` object you could\n write:\n ```app/serializers/application.js\n import DS from 'ember-data';\n export default DS.JSONSerializer.extend({\n serializeAttribute(snapshot, json, key, attributes) {\n json.attributes = json.attributes || {};\n this._super(snapshot, json.attributes, key, attributes);\n }\n });\n ```\n @method serializeAttribute\n @param {DS.Snapshot} snapshot\n @param {Object} json\n @param {String} key\n @param {Object} attribute\n */\n serializeAttribute(snapshot, json, key, attribute) {\n\n if (this._canSerialize(key)) {\n var type = attribute.type;\n var value = snapshot.attr(key);\n if (type) {\n var transform = this.transformFor(type);\n value = transform.serialize(value, attribute.options);\n }\n\n // if provided, use the mapping provided by `attrs` in\n // the serializer\n var payloadKey = this._getMappedKey(key, snapshot.type);\n\n if (payloadKey === key && this.keyForAttribute) {\n payloadKey = this.keyForAttribute(key, 'serialize');\n }\n\n json[payloadKey] = value;\n }\n },\n\n /**\n `serializeBelongsTo` can be used to customize how `DS.belongsTo`\n properties are serialized.\n Example\n ```app/serializers/post.js\n import DS from 'ember-data';\n import { isNone } from '@ember/utils';\n export default DS.JSONSerializer.extend({\n serializeBelongsTo(snapshot, json, relationship) {\n var key = relationship.key;\n var belongsTo = snapshot.belongsTo(key);\n key = this.keyForRelationship ? this.keyForRelationship(key, \"belongsTo\", \"serialize\") : key;\n json[key] = isNone(belongsTo) ? belongsTo : belongsTo.record.toJSON();\n }\n });\n ```\n @method serializeBelongsTo\n @param {DS.Snapshot} snapshot\n @param {Object} json\n @param {Object} relationship\n */\n serializeBelongsTo(snapshot, json, relationship) {\n var key = relationship.key;\n\n if (this._canSerialize(key)) {\n var belongsToId = snapshot.belongsTo(key, { id: true });\n\n // if provided, use the mapping provided by `attrs` in\n // the serializer\n var payloadKey = this._getMappedKey(key, snapshot.type);\n if (payloadKey === key && this.keyForRelationship) {\n payloadKey = this.keyForRelationship(key, \"belongsTo\", \"serialize\");\n }\n\n //Need to check whether the id is there for new&async records\n if (Ember.isNone(belongsToId)) {\n json[payloadKey] = null;\n } else {\n json[payloadKey] = belongsToId;\n }\n\n if (relationship.options.polymorphic) {\n this.serializePolymorphicType(snapshot, json, relationship);\n }\n }\n },\n\n /**\n `serializeHasMany` can be used to customize how `DS.hasMany`\n properties are serialized.\n Example\n ```app/serializers/post.js\n import DS from 'ember-data';\n export default DS.JSONSerializer.extend({\n serializeHasMany(snapshot, json, relationship) {\n var key = relationship.key;\n if (key === 'comments') {\n return;\n } else {\n this._super(...arguments);\n }\n }\n });\n ```\n @method serializeHasMany\n @param {DS.Snapshot} snapshot\n @param {Object} json\n @param {Object} relationship\n */\n serializeHasMany(snapshot, json, relationship) {\n var key = relationship.key;\n\n if (this.shouldSerializeHasMany(snapshot, key, relationship)) {\n var hasMany = snapshot.hasMany(key, { ids: true });\n if (hasMany !== undefined) {\n // if provided, use the mapping provided by `attrs` in\n // the serializer\n var payloadKey = this._getMappedKey(key, snapshot.type);\n if (payloadKey === key && this.keyForRelationship) {\n payloadKey = this.keyForRelationship(key, \"hasMany\", \"serialize\");\n }\n\n json[payloadKey] = hasMany;\n // TODO support for polymorphic manyToNone and manyToMany relationships\n }\n }\n },\n\n /**\n You can use this method to customize how polymorphic objects are\n serialized. Objects are considered to be polymorphic if\n `{ polymorphic: true }` is pass as the second argument to the\n `DS.belongsTo` function.\n Example\n ```app/serializers/comment.js\n import DS from 'ember-data';\n import { isNone } from '@ember/utils';\n export default DS.JSONSerializer.extend({\n serializePolymorphicType(snapshot, json, relationship) {\n var key = relationship.key;\n var belongsTo = snapshot.belongsTo(key);\n key = this.keyForAttribute ? this.keyForAttribute(key, 'serialize') : key;\n if (isNone(belongsTo)) {\n json[key + '_type'] = null;\n } else {\n json[key + '_type'] = belongsTo.modelName;\n }\n }\n });\n ```\n @method serializePolymorphicType\n @param {DS.Snapshot} snapshot\n @param {Object} json\n @param {Object} relationship\n */\n serializePolymorphicType() {},\n\n /**\n `extractMeta` is used to deserialize any meta information in the\n adapter payload. By default Ember Data expects meta information to\n be located on the `meta` property of the payload object.\n Example\n ```app/serializers/post.js\n import DS from 'ember-data';\n export default DS.JSONSerializer.extend({\n extractMeta(store, typeClass, payload) {\n if (payload && payload.hasOwnProperty('_pagination')) {\n let meta = payload._pagination;\n delete payload._pagination;\n return meta;\n }\n }\n });\n ```\n @method extractMeta\n @param {DS.Store} store\n @param {DS.Model} modelClass\n @param {Object} payload\n */\n extractMeta(store, modelClass, payload) {\n if (payload && payload['meta'] !== undefined) {\n var meta = payload.meta;\n delete payload.meta;\n return meta;\n }\n },\n\n /**\n `extractErrors` is used to extract model errors when a call\n to `DS.Model#save` fails with an `InvalidError`. By default\n Ember Data expects error information to be located on the `errors`\n property of the payload object.\n This serializer expects this `errors` object to be an Array similar\n to the following, compliant with the JSON-API specification:\n ```js\n {\n \"errors\": [\n {\n \"detail\": \"This username is already taken!\",\n \"source\": {\n \"pointer\": \"data/attributes/username\"\n }\n }, {\n \"detail\": \"Doesn't look like a valid email.\",\n \"source\": {\n \"pointer\": \"data/attributes/email\"\n }\n }\n ]\n }\n ```\n The key `detail` provides a textual description of the problem.\n Alternatively, the key `title` can be used for the same purpose.\n The nested keys `source.pointer` detail which specific element\n of the request data was invalid.\n Note that JSON-API also allows for object-level errors to be placed\n in an object with pointer `data`, signifying that the problem\n cannot be traced to a specific attribute:\n ```javascript\n {\n \"errors\": [\n {\n \"detail\": \"Some generic non property error message\",\n \"source\": {\n \"pointer\": \"data\"\n }\n }\n ]\n }\n ```\n When turn into a `DS.Errors` object, you can read these errors\n through the property `base`:\n ```handlebars\n {{#each model.errors.base as |error|}}\n <div class=\"error\">\n {{error.message}}\n </div>\n {{/each}}\n ```\n Example of alternative implementation, overriding the default\n behavior to deal with a different format of errors:\n ```app/serializers/post.js\n import DS from 'ember-data';\n export default DS.JSONSerializer.extend({\n extractErrors(store, typeClass, payload, id) {\n if (payload && typeof payload === 'object' && payload._problems) {\n payload = payload._problems;\n this.normalizeErrors(typeClass, payload);\n }\n return payload;\n }\n });\n ```\n @method extractErrors\n @param {DS.Store} store\n @param {DS.Model} typeClass\n @param {Object} payload\n @param {(String|Number)} id\n @return {Object} json The deserialized errors\n */\n extractErrors(store, typeClass, payload, id) {\n if (payload && typeof payload === 'object' && payload.errors) {\n payload = (0, _private.errorsArrayToHash)(payload.errors);\n\n this.normalizeUsingDeclaredMapping(typeClass, payload);\n\n typeClass.eachAttribute(name => {\n var key = this.keyForAttribute(name, 'deserialize');\n if (key !== name && payload[key] !== undefined) {\n payload[name] = payload[key];\n delete payload[key];\n }\n });\n\n typeClass.eachRelationship(name => {\n var key = this.keyForRelationship(name, 'deserialize');\n if (key !== name && payload[key] !== undefined) {\n payload[name] = payload[key];\n delete payload[key];\n }\n });\n }\n\n return payload;\n },\n\n /**\n `keyForAttribute` can be used to define rules for how to convert an\n attribute name in your model to a key in your JSON.\n Example\n ```app/serializers/application.js\n import DS from 'ember-data';\n import { underscore } from '@ember/string';\n export default DS.RESTSerializer.extend({\n keyForAttribute(attr, method) {\n return underscore(attr).toUpperCase();\n }\n });\n ```\n @method keyForAttribute\n @param {String} key\n @param {String} method\n @return {String} normalized key\n */\n keyForAttribute(key, method) {\n return key;\n },\n\n /**\n `keyForRelationship` can be used to define a custom key when\n serializing and deserializing relationship properties. By default\n `JSONSerializer` does not provide an implementation of this method.\n Example\n ```app/serializers/post.js\n import DS from 'ember-data';\n import { underscore } from '@ember/string';\n export default DS.JSONSerializer.extend({\n keyForRelationship(key, relationship, method) {\n return `rel_${underscore(key)}`;\n }\n });\n ```\n @method keyForRelationship\n @param {String} key\n @param {String} typeClass\n @param {String} method\n @return {String} normalized key\n */\n keyForRelationship(key, typeClass, method) {\n return key;\n },\n\n /**\n `keyForLink` can be used to define a custom key when deserializing link\n properties.\n @method keyForLink\n @param {String} key\n @param {String} kind `belongsTo` or `hasMany`\n @return {String} normalized key\n */\n keyForLink(key, kind) {\n return key;\n },\n\n // HELPERS\n\n /**\n @method transformFor\n @private\n @param {String} attributeType\n @param {Boolean} skipAssertion\n @return {DS.Transform} transform\n */\n transformFor(attributeType, skipAssertion) {\n var transform = (0, _private.getOwner)(this).lookup('transform:' + attributeType);\n\n (true && !(skipAssertion || !!transform) && Ember.assert(\"Unable to find transform for '\" + attributeType + \"'\", skipAssertion || !!transform));\n\n\n return transform;\n }\n });\n\n if ((0, _private.isEnabled)(\"ds-payload-type-hooks\")) {\n\n JSONSerializer.reopen({\n\n /**\n @method modelNameFromPayloadType\n @public\n @param {String} type\n @return {String} the model's modelName\n */\n modelNameFromPayloadType(type) {\n return (0, _private.normalizeModelName)(type);\n },\n\n _hasCustomModelNameFromPayloadKey() {\n return this.modelNameFromPayloadKey !== JSONSerializer.prototype.modelNameFromPayloadKey;\n }\n\n });\n }\n\n if ((0, _private.isEnabled)(\"ds-serialize-id\")) {\n\n JSONSerializer.reopen({\n\n /**\n serializeId can be used to customize how id is serialized\n For example, your server may expect integer datatype of id\n By default the snapshot's id (String) is set on the json hash via json[primaryKey] = snapshot.id.\n ```app/serializers/application.js\n import DS from 'ember-data';\n export default DS.JSONSerializer.extend({\n serializeId(snapshot, json, primaryKey) {\n var id = snapshot.id;\n json[primaryKey] = parseInt(id, 10);\n }\n });\n ```\n @method serializeId\n @public\n @param {DS.Snapshot} snapshot\n @param {Object} json\n @param {String} primaryKey\n */\n serializeId(snapshot, json, primaryKey) {\n var id = snapshot.id;\n\n if (id) {\n json[primaryKey] = id;\n }\n }\n });\n }\n\n exports.default = JSONSerializer;\n});","define('ember-data/serializers/rest', ['exports', 'ember-inflector', 'ember-data/serializers/json', 'ember-data/-private'], function (exports, _emberInflector, _json, _private) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n\n /**\n Normally, applications will use the `RESTSerializer` by implementing\n the `normalize` method.\n \n This allows you to do whatever kind of munging you need, and is\n especially useful if your server is inconsistent and you need to\n do munging differently for many different kinds of responses.\n \n See the `normalize` documentation for more information.\n \n ## Across the Board Normalization\n \n There are also a number of hooks that you might find useful to define\n across-the-board rules for your payload. These rules will be useful\n if your server is consistent, or if you're building an adapter for\n an infrastructure service, like Firebase, and want to encode service\n conventions.\n \n For example, if all of your keys are underscored and all-caps, but\n otherwise consistent with the names you use in your models, you\n can implement across-the-board rules for how to convert an attribute\n name in your model to a key in your JSON.\n \n ```app/serializers/application.js\n import DS from 'ember-data';\n import { underscore } from '@ember/string';\n \n export default DS.RESTSerializer.extend({\n keyForAttribute(attr, method) {\n return underscore(attr).toUpperCase();\n }\n });\n ```\n \n You can also implement `keyForRelationship`, which takes the name\n of the relationship as the first parameter, the kind of\n relationship (`hasMany` or `belongsTo`) as the second parameter, and\n the method (`serialize` or `deserialize`) as the third parameter.\n \n @class RESTSerializer\n @namespace DS\n @extends DS.JSONSerializer\n */\n /**\n @module ember-data\n */\n\n var RESTSerializer = _json.default.extend({\n\n /**\n `keyForPolymorphicType` can be used to define a custom key when\n serializing and deserializing a polymorphic type. By default, the\n returned key is `${key}Type`.\n Example\n ```app/serializers/post.js\n import DS from 'ember-data';\n export default DS.RESTSerializer.extend({\n keyForPolymorphicType(key, relationship) {\n var relationshipKey = this.keyForRelationship(key);\n return 'type-' + relationshipKey;\n }\n });\n ```\n @method keyForPolymorphicType\n @param {String} key\n @param {String} typeClass\n @param {String} method\n @return {String} normalized key\n */\n keyForPolymorphicType(key, typeClass, method) {\n var relationshipKey = this.keyForRelationship(key);\n\n return `${relationshipKey}Type`;\n },\n\n /**\n Normalizes a part of the JSON payload returned by\n the server. You should override this method, munge the hash\n and call super if you have generic normalization to do.\n It takes the type of the record that is being normalized\n (as a DS.Model class), the property where the hash was\n originally found, and the hash to normalize.\n For example, if you have a payload that looks like this:\n ```js\n {\n \"post\": {\n \"id\": 1,\n \"title\": \"Rails is omakase\",\n \"comments\": [ 1, 2 ]\n },\n \"comments\": [{\n \"id\": 1,\n \"body\": \"FIRST\"\n }, {\n \"id\": 2,\n \"body\": \"Rails is unagi\"\n }]\n }\n ```\n The `normalize` method will be called three times:\n * With `App.Post`, `\"posts\"` and `{ id: 1, title: \"Rails is omakase\", ... }`\n * With `App.Comment`, `\"comments\"` and `{ id: 1, body: \"FIRST\" }`\n * With `App.Comment`, `\"comments\"` and `{ id: 2, body: \"Rails is unagi\" }`\n You can use this method, for example, to normalize underscored keys to camelized\n or other general-purpose normalizations. You will only need to implement\n `normalize` and manipulate the payload as desired.\n For example, if the `IDs` under `\"comments\"` are provided as `_id` instead of\n `id`, you can specify how to normalize just the comments:\n ```app/serializers/post.js\n import DS from 'ember-data';\n export default DS.RESTSerializer.extend({\n normalize(model, hash, prop) {\n if (prop === 'comments') {\n hash.id = hash._id;\n delete hash._id;\n }\n return this._super(...arguments);\n }\n });\n ```\n On each call to the `normalize` method, the third parameter (`prop`) is always\n one of the keys that were in the original payload or in the result of another\n normalization as `normalizeResponse`.\n @method normalize\n @param {DS.Model} modelClass\n @param {Object} resourceHash\n @param {String} prop\n @return {Object}\n */\n\n /**\n Normalizes an array of resource payloads and returns a JSON-API Document\n with primary data and, if any, included data as `{ data, included }`.\n @method _normalizeArray\n @param {DS.Store} store\n @param {String} modelName\n @param {Object} arrayHash\n @param {String} prop\n @return {Object}\n @private\n */\n _normalizeArray(store, modelName, arrayHash, prop) {\n var documentHash = {\n data: [],\n included: []\n };\n\n var modelClass = store.modelFor(modelName);\n var serializer = store.serializerFor(modelName);\n\n Ember.makeArray(arrayHash).forEach(hash => {\n var { data, included } = this._normalizePolymorphicRecord(store, hash, prop, modelClass, serializer);\n documentHash.data.push(data);\n if (included) {\n documentHash.included.push(...included);\n }\n });\n\n return documentHash;\n },\n\n _normalizePolymorphicRecord(store, hash, prop, primaryModelClass, primarySerializer) {\n var serializer = primarySerializer;\n var modelClass = primaryModelClass;\n\n var primaryHasTypeAttribute = (0, _private.modelHasAttributeOrRelationshipNamedType)(primaryModelClass);\n\n if (!primaryHasTypeAttribute && hash.type) {\n // Support polymorphic records in async relationships\n var modelName = void 0;\n if ((0, _private.isEnabled)(\"ds-payload-type-hooks\")) {\n modelName = this.modelNameFromPayloadType(hash.type);\n var deprecatedModelNameLookup = this.modelNameFromPayloadKey(hash.type);\n\n if (modelName !== deprecatedModelNameLookup && !this._hasCustomModelNameFromPayloadType() && this._hasCustomModelNameFromPayloadKey()) {\n (true && !(false) && Ember.deprecate(\"You are using modelNameFromPayloadKey to normalize the type for a polymorphic relationship. This is has been deprecated in favor of modelNameFromPayloadType\", false, {\n id: 'ds.rest-serializer.deprecated-model-name-for-polymorphic-type',\n until: '3.0.0'\n }));\n\n\n modelName = deprecatedModelNameLookup;\n }\n } else {\n modelName = this.modelNameFromPayloadKey(hash.type);\n }\n\n if (store._hasModelFor(modelName)) {\n serializer = store.serializerFor(modelName);\n modelClass = store.modelFor(modelName);\n }\n }\n\n return serializer.normalize(modelClass, hash, prop);\n },\n\n /*\n @method _normalizeResponse\n @param {DS.Store} store\n @param {DS.Model} primaryModelClass\n @param {Object} payload\n @param {String|Number} id\n @param {String} requestType\n @param {Boolean} isSingle\n @return {Object} JSON-API Document\n @private\n */\n _normalizeResponse(store, primaryModelClass, payload, id, requestType, isSingle) {\n var documentHash = {\n data: null,\n included: []\n };\n\n var meta = this.extractMeta(store, primaryModelClass, payload);\n if (meta) {\n (true && !(Ember.typeOf(meta) === 'object') && Ember.assert('The `meta` returned from `extractMeta` has to be an object, not \"' + Ember.typeOf(meta) + '\".', Ember.typeOf(meta) === 'object'));\n\n documentHash.meta = meta;\n }\n\n var keys = Object.keys(payload);\n\n for (var i = 0, length = keys.length; i < length; i++) {\n var prop = keys[i];\n var modelName = prop;\n var forcedSecondary = false;\n\n /*\n If you want to provide sideloaded records of the same type that the\n primary data you can do that by prefixing the key with `_`.\n Example\n ```\n {\n users: [\n { id: 1, title: 'Tom', manager: 3 },\n { id: 2, title: 'Yehuda', manager: 3 }\n ],\n _users: [\n { id: 3, title: 'Tomster' }\n ]\n }\n ```\n This forces `_users` to be added to `included` instead of `data`.\n */\n if (prop.charAt(0) === '_') {\n forcedSecondary = true;\n modelName = prop.substr(1);\n }\n\n var typeName = this.modelNameFromPayloadKey(modelName);\n if (!store.modelFactoryFor(typeName)) {\n (true && Ember.warn(this.warnMessageNoModelForKey(modelName, typeName), false, {\n id: 'ds.serializer.model-for-key-missing'\n }));\n\n continue;\n }\n\n var isPrimary = !forcedSecondary && this.isPrimaryType(store, typeName, primaryModelClass);\n var value = payload[prop];\n\n if (value === null) {\n continue;\n }\n\n if (true) {\n var isQueryRecordAnArray = requestType === 'queryRecord' && isPrimary && Array.isArray(value);\n var message = \"The adapter returned an array for the primary data of a `queryRecord` response. This is deprecated as `queryRecord` should return a single record.\";\n\n (true && !(!isQueryRecordAnArray) && Ember.deprecate(message, !isQueryRecordAnArray, {\n id: 'ds.serializer.rest.queryRecord-array-response',\n until: '3.0'\n }));\n }\n\n /*\n Support primary data as an object instead of an array.\n Example\n ```\n {\n user: { id: 1, title: 'Tom', manager: 3 }\n }\n ```\n */\n if (isPrimary && !Array.isArray(value)) {\n var { data: _data, included: _included } = this._normalizePolymorphicRecord(store, value, prop, primaryModelClass, this);\n documentHash.data = _data;\n if (_included) {\n documentHash.included.push(..._included);\n }\n continue;\n }\n\n var { data, included } = this._normalizeArray(store, typeName, value, prop);\n\n if (included) {\n documentHash.included.push(...included);\n }\n\n if (isSingle) {\n data.forEach(resource => {\n\n /*\n Figures out if this is the primary record or not.\n It's either:\n 1. The record with the same ID as the original request\n 2. If it's a newly created record without an ID, the first record\n in the array\n */\n var isUpdatedRecord = isPrimary && (0, _private.coerceId)(resource.id) === id;\n var isFirstCreatedRecord = isPrimary && !id && !documentHash.data;\n\n if (isFirstCreatedRecord || isUpdatedRecord) {\n documentHash.data = resource;\n } else {\n documentHash.included.push(resource);\n }\n });\n } else {\n if (isPrimary) {\n documentHash.data = data;\n } else {\n if (data) {\n documentHash.included.push(...data);\n }\n }\n }\n }\n\n return documentHash;\n },\n\n isPrimaryType(store, typeName, primaryTypeClass) {\n return store.modelFor(typeName) === primaryTypeClass;\n },\n\n /**\n This method allows you to push a payload containing top-level\n collections of records organized per type.\n ```js\n {\n \"posts\": [{\n \"id\": \"1\",\n \"title\": \"Rails is omakase\",\n \"author\", \"1\",\n \"comments\": [ \"1\" ]\n }],\n \"comments\": [{\n \"id\": \"1\",\n \"body\": \"FIRST\"\n }],\n \"users\": [{\n \"id\": \"1\",\n \"name\": \"@d2h\"\n }]\n }\n ```\n It will first normalize the payload, so you can use this to push\n in data streaming in from your server structured the same way\n that fetches and saves are structured.\n @method pushPayload\n @param {DS.Store} store\n @param {Object} payload\n */\n pushPayload(store, payload) {\n var documentHash = {\n data: [],\n included: []\n };\n\n for (var prop in payload) {\n var modelName = this.modelNameFromPayloadKey(prop);\n if (!store.modelFactoryFor(modelName)) {\n (true && Ember.warn(this.warnMessageNoModelForKey(prop, modelName), false, {\n id: 'ds.serializer.model-for-key-missing'\n }));\n\n continue;\n }\n var type = store.modelFor(modelName);\n var typeSerializer = store.serializerFor(type.modelName);\n\n Ember.makeArray(payload[prop]).forEach(hash => {\n var { data, included } = typeSerializer.normalize(type, hash, prop);\n documentHash.data.push(data);\n if (included) {\n documentHash.included.push(...included);\n }\n });\n }\n\n if ((0, _private.isEnabled)('ds-pushpayload-return')) {\n return store.push(documentHash);\n } else {\n store.push(documentHash);\n }\n },\n\n /**\n This method is used to convert each JSON root key in the payload\n into a modelName that it can use to look up the appropriate model for\n that part of the payload.\n For example, your server may send a model name that does not correspond with\n the name of the model in your app. Let's take a look at an example model,\n and an example payload:\n ```app/models/post.js\n import DS from 'ember-data';\n export default DS.Model.extend({\n });\n ```\n ```javascript\n {\n \"blog/post\": {\n \"id\": \"1\n }\n }\n ```\n Ember Data is going to normalize the payload's root key for the modelName. As a result,\n it will try to look up the \"blog/post\" model. Since we don't have a model called \"blog/post\"\n (or a file called app/models/blog/post.js in ember-cli), Ember Data will throw an error\n because it cannot find the \"blog/post\" model.\n Since we want to remove this namespace, we can define a serializer for the application that will\n remove \"blog/\" from the payload key whenver it's encountered by Ember Data:\n ```app/serializers/application.js\n import DS from 'ember-data';\n export default DS.RESTSerializer.extend({\n modelNameFromPayloadKey(payloadKey) {\n if (payloadKey === 'blog/post') {\n return this._super(payloadKey.replace('blog/', ''));\n } else {\n return this._super(payloadKey);\n }\n }\n });\n ```\n After refreshing, Ember Data will appropriately look up the \"post\" model.\n By default the modelName for a model is its\n name in dasherized form. This means that a payload key like \"blogPost\" would be\n normalized to \"blog-post\" when Ember Data looks up the model. Usually, Ember Data\n can use the correct inflection to do this for you. Most of the time, you won't\n need to override `modelNameFromPayloadKey` for this purpose.\n @method modelNameFromPayloadKey\n @param {String} key\n @return {String} the model's modelName\n */\n modelNameFromPayloadKey(key) {\n return (0, _emberInflector.singularize)((0, _private.normalizeModelName)(key));\n },\n\n // SERIALIZE\n\n /**\n Called when a record is saved in order to convert the\n record into JSON.\n By default, it creates a JSON object with a key for\n each attribute and belongsTo relationship.\n For example, consider this model:\n ```app/models/comment.js\n import DS from 'ember-data';\n export default DS.Model.extend({\n title: DS.attr(),\n body: DS.attr(),\n author: DS.belongsTo('user')\n });\n ```\n The default serialization would create a JSON object like:\n ```js\n {\n \"title\": \"Rails is unagi\",\n \"body\": \"Rails? Omakase? O_O\",\n \"author\": 12\n }\n ```\n By default, attributes are passed through as-is, unless\n you specified an attribute type (`DS.attr('date')`). If\n you specify a transform, the JavaScript value will be\n serialized when inserted into the JSON hash.\n By default, belongs-to relationships are converted into\n IDs when inserted into the JSON hash.\n ## IDs\n `serialize` takes an options hash with a single option:\n `includeId`. If this option is `true`, `serialize` will,\n by default include the ID in the JSON object it builds.\n The adapter passes in `includeId: true` when serializing\n a record for `createRecord`, but not for `updateRecord`.\n ## Customization\n Your server may expect a different JSON format than the\n built-in serialization format.\n In that case, you can implement `serialize` yourself and\n return a JSON hash of your choosing.\n ```app/serializers/post.js\n import DS from 'ember-data';\n export default DS.RESTSerializer.extend({\n serialize(snapshot, options) {\n var json = {\n POST_TTL: snapshot.attr('title'),\n POST_BDY: snapshot.attr('body'),\n POST_CMS: snapshot.hasMany('comments', { ids: true })\n };\n if (options.includeId) {\n json.POST_ID_ = snapshot.id;\n }\n return json;\n }\n });\n ```\n ## Customizing an App-Wide Serializer\n If you want to define a serializer for your entire\n application, you'll probably want to use `eachAttribute`\n and `eachRelationship` on the record.\n ```app/serializers/application.js\n import DS from 'ember-data';\n import { pluralize } from 'ember-inflector';\n export default DS.RESTSerializer.extend({\n serialize(snapshot, options) {\n var json = {};\n snapshot.eachAttribute(function(name) {\n json[serverAttributeName(name)] = snapshot.attr(name);\n });\n snapshot.eachRelationship(function(name, relationship) {\n if (relationship.kind === 'hasMany') {\n json[serverHasManyName(name)] = snapshot.hasMany(name, { ids: true });\n }\n });\n if (options.includeId) {\n json.ID_ = snapshot.id;\n }\n return json;\n }\n });\n function serverAttributeName(attribute) {\n return attribute.underscore().toUpperCase();\n }\n function serverHasManyName(name) {\n return serverAttributeName(singularize(name)) + \"_IDS\";\n }\n ```\n This serializer will generate JSON that looks like this:\n ```js\n {\n \"TITLE\": \"Rails is omakase\",\n \"BODY\": \"Yep. Omakase.\",\n \"COMMENT_IDS\": [ 1, 2, 3 ]\n }\n ```\n ## Tweaking the Default JSON\n If you just want to do some small tweaks on the default JSON,\n you can call super first and make the tweaks on the returned\n JSON.\n ```app/serializers/post.js\n import DS from 'ember-data';\n export default DS.RESTSerializer.extend({\n serialize(snapshot, options) {\n var json = this._super(snapshot, options);\n json.subject = json.title;\n delete json.title;\n return json;\n }\n });\n ```\n @method serialize\n @param {DS.Snapshot} snapshot\n @param {Object} options\n @return {Object} json\n */\n serialize(snapshot, options) {\n return this._super(...arguments);\n },\n\n /**\n You can use this method to customize the root keys serialized into the JSON.\n The hash property should be modified by reference (possibly using something like _.extend)\n By default the REST Serializer sends the modelName of a model, which is a camelized\n version of the name.\n For example, your server may expect underscored root objects.\n ```app/serializers/application.js\n import DS from 'ember-data';\n import { decamelize } from '@ember/string';\n export default DS.RESTSerializer.extend({\n serializeIntoHash(data, type, record, options) {\n var root = decamelize(type.modelName);\n data[root] = this.serialize(record, options);\n }\n });\n ```\n @method serializeIntoHash\n @param {Object} hash\n @param {DS.Model} typeClass\n @param {DS.Snapshot} snapshot\n @param {Object} options\n */\n serializeIntoHash(hash, typeClass, snapshot, options) {\n var normalizedRootKey = this.payloadKeyFromModelName(typeClass.modelName);\n hash[normalizedRootKey] = this.serialize(snapshot, options);\n },\n\n /**\n You can use `payloadKeyFromModelName` to override the root key for an outgoing\n request. By default, the RESTSerializer returns a camelized version of the\n model's name.\n For a model called TacoParty, its `modelName` would be the string `taco-party`. The RESTSerializer\n will send it to the server with `tacoParty` as the root key in the JSON payload:\n ```js\n {\n \"tacoParty\": {\n \"id\": \"1\",\n \"location\": \"Matthew Beale's House\"\n }\n }\n ```\n For example, your server may expect dasherized root objects:\n ```app/serializers/application.js\n import DS from 'ember-data';\n import { dasherize } from '@ember/string';\n export default DS.RESTSerializer.extend({\n payloadKeyFromModelName(modelName) {\n return dasherize(modelName);\n }\n });\n ```\n Given a `TacoParty` model, calling `save` on it would produce an outgoing\n request like:\n ```js\n {\n \"taco-party\": {\n \"id\": \"1\",\n \"location\": \"Matthew Beale's House\"\n }\n }\n ```\n @method payloadKeyFromModelName\n @param {String} modelName\n @return {String}\n */\n payloadKeyFromModelName(modelName) {\n return Ember.String.camelize(modelName);\n },\n\n /**\n You can use this method to customize how polymorphic objects are serialized.\n By default the REST Serializer creates the key by appending `Type` to\n the attribute and value from the model's camelcased model name.\n @method serializePolymorphicType\n @param {DS.Snapshot} snapshot\n @param {Object} json\n @param {Object} relationship\n */\n serializePolymorphicType(snapshot, json, relationship) {\n var key = relationship.key;\n var typeKey = this.keyForPolymorphicType(key, relationship.type, 'serialize');\n var belongsTo = snapshot.belongsTo(key);\n\n if (Ember.isNone(belongsTo)) {\n json[typeKey] = null;\n } else {\n if ((0, _private.isEnabled)(\"ds-payload-type-hooks\")) {\n json[typeKey] = this.payloadTypeFromModelName(belongsTo.modelName);\n } else {\n json[typeKey] = Ember.String.camelize(belongsTo.modelName);\n }\n }\n },\n\n /**\n You can use this method to customize how a polymorphic relationship should\n be extracted.\n @method extractPolymorphicRelationship\n @param {Object} relationshipType\n @param {Object} relationshipHash\n @param {Object} relationshipOptions\n @return {Object}\n */\n extractPolymorphicRelationship(relationshipType, relationshipHash, relationshipOptions) {\n var { key, resourceHash, relationshipMeta } = relationshipOptions;\n\n // A polymorphic belongsTo relationship can be present in the payload\n // either in the form where the `id` and the `type` are given:\n //\n // {\n // message: { id: 1, type: 'post' }\n // }\n //\n // or by the `id` and a `<relationship>Type` attribute:\n //\n // {\n // message: 1,\n // messageType: 'post'\n // }\n //\n // The next code checks if the latter case is present and returns the\n // corresponding JSON-API representation. The former case is handled within\n // the base class JSONSerializer.\n var isPolymorphic = relationshipMeta.options.polymorphic;\n var typeProperty = this.keyForPolymorphicType(key, relationshipType, 'deserialize');\n\n if (isPolymorphic && resourceHash[typeProperty] !== undefined && typeof relationshipHash !== 'object') {\n\n if ((0, _private.isEnabled)(\"ds-payload-type-hooks\")) {\n\n var payloadType = resourceHash[typeProperty];\n var type = this.modelNameFromPayloadType(payloadType);\n var deprecatedTypeLookup = this.modelNameFromPayloadKey(payloadType);\n\n if (payloadType !== deprecatedTypeLookup && !this._hasCustomModelNameFromPayloadType() && this._hasCustomModelNameFromPayloadKey()) {\n (true && !(false) && Ember.deprecate(\"You are using modelNameFromPayloadKey to normalize the type for a polymorphic relationship. This has been deprecated in favor of modelNameFromPayloadType\", false, {\n id: 'ds.rest-serializer.deprecated-model-name-for-polymorphic-type',\n until: '3.0.0'\n }));\n\n\n type = deprecatedTypeLookup;\n }\n\n return {\n id: relationshipHash,\n type: type\n };\n } else {\n\n var _type = this.modelNameFromPayloadKey(resourceHash[typeProperty]);\n return {\n id: relationshipHash,\n type: _type\n };\n }\n }\n\n return this._super(...arguments);\n }\n });\n\n if ((0, _private.isEnabled)(\"ds-payload-type-hooks\")) {\n\n RESTSerializer.reopen({\n\n /**\n `modelNameFromPayloadType` can be used to change the mapping for a DS model\n name, taken from the value in the payload.\n Say your API namespaces the type of a model and returns the following\n payload for the `post` model, which has a polymorphic `user` relationship:\n ```javascript\n // GET /api/posts/1\n {\n \"post\": {\n \"id\": 1,\n \"user\": 1,\n \"userType: \"api::v1::administrator\"\n }\n }\n ```\n By overwriting `modelNameFromPayloadType` you can specify that the\n `administrator` model should be used:\n ```app/serializers/application.js\n import DS from 'ember-data';\n export default DS.RESTSerializer.extend({\n modelNameFromPayloadType(payloadType) {\n return payloadType.replace('api::v1::', '');\n }\n });\n ```\n By default the modelName for a model is its name in dasherized form.\n Usually, Ember Data can use the correct inflection to do this for you. Most\n of the time, you won't need to override `modelNameFromPayloadType` for this\n purpose.\n Also take a look at\n [payloadTypeFromModelName](#method_payloadTypeFromModelName) to customize\n how the type of a record should be serialized.\n @method modelNameFromPayloadType\n @public\n @param {String} payloadType type from payload\n @return {String} modelName\n */\n modelNameFromPayloadType(payloadType) {\n return (0, _emberInflector.singularize)((0, _private.normalizeModelName)(payloadType));\n },\n\n /**\n `payloadTypeFromModelName` can be used to change the mapping for the type in\n the payload, taken from the model name.\n Say your API namespaces the type of a model and expects the following\n payload when you update the `post` model, which has a polymorphic `user`\n relationship:\n ```javascript\n // POST /api/posts/1\n {\n \"post\": {\n \"id\": 1,\n \"user\": 1,\n \"userType\": \"api::v1::administrator\"\n }\n }\n ```\n By overwriting `payloadTypeFromModelName` you can specify that the\n namespaces model name for the `administrator` should be used:\n ```app/serializers/application.js\n import DS from 'ember-data';\n export default DS.RESTSerializer.extend({\n payloadTypeFromModelName(modelName) {\n return 'api::v1::' + modelName;\n }\n });\n ```\n By default the payload type is the camelized model name. Usually, Ember\n Data can use the correct inflection to do this for you. Most of the time,\n you won't need to override `payloadTypeFromModelName` for this purpose.\n Also take a look at\n [modelNameFromPayloadType](#method_modelNameFromPayloadType) to customize\n how the model name from should be mapped from the payload.\n @method payloadTypeFromModelName\n @public\n @param {String} modelName modelName from the record\n @return {String} payloadType\n */\n payloadTypeFromModelName(modelName) {\n return Ember.String.camelize(modelName);\n },\n\n _hasCustomModelNameFromPayloadKey() {\n return this.modelNameFromPayloadKey !== RESTSerializer.prototype.modelNameFromPayloadKey;\n },\n\n _hasCustomModelNameFromPayloadType() {\n return this.modelNameFromPayloadType !== RESTSerializer.prototype.modelNameFromPayloadType;\n },\n\n _hasCustomPayloadTypeFromModelName() {\n return this.payloadTypeFromModelName !== RESTSerializer.prototype.payloadTypeFromModelName;\n },\n\n _hasCustomPayloadKeyFromModelName() {\n return this.payloadKeyFromModelName !== RESTSerializer.prototype.payloadKeyFromModelName;\n }\n\n });\n }\n\n if (true) {\n RESTSerializer.reopen({\n warnMessageNoModelForKey(prop, typeKey) {\n return 'Encountered \"' + prop + '\" in payload, but no model was found for model name \"' + typeKey + '\" (resolved model name using ' + this.constructor.toString() + '.modelNameFromPayloadKey(\"' + prop + '\"))';\n }\n });\n }\n\n exports.default = RESTSerializer;\n});","define('ember-data/setup-container', ['exports', 'ember-data/-private', 'ember-data/serializers/json-api', 'ember-data/serializers/json', 'ember-data/serializers/rest', 'ember-data/adapters/json-api', 'ember-data/adapters/rest', 'ember-data/transforms/number', 'ember-data/transforms/date', 'ember-data/transforms/string', 'ember-data/transforms/boolean'], function (exports, _private, _jsonApi, _json, _rest, _jsonApi2, _rest2, _number, _date, _string, _boolean) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = setupContainer;\n\n\n function has(applicationOrRegistry, fullName) {\n if (applicationOrRegistry.has) {\n // < 2.1.0\n return applicationOrRegistry.has(fullName);\n } else {\n // 2.1.0+\n return applicationOrRegistry.hasRegistration(fullName);\n }\n }\n\n /*\n Configures a registry for use with an Ember-Data\n store. Accepts an optional namespace argument.\n \n @method initializeStore\n @param {Ember.Registry} registry\n */\n function initializeStore(registry) {\n var registerOptionsForType = registry.registerOptionsForType || registry.optionsForType;\n registerOptionsForType.call(registry, 'serializer', { singleton: false });\n registerOptionsForType.call(registry, 'adapter', { singleton: false });\n registry.register('serializer:-default', _json.default);\n registry.register('serializer:-rest', _rest.default);\n registry.register('adapter:-rest', _rest2.default);\n\n registry.register('adapter:-json-api', _jsonApi2.default);\n registry.register('serializer:-json-api', _jsonApi.default);\n\n if (!has(registry, 'service:store')) {\n registry.register('service:store', _private.Store);\n }\n }\n\n /*\n Configures a registry with injections on Ember applications\n for the Ember-Data store. Accepts an optional namespace argument.\n \n @method initializeDebugAdapter\n @param {Ember.Registry} registry\n */\n function initializeDataAdapter(registry) {\n registry.register('data-adapter:main', _private.DebugAdapter);\n }\n\n /*\n Configures a registry with injections on Ember applications\n for the Ember-Data store. Accepts an optional namespace argument.\n \n @method initializeStoreInjections\n @param {Ember.Registry} registry\n */\n function initializeStoreInjections(registry) {\n // registry.injection for Ember < 2.1.0\n // application.inject for Ember 2.1.0+\n var inject = registry.inject || registry.injection;\n inject.call(registry, 'controller', 'store', 'service:store');\n inject.call(registry, 'route', 'store', 'service:store');\n inject.call(registry, 'data-adapter', 'store', 'service:store');\n }\n\n /*\n Configures a registry for use with Ember-Data\n transforms.\n \n @method initializeTransforms\n @param {Ember.Registry} registry\n */\n function initializeTransforms(registry) {\n registry.register('transform:boolean', _boolean.default);\n registry.register('transform:date', _date.default);\n registry.register('transform:number', _number.default);\n registry.register('transform:string', _string.default);\n }\n\n function setupContainer(application) {\n initializeDataAdapter(application);\n initializeTransforms(application);\n initializeStoreInjections(application);\n initializeStore(application);\n }\n});","define('ember-data/store', ['exports', 'ember-data/-private'], function (exports, _private) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n Object.defineProperty(exports, 'default', {\n enumerable: true,\n get: function () {\n return _private.Store;\n }\n });\n});","define('ember-data/transform', ['exports', 'ember-data/transforms/transform'], function (exports, _transform) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n Object.defineProperty(exports, 'default', {\n enumerable: true,\n get: function () {\n return _transform.default;\n }\n });\n});","define('ember-data/transforms/boolean', ['exports', 'ember-data/transforms/transform'], function (exports, _transform) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = _transform.default.extend({\n deserialize(serialized, options) {\n if (Ember.isNone(serialized) && options.allowNull === true) {\n return null;\n }\n\n var type = typeof serialized;\n if (type === \"boolean\") {\n return serialized;\n } else if (type === \"string\") {\n return (/^(true|t|1)$/i.test(serialized)\n );\n } else if (type === \"number\") {\n return serialized === 1;\n } else {\n return false;\n }\n },\n\n serialize(deserialized, options) {\n if (Ember.isNone(deserialized) && options.allowNull === true) {\n return null;\n }\n\n return Boolean(deserialized);\n }\n });\n});","define('ember-data/transforms/date', ['exports', 'ember-data/transforms/transform'], function (exports, _transform) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = _transform.default.extend({\n deserialize(serialized) {\n var type = typeof serialized;\n\n if (type === \"string\") {\n var offset = serialized.indexOf('+');\n\n if (offset !== -1 && serialized.length - 5 === offset) {\n offset += 3;\n return new Date(serialized.slice(0, offset) + ':' + serialized.slice(offset));\n }\n return new Date(serialized);\n } else if (type === \"number\") {\n return new Date(serialized);\n } else if (serialized === null || serialized === undefined) {\n // if the value is null return null\n // if the value is not present in the data return undefined\n return serialized;\n } else {\n return null;\n }\n },\n\n serialize(date) {\n if (date instanceof Date && !isNaN(date)) {\n return date.toISOString();\n } else {\n return null;\n }\n }\n });\n});","define('ember-data/transforms/number', ['exports', 'ember-data/transforms/transform'], function (exports, _transform) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n\n\n function isNumber(value) {\n return value === value && value !== Infinity && value !== -Infinity;\n }\n\n /**\n The `DS.NumberTransform` class is used to serialize and deserialize\n numeric attributes on Ember Data record objects. This transform is\n used when `number` is passed as the type parameter to the\n [DS.attr](../../data#method_attr) function.\n \n Usage\n \n ```app/models/score.js\n import DS from 'ember-data';\n \n export default DS.Model.extend({\n value: DS.attr('number'),\n player: DS.belongsTo('player'),\n date: DS.attr('date')\n });\n ```\n \n @class NumberTransform\n @extends DS.Transform\n @namespace DS\n */\n exports.default = _transform.default.extend({\n deserialize(serialized) {\n var transformed = void 0;\n\n if (Ember.isEmpty(serialized)) {\n return null;\n } else {\n transformed = Number(serialized);\n\n return isNumber(transformed) ? transformed : null;\n }\n },\n\n serialize(deserialized) {\n var transformed = void 0;\n\n if (Ember.isEmpty(deserialized)) {\n return null;\n } else {\n transformed = Number(deserialized);\n\n return isNumber(transformed) ? transformed : null;\n }\n }\n });\n});","define('ember-data/transforms/string', ['exports', 'ember-data/transforms/transform'], function (exports, _transform) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = _transform.default.extend({\n deserialize(serialized) {\n return Ember.isNone(serialized) ? null : String(serialized);\n },\n serialize(deserialized) {\n return Ember.isNone(deserialized) ? null : String(deserialized);\n }\n });\n});","define('ember-data/transforms/transform', ['exports'], function (exports) {\n 'use strict';\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = Ember.Object.extend({\n /**\n When given a deserialized value from a record attribute this\n method must return the serialized value.\n Example\n ```javascript\n import { isEmpty } from '@ember/utils';\n serialize(deserialized, options) {\n return isEmpty(deserialized) ? null : Number(deserialized);\n }\n ```\n @method serialize\n @param deserialized The deserialized value\n @param options hash of options passed to `DS.attr`\n @return The serialized value\n */\n serialize: null,\n\n /**\n When given a serialize value from a JSON object this method must\n return the deserialized value for the record attribute.\n Example\n ```javascript\n deserialize(serialized, options) {\n return empty(serialized) ? null : Number(serialized);\n }\n ```\n @method deserialize\n @param serialized The serialized value\n @param options hash of options passed to `DS.attr`\n @return The deserialized value\n */\n deserialize: null\n });\n});","define(\"ember-data/version\", [\"exports\"], function (exports) {\n \"use strict\";\n\n Object.defineProperty(exports, \"__esModule\", {\n value: true\n });\n exports.default = \"3.0.2\";\n});","\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9UA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC3nUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACv1OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpgBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC73BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACr5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5XA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACllBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzYA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5UA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChcA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvlBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/rBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3TA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9WA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChEA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzJA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1bA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzBA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvcA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9gNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtQA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxDA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1uBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACp5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3cA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3mBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrYA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChYA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7NA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7XA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvEA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrsBA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9VA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxfA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACz2CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClqBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnhEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5yEA;;;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjFA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1TA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjDA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvaA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/haA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrhBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3UA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACv3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9dA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7uBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC73CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACp1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;","file":"vendor.js"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/index.html b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/index.html
new file mode 100644
index 0000000000..d06170221d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/index.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <title>Quickstart</title>
+ <meta name="description" content="">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+
+
+<meta name="quickstart/config/environment" content="%7B%22modulePrefix%22%3A%22quickstart%22%2C%22environment%22%3A%22development%22%2C%22locationType%22%3A%22auto%22%2C%22EmberENV%22%3A%7B%22FEATURES%22%3A%7B%7D%2C%22EXTEND_PROTOTYPES%22%3A%7B%22Date%22%3Afalse%7D%7D%2C%22APP%22%3A%7B%22name%22%3A%22quickstart%22%2C%22version%22%3A%220.0.0+1dde1d7f%22%7D%2C%22rootURL%22%3A%22/browser/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/%22%2C%22exportApplicationGlobal%22%3Atrue%7D" />
+
+ <link integrity="" rel="stylesheet" href="/browser/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/vendor.css">
+ <link integrity="" rel="stylesheet" href="/browser/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/quickstart.css">
+
+
+ </head>
+ <body>
+
+
+ <script src="/browser/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/vendor.js"></script>
+ <script src="/browser/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/assets/quickstart.js"></script>
+
+
+ </body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/robots.txt b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/robots.txt
new file mode 100644
index 0000000000..f5916452e5
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/robots.txt
@@ -0,0 +1,3 @@
+# http://www.robotstxt.org
+User-agent: *
+Disallow:
diff --git a/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/testem.js b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/testem.js
new file mode 100644
index 0000000000..cb666df67c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/ember/quickstart/dist/testem.js
@@ -0,0 +1,19 @@
+/*
+ * This is dummy file that exists for the sole purpose
+ * of allowing tests to run directly in the browser as
+ * well as by Testem.
+ *
+ * Testem is configured to run tests directly against
+ * the test build of index.html, which requires a
+ * snippet to load the testem.js file:
+ * <script src="/testem.js"></script>
+ * This has to go before the qunit framework and app
+ * tests are loaded.
+ *
+ * Testem internally supplies this file. However, if you
+ * run the tests directly in the browser (localhost:8000/tests),
+ * this file does not exist.
+ *
+ * Hence the purpose of this fake file. This file is served
+ * directly from the express server to satisify the script load.
+ */
diff --git a/devtools/client/debugger/test/mochitest/examples/entry.js b/devtools/client/debugger/test/mochitest/examples/entry.js
new file mode 100644
index 0000000000..d397a966ba
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/entry.js
@@ -0,0 +1,16 @@
+const times2 = require("./times2");
+const { output } = require("./output");
+const opts = require("./opts");
+
+output(times2(1));
+output(times2(2));
+
+if(opts.extra) {
+ output(times2(3));
+}
+
+window.keepMeAlive = function() {
+ // This function exists to make sure this script is never garbage
+ // collected. It is also callable from tests.
+ return times2(4);
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/event-breakpoints.js b/devtools/client/debugger/test/mochitest/examples/event-breakpoints.js
new file mode 100644
index 0000000000..f9aa16b858
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/event-breakpoints.js
@@ -0,0 +1,94 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+document.getElementById("click-button").onmousedown = clickHandler;
+function clickHandler() {
+ document.getElementById("click-target").click();
+}
+
+document.getElementById("click-target").onclick = clickTargetClicked;
+function clickTargetClicked() {
+ console.log("clicked");
+}
+
+document.getElementById("xhr-button").onmousedown = xhrHandler;
+function xhrHandler() {
+ var xhr = new XMLHttpRequest();
+ xhr.open("GET", "doc-event-breakpoints.html", true);
+ xhr.onload = function () {
+ console.log("xhr load");
+ };
+ xhr.send();
+}
+
+document.getElementById("timer-button").onmousedown = timerHandler;
+function timerHandler() {
+ setTimeout(() => {
+ console.log("timer callback");
+ }, 50);
+ console.log("timer set");
+}
+
+document.getElementById("eval-button").onmousedown = evalHandler;
+function evalHandler() {
+ eval(`
+ console.log("eval ran");
+ //# sourceURL=https://example.com/eval-test.js
+ `);
+}
+
+document.getElementById("focus-text").addEventListener("focusin", inputFocused);
+function inputFocused() {
+ console.log("focused");
+}
+
+document.getElementById("focus-text").addEventListener("focusout", inputFocusOut);
+function inputFocusOut() {
+ console.log("focus lost");
+}
+
+document.getElementById("focus-text").addEventListener("compositionstart", inputCompositionStart);
+function inputCompositionStart() {
+ console.log("composition start");
+}
+
+document.getElementById("focus-text").addEventListener("compositionupdate", inputCompositionUpdate);
+function inputCompositionUpdate() {
+ console.log("composition update");
+}
+
+document.getElementById("focus-text").addEventListener("compositionend", inputCompositionEnd);
+function inputCompositionEnd() {
+ console.log("composition end");
+}
+
+document.addEventListener("scrollend", onScrollEnd);
+function onScrollEnd() {
+ console.log("scroll end");
+}
+
+document.getElementById("invokee").addEventListener("invoke", onInvoke);
+function onInvoke(event) {
+ console.log(event);
+}
+
+window.addEventListener("beforeunload", onBeforeUnload);
+function onBeforeUnload() {
+ console.log("before unload");
+}
+
+window.addEventListener("unload", onUnload);
+function onUnload() {
+ console.log("unload");
+}
+
+const popover = document.getElementById("popover");
+popover.addEventListener("beforetoggle", onBeforeToggle);
+function onBeforeToggle(event) {
+ console.log("beforetoggle", event);
+}
+popover.addEventListener("toggle", onToggle);
+function onToggle(event) {
+ console.log("toggle", event);
+} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/exception-position-1.js b/devtools/client/debugger/test/mochitest/examples/exception-position-1.js
new file mode 100644
index 0000000000..f244b2eda0
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/exception-position-1.js
@@ -0,0 +1,4 @@
+function f() {
+ [1, 2, 3].push(a1);
+}
+f();
diff --git a/devtools/client/debugger/test/mochitest/examples/exception-position-2.js b/devtools/client/debugger/test/mochitest/examples/exception-position-2.js
new file mode 100644
index 0000000000..434b12990a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/exception-position-2.js
@@ -0,0 +1,2 @@
+const a2 = null;
+const b2 = 100 + a2.item;
diff --git a/devtools/client/debugger/test/mochitest/examples/exception-position-3.js b/devtools/client/debugger/test/mochitest/examples/exception-position-3.js
new file mode 100644
index 0000000000..3f8f6a7ece
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/exception-position-3.js
@@ -0,0 +1,2 @@
+const a3 = null;
+console.log(1, 2, a3.item, 3, 4, 5);
diff --git a/devtools/client/debugger/test/mochitest/examples/exception-position-4.js b/devtools/client/debugger/test/mochitest/examples/exception-position-4.js
new file mode 100644
index 0000000000..4204715eb8
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/exception-position-4.js
@@ -0,0 +1,2 @@
+const a4 = null;
+const b4 = [1, 2, a4.item, 3, 4, 5];
diff --git a/devtools/client/debugger/test/mochitest/examples/exceptions.js b/devtools/client/debugger/test/mochitest/examples/exceptions.js
new file mode 100644
index 0000000000..9901fe9775
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/exceptions.js
@@ -0,0 +1,88 @@
+function uncaughtException() {
+ throw "unreachable"
+}
+
+function caughtException() {
+ try {
+ throw "reachable";
+ } catch (e) {
+ debugger;
+ }
+}
+
+function deepError() {
+ function a() { b(); }
+ function b() { c(); }
+ function c() { throw new Error(); }
+
+ try {
+ a();
+ } catch (e) {}
+
+ debugger;
+}
+
+function deepErrorFinally() {
+ function a() { b(); }
+ function b() {
+ try {
+ c();
+ } finally {
+ debugger;
+ }
+ }
+ function c() { throw new Error(); }
+
+ try {
+ a();
+ } catch (e) {}
+
+ debugger;
+}
+
+function deepErrorCatch() {
+ function a() { b(); }
+ function b() {
+ try {
+ c();
+ } catch (e) {
+ debugger;
+ throw e;
+ }
+ }
+ function c() { throw new Error(); }
+
+ try {
+ a();
+ } catch (e) {}
+
+ debugger;
+}
+
+function deepErrorThrowDifferent() {
+ function a() { b(); }
+ function b() {
+ try {
+ c();
+ } catch (e) {
+ throw new Error();
+ }
+ }
+ function c() { throw new Error(); }
+
+ try {
+ a();
+ } catch (e) {}
+
+ debugger;
+}
+
+function throwInNewFunctionArgument() {
+ new Function("f=doesntExists()", "return 42;")();
+}
+
+function inlineExc() {
+ 'abc'.push(1);
+}
+
+inlineExc();
diff --git a/devtools/client/debugger/test/mochitest/examples/fetch.js b/devtools/client/debugger/test/mochitest/examples/fetch.js
new file mode 100644
index 0000000000..ccc08ccae0
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/fetch.js
@@ -0,0 +1,5 @@
+const doc = "doc-xhr.html";
+
+function main(url) {
+ fetch(url).then(console.log);
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/frames.js b/devtools/client/debugger/test/mochitest/examples/frames.js
new file mode 100644
index 0000000000..0f031582e4
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/frames.js
@@ -0,0 +1,24 @@
+function recurseA(i) {
+ if (i == 20) {
+ debugger;
+ return;
+ }
+
+ // down into the rabbit hole we go
+ return (i % 2) ? recurseA(++i) : recurseB(++i);
+}
+
+function recurseB(i) {
+ if (i == 20) {
+ debugger;
+ return;
+ }
+
+ // down into the rabbit hole we go
+ return (i % 2) ? recurseA(++i) : recurseB(++i);
+}
+
+
+window.startRecursion = function() {
+ return recurseA(0);
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/html-breakpoints-slow.js b/devtools/client/debugger/test/mochitest/examples/html-breakpoints-slow.js
new file mode 100644
index 0000000000..04b5c30294
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/html-breakpoints-slow.js
@@ -0,0 +1,3 @@
+function test2() {
+ console.log("test2");
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/inline-preview.js b/devtools/client/debugger/test/mochitest/examples/inline-preview.js
new file mode 100644
index 0000000000..dca40d03f1
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/inline-preview.js
@@ -0,0 +1,60 @@
+function checkValues() {
+ const a = "";
+ const b = false;
+ const c = undefined;
+ const d = null;
+ const e = [];
+ const f = {};
+ const reg = /^\p{RGI_Emoji}$/v;
+ const obj = {
+ foo: 1,
+ };
+
+ let bs = [];
+ for (let i = 0; i <= 100; i++) {
+ bs.push({ a: 2, b: { c: 3 } });
+ }
+ debugger;
+}
+
+function columnWise() {
+ let a = "a";
+ let b = "b";
+ let c = "c";
+ console.log(c, a, b);
+ debugger;
+}
+
+function objectProperties() {
+ const obj = { hello: "world", a: { b: "c" } };
+ console.log(obj.hello);
+ console.log(obj.a.b);
+ debugger;
+}
+
+function classProperties() {
+ class Foo {
+ x = 1;
+ #privateVar = 2;
+ #privateMethod() {
+ return this.#privateVar;
+ }
+ breakFn() {
+ let i = this.x * this.#privateVar;
+ const self = this;
+ debugger;
+ }
+ }
+ const foo = new Foo();
+ foo.breakFn();
+}
+
+function btnClick() {
+ const btn = document.querySelector("button");
+ debugger;
+ btn.click();
+}
+
+function onBtnClick(event) {
+ debugger;
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/inner-worker.js b/devtools/client/debugger/test/mochitest/examples/inner-worker.js
new file mode 100644
index 0000000000..3a6ec4a2fe
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/inner-worker.js
@@ -0,0 +1,8 @@
+console.log("Hello from the inner worker!");
+
+self.addEventListener(
+ "message",
+ function(e) {
+ console.log("Inner worker received message!");
+ }
+);
diff --git a/devtools/client/debugger/test/mochitest/examples/invalid-json-map.js b/devtools/client/debugger/test/mochitest/examples/invalid-json-map.js
new file mode 100644
index 0000000000..2042de8a83
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/invalid-json-map.js
@@ -0,0 +1,3 @@
+function aBundleWithCorruptedSourceMapFile() {}
+
+//# sourceMappingURL=map-with-json-error.map
diff --git a/devtools/client/debugger/test/mochitest/examples/long.js b/devtools/client/debugger/test/mochitest/examples/long.js
new file mode 100644
index 0000000000..58d605b36b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/long.js
@@ -0,0 +1,76 @@
+var app = {};
+
+// Generic "model" object. You can use whatever
+// framework you want. For this application it
+// may not even be worth separating this logic
+// out, but we do this to demonstrate one way to
+// separate out parts of your application.
+app.TodoModel = function (key) {
+ this.key = key;
+ this.todos = [];
+ this.onChanges = [];
+};
+
+app.TodoModel.prototype.addTodo = function (title) {
+ this.todos = this.todos.concat([{
+ id: Utils.uuid(),
+ title: title,
+ completed: false
+ }]);
+};
+
+app.TodoModel.prototype.inform = function() {
+ // Something changed, but we do nothing
+ return null;
+};
+
+app.TodoModel.prototype.toggleAll = function (checked) {
+ // Note: it's usually better to use immutable data structures since they're
+ // easier to reason about and React works very well with them. That's why
+ // we use map() and filter() everywhere instead of mutating the array or
+ // todo items themselves.
+ this.todos = this.todos.map(function (todo) {
+ return Object.assign({}, todo, {completed: checked});
+ });
+
+ this.inform();
+};
+
+app.TodoModel.prototype.toggle = function (todoToToggle) {
+ this.todos = this.todos.map(function (todo) {
+ return todo !== todoToToggle ?
+ todo :
+ Object.assign({}, todo, {completed: !todo.completed});
+ });
+
+ this.inform();
+};
+
+app.TodoModel.prototype.destroy = function (todo) {
+ this.todos = this.todos.filter(function (candidate) {
+ return candidate !== todo;
+ });
+
+ this.inform();
+};
+
+app.TodoModel.prototype.save = function (todoToSave, text) {
+ this.todos = this.todos.map(function (todo) {
+ return todo !== todoToSave ? todo : Object.assign({}, todo, {title: text});
+ });
+
+ this.inform();
+};
+
+app.TodoModel.prototype.clearCompleted = function () {
+ this.todos = this.todos.filter(function (todo) {
+ return !todo.completed;
+ });
+
+ this.inform();
+};
+
+function testModel() {
+ const model = new app.TodoModel();
+ model.clearCompleted();
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/map-with-failed-original-request.js b/devtools/client/debugger/test/mochitest/examples/map-with-failed-original-request.js
new file mode 100644
index 0000000000..2fd6f478d6
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/map-with-failed-original-request.js
@@ -0,0 +1,26 @@
+function changeAttribute() {
+ const title = document.body.title === "Goodbye" ? "Hello" : "Goodbye";
+ document.body.setAttribute("title", title);
+}
+
+function changeStyleAttribute() {
+ document.body.style.color = "blue";
+}
+
+function addDivToBody() {
+ let div = document.createElement("div");
+ div.id = "dynamic";
+ document.body.appendChild(div);
+}
+
+function removeDivInBody() {
+ document.body.querySelector("#dynamic").remove();
+}
+
+function changeAttributeInShadow() {
+ document.getElementById("host").shadowRoot.querySelector("div").classList.toggle("red");
+}
+
+document.getElementById("host").attachShadow({ mode: "open" }).innerHTML = `<div></div>`;
+
+//# sourceMappingURL=map-with-failed-original-request.map
diff --git a/devtools/client/debugger/test/mochitest/examples/map-with-failed-original-request.map b/devtools/client/debugger/test/mochitest/examples/map-with-failed-original-request.map
new file mode 100644
index 0000000000..25d3c551c2
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/map-with-failed-original-request.map
@@ -0,0 +1 @@
+{"version":3,"sources":["map-with-failed-original-request.original.js"],"names":[],"mappings":"AAAA,QAAQ,CAAC,eAAe,IAAI;EAC1B,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,MAAM,OAAO,KAAK,KAAK,KAAK,OAAO,EAAE;EACtE,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,GAAG,KAAK,EAAE;CAC5C;AACD;AACA,QAAQ,CAAC,aAAa,IAAI;EACxB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,aAAa,EAAE,GAAG,IAAI;CAC1D;IACG,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG;AACxC","file":"map-with-failed-original-request.js","sourcesContent":[]}
diff --git a/devtools/client/debugger/test/mochitest/examples/map-with-json-error.map b/devtools/client/debugger/test/mochitest/examples/map-with-json-error.map
new file mode 100644
index 0000000000..84a68e2d9d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/map-with-json-error.map
@@ -0,0 +1,3 @@
+{
+ thisIsInvalidJSON()
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/math.min.js b/devtools/client/debugger/test/mochitest/examples/math.min.js
new file mode 100644
index 0000000000..f4b379bd1e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/math.min.js
@@ -0,0 +1,3 @@
+function add(a,b,k){var result=a+b;return k(result)}function sub(a,b,k){var result=a-b;return k(result)}function mul(a,b,k){var result=a*b;return k(result)}function div(a,b,k){var result=a/b;return k(result)}function arithmetic(){
+ add(4,4,function(a){
+ sub(a,2,function(b){mul(b,3,function(c){div(c,2,function(d){console.log("arithmetic",d)})})})})};
diff --git a/devtools/client/debugger/test/mochitest/examples/nested/nested-source.js b/devtools/client/debugger/test/mochitest/examples/nested/nested-source.js
new file mode 100644
index 0000000000..a7b20f015a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/nested/nested-source.js
@@ -0,0 +1,3 @@
+function computeSomething() {
+ return 1;
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/non-existant-map.js b/devtools/client/debugger/test/mochitest/examples/non-existant-map.js
new file mode 100644
index 0000000000..20b5bbf7ec
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/non-existant-map.js
@@ -0,0 +1,8 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+function runCode(){
+ var a=1;
+ a=a*2;
+ return a;
+}
+//# sourceMappingURL=bogus.map
diff --git a/devtools/client/debugger/test/mochitest/examples/opts.js b/devtools/client/debugger/test/mochitest/examples/opts.js
new file mode 100644
index 0000000000..20988fa4a5
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/opts.js
@@ -0,0 +1,3 @@
+module.exports = {
+ extra: true
+};
diff --git a/devtools/client/debugger/test/mochitest/examples/outer-worker.js b/devtools/client/debugger/test/mochitest/examples/outer-worker.js
new file mode 100644
index 0000000000..a0d0f5cf64
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/outer-worker.js
@@ -0,0 +1,8 @@
+var w = new Worker("inner-worker.js");
+
+self.addEventListener(
+ "message",
+ function(e) {
+ console.log("Outer worker received message!");
+ }
+);
diff --git a/devtools/client/debugger/test/mochitest/examples/output.js b/devtools/client/debugger/test/mochitest/examples/output.js
new file mode 100644
index 0000000000..14281fdbfd
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/output.js
@@ -0,0 +1,5 @@
+function output(str) {
+ console.log(str);
+}
+
+module.exports = { output };
diff --git a/devtools/client/debugger/test/mochitest/examples/pause-points.js b/devtools/client/debugger/test/mochitest/examples/pause-points.js
new file mode 100644
index 0000000000..36e98aebb9
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/pause-points.js
@@ -0,0 +1,43 @@
+function funcb(msg) {
+ console.log(msg)
+}
+
+function a() {return true}
+function b() {return false}
+
+function statements() {
+ debugger;
+ { funcb(); funcb(); }
+ console.log("yo"); console.log("yo");
+ debugger; debugger;
+}
+
+function flow() {
+ debugger;
+ if (true) console.log("hi")
+ var i = 0;
+ while(i++ < 2) console.log(i);
+}
+
+function sequences() {
+ debugger;
+
+ const a = {
+ a: 1
+ }
+
+ const b = [
+ 1,
+ funcb()
+ ]
+
+ funcb({
+ a: 1,
+ })
+}
+
+function expressions() {
+ debugger
+ a() ? b() : b()
+ const y = ` ${funcb()} ${funcb()}`;
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/pretty.js b/devtools/client/debugger/test/mochitest/examples/pretty.js
new file mode 100644
index 0000000000..5d5d100f5e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/pretty.js
@@ -0,0 +1,10 @@
+function a() {}
+
+function stuff() {
+ a(); a();
+ a(); a();
+ debugger
+}
+function funcWithMultipleBreakableColumns() {
+ const items = [1,2];for(let i=0;i<items.length;i++){items[i]=items[i]+1}
+} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/preview-getter.js b/devtools/client/debugger/test/mochitest/examples/preview-getter.js
new file mode 100644
index 0000000000..c0424ca4d1
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/preview-getter.js
@@ -0,0 +1,15 @@
+const obj = {
+ propA: 1,
+ propB: { arr: [1,2,3,4,5] },
+ get getPropA() {
+ this.propA;
+ return this.propA;
+ },
+ get getPropB() {
+ return this.propB;
+ }
+}
+
+function funcA() {
+ obj.getPropA;
+} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/preview.js b/devtools/client/debugger/test/mochitest/examples/preview.js
new file mode 100644
index 0000000000..6e3e014fda
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/preview.js
@@ -0,0 +1,86 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+function empties() {
+ const a = "";
+ const b = false;
+ const c = undefined;
+ const d = null;
+ debugger;
+}
+
+function smalls() {
+ const a = "...";
+ const b = true;
+ const c = 1;
+ const d = [];
+ const e = {};
+ debugger;
+}
+
+function objects() {
+ const obj = {
+ foo: 1,
+ };
+
+ const empty = Object.create(null);
+ const foo = obj?.foo;
+
+ debugger;
+}
+
+function largeArray() {
+ const bs = [];
+ for (let i = 0; i <= 100; i++) {
+ bs.push({ a: 2, b: { c: 3 } });
+ }
+ debugger;
+}
+
+function classPreview() {
+ class Foo {
+ x = 1;
+ #privateVar = 2;
+ static #privateStatic = { first: "a", second: "b" };
+ #privateMethod() {
+ return this.#privateVar;
+ }
+ breakFn() {
+ let i = this.x * this.#privateVar + Foo.#privateStatic;
+ if (#privateVar in this && this.#privateVar !== 0) {
+ i = i * 2;
+ }
+ const y = {
+ hello: {
+ foo: "foo",
+ bar: "bar"
+ },
+ };
+ y;
+ debugger;
+ }
+ }
+ const foo = new Foo();
+ foo.breakFn();
+}
+
+function invalidTargets() {
+ "a";
+ false;
+ undefined;
+ null;
+ 42;
+ const myVar = "foo";
+ debugger;
+ return myVar;
+}
+
+function multipleTokens() {
+ var foo = {bar: { baz: "bloop"}}, blip = {boom: 0};
+ foo || blip
+ foo.bar;
+ foo.bar.baz;
+ foo || blip.boom;
+ debugger;
+} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/react/.gitignore b/devtools/client/debugger/test/mochitest/examples/react/.gitignore
new file mode 100644
index 0000000000..215fb9664e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/react/.gitignore
@@ -0,0 +1,20 @@
+# See https://help.github.com/ignore-files/ for more about ignoring files.
+
+# dependencies
+/node_modules
+
+# testing
+/coverage
+
+# production
+
+# misc
+.DS_Store
+.env.local
+.env.development.local
+.env.test.local
+.env.production.local
+
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
diff --git a/devtools/client/debugger/test/mochitest/examples/react/README.md b/devtools/client/debugger/test/mochitest/examples/react/README.md
new file mode 100644
index 0000000000..a2d885b766
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/react/README.md
@@ -0,0 +1,4 @@
+### React app
+
+- built with create-react-app
+-
diff --git a/devtools/client/debugger/test/mochitest/examples/react/build/asset-manifest.json b/devtools/client/debugger/test/mochitest/examples/react/build/asset-manifest.json
new file mode 100644
index 0000000000..160c20b777
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/react/build/asset-manifest.json
@@ -0,0 +1,4 @@
+{
+ "main.js": "main.js",
+ "main.js.map": "main.js.map"
+} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/react/build/index.html b/devtools/client/debugger/test/mochitest/examples/react/build/index.html
new file mode 100644
index 0000000000..13a0ae5f1c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/react/build/index.html
@@ -0,0 +1 @@
+<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name="theme-color" content="#000000"><title>React App</title></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div><script type="text/javascript" src="/main.js"></script></body></html> \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/react/build/main.js b/devtools/client/debugger/test/mochitest/examples/react/build/main.js
new file mode 100644
index 0000000000..da484dbc51
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/react/build/main.js
@@ -0,0 +1,6762 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "/";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 3);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+/*
+object-assign
+(c) Sindre Sorhus
+@license MIT
+*/
+
+
+/* eslint-disable no-unused-vars */
+var getOwnPropertySymbols = Object.getOwnPropertySymbols;
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+var propIsEnumerable = Object.prototype.propertyIsEnumerable;
+
+function toObject(val) {
+ if (val === null || val === undefined) {
+ throw new TypeError('Object.assign cannot be called with null or undefined');
+ }
+
+ return Object(val);
+}
+
+function shouldUseNative() {
+ try {
+ if (!Object.assign) {
+ return false;
+ }
+
+ // Detect buggy property enumeration order in older V8 versions.
+
+ // https://bugs.chromium.org/p/v8/issues/detail?id=4118
+ var test1 = new String('abc'); // eslint-disable-line no-new-wrappers
+ test1[5] = 'de';
+ if (Object.getOwnPropertyNames(test1)[0] === '5') {
+ return false;
+ }
+
+ // https://bugs.chromium.org/p/v8/issues/detail?id=3056
+ var test2 = {};
+ for (var i = 0; i < 10; i++) {
+ test2['_' + String.fromCharCode(i)] = i;
+ }
+ var order2 = Object.getOwnPropertyNames(test2).map(function (n) {
+ return test2[n];
+ });
+ if (order2.join('') !== '0123456789') {
+ return false;
+ }
+
+ // https://bugs.chromium.org/p/v8/issues/detail?id=3056
+ var test3 = {};
+ 'abcdefghijklmnopqrst'.split('').forEach(function (letter) {
+ test3[letter] = letter;
+ });
+ if (Object.keys(Object.assign({}, test3)).join('') !==
+ 'abcdefghijklmnopqrst') {
+ return false;
+ }
+
+ return true;
+ } catch (err) {
+ // We don't expect any of the above to throw, but better to be safe.
+ return false;
+ }
+}
+
+module.exports = shouldUseNative() ? Object.assign : function (target, source) {
+ var from;
+ var to = toObject(target);
+ var symbols;
+
+ for (var s = 1; s < arguments.length; s++) {
+ from = Object(arguments[s]);
+
+ for (var key in from) {
+ if (hasOwnProperty.call(from, key)) {
+ to[key] = from[key];
+ }
+ }
+
+ if (getOwnPropertySymbols) {
+ symbols = getOwnPropertySymbols(from);
+ for (var i = 0; i < symbols.length; i++) {
+ if (propIsEnumerable.call(from, symbols[i])) {
+ to[symbols[i]] = from[symbols[i]];
+ }
+ }
+ }
+ }
+
+ return to;
+};
+
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+if (true) {
+ module.exports = __webpack_require__(11);
+} else {
+ module.exports = require('./cjs/react.development.js');
+}
+
+
+/***/ }),
+/* 2 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var asap = __webpack_require__(6);
+
+function noop() {}
+
+// States:
+//
+// 0 - pending
+// 1 - fulfilled with _value
+// 2 - rejected with _value
+// 3 - adopted the state of another promise, _value
+//
+// once the state is no longer pending (0) it is immutable
+
+// All `_` prefixed properties will be reduced to `_{random number}`
+// at build time to obfuscate them and discourage their use.
+// We don't use symbols or Object.defineProperty to fully hide them
+// because the performance isn't good enough.
+
+
+// to avoid using try/catch inside critical functions, we
+// extract them to here.
+var LAST_ERROR = null;
+var IS_ERROR = {};
+function getThen(obj) {
+ try {
+ return obj.then;
+ } catch (ex) {
+ LAST_ERROR = ex;
+ return IS_ERROR;
+ }
+}
+
+function tryCallOne(fn, a) {
+ try {
+ return fn(a);
+ } catch (ex) {
+ LAST_ERROR = ex;
+ return IS_ERROR;
+ }
+}
+function tryCallTwo(fn, a, b) {
+ try {
+ fn(a, b);
+ } catch (ex) {
+ LAST_ERROR = ex;
+ return IS_ERROR;
+ }
+}
+
+module.exports = Promise;
+
+function Promise(fn) {
+ if (typeof this !== 'object') {
+ throw new TypeError('Promises must be constructed via new');
+ }
+ if (typeof fn !== 'function') {
+ throw new TypeError('Promise constructor\'s argument is not a function');
+ }
+ this._75 = 0;
+ this._83 = 0;
+ this._18 = null;
+ this._38 = null;
+ if (fn === noop) return;
+ doResolve(fn, this);
+}
+Promise._47 = null;
+Promise._71 = null;
+Promise._44 = noop;
+
+Promise.prototype.then = function(onFulfilled, onRejected) {
+ if (this.constructor !== Promise) {
+ return safeThen(this, onFulfilled, onRejected);
+ }
+ var res = new Promise(noop);
+ handle(this, new Handler(onFulfilled, onRejected, res));
+ return res;
+};
+
+function safeThen(self, onFulfilled, onRejected) {
+ return new self.constructor(function (resolve, reject) {
+ var res = new Promise(noop);
+ res.then(resolve, reject);
+ handle(self, new Handler(onFulfilled, onRejected, res));
+ });
+}
+function handle(self, deferred) {
+ while (self._83 === 3) {
+ self = self._18;
+ }
+ if (Promise._47) {
+ Promise._47(self);
+ }
+ if (self._83 === 0) {
+ if (self._75 === 0) {
+ self._75 = 1;
+ self._38 = deferred;
+ return;
+ }
+ if (self._75 === 1) {
+ self._75 = 2;
+ self._38 = [self._38, deferred];
+ return;
+ }
+ self._38.push(deferred);
+ return;
+ }
+ handleResolved(self, deferred);
+}
+
+function handleResolved(self, deferred) {
+ asap(function() {
+ var cb = self._83 === 1 ? deferred.onFulfilled : deferred.onRejected;
+ if (cb === null) {
+ if (self._83 === 1) {
+ resolve(deferred.promise, self._18);
+ } else {
+ reject(deferred.promise, self._18);
+ }
+ return;
+ }
+ var ret = tryCallOne(cb, self._18);
+ if (ret === IS_ERROR) {
+ reject(deferred.promise, LAST_ERROR);
+ } else {
+ resolve(deferred.promise, ret);
+ }
+ });
+}
+function resolve(self, newValue) {
+ // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure
+ if (newValue === self) {
+ return reject(
+ self,
+ new TypeError('A promise cannot be resolved with itself.')
+ );
+ }
+ if (
+ newValue &&
+ (typeof newValue === 'object' || typeof newValue === 'function')
+ ) {
+ var then = getThen(newValue);
+ if (then === IS_ERROR) {
+ return reject(self, LAST_ERROR);
+ }
+ if (
+ then === self.then &&
+ newValue instanceof Promise
+ ) {
+ self._83 = 3;
+ self._18 = newValue;
+ finale(self);
+ return;
+ } else if (typeof then === 'function') {
+ doResolve(then.bind(newValue), self);
+ return;
+ }
+ }
+ self._83 = 1;
+ self._18 = newValue;
+ finale(self);
+}
+
+function reject(self, newValue) {
+ self._83 = 2;
+ self._18 = newValue;
+ if (Promise._71) {
+ Promise._71(self, newValue);
+ }
+ finale(self);
+}
+function finale(self) {
+ if (self._75 === 1) {
+ handle(self, self._38);
+ self._38 = null;
+ }
+ if (self._75 === 2) {
+ for (var i = 0; i < self._38.length; i++) {
+ handle(self, self._38[i]);
+ }
+ self._38 = null;
+ }
+}
+
+function Handler(onFulfilled, onRejected, promise){
+ this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;
+ this.onRejected = typeof onRejected === 'function' ? onRejected : null;
+ this.promise = promise;
+}
+
+/**
+ * Take a potentially misbehaving resolver function and make sure
+ * onFulfilled and onRejected are only called once.
+ *
+ * Makes no guarantees about asynchrony.
+ */
+function doResolve(fn, promise) {
+ var done = false;
+ var res = tryCallTwo(fn, function (value) {
+ if (done) return;
+ done = true;
+ resolve(promise, value);
+ }, function (reason) {
+ if (done) return;
+ done = true;
+ reject(promise, reason);
+ });
+ if (!done && res === IS_ERROR) {
+ done = true;
+ reject(promise, LAST_ERROR);
+ }
+}
+
+
+/***/ }),
+/* 3 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(4);
+module.exports = __webpack_require__(10);
+
+
+/***/ }),
+/* 4 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+// @remove-on-eject-begin
+/**
+ * Copyright (c) 2015-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+// @remove-on-eject-end
+
+
+if (typeof Promise === 'undefined') {
+ // Rejection tracking prevents a common issue where React gets into an
+ // inconsistent state due to an error, but it gets swallowed by a Promise,
+ // and the user has no idea what causes React's erratic future behavior.
+ __webpack_require__(5).enable();
+ window.Promise = __webpack_require__(8);
+}
+
+// fetch() polyfill for making API calls.
+__webpack_require__(9);
+
+// Object.assign() is commonly used with React.
+// It will use the native implementation if it's present and isn't buggy.
+Object.assign = __webpack_require__(0);
+
+// In tests, polyfill requestAnimationFrame since jsdom doesn't provide it yet.
+// We don't polyfill it in the browser--this is user's responsibility.
+if (false) {
+ require('raf').polyfill(global);
+}
+
+
+/***/ }),
+/* 5 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var Promise = __webpack_require__(2);
+
+var DEFAULT_WHITELIST = [
+ ReferenceError,
+ TypeError,
+ RangeError
+];
+
+var enabled = false;
+exports.disable = disable;
+function disable() {
+ enabled = false;
+ Promise._47 = null;
+ Promise._71 = null;
+}
+
+exports.enable = enable;
+function enable(options) {
+ options = options || {};
+ if (enabled) disable();
+ enabled = true;
+ var id = 0;
+ var displayId = 0;
+ var rejections = {};
+ Promise._47 = function (promise) {
+ if (
+ promise._83 === 2 && // IS REJECTED
+ rejections[promise._56]
+ ) {
+ if (rejections[promise._56].logged) {
+ onHandled(promise._56);
+ } else {
+ clearTimeout(rejections[promise._56].timeout);
+ }
+ delete rejections[promise._56];
+ }
+ };
+ Promise._71 = function (promise, err) {
+ if (promise._75 === 0) { // not yet handled
+ promise._56 = id++;
+ rejections[promise._56] = {
+ displayId: null,
+ error: err,
+ timeout: setTimeout(
+ onUnhandled.bind(null, promise._56),
+ // For reference errors and type errors, this almost always
+ // means the programmer made a mistake, so log them after just
+ // 100ms
+ // otherwise, wait 2 seconds to see if they get handled
+ matchWhitelist(err, DEFAULT_WHITELIST)
+ ? 100
+ : 2000
+ ),
+ logged: false
+ };
+ }
+ };
+ function onUnhandled(id) {
+ if (
+ options.allRejections ||
+ matchWhitelist(
+ rejections[id].error,
+ options.whitelist || DEFAULT_WHITELIST
+ )
+ ) {
+ rejections[id].displayId = displayId++;
+ if (options.onUnhandled) {
+ rejections[id].logged = true;
+ options.onUnhandled(
+ rejections[id].displayId,
+ rejections[id].error
+ );
+ } else {
+ rejections[id].logged = true;
+ logError(
+ rejections[id].displayId,
+ rejections[id].error
+ );
+ }
+ }
+ }
+ function onHandled(id) {
+ if (rejections[id].logged) {
+ if (options.onHandled) {
+ options.onHandled(rejections[id].displayId, rejections[id].error);
+ } else if (!rejections[id].onUnhandled) {
+ console.warn(
+ 'Promise Rejection Handled (id: ' + rejections[id].displayId + '):'
+ );
+ console.warn(
+ ' This means you can ignore any previous messages of the form "Possible Unhandled Promise Rejection" with id ' +
+ rejections[id].displayId + '.'
+ );
+ }
+ }
+ }
+}
+
+function logError(id, error) {
+ console.warn('Possible Unhandled Promise Rejection (id: ' + id + '):');
+ var errStr = (error && (error.stack || error)) + '';
+ errStr.split('\n').forEach(function (line) {
+ console.warn(' ' + line);
+ });
+}
+
+function matchWhitelist(error, list) {
+ return list.some(function (cls) {
+ return error instanceof cls;
+ });
+}
+
+/***/ }),
+/* 6 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function(global) {
+
+// Use the fastest means possible to execute a task in its own turn, with
+// priority over other events including IO, animation, reflow, and redraw
+// events in browsers.
+//
+// An exception thrown by a task will permanently interrupt the processing of
+// subsequent tasks. The higher level `asap` function ensures that if an
+// exception is thrown by a task, that the task queue will continue flushing as
+// soon as possible, but if you use `rawAsap` directly, you are responsible to
+// either ensure that no exceptions are thrown from your task, or to manually
+// call `rawAsap.requestFlush` if an exception is thrown.
+module.exports = rawAsap;
+function rawAsap(task) {
+ if (!queue.length) {
+ requestFlush();
+ flushing = true;
+ }
+ // Equivalent to push, but avoids a function call.
+ queue[queue.length] = task;
+}
+
+var queue = [];
+// Once a flush has been requested, no further calls to `requestFlush` are
+// necessary until the next `flush` completes.
+var flushing = false;
+// `requestFlush` is an implementation-specific method that attempts to kick
+// off a `flush` event as quickly as possible. `flush` will attempt to exhaust
+// the event queue before yielding to the browser's own event loop.
+var requestFlush;
+// The position of the next task to execute in the task queue. This is
+// preserved between calls to `flush` so that it can be resumed if
+// a task throws an exception.
+var index = 0;
+// If a task schedules additional tasks recursively, the task queue can grow
+// unbounded. To prevent memory exhaustion, the task queue will periodically
+// truncate already-completed tasks.
+var capacity = 1024;
+
+// The flush function processes all tasks that have been scheduled with
+// `rawAsap` unless and until one of those tasks throws an exception.
+// If a task throws an exception, `flush` ensures that its state will remain
+// consistent and will resume where it left off when called again.
+// However, `flush` does not make any arrangements to be called again if an
+// exception is thrown.
+function flush() {
+ while (index < queue.length) {
+ var currentIndex = index;
+ // Advance the index before calling the task. This ensures that we will
+ // begin flushing on the next task the task throws an error.
+ index = index + 1;
+ queue[currentIndex].call();
+ // Prevent leaking memory for long chains of recursive calls to `asap`.
+ // If we call `asap` within tasks scheduled by `asap`, the queue will
+ // grow, but to avoid an O(n) walk for every task we execute, we don't
+ // shift tasks off the queue after they have been executed.
+ // Instead, we periodically shift 1024 tasks off the queue.
+ if (index > capacity) {
+ // Manually shift all values starting at the index back to the
+ // beginning of the queue.
+ for (var scan = 0, newLength = queue.length - index; scan < newLength; scan++) {
+ queue[scan] = queue[scan + index];
+ }
+ queue.length -= index;
+ index = 0;
+ }
+ }
+ queue.length = 0;
+ index = 0;
+ flushing = false;
+}
+
+// `requestFlush` is implemented using a strategy based on data collected from
+// every available SauceLabs Selenium web driver worker at time of writing.
+// https://docs.google.com/spreadsheets/d/1mG-5UYGup5qxGdEMWkhP6BWCz053NUb2E1QoUTU16uA/edit#gid=783724593
+
+// Safari 6 and 6.1 for desktop, iPad, and iPhone are the only browsers that
+// have WebKitMutationObserver but not un-prefixed MutationObserver.
+// Must use `global` or `self` instead of `window` to work in both frames and web
+// workers. `global` is a provision of Browserify, Mr, Mrs, or Mop.
+
+/* globals self */
+var scope = typeof global !== "undefined" ? global : self;
+var BrowserMutationObserver = scope.MutationObserver || scope.WebKitMutationObserver;
+
+// MutationObservers are desirable because they have high priority and work
+// reliably everywhere they are implemented.
+// They are implemented in all modern browsers.
+//
+// - Android 4-4.3
+// - Chrome 26-34
+// - Firefox 14-29
+// - Internet Explorer 11
+// - iPad Safari 6-7.1
+// - iPhone Safari 7-7.1
+// - Safari 6-7
+if (typeof BrowserMutationObserver === "function") {
+ requestFlush = makeRequestCallFromMutationObserver(flush);
+
+// MessageChannels are desirable because they give direct access to the HTML
+// task queue, are implemented in Internet Explorer 10, Safari 5.0-1, and Opera
+// 11-12, and in web workers in many engines.
+// Although message channels yield to any queued rendering and IO tasks, they
+// would be better than imposing the 4ms delay of timers.
+// However, they do not work reliably in Internet Explorer or Safari.
+
+// Internet Explorer 10 is the only browser that has setImmediate but does
+// not have MutationObservers.
+// Although setImmediate yields to the browser's renderer, it would be
+// preferrable to falling back to setTimeout since it does not have
+// the minimum 4ms penalty.
+// Unfortunately there appears to be a bug in Internet Explorer 10 Mobile (and
+// Desktop to a lesser extent) that renders both setImmediate and
+// MessageChannel useless for the purposes of ASAP.
+// https://github.com/kriskowal/q/issues/396
+
+// Timers are implemented universally.
+// We fall back to timers in workers in most engines, and in foreground
+// contexts in the following browsers.
+// However, note that even this simple case requires nuances to operate in a
+// broad spectrum of browsers.
+//
+// - Firefox 3-13
+// - Internet Explorer 6-9
+// - iPad Safari 4.3
+// - Lynx 2.8.7
+} else {
+ requestFlush = makeRequestCallFromTimer(flush);
+}
+
+// `requestFlush` requests that the high priority event queue be flushed as
+// soon as possible.
+// This is useful to prevent an error thrown in a task from stalling the event
+// queue if the exception handled by Node.js’s
+// `process.on("uncaughtException")` or by a domain.
+rawAsap.requestFlush = requestFlush;
+
+// To request a high priority event, we induce a mutation observer by toggling
+// the text of a text node between "1" and "-1".
+function makeRequestCallFromMutationObserver(callback) {
+ var toggle = 1;
+ var observer = new BrowserMutationObserver(callback);
+ var node = document.createTextNode("");
+ observer.observe(node, {characterData: true});
+ return function requestCall() {
+ toggle = -toggle;
+ node.data = toggle;
+ };
+}
+
+// The message channel technique was discovered by Malte Ubl and was the
+// original foundation for this library.
+// http://www.nonblocking.io/2011/06/windownexttick.html
+
+// Safari 6.0.5 (at least) intermittently fails to create message ports on a
+// page's first load. Thankfully, this version of Safari supports
+// MutationObservers, so we don't need to fall back in that case.
+
+// function makeRequestCallFromMessageChannel(callback) {
+// var channel = new MessageChannel();
+// channel.port1.onmessage = callback;
+// return function requestCall() {
+// channel.port2.postMessage(0);
+// };
+// }
+
+// For reasons explained above, we are also unable to use `setImmediate`
+// under any circumstances.
+// Even if we were, there is another bug in Internet Explorer 10.
+// It is not sufficient to assign `setImmediate` to `requestFlush` because
+// `setImmediate` must be called *by name* and therefore must be wrapped in a
+// closure.
+// Never forget.
+
+// function makeRequestCallFromSetImmediate(callback) {
+// return function requestCall() {
+// setImmediate(callback);
+// };
+// }
+
+// Safari 6.0 has a problem where timers will get lost while the user is
+// scrolling. This problem does not impact ASAP because Safari 6.0 supports
+// mutation observers, so that implementation is used instead.
+// However, if we ever elect to use timers in Safari, the prevalent work-around
+// is to add a scroll event listener that calls for a flush.
+
+// `setTimeout` does not call the passed callback if the delay is less than
+// approximately 7 in web workers in Firefox 8 through 18, and sometimes not
+// even then.
+
+function makeRequestCallFromTimer(callback) {
+ return function requestCall() {
+ // We dispatch a timeout with a specified delay of 0 for engines that
+ // can reliably accommodate that request. This will usually be snapped
+ // to a 4 milisecond delay, but once we're flushing, there's no delay
+ // between events.
+ var timeoutHandle = setTimeout(handleTimer, 0);
+ // However, since this timer gets frequently dropped in Firefox
+ // workers, we enlist an interval handle that will try to fire
+ // an event 20 times per second until it succeeds.
+ var intervalHandle = setInterval(handleTimer, 50);
+
+ function handleTimer() {
+ // Whichever timer succeeds will cancel both timers and
+ // execute the callback.
+ clearTimeout(timeoutHandle);
+ clearInterval(intervalHandle);
+ callback();
+ }
+ };
+}
+
+// This is for `asap.js` only.
+// Its name will be periodically randomized to break any code that depends on
+// its existence.
+rawAsap.makeRequestCallFromTimer = makeRequestCallFromTimer;
+
+// ASAP was originally a nextTick shim included in Q. This was factored out
+// into this ASAP package. It was later adapted to RSVP which made further
+// amendments. These decisions, particularly to marginalize MessageChannel and
+// to capture the MutationObserver implementation in a closure, were integrated
+// back into ASAP proper.
+// https://github.com/tildeio/rsvp.js/blob/cddf7232546a9cf858524b75cde6f9edf72620a7/lib/rsvp/asap.js
+
+/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(7)))
+
+/***/ }),
+/* 7 */
+/***/ (function(module, exports) {
+
+var g;
+
+// This works in non-strict mode
+g = (function() {
+ return this;
+})();
+
+try {
+ // This works if eval is allowed (see CSP)
+ g = g || Function("return this")() || (1,eval)("this");
+} catch(e) {
+ // This works if the window reference is available
+ if(typeof window === "object")
+ g = window;
+}
+
+// g can still be undefined, but nothing to do about it...
+// We return undefined, instead of nothing here, so it's
+// easier to handle this case. if(!global) { ...}
+
+module.exports = g;
+
+
+/***/ }),
+/* 8 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+//This file contains the ES6 extensions to the core Promises/A+ API
+
+var Promise = __webpack_require__(2);
+
+module.exports = Promise;
+
+/* Static Functions */
+
+var TRUE = valuePromise(true);
+var FALSE = valuePromise(false);
+var NULL = valuePromise(null);
+var UNDEFINED = valuePromise(undefined);
+var ZERO = valuePromise(0);
+var EMPTYSTRING = valuePromise('');
+
+function valuePromise(value) {
+ var p = new Promise(Promise._44);
+ p._83 = 1;
+ p._18 = value;
+ return p;
+}
+Promise.resolve = function (value) {
+ if (value instanceof Promise) return value;
+
+ if (value === null) return NULL;
+ if (value === undefined) return UNDEFINED;
+ if (value === true) return TRUE;
+ if (value === false) return FALSE;
+ if (value === 0) return ZERO;
+ if (value === '') return EMPTYSTRING;
+
+ if (typeof value === 'object' || typeof value === 'function') {
+ try {
+ var then = value.then;
+ if (typeof then === 'function') {
+ return new Promise(then.bind(value));
+ }
+ } catch (ex) {
+ return new Promise(function (resolve, reject) {
+ reject(ex);
+ });
+ }
+ }
+ return valuePromise(value);
+};
+
+Promise.all = function (arr) {
+ var args = Array.prototype.slice.call(arr);
+
+ return new Promise(function (resolve, reject) {
+ if (args.length === 0) return resolve([]);
+ var remaining = args.length;
+ function res(i, val) {
+ if (val && (typeof val === 'object' || typeof val === 'function')) {
+ if (val instanceof Promise && val.then === Promise.prototype.then) {
+ while (val._83 === 3) {
+ val = val._18;
+ }
+ if (val._83 === 1) return res(i, val._18);
+ if (val._83 === 2) reject(val._18);
+ val.then(function (val) {
+ res(i, val);
+ }, reject);
+ return;
+ } else {
+ var then = val.then;
+ if (typeof then === 'function') {
+ var p = new Promise(then.bind(val));
+ p.then(function (val) {
+ res(i, val);
+ }, reject);
+ return;
+ }
+ }
+ }
+ args[i] = val;
+ if (--remaining === 0) {
+ resolve(args);
+ }
+ }
+ for (var i = 0; i < args.length; i++) {
+ res(i, args[i]);
+ }
+ });
+};
+
+Promise.reject = function (value) {
+ return new Promise(function (resolve, reject) {
+ reject(value);
+ });
+};
+
+Promise.race = function (values) {
+ return new Promise(function (resolve, reject) {
+ values.forEach(function(value){
+ Promise.resolve(value).then(resolve, reject);
+ });
+ });
+};
+
+/* Prototype Methods */
+
+Promise.prototype['catch'] = function (onRejected) {
+ return this.then(null, onRejected);
+};
+
+
+/***/ }),
+/* 9 */
+/***/ (function(module, exports) {
+
+(function(self) {
+ 'use strict';
+
+ if (self.fetch) {
+ return
+ }
+
+ var support = {
+ searchParams: 'URLSearchParams' in self,
+ iterable: 'Symbol' in self && 'iterator' in Symbol,
+ blob: 'FileReader' in self && 'Blob' in self && (function() {
+ try {
+ new Blob()
+ return true
+ } catch(e) {
+ return false
+ }
+ })(),
+ formData: 'FormData' in self,
+ arrayBuffer: 'ArrayBuffer' in self
+ }
+
+ if (support.arrayBuffer) {
+ var viewClasses = [
+ '[object Int8Array]',
+ '[object Uint8Array]',
+ '[object Uint8ClampedArray]',
+ '[object Int16Array]',
+ '[object Uint16Array]',
+ '[object Int32Array]',
+ '[object Uint32Array]',
+ '[object Float32Array]',
+ '[object Float64Array]'
+ ]
+
+ var isDataView = function(obj) {
+ return obj && DataView.prototype.isPrototypeOf(obj)
+ }
+
+ var isArrayBufferView = ArrayBuffer.isView || function(obj) {
+ return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1
+ }
+ }
+
+ function normalizeName(name) {
+ if (typeof name !== 'string') {
+ name = String(name)
+ }
+ if (/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name)) {
+ throw new TypeError('Invalid character in header field name')
+ }
+ return name.toLowerCase()
+ }
+
+ function normalizeValue(value) {
+ if (typeof value !== 'string') {
+ value = String(value)
+ }
+ return value
+ }
+
+ // Build a destructive iterator for the value list
+ function iteratorFor(items) {
+ var iterator = {
+ next: function() {
+ var value = items.shift()
+ return {done: value === undefined, value: value}
+ }
+ }
+
+ if (support.iterable) {
+ iterator[Symbol.iterator] = function() {
+ return iterator
+ }
+ }
+
+ return iterator
+ }
+
+ function Headers(headers) {
+ this.map = {}
+
+ if (headers instanceof Headers) {
+ headers.forEach(function(value, name) {
+ this.append(name, value)
+ }, this)
+ } else if (Array.isArray(headers)) {
+ headers.forEach(function(header) {
+ this.append(header[0], header[1])
+ }, this)
+ } else if (headers) {
+ Object.getOwnPropertyNames(headers).forEach(function(name) {
+ this.append(name, headers[name])
+ }, this)
+ }
+ }
+
+ Headers.prototype.append = function(name, value) {
+ name = normalizeName(name)
+ value = normalizeValue(value)
+ var oldValue = this.map[name]
+ this.map[name] = oldValue ? oldValue+','+value : value
+ }
+
+ Headers.prototype['delete'] = function(name) {
+ delete this.map[normalizeName(name)]
+ }
+
+ Headers.prototype.get = function(name) {
+ name = normalizeName(name)
+ return this.has(name) ? this.map[name] : null
+ }
+
+ Headers.prototype.has = function(name) {
+ return this.map.hasOwnProperty(normalizeName(name))
+ }
+
+ Headers.prototype.set = function(name, value) {
+ this.map[normalizeName(name)] = normalizeValue(value)
+ }
+
+ Headers.prototype.forEach = function(callback, thisArg) {
+ for (var name in this.map) {
+ if (this.map.hasOwnProperty(name)) {
+ callback.call(thisArg, this.map[name], name, this)
+ }
+ }
+ }
+
+ Headers.prototype.keys = function() {
+ var items = []
+ this.forEach(function(value, name) { items.push(name) })
+ return iteratorFor(items)
+ }
+
+ Headers.prototype.values = function() {
+ var items = []
+ this.forEach(function(value) { items.push(value) })
+ return iteratorFor(items)
+ }
+
+ Headers.prototype.entries = function() {
+ var items = []
+ this.forEach(function(value, name) { items.push([name, value]) })
+ return iteratorFor(items)
+ }
+
+ if (support.iterable) {
+ Headers.prototype[Symbol.iterator] = Headers.prototype.entries
+ }
+
+ function consumed(body) {
+ if (body.bodyUsed) {
+ return Promise.reject(new TypeError('Already read'))
+ }
+ body.bodyUsed = true
+ }
+
+ function fileReaderReady(reader) {
+ return new Promise(function(resolve, reject) {
+ reader.onload = function() {
+ resolve(reader.result)
+ }
+ reader.onerror = function() {
+ reject(reader.error)
+ }
+ })
+ }
+
+ function readBlobAsArrayBuffer(blob) {
+ var reader = new FileReader()
+ var promise = fileReaderReady(reader)
+ reader.readAsArrayBuffer(blob)
+ return promise
+ }
+
+ function readBlobAsText(blob) {
+ var reader = new FileReader()
+ var promise = fileReaderReady(reader)
+ reader.readAsText(blob)
+ return promise
+ }
+
+ function readArrayBufferAsText(buf) {
+ var view = new Uint8Array(buf)
+ var chars = new Array(view.length)
+
+ for (var i = 0; i < view.length; i++) {
+ chars[i] = String.fromCharCode(view[i])
+ }
+ return chars.join('')
+ }
+
+ function bufferClone(buf) {
+ if (buf.slice) {
+ return buf.slice(0)
+ } else {
+ var view = new Uint8Array(buf.byteLength)
+ view.set(new Uint8Array(buf))
+ return view.buffer
+ }
+ }
+
+ function Body() {
+ this.bodyUsed = false
+
+ this._initBody = function(body) {
+ this._bodyInit = body
+ if (!body) {
+ this._bodyText = ''
+ } else if (typeof body === 'string') {
+ this._bodyText = body
+ } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {
+ this._bodyBlob = body
+ } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {
+ this._bodyFormData = body
+ } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
+ this._bodyText = body.toString()
+ } else if (support.arrayBuffer && support.blob && isDataView(body)) {
+ this._bodyArrayBuffer = bufferClone(body.buffer)
+ // IE 10-11 can't handle a DataView body.
+ this._bodyInit = new Blob([this._bodyArrayBuffer])
+ } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {
+ this._bodyArrayBuffer = bufferClone(body)
+ } else {
+ throw new Error('unsupported BodyInit type')
+ }
+
+ if (!this.headers.get('content-type')) {
+ if (typeof body === 'string') {
+ this.headers.set('content-type', 'text/plain;charset=UTF-8')
+ } else if (this._bodyBlob && this._bodyBlob.type) {
+ this.headers.set('content-type', this._bodyBlob.type)
+ } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {
+ this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')
+ }
+ }
+ }
+
+ if (support.blob) {
+ this.blob = function() {
+ var rejected = consumed(this)
+ if (rejected) {
+ return rejected
+ }
+
+ if (this._bodyBlob) {
+ return Promise.resolve(this._bodyBlob)
+ } else if (this._bodyArrayBuffer) {
+ return Promise.resolve(new Blob([this._bodyArrayBuffer]))
+ } else if (this._bodyFormData) {
+ throw new Error('could not read FormData body as blob')
+ } else {
+ return Promise.resolve(new Blob([this._bodyText]))
+ }
+ }
+
+ this.arrayBuffer = function() {
+ if (this._bodyArrayBuffer) {
+ return consumed(this) || Promise.resolve(this._bodyArrayBuffer)
+ } else {
+ return this.blob().then(readBlobAsArrayBuffer)
+ }
+ }
+ }
+
+ this.text = function() {
+ var rejected = consumed(this)
+ if (rejected) {
+ return rejected
+ }
+
+ if (this._bodyBlob) {
+ return readBlobAsText(this._bodyBlob)
+ } else if (this._bodyArrayBuffer) {
+ return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))
+ } else if (this._bodyFormData) {
+ throw new Error('could not read FormData body as text')
+ } else {
+ return Promise.resolve(this._bodyText)
+ }
+ }
+
+ if (support.formData) {
+ this.formData = function() {
+ return this.text().then(decode)
+ }
+ }
+
+ this.json = function() {
+ return this.text().then(JSON.parse)
+ }
+
+ return this
+ }
+
+ // HTTP methods whose capitalization should be normalized
+ var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']
+
+ function normalizeMethod(method) {
+ var upcased = method.toUpperCase()
+ return (methods.indexOf(upcased) > -1) ? upcased : method
+ }
+
+ function Request(input, options) {
+ options = options || {}
+ var body = options.body
+
+ if (input instanceof Request) {
+ if (input.bodyUsed) {
+ throw new TypeError('Already read')
+ }
+ this.url = input.url
+ this.credentials = input.credentials
+ if (!options.headers) {
+ this.headers = new Headers(input.headers)
+ }
+ this.method = input.method
+ this.mode = input.mode
+ if (!body && input._bodyInit != null) {
+ body = input._bodyInit
+ input.bodyUsed = true
+ }
+ } else {
+ this.url = String(input)
+ }
+
+ this.credentials = options.credentials || this.credentials || 'omit'
+ if (options.headers || !this.headers) {
+ this.headers = new Headers(options.headers)
+ }
+ this.method = normalizeMethod(options.method || this.method || 'GET')
+ this.mode = options.mode || this.mode || null
+ this.referrer = null
+
+ if ((this.method === 'GET' || this.method === 'HEAD') && body) {
+ throw new TypeError('Body not allowed for GET or HEAD requests')
+ }
+ this._initBody(body)
+ }
+
+ Request.prototype.clone = function() {
+ return new Request(this, { body: this._bodyInit })
+ }
+
+ function decode(body) {
+ var form = new FormData()
+ body.trim().split('&').forEach(function(bytes) {
+ if (bytes) {
+ var split = bytes.split('=')
+ var name = split.shift().replace(/\+/g, ' ')
+ var value = split.join('=').replace(/\+/g, ' ')
+ form.append(decodeURIComponent(name), decodeURIComponent(value))
+ }
+ })
+ return form
+ }
+
+ function parseHeaders(rawHeaders) {
+ var headers = new Headers()
+ rawHeaders.split(/\r?\n/).forEach(function(line) {
+ var parts = line.split(':')
+ var key = parts.shift().trim()
+ if (key) {
+ var value = parts.join(':').trim()
+ headers.append(key, value)
+ }
+ })
+ return headers
+ }
+
+ Body.call(Request.prototype)
+
+ function Response(bodyInit, options) {
+ if (!options) {
+ options = {}
+ }
+
+ this.type = 'default'
+ this.status = 'status' in options ? options.status : 200
+ this.ok = this.status >= 200 && this.status < 300
+ this.statusText = 'statusText' in options ? options.statusText : 'OK'
+ this.headers = new Headers(options.headers)
+ this.url = options.url || ''
+ this._initBody(bodyInit)
+ }
+
+ Body.call(Response.prototype)
+
+ Response.prototype.clone = function() {
+ return new Response(this._bodyInit, {
+ status: this.status,
+ statusText: this.statusText,
+ headers: new Headers(this.headers),
+ url: this.url
+ })
+ }
+
+ Response.error = function() {
+ var response = new Response(null, {status: 0, statusText: ''})
+ response.type = 'error'
+ return response
+ }
+
+ var redirectStatuses = [301, 302, 303, 307, 308]
+
+ Response.redirect = function(url, status) {
+ if (redirectStatuses.indexOf(status) === -1) {
+ throw new RangeError('Invalid status code')
+ }
+
+ return new Response(null, {status: status, headers: {location: url}})
+ }
+
+ self.Headers = Headers
+ self.Request = Request
+ self.Response = Response
+
+ self.fetch = function(input, init) {
+ return new Promise(function(resolve, reject) {
+ var request = new Request(input, init)
+ var xhr = new XMLHttpRequest()
+
+ xhr.onload = function() {
+ var options = {
+ status: xhr.status,
+ statusText: xhr.statusText,
+ headers: parseHeaders(xhr.getAllResponseHeaders() || '')
+ }
+ options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')
+ var body = 'response' in xhr ? xhr.response : xhr.responseText
+ resolve(new Response(body, options))
+ }
+
+ xhr.onerror = function() {
+ reject(new TypeError('Network request failed'))
+ }
+
+ xhr.ontimeout = function() {
+ reject(new TypeError('Network request failed'))
+ }
+
+ xhr.open(request.method, request.url, true)
+
+ if (request.credentials === 'include') {
+ xhr.withCredentials = true
+ }
+
+ if ('responseType' in xhr && support.blob) {
+ xhr.responseType = 'blob'
+ }
+
+ request.headers.forEach(function(value, name) {
+ xhr.setRequestHeader(name, value)
+ })
+
+ xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)
+ })
+ }
+ self.fetch.polyfill = true
+})(typeof self !== 'undefined' ? self : this);
+
+
+/***/ }),
+/* 10 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(1);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react_dom__ = __webpack_require__(12);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_react_dom___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_react_dom__);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__App__ = __webpack_require__(16);
+__WEBPACK_IMPORTED_MODULE_1_react_dom___default.a.render(__WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement(__WEBPACK_IMPORTED_MODULE_2__App__["a" /* default */],null),document.getElementById('root'));
+
+/***/ }),
+/* 11 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+/** @license React v16.5.1
+ * react.production.min.js
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+var m=__webpack_require__(0),n="function"===typeof Symbol&&Symbol.for,p=n?Symbol.for("react.element"):60103,q=n?Symbol.for("react.portal"):60106,r=n?Symbol.for("react.fragment"):60107,t=n?Symbol.for("react.strict_mode"):60108,u=n?Symbol.for("react.profiler"):60114,v=n?Symbol.for("react.provider"):60109,w=n?Symbol.for("react.context"):60110,x=n?Symbol.for("react.async_mode"):60111,y=n?Symbol.for("react.forward_ref"):60112;n&&Symbol.for("react.placeholder");
+var z="function"===typeof Symbol&&Symbol.iterator;function A(a,b,d,c,e,g,h,f){if(!a){a=void 0;if(void 0===b)a=Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var k=[d,c,e,g,h,f],l=0;a=Error(b.replace(/%s/g,function(){return k[l++]}));a.name="Invariant Violation"}a.framesToPop=1;throw a;}}
+function B(a){for(var b=arguments.length-1,d="https://reactjs.org/docs/error-decoder.html?invariant="+a,c=0;c<b;c++)d+="&args[]="+encodeURIComponent(arguments[c+1]);A(!1,"Minified React error #"+a+"; visit %s for the full message or use the non-minified dev environment for full errors and additional helpful warnings. ",d)}var C={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},D={};
+function E(a,b,d){this.props=a;this.context=b;this.refs=D;this.updater=d||C}E.prototype.isReactComponent={};E.prototype.setState=function(a,b){"object"!==typeof a&&"function"!==typeof a&&null!=a?B("85"):void 0;this.updater.enqueueSetState(this,a,b,"setState")};E.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,"forceUpdate")};function F(){}F.prototype=E.prototype;function G(a,b,d){this.props=a;this.context=b;this.refs=D;this.updater=d||C}var H=G.prototype=new F;
+H.constructor=G;m(H,E.prototype);H.isPureReactComponent=!0;var I={current:null,currentDispatcher:null},J=Object.prototype.hasOwnProperty,K={key:!0,ref:!0,__self:!0,__source:!0};
+function L(a,b,d){var c=void 0,e={},g=null,h=null;if(null!=b)for(c in void 0!==b.ref&&(h=b.ref),void 0!==b.key&&(g=""+b.key),b)J.call(b,c)&&!K.hasOwnProperty(c)&&(e[c]=b[c]);var f=arguments.length-2;if(1===f)e.children=d;else if(1<f){for(var k=Array(f),l=0;l<f;l++)k[l]=arguments[l+2];e.children=k}if(a&&a.defaultProps)for(c in f=a.defaultProps,f)void 0===e[c]&&(e[c]=f[c]);return{$$typeof:p,type:a,key:g,ref:h,props:e,_owner:I.current}}
+function M(a,b){return{$$typeof:p,type:a.type,key:b,ref:a.ref,props:a.props,_owner:a._owner}}function N(a){return"object"===typeof a&&null!==a&&a.$$typeof===p}function escape(a){var b={"=":"=0",":":"=2"};return"$"+(""+a).replace(/[=:]/g,function(a){return b[a]})}var O=/\/+/g,P=[];function Q(a,b,d,c){if(P.length){var e=P.pop();e.result=a;e.keyPrefix=b;e.func=d;e.context=c;e.count=0;return e}return{result:a,keyPrefix:b,func:d,context:c,count:0}}
+function R(a){a.result=null;a.keyPrefix=null;a.func=null;a.context=null;a.count=0;10>P.length&&P.push(a)}
+function S(a,b,d,c){var e=typeof a;if("undefined"===e||"boolean"===e)a=null;var g=!1;if(null===a)g=!0;else switch(e){case "string":case "number":g=!0;break;case "object":switch(a.$$typeof){case p:case q:g=!0}}if(g)return d(c,a,""===b?"."+T(a,0):b),1;g=0;b=""===b?".":b+":";if(Array.isArray(a))for(var h=0;h<a.length;h++){e=a[h];var f=b+T(e,h);g+=S(e,f,d,c)}else if(null===a||"object"!==typeof a?f=null:(f=z&&a[z]||a["@@iterator"],f="function"===typeof f?f:null),"function"===typeof f)for(a=f.call(a),h=
+0;!(e=a.next()).done;)e=e.value,f=b+T(e,h++),g+=S(e,f,d,c);else"object"===e&&(d=""+a,B("31","[object Object]"===d?"object with keys {"+Object.keys(a).join(", ")+"}":d,""));return g}function U(a,b,d){return null==a?0:S(a,"",b,d)}function T(a,b){return"object"===typeof a&&null!==a&&null!=a.key?escape(a.key):b.toString(36)}function V(a,b){a.func.call(a.context,b,a.count++)}
+function aa(a,b,d){var c=a.result,e=a.keyPrefix;a=a.func.call(a.context,b,a.count++);Array.isArray(a)?W(a,c,d,function(a){return a}):null!=a&&(N(a)&&(a=M(a,e+(!a.key||b&&b.key===a.key?"":(""+a.key).replace(O,"$&/")+"/")+d)),c.push(a))}function W(a,b,d,c,e){var g="";null!=d&&(g=(""+d).replace(O,"$&/")+"/");b=Q(b,g,c,e);U(a,aa,b);R(b)}function ba(a,b){var d=I.currentDispatcher;null===d?B("277"):void 0;return d.readContext(a,b)}
+var X={Children:{map:function(a,b,d){if(null==a)return a;var c=[];W(a,c,null,b,d);return c},forEach:function(a,b,d){if(null==a)return a;b=Q(null,null,b,d);U(a,V,b);R(b)},count:function(a){return U(a,function(){return null},null)},toArray:function(a){var b=[];W(a,b,null,function(a){return a});return b},only:function(a){N(a)?void 0:B("143");return a}},createRef:function(){return{current:null}},Component:E,PureComponent:G,createContext:function(a,b){void 0===b&&(b=null);a={$$typeof:w,_calculateChangedBits:b,
+_currentValue:a,_currentValue2:a,Provider:null,Consumer:null,unstable_read:null};a.Provider={$$typeof:v,_context:a};a.Consumer=a;a.unstable_read=ba.bind(null,a);return a},forwardRef:function(a){return{$$typeof:y,render:a}},Fragment:r,StrictMode:t,unstable_AsyncMode:x,unstable_Profiler:u,createElement:L,cloneElement:function(a,b,d){null===a||void 0===a?B("267",a):void 0;var c=void 0,e=m({},a.props),g=a.key,h=a.ref,f=a._owner;if(null!=b){void 0!==b.ref&&(h=b.ref,f=I.current);void 0!==b.key&&(g=""+b.key);
+var k=void 0;a.type&&a.type.defaultProps&&(k=a.type.defaultProps);for(c in b)J.call(b,c)&&!K.hasOwnProperty(c)&&(e[c]=void 0===b[c]&&void 0!==k?k[c]:b[c])}c=arguments.length-2;if(1===c)e.children=d;else if(1<c){k=Array(c);for(var l=0;l<c;l++)k[l]=arguments[l+2];e.children=k}return{$$typeof:p,type:a.type,key:g,ref:h,props:e,_owner:f}},createFactory:function(a){var b=L.bind(null,a);b.type=a;return b},isValidElement:N,version:"16.5.1",__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:{ReactCurrentOwner:I,
+assign:m}},Y={default:X},Z=Y&&X||Y;module.exports=Z.default||Z;
+
+
+/***/ }),
+/* 12 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+function checkDCE() {
+ /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */
+ if (
+ typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' ||
+ typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function'
+ ) {
+ return;
+ }
+ if (false) {
+ // This branch is unreachable because this function is only called
+ // in production, but the condition is true only in development.
+ // Therefore if the branch is still here, dead code elimination wasn't
+ // properly applied.
+ // Don't change the message. React DevTools relies on it. Also make sure
+ // this message doesn't occur elsewhere in this function, or it will cause
+ // a false positive.
+ throw new Error('^_^');
+ }
+ try {
+ // Verify that the code above has been dead code eliminated (DCE'd).
+ __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);
+ } catch (err) {
+ // DevTools shouldn't crash React, no matter what.
+ // We should still report in case we break this code.
+ console.error(err);
+ }
+}
+
+if (true) {
+ // DCE check should happen before ReactDOM bundle executes so that
+ // DevTools can report bad minification during injection.
+ checkDCE();
+ module.exports = __webpack_require__(13);
+} else {
+ module.exports = require('./cjs/react-dom.development.js');
+}
+
+
+/***/ }),
+/* 13 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+/** @license React v16.5.1
+ * react-dom.production.min.js
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+/*
+ Modernizr 3.0.0pre (Custom Build) | MIT
+*/
+var aa=__webpack_require__(1),n=__webpack_require__(0),ba=__webpack_require__(14);function ca(a,b,c,d,e,f,g,h){if(!a){a=void 0;if(void 0===b)a=Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var k=[c,d,e,f,g,h],l=0;a=Error(b.replace(/%s/g,function(){return k[l++]}));a.name="Invariant Violation"}a.framesToPop=1;throw a;}}
+function t(a){for(var b=arguments.length-1,c="https://reactjs.org/docs/error-decoder.html?invariant="+a,d=0;d<b;d++)c+="&args[]="+encodeURIComponent(arguments[d+1]);ca(!1,"Minified React error #"+a+"; visit %s for the full message or use the non-minified dev environment for full errors and additional helpful warnings. ",c)}aa?void 0:t("227");function da(a,b,c,d,e,f,g,h,k){var l=Array.prototype.slice.call(arguments,3);try{b.apply(c,l)}catch(m){this.onError(m)}}
+var ea=!1,fa=null,ha=!1,ia=null,ja={onError:function(a){ea=!0;fa=a}};function ka(a,b,c,d,e,f,g,h,k){ea=!1;fa=null;da.apply(ja,arguments)}function la(a,b,c,d,e,f,g,h,k){ka.apply(this,arguments);if(ea){if(ea){var l=fa;ea=!1;fa=null}else t("198"),l=void 0;ha||(ha=!0,ia=l)}}var ma=null,na={};
+function oa(){if(ma)for(var a in na){var b=na[a],c=ma.indexOf(a);-1<c?void 0:t("96",a);if(!pa[c]){b.extractEvents?void 0:t("97",a);pa[c]=b;c=b.eventTypes;for(var d in c){var e=void 0;var f=c[d],g=b,h=d;qa.hasOwnProperty(h)?t("99",h):void 0;qa[h]=f;var k=f.phasedRegistrationNames;if(k){for(e in k)k.hasOwnProperty(e)&&ra(k[e],g,h);e=!0}else f.registrationName?(ra(f.registrationName,g,h),e=!0):e=!1;e?void 0:t("98",d,a)}}}}
+function ra(a,b,c){sa[a]?t("100",a):void 0;sa[a]=b;ta[a]=b.eventTypes[c].dependencies}var pa=[],qa={},sa={},ta={},ua=null,va=null,wa=null;function xa(a,b,c,d){b=a.type||"unknown-event";a.currentTarget=wa(d);la(b,c,void 0,a);a.currentTarget=null}function ya(a,b){null==b?t("30"):void 0;if(null==a)return b;if(Array.isArray(a)){if(Array.isArray(b))return a.push.apply(a,b),a;a.push(b);return a}return Array.isArray(b)?[a].concat(b):[a,b]}
+function za(a,b,c){Array.isArray(a)?a.forEach(b,c):a&&b.call(c,a)}var Aa=null;function Ba(a,b){if(a){var c=a._dispatchListeners,d=a._dispatchInstances;if(Array.isArray(c))for(var e=0;e<c.length&&!a.isPropagationStopped();e++)xa(a,b,c[e],d[e]);else c&&xa(a,b,c,d);a._dispatchListeners=null;a._dispatchInstances=null;a.isPersistent()||a.constructor.release(a)}}function Ca(a){return Ba(a,!0)}function Da(a){return Ba(a,!1)}
+var Ea={injectEventPluginOrder:function(a){ma?t("101"):void 0;ma=Array.prototype.slice.call(a);oa()},injectEventPluginsByName:function(a){var b=!1,c;for(c in a)if(a.hasOwnProperty(c)){var d=a[c];na.hasOwnProperty(c)&&na[c]===d||(na[c]?t("102",c):void 0,na[c]=d,b=!0)}b&&oa()}};
+function Fa(a,b){var c=a.stateNode;if(!c)return null;var d=ua(c);if(!d)return null;c=d[b];a:switch(b){case "onClick":case "onClickCapture":case "onDoubleClick":case "onDoubleClickCapture":case "onMouseDown":case "onMouseDownCapture":case "onMouseMove":case "onMouseMoveCapture":case "onMouseUp":case "onMouseUpCapture":(d=!d.disabled)||(a=a.type,d=!("button"===a||"input"===a||"select"===a||"textarea"===a));a=!d;break a;default:a=!1}if(a)return null;c&&"function"!==typeof c?t("231",b,typeof c):void 0;
+return c}function Ga(a,b){null!==a&&(Aa=ya(Aa,a));a=Aa;Aa=null;if(a&&(b?za(a,Ca):za(a,Da),Aa?t("95"):void 0,ha))throw b=ia,ha=!1,ia=null,b;}var Ha=Math.random().toString(36).slice(2),Ia="__reactInternalInstance$"+Ha,Ja="__reactEventHandlers$"+Ha;function Ka(a){if(a[Ia])return a[Ia];for(;!a[Ia];)if(a.parentNode)a=a.parentNode;else return null;a=a[Ia];return 7===a.tag||8===a.tag?a:null}function La(a){a=a[Ia];return!a||7!==a.tag&&8!==a.tag?null:a}
+function Ma(a){if(7===a.tag||8===a.tag)return a.stateNode;t("33")}function Na(a){return a[Ja]||null}function Oa(a){do a=a.return;while(a&&7!==a.tag);return a?a:null}function Pa(a,b,c){if(b=Fa(a,c.dispatchConfig.phasedRegistrationNames[b]))c._dispatchListeners=ya(c._dispatchListeners,b),c._dispatchInstances=ya(c._dispatchInstances,a)}
+function Qa(a){if(a&&a.dispatchConfig.phasedRegistrationNames){for(var b=a._targetInst,c=[];b;)c.push(b),b=Oa(b);for(b=c.length;0<b--;)Pa(c[b],"captured",a);for(b=0;b<c.length;b++)Pa(c[b],"bubbled",a)}}function Ra(a,b,c){a&&c&&c.dispatchConfig.registrationName&&(b=Fa(a,c.dispatchConfig.registrationName))&&(c._dispatchListeners=ya(c._dispatchListeners,b),c._dispatchInstances=ya(c._dispatchInstances,a))}function Ta(a){a&&a.dispatchConfig.registrationName&&Ra(a._targetInst,null,a)}
+function Ua(a){za(a,Qa)}var Va=!("undefined"===typeof window||!window.document||!window.document.createElement);function Wa(a,b){var c={};c[a.toLowerCase()]=b.toLowerCase();c["Webkit"+a]="webkit"+b;c["Moz"+a]="moz"+b;return c}var Ya={animationend:Wa("Animation","AnimationEnd"),animationiteration:Wa("Animation","AnimationIteration"),animationstart:Wa("Animation","AnimationStart"),transitionend:Wa("Transition","TransitionEnd")},Za={},$a={};
+Va&&($a=document.createElement("div").style,"AnimationEvent"in window||(delete Ya.animationend.animation,delete Ya.animationiteration.animation,delete Ya.animationstart.animation),"TransitionEvent"in window||delete Ya.transitionend.transition);function ab(a){if(Za[a])return Za[a];if(!Ya[a])return a;var b=Ya[a],c;for(c in b)if(b.hasOwnProperty(c)&&c in $a)return Za[a]=b[c];return a}
+var bb=ab("animationend"),cb=ab("animationiteration"),db=ab("animationstart"),eb=ab("transitionend"),fb="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),gb=null,hb=null,ib=null;
+function jb(){if(ib)return ib;var a,b=hb,c=b.length,d,e="value"in gb?gb.value:gb.textContent,f=e.length;for(a=0;a<c&&b[a]===e[a];a++);var g=c-a;for(d=1;d<=g&&b[c-d]===e[f-d];d++);return ib=e.slice(a,1<d?1-d:void 0)}function kb(){return!0}function lb(){return!1}
+function z(a,b,c,d){this.dispatchConfig=a;this._targetInst=b;this.nativeEvent=c;a=this.constructor.Interface;for(var e in a)a.hasOwnProperty(e)&&((b=a[e])?this[e]=b(c):"target"===e?this.target=d:this[e]=c[e]);this.isDefaultPrevented=(null!=c.defaultPrevented?c.defaultPrevented:!1===c.returnValue)?kb:lb;this.isPropagationStopped=lb;return this}
+n(z.prototype,{preventDefault:function(){this.defaultPrevented=!0;var a=this.nativeEvent;a&&(a.preventDefault?a.preventDefault():"unknown"!==typeof a.returnValue&&(a.returnValue=!1),this.isDefaultPrevented=kb)},stopPropagation:function(){var a=this.nativeEvent;a&&(a.stopPropagation?a.stopPropagation():"unknown"!==typeof a.cancelBubble&&(a.cancelBubble=!0),this.isPropagationStopped=kb)},persist:function(){this.isPersistent=kb},isPersistent:lb,destructor:function(){var a=this.constructor.Interface,
+b;for(b in a)this[b]=null;this.nativeEvent=this._targetInst=this.dispatchConfig=null;this.isPropagationStopped=this.isDefaultPrevented=lb;this._dispatchInstances=this._dispatchListeners=null}});z.Interface={type:null,target:null,currentTarget:function(){return null},eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(a){return a.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null};
+z.extend=function(a){function b(){}function c(){return d.apply(this,arguments)}var d=this;b.prototype=d.prototype;var e=new b;n(e,c.prototype);c.prototype=e;c.prototype.constructor=c;c.Interface=n({},d.Interface,a);c.extend=d.extend;mb(c);return c};mb(z);function nb(a,b,c,d){if(this.eventPool.length){var e=this.eventPool.pop();this.call(e,a,b,c,d);return e}return new this(a,b,c,d)}function ob(a){a instanceof this?void 0:t("279");a.destructor();10>this.eventPool.length&&this.eventPool.push(a)}
+function mb(a){a.eventPool=[];a.getPooled=nb;a.release=ob}var pb=z.extend({data:null}),qb=z.extend({data:null}),rb=[9,13,27,32],sb=Va&&"CompositionEvent"in window,tb=null;Va&&"documentMode"in document&&(tb=document.documentMode);
+var ub=Va&&"TextEvent"in window&&!tb,vb=Va&&(!sb||tb&&8<tb&&11>=tb),wb=String.fromCharCode(32),xb={beforeInput:{phasedRegistrationNames:{bubbled:"onBeforeInput",captured:"onBeforeInputCapture"},dependencies:["compositionend","keypress","textInput","paste"]},compositionEnd:{phasedRegistrationNames:{bubbled:"onCompositionEnd",captured:"onCompositionEndCapture"},dependencies:"blur compositionend keydown keypress keyup mousedown".split(" ")},compositionStart:{phasedRegistrationNames:{bubbled:"onCompositionStart",
+captured:"onCompositionStartCapture"},dependencies:"blur compositionstart keydown keypress keyup mousedown".split(" ")},compositionUpdate:{phasedRegistrationNames:{bubbled:"onCompositionUpdate",captured:"onCompositionUpdateCapture"},dependencies:"blur compositionupdate keydown keypress keyup mousedown".split(" ")}},yb=!1;
+function zb(a,b){switch(a){case "keyup":return-1!==rb.indexOf(b.keyCode);case "keydown":return 229!==b.keyCode;case "keypress":case "mousedown":case "blur":return!0;default:return!1}}function Ab(a){a=a.detail;return"object"===typeof a&&"data"in a?a.data:null}var Bb=!1;function Cb(a,b){switch(a){case "compositionend":return Ab(b);case "keypress":if(32!==b.which)return null;yb=!0;return wb;case "textInput":return a=b.data,a===wb&&yb?null:a;default:return null}}
+function Db(a,b){if(Bb)return"compositionend"===a||!sb&&zb(a,b)?(a=jb(),ib=hb=gb=null,Bb=!1,a):null;switch(a){case "paste":return null;case "keypress":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1<b.char.length)return b.char;if(b.which)return String.fromCharCode(b.which)}return null;case "compositionend":return vb&&"ko"!==b.locale?null:b.data;default:return null}}
+var Eb={eventTypes:xb,extractEvents:function(a,b,c,d){var e=void 0;var f=void 0;if(sb)b:{switch(a){case "compositionstart":e=xb.compositionStart;break b;case "compositionend":e=xb.compositionEnd;break b;case "compositionupdate":e=xb.compositionUpdate;break b}e=void 0}else Bb?zb(a,c)&&(e=xb.compositionEnd):"keydown"===a&&229===c.keyCode&&(e=xb.compositionStart);e?(vb&&"ko"!==c.locale&&(Bb||e!==xb.compositionStart?e===xb.compositionEnd&&Bb&&(f=jb()):(gb=d,hb="value"in gb?gb.value:gb.textContent,Bb=
+!0)),e=pb.getPooled(e,b,c,d),f?e.data=f:(f=Ab(c),null!==f&&(e.data=f)),Ua(e),f=e):f=null;(a=ub?Cb(a,c):Db(a,c))?(b=qb.getPooled(xb.beforeInput,b,c,d),b.data=a,Ua(b)):b=null;return null===f?b:null===b?f:[f,b]}},Fb=null,Gb=null,Hb=null;function Ib(a){if(a=va(a)){"function"!==typeof Fb?t("280"):void 0;var b=ua(a.stateNode);Fb(a.stateNode,a.type,b)}}function Jb(a){Gb?Hb?Hb.push(a):Hb=[a]:Gb=a}function Kb(){if(Gb){var a=Gb,b=Hb;Hb=Gb=null;Ib(a);if(b)for(a=0;a<b.length;a++)Ib(b[a])}}
+function Lb(a,b){return a(b)}function Mb(a,b,c){return a(b,c)}function Nb(){}var Ob=!1;function Pb(a,b){if(Ob)return a(b);Ob=!0;try{return Lb(a,b)}finally{if(Ob=!1,null!==Gb||null!==Hb)Nb(),Kb()}}var Qb={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Rb(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return"input"===b?!!Qb[a.type]:"textarea"===b?!0:!1}
+function Sb(a){a=a.target||a.srcElement||window;a.correspondingUseElement&&(a=a.correspondingUseElement);return 3===a.nodeType?a.parentNode:a}function Tb(a){if(!Va)return!1;a="on"+a;var b=a in document;b||(b=document.createElement("div"),b.setAttribute(a,"return;"),b="function"===typeof b[a]);return b}function Ub(a){var b=a.type;return(a=a.nodeName)&&"input"===a.toLowerCase()&&("checkbox"===b||"radio"===b)}
+function Vb(a){var b=Ub(a)?"checked":"value",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=""+a[b];if(!a.hasOwnProperty(b)&&"undefined"!==typeof c&&"function"===typeof c.get&&"function"===typeof c.set){var e=c.get,f=c.set;Object.defineProperty(a,b,{configurable:!0,get:function(){return e.call(this)},set:function(a){d=""+a;f.call(this,a)}});Object.defineProperty(a,b,{enumerable:c.enumerable});return{getValue:function(){return d},setValue:function(a){d=""+a},stopTracking:function(){a._valueTracker=
+null;delete a[b]}}}}function Wb(a){a._valueTracker||(a._valueTracker=Vb(a))}function Xb(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d="";a&&(d=Ub(a)?a.checked?"true":"false":a.value);a=d;return a!==c?(b.setValue(a),!0):!1}
+var Yb=aa.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,Zb=/^(.*)[\\\/]/,C="function"===typeof Symbol&&Symbol.for,$b=C?Symbol.for("react.element"):60103,ac=C?Symbol.for("react.portal"):60106,bc=C?Symbol.for("react.fragment"):60107,cc=C?Symbol.for("react.strict_mode"):60108,dc=C?Symbol.for("react.profiler"):60114,ec=C?Symbol.for("react.provider"):60109,fc=C?Symbol.for("react.context"):60110,gc=C?Symbol.for("react.async_mode"):60111,hc=C?Symbol.for("react.forward_ref"):60112,ic=C?Symbol.for("react.placeholder"):
+60113,jc="function"===typeof Symbol&&Symbol.iterator;function kc(a){if(null===a||"object"!==typeof a)return null;a=jc&&a[jc]||a["@@iterator"];return"function"===typeof a?a:null}
+function lc(a){if(null==a)return null;if("function"===typeof a)return a.displayName||a.name||null;if("string"===typeof a)return a;switch(a){case gc:return"AsyncMode";case bc:return"Fragment";case ac:return"Portal";case dc:return"Profiler";case cc:return"StrictMode";case ic:return"Placeholder"}if("object"===typeof a){switch(a.$$typeof){case fc:return"Context.Consumer";case ec:return"Context.Provider";case hc:var b=a.render;b=b.displayName||b.name||"";return a.displayName||(""!==b?"ForwardRef("+b+")":
+"ForwardRef")}if("function"===typeof a.then&&(a=1===a._reactStatus?a._reactResult:null))return lc(a)}return null}function mc(a){var b="";do{a:switch(a.tag){case 4:case 0:case 1:case 2:case 3:case 7:case 10:var c=a._debugOwner,d=a._debugSource,e=lc(a.type);var f=null;c&&(f=lc(c.type));c=e;e="";d?e=" (at "+d.fileName.replace(Zb,"")+":"+d.lineNumber+")":f&&(e=" (created by "+f+")");f="\n in "+(c||"Unknown")+e;break a;default:f=""}b+=f;a=a.return}while(a);return b}
+var nc=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,pc=Object.prototype.hasOwnProperty,qc={},rc={};
+function sc(a){if(pc.call(rc,a))return!0;if(pc.call(qc,a))return!1;if(nc.test(a))return rc[a]=!0;qc[a]=!0;return!1}function tc(a,b,c,d){if(null!==c&&0===c.type)return!1;switch(typeof b){case "function":case "symbol":return!0;case "boolean":if(d)return!1;if(null!==c)return!c.acceptsBooleans;a=a.toLowerCase().slice(0,5);return"data-"!==a&&"aria-"!==a;default:return!1}}
+function uc(a,b,c,d){if(null===b||"undefined"===typeof b||tc(a,b,c,d))return!0;if(d)return!1;if(null!==c)switch(c.type){case 3:return!b;case 4:return!1===b;case 5:return isNaN(b);case 6:return isNaN(b)||1>b}return!1}function D(a,b,c,d,e){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b}var E={};
+"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(a){E[a]=new D(a,0,!1,a,null)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(a){var b=a[0];E[b]=new D(b,1,!1,a[1],null)});["contentEditable","draggable","spellCheck","value"].forEach(function(a){E[a]=new D(a,2,!1,a.toLowerCase(),null)});
+["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(a){E[a]=new D(a,2,!1,a,null)});"allowFullScreen async autoFocus autoPlay controls default defer disabled formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(a){E[a]=new D(a,3,!1,a.toLowerCase(),null)});["checked","multiple","muted","selected"].forEach(function(a){E[a]=new D(a,3,!0,a,null)});
+["capture","download"].forEach(function(a){E[a]=new D(a,4,!1,a,null)});["cols","rows","size","span"].forEach(function(a){E[a]=new D(a,6,!1,a,null)});["rowSpan","start"].forEach(function(a){E[a]=new D(a,5,!1,a.toLowerCase(),null)});var vc=/[\-:]([a-z])/g;function wc(a){return a[1].toUpperCase()}
+"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(a){var b=a.replace(vc,
+wc);E[b]=new D(b,1,!1,a,null)});"xlink:actuate xlink:arcrole xlink:href xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(a){var b=a.replace(vc,wc);E[b]=new D(b,1,!1,a,"http://www.w3.org/1999/xlink")});["xml:base","xml:lang","xml:space"].forEach(function(a){var b=a.replace(vc,wc);E[b]=new D(b,1,!1,a,"http://www.w3.org/XML/1998/namespace")});E.tabIndex=new D("tabIndex",1,!1,"tabindex",null);
+function xc(a,b,c,d){var e=E.hasOwnProperty(b)?E[b]:null;var f=null!==e?0===e.type:d?!1:!(2<b.length)||"o"!==b[0]&&"O"!==b[0]||"n"!==b[1]&&"N"!==b[1]?!1:!0;f||(uc(b,c,e,d)&&(c=null),d||null===e?sc(b)&&(null===c?a.removeAttribute(b):a.setAttribute(b,""+c)):e.mustUseProperty?a[e.propertyName]=null===c?3===e.type?!1:"":c:(b=e.attributeName,d=e.attributeNamespace,null===c?a.removeAttribute(b):(e=e.type,c=3===e||4===e&&!0===c?"":""+c,d?a.setAttributeNS(d,b,c):a.setAttribute(b,c))))}
+function yc(a){switch(typeof a){case "boolean":case "number":case "object":case "string":case "undefined":return a;default:return""}}function zc(a,b){var c=b.checked;return n({},b,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=c?c:a._wrapperState.initialChecked})}
+function Bc(a,b){var c=null==b.defaultValue?"":b.defaultValue,d=null!=b.checked?b.checked:b.defaultChecked;c=yc(null!=b.value?b.value:c);a._wrapperState={initialChecked:d,initialValue:c,controlled:"checkbox"===b.type||"radio"===b.type?null!=b.checked:null!=b.value}}function Cc(a,b){b=b.checked;null!=b&&xc(a,"checked",b,!1)}
+function Dc(a,b){Cc(a,b);var c=yc(b.value),d=b.type;if(null!=c)if("number"===d){if(0===c&&""===a.value||a.value!=c)a.value=""+c}else a.value!==""+c&&(a.value=""+c);else if("submit"===d||"reset"===d){a.removeAttribute("value");return}b.hasOwnProperty("value")?Ec(a,b.type,c):b.hasOwnProperty("defaultValue")&&Ec(a,b.type,yc(b.defaultValue));null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)}
+function Fc(a,b,c){if(b.hasOwnProperty("value")||b.hasOwnProperty("defaultValue")){var d=b.type;if(!("submit"!==d&&"reset"!==d||void 0!==b.value&&null!==b.value))return;b=""+a._wrapperState.initialValue;c||b===a.value||(a.value=b);a.defaultValue=b}c=a.name;""!==c&&(a.name="");a.defaultChecked=!a.defaultChecked;a.defaultChecked=!!a._wrapperState.initialChecked;""!==c&&(a.name=c)}
+function Ec(a,b,c){if("number"!==b||a.ownerDocument.activeElement!==a)null==c?a.defaultValue=""+a._wrapperState.initialValue:a.defaultValue!==""+c&&(a.defaultValue=""+c)}var Gc={change:{phasedRegistrationNames:{bubbled:"onChange",captured:"onChangeCapture"},dependencies:"blur change click focus input keydown keyup selectionchange".split(" ")}};function Hc(a,b,c){a=z.getPooled(Gc.change,a,b,c);a.type="change";Jb(c);Ua(a);return a}var Ic=null,Jc=null;function Kc(a){Ga(a,!1)}
+function Lc(a){var b=Ma(a);if(Xb(b))return a}function Mc(a,b){if("change"===a)return b}var Nc=!1;Va&&(Nc=Tb("input")&&(!document.documentMode||9<document.documentMode));function Oc(){Ic&&(Ic.detachEvent("onpropertychange",Pc),Jc=Ic=null)}function Pc(a){"value"===a.propertyName&&Lc(Jc)&&(a=Hc(Jc,a,Sb(a)),Pb(Kc,a))}function Qc(a,b,c){"focus"===a?(Oc(),Ic=b,Jc=c,Ic.attachEvent("onpropertychange",Pc)):"blur"===a&&Oc()}function Rc(a){if("selectionchange"===a||"keyup"===a||"keydown"===a)return Lc(Jc)}
+function Sc(a,b){if("click"===a)return Lc(b)}function Tc(a,b){if("input"===a||"change"===a)return Lc(b)}
+var Uc={eventTypes:Gc,_isInputEventSupported:Nc,extractEvents:function(a,b,c,d){var e=b?Ma(b):window,f=void 0,g=void 0,h=e.nodeName&&e.nodeName.toLowerCase();"select"===h||"input"===h&&"file"===e.type?f=Mc:Rb(e)?Nc?f=Tc:(f=Rc,g=Qc):(h=e.nodeName)&&"input"===h.toLowerCase()&&("checkbox"===e.type||"radio"===e.type)&&(f=Sc);if(f&&(f=f(a,b)))return Hc(f,c,d);g&&g(a,e,b);"blur"===a&&(a=e._wrapperState)&&a.controlled&&"number"===e.type&&Ec(e,"number",e.value)}},Vc=z.extend({view:null,detail:null}),Wc={Alt:"altKey",
+Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function Xc(a){var b=this.nativeEvent;return b.getModifierState?b.getModifierState(a):(a=Wc[a])?!!b[a]:!1}function Yc(){return Xc}
+var Zc=0,$c=0,ad=!1,bd=!1,cd=Vc.extend({screenX:null,screenY:null,clientX:null,clientY:null,pageX:null,pageY:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,getModifierState:Yc,button:null,buttons:null,relatedTarget:function(a){return a.relatedTarget||(a.fromElement===a.srcElement?a.toElement:a.fromElement)},movementX:function(a){if("movementX"in a)return a.movementX;var b=Zc;Zc=a.screenX;return ad?"mousemove"===a.type?a.screenX-b:0:(ad=!0,0)},movementY:function(a){if("movementY"in a)return a.movementY;
+var b=$c;$c=a.screenY;return bd?"mousemove"===a.type?a.screenY-b:0:(bd=!0,0)}}),dd=cd.extend({pointerId:null,width:null,height:null,pressure:null,tangentialPressure:null,tiltX:null,tiltY:null,twist:null,pointerType:null,isPrimary:null}),ed={mouseEnter:{registrationName:"onMouseEnter",dependencies:["mouseout","mouseover"]},mouseLeave:{registrationName:"onMouseLeave",dependencies:["mouseout","mouseover"]},pointerEnter:{registrationName:"onPointerEnter",dependencies:["pointerout","pointerover"]},pointerLeave:{registrationName:"onPointerLeave",
+dependencies:["pointerout","pointerover"]}},fd={eventTypes:ed,extractEvents:function(a,b,c,d){var e="mouseover"===a||"pointerover"===a,f="mouseout"===a||"pointerout"===a;if(e&&(c.relatedTarget||c.fromElement)||!f&&!e)return null;e=d.window===d?d:(e=d.ownerDocument)?e.defaultView||e.parentWindow:window;f?(f=b,b=(b=c.relatedTarget||c.toElement)?Ka(b):null):f=null;if(f===b)return null;var g=void 0,h=void 0,k=void 0,l=void 0;if("mouseout"===a||"mouseover"===a)g=cd,h=ed.mouseLeave,k=ed.mouseEnter,l="mouse";
+else if("pointerout"===a||"pointerover"===a)g=dd,h=ed.pointerLeave,k=ed.pointerEnter,l="pointer";var m=null==f?e:Ma(f);e=null==b?e:Ma(b);a=g.getPooled(h,f,c,d);a.type=l+"leave";a.target=m;a.relatedTarget=e;c=g.getPooled(k,b,c,d);c.type=l+"enter";c.target=e;c.relatedTarget=m;d=b;if(f&&d)a:{b=f;e=d;l=0;for(g=b;g;g=Oa(g))l++;g=0;for(k=e;k;k=Oa(k))g++;for(;0<l-g;)b=Oa(b),l--;for(;0<g-l;)e=Oa(e),g--;for(;l--;){if(b===e||b===e.alternate)break a;b=Oa(b);e=Oa(e)}b=null}else b=null;e=b;for(b=[];f&&f!==e;){l=
+f.alternate;if(null!==l&&l===e)break;b.push(f);f=Oa(f)}for(f=[];d&&d!==e;){l=d.alternate;if(null!==l&&l===e)break;f.push(d);d=Oa(d)}for(d=0;d<b.length;d++)Ra(b[d],"bubbled",a);for(d=f.length;0<d--;)Ra(f[d],"captured",c);return[a,c]}},gd=Object.prototype.hasOwnProperty;function hd(a,b){return a===b?0!==a||0!==b||1/a===1/b:a!==a&&b!==b}
+function id(a,b){if(hd(a,b))return!0;if("object"!==typeof a||null===a||"object"!==typeof b||null===b)return!1;var c=Object.keys(a),d=Object.keys(b);if(c.length!==d.length)return!1;for(d=0;d<c.length;d++)if(!gd.call(b,c[d])||!hd(a[c[d]],b[c[d]]))return!1;return!0}function jd(a){var b=a;if(a.alternate)for(;b.return;)b=b.return;else{if(0!==(b.effectTag&2))return 1;for(;b.return;)if(b=b.return,0!==(b.effectTag&2))return 1}return 5===b.tag?2:3}function kd(a){2!==jd(a)?t("188"):void 0}
+function ld(a){var b=a.alternate;if(!b)return b=jd(a),3===b?t("188"):void 0,1===b?null:a;for(var c=a,d=b;;){var e=c.return,f=e?e.alternate:null;if(!e||!f)break;if(e.child===f.child){for(var g=e.child;g;){if(g===c)return kd(e),a;if(g===d)return kd(e),b;g=g.sibling}t("188")}if(c.return!==d.return)c=e,d=f;else{g=!1;for(var h=e.child;h;){if(h===c){g=!0;c=e;d=f;break}if(h===d){g=!0;d=e;c=f;break}h=h.sibling}if(!g){for(h=f.child;h;){if(h===c){g=!0;c=f;d=e;break}if(h===d){g=!0;d=f;c=e;break}h=h.sibling}g?
+void 0:t("189")}}c.alternate!==d?t("190"):void 0}5!==c.tag?t("188"):void 0;return c.stateNode.current===c?a:b}function md(a){a=ld(a);if(!a)return null;for(var b=a;;){if(7===b.tag||8===b.tag)return b;if(b.child)b.child.return=b,b=b.child;else{if(b===a)break;for(;!b.sibling;){if(!b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}}return null}
+var nd=z.extend({animationName:null,elapsedTime:null,pseudoElement:null}),od=z.extend({clipboardData:function(a){return"clipboardData"in a?a.clipboardData:window.clipboardData}}),pd=Vc.extend({relatedTarget:null});function qd(a){var b=a.keyCode;"charCode"in a?(a=a.charCode,0===a&&13===b&&(a=13)):a=b;10===a&&(a=13);return 32<=a||13===a?a:0}
+var rd={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},sd={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",
+116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},td=Vc.extend({key:function(a){if(a.key){var b=rd[a.key]||a.key;if("Unidentified"!==b)return b}return"keypress"===a.type?(a=qd(a),13===a?"Enter":String.fromCharCode(a)):"keydown"===a.type||"keyup"===a.type?sd[a.keyCode]||"Unidentified":""},location:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,repeat:null,locale:null,getModifierState:Yc,charCode:function(a){return"keypress"===
+a.type?qd(a):0},keyCode:function(a){return"keydown"===a.type||"keyup"===a.type?a.keyCode:0},which:function(a){return"keypress"===a.type?qd(a):"keydown"===a.type||"keyup"===a.type?a.keyCode:0}}),ud=cd.extend({dataTransfer:null}),vd=Vc.extend({touches:null,targetTouches:null,changedTouches:null,altKey:null,metaKey:null,ctrlKey:null,shiftKey:null,getModifierState:Yc}),wd=z.extend({propertyName:null,elapsedTime:null,pseudoElement:null}),xd=cd.extend({deltaX:function(a){return"deltaX"in a?a.deltaX:"wheelDeltaX"in
+a?-a.wheelDeltaX:0},deltaY:function(a){return"deltaY"in a?a.deltaY:"wheelDeltaY"in a?-a.wheelDeltaY:"wheelDelta"in a?-a.wheelDelta:0},deltaZ:null,deltaMode:null}),yd=[["abort","abort"],[bb,"animationEnd"],[cb,"animationIteration"],[db,"animationStart"],["canplay","canPlay"],["canplaythrough","canPlayThrough"],["drag","drag"],["dragenter","dragEnter"],["dragexit","dragExit"],["dragleave","dragLeave"],["dragover","dragOver"],["durationchange","durationChange"],["emptied","emptied"],["encrypted","encrypted"],
+["ended","ended"],["error","error"],["gotpointercapture","gotPointerCapture"],["load","load"],["loadeddata","loadedData"],["loadedmetadata","loadedMetadata"],["loadstart","loadStart"],["lostpointercapture","lostPointerCapture"],["mousemove","mouseMove"],["mouseout","mouseOut"],["mouseover","mouseOver"],["playing","playing"],["pointermove","pointerMove"],["pointerout","pointerOut"],["pointerover","pointerOver"],["progress","progress"],["scroll","scroll"],["seeking","seeking"],["stalled","stalled"],
+["suspend","suspend"],["timeupdate","timeUpdate"],["toggle","toggle"],["touchmove","touchMove"],[eb,"transitionEnd"],["waiting","waiting"],["wheel","wheel"]],zd={},Ad={};function Bd(a,b){var c=a[0];a=a[1];var d="on"+(a[0].toUpperCase()+a.slice(1));b={phasedRegistrationNames:{bubbled:d,captured:d+"Capture"},dependencies:[c],isInteractive:b};zd[a]=b;Ad[c]=b}
+[["blur","blur"],["cancel","cancel"],["click","click"],["close","close"],["contextmenu","contextMenu"],["copy","copy"],["cut","cut"],["auxclick","auxClick"],["dblclick","doubleClick"],["dragend","dragEnd"],["dragstart","dragStart"],["drop","drop"],["focus","focus"],["input","input"],["invalid","invalid"],["keydown","keyDown"],["keypress","keyPress"],["keyup","keyUp"],["mousedown","mouseDown"],["mouseup","mouseUp"],["paste","paste"],["pause","pause"],["play","play"],["pointercancel","pointerCancel"],
+["pointerdown","pointerDown"],["pointerup","pointerUp"],["ratechange","rateChange"],["reset","reset"],["seeked","seeked"],["submit","submit"],["touchcancel","touchCancel"],["touchend","touchEnd"],["touchstart","touchStart"],["volumechange","volumeChange"]].forEach(function(a){Bd(a,!0)});yd.forEach(function(a){Bd(a,!1)});
+var Cd={eventTypes:zd,isInteractiveTopLevelEventType:function(a){a=Ad[a];return void 0!==a&&!0===a.isInteractive},extractEvents:function(a,b,c,d){var e=Ad[a];if(!e)return null;switch(a){case "keypress":if(0===qd(c))return null;case "keydown":case "keyup":a=td;break;case "blur":case "focus":a=pd;break;case "click":if(2===c.button)return null;case "auxclick":case "dblclick":case "mousedown":case "mousemove":case "mouseup":case "mouseout":case "mouseover":case "contextmenu":a=cd;break;case "drag":case "dragend":case "dragenter":case "dragexit":case "dragleave":case "dragover":case "dragstart":case "drop":a=
+ud;break;case "touchcancel":case "touchend":case "touchmove":case "touchstart":a=vd;break;case bb:case cb:case db:a=nd;break;case eb:a=wd;break;case "scroll":a=Vc;break;case "wheel":a=xd;break;case "copy":case "cut":case "paste":a=od;break;case "gotpointercapture":case "lostpointercapture":case "pointercancel":case "pointerdown":case "pointermove":case "pointerout":case "pointerover":case "pointerup":a=dd;break;default:a=z}b=a.getPooled(e,b,c,d);Ua(b);return b}},Dd=Cd.isInteractiveTopLevelEventType,
+Ed=[];function Fd(a){var b=a.targetInst,c=b;do{if(!c){a.ancestors.push(c);break}var d;for(d=c;d.return;)d=d.return;d=5!==d.tag?null:d.stateNode.containerInfo;if(!d)break;a.ancestors.push(c);c=Ka(d)}while(c);for(c=0;c<a.ancestors.length;c++){b=a.ancestors[c];var e=Sb(a.nativeEvent);d=a.topLevelType;for(var f=a.nativeEvent,g=null,h=0;h<pa.length;h++){var k=pa[h];k&&(k=k.extractEvents(d,b,f,e))&&(g=ya(g,k))}Ga(g,!1)}}var Gd=!0;
+function F(a,b){if(!b)return null;var c=(Dd(a)?Hd:Id).bind(null,a);b.addEventListener(a,c,!1)}function Jd(a,b){if(!b)return null;var c=(Dd(a)?Hd:Id).bind(null,a);b.addEventListener(a,c,!0)}function Hd(a,b){Mb(Id,a,b)}
+function Id(a,b){if(Gd){var c=Sb(b);c=Ka(c);null===c||"number"!==typeof c.tag||2===jd(c)||(c=null);if(Ed.length){var d=Ed.pop();d.topLevelType=a;d.nativeEvent=b;d.targetInst=c;a=d}else a={topLevelType:a,nativeEvent:b,targetInst:c,ancestors:[]};try{Pb(Fd,a)}finally{a.topLevelType=null,a.nativeEvent=null,a.targetInst=null,a.ancestors.length=0,10>Ed.length&&Ed.push(a)}}}var Kd={},Ld=0,Md="_reactListenersID"+(""+Math.random()).slice(2);
+function Nd(a){Object.prototype.hasOwnProperty.call(a,Md)||(a[Md]=Ld++,Kd[a[Md]]={});return Kd[a[Md]]}function Od(a){a=a||("undefined"!==typeof document?document:void 0);if("undefined"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}function Qd(a){for(;a&&a.firstChild;)a=a.firstChild;return a}
+function Rd(a,b){var c=Qd(a);a=0;for(var d;c;){if(3===c.nodeType){d=a+c.textContent.length;if(a<=b&&d>=b)return{node:c,offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=Qd(c)}}function Sd(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?Sd(a,b.parentNode):"contains"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}
+function Td(){for(var a=window,b=Od();b instanceof a.HTMLIFrameElement;){try{a=b.contentDocument.defaultView}catch(c){break}b=Od(a.document)}return b}function Ud(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&("input"===b&&("text"===a.type||"search"===a.type||"tel"===a.type||"url"===a.type||"password"===a.type)||"textarea"===b||"true"===a.contentEditable)}
+var Vd=Va&&"documentMode"in document&&11>=document.documentMode,Wd={select:{phasedRegistrationNames:{bubbled:"onSelect",captured:"onSelectCapture"},dependencies:"blur contextmenu dragend focus keydown keyup mousedown mouseup selectionchange".split(" ")}},Xd=null,Yd=null,Zd=null,$d=!1;
+function ae(a,b){var c=b.window===b?b.document:9===b.nodeType?b:b.ownerDocument;if($d||null==Xd||Xd!==Od(c))return null;c=Xd;"selectionStart"in c&&Ud(c)?c={start:c.selectionStart,end:c.selectionEnd}:(c=(c.ownerDocument&&c.ownerDocument.defaultView||window).getSelection(),c={anchorNode:c.anchorNode,anchorOffset:c.anchorOffset,focusNode:c.focusNode,focusOffset:c.focusOffset});return Zd&&id(Zd,c)?null:(Zd=c,a=z.getPooled(Wd.select,Yd,a,b),a.type="select",a.target=Xd,Ua(a),a)}
+var be={eventTypes:Wd,extractEvents:function(a,b,c,d){var e=d.window===d?d.document:9===d.nodeType?d:d.ownerDocument,f;if(!(f=!e)){a:{e=Nd(e);f=ta.onSelect;for(var g=0;g<f.length;g++){var h=f[g];if(!e.hasOwnProperty(h)||!e[h]){e=!1;break a}}e=!0}f=!e}if(f)return null;e=b?Ma(b):window;switch(a){case "focus":if(Rb(e)||"true"===e.contentEditable)Xd=e,Yd=b,Zd=null;break;case "blur":Zd=Yd=Xd=null;break;case "mousedown":$d=!0;break;case "contextmenu":case "mouseup":case "dragend":return $d=!1,ae(c,d);case "selectionchange":if(Vd)break;
+case "keydown":case "keyup":return ae(c,d)}return null}};Ea.injectEventPluginOrder("ResponderEventPlugin SimpleEventPlugin EnterLeaveEventPlugin ChangeEventPlugin SelectEventPlugin BeforeInputEventPlugin".split(" "));ua=Na;va=La;wa=Ma;Ea.injectEventPluginsByName({SimpleEventPlugin:Cd,EnterLeaveEventPlugin:fd,ChangeEventPlugin:Uc,SelectEventPlugin:be,BeforeInputEventPlugin:Eb});function ce(a){var b="";aa.Children.forEach(a,function(a){null!=a&&(b+=a)});return b}
+function de(a,b){a=n({children:void 0},b);if(b=ce(b.children))a.children=b;return a}function ee(a,b,c,d){a=a.options;if(b){b={};for(var e=0;e<c.length;e++)b["$"+c[e]]=!0;for(c=0;c<a.length;c++)e=b.hasOwnProperty("$"+a[c].value),a[c].selected!==e&&(a[c].selected=e),e&&d&&(a[c].defaultSelected=!0)}else{c=""+yc(c);b=null;for(e=0;e<a.length;e++){if(a[e].value===c){a[e].selected=!0;d&&(a[e].defaultSelected=!0);return}null!==b||a[e].disabled||(b=a[e])}null!==b&&(b.selected=!0)}}
+function fe(a,b){null!=b.dangerouslySetInnerHTML?t("91"):void 0;return n({},b,{value:void 0,defaultValue:void 0,children:""+a._wrapperState.initialValue})}function ge(a,b){var c=b.value;null==c&&(c=b.defaultValue,b=b.children,null!=b&&(null!=c?t("92"):void 0,Array.isArray(b)&&(1>=b.length?void 0:t("93"),b=b[0]),c=b),null==c&&(c=""));a._wrapperState={initialValue:yc(c)}}
+function he(a,b){var c=yc(b.value);null!=c&&(c=""+c,c!==a.value&&(a.value=c),null==b.defaultValue&&(a.defaultValue=c));null!=b.defaultValue&&(a.defaultValue=""+yc(b.defaultValue))}function ie(a){var b=a.textContent;b===a._wrapperState.initialValue&&(a.value=b)}var je={html:"http://www.w3.org/1999/xhtml",mathml:"http://www.w3.org/1998/Math/MathML",svg:"http://www.w3.org/2000/svg"};
+function ke(a){switch(a){case "svg":return"http://www.w3.org/2000/svg";case "math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function le(a,b){return null==a||"http://www.w3.org/1999/xhtml"===a?ke(b):"http://www.w3.org/2000/svg"===a&&"foreignObject"===b?"http://www.w3.org/1999/xhtml":a}
+var me=void 0,ne=function(a){return"undefined"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(b,c,d,e){MSApp.execUnsafeLocalFunction(function(){return a(b,c,d,e)})}:a}(function(a,b){if(a.namespaceURI!==je.svg||"innerHTML"in a)a.innerHTML=b;else{me=me||document.createElement("div");me.innerHTML="<svg>"+b+"</svg>";for(b=me.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}});
+function oe(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b}
+var pe={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,
+floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},qe=["Webkit","ms","Moz","O"];Object.keys(pe).forEach(function(a){qe.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);pe[b]=pe[a]})});
+function re(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf("--");var e=c;var f=b[c];e=null==f||"boolean"===typeof f||""===f?"":d||"number"!==typeof f||0===f||pe.hasOwnProperty(e)&&pe[e]?(""+f).trim():f+"px";"float"===c&&(c="cssFloat");d?a.setProperty(c,e):a[c]=e}}var se=n({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});
+function te(a,b){b&&(se[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML?t("137",a,""):void 0),null!=b.dangerouslySetInnerHTML&&(null!=b.children?t("60"):void 0,"object"===typeof b.dangerouslySetInnerHTML&&"__html"in b.dangerouslySetInnerHTML?void 0:t("61")),null!=b.style&&"object"!==typeof b.style?t("62",""):void 0)}
+function ue(a,b){if(-1===a.indexOf("-"))return"string"===typeof b.is;switch(a){case "annotation-xml":case "color-profile":case "font-face":case "font-face-src":case "font-face-uri":case "font-face-format":case "font-face-name":case "missing-glyph":return!1;default:return!0}}
+function ve(a,b){a=9===a.nodeType||11===a.nodeType?a:a.ownerDocument;var c=Nd(a);b=ta[b];for(var d=0;d<b.length;d++){var e=b[d];if(!c.hasOwnProperty(e)||!c[e]){switch(e){case "scroll":Jd("scroll",a);break;case "focus":case "blur":Jd("focus",a);Jd("blur",a);c.blur=!0;c.focus=!0;break;case "cancel":case "close":Tb(e)&&Jd(e,a);break;case "invalid":case "submit":case "reset":break;default:-1===fb.indexOf(e)&&F(e,a)}c[e]=!0}}}function we(){}var xe=null,ye=null;
+function ze(a,b){switch(a){case "button":case "input":case "select":case "textarea":return!!b.autoFocus}return!1}function Ae(a,b){return"textarea"===a||"option"===a||"noscript"===a||"string"===typeof b.children||"number"===typeof b.children||"object"===typeof b.dangerouslySetInnerHTML&&null!==b.dangerouslySetInnerHTML&&null!=b.dangerouslySetInnerHTML.__html}function Be(a){for(a=a.nextSibling;a&&1!==a.nodeType&&3!==a.nodeType;)a=a.nextSibling;return a}
+function Ce(a){for(a=a.firstChild;a&&1!==a.nodeType&&3!==a.nodeType;)a=a.nextSibling;return a}new Set;var De=[],Ee=-1;function G(a){0>Ee||(a.current=De[Ee],De[Ee]=null,Ee--)}function H(a,b){Ee++;De[Ee]=a.current;a.current=b}var Fe={},I={current:Fe},J={current:!1},Ge=Fe;
+function He(a,b){var c=a.type.contextTypes;if(!c)return Fe;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}function K(a){a=a.childContextTypes;return null!==a&&void 0!==a}function Ie(a){G(J,a);G(I,a)}function Je(a){G(J,a);G(I,a)}
+function Ke(a,b,c){I.current!==Fe?t("168"):void 0;H(I,b,a);H(J,c,a)}function Le(a,b,c){var d=a.stateNode;a=b.childContextTypes;if("function"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)e in a?void 0:t("108",lc(b)||"Unknown",e);return n({},c,d)}function Me(a){var b=a.stateNode;b=b&&b.__reactInternalMemoizedMergedChildContext||Fe;Ge=I.current;H(I,b,a);H(J,J.current,a);return!0}
+function Ne(a,b,c){var d=a.stateNode;d?void 0:t("169");c?(b=Le(a,b,Ge),d.__reactInternalMemoizedMergedChildContext=b,G(J,a),G(I,a),H(I,b,a)):G(J,a);H(J,c,a)}var Oe=null,Pe=null;function Qe(a){return function(b){try{return a(b)}catch(c){}}}
+function Re(a){if("undefined"===typeof __REACT_DEVTOOLS_GLOBAL_HOOK__)return!1;var b=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(b.isDisabled||!b.supportsFiber)return!0;try{var c=b.inject(a);Oe=Qe(function(a){return b.onCommitFiberRoot(c,a)});Pe=Qe(function(a){return b.onCommitFiberUnmount(c,a)})}catch(d){}return!0}
+function Se(a,b,c,d){this.tag=a;this.key=c;this.sibling=this.child=this.return=this.stateNode=this.type=null;this.index=0;this.ref=null;this.pendingProps=b;this.firstContextDependency=this.memoizedState=this.updateQueue=this.memoizedProps=null;this.mode=d;this.effectTag=0;this.lastEffect=this.firstEffect=this.nextEffect=null;this.childExpirationTime=this.expirationTime=0;this.alternate=null}function Te(a){a=a.prototype;return!(!a||!a.isReactComponent)}
+function Ue(a,b,c){var d=a.alternate;null===d?(d=new Se(a.tag,b,a.key,a.mode),d.type=a.type,d.stateNode=a.stateNode,d.alternate=a,a.alternate=d):(d.pendingProps=b,d.effectTag=0,d.nextEffect=null,d.firstEffect=null,d.lastEffect=null);d.childExpirationTime=a.childExpirationTime;d.expirationTime=b!==a.pendingProps?c:a.expirationTime;d.child=a.child;d.memoizedProps=a.memoizedProps;d.memoizedState=a.memoizedState;d.updateQueue=a.updateQueue;d.firstContextDependency=a.firstContextDependency;d.sibling=a.sibling;
+d.index=a.index;d.ref=a.ref;return d}
+function Ve(a,b,c){var d=a.type,e=a.key;a=a.props;var f=void 0;if("function"===typeof d)f=Te(d)?2:4;else if("string"===typeof d)f=7;else a:switch(d){case bc:return We(a.children,b,c,e);case gc:f=10;b|=3;break;case cc:f=10;b|=2;break;case dc:return d=new Se(15,a,e,b|4),d.type=dc,d.expirationTime=c,d;case ic:f=16;break;default:if("object"===typeof d&&null!==d)switch(d.$$typeof){case ec:f=12;break a;case fc:f=11;break a;case hc:f=13;break a;default:if("function"===typeof d.then){f=4;break a}}t("130",
+null==d?d:typeof d,"")}b=new Se(f,a,e,b);b.type=d;b.expirationTime=c;return b}function We(a,b,c,d){a=new Se(9,a,d,b);a.expirationTime=c;return a}function Xe(a,b,c){a=new Se(8,a,null,b);a.expirationTime=c;return a}function Ye(a,b,c){b=new Se(6,null!==a.children?a.children:[],a.key,b);b.expirationTime=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b}
+function Ze(a,b){a.didError=!1;var c=a.earliestPendingTime;0===c?a.earliestPendingTime=a.latestPendingTime=b:c>b?a.earliestPendingTime=b:a.latestPendingTime<b&&(a.latestPendingTime=b);$e(b,a)}function $e(a,b){var c=b.earliestSuspendedTime,d=b.latestSuspendedTime,e=b.earliestPendingTime,f=b.latestPingedTime;e=0!==e?e:f;0===e&&(0===a||d>a)&&(e=d);a=e;0!==a&&0!==c&&c<a&&(a=c);b.nextExpirationTimeToWorkOn=e;b.expirationTime=a}var af=!1;
+function bf(a){return{baseState:a,firstUpdate:null,lastUpdate:null,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function cf(a){return{baseState:a.baseState,firstUpdate:a.firstUpdate,lastUpdate:a.lastUpdate,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}
+function df(a){return{expirationTime:a,tag:0,payload:null,callback:null,next:null,nextEffect:null}}function ef(a,b){null===a.lastUpdate?a.firstUpdate=a.lastUpdate=b:(a.lastUpdate.next=b,a.lastUpdate=b)}
+function ff(a,b){var c=a.alternate;if(null===c){var d=a.updateQueue;var e=null;null===d&&(d=a.updateQueue=bf(a.memoizedState))}else d=a.updateQueue,e=c.updateQueue,null===d?null===e?(d=a.updateQueue=bf(a.memoizedState),e=c.updateQueue=bf(c.memoizedState)):d=a.updateQueue=cf(e):null===e&&(e=c.updateQueue=cf(d));null===e||d===e?ef(d,b):null===d.lastUpdate||null===e.lastUpdate?(ef(d,b),ef(e,b)):(ef(d,b),e.lastUpdate=b)}
+function gf(a,b){var c=a.updateQueue;c=null===c?a.updateQueue=bf(a.memoizedState):hf(a,c);null===c.lastCapturedUpdate?c.firstCapturedUpdate=c.lastCapturedUpdate=b:(c.lastCapturedUpdate.next=b,c.lastCapturedUpdate=b)}function hf(a,b){var c=a.alternate;null!==c&&b===c.updateQueue&&(b=a.updateQueue=cf(b));return b}
+function jf(a,b,c,d,e,f){switch(c.tag){case 1:return a=c.payload,"function"===typeof a?a.call(f,d,e):a;case 3:a.effectTag=a.effectTag&-1025|64;case 0:a=c.payload;e="function"===typeof a?a.call(f,d,e):a;if(null===e||void 0===e)break;return n({},d,e);case 2:af=!0}return d}
+function kf(a,b,c,d,e){af=!1;b=hf(a,b);for(var f=b.baseState,g=null,h=0,k=b.firstUpdate,l=f;null!==k;){var m=k.expirationTime;if(m>e){if(null===g&&(g=k,f=l),0===h||h>m)h=m}else l=jf(a,b,k,l,c,d),null!==k.callback&&(a.effectTag|=32,k.nextEffect=null,null===b.lastEffect?b.firstEffect=b.lastEffect=k:(b.lastEffect.nextEffect=k,b.lastEffect=k));k=k.next}m=null;for(k=b.firstCapturedUpdate;null!==k;){var r=k.expirationTime;if(r>e){if(null===m&&(m=k,null===g&&(f=l)),0===h||h>r)h=r}else l=jf(a,b,k,l,c,d),
+null!==k.callback&&(a.effectTag|=32,k.nextEffect=null,null===b.lastCapturedEffect?b.firstCapturedEffect=b.lastCapturedEffect=k:(b.lastCapturedEffect.nextEffect=k,b.lastCapturedEffect=k));k=k.next}null===g&&(b.lastUpdate=null);null===m?b.lastCapturedUpdate=null:a.effectTag|=32;null===g&&null===m&&(f=l);b.baseState=f;b.firstUpdate=g;b.firstCapturedUpdate=m;a.expirationTime=h;a.memoizedState=l}
+function lf(a,b,c){null!==b.firstCapturedUpdate&&(null!==b.lastUpdate&&(b.lastUpdate.next=b.firstCapturedUpdate,b.lastUpdate=b.lastCapturedUpdate),b.firstCapturedUpdate=b.lastCapturedUpdate=null);mf(b.firstEffect,c);b.firstEffect=b.lastEffect=null;mf(b.firstCapturedEffect,c);b.firstCapturedEffect=b.lastCapturedEffect=null}function mf(a,b){for(;null!==a;){var c=a.callback;if(null!==c){a.callback=null;var d=b;"function"!==typeof c?t("191",c):void 0;c.call(d)}a=a.nextEffect}}
+function nf(a,b){return{value:a,source:b,stack:mc(b)}}var of={current:null},pf=null,qf=null,rf=null;function sf(a,b){var c=a.type._context;H(of,c._currentValue,a);c._currentValue=b}function tf(a){var b=of.current;G(of,a);a.type._context._currentValue=b}function uf(a){pf=a;rf=qf=null;a.firstContextDependency=null}
+function vf(a,b){if(rf!==a&&!1!==b&&0!==b){if("number"!==typeof b||1073741823===b)rf=a,b=1073741823;b={context:a,observedBits:b,next:null};null===qf?(null===pf?t("277"):void 0,pf.firstContextDependency=qf=b):qf=qf.next=b}return a._currentValue}var wf={},L={current:wf},xf={current:wf},yf={current:wf};function zf(a){a===wf?t("174"):void 0;return a}
+function Af(a,b){H(yf,b,a);H(xf,a,a);H(L,wf,a);var c=b.nodeType;switch(c){case 9:case 11:b=(b=b.documentElement)?b.namespaceURI:le(null,"");break;default:c=8===c?b.parentNode:b,b=c.namespaceURI||null,c=c.tagName,b=le(b,c)}G(L,a);H(L,b,a)}function Bf(a){G(L,a);G(xf,a);G(yf,a)}function Cf(a){zf(yf.current);var b=zf(L.current);var c=le(b,a.type);b!==c&&(H(xf,a,a),H(L,c,a))}function Df(a){xf.current===a&&(G(L,a),G(xf,a))}var Ef=(new aa.Component).refs;
+function Ff(a,b,c,d){b=a.memoizedState;c=c(d,b);c=null===c||void 0===c?b:n({},b,c);a.memoizedState=c;d=a.updateQueue;null!==d&&0===a.expirationTime&&(d.baseState=c)}
+var Jf={isMounted:function(a){return(a=a._reactInternalFiber)?2===jd(a):!1},enqueueSetState:function(a,b,c){a=a._reactInternalFiber;var d=Gf();d=Hf(d,a);var e=df(d);e.payload=b;void 0!==c&&null!==c&&(e.callback=c);ff(a,e);If(a,d)},enqueueReplaceState:function(a,b,c){a=a._reactInternalFiber;var d=Gf();d=Hf(d,a);var e=df(d);e.tag=1;e.payload=b;void 0!==c&&null!==c&&(e.callback=c);ff(a,e);If(a,d)},enqueueForceUpdate:function(a,b){a=a._reactInternalFiber;var c=Gf();c=Hf(c,a);var d=df(c);d.tag=2;void 0!==
+b&&null!==b&&(d.callback=b);ff(a,d);If(a,c)}};function Kf(a,b,c,d,e,f,g){a=a.stateNode;return"function"===typeof a.shouldComponentUpdate?a.shouldComponentUpdate(d,f,g):b.prototype&&b.prototype.isPureReactComponent?!id(c,d)||!id(e,f):!0}function Lf(a,b,c,d){a=b.state;"function"===typeof b.componentWillReceiveProps&&b.componentWillReceiveProps(c,d);"function"===typeof b.UNSAFE_componentWillReceiveProps&&b.UNSAFE_componentWillReceiveProps(c,d);b.state!==a&&Jf.enqueueReplaceState(b,b.state,null)}
+function Mf(a,b,c,d){var e=a.stateNode,f=K(b)?Ge:I.current;e.props=c;e.state=a.memoizedState;e.refs=Ef;e.context=He(a,f);f=a.updateQueue;null!==f&&(kf(a,f,c,e,d),e.state=a.memoizedState);f=b.getDerivedStateFromProps;"function"===typeof f&&(Ff(a,b,f,c),e.state=a.memoizedState);"function"===typeof b.getDerivedStateFromProps||"function"===typeof e.getSnapshotBeforeUpdate||"function"!==typeof e.UNSAFE_componentWillMount&&"function"!==typeof e.componentWillMount||(b=e.state,"function"===typeof e.componentWillMount&&
+e.componentWillMount(),"function"===typeof e.UNSAFE_componentWillMount&&e.UNSAFE_componentWillMount(),b!==e.state&&Jf.enqueueReplaceState(e,e.state,null),f=a.updateQueue,null!==f&&(kf(a,f,c,e,d),e.state=a.memoizedState));"function"===typeof e.componentDidMount&&(a.effectTag|=4)}var Nf=Array.isArray;
+function Of(a,b,c){a=c.ref;if(null!==a&&"function"!==typeof a&&"object"!==typeof a){if(c._owner){c=c._owner;var d=void 0;c&&(2!==c.tag&&3!==c.tag?t("110"):void 0,d=c.stateNode);d?void 0:t("147",a);var e=""+a;if(null!==b&&null!==b.ref&&"function"===typeof b.ref&&b.ref._stringRef===e)return b.ref;b=function(a){var b=d.refs;b===Ef&&(b=d.refs={});null===a?delete b[e]:b[e]=a};b._stringRef=e;return b}"string"!==typeof a?t("284"):void 0;c._owner?void 0:t("254",a)}return a}
+function Pf(a,b){"textarea"!==a.type&&t("31","[object Object]"===Object.prototype.toString.call(b)?"object with keys {"+Object.keys(b).join(", ")+"}":b,"")}
+function Qf(a){function b(b,c){if(a){var d=b.lastEffect;null!==d?(d.nextEffect=c,b.lastEffect=c):b.firstEffect=b.lastEffect=c;c.nextEffect=null;c.effectTag=8}}function c(c,d){if(!a)return null;for(;null!==d;)b(c,d),d=d.sibling;return null}function d(a,b){for(a=new Map;null!==b;)null!==b.key?a.set(b.key,b):a.set(b.index,b),b=b.sibling;return a}function e(a,b,c){a=Ue(a,b,c);a.index=0;a.sibling=null;return a}function f(b,c,d){b.index=d;if(!a)return c;d=b.alternate;if(null!==d)return d=d.index,d<c?(b.effectTag=
+2,c):d;b.effectTag=2;return c}function g(b){a&&null===b.alternate&&(b.effectTag=2);return b}function h(a,b,c,d){if(null===b||8!==b.tag)return b=Xe(c,a.mode,d),b.return=a,b;b=e(b,c,d);b.return=a;return b}function k(a,b,c,d){if(null!==b&&b.type===c.type)return d=e(b,c.props,d),d.ref=Of(a,b,c),d.return=a,d;d=Ve(c,a.mode,d);d.ref=Of(a,b,c);d.return=a;return d}function l(a,b,c,d){if(null===b||6!==b.tag||b.stateNode.containerInfo!==c.containerInfo||b.stateNode.implementation!==c.implementation)return b=
+Ye(c,a.mode,d),b.return=a,b;b=e(b,c.children||[],d);b.return=a;return b}function m(a,b,c,d,f){if(null===b||9!==b.tag)return b=We(c,a.mode,d,f),b.return=a,b;b=e(b,c,d);b.return=a;return b}function r(a,b,c){if("string"===typeof b||"number"===typeof b)return b=Xe(""+b,a.mode,c),b.return=a,b;if("object"===typeof b&&null!==b){switch(b.$$typeof){case $b:return c=Ve(b,a.mode,c),c.ref=Of(a,null,b),c.return=a,c;case ac:return b=Ye(b,a.mode,c),b.return=a,b}if(Nf(b)||kc(b))return b=We(b,a.mode,c,null),b.return=
+a,b;Pf(a,b)}return null}function A(a,b,c,d){var e=null!==b?b.key:null;if("string"===typeof c||"number"===typeof c)return null!==e?null:h(a,b,""+c,d);if("object"===typeof c&&null!==c){switch(c.$$typeof){case $b:return c.key===e?c.type===bc?m(a,b,c.props.children,d,e):k(a,b,c,d):null;case ac:return c.key===e?l(a,b,c,d):null}if(Nf(c)||kc(c))return null!==e?null:m(a,b,c,d,null);Pf(a,c)}return null}function S(a,b,c,d,e){if("string"===typeof d||"number"===typeof d)return a=a.get(c)||null,h(b,a,""+d,e);
+if("object"===typeof d&&null!==d){switch(d.$$typeof){case $b:return a=a.get(null===d.key?c:d.key)||null,d.type===bc?m(b,a,d.props.children,e,d.key):k(b,a,d,e);case ac:return a=a.get(null===d.key?c:d.key)||null,l(b,a,d,e)}if(Nf(d)||kc(d))return a=a.get(c)||null,m(b,a,d,e,null);Pf(b,d)}return null}function B(e,g,h,k){for(var l=null,m=null,p=g,u=g=0,q=null;null!==p&&u<h.length;u++){p.index>u?(q=p,p=null):q=p.sibling;var v=A(e,p,h[u],k);if(null===v){null===p&&(p=q);break}a&&p&&null===v.alternate&&b(e,
+p);g=f(v,g,u);null===m?l=v:m.sibling=v;m=v;p=q}if(u===h.length)return c(e,p),l;if(null===p){for(;u<h.length;u++)if(p=r(e,h[u],k))g=f(p,g,u),null===m?l=p:m.sibling=p,m=p;return l}for(p=d(e,p);u<h.length;u++)if(q=S(p,e,u,h[u],k))a&&null!==q.alternate&&p.delete(null===q.key?u:q.key),g=f(q,g,u),null===m?l=q:m.sibling=q,m=q;a&&p.forEach(function(a){return b(e,a)});return l}function P(e,g,h,k){var l=kc(h);"function"!==typeof l?t("150"):void 0;h=l.call(h);null==h?t("151"):void 0;for(var m=l=null,p=g,u=g=
+0,q=null,v=h.next();null!==p&&!v.done;u++,v=h.next()){p.index>u?(q=p,p=null):q=p.sibling;var x=A(e,p,v.value,k);if(null===x){p||(p=q);break}a&&p&&null===x.alternate&&b(e,p);g=f(x,g,u);null===m?l=x:m.sibling=x;m=x;p=q}if(v.done)return c(e,p),l;if(null===p){for(;!v.done;u++,v=h.next())v=r(e,v.value,k),null!==v&&(g=f(v,g,u),null===m?l=v:m.sibling=v,m=v);return l}for(p=d(e,p);!v.done;u++,v=h.next())v=S(p,e,u,v.value,k),null!==v&&(a&&null!==v.alternate&&p.delete(null===v.key?u:v.key),g=f(v,g,u),null===
+m?l=v:m.sibling=v,m=v);a&&p.forEach(function(a){return b(e,a)});return l}return function(a,d,f,h){var k="object"===typeof f&&null!==f&&f.type===bc&&null===f.key;k&&(f=f.props.children);var l="object"===typeof f&&null!==f;if(l)switch(f.$$typeof){case $b:a:{l=f.key;for(k=d;null!==k;){if(k.key===l)if(9===k.tag?f.type===bc:k.type===f.type){c(a,k.sibling);d=e(k,f.type===bc?f.props.children:f.props,h);d.ref=Of(a,k,f);d.return=a;a=d;break a}else{c(a,k);break}else b(a,k);k=k.sibling}f.type===bc?(d=We(f.props.children,
+a.mode,h,f.key),d.return=a,a=d):(h=Ve(f,a.mode,h),h.ref=Of(a,d,f),h.return=a,a=h)}return g(a);case ac:a:{for(k=f.key;null!==d;){if(d.key===k)if(6===d.tag&&d.stateNode.containerInfo===f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[],h);d.return=a;a=d;break a}else{c(a,d);break}else b(a,d);d=d.sibling}d=Ye(f,a.mode,h);d.return=a;a=d}return g(a)}if("string"===typeof f||"number"===typeof f)return f=""+f,null!==d&&8===d.tag?(c(a,d.sibling),d=e(d,f,h),d.return=
+a,a=d):(c(a,d),d=Xe(f,a.mode,h),d.return=a,a=d),g(a);if(Nf(f))return B(a,d,f,h);if(kc(f))return P(a,d,f,h);l&&Pf(a,f);if("undefined"===typeof f&&!k)switch(a.tag){case 2:case 3:case 0:h=a.type,t("152",h.displayName||h.name||"Component")}return c(a,d)}}var Rf=Qf(!0),Sf=Qf(!1),Tf=null,Uf=null,Vf=!1;function Wf(a,b){var c=new Se(7,null,null,0);c.type="DELETED";c.stateNode=b;c.return=a;c.effectTag=8;null!==a.lastEffect?(a.lastEffect.nextEffect=c,a.lastEffect=c):a.firstEffect=a.lastEffect=c}
+function Xf(a,b){switch(a.tag){case 7:var c=a.type;b=1!==b.nodeType||c.toLowerCase()!==b.nodeName.toLowerCase()?null:b;return null!==b?(a.stateNode=b,!0):!1;case 8:return b=""===a.pendingProps||3!==b.nodeType?null:b,null!==b?(a.stateNode=b,!0):!1;default:return!1}}function Yf(a){if(Vf){var b=Uf;if(b){var c=b;if(!Xf(a,b)){b=Be(c);if(!b||!Xf(a,b)){a.effectTag|=2;Vf=!1;Tf=a;return}Wf(Tf,c)}Tf=a;Uf=Ce(b)}else a.effectTag|=2,Vf=!1,Tf=a}}
+function Zf(a){for(a=a.return;null!==a&&7!==a.tag&&5!==a.tag;)a=a.return;Tf=a}function $f(a){if(a!==Tf)return!1;if(!Vf)return Zf(a),Vf=!0,!1;var b=a.type;if(7!==a.tag||"head"!==b&&"body"!==b&&!Ae(b,a.memoizedProps))for(b=Uf;b;)Wf(a,b),b=Be(b);Zf(a);Uf=Tf?Be(a.stateNode):null;return!0}function ag(){Uf=Tf=null;Vf=!1}
+function bg(a){switch(a._reactStatus){case 1:return a._reactResult;case 2:throw a._reactResult;case 0:throw a;default:throw a._reactStatus=0,a.then(function(b){if(0===a._reactStatus){a._reactStatus=1;if("object"===typeof b&&null!==b){var c=b.default;b=void 0!==c&&null!==c?c:b}a._reactResult=b}},function(b){0===a._reactStatus&&(a._reactStatus=2,a._reactResult=b)}),a;}}var cg=Yb.ReactCurrentOwner;function M(a,b,c,d){b.child=null===a?Sf(b,null,c,d):Rf(b,a.child,c,d)}
+function dg(a,b,c,d,e){c=c.render;var f=b.ref;if(!J.current&&b.memoizedProps===d&&f===(null!==a?a.ref:null))return eg(a,b,e);c=c(d,f);M(a,b,c,e);b.memoizedProps=d;return b.child}function fg(a,b){var c=b.ref;if(null===a&&null!==c||null!==a&&a.ref!==c)b.effectTag|=128}function gg(a,b,c,d,e){var f=K(c)?Ge:I.current;f=He(b,f);uf(b,e);c=c(d,f);b.effectTag|=1;M(a,b,c,e);b.memoizedProps=d;return b.child}
+function hg(a,b,c,d,e){if(K(c)){var f=!0;Me(b)}else f=!1;uf(b,e);if(null===a)if(null===b.stateNode){var g=K(c)?Ge:I.current,h=c.contextTypes,k=null!==h&&void 0!==h;h=k?He(b,g):Fe;var l=new c(d,h);b.memoizedState=null!==l.state&&void 0!==l.state?l.state:null;l.updater=Jf;b.stateNode=l;l._reactInternalFiber=b;k&&(k=b.stateNode,k.__reactInternalMemoizedUnmaskedChildContext=g,k.__reactInternalMemoizedMaskedChildContext=h);Mf(b,c,d,e);d=!0}else{g=b.stateNode;h=b.memoizedProps;g.props=h;var m=g.context;
+k=K(c)?Ge:I.current;k=He(b,k);var r=c.getDerivedStateFromProps;(l="function"===typeof r||"function"===typeof g.getSnapshotBeforeUpdate)||"function"!==typeof g.UNSAFE_componentWillReceiveProps&&"function"!==typeof g.componentWillReceiveProps||(h!==d||m!==k)&&Lf(b,g,d,k);af=!1;var A=b.memoizedState;m=g.state=A;var S=b.updateQueue;null!==S&&(kf(b,S,d,g,e),m=b.memoizedState);h!==d||A!==m||J.current||af?("function"===typeof r&&(Ff(b,c,r,d),m=b.memoizedState),(h=af||Kf(b,c,h,d,A,m,k))?(l||"function"!==
+typeof g.UNSAFE_componentWillMount&&"function"!==typeof g.componentWillMount||("function"===typeof g.componentWillMount&&g.componentWillMount(),"function"===typeof g.UNSAFE_componentWillMount&&g.UNSAFE_componentWillMount()),"function"===typeof g.componentDidMount&&(b.effectTag|=4)):("function"===typeof g.componentDidMount&&(b.effectTag|=4),b.memoizedProps=d,b.memoizedState=m),g.props=d,g.state=m,g.context=k,d=h):("function"===typeof g.componentDidMount&&(b.effectTag|=4),d=!1)}else g=b.stateNode,h=
+b.memoizedProps,g.props=h,m=g.context,k=K(c)?Ge:I.current,k=He(b,k),r=c.getDerivedStateFromProps,(l="function"===typeof r||"function"===typeof g.getSnapshotBeforeUpdate)||"function"!==typeof g.UNSAFE_componentWillReceiveProps&&"function"!==typeof g.componentWillReceiveProps||(h!==d||m!==k)&&Lf(b,g,d,k),af=!1,m=b.memoizedState,A=g.state=m,S=b.updateQueue,null!==S&&(kf(b,S,d,g,e),A=b.memoizedState),h!==d||m!==A||J.current||af?("function"===typeof r&&(Ff(b,c,r,d),A=b.memoizedState),(r=af||Kf(b,c,h,d,
+m,A,k))?(l||"function"!==typeof g.UNSAFE_componentWillUpdate&&"function"!==typeof g.componentWillUpdate||("function"===typeof g.componentWillUpdate&&g.componentWillUpdate(d,A,k),"function"===typeof g.UNSAFE_componentWillUpdate&&g.UNSAFE_componentWillUpdate(d,A,k)),"function"===typeof g.componentDidUpdate&&(b.effectTag|=4),"function"===typeof g.getSnapshotBeforeUpdate&&(b.effectTag|=256)):("function"!==typeof g.componentDidUpdate||h===a.memoizedProps&&m===a.memoizedState||(b.effectTag|=4),"function"!==
+typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&m===a.memoizedState||(b.effectTag|=256),b.memoizedProps=d,b.memoizedState=A),g.props=d,g.state=A,g.context=k,d=r):("function"!==typeof g.componentDidUpdate||h===a.memoizedProps&&m===a.memoizedState||(b.effectTag|=4),"function"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&m===a.memoizedState||(b.effectTag|=256),d=!1);return ig(a,b,c,d,f,e)}
+function ig(a,b,c,d,e,f){fg(a,b);var g=0!==(b.effectTag&64);if(!d&&!g)return e&&Ne(b,c,!1),eg(a,b,f);d=b.stateNode;cg.current=b;var h=g?null:d.render();b.effectTag|=1;null!==a&&g&&(M(a,b,null,f),b.child=null);M(a,b,h,f);b.memoizedState=d.state;b.memoizedProps=d.props;e&&Ne(b,c,!0);return b.child}function jg(a){var b=a.stateNode;b.pendingContext?Ke(a,b.pendingContext,b.pendingContext!==b.context):b.context&&Ke(a,b.context,!1);Af(a,b.containerInfo)}
+function ng(a,b){if(a&&a.defaultProps){b=n({},b);a=a.defaultProps;for(var c in a)void 0===b[c]&&(b[c]=a[c])}return b}
+function og(a,b,c,d){null!==a?t("155"):void 0;var e=b.pendingProps;if("object"===typeof c&&null!==c&&"function"===typeof c.then){c=bg(c);var f=c;f="function"===typeof f?Te(f)?3:1:void 0!==f&&null!==f&&f.$$typeof?14:4;f=b.tag=f;var g=ng(c,e);switch(f){case 1:return gg(a,b,c,g,d);case 3:return hg(a,b,c,g,d);case 14:return dg(a,b,c,g,d);default:t("283",c)}}f=He(b,I.current);uf(b,d);f=c(e,f);b.effectTag|=1;if("object"===typeof f&&null!==f&&"function"===typeof f.render&&void 0===f.$$typeof){b.tag=2;K(c)?
+(g=!0,Me(b)):g=!1;b.memoizedState=null!==f.state&&void 0!==f.state?f.state:null;var h=c.getDerivedStateFromProps;"function"===typeof h&&Ff(b,c,h,e);f.updater=Jf;b.stateNode=f;f._reactInternalFiber=b;Mf(b,c,e,d);return ig(a,b,c,!0,g,d)}b.tag=0;M(a,b,f,d);b.memoizedProps=e;return b.child}
+function eg(a,b,c){null!==a&&(b.firstContextDependency=a.firstContextDependency);var d=b.childExpirationTime;if(0===d||d>c)return null;null!==a&&b.child!==a.child?t("153"):void 0;if(null!==b.child){a=b.child;c=Ue(a,a.pendingProps,a.expirationTime);b.child=c;for(c.return=b;null!==a.sibling;)a=a.sibling,c=c.sibling=Ue(a,a.pendingProps,a.expirationTime),c.return=b;c.sibling=null}return b.child}
+function pg(a,b,c){var d=b.expirationTime;if(!J.current&&(0===d||d>c)){switch(b.tag){case 5:jg(b);ag();break;case 7:Cf(b);break;case 2:K(b.type)&&Me(b);break;case 3:K(b.type._reactResult)&&Me(b);break;case 6:Af(b,b.stateNode.containerInfo);break;case 12:sf(b,b.memoizedProps.value)}return eg(a,b,c)}b.expirationTime=0;switch(b.tag){case 4:return og(a,b,b.type,c);case 0:return gg(a,b,b.type,b.pendingProps,c);case 1:var e=b.type._reactResult;d=b.pendingProps;a=gg(a,b,e,ng(e,d),c);b.memoizedProps=d;return a;
+case 2:return hg(a,b,b.type,b.pendingProps,c);case 3:return e=b.type._reactResult,d=b.pendingProps,a=hg(a,b,e,ng(e,d),c),b.memoizedProps=d,a;case 5:jg(b);d=b.updateQueue;null===d?t("282"):void 0;e=b.memoizedState;e=null!==e?e.element:null;kf(b,d,b.pendingProps,null,c);d=b.memoizedState.element;if(d===e)ag(),b=eg(a,b,c);else{e=b.stateNode;if(e=(null===a||null===a.child)&&e.hydrate)Uf=Ce(b.stateNode.containerInfo),Tf=b,e=Vf=!0;e?(b.effectTag|=2,b.child=Sf(b,null,d,c)):(M(a,b,d,c),ag());b=b.child}return b;
+case 7:Cf(b);null===a&&Yf(b);d=b.type;e=b.pendingProps;var f=null!==a?a.memoizedProps:null,g=e.children;Ae(d,e)?g=null:null!==f&&Ae(d,f)&&(b.effectTag|=16);fg(a,b);1073741823!==c&&b.mode&1&&e.hidden?(b.expirationTime=1073741823,b.memoizedProps=e,b=null):(M(a,b,g,c),b.memoizedProps=e,b=b.child);return b;case 8:return null===a&&Yf(b),b.memoizedProps=b.pendingProps,null;case 16:return null;case 6:return Af(b,b.stateNode.containerInfo),d=b.pendingProps,null===a?b.child=Rf(b,null,d,c):M(a,b,d,c),b.memoizedProps=
+d,b.child;case 13:return dg(a,b,b.type,b.pendingProps,c);case 14:return e=b.type._reactResult,d=b.pendingProps,a=dg(a,b,e,ng(e,d),c),b.memoizedProps=d,a;case 9:return d=b.pendingProps,M(a,b,d,c),b.memoizedProps=d,b.child;case 10:return d=b.pendingProps.children,M(a,b,d,c),b.memoizedProps=d,b.child;case 15:return d=b.pendingProps,M(a,b,d.children,c),b.memoizedProps=d,b.child;case 12:a:{d=b.type._context;e=b.pendingProps;g=b.memoizedProps;f=e.value;b.memoizedProps=e;sf(b,f);if(null!==g){var h=g.value;
+f=h===f&&(0!==h||1/h===1/f)||h!==h&&f!==f?0:("function"===typeof d._calculateChangedBits?d._calculateChangedBits(h,f):1073741823)|0;if(0===f){if(g.children===e.children&&!J.current){b=eg(a,b,c);break a}}else for(g=b.child,null!==g&&(g.return=b);null!==g;){h=g.firstContextDependency;if(null!==h){do{if(h.context===d&&0!==(h.observedBits&f)){if(2===g.tag||3===g.tag){var k=df(c);k.tag=2;ff(g,k)}if(0===g.expirationTime||g.expirationTime>c)g.expirationTime=c;k=g.alternate;null!==k&&(0===k.expirationTime||
+k.expirationTime>c)&&(k.expirationTime=c);for(var l=g.return;null!==l;){k=l.alternate;if(0===l.childExpirationTime||l.childExpirationTime>c)l.childExpirationTime=c,null!==k&&(0===k.childExpirationTime||k.childExpirationTime>c)&&(k.childExpirationTime=c);else if(null!==k&&(0===k.childExpirationTime||k.childExpirationTime>c))k.childExpirationTime=c;else break;l=l.return}}k=g.child;h=h.next}while(null!==h)}else k=12===g.tag?g.type===b.type?null:g.child:g.child;if(null!==k)k.return=g;else for(k=g;null!==
+k;){if(k===b){k=null;break}g=k.sibling;if(null!==g){g.return=k.return;k=g;break}k=k.return}g=k}}M(a,b,e.children,c);b=b.child}return b;case 11:return f=b.type,d=b.pendingProps,e=d.children,uf(b,c),f=vf(f,d.unstable_observedBits),e=e(f),b.effectTag|=1,M(a,b,e,c),b.memoizedProps=d,b.child;default:t("156")}}function qg(a){a.effectTag|=4}var rg=void 0,sg=void 0,tg=void 0;rg=function(){};
+sg=function(a,b,c,d,e){var f=a.memoizedProps;if(f!==d){var g=b.stateNode;zf(L.current);a=null;switch(c){case "input":f=zc(g,f);d=zc(g,d);a=[];break;case "option":f=de(g,f);d=de(g,d);a=[];break;case "select":f=n({},f,{value:void 0});d=n({},d,{value:void 0});a=[];break;case "textarea":f=fe(g,f);d=fe(g,d);a=[];break;default:"function"!==typeof f.onClick&&"function"===typeof d.onClick&&(g.onclick=we)}te(c,d);g=c=void 0;var h=null;for(c in f)if(!d.hasOwnProperty(c)&&f.hasOwnProperty(c)&&null!=f[c])if("style"===
+c){var k=f[c];for(g in k)k.hasOwnProperty(g)&&(h||(h={}),h[g]="")}else"dangerouslySetInnerHTML"!==c&&"children"!==c&&"suppressContentEditableWarning"!==c&&"suppressHydrationWarning"!==c&&"autoFocus"!==c&&(sa.hasOwnProperty(c)?a||(a=[]):(a=a||[]).push(c,null));for(c in d){var l=d[c];k=null!=f?f[c]:void 0;if(d.hasOwnProperty(c)&&l!==k&&(null!=l||null!=k))if("style"===c)if(k){for(g in k)!k.hasOwnProperty(g)||l&&l.hasOwnProperty(g)||(h||(h={}),h[g]="");for(g in l)l.hasOwnProperty(g)&&k[g]!==l[g]&&(h||
+(h={}),h[g]=l[g])}else h||(a||(a=[]),a.push(c,h)),h=l;else"dangerouslySetInnerHTML"===c?(l=l?l.__html:void 0,k=k?k.__html:void 0,null!=l&&k!==l&&(a=a||[]).push(c,""+l)):"children"===c?k===l||"string"!==typeof l&&"number"!==typeof l||(a=a||[]).push(c,""+l):"suppressContentEditableWarning"!==c&&"suppressHydrationWarning"!==c&&(sa.hasOwnProperty(c)?(null!=l&&ve(e,c),a||k===l||(a=[])):(a=a||[]).push(c,l))}h&&(a=a||[]).push("style",h);e=a;(b.updateQueue=e)&&qg(b)}};tg=function(a,b,c,d){c!==d&&qg(b)};
+function ug(a,b){var c=b.source,d=b.stack;null===d&&null!==c&&(d=mc(c));null!==c&&lc(c.type);b=b.value;null!==a&&2===a.tag&&lc(a.type);try{console.error(b)}catch(e){setTimeout(function(){throw e;})}}function vg(a){var b=a.ref;if(null!==b)if("function"===typeof b)try{b(null)}catch(c){wg(a,c)}else b.current=null}
+function xg(a){"function"===typeof Pe&&Pe(a);switch(a.tag){case 2:case 3:vg(a);var b=a.stateNode;if("function"===typeof b.componentWillUnmount)try{b.props=a.memoizedProps,b.state=a.memoizedState,b.componentWillUnmount()}catch(c){wg(a,c)}break;case 7:vg(a);break;case 6:yg(a)}}function zg(a){return 7===a.tag||5===a.tag||6===a.tag}
+function Ag(a){a:{for(var b=a.return;null!==b;){if(zg(b)){var c=b;break a}b=b.return}t("160");c=void 0}var d=b=void 0;switch(c.tag){case 7:b=c.stateNode;d=!1;break;case 5:b=c.stateNode.containerInfo;d=!0;break;case 6:b=c.stateNode.containerInfo;d=!0;break;default:t("161")}c.effectTag&16&&(oe(b,""),c.effectTag&=-17);a:b:for(c=a;;){for(;null===c.sibling;){if(null===c.return||zg(c.return)){c=null;break a}c=c.return}c.sibling.return=c.return;for(c=c.sibling;7!==c.tag&&8!==c.tag;){if(c.effectTag&2)continue b;
+if(null===c.child||6===c.tag)continue b;else c.child.return=c,c=c.child}if(!(c.effectTag&2)){c=c.stateNode;break a}}for(var e=a;;){if(7===e.tag||8===e.tag)if(c)if(d){var f=b,g=e.stateNode,h=c;8===f.nodeType?f.parentNode.insertBefore(g,h):f.insertBefore(g,h)}else b.insertBefore(e.stateNode,c);else d?(f=b,g=e.stateNode,8===f.nodeType?(h=f.parentNode,h.insertBefore(g,f)):(h=f,h.appendChild(g)),null===h.onclick&&(h.onclick=we)):b.appendChild(e.stateNode);else if(6!==e.tag&&null!==e.child){e.child.return=
+e;e=e.child;continue}if(e===a)break;for(;null===e.sibling;){if(null===e.return||e.return===a)return;e=e.return}e.sibling.return=e.return;e=e.sibling}}
+function yg(a){for(var b=a,c=!1,d=void 0,e=void 0;;){if(!c){c=b.return;a:for(;;){null===c?t("160"):void 0;switch(c.tag){case 7:d=c.stateNode;e=!1;break a;case 5:d=c.stateNode.containerInfo;e=!0;break a;case 6:d=c.stateNode.containerInfo;e=!0;break a}c=c.return}c=!0}if(7===b.tag||8===b.tag){a:for(var f=b,g=f;;)if(xg(g),null!==g.child&&6!==g.tag)g.child.return=g,g=g.child;else{if(g===f)break;for(;null===g.sibling;){if(null===g.return||g.return===f)break a;g=g.return}g.sibling.return=g.return;g=g.sibling}e?
+(f=d,g=b.stateNode,8===f.nodeType?f.parentNode.removeChild(g):f.removeChild(g)):d.removeChild(b.stateNode)}else if(6===b.tag?(d=b.stateNode.containerInfo,e=!0):xg(b),null!==b.child){b.child.return=b;b=b.child;continue}if(b===a)break;for(;null===b.sibling;){if(null===b.return||b.return===a)return;b=b.return;6===b.tag&&(c=!1)}b.sibling.return=b.return;b=b.sibling}}
+function Bg(a,b){switch(b.tag){case 2:case 3:break;case 7:var c=b.stateNode;if(null!=c){var d=b.memoizedProps,e=null!==a?a.memoizedProps:d;a=b.type;var f=b.updateQueue;b.updateQueue=null;if(null!==f){c[Ja]=d;"input"===a&&"radio"===d.type&&null!=d.name&&Cc(c,d);ue(a,e);b=ue(a,d);for(e=0;e<f.length;e+=2){var g=f[e],h=f[e+1];"style"===g?re(c,h):"dangerouslySetInnerHTML"===g?ne(c,h):"children"===g?oe(c,h):xc(c,g,h,b)}switch(a){case "input":Dc(c,d);break;case "textarea":he(c,d);break;case "select":a=c._wrapperState.wasMultiple,
+c._wrapperState.wasMultiple=!!d.multiple,f=d.value,null!=f?ee(c,!!d.multiple,f,!1):a!==!!d.multiple&&(null!=d.defaultValue?ee(c,!!d.multiple,d.defaultValue,!0):ee(c,!!d.multiple,d.multiple?[]:"",!1))}}}break;case 8:null===b.stateNode?t("162"):void 0;b.stateNode.nodeValue=b.memoizedProps;break;case 5:break;case 15:break;case 16:break;default:t("163")}}function Cg(a,b,c){c=df(c);c.tag=3;c.payload={element:null};var d=b.value;c.callback=function(){Dg(d);ug(a,b)};return c}
+function Eg(a,b,c){c=df(c);c.tag=3;var d=a.stateNode;null!==d&&"function"===typeof d.componentDidCatch&&(c.callback=function(){null===Fg?Fg=new Set([this]):Fg.add(this);var c=b.value,d=b.stack;ug(a,b);this.componentDidCatch(c,{componentStack:null!==d?d:""})});return c}
+function Gg(a){switch(a.tag){case 2:K(a.type)&&Ie(a);var b=a.effectTag;return b&1024?(a.effectTag=b&-1025|64,a):null;case 3:return K(a.type._reactResult)&&Ie(a),b=a.effectTag,b&1024?(a.effectTag=b&-1025|64,a):null;case 5:return Bf(a),Je(a),b=a.effectTag,0!==(b&64)?t("285"):void 0,a.effectTag=b&-1025|64,a;case 7:return Df(a),null;case 16:return b=a.effectTag,b&1024?(a.effectTag=b&-1025|64,a):null;case 6:return Bf(a),null;case 12:return tf(a),null;default:return null}}
+var Hg={readContext:vf},Ig=Yb.ReactCurrentOwner,Jg=0,Kg=0,Lg=!1,N=null,Mg=null,O=0,Ng=!1,Q=null,Og=!1,Fg=null;function Pg(){if(null!==N)for(var a=N.return;null!==a;){var b=a;switch(b.tag){case 2:var c=b.type.childContextTypes;null!==c&&void 0!==c&&Ie(b);break;case 3:c=b.type._reactResult.childContextTypes;null!==c&&void 0!==c&&Ie(b);break;case 5:Bf(b);Je(b);break;case 7:Df(b);break;case 6:Bf(b);break;case 12:tf(b)}a=a.return}Mg=null;O=0;Ng=!1;N=null}
+function Qg(a){for(;;){var b=a.alternate,c=a.return,d=a.sibling;if(0===(a.effectTag&512)){var e=b;b=a;var f=b.pendingProps;switch(b.tag){case 0:case 1:break;case 2:K(b.type)&&Ie(b);break;case 3:K(b.type._reactResult)&&Ie(b);break;case 5:Bf(b);Je(b);f=b.stateNode;f.pendingContext&&(f.context=f.pendingContext,f.pendingContext=null);if(null===e||null===e.child)$f(b),b.effectTag&=-3;rg(b);break;case 7:Df(b);var g=zf(yf.current),h=b.type;if(null!==e&&null!=b.stateNode)sg(e,b,h,f,g),e.ref!==b.ref&&(b.effectTag|=
+128);else if(f){var k=zf(L.current);if($f(b)){f=b;e=f.stateNode;var l=f.type,m=f.memoizedProps,r=g;e[Ia]=f;e[Ja]=m;h=void 0;g=l;switch(g){case "iframe":case "object":F("load",e);break;case "video":case "audio":for(l=0;l<fb.length;l++)F(fb[l],e);break;case "source":F("error",e);break;case "img":case "image":case "link":F("error",e);F("load",e);break;case "form":F("reset",e);F("submit",e);break;case "details":F("toggle",e);break;case "input":Bc(e,m);F("invalid",e);ve(r,"onChange");break;case "select":e._wrapperState=
+{wasMultiple:!!m.multiple};F("invalid",e);ve(r,"onChange");break;case "textarea":ge(e,m),F("invalid",e),ve(r,"onChange")}te(g,m);l=null;for(h in m)m.hasOwnProperty(h)&&(k=m[h],"children"===h?"string"===typeof k?e.textContent!==k&&(l=["children",k]):"number"===typeof k&&e.textContent!==""+k&&(l=["children",""+k]):sa.hasOwnProperty(h)&&null!=k&&ve(r,h));switch(g){case "input":Wb(e);Fc(e,m,!0);break;case "textarea":Wb(e);ie(e,m);break;case "select":case "option":break;default:"function"===typeof m.onClick&&
+(e.onclick=we)}h=l;f.updateQueue=h;f=null!==h?!0:!1;f&&qg(b)}else{m=b;e=h;r=f;l=9===g.nodeType?g:g.ownerDocument;k===je.html&&(k=ke(e));k===je.html?"script"===e?(e=l.createElement("div"),e.innerHTML="<script>\x3c/script>",l=e.removeChild(e.firstChild)):"string"===typeof r.is?l=l.createElement(e,{is:r.is}):(l=l.createElement(e),"select"===e&&r.multiple&&(l.multiple=!0)):l=l.createElementNS(k,e);e=l;e[Ia]=m;e[Ja]=f;a:for(m=e,r=b,l=r.child;null!==l;){if(7===l.tag||8===l.tag)m.appendChild(l.stateNode);
+else if(6!==l.tag&&null!==l.child){l.child.return=l;l=l.child;continue}if(l===r)break;for(;null===l.sibling;){if(null===l.return||l.return===r)break a;l=l.return}l.sibling.return=l.return;l=l.sibling}r=e;l=h;m=f;var A=g,S=ue(l,m);switch(l){case "iframe":case "object":F("load",r);g=m;break;case "video":case "audio":for(g=0;g<fb.length;g++)F(fb[g],r);g=m;break;case "source":F("error",r);g=m;break;case "img":case "image":case "link":F("error",r);F("load",r);g=m;break;case "form":F("reset",r);F("submit",
+r);g=m;break;case "details":F("toggle",r);g=m;break;case "input":Bc(r,m);g=zc(r,m);F("invalid",r);ve(A,"onChange");break;case "option":g=de(r,m);break;case "select":r._wrapperState={wasMultiple:!!m.multiple};g=n({},m,{value:void 0});F("invalid",r);ve(A,"onChange");break;case "textarea":ge(r,m);g=fe(r,m);F("invalid",r);ve(A,"onChange");break;default:g=m}te(l,g);k=void 0;var B=l,P=r,v=g;for(k in v)if(v.hasOwnProperty(k)){var p=v[k];"style"===k?re(P,p):"dangerouslySetInnerHTML"===k?(p=p?p.__html:void 0,
+null!=p&&ne(P,p)):"children"===k?"string"===typeof p?("textarea"!==B||""!==p)&&oe(P,p):"number"===typeof p&&oe(P,""+p):"suppressContentEditableWarning"!==k&&"suppressHydrationWarning"!==k&&"autoFocus"!==k&&(sa.hasOwnProperty(k)?null!=p&&ve(A,k):null!=p&&xc(P,k,p,S))}switch(l){case "input":Wb(r);Fc(r,m,!1);break;case "textarea":Wb(r);ie(r,m);break;case "option":null!=m.value&&r.setAttribute("value",""+yc(m.value));break;case "select":g=r;g.multiple=!!m.multiple;r=m.value;null!=r?ee(g,!!m.multiple,
+r,!1):null!=m.defaultValue&&ee(g,!!m.multiple,m.defaultValue,!0);break;default:"function"===typeof g.onClick&&(r.onclick=we)}(f=ze(h,f))&&qg(b);b.stateNode=e}null!==b.ref&&(b.effectTag|=128)}else null===b.stateNode?t("166"):void 0;break;case 8:e&&null!=b.stateNode?tg(e,b,e.memoizedProps,f):("string"!==typeof f&&(null===b.stateNode?t("166"):void 0),e=zf(yf.current),zf(L.current),$f(b)?(f=b,h=f.stateNode,e=f.memoizedProps,h[Ia]=f,(f=h.nodeValue!==e)&&qg(b)):(h=b,f=(9===e.nodeType?e:e.ownerDocument).createTextNode(f),
+f[Ia]=h,b.stateNode=f));break;case 13:case 14:break;case 16:break;case 9:break;case 10:break;case 15:break;case 6:Bf(b);rg(b);break;case 12:tf(b);break;case 11:break;case 4:t("167");default:t("156")}b=N=null;f=a;if(1073741823===O||1073741823!==f.childExpirationTime){h=0;for(e=f.child;null!==e;){g=e.expirationTime;m=e.childExpirationTime;if(0===h||0!==g&&g<h)h=g;if(0===h||0!==m&&m<h)h=m;e=e.sibling}f.childExpirationTime=h}if(null!==b)return b;null!==c&&0===(c.effectTag&512)&&(null===c.firstEffect&&
+(c.firstEffect=a.firstEffect),null!==a.lastEffect&&(null!==c.lastEffect&&(c.lastEffect.nextEffect=a.firstEffect),c.lastEffect=a.lastEffect),1<a.effectTag&&(null!==c.lastEffect?c.lastEffect.nextEffect=a:c.firstEffect=a,c.lastEffect=a))}else{a=Gg(a,O);if(null!==a)return a.effectTag&=511,a;null!==c&&(c.firstEffect=c.lastEffect=null,c.effectTag|=512)}if(null!==d)return d;if(null!==c)a=c;else break}return null}function Rg(a){var b=pg(a.alternate,a,O);null===b&&(b=Qg(a));Ig.current=null;return b}
+function Sg(a,b,c){Lg?t("243"):void 0;Lg=!0;Ig.currentDispatcher=Hg;var d=a.nextExpirationTimeToWorkOn;if(d!==O||a!==Mg||null===N)Pg(),Mg=a,O=d,N=Ue(Mg.current,null,O),a.pendingCommitExpirationTime=0;var e=!1;do{try{if(b)for(;null!==N&&!Tg();)N=Rg(N);else for(;null!==N;)N=Rg(N)}catch(r){if(null===N)e=!0,Dg(r);else{null===N?t("271"):void 0;var f=N,g=f.return;if(null===g)e=!0,Dg(r);else{a:{var h=g,k=f,l=r;g=O;k.effectTag|=512;k.firstEffect=k.lastEffect=null;Ng=!0;l=nf(l,k);do{switch(h.tag){case 5:h.effectTag|=
+1024;h.expirationTime=g;g=Cg(h,l,g);gf(h,g);break a;case 2:case 3:k=l;var m=h.stateNode;if(0===(h.effectTag&64)&&null!==m&&"function"===typeof m.componentDidCatch&&(null===Fg||!Fg.has(m))){h.effectTag|=1024;h.expirationTime=g;g=Eg(h,k,g);gf(h,g);break a}}h=h.return}while(null!==h)}N=Qg(f);continue}}}break}while(1);Lg=!1;rf=qf=pf=Ig.currentDispatcher=null;if(e)Mg=null,a.finishedWork=null;else if(null!==N)a.finishedWork=null;else{b=a.current.alternate;null===b?t("281"):void 0;Mg=null;if(Ng){e=a.latestPendingTime;
+f=a.latestSuspendedTime;g=a.latestPingedTime;if(0!==e&&e>d||0!==f&&f>d||0!==g&&g>d){a.didError=!1;c=a.latestPingedTime;0!==c&&c<=d&&(a.latestPingedTime=0);c=a.earliestPendingTime;b=a.latestPendingTime;c===d?a.earliestPendingTime=b===d?a.latestPendingTime=0:b:b===d&&(a.latestPendingTime=c);c=a.earliestSuspendedTime;b=a.latestSuspendedTime;0===c?a.earliestSuspendedTime=a.latestSuspendedTime=d:c>d?a.earliestSuspendedTime=d:b<d&&(a.latestSuspendedTime=d);$e(d,a);a.expirationTime=a.expirationTime;return}if(!a.didError&&
+!c){a.didError=!0;a.nextExpirationTimeToWorkOn=d;d=a.expirationTime=1;a.expirationTime=d;return}}a.pendingCommitExpirationTime=d;a.finishedWork=b}}
+function wg(a,b){var c;a:{Lg&&!Og?t("263"):void 0;for(c=a.return;null!==c;){switch(c.tag){case 2:case 3:var d=c.stateNode;if("function"===typeof c.type.getDerivedStateFromCatch||"function"===typeof d.componentDidCatch&&(null===Fg||!Fg.has(d))){a=nf(b,a);a=Eg(c,a,1);ff(c,a);If(c,1);c=void 0;break a}break;case 5:a=nf(b,a);a=Cg(c,a,1);ff(c,a);If(c,1);c=void 0;break a}c=c.return}5===a.tag&&(c=nf(b,a),c=Cg(a,c,1),ff(a,c),If(a,1));c=void 0}return c}
+function Hf(a,b){0!==Kg?a=Kg:Lg?a=Og?1:O:b.mode&1?(a=Ug?2+10*(((a-2+15)/10|0)+1):2+25*(((a-2+500)/25|0)+1),null!==Mg&&a===O&&(a+=1)):a=1;Ug&&(0===Vg||a>Vg)&&(Vg=a);return a}
+function If(a,b){a:{if(0===a.expirationTime||a.expirationTime>b)a.expirationTime=b;var c=a.alternate;null!==c&&(0===c.expirationTime||c.expirationTime>b)&&(c.expirationTime=b);var d=a.return;if(null===d&&5===a.tag)a=a.stateNode;else{for(;null!==d;){c=d.alternate;if(0===d.childExpirationTime||d.childExpirationTime>b)d.childExpirationTime=b;null!==c&&(0===c.childExpirationTime||c.childExpirationTime>b)&&(c.childExpirationTime=b);if(null===d.return&&5===d.tag){a=d.stateNode;break a}d=d.return}a=null}}if(null!==
+a){!Lg&&0!==O&&b<O&&Pg();Ze(a,b);if(!Lg||Og||Mg!==a){b=a;a=a.expirationTime;if(null===b.nextScheduledRoot)b.expirationTime=a,null===T?(U=T=b,b.nextScheduledRoot=b):(T=T.nextScheduledRoot=b,T.nextScheduledRoot=U);else if(c=b.expirationTime,0===c||a<c)b.expirationTime=a;V||(W?Wg&&(Y=b,Z=1,Xg(b,1,!0)):1===a?Yg(1,null):Zg(b,a))}$g>ah&&($g=0,t("185"))}}function bh(a,b,c,d,e){var f=Kg;Kg=1;try{return a(b,c,d,e)}finally{Kg=f}}
+var U=null,T=null,ch=0,dh=void 0,V=!1,Y=null,Z=0,Vg=0,eh=!1,fh=!1,gh=null,hh=null,W=!1,Wg=!1,Ug=!1,ih=null,jh=ba.unstable_now(),kh=(jh/10|0)+2,lh=kh,ah=50,$g=0,mh=null,nh=1;function oh(){kh=((ba.unstable_now()-jh)/10|0)+2}function Zg(a,b){if(0!==ch){if(b>ch)return;null!==dh&&ba.unstable_cancelScheduledWork(dh)}ch=b;a=ba.unstable_now()-jh;dh=ba.unstable_scheduleWork(ph,{timeout:10*(b-2)-a})}function Gf(){if(V)return lh;qh();if(0===Z||1073741823===Z)oh(),lh=kh;return lh}
+function qh(){var a=0,b=null;if(null!==T)for(var c=T,d=U;null!==d;){var e=d.expirationTime;if(0===e){null===c||null===T?t("244"):void 0;if(d===d.nextScheduledRoot){U=T=d.nextScheduledRoot=null;break}else if(d===U)U=e=d.nextScheduledRoot,T.nextScheduledRoot=e,d.nextScheduledRoot=null;else if(d===T){T=c;T.nextScheduledRoot=U;d.nextScheduledRoot=null;break}else c.nextScheduledRoot=d.nextScheduledRoot,d.nextScheduledRoot=null;d=c.nextScheduledRoot}else{if(0===a||e<a)a=e,b=d;if(d===T)break;if(1===a)break;
+c=d;d=d.nextScheduledRoot}}Y=b;Z=a}function ph(a){if(a.didTimeout&&null!==U){oh();var b=U;do{var c=b.expirationTime;0!==c&&kh>=c&&(b.nextExpirationTimeToWorkOn=kh);b=b.nextScheduledRoot}while(b!==U)}Yg(0,a)}
+function Yg(a,b){hh=b;qh();if(null!==hh)for(oh(),lh=kh;null!==Y&&0!==Z&&(0===a||a>=Z)&&(!eh||kh>=Z);)Xg(Y,Z,kh>=Z),qh(),oh(),lh=kh;else for(;null!==Y&&0!==Z&&(0===a||a>=Z);)Xg(Y,Z,!0),qh();null!==hh&&(ch=0,dh=null);0!==Z&&Zg(Y,Z);hh=null;eh=!1;$g=0;mh=null;if(null!==ih)for(a=ih,ih=null,b=0;b<a.length;b++){var c=a[b];try{c._onComplete()}catch(d){fh||(fh=!0,gh=d)}}if(fh)throw a=gh,gh=null,fh=!1,a;}
+function Xg(a,b,c){V?t("245"):void 0;V=!0;if(null===hh||c){var d=a.finishedWork;null!==d?rh(a,d,b):(a.finishedWork=null,Sg(a,!1,c),d=a.finishedWork,null!==d&&rh(a,d,b))}else d=a.finishedWork,null!==d?rh(a,d,b):(a.finishedWork=null,Sg(a,!0,c),d=a.finishedWork,null!==d&&(Tg()?a.finishedWork=d:rh(a,d,b)));V=!1}
+function rh(a,b,c){var d=a.firstBatch;if(null!==d&&d._expirationTime<=c&&(null===ih?ih=[d]:ih.push(d),d._defer)){a.finishedWork=b;a.expirationTime=0;return}a.finishedWork=null;a===mh?$g++:(mh=a,$g=0);Og=Lg=!0;a.current===b?t("177"):void 0;c=a.pendingCommitExpirationTime;0===c?t("261"):void 0;a.pendingCommitExpirationTime=0;d=b.expirationTime;var e=b.childExpirationTime;d=0===d||0!==e&&e<d?e:d;a.didError=!1;0===d?(a.earliestPendingTime=0,a.latestPendingTime=0,a.earliestSuspendedTime=0,a.latestSuspendedTime=
+0,a.latestPingedTime=0):(e=a.latestPendingTime,0!==e&&(e<d?a.earliestPendingTime=a.latestPendingTime=0:a.earliestPendingTime<d&&(a.earliestPendingTime=a.latestPendingTime)),e=a.earliestSuspendedTime,0===e?Ze(a,d):d>a.latestSuspendedTime?(a.earliestSuspendedTime=0,a.latestSuspendedTime=0,a.latestPingedTime=0,Ze(a,d)):d<e&&Ze(a,d));$e(0,a);Ig.current=null;1<b.effectTag?null!==b.lastEffect?(b.lastEffect.nextEffect=b,d=b.firstEffect):d=b:d=b.firstEffect;xe=Gd;e=Td();if(Ud(e)){if("selectionStart"in e)var f=
+{start:e.selectionStart,end:e.selectionEnd};else a:{f=(f=e.ownerDocument)&&f.defaultView||window;var g=f.getSelection&&f.getSelection();if(g&&0!==g.rangeCount){f=g.anchorNode;var h=g.anchorOffset,k=g.focusNode;g=g.focusOffset;try{f.nodeType,k.nodeType}catch(Xa){f=null;break a}var l=0,m=-1,r=-1,A=0,S=0,B=e,P=null;b:for(;;){for(var v;;){B!==f||0!==h&&3!==B.nodeType||(m=l+h);B!==k||0!==g&&3!==B.nodeType||(r=l+g);3===B.nodeType&&(l+=B.nodeValue.length);if(null===(v=B.firstChild))break;P=B;B=v}for(;;){if(B===
+e)break b;P===f&&++A===h&&(m=l);P===k&&++S===g&&(r=l);if(null!==(v=B.nextSibling))break;B=P;P=B.parentNode}B=v}f=-1===m||-1===r?null:{start:m,end:r}}else f=null}f=f||{start:0,end:0}}else f=null;ye={focusedElem:e,selectionRange:f};Gd=!1;for(Q=d;null!==Q;){e=!1;f=void 0;try{for(;null!==Q;){if(Q.effectTag&256){var p=Q.alternate;a:switch(h=Q,h.tag){case 2:case 3:if(h.effectTag&256&&null!==p){var u=p.memoizedProps,x=p.memoizedState,R=h.stateNode;R.props=h.memoizedProps;R.state=h.memoizedState;var yh=R.getSnapshotBeforeUpdate(u,
+x);R.__reactInternalSnapshotBeforeUpdate=yh}break a;case 5:case 7:case 8:case 6:break a;default:t("163")}}Q=Q.nextEffect}}catch(Xa){e=!0,f=Xa}e&&(null===Q?t("178"):void 0,wg(Q,f),null!==Q&&(Q=Q.nextEffect))}for(Q=d;null!==Q;){p=!1;u=void 0;try{for(;null!==Q;){var w=Q.effectTag;w&16&&oe(Q.stateNode,"");if(w&128){var y=Q.alternate;if(null!==y){var q=y.ref;null!==q&&("function"===typeof q?q(null):q.current=null)}}switch(w&14){case 2:Ag(Q);Q.effectTag&=-3;break;case 6:Ag(Q);Q.effectTag&=-3;Bg(Q.alternate,
+Q);break;case 4:Bg(Q.alternate,Q);break;case 8:x=Q,yg(x),x.return=null,x.child=null,x.alternate&&(x.alternate.child=null,x.alternate.return=null)}Q=Q.nextEffect}}catch(Xa){p=!0,u=Xa}p&&(null===Q?t("178"):void 0,wg(Q,u),null!==Q&&(Q=Q.nextEffect))}q=ye;y=Td();w=q.focusedElem;u=q.selectionRange;if(y!==w&&w&&w.ownerDocument&&Sd(w.ownerDocument.documentElement,w)){null!==u&&Ud(w)&&(y=u.start,q=u.end,void 0===q&&(q=y),"selectionStart"in w?(w.selectionStart=y,w.selectionEnd=Math.min(q,w.value.length)):
+(p=w.ownerDocument||document,y=(p?p.defaultView:window).getSelection(),x=w.textContent.length,q=Math.min(u.start,x),u=void 0===u.end?q:Math.min(u.end,x),!y.extend&&q>u&&(x=u,u=q,q=x),x=Rd(w,q),R=Rd(w,u),x&&R&&(1!==y.rangeCount||y.anchorNode!==x.node||y.anchorOffset!==x.offset||y.focusNode!==R.node||y.focusOffset!==R.offset)&&(p=p.createRange(),p.setStart(x.node,x.offset),y.removeAllRanges(),q>u?(y.addRange(p),y.extend(R.node,R.offset)):(p.setEnd(R.node,R.offset),y.addRange(p)))));y=[];for(q=w;q=q.parentNode;)1===
+q.nodeType&&y.push({element:q,left:q.scrollLeft,top:q.scrollTop});"function"===typeof w.focus&&w.focus();for(w=0;w<y.length;w++)q=y[w],q.element.scrollLeft=q.left,q.element.scrollTop=q.top}ye=null;Gd=!!xe;xe=null;a.current=b;for(Q=d;null!==Q;){d=!1;w=void 0;try{for(y=c;null!==Q;){var Sa=Q.effectTag;if(Sa&36){var oc=Q.alternate;q=Q;p=y;switch(q.tag){case 2:case 3:var X=q.stateNode;if(q.effectTag&4)if(null===oc)X.props=q.memoizedProps,X.state=q.memoizedState,X.componentDidMount();else{var Ih=oc.memoizedProps,
+Jh=oc.memoizedState;X.props=q.memoizedProps;X.state=q.memoizedState;X.componentDidUpdate(Ih,Jh,X.__reactInternalSnapshotBeforeUpdate)}var kg=q.updateQueue;null!==kg&&(X.props=q.memoizedProps,X.state=q.memoizedState,lf(q,kg,X,p));break;case 5:var lg=q.updateQueue;if(null!==lg){u=null;if(null!==q.child)switch(q.child.tag){case 7:u=q.child.stateNode;break;case 2:case 3:u=q.child.stateNode}lf(q,lg,u,p)}break;case 7:var Kh=q.stateNode;null===oc&&q.effectTag&4&&ze(q.type,q.memoizedProps)&&Kh.focus();break;
+case 8:break;case 6:break;case 15:break;case 16:break;default:t("163")}}if(Sa&128){var Ac=Q.ref;if(null!==Ac){var mg=Q.stateNode;switch(Q.tag){case 7:var Pd=mg;break;default:Pd=mg}"function"===typeof Ac?Ac(Pd):Ac.current=Pd}}var Lh=Q.nextEffect;Q.nextEffect=null;Q=Lh}}catch(Xa){d=!0,w=Xa}d&&(null===Q?t("178"):void 0,wg(Q,w),null!==Q&&(Q=Q.nextEffect))}Lg=Og=!1;"function"===typeof Oe&&Oe(b.stateNode);Sa=b.expirationTime;b=b.childExpirationTime;b=0===Sa||0!==b&&b<Sa?b:Sa;0===b&&(Fg=null);a.expirationTime=
+b;a.finishedWork=null}function Tg(){return eh?!0:null===hh||hh.timeRemaining()>nh?!1:eh=!0}function Dg(a){null===Y?t("246"):void 0;Y.expirationTime=0;fh||(fh=!0,gh=a)}function sh(a,b){var c=W;W=!0;try{return a(b)}finally{(W=c)||V||Yg(1,null)}}function th(a,b){if(W&&!Wg){Wg=!0;try{return a(b)}finally{Wg=!1}}return a(b)}function uh(a,b,c){if(Ug)return a(b,c);W||V||0===Vg||(Yg(Vg,null),Vg=0);var d=Ug,e=W;W=Ug=!0;try{return a(b,c)}finally{Ug=d,(W=e)||V||Yg(1,null)}}
+function vh(a){if(!a)return Fe;a=a._reactInternalFiber;a:{2!==jd(a)||2!==a.tag&&3!==a.tag?t("170"):void 0;var b=a;do{switch(b.tag){case 5:b=b.stateNode.context;break a;case 2:if(K(b.type)){b=b.stateNode.__reactInternalMemoizedMergedChildContext;break a}break;case 3:if(K(b.type._reactResult)){b=b.stateNode.__reactInternalMemoizedMergedChildContext;break a}}b=b.return}while(null!==b);t("171");b=void 0}if(2===a.tag){var c=a.type;if(K(c))return Le(a,c,b)}else if(3===a.tag&&(c=a.type._reactResult,K(c)))return Le(a,
+c,b);return b}function wh(a,b,c,d,e){var f=b.current;c=vh(c);null===b.context?b.context=c:b.pendingContext=c;b=e;e=df(d);e.payload={element:a};b=void 0===b?null:b;null!==b&&(e.callback=b);ff(f,e);If(f,d);return d}function xh(a,b,c,d){var e=b.current,f=Gf();e=Hf(f,e);return wh(a,b,c,e,d)}function zh(a){a=a.current;if(!a.child)return null;switch(a.child.tag){case 7:return a.child.stateNode;default:return a.child.stateNode}}
+function Ah(a,b,c){var d=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:ac,key:null==d?null:""+d,children:a,containerInfo:b,implementation:c}}
+Fb=function(a,b,c){switch(b){case "input":Dc(a,c);b=c.name;if("radio"===c.type&&null!=b){for(c=a;c.parentNode;)c=c.parentNode;c=c.querySelectorAll("input[name="+JSON.stringify(""+b)+'][type="radio"]');for(b=0;b<c.length;b++){var d=c[b];if(d!==a&&d.form===a.form){var e=Na(d);e?void 0:t("90");Xb(d);Dc(d,e)}}}break;case "textarea":he(a,c);break;case "select":b=c.value,null!=b&&ee(a,!!c.multiple,b,!1)}};
+function Bh(a){var b=2+25*(((Gf()-2+500)/25|0)+1);b<=Jg&&(b=Jg+1);this._expirationTime=Jg=b;this._root=a;this._callbacks=this._next=null;this._hasChildren=this._didComplete=!1;this._children=null;this._defer=!0}Bh.prototype.render=function(a){this._defer?void 0:t("250");this._hasChildren=!0;this._children=a;var b=this._root._internalRoot,c=this._expirationTime,d=new Ch;wh(a,b,null,c,d._onCommit);return d};
+Bh.prototype.then=function(a){if(this._didComplete)a();else{var b=this._callbacks;null===b&&(b=this._callbacks=[]);b.push(a)}};
+Bh.prototype.commit=function(){var a=this._root._internalRoot,b=a.firstBatch;this._defer&&null!==b?void 0:t("251");if(this._hasChildren){var c=this._expirationTime;if(b!==this){this._hasChildren&&(c=this._expirationTime=b._expirationTime,this.render(this._children));for(var d=null,e=b;e!==this;)d=e,e=e._next;null===d?t("251"):void 0;d._next=e._next;this._next=b;a.firstBatch=this}this._defer=!1;b=c;V?t("253"):void 0;Y=a;Z=b;Xg(a,b,!0);Yg(1,null);b=this._next;this._next=null;b=a.firstBatch=b;null!==
+b&&b._hasChildren&&b.render(b._children)}else this._next=null,this._defer=!1};Bh.prototype._onComplete=function(){if(!this._didComplete){this._didComplete=!0;var a=this._callbacks;if(null!==a)for(var b=0;b<a.length;b++)(0,a[b])()}};function Ch(){this._callbacks=null;this._didCommit=!1;this._onCommit=this._onCommit.bind(this)}Ch.prototype.then=function(a){if(this._didCommit)a();else{var b=this._callbacks;null===b&&(b=this._callbacks=[]);b.push(a)}};
+Ch.prototype._onCommit=function(){if(!this._didCommit){this._didCommit=!0;var a=this._callbacks;if(null!==a)for(var b=0;b<a.length;b++){var c=a[b];"function"!==typeof c?t("191",c):void 0;c()}}};
+function Dh(a,b,c){b=new Se(5,null,null,b?3:0);a={current:b,containerInfo:a,pendingChildren:null,earliestPendingTime:0,latestPendingTime:0,earliestSuspendedTime:0,latestSuspendedTime:0,latestPingedTime:0,didError:!1,pendingCommitExpirationTime:0,finishedWork:null,timeoutHandle:-1,context:null,pendingContext:null,hydrate:c,nextExpirationTimeToWorkOn:0,expirationTime:0,firstBatch:null,nextScheduledRoot:null};this._internalRoot=b.stateNode=a}
+Dh.prototype.render=function(a,b){var c=this._internalRoot,d=new Ch;b=void 0===b?null:b;null!==b&&d.then(b);xh(a,c,null,d._onCommit);return d};Dh.prototype.unmount=function(a){var b=this._internalRoot,c=new Ch;a=void 0===a?null:a;null!==a&&c.then(a);xh(null,b,null,c._onCommit);return c};Dh.prototype.legacy_renderSubtreeIntoContainer=function(a,b,c){var d=this._internalRoot,e=new Ch;c=void 0===c?null:c;null!==c&&e.then(c);xh(b,d,a,e._onCommit);return e};
+Dh.prototype.createBatch=function(){var a=new Bh(this),b=a._expirationTime,c=this._internalRoot,d=c.firstBatch;if(null===d)c.firstBatch=a,a._next=null;else{for(c=null;null!==d&&d._expirationTime<=b;)c=d,d=d._next;a._next=d;null!==c&&(c._next=a)}return a};function Eh(a){return!(!a||1!==a.nodeType&&9!==a.nodeType&&11!==a.nodeType&&(8!==a.nodeType||" react-mount-point-unstable "!==a.nodeValue))}Lb=sh;Mb=uh;Nb=function(){V||0===Vg||(Yg(Vg,null),Vg=0)};
+function Fh(a,b){b||(b=a?9===a.nodeType?a.documentElement:a.firstChild:null,b=!(!b||1!==b.nodeType||!b.hasAttribute("data-reactroot")));if(!b)for(var c;c=a.lastChild;)a.removeChild(c);return new Dh(a,!1,b)}
+function Gh(a,b,c,d,e){Eh(c)?void 0:t("200");var f=c._reactRootContainer;if(f){if("function"===typeof e){var g=e;e=function(){var a=zh(f._internalRoot);g.call(a)}}null!=a?f.legacy_renderSubtreeIntoContainer(a,b,e):f.render(b,e)}else{f=c._reactRootContainer=Fh(c,d);if("function"===typeof e){var h=e;e=function(){var a=zh(f._internalRoot);h.call(a)}}th(function(){null!=a?f.legacy_renderSubtreeIntoContainer(a,b,e):f.render(b,e)})}return zh(f._internalRoot)}
+function Hh(a,b){var c=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;Eh(b)?void 0:t("200");return Ah(a,b,null,c)}
+var Mh={createPortal:Hh,findDOMNode:function(a){if(null==a)return null;if(1===a.nodeType)return a;var b=a._reactInternalFiber;void 0===b&&("function"===typeof a.render?t("188"):t("268",Object.keys(a)));a=md(b);a=null===a?null:a.stateNode;return a},hydrate:function(a,b,c){return Gh(null,a,b,!0,c)},render:function(a,b,c){return Gh(null,a,b,!1,c)},unstable_renderSubtreeIntoContainer:function(a,b,c,d){null==a||void 0===a._reactInternalFiber?t("38"):void 0;return Gh(a,b,c,!1,d)},unmountComponentAtNode:function(a){Eh(a)?
+void 0:t("40");return a._reactRootContainer?(th(function(){Gh(null,null,a,!1,function(){a._reactRootContainer=null})}),!0):!1},unstable_createPortal:function(){return Hh.apply(void 0,arguments)},unstable_batchedUpdates:sh,unstable_interactiveUpdates:uh,flushSync:function(a,b){V?t("187"):void 0;var c=W;W=!0;try{return bh(a,b)}finally{W=c,Yg(1,null)}},unstable_flushControlled:function(a){var b=W;W=!0;try{bh(a)}finally{(W=b)||V||Yg(1,null)}},__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:{Events:[La,
+Ma,Na,Ea.injectEventPluginsByName,qa,Ua,function(a){za(a,Ta)},Jb,Kb,Id,Ga]},unstable_createRoot:function(a,b){Eh(a)?void 0:t("278");return new Dh(a,!0,null!=b&&!0===b.hydrate)}};(function(a){var b=a.findFiberByHostInstance;return Re(n({},a,{findHostInstanceByFiber:function(a){a=md(a);return null===a?null:a.stateNode},findFiberByHostInstance:function(a){return b?b(a):null}}))})({findFiberByHostInstance:Ka,bundleType:0,version:"16.5.1",rendererPackageName:"react-dom"});
+var Nh={default:Mh},Oh=Nh&&Mh||Nh;module.exports=Oh.default||Oh;
+
+
+/***/ }),
+/* 14 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+if (true) {
+ module.exports = __webpack_require__(15);
+} else {
+ module.exports = require('./cjs/schedule.development.js');
+}
+
+
+/***/ }),
+/* 15 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+/** @license React v16.5.1
+ * schedule.production.min.js
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+Object.defineProperty(exports,"__esModule",{value:!0});var d=!("undefined"===typeof window||!window.document||!window.document.createElement),f=Date,g="function"===typeof setTimeout?setTimeout:void 0,h="function"===typeof clearTimeout?clearTimeout:void 0,l="function"===typeof requestAnimationFrame?requestAnimationFrame:void 0,m="function"===typeof cancelAnimationFrame?cancelAnimationFrame:void 0,n="object"===typeof performance&&"function"===typeof performance.now;
+exports.unstable_now=void 0;if(n){var p=performance;exports.unstable_now=function(){return p.now()}}else exports.unstable_now=function(){return f.now()};exports.unstable_scheduleWork=void 0;exports.unstable_cancelScheduledWork=void 0;
+if(d){var q=null,r=null,t=-1,u=!1,v=!1,w=void 0,x=void 0,y=function(a){w=l(function(b){h(x);a(b)});x=g(function(){m(w);a(exports.unstable_now())},100)},z=0,A=33,B=33,C={didTimeout:!1,timeRemaining:function(){var a=z-exports.unstable_now();return 0<a?a:0}},E=function(a,b){var c=a.scheduledCallback,e=!1;try{c(b),e=!0}finally{exports.unstable_cancelScheduledWork(a),e||(u=!0,window.postMessage(D,"*"))}},D="__reactIdleCallback$"+Math.random().toString(36).slice(2);window.addEventListener("message",function(a){if(a.source===
+window&&a.data===D&&(u=!1,null!==q)){if(null!==q){var b=exports.unstable_now();if(!(-1===t||t>b)){a=-1;for(var c=[],e=q;null!==e;){var k=e.timeoutTime;-1!==k&&k<=b?c.push(e):-1!==k&&(-1===a||k<a)&&(a=k);e=e.next}if(0<c.length)for(C.didTimeout=!0,b=0,e=c.length;b<e;b++)E(c[b],C);t=a}}for(a=exports.unstable_now();0<z-a&&null!==q;)a=q,C.didTimeout=!1,E(a,C),a=exports.unstable_now();null===q||v||(v=!0,y(F))}},!1);var F=function(a){v=!1;var b=a-z+B;b<B&&A<B?(8>b&&(b=8),B=b<A?A:b):A=b;z=a+B;u||(u=!0,window.postMessage(D,
+"*"))};exports.unstable_scheduleWork=function(a,b){var c=-1;null!=b&&"number"===typeof b.timeout&&(c=exports.unstable_now()+b.timeout);if(-1===t||-1!==c&&c<t)t=c;a={scheduledCallback:a,timeoutTime:c,prev:null,next:null};null===q?q=a:(b=a.prev=r,null!==b&&(b.next=a));r=a;v||(v=!0,y(F));return a};exports.unstable_cancelScheduledWork=function(a){if(null!==a.prev||q===a){var b=a.next,c=a.prev;a.next=null;a.prev=null;null!==b?null!==c?(c.next=b,b.prev=c):(b.prev=null,q=b):null!==c?(c.next=null,r=c):r=
+q=null}}}else{var G=new Map;exports.unstable_scheduleWork=function(a){var b={scheduledCallback:a,timeoutTime:0,next:null,prev:null},c=g(function(){a({timeRemaining:function(){return Infinity},didTimeout:!1})});G.set(a,c);return b};exports.unstable_cancelScheduledWork=function(a){var b=G.get(a.scheduledCallback);G.delete(a);h(b)}};
+
+
+/***/ }),
+/* 16 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react__ = __webpack_require__(1);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_react___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_react__);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_immutable__ = __webpack_require__(17);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_immutable___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_immutable__);
+var _createClass=function(){function defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value"in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor);}}return function(Constructor,protoProps,staticProps){if(protoProps)defineProperties(Constructor.prototype,protoProps);if(staticProps)defineProperties(Constructor,staticProps);return Constructor;};}();function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}function _possibleConstructorReturn(self,call){if(!self){throw new ReferenceError("this hasn't been initialised - super() hasn't been called");}return call&&(typeof call==="object"||typeof call==="function")?call:self;}function _inherits(subClass,superClass){if(typeof superClass!=="function"&&superClass!==null){throw new TypeError("Super expression must either be null or a function, not "+typeof superClass);}subClass.prototype=Object.create(superClass&&superClass.prototype,{constructor:{value:subClass,enumerable:false,writable:true,configurable:true}});if(superClass)Object.setPrototypeOf?Object.setPrototypeOf(subClass,superClass):subClass.__proto__=superClass;}var App=function(_Component){_inherits(App,_Component);function App(){var _ref;var _temp,_this,_ret;_classCallCheck(this,App);for(var _len=arguments.length,args=Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key];}return _ret=(_temp=(_this=_possibleConstructorReturn(this,(_ref=App.__proto__||Object.getPrototypeOf(App)).call.apply(_ref,[this].concat(args))),_this),_this.onClick=function(){var f=_this.fields;console.log(f);},_temp),_possibleConstructorReturn(_this,_ret);}_createClass(App,[{key:"componentDidMount",value:function componentDidMount(){this.fields=new __WEBPACK_IMPORTED_MODULE_1_immutable___default.a.Map({a:2});}},{key:"render",value:function render(){return __WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("div",{className:"App"},__WEBPACK_IMPORTED_MODULE_0_react___default.a.createElement("button",{onClick:this.onClick},"Click Me"));}}]);return App;}(__WEBPACK_IMPORTED_MODULE_0_react__["Component"]);window.clickButton=function(){return document.querySelector("button").click();};/* harmony default export */ __webpack_exports__["a"] = (App);
+
+/***/ }),
+/* 17 */
+/***/ (function(module, exports, __webpack_require__) {
+
+/**
+ * Copyright (c) 2014-present, Facebook, Inc.
+ *
+ * This source code is licensed under the MIT license found in the
+ * LICENSE file in the root directory of this source tree.
+ */
+
+(function (global, factory) {
+ true ? module.exports = factory() :
+ typeof define === 'function' && define.amd ? define(factory) :
+ (global.Immutable = factory());
+}(this, function () { 'use strict';var SLICE$0 = Array.prototype.slice;
+
+ function createClass(ctor, superClass) {
+ if (superClass) {
+ ctor.prototype = Object.create(superClass.prototype);
+ }
+ ctor.prototype.constructor = ctor;
+ }
+
+ function Iterable(value) {
+ return isIterable(value) ? value : Seq(value);
+ }
+
+
+ createClass(KeyedIterable, Iterable);
+ function KeyedIterable(value) {
+ return isKeyed(value) ? value : KeyedSeq(value);
+ }
+
+
+ createClass(IndexedIterable, Iterable);
+ function IndexedIterable(value) {
+ return isIndexed(value) ? value : IndexedSeq(value);
+ }
+
+
+ createClass(SetIterable, Iterable);
+ function SetIterable(value) {
+ return isIterable(value) && !isAssociative(value) ? value : SetSeq(value);
+ }
+
+
+
+ function isIterable(maybeIterable) {
+ return !!(maybeIterable && maybeIterable[IS_ITERABLE_SENTINEL]);
+ }
+
+ function isKeyed(maybeKeyed) {
+ return !!(maybeKeyed && maybeKeyed[IS_KEYED_SENTINEL]);
+ }
+
+ function isIndexed(maybeIndexed) {
+ return !!(maybeIndexed && maybeIndexed[IS_INDEXED_SENTINEL]);
+ }
+
+ function isAssociative(maybeAssociative) {
+ return isKeyed(maybeAssociative) || isIndexed(maybeAssociative);
+ }
+
+ function isOrdered(maybeOrdered) {
+ return !!(maybeOrdered && maybeOrdered[IS_ORDERED_SENTINEL]);
+ }
+
+ Iterable.isIterable = isIterable;
+ Iterable.isKeyed = isKeyed;
+ Iterable.isIndexed = isIndexed;
+ Iterable.isAssociative = isAssociative;
+ Iterable.isOrdered = isOrdered;
+
+ Iterable.Keyed = KeyedIterable;
+ Iterable.Indexed = IndexedIterable;
+ Iterable.Set = SetIterable;
+
+
+ var IS_ITERABLE_SENTINEL = '@@__IMMUTABLE_ITERABLE__@@';
+ var IS_KEYED_SENTINEL = '@@__IMMUTABLE_KEYED__@@';
+ var IS_INDEXED_SENTINEL = '@@__IMMUTABLE_INDEXED__@@';
+ var IS_ORDERED_SENTINEL = '@@__IMMUTABLE_ORDERED__@@';
+
+ // Used for setting prototype methods that IE8 chokes on.
+ var DELETE = 'delete';
+
+ // Constants describing the size of trie nodes.
+ var SHIFT = 5; // Resulted in best performance after ______?
+ var SIZE = 1 << SHIFT;
+ var MASK = SIZE - 1;
+
+ // A consistent shared value representing "not set" which equals nothing other
+ // than itself, and nothing that could be provided externally.
+ var NOT_SET = {};
+
+ // Boolean references, Rough equivalent of `bool &`.
+ var CHANGE_LENGTH = { value: false };
+ var DID_ALTER = { value: false };
+
+ function MakeRef(ref) {
+ ref.value = false;
+ return ref;
+ }
+
+ function SetRef(ref) {
+ ref && (ref.value = true);
+ }
+
+ // A function which returns a value representing an "owner" for transient writes
+ // to tries. The return value will only ever equal itself, and will not equal
+ // the return of any subsequent call of this function.
+ function OwnerID() {}
+
+ // http://jsperf.com/copy-array-inline
+ function arrCopy(arr, offset) {
+ offset = offset || 0;
+ var len = Math.max(0, arr.length - offset);
+ var newArr = new Array(len);
+ for (var ii = 0; ii < len; ii++) {
+ newArr[ii] = arr[ii + offset];
+ }
+ return newArr;
+ }
+
+ function ensureSize(iter) {
+ if (iter.size === undefined) {
+ iter.size = iter.__iterate(returnTrue);
+ }
+ return iter.size;
+ }
+
+ function wrapIndex(iter, index) {
+ // This implements "is array index" which the ECMAString spec defines as:
+ //
+ // A String property name P is an array index if and only if
+ // ToString(ToUint32(P)) is equal to P and ToUint32(P) is not equal
+ // to 2^32−1.
+ //
+ // http://www.ecma-international.org/ecma-262/6.0/#sec-array-exotic-objects
+ if (typeof index !== 'number') {
+ var uint32Index = index >>> 0; // N >>> 0 is shorthand for ToUint32
+ if ('' + uint32Index !== index || uint32Index === 4294967295) {
+ return NaN;
+ }
+ index = uint32Index;
+ }
+ return index < 0 ? ensureSize(iter) + index : index;
+ }
+
+ function returnTrue() {
+ return true;
+ }
+
+ function wholeSlice(begin, end, size) {
+ return (begin === 0 || (size !== undefined && begin <= -size)) &&
+ (end === undefined || (size !== undefined && end >= size));
+ }
+
+ function resolveBegin(begin, size) {
+ return resolveIndex(begin, size, 0);
+ }
+
+ function resolveEnd(end, size) {
+ return resolveIndex(end, size, size);
+ }
+
+ function resolveIndex(index, size, defaultIndex) {
+ return index === undefined ?
+ defaultIndex :
+ index < 0 ?
+ Math.max(0, size + index) :
+ size === undefined ?
+ index :
+ Math.min(size, index);
+ }
+
+ /* global Symbol */
+
+ var ITERATE_KEYS = 0;
+ var ITERATE_VALUES = 1;
+ var ITERATE_ENTRIES = 2;
+
+ var REAL_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;
+ var FAUX_ITERATOR_SYMBOL = '@@iterator';
+
+ var ITERATOR_SYMBOL = REAL_ITERATOR_SYMBOL || FAUX_ITERATOR_SYMBOL;
+
+
+ function Iterator(next) {
+ this.next = next;
+ }
+
+ Iterator.prototype.toString = function() {
+ return '[Iterator]';
+ };
+
+
+ Iterator.KEYS = ITERATE_KEYS;
+ Iterator.VALUES = ITERATE_VALUES;
+ Iterator.ENTRIES = ITERATE_ENTRIES;
+
+ Iterator.prototype.inspect =
+ Iterator.prototype.toSource = function () { return this.toString(); }
+ Iterator.prototype[ITERATOR_SYMBOL] = function () {
+ return this;
+ };
+
+
+ function iteratorValue(type, k, v, iteratorResult) {
+ var value = type === 0 ? k : type === 1 ? v : [k, v];
+ iteratorResult ? (iteratorResult.value = value) : (iteratorResult = {
+ value: value, done: false
+ });
+ return iteratorResult;
+ }
+
+ function iteratorDone() {
+ return { value: undefined, done: true };
+ }
+
+ function hasIterator(maybeIterable) {
+ return !!getIteratorFn(maybeIterable);
+ }
+
+ function isIterator(maybeIterator) {
+ return maybeIterator && typeof maybeIterator.next === 'function';
+ }
+
+ function getIterator(iterable) {
+ var iteratorFn = getIteratorFn(iterable);
+ return iteratorFn && iteratorFn.call(iterable);
+ }
+
+ function getIteratorFn(iterable) {
+ var iteratorFn = iterable && (
+ (REAL_ITERATOR_SYMBOL && iterable[REAL_ITERATOR_SYMBOL]) ||
+ iterable[FAUX_ITERATOR_SYMBOL]
+ );
+ if (typeof iteratorFn === 'function') {
+ return iteratorFn;
+ }
+ }
+
+ function isArrayLike(value) {
+ return value && typeof value.length === 'number';
+ }
+
+ createClass(Seq, Iterable);
+ function Seq(value) {
+ return value === null || value === undefined ? emptySequence() :
+ isIterable(value) ? value.toSeq() : seqFromValue(value);
+ }
+
+ Seq.of = function(/*...values*/) {
+ return Seq(arguments);
+ };
+
+ Seq.prototype.toSeq = function() {
+ return this;
+ };
+
+ Seq.prototype.toString = function() {
+ return this.__toString('Seq {', '}');
+ };
+
+ Seq.prototype.cacheResult = function() {
+ if (!this._cache && this.__iterateUncached) {
+ this._cache = this.entrySeq().toArray();
+ this.size = this._cache.length;
+ }
+ return this;
+ };
+
+ // abstract __iterateUncached(fn, reverse)
+
+ Seq.prototype.__iterate = function(fn, reverse) {
+ return seqIterate(this, fn, reverse, true);
+ };
+
+ // abstract __iteratorUncached(type, reverse)
+
+ Seq.prototype.__iterator = function(type, reverse) {
+ return seqIterator(this, type, reverse, true);
+ };
+
+
+
+ createClass(KeyedSeq, Seq);
+ function KeyedSeq(value) {
+ return value === null || value === undefined ?
+ emptySequence().toKeyedSeq() :
+ isIterable(value) ?
+ (isKeyed(value) ? value.toSeq() : value.fromEntrySeq()) :
+ keyedSeqFromValue(value);
+ }
+
+ KeyedSeq.prototype.toKeyedSeq = function() {
+ return this;
+ };
+
+
+
+ createClass(IndexedSeq, Seq);
+ function IndexedSeq(value) {
+ return value === null || value === undefined ? emptySequence() :
+ !isIterable(value) ? indexedSeqFromValue(value) :
+ isKeyed(value) ? value.entrySeq() : value.toIndexedSeq();
+ }
+
+ IndexedSeq.of = function(/*...values*/) {
+ return IndexedSeq(arguments);
+ };
+
+ IndexedSeq.prototype.toIndexedSeq = function() {
+ return this;
+ };
+
+ IndexedSeq.prototype.toString = function() {
+ return this.__toString('Seq [', ']');
+ };
+
+ IndexedSeq.prototype.__iterate = function(fn, reverse) {
+ return seqIterate(this, fn, reverse, false);
+ };
+
+ IndexedSeq.prototype.__iterator = function(type, reverse) {
+ return seqIterator(this, type, reverse, false);
+ };
+
+
+
+ createClass(SetSeq, Seq);
+ function SetSeq(value) {
+ return (
+ value === null || value === undefined ? emptySequence() :
+ !isIterable(value) ? indexedSeqFromValue(value) :
+ isKeyed(value) ? value.entrySeq() : value
+ ).toSetSeq();
+ }
+
+ SetSeq.of = function(/*...values*/) {
+ return SetSeq(arguments);
+ };
+
+ SetSeq.prototype.toSetSeq = function() {
+ return this;
+ };
+
+
+
+ Seq.isSeq = isSeq;
+ Seq.Keyed = KeyedSeq;
+ Seq.Set = SetSeq;
+ Seq.Indexed = IndexedSeq;
+
+ var IS_SEQ_SENTINEL = '@@__IMMUTABLE_SEQ__@@';
+
+ Seq.prototype[IS_SEQ_SENTINEL] = true;
+
+
+
+ createClass(ArraySeq, IndexedSeq);
+ function ArraySeq(array) {
+ this._array = array;
+ this.size = array.length;
+ }
+
+ ArraySeq.prototype.get = function(index, notSetValue) {
+ return this.has(index) ? this._array[wrapIndex(this, index)] : notSetValue;
+ };
+
+ ArraySeq.prototype.__iterate = function(fn, reverse) {
+ var array = this._array;
+ var maxIndex = array.length - 1;
+ for (var ii = 0; ii <= maxIndex; ii++) {
+ if (fn(array[reverse ? maxIndex - ii : ii], ii, this) === false) {
+ return ii + 1;
+ }
+ }
+ return ii;
+ };
+
+ ArraySeq.prototype.__iterator = function(type, reverse) {
+ var array = this._array;
+ var maxIndex = array.length - 1;
+ var ii = 0;
+ return new Iterator(function()
+ {return ii > maxIndex ?
+ iteratorDone() :
+ iteratorValue(type, ii, array[reverse ? maxIndex - ii++ : ii++])}
+ );
+ };
+
+
+
+ createClass(ObjectSeq, KeyedSeq);
+ function ObjectSeq(object) {
+ var keys = Object.keys(object);
+ this._object = object;
+ this._keys = keys;
+ this.size = keys.length;
+ }
+
+ ObjectSeq.prototype.get = function(key, notSetValue) {
+ if (notSetValue !== undefined && !this.has(key)) {
+ return notSetValue;
+ }
+ return this._object[key];
+ };
+
+ ObjectSeq.prototype.has = function(key) {
+ return this._object.hasOwnProperty(key);
+ };
+
+ ObjectSeq.prototype.__iterate = function(fn, reverse) {
+ var object = this._object;
+ var keys = this._keys;
+ var maxIndex = keys.length - 1;
+ for (var ii = 0; ii <= maxIndex; ii++) {
+ var key = keys[reverse ? maxIndex - ii : ii];
+ if (fn(object[key], key, this) === false) {
+ return ii + 1;
+ }
+ }
+ return ii;
+ };
+
+ ObjectSeq.prototype.__iterator = function(type, reverse) {
+ var object = this._object;
+ var keys = this._keys;
+ var maxIndex = keys.length - 1;
+ var ii = 0;
+ return new Iterator(function() {
+ var key = keys[reverse ? maxIndex - ii : ii];
+ return ii++ > maxIndex ?
+ iteratorDone() :
+ iteratorValue(type, key, object[key]);
+ });
+ };
+
+ ObjectSeq.prototype[IS_ORDERED_SENTINEL] = true;
+
+
+ createClass(IterableSeq, IndexedSeq);
+ function IterableSeq(iterable) {
+ this._iterable = iterable;
+ this.size = iterable.length || iterable.size;
+ }
+
+ IterableSeq.prototype.__iterateUncached = function(fn, reverse) {
+ if (reverse) {
+ return this.cacheResult().__iterate(fn, reverse);
+ }
+ var iterable = this._iterable;
+ var iterator = getIterator(iterable);
+ var iterations = 0;
+ if (isIterator(iterator)) {
+ var step;
+ while (!(step = iterator.next()).done) {
+ if (fn(step.value, iterations++, this) === false) {
+ break;
+ }
+ }
+ }
+ return iterations;
+ };
+
+ IterableSeq.prototype.__iteratorUncached = function(type, reverse) {
+ if (reverse) {
+ return this.cacheResult().__iterator(type, reverse);
+ }
+ var iterable = this._iterable;
+ var iterator = getIterator(iterable);
+ if (!isIterator(iterator)) {
+ return new Iterator(iteratorDone);
+ }
+ var iterations = 0;
+ return new Iterator(function() {
+ var step = iterator.next();
+ return step.done ? step : iteratorValue(type, iterations++, step.value);
+ });
+ };
+
+
+
+ createClass(IteratorSeq, IndexedSeq);
+ function IteratorSeq(iterator) {
+ this._iterator = iterator;
+ this._iteratorCache = [];
+ }
+
+ IteratorSeq.prototype.__iterateUncached = function(fn, reverse) {
+ if (reverse) {
+ return this.cacheResult().__iterate(fn, reverse);
+ }
+ var iterator = this._iterator;
+ var cache = this._iteratorCache;
+ var iterations = 0;
+ while (iterations < cache.length) {
+ if (fn(cache[iterations], iterations++, this) === false) {
+ return iterations;
+ }
+ }
+ var step;
+ while (!(step = iterator.next()).done) {
+ var val = step.value;
+ cache[iterations] = val;
+ if (fn(val, iterations++, this) === false) {
+ break;
+ }
+ }
+ return iterations;
+ };
+
+ IteratorSeq.prototype.__iteratorUncached = function(type, reverse) {
+ if (reverse) {
+ return this.cacheResult().__iterator(type, reverse);
+ }
+ var iterator = this._iterator;
+ var cache = this._iteratorCache;
+ var iterations = 0;
+ return new Iterator(function() {
+ if (iterations >= cache.length) {
+ var step = iterator.next();
+ if (step.done) {
+ return step;
+ }
+ cache[iterations] = step.value;
+ }
+ return iteratorValue(type, iterations, cache[iterations++]);
+ });
+ };
+
+
+
+
+ // # pragma Helper functions
+
+ function isSeq(maybeSeq) {
+ return !!(maybeSeq && maybeSeq[IS_SEQ_SENTINEL]);
+ }
+
+ var EMPTY_SEQ;
+
+ function emptySequence() {
+ return EMPTY_SEQ || (EMPTY_SEQ = new ArraySeq([]));
+ }
+
+ function keyedSeqFromValue(value) {
+ var seq =
+ Array.isArray(value) ? new ArraySeq(value).fromEntrySeq() :
+ isIterator(value) ? new IteratorSeq(value).fromEntrySeq() :
+ hasIterator(value) ? new IterableSeq(value).fromEntrySeq() :
+ typeof value === 'object' ? new ObjectSeq(value) :
+ undefined;
+ if (!seq) {
+ throw new TypeError(
+ 'Expected Array or iterable object of [k, v] entries, '+
+ 'or keyed object: ' + value
+ );
+ }
+ return seq;
+ }
+
+ function indexedSeqFromValue(value) {
+ var seq = maybeIndexedSeqFromValue(value);
+ if (!seq) {
+ throw new TypeError(
+ 'Expected Array or iterable object of values: ' + value
+ );
+ }
+ return seq;
+ }
+
+ function seqFromValue(value) {
+ var seq = maybeIndexedSeqFromValue(value) ||
+ (typeof value === 'object' && new ObjectSeq(value));
+ if (!seq) {
+ throw new TypeError(
+ 'Expected Array or iterable object of values, or keyed object: ' + value
+ );
+ }
+ return seq;
+ }
+
+ function maybeIndexedSeqFromValue(value) {
+ return (
+ isArrayLike(value) ? new ArraySeq(value) :
+ isIterator(value) ? new IteratorSeq(value) :
+ hasIterator(value) ? new IterableSeq(value) :
+ undefined
+ );
+ }
+
+ function seqIterate(seq, fn, reverse, useKeys) {
+ var cache = seq._cache;
+ if (cache) {
+ var maxIndex = cache.length - 1;
+ for (var ii = 0; ii <= maxIndex; ii++) {
+ var entry = cache[reverse ? maxIndex - ii : ii];
+ if (fn(entry[1], useKeys ? entry[0] : ii, seq) === false) {
+ return ii + 1;
+ }
+ }
+ return ii;
+ }
+ return seq.__iterateUncached(fn, reverse);
+ }
+
+ function seqIterator(seq, type, reverse, useKeys) {
+ var cache = seq._cache;
+ if (cache) {
+ var maxIndex = cache.length - 1;
+ var ii = 0;
+ return new Iterator(function() {
+ var entry = cache[reverse ? maxIndex - ii : ii];
+ return ii++ > maxIndex ?
+ iteratorDone() :
+ iteratorValue(type, useKeys ? entry[0] : ii - 1, entry[1]);
+ });
+ }
+ return seq.__iteratorUncached(type, reverse);
+ }
+
+ function fromJS(json, converter) {
+ return converter ?
+ fromJSWith(converter, json, '', {'': json}) :
+ fromJSDefault(json);
+ }
+
+ function fromJSWith(converter, json, key, parentJSON) {
+ if (Array.isArray(json)) {
+ return converter.call(parentJSON, key, IndexedSeq(json).map(function(v, k) {return fromJSWith(converter, v, k, json)}));
+ }
+ if (isPlainObj(json)) {
+ return converter.call(parentJSON, key, KeyedSeq(json).map(function(v, k) {return fromJSWith(converter, v, k, json)}));
+ }
+ return json;
+ }
+
+ function fromJSDefault(json) {
+ if (Array.isArray(json)) {
+ return IndexedSeq(json).map(fromJSDefault).toList();
+ }
+ if (isPlainObj(json)) {
+ return KeyedSeq(json).map(fromJSDefault).toMap();
+ }
+ return json;
+ }
+
+ function isPlainObj(value) {
+ return value && (value.constructor === Object || value.constructor === undefined);
+ }
+
+ /**
+ * An extension of the "same-value" algorithm as [described for use by ES6 Map
+ * and Set](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map#Key_equality)
+ *
+ * NaN is considered the same as NaN, however -0 and 0 are considered the same
+ * value, which is different from the algorithm described by
+ * [`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is).
+ *
+ * This is extended further to allow Objects to describe the values they
+ * represent, by way of `valueOf` or `equals` (and `hashCode`).
+ *
+ * Note: because of this extension, the key equality of Immutable.Map and the
+ * value equality of Immutable.Set will differ from ES6 Map and Set.
+ *
+ * ### Defining custom values
+ *
+ * The easiest way to describe the value an object represents is by implementing
+ * `valueOf`. For example, `Date` represents a value by returning a unix
+ * timestamp for `valueOf`:
+ *
+ * var date1 = new Date(1234567890000); // Fri Feb 13 2009 ...
+ * var date2 = new Date(1234567890000);
+ * date1.valueOf(); // 1234567890000
+ * assert( date1 !== date2 );
+ * assert( Immutable.is( date1, date2 ) );
+ *
+ * Note: overriding `valueOf` may have other implications if you use this object
+ * where JavaScript expects a primitive, such as implicit string coercion.
+ *
+ * For more complex types, especially collections, implementing `valueOf` may
+ * not be performant. An alternative is to implement `equals` and `hashCode`.
+ *
+ * `equals` takes another object, presumably of similar type, and returns true
+ * if the it is equal. Equality is symmetrical, so the same result should be
+ * returned if this and the argument are flipped.
+ *
+ * assert( a.equals(b) === b.equals(a) );
+ *
+ * `hashCode` returns a 32bit integer number representing the object which will
+ * be used to determine how to store the value object in a Map or Set. You must
+ * provide both or neither methods, one must not exist without the other.
+ *
+ * Also, an important relationship between these methods must be upheld: if two
+ * values are equal, they *must* return the same hashCode. If the values are not
+ * equal, they might have the same hashCode; this is called a hash collision,
+ * and while undesirable for performance reasons, it is acceptable.
+ *
+ * if (a.equals(b)) {
+ * assert( a.hashCode() === b.hashCode() );
+ * }
+ *
+ * All Immutable collections implement `equals` and `hashCode`.
+ *
+ */
+ function is(valueA, valueB) {
+ if (valueA === valueB || (valueA !== valueA && valueB !== valueB)) {
+ return true;
+ }
+ if (!valueA || !valueB) {
+ return false;
+ }
+ if (typeof valueA.valueOf === 'function' &&
+ typeof valueB.valueOf === 'function') {
+ valueA = valueA.valueOf();
+ valueB = valueB.valueOf();
+ if (valueA === valueB || (valueA !== valueA && valueB !== valueB)) {
+ return true;
+ }
+ if (!valueA || !valueB) {
+ return false;
+ }
+ }
+ if (typeof valueA.equals === 'function' &&
+ typeof valueB.equals === 'function' &&
+ valueA.equals(valueB)) {
+ return true;
+ }
+ return false;
+ }
+
+ function deepEqual(a, b) {
+ if (a === b) {
+ return true;
+ }
+
+ if (
+ !isIterable(b) ||
+ a.size !== undefined && b.size !== undefined && a.size !== b.size ||
+ a.__hash !== undefined && b.__hash !== undefined && a.__hash !== b.__hash ||
+ isKeyed(a) !== isKeyed(b) ||
+ isIndexed(a) !== isIndexed(b) ||
+ isOrdered(a) !== isOrdered(b)
+ ) {
+ return false;
+ }
+
+ if (a.size === 0 && b.size === 0) {
+ return true;
+ }
+
+ var notAssociative = !isAssociative(a);
+
+ if (isOrdered(a)) {
+ var entries = a.entries();
+ return b.every(function(v, k) {
+ var entry = entries.next().value;
+ return entry && is(entry[1], v) && (notAssociative || is(entry[0], k));
+ }) && entries.next().done;
+ }
+
+ var flipped = false;
+
+ if (a.size === undefined) {
+ if (b.size === undefined) {
+ if (typeof a.cacheResult === 'function') {
+ a.cacheResult();
+ }
+ } else {
+ flipped = true;
+ var _ = a;
+ a = b;
+ b = _;
+ }
+ }
+
+ var allEqual = true;
+ var bSize = b.__iterate(function(v, k) {
+ if (notAssociative ? !a.has(v) :
+ flipped ? !is(v, a.get(k, NOT_SET)) : !is(a.get(k, NOT_SET), v)) {
+ allEqual = false;
+ return false;
+ }
+ });
+
+ return allEqual && a.size === bSize;
+ }
+
+ createClass(Repeat, IndexedSeq);
+
+ function Repeat(value, times) {
+ if (!(this instanceof Repeat)) {
+ return new Repeat(value, times);
+ }
+ this._value = value;
+ this.size = times === undefined ? Infinity : Math.max(0, times);
+ if (this.size === 0) {
+ if (EMPTY_REPEAT) {
+ return EMPTY_REPEAT;
+ }
+ EMPTY_REPEAT = this;
+ }
+ }
+
+ Repeat.prototype.toString = function() {
+ if (this.size === 0) {
+ return 'Repeat []';
+ }
+ return 'Repeat [ ' + this._value + ' ' + this.size + ' times ]';
+ };
+
+ Repeat.prototype.get = function(index, notSetValue) {
+ return this.has(index) ? this._value : notSetValue;
+ };
+
+ Repeat.prototype.includes = function(searchValue) {
+ return is(this._value, searchValue);
+ };
+
+ Repeat.prototype.slice = function(begin, end) {
+ var size = this.size;
+ return wholeSlice(begin, end, size) ? this :
+ new Repeat(this._value, resolveEnd(end, size) - resolveBegin(begin, size));
+ };
+
+ Repeat.prototype.reverse = function() {
+ return this;
+ };
+
+ Repeat.prototype.indexOf = function(searchValue) {
+ if (is(this._value, searchValue)) {
+ return 0;
+ }
+ return -1;
+ };
+
+ Repeat.prototype.lastIndexOf = function(searchValue) {
+ if (is(this._value, searchValue)) {
+ return this.size;
+ }
+ return -1;
+ };
+
+ Repeat.prototype.__iterate = function(fn, reverse) {
+ for (var ii = 0; ii < this.size; ii++) {
+ if (fn(this._value, ii, this) === false) {
+ return ii + 1;
+ }
+ }
+ return ii;
+ };
+
+ Repeat.prototype.__iterator = function(type, reverse) {var this$0 = this;
+ var ii = 0;
+ return new Iterator(function()
+ {return ii < this$0.size ? iteratorValue(type, ii++, this$0._value) : iteratorDone()}
+ );
+ };
+
+ Repeat.prototype.equals = function(other) {
+ return other instanceof Repeat ?
+ is(this._value, other._value) :
+ deepEqual(other);
+ };
+
+
+ var EMPTY_REPEAT;
+
+ function invariant(condition, error) {
+ if (!condition) throw new Error(error);
+ }
+
+ createClass(Range, IndexedSeq);
+
+ function Range(start, end, step) {
+ if (!(this instanceof Range)) {
+ return new Range(start, end, step);
+ }
+ invariant(step !== 0, 'Cannot step a Range by 0');
+ start = start || 0;
+ if (end === undefined) {
+ end = Infinity;
+ }
+ step = step === undefined ? 1 : Math.abs(step);
+ if (end < start) {
+ step = -step;
+ }
+ this._start = start;
+ this._end = end;
+ this._step = step;
+ this.size = Math.max(0, Math.ceil((end - start) / step - 1) + 1);
+ if (this.size === 0) {
+ if (EMPTY_RANGE) {
+ return EMPTY_RANGE;
+ }
+ EMPTY_RANGE = this;
+ }
+ }
+
+ Range.prototype.toString = function() {
+ if (this.size === 0) {
+ return 'Range []';
+ }
+ return 'Range [ ' +
+ this._start + '...' + this._end +
+ (this._step !== 1 ? ' by ' + this._step : '') +
+ ' ]';
+ };
+
+ Range.prototype.get = function(index, notSetValue) {
+ return this.has(index) ?
+ this._start + wrapIndex(this, index) * this._step :
+ notSetValue;
+ };
+
+ Range.prototype.includes = function(searchValue) {
+ var possibleIndex = (searchValue - this._start) / this._step;
+ return possibleIndex >= 0 &&
+ possibleIndex < this.size &&
+ possibleIndex === Math.floor(possibleIndex);
+ };
+
+ Range.prototype.slice = function(begin, end) {
+ if (wholeSlice(begin, end, this.size)) {
+ return this;
+ }
+ begin = resolveBegin(begin, this.size);
+ end = resolveEnd(end, this.size);
+ if (end <= begin) {
+ return new Range(0, 0);
+ }
+ return new Range(this.get(begin, this._end), this.get(end, this._end), this._step);
+ };
+
+ Range.prototype.indexOf = function(searchValue) {
+ var offsetValue = searchValue - this._start;
+ if (offsetValue % this._step === 0) {
+ var index = offsetValue / this._step;
+ if (index >= 0 && index < this.size) {
+ return index
+ }
+ }
+ return -1;
+ };
+
+ Range.prototype.lastIndexOf = function(searchValue) {
+ return this.indexOf(searchValue);
+ };
+
+ Range.prototype.__iterate = function(fn, reverse) {
+ var maxIndex = this.size - 1;
+ var step = this._step;
+ var value = reverse ? this._start + maxIndex * step : this._start;
+ for (var ii = 0; ii <= maxIndex; ii++) {
+ if (fn(value, ii, this) === false) {
+ return ii + 1;
+ }
+ value += reverse ? -step : step;
+ }
+ return ii;
+ };
+
+ Range.prototype.__iterator = function(type, reverse) {
+ var maxIndex = this.size - 1;
+ var step = this._step;
+ var value = reverse ? this._start + maxIndex * step : this._start;
+ var ii = 0;
+ return new Iterator(function() {
+ var v = value;
+ value += reverse ? -step : step;
+ return ii > maxIndex ? iteratorDone() : iteratorValue(type, ii++, v);
+ });
+ };
+
+ Range.prototype.equals = function(other) {
+ return other instanceof Range ?
+ this._start === other._start &&
+ this._end === other._end &&
+ this._step === other._step :
+ deepEqual(this, other);
+ };
+
+
+ var EMPTY_RANGE;
+
+ createClass(Collection, Iterable);
+ function Collection() {
+ throw TypeError('Abstract');
+ }
+
+
+ createClass(KeyedCollection, Collection);function KeyedCollection() {}
+
+ createClass(IndexedCollection, Collection);function IndexedCollection() {}
+
+ createClass(SetCollection, Collection);function SetCollection() {}
+
+
+ Collection.Keyed = KeyedCollection;
+ Collection.Indexed = IndexedCollection;
+ Collection.Set = SetCollection;
+
+ var imul =
+ typeof Math.imul === 'function' && Math.imul(0xffffffff, 2) === -2 ?
+ Math.imul :
+ function imul(a, b) {
+ a = a | 0; // int
+ b = b | 0; // int
+ var c = a & 0xffff;
+ var d = b & 0xffff;
+ // Shift by 0 fixes the sign on the high part.
+ return (c * d) + ((((a >>> 16) * d + c * (b >>> 16)) << 16) >>> 0) | 0; // int
+ };
+
+ // v8 has an optimization for storing 31-bit signed numbers.
+ // Values which have either 00 or 11 as the high order bits qualify.
+ // This function drops the highest order bit in a signed number, maintaining
+ // the sign bit.
+ function smi(i32) {
+ return ((i32 >>> 1) & 0x40000000) | (i32 & 0xBFFFFFFF);
+ }
+
+ function hash(o) {
+ if (o === false || o === null || o === undefined) {
+ return 0;
+ }
+ if (typeof o.valueOf === 'function') {
+ o = o.valueOf();
+ if (o === false || o === null || o === undefined) {
+ return 0;
+ }
+ }
+ if (o === true) {
+ return 1;
+ }
+ var type = typeof o;
+ if (type === 'number') {
+ if (o !== o || o === Infinity) {
+ return 0;
+ }
+ var h = o | 0;
+ if (h !== o) {
+ h ^= o * 0xFFFFFFFF;
+ }
+ while (o > 0xFFFFFFFF) {
+ o /= 0xFFFFFFFF;
+ h ^= o;
+ }
+ return smi(h);
+ }
+ if (type === 'string') {
+ return o.length > STRING_HASH_CACHE_MIN_STRLEN ? cachedHashString(o) : hashString(o);
+ }
+ if (typeof o.hashCode === 'function') {
+ return o.hashCode();
+ }
+ if (type === 'object') {
+ return hashJSObj(o);
+ }
+ if (typeof o.toString === 'function') {
+ return hashString(o.toString());
+ }
+ throw new Error('Value type ' + type + ' cannot be hashed.');
+ }
+
+ function cachedHashString(string) {
+ var hash = stringHashCache[string];
+ if (hash === undefined) {
+ hash = hashString(string);
+ if (STRING_HASH_CACHE_SIZE === STRING_HASH_CACHE_MAX_SIZE) {
+ STRING_HASH_CACHE_SIZE = 0;
+ stringHashCache = {};
+ }
+ STRING_HASH_CACHE_SIZE++;
+ stringHashCache[string] = hash;
+ }
+ return hash;
+ }
+
+ // http://jsperf.com/hashing-strings
+ function hashString(string) {
+ // This is the hash from JVM
+ // The hash code for a string is computed as
+ // s[0] * 31 ^ (n - 1) + s[1] * 31 ^ (n - 2) + ... + s[n - 1],
+ // where s[i] is the ith character of the string and n is the length of
+ // the string. We "mod" the result to make it between 0 (inclusive) and 2^31
+ // (exclusive) by dropping high bits.
+ var hash = 0;
+ for (var ii = 0; ii < string.length; ii++) {
+ hash = 31 * hash + string.charCodeAt(ii) | 0;
+ }
+ return smi(hash);
+ }
+
+ function hashJSObj(obj) {
+ var hash;
+ if (usingWeakMap) {
+ hash = weakMap.get(obj);
+ if (hash !== undefined) {
+ return hash;
+ }
+ }
+
+ hash = obj[UID_HASH_KEY];
+ if (hash !== undefined) {
+ return hash;
+ }
+
+ if (!canDefineProperty) {
+ hash = obj.propertyIsEnumerable && obj.propertyIsEnumerable[UID_HASH_KEY];
+ if (hash !== undefined) {
+ return hash;
+ }
+
+ hash = getIENodeHash(obj);
+ if (hash !== undefined) {
+ return hash;
+ }
+ }
+
+ hash = ++objHashUID;
+ if (objHashUID & 0x40000000) {
+ objHashUID = 0;
+ }
+
+ if (usingWeakMap) {
+ weakMap.set(obj, hash);
+ } else if (isExtensible !== undefined && isExtensible(obj) === false) {
+ throw new Error('Non-extensible objects are not allowed as keys.');
+ } else if (canDefineProperty) {
+ Object.defineProperty(obj, UID_HASH_KEY, {
+ 'enumerable': false,
+ 'configurable': false,
+ 'writable': false,
+ 'value': hash
+ });
+ } else if (obj.propertyIsEnumerable !== undefined &&
+ obj.propertyIsEnumerable === obj.constructor.prototype.propertyIsEnumerable) {
+ // Since we can't define a non-enumerable property on the object
+ // we'll hijack one of the less-used non-enumerable properties to
+ // save our hash on it. Since this is a function it will not show up in
+ // `JSON.stringify` which is what we want.
+ obj.propertyIsEnumerable = function() {
+ return this.constructor.prototype.propertyIsEnumerable.apply(this, arguments);
+ };
+ obj.propertyIsEnumerable[UID_HASH_KEY] = hash;
+ } else if (obj.nodeType !== undefined) {
+ // At this point we couldn't get the IE `uniqueID` to use as a hash
+ // and we couldn't use a non-enumerable property to exploit the
+ // dontEnum bug so we simply add the `UID_HASH_KEY` on the node
+ // itself.
+ obj[UID_HASH_KEY] = hash;
+ } else {
+ throw new Error('Unable to set a non-enumerable property on object.');
+ }
+
+ return hash;
+ }
+
+ // Get references to ES5 object methods.
+ var isExtensible = Object.isExtensible;
+
+ // True if Object.defineProperty works as expected. IE8 fails this test.
+ var canDefineProperty = (function() {
+ try {
+ Object.defineProperty({}, '@', {});
+ return true;
+ } catch (e) {
+ return false;
+ }
+ }());
+
+ // IE has a `uniqueID` property on DOM nodes. We can construct the hash from it
+ // and avoid memory leaks from the IE cloneNode bug.
+ function getIENodeHash(node) {
+ if (node && node.nodeType > 0) {
+ switch (node.nodeType) {
+ case 1: // Element
+ return node.uniqueID;
+ case 9: // Document
+ return node.documentElement && node.documentElement.uniqueID;
+ }
+ }
+ }
+
+ // If possible, use a WeakMap.
+ var usingWeakMap = typeof WeakMap === 'function';
+ var weakMap;
+ if (usingWeakMap) {
+ weakMap = new WeakMap();
+ }
+
+ var objHashUID = 0;
+
+ var UID_HASH_KEY = '__immutablehash__';
+ if (typeof Symbol === 'function') {
+ UID_HASH_KEY = Symbol(UID_HASH_KEY);
+ }
+
+ var STRING_HASH_CACHE_MIN_STRLEN = 16;
+ var STRING_HASH_CACHE_MAX_SIZE = 255;
+ var STRING_HASH_CACHE_SIZE = 0;
+ var stringHashCache = {};
+
+ function assertNotInfinite(size) {
+ invariant(
+ size !== Infinity,
+ 'Cannot perform this action with an infinite size.'
+ );
+ }
+
+ createClass(Map, KeyedCollection);
+
+ // @pragma Construction
+
+ function Map(value) {
+ return value === null || value === undefined ? emptyMap() :
+ isMap(value) && !isOrdered(value) ? value :
+ emptyMap().withMutations(function(map ) {
+ var iter = KeyedIterable(value);
+ assertNotInfinite(iter.size);
+ iter.forEach(function(v, k) {return map.set(k, v)});
+ });
+ }
+
+ Map.of = function() {var keyValues = SLICE$0.call(arguments, 0);
+ return emptyMap().withMutations(function(map ) {
+ for (var i = 0; i < keyValues.length; i += 2) {
+ if (i + 1 >= keyValues.length) {
+ throw new Error('Missing value for key: ' + keyValues[i]);
+ }
+ map.set(keyValues[i], keyValues[i + 1]);
+ }
+ });
+ };
+
+ Map.prototype.toString = function() {
+ return this.__toString('Map {', '}');
+ };
+
+ // @pragma Access
+
+ Map.prototype.get = function(k, notSetValue) {
+ return this._root ?
+ this._root.get(0, undefined, k, notSetValue) :
+ notSetValue;
+ };
+
+ // @pragma Modification
+
+ Map.prototype.set = function(k, v) {
+ return updateMap(this, k, v);
+ };
+
+ Map.prototype.setIn = function(keyPath, v) {
+ return this.updateIn(keyPath, NOT_SET, function() {return v});
+ };
+
+ Map.prototype.remove = function(k) {
+ return updateMap(this, k, NOT_SET);
+ };
+
+ Map.prototype.deleteIn = function(keyPath) {
+ return this.updateIn(keyPath, function() {return NOT_SET});
+ };
+
+ Map.prototype.update = function(k, notSetValue, updater) {
+ return arguments.length === 1 ?
+ k(this) :
+ this.updateIn([k], notSetValue, updater);
+ };
+
+ Map.prototype.updateIn = function(keyPath, notSetValue, updater) {
+ if (!updater) {
+ updater = notSetValue;
+ notSetValue = undefined;
+ }
+ var updatedValue = updateInDeepMap(
+ this,
+ forceIterator(keyPath),
+ notSetValue,
+ updater
+ );
+ return updatedValue === NOT_SET ? undefined : updatedValue;
+ };
+
+ Map.prototype.clear = function() {
+ if (this.size === 0) {
+ return this;
+ }
+ if (this.__ownerID) {
+ this.size = 0;
+ this._root = null;
+ this.__hash = undefined;
+ this.__altered = true;
+ return this;
+ }
+ return emptyMap();
+ };
+
+ // @pragma Composition
+
+ Map.prototype.merge = function(/*...iters*/) {
+ return mergeIntoMapWith(this, undefined, arguments);
+ };
+
+ Map.prototype.mergeWith = function(merger) {var iters = SLICE$0.call(arguments, 1);
+ return mergeIntoMapWith(this, merger, iters);
+ };
+
+ Map.prototype.mergeIn = function(keyPath) {var iters = SLICE$0.call(arguments, 1);
+ return this.updateIn(
+ keyPath,
+ emptyMap(),
+ function(m ) {return typeof m.merge === 'function' ?
+ m.merge.apply(m, iters) :
+ iters[iters.length - 1]}
+ );
+ };
+
+ Map.prototype.mergeDeep = function(/*...iters*/) {
+ return mergeIntoMapWith(this, deepMerger, arguments);
+ };
+
+ Map.prototype.mergeDeepWith = function(merger) {var iters = SLICE$0.call(arguments, 1);
+ return mergeIntoMapWith(this, deepMergerWith(merger), iters);
+ };
+
+ Map.prototype.mergeDeepIn = function(keyPath) {var iters = SLICE$0.call(arguments, 1);
+ return this.updateIn(
+ keyPath,
+ emptyMap(),
+ function(m ) {return typeof m.mergeDeep === 'function' ?
+ m.mergeDeep.apply(m, iters) :
+ iters[iters.length - 1]}
+ );
+ };
+
+ Map.prototype.sort = function(comparator) {
+ // Late binding
+ return OrderedMap(sortFactory(this, comparator));
+ };
+
+ Map.prototype.sortBy = function(mapper, comparator) {
+ // Late binding
+ return OrderedMap(sortFactory(this, comparator, mapper));
+ };
+
+ // @pragma Mutability
+
+ Map.prototype.withMutations = function(fn) {
+ var mutable = this.asMutable();
+ fn(mutable);
+ return mutable.wasAltered() ? mutable.__ensureOwner(this.__ownerID) : this;
+ };
+
+ Map.prototype.asMutable = function() {
+ return this.__ownerID ? this : this.__ensureOwner(new OwnerID());
+ };
+
+ Map.prototype.asImmutable = function() {
+ return this.__ensureOwner();
+ };
+
+ Map.prototype.wasAltered = function() {
+ return this.__altered;
+ };
+
+ Map.prototype.__iterator = function(type, reverse) {
+ return new MapIterator(this, type, reverse);
+ };
+
+ Map.prototype.__iterate = function(fn, reverse) {var this$0 = this;
+ var iterations = 0;
+ this._root && this._root.iterate(function(entry ) {
+ iterations++;
+ return fn(entry[1], entry[0], this$0);
+ }, reverse);
+ return iterations;
+ };
+
+ Map.prototype.__ensureOwner = function(ownerID) {
+ if (ownerID === this.__ownerID) {
+ return this;
+ }
+ if (!ownerID) {
+ this.__ownerID = ownerID;
+ this.__altered = false;
+ return this;
+ }
+ return makeMap(this.size, this._root, ownerID, this.__hash);
+ };
+
+
+ function isMap(maybeMap) {
+ return !!(maybeMap && maybeMap[IS_MAP_SENTINEL]);
+ }
+
+ Map.isMap = isMap;
+
+ var IS_MAP_SENTINEL = '@@__IMMUTABLE_MAP__@@';
+
+ var MapPrototype = Map.prototype;
+ MapPrototype[IS_MAP_SENTINEL] = true;
+ MapPrototype[DELETE] = MapPrototype.remove;
+ MapPrototype.removeIn = MapPrototype.deleteIn;
+
+
+ // #pragma Trie Nodes
+
+
+
+ function ArrayMapNode(ownerID, entries) {
+ this.ownerID = ownerID;
+ this.entries = entries;
+ }
+
+ ArrayMapNode.prototype.get = function(shift, keyHash, key, notSetValue) {
+ var entries = this.entries;
+ for (var ii = 0, len = entries.length; ii < len; ii++) {
+ if (is(key, entries[ii][0])) {
+ return entries[ii][1];
+ }
+ }
+ return notSetValue;
+ };
+
+ ArrayMapNode.prototype.update = function(ownerID, shift, keyHash, key, value, didChangeSize, didAlter) {
+ var removed = value === NOT_SET;
+
+ var entries = this.entries;
+ var idx = 0;
+ for (var len = entries.length; idx < len; idx++) {
+ if (is(key, entries[idx][0])) {
+ break;
+ }
+ }
+ var exists = idx < len;
+
+ if (exists ? entries[idx][1] === value : removed) {
+ return this;
+ }
+
+ SetRef(didAlter);
+ (removed || !exists) && SetRef(didChangeSize);
+
+ if (removed && entries.length === 1) {
+ return; // undefined
+ }
+
+ if (!exists && !removed && entries.length >= MAX_ARRAY_MAP_SIZE) {
+ return createNodes(ownerID, entries, key, value);
+ }
+
+ var isEditable = ownerID && ownerID === this.ownerID;
+ var newEntries = isEditable ? entries : arrCopy(entries);
+
+ if (exists) {
+ if (removed) {
+ idx === len - 1 ? newEntries.pop() : (newEntries[idx] = newEntries.pop());
+ } else {
+ newEntries[idx] = [key, value];
+ }
+ } else {
+ newEntries.push([key, value]);
+ }
+
+ if (isEditable) {
+ this.entries = newEntries;
+ return this;
+ }
+
+ return new ArrayMapNode(ownerID, newEntries);
+ };
+
+
+
+
+ function BitmapIndexedNode(ownerID, bitmap, nodes) {
+ this.ownerID = ownerID;
+ this.bitmap = bitmap;
+ this.nodes = nodes;
+ }
+
+ BitmapIndexedNode.prototype.get = function(shift, keyHash, key, notSetValue) {
+ if (keyHash === undefined) {
+ keyHash = hash(key);
+ }
+ var bit = (1 << ((shift === 0 ? keyHash : keyHash >>> shift) & MASK));
+ var bitmap = this.bitmap;
+ return (bitmap & bit) === 0 ? notSetValue :
+ this.nodes[popCount(bitmap & (bit - 1))].get(shift + SHIFT, keyHash, key, notSetValue);
+ };
+
+ BitmapIndexedNode.prototype.update = function(ownerID, shift, keyHash, key, value, didChangeSize, didAlter) {
+ if (keyHash === undefined) {
+ keyHash = hash(key);
+ }
+ var keyHashFrag = (shift === 0 ? keyHash : keyHash >>> shift) & MASK;
+ var bit = 1 << keyHashFrag;
+ var bitmap = this.bitmap;
+ var exists = (bitmap & bit) !== 0;
+
+ if (!exists && value === NOT_SET) {
+ return this;
+ }
+
+ var idx = popCount(bitmap & (bit - 1));
+ var nodes = this.nodes;
+ var node = exists ? nodes[idx] : undefined;
+ var newNode = updateNode(node, ownerID, shift + SHIFT, keyHash, key, value, didChangeSize, didAlter);
+
+ if (newNode === node) {
+ return this;
+ }
+
+ if (!exists && newNode && nodes.length >= MAX_BITMAP_INDEXED_SIZE) {
+ return expandNodes(ownerID, nodes, bitmap, keyHashFrag, newNode);
+ }
+
+ if (exists && !newNode && nodes.length === 2 && isLeafNode(nodes[idx ^ 1])) {
+ return nodes[idx ^ 1];
+ }
+
+ if (exists && newNode && nodes.length === 1 && isLeafNode(newNode)) {
+ return newNode;
+ }
+
+ var isEditable = ownerID && ownerID === this.ownerID;
+ var newBitmap = exists ? newNode ? bitmap : bitmap ^ bit : bitmap | bit;
+ var newNodes = exists ? newNode ?
+ setIn(nodes, idx, newNode, isEditable) :
+ spliceOut(nodes, idx, isEditable) :
+ spliceIn(nodes, idx, newNode, isEditable);
+
+ if (isEditable) {
+ this.bitmap = newBitmap;
+ this.nodes = newNodes;
+ return this;
+ }
+
+ return new BitmapIndexedNode(ownerID, newBitmap, newNodes);
+ };
+
+
+
+
+ function HashArrayMapNode(ownerID, count, nodes) {
+ this.ownerID = ownerID;
+ this.count = count;
+ this.nodes = nodes;
+ }
+
+ HashArrayMapNode.prototype.get = function(shift, keyHash, key, notSetValue) {
+ if (keyHash === undefined) {
+ keyHash = hash(key);
+ }
+ var idx = (shift === 0 ? keyHash : keyHash >>> shift) & MASK;
+ var node = this.nodes[idx];
+ return node ? node.get(shift + SHIFT, keyHash, key, notSetValue) : notSetValue;
+ };
+
+ HashArrayMapNode.prototype.update = function(ownerID, shift, keyHash, key, value, didChangeSize, didAlter) {
+ if (keyHash === undefined) {
+ keyHash = hash(key);
+ }
+ var idx = (shift === 0 ? keyHash : keyHash >>> shift) & MASK;
+ var removed = value === NOT_SET;
+ var nodes = this.nodes;
+ var node = nodes[idx];
+
+ if (removed && !node) {
+ return this;
+ }
+
+ var newNode = updateNode(node, ownerID, shift + SHIFT, keyHash, key, value, didChangeSize, didAlter);
+ if (newNode === node) {
+ return this;
+ }
+
+ var newCount = this.count;
+ if (!node) {
+ newCount++;
+ } else if (!newNode) {
+ newCount--;
+ if (newCount < MIN_HASH_ARRAY_MAP_SIZE) {
+ return packNodes(ownerID, nodes, newCount, idx);
+ }
+ }
+
+ var isEditable = ownerID && ownerID === this.ownerID;
+ var newNodes = setIn(nodes, idx, newNode, isEditable);
+
+ if (isEditable) {
+ this.count = newCount;
+ this.nodes = newNodes;
+ return this;
+ }
+
+ return new HashArrayMapNode(ownerID, newCount, newNodes);
+ };
+
+
+
+
+ function HashCollisionNode(ownerID, keyHash, entries) {
+ this.ownerID = ownerID;
+ this.keyHash = keyHash;
+ this.entries = entries;
+ }
+
+ HashCollisionNode.prototype.get = function(shift, keyHash, key, notSetValue) {
+ var entries = this.entries;
+ for (var ii = 0, len = entries.length; ii < len; ii++) {
+ if (is(key, entries[ii][0])) {
+ return entries[ii][1];
+ }
+ }
+ return notSetValue;
+ };
+
+ HashCollisionNode.prototype.update = function(ownerID, shift, keyHash, key, value, didChangeSize, didAlter) {
+ if (keyHash === undefined) {
+ keyHash = hash(key);
+ }
+
+ var removed = value === NOT_SET;
+
+ if (keyHash !== this.keyHash) {
+ if (removed) {
+ return this;
+ }
+ SetRef(didAlter);
+ SetRef(didChangeSize);
+ return mergeIntoNode(this, ownerID, shift, keyHash, [key, value]);
+ }
+
+ var entries = this.entries;
+ var idx = 0;
+ for (var len = entries.length; idx < len; idx++) {
+ if (is(key, entries[idx][0])) {
+ break;
+ }
+ }
+ var exists = idx < len;
+
+ if (exists ? entries[idx][1] === value : removed) {
+ return this;
+ }
+
+ SetRef(didAlter);
+ (removed || !exists) && SetRef(didChangeSize);
+
+ if (removed && len === 2) {
+ return new ValueNode(ownerID, this.keyHash, entries[idx ^ 1]);
+ }
+
+ var isEditable = ownerID && ownerID === this.ownerID;
+ var newEntries = isEditable ? entries : arrCopy(entries);
+
+ if (exists) {
+ if (removed) {
+ idx === len - 1 ? newEntries.pop() : (newEntries[idx] = newEntries.pop());
+ } else {
+ newEntries[idx] = [key, value];
+ }
+ } else {
+ newEntries.push([key, value]);
+ }
+
+ if (isEditable) {
+ this.entries = newEntries;
+ return this;
+ }
+
+ return new HashCollisionNode(ownerID, this.keyHash, newEntries);
+ };
+
+
+
+
+ function ValueNode(ownerID, keyHash, entry) {
+ this.ownerID = ownerID;
+ this.keyHash = keyHash;
+ this.entry = entry;
+ }
+
+ ValueNode.prototype.get = function(shift, keyHash, key, notSetValue) {
+ return is(key, this.entry[0]) ? this.entry[1] : notSetValue;
+ };
+
+ ValueNode.prototype.update = function(ownerID, shift, keyHash, key, value, didChangeSize, didAlter) {
+ var removed = value === NOT_SET;
+ var keyMatch = is(key, this.entry[0]);
+ if (keyMatch ? value === this.entry[1] : removed) {
+ return this;
+ }
+
+ SetRef(didAlter);
+
+ if (removed) {
+ SetRef(didChangeSize);
+ return; // undefined
+ }
+
+ if (keyMatch) {
+ if (ownerID && ownerID === this.ownerID) {
+ this.entry[1] = value;
+ return this;
+ }
+ return new ValueNode(ownerID, this.keyHash, [key, value]);
+ }
+
+ SetRef(didChangeSize);
+ return mergeIntoNode(this, ownerID, shift, hash(key), [key, value]);
+ };
+
+
+
+ // #pragma Iterators
+
+ ArrayMapNode.prototype.iterate =
+ HashCollisionNode.prototype.iterate = function (fn, reverse) {
+ var entries = this.entries;
+ for (var ii = 0, maxIndex = entries.length - 1; ii <= maxIndex; ii++) {
+ if (fn(entries[reverse ? maxIndex - ii : ii]) === false) {
+ return false;
+ }
+ }
+ }
+
+ BitmapIndexedNode.prototype.iterate =
+ HashArrayMapNode.prototype.iterate = function (fn, reverse) {
+ var nodes = this.nodes;
+ for (var ii = 0, maxIndex = nodes.length - 1; ii <= maxIndex; ii++) {
+ var node = nodes[reverse ? maxIndex - ii : ii];
+ if (node && node.iterate(fn, reverse) === false) {
+ return false;
+ }
+ }
+ }
+
+ ValueNode.prototype.iterate = function (fn, reverse) {
+ return fn(this.entry);
+ }
+
+ createClass(MapIterator, Iterator);
+
+ function MapIterator(map, type, reverse) {
+ this._type = type;
+ this._reverse = reverse;
+ this._stack = map._root && mapIteratorFrame(map._root);
+ }
+
+ MapIterator.prototype.next = function() {
+ var type = this._type;
+ var stack = this._stack;
+ while (stack) {
+ var node = stack.node;
+ var index = stack.index++;
+ var maxIndex;
+ if (node.entry) {
+ if (index === 0) {
+ return mapIteratorValue(type, node.entry);
+ }
+ } else if (node.entries) {
+ maxIndex = node.entries.length - 1;
+ if (index <= maxIndex) {
+ return mapIteratorValue(type, node.entries[this._reverse ? maxIndex - index : index]);
+ }
+ } else {
+ maxIndex = node.nodes.length - 1;
+ if (index <= maxIndex) {
+ var subNode = node.nodes[this._reverse ? maxIndex - index : index];
+ if (subNode) {
+ if (subNode.entry) {
+ return mapIteratorValue(type, subNode.entry);
+ }
+ stack = this._stack = mapIteratorFrame(subNode, stack);
+ }
+ continue;
+ }
+ }
+ stack = this._stack = this._stack.__prev;
+ }
+ return iteratorDone();
+ };
+
+
+ function mapIteratorValue(type, entry) {
+ return iteratorValue(type, entry[0], entry[1]);
+ }
+
+ function mapIteratorFrame(node, prev) {
+ return {
+ node: node,
+ index: 0,
+ __prev: prev
+ };
+ }
+
+ function makeMap(size, root, ownerID, hash) {
+ var map = Object.create(MapPrototype);
+ map.size = size;
+ map._root = root;
+ map.__ownerID = ownerID;
+ map.__hash = hash;
+ map.__altered = false;
+ return map;
+ }
+
+ var EMPTY_MAP;
+ function emptyMap() {
+ return EMPTY_MAP || (EMPTY_MAP = makeMap(0));
+ }
+
+ function updateMap(map, k, v) {
+ var newRoot;
+ var newSize;
+ if (!map._root) {
+ if (v === NOT_SET) {
+ return map;
+ }
+ newSize = 1;
+ newRoot = new ArrayMapNode(map.__ownerID, [[k, v]]);
+ } else {
+ var didChangeSize = MakeRef(CHANGE_LENGTH);
+ var didAlter = MakeRef(DID_ALTER);
+ newRoot = updateNode(map._root, map.__ownerID, 0, undefined, k, v, didChangeSize, didAlter);
+ if (!didAlter.value) {
+ return map;
+ }
+ newSize = map.size + (didChangeSize.value ? v === NOT_SET ? -1 : 1 : 0);
+ }
+ if (map.__ownerID) {
+ map.size = newSize;
+ map._root = newRoot;
+ map.__hash = undefined;
+ map.__altered = true;
+ return map;
+ }
+ return newRoot ? makeMap(newSize, newRoot) : emptyMap();
+ }
+
+ function updateNode(node, ownerID, shift, keyHash, key, value, didChangeSize, didAlter) {
+ if (!node) {
+ if (value === NOT_SET) {
+ return node;
+ }
+ SetRef(didAlter);
+ SetRef(didChangeSize);
+ return new ValueNode(ownerID, keyHash, [key, value]);
+ }
+ return node.update(ownerID, shift, keyHash, key, value, didChangeSize, didAlter);
+ }
+
+ function isLeafNode(node) {
+ return node.constructor === ValueNode || node.constructor === HashCollisionNode;
+ }
+
+ function mergeIntoNode(node, ownerID, shift, keyHash, entry) {
+ if (node.keyHash === keyHash) {
+ return new HashCollisionNode(ownerID, keyHash, [node.entry, entry]);
+ }
+
+ var idx1 = (shift === 0 ? node.keyHash : node.keyHash >>> shift) & MASK;
+ var idx2 = (shift === 0 ? keyHash : keyHash >>> shift) & MASK;
+
+ var newNode;
+ var nodes = idx1 === idx2 ?
+ [mergeIntoNode(node, ownerID, shift + SHIFT, keyHash, entry)] :
+ ((newNode = new ValueNode(ownerID, keyHash, entry)), idx1 < idx2 ? [node, newNode] : [newNode, node]);
+
+ return new BitmapIndexedNode(ownerID, (1 << idx1) | (1 << idx2), nodes);
+ }
+
+ function createNodes(ownerID, entries, key, value) {
+ if (!ownerID) {
+ ownerID = new OwnerID();
+ }
+ var node = new ValueNode(ownerID, hash(key), [key, value]);
+ for (var ii = 0; ii < entries.length; ii++) {
+ var entry = entries[ii];
+ node = node.update(ownerID, 0, undefined, entry[0], entry[1]);
+ }
+ return node;
+ }
+
+ function packNodes(ownerID, nodes, count, excluding) {
+ var bitmap = 0;
+ var packedII = 0;
+ var packedNodes = new Array(count);
+ for (var ii = 0, bit = 1, len = nodes.length; ii < len; ii++, bit <<= 1) {
+ var node = nodes[ii];
+ if (node !== undefined && ii !== excluding) {
+ bitmap |= bit;
+ packedNodes[packedII++] = node;
+ }
+ }
+ return new BitmapIndexedNode(ownerID, bitmap, packedNodes);
+ }
+
+ function expandNodes(ownerID, nodes, bitmap, including, node) {
+ var count = 0;
+ var expandedNodes = new Array(SIZE);
+ for (var ii = 0; bitmap !== 0; ii++, bitmap >>>= 1) {
+ expandedNodes[ii] = bitmap & 1 ? nodes[count++] : undefined;
+ }
+ expandedNodes[including] = node;
+ return new HashArrayMapNode(ownerID, count + 1, expandedNodes);
+ }
+
+ function mergeIntoMapWith(map, merger, iterables) {
+ var iters = [];
+ for (var ii = 0; ii < iterables.length; ii++) {
+ var value = iterables[ii];
+ var iter = KeyedIterable(value);
+ if (!isIterable(value)) {
+ iter = iter.map(function(v ) {return fromJS(v)});
+ }
+ iters.push(iter);
+ }
+ return mergeIntoCollectionWith(map, merger, iters);
+ }
+
+ function deepMerger(existing, value, key) {
+ return existing && existing.mergeDeep && isIterable(value) ?
+ existing.mergeDeep(value) :
+ is(existing, value) ? existing : value;
+ }
+
+ function deepMergerWith(merger) {
+ return function(existing, value, key) {
+ if (existing && existing.mergeDeepWith && isIterable(value)) {
+ return existing.mergeDeepWith(merger, value);
+ }
+ var nextValue = merger(existing, value, key);
+ return is(existing, nextValue) ? existing : nextValue;
+ };
+ }
+
+ function mergeIntoCollectionWith(collection, merger, iters) {
+ iters = iters.filter(function(x ) {return x.size !== 0});
+ if (iters.length === 0) {
+ return collection;
+ }
+ if (collection.size === 0 && !collection.__ownerID && iters.length === 1) {
+ return collection.constructor(iters[0]);
+ }
+ return collection.withMutations(function(collection ) {
+ var mergeIntoMap = merger ?
+ function(value, key) {
+ collection.update(key, NOT_SET, function(existing )
+ {return existing === NOT_SET ? value : merger(existing, value, key)}
+ );
+ } :
+ function(value, key) {
+ collection.set(key, value);
+ }
+ for (var ii = 0; ii < iters.length; ii++) {
+ iters[ii].forEach(mergeIntoMap);
+ }
+ });
+ }
+
+ function updateInDeepMap(existing, keyPathIter, notSetValue, updater) {
+ var isNotSet = existing === NOT_SET;
+ var step = keyPathIter.next();
+ if (step.done) {
+ var existingValue = isNotSet ? notSetValue : existing;
+ var newValue = updater(existingValue);
+ return newValue === existingValue ? existing : newValue;
+ }
+ invariant(
+ isNotSet || (existing && existing.set),
+ 'invalid keyPath'
+ );
+ var key = step.value;
+ var nextExisting = isNotSet ? NOT_SET : existing.get(key, NOT_SET);
+ var nextUpdated = updateInDeepMap(
+ nextExisting,
+ keyPathIter,
+ notSetValue,
+ updater
+ );
+ return nextUpdated === nextExisting ? existing :
+ nextUpdated === NOT_SET ? existing.remove(key) :
+ (isNotSet ? emptyMap() : existing).set(key, nextUpdated);
+ }
+
+ function popCount(x) {
+ x = x - ((x >> 1) & 0x55555555);
+ x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
+ x = (x + (x >> 4)) & 0x0f0f0f0f;
+ x = x + (x >> 8);
+ x = x + (x >> 16);
+ return x & 0x7f;
+ }
+
+ function setIn(array, idx, val, canEdit) {
+ var newArray = canEdit ? array : arrCopy(array);
+ newArray[idx] = val;
+ return newArray;
+ }
+
+ function spliceIn(array, idx, val, canEdit) {
+ var newLen = array.length + 1;
+ if (canEdit && idx + 1 === newLen) {
+ array[idx] = val;
+ return array;
+ }
+ var newArray = new Array(newLen);
+ var after = 0;
+ for (var ii = 0; ii < newLen; ii++) {
+ if (ii === idx) {
+ newArray[ii] = val;
+ after = -1;
+ } else {
+ newArray[ii] = array[ii + after];
+ }
+ }
+ return newArray;
+ }
+
+ function spliceOut(array, idx, canEdit) {
+ var newLen = array.length - 1;
+ if (canEdit && idx === newLen) {
+ array.pop();
+ return array;
+ }
+ var newArray = new Array(newLen);
+ var after = 0;
+ for (var ii = 0; ii < newLen; ii++) {
+ if (ii === idx) {
+ after = 1;
+ }
+ newArray[ii] = array[ii + after];
+ }
+ return newArray;
+ }
+
+ var MAX_ARRAY_MAP_SIZE = SIZE / 4;
+ var MAX_BITMAP_INDEXED_SIZE = SIZE / 2;
+ var MIN_HASH_ARRAY_MAP_SIZE = SIZE / 4;
+
+ createClass(List, IndexedCollection);
+
+ // @pragma Construction
+
+ function List(value) {
+ var empty = emptyList();
+ if (value === null || value === undefined) {
+ return empty;
+ }
+ if (isList(value)) {
+ return value;
+ }
+ var iter = IndexedIterable(value);
+ var size = iter.size;
+ if (size === 0) {
+ return empty;
+ }
+ assertNotInfinite(size);
+ if (size > 0 && size < SIZE) {
+ return makeList(0, size, SHIFT, null, new VNode(iter.toArray()));
+ }
+ return empty.withMutations(function(list ) {
+ list.setSize(size);
+ iter.forEach(function(v, i) {return list.set(i, v)});
+ });
+ }
+
+ List.of = function(/*...values*/) {
+ return this(arguments);
+ };
+
+ List.prototype.toString = function() {
+ return this.__toString('List [', ']');
+ };
+
+ // @pragma Access
+
+ List.prototype.get = function(index, notSetValue) {
+ index = wrapIndex(this, index);
+ if (index >= 0 && index < this.size) {
+ index += this._origin;
+ var node = listNodeFor(this, index);
+ return node && node.array[index & MASK];
+ }
+ return notSetValue;
+ };
+
+ // @pragma Modification
+
+ List.prototype.set = function(index, value) {
+ return updateList(this, index, value);
+ };
+
+ List.prototype.remove = function(index) {
+ return !this.has(index) ? this :
+ index === 0 ? this.shift() :
+ index === this.size - 1 ? this.pop() :
+ this.splice(index, 1);
+ };
+
+ List.prototype.insert = function(index, value) {
+ return this.splice(index, 0, value);
+ };
+
+ List.prototype.clear = function() {
+ if (this.size === 0) {
+ return this;
+ }
+ if (this.__ownerID) {
+ this.size = this._origin = this._capacity = 0;
+ this._level = SHIFT;
+ this._root = this._tail = null;
+ this.__hash = undefined;
+ this.__altered = true;
+ return this;
+ }
+ return emptyList();
+ };
+
+ List.prototype.push = function(/*...values*/) {
+ var values = arguments;
+ var oldSize = this.size;
+ return this.withMutations(function(list ) {
+ setListBounds(list, 0, oldSize + values.length);
+ for (var ii = 0; ii < values.length; ii++) {
+ list.set(oldSize + ii, values[ii]);
+ }
+ });
+ };
+
+ List.prototype.pop = function() {
+ return setListBounds(this, 0, -1);
+ };
+
+ List.prototype.unshift = function(/*...values*/) {
+ var values = arguments;
+ return this.withMutations(function(list ) {
+ setListBounds(list, -values.length);
+ for (var ii = 0; ii < values.length; ii++) {
+ list.set(ii, values[ii]);
+ }
+ });
+ };
+
+ List.prototype.shift = function() {
+ return setListBounds(this, 1);
+ };
+
+ // @pragma Composition
+
+ List.prototype.merge = function(/*...iters*/) {
+ return mergeIntoListWith(this, undefined, arguments);
+ };
+
+ List.prototype.mergeWith = function(merger) {var iters = SLICE$0.call(arguments, 1);
+ return mergeIntoListWith(this, merger, iters);
+ };
+
+ List.prototype.mergeDeep = function(/*...iters*/) {
+ return mergeIntoListWith(this, deepMerger, arguments);
+ };
+
+ List.prototype.mergeDeepWith = function(merger) {var iters = SLICE$0.call(arguments, 1);
+ return mergeIntoListWith(this, deepMergerWith(merger), iters);
+ };
+
+ List.prototype.setSize = function(size) {
+ return setListBounds(this, 0, size);
+ };
+
+ // @pragma Iteration
+
+ List.prototype.slice = function(begin, end) {
+ var size = this.size;
+ if (wholeSlice(begin, end, size)) {
+ return this;
+ }
+ return setListBounds(
+ this,
+ resolveBegin(begin, size),
+ resolveEnd(end, size)
+ );
+ };
+
+ List.prototype.__iterator = function(type, reverse) {
+ var index = 0;
+ var values = iterateList(this, reverse);
+ return new Iterator(function() {
+ var value = values();
+ return value === DONE ?
+ iteratorDone() :
+ iteratorValue(type, index++, value);
+ });
+ };
+
+ List.prototype.__iterate = function(fn, reverse) {
+ var index = 0;
+ var values = iterateList(this, reverse);
+ var value;
+ while ((value = values()) !== DONE) {
+ if (fn(value, index++, this) === false) {
+ break;
+ }
+ }
+ return index;
+ };
+
+ List.prototype.__ensureOwner = function(ownerID) {
+ if (ownerID === this.__ownerID) {
+ return this;
+ }
+ if (!ownerID) {
+ this.__ownerID = ownerID;
+ return this;
+ }
+ return makeList(this._origin, this._capacity, this._level, this._root, this._tail, ownerID, this.__hash);
+ };
+
+
+ function isList(maybeList) {
+ return !!(maybeList && maybeList[IS_LIST_SENTINEL]);
+ }
+
+ List.isList = isList;
+
+ var IS_LIST_SENTINEL = '@@__IMMUTABLE_LIST__@@';
+
+ var ListPrototype = List.prototype;
+ ListPrototype[IS_LIST_SENTINEL] = true;
+ ListPrototype[DELETE] = ListPrototype.remove;
+ ListPrototype.setIn = MapPrototype.setIn;
+ ListPrototype.deleteIn =
+ ListPrototype.removeIn = MapPrototype.removeIn;
+ ListPrototype.update = MapPrototype.update;
+ ListPrototype.updateIn = MapPrototype.updateIn;
+ ListPrototype.mergeIn = MapPrototype.mergeIn;
+ ListPrototype.mergeDeepIn = MapPrototype.mergeDeepIn;
+ ListPrototype.withMutations = MapPrototype.withMutations;
+ ListPrototype.asMutable = MapPrototype.asMutable;
+ ListPrototype.asImmutable = MapPrototype.asImmutable;
+ ListPrototype.wasAltered = MapPrototype.wasAltered;
+
+
+
+ function VNode(array, ownerID) {
+ this.array = array;
+ this.ownerID = ownerID;
+ }
+
+ // TODO: seems like these methods are very similar
+
+ VNode.prototype.removeBefore = function(ownerID, level, index) {
+ if (index === level ? 1 << level : 0 || this.array.length === 0) {
+ return this;
+ }
+ var originIndex = (index >>> level) & MASK;
+ if (originIndex >= this.array.length) {
+ return new VNode([], ownerID);
+ }
+ var removingFirst = originIndex === 0;
+ var newChild;
+ if (level > 0) {
+ var oldChild = this.array[originIndex];
+ newChild = oldChild && oldChild.removeBefore(ownerID, level - SHIFT, index);
+ if (newChild === oldChild && removingFirst) {
+ return this;
+ }
+ }
+ if (removingFirst && !newChild) {
+ return this;
+ }
+ var editable = editableVNode(this, ownerID);
+ if (!removingFirst) {
+ for (var ii = 0; ii < originIndex; ii++) {
+ editable.array[ii] = undefined;
+ }
+ }
+ if (newChild) {
+ editable.array[originIndex] = newChild;
+ }
+ return editable;
+ };
+
+ VNode.prototype.removeAfter = function(ownerID, level, index) {
+ if (index === (level ? 1 << level : 0) || this.array.length === 0) {
+ return this;
+ }
+ var sizeIndex = ((index - 1) >>> level) & MASK;
+ if (sizeIndex >= this.array.length) {
+ return this;
+ }
+
+ var newChild;
+ if (level > 0) {
+ var oldChild = this.array[sizeIndex];
+ newChild = oldChild && oldChild.removeAfter(ownerID, level - SHIFT, index);
+ if (newChild === oldChild && sizeIndex === this.array.length - 1) {
+ return this;
+ }
+ }
+
+ var editable = editableVNode(this, ownerID);
+ editable.array.splice(sizeIndex + 1);
+ if (newChild) {
+ editable.array[sizeIndex] = newChild;
+ }
+ return editable;
+ };
+
+
+
+ var DONE = {};
+
+ function iterateList(list, reverse) {
+ var left = list._origin;
+ var right = list._capacity;
+ var tailPos = getTailOffset(right);
+ var tail = list._tail;
+
+ return iterateNodeOrLeaf(list._root, list._level, 0);
+
+ function iterateNodeOrLeaf(node, level, offset) {
+ return level === 0 ?
+ iterateLeaf(node, offset) :
+ iterateNode(node, level, offset);
+ }
+
+ function iterateLeaf(node, offset) {
+ var array = offset === tailPos ? tail && tail.array : node && node.array;
+ var from = offset > left ? 0 : left - offset;
+ var to = right - offset;
+ if (to > SIZE) {
+ to = SIZE;
+ }
+ return function() {
+ if (from === to) {
+ return DONE;
+ }
+ var idx = reverse ? --to : from++;
+ return array && array[idx];
+ };
+ }
+
+ function iterateNode(node, level, offset) {
+ var values;
+ var array = node && node.array;
+ var from = offset > left ? 0 : (left - offset) >> level;
+ var to = ((right - offset) >> level) + 1;
+ if (to > SIZE) {
+ to = SIZE;
+ }
+ return function() {
+ do {
+ if (values) {
+ var value = values();
+ if (value !== DONE) {
+ return value;
+ }
+ values = null;
+ }
+ if (from === to) {
+ return DONE;
+ }
+ var idx = reverse ? --to : from++;
+ values = iterateNodeOrLeaf(
+ array && array[idx], level - SHIFT, offset + (idx << level)
+ );
+ } while (true);
+ };
+ }
+ }
+
+ function makeList(origin, capacity, level, root, tail, ownerID, hash) {
+ var list = Object.create(ListPrototype);
+ list.size = capacity - origin;
+ list._origin = origin;
+ list._capacity = capacity;
+ list._level = level;
+ list._root = root;
+ list._tail = tail;
+ list.__ownerID = ownerID;
+ list.__hash = hash;
+ list.__altered = false;
+ return list;
+ }
+
+ var EMPTY_LIST;
+ function emptyList() {
+ return EMPTY_LIST || (EMPTY_LIST = makeList(0, 0, SHIFT));
+ }
+
+ function updateList(list, index, value) {
+ index = wrapIndex(list, index);
+
+ if (index !== index) {
+ return list;
+ }
+
+ if (index >= list.size || index < 0) {
+ return list.withMutations(function(list ) {
+ index < 0 ?
+ setListBounds(list, index).set(0, value) :
+ setListBounds(list, 0, index + 1).set(index, value)
+ });
+ }
+
+ index += list._origin;
+
+ var newTail = list._tail;
+ var newRoot = list._root;
+ var didAlter = MakeRef(DID_ALTER);
+ if (index >= getTailOffset(list._capacity)) {
+ newTail = updateVNode(newTail, list.__ownerID, 0, index, value, didAlter);
+ } else {
+ newRoot = updateVNode(newRoot, list.__ownerID, list._level, index, value, didAlter);
+ }
+
+ if (!didAlter.value) {
+ return list;
+ }
+
+ if (list.__ownerID) {
+ list._root = newRoot;
+ list._tail = newTail;
+ list.__hash = undefined;
+ list.__altered = true;
+ return list;
+ }
+ return makeList(list._origin, list._capacity, list._level, newRoot, newTail);
+ }
+
+ function updateVNode(node, ownerID, level, index, value, didAlter) {
+ var idx = (index >>> level) & MASK;
+ var nodeHas = node && idx < node.array.length;
+ if (!nodeHas && value === undefined) {
+ return node;
+ }
+
+ var newNode;
+
+ if (level > 0) {
+ var lowerNode = node && node.array[idx];
+ var newLowerNode = updateVNode(lowerNode, ownerID, level - SHIFT, index, value, didAlter);
+ if (newLowerNode === lowerNode) {
+ return node;
+ }
+ newNode = editableVNode(node, ownerID);
+ newNode.array[idx] = newLowerNode;
+ return newNode;
+ }
+
+ if (nodeHas && node.array[idx] === value) {
+ return node;
+ }
+
+ SetRef(didAlter);
+
+ newNode = editableVNode(node, ownerID);
+ if (value === undefined && idx === newNode.array.length - 1) {
+ newNode.array.pop();
+ } else {
+ newNode.array[idx] = value;
+ }
+ return newNode;
+ }
+
+ function editableVNode(node, ownerID) {
+ if (ownerID && node && ownerID === node.ownerID) {
+ return node;
+ }
+ return new VNode(node ? node.array.slice() : [], ownerID);
+ }
+
+ function listNodeFor(list, rawIndex) {
+ if (rawIndex >= getTailOffset(list._capacity)) {
+ return list._tail;
+ }
+ if (rawIndex < 1 << (list._level + SHIFT)) {
+ var node = list._root;
+ var level = list._level;
+ while (node && level > 0) {
+ node = node.array[(rawIndex >>> level) & MASK];
+ level -= SHIFT;
+ }
+ return node;
+ }
+ }
+
+ function setListBounds(list, begin, end) {
+ // Sanitize begin & end using this shorthand for ToInt32(argument)
+ // http://www.ecma-international.org/ecma-262/6.0/#sec-toint32
+ if (begin !== undefined) {
+ begin = begin | 0;
+ }
+ if (end !== undefined) {
+ end = end | 0;
+ }
+ var owner = list.__ownerID || new OwnerID();
+ var oldOrigin = list._origin;
+ var oldCapacity = list._capacity;
+ var newOrigin = oldOrigin + begin;
+ var newCapacity = end === undefined ? oldCapacity : end < 0 ? oldCapacity + end : oldOrigin + end;
+ if (newOrigin === oldOrigin && newCapacity === oldCapacity) {
+ return list;
+ }
+
+ // If it's going to end after it starts, it's empty.
+ if (newOrigin >= newCapacity) {
+ return list.clear();
+ }
+
+ var newLevel = list._level;
+ var newRoot = list._root;
+
+ // New origin might need creating a higher root.
+ var offsetShift = 0;
+ while (newOrigin + offsetShift < 0) {
+ newRoot = new VNode(newRoot && newRoot.array.length ? [undefined, newRoot] : [], owner);
+ newLevel += SHIFT;
+ offsetShift += 1 << newLevel;
+ }
+ if (offsetShift) {
+ newOrigin += offsetShift;
+ oldOrigin += offsetShift;
+ newCapacity += offsetShift;
+ oldCapacity += offsetShift;
+ }
+
+ var oldTailOffset = getTailOffset(oldCapacity);
+ var newTailOffset = getTailOffset(newCapacity);
+
+ // New size might need creating a higher root.
+ while (newTailOffset >= 1 << (newLevel + SHIFT)) {
+ newRoot = new VNode(newRoot && newRoot.array.length ? [newRoot] : [], owner);
+ newLevel += SHIFT;
+ }
+
+ // Locate or create the new tail.
+ var oldTail = list._tail;
+ var newTail = newTailOffset < oldTailOffset ?
+ listNodeFor(list, newCapacity - 1) :
+ newTailOffset > oldTailOffset ? new VNode([], owner) : oldTail;
+
+ // Merge Tail into tree.
+ if (oldTail && newTailOffset > oldTailOffset && newOrigin < oldCapacity && oldTail.array.length) {
+ newRoot = editableVNode(newRoot, owner);
+ var node = newRoot;
+ for (var level = newLevel; level > SHIFT; level -= SHIFT) {
+ var idx = (oldTailOffset >>> level) & MASK;
+ node = node.array[idx] = editableVNode(node.array[idx], owner);
+ }
+ node.array[(oldTailOffset >>> SHIFT) & MASK] = oldTail;
+ }
+
+ // If the size has been reduced, there's a chance the tail needs to be trimmed.
+ if (newCapacity < oldCapacity) {
+ newTail = newTail && newTail.removeAfter(owner, 0, newCapacity);
+ }
+
+ // If the new origin is within the tail, then we do not need a root.
+ if (newOrigin >= newTailOffset) {
+ newOrigin -= newTailOffset;
+ newCapacity -= newTailOffset;
+ newLevel = SHIFT;
+ newRoot = null;
+ newTail = newTail && newTail.removeBefore(owner, 0, newOrigin);
+
+ // Otherwise, if the root has been trimmed, garbage collect.
+ } else if (newOrigin > oldOrigin || newTailOffset < oldTailOffset) {
+ offsetShift = 0;
+
+ // Identify the new top root node of the subtree of the old root.
+ while (newRoot) {
+ var beginIndex = (newOrigin >>> newLevel) & MASK;
+ if (beginIndex !== (newTailOffset >>> newLevel) & MASK) {
+ break;
+ }
+ if (beginIndex) {
+ offsetShift += (1 << newLevel) * beginIndex;
+ }
+ newLevel -= SHIFT;
+ newRoot = newRoot.array[beginIndex];
+ }
+
+ // Trim the new sides of the new root.
+ if (newRoot && newOrigin > oldOrigin) {
+ newRoot = newRoot.removeBefore(owner, newLevel, newOrigin - offsetShift);
+ }
+ if (newRoot && newTailOffset < oldTailOffset) {
+ newRoot = newRoot.removeAfter(owner, newLevel, newTailOffset - offsetShift);
+ }
+ if (offsetShift) {
+ newOrigin -= offsetShift;
+ newCapacity -= offsetShift;
+ }
+ }
+
+ if (list.__ownerID) {
+ list.size = newCapacity - newOrigin;
+ list._origin = newOrigin;
+ list._capacity = newCapacity;
+ list._level = newLevel;
+ list._root = newRoot;
+ list._tail = newTail;
+ list.__hash = undefined;
+ list.__altered = true;
+ return list;
+ }
+ return makeList(newOrigin, newCapacity, newLevel, newRoot, newTail);
+ }
+
+ function mergeIntoListWith(list, merger, iterables) {
+ var iters = [];
+ var maxSize = 0;
+ for (var ii = 0; ii < iterables.length; ii++) {
+ var value = iterables[ii];
+ var iter = IndexedIterable(value);
+ if (iter.size > maxSize) {
+ maxSize = iter.size;
+ }
+ if (!isIterable(value)) {
+ iter = iter.map(function(v ) {return fromJS(v)});
+ }
+ iters.push(iter);
+ }
+ if (maxSize > list.size) {
+ list = list.setSize(maxSize);
+ }
+ return mergeIntoCollectionWith(list, merger, iters);
+ }
+
+ function getTailOffset(size) {
+ return size < SIZE ? 0 : (((size - 1) >>> SHIFT) << SHIFT);
+ }
+
+ createClass(OrderedMap, Map);
+
+ // @pragma Construction
+
+ function OrderedMap(value) {
+ return value === null || value === undefined ? emptyOrderedMap() :
+ isOrderedMap(value) ? value :
+ emptyOrderedMap().withMutations(function(map ) {
+ var iter = KeyedIterable(value);
+ assertNotInfinite(iter.size);
+ iter.forEach(function(v, k) {return map.set(k, v)});
+ });
+ }
+
+ OrderedMap.of = function(/*...values*/) {
+ return this(arguments);
+ };
+
+ OrderedMap.prototype.toString = function() {
+ return this.__toString('OrderedMap {', '}');
+ };
+
+ // @pragma Access
+
+ OrderedMap.prototype.get = function(k, notSetValue) {
+ var index = this._map.get(k);
+ return index !== undefined ? this._list.get(index)[1] : notSetValue;
+ };
+
+ // @pragma Modification
+
+ OrderedMap.prototype.clear = function() {
+ if (this.size === 0) {
+ return this;
+ }
+ if (this.__ownerID) {
+ this.size = 0;
+ this._map.clear();
+ this._list.clear();
+ return this;
+ }
+ return emptyOrderedMap();
+ };
+
+ OrderedMap.prototype.set = function(k, v) {
+ return updateOrderedMap(this, k, v);
+ };
+
+ OrderedMap.prototype.remove = function(k) {
+ return updateOrderedMap(this, k, NOT_SET);
+ };
+
+ OrderedMap.prototype.wasAltered = function() {
+ return this._map.wasAltered() || this._list.wasAltered();
+ };
+
+ OrderedMap.prototype.__iterate = function(fn, reverse) {var this$0 = this;
+ return this._list.__iterate(
+ function(entry ) {return entry && fn(entry[1], entry[0], this$0)},
+ reverse
+ );
+ };
+
+ OrderedMap.prototype.__iterator = function(type, reverse) {
+ return this._list.fromEntrySeq().__iterator(type, reverse);
+ };
+
+ OrderedMap.prototype.__ensureOwner = function(ownerID) {
+ if (ownerID === this.__ownerID) {
+ return this;
+ }
+ var newMap = this._map.__ensureOwner(ownerID);
+ var newList = this._list.__ensureOwner(ownerID);
+ if (!ownerID) {
+ this.__ownerID = ownerID;
+ this._map = newMap;
+ this._list = newList;
+ return this;
+ }
+ return makeOrderedMap(newMap, newList, ownerID, this.__hash);
+ };
+
+
+ function isOrderedMap(maybeOrderedMap) {
+ return isMap(maybeOrderedMap) && isOrdered(maybeOrderedMap);
+ }
+
+ OrderedMap.isOrderedMap = isOrderedMap;
+
+ OrderedMap.prototype[IS_ORDERED_SENTINEL] = true;
+ OrderedMap.prototype[DELETE] = OrderedMap.prototype.remove;
+
+
+
+ function makeOrderedMap(map, list, ownerID, hash) {
+ var omap = Object.create(OrderedMap.prototype);
+ omap.size = map ? map.size : 0;
+ omap._map = map;
+ omap._list = list;
+ omap.__ownerID = ownerID;
+ omap.__hash = hash;
+ return omap;
+ }
+
+ var EMPTY_ORDERED_MAP;
+ function emptyOrderedMap() {
+ return EMPTY_ORDERED_MAP || (EMPTY_ORDERED_MAP = makeOrderedMap(emptyMap(), emptyList()));
+ }
+
+ function updateOrderedMap(omap, k, v) {
+ var map = omap._map;
+ var list = omap._list;
+ var i = map.get(k);
+ var has = i !== undefined;
+ var newMap;
+ var newList;
+ if (v === NOT_SET) { // removed
+ if (!has) {
+ return omap;
+ }
+ if (list.size >= SIZE && list.size >= map.size * 2) {
+ newList = list.filter(function(entry, idx) {return entry !== undefined && i !== idx});
+ newMap = newList.toKeyedSeq().map(function(entry ) {return entry[0]}).flip().toMap();
+ if (omap.__ownerID) {
+ newMap.__ownerID = newList.__ownerID = omap.__ownerID;
+ }
+ } else {
+ newMap = map.remove(k);
+ newList = i === list.size - 1 ? list.pop() : list.set(i, undefined);
+ }
+ } else {
+ if (has) {
+ if (v === list.get(i)[1]) {
+ return omap;
+ }
+ newMap = map;
+ newList = list.set(i, [k, v]);
+ } else {
+ newMap = map.set(k, list.size);
+ newList = list.set(list.size, [k, v]);
+ }
+ }
+ if (omap.__ownerID) {
+ omap.size = newMap.size;
+ omap._map = newMap;
+ omap._list = newList;
+ omap.__hash = undefined;
+ return omap;
+ }
+ return makeOrderedMap(newMap, newList);
+ }
+
+ createClass(ToKeyedSequence, KeyedSeq);
+ function ToKeyedSequence(indexed, useKeys) {
+ this._iter = indexed;
+ this._useKeys = useKeys;
+ this.size = indexed.size;
+ }
+
+ ToKeyedSequence.prototype.get = function(key, notSetValue) {
+ return this._iter.get(key, notSetValue);
+ };
+
+ ToKeyedSequence.prototype.has = function(key) {
+ return this._iter.has(key);
+ };
+
+ ToKeyedSequence.prototype.valueSeq = function() {
+ return this._iter.valueSeq();
+ };
+
+ ToKeyedSequence.prototype.reverse = function() {var this$0 = this;
+ var reversedSequence = reverseFactory(this, true);
+ if (!this._useKeys) {
+ reversedSequence.valueSeq = function() {return this$0._iter.toSeq().reverse()};
+ }
+ return reversedSequence;
+ };
+
+ ToKeyedSequence.prototype.map = function(mapper, context) {var this$0 = this;
+ var mappedSequence = mapFactory(this, mapper, context);
+ if (!this._useKeys) {
+ mappedSequence.valueSeq = function() {return this$0._iter.toSeq().map(mapper, context)};
+ }
+ return mappedSequence;
+ };
+
+ ToKeyedSequence.prototype.__iterate = function(fn, reverse) {var this$0 = this;
+ var ii;
+ return this._iter.__iterate(
+ this._useKeys ?
+ function(v, k) {return fn(v, k, this$0)} :
+ ((ii = reverse ? resolveSize(this) : 0),
+ function(v ) {return fn(v, reverse ? --ii : ii++, this$0)}),
+ reverse
+ );
+ };
+
+ ToKeyedSequence.prototype.__iterator = function(type, reverse) {
+ if (this._useKeys) {
+ return this._iter.__iterator(type, reverse);
+ }
+ var iterator = this._iter.__iterator(ITERATE_VALUES, reverse);
+ var ii = reverse ? resolveSize(this) : 0;
+ return new Iterator(function() {
+ var step = iterator.next();
+ return step.done ? step :
+ iteratorValue(type, reverse ? --ii : ii++, step.value, step);
+ });
+ };
+
+ ToKeyedSequence.prototype[IS_ORDERED_SENTINEL] = true;
+
+
+ createClass(ToIndexedSequence, IndexedSeq);
+ function ToIndexedSequence(iter) {
+ this._iter = iter;
+ this.size = iter.size;
+ }
+
+ ToIndexedSequence.prototype.includes = function(value) {
+ return this._iter.includes(value);
+ };
+
+ ToIndexedSequence.prototype.__iterate = function(fn, reverse) {var this$0 = this;
+ var iterations = 0;
+ return this._iter.__iterate(function(v ) {return fn(v, iterations++, this$0)}, reverse);
+ };
+
+ ToIndexedSequence.prototype.__iterator = function(type, reverse) {
+ var iterator = this._iter.__iterator(ITERATE_VALUES, reverse);
+ var iterations = 0;
+ return new Iterator(function() {
+ var step = iterator.next();
+ return step.done ? step :
+ iteratorValue(type, iterations++, step.value, step)
+ });
+ };
+
+
+
+ createClass(ToSetSequence, SetSeq);
+ function ToSetSequence(iter) {
+ this._iter = iter;
+ this.size = iter.size;
+ }
+
+ ToSetSequence.prototype.has = function(key) {
+ return this._iter.includes(key);
+ };
+
+ ToSetSequence.prototype.__iterate = function(fn, reverse) {var this$0 = this;
+ return this._iter.__iterate(function(v ) {return fn(v, v, this$0)}, reverse);
+ };
+
+ ToSetSequence.prototype.__iterator = function(type, reverse) {
+ var iterator = this._iter.__iterator(ITERATE_VALUES, reverse);
+ return new Iterator(function() {
+ var step = iterator.next();
+ return step.done ? step :
+ iteratorValue(type, step.value, step.value, step);
+ });
+ };
+
+
+
+ createClass(FromEntriesSequence, KeyedSeq);
+ function FromEntriesSequence(entries) {
+ this._iter = entries;
+ this.size = entries.size;
+ }
+
+ FromEntriesSequence.prototype.entrySeq = function() {
+ return this._iter.toSeq();
+ };
+
+ FromEntriesSequence.prototype.__iterate = function(fn, reverse) {var this$0 = this;
+ return this._iter.__iterate(function(entry ) {
+ // Check if entry exists first so array access doesn't throw for holes
+ // in the parent iteration.
+ if (entry) {
+ validateEntry(entry);
+ var indexedIterable = isIterable(entry);
+ return fn(
+ indexedIterable ? entry.get(1) : entry[1],
+ indexedIterable ? entry.get(0) : entry[0],
+ this$0
+ );
+ }
+ }, reverse);
+ };
+
+ FromEntriesSequence.prototype.__iterator = function(type, reverse) {
+ var iterator = this._iter.__iterator(ITERATE_VALUES, reverse);
+ return new Iterator(function() {
+ while (true) {
+ var step = iterator.next();
+ if (step.done) {
+ return step;
+ }
+ var entry = step.value;
+ // Check if entry exists first so array access doesn't throw for holes
+ // in the parent iteration.
+ if (entry) {
+ validateEntry(entry);
+ var indexedIterable = isIterable(entry);
+ return iteratorValue(
+ type,
+ indexedIterable ? entry.get(0) : entry[0],
+ indexedIterable ? entry.get(1) : entry[1],
+ step
+ );
+ }
+ }
+ });
+ };
+
+
+ ToIndexedSequence.prototype.cacheResult =
+ ToKeyedSequence.prototype.cacheResult =
+ ToSetSequence.prototype.cacheResult =
+ FromEntriesSequence.prototype.cacheResult =
+ cacheResultThrough;
+
+
+ function flipFactory(iterable) {
+ var flipSequence = makeSequence(iterable);
+ flipSequence._iter = iterable;
+ flipSequence.size = iterable.size;
+ flipSequence.flip = function() {return iterable};
+ flipSequence.reverse = function () {
+ var reversedSequence = iterable.reverse.apply(this); // super.reverse()
+ reversedSequence.flip = function() {return iterable.reverse()};
+ return reversedSequence;
+ };
+ flipSequence.has = function(key ) {return iterable.includes(key)};
+ flipSequence.includes = function(key ) {return iterable.has(key)};
+ flipSequence.cacheResult = cacheResultThrough;
+ flipSequence.__iterateUncached = function (fn, reverse) {var this$0 = this;
+ return iterable.__iterate(function(v, k) {return fn(k, v, this$0) !== false}, reverse);
+ }
+ flipSequence.__iteratorUncached = function(type, reverse) {
+ if (type === ITERATE_ENTRIES) {
+ var iterator = iterable.__iterator(type, reverse);
+ return new Iterator(function() {
+ var step = iterator.next();
+ if (!step.done) {
+ var k = step.value[0];
+ step.value[0] = step.value[1];
+ step.value[1] = k;
+ }
+ return step;
+ });
+ }
+ return iterable.__iterator(
+ type === ITERATE_VALUES ? ITERATE_KEYS : ITERATE_VALUES,
+ reverse
+ );
+ }
+ return flipSequence;
+ }
+
+
+ function mapFactory(iterable, mapper, context) {
+ var mappedSequence = makeSequence(iterable);
+ mappedSequence.size = iterable.size;
+ mappedSequence.has = function(key ) {return iterable.has(key)};
+ mappedSequence.get = function(key, notSetValue) {
+ var v = iterable.get(key, NOT_SET);
+ return v === NOT_SET ?
+ notSetValue :
+ mapper.call(context, v, key, iterable);
+ };
+ mappedSequence.__iterateUncached = function (fn, reverse) {var this$0 = this;
+ return iterable.__iterate(
+ function(v, k, c) {return fn(mapper.call(context, v, k, c), k, this$0) !== false},
+ reverse
+ );
+ }
+ mappedSequence.__iteratorUncached = function (type, reverse) {
+ var iterator = iterable.__iterator(ITERATE_ENTRIES, reverse);
+ return new Iterator(function() {
+ var step = iterator.next();
+ if (step.done) {
+ return step;
+ }
+ var entry = step.value;
+ var key = entry[0];
+ return iteratorValue(
+ type,
+ key,
+ mapper.call(context, entry[1], key, iterable),
+ step
+ );
+ });
+ }
+ return mappedSequence;
+ }
+
+
+ function reverseFactory(iterable, useKeys) {
+ var reversedSequence = makeSequence(iterable);
+ reversedSequence._iter = iterable;
+ reversedSequence.size = iterable.size;
+ reversedSequence.reverse = function() {return iterable};
+ if (iterable.flip) {
+ reversedSequence.flip = function () {
+ var flipSequence = flipFactory(iterable);
+ flipSequence.reverse = function() {return iterable.flip()};
+ return flipSequence;
+ };
+ }
+ reversedSequence.get = function(key, notSetValue)
+ {return iterable.get(useKeys ? key : -1 - key, notSetValue)};
+ reversedSequence.has = function(key )
+ {return iterable.has(useKeys ? key : -1 - key)};
+ reversedSequence.includes = function(value ) {return iterable.includes(value)};
+ reversedSequence.cacheResult = cacheResultThrough;
+ reversedSequence.__iterate = function (fn, reverse) {var this$0 = this;
+ return iterable.__iterate(function(v, k) {return fn(v, k, this$0)}, !reverse);
+ };
+ reversedSequence.__iterator =
+ function(type, reverse) {return iterable.__iterator(type, !reverse)};
+ return reversedSequence;
+ }
+
+
+ function filterFactory(iterable, predicate, context, useKeys) {
+ var filterSequence = makeSequence(iterable);
+ if (useKeys) {
+ filterSequence.has = function(key ) {
+ var v = iterable.get(key, NOT_SET);
+ return v !== NOT_SET && !!predicate.call(context, v, key, iterable);
+ };
+ filterSequence.get = function(key, notSetValue) {
+ var v = iterable.get(key, NOT_SET);
+ return v !== NOT_SET && predicate.call(context, v, key, iterable) ?
+ v : notSetValue;
+ };
+ }
+ filterSequence.__iterateUncached = function (fn, reverse) {var this$0 = this;
+ var iterations = 0;
+ iterable.__iterate(function(v, k, c) {
+ if (predicate.call(context, v, k, c)) {
+ iterations++;
+ return fn(v, useKeys ? k : iterations - 1, this$0);
+ }
+ }, reverse);
+ return iterations;
+ };
+ filterSequence.__iteratorUncached = function (type, reverse) {
+ var iterator = iterable.__iterator(ITERATE_ENTRIES, reverse);
+ var iterations = 0;
+ return new Iterator(function() {
+ while (true) {
+ var step = iterator.next();
+ if (step.done) {
+ return step;
+ }
+ var entry = step.value;
+ var key = entry[0];
+ var value = entry[1];
+ if (predicate.call(context, value, key, iterable)) {
+ return iteratorValue(type, useKeys ? key : iterations++, value, step);
+ }
+ }
+ });
+ }
+ return filterSequence;
+ }
+
+
+ function countByFactory(iterable, grouper, context) {
+ var groups = Map().asMutable();
+ iterable.__iterate(function(v, k) {
+ groups.update(
+ grouper.call(context, v, k, iterable),
+ 0,
+ function(a ) {return a + 1}
+ );
+ });
+ return groups.asImmutable();
+ }
+
+
+ function groupByFactory(iterable, grouper, context) {
+ var isKeyedIter = isKeyed(iterable);
+ var groups = (isOrdered(iterable) ? OrderedMap() : Map()).asMutable();
+ iterable.__iterate(function(v, k) {
+ groups.update(
+ grouper.call(context, v, k, iterable),
+ function(a ) {return (a = a || [], a.push(isKeyedIter ? [k, v] : v), a)}
+ );
+ });
+ var coerce = iterableClass(iterable);
+ return groups.map(function(arr ) {return reify(iterable, coerce(arr))});
+ }
+
+
+ function sliceFactory(iterable, begin, end, useKeys) {
+ var originalSize = iterable.size;
+
+ // Sanitize begin & end using this shorthand for ToInt32(argument)
+ // http://www.ecma-international.org/ecma-262/6.0/#sec-toint32
+ if (begin !== undefined) {
+ begin = begin | 0;
+ }
+ if (end !== undefined) {
+ if (end === Infinity) {
+ end = originalSize;
+ } else {
+ end = end | 0;
+ }
+ }
+
+ if (wholeSlice(begin, end, originalSize)) {
+ return iterable;
+ }
+
+ var resolvedBegin = resolveBegin(begin, originalSize);
+ var resolvedEnd = resolveEnd(end, originalSize);
+
+ // begin or end will be NaN if they were provided as negative numbers and
+ // this iterable's size is unknown. In that case, cache first so there is
+ // a known size and these do not resolve to NaN.
+ if (resolvedBegin !== resolvedBegin || resolvedEnd !== resolvedEnd) {
+ return sliceFactory(iterable.toSeq().cacheResult(), begin, end, useKeys);
+ }
+
+ // Note: resolvedEnd is undefined when the original sequence's length is
+ // unknown and this slice did not supply an end and should contain all
+ // elements after resolvedBegin.
+ // In that case, resolvedSize will be NaN and sliceSize will remain undefined.
+ var resolvedSize = resolvedEnd - resolvedBegin;
+ var sliceSize;
+ if (resolvedSize === resolvedSize) {
+ sliceSize = resolvedSize < 0 ? 0 : resolvedSize;
+ }
+
+ var sliceSeq = makeSequence(iterable);
+
+ // If iterable.size is undefined, the size of the realized sliceSeq is
+ // unknown at this point unless the number of items to slice is 0
+ sliceSeq.size = sliceSize === 0 ? sliceSize : iterable.size && sliceSize || undefined;
+
+ if (!useKeys && isSeq(iterable) && sliceSize >= 0) {
+ sliceSeq.get = function (index, notSetValue) {
+ index = wrapIndex(this, index);
+ return index >= 0 && index < sliceSize ?
+ iterable.get(index + resolvedBegin, notSetValue) :
+ notSetValue;
+ }
+ }
+
+ sliceSeq.__iterateUncached = function(fn, reverse) {var this$0 = this;
+ if (sliceSize === 0) {
+ return 0;
+ }
+ if (reverse) {
+ return this.cacheResult().__iterate(fn, reverse);
+ }
+ var skipped = 0;
+ var isSkipping = true;
+ var iterations = 0;
+ iterable.__iterate(function(v, k) {
+ if (!(isSkipping && (isSkipping = skipped++ < resolvedBegin))) {
+ iterations++;
+ return fn(v, useKeys ? k : iterations - 1, this$0) !== false &&
+ iterations !== sliceSize;
+ }
+ });
+ return iterations;
+ };
+
+ sliceSeq.__iteratorUncached = function(type, reverse) {
+ if (sliceSize !== 0 && reverse) {
+ return this.cacheResult().__iterator(type, reverse);
+ }
+ // Don't bother instantiating parent iterator if taking 0.
+ var iterator = sliceSize !== 0 && iterable.__iterator(type, reverse);
+ var skipped = 0;
+ var iterations = 0;
+ return new Iterator(function() {
+ while (skipped++ < resolvedBegin) {
+ iterator.next();
+ }
+ if (++iterations > sliceSize) {
+ return iteratorDone();
+ }
+ var step = iterator.next();
+ if (useKeys || type === ITERATE_VALUES) {
+ return step;
+ } else if (type === ITERATE_KEYS) {
+ return iteratorValue(type, iterations - 1, undefined, step);
+ } else {
+ return iteratorValue(type, iterations - 1, step.value[1], step);
+ }
+ });
+ }
+
+ return sliceSeq;
+ }
+
+
+ function takeWhileFactory(iterable, predicate, context) {
+ var takeSequence = makeSequence(iterable);
+ takeSequence.__iterateUncached = function(fn, reverse) {var this$0 = this;
+ if (reverse) {
+ return this.cacheResult().__iterate(fn, reverse);
+ }
+ var iterations = 0;
+ iterable.__iterate(function(v, k, c)
+ {return predicate.call(context, v, k, c) && ++iterations && fn(v, k, this$0)}
+ );
+ return iterations;
+ };
+ takeSequence.__iteratorUncached = function(type, reverse) {var this$0 = this;
+ if (reverse) {
+ return this.cacheResult().__iterator(type, reverse);
+ }
+ var iterator = iterable.__iterator(ITERATE_ENTRIES, reverse);
+ var iterating = true;
+ return new Iterator(function() {
+ if (!iterating) {
+ return iteratorDone();
+ }
+ var step = iterator.next();
+ if (step.done) {
+ return step;
+ }
+ var entry = step.value;
+ var k = entry[0];
+ var v = entry[1];
+ if (!predicate.call(context, v, k, this$0)) {
+ iterating = false;
+ return iteratorDone();
+ }
+ return type === ITERATE_ENTRIES ? step :
+ iteratorValue(type, k, v, step);
+ });
+ };
+ return takeSequence;
+ }
+
+
+ function skipWhileFactory(iterable, predicate, context, useKeys) {
+ var skipSequence = makeSequence(iterable);
+ skipSequence.__iterateUncached = function (fn, reverse) {var this$0 = this;
+ if (reverse) {
+ return this.cacheResult().__iterate(fn, reverse);
+ }
+ var isSkipping = true;
+ var iterations = 0;
+ iterable.__iterate(function(v, k, c) {
+ if (!(isSkipping && (isSkipping = predicate.call(context, v, k, c)))) {
+ iterations++;
+ return fn(v, useKeys ? k : iterations - 1, this$0);
+ }
+ });
+ return iterations;
+ };
+ skipSequence.__iteratorUncached = function(type, reverse) {var this$0 = this;
+ if (reverse) {
+ return this.cacheResult().__iterator(type, reverse);
+ }
+ var iterator = iterable.__iterator(ITERATE_ENTRIES, reverse);
+ var skipping = true;
+ var iterations = 0;
+ return new Iterator(function() {
+ var step, k, v;
+ do {
+ step = iterator.next();
+ if (step.done) {
+ if (useKeys || type === ITERATE_VALUES) {
+ return step;
+ } else if (type === ITERATE_KEYS) {
+ return iteratorValue(type, iterations++, undefined, step);
+ } else {
+ return iteratorValue(type, iterations++, step.value[1], step);
+ }
+ }
+ var entry = step.value;
+ k = entry[0];
+ v = entry[1];
+ skipping && (skipping = predicate.call(context, v, k, this$0));
+ } while (skipping);
+ return type === ITERATE_ENTRIES ? step :
+ iteratorValue(type, k, v, step);
+ });
+ };
+ return skipSequence;
+ }
+
+
+ function concatFactory(iterable, values) {
+ var isKeyedIterable = isKeyed(iterable);
+ var iters = [iterable].concat(values).map(function(v ) {
+ if (!isIterable(v)) {
+ v = isKeyedIterable ?
+ keyedSeqFromValue(v) :
+ indexedSeqFromValue(Array.isArray(v) ? v : [v]);
+ } else if (isKeyedIterable) {
+ v = KeyedIterable(v);
+ }
+ return v;
+ }).filter(function(v ) {return v.size !== 0});
+
+ if (iters.length === 0) {
+ return iterable;
+ }
+
+ if (iters.length === 1) {
+ var singleton = iters[0];
+ if (singleton === iterable ||
+ isKeyedIterable && isKeyed(singleton) ||
+ isIndexed(iterable) && isIndexed(singleton)) {
+ return singleton;
+ }
+ }
+
+ var concatSeq = new ArraySeq(iters);
+ if (isKeyedIterable) {
+ concatSeq = concatSeq.toKeyedSeq();
+ } else if (!isIndexed(iterable)) {
+ concatSeq = concatSeq.toSetSeq();
+ }
+ concatSeq = concatSeq.flatten(true);
+ concatSeq.size = iters.reduce(
+ function(sum, seq) {
+ if (sum !== undefined) {
+ var size = seq.size;
+ if (size !== undefined) {
+ return sum + size;
+ }
+ }
+ },
+ 0
+ );
+ return concatSeq;
+ }
+
+
+ function flattenFactory(iterable, depth, useKeys) {
+ var flatSequence = makeSequence(iterable);
+ flatSequence.__iterateUncached = function(fn, reverse) {
+ var iterations = 0;
+ var stopped = false;
+ function flatDeep(iter, currentDepth) {var this$0 = this;
+ iter.__iterate(function(v, k) {
+ if ((!depth || currentDepth < depth) && isIterable(v)) {
+ flatDeep(v, currentDepth + 1);
+ } else if (fn(v, useKeys ? k : iterations++, this$0) === false) {
+ stopped = true;
+ }
+ return !stopped;
+ }, reverse);
+ }
+ flatDeep(iterable, 0);
+ return iterations;
+ }
+ flatSequence.__iteratorUncached = function(type, reverse) {
+ var iterator = iterable.__iterator(type, reverse);
+ var stack = [];
+ var iterations = 0;
+ return new Iterator(function() {
+ while (iterator) {
+ var step = iterator.next();
+ if (step.done !== false) {
+ iterator = stack.pop();
+ continue;
+ }
+ var v = step.value;
+ if (type === ITERATE_ENTRIES) {
+ v = v[1];
+ }
+ if ((!depth || stack.length < depth) && isIterable(v)) {
+ stack.push(iterator);
+ iterator = v.__iterator(type, reverse);
+ } else {
+ return useKeys ? step : iteratorValue(type, iterations++, v, step);
+ }
+ }
+ return iteratorDone();
+ });
+ }
+ return flatSequence;
+ }
+
+
+ function flatMapFactory(iterable, mapper, context) {
+ var coerce = iterableClass(iterable);
+ return iterable.toSeq().map(
+ function(v, k) {return coerce(mapper.call(context, v, k, iterable))}
+ ).flatten(true);
+ }
+
+
+ function interposeFactory(iterable, separator) {
+ var interposedSequence = makeSequence(iterable);
+ interposedSequence.size = iterable.size && iterable.size * 2 -1;
+ interposedSequence.__iterateUncached = function(fn, reverse) {var this$0 = this;
+ var iterations = 0;
+ iterable.__iterate(function(v, k)
+ {return (!iterations || fn(separator, iterations++, this$0) !== false) &&
+ fn(v, iterations++, this$0) !== false},
+ reverse
+ );
+ return iterations;
+ };
+ interposedSequence.__iteratorUncached = function(type, reverse) {
+ var iterator = iterable.__iterator(ITERATE_VALUES, reverse);
+ var iterations = 0;
+ var step;
+ return new Iterator(function() {
+ if (!step || iterations % 2) {
+ step = iterator.next();
+ if (step.done) {
+ return step;
+ }
+ }
+ return iterations % 2 ?
+ iteratorValue(type, iterations++, separator) :
+ iteratorValue(type, iterations++, step.value, step);
+ });
+ };
+ return interposedSequence;
+ }
+
+
+ function sortFactory(iterable, comparator, mapper) {
+ if (!comparator) {
+ comparator = defaultComparator;
+ }
+ var isKeyedIterable = isKeyed(iterable);
+ var index = 0;
+ var entries = iterable.toSeq().map(
+ function(v, k) {return [k, v, index++, mapper ? mapper(v, k, iterable) : v]}
+ ).toArray();
+ entries.sort(function(a, b) {return comparator(a[3], b[3]) || a[2] - b[2]}).forEach(
+ isKeyedIterable ?
+ function(v, i) { entries[i].length = 2; } :
+ function(v, i) { entries[i] = v[1]; }
+ );
+ return isKeyedIterable ? KeyedSeq(entries) :
+ isIndexed(iterable) ? IndexedSeq(entries) :
+ SetSeq(entries);
+ }
+
+
+ function maxFactory(iterable, comparator, mapper) {
+ if (!comparator) {
+ comparator = defaultComparator;
+ }
+ if (mapper) {
+ var entry = iterable.toSeq()
+ .map(function(v, k) {return [v, mapper(v, k, iterable)]})
+ .reduce(function(a, b) {return maxCompare(comparator, a[1], b[1]) ? b : a});
+ return entry && entry[0];
+ } else {
+ return iterable.reduce(function(a, b) {return maxCompare(comparator, a, b) ? b : a});
+ }
+ }
+
+ function maxCompare(comparator, a, b) {
+ var comp = comparator(b, a);
+ // b is considered the new max if the comparator declares them equal, but
+ // they are not equal and b is in fact a nullish value.
+ return (comp === 0 && b !== a && (b === undefined || b === null || b !== b)) || comp > 0;
+ }
+
+
+ function zipWithFactory(keyIter, zipper, iters) {
+ var zipSequence = makeSequence(keyIter);
+ zipSequence.size = new ArraySeq(iters).map(function(i ) {return i.size}).min();
+ // Note: this a generic base implementation of __iterate in terms of
+ // __iterator which may be more generically useful in the future.
+ zipSequence.__iterate = function(fn, reverse) {
+ /* generic:
+ var iterator = this.__iterator(ITERATE_ENTRIES, reverse);
+ var step;
+ var iterations = 0;
+ while (!(step = iterator.next()).done) {
+ iterations++;
+ if (fn(step.value[1], step.value[0], this) === false) {
+ break;
+ }
+ }
+ return iterations;
+ */
+ // indexed:
+ var iterator = this.__iterator(ITERATE_VALUES, reverse);
+ var step;
+ var iterations = 0;
+ while (!(step = iterator.next()).done) {
+ if (fn(step.value, iterations++, this) === false) {
+ break;
+ }
+ }
+ return iterations;
+ };
+ zipSequence.__iteratorUncached = function(type, reverse) {
+ var iterators = iters.map(function(i )
+ {return (i = Iterable(i), getIterator(reverse ? i.reverse() : i))}
+ );
+ var iterations = 0;
+ var isDone = false;
+ return new Iterator(function() {
+ var steps;
+ if (!isDone) {
+ steps = iterators.map(function(i ) {return i.next()});
+ isDone = steps.some(function(s ) {return s.done});
+ }
+ if (isDone) {
+ return iteratorDone();
+ }
+ return iteratorValue(
+ type,
+ iterations++,
+ zipper.apply(null, steps.map(function(s ) {return s.value}))
+ );
+ });
+ };
+ return zipSequence
+ }
+
+
+ // #pragma Helper Functions
+
+ function reify(iter, seq) {
+ return isSeq(iter) ? seq : iter.constructor(seq);
+ }
+
+ function validateEntry(entry) {
+ if (entry !== Object(entry)) {
+ throw new TypeError('Expected [K, V] tuple: ' + entry);
+ }
+ }
+
+ function resolveSize(iter) {
+ assertNotInfinite(iter.size);
+ return ensureSize(iter);
+ }
+
+ function iterableClass(iterable) {
+ return isKeyed(iterable) ? KeyedIterable :
+ isIndexed(iterable) ? IndexedIterable :
+ SetIterable;
+ }
+
+ function makeSequence(iterable) {
+ return Object.create(
+ (
+ isKeyed(iterable) ? KeyedSeq :
+ isIndexed(iterable) ? IndexedSeq :
+ SetSeq
+ ).prototype
+ );
+ }
+
+ function cacheResultThrough() {
+ if (this._iter.cacheResult) {
+ this._iter.cacheResult();
+ this.size = this._iter.size;
+ return this;
+ } else {
+ return Seq.prototype.cacheResult.call(this);
+ }
+ }
+
+ function defaultComparator(a, b) {
+ return a > b ? 1 : a < b ? -1 : 0;
+ }
+
+ function forceIterator(keyPath) {
+ var iter = getIterator(keyPath);
+ if (!iter) {
+ // Array might not be iterable in this environment, so we need a fallback
+ // to our wrapped type.
+ if (!isArrayLike(keyPath)) {
+ throw new TypeError('Expected iterable or array-like: ' + keyPath);
+ }
+ iter = getIterator(Iterable(keyPath));
+ }
+ return iter;
+ }
+
+ createClass(Record, KeyedCollection);
+
+ function Record(defaultValues, name) {
+ var hasInitialized;
+
+ var RecordType = function Record(values) {
+ if (values instanceof RecordType) {
+ return values;
+ }
+ if (!(this instanceof RecordType)) {
+ return new RecordType(values);
+ }
+ if (!hasInitialized) {
+ hasInitialized = true;
+ var keys = Object.keys(defaultValues);
+ setProps(RecordTypePrototype, keys);
+ RecordTypePrototype.size = keys.length;
+ RecordTypePrototype._name = name;
+ RecordTypePrototype._keys = keys;
+ RecordTypePrototype._defaultValues = defaultValues;
+ }
+ this._map = Map(values);
+ };
+
+ var RecordTypePrototype = RecordType.prototype = Object.create(RecordPrototype);
+ RecordTypePrototype.constructor = RecordType;
+
+ return RecordType;
+ }
+
+ Record.prototype.toString = function() {
+ return this.__toString(recordName(this) + ' {', '}');
+ };
+
+ // @pragma Access
+
+ Record.prototype.has = function(k) {
+ return this._defaultValues.hasOwnProperty(k);
+ };
+
+ Record.prototype.get = function(k, notSetValue) {
+ if (!this.has(k)) {
+ return notSetValue;
+ }
+ var defaultVal = this._defaultValues[k];
+ return this._map ? this._map.get(k, defaultVal) : defaultVal;
+ };
+
+ // @pragma Modification
+
+ Record.prototype.clear = function() {
+ if (this.__ownerID) {
+ this._map && this._map.clear();
+ return this;
+ }
+ var RecordType = this.constructor;
+ return RecordType._empty || (RecordType._empty = makeRecord(this, emptyMap()));
+ };
+
+ Record.prototype.set = function(k, v) {
+ if (!this.has(k)) {
+ throw new Error('Cannot set unknown key "' + k + '" on ' + recordName(this));
+ }
+ if (this._map && !this._map.has(k)) {
+ var defaultVal = this._defaultValues[k];
+ if (v === defaultVal) {
+ return this;
+ }
+ }
+ var newMap = this._map && this._map.set(k, v);
+ if (this.__ownerID || newMap === this._map) {
+ return this;
+ }
+ return makeRecord(this, newMap);
+ };
+
+ Record.prototype.remove = function(k) {
+ if (!this.has(k)) {
+ return this;
+ }
+ var newMap = this._map && this._map.remove(k);
+ if (this.__ownerID || newMap === this._map) {
+ return this;
+ }
+ return makeRecord(this, newMap);
+ };
+
+ Record.prototype.wasAltered = function() {
+ return this._map.wasAltered();
+ };
+
+ Record.prototype.__iterator = function(type, reverse) {var this$0 = this;
+ return KeyedIterable(this._defaultValues).map(function(_, k) {return this$0.get(k)}).__iterator(type, reverse);
+ };
+
+ Record.prototype.__iterate = function(fn, reverse) {var this$0 = this;
+ return KeyedIterable(this._defaultValues).map(function(_, k) {return this$0.get(k)}).__iterate(fn, reverse);
+ };
+
+ Record.prototype.__ensureOwner = function(ownerID) {
+ if (ownerID === this.__ownerID) {
+ return this;
+ }
+ var newMap = this._map && this._map.__ensureOwner(ownerID);
+ if (!ownerID) {
+ this.__ownerID = ownerID;
+ this._map = newMap;
+ return this;
+ }
+ return makeRecord(this, newMap, ownerID);
+ };
+
+
+ var RecordPrototype = Record.prototype;
+ RecordPrototype[DELETE] = RecordPrototype.remove;
+ RecordPrototype.deleteIn =
+ RecordPrototype.removeIn = MapPrototype.removeIn;
+ RecordPrototype.merge = MapPrototype.merge;
+ RecordPrototype.mergeWith = MapPrototype.mergeWith;
+ RecordPrototype.mergeIn = MapPrototype.mergeIn;
+ RecordPrototype.mergeDeep = MapPrototype.mergeDeep;
+ RecordPrototype.mergeDeepWith = MapPrototype.mergeDeepWith;
+ RecordPrototype.mergeDeepIn = MapPrototype.mergeDeepIn;
+ RecordPrototype.setIn = MapPrototype.setIn;
+ RecordPrototype.update = MapPrototype.update;
+ RecordPrototype.updateIn = MapPrototype.updateIn;
+ RecordPrototype.withMutations = MapPrototype.withMutations;
+ RecordPrototype.asMutable = MapPrototype.asMutable;
+ RecordPrototype.asImmutable = MapPrototype.asImmutable;
+
+
+ function makeRecord(likeRecord, map, ownerID) {
+ var record = Object.create(Object.getPrototypeOf(likeRecord));
+ record._map = map;
+ record.__ownerID = ownerID;
+ return record;
+ }
+
+ function recordName(record) {
+ return record._name || record.constructor.name || 'Record';
+ }
+
+ function setProps(prototype, names) {
+ try {
+ names.forEach(setProp.bind(undefined, prototype));
+ } catch (error) {
+ // Object.defineProperty failed. Probably IE8.
+ }
+ }
+
+ function setProp(prototype, name) {
+ Object.defineProperty(prototype, name, {
+ get: function() {
+ return this.get(name);
+ },
+ set: function(value) {
+ invariant(this.__ownerID, 'Cannot set on an immutable record.');
+ this.set(name, value);
+ }
+ });
+ }
+
+ createClass(Set, SetCollection);
+
+ // @pragma Construction
+
+ function Set(value) {
+ return value === null || value === undefined ? emptySet() :
+ isSet(value) && !isOrdered(value) ? value :
+ emptySet().withMutations(function(set ) {
+ var iter = SetIterable(value);
+ assertNotInfinite(iter.size);
+ iter.forEach(function(v ) {return set.add(v)});
+ });
+ }
+
+ Set.of = function(/*...values*/) {
+ return this(arguments);
+ };
+
+ Set.fromKeys = function(value) {
+ return this(KeyedIterable(value).keySeq());
+ };
+
+ Set.prototype.toString = function() {
+ return this.__toString('Set {', '}');
+ };
+
+ // @pragma Access
+
+ Set.prototype.has = function(value) {
+ return this._map.has(value);
+ };
+
+ // @pragma Modification
+
+ Set.prototype.add = function(value) {
+ return updateSet(this, this._map.set(value, true));
+ };
+
+ Set.prototype.remove = function(value) {
+ return updateSet(this, this._map.remove(value));
+ };
+
+ Set.prototype.clear = function() {
+ return updateSet(this, this._map.clear());
+ };
+
+ // @pragma Composition
+
+ Set.prototype.union = function() {var iters = SLICE$0.call(arguments, 0);
+ iters = iters.filter(function(x ) {return x.size !== 0});
+ if (iters.length === 0) {
+ return this;
+ }
+ if (this.size === 0 && !this.__ownerID && iters.length === 1) {
+ return this.constructor(iters[0]);
+ }
+ return this.withMutations(function(set ) {
+ for (var ii = 0; ii < iters.length; ii++) {
+ SetIterable(iters[ii]).forEach(function(value ) {return set.add(value)});
+ }
+ });
+ };
+
+ Set.prototype.intersect = function() {var iters = SLICE$0.call(arguments, 0);
+ if (iters.length === 0) {
+ return this;
+ }
+ iters = iters.map(function(iter ) {return SetIterable(iter)});
+ var originalSet = this;
+ return this.withMutations(function(set ) {
+ originalSet.forEach(function(value ) {
+ if (!iters.every(function(iter ) {return iter.includes(value)})) {
+ set.remove(value);
+ }
+ });
+ });
+ };
+
+ Set.prototype.subtract = function() {var iters = SLICE$0.call(arguments, 0);
+ if (iters.length === 0) {
+ return this;
+ }
+ iters = iters.map(function(iter ) {return SetIterable(iter)});
+ var originalSet = this;
+ return this.withMutations(function(set ) {
+ originalSet.forEach(function(value ) {
+ if (iters.some(function(iter ) {return iter.includes(value)})) {
+ set.remove(value);
+ }
+ });
+ });
+ };
+
+ Set.prototype.merge = function() {
+ return this.union.apply(this, arguments);
+ };
+
+ Set.prototype.mergeWith = function(merger) {var iters = SLICE$0.call(arguments, 1);
+ return this.union.apply(this, iters);
+ };
+
+ Set.prototype.sort = function(comparator) {
+ // Late binding
+ return OrderedSet(sortFactory(this, comparator));
+ };
+
+ Set.prototype.sortBy = function(mapper, comparator) {
+ // Late binding
+ return OrderedSet(sortFactory(this, comparator, mapper));
+ };
+
+ Set.prototype.wasAltered = function() {
+ return this._map.wasAltered();
+ };
+
+ Set.prototype.__iterate = function(fn, reverse) {var this$0 = this;
+ return this._map.__iterate(function(_, k) {return fn(k, k, this$0)}, reverse);
+ };
+
+ Set.prototype.__iterator = function(type, reverse) {
+ return this._map.map(function(_, k) {return k}).__iterator(type, reverse);
+ };
+
+ Set.prototype.__ensureOwner = function(ownerID) {
+ if (ownerID === this.__ownerID) {
+ return this;
+ }
+ var newMap = this._map.__ensureOwner(ownerID);
+ if (!ownerID) {
+ this.__ownerID = ownerID;
+ this._map = newMap;
+ return this;
+ }
+ return this.__make(newMap, ownerID);
+ };
+
+
+ function isSet(maybeSet) {
+ return !!(maybeSet && maybeSet[IS_SET_SENTINEL]);
+ }
+
+ Set.isSet = isSet;
+
+ var IS_SET_SENTINEL = '@@__IMMUTABLE_SET__@@';
+
+ var SetPrototype = Set.prototype;
+ SetPrototype[IS_SET_SENTINEL] = true;
+ SetPrototype[DELETE] = SetPrototype.remove;
+ SetPrototype.mergeDeep = SetPrototype.merge;
+ SetPrototype.mergeDeepWith = SetPrototype.mergeWith;
+ SetPrototype.withMutations = MapPrototype.withMutations;
+ SetPrototype.asMutable = MapPrototype.asMutable;
+ SetPrototype.asImmutable = MapPrototype.asImmutable;
+
+ SetPrototype.__empty = emptySet;
+ SetPrototype.__make = makeSet;
+
+ function updateSet(set, newMap) {
+ if (set.__ownerID) {
+ set.size = newMap.size;
+ set._map = newMap;
+ return set;
+ }
+ return newMap === set._map ? set :
+ newMap.size === 0 ? set.__empty() :
+ set.__make(newMap);
+ }
+
+ function makeSet(map, ownerID) {
+ var set = Object.create(SetPrototype);
+ set.size = map ? map.size : 0;
+ set._map = map;
+ set.__ownerID = ownerID;
+ return set;
+ }
+
+ var EMPTY_SET;
+ function emptySet() {
+ return EMPTY_SET || (EMPTY_SET = makeSet(emptyMap()));
+ }
+
+ createClass(OrderedSet, Set);
+
+ // @pragma Construction
+
+ function OrderedSet(value) {
+ return value === null || value === undefined ? emptyOrderedSet() :
+ isOrderedSet(value) ? value :
+ emptyOrderedSet().withMutations(function(set ) {
+ var iter = SetIterable(value);
+ assertNotInfinite(iter.size);
+ iter.forEach(function(v ) {return set.add(v)});
+ });
+ }
+
+ OrderedSet.of = function(/*...values*/) {
+ return this(arguments);
+ };
+
+ OrderedSet.fromKeys = function(value) {
+ return this(KeyedIterable(value).keySeq());
+ };
+
+ OrderedSet.prototype.toString = function() {
+ return this.__toString('OrderedSet {', '}');
+ };
+
+
+ function isOrderedSet(maybeOrderedSet) {
+ return isSet(maybeOrderedSet) && isOrdered(maybeOrderedSet);
+ }
+
+ OrderedSet.isOrderedSet = isOrderedSet;
+
+ var OrderedSetPrototype = OrderedSet.prototype;
+ OrderedSetPrototype[IS_ORDERED_SENTINEL] = true;
+
+ OrderedSetPrototype.__empty = emptyOrderedSet;
+ OrderedSetPrototype.__make = makeOrderedSet;
+
+ function makeOrderedSet(map, ownerID) {
+ var set = Object.create(OrderedSetPrototype);
+ set.size = map ? map.size : 0;
+ set._map = map;
+ set.__ownerID = ownerID;
+ return set;
+ }
+
+ var EMPTY_ORDERED_SET;
+ function emptyOrderedSet() {
+ return EMPTY_ORDERED_SET || (EMPTY_ORDERED_SET = makeOrderedSet(emptyOrderedMap()));
+ }
+
+ createClass(Stack, IndexedCollection);
+
+ // @pragma Construction
+
+ function Stack(value) {
+ return value === null || value === undefined ? emptyStack() :
+ isStack(value) ? value :
+ emptyStack().unshiftAll(value);
+ }
+
+ Stack.of = function(/*...values*/) {
+ return this(arguments);
+ };
+
+ Stack.prototype.toString = function() {
+ return this.__toString('Stack [', ']');
+ };
+
+ // @pragma Access
+
+ Stack.prototype.get = function(index, notSetValue) {
+ var head = this._head;
+ index = wrapIndex(this, index);
+ while (head && index--) {
+ head = head.next;
+ }
+ return head ? head.value : notSetValue;
+ };
+
+ Stack.prototype.peek = function() {
+ return this._head && this._head.value;
+ };
+
+ // @pragma Modification
+
+ Stack.prototype.push = function(/*...values*/) {
+ if (arguments.length === 0) {
+ return this;
+ }
+ var newSize = this.size + arguments.length;
+ var head = this._head;
+ for (var ii = arguments.length - 1; ii >= 0; ii--) {
+ head = {
+ value: arguments[ii],
+ next: head
+ };
+ }
+ if (this.__ownerID) {
+ this.size = newSize;
+ this._head = head;
+ this.__hash = undefined;
+ this.__altered = true;
+ return this;
+ }
+ return makeStack(newSize, head);
+ };
+
+ Stack.prototype.pushAll = function(iter) {
+ iter = IndexedIterable(iter);
+ if (iter.size === 0) {
+ return this;
+ }
+ assertNotInfinite(iter.size);
+ var newSize = this.size;
+ var head = this._head;
+ iter.reverse().forEach(function(value ) {
+ newSize++;
+ head = {
+ value: value,
+ next: head
+ };
+ });
+ if (this.__ownerID) {
+ this.size = newSize;
+ this._head = head;
+ this.__hash = undefined;
+ this.__altered = true;
+ return this;
+ }
+ return makeStack(newSize, head);
+ };
+
+ Stack.prototype.pop = function() {
+ return this.slice(1);
+ };
+
+ Stack.prototype.unshift = function(/*...values*/) {
+ return this.push.apply(this, arguments);
+ };
+
+ Stack.prototype.unshiftAll = function(iter) {
+ return this.pushAll(iter);
+ };
+
+ Stack.prototype.shift = function() {
+ return this.pop.apply(this, arguments);
+ };
+
+ Stack.prototype.clear = function() {
+ if (this.size === 0) {
+ return this;
+ }
+ if (this.__ownerID) {
+ this.size = 0;
+ this._head = undefined;
+ this.__hash = undefined;
+ this.__altered = true;
+ return this;
+ }
+ return emptyStack();
+ };
+
+ Stack.prototype.slice = function(begin, end) {
+ if (wholeSlice(begin, end, this.size)) {
+ return this;
+ }
+ var resolvedBegin = resolveBegin(begin, this.size);
+ var resolvedEnd = resolveEnd(end, this.size);
+ if (resolvedEnd !== this.size) {
+ // super.slice(begin, end);
+ return IndexedCollection.prototype.slice.call(this, begin, end);
+ }
+ var newSize = this.size - resolvedBegin;
+ var head = this._head;
+ while (resolvedBegin--) {
+ head = head.next;
+ }
+ if (this.__ownerID) {
+ this.size = newSize;
+ this._head = head;
+ this.__hash = undefined;
+ this.__altered = true;
+ return this;
+ }
+ return makeStack(newSize, head);
+ };
+
+ // @pragma Mutability
+
+ Stack.prototype.__ensureOwner = function(ownerID) {
+ if (ownerID === this.__ownerID) {
+ return this;
+ }
+ if (!ownerID) {
+ this.__ownerID = ownerID;
+ this.__altered = false;
+ return this;
+ }
+ return makeStack(this.size, this._head, ownerID, this.__hash);
+ };
+
+ // @pragma Iteration
+
+ Stack.prototype.__iterate = function(fn, reverse) {
+ if (reverse) {
+ return this.reverse().__iterate(fn);
+ }
+ var iterations = 0;
+ var node = this._head;
+ while (node) {
+ if (fn(node.value, iterations++, this) === false) {
+ break;
+ }
+ node = node.next;
+ }
+ return iterations;
+ };
+
+ Stack.prototype.__iterator = function(type, reverse) {
+ if (reverse) {
+ return this.reverse().__iterator(type);
+ }
+ var iterations = 0;
+ var node = this._head;
+ return new Iterator(function() {
+ if (node) {
+ var value = node.value;
+ node = node.next;
+ return iteratorValue(type, iterations++, value);
+ }
+ return iteratorDone();
+ });
+ };
+
+
+ function isStack(maybeStack) {
+ return !!(maybeStack && maybeStack[IS_STACK_SENTINEL]);
+ }
+
+ Stack.isStack = isStack;
+
+ var IS_STACK_SENTINEL = '@@__IMMUTABLE_STACK__@@';
+
+ var StackPrototype = Stack.prototype;
+ StackPrototype[IS_STACK_SENTINEL] = true;
+ StackPrototype.withMutations = MapPrototype.withMutations;
+ StackPrototype.asMutable = MapPrototype.asMutable;
+ StackPrototype.asImmutable = MapPrototype.asImmutable;
+ StackPrototype.wasAltered = MapPrototype.wasAltered;
+
+
+ function makeStack(size, head, ownerID, hash) {
+ var map = Object.create(StackPrototype);
+ map.size = size;
+ map._head = head;
+ map.__ownerID = ownerID;
+ map.__hash = hash;
+ map.__altered = false;
+ return map;
+ }
+
+ var EMPTY_STACK;
+ function emptyStack() {
+ return EMPTY_STACK || (EMPTY_STACK = makeStack(0));
+ }
+
+ /**
+ * Contributes additional methods to a constructor
+ */
+ function mixin(ctor, methods) {
+ var keyCopier = function(key ) { ctor.prototype[key] = methods[key]; };
+ Object.keys(methods).forEach(keyCopier);
+ Object.getOwnPropertySymbols &&
+ Object.getOwnPropertySymbols(methods).forEach(keyCopier);
+ return ctor;
+ }
+
+ Iterable.Iterator = Iterator;
+
+ mixin(Iterable, {
+
+ // ### Conversion to other types
+
+ toArray: function() {
+ assertNotInfinite(this.size);
+ var array = new Array(this.size || 0);
+ this.valueSeq().__iterate(function(v, i) { array[i] = v; });
+ return array;
+ },
+
+ toIndexedSeq: function() {
+ return new ToIndexedSequence(this);
+ },
+
+ toJS: function() {
+ return this.toSeq().map(
+ function(value ) {return value && typeof value.toJS === 'function' ? value.toJS() : value}
+ ).__toJS();
+ },
+
+ toJSON: function() {
+ return this.toSeq().map(
+ function(value ) {return value && typeof value.toJSON === 'function' ? value.toJSON() : value}
+ ).__toJS();
+ },
+
+ toKeyedSeq: function() {
+ return new ToKeyedSequence(this, true);
+ },
+
+ toMap: function() {
+ // Use Late Binding here to solve the circular dependency.
+ return Map(this.toKeyedSeq());
+ },
+
+ toObject: function() {
+ assertNotInfinite(this.size);
+ var object = {};
+ this.__iterate(function(v, k) { object[k] = v; });
+ return object;
+ },
+
+ toOrderedMap: function() {
+ // Use Late Binding here to solve the circular dependency.
+ return OrderedMap(this.toKeyedSeq());
+ },
+
+ toOrderedSet: function() {
+ // Use Late Binding here to solve the circular dependency.
+ return OrderedSet(isKeyed(this) ? this.valueSeq() : this);
+ },
+
+ toSet: function() {
+ // Use Late Binding here to solve the circular dependency.
+ return Set(isKeyed(this) ? this.valueSeq() : this);
+ },
+
+ toSetSeq: function() {
+ return new ToSetSequence(this);
+ },
+
+ toSeq: function() {
+ return isIndexed(this) ? this.toIndexedSeq() :
+ isKeyed(this) ? this.toKeyedSeq() :
+ this.toSetSeq();
+ },
+
+ toStack: function() {
+ // Use Late Binding here to solve the circular dependency.
+ return Stack(isKeyed(this) ? this.valueSeq() : this);
+ },
+
+ toList: function() {
+ // Use Late Binding here to solve the circular dependency.
+ return List(isKeyed(this) ? this.valueSeq() : this);
+ },
+
+
+ // ### Common JavaScript methods and properties
+
+ toString: function() {
+ return '[Iterable]';
+ },
+
+ __toString: function(head, tail) {
+ if (this.size === 0) {
+ return head + tail;
+ }
+ return head + ' ' + this.toSeq().map(this.__toStringMapper).join(', ') + ' ' + tail;
+ },
+
+
+ // ### ES6 Collection methods (ES6 Array and Map)
+
+ concat: function() {var values = SLICE$0.call(arguments, 0);
+ return reify(this, concatFactory(this, values));
+ },
+
+ includes: function(searchValue) {
+ return this.some(function(value ) {return is(value, searchValue)});
+ },
+
+ entries: function() {
+ return this.__iterator(ITERATE_ENTRIES);
+ },
+
+ every: function(predicate, context) {
+ assertNotInfinite(this.size);
+ var returnValue = true;
+ this.__iterate(function(v, k, c) {
+ if (!predicate.call(context, v, k, c)) {
+ returnValue = false;
+ return false;
+ }
+ });
+ return returnValue;
+ },
+
+ filter: function(predicate, context) {
+ return reify(this, filterFactory(this, predicate, context, true));
+ },
+
+ find: function(predicate, context, notSetValue) {
+ var entry = this.findEntry(predicate, context);
+ return entry ? entry[1] : notSetValue;
+ },
+
+ forEach: function(sideEffect, context) {
+ assertNotInfinite(this.size);
+ return this.__iterate(context ? sideEffect.bind(context) : sideEffect);
+ },
+
+ join: function(separator) {
+ assertNotInfinite(this.size);
+ separator = separator !== undefined ? '' + separator : ',';
+ var joined = '';
+ var isFirst = true;
+ this.__iterate(function(v ) {
+ isFirst ? (isFirst = false) : (joined += separator);
+ joined += v !== null && v !== undefined ? v.toString() : '';
+ });
+ return joined;
+ },
+
+ keys: function() {
+ return this.__iterator(ITERATE_KEYS);
+ },
+
+ map: function(mapper, context) {
+ return reify(this, mapFactory(this, mapper, context));
+ },
+
+ reduce: function(reducer, initialReduction, context) {
+ assertNotInfinite(this.size);
+ var reduction;
+ var useFirst;
+ if (arguments.length < 2) {
+ useFirst = true;
+ } else {
+ reduction = initialReduction;
+ }
+ this.__iterate(function(v, k, c) {
+ if (useFirst) {
+ useFirst = false;
+ reduction = v;
+ } else {
+ reduction = reducer.call(context, reduction, v, k, c);
+ }
+ });
+ return reduction;
+ },
+
+ reduceRight: function(reducer, initialReduction, context) {
+ var reversed = this.toKeyedSeq().reverse();
+ return reversed.reduce.apply(reversed, arguments);
+ },
+
+ reverse: function() {
+ return reify(this, reverseFactory(this, true));
+ },
+
+ slice: function(begin, end) {
+ return reify(this, sliceFactory(this, begin, end, true));
+ },
+
+ some: function(predicate, context) {
+ return !this.every(not(predicate), context);
+ },
+
+ sort: function(comparator) {
+ return reify(this, sortFactory(this, comparator));
+ },
+
+ values: function() {
+ return this.__iterator(ITERATE_VALUES);
+ },
+
+
+ // ### More sequential methods
+
+ butLast: function() {
+ return this.slice(0, -1);
+ },
+
+ isEmpty: function() {
+ return this.size !== undefined ? this.size === 0 : !this.some(function() {return true});
+ },
+
+ count: function(predicate, context) {
+ return ensureSize(
+ predicate ? this.toSeq().filter(predicate, context) : this
+ );
+ },
+
+ countBy: function(grouper, context) {
+ return countByFactory(this, grouper, context);
+ },
+
+ equals: function(other) {
+ return deepEqual(this, other);
+ },
+
+ entrySeq: function() {
+ var iterable = this;
+ if (iterable._cache) {
+ // We cache as an entries array, so we can just return the cache!
+ return new ArraySeq(iterable._cache);
+ }
+ var entriesSequence = iterable.toSeq().map(entryMapper).toIndexedSeq();
+ entriesSequence.fromEntrySeq = function() {return iterable.toSeq()};
+ return entriesSequence;
+ },
+
+ filterNot: function(predicate, context) {
+ return this.filter(not(predicate), context);
+ },
+
+ findEntry: function(predicate, context, notSetValue) {
+ var found = notSetValue;
+ this.__iterate(function(v, k, c) {
+ if (predicate.call(context, v, k, c)) {
+ found = [k, v];
+ return false;
+ }
+ });
+ return found;
+ },
+
+ findKey: function(predicate, context) {
+ var entry = this.findEntry(predicate, context);
+ return entry && entry[0];
+ },
+
+ findLast: function(predicate, context, notSetValue) {
+ return this.toKeyedSeq().reverse().find(predicate, context, notSetValue);
+ },
+
+ findLastEntry: function(predicate, context, notSetValue) {
+ return this.toKeyedSeq().reverse().findEntry(predicate, context, notSetValue);
+ },
+
+ findLastKey: function(predicate, context) {
+ return this.toKeyedSeq().reverse().findKey(predicate, context);
+ },
+
+ first: function() {
+ return this.find(returnTrue);
+ },
+
+ flatMap: function(mapper, context) {
+ return reify(this, flatMapFactory(this, mapper, context));
+ },
+
+ flatten: function(depth) {
+ return reify(this, flattenFactory(this, depth, true));
+ },
+
+ fromEntrySeq: function() {
+ return new FromEntriesSequence(this);
+ },
+
+ get: function(searchKey, notSetValue) {
+ return this.find(function(_, key) {return is(key, searchKey)}, undefined, notSetValue);
+ },
+
+ getIn: function(searchKeyPath, notSetValue) {
+ var nested = this;
+ // Note: in an ES6 environment, we would prefer:
+ // for (var key of searchKeyPath) {
+ var iter = forceIterator(searchKeyPath);
+ var step;
+ while (!(step = iter.next()).done) {
+ var key = step.value;
+ nested = nested && nested.get ? nested.get(key, NOT_SET) : NOT_SET;
+ if (nested === NOT_SET) {
+ return notSetValue;
+ }
+ }
+ return nested;
+ },
+
+ groupBy: function(grouper, context) {
+ return groupByFactory(this, grouper, context);
+ },
+
+ has: function(searchKey) {
+ return this.get(searchKey, NOT_SET) !== NOT_SET;
+ },
+
+ hasIn: function(searchKeyPath) {
+ return this.getIn(searchKeyPath, NOT_SET) !== NOT_SET;
+ },
+
+ isSubset: function(iter) {
+ iter = typeof iter.includes === 'function' ? iter : Iterable(iter);
+ return this.every(function(value ) {return iter.includes(value)});
+ },
+
+ isSuperset: function(iter) {
+ iter = typeof iter.isSubset === 'function' ? iter : Iterable(iter);
+ return iter.isSubset(this);
+ },
+
+ keyOf: function(searchValue) {
+ return this.findKey(function(value ) {return is(value, searchValue)});
+ },
+
+ keySeq: function() {
+ return this.toSeq().map(keyMapper).toIndexedSeq();
+ },
+
+ last: function() {
+ return this.toSeq().reverse().first();
+ },
+
+ lastKeyOf: function(searchValue) {
+ return this.toKeyedSeq().reverse().keyOf(searchValue);
+ },
+
+ max: function(comparator) {
+ return maxFactory(this, comparator);
+ },
+
+ maxBy: function(mapper, comparator) {
+ return maxFactory(this, comparator, mapper);
+ },
+
+ min: function(comparator) {
+ return maxFactory(this, comparator ? neg(comparator) : defaultNegComparator);
+ },
+
+ minBy: function(mapper, comparator) {
+ return maxFactory(this, comparator ? neg(comparator) : defaultNegComparator, mapper);
+ },
+
+ rest: function() {
+ return this.slice(1);
+ },
+
+ skip: function(amount) {
+ return this.slice(Math.max(0, amount));
+ },
+
+ skipLast: function(amount) {
+ return reify(this, this.toSeq().reverse().skip(amount).reverse());
+ },
+
+ skipWhile: function(predicate, context) {
+ return reify(this, skipWhileFactory(this, predicate, context, true));
+ },
+
+ skipUntil: function(predicate, context) {
+ return this.skipWhile(not(predicate), context);
+ },
+
+ sortBy: function(mapper, comparator) {
+ return reify(this, sortFactory(this, comparator, mapper));
+ },
+
+ take: function(amount) {
+ return this.slice(0, Math.max(0, amount));
+ },
+
+ takeLast: function(amount) {
+ return reify(this, this.toSeq().reverse().take(amount).reverse());
+ },
+
+ takeWhile: function(predicate, context) {
+ return reify(this, takeWhileFactory(this, predicate, context));
+ },
+
+ takeUntil: function(predicate, context) {
+ return this.takeWhile(not(predicate), context);
+ },
+
+ valueSeq: function() {
+ return this.toIndexedSeq();
+ },
+
+
+ // ### Hashable Object
+
+ hashCode: function() {
+ return this.__hash || (this.__hash = hashIterable(this));
+ }
+
+
+ // ### Internal
+
+ // abstract __iterate(fn, reverse)
+
+ // abstract __iterator(type, reverse)
+ });
+
+ // var IS_ITERABLE_SENTINEL = '@@__IMMUTABLE_ITERABLE__@@';
+ // var IS_KEYED_SENTINEL = '@@__IMMUTABLE_KEYED__@@';
+ // var IS_INDEXED_SENTINEL = '@@__IMMUTABLE_INDEXED__@@';
+ // var IS_ORDERED_SENTINEL = '@@__IMMUTABLE_ORDERED__@@';
+
+ var IterablePrototype = Iterable.prototype;
+ IterablePrototype[IS_ITERABLE_SENTINEL] = true;
+ IterablePrototype[ITERATOR_SYMBOL] = IterablePrototype.values;
+ IterablePrototype.__toJS = IterablePrototype.toArray;
+ IterablePrototype.__toStringMapper = quoteString;
+ IterablePrototype.inspect =
+ IterablePrototype.toSource = function() { return this.toString(); };
+ IterablePrototype.chain = IterablePrototype.flatMap;
+ IterablePrototype.contains = IterablePrototype.includes;
+
+ mixin(KeyedIterable, {
+
+ // ### More sequential methods
+
+ flip: function() {
+ return reify(this, flipFactory(this));
+ },
+
+ mapEntries: function(mapper, context) {var this$0 = this;
+ var iterations = 0;
+ return reify(this,
+ this.toSeq().map(
+ function(v, k) {return mapper.call(context, [k, v], iterations++, this$0)}
+ ).fromEntrySeq()
+ );
+ },
+
+ mapKeys: function(mapper, context) {var this$0 = this;
+ return reify(this,
+ this.toSeq().flip().map(
+ function(k, v) {return mapper.call(context, k, v, this$0)}
+ ).flip()
+ );
+ }
+
+ });
+
+ var KeyedIterablePrototype = KeyedIterable.prototype;
+ KeyedIterablePrototype[IS_KEYED_SENTINEL] = true;
+ KeyedIterablePrototype[ITERATOR_SYMBOL] = IterablePrototype.entries;
+ KeyedIterablePrototype.__toJS = IterablePrototype.toObject;
+ KeyedIterablePrototype.__toStringMapper = function(v, k) {return JSON.stringify(k) + ': ' + quoteString(v)};
+
+
+
+ mixin(IndexedIterable, {
+
+ // ### Conversion to other types
+
+ toKeyedSeq: function() {
+ return new ToKeyedSequence(this, false);
+ },
+
+
+ // ### ES6 Collection methods (ES6 Array and Map)
+
+ filter: function(predicate, context) {
+ return reify(this, filterFactory(this, predicate, context, false));
+ },
+
+ findIndex: function(predicate, context) {
+ var entry = this.findEntry(predicate, context);
+ return entry ? entry[0] : -1;
+ },
+
+ indexOf: function(searchValue) {
+ var key = this.keyOf(searchValue);
+ return key === undefined ? -1 : key;
+ },
+
+ lastIndexOf: function(searchValue) {
+ var key = this.lastKeyOf(searchValue);
+ return key === undefined ? -1 : key;
+ },
+
+ reverse: function() {
+ return reify(this, reverseFactory(this, false));
+ },
+
+ slice: function(begin, end) {
+ return reify(this, sliceFactory(this, begin, end, false));
+ },
+
+ splice: function(index, removeNum /*, ...values*/) {
+ var numArgs = arguments.length;
+ removeNum = Math.max(removeNum | 0, 0);
+ if (numArgs === 0 || (numArgs === 2 && !removeNum)) {
+ return this;
+ }
+ // If index is negative, it should resolve relative to the size of the
+ // collection. However size may be expensive to compute if not cached, so
+ // only call count() if the number is in fact negative.
+ index = resolveBegin(index, index < 0 ? this.count() : this.size);
+ var spliced = this.slice(0, index);
+ return reify(
+ this,
+ numArgs === 1 ?
+ spliced :
+ spliced.concat(arrCopy(arguments, 2), this.slice(index + removeNum))
+ );
+ },
+
+
+ // ### More collection methods
+
+ findLastIndex: function(predicate, context) {
+ var entry = this.findLastEntry(predicate, context);
+ return entry ? entry[0] : -1;
+ },
+
+ first: function() {
+ return this.get(0);
+ },
+
+ flatten: function(depth) {
+ return reify(this, flattenFactory(this, depth, false));
+ },
+
+ get: function(index, notSetValue) {
+ index = wrapIndex(this, index);
+ return (index < 0 || (this.size === Infinity ||
+ (this.size !== undefined && index > this.size))) ?
+ notSetValue :
+ this.find(function(_, key) {return key === index}, undefined, notSetValue);
+ },
+
+ has: function(index) {
+ index = wrapIndex(this, index);
+ return index >= 0 && (this.size !== undefined ?
+ this.size === Infinity || index < this.size :
+ this.indexOf(index) !== -1
+ );
+ },
+
+ interpose: function(separator) {
+ return reify(this, interposeFactory(this, separator));
+ },
+
+ interleave: function(/*...iterables*/) {
+ var iterables = [this].concat(arrCopy(arguments));
+ var zipped = zipWithFactory(this.toSeq(), IndexedSeq.of, iterables);
+ var interleaved = zipped.flatten(true);
+ if (zipped.size) {
+ interleaved.size = zipped.size * iterables.length;
+ }
+ return reify(this, interleaved);
+ },
+
+ keySeq: function() {
+ return Range(0, this.size);
+ },
+
+ last: function() {
+ return this.get(-1);
+ },
+
+ skipWhile: function(predicate, context) {
+ return reify(this, skipWhileFactory(this, predicate, context, false));
+ },
+
+ zip: function(/*, ...iterables */) {
+ var iterables = [this].concat(arrCopy(arguments));
+ return reify(this, zipWithFactory(this, defaultZipper, iterables));
+ },
+
+ zipWith: function(zipper/*, ...iterables */) {
+ var iterables = arrCopy(arguments);
+ iterables[0] = this;
+ return reify(this, zipWithFactory(this, zipper, iterables));
+ }
+
+ });
+
+ IndexedIterable.prototype[IS_INDEXED_SENTINEL] = true;
+ IndexedIterable.prototype[IS_ORDERED_SENTINEL] = true;
+
+
+
+ mixin(SetIterable, {
+
+ // ### ES6 Collection methods (ES6 Array and Map)
+
+ get: function(value, notSetValue) {
+ return this.has(value) ? value : notSetValue;
+ },
+
+ includes: function(value) {
+ return this.has(value);
+ },
+
+
+ // ### More sequential methods
+
+ keySeq: function() {
+ return this.valueSeq();
+ }
+
+ });
+
+ SetIterable.prototype.has = IterablePrototype.includes;
+ SetIterable.prototype.contains = SetIterable.prototype.includes;
+
+
+ // Mixin subclasses
+
+ mixin(KeyedSeq, KeyedIterable.prototype);
+ mixin(IndexedSeq, IndexedIterable.prototype);
+ mixin(SetSeq, SetIterable.prototype);
+
+ mixin(KeyedCollection, KeyedIterable.prototype);
+ mixin(IndexedCollection, IndexedIterable.prototype);
+ mixin(SetCollection, SetIterable.prototype);
+
+
+ // #pragma Helper functions
+
+ function keyMapper(v, k) {
+ return k;
+ }
+
+ function entryMapper(v, k) {
+ return [k, v];
+ }
+
+ function not(predicate) {
+ return function() {
+ return !predicate.apply(this, arguments);
+ }
+ }
+
+ function neg(predicate) {
+ return function() {
+ return -predicate.apply(this, arguments);
+ }
+ }
+
+ function quoteString(value) {
+ return typeof value === 'string' ? JSON.stringify(value) : String(value);
+ }
+
+ function defaultZipper() {
+ return arrCopy(arguments);
+ }
+
+ function defaultNegComparator(a, b) {
+ return a < b ? 1 : a > b ? -1 : 0;
+ }
+
+ function hashIterable(iterable) {
+ if (iterable.size === Infinity) {
+ return 0;
+ }
+ var ordered = isOrdered(iterable);
+ var keyed = isKeyed(iterable);
+ var h = ordered ? 1 : 0;
+ var size = iterable.__iterate(
+ keyed ?
+ ordered ?
+ function(v, k) { h = 31 * h + hashMerge(hash(v), hash(k)) | 0; } :
+ function(v, k) { h = h + hashMerge(hash(v), hash(k)) | 0; } :
+ ordered ?
+ function(v ) { h = 31 * h + hash(v) | 0; } :
+ function(v ) { h = h + hash(v) | 0; }
+ );
+ return murmurHashOfSize(size, h);
+ }
+
+ function murmurHashOfSize(size, h) {
+ h = imul(h, 0xCC9E2D51);
+ h = imul(h << 15 | h >>> -15, 0x1B873593);
+ h = imul(h << 13 | h >>> -13, 5);
+ h = (h + 0xE6546B64 | 0) ^ size;
+ h = imul(h ^ h >>> 16, 0x85EBCA6B);
+ h = imul(h ^ h >>> 13, 0xC2B2AE35);
+ h = smi(h ^ h >>> 16);
+ return h;
+ }
+
+ function hashMerge(a, b) {
+ return a ^ b + 0x9E3779B9 + (a << 6) + (a >> 2) | 0; // int
+ }
+
+ var Immutable = {
+
+ Iterable: Iterable,
+
+ Seq: Seq,
+ Collection: Collection,
+ Map: Map,
+ OrderedMap: OrderedMap,
+ List: List,
+ Stack: Stack,
+ Set: Set,
+ OrderedSet: OrderedSet,
+
+ Record: Record,
+ Range: Range,
+ Repeat: Repeat,
+
+ is: is,
+ fromJS: fromJS
+
+ };
+
+ return Immutable;
+
+}));
+
+/***/ })
+/******/ ]);
+//# sourceMappingURL=main.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/react/build/main.js.map b/devtools/client/debugger/test/mochitest/examples/react/build/main.js.map
new file mode 100644
index 0000000000..5df6ea4a00
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/react/build/main.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["../webpack/bootstrap 97d440834a2c326e60bc","../node_modules/object-assign/index.js","../node_modules/react/index.js","../node_modules/promise/lib/core.js","../node_modules/react-scripts/config/polyfills.js","../node_modules/promise/lib/rejection-tracking.js","../node_modules/asap/browser-raw.js","../node_modules/webpack/buildin/global.js","../node_modules/promise/lib/es6-extensions.js","../node_modules/whatwg-fetch/fetch.js","index.js","../node_modules/react/cjs/react.production.min.js","../node_modules/react-dom/index.js","../node_modules/react-dom/cjs/react-dom.production.min.js","../node_modules/schedule/index.js","../node_modules/schedule/cjs/schedule.production.min.js","App.js","../node_modules/immutable/dist/immutable.js"],"names":["ReactDOM","render","document","getElementById","App","onClick","f","fields","console","log","I","Map","a","window","clickButton","querySelector","click"],"mappings":";AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;AC7DA;AACA;AACA;AACA;AACA;;AAEa;AACb;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,gCAAgC;AAChC;AACA;AACA;AACA;;AAEA;AACA;AACA,iBAAiB,QAAQ;AACzB;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH,kCAAkC;AAClC;AACA;AACA;;AAEA;AACA,EAAE;AACF;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA,gBAAgB,sBAAsB;AACtC;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,kBAAkB,oBAAoB;AACtC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;;;;;;ACzFa;;AAEb,IAAI,IAAqC;AACzC,mBAAmB,mBAAO,CAAC,EAA+B;AAC1D,CAAC;AACD;AACA;;;;;;;;ACNa;;AAEb,WAAW,mBAAO,CAAC,CAAU;;AAE7B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qDAAqD,cAAc;AACnE;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,qBAAqB;AACxC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;ACpNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACa;;AAEb;AACA;AACA;AACA;AACA,EAAE,mBAAO,CAAC,CAAgC;AAC1C,mBAAmB,mBAAO,CAAC,CAA+B;AAC1D;;AAEA;AACA,mBAAO,CAAC,CAAc;;AAEtB;AACA;AACA,gBAAgB,mBAAO,CAAC,CAAe;;AAEvC;AACA;AACA,IAAI,KAA+B;AACnC;AACA;;;;;;;;AC7Ba;;AAEb,cAAc,mBAAO,CAAC,CAAQ;;AAE9B;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B;AAC5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA,GAAG;AACH,C;;;;;;;AChHA,8CAAa;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,gEAAgE,kBAAkB;AAClF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,4BAA4B,oBAAoB;AAChD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;AC9NA;;AAEA;AACA;AACA;AACA,CAAC;;AAED;AACA;AACA;AACA,CAAC;AACD;AACA;AACA;AACA;;AAEA;AACA;AACA,4CAA4C;;AAE5C;;;;;;;;ACpBa;;AAEb;;AAEA,cAAc,mBAAO,CAAC,CAAW;;AAEjC;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mBAAmB,iBAAiB;AACpC;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA,GAAG;AACH;;AAEA;AACA;AACA;AACA;AACA,KAAK;AACL,GAAG;AACH;;AAEA;;AAEA;AACA;AACA;;;;;;;AC1GA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,wCAAwC,mBAAmB;AAC3D;AACA;;AAEA;AACA;AACA,kCAAkC,oBAAoB;AACtD;AACA;;AAEA;AACA;AACA,wCAAwC,4BAA4B;AACpE;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,mBAAmB,iBAAiB;AACpC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA,uDAAuD;AACvD,SAAS;AACT;AACA,SAAS;AACT,8EAA8E;AAC9E;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,8BAA8B,uBAAuB;AACrD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;AACA,uCAAuC,0BAA0B;AACjE;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA,+BAA+B,0BAA0B,eAAe;AACxE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,OAAO;;AAEP;AACA,KAAK;AACL;AACA;AACA,CAAC;;;;;;;;AC5cD;AAAA;AAAA;AAAA;AAAA;AAAA;AAIA,iDAAQA,CAACC,MAAT,CAAgB,4DAAC,qDAAD,MAAhB,CAAyBC,SAASC,cAAT,CAAwB,MAAxB,CAAzB,E;;;;;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEa,MAAM,mBAAO,CAAC,CAAe,8YAA8Y;AACxb,kDAAkD,4BAA4B,OAAO,SAAS,mDAAmD,oGAAoG,KAAK,wBAAwB,mCAAmC,cAAc,GAAG,6BAA6B,gBAAgB;AACnX,cAAc,8FAA8F,IAAI,qDAAqD,kCAAkC,6HAA6H,OAAO,qBAAqB,SAAS,gCAAgC,iCAAiC,8BAA8B;AACxc,kBAAkB,aAAa,eAAe,YAAY,kBAAkB,gCAAgC,mCAAmC,mEAAmE,mDAAmD,oCAAoC,uDAAuD,cAAc,wBAAwB,kBAAkB,aAAa,eAAe,YAAY,kBAAkB;AACld,gBAAgB,iBAAiB,0BAA0B,OAAO,oCAAoC,sCAAsC;AAC5I,kBAAkB,iBAAiB,eAAe,4HAA4H,yBAAyB,sBAAsB,aAAa,uBAAuB,IAAI,wBAAwB,aAAa,4EAA4E,OAAO;AAC7X,gBAAgB,OAAO,sEAAsE,cAAc,oDAAoD,mBAAmB,OAAO,mBAAmB,6CAA6C,YAAY,EAAE,kBAAkB,oBAAoB,aAAa,cAAc,WAAW,cAAc,SAAS,YAAY,UAAU,SAAS,OAAO;AAChZ,cAAc,cAAc,iBAAiB,YAAY,eAAe,UAAU;AAClF,oBAAoB,eAAe,yCAAyC,SAAS,iBAAiB,eAAe,iCAAiC,MAAM,iCAAiC,oBAAoB,yCAAyC,IAAI,mBAAmB,gCAAgC,WAAW,KAAK,OAAO,eAAe,cAAc;AACrW,EAAE,mBAAmB,sCAAsC,0EAA0E,8BAA8B,SAAS,SAAS,kBAAkB,6BAA6B,gBAAgB,8EAA8E,gBAAgB;AAClV,mBAAmB,6BAA6B,qCAAqC,qCAAqC,SAAS,wGAAwG,sBAAsB,SAAS,yCAAyC,aAAa,UAAU,KAAK,iBAAiB,0BAA0B,yBAAyB;AACnZ,OAAO,UAAU,oBAAoB,oBAAoB,SAAS,gBAAgB,SAAS,yBAAyB,oBAAoB,mBAAmB,SAAS,KAAK,mBAAmB,sBAAsB,YAAY,OAAO,qBAAqB,SAAS,uBAAuB,SAAS,EAAE,SAAS,kBAAkB,qBAAqB,UAAU,sBAAsB,OAAO,cAAc,yDAAyD,qBAAqB,GAAG;AAC3d,iFAAiF,YAAY,uBAAuB,aAAa,gCAAgC,SAAS,wBAAwB,OAAO,qBAAqB,+GAA+G,uCAAuC,mBAAmB,qCAAqC,YAAY,sCAAsC;AAC9d,aAAa,qDAAqD,yFAAyF,qBAAqB,sBAAsB,aAAa,WAAW,YAAY,IAAI,wBAAwB,aAAa,OAAO,qDAAqD,2BAA2B,qBAAqB,SAAS,SAAS,uFAAuF;AACxe,UAAU,IAAI,UAAU,WAAW;;;;;;;;ACvBtB;;AAEb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAM,KAAqC;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA;AACA;;AAEA,IAAI,IAAqC;AACzC;AACA;AACA;AACA,mBAAmB,mBAAO,CAAC,EAAmC;AAC9D,CAAC;AACD;AACA;;;;;;;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACa,OAAO,mBAAO,CAAC,CAAO,IAAI,mBAAO,CAAC,CAAe,KAAK,mBAAO,CAAC,EAAU,EAAE,6BAA6B,OAAO,SAAS,mDAAmD,oGAAoG,KAAK,wBAAwB,mCAAmC,cAAc,GAAG,6BAA6B,gBAAgB;AACzZ,cAAc,8FAA8F,IAAI,qDAAqD,mCAAmC,6HAA6H,mBAAmB,+BAA+B,8CAA8C,IAAI,aAAa,SAAS;AAC/b,oCAAoC,oBAAoB,MAAM,OAAO,+BAA+B,MAAM,QAAQ,uBAAuB,+BAA+B,yBAAyB,OAAO,OAAO,SAAS,MAAM,QAAQ,uBAAuB,kBAAkB;AAC/Q,cAAc,uBAAuB,4BAA4B,sBAAsB,WAAW,iCAAiC,QAAQ,eAAe,gBAAgB,aAAa,mBAAmB,sCAAsC,QAAQ,gCAAgC,MAAM,6CAA6C,KAAK,+DAA+D;AAC/Y,mBAAmB,wBAAwB,QAAQ,mCAAmC,eAAe,MAAM,MAAM,yBAAyB,qBAAqB,0BAA0B,sBAAsB,iBAAiB,qBAAqB,iBAAiB,uBAAuB,oBAAoB,qBAAqB,+CAA+C,UAAU,SAAS;AACxY,mBAAmB,+CAA+C,YAAY,iBAAiB,MAAM,kDAAkD,gCAAgC,sCAAsC,sBAAsB,oBAAoB,0BAA0B,0BAA0B,4CAA4C,eAAe,gBAAgB,eAAe;AACrZ,QAAQ,mCAAmC,mBAAmB,iCAAiC,KAAK,sCAAsC,WAAW,mCAAmC,WAAW,wEAAwE;AAC3Q,iBAAiB,kBAAkB,kBAAkB,YAAY,kBAAkB,OAAO,YAAY,kTAAkT,KAAK,QAAQ,aAAa,iBAAiB;AACnc,SAAS,iBAAiB,wBAAwB,KAAK,QAAQ,6EAA6E,0GAA0G,eAAe,sBAAsB,KAAK,OAAO,gCAAgC,iBAAiB,QAAQ,mCAAmC,eAAe,QAAQ;AAC1Z,eAAe,2CAA2C,QAAQ,eAAe,mBAAmB,eAAe,cAAc,oBAAoB,gBAAgB,mBAAmB;AACxL,eAAe,gDAAgD,6BAA6B,EAAE,mBAAmB,eAAe,MAAM,uBAAuB,QAAQ,WAAW,0BAA0B,mBAAmB,wLAAwL,eAAe;AACpa,eAAe,SAAS,wFAAwF,iBAAiB,SAAS,mCAAmC,yBAAyB,mBAAmB,SAAS,QAAQ,mMAAmM,MAAM;AACnb,oPAAoP,eAAe,sBAAsB,mBAAmB,cAAc,6DAA6D;AACvX;AACA,cAAc,gBAAgB,0EAA0E,QAAQ,iBAAiB,KAAK,UAAU,QAAQ,sBAAsB,KAAK,oCAAoC,cAAc,SAAS,cAAc;AAC5P,oBAAoB,sBAAsB,mBAAmB,mBAAmB,6BAA6B,oGAAoG,+FAA+F,6BAA6B;AAC7U,eAAe,0BAA0B,yBAAyB,uBAAuB,yHAAyH,4BAA4B,uBAAuB,+HAA+H,oBAAoB,qBAAqB,uCAAuC;AACpd,EAAE,wBAAwB,2DAA2D,qDAAqD,sDAAsD,EAAE,aAAa,+CAA+C,YAAY,oEAAoE,+BAA+B;AAC7W,qBAAqB,cAAc,aAAa,+BAA+B,WAAW,wBAAwB,YAAY,iBAAiB,cAAc,0BAA0B,gBAAgB,gBAAgB,kBAAkB,MAAM,UAAU,MAAM,qBAAqB,0BAA0B,2BAA2B,qBAAqB,SAAS,yBAAyB,eAAe,kCAAkC,eAAe;AAChc,eAAe,eAAe,eAAe,aAAa,iBAAiB,UAAU,eAAe,UAAU,6DAA6D;AAC3K,mGAAmG,aAAa,yBAAyB,wDAAwD,gEAAgE,iBAAiB,yBAAyB,8DAA8D,gFAAgF,mBAAmB,yBAAyB;AACre,qCAAqC,kFAAkF,oBAAoB,yBAAyB,oEAAoE,oFAAoF;AAC5T,iBAAiB,UAAU,8CAA8C,sCAAsC,sDAAsD,kBAAkB,eAAe,WAAW,kDAAkD,UAAU,iBAAiB,UAAU,mCAAmC,4CAA4C,MAAM,UAAU,mDAAmD;AAC1b,iBAAiB,mFAAmF,UAAU,yBAAyB,2EAA2E,yCAAyC,+CAA+C,YAAY,6DAA6D;AACnX,QAAQ,8CAA8C,aAAa,aAAa,SAAS,UAAU,8CAA8C,QAAQ,0CAA0C,QAAQ,gDAAgD,QAAQ,SAAS,+FAA+F;AAC3W,yFAAyF,oFAAoF,oCAAoC,yBAAyB,eAAe,YAAY,uCAAuC,sBAAsB,0BAA0B,eAAe,6BAA6B,cAAc,OAAO,cAAc,WAAW,MAAM,aAAa,WAAW;AACpd,iBAAiB,YAAY,mBAAmB,cAAc,eAAe,UAAU,iBAAiB,kBAAkB,MAAM,IAAI,eAAe,QAAQ,yCAAyC,QAAQ,mJAAmJ,eAAe,8CAA8C;AAC5Z,eAAe,iCAAiC,yDAAyD,qCAAqC,eAAe,gBAAgB,SAAS,oBAAoB,6DAA6D,+BAA+B,SAAS,eAAe,aAAa;AAC3U,eAAe,qGAAqG,uGAAuG,oBAAoB,2BAA2B,+BAA+B,oBAAoB,iBAAiB,OAAO,gBAAgB,EAAE,2BAA2B,wBAAwB,EAAE,OAAO,oBAAoB,SAAS,sBAAsB,OAAO,yBAAyB;AACtf,KAAK,eAAe,eAAe,yCAAyC,eAAe,eAAe,sBAAsB,eAAe,mBAAmB,SAAS,8CAA8C,IAAI;AAC7N;AACA,qDAAqD,eAAe,6CAA6C,6BAA6B;AAC9I,eAAe,uBAAuB,4DAA4D,gCAAgC,UAAU,0BAA0B,yBAAyB,uBAAuB,yBAAyB,2BAA2B,4BAA4B,wBAAwB,mBAAmB,iCAAiC,iCAAiC,uBAAuB,4BAA4B;AACtc,cAAc,uFAAuF,YAAY,eAAe,SAAS,GAAG,gBAAgB,oGAAoG,WAAW,kBAAkB,IAAI,KAAK,wFAAwF,+BAA+B,QAAQ,aAAa,KAAK,WAAW,SAAS;AAC3c,6YAA6Y;AAC7Y,eAAe,0BAA0B,0BAA0B,8BAA8B,SAAS,SAAS,qBAAqB,iCAAiC,iBAAiB,uCAAuC,6BAA6B,qCAAqC,6BAA6B,+BAA+B;AAC/V,qBAAqB,0DAA0D,cAAc,2BAA2B,gBAAgB,oBAAoB,uBAAuB,4BAA4B,SAAS,sBAAsB,yCAAyC,qBAAqB,0BAA0B,uBAAuB,oBAAoB,YAAY;AAC7X,sKAAsK,0BAA0B,EAAE,4HAA4H,WAAW,6BAA6B,EAAE,yEAAyE,wCAAwC;AACzd,4FAA4F,0BAA0B,EAAE,+NAA+N,wCAAwC,EAAE,8DAA8D,0BAA0B;AACzd,2CAA2C,0BAA0B,EAAE,kDAAkD,0BAA0B,EAAE,wCAAwC,wCAAwC,EAAE,uBAAuB,eAAe;AAC7Q,ylCAAylC;AACzlC,IAAI,0BAA0B,EAAE,qHAAqH,uBAAuB,oDAAoD,EAAE,wDAAwD,uBAAuB,4DAA4D,EAAE;AAC/W,qBAAqB,oCAAoC,mGAAmG;AAC5J,eAAe,iBAAiB,mFAAmF,kBAAkB,iBAAiB,gBAAgB,WAAW,IAAI,wGAAwG;AAC7R,iBAAiB,0FAA0F,8BAA8B,iBAAiB,gHAAgH,iBAAiB,YAAY;AACvS,iBAAiB,QAAQ,2BAA2B,4BAA4B,gDAAgD,oCAAoC,mCAAmC,2BAA2B,OAAO,2GAA2G;AACpV,mBAAmB,gEAAgE,aAAa,yEAAyE,kCAAkC,4BAA4B,iBAAiB,SAAS,oBAAoB,mCAAmC,kDAAkD;AAC1W,mBAAmB,uJAAuJ,QAAQ,QAAQ,yBAAyB,8CAA8C,yFAAyF,mBAAmB,+BAA+B,gBAAgB,MAAM,MAAM,SAAS,oBAAoB,eAAe;AACpd,eAAe,YAAY,kBAAkB,iBAAiB,yBAAyB,UAAU,wEAAwE,cAAc,uDAAuD,eAAe,8DAA8D,mBAAmB,oFAAoF,eAAe;AACjb,iBAAiB,4BAA4B,iBAAiB;AAC9D,QAAQ,wEAAwE,8EAA8E,qKAAqK,kCAAkC,YAAY,0FAA0F,cAAc,sBAAsB,MAAM;AACrf,mDAAmD,eAAe,uBAAuB,oEAAoE,cAAc;AAC3K,wCAAwC,qMAAqM,iFAAiF,uBAAuB,sCAAsC,SAAS,aAAa,uDAAuD,uBAAuB;AAC/d,SAAS,aAAa,wDAAwD,gBAAgB,6IAA6I,MAAM,YAAY,sEAAsE,aAAa,sEAAsE,eAAe,4EAA4E,eAAe;AAChgB,2CAA2C,KAAK,8CAA8C,4EAA4E,2DAA2D,0EAA0E,6DAA6D,qBAAqB,wCAAwC;AACza,iGAAiG,sBAAsB,kBAAkB,uBAAuB,iBAAiB,WAAW,kBAAkB,uBAAuB,iBAAiB,WAAW,kBAAkB,IAAI,WAAW,IAAI,IAAI,IAAI,QAAQ,EAAE,YAAY,IAAI,QAAQ,EAAE,YAAY,KAAK,MAAM,aAAa,KAAK,MAAM,aAAa,KAAK,IAAI,EAAE,kCAAkC,QAAQ,QAAQ,OAAO,YAAY,IAAI,SAAS,SAAS,EAAE;AACtf,YAAY,yBAAyB,UAAU,QAAQ,SAAS,SAAS,EAAE,cAAc,yBAAyB,UAAU,QAAQ,QAAQ,WAAW,yBAAyB,eAAe,MAAM,uBAAuB,aAAa,oCAAoC,iBAAiB;AAC9R,iBAAiB,oBAAoB,yEAAyE,sCAAsC,gCAAgC,QAAQ,WAAW,uDAAuD,SAAS,eAAe,QAAQ,oBAAoB,SAAS,YAAY,KAAK,gCAAgC,KAAK,SAAS,4CAA4C,qBAAqB,eAAe;AAC1c,eAAe,kBAAkB,wDAAwD,iBAAiB,EAAE,oCAAoC,gBAAgB,sBAAsB,kBAAkB,EAAE,EAAE,wBAAwB,wBAAwB,YAAY,SAAS,+BAA+B,KAAK,KAAK,kBAAkB,EAAE,EAAE,UAAU,KAAK,IAAI,IAAI,MAAM,UAAU,KAAK,IAAI,IAAI,MAAM,YAAY,OAAO,cAAc,EAAE,EAAE,UAAU,KAAK,IAAI,IAAI,MAAM,UAAU,KAAK,IAAI,IAAI,MAAM,YAAY;AACrf,iBAAiB,gCAAgC,0BAA0B,mCAAmC,eAAe,QAAQ,kBAAkB,aAAa,EAAE,iCAAiC,sCAAsC,KAAK,eAAe,KAAK,WAAW,EAAE,uCAAuC,WAAW,0BAA0B,aAAa;AAC5W,iBAAiB,uDAAuD,eAAe,0BAA0B,gEAAgE,gBAAgB,mBAAmB,EAAE,eAAe,gBAAgB,wDAAwD,eAAe;AAC5T,QAAQ,2MAA2M,KAAK;AACxN,qHAAqH,eAAe,gBAAgB,UAAU,uBAAuB,+BAA+B,gJAAgJ,oIAAoI;AACxe,eAAe,qBAAqB,uDAAuD,mBAAmB,kFAAkF,gBAAgB,kBAAkB,gBAAgB,4HAA4H,eAAe,sDAAsD,gBAAgB,mBAAmB;AACtd,mBAAmB,oBAAoB,8FAA8F,4BAA4B;AACjK;AACA,mKAAmK,OAAO,iBAAiB,WAAW,OAAO,2CAA2C,GAAG,yBAAyB,+BAA+B,mCAAmC,QAAQ;AAC9V;AACA,qRAAqR,SAAS,EAAE,uBAAuB,SAAS;AAChU,QAAQ,yDAAyD,QAAQ,wCAAwC,iCAAiC,YAAY,kBAAkB,UAAU,yCAAyC,iCAAiC,MAAM,8BAA8B,MAAM,yCAAyC,0IAA0I,MAAM;AACve,GAAG,MAAM,2EAA2E,MAAM,6BAA6B,MAAM,aAAa,MAAM,mBAAmB,MAAM,kBAAkB,MAAM,yCAAyC,MAAM,yKAAyK,MAAM,YAAY,uBAAuB,MAAM,UAAU;AACld,MAAM,eAAe,uBAAuB,GAAG,OAAO,oBAAoB,MAAM,MAAM,QAAQ,SAAS,YAAY,2CAA2C,YAAY,oBAAoB,QAAQ,SAAS,QAAQ,qBAAqB,KAAK,iBAAiB,wBAAwB,iBAAiB,mCAAmC,YAAY,KAAK,YAAY,6CAA6C,UAAU;AACla,gBAAgB,kBAAkB,iCAAiC,2BAA2B,iBAAiB,kBAAkB,iCAAiC,2BAA2B,iBAAiB;AAC9M,iBAAiB,OAAO,YAAY,QAAQ,uDAAuD,cAAc,eAAe,iBAAiB,gBAAgB,eAAe,IAAI,QAAQ,wDAAwD,IAAI,SAAS,QAAQ,yGAAyG,SAAS;AAC3X,eAAe,oEAAoE,EAAE,iBAAiB,eAAe,qDAAqD,sCAAsC,IAAI,+BAA+B,SAAS,eAAe,eAAe,KAAK,gBAAgB,gBAAgB;AAC/T,iBAAiB,YAAY,IAAI,UAAU,EAAE,EAAE,mBAAmB,yBAAyB,qBAAqB,mBAAmB,IAAI,GAAG,KAAK,EAAE,EAAE,kBAAkB,gBAAgB,QAAQ,eAAe,SAAS,SAAS,iBAAiB;AAC/O,cAAc,wBAAwB,iCAAiC,EAAE,IAAI,gCAAgC,SAAS,MAAM,iBAAiB,SAAS,eAAe,8CAA8C;AACnN,oEAAoE,QAAQ,yBAAyB,8CAA8C,2GAA2G;AAC9P,iBAAiB,+DAA+D,wCAAwC,KAAK,+BAA+B,0CAA0C,6EAA6E,oGAAoG,EAAE;AACzX,QAAQ,8CAA8C,iEAAiE,YAAY,GAAG,QAAQ,cAAc,YAAY,WAAW,KAAK,WAAW,gCAAgC,KAAK,SAAS,KAAK,KAAK,iBAAiB,iBAAiB,UAAU,oEAAoE,MAAM,0BAA0B,MAAM,uBAAuB,MAAM,sEAAsE;AACpf,2CAA2C,cAAc,gKAAgK,MAAM,MAAM,MAAM,6BAA6B,kHAAkH,EAAE,eAAe,SAAS,kCAAkC,gBAAgB,EAAE;AACxc,iBAAiB,KAAK,gBAAgB,IAAI,iCAAiC,SAAS,qBAAqB,YAAY,MAAM,KAAK,YAAY,WAAW,mBAAmB,QAAQ,WAAW,4GAA4G,KAAK,WAAW,OAAO,QAAQ,WAAW,KAAK,mBAAmB,iBAAiB,6BAA6B,OAAO,kCAAkC;AAClc,iBAAiB,+CAA+C,WAAW,IAAI,0EAA0E,EAAE,iBAAiB,cAAc,qJAAqJ,iBAAiB;AAChW,iBAAiB,kBAAkB,oFAAoF,6DAA6D,eAAe,oBAAoB,8CAA8C,QAAQ;AAC7Q,eAAe,UAAU,8CAA8C,uDAAuD,8CAA8C,iBAAiB;AAC7L,6BAA6B,kFAAkF,yCAAyC,kBAAkB,EAAE,GAAG,eAAe,0DAA0D,KAAK,qCAAqC,gCAAgC,oBAAoB,aAAa,6BAA6B,KAAK,aAAa,8BAA8B;AAChb,iBAAiB,MAAM,mBAAmB,uCAAuC,cAAc,QAAQ;AACvG,QAAQ;AACR,0HAA0H,8BAA8B,oCAAoC,uBAAuB,6CAA6C,YAAY,EAAE;AAC9Q,iBAAiB,UAAU,uCAAuC,0BAA0B,QAAQ,WAAW,2HAA2H,4BAA4B,6BAA6B,UAAU,YAAY,EAAE,yHAAyH;AACpb,iBAAiB;AACjB,iBAAiB,oDAAoD,UAAU,kLAAkL;AACjQ,iBAAiB,oDAAoD,YAAY,QAAQ,YAAY,WAAW,KAAK,WAAW,gCAAgC,UAAU,6BAA6B,MAAM,uCAAuC,aAAa,UAAU,WAAW,MAAM,0CAA0C,MAAM,gDAAgD,mCAAmC,UAAU,eAAe;AACxb,iBAAiB,UAAU,6EAA6E,SAAS,iBAAiB,sOAAsO,eAAe,oBAAoB,kCAAkC,iBAAiB;AAC9b,eAAe,mBAAmB,kCAAkC,iBAAiB,SAAS,QAAQ,gBAAgB,cAAc,0CAA0C,gBAAgB,KAAK,iBAAiB,YAAY,SAAS,IAAI,WAAW,IAAI,WAAW;AACvQ,iBAAiB,0BAA0B,gBAAgB,kBAAkB,2GAA2G,QAAQ,GAAG,qBAAqB,iHAAiH,SAAS,cAAc,sBAAsB,4BAA4B,eAAe,OAAO,OAAO,eAAe,OAAO;AACrc,mBAAmB,+BAA+B,SAAS,SAAS,mBAAmB,kBAAkB,sBAAsB,kDAAkD,sBAAsB,yDAAyD,WAAW,MAAM,eAAe,kBAAkB,qDAAqD,aAAa,SAAS,iBAAiB;AAC9Y,mBAAmB,kBAAkB,kBAAkB,6FAA6F,SAAS,oBAAoB,eAAe,mBAAmB,IAAI,YAAY;AACnO,eAAe,gEAAgE,qCAAqC,2CAA2C,IAAI,kBAAkB,kBAAkB,gCAAgC,EAAE,kBAAkB,mCAAmC,EAAE,UAAU;AAC1S,qBAAqB,WAAW,WAAW,kEAAkE,aAAa,cAAc,oBAAoB,wFAAwF,YAAY,iBAAiB,sDAAsD,+CAA+C,oBAAoB,eAAe,cAAc;AACva,mBAAmB,kBAAkB,oMAAoM,4CAA4C,uDAAuD,gBAAgB,gCAAgC,gCAAgC,4BAA4B,kDAAkD;AAC1e,gBAAgB,YAAY;AAC5B,mBAAmB,qBAAqB,UAAU,aAAa,qCAAqC,gCAAgC,iBAAiB,oCAAoC,aAAa,KAAK,MAAM,aAAa,KAAK,MAAM,mEAAmE,aAAa,MAAM,4DAA4D,aAAa,QAAQ,aAAa,QAAQ,aAAa,QAAQ,uCAAuC,IAAI,SAAS;AAC9e,uBAAuB,kBAAkB,SAAS,mBAAmB,SAAS,qBAAqB,kBAAkB,mBAAmB,SAAS,mBAAmB,qBAAqB,mBAAmB,SAAS,mBAAmB,oDAAoD,mBAAmB,aAAa,oFAAoF;AAChZ,iBAAiB,cAAc,4BAA4B,6HAA6H,QAAQ,iBAAiB,mGAAmG,YAAY,2BAA2B,IAAI,yBAAyB,+BAA+B,mBAAmB;AAC1a,eAAe,OAAO,iLAAiL,eAAe,OAAO;AAC7N,eAAe,OAAO,6EAA6E,iBAAiB;AACpH,iBAAiB,kBAAkB,aAAa,oBAAoB,WAAW,gDAAgD,yLAAyL;AACxT,iBAAiB,oBAAoB,qDAAqD,8HAA8H,iBAAiB,kBAAkB,qDAAqD;AAChT,yBAAyB,cAAc,gEAAgE,wCAAwC,mBAAmB,wCAAwC,8BAA8B,WAAW,MAAM,aAAa;AACtQ,uBAAuB,MAAM,UAAU,qDAAqD,SAAS,EAAE,uBAAuB,QAAQ,sCAAsC,0KAA0K,SAAS,OAAO,4BAA4B,SAAS,EAAE,uBAAuB,QAAQ,kDAAkD;AAC9d,2LAA2L,SAAS,8BAA8B,mDAAmD,0BAA0B,cAAc,gBAAgB,wBAAwB,mBAAmB;AACxX,mBAAmB,iLAAiL,oBAAoB,gCAAgC,4BAA4B,gDAAgD,iBAAiB,KAAK,SAAS,EAAE,iBAAiB,aAAa,gBAAgB,QAAQ,wCAAwC,UAAU;AAC7c,iBAAiB,OAAO,8BAA8B,QAAQ,aAAa,yBAAyB,iBAAiB,sBAAsB,wBAAwB,kBAAkB,eAAe,iBAAiB,QAAQ,gCAAgC,eAAe,KAAK,WAAW;AAC5R,iBAAiB,0BAA0B,yDAAyD,GAAG,oCAAoC,kFAAkF,uBAAuB,SAAS,IAAI,WAAW,KAAK,WAAW,KAAK,YAAY,eAAe,uBAAuB;AACnV,iBAAiB,UAAU,UAAU,UAAU,iBAAiB,UAAU,kEAAkE,MAAM,4EAA4E,OAAO,SAAS,eAAe,OAAO,QAAQ,QAAQ,eAAe,eAAe,oBAAoB,mBAAmB,4BAA4B,eAAe,iCAAiC;AACra,qBAAqB,kBAAkB,SAAS,6BAA6B,MAAM,kBAAkB,gBAAgB;AACrH,QAAQ,sBAAsB,6CAA6C,iCAAiC,wBAAwB,WAAW,UAAU,YAAY,YAAY,qCAAqC,QAAQ,QAAQ,qCAAqC,wBAAwB,WAAW,UAAU,YAAY,QAAQ,YAAY,qCAAqC,QAAQ,QAAQ,kCAAkC,wBAAwB,WAAW,UAAU,YAAY,QAAQ;AAChf,4BAA4B,QAAQ,UAAU,2BAA2B,cAAc,qJAAqJ,qBAAqB,UAAU,kFAAkF,gGAAgG;AAC7b,qBAAqB,sCAAsC,UAAU,wBAAwB,UAAU,kBAAkB,gBAAgB,kDAAkD,6BAA6B,6DAA6D;AACrR,6NAA6N,0DAA0D;AACvR,mBAAmB,QAAQ,yDAAyD,aAAa,WAAW,aAAa,wDAAwD,oBAAoB,WAAW,wFAAwF,cAAc,aAAa,oBAAoB,EAAE,6BAA6B,eAAe,SAAS,oCAAoC,2BAA2B;AAC7c,iBAAiB,qGAAqG,8BAA8B;AACpJ,eAAe,gBAAgB,MAAM,mBAAmB,sEAAsE,kBAAkB,eAAe,gBAAgB,kBAAkB,KAAK,SAAS,oBAAoB,YAAY,gBAAgB,cAAc,SAAS,0DAA0D,SAAS,kBAAkB,YAAY,UAAU,eAAe,SAAS,kBAAkB,UAAU,eAAe,cAAc;AACld,OAAO,cAAc,SAAS,cAAc,uCAAuC,SAAS,oBAAoB,4DAA4D,WAAW,WAAW,SAAS,oBAAoB,kFAAkF,iBAAiB,gBAAgB,WAAW,SAAS,oBAAoB;AAC1X,4BAA4B,wBAAwB,WAAW,SAAS,sBAAsB,8DAA8D,WAAW,WAAW,SAAS,kBAAkB,oFAAoF,kCAAkC,mBAAmB,gEAAgE,6CAA6C;AACnc,IAAI,QAAQ,YAAY,oBAAoB,0BAA0B,+EAA+E,kCAAkC,mBAAmB,iFAAiF,yCAAyC,qDAAqD,QAAQ,YAAY,sBAAsB;AACna,kCAAkC,mBAAmB,0GAA0G,8DAA8D,wDAAwD,QAAQ,YAAY,oBAAoB,uCAAuC,qBAAqB,KAAK,mCAAmC,oBAAoB,aAAa,gBAAgB,MAAM;AACxd,GAAG,WAAW,yBAAyB,IAAI,IAAI,gCAAgC,aAAa,KAAK,WAAW,6DAA6D,SAAS,aAAa,WAAW,uHAAuH,yBAAyB,cAAc,EAAE,SAAS,oBAAoB,YAAY,sCAAsC,YAAY,wBAAwB;AAC7d,oBAAoB,kBAAkB,gBAAgB,mCAAmC,uBAAuB,aAAa,SAAS,MAAM,iCAAiC,WAAW,yBAAyB,IAAI,IAAI,0BAA0B,aAAa,KAAK,QAAQ,oFAAoF,SAAS,aAAa,QAAQ;AAC/X,uBAAuB,yBAAyB,cAAc,EAAE,SAAS,yBAAyB,+DAA+D,wBAAwB,oCAAoC,wBAAwB,WAAW,QAAQ,QAAQ,SAAS,EAAE,uDAAuD,eAAe,8CAA8C,gBAAgB,WAAW,IAAI,QAAQ,KAAK,OAAO,MAAM,YAAY,YAAY;AAChe,kFAAkF,YAAY,WAAW,YAAY,SAAS,EAAE,uHAAuH,eAAe,wBAAwB,WAAW,IAAI,QAAQ,KAAK,OAAO,MAAM,YAAY,YAAY,iBAAiB,WAAW,IAAI,YAAY;AAC3Y,qDAAqD,2BAA2B,2BAA2B,WAAW,4CAA4C,0EAA0E,eAAe,8CAA8C,iBAAiB,4BAA4B,iBAAiB,cAAc,WAAW,cAAc;AAC9Y,iBAAiB,cAAc,oBAAoB,oEAAoE,sCAAsC,0FAA0F,kBAAkB,eAAe,OAAO,SAAS,MAAM,QAAQ,aAAa,QAAQ,iBAAiB,eAAe,MAAM,KAAK,OAAO,SAAS,KAAK,SAAS;AACpZ,eAAe,eAAe,+BAA+B,YAAY,KAAK,eAAe,mBAAmB,6BAA6B,aAAa,sEAAsE,EAAE,iBAAiB,MAAM,2BAA2B,SAAS,cAAc,WAAW;AACtT,eAAe,uBAAuB,6BAA6B,4BAA4B,eAAe,kDAAkD,uBAAuB,iBAAiB,kCAAkC,gBAAgB,2BAA2B,kBAAkB,aAAa,wDAAwD,MAAM,4BAA4B,oBAAoB;AACla,uBAAuB,WAAW,YAAY,+EAA+E,SAAS,WAAW,kBAAkB,eAAe,iBAAiB,YAAY,4DAA4D,uBAAuB,wBAAwB,UAAU,QAAQ,SAAS,eAAe,WAAW,kBAAkB;AACjY,uBAAuB,SAAS,SAAS,MAAM,UAAU,QAAQ,mCAAmC,gEAAgE,eAAe,iBAAiB,8DAA8D,aAAa,cAAc,wBAAwB,iHAAiH,YAAY,KAAK,KAAK,cAAc,kBAAkB,UAAU;AACte,oBAAoB,UAAU,iCAAiC,+MAA+M,MAAM,sBAAsB,YAAY,oBAAoB,4CAA4C;AACtX,ieAAie;AACje;AACA;AACA,iYAAiY;AACjY,yBAAyB,QAAQ,2BAA2B,yCAAyC,cAAc,aAAa,wBAAwB,eAAe,0CAA0C,WAAW,wBAAwB,wBAAwB,cAAc,eAAe,eAAe,kBAAkB,mGAAmG;AAC7a,iBAAiB,sBAAsB,MAAM,IAAI,iBAAiB,0CAA0C;AAC5G,qBAAqB,yBAAyB,qBAAqB,8DAA8D,QAAQ,QAAQ,wEAAwE,UAAU,cAAc,UAAU,4BAA4B,4BAA4B,6BAA6B,oBAAoB,kBAAkB,QAAQ,SAAS,eAAe,qFAAqF,QAAQ;AACnf,kBAAkB,8DAA8D,iCAAiC,mCAAmC,aAAa,cAAc,wBAAwB,YAAY,wBAAwB,QAAQ,WAAW,kBAAkB;AAChR,mBAAmB,8DAA8D,4BAA4B,0BAA0B,4CAA4C,mBAAmB,UAAU,wCAAwC,UAAU,eAAe,iBAAiB,0EAA0E,eAAe;AAC3X,mBAAmB,uBAAuB,6BAA6B,cAAc,aAAa,KAAK,MAAM,aAAa,MAAM,wBAAwB,MAAM,qCAAqC,MAAM,uCAAuC,MAAM,oCAAoC,iBAAiB,mBAAmB,cAAc,+BAA+B,8CAA8C,iCAAiC,iBAAiB,sBAAsB,kBAAkB;AACnf,8CAA8C,+FAA+F,aAAa,gBAAgB,yBAAyB,kBAAkB,0BAA0B,8BAA8B,0BAA0B,0BAA0B,KAAK,cAAc,yFAAyF,4DAA4D,UAAU;AACnf,aAAa,gBAAgB,SAAS,iBAAiB,iDAAiD,oDAAoD,QAAQ,mIAAmI,SAAS,kEAAkE,oBAAoB;AACtY,UAAU,+CAA+C,gGAAgG,oEAAoE,8EAA8E,8EAA8E,WAAW,kBAAkB,iBAAiB,kBAAkB,UAAU,kBAAkB,QAAQ,aAAa;AAC1e,oIAAoI,UAAU,wCAAwC,YAAY,SAAS,0CAA0C,SAAS,EAAE,2BAA2B,aAAa,GAAG,0CAA0C,yBAAyB,YAAY,QAAQ,QAAQ,+DAA+D,cAAc;AACvd,0CAA0C,mBAAmB,SAAS,EAAE,cAAc,wKAAwK,+FAA+F,WAAW,YAAY,UAAU,SAAS,gBAAgB,uDAAuD,uBAAuB,aAAa;AAClf,EAAE,EAAE,UAAU,OAAO,MAAM,YAAY,aAAa,kBAAkB,IAAI,MAAM,WAAW,KAAK,oBAAoB,UAAU,SAAS,yJAAyJ,kBAAkB,eAAe,eAAe,kCAAkC;AAClX,uBAAuB,sBAAsB,UAAU,kBAAkB,cAAc,OAAO,UAAU,uBAAuB,UAAU,KAAK,MAAM,wBAAwB,UAAU,KAAK,MAAM,oBAAoB,IAAI,aAAa,EAAE,MAAM,IAAI,aAAa,EAAE,KAAK,MAAM,0BAA0B,UAAU,KAAK,MAAM,qFAAqF,QAAQ,WAAW,WAAW;AAC9a,GAAG,WAAW,yCAAyC,WAAW,kMAAkM,YAAY,WAAW,sBAAsB,uEAAuE,kEAAkE,WAAW;AACrc,KAAK,aAAa,oCAAoC,+VAA+V,6BAA6B,IAAI,2BAA2B,qBAAqB;AACte,iBAAiB,yBAAyB,8BAA8B,qBAAqB,UAAU,gCAAgC,IAAI,iBAAiB,SAAS,sBAAsB,SAAS,GAAG,eAAe,YAAY,yCAAyC,QAAQ,SAAS,QAAQ;AACpS,eAAe,8BAA8B,cAAc,oBAAoB,kBAAkB,kDAAkD,yEAAyE,SAAS,QAAQ,MAAM,aAAa,MAAM,cAAc,eAAe;AACnS,eAAe,GAAG,mBAAmB,SAAS,EAAE,UAAU,QAAQ,QAAQ,WAAW,SAAS,SAAS,eAAe,cAAc,qBAAqB,KAAK,MAAM,mCAAmC,KAAK,MAAM,mCAAmC,KAAK,MAAM,iBAAiB,4CAA4C,aAAa,EAAE,KAAK,iBAAiB,EAAE,kCAAkC,OAAO,QAAQ,WAAW,0BAA0B,gBAAgB,qBAAqB,EAAE;AACje,wCAAwC,gCAAgC,qBAAqB,cAAc,SAAS,aAAa,EAAE,mCAAmC,0BAA0B,kEAAkE,mCAAmC,kKAAkK,mCAAmC;AAC1e,EAAE,UAAU,SAAS,eAAe,KAAK,iBAAiB,EAAE,wCAAwC,WAAW,0BAA0B;AACzI,eAAe,oCAAoC,EAAE,OAAO,WAAW,QAAQ,EAAE,yBAAyB,cAAc,qBAAqB,KAAK,QAAQ,mCAAmC,KAAK,QAAQ,mCAAmC,KAAK,QAAQ,WAAW,KAAK,yBAAyB,mBAAmB,+DAA+D,KAAK,eAAe,KAAK,iBAAiB,EAAE,yCAAyC,WAAW,0BAA0B,YAAY;AAC3f,2GAA2G,2EAA2E,iBAAiB,UAAU,SAAS,eAAe,KAAK,iBAAiB,EAAE,wCAAwC,WAAW,kBAAkB,0BAA0B;AAChW,iBAAiB,cAAc,oBAAoB,yBAAyB,YAAY,mDAAmD,SAAS,oBAAoB,mBAAmB,aAAa,QAAQ,qDAAqD,QAAQ,UAAU,QAAQ,WAAW,MAAM,oBAAoB,6FAA6F,UAAU,qBAAqB,MAAM,wBAAwB,MAAM;AACpe,0MAA0M,MAAM,0CAA0C,sCAAsC,MAAM,aAAa,cAAc,cAAc,kBAAkB,mBAAmB,QAAQ,QAAQ,WAAW,cAAc,cAAc,sBAAsB,MAAM,SAAS;AAChd,mBAAmB,QAAQ,QAAQ,kBAAkB,0EAA0E,0CAA0C,wBAAwB,QAAQ,0BAA0B,6BAA6B,EAAE,EAAE;AACpQ,eAAe,cAAc,wBAAwB,kBAAkB,8CAA8C,iGAAiG,4FAA4F,yBAAyB,oEAAoE,yBAAyB,0BAA0B;AAClc,QAAQ,eAAe,uFAAuF,cAAc,+BAA+B,SAAS,EAAE,QAAQ,cAAc,sCAAsC,4BAA4B,MAAM,+CAA+C,4BAA4B,MAAM,aAAa,MAAM,MAAM,aAAa,MAAM,aAAa,MAAM,cAAc,WAAW,QAAQ,IAAI,MAAM;AAC/b,eAAe,MAAM,EAAE,yCAAyC,0BAA0B,QAAQ,IAAI,qBAAqB,cAAc,oBAAoB,wBAAwB,MAAM,qCAAqC,MAAM,aAAa,MAAM,cAAc,qEAAqE,kDAAkD,MAAM,MAAM,aAAa,8BAA8B;AACrb,KAAK,WAAW,oBAAoB,UAAU,IAAI,cAAc,mCAAmC,QAAQ,QAAQ,SAAS,IAAI,UAAU,wCAAwC,MAAM,kCAAkC,YAAY,eAAe,MAAM,2BAA2B,MAAM,iDAAiD,YAAY,MAAM,yBAAyB,cAAc,MAAM,6BAA6B,MAAM,qBAAqB,eAAe,iBAAiB,MAAM;AAC1e,CAAC,0BAA0B,eAAe,iBAAiB,MAAM,wDAAwD,QAAQ,OAAO,0NAA0N,UAAU,mBAAmB,WAAW,MAAM,sBAAsB,QAAQ,MAAM,kCAAkC;AACtd,eAAe,IAAI,gBAAgB,iBAAiB,SAAS,KAAK,IAAI,IAAI,IAAI,mCAAmC,uBAAuB,iKAAiK,QAAQ,4FAA4F,IAAI,QAAQ,QAAQ,wBAAwB,SAAS,EAAE;AACpc,mCAAmC,iBAAiB,UAAU,SAAS,eAAe,KAAK,iBAAiB,EAAE,yCAAyC,WAAW,0BAA0B,YAAY,IAAI,IAAI,IAAI,kBAAkB,UAAU,wCAAwC,IAAI,MAAM,kCAAkC,YAAY,eAAe,IAAI,MAAM,2BAA2B,IAAI,MAAM,iDAAiD,YAAY,IAAI,MAAM,yBAAyB;AAC9e,GAAG,IAAI,MAAM,6BAA6B,IAAI,MAAM,qBAAqB,UAAU,eAAe,iBAAiB,MAAM,wBAAwB,MAAM,+BAA+B,0BAA0B,MAAM,IAAI,aAAa,EAAE,eAAe,iBAAiB,MAAM,wBAAwB,UAAU,eAAe,iBAAiB,MAAM,YAAY,QAAQ,SAAS,gBAAgB,mCAAmC,WAAW;AAClb,2QAA2Q,UAAU,mBAAmB,WAAW,MAAM,sBAAsB,QAAQ,MAAM,oEAAoE,MAAM,kBAAkB,wBAAwB,UAAU;AAC3d,iEAAiE,MAAM,sDAAsD,mBAAmB,cAAc,iCAAiC,wCAAwC,MAAM;AAC7O,wBAAwB,MAAM,sBAAsB,cAAc,aAAa,cAAc,cAAc,aAAa,MAAM,MAAM,cAAc,MAAM,cAAc,gBAAgB,iBAAiB,SAAS,IAAI,uDAAuD,IAAI,cAAc,SAAS,EAAE,mBAAmB,wBAAwB,yBAAyB,yBAAyB,YAAY,wBAAwB,qBAAqB;AAC9b,2OAA2O,KAAK,UAAU,sCAAsC,6DAA6D,qBAAqB,gBAAgB,WAAW,YAAY,eAAe,0BAA0B,oBAAoB,gBAAgB;AACte,mBAAmB,mBAAmB,MAAM,wBAAwB,mCAAmC,iGAAiG,SAAS,GAAG,IAAI,UAAU,gBAAgB,SAAS,UAAU,SAAS,SAAS,SAAS,uBAAuB,KAAK,yBAAyB,mBAAmB,uBAAuB,KAAK,GAAG,gBAAgB,IAAI,iBAAiB,gCAAgC,MAAM,UAAU,GAAG,cAAc;AAC7e,KAAK,mBAAmB,YAAY,QAAQ,QAAQ,kBAAkB,kBAAkB,qGAAqG,kBAAkB,mBAAmB,YAAY,QAAQ,SAAS,WAAW,gBAAgB,QAAQ,WAAW,MAAM,SAAS,MAAM,mCAAmC,iCAAiC,qCAAqC,KAAK,sBAAsB,yBAAyB,QAAQ,OAAO;AAC9e,wBAAwB,qBAAqB,uCAAuC,cAAc,qBAAqB,oCAAoC,wBAAwB,sBAAsB,yFAAyF,0BAA0B,wBAAwB,mHAAmH,QAAQ,kCAAkC,OAAO;AACxf,IAAI,cAAc,+BAA+B,qBAAqB,mBAAmB,QAAQ,gCAAgC;AACjI,iBAAiB,MAAM,GAAG,wBAAwB,eAAe,SAAS,EAAE,cAAc,gCAAgC,0HAA0H,UAAU,YAAY,QAAQ,QAAQ,SAAS,QAAQ,MAAM,iBAAiB,YAAY,QAAQ,QAAQ,SAAS,QAAQ,WAAW,mDAAmD,SAAS;AACtb,iBAAiB,wHAAwH,2BAA2B;AACpK,iBAAiB,GAAG,+DAA+D,kBAAkB,2EAA2E,eAAe,qCAAqC,KAAK,KAAK,SAAS,EAAE,cAAc,8EAA8E,0FAA0F,+BAA+B,cAAc,QAAQ,WAAW,QAAQ;AACvf,GAAG,sBAAsB,QAAQ,oBAAoB,IAAI,mBAAmB,wIAAwI,yDAAyD,yDAAyD,wBAAwB,uBAAuB,SAAS,KAAK,IAAI,kBAAkB,QAAQ;AACja,6KAA6K,cAAc,mCAAmC,iBAAiB,WAAW,eAAe,+CAA+C,KAAK,uBAAuB,gCAAgC,mBAAmB,EAAE,cAAc,eAAe,KAAK,oCAAoC;AAC/c,cAAc,eAAe,4BAA4B,SAAS,EAAE,uBAAuB,UAAU,mCAAmC,4BAA4B,6BAA6B,MAAM,qFAAqF,eAAe,IAAI,sBAAsB,yBAAyB,MAAM,sEAAsE,sBAAsB,KAAK,sBAAsB,eAAe;AAC1e,IAAI,uBAAuB,IAAI,IAAI,eAAe,2BAA2B,KAAK,QAAQ,GAAG,uBAAuB,gDAAgD,sBAAsB,aAAa;AACvM,iBAAiB,KAAK,KAAK,4BAA4B,6CAA6C,+BAA+B,UAAU,+BAA+B,iBAAiB,0BAA0B,eAAe,QAAQ,MAAM,KAAK,QAAQ,kCAAkC,WAAW,KAAK,WAAW,IAAI,gBAAgB,SAAS,kBAAkB;AAC7W,mBAAmB,kBAAkB,KAAK,iBAAiB,qBAAqB,yFAAyF,uIAAuI;AAChT,mBAAmB,mBAAmB,2EAA2E,iBAAiB,mBAAmB,OAAO,oBAAoB,wBAAwB,SAAS,8BAA8B,gCAAgC,sBAAsB,gCAAgC,mBAAmB,4BAA4B,wBAAwB,cAAc;AAC1Z,4UAA4U,QAAQ,gBAAgB,kGAAkG,MAAM,OAAO,UAAU;AAC7d,CAAC,2CAA2C,QAAQ,6CAA6C,uCAAuC,wBAAwB,eAAe,mCAAmC,gBAAgB,IAAI,sBAAsB,UAAU,OAAO,QAAQ,qCAAqC,QAAQ,EAAE,WAAW,EAAE,sCAAsC,sCAAsC,wCAAwC,iCAAiC,IAAI,IAAI,MAAM,EAAE;AACtf,UAAU,sBAAsB,sBAAsB,kCAAkC,IAAI,eAAe,IAAI,uBAAuB,eAAe,YAAY,MAAM,eAAe,YAAY,IAAI,gCAAgC,MAAM,QAAQ,SAAS,EAAE,KAAK,SAAS,IAAI,KAAK,SAAS,EAAE,oBAAoB,kBAAkB,oBAAoB,4CAA4C,sDAAsD,wBAAwB,wBAAwB;AAC7e,GAAG,yCAAyC,QAAQ,oCAAoC,kBAAkB,gBAAgB,UAAU,UAAU,iEAAiE,QAAQ,SAAS,EAAE,KAAK,SAAS,IAAI,KAAK,SAAS,EAAE,kBAAkB,yBAAyB,UAAU,kBAAkB,aAAa,YAAY,0DAA0D,aAAa,aAAa,gBAAgB,MAAM,aAAa,gBAAgB;AAC3e,GAAG,MAAM,yBAAyB,MAAM,0GAA0G,gBAAgB,UAAU,UAAU,iEAAiE,KAAK,OAAO,gBAAgB,mBAAmB,qEAAqE;AAC3W,qeAAqe,KAAK,QAAQ,eAAe;AACjgB,oBAAoB,4CAA4C,EAAE,uCAAuC,QAAQ,WAAW,iEAAiE,QAAQ,QAAQ,QAAQ,YAAY,QAAQ,SAAS,EAAE,KAAK,SAAS,IAAI,QAAQ,SAAS,EAAE,mBAAmB,UAAU,mBAAmB,IAAI,IAAI,cAAc,gCAAgC,oGAAoG,KAAK;AACxe,oBAAoB,wBAAwB,wBAAwB,kEAAkE,qBAAqB,0EAA0E,MAAM,4BAA4B,cAAc,OAAO,sCAAsC,2BAA2B,MAAM,kCAAkC,aAAa,MAAM,0BAA0B,iEAAiE;AACnf,aAAa,aAAa,cAAc,cAAc,kBAAkB,WAAW,aAAa,cAAc,mBAAmB,cAAc,iBAAiB,MAAM,cAAc,6CAA6C,oBAAoB,kBAAkB,MAAM,UAAU,UAAU,iEAAiE,SAAS,wCAAwC,oBAAoB,wBAAwB,2BAA2B,iBAAiB;AAC3e,EAAE,oBAAoB,cAAc,uDAAuD,eAAe,yBAAyB,mBAAmB,iBAAiB,iBAAiB,QAAQ,KAAK,IAAI,YAAY,QAAQ,sBAAsB,iBAAiB,WAAW,MAAM,IAAI,YAAY,QAAQ,OAAO,YAAY,mBAAmB,oBAAoB,iCAAiC,aAAa,QAAQ,IAAI,cAAc,QAAQ;AACvb,eAAe,gBAAgB,wBAAwB,GAAG,gDAAgD,QAAQ,GAAG,cAAc,6BAA6B,QAAQ,qBAAqB,wDAAwD,QAAQ,MAAM,kCAAkC,wDAAwD,SAAS,WAAW,gBAAgB,SAAS,SAAS,cAAc,aAAa,yBAAyB;AACvc,KAAK,SAAS,uBAAuB,gBAAgB,QAAQ,gDAAgD,IAAI,QAAQ,WAAW,WAAW,oBAAoB,yBAAyB,QAAQ,QAAQ,SAAS,qBAAqB,uBAAuB,UAAU,qBAAqB,eAAe,YAAY,wBAAwB,oBAAoB,gCAAgC;AACvY,mBAAmB,kEAAkE,OAAO;AAC5F,mBAAmB,UAAU,qBAAqB,SAAS,8BAA8B,QAAQ,aAAa,gBAAgB,2EAA2E,QAAQ,WAAW,KAAK,WAAW,2BAA2B,YAAY,iBAAiB,MAAM,UAAU,MAAM,wBAAwB,MAAM;AACxV,eAAe,mCAAmC,gBAAgB,0BAA0B,aAAa,gCAAgC,uCAAuC,oBAAoB,eAAe,gCAAgC,4BAA4B,qBAAqB,iBAAiB,+DAA+D,2BAA2B;AAC/Y,8BAA8B,yBAAyB,KAAK,sBAAsB,iCAAiC;AACnH,+BAA+B,8CAA8C,sCAAsC,sBAAsB,2BAA2B,aAAa,0FAA0F,mBAAmB,SAAS,eAAe,yBAAyB,gBAAgB,aAAa,kBAAkB,eAAe,IAAI,kBAAkB,IAAI,IAAI,WAAW,WAAW,aAAa,gBAAgB,iBAAiB;AAC/e,yCAAyC,qCAAqC,oCAAoC,uBAAuB,qBAAqB,sBAAsB,wBAAwB,WAAW,iBAAiB,cAAc,qBAAqB,mBAAmB,yCAAyC,8BAA8B,uBAAuB,KAAK,sBAAsB,iCAAiC;AACxb,kCAAkC,qBAAqB,mBAAmB,sBAAsB,wBAAwB,WAAW,KAAK,WAAW,wCAAwC;AAC3L,mBAAmB,4BAA4B,GAAG,wWAAwW;AAC1Z,kCAAkC,kCAAkC,oBAAoB,oBAAoB,yBAAyB,UAAU,iCAAiC,kCAAkC,oBAAoB,oBAAoB,4BAA4B,UAAU,+DAA+D,kCAAkC,oBAAoB,oBAAoB,sBAAsB;AAC/b,oCAAoC,2EAA2E,wCAAwC,KAAK,WAAW,+BAA+B,eAAe,UAAU,sBAAsB,UAAU,eAAe,6HAA6H,MAAM,MAAM,cAAc;AACra,iBAAiB,uHAAuH,gBAAgB,cAAc,kBAAkB;AACxL,uBAAuB,sBAAsB,4BAA4B,MAAM,0BAA0B,QAAQ,aAAa,0BAA0B,WAAW,iEAAiE,KAAK,gCAAgC,0BAA0B,QAAQ,aAAa,0BAA0B,WAAW,cAAc,iEAAiE,EAAE;AAC9a,iBAAiB,kEAAkE,sBAAsB;AACzG,QAAQ,wCAAwC,uBAAuB,2BAA2B,4BAA4B,4EAA4E,QAAQ,4BAA4B,SAAS,yBAAyB,yBAAyB,wBAAwB,yBAAyB,uDAAuD,uDAAuD,sBAAsB,oCAAoC;AAClgB,eAAe,4CAA4C,6BAA6B,2BAA2B,EAAE,SAAS,kCAAkC,kCAAkC,mFAAmF,kBAAkB,QAAQ,KAAK,IAAI,eAAe,QAAQ,gBAAgB,sCAAsC,QAAQ,KAAK,IAAI,MAAM,QAAQ,sBAAsB,qDAAqD;AAC/e,oDAAoD,SAAS,cAAc,mCAAmC,sBAAsB,8CAA8C,aAAa,gCAAgC,cAAc,IAAI,oCAAoC,QAAQ,iCAAiC,qCAAqC,oBAAoB,GAAG,GAAG,yFAAyF;AACtd,QAAQ,WAAW,eAAe;;;;;;;;AC1OrB;;AAEb,IAAI,IAAqC;AACzC,mBAAmB,mBAAO,CAAC,EAAkC;AAC7D,CAAC;AACD;AACA;;;;;;;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEa,4CAA4C,SAAS,EAAE;AACpE,4BAA4B,MAAM,kBAAkB,gCAAgC,gBAAgB,qCAAqC,gBAAgB,qCAAqC;AAC9L,MAAM,iEAAiE,gBAAgB,KAAK,KAAK,EAAE,eAAe,KAAK,0BAA0B,MAAM,kBAAkB,uCAAuC,+BAA+B,gBAAgB,iBAAiB,+BAA+B,IAAI,UAAU,QAAQ,6EAA6E,8DAA8D,8CAA8C;AAC9f,qCAAqC,aAAa,6BAA6B,mBAAmB,KAAK,iBAAiB,SAAS,EAAE,oBAAoB,oDAAoD,SAAS,iDAAiD,IAAI,cAAc,KAAK,6BAA6B,gBAAgB,qDAAqD,0BAA0B,KAAK,kBAAkB,KAAK,YAAY,oCAAoC,MAAM;AAC1e,OAAO,4CAA4C,SAAS,2EAA2E,2BAA2B,GAAG,uDAAuD,+CAA+C,IAAI,eAAe,UAAU,iDAAiD,yBAAyB,sBAAsB,YAAY,YAAY;AACha,SAAS,KAAK,cAAc,0CAA0C,OAAO,sDAAsD,gBAAgB,GAAG,yBAAyB,gBAAgB,eAAe,EAAE,EAAE,WAAW,UAAU,iDAAiD,iCAAiC,YAAY;;;;;;;;;;;;+yCCX/TC,I,yXAKJC,O,CAAU,UAAM,CACd,GAAMC,GAAI,MAAKC,MAAf,CACAC,QAAQC,GAAR,CAAYH,CAAZ,EACD,C,6HAPmB,CAClB,KAAKC,MAAL,CAAc,GAAIG,CAAA,iDAACA,CAACC,GAAN,CAAU,CAACC,EAAE,CAAH,CAAV,CAAd,CACD,C,uCAOQ,CACP,MACE,oEAAK,UAAU,KAAf,EACE,sEAAQ,QAAS,KAAKP,OAAtB,aADF,CADF,CAKD,C,iBAhBe,gD,EAmBlBQ,OAAOC,WAAP,CAAqB,iBAAMZ,UAASa,aAAT,CAAuB,QAAvB,EAAiCC,KAAjC,EAAN,EAArB,CAEe,yDAAAZ,GAAf,E;;;;;;ACxBA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,EAAE,KAA4D;AAC9D;AACA;AACA,CAAC,oBAAoB,cAAc;;AAEnC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;;;AAIA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,gBAAgB;AAChB;AACA;;AAEA;AACA;AACA;;AAEA;AACA,uBAAuB;AACvB,mBAAmB;;AAEnB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAoB,UAAU;AAC9B;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oCAAoC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA,6CAA6C,wBAAwB;AACrE;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA,YAAY;AACZ;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,mCAAmC,KAAK;AACxC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;;AAEA;;AAEA;;;;AAIA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,sBAAsB,gBAAgB;AACtC;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,sBAAsB,gBAAgB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;;;AAIA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;;;;AAKA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,sBAAsB,gBAAgB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA,uCAAuC,SAAS;AAChD;AACA;;AAEA;AACA;AACA,mFAAmF,yCAAyC;AAC5H;AACA;AACA,iFAAiF,yCAAyC;AAC1H;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA,yBAAyB;AACzB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,sBAAsB,gBAAgB;AACtC;AACA;AACA;AACA;AACA;AACA;;AAEA,2DAA2D;AAC3D;AACA;AACA,SAAS;AACT;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,sBAAsB,gBAAgB;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;AACA;;;AAGA,2CAA2C;;AAE3C,6CAA6C;;AAE7C,yCAAyC;;;AAGzC;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gBAAgB;AAChB,gBAAgB;AAChB;AACA;AACA;AACA,6EAA6E;AAC7E;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,oBAAoB;AACxC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,KAAK;AACL;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,OAAO;AACP,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,8BAA8B,SAAS;AACvC;AACA,KAAK;AACL;AACA;AACA,GAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,qBAAqB;AAC7D,SAAS;AACT;;AAEA,yBAAyB;AACzB;AACA,uBAAuB,sBAAsB;AAC7C;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA,mCAAmC,KAAK;AACxC;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA,0DAA0D,SAAS;AACnE;;AAEA;AACA;AACA;;AAEA;AACA,iDAAiD,eAAe;AAChE;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,gDAAgD;AAChD;AACA;;AAEA,+CAA+C;AAC/C;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,oDAAoD;AACpD;AACA;;AAEA,mDAAmD;AACnD;AACA;AACA;AACA,sBAAsB;AACtB;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,qDAAqD;AACrD;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;;;AAGA;;;;AAIA;AACA;AACA;AACA;;AAEA;AACA;AACA,4CAA4C,UAAU;AACtD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,oCAAoC,WAAW;AAC/C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,eAAe;AACf;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;;;;AAKA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;;;AAKA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;;;;AAKA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,4CAA4C,UAAU;AACtD;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oCAAoC,WAAW;AAC/C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;;;;AAKA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,eAAe;AACf;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;;;AAIA;;AAEA;AACA;AACA;AACA,mDAAmD,gBAAgB;AACnE;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,iDAAiD,gBAAgB;AACjE;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,oBAAoB,qBAAqB;AACzC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,iDAAiD,UAAU;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB,cAAc;AAClC;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,oBAAoB,uBAAuB;AAC3C;AACA;AACA;AACA,sCAAsC,iBAAiB;AACvD;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,uCAAuC,oBAAoB;AAC3D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,SAAS;AACT;AACA;AACA;AACA,sBAAsB,mBAAmB;AACzC;AACA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,aAAa;AACjC;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,oBAAoB,aAAa;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,sBAAsB;AAC5D,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,wBAAwB,oBAAoB;AAC5C;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA,iDAAiD;AACjD;AACA;;AAEA;AACA;AACA;;AAEA,qDAAqD;AACrD;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AAIA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,kBAAkB;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AAIA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,gCAAgC,eAAe;AAC/C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,KAAK;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,oBAAoB,uBAAuB;AAC3C;AACA;AACA;AACA;AACA;AACA;AACA,sCAAsC,iBAAiB;AACvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC,qBAAqB;AAC7D,SAAS;AACT;;AAEA;AACA;AACA;;AAEA;AACA,0CAA0C,KAAK;AAC/C;;AAEA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,4DAA4D;AAC5D;AACA,0BAA0B,+CAA+C;AACzE;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;;AAEA;AACA;;;;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB;AACxB;AACA;AACA;AACA;AACA,qDAAqD,wCAAwC;AAC7F,4DAA4D,gBAAgB;AAC5E;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,oDAAoD;AACpD;AACA;AACA,iDAAiD;AACjD;AACA;AACA;;AAEA,+DAA+D;AAC/D;AACA;AACA,+CAA+C;AAC/C;AACA;AACA;;AAEA,iEAAiE;AACjE;AACA;AACA;AACA,2BAA2B,wBAAwB;AACnD;AACA,0BAA0B,4CAA4C;AACtE;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,mEAAmE;AACnE;AACA,gDAAgD,mCAAmC;AACnF;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;;;AAIA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,+DAA+D;AAC/D,gDAAgD,wBAAwB;AACxE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;;;AAIA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,qEAAqE;AACrE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA,qCAAqC;AACrC;AACA,0DAA0D;AAC1D,2CAA2C;AAC3C;AACA;AACA,uCAAuC;AACvC,4CAA4C;AAC5C;AACA,6DAA6D;AAC7D,iDAAiD,kCAAkC;AACnF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA,yCAAyC;AACzC;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D;AAC/D;AACA,4BAA4B,8DAA8D;AAC1F;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA,4CAA4C;AAC5C;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,OAAO;AACP,kDAAkD;AAClD;AACA,yDAAyD;AACzD,iDAAiD,wBAAwB;AACzE;AACA;AACA,gCAAgC;AAChC;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+DAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,KAAK;AACL;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA,sBAAsB;AACtB;AACA,KAAK;AACL;AACA,sCAAsC,oCAAoC;AAC1E;;;AAGA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,wDAAwD;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,SAAS;AACT;AACA;AACA,OAAO;AACP;;AAEA;AACA;;;AAGA;AACA;AACA,4DAA4D;AAC5D;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,+DAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;;AAGA;AACA;AACA,6DAA6D;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA,+DAA+D;AAC/D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,OAAO;AACP;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA,KAAK,uBAAuB,oBAAoB;;AAEhD;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,WAAW;AACX;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;;AAGA;AACA;AACA;AACA,uBAAuB;AACvB;AACA;;;AAGA;AACA;AACA;AACA,kEAAkE;AAClE;AACA;AACA,SAAS;AACT,8CAA8C;AAC9C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuB;AACvB;AACA,kCAAkC,6CAA6C;AAC/E;AACA,uBAAuB,uBAAuB,EAAE;AAChD,uBAAuB,mBAAmB;AAC1C;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA,8BAA8B,mCAAmC;AACjE,iCAAiC,kDAAkD;AACnF;AACA,KAAK;AACL,8CAA8C,4CAA4C;AAC1F;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA,6DAA6D,cAAc;AAC3E;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,gBAAgB;AAC9D,4CAA4C,cAAc;AAC1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,qDAAqD,eAAe;AACpE;AACA,OAAO;AACP;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA,mDAAmD,KAAK;AACxD;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,2DAA2D;AAC3D,qEAAqE,qBAAqB;AAC1F;;AAEA,wDAAwD;AACxD,qEAAqE,qBAAqB;AAC1F;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA,KAAK;AACL;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,kBAAkB;AACvD,SAAS;AACT;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,mCAAmC,KAAK;AACxC;;AAEA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA,sCAAsC;AACtC,yCAAyC,oBAAoB;AAC7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,wBAAwB,mBAAmB;AAC3C,2DAA2D,sBAAsB;AACjF;AACA,OAAO;AACP;;AAEA,0CAA0C;AAC1C;AACA;AACA;AACA,yCAAyC,yBAAyB;AAClE;AACA;AACA;AACA,4CAA4C,4BAA4B;AACxE;AACA;AACA,SAAS;AACT,OAAO;AACP;;AAEA,yCAAyC;AACzC;AACA;AACA;AACA,yCAAyC,yBAAyB;AAClE;AACA;AACA;AACA,0CAA0C,4BAA4B;AACtE;AACA;AACA,SAAS;AACT,OAAO;AACP;;AAEA;AACA;AACA;;AAEA,gDAAgD;AAChD;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA,qDAAqD;AACrD,kDAAkD,wBAAwB;AAC1E;;AAEA;AACA,4CAA4C,SAAS;AACrD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,qCAAqC,kBAAkB;AACvD,SAAS;AACT;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,0CAA0C,KAAK;AAC/C;;;AAGA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,yCAAyC,SAAS;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;;;AAGA;AACA;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,oCAAoC,oCAAoC;AACxE;AACA;AACA;AACA;AACA;;AAEA;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA,iDAAiD,cAAc,EAAE;AACjE;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,0BAA0B;AAC1B;AACA,KAAK;;AAEL;AACA;AACA,0BAA0B;AAC1B;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,sCAAsC,eAAe,EAAE;AACvD;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;;AAGL;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,KAAK;;;AAGL;;AAEA,wBAAwB;AACxB;AACA,KAAK;;AAEL;AACA,yCAAyC,8BAA8B;AACvE,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,OAAO;AACP;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;;AAGL;;AAEA;AACA;AACA,KAAK;;AAEL;AACA,iFAAiF,YAAY;AAC7F,KAAK;;AAEL;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,kDAAkD;AAClD;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO;AACP;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA,0CAA0C,0BAA0B;AACpE,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,0CAA0C,4BAA4B;AACtE,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA,4CAA4C,8BAA8B;AAC1E,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;;AAGL;;AAEA;AACA;AACA;;;AAGA;;AAEA;;AAEA;AACA,GAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,2CAA2C,wBAAwB;AACnE;AACA;;AAEA;;AAEA;;AAEA;AACA;AACA,KAAK;;AAEL,2CAA2C;AAC3C;AACA;AACA;AACA,2BAA2B;AAC3B;AACA;AACA,KAAK;;AAEL,wCAAwC;AACxC;AACA;AACA,2BAA2B;AAC3B;AACA;AACA;;AAEA,GAAG;;AAEH;AACA;AACA;AACA;AACA,6DAA6D;;;;AAI7D;;AAEA;;AAEA;AACA;AACA,KAAK;;;AAGL;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;;AAGL;;AAEA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA,qCAAqC,qBAAqB;AAC1D,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA,KAAK;;AAEL;AACA;AACA;AACA;AACA;;AAEA,GAAG;;AAEH;AACA;;;;AAIA;;AAEA;;AAEA;AACA;AACA,KAAK;;AAEL;AACA;AACA,KAAK;;;AAGL;;AAEA;AACA;AACA;;AAEA,GAAG;;AAEH;AACA;;;AAGA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,2BAA2B,8CAA8C,EAAE;AAC3E,2BAA2B,yCAAyC,EAAE;AACtE;AACA,wBAAwB,0BAA0B,EAAE;AACpD,wBAAwB,qBAAqB;AAC7C;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA,wDAAwD;AACxD;;AAEA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;AAEA;;AAEA,CAAC,G","file":"main.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 3);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 97d440834a2c326e60bc","/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n'use strict';\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/object-assign/index.js\n// module id = 0\n// module chunks = 0","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react.production.min.js');\n} else {\n module.exports = require('./cjs/react.development.js');\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react/index.js\n// module id = 1\n// module chunks = 0","'use strict';\n\nvar asap = require('asap/raw');\n\nfunction noop() {}\n\n// States:\n//\n// 0 - pending\n// 1 - fulfilled with _value\n// 2 - rejected with _value\n// 3 - adopted the state of another promise, _value\n//\n// once the state is no longer pending (0) it is immutable\n\n// All `_` prefixed properties will be reduced to `_{random number}`\n// at build time to obfuscate them and discourage their use.\n// We don't use symbols or Object.defineProperty to fully hide them\n// because the performance isn't good enough.\n\n\n// to avoid using try/catch inside critical functions, we\n// extract them to here.\nvar LAST_ERROR = null;\nvar IS_ERROR = {};\nfunction getThen(obj) {\n try {\n return obj.then;\n } catch (ex) {\n LAST_ERROR = ex;\n return IS_ERROR;\n }\n}\n\nfunction tryCallOne(fn, a) {\n try {\n return fn(a);\n } catch (ex) {\n LAST_ERROR = ex;\n return IS_ERROR;\n }\n}\nfunction tryCallTwo(fn, a, b) {\n try {\n fn(a, b);\n } catch (ex) {\n LAST_ERROR = ex;\n return IS_ERROR;\n }\n}\n\nmodule.exports = Promise;\n\nfunction Promise(fn) {\n if (typeof this !== 'object') {\n throw new TypeError('Promises must be constructed via new');\n }\n if (typeof fn !== 'function') {\n throw new TypeError('Promise constructor\\'s argument is not a function');\n }\n this._75 = 0;\n this._83 = 0;\n this._18 = null;\n this._38 = null;\n if (fn === noop) return;\n doResolve(fn, this);\n}\nPromise._47 = null;\nPromise._71 = null;\nPromise._44 = noop;\n\nPromise.prototype.then = function(onFulfilled, onRejected) {\n if (this.constructor !== Promise) {\n return safeThen(this, onFulfilled, onRejected);\n }\n var res = new Promise(noop);\n handle(this, new Handler(onFulfilled, onRejected, res));\n return res;\n};\n\nfunction safeThen(self, onFulfilled, onRejected) {\n return new self.constructor(function (resolve, reject) {\n var res = new Promise(noop);\n res.then(resolve, reject);\n handle(self, new Handler(onFulfilled, onRejected, res));\n });\n}\nfunction handle(self, deferred) {\n while (self._83 === 3) {\n self = self._18;\n }\n if (Promise._47) {\n Promise._47(self);\n }\n if (self._83 === 0) {\n if (self._75 === 0) {\n self._75 = 1;\n self._38 = deferred;\n return;\n }\n if (self._75 === 1) {\n self._75 = 2;\n self._38 = [self._38, deferred];\n return;\n }\n self._38.push(deferred);\n return;\n }\n handleResolved(self, deferred);\n}\n\nfunction handleResolved(self, deferred) {\n asap(function() {\n var cb = self._83 === 1 ? deferred.onFulfilled : deferred.onRejected;\n if (cb === null) {\n if (self._83 === 1) {\n resolve(deferred.promise, self._18);\n } else {\n reject(deferred.promise, self._18);\n }\n return;\n }\n var ret = tryCallOne(cb, self._18);\n if (ret === IS_ERROR) {\n reject(deferred.promise, LAST_ERROR);\n } else {\n resolve(deferred.promise, ret);\n }\n });\n}\nfunction resolve(self, newValue) {\n // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\n if (newValue === self) {\n return reject(\n self,\n new TypeError('A promise cannot be resolved with itself.')\n );\n }\n if (\n newValue &&\n (typeof newValue === 'object' || typeof newValue === 'function')\n ) {\n var then = getThen(newValue);\n if (then === IS_ERROR) {\n return reject(self, LAST_ERROR);\n }\n if (\n then === self.then &&\n newValue instanceof Promise\n ) {\n self._83 = 3;\n self._18 = newValue;\n finale(self);\n return;\n } else if (typeof then === 'function') {\n doResolve(then.bind(newValue), self);\n return;\n }\n }\n self._83 = 1;\n self._18 = newValue;\n finale(self);\n}\n\nfunction reject(self, newValue) {\n self._83 = 2;\n self._18 = newValue;\n if (Promise._71) {\n Promise._71(self, newValue);\n }\n finale(self);\n}\nfunction finale(self) {\n if (self._75 === 1) {\n handle(self, self._38);\n self._38 = null;\n }\n if (self._75 === 2) {\n for (var i = 0; i < self._38.length; i++) {\n handle(self, self._38[i]);\n }\n self._38 = null;\n }\n}\n\nfunction Handler(onFulfilled, onRejected, promise){\n this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n this.promise = promise;\n}\n\n/**\n * Take a potentially misbehaving resolver function and make sure\n * onFulfilled and onRejected are only called once.\n *\n * Makes no guarantees about asynchrony.\n */\nfunction doResolve(fn, promise) {\n var done = false;\n var res = tryCallTwo(fn, function (value) {\n if (done) return;\n done = true;\n resolve(promise, value);\n }, function (reason) {\n if (done) return;\n done = true;\n reject(promise, reason);\n });\n if (!done && res === IS_ERROR) {\n done = true;\n reject(promise, LAST_ERROR);\n }\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/promise/lib/core.js\n// module id = 2\n// module chunks = 0","// @remove-on-eject-begin\n/**\n * Copyright (c) 2015-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n// @remove-on-eject-end\n'use strict';\n\nif (typeof Promise === 'undefined') {\n // Rejection tracking prevents a common issue where React gets into an\n // inconsistent state due to an error, but it gets swallowed by a Promise,\n // and the user has no idea what causes React's erratic future behavior.\n require('promise/lib/rejection-tracking').enable();\n window.Promise = require('promise/lib/es6-extensions.js');\n}\n\n// fetch() polyfill for making API calls.\nrequire('whatwg-fetch');\n\n// Object.assign() is commonly used with React.\n// It will use the native implementation if it's present and isn't buggy.\nObject.assign = require('object-assign');\n\n// In tests, polyfill requestAnimationFrame since jsdom doesn't provide it yet.\n// We don't polyfill it in the browser--this is user's responsibility.\nif (process.env.NODE_ENV === 'test') {\n require('raf').polyfill(global);\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-scripts/config/polyfills.js\n// module id = 4\n// module chunks = 0","'use strict';\n\nvar Promise = require('./core');\n\nvar DEFAULT_WHITELIST = [\n ReferenceError,\n TypeError,\n RangeError\n];\n\nvar enabled = false;\nexports.disable = disable;\nfunction disable() {\n enabled = false;\n Promise._47 = null;\n Promise._71 = null;\n}\n\nexports.enable = enable;\nfunction enable(options) {\n options = options || {};\n if (enabled) disable();\n enabled = true;\n var id = 0;\n var displayId = 0;\n var rejections = {};\n Promise._47 = function (promise) {\n if (\n promise._83 === 2 && // IS REJECTED\n rejections[promise._56]\n ) {\n if (rejections[promise._56].logged) {\n onHandled(promise._56);\n } else {\n clearTimeout(rejections[promise._56].timeout);\n }\n delete rejections[promise._56];\n }\n };\n Promise._71 = function (promise, err) {\n if (promise._75 === 0) { // not yet handled\n promise._56 = id++;\n rejections[promise._56] = {\n displayId: null,\n error: err,\n timeout: setTimeout(\n onUnhandled.bind(null, promise._56),\n // For reference errors and type errors, this almost always\n // means the programmer made a mistake, so log them after just\n // 100ms\n // otherwise, wait 2 seconds to see if they get handled\n matchWhitelist(err, DEFAULT_WHITELIST)\n ? 100\n : 2000\n ),\n logged: false\n };\n }\n };\n function onUnhandled(id) {\n if (\n options.allRejections ||\n matchWhitelist(\n rejections[id].error,\n options.whitelist || DEFAULT_WHITELIST\n )\n ) {\n rejections[id].displayId = displayId++;\n if (options.onUnhandled) {\n rejections[id].logged = true;\n options.onUnhandled(\n rejections[id].displayId,\n rejections[id].error\n );\n } else {\n rejections[id].logged = true;\n logError(\n rejections[id].displayId,\n rejections[id].error\n );\n }\n }\n }\n function onHandled(id) {\n if (rejections[id].logged) {\n if (options.onHandled) {\n options.onHandled(rejections[id].displayId, rejections[id].error);\n } else if (!rejections[id].onUnhandled) {\n console.warn(\n 'Promise Rejection Handled (id: ' + rejections[id].displayId + '):'\n );\n console.warn(\n ' This means you can ignore any previous messages of the form \"Possible Unhandled Promise Rejection\" with id ' +\n rejections[id].displayId + '.'\n );\n }\n }\n }\n}\n\nfunction logError(id, error) {\n console.warn('Possible Unhandled Promise Rejection (id: ' + id + '):');\n var errStr = (error && (error.stack || error)) + '';\n errStr.split('\\n').forEach(function (line) {\n console.warn(' ' + line);\n });\n}\n\nfunction matchWhitelist(error, list) {\n return list.some(function (cls) {\n return error instanceof cls;\n });\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/promise/lib/rejection-tracking.js\n// module id = 5\n// module chunks = 0","\"use strict\";\n\n// Use the fastest means possible to execute a task in its own turn, with\n// priority over other events including IO, animation, reflow, and redraw\n// events in browsers.\n//\n// An exception thrown by a task will permanently interrupt the processing of\n// subsequent tasks. The higher level `asap` function ensures that if an\n// exception is thrown by a task, that the task queue will continue flushing as\n// soon as possible, but if you use `rawAsap` directly, you are responsible to\n// either ensure that no exceptions are thrown from your task, or to manually\n// call `rawAsap.requestFlush` if an exception is thrown.\nmodule.exports = rawAsap;\nfunction rawAsap(task) {\n if (!queue.length) {\n requestFlush();\n flushing = true;\n }\n // Equivalent to push, but avoids a function call.\n queue[queue.length] = task;\n}\n\nvar queue = [];\n// Once a flush has been requested, no further calls to `requestFlush` are\n// necessary until the next `flush` completes.\nvar flushing = false;\n// `requestFlush` is an implementation-specific method that attempts to kick\n// off a `flush` event as quickly as possible. `flush` will attempt to exhaust\n// the event queue before yielding to the browser's own event loop.\nvar requestFlush;\n// The position of the next task to execute in the task queue. This is\n// preserved between calls to `flush` so that it can be resumed if\n// a task throws an exception.\nvar index = 0;\n// If a task schedules additional tasks recursively, the task queue can grow\n// unbounded. To prevent memory exhaustion, the task queue will periodically\n// truncate already-completed tasks.\nvar capacity = 1024;\n\n// The flush function processes all tasks that have been scheduled with\n// `rawAsap` unless and until one of those tasks throws an exception.\n// If a task throws an exception, `flush` ensures that its state will remain\n// consistent and will resume where it left off when called again.\n// However, `flush` does not make any arrangements to be called again if an\n// exception is thrown.\nfunction flush() {\n while (index < queue.length) {\n var currentIndex = index;\n // Advance the index before calling the task. This ensures that we will\n // begin flushing on the next task the task throws an error.\n index = index + 1;\n queue[currentIndex].call();\n // Prevent leaking memory for long chains of recursive calls to `asap`.\n // If we call `asap` within tasks scheduled by `asap`, the queue will\n // grow, but to avoid an O(n) walk for every task we execute, we don't\n // shift tasks off the queue after they have been executed.\n // Instead, we periodically shift 1024 tasks off the queue.\n if (index > capacity) {\n // Manually shift all values starting at the index back to the\n // beginning of the queue.\n for (var scan = 0, newLength = queue.length - index; scan < newLength; scan++) {\n queue[scan] = queue[scan + index];\n }\n queue.length -= index;\n index = 0;\n }\n }\n queue.length = 0;\n index = 0;\n flushing = false;\n}\n\n// `requestFlush` is implemented using a strategy based on data collected from\n// every available SauceLabs Selenium web driver worker at time of writing.\n// https://docs.google.com/spreadsheets/d/1mG-5UYGup5qxGdEMWkhP6BWCz053NUb2E1QoUTU16uA/edit#gid=783724593\n\n// Safari 6 and 6.1 for desktop, iPad, and iPhone are the only browsers that\n// have WebKitMutationObserver but not un-prefixed MutationObserver.\n// Must use `global` or `self` instead of `window` to work in both frames and web\n// workers. `global` is a provision of Browserify, Mr, Mrs, or Mop.\n\n/* globals self */\nvar scope = typeof global !== \"undefined\" ? global : self;\nvar BrowserMutationObserver = scope.MutationObserver || scope.WebKitMutationObserver;\n\n// MutationObservers are desirable because they have high priority and work\n// reliably everywhere they are implemented.\n// They are implemented in all modern browsers.\n//\n// - Android 4-4.3\n// - Chrome 26-34\n// - Firefox 14-29\n// - Internet Explorer 11\n// - iPad Safari 6-7.1\n// - iPhone Safari 7-7.1\n// - Safari 6-7\nif (typeof BrowserMutationObserver === \"function\") {\n requestFlush = makeRequestCallFromMutationObserver(flush);\n\n// MessageChannels are desirable because they give direct access to the HTML\n// task queue, are implemented in Internet Explorer 10, Safari 5.0-1, and Opera\n// 11-12, and in web workers in many engines.\n// Although message channels yield to any queued rendering and IO tasks, they\n// would be better than imposing the 4ms delay of timers.\n// However, they do not work reliably in Internet Explorer or Safari.\n\n// Internet Explorer 10 is the only browser that has setImmediate but does\n// not have MutationObservers.\n// Although setImmediate yields to the browser's renderer, it would be\n// preferrable to falling back to setTimeout since it does not have\n// the minimum 4ms penalty.\n// Unfortunately there appears to be a bug in Internet Explorer 10 Mobile (and\n// Desktop to a lesser extent) that renders both setImmediate and\n// MessageChannel useless for the purposes of ASAP.\n// https://github.com/kriskowal/q/issues/396\n\n// Timers are implemented universally.\n// We fall back to timers in workers in most engines, and in foreground\n// contexts in the following browsers.\n// However, note that even this simple case requires nuances to operate in a\n// broad spectrum of browsers.\n//\n// - Firefox 3-13\n// - Internet Explorer 6-9\n// - iPad Safari 4.3\n// - Lynx 2.8.7\n} else {\n requestFlush = makeRequestCallFromTimer(flush);\n}\n\n// `requestFlush` requests that the high priority event queue be flushed as\n// soon as possible.\n// This is useful to prevent an error thrown in a task from stalling the event\n// queue if the exception handled by Node.js’s\n// `process.on(\"uncaughtException\")` or by a domain.\nrawAsap.requestFlush = requestFlush;\n\n// To request a high priority event, we induce a mutation observer by toggling\n// the text of a text node between \"1\" and \"-1\".\nfunction makeRequestCallFromMutationObserver(callback) {\n var toggle = 1;\n var observer = new BrowserMutationObserver(callback);\n var node = document.createTextNode(\"\");\n observer.observe(node, {characterData: true});\n return function requestCall() {\n toggle = -toggle;\n node.data = toggle;\n };\n}\n\n// The message channel technique was discovered by Malte Ubl and was the\n// original foundation for this library.\n// http://www.nonblocking.io/2011/06/windownexttick.html\n\n// Safari 6.0.5 (at least) intermittently fails to create message ports on a\n// page's first load. Thankfully, this version of Safari supports\n// MutationObservers, so we don't need to fall back in that case.\n\n// function makeRequestCallFromMessageChannel(callback) {\n// var channel = new MessageChannel();\n// channel.port1.onmessage = callback;\n// return function requestCall() {\n// channel.port2.postMessage(0);\n// };\n// }\n\n// For reasons explained above, we are also unable to use `setImmediate`\n// under any circumstances.\n// Even if we were, there is another bug in Internet Explorer 10.\n// It is not sufficient to assign `setImmediate` to `requestFlush` because\n// `setImmediate` must be called *by name* and therefore must be wrapped in a\n// closure.\n// Never forget.\n\n// function makeRequestCallFromSetImmediate(callback) {\n// return function requestCall() {\n// setImmediate(callback);\n// };\n// }\n\n// Safari 6.0 has a problem where timers will get lost while the user is\n// scrolling. This problem does not impact ASAP because Safari 6.0 supports\n// mutation observers, so that implementation is used instead.\n// However, if we ever elect to use timers in Safari, the prevalent work-around\n// is to add a scroll event listener that calls for a flush.\n\n// `setTimeout` does not call the passed callback if the delay is less than\n// approximately 7 in web workers in Firefox 8 through 18, and sometimes not\n// even then.\n\nfunction makeRequestCallFromTimer(callback) {\n return function requestCall() {\n // We dispatch a timeout with a specified delay of 0 for engines that\n // can reliably accommodate that request. This will usually be snapped\n // to a 4 milisecond delay, but once we're flushing, there's no delay\n // between events.\n var timeoutHandle = setTimeout(handleTimer, 0);\n // However, since this timer gets frequently dropped in Firefox\n // workers, we enlist an interval handle that will try to fire\n // an event 20 times per second until it succeeds.\n var intervalHandle = setInterval(handleTimer, 50);\n\n function handleTimer() {\n // Whichever timer succeeds will cancel both timers and\n // execute the callback.\n clearTimeout(timeoutHandle);\n clearInterval(intervalHandle);\n callback();\n }\n };\n}\n\n// This is for `asap.js` only.\n// Its name will be periodically randomized to break any code that depends on\n// its existence.\nrawAsap.makeRequestCallFromTimer = makeRequestCallFromTimer;\n\n// ASAP was originally a nextTick shim included in Q. This was factored out\n// into this ASAP package. It was later adapted to RSVP which made further\n// amendments. These decisions, particularly to marginalize MessageChannel and\n// to capture the MutationObserver implementation in a closure, were integrated\n// back into ASAP proper.\n// https://github.com/tildeio/rsvp.js/blob/cddf7232546a9cf858524b75cde6f9edf72620a7/lib/rsvp/asap.js\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/asap/browser-raw.js\n// module id = 6\n// module chunks = 0","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\n} catch(e) {\n\t// This works if the window reference is available\n\tif(typeof window === \"object\")\n\t\tg = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/global.js\n// module id = 7\n// module chunks = 0","'use strict';\n\n//This file contains the ES6 extensions to the core Promises/A+ API\n\nvar Promise = require('./core.js');\n\nmodule.exports = Promise;\n\n/* Static Functions */\n\nvar TRUE = valuePromise(true);\nvar FALSE = valuePromise(false);\nvar NULL = valuePromise(null);\nvar UNDEFINED = valuePromise(undefined);\nvar ZERO = valuePromise(0);\nvar EMPTYSTRING = valuePromise('');\n\nfunction valuePromise(value) {\n var p = new Promise(Promise._44);\n p._83 = 1;\n p._18 = value;\n return p;\n}\nPromise.resolve = function (value) {\n if (value instanceof Promise) return value;\n\n if (value === null) return NULL;\n if (value === undefined) return UNDEFINED;\n if (value === true) return TRUE;\n if (value === false) return FALSE;\n if (value === 0) return ZERO;\n if (value === '') return EMPTYSTRING;\n\n if (typeof value === 'object' || typeof value === 'function') {\n try {\n var then = value.then;\n if (typeof then === 'function') {\n return new Promise(then.bind(value));\n }\n } catch (ex) {\n return new Promise(function (resolve, reject) {\n reject(ex);\n });\n }\n }\n return valuePromise(value);\n};\n\nPromise.all = function (arr) {\n var args = Array.prototype.slice.call(arr);\n\n return new Promise(function (resolve, reject) {\n if (args.length === 0) return resolve([]);\n var remaining = args.length;\n function res(i, val) {\n if (val && (typeof val === 'object' || typeof val === 'function')) {\n if (val instanceof Promise && val.then === Promise.prototype.then) {\n while (val._83 === 3) {\n val = val._18;\n }\n if (val._83 === 1) return res(i, val._18);\n if (val._83 === 2) reject(val._18);\n val.then(function (val) {\n res(i, val);\n }, reject);\n return;\n } else {\n var then = val.then;\n if (typeof then === 'function') {\n var p = new Promise(then.bind(val));\n p.then(function (val) {\n res(i, val);\n }, reject);\n return;\n }\n }\n }\n args[i] = val;\n if (--remaining === 0) {\n resolve(args);\n }\n }\n for (var i = 0; i < args.length; i++) {\n res(i, args[i]);\n }\n });\n};\n\nPromise.reject = function (value) {\n return new Promise(function (resolve, reject) {\n reject(value);\n });\n};\n\nPromise.race = function (values) {\n return new Promise(function (resolve, reject) {\n values.forEach(function(value){\n Promise.resolve(value).then(resolve, reject);\n });\n });\n};\n\n/* Prototype Methods */\n\nPromise.prototype['catch'] = function (onRejected) {\n return this.then(null, onRejected);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/promise/lib/es6-extensions.js\n// module id = 8\n// module chunks = 0","(function(self) {\n 'use strict';\n\n if (self.fetch) {\n return\n }\n\n var support = {\n searchParams: 'URLSearchParams' in self,\n iterable: 'Symbol' in self && 'iterator' in Symbol,\n blob: 'FileReader' in self && 'Blob' in self && (function() {\n try {\n new Blob()\n return true\n } catch(e) {\n return false\n }\n })(),\n formData: 'FormData' in self,\n arrayBuffer: 'ArrayBuffer' in self\n }\n\n if (support.arrayBuffer) {\n var viewClasses = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]'\n ]\n\n var isDataView = function(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj)\n }\n\n var isArrayBufferView = ArrayBuffer.isView || function(obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n }\n }\n\n function normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&'*+.\\^_`|~]/i.test(name)) {\n throw new TypeError('Invalid character in header field name')\n }\n return name.toLowerCase()\n }\n\n function normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value)\n }\n return value\n }\n\n // Build a destructive iterator for the value list\n function iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift()\n return {done: value === undefined, value: value}\n }\n }\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n }\n }\n\n return iterator\n }\n\n function Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n } else if (Array.isArray(headers)) {\n headers.forEach(function(header) {\n this.append(header[0], header[1])\n }, this)\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n }\n\n Headers.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var oldValue = this.map[name]\n this.map[name] = oldValue ? oldValue+','+value : value\n }\n\n Headers.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)]\n }\n\n Headers.prototype.get = function(name) {\n name = normalizeName(name)\n return this.has(name) ? this.map[name] : null\n }\n\n Headers.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n }\n\n Headers.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value)\n }\n\n Headers.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this)\n }\n }\n }\n\n Headers.prototype.keys = function() {\n var items = []\n this.forEach(function(value, name) { items.push(name) })\n return iteratorFor(items)\n }\n\n Headers.prototype.values = function() {\n var items = []\n this.forEach(function(value) { items.push(value) })\n return iteratorFor(items)\n }\n\n Headers.prototype.entries = function() {\n var items = []\n this.forEach(function(value, name) { items.push([name, value]) })\n return iteratorFor(items)\n }\n\n if (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n }\n\n function consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true\n }\n\n function fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n }\n\n function readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsArrayBuffer(blob)\n return promise\n }\n\n function readBlobAsText(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsText(blob)\n return promise\n }\n\n function readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf)\n var chars = new Array(view.length)\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i])\n }\n return chars.join('')\n }\n\n function bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength)\n view.set(new Uint8Array(buf))\n return view.buffer\n }\n }\n\n function Body() {\n this.bodyUsed = false\n\n this._initBody = function(body) {\n this._bodyInit = body\n if (!body) {\n this._bodyText = ''\n } else if (typeof body === 'string') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString()\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer)\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer])\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body)\n } else {\n throw new Error('unsupported BodyInit type')\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8')\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type)\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n }\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n return consumed(this) || Promise.resolve(this._bodyArrayBuffer)\n } else {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n }\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n }\n\n // HTTP methods whose capitalization should be normalized\n var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\n function normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return (methods.indexOf(upcased) > -1) ? upcased : method\n }\n\n function Request(input, options) {\n options = options || {}\n var body = options.body\n\n if (input instanceof Request) {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n if (!body && input._bodyInit != null) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n } else {\n this.url = String(input)\n }\n\n this.credentials = options.credentials || this.credentials || 'omit'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || 'GET')\n this.mode = options.mode || this.mode || null\n this.referrer = null\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body)\n }\n\n Request.prototype.clone = function() {\n return new Request(this, { body: this._bodyInit })\n }\n\n function decode(body) {\n var form = new FormData()\n body.trim().split('&').forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=')\n var name = split.shift().replace(/\\+/g, ' ')\n var value = split.join('=').replace(/\\+/g, ' ')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n }\n\n function parseHeaders(rawHeaders) {\n var headers = new Headers()\n rawHeaders.split(/\\r?\\n/).forEach(function(line) {\n var parts = line.split(':')\n var key = parts.shift().trim()\n if (key) {\n var value = parts.join(':').trim()\n headers.append(key, value)\n }\n })\n return headers\n }\n\n Body.call(Request.prototype)\n\n function Response(bodyInit, options) {\n if (!options) {\n options = {}\n }\n\n this.type = 'default'\n this.status = 'status' in options ? options.status : 200\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = 'statusText' in options ? options.statusText : 'OK'\n this.headers = new Headers(options.headers)\n this.url = options.url || ''\n this._initBody(bodyInit)\n }\n\n Body.call(Response.prototype)\n\n Response.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n }\n\n Response.error = function() {\n var response = new Response(null, {status: 0, statusText: ''})\n response.type = 'error'\n return response\n }\n\n var redirectStatuses = [301, 302, 303, 307, 308]\n\n Response.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n }\n\n self.Headers = Headers\n self.Request = Request\n self.Response = Response\n\n self.fetch = function(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init)\n var xhr = new XMLHttpRequest()\n\n xhr.onload = function() {\n var options = {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n }\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')\n var body = 'response' in xhr ? xhr.response : xhr.responseText\n resolve(new Response(body, options))\n }\n\n xhr.onerror = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.ontimeout = function() {\n reject(new TypeError('Network request failed'))\n }\n\n xhr.open(request.method, request.url, true)\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true\n }\n\n if ('responseType' in xhr && support.blob) {\n xhr.responseType = 'blob'\n }\n\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n })\n }\n self.fetch.polyfill = true\n})(typeof self !== 'undefined' ? self : this);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/whatwg-fetch/fetch.js\n// module id = 9\n// module chunks = 0","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport App from './App';\n\nReactDOM.render(<App />, document.getElementById('root'));\n\n\n\n// WEBPACK FOOTER //\n// ./src/index.js","/** @license React v16.5.1\n * react.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';var m=require(\"object-assign\"),n=\"function\"===typeof Symbol&&Symbol.for,p=n?Symbol.for(\"react.element\"):60103,q=n?Symbol.for(\"react.portal\"):60106,r=n?Symbol.for(\"react.fragment\"):60107,t=n?Symbol.for(\"react.strict_mode\"):60108,u=n?Symbol.for(\"react.profiler\"):60114,v=n?Symbol.for(\"react.provider\"):60109,w=n?Symbol.for(\"react.context\"):60110,x=n?Symbol.for(\"react.async_mode\"):60111,y=n?Symbol.for(\"react.forward_ref\"):60112;n&&Symbol.for(\"react.placeholder\");\nvar z=\"function\"===typeof Symbol&&Symbol.iterator;function A(a,b,d,c,e,g,h,f){if(!a){a=void 0;if(void 0===b)a=Error(\"Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.\");else{var k=[d,c,e,g,h,f],l=0;a=Error(b.replace(/%s/g,function(){return k[l++]}));a.name=\"Invariant Violation\"}a.framesToPop=1;throw a;}}\nfunction B(a){for(var b=arguments.length-1,d=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,c=0;c<b;c++)d+=\"&args[]=\"+encodeURIComponent(arguments[c+1]);A(!1,\"Minified React error #\"+a+\"; visit %s for the full message or use the non-minified dev environment for full errors and additional helpful warnings. \",d)}var C={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},D={};\nfunction E(a,b,d){this.props=a;this.context=b;this.refs=D;this.updater=d||C}E.prototype.isReactComponent={};E.prototype.setState=function(a,b){\"object\"!==typeof a&&\"function\"!==typeof a&&null!=a?B(\"85\"):void 0;this.updater.enqueueSetState(this,a,b,\"setState\")};E.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,\"forceUpdate\")};function F(){}F.prototype=E.prototype;function G(a,b,d){this.props=a;this.context=b;this.refs=D;this.updater=d||C}var H=G.prototype=new F;\nH.constructor=G;m(H,E.prototype);H.isPureReactComponent=!0;var I={current:null,currentDispatcher:null},J=Object.prototype.hasOwnProperty,K={key:!0,ref:!0,__self:!0,__source:!0};\nfunction L(a,b,d){var c=void 0,e={},g=null,h=null;if(null!=b)for(c in void 0!==b.ref&&(h=b.ref),void 0!==b.key&&(g=\"\"+b.key),b)J.call(b,c)&&!K.hasOwnProperty(c)&&(e[c]=b[c]);var f=arguments.length-2;if(1===f)e.children=d;else if(1<f){for(var k=Array(f),l=0;l<f;l++)k[l]=arguments[l+2];e.children=k}if(a&&a.defaultProps)for(c in f=a.defaultProps,f)void 0===e[c]&&(e[c]=f[c]);return{$$typeof:p,type:a,key:g,ref:h,props:e,_owner:I.current}}\nfunction M(a,b){return{$$typeof:p,type:a.type,key:b,ref:a.ref,props:a.props,_owner:a._owner}}function N(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===p}function escape(a){var b={\"=\":\"=0\",\":\":\"=2\"};return\"$\"+(\"\"+a).replace(/[=:]/g,function(a){return b[a]})}var O=/\\/+/g,P=[];function Q(a,b,d,c){if(P.length){var e=P.pop();e.result=a;e.keyPrefix=b;e.func=d;e.context=c;e.count=0;return e}return{result:a,keyPrefix:b,func:d,context:c,count:0}}\nfunction R(a){a.result=null;a.keyPrefix=null;a.func=null;a.context=null;a.count=0;10>P.length&&P.push(a)}\nfunction S(a,b,d,c){var e=typeof a;if(\"undefined\"===e||\"boolean\"===e)a=null;var g=!1;if(null===a)g=!0;else switch(e){case \"string\":case \"number\":g=!0;break;case \"object\":switch(a.$$typeof){case p:case q:g=!0}}if(g)return d(c,a,\"\"===b?\".\"+T(a,0):b),1;g=0;b=\"\"===b?\".\":b+\":\";if(Array.isArray(a))for(var h=0;h<a.length;h++){e=a[h];var f=b+T(e,h);g+=S(e,f,d,c)}else if(null===a||\"object\"!==typeof a?f=null:(f=z&&a[z]||a[\"@@iterator\"],f=\"function\"===typeof f?f:null),\"function\"===typeof f)for(a=f.call(a),h=\n0;!(e=a.next()).done;)e=e.value,f=b+T(e,h++),g+=S(e,f,d,c);else\"object\"===e&&(d=\"\"+a,B(\"31\",\"[object Object]\"===d?\"object with keys {\"+Object.keys(a).join(\", \")+\"}\":d,\"\"));return g}function U(a,b,d){return null==a?0:S(a,\"\",b,d)}function T(a,b){return\"object\"===typeof a&&null!==a&&null!=a.key?escape(a.key):b.toString(36)}function V(a,b){a.func.call(a.context,b,a.count++)}\nfunction aa(a,b,d){var c=a.result,e=a.keyPrefix;a=a.func.call(a.context,b,a.count++);Array.isArray(a)?W(a,c,d,function(a){return a}):null!=a&&(N(a)&&(a=M(a,e+(!a.key||b&&b.key===a.key?\"\":(\"\"+a.key).replace(O,\"$&/\")+\"/\")+d)),c.push(a))}function W(a,b,d,c,e){var g=\"\";null!=d&&(g=(\"\"+d).replace(O,\"$&/\")+\"/\");b=Q(b,g,c,e);U(a,aa,b);R(b)}function ba(a,b){var d=I.currentDispatcher;null===d?B(\"277\"):void 0;return d.readContext(a,b)}\nvar X={Children:{map:function(a,b,d){if(null==a)return a;var c=[];W(a,c,null,b,d);return c},forEach:function(a,b,d){if(null==a)return a;b=Q(null,null,b,d);U(a,V,b);R(b)},count:function(a){return U(a,function(){return null},null)},toArray:function(a){var b=[];W(a,b,null,function(a){return a});return b},only:function(a){N(a)?void 0:B(\"143\");return a}},createRef:function(){return{current:null}},Component:E,PureComponent:G,createContext:function(a,b){void 0===b&&(b=null);a={$$typeof:w,_calculateChangedBits:b,\n_currentValue:a,_currentValue2:a,Provider:null,Consumer:null,unstable_read:null};a.Provider={$$typeof:v,_context:a};a.Consumer=a;a.unstable_read=ba.bind(null,a);return a},forwardRef:function(a){return{$$typeof:y,render:a}},Fragment:r,StrictMode:t,unstable_AsyncMode:x,unstable_Profiler:u,createElement:L,cloneElement:function(a,b,d){null===a||void 0===a?B(\"267\",a):void 0;var c=void 0,e=m({},a.props),g=a.key,h=a.ref,f=a._owner;if(null!=b){void 0!==b.ref&&(h=b.ref,f=I.current);void 0!==b.key&&(g=\"\"+b.key);\nvar k=void 0;a.type&&a.type.defaultProps&&(k=a.type.defaultProps);for(c in b)J.call(b,c)&&!K.hasOwnProperty(c)&&(e[c]=void 0===b[c]&&void 0!==k?k[c]:b[c])}c=arguments.length-2;if(1===c)e.children=d;else if(1<c){k=Array(c);for(var l=0;l<c;l++)k[l]=arguments[l+2];e.children=k}return{$$typeof:p,type:a.type,key:g,ref:h,props:e,_owner:f}},createFactory:function(a){var b=L.bind(null,a);b.type=a;return b},isValidElement:N,version:\"16.5.1\",__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:{ReactCurrentOwner:I,\nassign:m}},Y={default:X},Z=Y&&X||Y;module.exports=Z.default||Z;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react/cjs/react.production.min.js\n// module id = 11\n// module chunks = 0","'use strict';\n\nfunction checkDCE() {\n /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\n if (\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' ||\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function'\n ) {\n return;\n }\n if (process.env.NODE_ENV !== 'production') {\n // This branch is unreachable because this function is only called\n // in production, but the condition is true only in development.\n // Therefore if the branch is still here, dead code elimination wasn't\n // properly applied.\n // Don't change the message. React DevTools relies on it. Also make sure\n // this message doesn't occur elsewhere in this function, or it will cause\n // a false positive.\n throw new Error('^_^');\n }\n try {\n // Verify that the code above has been dead code eliminated (DCE'd).\n __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);\n } catch (err) {\n // DevTools shouldn't crash React, no matter what.\n // We should still report in case we break this code.\n console.error(err);\n }\n}\n\nif (process.env.NODE_ENV === 'production') {\n // DCE check should happen before ReactDOM bundle executes so that\n // DevTools can report bad minification during injection.\n checkDCE();\n module.exports = require('./cjs/react-dom.production.min.js');\n} else {\n module.exports = require('./cjs/react-dom.development.js');\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dom/index.js\n// module id = 12\n// module chunks = 0","/** @license React v16.5.1\n * react-dom.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/*\n Modernizr 3.0.0pre (Custom Build) | MIT\n*/\n'use strict';var aa=require(\"react\"),n=require(\"object-assign\"),ba=require(\"schedule\");function ca(a,b,c,d,e,f,g,h){if(!a){a=void 0;if(void 0===b)a=Error(\"Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.\");else{var k=[c,d,e,f,g,h],l=0;a=Error(b.replace(/%s/g,function(){return k[l++]}));a.name=\"Invariant Violation\"}a.framesToPop=1;throw a;}}\nfunction t(a){for(var b=arguments.length-1,c=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,d=0;d<b;d++)c+=\"&args[]=\"+encodeURIComponent(arguments[d+1]);ca(!1,\"Minified React error #\"+a+\"; visit %s for the full message or use the non-minified dev environment for full errors and additional helpful warnings. \",c)}aa?void 0:t(\"227\");function da(a,b,c,d,e,f,g,h,k){var l=Array.prototype.slice.call(arguments,3);try{b.apply(c,l)}catch(m){this.onError(m)}}\nvar ea=!1,fa=null,ha=!1,ia=null,ja={onError:function(a){ea=!0;fa=a}};function ka(a,b,c,d,e,f,g,h,k){ea=!1;fa=null;da.apply(ja,arguments)}function la(a,b,c,d,e,f,g,h,k){ka.apply(this,arguments);if(ea){if(ea){var l=fa;ea=!1;fa=null}else t(\"198\"),l=void 0;ha||(ha=!0,ia=l)}}var ma=null,na={};\nfunction oa(){if(ma)for(var a in na){var b=na[a],c=ma.indexOf(a);-1<c?void 0:t(\"96\",a);if(!pa[c]){b.extractEvents?void 0:t(\"97\",a);pa[c]=b;c=b.eventTypes;for(var d in c){var e=void 0;var f=c[d],g=b,h=d;qa.hasOwnProperty(h)?t(\"99\",h):void 0;qa[h]=f;var k=f.phasedRegistrationNames;if(k){for(e in k)k.hasOwnProperty(e)&&ra(k[e],g,h);e=!0}else f.registrationName?(ra(f.registrationName,g,h),e=!0):e=!1;e?void 0:t(\"98\",d,a)}}}}\nfunction ra(a,b,c){sa[a]?t(\"100\",a):void 0;sa[a]=b;ta[a]=b.eventTypes[c].dependencies}var pa=[],qa={},sa={},ta={},ua=null,va=null,wa=null;function xa(a,b,c,d){b=a.type||\"unknown-event\";a.currentTarget=wa(d);la(b,c,void 0,a);a.currentTarget=null}function ya(a,b){null==b?t(\"30\"):void 0;if(null==a)return b;if(Array.isArray(a)){if(Array.isArray(b))return a.push.apply(a,b),a;a.push(b);return a}return Array.isArray(b)?[a].concat(b):[a,b]}\nfunction za(a,b,c){Array.isArray(a)?a.forEach(b,c):a&&b.call(c,a)}var Aa=null;function Ba(a,b){if(a){var c=a._dispatchListeners,d=a._dispatchInstances;if(Array.isArray(c))for(var e=0;e<c.length&&!a.isPropagationStopped();e++)xa(a,b,c[e],d[e]);else c&&xa(a,b,c,d);a._dispatchListeners=null;a._dispatchInstances=null;a.isPersistent()||a.constructor.release(a)}}function Ca(a){return Ba(a,!0)}function Da(a){return Ba(a,!1)}\nvar Ea={injectEventPluginOrder:function(a){ma?t(\"101\"):void 0;ma=Array.prototype.slice.call(a);oa()},injectEventPluginsByName:function(a){var b=!1,c;for(c in a)if(a.hasOwnProperty(c)){var d=a[c];na.hasOwnProperty(c)&&na[c]===d||(na[c]?t(\"102\",c):void 0,na[c]=d,b=!0)}b&&oa()}};\nfunction Fa(a,b){var c=a.stateNode;if(!c)return null;var d=ua(c);if(!d)return null;c=d[b];a:switch(b){case \"onClick\":case \"onClickCapture\":case \"onDoubleClick\":case \"onDoubleClickCapture\":case \"onMouseDown\":case \"onMouseDownCapture\":case \"onMouseMove\":case \"onMouseMoveCapture\":case \"onMouseUp\":case \"onMouseUpCapture\":(d=!d.disabled)||(a=a.type,d=!(\"button\"===a||\"input\"===a||\"select\"===a||\"textarea\"===a));a=!d;break a;default:a=!1}if(a)return null;c&&\"function\"!==typeof c?t(\"231\",b,typeof c):void 0;\nreturn c}function Ga(a,b){null!==a&&(Aa=ya(Aa,a));a=Aa;Aa=null;if(a&&(b?za(a,Ca):za(a,Da),Aa?t(\"95\"):void 0,ha))throw b=ia,ha=!1,ia=null,b;}var Ha=Math.random().toString(36).slice(2),Ia=\"__reactInternalInstance$\"+Ha,Ja=\"__reactEventHandlers$\"+Ha;function Ka(a){if(a[Ia])return a[Ia];for(;!a[Ia];)if(a.parentNode)a=a.parentNode;else return null;a=a[Ia];return 7===a.tag||8===a.tag?a:null}function La(a){a=a[Ia];return!a||7!==a.tag&&8!==a.tag?null:a}\nfunction Ma(a){if(7===a.tag||8===a.tag)return a.stateNode;t(\"33\")}function Na(a){return a[Ja]||null}function Oa(a){do a=a.return;while(a&&7!==a.tag);return a?a:null}function Pa(a,b,c){if(b=Fa(a,c.dispatchConfig.phasedRegistrationNames[b]))c._dispatchListeners=ya(c._dispatchListeners,b),c._dispatchInstances=ya(c._dispatchInstances,a)}\nfunction Qa(a){if(a&&a.dispatchConfig.phasedRegistrationNames){for(var b=a._targetInst,c=[];b;)c.push(b),b=Oa(b);for(b=c.length;0<b--;)Pa(c[b],\"captured\",a);for(b=0;b<c.length;b++)Pa(c[b],\"bubbled\",a)}}function Ra(a,b,c){a&&c&&c.dispatchConfig.registrationName&&(b=Fa(a,c.dispatchConfig.registrationName))&&(c._dispatchListeners=ya(c._dispatchListeners,b),c._dispatchInstances=ya(c._dispatchInstances,a))}function Ta(a){a&&a.dispatchConfig.registrationName&&Ra(a._targetInst,null,a)}\nfunction Ua(a){za(a,Qa)}var Va=!(\"undefined\"===typeof window||!window.document||!window.document.createElement);function Wa(a,b){var c={};c[a.toLowerCase()]=b.toLowerCase();c[\"Webkit\"+a]=\"webkit\"+b;c[\"Moz\"+a]=\"moz\"+b;return c}var Ya={animationend:Wa(\"Animation\",\"AnimationEnd\"),animationiteration:Wa(\"Animation\",\"AnimationIteration\"),animationstart:Wa(\"Animation\",\"AnimationStart\"),transitionend:Wa(\"Transition\",\"TransitionEnd\")},Za={},$a={};\nVa&&($a=document.createElement(\"div\").style,\"AnimationEvent\"in window||(delete Ya.animationend.animation,delete Ya.animationiteration.animation,delete Ya.animationstart.animation),\"TransitionEvent\"in window||delete Ya.transitionend.transition);function ab(a){if(Za[a])return Za[a];if(!Ya[a])return a;var b=Ya[a],c;for(c in b)if(b.hasOwnProperty(c)&&c in $a)return Za[a]=b[c];return a}\nvar bb=ab(\"animationend\"),cb=ab(\"animationiteration\"),db=ab(\"animationstart\"),eb=ab(\"transitionend\"),fb=\"abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting\".split(\" \"),gb=null,hb=null,ib=null;\nfunction jb(){if(ib)return ib;var a,b=hb,c=b.length,d,e=\"value\"in gb?gb.value:gb.textContent,f=e.length;for(a=0;a<c&&b[a]===e[a];a++);var g=c-a;for(d=1;d<=g&&b[c-d]===e[f-d];d++);return ib=e.slice(a,1<d?1-d:void 0)}function kb(){return!0}function lb(){return!1}\nfunction z(a,b,c,d){this.dispatchConfig=a;this._targetInst=b;this.nativeEvent=c;a=this.constructor.Interface;for(var e in a)a.hasOwnProperty(e)&&((b=a[e])?this[e]=b(c):\"target\"===e?this.target=d:this[e]=c[e]);this.isDefaultPrevented=(null!=c.defaultPrevented?c.defaultPrevented:!1===c.returnValue)?kb:lb;this.isPropagationStopped=lb;return this}\nn(z.prototype,{preventDefault:function(){this.defaultPrevented=!0;var a=this.nativeEvent;a&&(a.preventDefault?a.preventDefault():\"unknown\"!==typeof a.returnValue&&(a.returnValue=!1),this.isDefaultPrevented=kb)},stopPropagation:function(){var a=this.nativeEvent;a&&(a.stopPropagation?a.stopPropagation():\"unknown\"!==typeof a.cancelBubble&&(a.cancelBubble=!0),this.isPropagationStopped=kb)},persist:function(){this.isPersistent=kb},isPersistent:lb,destructor:function(){var a=this.constructor.Interface,\nb;for(b in a)this[b]=null;this.nativeEvent=this._targetInst=this.dispatchConfig=null;this.isPropagationStopped=this.isDefaultPrevented=lb;this._dispatchInstances=this._dispatchListeners=null}});z.Interface={type:null,target:null,currentTarget:function(){return null},eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(a){return a.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null};\nz.extend=function(a){function b(){}function c(){return d.apply(this,arguments)}var d=this;b.prototype=d.prototype;var e=new b;n(e,c.prototype);c.prototype=e;c.prototype.constructor=c;c.Interface=n({},d.Interface,a);c.extend=d.extend;mb(c);return c};mb(z);function nb(a,b,c,d){if(this.eventPool.length){var e=this.eventPool.pop();this.call(e,a,b,c,d);return e}return new this(a,b,c,d)}function ob(a){a instanceof this?void 0:t(\"279\");a.destructor();10>this.eventPool.length&&this.eventPool.push(a)}\nfunction mb(a){a.eventPool=[];a.getPooled=nb;a.release=ob}var pb=z.extend({data:null}),qb=z.extend({data:null}),rb=[9,13,27,32],sb=Va&&\"CompositionEvent\"in window,tb=null;Va&&\"documentMode\"in document&&(tb=document.documentMode);\nvar ub=Va&&\"TextEvent\"in window&&!tb,vb=Va&&(!sb||tb&&8<tb&&11>=tb),wb=String.fromCharCode(32),xb={beforeInput:{phasedRegistrationNames:{bubbled:\"onBeforeInput\",captured:\"onBeforeInputCapture\"},dependencies:[\"compositionend\",\"keypress\",\"textInput\",\"paste\"]},compositionEnd:{phasedRegistrationNames:{bubbled:\"onCompositionEnd\",captured:\"onCompositionEndCapture\"},dependencies:\"blur compositionend keydown keypress keyup mousedown\".split(\" \")},compositionStart:{phasedRegistrationNames:{bubbled:\"onCompositionStart\",\ncaptured:\"onCompositionStartCapture\"},dependencies:\"blur compositionstart keydown keypress keyup mousedown\".split(\" \")},compositionUpdate:{phasedRegistrationNames:{bubbled:\"onCompositionUpdate\",captured:\"onCompositionUpdateCapture\"},dependencies:\"blur compositionupdate keydown keypress keyup mousedown\".split(\" \")}},yb=!1;\nfunction zb(a,b){switch(a){case \"keyup\":return-1!==rb.indexOf(b.keyCode);case \"keydown\":return 229!==b.keyCode;case \"keypress\":case \"mousedown\":case \"blur\":return!0;default:return!1}}function Ab(a){a=a.detail;return\"object\"===typeof a&&\"data\"in a?a.data:null}var Bb=!1;function Cb(a,b){switch(a){case \"compositionend\":return Ab(b);case \"keypress\":if(32!==b.which)return null;yb=!0;return wb;case \"textInput\":return a=b.data,a===wb&&yb?null:a;default:return null}}\nfunction Db(a,b){if(Bb)return\"compositionend\"===a||!sb&&zb(a,b)?(a=jb(),ib=hb=gb=null,Bb=!1,a):null;switch(a){case \"paste\":return null;case \"keypress\":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1<b.char.length)return b.char;if(b.which)return String.fromCharCode(b.which)}return null;case \"compositionend\":return vb&&\"ko\"!==b.locale?null:b.data;default:return null}}\nvar Eb={eventTypes:xb,extractEvents:function(a,b,c,d){var e=void 0;var f=void 0;if(sb)b:{switch(a){case \"compositionstart\":e=xb.compositionStart;break b;case \"compositionend\":e=xb.compositionEnd;break b;case \"compositionupdate\":e=xb.compositionUpdate;break b}e=void 0}else Bb?zb(a,c)&&(e=xb.compositionEnd):\"keydown\"===a&&229===c.keyCode&&(e=xb.compositionStart);e?(vb&&\"ko\"!==c.locale&&(Bb||e!==xb.compositionStart?e===xb.compositionEnd&&Bb&&(f=jb()):(gb=d,hb=\"value\"in gb?gb.value:gb.textContent,Bb=\n!0)),e=pb.getPooled(e,b,c,d),f?e.data=f:(f=Ab(c),null!==f&&(e.data=f)),Ua(e),f=e):f=null;(a=ub?Cb(a,c):Db(a,c))?(b=qb.getPooled(xb.beforeInput,b,c,d),b.data=a,Ua(b)):b=null;return null===f?b:null===b?f:[f,b]}},Fb=null,Gb=null,Hb=null;function Ib(a){if(a=va(a)){\"function\"!==typeof Fb?t(\"280\"):void 0;var b=ua(a.stateNode);Fb(a.stateNode,a.type,b)}}function Jb(a){Gb?Hb?Hb.push(a):Hb=[a]:Gb=a}function Kb(){if(Gb){var a=Gb,b=Hb;Hb=Gb=null;Ib(a);if(b)for(a=0;a<b.length;a++)Ib(b[a])}}\nfunction Lb(a,b){return a(b)}function Mb(a,b,c){return a(b,c)}function Nb(){}var Ob=!1;function Pb(a,b){if(Ob)return a(b);Ob=!0;try{return Lb(a,b)}finally{if(Ob=!1,null!==Gb||null!==Hb)Nb(),Kb()}}var Qb={color:!0,date:!0,datetime:!0,\"datetime-local\":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Rb(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return\"input\"===b?!!Qb[a.type]:\"textarea\"===b?!0:!1}\nfunction Sb(a){a=a.target||a.srcElement||window;a.correspondingUseElement&&(a=a.correspondingUseElement);return 3===a.nodeType?a.parentNode:a}function Tb(a){if(!Va)return!1;a=\"on\"+a;var b=a in document;b||(b=document.createElement(\"div\"),b.setAttribute(a,\"return;\"),b=\"function\"===typeof b[a]);return b}function Ub(a){var b=a.type;return(a=a.nodeName)&&\"input\"===a.toLowerCase()&&(\"checkbox\"===b||\"radio\"===b)}\nfunction Vb(a){var b=Ub(a)?\"checked\":\"value\",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=\"\"+a[b];if(!a.hasOwnProperty(b)&&\"undefined\"!==typeof c&&\"function\"===typeof c.get&&\"function\"===typeof c.set){var e=c.get,f=c.set;Object.defineProperty(a,b,{configurable:!0,get:function(){return e.call(this)},set:function(a){d=\"\"+a;f.call(this,a)}});Object.defineProperty(a,b,{enumerable:c.enumerable});return{getValue:function(){return d},setValue:function(a){d=\"\"+a},stopTracking:function(){a._valueTracker=\nnull;delete a[b]}}}}function Wb(a){a._valueTracker||(a._valueTracker=Vb(a))}function Xb(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d=\"\";a&&(d=Ub(a)?a.checked?\"true\":\"false\":a.value);a=d;return a!==c?(b.setValue(a),!0):!1}\nvar Yb=aa.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,Zb=/^(.*)[\\\\\\/]/,C=\"function\"===typeof Symbol&&Symbol.for,$b=C?Symbol.for(\"react.element\"):60103,ac=C?Symbol.for(\"react.portal\"):60106,bc=C?Symbol.for(\"react.fragment\"):60107,cc=C?Symbol.for(\"react.strict_mode\"):60108,dc=C?Symbol.for(\"react.profiler\"):60114,ec=C?Symbol.for(\"react.provider\"):60109,fc=C?Symbol.for(\"react.context\"):60110,gc=C?Symbol.for(\"react.async_mode\"):60111,hc=C?Symbol.for(\"react.forward_ref\"):60112,ic=C?Symbol.for(\"react.placeholder\"):\n60113,jc=\"function\"===typeof Symbol&&Symbol.iterator;function kc(a){if(null===a||\"object\"!==typeof a)return null;a=jc&&a[jc]||a[\"@@iterator\"];return\"function\"===typeof a?a:null}\nfunction lc(a){if(null==a)return null;if(\"function\"===typeof a)return a.displayName||a.name||null;if(\"string\"===typeof a)return a;switch(a){case gc:return\"AsyncMode\";case bc:return\"Fragment\";case ac:return\"Portal\";case dc:return\"Profiler\";case cc:return\"StrictMode\";case ic:return\"Placeholder\"}if(\"object\"===typeof a){switch(a.$$typeof){case fc:return\"Context.Consumer\";case ec:return\"Context.Provider\";case hc:var b=a.render;b=b.displayName||b.name||\"\";return a.displayName||(\"\"!==b?\"ForwardRef(\"+b+\")\":\n\"ForwardRef\")}if(\"function\"===typeof a.then&&(a=1===a._reactStatus?a._reactResult:null))return lc(a)}return null}function mc(a){var b=\"\";do{a:switch(a.tag){case 4:case 0:case 1:case 2:case 3:case 7:case 10:var c=a._debugOwner,d=a._debugSource,e=lc(a.type);var f=null;c&&(f=lc(c.type));c=e;e=\"\";d?e=\" (at \"+d.fileName.replace(Zb,\"\")+\":\"+d.lineNumber+\")\":f&&(e=\" (created by \"+f+\")\");f=\"\\n in \"+(c||\"Unknown\")+e;break a;default:f=\"\"}b+=f;a=a.return}while(a);return b}\nvar nc=/^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$/,pc=Object.prototype.hasOwnProperty,qc={},rc={};\nfunction sc(a){if(pc.call(rc,a))return!0;if(pc.call(qc,a))return!1;if(nc.test(a))return rc[a]=!0;qc[a]=!0;return!1}function tc(a,b,c,d){if(null!==c&&0===c.type)return!1;switch(typeof b){case \"function\":case \"symbol\":return!0;case \"boolean\":if(d)return!1;if(null!==c)return!c.acceptsBooleans;a=a.toLowerCase().slice(0,5);return\"data-\"!==a&&\"aria-\"!==a;default:return!1}}\nfunction uc(a,b,c,d){if(null===b||\"undefined\"===typeof b||tc(a,b,c,d))return!0;if(d)return!1;if(null!==c)switch(c.type){case 3:return!b;case 4:return!1===b;case 5:return isNaN(b);case 6:return isNaN(b)||1>b}return!1}function D(a,b,c,d,e){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b}var E={};\n\"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style\".split(\" \").forEach(function(a){E[a]=new D(a,0,!1,a,null)});[[\"acceptCharset\",\"accept-charset\"],[\"className\",\"class\"],[\"htmlFor\",\"for\"],[\"httpEquiv\",\"http-equiv\"]].forEach(function(a){var b=a[0];E[b]=new D(b,1,!1,a[1],null)});[\"contentEditable\",\"draggable\",\"spellCheck\",\"value\"].forEach(function(a){E[a]=new D(a,2,!1,a.toLowerCase(),null)});\n[\"autoReverse\",\"externalResourcesRequired\",\"focusable\",\"preserveAlpha\"].forEach(function(a){E[a]=new D(a,2,!1,a,null)});\"allowFullScreen async autoFocus autoPlay controls default defer disabled formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope\".split(\" \").forEach(function(a){E[a]=new D(a,3,!1,a.toLowerCase(),null)});[\"checked\",\"multiple\",\"muted\",\"selected\"].forEach(function(a){E[a]=new D(a,3,!0,a,null)});\n[\"capture\",\"download\"].forEach(function(a){E[a]=new D(a,4,!1,a,null)});[\"cols\",\"rows\",\"size\",\"span\"].forEach(function(a){E[a]=new D(a,6,!1,a,null)});[\"rowSpan\",\"start\"].forEach(function(a){E[a]=new D(a,5,!1,a.toLowerCase(),null)});var vc=/[\\-:]([a-z])/g;function wc(a){return a[1].toUpperCase()}\n\"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height\".split(\" \").forEach(function(a){var b=a.replace(vc,\nwc);E[b]=new D(b,1,!1,a,null)});\"xlink:actuate xlink:arcrole xlink:href xlink:role xlink:show xlink:title xlink:type\".split(\" \").forEach(function(a){var b=a.replace(vc,wc);E[b]=new D(b,1,!1,a,\"http://www.w3.org/1999/xlink\")});[\"xml:base\",\"xml:lang\",\"xml:space\"].forEach(function(a){var b=a.replace(vc,wc);E[b]=new D(b,1,!1,a,\"http://www.w3.org/XML/1998/namespace\")});E.tabIndex=new D(\"tabIndex\",1,!1,\"tabindex\",null);\nfunction xc(a,b,c,d){var e=E.hasOwnProperty(b)?E[b]:null;var f=null!==e?0===e.type:d?!1:!(2<b.length)||\"o\"!==b[0]&&\"O\"!==b[0]||\"n\"!==b[1]&&\"N\"!==b[1]?!1:!0;f||(uc(b,c,e,d)&&(c=null),d||null===e?sc(b)&&(null===c?a.removeAttribute(b):a.setAttribute(b,\"\"+c)):e.mustUseProperty?a[e.propertyName]=null===c?3===e.type?!1:\"\":c:(b=e.attributeName,d=e.attributeNamespace,null===c?a.removeAttribute(b):(e=e.type,c=3===e||4===e&&!0===c?\"\":\"\"+c,d?a.setAttributeNS(d,b,c):a.setAttribute(b,c))))}\nfunction yc(a){switch(typeof a){case \"boolean\":case \"number\":case \"object\":case \"string\":case \"undefined\":return a;default:return\"\"}}function zc(a,b){var c=b.checked;return n({},b,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=c?c:a._wrapperState.initialChecked})}\nfunction Bc(a,b){var c=null==b.defaultValue?\"\":b.defaultValue,d=null!=b.checked?b.checked:b.defaultChecked;c=yc(null!=b.value?b.value:c);a._wrapperState={initialChecked:d,initialValue:c,controlled:\"checkbox\"===b.type||\"radio\"===b.type?null!=b.checked:null!=b.value}}function Cc(a,b){b=b.checked;null!=b&&xc(a,\"checked\",b,!1)}\nfunction Dc(a,b){Cc(a,b);var c=yc(b.value),d=b.type;if(null!=c)if(\"number\"===d){if(0===c&&\"\"===a.value||a.value!=c)a.value=\"\"+c}else a.value!==\"\"+c&&(a.value=\"\"+c);else if(\"submit\"===d||\"reset\"===d){a.removeAttribute(\"value\");return}b.hasOwnProperty(\"value\")?Ec(a,b.type,c):b.hasOwnProperty(\"defaultValue\")&&Ec(a,b.type,yc(b.defaultValue));null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)}\nfunction Fc(a,b,c){if(b.hasOwnProperty(\"value\")||b.hasOwnProperty(\"defaultValue\")){var d=b.type;if(!(\"submit\"!==d&&\"reset\"!==d||void 0!==b.value&&null!==b.value))return;b=\"\"+a._wrapperState.initialValue;c||b===a.value||(a.value=b);a.defaultValue=b}c=a.name;\"\"!==c&&(a.name=\"\");a.defaultChecked=!a.defaultChecked;a.defaultChecked=!!a._wrapperState.initialChecked;\"\"!==c&&(a.name=c)}\nfunction Ec(a,b,c){if(\"number\"!==b||a.ownerDocument.activeElement!==a)null==c?a.defaultValue=\"\"+a._wrapperState.initialValue:a.defaultValue!==\"\"+c&&(a.defaultValue=\"\"+c)}var Gc={change:{phasedRegistrationNames:{bubbled:\"onChange\",captured:\"onChangeCapture\"},dependencies:\"blur change click focus input keydown keyup selectionchange\".split(\" \")}};function Hc(a,b,c){a=z.getPooled(Gc.change,a,b,c);a.type=\"change\";Jb(c);Ua(a);return a}var Ic=null,Jc=null;function Kc(a){Ga(a,!1)}\nfunction Lc(a){var b=Ma(a);if(Xb(b))return a}function Mc(a,b){if(\"change\"===a)return b}var Nc=!1;Va&&(Nc=Tb(\"input\")&&(!document.documentMode||9<document.documentMode));function Oc(){Ic&&(Ic.detachEvent(\"onpropertychange\",Pc),Jc=Ic=null)}function Pc(a){\"value\"===a.propertyName&&Lc(Jc)&&(a=Hc(Jc,a,Sb(a)),Pb(Kc,a))}function Qc(a,b,c){\"focus\"===a?(Oc(),Ic=b,Jc=c,Ic.attachEvent(\"onpropertychange\",Pc)):\"blur\"===a&&Oc()}function Rc(a){if(\"selectionchange\"===a||\"keyup\"===a||\"keydown\"===a)return Lc(Jc)}\nfunction Sc(a,b){if(\"click\"===a)return Lc(b)}function Tc(a,b){if(\"input\"===a||\"change\"===a)return Lc(b)}\nvar Uc={eventTypes:Gc,_isInputEventSupported:Nc,extractEvents:function(a,b,c,d){var e=b?Ma(b):window,f=void 0,g=void 0,h=e.nodeName&&e.nodeName.toLowerCase();\"select\"===h||\"input\"===h&&\"file\"===e.type?f=Mc:Rb(e)?Nc?f=Tc:(f=Rc,g=Qc):(h=e.nodeName)&&\"input\"===h.toLowerCase()&&(\"checkbox\"===e.type||\"radio\"===e.type)&&(f=Sc);if(f&&(f=f(a,b)))return Hc(f,c,d);g&&g(a,e,b);\"blur\"===a&&(a=e._wrapperState)&&a.controlled&&\"number\"===e.type&&Ec(e,\"number\",e.value)}},Vc=z.extend({view:null,detail:null}),Wc={Alt:\"altKey\",\nControl:\"ctrlKey\",Meta:\"metaKey\",Shift:\"shiftKey\"};function Xc(a){var b=this.nativeEvent;return b.getModifierState?b.getModifierState(a):(a=Wc[a])?!!b[a]:!1}function Yc(){return Xc}\nvar Zc=0,$c=0,ad=!1,bd=!1,cd=Vc.extend({screenX:null,screenY:null,clientX:null,clientY:null,pageX:null,pageY:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,getModifierState:Yc,button:null,buttons:null,relatedTarget:function(a){return a.relatedTarget||(a.fromElement===a.srcElement?a.toElement:a.fromElement)},movementX:function(a){if(\"movementX\"in a)return a.movementX;var b=Zc;Zc=a.screenX;return ad?\"mousemove\"===a.type?a.screenX-b:0:(ad=!0,0)},movementY:function(a){if(\"movementY\"in a)return a.movementY;\nvar b=$c;$c=a.screenY;return bd?\"mousemove\"===a.type?a.screenY-b:0:(bd=!0,0)}}),dd=cd.extend({pointerId:null,width:null,height:null,pressure:null,tangentialPressure:null,tiltX:null,tiltY:null,twist:null,pointerType:null,isPrimary:null}),ed={mouseEnter:{registrationName:\"onMouseEnter\",dependencies:[\"mouseout\",\"mouseover\"]},mouseLeave:{registrationName:\"onMouseLeave\",dependencies:[\"mouseout\",\"mouseover\"]},pointerEnter:{registrationName:\"onPointerEnter\",dependencies:[\"pointerout\",\"pointerover\"]},pointerLeave:{registrationName:\"onPointerLeave\",\ndependencies:[\"pointerout\",\"pointerover\"]}},fd={eventTypes:ed,extractEvents:function(a,b,c,d){var e=\"mouseover\"===a||\"pointerover\"===a,f=\"mouseout\"===a||\"pointerout\"===a;if(e&&(c.relatedTarget||c.fromElement)||!f&&!e)return null;e=d.window===d?d:(e=d.ownerDocument)?e.defaultView||e.parentWindow:window;f?(f=b,b=(b=c.relatedTarget||c.toElement)?Ka(b):null):f=null;if(f===b)return null;var g=void 0,h=void 0,k=void 0,l=void 0;if(\"mouseout\"===a||\"mouseover\"===a)g=cd,h=ed.mouseLeave,k=ed.mouseEnter,l=\"mouse\";\nelse if(\"pointerout\"===a||\"pointerover\"===a)g=dd,h=ed.pointerLeave,k=ed.pointerEnter,l=\"pointer\";var m=null==f?e:Ma(f);e=null==b?e:Ma(b);a=g.getPooled(h,f,c,d);a.type=l+\"leave\";a.target=m;a.relatedTarget=e;c=g.getPooled(k,b,c,d);c.type=l+\"enter\";c.target=e;c.relatedTarget=m;d=b;if(f&&d)a:{b=f;e=d;l=0;for(g=b;g;g=Oa(g))l++;g=0;for(k=e;k;k=Oa(k))g++;for(;0<l-g;)b=Oa(b),l--;for(;0<g-l;)e=Oa(e),g--;for(;l--;){if(b===e||b===e.alternate)break a;b=Oa(b);e=Oa(e)}b=null}else b=null;e=b;for(b=[];f&&f!==e;){l=\nf.alternate;if(null!==l&&l===e)break;b.push(f);f=Oa(f)}for(f=[];d&&d!==e;){l=d.alternate;if(null!==l&&l===e)break;f.push(d);d=Oa(d)}for(d=0;d<b.length;d++)Ra(b[d],\"bubbled\",a);for(d=f.length;0<d--;)Ra(f[d],\"captured\",c);return[a,c]}},gd=Object.prototype.hasOwnProperty;function hd(a,b){return a===b?0!==a||0!==b||1/a===1/b:a!==a&&b!==b}\nfunction id(a,b){if(hd(a,b))return!0;if(\"object\"!==typeof a||null===a||\"object\"!==typeof b||null===b)return!1;var c=Object.keys(a),d=Object.keys(b);if(c.length!==d.length)return!1;for(d=0;d<c.length;d++)if(!gd.call(b,c[d])||!hd(a[c[d]],b[c[d]]))return!1;return!0}function jd(a){var b=a;if(a.alternate)for(;b.return;)b=b.return;else{if(0!==(b.effectTag&2))return 1;for(;b.return;)if(b=b.return,0!==(b.effectTag&2))return 1}return 5===b.tag?2:3}function kd(a){2!==jd(a)?t(\"188\"):void 0}\nfunction ld(a){var b=a.alternate;if(!b)return b=jd(a),3===b?t(\"188\"):void 0,1===b?null:a;for(var c=a,d=b;;){var e=c.return,f=e?e.alternate:null;if(!e||!f)break;if(e.child===f.child){for(var g=e.child;g;){if(g===c)return kd(e),a;if(g===d)return kd(e),b;g=g.sibling}t(\"188\")}if(c.return!==d.return)c=e,d=f;else{g=!1;for(var h=e.child;h;){if(h===c){g=!0;c=e;d=f;break}if(h===d){g=!0;d=e;c=f;break}h=h.sibling}if(!g){for(h=f.child;h;){if(h===c){g=!0;c=f;d=e;break}if(h===d){g=!0;d=f;c=e;break}h=h.sibling}g?\nvoid 0:t(\"189\")}}c.alternate!==d?t(\"190\"):void 0}5!==c.tag?t(\"188\"):void 0;return c.stateNode.current===c?a:b}function md(a){a=ld(a);if(!a)return null;for(var b=a;;){if(7===b.tag||8===b.tag)return b;if(b.child)b.child.return=b,b=b.child;else{if(b===a)break;for(;!b.sibling;){if(!b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}}return null}\nvar nd=z.extend({animationName:null,elapsedTime:null,pseudoElement:null}),od=z.extend({clipboardData:function(a){return\"clipboardData\"in a?a.clipboardData:window.clipboardData}}),pd=Vc.extend({relatedTarget:null});function qd(a){var b=a.keyCode;\"charCode\"in a?(a=a.charCode,0===a&&13===b&&(a=13)):a=b;10===a&&(a=13);return 32<=a||13===a?a:0}\nvar rd={Esc:\"Escape\",Spacebar:\" \",Left:\"ArrowLeft\",Up:\"ArrowUp\",Right:\"ArrowRight\",Down:\"ArrowDown\",Del:\"Delete\",Win:\"OS\",Menu:\"ContextMenu\",Apps:\"ContextMenu\",Scroll:\"ScrollLock\",MozPrintableKey:\"Unidentified\"},sd={8:\"Backspace\",9:\"Tab\",12:\"Clear\",13:\"Enter\",16:\"Shift\",17:\"Control\",18:\"Alt\",19:\"Pause\",20:\"CapsLock\",27:\"Escape\",32:\" \",33:\"PageUp\",34:\"PageDown\",35:\"End\",36:\"Home\",37:\"ArrowLeft\",38:\"ArrowUp\",39:\"ArrowRight\",40:\"ArrowDown\",45:\"Insert\",46:\"Delete\",112:\"F1\",113:\"F2\",114:\"F3\",115:\"F4\",\n116:\"F5\",117:\"F6\",118:\"F7\",119:\"F8\",120:\"F9\",121:\"F10\",122:\"F11\",123:\"F12\",144:\"NumLock\",145:\"ScrollLock\",224:\"Meta\"},td=Vc.extend({key:function(a){if(a.key){var b=rd[a.key]||a.key;if(\"Unidentified\"!==b)return b}return\"keypress\"===a.type?(a=qd(a),13===a?\"Enter\":String.fromCharCode(a)):\"keydown\"===a.type||\"keyup\"===a.type?sd[a.keyCode]||\"Unidentified\":\"\"},location:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,repeat:null,locale:null,getModifierState:Yc,charCode:function(a){return\"keypress\"===\na.type?qd(a):0},keyCode:function(a){return\"keydown\"===a.type||\"keyup\"===a.type?a.keyCode:0},which:function(a){return\"keypress\"===a.type?qd(a):\"keydown\"===a.type||\"keyup\"===a.type?a.keyCode:0}}),ud=cd.extend({dataTransfer:null}),vd=Vc.extend({touches:null,targetTouches:null,changedTouches:null,altKey:null,metaKey:null,ctrlKey:null,shiftKey:null,getModifierState:Yc}),wd=z.extend({propertyName:null,elapsedTime:null,pseudoElement:null}),xd=cd.extend({deltaX:function(a){return\"deltaX\"in a?a.deltaX:\"wheelDeltaX\"in\na?-a.wheelDeltaX:0},deltaY:function(a){return\"deltaY\"in a?a.deltaY:\"wheelDeltaY\"in a?-a.wheelDeltaY:\"wheelDelta\"in a?-a.wheelDelta:0},deltaZ:null,deltaMode:null}),yd=[[\"abort\",\"abort\"],[bb,\"animationEnd\"],[cb,\"animationIteration\"],[db,\"animationStart\"],[\"canplay\",\"canPlay\"],[\"canplaythrough\",\"canPlayThrough\"],[\"drag\",\"drag\"],[\"dragenter\",\"dragEnter\"],[\"dragexit\",\"dragExit\"],[\"dragleave\",\"dragLeave\"],[\"dragover\",\"dragOver\"],[\"durationchange\",\"durationChange\"],[\"emptied\",\"emptied\"],[\"encrypted\",\"encrypted\"],\n[\"ended\",\"ended\"],[\"error\",\"error\"],[\"gotpointercapture\",\"gotPointerCapture\"],[\"load\",\"load\"],[\"loadeddata\",\"loadedData\"],[\"loadedmetadata\",\"loadedMetadata\"],[\"loadstart\",\"loadStart\"],[\"lostpointercapture\",\"lostPointerCapture\"],[\"mousemove\",\"mouseMove\"],[\"mouseout\",\"mouseOut\"],[\"mouseover\",\"mouseOver\"],[\"playing\",\"playing\"],[\"pointermove\",\"pointerMove\"],[\"pointerout\",\"pointerOut\"],[\"pointerover\",\"pointerOver\"],[\"progress\",\"progress\"],[\"scroll\",\"scroll\"],[\"seeking\",\"seeking\"],[\"stalled\",\"stalled\"],\n[\"suspend\",\"suspend\"],[\"timeupdate\",\"timeUpdate\"],[\"toggle\",\"toggle\"],[\"touchmove\",\"touchMove\"],[eb,\"transitionEnd\"],[\"waiting\",\"waiting\"],[\"wheel\",\"wheel\"]],zd={},Ad={};function Bd(a,b){var c=a[0];a=a[1];var d=\"on\"+(a[0].toUpperCase()+a.slice(1));b={phasedRegistrationNames:{bubbled:d,captured:d+\"Capture\"},dependencies:[c],isInteractive:b};zd[a]=b;Ad[c]=b}\n[[\"blur\",\"blur\"],[\"cancel\",\"cancel\"],[\"click\",\"click\"],[\"close\",\"close\"],[\"contextmenu\",\"contextMenu\"],[\"copy\",\"copy\"],[\"cut\",\"cut\"],[\"auxclick\",\"auxClick\"],[\"dblclick\",\"doubleClick\"],[\"dragend\",\"dragEnd\"],[\"dragstart\",\"dragStart\"],[\"drop\",\"drop\"],[\"focus\",\"focus\"],[\"input\",\"input\"],[\"invalid\",\"invalid\"],[\"keydown\",\"keyDown\"],[\"keypress\",\"keyPress\"],[\"keyup\",\"keyUp\"],[\"mousedown\",\"mouseDown\"],[\"mouseup\",\"mouseUp\"],[\"paste\",\"paste\"],[\"pause\",\"pause\"],[\"play\",\"play\"],[\"pointercancel\",\"pointerCancel\"],\n[\"pointerdown\",\"pointerDown\"],[\"pointerup\",\"pointerUp\"],[\"ratechange\",\"rateChange\"],[\"reset\",\"reset\"],[\"seeked\",\"seeked\"],[\"submit\",\"submit\"],[\"touchcancel\",\"touchCancel\"],[\"touchend\",\"touchEnd\"],[\"touchstart\",\"touchStart\"],[\"volumechange\",\"volumeChange\"]].forEach(function(a){Bd(a,!0)});yd.forEach(function(a){Bd(a,!1)});\nvar Cd={eventTypes:zd,isInteractiveTopLevelEventType:function(a){a=Ad[a];return void 0!==a&&!0===a.isInteractive},extractEvents:function(a,b,c,d){var e=Ad[a];if(!e)return null;switch(a){case \"keypress\":if(0===qd(c))return null;case \"keydown\":case \"keyup\":a=td;break;case \"blur\":case \"focus\":a=pd;break;case \"click\":if(2===c.button)return null;case \"auxclick\":case \"dblclick\":case \"mousedown\":case \"mousemove\":case \"mouseup\":case \"mouseout\":case \"mouseover\":case \"contextmenu\":a=cd;break;case \"drag\":case \"dragend\":case \"dragenter\":case \"dragexit\":case \"dragleave\":case \"dragover\":case \"dragstart\":case \"drop\":a=\nud;break;case \"touchcancel\":case \"touchend\":case \"touchmove\":case \"touchstart\":a=vd;break;case bb:case cb:case db:a=nd;break;case eb:a=wd;break;case \"scroll\":a=Vc;break;case \"wheel\":a=xd;break;case \"copy\":case \"cut\":case \"paste\":a=od;break;case \"gotpointercapture\":case \"lostpointercapture\":case \"pointercancel\":case \"pointerdown\":case \"pointermove\":case \"pointerout\":case \"pointerover\":case \"pointerup\":a=dd;break;default:a=z}b=a.getPooled(e,b,c,d);Ua(b);return b}},Dd=Cd.isInteractiveTopLevelEventType,\nEd=[];function Fd(a){var b=a.targetInst,c=b;do{if(!c){a.ancestors.push(c);break}var d;for(d=c;d.return;)d=d.return;d=5!==d.tag?null:d.stateNode.containerInfo;if(!d)break;a.ancestors.push(c);c=Ka(d)}while(c);for(c=0;c<a.ancestors.length;c++){b=a.ancestors[c];var e=Sb(a.nativeEvent);d=a.topLevelType;for(var f=a.nativeEvent,g=null,h=0;h<pa.length;h++){var k=pa[h];k&&(k=k.extractEvents(d,b,f,e))&&(g=ya(g,k))}Ga(g,!1)}}var Gd=!0;\nfunction F(a,b){if(!b)return null;var c=(Dd(a)?Hd:Id).bind(null,a);b.addEventListener(a,c,!1)}function Jd(a,b){if(!b)return null;var c=(Dd(a)?Hd:Id).bind(null,a);b.addEventListener(a,c,!0)}function Hd(a,b){Mb(Id,a,b)}\nfunction Id(a,b){if(Gd){var c=Sb(b);c=Ka(c);null===c||\"number\"!==typeof c.tag||2===jd(c)||(c=null);if(Ed.length){var d=Ed.pop();d.topLevelType=a;d.nativeEvent=b;d.targetInst=c;a=d}else a={topLevelType:a,nativeEvent:b,targetInst:c,ancestors:[]};try{Pb(Fd,a)}finally{a.topLevelType=null,a.nativeEvent=null,a.targetInst=null,a.ancestors.length=0,10>Ed.length&&Ed.push(a)}}}var Kd={},Ld=0,Md=\"_reactListenersID\"+(\"\"+Math.random()).slice(2);\nfunction Nd(a){Object.prototype.hasOwnProperty.call(a,Md)||(a[Md]=Ld++,Kd[a[Md]]={});return Kd[a[Md]]}function Od(a){a=a||(\"undefined\"!==typeof document?document:void 0);if(\"undefined\"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}function Qd(a){for(;a&&a.firstChild;)a=a.firstChild;return a}\nfunction Rd(a,b){var c=Qd(a);a=0;for(var d;c;){if(3===c.nodeType){d=a+c.textContent.length;if(a<=b&&d>=b)return{node:c,offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=Qd(c)}}function Sd(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?Sd(a,b.parentNode):\"contains\"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}\nfunction Td(){for(var a=window,b=Od();b instanceof a.HTMLIFrameElement;){try{a=b.contentDocument.defaultView}catch(c){break}b=Od(a.document)}return b}function Ud(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&(\"input\"===b&&(\"text\"===a.type||\"search\"===a.type||\"tel\"===a.type||\"url\"===a.type||\"password\"===a.type)||\"textarea\"===b||\"true\"===a.contentEditable)}\nvar Vd=Va&&\"documentMode\"in document&&11>=document.documentMode,Wd={select:{phasedRegistrationNames:{bubbled:\"onSelect\",captured:\"onSelectCapture\"},dependencies:\"blur contextmenu dragend focus keydown keyup mousedown mouseup selectionchange\".split(\" \")}},Xd=null,Yd=null,Zd=null,$d=!1;\nfunction ae(a,b){var c=b.window===b?b.document:9===b.nodeType?b:b.ownerDocument;if($d||null==Xd||Xd!==Od(c))return null;c=Xd;\"selectionStart\"in c&&Ud(c)?c={start:c.selectionStart,end:c.selectionEnd}:(c=(c.ownerDocument&&c.ownerDocument.defaultView||window).getSelection(),c={anchorNode:c.anchorNode,anchorOffset:c.anchorOffset,focusNode:c.focusNode,focusOffset:c.focusOffset});return Zd&&id(Zd,c)?null:(Zd=c,a=z.getPooled(Wd.select,Yd,a,b),a.type=\"select\",a.target=Xd,Ua(a),a)}\nvar be={eventTypes:Wd,extractEvents:function(a,b,c,d){var e=d.window===d?d.document:9===d.nodeType?d:d.ownerDocument,f;if(!(f=!e)){a:{e=Nd(e);f=ta.onSelect;for(var g=0;g<f.length;g++){var h=f[g];if(!e.hasOwnProperty(h)||!e[h]){e=!1;break a}}e=!0}f=!e}if(f)return null;e=b?Ma(b):window;switch(a){case \"focus\":if(Rb(e)||\"true\"===e.contentEditable)Xd=e,Yd=b,Zd=null;break;case \"blur\":Zd=Yd=Xd=null;break;case \"mousedown\":$d=!0;break;case \"contextmenu\":case \"mouseup\":case \"dragend\":return $d=!1,ae(c,d);case \"selectionchange\":if(Vd)break;\ncase \"keydown\":case \"keyup\":return ae(c,d)}return null}};Ea.injectEventPluginOrder(\"ResponderEventPlugin SimpleEventPlugin EnterLeaveEventPlugin ChangeEventPlugin SelectEventPlugin BeforeInputEventPlugin\".split(\" \"));ua=Na;va=La;wa=Ma;Ea.injectEventPluginsByName({SimpleEventPlugin:Cd,EnterLeaveEventPlugin:fd,ChangeEventPlugin:Uc,SelectEventPlugin:be,BeforeInputEventPlugin:Eb});function ce(a){var b=\"\";aa.Children.forEach(a,function(a){null!=a&&(b+=a)});return b}\nfunction de(a,b){a=n({children:void 0},b);if(b=ce(b.children))a.children=b;return a}function ee(a,b,c,d){a=a.options;if(b){b={};for(var e=0;e<c.length;e++)b[\"$\"+c[e]]=!0;for(c=0;c<a.length;c++)e=b.hasOwnProperty(\"$\"+a[c].value),a[c].selected!==e&&(a[c].selected=e),e&&d&&(a[c].defaultSelected=!0)}else{c=\"\"+yc(c);b=null;for(e=0;e<a.length;e++){if(a[e].value===c){a[e].selected=!0;d&&(a[e].defaultSelected=!0);return}null!==b||a[e].disabled||(b=a[e])}null!==b&&(b.selected=!0)}}\nfunction fe(a,b){null!=b.dangerouslySetInnerHTML?t(\"91\"):void 0;return n({},b,{value:void 0,defaultValue:void 0,children:\"\"+a._wrapperState.initialValue})}function ge(a,b){var c=b.value;null==c&&(c=b.defaultValue,b=b.children,null!=b&&(null!=c?t(\"92\"):void 0,Array.isArray(b)&&(1>=b.length?void 0:t(\"93\"),b=b[0]),c=b),null==c&&(c=\"\"));a._wrapperState={initialValue:yc(c)}}\nfunction he(a,b){var c=yc(b.value);null!=c&&(c=\"\"+c,c!==a.value&&(a.value=c),null==b.defaultValue&&(a.defaultValue=c));null!=b.defaultValue&&(a.defaultValue=\"\"+yc(b.defaultValue))}function ie(a){var b=a.textContent;b===a._wrapperState.initialValue&&(a.value=b)}var je={html:\"http://www.w3.org/1999/xhtml\",mathml:\"http://www.w3.org/1998/Math/MathML\",svg:\"http://www.w3.org/2000/svg\"};\nfunction ke(a){switch(a){case \"svg\":return\"http://www.w3.org/2000/svg\";case \"math\":return\"http://www.w3.org/1998/Math/MathML\";default:return\"http://www.w3.org/1999/xhtml\"}}function le(a,b){return null==a||\"http://www.w3.org/1999/xhtml\"===a?ke(b):\"http://www.w3.org/2000/svg\"===a&&\"foreignObject\"===b?\"http://www.w3.org/1999/xhtml\":a}\nvar me=void 0,ne=function(a){return\"undefined\"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(b,c,d,e){MSApp.execUnsafeLocalFunction(function(){return a(b,c,d,e)})}:a}(function(a,b){if(a.namespaceURI!==je.svg||\"innerHTML\"in a)a.innerHTML=b;else{me=me||document.createElement(\"div\");me.innerHTML=\"<svg>\"+b+\"</svg>\";for(b=me.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}});\nfunction oe(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b}\nvar pe={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,\nfloodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},qe=[\"Webkit\",\"ms\",\"Moz\",\"O\"];Object.keys(pe).forEach(function(a){qe.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);pe[b]=pe[a]})});\nfunction re(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf(\"--\");var e=c;var f=b[c];e=null==f||\"boolean\"===typeof f||\"\"===f?\"\":d||\"number\"!==typeof f||0===f||pe.hasOwnProperty(e)&&pe[e]?(\"\"+f).trim():f+\"px\";\"float\"===c&&(c=\"cssFloat\");d?a.setProperty(c,e):a[c]=e}}var se=n({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});\nfunction te(a,b){b&&(se[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML?t(\"137\",a,\"\"):void 0),null!=b.dangerouslySetInnerHTML&&(null!=b.children?t(\"60\"):void 0,\"object\"===typeof b.dangerouslySetInnerHTML&&\"__html\"in b.dangerouslySetInnerHTML?void 0:t(\"61\")),null!=b.style&&\"object\"!==typeof b.style?t(\"62\",\"\"):void 0)}\nfunction ue(a,b){if(-1===a.indexOf(\"-\"))return\"string\"===typeof b.is;switch(a){case \"annotation-xml\":case \"color-profile\":case \"font-face\":case \"font-face-src\":case \"font-face-uri\":case \"font-face-format\":case \"font-face-name\":case \"missing-glyph\":return!1;default:return!0}}\nfunction ve(a,b){a=9===a.nodeType||11===a.nodeType?a:a.ownerDocument;var c=Nd(a);b=ta[b];for(var d=0;d<b.length;d++){var e=b[d];if(!c.hasOwnProperty(e)||!c[e]){switch(e){case \"scroll\":Jd(\"scroll\",a);break;case \"focus\":case \"blur\":Jd(\"focus\",a);Jd(\"blur\",a);c.blur=!0;c.focus=!0;break;case \"cancel\":case \"close\":Tb(e)&&Jd(e,a);break;case \"invalid\":case \"submit\":case \"reset\":break;default:-1===fb.indexOf(e)&&F(e,a)}c[e]=!0}}}function we(){}var xe=null,ye=null;\nfunction ze(a,b){switch(a){case \"button\":case \"input\":case \"select\":case \"textarea\":return!!b.autoFocus}return!1}function Ae(a,b){return\"textarea\"===a||\"option\"===a||\"noscript\"===a||\"string\"===typeof b.children||\"number\"===typeof b.children||\"object\"===typeof b.dangerouslySetInnerHTML&&null!==b.dangerouslySetInnerHTML&&null!=b.dangerouslySetInnerHTML.__html}function Be(a){for(a=a.nextSibling;a&&1!==a.nodeType&&3!==a.nodeType;)a=a.nextSibling;return a}\nfunction Ce(a){for(a=a.firstChild;a&&1!==a.nodeType&&3!==a.nodeType;)a=a.nextSibling;return a}new Set;var De=[],Ee=-1;function G(a){0>Ee||(a.current=De[Ee],De[Ee]=null,Ee--)}function H(a,b){Ee++;De[Ee]=a.current;a.current=b}var Fe={},I={current:Fe},J={current:!1},Ge=Fe;\nfunction He(a,b){var c=a.type.contextTypes;if(!c)return Fe;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}function K(a){a=a.childContextTypes;return null!==a&&void 0!==a}function Ie(a){G(J,a);G(I,a)}function Je(a){G(J,a);G(I,a)}\nfunction Ke(a,b,c){I.current!==Fe?t(\"168\"):void 0;H(I,b,a);H(J,c,a)}function Le(a,b,c){var d=a.stateNode;a=b.childContextTypes;if(\"function\"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)e in a?void 0:t(\"108\",lc(b)||\"Unknown\",e);return n({},c,d)}function Me(a){var b=a.stateNode;b=b&&b.__reactInternalMemoizedMergedChildContext||Fe;Ge=I.current;H(I,b,a);H(J,J.current,a);return!0}\nfunction Ne(a,b,c){var d=a.stateNode;d?void 0:t(\"169\");c?(b=Le(a,b,Ge),d.__reactInternalMemoizedMergedChildContext=b,G(J,a),G(I,a),H(I,b,a)):G(J,a);H(J,c,a)}var Oe=null,Pe=null;function Qe(a){return function(b){try{return a(b)}catch(c){}}}\nfunction Re(a){if(\"undefined\"===typeof __REACT_DEVTOOLS_GLOBAL_HOOK__)return!1;var b=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(b.isDisabled||!b.supportsFiber)return!0;try{var c=b.inject(a);Oe=Qe(function(a){return b.onCommitFiberRoot(c,a)});Pe=Qe(function(a){return b.onCommitFiberUnmount(c,a)})}catch(d){}return!0}\nfunction Se(a,b,c,d){this.tag=a;this.key=c;this.sibling=this.child=this.return=this.stateNode=this.type=null;this.index=0;this.ref=null;this.pendingProps=b;this.firstContextDependency=this.memoizedState=this.updateQueue=this.memoizedProps=null;this.mode=d;this.effectTag=0;this.lastEffect=this.firstEffect=this.nextEffect=null;this.childExpirationTime=this.expirationTime=0;this.alternate=null}function Te(a){a=a.prototype;return!(!a||!a.isReactComponent)}\nfunction Ue(a,b,c){var d=a.alternate;null===d?(d=new Se(a.tag,b,a.key,a.mode),d.type=a.type,d.stateNode=a.stateNode,d.alternate=a,a.alternate=d):(d.pendingProps=b,d.effectTag=0,d.nextEffect=null,d.firstEffect=null,d.lastEffect=null);d.childExpirationTime=a.childExpirationTime;d.expirationTime=b!==a.pendingProps?c:a.expirationTime;d.child=a.child;d.memoizedProps=a.memoizedProps;d.memoizedState=a.memoizedState;d.updateQueue=a.updateQueue;d.firstContextDependency=a.firstContextDependency;d.sibling=a.sibling;\nd.index=a.index;d.ref=a.ref;return d}\nfunction Ve(a,b,c){var d=a.type,e=a.key;a=a.props;var f=void 0;if(\"function\"===typeof d)f=Te(d)?2:4;else if(\"string\"===typeof d)f=7;else a:switch(d){case bc:return We(a.children,b,c,e);case gc:f=10;b|=3;break;case cc:f=10;b|=2;break;case dc:return d=new Se(15,a,e,b|4),d.type=dc,d.expirationTime=c,d;case ic:f=16;break;default:if(\"object\"===typeof d&&null!==d)switch(d.$$typeof){case ec:f=12;break a;case fc:f=11;break a;case hc:f=13;break a;default:if(\"function\"===typeof d.then){f=4;break a}}t(\"130\",\nnull==d?d:typeof d,\"\")}b=new Se(f,a,e,b);b.type=d;b.expirationTime=c;return b}function We(a,b,c,d){a=new Se(9,a,d,b);a.expirationTime=c;return a}function Xe(a,b,c){a=new Se(8,a,null,b);a.expirationTime=c;return a}function Ye(a,b,c){b=new Se(6,null!==a.children?a.children:[],a.key,b);b.expirationTime=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b}\nfunction Ze(a,b){a.didError=!1;var c=a.earliestPendingTime;0===c?a.earliestPendingTime=a.latestPendingTime=b:c>b?a.earliestPendingTime=b:a.latestPendingTime<b&&(a.latestPendingTime=b);$e(b,a)}function $e(a,b){var c=b.earliestSuspendedTime,d=b.latestSuspendedTime,e=b.earliestPendingTime,f=b.latestPingedTime;e=0!==e?e:f;0===e&&(0===a||d>a)&&(e=d);a=e;0!==a&&0!==c&&c<a&&(a=c);b.nextExpirationTimeToWorkOn=e;b.expirationTime=a}var af=!1;\nfunction bf(a){return{baseState:a,firstUpdate:null,lastUpdate:null,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}function cf(a){return{baseState:a.baseState,firstUpdate:a.firstUpdate,lastUpdate:a.lastUpdate,firstCapturedUpdate:null,lastCapturedUpdate:null,firstEffect:null,lastEffect:null,firstCapturedEffect:null,lastCapturedEffect:null}}\nfunction df(a){return{expirationTime:a,tag:0,payload:null,callback:null,next:null,nextEffect:null}}function ef(a,b){null===a.lastUpdate?a.firstUpdate=a.lastUpdate=b:(a.lastUpdate.next=b,a.lastUpdate=b)}\nfunction ff(a,b){var c=a.alternate;if(null===c){var d=a.updateQueue;var e=null;null===d&&(d=a.updateQueue=bf(a.memoizedState))}else d=a.updateQueue,e=c.updateQueue,null===d?null===e?(d=a.updateQueue=bf(a.memoizedState),e=c.updateQueue=bf(c.memoizedState)):d=a.updateQueue=cf(e):null===e&&(e=c.updateQueue=cf(d));null===e||d===e?ef(d,b):null===d.lastUpdate||null===e.lastUpdate?(ef(d,b),ef(e,b)):(ef(d,b),e.lastUpdate=b)}\nfunction gf(a,b){var c=a.updateQueue;c=null===c?a.updateQueue=bf(a.memoizedState):hf(a,c);null===c.lastCapturedUpdate?c.firstCapturedUpdate=c.lastCapturedUpdate=b:(c.lastCapturedUpdate.next=b,c.lastCapturedUpdate=b)}function hf(a,b){var c=a.alternate;null!==c&&b===c.updateQueue&&(b=a.updateQueue=cf(b));return b}\nfunction jf(a,b,c,d,e,f){switch(c.tag){case 1:return a=c.payload,\"function\"===typeof a?a.call(f,d,e):a;case 3:a.effectTag=a.effectTag&-1025|64;case 0:a=c.payload;e=\"function\"===typeof a?a.call(f,d,e):a;if(null===e||void 0===e)break;return n({},d,e);case 2:af=!0}return d}\nfunction kf(a,b,c,d,e){af=!1;b=hf(a,b);for(var f=b.baseState,g=null,h=0,k=b.firstUpdate,l=f;null!==k;){var m=k.expirationTime;if(m>e){if(null===g&&(g=k,f=l),0===h||h>m)h=m}else l=jf(a,b,k,l,c,d),null!==k.callback&&(a.effectTag|=32,k.nextEffect=null,null===b.lastEffect?b.firstEffect=b.lastEffect=k:(b.lastEffect.nextEffect=k,b.lastEffect=k));k=k.next}m=null;for(k=b.firstCapturedUpdate;null!==k;){var r=k.expirationTime;if(r>e){if(null===m&&(m=k,null===g&&(f=l)),0===h||h>r)h=r}else l=jf(a,b,k,l,c,d),\nnull!==k.callback&&(a.effectTag|=32,k.nextEffect=null,null===b.lastCapturedEffect?b.firstCapturedEffect=b.lastCapturedEffect=k:(b.lastCapturedEffect.nextEffect=k,b.lastCapturedEffect=k));k=k.next}null===g&&(b.lastUpdate=null);null===m?b.lastCapturedUpdate=null:a.effectTag|=32;null===g&&null===m&&(f=l);b.baseState=f;b.firstUpdate=g;b.firstCapturedUpdate=m;a.expirationTime=h;a.memoizedState=l}\nfunction lf(a,b,c){null!==b.firstCapturedUpdate&&(null!==b.lastUpdate&&(b.lastUpdate.next=b.firstCapturedUpdate,b.lastUpdate=b.lastCapturedUpdate),b.firstCapturedUpdate=b.lastCapturedUpdate=null);mf(b.firstEffect,c);b.firstEffect=b.lastEffect=null;mf(b.firstCapturedEffect,c);b.firstCapturedEffect=b.lastCapturedEffect=null}function mf(a,b){for(;null!==a;){var c=a.callback;if(null!==c){a.callback=null;var d=b;\"function\"!==typeof c?t(\"191\",c):void 0;c.call(d)}a=a.nextEffect}}\nfunction nf(a,b){return{value:a,source:b,stack:mc(b)}}var of={current:null},pf=null,qf=null,rf=null;function sf(a,b){var c=a.type._context;H(of,c._currentValue,a);c._currentValue=b}function tf(a){var b=of.current;G(of,a);a.type._context._currentValue=b}function uf(a){pf=a;rf=qf=null;a.firstContextDependency=null}\nfunction vf(a,b){if(rf!==a&&!1!==b&&0!==b){if(\"number\"!==typeof b||1073741823===b)rf=a,b=1073741823;b={context:a,observedBits:b,next:null};null===qf?(null===pf?t(\"277\"):void 0,pf.firstContextDependency=qf=b):qf=qf.next=b}return a._currentValue}var wf={},L={current:wf},xf={current:wf},yf={current:wf};function zf(a){a===wf?t(\"174\"):void 0;return a}\nfunction Af(a,b){H(yf,b,a);H(xf,a,a);H(L,wf,a);var c=b.nodeType;switch(c){case 9:case 11:b=(b=b.documentElement)?b.namespaceURI:le(null,\"\");break;default:c=8===c?b.parentNode:b,b=c.namespaceURI||null,c=c.tagName,b=le(b,c)}G(L,a);H(L,b,a)}function Bf(a){G(L,a);G(xf,a);G(yf,a)}function Cf(a){zf(yf.current);var b=zf(L.current);var c=le(b,a.type);b!==c&&(H(xf,a,a),H(L,c,a))}function Df(a){xf.current===a&&(G(L,a),G(xf,a))}var Ef=(new aa.Component).refs;\nfunction Ff(a,b,c,d){b=a.memoizedState;c=c(d,b);c=null===c||void 0===c?b:n({},b,c);a.memoizedState=c;d=a.updateQueue;null!==d&&0===a.expirationTime&&(d.baseState=c)}\nvar Jf={isMounted:function(a){return(a=a._reactInternalFiber)?2===jd(a):!1},enqueueSetState:function(a,b,c){a=a._reactInternalFiber;var d=Gf();d=Hf(d,a);var e=df(d);e.payload=b;void 0!==c&&null!==c&&(e.callback=c);ff(a,e);If(a,d)},enqueueReplaceState:function(a,b,c){a=a._reactInternalFiber;var d=Gf();d=Hf(d,a);var e=df(d);e.tag=1;e.payload=b;void 0!==c&&null!==c&&(e.callback=c);ff(a,e);If(a,d)},enqueueForceUpdate:function(a,b){a=a._reactInternalFiber;var c=Gf();c=Hf(c,a);var d=df(c);d.tag=2;void 0!==\nb&&null!==b&&(d.callback=b);ff(a,d);If(a,c)}};function Kf(a,b,c,d,e,f,g){a=a.stateNode;return\"function\"===typeof a.shouldComponentUpdate?a.shouldComponentUpdate(d,f,g):b.prototype&&b.prototype.isPureReactComponent?!id(c,d)||!id(e,f):!0}function Lf(a,b,c,d){a=b.state;\"function\"===typeof b.componentWillReceiveProps&&b.componentWillReceiveProps(c,d);\"function\"===typeof b.UNSAFE_componentWillReceiveProps&&b.UNSAFE_componentWillReceiveProps(c,d);b.state!==a&&Jf.enqueueReplaceState(b,b.state,null)}\nfunction Mf(a,b,c,d){var e=a.stateNode,f=K(b)?Ge:I.current;e.props=c;e.state=a.memoizedState;e.refs=Ef;e.context=He(a,f);f=a.updateQueue;null!==f&&(kf(a,f,c,e,d),e.state=a.memoizedState);f=b.getDerivedStateFromProps;\"function\"===typeof f&&(Ff(a,b,f,c),e.state=a.memoizedState);\"function\"===typeof b.getDerivedStateFromProps||\"function\"===typeof e.getSnapshotBeforeUpdate||\"function\"!==typeof e.UNSAFE_componentWillMount&&\"function\"!==typeof e.componentWillMount||(b=e.state,\"function\"===typeof e.componentWillMount&&\ne.componentWillMount(),\"function\"===typeof e.UNSAFE_componentWillMount&&e.UNSAFE_componentWillMount(),b!==e.state&&Jf.enqueueReplaceState(e,e.state,null),f=a.updateQueue,null!==f&&(kf(a,f,c,e,d),e.state=a.memoizedState));\"function\"===typeof e.componentDidMount&&(a.effectTag|=4)}var Nf=Array.isArray;\nfunction Of(a,b,c){a=c.ref;if(null!==a&&\"function\"!==typeof a&&\"object\"!==typeof a){if(c._owner){c=c._owner;var d=void 0;c&&(2!==c.tag&&3!==c.tag?t(\"110\"):void 0,d=c.stateNode);d?void 0:t(\"147\",a);var e=\"\"+a;if(null!==b&&null!==b.ref&&\"function\"===typeof b.ref&&b.ref._stringRef===e)return b.ref;b=function(a){var b=d.refs;b===Ef&&(b=d.refs={});null===a?delete b[e]:b[e]=a};b._stringRef=e;return b}\"string\"!==typeof a?t(\"284\"):void 0;c._owner?void 0:t(\"254\",a)}return a}\nfunction Pf(a,b){\"textarea\"!==a.type&&t(\"31\",\"[object Object]\"===Object.prototype.toString.call(b)?\"object with keys {\"+Object.keys(b).join(\", \")+\"}\":b,\"\")}\nfunction Qf(a){function b(b,c){if(a){var d=b.lastEffect;null!==d?(d.nextEffect=c,b.lastEffect=c):b.firstEffect=b.lastEffect=c;c.nextEffect=null;c.effectTag=8}}function c(c,d){if(!a)return null;for(;null!==d;)b(c,d),d=d.sibling;return null}function d(a,b){for(a=new Map;null!==b;)null!==b.key?a.set(b.key,b):a.set(b.index,b),b=b.sibling;return a}function e(a,b,c){a=Ue(a,b,c);a.index=0;a.sibling=null;return a}function f(b,c,d){b.index=d;if(!a)return c;d=b.alternate;if(null!==d)return d=d.index,d<c?(b.effectTag=\n2,c):d;b.effectTag=2;return c}function g(b){a&&null===b.alternate&&(b.effectTag=2);return b}function h(a,b,c,d){if(null===b||8!==b.tag)return b=Xe(c,a.mode,d),b.return=a,b;b=e(b,c,d);b.return=a;return b}function k(a,b,c,d){if(null!==b&&b.type===c.type)return d=e(b,c.props,d),d.ref=Of(a,b,c),d.return=a,d;d=Ve(c,a.mode,d);d.ref=Of(a,b,c);d.return=a;return d}function l(a,b,c,d){if(null===b||6!==b.tag||b.stateNode.containerInfo!==c.containerInfo||b.stateNode.implementation!==c.implementation)return b=\nYe(c,a.mode,d),b.return=a,b;b=e(b,c.children||[],d);b.return=a;return b}function m(a,b,c,d,f){if(null===b||9!==b.tag)return b=We(c,a.mode,d,f),b.return=a,b;b=e(b,c,d);b.return=a;return b}function r(a,b,c){if(\"string\"===typeof b||\"number\"===typeof b)return b=Xe(\"\"+b,a.mode,c),b.return=a,b;if(\"object\"===typeof b&&null!==b){switch(b.$$typeof){case $b:return c=Ve(b,a.mode,c),c.ref=Of(a,null,b),c.return=a,c;case ac:return b=Ye(b,a.mode,c),b.return=a,b}if(Nf(b)||kc(b))return b=We(b,a.mode,c,null),b.return=\na,b;Pf(a,b)}return null}function A(a,b,c,d){var e=null!==b?b.key:null;if(\"string\"===typeof c||\"number\"===typeof c)return null!==e?null:h(a,b,\"\"+c,d);if(\"object\"===typeof c&&null!==c){switch(c.$$typeof){case $b:return c.key===e?c.type===bc?m(a,b,c.props.children,d,e):k(a,b,c,d):null;case ac:return c.key===e?l(a,b,c,d):null}if(Nf(c)||kc(c))return null!==e?null:m(a,b,c,d,null);Pf(a,c)}return null}function S(a,b,c,d,e){if(\"string\"===typeof d||\"number\"===typeof d)return a=a.get(c)||null,h(b,a,\"\"+d,e);\nif(\"object\"===typeof d&&null!==d){switch(d.$$typeof){case $b:return a=a.get(null===d.key?c:d.key)||null,d.type===bc?m(b,a,d.props.children,e,d.key):k(b,a,d,e);case ac:return a=a.get(null===d.key?c:d.key)||null,l(b,a,d,e)}if(Nf(d)||kc(d))return a=a.get(c)||null,m(b,a,d,e,null);Pf(b,d)}return null}function B(e,g,h,k){for(var l=null,m=null,p=g,u=g=0,q=null;null!==p&&u<h.length;u++){p.index>u?(q=p,p=null):q=p.sibling;var v=A(e,p,h[u],k);if(null===v){null===p&&(p=q);break}a&&p&&null===v.alternate&&b(e,\np);g=f(v,g,u);null===m?l=v:m.sibling=v;m=v;p=q}if(u===h.length)return c(e,p),l;if(null===p){for(;u<h.length;u++)if(p=r(e,h[u],k))g=f(p,g,u),null===m?l=p:m.sibling=p,m=p;return l}for(p=d(e,p);u<h.length;u++)if(q=S(p,e,u,h[u],k))a&&null!==q.alternate&&p.delete(null===q.key?u:q.key),g=f(q,g,u),null===m?l=q:m.sibling=q,m=q;a&&p.forEach(function(a){return b(e,a)});return l}function P(e,g,h,k){var l=kc(h);\"function\"!==typeof l?t(\"150\"):void 0;h=l.call(h);null==h?t(\"151\"):void 0;for(var m=l=null,p=g,u=g=\n0,q=null,v=h.next();null!==p&&!v.done;u++,v=h.next()){p.index>u?(q=p,p=null):q=p.sibling;var x=A(e,p,v.value,k);if(null===x){p||(p=q);break}a&&p&&null===x.alternate&&b(e,p);g=f(x,g,u);null===m?l=x:m.sibling=x;m=x;p=q}if(v.done)return c(e,p),l;if(null===p){for(;!v.done;u++,v=h.next())v=r(e,v.value,k),null!==v&&(g=f(v,g,u),null===m?l=v:m.sibling=v,m=v);return l}for(p=d(e,p);!v.done;u++,v=h.next())v=S(p,e,u,v.value,k),null!==v&&(a&&null!==v.alternate&&p.delete(null===v.key?u:v.key),g=f(v,g,u),null===\nm?l=v:m.sibling=v,m=v);a&&p.forEach(function(a){return b(e,a)});return l}return function(a,d,f,h){var k=\"object\"===typeof f&&null!==f&&f.type===bc&&null===f.key;k&&(f=f.props.children);var l=\"object\"===typeof f&&null!==f;if(l)switch(f.$$typeof){case $b:a:{l=f.key;for(k=d;null!==k;){if(k.key===l)if(9===k.tag?f.type===bc:k.type===f.type){c(a,k.sibling);d=e(k,f.type===bc?f.props.children:f.props,h);d.ref=Of(a,k,f);d.return=a;a=d;break a}else{c(a,k);break}else b(a,k);k=k.sibling}f.type===bc?(d=We(f.props.children,\na.mode,h,f.key),d.return=a,a=d):(h=Ve(f,a.mode,h),h.ref=Of(a,d,f),h.return=a,a=h)}return g(a);case ac:a:{for(k=f.key;null!==d;){if(d.key===k)if(6===d.tag&&d.stateNode.containerInfo===f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[],h);d.return=a;a=d;break a}else{c(a,d);break}else b(a,d);d=d.sibling}d=Ye(f,a.mode,h);d.return=a;a=d}return g(a)}if(\"string\"===typeof f||\"number\"===typeof f)return f=\"\"+f,null!==d&&8===d.tag?(c(a,d.sibling),d=e(d,f,h),d.return=\na,a=d):(c(a,d),d=Xe(f,a.mode,h),d.return=a,a=d),g(a);if(Nf(f))return B(a,d,f,h);if(kc(f))return P(a,d,f,h);l&&Pf(a,f);if(\"undefined\"===typeof f&&!k)switch(a.tag){case 2:case 3:case 0:h=a.type,t(\"152\",h.displayName||h.name||\"Component\")}return c(a,d)}}var Rf=Qf(!0),Sf=Qf(!1),Tf=null,Uf=null,Vf=!1;function Wf(a,b){var c=new Se(7,null,null,0);c.type=\"DELETED\";c.stateNode=b;c.return=a;c.effectTag=8;null!==a.lastEffect?(a.lastEffect.nextEffect=c,a.lastEffect=c):a.firstEffect=a.lastEffect=c}\nfunction Xf(a,b){switch(a.tag){case 7:var c=a.type;b=1!==b.nodeType||c.toLowerCase()!==b.nodeName.toLowerCase()?null:b;return null!==b?(a.stateNode=b,!0):!1;case 8:return b=\"\"===a.pendingProps||3!==b.nodeType?null:b,null!==b?(a.stateNode=b,!0):!1;default:return!1}}function Yf(a){if(Vf){var b=Uf;if(b){var c=b;if(!Xf(a,b)){b=Be(c);if(!b||!Xf(a,b)){a.effectTag|=2;Vf=!1;Tf=a;return}Wf(Tf,c)}Tf=a;Uf=Ce(b)}else a.effectTag|=2,Vf=!1,Tf=a}}\nfunction Zf(a){for(a=a.return;null!==a&&7!==a.tag&&5!==a.tag;)a=a.return;Tf=a}function $f(a){if(a!==Tf)return!1;if(!Vf)return Zf(a),Vf=!0,!1;var b=a.type;if(7!==a.tag||\"head\"!==b&&\"body\"!==b&&!Ae(b,a.memoizedProps))for(b=Uf;b;)Wf(a,b),b=Be(b);Zf(a);Uf=Tf?Be(a.stateNode):null;return!0}function ag(){Uf=Tf=null;Vf=!1}\nfunction bg(a){switch(a._reactStatus){case 1:return a._reactResult;case 2:throw a._reactResult;case 0:throw a;default:throw a._reactStatus=0,a.then(function(b){if(0===a._reactStatus){a._reactStatus=1;if(\"object\"===typeof b&&null!==b){var c=b.default;b=void 0!==c&&null!==c?c:b}a._reactResult=b}},function(b){0===a._reactStatus&&(a._reactStatus=2,a._reactResult=b)}),a;}}var cg=Yb.ReactCurrentOwner;function M(a,b,c,d){b.child=null===a?Sf(b,null,c,d):Rf(b,a.child,c,d)}\nfunction dg(a,b,c,d,e){c=c.render;var f=b.ref;if(!J.current&&b.memoizedProps===d&&f===(null!==a?a.ref:null))return eg(a,b,e);c=c(d,f);M(a,b,c,e);b.memoizedProps=d;return b.child}function fg(a,b){var c=b.ref;if(null===a&&null!==c||null!==a&&a.ref!==c)b.effectTag|=128}function gg(a,b,c,d,e){var f=K(c)?Ge:I.current;f=He(b,f);uf(b,e);c=c(d,f);b.effectTag|=1;M(a,b,c,e);b.memoizedProps=d;return b.child}\nfunction hg(a,b,c,d,e){if(K(c)){var f=!0;Me(b)}else f=!1;uf(b,e);if(null===a)if(null===b.stateNode){var g=K(c)?Ge:I.current,h=c.contextTypes,k=null!==h&&void 0!==h;h=k?He(b,g):Fe;var l=new c(d,h);b.memoizedState=null!==l.state&&void 0!==l.state?l.state:null;l.updater=Jf;b.stateNode=l;l._reactInternalFiber=b;k&&(k=b.stateNode,k.__reactInternalMemoizedUnmaskedChildContext=g,k.__reactInternalMemoizedMaskedChildContext=h);Mf(b,c,d,e);d=!0}else{g=b.stateNode;h=b.memoizedProps;g.props=h;var m=g.context;\nk=K(c)?Ge:I.current;k=He(b,k);var r=c.getDerivedStateFromProps;(l=\"function\"===typeof r||\"function\"===typeof g.getSnapshotBeforeUpdate)||\"function\"!==typeof g.UNSAFE_componentWillReceiveProps&&\"function\"!==typeof g.componentWillReceiveProps||(h!==d||m!==k)&&Lf(b,g,d,k);af=!1;var A=b.memoizedState;m=g.state=A;var S=b.updateQueue;null!==S&&(kf(b,S,d,g,e),m=b.memoizedState);h!==d||A!==m||J.current||af?(\"function\"===typeof r&&(Ff(b,c,r,d),m=b.memoizedState),(h=af||Kf(b,c,h,d,A,m,k))?(l||\"function\"!==\ntypeof g.UNSAFE_componentWillMount&&\"function\"!==typeof g.componentWillMount||(\"function\"===typeof g.componentWillMount&&g.componentWillMount(),\"function\"===typeof g.UNSAFE_componentWillMount&&g.UNSAFE_componentWillMount()),\"function\"===typeof g.componentDidMount&&(b.effectTag|=4)):(\"function\"===typeof g.componentDidMount&&(b.effectTag|=4),b.memoizedProps=d,b.memoizedState=m),g.props=d,g.state=m,g.context=k,d=h):(\"function\"===typeof g.componentDidMount&&(b.effectTag|=4),d=!1)}else g=b.stateNode,h=\nb.memoizedProps,g.props=h,m=g.context,k=K(c)?Ge:I.current,k=He(b,k),r=c.getDerivedStateFromProps,(l=\"function\"===typeof r||\"function\"===typeof g.getSnapshotBeforeUpdate)||\"function\"!==typeof g.UNSAFE_componentWillReceiveProps&&\"function\"!==typeof g.componentWillReceiveProps||(h!==d||m!==k)&&Lf(b,g,d,k),af=!1,m=b.memoizedState,A=g.state=m,S=b.updateQueue,null!==S&&(kf(b,S,d,g,e),A=b.memoizedState),h!==d||m!==A||J.current||af?(\"function\"===typeof r&&(Ff(b,c,r,d),A=b.memoizedState),(r=af||Kf(b,c,h,d,\nm,A,k))?(l||\"function\"!==typeof g.UNSAFE_componentWillUpdate&&\"function\"!==typeof g.componentWillUpdate||(\"function\"===typeof g.componentWillUpdate&&g.componentWillUpdate(d,A,k),\"function\"===typeof g.UNSAFE_componentWillUpdate&&g.UNSAFE_componentWillUpdate(d,A,k)),\"function\"===typeof g.componentDidUpdate&&(b.effectTag|=4),\"function\"===typeof g.getSnapshotBeforeUpdate&&(b.effectTag|=256)):(\"function\"!==typeof g.componentDidUpdate||h===a.memoizedProps&&m===a.memoizedState||(b.effectTag|=4),\"function\"!==\ntypeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&m===a.memoizedState||(b.effectTag|=256),b.memoizedProps=d,b.memoizedState=A),g.props=d,g.state=A,g.context=k,d=r):(\"function\"!==typeof g.componentDidUpdate||h===a.memoizedProps&&m===a.memoizedState||(b.effectTag|=4),\"function\"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&m===a.memoizedState||(b.effectTag|=256),d=!1);return ig(a,b,c,d,f,e)}\nfunction ig(a,b,c,d,e,f){fg(a,b);var g=0!==(b.effectTag&64);if(!d&&!g)return e&&Ne(b,c,!1),eg(a,b,f);d=b.stateNode;cg.current=b;var h=g?null:d.render();b.effectTag|=1;null!==a&&g&&(M(a,b,null,f),b.child=null);M(a,b,h,f);b.memoizedState=d.state;b.memoizedProps=d.props;e&&Ne(b,c,!0);return b.child}function jg(a){var b=a.stateNode;b.pendingContext?Ke(a,b.pendingContext,b.pendingContext!==b.context):b.context&&Ke(a,b.context,!1);Af(a,b.containerInfo)}\nfunction ng(a,b){if(a&&a.defaultProps){b=n({},b);a=a.defaultProps;for(var c in a)void 0===b[c]&&(b[c]=a[c])}return b}\nfunction og(a,b,c,d){null!==a?t(\"155\"):void 0;var e=b.pendingProps;if(\"object\"===typeof c&&null!==c&&\"function\"===typeof c.then){c=bg(c);var f=c;f=\"function\"===typeof f?Te(f)?3:1:void 0!==f&&null!==f&&f.$$typeof?14:4;f=b.tag=f;var g=ng(c,e);switch(f){case 1:return gg(a,b,c,g,d);case 3:return hg(a,b,c,g,d);case 14:return dg(a,b,c,g,d);default:t(\"283\",c)}}f=He(b,I.current);uf(b,d);f=c(e,f);b.effectTag|=1;if(\"object\"===typeof f&&null!==f&&\"function\"===typeof f.render&&void 0===f.$$typeof){b.tag=2;K(c)?\n(g=!0,Me(b)):g=!1;b.memoizedState=null!==f.state&&void 0!==f.state?f.state:null;var h=c.getDerivedStateFromProps;\"function\"===typeof h&&Ff(b,c,h,e);f.updater=Jf;b.stateNode=f;f._reactInternalFiber=b;Mf(b,c,e,d);return ig(a,b,c,!0,g,d)}b.tag=0;M(a,b,f,d);b.memoizedProps=e;return b.child}\nfunction eg(a,b,c){null!==a&&(b.firstContextDependency=a.firstContextDependency);var d=b.childExpirationTime;if(0===d||d>c)return null;null!==a&&b.child!==a.child?t(\"153\"):void 0;if(null!==b.child){a=b.child;c=Ue(a,a.pendingProps,a.expirationTime);b.child=c;for(c.return=b;null!==a.sibling;)a=a.sibling,c=c.sibling=Ue(a,a.pendingProps,a.expirationTime),c.return=b;c.sibling=null}return b.child}\nfunction pg(a,b,c){var d=b.expirationTime;if(!J.current&&(0===d||d>c)){switch(b.tag){case 5:jg(b);ag();break;case 7:Cf(b);break;case 2:K(b.type)&&Me(b);break;case 3:K(b.type._reactResult)&&Me(b);break;case 6:Af(b,b.stateNode.containerInfo);break;case 12:sf(b,b.memoizedProps.value)}return eg(a,b,c)}b.expirationTime=0;switch(b.tag){case 4:return og(a,b,b.type,c);case 0:return gg(a,b,b.type,b.pendingProps,c);case 1:var e=b.type._reactResult;d=b.pendingProps;a=gg(a,b,e,ng(e,d),c);b.memoizedProps=d;return a;\ncase 2:return hg(a,b,b.type,b.pendingProps,c);case 3:return e=b.type._reactResult,d=b.pendingProps,a=hg(a,b,e,ng(e,d),c),b.memoizedProps=d,a;case 5:jg(b);d=b.updateQueue;null===d?t(\"282\"):void 0;e=b.memoizedState;e=null!==e?e.element:null;kf(b,d,b.pendingProps,null,c);d=b.memoizedState.element;if(d===e)ag(),b=eg(a,b,c);else{e=b.stateNode;if(e=(null===a||null===a.child)&&e.hydrate)Uf=Ce(b.stateNode.containerInfo),Tf=b,e=Vf=!0;e?(b.effectTag|=2,b.child=Sf(b,null,d,c)):(M(a,b,d,c),ag());b=b.child}return b;\ncase 7:Cf(b);null===a&&Yf(b);d=b.type;e=b.pendingProps;var f=null!==a?a.memoizedProps:null,g=e.children;Ae(d,e)?g=null:null!==f&&Ae(d,f)&&(b.effectTag|=16);fg(a,b);1073741823!==c&&b.mode&1&&e.hidden?(b.expirationTime=1073741823,b.memoizedProps=e,b=null):(M(a,b,g,c),b.memoizedProps=e,b=b.child);return b;case 8:return null===a&&Yf(b),b.memoizedProps=b.pendingProps,null;case 16:return null;case 6:return Af(b,b.stateNode.containerInfo),d=b.pendingProps,null===a?b.child=Rf(b,null,d,c):M(a,b,d,c),b.memoizedProps=\nd,b.child;case 13:return dg(a,b,b.type,b.pendingProps,c);case 14:return e=b.type._reactResult,d=b.pendingProps,a=dg(a,b,e,ng(e,d),c),b.memoizedProps=d,a;case 9:return d=b.pendingProps,M(a,b,d,c),b.memoizedProps=d,b.child;case 10:return d=b.pendingProps.children,M(a,b,d,c),b.memoizedProps=d,b.child;case 15:return d=b.pendingProps,M(a,b,d.children,c),b.memoizedProps=d,b.child;case 12:a:{d=b.type._context;e=b.pendingProps;g=b.memoizedProps;f=e.value;b.memoizedProps=e;sf(b,f);if(null!==g){var h=g.value;\nf=h===f&&(0!==h||1/h===1/f)||h!==h&&f!==f?0:(\"function\"===typeof d._calculateChangedBits?d._calculateChangedBits(h,f):1073741823)|0;if(0===f){if(g.children===e.children&&!J.current){b=eg(a,b,c);break a}}else for(g=b.child,null!==g&&(g.return=b);null!==g;){h=g.firstContextDependency;if(null!==h){do{if(h.context===d&&0!==(h.observedBits&f)){if(2===g.tag||3===g.tag){var k=df(c);k.tag=2;ff(g,k)}if(0===g.expirationTime||g.expirationTime>c)g.expirationTime=c;k=g.alternate;null!==k&&(0===k.expirationTime||\nk.expirationTime>c)&&(k.expirationTime=c);for(var l=g.return;null!==l;){k=l.alternate;if(0===l.childExpirationTime||l.childExpirationTime>c)l.childExpirationTime=c,null!==k&&(0===k.childExpirationTime||k.childExpirationTime>c)&&(k.childExpirationTime=c);else if(null!==k&&(0===k.childExpirationTime||k.childExpirationTime>c))k.childExpirationTime=c;else break;l=l.return}}k=g.child;h=h.next}while(null!==h)}else k=12===g.tag?g.type===b.type?null:g.child:g.child;if(null!==k)k.return=g;else for(k=g;null!==\nk;){if(k===b){k=null;break}g=k.sibling;if(null!==g){g.return=k.return;k=g;break}k=k.return}g=k}}M(a,b,e.children,c);b=b.child}return b;case 11:return f=b.type,d=b.pendingProps,e=d.children,uf(b,c),f=vf(f,d.unstable_observedBits),e=e(f),b.effectTag|=1,M(a,b,e,c),b.memoizedProps=d,b.child;default:t(\"156\")}}function qg(a){a.effectTag|=4}var rg=void 0,sg=void 0,tg=void 0;rg=function(){};\nsg=function(a,b,c,d,e){var f=a.memoizedProps;if(f!==d){var g=b.stateNode;zf(L.current);a=null;switch(c){case \"input\":f=zc(g,f);d=zc(g,d);a=[];break;case \"option\":f=de(g,f);d=de(g,d);a=[];break;case \"select\":f=n({},f,{value:void 0});d=n({},d,{value:void 0});a=[];break;case \"textarea\":f=fe(g,f);d=fe(g,d);a=[];break;default:\"function\"!==typeof f.onClick&&\"function\"===typeof d.onClick&&(g.onclick=we)}te(c,d);g=c=void 0;var h=null;for(c in f)if(!d.hasOwnProperty(c)&&f.hasOwnProperty(c)&&null!=f[c])if(\"style\"===\nc){var k=f[c];for(g in k)k.hasOwnProperty(g)&&(h||(h={}),h[g]=\"\")}else\"dangerouslySetInnerHTML\"!==c&&\"children\"!==c&&\"suppressContentEditableWarning\"!==c&&\"suppressHydrationWarning\"!==c&&\"autoFocus\"!==c&&(sa.hasOwnProperty(c)?a||(a=[]):(a=a||[]).push(c,null));for(c in d){var l=d[c];k=null!=f?f[c]:void 0;if(d.hasOwnProperty(c)&&l!==k&&(null!=l||null!=k))if(\"style\"===c)if(k){for(g in k)!k.hasOwnProperty(g)||l&&l.hasOwnProperty(g)||(h||(h={}),h[g]=\"\");for(g in l)l.hasOwnProperty(g)&&k[g]!==l[g]&&(h||\n(h={}),h[g]=l[g])}else h||(a||(a=[]),a.push(c,h)),h=l;else\"dangerouslySetInnerHTML\"===c?(l=l?l.__html:void 0,k=k?k.__html:void 0,null!=l&&k!==l&&(a=a||[]).push(c,\"\"+l)):\"children\"===c?k===l||\"string\"!==typeof l&&\"number\"!==typeof l||(a=a||[]).push(c,\"\"+l):\"suppressContentEditableWarning\"!==c&&\"suppressHydrationWarning\"!==c&&(sa.hasOwnProperty(c)?(null!=l&&ve(e,c),a||k===l||(a=[])):(a=a||[]).push(c,l))}h&&(a=a||[]).push(\"style\",h);e=a;(b.updateQueue=e)&&qg(b)}};tg=function(a,b,c,d){c!==d&&qg(b)};\nfunction ug(a,b){var c=b.source,d=b.stack;null===d&&null!==c&&(d=mc(c));null!==c&&lc(c.type);b=b.value;null!==a&&2===a.tag&&lc(a.type);try{console.error(b)}catch(e){setTimeout(function(){throw e;})}}function vg(a){var b=a.ref;if(null!==b)if(\"function\"===typeof b)try{b(null)}catch(c){wg(a,c)}else b.current=null}\nfunction xg(a){\"function\"===typeof Pe&&Pe(a);switch(a.tag){case 2:case 3:vg(a);var b=a.stateNode;if(\"function\"===typeof b.componentWillUnmount)try{b.props=a.memoizedProps,b.state=a.memoizedState,b.componentWillUnmount()}catch(c){wg(a,c)}break;case 7:vg(a);break;case 6:yg(a)}}function zg(a){return 7===a.tag||5===a.tag||6===a.tag}\nfunction Ag(a){a:{for(var b=a.return;null!==b;){if(zg(b)){var c=b;break a}b=b.return}t(\"160\");c=void 0}var d=b=void 0;switch(c.tag){case 7:b=c.stateNode;d=!1;break;case 5:b=c.stateNode.containerInfo;d=!0;break;case 6:b=c.stateNode.containerInfo;d=!0;break;default:t(\"161\")}c.effectTag&16&&(oe(b,\"\"),c.effectTag&=-17);a:b:for(c=a;;){for(;null===c.sibling;){if(null===c.return||zg(c.return)){c=null;break a}c=c.return}c.sibling.return=c.return;for(c=c.sibling;7!==c.tag&&8!==c.tag;){if(c.effectTag&2)continue b;\nif(null===c.child||6===c.tag)continue b;else c.child.return=c,c=c.child}if(!(c.effectTag&2)){c=c.stateNode;break a}}for(var e=a;;){if(7===e.tag||8===e.tag)if(c)if(d){var f=b,g=e.stateNode,h=c;8===f.nodeType?f.parentNode.insertBefore(g,h):f.insertBefore(g,h)}else b.insertBefore(e.stateNode,c);else d?(f=b,g=e.stateNode,8===f.nodeType?(h=f.parentNode,h.insertBefore(g,f)):(h=f,h.appendChild(g)),null===h.onclick&&(h.onclick=we)):b.appendChild(e.stateNode);else if(6!==e.tag&&null!==e.child){e.child.return=\ne;e=e.child;continue}if(e===a)break;for(;null===e.sibling;){if(null===e.return||e.return===a)return;e=e.return}e.sibling.return=e.return;e=e.sibling}}\nfunction yg(a){for(var b=a,c=!1,d=void 0,e=void 0;;){if(!c){c=b.return;a:for(;;){null===c?t(\"160\"):void 0;switch(c.tag){case 7:d=c.stateNode;e=!1;break a;case 5:d=c.stateNode.containerInfo;e=!0;break a;case 6:d=c.stateNode.containerInfo;e=!0;break a}c=c.return}c=!0}if(7===b.tag||8===b.tag){a:for(var f=b,g=f;;)if(xg(g),null!==g.child&&6!==g.tag)g.child.return=g,g=g.child;else{if(g===f)break;for(;null===g.sibling;){if(null===g.return||g.return===f)break a;g=g.return}g.sibling.return=g.return;g=g.sibling}e?\n(f=d,g=b.stateNode,8===f.nodeType?f.parentNode.removeChild(g):f.removeChild(g)):d.removeChild(b.stateNode)}else if(6===b.tag?(d=b.stateNode.containerInfo,e=!0):xg(b),null!==b.child){b.child.return=b;b=b.child;continue}if(b===a)break;for(;null===b.sibling;){if(null===b.return||b.return===a)return;b=b.return;6===b.tag&&(c=!1)}b.sibling.return=b.return;b=b.sibling}}\nfunction Bg(a,b){switch(b.tag){case 2:case 3:break;case 7:var c=b.stateNode;if(null!=c){var d=b.memoizedProps,e=null!==a?a.memoizedProps:d;a=b.type;var f=b.updateQueue;b.updateQueue=null;if(null!==f){c[Ja]=d;\"input\"===a&&\"radio\"===d.type&&null!=d.name&&Cc(c,d);ue(a,e);b=ue(a,d);for(e=0;e<f.length;e+=2){var g=f[e],h=f[e+1];\"style\"===g?re(c,h):\"dangerouslySetInnerHTML\"===g?ne(c,h):\"children\"===g?oe(c,h):xc(c,g,h,b)}switch(a){case \"input\":Dc(c,d);break;case \"textarea\":he(c,d);break;case \"select\":a=c._wrapperState.wasMultiple,\nc._wrapperState.wasMultiple=!!d.multiple,f=d.value,null!=f?ee(c,!!d.multiple,f,!1):a!==!!d.multiple&&(null!=d.defaultValue?ee(c,!!d.multiple,d.defaultValue,!0):ee(c,!!d.multiple,d.multiple?[]:\"\",!1))}}}break;case 8:null===b.stateNode?t(\"162\"):void 0;b.stateNode.nodeValue=b.memoizedProps;break;case 5:break;case 15:break;case 16:break;default:t(\"163\")}}function Cg(a,b,c){c=df(c);c.tag=3;c.payload={element:null};var d=b.value;c.callback=function(){Dg(d);ug(a,b)};return c}\nfunction Eg(a,b,c){c=df(c);c.tag=3;var d=a.stateNode;null!==d&&\"function\"===typeof d.componentDidCatch&&(c.callback=function(){null===Fg?Fg=new Set([this]):Fg.add(this);var c=b.value,d=b.stack;ug(a,b);this.componentDidCatch(c,{componentStack:null!==d?d:\"\"})});return c}\nfunction Gg(a){switch(a.tag){case 2:K(a.type)&&Ie(a);var b=a.effectTag;return b&1024?(a.effectTag=b&-1025|64,a):null;case 3:return K(a.type._reactResult)&&Ie(a),b=a.effectTag,b&1024?(a.effectTag=b&-1025|64,a):null;case 5:return Bf(a),Je(a),b=a.effectTag,0!==(b&64)?t(\"285\"):void 0,a.effectTag=b&-1025|64,a;case 7:return Df(a),null;case 16:return b=a.effectTag,b&1024?(a.effectTag=b&-1025|64,a):null;case 6:return Bf(a),null;case 12:return tf(a),null;default:return null}}\nvar Hg={readContext:vf},Ig=Yb.ReactCurrentOwner,Jg=0,Kg=0,Lg=!1,N=null,Mg=null,O=0,Ng=!1,Q=null,Og=!1,Fg=null;function Pg(){if(null!==N)for(var a=N.return;null!==a;){var b=a;switch(b.tag){case 2:var c=b.type.childContextTypes;null!==c&&void 0!==c&&Ie(b);break;case 3:c=b.type._reactResult.childContextTypes;null!==c&&void 0!==c&&Ie(b);break;case 5:Bf(b);Je(b);break;case 7:Df(b);break;case 6:Bf(b);break;case 12:tf(b)}a=a.return}Mg=null;O=0;Ng=!1;N=null}\nfunction Qg(a){for(;;){var b=a.alternate,c=a.return,d=a.sibling;if(0===(a.effectTag&512)){var e=b;b=a;var f=b.pendingProps;switch(b.tag){case 0:case 1:break;case 2:K(b.type)&&Ie(b);break;case 3:K(b.type._reactResult)&&Ie(b);break;case 5:Bf(b);Je(b);f=b.stateNode;f.pendingContext&&(f.context=f.pendingContext,f.pendingContext=null);if(null===e||null===e.child)$f(b),b.effectTag&=-3;rg(b);break;case 7:Df(b);var g=zf(yf.current),h=b.type;if(null!==e&&null!=b.stateNode)sg(e,b,h,f,g),e.ref!==b.ref&&(b.effectTag|=\n128);else if(f){var k=zf(L.current);if($f(b)){f=b;e=f.stateNode;var l=f.type,m=f.memoizedProps,r=g;e[Ia]=f;e[Ja]=m;h=void 0;g=l;switch(g){case \"iframe\":case \"object\":F(\"load\",e);break;case \"video\":case \"audio\":for(l=0;l<fb.length;l++)F(fb[l],e);break;case \"source\":F(\"error\",e);break;case \"img\":case \"image\":case \"link\":F(\"error\",e);F(\"load\",e);break;case \"form\":F(\"reset\",e);F(\"submit\",e);break;case \"details\":F(\"toggle\",e);break;case \"input\":Bc(e,m);F(\"invalid\",e);ve(r,\"onChange\");break;case \"select\":e._wrapperState=\n{wasMultiple:!!m.multiple};F(\"invalid\",e);ve(r,\"onChange\");break;case \"textarea\":ge(e,m),F(\"invalid\",e),ve(r,\"onChange\")}te(g,m);l=null;for(h in m)m.hasOwnProperty(h)&&(k=m[h],\"children\"===h?\"string\"===typeof k?e.textContent!==k&&(l=[\"children\",k]):\"number\"===typeof k&&e.textContent!==\"\"+k&&(l=[\"children\",\"\"+k]):sa.hasOwnProperty(h)&&null!=k&&ve(r,h));switch(g){case \"input\":Wb(e);Fc(e,m,!0);break;case \"textarea\":Wb(e);ie(e,m);break;case \"select\":case \"option\":break;default:\"function\"===typeof m.onClick&&\n(e.onclick=we)}h=l;f.updateQueue=h;f=null!==h?!0:!1;f&&qg(b)}else{m=b;e=h;r=f;l=9===g.nodeType?g:g.ownerDocument;k===je.html&&(k=ke(e));k===je.html?\"script\"===e?(e=l.createElement(\"div\"),e.innerHTML=\"<script>\\x3c/script>\",l=e.removeChild(e.firstChild)):\"string\"===typeof r.is?l=l.createElement(e,{is:r.is}):(l=l.createElement(e),\"select\"===e&&r.multiple&&(l.multiple=!0)):l=l.createElementNS(k,e);e=l;e[Ia]=m;e[Ja]=f;a:for(m=e,r=b,l=r.child;null!==l;){if(7===l.tag||8===l.tag)m.appendChild(l.stateNode);\nelse if(6!==l.tag&&null!==l.child){l.child.return=l;l=l.child;continue}if(l===r)break;for(;null===l.sibling;){if(null===l.return||l.return===r)break a;l=l.return}l.sibling.return=l.return;l=l.sibling}r=e;l=h;m=f;var A=g,S=ue(l,m);switch(l){case \"iframe\":case \"object\":F(\"load\",r);g=m;break;case \"video\":case \"audio\":for(g=0;g<fb.length;g++)F(fb[g],r);g=m;break;case \"source\":F(\"error\",r);g=m;break;case \"img\":case \"image\":case \"link\":F(\"error\",r);F(\"load\",r);g=m;break;case \"form\":F(\"reset\",r);F(\"submit\",\nr);g=m;break;case \"details\":F(\"toggle\",r);g=m;break;case \"input\":Bc(r,m);g=zc(r,m);F(\"invalid\",r);ve(A,\"onChange\");break;case \"option\":g=de(r,m);break;case \"select\":r._wrapperState={wasMultiple:!!m.multiple};g=n({},m,{value:void 0});F(\"invalid\",r);ve(A,\"onChange\");break;case \"textarea\":ge(r,m);g=fe(r,m);F(\"invalid\",r);ve(A,\"onChange\");break;default:g=m}te(l,g);k=void 0;var B=l,P=r,v=g;for(k in v)if(v.hasOwnProperty(k)){var p=v[k];\"style\"===k?re(P,p):\"dangerouslySetInnerHTML\"===k?(p=p?p.__html:void 0,\nnull!=p&&ne(P,p)):\"children\"===k?\"string\"===typeof p?(\"textarea\"!==B||\"\"!==p)&&oe(P,p):\"number\"===typeof p&&oe(P,\"\"+p):\"suppressContentEditableWarning\"!==k&&\"suppressHydrationWarning\"!==k&&\"autoFocus\"!==k&&(sa.hasOwnProperty(k)?null!=p&&ve(A,k):null!=p&&xc(P,k,p,S))}switch(l){case \"input\":Wb(r);Fc(r,m,!1);break;case \"textarea\":Wb(r);ie(r,m);break;case \"option\":null!=m.value&&r.setAttribute(\"value\",\"\"+yc(m.value));break;case \"select\":g=r;g.multiple=!!m.multiple;r=m.value;null!=r?ee(g,!!m.multiple,\nr,!1):null!=m.defaultValue&&ee(g,!!m.multiple,m.defaultValue,!0);break;default:\"function\"===typeof g.onClick&&(r.onclick=we)}(f=ze(h,f))&&qg(b);b.stateNode=e}null!==b.ref&&(b.effectTag|=128)}else null===b.stateNode?t(\"166\"):void 0;break;case 8:e&&null!=b.stateNode?tg(e,b,e.memoizedProps,f):(\"string\"!==typeof f&&(null===b.stateNode?t(\"166\"):void 0),e=zf(yf.current),zf(L.current),$f(b)?(f=b,h=f.stateNode,e=f.memoizedProps,h[Ia]=f,(f=h.nodeValue!==e)&&qg(b)):(h=b,f=(9===e.nodeType?e:e.ownerDocument).createTextNode(f),\nf[Ia]=h,b.stateNode=f));break;case 13:case 14:break;case 16:break;case 9:break;case 10:break;case 15:break;case 6:Bf(b);rg(b);break;case 12:tf(b);break;case 11:break;case 4:t(\"167\");default:t(\"156\")}b=N=null;f=a;if(1073741823===O||1073741823!==f.childExpirationTime){h=0;for(e=f.child;null!==e;){g=e.expirationTime;m=e.childExpirationTime;if(0===h||0!==g&&g<h)h=g;if(0===h||0!==m&&m<h)h=m;e=e.sibling}f.childExpirationTime=h}if(null!==b)return b;null!==c&&0===(c.effectTag&512)&&(null===c.firstEffect&&\n(c.firstEffect=a.firstEffect),null!==a.lastEffect&&(null!==c.lastEffect&&(c.lastEffect.nextEffect=a.firstEffect),c.lastEffect=a.lastEffect),1<a.effectTag&&(null!==c.lastEffect?c.lastEffect.nextEffect=a:c.firstEffect=a,c.lastEffect=a))}else{a=Gg(a,O);if(null!==a)return a.effectTag&=511,a;null!==c&&(c.firstEffect=c.lastEffect=null,c.effectTag|=512)}if(null!==d)return d;if(null!==c)a=c;else break}return null}function Rg(a){var b=pg(a.alternate,a,O);null===b&&(b=Qg(a));Ig.current=null;return b}\nfunction Sg(a,b,c){Lg?t(\"243\"):void 0;Lg=!0;Ig.currentDispatcher=Hg;var d=a.nextExpirationTimeToWorkOn;if(d!==O||a!==Mg||null===N)Pg(),Mg=a,O=d,N=Ue(Mg.current,null,O),a.pendingCommitExpirationTime=0;var e=!1;do{try{if(b)for(;null!==N&&!Tg();)N=Rg(N);else for(;null!==N;)N=Rg(N)}catch(r){if(null===N)e=!0,Dg(r);else{null===N?t(\"271\"):void 0;var f=N,g=f.return;if(null===g)e=!0,Dg(r);else{a:{var h=g,k=f,l=r;g=O;k.effectTag|=512;k.firstEffect=k.lastEffect=null;Ng=!0;l=nf(l,k);do{switch(h.tag){case 5:h.effectTag|=\n1024;h.expirationTime=g;g=Cg(h,l,g);gf(h,g);break a;case 2:case 3:k=l;var m=h.stateNode;if(0===(h.effectTag&64)&&null!==m&&\"function\"===typeof m.componentDidCatch&&(null===Fg||!Fg.has(m))){h.effectTag|=1024;h.expirationTime=g;g=Eg(h,k,g);gf(h,g);break a}}h=h.return}while(null!==h)}N=Qg(f);continue}}}break}while(1);Lg=!1;rf=qf=pf=Ig.currentDispatcher=null;if(e)Mg=null,a.finishedWork=null;else if(null!==N)a.finishedWork=null;else{b=a.current.alternate;null===b?t(\"281\"):void 0;Mg=null;if(Ng){e=a.latestPendingTime;\nf=a.latestSuspendedTime;g=a.latestPingedTime;if(0!==e&&e>d||0!==f&&f>d||0!==g&&g>d){a.didError=!1;c=a.latestPingedTime;0!==c&&c<=d&&(a.latestPingedTime=0);c=a.earliestPendingTime;b=a.latestPendingTime;c===d?a.earliestPendingTime=b===d?a.latestPendingTime=0:b:b===d&&(a.latestPendingTime=c);c=a.earliestSuspendedTime;b=a.latestSuspendedTime;0===c?a.earliestSuspendedTime=a.latestSuspendedTime=d:c>d?a.earliestSuspendedTime=d:b<d&&(a.latestSuspendedTime=d);$e(d,a);a.expirationTime=a.expirationTime;return}if(!a.didError&&\n!c){a.didError=!0;a.nextExpirationTimeToWorkOn=d;d=a.expirationTime=1;a.expirationTime=d;return}}a.pendingCommitExpirationTime=d;a.finishedWork=b}}\nfunction wg(a,b){var c;a:{Lg&&!Og?t(\"263\"):void 0;for(c=a.return;null!==c;){switch(c.tag){case 2:case 3:var d=c.stateNode;if(\"function\"===typeof c.type.getDerivedStateFromCatch||\"function\"===typeof d.componentDidCatch&&(null===Fg||!Fg.has(d))){a=nf(b,a);a=Eg(c,a,1);ff(c,a);If(c,1);c=void 0;break a}break;case 5:a=nf(b,a);a=Cg(c,a,1);ff(c,a);If(c,1);c=void 0;break a}c=c.return}5===a.tag&&(c=nf(b,a),c=Cg(a,c,1),ff(a,c),If(a,1));c=void 0}return c}\nfunction Hf(a,b){0!==Kg?a=Kg:Lg?a=Og?1:O:b.mode&1?(a=Ug?2+10*(((a-2+15)/10|0)+1):2+25*(((a-2+500)/25|0)+1),null!==Mg&&a===O&&(a+=1)):a=1;Ug&&(0===Vg||a>Vg)&&(Vg=a);return a}\nfunction If(a,b){a:{if(0===a.expirationTime||a.expirationTime>b)a.expirationTime=b;var c=a.alternate;null!==c&&(0===c.expirationTime||c.expirationTime>b)&&(c.expirationTime=b);var d=a.return;if(null===d&&5===a.tag)a=a.stateNode;else{for(;null!==d;){c=d.alternate;if(0===d.childExpirationTime||d.childExpirationTime>b)d.childExpirationTime=b;null!==c&&(0===c.childExpirationTime||c.childExpirationTime>b)&&(c.childExpirationTime=b);if(null===d.return&&5===d.tag){a=d.stateNode;break a}d=d.return}a=null}}if(null!==\na){!Lg&&0!==O&&b<O&&Pg();Ze(a,b);if(!Lg||Og||Mg!==a){b=a;a=a.expirationTime;if(null===b.nextScheduledRoot)b.expirationTime=a,null===T?(U=T=b,b.nextScheduledRoot=b):(T=T.nextScheduledRoot=b,T.nextScheduledRoot=U);else if(c=b.expirationTime,0===c||a<c)b.expirationTime=a;V||(W?Wg&&(Y=b,Z=1,Xg(b,1,!0)):1===a?Yg(1,null):Zg(b,a))}$g>ah&&($g=0,t(\"185\"))}}function bh(a,b,c,d,e){var f=Kg;Kg=1;try{return a(b,c,d,e)}finally{Kg=f}}\nvar U=null,T=null,ch=0,dh=void 0,V=!1,Y=null,Z=0,Vg=0,eh=!1,fh=!1,gh=null,hh=null,W=!1,Wg=!1,Ug=!1,ih=null,jh=ba.unstable_now(),kh=(jh/10|0)+2,lh=kh,ah=50,$g=0,mh=null,nh=1;function oh(){kh=((ba.unstable_now()-jh)/10|0)+2}function Zg(a,b){if(0!==ch){if(b>ch)return;null!==dh&&ba.unstable_cancelScheduledWork(dh)}ch=b;a=ba.unstable_now()-jh;dh=ba.unstable_scheduleWork(ph,{timeout:10*(b-2)-a})}function Gf(){if(V)return lh;qh();if(0===Z||1073741823===Z)oh(),lh=kh;return lh}\nfunction qh(){var a=0,b=null;if(null!==T)for(var c=T,d=U;null!==d;){var e=d.expirationTime;if(0===e){null===c||null===T?t(\"244\"):void 0;if(d===d.nextScheduledRoot){U=T=d.nextScheduledRoot=null;break}else if(d===U)U=e=d.nextScheduledRoot,T.nextScheduledRoot=e,d.nextScheduledRoot=null;else if(d===T){T=c;T.nextScheduledRoot=U;d.nextScheduledRoot=null;break}else c.nextScheduledRoot=d.nextScheduledRoot,d.nextScheduledRoot=null;d=c.nextScheduledRoot}else{if(0===a||e<a)a=e,b=d;if(d===T)break;if(1===a)break;\nc=d;d=d.nextScheduledRoot}}Y=b;Z=a}function ph(a){if(a.didTimeout&&null!==U){oh();var b=U;do{var c=b.expirationTime;0!==c&&kh>=c&&(b.nextExpirationTimeToWorkOn=kh);b=b.nextScheduledRoot}while(b!==U)}Yg(0,a)}\nfunction Yg(a,b){hh=b;qh();if(null!==hh)for(oh(),lh=kh;null!==Y&&0!==Z&&(0===a||a>=Z)&&(!eh||kh>=Z);)Xg(Y,Z,kh>=Z),qh(),oh(),lh=kh;else for(;null!==Y&&0!==Z&&(0===a||a>=Z);)Xg(Y,Z,!0),qh();null!==hh&&(ch=0,dh=null);0!==Z&&Zg(Y,Z);hh=null;eh=!1;$g=0;mh=null;if(null!==ih)for(a=ih,ih=null,b=0;b<a.length;b++){var c=a[b];try{c._onComplete()}catch(d){fh||(fh=!0,gh=d)}}if(fh)throw a=gh,gh=null,fh=!1,a;}\nfunction Xg(a,b,c){V?t(\"245\"):void 0;V=!0;if(null===hh||c){var d=a.finishedWork;null!==d?rh(a,d,b):(a.finishedWork=null,Sg(a,!1,c),d=a.finishedWork,null!==d&&rh(a,d,b))}else d=a.finishedWork,null!==d?rh(a,d,b):(a.finishedWork=null,Sg(a,!0,c),d=a.finishedWork,null!==d&&(Tg()?a.finishedWork=d:rh(a,d,b)));V=!1}\nfunction rh(a,b,c){var d=a.firstBatch;if(null!==d&&d._expirationTime<=c&&(null===ih?ih=[d]:ih.push(d),d._defer)){a.finishedWork=b;a.expirationTime=0;return}a.finishedWork=null;a===mh?$g++:(mh=a,$g=0);Og=Lg=!0;a.current===b?t(\"177\"):void 0;c=a.pendingCommitExpirationTime;0===c?t(\"261\"):void 0;a.pendingCommitExpirationTime=0;d=b.expirationTime;var e=b.childExpirationTime;d=0===d||0!==e&&e<d?e:d;a.didError=!1;0===d?(a.earliestPendingTime=0,a.latestPendingTime=0,a.earliestSuspendedTime=0,a.latestSuspendedTime=\n0,a.latestPingedTime=0):(e=a.latestPendingTime,0!==e&&(e<d?a.earliestPendingTime=a.latestPendingTime=0:a.earliestPendingTime<d&&(a.earliestPendingTime=a.latestPendingTime)),e=a.earliestSuspendedTime,0===e?Ze(a,d):d>a.latestSuspendedTime?(a.earliestSuspendedTime=0,a.latestSuspendedTime=0,a.latestPingedTime=0,Ze(a,d)):d<e&&Ze(a,d));$e(0,a);Ig.current=null;1<b.effectTag?null!==b.lastEffect?(b.lastEffect.nextEffect=b,d=b.firstEffect):d=b:d=b.firstEffect;xe=Gd;e=Td();if(Ud(e)){if(\"selectionStart\"in e)var f=\n{start:e.selectionStart,end:e.selectionEnd};else a:{f=(f=e.ownerDocument)&&f.defaultView||window;var g=f.getSelection&&f.getSelection();if(g&&0!==g.rangeCount){f=g.anchorNode;var h=g.anchorOffset,k=g.focusNode;g=g.focusOffset;try{f.nodeType,k.nodeType}catch(Xa){f=null;break a}var l=0,m=-1,r=-1,A=0,S=0,B=e,P=null;b:for(;;){for(var v;;){B!==f||0!==h&&3!==B.nodeType||(m=l+h);B!==k||0!==g&&3!==B.nodeType||(r=l+g);3===B.nodeType&&(l+=B.nodeValue.length);if(null===(v=B.firstChild))break;P=B;B=v}for(;;){if(B===\ne)break b;P===f&&++A===h&&(m=l);P===k&&++S===g&&(r=l);if(null!==(v=B.nextSibling))break;B=P;P=B.parentNode}B=v}f=-1===m||-1===r?null:{start:m,end:r}}else f=null}f=f||{start:0,end:0}}else f=null;ye={focusedElem:e,selectionRange:f};Gd=!1;for(Q=d;null!==Q;){e=!1;f=void 0;try{for(;null!==Q;){if(Q.effectTag&256){var p=Q.alternate;a:switch(h=Q,h.tag){case 2:case 3:if(h.effectTag&256&&null!==p){var u=p.memoizedProps,x=p.memoizedState,R=h.stateNode;R.props=h.memoizedProps;R.state=h.memoizedState;var yh=R.getSnapshotBeforeUpdate(u,\nx);R.__reactInternalSnapshotBeforeUpdate=yh}break a;case 5:case 7:case 8:case 6:break a;default:t(\"163\")}}Q=Q.nextEffect}}catch(Xa){e=!0,f=Xa}e&&(null===Q?t(\"178\"):void 0,wg(Q,f),null!==Q&&(Q=Q.nextEffect))}for(Q=d;null!==Q;){p=!1;u=void 0;try{for(;null!==Q;){var w=Q.effectTag;w&16&&oe(Q.stateNode,\"\");if(w&128){var y=Q.alternate;if(null!==y){var q=y.ref;null!==q&&(\"function\"===typeof q?q(null):q.current=null)}}switch(w&14){case 2:Ag(Q);Q.effectTag&=-3;break;case 6:Ag(Q);Q.effectTag&=-3;Bg(Q.alternate,\nQ);break;case 4:Bg(Q.alternate,Q);break;case 8:x=Q,yg(x),x.return=null,x.child=null,x.alternate&&(x.alternate.child=null,x.alternate.return=null)}Q=Q.nextEffect}}catch(Xa){p=!0,u=Xa}p&&(null===Q?t(\"178\"):void 0,wg(Q,u),null!==Q&&(Q=Q.nextEffect))}q=ye;y=Td();w=q.focusedElem;u=q.selectionRange;if(y!==w&&w&&w.ownerDocument&&Sd(w.ownerDocument.documentElement,w)){null!==u&&Ud(w)&&(y=u.start,q=u.end,void 0===q&&(q=y),\"selectionStart\"in w?(w.selectionStart=y,w.selectionEnd=Math.min(q,w.value.length)):\n(p=w.ownerDocument||document,y=(p?p.defaultView:window).getSelection(),x=w.textContent.length,q=Math.min(u.start,x),u=void 0===u.end?q:Math.min(u.end,x),!y.extend&&q>u&&(x=u,u=q,q=x),x=Rd(w,q),R=Rd(w,u),x&&R&&(1!==y.rangeCount||y.anchorNode!==x.node||y.anchorOffset!==x.offset||y.focusNode!==R.node||y.focusOffset!==R.offset)&&(p=p.createRange(),p.setStart(x.node,x.offset),y.removeAllRanges(),q>u?(y.addRange(p),y.extend(R.node,R.offset)):(p.setEnd(R.node,R.offset),y.addRange(p)))));y=[];for(q=w;q=q.parentNode;)1===\nq.nodeType&&y.push({element:q,left:q.scrollLeft,top:q.scrollTop});\"function\"===typeof w.focus&&w.focus();for(w=0;w<y.length;w++)q=y[w],q.element.scrollLeft=q.left,q.element.scrollTop=q.top}ye=null;Gd=!!xe;xe=null;a.current=b;for(Q=d;null!==Q;){d=!1;w=void 0;try{for(y=c;null!==Q;){var Sa=Q.effectTag;if(Sa&36){var oc=Q.alternate;q=Q;p=y;switch(q.tag){case 2:case 3:var X=q.stateNode;if(q.effectTag&4)if(null===oc)X.props=q.memoizedProps,X.state=q.memoizedState,X.componentDidMount();else{var Ih=oc.memoizedProps,\nJh=oc.memoizedState;X.props=q.memoizedProps;X.state=q.memoizedState;X.componentDidUpdate(Ih,Jh,X.__reactInternalSnapshotBeforeUpdate)}var kg=q.updateQueue;null!==kg&&(X.props=q.memoizedProps,X.state=q.memoizedState,lf(q,kg,X,p));break;case 5:var lg=q.updateQueue;if(null!==lg){u=null;if(null!==q.child)switch(q.child.tag){case 7:u=q.child.stateNode;break;case 2:case 3:u=q.child.stateNode}lf(q,lg,u,p)}break;case 7:var Kh=q.stateNode;null===oc&&q.effectTag&4&&ze(q.type,q.memoizedProps)&&Kh.focus();break;\ncase 8:break;case 6:break;case 15:break;case 16:break;default:t(\"163\")}}if(Sa&128){var Ac=Q.ref;if(null!==Ac){var mg=Q.stateNode;switch(Q.tag){case 7:var Pd=mg;break;default:Pd=mg}\"function\"===typeof Ac?Ac(Pd):Ac.current=Pd}}var Lh=Q.nextEffect;Q.nextEffect=null;Q=Lh}}catch(Xa){d=!0,w=Xa}d&&(null===Q?t(\"178\"):void 0,wg(Q,w),null!==Q&&(Q=Q.nextEffect))}Lg=Og=!1;\"function\"===typeof Oe&&Oe(b.stateNode);Sa=b.expirationTime;b=b.childExpirationTime;b=0===Sa||0!==b&&b<Sa?b:Sa;0===b&&(Fg=null);a.expirationTime=\nb;a.finishedWork=null}function Tg(){return eh?!0:null===hh||hh.timeRemaining()>nh?!1:eh=!0}function Dg(a){null===Y?t(\"246\"):void 0;Y.expirationTime=0;fh||(fh=!0,gh=a)}function sh(a,b){var c=W;W=!0;try{return a(b)}finally{(W=c)||V||Yg(1,null)}}function th(a,b){if(W&&!Wg){Wg=!0;try{return a(b)}finally{Wg=!1}}return a(b)}function uh(a,b,c){if(Ug)return a(b,c);W||V||0===Vg||(Yg(Vg,null),Vg=0);var d=Ug,e=W;W=Ug=!0;try{return a(b,c)}finally{Ug=d,(W=e)||V||Yg(1,null)}}\nfunction vh(a){if(!a)return Fe;a=a._reactInternalFiber;a:{2!==jd(a)||2!==a.tag&&3!==a.tag?t(\"170\"):void 0;var b=a;do{switch(b.tag){case 5:b=b.stateNode.context;break a;case 2:if(K(b.type)){b=b.stateNode.__reactInternalMemoizedMergedChildContext;break a}break;case 3:if(K(b.type._reactResult)){b=b.stateNode.__reactInternalMemoizedMergedChildContext;break a}}b=b.return}while(null!==b);t(\"171\");b=void 0}if(2===a.tag){var c=a.type;if(K(c))return Le(a,c,b)}else if(3===a.tag&&(c=a.type._reactResult,K(c)))return Le(a,\nc,b);return b}function wh(a,b,c,d,e){var f=b.current;c=vh(c);null===b.context?b.context=c:b.pendingContext=c;b=e;e=df(d);e.payload={element:a};b=void 0===b?null:b;null!==b&&(e.callback=b);ff(f,e);If(f,d);return d}function xh(a,b,c,d){var e=b.current,f=Gf();e=Hf(f,e);return wh(a,b,c,e,d)}function zh(a){a=a.current;if(!a.child)return null;switch(a.child.tag){case 7:return a.child.stateNode;default:return a.child.stateNode}}\nfunction Ah(a,b,c){var d=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:ac,key:null==d?null:\"\"+d,children:a,containerInfo:b,implementation:c}}\nFb=function(a,b,c){switch(b){case \"input\":Dc(a,c);b=c.name;if(\"radio\"===c.type&&null!=b){for(c=a;c.parentNode;)c=c.parentNode;c=c.querySelectorAll(\"input[name=\"+JSON.stringify(\"\"+b)+'][type=\"radio\"]');for(b=0;b<c.length;b++){var d=c[b];if(d!==a&&d.form===a.form){var e=Na(d);e?void 0:t(\"90\");Xb(d);Dc(d,e)}}}break;case \"textarea\":he(a,c);break;case \"select\":b=c.value,null!=b&&ee(a,!!c.multiple,b,!1)}};\nfunction Bh(a){var b=2+25*(((Gf()-2+500)/25|0)+1);b<=Jg&&(b=Jg+1);this._expirationTime=Jg=b;this._root=a;this._callbacks=this._next=null;this._hasChildren=this._didComplete=!1;this._children=null;this._defer=!0}Bh.prototype.render=function(a){this._defer?void 0:t(\"250\");this._hasChildren=!0;this._children=a;var b=this._root._internalRoot,c=this._expirationTime,d=new Ch;wh(a,b,null,c,d._onCommit);return d};\nBh.prototype.then=function(a){if(this._didComplete)a();else{var b=this._callbacks;null===b&&(b=this._callbacks=[]);b.push(a)}};\nBh.prototype.commit=function(){var a=this._root._internalRoot,b=a.firstBatch;this._defer&&null!==b?void 0:t(\"251\");if(this._hasChildren){var c=this._expirationTime;if(b!==this){this._hasChildren&&(c=this._expirationTime=b._expirationTime,this.render(this._children));for(var d=null,e=b;e!==this;)d=e,e=e._next;null===d?t(\"251\"):void 0;d._next=e._next;this._next=b;a.firstBatch=this}this._defer=!1;b=c;V?t(\"253\"):void 0;Y=a;Z=b;Xg(a,b,!0);Yg(1,null);b=this._next;this._next=null;b=a.firstBatch=b;null!==\nb&&b._hasChildren&&b.render(b._children)}else this._next=null,this._defer=!1};Bh.prototype._onComplete=function(){if(!this._didComplete){this._didComplete=!0;var a=this._callbacks;if(null!==a)for(var b=0;b<a.length;b++)(0,a[b])()}};function Ch(){this._callbacks=null;this._didCommit=!1;this._onCommit=this._onCommit.bind(this)}Ch.prototype.then=function(a){if(this._didCommit)a();else{var b=this._callbacks;null===b&&(b=this._callbacks=[]);b.push(a)}};\nCh.prototype._onCommit=function(){if(!this._didCommit){this._didCommit=!0;var a=this._callbacks;if(null!==a)for(var b=0;b<a.length;b++){var c=a[b];\"function\"!==typeof c?t(\"191\",c):void 0;c()}}};\nfunction Dh(a,b,c){b=new Se(5,null,null,b?3:0);a={current:b,containerInfo:a,pendingChildren:null,earliestPendingTime:0,latestPendingTime:0,earliestSuspendedTime:0,latestSuspendedTime:0,latestPingedTime:0,didError:!1,pendingCommitExpirationTime:0,finishedWork:null,timeoutHandle:-1,context:null,pendingContext:null,hydrate:c,nextExpirationTimeToWorkOn:0,expirationTime:0,firstBatch:null,nextScheduledRoot:null};this._internalRoot=b.stateNode=a}\nDh.prototype.render=function(a,b){var c=this._internalRoot,d=new Ch;b=void 0===b?null:b;null!==b&&d.then(b);xh(a,c,null,d._onCommit);return d};Dh.prototype.unmount=function(a){var b=this._internalRoot,c=new Ch;a=void 0===a?null:a;null!==a&&c.then(a);xh(null,b,null,c._onCommit);return c};Dh.prototype.legacy_renderSubtreeIntoContainer=function(a,b,c){var d=this._internalRoot,e=new Ch;c=void 0===c?null:c;null!==c&&e.then(c);xh(b,d,a,e._onCommit);return e};\nDh.prototype.createBatch=function(){var a=new Bh(this),b=a._expirationTime,c=this._internalRoot,d=c.firstBatch;if(null===d)c.firstBatch=a,a._next=null;else{for(c=null;null!==d&&d._expirationTime<=b;)c=d,d=d._next;a._next=d;null!==c&&(c._next=a)}return a};function Eh(a){return!(!a||1!==a.nodeType&&9!==a.nodeType&&11!==a.nodeType&&(8!==a.nodeType||\" react-mount-point-unstable \"!==a.nodeValue))}Lb=sh;Mb=uh;Nb=function(){V||0===Vg||(Yg(Vg,null),Vg=0)};\nfunction Fh(a,b){b||(b=a?9===a.nodeType?a.documentElement:a.firstChild:null,b=!(!b||1!==b.nodeType||!b.hasAttribute(\"data-reactroot\")));if(!b)for(var c;c=a.lastChild;)a.removeChild(c);return new Dh(a,!1,b)}\nfunction Gh(a,b,c,d,e){Eh(c)?void 0:t(\"200\");var f=c._reactRootContainer;if(f){if(\"function\"===typeof e){var g=e;e=function(){var a=zh(f._internalRoot);g.call(a)}}null!=a?f.legacy_renderSubtreeIntoContainer(a,b,e):f.render(b,e)}else{f=c._reactRootContainer=Fh(c,d);if(\"function\"===typeof e){var h=e;e=function(){var a=zh(f._internalRoot);h.call(a)}}th(function(){null!=a?f.legacy_renderSubtreeIntoContainer(a,b,e):f.render(b,e)})}return zh(f._internalRoot)}\nfunction Hh(a,b){var c=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;Eh(b)?void 0:t(\"200\");return Ah(a,b,null,c)}\nvar Mh={createPortal:Hh,findDOMNode:function(a){if(null==a)return null;if(1===a.nodeType)return a;var b=a._reactInternalFiber;void 0===b&&(\"function\"===typeof a.render?t(\"188\"):t(\"268\",Object.keys(a)));a=md(b);a=null===a?null:a.stateNode;return a},hydrate:function(a,b,c){return Gh(null,a,b,!0,c)},render:function(a,b,c){return Gh(null,a,b,!1,c)},unstable_renderSubtreeIntoContainer:function(a,b,c,d){null==a||void 0===a._reactInternalFiber?t(\"38\"):void 0;return Gh(a,b,c,!1,d)},unmountComponentAtNode:function(a){Eh(a)?\nvoid 0:t(\"40\");return a._reactRootContainer?(th(function(){Gh(null,null,a,!1,function(){a._reactRootContainer=null})}),!0):!1},unstable_createPortal:function(){return Hh.apply(void 0,arguments)},unstable_batchedUpdates:sh,unstable_interactiveUpdates:uh,flushSync:function(a,b){V?t(\"187\"):void 0;var c=W;W=!0;try{return bh(a,b)}finally{W=c,Yg(1,null)}},unstable_flushControlled:function(a){var b=W;W=!0;try{bh(a)}finally{(W=b)||V||Yg(1,null)}},__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:{Events:[La,\nMa,Na,Ea.injectEventPluginsByName,qa,Ua,function(a){za(a,Ta)},Jb,Kb,Id,Ga]},unstable_createRoot:function(a,b){Eh(a)?void 0:t(\"278\");return new Dh(a,!0,null!=b&&!0===b.hydrate)}};(function(a){var b=a.findFiberByHostInstance;return Re(n({},a,{findHostInstanceByFiber:function(a){a=md(a);return null===a?null:a.stateNode},findFiberByHostInstance:function(a){return b?b(a):null}}))})({findFiberByHostInstance:Ka,bundleType:0,version:\"16.5.1\",rendererPackageName:\"react-dom\"});\nvar Nh={default:Mh},Oh=Nh&&Mh||Nh;module.exports=Oh.default||Oh;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/react-dom/cjs/react-dom.production.min.js\n// module id = 13\n// module chunks = 0","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/schedule.production.min.js');\n} else {\n module.exports = require('./cjs/schedule.development.js');\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/schedule/index.js\n// module id = 14\n// module chunks = 0","/** @license React v16.5.1\n * schedule.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';Object.defineProperty(exports,\"__esModule\",{value:!0});var d=!(\"undefined\"===typeof window||!window.document||!window.document.createElement),f=Date,g=\"function\"===typeof setTimeout?setTimeout:void 0,h=\"function\"===typeof clearTimeout?clearTimeout:void 0,l=\"function\"===typeof requestAnimationFrame?requestAnimationFrame:void 0,m=\"function\"===typeof cancelAnimationFrame?cancelAnimationFrame:void 0,n=\"object\"===typeof performance&&\"function\"===typeof performance.now;\nexports.unstable_now=void 0;if(n){var p=performance;exports.unstable_now=function(){return p.now()}}else exports.unstable_now=function(){return f.now()};exports.unstable_scheduleWork=void 0;exports.unstable_cancelScheduledWork=void 0;\nif(d){var q=null,r=null,t=-1,u=!1,v=!1,w=void 0,x=void 0,y=function(a){w=l(function(b){h(x);a(b)});x=g(function(){m(w);a(exports.unstable_now())},100)},z=0,A=33,B=33,C={didTimeout:!1,timeRemaining:function(){var a=z-exports.unstable_now();return 0<a?a:0}},E=function(a,b){var c=a.scheduledCallback,e=!1;try{c(b),e=!0}finally{exports.unstable_cancelScheduledWork(a),e||(u=!0,window.postMessage(D,\"*\"))}},D=\"__reactIdleCallback$\"+Math.random().toString(36).slice(2);window.addEventListener(\"message\",function(a){if(a.source===\nwindow&&a.data===D&&(u=!1,null!==q)){if(null!==q){var b=exports.unstable_now();if(!(-1===t||t>b)){a=-1;for(var c=[],e=q;null!==e;){var k=e.timeoutTime;-1!==k&&k<=b?c.push(e):-1!==k&&(-1===a||k<a)&&(a=k);e=e.next}if(0<c.length)for(C.didTimeout=!0,b=0,e=c.length;b<e;b++)E(c[b],C);t=a}}for(a=exports.unstable_now();0<z-a&&null!==q;)a=q,C.didTimeout=!1,E(a,C),a=exports.unstable_now();null===q||v||(v=!0,y(F))}},!1);var F=function(a){v=!1;var b=a-z+B;b<B&&A<B?(8>b&&(b=8),B=b<A?A:b):A=b;z=a+B;u||(u=!0,window.postMessage(D,\n\"*\"))};exports.unstable_scheduleWork=function(a,b){var c=-1;null!=b&&\"number\"===typeof b.timeout&&(c=exports.unstable_now()+b.timeout);if(-1===t||-1!==c&&c<t)t=c;a={scheduledCallback:a,timeoutTime:c,prev:null,next:null};null===q?q=a:(b=a.prev=r,null!==b&&(b.next=a));r=a;v||(v=!0,y(F));return a};exports.unstable_cancelScheduledWork=function(a){if(null!==a.prev||q===a){var b=a.next,c=a.prev;a.next=null;a.prev=null;null!==b?null!==c?(c.next=b,b.prev=c):(b.prev=null,q=b):null!==c?(c.next=null,r=c):r=\nq=null}}}else{var G=new Map;exports.unstable_scheduleWork=function(a){var b={scheduledCallback:a,timeoutTime:0,next:null,prev:null},c=g(function(){a({timeRemaining:function(){return Infinity},didTimeout:!1})});G.set(a,c);return b};exports.unstable_cancelScheduledWork=function(a){var b=G.get(a.scheduledCallback);G.delete(a);h(b)}};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/schedule/cjs/schedule.production.min.js\n// module id = 15\n// module chunks = 0","import React, { Component } from 'react';\nimport I from \"immutable\"\n\nclass App extends Component {\n componentDidMount() {\n this.fields = new I.Map({a:2})\n }\n\n onClick = () => {\n const f = this.fields\n console.log(f)\n }\n\n render() {\n return (\n <div className=\"App\">\n <button onClick={this.onClick}>Click Me</button>\n </div>\n );\n }\n}\n\nwindow.clickButton = () => document.querySelector(\"button\").click()\n\nexport default App;\n\n\n\n// WEBPACK FOOTER //\n// ./src/App.js","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (global.Immutable = factory());\n}(this, function () { 'use strict';var SLICE$0 = Array.prototype.slice;\n\n function createClass(ctor, superClass) {\n if (superClass) {\n ctor.prototype = Object.create(superClass.prototype);\n }\n ctor.prototype.constructor = ctor;\n }\n\n function Iterable(value) {\n return isIterable(value) ? value : Seq(value);\n }\n\n\n createClass(KeyedIterable, Iterable);\n function KeyedIterable(value) {\n return isKeyed(value) ? value : KeyedSeq(value);\n }\n\n\n createClass(IndexedIterable, Iterable);\n function IndexedIterable(value) {\n return isIndexed(value) ? value : IndexedSeq(value);\n }\n\n\n createClass(SetIterable, Iterable);\n function SetIterable(value) {\n return isIterable(value) && !isAssociative(value) ? value : SetSeq(value);\n }\n\n\n\n function isIterable(maybeIterable) {\n return !!(maybeIterable && maybeIterable[IS_ITERABLE_SENTINEL]);\n }\n\n function isKeyed(maybeKeyed) {\n return !!(maybeKeyed && maybeKeyed[IS_KEYED_SENTINEL]);\n }\n\n function isIndexed(maybeIndexed) {\n return !!(maybeIndexed && maybeIndexed[IS_INDEXED_SENTINEL]);\n }\n\n function isAssociative(maybeAssociative) {\n return isKeyed(maybeAssociative) || isIndexed(maybeAssociative);\n }\n\n function isOrdered(maybeOrdered) {\n return !!(maybeOrdered && maybeOrdered[IS_ORDERED_SENTINEL]);\n }\n\n Iterable.isIterable = isIterable;\n Iterable.isKeyed = isKeyed;\n Iterable.isIndexed = isIndexed;\n Iterable.isAssociative = isAssociative;\n Iterable.isOrdered = isOrdered;\n\n Iterable.Keyed = KeyedIterable;\n Iterable.Indexed = IndexedIterable;\n Iterable.Set = SetIterable;\n\n\n var IS_ITERABLE_SENTINEL = '@@__IMMUTABLE_ITERABLE__@@';\n var IS_KEYED_SENTINEL = '@@__IMMUTABLE_KEYED__@@';\n var IS_INDEXED_SENTINEL = '@@__IMMUTABLE_INDEXED__@@';\n var IS_ORDERED_SENTINEL = '@@__IMMUTABLE_ORDERED__@@';\n\n // Used for setting prototype methods that IE8 chokes on.\n var DELETE = 'delete';\n\n // Constants describing the size of trie nodes.\n var SHIFT = 5; // Resulted in best performance after ______?\n var SIZE = 1 << SHIFT;\n var MASK = SIZE - 1;\n\n // A consistent shared value representing \"not set\" which equals nothing other\n // than itself, and nothing that could be provided externally.\n var NOT_SET = {};\n\n // Boolean references, Rough equivalent of `bool &`.\n var CHANGE_LENGTH = { value: false };\n var DID_ALTER = { value: false };\n\n function MakeRef(ref) {\n ref.value = false;\n return ref;\n }\n\n function SetRef(ref) {\n ref && (ref.value = true);\n }\n\n // A function which returns a value representing an \"owner\" for transient writes\n // to tries. The return value will only ever equal itself, and will not equal\n // the return of any subsequent call of this function.\n function OwnerID() {}\n\n // http://jsperf.com/copy-array-inline\n function arrCopy(arr, offset) {\n offset = offset || 0;\n var len = Math.max(0, arr.length - offset);\n var newArr = new Array(len);\n for (var ii = 0; ii < len; ii++) {\n newArr[ii] = arr[ii + offset];\n }\n return newArr;\n }\n\n function ensureSize(iter) {\n if (iter.size === undefined) {\n iter.size = iter.__iterate(returnTrue);\n }\n return iter.size;\n }\n\n function wrapIndex(iter, index) {\n // This implements \"is array index\" which the ECMAString spec defines as:\n //\n // A String property name P is an array index if and only if\n // ToString(ToUint32(P)) is equal to P and ToUint32(P) is not equal\n // to 2^32−1.\n //\n // http://www.ecma-international.org/ecma-262/6.0/#sec-array-exotic-objects\n if (typeof index !== 'number') {\n var uint32Index = index >>> 0; // N >>> 0 is shorthand for ToUint32\n if ('' + uint32Index !== index || uint32Index === 4294967295) {\n return NaN;\n }\n index = uint32Index;\n }\n return index < 0 ? ensureSize(iter) + index : index;\n }\n\n function returnTrue() {\n return true;\n }\n\n function wholeSlice(begin, end, size) {\n return (begin === 0 || (size !== undefined && begin <= -size)) &&\n (end === undefined || (size !== undefined && end >= size));\n }\n\n function resolveBegin(begin, size) {\n return resolveIndex(begin, size, 0);\n }\n\n function resolveEnd(end, size) {\n return resolveIndex(end, size, size);\n }\n\n function resolveIndex(index, size, defaultIndex) {\n return index === undefined ?\n defaultIndex :\n index < 0 ?\n Math.max(0, size + index) :\n size === undefined ?\n index :\n Math.min(size, index);\n }\n\n /* global Symbol */\n\n var ITERATE_KEYS = 0;\n var ITERATE_VALUES = 1;\n var ITERATE_ENTRIES = 2;\n\n var REAL_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\n var FAUX_ITERATOR_SYMBOL = '@@iterator';\n\n var ITERATOR_SYMBOL = REAL_ITERATOR_SYMBOL || FAUX_ITERATOR_SYMBOL;\n\n\n function Iterator(next) {\n this.next = next;\n }\n\n Iterator.prototype.toString = function() {\n return '[Iterator]';\n };\n\n\n Iterator.KEYS = ITERATE_KEYS;\n Iterator.VALUES = ITERATE_VALUES;\n Iterator.ENTRIES = ITERATE_ENTRIES;\n\n Iterator.prototype.inspect =\n Iterator.prototype.toSource = function () { return this.toString(); }\n Iterator.prototype[ITERATOR_SYMBOL] = function () {\n return this;\n };\n\n\n function iteratorValue(type, k, v, iteratorResult) {\n var value = type === 0 ? k : type === 1 ? v : [k, v];\n iteratorResult ? (iteratorResult.value = value) : (iteratorResult = {\n value: value, done: false\n });\n return iteratorResult;\n }\n\n function iteratorDone() {\n return { value: undefined, done: true };\n }\n\n function hasIterator(maybeIterable) {\n return !!getIteratorFn(maybeIterable);\n }\n\n function isIterator(maybeIterator) {\n return maybeIterator && typeof maybeIterator.next === 'function';\n }\n\n function getIterator(iterable) {\n var iteratorFn = getIteratorFn(iterable);\n return iteratorFn && iteratorFn.call(iterable);\n }\n\n function getIteratorFn(iterable) {\n var iteratorFn = iterable && (\n (REAL_ITERATOR_SYMBOL && iterable[REAL_ITERATOR_SYMBOL]) ||\n iterable[FAUX_ITERATOR_SYMBOL]\n );\n if (typeof iteratorFn === 'function') {\n return iteratorFn;\n }\n }\n\n function isArrayLike(value) {\n return value && typeof value.length === 'number';\n }\n\n createClass(Seq, Iterable);\n function Seq(value) {\n return value === null || value === undefined ? emptySequence() :\n isIterable(value) ? value.toSeq() : seqFromValue(value);\n }\n\n Seq.of = function(/*...values*/) {\n return Seq(arguments);\n };\n\n Seq.prototype.toSeq = function() {\n return this;\n };\n\n Seq.prototype.toString = function() {\n return this.__toString('Seq {', '}');\n };\n\n Seq.prototype.cacheResult = function() {\n if (!this._cache && this.__iterateUncached) {\n this._cache = this.entrySeq().toArray();\n this.size = this._cache.length;\n }\n return this;\n };\n\n // abstract __iterateUncached(fn, reverse)\n\n Seq.prototype.__iterate = function(fn, reverse) {\n return seqIterate(this, fn, reverse, true);\n };\n\n // abstract __iteratorUncached(type, reverse)\n\n Seq.prototype.__iterator = function(type, reverse) {\n return seqIterator(this, type, reverse, true);\n };\n\n\n\n createClass(KeyedSeq, Seq);\n function KeyedSeq(value) {\n return value === null || value === undefined ?\n emptySequence().toKeyedSeq() :\n isIterable(value) ?\n (isKeyed(value) ? value.toSeq() : value.fromEntrySeq()) :\n keyedSeqFromValue(value);\n }\n\n KeyedSeq.prototype.toKeyedSeq = function() {\n return this;\n };\n\n\n\n createClass(IndexedSeq, Seq);\n function IndexedSeq(value) {\n return value === null || value === undefined ? emptySequence() :\n !isIterable(value) ? indexedSeqFromValue(value) :\n isKeyed(value) ? value.entrySeq() : value.toIndexedSeq();\n }\n\n IndexedSeq.of = function(/*...values*/) {\n return IndexedSeq(arguments);\n };\n\n IndexedSeq.prototype.toIndexedSeq = function() {\n return this;\n };\n\n IndexedSeq.prototype.toString = function() {\n return this.__toString('Seq [', ']');\n };\n\n IndexedSeq.prototype.__iterate = function(fn, reverse) {\n return seqIterate(this, fn, reverse, false);\n };\n\n IndexedSeq.prototype.__iterator = function(type, reverse) {\n return seqIterator(this, type, reverse, false);\n };\n\n\n\n createClass(SetSeq, Seq);\n function SetSeq(value) {\n return (\n value === null || value === undefined ? emptySequence() :\n !isIterable(value) ? indexedSeqFromValue(value) :\n isKeyed(value) ? value.entrySeq() : value\n ).toSetSeq();\n }\n\n SetSeq.of = function(/*...values*/) {\n return SetSeq(arguments);\n };\n\n SetSeq.prototype.toSetSeq = function() {\n return this;\n };\n\n\n\n Seq.isSeq = isSeq;\n Seq.Keyed = KeyedSeq;\n Seq.Set = SetSeq;\n Seq.Indexed = IndexedSeq;\n\n var IS_SEQ_SENTINEL = '@@__IMMUTABLE_SEQ__@@';\n\n Seq.prototype[IS_SEQ_SENTINEL] = true;\n\n\n\n createClass(ArraySeq, IndexedSeq);\n function ArraySeq(array) {\n this._array = array;\n this.size = array.length;\n }\n\n ArraySeq.prototype.get = function(index, notSetValue) {\n return this.has(index) ? this._array[wrapIndex(this, index)] : notSetValue;\n };\n\n ArraySeq.prototype.__iterate = function(fn, reverse) {\n var array = this._array;\n var maxIndex = array.length - 1;\n for (var ii = 0; ii <= maxIndex; ii++) {\n if (fn(array[reverse ? maxIndex - ii : ii], ii, this) === false) {\n return ii + 1;\n }\n }\n return ii;\n };\n\n ArraySeq.prototype.__iterator = function(type, reverse) {\n var array = this._array;\n var maxIndex = array.length - 1;\n var ii = 0;\n return new Iterator(function() \n {return ii > maxIndex ?\n iteratorDone() :\n iteratorValue(type, ii, array[reverse ? maxIndex - ii++ : ii++])}\n );\n };\n\n\n\n createClass(ObjectSeq, KeyedSeq);\n function ObjectSeq(object) {\n var keys = Object.keys(object);\n this._object = object;\n this._keys = keys;\n this.size = keys.length;\n }\n\n ObjectSeq.prototype.get = function(key, notSetValue) {\n if (notSetValue !== undefined && !this.has(key)) {\n return notSetValue;\n }\n return this._object[key];\n };\n\n ObjectSeq.prototype.has = function(key) {\n return this._object.hasOwnProperty(key);\n };\n\n ObjectSeq.prototype.__iterate = function(fn, reverse) {\n var object = this._object;\n var keys = this._keys;\n var maxIndex = keys.length - 1;\n for (var ii = 0; ii <= maxIndex; ii++) {\n var key = keys[reverse ? maxIndex - ii : ii];\n if (fn(object[key], key, this) === false) {\n return ii + 1;\n }\n }\n return ii;\n };\n\n ObjectSeq.prototype.__iterator = function(type, reverse) {\n var object = this._object;\n var keys = this._keys;\n var maxIndex = keys.length - 1;\n var ii = 0;\n return new Iterator(function() {\n var key = keys[reverse ? maxIndex - ii : ii];\n return ii++ > maxIndex ?\n iteratorDone() :\n iteratorValue(type, key, object[key]);\n });\n };\n\n ObjectSeq.prototype[IS_ORDERED_SENTINEL] = true;\n\n\n createClass(IterableSeq, IndexedSeq);\n function IterableSeq(iterable) {\n this._iterable = iterable;\n this.size = iterable.length || iterable.size;\n }\n\n IterableSeq.prototype.__iterateUncached = function(fn, reverse) {\n if (reverse) {\n return this.cacheResult().__iterate(fn, reverse);\n }\n var iterable = this._iterable;\n var iterator = getIterator(iterable);\n var iterations = 0;\n if (isIterator(iterator)) {\n var step;\n while (!(step = iterator.next()).done) {\n if (fn(step.value, iterations++, this) === false) {\n break;\n }\n }\n }\n return iterations;\n };\n\n IterableSeq.prototype.__iteratorUncached = function(type, reverse) {\n if (reverse) {\n return this.cacheResult().__iterator(type, reverse);\n }\n var iterable = this._iterable;\n var iterator = getIterator(iterable);\n if (!isIterator(iterator)) {\n return new Iterator(iteratorDone);\n }\n var iterations = 0;\n return new Iterator(function() {\n var step = iterator.next();\n return step.done ? step : iteratorValue(type, iterations++, step.value);\n });\n };\n\n\n\n createClass(IteratorSeq, IndexedSeq);\n function IteratorSeq(iterator) {\n this._iterator = iterator;\n this._iteratorCache = [];\n }\n\n IteratorSeq.prototype.__iterateUncached = function(fn, reverse) {\n if (reverse) {\n return this.cacheResult().__iterate(fn, reverse);\n }\n var iterator = this._iterator;\n var cache = this._iteratorCache;\n var iterations = 0;\n while (iterations < cache.length) {\n if (fn(cache[iterations], iterations++, this) === false) {\n return iterations;\n }\n }\n var step;\n while (!(step = iterator.next()).done) {\n var val = step.value;\n cache[iterations] = val;\n if (fn(val, iterations++, this) === false) {\n break;\n }\n }\n return iterations;\n };\n\n IteratorSeq.prototype.__iteratorUncached = function(type, reverse) {\n if (reverse) {\n return this.cacheResult().__iterator(type, reverse);\n }\n var iterator = this._iterator;\n var cache = this._iteratorCache;\n var iterations = 0;\n return new Iterator(function() {\n if (iterations >= cache.length) {\n var step = iterator.next();\n if (step.done) {\n return step;\n }\n cache[iterations] = step.value;\n }\n return iteratorValue(type, iterations, cache[iterations++]);\n });\n };\n\n\n\n\n // # pragma Helper functions\n\n function isSeq(maybeSeq) {\n return !!(maybeSeq && maybeSeq[IS_SEQ_SENTINEL]);\n }\n\n var EMPTY_SEQ;\n\n function emptySequence() {\n return EMPTY_SEQ || (EMPTY_SEQ = new ArraySeq([]));\n }\n\n function keyedSeqFromValue(value) {\n var seq =\n Array.isArray(value) ? new ArraySeq(value).fromEntrySeq() :\n isIterator(value) ? new IteratorSeq(value).fromEntrySeq() :\n hasIterator(value) ? new IterableSeq(value).fromEntrySeq() :\n typeof value === 'object' ? new ObjectSeq(value) :\n undefined;\n if (!seq) {\n throw new TypeError(\n 'Expected Array or iterable object of [k, v] entries, '+\n 'or keyed object: ' + value\n );\n }\n return seq;\n }\n\n function indexedSeqFromValue(value) {\n var seq = maybeIndexedSeqFromValue(value);\n if (!seq) {\n throw new TypeError(\n 'Expected Array or iterable object of values: ' + value\n );\n }\n return seq;\n }\n\n function seqFromValue(value) {\n var seq = maybeIndexedSeqFromValue(value) ||\n (typeof value === 'object' && new ObjectSeq(value));\n if (!seq) {\n throw new TypeError(\n 'Expected Array or iterable object of values, or keyed object: ' + value\n );\n }\n return seq;\n }\n\n function maybeIndexedSeqFromValue(value) {\n return (\n isArrayLike(value) ? new ArraySeq(value) :\n isIterator(value) ? new IteratorSeq(value) :\n hasIterator(value) ? new IterableSeq(value) :\n undefined\n );\n }\n\n function seqIterate(seq, fn, reverse, useKeys) {\n var cache = seq._cache;\n if (cache) {\n var maxIndex = cache.length - 1;\n for (var ii = 0; ii <= maxIndex; ii++) {\n var entry = cache[reverse ? maxIndex - ii : ii];\n if (fn(entry[1], useKeys ? entry[0] : ii, seq) === false) {\n return ii + 1;\n }\n }\n return ii;\n }\n return seq.__iterateUncached(fn, reverse);\n }\n\n function seqIterator(seq, type, reverse, useKeys) {\n var cache = seq._cache;\n if (cache) {\n var maxIndex = cache.length - 1;\n var ii = 0;\n return new Iterator(function() {\n var entry = cache[reverse ? maxIndex - ii : ii];\n return ii++ > maxIndex ?\n iteratorDone() :\n iteratorValue(type, useKeys ? entry[0] : ii - 1, entry[1]);\n });\n }\n return seq.__iteratorUncached(type, reverse);\n }\n\n function fromJS(json, converter) {\n return converter ?\n fromJSWith(converter, json, '', {'': json}) :\n fromJSDefault(json);\n }\n\n function fromJSWith(converter, json, key, parentJSON) {\n if (Array.isArray(json)) {\n return converter.call(parentJSON, key, IndexedSeq(json).map(function(v, k) {return fromJSWith(converter, v, k, json)}));\n }\n if (isPlainObj(json)) {\n return converter.call(parentJSON, key, KeyedSeq(json).map(function(v, k) {return fromJSWith(converter, v, k, json)}));\n }\n return json;\n }\n\n function fromJSDefault(json) {\n if (Array.isArray(json)) {\n return IndexedSeq(json).map(fromJSDefault).toList();\n }\n if (isPlainObj(json)) {\n return KeyedSeq(json).map(fromJSDefault).toMap();\n }\n return json;\n }\n\n function isPlainObj(value) {\n return value && (value.constructor === Object || value.constructor === undefined);\n }\n\n /**\n * An extension of the \"same-value\" algorithm as [described for use by ES6 Map\n * and Set](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map#Key_equality)\n *\n * NaN is considered the same as NaN, however -0 and 0 are considered the same\n * value, which is different from the algorithm described by\n * [`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is).\n *\n * This is extended further to allow Objects to describe the values they\n * represent, by way of `valueOf` or `equals` (and `hashCode`).\n *\n * Note: because of this extension, the key equality of Immutable.Map and the\n * value equality of Immutable.Set will differ from ES6 Map and Set.\n *\n * ### Defining custom values\n *\n * The easiest way to describe the value an object represents is by implementing\n * `valueOf`. For example, `Date` represents a value by returning a unix\n * timestamp for `valueOf`:\n *\n * var date1 = new Date(1234567890000); // Fri Feb 13 2009 ...\n * var date2 = new Date(1234567890000);\n * date1.valueOf(); // 1234567890000\n * assert( date1 !== date2 );\n * assert( Immutable.is( date1, date2 ) );\n *\n * Note: overriding `valueOf` may have other implications if you use this object\n * where JavaScript expects a primitive, such as implicit string coercion.\n *\n * For more complex types, especially collections, implementing `valueOf` may\n * not be performant. An alternative is to implement `equals` and `hashCode`.\n *\n * `equals` takes another object, presumably of similar type, and returns true\n * if the it is equal. Equality is symmetrical, so the same result should be\n * returned if this and the argument are flipped.\n *\n * assert( a.equals(b) === b.equals(a) );\n *\n * `hashCode` returns a 32bit integer number representing the object which will\n * be used to determine how to store the value object in a Map or Set. You must\n * provide both or neither methods, one must not exist without the other.\n *\n * Also, an important relationship between these methods must be upheld: if two\n * values are equal, they *must* return the same hashCode. If the values are not\n * equal, they might have the same hashCode; this is called a hash collision,\n * and while undesirable for performance reasons, it is acceptable.\n *\n * if (a.equals(b)) {\n * assert( a.hashCode() === b.hashCode() );\n * }\n *\n * All Immutable collections implement `equals` and `hashCode`.\n *\n */\n function is(valueA, valueB) {\n if (valueA === valueB || (valueA !== valueA && valueB !== valueB)) {\n return true;\n }\n if (!valueA || !valueB) {\n return false;\n }\n if (typeof valueA.valueOf === 'function' &&\n typeof valueB.valueOf === 'function') {\n valueA = valueA.valueOf();\n valueB = valueB.valueOf();\n if (valueA === valueB || (valueA !== valueA && valueB !== valueB)) {\n return true;\n }\n if (!valueA || !valueB) {\n return false;\n }\n }\n if (typeof valueA.equals === 'function' &&\n typeof valueB.equals === 'function' &&\n valueA.equals(valueB)) {\n return true;\n }\n return false;\n }\n\n function deepEqual(a, b) {\n if (a === b) {\n return true;\n }\n\n if (\n !isIterable(b) ||\n a.size !== undefined && b.size !== undefined && a.size !== b.size ||\n a.__hash !== undefined && b.__hash !== undefined && a.__hash !== b.__hash ||\n isKeyed(a) !== isKeyed(b) ||\n isIndexed(a) !== isIndexed(b) ||\n isOrdered(a) !== isOrdered(b)\n ) {\n return false;\n }\n\n if (a.size === 0 && b.size === 0) {\n return true;\n }\n\n var notAssociative = !isAssociative(a);\n\n if (isOrdered(a)) {\n var entries = a.entries();\n return b.every(function(v, k) {\n var entry = entries.next().value;\n return entry && is(entry[1], v) && (notAssociative || is(entry[0], k));\n }) && entries.next().done;\n }\n\n var flipped = false;\n\n if (a.size === undefined) {\n if (b.size === undefined) {\n if (typeof a.cacheResult === 'function') {\n a.cacheResult();\n }\n } else {\n flipped = true;\n var _ = a;\n a = b;\n b = _;\n }\n }\n\n var allEqual = true;\n var bSize = b.__iterate(function(v, k) {\n if (notAssociative ? !a.has(v) :\n flipped ? !is(v, a.get(k, NOT_SET)) : !is(a.get(k, NOT_SET), v)) {\n allEqual = false;\n return false;\n }\n });\n\n return allEqual && a.size === bSize;\n }\n\n createClass(Repeat, IndexedSeq);\n\n function Repeat(value, times) {\n if (!(this instanceof Repeat)) {\n return new Repeat(value, times);\n }\n this._value = value;\n this.size = times === undefined ? Infinity : Math.max(0, times);\n if (this.size === 0) {\n if (EMPTY_REPEAT) {\n return EMPTY_REPEAT;\n }\n EMPTY_REPEAT = this;\n }\n }\n\n Repeat.prototype.toString = function() {\n if (this.size === 0) {\n return 'Repeat []';\n }\n return 'Repeat [ ' + this._value + ' ' + this.size + ' times ]';\n };\n\n Repeat.prototype.get = function(index, notSetValue) {\n return this.has(index) ? this._value : notSetValue;\n };\n\n Repeat.prototype.includes = function(searchValue) {\n return is(this._value, searchValue);\n };\n\n Repeat.prototype.slice = function(begin, end) {\n var size = this.size;\n return wholeSlice(begin, end, size) ? this :\n new Repeat(this._value, resolveEnd(end, size) - resolveBegin(begin, size));\n };\n\n Repeat.prototype.reverse = function() {\n return this;\n };\n\n Repeat.prototype.indexOf = function(searchValue) {\n if (is(this._value, searchValue)) {\n return 0;\n }\n return -1;\n };\n\n Repeat.prototype.lastIndexOf = function(searchValue) {\n if (is(this._value, searchValue)) {\n return this.size;\n }\n return -1;\n };\n\n Repeat.prototype.__iterate = function(fn, reverse) {\n for (var ii = 0; ii < this.size; ii++) {\n if (fn(this._value, ii, this) === false) {\n return ii + 1;\n }\n }\n return ii;\n };\n\n Repeat.prototype.__iterator = function(type, reverse) {var this$0 = this;\n var ii = 0;\n return new Iterator(function() \n {return ii < this$0.size ? iteratorValue(type, ii++, this$0._value) : iteratorDone()}\n );\n };\n\n Repeat.prototype.equals = function(other) {\n return other instanceof Repeat ?\n is(this._value, other._value) :\n deepEqual(other);\n };\n\n\n var EMPTY_REPEAT;\n\n function invariant(condition, error) {\n if (!condition) throw new Error(error);\n }\n\n createClass(Range, IndexedSeq);\n\n function Range(start, end, step) {\n if (!(this instanceof Range)) {\n return new Range(start, end, step);\n }\n invariant(step !== 0, 'Cannot step a Range by 0');\n start = start || 0;\n if (end === undefined) {\n end = Infinity;\n }\n step = step === undefined ? 1 : Math.abs(step);\n if (end < start) {\n step = -step;\n }\n this._start = start;\n this._end = end;\n this._step = step;\n this.size = Math.max(0, Math.ceil((end - start) / step - 1) + 1);\n if (this.size === 0) {\n if (EMPTY_RANGE) {\n return EMPTY_RANGE;\n }\n EMPTY_RANGE = this;\n }\n }\n\n Range.prototype.toString = function() {\n if (this.size === 0) {\n return 'Range []';\n }\n return 'Range [ ' +\n this._start + '...' + this._end +\n (this._step !== 1 ? ' by ' + this._step : '') +\n ' ]';\n };\n\n Range.prototype.get = function(index, notSetValue) {\n return this.has(index) ?\n this._start + wrapIndex(this, index) * this._step :\n notSetValue;\n };\n\n Range.prototype.includes = function(searchValue) {\n var possibleIndex = (searchValue - this._start) / this._step;\n return possibleIndex >= 0 &&\n possibleIndex < this.size &&\n possibleIndex === Math.floor(possibleIndex);\n };\n\n Range.prototype.slice = function(begin, end) {\n if (wholeSlice(begin, end, this.size)) {\n return this;\n }\n begin = resolveBegin(begin, this.size);\n end = resolveEnd(end, this.size);\n if (end <= begin) {\n return new Range(0, 0);\n }\n return new Range(this.get(begin, this._end), this.get(end, this._end), this._step);\n };\n\n Range.prototype.indexOf = function(searchValue) {\n var offsetValue = searchValue - this._start;\n if (offsetValue % this._step === 0) {\n var index = offsetValue / this._step;\n if (index >= 0 && index < this.size) {\n return index\n }\n }\n return -1;\n };\n\n Range.prototype.lastIndexOf = function(searchValue) {\n return this.indexOf(searchValue);\n };\n\n Range.prototype.__iterate = function(fn, reverse) {\n var maxIndex = this.size - 1;\n var step = this._step;\n var value = reverse ? this._start + maxIndex * step : this._start;\n for (var ii = 0; ii <= maxIndex; ii++) {\n if (fn(value, ii, this) === false) {\n return ii + 1;\n }\n value += reverse ? -step : step;\n }\n return ii;\n };\n\n Range.prototype.__iterator = function(type, reverse) {\n var maxIndex = this.size - 1;\n var step = this._step;\n var value = reverse ? this._start + maxIndex * step : this._start;\n var ii = 0;\n return new Iterator(function() {\n var v = value;\n value += reverse ? -step : step;\n return ii > maxIndex ? iteratorDone() : iteratorValue(type, ii++, v);\n });\n };\n\n Range.prototype.equals = function(other) {\n return other instanceof Range ?\n this._start === other._start &&\n this._end === other._end &&\n this._step === other._step :\n deepEqual(this, other);\n };\n\n\n var EMPTY_RANGE;\n\n createClass(Collection, Iterable);\n function Collection() {\n throw TypeError('Abstract');\n }\n\n\n createClass(KeyedCollection, Collection);function KeyedCollection() {}\n\n createClass(IndexedCollection, Collection);function IndexedCollection() {}\n\n createClass(SetCollection, Collection);function SetCollection() {}\n\n\n Collection.Keyed = KeyedCollection;\n Collection.Indexed = IndexedCollection;\n Collection.Set = SetCollection;\n\n var imul =\n typeof Math.imul === 'function' && Math.imul(0xffffffff, 2) === -2 ?\n Math.imul :\n function imul(a, b) {\n a = a | 0; // int\n b = b | 0; // int\n var c = a & 0xffff;\n var d = b & 0xffff;\n // Shift by 0 fixes the sign on the high part.\n return (c * d) + ((((a >>> 16) * d + c * (b >>> 16)) << 16) >>> 0) | 0; // int\n };\n\n // v8 has an optimization for storing 31-bit signed numbers.\n // Values which have either 00 or 11 as the high order bits qualify.\n // This function drops the highest order bit in a signed number, maintaining\n // the sign bit.\n function smi(i32) {\n return ((i32 >>> 1) & 0x40000000) | (i32 & 0xBFFFFFFF);\n }\n\n function hash(o) {\n if (o === false || o === null || o === undefined) {\n return 0;\n }\n if (typeof o.valueOf === 'function') {\n o = o.valueOf();\n if (o === false || o === null || o === undefined) {\n return 0;\n }\n }\n if (o === true) {\n return 1;\n }\n var type = typeof o;\n if (type === 'number') {\n if (o !== o || o === Infinity) {\n return 0;\n }\n var h = o | 0;\n if (h !== o) {\n h ^= o * 0xFFFFFFFF;\n }\n while (o > 0xFFFFFFFF) {\n o /= 0xFFFFFFFF;\n h ^= o;\n }\n return smi(h);\n }\n if (type === 'string') {\n return o.length > STRING_HASH_CACHE_MIN_STRLEN ? cachedHashString(o) : hashString(o);\n }\n if (typeof o.hashCode === 'function') {\n return o.hashCode();\n }\n if (type === 'object') {\n return hashJSObj(o);\n }\n if (typeof o.toString === 'function') {\n return hashString(o.toString());\n }\n throw new Error('Value type ' + type + ' cannot be hashed.');\n }\n\n function cachedHashString(string) {\n var hash = stringHashCache[string];\n if (hash === undefined) {\n hash = hashString(string);\n if (STRING_HASH_CACHE_SIZE === STRING_HASH_CACHE_MAX_SIZE) {\n STRING_HASH_CACHE_SIZE = 0;\n stringHashCache = {};\n }\n STRING_HASH_CACHE_SIZE++;\n stringHashCache[string] = hash;\n }\n return hash;\n }\n\n // http://jsperf.com/hashing-strings\n function hashString(string) {\n // This is the hash from JVM\n // The hash code for a string is computed as\n // s[0] * 31 ^ (n - 1) + s[1] * 31 ^ (n - 2) + ... + s[n - 1],\n // where s[i] is the ith character of the string and n is the length of\n // the string. We \"mod\" the result to make it between 0 (inclusive) and 2^31\n // (exclusive) by dropping high bits.\n var hash = 0;\n for (var ii = 0; ii < string.length; ii++) {\n hash = 31 * hash + string.charCodeAt(ii) | 0;\n }\n return smi(hash);\n }\n\n function hashJSObj(obj) {\n var hash;\n if (usingWeakMap) {\n hash = weakMap.get(obj);\n if (hash !== undefined) {\n return hash;\n }\n }\n\n hash = obj[UID_HASH_KEY];\n if (hash !== undefined) {\n return hash;\n }\n\n if (!canDefineProperty) {\n hash = obj.propertyIsEnumerable && obj.propertyIsEnumerable[UID_HASH_KEY];\n if (hash !== undefined) {\n return hash;\n }\n\n hash = getIENodeHash(obj);\n if (hash !== undefined) {\n return hash;\n }\n }\n\n hash = ++objHashUID;\n if (objHashUID & 0x40000000) {\n objHashUID = 0;\n }\n\n if (usingWeakMap) {\n weakMap.set(obj, hash);\n } else if (isExtensible !== undefined && isExtensible(obj) === false) {\n throw new Error('Non-extensible objects are not allowed as keys.');\n } else if (canDefineProperty) {\n Object.defineProperty(obj, UID_HASH_KEY, {\n 'enumerable': false,\n 'configurable': false,\n 'writable': false,\n 'value': hash\n });\n } else if (obj.propertyIsEnumerable !== undefined &&\n obj.propertyIsEnumerable === obj.constructor.prototype.propertyIsEnumerable) {\n // Since we can't define a non-enumerable property on the object\n // we'll hijack one of the less-used non-enumerable properties to\n // save our hash on it. Since this is a function it will not show up in\n // `JSON.stringify` which is what we want.\n obj.propertyIsEnumerable = function() {\n return this.constructor.prototype.propertyIsEnumerable.apply(this, arguments);\n };\n obj.propertyIsEnumerable[UID_HASH_KEY] = hash;\n } else if (obj.nodeType !== undefined) {\n // At this point we couldn't get the IE `uniqueID` to use as a hash\n // and we couldn't use a non-enumerable property to exploit the\n // dontEnum bug so we simply add the `UID_HASH_KEY` on the node\n // itself.\n obj[UID_HASH_KEY] = hash;\n } else {\n throw new Error('Unable to set a non-enumerable property on object.');\n }\n\n return hash;\n }\n\n // Get references to ES5 object methods.\n var isExtensible = Object.isExtensible;\n\n // True if Object.defineProperty works as expected. IE8 fails this test.\n var canDefineProperty = (function() {\n try {\n Object.defineProperty({}, '@', {});\n return true;\n } catch (e) {\n return false;\n }\n }());\n\n // IE has a `uniqueID` property on DOM nodes. We can construct the hash from it\n // and avoid memory leaks from the IE cloneNode bug.\n function getIENodeHash(node) {\n if (node && node.nodeType > 0) {\n switch (node.nodeType) {\n case 1: // Element\n return node.uniqueID;\n case 9: // Document\n return node.documentElement && node.documentElement.uniqueID;\n }\n }\n }\n\n // If possible, use a WeakMap.\n var usingWeakMap = typeof WeakMap === 'function';\n var weakMap;\n if (usingWeakMap) {\n weakMap = new WeakMap();\n }\n\n var objHashUID = 0;\n\n var UID_HASH_KEY = '__immutablehash__';\n if (typeof Symbol === 'function') {\n UID_HASH_KEY = Symbol(UID_HASH_KEY);\n }\n\n var STRING_HASH_CACHE_MIN_STRLEN = 16;\n var STRING_HASH_CACHE_MAX_SIZE = 255;\n var STRING_HASH_CACHE_SIZE = 0;\n var stringHashCache = {};\n\n function assertNotInfinite(size) {\n invariant(\n size !== Infinity,\n 'Cannot perform this action with an infinite size.'\n );\n }\n\n createClass(Map, KeyedCollection);\n\n // @pragma Construction\n\n function Map(value) {\n return value === null || value === undefined ? emptyMap() :\n isMap(value) && !isOrdered(value) ? value :\n emptyMap().withMutations(function(map ) {\n var iter = KeyedIterable(value);\n assertNotInfinite(iter.size);\n iter.forEach(function(v, k) {return map.set(k, v)});\n });\n }\n\n Map.of = function() {var keyValues = SLICE$0.call(arguments, 0);\n return emptyMap().withMutations(function(map ) {\n for (var i = 0; i < keyValues.length; i += 2) {\n if (i + 1 >= keyValues.length) {\n throw new Error('Missing value for key: ' + keyValues[i]);\n }\n map.set(keyValues[i], keyValues[i + 1]);\n }\n });\n };\n\n Map.prototype.toString = function() {\n return this.__toString('Map {', '}');\n };\n\n // @pragma Access\n\n Map.prototype.get = function(k, notSetValue) {\n return this._root ?\n this._root.get(0, undefined, k, notSetValue) :\n notSetValue;\n };\n\n // @pragma Modification\n\n Map.prototype.set = function(k, v) {\n return updateMap(this, k, v);\n };\n\n Map.prototype.setIn = function(keyPath, v) {\n return this.updateIn(keyPath, NOT_SET, function() {return v});\n };\n\n Map.prototype.remove = function(k) {\n return updateMap(this, k, NOT_SET);\n };\n\n Map.prototype.deleteIn = function(keyPath) {\n return this.updateIn(keyPath, function() {return NOT_SET});\n };\n\n Map.prototype.update = function(k, notSetValue, updater) {\n return arguments.length === 1 ?\n k(this) :\n this.updateIn([k], notSetValue, updater);\n };\n\n Map.prototype.updateIn = function(keyPath, notSetValue, updater) {\n if (!updater) {\n updater = notSetValue;\n notSetValue = undefined;\n }\n var updatedValue = updateInDeepMap(\n this,\n forceIterator(keyPath),\n notSetValue,\n updater\n );\n return updatedValue === NOT_SET ? undefined : updatedValue;\n };\n\n Map.prototype.clear = function() {\n if (this.size === 0) {\n return this;\n }\n if (this.__ownerID) {\n this.size = 0;\n this._root = null;\n this.__hash = undefined;\n this.__altered = true;\n return this;\n }\n return emptyMap();\n };\n\n // @pragma Composition\n\n Map.prototype.merge = function(/*...iters*/) {\n return mergeIntoMapWith(this, undefined, arguments);\n };\n\n Map.prototype.mergeWith = function(merger) {var iters = SLICE$0.call(arguments, 1);\n return mergeIntoMapWith(this, merger, iters);\n };\n\n Map.prototype.mergeIn = function(keyPath) {var iters = SLICE$0.call(arguments, 1);\n return this.updateIn(\n keyPath,\n emptyMap(),\n function(m ) {return typeof m.merge === 'function' ?\n m.merge.apply(m, iters) :\n iters[iters.length - 1]}\n );\n };\n\n Map.prototype.mergeDeep = function(/*...iters*/) {\n return mergeIntoMapWith(this, deepMerger, arguments);\n };\n\n Map.prototype.mergeDeepWith = function(merger) {var iters = SLICE$0.call(arguments, 1);\n return mergeIntoMapWith(this, deepMergerWith(merger), iters);\n };\n\n Map.prototype.mergeDeepIn = function(keyPath) {var iters = SLICE$0.call(arguments, 1);\n return this.updateIn(\n keyPath,\n emptyMap(),\n function(m ) {return typeof m.mergeDeep === 'function' ?\n m.mergeDeep.apply(m, iters) :\n iters[iters.length - 1]}\n );\n };\n\n Map.prototype.sort = function(comparator) {\n // Late binding\n return OrderedMap(sortFactory(this, comparator));\n };\n\n Map.prototype.sortBy = function(mapper, comparator) {\n // Late binding\n return OrderedMap(sortFactory(this, comparator, mapper));\n };\n\n // @pragma Mutability\n\n Map.prototype.withMutations = function(fn) {\n var mutable = this.asMutable();\n fn(mutable);\n return mutable.wasAltered() ? mutable.__ensureOwner(this.__ownerID) : this;\n };\n\n Map.prototype.asMutable = function() {\n return this.__ownerID ? this : this.__ensureOwner(new OwnerID());\n };\n\n Map.prototype.asImmutable = function() {\n return this.__ensureOwner();\n };\n\n Map.prototype.wasAltered = function() {\n return this.__altered;\n };\n\n Map.prototype.__iterator = function(type, reverse) {\n return new MapIterator(this, type, reverse);\n };\n\n Map.prototype.__iterate = function(fn, reverse) {var this$0 = this;\n var iterations = 0;\n this._root && this._root.iterate(function(entry ) {\n iterations++;\n return fn(entry[1], entry[0], this$0);\n }, reverse);\n return iterations;\n };\n\n Map.prototype.__ensureOwner = function(ownerID) {\n if (ownerID === this.__ownerID) {\n return this;\n }\n if (!ownerID) {\n this.__ownerID = ownerID;\n this.__altered = false;\n return this;\n }\n return makeMap(this.size, this._root, ownerID, this.__hash);\n };\n\n\n function isMap(maybeMap) {\n return !!(maybeMap && maybeMap[IS_MAP_SENTINEL]);\n }\n\n Map.isMap = isMap;\n\n var IS_MAP_SENTINEL = '@@__IMMUTABLE_MAP__@@';\n\n var MapPrototype = Map.prototype;\n MapPrototype[IS_MAP_SENTINEL] = true;\n MapPrototype[DELETE] = MapPrototype.remove;\n MapPrototype.removeIn = MapPrototype.deleteIn;\n\n\n // #pragma Trie Nodes\n\n\n\n function ArrayMapNode(ownerID, entries) {\n this.ownerID = ownerID;\n this.entries = entries;\n }\n\n ArrayMapNode.prototype.get = function(shift, keyHash, key, notSetValue) {\n var entries = this.entries;\n for (var ii = 0, len = entries.length; ii < len; ii++) {\n if (is(key, entries[ii][0])) {\n return entries[ii][1];\n }\n }\n return notSetValue;\n };\n\n ArrayMapNode.prototype.update = function(ownerID, shift, keyHash, key, value, didChangeSize, didAlter) {\n var removed = value === NOT_SET;\n\n var entries = this.entries;\n var idx = 0;\n for (var len = entries.length; idx < len; idx++) {\n if (is(key, entries[idx][0])) {\n break;\n }\n }\n var exists = idx < len;\n\n if (exists ? entries[idx][1] === value : removed) {\n return this;\n }\n\n SetRef(didAlter);\n (removed || !exists) && SetRef(didChangeSize);\n\n if (removed && entries.length === 1) {\n return; // undefined\n }\n\n if (!exists && !removed && entries.length >= MAX_ARRAY_MAP_SIZE) {\n return createNodes(ownerID, entries, key, value);\n }\n\n var isEditable = ownerID && ownerID === this.ownerID;\n var newEntries = isEditable ? entries : arrCopy(entries);\n\n if (exists) {\n if (removed) {\n idx === len - 1 ? newEntries.pop() : (newEntries[idx] = newEntries.pop());\n } else {\n newEntries[idx] = [key, value];\n }\n } else {\n newEntries.push([key, value]);\n }\n\n if (isEditable) {\n this.entries = newEntries;\n return this;\n }\n\n return new ArrayMapNode(ownerID, newEntries);\n };\n\n\n\n\n function BitmapIndexedNode(ownerID, bitmap, nodes) {\n this.ownerID = ownerID;\n this.bitmap = bitmap;\n this.nodes = nodes;\n }\n\n BitmapIndexedNode.prototype.get = function(shift, keyHash, key, notSetValue) {\n if (keyHash === undefined) {\n keyHash = hash(key);\n }\n var bit = (1 << ((shift === 0 ? keyHash : keyHash >>> shift) & MASK));\n var bitmap = this.bitmap;\n return (bitmap & bit) === 0 ? notSetValue :\n this.nodes[popCount(bitmap & (bit - 1))].get(shift + SHIFT, keyHash, key, notSetValue);\n };\n\n BitmapIndexedNode.prototype.update = function(ownerID, shift, keyHash, key, value, didChangeSize, didAlter) {\n if (keyHash === undefined) {\n keyHash = hash(key);\n }\n var keyHashFrag = (shift === 0 ? keyHash : keyHash >>> shift) & MASK;\n var bit = 1 << keyHashFrag;\n var bitmap = this.bitmap;\n var exists = (bitmap & bit) !== 0;\n\n if (!exists && value === NOT_SET) {\n return this;\n }\n\n var idx = popCount(bitmap & (bit - 1));\n var nodes = this.nodes;\n var node = exists ? nodes[idx] : undefined;\n var newNode = updateNode(node, ownerID, shift + SHIFT, keyHash, key, value, didChangeSize, didAlter);\n\n if (newNode === node) {\n return this;\n }\n\n if (!exists && newNode && nodes.length >= MAX_BITMAP_INDEXED_SIZE) {\n return expandNodes(ownerID, nodes, bitmap, keyHashFrag, newNode);\n }\n\n if (exists && !newNode && nodes.length === 2 && isLeafNode(nodes[idx ^ 1])) {\n return nodes[idx ^ 1];\n }\n\n if (exists && newNode && nodes.length === 1 && isLeafNode(newNode)) {\n return newNode;\n }\n\n var isEditable = ownerID && ownerID === this.ownerID;\n var newBitmap = exists ? newNode ? bitmap : bitmap ^ bit : bitmap | bit;\n var newNodes = exists ? newNode ?\n setIn(nodes, idx, newNode, isEditable) :\n spliceOut(nodes, idx, isEditable) :\n spliceIn(nodes, idx, newNode, isEditable);\n\n if (isEditable) {\n this.bitmap = newBitmap;\n this.nodes = newNodes;\n return this;\n }\n\n return new BitmapIndexedNode(ownerID, newBitmap, newNodes);\n };\n\n\n\n\n function HashArrayMapNode(ownerID, count, nodes) {\n this.ownerID = ownerID;\n this.count = count;\n this.nodes = nodes;\n }\n\n HashArrayMapNode.prototype.get = function(shift, keyHash, key, notSetValue) {\n if (keyHash === undefined) {\n keyHash = hash(key);\n }\n var idx = (shift === 0 ? keyHash : keyHash >>> shift) & MASK;\n var node = this.nodes[idx];\n return node ? node.get(shift + SHIFT, keyHash, key, notSetValue) : notSetValue;\n };\n\n HashArrayMapNode.prototype.update = function(ownerID, shift, keyHash, key, value, didChangeSize, didAlter) {\n if (keyHash === undefined) {\n keyHash = hash(key);\n }\n var idx = (shift === 0 ? keyHash : keyHash >>> shift) & MASK;\n var removed = value === NOT_SET;\n var nodes = this.nodes;\n var node = nodes[idx];\n\n if (removed && !node) {\n return this;\n }\n\n var newNode = updateNode(node, ownerID, shift + SHIFT, keyHash, key, value, didChangeSize, didAlter);\n if (newNode === node) {\n return this;\n }\n\n var newCount = this.count;\n if (!node) {\n newCount++;\n } else if (!newNode) {\n newCount--;\n if (newCount < MIN_HASH_ARRAY_MAP_SIZE) {\n return packNodes(ownerID, nodes, newCount, idx);\n }\n }\n\n var isEditable = ownerID && ownerID === this.ownerID;\n var newNodes = setIn(nodes, idx, newNode, isEditable);\n\n if (isEditable) {\n this.count = newCount;\n this.nodes = newNodes;\n return this;\n }\n\n return new HashArrayMapNode(ownerID, newCount, newNodes);\n };\n\n\n\n\n function HashCollisionNode(ownerID, keyHash, entries) {\n this.ownerID = ownerID;\n this.keyHash = keyHash;\n this.entries = entries;\n }\n\n HashCollisionNode.prototype.get = function(shift, keyHash, key, notSetValue) {\n var entries = this.entries;\n for (var ii = 0, len = entries.length; ii < len; ii++) {\n if (is(key, entries[ii][0])) {\n return entries[ii][1];\n }\n }\n return notSetValue;\n };\n\n HashCollisionNode.prototype.update = function(ownerID, shift, keyHash, key, value, didChangeSize, didAlter) {\n if (keyHash === undefined) {\n keyHash = hash(key);\n }\n\n var removed = value === NOT_SET;\n\n if (keyHash !== this.keyHash) {\n if (removed) {\n return this;\n }\n SetRef(didAlter);\n SetRef(didChangeSize);\n return mergeIntoNode(this, ownerID, shift, keyHash, [key, value]);\n }\n\n var entries = this.entries;\n var idx = 0;\n for (var len = entries.length; idx < len; idx++) {\n if (is(key, entries[idx][0])) {\n break;\n }\n }\n var exists = idx < len;\n\n if (exists ? entries[idx][1] === value : removed) {\n return this;\n }\n\n SetRef(didAlter);\n (removed || !exists) && SetRef(didChangeSize);\n\n if (removed && len === 2) {\n return new ValueNode(ownerID, this.keyHash, entries[idx ^ 1]);\n }\n\n var isEditable = ownerID && ownerID === this.ownerID;\n var newEntries = isEditable ? entries : arrCopy(entries);\n\n if (exists) {\n if (removed) {\n idx === len - 1 ? newEntries.pop() : (newEntries[idx] = newEntries.pop());\n } else {\n newEntries[idx] = [key, value];\n }\n } else {\n newEntries.push([key, value]);\n }\n\n if (isEditable) {\n this.entries = newEntries;\n return this;\n }\n\n return new HashCollisionNode(ownerID, this.keyHash, newEntries);\n };\n\n\n\n\n function ValueNode(ownerID, keyHash, entry) {\n this.ownerID = ownerID;\n this.keyHash = keyHash;\n this.entry = entry;\n }\n\n ValueNode.prototype.get = function(shift, keyHash, key, notSetValue) {\n return is(key, this.entry[0]) ? this.entry[1] : notSetValue;\n };\n\n ValueNode.prototype.update = function(ownerID, shift, keyHash, key, value, didChangeSize, didAlter) {\n var removed = value === NOT_SET;\n var keyMatch = is(key, this.entry[0]);\n if (keyMatch ? value === this.entry[1] : removed) {\n return this;\n }\n\n SetRef(didAlter);\n\n if (removed) {\n SetRef(didChangeSize);\n return; // undefined\n }\n\n if (keyMatch) {\n if (ownerID && ownerID === this.ownerID) {\n this.entry[1] = value;\n return this;\n }\n return new ValueNode(ownerID, this.keyHash, [key, value]);\n }\n\n SetRef(didChangeSize);\n return mergeIntoNode(this, ownerID, shift, hash(key), [key, value]);\n };\n\n\n\n // #pragma Iterators\n\n ArrayMapNode.prototype.iterate =\n HashCollisionNode.prototype.iterate = function (fn, reverse) {\n var entries = this.entries;\n for (var ii = 0, maxIndex = entries.length - 1; ii <= maxIndex; ii++) {\n if (fn(entries[reverse ? maxIndex - ii : ii]) === false) {\n return false;\n }\n }\n }\n\n BitmapIndexedNode.prototype.iterate =\n HashArrayMapNode.prototype.iterate = function (fn, reverse) {\n var nodes = this.nodes;\n for (var ii = 0, maxIndex = nodes.length - 1; ii <= maxIndex; ii++) {\n var node = nodes[reverse ? maxIndex - ii : ii];\n if (node && node.iterate(fn, reverse) === false) {\n return false;\n }\n }\n }\n\n ValueNode.prototype.iterate = function (fn, reverse) {\n return fn(this.entry);\n }\n\n createClass(MapIterator, Iterator);\n\n function MapIterator(map, type, reverse) {\n this._type = type;\n this._reverse = reverse;\n this._stack = map._root && mapIteratorFrame(map._root);\n }\n\n MapIterator.prototype.next = function() {\n var type = this._type;\n var stack = this._stack;\n while (stack) {\n var node = stack.node;\n var index = stack.index++;\n var maxIndex;\n if (node.entry) {\n if (index === 0) {\n return mapIteratorValue(type, node.entry);\n }\n } else if (node.entries) {\n maxIndex = node.entries.length - 1;\n if (index <= maxIndex) {\n return mapIteratorValue(type, node.entries[this._reverse ? maxIndex - index : index]);\n }\n } else {\n maxIndex = node.nodes.length - 1;\n if (index <= maxIndex) {\n var subNode = node.nodes[this._reverse ? maxIndex - index : index];\n if (subNode) {\n if (subNode.entry) {\n return mapIteratorValue(type, subNode.entry);\n }\n stack = this._stack = mapIteratorFrame(subNode, stack);\n }\n continue;\n }\n }\n stack = this._stack = this._stack.__prev;\n }\n return iteratorDone();\n };\n\n\n function mapIteratorValue(type, entry) {\n return iteratorValue(type, entry[0], entry[1]);\n }\n\n function mapIteratorFrame(node, prev) {\n return {\n node: node,\n index: 0,\n __prev: prev\n };\n }\n\n function makeMap(size, root, ownerID, hash) {\n var map = Object.create(MapPrototype);\n map.size = size;\n map._root = root;\n map.__ownerID = ownerID;\n map.__hash = hash;\n map.__altered = false;\n return map;\n }\n\n var EMPTY_MAP;\n function emptyMap() {\n return EMPTY_MAP || (EMPTY_MAP = makeMap(0));\n }\n\n function updateMap(map, k, v) {\n var newRoot;\n var newSize;\n if (!map._root) {\n if (v === NOT_SET) {\n return map;\n }\n newSize = 1;\n newRoot = new ArrayMapNode(map.__ownerID, [[k, v]]);\n } else {\n var didChangeSize = MakeRef(CHANGE_LENGTH);\n var didAlter = MakeRef(DID_ALTER);\n newRoot = updateNode(map._root, map.__ownerID, 0, undefined, k, v, didChangeSize, didAlter);\n if (!didAlter.value) {\n return map;\n }\n newSize = map.size + (didChangeSize.value ? v === NOT_SET ? -1 : 1 : 0);\n }\n if (map.__ownerID) {\n map.size = newSize;\n map._root = newRoot;\n map.__hash = undefined;\n map.__altered = true;\n return map;\n }\n return newRoot ? makeMap(newSize, newRoot) : emptyMap();\n }\n\n function updateNode(node, ownerID, shift, keyHash, key, value, didChangeSize, didAlter) {\n if (!node) {\n if (value === NOT_SET) {\n return node;\n }\n SetRef(didAlter);\n SetRef(didChangeSize);\n return new ValueNode(ownerID, keyHash, [key, value]);\n }\n return node.update(ownerID, shift, keyHash, key, value, didChangeSize, didAlter);\n }\n\n function isLeafNode(node) {\n return node.constructor === ValueNode || node.constructor === HashCollisionNode;\n }\n\n function mergeIntoNode(node, ownerID, shift, keyHash, entry) {\n if (node.keyHash === keyHash) {\n return new HashCollisionNode(ownerID, keyHash, [node.entry, entry]);\n }\n\n var idx1 = (shift === 0 ? node.keyHash : node.keyHash >>> shift) & MASK;\n var idx2 = (shift === 0 ? keyHash : keyHash >>> shift) & MASK;\n\n var newNode;\n var nodes = idx1 === idx2 ?\n [mergeIntoNode(node, ownerID, shift + SHIFT, keyHash, entry)] :\n ((newNode = new ValueNode(ownerID, keyHash, entry)), idx1 < idx2 ? [node, newNode] : [newNode, node]);\n\n return new BitmapIndexedNode(ownerID, (1 << idx1) | (1 << idx2), nodes);\n }\n\n function createNodes(ownerID, entries, key, value) {\n if (!ownerID) {\n ownerID = new OwnerID();\n }\n var node = new ValueNode(ownerID, hash(key), [key, value]);\n for (var ii = 0; ii < entries.length; ii++) {\n var entry = entries[ii];\n node = node.update(ownerID, 0, undefined, entry[0], entry[1]);\n }\n return node;\n }\n\n function packNodes(ownerID, nodes, count, excluding) {\n var bitmap = 0;\n var packedII = 0;\n var packedNodes = new Array(count);\n for (var ii = 0, bit = 1, len = nodes.length; ii < len; ii++, bit <<= 1) {\n var node = nodes[ii];\n if (node !== undefined && ii !== excluding) {\n bitmap |= bit;\n packedNodes[packedII++] = node;\n }\n }\n return new BitmapIndexedNode(ownerID, bitmap, packedNodes);\n }\n\n function expandNodes(ownerID, nodes, bitmap, including, node) {\n var count = 0;\n var expandedNodes = new Array(SIZE);\n for (var ii = 0; bitmap !== 0; ii++, bitmap >>>= 1) {\n expandedNodes[ii] = bitmap & 1 ? nodes[count++] : undefined;\n }\n expandedNodes[including] = node;\n return new HashArrayMapNode(ownerID, count + 1, expandedNodes);\n }\n\n function mergeIntoMapWith(map, merger, iterables) {\n var iters = [];\n for (var ii = 0; ii < iterables.length; ii++) {\n var value = iterables[ii];\n var iter = KeyedIterable(value);\n if (!isIterable(value)) {\n iter = iter.map(function(v ) {return fromJS(v)});\n }\n iters.push(iter);\n }\n return mergeIntoCollectionWith(map, merger, iters);\n }\n\n function deepMerger(existing, value, key) {\n return existing && existing.mergeDeep && isIterable(value) ?\n existing.mergeDeep(value) :\n is(existing, value) ? existing : value;\n }\n\n function deepMergerWith(merger) {\n return function(existing, value, key) {\n if (existing && existing.mergeDeepWith && isIterable(value)) {\n return existing.mergeDeepWith(merger, value);\n }\n var nextValue = merger(existing, value, key);\n return is(existing, nextValue) ? existing : nextValue;\n };\n }\n\n function mergeIntoCollectionWith(collection, merger, iters) {\n iters = iters.filter(function(x ) {return x.size !== 0});\n if (iters.length === 0) {\n return collection;\n }\n if (collection.size === 0 && !collection.__ownerID && iters.length === 1) {\n return collection.constructor(iters[0]);\n }\n return collection.withMutations(function(collection ) {\n var mergeIntoMap = merger ?\n function(value, key) {\n collection.update(key, NOT_SET, function(existing )\n {return existing === NOT_SET ? value : merger(existing, value, key)}\n );\n } :\n function(value, key) {\n collection.set(key, value);\n }\n for (var ii = 0; ii < iters.length; ii++) {\n iters[ii].forEach(mergeIntoMap);\n }\n });\n }\n\n function updateInDeepMap(existing, keyPathIter, notSetValue, updater) {\n var isNotSet = existing === NOT_SET;\n var step = keyPathIter.next();\n if (step.done) {\n var existingValue = isNotSet ? notSetValue : existing;\n var newValue = updater(existingValue);\n return newValue === existingValue ? existing : newValue;\n }\n invariant(\n isNotSet || (existing && existing.set),\n 'invalid keyPath'\n );\n var key = step.value;\n var nextExisting = isNotSet ? NOT_SET : existing.get(key, NOT_SET);\n var nextUpdated = updateInDeepMap(\n nextExisting,\n keyPathIter,\n notSetValue,\n updater\n );\n return nextUpdated === nextExisting ? existing :\n nextUpdated === NOT_SET ? existing.remove(key) :\n (isNotSet ? emptyMap() : existing).set(key, nextUpdated);\n }\n\n function popCount(x) {\n x = x - ((x >> 1) & 0x55555555);\n x = (x & 0x33333333) + ((x >> 2) & 0x33333333);\n x = (x + (x >> 4)) & 0x0f0f0f0f;\n x = x + (x >> 8);\n x = x + (x >> 16);\n return x & 0x7f;\n }\n\n function setIn(array, idx, val, canEdit) {\n var newArray = canEdit ? array : arrCopy(array);\n newArray[idx] = val;\n return newArray;\n }\n\n function spliceIn(array, idx, val, canEdit) {\n var newLen = array.length + 1;\n if (canEdit && idx + 1 === newLen) {\n array[idx] = val;\n return array;\n }\n var newArray = new Array(newLen);\n var after = 0;\n for (var ii = 0; ii < newLen; ii++) {\n if (ii === idx) {\n newArray[ii] = val;\n after = -1;\n } else {\n newArray[ii] = array[ii + after];\n }\n }\n return newArray;\n }\n\n function spliceOut(array, idx, canEdit) {\n var newLen = array.length - 1;\n if (canEdit && idx === newLen) {\n array.pop();\n return array;\n }\n var newArray = new Array(newLen);\n var after = 0;\n for (var ii = 0; ii < newLen; ii++) {\n if (ii === idx) {\n after = 1;\n }\n newArray[ii] = array[ii + after];\n }\n return newArray;\n }\n\n var MAX_ARRAY_MAP_SIZE = SIZE / 4;\n var MAX_BITMAP_INDEXED_SIZE = SIZE / 2;\n var MIN_HASH_ARRAY_MAP_SIZE = SIZE / 4;\n\n createClass(List, IndexedCollection);\n\n // @pragma Construction\n\n function List(value) {\n var empty = emptyList();\n if (value === null || value === undefined) {\n return empty;\n }\n if (isList(value)) {\n return value;\n }\n var iter = IndexedIterable(value);\n var size = iter.size;\n if (size === 0) {\n return empty;\n }\n assertNotInfinite(size);\n if (size > 0 && size < SIZE) {\n return makeList(0, size, SHIFT, null, new VNode(iter.toArray()));\n }\n return empty.withMutations(function(list ) {\n list.setSize(size);\n iter.forEach(function(v, i) {return list.set(i, v)});\n });\n }\n\n List.of = function(/*...values*/) {\n return this(arguments);\n };\n\n List.prototype.toString = function() {\n return this.__toString('List [', ']');\n };\n\n // @pragma Access\n\n List.prototype.get = function(index, notSetValue) {\n index = wrapIndex(this, index);\n if (index >= 0 && index < this.size) {\n index += this._origin;\n var node = listNodeFor(this, index);\n return node && node.array[index & MASK];\n }\n return notSetValue;\n };\n\n // @pragma Modification\n\n List.prototype.set = function(index, value) {\n return updateList(this, index, value);\n };\n\n List.prototype.remove = function(index) {\n return !this.has(index) ? this :\n index === 0 ? this.shift() :\n index === this.size - 1 ? this.pop() :\n this.splice(index, 1);\n };\n\n List.prototype.insert = function(index, value) {\n return this.splice(index, 0, value);\n };\n\n List.prototype.clear = function() {\n if (this.size === 0) {\n return this;\n }\n if (this.__ownerID) {\n this.size = this._origin = this._capacity = 0;\n this._level = SHIFT;\n this._root = this._tail = null;\n this.__hash = undefined;\n this.__altered = true;\n return this;\n }\n return emptyList();\n };\n\n List.prototype.push = function(/*...values*/) {\n var values = arguments;\n var oldSize = this.size;\n return this.withMutations(function(list ) {\n setListBounds(list, 0, oldSize + values.length);\n for (var ii = 0; ii < values.length; ii++) {\n list.set(oldSize + ii, values[ii]);\n }\n });\n };\n\n List.prototype.pop = function() {\n return setListBounds(this, 0, -1);\n };\n\n List.prototype.unshift = function(/*...values*/) {\n var values = arguments;\n return this.withMutations(function(list ) {\n setListBounds(list, -values.length);\n for (var ii = 0; ii < values.length; ii++) {\n list.set(ii, values[ii]);\n }\n });\n };\n\n List.prototype.shift = function() {\n return setListBounds(this, 1);\n };\n\n // @pragma Composition\n\n List.prototype.merge = function(/*...iters*/) {\n return mergeIntoListWith(this, undefined, arguments);\n };\n\n List.prototype.mergeWith = function(merger) {var iters = SLICE$0.call(arguments, 1);\n return mergeIntoListWith(this, merger, iters);\n };\n\n List.prototype.mergeDeep = function(/*...iters*/) {\n return mergeIntoListWith(this, deepMerger, arguments);\n };\n\n List.prototype.mergeDeepWith = function(merger) {var iters = SLICE$0.call(arguments, 1);\n return mergeIntoListWith(this, deepMergerWith(merger), iters);\n };\n\n List.prototype.setSize = function(size) {\n return setListBounds(this, 0, size);\n };\n\n // @pragma Iteration\n\n List.prototype.slice = function(begin, end) {\n var size = this.size;\n if (wholeSlice(begin, end, size)) {\n return this;\n }\n return setListBounds(\n this,\n resolveBegin(begin, size),\n resolveEnd(end, size)\n );\n };\n\n List.prototype.__iterator = function(type, reverse) {\n var index = 0;\n var values = iterateList(this, reverse);\n return new Iterator(function() {\n var value = values();\n return value === DONE ?\n iteratorDone() :\n iteratorValue(type, index++, value);\n });\n };\n\n List.prototype.__iterate = function(fn, reverse) {\n var index = 0;\n var values = iterateList(this, reverse);\n var value;\n while ((value = values()) !== DONE) {\n if (fn(value, index++, this) === false) {\n break;\n }\n }\n return index;\n };\n\n List.prototype.__ensureOwner = function(ownerID) {\n if (ownerID === this.__ownerID) {\n return this;\n }\n if (!ownerID) {\n this.__ownerID = ownerID;\n return this;\n }\n return makeList(this._origin, this._capacity, this._level, this._root, this._tail, ownerID, this.__hash);\n };\n\n\n function isList(maybeList) {\n return !!(maybeList && maybeList[IS_LIST_SENTINEL]);\n }\n\n List.isList = isList;\n\n var IS_LIST_SENTINEL = '@@__IMMUTABLE_LIST__@@';\n\n var ListPrototype = List.prototype;\n ListPrototype[IS_LIST_SENTINEL] = true;\n ListPrototype[DELETE] = ListPrototype.remove;\n ListPrototype.setIn = MapPrototype.setIn;\n ListPrototype.deleteIn =\n ListPrototype.removeIn = MapPrototype.removeIn;\n ListPrototype.update = MapPrototype.update;\n ListPrototype.updateIn = MapPrototype.updateIn;\n ListPrototype.mergeIn = MapPrototype.mergeIn;\n ListPrototype.mergeDeepIn = MapPrototype.mergeDeepIn;\n ListPrototype.withMutations = MapPrototype.withMutations;\n ListPrototype.asMutable = MapPrototype.asMutable;\n ListPrototype.asImmutable = MapPrototype.asImmutable;\n ListPrototype.wasAltered = MapPrototype.wasAltered;\n\n\n\n function VNode(array, ownerID) {\n this.array = array;\n this.ownerID = ownerID;\n }\n\n // TODO: seems like these methods are very similar\n\n VNode.prototype.removeBefore = function(ownerID, level, index) {\n if (index === level ? 1 << level : 0 || this.array.length === 0) {\n return this;\n }\n var originIndex = (index >>> level) & MASK;\n if (originIndex >= this.array.length) {\n return new VNode([], ownerID);\n }\n var removingFirst = originIndex === 0;\n var newChild;\n if (level > 0) {\n var oldChild = this.array[originIndex];\n newChild = oldChild && oldChild.removeBefore(ownerID, level - SHIFT, index);\n if (newChild === oldChild && removingFirst) {\n return this;\n }\n }\n if (removingFirst && !newChild) {\n return this;\n }\n var editable = editableVNode(this, ownerID);\n if (!removingFirst) {\n for (var ii = 0; ii < originIndex; ii++) {\n editable.array[ii] = undefined;\n }\n }\n if (newChild) {\n editable.array[originIndex] = newChild;\n }\n return editable;\n };\n\n VNode.prototype.removeAfter = function(ownerID, level, index) {\n if (index === (level ? 1 << level : 0) || this.array.length === 0) {\n return this;\n }\n var sizeIndex = ((index - 1) >>> level) & MASK;\n if (sizeIndex >= this.array.length) {\n return this;\n }\n\n var newChild;\n if (level > 0) {\n var oldChild = this.array[sizeIndex];\n newChild = oldChild && oldChild.removeAfter(ownerID, level - SHIFT, index);\n if (newChild === oldChild && sizeIndex === this.array.length - 1) {\n return this;\n }\n }\n\n var editable = editableVNode(this, ownerID);\n editable.array.splice(sizeIndex + 1);\n if (newChild) {\n editable.array[sizeIndex] = newChild;\n }\n return editable;\n };\n\n\n\n var DONE = {};\n\n function iterateList(list, reverse) {\n var left = list._origin;\n var right = list._capacity;\n var tailPos = getTailOffset(right);\n var tail = list._tail;\n\n return iterateNodeOrLeaf(list._root, list._level, 0);\n\n function iterateNodeOrLeaf(node, level, offset) {\n return level === 0 ?\n iterateLeaf(node, offset) :\n iterateNode(node, level, offset);\n }\n\n function iterateLeaf(node, offset) {\n var array = offset === tailPos ? tail && tail.array : node && node.array;\n var from = offset > left ? 0 : left - offset;\n var to = right - offset;\n if (to > SIZE) {\n to = SIZE;\n }\n return function() {\n if (from === to) {\n return DONE;\n }\n var idx = reverse ? --to : from++;\n return array && array[idx];\n };\n }\n\n function iterateNode(node, level, offset) {\n var values;\n var array = node && node.array;\n var from = offset > left ? 0 : (left - offset) >> level;\n var to = ((right - offset) >> level) + 1;\n if (to > SIZE) {\n to = SIZE;\n }\n return function() {\n do {\n if (values) {\n var value = values();\n if (value !== DONE) {\n return value;\n }\n values = null;\n }\n if (from === to) {\n return DONE;\n }\n var idx = reverse ? --to : from++;\n values = iterateNodeOrLeaf(\n array && array[idx], level - SHIFT, offset + (idx << level)\n );\n } while (true);\n };\n }\n }\n\n function makeList(origin, capacity, level, root, tail, ownerID, hash) {\n var list = Object.create(ListPrototype);\n list.size = capacity - origin;\n list._origin = origin;\n list._capacity = capacity;\n list._level = level;\n list._root = root;\n list._tail = tail;\n list.__ownerID = ownerID;\n list.__hash = hash;\n list.__altered = false;\n return list;\n }\n\n var EMPTY_LIST;\n function emptyList() {\n return EMPTY_LIST || (EMPTY_LIST = makeList(0, 0, SHIFT));\n }\n\n function updateList(list, index, value) {\n index = wrapIndex(list, index);\n\n if (index !== index) {\n return list;\n }\n\n if (index >= list.size || index < 0) {\n return list.withMutations(function(list ) {\n index < 0 ?\n setListBounds(list, index).set(0, value) :\n setListBounds(list, 0, index + 1).set(index, value)\n });\n }\n\n index += list._origin;\n\n var newTail = list._tail;\n var newRoot = list._root;\n var didAlter = MakeRef(DID_ALTER);\n if (index >= getTailOffset(list._capacity)) {\n newTail = updateVNode(newTail, list.__ownerID, 0, index, value, didAlter);\n } else {\n newRoot = updateVNode(newRoot, list.__ownerID, list._level, index, value, didAlter);\n }\n\n if (!didAlter.value) {\n return list;\n }\n\n if (list.__ownerID) {\n list._root = newRoot;\n list._tail = newTail;\n list.__hash = undefined;\n list.__altered = true;\n return list;\n }\n return makeList(list._origin, list._capacity, list._level, newRoot, newTail);\n }\n\n function updateVNode(node, ownerID, level, index, value, didAlter) {\n var idx = (index >>> level) & MASK;\n var nodeHas = node && idx < node.array.length;\n if (!nodeHas && value === undefined) {\n return node;\n }\n\n var newNode;\n\n if (level > 0) {\n var lowerNode = node && node.array[idx];\n var newLowerNode = updateVNode(lowerNode, ownerID, level - SHIFT, index, value, didAlter);\n if (newLowerNode === lowerNode) {\n return node;\n }\n newNode = editableVNode(node, ownerID);\n newNode.array[idx] = newLowerNode;\n return newNode;\n }\n\n if (nodeHas && node.array[idx] === value) {\n return node;\n }\n\n SetRef(didAlter);\n\n newNode = editableVNode(node, ownerID);\n if (value === undefined && idx === newNode.array.length - 1) {\n newNode.array.pop();\n } else {\n newNode.array[idx] = value;\n }\n return newNode;\n }\n\n function editableVNode(node, ownerID) {\n if (ownerID && node && ownerID === node.ownerID) {\n return node;\n }\n return new VNode(node ? node.array.slice() : [], ownerID);\n }\n\n function listNodeFor(list, rawIndex) {\n if (rawIndex >= getTailOffset(list._capacity)) {\n return list._tail;\n }\n if (rawIndex < 1 << (list._level + SHIFT)) {\n var node = list._root;\n var level = list._level;\n while (node && level > 0) {\n node = node.array[(rawIndex >>> level) & MASK];\n level -= SHIFT;\n }\n return node;\n }\n }\n\n function setListBounds(list, begin, end) {\n // Sanitize begin & end using this shorthand for ToInt32(argument)\n // http://www.ecma-international.org/ecma-262/6.0/#sec-toint32\n if (begin !== undefined) {\n begin = begin | 0;\n }\n if (end !== undefined) {\n end = end | 0;\n }\n var owner = list.__ownerID || new OwnerID();\n var oldOrigin = list._origin;\n var oldCapacity = list._capacity;\n var newOrigin = oldOrigin + begin;\n var newCapacity = end === undefined ? oldCapacity : end < 0 ? oldCapacity + end : oldOrigin + end;\n if (newOrigin === oldOrigin && newCapacity === oldCapacity) {\n return list;\n }\n\n // If it's going to end after it starts, it's empty.\n if (newOrigin >= newCapacity) {\n return list.clear();\n }\n\n var newLevel = list._level;\n var newRoot = list._root;\n\n // New origin might need creating a higher root.\n var offsetShift = 0;\n while (newOrigin + offsetShift < 0) {\n newRoot = new VNode(newRoot && newRoot.array.length ? [undefined, newRoot] : [], owner);\n newLevel += SHIFT;\n offsetShift += 1 << newLevel;\n }\n if (offsetShift) {\n newOrigin += offsetShift;\n oldOrigin += offsetShift;\n newCapacity += offsetShift;\n oldCapacity += offsetShift;\n }\n\n var oldTailOffset = getTailOffset(oldCapacity);\n var newTailOffset = getTailOffset(newCapacity);\n\n // New size might need creating a higher root.\n while (newTailOffset >= 1 << (newLevel + SHIFT)) {\n newRoot = new VNode(newRoot && newRoot.array.length ? [newRoot] : [], owner);\n newLevel += SHIFT;\n }\n\n // Locate or create the new tail.\n var oldTail = list._tail;\n var newTail = newTailOffset < oldTailOffset ?\n listNodeFor(list, newCapacity - 1) :\n newTailOffset > oldTailOffset ? new VNode([], owner) : oldTail;\n\n // Merge Tail into tree.\n if (oldTail && newTailOffset > oldTailOffset && newOrigin < oldCapacity && oldTail.array.length) {\n newRoot = editableVNode(newRoot, owner);\n var node = newRoot;\n for (var level = newLevel; level > SHIFT; level -= SHIFT) {\n var idx = (oldTailOffset >>> level) & MASK;\n node = node.array[idx] = editableVNode(node.array[idx], owner);\n }\n node.array[(oldTailOffset >>> SHIFT) & MASK] = oldTail;\n }\n\n // If the size has been reduced, there's a chance the tail needs to be trimmed.\n if (newCapacity < oldCapacity) {\n newTail = newTail && newTail.removeAfter(owner, 0, newCapacity);\n }\n\n // If the new origin is within the tail, then we do not need a root.\n if (newOrigin >= newTailOffset) {\n newOrigin -= newTailOffset;\n newCapacity -= newTailOffset;\n newLevel = SHIFT;\n newRoot = null;\n newTail = newTail && newTail.removeBefore(owner, 0, newOrigin);\n\n // Otherwise, if the root has been trimmed, garbage collect.\n } else if (newOrigin > oldOrigin || newTailOffset < oldTailOffset) {\n offsetShift = 0;\n\n // Identify the new top root node of the subtree of the old root.\n while (newRoot) {\n var beginIndex = (newOrigin >>> newLevel) & MASK;\n if (beginIndex !== (newTailOffset >>> newLevel) & MASK) {\n break;\n }\n if (beginIndex) {\n offsetShift += (1 << newLevel) * beginIndex;\n }\n newLevel -= SHIFT;\n newRoot = newRoot.array[beginIndex];\n }\n\n // Trim the new sides of the new root.\n if (newRoot && newOrigin > oldOrigin) {\n newRoot = newRoot.removeBefore(owner, newLevel, newOrigin - offsetShift);\n }\n if (newRoot && newTailOffset < oldTailOffset) {\n newRoot = newRoot.removeAfter(owner, newLevel, newTailOffset - offsetShift);\n }\n if (offsetShift) {\n newOrigin -= offsetShift;\n newCapacity -= offsetShift;\n }\n }\n\n if (list.__ownerID) {\n list.size = newCapacity - newOrigin;\n list._origin = newOrigin;\n list._capacity = newCapacity;\n list._level = newLevel;\n list._root = newRoot;\n list._tail = newTail;\n list.__hash = undefined;\n list.__altered = true;\n return list;\n }\n return makeList(newOrigin, newCapacity, newLevel, newRoot, newTail);\n }\n\n function mergeIntoListWith(list, merger, iterables) {\n var iters = [];\n var maxSize = 0;\n for (var ii = 0; ii < iterables.length; ii++) {\n var value = iterables[ii];\n var iter = IndexedIterable(value);\n if (iter.size > maxSize) {\n maxSize = iter.size;\n }\n if (!isIterable(value)) {\n iter = iter.map(function(v ) {return fromJS(v)});\n }\n iters.push(iter);\n }\n if (maxSize > list.size) {\n list = list.setSize(maxSize);\n }\n return mergeIntoCollectionWith(list, merger, iters);\n }\n\n function getTailOffset(size) {\n return size < SIZE ? 0 : (((size - 1) >>> SHIFT) << SHIFT);\n }\n\n createClass(OrderedMap, Map);\n\n // @pragma Construction\n\n function OrderedMap(value) {\n return value === null || value === undefined ? emptyOrderedMap() :\n isOrderedMap(value) ? value :\n emptyOrderedMap().withMutations(function(map ) {\n var iter = KeyedIterable(value);\n assertNotInfinite(iter.size);\n iter.forEach(function(v, k) {return map.set(k, v)});\n });\n }\n\n OrderedMap.of = function(/*...values*/) {\n return this(arguments);\n };\n\n OrderedMap.prototype.toString = function() {\n return this.__toString('OrderedMap {', '}');\n };\n\n // @pragma Access\n\n OrderedMap.prototype.get = function(k, notSetValue) {\n var index = this._map.get(k);\n return index !== undefined ? this._list.get(index)[1] : notSetValue;\n };\n\n // @pragma Modification\n\n OrderedMap.prototype.clear = function() {\n if (this.size === 0) {\n return this;\n }\n if (this.__ownerID) {\n this.size = 0;\n this._map.clear();\n this._list.clear();\n return this;\n }\n return emptyOrderedMap();\n };\n\n OrderedMap.prototype.set = function(k, v) {\n return updateOrderedMap(this, k, v);\n };\n\n OrderedMap.prototype.remove = function(k) {\n return updateOrderedMap(this, k, NOT_SET);\n };\n\n OrderedMap.prototype.wasAltered = function() {\n return this._map.wasAltered() || this._list.wasAltered();\n };\n\n OrderedMap.prototype.__iterate = function(fn, reverse) {var this$0 = this;\n return this._list.__iterate(\n function(entry ) {return entry && fn(entry[1], entry[0], this$0)},\n reverse\n );\n };\n\n OrderedMap.prototype.__iterator = function(type, reverse) {\n return this._list.fromEntrySeq().__iterator(type, reverse);\n };\n\n OrderedMap.prototype.__ensureOwner = function(ownerID) {\n if (ownerID === this.__ownerID) {\n return this;\n }\n var newMap = this._map.__ensureOwner(ownerID);\n var newList = this._list.__ensureOwner(ownerID);\n if (!ownerID) {\n this.__ownerID = ownerID;\n this._map = newMap;\n this._list = newList;\n return this;\n }\n return makeOrderedMap(newMap, newList, ownerID, this.__hash);\n };\n\n\n function isOrderedMap(maybeOrderedMap) {\n return isMap(maybeOrderedMap) && isOrdered(maybeOrderedMap);\n }\n\n OrderedMap.isOrderedMap = isOrderedMap;\n\n OrderedMap.prototype[IS_ORDERED_SENTINEL] = true;\n OrderedMap.prototype[DELETE] = OrderedMap.prototype.remove;\n\n\n\n function makeOrderedMap(map, list, ownerID, hash) {\n var omap = Object.create(OrderedMap.prototype);\n omap.size = map ? map.size : 0;\n omap._map = map;\n omap._list = list;\n omap.__ownerID = ownerID;\n omap.__hash = hash;\n return omap;\n }\n\n var EMPTY_ORDERED_MAP;\n function emptyOrderedMap() {\n return EMPTY_ORDERED_MAP || (EMPTY_ORDERED_MAP = makeOrderedMap(emptyMap(), emptyList()));\n }\n\n function updateOrderedMap(omap, k, v) {\n var map = omap._map;\n var list = omap._list;\n var i = map.get(k);\n var has = i !== undefined;\n var newMap;\n var newList;\n if (v === NOT_SET) { // removed\n if (!has) {\n return omap;\n }\n if (list.size >= SIZE && list.size >= map.size * 2) {\n newList = list.filter(function(entry, idx) {return entry !== undefined && i !== idx});\n newMap = newList.toKeyedSeq().map(function(entry ) {return entry[0]}).flip().toMap();\n if (omap.__ownerID) {\n newMap.__ownerID = newList.__ownerID = omap.__ownerID;\n }\n } else {\n newMap = map.remove(k);\n newList = i === list.size - 1 ? list.pop() : list.set(i, undefined);\n }\n } else {\n if (has) {\n if (v === list.get(i)[1]) {\n return omap;\n }\n newMap = map;\n newList = list.set(i, [k, v]);\n } else {\n newMap = map.set(k, list.size);\n newList = list.set(list.size, [k, v]);\n }\n }\n if (omap.__ownerID) {\n omap.size = newMap.size;\n omap._map = newMap;\n omap._list = newList;\n omap.__hash = undefined;\n return omap;\n }\n return makeOrderedMap(newMap, newList);\n }\n\n createClass(ToKeyedSequence, KeyedSeq);\n function ToKeyedSequence(indexed, useKeys) {\n this._iter = indexed;\n this._useKeys = useKeys;\n this.size = indexed.size;\n }\n\n ToKeyedSequence.prototype.get = function(key, notSetValue) {\n return this._iter.get(key, notSetValue);\n };\n\n ToKeyedSequence.prototype.has = function(key) {\n return this._iter.has(key);\n };\n\n ToKeyedSequence.prototype.valueSeq = function() {\n return this._iter.valueSeq();\n };\n\n ToKeyedSequence.prototype.reverse = function() {var this$0 = this;\n var reversedSequence = reverseFactory(this, true);\n if (!this._useKeys) {\n reversedSequence.valueSeq = function() {return this$0._iter.toSeq().reverse()};\n }\n return reversedSequence;\n };\n\n ToKeyedSequence.prototype.map = function(mapper, context) {var this$0 = this;\n var mappedSequence = mapFactory(this, mapper, context);\n if (!this._useKeys) {\n mappedSequence.valueSeq = function() {return this$0._iter.toSeq().map(mapper, context)};\n }\n return mappedSequence;\n };\n\n ToKeyedSequence.prototype.__iterate = function(fn, reverse) {var this$0 = this;\n var ii;\n return this._iter.__iterate(\n this._useKeys ?\n function(v, k) {return fn(v, k, this$0)} :\n ((ii = reverse ? resolveSize(this) : 0),\n function(v ) {return fn(v, reverse ? --ii : ii++, this$0)}),\n reverse\n );\n };\n\n ToKeyedSequence.prototype.__iterator = function(type, reverse) {\n if (this._useKeys) {\n return this._iter.__iterator(type, reverse);\n }\n var iterator = this._iter.__iterator(ITERATE_VALUES, reverse);\n var ii = reverse ? resolveSize(this) : 0;\n return new Iterator(function() {\n var step = iterator.next();\n return step.done ? step :\n iteratorValue(type, reverse ? --ii : ii++, step.value, step);\n });\n };\n\n ToKeyedSequence.prototype[IS_ORDERED_SENTINEL] = true;\n\n\n createClass(ToIndexedSequence, IndexedSeq);\n function ToIndexedSequence(iter) {\n this._iter = iter;\n this.size = iter.size;\n }\n\n ToIndexedSequence.prototype.includes = function(value) {\n return this._iter.includes(value);\n };\n\n ToIndexedSequence.prototype.__iterate = function(fn, reverse) {var this$0 = this;\n var iterations = 0;\n return this._iter.__iterate(function(v ) {return fn(v, iterations++, this$0)}, reverse);\n };\n\n ToIndexedSequence.prototype.__iterator = function(type, reverse) {\n var iterator = this._iter.__iterator(ITERATE_VALUES, reverse);\n var iterations = 0;\n return new Iterator(function() {\n var step = iterator.next();\n return step.done ? step :\n iteratorValue(type, iterations++, step.value, step)\n });\n };\n\n\n\n createClass(ToSetSequence, SetSeq);\n function ToSetSequence(iter) {\n this._iter = iter;\n this.size = iter.size;\n }\n\n ToSetSequence.prototype.has = function(key) {\n return this._iter.includes(key);\n };\n\n ToSetSequence.prototype.__iterate = function(fn, reverse) {var this$0 = this;\n return this._iter.__iterate(function(v ) {return fn(v, v, this$0)}, reverse);\n };\n\n ToSetSequence.prototype.__iterator = function(type, reverse) {\n var iterator = this._iter.__iterator(ITERATE_VALUES, reverse);\n return new Iterator(function() {\n var step = iterator.next();\n return step.done ? step :\n iteratorValue(type, step.value, step.value, step);\n });\n };\n\n\n\n createClass(FromEntriesSequence, KeyedSeq);\n function FromEntriesSequence(entries) {\n this._iter = entries;\n this.size = entries.size;\n }\n\n FromEntriesSequence.prototype.entrySeq = function() {\n return this._iter.toSeq();\n };\n\n FromEntriesSequence.prototype.__iterate = function(fn, reverse) {var this$0 = this;\n return this._iter.__iterate(function(entry ) {\n // Check if entry exists first so array access doesn't throw for holes\n // in the parent iteration.\n if (entry) {\n validateEntry(entry);\n var indexedIterable = isIterable(entry);\n return fn(\n indexedIterable ? entry.get(1) : entry[1],\n indexedIterable ? entry.get(0) : entry[0],\n this$0\n );\n }\n }, reverse);\n };\n\n FromEntriesSequence.prototype.__iterator = function(type, reverse) {\n var iterator = this._iter.__iterator(ITERATE_VALUES, reverse);\n return new Iterator(function() {\n while (true) {\n var step = iterator.next();\n if (step.done) {\n return step;\n }\n var entry = step.value;\n // Check if entry exists first so array access doesn't throw for holes\n // in the parent iteration.\n if (entry) {\n validateEntry(entry);\n var indexedIterable = isIterable(entry);\n return iteratorValue(\n type,\n indexedIterable ? entry.get(0) : entry[0],\n indexedIterable ? entry.get(1) : entry[1],\n step\n );\n }\n }\n });\n };\n\n\n ToIndexedSequence.prototype.cacheResult =\n ToKeyedSequence.prototype.cacheResult =\n ToSetSequence.prototype.cacheResult =\n FromEntriesSequence.prototype.cacheResult =\n cacheResultThrough;\n\n\n function flipFactory(iterable) {\n var flipSequence = makeSequence(iterable);\n flipSequence._iter = iterable;\n flipSequence.size = iterable.size;\n flipSequence.flip = function() {return iterable};\n flipSequence.reverse = function () {\n var reversedSequence = iterable.reverse.apply(this); // super.reverse()\n reversedSequence.flip = function() {return iterable.reverse()};\n return reversedSequence;\n };\n flipSequence.has = function(key ) {return iterable.includes(key)};\n flipSequence.includes = function(key ) {return iterable.has(key)};\n flipSequence.cacheResult = cacheResultThrough;\n flipSequence.__iterateUncached = function (fn, reverse) {var this$0 = this;\n return iterable.__iterate(function(v, k) {return fn(k, v, this$0) !== false}, reverse);\n }\n flipSequence.__iteratorUncached = function(type, reverse) {\n if (type === ITERATE_ENTRIES) {\n var iterator = iterable.__iterator(type, reverse);\n return new Iterator(function() {\n var step = iterator.next();\n if (!step.done) {\n var k = step.value[0];\n step.value[0] = step.value[1];\n step.value[1] = k;\n }\n return step;\n });\n }\n return iterable.__iterator(\n type === ITERATE_VALUES ? ITERATE_KEYS : ITERATE_VALUES,\n reverse\n );\n }\n return flipSequence;\n }\n\n\n function mapFactory(iterable, mapper, context) {\n var mappedSequence = makeSequence(iterable);\n mappedSequence.size = iterable.size;\n mappedSequence.has = function(key ) {return iterable.has(key)};\n mappedSequence.get = function(key, notSetValue) {\n var v = iterable.get(key, NOT_SET);\n return v === NOT_SET ?\n notSetValue :\n mapper.call(context, v, key, iterable);\n };\n mappedSequence.__iterateUncached = function (fn, reverse) {var this$0 = this;\n return iterable.__iterate(\n function(v, k, c) {return fn(mapper.call(context, v, k, c), k, this$0) !== false},\n reverse\n );\n }\n mappedSequence.__iteratorUncached = function (type, reverse) {\n var iterator = iterable.__iterator(ITERATE_ENTRIES, reverse);\n return new Iterator(function() {\n var step = iterator.next();\n if (step.done) {\n return step;\n }\n var entry = step.value;\n var key = entry[0];\n return iteratorValue(\n type,\n key,\n mapper.call(context, entry[1], key, iterable),\n step\n );\n });\n }\n return mappedSequence;\n }\n\n\n function reverseFactory(iterable, useKeys) {\n var reversedSequence = makeSequence(iterable);\n reversedSequence._iter = iterable;\n reversedSequence.size = iterable.size;\n reversedSequence.reverse = function() {return iterable};\n if (iterable.flip) {\n reversedSequence.flip = function () {\n var flipSequence = flipFactory(iterable);\n flipSequence.reverse = function() {return iterable.flip()};\n return flipSequence;\n };\n }\n reversedSequence.get = function(key, notSetValue) \n {return iterable.get(useKeys ? key : -1 - key, notSetValue)};\n reversedSequence.has = function(key )\n {return iterable.has(useKeys ? key : -1 - key)};\n reversedSequence.includes = function(value ) {return iterable.includes(value)};\n reversedSequence.cacheResult = cacheResultThrough;\n reversedSequence.__iterate = function (fn, reverse) {var this$0 = this;\n return iterable.__iterate(function(v, k) {return fn(v, k, this$0)}, !reverse);\n };\n reversedSequence.__iterator =\n function(type, reverse) {return iterable.__iterator(type, !reverse)};\n return reversedSequence;\n }\n\n\n function filterFactory(iterable, predicate, context, useKeys) {\n var filterSequence = makeSequence(iterable);\n if (useKeys) {\n filterSequence.has = function(key ) {\n var v = iterable.get(key, NOT_SET);\n return v !== NOT_SET && !!predicate.call(context, v, key, iterable);\n };\n filterSequence.get = function(key, notSetValue) {\n var v = iterable.get(key, NOT_SET);\n return v !== NOT_SET && predicate.call(context, v, key, iterable) ?\n v : notSetValue;\n };\n }\n filterSequence.__iterateUncached = function (fn, reverse) {var this$0 = this;\n var iterations = 0;\n iterable.__iterate(function(v, k, c) {\n if (predicate.call(context, v, k, c)) {\n iterations++;\n return fn(v, useKeys ? k : iterations - 1, this$0);\n }\n }, reverse);\n return iterations;\n };\n filterSequence.__iteratorUncached = function (type, reverse) {\n var iterator = iterable.__iterator(ITERATE_ENTRIES, reverse);\n var iterations = 0;\n return new Iterator(function() {\n while (true) {\n var step = iterator.next();\n if (step.done) {\n return step;\n }\n var entry = step.value;\n var key = entry[0];\n var value = entry[1];\n if (predicate.call(context, value, key, iterable)) {\n return iteratorValue(type, useKeys ? key : iterations++, value, step);\n }\n }\n });\n }\n return filterSequence;\n }\n\n\n function countByFactory(iterable, grouper, context) {\n var groups = Map().asMutable();\n iterable.__iterate(function(v, k) {\n groups.update(\n grouper.call(context, v, k, iterable),\n 0,\n function(a ) {return a + 1}\n );\n });\n return groups.asImmutable();\n }\n\n\n function groupByFactory(iterable, grouper, context) {\n var isKeyedIter = isKeyed(iterable);\n var groups = (isOrdered(iterable) ? OrderedMap() : Map()).asMutable();\n iterable.__iterate(function(v, k) {\n groups.update(\n grouper.call(context, v, k, iterable),\n function(a ) {return (a = a || [], a.push(isKeyedIter ? [k, v] : v), a)}\n );\n });\n var coerce = iterableClass(iterable);\n return groups.map(function(arr ) {return reify(iterable, coerce(arr))});\n }\n\n\n function sliceFactory(iterable, begin, end, useKeys) {\n var originalSize = iterable.size;\n\n // Sanitize begin & end using this shorthand for ToInt32(argument)\n // http://www.ecma-international.org/ecma-262/6.0/#sec-toint32\n if (begin !== undefined) {\n begin = begin | 0;\n }\n if (end !== undefined) {\n if (end === Infinity) {\n end = originalSize;\n } else {\n end = end | 0;\n }\n }\n\n if (wholeSlice(begin, end, originalSize)) {\n return iterable;\n }\n\n var resolvedBegin = resolveBegin(begin, originalSize);\n var resolvedEnd = resolveEnd(end, originalSize);\n\n // begin or end will be NaN if they were provided as negative numbers and\n // this iterable's size is unknown. In that case, cache first so there is\n // a known size and these do not resolve to NaN.\n if (resolvedBegin !== resolvedBegin || resolvedEnd !== resolvedEnd) {\n return sliceFactory(iterable.toSeq().cacheResult(), begin, end, useKeys);\n }\n\n // Note: resolvedEnd is undefined when the original sequence's length is\n // unknown and this slice did not supply an end and should contain all\n // elements after resolvedBegin.\n // In that case, resolvedSize will be NaN and sliceSize will remain undefined.\n var resolvedSize = resolvedEnd - resolvedBegin;\n var sliceSize;\n if (resolvedSize === resolvedSize) {\n sliceSize = resolvedSize < 0 ? 0 : resolvedSize;\n }\n\n var sliceSeq = makeSequence(iterable);\n\n // If iterable.size is undefined, the size of the realized sliceSeq is\n // unknown at this point unless the number of items to slice is 0\n sliceSeq.size = sliceSize === 0 ? sliceSize : iterable.size && sliceSize || undefined;\n\n if (!useKeys && isSeq(iterable) && sliceSize >= 0) {\n sliceSeq.get = function (index, notSetValue) {\n index = wrapIndex(this, index);\n return index >= 0 && index < sliceSize ?\n iterable.get(index + resolvedBegin, notSetValue) :\n notSetValue;\n }\n }\n\n sliceSeq.__iterateUncached = function(fn, reverse) {var this$0 = this;\n if (sliceSize === 0) {\n return 0;\n }\n if (reverse) {\n return this.cacheResult().__iterate(fn, reverse);\n }\n var skipped = 0;\n var isSkipping = true;\n var iterations = 0;\n iterable.__iterate(function(v, k) {\n if (!(isSkipping && (isSkipping = skipped++ < resolvedBegin))) {\n iterations++;\n return fn(v, useKeys ? k : iterations - 1, this$0) !== false &&\n iterations !== sliceSize;\n }\n });\n return iterations;\n };\n\n sliceSeq.__iteratorUncached = function(type, reverse) {\n if (sliceSize !== 0 && reverse) {\n return this.cacheResult().__iterator(type, reverse);\n }\n // Don't bother instantiating parent iterator if taking 0.\n var iterator = sliceSize !== 0 && iterable.__iterator(type, reverse);\n var skipped = 0;\n var iterations = 0;\n return new Iterator(function() {\n while (skipped++ < resolvedBegin) {\n iterator.next();\n }\n if (++iterations > sliceSize) {\n return iteratorDone();\n }\n var step = iterator.next();\n if (useKeys || type === ITERATE_VALUES) {\n return step;\n } else if (type === ITERATE_KEYS) {\n return iteratorValue(type, iterations - 1, undefined, step);\n } else {\n return iteratorValue(type, iterations - 1, step.value[1], step);\n }\n });\n }\n\n return sliceSeq;\n }\n\n\n function takeWhileFactory(iterable, predicate, context) {\n var takeSequence = makeSequence(iterable);\n takeSequence.__iterateUncached = function(fn, reverse) {var this$0 = this;\n if (reverse) {\n return this.cacheResult().__iterate(fn, reverse);\n }\n var iterations = 0;\n iterable.__iterate(function(v, k, c) \n {return predicate.call(context, v, k, c) && ++iterations && fn(v, k, this$0)}\n );\n return iterations;\n };\n takeSequence.__iteratorUncached = function(type, reverse) {var this$0 = this;\n if (reverse) {\n return this.cacheResult().__iterator(type, reverse);\n }\n var iterator = iterable.__iterator(ITERATE_ENTRIES, reverse);\n var iterating = true;\n return new Iterator(function() {\n if (!iterating) {\n return iteratorDone();\n }\n var step = iterator.next();\n if (step.done) {\n return step;\n }\n var entry = step.value;\n var k = entry[0];\n var v = entry[1];\n if (!predicate.call(context, v, k, this$0)) {\n iterating = false;\n return iteratorDone();\n }\n return type === ITERATE_ENTRIES ? step :\n iteratorValue(type, k, v, step);\n });\n };\n return takeSequence;\n }\n\n\n function skipWhileFactory(iterable, predicate, context, useKeys) {\n var skipSequence = makeSequence(iterable);\n skipSequence.__iterateUncached = function (fn, reverse) {var this$0 = this;\n if (reverse) {\n return this.cacheResult().__iterate(fn, reverse);\n }\n var isSkipping = true;\n var iterations = 0;\n iterable.__iterate(function(v, k, c) {\n if (!(isSkipping && (isSkipping = predicate.call(context, v, k, c)))) {\n iterations++;\n return fn(v, useKeys ? k : iterations - 1, this$0);\n }\n });\n return iterations;\n };\n skipSequence.__iteratorUncached = function(type, reverse) {var this$0 = this;\n if (reverse) {\n return this.cacheResult().__iterator(type, reverse);\n }\n var iterator = iterable.__iterator(ITERATE_ENTRIES, reverse);\n var skipping = true;\n var iterations = 0;\n return new Iterator(function() {\n var step, k, v;\n do {\n step = iterator.next();\n if (step.done) {\n if (useKeys || type === ITERATE_VALUES) {\n return step;\n } else if (type === ITERATE_KEYS) {\n return iteratorValue(type, iterations++, undefined, step);\n } else {\n return iteratorValue(type, iterations++, step.value[1], step);\n }\n }\n var entry = step.value;\n k = entry[0];\n v = entry[1];\n skipping && (skipping = predicate.call(context, v, k, this$0));\n } while (skipping);\n return type === ITERATE_ENTRIES ? step :\n iteratorValue(type, k, v, step);\n });\n };\n return skipSequence;\n }\n\n\n function concatFactory(iterable, values) {\n var isKeyedIterable = isKeyed(iterable);\n var iters = [iterable].concat(values).map(function(v ) {\n if (!isIterable(v)) {\n v = isKeyedIterable ?\n keyedSeqFromValue(v) :\n indexedSeqFromValue(Array.isArray(v) ? v : [v]);\n } else if (isKeyedIterable) {\n v = KeyedIterable(v);\n }\n return v;\n }).filter(function(v ) {return v.size !== 0});\n\n if (iters.length === 0) {\n return iterable;\n }\n\n if (iters.length === 1) {\n var singleton = iters[0];\n if (singleton === iterable ||\n isKeyedIterable && isKeyed(singleton) ||\n isIndexed(iterable) && isIndexed(singleton)) {\n return singleton;\n }\n }\n\n var concatSeq = new ArraySeq(iters);\n if (isKeyedIterable) {\n concatSeq = concatSeq.toKeyedSeq();\n } else if (!isIndexed(iterable)) {\n concatSeq = concatSeq.toSetSeq();\n }\n concatSeq = concatSeq.flatten(true);\n concatSeq.size = iters.reduce(\n function(sum, seq) {\n if (sum !== undefined) {\n var size = seq.size;\n if (size !== undefined) {\n return sum + size;\n }\n }\n },\n 0\n );\n return concatSeq;\n }\n\n\n function flattenFactory(iterable, depth, useKeys) {\n var flatSequence = makeSequence(iterable);\n flatSequence.__iterateUncached = function(fn, reverse) {\n var iterations = 0;\n var stopped = false;\n function flatDeep(iter, currentDepth) {var this$0 = this;\n iter.__iterate(function(v, k) {\n if ((!depth || currentDepth < depth) && isIterable(v)) {\n flatDeep(v, currentDepth + 1);\n } else if (fn(v, useKeys ? k : iterations++, this$0) === false) {\n stopped = true;\n }\n return !stopped;\n }, reverse);\n }\n flatDeep(iterable, 0);\n return iterations;\n }\n flatSequence.__iteratorUncached = function(type, reverse) {\n var iterator = iterable.__iterator(type, reverse);\n var stack = [];\n var iterations = 0;\n return new Iterator(function() {\n while (iterator) {\n var step = iterator.next();\n if (step.done !== false) {\n iterator = stack.pop();\n continue;\n }\n var v = step.value;\n if (type === ITERATE_ENTRIES) {\n v = v[1];\n }\n if ((!depth || stack.length < depth) && isIterable(v)) {\n stack.push(iterator);\n iterator = v.__iterator(type, reverse);\n } else {\n return useKeys ? step : iteratorValue(type, iterations++, v, step);\n }\n }\n return iteratorDone();\n });\n }\n return flatSequence;\n }\n\n\n function flatMapFactory(iterable, mapper, context) {\n var coerce = iterableClass(iterable);\n return iterable.toSeq().map(\n function(v, k) {return coerce(mapper.call(context, v, k, iterable))}\n ).flatten(true);\n }\n\n\n function interposeFactory(iterable, separator) {\n var interposedSequence = makeSequence(iterable);\n interposedSequence.size = iterable.size && iterable.size * 2 -1;\n interposedSequence.__iterateUncached = function(fn, reverse) {var this$0 = this;\n var iterations = 0;\n iterable.__iterate(function(v, k) \n {return (!iterations || fn(separator, iterations++, this$0) !== false) &&\n fn(v, iterations++, this$0) !== false},\n reverse\n );\n return iterations;\n };\n interposedSequence.__iteratorUncached = function(type, reverse) {\n var iterator = iterable.__iterator(ITERATE_VALUES, reverse);\n var iterations = 0;\n var step;\n return new Iterator(function() {\n if (!step || iterations % 2) {\n step = iterator.next();\n if (step.done) {\n return step;\n }\n }\n return iterations % 2 ?\n iteratorValue(type, iterations++, separator) :\n iteratorValue(type, iterations++, step.value, step);\n });\n };\n return interposedSequence;\n }\n\n\n function sortFactory(iterable, comparator, mapper) {\n if (!comparator) {\n comparator = defaultComparator;\n }\n var isKeyedIterable = isKeyed(iterable);\n var index = 0;\n var entries = iterable.toSeq().map(\n function(v, k) {return [k, v, index++, mapper ? mapper(v, k, iterable) : v]}\n ).toArray();\n entries.sort(function(a, b) {return comparator(a[3], b[3]) || a[2] - b[2]}).forEach(\n isKeyedIterable ?\n function(v, i) { entries[i].length = 2; } :\n function(v, i) { entries[i] = v[1]; }\n );\n return isKeyedIterable ? KeyedSeq(entries) :\n isIndexed(iterable) ? IndexedSeq(entries) :\n SetSeq(entries);\n }\n\n\n function maxFactory(iterable, comparator, mapper) {\n if (!comparator) {\n comparator = defaultComparator;\n }\n if (mapper) {\n var entry = iterable.toSeq()\n .map(function(v, k) {return [v, mapper(v, k, iterable)]})\n .reduce(function(a, b) {return maxCompare(comparator, a[1], b[1]) ? b : a});\n return entry && entry[0];\n } else {\n return iterable.reduce(function(a, b) {return maxCompare(comparator, a, b) ? b : a});\n }\n }\n\n function maxCompare(comparator, a, b) {\n var comp = comparator(b, a);\n // b is considered the new max if the comparator declares them equal, but\n // they are not equal and b is in fact a nullish value.\n return (comp === 0 && b !== a && (b === undefined || b === null || b !== b)) || comp > 0;\n }\n\n\n function zipWithFactory(keyIter, zipper, iters) {\n var zipSequence = makeSequence(keyIter);\n zipSequence.size = new ArraySeq(iters).map(function(i ) {return i.size}).min();\n // Note: this a generic base implementation of __iterate in terms of\n // __iterator which may be more generically useful in the future.\n zipSequence.__iterate = function(fn, reverse) {\n /* generic:\n var iterator = this.__iterator(ITERATE_ENTRIES, reverse);\n var step;\n var iterations = 0;\n while (!(step = iterator.next()).done) {\n iterations++;\n if (fn(step.value[1], step.value[0], this) === false) {\n break;\n }\n }\n return iterations;\n */\n // indexed:\n var iterator = this.__iterator(ITERATE_VALUES, reverse);\n var step;\n var iterations = 0;\n while (!(step = iterator.next()).done) {\n if (fn(step.value, iterations++, this) === false) {\n break;\n }\n }\n return iterations;\n };\n zipSequence.__iteratorUncached = function(type, reverse) {\n var iterators = iters.map(function(i )\n {return (i = Iterable(i), getIterator(reverse ? i.reverse() : i))}\n );\n var iterations = 0;\n var isDone = false;\n return new Iterator(function() {\n var steps;\n if (!isDone) {\n steps = iterators.map(function(i ) {return i.next()});\n isDone = steps.some(function(s ) {return s.done});\n }\n if (isDone) {\n return iteratorDone();\n }\n return iteratorValue(\n type,\n iterations++,\n zipper.apply(null, steps.map(function(s ) {return s.value}))\n );\n });\n };\n return zipSequence\n }\n\n\n // #pragma Helper Functions\n\n function reify(iter, seq) {\n return isSeq(iter) ? seq : iter.constructor(seq);\n }\n\n function validateEntry(entry) {\n if (entry !== Object(entry)) {\n throw new TypeError('Expected [K, V] tuple: ' + entry);\n }\n }\n\n function resolveSize(iter) {\n assertNotInfinite(iter.size);\n return ensureSize(iter);\n }\n\n function iterableClass(iterable) {\n return isKeyed(iterable) ? KeyedIterable :\n isIndexed(iterable) ? IndexedIterable :\n SetIterable;\n }\n\n function makeSequence(iterable) {\n return Object.create(\n (\n isKeyed(iterable) ? KeyedSeq :\n isIndexed(iterable) ? IndexedSeq :\n SetSeq\n ).prototype\n );\n }\n\n function cacheResultThrough() {\n if (this._iter.cacheResult) {\n this._iter.cacheResult();\n this.size = this._iter.size;\n return this;\n } else {\n return Seq.prototype.cacheResult.call(this);\n }\n }\n\n function defaultComparator(a, b) {\n return a > b ? 1 : a < b ? -1 : 0;\n }\n\n function forceIterator(keyPath) {\n var iter = getIterator(keyPath);\n if (!iter) {\n // Array might not be iterable in this environment, so we need a fallback\n // to our wrapped type.\n if (!isArrayLike(keyPath)) {\n throw new TypeError('Expected iterable or array-like: ' + keyPath);\n }\n iter = getIterator(Iterable(keyPath));\n }\n return iter;\n }\n\n createClass(Record, KeyedCollection);\n\n function Record(defaultValues, name) {\n var hasInitialized;\n\n var RecordType = function Record(values) {\n if (values instanceof RecordType) {\n return values;\n }\n if (!(this instanceof RecordType)) {\n return new RecordType(values);\n }\n if (!hasInitialized) {\n hasInitialized = true;\n var keys = Object.keys(defaultValues);\n setProps(RecordTypePrototype, keys);\n RecordTypePrototype.size = keys.length;\n RecordTypePrototype._name = name;\n RecordTypePrototype._keys = keys;\n RecordTypePrototype._defaultValues = defaultValues;\n }\n this._map = Map(values);\n };\n\n var RecordTypePrototype = RecordType.prototype = Object.create(RecordPrototype);\n RecordTypePrototype.constructor = RecordType;\n\n return RecordType;\n }\n\n Record.prototype.toString = function() {\n return this.__toString(recordName(this) + ' {', '}');\n };\n\n // @pragma Access\n\n Record.prototype.has = function(k) {\n return this._defaultValues.hasOwnProperty(k);\n };\n\n Record.prototype.get = function(k, notSetValue) {\n if (!this.has(k)) {\n return notSetValue;\n }\n var defaultVal = this._defaultValues[k];\n return this._map ? this._map.get(k, defaultVal) : defaultVal;\n };\n\n // @pragma Modification\n\n Record.prototype.clear = function() {\n if (this.__ownerID) {\n this._map && this._map.clear();\n return this;\n }\n var RecordType = this.constructor;\n return RecordType._empty || (RecordType._empty = makeRecord(this, emptyMap()));\n };\n\n Record.prototype.set = function(k, v) {\n if (!this.has(k)) {\n throw new Error('Cannot set unknown key \"' + k + '\" on ' + recordName(this));\n }\n if (this._map && !this._map.has(k)) {\n var defaultVal = this._defaultValues[k];\n if (v === defaultVal) {\n return this;\n }\n }\n var newMap = this._map && this._map.set(k, v);\n if (this.__ownerID || newMap === this._map) {\n return this;\n }\n return makeRecord(this, newMap);\n };\n\n Record.prototype.remove = function(k) {\n if (!this.has(k)) {\n return this;\n }\n var newMap = this._map && this._map.remove(k);\n if (this.__ownerID || newMap === this._map) {\n return this;\n }\n return makeRecord(this, newMap);\n };\n\n Record.prototype.wasAltered = function() {\n return this._map.wasAltered();\n };\n\n Record.prototype.__iterator = function(type, reverse) {var this$0 = this;\n return KeyedIterable(this._defaultValues).map(function(_, k) {return this$0.get(k)}).__iterator(type, reverse);\n };\n\n Record.prototype.__iterate = function(fn, reverse) {var this$0 = this;\n return KeyedIterable(this._defaultValues).map(function(_, k) {return this$0.get(k)}).__iterate(fn, reverse);\n };\n\n Record.prototype.__ensureOwner = function(ownerID) {\n if (ownerID === this.__ownerID) {\n return this;\n }\n var newMap = this._map && this._map.__ensureOwner(ownerID);\n if (!ownerID) {\n this.__ownerID = ownerID;\n this._map = newMap;\n return this;\n }\n return makeRecord(this, newMap, ownerID);\n };\n\n\n var RecordPrototype = Record.prototype;\n RecordPrototype[DELETE] = RecordPrototype.remove;\n RecordPrototype.deleteIn =\n RecordPrototype.removeIn = MapPrototype.removeIn;\n RecordPrototype.merge = MapPrototype.merge;\n RecordPrototype.mergeWith = MapPrototype.mergeWith;\n RecordPrototype.mergeIn = MapPrototype.mergeIn;\n RecordPrototype.mergeDeep = MapPrototype.mergeDeep;\n RecordPrototype.mergeDeepWith = MapPrototype.mergeDeepWith;\n RecordPrototype.mergeDeepIn = MapPrototype.mergeDeepIn;\n RecordPrototype.setIn = MapPrototype.setIn;\n RecordPrototype.update = MapPrototype.update;\n RecordPrototype.updateIn = MapPrototype.updateIn;\n RecordPrototype.withMutations = MapPrototype.withMutations;\n RecordPrototype.asMutable = MapPrototype.asMutable;\n RecordPrototype.asImmutable = MapPrototype.asImmutable;\n\n\n function makeRecord(likeRecord, map, ownerID) {\n var record = Object.create(Object.getPrototypeOf(likeRecord));\n record._map = map;\n record.__ownerID = ownerID;\n return record;\n }\n\n function recordName(record) {\n return record._name || record.constructor.name || 'Record';\n }\n\n function setProps(prototype, names) {\n try {\n names.forEach(setProp.bind(undefined, prototype));\n } catch (error) {\n // Object.defineProperty failed. Probably IE8.\n }\n }\n\n function setProp(prototype, name) {\n Object.defineProperty(prototype, name, {\n get: function() {\n return this.get(name);\n },\n set: function(value) {\n invariant(this.__ownerID, 'Cannot set on an immutable record.');\n this.set(name, value);\n }\n });\n }\n\n createClass(Set, SetCollection);\n\n // @pragma Construction\n\n function Set(value) {\n return value === null || value === undefined ? emptySet() :\n isSet(value) && !isOrdered(value) ? value :\n emptySet().withMutations(function(set ) {\n var iter = SetIterable(value);\n assertNotInfinite(iter.size);\n iter.forEach(function(v ) {return set.add(v)});\n });\n }\n\n Set.of = function(/*...values*/) {\n return this(arguments);\n };\n\n Set.fromKeys = function(value) {\n return this(KeyedIterable(value).keySeq());\n };\n\n Set.prototype.toString = function() {\n return this.__toString('Set {', '}');\n };\n\n // @pragma Access\n\n Set.prototype.has = function(value) {\n return this._map.has(value);\n };\n\n // @pragma Modification\n\n Set.prototype.add = function(value) {\n return updateSet(this, this._map.set(value, true));\n };\n\n Set.prototype.remove = function(value) {\n return updateSet(this, this._map.remove(value));\n };\n\n Set.prototype.clear = function() {\n return updateSet(this, this._map.clear());\n };\n\n // @pragma Composition\n\n Set.prototype.union = function() {var iters = SLICE$0.call(arguments, 0);\n iters = iters.filter(function(x ) {return x.size !== 0});\n if (iters.length === 0) {\n return this;\n }\n if (this.size === 0 && !this.__ownerID && iters.length === 1) {\n return this.constructor(iters[0]);\n }\n return this.withMutations(function(set ) {\n for (var ii = 0; ii < iters.length; ii++) {\n SetIterable(iters[ii]).forEach(function(value ) {return set.add(value)});\n }\n });\n };\n\n Set.prototype.intersect = function() {var iters = SLICE$0.call(arguments, 0);\n if (iters.length === 0) {\n return this;\n }\n iters = iters.map(function(iter ) {return SetIterable(iter)});\n var originalSet = this;\n return this.withMutations(function(set ) {\n originalSet.forEach(function(value ) {\n if (!iters.every(function(iter ) {return iter.includes(value)})) {\n set.remove(value);\n }\n });\n });\n };\n\n Set.prototype.subtract = function() {var iters = SLICE$0.call(arguments, 0);\n if (iters.length === 0) {\n return this;\n }\n iters = iters.map(function(iter ) {return SetIterable(iter)});\n var originalSet = this;\n return this.withMutations(function(set ) {\n originalSet.forEach(function(value ) {\n if (iters.some(function(iter ) {return iter.includes(value)})) {\n set.remove(value);\n }\n });\n });\n };\n\n Set.prototype.merge = function() {\n return this.union.apply(this, arguments);\n };\n\n Set.prototype.mergeWith = function(merger) {var iters = SLICE$0.call(arguments, 1);\n return this.union.apply(this, iters);\n };\n\n Set.prototype.sort = function(comparator) {\n // Late binding\n return OrderedSet(sortFactory(this, comparator));\n };\n\n Set.prototype.sortBy = function(mapper, comparator) {\n // Late binding\n return OrderedSet(sortFactory(this, comparator, mapper));\n };\n\n Set.prototype.wasAltered = function() {\n return this._map.wasAltered();\n };\n\n Set.prototype.__iterate = function(fn, reverse) {var this$0 = this;\n return this._map.__iterate(function(_, k) {return fn(k, k, this$0)}, reverse);\n };\n\n Set.prototype.__iterator = function(type, reverse) {\n return this._map.map(function(_, k) {return k}).__iterator(type, reverse);\n };\n\n Set.prototype.__ensureOwner = function(ownerID) {\n if (ownerID === this.__ownerID) {\n return this;\n }\n var newMap = this._map.__ensureOwner(ownerID);\n if (!ownerID) {\n this.__ownerID = ownerID;\n this._map = newMap;\n return this;\n }\n return this.__make(newMap, ownerID);\n };\n\n\n function isSet(maybeSet) {\n return !!(maybeSet && maybeSet[IS_SET_SENTINEL]);\n }\n\n Set.isSet = isSet;\n\n var IS_SET_SENTINEL = '@@__IMMUTABLE_SET__@@';\n\n var SetPrototype = Set.prototype;\n SetPrototype[IS_SET_SENTINEL] = true;\n SetPrototype[DELETE] = SetPrototype.remove;\n SetPrototype.mergeDeep = SetPrototype.merge;\n SetPrototype.mergeDeepWith = SetPrototype.mergeWith;\n SetPrototype.withMutations = MapPrototype.withMutations;\n SetPrototype.asMutable = MapPrototype.asMutable;\n SetPrototype.asImmutable = MapPrototype.asImmutable;\n\n SetPrototype.__empty = emptySet;\n SetPrototype.__make = makeSet;\n\n function updateSet(set, newMap) {\n if (set.__ownerID) {\n set.size = newMap.size;\n set._map = newMap;\n return set;\n }\n return newMap === set._map ? set :\n newMap.size === 0 ? set.__empty() :\n set.__make(newMap);\n }\n\n function makeSet(map, ownerID) {\n var set = Object.create(SetPrototype);\n set.size = map ? map.size : 0;\n set._map = map;\n set.__ownerID = ownerID;\n return set;\n }\n\n var EMPTY_SET;\n function emptySet() {\n return EMPTY_SET || (EMPTY_SET = makeSet(emptyMap()));\n }\n\n createClass(OrderedSet, Set);\n\n // @pragma Construction\n\n function OrderedSet(value) {\n return value === null || value === undefined ? emptyOrderedSet() :\n isOrderedSet(value) ? value :\n emptyOrderedSet().withMutations(function(set ) {\n var iter = SetIterable(value);\n assertNotInfinite(iter.size);\n iter.forEach(function(v ) {return set.add(v)});\n });\n }\n\n OrderedSet.of = function(/*...values*/) {\n return this(arguments);\n };\n\n OrderedSet.fromKeys = function(value) {\n return this(KeyedIterable(value).keySeq());\n };\n\n OrderedSet.prototype.toString = function() {\n return this.__toString('OrderedSet {', '}');\n };\n\n\n function isOrderedSet(maybeOrderedSet) {\n return isSet(maybeOrderedSet) && isOrdered(maybeOrderedSet);\n }\n\n OrderedSet.isOrderedSet = isOrderedSet;\n\n var OrderedSetPrototype = OrderedSet.prototype;\n OrderedSetPrototype[IS_ORDERED_SENTINEL] = true;\n\n OrderedSetPrototype.__empty = emptyOrderedSet;\n OrderedSetPrototype.__make = makeOrderedSet;\n\n function makeOrderedSet(map, ownerID) {\n var set = Object.create(OrderedSetPrototype);\n set.size = map ? map.size : 0;\n set._map = map;\n set.__ownerID = ownerID;\n return set;\n }\n\n var EMPTY_ORDERED_SET;\n function emptyOrderedSet() {\n return EMPTY_ORDERED_SET || (EMPTY_ORDERED_SET = makeOrderedSet(emptyOrderedMap()));\n }\n\n createClass(Stack, IndexedCollection);\n\n // @pragma Construction\n\n function Stack(value) {\n return value === null || value === undefined ? emptyStack() :\n isStack(value) ? value :\n emptyStack().unshiftAll(value);\n }\n\n Stack.of = function(/*...values*/) {\n return this(arguments);\n };\n\n Stack.prototype.toString = function() {\n return this.__toString('Stack [', ']');\n };\n\n // @pragma Access\n\n Stack.prototype.get = function(index, notSetValue) {\n var head = this._head;\n index = wrapIndex(this, index);\n while (head && index--) {\n head = head.next;\n }\n return head ? head.value : notSetValue;\n };\n\n Stack.prototype.peek = function() {\n return this._head && this._head.value;\n };\n\n // @pragma Modification\n\n Stack.prototype.push = function(/*...values*/) {\n if (arguments.length === 0) {\n return this;\n }\n var newSize = this.size + arguments.length;\n var head = this._head;\n for (var ii = arguments.length - 1; ii >= 0; ii--) {\n head = {\n value: arguments[ii],\n next: head\n };\n }\n if (this.__ownerID) {\n this.size = newSize;\n this._head = head;\n this.__hash = undefined;\n this.__altered = true;\n return this;\n }\n return makeStack(newSize, head);\n };\n\n Stack.prototype.pushAll = function(iter) {\n iter = IndexedIterable(iter);\n if (iter.size === 0) {\n return this;\n }\n assertNotInfinite(iter.size);\n var newSize = this.size;\n var head = this._head;\n iter.reverse().forEach(function(value ) {\n newSize++;\n head = {\n value: value,\n next: head\n };\n });\n if (this.__ownerID) {\n this.size = newSize;\n this._head = head;\n this.__hash = undefined;\n this.__altered = true;\n return this;\n }\n return makeStack(newSize, head);\n };\n\n Stack.prototype.pop = function() {\n return this.slice(1);\n };\n\n Stack.prototype.unshift = function(/*...values*/) {\n return this.push.apply(this, arguments);\n };\n\n Stack.prototype.unshiftAll = function(iter) {\n return this.pushAll(iter);\n };\n\n Stack.prototype.shift = function() {\n return this.pop.apply(this, arguments);\n };\n\n Stack.prototype.clear = function() {\n if (this.size === 0) {\n return this;\n }\n if (this.__ownerID) {\n this.size = 0;\n this._head = undefined;\n this.__hash = undefined;\n this.__altered = true;\n return this;\n }\n return emptyStack();\n };\n\n Stack.prototype.slice = function(begin, end) {\n if (wholeSlice(begin, end, this.size)) {\n return this;\n }\n var resolvedBegin = resolveBegin(begin, this.size);\n var resolvedEnd = resolveEnd(end, this.size);\n if (resolvedEnd !== this.size) {\n // super.slice(begin, end);\n return IndexedCollection.prototype.slice.call(this, begin, end);\n }\n var newSize = this.size - resolvedBegin;\n var head = this._head;\n while (resolvedBegin--) {\n head = head.next;\n }\n if (this.__ownerID) {\n this.size = newSize;\n this._head = head;\n this.__hash = undefined;\n this.__altered = true;\n return this;\n }\n return makeStack(newSize, head);\n };\n\n // @pragma Mutability\n\n Stack.prototype.__ensureOwner = function(ownerID) {\n if (ownerID === this.__ownerID) {\n return this;\n }\n if (!ownerID) {\n this.__ownerID = ownerID;\n this.__altered = false;\n return this;\n }\n return makeStack(this.size, this._head, ownerID, this.__hash);\n };\n\n // @pragma Iteration\n\n Stack.prototype.__iterate = function(fn, reverse) {\n if (reverse) {\n return this.reverse().__iterate(fn);\n }\n var iterations = 0;\n var node = this._head;\n while (node) {\n if (fn(node.value, iterations++, this) === false) {\n break;\n }\n node = node.next;\n }\n return iterations;\n };\n\n Stack.prototype.__iterator = function(type, reverse) {\n if (reverse) {\n return this.reverse().__iterator(type);\n }\n var iterations = 0;\n var node = this._head;\n return new Iterator(function() {\n if (node) {\n var value = node.value;\n node = node.next;\n return iteratorValue(type, iterations++, value);\n }\n return iteratorDone();\n });\n };\n\n\n function isStack(maybeStack) {\n return !!(maybeStack && maybeStack[IS_STACK_SENTINEL]);\n }\n\n Stack.isStack = isStack;\n\n var IS_STACK_SENTINEL = '@@__IMMUTABLE_STACK__@@';\n\n var StackPrototype = Stack.prototype;\n StackPrototype[IS_STACK_SENTINEL] = true;\n StackPrototype.withMutations = MapPrototype.withMutations;\n StackPrototype.asMutable = MapPrototype.asMutable;\n StackPrototype.asImmutable = MapPrototype.asImmutable;\n StackPrototype.wasAltered = MapPrototype.wasAltered;\n\n\n function makeStack(size, head, ownerID, hash) {\n var map = Object.create(StackPrototype);\n map.size = size;\n map._head = head;\n map.__ownerID = ownerID;\n map.__hash = hash;\n map.__altered = false;\n return map;\n }\n\n var EMPTY_STACK;\n function emptyStack() {\n return EMPTY_STACK || (EMPTY_STACK = makeStack(0));\n }\n\n /**\n * Contributes additional methods to a constructor\n */\n function mixin(ctor, methods) {\n var keyCopier = function(key ) { ctor.prototype[key] = methods[key]; };\n Object.keys(methods).forEach(keyCopier);\n Object.getOwnPropertySymbols &&\n Object.getOwnPropertySymbols(methods).forEach(keyCopier);\n return ctor;\n }\n\n Iterable.Iterator = Iterator;\n\n mixin(Iterable, {\n\n // ### Conversion to other types\n\n toArray: function() {\n assertNotInfinite(this.size);\n var array = new Array(this.size || 0);\n this.valueSeq().__iterate(function(v, i) { array[i] = v; });\n return array;\n },\n\n toIndexedSeq: function() {\n return new ToIndexedSequence(this);\n },\n\n toJS: function() {\n return this.toSeq().map(\n function(value ) {return value && typeof value.toJS === 'function' ? value.toJS() : value}\n ).__toJS();\n },\n\n toJSON: function() {\n return this.toSeq().map(\n function(value ) {return value && typeof value.toJSON === 'function' ? value.toJSON() : value}\n ).__toJS();\n },\n\n toKeyedSeq: function() {\n return new ToKeyedSequence(this, true);\n },\n\n toMap: function() {\n // Use Late Binding here to solve the circular dependency.\n return Map(this.toKeyedSeq());\n },\n\n toObject: function() {\n assertNotInfinite(this.size);\n var object = {};\n this.__iterate(function(v, k) { object[k] = v; });\n return object;\n },\n\n toOrderedMap: function() {\n // Use Late Binding here to solve the circular dependency.\n return OrderedMap(this.toKeyedSeq());\n },\n\n toOrderedSet: function() {\n // Use Late Binding here to solve the circular dependency.\n return OrderedSet(isKeyed(this) ? this.valueSeq() : this);\n },\n\n toSet: function() {\n // Use Late Binding here to solve the circular dependency.\n return Set(isKeyed(this) ? this.valueSeq() : this);\n },\n\n toSetSeq: function() {\n return new ToSetSequence(this);\n },\n\n toSeq: function() {\n return isIndexed(this) ? this.toIndexedSeq() :\n isKeyed(this) ? this.toKeyedSeq() :\n this.toSetSeq();\n },\n\n toStack: function() {\n // Use Late Binding here to solve the circular dependency.\n return Stack(isKeyed(this) ? this.valueSeq() : this);\n },\n\n toList: function() {\n // Use Late Binding here to solve the circular dependency.\n return List(isKeyed(this) ? this.valueSeq() : this);\n },\n\n\n // ### Common JavaScript methods and properties\n\n toString: function() {\n return '[Iterable]';\n },\n\n __toString: function(head, tail) {\n if (this.size === 0) {\n return head + tail;\n }\n return head + ' ' + this.toSeq().map(this.__toStringMapper).join(', ') + ' ' + tail;\n },\n\n\n // ### ES6 Collection methods (ES6 Array and Map)\n\n concat: function() {var values = SLICE$0.call(arguments, 0);\n return reify(this, concatFactory(this, values));\n },\n\n includes: function(searchValue) {\n return this.some(function(value ) {return is(value, searchValue)});\n },\n\n entries: function() {\n return this.__iterator(ITERATE_ENTRIES);\n },\n\n every: function(predicate, context) {\n assertNotInfinite(this.size);\n var returnValue = true;\n this.__iterate(function(v, k, c) {\n if (!predicate.call(context, v, k, c)) {\n returnValue = false;\n return false;\n }\n });\n return returnValue;\n },\n\n filter: function(predicate, context) {\n return reify(this, filterFactory(this, predicate, context, true));\n },\n\n find: function(predicate, context, notSetValue) {\n var entry = this.findEntry(predicate, context);\n return entry ? entry[1] : notSetValue;\n },\n\n forEach: function(sideEffect, context) {\n assertNotInfinite(this.size);\n return this.__iterate(context ? sideEffect.bind(context) : sideEffect);\n },\n\n join: function(separator) {\n assertNotInfinite(this.size);\n separator = separator !== undefined ? '' + separator : ',';\n var joined = '';\n var isFirst = true;\n this.__iterate(function(v ) {\n isFirst ? (isFirst = false) : (joined += separator);\n joined += v !== null && v !== undefined ? v.toString() : '';\n });\n return joined;\n },\n\n keys: function() {\n return this.__iterator(ITERATE_KEYS);\n },\n\n map: function(mapper, context) {\n return reify(this, mapFactory(this, mapper, context));\n },\n\n reduce: function(reducer, initialReduction, context) {\n assertNotInfinite(this.size);\n var reduction;\n var useFirst;\n if (arguments.length < 2) {\n useFirst = true;\n } else {\n reduction = initialReduction;\n }\n this.__iterate(function(v, k, c) {\n if (useFirst) {\n useFirst = false;\n reduction = v;\n } else {\n reduction = reducer.call(context, reduction, v, k, c);\n }\n });\n return reduction;\n },\n\n reduceRight: function(reducer, initialReduction, context) {\n var reversed = this.toKeyedSeq().reverse();\n return reversed.reduce.apply(reversed, arguments);\n },\n\n reverse: function() {\n return reify(this, reverseFactory(this, true));\n },\n\n slice: function(begin, end) {\n return reify(this, sliceFactory(this, begin, end, true));\n },\n\n some: function(predicate, context) {\n return !this.every(not(predicate), context);\n },\n\n sort: function(comparator) {\n return reify(this, sortFactory(this, comparator));\n },\n\n values: function() {\n return this.__iterator(ITERATE_VALUES);\n },\n\n\n // ### More sequential methods\n\n butLast: function() {\n return this.slice(0, -1);\n },\n\n isEmpty: function() {\n return this.size !== undefined ? this.size === 0 : !this.some(function() {return true});\n },\n\n count: function(predicate, context) {\n return ensureSize(\n predicate ? this.toSeq().filter(predicate, context) : this\n );\n },\n\n countBy: function(grouper, context) {\n return countByFactory(this, grouper, context);\n },\n\n equals: function(other) {\n return deepEqual(this, other);\n },\n\n entrySeq: function() {\n var iterable = this;\n if (iterable._cache) {\n // We cache as an entries array, so we can just return the cache!\n return new ArraySeq(iterable._cache);\n }\n var entriesSequence = iterable.toSeq().map(entryMapper).toIndexedSeq();\n entriesSequence.fromEntrySeq = function() {return iterable.toSeq()};\n return entriesSequence;\n },\n\n filterNot: function(predicate, context) {\n return this.filter(not(predicate), context);\n },\n\n findEntry: function(predicate, context, notSetValue) {\n var found = notSetValue;\n this.__iterate(function(v, k, c) {\n if (predicate.call(context, v, k, c)) {\n found = [k, v];\n return false;\n }\n });\n return found;\n },\n\n findKey: function(predicate, context) {\n var entry = this.findEntry(predicate, context);\n return entry && entry[0];\n },\n\n findLast: function(predicate, context, notSetValue) {\n return this.toKeyedSeq().reverse().find(predicate, context, notSetValue);\n },\n\n findLastEntry: function(predicate, context, notSetValue) {\n return this.toKeyedSeq().reverse().findEntry(predicate, context, notSetValue);\n },\n\n findLastKey: function(predicate, context) {\n return this.toKeyedSeq().reverse().findKey(predicate, context);\n },\n\n first: function() {\n return this.find(returnTrue);\n },\n\n flatMap: function(mapper, context) {\n return reify(this, flatMapFactory(this, mapper, context));\n },\n\n flatten: function(depth) {\n return reify(this, flattenFactory(this, depth, true));\n },\n\n fromEntrySeq: function() {\n return new FromEntriesSequence(this);\n },\n\n get: function(searchKey, notSetValue) {\n return this.find(function(_, key) {return is(key, searchKey)}, undefined, notSetValue);\n },\n\n getIn: function(searchKeyPath, notSetValue) {\n var nested = this;\n // Note: in an ES6 environment, we would prefer:\n // for (var key of searchKeyPath) {\n var iter = forceIterator(searchKeyPath);\n var step;\n while (!(step = iter.next()).done) {\n var key = step.value;\n nested = nested && nested.get ? nested.get(key, NOT_SET) : NOT_SET;\n if (nested === NOT_SET) {\n return notSetValue;\n }\n }\n return nested;\n },\n\n groupBy: function(grouper, context) {\n return groupByFactory(this, grouper, context);\n },\n\n has: function(searchKey) {\n return this.get(searchKey, NOT_SET) !== NOT_SET;\n },\n\n hasIn: function(searchKeyPath) {\n return this.getIn(searchKeyPath, NOT_SET) !== NOT_SET;\n },\n\n isSubset: function(iter) {\n iter = typeof iter.includes === 'function' ? iter : Iterable(iter);\n return this.every(function(value ) {return iter.includes(value)});\n },\n\n isSuperset: function(iter) {\n iter = typeof iter.isSubset === 'function' ? iter : Iterable(iter);\n return iter.isSubset(this);\n },\n\n keyOf: function(searchValue) {\n return this.findKey(function(value ) {return is(value, searchValue)});\n },\n\n keySeq: function() {\n return this.toSeq().map(keyMapper).toIndexedSeq();\n },\n\n last: function() {\n return this.toSeq().reverse().first();\n },\n\n lastKeyOf: function(searchValue) {\n return this.toKeyedSeq().reverse().keyOf(searchValue);\n },\n\n max: function(comparator) {\n return maxFactory(this, comparator);\n },\n\n maxBy: function(mapper, comparator) {\n return maxFactory(this, comparator, mapper);\n },\n\n min: function(comparator) {\n return maxFactory(this, comparator ? neg(comparator) : defaultNegComparator);\n },\n\n minBy: function(mapper, comparator) {\n return maxFactory(this, comparator ? neg(comparator) : defaultNegComparator, mapper);\n },\n\n rest: function() {\n return this.slice(1);\n },\n\n skip: function(amount) {\n return this.slice(Math.max(0, amount));\n },\n\n skipLast: function(amount) {\n return reify(this, this.toSeq().reverse().skip(amount).reverse());\n },\n\n skipWhile: function(predicate, context) {\n return reify(this, skipWhileFactory(this, predicate, context, true));\n },\n\n skipUntil: function(predicate, context) {\n return this.skipWhile(not(predicate), context);\n },\n\n sortBy: function(mapper, comparator) {\n return reify(this, sortFactory(this, comparator, mapper));\n },\n\n take: function(amount) {\n return this.slice(0, Math.max(0, amount));\n },\n\n takeLast: function(amount) {\n return reify(this, this.toSeq().reverse().take(amount).reverse());\n },\n\n takeWhile: function(predicate, context) {\n return reify(this, takeWhileFactory(this, predicate, context));\n },\n\n takeUntil: function(predicate, context) {\n return this.takeWhile(not(predicate), context);\n },\n\n valueSeq: function() {\n return this.toIndexedSeq();\n },\n\n\n // ### Hashable Object\n\n hashCode: function() {\n return this.__hash || (this.__hash = hashIterable(this));\n }\n\n\n // ### Internal\n\n // abstract __iterate(fn, reverse)\n\n // abstract __iterator(type, reverse)\n });\n\n // var IS_ITERABLE_SENTINEL = '@@__IMMUTABLE_ITERABLE__@@';\n // var IS_KEYED_SENTINEL = '@@__IMMUTABLE_KEYED__@@';\n // var IS_INDEXED_SENTINEL = '@@__IMMUTABLE_INDEXED__@@';\n // var IS_ORDERED_SENTINEL = '@@__IMMUTABLE_ORDERED__@@';\n\n var IterablePrototype = Iterable.prototype;\n IterablePrototype[IS_ITERABLE_SENTINEL] = true;\n IterablePrototype[ITERATOR_SYMBOL] = IterablePrototype.values;\n IterablePrototype.__toJS = IterablePrototype.toArray;\n IterablePrototype.__toStringMapper = quoteString;\n IterablePrototype.inspect =\n IterablePrototype.toSource = function() { return this.toString(); };\n IterablePrototype.chain = IterablePrototype.flatMap;\n IterablePrototype.contains = IterablePrototype.includes;\n\n mixin(KeyedIterable, {\n\n // ### More sequential methods\n\n flip: function() {\n return reify(this, flipFactory(this));\n },\n\n mapEntries: function(mapper, context) {var this$0 = this;\n var iterations = 0;\n return reify(this,\n this.toSeq().map(\n function(v, k) {return mapper.call(context, [k, v], iterations++, this$0)}\n ).fromEntrySeq()\n );\n },\n\n mapKeys: function(mapper, context) {var this$0 = this;\n return reify(this,\n this.toSeq().flip().map(\n function(k, v) {return mapper.call(context, k, v, this$0)}\n ).flip()\n );\n }\n\n });\n\n var KeyedIterablePrototype = KeyedIterable.prototype;\n KeyedIterablePrototype[IS_KEYED_SENTINEL] = true;\n KeyedIterablePrototype[ITERATOR_SYMBOL] = IterablePrototype.entries;\n KeyedIterablePrototype.__toJS = IterablePrototype.toObject;\n KeyedIterablePrototype.__toStringMapper = function(v, k) {return JSON.stringify(k) + ': ' + quoteString(v)};\n\n\n\n mixin(IndexedIterable, {\n\n // ### Conversion to other types\n\n toKeyedSeq: function() {\n return new ToKeyedSequence(this, false);\n },\n\n\n // ### ES6 Collection methods (ES6 Array and Map)\n\n filter: function(predicate, context) {\n return reify(this, filterFactory(this, predicate, context, false));\n },\n\n findIndex: function(predicate, context) {\n var entry = this.findEntry(predicate, context);\n return entry ? entry[0] : -1;\n },\n\n indexOf: function(searchValue) {\n var key = this.keyOf(searchValue);\n return key === undefined ? -1 : key;\n },\n\n lastIndexOf: function(searchValue) {\n var key = this.lastKeyOf(searchValue);\n return key === undefined ? -1 : key;\n },\n\n reverse: function() {\n return reify(this, reverseFactory(this, false));\n },\n\n slice: function(begin, end) {\n return reify(this, sliceFactory(this, begin, end, false));\n },\n\n splice: function(index, removeNum /*, ...values*/) {\n var numArgs = arguments.length;\n removeNum = Math.max(removeNum | 0, 0);\n if (numArgs === 0 || (numArgs === 2 && !removeNum)) {\n return this;\n }\n // If index is negative, it should resolve relative to the size of the\n // collection. However size may be expensive to compute if not cached, so\n // only call count() if the number is in fact negative.\n index = resolveBegin(index, index < 0 ? this.count() : this.size);\n var spliced = this.slice(0, index);\n return reify(\n this,\n numArgs === 1 ?\n spliced :\n spliced.concat(arrCopy(arguments, 2), this.slice(index + removeNum))\n );\n },\n\n\n // ### More collection methods\n\n findLastIndex: function(predicate, context) {\n var entry = this.findLastEntry(predicate, context);\n return entry ? entry[0] : -1;\n },\n\n first: function() {\n return this.get(0);\n },\n\n flatten: function(depth) {\n return reify(this, flattenFactory(this, depth, false));\n },\n\n get: function(index, notSetValue) {\n index = wrapIndex(this, index);\n return (index < 0 || (this.size === Infinity ||\n (this.size !== undefined && index > this.size))) ?\n notSetValue :\n this.find(function(_, key) {return key === index}, undefined, notSetValue);\n },\n\n has: function(index) {\n index = wrapIndex(this, index);\n return index >= 0 && (this.size !== undefined ?\n this.size === Infinity || index < this.size :\n this.indexOf(index) !== -1\n );\n },\n\n interpose: function(separator) {\n return reify(this, interposeFactory(this, separator));\n },\n\n interleave: function(/*...iterables*/) {\n var iterables = [this].concat(arrCopy(arguments));\n var zipped = zipWithFactory(this.toSeq(), IndexedSeq.of, iterables);\n var interleaved = zipped.flatten(true);\n if (zipped.size) {\n interleaved.size = zipped.size * iterables.length;\n }\n return reify(this, interleaved);\n },\n\n keySeq: function() {\n return Range(0, this.size);\n },\n\n last: function() {\n return this.get(-1);\n },\n\n skipWhile: function(predicate, context) {\n return reify(this, skipWhileFactory(this, predicate, context, false));\n },\n\n zip: function(/*, ...iterables */) {\n var iterables = [this].concat(arrCopy(arguments));\n return reify(this, zipWithFactory(this, defaultZipper, iterables));\n },\n\n zipWith: function(zipper/*, ...iterables */) {\n var iterables = arrCopy(arguments);\n iterables[0] = this;\n return reify(this, zipWithFactory(this, zipper, iterables));\n }\n\n });\n\n IndexedIterable.prototype[IS_INDEXED_SENTINEL] = true;\n IndexedIterable.prototype[IS_ORDERED_SENTINEL] = true;\n\n\n\n mixin(SetIterable, {\n\n // ### ES6 Collection methods (ES6 Array and Map)\n\n get: function(value, notSetValue) {\n return this.has(value) ? value : notSetValue;\n },\n\n includes: function(value) {\n return this.has(value);\n },\n\n\n // ### More sequential methods\n\n keySeq: function() {\n return this.valueSeq();\n }\n\n });\n\n SetIterable.prototype.has = IterablePrototype.includes;\n SetIterable.prototype.contains = SetIterable.prototype.includes;\n\n\n // Mixin subclasses\n\n mixin(KeyedSeq, KeyedIterable.prototype);\n mixin(IndexedSeq, IndexedIterable.prototype);\n mixin(SetSeq, SetIterable.prototype);\n\n mixin(KeyedCollection, KeyedIterable.prototype);\n mixin(IndexedCollection, IndexedIterable.prototype);\n mixin(SetCollection, SetIterable.prototype);\n\n\n // #pragma Helper functions\n\n function keyMapper(v, k) {\n return k;\n }\n\n function entryMapper(v, k) {\n return [k, v];\n }\n\n function not(predicate) {\n return function() {\n return !predicate.apply(this, arguments);\n }\n }\n\n function neg(predicate) {\n return function() {\n return -predicate.apply(this, arguments);\n }\n }\n\n function quoteString(value) {\n return typeof value === 'string' ? JSON.stringify(value) : String(value);\n }\n\n function defaultZipper() {\n return arrCopy(arguments);\n }\n\n function defaultNegComparator(a, b) {\n return a < b ? 1 : a > b ? -1 : 0;\n }\n\n function hashIterable(iterable) {\n if (iterable.size === Infinity) {\n return 0;\n }\n var ordered = isOrdered(iterable);\n var keyed = isKeyed(iterable);\n var h = ordered ? 1 : 0;\n var size = iterable.__iterate(\n keyed ?\n ordered ?\n function(v, k) { h = 31 * h + hashMerge(hash(v), hash(k)) | 0; } :\n function(v, k) { h = h + hashMerge(hash(v), hash(k)) | 0; } :\n ordered ?\n function(v ) { h = 31 * h + hash(v) | 0; } :\n function(v ) { h = h + hash(v) | 0; }\n );\n return murmurHashOfSize(size, h);\n }\n\n function murmurHashOfSize(size, h) {\n h = imul(h, 0xCC9E2D51);\n h = imul(h << 15 | h >>> -15, 0x1B873593);\n h = imul(h << 13 | h >>> -13, 5);\n h = (h + 0xE6546B64 | 0) ^ size;\n h = imul(h ^ h >>> 16, 0x85EBCA6B);\n h = imul(h ^ h >>> 13, 0xC2B2AE35);\n h = smi(h ^ h >>> 16);\n return h;\n }\n\n function hashMerge(a, b) {\n return a ^ b + 0x9E3779B9 + (a << 6) + (a >> 2) | 0; // int\n }\n\n var Immutable = {\n\n Iterable: Iterable,\n\n Seq: Seq,\n Collection: Collection,\n Map: Map,\n OrderedMap: OrderedMap,\n List: List,\n Stack: Stack,\n Set: Set,\n OrderedSet: OrderedSet,\n\n Record: Record,\n Range: Range,\n Repeat: Repeat,\n\n is: is,\n fromJS: fromJS\n\n };\n\n return Immutable;\n\n}));\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/immutable/dist/immutable.js\n// module id = 17\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/react/build/service-worker.js b/devtools/client/debugger/test/mochitest/examples/react/build/service-worker.js
new file mode 100644
index 0000000000..6eafd920eb
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/react/build/service-worker.js
@@ -0,0 +1 @@
+"use strict";var precacheConfig=[["/index.html","8e06e5d21664facfd9a8b643baeea2d8"],["/main.js","c5e8e6a9df7d7c5bddda7cfc3090060d"]],cacheName="sw-precache-v3-sw-precache-webpack-plugin-"+(self.registration?self.registration.scope:""),ignoreUrlParametersMatching=[/^utm_/],addDirectoryIndex=function(e,t){var n=new URL(e);return"/"===n.pathname.slice(-1)&&(n.pathname+=t),n.toString()},cleanResponse=function(t){return t.redirected?("body"in t?Promise.resolve(t.body):t.blob()).then(function(e){return new Response(e,{headers:t.headers,status:t.status,statusText:t.statusText})}):Promise.resolve(t)},createCacheKey=function(e,t,n,r){var a=new URL(e);return r&&a.pathname.match(r)||(a.search+=(a.search?"&":"")+encodeURIComponent(t)+"="+encodeURIComponent(n)),a.toString()},isPathWhitelisted=function(e,t){if(0===e.length)return!0;var n=new URL(t).pathname;return e.some(function(e){return n.match(e)})},stripIgnoredUrlParameters=function(e,n){var t=new URL(e);return t.hash="",t.search=t.search.slice(1).split("&").map(function(e){return e.split("=")}).filter(function(t){return n.every(function(e){return!e.test(t[0])})}).map(function(e){return e.join("=")}).join("&"),t.toString()},hashParamName="_sw-precache",urlsToCacheKeys=new Map(precacheConfig.map(function(e){var t=e[0],n=e[1],r=new URL(t,self.location),a=createCacheKey(r,hashParamName,n,/\.\w{8}\./);return[r.toString(),a]}));function setOfCachedUrls(e){return e.keys().then(function(e){return e.map(function(e){return e.url})}).then(function(e){return new Set(e)})}self.addEventListener("install",function(e){e.waitUntil(caches.open(cacheName).then(function(r){return setOfCachedUrls(r).then(function(n){return Promise.all(Array.from(urlsToCacheKeys.values()).map(function(t){if(!n.has(t)){var e=new Request(t,{credentials:"same-origin"});return fetch(e).then(function(e){if(!e.ok)throw new Error("Request for "+t+" returned a response with status "+e.status);return cleanResponse(e).then(function(e){return r.put(t,e)})})}}))})}).then(function(){return self.skipWaiting()}))}),self.addEventListener("activate",function(e){var n=new Set(urlsToCacheKeys.values());e.waitUntil(caches.open(cacheName).then(function(t){return t.keys().then(function(e){return Promise.all(e.map(function(e){if(!n.has(e.url))return t.delete(e)}))})}).then(function(){return self.clients.claim()}))}),self.addEventListener("fetch",function(t){if("GET"===t.request.method){var e,n=stripIgnoredUrlParameters(t.request.url,ignoreUrlParametersMatching),r="index.html";(e=urlsToCacheKeys.has(n))||(n=addDirectoryIndex(n,r),e=urlsToCacheKeys.has(n));var a="/index.html";!e&&"navigate"===t.request.mode&&isPathWhitelisted(["^(?!\\/__).*"],t.request.url)&&(n=new URL(a,self.location).toString(),e=urlsToCacheKeys.has(n)),e&&t.respondWith(caches.open(cacheName).then(function(e){return e.match(urlsToCacheKeys.get(n)).then(function(e){if(e)return e;throw Error("The cached response that was expected is missing.")})}).catch(function(e){return console.warn('Couldn\'t serve response for "%s" from cache: %O',t.request.url,e),fetch(t.request)}))}}); \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/react/config-overrides.js b/devtools/client/debugger/test/mochitest/examples/react/config-overrides.js
new file mode 100644
index 0000000000..4cd67ce673
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/react/config-overrides.js
@@ -0,0 +1,16 @@
+// config-overrides.js
+module.exports = {
+ webpack: function(config, env) {
+ if (env === "production") {
+ //JS Overrides
+ config.output.filename = '[name].js';
+ config.output.chunkFilename = '[name].chunk.js';
+ }
+
+ // remove minifier
+ const index = config.plugins.findIndex(o => o.options && o.options.compress)
+ config.plugins.splice(index,1)
+
+ return config;
+ }
+};
diff --git a/devtools/client/debugger/test/mochitest/examples/react/package.json b/devtools/client/debugger/test/mochitest/examples/react/package.json
new file mode 100644
index 0000000000..24ce69f54d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/react/package.json
@@ -0,0 +1,21 @@
+{
+ "name": "app",
+ "version": "0.1.0",
+ "private": true,
+ "dependencies": {
+ "immutable": "^3.8.2",
+ "react": "^16.5.1",
+ "react-dom": "^16.5.1",
+ "react-rewired": "^0.5.2",
+ "react-scripts": "1.1.5"
+ },
+ "scripts": {
+ "start": "react-app-rewired start",
+ "build": "react-app-rewired build;",
+ "test": "react-app-rewired test --env=jsdom",
+ "eject": "react-app-rewired eject"
+ },
+ "devDependencies": {
+ "react-app-rewired": "^1.6.2"
+ }
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/react/public/index.html b/devtools/client/debugger/test/mochitest/examples/react/public/index.html
new file mode 100644
index 0000000000..e692a31025
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/react/public/index.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
+ <meta name="theme-color" content="#000000">
+ <title>React App</title>
+ </head>
+ <body>
+ <noscript>
+ You need to enable JavaScript to run this app.
+ </noscript>
+ <div id="root"></div>
+ <!--
+ This HTML file is a template.
+ If you open it directly in the browser, you will see an empty page.
+
+ You can add webfonts, meta tags, or analytics to this file.
+ The build step will place the bundled scripts into the <body> tag.
+
+ To begin the development, run `npm start` or `yarn start`.
+ To create a production bundle, use `npm run build` or `yarn build`.
+ -->
+ </body>
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/react/src/App.js b/devtools/client/debugger/test/mochitest/examples/react/src/App.js
new file mode 100644
index 0000000000..a5607472cc
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/react/src/App.js
@@ -0,0 +1,25 @@
+import React, { Component } from 'react';
+import I from "immutable"
+
+class App extends Component {
+ componentDidMount() {
+ this.fields = new I.Map({a:2})
+ }
+
+ onClick = () => {
+ const f = this.fields
+ console.log(f)
+ }
+
+ render() {
+ return (
+ <div className="App">
+ <button onClick={this.onClick}>Click Me</button>
+ </div>
+ );
+ }
+}
+
+window.clickButton = () => document.querySelector("button").click()
+
+export default App;
diff --git a/devtools/client/debugger/test/mochitest/examples/react/src/index.js b/devtools/client/debugger/test/mochitest/examples/react/src/index.js
new file mode 100644
index 0000000000..b597a44232
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/react/src/index.js
@@ -0,0 +1,5 @@
+import React from 'react';
+import ReactDOM from 'react-dom';
+import App from './App';
+
+ReactDOM.render(<App />, document.getElementById('root'));
diff --git a/devtools/client/debugger/test/mochitest/examples/react/yarn.lock b/devtools/client/debugger/test/mochitest/examples/react/yarn.lock
new file mode 100644
index 0000000000..3f18ccc184
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/react/yarn.lock
@@ -0,0 +1,7090 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+abab@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e"
+
+abbrev@1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+
+accepts@~1.3.4, accepts@~1.3.5:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2"
+ dependencies:
+ mime-types "~2.1.18"
+ negotiator "0.6.1"
+
+acorn-dynamic-import@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4"
+ dependencies:
+ acorn "^4.0.3"
+
+acorn-globals@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf"
+ dependencies:
+ acorn "^4.0.4"
+
+acorn-jsx@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b"
+ dependencies:
+ acorn "^3.0.4"
+
+acorn@^3.0.4:
+ version "3.3.0"
+ resolved "http://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
+
+acorn@^4.0.3, acorn@^4.0.4:
+ version "4.0.13"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
+
+acorn@^5.0.0, acorn@^5.5.0:
+ version "5.7.3"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279"
+
+address@1.0.3, address@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/address/-/address-1.0.3.tgz#b5f50631f8d6cec8bd20c963963afb55e06cbce9"
+
+ajv-keywords@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762"
+
+ajv-keywords@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a"
+
+ajv@^5.0.0, ajv@^5.1.5, ajv@^5.2.0, ajv@^5.3.0:
+ version "5.5.2"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965"
+ dependencies:
+ co "^4.6.0"
+ fast-deep-equal "^1.0.0"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.3.0"
+
+ajv@^6.0.1:
+ version "6.5.3"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.3.tgz#71a569d189ecf4f4f321224fecb166f071dd90f9"
+ dependencies:
+ fast-deep-equal "^2.0.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+align-text@^0.1.1, align-text@^0.1.3:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
+ dependencies:
+ kind-of "^3.0.2"
+ longest "^1.0.1"
+ repeat-string "^1.5.2"
+
+alphanum-sort@^1.0.1, alphanum-sort@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
+
+ansi-align@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f"
+ dependencies:
+ string-width "^2.0.0"
+
+ansi-escapes@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
+
+ansi-escapes@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30"
+
+ansi-html@0.0.7:
+ version "0.0.7"
+ resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e"
+
+ansi-regex@^2.0.0, ansi-regex@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+
+ansi-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+
+ansi-styles@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+
+ansi-styles@^3.0.0, ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ dependencies:
+ color-convert "^1.9.0"
+
+anymatch@^1.3.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a"
+ dependencies:
+ micromatch "^2.1.5"
+ normalize-path "^2.0.0"
+
+anymatch@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
+ dependencies:
+ micromatch "^3.1.4"
+ normalize-path "^2.1.1"
+
+append-transform@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991"
+ dependencies:
+ default-require-extensions "^1.0.0"
+
+aproba@^1.0.3:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
+
+are-we-there-yet@~1.1.2:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
+ dependencies:
+ delegates "^1.0.0"
+ readable-stream "^2.0.6"
+
+argparse@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+ dependencies:
+ sprintf-js "~1.0.2"
+
+aria-query@^0.7.0:
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-0.7.1.tgz#26cbb5aff64144b0a825be1846e0b16cfa00b11e"
+ dependencies:
+ ast-types-flow "0.0.7"
+ commander "^2.11.0"
+
+arr-diff@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
+ dependencies:
+ arr-flatten "^1.0.1"
+
+arr-diff@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+
+arr-flatten@^1.0.1, arr-flatten@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+
+arr-union@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+
+array-equal@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93"
+
+array-filter@~0.0.0:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec"
+
+array-find-index@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
+
+array-flatten@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+
+array-flatten@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.1.tgz#426bb9da84090c1838d812c8150af20a8331e296"
+
+array-includes@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d"
+ dependencies:
+ define-properties "^1.1.2"
+ es-abstract "^1.7.0"
+
+array-map@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662"
+
+array-reduce@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b"
+
+array-union@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39"
+ dependencies:
+ array-uniq "^1.0.1"
+
+array-uniq@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6"
+
+array-unique@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
+
+array-unique@^0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+
+arrify@^1.0.0, arrify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
+
+asap@~2.0.3:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
+
+asn1.js@^4.0.0:
+ version "4.10.1"
+ resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"
+ dependencies:
+ bn.js "^4.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+asn1@~0.2.3:
+ version "0.2.4"
+ resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
+ dependencies:
+ safer-buffer "~2.1.0"
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+
+assert@^1.1.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91"
+ dependencies:
+ util "0.10.3"
+
+assign-symbols@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+
+ast-types-flow@0.0.7:
+ version "0.0.7"
+ resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad"
+
+async-each@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
+
+async@^1.5.2:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
+
+async@^2.1.2, async@^2.1.4, async@^2.4.1, async@^2.5.0:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610"
+ dependencies:
+ lodash "^4.17.10"
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+
+atob@^2.1.1:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
+
+autoprefixer@7.1.6:
+ version "7.1.6"
+ resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-7.1.6.tgz#fb933039f74af74a83e71225ce78d9fd58ba84d7"
+ dependencies:
+ browserslist "^2.5.1"
+ caniuse-lite "^1.0.30000748"
+ normalize-range "^0.1.2"
+ num2fraction "^1.2.2"
+ postcss "^6.0.13"
+ postcss-value-parser "^3.2.3"
+
+autoprefixer@^6.3.1:
+ version "6.7.7"
+ resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014"
+ dependencies:
+ browserslist "^1.7.6"
+ caniuse-db "^1.0.30000634"
+ normalize-range "^0.1.2"
+ num2fraction "^1.2.2"
+ postcss "^5.2.16"
+ postcss-value-parser "^3.2.3"
+
+aws-sign2@~0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
+
+aws4@^1.8.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f"
+
+axobject-query@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-0.1.0.tgz#62f59dbc59c9f9242759ca349960e7a2fe3c36c0"
+ dependencies:
+ ast-types-flow "0.0.7"
+
+babel-code-frame@6.26.0, babel-code-frame@^6.11.0, babel-code-frame@^6.22.0, babel-code-frame@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
+ dependencies:
+ chalk "^1.1.3"
+ esutils "^2.0.2"
+ js-tokens "^3.0.2"
+
+babel-core@6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8"
+ dependencies:
+ babel-code-frame "^6.26.0"
+ babel-generator "^6.26.0"
+ babel-helpers "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-register "^6.26.0"
+ babel-runtime "^6.26.0"
+ babel-template "^6.26.0"
+ babel-traverse "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+ convert-source-map "^1.5.0"
+ debug "^2.6.8"
+ json5 "^0.5.1"
+ lodash "^4.17.4"
+ minimatch "^3.0.4"
+ path-is-absolute "^1.0.1"
+ private "^0.1.7"
+ slash "^1.0.0"
+ source-map "^0.5.6"
+
+babel-core@^6.0.0, babel-core@^6.26.0:
+ version "6.26.3"
+ resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207"
+ dependencies:
+ babel-code-frame "^6.26.0"
+ babel-generator "^6.26.0"
+ babel-helpers "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-register "^6.26.0"
+ babel-runtime "^6.26.0"
+ babel-template "^6.26.0"
+ babel-traverse "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+ convert-source-map "^1.5.1"
+ debug "^2.6.9"
+ json5 "^0.5.1"
+ lodash "^4.17.4"
+ minimatch "^3.0.4"
+ path-is-absolute "^1.0.1"
+ private "^0.1.8"
+ slash "^1.0.0"
+ source-map "^0.5.7"
+
+babel-eslint@7.2.3:
+ version "7.2.3"
+ resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-7.2.3.tgz#b2fe2d80126470f5c19442dc757253a897710827"
+ dependencies:
+ babel-code-frame "^6.22.0"
+ babel-traverse "^6.23.1"
+ babel-types "^6.23.0"
+ babylon "^6.17.0"
+
+babel-generator@^6.18.0, babel-generator@^6.26.0:
+ version "6.26.1"
+ resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90"
+ dependencies:
+ babel-messages "^6.23.0"
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ detect-indent "^4.0.0"
+ jsesc "^1.3.0"
+ lodash "^4.17.4"
+ source-map "^0.5.7"
+ trim-right "^1.0.1"
+
+babel-helper-builder-binary-assignment-operator-visitor@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664"
+ dependencies:
+ babel-helper-explode-assignable-expression "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-builder-react-jsx@^6.24.1:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz#39ff8313b75c8b65dceff1f31d383e0ff2a408a0"
+ dependencies:
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ esutils "^2.0.2"
+
+babel-helper-call-delegate@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d"
+ dependencies:
+ babel-helper-hoist-variables "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-define-map@^6.24.1:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f"
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ lodash "^4.17.4"
+
+babel-helper-explode-assignable-expression@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-function-name@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9"
+ dependencies:
+ babel-helper-get-function-arity "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-get-function-arity@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-hoist-variables@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-optimise-call-expression@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-regex@^6.24.1:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72"
+ dependencies:
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ lodash "^4.17.4"
+
+babel-helper-remap-async-to-generator@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b"
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-replace-supers@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"
+ dependencies:
+ babel-helper-optimise-call-expression "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helpers@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-jest@20.0.3, babel-jest@^20.0.3:
+ version "20.0.3"
+ resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-20.0.3.tgz#e4a03b13dc10389e140fc645d09ffc4ced301671"
+ dependencies:
+ babel-core "^6.0.0"
+ babel-plugin-istanbul "^4.0.0"
+ babel-preset-jest "^20.0.3"
+
+babel-loader@7.1.2:
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.2.tgz#f6cbe122710f1aa2af4d881c6d5b54358ca24126"
+ dependencies:
+ find-cache-dir "^1.0.0"
+ loader-utils "^1.0.2"
+ mkdirp "^0.5.1"
+
+babel-messages@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-check-es2015-constants@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-dynamic-import-node@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-1.1.0.tgz#bd1d88ac7aaf98df4917c384373b04d971a2b37a"
+ dependencies:
+ babel-plugin-syntax-dynamic-import "^6.18.0"
+ babel-template "^6.26.0"
+ babel-types "^6.26.0"
+
+babel-plugin-istanbul@^4.0.0:
+ version "4.1.6"
+ resolved "http://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz#36c59b2192efce81c5b378321b74175add1c9a45"
+ dependencies:
+ babel-plugin-syntax-object-rest-spread "^6.13.0"
+ find-up "^2.1.0"
+ istanbul-lib-instrument "^1.10.1"
+ test-exclude "^4.2.1"
+
+babel-plugin-jest-hoist@^20.0.3:
+ version "20.0.3"
+ resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-20.0.3.tgz#afedc853bd3f8dc3548ea671fbe69d03cc2c1767"
+
+babel-plugin-syntax-async-functions@^6.8.0:
+ version "6.13.0"
+ resolved "http://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
+
+babel-plugin-syntax-class-properties@^6.8.0:
+ version "6.13.0"
+ resolved "http://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de"
+
+babel-plugin-syntax-dynamic-import@6.18.0, babel-plugin-syntax-dynamic-import@^6.18.0:
+ version "6.18.0"
+ resolved "http://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz#8d6a26229c83745a9982a441051572caa179b1da"
+
+babel-plugin-syntax-exponentiation-operator@^6.8.0:
+ version "6.13.0"
+ resolved "http://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de"
+
+babel-plugin-syntax-flow@^6.18.0:
+ version "6.18.0"
+ resolved "http://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d"
+
+babel-plugin-syntax-jsx@^6.3.13, babel-plugin-syntax-jsx@^6.8.0:
+ version "6.18.0"
+ resolved "http://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946"
+
+babel-plugin-syntax-object-rest-spread@^6.13.0, babel-plugin-syntax-object-rest-spread@^6.8.0:
+ version "6.13.0"
+ resolved "http://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
+
+babel-plugin-syntax-trailing-function-commas@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3"
+
+babel-plugin-transform-async-to-generator@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761"
+ dependencies:
+ babel-helper-remap-async-to-generator "^6.24.1"
+ babel-plugin-syntax-async-functions "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-class-properties@6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac"
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-plugin-syntax-class-properties "^6.8.0"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-arrow-functions@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoped-functions@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoping@^6.23.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f"
+ dependencies:
+ babel-runtime "^6.26.0"
+ babel-template "^6.26.0"
+ babel-traverse "^6.26.0"
+ babel-types "^6.26.0"
+ lodash "^4.17.4"
+
+babel-plugin-transform-es2015-classes@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db"
+ dependencies:
+ babel-helper-define-map "^6.24.1"
+ babel-helper-function-name "^6.24.1"
+ babel-helper-optimise-call-expression "^6.24.1"
+ babel-helper-replace-supers "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-computed-properties@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-destructuring@6.23.0, babel-plugin-transform-es2015-destructuring@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-duplicate-keys@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-for-of@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-function-name@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b"
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-literals@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154"
+ dependencies:
+ babel-plugin-transform-es2015-modules-commonjs "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1:
+ version "6.26.2"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3"
+ dependencies:
+ babel-plugin-transform-strict-mode "^6.24.1"
+ babel-runtime "^6.26.0"
+ babel-template "^6.26.0"
+ babel-types "^6.26.0"
+
+babel-plugin-transform-es2015-modules-systemjs@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23"
+ dependencies:
+ babel-helper-hoist-variables "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-umd@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468"
+ dependencies:
+ babel-plugin-transform-es2015-modules-amd "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-object-super@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d"
+ dependencies:
+ babel-helper-replace-supers "^6.24.1"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-parameters@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b"
+ dependencies:
+ babel-helper-call-delegate "^6.24.1"
+ babel-helper-get-function-arity "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-shorthand-properties@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-spread@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-sticky-regex@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc"
+ dependencies:
+ babel-helper-regex "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-template-literals@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-typeof-symbol@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-unicode-regex@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9"
+ dependencies:
+ babel-helper-regex "^6.24.1"
+ babel-runtime "^6.22.0"
+ regexpu-core "^2.0.0"
+
+babel-plugin-transform-exponentiation-operator@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e"
+ dependencies:
+ babel-helper-builder-binary-assignment-operator-visitor "^6.24.1"
+ babel-plugin-syntax-exponentiation-operator "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-flow-strip-types@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf"
+ dependencies:
+ babel-plugin-syntax-flow "^6.18.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-object-rest-spread@6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06"
+ dependencies:
+ babel-plugin-syntax-object-rest-spread "^6.8.0"
+ babel-runtime "^6.26.0"
+
+babel-plugin-transform-react-constant-elements@6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-constant-elements/-/babel-plugin-transform-react-constant-elements-6.23.0.tgz#2f119bf4d2cdd45eb9baaae574053c604f6147dd"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-react-display-name@^6.23.0:
+ version "6.25.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz#67e2bf1f1e9c93ab08db96792e05392bf2cc28d1"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-react-jsx-self@6.22.0, babel-plugin-transform-react-jsx-self@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz#df6d80a9da2612a121e6ddd7558bcbecf06e636e"
+ dependencies:
+ babel-plugin-syntax-jsx "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-react-jsx-source@6.22.0, babel-plugin-transform-react-jsx-source@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz#66ac12153f5cd2d17b3c19268f4bf0197f44ecd6"
+ dependencies:
+ babel-plugin-syntax-jsx "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-react-jsx@6.24.1, babel-plugin-transform-react-jsx@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3"
+ dependencies:
+ babel-helper-builder-react-jsx "^6.24.1"
+ babel-plugin-syntax-jsx "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-regenerator@6.26.0, babel-plugin-transform-regenerator@^6.22.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f"
+ dependencies:
+ regenerator-transform "^0.10.0"
+
+babel-plugin-transform-runtime@6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz#88490d446502ea9b8e7efb0fe09ec4d99479b1ee"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-strict-mode@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-preset-env@1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.1.tgz#a18b564cc9b9afdf4aae57ae3c1b0d99188e6f48"
+ dependencies:
+ babel-plugin-check-es2015-constants "^6.22.0"
+ babel-plugin-syntax-trailing-function-commas "^6.22.0"
+ babel-plugin-transform-async-to-generator "^6.22.0"
+ babel-plugin-transform-es2015-arrow-functions "^6.22.0"
+ babel-plugin-transform-es2015-block-scoped-functions "^6.22.0"
+ babel-plugin-transform-es2015-block-scoping "^6.23.0"
+ babel-plugin-transform-es2015-classes "^6.23.0"
+ babel-plugin-transform-es2015-computed-properties "^6.22.0"
+ babel-plugin-transform-es2015-destructuring "^6.23.0"
+ babel-plugin-transform-es2015-duplicate-keys "^6.22.0"
+ babel-plugin-transform-es2015-for-of "^6.23.0"
+ babel-plugin-transform-es2015-function-name "^6.22.0"
+ babel-plugin-transform-es2015-literals "^6.22.0"
+ babel-plugin-transform-es2015-modules-amd "^6.22.0"
+ babel-plugin-transform-es2015-modules-commonjs "^6.23.0"
+ babel-plugin-transform-es2015-modules-systemjs "^6.23.0"
+ babel-plugin-transform-es2015-modules-umd "^6.23.0"
+ babel-plugin-transform-es2015-object-super "^6.22.0"
+ babel-plugin-transform-es2015-parameters "^6.23.0"
+ babel-plugin-transform-es2015-shorthand-properties "^6.22.0"
+ babel-plugin-transform-es2015-spread "^6.22.0"
+ babel-plugin-transform-es2015-sticky-regex "^6.22.0"
+ babel-plugin-transform-es2015-template-literals "^6.22.0"
+ babel-plugin-transform-es2015-typeof-symbol "^6.23.0"
+ babel-plugin-transform-es2015-unicode-regex "^6.22.0"
+ babel-plugin-transform-exponentiation-operator "^6.22.0"
+ babel-plugin-transform-regenerator "^6.22.0"
+ browserslist "^2.1.2"
+ invariant "^2.2.2"
+ semver "^5.3.0"
+
+babel-preset-flow@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz#e71218887085ae9a24b5be4169affb599816c49d"
+ dependencies:
+ babel-plugin-transform-flow-strip-types "^6.22.0"
+
+babel-preset-jest@^20.0.3:
+ version "20.0.3"
+ resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-20.0.3.tgz#cbacaadecb5d689ca1e1de1360ebfc66862c178a"
+ dependencies:
+ babel-plugin-jest-hoist "^20.0.3"
+
+babel-preset-react-app@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/babel-preset-react-app/-/babel-preset-react-app-3.1.2.tgz#49ba3681b917c4e5c73a5249d3ef4c48fae064e2"
+ dependencies:
+ babel-plugin-dynamic-import-node "1.1.0"
+ babel-plugin-syntax-dynamic-import "6.18.0"
+ babel-plugin-transform-class-properties "6.24.1"
+ babel-plugin-transform-es2015-destructuring "6.23.0"
+ babel-plugin-transform-object-rest-spread "6.26.0"
+ babel-plugin-transform-react-constant-elements "6.23.0"
+ babel-plugin-transform-react-jsx "6.24.1"
+ babel-plugin-transform-react-jsx-self "6.22.0"
+ babel-plugin-transform-react-jsx-source "6.22.0"
+ babel-plugin-transform-regenerator "6.26.0"
+ babel-plugin-transform-runtime "6.23.0"
+ babel-preset-env "1.6.1"
+ babel-preset-react "6.24.1"
+
+babel-preset-react@6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz#ba69dfaea45fc3ec639b6a4ecea6e17702c91380"
+ dependencies:
+ babel-plugin-syntax-jsx "^6.3.13"
+ babel-plugin-transform-react-display-name "^6.23.0"
+ babel-plugin-transform-react-jsx "^6.24.1"
+ babel-plugin-transform-react-jsx-self "^6.22.0"
+ babel-plugin-transform-react-jsx-source "^6.22.0"
+ babel-preset-flow "^6.23.0"
+
+babel-register@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071"
+ dependencies:
+ babel-core "^6.26.0"
+ babel-runtime "^6.26.0"
+ core-js "^2.5.0"
+ home-or-tmp "^2.0.0"
+ lodash "^4.17.4"
+ mkdirp "^0.5.1"
+ source-map-support "^0.4.15"
+
+babel-runtime@6.26.0, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
+ dependencies:
+ core-js "^2.4.0"
+ regenerator-runtime "^0.11.0"
+
+babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
+ dependencies:
+ babel-runtime "^6.26.0"
+ babel-traverse "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+ lodash "^4.17.4"
+
+babel-traverse@^6.18.0, babel-traverse@^6.23.1, babel-traverse@^6.24.1, babel-traverse@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
+ dependencies:
+ babel-code-frame "^6.26.0"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+ debug "^2.6.8"
+ globals "^9.18.0"
+ invariant "^2.2.2"
+ lodash "^4.17.4"
+
+babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.23.0, babel-types@^6.24.1, babel-types@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
+ dependencies:
+ babel-runtime "^6.26.0"
+ esutils "^2.0.2"
+ lodash "^4.17.4"
+ to-fast-properties "^1.0.3"
+
+babylon@^6.17.0, babylon@^6.18.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
+
+balanced-match@^0.4.2:
+ version "0.4.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838"
+
+balanced-match@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+
+base64-js@^1.0.2:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3"
+
+base@^0.11.1:
+ version "0.11.2"
+ resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+ dependencies:
+ cache-base "^1.0.1"
+ class-utils "^0.3.5"
+ component-emitter "^1.2.1"
+ define-property "^1.0.0"
+ isobject "^3.0.1"
+ mixin-deep "^1.2.0"
+ pascalcase "^0.1.1"
+
+batch@0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16"
+
+bcrypt-pbkdf@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
+ dependencies:
+ tweetnacl "^0.14.3"
+
+big.js@^3.1.3:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
+
+binary-extensions@^1.0.0:
+ version "1.12.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14"
+
+bluebird@^3.4.7:
+ version "3.5.2"
+ resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.2.tgz#1be0908e054a751754549c270489c1505d4ab15a"
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
+ version "4.11.8"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
+
+body-parser@1.18.2:
+ version "1.18.2"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454"
+ dependencies:
+ bytes "3.0.0"
+ content-type "~1.0.4"
+ debug "2.6.9"
+ depd "~1.1.1"
+ http-errors "~1.6.2"
+ iconv-lite "0.4.19"
+ on-finished "~2.3.0"
+ qs "6.5.1"
+ raw-body "2.3.2"
+ type-is "~1.6.15"
+
+bonjour@^3.5.0:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5"
+ dependencies:
+ array-flatten "^2.1.0"
+ deep-equal "^1.0.1"
+ dns-equal "^1.0.0"
+ dns-txt "^2.0.2"
+ multicast-dns "^6.0.1"
+ multicast-dns-service-types "^1.1.0"
+
+boolbase@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+
+boxen@^1.2.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b"
+ dependencies:
+ ansi-align "^2.0.0"
+ camelcase "^4.0.0"
+ chalk "^2.0.1"
+ cli-boxes "^1.0.0"
+ string-width "^2.0.0"
+ term-size "^1.2.0"
+ widest-line "^2.0.0"
+
+brace-expansion@^1.0.0, brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+braces@^1.8.2:
+ version "1.8.5"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
+ dependencies:
+ expand-range "^1.8.1"
+ preserve "^0.2.0"
+ repeat-element "^1.1.2"
+
+braces@^2.3.0, braces@^2.3.1:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+ dependencies:
+ arr-flatten "^1.1.0"
+ array-unique "^0.3.2"
+ extend-shallow "^2.0.1"
+ fill-range "^4.0.0"
+ isobject "^3.0.1"
+ repeat-element "^1.1.2"
+ snapdragon "^0.8.1"
+ snapdragon-node "^2.0.1"
+ split-string "^3.0.2"
+ to-regex "^3.0.1"
+
+brorand@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+
+browser-resolve@^1.11.2:
+ version "1.11.3"
+ resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.3.tgz#9b7cbb3d0f510e4cb86bdbd796124d28b5890af6"
+ dependencies:
+ resolve "1.1.7"
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4:
+ version "1.2.0"
+ resolved "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
+ dependencies:
+ buffer-xor "^1.0.3"
+ cipher-base "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.3"
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+browserify-cipher@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
+ dependencies:
+ browserify-aes "^1.0.4"
+ browserify-des "^1.0.0"
+ evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c"
+ dependencies:
+ cipher-base "^1.0.1"
+ des.js "^1.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+browserify-rsa@^4.0.0:
+ version "4.0.1"
+ resolved "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
+ dependencies:
+ bn.js "^4.1.0"
+ randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
+ dependencies:
+ bn.js "^4.1.1"
+ browserify-rsa "^4.0.0"
+ create-hash "^1.1.0"
+ create-hmac "^1.1.2"
+ elliptic "^6.0.0"
+ inherits "^2.0.1"
+ parse-asn1 "^5.0.0"
+
+browserify-zlib@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
+ dependencies:
+ pako "~1.0.5"
+
+browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6:
+ version "1.7.7"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9"
+ dependencies:
+ caniuse-db "^1.0.30000639"
+ electron-to-chromium "^1.2.7"
+
+browserslist@^2.1.2, browserslist@^2.5.1:
+ version "2.11.3"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.11.3.tgz#fe36167aed1bbcde4827ebfe71347a2cc70b99b2"
+ dependencies:
+ caniuse-lite "^1.0.30000792"
+ electron-to-chromium "^1.3.30"
+
+bser@1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/bser/-/bser-1.0.2.tgz#381116970b2a6deea5646dd15dd7278444b56169"
+ dependencies:
+ node-int64 "^0.4.0"
+
+bser@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719"
+ dependencies:
+ node-int64 "^0.4.0"
+
+buffer-from@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
+
+buffer-indexof@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c"
+
+buffer-xor@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+
+buffer@^4.3.0:
+ version "4.9.1"
+ resolved "http://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298"
+ dependencies:
+ base64-js "^1.0.2"
+ ieee754 "^1.1.4"
+ isarray "^1.0.0"
+
+builtin-modules@^1.0.0, builtin-modules@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
+
+builtin-status-codes@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
+
+bytes@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
+
+cache-base@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+ dependencies:
+ collection-visit "^1.0.0"
+ component-emitter "^1.2.1"
+ get-value "^2.0.6"
+ has-value "^1.0.0"
+ isobject "^3.0.1"
+ set-value "^2.0.0"
+ to-object-path "^0.3.0"
+ union-value "^1.0.0"
+ unset-value "^1.0.0"
+
+caller-path@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f"
+ dependencies:
+ callsites "^0.2.0"
+
+callsites@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca"
+
+callsites@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
+
+camel-case@3.0.x:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73"
+ dependencies:
+ no-case "^2.2.0"
+ upper-case "^1.1.1"
+
+camelcase-keys@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7"
+ dependencies:
+ camelcase "^2.0.0"
+ map-obj "^1.0.0"
+
+camelcase@^1.0.2:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
+
+camelcase@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f"
+
+camelcase@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
+
+camelcase@^4.0.0, camelcase@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
+
+caniuse-api@^1.5.2:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c"
+ dependencies:
+ browserslist "^1.3.6"
+ caniuse-db "^1.0.30000529"
+ lodash.memoize "^4.1.2"
+ lodash.uniq "^4.5.0"
+
+caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639:
+ version "1.0.30000885"
+ resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000885.tgz#cdc98dd168ed59678650071f7f6a70910e275bc8"
+
+caniuse-lite@^1.0.30000748, caniuse-lite@^1.0.30000792:
+ version "1.0.30000885"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000885.tgz#e889e9f8e7e50e769f2a49634c932b8aee622984"
+
+capture-stack-trace@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d"
+
+case-sensitive-paths-webpack-plugin@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.1.1.tgz#3d29ced8c1f124bf6f53846fb3f5894731fdc909"
+
+caseless@~0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+
+center-align@^0.1.1:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
+ dependencies:
+ align-text "^0.1.3"
+ lazy-cache "^1.0.3"
+
+chalk@1.1.3, chalk@^1.1.3:
+ version "1.1.3"
+ resolved "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+ dependencies:
+ ansi-styles "^2.2.1"
+ escape-string-regexp "^1.0.2"
+ has-ansi "^2.0.0"
+ strip-ansi "^3.0.0"
+ supports-color "^2.0.0"
+
+chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e"
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chardet@^0.4.0:
+ version "0.4.2"
+ resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2"
+
+chokidar@^2.0.0, chokidar@^2.0.2:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26"
+ dependencies:
+ anymatch "^2.0.0"
+ async-each "^1.0.0"
+ braces "^2.3.0"
+ glob-parent "^3.1.0"
+ inherits "^2.0.1"
+ is-binary-path "^1.0.0"
+ is-glob "^4.0.0"
+ lodash.debounce "^4.0.8"
+ normalize-path "^2.1.1"
+ path-is-absolute "^1.0.0"
+ readdirp "^2.0.0"
+ upath "^1.0.5"
+ optionalDependencies:
+ fsevents "^1.2.2"
+
+chownr@^1.0.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494"
+
+ci-info@^1.5.0:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.5.1.tgz#17e8eb5de6f8b2b6038f0cbb714d410bfa9f3030"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+circular-json@^0.3.1:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66"
+
+clap@^1.0.9:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51"
+ dependencies:
+ chalk "^1.1.3"
+
+class-utils@^0.3.5:
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+ dependencies:
+ arr-union "^3.1.0"
+ define-property "^0.2.5"
+ isobject "^3.0.0"
+ static-extend "^0.1.1"
+
+clean-css@4.2.x:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.1.tgz#2d411ef76b8569b6d0c84068dabe85b0aa5e5c17"
+ dependencies:
+ source-map "~0.6.0"
+
+cli-boxes@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143"
+
+cli-cursor@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
+ dependencies:
+ restore-cursor "^2.0.0"
+
+cli-width@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639"
+
+cliui@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
+ dependencies:
+ center-align "^0.1.1"
+ right-align "^0.1.1"
+ wordwrap "0.0.2"
+
+cliui@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wrap-ansi "^2.0.0"
+
+clone@^1.0.2:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
+
+co@^4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+
+coa@~1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd"
+ dependencies:
+ q "^1.1.2"
+
+code-point-at@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+
+collection-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+ dependencies:
+ map-visit "^1.0.0"
+ object-visit "^1.0.0"
+
+color-convert@^1.3.0, color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ dependencies:
+ color-name "1.1.3"
+
+color-name@1.1.3, color-name@^1.0.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+
+color-string@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991"
+ dependencies:
+ color-name "^1.0.0"
+
+color@^0.11.0:
+ version "0.11.4"
+ resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764"
+ dependencies:
+ clone "^1.0.2"
+ color-convert "^1.3.0"
+ color-string "^0.3.0"
+
+colormin@^1.0.5:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133"
+ dependencies:
+ color "^0.11.0"
+ css-color-names "0.0.4"
+ has "^1.0.1"
+
+colors@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63"
+
+combined-stream@1.0.6, combined-stream@~1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818"
+ dependencies:
+ delayed-stream "~1.0.0"
+
+commander@2.17.x, commander@~2.17.1:
+ version "2.17.1"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf"
+
+commander@^2.11.0:
+ version "2.18.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.18.0.tgz#2bf063ddee7c7891176981a2cc798e5754bc6970"
+
+commondir@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
+
+component-emitter@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
+
+compressible@~2.0.14:
+ version "2.0.15"
+ resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.15.tgz#857a9ab0a7e5a07d8d837ed43fe2defff64fe212"
+ dependencies:
+ mime-db ">= 1.36.0 < 2"
+
+compression@^1.5.2:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz#27e0e176aaf260f7f2c2813c3e440adb9f1993db"
+ dependencies:
+ accepts "~1.3.5"
+ bytes "3.0.0"
+ compressible "~2.0.14"
+ debug "2.6.9"
+ on-headers "~1.0.1"
+ safe-buffer "5.1.2"
+ vary "~1.1.2"
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+
+concat-stream@^1.6.0:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
+ dependencies:
+ buffer-from "^1.0.0"
+ inherits "^2.0.3"
+ readable-stream "^2.2.2"
+ typedarray "^0.0.6"
+
+configstore@^3.0.0:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f"
+ dependencies:
+ dot-prop "^4.1.0"
+ graceful-fs "^4.1.2"
+ make-dir "^1.0.0"
+ unique-string "^1.0.0"
+ write-file-atomic "^2.0.0"
+ xdg-basedir "^3.0.0"
+
+connect-history-api-fallback@^1.3.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#b06873934bc5e344fef611a196a6faae0aee015a"
+
+console-browserify@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
+ dependencies:
+ date-now "^0.1.4"
+
+console-control-strings@^1.0.0, console-control-strings@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+
+constants-browserify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
+
+contains-path@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a"
+
+content-disposition@0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"
+
+content-type-parser@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.2.tgz#caabe80623e63638b2502fd4c7f12ff4ce2352e7"
+
+content-type@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
+
+convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20"
+ dependencies:
+ safe-buffer "~5.1.1"
+
+cookie-signature@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
+
+cookie@0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
+
+copy-descriptor@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+
+core-js@^2.4.0, core-js@^2.5.0:
+ version "2.5.7"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e"
+
+core-util-is@1.0.2, core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+
+cosmiconfig@^2.1.0, cosmiconfig@^2.1.1:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-2.2.2.tgz#6173cebd56fac042c1f4390edf7af6c07c7cb892"
+ dependencies:
+ is-directory "^0.3.1"
+ js-yaml "^3.4.3"
+ minimist "^1.2.0"
+ object-assign "^4.1.0"
+ os-homedir "^1.0.1"
+ parse-json "^2.2.0"
+ require-from-string "^1.1.0"
+
+create-ecdh@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff"
+ dependencies:
+ bn.js "^4.1.0"
+ elliptic "^6.0.0"
+
+create-error-class@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6"
+ dependencies:
+ capture-stack-trace "^1.0.0"
+
+create-hash@^1.1.0, create-hash@^1.1.2:
+ version "1.2.0"
+ resolved "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
+ dependencies:
+ cipher-base "^1.0.1"
+ inherits "^2.0.1"
+ md5.js "^1.3.4"
+ ripemd160 "^2.0.1"
+ sha.js "^2.4.0"
+
+create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
+ version "1.1.7"
+ resolved "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
+ dependencies:
+ cipher-base "^1.0.3"
+ create-hash "^1.1.0"
+ inherits "^2.0.1"
+ ripemd160 "^2.0.0"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+cross-spawn@5.1.0, cross-spawn@^5.0.1, cross-spawn@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
+ dependencies:
+ lru-cache "^4.0.1"
+ shebang-command "^1.2.0"
+ which "^1.2.9"
+
+crypto-browserify@^3.11.0:
+ version "3.12.0"
+ resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
+ dependencies:
+ browserify-cipher "^1.0.0"
+ browserify-sign "^4.0.0"
+ create-ecdh "^4.0.0"
+ create-hash "^1.1.0"
+ create-hmac "^1.1.0"
+ diffie-hellman "^5.0.0"
+ inherits "^2.0.1"
+ pbkdf2 "^3.0.3"
+ public-encrypt "^4.0.0"
+ randombytes "^2.0.0"
+ randomfill "^1.0.3"
+
+crypto-random-string@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e"
+
+css-color-names@0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
+
+css-loader@0.28.7:
+ version "0.28.7"
+ resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.7.tgz#5f2ee989dd32edd907717f953317656160999c1b"
+ dependencies:
+ babel-code-frame "^6.11.0"
+ css-selector-tokenizer "^0.7.0"
+ cssnano ">=2.6.1 <4"
+ icss-utils "^2.1.0"
+ loader-utils "^1.0.2"
+ lodash.camelcase "^4.3.0"
+ object-assign "^4.0.1"
+ postcss "^5.0.6"
+ postcss-modules-extract-imports "^1.0.0"
+ postcss-modules-local-by-default "^1.0.1"
+ postcss-modules-scope "^1.0.0"
+ postcss-modules-values "^1.1.0"
+ postcss-value-parser "^3.3.0"
+ source-list-map "^2.0.0"
+
+css-select@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858"
+ dependencies:
+ boolbase "~1.0.0"
+ css-what "2.1"
+ domutils "1.5.1"
+ nth-check "~1.0.1"
+
+css-selector-tokenizer@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz#e6988474ae8c953477bf5e7efecfceccd9cf4c86"
+ dependencies:
+ cssesc "^0.1.0"
+ fastparse "^1.1.1"
+ regexpu-core "^1.0.0"
+
+css-what@2.1:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd"
+
+cssesc@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4"
+
+"cssnano@>=2.6.1 <4":
+ version "3.10.0"
+ resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38"
+ dependencies:
+ autoprefixer "^6.3.1"
+ decamelize "^1.1.2"
+ defined "^1.0.0"
+ has "^1.0.1"
+ object-assign "^4.0.1"
+ postcss "^5.0.14"
+ postcss-calc "^5.2.0"
+ postcss-colormin "^2.1.8"
+ postcss-convert-values "^2.3.4"
+ postcss-discard-comments "^2.0.4"
+ postcss-discard-duplicates "^2.0.1"
+ postcss-discard-empty "^2.0.1"
+ postcss-discard-overridden "^0.1.1"
+ postcss-discard-unused "^2.2.1"
+ postcss-filter-plugins "^2.0.0"
+ postcss-merge-idents "^2.1.5"
+ postcss-merge-longhand "^2.0.1"
+ postcss-merge-rules "^2.0.3"
+ postcss-minify-font-values "^1.0.2"
+ postcss-minify-gradients "^1.0.1"
+ postcss-minify-params "^1.0.4"
+ postcss-minify-selectors "^2.0.4"
+ postcss-normalize-charset "^1.1.0"
+ postcss-normalize-url "^3.0.7"
+ postcss-ordered-values "^2.1.0"
+ postcss-reduce-idents "^2.2.2"
+ postcss-reduce-initial "^1.0.0"
+ postcss-reduce-transforms "^1.0.3"
+ postcss-svgo "^2.1.1"
+ postcss-unique-selectors "^2.0.2"
+ postcss-value-parser "^3.2.3"
+ postcss-zindex "^2.0.1"
+
+csso@~2.3.1:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85"
+ dependencies:
+ clap "^1.0.9"
+ source-map "^0.5.3"
+
+cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0":
+ version "0.3.4"
+ resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.4.tgz#8cd52e8a3acfd68d3aed38ee0a640177d2f9d797"
+
+"cssstyle@>= 0.2.37 < 0.3.0":
+ version "0.2.37"
+ resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54"
+ dependencies:
+ cssom "0.3.x"
+
+currently-unhandled@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea"
+ dependencies:
+ array-find-index "^1.0.1"
+
+d@1:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f"
+ dependencies:
+ es5-ext "^0.10.9"
+
+damerau-levenshtein@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz#03191c432cb6eea168bb77f3a55ffdccb8978514"
+
+dashdash@^1.12.0:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+ dependencies:
+ assert-plus "^1.0.0"
+
+date-now@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
+
+debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.6, debug@^2.6.8, debug@^2.6.9:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ dependencies:
+ ms "2.0.0"
+
+debug@=3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
+ dependencies:
+ ms "2.0.0"
+
+debug@^3.0.1, debug@^3.1.0:
+ version "3.2.5"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.5.tgz#c2418fbfd7a29f4d4f70ff4cea604d4b64c46407"
+ dependencies:
+ ms "^2.1.1"
+
+decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+
+decode-uri-component@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+
+deep-equal@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
+
+deep-extend@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
+
+deep-is@~0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
+
+default-require-extensions@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8"
+ dependencies:
+ strip-bom "^2.0.0"
+
+define-properties@^1.1.2:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
+ dependencies:
+ object-keys "^1.0.12"
+
+define-property@^0.2.5:
+ version "0.2.5"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+ dependencies:
+ is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+ dependencies:
+ is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+ dependencies:
+ is-descriptor "^1.0.2"
+ isobject "^3.0.1"
+
+defined@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
+
+del@^2.0.2, del@^2.2.2:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8"
+ dependencies:
+ globby "^5.0.0"
+ is-path-cwd "^1.0.0"
+ is-path-in-cwd "^1.0.0"
+ object-assign "^4.0.1"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+ rimraf "^2.2.8"
+
+del@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5"
+ dependencies:
+ globby "^6.1.0"
+ is-path-cwd "^1.0.0"
+ is-path-in-cwd "^1.0.0"
+ p-map "^1.1.1"
+ pify "^3.0.0"
+ rimraf "^2.2.8"
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+
+delegates@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+
+depd@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359"
+
+depd@~1.1.1, depd@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
+
+des.js@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
+ dependencies:
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+destroy@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+
+detect-indent@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
+ dependencies:
+ repeating "^2.0.0"
+
+detect-libc@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
+
+detect-node@^2.0.3:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c"
+
+detect-port-alt@1.1.6:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275"
+ dependencies:
+ address "^1.0.1"
+ debug "^2.6.0"
+
+diff@^3.2.0:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
+
+diffie-hellman@^5.0.0:
+ version "5.0.3"
+ resolved "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
+ dependencies:
+ bn.js "^4.1.0"
+ miller-rabin "^4.0.0"
+ randombytes "^2.0.0"
+
+dns-equal@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d"
+
+dns-packet@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a"
+ dependencies:
+ ip "^1.1.0"
+ safe-buffer "^5.0.1"
+
+dns-txt@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6"
+ dependencies:
+ buffer-indexof "^1.0.0"
+
+doctrine@1.5.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa"
+ dependencies:
+ esutils "^2.0.2"
+ isarray "^1.0.0"
+
+doctrine@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
+ dependencies:
+ esutils "^2.0.2"
+
+dom-converter@~0.1:
+ version "0.1.4"
+ resolved "http://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz#a45ef5727b890c9bffe6d7c876e7b19cb0e17f3b"
+ dependencies:
+ utila "~0.3"
+
+dom-serializer@0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"
+ dependencies:
+ domelementtype "~1.1.1"
+ entities "~1.1.1"
+
+dom-urls@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/dom-urls/-/dom-urls-1.1.0.tgz#001ddf81628cd1e706125c7176f53ccec55d918e"
+ dependencies:
+ urijs "^1.16.1"
+
+domain-browser@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
+
+domelementtype@1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2"
+
+domelementtype@~1.1.1:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b"
+
+domhandler@2.1:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.1.0.tgz#d2646f5e57f6c3bab11cf6cb05d3c0acf7412594"
+ dependencies:
+ domelementtype "1"
+
+domutils@1.1:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.1.6.tgz#bddc3de099b9a2efacc51c623f28f416ecc57485"
+ dependencies:
+ domelementtype "1"
+
+domutils@1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf"
+ dependencies:
+ dom-serializer "0"
+ domelementtype "1"
+
+dot-prop@^4.1.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57"
+ dependencies:
+ is-obj "^1.0.0"
+
+dotenv-expand@4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-4.2.0.tgz#def1f1ca5d6059d24a766e587942c21106ce1275"
+
+dotenv@4.0.0, dotenv@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-4.0.0.tgz#864ef1379aced55ce6f95debecdce179f7a0cd1d"
+
+duplexer3@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
+
+duplexer@^0.1.1:
+ version "0.1.1"
+ resolved "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1"
+
+ecc-jsbn@~0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
+ dependencies:
+ jsbn "~0.1.0"
+ safer-buffer "^2.1.0"
+
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+
+electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.30:
+ version "1.3.68"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.68.tgz#bb3ccbadcdd06de2afea8fb73e31a60b6558de1f"
+
+elliptic@^6.0.0:
+ version "6.4.1"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a"
+ dependencies:
+ bn.js "^4.4.0"
+ brorand "^1.0.1"
+ hash.js "^1.0.0"
+ hmac-drbg "^1.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.0"
+
+emoji-regex@^6.1.0:
+ version "6.5.1"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.5.1.tgz#9baea929b155565c11ea41c6626eaa65cef992c2"
+
+emojis-list@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
+
+encodeurl@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+
+enhanced-resolve@^3.4.0:
+ version "3.4.1"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e"
+ dependencies:
+ graceful-fs "^4.1.2"
+ memory-fs "^0.4.0"
+ object-assign "^4.0.1"
+ tapable "^0.2.7"
+
+entities@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0"
+
+errno@^0.1.3, errno@~0.1.7:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
+ dependencies:
+ prr "~1.0.1"
+
+error-ex@^1.2.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+ dependencies:
+ is-arrayish "^0.2.1"
+
+es-abstract@^1.7.0:
+ version "1.12.0"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165"
+ dependencies:
+ es-to-primitive "^1.1.1"
+ function-bind "^1.1.1"
+ has "^1.0.1"
+ is-callable "^1.1.3"
+ is-regex "^1.0.4"
+
+es-to-primitive@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d"
+ dependencies:
+ is-callable "^1.1.1"
+ is-date-object "^1.0.1"
+ is-symbol "^1.0.1"
+
+es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14:
+ version "0.10.46"
+ resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.46.tgz#efd99f67c5a7ec789baa3daa7f79870388f7f572"
+ dependencies:
+ es6-iterator "~2.0.3"
+ es6-symbol "~3.1.1"
+ next-tick "1"
+
+es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@~2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
+ dependencies:
+ d "1"
+ es5-ext "^0.10.35"
+ es6-symbol "^3.1.1"
+
+es6-map@^0.1.3:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0"
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+ es6-iterator "~2.0.1"
+ es6-set "~0.1.5"
+ es6-symbol "~3.1.1"
+ event-emitter "~0.3.5"
+
+es6-promise@^4.0.5:
+ version "4.2.5"
+ resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.5.tgz#da6d0d5692efb461e082c14817fe2427d8f5d054"
+
+es6-set@~0.1.5:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1"
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+ es6-iterator "~2.0.1"
+ es6-symbol "3.1.1"
+ event-emitter "~0.3.5"
+
+es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+
+es6-weak-map@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f"
+ dependencies:
+ d "1"
+ es5-ext "^0.10.14"
+ es6-iterator "^2.0.1"
+ es6-symbol "^3.1.1"
+
+escape-html@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+
+escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+
+escodegen@^1.6.1:
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589"
+ dependencies:
+ esprima "^3.1.3"
+ estraverse "^4.2.0"
+ esutils "^2.0.2"
+ optionator "^0.8.1"
+ optionalDependencies:
+ source-map "~0.6.1"
+
+escope@^3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3"
+ dependencies:
+ es6-map "^0.1.3"
+ es6-weak-map "^2.0.1"
+ esrecurse "^4.1.0"
+ estraverse "^4.1.1"
+
+eslint-config-react-app@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/eslint-config-react-app/-/eslint-config-react-app-2.1.0.tgz#23c909f71cbaff76b945b831d2d814b8bde169eb"
+
+eslint-import-resolver-node@^0.3.1:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz#58f15fb839b8d0576ca980413476aab2472db66a"
+ dependencies:
+ debug "^2.6.9"
+ resolve "^1.5.0"
+
+eslint-loader@1.9.0:
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-1.9.0.tgz#7e1be9feddca328d3dcfaef1ad49d5beffe83a13"
+ dependencies:
+ loader-fs-cache "^1.0.0"
+ loader-utils "^1.0.2"
+ object-assign "^4.0.1"
+ object-hash "^1.1.4"
+ rimraf "^2.6.1"
+
+eslint-module-utils@^2.1.1:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.2.0.tgz#b270362cd88b1a48ad308976ce7fa54e98411746"
+ dependencies:
+ debug "^2.6.8"
+ pkg-dir "^1.0.0"
+
+eslint-plugin-flowtype@2.39.1:
+ version "2.39.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.39.1.tgz#b5624622a0388bcd969f4351131232dcb9649cd5"
+ dependencies:
+ lodash "^4.15.0"
+
+eslint-plugin-import@2.8.0:
+ version "2.8.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.8.0.tgz#fa1b6ef31fcb3c501c09859c1b86f1fc5b986894"
+ dependencies:
+ builtin-modules "^1.1.1"
+ contains-path "^0.1.0"
+ debug "^2.6.8"
+ doctrine "1.5.0"
+ eslint-import-resolver-node "^0.3.1"
+ eslint-module-utils "^2.1.1"
+ has "^1.0.1"
+ lodash.cond "^4.3.0"
+ minimatch "^3.0.3"
+ read-pkg-up "^2.0.0"
+
+eslint-plugin-jsx-a11y@5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-5.1.1.tgz#5c96bb5186ca14e94db1095ff59b3e2bd94069b1"
+ dependencies:
+ aria-query "^0.7.0"
+ array-includes "^3.0.3"
+ ast-types-flow "0.0.7"
+ axobject-query "^0.1.0"
+ damerau-levenshtein "^1.0.0"
+ emoji-regex "^6.1.0"
+ jsx-ast-utils "^1.4.0"
+
+eslint-plugin-react@7.4.0:
+ version "7.4.0"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.4.0.tgz#300a95861b9729c087d362dd64abcc351a74364a"
+ dependencies:
+ doctrine "^2.0.0"
+ has "^1.0.1"
+ jsx-ast-utils "^2.0.0"
+ prop-types "^15.5.10"
+
+eslint-scope@^3.7.1:
+ version "3.7.3"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.3.tgz#bb507200d3d17f60247636160b4826284b108535"
+ dependencies:
+ esrecurse "^4.1.0"
+ estraverse "^4.1.1"
+
+eslint@4.10.0:
+ version "4.10.0"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.10.0.tgz#f25d0d7955c81968c2309aa5c9a229e045176bb7"
+ dependencies:
+ ajv "^5.2.0"
+ babel-code-frame "^6.22.0"
+ chalk "^2.1.0"
+ concat-stream "^1.6.0"
+ cross-spawn "^5.1.0"
+ debug "^3.0.1"
+ doctrine "^2.0.0"
+ eslint-scope "^3.7.1"
+ espree "^3.5.1"
+ esquery "^1.0.0"
+ estraverse "^4.2.0"
+ esutils "^2.0.2"
+ file-entry-cache "^2.0.0"
+ functional-red-black-tree "^1.0.1"
+ glob "^7.1.2"
+ globals "^9.17.0"
+ ignore "^3.3.3"
+ imurmurhash "^0.1.4"
+ inquirer "^3.0.6"
+ is-resolvable "^1.0.0"
+ js-yaml "^3.9.1"
+ json-stable-stringify "^1.0.1"
+ levn "^0.3.0"
+ lodash "^4.17.4"
+ minimatch "^3.0.2"
+ mkdirp "^0.5.1"
+ natural-compare "^1.4.0"
+ optionator "^0.8.2"
+ path-is-inside "^1.0.2"
+ pluralize "^7.0.0"
+ progress "^2.0.0"
+ require-uncached "^1.0.3"
+ semver "^5.3.0"
+ strip-ansi "^4.0.0"
+ strip-json-comments "~2.0.1"
+ table "^4.0.1"
+ text-table "~0.2.0"
+
+espree@^3.5.1:
+ version "3.5.4"
+ resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7"
+ dependencies:
+ acorn "^5.5.0"
+ acorn-jsx "^3.0.0"
+
+esprima@^2.6.0:
+ version "2.7.3"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581"
+
+esprima@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
+
+esprima@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+
+esquery@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708"
+ dependencies:
+ estraverse "^4.0.0"
+
+esrecurse@^4.1.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
+ dependencies:
+ estraverse "^4.1.0"
+
+estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
+
+esutils@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
+
+etag@~1.8.1:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+
+event-emitter@~0.3.5:
+ version "0.3.5"
+ resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+
+eventemitter3@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163"
+
+events@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
+
+eventsource@0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232"
+ dependencies:
+ original ">=0.0.5"
+
+evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+ dependencies:
+ md5.js "^1.3.4"
+ safe-buffer "^5.1.1"
+
+exec-sh@^0.2.0:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.2.tgz#2a5e7ffcbd7d0ba2755bdecb16e5a427dfbdec36"
+ dependencies:
+ merge "^1.2.0"
+
+execa@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
+ dependencies:
+ cross-spawn "^5.0.1"
+ get-stream "^3.0.0"
+ is-stream "^1.1.0"
+ npm-run-path "^2.0.0"
+ p-finally "^1.0.0"
+ signal-exit "^3.0.0"
+ strip-eof "^1.0.0"
+
+expand-brackets@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
+ dependencies:
+ is-posix-bracket "^0.1.0"
+
+expand-brackets@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+ dependencies:
+ debug "^2.3.3"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ posix-character-classes "^0.1.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+expand-range@^1.8.1:
+ version "1.8.2"
+ resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
+ dependencies:
+ fill-range "^2.1.0"
+
+expand-tilde@^2.0.0, expand-tilde@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502"
+ dependencies:
+ homedir-polyfill "^1.0.1"
+
+express@^4.16.2:
+ version "4.16.3"
+ resolved "http://registry.npmjs.org/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53"
+ dependencies:
+ accepts "~1.3.5"
+ array-flatten "1.1.1"
+ body-parser "1.18.2"
+ content-disposition "0.5.2"
+ content-type "~1.0.4"
+ cookie "0.3.1"
+ cookie-signature "1.0.6"
+ debug "2.6.9"
+ depd "~1.1.2"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ finalhandler "1.1.1"
+ fresh "0.5.2"
+ merge-descriptors "1.0.1"
+ methods "~1.1.2"
+ on-finished "~2.3.0"
+ parseurl "~1.3.2"
+ path-to-regexp "0.1.7"
+ proxy-addr "~2.0.3"
+ qs "6.5.1"
+ range-parser "~1.2.0"
+ safe-buffer "5.1.1"
+ send "0.16.2"
+ serve-static "1.13.2"
+ setprototypeof "1.1.0"
+ statuses "~1.4.0"
+ type-is "~1.6.16"
+ utils-merge "1.0.1"
+ vary "~1.1.2"
+
+extend-shallow@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+ dependencies:
+ is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+ dependencies:
+ assign-symbols "^1.0.0"
+ is-extendable "^1.0.1"
+
+extend@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
+
+external-editor@^2.0.4:
+ version "2.2.0"
+ resolved "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5"
+ dependencies:
+ chardet "^0.4.0"
+ iconv-lite "^0.4.17"
+ tmp "^0.0.33"
+
+extglob@^0.3.1:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
+ dependencies:
+ is-extglob "^1.0.0"
+
+extglob@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+ dependencies:
+ array-unique "^0.3.2"
+ define-property "^1.0.0"
+ expand-brackets "^2.1.4"
+ extend-shallow "^2.0.1"
+ fragment-cache "^0.2.1"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+extract-text-webpack-plugin@3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extract-text-webpack-plugin/-/extract-text-webpack-plugin-3.0.2.tgz#5f043eaa02f9750a9258b78c0a6e0dc1408fb2f7"
+ dependencies:
+ async "^2.4.1"
+ loader-utils "^1.1.0"
+ schema-utils "^0.3.0"
+ webpack-sources "^1.0.1"
+
+extsprintf@1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
+
+extsprintf@^1.2.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
+
+fast-deep-equal@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614"
+
+fast-deep-equal@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
+
+fast-levenshtein@~2.0.4:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+
+fastparse@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8"
+
+faye-websocket@^0.10.0:
+ version "0.10.0"
+ resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4"
+ dependencies:
+ websocket-driver ">=0.5.1"
+
+faye-websocket@~0.11.0:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38"
+ dependencies:
+ websocket-driver ">=0.5.1"
+
+fb-watchman@^1.8.0:
+ version "1.9.2"
+ resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-1.9.2.tgz#a24cf47827f82d38fb59a69ad70b76e3b6ae7383"
+ dependencies:
+ bser "1.0.2"
+
+fb-watchman@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58"
+ dependencies:
+ bser "^2.0.0"
+
+figures@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962"
+ dependencies:
+ escape-string-regexp "^1.0.5"
+
+file-entry-cache@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361"
+ dependencies:
+ flat-cache "^1.2.1"
+ object-assign "^4.0.1"
+
+file-loader@1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-1.1.5.tgz#91c25b6b6fbe56dae99f10a425fd64933b5c9daa"
+ dependencies:
+ loader-utils "^1.0.2"
+ schema-utils "^0.3.0"
+
+filename-regex@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
+
+fileset@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0"
+ dependencies:
+ glob "^7.0.3"
+ minimatch "^3.0.3"
+
+filesize@3.5.11:
+ version "3.5.11"
+ resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.5.11.tgz#1919326749433bb3cf77368bd158caabcc19e9ee"
+
+fill-range@^2.1.0:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565"
+ dependencies:
+ is-number "^2.1.0"
+ isobject "^2.0.0"
+ randomatic "^3.0.0"
+ repeat-element "^1.1.2"
+ repeat-string "^1.5.2"
+
+fill-range@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+ to-regex-range "^2.1.0"
+
+finalhandler@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105"
+ dependencies:
+ debug "2.6.9"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ on-finished "~2.3.0"
+ parseurl "~1.3.2"
+ statuses "~1.4.0"
+ unpipe "~1.0.0"
+
+find-cache-dir@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9"
+ dependencies:
+ commondir "^1.0.1"
+ mkdirp "^0.5.1"
+ pkg-dir "^1.0.0"
+
+find-cache-dir@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f"
+ dependencies:
+ commondir "^1.0.1"
+ make-dir "^1.0.0"
+ pkg-dir "^2.0.0"
+
+find-up@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
+ dependencies:
+ path-exists "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+find-up@^2.0.0, find-up@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+ dependencies:
+ locate-path "^2.0.0"
+
+flat-cache@^1.2.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481"
+ dependencies:
+ circular-json "^0.3.1"
+ del "^2.0.2"
+ graceful-fs "^4.1.2"
+ write "^0.2.1"
+
+flatten@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782"
+
+follow-redirects@^1.0.0:
+ version "1.5.8"
+ resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.8.tgz#1dbfe13e45ad969f813e86c00e5296f525c885a1"
+ dependencies:
+ debug "=3.1.0"
+
+for-in@^1.0.1, for-in@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+
+for-own@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
+ dependencies:
+ for-in "^1.0.1"
+
+forever-agent@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+
+form-data@~2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099"
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "1.0.6"
+ mime-types "^2.1.12"
+
+forwarded@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
+
+fragment-cache@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+ dependencies:
+ map-cache "^0.2.2"
+
+fresh@0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+
+fs-extra@3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291"
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^3.0.0"
+ universalify "^0.1.0"
+
+fs-extra@^0.30.0:
+ version "0.30.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0"
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^2.1.0"
+ klaw "^1.0.0"
+ path-is-absolute "^1.0.0"
+ rimraf "^2.2.8"
+
+fs-minipass@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d"
+ dependencies:
+ minipass "^2.2.1"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+
+fsevents@^1.1.3, fsevents@^1.2.2:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426"
+ dependencies:
+ nan "^2.9.2"
+ node-pre-gyp "^0.10.0"
+
+function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+
+functional-red-black-tree@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
+
+gauge@~2.7.3:
+ version "2.7.4"
+ resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
+ dependencies:
+ aproba "^1.0.3"
+ console-control-strings "^1.0.0"
+ has-unicode "^2.0.0"
+ object-assign "^4.1.0"
+ signal-exit "^3.0.0"
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wide-align "^1.1.0"
+
+get-caller-file@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
+
+get-stdin@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
+
+get-stream@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+
+get-value@^2.0.3, get-value@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+
+getpass@^0.1.1:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+ dependencies:
+ assert-plus "^1.0.0"
+
+glob-base@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
+ dependencies:
+ glob-parent "^2.0.0"
+ is-glob "^2.0.0"
+
+glob-parent@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
+ dependencies:
+ is-glob "^2.0.0"
+
+glob-parent@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
+ dependencies:
+ is-glob "^3.1.0"
+ path-dirname "^1.0.0"
+
+glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2:
+ version "7.1.3"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1"
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+global-dirs@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445"
+ dependencies:
+ ini "^1.3.4"
+
+global-modules@1.0.0, global-modules@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea"
+ dependencies:
+ global-prefix "^1.0.1"
+ is-windows "^1.0.1"
+ resolve-dir "^1.0.0"
+
+global-prefix@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe"
+ dependencies:
+ expand-tilde "^2.0.2"
+ homedir-polyfill "^1.0.1"
+ ini "^1.3.4"
+ is-windows "^1.0.1"
+ which "^1.2.14"
+
+globals@^9.17.0, globals@^9.18.0:
+ version "9.18.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
+
+globby@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d"
+ dependencies:
+ array-union "^1.0.1"
+ arrify "^1.0.0"
+ glob "^7.0.3"
+ object-assign "^4.0.1"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+globby@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c"
+ dependencies:
+ array-union "^1.0.1"
+ glob "^7.0.3"
+ object-assign "^4.0.1"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+got@^6.7.1:
+ version "6.7.1"
+ resolved "http://registry.npmjs.org/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0"
+ dependencies:
+ create-error-class "^3.0.0"
+ duplexer3 "^0.1.4"
+ get-stream "^3.0.0"
+ is-redirect "^1.0.0"
+ is-retry-allowed "^1.0.0"
+ is-stream "^1.0.0"
+ lowercase-keys "^1.0.0"
+ safe-buffer "^5.0.1"
+ timed-out "^4.0.0"
+ unzip-response "^2.0.1"
+ url-parse-lax "^1.0.0"
+
+graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
+ version "4.1.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
+
+growly@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
+
+gzip-size@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-3.0.0.tgz#546188e9bdc337f673772f81660464b389dce520"
+ dependencies:
+ duplexer "^0.1.1"
+
+handle-thing@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4"
+
+handlebars@^4.0.3:
+ version "4.0.12"
+ resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5"
+ dependencies:
+ async "^2.5.0"
+ optimist "^0.6.1"
+ source-map "^0.6.1"
+ optionalDependencies:
+ uglify-js "^3.1.4"
+
+har-schema@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
+
+har-validator@~5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.0.tgz#44657f5688a22cfd4b72486e81b3a3fb11742c29"
+ dependencies:
+ ajv "^5.3.0"
+ har-schema "^2.0.0"
+
+has-ansi@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+ dependencies:
+ ansi-regex "^2.0.0"
+
+has-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
+
+has-flag@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51"
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+
+has-unicode@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+
+has-value@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+ dependencies:
+ get-value "^2.0.3"
+ has-values "^0.1.4"
+ isobject "^2.0.0"
+
+has-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+ dependencies:
+ get-value "^2.0.6"
+ has-values "^1.0.0"
+ isobject "^3.0.0"
+
+has-values@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+
+has-values@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+ dependencies:
+ is-number "^3.0.0"
+ kind-of "^4.0.0"
+
+has@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ dependencies:
+ function-bind "^1.1.1"
+
+hash-base@^3.0.0:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+hash.js@^1.0.0, hash.js@^1.0.3:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.5.tgz#e38ab4b85dfb1e0c40fe9265c0e9b54854c23812"
+ dependencies:
+ inherits "^2.0.3"
+ minimalistic-assert "^1.0.1"
+
+he@1.1.x:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd"
+
+hmac-drbg@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+ dependencies:
+ hash.js "^1.0.3"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.1"
+
+home-or-tmp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.1"
+
+homedir-polyfill@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc"
+ dependencies:
+ parse-passwd "^1.0.0"
+
+hosted-git-info@^2.1.4:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047"
+
+hpack.js@^2.1.6:
+ version "2.1.6"
+ resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2"
+ dependencies:
+ inherits "^2.0.1"
+ obuf "^1.0.0"
+ readable-stream "^2.0.1"
+ wbuf "^1.1.0"
+
+html-comment-regex@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e"
+
+html-encoding-sniffer@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8"
+ dependencies:
+ whatwg-encoding "^1.0.1"
+
+html-entities@^1.2.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f"
+
+html-minifier@^3.2.3:
+ version "3.5.20"
+ resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.20.tgz#7b19fd3caa0cb79f7cde5ee5c3abdf8ecaa6bb14"
+ dependencies:
+ camel-case "3.0.x"
+ clean-css "4.2.x"
+ commander "2.17.x"
+ he "1.1.x"
+ param-case "2.1.x"
+ relateurl "0.2.x"
+ uglify-js "3.4.x"
+
+html-webpack-plugin@2.29.0:
+ version "2.29.0"
+ resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-2.29.0.tgz#e987f421853d3b6938c8c4c8171842e5fd17af23"
+ dependencies:
+ bluebird "^3.4.7"
+ html-minifier "^3.2.3"
+ loader-utils "^0.2.16"
+ lodash "^4.17.3"
+ pretty-error "^2.0.2"
+ toposort "^1.0.0"
+
+htmlparser2@~3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.3.0.tgz#cc70d05a59f6542e43f0e685c982e14c924a9efe"
+ dependencies:
+ domelementtype "1"
+ domhandler "2.1"
+ domutils "1.1"
+ readable-stream "1.0"
+
+http-deceiver@^1.2.7:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87"
+
+http-errors@1.6.2:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736"
+ dependencies:
+ depd "1.1.1"
+ inherits "2.0.3"
+ setprototypeof "1.0.3"
+ statuses ">= 1.3.1 < 2"
+
+http-errors@~1.6.2:
+ version "1.6.3"
+ resolved "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d"
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.3"
+ setprototypeof "1.1.0"
+ statuses ">= 1.4.0 < 2"
+
+http-parser-js@>=0.4.0:
+ version "0.4.13"
+ resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.13.tgz#3bd6d6fde6e3172c9334c3b33b6c193d80fe1137"
+
+http-proxy-middleware@~0.17.4:
+ version "0.17.4"
+ resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz#642e8848851d66f09d4f124912846dbaeb41b833"
+ dependencies:
+ http-proxy "^1.16.2"
+ is-glob "^3.1.0"
+ lodash "^4.17.2"
+ micromatch "^2.3.11"
+
+http-proxy@^1.16.2:
+ version "1.17.0"
+ resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz#7ad38494658f84605e2f6db4436df410f4e5be9a"
+ dependencies:
+ eventemitter3 "^3.0.0"
+ follow-redirects "^1.0.0"
+ requires-port "^1.0.0"
+
+http-signature@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
+ dependencies:
+ assert-plus "^1.0.0"
+ jsprim "^1.2.2"
+ sshpk "^1.7.0"
+
+https-browserify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
+
+iconv-lite@0.4.19:
+ version "0.4.19"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b"
+
+iconv-lite@0.4.23:
+ version "0.4.23"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63"
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+iconv-lite@^0.4.17, iconv-lite@^0.4.4:
+ version "0.4.24"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+icss-replace-symbols@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded"
+
+icss-utils@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962"
+ dependencies:
+ postcss "^6.0.1"
+
+ieee754@^1.1.4:
+ version "1.1.12"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b"
+
+ignore-walk@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8"
+ dependencies:
+ minimatch "^3.0.4"
+
+ignore@^3.3.3:
+ version "3.3.10"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043"
+
+immutable@^3.8.2:
+ version "3.8.2"
+ resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3"
+
+import-lazy@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43"
+
+import-local@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc"
+ dependencies:
+ pkg-dir "^2.0.0"
+ resolve-cwd "^2.0.0"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+
+indent-string@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80"
+ dependencies:
+ repeating "^2.0.0"
+
+indexes-of@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
+
+indexof@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+
+inherits@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
+
+ini@^1.3.4, ini@~1.3.0:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
+
+inquirer@3.3.0, inquirer@^3.0.6:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9"
+ dependencies:
+ ansi-escapes "^3.0.0"
+ chalk "^2.0.0"
+ cli-cursor "^2.1.0"
+ cli-width "^2.0.0"
+ external-editor "^2.0.4"
+ figures "^2.0.0"
+ lodash "^4.3.0"
+ mute-stream "0.0.7"
+ run-async "^2.2.0"
+ rx-lite "^4.0.8"
+ rx-lite-aggregates "^4.0.8"
+ string-width "^2.1.0"
+ strip-ansi "^4.0.0"
+ through "^2.3.6"
+
+internal-ip@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-1.2.0.tgz#ae9fbf93b984878785d50a8de1b356956058cf5c"
+ dependencies:
+ meow "^3.3.0"
+
+interpret@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614"
+
+invariant@^2.2.2:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
+ dependencies:
+ loose-envify "^1.0.0"
+
+invert-kv@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
+
+ip@^1.1.0, ip@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a"
+
+ipaddr.js@1.8.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e"
+
+is-absolute-url@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"
+
+is-accessor-descriptor@^0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-accessor-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
+ dependencies:
+ kind-of "^6.0.0"
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+
+is-binary-path@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+ dependencies:
+ binary-extensions "^1.0.0"
+
+is-buffer@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+
+is-builtin-module@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
+ dependencies:
+ builtin-modules "^1.0.0"
+
+is-callable@^1.1.1, is-callable@^1.1.3:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75"
+
+is-ci@^1.0.10:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c"
+ dependencies:
+ ci-info "^1.5.0"
+
+is-data-descriptor@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-data-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
+ dependencies:
+ kind-of "^6.0.0"
+
+is-date-object@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
+
+is-descriptor@^0.1.0:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
+ dependencies:
+ is-accessor-descriptor "^0.1.6"
+ is-data-descriptor "^0.1.4"
+ kind-of "^5.0.0"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
+ dependencies:
+ is-accessor-descriptor "^1.0.0"
+ is-data-descriptor "^1.0.0"
+ kind-of "^6.0.2"
+
+is-directory@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
+
+is-dotfile@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
+
+is-equal-shallow@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
+ dependencies:
+ is-primitive "^2.0.0"
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+
+is-extendable@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+ dependencies:
+ is-plain-object "^2.0.4"
+
+is-extglob@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
+
+is-extglob@^2.1.0, is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+
+is-finite@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+
+is-glob@^2.0.0, is-glob@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
+ dependencies:
+ is-extglob "^1.0.0"
+
+is-glob@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
+ dependencies:
+ is-extglob "^2.1.0"
+
+is-glob@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0"
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-installed-globally@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80"
+ dependencies:
+ global-dirs "^0.1.0"
+ is-path-inside "^1.0.0"
+
+is-npm@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4"
+
+is-number@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-number@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-number@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff"
+
+is-obj@^1.0.0:
+ version "1.0.1"
+ resolved "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
+
+is-path-cwd@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d"
+
+is-path-in-cwd@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52"
+ dependencies:
+ is-path-inside "^1.0.0"
+
+is-path-inside@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036"
+ dependencies:
+ path-is-inside "^1.0.1"
+
+is-plain-obj@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
+
+is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+ dependencies:
+ isobject "^3.0.1"
+
+is-posix-bracket@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
+
+is-primitive@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
+
+is-promise@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
+
+is-redirect@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24"
+
+is-regex@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
+ dependencies:
+ has "^1.0.1"
+
+is-resolvable@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
+
+is-retry-allowed@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34"
+
+is-root@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-root/-/is-root-1.0.0.tgz#07b6c233bc394cd9d02ba15c966bd6660d6342d5"
+
+is-stream@^1.0.0, is-stream@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+
+is-svg@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9"
+ dependencies:
+ html-comment-regex "^1.1.0"
+
+is-symbol@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572"
+
+is-typedarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+
+is-utf8@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
+
+is-windows@^1.0.1, is-windows@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+
+is-wsl@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d"
+
+isarray@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+
+isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+
+isobject@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+ dependencies:
+ isarray "1.0.0"
+
+isobject@^3.0.0, isobject@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+
+isstream@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+
+istanbul-api@^1.1.1:
+ version "1.3.7"
+ resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.7.tgz#a86c770d2b03e11e3f778cd7aedd82d2722092aa"
+ dependencies:
+ async "^2.1.4"
+ fileset "^2.0.2"
+ istanbul-lib-coverage "^1.2.1"
+ istanbul-lib-hook "^1.2.2"
+ istanbul-lib-instrument "^1.10.2"
+ istanbul-lib-report "^1.1.5"
+ istanbul-lib-source-maps "^1.2.6"
+ istanbul-reports "^1.5.1"
+ js-yaml "^3.7.0"
+ mkdirp "^0.5.1"
+ once "^1.4.0"
+
+istanbul-lib-coverage@^1.0.1, istanbul-lib-coverage@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz#ccf7edcd0a0bb9b8f729feeb0930470f9af664f0"
+
+istanbul-lib-hook@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz#bc6bf07f12a641fbf1c85391d0daa8f0aea6bf86"
+ dependencies:
+ append-transform "^0.4.0"
+
+istanbul-lib-instrument@^1.10.1, istanbul-lib-instrument@^1.10.2, istanbul-lib-instrument@^1.4.2:
+ version "1.10.2"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz#1f55ed10ac3c47f2bdddd5307935126754d0a9ca"
+ dependencies:
+ babel-generator "^6.18.0"
+ babel-template "^6.16.0"
+ babel-traverse "^6.18.0"
+ babel-types "^6.18.0"
+ babylon "^6.18.0"
+ istanbul-lib-coverage "^1.2.1"
+ semver "^5.3.0"
+
+istanbul-lib-report@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz#f2a657fc6282f96170aaf281eb30a458f7f4170c"
+ dependencies:
+ istanbul-lib-coverage "^1.2.1"
+ mkdirp "^0.5.1"
+ path-parse "^1.0.5"
+ supports-color "^3.1.2"
+
+istanbul-lib-source-maps@^1.1.0, istanbul-lib-source-maps@^1.2.6:
+ version "1.2.6"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz#37b9ff661580f8fca11232752ee42e08c6675d8f"
+ dependencies:
+ debug "^3.1.0"
+ istanbul-lib-coverage "^1.2.1"
+ mkdirp "^0.5.1"
+ rimraf "^2.6.1"
+ source-map "^0.5.3"
+
+istanbul-reports@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.5.1.tgz#97e4dbf3b515e8c484caea15d6524eebd3ff4e1a"
+ dependencies:
+ handlebars "^4.0.3"
+
+jest-changed-files@^20.0.3:
+ version "20.0.3"
+ resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-20.0.3.tgz#9394d5cc65c438406149bef1bf4d52b68e03e3f8"
+
+jest-cli@^20.0.4:
+ version "20.0.4"
+ resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-20.0.4.tgz#e532b19d88ae5bc6c417e8b0593a6fe954b1dc93"
+ dependencies:
+ ansi-escapes "^1.4.0"
+ callsites "^2.0.0"
+ chalk "^1.1.3"
+ graceful-fs "^4.1.11"
+ is-ci "^1.0.10"
+ istanbul-api "^1.1.1"
+ istanbul-lib-coverage "^1.0.1"
+ istanbul-lib-instrument "^1.4.2"
+ istanbul-lib-source-maps "^1.1.0"
+ jest-changed-files "^20.0.3"
+ jest-config "^20.0.4"
+ jest-docblock "^20.0.3"
+ jest-environment-jsdom "^20.0.3"
+ jest-haste-map "^20.0.4"
+ jest-jasmine2 "^20.0.4"
+ jest-message-util "^20.0.3"
+ jest-regex-util "^20.0.3"
+ jest-resolve-dependencies "^20.0.3"
+ jest-runtime "^20.0.4"
+ jest-snapshot "^20.0.3"
+ jest-util "^20.0.3"
+ micromatch "^2.3.11"
+ node-notifier "^5.0.2"
+ pify "^2.3.0"
+ slash "^1.0.0"
+ string-length "^1.0.1"
+ throat "^3.0.0"
+ which "^1.2.12"
+ worker-farm "^1.3.1"
+ yargs "^7.0.2"
+
+jest-config@^20.0.4:
+ version "20.0.4"
+ resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-20.0.4.tgz#e37930ab2217c913605eff13e7bd763ec48faeea"
+ dependencies:
+ chalk "^1.1.3"
+ glob "^7.1.1"
+ jest-environment-jsdom "^20.0.3"
+ jest-environment-node "^20.0.3"
+ jest-jasmine2 "^20.0.4"
+ jest-matcher-utils "^20.0.3"
+ jest-regex-util "^20.0.3"
+ jest-resolve "^20.0.4"
+ jest-validate "^20.0.3"
+ pretty-format "^20.0.3"
+
+jest-diff@^20.0.3:
+ version "20.0.3"
+ resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-20.0.3.tgz#81f288fd9e675f0fb23c75f1c2b19445fe586617"
+ dependencies:
+ chalk "^1.1.3"
+ diff "^3.2.0"
+ jest-matcher-utils "^20.0.3"
+ pretty-format "^20.0.3"
+
+jest-docblock@^20.0.3:
+ version "20.0.3"
+ resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-20.0.3.tgz#17bea984342cc33d83c50fbe1545ea0efaa44712"
+
+jest-environment-jsdom@^20.0.3:
+ version "20.0.3"
+ resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-20.0.3.tgz#048a8ac12ee225f7190417713834bb999787de99"
+ dependencies:
+ jest-mock "^20.0.3"
+ jest-util "^20.0.3"
+ jsdom "^9.12.0"
+
+jest-environment-node@^20.0.3:
+ version "20.0.3"
+ resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-20.0.3.tgz#d488bc4612af2c246e986e8ae7671a099163d403"
+ dependencies:
+ jest-mock "^20.0.3"
+ jest-util "^20.0.3"
+
+jest-haste-map@^20.0.4:
+ version "20.0.5"
+ resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-20.0.5.tgz#abad74efb1a005974a7b6517e11010709cab9112"
+ dependencies:
+ fb-watchman "^2.0.0"
+ graceful-fs "^4.1.11"
+ jest-docblock "^20.0.3"
+ micromatch "^2.3.11"
+ sane "~1.6.0"
+ worker-farm "^1.3.1"
+
+jest-jasmine2@^20.0.4:
+ version "20.0.4"
+ resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-20.0.4.tgz#fcc5b1411780d911d042902ef1859e852e60d5e1"
+ dependencies:
+ chalk "^1.1.3"
+ graceful-fs "^4.1.11"
+ jest-diff "^20.0.3"
+ jest-matcher-utils "^20.0.3"
+ jest-matchers "^20.0.3"
+ jest-message-util "^20.0.3"
+ jest-snapshot "^20.0.3"
+ once "^1.4.0"
+ p-map "^1.1.1"
+
+jest-matcher-utils@^20.0.3:
+ version "20.0.3"
+ resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz#b3a6b8e37ca577803b0832a98b164f44b7815612"
+ dependencies:
+ chalk "^1.1.3"
+ pretty-format "^20.0.3"
+
+jest-matchers@^20.0.3:
+ version "20.0.3"
+ resolved "https://registry.yarnpkg.com/jest-matchers/-/jest-matchers-20.0.3.tgz#ca69db1c32db5a6f707fa5e0401abb55700dfd60"
+ dependencies:
+ jest-diff "^20.0.3"
+ jest-matcher-utils "^20.0.3"
+ jest-message-util "^20.0.3"
+ jest-regex-util "^20.0.3"
+
+jest-message-util@^20.0.3:
+ version "20.0.3"
+ resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-20.0.3.tgz#6aec2844306fcb0e6e74d5796c1006d96fdd831c"
+ dependencies:
+ chalk "^1.1.3"
+ micromatch "^2.3.11"
+ slash "^1.0.0"
+
+jest-mock@^20.0.3:
+ version "20.0.3"
+ resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-20.0.3.tgz#8bc070e90414aa155c11a8d64c869a0d5c71da59"
+
+jest-regex-util@^20.0.3:
+ version "20.0.3"
+ resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-20.0.3.tgz#85bbab5d133e44625b19faf8c6aa5122d085d762"
+
+jest-resolve-dependencies@^20.0.3:
+ version "20.0.3"
+ resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-20.0.3.tgz#6e14a7b717af0f2cb3667c549de40af017b1723a"
+ dependencies:
+ jest-regex-util "^20.0.3"
+
+jest-resolve@^20.0.4:
+ version "20.0.4"
+ resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-20.0.4.tgz#9448b3e8b6bafc15479444c6499045b7ffe597a5"
+ dependencies:
+ browser-resolve "^1.11.2"
+ is-builtin-module "^1.0.0"
+ resolve "^1.3.2"
+
+jest-runtime@^20.0.4:
+ version "20.0.4"
+ resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-20.0.4.tgz#a2c802219c4203f754df1404e490186169d124d8"
+ dependencies:
+ babel-core "^6.0.0"
+ babel-jest "^20.0.3"
+ babel-plugin-istanbul "^4.0.0"
+ chalk "^1.1.3"
+ convert-source-map "^1.4.0"
+ graceful-fs "^4.1.11"
+ jest-config "^20.0.4"
+ jest-haste-map "^20.0.4"
+ jest-regex-util "^20.0.3"
+ jest-resolve "^20.0.4"
+ jest-util "^20.0.3"
+ json-stable-stringify "^1.0.1"
+ micromatch "^2.3.11"
+ strip-bom "3.0.0"
+ yargs "^7.0.2"
+
+jest-snapshot@^20.0.3:
+ version "20.0.3"
+ resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-20.0.3.tgz#5b847e1adb1a4d90852a7f9f125086e187c76566"
+ dependencies:
+ chalk "^1.1.3"
+ jest-diff "^20.0.3"
+ jest-matcher-utils "^20.0.3"
+ jest-util "^20.0.3"
+ natural-compare "^1.4.0"
+ pretty-format "^20.0.3"
+
+jest-util@^20.0.3:
+ version "20.0.3"
+ resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-20.0.3.tgz#0c07f7d80d82f4e5a67c6f8b9c3fe7f65cfd32ad"
+ dependencies:
+ chalk "^1.1.3"
+ graceful-fs "^4.1.11"
+ jest-message-util "^20.0.3"
+ jest-mock "^20.0.3"
+ jest-validate "^20.0.3"
+ leven "^2.1.0"
+ mkdirp "^0.5.1"
+
+jest-validate@^20.0.3:
+ version "20.0.3"
+ resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-20.0.3.tgz#d0cfd1de4f579f298484925c280f8f1d94ec3cab"
+ dependencies:
+ chalk "^1.1.3"
+ jest-matcher-utils "^20.0.3"
+ leven "^2.1.0"
+ pretty-format "^20.0.3"
+
+jest@20.0.4:
+ version "20.0.4"
+ resolved "https://registry.yarnpkg.com/jest/-/jest-20.0.4.tgz#3dd260c2989d6dad678b1e9cc4d91944f6d602ac"
+ dependencies:
+ jest-cli "^20.0.4"
+
+js-base64@^2.1.9:
+ version "2.4.9"
+ resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.9.tgz#748911fb04f48a60c4771b375cac45a80df11c03"
+
+"js-tokens@^3.0.0 || ^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+
+js-tokens@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
+
+js-yaml@^3.4.3, js-yaml@^3.7.0, js-yaml@^3.9.1:
+ version "3.12.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1"
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
+js-yaml@~3.7.0:
+ version "3.7.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80"
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^2.6.0"
+
+jsbn@~0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+
+jsdom@^9.12.0:
+ version "9.12.0"
+ resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4"
+ dependencies:
+ abab "^1.0.3"
+ acorn "^4.0.4"
+ acorn-globals "^3.1.0"
+ array-equal "^1.0.0"
+ content-type-parser "^1.0.1"
+ cssom ">= 0.3.2 < 0.4.0"
+ cssstyle ">= 0.2.37 < 0.3.0"
+ escodegen "^1.6.1"
+ html-encoding-sniffer "^1.0.1"
+ nwmatcher ">= 1.3.9 < 2.0.0"
+ parse5 "^1.5.1"
+ request "^2.79.0"
+ sax "^1.2.1"
+ symbol-tree "^3.2.1"
+ tough-cookie "^2.3.2"
+ webidl-conversions "^4.0.0"
+ whatwg-encoding "^1.0.1"
+ whatwg-url "^4.3.0"
+ xml-name-validator "^2.0.1"
+
+jsesc@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
+
+jsesc@~0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+
+json-loader@^0.5.4:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d"
+
+json-schema-traverse@^0.3.0:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340"
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+
+json-schema@0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
+
+json-stable-stringify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
+ dependencies:
+ jsonify "~0.0.0"
+
+json-stringify-safe@~5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+
+json3@^3.3.2:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1"
+
+json5@^0.5.0, json5@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+
+jsonfile@^2.1.0:
+ version "2.4.0"
+ resolved "http://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8"
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonfile@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66"
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+jsonify@~0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73"
+
+jsprim@^1.2.2:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
+ dependencies:
+ assert-plus "1.0.0"
+ extsprintf "1.3.0"
+ json-schema "0.2.3"
+ verror "1.10.0"
+
+jsx-ast-utils@^1.4.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz#3867213e8dd79bf1e8f2300c0cfc1efb182c0df1"
+
+jsx-ast-utils@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz#e801b1b39985e20fffc87b40e3748080e2dcac7f"
+ dependencies:
+ array-includes "^3.0.3"
+
+killable@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892"
+
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
+
+kind-of@^6.0.0, kind-of@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
+
+klaw@^1.0.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439"
+ optionalDependencies:
+ graceful-fs "^4.1.9"
+
+latest-version@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15"
+ dependencies:
+ package-json "^4.0.0"
+
+lazy-cache@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
+
+lcid@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
+ dependencies:
+ invert-kv "^1.0.0"
+
+leven@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580"
+
+levn@^0.3.0, levn@~0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
+ dependencies:
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+
+load-json-file@^1.0.0:
+ version "1.1.0"
+ resolved "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
+ dependencies:
+ graceful-fs "^4.1.2"
+ parse-json "^2.2.0"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+ strip-bom "^2.0.0"
+
+load-json-file@^2.0.0:
+ version "2.0.0"
+ resolved "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
+ dependencies:
+ graceful-fs "^4.1.2"
+ parse-json "^2.2.0"
+ pify "^2.0.0"
+ strip-bom "^3.0.0"
+
+loader-fs-cache@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz#56e0bf08bd9708b26a765b68509840c8dec9fdbc"
+ dependencies:
+ find-cache-dir "^0.1.1"
+ mkdirp "0.5.1"
+
+loader-runner@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2"
+
+loader-utils@^0.2.16:
+ version "0.2.17"
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz#f86e6374d43205a6e6c60e9196f17c0299bfb348"
+ dependencies:
+ big.js "^3.1.3"
+ emojis-list "^2.0.0"
+ json5 "^0.5.0"
+ object-assign "^4.0.1"
+
+loader-utils@^1.0.2, loader-utils@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd"
+ dependencies:
+ big.js "^3.1.3"
+ emojis-list "^2.0.0"
+ json5 "^0.5.0"
+
+locate-path@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+ dependencies:
+ p-locate "^2.0.0"
+ path-exists "^3.0.0"
+
+lodash._reinterpolate@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
+
+lodash.camelcase@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
+
+lodash.cond@^4.3.0:
+ version "4.5.2"
+ resolved "https://registry.yarnpkg.com/lodash.cond/-/lodash.cond-4.5.2.tgz#f471a1da486be60f6ab955d17115523dd1d255d5"
+
+lodash.debounce@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
+
+lodash.defaults@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
+
+lodash.memoize@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
+
+lodash.template@^4.4.0:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0"
+ dependencies:
+ lodash._reinterpolate "~3.0.0"
+ lodash.templatesettings "^4.0.0"
+
+lodash.templatesettings@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316"
+ dependencies:
+ lodash._reinterpolate "~3.0.0"
+
+lodash.uniq@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
+
+"lodash@>=3.5 <5", lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.3.0:
+ version "4.17.11"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
+
+loglevel@^1.4.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.1.tgz#e0fc95133b6ef276cdc8887cdaf24aa6f156f8fa"
+
+longest@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
+
+loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+loud-rejection@^1.0.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f"
+ dependencies:
+ currently-unhandled "^0.4.1"
+ signal-exit "^3.0.0"
+
+lower-case@^1.1.1:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac"
+
+lowercase-keys@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
+
+lru-cache@^4.0.1:
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c"
+ dependencies:
+ pseudomap "^1.0.2"
+ yallist "^2.1.2"
+
+make-dir@^1.0.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
+ dependencies:
+ pify "^3.0.0"
+
+makeerror@1.0.x:
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c"
+ dependencies:
+ tmpl "1.0.x"
+
+map-cache@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+
+map-obj@^1.0.0, map-obj@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d"
+
+map-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+ dependencies:
+ object-visit "^1.0.0"
+
+math-expression-evaluator@^1.2.14:
+ version "1.2.17"
+ resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac"
+
+math-random@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac"
+
+md5.js@^1.3.4:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d"
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+
+media-typer@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+
+mem@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76"
+ dependencies:
+ mimic-fn "^1.0.0"
+
+memory-fs@^0.4.0, memory-fs@~0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
+ dependencies:
+ errno "^0.1.3"
+ readable-stream "^2.0.1"
+
+meow@^3.3.0, meow@^3.7.0:
+ version "3.7.0"
+ resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
+ dependencies:
+ camelcase-keys "^2.0.0"
+ decamelize "^1.1.2"
+ loud-rejection "^1.0.0"
+ map-obj "^1.0.1"
+ minimist "^1.1.3"
+ normalize-package-data "^2.3.4"
+ object-assign "^4.0.1"
+ read-pkg-up "^1.0.1"
+ redent "^1.0.0"
+ trim-newlines "^1.0.0"
+
+merge-descriptors@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
+
+merge@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da"
+
+methods@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+
+micromatch@^2.1.5, micromatch@^2.3.11:
+ version "2.3.11"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
+ dependencies:
+ arr-diff "^2.0.0"
+ array-unique "^0.2.1"
+ braces "^1.8.2"
+ expand-brackets "^0.1.4"
+ extglob "^0.3.1"
+ filename-regex "^2.0.0"
+ is-extglob "^1.0.0"
+ is-glob "^2.0.1"
+ kind-of "^3.0.2"
+ normalize-path "^2.0.1"
+ object.omit "^2.0.0"
+ parse-glob "^3.0.4"
+ regex-cache "^0.4.2"
+
+micromatch@^3.1.10, micromatch@^3.1.4:
+ version "3.1.10"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ braces "^2.3.1"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ extglob "^2.0.4"
+ fragment-cache "^0.2.1"
+ kind-of "^6.0.2"
+ nanomatch "^1.2.9"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.2"
+
+miller-rabin@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
+ dependencies:
+ bn.js "^4.0.0"
+ brorand "^1.0.1"
+
+"mime-db@>= 1.36.0 < 2", mime-db@~1.36.0:
+ version "1.36.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.36.0.tgz#5020478db3c7fe93aad7bbcc4dcf869c43363397"
+
+mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.18, mime-types@~2.1.19:
+ version "2.1.20"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.20.tgz#930cb719d571e903738520f8470911548ca2cc19"
+ dependencies:
+ mime-db "~1.36.0"
+
+mime@1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
+
+mime@^1.4.1, mime@^1.5.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+
+mimic-fn@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
+
+minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+
+minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+
+minimatch@3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774"
+ dependencies:
+ brace-expansion "^1.0.0"
+
+minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@0.0.8:
+ version "0.0.8"
+ resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+
+minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0:
+ version "1.2.0"
+ resolved "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+
+minimist@~0.0.1:
+ version "0.0.10"
+ resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf"
+
+minipass@^2.2.1, minipass@^2.3.3:
+ version "2.3.4"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.4.tgz#4768d7605ed6194d6d576169b9e12ef71e9d9957"
+ dependencies:
+ safe-buffer "^5.1.2"
+ yallist "^3.0.0"
+
+minizlib@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb"
+ dependencies:
+ minipass "^2.2.1"
+
+mixin-deep@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe"
+ dependencies:
+ for-in "^1.0.2"
+ is-extendable "^1.0.1"
+
+mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1:
+ version "0.5.1"
+ resolved "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+ dependencies:
+ minimist "0.0.8"
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+
+ms@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
+
+multicast-dns-service-types@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901"
+
+multicast-dns@^6.0.1:
+ version "6.2.3"
+ resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz#a0ec7bd9055c4282f790c3c82f4e28db3b31b229"
+ dependencies:
+ dns-packet "^1.3.1"
+ thunky "^1.0.2"
+
+mute-stream@0.0.7:
+ version "0.0.7"
+ resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
+
+nan@^2.9.2:
+ version "2.11.0"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.0.tgz#574e360e4d954ab16966ec102c0c049fd961a099"
+
+nanomatch@^1.2.9:
+ version "1.2.13"
+ resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ fragment-cache "^0.2.1"
+ is-windows "^1.0.2"
+ kind-of "^6.0.2"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+
+needle@^2.2.1:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.3.tgz#c1b04da378cd634d8befe2de965dc2cfb0fd65ca"
+ dependencies:
+ debug "^2.1.2"
+ iconv-lite "^0.4.4"
+ sax "^1.2.4"
+
+negotiator@0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
+
+neo-async@^2.5.0:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.2.tgz#489105ce7bc54e709d736b195f82135048c50fcc"
+
+next-tick@1:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
+
+no-case@^2.2.0:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac"
+ dependencies:
+ lower-case "^1.1.1"
+
+node-forge@0.7.5:
+ version "0.7.5"
+ resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df"
+
+node-int64@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
+
+node-libs-browser@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df"
+ dependencies:
+ assert "^1.1.1"
+ browserify-zlib "^0.2.0"
+ buffer "^4.3.0"
+ console-browserify "^1.1.0"
+ constants-browserify "^1.0.0"
+ crypto-browserify "^3.11.0"
+ domain-browser "^1.1.1"
+ events "^1.0.0"
+ https-browserify "^1.0.0"
+ os-browserify "^0.3.0"
+ path-browserify "0.0.0"
+ process "^0.11.10"
+ punycode "^1.2.4"
+ querystring-es3 "^0.2.0"
+ readable-stream "^2.3.3"
+ stream-browserify "^2.0.1"
+ stream-http "^2.7.2"
+ string_decoder "^1.0.0"
+ timers-browserify "^2.0.4"
+ tty-browserify "0.0.0"
+ url "^0.11.0"
+ util "^0.10.3"
+ vm-browserify "0.0.4"
+
+node-notifier@^5.0.2:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea"
+ dependencies:
+ growly "^1.3.0"
+ semver "^5.4.1"
+ shellwords "^0.1.1"
+ which "^1.3.0"
+
+node-pre-gyp@^0.10.0:
+ version "0.10.3"
+ resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc"
+ dependencies:
+ detect-libc "^1.0.2"
+ mkdirp "^0.5.1"
+ needle "^2.2.1"
+ nopt "^4.0.1"
+ npm-packlist "^1.1.6"
+ npmlog "^4.0.2"
+ rc "^1.2.7"
+ rimraf "^2.6.1"
+ semver "^5.3.0"
+ tar "^4"
+
+nopt@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
+ dependencies:
+ abbrev "1"
+ osenv "^0.1.4"
+
+normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f"
+ dependencies:
+ hosted-git-info "^2.1.4"
+ is-builtin-module "^1.0.0"
+ semver "2 || 3 || 4 || 5"
+ validate-npm-package-license "^3.0.1"
+
+normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+ dependencies:
+ remove-trailing-separator "^1.0.1"
+
+normalize-range@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
+
+normalize-url@^1.4.0:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c"
+ dependencies:
+ object-assign "^4.0.1"
+ prepend-http "^1.0.0"
+ query-string "^4.1.0"
+ sort-keys "^1.0.0"
+
+npm-bundled@^1.0.1:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979"
+
+npm-packlist@^1.1.6:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz#84e8c683cbe7867d34b1d357d893ce29e28a02de"
+ dependencies:
+ ignore-walk "^3.0.1"
+ npm-bundled "^1.0.1"
+
+npm-run-path@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
+ dependencies:
+ path-key "^2.0.0"
+
+npmlog@^4.0.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
+ dependencies:
+ are-we-there-yet "~1.1.2"
+ console-control-strings "~1.1.0"
+ gauge "~2.7.3"
+ set-blocking "~2.0.0"
+
+nth-check@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4"
+ dependencies:
+ boolbase "~1.0.0"
+
+num2fraction@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede"
+
+number-is-nan@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+
+"nwmatcher@>= 1.3.9 < 2.0.0":
+ version "1.4.4"
+ resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.4.tgz#2285631f34a95f0d0395cd900c96ed39b58f346e"
+
+oauth-sign@~0.9.0:
+ version "0.9.0"
+ resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
+
+object-assign@4.1.1, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+
+object-copy@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+ dependencies:
+ copy-descriptor "^0.1.0"
+ define-property "^0.2.5"
+ kind-of "^3.0.3"
+
+object-hash@^1.1.4:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.0.tgz#76d9ba6ff113cf8efc0d996102851fe6723963e2"
+
+object-keys@^1.0.12:
+ version "1.0.12"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2"
+
+object-visit@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+ dependencies:
+ isobject "^3.0.0"
+
+object.omit@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
+ dependencies:
+ for-own "^0.1.4"
+ is-extendable "^0.1.1"
+
+object.pick@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+ dependencies:
+ isobject "^3.0.1"
+
+obuf@^1.0.0, obuf@^1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e"
+
+on-finished@~2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+ dependencies:
+ ee-first "1.1.1"
+
+on-headers@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7"
+
+once@^1.3.0, once@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ dependencies:
+ wrappy "1"
+
+onetime@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
+ dependencies:
+ mimic-fn "^1.0.0"
+
+opn@5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/opn/-/opn-5.2.0.tgz#71fdf934d6827d676cecbea1531f95d354641225"
+ dependencies:
+ is-wsl "^1.1.0"
+
+opn@^5.1.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz#64871565c863875f052cfdf53d3e3cb5adb53b1c"
+ dependencies:
+ is-wsl "^1.1.0"
+
+optimist@^0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686"
+ dependencies:
+ minimist "~0.0.1"
+ wordwrap "~0.0.2"
+
+optionator@^0.8.1, optionator@^0.8.2:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
+ dependencies:
+ deep-is "~0.1.3"
+ fast-levenshtein "~2.0.4"
+ levn "~0.3.0"
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+ wordwrap "~1.0.0"
+
+original@>=0.0.5:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f"
+ dependencies:
+ url-parse "^1.4.3"
+
+os-browserify@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
+
+os-homedir@^1.0.0, os-homedir@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+
+os-locale@^1.4.0:
+ version "1.4.0"
+ resolved "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
+ dependencies:
+ lcid "^1.0.0"
+
+os-locale@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2"
+ dependencies:
+ execa "^0.7.0"
+ lcid "^1.0.0"
+ mem "^1.1.0"
+
+os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+
+osenv@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.0"
+
+p-finally@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+
+p-limit@^1.1.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
+ dependencies:
+ p-try "^1.0.0"
+
+p-locate@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+ dependencies:
+ p-limit "^1.1.0"
+
+p-map@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b"
+
+p-try@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+
+package-json@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed"
+ dependencies:
+ got "^6.7.1"
+ registry-auth-token "^3.0.1"
+ registry-url "^3.0.3"
+ semver "^5.1.0"
+
+pako@~1.0.5:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258"
+
+param-case@2.1.x:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247"
+ dependencies:
+ no-case "^2.2.0"
+
+parse-asn1@^5.0.0:
+ version "5.1.1"
+ resolved "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8"
+ dependencies:
+ asn1.js "^4.0.0"
+ browserify-aes "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.0"
+ pbkdf2 "^3.0.3"
+
+parse-glob@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
+ dependencies:
+ glob-base "^0.3.0"
+ is-dotfile "^1.0.0"
+ is-extglob "^1.0.0"
+ is-glob "^2.0.0"
+
+parse-json@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+ dependencies:
+ error-ex "^1.2.0"
+
+parse-passwd@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
+
+parse5@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94"
+
+parseurl@~1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3"
+
+pascalcase@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+
+path-browserify@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
+
+path-dirname@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
+
+path-exists@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
+ dependencies:
+ pinkie-promise "^2.0.0"
+
+path-exists@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+
+path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+
+path-is-inside@^1.0.1, path-is-inside@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
+
+path-key@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+
+path-parse@^1.0.5:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
+
+path-to-regexp@0.1.7:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
+
+path-to-regexp@^1.0.1:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d"
+ dependencies:
+ isarray "0.0.1"
+
+path-type@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
+ dependencies:
+ graceful-fs "^4.1.2"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+path-type@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
+ dependencies:
+ pify "^2.0.0"
+
+pbkdf2@^3.0.3:
+ version "3.0.16"
+ resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c"
+ dependencies:
+ create-hash "^1.1.2"
+ create-hmac "^1.1.4"
+ ripemd160 "^2.0.1"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+performance-now@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
+
+pify@^2.0.0, pify@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+
+pify@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
+
+pinkie-promise@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+ dependencies:
+ pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+
+pkg-dir@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4"
+ dependencies:
+ find-up "^1.0.0"
+
+pkg-dir@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
+ dependencies:
+ find-up "^2.1.0"
+
+pluralize@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777"
+
+portfinder@^1.0.9:
+ version "1.0.17"
+ resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.17.tgz#a8a1691143e46c4735edefcf4fbcccedad26456a"
+ dependencies:
+ async "^1.5.2"
+ debug "^2.2.0"
+ mkdirp "0.5.x"
+
+posix-character-classes@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+
+postcss-calc@^5.2.0:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e"
+ dependencies:
+ postcss "^5.0.2"
+ postcss-message-helpers "^2.0.0"
+ reduce-css-calc "^1.2.6"
+
+postcss-colormin@^2.1.8:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b"
+ dependencies:
+ colormin "^1.0.5"
+ postcss "^5.0.13"
+ postcss-value-parser "^3.2.3"
+
+postcss-convert-values@^2.3.4:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d"
+ dependencies:
+ postcss "^5.0.11"
+ postcss-value-parser "^3.1.2"
+
+postcss-discard-comments@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d"
+ dependencies:
+ postcss "^5.0.14"
+
+postcss-discard-duplicates@^2.0.1:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932"
+ dependencies:
+ postcss "^5.0.4"
+
+postcss-discard-empty@^2.0.1:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5"
+ dependencies:
+ postcss "^5.0.14"
+
+postcss-discard-overridden@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58"
+ dependencies:
+ postcss "^5.0.16"
+
+postcss-discard-unused@^2.2.1:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433"
+ dependencies:
+ postcss "^5.0.14"
+ uniqs "^2.0.0"
+
+postcss-filter-plugins@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz#82245fdf82337041645e477114d8e593aa18b8ec"
+ dependencies:
+ postcss "^5.0.4"
+
+postcss-flexbugs-fixes@3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-3.2.0.tgz#9b8b932c53f9cf13ba0f61875303e447c33dcc51"
+ dependencies:
+ postcss "^6.0.1"
+
+postcss-load-config@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-1.2.0.tgz#539e9afc9ddc8620121ebf9d8c3673e0ce50d28a"
+ dependencies:
+ cosmiconfig "^2.1.0"
+ object-assign "^4.1.0"
+ postcss-load-options "^1.2.0"
+ postcss-load-plugins "^2.3.0"
+
+postcss-load-options@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/postcss-load-options/-/postcss-load-options-1.2.0.tgz#b098b1559ddac2df04bc0bb375f99a5cfe2b6d8c"
+ dependencies:
+ cosmiconfig "^2.1.0"
+ object-assign "^4.1.0"
+
+postcss-load-plugins@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz#745768116599aca2f009fad426b00175049d8d92"
+ dependencies:
+ cosmiconfig "^2.1.1"
+ object-assign "^4.1.0"
+
+postcss-loader@2.0.8:
+ version "2.0.8"
+ resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-2.0.8.tgz#8c67ddb029407dfafe684a406cfc16bad2ce0814"
+ dependencies:
+ loader-utils "^1.1.0"
+ postcss "^6.0.0"
+ postcss-load-config "^1.2.0"
+ schema-utils "^0.3.0"
+
+postcss-merge-idents@^2.1.5:
+ version "2.1.7"
+ resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270"
+ dependencies:
+ has "^1.0.1"
+ postcss "^5.0.10"
+ postcss-value-parser "^3.1.1"
+
+postcss-merge-longhand@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658"
+ dependencies:
+ postcss "^5.0.4"
+
+postcss-merge-rules@^2.0.3:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721"
+ dependencies:
+ browserslist "^1.5.2"
+ caniuse-api "^1.5.2"
+ postcss "^5.0.4"
+ postcss-selector-parser "^2.2.2"
+ vendors "^1.0.0"
+
+postcss-message-helpers@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e"
+
+postcss-minify-font-values@^1.0.2:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69"
+ dependencies:
+ object-assign "^4.0.1"
+ postcss "^5.0.4"
+ postcss-value-parser "^3.0.2"
+
+postcss-minify-gradients@^1.0.1:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1"
+ dependencies:
+ postcss "^5.0.12"
+ postcss-value-parser "^3.3.0"
+
+postcss-minify-params@^1.0.4:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3"
+ dependencies:
+ alphanum-sort "^1.0.1"
+ postcss "^5.0.2"
+ postcss-value-parser "^3.0.2"
+ uniqs "^2.0.0"
+
+postcss-minify-selectors@^2.0.4:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf"
+ dependencies:
+ alphanum-sort "^1.0.2"
+ has "^1.0.1"
+ postcss "^5.0.14"
+ postcss-selector-parser "^2.0.0"
+
+postcss-modules-extract-imports@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz#b614c9720be6816eaee35fb3a5faa1dba6a05ddb"
+ dependencies:
+ postcss "^6.0.1"
+
+postcss-modules-local-by-default@^1.0.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069"
+ dependencies:
+ css-selector-tokenizer "^0.7.0"
+ postcss "^6.0.1"
+
+postcss-modules-scope@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90"
+ dependencies:
+ css-selector-tokenizer "^0.7.0"
+ postcss "^6.0.1"
+
+postcss-modules-values@^1.1.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20"
+ dependencies:
+ icss-replace-symbols "^1.1.0"
+ postcss "^6.0.1"
+
+postcss-normalize-charset@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1"
+ dependencies:
+ postcss "^5.0.5"
+
+postcss-normalize-url@^3.0.7:
+ version "3.0.8"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222"
+ dependencies:
+ is-absolute-url "^2.0.0"
+ normalize-url "^1.4.0"
+ postcss "^5.0.14"
+ postcss-value-parser "^3.2.3"
+
+postcss-ordered-values@^2.1.0:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d"
+ dependencies:
+ postcss "^5.0.4"
+ postcss-value-parser "^3.0.1"
+
+postcss-reduce-idents@^2.2.2:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3"
+ dependencies:
+ postcss "^5.0.4"
+ postcss-value-parser "^3.0.2"
+
+postcss-reduce-initial@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea"
+ dependencies:
+ postcss "^5.0.4"
+
+postcss-reduce-transforms@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1"
+ dependencies:
+ has "^1.0.1"
+ postcss "^5.0.8"
+ postcss-value-parser "^3.0.1"
+
+postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90"
+ dependencies:
+ flatten "^1.0.2"
+ indexes-of "^1.0.1"
+ uniq "^1.0.1"
+
+postcss-svgo@^2.1.1:
+ version "2.1.6"
+ resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d"
+ dependencies:
+ is-svg "^2.0.0"
+ postcss "^5.0.14"
+ postcss-value-parser "^3.2.3"
+ svgo "^0.7.0"
+
+postcss-unique-selectors@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d"
+ dependencies:
+ alphanum-sort "^1.0.1"
+ postcss "^5.0.4"
+ uniqs "^2.0.0"
+
+postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15"
+
+postcss-zindex@^2.0.1:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22"
+ dependencies:
+ has "^1.0.1"
+ postcss "^5.0.4"
+ uniqs "^2.0.0"
+
+postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.6, postcss@^5.0.8, postcss@^5.2.16:
+ version "5.2.18"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5"
+ dependencies:
+ chalk "^1.1.3"
+ js-base64 "^2.1.9"
+ source-map "^0.5.6"
+ supports-color "^3.2.3"
+
+postcss@^6.0.0, postcss@^6.0.1, postcss@^6.0.13:
+ version "6.0.23"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324"
+ dependencies:
+ chalk "^2.4.1"
+ source-map "^0.6.1"
+ supports-color "^5.4.0"
+
+prelude-ls@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+
+prepend-http@^1.0.0, prepend-http@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
+
+preserve@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
+
+pretty-bytes@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-4.0.2.tgz#b2bf82e7350d65c6c33aa95aaa5a4f6327f61cd9"
+
+pretty-error@^2.0.2:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3"
+ dependencies:
+ renderkid "^2.0.1"
+ utila "~0.4"
+
+pretty-format@^20.0.3:
+ version "20.0.3"
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-20.0.3.tgz#020e350a560a1fe1a98dc3beb6ccffb386de8b14"
+ dependencies:
+ ansi-regex "^2.1.1"
+ ansi-styles "^3.0.0"
+
+private@^0.1.6, private@^0.1.7, private@^0.1.8:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
+
+process-nextick-args@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
+
+process@^0.11.10:
+ version "0.11.10"
+ resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+
+progress@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f"
+
+promise@8.0.1:
+ version "8.0.1"
+ resolved "https://registry.yarnpkg.com/promise/-/promise-8.0.1.tgz#e45d68b00a17647b6da711bf85ed6ed47208f450"
+ dependencies:
+ asap "~2.0.3"
+
+prop-types@^15.5.10, prop-types@^15.6.2:
+ version "15.6.2"
+ resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.2.tgz#05d5ca77b4453e985d60fc7ff8c859094a497102"
+ dependencies:
+ loose-envify "^1.3.1"
+ object-assign "^4.1.1"
+
+proxy-addr@~2.0.3:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93"
+ dependencies:
+ forwarded "~0.1.2"
+ ipaddr.js "1.8.0"
+
+prr@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
+
+pseudomap@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+
+psl@^1.1.24:
+ version "1.1.29"
+ resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67"
+
+public-encrypt@^4.0.0:
+ version "4.0.2"
+ resolved "http://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994"
+ dependencies:
+ bn.js "^4.1.0"
+ browserify-rsa "^4.0.0"
+ create-hash "^1.1.0"
+ parse-asn1 "^5.0.0"
+ randombytes "^2.0.1"
+
+punycode@1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+
+punycode@^1.2.4, punycode@^1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+
+punycode@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+
+q@^1.1.2:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
+
+qs@6.5.1:
+ version "6.5.1"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8"
+
+qs@~6.5.2:
+ version "6.5.2"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
+
+query-string@^4.1.0:
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb"
+ dependencies:
+ object-assign "^4.1.0"
+ strict-uri-encode "^1.0.0"
+
+querystring-es3@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
+
+querystring@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+
+querystringify@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.0.0.tgz#fa3ed6e68eb15159457c89b37bc6472833195755"
+
+raf@3.4.0:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.0.tgz#a28876881b4bc2ca9117d4138163ddb80f781575"
+ dependencies:
+ performance-now "^2.1.0"
+
+randomatic@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.0.tgz#36f2ca708e9e567f5ed2ec01949026d50aa10116"
+ dependencies:
+ is-number "^4.0.0"
+ kind-of "^6.0.0"
+ math-random "^1.0.1"
+
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80"
+ dependencies:
+ safe-buffer "^5.1.0"
+
+randomfill@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
+ dependencies:
+ randombytes "^2.0.5"
+ safe-buffer "^5.1.0"
+
+range-parser@^1.0.3, range-parser@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e"
+
+raw-body@2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89"
+ dependencies:
+ bytes "3.0.0"
+ http-errors "1.6.2"
+ iconv-lite "0.4.19"
+ unpipe "1.0.0"
+
+rc@^1.0.1, rc@^1.1.6, rc@^1.2.7:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
+ dependencies:
+ deep-extend "^0.6.0"
+ ini "~1.3.0"
+ minimist "^1.2.0"
+ strip-json-comments "~2.0.1"
+
+react-app-rewired@^1.6.2:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/react-app-rewired/-/react-app-rewired-1.6.2.tgz#32ce90abc2c4e2b86c71e4e270bd36663b3b1c9a"
+ dependencies:
+ cross-spawn "^5.1.0"
+ dotenv "^4.0.0"
+
+react-dev-utils@^5.0.2:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-5.0.2.tgz#7bb68d2c4f6ffe7ed1184c5b0124fcad692774d2"
+ dependencies:
+ address "1.0.3"
+ babel-code-frame "6.26.0"
+ chalk "1.1.3"
+ cross-spawn "5.1.0"
+ detect-port-alt "1.1.6"
+ escape-string-regexp "1.0.5"
+ filesize "3.5.11"
+ global-modules "1.0.0"
+ gzip-size "3.0.0"
+ inquirer "3.3.0"
+ is-root "1.0.0"
+ opn "5.2.0"
+ react-error-overlay "^4.0.1"
+ recursive-readdir "2.2.1"
+ shell-quote "1.6.1"
+ sockjs-client "1.1.5"
+ strip-ansi "3.0.1"
+ text-table "0.2.0"
+
+react-dom@^16.5.1:
+ version "16.5.1"
+ resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.5.1.tgz#29d0c5a01ed3b6b4c14309aa91af6ec4eb4f292c"
+ dependencies:
+ loose-envify "^1.1.0"
+ object-assign "^4.1.1"
+ prop-types "^15.6.2"
+ schedule "^0.4.0"
+
+react-error-overlay@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-4.0.1.tgz#417addb0814a90f3a7082eacba7cee588d00da89"
+
+react-rewired@^0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/react-rewired/-/react-rewired-0.5.2.tgz#659a0fcdafd6d133c868b1a0e286c734911ab6df"
+
+react-scripts@1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/react-scripts/-/react-scripts-1.1.5.tgz#3041610ab0826736b52197711a4c4e3756e97768"
+ dependencies:
+ autoprefixer "7.1.6"
+ babel-core "6.26.0"
+ babel-eslint "7.2.3"
+ babel-jest "20.0.3"
+ babel-loader "7.1.2"
+ babel-preset-react-app "^3.1.2"
+ babel-runtime "6.26.0"
+ case-sensitive-paths-webpack-plugin "2.1.1"
+ chalk "1.1.3"
+ css-loader "0.28.7"
+ dotenv "4.0.0"
+ dotenv-expand "4.2.0"
+ eslint "4.10.0"
+ eslint-config-react-app "^2.1.0"
+ eslint-loader "1.9.0"
+ eslint-plugin-flowtype "2.39.1"
+ eslint-plugin-import "2.8.0"
+ eslint-plugin-jsx-a11y "5.1.1"
+ eslint-plugin-react "7.4.0"
+ extract-text-webpack-plugin "3.0.2"
+ file-loader "1.1.5"
+ fs-extra "3.0.1"
+ html-webpack-plugin "2.29.0"
+ jest "20.0.4"
+ object-assign "4.1.1"
+ postcss-flexbugs-fixes "3.2.0"
+ postcss-loader "2.0.8"
+ promise "8.0.1"
+ raf "3.4.0"
+ react-dev-utils "^5.0.2"
+ resolve "1.6.0"
+ style-loader "0.19.0"
+ sw-precache-webpack-plugin "0.11.4"
+ url-loader "0.6.2"
+ webpack "3.8.1"
+ webpack-dev-server "2.11.3"
+ webpack-manifest-plugin "1.3.2"
+ whatwg-fetch "2.0.3"
+ optionalDependencies:
+ fsevents "^1.1.3"
+
+react@^16.5.1:
+ version "16.5.1"
+ resolved "https://registry.yarnpkg.com/react/-/react-16.5.1.tgz#8cb8e9f8cdcb4bde41c9a138bfbf907e66132372"
+ dependencies:
+ loose-envify "^1.1.0"
+ object-assign "^4.1.1"
+ prop-types "^15.6.2"
+ schedule "^0.4.0"
+
+read-pkg-up@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
+ dependencies:
+ find-up "^1.0.0"
+ read-pkg "^1.0.0"
+
+read-pkg-up@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
+ dependencies:
+ find-up "^2.0.0"
+ read-pkg "^2.0.0"
+
+read-pkg@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
+ dependencies:
+ load-json-file "^1.0.0"
+ normalize-package-data "^2.3.2"
+ path-type "^1.0.0"
+
+read-pkg@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
+ dependencies:
+ load-json-file "^2.0.0"
+ normalize-package-data "^2.3.2"
+ path-type "^2.0.0"
+
+readable-stream@1.0:
+ version "1.0.34"
+ resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.3, readable-stream@^2.3.6:
+ version "2.3.6"
+ resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.3"
+ isarray "~1.0.0"
+ process-nextick-args "~2.0.0"
+ safe-buffer "~5.1.1"
+ string_decoder "~1.1.1"
+ util-deprecate "~1.0.1"
+
+readdirp@^2.0.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525"
+ dependencies:
+ graceful-fs "^4.1.11"
+ micromatch "^3.1.10"
+ readable-stream "^2.0.2"
+
+recursive-readdir@2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.1.tgz#90ef231d0778c5ce093c9a48d74e5c5422d13a99"
+ dependencies:
+ minimatch "3.0.3"
+
+redent@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde"
+ dependencies:
+ indent-string "^2.1.0"
+ strip-indent "^1.0.1"
+
+reduce-css-calc@^1.2.6:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716"
+ dependencies:
+ balanced-match "^0.4.2"
+ math-expression-evaluator "^1.2.14"
+ reduce-function-call "^1.0.1"
+
+reduce-function-call@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99"
+ dependencies:
+ balanced-match "^0.4.2"
+
+regenerate@^1.2.1:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11"
+
+regenerator-runtime@^0.11.0:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
+
+regenerator-transform@^0.10.0:
+ version "0.10.1"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd"
+ dependencies:
+ babel-runtime "^6.18.0"
+ babel-types "^6.19.0"
+ private "^0.1.6"
+
+regex-cache@^0.4.2:
+ version "0.4.4"
+ resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd"
+ dependencies:
+ is-equal-shallow "^0.1.3"
+
+regex-not@^1.0.0, regex-not@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+ dependencies:
+ extend-shallow "^3.0.2"
+ safe-regex "^1.1.0"
+
+regexpu-core@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b"
+ dependencies:
+ regenerate "^1.2.1"
+ regjsgen "^0.2.0"
+ regjsparser "^0.1.4"
+
+regexpu-core@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"
+ dependencies:
+ regenerate "^1.2.1"
+ regjsgen "^0.2.0"
+ regjsparser "^0.1.4"
+
+registry-auth-token@^3.0.1:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20"
+ dependencies:
+ rc "^1.1.6"
+ safe-buffer "^5.0.1"
+
+registry-url@^3.0.3:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942"
+ dependencies:
+ rc "^1.0.1"
+
+regjsgen@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
+
+regjsparser@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
+ dependencies:
+ jsesc "~0.5.0"
+
+relateurl@0.2.x:
+ version "0.2.7"
+ resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
+
+remove-trailing-separator@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+
+renderkid@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.1.tgz#898cabfc8bede4b7b91135a3ffd323e58c0db319"
+ dependencies:
+ css-select "^1.1.0"
+ dom-converter "~0.1"
+ htmlparser2 "~3.3.0"
+ strip-ansi "^3.0.0"
+ utila "~0.3"
+
+repeat-element@^1.1.2:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce"
+
+repeat-string@^1.5.2, repeat-string@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+
+repeating@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
+ dependencies:
+ is-finite "^1.0.0"
+
+request@^2.79.0:
+ version "2.88.0"
+ resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef"
+ dependencies:
+ aws-sign2 "~0.7.0"
+ aws4 "^1.8.0"
+ caseless "~0.12.0"
+ combined-stream "~1.0.6"
+ extend "~3.0.2"
+ forever-agent "~0.6.1"
+ form-data "~2.3.2"
+ har-validator "~5.1.0"
+ http-signature "~1.2.0"
+ is-typedarray "~1.0.0"
+ isstream "~0.1.2"
+ json-stringify-safe "~5.0.1"
+ mime-types "~2.1.19"
+ oauth-sign "~0.9.0"
+ performance-now "^2.1.0"
+ qs "~6.5.2"
+ safe-buffer "^5.1.2"
+ tough-cookie "~2.4.3"
+ tunnel-agent "^0.6.0"
+ uuid "^3.3.2"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+
+require-from-string@^1.1.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418"
+
+require-main-filename@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
+
+require-uncached@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3"
+ dependencies:
+ caller-path "^0.1.0"
+ resolve-from "^1.0.0"
+
+requires-port@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
+
+resolve-cwd@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a"
+ dependencies:
+ resolve-from "^3.0.0"
+
+resolve-dir@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43"
+ dependencies:
+ expand-tilde "^2.0.0"
+ global-modules "^1.0.0"
+
+resolve-from@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226"
+
+resolve-from@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
+
+resolve-url@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+
+resolve@1.1.7:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
+
+resolve@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.6.0.tgz#0fbd21278b27b4004481c395349e7aba60a9ff5c"
+ dependencies:
+ path-parse "^1.0.5"
+
+resolve@^1.3.2, resolve@^1.5.0:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26"
+ dependencies:
+ path-parse "^1.0.5"
+
+restore-cursor@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
+ dependencies:
+ onetime "^2.0.0"
+ signal-exit "^3.0.2"
+
+ret@~0.1.10:
+ version "0.1.15"
+ resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+
+right-align@^0.1.1:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
+ dependencies:
+ align-text "^0.1.1"
+
+rimraf@^2.2.8, rimraf@^2.6.1:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
+ dependencies:
+ glob "^7.0.5"
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+
+run-async@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0"
+ dependencies:
+ is-promise "^2.1.0"
+
+rx-lite-aggregates@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be"
+ dependencies:
+ rx-lite "*"
+
+rx-lite@*, rx-lite@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444"
+
+safe-buffer@5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
+
+safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+
+safe-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+ dependencies:
+ ret "~0.1.10"
+
+"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+
+sane@~1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/sane/-/sane-1.6.0.tgz#9610c452307a135d29c1fdfe2547034180c46775"
+ dependencies:
+ anymatch "^1.3.0"
+ exec-sh "^0.2.0"
+ fb-watchman "^1.8.0"
+ minimatch "^3.0.2"
+ minimist "^1.1.1"
+ walker "~1.0.5"
+ watch "~0.10.0"
+
+sax@^1.2.1, sax@^1.2.4, sax@~1.2.1:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+
+schedule@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/schedule/-/schedule-0.4.0.tgz#fa20cfd0bfbf91c47d02272fd7096780d3170bbb"
+ dependencies:
+ object-assign "^4.1.1"
+
+schema-utils@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.3.0.tgz#f5877222ce3e931edae039f17eb3716e7137f8cf"
+ dependencies:
+ ajv "^5.0.0"
+
+select-hose@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca"
+
+selfsigned@^1.9.1:
+ version "1.10.3"
+ resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.3.tgz#d628ecf9e3735f84e8bafba936b3cf85bea43823"
+ dependencies:
+ node-forge "0.7.5"
+
+semver-diff@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36"
+ dependencies:
+ semver "^5.0.3"
+
+"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1:
+ version "5.5.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477"
+
+send@0.16.2:
+ version "0.16.2"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1"
+ dependencies:
+ debug "2.6.9"
+ depd "~1.1.2"
+ destroy "~1.0.4"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ fresh "0.5.2"
+ http-errors "~1.6.2"
+ mime "1.4.1"
+ ms "2.0.0"
+ on-finished "~2.3.0"
+ range-parser "~1.2.0"
+ statuses "~1.4.0"
+
+serve-index@^1.7.2:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239"
+ dependencies:
+ accepts "~1.3.4"
+ batch "0.6.1"
+ debug "2.6.9"
+ escape-html "~1.0.3"
+ http-errors "~1.6.2"
+ mime-types "~2.1.17"
+ parseurl "~1.3.2"
+
+serve-static@1.13.2:
+ version "1.13.2"
+ resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1"
+ dependencies:
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ parseurl "~1.3.2"
+ send "0.16.2"
+
+serviceworker-cache-polyfill@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/serviceworker-cache-polyfill/-/serviceworker-cache-polyfill-4.0.0.tgz#de19ee73bef21ab3c0740a37b33db62464babdeb"
+
+set-blocking@^2.0.0, set-blocking@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+
+set-value@^0.4.3:
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.1"
+ to-object-path "^0.3.0"
+
+set-value@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274"
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.3"
+ split-string "^3.0.1"
+
+setimmediate@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+
+setprototypeof@1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04"
+
+setprototypeof@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
+
+sha.js@^2.4.0, sha.js@^2.4.8:
+ version "2.4.11"
+ resolved "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+shebang-command@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+ dependencies:
+ shebang-regex "^1.0.0"
+
+shebang-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+
+shell-quote@1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767"
+ dependencies:
+ array-filter "~0.0.0"
+ array-map "~0.0.0"
+ array-reduce "~0.0.0"
+ jsonify "~0.0.0"
+
+shellwords@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b"
+
+signal-exit@^3.0.0, signal-exit@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
+
+slash@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
+
+slice-ansi@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d"
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+
+snapdragon-node@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+ dependencies:
+ define-property "^1.0.0"
+ isobject "^3.0.0"
+ snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+ dependencies:
+ kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
+ dependencies:
+ base "^0.11.1"
+ debug "^2.2.0"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ map-cache "^0.2.2"
+ source-map "^0.5.6"
+ source-map-resolve "^0.5.0"
+ use "^3.1.0"
+
+sockjs-client@1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.5.tgz#1bb7c0f7222c40f42adf14f4442cbd1269771a83"
+ dependencies:
+ debug "^2.6.6"
+ eventsource "0.1.6"
+ faye-websocket "~0.11.0"
+ inherits "^2.0.1"
+ json3 "^3.3.2"
+ url-parse "^1.1.8"
+
+sockjs@0.3.19:
+ version "0.3.19"
+ resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d"
+ dependencies:
+ faye-websocket "^0.10.0"
+ uuid "^3.0.1"
+
+sort-keys@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad"
+ dependencies:
+ is-plain-obj "^1.0.0"
+
+source-list-map@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085"
+
+source-map-resolve@^0.5.0:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259"
+ dependencies:
+ atob "^2.1.1"
+ decode-uri-component "^0.2.0"
+ resolve-url "^0.2.1"
+ source-map-url "^0.4.0"
+ urix "^0.1.0"
+
+source-map-support@^0.4.15:
+ version "0.4.18"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
+ dependencies:
+ source-map "^0.5.6"
+
+source-map-url@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
+
+source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+
+source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+
+spdx-correct@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82"
+ dependencies:
+ spdx-expression-parse "^3.0.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9"
+
+spdx-expression-parse@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0"
+ dependencies:
+ spdx-exceptions "^2.1.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz#e2a303236cac54b04031fa7a5a79c7e701df852f"
+
+spdy-transport@^2.0.18:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.1.0.tgz#4bbb15aaffed0beefdd56ad61dbdc8ba3e2cb7a1"
+ dependencies:
+ debug "^2.6.8"
+ detect-node "^2.0.3"
+ hpack.js "^2.1.6"
+ obuf "^1.1.1"
+ readable-stream "^2.2.9"
+ safe-buffer "^5.0.1"
+ wbuf "^1.7.2"
+
+spdy@^3.4.1:
+ version "3.4.7"
+ resolved "https://registry.yarnpkg.com/spdy/-/spdy-3.4.7.tgz#42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc"
+ dependencies:
+ debug "^2.6.8"
+ handle-thing "^1.2.5"
+ http-deceiver "^1.2.7"
+ safe-buffer "^5.0.1"
+ select-hose "^2.0.0"
+ spdy-transport "^2.0.18"
+
+split-string@^3.0.1, split-string@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+ dependencies:
+ extend-shallow "^3.0.0"
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+
+sshpk@^1.7.0:
+ version "1.14.2"
+ resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.2.tgz#c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98"
+ dependencies:
+ asn1 "~0.2.3"
+ assert-plus "^1.0.0"
+ dashdash "^1.12.0"
+ getpass "^0.1.1"
+ safer-buffer "^2.0.2"
+ optionalDependencies:
+ bcrypt-pbkdf "^1.0.0"
+ ecc-jsbn "~0.1.1"
+ jsbn "~0.1.0"
+ tweetnacl "~0.14.0"
+
+static-extend@^0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+ dependencies:
+ define-property "^0.2.5"
+ object-copy "^0.1.0"
+
+"statuses@>= 1.3.1 < 2", "statuses@>= 1.4.0 < 2":
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
+
+statuses@~1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
+
+stream-browserify@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db"
+ dependencies:
+ inherits "~2.0.1"
+ readable-stream "^2.0.2"
+
+stream-http@^2.7.2:
+ version "2.8.3"
+ resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc"
+ dependencies:
+ builtin-status-codes "^3.0.0"
+ inherits "^2.0.1"
+ readable-stream "^2.3.6"
+ to-arraybuffer "^1.0.0"
+ xtend "^4.0.0"
+
+strict-uri-encode@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
+
+string-length@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/string-length/-/string-length-1.0.1.tgz#56970fb1c38558e9e70b728bf3de269ac45adfac"
+ dependencies:
+ strip-ansi "^3.0.0"
+
+string-width@^1.0.1, string-width@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ strip-ansi "^3.0.0"
+
+"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^4.0.0"
+
+string_decoder@^1.0.0, string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ dependencies:
+ safe-buffer "~5.1.0"
+
+string_decoder@~0.10.x:
+ version "0.10.31"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+
+strip-ansi@3.0.1, strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+ dependencies:
+ ansi-regex "^2.0.0"
+
+strip-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+ dependencies:
+ ansi-regex "^3.0.0"
+
+strip-bom@3.0.0, strip-bom@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+
+strip-bom@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
+ dependencies:
+ is-utf8 "^0.2.0"
+
+strip-eof@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
+
+strip-indent@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2"
+ dependencies:
+ get-stdin "^4.0.1"
+
+strip-json-comments@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+
+style-loader@0.19.0:
+ version "0.19.0"
+ resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.19.0.tgz#7258e788f0fee6a42d710eaf7d6c2412a4c50759"
+ dependencies:
+ loader-utils "^1.0.2"
+ schema-utils "^0.3.0"
+
+supports-color@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+
+supports-color@^3.1.2, supports-color@^3.2.3:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
+ dependencies:
+ has-flag "^1.0.0"
+
+supports-color@^4.2.1:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b"
+ dependencies:
+ has-flag "^2.0.0"
+
+supports-color@^5.1.0, supports-color@^5.3.0, supports-color@^5.4.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ dependencies:
+ has-flag "^3.0.0"
+
+svgo@^0.7.0:
+ version "0.7.2"
+ resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5"
+ dependencies:
+ coa "~1.0.1"
+ colors "~1.1.2"
+ csso "~2.3.1"
+ js-yaml "~3.7.0"
+ mkdirp "~0.5.1"
+ sax "~1.2.1"
+ whet.extend "~0.9.9"
+
+sw-precache-webpack-plugin@0.11.4:
+ version "0.11.4"
+ resolved "https://registry.yarnpkg.com/sw-precache-webpack-plugin/-/sw-precache-webpack-plugin-0.11.4.tgz#a695017e54eed575551493a519dc1da8da2dc5e0"
+ dependencies:
+ del "^2.2.2"
+ sw-precache "^5.1.1"
+ uglify-js "^3.0.13"
+
+sw-precache@^5.1.1:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/sw-precache/-/sw-precache-5.2.1.tgz#06134f319eec68f3b9583ce9a7036b1c119f7179"
+ dependencies:
+ dom-urls "^1.1.0"
+ es6-promise "^4.0.5"
+ glob "^7.1.1"
+ lodash.defaults "^4.2.0"
+ lodash.template "^4.4.0"
+ meow "^3.7.0"
+ mkdirp "^0.5.1"
+ pretty-bytes "^4.0.2"
+ sw-toolbox "^3.4.0"
+ update-notifier "^2.3.0"
+
+sw-toolbox@^3.4.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/sw-toolbox/-/sw-toolbox-3.6.0.tgz#26df1d1c70348658e4dea2884319149b7b3183b5"
+ dependencies:
+ path-to-regexp "^1.0.1"
+ serviceworker-cache-polyfill "^4.0.0"
+
+symbol-tree@^3.2.1:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6"
+
+table@^4.0.1:
+ version "4.0.3"
+ resolved "http://registry.npmjs.org/table/-/table-4.0.3.tgz#00b5e2b602f1794b9acaf9ca908a76386a7813bc"
+ dependencies:
+ ajv "^6.0.1"
+ ajv-keywords "^3.0.0"
+ chalk "^2.1.0"
+ lodash "^4.17.4"
+ slice-ansi "1.0.0"
+ string-width "^2.1.1"
+
+tapable@^0.2.7:
+ version "0.2.8"
+ resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22"
+
+tar@^4:
+ version "4.4.6"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b"
+ dependencies:
+ chownr "^1.0.1"
+ fs-minipass "^1.2.5"
+ minipass "^2.3.3"
+ minizlib "^1.1.0"
+ mkdirp "^0.5.0"
+ safe-buffer "^5.1.2"
+ yallist "^3.0.2"
+
+term-size@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69"
+ dependencies:
+ execa "^0.7.0"
+
+test-exclude@^4.2.1:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.3.tgz#a9a5e64474e4398339245a0a769ad7c2f4a97c20"
+ dependencies:
+ arrify "^1.0.1"
+ micromatch "^2.3.11"
+ object-assign "^4.1.0"
+ read-pkg-up "^1.0.1"
+ require-main-filename "^1.0.1"
+
+text-table@0.2.0, text-table@~0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
+
+throat@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/throat/-/throat-3.2.0.tgz#50cb0670edbc40237b9e347d7e1f88e4620af836"
+
+through@^2.3.6:
+ version "2.3.8"
+ resolved "http://registry.npmjs.org/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+
+thunky@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.0.2.tgz#a862e018e3fb1ea2ec3fce5d55605cf57f247371"
+
+time-stamp@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-2.1.0.tgz#6c5c0b2bc835a244616abcfddf81ce13a1975c9f"
+
+timed-out@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
+
+timers-browserify@^2.0.4:
+ version "2.0.10"
+ resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae"
+ dependencies:
+ setimmediate "^1.0.4"
+
+tmp@^0.0.33:
+ version "0.0.33"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
+ dependencies:
+ os-tmpdir "~1.0.2"
+
+tmpl@1.0.x:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1"
+
+to-arraybuffer@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
+
+to-fast-properties@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
+
+to-object-path@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+ dependencies:
+ kind-of "^3.0.2"
+
+to-regex-range@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+ dependencies:
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+
+to-regex@^3.0.1, to-regex@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+ dependencies:
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ regex-not "^1.0.2"
+ safe-regex "^1.1.0"
+
+toposort@^1.0.0:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz#2e68442d9f64ec720b8cc89e6443ac6caa950029"
+
+tough-cookie@^2.3.2, tough-cookie@~2.4.3:
+ version "2.4.3"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781"
+ dependencies:
+ psl "^1.1.24"
+ punycode "^1.4.1"
+
+tr46@~0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
+
+trim-newlines@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613"
+
+trim-right@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
+
+tty-browserify@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
+
+tunnel-agent@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+ dependencies:
+ safe-buffer "^5.0.1"
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+ version "0.14.5"
+ resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+
+type-check@~0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
+ dependencies:
+ prelude-ls "~1.1.2"
+
+type-is@~1.6.15, type-is@~1.6.16:
+ version "1.6.16"
+ resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194"
+ dependencies:
+ media-typer "0.3.0"
+ mime-types "~2.1.18"
+
+typedarray@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+
+uglify-js@3.4.x, uglify-js@^3.0.13, uglify-js@^3.1.4:
+ version "3.4.9"
+ resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3"
+ dependencies:
+ commander "~2.17.1"
+ source-map "~0.6.1"
+
+uglify-js@^2.8.29:
+ version "2.8.29"
+ resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd"
+ dependencies:
+ source-map "~0.5.1"
+ yargs "~3.10.0"
+ optionalDependencies:
+ uglify-to-browserify "~1.0.0"
+
+uglify-to-browserify@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
+
+uglifyjs-webpack-plugin@^0.4.6:
+ version "0.4.6"
+ resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz#b951f4abb6bd617e66f63eb891498e391763e309"
+ dependencies:
+ source-map "^0.5.6"
+ uglify-js "^2.8.29"
+ webpack-sources "^1.0.1"
+
+union-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"
+ dependencies:
+ arr-union "^3.1.0"
+ get-value "^2.0.6"
+ is-extendable "^0.1.1"
+ set-value "^0.4.3"
+
+uniq@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
+
+uniqs@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02"
+
+unique-string@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a"
+ dependencies:
+ crypto-random-string "^1.0.0"
+
+universalify@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
+
+unpipe@1.0.0, unpipe@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+
+unset-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+ dependencies:
+ has-value "^0.3.1"
+ isobject "^3.0.0"
+
+unzip-response@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97"
+
+upath@^1.0.5:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd"
+
+update-notifier@^2.3.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6"
+ dependencies:
+ boxen "^1.2.1"
+ chalk "^2.0.1"
+ configstore "^3.0.0"
+ import-lazy "^2.1.0"
+ is-ci "^1.0.10"
+ is-installed-globally "^0.1.0"
+ is-npm "^1.0.0"
+ latest-version "^3.0.0"
+ semver-diff "^2.0.0"
+ xdg-basedir "^3.0.0"
+
+upper-case@^1.1.1:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598"
+
+uri-js@^4.2.2:
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"
+ dependencies:
+ punycode "^2.1.0"
+
+urijs@^1.16.1:
+ version "1.19.1"
+ resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.1.tgz#5b0ff530c0cbde8386f6342235ba5ca6e995d25a"
+
+urix@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+
+url-loader@0.6.2:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-0.6.2.tgz#a007a7109620e9d988d14bce677a1decb9a993f7"
+ dependencies:
+ loader-utils "^1.0.2"
+ mime "^1.4.1"
+ schema-utils "^0.3.0"
+
+url-parse-lax@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73"
+ dependencies:
+ prepend-http "^1.0.1"
+
+url-parse@^1.1.8, url-parse@^1.4.3:
+ version "1.4.3"
+ resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.3.tgz#bfaee455c889023219d757e045fa6a684ec36c15"
+ dependencies:
+ querystringify "^2.0.0"
+ requires-port "^1.0.0"
+
+url@^0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
+ dependencies:
+ punycode "1.3.2"
+ querystring "0.2.0"
+
+use@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
+
+util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+
+util@0.10.3:
+ version "0.10.3"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
+ dependencies:
+ inherits "2.0.1"
+
+util@^0.10.3:
+ version "0.10.4"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901"
+ dependencies:
+ inherits "2.0.3"
+
+utila@~0.3:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/utila/-/utila-0.3.3.tgz#d7e8e7d7e309107092b05f8d9688824d633a4226"
+
+utila@~0.4:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c"
+
+utils-merge@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+
+uuid@^3.0.1, uuid@^3.3.2:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131"
+
+validate-npm-package-license@^3.0.1:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
+ dependencies:
+ spdx-correct "^3.0.0"
+ spdx-expression-parse "^3.0.0"
+
+vary@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+
+vendors@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz#7fcb5eef9f5623b156bcea89ec37d63676f21801"
+
+verror@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
+ dependencies:
+ assert-plus "^1.0.0"
+ core-util-is "1.0.2"
+ extsprintf "^1.2.0"
+
+vm-browserify@0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
+ dependencies:
+ indexof "0.0.1"
+
+walker@~1.0.5:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb"
+ dependencies:
+ makeerror "1.0.x"
+
+watch@~0.10.0:
+ version "0.10.0"
+ resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc"
+
+watchpack@^1.4.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00"
+ dependencies:
+ chokidar "^2.0.2"
+ graceful-fs "^4.1.2"
+ neo-async "^2.5.0"
+
+wbuf@^1.1.0, wbuf@^1.7.2:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df"
+ dependencies:
+ minimalistic-assert "^1.0.0"
+
+webidl-conversions@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
+
+webidl-conversions@^4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
+
+webpack-dev-middleware@1.12.2:
+ version "1.12.2"
+ resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz#f8fc1120ce3b4fc5680ceecb43d777966b21105e"
+ dependencies:
+ memory-fs "~0.4.1"
+ mime "^1.5.0"
+ path-is-absolute "^1.0.0"
+ range-parser "^1.0.3"
+ time-stamp "^2.0.0"
+
+webpack-dev-server@2.11.3:
+ version "2.11.3"
+ resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-2.11.3.tgz#3fd48a402164a6569d94d3d17f131432631b4873"
+ dependencies:
+ ansi-html "0.0.7"
+ array-includes "^3.0.3"
+ bonjour "^3.5.0"
+ chokidar "^2.0.0"
+ compression "^1.5.2"
+ connect-history-api-fallback "^1.3.0"
+ debug "^3.1.0"
+ del "^3.0.0"
+ express "^4.16.2"
+ html-entities "^1.2.0"
+ http-proxy-middleware "~0.17.4"
+ import-local "^1.0.0"
+ internal-ip "1.2.0"
+ ip "^1.1.5"
+ killable "^1.0.0"
+ loglevel "^1.4.1"
+ opn "^5.1.0"
+ portfinder "^1.0.9"
+ selfsigned "^1.9.1"
+ serve-index "^1.7.2"
+ sockjs "0.3.19"
+ sockjs-client "1.1.5"
+ spdy "^3.4.1"
+ strip-ansi "^3.0.0"
+ supports-color "^5.1.0"
+ webpack-dev-middleware "1.12.2"
+ yargs "6.6.0"
+
+webpack-manifest-plugin@1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/webpack-manifest-plugin/-/webpack-manifest-plugin-1.3.2.tgz#5ea8ee5756359ddc1d98814324fe43496349a7d4"
+ dependencies:
+ fs-extra "^0.30.0"
+ lodash ">=3.5 <5"
+
+webpack-sources@^1.0.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.2.0.tgz#18181e0d013fce096faf6f8e6d41eeffffdceac2"
+ dependencies:
+ source-list-map "^2.0.0"
+ source-map "~0.6.1"
+
+webpack@3.8.1:
+ version "3.8.1"
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.8.1.tgz#b16968a81100abe61608b0153c9159ef8bb2bd83"
+ dependencies:
+ acorn "^5.0.0"
+ acorn-dynamic-import "^2.0.0"
+ ajv "^5.1.5"
+ ajv-keywords "^2.0.0"
+ async "^2.1.2"
+ enhanced-resolve "^3.4.0"
+ escope "^3.6.0"
+ interpret "^1.0.0"
+ json-loader "^0.5.4"
+ json5 "^0.5.1"
+ loader-runner "^2.3.0"
+ loader-utils "^1.1.0"
+ memory-fs "~0.4.1"
+ mkdirp "~0.5.0"
+ node-libs-browser "^2.0.0"
+ source-map "^0.5.3"
+ supports-color "^4.2.1"
+ tapable "^0.2.7"
+ uglifyjs-webpack-plugin "^0.4.6"
+ watchpack "^1.4.0"
+ webpack-sources "^1.0.1"
+ yargs "^8.0.2"
+
+websocket-driver@>=0.5.1:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb"
+ dependencies:
+ http-parser-js ">=0.4.0"
+ websocket-extensions ">=0.1.1"
+
+websocket-extensions@>=0.1.1:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29"
+
+whatwg-encoding@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.4.tgz#63fb016b7435b795d9025632c086a5209dbd2621"
+ dependencies:
+ iconv-lite "0.4.23"
+
+whatwg-fetch@2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84"
+
+whatwg-url@^4.3.0:
+ version "4.8.0"
+ resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.8.0.tgz#d2981aa9148c1e00a41c5a6131166ab4683bbcc0"
+ dependencies:
+ tr46 "~0.0.3"
+ webidl-conversions "^3.0.0"
+
+whet.extend@~0.9.9:
+ version "0.9.9"
+ resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1"
+
+which-module@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
+
+which-module@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
+
+which@^1.2.12, which@^1.2.14, which@^1.2.9, which@^1.3.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+ dependencies:
+ isexe "^2.0.0"
+
+wide-align@^1.1.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
+ dependencies:
+ string-width "^1.0.2 || 2"
+
+widest-line@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.0.tgz#0142a4e8a243f8882c0233aa0e0281aa76152273"
+ dependencies:
+ string-width "^2.1.1"
+
+window-size@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
+
+wordwrap@0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
+
+wordwrap@~0.0.2:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
+
+wordwrap@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
+
+worker-farm@^1.3.1:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0"
+ dependencies:
+ errno "~0.1.7"
+
+wrap-ansi@^2.0.0:
+ version "2.1.0"
+ resolved "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+
+write-file-atomic@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab"
+ dependencies:
+ graceful-fs "^4.1.11"
+ imurmurhash "^0.1.4"
+ signal-exit "^3.0.2"
+
+write@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757"
+ dependencies:
+ mkdirp "^0.5.1"
+
+xdg-basedir@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4"
+
+xml-name-validator@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635"
+
+xtend@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
+
+y18n@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
+
+yallist@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+
+yallist@^3.0.0, yallist@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9"
+
+yargs-parser@^4.2.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c"
+ dependencies:
+ camelcase "^3.0.0"
+
+yargs-parser@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a"
+ dependencies:
+ camelcase "^3.0.0"
+
+yargs-parser@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9"
+ dependencies:
+ camelcase "^4.1.0"
+
+yargs@6.6.0:
+ version "6.6.0"
+ resolved "http://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208"
+ dependencies:
+ camelcase "^3.0.0"
+ cliui "^3.2.0"
+ decamelize "^1.1.1"
+ get-caller-file "^1.0.1"
+ os-locale "^1.4.0"
+ read-pkg-up "^1.0.1"
+ require-directory "^2.1.1"
+ require-main-filename "^1.0.1"
+ set-blocking "^2.0.0"
+ string-width "^1.0.2"
+ which-module "^1.0.0"
+ y18n "^3.2.1"
+ yargs-parser "^4.2.0"
+
+yargs@^7.0.2:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8"
+ dependencies:
+ camelcase "^3.0.0"
+ cliui "^3.2.0"
+ decamelize "^1.1.1"
+ get-caller-file "^1.0.1"
+ os-locale "^1.4.0"
+ read-pkg-up "^1.0.1"
+ require-directory "^2.1.1"
+ require-main-filename "^1.0.1"
+ set-blocking "^2.0.0"
+ string-width "^1.0.2"
+ which-module "^1.0.0"
+ y18n "^3.2.1"
+ yargs-parser "^5.0.0"
+
+yargs@^8.0.2:
+ version "8.0.2"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360"
+ dependencies:
+ camelcase "^4.1.0"
+ cliui "^3.2.0"
+ decamelize "^1.1.1"
+ get-caller-file "^1.0.1"
+ os-locale "^2.0.0"
+ read-pkg-up "^2.0.0"
+ require-directory "^2.1.1"
+ require-main-filename "^1.0.1"
+ set-blocking "^2.0.0"
+ string-width "^2.0.0"
+ which-module "^2.0.0"
+ y18n "^3.2.1"
+ yargs-parser "^7.0.0"
+
+yargs@~3.10.0:
+ version "3.10.0"
+ resolved "http://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
+ dependencies:
+ camelcase "^1.0.2"
+ cliui "^2.1.0"
+ decamelize "^1.0.0"
+ window-size "0.1.0"
diff --git a/devtools/client/debugger/test/mochitest/examples/reload/code_reload_1.js b/devtools/client/debugger/test/mochitest/examples/reload/code_reload_1.js
new file mode 100644
index 0000000000..52e7f61a01
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/reload/code_reload_1.js
@@ -0,0 +1,3 @@
+function foo(n) {
+ console.log("yo")
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/same-script.js b/devtools/client/debugger/test/mochitest/examples/same-script.js
new file mode 100644
index 0000000000..f2c085fece
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/same-script.js
@@ -0,0 +1,9 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+function sameSourceDistinctThread() {
+ console.log("same source distinct thread");
+}
+
+addEventListener("click", sameSourceDistinctThread);
+addEventListener("message", sameSourceDistinctThread);
diff --git a/devtools/client/debugger/test/mochitest/examples/scopes-worker.js b/devtools/client/debugger/test/mochitest/examples/scopes-worker.js
new file mode 100644
index 0000000000..83d7c331bd
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/scopes-worker.js
@@ -0,0 +1,13 @@
+function f() {
+ var var_array = ["mango","pamplemousse","pineapple"];
+ var var_tarray = new Uint8Array([42,43,44]);
+ var var_set = new Set(["papaya","banana"]);
+ var var_map = new Map([[1,"one"],[2,"two"]]);
+ var var_weakmap = new WeakMap();
+ var key = { foo: "foo" }, value = { bar: "bar" };
+ var_weakmap.set(key, value);
+ var var_weakset = new WeakSet();
+ var_weakset.add(key);
+ return 0;
+}
+f();
diff --git a/devtools/client/debugger/test/mochitest/examples/script-mutate.js b/devtools/client/debugger/test/mochitest/examples/script-mutate.js
new file mode 100644
index 0000000000..c47a523d60
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/script-mutate.js
@@ -0,0 +1,20 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+function mutate() {
+ const phonebook = {
+ S: {
+ sarah: {
+ lastName: "Doe"
+ },
+ serena: {
+ lastName: "Williams"
+ }
+ }
+ };
+
+ debugger;
+ phonebook.S.sarah.lastName = "Pierce";
+ debugger;
+ phonebook.S.sarah.timezone = "PST";
+ debugger;
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/script-switching-01.js b/devtools/client/debugger/test/mochitest/examples/script-switching-01.js
new file mode 100644
index 0000000000..0223deffd8
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/script-switching-01.js
@@ -0,0 +1,10 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+function a() {}
+function firstCall() {
+ a();
+ secondCall();
+ return 43;
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/script-switching-02.js b/devtools/client/debugger/test/mochitest/examples/script-switching-02.js
new file mode 100644
index 0000000000..1d93794e75
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/script-switching-02.js
@@ -0,0 +1,18 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+function secondCall() {
+ // This comment is useful: ☺
+ debugger;
+ function foo() {}
+ if (x) {
+ foo();
+ }
+ return 44;
+}
+
+var x = true;
+// For testing that anonymous functions do not show up in the
+// quick open panel browser_dbg-quick-open.js
+() => { }
+console.log("hi")
diff --git a/devtools/client/debugger/test/mochitest/examples/service-worker.sjs b/devtools/client/debugger/test/mochitest/examples/service-worker.sjs
new file mode 100644
index 0000000000..b48bb9e907
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/service-worker.sjs
@@ -0,0 +1,38 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+const body = `
+dump("Starting\\n");
+
+self.addEventListener("activate", event => {
+ dump("Activate\\n");
+ event.waitUntil(self.clients.claim());
+});
+
+self.addEventListener("fetch", event => {
+ const url = event.request.url;
+ dump("Fetch: " + url + "\\n");
+ if (url.includes("whatever")) {
+ const response = new Response("Service worker response STATUS", { statusText: "OK" });
+ event.respondWith(response);
+ }
+});
+
+self.addEventListener("install", event => {
+ dump("Install\\n");
+});
+`;
+
+function handleRequest(request, response) {
+ response.setHeader("Content-Type", "text/javascript");
+
+ const arr = /setStatus=(.*)/.exec(request.queryString);
+ if (arr) {
+ setState("status", arr[1]);
+ }
+
+ const status = getState("status");
+ response.write(body.replace("STATUS", status));
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/shared-worker.js b/devtools/client/debugger/test/mochitest/examples/shared-worker.js
new file mode 100644
index 0000000000..92ead67b9c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/shared-worker.js
@@ -0,0 +1 @@
+console.log("I am a shared worker");
diff --git a/devtools/client/debugger/test/mochitest/examples/simple-worker.js b/devtools/client/debugger/test/mochitest/examples/simple-worker.js
new file mode 100644
index 0000000000..d9c4acf9cb
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/simple-worker.js
@@ -0,0 +1,11 @@
+var count = 0;
+function timer() {
+ var n = ++count;
+ console.log("WORKER SAYS HELLO! " + n);
+}
+
+setInterval(timer, 1000);
+
+self.onmessage = function onmessage() {
+ console.log("hi");
+};
diff --git a/devtools/client/debugger/test/mochitest/examples/simple1.js b/devtools/client/debugger/test/mochitest/examples/simple1.js
new file mode 100644
index 0000000000..4a677fe459
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/simple1.js
@@ -0,0 +1,62 @@
+function main() {
+ // A comment so we can test that breakpoint sliding works across
+ // multiple lines
+ const func = foo(1, 2);
+ const result = func();
+ return result;
+}
+
+function doEval() {
+ eval(
+ "(" +
+ function() {
+ debugger;
+
+ window.evaledFunc = function() {
+ var foo = 1;
+ var bar = 2;
+ return foo + bar;
+ };
+ }.toString() +
+ ")()"
+ );
+}
+
+function doNamedEval() {
+ eval(
+ "(" +
+ function() {
+ debugger;
+
+ window.evaledFunc = function() {
+ var foo = 1;
+ var bar = 2;
+ return foo + bar;
+ };
+ }.toString() +
+ ")();\n //# sourceURL=evaled.js"
+ );
+}
+
+class MyClass {
+ constructor(a, b, ...rest) {
+ this.#a = a;
+ this.#b = b;
+ }
+
+ #a;
+ #b;
+
+ test(...args) {}
+ #privateFunc(a, b) {}
+}
+
+class Klass {
+ constructor() {
+ this.id = Math.random();
+ }
+ test() {}
+}
+
+const o = 1 + 2;
+console.log(o);
diff --git a/devtools/client/debugger/test/mochitest/examples/simple2.js b/devtools/client/debugger/test/mochitest/examples/simple2.js
new file mode 100644
index 0000000000..40c280edfe
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/simple2.js
@@ -0,0 +1,6 @@
+function foo(x, y) {
+ function bar() {
+ return x + y;
+ }
+ return bar;
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/simple3.js b/devtools/client/debugger/test/mochitest/examples/simple3.js
new file mode 100644
index 0000000000..7b1f33a195
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/simple3.js
@@ -0,0 +1,19 @@
+function simple() {
+ const obj = { foo: 1, bar: 2 };
+ const func = foo(1, 2);
+ const result = func();
+ return result;
+}
+
+function nestedA() {
+ nestedB();
+}
+
+function nestedB() {
+ nestedC();
+}
+
+function nestedC() {
+ debugger;
+ return 1;
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/simple4.js b/devtools/client/debugger/test/mochitest/examples/simple4.js
new file mode 100644
index 0000000000..2ce4eb991d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/simple4.js
@@ -0,0 +1,15 @@
+function funcA() {
+ debugger;
+ funcB();
+ funcC();
+}
+
+function funcB() {
+ console.log("Hello!");
+}
+
+function funcC() {
+ console.log("You made it!");
+}
+
+funcA();
diff --git a/devtools/client/debugger/test/mochitest/examples/sjs_slow-load.sjs b/devtools/client/debugger/test/mochitest/examples/sjs_slow-load.sjs
new file mode 100644
index 0000000000..7fb93800b1
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sjs_slow-load.sjs
@@ -0,0 +1,31 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+/* exported handleRequest */
+
+"use strict";
+
+function handleRequest(request, response) {
+ const { scheme, host, path, queryString } = request;
+ const params = queryString.split("&").reduce((acc, item) => {
+ const [key, value] = item.split("=");
+ acc[key] = value;
+ return acc;
+ }, {});
+
+ const basePath = path.substr(0, path.lastIndexOf("/") + 1);
+ const redirectURL = `${scheme}://${host}${basePath}/${params.file}`;
+ const delayMs = params.delay ? parseInt(params.delay) : 2000;
+
+ // SJS code doesn't have a setTimeout so we just busy-loop...
+ const start = Date.now();
+ while (Date.now() < start + delayMs) continue;
+
+ response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
+ response.setHeader("Pragma", "no-cache");
+ response.setHeader("Expires", "0");
+ response.setHeader("Access-Control-Allow-Origin", "*", false);
+
+ response.setStatusLine(request.httpVersion, 302, "Found");
+ response.setHeader("Location", redirectURL);
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/source-pragma.js b/devtools/client/debugger/test/mochitest/examples/source-pragma.js
new file mode 100644
index 0000000000..f4feed5d72
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/source-pragma.js
@@ -0,0 +1,6 @@
+console.log("ran script!");
+
+function noGC() {}
+
+//# sourceURL=fake.js
+//# sourceMappingURL=source-pragma.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/source-pragma.js.map b/devtools/client/debugger/test/mochitest/examples/source-pragma.js.map
new file mode 100644
index 0000000000..a53a1d2035
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/source-pragma.js.map
@@ -0,0 +1,10 @@
+{
+ "version": 3,
+ "mappings": "",
+ "sources": [
+ "fake-mapped.js"
+ ],
+ "sourcesContent": [
+ ""
+ ]
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/.rpt2_cache/120bf459f95b8b447674b99c6fe5d040b99b6a97/types/cache/f67752e2d3a8fd18a75558156ccfd8c764b544a1 b/devtools/client/debugger/test/mochitest/examples/sourcemapped/.rpt2_cache/120bf459f95b8b447674b99c6fe5d040b99b6a97/types/cache/f67752e2d3a8fd18a75558156ccfd8c764b544a1
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/.rpt2_cache/120bf459f95b8b447674b99c6fe5d040b99b6a97/types/cache/f67752e2d3a8fd18a75558156ccfd8c764b544a1
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/README.md b/devtools/client/debugger/test/mochitest/examples/sourcemapped/README.md
new file mode 100644
index 0000000000..8def8d6f40
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/README.md
@@ -0,0 +1,16 @@
+## Sourcemapped test fixtures
+
+The test fixtures in this folder are used to generate a suite of tests for sourcemapped
+files that have been passed through various tools like Babel and Typescript, and various
+bundlers like Rollup and Webpack.
+
+The fixtures follow a naming scheme where:
+
+* `babel-` means the file requires Babel in order to be consumed by a bundler.
+* `typescript-` means the file requires Typescript in order to be consumed by a bundler.
+* `-cjs` means the file is either:
+ * Written in CommonJS
+ * May be converted to CommonJS when Babel is enabled
+
+ This is used to exclude these files from processing by bundlers that expect input
+ files to be ES modules.
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/build.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/build.js
new file mode 100644
index 0000000000..72d96862b0
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/build.js
@@ -0,0 +1,82 @@
+#!env node
+
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+const util = require("util");
+const fs = require("fs");
+const path = require("path");
+const webpack = require("webpack");
+
+const fixturesFolder = path.join(__dirname, "fixtures");
+
+const tests = fs
+ .readdirSync(fixturesFolder)
+ .map(name => {
+ if (name[0] === ".") {
+ return;
+ }
+
+ const inputTS = path.join(fixturesFolder, name, "input.ts");
+ const inputJS = path.join(fixturesFolder, name, "input.js");
+
+ return [name, fs.existsSync(inputTS) ? inputTS : inputJS];
+ })
+ .filter(Boolean);
+
+(async function() {
+ const targets = [
+ await require("./builds/parcel")(tests, __dirname),
+ await require("./builds/webpack3")(tests, __dirname),
+ await require("./builds/webpack3-babel6")(tests, __dirname),
+ await require("./builds/webpack3-babel7")(tests, __dirname),
+ await require("./builds/webpack4")(tests, __dirname),
+ await require("./builds/webpack4-babel6")(tests, __dirname),
+ await require("./builds/webpack4-babel7")(tests, __dirname),
+ await require("./builds/rollup")(tests, __dirname),
+ await require("./builds/rollup-babel6")(tests, __dirname),
+ await require("./builds/rollup-babel7")(tests, __dirname)
+ ];
+
+ await util.promisify(webpack)({
+ context: __dirname,
+ entry: "babel-polyfill",
+ output: {
+ filename: "polyfill-bundle.js"
+ },
+ plugins: [new webpack.optimize.OccurrenceOrderPlugin(true)]
+ });
+
+ const examplesDir = path.join(__dirname, "..");
+ const html = path.join(examplesDir, "doc-sourcemapped.html");
+
+ fs.writeFileSync(
+ html,
+ fs.readFileSync(html, "utf8").replace(
+ /\n\s*<!-- INJECTED-START[\s\S]*INJECTED-END -->/,
+ `
+ <!-- INJECTED-START -->
+ <!--
+ Content generated by examples/sourcemapped/build.js.
+ Run "yarn build" to update.
+ -->${targets
+ .map(({ target, fixtures }) => {
+ return `\n <h2>${target}</h2>${fixtures
+ .map(
+ ({ name, testFnName, scriptPath }) =>
+ `\n <script src="${path.relative(
+ examplesDir,
+ scriptPath
+ )}"></script>` +
+ `\n <button onclick="${testFnName}()">Run ${name}</button>`
+ )
+ .join("")}`;
+ })
+ .join("")}
+ <!-- INJECTED-END -->`
+ )
+ );
+
+ console.log("DONE - If node is still running, just hit Ctrl+C. Parcel leaves things running for some reason.")
+})();
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/parcel/index.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/parcel/index.js
new file mode 100644
index 0000000000..09164384da
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/parcel/index.js
@@ -0,0 +1,69 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+const path = require("path");
+const util = require("util");
+const fs = require("fs");
+const _ = require("lodash");
+const Bundler = require("parcel-bundler");
+const convertSourceMap = require("convert-source-map");
+
+const TARGET_NAME = "parcel";
+
+module.exports = exports = async function(tests, dirname) {
+ const fixtures = [];
+ for (const [name, input] of tests) {
+ const testFnName = _.camelCase(`${TARGET_NAME}-${name}`);
+ const evalMaps = name.match(/-eval/);
+
+ console.log(`Building ${TARGET_NAME} test ${name}`);
+
+ const scriptPath = path.join(dirname, "output", TARGET_NAME, `${name}.js`);
+ const bundler = new Bundler(input, {
+ global: testFnName,
+ hmr: false,
+ watch: false,
+ logLevel: 0,
+ publicURL: ".",
+
+ outDir: path.dirname(scriptPath),
+ outFile: path.basename(scriptPath),
+ });
+
+ await bundler.bundle();
+
+ let code = fs.readFileSync(scriptPath, "utf8");
+
+ // Parcel doesn't offer a way to explicitly export the default property
+ // of the default object.
+ code += `\n;${testFnName} = ${testFnName}.default;`;
+ fs.writeFileSync(scriptPath, code);
+
+
+ const mapMatch = convertSourceMap.mapFileCommentRegex.exec(code);
+ const mapPath = path.resolve(path.dirname(scriptPath), mapMatch[1] || mapMatch[2]);
+
+ const map = JSON.parse(fs.readFileSync(mapPath, "utf8"));
+ map.sourceRoot = undefined;
+ map.sources = map.sources.map(source =>
+ source.replace(/^/, `${TARGET_NAME}://./${name}/`)
+ );
+ fs.writeFileSync(mapPath, JSON.stringify(map));
+
+ fixtures.push({
+ name,
+ testFnName,
+ scriptPath,
+ assets: [
+ scriptPath,
+ `${path.join(path.dirname(scriptPath), path.basename(scriptPath, path.extname(scriptPath)))}.map`,
+ ]
+ });
+ }
+
+ return {
+ target: TARGET_NAME,
+ fixtures
+ };
+};
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/parcel/package.json b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/parcel/package.json
new file mode 100644
index 0000000000..c5a9d377c7
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/parcel/package.json
@@ -0,0 +1,6 @@
+{
+ "dependencies": {
+ "convert-source-map": "^1.5.1",
+ "parcel-bundler": "^1.9.7"
+ }
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/parcel/yarn.lock b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/parcel/yarn.lock
new file mode 100644
index 0000000000..99adb7d854
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/parcel/yarn.lock
@@ -0,0 +1,4128 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@mrmlnc/readdir-enhanced@^2.2.1":
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde"
+ dependencies:
+ call-me-maybe "^1.0.1"
+ glob-to-regexp "^0.3.0"
+
+"@nodelib/fs.stat@^1.0.1":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.0.tgz#50c1e2260ac0ed9439a181de3725a0168d59c48a"
+
+abbrev@1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+
+acorn@^5.0.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8"
+
+alphanum-sort@^1.0.0, alphanum-sort@^1.0.1, alphanum-sort@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+
+ansi-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+
+ansi-styles@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+
+ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-to-html@^0.6.4:
+ version "0.6.6"
+ resolved "https://registry.yarnpkg.com/ansi-to-html/-/ansi-to-html-0.6.6.tgz#58a8d04b87ec9a85e3ad273c12a5fbc7147b9c42"
+ dependencies:
+ entities "^1.1.1"
+
+anymatch@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
+ dependencies:
+ micromatch "^3.1.4"
+ normalize-path "^2.1.1"
+
+aproba@^1.0.3:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
+
+are-we-there-yet@~1.1.2:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
+ dependencies:
+ delegates "^1.0.0"
+ readable-stream "^2.0.6"
+
+argparse@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+ dependencies:
+ sprintf-js "~1.0.2"
+
+arr-diff@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+
+arr-flatten@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+
+arr-union@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+
+array-unique@^0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+
+asn1.js@^4.0.0:
+ version "4.10.1"
+ resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"
+ dependencies:
+ bn.js "^4.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+assert@^1.1.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91"
+ dependencies:
+ util "0.10.3"
+
+assign-symbols@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+
+async-each@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
+
+async-limiter@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8"
+
+atob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a"
+
+autoprefixer@^6.3.1:
+ version "6.7.7"
+ resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-6.7.7.tgz#1dbd1c835658e35ce3f9984099db00585c782014"
+ dependencies:
+ browserslist "^1.7.6"
+ caniuse-db "^1.0.30000634"
+ normalize-range "^0.1.2"
+ num2fraction "^1.2.2"
+ postcss "^5.2.16"
+ postcss-value-parser "^3.2.3"
+
+babel-code-frame@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
+ dependencies:
+ chalk "^1.1.3"
+ esutils "^2.0.2"
+ js-tokens "^3.0.2"
+
+babel-core@^6.25.0, babel-core@^6.26.0:
+ version "6.26.3"
+ resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207"
+ dependencies:
+ babel-code-frame "^6.26.0"
+ babel-generator "^6.26.0"
+ babel-helpers "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-register "^6.26.0"
+ babel-runtime "^6.26.0"
+ babel-template "^6.26.0"
+ babel-traverse "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+ convert-source-map "^1.5.1"
+ debug "^2.6.9"
+ json5 "^0.5.1"
+ lodash "^4.17.4"
+ minimatch "^3.0.4"
+ path-is-absolute "^1.0.1"
+ private "^0.1.8"
+ slash "^1.0.0"
+ source-map "^0.5.7"
+
+babel-generator@^6.25.0, babel-generator@^6.26.0:
+ version "6.26.1"
+ resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90"
+ dependencies:
+ babel-messages "^6.23.0"
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ detect-indent "^4.0.0"
+ jsesc "^1.3.0"
+ lodash "^4.17.4"
+ source-map "^0.5.7"
+ trim-right "^1.0.1"
+
+babel-helper-builder-binary-assignment-operator-visitor@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664"
+ dependencies:
+ babel-helper-explode-assignable-expression "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-builder-react-jsx@^6.24.1:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz#39ff8313b75c8b65dceff1f31d383e0ff2a408a0"
+ dependencies:
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ esutils "^2.0.2"
+
+babel-helper-call-delegate@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d"
+ dependencies:
+ babel-helper-hoist-variables "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-define-map@^6.24.1:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f"
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ lodash "^4.17.4"
+
+babel-helper-explode-assignable-expression@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-function-name@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9"
+ dependencies:
+ babel-helper-get-function-arity "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-get-function-arity@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-hoist-variables@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-optimise-call-expression@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-regex@^6.24.1:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72"
+ dependencies:
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ lodash "^4.17.4"
+
+babel-helper-remap-async-to-generator@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b"
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-replace-supers@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"
+ dependencies:
+ babel-helper-optimise-call-expression "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helpers@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-messages@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-check-es2015-constants@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-syntax-async-functions@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
+
+babel-plugin-syntax-exponentiation-operator@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de"
+
+babel-plugin-syntax-jsx@^6.8.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946"
+
+babel-plugin-syntax-trailing-function-commas@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3"
+
+babel-plugin-transform-async-to-generator@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761"
+ dependencies:
+ babel-helper-remap-async-to-generator "^6.24.1"
+ babel-plugin-syntax-async-functions "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-arrow-functions@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoped-functions@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoping@^6.23.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f"
+ dependencies:
+ babel-runtime "^6.26.0"
+ babel-template "^6.26.0"
+ babel-traverse "^6.26.0"
+ babel-types "^6.26.0"
+ lodash "^4.17.4"
+
+babel-plugin-transform-es2015-classes@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db"
+ dependencies:
+ babel-helper-define-map "^6.24.1"
+ babel-helper-function-name "^6.24.1"
+ babel-helper-optimise-call-expression "^6.24.1"
+ babel-helper-replace-supers "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-computed-properties@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-destructuring@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-duplicate-keys@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-for-of@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-function-name@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b"
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-literals@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154"
+ dependencies:
+ babel-plugin-transform-es2015-modules-commonjs "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1, babel-plugin-transform-es2015-modules-commonjs@^6.26.0:
+ version "6.26.2"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3"
+ dependencies:
+ babel-plugin-transform-strict-mode "^6.24.1"
+ babel-runtime "^6.26.0"
+ babel-template "^6.26.0"
+ babel-types "^6.26.0"
+
+babel-plugin-transform-es2015-modules-systemjs@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23"
+ dependencies:
+ babel-helper-hoist-variables "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-umd@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468"
+ dependencies:
+ babel-plugin-transform-es2015-modules-amd "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-object-super@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d"
+ dependencies:
+ babel-helper-replace-supers "^6.24.1"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-parameters@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b"
+ dependencies:
+ babel-helper-call-delegate "^6.24.1"
+ babel-helper-get-function-arity "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-shorthand-properties@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-spread@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-sticky-regex@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc"
+ dependencies:
+ babel-helper-regex "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-template-literals@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-typeof-symbol@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-unicode-regex@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9"
+ dependencies:
+ babel-helper-regex "^6.24.1"
+ babel-runtime "^6.22.0"
+ regexpu-core "^2.0.0"
+
+babel-plugin-transform-exponentiation-operator@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e"
+ dependencies:
+ babel-helper-builder-binary-assignment-operator-visitor "^6.24.1"
+ babel-plugin-syntax-exponentiation-operator "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-react-jsx@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3"
+ dependencies:
+ babel-helper-builder-react-jsx "^6.24.1"
+ babel-plugin-syntax-jsx "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-regenerator@^6.22.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f"
+ dependencies:
+ regenerator-transform "^0.10.0"
+
+babel-plugin-transform-strict-mode@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-preset-env@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a"
+ dependencies:
+ babel-plugin-check-es2015-constants "^6.22.0"
+ babel-plugin-syntax-trailing-function-commas "^6.22.0"
+ babel-plugin-transform-async-to-generator "^6.22.0"
+ babel-plugin-transform-es2015-arrow-functions "^6.22.0"
+ babel-plugin-transform-es2015-block-scoped-functions "^6.22.0"
+ babel-plugin-transform-es2015-block-scoping "^6.23.0"
+ babel-plugin-transform-es2015-classes "^6.23.0"
+ babel-plugin-transform-es2015-computed-properties "^6.22.0"
+ babel-plugin-transform-es2015-destructuring "^6.23.0"
+ babel-plugin-transform-es2015-duplicate-keys "^6.22.0"
+ babel-plugin-transform-es2015-for-of "^6.23.0"
+ babel-plugin-transform-es2015-function-name "^6.22.0"
+ babel-plugin-transform-es2015-literals "^6.22.0"
+ babel-plugin-transform-es2015-modules-amd "^6.22.0"
+ babel-plugin-transform-es2015-modules-commonjs "^6.23.0"
+ babel-plugin-transform-es2015-modules-systemjs "^6.23.0"
+ babel-plugin-transform-es2015-modules-umd "^6.23.0"
+ babel-plugin-transform-es2015-object-super "^6.22.0"
+ babel-plugin-transform-es2015-parameters "^6.23.0"
+ babel-plugin-transform-es2015-shorthand-properties "^6.22.0"
+ babel-plugin-transform-es2015-spread "^6.22.0"
+ babel-plugin-transform-es2015-sticky-regex "^6.22.0"
+ babel-plugin-transform-es2015-template-literals "^6.22.0"
+ babel-plugin-transform-es2015-typeof-symbol "^6.23.0"
+ babel-plugin-transform-es2015-unicode-regex "^6.22.0"
+ babel-plugin-transform-exponentiation-operator "^6.22.0"
+ babel-plugin-transform-regenerator "^6.22.0"
+ browserslist "^3.2.6"
+ invariant "^2.2.2"
+ semver "^5.3.0"
+
+babel-register@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071"
+ dependencies:
+ babel-core "^6.26.0"
+ babel-runtime "^6.26.0"
+ core-js "^2.5.0"
+ home-or-tmp "^2.0.0"
+ lodash "^4.17.4"
+ mkdirp "^0.5.1"
+ source-map-support "^0.4.15"
+
+babel-runtime@^6.11.6, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
+ dependencies:
+ core-js "^2.4.0"
+ regenerator-runtime "^0.11.0"
+
+babel-template@^6.24.1, babel-template@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
+ dependencies:
+ babel-runtime "^6.26.0"
+ babel-traverse "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+ lodash "^4.17.4"
+
+babel-traverse@^6.24.1, babel-traverse@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
+ dependencies:
+ babel-code-frame "^6.26.0"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+ debug "^2.6.8"
+ globals "^9.18.0"
+ invariant "^2.2.2"
+ lodash "^4.17.4"
+
+babel-types@^6.15.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
+ dependencies:
+ babel-runtime "^6.26.0"
+ esutils "^2.0.2"
+ lodash "^4.17.4"
+ to-fast-properties "^1.0.3"
+
+babylon-walk@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/babylon-walk/-/babylon-walk-1.0.2.tgz#3b15a5ddbb482a78b4ce9c01c8ba181702d9d6ce"
+ dependencies:
+ babel-runtime "^6.11.6"
+ babel-types "^6.15.0"
+ lodash.clone "^4.5.0"
+
+babylon@^6.17.4, babylon@^6.18.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
+
+balanced-match@^0.4.2:
+ version "0.4.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838"
+
+balanced-match@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+
+base64-js@^1.0.2:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3"
+
+base@^0.11.1:
+ version "0.11.2"
+ resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+ dependencies:
+ cache-base "^1.0.1"
+ class-utils "^0.3.5"
+ component-emitter "^1.2.1"
+ define-property "^1.0.0"
+ isobject "^3.0.1"
+ mixin-deep "^1.2.0"
+ pascalcase "^0.1.1"
+
+binary-extensions@^1.0.0:
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205"
+
+bindings@~1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.2.1.tgz#14ad6113812d2d37d72e67b4cacb4bb726505f11"
+
+bluebird@^3.0.5:
+ version "3.5.1"
+ resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
+ version "4.11.8"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
+
+boolbase@^1.0.0, boolbase@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+braces@^2.3.0, braces@^2.3.1:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+ dependencies:
+ arr-flatten "^1.1.0"
+ array-unique "^0.3.2"
+ extend-shallow "^2.0.1"
+ fill-range "^4.0.0"
+ isobject "^3.0.1"
+ repeat-element "^1.1.2"
+ snapdragon "^0.8.1"
+ snapdragon-node "^2.0.1"
+ split-string "^3.0.2"
+ to-regex "^3.0.1"
+
+brfs@^1.2.0:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/brfs/-/brfs-1.6.1.tgz#b78ce2336d818e25eea04a0947cba6d4fb8849c3"
+ dependencies:
+ quote-stream "^1.0.1"
+ resolve "^1.1.5"
+ static-module "^2.2.0"
+ through2 "^2.0.0"
+
+brorand@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
+ dependencies:
+ buffer-xor "^1.0.3"
+ cipher-base "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.3"
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+browserify-cipher@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
+ dependencies:
+ browserify-aes "^1.0.4"
+ browserify-des "^1.0.0"
+ evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c"
+ dependencies:
+ cipher-base "^1.0.1"
+ des.js "^1.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+browserify-rsa@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
+ dependencies:
+ bn.js "^4.1.0"
+ randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
+ dependencies:
+ bn.js "^4.1.1"
+ browserify-rsa "^4.0.0"
+ create-hash "^1.1.0"
+ create-hmac "^1.1.2"
+ elliptic "^6.0.0"
+ inherits "^2.0.1"
+ parse-asn1 "^5.0.0"
+
+browserify-zlib@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
+ dependencies:
+ pako "~1.0.5"
+
+browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6:
+ version "1.7.7"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9"
+ dependencies:
+ caniuse-db "^1.0.30000639"
+ electron-to-chromium "^1.2.7"
+
+browserslist@^3.2.6:
+ version "3.2.8"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6"
+ dependencies:
+ caniuse-lite "^1.0.30000844"
+ electron-to-chromium "^1.3.47"
+
+browserslist@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.0.1.tgz#61c05ce2a5843c7d96166408bc23d58b5416e818"
+ dependencies:
+ caniuse-lite "^1.0.30000865"
+ electron-to-chromium "^1.3.52"
+ node-releases "^1.0.0-alpha.10"
+
+buffer-equal@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b"
+
+buffer-from@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04"
+
+buffer-xor@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+
+buffer@^4.3.0:
+ version "4.9.1"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298"
+ dependencies:
+ base64-js "^1.0.2"
+ ieee754 "^1.1.4"
+ isarray "^1.0.0"
+
+builtin-status-codes@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
+
+cache-base@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+ dependencies:
+ collection-visit "^1.0.0"
+ component-emitter "^1.2.1"
+ get-value "^2.0.6"
+ has-value "^1.0.0"
+ isobject "^3.0.1"
+ set-value "^2.0.0"
+ to-object-path "^0.3.0"
+ union-value "^1.0.0"
+ unset-value "^1.0.0"
+
+call-me-maybe@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz#26d208ea89e37b5cbde60250a15f031c16a4d66b"
+
+caniuse-api@^1.5.2:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-1.6.1.tgz#b534e7c734c4f81ec5fbe8aca2ad24354b962c6c"
+ dependencies:
+ browserslist "^1.3.6"
+ caniuse-db "^1.0.30000529"
+ lodash.memoize "^4.1.2"
+ lodash.uniq "^4.5.0"
+
+caniuse-api@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0"
+ dependencies:
+ browserslist "^4.0.0"
+ caniuse-lite "^1.0.0"
+ lodash.memoize "^4.1.2"
+ lodash.uniq "^4.5.0"
+
+caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639:
+ version "1.0.30000871"
+ resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000871.tgz#f1995c1fe31892649a7605957a80c92518423d4d"
+
+caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30000865:
+ version "1.0.30000865"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz#70026616e8afe6e1442f8bb4e1092987d81a2f25"
+
+chalk@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+ dependencies:
+ ansi-styles "^2.2.1"
+ escape-string-regexp "^1.0.2"
+ has-ansi "^2.0.0"
+ strip-ansi "^3.0.0"
+ supports-color "^2.0.0"
+
+chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.1, chalk@^2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e"
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chokidar@^2.0.3:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26"
+ dependencies:
+ anymatch "^2.0.0"
+ async-each "^1.0.0"
+ braces "^2.3.0"
+ glob-parent "^3.1.0"
+ inherits "^2.0.1"
+ is-binary-path "^1.0.0"
+ is-glob "^4.0.0"
+ lodash.debounce "^4.0.8"
+ normalize-path "^2.1.1"
+ path-is-absolute "^1.0.0"
+ readdirp "^2.0.0"
+ upath "^1.0.5"
+ optionalDependencies:
+ fsevents "^1.2.2"
+
+chownr@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+clap@^1.0.9:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/clap/-/clap-1.2.3.tgz#4f36745b32008492557f46412d66d50cb99bce51"
+ dependencies:
+ chalk "^1.1.3"
+
+class-utils@^0.3.5:
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+ dependencies:
+ arr-union "^3.1.0"
+ define-property "^0.2.5"
+ isobject "^3.0.0"
+ static-extend "^0.1.1"
+
+cli-cursor@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
+ dependencies:
+ restore-cursor "^2.0.0"
+
+cli-spinners@^1.1.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a"
+
+clone@^1.0.2:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
+
+clone@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb"
+
+clones@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/clones/-/clones-1.1.0.tgz#87e904132d6140c5c0b72006c08c0d05bd7b63b3"
+
+coa@~1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/coa/-/coa-1.0.4.tgz#a9ef153660d6a86a8bdec0289a5c684d217432fd"
+ dependencies:
+ q "^1.1.2"
+
+coa@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.1.tgz#f3f8b0b15073e35d70263fb1042cb2c023db38af"
+ dependencies:
+ q "^1.1.2"
+
+code-point-at@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+
+collection-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+ dependencies:
+ map-visit "^1.0.0"
+ object-visit "^1.0.0"
+
+color-convert@^1.3.0, color-convert@^1.9.0, color-convert@^1.9.1:
+ version "1.9.2"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147"
+ dependencies:
+ color-name "1.1.1"
+
+color-name@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689"
+
+color-name@^1.0.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+
+color-string@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991"
+ dependencies:
+ color-name "^1.0.0"
+
+color-string@^1.5.2:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.2.tgz#26e45814bc3c9a7cbd6751648a41434514a773a9"
+ dependencies:
+ color-name "^1.0.0"
+ simple-swizzle "^0.2.2"
+
+color@^0.11.0:
+ version "0.11.4"
+ resolved "https://registry.yarnpkg.com/color/-/color-0.11.4.tgz#6d7b5c74fb65e841cd48792ad1ed5e07b904d764"
+ dependencies:
+ clone "^1.0.2"
+ color-convert "^1.3.0"
+ color-string "^0.3.0"
+
+color@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/color/-/color-3.0.0.tgz#d920b4328d534a3ac8295d68f7bd4ba6c427be9a"
+ dependencies:
+ color-convert "^1.9.1"
+ color-string "^1.5.2"
+
+colormin@^1.0.5:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/colormin/-/colormin-1.1.2.tgz#ea2f7420a72b96881a38aae59ec124a6f7298133"
+ dependencies:
+ color "^0.11.0"
+ css-color-names "0.0.4"
+ has "^1.0.1"
+
+colors@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63"
+
+command-exists@^1.2.6:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.7.tgz#16828f0c3ff2b0c58805861ef211b64fc15692a8"
+
+commander@^2.11.0, commander@^2.9.0, commander@~2.16.0:
+ version "2.16.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.16.0.tgz#f16390593996ceb4f3eeb020b31d78528f7f8a50"
+
+commander@~2.13.0:
+ version "2.13.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c"
+
+component-emitter@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+
+concat-stream@~1.6.0:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
+ dependencies:
+ buffer-from "^1.0.0"
+ inherits "^2.0.3"
+ readable-stream "^2.2.2"
+ typedarray "^0.0.6"
+
+config-chain@~1.1.5:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.11.tgz#aba09747dfbe4c3e70e766a6e41586e1859fc6f2"
+ dependencies:
+ ini "^1.3.4"
+ proto-list "~1.2.1"
+
+console-browserify@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
+ dependencies:
+ date-now "^0.1.4"
+
+console-control-strings@^1.0.0, console-control-strings@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+
+constants-browserify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
+
+convert-source-map@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5"
+
+copy-descriptor@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+
+core-js@^2.4.0, core-js@^2.5.0:
+ version "2.5.7"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e"
+
+core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+
+cosmiconfig@^5.0.0:
+ version "5.0.5"
+ resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.5.tgz#a809e3c2306891ce17ab70359dc8bdf661fe2cd0"
+ dependencies:
+ is-directory "^0.3.1"
+ js-yaml "^3.9.0"
+ parse-json "^4.0.0"
+
+create-ecdh@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff"
+ dependencies:
+ bn.js "^4.1.0"
+ elliptic "^6.0.0"
+
+create-hash@^1.1.0, create-hash@^1.1.2:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
+ dependencies:
+ cipher-base "^1.0.1"
+ inherits "^2.0.1"
+ md5.js "^1.3.4"
+ ripemd160 "^2.0.1"
+ sha.js "^2.4.0"
+
+create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
+ dependencies:
+ cipher-base "^1.0.3"
+ create-hash "^1.1.0"
+ inherits "^2.0.1"
+ ripemd160 "^2.0.0"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+cross-spawn@^6.0.4:
+ version "6.0.5"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
+ dependencies:
+ nice-try "^1.0.4"
+ path-key "^2.0.1"
+ semver "^5.5.0"
+ shebang-command "^1.2.0"
+ which "^1.2.9"
+
+crypto-browserify@^3.11.0:
+ version "3.12.0"
+ resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
+ dependencies:
+ browserify-cipher "^1.0.0"
+ browserify-sign "^4.0.0"
+ create-ecdh "^4.0.0"
+ create-hash "^1.1.0"
+ create-hmac "^1.1.0"
+ diffie-hellman "^5.0.0"
+ inherits "^2.0.1"
+ pbkdf2 "^3.0.3"
+ public-encrypt "^4.0.0"
+ randombytes "^2.0.0"
+ randomfill "^1.0.3"
+
+css-color-names@0.0.4, css-color-names@^0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
+
+css-declaration-sorter@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-3.0.1.tgz#d0e3056b0fd88dc1ea9dceff435adbe9c702a7f8"
+ dependencies:
+ postcss "^6.0.0"
+ timsort "^0.3.0"
+
+css-select-base-adapter@~0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.0.tgz#0102b3d14630df86c3eb9fa9f5456270106cf990"
+
+css-select@~1.3.0-rc0:
+ version "1.3.0-rc0"
+ resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.3.0-rc0.tgz#6f93196aaae737666ea1036a8cb14a8fcb7a9231"
+ dependencies:
+ boolbase "^1.0.0"
+ css-what "2.1"
+ domutils "1.5.1"
+ nth-check "^1.0.1"
+
+css-tree@1.0.0-alpha.29:
+ version "1.0.0-alpha.29"
+ resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.29.tgz#3fa9d4ef3142cbd1c301e7664c1f352bd82f5a39"
+ dependencies:
+ mdn-data "~1.1.0"
+ source-map "^0.5.3"
+
+css-tree@1.0.0-alpha25:
+ version "1.0.0-alpha25"
+ resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha25.tgz#1bbfabfbf6eeef4f01d9108ff2edd0be2fe35597"
+ dependencies:
+ mdn-data "^1.0.0"
+ source-map "^0.5.3"
+
+css-unit-converter@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/css-unit-converter/-/css-unit-converter-1.1.1.tgz#d9b9281adcfd8ced935bdbaba83786897f64e996"
+
+css-url-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/css-url-regex/-/css-url-regex-1.1.0.tgz#83834230cc9f74c457de59eebd1543feeb83b7ec"
+
+css-what@2.1:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd"
+
+cssnano-preset-default@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.0.tgz#c334287b4f7d49fb2d170a92f9214655788e3b6b"
+ dependencies:
+ css-declaration-sorter "^3.0.0"
+ cssnano-util-raw-cache "^4.0.0"
+ postcss "^6.0.0"
+ postcss-calc "^6.0.0"
+ postcss-colormin "^4.0.0"
+ postcss-convert-values "^4.0.0"
+ postcss-discard-comments "^4.0.0"
+ postcss-discard-duplicates "^4.0.0"
+ postcss-discard-empty "^4.0.0"
+ postcss-discard-overridden "^4.0.0"
+ postcss-merge-longhand "^4.0.0"
+ postcss-merge-rules "^4.0.0"
+ postcss-minify-font-values "^4.0.0"
+ postcss-minify-gradients "^4.0.0"
+ postcss-minify-params "^4.0.0"
+ postcss-minify-selectors "^4.0.0"
+ postcss-normalize-charset "^4.0.0"
+ postcss-normalize-display-values "^4.0.0"
+ postcss-normalize-positions "^4.0.0"
+ postcss-normalize-repeat-style "^4.0.0"
+ postcss-normalize-string "^4.0.0"
+ postcss-normalize-timing-functions "^4.0.0"
+ postcss-normalize-unicode "^4.0.0"
+ postcss-normalize-url "^4.0.0"
+ postcss-normalize-whitespace "^4.0.0"
+ postcss-ordered-values "^4.0.0"
+ postcss-reduce-initial "^4.0.0"
+ postcss-reduce-transforms "^4.0.0"
+ postcss-svgo "^4.0.0"
+ postcss-unique-selectors "^4.0.0"
+
+cssnano-util-get-arguments@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz#ed3a08299f21d75741b20f3b81f194ed49cc150f"
+
+cssnano-util-get-match@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz#c0e4ca07f5386bb17ec5e52250b4f5961365156d"
+
+cssnano-util-raw-cache@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.0.tgz#be0a2856e25f185f5f7a2bcc0624e28b7f179a9f"
+ dependencies:
+ postcss "^6.0.0"
+
+cssnano-util-same-parent@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.0.tgz#d2a3de1039aa98bc4ec25001fa050330c2a16dac"
+
+cssnano@^3.4.0:
+ version "3.10.0"
+ resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-3.10.0.tgz#4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38"
+ dependencies:
+ autoprefixer "^6.3.1"
+ decamelize "^1.1.2"
+ defined "^1.0.0"
+ has "^1.0.1"
+ object-assign "^4.0.1"
+ postcss "^5.0.14"
+ postcss-calc "^5.2.0"
+ postcss-colormin "^2.1.8"
+ postcss-convert-values "^2.3.4"
+ postcss-discard-comments "^2.0.4"
+ postcss-discard-duplicates "^2.0.1"
+ postcss-discard-empty "^2.0.1"
+ postcss-discard-overridden "^0.1.1"
+ postcss-discard-unused "^2.2.1"
+ postcss-filter-plugins "^2.0.0"
+ postcss-merge-idents "^2.1.5"
+ postcss-merge-longhand "^2.0.1"
+ postcss-merge-rules "^2.0.3"
+ postcss-minify-font-values "^1.0.2"
+ postcss-minify-gradients "^1.0.1"
+ postcss-minify-params "^1.0.4"
+ postcss-minify-selectors "^2.0.4"
+ postcss-normalize-charset "^1.1.0"
+ postcss-normalize-url "^3.0.7"
+ postcss-ordered-values "^2.1.0"
+ postcss-reduce-idents "^2.2.2"
+ postcss-reduce-initial "^1.0.0"
+ postcss-reduce-transforms "^1.0.3"
+ postcss-svgo "^2.1.1"
+ postcss-unique-selectors "^2.0.2"
+ postcss-value-parser "^3.2.3"
+ postcss-zindex "^2.0.1"
+
+cssnano@^4.0.0:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.0.4.tgz#8a397b5e307e06fd7e361bf11344b1cff8749a86"
+ dependencies:
+ cosmiconfig "^5.0.0"
+ cssnano-preset-default "^4.0.0"
+ is-resolvable "^1.0.0"
+ postcss "^6.0.0"
+
+csso@^3.5.0:
+ version "3.5.1"
+ resolved "https://registry.yarnpkg.com/csso/-/csso-3.5.1.tgz#7b9eb8be61628973c1b261e169d2f024008e758b"
+ dependencies:
+ css-tree "1.0.0-alpha.29"
+
+csso@~2.3.1:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/csso/-/csso-2.3.2.tgz#ddd52c587033f49e94b71fc55569f252e8ff5f85"
+ dependencies:
+ clap "^1.0.9"
+ source-map "^0.5.3"
+
+date-now@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
+
+deasync@^0.1.13:
+ version "0.1.13"
+ resolved "https://registry.yarnpkg.com/deasync/-/deasync-0.1.13.tgz#815c2b69bbd1117cae570152cd895661c09f20ea"
+ dependencies:
+ bindings "~1.2.1"
+ nan "^2.0.7"
+
+debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ dependencies:
+ ms "2.0.0"
+
+decamelize@^1.1.2:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+
+decode-uri-component@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+
+deep-extend@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
+
+deep-is@~0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
+
+defaults@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d"
+ dependencies:
+ clone "^1.0.2"
+
+define-properties@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94"
+ dependencies:
+ foreach "^2.0.5"
+ object-keys "^1.0.8"
+
+define-property@^0.2.5:
+ version "0.2.5"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+ dependencies:
+ is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+ dependencies:
+ is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+ dependencies:
+ is-descriptor "^1.0.2"
+ isobject "^3.0.1"
+
+defined@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
+
+delegates@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+
+depd@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
+
+des.js@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
+ dependencies:
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+destroy@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+
+detect-indent@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
+ dependencies:
+ repeating "^2.0.0"
+
+detect-libc@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
+
+diffie-hellman@^5.0.0:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
+ dependencies:
+ bn.js "^4.1.0"
+ miller-rabin "^4.0.0"
+ randombytes "^2.0.0"
+
+dom-serializer@0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82"
+ dependencies:
+ domelementtype "~1.1.1"
+ entities "~1.1.1"
+
+domain-browser@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
+
+domelementtype@1, domelementtype@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2"
+
+domelementtype@~1.1.1:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b"
+
+domhandler@^2.3.0:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803"
+ dependencies:
+ domelementtype "1"
+
+domutils@1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf"
+ dependencies:
+ dom-serializer "0"
+ domelementtype "1"
+
+domutils@^1.5.1:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
+ dependencies:
+ dom-serializer "0"
+ domelementtype "1"
+
+dot-prop@^4.1.1:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57"
+ dependencies:
+ is-obj "^1.0.0"
+
+dotenv@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-5.0.1.tgz#a5317459bd3d79ab88cff6e44057a6a3fbb1fcef"
+
+duplexer2@~0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1"
+ dependencies:
+ readable-stream "^2.0.2"
+
+editorconfig@^0.13.2:
+ version "0.13.3"
+ resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-0.13.3.tgz#e5219e587951d60958fd94ea9a9a008cdeff1b34"
+ dependencies:
+ bluebird "^3.0.5"
+ commander "^2.9.0"
+ lru-cache "^3.2.0"
+ semver "^5.1.0"
+ sigmund "^1.0.1"
+
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+
+electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.47, electron-to-chromium@^1.3.52:
+ version "1.3.52"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.52.tgz#d2d9f1270ba4a3b967b831c40ef71fb4d9ab5ce0"
+
+elliptic@^6.0.0:
+ version "6.4.0"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df"
+ dependencies:
+ bn.js "^4.4.0"
+ brorand "^1.0.1"
+ hash.js "^1.0.0"
+ hmac-drbg "^1.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.0"
+
+encodeurl@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
+
+entities@^1.1.1, entities@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0"
+
+error-ex@^1.3.1:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+ dependencies:
+ is-arrayish "^0.2.1"
+
+es-abstract@^1.5.1, es-abstract@^1.6.1:
+ version "1.12.0"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165"
+ dependencies:
+ es-to-primitive "^1.1.1"
+ function-bind "^1.1.1"
+ has "^1.0.1"
+ is-callable "^1.1.3"
+ is-regex "^1.0.4"
+
+es-to-primitive@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d"
+ dependencies:
+ is-callable "^1.1.1"
+ is-date-object "^1.0.1"
+ is-symbol "^1.0.1"
+
+escape-html@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+
+escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+
+escodegen@^1.8.1:
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589"
+ dependencies:
+ esprima "^3.1.3"
+ estraverse "^4.2.0"
+ esutils "^2.0.2"
+ optionator "^0.8.1"
+ optionalDependencies:
+ source-map "~0.6.1"
+
+escodegen@~1.9.0:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.1.tgz#dbae17ef96c8e4bedb1356f4504fa4cc2f7cb7e2"
+ dependencies:
+ esprima "^3.1.3"
+ estraverse "^4.2.0"
+ esutils "^2.0.2"
+ optionator "^0.8.1"
+ optionalDependencies:
+ source-map "~0.6.1"
+
+esprima@^2.6.0:
+ version "2.7.3"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581"
+
+esprima@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
+
+esprima@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+
+estraverse@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
+
+esutils@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
+
+etag@~1.8.1:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+
+events@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
+
+evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+ dependencies:
+ md5.js "^1.3.4"
+ safe-buffer "^5.1.1"
+
+expand-brackets@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+ dependencies:
+ debug "^2.3.3"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ posix-character-classes "^0.1.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+extend-shallow@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+ dependencies:
+ is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+ dependencies:
+ assign-symbols "^1.0.0"
+ is-extendable "^1.0.1"
+
+extglob@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+ dependencies:
+ array-unique "^0.3.2"
+ define-property "^1.0.0"
+ expand-brackets "^2.1.4"
+ extend-shallow "^2.0.1"
+ fragment-cache "^0.2.1"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+falafel@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/falafel/-/falafel-2.1.0.tgz#96bb17761daba94f46d001738b3cedf3a67fe06c"
+ dependencies:
+ acorn "^5.0.0"
+ foreach "^2.0.5"
+ isarray "0.0.1"
+ object-keys "^1.0.6"
+
+fast-glob@^2.2.2:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.2.tgz#71723338ac9b4e0e2fff1d6748a2a13d5ed352bf"
+ dependencies:
+ "@mrmlnc/readdir-enhanced" "^2.2.1"
+ "@nodelib/fs.stat" "^1.0.1"
+ glob-parent "^3.1.0"
+ is-glob "^4.0.0"
+ merge2 "^1.2.1"
+ micromatch "^3.1.10"
+
+fast-levenshtein@~2.0.4:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+
+filesize@^3.6.0:
+ version "3.6.1"
+ resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz#090bb3ee01b6f801a8a8be99d31710b3422bb317"
+
+fill-range@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+ to-regex-range "^2.1.0"
+
+flatten@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782"
+
+for-in@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+
+foreach@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
+
+fragment-cache@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+ dependencies:
+ map-cache "^0.2.2"
+
+fresh@0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+
+fs-minipass@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d"
+ dependencies:
+ minipass "^2.2.1"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+
+fsevents@^1.2.2:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426"
+ dependencies:
+ nan "^2.9.2"
+ node-pre-gyp "^0.10.0"
+
+fswatcher-child@^1.0.3:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/fswatcher-child/-/fswatcher-child-1.0.5.tgz#134d012ffa74918975617e00e56e4139f36cb140"
+ dependencies:
+ chokidar "^2.0.3"
+
+function-bind@^1.1.0, function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+
+gauge@~2.7.3:
+ version "2.7.4"
+ resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
+ dependencies:
+ aproba "^1.0.3"
+ console-control-strings "^1.0.0"
+ has-unicode "^2.0.0"
+ object-assign "^4.1.0"
+ signal-exit "^3.0.0"
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wide-align "^1.1.0"
+
+get-port@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc"
+
+get-value@^2.0.3, get-value@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+
+glob-parent@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
+ dependencies:
+ is-glob "^3.1.0"
+ path-dirname "^1.0.0"
+
+glob-to-regexp@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab"
+
+glob@^7.0.5:
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+globals@^9.18.0:
+ version "9.18.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
+
+graceful-fs@^4.1.2:
+ version "4.1.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
+
+grapheme-breaker@^0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/grapheme-breaker/-/grapheme-breaker-0.3.2.tgz#5b9e6b78c3832452d2ba2bb1cb830f96276410ac"
+ dependencies:
+ brfs "^1.2.0"
+ unicode-trie "^0.3.1"
+
+has-ansi@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+ dependencies:
+ ansi-regex "^2.0.0"
+
+has-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+
+has-unicode@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+
+has-value@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+ dependencies:
+ get-value "^2.0.3"
+ has-values "^0.1.4"
+ isobject "^2.0.0"
+
+has-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+ dependencies:
+ get-value "^2.0.6"
+ has-values "^1.0.0"
+ isobject "^3.0.0"
+
+has-values@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+
+has-values@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+ dependencies:
+ is-number "^3.0.0"
+ kind-of "^4.0.0"
+
+has@^1.0.0, has@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ dependencies:
+ function-bind "^1.1.1"
+
+hash-base@^3.0.0:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+hash.js@^1.0.0, hash.js@^1.0.3:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.5.tgz#e38ab4b85dfb1e0c40fe9265c0e9b54854c23812"
+ dependencies:
+ inherits "^2.0.3"
+ minimalistic-assert "^1.0.1"
+
+hex-color-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e"
+
+hmac-drbg@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+ dependencies:
+ hash.js "^1.0.3"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.1"
+
+home-or-tmp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.1"
+
+hsl-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz#d49330c789ed819e276a4c0d272dffa30b18fe6e"
+
+hsla-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38"
+
+html-comment-regex@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e"
+
+htmlnano@^0.1.9:
+ version "0.1.9"
+ resolved "https://registry.yarnpkg.com/htmlnano/-/htmlnano-0.1.9.tgz#e6137aea84d20311a3875c42eb2799a1ff352627"
+ dependencies:
+ cssnano "^3.4.0"
+ object-assign "^4.0.1"
+ posthtml "^0.11.3"
+ posthtml-render "^1.1.3"
+ svgo "^1.0.5"
+ uglify-es "^3.3.9"
+
+htmlparser2@^3.9.2:
+ version "3.9.2"
+ resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338"
+ dependencies:
+ domelementtype "^1.3.0"
+ domhandler "^2.3.0"
+ domutils "^1.5.1"
+ entities "^1.1.1"
+ inherits "^2.0.1"
+ readable-stream "^2.0.2"
+
+http-errors@~1.6.2:
+ version "1.6.3"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d"
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.3"
+ setprototypeof "1.1.0"
+ statuses ">= 1.4.0 < 2"
+
+https-browserify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
+
+iconv-lite@^0.4.4:
+ version "0.4.23"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63"
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+ieee754@^1.1.4:
+ version "1.1.12"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b"
+
+ignore-walk@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8"
+ dependencies:
+ minimatch "^3.0.4"
+
+indexes-of@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
+
+indexof@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+
+inherits@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
+
+ini@^1.3.4, ini@~1.3.0:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
+
+invariant@^2.2.2:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
+ dependencies:
+ loose-envify "^1.0.0"
+
+is-absolute-url@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"
+
+is-accessor-descriptor@^0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-accessor-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
+ dependencies:
+ kind-of "^6.0.0"
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+
+is-arrayish@^0.3.1:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
+
+is-binary-path@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+ dependencies:
+ binary-extensions "^1.0.0"
+
+is-buffer@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+
+is-callable@^1.1.1, is-callable@^1.1.3:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75"
+
+is-color-stop@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz#cfff471aee4dd5c9e158598fbe12967b5cdad345"
+ dependencies:
+ css-color-names "^0.0.4"
+ hex-color-regex "^1.1.0"
+ hsl-regex "^1.0.0"
+ hsla-regex "^1.0.0"
+ rgb-regex "^1.0.1"
+ rgba-regex "^1.0.0"
+
+is-data-descriptor@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-data-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
+ dependencies:
+ kind-of "^6.0.0"
+
+is-date-object@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
+
+is-descriptor@^0.1.0:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
+ dependencies:
+ is-accessor-descriptor "^0.1.6"
+ is-data-descriptor "^0.1.4"
+ kind-of "^5.0.0"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
+ dependencies:
+ is-accessor-descriptor "^1.0.0"
+ is-data-descriptor "^1.0.0"
+ kind-of "^6.0.2"
+
+is-directory@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+
+is-extendable@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+ dependencies:
+ is-plain-object "^2.0.4"
+
+is-extglob@^2.1.0, is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+
+is-finite@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+
+is-glob@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
+ dependencies:
+ is-extglob "^2.1.0"
+
+is-glob@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0"
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-number@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-obj@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
+
+is-plain-obj@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
+
+is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+ dependencies:
+ isobject "^3.0.1"
+
+is-regex@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
+ dependencies:
+ has "^1.0.1"
+
+is-resolvable@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
+
+is-svg@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9"
+ dependencies:
+ html-comment-regex "^1.1.0"
+
+is-svg@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75"
+ dependencies:
+ html-comment-regex "^1.1.0"
+
+is-symbol@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572"
+
+is-url@^1.2.2:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52"
+
+is-windows@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+
+is-wsl@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d"
+
+isarray@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+
+isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+
+isobject@^2.0.0, isobject@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+ dependencies:
+ isarray "1.0.0"
+
+isobject@^3.0.0, isobject@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+
+js-base64@^2.1.9:
+ version "2.4.8"
+ resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.8.tgz#57a9b130888f956834aa40c5b165ba59c758f033"
+
+js-beautify@^1.7.5:
+ version "1.7.5"
+ resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.7.5.tgz#69d9651ef60dbb649f65527b53674950138a7919"
+ dependencies:
+ config-chain "~1.1.5"
+ editorconfig "^0.13.2"
+ mkdirp "~0.5.0"
+ nopt "~3.0.1"
+
+"js-tokens@^3.0.0 || ^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+
+js-tokens@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
+
+js-yaml@^3.10.0, js-yaml@^3.9.0:
+ version "3.12.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1"
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
+js-yaml@~3.10.0:
+ version "3.10.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc"
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
+js-yaml@~3.7.0:
+ version "3.7.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80"
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^2.6.0"
+
+jsesc@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
+
+jsesc@~0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+
+json-parse-better-errors@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
+
+json5@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+
+json5@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
+ dependencies:
+ minimist "^1.2.0"
+
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
+
+kind-of@^6.0.0, kind-of@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
+
+levn@~0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
+ dependencies:
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+
+lodash.clone@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6"
+
+lodash.debounce@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
+
+lodash.memoize@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
+
+lodash.uniq@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
+
+lodash@^4.17.4:
+ version "4.17.10"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"
+
+log-symbols@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a"
+ dependencies:
+ chalk "^2.0.1"
+
+loose-envify@^1.0.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+lru-cache@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-3.2.0.tgz#71789b3b7f5399bec8565dda38aa30d2a097efee"
+ dependencies:
+ pseudomap "^1.0.1"
+
+magic-string@^0.22.4:
+ version "0.22.5"
+ resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.5.tgz#8e9cf5afddf44385c1da5bc2a6a0dbd10b03657e"
+ dependencies:
+ vlq "^0.2.2"
+
+map-cache@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+
+map-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+ dependencies:
+ object-visit "^1.0.0"
+
+math-expression-evaluator@^1.2.14:
+ version "1.2.17"
+ resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac"
+
+md5.js@^1.3.4:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d"
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+
+mdn-data@^1.0.0, mdn-data@~1.1.0:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.1.4.tgz#50b5d4ffc4575276573c4eedb8780812a8419f01"
+
+merge-source-map@1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.0.4.tgz#a5de46538dae84d4114cc5ea02b4772a6346701f"
+ dependencies:
+ source-map "^0.5.6"
+
+merge2@^1.2.1:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.2.tgz#03212e3da8d86c4d8523cebd6318193414f94e34"
+
+micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4:
+ version "3.1.10"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ braces "^2.3.1"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ extglob "^2.0.4"
+ fragment-cache "^0.2.1"
+ kind-of "^6.0.2"
+ nanomatch "^1.2.9"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.2"
+
+miller-rabin@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
+ dependencies:
+ bn.js "^4.0.0"
+ brorand "^1.0.1"
+
+mime@1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6"
+
+mimic-fn@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
+
+minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+
+minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+
+minimatch@^3.0.2, minimatch@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@0.0.8:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+
+minimist@^1.1.3, minimist@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+
+minipass@^2.2.1, minipass@^2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233"
+ dependencies:
+ safe-buffer "^5.1.2"
+ yallist "^3.0.0"
+
+minizlib@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb"
+ dependencies:
+ minipass "^2.2.1"
+
+mixin-deep@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe"
+ dependencies:
+ for-in "^1.0.2"
+ is-extendable "^1.0.1"
+
+mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+ dependencies:
+ minimist "0.0.8"
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+
+nan@^2.0.7, nan@^2.9.2:
+ version "2.10.0"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f"
+
+nanomatch@^1.2.9:
+ version "1.2.13"
+ resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ fragment-cache "^0.2.1"
+ is-windows "^1.0.2"
+ kind-of "^6.0.2"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+needle@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d"
+ dependencies:
+ debug "^2.1.2"
+ iconv-lite "^0.4.4"
+ sax "^1.2.4"
+
+nice-try@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.4.tgz#d93962f6c52f2c1558c0fbda6d512819f1efe1c4"
+
+node-forge@^0.7.1:
+ version "0.7.5"
+ resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df"
+
+node-libs-browser@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df"
+ dependencies:
+ assert "^1.1.1"
+ browserify-zlib "^0.2.0"
+ buffer "^4.3.0"
+ console-browserify "^1.1.0"
+ constants-browserify "^1.0.0"
+ crypto-browserify "^3.11.0"
+ domain-browser "^1.1.1"
+ events "^1.0.0"
+ https-browserify "^1.0.0"
+ os-browserify "^0.3.0"
+ path-browserify "0.0.0"
+ process "^0.11.10"
+ punycode "^1.2.4"
+ querystring-es3 "^0.2.0"
+ readable-stream "^2.3.3"
+ stream-browserify "^2.0.1"
+ stream-http "^2.7.2"
+ string_decoder "^1.0.0"
+ timers-browserify "^2.0.4"
+ tty-browserify "0.0.0"
+ url "^0.11.0"
+ util "^0.10.3"
+ vm-browserify "0.0.4"
+
+node-pre-gyp@^0.10.0:
+ version "0.10.3"
+ resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc"
+ dependencies:
+ detect-libc "^1.0.2"
+ mkdirp "^0.5.1"
+ needle "^2.2.1"
+ nopt "^4.0.1"
+ npm-packlist "^1.1.6"
+ npmlog "^4.0.2"
+ rc "^1.2.7"
+ rimraf "^2.6.1"
+ semver "^5.3.0"
+ tar "^4"
+
+node-releases@^1.0.0-alpha.10:
+ version "1.0.0-alpha.10"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.0.0-alpha.10.tgz#61c8d5f9b5b2e05d84eba941d05b6f5202f68a2a"
+ dependencies:
+ semver "^5.3.0"
+
+nopt@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
+ dependencies:
+ abbrev "1"
+ osenv "^0.1.4"
+
+nopt@~3.0.1:
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
+ dependencies:
+ abbrev "1"
+
+normalize-path@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+ dependencies:
+ remove-trailing-separator "^1.0.1"
+
+normalize-range@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942"
+
+normalize-url@^1.4.0:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz#2cc0d66b31ea23036458436e3620d85954c66c3c"
+ dependencies:
+ object-assign "^4.0.1"
+ prepend-http "^1.0.0"
+ query-string "^4.1.0"
+ sort-keys "^1.0.0"
+
+normalize-url@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.2.0.tgz#98d0948afc82829f374320f405fe9ca55a5f8567"
+
+npm-bundled@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308"
+
+npm-packlist@^1.1.6:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz#84e8c683cbe7867d34b1d357d893ce29e28a02de"
+ dependencies:
+ ignore-walk "^3.0.1"
+ npm-bundled "^1.0.1"
+
+npmlog@^4.0.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
+ dependencies:
+ are-we-there-yet "~1.1.2"
+ console-control-strings "~1.1.0"
+ gauge "~2.7.3"
+ set-blocking "~2.0.0"
+
+nth-check@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4"
+ dependencies:
+ boolbase "~1.0.0"
+
+num2fraction@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede"
+
+number-is-nan@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+
+object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+
+object-copy@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+ dependencies:
+ copy-descriptor "^0.1.0"
+ define-property "^0.2.5"
+ kind-of "^3.0.3"
+
+object-inspect@~1.4.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.4.1.tgz#37ffb10e71adaf3748d05f713b4c9452f402cbc4"
+
+object-keys@^1.0.6, object-keys@^1.0.8:
+ version "1.0.12"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2"
+
+object-visit@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+ dependencies:
+ isobject "^3.0.0"
+
+object.getownpropertydescriptors@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16"
+ dependencies:
+ define-properties "^1.1.2"
+ es-abstract "^1.5.1"
+
+object.pick@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+ dependencies:
+ isobject "^3.0.1"
+
+object.values@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.0.4.tgz#e524da09b4f66ff05df457546ec72ac99f13069a"
+ dependencies:
+ define-properties "^1.1.2"
+ es-abstract "^1.6.1"
+ function-bind "^1.1.0"
+ has "^1.0.1"
+
+on-finished@~2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+ dependencies:
+ ee-first "1.1.1"
+
+once@^1.3.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ dependencies:
+ wrappy "1"
+
+onetime@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4"
+ dependencies:
+ mimic-fn "^1.0.0"
+
+opn@^5.1.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz#64871565c863875f052cfdf53d3e3cb5adb53b1c"
+ dependencies:
+ is-wsl "^1.1.0"
+
+optionator@^0.8.1:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
+ dependencies:
+ deep-is "~0.1.3"
+ fast-levenshtein "~2.0.4"
+ levn "~0.3.0"
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+ wordwrap "~1.0.0"
+
+ora@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/ora/-/ora-2.1.0.tgz#6caf2830eb924941861ec53a173799e008b51e5b"
+ dependencies:
+ chalk "^2.3.1"
+ cli-cursor "^2.1.0"
+ cli-spinners "^1.1.0"
+ log-symbols "^2.2.0"
+ strip-ansi "^4.0.0"
+ wcwidth "^1.0.1"
+
+os-browserify@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
+
+os-homedir@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+
+os-tmpdir@^1.0.0, os-tmpdir@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+
+osenv@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.0"
+
+pako@^0.2.5:
+ version "0.2.9"
+ resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75"
+
+pako@~1.0.5:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258"
+
+parcel-bundler@^1.9.7:
+ version "1.9.7"
+ resolved "https://registry.yarnpkg.com/parcel-bundler/-/parcel-bundler-1.9.7.tgz#5cd00850dea0254d377005d55ab4bf60429ba2bc"
+ dependencies:
+ ansi-to-html "^0.6.4"
+ babel-code-frame "^6.26.0"
+ babel-core "^6.25.0"
+ babel-generator "^6.25.0"
+ babel-plugin-transform-es2015-modules-commonjs "^6.26.0"
+ babel-plugin-transform-react-jsx "^6.24.1"
+ babel-preset-env "^1.7.0"
+ babel-template "^6.26.0"
+ babel-traverse "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.17.4"
+ babylon-walk "^1.0.2"
+ browserslist "^3.2.6"
+ chalk "^2.1.0"
+ clone "^2.1.1"
+ command-exists "^1.2.6"
+ commander "^2.11.0"
+ cross-spawn "^6.0.4"
+ cssnano "^4.0.0"
+ deasync "^0.1.13"
+ dotenv "^5.0.0"
+ fast-glob "^2.2.2"
+ filesize "^3.6.0"
+ fswatcher-child "^1.0.3"
+ get-port "^3.2.0"
+ grapheme-breaker "^0.3.2"
+ htmlnano "^0.1.9"
+ is-glob "^4.0.0"
+ is-url "^1.2.2"
+ js-yaml "^3.10.0"
+ json5 "^1.0.1"
+ micromatch "^3.0.4"
+ mkdirp "^0.5.1"
+ node-forge "^0.7.1"
+ node-libs-browser "^2.0.0"
+ opn "^5.1.0"
+ ora "^2.1.0"
+ physical-cpu-count "^2.0.0"
+ postcss "^6.0.19"
+ postcss-value-parser "^3.3.0"
+ posthtml "^0.11.2"
+ posthtml-parser "^0.4.0"
+ posthtml-render "^1.1.3"
+ resolve "^1.4.0"
+ semver "^5.4.1"
+ serialize-to-js "^1.1.1"
+ serve-static "^1.12.4"
+ source-map "0.6.1"
+ strip-ansi "^4.0.0"
+ terser "^3.7.3"
+ toml "^2.3.3"
+ tomlify-j0.4 "^3.0.0"
+ v8-compile-cache "^2.0.0"
+ ws "^5.1.1"
+
+parse-asn1@^5.0.0:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8"
+ dependencies:
+ asn1.js "^4.0.0"
+ browserify-aes "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.0"
+ pbkdf2 "^3.0.3"
+
+parse-json@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
+ dependencies:
+ error-ex "^1.3.1"
+ json-parse-better-errors "^1.0.1"
+
+parseurl@~1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3"
+
+pascalcase@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+
+path-browserify@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
+
+path-dirname@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
+
+path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+
+path-key@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+
+path-parse@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1"
+
+pbkdf2@^3.0.3:
+ version "3.0.16"
+ resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c"
+ dependencies:
+ create-hash "^1.1.2"
+ create-hmac "^1.1.4"
+ ripemd160 "^2.0.1"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+physical-cpu-count@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/physical-cpu-count/-/physical-cpu-count-2.0.0.tgz#18de2f97e4bf7a9551ad7511942b5496f7aba660"
+
+posix-character-classes@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+
+postcss-calc@^5.2.0:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-5.3.1.tgz#77bae7ca928ad85716e2fda42f261bf7c1d65b5e"
+ dependencies:
+ postcss "^5.0.2"
+ postcss-message-helpers "^2.0.0"
+ reduce-css-calc "^1.2.6"
+
+postcss-calc@^6.0.0:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-6.0.1.tgz#3d24171bbf6e7629d422a436ebfe6dd9511f4330"
+ dependencies:
+ css-unit-converter "^1.1.1"
+ postcss "^6.0.0"
+ postcss-selector-parser "^2.2.2"
+ reduce-css-calc "^2.0.0"
+
+postcss-colormin@^2.1.8:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-2.2.2.tgz#6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b"
+ dependencies:
+ colormin "^1.0.5"
+ postcss "^5.0.13"
+ postcss-value-parser "^3.2.3"
+
+postcss-colormin@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.1.tgz#6f1c18a0155bc69613f2ff13843e2e4ae8ff0bbe"
+ dependencies:
+ browserslist "^4.0.0"
+ color "^3.0.0"
+ has "^1.0.0"
+ postcss "^6.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-convert-values@^2.3.4:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz#bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d"
+ dependencies:
+ postcss "^5.0.11"
+ postcss-value-parser "^3.1.2"
+
+postcss-convert-values@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.0.tgz#77d77d9aed1dc4e6956e651cc349d53305876f62"
+ dependencies:
+ postcss "^6.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-discard-comments@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz#befe89fafd5b3dace5ccce51b76b81514be00e3d"
+ dependencies:
+ postcss "^5.0.14"
+
+postcss-discard-comments@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.0.tgz#9684a299e76b3e93263ef8fd2adbf1a1c08fd88d"
+ dependencies:
+ postcss "^6.0.0"
+
+postcss-discard-duplicates@^2.0.1:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz#b9abf27b88ac188158a5eb12abcae20263b91932"
+ dependencies:
+ postcss "^5.0.4"
+
+postcss-discard-duplicates@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.0.tgz#42f3c267f85fa909e042c35767ecfd65cb2bd72c"
+ dependencies:
+ postcss "^6.0.0"
+
+postcss-discard-empty@^2.0.1:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz#d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5"
+ dependencies:
+ postcss "^5.0.14"
+
+postcss-discard-empty@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.0.tgz#55e18a59c74128e38c7d2804bcfa4056611fb97f"
+ dependencies:
+ postcss "^6.0.0"
+
+postcss-discard-overridden@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz#8b1eaf554f686fb288cd874c55667b0aa3668d58"
+ dependencies:
+ postcss "^5.0.16"
+
+postcss-discard-overridden@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.0.tgz#4a0bf85978784cf1f81ed2c1c1fd9d964a1da1fa"
+ dependencies:
+ postcss "^6.0.0"
+
+postcss-discard-unused@^2.2.1:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz#bce30b2cc591ffc634322b5fb3464b6d934f4433"
+ dependencies:
+ postcss "^5.0.14"
+ uniqs "^2.0.0"
+
+postcss-filter-plugins@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz#82245fdf82337041645e477114d8e593aa18b8ec"
+ dependencies:
+ postcss "^5.0.4"
+
+postcss-merge-idents@^2.1.5:
+ version "2.1.7"
+ resolved "https://registry.yarnpkg.com/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz#4c5530313c08e1d5b3bbf3d2bbc747e278eea270"
+ dependencies:
+ has "^1.0.1"
+ postcss "^5.0.10"
+ postcss-value-parser "^3.1.1"
+
+postcss-merge-longhand@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz#23d90cd127b0a77994915332739034a1a4f3d658"
+ dependencies:
+ postcss "^5.0.4"
+
+postcss-merge-longhand@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.3.tgz#17f93b71d8a1dba043b7fb437f8e264304e64ab0"
+ dependencies:
+ css-color-names "0.0.4"
+ postcss "^6.0.0"
+ postcss-value-parser "^3.0.0"
+ stylehacks "^4.0.0"
+
+postcss-merge-rules@^2.0.3:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz#d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721"
+ dependencies:
+ browserslist "^1.5.2"
+ caniuse-api "^1.5.2"
+ postcss "^5.0.4"
+ postcss-selector-parser "^2.2.2"
+ vendors "^1.0.0"
+
+postcss-merge-rules@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.1.tgz#430fd59b3f2ed2e8afcd0b31278eda39854abb10"
+ dependencies:
+ browserslist "^4.0.0"
+ caniuse-api "^3.0.0"
+ cssnano-util-same-parent "^4.0.0"
+ postcss "^6.0.0"
+ postcss-selector-parser "^3.0.0"
+ vendors "^1.0.0"
+
+postcss-message-helpers@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz#a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e"
+
+postcss-minify-font-values@^1.0.2:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz#4b58edb56641eba7c8474ab3526cafd7bbdecb69"
+ dependencies:
+ object-assign "^4.0.1"
+ postcss "^5.0.4"
+ postcss-value-parser "^3.0.2"
+
+postcss-minify-font-values@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.0.tgz#4cc33d283d6a81759036e757ef981d92cbd85bed"
+ dependencies:
+ postcss "^6.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-minify-gradients@^1.0.1:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz#5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1"
+ dependencies:
+ postcss "^5.0.12"
+ postcss-value-parser "^3.3.0"
+
+postcss-minify-gradients@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.0.tgz#3fc3916439d27a9bb8066db7cdad801650eb090e"
+ dependencies:
+ cssnano-util-get-arguments "^4.0.0"
+ is-color-stop "^1.0.0"
+ postcss "^6.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-minify-params@^1.0.4:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz#ad2ce071373b943b3d930a3fa59a358c28d6f1f3"
+ dependencies:
+ alphanum-sort "^1.0.1"
+ postcss "^5.0.2"
+ postcss-value-parser "^3.0.2"
+ uniqs "^2.0.0"
+
+postcss-minify-params@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.0.tgz#05e9166ee48c05af651989ce84d39c1b4d790674"
+ dependencies:
+ alphanum-sort "^1.0.0"
+ cssnano-util-get-arguments "^4.0.0"
+ postcss "^6.0.0"
+ postcss-value-parser "^3.0.0"
+ uniqs "^2.0.0"
+
+postcss-minify-selectors@^2.0.4:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz#b2c6a98c0072cf91b932d1a496508114311735bf"
+ dependencies:
+ alphanum-sort "^1.0.2"
+ has "^1.0.1"
+ postcss "^5.0.14"
+ postcss-selector-parser "^2.0.0"
+
+postcss-minify-selectors@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.0.tgz#b1e9f6c463416d3fcdcb26e7b785d95f61578aad"
+ dependencies:
+ alphanum-sort "^1.0.0"
+ has "^1.0.0"
+ postcss "^6.0.0"
+ postcss-selector-parser "^3.0.0"
+
+postcss-normalize-charset@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz#ef9ee71212d7fe759c78ed162f61ed62b5cb93f1"
+ dependencies:
+ postcss "^5.0.5"
+
+postcss-normalize-charset@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.0.tgz#24527292702d5e8129eafa3d1de49ed51a6ab730"
+ dependencies:
+ postcss "^6.0.0"
+
+postcss-normalize-display-values@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.0.tgz#950e0c7be3445770a160fffd6b6644c3c0cd8f89"
+ dependencies:
+ cssnano-util-get-match "^4.0.0"
+ postcss "^6.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-positions@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.0.tgz#ee9343ab981b822c63ab72615ecccd08564445a3"
+ dependencies:
+ cssnano-util-get-arguments "^4.0.0"
+ has "^1.0.0"
+ postcss "^6.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-repeat-style@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.0.tgz#b711c592cf16faf9ff575e42fa100b6799083eff"
+ dependencies:
+ cssnano-util-get-arguments "^4.0.0"
+ cssnano-util-get-match "^4.0.0"
+ postcss "^6.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-string@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.0.tgz#718cb6d30a6fac6ac6a830e32c06c07dbc66fe5d"
+ dependencies:
+ has "^1.0.0"
+ postcss "^6.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-timing-functions@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.0.tgz#0351f29886aa981d43d91b2c2bd1aea6d0af6d23"
+ dependencies:
+ cssnano-util-get-match "^4.0.0"
+ postcss "^6.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-unicode@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.0.tgz#5acd5d47baea5d17674b2ccc4ae5166fa88cdf97"
+ dependencies:
+ postcss "^6.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-url@^3.0.7:
+ version "3.0.8"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz#108f74b3f2fcdaf891a2ffa3ea4592279fc78222"
+ dependencies:
+ is-absolute-url "^2.0.0"
+ normalize-url "^1.4.0"
+ postcss "^5.0.14"
+ postcss-value-parser "^3.2.3"
+
+postcss-normalize-url@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.0.tgz#b7a9c8ad26cf26694c146eb2d68bd0cf49956f0d"
+ dependencies:
+ is-absolute-url "^2.0.0"
+ normalize-url "^3.0.0"
+ postcss "^6.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-normalize-whitespace@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.0.tgz#1da7e76b10ae63c11827fa04fc3bb4a1efe99cc0"
+ dependencies:
+ postcss "^6.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-ordered-values@^2.1.0:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz#eec6c2a67b6c412a8db2042e77fe8da43f95c11d"
+ dependencies:
+ postcss "^5.0.4"
+ postcss-value-parser "^3.0.1"
+
+postcss-ordered-values@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.0.0.tgz#58b40c74f72e022eb34152c12e4b0f9354482fc2"
+ dependencies:
+ cssnano-util-get-arguments "^4.0.0"
+ postcss "^6.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-reduce-idents@^2.2.2:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz#c2c6d20cc958284f6abfbe63f7609bf409059ad3"
+ dependencies:
+ postcss "^5.0.4"
+ postcss-value-parser "^3.0.2"
+
+postcss-reduce-initial@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz#68f80695f045d08263a879ad240df8dd64f644ea"
+ dependencies:
+ postcss "^5.0.4"
+
+postcss-reduce-initial@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.1.tgz#f2d58f50cea2b0c5dc1278d6ea5ed0ff5829c293"
+ dependencies:
+ browserslist "^4.0.0"
+ caniuse-api "^3.0.0"
+ has "^1.0.0"
+ postcss "^6.0.0"
+
+postcss-reduce-transforms@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz#ff76f4d8212437b31c298a42d2e1444025771ae1"
+ dependencies:
+ has "^1.0.1"
+ postcss "^5.0.8"
+ postcss-value-parser "^3.0.1"
+
+postcss-reduce-transforms@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.0.tgz#f645fc7440c35274f40de8104e14ad7163edf188"
+ dependencies:
+ cssnano-util-get-match "^4.0.0"
+ has "^1.0.0"
+ postcss "^6.0.0"
+ postcss-value-parser "^3.0.0"
+
+postcss-selector-parser@^2.0.0, postcss-selector-parser@^2.2.2:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz#f9437788606c3c9acee16ffe8d8b16297f27bb90"
+ dependencies:
+ flatten "^1.0.2"
+ indexes-of "^1.0.1"
+ uniq "^1.0.1"
+
+postcss-selector-parser@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz#4f875f4afb0c96573d5cf4d74011aee250a7e865"
+ dependencies:
+ dot-prop "^4.1.1"
+ indexes-of "^1.0.1"
+ uniq "^1.0.1"
+
+postcss-svgo@^2.1.1:
+ version "2.1.6"
+ resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-2.1.6.tgz#b6df18aa613b666e133f08adb5219c2684ac108d"
+ dependencies:
+ is-svg "^2.0.0"
+ postcss "^5.0.14"
+ postcss-value-parser "^3.2.3"
+ svgo "^0.7.0"
+
+postcss-svgo@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.0.tgz#c0bbad02520fc636c9d78b0e8403e2e515c32285"
+ dependencies:
+ is-svg "^3.0.0"
+ postcss "^6.0.0"
+ postcss-value-parser "^3.0.0"
+ svgo "^1.0.0"
+
+postcss-unique-selectors@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz#981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d"
+ dependencies:
+ alphanum-sort "^1.0.1"
+ postcss "^5.0.4"
+ uniqs "^2.0.0"
+
+postcss-unique-selectors@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.0.tgz#04c1e9764c75874261303402c41f0e9769fc5501"
+ dependencies:
+ alphanum-sort "^1.0.0"
+ postcss "^6.0.0"
+ uniqs "^2.0.0"
+
+postcss-value-parser@^3.0.0, postcss-value-parser@^3.0.1, postcss-value-parser@^3.0.2, postcss-value-parser@^3.1.1, postcss-value-parser@^3.1.2, postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz#87f38f9f18f774a4ab4c8a232f5c5ce8872a9d15"
+
+postcss-zindex@^2.0.1:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/postcss-zindex/-/postcss-zindex-2.2.0.tgz#d2109ddc055b91af67fc4cb3b025946639d2af22"
+ dependencies:
+ has "^1.0.1"
+ postcss "^5.0.4"
+ uniqs "^2.0.0"
+
+postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0.14, postcss@^5.0.16, postcss@^5.0.2, postcss@^5.0.4, postcss@^5.0.5, postcss@^5.0.8, postcss@^5.2.16:
+ version "5.2.18"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-5.2.18.tgz#badfa1497d46244f6390f58b319830d9107853c5"
+ dependencies:
+ chalk "^1.1.3"
+ js-base64 "^2.1.9"
+ source-map "^0.5.6"
+ supports-color "^3.2.3"
+
+postcss@^6.0.0, postcss@^6.0.19:
+ version "6.0.23"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324"
+ dependencies:
+ chalk "^2.4.1"
+ source-map "^0.6.1"
+ supports-color "^5.4.0"
+
+posthtml-parser@^0.3.3:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/posthtml-parser/-/posthtml-parser-0.3.3.tgz#3fe986fca9f00c0f109d731ba590b192f26e776d"
+ dependencies:
+ htmlparser2 "^3.9.2"
+ isobject "^2.1.0"
+ object-assign "^4.1.1"
+
+posthtml-parser@^0.4.0:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/posthtml-parser/-/posthtml-parser-0.4.1.tgz#95b78fef766fbbe0a6f861b6e95582bc3d1ff933"
+ dependencies:
+ htmlparser2 "^3.9.2"
+ object-assign "^4.1.1"
+
+posthtml-render@^1.1.0, posthtml-render@^1.1.3:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/posthtml-render/-/posthtml-render-1.1.4.tgz#95dac09892f4f183fad5ac823f08f42c0256551e"
+
+posthtml@^0.11.2, posthtml@^0.11.3:
+ version "0.11.3"
+ resolved "https://registry.yarnpkg.com/posthtml/-/posthtml-0.11.3.tgz#17ea2921b0555b7455f33c977bd16d8b8cb74f27"
+ dependencies:
+ object-assign "^4.1.1"
+ posthtml-parser "^0.3.3"
+ posthtml-render "^1.1.0"
+
+prelude-ls@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+
+prepend-http@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
+
+private@^0.1.6, private@^0.1.8:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
+
+process-nextick-args@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
+
+process@^0.11.10:
+ version "0.11.10"
+ resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+
+proto-list@~1.2.1:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
+
+pseudomap@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+
+public-encrypt@^4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994"
+ dependencies:
+ bn.js "^4.1.0"
+ browserify-rsa "^4.0.0"
+ create-hash "^1.1.0"
+ parse-asn1 "^5.0.0"
+ randombytes "^2.0.1"
+
+punycode@1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+
+punycode@^1.2.4:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+
+q@^1.1.2:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
+
+query-string@^4.1.0:
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb"
+ dependencies:
+ object-assign "^4.1.0"
+ strict-uri-encode "^1.0.0"
+
+querystring-es3@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
+
+querystring@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+
+quote-stream@^1.0.1, quote-stream@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/quote-stream/-/quote-stream-1.0.2.tgz#84963f8c9c26b942e153feeb53aae74652b7e0b2"
+ dependencies:
+ buffer-equal "0.0.1"
+ minimist "^1.1.3"
+ through2 "^2.0.0"
+
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80"
+ dependencies:
+ safe-buffer "^5.1.0"
+
+randomfill@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
+ dependencies:
+ randombytes "^2.0.5"
+ safe-buffer "^5.1.0"
+
+range-parser@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e"
+
+rc@^1.2.7:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
+ dependencies:
+ deep-extend "^0.6.0"
+ ini "~1.3.0"
+ minimist "^1.2.0"
+ strip-json-comments "~2.0.1"
+
+readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.3:
+ version "2.3.6"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.3"
+ isarray "~1.0.0"
+ process-nextick-args "~2.0.0"
+ safe-buffer "~5.1.1"
+ string_decoder "~1.1.1"
+ util-deprecate "~1.0.1"
+
+readdirp@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"
+ dependencies:
+ graceful-fs "^4.1.2"
+ minimatch "^3.0.2"
+ readable-stream "^2.0.2"
+ set-immediate-shim "^1.0.1"
+
+reduce-css-calc@^1.2.6:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716"
+ dependencies:
+ balanced-match "^0.4.2"
+ math-expression-evaluator "^1.2.14"
+ reduce-function-call "^1.0.1"
+
+reduce-css-calc@^2.0.0:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-2.1.4.tgz#c20e9cda8445ad73d4ff4bea960c6f8353791708"
+ dependencies:
+ css-unit-converter "^1.1.1"
+ postcss-value-parser "^3.3.0"
+
+reduce-function-call@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/reduce-function-call/-/reduce-function-call-1.0.2.tgz#5a200bf92e0e37751752fe45b0ab330fd4b6be99"
+ dependencies:
+ balanced-match "^0.4.2"
+
+regenerate@^1.2.1:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11"
+
+regenerator-runtime@^0.11.0:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
+
+regenerator-transform@^0.10.0:
+ version "0.10.1"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd"
+ dependencies:
+ babel-runtime "^6.18.0"
+ babel-types "^6.19.0"
+ private "^0.1.6"
+
+regex-not@^1.0.0, regex-not@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+ dependencies:
+ extend-shallow "^3.0.2"
+ safe-regex "^1.1.0"
+
+regexpu-core@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"
+ dependencies:
+ regenerate "^1.2.1"
+ regjsgen "^0.2.0"
+ regjsparser "^0.1.4"
+
+regjsgen@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
+
+regjsparser@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
+ dependencies:
+ jsesc "~0.5.0"
+
+remove-trailing-separator@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+
+repeat-element@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
+
+repeat-string@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+
+repeating@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
+ dependencies:
+ is-finite "^1.0.0"
+
+resolve-url@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+
+resolve@^1.1.5, resolve@^1.4.0:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26"
+ dependencies:
+ path-parse "^1.0.5"
+
+restore-cursor@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
+ dependencies:
+ onetime "^2.0.0"
+ signal-exit "^3.0.2"
+
+ret@~0.1.10:
+ version "0.1.15"
+ resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+
+rgb-regex@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1"
+
+rgba-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3"
+
+rimraf@^2.6.1:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
+ dependencies:
+ glob "^7.0.5"
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+
+safe-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+ dependencies:
+ ret "~0.1.10"
+
+"safer-buffer@>= 2.1.2 < 3":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+
+safer-eval@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/safer-eval/-/safer-eval-1.2.3.tgz#73ba74a34bc8a07d6a44135c815fd18a8eebe7a0"
+ dependencies:
+ clones "^1.1.0"
+
+sax@^1.2.4, sax@~1.2.1, sax@~1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+
+semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
+
+send@0.16.2:
+ version "0.16.2"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1"
+ dependencies:
+ debug "2.6.9"
+ depd "~1.1.2"
+ destroy "~1.0.4"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ fresh "0.5.2"
+ http-errors "~1.6.2"
+ mime "1.4.1"
+ ms "2.0.0"
+ on-finished "~2.3.0"
+ range-parser "~1.2.0"
+ statuses "~1.4.0"
+
+serialize-to-js@^1.1.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/serialize-to-js/-/serialize-to-js-1.2.1.tgz#2e87f61f938826d24c463a7cbd0dd2929ec38008"
+ dependencies:
+ js-beautify "^1.7.5"
+ safer-eval "^1.2.3"
+
+serve-static@^1.12.4:
+ version "1.13.2"
+ resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1"
+ dependencies:
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ parseurl "~1.3.2"
+ send "0.16.2"
+
+set-blocking@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+
+set-immediate-shim@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
+
+set-value@^0.4.3:
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.1"
+ to-object-path "^0.3.0"
+
+set-value@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274"
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.3"
+ split-string "^3.0.1"
+
+setimmediate@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+
+setprototypeof@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
+
+sha.js@^2.4.0, sha.js@^2.4.8:
+ version "2.4.11"
+ resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+shallow-copy@~0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/shallow-copy/-/shallow-copy-0.0.1.tgz#415f42702d73d810330292cc5ee86eae1a11a170"
+
+shebang-command@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+ dependencies:
+ shebang-regex "^1.0.0"
+
+shebang-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+
+sigmund@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590"
+
+signal-exit@^3.0.0, signal-exit@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
+
+simple-swizzle@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
+ dependencies:
+ is-arrayish "^0.3.1"
+
+slash@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
+
+snapdragon-node@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+ dependencies:
+ define-property "^1.0.0"
+ isobject "^3.0.0"
+ snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+ dependencies:
+ kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
+ dependencies:
+ base "^0.11.1"
+ debug "^2.2.0"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ map-cache "^0.2.2"
+ source-map "^0.5.6"
+ source-map-resolve "^0.5.0"
+ use "^3.1.0"
+
+sort-keys@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad"
+ dependencies:
+ is-plain-obj "^1.0.0"
+
+source-map-resolve@^0.5.0:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259"
+ dependencies:
+ atob "^2.1.1"
+ decode-uri-component "^0.2.0"
+ resolve-url "^0.2.1"
+ source-map-url "^0.4.0"
+ urix "^0.1.0"
+
+source-map-support@^0.4.15:
+ version "0.4.18"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
+ dependencies:
+ source-map "^0.5.6"
+
+source-map-support@~0.5.6:
+ version "0.5.6"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.6.tgz#4435cee46b1aab62b8e8610ce60f788091c51c13"
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map-url@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
+
+source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+
+source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+
+split-string@^3.0.1, split-string@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+ dependencies:
+ extend-shallow "^3.0.0"
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+
+stable@~0.1.6:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf"
+
+static-eval@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/static-eval/-/static-eval-2.0.0.tgz#0e821f8926847def7b4b50cda5d55c04a9b13864"
+ dependencies:
+ escodegen "^1.8.1"
+
+static-extend@^0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+ dependencies:
+ define-property "^0.2.5"
+ object-copy "^0.1.0"
+
+static-module@^2.2.0:
+ version "2.2.5"
+ resolved "https://registry.yarnpkg.com/static-module/-/static-module-2.2.5.tgz#bd40abceae33da6b7afb84a0e4329ff8852bfbbf"
+ dependencies:
+ concat-stream "~1.6.0"
+ convert-source-map "^1.5.1"
+ duplexer2 "~0.1.4"
+ escodegen "~1.9.0"
+ falafel "^2.1.0"
+ has "^1.0.1"
+ magic-string "^0.22.4"
+ merge-source-map "1.0.4"
+ object-inspect "~1.4.0"
+ quote-stream "~1.0.2"
+ readable-stream "~2.3.3"
+ shallow-copy "~0.0.1"
+ static-eval "^2.0.0"
+ through2 "~2.0.3"
+
+"statuses@>= 1.4.0 < 2":
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
+
+statuses@~1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
+
+stream-browserify@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db"
+ dependencies:
+ inherits "~2.0.1"
+ readable-stream "^2.0.2"
+
+stream-http@^2.7.2:
+ version "2.8.3"
+ resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc"
+ dependencies:
+ builtin-status-codes "^3.0.0"
+ inherits "^2.0.1"
+ readable-stream "^2.3.6"
+ to-arraybuffer "^1.0.0"
+ xtend "^4.0.0"
+
+strict-uri-encode@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
+
+string-width@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ strip-ansi "^3.0.0"
+
+"string-width@^1.0.2 || 2":
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^4.0.0"
+
+string_decoder@^1.0.0, string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ dependencies:
+ safe-buffer "~5.1.0"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+ dependencies:
+ ansi-regex "^2.0.0"
+
+strip-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+ dependencies:
+ ansi-regex "^3.0.0"
+
+strip-json-comments@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+
+stylehacks@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.0.tgz#64b323951c4a24e5fc7b2ec06c137bf32d155e8a"
+ dependencies:
+ browserslist "^4.0.0"
+ postcss "^6.0.0"
+ postcss-selector-parser "^3.0.0"
+
+supports-color@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+
+supports-color@^3.2.3:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
+ dependencies:
+ has-flag "^1.0.0"
+
+supports-color@^5.3.0, supports-color@^5.4.0:
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54"
+ dependencies:
+ has-flag "^3.0.0"
+
+svgo@^0.7.0:
+ version "0.7.2"
+ resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5"
+ dependencies:
+ coa "~1.0.1"
+ colors "~1.1.2"
+ csso "~2.3.1"
+ js-yaml "~3.7.0"
+ mkdirp "~0.5.1"
+ sax "~1.2.1"
+ whet.extend "~0.9.9"
+
+svgo@^1.0.0, svgo@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/svgo/-/svgo-1.0.5.tgz#7040364c062a0538abacff4401cea6a26a7a389a"
+ dependencies:
+ coa "~2.0.1"
+ colors "~1.1.2"
+ css-select "~1.3.0-rc0"
+ css-select-base-adapter "~0.1.0"
+ css-tree "1.0.0-alpha25"
+ css-url-regex "^1.1.0"
+ csso "^3.5.0"
+ js-yaml "~3.10.0"
+ mkdirp "~0.5.1"
+ object.values "^1.0.4"
+ sax "~1.2.4"
+ stable "~0.1.6"
+ unquote "~1.1.1"
+ util.promisify "~1.0.0"
+
+tar@^4:
+ version "4.4.4"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd"
+ dependencies:
+ chownr "^1.0.1"
+ fs-minipass "^1.2.5"
+ minipass "^2.3.3"
+ minizlib "^1.1.0"
+ mkdirp "^0.5.0"
+ safe-buffer "^5.1.2"
+ yallist "^3.0.2"
+
+terser@^3.7.3:
+ version "3.8.1"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-3.8.1.tgz#cb70070ac9e0a71add169dfb63c0a64fca2738ac"
+ dependencies:
+ commander "~2.16.0"
+ source-map "~0.6.1"
+ source-map-support "~0.5.6"
+
+through2@^2.0.0, through2@~2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
+ dependencies:
+ readable-stream "^2.1.5"
+ xtend "~4.0.1"
+
+timers-browserify@^2.0.4:
+ version "2.0.10"
+ resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae"
+ dependencies:
+ setimmediate "^1.0.4"
+
+timsort@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4"
+
+tiny-inflate@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/tiny-inflate/-/tiny-inflate-1.0.2.tgz#93d9decffc8805bd57eae4310f0b745e9b6fb3a7"
+
+to-arraybuffer@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
+
+to-fast-properties@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
+
+to-object-path@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+ dependencies:
+ kind-of "^3.0.2"
+
+to-regex-range@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+ dependencies:
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+
+to-regex@^3.0.1, to-regex@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+ dependencies:
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ regex-not "^1.0.2"
+ safe-regex "^1.1.0"
+
+toml@^2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/toml/-/toml-2.3.3.tgz#8d683d729577cb286231dfc7a8affe58d31728fb"
+
+tomlify-j0.4@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/tomlify-j0.4/-/tomlify-j0.4-3.0.0.tgz#99414d45268c3a3b8bf38be82145b7bba34b7473"
+
+trim-right@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
+
+tty-browserify@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
+
+type-check@~0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
+ dependencies:
+ prelude-ls "~1.1.2"
+
+typedarray@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+
+uglify-es@^3.3.9:
+ version "3.3.9"
+ resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677"
+ dependencies:
+ commander "~2.13.0"
+ source-map "~0.6.1"
+
+unicode-trie@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/unicode-trie/-/unicode-trie-0.3.1.tgz#d671dddd89101a08bac37b6a5161010602052085"
+ dependencies:
+ pako "^0.2.5"
+ tiny-inflate "^1.0.0"
+
+union-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"
+ dependencies:
+ arr-union "^3.1.0"
+ get-value "^2.0.6"
+ is-extendable "^0.1.1"
+ set-value "^0.4.3"
+
+uniq@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
+
+uniqs@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz#ffede4b36b25290696e6e165d4a59edb998e6b02"
+
+unquote@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544"
+
+unset-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+ dependencies:
+ has-value "^0.3.1"
+ isobject "^3.0.0"
+
+upath@^1.0.5:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd"
+
+urix@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+
+url@^0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
+ dependencies:
+ punycode "1.3.2"
+ querystring "0.2.0"
+
+use@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
+
+util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+
+util.promisify@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030"
+ dependencies:
+ define-properties "^1.1.2"
+ object.getownpropertydescriptors "^2.0.3"
+
+util@0.10.3:
+ version "0.10.3"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
+ dependencies:
+ inherits "2.0.1"
+
+util@^0.10.3:
+ version "0.10.4"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901"
+ dependencies:
+ inherits "2.0.3"
+
+v8-compile-cache@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.0.tgz#526492e35fc616864284700b7043e01baee09f0a"
+
+vendors@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.2.tgz#7fcb5eef9f5623b156bcea89ec37d63676f21801"
+
+vlq@^0.2.2:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26"
+
+vm-browserify@0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
+ dependencies:
+ indexof "0.0.1"
+
+wcwidth@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
+ dependencies:
+ defaults "^1.0.3"
+
+whet.extend@~0.9.9:
+ version "0.9.9"
+ resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1"
+
+which@^1.2.9:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+ dependencies:
+ isexe "^2.0.0"
+
+wide-align@^1.1.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
+ dependencies:
+ string-width "^1.0.2 || 2"
+
+wordwrap@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+
+ws@^5.1.1:
+ version "5.2.2"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f"
+ dependencies:
+ async-limiter "~1.0.0"
+
+xtend@^4.0.0, xtend@~4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
+
+yallist@^3.0.0, yallist@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9"
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/rollup-babel6/index.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/rollup-babel6/index.js
new file mode 100644
index 0000000000..8ba89eb46f
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/rollup-babel6/index.js
@@ -0,0 +1,82 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+const path = require("path");
+const _ = require("lodash");
+const rollup = require("rollup");
+const rollupBabel = require("rollup-plugin-babel");
+
+const TARGET_NAME = "rollup-babel6";
+
+module.exports = exports = async function(tests, dirname) {
+ const fixtures = [];
+ for (const [name, input] of tests) {
+ if (/typescript-|-cjs/.test(name)) {
+ continue;
+ }
+
+ const testFnName = _.camelCase(`${TARGET_NAME}-${name}`);
+ const babelEnv = !name.match(/-es6/);
+
+ const scriptPath = path.join(dirname, "output", TARGET_NAME, `${name}.js`);
+
+ console.log(`Building ${TARGET_NAME} test ${name}`);
+
+ const bundle = await rollup.rollup({
+ input: "fake-bundle-root",
+ plugins: [
+ // Our input file may export more than the default, but we
+ // want to enable 'exports: "default",' so we need the root
+ // import to only have a default export.
+ {
+ resolveId: id => (id === "fake-bundle-root" ? id : undefined),
+ load: id =>
+ id === "fake-bundle-root"
+ ? `import test from "${input}"; export default test;`
+ : undefined
+ },
+ rollupBabel({
+ babelrc: false,
+ presets: [
+ babelEnv
+ ? [require.resolve("babel-preset-env"), { modules: false }]
+ : null
+ ].filter(Boolean),
+ plugins: [
+ require.resolve("babel-plugin-transform-flow-strip-types"),
+ require.resolve("babel-plugin-transform-class-properties")
+ ]
+ }),
+ {
+ ongenerate(out, data) {
+ data.map.sources = data.map.sources.map(source =>
+ source.replace(/^fixtures[\\/]/, `${TARGET_NAME}://./`)
+ );
+ }
+ }
+ ].filter(Boolean)
+ });
+
+ await bundle.write({
+ file: path.basename(scriptPath),
+ dir: path.dirname(scriptPath),
+ format: "iife",
+ name: testFnName,
+ sourcemap: true,
+ exports: "default"
+ });
+
+ fixtures.push({
+ name,
+ testFnName: testFnName,
+ scriptPath,
+ assets: [scriptPath, `${scriptPath}.map`]
+ });
+ }
+
+ return {
+ target: TARGET_NAME,
+ fixtures
+ };
+};
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/rollup-babel6/package.json b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/rollup-babel6/package.json
new file mode 100644
index 0000000000..7896d6bf36
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/rollup-babel6/package.json
@@ -0,0 +1,12 @@
+{
+ "name": "sourcemapped-rollup",
+ "private": true,
+ "dependencies": {
+ "babel-core": "^6.26.3",
+ "babel-plugin-transform-flow-strip-types": "^6.22.0",
+ "babel-preset-env": "^1.7.0",
+ "lodash": "^4.17.5",
+ "rollup": "^0.63.0",
+ "rollup-plugin-babel": "^3.0.7"
+ }
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/rollup-babel6/yarn.lock b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/rollup-babel6/yarn.lock
new file mode 100644
index 0000000000..03cc095c8d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/rollup-babel6/yarn.lock
@@ -0,0 +1,755 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@types/estree@0.0.39":
+ version "0.0.39"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f"
+
+"@types/node@*":
+ version "10.5.3"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-10.5.3.tgz#5bcfaf088ad17894232012877669634c06b20cc5"
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+
+ansi-styles@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+
+babel-code-frame@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
+ dependencies:
+ chalk "^1.1.3"
+ esutils "^2.0.2"
+ js-tokens "^3.0.2"
+
+babel-core@^6.26.0, babel-core@^6.26.3:
+ version "6.26.3"
+ resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207"
+ dependencies:
+ babel-code-frame "^6.26.0"
+ babel-generator "^6.26.0"
+ babel-helpers "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-register "^6.26.0"
+ babel-runtime "^6.26.0"
+ babel-template "^6.26.0"
+ babel-traverse "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+ convert-source-map "^1.5.1"
+ debug "^2.6.9"
+ json5 "^0.5.1"
+ lodash "^4.17.4"
+ minimatch "^3.0.4"
+ path-is-absolute "^1.0.1"
+ private "^0.1.8"
+ slash "^1.0.0"
+ source-map "^0.5.7"
+
+babel-generator@^6.26.0:
+ version "6.26.1"
+ resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90"
+ dependencies:
+ babel-messages "^6.23.0"
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ detect-indent "^4.0.0"
+ jsesc "^1.3.0"
+ lodash "^4.17.4"
+ source-map "^0.5.7"
+ trim-right "^1.0.1"
+
+babel-helper-builder-binary-assignment-operator-visitor@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664"
+ dependencies:
+ babel-helper-explode-assignable-expression "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-call-delegate@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d"
+ dependencies:
+ babel-helper-hoist-variables "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-define-map@^6.24.1:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f"
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ lodash "^4.17.4"
+
+babel-helper-explode-assignable-expression@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-function-name@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9"
+ dependencies:
+ babel-helper-get-function-arity "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-get-function-arity@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-hoist-variables@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-optimise-call-expression@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-regex@^6.24.1:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72"
+ dependencies:
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ lodash "^4.17.4"
+
+babel-helper-remap-async-to-generator@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b"
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-replace-supers@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"
+ dependencies:
+ babel-helper-optimise-call-expression "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helpers@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-messages@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-check-es2015-constants@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-syntax-async-functions@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
+
+babel-plugin-syntax-exponentiation-operator@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de"
+
+babel-plugin-syntax-flow@^6.18.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d"
+
+babel-plugin-syntax-trailing-function-commas@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3"
+
+babel-plugin-transform-async-to-generator@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761"
+ dependencies:
+ babel-helper-remap-async-to-generator "^6.24.1"
+ babel-plugin-syntax-async-functions "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-arrow-functions@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoped-functions@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoping@^6.23.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f"
+ dependencies:
+ babel-runtime "^6.26.0"
+ babel-template "^6.26.0"
+ babel-traverse "^6.26.0"
+ babel-types "^6.26.0"
+ lodash "^4.17.4"
+
+babel-plugin-transform-es2015-classes@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db"
+ dependencies:
+ babel-helper-define-map "^6.24.1"
+ babel-helper-function-name "^6.24.1"
+ babel-helper-optimise-call-expression "^6.24.1"
+ babel-helper-replace-supers "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-computed-properties@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-destructuring@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-duplicate-keys@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-for-of@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-function-name@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b"
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-literals@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154"
+ dependencies:
+ babel-plugin-transform-es2015-modules-commonjs "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1:
+ version "6.26.2"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3"
+ dependencies:
+ babel-plugin-transform-strict-mode "^6.24.1"
+ babel-runtime "^6.26.0"
+ babel-template "^6.26.0"
+ babel-types "^6.26.0"
+
+babel-plugin-transform-es2015-modules-systemjs@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23"
+ dependencies:
+ babel-helper-hoist-variables "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-umd@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468"
+ dependencies:
+ babel-plugin-transform-es2015-modules-amd "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-object-super@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d"
+ dependencies:
+ babel-helper-replace-supers "^6.24.1"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-parameters@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b"
+ dependencies:
+ babel-helper-call-delegate "^6.24.1"
+ babel-helper-get-function-arity "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-shorthand-properties@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-spread@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-sticky-regex@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc"
+ dependencies:
+ babel-helper-regex "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-template-literals@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-typeof-symbol@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-unicode-regex@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9"
+ dependencies:
+ babel-helper-regex "^6.24.1"
+ babel-runtime "^6.22.0"
+ regexpu-core "^2.0.0"
+
+babel-plugin-transform-exponentiation-operator@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e"
+ dependencies:
+ babel-helper-builder-binary-assignment-operator-visitor "^6.24.1"
+ babel-plugin-syntax-exponentiation-operator "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-flow-strip-types@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf"
+ dependencies:
+ babel-plugin-syntax-flow "^6.18.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-regenerator@^6.22.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f"
+ dependencies:
+ regenerator-transform "^0.10.0"
+
+babel-plugin-transform-strict-mode@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-preset-env@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a"
+ dependencies:
+ babel-plugin-check-es2015-constants "^6.22.0"
+ babel-plugin-syntax-trailing-function-commas "^6.22.0"
+ babel-plugin-transform-async-to-generator "^6.22.0"
+ babel-plugin-transform-es2015-arrow-functions "^6.22.0"
+ babel-plugin-transform-es2015-block-scoped-functions "^6.22.0"
+ babel-plugin-transform-es2015-block-scoping "^6.23.0"
+ babel-plugin-transform-es2015-classes "^6.23.0"
+ babel-plugin-transform-es2015-computed-properties "^6.22.0"
+ babel-plugin-transform-es2015-destructuring "^6.23.0"
+ babel-plugin-transform-es2015-duplicate-keys "^6.22.0"
+ babel-plugin-transform-es2015-for-of "^6.23.0"
+ babel-plugin-transform-es2015-function-name "^6.22.0"
+ babel-plugin-transform-es2015-literals "^6.22.0"
+ babel-plugin-transform-es2015-modules-amd "^6.22.0"
+ babel-plugin-transform-es2015-modules-commonjs "^6.23.0"
+ babel-plugin-transform-es2015-modules-systemjs "^6.23.0"
+ babel-plugin-transform-es2015-modules-umd "^6.23.0"
+ babel-plugin-transform-es2015-object-super "^6.22.0"
+ babel-plugin-transform-es2015-parameters "^6.23.0"
+ babel-plugin-transform-es2015-shorthand-properties "^6.22.0"
+ babel-plugin-transform-es2015-spread "^6.22.0"
+ babel-plugin-transform-es2015-sticky-regex "^6.22.0"
+ babel-plugin-transform-es2015-template-literals "^6.22.0"
+ babel-plugin-transform-es2015-typeof-symbol "^6.23.0"
+ babel-plugin-transform-es2015-unicode-regex "^6.22.0"
+ babel-plugin-transform-exponentiation-operator "^6.22.0"
+ babel-plugin-transform-regenerator "^6.22.0"
+ browserslist "^3.2.6"
+ invariant "^2.2.2"
+ semver "^5.3.0"
+
+babel-register@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071"
+ dependencies:
+ babel-core "^6.26.0"
+ babel-runtime "^6.26.0"
+ core-js "^2.5.0"
+ home-or-tmp "^2.0.0"
+ lodash "^4.17.4"
+ mkdirp "^0.5.1"
+ source-map-support "^0.4.15"
+
+babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
+ dependencies:
+ core-js "^2.4.0"
+ regenerator-runtime "^0.11.0"
+
+babel-template@^6.24.1, babel-template@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
+ dependencies:
+ babel-runtime "^6.26.0"
+ babel-traverse "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+ lodash "^4.17.4"
+
+babel-traverse@^6.24.1, babel-traverse@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
+ dependencies:
+ babel-code-frame "^6.26.0"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+ debug "^2.6.8"
+ globals "^9.18.0"
+ invariant "^2.2.2"
+ lodash "^4.17.4"
+
+babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
+ dependencies:
+ babel-runtime "^6.26.0"
+ esutils "^2.0.2"
+ lodash "^4.17.4"
+ to-fast-properties "^1.0.3"
+
+babylon@^6.18.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
+
+balanced-match@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+browserslist@^3.2.6:
+ version "3.2.8"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6"
+ dependencies:
+ caniuse-lite "^1.0.30000844"
+ electron-to-chromium "^1.3.47"
+
+caniuse-lite@^1.0.30000844:
+ version "1.0.30000865"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz#70026616e8afe6e1442f8bb4e1092987d81a2f25"
+
+chalk@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+ dependencies:
+ ansi-styles "^2.2.1"
+ escape-string-regexp "^1.0.2"
+ has-ansi "^2.0.0"
+ strip-ansi "^3.0.0"
+ supports-color "^2.0.0"
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+
+convert-source-map@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5"
+
+core-js@^2.4.0, core-js@^2.5.0:
+ version "2.5.7"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e"
+
+debug@^2.6.8, debug@^2.6.9:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ dependencies:
+ ms "2.0.0"
+
+detect-indent@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
+ dependencies:
+ repeating "^2.0.0"
+
+electron-to-chromium@^1.3.47:
+ version "1.3.52"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.52.tgz#d2d9f1270ba4a3b967b831c40ef71fb4d9ab5ce0"
+
+escape-string-regexp@^1.0.2:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+
+estree-walker@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.2.1.tgz#bdafe8095383d8414d5dc2ecf4c9173b6db9412e"
+
+esutils@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
+
+globals@^9.18.0:
+ version "9.18.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
+
+has-ansi@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+ dependencies:
+ ansi-regex "^2.0.0"
+
+home-or-tmp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.1"
+
+invariant@^2.2.2:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
+ dependencies:
+ loose-envify "^1.0.0"
+
+is-finite@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
+ dependencies:
+ number-is-nan "^1.0.0"
+
+"js-tokens@^3.0.0 || ^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+
+js-tokens@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
+
+jsesc@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
+
+jsesc@~0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+
+json5@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+
+lodash@^4.17.4, lodash@^4.17.5:
+ version "4.17.10"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"
+
+loose-envify@^1.0.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+minimatch@^3.0.2, minimatch@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@0.0.8:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+
+mkdirp@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+ dependencies:
+ minimist "0.0.8"
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+
+number-is-nan@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+
+os-homedir@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+
+os-tmpdir@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+
+path-is-absolute@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+
+private@^0.1.6, private@^0.1.8:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
+
+regenerate@^1.2.1:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11"
+
+regenerator-runtime@^0.11.0:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
+
+regenerator-transform@^0.10.0:
+ version "0.10.1"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd"
+ dependencies:
+ babel-runtime "^6.18.0"
+ babel-types "^6.19.0"
+ private "^0.1.6"
+
+regexpu-core@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"
+ dependencies:
+ regenerate "^1.2.1"
+ regjsgen "^0.2.0"
+ regjsparser "^0.1.4"
+
+regjsgen@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
+
+regjsparser@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
+ dependencies:
+ jsesc "~0.5.0"
+
+repeating@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
+ dependencies:
+ is-finite "^1.0.0"
+
+rollup-plugin-babel@^3.0.7:
+ version "3.0.7"
+ resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-3.0.7.tgz#5b13611f1ab8922497e9d15197ae5d8a23fe3b1e"
+ dependencies:
+ rollup-pluginutils "^1.5.0"
+
+rollup-pluginutils@^1.5.0:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz#1e156e778f94b7255bfa1b3d0178be8f5c552408"
+ dependencies:
+ estree-walker "^0.2.1"
+ minimatch "^3.0.2"
+
+rollup@^0.63.0:
+ version "0.63.4"
+ resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.63.4.tgz#cb58bf6c2a6c38542cae250684c962799ad7c00c"
+ dependencies:
+ "@types/estree" "0.0.39"
+ "@types/node" "*"
+
+semver@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
+
+slash@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
+
+source-map-support@^0.4.15:
+ version "0.4.18"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
+ dependencies:
+ source-map "^0.5.6"
+
+source-map@^0.5.6, source-map@^0.5.7:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+
+strip-ansi@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+ dependencies:
+ ansi-regex "^2.0.0"
+
+supports-color@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+
+to-fast-properties@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
+
+trim-right@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/rollup-babel7/index.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/rollup-babel7/index.js
new file mode 100644
index 0000000000..4bd0563201
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/rollup-babel7/index.js
@@ -0,0 +1,82 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+const path = require("path");
+const _ = require("lodash");
+const rollup = require("rollup");
+const rollupBabel = require("rollup-plugin-babel");
+
+const TARGET_NAME = "rollup-babel7";
+
+module.exports = exports = async function(tests, dirname) {
+ const fixtures = [];
+ for (const [name, input] of tests) {
+ if (/typescript-|-cjs/.test(name)) {
+ continue;
+ }
+
+ const testFnName = _.camelCase(`${TARGET_NAME}-${name}`);
+ const babelEnv = !name.match(/-es6/);
+
+ const scriptPath = path.join(dirname, "output", TARGET_NAME, `${name}.js`);
+
+ console.log(`Building ${TARGET_NAME} test ${name}`);
+
+ const bundle = await rollup.rollup({
+ input: "fake-bundle-root",
+ plugins: [
+ // Our input file may export more than the default, but we
+ // want to enable 'exports: "default",' so we need the root
+ // import to only have a default export.
+ {
+ resolveId: id => (id === "fake-bundle-root" ? id : undefined),
+ load: id =>
+ id === "fake-bundle-root"
+ ? `import test from "${input}"; export default test;`
+ : undefined
+ },
+ rollupBabel({
+ babelrc: false,
+ plugins: [
+ require.resolve("@babel/plugin-proposal-class-properties")
+ ],
+ presets: [
+ require.resolve("@babel/preset-flow"),
+ babelEnv
+ ? [require.resolve("@babel/preset-env"), { modules: false }]
+ : null
+ ].filter(Boolean)
+ }),
+ {
+ ongenerate(out, data) {
+ data.map.sources = data.map.sources.map(source =>
+ source.replace(/^fixtures[\\/]/, `${TARGET_NAME}://./`)
+ );
+ }
+ }
+ ].filter(Boolean)
+ });
+
+ await bundle.write({
+ file: path.basename(scriptPath),
+ dir: path.dirname(scriptPath),
+ format: "iife",
+ name: testFnName,
+ sourcemap: true,
+ exports: "default"
+ });
+
+ fixtures.push({
+ name,
+ testFnName: testFnName,
+ scriptPath,
+ assets: [scriptPath, `${scriptPath}.map`]
+ });
+ }
+
+ return {
+ target: TARGET_NAME,
+ fixtures
+ };
+};
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/rollup-babel7/package.json b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/rollup-babel7/package.json
new file mode 100644
index 0000000000..924df835a7
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/rollup-babel7/package.json
@@ -0,0 +1,13 @@
+{
+ "name": "sourcemapped-rollup",
+ "private": true,
+ "dependencies": {
+ "@babel/core": "^7.0.0-beta.54",
+ "@babel/preset-env": "^7.0.0-beta.54",
+ "@babel/preset-flow": "^7.0.0-beta.54",
+ "@babel/plugin-proposal-class-properties": "^7.0.0-beta.54",
+ "lodash": "^4.17.5",
+ "rollup": "^0.63.0",
+ "rollup-plugin-babel": "^4.0.0-beta.7"
+ }
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/rollup-babel7/yarn.lock b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/rollup-babel7/yarn.lock
new file mode 100644
index 0000000000..c31bbd45a3
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/rollup-babel7/yarn.lock
@@ -0,0 +1,1115 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@babel/code-frame@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.54.tgz#0024f96fdf7028a21d68e273afd4e953214a1ead"
+ dependencies:
+ "@babel/highlight" "7.0.0-beta.54"
+
+"@babel/code-frame@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-rc.1.tgz#5c2154415d6c09959a71845ef519d11157e95d10"
+ dependencies:
+ "@babel/highlight" "7.0.0-rc.1"
+
+"@babel/core@^7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.0.0-beta.54.tgz#253c54d0095403a5cfa764e7d9b458194692d02b"
+ dependencies:
+ "@babel/code-frame" "7.0.0-beta.54"
+ "@babel/generator" "7.0.0-beta.54"
+ "@babel/helpers" "7.0.0-beta.54"
+ "@babel/parser" "7.0.0-beta.54"
+ "@babel/template" "7.0.0-beta.54"
+ "@babel/traverse" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+ convert-source-map "^1.1.0"
+ debug "^3.1.0"
+ json5 "^0.5.0"
+ lodash "^4.17.5"
+ resolve "^1.3.2"
+ semver "^5.4.1"
+ source-map "^0.5.0"
+
+"@babel/generator@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.54.tgz#c043c7eebeebfd7e665d95c281a4aafc83d4e1c9"
+ dependencies:
+ "@babel/types" "7.0.0-beta.54"
+ jsesc "^2.5.1"
+ lodash "^4.17.5"
+ source-map "^0.5.0"
+ trim-right "^1.0.1"
+
+"@babel/generator@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-rc.1.tgz#739c87d70b31aeed802bd6bc9fd51480065c45e8"
+ dependencies:
+ "@babel/types" "7.0.0-rc.1"
+ jsesc "^2.5.1"
+ lodash "^4.17.10"
+ source-map "^0.5.0"
+ trim-right "^1.0.1"
+
+"@babel/helper-annotate-as-pure@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0-beta.54.tgz#1626126a3f9fc4ed280ac942372c7d39653d7121"
+ dependencies:
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helper-builder-binary-assignment-operator-visitor@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.0.0-beta.54.tgz#d0a1967635b9eebcafdba80491917ee4981c12fa"
+ dependencies:
+ "@babel/helper-explode-assignable-expression" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helper-call-delegate@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.0.0-beta.54.tgz#f6b72cfd832fb26eb2a806e18de05f88d3a8f302"
+ dependencies:
+ "@babel/helper-hoist-variables" "7.0.0-beta.54"
+ "@babel/traverse" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helper-define-map@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.0.0-beta.54.tgz#2036d7c49365987f091db9702ce2f3b55f677730"
+ dependencies:
+ "@babel/helper-function-name" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+ lodash "^4.17.5"
+
+"@babel/helper-explode-assignable-expression@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.0.0-beta.54.tgz#cf067f3330965c2048bf087ea06f62c76d94a792"
+ dependencies:
+ "@babel/traverse" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helper-function-name@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.54.tgz#307875507a1eda2482a09a9a4df6a25632ffb34b"
+ dependencies:
+ "@babel/helper-get-function-arity" "7.0.0-beta.54"
+ "@babel/template" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helper-function-name@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-rc.1.tgz#20b2cc836a53c669f297c8d309fc553385c5cdde"
+ dependencies:
+ "@babel/helper-get-function-arity" "7.0.0-rc.1"
+ "@babel/template" "7.0.0-rc.1"
+ "@babel/types" "7.0.0-rc.1"
+
+"@babel/helper-get-function-arity@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.54.tgz#757bd189b077074a004028cfde5f083c306cc6c4"
+ dependencies:
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helper-get-function-arity@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-rc.1.tgz#60185957f72ed73766ce74c836ac574921743c46"
+ dependencies:
+ "@babel/types" "7.0.0-rc.1"
+
+"@babel/helper-hoist-variables@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0-beta.54.tgz#8635be8095135ff73f753ed189e449f68b4f43cb"
+ dependencies:
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helper-member-expression-to-functions@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0-beta.54.tgz#bce9ddc484317b13d2615bafe2b524d0d56d99df"
+ dependencies:
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helper-member-expression-to-functions@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0-rc.1.tgz#03a3b200fc00f8100dbcef9a351b69cfc0234b4f"
+ dependencies:
+ "@babel/types" "7.0.0-rc.1"
+
+"@babel/helper-module-imports@7.0.0-beta.51":
+ version "7.0.0-beta.51"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0-beta.51.tgz#ce00428045fbb7d5ebc0ea7bf835789f15366ab2"
+ dependencies:
+ "@babel/types" "7.0.0-beta.51"
+ lodash "^4.17.5"
+
+"@babel/helper-module-imports@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0-beta.54.tgz#c2d8e14ff034225bf431356db77ef467b8d35aac"
+ dependencies:
+ "@babel/types" "7.0.0-beta.54"
+ lodash "^4.17.5"
+
+"@babel/helper-module-transforms@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.0.0-beta.54.tgz#8cc57eb0db5f0945d866524d555abd084e30cc35"
+ dependencies:
+ "@babel/helper-module-imports" "7.0.0-beta.54"
+ "@babel/helper-simple-access" "7.0.0-beta.54"
+ "@babel/helper-split-export-declaration" "7.0.0-beta.54"
+ "@babel/template" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+ lodash "^4.17.5"
+
+"@babel/helper-optimise-call-expression@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0-beta.54.tgz#4af8dd4ff90dbd29b3bcf85fff43952e2ae1016e"
+ dependencies:
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helper-optimise-call-expression@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0-rc.1.tgz#482d8251870f61d88c9800fd3e58128e14ff8c98"
+ dependencies:
+ "@babel/types" "7.0.0-rc.1"
+
+"@babel/helper-plugin-utils@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0-beta.54.tgz#61d2a9a0f9a3e31838a458debb9eebd7bdd249b4"
+
+"@babel/helper-plugin-utils@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0-rc.1.tgz#3e277eae59818e7d4caf4174f58a7a00d441336e"
+
+"@babel/helper-regex@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.0.0-beta.54.tgz#8ac562f855f132fc68dfd10b132552555ac870d9"
+ dependencies:
+ lodash "^4.17.5"
+
+"@babel/helper-remap-async-to-generator@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.0.0-beta.54.tgz#39a50052aadd74d40c73b7c58eb963b90fac56d3"
+ dependencies:
+ "@babel/helper-annotate-as-pure" "7.0.0-beta.54"
+ "@babel/helper-wrap-function" "7.0.0-beta.54"
+ "@babel/template" "7.0.0-beta.54"
+ "@babel/traverse" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helper-replace-supers@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.0.0-beta.54.tgz#901f5a1493a410799fd3ab3e0c0d29d18071c89f"
+ dependencies:
+ "@babel/helper-member-expression-to-functions" "7.0.0-beta.54"
+ "@babel/helper-optimise-call-expression" "7.0.0-beta.54"
+ "@babel/traverse" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helper-replace-supers@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.0.0-rc.1.tgz#cab8d7a6c758e4561fb285f4725c850d68c1c3db"
+ dependencies:
+ "@babel/helper-member-expression-to-functions" "7.0.0-rc.1"
+ "@babel/helper-optimise-call-expression" "7.0.0-rc.1"
+ "@babel/traverse" "7.0.0-rc.1"
+ "@babel/types" "7.0.0-rc.1"
+
+"@babel/helper-simple-access@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.0.0-beta.54.tgz#5f760a19589a9b6f07e80a65ef4bcbd4fba8c253"
+ dependencies:
+ "@babel/template" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+ lodash "^4.17.5"
+
+"@babel/helper-split-export-declaration@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.54.tgz#89cd8833c95481a0827ac6a1bfccddb92b75a109"
+ dependencies:
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helper-split-export-declaration@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-rc.1.tgz#b00323834343fd0210f1f46c7a53521ad53efa5e"
+ dependencies:
+ "@babel/types" "7.0.0-rc.1"
+
+"@babel/helper-wrap-function@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.0.0-beta.54.tgz#dc1b7a483a3074a3531b36523e03156d910a3a2a"
+ dependencies:
+ "@babel/helper-function-name" "7.0.0-beta.54"
+ "@babel/template" "7.0.0-beta.54"
+ "@babel/traverse" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helpers@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.0.0-beta.54.tgz#b86a99a80efd81668caef307610b961197446a74"
+ dependencies:
+ "@babel/template" "7.0.0-beta.54"
+ "@babel/traverse" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/highlight@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.54.tgz#155d507358329b8e7068970017c3fd74a9b08584"
+ dependencies:
+ chalk "^2.0.0"
+ esutils "^2.0.2"
+ js-tokens "^3.0.0"
+
+"@babel/highlight@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-rc.1.tgz#e0ca4731fa4786f7b9500421d6ff5e5a7753e81e"
+ dependencies:
+ chalk "^2.0.0"
+ esutils "^2.0.2"
+ js-tokens "^3.0.0"
+
+"@babel/parser@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.0.0-beta.54.tgz#c01aa63b57c9c8dce8744796c81d9df121f20db4"
+
+"@babel/parser@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.0.0-rc.1.tgz#d009a9bba8175d7b971e30cd03535b278c44082d"
+
+"@babel/plugin-proposal-async-generator-functions@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.0.0-beta.54.tgz#19871bd655b5d748b0ae3e9ecebe247be8b7f83b"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/helper-remap-async-to-generator" "7.0.0-beta.54"
+ "@babel/plugin-syntax-async-generators" "7.0.0-beta.54"
+
+"@babel/plugin-proposal-class-properties@^7.0.0-beta.54":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.0.0-rc.1.tgz#88b3d3b257b9ed53fae50b13103e4c3c725e704e"
+ dependencies:
+ "@babel/helper-function-name" "7.0.0-rc.1"
+ "@babel/helper-member-expression-to-functions" "7.0.0-rc.1"
+ "@babel/helper-optimise-call-expression" "7.0.0-rc.1"
+ "@babel/helper-plugin-utils" "7.0.0-rc.1"
+ "@babel/helper-replace-supers" "7.0.0-rc.1"
+ "@babel/plugin-syntax-class-properties" "7.0.0-rc.1"
+
+"@babel/plugin-proposal-object-rest-spread@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.0.0-beta.54.tgz#5481269a020dd0d38715a8094fed015d30ef4c2a"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/plugin-syntax-object-rest-spread" "7.0.0-beta.54"
+
+"@babel/plugin-proposal-optional-catch-binding@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.0.0-beta.54.tgz#931f69298fa0c411b2596616cf5a1d82925b87a9"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/plugin-syntax-optional-catch-binding" "7.0.0-beta.54"
+
+"@babel/plugin-proposal-unicode-property-regex@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.0.0-beta.54.tgz#1624631faf688bcbde4918712bd0af7186f7d245"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/helper-regex" "7.0.0-beta.54"
+ regexpu-core "^4.2.0"
+
+"@babel/plugin-syntax-async-generators@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.0.0-beta.54.tgz#ffac8f64927614762897cc9643495fd38097dd41"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-syntax-class-properties@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.0.0-rc.1.tgz#155343e256c84d127496e46675a3049636d311ff"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-rc.1"
+
+"@babel/plugin-syntax-flow@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.0.0-beta.54.tgz#8d38fffa6da16e2d327f5fee4f90913b14d43d14"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-syntax-object-rest-spread@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.0.0-beta.54.tgz#e0f445612081ab573e2535adbabc7b710d17940c"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-syntax-optional-catch-binding@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.0.0-beta.54.tgz#2eb8ddde19ddf73a343d087a087159ed44e54809"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-arrow-functions@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.0.0-beta.54.tgz#44a977b8e61e4efcc7658bbbe260f204ca1bcf72"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-async-to-generator@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.0.0-beta.54.tgz#d035e65c50884937d64dbe68d16498c032f8bbec"
+ dependencies:
+ "@babel/helper-module-imports" "7.0.0-beta.54"
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/helper-remap-async-to-generator" "7.0.0-beta.54"
+
+"@babel/plugin-transform-block-scoped-functions@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.0.0-beta.54.tgz#938a77fb12f0e11661bdf5386e4aeca47f0c053b"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-block-scoping@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.0.0-beta.54.tgz#bcae1c2ffae4cc3b7b3e5455f0a98daecc09a3c6"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ lodash "^4.17.5"
+
+"@babel/plugin-transform-classes@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.0.0-beta.54.tgz#b15781d2e499ce25438e73fea2fa5a09858568ff"
+ dependencies:
+ "@babel/helper-annotate-as-pure" "7.0.0-beta.54"
+ "@babel/helper-define-map" "7.0.0-beta.54"
+ "@babel/helper-function-name" "7.0.0-beta.54"
+ "@babel/helper-optimise-call-expression" "7.0.0-beta.54"
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/helper-replace-supers" "7.0.0-beta.54"
+ "@babel/helper-split-export-declaration" "7.0.0-beta.54"
+ globals "^11.1.0"
+
+"@babel/plugin-transform-computed-properties@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.0.0-beta.54.tgz#b28494942b94fb86d01994763d2b5c43bdd986af"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-destructuring@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.0.0-beta.54.tgz#81f649a3e4fcb62c2b2ad497f783a800b994472f"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-dotall-regex@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.0.0-beta.54.tgz#2835b7f4141b19fa0648eb96ffe3c4fccd1eca20"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/helper-regex" "7.0.0-beta.54"
+ regexpu-core "^4.1.3"
+
+"@babel/plugin-transform-duplicate-keys@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.0.0-beta.54.tgz#4b8f4fb349902a800679191f59d0fa53fca49400"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-exponentiation-operator@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.0.0-beta.54.tgz#1017096366fb43ebca8ed8d8d0cdd1ebd64febb2"
+ dependencies:
+ "@babel/helper-builder-binary-assignment-operator-visitor" "7.0.0-beta.54"
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-flow-strip-types@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.0.0-beta.54.tgz#3612fa3935e60df6eaae66a33d24fc31b58cc919"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/plugin-syntax-flow" "7.0.0-beta.54"
+
+"@babel/plugin-transform-for-of@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.0.0-beta.54.tgz#261d2992058a9e09234b9ff67820054ffc55f79c"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-function-name@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.0.0-beta.54.tgz#cc722f9973931337def3d1e6c55138581edd371e"
+ dependencies:
+ "@babel/helper-function-name" "7.0.0-beta.54"
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-literals@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.0.0-beta.54.tgz#70f07ecc2f3b7bc9f542a578e82eec18a5504098"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-modules-amd@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.0.0-beta.54.tgz#fb50740741420bb485ee1315d2e1133db4e433d2"
+ dependencies:
+ "@babel/helper-module-transforms" "7.0.0-beta.54"
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-modules-commonjs@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.0.0-beta.54.tgz#07d912a7a24dad2d9bf5d44ce322ddc457a8db37"
+ dependencies:
+ "@babel/helper-module-transforms" "7.0.0-beta.54"
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/helper-simple-access" "7.0.0-beta.54"
+
+"@babel/plugin-transform-modules-systemjs@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.0.0-beta.54.tgz#0923f012ac252e037467245ff27f8954f4ce6803"
+ dependencies:
+ "@babel/helper-hoist-variables" "7.0.0-beta.54"
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-modules-umd@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.0.0-beta.54.tgz#3af0e2cf8f533b2984a8ca6da316246850c3aeda"
+ dependencies:
+ "@babel/helper-module-transforms" "7.0.0-beta.54"
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-new-target@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0-beta.54.tgz#634ee57fa805720195cd31086c973f1fc5c9949b"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-object-super@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.0.0-beta.54.tgz#d25fad66eff90de03ee62f8384f0af57bcd065d9"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/helper-replace-supers" "7.0.0-beta.54"
+
+"@babel/plugin-transform-parameters@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.0.0-beta.54.tgz#76306f19b9acac6cf13721af15ecb9f382864ff7"
+ dependencies:
+ "@babel/helper-call-delegate" "7.0.0-beta.54"
+ "@babel/helper-get-function-arity" "7.0.0-beta.54"
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-regenerator@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0-beta.54.tgz#8b46e192f3bfe096bbbf86e27764e7662e5f9a0f"
+ dependencies:
+ regenerator-transform "^0.13.3"
+
+"@babel/plugin-transform-shorthand-properties@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.0.0-beta.54.tgz#50e73c2afc5898b1055510ddf60ee13a6301517f"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-spread@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.0.0-beta.54.tgz#4f0852df0f4b1db2426c40facd8fe5f028a3dbc9"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-sticky-regex@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.0.0-beta.54.tgz#568f35eb5118ae96fad82eac36374d7923b47883"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/helper-regex" "7.0.0-beta.54"
+
+"@babel/plugin-transform-template-literals@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.0.0-beta.54.tgz#cb1f6303cafb8442a6c6c69a0dfbb60699f327bc"
+ dependencies:
+ "@babel/helper-annotate-as-pure" "7.0.0-beta.54"
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-typeof-symbol@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.0.0-beta.54.tgz#6d068686239c9ebaf534d1c0d8032953f7b521bc"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-unicode-regex@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.0.0-beta.54.tgz#1dc7e9150b39aaeb19fca1c863e082f6096afc60"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/helper-regex" "7.0.0-beta.54"
+ regexpu-core "^4.1.3"
+
+"@babel/preset-env@^7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.0.0-beta.54.tgz#4b05c4e3aaed64a509098e4e854dfc0e02edf053"
+ dependencies:
+ "@babel/helper-module-imports" "7.0.0-beta.54"
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/plugin-proposal-async-generator-functions" "7.0.0-beta.54"
+ "@babel/plugin-proposal-object-rest-spread" "7.0.0-beta.54"
+ "@babel/plugin-proposal-optional-catch-binding" "7.0.0-beta.54"
+ "@babel/plugin-proposal-unicode-property-regex" "7.0.0-beta.54"
+ "@babel/plugin-syntax-async-generators" "7.0.0-beta.54"
+ "@babel/plugin-syntax-object-rest-spread" "7.0.0-beta.54"
+ "@babel/plugin-syntax-optional-catch-binding" "7.0.0-beta.54"
+ "@babel/plugin-transform-arrow-functions" "7.0.0-beta.54"
+ "@babel/plugin-transform-async-to-generator" "7.0.0-beta.54"
+ "@babel/plugin-transform-block-scoped-functions" "7.0.0-beta.54"
+ "@babel/plugin-transform-block-scoping" "7.0.0-beta.54"
+ "@babel/plugin-transform-classes" "7.0.0-beta.54"
+ "@babel/plugin-transform-computed-properties" "7.0.0-beta.54"
+ "@babel/plugin-transform-destructuring" "7.0.0-beta.54"
+ "@babel/plugin-transform-dotall-regex" "7.0.0-beta.54"
+ "@babel/plugin-transform-duplicate-keys" "7.0.0-beta.54"
+ "@babel/plugin-transform-exponentiation-operator" "7.0.0-beta.54"
+ "@babel/plugin-transform-for-of" "7.0.0-beta.54"
+ "@babel/plugin-transform-function-name" "7.0.0-beta.54"
+ "@babel/plugin-transform-literals" "7.0.0-beta.54"
+ "@babel/plugin-transform-modules-amd" "7.0.0-beta.54"
+ "@babel/plugin-transform-modules-commonjs" "7.0.0-beta.54"
+ "@babel/plugin-transform-modules-systemjs" "7.0.0-beta.54"
+ "@babel/plugin-transform-modules-umd" "7.0.0-beta.54"
+ "@babel/plugin-transform-new-target" "7.0.0-beta.54"
+ "@babel/plugin-transform-object-super" "7.0.0-beta.54"
+ "@babel/plugin-transform-parameters" "7.0.0-beta.54"
+ "@babel/plugin-transform-regenerator" "7.0.0-beta.54"
+ "@babel/plugin-transform-shorthand-properties" "7.0.0-beta.54"
+ "@babel/plugin-transform-spread" "7.0.0-beta.54"
+ "@babel/plugin-transform-sticky-regex" "7.0.0-beta.54"
+ "@babel/plugin-transform-template-literals" "7.0.0-beta.54"
+ "@babel/plugin-transform-typeof-symbol" "7.0.0-beta.54"
+ "@babel/plugin-transform-unicode-regex" "7.0.0-beta.54"
+ browserslist "^3.0.0"
+ invariant "^2.2.2"
+ js-levenshtein "^1.1.3"
+ semver "^5.3.0"
+
+"@babel/preset-flow@^7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.0.0-beta.54.tgz#7a6f5b75297047ec36d5b3fd0b5009d59bb4240f"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/plugin-transform-flow-strip-types" "7.0.0-beta.54"
+
+"@babel/template@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.54.tgz#d5b0d2d2d55c0e78b048c61a058f36cfd7d91af3"
+ dependencies:
+ "@babel/code-frame" "7.0.0-beta.54"
+ "@babel/parser" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+ lodash "^4.17.5"
+
+"@babel/template@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-rc.1.tgz#5f9c0a481c9f22ecdb84697b3c3a34eadeeca23c"
+ dependencies:
+ "@babel/code-frame" "7.0.0-rc.1"
+ "@babel/parser" "7.0.0-rc.1"
+ "@babel/types" "7.0.0-rc.1"
+ lodash "^4.17.10"
+
+"@babel/traverse@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.54.tgz#2c17f98dcdbf19aa918fde128f0e1a0bc089e05a"
+ dependencies:
+ "@babel/code-frame" "7.0.0-beta.54"
+ "@babel/generator" "7.0.0-beta.54"
+ "@babel/helper-function-name" "7.0.0-beta.54"
+ "@babel/helper-split-export-declaration" "7.0.0-beta.54"
+ "@babel/parser" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+ debug "^3.1.0"
+ globals "^11.1.0"
+ lodash "^4.17.5"
+
+"@babel/traverse@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-rc.1.tgz#867b4b45ada2d51ae2d0076f1c1d5880f8557158"
+ dependencies:
+ "@babel/code-frame" "7.0.0-rc.1"
+ "@babel/generator" "7.0.0-rc.1"
+ "@babel/helper-function-name" "7.0.0-rc.1"
+ "@babel/helper-split-export-declaration" "7.0.0-rc.1"
+ "@babel/parser" "7.0.0-rc.1"
+ "@babel/types" "7.0.0-rc.1"
+ debug "^3.1.0"
+ globals "^11.1.0"
+ lodash "^4.17.10"
+
+"@babel/types@7.0.0-beta.51":
+ version "7.0.0-beta.51"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.51.tgz#d802b7b543b5836c778aa691797abf00f3d97ea9"
+ dependencies:
+ esutils "^2.0.2"
+ lodash "^4.17.5"
+ to-fast-properties "^2.0.0"
+
+"@babel/types@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.54.tgz#025ad68492fed542c13f14c579a44c848e531063"
+ dependencies:
+ esutils "^2.0.2"
+ lodash "^4.17.5"
+ to-fast-properties "^2.0.0"
+
+"@babel/types@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-rc.1.tgz#6abf6d14ddd9fc022617e5b62e6b32f4fa6526ad"
+ dependencies:
+ esutils "^2.0.2"
+ lodash "^4.17.10"
+ to-fast-properties "^2.0.0"
+
+"@types/estree@0.0.39":
+ version "0.0.39"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f"
+
+"@types/node@*":
+ version "10.5.3"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-10.5.3.tgz#5bcfaf088ad17894232012877669634c06b20cc5"
+
+ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ dependencies:
+ color-convert "^1.9.0"
+
+arr-diff@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
+ dependencies:
+ arr-flatten "^1.0.1"
+
+arr-flatten@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+
+array-unique@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
+
+braces@^1.8.2:
+ version "1.8.5"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
+ dependencies:
+ expand-range "^1.8.1"
+ preserve "^0.2.0"
+ repeat-element "^1.1.2"
+
+browserslist@^3.0.0:
+ version "3.2.8"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6"
+ dependencies:
+ caniuse-lite "^1.0.30000844"
+ electron-to-chromium "^1.3.47"
+
+caniuse-lite@^1.0.30000844:
+ version "1.0.30000865"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz#70026616e8afe6e1442f8bb4e1092987d81a2f25"
+
+chalk@^2.0.0:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e"
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+color-convert@^1.9.0:
+ version "1.9.2"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147"
+ dependencies:
+ color-name "1.1.1"
+
+color-name@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689"
+
+convert-source-map@^1.1.0:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5"
+
+debug@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
+ dependencies:
+ ms "2.0.0"
+
+electron-to-chromium@^1.3.47:
+ version "1.3.52"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.52.tgz#d2d9f1270ba4a3b967b831c40ef71fb4d9ab5ce0"
+
+escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+
+estree-walker@^0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.5.2.tgz#d3850be7529c9580d815600b53126515e146dd39"
+
+esutils@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
+
+expand-brackets@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
+ dependencies:
+ is-posix-bracket "^0.1.0"
+
+expand-range@^1.8.1:
+ version "1.8.2"
+ resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
+ dependencies:
+ fill-range "^2.1.0"
+
+extglob@^0.3.1:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
+ dependencies:
+ is-extglob "^1.0.0"
+
+filename-regex@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
+
+fill-range@^2.1.0:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565"
+ dependencies:
+ is-number "^2.1.0"
+ isobject "^2.0.0"
+ randomatic "^3.0.0"
+ repeat-element "^1.1.2"
+ repeat-string "^1.5.2"
+
+for-in@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+
+for-own@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
+ dependencies:
+ for-in "^1.0.1"
+
+glob-base@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
+ dependencies:
+ glob-parent "^2.0.0"
+ is-glob "^2.0.0"
+
+glob-parent@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
+ dependencies:
+ is-glob "^2.0.0"
+
+globals@^11.1.0:
+ version "11.7.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673"
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+
+invariant@^2.2.2:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
+ dependencies:
+ loose-envify "^1.0.0"
+
+is-buffer@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+
+is-dotfile@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
+
+is-equal-shallow@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
+ dependencies:
+ is-primitive "^2.0.0"
+
+is-extendable@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+
+is-extglob@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
+
+is-glob@^2.0.0, is-glob@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
+ dependencies:
+ is-extglob "^1.0.0"
+
+is-number@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-number@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff"
+
+is-posix-bracket@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
+
+is-primitive@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
+
+isarray@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+
+isobject@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+ dependencies:
+ isarray "1.0.0"
+
+js-levenshtein@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.3.tgz#3ef627df48ec8cf24bacf05c0f184ff30ef413c5"
+
+js-tokens@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
+
+"js-tokens@^3.0.0 || ^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+
+jsesc@^2.5.1:
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe"
+
+jsesc@~0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+
+json5@^0.5.0:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+
+kind-of@^3.0.2:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^6.0.0:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
+
+lodash@^4.17.10, lodash@^4.17.5:
+ version "4.17.10"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"
+
+loose-envify@^1.0.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+math-random@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac"
+
+micromatch@^2.3.11:
+ version "2.3.11"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
+ dependencies:
+ arr-diff "^2.0.0"
+ array-unique "^0.2.1"
+ braces "^1.8.2"
+ expand-brackets "^0.1.4"
+ extglob "^0.3.1"
+ filename-regex "^2.0.0"
+ is-extglob "^1.0.0"
+ is-glob "^2.0.1"
+ kind-of "^3.0.2"
+ normalize-path "^2.0.1"
+ object.omit "^2.0.0"
+ parse-glob "^3.0.4"
+ regex-cache "^0.4.2"
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+
+normalize-path@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+ dependencies:
+ remove-trailing-separator "^1.0.1"
+
+object.omit@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
+ dependencies:
+ for-own "^0.1.4"
+ is-extendable "^0.1.1"
+
+parse-glob@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
+ dependencies:
+ glob-base "^0.3.0"
+ is-dotfile "^1.0.0"
+ is-extglob "^1.0.0"
+ is-glob "^2.0.0"
+
+path-parse@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1"
+
+preserve@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
+
+private@^0.1.6:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
+
+randomatic@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.0.0.tgz#d35490030eb4f7578de292ce6dfb04a91a128923"
+ dependencies:
+ is-number "^4.0.0"
+ kind-of "^6.0.0"
+ math-random "^1.0.1"
+
+regenerate-unicode-properties@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz#107405afcc4a190ec5ed450ecaa00ed0cafa7a4c"
+ dependencies:
+ regenerate "^1.4.0"
+
+regenerate@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11"
+
+regenerator-transform@^0.13.3:
+ version "0.13.3"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.3.tgz#264bd9ff38a8ce24b06e0636496b2c856b57bcbb"
+ dependencies:
+ private "^0.1.6"
+
+regex-cache@^0.4.2:
+ version "0.4.4"
+ resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd"
+ dependencies:
+ is-equal-shallow "^0.1.3"
+
+regexpu-core@^4.1.3, regexpu-core@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.2.0.tgz#a3744fa03806cffe146dea4421a3e73bdcc47b1d"
+ dependencies:
+ regenerate "^1.4.0"
+ regenerate-unicode-properties "^7.0.0"
+ regjsgen "^0.4.0"
+ regjsparser "^0.3.0"
+ unicode-match-property-ecmascript "^1.0.4"
+ unicode-match-property-value-ecmascript "^1.0.2"
+
+regjsgen@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.4.0.tgz#c1eb4c89a209263f8717c782591523913ede2561"
+
+regjsparser@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.3.0.tgz#3c326da7fcfd69fa0d332575a41c8c0cdf588c96"
+ dependencies:
+ jsesc "~0.5.0"
+
+remove-trailing-separator@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+
+repeat-element@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
+
+repeat-string@^1.5.2:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+
+resolve@^1.3.2:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26"
+ dependencies:
+ path-parse "^1.0.5"
+
+rollup-plugin-babel@^4.0.0-beta.7:
+ version "4.0.0-beta.7"
+ resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-4.0.0-beta.7.tgz#8c38a685f8009fc6fbf1d31597cb3c5f8060caf5"
+ dependencies:
+ "@babel/helper-module-imports" "7.0.0-beta.51"
+ rollup-pluginutils "^2.3.0"
+
+rollup-pluginutils@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.3.0.tgz#478ace04bd7f6da2e724356ca798214884738fc4"
+ dependencies:
+ estree-walker "^0.5.2"
+ micromatch "^2.3.11"
+
+rollup@^0.63.0:
+ version "0.63.4"
+ resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.63.4.tgz#cb58bf6c2a6c38542cae250684c962799ad7c00c"
+ dependencies:
+ "@types/estree" "0.0.39"
+ "@types/node" "*"
+
+semver@^5.3.0, semver@^5.4.1:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
+
+source-map@^0.5.0:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+
+supports-color@^5.3.0:
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54"
+ dependencies:
+ has-flag "^3.0.0"
+
+to-fast-properties@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
+
+trim-right@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
+
+unicode-canonical-property-names-ecmascript@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818"
+
+unicode-match-property-ecmascript@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c"
+ dependencies:
+ unicode-canonical-property-names-ecmascript "^1.0.4"
+ unicode-property-aliases-ecmascript "^1.0.4"
+
+unicode-match-property-value-ecmascript@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz#9f1dc76926d6ccf452310564fd834ace059663d4"
+
+unicode-property-aliases-ecmascript@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz#5a533f31b4317ea76f17d807fa0d116546111dd0"
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/rollup/index.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/rollup/index.js
new file mode 100644
index 0000000000..b7114165bf
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/rollup/index.js
@@ -0,0 +1,76 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+const path = require("path");
+const _ = require("lodash");
+const rollup = require("rollup");
+const rollupTypescript = require("rollup-plugin-typescript2");
+
+const TARGET_NAME = "rollup";
+
+module.exports = exports = async function(tests, dirname) {
+ const fixtures = [];
+ for (const [name, input] of tests) {
+ if (/babel-|-cjs/.test(name)) {
+ continue;
+ }
+
+ const testFnName = _.camelCase(`${TARGET_NAME}-${name}`);
+
+ const scriptPath = path.join(dirname, "output", TARGET_NAME, `${name}.js`);
+
+ console.log(`Building ${TARGET_NAME} test ${name}`);
+
+ const bundle = await rollup.rollup({
+ input: "fake-bundle-root",
+ plugins: [
+ // Our input file may export more than the default, but we
+ // want to enable 'exports: "default",' so we need the root
+ // import to only have a default export.
+ {
+ resolveId: id => (id === "fake-bundle-root" ? id : undefined),
+ load: id =>
+ id === "fake-bundle-root"
+ ? `import test from "${input}"; export default test;`
+ : undefined
+ },
+ {
+ ongenerate(out, data) {
+ data.map.sources = data.map.sources.map(source =>
+ source.replace(/^fixtures[\\/]/, `${TARGET_NAME}://./`)
+ );
+ }
+ },
+ rollupTypescript({
+ check: false,
+ tsconfigDefaults: {
+ target: "es6",
+ },
+ }),
+ ].filter(Boolean)
+ });
+
+ await bundle.write({
+ file: path.basename(scriptPath),
+ dir: path.dirname(scriptPath),
+ format: "iife",
+ name: testFnName,
+ // sourceMapFile: ""
+ sourcemap: true,
+ exports: "default"
+ });
+
+ fixtures.push({
+ name,
+ testFnName,
+ scriptPath,
+ assets: [scriptPath, `${scriptPath}.map`]
+ });
+ }
+
+ return {
+ target: TARGET_NAME,
+ fixtures
+ };
+};
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/rollup/package.json b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/rollup/package.json
new file mode 100644
index 0000000000..c6d49953e9
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/rollup/package.json
@@ -0,0 +1,11 @@
+{
+ "name": "sourcemapped-rollup",
+ "private": true,
+ "dependencies": {
+ "lodash": "^4.17.5",
+ "rollup": "^0.63.0",
+ "rollup-plugin-babel": "^3.0.7",
+ "rollup-plugin-typescript2": "^0.16.1",
+ "typescript": "^2.9.2"
+ }
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/rollup/yarn.lock b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/rollup/yarn.lock
new file mode 100644
index 0000000000..5d2b03079d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/rollup/yarn.lock
@@ -0,0 +1,337 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@types/estree@0.0.39":
+ version "0.0.39"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f"
+
+"@types/node@*":
+ version "10.5.3"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-10.5.3.tgz#5bcfaf088ad17894232012877669634c06b20cc5"
+
+arr-diff@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
+ dependencies:
+ arr-flatten "^1.0.1"
+
+arr-flatten@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+
+array-unique@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
+
+balanced-match@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+braces@^1.8.2:
+ version "1.8.5"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
+ dependencies:
+ expand-range "^1.8.1"
+ preserve "^0.2.0"
+ repeat-element "^1.1.2"
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+
+estree-walker@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.2.1.tgz#bdafe8095383d8414d5dc2ecf4c9173b6db9412e"
+
+estree-walker@^0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.5.2.tgz#d3850be7529c9580d815600b53126515e146dd39"
+
+expand-brackets@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
+ dependencies:
+ is-posix-bracket "^0.1.0"
+
+expand-range@^1.8.1:
+ version "1.8.2"
+ resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
+ dependencies:
+ fill-range "^2.1.0"
+
+extglob@^0.3.1:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
+ dependencies:
+ is-extglob "^1.0.0"
+
+filename-regex@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
+
+fill-range@^2.1.0:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565"
+ dependencies:
+ is-number "^2.1.0"
+ isobject "^2.0.0"
+ randomatic "^3.0.0"
+ repeat-element "^1.1.2"
+ repeat-string "^1.5.2"
+
+for-in@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+
+for-own@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
+ dependencies:
+ for-in "^1.0.1"
+
+fs-extra@5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd"
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^4.0.0"
+ universalify "^0.1.0"
+
+glob-base@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
+ dependencies:
+ glob-parent "^2.0.0"
+ is-glob "^2.0.0"
+
+glob-parent@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
+ dependencies:
+ is-glob "^2.0.0"
+
+graceful-fs@^4.1.2, graceful-fs@^4.1.6:
+ version "4.1.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
+
+is-buffer@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+
+is-dotfile@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
+
+is-equal-shallow@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
+ dependencies:
+ is-primitive "^2.0.0"
+
+is-extendable@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+
+is-extglob@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
+
+is-glob@^2.0.0, is-glob@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
+ dependencies:
+ is-extglob "^1.0.0"
+
+is-number@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-number@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff"
+
+is-posix-bracket@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
+
+is-primitive@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
+
+isarray@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+
+isobject@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+ dependencies:
+ isarray "1.0.0"
+
+jsonfile@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
+ optionalDependencies:
+ graceful-fs "^4.1.6"
+
+kind-of@^3.0.2:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^6.0.0:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
+
+lodash@^4.17.5:
+ version "4.17.10"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"
+
+math-random@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac"
+
+micromatch@^2.3.11:
+ version "2.3.11"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
+ dependencies:
+ arr-diff "^2.0.0"
+ array-unique "^0.2.1"
+ braces "^1.8.2"
+ expand-brackets "^0.1.4"
+ extglob "^0.3.1"
+ filename-regex "^2.0.0"
+ is-extglob "^1.0.0"
+ is-glob "^2.0.1"
+ kind-of "^3.0.2"
+ normalize-path "^2.0.1"
+ object.omit "^2.0.0"
+ parse-glob "^3.0.4"
+ regex-cache "^0.4.2"
+
+minimatch@^3.0.2:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ dependencies:
+ brace-expansion "^1.1.7"
+
+normalize-path@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+ dependencies:
+ remove-trailing-separator "^1.0.1"
+
+object.omit@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
+ dependencies:
+ for-own "^0.1.4"
+ is-extendable "^0.1.1"
+
+parse-glob@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
+ dependencies:
+ glob-base "^0.3.0"
+ is-dotfile "^1.0.0"
+ is-extglob "^1.0.0"
+ is-glob "^2.0.0"
+
+path-parse@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1"
+
+preserve@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
+
+randomatic@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.0.0.tgz#d35490030eb4f7578de292ce6dfb04a91a128923"
+ dependencies:
+ is-number "^4.0.0"
+ kind-of "^6.0.0"
+ math-random "^1.0.1"
+
+regex-cache@^0.4.2:
+ version "0.4.4"
+ resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd"
+ dependencies:
+ is-equal-shallow "^0.1.3"
+
+remove-trailing-separator@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+
+repeat-element@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
+
+repeat-string@^1.5.2:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+
+resolve@1.8.1:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26"
+ dependencies:
+ path-parse "^1.0.5"
+
+rollup-plugin-babel@^3.0.7:
+ version "3.0.7"
+ resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-3.0.7.tgz#5b13611f1ab8922497e9d15197ae5d8a23fe3b1e"
+ dependencies:
+ rollup-pluginutils "^1.5.0"
+
+rollup-plugin-typescript2@^0.16.1:
+ version "0.16.1"
+ resolved "https://registry.yarnpkg.com/rollup-plugin-typescript2/-/rollup-plugin-typescript2-0.16.1.tgz#72e1f8a2e450550eabdc3d474e735feae322b474"
+ dependencies:
+ fs-extra "5.0.0"
+ resolve "1.8.1"
+ rollup-pluginutils "2.3.0"
+ tslib "1.9.3"
+
+rollup-pluginutils@2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.3.0.tgz#478ace04bd7f6da2e724356ca798214884738fc4"
+ dependencies:
+ estree-walker "^0.5.2"
+ micromatch "^2.3.11"
+
+rollup-pluginutils@^1.5.0:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz#1e156e778f94b7255bfa1b3d0178be8f5c552408"
+ dependencies:
+ estree-walker "^0.2.1"
+ minimatch "^3.0.2"
+
+rollup@^0.63.0:
+ version "0.63.4"
+ resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.63.4.tgz#cb58bf6c2a6c38542cae250684c962799ad7c00c"
+ dependencies:
+ "@types/estree" "0.0.39"
+ "@types/node" "*"
+
+tslib@1.9.3:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
+
+typescript@^2.9.2:
+ version "2.9.2"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.9.2.tgz#1cbf61d05d6b96269244eb6a3bce4bd914e0f00c"
+
+universalify@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack3-babel6/index.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack3-babel6/index.js
new file mode 100644
index 0000000000..bc55a5a88c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack3-babel6/index.js
@@ -0,0 +1,81 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+const path = require("path");
+const util = require("util");
+const _ = require("lodash");
+const webpack = require("webpack");
+
+const TARGET_NAME = "webpack3-babel6";
+
+module.exports = exports = async function(tests, dirname) {
+ const fixtures = [];
+ for (const [name, input] of tests) {
+ if (/typescript-/.test(name)) {
+ continue;
+ }
+
+ const testFnName = _.camelCase(`${TARGET_NAME}-${name}`);
+ const evalMaps = name.match(/-eval/);
+ const babelEnv = !name.match(/-es6/);
+ const babelModules = name.match(/-cjs/);
+
+ console.log(`Building ${TARGET_NAME} test ${name}`);
+
+ const scriptPath = path.join(dirname, "output", TARGET_NAME, `${name}.js`);
+ const result = await util.promisify(webpack)({
+ context: path.dirname(input),
+ entry: `./${path.basename(input)}`,
+ output: {
+ path: path.dirname(scriptPath),
+ filename: path.basename(scriptPath),
+
+ devtoolModuleFilenameTemplate: `${TARGET_NAME}://./${name}/[resource-path]`,
+
+ libraryTarget: "var",
+ library: testFnName,
+ libraryExport: "default"
+ },
+ devtool: evalMaps ? "eval-source-map" : "source-map",
+ module: {
+ loaders: [
+ {
+ test: /\.js$/,
+ exclude: /node_modules/,
+ loader: require.resolve("babel-loader"),
+ options: {
+ babelrc: false,
+ presets: [
+ babelEnv
+ ? [
+ require.resolve("babel-preset-env"),
+ { modules: babelModules ? "commonjs" : false }
+ ]
+ : null
+ ].filter(Boolean),
+ plugins: [
+ require.resolve("babel-plugin-transform-flow-strip-types"),
+ require.resolve("babel-plugin-transform-class-properties")
+ ]
+ }
+ }
+ ].filter(Boolean)
+ }
+ });
+
+ fixtures.push({
+ name,
+ testFnName: testFnName,
+ scriptPath,
+ assets: [scriptPath, evalMaps ? null : `${scriptPath}.map`].filter(
+ Boolean
+ )
+ });
+ }
+
+ return {
+ target: TARGET_NAME,
+ fixtures
+ };
+};
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack3-babel6/package.json b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack3-babel6/package.json
new file mode 100644
index 0000000000..cce89f93f0
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack3-babel6/package.json
@@ -0,0 +1,12 @@
+{
+ "name": "sourcemapped-webpack3-babel6",
+ "private": true,
+ "dependencies": {
+ "babel-core": "^6.26.3",
+ "babel-loader": "^7.1.5",
+ "babel-plugin-transform-flow-strip-types": "^6.22.0",
+ "babel-preset-env": "^1.7.0",
+ "lodash": "^4.17.10",
+ "webpack": "3"
+ }
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack3-babel6/yarn.lock b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack3-babel6/yarn.lock
new file mode 100644
index 0000000000..f3015bfa30
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack3-babel6/yarn.lock
@@ -0,0 +1,2823 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+abbrev@1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+
+acorn-dynamic-import@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4"
+ dependencies:
+ acorn "^4.0.3"
+
+acorn@^4.0.3:
+ version "4.0.13"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
+
+acorn@^5.0.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8"
+
+ajv-keywords@^3.1.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a"
+
+ajv@^6.1.0:
+ version "6.5.2"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.2.tgz#678495f9b82f7cca6be248dd92f59bff5e1f4360"
+ dependencies:
+ fast-deep-equal "^2.0.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.1"
+
+align-text@^0.1.1, align-text@^0.1.3:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
+ dependencies:
+ kind-of "^3.0.2"
+ longest "^1.0.1"
+ repeat-string "^1.5.2"
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+
+ansi-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+
+ansi-styles@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+
+anymatch@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
+ dependencies:
+ micromatch "^3.1.4"
+ normalize-path "^2.1.1"
+
+aproba@^1.0.3:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
+
+are-we-there-yet@~1.1.2:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
+ dependencies:
+ delegates "^1.0.0"
+ readable-stream "^2.0.6"
+
+arr-diff@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+
+arr-flatten@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+
+arr-union@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+
+array-unique@^0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+
+asn1.js@^4.0.0:
+ version "4.10.1"
+ resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"
+ dependencies:
+ bn.js "^4.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+assert@^1.1.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91"
+ dependencies:
+ util "0.10.3"
+
+assign-symbols@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+
+async-each@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
+
+async@^2.1.2:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610"
+ dependencies:
+ lodash "^4.17.10"
+
+atob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a"
+
+babel-code-frame@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
+ dependencies:
+ chalk "^1.1.3"
+ esutils "^2.0.2"
+ js-tokens "^3.0.2"
+
+babel-core@^6.26.0, babel-core@^6.26.3:
+ version "6.26.3"
+ resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207"
+ dependencies:
+ babel-code-frame "^6.26.0"
+ babel-generator "^6.26.0"
+ babel-helpers "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-register "^6.26.0"
+ babel-runtime "^6.26.0"
+ babel-template "^6.26.0"
+ babel-traverse "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+ convert-source-map "^1.5.1"
+ debug "^2.6.9"
+ json5 "^0.5.1"
+ lodash "^4.17.4"
+ minimatch "^3.0.4"
+ path-is-absolute "^1.0.1"
+ private "^0.1.8"
+ slash "^1.0.0"
+ source-map "^0.5.7"
+
+babel-generator@^6.26.0:
+ version "6.26.1"
+ resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90"
+ dependencies:
+ babel-messages "^6.23.0"
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ detect-indent "^4.0.0"
+ jsesc "^1.3.0"
+ lodash "^4.17.4"
+ source-map "^0.5.7"
+ trim-right "^1.0.1"
+
+babel-helper-builder-binary-assignment-operator-visitor@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664"
+ dependencies:
+ babel-helper-explode-assignable-expression "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-call-delegate@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d"
+ dependencies:
+ babel-helper-hoist-variables "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-define-map@^6.24.1:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f"
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ lodash "^4.17.4"
+
+babel-helper-explode-assignable-expression@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-function-name@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9"
+ dependencies:
+ babel-helper-get-function-arity "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-get-function-arity@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-hoist-variables@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-optimise-call-expression@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-regex@^6.24.1:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72"
+ dependencies:
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ lodash "^4.17.4"
+
+babel-helper-remap-async-to-generator@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b"
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-replace-supers@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"
+ dependencies:
+ babel-helper-optimise-call-expression "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helpers@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-loader@^7.1.5:
+ version "7.1.5"
+ resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.5.tgz#e3ee0cd7394aa557e013b02d3e492bfd07aa6d68"
+ dependencies:
+ find-cache-dir "^1.0.0"
+ loader-utils "^1.0.2"
+ mkdirp "^0.5.1"
+
+babel-messages@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-check-es2015-constants@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-syntax-async-functions@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
+
+babel-plugin-syntax-exponentiation-operator@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de"
+
+babel-plugin-syntax-flow@^6.18.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d"
+
+babel-plugin-syntax-trailing-function-commas@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3"
+
+babel-plugin-transform-async-to-generator@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761"
+ dependencies:
+ babel-helper-remap-async-to-generator "^6.24.1"
+ babel-plugin-syntax-async-functions "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-arrow-functions@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoped-functions@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoping@^6.23.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f"
+ dependencies:
+ babel-runtime "^6.26.0"
+ babel-template "^6.26.0"
+ babel-traverse "^6.26.0"
+ babel-types "^6.26.0"
+ lodash "^4.17.4"
+
+babel-plugin-transform-es2015-classes@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db"
+ dependencies:
+ babel-helper-define-map "^6.24.1"
+ babel-helper-function-name "^6.24.1"
+ babel-helper-optimise-call-expression "^6.24.1"
+ babel-helper-replace-supers "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-computed-properties@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-destructuring@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-duplicate-keys@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-for-of@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-function-name@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b"
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-literals@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154"
+ dependencies:
+ babel-plugin-transform-es2015-modules-commonjs "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1:
+ version "6.26.2"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3"
+ dependencies:
+ babel-plugin-transform-strict-mode "^6.24.1"
+ babel-runtime "^6.26.0"
+ babel-template "^6.26.0"
+ babel-types "^6.26.0"
+
+babel-plugin-transform-es2015-modules-systemjs@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23"
+ dependencies:
+ babel-helper-hoist-variables "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-umd@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468"
+ dependencies:
+ babel-plugin-transform-es2015-modules-amd "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-object-super@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d"
+ dependencies:
+ babel-helper-replace-supers "^6.24.1"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-parameters@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b"
+ dependencies:
+ babel-helper-call-delegate "^6.24.1"
+ babel-helper-get-function-arity "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-shorthand-properties@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-spread@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-sticky-regex@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc"
+ dependencies:
+ babel-helper-regex "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-template-literals@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-typeof-symbol@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-unicode-regex@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9"
+ dependencies:
+ babel-helper-regex "^6.24.1"
+ babel-runtime "^6.22.0"
+ regexpu-core "^2.0.0"
+
+babel-plugin-transform-exponentiation-operator@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e"
+ dependencies:
+ babel-helper-builder-binary-assignment-operator-visitor "^6.24.1"
+ babel-plugin-syntax-exponentiation-operator "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-flow-strip-types@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf"
+ dependencies:
+ babel-plugin-syntax-flow "^6.18.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-regenerator@^6.22.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f"
+ dependencies:
+ regenerator-transform "^0.10.0"
+
+babel-plugin-transform-strict-mode@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-preset-env@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a"
+ dependencies:
+ babel-plugin-check-es2015-constants "^6.22.0"
+ babel-plugin-syntax-trailing-function-commas "^6.22.0"
+ babel-plugin-transform-async-to-generator "^6.22.0"
+ babel-plugin-transform-es2015-arrow-functions "^6.22.0"
+ babel-plugin-transform-es2015-block-scoped-functions "^6.22.0"
+ babel-plugin-transform-es2015-block-scoping "^6.23.0"
+ babel-plugin-transform-es2015-classes "^6.23.0"
+ babel-plugin-transform-es2015-computed-properties "^6.22.0"
+ babel-plugin-transform-es2015-destructuring "^6.23.0"
+ babel-plugin-transform-es2015-duplicate-keys "^6.22.0"
+ babel-plugin-transform-es2015-for-of "^6.23.0"
+ babel-plugin-transform-es2015-function-name "^6.22.0"
+ babel-plugin-transform-es2015-literals "^6.22.0"
+ babel-plugin-transform-es2015-modules-amd "^6.22.0"
+ babel-plugin-transform-es2015-modules-commonjs "^6.23.0"
+ babel-plugin-transform-es2015-modules-systemjs "^6.23.0"
+ babel-plugin-transform-es2015-modules-umd "^6.23.0"
+ babel-plugin-transform-es2015-object-super "^6.22.0"
+ babel-plugin-transform-es2015-parameters "^6.23.0"
+ babel-plugin-transform-es2015-shorthand-properties "^6.22.0"
+ babel-plugin-transform-es2015-spread "^6.22.0"
+ babel-plugin-transform-es2015-sticky-regex "^6.22.0"
+ babel-plugin-transform-es2015-template-literals "^6.22.0"
+ babel-plugin-transform-es2015-typeof-symbol "^6.23.0"
+ babel-plugin-transform-es2015-unicode-regex "^6.22.0"
+ babel-plugin-transform-exponentiation-operator "^6.22.0"
+ babel-plugin-transform-regenerator "^6.22.0"
+ browserslist "^3.2.6"
+ invariant "^2.2.2"
+ semver "^5.3.0"
+
+babel-register@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071"
+ dependencies:
+ babel-core "^6.26.0"
+ babel-runtime "^6.26.0"
+ core-js "^2.5.0"
+ home-or-tmp "^2.0.0"
+ lodash "^4.17.4"
+ mkdirp "^0.5.1"
+ source-map-support "^0.4.15"
+
+babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
+ dependencies:
+ core-js "^2.4.0"
+ regenerator-runtime "^0.11.0"
+
+babel-template@^6.24.1, babel-template@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
+ dependencies:
+ babel-runtime "^6.26.0"
+ babel-traverse "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+ lodash "^4.17.4"
+
+babel-traverse@^6.24.1, babel-traverse@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
+ dependencies:
+ babel-code-frame "^6.26.0"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+ debug "^2.6.8"
+ globals "^9.18.0"
+ invariant "^2.2.2"
+ lodash "^4.17.4"
+
+babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
+ dependencies:
+ babel-runtime "^6.26.0"
+ esutils "^2.0.2"
+ lodash "^4.17.4"
+ to-fast-properties "^1.0.3"
+
+babylon@^6.18.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
+
+balanced-match@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+
+base64-js@^1.0.2:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3"
+
+base@^0.11.1:
+ version "0.11.2"
+ resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+ dependencies:
+ cache-base "^1.0.1"
+ class-utils "^0.3.5"
+ component-emitter "^1.2.1"
+ define-property "^1.0.0"
+ isobject "^3.0.1"
+ mixin-deep "^1.2.0"
+ pascalcase "^0.1.1"
+
+big.js@^3.1.3:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
+
+binary-extensions@^1.0.0:
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205"
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
+ version "4.11.8"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+braces@^2.3.0, braces@^2.3.1:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+ dependencies:
+ arr-flatten "^1.1.0"
+ array-unique "^0.3.2"
+ extend-shallow "^2.0.1"
+ fill-range "^4.0.0"
+ isobject "^3.0.1"
+ repeat-element "^1.1.2"
+ snapdragon "^0.8.1"
+ snapdragon-node "^2.0.1"
+ split-string "^3.0.2"
+ to-regex "^3.0.1"
+
+brorand@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
+ dependencies:
+ buffer-xor "^1.0.3"
+ cipher-base "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.3"
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+browserify-cipher@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
+ dependencies:
+ browserify-aes "^1.0.4"
+ browserify-des "^1.0.0"
+ evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c"
+ dependencies:
+ cipher-base "^1.0.1"
+ des.js "^1.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+browserify-rsa@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
+ dependencies:
+ bn.js "^4.1.0"
+ randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
+ dependencies:
+ bn.js "^4.1.1"
+ browserify-rsa "^4.0.0"
+ create-hash "^1.1.0"
+ create-hmac "^1.1.2"
+ elliptic "^6.0.0"
+ inherits "^2.0.1"
+ parse-asn1 "^5.0.0"
+
+browserify-zlib@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
+ dependencies:
+ pako "~1.0.5"
+
+browserslist@^3.2.6:
+ version "3.2.8"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6"
+ dependencies:
+ caniuse-lite "^1.0.30000844"
+ electron-to-chromium "^1.3.47"
+
+buffer-xor@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+
+buffer@^4.3.0:
+ version "4.9.1"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298"
+ dependencies:
+ base64-js "^1.0.2"
+ ieee754 "^1.1.4"
+ isarray "^1.0.0"
+
+builtin-modules@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
+
+builtin-status-codes@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
+
+cache-base@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+ dependencies:
+ collection-visit "^1.0.0"
+ component-emitter "^1.2.1"
+ get-value "^2.0.6"
+ has-value "^1.0.0"
+ isobject "^3.0.1"
+ set-value "^2.0.0"
+ to-object-path "^0.3.0"
+ union-value "^1.0.0"
+ unset-value "^1.0.0"
+
+camelcase@^1.0.2:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
+
+camelcase@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
+
+caniuse-lite@^1.0.30000844:
+ version "1.0.30000865"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz#70026616e8afe6e1442f8bb4e1092987d81a2f25"
+
+center-align@^0.1.1:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
+ dependencies:
+ align-text "^0.1.3"
+ lazy-cache "^1.0.3"
+
+chalk@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+ dependencies:
+ ansi-styles "^2.2.1"
+ escape-string-regexp "^1.0.2"
+ has-ansi "^2.0.0"
+ strip-ansi "^3.0.0"
+ supports-color "^2.0.0"
+
+chokidar@^2.0.2:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26"
+ dependencies:
+ anymatch "^2.0.0"
+ async-each "^1.0.0"
+ braces "^2.3.0"
+ glob-parent "^3.1.0"
+ inherits "^2.0.1"
+ is-binary-path "^1.0.0"
+ is-glob "^4.0.0"
+ lodash.debounce "^4.0.8"
+ normalize-path "^2.1.1"
+ path-is-absolute "^1.0.0"
+ readdirp "^2.0.0"
+ upath "^1.0.5"
+ optionalDependencies:
+ fsevents "^1.2.2"
+
+chownr@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+class-utils@^0.3.5:
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+ dependencies:
+ arr-union "^3.1.0"
+ define-property "^0.2.5"
+ isobject "^3.0.0"
+ static-extend "^0.1.1"
+
+cliui@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
+ dependencies:
+ center-align "^0.1.1"
+ right-align "^0.1.1"
+ wordwrap "0.0.2"
+
+cliui@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wrap-ansi "^2.0.0"
+
+code-point-at@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+
+collection-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+ dependencies:
+ map-visit "^1.0.0"
+ object-visit "^1.0.0"
+
+commondir@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
+
+component-emitter@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+
+console-browserify@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
+ dependencies:
+ date-now "^0.1.4"
+
+console-control-strings@^1.0.0, console-control-strings@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+
+constants-browserify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
+
+convert-source-map@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5"
+
+copy-descriptor@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+
+core-js@^2.4.0, core-js@^2.5.0:
+ version "2.5.7"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e"
+
+core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+
+create-ecdh@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff"
+ dependencies:
+ bn.js "^4.1.0"
+ elliptic "^6.0.0"
+
+create-hash@^1.1.0, create-hash@^1.1.2:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
+ dependencies:
+ cipher-base "^1.0.1"
+ inherits "^2.0.1"
+ md5.js "^1.3.4"
+ ripemd160 "^2.0.1"
+ sha.js "^2.4.0"
+
+create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
+ dependencies:
+ cipher-base "^1.0.3"
+ create-hash "^1.1.0"
+ inherits "^2.0.1"
+ ripemd160 "^2.0.0"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+cross-spawn@^5.0.1:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
+ dependencies:
+ lru-cache "^4.0.1"
+ shebang-command "^1.2.0"
+ which "^1.2.9"
+
+crypto-browserify@^3.11.0:
+ version "3.12.0"
+ resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
+ dependencies:
+ browserify-cipher "^1.0.0"
+ browserify-sign "^4.0.0"
+ create-ecdh "^4.0.0"
+ create-hash "^1.1.0"
+ create-hmac "^1.1.0"
+ diffie-hellman "^5.0.0"
+ inherits "^2.0.1"
+ pbkdf2 "^3.0.3"
+ public-encrypt "^4.0.0"
+ randombytes "^2.0.0"
+ randomfill "^1.0.3"
+
+d@1:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f"
+ dependencies:
+ es5-ext "^0.10.9"
+
+date-now@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
+
+debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ dependencies:
+ ms "2.0.0"
+
+decamelize@^1.0.0, decamelize@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+
+decode-uri-component@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+
+deep-extend@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
+
+define-property@^0.2.5:
+ version "0.2.5"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+ dependencies:
+ is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+ dependencies:
+ is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+ dependencies:
+ is-descriptor "^1.0.2"
+ isobject "^3.0.1"
+
+delegates@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+
+des.js@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
+ dependencies:
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+detect-indent@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
+ dependencies:
+ repeating "^2.0.0"
+
+detect-libc@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
+
+diffie-hellman@^5.0.0:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
+ dependencies:
+ bn.js "^4.1.0"
+ miller-rabin "^4.0.0"
+ randombytes "^2.0.0"
+
+domain-browser@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
+
+electron-to-chromium@^1.3.47:
+ version "1.3.52"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.52.tgz#d2d9f1270ba4a3b967b831c40ef71fb4d9ab5ce0"
+
+elliptic@^6.0.0:
+ version "6.4.0"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df"
+ dependencies:
+ bn.js "^4.4.0"
+ brorand "^1.0.1"
+ hash.js "^1.0.0"
+ hmac-drbg "^1.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.0"
+
+emojis-list@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
+
+enhanced-resolve@^3.4.0:
+ version "3.4.1"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e"
+ dependencies:
+ graceful-fs "^4.1.2"
+ memory-fs "^0.4.0"
+ object-assign "^4.0.1"
+ tapable "^0.2.7"
+
+errno@^0.1.3:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
+ dependencies:
+ prr "~1.0.1"
+
+error-ex@^1.2.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+ dependencies:
+ is-arrayish "^0.2.1"
+
+es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14:
+ version "0.10.45"
+ resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.45.tgz#0bfdf7b473da5919d5adf3bd25ceb754fccc3653"
+ dependencies:
+ es6-iterator "~2.0.3"
+ es6-symbol "~3.1.1"
+ next-tick "1"
+
+es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@~2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
+ dependencies:
+ d "1"
+ es5-ext "^0.10.35"
+ es6-symbol "^3.1.1"
+
+es6-map@^0.1.3:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0"
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+ es6-iterator "~2.0.1"
+ es6-set "~0.1.5"
+ es6-symbol "~3.1.1"
+ event-emitter "~0.3.5"
+
+es6-set@~0.1.5:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1"
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+ es6-iterator "~2.0.1"
+ es6-symbol "3.1.1"
+ event-emitter "~0.3.5"
+
+es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+
+es6-weak-map@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f"
+ dependencies:
+ d "1"
+ es5-ext "^0.10.14"
+ es6-iterator "^2.0.1"
+ es6-symbol "^3.1.1"
+
+escape-string-regexp@^1.0.2:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+
+escope@^3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3"
+ dependencies:
+ es6-map "^0.1.3"
+ es6-weak-map "^2.0.1"
+ esrecurse "^4.1.0"
+ estraverse "^4.1.1"
+
+esrecurse@^4.1.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
+ dependencies:
+ estraverse "^4.1.0"
+
+estraverse@^4.1.0, estraverse@^4.1.1:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
+
+esutils@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
+
+event-emitter@~0.3.5:
+ version "0.3.5"
+ resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+
+events@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
+
+evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+ dependencies:
+ md5.js "^1.3.4"
+ safe-buffer "^5.1.1"
+
+execa@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
+ dependencies:
+ cross-spawn "^5.0.1"
+ get-stream "^3.0.0"
+ is-stream "^1.1.0"
+ npm-run-path "^2.0.0"
+ p-finally "^1.0.0"
+ signal-exit "^3.0.0"
+ strip-eof "^1.0.0"
+
+expand-brackets@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+ dependencies:
+ debug "^2.3.3"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ posix-character-classes "^0.1.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+extend-shallow@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+ dependencies:
+ is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+ dependencies:
+ assign-symbols "^1.0.0"
+ is-extendable "^1.0.1"
+
+extglob@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+ dependencies:
+ array-unique "^0.3.2"
+ define-property "^1.0.0"
+ expand-brackets "^2.1.4"
+ extend-shallow "^2.0.1"
+ fragment-cache "^0.2.1"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+fast-deep-equal@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
+
+fill-range@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+ to-regex-range "^2.1.0"
+
+find-cache-dir@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f"
+ dependencies:
+ commondir "^1.0.1"
+ make-dir "^1.0.0"
+ pkg-dir "^2.0.0"
+
+find-up@^2.0.0, find-up@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+ dependencies:
+ locate-path "^2.0.0"
+
+for-in@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+
+fragment-cache@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+ dependencies:
+ map-cache "^0.2.2"
+
+fs-minipass@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d"
+ dependencies:
+ minipass "^2.2.1"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+
+fsevents@^1.2.2:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426"
+ dependencies:
+ nan "^2.9.2"
+ node-pre-gyp "^0.10.0"
+
+gauge@~2.7.3:
+ version "2.7.4"
+ resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
+ dependencies:
+ aproba "^1.0.3"
+ console-control-strings "^1.0.0"
+ has-unicode "^2.0.0"
+ object-assign "^4.1.0"
+ signal-exit "^3.0.0"
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wide-align "^1.1.0"
+
+get-caller-file@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
+
+get-stream@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+
+get-value@^2.0.3, get-value@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+
+glob-parent@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
+ dependencies:
+ is-glob "^3.1.0"
+ path-dirname "^1.0.0"
+
+glob@^7.0.5:
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+globals@^9.18.0:
+ version "9.18.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
+
+graceful-fs@^4.1.2:
+ version "4.1.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
+
+has-ansi@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+ dependencies:
+ ansi-regex "^2.0.0"
+
+has-flag@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51"
+
+has-unicode@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+
+has-value@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+ dependencies:
+ get-value "^2.0.3"
+ has-values "^0.1.4"
+ isobject "^2.0.0"
+
+has-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+ dependencies:
+ get-value "^2.0.6"
+ has-values "^1.0.0"
+ isobject "^3.0.0"
+
+has-values@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+
+has-values@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+ dependencies:
+ is-number "^3.0.0"
+ kind-of "^4.0.0"
+
+hash-base@^3.0.0:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+hash.js@^1.0.0, hash.js@^1.0.3:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.5.tgz#e38ab4b85dfb1e0c40fe9265c0e9b54854c23812"
+ dependencies:
+ inherits "^2.0.3"
+ minimalistic-assert "^1.0.1"
+
+hmac-drbg@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+ dependencies:
+ hash.js "^1.0.3"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.1"
+
+home-or-tmp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.1"
+
+hosted-git-info@^2.1.4:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047"
+
+https-browserify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
+
+iconv-lite@^0.4.4:
+ version "0.4.23"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63"
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+ieee754@^1.1.4:
+ version "1.1.12"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b"
+
+ignore-walk@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8"
+ dependencies:
+ minimatch "^3.0.4"
+
+indexof@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+
+inherits@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
+
+ini@~1.3.0:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
+
+interpret@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614"
+
+invariant@^2.2.2:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
+ dependencies:
+ loose-envify "^1.0.0"
+
+invert-kv@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
+
+is-accessor-descriptor@^0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-accessor-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
+ dependencies:
+ kind-of "^6.0.0"
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+
+is-binary-path@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+ dependencies:
+ binary-extensions "^1.0.0"
+
+is-buffer@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+
+is-builtin-module@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
+ dependencies:
+ builtin-modules "^1.0.0"
+
+is-data-descriptor@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-data-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
+ dependencies:
+ kind-of "^6.0.0"
+
+is-descriptor@^0.1.0:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
+ dependencies:
+ is-accessor-descriptor "^0.1.6"
+ is-data-descriptor "^0.1.4"
+ kind-of "^5.0.0"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
+ dependencies:
+ is-accessor-descriptor "^1.0.0"
+ is-data-descriptor "^1.0.0"
+ kind-of "^6.0.2"
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+
+is-extendable@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+ dependencies:
+ is-plain-object "^2.0.4"
+
+is-extglob@^2.1.0, is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+
+is-finite@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+
+is-glob@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
+ dependencies:
+ is-extglob "^2.1.0"
+
+is-glob@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0"
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-number@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+ dependencies:
+ isobject "^3.0.1"
+
+is-stream@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+
+is-windows@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+
+isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+
+isobject@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+ dependencies:
+ isarray "1.0.0"
+
+isobject@^3.0.0, isobject@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+
+"js-tokens@^3.0.0 || ^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+
+js-tokens@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
+
+jsesc@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
+
+jsesc@~0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+
+json-loader@^0.5.4:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d"
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+
+json5@^0.5.0, json5@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
+
+kind-of@^6.0.0, kind-of@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
+
+lazy-cache@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
+
+lcid@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
+ dependencies:
+ invert-kv "^1.0.0"
+
+load-json-file@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
+ dependencies:
+ graceful-fs "^4.1.2"
+ parse-json "^2.2.0"
+ pify "^2.0.0"
+ strip-bom "^3.0.0"
+
+loader-runner@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2"
+
+loader-utils@^1.0.2, loader-utils@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd"
+ dependencies:
+ big.js "^3.1.3"
+ emojis-list "^2.0.0"
+ json5 "^0.5.0"
+
+locate-path@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+ dependencies:
+ p-locate "^2.0.0"
+ path-exists "^3.0.0"
+
+lodash.debounce@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
+
+lodash@^4.17.10, lodash@^4.17.4:
+ version "4.17.10"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"
+
+longest@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
+
+loose-envify@^1.0.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+lru-cache@^4.0.1:
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c"
+ dependencies:
+ pseudomap "^1.0.2"
+ yallist "^2.1.2"
+
+make-dir@^1.0.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
+ dependencies:
+ pify "^3.0.0"
+
+map-cache@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+
+map-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+ dependencies:
+ object-visit "^1.0.0"
+
+md5.js@^1.3.4:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d"
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+
+mem@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76"
+ dependencies:
+ mimic-fn "^1.0.0"
+
+memory-fs@^0.4.0, memory-fs@~0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
+ dependencies:
+ errno "^0.1.3"
+ readable-stream "^2.0.1"
+
+micromatch@^3.1.4:
+ version "3.1.10"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ braces "^2.3.1"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ extglob "^2.0.4"
+ fragment-cache "^0.2.1"
+ kind-of "^6.0.2"
+ nanomatch "^1.2.9"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.2"
+
+miller-rabin@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
+ dependencies:
+ bn.js "^4.0.0"
+ brorand "^1.0.1"
+
+mimic-fn@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
+
+minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+
+minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+
+minimatch@^3.0.2, minimatch@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@0.0.8:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+
+minimist@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+
+minipass@^2.2.1, minipass@^2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233"
+ dependencies:
+ safe-buffer "^5.1.2"
+ yallist "^3.0.0"
+
+minizlib@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb"
+ dependencies:
+ minipass "^2.2.1"
+
+mixin-deep@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe"
+ dependencies:
+ for-in "^1.0.2"
+ is-extendable "^1.0.1"
+
+mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+ dependencies:
+ minimist "0.0.8"
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+
+nan@^2.9.2:
+ version "2.10.0"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f"
+
+nanomatch@^1.2.9:
+ version "1.2.13"
+ resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ fragment-cache "^0.2.1"
+ is-windows "^1.0.2"
+ kind-of "^6.0.2"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+needle@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d"
+ dependencies:
+ debug "^2.1.2"
+ iconv-lite "^0.4.4"
+ sax "^1.2.4"
+
+neo-async@^2.5.0:
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee"
+
+next-tick@1:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
+
+node-libs-browser@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df"
+ dependencies:
+ assert "^1.1.1"
+ browserify-zlib "^0.2.0"
+ buffer "^4.3.0"
+ console-browserify "^1.1.0"
+ constants-browserify "^1.0.0"
+ crypto-browserify "^3.11.0"
+ domain-browser "^1.1.1"
+ events "^1.0.0"
+ https-browserify "^1.0.0"
+ os-browserify "^0.3.0"
+ path-browserify "0.0.0"
+ process "^0.11.10"
+ punycode "^1.2.4"
+ querystring-es3 "^0.2.0"
+ readable-stream "^2.3.3"
+ stream-browserify "^2.0.1"
+ stream-http "^2.7.2"
+ string_decoder "^1.0.0"
+ timers-browserify "^2.0.4"
+ tty-browserify "0.0.0"
+ url "^0.11.0"
+ util "^0.10.3"
+ vm-browserify "0.0.4"
+
+node-pre-gyp@^0.10.0:
+ version "0.10.3"
+ resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc"
+ dependencies:
+ detect-libc "^1.0.2"
+ mkdirp "^0.5.1"
+ needle "^2.2.1"
+ nopt "^4.0.1"
+ npm-packlist "^1.1.6"
+ npmlog "^4.0.2"
+ rc "^1.2.7"
+ rimraf "^2.6.1"
+ semver "^5.3.0"
+ tar "^4"
+
+nopt@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
+ dependencies:
+ abbrev "1"
+ osenv "^0.1.4"
+
+normalize-package-data@^2.3.2:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f"
+ dependencies:
+ hosted-git-info "^2.1.4"
+ is-builtin-module "^1.0.0"
+ semver "2 || 3 || 4 || 5"
+ validate-npm-package-license "^3.0.1"
+
+normalize-path@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+ dependencies:
+ remove-trailing-separator "^1.0.1"
+
+npm-bundled@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308"
+
+npm-packlist@^1.1.6:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz#84e8c683cbe7867d34b1d357d893ce29e28a02de"
+ dependencies:
+ ignore-walk "^3.0.1"
+ npm-bundled "^1.0.1"
+
+npm-run-path@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
+ dependencies:
+ path-key "^2.0.0"
+
+npmlog@^4.0.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
+ dependencies:
+ are-we-there-yet "~1.1.2"
+ console-control-strings "~1.1.0"
+ gauge "~2.7.3"
+ set-blocking "~2.0.0"
+
+number-is-nan@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+
+object-assign@^4.0.1, object-assign@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+
+object-copy@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+ dependencies:
+ copy-descriptor "^0.1.0"
+ define-property "^0.2.5"
+ kind-of "^3.0.3"
+
+object-visit@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+ dependencies:
+ isobject "^3.0.0"
+
+object.pick@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+ dependencies:
+ isobject "^3.0.1"
+
+once@^1.3.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ dependencies:
+ wrappy "1"
+
+os-browserify@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
+
+os-homedir@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+
+os-locale@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2"
+ dependencies:
+ execa "^0.7.0"
+ lcid "^1.0.0"
+ mem "^1.1.0"
+
+os-tmpdir@^1.0.0, os-tmpdir@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+
+osenv@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.0"
+
+p-finally@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+
+p-limit@^1.1.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
+ dependencies:
+ p-try "^1.0.0"
+
+p-locate@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+ dependencies:
+ p-limit "^1.1.0"
+
+p-try@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+
+pako@~1.0.5:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258"
+
+parse-asn1@^5.0.0:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8"
+ dependencies:
+ asn1.js "^4.0.0"
+ browserify-aes "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.0"
+ pbkdf2 "^3.0.3"
+
+parse-json@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+ dependencies:
+ error-ex "^1.2.0"
+
+pascalcase@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+
+path-browserify@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
+
+path-dirname@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
+
+path-exists@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+
+path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+
+path-key@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+
+path-type@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
+ dependencies:
+ pify "^2.0.0"
+
+pbkdf2@^3.0.3:
+ version "3.0.16"
+ resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c"
+ dependencies:
+ create-hash "^1.1.2"
+ create-hmac "^1.1.4"
+ ripemd160 "^2.0.1"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+pify@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+
+pify@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
+
+pkg-dir@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
+ dependencies:
+ find-up "^2.1.0"
+
+posix-character-classes@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+
+private@^0.1.6, private@^0.1.8:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
+
+process-nextick-args@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
+
+process@^0.11.10:
+ version "0.11.10"
+ resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+
+prr@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
+
+pseudomap@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+
+public-encrypt@^4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994"
+ dependencies:
+ bn.js "^4.1.0"
+ browserify-rsa "^4.0.0"
+ create-hash "^1.1.0"
+ parse-asn1 "^5.0.0"
+ randombytes "^2.0.1"
+
+punycode@1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+
+punycode@^1.2.4:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+
+punycode@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+
+querystring-es3@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
+
+querystring@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80"
+ dependencies:
+ safe-buffer "^5.1.0"
+
+randomfill@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
+ dependencies:
+ randombytes "^2.0.5"
+ safe-buffer "^5.1.0"
+
+rc@^1.2.7:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
+ dependencies:
+ deep-extend "^0.6.0"
+ ini "~1.3.0"
+ minimist "^1.2.0"
+ strip-json-comments "~2.0.1"
+
+read-pkg-up@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
+ dependencies:
+ find-up "^2.0.0"
+ read-pkg "^2.0.0"
+
+read-pkg@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
+ dependencies:
+ load-json-file "^2.0.0"
+ normalize-package-data "^2.3.2"
+ path-type "^2.0.0"
+
+readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.3.3, readable-stream@^2.3.6:
+ version "2.3.6"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.3"
+ isarray "~1.0.0"
+ process-nextick-args "~2.0.0"
+ safe-buffer "~5.1.1"
+ string_decoder "~1.1.1"
+ util-deprecate "~1.0.1"
+
+readdirp@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"
+ dependencies:
+ graceful-fs "^4.1.2"
+ minimatch "^3.0.2"
+ readable-stream "^2.0.2"
+ set-immediate-shim "^1.0.1"
+
+regenerate@^1.2.1:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11"
+
+regenerator-runtime@^0.11.0:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
+
+regenerator-transform@^0.10.0:
+ version "0.10.1"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd"
+ dependencies:
+ babel-runtime "^6.18.0"
+ babel-types "^6.19.0"
+ private "^0.1.6"
+
+regex-not@^1.0.0, regex-not@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+ dependencies:
+ extend-shallow "^3.0.2"
+ safe-regex "^1.1.0"
+
+regexpu-core@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"
+ dependencies:
+ regenerate "^1.2.1"
+ regjsgen "^0.2.0"
+ regjsparser "^0.1.4"
+
+regjsgen@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
+
+regjsparser@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
+ dependencies:
+ jsesc "~0.5.0"
+
+remove-trailing-separator@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+
+repeat-element@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
+
+repeat-string@^1.5.2, repeat-string@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+
+repeating@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
+ dependencies:
+ is-finite "^1.0.0"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+
+require-main-filename@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
+
+resolve-url@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+
+ret@~0.1.10:
+ version "0.1.15"
+ resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+
+right-align@^0.1.1:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
+ dependencies:
+ align-text "^0.1.1"
+
+rimraf@^2.6.1:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
+ dependencies:
+ glob "^7.0.5"
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+
+safe-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+ dependencies:
+ ret "~0.1.10"
+
+"safer-buffer@>= 2.1.2 < 3":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+
+sax@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+
+"semver@2 || 3 || 4 || 5", semver@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
+
+set-blocking@^2.0.0, set-blocking@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+
+set-immediate-shim@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
+
+set-value@^0.4.3:
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.1"
+ to-object-path "^0.3.0"
+
+set-value@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274"
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.3"
+ split-string "^3.0.1"
+
+setimmediate@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+
+sha.js@^2.4.0, sha.js@^2.4.8:
+ version "2.4.11"
+ resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+shebang-command@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+ dependencies:
+ shebang-regex "^1.0.0"
+
+shebang-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+
+signal-exit@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
+
+slash@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
+
+snapdragon-node@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+ dependencies:
+ define-property "^1.0.0"
+ isobject "^3.0.0"
+ snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+ dependencies:
+ kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
+ dependencies:
+ base "^0.11.1"
+ debug "^2.2.0"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ map-cache "^0.2.2"
+ source-map "^0.5.6"
+ source-map-resolve "^0.5.0"
+ use "^3.1.0"
+
+source-list-map@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085"
+
+source-map-resolve@^0.5.0:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259"
+ dependencies:
+ atob "^2.1.1"
+ decode-uri-component "^0.2.0"
+ resolve-url "^0.2.1"
+ source-map-url "^0.4.0"
+ urix "^0.1.0"
+
+source-map-support@^0.4.15:
+ version "0.4.18"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
+ dependencies:
+ source-map "^0.5.6"
+
+source-map-url@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
+
+source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+
+source-map@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+
+spdx-correct@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82"
+ dependencies:
+ spdx-expression-parse "^3.0.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9"
+
+spdx-expression-parse@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0"
+ dependencies:
+ spdx-exceptions "^2.1.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87"
+
+split-string@^3.0.1, split-string@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+ dependencies:
+ extend-shallow "^3.0.0"
+
+static-extend@^0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+ dependencies:
+ define-property "^0.2.5"
+ object-copy "^0.1.0"
+
+stream-browserify@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db"
+ dependencies:
+ inherits "~2.0.1"
+ readable-stream "^2.0.2"
+
+stream-http@^2.7.2:
+ version "2.8.3"
+ resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc"
+ dependencies:
+ builtin-status-codes "^3.0.0"
+ inherits "^2.0.1"
+ readable-stream "^2.3.6"
+ to-arraybuffer "^1.0.0"
+ xtend "^4.0.0"
+
+string-width@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ strip-ansi "^3.0.0"
+
+"string-width@^1.0.2 || 2", string-width@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^4.0.0"
+
+string_decoder@^1.0.0, string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ dependencies:
+ safe-buffer "~5.1.0"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+ dependencies:
+ ansi-regex "^2.0.0"
+
+strip-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+ dependencies:
+ ansi-regex "^3.0.0"
+
+strip-bom@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+
+strip-eof@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
+
+strip-json-comments@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+
+supports-color@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+
+supports-color@^4.2.1:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b"
+ dependencies:
+ has-flag "^2.0.0"
+
+tapable@^0.2.7:
+ version "0.2.8"
+ resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22"
+
+tar@^4:
+ version "4.4.4"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd"
+ dependencies:
+ chownr "^1.0.1"
+ fs-minipass "^1.2.5"
+ minipass "^2.3.3"
+ minizlib "^1.1.0"
+ mkdirp "^0.5.0"
+ safe-buffer "^5.1.2"
+ yallist "^3.0.2"
+
+timers-browserify@^2.0.4:
+ version "2.0.10"
+ resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae"
+ dependencies:
+ setimmediate "^1.0.4"
+
+to-arraybuffer@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
+
+to-fast-properties@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
+
+to-object-path@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+ dependencies:
+ kind-of "^3.0.2"
+
+to-regex-range@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+ dependencies:
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+
+to-regex@^3.0.1, to-regex@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+ dependencies:
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ regex-not "^1.0.2"
+ safe-regex "^1.1.0"
+
+trim-right@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
+
+tty-browserify@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
+
+uglify-js@^2.8.29:
+ version "2.8.29"
+ resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd"
+ dependencies:
+ source-map "~0.5.1"
+ yargs "~3.10.0"
+ optionalDependencies:
+ uglify-to-browserify "~1.0.0"
+
+uglify-to-browserify@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
+
+uglifyjs-webpack-plugin@^0.4.6:
+ version "0.4.6"
+ resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz#b951f4abb6bd617e66f63eb891498e391763e309"
+ dependencies:
+ source-map "^0.5.6"
+ uglify-js "^2.8.29"
+ webpack-sources "^1.0.1"
+
+union-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"
+ dependencies:
+ arr-union "^3.1.0"
+ get-value "^2.0.6"
+ is-extendable "^0.1.1"
+ set-value "^0.4.3"
+
+unset-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+ dependencies:
+ has-value "^0.3.1"
+ isobject "^3.0.0"
+
+upath@^1.0.5:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd"
+
+uri-js@^4.2.1:
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"
+ dependencies:
+ punycode "^2.1.0"
+
+urix@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+
+url@^0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
+ dependencies:
+ punycode "1.3.2"
+ querystring "0.2.0"
+
+use@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
+
+util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+
+util@0.10.3:
+ version "0.10.3"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
+ dependencies:
+ inherits "2.0.1"
+
+util@^0.10.3:
+ version "0.10.4"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901"
+ dependencies:
+ inherits "2.0.3"
+
+validate-npm-package-license@^3.0.1:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338"
+ dependencies:
+ spdx-correct "^3.0.0"
+ spdx-expression-parse "^3.0.0"
+
+vm-browserify@0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
+ dependencies:
+ indexof "0.0.1"
+
+watchpack@^1.4.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00"
+ dependencies:
+ chokidar "^2.0.2"
+ graceful-fs "^4.1.2"
+ neo-async "^2.5.0"
+
+webpack-sources@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54"
+ dependencies:
+ source-list-map "^2.0.0"
+ source-map "~0.6.1"
+
+webpack@3:
+ version "3.12.0"
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.12.0.tgz#3f9e34360370602fcf639e97939db486f4ec0d74"
+ dependencies:
+ acorn "^5.0.0"
+ acorn-dynamic-import "^2.0.0"
+ ajv "^6.1.0"
+ ajv-keywords "^3.1.0"
+ async "^2.1.2"
+ enhanced-resolve "^3.4.0"
+ escope "^3.6.0"
+ interpret "^1.0.0"
+ json-loader "^0.5.4"
+ json5 "^0.5.1"
+ loader-runner "^2.3.0"
+ loader-utils "^1.1.0"
+ memory-fs "~0.4.1"
+ mkdirp "~0.5.0"
+ node-libs-browser "^2.0.0"
+ source-map "^0.5.3"
+ supports-color "^4.2.1"
+ tapable "^0.2.7"
+ uglifyjs-webpack-plugin "^0.4.6"
+ watchpack "^1.4.0"
+ webpack-sources "^1.0.1"
+ yargs "^8.0.2"
+
+which-module@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
+
+which@^1.2.9:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+ dependencies:
+ isexe "^2.0.0"
+
+wide-align@^1.1.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
+ dependencies:
+ string-width "^1.0.2 || 2"
+
+window-size@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
+
+wordwrap@0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
+
+wrap-ansi@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+
+xtend@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
+
+y18n@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
+
+yallist@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+
+yallist@^3.0.0, yallist@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9"
+
+yargs-parser@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9"
+ dependencies:
+ camelcase "^4.1.0"
+
+yargs@^8.0.2:
+ version "8.0.2"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360"
+ dependencies:
+ camelcase "^4.1.0"
+ cliui "^3.2.0"
+ decamelize "^1.1.1"
+ get-caller-file "^1.0.1"
+ os-locale "^2.0.0"
+ read-pkg-up "^2.0.0"
+ require-directory "^2.1.1"
+ require-main-filename "^1.0.1"
+ set-blocking "^2.0.0"
+ string-width "^2.0.0"
+ which-module "^2.0.0"
+ y18n "^3.2.1"
+ yargs-parser "^7.0.0"
+
+yargs@~3.10.0:
+ version "3.10.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
+ dependencies:
+ camelcase "^1.0.2"
+ cliui "^2.1.0"
+ decamelize "^1.0.0"
+ window-size "0.1.0"
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack3-babel7/index.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack3-babel7/index.js
new file mode 100644
index 0000000000..284584d64d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack3-babel7/index.js
@@ -0,0 +1,81 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+const path = require("path");
+const util = require("util");
+const _ = require("lodash");
+const webpack = require("webpack");
+
+const TARGET_NAME = "webpack3-babel7";
+
+module.exports = exports = async function(tests, dirname) {
+ const fixtures = [];
+ for (const [name, input] of tests) {
+ if (/typescript-/.test(name)) {
+ continue;
+ }
+
+ const testFnName = _.camelCase(`${TARGET_NAME}-${name}`);
+ const evalMaps = name.match(/-eval/);
+ const babelEnv = !name.match(/-es6/);
+ const babelModules = name.match(/-cjs/);
+
+ console.log(`Building ${TARGET_NAME} test ${name}`);
+
+ const scriptPath = path.join(dirname, "output", TARGET_NAME, `${name}.js`);
+ const result = await util.promisify(webpack)({
+ context: path.dirname(input),
+ entry: `./${path.basename(input)}`,
+ output: {
+ path: path.dirname(scriptPath),
+ filename: path.basename(scriptPath),
+
+ devtoolModuleFilenameTemplate: `${TARGET_NAME}://./${name}/[resource-path]`,
+
+ libraryTarget: "var",
+ library: testFnName,
+ libraryExport: "default"
+ },
+ devtool: evalMaps ? "eval-source-map" : "source-map",
+ module: {
+ loaders: [
+ {
+ test: /\.js$/,
+ exclude: /node_modules/,
+ loader: require.resolve("babel-loader"),
+ options: {
+ babelrc: false,
+ plugins: [
+ require.resolve("@babel/plugin-proposal-class-properties")
+ ],
+ presets: [
+ require.resolve("@babel/preset-flow"),
+ babelEnv
+ ? [
+ require.resolve("@babel/preset-env"),
+ { modules: babelModules ? "commonjs" : false }
+ ]
+ : null
+ ].filter(Boolean)
+ }
+ }
+ ].filter(Boolean)
+ }
+ });
+
+ fixtures.push({
+ name,
+ testFnName: testFnName,
+ scriptPath,
+ assets: [scriptPath, evalMaps ? null : `${scriptPath}.map`].filter(
+ Boolean
+ )
+ });
+ }
+
+ return {
+ target: TARGET_NAME,
+ fixtures
+ };
+};
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack3-babel7/package.json b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack3-babel7/package.json
new file mode 100644
index 0000000000..407517c96e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack3-babel7/package.json
@@ -0,0 +1,13 @@
+{
+ "name": "sourcemapped-webpack3-babel7",
+ "private": true,
+ "dependencies": {
+ "@babel/core": "^7.0.0-beta.54",
+ "@babel/preset-env": "^7.0.0-beta.54",
+ "@babel/preset-flow": "^7.0.0-beta.54",
+ "@babel/plugin-proposal-class-properties": "^7.0.0-beta.54",
+ "babel-loader": "^8.0.0-beta.4",
+ "lodash": "^4.17.10",
+ "webpack": "3"
+ }
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack3-babel7/yarn.lock b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack3-babel7/yarn.lock
new file mode 100644
index 0000000000..4016c6576b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack3-babel7/yarn.lock
@@ -0,0 +1,3089 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@babel/code-frame@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.54.tgz#0024f96fdf7028a21d68e273afd4e953214a1ead"
+ dependencies:
+ "@babel/highlight" "7.0.0-beta.54"
+
+"@babel/code-frame@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-rc.1.tgz#5c2154415d6c09959a71845ef519d11157e95d10"
+ dependencies:
+ "@babel/highlight" "7.0.0-rc.1"
+
+"@babel/core@^7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.0.0-beta.54.tgz#253c54d0095403a5cfa764e7d9b458194692d02b"
+ dependencies:
+ "@babel/code-frame" "7.0.0-beta.54"
+ "@babel/generator" "7.0.0-beta.54"
+ "@babel/helpers" "7.0.0-beta.54"
+ "@babel/parser" "7.0.0-beta.54"
+ "@babel/template" "7.0.0-beta.54"
+ "@babel/traverse" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+ convert-source-map "^1.1.0"
+ debug "^3.1.0"
+ json5 "^0.5.0"
+ lodash "^4.17.5"
+ resolve "^1.3.2"
+ semver "^5.4.1"
+ source-map "^0.5.0"
+
+"@babel/generator@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.54.tgz#c043c7eebeebfd7e665d95c281a4aafc83d4e1c9"
+ dependencies:
+ "@babel/types" "7.0.0-beta.54"
+ jsesc "^2.5.1"
+ lodash "^4.17.5"
+ source-map "^0.5.0"
+ trim-right "^1.0.1"
+
+"@babel/generator@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-rc.1.tgz#739c87d70b31aeed802bd6bc9fd51480065c45e8"
+ dependencies:
+ "@babel/types" "7.0.0-rc.1"
+ jsesc "^2.5.1"
+ lodash "^4.17.10"
+ source-map "^0.5.0"
+ trim-right "^1.0.1"
+
+"@babel/helper-annotate-as-pure@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0-beta.54.tgz#1626126a3f9fc4ed280ac942372c7d39653d7121"
+ dependencies:
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helper-builder-binary-assignment-operator-visitor@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.0.0-beta.54.tgz#d0a1967635b9eebcafdba80491917ee4981c12fa"
+ dependencies:
+ "@babel/helper-explode-assignable-expression" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helper-call-delegate@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.0.0-beta.54.tgz#f6b72cfd832fb26eb2a806e18de05f88d3a8f302"
+ dependencies:
+ "@babel/helper-hoist-variables" "7.0.0-beta.54"
+ "@babel/traverse" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helper-define-map@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.0.0-beta.54.tgz#2036d7c49365987f091db9702ce2f3b55f677730"
+ dependencies:
+ "@babel/helper-function-name" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+ lodash "^4.17.5"
+
+"@babel/helper-explode-assignable-expression@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.0.0-beta.54.tgz#cf067f3330965c2048bf087ea06f62c76d94a792"
+ dependencies:
+ "@babel/traverse" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helper-function-name@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.54.tgz#307875507a1eda2482a09a9a4df6a25632ffb34b"
+ dependencies:
+ "@babel/helper-get-function-arity" "7.0.0-beta.54"
+ "@babel/template" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helper-function-name@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-rc.1.tgz#20b2cc836a53c669f297c8d309fc553385c5cdde"
+ dependencies:
+ "@babel/helper-get-function-arity" "7.0.0-rc.1"
+ "@babel/template" "7.0.0-rc.1"
+ "@babel/types" "7.0.0-rc.1"
+
+"@babel/helper-get-function-arity@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.54.tgz#757bd189b077074a004028cfde5f083c306cc6c4"
+ dependencies:
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helper-get-function-arity@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-rc.1.tgz#60185957f72ed73766ce74c836ac574921743c46"
+ dependencies:
+ "@babel/types" "7.0.0-rc.1"
+
+"@babel/helper-hoist-variables@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0-beta.54.tgz#8635be8095135ff73f753ed189e449f68b4f43cb"
+ dependencies:
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helper-member-expression-to-functions@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0-beta.54.tgz#bce9ddc484317b13d2615bafe2b524d0d56d99df"
+ dependencies:
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helper-member-expression-to-functions@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0-rc.1.tgz#03a3b200fc00f8100dbcef9a351b69cfc0234b4f"
+ dependencies:
+ "@babel/types" "7.0.0-rc.1"
+
+"@babel/helper-module-imports@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0-beta.54.tgz#c2d8e14ff034225bf431356db77ef467b8d35aac"
+ dependencies:
+ "@babel/types" "7.0.0-beta.54"
+ lodash "^4.17.5"
+
+"@babel/helper-module-transforms@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.0.0-beta.54.tgz#8cc57eb0db5f0945d866524d555abd084e30cc35"
+ dependencies:
+ "@babel/helper-module-imports" "7.0.0-beta.54"
+ "@babel/helper-simple-access" "7.0.0-beta.54"
+ "@babel/helper-split-export-declaration" "7.0.0-beta.54"
+ "@babel/template" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+ lodash "^4.17.5"
+
+"@babel/helper-optimise-call-expression@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0-beta.54.tgz#4af8dd4ff90dbd29b3bcf85fff43952e2ae1016e"
+ dependencies:
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helper-optimise-call-expression@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0-rc.1.tgz#482d8251870f61d88c9800fd3e58128e14ff8c98"
+ dependencies:
+ "@babel/types" "7.0.0-rc.1"
+
+"@babel/helper-plugin-utils@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0-beta.54.tgz#61d2a9a0f9a3e31838a458debb9eebd7bdd249b4"
+
+"@babel/helper-plugin-utils@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0-rc.1.tgz#3e277eae59818e7d4caf4174f58a7a00d441336e"
+
+"@babel/helper-regex@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.0.0-beta.54.tgz#8ac562f855f132fc68dfd10b132552555ac870d9"
+ dependencies:
+ lodash "^4.17.5"
+
+"@babel/helper-remap-async-to-generator@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.0.0-beta.54.tgz#39a50052aadd74d40c73b7c58eb963b90fac56d3"
+ dependencies:
+ "@babel/helper-annotate-as-pure" "7.0.0-beta.54"
+ "@babel/helper-wrap-function" "7.0.0-beta.54"
+ "@babel/template" "7.0.0-beta.54"
+ "@babel/traverse" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helper-replace-supers@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.0.0-beta.54.tgz#901f5a1493a410799fd3ab3e0c0d29d18071c89f"
+ dependencies:
+ "@babel/helper-member-expression-to-functions" "7.0.0-beta.54"
+ "@babel/helper-optimise-call-expression" "7.0.0-beta.54"
+ "@babel/traverse" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helper-replace-supers@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.0.0-rc.1.tgz#cab8d7a6c758e4561fb285f4725c850d68c1c3db"
+ dependencies:
+ "@babel/helper-member-expression-to-functions" "7.0.0-rc.1"
+ "@babel/helper-optimise-call-expression" "7.0.0-rc.1"
+ "@babel/traverse" "7.0.0-rc.1"
+ "@babel/types" "7.0.0-rc.1"
+
+"@babel/helper-simple-access@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.0.0-beta.54.tgz#5f760a19589a9b6f07e80a65ef4bcbd4fba8c253"
+ dependencies:
+ "@babel/template" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+ lodash "^4.17.5"
+
+"@babel/helper-split-export-declaration@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.54.tgz#89cd8833c95481a0827ac6a1bfccddb92b75a109"
+ dependencies:
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helper-split-export-declaration@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-rc.1.tgz#b00323834343fd0210f1f46c7a53521ad53efa5e"
+ dependencies:
+ "@babel/types" "7.0.0-rc.1"
+
+"@babel/helper-wrap-function@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.0.0-beta.54.tgz#dc1b7a483a3074a3531b36523e03156d910a3a2a"
+ dependencies:
+ "@babel/helper-function-name" "7.0.0-beta.54"
+ "@babel/template" "7.0.0-beta.54"
+ "@babel/traverse" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helpers@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.0.0-beta.54.tgz#b86a99a80efd81668caef307610b961197446a74"
+ dependencies:
+ "@babel/template" "7.0.0-beta.54"
+ "@babel/traverse" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/highlight@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.54.tgz#155d507358329b8e7068970017c3fd74a9b08584"
+ dependencies:
+ chalk "^2.0.0"
+ esutils "^2.0.2"
+ js-tokens "^3.0.0"
+
+"@babel/highlight@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-rc.1.tgz#e0ca4731fa4786f7b9500421d6ff5e5a7753e81e"
+ dependencies:
+ chalk "^2.0.0"
+ esutils "^2.0.2"
+ js-tokens "^3.0.0"
+
+"@babel/parser@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.0.0-beta.54.tgz#c01aa63b57c9c8dce8744796c81d9df121f20db4"
+
+"@babel/parser@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.0.0-rc.1.tgz#d009a9bba8175d7b971e30cd03535b278c44082d"
+
+"@babel/plugin-proposal-async-generator-functions@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.0.0-beta.54.tgz#19871bd655b5d748b0ae3e9ecebe247be8b7f83b"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/helper-remap-async-to-generator" "7.0.0-beta.54"
+ "@babel/plugin-syntax-async-generators" "7.0.0-beta.54"
+
+"@babel/plugin-proposal-class-properties@^7.0.0-beta.54":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.0.0-rc.1.tgz#88b3d3b257b9ed53fae50b13103e4c3c725e704e"
+ dependencies:
+ "@babel/helper-function-name" "7.0.0-rc.1"
+ "@babel/helper-member-expression-to-functions" "7.0.0-rc.1"
+ "@babel/helper-optimise-call-expression" "7.0.0-rc.1"
+ "@babel/helper-plugin-utils" "7.0.0-rc.1"
+ "@babel/helper-replace-supers" "7.0.0-rc.1"
+ "@babel/plugin-syntax-class-properties" "7.0.0-rc.1"
+
+"@babel/plugin-proposal-object-rest-spread@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.0.0-beta.54.tgz#5481269a020dd0d38715a8094fed015d30ef4c2a"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/plugin-syntax-object-rest-spread" "7.0.0-beta.54"
+
+"@babel/plugin-proposal-optional-catch-binding@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.0.0-beta.54.tgz#931f69298fa0c411b2596616cf5a1d82925b87a9"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/plugin-syntax-optional-catch-binding" "7.0.0-beta.54"
+
+"@babel/plugin-proposal-unicode-property-regex@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.0.0-beta.54.tgz#1624631faf688bcbde4918712bd0af7186f7d245"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/helper-regex" "7.0.0-beta.54"
+ regexpu-core "^4.2.0"
+
+"@babel/plugin-syntax-async-generators@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.0.0-beta.54.tgz#ffac8f64927614762897cc9643495fd38097dd41"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-syntax-class-properties@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.0.0-rc.1.tgz#155343e256c84d127496e46675a3049636d311ff"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-rc.1"
+
+"@babel/plugin-syntax-flow@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.0.0-beta.54.tgz#8d38fffa6da16e2d327f5fee4f90913b14d43d14"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-syntax-object-rest-spread@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.0.0-beta.54.tgz#e0f445612081ab573e2535adbabc7b710d17940c"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-syntax-optional-catch-binding@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.0.0-beta.54.tgz#2eb8ddde19ddf73a343d087a087159ed44e54809"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-arrow-functions@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.0.0-beta.54.tgz#44a977b8e61e4efcc7658bbbe260f204ca1bcf72"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-async-to-generator@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.0.0-beta.54.tgz#d035e65c50884937d64dbe68d16498c032f8bbec"
+ dependencies:
+ "@babel/helper-module-imports" "7.0.0-beta.54"
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/helper-remap-async-to-generator" "7.0.0-beta.54"
+
+"@babel/plugin-transform-block-scoped-functions@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.0.0-beta.54.tgz#938a77fb12f0e11661bdf5386e4aeca47f0c053b"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-block-scoping@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.0.0-beta.54.tgz#bcae1c2ffae4cc3b7b3e5455f0a98daecc09a3c6"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ lodash "^4.17.5"
+
+"@babel/plugin-transform-classes@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.0.0-beta.54.tgz#b15781d2e499ce25438e73fea2fa5a09858568ff"
+ dependencies:
+ "@babel/helper-annotate-as-pure" "7.0.0-beta.54"
+ "@babel/helper-define-map" "7.0.0-beta.54"
+ "@babel/helper-function-name" "7.0.0-beta.54"
+ "@babel/helper-optimise-call-expression" "7.0.0-beta.54"
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/helper-replace-supers" "7.0.0-beta.54"
+ "@babel/helper-split-export-declaration" "7.0.0-beta.54"
+ globals "^11.1.0"
+
+"@babel/plugin-transform-computed-properties@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.0.0-beta.54.tgz#b28494942b94fb86d01994763d2b5c43bdd986af"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-destructuring@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.0.0-beta.54.tgz#81f649a3e4fcb62c2b2ad497f783a800b994472f"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-dotall-regex@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.0.0-beta.54.tgz#2835b7f4141b19fa0648eb96ffe3c4fccd1eca20"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/helper-regex" "7.0.0-beta.54"
+ regexpu-core "^4.1.3"
+
+"@babel/plugin-transform-duplicate-keys@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.0.0-beta.54.tgz#4b8f4fb349902a800679191f59d0fa53fca49400"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-exponentiation-operator@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.0.0-beta.54.tgz#1017096366fb43ebca8ed8d8d0cdd1ebd64febb2"
+ dependencies:
+ "@babel/helper-builder-binary-assignment-operator-visitor" "7.0.0-beta.54"
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-flow-strip-types@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.0.0-beta.54.tgz#3612fa3935e60df6eaae66a33d24fc31b58cc919"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/plugin-syntax-flow" "7.0.0-beta.54"
+
+"@babel/plugin-transform-for-of@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.0.0-beta.54.tgz#261d2992058a9e09234b9ff67820054ffc55f79c"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-function-name@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.0.0-beta.54.tgz#cc722f9973931337def3d1e6c55138581edd371e"
+ dependencies:
+ "@babel/helper-function-name" "7.0.0-beta.54"
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-literals@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.0.0-beta.54.tgz#70f07ecc2f3b7bc9f542a578e82eec18a5504098"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-modules-amd@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.0.0-beta.54.tgz#fb50740741420bb485ee1315d2e1133db4e433d2"
+ dependencies:
+ "@babel/helper-module-transforms" "7.0.0-beta.54"
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-modules-commonjs@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.0.0-beta.54.tgz#07d912a7a24dad2d9bf5d44ce322ddc457a8db37"
+ dependencies:
+ "@babel/helper-module-transforms" "7.0.0-beta.54"
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/helper-simple-access" "7.0.0-beta.54"
+
+"@babel/plugin-transform-modules-systemjs@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.0.0-beta.54.tgz#0923f012ac252e037467245ff27f8954f4ce6803"
+ dependencies:
+ "@babel/helper-hoist-variables" "7.0.0-beta.54"
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-modules-umd@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.0.0-beta.54.tgz#3af0e2cf8f533b2984a8ca6da316246850c3aeda"
+ dependencies:
+ "@babel/helper-module-transforms" "7.0.0-beta.54"
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-new-target@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0-beta.54.tgz#634ee57fa805720195cd31086c973f1fc5c9949b"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-object-super@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.0.0-beta.54.tgz#d25fad66eff90de03ee62f8384f0af57bcd065d9"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/helper-replace-supers" "7.0.0-beta.54"
+
+"@babel/plugin-transform-parameters@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.0.0-beta.54.tgz#76306f19b9acac6cf13721af15ecb9f382864ff7"
+ dependencies:
+ "@babel/helper-call-delegate" "7.0.0-beta.54"
+ "@babel/helper-get-function-arity" "7.0.0-beta.54"
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-regenerator@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0-beta.54.tgz#8b46e192f3bfe096bbbf86e27764e7662e5f9a0f"
+ dependencies:
+ regenerator-transform "^0.13.3"
+
+"@babel/plugin-transform-shorthand-properties@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.0.0-beta.54.tgz#50e73c2afc5898b1055510ddf60ee13a6301517f"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-spread@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.0.0-beta.54.tgz#4f0852df0f4b1db2426c40facd8fe5f028a3dbc9"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-sticky-regex@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.0.0-beta.54.tgz#568f35eb5118ae96fad82eac36374d7923b47883"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/helper-regex" "7.0.0-beta.54"
+
+"@babel/plugin-transform-template-literals@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.0.0-beta.54.tgz#cb1f6303cafb8442a6c6c69a0dfbb60699f327bc"
+ dependencies:
+ "@babel/helper-annotate-as-pure" "7.0.0-beta.54"
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-typeof-symbol@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.0.0-beta.54.tgz#6d068686239c9ebaf534d1c0d8032953f7b521bc"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-unicode-regex@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.0.0-beta.54.tgz#1dc7e9150b39aaeb19fca1c863e082f6096afc60"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/helper-regex" "7.0.0-beta.54"
+ regexpu-core "^4.1.3"
+
+"@babel/preset-env@^7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.0.0-beta.54.tgz#4b05c4e3aaed64a509098e4e854dfc0e02edf053"
+ dependencies:
+ "@babel/helper-module-imports" "7.0.0-beta.54"
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/plugin-proposal-async-generator-functions" "7.0.0-beta.54"
+ "@babel/plugin-proposal-object-rest-spread" "7.0.0-beta.54"
+ "@babel/plugin-proposal-optional-catch-binding" "7.0.0-beta.54"
+ "@babel/plugin-proposal-unicode-property-regex" "7.0.0-beta.54"
+ "@babel/plugin-syntax-async-generators" "7.0.0-beta.54"
+ "@babel/plugin-syntax-object-rest-spread" "7.0.0-beta.54"
+ "@babel/plugin-syntax-optional-catch-binding" "7.0.0-beta.54"
+ "@babel/plugin-transform-arrow-functions" "7.0.0-beta.54"
+ "@babel/plugin-transform-async-to-generator" "7.0.0-beta.54"
+ "@babel/plugin-transform-block-scoped-functions" "7.0.0-beta.54"
+ "@babel/plugin-transform-block-scoping" "7.0.0-beta.54"
+ "@babel/plugin-transform-classes" "7.0.0-beta.54"
+ "@babel/plugin-transform-computed-properties" "7.0.0-beta.54"
+ "@babel/plugin-transform-destructuring" "7.0.0-beta.54"
+ "@babel/plugin-transform-dotall-regex" "7.0.0-beta.54"
+ "@babel/plugin-transform-duplicate-keys" "7.0.0-beta.54"
+ "@babel/plugin-transform-exponentiation-operator" "7.0.0-beta.54"
+ "@babel/plugin-transform-for-of" "7.0.0-beta.54"
+ "@babel/plugin-transform-function-name" "7.0.0-beta.54"
+ "@babel/plugin-transform-literals" "7.0.0-beta.54"
+ "@babel/plugin-transform-modules-amd" "7.0.0-beta.54"
+ "@babel/plugin-transform-modules-commonjs" "7.0.0-beta.54"
+ "@babel/plugin-transform-modules-systemjs" "7.0.0-beta.54"
+ "@babel/plugin-transform-modules-umd" "7.0.0-beta.54"
+ "@babel/plugin-transform-new-target" "7.0.0-beta.54"
+ "@babel/plugin-transform-object-super" "7.0.0-beta.54"
+ "@babel/plugin-transform-parameters" "7.0.0-beta.54"
+ "@babel/plugin-transform-regenerator" "7.0.0-beta.54"
+ "@babel/plugin-transform-shorthand-properties" "7.0.0-beta.54"
+ "@babel/plugin-transform-spread" "7.0.0-beta.54"
+ "@babel/plugin-transform-sticky-regex" "7.0.0-beta.54"
+ "@babel/plugin-transform-template-literals" "7.0.0-beta.54"
+ "@babel/plugin-transform-typeof-symbol" "7.0.0-beta.54"
+ "@babel/plugin-transform-unicode-regex" "7.0.0-beta.54"
+ browserslist "^3.0.0"
+ invariant "^2.2.2"
+ js-levenshtein "^1.1.3"
+ semver "^5.3.0"
+
+"@babel/preset-flow@^7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.0.0-beta.54.tgz#7a6f5b75297047ec36d5b3fd0b5009d59bb4240f"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/plugin-transform-flow-strip-types" "7.0.0-beta.54"
+
+"@babel/template@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.54.tgz#d5b0d2d2d55c0e78b048c61a058f36cfd7d91af3"
+ dependencies:
+ "@babel/code-frame" "7.0.0-beta.54"
+ "@babel/parser" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+ lodash "^4.17.5"
+
+"@babel/template@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-rc.1.tgz#5f9c0a481c9f22ecdb84697b3c3a34eadeeca23c"
+ dependencies:
+ "@babel/code-frame" "7.0.0-rc.1"
+ "@babel/parser" "7.0.0-rc.1"
+ "@babel/types" "7.0.0-rc.1"
+ lodash "^4.17.10"
+
+"@babel/traverse@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.54.tgz#2c17f98dcdbf19aa918fde128f0e1a0bc089e05a"
+ dependencies:
+ "@babel/code-frame" "7.0.0-beta.54"
+ "@babel/generator" "7.0.0-beta.54"
+ "@babel/helper-function-name" "7.0.0-beta.54"
+ "@babel/helper-split-export-declaration" "7.0.0-beta.54"
+ "@babel/parser" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+ debug "^3.1.0"
+ globals "^11.1.0"
+ lodash "^4.17.5"
+
+"@babel/traverse@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-rc.1.tgz#867b4b45ada2d51ae2d0076f1c1d5880f8557158"
+ dependencies:
+ "@babel/code-frame" "7.0.0-rc.1"
+ "@babel/generator" "7.0.0-rc.1"
+ "@babel/helper-function-name" "7.0.0-rc.1"
+ "@babel/helper-split-export-declaration" "7.0.0-rc.1"
+ "@babel/parser" "7.0.0-rc.1"
+ "@babel/types" "7.0.0-rc.1"
+ debug "^3.1.0"
+ globals "^11.1.0"
+ lodash "^4.17.10"
+
+"@babel/types@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.54.tgz#025ad68492fed542c13f14c579a44c848e531063"
+ dependencies:
+ esutils "^2.0.2"
+ lodash "^4.17.5"
+ to-fast-properties "^2.0.0"
+
+"@babel/types@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-rc.1.tgz#6abf6d14ddd9fc022617e5b62e6b32f4fa6526ad"
+ dependencies:
+ esutils "^2.0.2"
+ lodash "^4.17.10"
+ to-fast-properties "^2.0.0"
+
+abbrev@1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+
+acorn-dynamic-import@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4"
+ dependencies:
+ acorn "^4.0.3"
+
+acorn@^4.0.3:
+ version "4.0.13"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
+
+acorn@^5.0.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8"
+
+ajv-keywords@^3.1.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a"
+
+ajv@^6.1.0:
+ version "6.5.2"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.2.tgz#678495f9b82f7cca6be248dd92f59bff5e1f4360"
+ dependencies:
+ fast-deep-equal "^2.0.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.1"
+
+align-text@^0.1.1, align-text@^0.1.3:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
+ dependencies:
+ kind-of "^3.0.2"
+ longest "^1.0.1"
+ repeat-string "^1.5.2"
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+
+ansi-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+
+ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ dependencies:
+ color-convert "^1.9.0"
+
+anymatch@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
+ dependencies:
+ micromatch "^3.1.4"
+ normalize-path "^2.1.1"
+
+aproba@^1.0.3:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
+
+are-we-there-yet@~1.1.2:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
+ dependencies:
+ delegates "^1.0.0"
+ readable-stream "^2.0.6"
+
+arr-diff@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+
+arr-flatten@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+
+arr-union@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+
+array-unique@^0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+
+asn1.js@^4.0.0:
+ version "4.10.1"
+ resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"
+ dependencies:
+ bn.js "^4.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+assert@^1.1.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91"
+ dependencies:
+ util "0.10.3"
+
+assign-symbols@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+
+async-each@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
+
+async@^2.1.2:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610"
+ dependencies:
+ lodash "^4.17.10"
+
+atob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a"
+
+babel-loader@^8.0.0-beta.4:
+ version "8.0.0-beta.4"
+ resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.0-beta.4.tgz#c3fab00696c385c70c04dbe486391f0eb996f345"
+ dependencies:
+ find-cache-dir "^1.0.0"
+ loader-utils "^1.0.2"
+ mkdirp "^0.5.1"
+ util.promisify "^1.0.0"
+
+balanced-match@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+
+base64-js@^1.0.2:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3"
+
+base@^0.11.1:
+ version "0.11.2"
+ resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+ dependencies:
+ cache-base "^1.0.1"
+ class-utils "^0.3.5"
+ component-emitter "^1.2.1"
+ define-property "^1.0.0"
+ isobject "^3.0.1"
+ mixin-deep "^1.2.0"
+ pascalcase "^0.1.1"
+
+big.js@^3.1.3:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
+
+binary-extensions@^1.0.0:
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205"
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
+ version "4.11.8"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+braces@^2.3.0, braces@^2.3.1:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+ dependencies:
+ arr-flatten "^1.1.0"
+ array-unique "^0.3.2"
+ extend-shallow "^2.0.1"
+ fill-range "^4.0.0"
+ isobject "^3.0.1"
+ repeat-element "^1.1.2"
+ snapdragon "^0.8.1"
+ snapdragon-node "^2.0.1"
+ split-string "^3.0.2"
+ to-regex "^3.0.1"
+
+brorand@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
+ dependencies:
+ buffer-xor "^1.0.3"
+ cipher-base "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.3"
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+browserify-cipher@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
+ dependencies:
+ browserify-aes "^1.0.4"
+ browserify-des "^1.0.0"
+ evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c"
+ dependencies:
+ cipher-base "^1.0.1"
+ des.js "^1.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+browserify-rsa@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
+ dependencies:
+ bn.js "^4.1.0"
+ randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
+ dependencies:
+ bn.js "^4.1.1"
+ browserify-rsa "^4.0.0"
+ create-hash "^1.1.0"
+ create-hmac "^1.1.2"
+ elliptic "^6.0.0"
+ inherits "^2.0.1"
+ parse-asn1 "^5.0.0"
+
+browserify-zlib@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
+ dependencies:
+ pako "~1.0.5"
+
+browserslist@^3.0.0:
+ version "3.2.8"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6"
+ dependencies:
+ caniuse-lite "^1.0.30000844"
+ electron-to-chromium "^1.3.47"
+
+buffer-xor@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+
+buffer@^4.3.0:
+ version "4.9.1"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298"
+ dependencies:
+ base64-js "^1.0.2"
+ ieee754 "^1.1.4"
+ isarray "^1.0.0"
+
+builtin-modules@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
+
+builtin-status-codes@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
+
+cache-base@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+ dependencies:
+ collection-visit "^1.0.0"
+ component-emitter "^1.2.1"
+ get-value "^2.0.6"
+ has-value "^1.0.0"
+ isobject "^3.0.1"
+ set-value "^2.0.0"
+ to-object-path "^0.3.0"
+ union-value "^1.0.0"
+ unset-value "^1.0.0"
+
+camelcase@^1.0.2:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
+
+camelcase@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
+
+caniuse-lite@^1.0.30000844:
+ version "1.0.30000865"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz#70026616e8afe6e1442f8bb4e1092987d81a2f25"
+
+center-align@^0.1.1:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
+ dependencies:
+ align-text "^0.1.3"
+ lazy-cache "^1.0.3"
+
+chalk@^2.0.0:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e"
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chokidar@^2.0.2:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26"
+ dependencies:
+ anymatch "^2.0.0"
+ async-each "^1.0.0"
+ braces "^2.3.0"
+ glob-parent "^3.1.0"
+ inherits "^2.0.1"
+ is-binary-path "^1.0.0"
+ is-glob "^4.0.0"
+ lodash.debounce "^4.0.8"
+ normalize-path "^2.1.1"
+ path-is-absolute "^1.0.0"
+ readdirp "^2.0.0"
+ upath "^1.0.5"
+ optionalDependencies:
+ fsevents "^1.2.2"
+
+chownr@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+class-utils@^0.3.5:
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+ dependencies:
+ arr-union "^3.1.0"
+ define-property "^0.2.5"
+ isobject "^3.0.0"
+ static-extend "^0.1.1"
+
+cliui@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
+ dependencies:
+ center-align "^0.1.1"
+ right-align "^0.1.1"
+ wordwrap "0.0.2"
+
+cliui@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wrap-ansi "^2.0.0"
+
+code-point-at@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+
+collection-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+ dependencies:
+ map-visit "^1.0.0"
+ object-visit "^1.0.0"
+
+color-convert@^1.9.0:
+ version "1.9.2"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147"
+ dependencies:
+ color-name "1.1.1"
+
+color-name@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689"
+
+commondir@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
+
+component-emitter@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+
+console-browserify@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
+ dependencies:
+ date-now "^0.1.4"
+
+console-control-strings@^1.0.0, console-control-strings@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+
+constants-browserify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
+
+convert-source-map@^1.1.0:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5"
+
+copy-descriptor@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+
+core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+
+create-ecdh@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff"
+ dependencies:
+ bn.js "^4.1.0"
+ elliptic "^6.0.0"
+
+create-hash@^1.1.0, create-hash@^1.1.2:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
+ dependencies:
+ cipher-base "^1.0.1"
+ inherits "^2.0.1"
+ md5.js "^1.3.4"
+ ripemd160 "^2.0.1"
+ sha.js "^2.4.0"
+
+create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
+ dependencies:
+ cipher-base "^1.0.3"
+ create-hash "^1.1.0"
+ inherits "^2.0.1"
+ ripemd160 "^2.0.0"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+cross-spawn@^5.0.1:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
+ dependencies:
+ lru-cache "^4.0.1"
+ shebang-command "^1.2.0"
+ which "^1.2.9"
+
+crypto-browserify@^3.11.0:
+ version "3.12.0"
+ resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
+ dependencies:
+ browserify-cipher "^1.0.0"
+ browserify-sign "^4.0.0"
+ create-ecdh "^4.0.0"
+ create-hash "^1.1.0"
+ create-hmac "^1.1.0"
+ diffie-hellman "^5.0.0"
+ inherits "^2.0.1"
+ pbkdf2 "^3.0.3"
+ public-encrypt "^4.0.0"
+ randombytes "^2.0.0"
+ randomfill "^1.0.3"
+
+d@1:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f"
+ dependencies:
+ es5-ext "^0.10.9"
+
+date-now@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
+
+debug@^2.1.2, debug@^2.2.0, debug@^2.3.3:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ dependencies:
+ ms "2.0.0"
+
+debug@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
+ dependencies:
+ ms "2.0.0"
+
+decamelize@^1.0.0, decamelize@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+
+decode-uri-component@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+
+deep-extend@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
+
+define-properties@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94"
+ dependencies:
+ foreach "^2.0.5"
+ object-keys "^1.0.8"
+
+define-property@^0.2.5:
+ version "0.2.5"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+ dependencies:
+ is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+ dependencies:
+ is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+ dependencies:
+ is-descriptor "^1.0.2"
+ isobject "^3.0.1"
+
+delegates@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+
+des.js@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
+ dependencies:
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+detect-libc@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
+
+diffie-hellman@^5.0.0:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
+ dependencies:
+ bn.js "^4.1.0"
+ miller-rabin "^4.0.0"
+ randombytes "^2.0.0"
+
+domain-browser@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
+
+electron-to-chromium@^1.3.47:
+ version "1.3.52"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.52.tgz#d2d9f1270ba4a3b967b831c40ef71fb4d9ab5ce0"
+
+elliptic@^6.0.0:
+ version "6.4.0"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df"
+ dependencies:
+ bn.js "^4.4.0"
+ brorand "^1.0.1"
+ hash.js "^1.0.0"
+ hmac-drbg "^1.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.0"
+
+emojis-list@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
+
+enhanced-resolve@^3.4.0:
+ version "3.4.1"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e"
+ dependencies:
+ graceful-fs "^4.1.2"
+ memory-fs "^0.4.0"
+ object-assign "^4.0.1"
+ tapable "^0.2.7"
+
+errno@^0.1.3:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
+ dependencies:
+ prr "~1.0.1"
+
+error-ex@^1.2.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+ dependencies:
+ is-arrayish "^0.2.1"
+
+es-abstract@^1.5.1:
+ version "1.12.0"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165"
+ dependencies:
+ es-to-primitive "^1.1.1"
+ function-bind "^1.1.1"
+ has "^1.0.1"
+ is-callable "^1.1.3"
+ is-regex "^1.0.4"
+
+es-to-primitive@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d"
+ dependencies:
+ is-callable "^1.1.1"
+ is-date-object "^1.0.1"
+ is-symbol "^1.0.1"
+
+es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14:
+ version "0.10.45"
+ resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.45.tgz#0bfdf7b473da5919d5adf3bd25ceb754fccc3653"
+ dependencies:
+ es6-iterator "~2.0.3"
+ es6-symbol "~3.1.1"
+ next-tick "1"
+
+es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@~2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
+ dependencies:
+ d "1"
+ es5-ext "^0.10.35"
+ es6-symbol "^3.1.1"
+
+es6-map@^0.1.3:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0"
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+ es6-iterator "~2.0.1"
+ es6-set "~0.1.5"
+ es6-symbol "~3.1.1"
+ event-emitter "~0.3.5"
+
+es6-set@~0.1.5:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1"
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+ es6-iterator "~2.0.1"
+ es6-symbol "3.1.1"
+ event-emitter "~0.3.5"
+
+es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+
+es6-weak-map@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f"
+ dependencies:
+ d "1"
+ es5-ext "^0.10.14"
+ es6-iterator "^2.0.1"
+ es6-symbol "^3.1.1"
+
+escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+
+escope@^3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3"
+ dependencies:
+ es6-map "^0.1.3"
+ es6-weak-map "^2.0.1"
+ esrecurse "^4.1.0"
+ estraverse "^4.1.1"
+
+esrecurse@^4.1.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
+ dependencies:
+ estraverse "^4.1.0"
+
+estraverse@^4.1.0, estraverse@^4.1.1:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
+
+esutils@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
+
+event-emitter@~0.3.5:
+ version "0.3.5"
+ resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+
+events@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
+
+evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+ dependencies:
+ md5.js "^1.3.4"
+ safe-buffer "^5.1.1"
+
+execa@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
+ dependencies:
+ cross-spawn "^5.0.1"
+ get-stream "^3.0.0"
+ is-stream "^1.1.0"
+ npm-run-path "^2.0.0"
+ p-finally "^1.0.0"
+ signal-exit "^3.0.0"
+ strip-eof "^1.0.0"
+
+expand-brackets@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+ dependencies:
+ debug "^2.3.3"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ posix-character-classes "^0.1.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+extend-shallow@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+ dependencies:
+ is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+ dependencies:
+ assign-symbols "^1.0.0"
+ is-extendable "^1.0.1"
+
+extglob@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+ dependencies:
+ array-unique "^0.3.2"
+ define-property "^1.0.0"
+ expand-brackets "^2.1.4"
+ extend-shallow "^2.0.1"
+ fragment-cache "^0.2.1"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+fast-deep-equal@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
+
+fill-range@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+ to-regex-range "^2.1.0"
+
+find-cache-dir@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f"
+ dependencies:
+ commondir "^1.0.1"
+ make-dir "^1.0.0"
+ pkg-dir "^2.0.0"
+
+find-up@^2.0.0, find-up@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+ dependencies:
+ locate-path "^2.0.0"
+
+for-in@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+
+foreach@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
+
+fragment-cache@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+ dependencies:
+ map-cache "^0.2.2"
+
+fs-minipass@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d"
+ dependencies:
+ minipass "^2.2.1"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+
+fsevents@^1.2.2:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426"
+ dependencies:
+ nan "^2.9.2"
+ node-pre-gyp "^0.10.0"
+
+function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+
+gauge@~2.7.3:
+ version "2.7.4"
+ resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
+ dependencies:
+ aproba "^1.0.3"
+ console-control-strings "^1.0.0"
+ has-unicode "^2.0.0"
+ object-assign "^4.1.0"
+ signal-exit "^3.0.0"
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wide-align "^1.1.0"
+
+get-caller-file@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
+
+get-stream@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+
+get-value@^2.0.3, get-value@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+
+glob-parent@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
+ dependencies:
+ is-glob "^3.1.0"
+ path-dirname "^1.0.0"
+
+glob@^7.0.5:
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+globals@^11.1.0:
+ version "11.7.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673"
+
+graceful-fs@^4.1.2:
+ version "4.1.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
+
+has-flag@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51"
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+
+has-unicode@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+
+has-value@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+ dependencies:
+ get-value "^2.0.3"
+ has-values "^0.1.4"
+ isobject "^2.0.0"
+
+has-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+ dependencies:
+ get-value "^2.0.6"
+ has-values "^1.0.0"
+ isobject "^3.0.0"
+
+has-values@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+
+has-values@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+ dependencies:
+ is-number "^3.0.0"
+ kind-of "^4.0.0"
+
+has@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ dependencies:
+ function-bind "^1.1.1"
+
+hash-base@^3.0.0:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+hash.js@^1.0.0, hash.js@^1.0.3:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.5.tgz#e38ab4b85dfb1e0c40fe9265c0e9b54854c23812"
+ dependencies:
+ inherits "^2.0.3"
+ minimalistic-assert "^1.0.1"
+
+hmac-drbg@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+ dependencies:
+ hash.js "^1.0.3"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.1"
+
+hosted-git-info@^2.1.4:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047"
+
+https-browserify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
+
+iconv-lite@^0.4.4:
+ version "0.4.23"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63"
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+ieee754@^1.1.4:
+ version "1.1.12"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b"
+
+ignore-walk@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8"
+ dependencies:
+ minimatch "^3.0.4"
+
+indexof@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+
+inherits@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
+
+ini@~1.3.0:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
+
+interpret@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614"
+
+invariant@^2.2.2:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
+ dependencies:
+ loose-envify "^1.0.0"
+
+invert-kv@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
+
+is-accessor-descriptor@^0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-accessor-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
+ dependencies:
+ kind-of "^6.0.0"
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+
+is-binary-path@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+ dependencies:
+ binary-extensions "^1.0.0"
+
+is-buffer@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+
+is-builtin-module@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
+ dependencies:
+ builtin-modules "^1.0.0"
+
+is-callable@^1.1.1, is-callable@^1.1.3:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75"
+
+is-data-descriptor@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-data-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
+ dependencies:
+ kind-of "^6.0.0"
+
+is-date-object@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
+
+is-descriptor@^0.1.0:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
+ dependencies:
+ is-accessor-descriptor "^0.1.6"
+ is-data-descriptor "^0.1.4"
+ kind-of "^5.0.0"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
+ dependencies:
+ is-accessor-descriptor "^1.0.0"
+ is-data-descriptor "^1.0.0"
+ kind-of "^6.0.2"
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+
+is-extendable@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+ dependencies:
+ is-plain-object "^2.0.4"
+
+is-extglob@^2.1.0, is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+
+is-fullwidth-code-point@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+
+is-glob@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
+ dependencies:
+ is-extglob "^2.1.0"
+
+is-glob@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0"
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-number@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+ dependencies:
+ isobject "^3.0.1"
+
+is-regex@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
+ dependencies:
+ has "^1.0.1"
+
+is-stream@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+
+is-symbol@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572"
+
+is-windows@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+
+isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+
+isobject@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+ dependencies:
+ isarray "1.0.0"
+
+isobject@^3.0.0, isobject@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+
+js-levenshtein@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.3.tgz#3ef627df48ec8cf24bacf05c0f184ff30ef413c5"
+
+js-tokens@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
+
+"js-tokens@^3.0.0 || ^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+
+jsesc@^2.5.1:
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe"
+
+jsesc@~0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+
+json-loader@^0.5.4:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d"
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+
+json5@^0.5.0, json5@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
+
+kind-of@^6.0.0, kind-of@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
+
+lazy-cache@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
+
+lcid@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
+ dependencies:
+ invert-kv "^1.0.0"
+
+load-json-file@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
+ dependencies:
+ graceful-fs "^4.1.2"
+ parse-json "^2.2.0"
+ pify "^2.0.0"
+ strip-bom "^3.0.0"
+
+loader-runner@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2"
+
+loader-utils@^1.0.2, loader-utils@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd"
+ dependencies:
+ big.js "^3.1.3"
+ emojis-list "^2.0.0"
+ json5 "^0.5.0"
+
+locate-path@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+ dependencies:
+ p-locate "^2.0.0"
+ path-exists "^3.0.0"
+
+lodash.debounce@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
+
+lodash@^4.17.10, lodash@^4.17.5:
+ version "4.17.10"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"
+
+longest@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
+
+loose-envify@^1.0.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+lru-cache@^4.0.1:
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c"
+ dependencies:
+ pseudomap "^1.0.2"
+ yallist "^2.1.2"
+
+make-dir@^1.0.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
+ dependencies:
+ pify "^3.0.0"
+
+map-cache@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+
+map-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+ dependencies:
+ object-visit "^1.0.0"
+
+md5.js@^1.3.4:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d"
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+
+mem@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76"
+ dependencies:
+ mimic-fn "^1.0.0"
+
+memory-fs@^0.4.0, memory-fs@~0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
+ dependencies:
+ errno "^0.1.3"
+ readable-stream "^2.0.1"
+
+micromatch@^3.1.4:
+ version "3.1.10"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ braces "^2.3.1"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ extglob "^2.0.4"
+ fragment-cache "^0.2.1"
+ kind-of "^6.0.2"
+ nanomatch "^1.2.9"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.2"
+
+miller-rabin@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
+ dependencies:
+ bn.js "^4.0.0"
+ brorand "^1.0.1"
+
+mimic-fn@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
+
+minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+
+minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+
+minimatch@^3.0.2, minimatch@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@0.0.8:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+
+minimist@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+
+minipass@^2.2.1, minipass@^2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233"
+ dependencies:
+ safe-buffer "^5.1.2"
+ yallist "^3.0.0"
+
+minizlib@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb"
+ dependencies:
+ minipass "^2.2.1"
+
+mixin-deep@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe"
+ dependencies:
+ for-in "^1.0.2"
+ is-extendable "^1.0.1"
+
+mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+ dependencies:
+ minimist "0.0.8"
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+
+nan@^2.9.2:
+ version "2.10.0"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f"
+
+nanomatch@^1.2.9:
+ version "1.2.13"
+ resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ fragment-cache "^0.2.1"
+ is-windows "^1.0.2"
+ kind-of "^6.0.2"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+needle@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d"
+ dependencies:
+ debug "^2.1.2"
+ iconv-lite "^0.4.4"
+ sax "^1.2.4"
+
+neo-async@^2.5.0:
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee"
+
+next-tick@1:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
+
+node-libs-browser@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df"
+ dependencies:
+ assert "^1.1.1"
+ browserify-zlib "^0.2.0"
+ buffer "^4.3.0"
+ console-browserify "^1.1.0"
+ constants-browserify "^1.0.0"
+ crypto-browserify "^3.11.0"
+ domain-browser "^1.1.1"
+ events "^1.0.0"
+ https-browserify "^1.0.0"
+ os-browserify "^0.3.0"
+ path-browserify "0.0.0"
+ process "^0.11.10"
+ punycode "^1.2.4"
+ querystring-es3 "^0.2.0"
+ readable-stream "^2.3.3"
+ stream-browserify "^2.0.1"
+ stream-http "^2.7.2"
+ string_decoder "^1.0.0"
+ timers-browserify "^2.0.4"
+ tty-browserify "0.0.0"
+ url "^0.11.0"
+ util "^0.10.3"
+ vm-browserify "0.0.4"
+
+node-pre-gyp@^0.10.0:
+ version "0.10.3"
+ resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc"
+ dependencies:
+ detect-libc "^1.0.2"
+ mkdirp "^0.5.1"
+ needle "^2.2.1"
+ nopt "^4.0.1"
+ npm-packlist "^1.1.6"
+ npmlog "^4.0.2"
+ rc "^1.2.7"
+ rimraf "^2.6.1"
+ semver "^5.3.0"
+ tar "^4"
+
+nopt@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
+ dependencies:
+ abbrev "1"
+ osenv "^0.1.4"
+
+normalize-package-data@^2.3.2:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f"
+ dependencies:
+ hosted-git-info "^2.1.4"
+ is-builtin-module "^1.0.0"
+ semver "2 || 3 || 4 || 5"
+ validate-npm-package-license "^3.0.1"
+
+normalize-path@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+ dependencies:
+ remove-trailing-separator "^1.0.1"
+
+npm-bundled@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308"
+
+npm-packlist@^1.1.6:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz#84e8c683cbe7867d34b1d357d893ce29e28a02de"
+ dependencies:
+ ignore-walk "^3.0.1"
+ npm-bundled "^1.0.1"
+
+npm-run-path@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
+ dependencies:
+ path-key "^2.0.0"
+
+npmlog@^4.0.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
+ dependencies:
+ are-we-there-yet "~1.1.2"
+ console-control-strings "~1.1.0"
+ gauge "~2.7.3"
+ set-blocking "~2.0.0"
+
+number-is-nan@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+
+object-assign@^4.0.1, object-assign@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+
+object-copy@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+ dependencies:
+ copy-descriptor "^0.1.0"
+ define-property "^0.2.5"
+ kind-of "^3.0.3"
+
+object-keys@^1.0.8:
+ version "1.0.12"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2"
+
+object-visit@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+ dependencies:
+ isobject "^3.0.0"
+
+object.getownpropertydescriptors@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16"
+ dependencies:
+ define-properties "^1.1.2"
+ es-abstract "^1.5.1"
+
+object.pick@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+ dependencies:
+ isobject "^3.0.1"
+
+once@^1.3.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ dependencies:
+ wrappy "1"
+
+os-browserify@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
+
+os-homedir@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+
+os-locale@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2"
+ dependencies:
+ execa "^0.7.0"
+ lcid "^1.0.0"
+ mem "^1.1.0"
+
+os-tmpdir@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+
+osenv@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.0"
+
+p-finally@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+
+p-limit@^1.1.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
+ dependencies:
+ p-try "^1.0.0"
+
+p-locate@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+ dependencies:
+ p-limit "^1.1.0"
+
+p-try@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+
+pako@~1.0.5:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258"
+
+parse-asn1@^5.0.0:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8"
+ dependencies:
+ asn1.js "^4.0.0"
+ browserify-aes "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.0"
+ pbkdf2 "^3.0.3"
+
+parse-json@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+ dependencies:
+ error-ex "^1.2.0"
+
+pascalcase@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+
+path-browserify@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
+
+path-dirname@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
+
+path-exists@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+
+path-key@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+
+path-parse@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1"
+
+path-type@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
+ dependencies:
+ pify "^2.0.0"
+
+pbkdf2@^3.0.3:
+ version "3.0.16"
+ resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c"
+ dependencies:
+ create-hash "^1.1.2"
+ create-hmac "^1.1.4"
+ ripemd160 "^2.0.1"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+pify@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+
+pify@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
+
+pkg-dir@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
+ dependencies:
+ find-up "^2.1.0"
+
+posix-character-classes@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+
+private@^0.1.6:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
+
+process-nextick-args@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
+
+process@^0.11.10:
+ version "0.11.10"
+ resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+
+prr@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
+
+pseudomap@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+
+public-encrypt@^4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994"
+ dependencies:
+ bn.js "^4.1.0"
+ browserify-rsa "^4.0.0"
+ create-hash "^1.1.0"
+ parse-asn1 "^5.0.0"
+ randombytes "^2.0.1"
+
+punycode@1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+
+punycode@^1.2.4:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+
+punycode@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+
+querystring-es3@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
+
+querystring@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80"
+ dependencies:
+ safe-buffer "^5.1.0"
+
+randomfill@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
+ dependencies:
+ randombytes "^2.0.5"
+ safe-buffer "^5.1.0"
+
+rc@^1.2.7:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
+ dependencies:
+ deep-extend "^0.6.0"
+ ini "~1.3.0"
+ minimist "^1.2.0"
+ strip-json-comments "~2.0.1"
+
+read-pkg-up@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
+ dependencies:
+ find-up "^2.0.0"
+ read-pkg "^2.0.0"
+
+read-pkg@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
+ dependencies:
+ load-json-file "^2.0.0"
+ normalize-package-data "^2.3.2"
+ path-type "^2.0.0"
+
+readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.3.3, readable-stream@^2.3.6:
+ version "2.3.6"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.3"
+ isarray "~1.0.0"
+ process-nextick-args "~2.0.0"
+ safe-buffer "~5.1.1"
+ string_decoder "~1.1.1"
+ util-deprecate "~1.0.1"
+
+readdirp@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"
+ dependencies:
+ graceful-fs "^4.1.2"
+ minimatch "^3.0.2"
+ readable-stream "^2.0.2"
+ set-immediate-shim "^1.0.1"
+
+regenerate-unicode-properties@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz#107405afcc4a190ec5ed450ecaa00ed0cafa7a4c"
+ dependencies:
+ regenerate "^1.4.0"
+
+regenerate@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11"
+
+regenerator-transform@^0.13.3:
+ version "0.13.3"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.3.tgz#264bd9ff38a8ce24b06e0636496b2c856b57bcbb"
+ dependencies:
+ private "^0.1.6"
+
+regex-not@^1.0.0, regex-not@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+ dependencies:
+ extend-shallow "^3.0.2"
+ safe-regex "^1.1.0"
+
+regexpu-core@^4.1.3, regexpu-core@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.2.0.tgz#a3744fa03806cffe146dea4421a3e73bdcc47b1d"
+ dependencies:
+ regenerate "^1.4.0"
+ regenerate-unicode-properties "^7.0.0"
+ regjsgen "^0.4.0"
+ regjsparser "^0.3.0"
+ unicode-match-property-ecmascript "^1.0.4"
+ unicode-match-property-value-ecmascript "^1.0.2"
+
+regjsgen@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.4.0.tgz#c1eb4c89a209263f8717c782591523913ede2561"
+
+regjsparser@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.3.0.tgz#3c326da7fcfd69fa0d332575a41c8c0cdf588c96"
+ dependencies:
+ jsesc "~0.5.0"
+
+remove-trailing-separator@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+
+repeat-element@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
+
+repeat-string@^1.5.2, repeat-string@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+
+require-main-filename@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
+
+resolve-url@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+
+resolve@^1.3.2:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26"
+ dependencies:
+ path-parse "^1.0.5"
+
+ret@~0.1.10:
+ version "0.1.15"
+ resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+
+right-align@^0.1.1:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
+ dependencies:
+ align-text "^0.1.1"
+
+rimraf@^2.6.1:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
+ dependencies:
+ glob "^7.0.5"
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+
+safe-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+ dependencies:
+ ret "~0.1.10"
+
+"safer-buffer@>= 2.1.2 < 3":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+
+sax@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+
+"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
+
+set-blocking@^2.0.0, set-blocking@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+
+set-immediate-shim@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
+
+set-value@^0.4.3:
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.1"
+ to-object-path "^0.3.0"
+
+set-value@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274"
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.3"
+ split-string "^3.0.1"
+
+setimmediate@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+
+sha.js@^2.4.0, sha.js@^2.4.8:
+ version "2.4.11"
+ resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+shebang-command@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+ dependencies:
+ shebang-regex "^1.0.0"
+
+shebang-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+
+signal-exit@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
+
+snapdragon-node@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+ dependencies:
+ define-property "^1.0.0"
+ isobject "^3.0.0"
+ snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+ dependencies:
+ kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
+ dependencies:
+ base "^0.11.1"
+ debug "^2.2.0"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ map-cache "^0.2.2"
+ source-map "^0.5.6"
+ source-map-resolve "^0.5.0"
+ use "^3.1.0"
+
+source-list-map@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085"
+
+source-map-resolve@^0.5.0:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259"
+ dependencies:
+ atob "^2.1.1"
+ decode-uri-component "^0.2.0"
+ resolve-url "^0.2.1"
+ source-map-url "^0.4.0"
+ urix "^0.1.0"
+
+source-map-url@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
+
+source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+
+source-map@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+
+spdx-correct@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82"
+ dependencies:
+ spdx-expression-parse "^3.0.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9"
+
+spdx-expression-parse@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0"
+ dependencies:
+ spdx-exceptions "^2.1.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87"
+
+split-string@^3.0.1, split-string@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+ dependencies:
+ extend-shallow "^3.0.0"
+
+static-extend@^0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+ dependencies:
+ define-property "^0.2.5"
+ object-copy "^0.1.0"
+
+stream-browserify@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db"
+ dependencies:
+ inherits "~2.0.1"
+ readable-stream "^2.0.2"
+
+stream-http@^2.7.2:
+ version "2.8.3"
+ resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc"
+ dependencies:
+ builtin-status-codes "^3.0.0"
+ inherits "^2.0.1"
+ readable-stream "^2.3.6"
+ to-arraybuffer "^1.0.0"
+ xtend "^4.0.0"
+
+string-width@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ strip-ansi "^3.0.0"
+
+"string-width@^1.0.2 || 2", string-width@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^4.0.0"
+
+string_decoder@^1.0.0, string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ dependencies:
+ safe-buffer "~5.1.0"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+ dependencies:
+ ansi-regex "^2.0.0"
+
+strip-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+ dependencies:
+ ansi-regex "^3.0.0"
+
+strip-bom@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+
+strip-eof@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
+
+strip-json-comments@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+
+supports-color@^4.2.1:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b"
+ dependencies:
+ has-flag "^2.0.0"
+
+supports-color@^5.3.0:
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54"
+ dependencies:
+ has-flag "^3.0.0"
+
+tapable@^0.2.7:
+ version "0.2.8"
+ resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22"
+
+tar@^4:
+ version "4.4.4"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd"
+ dependencies:
+ chownr "^1.0.1"
+ fs-minipass "^1.2.5"
+ minipass "^2.3.3"
+ minizlib "^1.1.0"
+ mkdirp "^0.5.0"
+ safe-buffer "^5.1.2"
+ yallist "^3.0.2"
+
+timers-browserify@^2.0.4:
+ version "2.0.10"
+ resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae"
+ dependencies:
+ setimmediate "^1.0.4"
+
+to-arraybuffer@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
+
+to-fast-properties@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
+
+to-object-path@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+ dependencies:
+ kind-of "^3.0.2"
+
+to-regex-range@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+ dependencies:
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+
+to-regex@^3.0.1, to-regex@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+ dependencies:
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ regex-not "^1.0.2"
+ safe-regex "^1.1.0"
+
+trim-right@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
+
+tty-browserify@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
+
+uglify-js@^2.8.29:
+ version "2.8.29"
+ resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd"
+ dependencies:
+ source-map "~0.5.1"
+ yargs "~3.10.0"
+ optionalDependencies:
+ uglify-to-browserify "~1.0.0"
+
+uglify-to-browserify@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
+
+uglifyjs-webpack-plugin@^0.4.6:
+ version "0.4.6"
+ resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz#b951f4abb6bd617e66f63eb891498e391763e309"
+ dependencies:
+ source-map "^0.5.6"
+ uglify-js "^2.8.29"
+ webpack-sources "^1.0.1"
+
+unicode-canonical-property-names-ecmascript@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818"
+
+unicode-match-property-ecmascript@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c"
+ dependencies:
+ unicode-canonical-property-names-ecmascript "^1.0.4"
+ unicode-property-aliases-ecmascript "^1.0.4"
+
+unicode-match-property-value-ecmascript@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz#9f1dc76926d6ccf452310564fd834ace059663d4"
+
+unicode-property-aliases-ecmascript@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz#5a533f31b4317ea76f17d807fa0d116546111dd0"
+
+union-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"
+ dependencies:
+ arr-union "^3.1.0"
+ get-value "^2.0.6"
+ is-extendable "^0.1.1"
+ set-value "^0.4.3"
+
+unset-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+ dependencies:
+ has-value "^0.3.1"
+ isobject "^3.0.0"
+
+upath@^1.0.5:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd"
+
+uri-js@^4.2.1:
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"
+ dependencies:
+ punycode "^2.1.0"
+
+urix@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+
+url@^0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
+ dependencies:
+ punycode "1.3.2"
+ querystring "0.2.0"
+
+use@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
+
+util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+
+util.promisify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030"
+ dependencies:
+ define-properties "^1.1.2"
+ object.getownpropertydescriptors "^2.0.3"
+
+util@0.10.3:
+ version "0.10.3"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
+ dependencies:
+ inherits "2.0.1"
+
+util@^0.10.3:
+ version "0.10.4"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901"
+ dependencies:
+ inherits "2.0.3"
+
+validate-npm-package-license@^3.0.1:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338"
+ dependencies:
+ spdx-correct "^3.0.0"
+ spdx-expression-parse "^3.0.0"
+
+vm-browserify@0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
+ dependencies:
+ indexof "0.0.1"
+
+watchpack@^1.4.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00"
+ dependencies:
+ chokidar "^2.0.2"
+ graceful-fs "^4.1.2"
+ neo-async "^2.5.0"
+
+webpack-sources@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54"
+ dependencies:
+ source-list-map "^2.0.0"
+ source-map "~0.6.1"
+
+webpack@3:
+ version "3.12.0"
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.12.0.tgz#3f9e34360370602fcf639e97939db486f4ec0d74"
+ dependencies:
+ acorn "^5.0.0"
+ acorn-dynamic-import "^2.0.0"
+ ajv "^6.1.0"
+ ajv-keywords "^3.1.0"
+ async "^2.1.2"
+ enhanced-resolve "^3.4.0"
+ escope "^3.6.0"
+ interpret "^1.0.0"
+ json-loader "^0.5.4"
+ json5 "^0.5.1"
+ loader-runner "^2.3.0"
+ loader-utils "^1.1.0"
+ memory-fs "~0.4.1"
+ mkdirp "~0.5.0"
+ node-libs-browser "^2.0.0"
+ source-map "^0.5.3"
+ supports-color "^4.2.1"
+ tapable "^0.2.7"
+ uglifyjs-webpack-plugin "^0.4.6"
+ watchpack "^1.4.0"
+ webpack-sources "^1.0.1"
+ yargs "^8.0.2"
+
+which-module@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
+
+which@^1.2.9:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+ dependencies:
+ isexe "^2.0.0"
+
+wide-align@^1.1.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
+ dependencies:
+ string-width "^1.0.2 || 2"
+
+window-size@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
+
+wordwrap@0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
+
+wrap-ansi@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+
+xtend@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
+
+y18n@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
+
+yallist@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+
+yallist@^3.0.0, yallist@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9"
+
+yargs-parser@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9"
+ dependencies:
+ camelcase "^4.1.0"
+
+yargs@^8.0.2:
+ version "8.0.2"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360"
+ dependencies:
+ camelcase "^4.1.0"
+ cliui "^3.2.0"
+ decamelize "^1.1.1"
+ get-caller-file "^1.0.1"
+ os-locale "^2.0.0"
+ read-pkg-up "^2.0.0"
+ require-directory "^2.1.1"
+ require-main-filename "^1.0.1"
+ set-blocking "^2.0.0"
+ string-width "^2.0.0"
+ which-module "^2.0.0"
+ y18n "^3.2.1"
+ yargs-parser "^7.0.0"
+
+yargs@~3.10.0:
+ version "3.10.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
+ dependencies:
+ camelcase "^1.0.2"
+ cliui "^2.1.0"
+ decamelize "^1.0.0"
+ window-size "0.1.0"
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack3/index.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack3/index.js
new file mode 100644
index 0000000000..9ba59ee971
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack3/index.js
@@ -0,0 +1,65 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+const path = require("path");
+const util = require("util");
+const _ = require("lodash");
+const webpack = require("webpack");
+
+const TARGET_NAME = "webpack3";
+
+module.exports = exports = async function(tests, dirname) {
+ const fixtures = [];
+ for (const [name, input] of tests) {
+ if (/babel-/.test(name)) {
+ continue;
+ }
+
+ const testFnName = _.camelCase(`${TARGET_NAME}-${name}`);
+ const evalMaps = name.match(/-eval/);
+
+ console.log(`Building ${TARGET_NAME} test ${name}`);
+
+ const scriptPath = path.join(dirname, "output", TARGET_NAME, `${name}.js`);
+ await util.promisify(webpack)({
+ context: path.dirname(input),
+ entry: `./${path.basename(input)}`,
+ output: {
+ path: path.dirname(scriptPath),
+ filename: path.basename(scriptPath),
+
+ devtoolModuleFilenameTemplate: `${TARGET_NAME}://./${name}/[resource-path]`,
+
+ libraryTarget: "var",
+ library: testFnName,
+ libraryExport: "default"
+ },
+ devtool: evalMaps ? "eval-source-map" : "source-map",
+ module: {
+ loaders: [
+ {
+ test: /\.tsx?$/,
+ exclude: /node_modules/,
+ loader: require.resolve("ts-loader"),
+ options: {}
+ }
+ ].filter(Boolean)
+ }
+ });
+
+ fixtures.push({
+ name,
+ testFnName,
+ scriptPath,
+ assets: [scriptPath, evalMaps ? null : `${scriptPath}.map`].filter(
+ Boolean
+ )
+ });
+ }
+
+ return {
+ target: TARGET_NAME,
+ fixtures
+ };
+};
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack3/package.json b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack3/package.json
new file mode 100644
index 0000000000..a281868c34
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack3/package.json
@@ -0,0 +1,10 @@
+{
+ "name": "sourcemapped-webpack3",
+ "private": true,
+ "dependencies": {
+ "lodash": "^4.17.10",
+ "ts-loader": "3",
+ "typescript": "^2.9.2",
+ "webpack": "3"
+ }
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack3/yarn.lock b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack3/yarn.lock
new file mode 100644
index 0000000000..26ec737bd3
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack3/yarn.lock
@@ -0,0 +1,2202 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+abbrev@1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+
+acorn-dynamic-import@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4"
+ dependencies:
+ acorn "^4.0.3"
+
+acorn@^4.0.3:
+ version "4.0.13"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
+
+acorn@^5.0.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8"
+
+ajv-keywords@^3.1.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a"
+
+ajv@^6.1.0:
+ version "6.5.2"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.2.tgz#678495f9b82f7cca6be248dd92f59bff5e1f4360"
+ dependencies:
+ fast-deep-equal "^2.0.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.1"
+
+align-text@^0.1.1, align-text@^0.1.3:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
+ dependencies:
+ kind-of "^3.0.2"
+ longest "^1.0.1"
+ repeat-string "^1.5.2"
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+
+ansi-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+
+ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ dependencies:
+ color-convert "^1.9.0"
+
+anymatch@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
+ dependencies:
+ micromatch "^3.1.4"
+ normalize-path "^2.1.1"
+
+aproba@^1.0.3:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
+
+are-we-there-yet@~1.1.2:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
+ dependencies:
+ delegates "^1.0.0"
+ readable-stream "^2.0.6"
+
+arr-diff@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+
+arr-flatten@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+
+arr-union@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+
+array-unique@^0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+
+asn1.js@^4.0.0:
+ version "4.10.1"
+ resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"
+ dependencies:
+ bn.js "^4.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+assert@^1.1.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91"
+ dependencies:
+ util "0.10.3"
+
+assign-symbols@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+
+async-each@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
+
+async@^2.1.2:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610"
+ dependencies:
+ lodash "^4.17.10"
+
+atob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a"
+
+balanced-match@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+
+base64-js@^1.0.2:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3"
+
+base@^0.11.1:
+ version "0.11.2"
+ resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+ dependencies:
+ cache-base "^1.0.1"
+ class-utils "^0.3.5"
+ component-emitter "^1.2.1"
+ define-property "^1.0.0"
+ isobject "^3.0.1"
+ mixin-deep "^1.2.0"
+ pascalcase "^0.1.1"
+
+big.js@^3.1.3:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
+
+binary-extensions@^1.0.0:
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205"
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
+ version "4.11.8"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+braces@^2.3.0, braces@^2.3.1:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+ dependencies:
+ arr-flatten "^1.1.0"
+ array-unique "^0.3.2"
+ extend-shallow "^2.0.1"
+ fill-range "^4.0.0"
+ isobject "^3.0.1"
+ repeat-element "^1.1.2"
+ snapdragon "^0.8.1"
+ snapdragon-node "^2.0.1"
+ split-string "^3.0.2"
+ to-regex "^3.0.1"
+
+brorand@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
+ dependencies:
+ buffer-xor "^1.0.3"
+ cipher-base "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.3"
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+browserify-cipher@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
+ dependencies:
+ browserify-aes "^1.0.4"
+ browserify-des "^1.0.0"
+ evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c"
+ dependencies:
+ cipher-base "^1.0.1"
+ des.js "^1.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+browserify-rsa@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
+ dependencies:
+ bn.js "^4.1.0"
+ randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
+ dependencies:
+ bn.js "^4.1.1"
+ browserify-rsa "^4.0.0"
+ create-hash "^1.1.0"
+ create-hmac "^1.1.2"
+ elliptic "^6.0.0"
+ inherits "^2.0.1"
+ parse-asn1 "^5.0.0"
+
+browserify-zlib@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
+ dependencies:
+ pako "~1.0.5"
+
+buffer-xor@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+
+buffer@^4.3.0:
+ version "4.9.1"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298"
+ dependencies:
+ base64-js "^1.0.2"
+ ieee754 "^1.1.4"
+ isarray "^1.0.0"
+
+builtin-modules@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
+
+builtin-status-codes@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
+
+cache-base@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+ dependencies:
+ collection-visit "^1.0.0"
+ component-emitter "^1.2.1"
+ get-value "^2.0.6"
+ has-value "^1.0.0"
+ isobject "^3.0.1"
+ set-value "^2.0.0"
+ to-object-path "^0.3.0"
+ union-value "^1.0.0"
+ unset-value "^1.0.0"
+
+camelcase@^1.0.2:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
+
+camelcase@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
+
+center-align@^0.1.1:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
+ dependencies:
+ align-text "^0.1.3"
+ lazy-cache "^1.0.3"
+
+chalk@^2.3.0:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e"
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chokidar@^2.0.2:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26"
+ dependencies:
+ anymatch "^2.0.0"
+ async-each "^1.0.0"
+ braces "^2.3.0"
+ glob-parent "^3.1.0"
+ inherits "^2.0.1"
+ is-binary-path "^1.0.0"
+ is-glob "^4.0.0"
+ lodash.debounce "^4.0.8"
+ normalize-path "^2.1.1"
+ path-is-absolute "^1.0.0"
+ readdirp "^2.0.0"
+ upath "^1.0.5"
+ optionalDependencies:
+ fsevents "^1.2.2"
+
+chownr@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+class-utils@^0.3.5:
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+ dependencies:
+ arr-union "^3.1.0"
+ define-property "^0.2.5"
+ isobject "^3.0.0"
+ static-extend "^0.1.1"
+
+cliui@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
+ dependencies:
+ center-align "^0.1.1"
+ right-align "^0.1.1"
+ wordwrap "0.0.2"
+
+cliui@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wrap-ansi "^2.0.0"
+
+code-point-at@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+
+collection-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+ dependencies:
+ map-visit "^1.0.0"
+ object-visit "^1.0.0"
+
+color-convert@^1.9.0:
+ version "1.9.2"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147"
+ dependencies:
+ color-name "1.1.1"
+
+color-name@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689"
+
+component-emitter@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+
+console-browserify@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
+ dependencies:
+ date-now "^0.1.4"
+
+console-control-strings@^1.0.0, console-control-strings@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+
+constants-browserify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
+
+copy-descriptor@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+
+core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+
+create-ecdh@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff"
+ dependencies:
+ bn.js "^4.1.0"
+ elliptic "^6.0.0"
+
+create-hash@^1.1.0, create-hash@^1.1.2:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
+ dependencies:
+ cipher-base "^1.0.1"
+ inherits "^2.0.1"
+ md5.js "^1.3.4"
+ ripemd160 "^2.0.1"
+ sha.js "^2.4.0"
+
+create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
+ dependencies:
+ cipher-base "^1.0.3"
+ create-hash "^1.1.0"
+ inherits "^2.0.1"
+ ripemd160 "^2.0.0"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+cross-spawn@^5.0.1:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
+ dependencies:
+ lru-cache "^4.0.1"
+ shebang-command "^1.2.0"
+ which "^1.2.9"
+
+crypto-browserify@^3.11.0:
+ version "3.12.0"
+ resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
+ dependencies:
+ browserify-cipher "^1.0.0"
+ browserify-sign "^4.0.0"
+ create-ecdh "^4.0.0"
+ create-hash "^1.1.0"
+ create-hmac "^1.1.0"
+ diffie-hellman "^5.0.0"
+ inherits "^2.0.1"
+ pbkdf2 "^3.0.3"
+ public-encrypt "^4.0.0"
+ randombytes "^2.0.0"
+ randomfill "^1.0.3"
+
+d@1:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f"
+ dependencies:
+ es5-ext "^0.10.9"
+
+date-now@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
+
+debug@^2.1.2, debug@^2.2.0, debug@^2.3.3:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ dependencies:
+ ms "2.0.0"
+
+decamelize@^1.0.0, decamelize@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+
+decode-uri-component@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+
+deep-extend@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
+
+define-property@^0.2.5:
+ version "0.2.5"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+ dependencies:
+ is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+ dependencies:
+ is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+ dependencies:
+ is-descriptor "^1.0.2"
+ isobject "^3.0.1"
+
+delegates@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+
+des.js@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
+ dependencies:
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+detect-libc@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
+
+diffie-hellman@^5.0.0:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
+ dependencies:
+ bn.js "^4.1.0"
+ miller-rabin "^4.0.0"
+ randombytes "^2.0.0"
+
+domain-browser@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
+
+elliptic@^6.0.0:
+ version "6.4.0"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df"
+ dependencies:
+ bn.js "^4.4.0"
+ brorand "^1.0.1"
+ hash.js "^1.0.0"
+ hmac-drbg "^1.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.0"
+
+emojis-list@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
+
+enhanced-resolve@^3.0.0, enhanced-resolve@^3.4.0:
+ version "3.4.1"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e"
+ dependencies:
+ graceful-fs "^4.1.2"
+ memory-fs "^0.4.0"
+ object-assign "^4.0.1"
+ tapable "^0.2.7"
+
+errno@^0.1.3:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
+ dependencies:
+ prr "~1.0.1"
+
+error-ex@^1.2.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+ dependencies:
+ is-arrayish "^0.2.1"
+
+es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14:
+ version "0.10.45"
+ resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.45.tgz#0bfdf7b473da5919d5adf3bd25ceb754fccc3653"
+ dependencies:
+ es6-iterator "~2.0.3"
+ es6-symbol "~3.1.1"
+ next-tick "1"
+
+es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@~2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
+ dependencies:
+ d "1"
+ es5-ext "^0.10.35"
+ es6-symbol "^3.1.1"
+
+es6-map@^0.1.3:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0"
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+ es6-iterator "~2.0.1"
+ es6-set "~0.1.5"
+ es6-symbol "~3.1.1"
+ event-emitter "~0.3.5"
+
+es6-set@~0.1.5:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1"
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+ es6-iterator "~2.0.1"
+ es6-symbol "3.1.1"
+ event-emitter "~0.3.5"
+
+es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+
+es6-weak-map@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f"
+ dependencies:
+ d "1"
+ es5-ext "^0.10.14"
+ es6-iterator "^2.0.1"
+ es6-symbol "^3.1.1"
+
+escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+
+escope@^3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3"
+ dependencies:
+ es6-map "^0.1.3"
+ es6-weak-map "^2.0.1"
+ esrecurse "^4.1.0"
+ estraverse "^4.1.1"
+
+esrecurse@^4.1.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
+ dependencies:
+ estraverse "^4.1.0"
+
+estraverse@^4.1.0, estraverse@^4.1.1:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
+
+event-emitter@~0.3.5:
+ version "0.3.5"
+ resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+
+events@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
+
+evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+ dependencies:
+ md5.js "^1.3.4"
+ safe-buffer "^5.1.1"
+
+execa@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
+ dependencies:
+ cross-spawn "^5.0.1"
+ get-stream "^3.0.0"
+ is-stream "^1.1.0"
+ npm-run-path "^2.0.0"
+ p-finally "^1.0.0"
+ signal-exit "^3.0.0"
+ strip-eof "^1.0.0"
+
+expand-brackets@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+ dependencies:
+ debug "^2.3.3"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ posix-character-classes "^0.1.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+extend-shallow@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+ dependencies:
+ is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+ dependencies:
+ assign-symbols "^1.0.0"
+ is-extendable "^1.0.1"
+
+extglob@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+ dependencies:
+ array-unique "^0.3.2"
+ define-property "^1.0.0"
+ expand-brackets "^2.1.4"
+ extend-shallow "^2.0.1"
+ fragment-cache "^0.2.1"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+fast-deep-equal@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
+
+fill-range@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+ to-regex-range "^2.1.0"
+
+find-up@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+ dependencies:
+ locate-path "^2.0.0"
+
+for-in@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+
+fragment-cache@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+ dependencies:
+ map-cache "^0.2.2"
+
+fs-minipass@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d"
+ dependencies:
+ minipass "^2.2.1"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+
+fsevents@^1.2.2:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426"
+ dependencies:
+ nan "^2.9.2"
+ node-pre-gyp "^0.10.0"
+
+gauge@~2.7.3:
+ version "2.7.4"
+ resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
+ dependencies:
+ aproba "^1.0.3"
+ console-control-strings "^1.0.0"
+ has-unicode "^2.0.0"
+ object-assign "^4.1.0"
+ signal-exit "^3.0.0"
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wide-align "^1.1.0"
+
+get-caller-file@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
+
+get-stream@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+
+get-value@^2.0.3, get-value@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+
+glob-parent@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
+ dependencies:
+ is-glob "^3.1.0"
+ path-dirname "^1.0.0"
+
+glob@^7.0.5:
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+graceful-fs@^4.1.2:
+ version "4.1.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
+
+has-flag@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51"
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+
+has-unicode@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+
+has-value@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+ dependencies:
+ get-value "^2.0.3"
+ has-values "^0.1.4"
+ isobject "^2.0.0"
+
+has-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+ dependencies:
+ get-value "^2.0.6"
+ has-values "^1.0.0"
+ isobject "^3.0.0"
+
+has-values@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+
+has-values@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+ dependencies:
+ is-number "^3.0.0"
+ kind-of "^4.0.0"
+
+hash-base@^3.0.0:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+hash.js@^1.0.0, hash.js@^1.0.3:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.5.tgz#e38ab4b85dfb1e0c40fe9265c0e9b54854c23812"
+ dependencies:
+ inherits "^2.0.3"
+ minimalistic-assert "^1.0.1"
+
+hmac-drbg@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+ dependencies:
+ hash.js "^1.0.3"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.1"
+
+hosted-git-info@^2.1.4:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047"
+
+https-browserify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
+
+iconv-lite@^0.4.4:
+ version "0.4.23"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63"
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+ieee754@^1.1.4:
+ version "1.1.12"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b"
+
+ignore-walk@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8"
+ dependencies:
+ minimatch "^3.0.4"
+
+indexof@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+
+inherits@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
+
+ini@~1.3.0:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
+
+interpret@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614"
+
+invert-kv@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
+
+is-accessor-descriptor@^0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-accessor-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
+ dependencies:
+ kind-of "^6.0.0"
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+
+is-binary-path@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+ dependencies:
+ binary-extensions "^1.0.0"
+
+is-buffer@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+
+is-builtin-module@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
+ dependencies:
+ builtin-modules "^1.0.0"
+
+is-data-descriptor@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-data-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
+ dependencies:
+ kind-of "^6.0.0"
+
+is-descriptor@^0.1.0:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
+ dependencies:
+ is-accessor-descriptor "^0.1.6"
+ is-data-descriptor "^0.1.4"
+ kind-of "^5.0.0"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
+ dependencies:
+ is-accessor-descriptor "^1.0.0"
+ is-data-descriptor "^1.0.0"
+ kind-of "^6.0.2"
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+
+is-extendable@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+ dependencies:
+ is-plain-object "^2.0.4"
+
+is-extglob@^2.1.0, is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+
+is-fullwidth-code-point@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+
+is-glob@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
+ dependencies:
+ is-extglob "^2.1.0"
+
+is-glob@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0"
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-number@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+ dependencies:
+ isobject "^3.0.1"
+
+is-stream@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+
+is-windows@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+
+isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+
+isobject@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+ dependencies:
+ isarray "1.0.0"
+
+isobject@^3.0.0, isobject@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+
+json-loader@^0.5.4:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d"
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+
+json5@^0.5.0, json5@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
+
+kind-of@^6.0.0, kind-of@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
+
+lazy-cache@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
+
+lcid@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
+ dependencies:
+ invert-kv "^1.0.0"
+
+load-json-file@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
+ dependencies:
+ graceful-fs "^4.1.2"
+ parse-json "^2.2.0"
+ pify "^2.0.0"
+ strip-bom "^3.0.0"
+
+loader-runner@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2"
+
+loader-utils@^1.0.2, loader-utils@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd"
+ dependencies:
+ big.js "^3.1.3"
+ emojis-list "^2.0.0"
+ json5 "^0.5.0"
+
+locate-path@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+ dependencies:
+ p-locate "^2.0.0"
+ path-exists "^3.0.0"
+
+lodash.debounce@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
+
+lodash@^4.17.10:
+ version "4.17.10"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"
+
+longest@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
+
+lru-cache@^4.0.1:
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c"
+ dependencies:
+ pseudomap "^1.0.2"
+ yallist "^2.1.2"
+
+map-cache@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+
+map-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+ dependencies:
+ object-visit "^1.0.0"
+
+md5.js@^1.3.4:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d"
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+
+mem@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76"
+ dependencies:
+ mimic-fn "^1.0.0"
+
+memory-fs@^0.4.0, memory-fs@~0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
+ dependencies:
+ errno "^0.1.3"
+ readable-stream "^2.0.1"
+
+micromatch@^3.1.4:
+ version "3.1.10"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ braces "^2.3.1"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ extglob "^2.0.4"
+ fragment-cache "^0.2.1"
+ kind-of "^6.0.2"
+ nanomatch "^1.2.9"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.2"
+
+miller-rabin@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
+ dependencies:
+ bn.js "^4.0.0"
+ brorand "^1.0.1"
+
+mimic-fn@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
+
+minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+
+minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+
+minimatch@^3.0.2, minimatch@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@0.0.8:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+
+minimist@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+
+minipass@^2.2.1, minipass@^2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233"
+ dependencies:
+ safe-buffer "^5.1.2"
+ yallist "^3.0.0"
+
+minizlib@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb"
+ dependencies:
+ minipass "^2.2.1"
+
+mixin-deep@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe"
+ dependencies:
+ for-in "^1.0.2"
+ is-extendable "^1.0.1"
+
+mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+ dependencies:
+ minimist "0.0.8"
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+
+nan@^2.9.2:
+ version "2.10.0"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f"
+
+nanomatch@^1.2.9:
+ version "1.2.13"
+ resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ fragment-cache "^0.2.1"
+ is-windows "^1.0.2"
+ kind-of "^6.0.2"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+needle@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d"
+ dependencies:
+ debug "^2.1.2"
+ iconv-lite "^0.4.4"
+ sax "^1.2.4"
+
+neo-async@^2.5.0:
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee"
+
+next-tick@1:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
+
+node-libs-browser@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df"
+ dependencies:
+ assert "^1.1.1"
+ browserify-zlib "^0.2.0"
+ buffer "^4.3.0"
+ console-browserify "^1.1.0"
+ constants-browserify "^1.0.0"
+ crypto-browserify "^3.11.0"
+ domain-browser "^1.1.1"
+ events "^1.0.0"
+ https-browserify "^1.0.0"
+ os-browserify "^0.3.0"
+ path-browserify "0.0.0"
+ process "^0.11.10"
+ punycode "^1.2.4"
+ querystring-es3 "^0.2.0"
+ readable-stream "^2.3.3"
+ stream-browserify "^2.0.1"
+ stream-http "^2.7.2"
+ string_decoder "^1.0.0"
+ timers-browserify "^2.0.4"
+ tty-browserify "0.0.0"
+ url "^0.11.0"
+ util "^0.10.3"
+ vm-browserify "0.0.4"
+
+node-pre-gyp@^0.10.0:
+ version "0.10.3"
+ resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc"
+ dependencies:
+ detect-libc "^1.0.2"
+ mkdirp "^0.5.1"
+ needle "^2.2.1"
+ nopt "^4.0.1"
+ npm-packlist "^1.1.6"
+ npmlog "^4.0.2"
+ rc "^1.2.7"
+ rimraf "^2.6.1"
+ semver "^5.3.0"
+ tar "^4"
+
+nopt@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
+ dependencies:
+ abbrev "1"
+ osenv "^0.1.4"
+
+normalize-package-data@^2.3.2:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f"
+ dependencies:
+ hosted-git-info "^2.1.4"
+ is-builtin-module "^1.0.0"
+ semver "2 || 3 || 4 || 5"
+ validate-npm-package-license "^3.0.1"
+
+normalize-path@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+ dependencies:
+ remove-trailing-separator "^1.0.1"
+
+npm-bundled@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308"
+
+npm-packlist@^1.1.6:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz#84e8c683cbe7867d34b1d357d893ce29e28a02de"
+ dependencies:
+ ignore-walk "^3.0.1"
+ npm-bundled "^1.0.1"
+
+npm-run-path@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
+ dependencies:
+ path-key "^2.0.0"
+
+npmlog@^4.0.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
+ dependencies:
+ are-we-there-yet "~1.1.2"
+ console-control-strings "~1.1.0"
+ gauge "~2.7.3"
+ set-blocking "~2.0.0"
+
+number-is-nan@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+
+object-assign@^4.0.1, object-assign@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+
+object-copy@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+ dependencies:
+ copy-descriptor "^0.1.0"
+ define-property "^0.2.5"
+ kind-of "^3.0.3"
+
+object-visit@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+ dependencies:
+ isobject "^3.0.0"
+
+object.pick@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+ dependencies:
+ isobject "^3.0.1"
+
+once@^1.3.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ dependencies:
+ wrappy "1"
+
+os-browserify@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
+
+os-homedir@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+
+os-locale@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2"
+ dependencies:
+ execa "^0.7.0"
+ lcid "^1.0.0"
+ mem "^1.1.0"
+
+os-tmpdir@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+
+osenv@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.0"
+
+p-finally@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+
+p-limit@^1.1.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
+ dependencies:
+ p-try "^1.0.0"
+
+p-locate@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+ dependencies:
+ p-limit "^1.1.0"
+
+p-try@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+
+pako@~1.0.5:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258"
+
+parse-asn1@^5.0.0:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8"
+ dependencies:
+ asn1.js "^4.0.0"
+ browserify-aes "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.0"
+ pbkdf2 "^3.0.3"
+
+parse-json@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+ dependencies:
+ error-ex "^1.2.0"
+
+pascalcase@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+
+path-browserify@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
+
+path-dirname@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
+
+path-exists@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+
+path-key@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+
+path-type@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
+ dependencies:
+ pify "^2.0.0"
+
+pbkdf2@^3.0.3:
+ version "3.0.16"
+ resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c"
+ dependencies:
+ create-hash "^1.1.2"
+ create-hmac "^1.1.4"
+ ripemd160 "^2.0.1"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+pify@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+
+posix-character-classes@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+
+process-nextick-args@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
+
+process@^0.11.10:
+ version "0.11.10"
+ resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+
+prr@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
+
+pseudomap@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+
+public-encrypt@^4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994"
+ dependencies:
+ bn.js "^4.1.0"
+ browserify-rsa "^4.0.0"
+ create-hash "^1.1.0"
+ parse-asn1 "^5.0.0"
+ randombytes "^2.0.1"
+
+punycode@1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+
+punycode@^1.2.4:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+
+punycode@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+
+querystring-es3@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
+
+querystring@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80"
+ dependencies:
+ safe-buffer "^5.1.0"
+
+randomfill@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
+ dependencies:
+ randombytes "^2.0.5"
+ safe-buffer "^5.1.0"
+
+rc@^1.2.7:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
+ dependencies:
+ deep-extend "^0.6.0"
+ ini "~1.3.0"
+ minimist "^1.2.0"
+ strip-json-comments "~2.0.1"
+
+read-pkg-up@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
+ dependencies:
+ find-up "^2.0.0"
+ read-pkg "^2.0.0"
+
+read-pkg@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
+ dependencies:
+ load-json-file "^2.0.0"
+ normalize-package-data "^2.3.2"
+ path-type "^2.0.0"
+
+readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.3.3, readable-stream@^2.3.6:
+ version "2.3.6"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.3"
+ isarray "~1.0.0"
+ process-nextick-args "~2.0.0"
+ safe-buffer "~5.1.1"
+ string_decoder "~1.1.1"
+ util-deprecate "~1.0.1"
+
+readdirp@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"
+ dependencies:
+ graceful-fs "^4.1.2"
+ minimatch "^3.0.2"
+ readable-stream "^2.0.2"
+ set-immediate-shim "^1.0.1"
+
+regex-not@^1.0.0, regex-not@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+ dependencies:
+ extend-shallow "^3.0.2"
+ safe-regex "^1.1.0"
+
+remove-trailing-separator@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+
+repeat-element@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
+
+repeat-string@^1.5.2, repeat-string@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+
+require-main-filename@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
+
+resolve-url@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+
+ret@~0.1.10:
+ version "0.1.15"
+ resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+
+right-align@^0.1.1:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
+ dependencies:
+ align-text "^0.1.1"
+
+rimraf@^2.6.1:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
+ dependencies:
+ glob "^7.0.5"
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+
+safe-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+ dependencies:
+ ret "~0.1.10"
+
+"safer-buffer@>= 2.1.2 < 3":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+
+sax@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+
+"semver@2 || 3 || 4 || 5", semver@^5.0.1, semver@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
+
+set-blocking@^2.0.0, set-blocking@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+
+set-immediate-shim@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
+
+set-value@^0.4.3:
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.1"
+ to-object-path "^0.3.0"
+
+set-value@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274"
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.3"
+ split-string "^3.0.1"
+
+setimmediate@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+
+sha.js@^2.4.0, sha.js@^2.4.8:
+ version "2.4.11"
+ resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+shebang-command@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+ dependencies:
+ shebang-regex "^1.0.0"
+
+shebang-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+
+signal-exit@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
+
+snapdragon-node@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+ dependencies:
+ define-property "^1.0.0"
+ isobject "^3.0.0"
+ snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+ dependencies:
+ kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
+ dependencies:
+ base "^0.11.1"
+ debug "^2.2.0"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ map-cache "^0.2.2"
+ source-map "^0.5.6"
+ source-map-resolve "^0.5.0"
+ use "^3.1.0"
+
+source-list-map@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085"
+
+source-map-resolve@^0.5.0:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259"
+ dependencies:
+ atob "^2.1.1"
+ decode-uri-component "^0.2.0"
+ resolve-url "^0.2.1"
+ source-map-url "^0.4.0"
+ urix "^0.1.0"
+
+source-map-url@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
+
+source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+
+source-map@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+
+spdx-correct@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82"
+ dependencies:
+ spdx-expression-parse "^3.0.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9"
+
+spdx-expression-parse@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0"
+ dependencies:
+ spdx-exceptions "^2.1.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87"
+
+split-string@^3.0.1, split-string@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+ dependencies:
+ extend-shallow "^3.0.0"
+
+static-extend@^0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+ dependencies:
+ define-property "^0.2.5"
+ object-copy "^0.1.0"
+
+stream-browserify@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db"
+ dependencies:
+ inherits "~2.0.1"
+ readable-stream "^2.0.2"
+
+stream-http@^2.7.2:
+ version "2.8.3"
+ resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc"
+ dependencies:
+ builtin-status-codes "^3.0.0"
+ inherits "^2.0.1"
+ readable-stream "^2.3.6"
+ to-arraybuffer "^1.0.0"
+ xtend "^4.0.0"
+
+string-width@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ strip-ansi "^3.0.0"
+
+"string-width@^1.0.2 || 2", string-width@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^4.0.0"
+
+string_decoder@^1.0.0, string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ dependencies:
+ safe-buffer "~5.1.0"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+ dependencies:
+ ansi-regex "^2.0.0"
+
+strip-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+ dependencies:
+ ansi-regex "^3.0.0"
+
+strip-bom@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+
+strip-eof@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
+
+strip-json-comments@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+
+supports-color@^4.2.1:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b"
+ dependencies:
+ has-flag "^2.0.0"
+
+supports-color@^5.3.0:
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54"
+ dependencies:
+ has-flag "^3.0.0"
+
+tapable@^0.2.7:
+ version "0.2.8"
+ resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22"
+
+tar@^4:
+ version "4.4.4"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd"
+ dependencies:
+ chownr "^1.0.1"
+ fs-minipass "^1.2.5"
+ minipass "^2.3.3"
+ minizlib "^1.1.0"
+ mkdirp "^0.5.0"
+ safe-buffer "^5.1.2"
+ yallist "^3.0.2"
+
+timers-browserify@^2.0.4:
+ version "2.0.10"
+ resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae"
+ dependencies:
+ setimmediate "^1.0.4"
+
+to-arraybuffer@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
+
+to-object-path@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+ dependencies:
+ kind-of "^3.0.2"
+
+to-regex-range@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+ dependencies:
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+
+to-regex@^3.0.1, to-regex@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+ dependencies:
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ regex-not "^1.0.2"
+ safe-regex "^1.1.0"
+
+ts-loader@3:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-3.5.0.tgz#151d004dcddb4cf8e381a3bf9d6b74c2d957a9c0"
+ dependencies:
+ chalk "^2.3.0"
+ enhanced-resolve "^3.0.0"
+ loader-utils "^1.0.2"
+ micromatch "^3.1.4"
+ semver "^5.0.1"
+
+tty-browserify@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
+
+typescript@^2.9.2:
+ version "2.9.2"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.9.2.tgz#1cbf61d05d6b96269244eb6a3bce4bd914e0f00c"
+
+uglify-js@^2.8.29:
+ version "2.8.29"
+ resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd"
+ dependencies:
+ source-map "~0.5.1"
+ yargs "~3.10.0"
+ optionalDependencies:
+ uglify-to-browserify "~1.0.0"
+
+uglify-to-browserify@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
+
+uglifyjs-webpack-plugin@^0.4.6:
+ version "0.4.6"
+ resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz#b951f4abb6bd617e66f63eb891498e391763e309"
+ dependencies:
+ source-map "^0.5.6"
+ uglify-js "^2.8.29"
+ webpack-sources "^1.0.1"
+
+union-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"
+ dependencies:
+ arr-union "^3.1.0"
+ get-value "^2.0.6"
+ is-extendable "^0.1.1"
+ set-value "^0.4.3"
+
+unset-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+ dependencies:
+ has-value "^0.3.1"
+ isobject "^3.0.0"
+
+upath@^1.0.5:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd"
+
+uri-js@^4.2.1:
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"
+ dependencies:
+ punycode "^2.1.0"
+
+urix@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+
+url@^0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
+ dependencies:
+ punycode "1.3.2"
+ querystring "0.2.0"
+
+use@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
+
+util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+
+util@0.10.3:
+ version "0.10.3"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
+ dependencies:
+ inherits "2.0.1"
+
+util@^0.10.3:
+ version "0.10.4"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901"
+ dependencies:
+ inherits "2.0.3"
+
+validate-npm-package-license@^3.0.1:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338"
+ dependencies:
+ spdx-correct "^3.0.0"
+ spdx-expression-parse "^3.0.0"
+
+vm-browserify@0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
+ dependencies:
+ indexof "0.0.1"
+
+watchpack@^1.4.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00"
+ dependencies:
+ chokidar "^2.0.2"
+ graceful-fs "^4.1.2"
+ neo-async "^2.5.0"
+
+webpack-sources@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54"
+ dependencies:
+ source-list-map "^2.0.0"
+ source-map "~0.6.1"
+
+webpack@3:
+ version "3.12.0"
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.12.0.tgz#3f9e34360370602fcf639e97939db486f4ec0d74"
+ dependencies:
+ acorn "^5.0.0"
+ acorn-dynamic-import "^2.0.0"
+ ajv "^6.1.0"
+ ajv-keywords "^3.1.0"
+ async "^2.1.2"
+ enhanced-resolve "^3.4.0"
+ escope "^3.6.0"
+ interpret "^1.0.0"
+ json-loader "^0.5.4"
+ json5 "^0.5.1"
+ loader-runner "^2.3.0"
+ loader-utils "^1.1.0"
+ memory-fs "~0.4.1"
+ mkdirp "~0.5.0"
+ node-libs-browser "^2.0.0"
+ source-map "^0.5.3"
+ supports-color "^4.2.1"
+ tapable "^0.2.7"
+ uglifyjs-webpack-plugin "^0.4.6"
+ watchpack "^1.4.0"
+ webpack-sources "^1.0.1"
+ yargs "^8.0.2"
+
+which-module@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
+
+which@^1.2.9:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+ dependencies:
+ isexe "^2.0.0"
+
+wide-align@^1.1.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
+ dependencies:
+ string-width "^1.0.2 || 2"
+
+window-size@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
+
+wordwrap@0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
+
+wrap-ansi@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+
+xtend@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
+
+y18n@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
+
+yallist@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+
+yallist@^3.0.0, yallist@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9"
+
+yargs-parser@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9"
+ dependencies:
+ camelcase "^4.1.0"
+
+yargs@^8.0.2:
+ version "8.0.2"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360"
+ dependencies:
+ camelcase "^4.1.0"
+ cliui "^3.2.0"
+ decamelize "^1.1.1"
+ get-caller-file "^1.0.1"
+ os-locale "^2.0.0"
+ read-pkg-up "^2.0.0"
+ require-directory "^2.1.1"
+ require-main-filename "^1.0.1"
+ set-blocking "^2.0.0"
+ string-width "^2.0.0"
+ which-module "^2.0.0"
+ y18n "^3.2.1"
+ yargs-parser "^7.0.0"
+
+yargs@~3.10.0:
+ version "3.10.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
+ dependencies:
+ camelcase "^1.0.2"
+ cliui "^2.1.0"
+ decamelize "^1.0.0"
+ window-size "0.1.0"
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack4-babel6/index.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack4-babel6/index.js
new file mode 100644
index 0000000000..ab54774a5d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack4-babel6/index.js
@@ -0,0 +1,82 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+const path = require("path");
+const util = require("util");
+const _ = require("lodash");
+const webpack = require("webpack");
+
+const TARGET_NAME = "webpack4-babel6";
+
+module.exports = exports = async function(tests, dirname) {
+ const fixtures = [];
+ for (const [name, input] of tests) {
+ if (/typescript-/.test(name)) {
+ continue;
+ }
+
+ const testFnName = _.camelCase(`${TARGET_NAME}-${name}`);
+ const evalMaps = name.match(/-eval/);
+ const babelEnv = !name.match(/-es6/);
+ const babelModules = name.match(/-cjs/);
+
+ console.log(`Building ${TARGET_NAME} test ${name}`);
+
+ const scriptPath = path.join(dirname, "output", TARGET_NAME, `${name}.js`);
+ const result = await util.promisify(webpack)({
+ mode: "development",
+ context: path.dirname(input),
+ entry: `./${path.basename(input)}`,
+ output: {
+ path: path.dirname(scriptPath),
+ filename: path.basename(scriptPath),
+
+ devtoolModuleFilenameTemplate: `${TARGET_NAME}://./${name}/[resource-path]`,
+
+ libraryTarget: "var",
+ library: testFnName,
+ libraryExport: "default"
+ },
+ devtool: evalMaps ? "eval-source-map" : "source-map",
+ module: {
+ rules: [
+ {
+ test: /\.js$/,
+ exclude: /node_modules/,
+ loader: require.resolve("babel-loader"),
+ options: {
+ babelrc: false,
+ presets: [
+ babelEnv
+ ? [
+ require.resolve("babel-preset-env"),
+ { modules: babelModules ? "commonjs" : false }
+ ]
+ : null
+ ].filter(Boolean),
+ plugins: [
+ require.resolve("babel-plugin-transform-flow-strip-types"),
+ require.resolve("babel-plugin-transform-class-properties")
+ ]
+ }
+ }
+ ].filter(Boolean)
+ }
+ });
+
+ fixtures.push({
+ name,
+ testFnName: testFnName,
+ scriptPath,
+ assets: [scriptPath, evalMaps ? null : `${scriptPath}.map`].filter(
+ Boolean
+ )
+ });
+ }
+
+ return {
+ target: TARGET_NAME,
+ fixtures
+ };
+};
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack4-babel6/package.json b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack4-babel6/package.json
new file mode 100644
index 0000000000..817b4c7370
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack4-babel6/package.json
@@ -0,0 +1,12 @@
+{
+ "name": "sourcemapped-webpack3-babel6",
+ "private": true,
+ "dependencies": {
+ "babel-core": "^6.26.3",
+ "babel-loader": "^7.1.5",
+ "babel-plugin-transform-flow-strip-types": "^6.22.0",
+ "babel-preset-env": "^1.7.0",
+ "lodash": "^4.17.10",
+ "webpack": "^4"
+ }
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack4-babel6/yarn.lock b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack4-babel6/yarn.lock
new file mode 100644
index 0000000000..7ddacbc57b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack4-babel6/yarn.lock
@@ -0,0 +1,2787 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@webassemblyjs/ast@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.5.13.tgz#81155a570bd5803a30ec31436bc2c9c0ede38f25"
+ dependencies:
+ "@webassemblyjs/helper-module-context" "1.5.13"
+ "@webassemblyjs/helper-wasm-bytecode" "1.5.13"
+ "@webassemblyjs/wast-parser" "1.5.13"
+ debug "^3.1.0"
+ mamacro "^0.0.3"
+
+"@webassemblyjs/floating-point-hex-parser@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.5.13.tgz#29ce0baa97411f70e8cce68ce9c0f9d819a4e298"
+
+"@webassemblyjs/helper-api-error@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.5.13.tgz#e49b051d67ee19a56e29b9aa8bd949b5b4442a59"
+
+"@webassemblyjs/helper-buffer@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.5.13.tgz#873bb0a1b46449231137c1262ddfd05695195a1e"
+ dependencies:
+ debug "^3.1.0"
+
+"@webassemblyjs/helper-code-frame@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.5.13.tgz#1bd2181b6a0be14e004f0fe9f5a660d265362b58"
+ dependencies:
+ "@webassemblyjs/wast-printer" "1.5.13"
+
+"@webassemblyjs/helper-fsm@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.5.13.tgz#cdf3d9d33005d543a5c5e5adaabf679ffa8db924"
+
+"@webassemblyjs/helper-module-context@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.5.13.tgz#dc29ddfb51ed657655286f94a5d72d8a489147c5"
+ dependencies:
+ debug "^3.1.0"
+ mamacro "^0.0.3"
+
+"@webassemblyjs/helper-wasm-bytecode@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.5.13.tgz#03245817f0a762382e61733146f5773def15a747"
+
+"@webassemblyjs/helper-wasm-section@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.5.13.tgz#efc76f44a10d3073b584b43c38a179df173d5c7d"
+ dependencies:
+ "@webassemblyjs/ast" "1.5.13"
+ "@webassemblyjs/helper-buffer" "1.5.13"
+ "@webassemblyjs/helper-wasm-bytecode" "1.5.13"
+ "@webassemblyjs/wasm-gen" "1.5.13"
+ debug "^3.1.0"
+
+"@webassemblyjs/ieee754@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.5.13.tgz#573e97c8c12e4eebb316ca5fde0203ddd90b0364"
+ dependencies:
+ ieee754 "^1.1.11"
+
+"@webassemblyjs/leb128@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.5.13.tgz#ab52ebab9cec283c1c1897ac1da833a04a3f4cee"
+ dependencies:
+ long "4.0.0"
+
+"@webassemblyjs/utf8@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.5.13.tgz#6b53d2cd861cf94fa99c1f12779dde692fbc2469"
+
+"@webassemblyjs/wasm-edit@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.5.13.tgz#c9cef5664c245cf11b3b3a73110c9155831724a8"
+ dependencies:
+ "@webassemblyjs/ast" "1.5.13"
+ "@webassemblyjs/helper-buffer" "1.5.13"
+ "@webassemblyjs/helper-wasm-bytecode" "1.5.13"
+ "@webassemblyjs/helper-wasm-section" "1.5.13"
+ "@webassemblyjs/wasm-gen" "1.5.13"
+ "@webassemblyjs/wasm-opt" "1.5.13"
+ "@webassemblyjs/wasm-parser" "1.5.13"
+ "@webassemblyjs/wast-printer" "1.5.13"
+ debug "^3.1.0"
+
+"@webassemblyjs/wasm-gen@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.5.13.tgz#8e6ea113c4b432fa66540189e79b16d7a140700e"
+ dependencies:
+ "@webassemblyjs/ast" "1.5.13"
+ "@webassemblyjs/helper-wasm-bytecode" "1.5.13"
+ "@webassemblyjs/ieee754" "1.5.13"
+ "@webassemblyjs/leb128" "1.5.13"
+ "@webassemblyjs/utf8" "1.5.13"
+
+"@webassemblyjs/wasm-opt@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.5.13.tgz#147aad7717a7ee4211c36b21a5f4c30dddf33138"
+ dependencies:
+ "@webassemblyjs/ast" "1.5.13"
+ "@webassemblyjs/helper-buffer" "1.5.13"
+ "@webassemblyjs/wasm-gen" "1.5.13"
+ "@webassemblyjs/wasm-parser" "1.5.13"
+ debug "^3.1.0"
+
+"@webassemblyjs/wasm-parser@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.5.13.tgz#6f46516c5bb23904fbdf58009233c2dd8a54c72f"
+ dependencies:
+ "@webassemblyjs/ast" "1.5.13"
+ "@webassemblyjs/helper-api-error" "1.5.13"
+ "@webassemblyjs/helper-wasm-bytecode" "1.5.13"
+ "@webassemblyjs/ieee754" "1.5.13"
+ "@webassemblyjs/leb128" "1.5.13"
+ "@webassemblyjs/utf8" "1.5.13"
+
+"@webassemblyjs/wast-parser@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.5.13.tgz#5727a705d397ae6a3ae99d7f5460acf2ec646eea"
+ dependencies:
+ "@webassemblyjs/ast" "1.5.13"
+ "@webassemblyjs/floating-point-hex-parser" "1.5.13"
+ "@webassemblyjs/helper-api-error" "1.5.13"
+ "@webassemblyjs/helper-code-frame" "1.5.13"
+ "@webassemblyjs/helper-fsm" "1.5.13"
+ long "^3.2.0"
+ mamacro "^0.0.3"
+
+"@webassemblyjs/wast-printer@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.5.13.tgz#bb34d528c14b4f579e7ec11e793ec50ad7cd7c95"
+ dependencies:
+ "@webassemblyjs/ast" "1.5.13"
+ "@webassemblyjs/wast-parser" "1.5.13"
+ long "^3.2.0"
+
+abbrev@1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+
+acorn-dynamic-import@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278"
+ dependencies:
+ acorn "^5.0.0"
+
+acorn@^5.0.0, acorn@^5.6.2:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8"
+
+ajv-keywords@^3.1.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a"
+
+ajv@^6.1.0:
+ version "6.5.2"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.2.tgz#678495f9b82f7cca6be248dd92f59bff5e1f4360"
+ dependencies:
+ fast-deep-equal "^2.0.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.1"
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+
+ansi-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+
+ansi-styles@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+
+anymatch@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
+ dependencies:
+ micromatch "^3.1.4"
+ normalize-path "^2.1.1"
+
+aproba@^1.0.3, aproba@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
+
+are-we-there-yet@~1.1.2:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
+ dependencies:
+ delegates "^1.0.0"
+ readable-stream "^2.0.6"
+
+arr-diff@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+
+arr-flatten@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+
+arr-union@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+
+array-unique@^0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+
+asn1.js@^4.0.0:
+ version "4.10.1"
+ resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"
+ dependencies:
+ bn.js "^4.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+assert@^1.1.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91"
+ dependencies:
+ util "0.10.3"
+
+assign-symbols@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+
+async-each@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
+
+atob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a"
+
+babel-code-frame@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
+ dependencies:
+ chalk "^1.1.3"
+ esutils "^2.0.2"
+ js-tokens "^3.0.2"
+
+babel-core@^6.26.0, babel-core@^6.26.3:
+ version "6.26.3"
+ resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207"
+ dependencies:
+ babel-code-frame "^6.26.0"
+ babel-generator "^6.26.0"
+ babel-helpers "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-register "^6.26.0"
+ babel-runtime "^6.26.0"
+ babel-template "^6.26.0"
+ babel-traverse "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+ convert-source-map "^1.5.1"
+ debug "^2.6.9"
+ json5 "^0.5.1"
+ lodash "^4.17.4"
+ minimatch "^3.0.4"
+ path-is-absolute "^1.0.1"
+ private "^0.1.8"
+ slash "^1.0.0"
+ source-map "^0.5.7"
+
+babel-generator@^6.26.0:
+ version "6.26.1"
+ resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90"
+ dependencies:
+ babel-messages "^6.23.0"
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ detect-indent "^4.0.0"
+ jsesc "^1.3.0"
+ lodash "^4.17.4"
+ source-map "^0.5.7"
+ trim-right "^1.0.1"
+
+babel-helper-builder-binary-assignment-operator-visitor@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664"
+ dependencies:
+ babel-helper-explode-assignable-expression "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-call-delegate@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d"
+ dependencies:
+ babel-helper-hoist-variables "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-define-map@^6.24.1:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f"
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ lodash "^4.17.4"
+
+babel-helper-explode-assignable-expression@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-function-name@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9"
+ dependencies:
+ babel-helper-get-function-arity "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-get-function-arity@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-hoist-variables@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-optimise-call-expression@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-regex@^6.24.1:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72"
+ dependencies:
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ lodash "^4.17.4"
+
+babel-helper-remap-async-to-generator@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b"
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-replace-supers@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a"
+ dependencies:
+ babel-helper-optimise-call-expression "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helpers@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-loader@^7.1.5:
+ version "7.1.5"
+ resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.5.tgz#e3ee0cd7394aa557e013b02d3e492bfd07aa6d68"
+ dependencies:
+ find-cache-dir "^1.0.0"
+ loader-utils "^1.0.2"
+ mkdirp "^0.5.1"
+
+babel-messages@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-check-es2015-constants@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-syntax-async-functions@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
+
+babel-plugin-syntax-exponentiation-operator@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de"
+
+babel-plugin-syntax-flow@^6.18.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d"
+
+babel-plugin-syntax-trailing-function-commas@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3"
+
+babel-plugin-transform-async-to-generator@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761"
+ dependencies:
+ babel-helper-remap-async-to-generator "^6.24.1"
+ babel-plugin-syntax-async-functions "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-arrow-functions@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoped-functions@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoping@^6.23.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f"
+ dependencies:
+ babel-runtime "^6.26.0"
+ babel-template "^6.26.0"
+ babel-traverse "^6.26.0"
+ babel-types "^6.26.0"
+ lodash "^4.17.4"
+
+babel-plugin-transform-es2015-classes@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db"
+ dependencies:
+ babel-helper-define-map "^6.24.1"
+ babel-helper-function-name "^6.24.1"
+ babel-helper-optimise-call-expression "^6.24.1"
+ babel-helper-replace-supers "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-computed-properties@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-destructuring@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-duplicate-keys@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-for-of@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-function-name@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b"
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-literals@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154"
+ dependencies:
+ babel-plugin-transform-es2015-modules-commonjs "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1:
+ version "6.26.2"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3"
+ dependencies:
+ babel-plugin-transform-strict-mode "^6.24.1"
+ babel-runtime "^6.26.0"
+ babel-template "^6.26.0"
+ babel-types "^6.26.0"
+
+babel-plugin-transform-es2015-modules-systemjs@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23"
+ dependencies:
+ babel-helper-hoist-variables "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-umd@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468"
+ dependencies:
+ babel-plugin-transform-es2015-modules-amd "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-object-super@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d"
+ dependencies:
+ babel-helper-replace-supers "^6.24.1"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-parameters@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b"
+ dependencies:
+ babel-helper-call-delegate "^6.24.1"
+ babel-helper-get-function-arity "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-shorthand-properties@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-spread@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-sticky-regex@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc"
+ dependencies:
+ babel-helper-regex "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-template-literals@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-typeof-symbol@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372"
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-unicode-regex@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9"
+ dependencies:
+ babel-helper-regex "^6.24.1"
+ babel-runtime "^6.22.0"
+ regexpu-core "^2.0.0"
+
+babel-plugin-transform-exponentiation-operator@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e"
+ dependencies:
+ babel-helper-builder-binary-assignment-operator-visitor "^6.24.1"
+ babel-plugin-syntax-exponentiation-operator "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-flow-strip-types@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf"
+ dependencies:
+ babel-plugin-syntax-flow "^6.18.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-regenerator@^6.22.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f"
+ dependencies:
+ regenerator-transform "^0.10.0"
+
+babel-plugin-transform-strict-mode@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-preset-env@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a"
+ dependencies:
+ babel-plugin-check-es2015-constants "^6.22.0"
+ babel-plugin-syntax-trailing-function-commas "^6.22.0"
+ babel-plugin-transform-async-to-generator "^6.22.0"
+ babel-plugin-transform-es2015-arrow-functions "^6.22.0"
+ babel-plugin-transform-es2015-block-scoped-functions "^6.22.0"
+ babel-plugin-transform-es2015-block-scoping "^6.23.0"
+ babel-plugin-transform-es2015-classes "^6.23.0"
+ babel-plugin-transform-es2015-computed-properties "^6.22.0"
+ babel-plugin-transform-es2015-destructuring "^6.23.0"
+ babel-plugin-transform-es2015-duplicate-keys "^6.22.0"
+ babel-plugin-transform-es2015-for-of "^6.23.0"
+ babel-plugin-transform-es2015-function-name "^6.22.0"
+ babel-plugin-transform-es2015-literals "^6.22.0"
+ babel-plugin-transform-es2015-modules-amd "^6.22.0"
+ babel-plugin-transform-es2015-modules-commonjs "^6.23.0"
+ babel-plugin-transform-es2015-modules-systemjs "^6.23.0"
+ babel-plugin-transform-es2015-modules-umd "^6.23.0"
+ babel-plugin-transform-es2015-object-super "^6.22.0"
+ babel-plugin-transform-es2015-parameters "^6.23.0"
+ babel-plugin-transform-es2015-shorthand-properties "^6.22.0"
+ babel-plugin-transform-es2015-spread "^6.22.0"
+ babel-plugin-transform-es2015-sticky-regex "^6.22.0"
+ babel-plugin-transform-es2015-template-literals "^6.22.0"
+ babel-plugin-transform-es2015-typeof-symbol "^6.23.0"
+ babel-plugin-transform-es2015-unicode-regex "^6.22.0"
+ babel-plugin-transform-exponentiation-operator "^6.22.0"
+ babel-plugin-transform-regenerator "^6.22.0"
+ browserslist "^3.2.6"
+ invariant "^2.2.2"
+ semver "^5.3.0"
+
+babel-register@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071"
+ dependencies:
+ babel-core "^6.26.0"
+ babel-runtime "^6.26.0"
+ core-js "^2.5.0"
+ home-or-tmp "^2.0.0"
+ lodash "^4.17.4"
+ mkdirp "^0.5.1"
+ source-map-support "^0.4.15"
+
+babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
+ dependencies:
+ core-js "^2.4.0"
+ regenerator-runtime "^0.11.0"
+
+babel-template@^6.24.1, babel-template@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
+ dependencies:
+ babel-runtime "^6.26.0"
+ babel-traverse "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+ lodash "^4.17.4"
+
+babel-traverse@^6.24.1, babel-traverse@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
+ dependencies:
+ babel-code-frame "^6.26.0"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+ debug "^2.6.8"
+ globals "^9.18.0"
+ invariant "^2.2.2"
+ lodash "^4.17.4"
+
+babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
+ dependencies:
+ babel-runtime "^6.26.0"
+ esutils "^2.0.2"
+ lodash "^4.17.4"
+ to-fast-properties "^1.0.3"
+
+babylon@^6.18.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
+
+balanced-match@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+
+base64-js@^1.0.2:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3"
+
+base@^0.11.1:
+ version "0.11.2"
+ resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+ dependencies:
+ cache-base "^1.0.1"
+ class-utils "^0.3.5"
+ component-emitter "^1.2.1"
+ define-property "^1.0.0"
+ isobject "^3.0.1"
+ mixin-deep "^1.2.0"
+ pascalcase "^0.1.1"
+
+big.js@^3.1.3:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
+
+binary-extensions@^1.0.0:
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205"
+
+bluebird@^3.5.1:
+ version "3.5.1"
+ resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
+ version "4.11.8"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+braces@^2.3.0, braces@^2.3.1:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+ dependencies:
+ arr-flatten "^1.1.0"
+ array-unique "^0.3.2"
+ extend-shallow "^2.0.1"
+ fill-range "^4.0.0"
+ isobject "^3.0.1"
+ repeat-element "^1.1.2"
+ snapdragon "^0.8.1"
+ snapdragon-node "^2.0.1"
+ split-string "^3.0.2"
+ to-regex "^3.0.1"
+
+brorand@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
+ dependencies:
+ buffer-xor "^1.0.3"
+ cipher-base "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.3"
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+browserify-cipher@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
+ dependencies:
+ browserify-aes "^1.0.4"
+ browserify-des "^1.0.0"
+ evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c"
+ dependencies:
+ cipher-base "^1.0.1"
+ des.js "^1.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+browserify-rsa@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
+ dependencies:
+ bn.js "^4.1.0"
+ randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
+ dependencies:
+ bn.js "^4.1.1"
+ browserify-rsa "^4.0.0"
+ create-hash "^1.1.0"
+ create-hmac "^1.1.2"
+ elliptic "^6.0.0"
+ inherits "^2.0.1"
+ parse-asn1 "^5.0.0"
+
+browserify-zlib@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
+ dependencies:
+ pako "~1.0.5"
+
+browserslist@^3.2.6:
+ version "3.2.8"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6"
+ dependencies:
+ caniuse-lite "^1.0.30000844"
+ electron-to-chromium "^1.3.47"
+
+buffer-from@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04"
+
+buffer-xor@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+
+buffer@^4.3.0:
+ version "4.9.1"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298"
+ dependencies:
+ base64-js "^1.0.2"
+ ieee754 "^1.1.4"
+ isarray "^1.0.0"
+
+builtin-status-codes@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
+
+cacache@^10.0.4:
+ version "10.0.4"
+ resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460"
+ dependencies:
+ bluebird "^3.5.1"
+ chownr "^1.0.1"
+ glob "^7.1.2"
+ graceful-fs "^4.1.11"
+ lru-cache "^4.1.1"
+ mississippi "^2.0.0"
+ mkdirp "^0.5.1"
+ move-concurrently "^1.0.1"
+ promise-inflight "^1.0.1"
+ rimraf "^2.6.2"
+ ssri "^5.2.4"
+ unique-filename "^1.1.0"
+ y18n "^4.0.0"
+
+cache-base@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+ dependencies:
+ collection-visit "^1.0.0"
+ component-emitter "^1.2.1"
+ get-value "^2.0.6"
+ has-value "^1.0.0"
+ isobject "^3.0.1"
+ set-value "^2.0.0"
+ to-object-path "^0.3.0"
+ union-value "^1.0.0"
+ unset-value "^1.0.0"
+
+caniuse-lite@^1.0.30000844:
+ version "1.0.30000865"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz#70026616e8afe6e1442f8bb4e1092987d81a2f25"
+
+chalk@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+ dependencies:
+ ansi-styles "^2.2.1"
+ escape-string-regexp "^1.0.2"
+ has-ansi "^2.0.0"
+ strip-ansi "^3.0.0"
+ supports-color "^2.0.0"
+
+chokidar@^2.0.2:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26"
+ dependencies:
+ anymatch "^2.0.0"
+ async-each "^1.0.0"
+ braces "^2.3.0"
+ glob-parent "^3.1.0"
+ inherits "^2.0.1"
+ is-binary-path "^1.0.0"
+ is-glob "^4.0.0"
+ lodash.debounce "^4.0.8"
+ normalize-path "^2.1.1"
+ path-is-absolute "^1.0.0"
+ readdirp "^2.0.0"
+ upath "^1.0.5"
+ optionalDependencies:
+ fsevents "^1.2.2"
+
+chownr@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181"
+
+chrome-trace-event@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48"
+ dependencies:
+ tslib "^1.9.0"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+class-utils@^0.3.5:
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+ dependencies:
+ arr-union "^3.1.0"
+ define-property "^0.2.5"
+ isobject "^3.0.0"
+ static-extend "^0.1.1"
+
+code-point-at@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+
+collection-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+ dependencies:
+ map-visit "^1.0.0"
+ object-visit "^1.0.0"
+
+commander@~2.13.0:
+ version "2.13.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c"
+
+commondir@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
+
+component-emitter@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+
+concat-stream@^1.5.0:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
+ dependencies:
+ buffer-from "^1.0.0"
+ inherits "^2.0.3"
+ readable-stream "^2.2.2"
+ typedarray "^0.0.6"
+
+console-browserify@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
+ dependencies:
+ date-now "^0.1.4"
+
+console-control-strings@^1.0.0, console-control-strings@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+
+constants-browserify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
+
+convert-source-map@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5"
+
+copy-concurrently@^1.0.0:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0"
+ dependencies:
+ aproba "^1.1.1"
+ fs-write-stream-atomic "^1.0.8"
+ iferr "^0.1.5"
+ mkdirp "^0.5.1"
+ rimraf "^2.5.4"
+ run-queue "^1.0.0"
+
+copy-descriptor@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+
+core-js@^2.4.0, core-js@^2.5.0:
+ version "2.5.7"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e"
+
+core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+
+create-ecdh@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff"
+ dependencies:
+ bn.js "^4.1.0"
+ elliptic "^6.0.0"
+
+create-hash@^1.1.0, create-hash@^1.1.2:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
+ dependencies:
+ cipher-base "^1.0.1"
+ inherits "^2.0.1"
+ md5.js "^1.3.4"
+ ripemd160 "^2.0.1"
+ sha.js "^2.4.0"
+
+create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
+ dependencies:
+ cipher-base "^1.0.3"
+ create-hash "^1.1.0"
+ inherits "^2.0.1"
+ ripemd160 "^2.0.0"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+crypto-browserify@^3.11.0:
+ version "3.12.0"
+ resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
+ dependencies:
+ browserify-cipher "^1.0.0"
+ browserify-sign "^4.0.0"
+ create-ecdh "^4.0.0"
+ create-hash "^1.1.0"
+ create-hmac "^1.1.0"
+ diffie-hellman "^5.0.0"
+ inherits "^2.0.1"
+ pbkdf2 "^3.0.3"
+ public-encrypt "^4.0.0"
+ randombytes "^2.0.0"
+ randomfill "^1.0.3"
+
+cyclist@~0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640"
+
+date-now@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
+
+debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ dependencies:
+ ms "2.0.0"
+
+debug@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
+ dependencies:
+ ms "2.0.0"
+
+decode-uri-component@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+
+deep-extend@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
+
+define-property@^0.2.5:
+ version "0.2.5"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+ dependencies:
+ is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+ dependencies:
+ is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+ dependencies:
+ is-descriptor "^1.0.2"
+ isobject "^3.0.1"
+
+delegates@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+
+des.js@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
+ dependencies:
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+detect-indent@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
+ dependencies:
+ repeating "^2.0.0"
+
+detect-libc@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
+
+diffie-hellman@^5.0.0:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
+ dependencies:
+ bn.js "^4.1.0"
+ miller-rabin "^4.0.0"
+ randombytes "^2.0.0"
+
+domain-browser@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
+
+duplexify@^3.4.2, duplexify@^3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.0.tgz#592903f5d80b38d037220541264d69a198fb3410"
+ dependencies:
+ end-of-stream "^1.0.0"
+ inherits "^2.0.1"
+ readable-stream "^2.0.0"
+ stream-shift "^1.0.0"
+
+electron-to-chromium@^1.3.47:
+ version "1.3.52"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.52.tgz#d2d9f1270ba4a3b967b831c40ef71fb4d9ab5ce0"
+
+elliptic@^6.0.0:
+ version "6.4.0"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df"
+ dependencies:
+ bn.js "^4.4.0"
+ brorand "^1.0.1"
+ hash.js "^1.0.0"
+ hmac-drbg "^1.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.0"
+
+emojis-list@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
+
+end-of-stream@^1.0.0, end-of-stream@^1.1.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43"
+ dependencies:
+ once "^1.4.0"
+
+enhanced-resolve@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f"
+ dependencies:
+ graceful-fs "^4.1.2"
+ memory-fs "^0.4.0"
+ tapable "^1.0.0"
+
+errno@^0.1.3, errno@~0.1.7:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
+ dependencies:
+ prr "~1.0.1"
+
+escape-string-regexp@^1.0.2:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+
+eslint-scope@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172"
+ dependencies:
+ esrecurse "^4.1.0"
+ estraverse "^4.1.1"
+
+esrecurse@^4.1.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
+ dependencies:
+ estraverse "^4.1.0"
+
+estraverse@^4.1.0, estraverse@^4.1.1:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
+
+esutils@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
+
+events@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
+
+evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+ dependencies:
+ md5.js "^1.3.4"
+ safe-buffer "^5.1.1"
+
+expand-brackets@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+ dependencies:
+ debug "^2.3.3"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ posix-character-classes "^0.1.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+extend-shallow@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+ dependencies:
+ is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+ dependencies:
+ assign-symbols "^1.0.0"
+ is-extendable "^1.0.1"
+
+extglob@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+ dependencies:
+ array-unique "^0.3.2"
+ define-property "^1.0.0"
+ expand-brackets "^2.1.4"
+ extend-shallow "^2.0.1"
+ fragment-cache "^0.2.1"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+fast-deep-equal@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
+
+fill-range@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+ to-regex-range "^2.1.0"
+
+find-cache-dir@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f"
+ dependencies:
+ commondir "^1.0.1"
+ make-dir "^1.0.0"
+ pkg-dir "^2.0.0"
+
+find-up@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+ dependencies:
+ locate-path "^2.0.0"
+
+flush-write-stream@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd"
+ dependencies:
+ inherits "^2.0.1"
+ readable-stream "^2.0.4"
+
+for-in@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+
+fragment-cache@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+ dependencies:
+ map-cache "^0.2.2"
+
+from2@^2.1.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
+ dependencies:
+ inherits "^2.0.1"
+ readable-stream "^2.0.0"
+
+fs-minipass@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d"
+ dependencies:
+ minipass "^2.2.1"
+
+fs-write-stream-atomic@^1.0.8:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
+ dependencies:
+ graceful-fs "^4.1.2"
+ iferr "^0.1.5"
+ imurmurhash "^0.1.4"
+ readable-stream "1 || 2"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+
+fsevents@^1.2.2:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426"
+ dependencies:
+ nan "^2.9.2"
+ node-pre-gyp "^0.10.0"
+
+gauge@~2.7.3:
+ version "2.7.4"
+ resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
+ dependencies:
+ aproba "^1.0.3"
+ console-control-strings "^1.0.0"
+ has-unicode "^2.0.0"
+ object-assign "^4.1.0"
+ signal-exit "^3.0.0"
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wide-align "^1.1.0"
+
+get-value@^2.0.3, get-value@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+
+glob-parent@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
+ dependencies:
+ is-glob "^3.1.0"
+ path-dirname "^1.0.0"
+
+glob@^7.0.5, glob@^7.1.2:
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+globals@^9.18.0:
+ version "9.18.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
+
+graceful-fs@^4.1.11, graceful-fs@^4.1.2:
+ version "4.1.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
+
+has-ansi@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+ dependencies:
+ ansi-regex "^2.0.0"
+
+has-unicode@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+
+has-value@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+ dependencies:
+ get-value "^2.0.3"
+ has-values "^0.1.4"
+ isobject "^2.0.0"
+
+has-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+ dependencies:
+ get-value "^2.0.6"
+ has-values "^1.0.0"
+ isobject "^3.0.0"
+
+has-values@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+
+has-values@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+ dependencies:
+ is-number "^3.0.0"
+ kind-of "^4.0.0"
+
+hash-base@^3.0.0:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+hash.js@^1.0.0, hash.js@^1.0.3:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.5.tgz#e38ab4b85dfb1e0c40fe9265c0e9b54854c23812"
+ dependencies:
+ inherits "^2.0.3"
+ minimalistic-assert "^1.0.1"
+
+hmac-drbg@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+ dependencies:
+ hash.js "^1.0.3"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.1"
+
+home-or-tmp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.1"
+
+https-browserify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
+
+iconv-lite@^0.4.4:
+ version "0.4.23"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63"
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+ieee754@^1.1.11, ieee754@^1.1.4:
+ version "1.1.12"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b"
+
+iferr@^0.1.5:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
+
+ignore-walk@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8"
+ dependencies:
+ minimatch "^3.0.4"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+
+indexof@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+
+inherits@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
+
+ini@~1.3.0:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
+
+invariant@^2.2.2:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
+ dependencies:
+ loose-envify "^1.0.0"
+
+is-accessor-descriptor@^0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-accessor-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
+ dependencies:
+ kind-of "^6.0.0"
+
+is-binary-path@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+ dependencies:
+ binary-extensions "^1.0.0"
+
+is-buffer@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+
+is-data-descriptor@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-data-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
+ dependencies:
+ kind-of "^6.0.0"
+
+is-descriptor@^0.1.0:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
+ dependencies:
+ is-accessor-descriptor "^0.1.6"
+ is-data-descriptor "^0.1.4"
+ kind-of "^5.0.0"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
+ dependencies:
+ is-accessor-descriptor "^1.0.0"
+ is-data-descriptor "^1.0.0"
+ kind-of "^6.0.2"
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+
+is-extendable@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+ dependencies:
+ is-plain-object "^2.0.4"
+
+is-extglob@^2.1.0, is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+
+is-finite@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa"
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+
+is-glob@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
+ dependencies:
+ is-extglob "^2.1.0"
+
+is-glob@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0"
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-number@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+ dependencies:
+ isobject "^3.0.1"
+
+is-windows@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+
+isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+
+isobject@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+ dependencies:
+ isarray "1.0.0"
+
+isobject@^3.0.0, isobject@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+
+"js-tokens@^3.0.0 || ^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+
+js-tokens@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
+
+jsesc@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
+
+jsesc@~0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+
+json-parse-better-errors@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+
+json5@^0.5.0, json5@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
+
+kind-of@^6.0.0, kind-of@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
+
+loader-runner@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2"
+
+loader-utils@^1.0.2, loader-utils@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd"
+ dependencies:
+ big.js "^3.1.3"
+ emojis-list "^2.0.0"
+ json5 "^0.5.0"
+
+locate-path@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+ dependencies:
+ p-locate "^2.0.0"
+ path-exists "^3.0.0"
+
+lodash.debounce@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
+
+lodash@^4.17.10, lodash@^4.17.4:
+ version "4.17.10"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"
+
+long@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28"
+
+long@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b"
+
+loose-envify@^1.0.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+lru-cache@^4.1.1:
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c"
+ dependencies:
+ pseudomap "^1.0.2"
+ yallist "^2.1.2"
+
+make-dir@^1.0.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
+ dependencies:
+ pify "^3.0.0"
+
+mamacro@^0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4"
+
+map-cache@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+
+map-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+ dependencies:
+ object-visit "^1.0.0"
+
+md5.js@^1.3.4:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d"
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+
+memory-fs@^0.4.0, memory-fs@~0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
+ dependencies:
+ errno "^0.1.3"
+ readable-stream "^2.0.1"
+
+micromatch@^3.1.4, micromatch@^3.1.8:
+ version "3.1.10"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ braces "^2.3.1"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ extglob "^2.0.4"
+ fragment-cache "^0.2.1"
+ kind-of "^6.0.2"
+ nanomatch "^1.2.9"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.2"
+
+miller-rabin@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
+ dependencies:
+ bn.js "^4.0.0"
+ brorand "^1.0.1"
+
+minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+
+minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+
+minimatch@^3.0.2, minimatch@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@0.0.8:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+
+minimist@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+
+minipass@^2.2.1, minipass@^2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233"
+ dependencies:
+ safe-buffer "^5.1.2"
+ yallist "^3.0.0"
+
+minizlib@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb"
+ dependencies:
+ minipass "^2.2.1"
+
+mississippi@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f"
+ dependencies:
+ concat-stream "^1.5.0"
+ duplexify "^3.4.2"
+ end-of-stream "^1.1.0"
+ flush-write-stream "^1.0.0"
+ from2 "^2.1.0"
+ parallel-transform "^1.1.0"
+ pump "^2.0.1"
+ pumpify "^1.3.3"
+ stream-each "^1.1.0"
+ through2 "^2.0.0"
+
+mixin-deep@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe"
+ dependencies:
+ for-in "^1.0.2"
+ is-extendable "^1.0.1"
+
+mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+ dependencies:
+ minimist "0.0.8"
+
+move-concurrently@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
+ dependencies:
+ aproba "^1.1.1"
+ copy-concurrently "^1.0.0"
+ fs-write-stream-atomic "^1.0.8"
+ mkdirp "^0.5.1"
+ rimraf "^2.5.4"
+ run-queue "^1.0.3"
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+
+nan@^2.9.2:
+ version "2.10.0"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f"
+
+nanomatch@^1.2.9:
+ version "1.2.13"
+ resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ fragment-cache "^0.2.1"
+ is-windows "^1.0.2"
+ kind-of "^6.0.2"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+needle@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d"
+ dependencies:
+ debug "^2.1.2"
+ iconv-lite "^0.4.4"
+ sax "^1.2.4"
+
+neo-async@^2.5.0:
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee"
+
+node-libs-browser@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df"
+ dependencies:
+ assert "^1.1.1"
+ browserify-zlib "^0.2.0"
+ buffer "^4.3.0"
+ console-browserify "^1.1.0"
+ constants-browserify "^1.0.0"
+ crypto-browserify "^3.11.0"
+ domain-browser "^1.1.1"
+ events "^1.0.0"
+ https-browserify "^1.0.0"
+ os-browserify "^0.3.0"
+ path-browserify "0.0.0"
+ process "^0.11.10"
+ punycode "^1.2.4"
+ querystring-es3 "^0.2.0"
+ readable-stream "^2.3.3"
+ stream-browserify "^2.0.1"
+ stream-http "^2.7.2"
+ string_decoder "^1.0.0"
+ timers-browserify "^2.0.4"
+ tty-browserify "0.0.0"
+ url "^0.11.0"
+ util "^0.10.3"
+ vm-browserify "0.0.4"
+
+node-pre-gyp@^0.10.0:
+ version "0.10.3"
+ resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc"
+ dependencies:
+ detect-libc "^1.0.2"
+ mkdirp "^0.5.1"
+ needle "^2.2.1"
+ nopt "^4.0.1"
+ npm-packlist "^1.1.6"
+ npmlog "^4.0.2"
+ rc "^1.2.7"
+ rimraf "^2.6.1"
+ semver "^5.3.0"
+ tar "^4"
+
+nopt@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
+ dependencies:
+ abbrev "1"
+ osenv "^0.1.4"
+
+normalize-path@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+ dependencies:
+ remove-trailing-separator "^1.0.1"
+
+npm-bundled@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308"
+
+npm-packlist@^1.1.6:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz#84e8c683cbe7867d34b1d357d893ce29e28a02de"
+ dependencies:
+ ignore-walk "^3.0.1"
+ npm-bundled "^1.0.1"
+
+npmlog@^4.0.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
+ dependencies:
+ are-we-there-yet "~1.1.2"
+ console-control-strings "~1.1.0"
+ gauge "~2.7.3"
+ set-blocking "~2.0.0"
+
+number-is-nan@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+
+object-assign@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+
+object-copy@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+ dependencies:
+ copy-descriptor "^0.1.0"
+ define-property "^0.2.5"
+ kind-of "^3.0.3"
+
+object-visit@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+ dependencies:
+ isobject "^3.0.0"
+
+object.pick@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+ dependencies:
+ isobject "^3.0.1"
+
+once@^1.3.0, once@^1.3.1, once@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ dependencies:
+ wrappy "1"
+
+os-browserify@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
+
+os-homedir@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+
+os-tmpdir@^1.0.0, os-tmpdir@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+
+osenv@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.0"
+
+p-limit@^1.1.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
+ dependencies:
+ p-try "^1.0.0"
+
+p-locate@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+ dependencies:
+ p-limit "^1.1.0"
+
+p-try@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+
+pako@~1.0.5:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258"
+
+parallel-transform@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06"
+ dependencies:
+ cyclist "~0.2.2"
+ inherits "^2.0.3"
+ readable-stream "^2.1.5"
+
+parse-asn1@^5.0.0:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8"
+ dependencies:
+ asn1.js "^4.0.0"
+ browserify-aes "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.0"
+ pbkdf2 "^3.0.3"
+
+pascalcase@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+
+path-browserify@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
+
+path-dirname@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
+
+path-exists@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+
+path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+
+pbkdf2@^3.0.3:
+ version "3.0.16"
+ resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c"
+ dependencies:
+ create-hash "^1.1.2"
+ create-hmac "^1.1.4"
+ ripemd160 "^2.0.1"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+pify@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
+
+pkg-dir@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
+ dependencies:
+ find-up "^2.1.0"
+
+posix-character-classes@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+
+private@^0.1.6, private@^0.1.8:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
+
+process-nextick-args@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
+
+process@^0.11.10:
+ version "0.11.10"
+ resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+
+promise-inflight@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
+
+prr@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
+
+pseudomap@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+
+public-encrypt@^4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994"
+ dependencies:
+ bn.js "^4.1.0"
+ browserify-rsa "^4.0.0"
+ create-hash "^1.1.0"
+ parse-asn1 "^5.0.0"
+ randombytes "^2.0.1"
+
+pump@^2.0.0, pump@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909"
+ dependencies:
+ end-of-stream "^1.1.0"
+ once "^1.3.1"
+
+pumpify@^1.3.3:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce"
+ dependencies:
+ duplexify "^3.6.0"
+ inherits "^2.0.3"
+ pump "^2.0.0"
+
+punycode@1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+
+punycode@^1.2.4:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+
+punycode@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+
+querystring-es3@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
+
+querystring@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80"
+ dependencies:
+ safe-buffer "^5.1.0"
+
+randomfill@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
+ dependencies:
+ randombytes "^2.0.5"
+ safe-buffer "^5.1.0"
+
+rc@^1.2.7:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
+ dependencies:
+ deep-extend "^0.6.0"
+ ini "~1.3.0"
+ minimist "^1.2.0"
+ strip-json-comments "~2.0.1"
+
+"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6:
+ version "2.3.6"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.3"
+ isarray "~1.0.0"
+ process-nextick-args "~2.0.0"
+ safe-buffer "~5.1.1"
+ string_decoder "~1.1.1"
+ util-deprecate "~1.0.1"
+
+readdirp@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"
+ dependencies:
+ graceful-fs "^4.1.2"
+ minimatch "^3.0.2"
+ readable-stream "^2.0.2"
+ set-immediate-shim "^1.0.1"
+
+regenerate@^1.2.1:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11"
+
+regenerator-runtime@^0.11.0:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
+
+regenerator-transform@^0.10.0:
+ version "0.10.1"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd"
+ dependencies:
+ babel-runtime "^6.18.0"
+ babel-types "^6.19.0"
+ private "^0.1.6"
+
+regex-not@^1.0.0, regex-not@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+ dependencies:
+ extend-shallow "^3.0.2"
+ safe-regex "^1.1.0"
+
+regexpu-core@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240"
+ dependencies:
+ regenerate "^1.2.1"
+ regjsgen "^0.2.0"
+ regjsparser "^0.1.4"
+
+regjsgen@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7"
+
+regjsparser@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c"
+ dependencies:
+ jsesc "~0.5.0"
+
+remove-trailing-separator@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+
+repeat-element@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
+
+repeat-string@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+
+repeating@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
+ dependencies:
+ is-finite "^1.0.0"
+
+resolve-url@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+
+ret@~0.1.10:
+ version "0.1.15"
+ resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+
+rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
+ dependencies:
+ glob "^7.0.5"
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+
+run-queue@^1.0.0, run-queue@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47"
+ dependencies:
+ aproba "^1.1.1"
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+
+safe-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+ dependencies:
+ ret "~0.1.10"
+
+"safer-buffer@>= 2.1.2 < 3":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+
+sax@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+
+schema-utils@^0.4.4, schema-utils@^0.4.5:
+ version "0.4.5"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e"
+ dependencies:
+ ajv "^6.1.0"
+ ajv-keywords "^3.1.0"
+
+semver@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
+
+serialize-javascript@^1.4.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe"
+
+set-blocking@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+
+set-immediate-shim@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
+
+set-value@^0.4.3:
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.1"
+ to-object-path "^0.3.0"
+
+set-value@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274"
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.3"
+ split-string "^3.0.1"
+
+setimmediate@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+
+sha.js@^2.4.0, sha.js@^2.4.8:
+ version "2.4.11"
+ resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+signal-exit@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
+
+slash@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55"
+
+snapdragon-node@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+ dependencies:
+ define-property "^1.0.0"
+ isobject "^3.0.0"
+ snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+ dependencies:
+ kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
+ dependencies:
+ base "^0.11.1"
+ debug "^2.2.0"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ map-cache "^0.2.2"
+ source-map "^0.5.6"
+ source-map-resolve "^0.5.0"
+ use "^3.1.0"
+
+source-list-map@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085"
+
+source-map-resolve@^0.5.0:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259"
+ dependencies:
+ atob "^2.1.1"
+ decode-uri-component "^0.2.0"
+ resolve-url "^0.2.1"
+ source-map-url "^0.4.0"
+ urix "^0.1.0"
+
+source-map-support@^0.4.15:
+ version "0.4.18"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
+ dependencies:
+ source-map "^0.5.6"
+
+source-map-url@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
+
+source-map@^0.5.6, source-map@^0.5.7:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+
+source-map@^0.6.1, source-map@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+
+split-string@^3.0.1, split-string@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+ dependencies:
+ extend-shallow "^3.0.0"
+
+ssri@^5.2.4:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06"
+ dependencies:
+ safe-buffer "^5.1.1"
+
+static-extend@^0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+ dependencies:
+ define-property "^0.2.5"
+ object-copy "^0.1.0"
+
+stream-browserify@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db"
+ dependencies:
+ inherits "~2.0.1"
+ readable-stream "^2.0.2"
+
+stream-each@^1.1.0:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.2.tgz#8e8c463f91da8991778765873fe4d960d8f616bd"
+ dependencies:
+ end-of-stream "^1.1.0"
+ stream-shift "^1.0.0"
+
+stream-http@^2.7.2:
+ version "2.8.3"
+ resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc"
+ dependencies:
+ builtin-status-codes "^3.0.0"
+ inherits "^2.0.1"
+ readable-stream "^2.3.6"
+ to-arraybuffer "^1.0.0"
+ xtend "^4.0.0"
+
+stream-shift@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952"
+
+string-width@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ strip-ansi "^3.0.0"
+
+"string-width@^1.0.2 || 2":
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^4.0.0"
+
+string_decoder@^1.0.0, string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ dependencies:
+ safe-buffer "~5.1.0"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+ dependencies:
+ ansi-regex "^2.0.0"
+
+strip-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+ dependencies:
+ ansi-regex "^3.0.0"
+
+strip-json-comments@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+
+supports-color@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+
+tapable@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2"
+
+tar@^4:
+ version "4.4.4"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd"
+ dependencies:
+ chownr "^1.0.1"
+ fs-minipass "^1.2.5"
+ minipass "^2.3.3"
+ minizlib "^1.1.0"
+ mkdirp "^0.5.0"
+ safe-buffer "^5.1.2"
+ yallist "^3.0.2"
+
+through2@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
+ dependencies:
+ readable-stream "^2.1.5"
+ xtend "~4.0.1"
+
+timers-browserify@^2.0.4:
+ version "2.0.10"
+ resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae"
+ dependencies:
+ setimmediate "^1.0.4"
+
+to-arraybuffer@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
+
+to-fast-properties@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
+
+to-object-path@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+ dependencies:
+ kind-of "^3.0.2"
+
+to-regex-range@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+ dependencies:
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+
+to-regex@^3.0.1, to-regex@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+ dependencies:
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ regex-not "^1.0.2"
+ safe-regex "^1.1.0"
+
+trim-right@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
+
+tslib@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
+
+tty-browserify@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
+
+typedarray@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+
+uglify-es@^3.3.4:
+ version "3.3.9"
+ resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677"
+ dependencies:
+ commander "~2.13.0"
+ source-map "~0.6.1"
+
+uglifyjs-webpack-plugin@^1.2.4:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.7.tgz#57638dd99c853a1ebfe9d97b42160a8a507f9d00"
+ dependencies:
+ cacache "^10.0.4"
+ find-cache-dir "^1.0.0"
+ schema-utils "^0.4.5"
+ serialize-javascript "^1.4.0"
+ source-map "^0.6.1"
+ uglify-es "^3.3.4"
+ webpack-sources "^1.1.0"
+ worker-farm "^1.5.2"
+
+union-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"
+ dependencies:
+ arr-union "^3.1.0"
+ get-value "^2.0.6"
+ is-extendable "^0.1.1"
+ set-value "^0.4.3"
+
+unique-filename@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3"
+ dependencies:
+ unique-slug "^2.0.0"
+
+unique-slug@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab"
+ dependencies:
+ imurmurhash "^0.1.4"
+
+unset-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+ dependencies:
+ has-value "^0.3.1"
+ isobject "^3.0.0"
+
+upath@^1.0.5:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd"
+
+uri-js@^4.2.1:
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"
+ dependencies:
+ punycode "^2.1.0"
+
+urix@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+
+url@^0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
+ dependencies:
+ punycode "1.3.2"
+ querystring "0.2.0"
+
+use@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
+
+util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+
+util@0.10.3:
+ version "0.10.3"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
+ dependencies:
+ inherits "2.0.1"
+
+util@^0.10.3:
+ version "0.10.4"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901"
+ dependencies:
+ inherits "2.0.3"
+
+vm-browserify@0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
+ dependencies:
+ indexof "0.0.1"
+
+watchpack@^1.5.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00"
+ dependencies:
+ chokidar "^2.0.2"
+ graceful-fs "^4.1.2"
+ neo-async "^2.5.0"
+
+webpack-sources@^1.0.1, webpack-sources@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54"
+ dependencies:
+ source-list-map "^2.0.0"
+ source-map "~0.6.1"
+
+webpack@^4:
+ version "4.16.3"
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.16.3.tgz#861be3176d81e7e3d71c66c8acc9bba35588b525"
+ dependencies:
+ "@webassemblyjs/ast" "1.5.13"
+ "@webassemblyjs/helper-module-context" "1.5.13"
+ "@webassemblyjs/wasm-edit" "1.5.13"
+ "@webassemblyjs/wasm-opt" "1.5.13"
+ "@webassemblyjs/wasm-parser" "1.5.13"
+ acorn "^5.6.2"
+ acorn-dynamic-import "^3.0.0"
+ ajv "^6.1.0"
+ ajv-keywords "^3.1.0"
+ chrome-trace-event "^1.0.0"
+ enhanced-resolve "^4.1.0"
+ eslint-scope "^4.0.0"
+ json-parse-better-errors "^1.0.2"
+ loader-runner "^2.3.0"
+ loader-utils "^1.1.0"
+ memory-fs "~0.4.1"
+ micromatch "^3.1.8"
+ mkdirp "~0.5.0"
+ neo-async "^2.5.0"
+ node-libs-browser "^2.0.0"
+ schema-utils "^0.4.4"
+ tapable "^1.0.0"
+ uglifyjs-webpack-plugin "^1.2.4"
+ watchpack "^1.5.0"
+ webpack-sources "^1.0.1"
+
+wide-align@^1.1.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
+ dependencies:
+ string-width "^1.0.2 || 2"
+
+worker-farm@^1.5.2:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0"
+ dependencies:
+ errno "~0.1.7"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+
+xtend@^4.0.0, xtend@~4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
+
+y18n@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
+
+yallist@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+
+yallist@^3.0.0, yallist@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9"
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack4-babel7/index.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack4-babel7/index.js
new file mode 100644
index 0000000000..dd5eade1eb
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack4-babel7/index.js
@@ -0,0 +1,82 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+const path = require("path");
+const util = require("util");
+const _ = require("lodash");
+const webpack = require("webpack");
+
+const TARGET_NAME = "webpack4-babel7";
+
+module.exports = exports = async function(tests, dirname) {
+ const fixtures = [];
+ for (const [name, input] of tests) {
+ if (/typescript-/.test(name)) {
+ continue;
+ }
+
+ const testFnName = _.camelCase(`${TARGET_NAME}-${name}`);
+ const evalMaps = name.match(/-eval/);
+ const babelEnv = !name.match(/-es6/);
+ const babelModules = name.match(/-cjs/);
+
+ console.log(`Building ${TARGET_NAME} test ${name}`);
+
+ const scriptPath = path.join(dirname, "output", TARGET_NAME, `${name}.js`);
+ const result = await util.promisify(webpack)({
+ mode: "development",
+ context: path.dirname(input),
+ entry: `./${path.basename(input)}`,
+ output: {
+ path: path.dirname(scriptPath),
+ filename: path.basename(scriptPath),
+
+ devtoolModuleFilenameTemplate: `${TARGET_NAME}://./${name}/[resource-path]`,
+
+ libraryTarget: "var",
+ library: testFnName,
+ libraryExport: "default"
+ },
+ devtool: evalMaps ? "eval-source-map" : "source-map",
+ module: {
+ rules: [
+ {
+ test: /\.js$/,
+ exclude: /node_modules/,
+ loader: require.resolve("babel-loader"),
+ options: {
+ babelrc: false,
+ plugins: [
+ require.resolve("@babel/plugin-proposal-class-properties")
+ ],
+ presets: [
+ require.resolve("@babel/preset-flow"),
+ babelEnv
+ ? [
+ require.resolve("@babel/preset-env"),
+ { modules: babelModules ? "commonjs" : false }
+ ]
+ : null
+ ].filter(Boolean)
+ }
+ }
+ ].filter(Boolean)
+ }
+ });
+
+ fixtures.push({
+ name,
+ testFnName: testFnName,
+ scriptPath,
+ assets: [scriptPath, evalMaps ? null : `${scriptPath}.map`].filter(
+ Boolean
+ )
+ });
+ }
+
+ return {
+ target: TARGET_NAME,
+ fixtures
+ };
+};
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack4-babel7/package.json b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack4-babel7/package.json
new file mode 100644
index 0000000000..ee991dd4ea
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack4-babel7/package.json
@@ -0,0 +1,13 @@
+{
+ "name": "sourcemapped-webpack3-babel7",
+ "private": true,
+ "dependencies": {
+ "@babel/core": "^7.0.0-beta.54",
+ "@babel/preset-env": "^7.0.0-beta.54",
+ "@babel/preset-flow": "^7.0.0-beta.54",
+ "babel-loader": "^8.0.0-beta.4",
+ "@babel/plugin-proposal-class-properties": "^7.0.0-beta.54",
+ "lodash": "^4.17.10",
+ "webpack": "^4"
+ }
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack4-babel7/yarn.lock b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack4-babel7/yarn.lock
new file mode 100644
index 0000000000..66f72ad664
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack4-babel7/yarn.lock
@@ -0,0 +1,3047 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@babel/code-frame@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.54.tgz#0024f96fdf7028a21d68e273afd4e953214a1ead"
+ dependencies:
+ "@babel/highlight" "7.0.0-beta.54"
+
+"@babel/code-frame@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-rc.1.tgz#5c2154415d6c09959a71845ef519d11157e95d10"
+ dependencies:
+ "@babel/highlight" "7.0.0-rc.1"
+
+"@babel/core@^7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.0.0-beta.54.tgz#253c54d0095403a5cfa764e7d9b458194692d02b"
+ dependencies:
+ "@babel/code-frame" "7.0.0-beta.54"
+ "@babel/generator" "7.0.0-beta.54"
+ "@babel/helpers" "7.0.0-beta.54"
+ "@babel/parser" "7.0.0-beta.54"
+ "@babel/template" "7.0.0-beta.54"
+ "@babel/traverse" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+ convert-source-map "^1.1.0"
+ debug "^3.1.0"
+ json5 "^0.5.0"
+ lodash "^4.17.5"
+ resolve "^1.3.2"
+ semver "^5.4.1"
+ source-map "^0.5.0"
+
+"@babel/generator@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.54.tgz#c043c7eebeebfd7e665d95c281a4aafc83d4e1c9"
+ dependencies:
+ "@babel/types" "7.0.0-beta.54"
+ jsesc "^2.5.1"
+ lodash "^4.17.5"
+ source-map "^0.5.0"
+ trim-right "^1.0.1"
+
+"@babel/generator@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-rc.1.tgz#739c87d70b31aeed802bd6bc9fd51480065c45e8"
+ dependencies:
+ "@babel/types" "7.0.0-rc.1"
+ jsesc "^2.5.1"
+ lodash "^4.17.10"
+ source-map "^0.5.0"
+ trim-right "^1.0.1"
+
+"@babel/helper-annotate-as-pure@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0-beta.54.tgz#1626126a3f9fc4ed280ac942372c7d39653d7121"
+ dependencies:
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helper-builder-binary-assignment-operator-visitor@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.0.0-beta.54.tgz#d0a1967635b9eebcafdba80491917ee4981c12fa"
+ dependencies:
+ "@babel/helper-explode-assignable-expression" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helper-call-delegate@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.0.0-beta.54.tgz#f6b72cfd832fb26eb2a806e18de05f88d3a8f302"
+ dependencies:
+ "@babel/helper-hoist-variables" "7.0.0-beta.54"
+ "@babel/traverse" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helper-define-map@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.0.0-beta.54.tgz#2036d7c49365987f091db9702ce2f3b55f677730"
+ dependencies:
+ "@babel/helper-function-name" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+ lodash "^4.17.5"
+
+"@babel/helper-explode-assignable-expression@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.0.0-beta.54.tgz#cf067f3330965c2048bf087ea06f62c76d94a792"
+ dependencies:
+ "@babel/traverse" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helper-function-name@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.54.tgz#307875507a1eda2482a09a9a4df6a25632ffb34b"
+ dependencies:
+ "@babel/helper-get-function-arity" "7.0.0-beta.54"
+ "@babel/template" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helper-function-name@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-rc.1.tgz#20b2cc836a53c669f297c8d309fc553385c5cdde"
+ dependencies:
+ "@babel/helper-get-function-arity" "7.0.0-rc.1"
+ "@babel/template" "7.0.0-rc.1"
+ "@babel/types" "7.0.0-rc.1"
+
+"@babel/helper-get-function-arity@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.54.tgz#757bd189b077074a004028cfde5f083c306cc6c4"
+ dependencies:
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helper-get-function-arity@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-rc.1.tgz#60185957f72ed73766ce74c836ac574921743c46"
+ dependencies:
+ "@babel/types" "7.0.0-rc.1"
+
+"@babel/helper-hoist-variables@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0-beta.54.tgz#8635be8095135ff73f753ed189e449f68b4f43cb"
+ dependencies:
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helper-member-expression-to-functions@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0-beta.54.tgz#bce9ddc484317b13d2615bafe2b524d0d56d99df"
+ dependencies:
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helper-member-expression-to-functions@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0-rc.1.tgz#03a3b200fc00f8100dbcef9a351b69cfc0234b4f"
+ dependencies:
+ "@babel/types" "7.0.0-rc.1"
+
+"@babel/helper-module-imports@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0-beta.54.tgz#c2d8e14ff034225bf431356db77ef467b8d35aac"
+ dependencies:
+ "@babel/types" "7.0.0-beta.54"
+ lodash "^4.17.5"
+
+"@babel/helper-module-transforms@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.0.0-beta.54.tgz#8cc57eb0db5f0945d866524d555abd084e30cc35"
+ dependencies:
+ "@babel/helper-module-imports" "7.0.0-beta.54"
+ "@babel/helper-simple-access" "7.0.0-beta.54"
+ "@babel/helper-split-export-declaration" "7.0.0-beta.54"
+ "@babel/template" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+ lodash "^4.17.5"
+
+"@babel/helper-optimise-call-expression@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0-beta.54.tgz#4af8dd4ff90dbd29b3bcf85fff43952e2ae1016e"
+ dependencies:
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helper-optimise-call-expression@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0-rc.1.tgz#482d8251870f61d88c9800fd3e58128e14ff8c98"
+ dependencies:
+ "@babel/types" "7.0.0-rc.1"
+
+"@babel/helper-plugin-utils@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0-beta.54.tgz#61d2a9a0f9a3e31838a458debb9eebd7bdd249b4"
+
+"@babel/helper-plugin-utils@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0-rc.1.tgz#3e277eae59818e7d4caf4174f58a7a00d441336e"
+
+"@babel/helper-regex@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.0.0-beta.54.tgz#8ac562f855f132fc68dfd10b132552555ac870d9"
+ dependencies:
+ lodash "^4.17.5"
+
+"@babel/helper-remap-async-to-generator@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.0.0-beta.54.tgz#39a50052aadd74d40c73b7c58eb963b90fac56d3"
+ dependencies:
+ "@babel/helper-annotate-as-pure" "7.0.0-beta.54"
+ "@babel/helper-wrap-function" "7.0.0-beta.54"
+ "@babel/template" "7.0.0-beta.54"
+ "@babel/traverse" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helper-replace-supers@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.0.0-beta.54.tgz#901f5a1493a410799fd3ab3e0c0d29d18071c89f"
+ dependencies:
+ "@babel/helper-member-expression-to-functions" "7.0.0-beta.54"
+ "@babel/helper-optimise-call-expression" "7.0.0-beta.54"
+ "@babel/traverse" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helper-replace-supers@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.0.0-rc.1.tgz#cab8d7a6c758e4561fb285f4725c850d68c1c3db"
+ dependencies:
+ "@babel/helper-member-expression-to-functions" "7.0.0-rc.1"
+ "@babel/helper-optimise-call-expression" "7.0.0-rc.1"
+ "@babel/traverse" "7.0.0-rc.1"
+ "@babel/types" "7.0.0-rc.1"
+
+"@babel/helper-simple-access@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.0.0-beta.54.tgz#5f760a19589a9b6f07e80a65ef4bcbd4fba8c253"
+ dependencies:
+ "@babel/template" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+ lodash "^4.17.5"
+
+"@babel/helper-split-export-declaration@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.54.tgz#89cd8833c95481a0827ac6a1bfccddb92b75a109"
+ dependencies:
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helper-split-export-declaration@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-rc.1.tgz#b00323834343fd0210f1f46c7a53521ad53efa5e"
+ dependencies:
+ "@babel/types" "7.0.0-rc.1"
+
+"@babel/helper-wrap-function@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.0.0-beta.54.tgz#dc1b7a483a3074a3531b36523e03156d910a3a2a"
+ dependencies:
+ "@babel/helper-function-name" "7.0.0-beta.54"
+ "@babel/template" "7.0.0-beta.54"
+ "@babel/traverse" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/helpers@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.0.0-beta.54.tgz#b86a99a80efd81668caef307610b961197446a74"
+ dependencies:
+ "@babel/template" "7.0.0-beta.54"
+ "@babel/traverse" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+
+"@babel/highlight@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.54.tgz#155d507358329b8e7068970017c3fd74a9b08584"
+ dependencies:
+ chalk "^2.0.0"
+ esutils "^2.0.2"
+ js-tokens "^3.0.0"
+
+"@babel/highlight@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-rc.1.tgz#e0ca4731fa4786f7b9500421d6ff5e5a7753e81e"
+ dependencies:
+ chalk "^2.0.0"
+ esutils "^2.0.2"
+ js-tokens "^3.0.0"
+
+"@babel/parser@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.0.0-beta.54.tgz#c01aa63b57c9c8dce8744796c81d9df121f20db4"
+
+"@babel/parser@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.0.0-rc.1.tgz#d009a9bba8175d7b971e30cd03535b278c44082d"
+
+"@babel/plugin-proposal-async-generator-functions@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.0.0-beta.54.tgz#19871bd655b5d748b0ae3e9ecebe247be8b7f83b"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/helper-remap-async-to-generator" "7.0.0-beta.54"
+ "@babel/plugin-syntax-async-generators" "7.0.0-beta.54"
+
+"@babel/plugin-proposal-class-properties@^7.0.0-beta.54":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.0.0-rc.1.tgz#88b3d3b257b9ed53fae50b13103e4c3c725e704e"
+ dependencies:
+ "@babel/helper-function-name" "7.0.0-rc.1"
+ "@babel/helper-member-expression-to-functions" "7.0.0-rc.1"
+ "@babel/helper-optimise-call-expression" "7.0.0-rc.1"
+ "@babel/helper-plugin-utils" "7.0.0-rc.1"
+ "@babel/helper-replace-supers" "7.0.0-rc.1"
+ "@babel/plugin-syntax-class-properties" "7.0.0-rc.1"
+
+"@babel/plugin-proposal-object-rest-spread@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.0.0-beta.54.tgz#5481269a020dd0d38715a8094fed015d30ef4c2a"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/plugin-syntax-object-rest-spread" "7.0.0-beta.54"
+
+"@babel/plugin-proposal-optional-catch-binding@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.0.0-beta.54.tgz#931f69298fa0c411b2596616cf5a1d82925b87a9"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/plugin-syntax-optional-catch-binding" "7.0.0-beta.54"
+
+"@babel/plugin-proposal-unicode-property-regex@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.0.0-beta.54.tgz#1624631faf688bcbde4918712bd0af7186f7d245"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/helper-regex" "7.0.0-beta.54"
+ regexpu-core "^4.2.0"
+
+"@babel/plugin-syntax-async-generators@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.0.0-beta.54.tgz#ffac8f64927614762897cc9643495fd38097dd41"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-syntax-class-properties@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.0.0-rc.1.tgz#155343e256c84d127496e46675a3049636d311ff"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-rc.1"
+
+"@babel/plugin-syntax-flow@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.0.0-beta.54.tgz#8d38fffa6da16e2d327f5fee4f90913b14d43d14"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-syntax-object-rest-spread@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.0.0-beta.54.tgz#e0f445612081ab573e2535adbabc7b710d17940c"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-syntax-optional-catch-binding@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.0.0-beta.54.tgz#2eb8ddde19ddf73a343d087a087159ed44e54809"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-arrow-functions@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.0.0-beta.54.tgz#44a977b8e61e4efcc7658bbbe260f204ca1bcf72"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-async-to-generator@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.0.0-beta.54.tgz#d035e65c50884937d64dbe68d16498c032f8bbec"
+ dependencies:
+ "@babel/helper-module-imports" "7.0.0-beta.54"
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/helper-remap-async-to-generator" "7.0.0-beta.54"
+
+"@babel/plugin-transform-block-scoped-functions@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.0.0-beta.54.tgz#938a77fb12f0e11661bdf5386e4aeca47f0c053b"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-block-scoping@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.0.0-beta.54.tgz#bcae1c2ffae4cc3b7b3e5455f0a98daecc09a3c6"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ lodash "^4.17.5"
+
+"@babel/plugin-transform-classes@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.0.0-beta.54.tgz#b15781d2e499ce25438e73fea2fa5a09858568ff"
+ dependencies:
+ "@babel/helper-annotate-as-pure" "7.0.0-beta.54"
+ "@babel/helper-define-map" "7.0.0-beta.54"
+ "@babel/helper-function-name" "7.0.0-beta.54"
+ "@babel/helper-optimise-call-expression" "7.0.0-beta.54"
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/helper-replace-supers" "7.0.0-beta.54"
+ "@babel/helper-split-export-declaration" "7.0.0-beta.54"
+ globals "^11.1.0"
+
+"@babel/plugin-transform-computed-properties@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.0.0-beta.54.tgz#b28494942b94fb86d01994763d2b5c43bdd986af"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-destructuring@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.0.0-beta.54.tgz#81f649a3e4fcb62c2b2ad497f783a800b994472f"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-dotall-regex@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.0.0-beta.54.tgz#2835b7f4141b19fa0648eb96ffe3c4fccd1eca20"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/helper-regex" "7.0.0-beta.54"
+ regexpu-core "^4.1.3"
+
+"@babel/plugin-transform-duplicate-keys@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.0.0-beta.54.tgz#4b8f4fb349902a800679191f59d0fa53fca49400"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-exponentiation-operator@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.0.0-beta.54.tgz#1017096366fb43ebca8ed8d8d0cdd1ebd64febb2"
+ dependencies:
+ "@babel/helper-builder-binary-assignment-operator-visitor" "7.0.0-beta.54"
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-flow-strip-types@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.0.0-beta.54.tgz#3612fa3935e60df6eaae66a33d24fc31b58cc919"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/plugin-syntax-flow" "7.0.0-beta.54"
+
+"@babel/plugin-transform-for-of@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.0.0-beta.54.tgz#261d2992058a9e09234b9ff67820054ffc55f79c"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-function-name@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.0.0-beta.54.tgz#cc722f9973931337def3d1e6c55138581edd371e"
+ dependencies:
+ "@babel/helper-function-name" "7.0.0-beta.54"
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-literals@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.0.0-beta.54.tgz#70f07ecc2f3b7bc9f542a578e82eec18a5504098"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-modules-amd@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.0.0-beta.54.tgz#fb50740741420bb485ee1315d2e1133db4e433d2"
+ dependencies:
+ "@babel/helper-module-transforms" "7.0.0-beta.54"
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-modules-commonjs@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.0.0-beta.54.tgz#07d912a7a24dad2d9bf5d44ce322ddc457a8db37"
+ dependencies:
+ "@babel/helper-module-transforms" "7.0.0-beta.54"
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/helper-simple-access" "7.0.0-beta.54"
+
+"@babel/plugin-transform-modules-systemjs@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.0.0-beta.54.tgz#0923f012ac252e037467245ff27f8954f4ce6803"
+ dependencies:
+ "@babel/helper-hoist-variables" "7.0.0-beta.54"
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-modules-umd@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.0.0-beta.54.tgz#3af0e2cf8f533b2984a8ca6da316246850c3aeda"
+ dependencies:
+ "@babel/helper-module-transforms" "7.0.0-beta.54"
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-new-target@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0-beta.54.tgz#634ee57fa805720195cd31086c973f1fc5c9949b"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-object-super@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.0.0-beta.54.tgz#d25fad66eff90de03ee62f8384f0af57bcd065d9"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/helper-replace-supers" "7.0.0-beta.54"
+
+"@babel/plugin-transform-parameters@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.0.0-beta.54.tgz#76306f19b9acac6cf13721af15ecb9f382864ff7"
+ dependencies:
+ "@babel/helper-call-delegate" "7.0.0-beta.54"
+ "@babel/helper-get-function-arity" "7.0.0-beta.54"
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-regenerator@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0-beta.54.tgz#8b46e192f3bfe096bbbf86e27764e7662e5f9a0f"
+ dependencies:
+ regenerator-transform "^0.13.3"
+
+"@babel/plugin-transform-shorthand-properties@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.0.0-beta.54.tgz#50e73c2afc5898b1055510ddf60ee13a6301517f"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-spread@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.0.0-beta.54.tgz#4f0852df0f4b1db2426c40facd8fe5f028a3dbc9"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-sticky-regex@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.0.0-beta.54.tgz#568f35eb5118ae96fad82eac36374d7923b47883"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/helper-regex" "7.0.0-beta.54"
+
+"@babel/plugin-transform-template-literals@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.0.0-beta.54.tgz#cb1f6303cafb8442a6c6c69a0dfbb60699f327bc"
+ dependencies:
+ "@babel/helper-annotate-as-pure" "7.0.0-beta.54"
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-typeof-symbol@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.0.0-beta.54.tgz#6d068686239c9ebaf534d1c0d8032953f7b521bc"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+
+"@babel/plugin-transform-unicode-regex@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.0.0-beta.54.tgz#1dc7e9150b39aaeb19fca1c863e082f6096afc60"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/helper-regex" "7.0.0-beta.54"
+ regexpu-core "^4.1.3"
+
+"@babel/preset-env@^7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.0.0-beta.54.tgz#4b05c4e3aaed64a509098e4e854dfc0e02edf053"
+ dependencies:
+ "@babel/helper-module-imports" "7.0.0-beta.54"
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/plugin-proposal-async-generator-functions" "7.0.0-beta.54"
+ "@babel/plugin-proposal-object-rest-spread" "7.0.0-beta.54"
+ "@babel/plugin-proposal-optional-catch-binding" "7.0.0-beta.54"
+ "@babel/plugin-proposal-unicode-property-regex" "7.0.0-beta.54"
+ "@babel/plugin-syntax-async-generators" "7.0.0-beta.54"
+ "@babel/plugin-syntax-object-rest-spread" "7.0.0-beta.54"
+ "@babel/plugin-syntax-optional-catch-binding" "7.0.0-beta.54"
+ "@babel/plugin-transform-arrow-functions" "7.0.0-beta.54"
+ "@babel/plugin-transform-async-to-generator" "7.0.0-beta.54"
+ "@babel/plugin-transform-block-scoped-functions" "7.0.0-beta.54"
+ "@babel/plugin-transform-block-scoping" "7.0.0-beta.54"
+ "@babel/plugin-transform-classes" "7.0.0-beta.54"
+ "@babel/plugin-transform-computed-properties" "7.0.0-beta.54"
+ "@babel/plugin-transform-destructuring" "7.0.0-beta.54"
+ "@babel/plugin-transform-dotall-regex" "7.0.0-beta.54"
+ "@babel/plugin-transform-duplicate-keys" "7.0.0-beta.54"
+ "@babel/plugin-transform-exponentiation-operator" "7.0.0-beta.54"
+ "@babel/plugin-transform-for-of" "7.0.0-beta.54"
+ "@babel/plugin-transform-function-name" "7.0.0-beta.54"
+ "@babel/plugin-transform-literals" "7.0.0-beta.54"
+ "@babel/plugin-transform-modules-amd" "7.0.0-beta.54"
+ "@babel/plugin-transform-modules-commonjs" "7.0.0-beta.54"
+ "@babel/plugin-transform-modules-systemjs" "7.0.0-beta.54"
+ "@babel/plugin-transform-modules-umd" "7.0.0-beta.54"
+ "@babel/plugin-transform-new-target" "7.0.0-beta.54"
+ "@babel/plugin-transform-object-super" "7.0.0-beta.54"
+ "@babel/plugin-transform-parameters" "7.0.0-beta.54"
+ "@babel/plugin-transform-regenerator" "7.0.0-beta.54"
+ "@babel/plugin-transform-shorthand-properties" "7.0.0-beta.54"
+ "@babel/plugin-transform-spread" "7.0.0-beta.54"
+ "@babel/plugin-transform-sticky-regex" "7.0.0-beta.54"
+ "@babel/plugin-transform-template-literals" "7.0.0-beta.54"
+ "@babel/plugin-transform-typeof-symbol" "7.0.0-beta.54"
+ "@babel/plugin-transform-unicode-regex" "7.0.0-beta.54"
+ browserslist "^3.0.0"
+ invariant "^2.2.2"
+ js-levenshtein "^1.1.3"
+ semver "^5.3.0"
+
+"@babel/preset-flow@^7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.0.0-beta.54.tgz#7a6f5b75297047ec36d5b3fd0b5009d59bb4240f"
+ dependencies:
+ "@babel/helper-plugin-utils" "7.0.0-beta.54"
+ "@babel/plugin-transform-flow-strip-types" "7.0.0-beta.54"
+
+"@babel/template@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.54.tgz#d5b0d2d2d55c0e78b048c61a058f36cfd7d91af3"
+ dependencies:
+ "@babel/code-frame" "7.0.0-beta.54"
+ "@babel/parser" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+ lodash "^4.17.5"
+
+"@babel/template@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-rc.1.tgz#5f9c0a481c9f22ecdb84697b3c3a34eadeeca23c"
+ dependencies:
+ "@babel/code-frame" "7.0.0-rc.1"
+ "@babel/parser" "7.0.0-rc.1"
+ "@babel/types" "7.0.0-rc.1"
+ lodash "^4.17.10"
+
+"@babel/traverse@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.54.tgz#2c17f98dcdbf19aa918fde128f0e1a0bc089e05a"
+ dependencies:
+ "@babel/code-frame" "7.0.0-beta.54"
+ "@babel/generator" "7.0.0-beta.54"
+ "@babel/helper-function-name" "7.0.0-beta.54"
+ "@babel/helper-split-export-declaration" "7.0.0-beta.54"
+ "@babel/parser" "7.0.0-beta.54"
+ "@babel/types" "7.0.0-beta.54"
+ debug "^3.1.0"
+ globals "^11.1.0"
+ lodash "^4.17.5"
+
+"@babel/traverse@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-rc.1.tgz#867b4b45ada2d51ae2d0076f1c1d5880f8557158"
+ dependencies:
+ "@babel/code-frame" "7.0.0-rc.1"
+ "@babel/generator" "7.0.0-rc.1"
+ "@babel/helper-function-name" "7.0.0-rc.1"
+ "@babel/helper-split-export-declaration" "7.0.0-rc.1"
+ "@babel/parser" "7.0.0-rc.1"
+ "@babel/types" "7.0.0-rc.1"
+ debug "^3.1.0"
+ globals "^11.1.0"
+ lodash "^4.17.10"
+
+"@babel/types@7.0.0-beta.54":
+ version "7.0.0-beta.54"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.54.tgz#025ad68492fed542c13f14c579a44c848e531063"
+ dependencies:
+ esutils "^2.0.2"
+ lodash "^4.17.5"
+ to-fast-properties "^2.0.0"
+
+"@babel/types@7.0.0-rc.1":
+ version "7.0.0-rc.1"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-rc.1.tgz#6abf6d14ddd9fc022617e5b62e6b32f4fa6526ad"
+ dependencies:
+ esutils "^2.0.2"
+ lodash "^4.17.10"
+ to-fast-properties "^2.0.0"
+
+"@webassemblyjs/ast@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.5.13.tgz#81155a570bd5803a30ec31436bc2c9c0ede38f25"
+ dependencies:
+ "@webassemblyjs/helper-module-context" "1.5.13"
+ "@webassemblyjs/helper-wasm-bytecode" "1.5.13"
+ "@webassemblyjs/wast-parser" "1.5.13"
+ debug "^3.1.0"
+ mamacro "^0.0.3"
+
+"@webassemblyjs/floating-point-hex-parser@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.5.13.tgz#29ce0baa97411f70e8cce68ce9c0f9d819a4e298"
+
+"@webassemblyjs/helper-api-error@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.5.13.tgz#e49b051d67ee19a56e29b9aa8bd949b5b4442a59"
+
+"@webassemblyjs/helper-buffer@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.5.13.tgz#873bb0a1b46449231137c1262ddfd05695195a1e"
+ dependencies:
+ debug "^3.1.0"
+
+"@webassemblyjs/helper-code-frame@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.5.13.tgz#1bd2181b6a0be14e004f0fe9f5a660d265362b58"
+ dependencies:
+ "@webassemblyjs/wast-printer" "1.5.13"
+
+"@webassemblyjs/helper-fsm@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.5.13.tgz#cdf3d9d33005d543a5c5e5adaabf679ffa8db924"
+
+"@webassemblyjs/helper-module-context@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.5.13.tgz#dc29ddfb51ed657655286f94a5d72d8a489147c5"
+ dependencies:
+ debug "^3.1.0"
+ mamacro "^0.0.3"
+
+"@webassemblyjs/helper-wasm-bytecode@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.5.13.tgz#03245817f0a762382e61733146f5773def15a747"
+
+"@webassemblyjs/helper-wasm-section@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.5.13.tgz#efc76f44a10d3073b584b43c38a179df173d5c7d"
+ dependencies:
+ "@webassemblyjs/ast" "1.5.13"
+ "@webassemblyjs/helper-buffer" "1.5.13"
+ "@webassemblyjs/helper-wasm-bytecode" "1.5.13"
+ "@webassemblyjs/wasm-gen" "1.5.13"
+ debug "^3.1.0"
+
+"@webassemblyjs/ieee754@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.5.13.tgz#573e97c8c12e4eebb316ca5fde0203ddd90b0364"
+ dependencies:
+ ieee754 "^1.1.11"
+
+"@webassemblyjs/leb128@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.5.13.tgz#ab52ebab9cec283c1c1897ac1da833a04a3f4cee"
+ dependencies:
+ long "4.0.0"
+
+"@webassemblyjs/utf8@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.5.13.tgz#6b53d2cd861cf94fa99c1f12779dde692fbc2469"
+
+"@webassemblyjs/wasm-edit@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.5.13.tgz#c9cef5664c245cf11b3b3a73110c9155831724a8"
+ dependencies:
+ "@webassemblyjs/ast" "1.5.13"
+ "@webassemblyjs/helper-buffer" "1.5.13"
+ "@webassemblyjs/helper-wasm-bytecode" "1.5.13"
+ "@webassemblyjs/helper-wasm-section" "1.5.13"
+ "@webassemblyjs/wasm-gen" "1.5.13"
+ "@webassemblyjs/wasm-opt" "1.5.13"
+ "@webassemblyjs/wasm-parser" "1.5.13"
+ "@webassemblyjs/wast-printer" "1.5.13"
+ debug "^3.1.0"
+
+"@webassemblyjs/wasm-gen@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.5.13.tgz#8e6ea113c4b432fa66540189e79b16d7a140700e"
+ dependencies:
+ "@webassemblyjs/ast" "1.5.13"
+ "@webassemblyjs/helper-wasm-bytecode" "1.5.13"
+ "@webassemblyjs/ieee754" "1.5.13"
+ "@webassemblyjs/leb128" "1.5.13"
+ "@webassemblyjs/utf8" "1.5.13"
+
+"@webassemblyjs/wasm-opt@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.5.13.tgz#147aad7717a7ee4211c36b21a5f4c30dddf33138"
+ dependencies:
+ "@webassemblyjs/ast" "1.5.13"
+ "@webassemblyjs/helper-buffer" "1.5.13"
+ "@webassemblyjs/wasm-gen" "1.5.13"
+ "@webassemblyjs/wasm-parser" "1.5.13"
+ debug "^3.1.0"
+
+"@webassemblyjs/wasm-parser@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.5.13.tgz#6f46516c5bb23904fbdf58009233c2dd8a54c72f"
+ dependencies:
+ "@webassemblyjs/ast" "1.5.13"
+ "@webassemblyjs/helper-api-error" "1.5.13"
+ "@webassemblyjs/helper-wasm-bytecode" "1.5.13"
+ "@webassemblyjs/ieee754" "1.5.13"
+ "@webassemblyjs/leb128" "1.5.13"
+ "@webassemblyjs/utf8" "1.5.13"
+
+"@webassemblyjs/wast-parser@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.5.13.tgz#5727a705d397ae6a3ae99d7f5460acf2ec646eea"
+ dependencies:
+ "@webassemblyjs/ast" "1.5.13"
+ "@webassemblyjs/floating-point-hex-parser" "1.5.13"
+ "@webassemblyjs/helper-api-error" "1.5.13"
+ "@webassemblyjs/helper-code-frame" "1.5.13"
+ "@webassemblyjs/helper-fsm" "1.5.13"
+ long "^3.2.0"
+ mamacro "^0.0.3"
+
+"@webassemblyjs/wast-printer@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.5.13.tgz#bb34d528c14b4f579e7ec11e793ec50ad7cd7c95"
+ dependencies:
+ "@webassemblyjs/ast" "1.5.13"
+ "@webassemblyjs/wast-parser" "1.5.13"
+ long "^3.2.0"
+
+abbrev@1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+
+acorn-dynamic-import@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278"
+ dependencies:
+ acorn "^5.0.0"
+
+acorn@^5.0.0, acorn@^5.6.2:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8"
+
+ajv-keywords@^3.1.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a"
+
+ajv@^6.1.0:
+ version "6.5.2"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.2.tgz#678495f9b82f7cca6be248dd92f59bff5e1f4360"
+ dependencies:
+ fast-deep-equal "^2.0.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.1"
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+
+ansi-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+
+ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ dependencies:
+ color-convert "^1.9.0"
+
+anymatch@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
+ dependencies:
+ micromatch "^3.1.4"
+ normalize-path "^2.1.1"
+
+aproba@^1.0.3, aproba@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
+
+are-we-there-yet@~1.1.2:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
+ dependencies:
+ delegates "^1.0.0"
+ readable-stream "^2.0.6"
+
+arr-diff@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+
+arr-flatten@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+
+arr-union@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+
+array-unique@^0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+
+asn1.js@^4.0.0:
+ version "4.10.1"
+ resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"
+ dependencies:
+ bn.js "^4.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+assert@^1.1.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91"
+ dependencies:
+ util "0.10.3"
+
+assign-symbols@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+
+async-each@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
+
+atob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a"
+
+babel-loader@^8.0.0-beta.4:
+ version "8.0.0-beta.4"
+ resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.0-beta.4.tgz#c3fab00696c385c70c04dbe486391f0eb996f345"
+ dependencies:
+ find-cache-dir "^1.0.0"
+ loader-utils "^1.0.2"
+ mkdirp "^0.5.1"
+ util.promisify "^1.0.0"
+
+balanced-match@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+
+base64-js@^1.0.2:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3"
+
+base@^0.11.1:
+ version "0.11.2"
+ resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+ dependencies:
+ cache-base "^1.0.1"
+ class-utils "^0.3.5"
+ component-emitter "^1.2.1"
+ define-property "^1.0.0"
+ isobject "^3.0.1"
+ mixin-deep "^1.2.0"
+ pascalcase "^0.1.1"
+
+big.js@^3.1.3:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
+
+binary-extensions@^1.0.0:
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205"
+
+bluebird@^3.5.1:
+ version "3.5.1"
+ resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
+ version "4.11.8"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+braces@^2.3.0, braces@^2.3.1:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+ dependencies:
+ arr-flatten "^1.1.0"
+ array-unique "^0.3.2"
+ extend-shallow "^2.0.1"
+ fill-range "^4.0.0"
+ isobject "^3.0.1"
+ repeat-element "^1.1.2"
+ snapdragon "^0.8.1"
+ snapdragon-node "^2.0.1"
+ split-string "^3.0.2"
+ to-regex "^3.0.1"
+
+brorand@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
+ dependencies:
+ buffer-xor "^1.0.3"
+ cipher-base "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.3"
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+browserify-cipher@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
+ dependencies:
+ browserify-aes "^1.0.4"
+ browserify-des "^1.0.0"
+ evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c"
+ dependencies:
+ cipher-base "^1.0.1"
+ des.js "^1.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+browserify-rsa@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
+ dependencies:
+ bn.js "^4.1.0"
+ randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
+ dependencies:
+ bn.js "^4.1.1"
+ browserify-rsa "^4.0.0"
+ create-hash "^1.1.0"
+ create-hmac "^1.1.2"
+ elliptic "^6.0.0"
+ inherits "^2.0.1"
+ parse-asn1 "^5.0.0"
+
+browserify-zlib@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
+ dependencies:
+ pako "~1.0.5"
+
+browserslist@^3.0.0:
+ version "3.2.8"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6"
+ dependencies:
+ caniuse-lite "^1.0.30000844"
+ electron-to-chromium "^1.3.47"
+
+buffer-from@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04"
+
+buffer-xor@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+
+buffer@^4.3.0:
+ version "4.9.1"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298"
+ dependencies:
+ base64-js "^1.0.2"
+ ieee754 "^1.1.4"
+ isarray "^1.0.0"
+
+builtin-status-codes@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
+
+cacache@^10.0.4:
+ version "10.0.4"
+ resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460"
+ dependencies:
+ bluebird "^3.5.1"
+ chownr "^1.0.1"
+ glob "^7.1.2"
+ graceful-fs "^4.1.11"
+ lru-cache "^4.1.1"
+ mississippi "^2.0.0"
+ mkdirp "^0.5.1"
+ move-concurrently "^1.0.1"
+ promise-inflight "^1.0.1"
+ rimraf "^2.6.2"
+ ssri "^5.2.4"
+ unique-filename "^1.1.0"
+ y18n "^4.0.0"
+
+cache-base@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+ dependencies:
+ collection-visit "^1.0.0"
+ component-emitter "^1.2.1"
+ get-value "^2.0.6"
+ has-value "^1.0.0"
+ isobject "^3.0.1"
+ set-value "^2.0.0"
+ to-object-path "^0.3.0"
+ union-value "^1.0.0"
+ unset-value "^1.0.0"
+
+caniuse-lite@^1.0.30000844:
+ version "1.0.30000865"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz#70026616e8afe6e1442f8bb4e1092987d81a2f25"
+
+chalk@^2.0.0:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e"
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chokidar@^2.0.2:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26"
+ dependencies:
+ anymatch "^2.0.0"
+ async-each "^1.0.0"
+ braces "^2.3.0"
+ glob-parent "^3.1.0"
+ inherits "^2.0.1"
+ is-binary-path "^1.0.0"
+ is-glob "^4.0.0"
+ lodash.debounce "^4.0.8"
+ normalize-path "^2.1.1"
+ path-is-absolute "^1.0.0"
+ readdirp "^2.0.0"
+ upath "^1.0.5"
+ optionalDependencies:
+ fsevents "^1.2.2"
+
+chownr@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181"
+
+chrome-trace-event@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48"
+ dependencies:
+ tslib "^1.9.0"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+class-utils@^0.3.5:
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+ dependencies:
+ arr-union "^3.1.0"
+ define-property "^0.2.5"
+ isobject "^3.0.0"
+ static-extend "^0.1.1"
+
+code-point-at@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+
+collection-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+ dependencies:
+ map-visit "^1.0.0"
+ object-visit "^1.0.0"
+
+color-convert@^1.9.0:
+ version "1.9.2"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147"
+ dependencies:
+ color-name "1.1.1"
+
+color-name@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689"
+
+commander@~2.13.0:
+ version "2.13.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c"
+
+commondir@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
+
+component-emitter@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+
+concat-stream@^1.5.0:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
+ dependencies:
+ buffer-from "^1.0.0"
+ inherits "^2.0.3"
+ readable-stream "^2.2.2"
+ typedarray "^0.0.6"
+
+console-browserify@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
+ dependencies:
+ date-now "^0.1.4"
+
+console-control-strings@^1.0.0, console-control-strings@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+
+constants-browserify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
+
+convert-source-map@^1.1.0:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5"
+
+copy-concurrently@^1.0.0:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0"
+ dependencies:
+ aproba "^1.1.1"
+ fs-write-stream-atomic "^1.0.8"
+ iferr "^0.1.5"
+ mkdirp "^0.5.1"
+ rimraf "^2.5.4"
+ run-queue "^1.0.0"
+
+copy-descriptor@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+
+core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+
+create-ecdh@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff"
+ dependencies:
+ bn.js "^4.1.0"
+ elliptic "^6.0.0"
+
+create-hash@^1.1.0, create-hash@^1.1.2:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
+ dependencies:
+ cipher-base "^1.0.1"
+ inherits "^2.0.1"
+ md5.js "^1.3.4"
+ ripemd160 "^2.0.1"
+ sha.js "^2.4.0"
+
+create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
+ dependencies:
+ cipher-base "^1.0.3"
+ create-hash "^1.1.0"
+ inherits "^2.0.1"
+ ripemd160 "^2.0.0"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+crypto-browserify@^3.11.0:
+ version "3.12.0"
+ resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
+ dependencies:
+ browserify-cipher "^1.0.0"
+ browserify-sign "^4.0.0"
+ create-ecdh "^4.0.0"
+ create-hash "^1.1.0"
+ create-hmac "^1.1.0"
+ diffie-hellman "^5.0.0"
+ inherits "^2.0.1"
+ pbkdf2 "^3.0.3"
+ public-encrypt "^4.0.0"
+ randombytes "^2.0.0"
+ randomfill "^1.0.3"
+
+cyclist@~0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640"
+
+date-now@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
+
+debug@^2.1.2, debug@^2.2.0, debug@^2.3.3:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ dependencies:
+ ms "2.0.0"
+
+debug@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
+ dependencies:
+ ms "2.0.0"
+
+decode-uri-component@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+
+deep-extend@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
+
+define-properties@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94"
+ dependencies:
+ foreach "^2.0.5"
+ object-keys "^1.0.8"
+
+define-property@^0.2.5:
+ version "0.2.5"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+ dependencies:
+ is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+ dependencies:
+ is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+ dependencies:
+ is-descriptor "^1.0.2"
+ isobject "^3.0.1"
+
+delegates@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+
+des.js@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
+ dependencies:
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+detect-libc@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
+
+diffie-hellman@^5.0.0:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
+ dependencies:
+ bn.js "^4.1.0"
+ miller-rabin "^4.0.0"
+ randombytes "^2.0.0"
+
+domain-browser@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
+
+duplexify@^3.4.2, duplexify@^3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.0.tgz#592903f5d80b38d037220541264d69a198fb3410"
+ dependencies:
+ end-of-stream "^1.0.0"
+ inherits "^2.0.1"
+ readable-stream "^2.0.0"
+ stream-shift "^1.0.0"
+
+electron-to-chromium@^1.3.47:
+ version "1.3.52"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.52.tgz#d2d9f1270ba4a3b967b831c40ef71fb4d9ab5ce0"
+
+elliptic@^6.0.0:
+ version "6.4.0"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df"
+ dependencies:
+ bn.js "^4.4.0"
+ brorand "^1.0.1"
+ hash.js "^1.0.0"
+ hmac-drbg "^1.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.0"
+
+emojis-list@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
+
+end-of-stream@^1.0.0, end-of-stream@^1.1.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43"
+ dependencies:
+ once "^1.4.0"
+
+enhanced-resolve@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f"
+ dependencies:
+ graceful-fs "^4.1.2"
+ memory-fs "^0.4.0"
+ tapable "^1.0.0"
+
+errno@^0.1.3, errno@~0.1.7:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
+ dependencies:
+ prr "~1.0.1"
+
+es-abstract@^1.5.1:
+ version "1.12.0"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165"
+ dependencies:
+ es-to-primitive "^1.1.1"
+ function-bind "^1.1.1"
+ has "^1.0.1"
+ is-callable "^1.1.3"
+ is-regex "^1.0.4"
+
+es-to-primitive@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d"
+ dependencies:
+ is-callable "^1.1.1"
+ is-date-object "^1.0.1"
+ is-symbol "^1.0.1"
+
+escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+
+eslint-scope@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172"
+ dependencies:
+ esrecurse "^4.1.0"
+ estraverse "^4.1.1"
+
+esrecurse@^4.1.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
+ dependencies:
+ estraverse "^4.1.0"
+
+estraverse@^4.1.0, estraverse@^4.1.1:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
+
+esutils@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b"
+
+events@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
+
+evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+ dependencies:
+ md5.js "^1.3.4"
+ safe-buffer "^5.1.1"
+
+expand-brackets@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+ dependencies:
+ debug "^2.3.3"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ posix-character-classes "^0.1.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+extend-shallow@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+ dependencies:
+ is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+ dependencies:
+ assign-symbols "^1.0.0"
+ is-extendable "^1.0.1"
+
+extglob@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+ dependencies:
+ array-unique "^0.3.2"
+ define-property "^1.0.0"
+ expand-brackets "^2.1.4"
+ extend-shallow "^2.0.1"
+ fragment-cache "^0.2.1"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+fast-deep-equal@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
+
+fill-range@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+ to-regex-range "^2.1.0"
+
+find-cache-dir@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f"
+ dependencies:
+ commondir "^1.0.1"
+ make-dir "^1.0.0"
+ pkg-dir "^2.0.0"
+
+find-up@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+ dependencies:
+ locate-path "^2.0.0"
+
+flush-write-stream@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd"
+ dependencies:
+ inherits "^2.0.1"
+ readable-stream "^2.0.4"
+
+for-in@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+
+foreach@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
+
+fragment-cache@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+ dependencies:
+ map-cache "^0.2.2"
+
+from2@^2.1.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
+ dependencies:
+ inherits "^2.0.1"
+ readable-stream "^2.0.0"
+
+fs-minipass@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d"
+ dependencies:
+ minipass "^2.2.1"
+
+fs-write-stream-atomic@^1.0.8:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
+ dependencies:
+ graceful-fs "^4.1.2"
+ iferr "^0.1.5"
+ imurmurhash "^0.1.4"
+ readable-stream "1 || 2"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+
+fsevents@^1.2.2:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426"
+ dependencies:
+ nan "^2.9.2"
+ node-pre-gyp "^0.10.0"
+
+function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+
+gauge@~2.7.3:
+ version "2.7.4"
+ resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
+ dependencies:
+ aproba "^1.0.3"
+ console-control-strings "^1.0.0"
+ has-unicode "^2.0.0"
+ object-assign "^4.1.0"
+ signal-exit "^3.0.0"
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wide-align "^1.1.0"
+
+get-value@^2.0.3, get-value@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+
+glob-parent@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
+ dependencies:
+ is-glob "^3.1.0"
+ path-dirname "^1.0.0"
+
+glob@^7.0.5, glob@^7.1.2:
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+globals@^11.1.0:
+ version "11.7.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673"
+
+graceful-fs@^4.1.11, graceful-fs@^4.1.2:
+ version "4.1.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+
+has-unicode@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+
+has-value@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+ dependencies:
+ get-value "^2.0.3"
+ has-values "^0.1.4"
+ isobject "^2.0.0"
+
+has-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+ dependencies:
+ get-value "^2.0.6"
+ has-values "^1.0.0"
+ isobject "^3.0.0"
+
+has-values@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+
+has-values@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+ dependencies:
+ is-number "^3.0.0"
+ kind-of "^4.0.0"
+
+has@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ dependencies:
+ function-bind "^1.1.1"
+
+hash-base@^3.0.0:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+hash.js@^1.0.0, hash.js@^1.0.3:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.5.tgz#e38ab4b85dfb1e0c40fe9265c0e9b54854c23812"
+ dependencies:
+ inherits "^2.0.3"
+ minimalistic-assert "^1.0.1"
+
+hmac-drbg@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+ dependencies:
+ hash.js "^1.0.3"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.1"
+
+https-browserify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
+
+iconv-lite@^0.4.4:
+ version "0.4.23"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63"
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+ieee754@^1.1.11, ieee754@^1.1.4:
+ version "1.1.12"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b"
+
+iferr@^0.1.5:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
+
+ignore-walk@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8"
+ dependencies:
+ minimatch "^3.0.4"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+
+indexof@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+
+inherits@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
+
+ini@~1.3.0:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
+
+invariant@^2.2.2:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
+ dependencies:
+ loose-envify "^1.0.0"
+
+is-accessor-descriptor@^0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-accessor-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
+ dependencies:
+ kind-of "^6.0.0"
+
+is-binary-path@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+ dependencies:
+ binary-extensions "^1.0.0"
+
+is-buffer@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+
+is-callable@^1.1.1, is-callable@^1.1.3:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75"
+
+is-data-descriptor@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-data-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
+ dependencies:
+ kind-of "^6.0.0"
+
+is-date-object@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
+
+is-descriptor@^0.1.0:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
+ dependencies:
+ is-accessor-descriptor "^0.1.6"
+ is-data-descriptor "^0.1.4"
+ kind-of "^5.0.0"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
+ dependencies:
+ is-accessor-descriptor "^1.0.0"
+ is-data-descriptor "^1.0.0"
+ kind-of "^6.0.2"
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+
+is-extendable@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+ dependencies:
+ is-plain-object "^2.0.4"
+
+is-extglob@^2.1.0, is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+
+is-fullwidth-code-point@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+
+is-glob@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
+ dependencies:
+ is-extglob "^2.1.0"
+
+is-glob@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0"
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-number@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+ dependencies:
+ isobject "^3.0.1"
+
+is-regex@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
+ dependencies:
+ has "^1.0.1"
+
+is-symbol@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572"
+
+is-windows@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+
+isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+
+isobject@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+ dependencies:
+ isarray "1.0.0"
+
+isobject@^3.0.0, isobject@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+
+js-levenshtein@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.3.tgz#3ef627df48ec8cf24bacf05c0f184ff30ef413c5"
+
+js-tokens@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
+
+"js-tokens@^3.0.0 || ^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+
+jsesc@^2.5.1:
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe"
+
+jsesc@~0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+
+json-parse-better-errors@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+
+json5@^0.5.0:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
+
+kind-of@^6.0.0, kind-of@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
+
+loader-runner@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2"
+
+loader-utils@^1.0.2, loader-utils@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd"
+ dependencies:
+ big.js "^3.1.3"
+ emojis-list "^2.0.0"
+ json5 "^0.5.0"
+
+locate-path@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+ dependencies:
+ p-locate "^2.0.0"
+ path-exists "^3.0.0"
+
+lodash.debounce@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
+
+lodash@^4.17.10, lodash@^4.17.5:
+ version "4.17.10"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"
+
+long@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28"
+
+long@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b"
+
+loose-envify@^1.0.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+lru-cache@^4.1.1:
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c"
+ dependencies:
+ pseudomap "^1.0.2"
+ yallist "^2.1.2"
+
+make-dir@^1.0.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
+ dependencies:
+ pify "^3.0.0"
+
+mamacro@^0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4"
+
+map-cache@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+
+map-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+ dependencies:
+ object-visit "^1.0.0"
+
+md5.js@^1.3.4:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d"
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+
+memory-fs@^0.4.0, memory-fs@~0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
+ dependencies:
+ errno "^0.1.3"
+ readable-stream "^2.0.1"
+
+micromatch@^3.1.4, micromatch@^3.1.8:
+ version "3.1.10"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ braces "^2.3.1"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ extglob "^2.0.4"
+ fragment-cache "^0.2.1"
+ kind-of "^6.0.2"
+ nanomatch "^1.2.9"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.2"
+
+miller-rabin@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
+ dependencies:
+ bn.js "^4.0.0"
+ brorand "^1.0.1"
+
+minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+
+minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+
+minimatch@^3.0.2, minimatch@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@0.0.8:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+
+minimist@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+
+minipass@^2.2.1, minipass@^2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233"
+ dependencies:
+ safe-buffer "^5.1.2"
+ yallist "^3.0.0"
+
+minizlib@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb"
+ dependencies:
+ minipass "^2.2.1"
+
+mississippi@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f"
+ dependencies:
+ concat-stream "^1.5.0"
+ duplexify "^3.4.2"
+ end-of-stream "^1.1.0"
+ flush-write-stream "^1.0.0"
+ from2 "^2.1.0"
+ parallel-transform "^1.1.0"
+ pump "^2.0.1"
+ pumpify "^1.3.3"
+ stream-each "^1.1.0"
+ through2 "^2.0.0"
+
+mixin-deep@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe"
+ dependencies:
+ for-in "^1.0.2"
+ is-extendable "^1.0.1"
+
+mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+ dependencies:
+ minimist "0.0.8"
+
+move-concurrently@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
+ dependencies:
+ aproba "^1.1.1"
+ copy-concurrently "^1.0.0"
+ fs-write-stream-atomic "^1.0.8"
+ mkdirp "^0.5.1"
+ rimraf "^2.5.4"
+ run-queue "^1.0.3"
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+
+nan@^2.9.2:
+ version "2.10.0"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f"
+
+nanomatch@^1.2.9:
+ version "1.2.13"
+ resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ fragment-cache "^0.2.1"
+ is-windows "^1.0.2"
+ kind-of "^6.0.2"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+needle@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d"
+ dependencies:
+ debug "^2.1.2"
+ iconv-lite "^0.4.4"
+ sax "^1.2.4"
+
+neo-async@^2.5.0:
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee"
+
+node-libs-browser@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df"
+ dependencies:
+ assert "^1.1.1"
+ browserify-zlib "^0.2.0"
+ buffer "^4.3.0"
+ console-browserify "^1.1.0"
+ constants-browserify "^1.0.0"
+ crypto-browserify "^3.11.0"
+ domain-browser "^1.1.1"
+ events "^1.0.0"
+ https-browserify "^1.0.0"
+ os-browserify "^0.3.0"
+ path-browserify "0.0.0"
+ process "^0.11.10"
+ punycode "^1.2.4"
+ querystring-es3 "^0.2.0"
+ readable-stream "^2.3.3"
+ stream-browserify "^2.0.1"
+ stream-http "^2.7.2"
+ string_decoder "^1.0.0"
+ timers-browserify "^2.0.4"
+ tty-browserify "0.0.0"
+ url "^0.11.0"
+ util "^0.10.3"
+ vm-browserify "0.0.4"
+
+node-pre-gyp@^0.10.0:
+ version "0.10.3"
+ resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc"
+ dependencies:
+ detect-libc "^1.0.2"
+ mkdirp "^0.5.1"
+ needle "^2.2.1"
+ nopt "^4.0.1"
+ npm-packlist "^1.1.6"
+ npmlog "^4.0.2"
+ rc "^1.2.7"
+ rimraf "^2.6.1"
+ semver "^5.3.0"
+ tar "^4"
+
+nopt@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
+ dependencies:
+ abbrev "1"
+ osenv "^0.1.4"
+
+normalize-path@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+ dependencies:
+ remove-trailing-separator "^1.0.1"
+
+npm-bundled@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308"
+
+npm-packlist@^1.1.6:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz#84e8c683cbe7867d34b1d357d893ce29e28a02de"
+ dependencies:
+ ignore-walk "^3.0.1"
+ npm-bundled "^1.0.1"
+
+npmlog@^4.0.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
+ dependencies:
+ are-we-there-yet "~1.1.2"
+ console-control-strings "~1.1.0"
+ gauge "~2.7.3"
+ set-blocking "~2.0.0"
+
+number-is-nan@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+
+object-assign@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+
+object-copy@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+ dependencies:
+ copy-descriptor "^0.1.0"
+ define-property "^0.2.5"
+ kind-of "^3.0.3"
+
+object-keys@^1.0.8:
+ version "1.0.12"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2"
+
+object-visit@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+ dependencies:
+ isobject "^3.0.0"
+
+object.getownpropertydescriptors@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16"
+ dependencies:
+ define-properties "^1.1.2"
+ es-abstract "^1.5.1"
+
+object.pick@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+ dependencies:
+ isobject "^3.0.1"
+
+once@^1.3.0, once@^1.3.1, once@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ dependencies:
+ wrappy "1"
+
+os-browserify@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
+
+os-homedir@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+
+os-tmpdir@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+
+osenv@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.0"
+
+p-limit@^1.1.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
+ dependencies:
+ p-try "^1.0.0"
+
+p-locate@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+ dependencies:
+ p-limit "^1.1.0"
+
+p-try@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+
+pako@~1.0.5:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258"
+
+parallel-transform@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06"
+ dependencies:
+ cyclist "~0.2.2"
+ inherits "^2.0.3"
+ readable-stream "^2.1.5"
+
+parse-asn1@^5.0.0:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8"
+ dependencies:
+ asn1.js "^4.0.0"
+ browserify-aes "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.0"
+ pbkdf2 "^3.0.3"
+
+pascalcase@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+
+path-browserify@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
+
+path-dirname@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
+
+path-exists@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+
+path-parse@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1"
+
+pbkdf2@^3.0.3:
+ version "3.0.16"
+ resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c"
+ dependencies:
+ create-hash "^1.1.2"
+ create-hmac "^1.1.4"
+ ripemd160 "^2.0.1"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+pify@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
+
+pkg-dir@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
+ dependencies:
+ find-up "^2.1.0"
+
+posix-character-classes@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+
+private@^0.1.6:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
+
+process-nextick-args@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
+
+process@^0.11.10:
+ version "0.11.10"
+ resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+
+promise-inflight@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
+
+prr@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
+
+pseudomap@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+
+public-encrypt@^4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994"
+ dependencies:
+ bn.js "^4.1.0"
+ browserify-rsa "^4.0.0"
+ create-hash "^1.1.0"
+ parse-asn1 "^5.0.0"
+ randombytes "^2.0.1"
+
+pump@^2.0.0, pump@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909"
+ dependencies:
+ end-of-stream "^1.1.0"
+ once "^1.3.1"
+
+pumpify@^1.3.3:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce"
+ dependencies:
+ duplexify "^3.6.0"
+ inherits "^2.0.3"
+ pump "^2.0.0"
+
+punycode@1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+
+punycode@^1.2.4:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+
+punycode@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+
+querystring-es3@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
+
+querystring@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80"
+ dependencies:
+ safe-buffer "^5.1.0"
+
+randomfill@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
+ dependencies:
+ randombytes "^2.0.5"
+ safe-buffer "^5.1.0"
+
+rc@^1.2.7:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
+ dependencies:
+ deep-extend "^0.6.0"
+ ini "~1.3.0"
+ minimist "^1.2.0"
+ strip-json-comments "~2.0.1"
+
+"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6:
+ version "2.3.6"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.3"
+ isarray "~1.0.0"
+ process-nextick-args "~2.0.0"
+ safe-buffer "~5.1.1"
+ string_decoder "~1.1.1"
+ util-deprecate "~1.0.1"
+
+readdirp@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"
+ dependencies:
+ graceful-fs "^4.1.2"
+ minimatch "^3.0.2"
+ readable-stream "^2.0.2"
+ set-immediate-shim "^1.0.1"
+
+regenerate-unicode-properties@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz#107405afcc4a190ec5ed450ecaa00ed0cafa7a4c"
+ dependencies:
+ regenerate "^1.4.0"
+
+regenerate@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11"
+
+regenerator-transform@^0.13.3:
+ version "0.13.3"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.3.tgz#264bd9ff38a8ce24b06e0636496b2c856b57bcbb"
+ dependencies:
+ private "^0.1.6"
+
+regex-not@^1.0.0, regex-not@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+ dependencies:
+ extend-shallow "^3.0.2"
+ safe-regex "^1.1.0"
+
+regexpu-core@^4.1.3, regexpu-core@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.2.0.tgz#a3744fa03806cffe146dea4421a3e73bdcc47b1d"
+ dependencies:
+ regenerate "^1.4.0"
+ regenerate-unicode-properties "^7.0.0"
+ regjsgen "^0.4.0"
+ regjsparser "^0.3.0"
+ unicode-match-property-ecmascript "^1.0.4"
+ unicode-match-property-value-ecmascript "^1.0.2"
+
+regjsgen@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.4.0.tgz#c1eb4c89a209263f8717c782591523913ede2561"
+
+regjsparser@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.3.0.tgz#3c326da7fcfd69fa0d332575a41c8c0cdf588c96"
+ dependencies:
+ jsesc "~0.5.0"
+
+remove-trailing-separator@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+
+repeat-element@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
+
+repeat-string@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+
+resolve-url@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+
+resolve@^1.3.2:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26"
+ dependencies:
+ path-parse "^1.0.5"
+
+ret@~0.1.10:
+ version "0.1.15"
+ resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+
+rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
+ dependencies:
+ glob "^7.0.5"
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+
+run-queue@^1.0.0, run-queue@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47"
+ dependencies:
+ aproba "^1.1.1"
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+
+safe-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+ dependencies:
+ ret "~0.1.10"
+
+"safer-buffer@>= 2.1.2 < 3":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+
+sax@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+
+schema-utils@^0.4.4, schema-utils@^0.4.5:
+ version "0.4.5"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e"
+ dependencies:
+ ajv "^6.1.0"
+ ajv-keywords "^3.1.0"
+
+semver@^5.3.0, semver@^5.4.1:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
+
+serialize-javascript@^1.4.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe"
+
+set-blocking@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+
+set-immediate-shim@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
+
+set-value@^0.4.3:
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.1"
+ to-object-path "^0.3.0"
+
+set-value@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274"
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.3"
+ split-string "^3.0.1"
+
+setimmediate@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+
+sha.js@^2.4.0, sha.js@^2.4.8:
+ version "2.4.11"
+ resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+signal-exit@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
+
+snapdragon-node@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+ dependencies:
+ define-property "^1.0.0"
+ isobject "^3.0.0"
+ snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+ dependencies:
+ kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
+ dependencies:
+ base "^0.11.1"
+ debug "^2.2.0"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ map-cache "^0.2.2"
+ source-map "^0.5.6"
+ source-map-resolve "^0.5.0"
+ use "^3.1.0"
+
+source-list-map@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085"
+
+source-map-resolve@^0.5.0:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259"
+ dependencies:
+ atob "^2.1.1"
+ decode-uri-component "^0.2.0"
+ resolve-url "^0.2.1"
+ source-map-url "^0.4.0"
+ urix "^0.1.0"
+
+source-map-url@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
+
+source-map@^0.5.0, source-map@^0.5.6:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+
+source-map@^0.6.1, source-map@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+
+split-string@^3.0.1, split-string@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+ dependencies:
+ extend-shallow "^3.0.0"
+
+ssri@^5.2.4:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06"
+ dependencies:
+ safe-buffer "^5.1.1"
+
+static-extend@^0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+ dependencies:
+ define-property "^0.2.5"
+ object-copy "^0.1.0"
+
+stream-browserify@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db"
+ dependencies:
+ inherits "~2.0.1"
+ readable-stream "^2.0.2"
+
+stream-each@^1.1.0:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.2.tgz#8e8c463f91da8991778765873fe4d960d8f616bd"
+ dependencies:
+ end-of-stream "^1.1.0"
+ stream-shift "^1.0.0"
+
+stream-http@^2.7.2:
+ version "2.8.3"
+ resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc"
+ dependencies:
+ builtin-status-codes "^3.0.0"
+ inherits "^2.0.1"
+ readable-stream "^2.3.6"
+ to-arraybuffer "^1.0.0"
+ xtend "^4.0.0"
+
+stream-shift@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952"
+
+string-width@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ strip-ansi "^3.0.0"
+
+"string-width@^1.0.2 || 2":
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^4.0.0"
+
+string_decoder@^1.0.0, string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ dependencies:
+ safe-buffer "~5.1.0"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+ dependencies:
+ ansi-regex "^2.0.0"
+
+strip-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+ dependencies:
+ ansi-regex "^3.0.0"
+
+strip-json-comments@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+
+supports-color@^5.3.0:
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54"
+ dependencies:
+ has-flag "^3.0.0"
+
+tapable@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2"
+
+tar@^4:
+ version "4.4.4"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd"
+ dependencies:
+ chownr "^1.0.1"
+ fs-minipass "^1.2.5"
+ minipass "^2.3.3"
+ minizlib "^1.1.0"
+ mkdirp "^0.5.0"
+ safe-buffer "^5.1.2"
+ yallist "^3.0.2"
+
+through2@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
+ dependencies:
+ readable-stream "^2.1.5"
+ xtend "~4.0.1"
+
+timers-browserify@^2.0.4:
+ version "2.0.10"
+ resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae"
+ dependencies:
+ setimmediate "^1.0.4"
+
+to-arraybuffer@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
+
+to-fast-properties@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
+
+to-object-path@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+ dependencies:
+ kind-of "^3.0.2"
+
+to-regex-range@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+ dependencies:
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+
+to-regex@^3.0.1, to-regex@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+ dependencies:
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ regex-not "^1.0.2"
+ safe-regex "^1.1.0"
+
+trim-right@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
+
+tslib@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
+
+tty-browserify@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
+
+typedarray@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+
+uglify-es@^3.3.4:
+ version "3.3.9"
+ resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677"
+ dependencies:
+ commander "~2.13.0"
+ source-map "~0.6.1"
+
+uglifyjs-webpack-plugin@^1.2.4:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.7.tgz#57638dd99c853a1ebfe9d97b42160a8a507f9d00"
+ dependencies:
+ cacache "^10.0.4"
+ find-cache-dir "^1.0.0"
+ schema-utils "^0.4.5"
+ serialize-javascript "^1.4.0"
+ source-map "^0.6.1"
+ uglify-es "^3.3.4"
+ webpack-sources "^1.1.0"
+ worker-farm "^1.5.2"
+
+unicode-canonical-property-names-ecmascript@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818"
+
+unicode-match-property-ecmascript@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c"
+ dependencies:
+ unicode-canonical-property-names-ecmascript "^1.0.4"
+ unicode-property-aliases-ecmascript "^1.0.4"
+
+unicode-match-property-value-ecmascript@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz#9f1dc76926d6ccf452310564fd834ace059663d4"
+
+unicode-property-aliases-ecmascript@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz#5a533f31b4317ea76f17d807fa0d116546111dd0"
+
+union-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"
+ dependencies:
+ arr-union "^3.1.0"
+ get-value "^2.0.6"
+ is-extendable "^0.1.1"
+ set-value "^0.4.3"
+
+unique-filename@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3"
+ dependencies:
+ unique-slug "^2.0.0"
+
+unique-slug@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab"
+ dependencies:
+ imurmurhash "^0.1.4"
+
+unset-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+ dependencies:
+ has-value "^0.3.1"
+ isobject "^3.0.0"
+
+upath@^1.0.5:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd"
+
+uri-js@^4.2.1:
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"
+ dependencies:
+ punycode "^2.1.0"
+
+urix@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+
+url@^0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
+ dependencies:
+ punycode "1.3.2"
+ querystring "0.2.0"
+
+use@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
+
+util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+
+util.promisify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030"
+ dependencies:
+ define-properties "^1.1.2"
+ object.getownpropertydescriptors "^2.0.3"
+
+util@0.10.3:
+ version "0.10.3"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
+ dependencies:
+ inherits "2.0.1"
+
+util@^0.10.3:
+ version "0.10.4"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901"
+ dependencies:
+ inherits "2.0.3"
+
+vm-browserify@0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
+ dependencies:
+ indexof "0.0.1"
+
+watchpack@^1.5.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00"
+ dependencies:
+ chokidar "^2.0.2"
+ graceful-fs "^4.1.2"
+ neo-async "^2.5.0"
+
+webpack-sources@^1.0.1, webpack-sources@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54"
+ dependencies:
+ source-list-map "^2.0.0"
+ source-map "~0.6.1"
+
+webpack@^4:
+ version "4.16.3"
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.16.3.tgz#861be3176d81e7e3d71c66c8acc9bba35588b525"
+ dependencies:
+ "@webassemblyjs/ast" "1.5.13"
+ "@webassemblyjs/helper-module-context" "1.5.13"
+ "@webassemblyjs/wasm-edit" "1.5.13"
+ "@webassemblyjs/wasm-opt" "1.5.13"
+ "@webassemblyjs/wasm-parser" "1.5.13"
+ acorn "^5.6.2"
+ acorn-dynamic-import "^3.0.0"
+ ajv "^6.1.0"
+ ajv-keywords "^3.1.0"
+ chrome-trace-event "^1.0.0"
+ enhanced-resolve "^4.1.0"
+ eslint-scope "^4.0.0"
+ json-parse-better-errors "^1.0.2"
+ loader-runner "^2.3.0"
+ loader-utils "^1.1.0"
+ memory-fs "~0.4.1"
+ micromatch "^3.1.8"
+ mkdirp "~0.5.0"
+ neo-async "^2.5.0"
+ node-libs-browser "^2.0.0"
+ schema-utils "^0.4.4"
+ tapable "^1.0.0"
+ uglifyjs-webpack-plugin "^1.2.4"
+ watchpack "^1.5.0"
+ webpack-sources "^1.0.1"
+
+wide-align@^1.1.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
+ dependencies:
+ string-width "^1.0.2 || 2"
+
+worker-farm@^1.5.2:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0"
+ dependencies:
+ errno "~0.1.7"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+
+xtend@^4.0.0, xtend@~4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
+
+y18n@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
+
+yallist@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+
+yallist@^3.0.0, yallist@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9"
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack4/index.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack4/index.js
new file mode 100644
index 0000000000..a472b3bcc8
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack4/index.js
@@ -0,0 +1,66 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+const path = require("path");
+const util = require("util");
+const _ = require("lodash");
+const webpack = require("webpack");
+
+const TARGET_NAME = "webpack4";
+
+module.exports = exports = async function(tests, dirname) {
+ const fixtures = [];
+ for (const [name, input] of tests) {
+ if (/babel-/.test(name)) {
+ continue;
+ }
+
+ const testFnName = _.camelCase(`${TARGET_NAME}-${name}`);
+ const evalMaps = name.match(/-eval/);
+
+ console.log(`Building ${TARGET_NAME} test ${name}`);
+
+ const scriptPath = path.join(dirname, "output", TARGET_NAME, `${name}.js`);
+ await util.promisify(webpack)({
+ mode: "development",
+ context: path.dirname(input),
+ entry: `./${path.basename(input)}`,
+ output: {
+ path: path.dirname(scriptPath),
+ filename: path.basename(scriptPath),
+
+ devtoolModuleFilenameTemplate: `${TARGET_NAME}://./${name}/[resource-path]`,
+
+ libraryTarget: "var",
+ library: testFnName,
+ libraryExport: "default"
+ },
+ devtool: evalMaps ? "eval-source-map" : "source-map",
+ module: {
+ rules: [
+ {
+ test: /\.tsx?$/,
+ exclude: /node_modules/,
+ loader: require.resolve("ts-loader"),
+ options: {}
+ }
+ ].filter(Boolean)
+ }
+ });
+
+ fixtures.push({
+ name,
+ testFnName,
+ scriptPath,
+ assets: [scriptPath, evalMaps ? null : `${scriptPath}.map`].filter(
+ Boolean
+ )
+ });
+ }
+
+ return {
+ target: TARGET_NAME,
+ fixtures
+ };
+};
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack4/package.json b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack4/package.json
new file mode 100644
index 0000000000..ec89a87285
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack4/package.json
@@ -0,0 +1,10 @@
+{
+ "name": "sourcemapped-webpack3",
+ "private": true,
+ "dependencies": {
+ "lodash": "^4.17.10",
+ "ts-loader": "^4.4.2",
+ "typescript": "^2.9.2",
+ "webpack": "^4"
+ }
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack4/yarn.lock b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack4/yarn.lock
new file mode 100644
index 0000000000..f171e1f060
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/builds/webpack4/yarn.lock
@@ -0,0 +1,2194 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@webassemblyjs/ast@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.5.13.tgz#81155a570bd5803a30ec31436bc2c9c0ede38f25"
+ dependencies:
+ "@webassemblyjs/helper-module-context" "1.5.13"
+ "@webassemblyjs/helper-wasm-bytecode" "1.5.13"
+ "@webassemblyjs/wast-parser" "1.5.13"
+ debug "^3.1.0"
+ mamacro "^0.0.3"
+
+"@webassemblyjs/floating-point-hex-parser@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.5.13.tgz#29ce0baa97411f70e8cce68ce9c0f9d819a4e298"
+
+"@webassemblyjs/helper-api-error@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.5.13.tgz#e49b051d67ee19a56e29b9aa8bd949b5b4442a59"
+
+"@webassemblyjs/helper-buffer@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.5.13.tgz#873bb0a1b46449231137c1262ddfd05695195a1e"
+ dependencies:
+ debug "^3.1.0"
+
+"@webassemblyjs/helper-code-frame@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.5.13.tgz#1bd2181b6a0be14e004f0fe9f5a660d265362b58"
+ dependencies:
+ "@webassemblyjs/wast-printer" "1.5.13"
+
+"@webassemblyjs/helper-fsm@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.5.13.tgz#cdf3d9d33005d543a5c5e5adaabf679ffa8db924"
+
+"@webassemblyjs/helper-module-context@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.5.13.tgz#dc29ddfb51ed657655286f94a5d72d8a489147c5"
+ dependencies:
+ debug "^3.1.0"
+ mamacro "^0.0.3"
+
+"@webassemblyjs/helper-wasm-bytecode@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.5.13.tgz#03245817f0a762382e61733146f5773def15a747"
+
+"@webassemblyjs/helper-wasm-section@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.5.13.tgz#efc76f44a10d3073b584b43c38a179df173d5c7d"
+ dependencies:
+ "@webassemblyjs/ast" "1.5.13"
+ "@webassemblyjs/helper-buffer" "1.5.13"
+ "@webassemblyjs/helper-wasm-bytecode" "1.5.13"
+ "@webassemblyjs/wasm-gen" "1.5.13"
+ debug "^3.1.0"
+
+"@webassemblyjs/ieee754@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.5.13.tgz#573e97c8c12e4eebb316ca5fde0203ddd90b0364"
+ dependencies:
+ ieee754 "^1.1.11"
+
+"@webassemblyjs/leb128@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.5.13.tgz#ab52ebab9cec283c1c1897ac1da833a04a3f4cee"
+ dependencies:
+ long "4.0.0"
+
+"@webassemblyjs/utf8@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.5.13.tgz#6b53d2cd861cf94fa99c1f12779dde692fbc2469"
+
+"@webassemblyjs/wasm-edit@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.5.13.tgz#c9cef5664c245cf11b3b3a73110c9155831724a8"
+ dependencies:
+ "@webassemblyjs/ast" "1.5.13"
+ "@webassemblyjs/helper-buffer" "1.5.13"
+ "@webassemblyjs/helper-wasm-bytecode" "1.5.13"
+ "@webassemblyjs/helper-wasm-section" "1.5.13"
+ "@webassemblyjs/wasm-gen" "1.5.13"
+ "@webassemblyjs/wasm-opt" "1.5.13"
+ "@webassemblyjs/wasm-parser" "1.5.13"
+ "@webassemblyjs/wast-printer" "1.5.13"
+ debug "^3.1.0"
+
+"@webassemblyjs/wasm-gen@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.5.13.tgz#8e6ea113c4b432fa66540189e79b16d7a140700e"
+ dependencies:
+ "@webassemblyjs/ast" "1.5.13"
+ "@webassemblyjs/helper-wasm-bytecode" "1.5.13"
+ "@webassemblyjs/ieee754" "1.5.13"
+ "@webassemblyjs/leb128" "1.5.13"
+ "@webassemblyjs/utf8" "1.5.13"
+
+"@webassemblyjs/wasm-opt@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.5.13.tgz#147aad7717a7ee4211c36b21a5f4c30dddf33138"
+ dependencies:
+ "@webassemblyjs/ast" "1.5.13"
+ "@webassemblyjs/helper-buffer" "1.5.13"
+ "@webassemblyjs/wasm-gen" "1.5.13"
+ "@webassemblyjs/wasm-parser" "1.5.13"
+ debug "^3.1.0"
+
+"@webassemblyjs/wasm-parser@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.5.13.tgz#6f46516c5bb23904fbdf58009233c2dd8a54c72f"
+ dependencies:
+ "@webassemblyjs/ast" "1.5.13"
+ "@webassemblyjs/helper-api-error" "1.5.13"
+ "@webassemblyjs/helper-wasm-bytecode" "1.5.13"
+ "@webassemblyjs/ieee754" "1.5.13"
+ "@webassemblyjs/leb128" "1.5.13"
+ "@webassemblyjs/utf8" "1.5.13"
+
+"@webassemblyjs/wast-parser@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.5.13.tgz#5727a705d397ae6a3ae99d7f5460acf2ec646eea"
+ dependencies:
+ "@webassemblyjs/ast" "1.5.13"
+ "@webassemblyjs/floating-point-hex-parser" "1.5.13"
+ "@webassemblyjs/helper-api-error" "1.5.13"
+ "@webassemblyjs/helper-code-frame" "1.5.13"
+ "@webassemblyjs/helper-fsm" "1.5.13"
+ long "^3.2.0"
+ mamacro "^0.0.3"
+
+"@webassemblyjs/wast-printer@1.5.13":
+ version "1.5.13"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.5.13.tgz#bb34d528c14b4f579e7ec11e793ec50ad7cd7c95"
+ dependencies:
+ "@webassemblyjs/ast" "1.5.13"
+ "@webassemblyjs/wast-parser" "1.5.13"
+ long "^3.2.0"
+
+abbrev@1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+
+acorn-dynamic-import@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278"
+ dependencies:
+ acorn "^5.0.0"
+
+acorn@^5.0.0, acorn@^5.6.2:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8"
+
+ajv-keywords@^3.1.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a"
+
+ajv@^6.1.0:
+ version "6.5.2"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.2.tgz#678495f9b82f7cca6be248dd92f59bff5e1f4360"
+ dependencies:
+ fast-deep-equal "^2.0.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.1"
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+
+ansi-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+
+ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ dependencies:
+ color-convert "^1.9.0"
+
+anymatch@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
+ dependencies:
+ micromatch "^3.1.4"
+ normalize-path "^2.1.1"
+
+aproba@^1.0.3, aproba@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
+
+are-we-there-yet@~1.1.2:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
+ dependencies:
+ delegates "^1.0.0"
+ readable-stream "^2.0.6"
+
+arr-diff@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+
+arr-flatten@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+
+arr-union@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+
+array-unique@^0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+
+asn1.js@^4.0.0:
+ version "4.10.1"
+ resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"
+ dependencies:
+ bn.js "^4.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+assert@^1.1.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91"
+ dependencies:
+ util "0.10.3"
+
+assign-symbols@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+
+async-each@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
+
+atob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a"
+
+balanced-match@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+
+base64-js@^1.0.2:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3"
+
+base@^0.11.1:
+ version "0.11.2"
+ resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+ dependencies:
+ cache-base "^1.0.1"
+ class-utils "^0.3.5"
+ component-emitter "^1.2.1"
+ define-property "^1.0.0"
+ isobject "^3.0.1"
+ mixin-deep "^1.2.0"
+ pascalcase "^0.1.1"
+
+big.js@^3.1.3:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
+
+binary-extensions@^1.0.0:
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205"
+
+bluebird@^3.5.1:
+ version "3.5.1"
+ resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9"
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
+ version "4.11.8"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+braces@^2.3.0, braces@^2.3.1:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+ dependencies:
+ arr-flatten "^1.1.0"
+ array-unique "^0.3.2"
+ extend-shallow "^2.0.1"
+ fill-range "^4.0.0"
+ isobject "^3.0.1"
+ repeat-element "^1.1.2"
+ snapdragon "^0.8.1"
+ snapdragon-node "^2.0.1"
+ split-string "^3.0.2"
+ to-regex "^3.0.1"
+
+brorand@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
+ dependencies:
+ buffer-xor "^1.0.3"
+ cipher-base "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.3"
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+browserify-cipher@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
+ dependencies:
+ browserify-aes "^1.0.4"
+ browserify-des "^1.0.0"
+ evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c"
+ dependencies:
+ cipher-base "^1.0.1"
+ des.js "^1.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+browserify-rsa@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
+ dependencies:
+ bn.js "^4.1.0"
+ randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
+ dependencies:
+ bn.js "^4.1.1"
+ browserify-rsa "^4.0.0"
+ create-hash "^1.1.0"
+ create-hmac "^1.1.2"
+ elliptic "^6.0.0"
+ inherits "^2.0.1"
+ parse-asn1 "^5.0.0"
+
+browserify-zlib@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
+ dependencies:
+ pako "~1.0.5"
+
+buffer-from@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04"
+
+buffer-xor@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+
+buffer@^4.3.0:
+ version "4.9.1"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298"
+ dependencies:
+ base64-js "^1.0.2"
+ ieee754 "^1.1.4"
+ isarray "^1.0.0"
+
+builtin-status-codes@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
+
+cacache@^10.0.4:
+ version "10.0.4"
+ resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460"
+ dependencies:
+ bluebird "^3.5.1"
+ chownr "^1.0.1"
+ glob "^7.1.2"
+ graceful-fs "^4.1.11"
+ lru-cache "^4.1.1"
+ mississippi "^2.0.0"
+ mkdirp "^0.5.1"
+ move-concurrently "^1.0.1"
+ promise-inflight "^1.0.1"
+ rimraf "^2.6.2"
+ ssri "^5.2.4"
+ unique-filename "^1.1.0"
+ y18n "^4.0.0"
+
+cache-base@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+ dependencies:
+ collection-visit "^1.0.0"
+ component-emitter "^1.2.1"
+ get-value "^2.0.6"
+ has-value "^1.0.0"
+ isobject "^3.0.1"
+ set-value "^2.0.0"
+ to-object-path "^0.3.0"
+ union-value "^1.0.0"
+ unset-value "^1.0.0"
+
+chalk@^2.3.0:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e"
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chokidar@^2.0.2:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26"
+ dependencies:
+ anymatch "^2.0.0"
+ async-each "^1.0.0"
+ braces "^2.3.0"
+ glob-parent "^3.1.0"
+ inherits "^2.0.1"
+ is-binary-path "^1.0.0"
+ is-glob "^4.0.0"
+ lodash.debounce "^4.0.8"
+ normalize-path "^2.1.1"
+ path-is-absolute "^1.0.0"
+ readdirp "^2.0.0"
+ upath "^1.0.5"
+ optionalDependencies:
+ fsevents "^1.2.2"
+
+chownr@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181"
+
+chrome-trace-event@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48"
+ dependencies:
+ tslib "^1.9.0"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+class-utils@^0.3.5:
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+ dependencies:
+ arr-union "^3.1.0"
+ define-property "^0.2.5"
+ isobject "^3.0.0"
+ static-extend "^0.1.1"
+
+code-point-at@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+
+collection-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+ dependencies:
+ map-visit "^1.0.0"
+ object-visit "^1.0.0"
+
+color-convert@^1.9.0:
+ version "1.9.2"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147"
+ dependencies:
+ color-name "1.1.1"
+
+color-name@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689"
+
+commander@~2.13.0:
+ version "2.13.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c"
+
+commondir@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
+
+component-emitter@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+
+concat-stream@^1.5.0:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34"
+ dependencies:
+ buffer-from "^1.0.0"
+ inherits "^2.0.3"
+ readable-stream "^2.2.2"
+ typedarray "^0.0.6"
+
+console-browserify@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
+ dependencies:
+ date-now "^0.1.4"
+
+console-control-strings@^1.0.0, console-control-strings@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+
+constants-browserify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
+
+copy-concurrently@^1.0.0:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0"
+ dependencies:
+ aproba "^1.1.1"
+ fs-write-stream-atomic "^1.0.8"
+ iferr "^0.1.5"
+ mkdirp "^0.5.1"
+ rimraf "^2.5.4"
+ run-queue "^1.0.0"
+
+copy-descriptor@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+
+core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+
+create-ecdh@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff"
+ dependencies:
+ bn.js "^4.1.0"
+ elliptic "^6.0.0"
+
+create-hash@^1.1.0, create-hash@^1.1.2:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
+ dependencies:
+ cipher-base "^1.0.1"
+ inherits "^2.0.1"
+ md5.js "^1.3.4"
+ ripemd160 "^2.0.1"
+ sha.js "^2.4.0"
+
+create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
+ dependencies:
+ cipher-base "^1.0.3"
+ create-hash "^1.1.0"
+ inherits "^2.0.1"
+ ripemd160 "^2.0.0"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+crypto-browserify@^3.11.0:
+ version "3.12.0"
+ resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
+ dependencies:
+ browserify-cipher "^1.0.0"
+ browserify-sign "^4.0.0"
+ create-ecdh "^4.0.0"
+ create-hash "^1.1.0"
+ create-hmac "^1.1.0"
+ diffie-hellman "^5.0.0"
+ inherits "^2.0.1"
+ pbkdf2 "^3.0.3"
+ public-encrypt "^4.0.0"
+ randombytes "^2.0.0"
+ randomfill "^1.0.3"
+
+cyclist@~0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640"
+
+date-now@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
+
+debug@^2.1.2, debug@^2.2.0, debug@^2.3.3:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ dependencies:
+ ms "2.0.0"
+
+debug@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
+ dependencies:
+ ms "2.0.0"
+
+decode-uri-component@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+
+deep-extend@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
+
+define-property@^0.2.5:
+ version "0.2.5"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+ dependencies:
+ is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+ dependencies:
+ is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+ dependencies:
+ is-descriptor "^1.0.2"
+ isobject "^3.0.1"
+
+delegates@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+
+des.js@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
+ dependencies:
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+detect-libc@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
+
+diffie-hellman@^5.0.0:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
+ dependencies:
+ bn.js "^4.1.0"
+ miller-rabin "^4.0.0"
+ randombytes "^2.0.0"
+
+domain-browser@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
+
+duplexify@^3.4.2, duplexify@^3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.0.tgz#592903f5d80b38d037220541264d69a198fb3410"
+ dependencies:
+ end-of-stream "^1.0.0"
+ inherits "^2.0.1"
+ readable-stream "^2.0.0"
+ stream-shift "^1.0.0"
+
+elliptic@^6.0.0:
+ version "6.4.0"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df"
+ dependencies:
+ bn.js "^4.4.0"
+ brorand "^1.0.1"
+ hash.js "^1.0.0"
+ hmac-drbg "^1.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.0"
+
+emojis-list@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
+
+end-of-stream@^1.0.0, end-of-stream@^1.1.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43"
+ dependencies:
+ once "^1.4.0"
+
+enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f"
+ dependencies:
+ graceful-fs "^4.1.2"
+ memory-fs "^0.4.0"
+ tapable "^1.0.0"
+
+errno@^0.1.3, errno@~0.1.7:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
+ dependencies:
+ prr "~1.0.1"
+
+escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+
+eslint-scope@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172"
+ dependencies:
+ esrecurse "^4.1.0"
+ estraverse "^4.1.1"
+
+esrecurse@^4.1.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
+ dependencies:
+ estraverse "^4.1.0"
+
+estraverse@^4.1.0, estraverse@^4.1.1:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
+
+events@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
+
+evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+ dependencies:
+ md5.js "^1.3.4"
+ safe-buffer "^5.1.1"
+
+expand-brackets@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+ dependencies:
+ debug "^2.3.3"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ posix-character-classes "^0.1.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+extend-shallow@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+ dependencies:
+ is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+ dependencies:
+ assign-symbols "^1.0.0"
+ is-extendable "^1.0.1"
+
+extglob@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+ dependencies:
+ array-unique "^0.3.2"
+ define-property "^1.0.0"
+ expand-brackets "^2.1.4"
+ extend-shallow "^2.0.1"
+ fragment-cache "^0.2.1"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+fast-deep-equal@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
+
+fill-range@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+ to-regex-range "^2.1.0"
+
+find-cache-dir@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f"
+ dependencies:
+ commondir "^1.0.1"
+ make-dir "^1.0.0"
+ pkg-dir "^2.0.0"
+
+find-up@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+ dependencies:
+ locate-path "^2.0.0"
+
+flush-write-stream@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd"
+ dependencies:
+ inherits "^2.0.1"
+ readable-stream "^2.0.4"
+
+for-in@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+
+fragment-cache@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+ dependencies:
+ map-cache "^0.2.2"
+
+from2@^2.1.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
+ dependencies:
+ inherits "^2.0.1"
+ readable-stream "^2.0.0"
+
+fs-minipass@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d"
+ dependencies:
+ minipass "^2.2.1"
+
+fs-write-stream-atomic@^1.0.8:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9"
+ dependencies:
+ graceful-fs "^4.1.2"
+ iferr "^0.1.5"
+ imurmurhash "^0.1.4"
+ readable-stream "1 || 2"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+
+fsevents@^1.2.2:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426"
+ dependencies:
+ nan "^2.9.2"
+ node-pre-gyp "^0.10.0"
+
+gauge@~2.7.3:
+ version "2.7.4"
+ resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
+ dependencies:
+ aproba "^1.0.3"
+ console-control-strings "^1.0.0"
+ has-unicode "^2.0.0"
+ object-assign "^4.1.0"
+ signal-exit "^3.0.0"
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wide-align "^1.1.0"
+
+get-value@^2.0.3, get-value@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+
+glob-parent@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
+ dependencies:
+ is-glob "^3.1.0"
+ path-dirname "^1.0.0"
+
+glob@^7.0.5, glob@^7.1.2:
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+graceful-fs@^4.1.11, graceful-fs@^4.1.2:
+ version "4.1.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+
+has-unicode@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+
+has-value@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+ dependencies:
+ get-value "^2.0.3"
+ has-values "^0.1.4"
+ isobject "^2.0.0"
+
+has-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+ dependencies:
+ get-value "^2.0.6"
+ has-values "^1.0.0"
+ isobject "^3.0.0"
+
+has-values@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+
+has-values@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+ dependencies:
+ is-number "^3.0.0"
+ kind-of "^4.0.0"
+
+hash-base@^3.0.0:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+hash.js@^1.0.0, hash.js@^1.0.3:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.5.tgz#e38ab4b85dfb1e0c40fe9265c0e9b54854c23812"
+ dependencies:
+ inherits "^2.0.3"
+ minimalistic-assert "^1.0.1"
+
+hmac-drbg@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+ dependencies:
+ hash.js "^1.0.3"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.1"
+
+https-browserify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
+
+iconv-lite@^0.4.4:
+ version "0.4.23"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63"
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+ieee754@^1.1.11, ieee754@^1.1.4:
+ version "1.1.12"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b"
+
+iferr@^0.1.5:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501"
+
+ignore-walk@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8"
+ dependencies:
+ minimatch "^3.0.4"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+
+indexof@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+
+inherits@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
+
+ini@~1.3.0:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
+
+is-accessor-descriptor@^0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-accessor-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
+ dependencies:
+ kind-of "^6.0.0"
+
+is-binary-path@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+ dependencies:
+ binary-extensions "^1.0.0"
+
+is-buffer@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+
+is-data-descriptor@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-data-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
+ dependencies:
+ kind-of "^6.0.0"
+
+is-descriptor@^0.1.0:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
+ dependencies:
+ is-accessor-descriptor "^0.1.6"
+ is-data-descriptor "^0.1.4"
+ kind-of "^5.0.0"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
+ dependencies:
+ is-accessor-descriptor "^1.0.0"
+ is-data-descriptor "^1.0.0"
+ kind-of "^6.0.2"
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+
+is-extendable@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+ dependencies:
+ is-plain-object "^2.0.4"
+
+is-extglob@^2.1.0, is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+
+is-fullwidth-code-point@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+
+is-glob@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
+ dependencies:
+ is-extglob "^2.1.0"
+
+is-glob@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0"
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-number@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+ dependencies:
+ isobject "^3.0.1"
+
+is-windows@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+
+isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+
+isobject@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+ dependencies:
+ isarray "1.0.0"
+
+isobject@^3.0.0, isobject@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+
+json-parse-better-errors@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+
+json5@^0.5.0:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
+
+kind-of@^6.0.0, kind-of@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
+
+loader-runner@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2"
+
+loader-utils@^1.0.2, loader-utils@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd"
+ dependencies:
+ big.js "^3.1.3"
+ emojis-list "^2.0.0"
+ json5 "^0.5.0"
+
+locate-path@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+ dependencies:
+ p-locate "^2.0.0"
+ path-exists "^3.0.0"
+
+lodash.debounce@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
+
+lodash@^4.17.10:
+ version "4.17.10"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"
+
+long@4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28"
+
+long@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b"
+
+lru-cache@^4.1.1:
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c"
+ dependencies:
+ pseudomap "^1.0.2"
+ yallist "^2.1.2"
+
+make-dir@^1.0.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
+ dependencies:
+ pify "^3.0.0"
+
+mamacro@^0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4"
+
+map-cache@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+
+map-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+ dependencies:
+ object-visit "^1.0.0"
+
+md5.js@^1.3.4:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d"
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+
+memory-fs@^0.4.0, memory-fs@~0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
+ dependencies:
+ errno "^0.1.3"
+ readable-stream "^2.0.1"
+
+micromatch@^3.1.4, micromatch@^3.1.8:
+ version "3.1.10"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ braces "^2.3.1"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ extglob "^2.0.4"
+ fragment-cache "^0.2.1"
+ kind-of "^6.0.2"
+ nanomatch "^1.2.9"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.2"
+
+miller-rabin@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
+ dependencies:
+ bn.js "^4.0.0"
+ brorand "^1.0.1"
+
+minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+
+minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+
+minimatch@^3.0.2, minimatch@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@0.0.8:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+
+minimist@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+
+minipass@^2.2.1, minipass@^2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233"
+ dependencies:
+ safe-buffer "^5.1.2"
+ yallist "^3.0.0"
+
+minizlib@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb"
+ dependencies:
+ minipass "^2.2.1"
+
+mississippi@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f"
+ dependencies:
+ concat-stream "^1.5.0"
+ duplexify "^3.4.2"
+ end-of-stream "^1.1.0"
+ flush-write-stream "^1.0.0"
+ from2 "^2.1.0"
+ parallel-transform "^1.1.0"
+ pump "^2.0.1"
+ pumpify "^1.3.3"
+ stream-each "^1.1.0"
+ through2 "^2.0.0"
+
+mixin-deep@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe"
+ dependencies:
+ for-in "^1.0.2"
+ is-extendable "^1.0.1"
+
+mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+ dependencies:
+ minimist "0.0.8"
+
+move-concurrently@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92"
+ dependencies:
+ aproba "^1.1.1"
+ copy-concurrently "^1.0.0"
+ fs-write-stream-atomic "^1.0.8"
+ mkdirp "^0.5.1"
+ rimraf "^2.5.4"
+ run-queue "^1.0.3"
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+
+nan@^2.9.2:
+ version "2.10.0"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f"
+
+nanomatch@^1.2.9:
+ version "1.2.13"
+ resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ fragment-cache "^0.2.1"
+ is-windows "^1.0.2"
+ kind-of "^6.0.2"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+needle@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d"
+ dependencies:
+ debug "^2.1.2"
+ iconv-lite "^0.4.4"
+ sax "^1.2.4"
+
+neo-async@^2.5.0:
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee"
+
+node-libs-browser@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df"
+ dependencies:
+ assert "^1.1.1"
+ browserify-zlib "^0.2.0"
+ buffer "^4.3.0"
+ console-browserify "^1.1.0"
+ constants-browserify "^1.0.0"
+ crypto-browserify "^3.11.0"
+ domain-browser "^1.1.1"
+ events "^1.0.0"
+ https-browserify "^1.0.0"
+ os-browserify "^0.3.0"
+ path-browserify "0.0.0"
+ process "^0.11.10"
+ punycode "^1.2.4"
+ querystring-es3 "^0.2.0"
+ readable-stream "^2.3.3"
+ stream-browserify "^2.0.1"
+ stream-http "^2.7.2"
+ string_decoder "^1.0.0"
+ timers-browserify "^2.0.4"
+ tty-browserify "0.0.0"
+ url "^0.11.0"
+ util "^0.10.3"
+ vm-browserify "0.0.4"
+
+node-pre-gyp@^0.10.0:
+ version "0.10.3"
+ resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc"
+ dependencies:
+ detect-libc "^1.0.2"
+ mkdirp "^0.5.1"
+ needle "^2.2.1"
+ nopt "^4.0.1"
+ npm-packlist "^1.1.6"
+ npmlog "^4.0.2"
+ rc "^1.2.7"
+ rimraf "^2.6.1"
+ semver "^5.3.0"
+ tar "^4"
+
+nopt@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
+ dependencies:
+ abbrev "1"
+ osenv "^0.1.4"
+
+normalize-path@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+ dependencies:
+ remove-trailing-separator "^1.0.1"
+
+npm-bundled@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308"
+
+npm-packlist@^1.1.6:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz#84e8c683cbe7867d34b1d357d893ce29e28a02de"
+ dependencies:
+ ignore-walk "^3.0.1"
+ npm-bundled "^1.0.1"
+
+npmlog@^4.0.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
+ dependencies:
+ are-we-there-yet "~1.1.2"
+ console-control-strings "~1.1.0"
+ gauge "~2.7.3"
+ set-blocking "~2.0.0"
+
+number-is-nan@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+
+object-assign@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+
+object-copy@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+ dependencies:
+ copy-descriptor "^0.1.0"
+ define-property "^0.2.5"
+ kind-of "^3.0.3"
+
+object-visit@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+ dependencies:
+ isobject "^3.0.0"
+
+object.pick@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+ dependencies:
+ isobject "^3.0.1"
+
+once@^1.3.0, once@^1.3.1, once@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ dependencies:
+ wrappy "1"
+
+os-browserify@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
+
+os-homedir@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+
+os-tmpdir@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+
+osenv@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.0"
+
+p-limit@^1.1.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
+ dependencies:
+ p-try "^1.0.0"
+
+p-locate@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+ dependencies:
+ p-limit "^1.1.0"
+
+p-try@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+
+pako@~1.0.5:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258"
+
+parallel-transform@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06"
+ dependencies:
+ cyclist "~0.2.2"
+ inherits "^2.0.3"
+ readable-stream "^2.1.5"
+
+parse-asn1@^5.0.0:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8"
+ dependencies:
+ asn1.js "^4.0.0"
+ browserify-aes "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.0"
+ pbkdf2 "^3.0.3"
+
+pascalcase@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+
+path-browserify@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
+
+path-dirname@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
+
+path-exists@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+
+pbkdf2@^3.0.3:
+ version "3.0.16"
+ resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c"
+ dependencies:
+ create-hash "^1.1.2"
+ create-hmac "^1.1.4"
+ ripemd160 "^2.0.1"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+pify@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
+
+pkg-dir@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
+ dependencies:
+ find-up "^2.1.0"
+
+posix-character-classes@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+
+process-nextick-args@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
+
+process@^0.11.10:
+ version "0.11.10"
+ resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+
+promise-inflight@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3"
+
+prr@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
+
+pseudomap@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+
+public-encrypt@^4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994"
+ dependencies:
+ bn.js "^4.1.0"
+ browserify-rsa "^4.0.0"
+ create-hash "^1.1.0"
+ parse-asn1 "^5.0.0"
+ randombytes "^2.0.1"
+
+pump@^2.0.0, pump@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909"
+ dependencies:
+ end-of-stream "^1.1.0"
+ once "^1.3.1"
+
+pumpify@^1.3.3:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce"
+ dependencies:
+ duplexify "^3.6.0"
+ inherits "^2.0.3"
+ pump "^2.0.0"
+
+punycode@1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+
+punycode@^1.2.4:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+
+punycode@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+
+querystring-es3@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
+
+querystring@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80"
+ dependencies:
+ safe-buffer "^5.1.0"
+
+randomfill@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
+ dependencies:
+ randombytes "^2.0.5"
+ safe-buffer "^5.1.0"
+
+rc@^1.2.7:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
+ dependencies:
+ deep-extend "^0.6.0"
+ ini "~1.3.0"
+ minimist "^1.2.0"
+ strip-json-comments "~2.0.1"
+
+"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6:
+ version "2.3.6"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.3"
+ isarray "~1.0.0"
+ process-nextick-args "~2.0.0"
+ safe-buffer "~5.1.1"
+ string_decoder "~1.1.1"
+ util-deprecate "~1.0.1"
+
+readdirp@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"
+ dependencies:
+ graceful-fs "^4.1.2"
+ minimatch "^3.0.2"
+ readable-stream "^2.0.2"
+ set-immediate-shim "^1.0.1"
+
+regex-not@^1.0.0, regex-not@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+ dependencies:
+ extend-shallow "^3.0.2"
+ safe-regex "^1.1.0"
+
+remove-trailing-separator@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+
+repeat-element@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
+
+repeat-string@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+
+resolve-url@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+
+ret@~0.1.10:
+ version "0.1.15"
+ resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+
+rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
+ dependencies:
+ glob "^7.0.5"
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+
+run-queue@^1.0.0, run-queue@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47"
+ dependencies:
+ aproba "^1.1.1"
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+
+safe-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+ dependencies:
+ ret "~0.1.10"
+
+"safer-buffer@>= 2.1.2 < 3":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+
+sax@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+
+schema-utils@^0.4.4, schema-utils@^0.4.5:
+ version "0.4.5"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.5.tgz#21836f0608aac17b78f9e3e24daff14a5ca13a3e"
+ dependencies:
+ ajv "^6.1.0"
+ ajv-keywords "^3.1.0"
+
+semver@^5.0.1, semver@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
+
+serialize-javascript@^1.4.0:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe"
+
+set-blocking@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+
+set-immediate-shim@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
+
+set-value@^0.4.3:
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.1"
+ to-object-path "^0.3.0"
+
+set-value@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274"
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.3"
+ split-string "^3.0.1"
+
+setimmediate@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+
+sha.js@^2.4.0, sha.js@^2.4.8:
+ version "2.4.11"
+ resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+signal-exit@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
+
+snapdragon-node@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+ dependencies:
+ define-property "^1.0.0"
+ isobject "^3.0.0"
+ snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+ dependencies:
+ kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
+ dependencies:
+ base "^0.11.1"
+ debug "^2.2.0"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ map-cache "^0.2.2"
+ source-map "^0.5.6"
+ source-map-resolve "^0.5.0"
+ use "^3.1.0"
+
+source-list-map@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085"
+
+source-map-resolve@^0.5.0:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259"
+ dependencies:
+ atob "^2.1.1"
+ decode-uri-component "^0.2.0"
+ resolve-url "^0.2.1"
+ source-map-url "^0.4.0"
+ urix "^0.1.0"
+
+source-map-url@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
+
+source-map@^0.5.6:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+
+source-map@^0.6.1, source-map@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+
+split-string@^3.0.1, split-string@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+ dependencies:
+ extend-shallow "^3.0.0"
+
+ssri@^5.2.4:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06"
+ dependencies:
+ safe-buffer "^5.1.1"
+
+static-extend@^0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+ dependencies:
+ define-property "^0.2.5"
+ object-copy "^0.1.0"
+
+stream-browserify@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db"
+ dependencies:
+ inherits "~2.0.1"
+ readable-stream "^2.0.2"
+
+stream-each@^1.1.0:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.2.tgz#8e8c463f91da8991778765873fe4d960d8f616bd"
+ dependencies:
+ end-of-stream "^1.1.0"
+ stream-shift "^1.0.0"
+
+stream-http@^2.7.2:
+ version "2.8.3"
+ resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc"
+ dependencies:
+ builtin-status-codes "^3.0.0"
+ inherits "^2.0.1"
+ readable-stream "^2.3.6"
+ to-arraybuffer "^1.0.0"
+ xtend "^4.0.0"
+
+stream-shift@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952"
+
+string-width@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ strip-ansi "^3.0.0"
+
+"string-width@^1.0.2 || 2":
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^4.0.0"
+
+string_decoder@^1.0.0, string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ dependencies:
+ safe-buffer "~5.1.0"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+ dependencies:
+ ansi-regex "^2.0.0"
+
+strip-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+ dependencies:
+ ansi-regex "^3.0.0"
+
+strip-json-comments@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+
+supports-color@^5.3.0:
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54"
+ dependencies:
+ has-flag "^3.0.0"
+
+tapable@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2"
+
+tar@^4:
+ version "4.4.4"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd"
+ dependencies:
+ chownr "^1.0.1"
+ fs-minipass "^1.2.5"
+ minipass "^2.3.3"
+ minizlib "^1.1.0"
+ mkdirp "^0.5.0"
+ safe-buffer "^5.1.2"
+ yallist "^3.0.2"
+
+through2@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
+ dependencies:
+ readable-stream "^2.1.5"
+ xtend "~4.0.1"
+
+timers-browserify@^2.0.4:
+ version "2.0.10"
+ resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae"
+ dependencies:
+ setimmediate "^1.0.4"
+
+to-arraybuffer@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
+
+to-object-path@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+ dependencies:
+ kind-of "^3.0.2"
+
+to-regex-range@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+ dependencies:
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+
+to-regex@^3.0.1, to-regex@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+ dependencies:
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ regex-not "^1.0.2"
+ safe-regex "^1.1.0"
+
+ts-loader@^4.4.2:
+ version "4.4.2"
+ resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-4.4.2.tgz#778d4464b24436873c78f7f9e914d88194c2a248"
+ dependencies:
+ chalk "^2.3.0"
+ enhanced-resolve "^4.0.0"
+ loader-utils "^1.0.2"
+ micromatch "^3.1.4"
+ semver "^5.0.1"
+
+tslib@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
+
+tty-browserify@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
+
+typedarray@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
+
+typescript@^2.9.2:
+ version "2.9.2"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.9.2.tgz#1cbf61d05d6b96269244eb6a3bce4bd914e0f00c"
+
+uglify-es@^3.3.4:
+ version "3.3.9"
+ resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677"
+ dependencies:
+ commander "~2.13.0"
+ source-map "~0.6.1"
+
+uglifyjs-webpack-plugin@^1.2.4:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.2.7.tgz#57638dd99c853a1ebfe9d97b42160a8a507f9d00"
+ dependencies:
+ cacache "^10.0.4"
+ find-cache-dir "^1.0.0"
+ schema-utils "^0.4.5"
+ serialize-javascript "^1.4.0"
+ source-map "^0.6.1"
+ uglify-es "^3.3.4"
+ webpack-sources "^1.1.0"
+ worker-farm "^1.5.2"
+
+union-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"
+ dependencies:
+ arr-union "^3.1.0"
+ get-value "^2.0.6"
+ is-extendable "^0.1.1"
+ set-value "^0.4.3"
+
+unique-filename@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3"
+ dependencies:
+ unique-slug "^2.0.0"
+
+unique-slug@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab"
+ dependencies:
+ imurmurhash "^0.1.4"
+
+unset-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+ dependencies:
+ has-value "^0.3.1"
+ isobject "^3.0.0"
+
+upath@^1.0.5:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd"
+
+uri-js@^4.2.1:
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"
+ dependencies:
+ punycode "^2.1.0"
+
+urix@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+
+url@^0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
+ dependencies:
+ punycode "1.3.2"
+ querystring "0.2.0"
+
+use@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
+
+util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+
+util@0.10.3:
+ version "0.10.3"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
+ dependencies:
+ inherits "2.0.1"
+
+util@^0.10.3:
+ version "0.10.4"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901"
+ dependencies:
+ inherits "2.0.3"
+
+vm-browserify@0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
+ dependencies:
+ indexof "0.0.1"
+
+watchpack@^1.5.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00"
+ dependencies:
+ chokidar "^2.0.2"
+ graceful-fs "^4.1.2"
+ neo-async "^2.5.0"
+
+webpack-sources@^1.0.1, webpack-sources@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54"
+ dependencies:
+ source-list-map "^2.0.0"
+ source-map "~0.6.1"
+
+webpack@^4:
+ version "4.16.3"
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.16.3.tgz#861be3176d81e7e3d71c66c8acc9bba35588b525"
+ dependencies:
+ "@webassemblyjs/ast" "1.5.13"
+ "@webassemblyjs/helper-module-context" "1.5.13"
+ "@webassemblyjs/wasm-edit" "1.5.13"
+ "@webassemblyjs/wasm-opt" "1.5.13"
+ "@webassemblyjs/wasm-parser" "1.5.13"
+ acorn "^5.6.2"
+ acorn-dynamic-import "^3.0.0"
+ ajv "^6.1.0"
+ ajv-keywords "^3.1.0"
+ chrome-trace-event "^1.0.0"
+ enhanced-resolve "^4.1.0"
+ eslint-scope "^4.0.0"
+ json-parse-better-errors "^1.0.2"
+ loader-runner "^2.3.0"
+ loader-utils "^1.1.0"
+ memory-fs "~0.4.1"
+ micromatch "^3.1.8"
+ mkdirp "~0.5.0"
+ neo-async "^2.5.0"
+ node-libs-browser "^2.0.0"
+ schema-utils "^0.4.4"
+ tapable "^1.0.0"
+ uglifyjs-webpack-plugin "^1.2.4"
+ watchpack "^1.5.0"
+ webpack-sources "^1.0.1"
+
+wide-align@^1.1.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
+ dependencies:
+ string-width "^1.0.2 || 2"
+
+worker-farm@^1.5.2:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0"
+ dependencies:
+ errno "~0.1.7"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+
+xtend@^4.0.0, xtend@~4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
+
+y18n@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
+
+yallist@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+
+yallist@^3.0.0, yallist@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9"
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/babel-bindings-with-flow/input.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/babel-bindings-with-flow/input.js
new file mode 100644
index 0000000000..378781d0d9
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/babel-bindings-with-flow/input.js
@@ -0,0 +1,10 @@
+// Webpack doesn't map import declarations well, so doing this forces binding
+// processing to only process the binding being cast when searching for
+// matches. That way we can properly test if the flow cast causes problems.
+import { aNamed } from "./src/mod";
+
+export default function root() {
+ var value = (aNamed: Array<string>);
+
+ console.log("pause here", root, value);
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/babel-bindings-with-flow/src/mod.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/babel-bindings-with-flow/src/mod.js
new file mode 100644
index 0000000000..1b2adae4c2
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/babel-bindings-with-flow/src/mod.js
@@ -0,0 +1 @@
+export const aNamed = "a-named";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/babel-classes/input.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/babel-classes/input.js
new file mode 100644
index 0000000000..a28b281645
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/babel-classes/input.js
@@ -0,0 +1,15 @@
+export default function root() {
+ class Another {
+ bound = () => {
+ return this;
+ }
+
+ method() {
+ let two = 2;
+
+ console.log("pause here", Another, root);
+ }
+ }
+
+ new Another().method();
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/babel-flowtype-bindings/input.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/babel-flowtype-bindings/input.js
new file mode 100644
index 0000000000..867f0c1312
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/babel-flowtype-bindings/input.js
@@ -0,0 +1,10 @@
+import type { One, Two, Three } from "./src/mod";
+import { Four, type Five, typeof Six } from "./src/mod";
+
+type Other = {};
+
+const aConst = "a-const";
+
+export default function root() {
+ console.log("pause here", aConst, Four, root);
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/babel-flowtype-bindings/src/mod.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/babel-flowtype-bindings/src/mod.js
new file mode 100644
index 0000000000..c5f96ab664
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/babel-flowtype-bindings/src/mod.js
@@ -0,0 +1,2 @@
+export default "a-default";
+export const Four = "one";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/classes/input.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/classes/input.js
new file mode 100644
index 0000000000..3fcc8859b3
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/classes/input.js
@@ -0,0 +1,22 @@
+export default function root() {
+ let one = 1;
+
+ class Thing {
+ one() {
+ console.log("pause here");
+ }
+ }
+
+ class Another {
+ method() {
+ let two = 2;
+
+ const three = 3;
+
+ console.log("pause here", Another, one, Thing, root);
+ }
+ }
+
+ new Another().method();
+ new Thing().one();
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/input.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/input.js
new file mode 100644
index 0000000000..240d844162
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/input.js
@@ -0,0 +1,41 @@
+import aDefault from "./src/mod1";
+import { aNamed, aNamed as anotherNamed } from "./src/mod2";
+import { original as anAliased } from "./src/mod3";
+import * as aNamespace from "./src/mod4";
+
+import aDefault2 from "./src/mod5";
+import { aNamed2, aNamed2 as anotherNamed2 } from "./src/mod6";
+import { original as anAliased2 } from "./src/mod7";
+
+import aDefault3 from "./src/mod9";
+import { aNamed3, aNamed3 as anotherNamed3 } from "./src/mod10";
+import { original as anAliased3 } from "./src/mod11";
+
+import optimizedOut from "./src/optimized-out";
+optimizedOut();
+
+export default function root() {
+ console.log("pause here", root);
+
+ console.log(aDefault);
+ console.log(anAliased);
+ console.log(aNamed);
+ console.log(anotherNamed);
+ console.log(aNamespace);
+
+ try {
+ // None of these are callable in this code, but we still want to make sure
+ // they map properly even if the only reference is in a call expressions.
+ console.log(aDefault2());
+ console.log(anAliased2());
+ console.log(aNamed2());
+ console.log(anotherNamed2());
+
+ console.log(new aDefault3());
+ console.log(new anAliased3());
+ console.log(new aNamed3());
+ console.log(new anotherNamed3());
+ } catch (e) {}
+}
+
+export function example(){}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod1.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod1.js
new file mode 100644
index 0000000000..7ef4555146
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod1.js
@@ -0,0 +1 @@
+export default "a-default";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod10.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod10.js
new file mode 100644
index 0000000000..95c6aea486
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod10.js
@@ -0,0 +1 @@
+export const aNamed3 = "a-named3";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod11.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod11.js
new file mode 100644
index 0000000000..0436002e07
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod11.js
@@ -0,0 +1 @@
+export const original = "an-original3";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod12.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod12.js
new file mode 100644
index 0000000000..51a4d2889a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod12.js
@@ -0,0 +1,2 @@
+export default "a-default3";
+export const aNamed = "a-named3";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod2.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod2.js
new file mode 100644
index 0000000000..1b2adae4c2
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod2.js
@@ -0,0 +1 @@
+export const aNamed = "a-named";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod3.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod3.js
new file mode 100644
index 0000000000..3432a8fb23
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod3.js
@@ -0,0 +1 @@
+export const original = "an-original";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod4.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod4.js
new file mode 100644
index 0000000000..8ae4b58dfb
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod4.js
@@ -0,0 +1,2 @@
+export default "a-default";
+export const aNamed = "a-named";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod5.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod5.js
new file mode 100644
index 0000000000..fae2f9e6b9
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod5.js
@@ -0,0 +1 @@
+export default "a-default2";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod6.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod6.js
new file mode 100644
index 0000000000..bca6172ca6
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod6.js
@@ -0,0 +1 @@
+export const aNamed2 = "a-named2";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod7.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod7.js
new file mode 100644
index 0000000000..5e7085eaa0
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod7.js
@@ -0,0 +1 @@
+export const original = "an-original2";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod8.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod8.js
new file mode 100644
index 0000000000..adbd8a9ae4
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod8.js
@@ -0,0 +1,2 @@
+export default "a-default2";
+export const aNamed = "a-named2";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod9.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod9.js
new file mode 100644
index 0000000000..089f470268
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/mod9.js
@@ -0,0 +1 @@
+export default "a-default3";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/optimized-out.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/optimized-out.js
new file mode 100644
index 0000000000..ba5844e2df
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-cjs/src/optimized-out.js
@@ -0,0 +1 @@
+export default function optimizedOut() {}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/input.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/input.js
new file mode 100644
index 0000000000..240d844162
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/input.js
@@ -0,0 +1,41 @@
+import aDefault from "./src/mod1";
+import { aNamed, aNamed as anotherNamed } from "./src/mod2";
+import { original as anAliased } from "./src/mod3";
+import * as aNamespace from "./src/mod4";
+
+import aDefault2 from "./src/mod5";
+import { aNamed2, aNamed2 as anotherNamed2 } from "./src/mod6";
+import { original as anAliased2 } from "./src/mod7";
+
+import aDefault3 from "./src/mod9";
+import { aNamed3, aNamed3 as anotherNamed3 } from "./src/mod10";
+import { original as anAliased3 } from "./src/mod11";
+
+import optimizedOut from "./src/optimized-out";
+optimizedOut();
+
+export default function root() {
+ console.log("pause here", root);
+
+ console.log(aDefault);
+ console.log(anAliased);
+ console.log(aNamed);
+ console.log(anotherNamed);
+ console.log(aNamespace);
+
+ try {
+ // None of these are callable in this code, but we still want to make sure
+ // they map properly even if the only reference is in a call expressions.
+ console.log(aDefault2());
+ console.log(anAliased2());
+ console.log(aNamed2());
+ console.log(anotherNamed2());
+
+ console.log(new aDefault3());
+ console.log(new anAliased3());
+ console.log(new aNamed3());
+ console.log(new anotherNamed3());
+ } catch (e) {}
+}
+
+export function example(){}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod1.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod1.js
new file mode 100644
index 0000000000..7ef4555146
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod1.js
@@ -0,0 +1 @@
+export default "a-default";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod10.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod10.js
new file mode 100644
index 0000000000..95c6aea486
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod10.js
@@ -0,0 +1 @@
+export const aNamed3 = "a-named3";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod11.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod11.js
new file mode 100644
index 0000000000..0436002e07
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod11.js
@@ -0,0 +1 @@
+export const original = "an-original3";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod12.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod12.js
new file mode 100644
index 0000000000..51a4d2889a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod12.js
@@ -0,0 +1,2 @@
+export default "a-default3";
+export const aNamed = "a-named3";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod2.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod2.js
new file mode 100644
index 0000000000..1b2adae4c2
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod2.js
@@ -0,0 +1 @@
+export const aNamed = "a-named";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod3.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod3.js
new file mode 100644
index 0000000000..3432a8fb23
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod3.js
@@ -0,0 +1 @@
+export const original = "an-original";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod4.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod4.js
new file mode 100644
index 0000000000..8ae4b58dfb
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod4.js
@@ -0,0 +1,2 @@
+export default "a-default";
+export const aNamed = "a-named";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod5.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod5.js
new file mode 100644
index 0000000000..fae2f9e6b9
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod5.js
@@ -0,0 +1 @@
+export default "a-default2";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod6.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod6.js
new file mode 100644
index 0000000000..bca6172ca6
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod6.js
@@ -0,0 +1 @@
+export const aNamed2 = "a-named2";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod7.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod7.js
new file mode 100644
index 0000000000..5e7085eaa0
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod7.js
@@ -0,0 +1 @@
+export const original = "an-original2";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod8.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod8.js
new file mode 100644
index 0000000000..adbd8a9ae4
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod8.js
@@ -0,0 +1,2 @@
+export default "a-default2";
+export const aNamed = "a-named2";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod9.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod9.js
new file mode 100644
index 0000000000..089f470268
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/mod9.js
@@ -0,0 +1 @@
+export default "a-default3";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/optimized-out.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/optimized-out.js
new file mode 100644
index 0000000000..ba5844e2df
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules-es6/src/optimized-out.js
@@ -0,0 +1 @@
+export default function optimizedOut() {}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/input.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/input.js
new file mode 100644
index 0000000000..240d844162
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/input.js
@@ -0,0 +1,41 @@
+import aDefault from "./src/mod1";
+import { aNamed, aNamed as anotherNamed } from "./src/mod2";
+import { original as anAliased } from "./src/mod3";
+import * as aNamespace from "./src/mod4";
+
+import aDefault2 from "./src/mod5";
+import { aNamed2, aNamed2 as anotherNamed2 } from "./src/mod6";
+import { original as anAliased2 } from "./src/mod7";
+
+import aDefault3 from "./src/mod9";
+import { aNamed3, aNamed3 as anotherNamed3 } from "./src/mod10";
+import { original as anAliased3 } from "./src/mod11";
+
+import optimizedOut from "./src/optimized-out";
+optimizedOut();
+
+export default function root() {
+ console.log("pause here", root);
+
+ console.log(aDefault);
+ console.log(anAliased);
+ console.log(aNamed);
+ console.log(anotherNamed);
+ console.log(aNamespace);
+
+ try {
+ // None of these are callable in this code, but we still want to make sure
+ // they map properly even if the only reference is in a call expressions.
+ console.log(aDefault2());
+ console.log(anAliased2());
+ console.log(aNamed2());
+ console.log(anotherNamed2());
+
+ console.log(new aDefault3());
+ console.log(new anAliased3());
+ console.log(new aNamed3());
+ console.log(new anotherNamed3());
+ } catch (e) {}
+}
+
+export function example(){}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod1.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod1.js
new file mode 100644
index 0000000000..7ef4555146
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod1.js
@@ -0,0 +1 @@
+export default "a-default";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod10.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod10.js
new file mode 100644
index 0000000000..95c6aea486
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod10.js
@@ -0,0 +1 @@
+export const aNamed3 = "a-named3";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod11.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod11.js
new file mode 100644
index 0000000000..0436002e07
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod11.js
@@ -0,0 +1 @@
+export const original = "an-original3";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod12.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod12.js
new file mode 100644
index 0000000000..51a4d2889a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod12.js
@@ -0,0 +1,2 @@
+export default "a-default3";
+export const aNamed = "a-named3";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod2.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod2.js
new file mode 100644
index 0000000000..1b2adae4c2
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod2.js
@@ -0,0 +1 @@
+export const aNamed = "a-named";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod3.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod3.js
new file mode 100644
index 0000000000..3432a8fb23
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod3.js
@@ -0,0 +1 @@
+export const original = "an-original";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod4.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod4.js
new file mode 100644
index 0000000000..8ae4b58dfb
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod4.js
@@ -0,0 +1,2 @@
+export default "a-default";
+export const aNamed = "a-named";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod5.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod5.js
new file mode 100644
index 0000000000..fae2f9e6b9
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod5.js
@@ -0,0 +1 @@
+export default "a-default2";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod6.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod6.js
new file mode 100644
index 0000000000..bca6172ca6
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod6.js
@@ -0,0 +1 @@
+export const aNamed2 = "a-named2";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod7.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod7.js
new file mode 100644
index 0000000000..5e7085eaa0
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod7.js
@@ -0,0 +1 @@
+export const original = "an-original2";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod8.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod8.js
new file mode 100644
index 0000000000..adbd8a9ae4
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod8.js
@@ -0,0 +1,2 @@
+export default "a-default2";
+export const aNamed = "a-named2";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod9.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod9.js
new file mode 100644
index 0000000000..089f470268
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/mod9.js
@@ -0,0 +1 @@
+export default "a-default3";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/optimized-out.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/optimized-out.js
new file mode 100644
index 0000000000..ba5844e2df
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/esmodules/src/optimized-out.js
@@ -0,0 +1 @@
+export default function optimizedOut() {}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/eval-maps/input.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/eval-maps/input.js
new file mode 100644
index 0000000000..c2cf5ac8cf
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/eval-maps/input.js
@@ -0,0 +1,16 @@
+
+export default function root() {
+ var one = 1;
+ let two = 2;
+ const three = 3;
+
+ one;
+ two;
+
+ {
+ let two = 4;
+ const three = 5;
+
+ console.log("pause here", one, two, three);
+ }
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/for-loops/input.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/for-loops/input.js
new file mode 100644
index 0000000000..9cf3bfd0dc
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/for-loops/input.js
@@ -0,0 +1,15 @@
+export default function root() {
+ let i = 0;
+
+ for (let i = 1; i < 2; i++) {
+ console.log("pause here", root);
+ }
+
+ for (let i in { 2: "" }) {
+ console.log("pause here", root);
+ }
+
+ for (let i of [3]) {
+ console.log("pause here", root);
+ }
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/for-of/input.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/for-of/input.js
new file mode 100644
index 0000000000..f6a9df426b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/for-of/input.js
@@ -0,0 +1,12 @@
+const mod = "module scoped";
+
+export default function forOf() {
+ for (const x of [1]) {
+ doThing(x);
+ }
+
+ function doThing(arg) {
+ // Avoid optimize out
+ window.console;
+ }
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/functions/input.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/functions/input.js
new file mode 100644
index 0000000000..70e7b2cfb9
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/functions/input.js
@@ -0,0 +1,14 @@
+export default function root() {
+
+ function decl(p1) {
+ const inner = function inner(p2) {
+ const arrow = (p3) => {
+ console.log("pause here", p3, arrow, p2, inner, p1, decl, root);
+ };
+ arrow();
+ };
+ inner();
+ }
+
+ decl();
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/lex-and-nonlex/input.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/lex-and-nonlex/input.js
new file mode 100644
index 0000000000..5704081677
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/lex-and-nonlex/input.js
@@ -0,0 +1,9 @@
+export default function root() {
+ function someHelper(){
+ console.log("pause here", root, Thing);
+ }
+
+ class Thing {}
+
+ someHelper();
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/line-start-bindings-es6/input.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/line-start-bindings-es6/input.js
new file mode 100644
index 0000000000..27947833e2
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/line-start-bindings-es6/input.js
@@ -0,0 +1,23 @@
+
+export default function root() {
+ function aFunc(){
+ // Since these bindings are on their own linem, the mappings will
+ // extend to the start of the line, rather than starting at the first
+ // character of the binding.
+ const {
+ one,
+ two
+ } = {
+ one: 1,
+ two: 2,
+ };
+
+ // The 'this' binding here is also its own line, so the comment above
+ // applies here too.
+ this.thing = 4;
+
+ console.log("pause here", root);
+ }
+
+ aFunc.call({ });
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/modules-cjs/input.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/modules-cjs/input.js
new file mode 100644
index 0000000000..daf9c6213d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/modules-cjs/input.js
@@ -0,0 +1,8 @@
+var moduleScoped = 1;
+let alsoModuleScoped = 2;
+
+function thirdModuleScoped() {}
+
+exports.default = function() {
+ console.log("pause here", moduleScoped, alsoModuleScoped, thirdModuleScoped);
+};
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/out-of-order-declarations-cjs/input.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/out-of-order-declarations-cjs/input.js
new file mode 100644
index 0000000000..cb54ba8bd3
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/out-of-order-declarations-cjs/input.js
@@ -0,0 +1,17 @@
+var val = "outer-value";
+
+export default function root() {
+ var val = "middle-value";
+ var fn = function outerFn(outer){};
+
+ function callback() {
+ console.log("pause here", val, aDefault, fn);
+
+ var val = "inner-value";
+ function fn(inner){};
+ }
+
+ callback();
+}
+
+import aDefault from "./src/mod";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/out-of-order-declarations-cjs/src/mod.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/out-of-order-declarations-cjs/src/mod.js
new file mode 100644
index 0000000000..7ef4555146
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/out-of-order-declarations-cjs/src/mod.js
@@ -0,0 +1 @@
+export default "a-default";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/shadowed-vars/input.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/shadowed-vars/input.js
new file mode 100644
index 0000000000..abafae5f97
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/shadowed-vars/input.js
@@ -0,0 +1,21 @@
+export default function() {
+ var aVar = "var1";
+ let aLet = "let1";
+ const aConst = "const1";
+
+ class Outer {}
+ {
+ function Outer() {}
+
+ var aVar = "var2";
+ let aLet = "let2";
+ const aConst = "const2";
+ {
+ var aVar = "var3";
+ let aLet = "let3";
+ const aConst = "const3";
+
+ console.log("pause here");
+ }
+ }
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/step-over-for-of-array-closure/input.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/step-over-for-of-array-closure/input.js
new file mode 100644
index 0000000000..b708464367
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/step-over-for-of-array-closure/input.js
@@ -0,0 +1,10 @@
+// Babel will optimize this for..of because it call tell the value is an array.
+export default function root() {
+ console.log("pause here");
+
+ for (const val of [1, 2]) {
+ console.log("pause again", (() => val)());
+ }
+
+ console.log("done");
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/step-over-for-of-array/input.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/step-over-for-of-array/input.js
new file mode 100644
index 0000000000..c703059b07
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/step-over-for-of-array/input.js
@@ -0,0 +1,10 @@
+// Babel will optimize this for..of because it call tell the value is an array.
+export default function root() {
+ console.log("pause here");
+
+ for (const val of [1, 2]) {
+ console.log("pause again", val);
+ }
+
+ console.log("done");
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/step-over-for-of-closure/input.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/step-over-for-of-closure/input.js
new file mode 100644
index 0000000000..abe1e361b9
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/step-over-for-of-closure/input.js
@@ -0,0 +1,13 @@
+// Babel will convert the loop body to a function to handle the 'val' lexical
+// enclosure behavior.
+const vals = [1, 2];
+
+export default function root() {
+ console.log("pause here");
+
+ for (const val of vals) {
+ console.log("pause again", (() => val)());
+ }
+
+ console.log("done");
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/step-over-for-of/input.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/step-over-for-of/input.js
new file mode 100644
index 0000000000..a0aca4135c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/step-over-for-of/input.js
@@ -0,0 +1,11 @@
+const vals = [1, 2];
+
+export default function root() {
+ console.log("pause here");
+
+ for (const val of vals) {
+ console.log("pause again", val);
+ }
+
+ console.log("done");
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/step-over-function-params/input.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/step-over-function-params/input.js
new file mode 100644
index 0000000000..1cbd8c8180
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/step-over-function-params/input.js
@@ -0,0 +1,8 @@
+function test(a1, a2 = 45, { a3, a4, a5: { a6: a7 } = {} } = {}) {
+ console.log("pause next here");
+}
+
+export default function fn() {
+ console.log("pause here");
+ test("1", undefined, { a3: "3", a4: "4", a5: { a6: "7" } });
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/step-over-regenerator-await/input.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/step-over-regenerator-await/input.js
new file mode 100644
index 0000000000..2afb29bcf7
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/step-over-regenerator-await/input.js
@@ -0,0 +1,15 @@
+var fn = async function fn() {
+ console.log("pause here");
+
+ await doAsync();
+
+ console.log("stopped here");
+};
+
+function doAsync() {
+ return Promise.resolve();
+}
+
+export default function root() {
+ fn();
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/switches/input.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/switches/input.js
new file mode 100644
index 0000000000..873b268fc1
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/switches/input.js
@@ -0,0 +1,13 @@
+export default function root() {
+ let val = 1;
+
+ switch (true) {
+ case true:
+ let val = 2;
+ console.log("pause here", root);
+ default: {
+ let val = 3;
+ console.log("pause here", root);
+ }
+ }
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/this-arguments-bindings/input.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/this-arguments-bindings/input.js
new file mode 100644
index 0000000000..3db6ea720c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/this-arguments-bindings/input.js
@@ -0,0 +1,14 @@
+export default function root() {
+ function fn(arg) {
+ console.log(this, arguments);
+ console.log("pause here", fn, root);
+
+ const arrow = argArrow => {
+ console.log(this, arguments);
+ console.log("pause here", fn, root);
+ };
+ arrow("arrow-arg");
+ }
+
+ fn.call("this-value", "arg-value");
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/try-catches/input.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/try-catches/input.js
new file mode 100644
index 0000000000..2e557e5870
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/try-catches/input.js
@@ -0,0 +1,10 @@
+export default function root() {
+ const one = 1;
+
+ try {
+ throw "AnError";
+ } catch (err) {
+ let two = 2;
+ console.log("pause here", root);
+ }
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/type-module/input.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/type-module/input.js
new file mode 100644
index 0000000000..058577e13c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/type-module/input.js
@@ -0,0 +1,8 @@
+var moduleScoped = 1;
+let alsoModuleScoped = 2;
+
+function thirdModuleScoped() {}
+
+export default function() {
+ console.log("pause here", moduleScoped, alsoModuleScoped, thirdModuleScoped);
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/type-script-cjs/input.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/type-script-cjs/input.js
new file mode 100644
index 0000000000..6032b04036
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/type-script-cjs/input.js
@@ -0,0 +1,10 @@
+var moduleScoped = 1;
+let alsoModuleScopes = 2;
+
+function thirdModuleScoped() {}
+
+function nonModules() {
+ console.log("pause here");
+}
+
+exports.default = nonModules;
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/typescript-classes/input.ts b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/typescript-classes/input.ts
new file mode 100644
index 0000000000..d125c7328c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/typescript-classes/input.ts
@@ -0,0 +1,51 @@
+// This file essentially reproduces an example Angular component to map testing,
+// among other typescript edge cases.
+
+import def, { decoratorFactory } from './src/mod.ts';
+
+import * as ns from './src/mod.ts';
+
+@decoratorFactory({
+ selector: 'app-root',
+})
+export class AppComponent {
+ title = 'app';
+}
+
+const fn = arg => {
+ console.log("here");
+};
+fn("arg");
+
+// Un-decorated exported classes present a mapping challege because
+// the class name is mapped to an unhelpful export assignment.
+export class ExportedOther {
+ title = 'app';
+}
+
+class AnotherThing {
+ prop = 4;
+}
+
+const ExpressionClass = class Foo {
+ prop = 4;
+};
+
+class SubDecl extends AnotherThing {
+ prop = 4;
+}
+
+let SubVar = class SubExpr extends AnotherThing {
+ prop = 4;
+};
+
+ns;
+
+export default function(){
+ // This file is specifically for testing the mappings of classes and things
+ // above, which means we don't want to include _other_ references to then.
+ // To avoid having them be optimized out, we include a no-op eval.
+ eval("");
+
+ console.log("pause here");
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/typescript-classes/src/mod.ts b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/typescript-classes/src/mod.ts
new file mode 100644
index 0000000000..4a0cb8326a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/typescript-classes/src/mod.ts
@@ -0,0 +1,8 @@
+
+export function decoratorFactory(opts: { selector: string }) {
+ return function decorator(target) {
+ return <any>target;
+ };
+}
+
+export default function def() {}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/webpack-functions/input.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/webpack-functions/input.js
new file mode 100644
index 0000000000..001c02da86
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/webpack-functions/input.js
@@ -0,0 +1,12 @@
+var module = {};
+
+module.exports = function(x) {
+ return x * 2;
+};
+
+
+export default function root() {
+ // This example is structures to look like CommonJS in order to replicate
+ // a previously-encountered bug.
+ module.exports(4);
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/webpack-line-mappings/input.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/webpack-line-mappings/input.js
new file mode 100644
index 0000000000..62ba478aec
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/webpack-line-mappings/input.js
@@ -0,0 +1,18 @@
+import aDefault from "./src/mod1";
+
+export default function root() {
+ let one = 1;
+
+ {
+ const two = 2;
+
+ var fn = function someName(arg) {
+ console.log(this, arguments);
+ console.log("pause here", aDefault, one, two, fn, arg);
+
+ var inner = (arg) => { var body = "42"; console.log("pause here", body, root); };
+ inner();
+ };
+ fn.call("this-value", "arg-value");
+ }
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/webpack-line-mappings/src/mod1.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/webpack-line-mappings/src/mod1.js
new file mode 100644
index 0000000000..7ef4555146
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/fixtures/webpack-line-mappings/src/mod1.js
@@ -0,0 +1 @@
+export default "a-default";
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/babel-bindings-with-flow.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/babel-bindings-with-flow.js
new file mode 100644
index 0000000000..48cd4667c5
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/babel-bindings-with-flow.js
@@ -0,0 +1,132 @@
+// modules are defined as an array
+// [ module function, map of requires ]
+//
+// map of requires is short require name -> numeric require
+//
+// anything defined in a previous bundle is accessed via the
+// orig method which is the require for previous bundles
+
+// eslint-disable-next-line no-global-assign
+parcelRequire = (function (modules, cache, entry, globalName) {
+ // Save the require from previous bundle to this closure if any
+ var previousRequire = typeof parcelRequire === 'function' && parcelRequire;
+ var nodeRequire = typeof require === 'function' && require;
+
+ function newRequire(name, jumped) {
+ if (!cache[name]) {
+ if (!modules[name]) {
+ // if we cannot find the module within our internal map or
+ // cache jump to the current global require ie. the last bundle
+ // that was added to the page.
+ var currentRequire = typeof parcelRequire === 'function' && parcelRequire;
+ if (!jumped && currentRequire) {
+ return currentRequire(name, true);
+ }
+
+ // If there are other bundles on this page the require from the
+ // previous one is saved to 'previousRequire'. Repeat this as
+ // many times as there are bundles until the module is found or
+ // we exhaust the require chain.
+ if (previousRequire) {
+ return previousRequire(name, true);
+ }
+
+ // Try the node require function if it exists.
+ if (nodeRequire && typeof name === 'string') {
+ return nodeRequire(name);
+ }
+
+ var err = new Error('Cannot find module \'' + name + '\'');
+ err.code = 'MODULE_NOT_FOUND';
+ throw err;
+ }
+
+ localRequire.resolve = resolve;
+
+ var module = cache[name] = new newRequire.Module(name);
+
+ modules[name][0].call(module.exports, localRequire, module, module.exports, this);
+ }
+
+ return cache[name].exports;
+
+ function localRequire(x){
+ return newRequire(localRequire.resolve(x));
+ }
+
+ function resolve(x){
+ return modules[name][1][x] || x;
+ }
+ }
+
+ function Module(moduleName) {
+ this.id = moduleName;
+ this.bundle = newRequire;
+ this.exports = {};
+ }
+
+ newRequire.isParcelRequire = true;
+ newRequire.Module = Module;
+ newRequire.modules = modules;
+ newRequire.cache = cache;
+ newRequire.parent = previousRequire;
+ newRequire.register = function (id, exports) {
+ modules[id] = [function (require, module) {
+ module.exports = exports;
+ }, {}];
+ };
+
+ for (var i = 0; i < entry.length; i++) {
+ newRequire(entry[i]);
+ }
+
+ if (entry.length) {
+ // Expose entry point to Node, AMD or browser globals
+ // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js
+ var mainExports = newRequire(entry[entry.length - 1]);
+
+ // CommonJS
+ if (typeof exports === "object" && typeof module !== "undefined") {
+ module.exports = mainExports;
+
+ // RequireJS
+ } else if (typeof define === "function" && define.amd) {
+ define(function () {
+ return mainExports;
+ });
+
+ // <script>
+ } else if (globalName) {
+ this[globalName] = mainExports;
+ }
+ }
+
+ // Override the current require with this new one
+ return newRequire;
+})({"src/mod.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+const aNamed = exports.aNamed = "a-named";
+},{}],"input.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = root;
+
+var _mod = require("./src/mod");
+
+function root() {
+ var value = _mod.aNamed;
+
+ console.log("pause here", root, value);
+} // Webpack doesn't map import declarations well, so doing this forces binding
+// processing to only process the binding being cast when searching for
+// matches. That way we can properly test if the flow cast causes problems.
+},{"./src/mod":"src/mod.js"}]},{},["input.js"], "parcelBabelBindingsWithFlow")
+//# sourceMappingURL=babel-bindings-with-flow.map
+;parcelBabelBindingsWithFlow = parcelBabelBindingsWithFlow.default; \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/babel-bindings-with-flow.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/babel-bindings-with-flow.map
new file mode 100644
index 0000000000..a602357411
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/babel-bindings-with-flow.map
@@ -0,0 +1 @@
+{"version":3,"sources":["parcel://./babel-bindings-with-flow/src/mod.js","parcel://./babel-bindings-with-flow/input.js"],"names":["aNamed","root","value","console","log"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAO,MAAMA,0BAAS,SAAf;;;;;;;kBCKiBC;;AAFxB;;AAEe,SAASA,IAAT,GAAgB;AAC7B,MAAIC,QAASF,WAAb;;AAEAG,UAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B,EAAgCC,KAAhC;AACD,EATD;AACA;AACA","file":"babel-bindings-with-flow.map","sourcesContent":["export const aNamed = \"a-named\";\n","// Webpack doesn't map import declarations well, so doing this forces binding\n// processing to only process the binding being cast when searching for\n// matches. That way we can properly test if the flow cast causes problems.\nimport { aNamed } from \"./src/mod\";\n\nexport default function root() {\n var value = (aNamed: Array<string>);\n\n console.log(\"pause here\", root, value);\n}\n"]} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/babel-classes.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/babel-classes.js
new file mode 100644
index 0000000000..b495821113
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/babel-classes.js
@@ -0,0 +1,132 @@
+// modules are defined as an array
+// [ module function, map of requires ]
+//
+// map of requires is short require name -> numeric require
+//
+// anything defined in a previous bundle is accessed via the
+// orig method which is the require for previous bundles
+
+// eslint-disable-next-line no-global-assign
+parcelRequire = (function (modules, cache, entry, globalName) {
+ // Save the require from previous bundle to this closure if any
+ var previousRequire = typeof parcelRequire === 'function' && parcelRequire;
+ var nodeRequire = typeof require === 'function' && require;
+
+ function newRequire(name, jumped) {
+ if (!cache[name]) {
+ if (!modules[name]) {
+ // if we cannot find the module within our internal map or
+ // cache jump to the current global require ie. the last bundle
+ // that was added to the page.
+ var currentRequire = typeof parcelRequire === 'function' && parcelRequire;
+ if (!jumped && currentRequire) {
+ return currentRequire(name, true);
+ }
+
+ // If there are other bundles on this page the require from the
+ // previous one is saved to 'previousRequire'. Repeat this as
+ // many times as there are bundles until the module is found or
+ // we exhaust the require chain.
+ if (previousRequire) {
+ return previousRequire(name, true);
+ }
+
+ // Try the node require function if it exists.
+ if (nodeRequire && typeof name === 'string') {
+ return nodeRequire(name);
+ }
+
+ var err = new Error('Cannot find module \'' + name + '\'');
+ err.code = 'MODULE_NOT_FOUND';
+ throw err;
+ }
+
+ localRequire.resolve = resolve;
+
+ var module = cache[name] = new newRequire.Module(name);
+
+ modules[name][0].call(module.exports, localRequire, module, module.exports, this);
+ }
+
+ return cache[name].exports;
+
+ function localRequire(x){
+ return newRequire(localRequire.resolve(x));
+ }
+
+ function resolve(x){
+ return modules[name][1][x] || x;
+ }
+ }
+
+ function Module(moduleName) {
+ this.id = moduleName;
+ this.bundle = newRequire;
+ this.exports = {};
+ }
+
+ newRequire.isParcelRequire = true;
+ newRequire.Module = Module;
+ newRequire.modules = modules;
+ newRequire.cache = cache;
+ newRequire.parent = previousRequire;
+ newRequire.register = function (id, exports) {
+ modules[id] = [function (require, module) {
+ module.exports = exports;
+ }, {}];
+ };
+
+ for (var i = 0; i < entry.length; i++) {
+ newRequire(entry[i]);
+ }
+
+ if (entry.length) {
+ // Expose entry point to Node, AMD or browser globals
+ // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js
+ var mainExports = newRequire(entry[entry.length - 1]);
+
+ // CommonJS
+ if (typeof exports === "object" && typeof module !== "undefined") {
+ module.exports = mainExports;
+
+ // RequireJS
+ } else if (typeof define === "function" && define.amd) {
+ define(function () {
+ return mainExports;
+ });
+
+ // <script>
+ } else if (globalName) {
+ this[globalName] = mainExports;
+ }
+ }
+
+ // Override the current require with this new one
+ return newRequire;
+})({"input.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = root;
+function root() {
+ class Another {
+ constructor() {
+ this.bound = () => {
+ return this;
+ };
+ }
+
+ method() {
+ let two = 2;
+
+ console.log("pause here", Another, root);
+ }
+ }
+
+ new Another().method();
+}
+},{}]},{},["input.js"], "parcelBabelClasses")
+//# sourceMappingURL=babel-classes.map
+;parcelBabelClasses = parcelBabelClasses.default; \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/babel-classes.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/babel-classes.map
new file mode 100644
index 0000000000..6807fa8bf1
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/babel-classes.map
@@ -0,0 +1 @@
+{"version":3,"sources":["parcel://./babel-classes/input.js"],"names":["root","Another","bound","method","two","console","log"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAAwBA;AAAT,SAASA,IAAT,GAAgB;AAC7B,QAAMC,OAAN,CAAc;AAAA;AAAA,WACZC,KADY,GACJ,MAAM;AACZ,eAAO,IAAP;AACD,OAHW;AAAA;;AAKZC,aAAS;AACP,UAAIC,MAAM,CAAV;;AAEAC,cAAQC,GAAR,CAAY,YAAZ,EAA0BL,OAA1B,EAAmCD,IAAnC;AACD;AATW;;AAYd,MAAIC,OAAJ,GAAcE,MAAd;AACD","file":"babel-classes.map","sourcesContent":["export default function root() {\n class Another {\n bound = () => {\n return this;\n }\n\n method() {\n let two = 2;\n\n console.log(\"pause here\", Another, root);\n }\n }\n\n new Another().method();\n}\n"]} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/babel-flowtype-bindings.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/babel-flowtype-bindings.js
new file mode 100644
index 0000000000..de07a4fd73
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/babel-flowtype-bindings.js
@@ -0,0 +1,131 @@
+// modules are defined as an array
+// [ module function, map of requires ]
+//
+// map of requires is short require name -> numeric require
+//
+// anything defined in a previous bundle is accessed via the
+// orig method which is the require for previous bundles
+
+// eslint-disable-next-line no-global-assign
+parcelRequire = (function (modules, cache, entry, globalName) {
+ // Save the require from previous bundle to this closure if any
+ var previousRequire = typeof parcelRequire === 'function' && parcelRequire;
+ var nodeRequire = typeof require === 'function' && require;
+
+ function newRequire(name, jumped) {
+ if (!cache[name]) {
+ if (!modules[name]) {
+ // if we cannot find the module within our internal map or
+ // cache jump to the current global require ie. the last bundle
+ // that was added to the page.
+ var currentRequire = typeof parcelRequire === 'function' && parcelRequire;
+ if (!jumped && currentRequire) {
+ return currentRequire(name, true);
+ }
+
+ // If there are other bundles on this page the require from the
+ // previous one is saved to 'previousRequire'. Repeat this as
+ // many times as there are bundles until the module is found or
+ // we exhaust the require chain.
+ if (previousRequire) {
+ return previousRequire(name, true);
+ }
+
+ // Try the node require function if it exists.
+ if (nodeRequire && typeof name === 'string') {
+ return nodeRequire(name);
+ }
+
+ var err = new Error('Cannot find module \'' + name + '\'');
+ err.code = 'MODULE_NOT_FOUND';
+ throw err;
+ }
+
+ localRequire.resolve = resolve;
+
+ var module = cache[name] = new newRequire.Module(name);
+
+ modules[name][0].call(module.exports, localRequire, module, module.exports, this);
+ }
+
+ return cache[name].exports;
+
+ function localRequire(x){
+ return newRequire(localRequire.resolve(x));
+ }
+
+ function resolve(x){
+ return modules[name][1][x] || x;
+ }
+ }
+
+ function Module(moduleName) {
+ this.id = moduleName;
+ this.bundle = newRequire;
+ this.exports = {};
+ }
+
+ newRequire.isParcelRequire = true;
+ newRequire.Module = Module;
+ newRequire.modules = modules;
+ newRequire.cache = cache;
+ newRequire.parent = previousRequire;
+ newRequire.register = function (id, exports) {
+ modules[id] = [function (require, module) {
+ module.exports = exports;
+ }, {}];
+ };
+
+ for (var i = 0; i < entry.length; i++) {
+ newRequire(entry[i]);
+ }
+
+ if (entry.length) {
+ // Expose entry point to Node, AMD or browser globals
+ // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js
+ var mainExports = newRequire(entry[entry.length - 1]);
+
+ // CommonJS
+ if (typeof exports === "object" && typeof module !== "undefined") {
+ module.exports = mainExports;
+
+ // RequireJS
+ } else if (typeof define === "function" && define.amd) {
+ define(function () {
+ return mainExports;
+ });
+
+ // <script>
+ } else if (globalName) {
+ this[globalName] = mainExports;
+ }
+ }
+
+ // Override the current require with this new one
+ return newRequire;
+})({"src/mod.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = "a-default";
+const Four = exports.Four = "one";
+},{}],"input.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = root;
+
+var _mod = require("./src/mod");
+
+const aConst = "a-const";
+
+function root() {
+ console.log("pause here", aConst, _mod.Four, root);
+}
+},{"./src/mod":"src/mod.js"}]},{},["input.js"], "parcelBabelFlowtypeBindings")
+//# sourceMappingURL=babel-flowtype-bindings.map
+;parcelBabelFlowtypeBindings = parcelBabelFlowtypeBindings.default; \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/babel-flowtype-bindings.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/babel-flowtype-bindings.map
new file mode 100644
index 0000000000..2da6f3989a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/babel-flowtype-bindings.map
@@ -0,0 +1 @@
+{"version":3,"sources":["parcel://./babel-flowtype-bindings/src/mod.js","parcel://./babel-flowtype-bindings/input.js"],"names":["Four","root","aConst","console","log"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAAe;AACR,MAAMA,sBAAO,KAAb;;;;;;;kBCMiBC;;AANxB;;AAIA,MAAMC,SAAS,SAAf;;AAEe,SAASD,IAAT,GAAgB;AAC7BE,UAAQC,GAAR,CAAY,YAAZ,EAA0BF,MAA1B,EAAkCF,SAAlC,EAAwCC,IAAxC;AACD","file":"babel-flowtype-bindings.map","sourcesContent":["export default \"a-default\";\nexport const Four = \"one\";\n","import type { One, Two, Three } from \"./src/mod\";\nimport { Four, type Five, typeof Six } from \"./src/mod\";\n\ntype Other = {};\n\nconst aConst = \"a-const\";\n\nexport default function root() {\n console.log(\"pause here\", aConst, Four, root);\n}\n"]} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/classes.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/classes.js
new file mode 100644
index 0000000000..009bb4e675
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/classes.js
@@ -0,0 +1,137 @@
+// modules are defined as an array
+// [ module function, map of requires ]
+//
+// map of requires is short require name -> numeric require
+//
+// anything defined in a previous bundle is accessed via the
+// orig method which is the require for previous bundles
+
+// eslint-disable-next-line no-global-assign
+parcelRequire = (function (modules, cache, entry, globalName) {
+ // Save the require from previous bundle to this closure if any
+ var previousRequire = typeof parcelRequire === 'function' && parcelRequire;
+ var nodeRequire = typeof require === 'function' && require;
+
+ function newRequire(name, jumped) {
+ if (!cache[name]) {
+ if (!modules[name]) {
+ // if we cannot find the module within our internal map or
+ // cache jump to the current global require ie. the last bundle
+ // that was added to the page.
+ var currentRequire = typeof parcelRequire === 'function' && parcelRequire;
+ if (!jumped && currentRequire) {
+ return currentRequire(name, true);
+ }
+
+ // If there are other bundles on this page the require from the
+ // previous one is saved to 'previousRequire'. Repeat this as
+ // many times as there are bundles until the module is found or
+ // we exhaust the require chain.
+ if (previousRequire) {
+ return previousRequire(name, true);
+ }
+
+ // Try the node require function if it exists.
+ if (nodeRequire && typeof name === 'string') {
+ return nodeRequire(name);
+ }
+
+ var err = new Error('Cannot find module \'' + name + '\'');
+ err.code = 'MODULE_NOT_FOUND';
+ throw err;
+ }
+
+ localRequire.resolve = resolve;
+
+ var module = cache[name] = new newRequire.Module(name);
+
+ modules[name][0].call(module.exports, localRequire, module, module.exports, this);
+ }
+
+ return cache[name].exports;
+
+ function localRequire(x){
+ return newRequire(localRequire.resolve(x));
+ }
+
+ function resolve(x){
+ return modules[name][1][x] || x;
+ }
+ }
+
+ function Module(moduleName) {
+ this.id = moduleName;
+ this.bundle = newRequire;
+ this.exports = {};
+ }
+
+ newRequire.isParcelRequire = true;
+ newRequire.Module = Module;
+ newRequire.modules = modules;
+ newRequire.cache = cache;
+ newRequire.parent = previousRequire;
+ newRequire.register = function (id, exports) {
+ modules[id] = [function (require, module) {
+ module.exports = exports;
+ }, {}];
+ };
+
+ for (var i = 0; i < entry.length; i++) {
+ newRequire(entry[i]);
+ }
+
+ if (entry.length) {
+ // Expose entry point to Node, AMD or browser globals
+ // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js
+ var mainExports = newRequire(entry[entry.length - 1]);
+
+ // CommonJS
+ if (typeof exports === "object" && typeof module !== "undefined") {
+ module.exports = mainExports;
+
+ // RequireJS
+ } else if (typeof define === "function" && define.amd) {
+ define(function () {
+ return mainExports;
+ });
+
+ // <script>
+ } else if (globalName) {
+ this[globalName] = mainExports;
+ }
+ }
+
+ // Override the current require with this new one
+ return newRequire;
+})({"input.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = root;
+function root() {
+ let one = 1;
+
+ class Thing {
+ one() {
+ console.log("pause here");
+ }
+ }
+
+ class Another {
+ method() {
+ let two = 2;
+
+ const three = 3;
+
+ console.log("pause here", Another, one, Thing, root);
+ }
+ }
+
+ new Another().method();
+ new Thing().one();
+}
+},{}]},{},["input.js"], "parcelClasses")
+//# sourceMappingURL=classes.map
+;parcelClasses = parcelClasses.default; \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/classes.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/classes.map
new file mode 100644
index 0000000000..5b2a2db2ab
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/classes.map
@@ -0,0 +1 @@
+{"version":3,"sources":["parcel://./classes/input.js"],"names":["root","one","Thing","console","log","Another","method","two","three"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAAwBA;AAAT,SAASA,IAAT,GAAgB;AAC7B,MAAIC,MAAM,CAAV;;AAEA,QAAMC,KAAN,CAAY;AACVD,UAAM;AACJE,cAAQC,GAAR,CAAY,YAAZ;AACD;AAHS;;AAMZ,QAAMC,OAAN,CAAc;AACZC,aAAS;AACP,UAAIC,MAAM,CAAV;;AAEA,YAAMC,QAAQ,CAAd;;AAEAL,cAAQC,GAAR,CAAY,YAAZ,EAA0BC,OAA1B,EAAmCJ,GAAnC,EAAwCC,KAAxC,EAA+CF,IAA/C;AACD;AAPW;;AAUd,MAAIK,OAAJ,GAAcC,MAAd;AACA,MAAIJ,KAAJ,GAAYD,GAAZ;AACD","file":"classes.map","sourcesContent":["export default function root() {\n let one = 1;\n\n class Thing {\n one() {\n console.log(\"pause here\");\n }\n }\n\n class Another {\n method() {\n let two = 2;\n\n const three = 3;\n\n console.log(\"pause here\", Another, one, Thing, root);\n }\n }\n\n new Another().method();\n new Thing().one();\n}\n"]} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/esmodules-cjs.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/esmodules-cjs.js
new file mode 100644
index 0000000000..bebd2ad941
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/esmodules-cjs.js
@@ -0,0 +1,259 @@
+// modules are defined as an array
+// [ module function, map of requires ]
+//
+// map of requires is short require name -> numeric require
+//
+// anything defined in a previous bundle is accessed via the
+// orig method which is the require for previous bundles
+
+// eslint-disable-next-line no-global-assign
+parcelRequire = (function (modules, cache, entry, globalName) {
+ // Save the require from previous bundle to this closure if any
+ var previousRequire = typeof parcelRequire === 'function' && parcelRequire;
+ var nodeRequire = typeof require === 'function' && require;
+
+ function newRequire(name, jumped) {
+ if (!cache[name]) {
+ if (!modules[name]) {
+ // if we cannot find the module within our internal map or
+ // cache jump to the current global require ie. the last bundle
+ // that was added to the page.
+ var currentRequire = typeof parcelRequire === 'function' && parcelRequire;
+ if (!jumped && currentRequire) {
+ return currentRequire(name, true);
+ }
+
+ // If there are other bundles on this page the require from the
+ // previous one is saved to 'previousRequire'. Repeat this as
+ // many times as there are bundles until the module is found or
+ // we exhaust the require chain.
+ if (previousRequire) {
+ return previousRequire(name, true);
+ }
+
+ // Try the node require function if it exists.
+ if (nodeRequire && typeof name === 'string') {
+ return nodeRequire(name);
+ }
+
+ var err = new Error('Cannot find module \'' + name + '\'');
+ err.code = 'MODULE_NOT_FOUND';
+ throw err;
+ }
+
+ localRequire.resolve = resolve;
+
+ var module = cache[name] = new newRequire.Module(name);
+
+ modules[name][0].call(module.exports, localRequire, module, module.exports, this);
+ }
+
+ return cache[name].exports;
+
+ function localRequire(x){
+ return newRequire(localRequire.resolve(x));
+ }
+
+ function resolve(x){
+ return modules[name][1][x] || x;
+ }
+ }
+
+ function Module(moduleName) {
+ this.id = moduleName;
+ this.bundle = newRequire;
+ this.exports = {};
+ }
+
+ newRequire.isParcelRequire = true;
+ newRequire.Module = Module;
+ newRequire.modules = modules;
+ newRequire.cache = cache;
+ newRequire.parent = previousRequire;
+ newRequire.register = function (id, exports) {
+ modules[id] = [function (require, module) {
+ module.exports = exports;
+ }, {}];
+ };
+
+ for (var i = 0; i < entry.length; i++) {
+ newRequire(entry[i]);
+ }
+
+ if (entry.length) {
+ // Expose entry point to Node, AMD or browser globals
+ // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js
+ var mainExports = newRequire(entry[entry.length - 1]);
+
+ // CommonJS
+ if (typeof exports === "object" && typeof module !== "undefined") {
+ module.exports = mainExports;
+
+ // RequireJS
+ } else if (typeof define === "function" && define.amd) {
+ define(function () {
+ return mainExports;
+ });
+
+ // <script>
+ } else if (globalName) {
+ this[globalName] = mainExports;
+ }
+ }
+
+ // Override the current require with this new one
+ return newRequire;
+})({"src/mod1.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = "a-default";
+},{}],"src/mod2.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+const aNamed = exports.aNamed = "a-named";
+},{}],"src/mod3.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+const original = exports.original = "an-original";
+},{}],"src/mod4.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = "a-default";
+const aNamed = exports.aNamed = "a-named";
+},{}],"src/mod5.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = "a-default2";
+},{}],"src/mod6.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+const aNamed2 = exports.aNamed2 = "a-named2";
+},{}],"src/mod7.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+const original = exports.original = "an-original2";
+},{}],"src/mod9.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = "a-default3";
+},{}],"src/mod10.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+const aNamed3 = exports.aNamed3 = "a-named3";
+},{}],"src/mod11.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+const original = exports.original = "an-original3";
+},{}],"src/optimized-out.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = optimizedOut;
+function optimizedOut() {}
+},{}],"input.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = root;
+exports.example = example;
+
+var _mod = require("./src/mod1");
+
+var _mod2 = _interopRequireDefault(_mod);
+
+var _mod3 = require("./src/mod2");
+
+var _mod4 = require("./src/mod3");
+
+var _mod5 = require("./src/mod4");
+
+var aNamespace = _interopRequireWildcard(_mod5);
+
+var _mod6 = require("./src/mod5");
+
+var _mod7 = _interopRequireDefault(_mod6);
+
+var _mod8 = require("./src/mod6");
+
+var _mod9 = require("./src/mod7");
+
+var _mod10 = require("./src/mod9");
+
+var _mod11 = _interopRequireDefault(_mod10);
+
+var _mod12 = require("./src/mod10");
+
+var _mod13 = require("./src/mod11");
+
+var _optimizedOut = require("./src/optimized-out");
+
+var _optimizedOut2 = _interopRequireDefault(_optimizedOut);
+
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+(0, _optimizedOut2.default)();
+
+function root() {
+ console.log("pause here", root);
+
+ console.log(_mod2.default);
+ console.log(_mod4.original);
+ console.log(_mod3.aNamed);
+ console.log(_mod3.aNamed);
+ console.log(aNamespace);
+
+ try {
+ // None of these are callable in this code, but we still want to make sure
+ // they map properly even if the only reference is in a call expressions.
+ console.log((0, _mod7.default)());
+ console.log((0, _mod9.original)());
+ console.log((0, _mod8.aNamed2)());
+ console.log((0, _mod8.aNamed2)());
+
+ console.log(new _mod11.default());
+ console.log(new _mod13.original());
+ console.log(new _mod12.aNamed3());
+ console.log(new _mod12.aNamed3());
+ } catch (e) {}
+}
+
+function example() {}
+},{"./src/mod1":"src/mod1.js","./src/mod2":"src/mod2.js","./src/mod3":"src/mod3.js","./src/mod4":"src/mod4.js","./src/mod5":"src/mod5.js","./src/mod6":"src/mod6.js","./src/mod7":"src/mod7.js","./src/mod9":"src/mod9.js","./src/mod10":"src/mod10.js","./src/mod11":"src/mod11.js","./src/optimized-out":"src/optimized-out.js"}]},{},["input.js"], "parcelEsmodulesCjs")
+//# sourceMappingURL=esmodules-cjs.map
+;parcelEsmodulesCjs = parcelEsmodulesCjs.default; \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/esmodules-cjs.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/esmodules-cjs.map
new file mode 100644
index 0000000000..bb4e0f03d2
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/esmodules-cjs.map
@@ -0,0 +1 @@
+{"version":3,"sources":["parcel://./esmodules-cjs/src/mod1.js","parcel://./esmodules-cjs/src/mod2.js","parcel://./esmodules-cjs/src/mod3.js","parcel://./esmodules-cjs/src/mod4.js","parcel://./esmodules-cjs/src/mod5.js","parcel://./esmodules-cjs/src/mod6.js","parcel://./esmodules-cjs/src/mod7.js","parcel://./esmodules-cjs/src/mod9.js","parcel://./esmodules-cjs/src/mod10.js","parcel://./esmodules-cjs/src/mod11.js","parcel://./esmodules-cjs/src/optimized-out.js","parcel://./esmodules-cjs/input.js"],"names":["aNamed","original","aNamed2","aNamed3","optimizedOut","root","example","aNamespace","console","log","aDefault","anAliased","anotherNamed","aDefault3","anAliased3","anotherNamed3","e"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAAe;;;;;;;ACAR,MAAMA,0BAAS,SAAf;;;;;;;ACAA,MAAMC,8BAAW,aAAjB;;;;;;;kBCAQ;AACR,MAAMD,0BAAS,SAAf;;;;;;;kBCDQ;;;;;;;ACAR,MAAME,4BAAU,UAAhB;;;;;;;ACAA,MAAMD,8BAAW,cAAjB;;;;;;;kBCAQ;;;;;;;ACAR,MAAME,4BAAU,UAAhB;;;;;;;ACAA,MAAMF,8BAAW,cAAjB;;;;;;;kBCAiBG;AAAT,SAASA,YAAT,GAAwB,CAAE;;;;;;;kBCgBjBC;QAwBRC,UAAAA;;AAxChB;;;;AACA;;AACA;;AACA;;IAAYC;;AAEZ;;;;AACA;;AACA;;AAEA;;;;AACA;;AACA;;AAEA;;;;;;;;AACA;;AAEe,SAASF,IAAT,GAAgB;AAC7BG,UAAQC,GAAR,CAAY,YAAZ,EAA0BJ,IAA1B;;AAEAG,UAAQC,GAAR,CAAYC,aAAZ;AACAF,UAAQC,GAAR,CAAYE,cAAZ;AACAH,UAAQC,GAAR,CAAYT,YAAZ;AACAQ,UAAQC,GAAR,CAAYG,YAAZ;AACAJ,UAAQC,GAAR,CAAYF,UAAZ;;AAEA,MAAI;AACF;AACA;AACAC,YAAQC,GAAR,CAAY,oBAAZ;AACAD,YAAQC,GAAR,CAAY,qBAAZ;AACAD,YAAQC,GAAR,CAAY,oBAAZ;AACAD,YAAQC,GAAR,CAAY,oBAAZ;;AAEAD,YAAQC,GAAR,CAAY,IAAII,cAAJ,EAAZ;AACAL,YAAQC,GAAR,CAAY,IAAIK,eAAJ,EAAZ;AACAN,YAAQC,GAAR,CAAY,IAAIN,cAAJ,EAAZ;AACAK,YAAQC,GAAR,CAAY,IAAIM,cAAJ,EAAZ;AACD,GAZD,CAYE,OAAOC,CAAP,EAAU,CAAE;AACf;;AAEM,SAASV,OAAT,GAAkB,CAAE","file":"esmodules-cjs.map","sourcesContent":["export default \"a-default\";\n","export const aNamed = \"a-named\";\n","export const original = \"an-original\";\n","export default \"a-default\";\nexport const aNamed = \"a-named\";\n","export default \"a-default2\";\n","export const aNamed2 = \"a-named2\";\n","export const original = \"an-original2\";\n","export default \"a-default3\";\n","export const aNamed3 = \"a-named3\";\n","export const original = \"an-original3\";\n","export default function optimizedOut() {}\n","import aDefault from \"./src/mod1\";\nimport { aNamed, aNamed as anotherNamed } from \"./src/mod2\";\nimport { original as anAliased } from \"./src/mod3\";\nimport * as aNamespace from \"./src/mod4\";\n\nimport aDefault2 from \"./src/mod5\";\nimport { aNamed2, aNamed2 as anotherNamed2 } from \"./src/mod6\";\nimport { original as anAliased2 } from \"./src/mod7\";\n\nimport aDefault3 from \"./src/mod9\";\nimport { aNamed3, aNamed3 as anotherNamed3 } from \"./src/mod10\";\nimport { original as anAliased3 } from \"./src/mod11\";\n\nimport optimizedOut from \"./src/optimized-out\";\noptimizedOut();\n\nexport default function root() {\n console.log(\"pause here\", root);\n\n console.log(aDefault);\n console.log(anAliased);\n console.log(aNamed);\n console.log(anotherNamed);\n console.log(aNamespace);\n\n try {\n // None of these are callable in this code, but we still want to make sure\n // they map properly even if the only reference is in a call expressions.\n console.log(aDefault2());\n console.log(anAliased2());\n console.log(aNamed2());\n console.log(anotherNamed2());\n\n console.log(new aDefault3());\n console.log(new anAliased3());\n console.log(new aNamed3());\n console.log(new anotherNamed3());\n } catch (e) {}\n}\n\nexport function example(){}\n"]} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/esmodules-es6.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/esmodules-es6.js
new file mode 100644
index 0000000000..5f708dfb5f
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/esmodules-es6.js
@@ -0,0 +1,259 @@
+// modules are defined as an array
+// [ module function, map of requires ]
+//
+// map of requires is short require name -> numeric require
+//
+// anything defined in a previous bundle is accessed via the
+// orig method which is the require for previous bundles
+
+// eslint-disable-next-line no-global-assign
+parcelRequire = (function (modules, cache, entry, globalName) {
+ // Save the require from previous bundle to this closure if any
+ var previousRequire = typeof parcelRequire === 'function' && parcelRequire;
+ var nodeRequire = typeof require === 'function' && require;
+
+ function newRequire(name, jumped) {
+ if (!cache[name]) {
+ if (!modules[name]) {
+ // if we cannot find the module within our internal map or
+ // cache jump to the current global require ie. the last bundle
+ // that was added to the page.
+ var currentRequire = typeof parcelRequire === 'function' && parcelRequire;
+ if (!jumped && currentRequire) {
+ return currentRequire(name, true);
+ }
+
+ // If there are other bundles on this page the require from the
+ // previous one is saved to 'previousRequire'. Repeat this as
+ // many times as there are bundles until the module is found or
+ // we exhaust the require chain.
+ if (previousRequire) {
+ return previousRequire(name, true);
+ }
+
+ // Try the node require function if it exists.
+ if (nodeRequire && typeof name === 'string') {
+ return nodeRequire(name);
+ }
+
+ var err = new Error('Cannot find module \'' + name + '\'');
+ err.code = 'MODULE_NOT_FOUND';
+ throw err;
+ }
+
+ localRequire.resolve = resolve;
+
+ var module = cache[name] = new newRequire.Module(name);
+
+ modules[name][0].call(module.exports, localRequire, module, module.exports, this);
+ }
+
+ return cache[name].exports;
+
+ function localRequire(x){
+ return newRequire(localRequire.resolve(x));
+ }
+
+ function resolve(x){
+ return modules[name][1][x] || x;
+ }
+ }
+
+ function Module(moduleName) {
+ this.id = moduleName;
+ this.bundle = newRequire;
+ this.exports = {};
+ }
+
+ newRequire.isParcelRequire = true;
+ newRequire.Module = Module;
+ newRequire.modules = modules;
+ newRequire.cache = cache;
+ newRequire.parent = previousRequire;
+ newRequire.register = function (id, exports) {
+ modules[id] = [function (require, module) {
+ module.exports = exports;
+ }, {}];
+ };
+
+ for (var i = 0; i < entry.length; i++) {
+ newRequire(entry[i]);
+ }
+
+ if (entry.length) {
+ // Expose entry point to Node, AMD or browser globals
+ // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js
+ var mainExports = newRequire(entry[entry.length - 1]);
+
+ // CommonJS
+ if (typeof exports === "object" && typeof module !== "undefined") {
+ module.exports = mainExports;
+
+ // RequireJS
+ } else if (typeof define === "function" && define.amd) {
+ define(function () {
+ return mainExports;
+ });
+
+ // <script>
+ } else if (globalName) {
+ this[globalName] = mainExports;
+ }
+ }
+
+ // Override the current require with this new one
+ return newRequire;
+})({"src/mod1.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = "a-default";
+},{}],"src/mod2.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+const aNamed = exports.aNamed = "a-named";
+},{}],"src/mod3.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+const original = exports.original = "an-original";
+},{}],"src/mod4.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = "a-default";
+const aNamed = exports.aNamed = "a-named";
+},{}],"src/mod5.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = "a-default2";
+},{}],"src/mod6.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+const aNamed2 = exports.aNamed2 = "a-named2";
+},{}],"src/mod7.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+const original = exports.original = "an-original2";
+},{}],"src/mod9.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = "a-default3";
+},{}],"src/mod10.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+const aNamed3 = exports.aNamed3 = "a-named3";
+},{}],"src/mod11.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+const original = exports.original = "an-original3";
+},{}],"src/optimized-out.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = optimizedOut;
+function optimizedOut() {}
+},{}],"input.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = root;
+exports.example = example;
+
+var _mod = require("./src/mod1");
+
+var _mod2 = _interopRequireDefault(_mod);
+
+var _mod3 = require("./src/mod2");
+
+var _mod4 = require("./src/mod3");
+
+var _mod5 = require("./src/mod4");
+
+var aNamespace = _interopRequireWildcard(_mod5);
+
+var _mod6 = require("./src/mod5");
+
+var _mod7 = _interopRequireDefault(_mod6);
+
+var _mod8 = require("./src/mod6");
+
+var _mod9 = require("./src/mod7");
+
+var _mod10 = require("./src/mod9");
+
+var _mod11 = _interopRequireDefault(_mod10);
+
+var _mod12 = require("./src/mod10");
+
+var _mod13 = require("./src/mod11");
+
+var _optimizedOut = require("./src/optimized-out");
+
+var _optimizedOut2 = _interopRequireDefault(_optimizedOut);
+
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+(0, _optimizedOut2.default)();
+
+function root() {
+ console.log("pause here", root);
+
+ console.log(_mod2.default);
+ console.log(_mod4.original);
+ console.log(_mod3.aNamed);
+ console.log(_mod3.aNamed);
+ console.log(aNamespace);
+
+ try {
+ // None of these are callable in this code, but we still want to make sure
+ // they map properly even if the only reference is in a call expressions.
+ console.log((0, _mod7.default)());
+ console.log((0, _mod9.original)());
+ console.log((0, _mod8.aNamed2)());
+ console.log((0, _mod8.aNamed2)());
+
+ console.log(new _mod11.default());
+ console.log(new _mod13.original());
+ console.log(new _mod12.aNamed3());
+ console.log(new _mod12.aNamed3());
+ } catch (e) {}
+}
+
+function example() {}
+},{"./src/mod1":"src/mod1.js","./src/mod2":"src/mod2.js","./src/mod3":"src/mod3.js","./src/mod4":"src/mod4.js","./src/mod5":"src/mod5.js","./src/mod6":"src/mod6.js","./src/mod7":"src/mod7.js","./src/mod9":"src/mod9.js","./src/mod10":"src/mod10.js","./src/mod11":"src/mod11.js","./src/optimized-out":"src/optimized-out.js"}]},{},["input.js"], "parcelEsmodulesEs6")
+//# sourceMappingURL=esmodules-es6.map
+;parcelEsmodulesEs6 = parcelEsmodulesEs6.default; \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/esmodules-es6.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/esmodules-es6.map
new file mode 100644
index 0000000000..cc6ecd4fba
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/esmodules-es6.map
@@ -0,0 +1 @@
+{"version":3,"sources":["parcel://./esmodules-es6/src/mod1.js","parcel://./esmodules-es6/src/mod2.js","parcel://./esmodules-es6/src/mod3.js","parcel://./esmodules-es6/src/mod4.js","parcel://./esmodules-es6/src/mod5.js","parcel://./esmodules-es6/src/mod6.js","parcel://./esmodules-es6/src/mod7.js","parcel://./esmodules-es6/src/mod9.js","parcel://./esmodules-es6/src/mod10.js","parcel://./esmodules-es6/src/mod11.js","parcel://./esmodules-es6/src/optimized-out.js","parcel://./esmodules-es6/input.js"],"names":["aNamed","original","aNamed2","aNamed3","optimizedOut","root","example","aNamespace","console","log","aDefault","anAliased","anotherNamed","aDefault3","anAliased3","anotherNamed3","e"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAAe;;;;;;;ACAR,MAAMA,0BAAS,SAAf;;;;;;;ACAA,MAAMC,8BAAW,aAAjB;;;;;;;kBCAQ;AACR,MAAMD,0BAAS,SAAf;;;;;;;kBCDQ;;;;;;;ACAR,MAAME,4BAAU,UAAhB;;;;;;;ACAA,MAAMD,8BAAW,cAAjB;;;;;;;kBCAQ;;;;;;;ACAR,MAAME,4BAAU,UAAhB;;;;;;;ACAA,MAAMF,8BAAW,cAAjB;;;;;;;kBCAiBG;AAAT,SAASA,YAAT,GAAwB,CAAE;;;;;;;kBCgBjBC;QAwBRC,UAAAA;;AAxChB;;;;AACA;;AACA;;AACA;;IAAYC;;AAEZ;;;;AACA;;AACA;;AAEA;;;;AACA;;AACA;;AAEA;;;;;;;;AACA;;AAEe,SAASF,IAAT,GAAgB;AAC7BG,UAAQC,GAAR,CAAY,YAAZ,EAA0BJ,IAA1B;;AAEAG,UAAQC,GAAR,CAAYC,aAAZ;AACAF,UAAQC,GAAR,CAAYE,cAAZ;AACAH,UAAQC,GAAR,CAAYT,YAAZ;AACAQ,UAAQC,GAAR,CAAYG,YAAZ;AACAJ,UAAQC,GAAR,CAAYF,UAAZ;;AAEA,MAAI;AACF;AACA;AACAC,YAAQC,GAAR,CAAY,oBAAZ;AACAD,YAAQC,GAAR,CAAY,qBAAZ;AACAD,YAAQC,GAAR,CAAY,oBAAZ;AACAD,YAAQC,GAAR,CAAY,oBAAZ;;AAEAD,YAAQC,GAAR,CAAY,IAAII,cAAJ,EAAZ;AACAL,YAAQC,GAAR,CAAY,IAAIK,eAAJ,EAAZ;AACAN,YAAQC,GAAR,CAAY,IAAIN,cAAJ,EAAZ;AACAK,YAAQC,GAAR,CAAY,IAAIM,cAAJ,EAAZ;AACD,GAZD,CAYE,OAAOC,CAAP,EAAU,CAAE;AACf;;AAEM,SAASV,OAAT,GAAkB,CAAE","file":"esmodules-es6.map","sourcesContent":["export default \"a-default\";\n","export const aNamed = \"a-named\";\n","export const original = \"an-original\";\n","export default \"a-default\";\nexport const aNamed = \"a-named\";\n","export default \"a-default2\";\n","export const aNamed2 = \"a-named2\";\n","export const original = \"an-original2\";\n","export default \"a-default3\";\n","export const aNamed3 = \"a-named3\";\n","export const original = \"an-original3\";\n","export default function optimizedOut() {}\n","import aDefault from \"./src/mod1\";\nimport { aNamed, aNamed as anotherNamed } from \"./src/mod2\";\nimport { original as anAliased } from \"./src/mod3\";\nimport * as aNamespace from \"./src/mod4\";\n\nimport aDefault2 from \"./src/mod5\";\nimport { aNamed2, aNamed2 as anotherNamed2 } from \"./src/mod6\";\nimport { original as anAliased2 } from \"./src/mod7\";\n\nimport aDefault3 from \"./src/mod9\";\nimport { aNamed3, aNamed3 as anotherNamed3 } from \"./src/mod10\";\nimport { original as anAliased3 } from \"./src/mod11\";\n\nimport optimizedOut from \"./src/optimized-out\";\noptimizedOut();\n\nexport default function root() {\n console.log(\"pause here\", root);\n\n console.log(aDefault);\n console.log(anAliased);\n console.log(aNamed);\n console.log(anotherNamed);\n console.log(aNamespace);\n\n try {\n // None of these are callable in this code, but we still want to make sure\n // they map properly even if the only reference is in a call expressions.\n console.log(aDefault2());\n console.log(anAliased2());\n console.log(aNamed2());\n console.log(anotherNamed2());\n\n console.log(new aDefault3());\n console.log(new anAliased3());\n console.log(new aNamed3());\n console.log(new anotherNamed3());\n } catch (e) {}\n}\n\nexport function example(){}\n"]} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/esmodules.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/esmodules.js
new file mode 100644
index 0000000000..2d58dd528a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/esmodules.js
@@ -0,0 +1,259 @@
+// modules are defined as an array
+// [ module function, map of requires ]
+//
+// map of requires is short require name -> numeric require
+//
+// anything defined in a previous bundle is accessed via the
+// orig method which is the require for previous bundles
+
+// eslint-disable-next-line no-global-assign
+parcelRequire = (function (modules, cache, entry, globalName) {
+ // Save the require from previous bundle to this closure if any
+ var previousRequire = typeof parcelRequire === 'function' && parcelRequire;
+ var nodeRequire = typeof require === 'function' && require;
+
+ function newRequire(name, jumped) {
+ if (!cache[name]) {
+ if (!modules[name]) {
+ // if we cannot find the module within our internal map or
+ // cache jump to the current global require ie. the last bundle
+ // that was added to the page.
+ var currentRequire = typeof parcelRequire === 'function' && parcelRequire;
+ if (!jumped && currentRequire) {
+ return currentRequire(name, true);
+ }
+
+ // If there are other bundles on this page the require from the
+ // previous one is saved to 'previousRequire'. Repeat this as
+ // many times as there are bundles until the module is found or
+ // we exhaust the require chain.
+ if (previousRequire) {
+ return previousRequire(name, true);
+ }
+
+ // Try the node require function if it exists.
+ if (nodeRequire && typeof name === 'string') {
+ return nodeRequire(name);
+ }
+
+ var err = new Error('Cannot find module \'' + name + '\'');
+ err.code = 'MODULE_NOT_FOUND';
+ throw err;
+ }
+
+ localRequire.resolve = resolve;
+
+ var module = cache[name] = new newRequire.Module(name);
+
+ modules[name][0].call(module.exports, localRequire, module, module.exports, this);
+ }
+
+ return cache[name].exports;
+
+ function localRequire(x){
+ return newRequire(localRequire.resolve(x));
+ }
+
+ function resolve(x){
+ return modules[name][1][x] || x;
+ }
+ }
+
+ function Module(moduleName) {
+ this.id = moduleName;
+ this.bundle = newRequire;
+ this.exports = {};
+ }
+
+ newRequire.isParcelRequire = true;
+ newRequire.Module = Module;
+ newRequire.modules = modules;
+ newRequire.cache = cache;
+ newRequire.parent = previousRequire;
+ newRequire.register = function (id, exports) {
+ modules[id] = [function (require, module) {
+ module.exports = exports;
+ }, {}];
+ };
+
+ for (var i = 0; i < entry.length; i++) {
+ newRequire(entry[i]);
+ }
+
+ if (entry.length) {
+ // Expose entry point to Node, AMD or browser globals
+ // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js
+ var mainExports = newRequire(entry[entry.length - 1]);
+
+ // CommonJS
+ if (typeof exports === "object" && typeof module !== "undefined") {
+ module.exports = mainExports;
+
+ // RequireJS
+ } else if (typeof define === "function" && define.amd) {
+ define(function () {
+ return mainExports;
+ });
+
+ // <script>
+ } else if (globalName) {
+ this[globalName] = mainExports;
+ }
+ }
+
+ // Override the current require with this new one
+ return newRequire;
+})({"src/mod1.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = "a-default";
+},{}],"src/mod2.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+const aNamed = exports.aNamed = "a-named";
+},{}],"src/mod3.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+const original = exports.original = "an-original";
+},{}],"src/mod4.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = "a-default";
+const aNamed = exports.aNamed = "a-named";
+},{}],"src/mod5.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = "a-default2";
+},{}],"src/mod6.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+const aNamed2 = exports.aNamed2 = "a-named2";
+},{}],"src/mod7.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+const original = exports.original = "an-original2";
+},{}],"src/mod9.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = "a-default3";
+},{}],"src/mod10.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+const aNamed3 = exports.aNamed3 = "a-named3";
+},{}],"src/mod11.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+const original = exports.original = "an-original3";
+},{}],"src/optimized-out.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = optimizedOut;
+function optimizedOut() {}
+},{}],"input.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = root;
+exports.example = example;
+
+var _mod = require("./src/mod1");
+
+var _mod2 = _interopRequireDefault(_mod);
+
+var _mod3 = require("./src/mod2");
+
+var _mod4 = require("./src/mod3");
+
+var _mod5 = require("./src/mod4");
+
+var aNamespace = _interopRequireWildcard(_mod5);
+
+var _mod6 = require("./src/mod5");
+
+var _mod7 = _interopRequireDefault(_mod6);
+
+var _mod8 = require("./src/mod6");
+
+var _mod9 = require("./src/mod7");
+
+var _mod10 = require("./src/mod9");
+
+var _mod11 = _interopRequireDefault(_mod10);
+
+var _mod12 = require("./src/mod10");
+
+var _mod13 = require("./src/mod11");
+
+var _optimizedOut = require("./src/optimized-out");
+
+var _optimizedOut2 = _interopRequireDefault(_optimizedOut);
+
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+(0, _optimizedOut2.default)();
+
+function root() {
+ console.log("pause here", root);
+
+ console.log(_mod2.default);
+ console.log(_mod4.original);
+ console.log(_mod3.aNamed);
+ console.log(_mod3.aNamed);
+ console.log(aNamespace);
+
+ try {
+ // None of these are callable in this code, but we still want to make sure
+ // they map properly even if the only reference is in a call expressions.
+ console.log((0, _mod7.default)());
+ console.log((0, _mod9.original)());
+ console.log((0, _mod8.aNamed2)());
+ console.log((0, _mod8.aNamed2)());
+
+ console.log(new _mod11.default());
+ console.log(new _mod13.original());
+ console.log(new _mod12.aNamed3());
+ console.log(new _mod12.aNamed3());
+ } catch (e) {}
+}
+
+function example() {}
+},{"./src/mod1":"src/mod1.js","./src/mod2":"src/mod2.js","./src/mod3":"src/mod3.js","./src/mod4":"src/mod4.js","./src/mod5":"src/mod5.js","./src/mod6":"src/mod6.js","./src/mod7":"src/mod7.js","./src/mod9":"src/mod9.js","./src/mod10":"src/mod10.js","./src/mod11":"src/mod11.js","./src/optimized-out":"src/optimized-out.js"}]},{},["input.js"], "parcelEsmodules")
+//# sourceMappingURL=esmodules.map
+;parcelEsmodules = parcelEsmodules.default; \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/esmodules.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/esmodules.map
new file mode 100644
index 0000000000..3c41caee5b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/esmodules.map
@@ -0,0 +1 @@
+{"version":3,"sources":["parcel://./esmodules/src/mod1.js","parcel://./esmodules/src/mod2.js","parcel://./esmodules/src/mod3.js","parcel://./esmodules/src/mod4.js","parcel://./esmodules/src/mod5.js","parcel://./esmodules/src/mod6.js","parcel://./esmodules/src/mod7.js","parcel://./esmodules/src/mod9.js","parcel://./esmodules/src/mod10.js","parcel://./esmodules/src/mod11.js","parcel://./esmodules/src/optimized-out.js","parcel://./esmodules/input.js"],"names":["aNamed","original","aNamed2","aNamed3","optimizedOut","root","example","aNamespace","console","log","aDefault","anAliased","anotherNamed","aDefault3","anAliased3","anotherNamed3","e"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAAe;;;;;;;ACAR,MAAMA,0BAAS,SAAf;;;;;;;ACAA,MAAMC,8BAAW,aAAjB;;;;;;;kBCAQ;AACR,MAAMD,0BAAS,SAAf;;;;;;;kBCDQ;;;;;;;ACAR,MAAME,4BAAU,UAAhB;;;;;;;ACAA,MAAMD,8BAAW,cAAjB;;;;;;;kBCAQ;;;;;;;ACAR,MAAME,4BAAU,UAAhB;;;;;;;ACAA,MAAMF,8BAAW,cAAjB;;;;;;;kBCAiBG;AAAT,SAASA,YAAT,GAAwB,CAAE;;;;;;;kBCgBjBC;QAwBRC,UAAAA;;AAxChB;;;;AACA;;AACA;;AACA;;IAAYC;;AAEZ;;;;AACA;;AACA;;AAEA;;;;AACA;;AACA;;AAEA;;;;;;;;AACA;;AAEe,SAASF,IAAT,GAAgB;AAC7BG,UAAQC,GAAR,CAAY,YAAZ,EAA0BJ,IAA1B;;AAEAG,UAAQC,GAAR,CAAYC,aAAZ;AACAF,UAAQC,GAAR,CAAYE,cAAZ;AACAH,UAAQC,GAAR,CAAYT,YAAZ;AACAQ,UAAQC,GAAR,CAAYG,YAAZ;AACAJ,UAAQC,GAAR,CAAYF,UAAZ;;AAEA,MAAI;AACF;AACA;AACAC,YAAQC,GAAR,CAAY,oBAAZ;AACAD,YAAQC,GAAR,CAAY,qBAAZ;AACAD,YAAQC,GAAR,CAAY,oBAAZ;AACAD,YAAQC,GAAR,CAAY,oBAAZ;;AAEAD,YAAQC,GAAR,CAAY,IAAII,cAAJ,EAAZ;AACAL,YAAQC,GAAR,CAAY,IAAIK,eAAJ,EAAZ;AACAN,YAAQC,GAAR,CAAY,IAAIN,cAAJ,EAAZ;AACAK,YAAQC,GAAR,CAAY,IAAIM,cAAJ,EAAZ;AACD,GAZD,CAYE,OAAOC,CAAP,EAAU,CAAE;AACf;;AAEM,SAASV,OAAT,GAAkB,CAAE","file":"esmodules.map","sourcesContent":["export default \"a-default\";\n","export const aNamed = \"a-named\";\n","export const original = \"an-original\";\n","export default \"a-default\";\nexport const aNamed = \"a-named\";\n","export default \"a-default2\";\n","export const aNamed2 = \"a-named2\";\n","export const original = \"an-original2\";\n","export default \"a-default3\";\n","export const aNamed3 = \"a-named3\";\n","export const original = \"an-original3\";\n","export default function optimizedOut() {}\n","import aDefault from \"./src/mod1\";\nimport { aNamed, aNamed as anotherNamed } from \"./src/mod2\";\nimport { original as anAliased } from \"./src/mod3\";\nimport * as aNamespace from \"./src/mod4\";\n\nimport aDefault2 from \"./src/mod5\";\nimport { aNamed2, aNamed2 as anotherNamed2 } from \"./src/mod6\";\nimport { original as anAliased2 } from \"./src/mod7\";\n\nimport aDefault3 from \"./src/mod9\";\nimport { aNamed3, aNamed3 as anotherNamed3 } from \"./src/mod10\";\nimport { original as anAliased3 } from \"./src/mod11\";\n\nimport optimizedOut from \"./src/optimized-out\";\noptimizedOut();\n\nexport default function root() {\n console.log(\"pause here\", root);\n\n console.log(aDefault);\n console.log(anAliased);\n console.log(aNamed);\n console.log(anotherNamed);\n console.log(aNamespace);\n\n try {\n // None of these are callable in this code, but we still want to make sure\n // they map properly even if the only reference is in a call expressions.\n console.log(aDefault2());\n console.log(anAliased2());\n console.log(aNamed2());\n console.log(anotherNamed2());\n\n console.log(new aDefault3());\n console.log(new anAliased3());\n console.log(new aNamed3());\n console.log(new anotherNamed3());\n } catch (e) {}\n}\n\nexport function example(){}\n"]} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/eval-maps.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/eval-maps.js
new file mode 100644
index 0000000000..fd2a1c617e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/eval-maps.js
@@ -0,0 +1,130 @@
+// modules are defined as an array
+// [ module function, map of requires ]
+//
+// map of requires is short require name -> numeric require
+//
+// anything defined in a previous bundle is accessed via the
+// orig method which is the require for previous bundles
+
+// eslint-disable-next-line no-global-assign
+parcelRequire = (function (modules, cache, entry, globalName) {
+ // Save the require from previous bundle to this closure if any
+ var previousRequire = typeof parcelRequire === 'function' && parcelRequire;
+ var nodeRequire = typeof require === 'function' && require;
+
+ function newRequire(name, jumped) {
+ if (!cache[name]) {
+ if (!modules[name]) {
+ // if we cannot find the module within our internal map or
+ // cache jump to the current global require ie. the last bundle
+ // that was added to the page.
+ var currentRequire = typeof parcelRequire === 'function' && parcelRequire;
+ if (!jumped && currentRequire) {
+ return currentRequire(name, true);
+ }
+
+ // If there are other bundles on this page the require from the
+ // previous one is saved to 'previousRequire'. Repeat this as
+ // many times as there are bundles until the module is found or
+ // we exhaust the require chain.
+ if (previousRequire) {
+ return previousRequire(name, true);
+ }
+
+ // Try the node require function if it exists.
+ if (nodeRequire && typeof name === 'string') {
+ return nodeRequire(name);
+ }
+
+ var err = new Error('Cannot find module \'' + name + '\'');
+ err.code = 'MODULE_NOT_FOUND';
+ throw err;
+ }
+
+ localRequire.resolve = resolve;
+
+ var module = cache[name] = new newRequire.Module(name);
+
+ modules[name][0].call(module.exports, localRequire, module, module.exports, this);
+ }
+
+ return cache[name].exports;
+
+ function localRequire(x){
+ return newRequire(localRequire.resolve(x));
+ }
+
+ function resolve(x){
+ return modules[name][1][x] || x;
+ }
+ }
+
+ function Module(moduleName) {
+ this.id = moduleName;
+ this.bundle = newRequire;
+ this.exports = {};
+ }
+
+ newRequire.isParcelRequire = true;
+ newRequire.Module = Module;
+ newRequire.modules = modules;
+ newRequire.cache = cache;
+ newRequire.parent = previousRequire;
+ newRequire.register = function (id, exports) {
+ modules[id] = [function (require, module) {
+ module.exports = exports;
+ }, {}];
+ };
+
+ for (var i = 0; i < entry.length; i++) {
+ newRequire(entry[i]);
+ }
+
+ if (entry.length) {
+ // Expose entry point to Node, AMD or browser globals
+ // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js
+ var mainExports = newRequire(entry[entry.length - 1]);
+
+ // CommonJS
+ if (typeof exports === "object" && typeof module !== "undefined") {
+ module.exports = mainExports;
+
+ // RequireJS
+ } else if (typeof define === "function" && define.amd) {
+ define(function () {
+ return mainExports;
+ });
+
+ // <script>
+ } else if (globalName) {
+ this[globalName] = mainExports;
+ }
+ }
+
+ // Override the current require with this new one
+ return newRequire;
+})({"input.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = root;
+function root() {
+ var one = 1;
+ let two = 2;
+ const three = 3;
+
+ one;
+ two;
+
+ {
+ let two = 4;
+ const three = 5;
+
+ console.log("pause here", one, two, three);
+ }
+}
+},{}]},{},["input.js"], "parcelEvalMaps")
+//# sourceMappingURL=eval-maps.map
+;parcelEvalMaps = parcelEvalMaps.default; \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/eval-maps.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/eval-maps.map
new file mode 100644
index 0000000000..fb4f77c464
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/eval-maps.map
@@ -0,0 +1 @@
+{"version":3,"sources":["parcel://./eval-maps/input.js"],"names":["root","one","two","three","console","log"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBACwBA;AAAT,SAASA,IAAT,GAAgB;AAC7B,MAAIC,MAAM,CAAV;AACA,MAAIC,MAAM,CAAV;AACA,QAAMC,QAAQ,CAAd;;AAEAF;AACAC;;AAEA;AACE,QAAIA,MAAM,CAAV;AACA,UAAMC,QAAQ,CAAd;;AAEAC,YAAQC,GAAR,CAAY,YAAZ,EAA0BJ,GAA1B,EAA+BC,GAA/B,EAAoCC,KAApC;AACD;AACF","file":"eval-maps.map","sourcesContent":["\nexport default function root() {\n var one = 1;\n let two = 2;\n const three = 3;\n\n one;\n two;\n\n {\n let two = 4;\n const three = 5;\n\n console.log(\"pause here\", one, two, three);\n }\n}\n"]} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/for-loops.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/for-loops.js
new file mode 100644
index 0000000000..b7d93f8d89
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/for-loops.js
@@ -0,0 +1,130 @@
+// modules are defined as an array
+// [ module function, map of requires ]
+//
+// map of requires is short require name -> numeric require
+//
+// anything defined in a previous bundle is accessed via the
+// orig method which is the require for previous bundles
+
+// eslint-disable-next-line no-global-assign
+parcelRequire = (function (modules, cache, entry, globalName) {
+ // Save the require from previous bundle to this closure if any
+ var previousRequire = typeof parcelRequire === 'function' && parcelRequire;
+ var nodeRequire = typeof require === 'function' && require;
+
+ function newRequire(name, jumped) {
+ if (!cache[name]) {
+ if (!modules[name]) {
+ // if we cannot find the module within our internal map or
+ // cache jump to the current global require ie. the last bundle
+ // that was added to the page.
+ var currentRequire = typeof parcelRequire === 'function' && parcelRequire;
+ if (!jumped && currentRequire) {
+ return currentRequire(name, true);
+ }
+
+ // If there are other bundles on this page the require from the
+ // previous one is saved to 'previousRequire'. Repeat this as
+ // many times as there are bundles until the module is found or
+ // we exhaust the require chain.
+ if (previousRequire) {
+ return previousRequire(name, true);
+ }
+
+ // Try the node require function if it exists.
+ if (nodeRequire && typeof name === 'string') {
+ return nodeRequire(name);
+ }
+
+ var err = new Error('Cannot find module \'' + name + '\'');
+ err.code = 'MODULE_NOT_FOUND';
+ throw err;
+ }
+
+ localRequire.resolve = resolve;
+
+ var module = cache[name] = new newRequire.Module(name);
+
+ modules[name][0].call(module.exports, localRequire, module, module.exports, this);
+ }
+
+ return cache[name].exports;
+
+ function localRequire(x){
+ return newRequire(localRequire.resolve(x));
+ }
+
+ function resolve(x){
+ return modules[name][1][x] || x;
+ }
+ }
+
+ function Module(moduleName) {
+ this.id = moduleName;
+ this.bundle = newRequire;
+ this.exports = {};
+ }
+
+ newRequire.isParcelRequire = true;
+ newRequire.Module = Module;
+ newRequire.modules = modules;
+ newRequire.cache = cache;
+ newRequire.parent = previousRequire;
+ newRequire.register = function (id, exports) {
+ modules[id] = [function (require, module) {
+ module.exports = exports;
+ }, {}];
+ };
+
+ for (var i = 0; i < entry.length; i++) {
+ newRequire(entry[i]);
+ }
+
+ if (entry.length) {
+ // Expose entry point to Node, AMD or browser globals
+ // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js
+ var mainExports = newRequire(entry[entry.length - 1]);
+
+ // CommonJS
+ if (typeof exports === "object" && typeof module !== "undefined") {
+ module.exports = mainExports;
+
+ // RequireJS
+ } else if (typeof define === "function" && define.amd) {
+ define(function () {
+ return mainExports;
+ });
+
+ // <script>
+ } else if (globalName) {
+ this[globalName] = mainExports;
+ }
+ }
+
+ // Override the current require with this new one
+ return newRequire;
+})({"input.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = root;
+function root() {
+ let i = 0;
+
+ for (let i = 1; i < 2; i++) {
+ console.log("pause here", root);
+ }
+
+ for (let i in { 2: "" }) {
+ console.log("pause here", root);
+ }
+
+ for (let i of [3]) {
+ console.log("pause here", root);
+ }
+}
+},{}]},{},["input.js"], "parcelForLoops")
+//# sourceMappingURL=for-loops.map
+;parcelForLoops = parcelForLoops.default; \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/for-loops.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/for-loops.map
new file mode 100644
index 0000000000..1b6b440358
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/for-loops.map
@@ -0,0 +1 @@
+{"version":3,"sources":["parcel://./for-loops/input.js"],"names":["root","i","console","log"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAAwBA;AAAT,SAASA,IAAT,GAAgB;AAC7B,MAAIC,IAAI,CAAR;;AAEA,OAAK,IAAIA,IAAI,CAAb,EAAgBA,IAAI,CAApB,EAAuBA,GAAvB,EAA4B;AAC1BC,YAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B;AACD;;AAED,OAAK,IAAIC,CAAT,IAAc,EAAE,GAAG,EAAL,EAAd,EAAyB;AACvBC,YAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B;AACD;;AAED,OAAK,IAAIC,CAAT,IAAc,CAAC,CAAD,CAAd,EAAmB;AACjBC,YAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B;AACD;AACF","file":"for-loops.map","sourcesContent":["export default function root() {\n let i = 0;\n\n for (let i = 1; i < 2; i++) {\n console.log(\"pause here\", root);\n }\n\n for (let i in { 2: \"\" }) {\n console.log(\"pause here\", root);\n }\n\n for (let i of [3]) {\n console.log(\"pause here\", root);\n }\n}\n"]} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/for-of.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/for-of.js
new file mode 100644
index 0000000000..d0530af728
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/for-of.js
@@ -0,0 +1,127 @@
+// modules are defined as an array
+// [ module function, map of requires ]
+//
+// map of requires is short require name -> numeric require
+//
+// anything defined in a previous bundle is accessed via the
+// orig method which is the require for previous bundles
+
+// eslint-disable-next-line no-global-assign
+parcelRequire = (function (modules, cache, entry, globalName) {
+ // Save the require from previous bundle to this closure if any
+ var previousRequire = typeof parcelRequire === 'function' && parcelRequire;
+ var nodeRequire = typeof require === 'function' && require;
+
+ function newRequire(name, jumped) {
+ if (!cache[name]) {
+ if (!modules[name]) {
+ // if we cannot find the module within our internal map or
+ // cache jump to the current global require ie. the last bundle
+ // that was added to the page.
+ var currentRequire = typeof parcelRequire === 'function' && parcelRequire;
+ if (!jumped && currentRequire) {
+ return currentRequire(name, true);
+ }
+
+ // If there are other bundles on this page the require from the
+ // previous one is saved to 'previousRequire'. Repeat this as
+ // many times as there are bundles until the module is found or
+ // we exhaust the require chain.
+ if (previousRequire) {
+ return previousRequire(name, true);
+ }
+
+ // Try the node require function if it exists.
+ if (nodeRequire && typeof name === 'string') {
+ return nodeRequire(name);
+ }
+
+ var err = new Error('Cannot find module \'' + name + '\'');
+ err.code = 'MODULE_NOT_FOUND';
+ throw err;
+ }
+
+ localRequire.resolve = resolve;
+
+ var module = cache[name] = new newRequire.Module(name);
+
+ modules[name][0].call(module.exports, localRequire, module, module.exports, this);
+ }
+
+ return cache[name].exports;
+
+ function localRequire(x){
+ return newRequire(localRequire.resolve(x));
+ }
+
+ function resolve(x){
+ return modules[name][1][x] || x;
+ }
+ }
+
+ function Module(moduleName) {
+ this.id = moduleName;
+ this.bundle = newRequire;
+ this.exports = {};
+ }
+
+ newRequire.isParcelRequire = true;
+ newRequire.Module = Module;
+ newRequire.modules = modules;
+ newRequire.cache = cache;
+ newRequire.parent = previousRequire;
+ newRequire.register = function (id, exports) {
+ modules[id] = [function (require, module) {
+ module.exports = exports;
+ }, {}];
+ };
+
+ for (var i = 0; i < entry.length; i++) {
+ newRequire(entry[i]);
+ }
+
+ if (entry.length) {
+ // Expose entry point to Node, AMD or browser globals
+ // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js
+ var mainExports = newRequire(entry[entry.length - 1]);
+
+ // CommonJS
+ if (typeof exports === "object" && typeof module !== "undefined") {
+ module.exports = mainExports;
+
+ // RequireJS
+ } else if (typeof define === "function" && define.amd) {
+ define(function () {
+ return mainExports;
+ });
+
+ // <script>
+ } else if (globalName) {
+ this[globalName] = mainExports;
+ }
+ }
+
+ // Override the current require with this new one
+ return newRequire;
+})({"input.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = forOf;
+const mod = "module scoped";
+
+function forOf() {
+ for (const x of [1]) {
+ doThing(x);
+ }
+
+ function doThing(arg) {
+ // Avoid optimize out
+ window.console;
+ }
+}
+},{}]},{},["input.js"], "parcelForOf")
+//# sourceMappingURL=for-of.map
+;parcelForOf = parcelForOf.default; \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/for-of.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/for-of.map
new file mode 100644
index 0000000000..6a59aa70a8
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/for-of.map
@@ -0,0 +1 @@
+{"version":3,"sources":["parcel://./for-of/input.js"],"names":["forOf","mod","x","doThing","arg","window","console"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAEwBA;AAFxB,MAAMC,MAAM,eAAZ;;AAEe,SAASD,KAAT,GAAiB;AAC9B,OAAK,MAAME,CAAX,IAAgB,CAAC,CAAD,CAAhB,EAAqB;AACnBC,YAAQD,CAAR;AACD;;AAED,WAASC,OAAT,CAAiBC,GAAjB,EAAsB;AACpB;AACAC,WAAOC,OAAP;AACD;AACF","file":"for-of.map","sourcesContent":["const mod = \"module scoped\";\n\nexport default function forOf() {\n for (const x of [1]) {\n doThing(x);\n }\n\n function doThing(arg) {\n // Avoid optimize out\n window.console;\n }\n}\n"]} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/functions.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/functions.js
new file mode 100644
index 0000000000..83b10bc135
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/functions.js
@@ -0,0 +1,129 @@
+// modules are defined as an array
+// [ module function, map of requires ]
+//
+// map of requires is short require name -> numeric require
+//
+// anything defined in a previous bundle is accessed via the
+// orig method which is the require for previous bundles
+
+// eslint-disable-next-line no-global-assign
+parcelRequire = (function (modules, cache, entry, globalName) {
+ // Save the require from previous bundle to this closure if any
+ var previousRequire = typeof parcelRequire === 'function' && parcelRequire;
+ var nodeRequire = typeof require === 'function' && require;
+
+ function newRequire(name, jumped) {
+ if (!cache[name]) {
+ if (!modules[name]) {
+ // if we cannot find the module within our internal map or
+ // cache jump to the current global require ie. the last bundle
+ // that was added to the page.
+ var currentRequire = typeof parcelRequire === 'function' && parcelRequire;
+ if (!jumped && currentRequire) {
+ return currentRequire(name, true);
+ }
+
+ // If there are other bundles on this page the require from the
+ // previous one is saved to 'previousRequire'. Repeat this as
+ // many times as there are bundles until the module is found or
+ // we exhaust the require chain.
+ if (previousRequire) {
+ return previousRequire(name, true);
+ }
+
+ // Try the node require function if it exists.
+ if (nodeRequire && typeof name === 'string') {
+ return nodeRequire(name);
+ }
+
+ var err = new Error('Cannot find module \'' + name + '\'');
+ err.code = 'MODULE_NOT_FOUND';
+ throw err;
+ }
+
+ localRequire.resolve = resolve;
+
+ var module = cache[name] = new newRequire.Module(name);
+
+ modules[name][0].call(module.exports, localRequire, module, module.exports, this);
+ }
+
+ return cache[name].exports;
+
+ function localRequire(x){
+ return newRequire(localRequire.resolve(x));
+ }
+
+ function resolve(x){
+ return modules[name][1][x] || x;
+ }
+ }
+
+ function Module(moduleName) {
+ this.id = moduleName;
+ this.bundle = newRequire;
+ this.exports = {};
+ }
+
+ newRequire.isParcelRequire = true;
+ newRequire.Module = Module;
+ newRequire.modules = modules;
+ newRequire.cache = cache;
+ newRequire.parent = previousRequire;
+ newRequire.register = function (id, exports) {
+ modules[id] = [function (require, module) {
+ module.exports = exports;
+ }, {}];
+ };
+
+ for (var i = 0; i < entry.length; i++) {
+ newRequire(entry[i]);
+ }
+
+ if (entry.length) {
+ // Expose entry point to Node, AMD or browser globals
+ // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js
+ var mainExports = newRequire(entry[entry.length - 1]);
+
+ // CommonJS
+ if (typeof exports === "object" && typeof module !== "undefined") {
+ module.exports = mainExports;
+
+ // RequireJS
+ } else if (typeof define === "function" && define.amd) {
+ define(function () {
+ return mainExports;
+ });
+
+ // <script>
+ } else if (globalName) {
+ this[globalName] = mainExports;
+ }
+ }
+
+ // Override the current require with this new one
+ return newRequire;
+})({"input.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = root;
+function root() {
+
+ function decl(p1) {
+ const inner = function inner(p2) {
+ const arrow = p3 => {
+ console.log("pause here", p3, arrow, p2, inner, p1, decl, root);
+ };
+ arrow();
+ };
+ inner();
+ }
+
+ decl();
+}
+},{}]},{},["input.js"], "parcelFunctions")
+//# sourceMappingURL=functions.map
+;parcelFunctions = parcelFunctions.default; \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/functions.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/functions.map
new file mode 100644
index 0000000000..2b51ea7302
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/functions.map
@@ -0,0 +1 @@
+{"version":3,"sources":["parcel://./functions/input.js"],"names":["root","decl","p1","inner","p2","arrow","p3","console","log"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAAwBA;AAAT,SAASA,IAAT,GAAgB;;AAE7B,WAASC,IAAT,CAAcC,EAAd,EAAkB;AAChB,UAAMC,QAAQ,SAASA,KAAT,CAAeC,EAAf,EAAmB;AAC/B,YAAMC,QAASC,EAAD,IAAQ;AACpBC,gBAAQC,GAAR,CAAY,YAAZ,EAA0BF,EAA1B,EAA8BD,KAA9B,EAAqCD,EAArC,EAAyCD,KAAzC,EAAgDD,EAAhD,EAAoDD,IAApD,EAA0DD,IAA1D;AACD,OAFD;AAGAK;AACD,KALD;AAMAF;AACD;;AAEDF;AACD","file":"functions.map","sourcesContent":["export default function root() {\n\n function decl(p1) {\n const inner = function inner(p2) {\n const arrow = (p3) => {\n console.log(\"pause here\", p3, arrow, p2, inner, p1, decl, root);\n };\n arrow();\n };\n inner();\n }\n\n decl();\n}\n"]} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/lex-and-nonlex.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/lex-and-nonlex.js
new file mode 100644
index 0000000000..89566d78ec
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/lex-and-nonlex.js
@@ -0,0 +1,124 @@
+// modules are defined as an array
+// [ module function, map of requires ]
+//
+// map of requires is short require name -> numeric require
+//
+// anything defined in a previous bundle is accessed via the
+// orig method which is the require for previous bundles
+
+// eslint-disable-next-line no-global-assign
+parcelRequire = (function (modules, cache, entry, globalName) {
+ // Save the require from previous bundle to this closure if any
+ var previousRequire = typeof parcelRequire === 'function' && parcelRequire;
+ var nodeRequire = typeof require === 'function' && require;
+
+ function newRequire(name, jumped) {
+ if (!cache[name]) {
+ if (!modules[name]) {
+ // if we cannot find the module within our internal map or
+ // cache jump to the current global require ie. the last bundle
+ // that was added to the page.
+ var currentRequire = typeof parcelRequire === 'function' && parcelRequire;
+ if (!jumped && currentRequire) {
+ return currentRequire(name, true);
+ }
+
+ // If there are other bundles on this page the require from the
+ // previous one is saved to 'previousRequire'. Repeat this as
+ // many times as there are bundles until the module is found or
+ // we exhaust the require chain.
+ if (previousRequire) {
+ return previousRequire(name, true);
+ }
+
+ // Try the node require function if it exists.
+ if (nodeRequire && typeof name === 'string') {
+ return nodeRequire(name);
+ }
+
+ var err = new Error('Cannot find module \'' + name + '\'');
+ err.code = 'MODULE_NOT_FOUND';
+ throw err;
+ }
+
+ localRequire.resolve = resolve;
+
+ var module = cache[name] = new newRequire.Module(name);
+
+ modules[name][0].call(module.exports, localRequire, module, module.exports, this);
+ }
+
+ return cache[name].exports;
+
+ function localRequire(x){
+ return newRequire(localRequire.resolve(x));
+ }
+
+ function resolve(x){
+ return modules[name][1][x] || x;
+ }
+ }
+
+ function Module(moduleName) {
+ this.id = moduleName;
+ this.bundle = newRequire;
+ this.exports = {};
+ }
+
+ newRequire.isParcelRequire = true;
+ newRequire.Module = Module;
+ newRequire.modules = modules;
+ newRequire.cache = cache;
+ newRequire.parent = previousRequire;
+ newRequire.register = function (id, exports) {
+ modules[id] = [function (require, module) {
+ module.exports = exports;
+ }, {}];
+ };
+
+ for (var i = 0; i < entry.length; i++) {
+ newRequire(entry[i]);
+ }
+
+ if (entry.length) {
+ // Expose entry point to Node, AMD or browser globals
+ // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js
+ var mainExports = newRequire(entry[entry.length - 1]);
+
+ // CommonJS
+ if (typeof exports === "object" && typeof module !== "undefined") {
+ module.exports = mainExports;
+
+ // RequireJS
+ } else if (typeof define === "function" && define.amd) {
+ define(function () {
+ return mainExports;
+ });
+
+ // <script>
+ } else if (globalName) {
+ this[globalName] = mainExports;
+ }
+ }
+
+ // Override the current require with this new one
+ return newRequire;
+})({"input.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = root;
+function root() {
+ function someHelper() {
+ console.log("pause here", root, Thing);
+ }
+
+ class Thing {}
+
+ someHelper();
+}
+},{}]},{},["input.js"], "parcelLexAndNonlex")
+//# sourceMappingURL=lex-and-nonlex.map
+;parcelLexAndNonlex = parcelLexAndNonlex.default; \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/lex-and-nonlex.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/lex-and-nonlex.map
new file mode 100644
index 0000000000..bb2e41e976
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/lex-and-nonlex.map
@@ -0,0 +1 @@
+{"version":3,"sources":["parcel://./lex-and-nonlex/input.js"],"names":["root","someHelper","console","log","Thing"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAAwBA;AAAT,SAASA,IAAT,GAAgB;AAC7B,WAASC,UAAT,GAAqB;AACnBC,YAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B,EAAgCI,KAAhC;AACD;;AAED,QAAMA,KAAN,CAAY;;AAEZH;AACD","file":"lex-and-nonlex.map","sourcesContent":["export default function root() {\n function someHelper(){\n console.log(\"pause here\", root, Thing);\n }\n\n class Thing {}\n\n someHelper();\n}\n"]} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/line-start-bindings-es6.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/line-start-bindings-es6.js
new file mode 100644
index 0000000000..90c3125391
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/line-start-bindings-es6.js
@@ -0,0 +1,137 @@
+// modules are defined as an array
+// [ module function, map of requires ]
+//
+// map of requires is short require name -> numeric require
+//
+// anything defined in a previous bundle is accessed via the
+// orig method which is the require for previous bundles
+
+// eslint-disable-next-line no-global-assign
+parcelRequire = (function (modules, cache, entry, globalName) {
+ // Save the require from previous bundle to this closure if any
+ var previousRequire = typeof parcelRequire === 'function' && parcelRequire;
+ var nodeRequire = typeof require === 'function' && require;
+
+ function newRequire(name, jumped) {
+ if (!cache[name]) {
+ if (!modules[name]) {
+ // if we cannot find the module within our internal map or
+ // cache jump to the current global require ie. the last bundle
+ // that was added to the page.
+ var currentRequire = typeof parcelRequire === 'function' && parcelRequire;
+ if (!jumped && currentRequire) {
+ return currentRequire(name, true);
+ }
+
+ // If there are other bundles on this page the require from the
+ // previous one is saved to 'previousRequire'. Repeat this as
+ // many times as there are bundles until the module is found or
+ // we exhaust the require chain.
+ if (previousRequire) {
+ return previousRequire(name, true);
+ }
+
+ // Try the node require function if it exists.
+ if (nodeRequire && typeof name === 'string') {
+ return nodeRequire(name);
+ }
+
+ var err = new Error('Cannot find module \'' + name + '\'');
+ err.code = 'MODULE_NOT_FOUND';
+ throw err;
+ }
+
+ localRequire.resolve = resolve;
+
+ var module = cache[name] = new newRequire.Module(name);
+
+ modules[name][0].call(module.exports, localRequire, module, module.exports, this);
+ }
+
+ return cache[name].exports;
+
+ function localRequire(x){
+ return newRequire(localRequire.resolve(x));
+ }
+
+ function resolve(x){
+ return modules[name][1][x] || x;
+ }
+ }
+
+ function Module(moduleName) {
+ this.id = moduleName;
+ this.bundle = newRequire;
+ this.exports = {};
+ }
+
+ newRequire.isParcelRequire = true;
+ newRequire.Module = Module;
+ newRequire.modules = modules;
+ newRequire.cache = cache;
+ newRequire.parent = previousRequire;
+ newRequire.register = function (id, exports) {
+ modules[id] = [function (require, module) {
+ module.exports = exports;
+ }, {}];
+ };
+
+ for (var i = 0; i < entry.length; i++) {
+ newRequire(entry[i]);
+ }
+
+ if (entry.length) {
+ // Expose entry point to Node, AMD or browser globals
+ // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js
+ var mainExports = newRequire(entry[entry.length - 1]);
+
+ // CommonJS
+ if (typeof exports === "object" && typeof module !== "undefined") {
+ module.exports = mainExports;
+
+ // RequireJS
+ } else if (typeof define === "function" && define.amd) {
+ define(function () {
+ return mainExports;
+ });
+
+ // <script>
+ } else if (globalName) {
+ this[globalName] = mainExports;
+ }
+ }
+
+ // Override the current require with this new one
+ return newRequire;
+})({"input.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = root;
+function root() {
+ function aFunc() {
+ // Since these bindings are on their own linem, the mappings will
+ // extend to the start of the line, rather than starting at the first
+ // character of the binding.
+ const {
+ one,
+ two
+ } = {
+ one: 1,
+ two: 2
+ };
+
+ // The 'this' binding here is also its own line, so the comment above
+ // applies here too.
+ this.thing = 4;
+
+ console.log("pause here", root);
+ }
+
+ aFunc.call({});
+}
+},{}]},{},["input.js"], "parcelLineStartBindingsEs6")
+//# sourceMappingURL=line-start-bindings-es6.map
+;parcelLineStartBindingsEs6 = parcelLineStartBindingsEs6.default; \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/line-start-bindings-es6.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/line-start-bindings-es6.map
new file mode 100644
index 0000000000..ecdf47a7c2
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/line-start-bindings-es6.map
@@ -0,0 +1 @@
+{"version":3,"sources":["parcel://./line-start-bindings-es6/input.js"],"names":["root","aFunc","one","two","thing","console","log","call"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBACwBA;AAAT,SAASA,IAAT,GAAgB;AAC7B,WAASC,KAAT,GAAgB;AACd;AACA;AACA;AACA,UAAM;AACJC,SADI;AAEJC;AAFI,QAGF;AACFD,WAAK,CADH;AAEFC,WAAK;AAFH,KAHJ;;AAQA;AACA;AACA,SAAKC,KAAL,GAAa,CAAb;;AAEAC,YAAQC,GAAR,CAAY,YAAZ,EAA0BN,IAA1B;AACD;;AAEDC,QAAMM,IAAN,CAAW,EAAX;AACD","file":"line-start-bindings-es6.map","sourcesContent":["\nexport default function root() {\n function aFunc(){\n // Since these bindings are on their own linem, the mappings will\n // extend to the start of the line, rather than starting at the first\n // character of the binding.\n const {\n one,\n two\n } = {\n one: 1,\n two: 2,\n };\n\n // The 'this' binding here is also its own line, so the comment above\n // applies here too.\n this.thing = 4;\n\n console.log(\"pause here\", root);\n }\n\n aFunc.call({ });\n}\n"]} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/modules-cjs.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/modules-cjs.js
new file mode 100644
index 0000000000..238d0b0ee3
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/modules-cjs.js
@@ -0,0 +1,117 @@
+// modules are defined as an array
+// [ module function, map of requires ]
+//
+// map of requires is short require name -> numeric require
+//
+// anything defined in a previous bundle is accessed via the
+// orig method which is the require for previous bundles
+
+// eslint-disable-next-line no-global-assign
+parcelRequire = (function (modules, cache, entry, globalName) {
+ // Save the require from previous bundle to this closure if any
+ var previousRequire = typeof parcelRequire === 'function' && parcelRequire;
+ var nodeRequire = typeof require === 'function' && require;
+
+ function newRequire(name, jumped) {
+ if (!cache[name]) {
+ if (!modules[name]) {
+ // if we cannot find the module within our internal map or
+ // cache jump to the current global require ie. the last bundle
+ // that was added to the page.
+ var currentRequire = typeof parcelRequire === 'function' && parcelRequire;
+ if (!jumped && currentRequire) {
+ return currentRequire(name, true);
+ }
+
+ // If there are other bundles on this page the require from the
+ // previous one is saved to 'previousRequire'. Repeat this as
+ // many times as there are bundles until the module is found or
+ // we exhaust the require chain.
+ if (previousRequire) {
+ return previousRequire(name, true);
+ }
+
+ // Try the node require function if it exists.
+ if (nodeRequire && typeof name === 'string') {
+ return nodeRequire(name);
+ }
+
+ var err = new Error('Cannot find module \'' + name + '\'');
+ err.code = 'MODULE_NOT_FOUND';
+ throw err;
+ }
+
+ localRequire.resolve = resolve;
+
+ var module = cache[name] = new newRequire.Module(name);
+
+ modules[name][0].call(module.exports, localRequire, module, module.exports, this);
+ }
+
+ return cache[name].exports;
+
+ function localRequire(x){
+ return newRequire(localRequire.resolve(x));
+ }
+
+ function resolve(x){
+ return modules[name][1][x] || x;
+ }
+ }
+
+ function Module(moduleName) {
+ this.id = moduleName;
+ this.bundle = newRequire;
+ this.exports = {};
+ }
+
+ newRequire.isParcelRequire = true;
+ newRequire.Module = Module;
+ newRequire.modules = modules;
+ newRequire.cache = cache;
+ newRequire.parent = previousRequire;
+ newRequire.register = function (id, exports) {
+ modules[id] = [function (require, module) {
+ module.exports = exports;
+ }, {}];
+ };
+
+ for (var i = 0; i < entry.length; i++) {
+ newRequire(entry[i]);
+ }
+
+ if (entry.length) {
+ // Expose entry point to Node, AMD or browser globals
+ // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js
+ var mainExports = newRequire(entry[entry.length - 1]);
+
+ // CommonJS
+ if (typeof exports === "object" && typeof module !== "undefined") {
+ module.exports = mainExports;
+
+ // RequireJS
+ } else if (typeof define === "function" && define.amd) {
+ define(function () {
+ return mainExports;
+ });
+
+ // <script>
+ } else if (globalName) {
+ this[globalName] = mainExports;
+ }
+ }
+
+ // Override the current require with this new one
+ return newRequire;
+})({"input.js":[function(require,module,exports) {
+var moduleScoped = 1;
+let alsoModuleScoped = 2;
+
+function thirdModuleScoped() {}
+
+exports.default = function () {
+ console.log("pause here", moduleScoped, alsoModuleScoped, thirdModuleScoped);
+};
+},{}]},{},["input.js"], "parcelModulesCjs")
+//# sourceMappingURL=modules-cjs.map
+;parcelModulesCjs = parcelModulesCjs.default; \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/modules-cjs.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/modules-cjs.map
new file mode 100644
index 0000000000..17a33b6c5a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/modules-cjs.map
@@ -0,0 +1 @@
+{"version":3,"sources":["parcel://./modules-cjs/input.js"],"names":["moduleScoped","alsoModuleScoped","thirdModuleScoped","exports","default","console","log"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAIA,eAAe,CAAnB;AACA,IAAIC,mBAAmB,CAAvB;;AAEA,SAASC,iBAAT,GAA6B,CAAE;;AAE/BC,QAAQC,OAAR,GAAkB,YAAW;AAC3BC,UAAQC,GAAR,CAAY,YAAZ,EAA0BN,YAA1B,EAAwCC,gBAAxC,EAA0DC,iBAA1D;AACD,CAFD","file":"modules-cjs.map","sourcesContent":["var moduleScoped = 1;\nlet alsoModuleScoped = 2;\n\nfunction thirdModuleScoped() {}\n\nexports.default = function() {\n console.log(\"pause here\", moduleScoped, alsoModuleScoped, thirdModuleScoped);\n};\n"]} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/out-of-order-declarations-cjs.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/out-of-order-declarations-cjs.js
new file mode 100644
index 0000000000..4d6fb49cc8
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/out-of-order-declarations-cjs.js
@@ -0,0 +1,144 @@
+// modules are defined as an array
+// [ module function, map of requires ]
+//
+// map of requires is short require name -> numeric require
+//
+// anything defined in a previous bundle is accessed via the
+// orig method which is the require for previous bundles
+
+// eslint-disable-next-line no-global-assign
+parcelRequire = (function (modules, cache, entry, globalName) {
+ // Save the require from previous bundle to this closure if any
+ var previousRequire = typeof parcelRequire === 'function' && parcelRequire;
+ var nodeRequire = typeof require === 'function' && require;
+
+ function newRequire(name, jumped) {
+ if (!cache[name]) {
+ if (!modules[name]) {
+ // if we cannot find the module within our internal map or
+ // cache jump to the current global require ie. the last bundle
+ // that was added to the page.
+ var currentRequire = typeof parcelRequire === 'function' && parcelRequire;
+ if (!jumped && currentRequire) {
+ return currentRequire(name, true);
+ }
+
+ // If there are other bundles on this page the require from the
+ // previous one is saved to 'previousRequire'. Repeat this as
+ // many times as there are bundles until the module is found or
+ // we exhaust the require chain.
+ if (previousRequire) {
+ return previousRequire(name, true);
+ }
+
+ // Try the node require function if it exists.
+ if (nodeRequire && typeof name === 'string') {
+ return nodeRequire(name);
+ }
+
+ var err = new Error('Cannot find module \'' + name + '\'');
+ err.code = 'MODULE_NOT_FOUND';
+ throw err;
+ }
+
+ localRequire.resolve = resolve;
+
+ var module = cache[name] = new newRequire.Module(name);
+
+ modules[name][0].call(module.exports, localRequire, module, module.exports, this);
+ }
+
+ return cache[name].exports;
+
+ function localRequire(x){
+ return newRequire(localRequire.resolve(x));
+ }
+
+ function resolve(x){
+ return modules[name][1][x] || x;
+ }
+ }
+
+ function Module(moduleName) {
+ this.id = moduleName;
+ this.bundle = newRequire;
+ this.exports = {};
+ }
+
+ newRequire.isParcelRequire = true;
+ newRequire.Module = Module;
+ newRequire.modules = modules;
+ newRequire.cache = cache;
+ newRequire.parent = previousRequire;
+ newRequire.register = function (id, exports) {
+ modules[id] = [function (require, module) {
+ module.exports = exports;
+ }, {}];
+ };
+
+ for (var i = 0; i < entry.length; i++) {
+ newRequire(entry[i]);
+ }
+
+ if (entry.length) {
+ // Expose entry point to Node, AMD or browser globals
+ // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js
+ var mainExports = newRequire(entry[entry.length - 1]);
+
+ // CommonJS
+ if (typeof exports === "object" && typeof module !== "undefined") {
+ module.exports = mainExports;
+
+ // RequireJS
+ } else if (typeof define === "function" && define.amd) {
+ define(function () {
+ return mainExports;
+ });
+
+ // <script>
+ } else if (globalName) {
+ this[globalName] = mainExports;
+ }
+ }
+
+ // Override the current require with this new one
+ return newRequire;
+})({"src/mod.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = "a-default";
+},{}],"input.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = root;
+
+var _mod = require("./src/mod");
+
+var _mod2 = _interopRequireDefault(_mod);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var val = "outer-value";
+
+function root() {
+ var val = "middle-value";
+ var fn = function outerFn(outer) {};
+
+ function callback() {
+ console.log("pause here", val, _mod2.default, fn);
+
+ var val = "inner-value";
+ function fn(inner) {};
+ }
+
+ callback();
+}
+},{"./src/mod":"src/mod.js"}]},{},["input.js"], "parcelOutOfOrderDeclarationsCjs")
+//# sourceMappingURL=out-of-order-declarations-cjs.map
+;parcelOutOfOrderDeclarationsCjs = parcelOutOfOrderDeclarationsCjs.default; \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/out-of-order-declarations-cjs.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/out-of-order-declarations-cjs.map
new file mode 100644
index 0000000000..a3966cd00a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/out-of-order-declarations-cjs.map
@@ -0,0 +1 @@
+{"version":3,"sources":["parcel://./out-of-order-declarations-cjs/src/mod.js","parcel://./out-of-order-declarations-cjs/input.js"],"names":["root","val","fn","outerFn","outer","callback","console","log","aDefault","inner"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAAe;;;;;;;kBCESA;;AAcxB;;;;;;AAhBA,IAAIC,MAAM,aAAV;;AAEe,SAASD,IAAT,GAAgB;AAC7B,MAAIC,MAAM,cAAV;AACA,MAAIC,KAAK,SAASC,OAAT,CAAiBC,KAAjB,EAAuB,CAAE,CAAlC;;AAEA,WAASC,QAAT,GAAoB;AAClBC,YAAQC,GAAR,CAAY,YAAZ,EAA0BN,GAA1B,EAA+BO,aAA/B,EAAyCN,EAAzC;;AAEA,QAAID,MAAM,aAAV;AACA,aAASC,EAAT,CAAYO,KAAZ,EAAkB,CAAE;AACrB;;AAEDJ;AACD","file":"out-of-order-declarations-cjs.map","sourcesContent":["export default \"a-default\";\n","var val = \"outer-value\";\n\nexport default function root() {\n var val = \"middle-value\";\n var fn = function outerFn(outer){};\n\n function callback() {\n console.log(\"pause here\", val, aDefault, fn);\n\n var val = \"inner-value\";\n function fn(inner){};\n }\n\n callback();\n}\n\nimport aDefault from \"./src/mod\";\n"]} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/shadowed-vars.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/shadowed-vars.js
new file mode 100644
index 0000000000..4e11e8676b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/shadowed-vars.js
@@ -0,0 +1,136 @@
+// modules are defined as an array
+// [ module function, map of requires ]
+//
+// map of requires is short require name -> numeric require
+//
+// anything defined in a previous bundle is accessed via the
+// orig method which is the require for previous bundles
+
+// eslint-disable-next-line no-global-assign
+parcelRequire = (function (modules, cache, entry, globalName) {
+ // Save the require from previous bundle to this closure if any
+ var previousRequire = typeof parcelRequire === 'function' && parcelRequire;
+ var nodeRequire = typeof require === 'function' && require;
+
+ function newRequire(name, jumped) {
+ if (!cache[name]) {
+ if (!modules[name]) {
+ // if we cannot find the module within our internal map or
+ // cache jump to the current global require ie. the last bundle
+ // that was added to the page.
+ var currentRequire = typeof parcelRequire === 'function' && parcelRequire;
+ if (!jumped && currentRequire) {
+ return currentRequire(name, true);
+ }
+
+ // If there are other bundles on this page the require from the
+ // previous one is saved to 'previousRequire'. Repeat this as
+ // many times as there are bundles until the module is found or
+ // we exhaust the require chain.
+ if (previousRequire) {
+ return previousRequire(name, true);
+ }
+
+ // Try the node require function if it exists.
+ if (nodeRequire && typeof name === 'string') {
+ return nodeRequire(name);
+ }
+
+ var err = new Error('Cannot find module \'' + name + '\'');
+ err.code = 'MODULE_NOT_FOUND';
+ throw err;
+ }
+
+ localRequire.resolve = resolve;
+
+ var module = cache[name] = new newRequire.Module(name);
+
+ modules[name][0].call(module.exports, localRequire, module, module.exports, this);
+ }
+
+ return cache[name].exports;
+
+ function localRequire(x){
+ return newRequire(localRequire.resolve(x));
+ }
+
+ function resolve(x){
+ return modules[name][1][x] || x;
+ }
+ }
+
+ function Module(moduleName) {
+ this.id = moduleName;
+ this.bundle = newRequire;
+ this.exports = {};
+ }
+
+ newRequire.isParcelRequire = true;
+ newRequire.Module = Module;
+ newRequire.modules = modules;
+ newRequire.cache = cache;
+ newRequire.parent = previousRequire;
+ newRequire.register = function (id, exports) {
+ modules[id] = [function (require, module) {
+ module.exports = exports;
+ }, {}];
+ };
+
+ for (var i = 0; i < entry.length; i++) {
+ newRequire(entry[i]);
+ }
+
+ if (entry.length) {
+ // Expose entry point to Node, AMD or browser globals
+ // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js
+ var mainExports = newRequire(entry[entry.length - 1]);
+
+ // CommonJS
+ if (typeof exports === "object" && typeof module !== "undefined") {
+ module.exports = mainExports;
+
+ // RequireJS
+ } else if (typeof define === "function" && define.amd) {
+ define(function () {
+ return mainExports;
+ });
+
+ // <script>
+ } else if (globalName) {
+ this[globalName] = mainExports;
+ }
+ }
+
+ // Override the current require with this new one
+ return newRequire;
+})({"input.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+exports.default = function () {
+ var aVar = "var1";
+ let aLet = "let1";
+ const aConst = "const1";
+
+ class Outer {}
+ {
+ function Outer() {}
+
+ var aVar = "var2";
+ let aLet = "let2";
+ const aConst = "const2";
+ {
+ var aVar = "var3";
+ let aLet = "let3";
+ const aConst = "const3";
+
+ console.log("pause here");
+ }
+ }
+};
+},{}]},{},["input.js"], "parcelShadowedVars")
+//# sourceMappingURL=shadowed-vars.map
+;parcelShadowedVars = parcelShadowedVars.default; \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/shadowed-vars.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/shadowed-vars.map
new file mode 100644
index 0000000000..b787329372
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/shadowed-vars.map
@@ -0,0 +1 @@
+{"version":3,"sources":["parcel://./shadowed-vars/input.js"],"names":["aVar","aLet","aConst","Outer","console","log"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAAe,YAAW;AACxB,MAAIA,OAAO,MAAX;AACA,MAAIC,OAAO,MAAX;AACA,QAAMC,SAAS,QAAf;;AAEA,QAAMC,KAAN,CAAY;AACZ;AACE,aAASA,KAAT,GAAiB,CAAE;;AAEnB,QAAIH,OAAO,MAAX;AACA,QAAIC,OAAO,MAAX;AACA,UAAMC,SAAS,QAAf;AACA;AACE,UAAIF,OAAO,MAAX;AACA,UAAIC,OAAO,MAAX;AACA,YAAMC,SAAS,QAAf;;AAEAE,cAAQC,GAAR,CAAY,YAAZ;AACD;AACF;AACF","file":"shadowed-vars.map","sourcesContent":["export default function() {\n var aVar = \"var1\";\n let aLet = \"let1\";\n const aConst = \"const1\";\n\n class Outer {}\n {\n function Outer() {}\n\n var aVar = \"var2\";\n let aLet = \"let2\";\n const aConst = \"const2\";\n {\n var aVar = \"var3\";\n let aLet = \"let3\";\n const aConst = \"const3\";\n\n console.log(\"pause here\");\n }\n }\n}\n"]} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-for-of-array-closure.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-for-of-array-closure.js
new file mode 100644
index 0000000000..900aa73591
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-for-of-array-closure.js
@@ -0,0 +1,125 @@
+// modules are defined as an array
+// [ module function, map of requires ]
+//
+// map of requires is short require name -> numeric require
+//
+// anything defined in a previous bundle is accessed via the
+// orig method which is the require for previous bundles
+
+// eslint-disable-next-line no-global-assign
+parcelRequire = (function (modules, cache, entry, globalName) {
+ // Save the require from previous bundle to this closure if any
+ var previousRequire = typeof parcelRequire === 'function' && parcelRequire;
+ var nodeRequire = typeof require === 'function' && require;
+
+ function newRequire(name, jumped) {
+ if (!cache[name]) {
+ if (!modules[name]) {
+ // if we cannot find the module within our internal map or
+ // cache jump to the current global require ie. the last bundle
+ // that was added to the page.
+ var currentRequire = typeof parcelRequire === 'function' && parcelRequire;
+ if (!jumped && currentRequire) {
+ return currentRequire(name, true);
+ }
+
+ // If there are other bundles on this page the require from the
+ // previous one is saved to 'previousRequire'. Repeat this as
+ // many times as there are bundles until the module is found or
+ // we exhaust the require chain.
+ if (previousRequire) {
+ return previousRequire(name, true);
+ }
+
+ // Try the node require function if it exists.
+ if (nodeRequire && typeof name === 'string') {
+ return nodeRequire(name);
+ }
+
+ var err = new Error('Cannot find module \'' + name + '\'');
+ err.code = 'MODULE_NOT_FOUND';
+ throw err;
+ }
+
+ localRequire.resolve = resolve;
+
+ var module = cache[name] = new newRequire.Module(name);
+
+ modules[name][0].call(module.exports, localRequire, module, module.exports, this);
+ }
+
+ return cache[name].exports;
+
+ function localRequire(x){
+ return newRequire(localRequire.resolve(x));
+ }
+
+ function resolve(x){
+ return modules[name][1][x] || x;
+ }
+ }
+
+ function Module(moduleName) {
+ this.id = moduleName;
+ this.bundle = newRequire;
+ this.exports = {};
+ }
+
+ newRequire.isParcelRequire = true;
+ newRequire.Module = Module;
+ newRequire.modules = modules;
+ newRequire.cache = cache;
+ newRequire.parent = previousRequire;
+ newRequire.register = function (id, exports) {
+ modules[id] = [function (require, module) {
+ module.exports = exports;
+ }, {}];
+ };
+
+ for (var i = 0; i < entry.length; i++) {
+ newRequire(entry[i]);
+ }
+
+ if (entry.length) {
+ // Expose entry point to Node, AMD or browser globals
+ // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js
+ var mainExports = newRequire(entry[entry.length - 1]);
+
+ // CommonJS
+ if (typeof exports === "object" && typeof module !== "undefined") {
+ module.exports = mainExports;
+
+ // RequireJS
+ } else if (typeof define === "function" && define.amd) {
+ define(function () {
+ return mainExports;
+ });
+
+ // <script>
+ } else if (globalName) {
+ this[globalName] = mainExports;
+ }
+ }
+
+ // Override the current require with this new one
+ return newRequire;
+})({"input.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = root;
+// Babel will optimize this for..of because it call tell the value is an array.
+function root() {
+ console.log("pause here");
+
+ for (const val of [1, 2]) {
+ console.log("pause again", (() => val)());
+ }
+
+ console.log("done");
+}
+},{}]},{},["input.js"], "parcelStepOverForOfArrayClosure")
+//# sourceMappingURL=step-over-for-of-array-closure.map
+;parcelStepOverForOfArrayClosure = parcelStepOverForOfArrayClosure.default; \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-for-of-array-closure.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-for-of-array-closure.map
new file mode 100644
index 0000000000..e73c98d93b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-for-of-array-closure.map
@@ -0,0 +1 @@
+{"version":3,"sources":["parcel://./step-over-for-of-array-closure/input.js"],"names":["root","console","log","val"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBACwBA;AADxB;AACe,SAASA,IAAT,GAAgB;AAC7BC,UAAQC,GAAR,CAAY,YAAZ;;AAEA,OAAK,MAAMC,GAAX,IAAkB,CAAC,CAAD,EAAI,CAAJ,CAAlB,EAA0B;AACxBF,YAAQC,GAAR,CAAY,aAAZ,EAA2B,CAAC,MAAMC,GAAP,GAA3B;AACD;;AAEDF,UAAQC,GAAR,CAAY,MAAZ;AACD","file":"step-over-for-of-array-closure.map","sourcesContent":["// Babel will optimize this for..of because it call tell the value is an array.\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of [1, 2]) {\n console.log(\"pause again\", (() => val)());\n }\n\n console.log(\"done\");\n}\n"]} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-for-of-array.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-for-of-array.js
new file mode 100644
index 0000000000..df04af279d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-for-of-array.js
@@ -0,0 +1,125 @@
+// modules are defined as an array
+// [ module function, map of requires ]
+//
+// map of requires is short require name -> numeric require
+//
+// anything defined in a previous bundle is accessed via the
+// orig method which is the require for previous bundles
+
+// eslint-disable-next-line no-global-assign
+parcelRequire = (function (modules, cache, entry, globalName) {
+ // Save the require from previous bundle to this closure if any
+ var previousRequire = typeof parcelRequire === 'function' && parcelRequire;
+ var nodeRequire = typeof require === 'function' && require;
+
+ function newRequire(name, jumped) {
+ if (!cache[name]) {
+ if (!modules[name]) {
+ // if we cannot find the module within our internal map or
+ // cache jump to the current global require ie. the last bundle
+ // that was added to the page.
+ var currentRequire = typeof parcelRequire === 'function' && parcelRequire;
+ if (!jumped && currentRequire) {
+ return currentRequire(name, true);
+ }
+
+ // If there are other bundles on this page the require from the
+ // previous one is saved to 'previousRequire'. Repeat this as
+ // many times as there are bundles until the module is found or
+ // we exhaust the require chain.
+ if (previousRequire) {
+ return previousRequire(name, true);
+ }
+
+ // Try the node require function if it exists.
+ if (nodeRequire && typeof name === 'string') {
+ return nodeRequire(name);
+ }
+
+ var err = new Error('Cannot find module \'' + name + '\'');
+ err.code = 'MODULE_NOT_FOUND';
+ throw err;
+ }
+
+ localRequire.resolve = resolve;
+
+ var module = cache[name] = new newRequire.Module(name);
+
+ modules[name][0].call(module.exports, localRequire, module, module.exports, this);
+ }
+
+ return cache[name].exports;
+
+ function localRequire(x){
+ return newRequire(localRequire.resolve(x));
+ }
+
+ function resolve(x){
+ return modules[name][1][x] || x;
+ }
+ }
+
+ function Module(moduleName) {
+ this.id = moduleName;
+ this.bundle = newRequire;
+ this.exports = {};
+ }
+
+ newRequire.isParcelRequire = true;
+ newRequire.Module = Module;
+ newRequire.modules = modules;
+ newRequire.cache = cache;
+ newRequire.parent = previousRequire;
+ newRequire.register = function (id, exports) {
+ modules[id] = [function (require, module) {
+ module.exports = exports;
+ }, {}];
+ };
+
+ for (var i = 0; i < entry.length; i++) {
+ newRequire(entry[i]);
+ }
+
+ if (entry.length) {
+ // Expose entry point to Node, AMD or browser globals
+ // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js
+ var mainExports = newRequire(entry[entry.length - 1]);
+
+ // CommonJS
+ if (typeof exports === "object" && typeof module !== "undefined") {
+ module.exports = mainExports;
+
+ // RequireJS
+ } else if (typeof define === "function" && define.amd) {
+ define(function () {
+ return mainExports;
+ });
+
+ // <script>
+ } else if (globalName) {
+ this[globalName] = mainExports;
+ }
+ }
+
+ // Override the current require with this new one
+ return newRequire;
+})({"input.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = root;
+// Babel will optimize this for..of because it call tell the value is an array.
+function root() {
+ console.log("pause here");
+
+ for (const val of [1, 2]) {
+ console.log("pause again", val);
+ }
+
+ console.log("done");
+}
+},{}]},{},["input.js"], "parcelStepOverForOfArray")
+//# sourceMappingURL=step-over-for-of-array.map
+;parcelStepOverForOfArray = parcelStepOverForOfArray.default; \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-for-of-array.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-for-of-array.map
new file mode 100644
index 0000000000..1931bc1149
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-for-of-array.map
@@ -0,0 +1 @@
+{"version":3,"sources":["parcel://./step-over-for-of-array/input.js"],"names":["root","console","log","val"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBACwBA;AADxB;AACe,SAASA,IAAT,GAAgB;AAC7BC,UAAQC,GAAR,CAAY,YAAZ;;AAEA,OAAK,MAAMC,GAAX,IAAkB,CAAC,CAAD,EAAI,CAAJ,CAAlB,EAA0B;AACxBF,YAAQC,GAAR,CAAY,aAAZ,EAA2BC,GAA3B;AACD;;AAEDF,UAAQC,GAAR,CAAY,MAAZ;AACD","file":"step-over-for-of-array.map","sourcesContent":["// Babel will optimize this for..of because it call tell the value is an array.\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of [1, 2]) {\n console.log(\"pause again\", val);\n }\n\n console.log(\"done\");\n}\n"]} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-for-of-closure.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-for-of-closure.js
new file mode 100644
index 0000000000..e97887ed9d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-for-of-closure.js
@@ -0,0 +1,128 @@
+// modules are defined as an array
+// [ module function, map of requires ]
+//
+// map of requires is short require name -> numeric require
+//
+// anything defined in a previous bundle is accessed via the
+// orig method which is the require for previous bundles
+
+// eslint-disable-next-line no-global-assign
+parcelRequire = (function (modules, cache, entry, globalName) {
+ // Save the require from previous bundle to this closure if any
+ var previousRequire = typeof parcelRequire === 'function' && parcelRequire;
+ var nodeRequire = typeof require === 'function' && require;
+
+ function newRequire(name, jumped) {
+ if (!cache[name]) {
+ if (!modules[name]) {
+ // if we cannot find the module within our internal map or
+ // cache jump to the current global require ie. the last bundle
+ // that was added to the page.
+ var currentRequire = typeof parcelRequire === 'function' && parcelRequire;
+ if (!jumped && currentRequire) {
+ return currentRequire(name, true);
+ }
+
+ // If there are other bundles on this page the require from the
+ // previous one is saved to 'previousRequire'. Repeat this as
+ // many times as there are bundles until the module is found or
+ // we exhaust the require chain.
+ if (previousRequire) {
+ return previousRequire(name, true);
+ }
+
+ // Try the node require function if it exists.
+ if (nodeRequire && typeof name === 'string') {
+ return nodeRequire(name);
+ }
+
+ var err = new Error('Cannot find module \'' + name + '\'');
+ err.code = 'MODULE_NOT_FOUND';
+ throw err;
+ }
+
+ localRequire.resolve = resolve;
+
+ var module = cache[name] = new newRequire.Module(name);
+
+ modules[name][0].call(module.exports, localRequire, module, module.exports, this);
+ }
+
+ return cache[name].exports;
+
+ function localRequire(x){
+ return newRequire(localRequire.resolve(x));
+ }
+
+ function resolve(x){
+ return modules[name][1][x] || x;
+ }
+ }
+
+ function Module(moduleName) {
+ this.id = moduleName;
+ this.bundle = newRequire;
+ this.exports = {};
+ }
+
+ newRequire.isParcelRequire = true;
+ newRequire.Module = Module;
+ newRequire.modules = modules;
+ newRequire.cache = cache;
+ newRequire.parent = previousRequire;
+ newRequire.register = function (id, exports) {
+ modules[id] = [function (require, module) {
+ module.exports = exports;
+ }, {}];
+ };
+
+ for (var i = 0; i < entry.length; i++) {
+ newRequire(entry[i]);
+ }
+
+ if (entry.length) {
+ // Expose entry point to Node, AMD or browser globals
+ // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js
+ var mainExports = newRequire(entry[entry.length - 1]);
+
+ // CommonJS
+ if (typeof exports === "object" && typeof module !== "undefined") {
+ module.exports = mainExports;
+
+ // RequireJS
+ } else if (typeof define === "function" && define.amd) {
+ define(function () {
+ return mainExports;
+ });
+
+ // <script>
+ } else if (globalName) {
+ this[globalName] = mainExports;
+ }
+ }
+
+ // Override the current require with this new one
+ return newRequire;
+})({"input.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = root;
+// Babel will convert the loop body to a function to handle the 'val' lexical
+// enclosure behavior.
+const vals = [1, 2];
+
+function root() {
+ console.log("pause here");
+
+ for (const val of vals) {
+ console.log("pause again", (() => val)());
+ }
+
+ console.log("done");
+}
+},{}]},{},["input.js"], "parcelStepOverForOfClosure")
+//# sourceMappingURL=step-over-for-of-closure.map
+;parcelStepOverForOfClosure = parcelStepOverForOfClosure.default; \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-for-of-closure.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-for-of-closure.map
new file mode 100644
index 0000000000..b892e89362
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-for-of-closure.map
@@ -0,0 +1 @@
+{"version":3,"sources":["parcel://./step-over-for-of-closure/input.js"],"names":["root","vals","console","log","val"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAIwBA;AAJxB;AACA;AACA,MAAMC,OAAO,CAAC,CAAD,EAAI,CAAJ,CAAb;;AAEe,SAASD,IAAT,GAAgB;AAC7BE,UAAQC,GAAR,CAAY,YAAZ;;AAEA,OAAK,MAAMC,GAAX,IAAkBH,IAAlB,EAAwB;AACtBC,YAAQC,GAAR,CAAY,aAAZ,EAA2B,CAAC,MAAMC,GAAP,GAA3B;AACD;;AAEDF,UAAQC,GAAR,CAAY,MAAZ;AACD","file":"step-over-for-of-closure.map","sourcesContent":["// Babel will convert the loop body to a function to handle the 'val' lexical\n// enclosure behavior.\nconst vals = [1, 2];\n\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of vals) {\n console.log(\"pause again\", (() => val)());\n }\n\n console.log(\"done\");\n}\n"]} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-for-of.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-for-of.js
new file mode 100644
index 0000000000..837bf4c180
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-for-of.js
@@ -0,0 +1,126 @@
+// modules are defined as an array
+// [ module function, map of requires ]
+//
+// map of requires is short require name -> numeric require
+//
+// anything defined in a previous bundle is accessed via the
+// orig method which is the require for previous bundles
+
+// eslint-disable-next-line no-global-assign
+parcelRequire = (function (modules, cache, entry, globalName) {
+ // Save the require from previous bundle to this closure if any
+ var previousRequire = typeof parcelRequire === 'function' && parcelRequire;
+ var nodeRequire = typeof require === 'function' && require;
+
+ function newRequire(name, jumped) {
+ if (!cache[name]) {
+ if (!modules[name]) {
+ // if we cannot find the module within our internal map or
+ // cache jump to the current global require ie. the last bundle
+ // that was added to the page.
+ var currentRequire = typeof parcelRequire === 'function' && parcelRequire;
+ if (!jumped && currentRequire) {
+ return currentRequire(name, true);
+ }
+
+ // If there are other bundles on this page the require from the
+ // previous one is saved to 'previousRequire'. Repeat this as
+ // many times as there are bundles until the module is found or
+ // we exhaust the require chain.
+ if (previousRequire) {
+ return previousRequire(name, true);
+ }
+
+ // Try the node require function if it exists.
+ if (nodeRequire && typeof name === 'string') {
+ return nodeRequire(name);
+ }
+
+ var err = new Error('Cannot find module \'' + name + '\'');
+ err.code = 'MODULE_NOT_FOUND';
+ throw err;
+ }
+
+ localRequire.resolve = resolve;
+
+ var module = cache[name] = new newRequire.Module(name);
+
+ modules[name][0].call(module.exports, localRequire, module, module.exports, this);
+ }
+
+ return cache[name].exports;
+
+ function localRequire(x){
+ return newRequire(localRequire.resolve(x));
+ }
+
+ function resolve(x){
+ return modules[name][1][x] || x;
+ }
+ }
+
+ function Module(moduleName) {
+ this.id = moduleName;
+ this.bundle = newRequire;
+ this.exports = {};
+ }
+
+ newRequire.isParcelRequire = true;
+ newRequire.Module = Module;
+ newRequire.modules = modules;
+ newRequire.cache = cache;
+ newRequire.parent = previousRequire;
+ newRequire.register = function (id, exports) {
+ modules[id] = [function (require, module) {
+ module.exports = exports;
+ }, {}];
+ };
+
+ for (var i = 0; i < entry.length; i++) {
+ newRequire(entry[i]);
+ }
+
+ if (entry.length) {
+ // Expose entry point to Node, AMD or browser globals
+ // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js
+ var mainExports = newRequire(entry[entry.length - 1]);
+
+ // CommonJS
+ if (typeof exports === "object" && typeof module !== "undefined") {
+ module.exports = mainExports;
+
+ // RequireJS
+ } else if (typeof define === "function" && define.amd) {
+ define(function () {
+ return mainExports;
+ });
+
+ // <script>
+ } else if (globalName) {
+ this[globalName] = mainExports;
+ }
+ }
+
+ // Override the current require with this new one
+ return newRequire;
+})({"input.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = root;
+const vals = [1, 2];
+
+function root() {
+ console.log("pause here");
+
+ for (const val of vals) {
+ console.log("pause again", val);
+ }
+
+ console.log("done");
+}
+},{}]},{},["input.js"], "parcelStepOverForOf")
+//# sourceMappingURL=step-over-for-of.map
+;parcelStepOverForOf = parcelStepOverForOf.default; \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-for-of.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-for-of.map
new file mode 100644
index 0000000000..9044390c8d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-for-of.map
@@ -0,0 +1 @@
+{"version":3,"sources":["parcel://./step-over-for-of/input.js"],"names":["root","vals","console","log","val"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAEwBA;AAFxB,MAAMC,OAAO,CAAC,CAAD,EAAI,CAAJ,CAAb;;AAEe,SAASD,IAAT,GAAgB;AAC7BE,UAAQC,GAAR,CAAY,YAAZ;;AAEA,OAAK,MAAMC,GAAX,IAAkBH,IAAlB,EAAwB;AACtBC,YAAQC,GAAR,CAAY,aAAZ,EAA2BC,GAA3B;AACD;;AAEDF,UAAQC,GAAR,CAAY,MAAZ;AACD","file":"step-over-for-of.map","sourcesContent":["const vals = [1, 2];\n\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of vals) {\n console.log(\"pause again\", val);\n }\n\n console.log(\"done\");\n}\n"]} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-function-params.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-function-params.js
new file mode 100644
index 0000000000..4a0d98aa62
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-function-params.js
@@ -0,0 +1,123 @@
+// modules are defined as an array
+// [ module function, map of requires ]
+//
+// map of requires is short require name -> numeric require
+//
+// anything defined in a previous bundle is accessed via the
+// orig method which is the require for previous bundles
+
+// eslint-disable-next-line no-global-assign
+parcelRequire = (function (modules, cache, entry, globalName) {
+ // Save the require from previous bundle to this closure if any
+ var previousRequire = typeof parcelRequire === 'function' && parcelRequire;
+ var nodeRequire = typeof require === 'function' && require;
+
+ function newRequire(name, jumped) {
+ if (!cache[name]) {
+ if (!modules[name]) {
+ // if we cannot find the module within our internal map or
+ // cache jump to the current global require ie. the last bundle
+ // that was added to the page.
+ var currentRequire = typeof parcelRequire === 'function' && parcelRequire;
+ if (!jumped && currentRequire) {
+ return currentRequire(name, true);
+ }
+
+ // If there are other bundles on this page the require from the
+ // previous one is saved to 'previousRequire'. Repeat this as
+ // many times as there are bundles until the module is found or
+ // we exhaust the require chain.
+ if (previousRequire) {
+ return previousRequire(name, true);
+ }
+
+ // Try the node require function if it exists.
+ if (nodeRequire && typeof name === 'string') {
+ return nodeRequire(name);
+ }
+
+ var err = new Error('Cannot find module \'' + name + '\'');
+ err.code = 'MODULE_NOT_FOUND';
+ throw err;
+ }
+
+ localRequire.resolve = resolve;
+
+ var module = cache[name] = new newRequire.Module(name);
+
+ modules[name][0].call(module.exports, localRequire, module, module.exports, this);
+ }
+
+ return cache[name].exports;
+
+ function localRequire(x){
+ return newRequire(localRequire.resolve(x));
+ }
+
+ function resolve(x){
+ return modules[name][1][x] || x;
+ }
+ }
+
+ function Module(moduleName) {
+ this.id = moduleName;
+ this.bundle = newRequire;
+ this.exports = {};
+ }
+
+ newRequire.isParcelRequire = true;
+ newRequire.Module = Module;
+ newRequire.modules = modules;
+ newRequire.cache = cache;
+ newRequire.parent = previousRequire;
+ newRequire.register = function (id, exports) {
+ modules[id] = [function (require, module) {
+ module.exports = exports;
+ }, {}];
+ };
+
+ for (var i = 0; i < entry.length; i++) {
+ newRequire(entry[i]);
+ }
+
+ if (entry.length) {
+ // Expose entry point to Node, AMD or browser globals
+ // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js
+ var mainExports = newRequire(entry[entry.length - 1]);
+
+ // CommonJS
+ if (typeof exports === "object" && typeof module !== "undefined") {
+ module.exports = mainExports;
+
+ // RequireJS
+ } else if (typeof define === "function" && define.amd) {
+ define(function () {
+ return mainExports;
+ });
+
+ // <script>
+ } else if (globalName) {
+ this[globalName] = mainExports;
+ }
+ }
+
+ // Override the current require with this new one
+ return newRequire;
+})({"input.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = fn;
+function test(a1, a2 = 45, { a3, a4, a5: { a6: a7 } = {} } = {}) {
+ console.log("pause next here");
+}
+
+function fn() {
+ console.log("pause here");
+ test("1", undefined, { a3: "3", a4: "4", a5: { a6: "7" } });
+}
+},{}]},{},["input.js"], "parcelStepOverFunctionParams")
+//# sourceMappingURL=step-over-function-params.map
+;parcelStepOverFunctionParams = parcelStepOverFunctionParams.default; \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-function-params.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-function-params.map
new file mode 100644
index 0000000000..02d07a0783
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-function-params.map
@@ -0,0 +1 @@
+{"version":3,"sources":["parcel://./step-over-function-params/input.js"],"names":["fn","test","a1","a2","a3","a4","a5","a6","a7","console","log","undefined"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAIwBA;AAJxB,SAASC,IAAT,CAAcC,EAAd,EAAkBC,KAAK,EAAvB,EAA2B,EAAEC,EAAF,EAAMC,EAAN,EAAUC,IAAI,EAAEC,IAAIC,EAAN,KAAa,EAA3B,KAAkC,EAA7D,EAAiE;AAC/DC,UAAQC,GAAR,CAAY,iBAAZ;AACD;;AAEc,SAASV,EAAT,GAAc;AAC3BS,UAAQC,GAAR,CAAY,YAAZ;AACAT,OAAK,GAAL,EAAUU,SAAV,EAAqB,EAAEP,IAAI,GAAN,EAAWC,IAAI,GAAf,EAAoBC,IAAI,EAAEC,IAAI,GAAN,EAAxB,EAArB;AACD","file":"step-over-function-params.map","sourcesContent":["function test(a1, a2 = 45, { a3, a4, a5: { a6: a7 } = {} } = {}) {\n console.log(\"pause next here\");\n}\n\nexport default function fn() {\n console.log(\"pause here\");\n test(\"1\", undefined, { a3: \"3\", a4: \"4\", a5: { a6: \"7\" } });\n}\n"]} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-regenerator-await.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-regenerator-await.js
new file mode 100644
index 0000000000..c45b3a5037
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-regenerator-await.js
@@ -0,0 +1,130 @@
+// modules are defined as an array
+// [ module function, map of requires ]
+//
+// map of requires is short require name -> numeric require
+//
+// anything defined in a previous bundle is accessed via the
+// orig method which is the require for previous bundles
+
+// eslint-disable-next-line no-global-assign
+parcelRequire = (function (modules, cache, entry, globalName) {
+ // Save the require from previous bundle to this closure if any
+ var previousRequire = typeof parcelRequire === 'function' && parcelRequire;
+ var nodeRequire = typeof require === 'function' && require;
+
+ function newRequire(name, jumped) {
+ if (!cache[name]) {
+ if (!modules[name]) {
+ // if we cannot find the module within our internal map or
+ // cache jump to the current global require ie. the last bundle
+ // that was added to the page.
+ var currentRequire = typeof parcelRequire === 'function' && parcelRequire;
+ if (!jumped && currentRequire) {
+ return currentRequire(name, true);
+ }
+
+ // If there are other bundles on this page the require from the
+ // previous one is saved to 'previousRequire'. Repeat this as
+ // many times as there are bundles until the module is found or
+ // we exhaust the require chain.
+ if (previousRequire) {
+ return previousRequire(name, true);
+ }
+
+ // Try the node require function if it exists.
+ if (nodeRequire && typeof name === 'string') {
+ return nodeRequire(name);
+ }
+
+ var err = new Error('Cannot find module \'' + name + '\'');
+ err.code = 'MODULE_NOT_FOUND';
+ throw err;
+ }
+
+ localRequire.resolve = resolve;
+
+ var module = cache[name] = new newRequire.Module(name);
+
+ modules[name][0].call(module.exports, localRequire, module, module.exports, this);
+ }
+
+ return cache[name].exports;
+
+ function localRequire(x){
+ return newRequire(localRequire.resolve(x));
+ }
+
+ function resolve(x){
+ return modules[name][1][x] || x;
+ }
+ }
+
+ function Module(moduleName) {
+ this.id = moduleName;
+ this.bundle = newRequire;
+ this.exports = {};
+ }
+
+ newRequire.isParcelRequire = true;
+ newRequire.Module = Module;
+ newRequire.modules = modules;
+ newRequire.cache = cache;
+ newRequire.parent = previousRequire;
+ newRequire.register = function (id, exports) {
+ modules[id] = [function (require, module) {
+ module.exports = exports;
+ }, {}];
+ };
+
+ for (var i = 0; i < entry.length; i++) {
+ newRequire(entry[i]);
+ }
+
+ if (entry.length) {
+ // Expose entry point to Node, AMD or browser globals
+ // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js
+ var mainExports = newRequire(entry[entry.length - 1]);
+
+ // CommonJS
+ if (typeof exports === "object" && typeof module !== "undefined") {
+ module.exports = mainExports;
+
+ // RequireJS
+ } else if (typeof define === "function" && define.amd) {
+ define(function () {
+ return mainExports;
+ });
+
+ // <script>
+ } else if (globalName) {
+ this[globalName] = mainExports;
+ }
+ }
+
+ // Override the current require with this new one
+ return newRequire;
+})({"input.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = root;
+var fn = async function fn() {
+ console.log("pause here");
+
+ await doAsync();
+
+ console.log("stopped here");
+};
+
+function doAsync() {
+ return Promise.resolve();
+}
+
+function root() {
+ fn();
+}
+},{}]},{},["input.js"], "parcelStepOverRegeneratorAwait")
+//# sourceMappingURL=step-over-regenerator-await.map
+;parcelStepOverRegeneratorAwait = parcelStepOverRegeneratorAwait.default; \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-regenerator-await.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-regenerator-await.map
new file mode 100644
index 0000000000..dca1d674da
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/step-over-regenerator-await.map
@@ -0,0 +1 @@
+{"version":3,"sources":["parcel://./step-over-regenerator-await/input.js"],"names":["root","fn","console","log","doAsync","Promise","resolve"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAYwBA;AAZxB,IAAIC,KAAK,eAAeA,EAAf,GAAoB;AAC3BC,UAAQC,GAAR,CAAY,YAAZ;;AAEA,QAAMC,SAAN;;AAEAF,UAAQC,GAAR,CAAY,cAAZ;AACD,CAND;;AAQA,SAASC,OAAT,GAAmB;AACjB,SAAOC,QAAQC,OAAR,EAAP;AACD;;AAEc,SAASN,IAAT,GAAgB;AAC7BC;AACD","file":"step-over-regenerator-await.map","sourcesContent":["var fn = async function fn() {\n console.log(\"pause here\");\n\n await doAsync();\n\n console.log(\"stopped here\");\n};\n\nfunction doAsync() {\n return Promise.resolve();\n}\n\nexport default function root() {\n fn();\n}\n"]} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/switches.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/switches.js
new file mode 100644
index 0000000000..bb26ffe62d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/switches.js
@@ -0,0 +1,129 @@
+// modules are defined as an array
+// [ module function, map of requires ]
+//
+// map of requires is short require name -> numeric require
+//
+// anything defined in a previous bundle is accessed via the
+// orig method which is the require for previous bundles
+
+// eslint-disable-next-line no-global-assign
+parcelRequire = (function (modules, cache, entry, globalName) {
+ // Save the require from previous bundle to this closure if any
+ var previousRequire = typeof parcelRequire === 'function' && parcelRequire;
+ var nodeRequire = typeof require === 'function' && require;
+
+ function newRequire(name, jumped) {
+ if (!cache[name]) {
+ if (!modules[name]) {
+ // if we cannot find the module within our internal map or
+ // cache jump to the current global require ie. the last bundle
+ // that was added to the page.
+ var currentRequire = typeof parcelRequire === 'function' && parcelRequire;
+ if (!jumped && currentRequire) {
+ return currentRequire(name, true);
+ }
+
+ // If there are other bundles on this page the require from the
+ // previous one is saved to 'previousRequire'. Repeat this as
+ // many times as there are bundles until the module is found or
+ // we exhaust the require chain.
+ if (previousRequire) {
+ return previousRequire(name, true);
+ }
+
+ // Try the node require function if it exists.
+ if (nodeRequire && typeof name === 'string') {
+ return nodeRequire(name);
+ }
+
+ var err = new Error('Cannot find module \'' + name + '\'');
+ err.code = 'MODULE_NOT_FOUND';
+ throw err;
+ }
+
+ localRequire.resolve = resolve;
+
+ var module = cache[name] = new newRequire.Module(name);
+
+ modules[name][0].call(module.exports, localRequire, module, module.exports, this);
+ }
+
+ return cache[name].exports;
+
+ function localRequire(x){
+ return newRequire(localRequire.resolve(x));
+ }
+
+ function resolve(x){
+ return modules[name][1][x] || x;
+ }
+ }
+
+ function Module(moduleName) {
+ this.id = moduleName;
+ this.bundle = newRequire;
+ this.exports = {};
+ }
+
+ newRequire.isParcelRequire = true;
+ newRequire.Module = Module;
+ newRequire.modules = modules;
+ newRequire.cache = cache;
+ newRequire.parent = previousRequire;
+ newRequire.register = function (id, exports) {
+ modules[id] = [function (require, module) {
+ module.exports = exports;
+ }, {}];
+ };
+
+ for (var i = 0; i < entry.length; i++) {
+ newRequire(entry[i]);
+ }
+
+ if (entry.length) {
+ // Expose entry point to Node, AMD or browser globals
+ // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js
+ var mainExports = newRequire(entry[entry.length - 1]);
+
+ // CommonJS
+ if (typeof exports === "object" && typeof module !== "undefined") {
+ module.exports = mainExports;
+
+ // RequireJS
+ } else if (typeof define === "function" && define.amd) {
+ define(function () {
+ return mainExports;
+ });
+
+ // <script>
+ } else if (globalName) {
+ this[globalName] = mainExports;
+ }
+ }
+
+ // Override the current require with this new one
+ return newRequire;
+})({"input.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = root;
+function root() {
+ let val = 1;
+
+ switch (true) {
+ case true:
+ let val = 2;
+ console.log("pause here", root);
+ default:
+ {
+ let val = 3;
+ console.log("pause here", root);
+ }
+ }
+}
+},{}]},{},["input.js"], "parcelSwitches")
+//# sourceMappingURL=switches.map
+;parcelSwitches = parcelSwitches.default; \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/switches.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/switches.map
new file mode 100644
index 0000000000..6bbe84d9a3
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/switches.map
@@ -0,0 +1 @@
+{"version":3,"sources":["parcel://./switches/input.js"],"names":["root","val","console","log"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAAwBA;AAAT,SAASA,IAAT,GAAgB;AAC7B,MAAIC,MAAM,CAAV;;AAEA,UAAQ,IAAR;AACE,SAAK,IAAL;AACE,UAAIA,MAAM,CAAV;AACAC,cAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B;AACF;AAAS;AACP,YAAIC,MAAM,CAAV;AACAC,gBAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B;AACD;AAPH;AASD","file":"switches.map","sourcesContent":["export default function root() {\n let val = 1;\n\n switch (true) {\n case true:\n let val = 2;\n console.log(\"pause here\", root);\n default: {\n let val = 3;\n console.log(\"pause here\", root);\n }\n }\n}\n"]} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/this-arguments-bindings.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/this-arguments-bindings.js
new file mode 100644
index 0000000000..0ad3ea3e21
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/this-arguments-bindings.js
@@ -0,0 +1,129 @@
+// modules are defined as an array
+// [ module function, map of requires ]
+//
+// map of requires is short require name -> numeric require
+//
+// anything defined in a previous bundle is accessed via the
+// orig method which is the require for previous bundles
+
+// eslint-disable-next-line no-global-assign
+parcelRequire = (function (modules, cache, entry, globalName) {
+ // Save the require from previous bundle to this closure if any
+ var previousRequire = typeof parcelRequire === 'function' && parcelRequire;
+ var nodeRequire = typeof require === 'function' && require;
+
+ function newRequire(name, jumped) {
+ if (!cache[name]) {
+ if (!modules[name]) {
+ // if we cannot find the module within our internal map or
+ // cache jump to the current global require ie. the last bundle
+ // that was added to the page.
+ var currentRequire = typeof parcelRequire === 'function' && parcelRequire;
+ if (!jumped && currentRequire) {
+ return currentRequire(name, true);
+ }
+
+ // If there are other bundles on this page the require from the
+ // previous one is saved to 'previousRequire'. Repeat this as
+ // many times as there are bundles until the module is found or
+ // we exhaust the require chain.
+ if (previousRequire) {
+ return previousRequire(name, true);
+ }
+
+ // Try the node require function if it exists.
+ if (nodeRequire && typeof name === 'string') {
+ return nodeRequire(name);
+ }
+
+ var err = new Error('Cannot find module \'' + name + '\'');
+ err.code = 'MODULE_NOT_FOUND';
+ throw err;
+ }
+
+ localRequire.resolve = resolve;
+
+ var module = cache[name] = new newRequire.Module(name);
+
+ modules[name][0].call(module.exports, localRequire, module, module.exports, this);
+ }
+
+ return cache[name].exports;
+
+ function localRequire(x){
+ return newRequire(localRequire.resolve(x));
+ }
+
+ function resolve(x){
+ return modules[name][1][x] || x;
+ }
+ }
+
+ function Module(moduleName) {
+ this.id = moduleName;
+ this.bundle = newRequire;
+ this.exports = {};
+ }
+
+ newRequire.isParcelRequire = true;
+ newRequire.Module = Module;
+ newRequire.modules = modules;
+ newRequire.cache = cache;
+ newRequire.parent = previousRequire;
+ newRequire.register = function (id, exports) {
+ modules[id] = [function (require, module) {
+ module.exports = exports;
+ }, {}];
+ };
+
+ for (var i = 0; i < entry.length; i++) {
+ newRequire(entry[i]);
+ }
+
+ if (entry.length) {
+ // Expose entry point to Node, AMD or browser globals
+ // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js
+ var mainExports = newRequire(entry[entry.length - 1]);
+
+ // CommonJS
+ if (typeof exports === "object" && typeof module !== "undefined") {
+ module.exports = mainExports;
+
+ // RequireJS
+ } else if (typeof define === "function" && define.amd) {
+ define(function () {
+ return mainExports;
+ });
+
+ // <script>
+ } else if (globalName) {
+ this[globalName] = mainExports;
+ }
+ }
+
+ // Override the current require with this new one
+ return newRequire;
+})({"input.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = root;
+function root() {
+ function fn(arg) {
+ console.log(this, arguments);
+ console.log("pause here", fn, root);
+
+ const arrow = argArrow => {
+ console.log(this, arguments);
+ console.log("pause here", fn, root);
+ };
+ arrow("arrow-arg");
+ }
+
+ fn.call("this-value", "arg-value");
+}
+},{}]},{},["input.js"], "parcelThisArgumentsBindings")
+//# sourceMappingURL=this-arguments-bindings.map
+;parcelThisArgumentsBindings = parcelThisArgumentsBindings.default; \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/this-arguments-bindings.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/this-arguments-bindings.map
new file mode 100644
index 0000000000..ecdb9290d4
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/this-arguments-bindings.map
@@ -0,0 +1 @@
+{"version":3,"sources":["parcel://./this-arguments-bindings/input.js"],"names":["root","fn","arg","console","log","arguments","arrow","argArrow","call"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAAwBA;AAAT,SAASA,IAAT,GAAgB;AAC7B,WAASC,EAAT,CAAYC,GAAZ,EAAiB;AACfC,YAAQC,GAAR,CAAY,IAAZ,EAAkBC,SAAlB;AACAF,YAAQC,GAAR,CAAY,YAAZ,EAA0BH,EAA1B,EAA8BD,IAA9B;;AAEA,UAAMM,QAAQC,YAAY;AACxBJ,cAAQC,GAAR,CAAY,IAAZ,EAAkBC,SAAlB;AACAF,cAAQC,GAAR,CAAY,YAAZ,EAA0BH,EAA1B,EAA8BD,IAA9B;AACD,KAHD;AAIAM,UAAM,WAAN;AACD;;AAEDL,KAAGO,IAAH,CAAQ,YAAR,EAAsB,WAAtB;AACD","file":"this-arguments-bindings.map","sourcesContent":["export default function root() {\n function fn(arg) {\n console.log(this, arguments);\n console.log(\"pause here\", fn, root);\n\n const arrow = argArrow => {\n console.log(this, arguments);\n console.log(\"pause here\", fn, root);\n };\n arrow(\"arrow-arg\");\n }\n\n fn.call(\"this-value\", \"arg-value\");\n}\n"]} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/try-catches.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/try-catches.js
new file mode 100644
index 0000000000..a5114d623b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/try-catches.js
@@ -0,0 +1,125 @@
+// modules are defined as an array
+// [ module function, map of requires ]
+//
+// map of requires is short require name -> numeric require
+//
+// anything defined in a previous bundle is accessed via the
+// orig method which is the require for previous bundles
+
+// eslint-disable-next-line no-global-assign
+parcelRequire = (function (modules, cache, entry, globalName) {
+ // Save the require from previous bundle to this closure if any
+ var previousRequire = typeof parcelRequire === 'function' && parcelRequire;
+ var nodeRequire = typeof require === 'function' && require;
+
+ function newRequire(name, jumped) {
+ if (!cache[name]) {
+ if (!modules[name]) {
+ // if we cannot find the module within our internal map or
+ // cache jump to the current global require ie. the last bundle
+ // that was added to the page.
+ var currentRequire = typeof parcelRequire === 'function' && parcelRequire;
+ if (!jumped && currentRequire) {
+ return currentRequire(name, true);
+ }
+
+ // If there are other bundles on this page the require from the
+ // previous one is saved to 'previousRequire'. Repeat this as
+ // many times as there are bundles until the module is found or
+ // we exhaust the require chain.
+ if (previousRequire) {
+ return previousRequire(name, true);
+ }
+
+ // Try the node require function if it exists.
+ if (nodeRequire && typeof name === 'string') {
+ return nodeRequire(name);
+ }
+
+ var err = new Error('Cannot find module \'' + name + '\'');
+ err.code = 'MODULE_NOT_FOUND';
+ throw err;
+ }
+
+ localRequire.resolve = resolve;
+
+ var module = cache[name] = new newRequire.Module(name);
+
+ modules[name][0].call(module.exports, localRequire, module, module.exports, this);
+ }
+
+ return cache[name].exports;
+
+ function localRequire(x){
+ return newRequire(localRequire.resolve(x));
+ }
+
+ function resolve(x){
+ return modules[name][1][x] || x;
+ }
+ }
+
+ function Module(moduleName) {
+ this.id = moduleName;
+ this.bundle = newRequire;
+ this.exports = {};
+ }
+
+ newRequire.isParcelRequire = true;
+ newRequire.Module = Module;
+ newRequire.modules = modules;
+ newRequire.cache = cache;
+ newRequire.parent = previousRequire;
+ newRequire.register = function (id, exports) {
+ modules[id] = [function (require, module) {
+ module.exports = exports;
+ }, {}];
+ };
+
+ for (var i = 0; i < entry.length; i++) {
+ newRequire(entry[i]);
+ }
+
+ if (entry.length) {
+ // Expose entry point to Node, AMD or browser globals
+ // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js
+ var mainExports = newRequire(entry[entry.length - 1]);
+
+ // CommonJS
+ if (typeof exports === "object" && typeof module !== "undefined") {
+ module.exports = mainExports;
+
+ // RequireJS
+ } else if (typeof define === "function" && define.amd) {
+ define(function () {
+ return mainExports;
+ });
+
+ // <script>
+ } else if (globalName) {
+ this[globalName] = mainExports;
+ }
+ }
+
+ // Override the current require with this new one
+ return newRequire;
+})({"input.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = root;
+function root() {
+ const one = 1;
+
+ try {
+ throw "AnError";
+ } catch (err) {
+ let two = 2;
+ console.log("pause here", root);
+ }
+}
+},{}]},{},["input.js"], "parcelTryCatches")
+//# sourceMappingURL=try-catches.map
+;parcelTryCatches = parcelTryCatches.default; \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/try-catches.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/try-catches.map
new file mode 100644
index 0000000000..cb0c94df8a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/try-catches.map
@@ -0,0 +1 @@
+{"version":3,"sources":["parcel://./try-catches/input.js"],"names":["root","one","err","two","console","log"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAAwBA;AAAT,SAASA,IAAT,GAAgB;AAC7B,QAAMC,MAAM,CAAZ;;AAEA,MAAI;AACF,UAAM,SAAN;AACD,GAFD,CAEE,OAAOC,GAAP,EAAY;AACZ,QAAIC,MAAM,CAAV;AACAC,YAAQC,GAAR,CAAY,YAAZ,EAA0BL,IAA1B;AACD;AACF","file":"try-catches.map","sourcesContent":["export default function root() {\n const one = 1;\n\n try {\n throw \"AnError\";\n } catch (err) {\n let two = 2;\n console.log(\"pause here\", root);\n }\n}\n"]} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/type-module.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/type-module.js
new file mode 100644
index 0000000000..51db456e56
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/type-module.js
@@ -0,0 +1,123 @@
+// modules are defined as an array
+// [ module function, map of requires ]
+//
+// map of requires is short require name -> numeric require
+//
+// anything defined in a previous bundle is accessed via the
+// orig method which is the require for previous bundles
+
+// eslint-disable-next-line no-global-assign
+parcelRequire = (function (modules, cache, entry, globalName) {
+ // Save the require from previous bundle to this closure if any
+ var previousRequire = typeof parcelRequire === 'function' && parcelRequire;
+ var nodeRequire = typeof require === 'function' && require;
+
+ function newRequire(name, jumped) {
+ if (!cache[name]) {
+ if (!modules[name]) {
+ // if we cannot find the module within our internal map or
+ // cache jump to the current global require ie. the last bundle
+ // that was added to the page.
+ var currentRequire = typeof parcelRequire === 'function' && parcelRequire;
+ if (!jumped && currentRequire) {
+ return currentRequire(name, true);
+ }
+
+ // If there are other bundles on this page the require from the
+ // previous one is saved to 'previousRequire'. Repeat this as
+ // many times as there are bundles until the module is found or
+ // we exhaust the require chain.
+ if (previousRequire) {
+ return previousRequire(name, true);
+ }
+
+ // Try the node require function if it exists.
+ if (nodeRequire && typeof name === 'string') {
+ return nodeRequire(name);
+ }
+
+ var err = new Error('Cannot find module \'' + name + '\'');
+ err.code = 'MODULE_NOT_FOUND';
+ throw err;
+ }
+
+ localRequire.resolve = resolve;
+
+ var module = cache[name] = new newRequire.Module(name);
+
+ modules[name][0].call(module.exports, localRequire, module, module.exports, this);
+ }
+
+ return cache[name].exports;
+
+ function localRequire(x){
+ return newRequire(localRequire.resolve(x));
+ }
+
+ function resolve(x){
+ return modules[name][1][x] || x;
+ }
+ }
+
+ function Module(moduleName) {
+ this.id = moduleName;
+ this.bundle = newRequire;
+ this.exports = {};
+ }
+
+ newRequire.isParcelRequire = true;
+ newRequire.Module = Module;
+ newRequire.modules = modules;
+ newRequire.cache = cache;
+ newRequire.parent = previousRequire;
+ newRequire.register = function (id, exports) {
+ modules[id] = [function (require, module) {
+ module.exports = exports;
+ }, {}];
+ };
+
+ for (var i = 0; i < entry.length; i++) {
+ newRequire(entry[i]);
+ }
+
+ if (entry.length) {
+ // Expose entry point to Node, AMD or browser globals
+ // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js
+ var mainExports = newRequire(entry[entry.length - 1]);
+
+ // CommonJS
+ if (typeof exports === "object" && typeof module !== "undefined") {
+ module.exports = mainExports;
+
+ // RequireJS
+ } else if (typeof define === "function" && define.amd) {
+ define(function () {
+ return mainExports;
+ });
+
+ // <script>
+ } else if (globalName) {
+ this[globalName] = mainExports;
+ }
+ }
+
+ // Override the current require with this new one
+ return newRequire;
+})({"input.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+exports.default = function () {
+ console.log("pause here", moduleScoped, alsoModuleScoped, thirdModuleScoped);
+};
+
+var moduleScoped = 1;
+let alsoModuleScoped = 2;
+
+function thirdModuleScoped() {}
+},{}]},{},["input.js"], "parcelTypeModule")
+//# sourceMappingURL=type-module.map
+;parcelTypeModule = parcelTypeModule.default; \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/type-module.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/type-module.map
new file mode 100644
index 0000000000..4033191bf3
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/type-module.map
@@ -0,0 +1 @@
+{"version":3,"sources":["parcel://./type-module/input.js"],"names":["console","log","moduleScoped","alsoModuleScoped","thirdModuleScoped"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAKe,YAAW;AACxBA,UAAQC,GAAR,CAAY,YAAZ,EAA0BC,YAA1B,EAAwCC,gBAAxC,EAA0DC,iBAA1D;AACD;;AAPD,IAAIF,eAAe,CAAnB;AACA,IAAIC,mBAAmB,CAAvB;;AAEA,SAASC,iBAAT,GAA6B,CAAE","file":"type-module.map","sourcesContent":["var moduleScoped = 1;\nlet alsoModuleScoped = 2;\n\nfunction thirdModuleScoped() {}\n\nexport default function() {\n console.log(\"pause here\", moduleScoped, alsoModuleScoped, thirdModuleScoped);\n}\n"]} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/type-script-cjs.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/type-script-cjs.js
new file mode 100644
index 0000000000..29619ce8c4
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/type-script-cjs.js
@@ -0,0 +1,119 @@
+// modules are defined as an array
+// [ module function, map of requires ]
+//
+// map of requires is short require name -> numeric require
+//
+// anything defined in a previous bundle is accessed via the
+// orig method which is the require for previous bundles
+
+// eslint-disable-next-line no-global-assign
+parcelRequire = (function (modules, cache, entry, globalName) {
+ // Save the require from previous bundle to this closure if any
+ var previousRequire = typeof parcelRequire === 'function' && parcelRequire;
+ var nodeRequire = typeof require === 'function' && require;
+
+ function newRequire(name, jumped) {
+ if (!cache[name]) {
+ if (!modules[name]) {
+ // if we cannot find the module within our internal map or
+ // cache jump to the current global require ie. the last bundle
+ // that was added to the page.
+ var currentRequire = typeof parcelRequire === 'function' && parcelRequire;
+ if (!jumped && currentRequire) {
+ return currentRequire(name, true);
+ }
+
+ // If there are other bundles on this page the require from the
+ // previous one is saved to 'previousRequire'. Repeat this as
+ // many times as there are bundles until the module is found or
+ // we exhaust the require chain.
+ if (previousRequire) {
+ return previousRequire(name, true);
+ }
+
+ // Try the node require function if it exists.
+ if (nodeRequire && typeof name === 'string') {
+ return nodeRequire(name);
+ }
+
+ var err = new Error('Cannot find module \'' + name + '\'');
+ err.code = 'MODULE_NOT_FOUND';
+ throw err;
+ }
+
+ localRequire.resolve = resolve;
+
+ var module = cache[name] = new newRequire.Module(name);
+
+ modules[name][0].call(module.exports, localRequire, module, module.exports, this);
+ }
+
+ return cache[name].exports;
+
+ function localRequire(x){
+ return newRequire(localRequire.resolve(x));
+ }
+
+ function resolve(x){
+ return modules[name][1][x] || x;
+ }
+ }
+
+ function Module(moduleName) {
+ this.id = moduleName;
+ this.bundle = newRequire;
+ this.exports = {};
+ }
+
+ newRequire.isParcelRequire = true;
+ newRequire.Module = Module;
+ newRequire.modules = modules;
+ newRequire.cache = cache;
+ newRequire.parent = previousRequire;
+ newRequire.register = function (id, exports) {
+ modules[id] = [function (require, module) {
+ module.exports = exports;
+ }, {}];
+ };
+
+ for (var i = 0; i < entry.length; i++) {
+ newRequire(entry[i]);
+ }
+
+ if (entry.length) {
+ // Expose entry point to Node, AMD or browser globals
+ // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js
+ var mainExports = newRequire(entry[entry.length - 1]);
+
+ // CommonJS
+ if (typeof exports === "object" && typeof module !== "undefined") {
+ module.exports = mainExports;
+
+ // RequireJS
+ } else if (typeof define === "function" && define.amd) {
+ define(function () {
+ return mainExports;
+ });
+
+ // <script>
+ } else if (globalName) {
+ this[globalName] = mainExports;
+ }
+ }
+
+ // Override the current require with this new one
+ return newRequire;
+})({"input.js":[function(require,module,exports) {
+var moduleScoped = 1;
+let alsoModuleScopes = 2;
+
+function thirdModuleScoped() {}
+
+function nonModules() {
+ console.log("pause here");
+}
+
+exports.default = nonModules;
+},{}]},{},["input.js"], "parcelTypeScriptCjs")
+//# sourceMappingURL=type-script-cjs.map
+;parcelTypeScriptCjs = parcelTypeScriptCjs.default; \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/type-script-cjs.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/type-script-cjs.map
new file mode 100644
index 0000000000..69e4e30187
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/type-script-cjs.map
@@ -0,0 +1 @@
+{"version":3,"sources":["parcel://./type-script-cjs/input.js"],"names":["moduleScoped","alsoModuleScopes","thirdModuleScoped","nonModules","console","log","exports","default"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAIA,eAAe,CAAnB;AACA,IAAIC,mBAAmB,CAAvB;;AAEA,SAASC,iBAAT,GAA6B,CAAE;;AAE/B,SAASC,UAAT,GAAsB;AACpBC,UAAQC,GAAR,CAAY,YAAZ;AACD;;AAEDC,QAAQC,OAAR,GAAkBJ,UAAlB","file":"type-script-cjs.map","sourcesContent":["var moduleScoped = 1;\nlet alsoModuleScopes = 2;\n\nfunction thirdModuleScoped() {}\n\nfunction nonModules() {\n console.log(\"pause here\");\n}\n\nexports.default = nonModules;\n"]} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/typescript-classes.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/typescript-classes.js
new file mode 100644
index 0000000000..8b69046232
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/typescript-classes.js
@@ -0,0 +1,221 @@
+// modules are defined as an array
+// [ module function, map of requires ]
+//
+// map of requires is short require name -> numeric require
+//
+// anything defined in a previous bundle is accessed via the
+// orig method which is the require for previous bundles
+
+// eslint-disable-next-line no-global-assign
+parcelRequire = (function (modules, cache, entry, globalName) {
+ // Save the require from previous bundle to this closure if any
+ var previousRequire = typeof parcelRequire === 'function' && parcelRequire;
+ var nodeRequire = typeof require === 'function' && require;
+
+ function newRequire(name, jumped) {
+ if (!cache[name]) {
+ if (!modules[name]) {
+ // if we cannot find the module within our internal map or
+ // cache jump to the current global require ie. the last bundle
+ // that was added to the page.
+ var currentRequire = typeof parcelRequire === 'function' && parcelRequire;
+ if (!jumped && currentRequire) {
+ return currentRequire(name, true);
+ }
+
+ // If there are other bundles on this page the require from the
+ // previous one is saved to 'previousRequire'. Repeat this as
+ // many times as there are bundles until the module is found or
+ // we exhaust the require chain.
+ if (previousRequire) {
+ return previousRequire(name, true);
+ }
+
+ // Try the node require function if it exists.
+ if (nodeRequire && typeof name === 'string') {
+ return nodeRequire(name);
+ }
+
+ var err = new Error('Cannot find module \'' + name + '\'');
+ err.code = 'MODULE_NOT_FOUND';
+ throw err;
+ }
+
+ localRequire.resolve = resolve;
+
+ var module = cache[name] = new newRequire.Module(name);
+
+ modules[name][0].call(module.exports, localRequire, module, module.exports, this);
+ }
+
+ return cache[name].exports;
+
+ function localRequire(x){
+ return newRequire(localRequire.resolve(x));
+ }
+
+ function resolve(x){
+ return modules[name][1][x] || x;
+ }
+ }
+
+ function Module(moduleName) {
+ this.id = moduleName;
+ this.bundle = newRequire;
+ this.exports = {};
+ }
+
+ newRequire.isParcelRequire = true;
+ newRequire.Module = Module;
+ newRequire.modules = modules;
+ newRequire.cache = cache;
+ newRequire.parent = previousRequire;
+ newRequire.register = function (id, exports) {
+ modules[id] = [function (require, module) {
+ module.exports = exports;
+ }, {}];
+ };
+
+ for (var i = 0; i < entry.length; i++) {
+ newRequire(entry[i]);
+ }
+
+ if (entry.length) {
+ // Expose entry point to Node, AMD or browser globals
+ // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js
+ var mainExports = newRequire(entry[entry.length - 1]);
+
+ // CommonJS
+ if (typeof exports === "object" && typeof module !== "undefined") {
+ module.exports = mainExports;
+
+ // RequireJS
+ } else if (typeof define === "function" && define.amd) {
+ define(function () {
+ return mainExports;
+ });
+
+ // <script>
+ } else if (globalName) {
+ this[globalName] = mainExports;
+ }
+ }
+
+ // Override the current require with this new one
+ return newRequire;
+})({"src/mod.ts":[function(require,module,exports) {
+"use strict";
+
+exports.__esModule = true;
+function decoratorFactory(opts) {
+ return function decorator(target) {
+ return target;
+ };
+}
+exports.decoratorFactory = decoratorFactory;
+function def() {}
+exports["default"] = def;
+},{}],"input.ts":[function(require,module,exports) {
+"use strict";
+// This file essentially reproduces an example Angular component to map testing,
+// among other typescript edge cases.
+
+var __extends = this && this.__extends || function () {
+ var extendStatics = function (d, b) {
+ extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function (d, b) {
+ d.__proto__ = b;
+ } || function (d, b) {
+ for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
+ };
+ return extendStatics(d, b);
+ };
+ return function (d, b) {
+ extendStatics(d, b);
+ function __() {
+ this.constructor = d;
+ }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ };
+}();
+var __decorate = this && this.__decorate || function (decorators, target, key, desc) {
+ var c = arguments.length,
+ r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,
+ d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+var __importStar = this && this.__importStar || function (mod) {
+ if (mod && mod.__esModule) return mod;
+ var result = {};
+ if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
+ result["default"] = mod;
+ return result;
+};
+exports.__esModule = true;
+var mod_ts_1 = require("./src/mod.ts");
+var ns = __importStar(require("./src/mod.ts"));
+var AppComponent = /** @class */function () {
+ function AppComponent() {
+ this.title = 'app';
+ }
+ AppComponent = __decorate([mod_ts_1.decoratorFactory({
+ selector: 'app-root'
+ })], AppComponent);
+ return AppComponent;
+}();
+exports.AppComponent = AppComponent;
+var fn = function (arg) {
+ console.log("here");
+};
+fn("arg");
+// Un-decorated exported classes present a mapping challege because
+// the class name is mapped to an unhelpful export assignment.
+var ExportedOther = /** @class */function () {
+ function ExportedOther() {
+ this.title = 'app';
+ }
+ return ExportedOther;
+}();
+exports.ExportedOther = ExportedOther;
+var AnotherThing = /** @class */function () {
+ function AnotherThing() {
+ this.prop = 4;
+ }
+ return AnotherThing;
+}();
+var ExpressionClass = /** @class */function () {
+ function Foo() {
+ this.prop = 4;
+ }
+ return Foo;
+}();
+var SubDecl = /** @class */function (_super) {
+ __extends(SubDecl, _super);
+ function SubDecl() {
+ var _this = _super !== null && _super.apply(this, arguments) || this;
+ _this.prop = 4;
+ return _this;
+ }
+ return SubDecl;
+}(AnotherThing);
+var SubVar = /** @class */function (_super) {
+ __extends(SubExpr, _super);
+ function SubExpr() {
+ var _this = _super !== null && _super.apply(this, arguments) || this;
+ _this.prop = 4;
+ return _this;
+ }
+ return SubExpr;
+}(AnotherThing);
+ns;
+function default_1() {
+ // This file is specifically for testing the mappings of classes and things
+ // above, which means we don't want to include _other_ references to then.
+ // To avoid having them be optimized out, we include a no-op eval.
+ eval("");
+ console.log("pause here");
+}
+exports["default"] = default_1;
+},{"./src/mod.ts":"src/mod.ts"}]},{},["input.ts"], "parcelTypescriptClasses")
+//# sourceMappingURL=typescript-classes.map
+;parcelTypescriptClasses = parcelTypescriptClasses.default; \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/typescript-classes.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/typescript-classes.map
new file mode 100644
index 0000000000..467ffee70c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/typescript-classes.map
@@ -0,0 +1 @@
+{"version":3,"sources":["parcel://./typescript-classes/src/mod.ts","parcel://./typescript-classes/input.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,SAAgB,gBAAhB,CAAiC,IAAjC,EAA2D;AACzD,WAAO,SAAS,SAAT,CAAmB,MAAnB,EAAyB;AAC9B,eAAY,MAAZ;AACD,KAFD;AAGD;AAJD,QAAA,gBAAA,GAAA,gBAAA;AAMA,SAAwB,GAAxB,GAA2B,CAAK;AAAhC,QAAA,SAAA,IAAA,GAAA;;;ACPA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,IAAA,WAAA,QAAA,cAAA,CAAA;AAEA,IAAA,KAAA,aAAA,QAAA,cAAA,CAAA,CAAA;AAKA,IAAA,eAAA,aAAA,YAAA;AAHA,aAAA,YAAA,GAAA;AAIE,aAAA,KAAA,GAAQ,KAAR;AACD;AAFY,mBAAY,WAAA,CAHxB,SAAA,gBAAA,CAAiB;AAChB,kBAAU;AADM,KAAjB,CAGwB,CAAA,EAAZ,YAAY,CAAZ;AAEb,WAAA,YAAA;AAFA,CAAA,EAAA;AAAa,QAAA,YAAA,GAAA,YAAA;AAIb,IAAM,KAAK,UAAA,GAAA,EAAG;AACZ,YAAQ,GAAR,CAAY,MAAZ;AACD,CAFD;AAGA,GAAG,KAAH;AAEA;AACA;AACA,IAAA,gBAAA,aAAA,YAAA;AAAA,aAAA,aAAA,GAAA;AACE,aAAA,KAAA,GAAQ,KAAR;AACD;AAAD,WAAA,aAAA;AAFA,CAAA,EAAA;AAAa,QAAA,aAAA,GAAA,aAAA;AAIb,IAAA,eAAA,aAAA,YAAA;AAAA,aAAA,YAAA,GAAA;AACE,aAAA,IAAA,GAAO,CAAP;AACD;AAAD,WAAA,YAAA;AAFA,CAAA,EAAA;AAIA,IAAM,kBAAe,aAAA,YAAA;AAAG,aAAA,GAAA,GAAA;AACtB,aAAA,IAAA,GAAO,CAAP;AACD;AAAD,WAAA,GAAA;AAFwB,CAAH,EAArB;AAIA,IAAA,UAAA,aAAA,UAAA,MAAA,EAAA;AAAsB,cAAA,OAAA,EAAA,MAAA;AAAtB,aAAA,OAAA,GAAA;AAAA,YAAA,QAAA,WAAA,IAAA,IAAA,OAAA,KAAA,CAAA,IAAA,EAAA,SAAA,CAAA,IAAA,IAAA;AACE,cAAA,IAAA,GAAO,CAAP;;AACD;AAAD,WAAA,OAAA;AAFA,CAAA,CAAsB,YAAtB,CAAA;AAIA,IAAI,SAAM,aAAA,UAAA,MAAA,EAAA;AAAyB,cAAA,OAAA,EAAA,MAAA;AAAtB,aAAA,OAAA,GAAA;AAAA,YAAA,QAAA,WAAA,IAAA,IAAA,OAAA,KAAA,CAAA,IAAA,EAAA,SAAA,CAAA,IAAA,IAAA;AACX,cAAA,IAAA,GAAO,CAAP;;AACD;AAAD,WAAA,OAAA;AAFa,CAAH,CAAyB,YAAzB,CAAV;AAIA;AAEA,SAAA,SAAA,GAAA;AACE;AACA;AACA;AACA,SAAK,EAAL;AAEA,YAAQ,GAAR,CAAY,YAAZ;AACD;AAPD,QAAA,SAAA,IAAA,SAAA","file":"typescript-classes.map","sourcesContent":["\nexport function decoratorFactory(opts: { selector: string }) {\n return function decorator(target) {\n return <any>target;\n };\n}\n\nexport default function def() {}\n","// This file essentially reproduces an example Angular component to map testing,\n// among other typescript edge cases.\n\nimport def, { decoratorFactory } from './src/mod.ts';\n\nimport * as ns from './src/mod.ts';\n\n@decoratorFactory({\n selector: 'app-root',\n})\nexport class AppComponent {\n title = 'app';\n}\n\nconst fn = arg => {\n console.log(\"here\");\n};\nfn(\"arg\");\n\n// Un-decorated exported classes present a mapping challege because\n// the class name is mapped to an unhelpful export assignment.\nexport class ExportedOther {\n title = 'app';\n}\n\nclass AnotherThing {\n prop = 4;\n}\n\nconst ExpressionClass = class Foo {\n prop = 4;\n};\n\nclass SubDecl extends AnotherThing {\n prop = 4;\n}\n\nlet SubVar = class SubExpr extends AnotherThing {\n prop = 4;\n};\n\nns;\n\nexport default function(){\n // This file is specifically for testing the mappings of classes and things\n // above, which means we don't want to include _other_ references to then.\n // To avoid having them be optimized out, we include a no-op eval.\n eval(\"\");\n\n console.log(\"pause here\");\n}\n"]} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/webpack-functions.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/webpack-functions.js
new file mode 100644
index 0000000000..3cb5f26cd5
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/webpack-functions.js
@@ -0,0 +1,126 @@
+// modules are defined as an array
+// [ module function, map of requires ]
+//
+// map of requires is short require name -> numeric require
+//
+// anything defined in a previous bundle is accessed via the
+// orig method which is the require for previous bundles
+
+// eslint-disable-next-line no-global-assign
+parcelRequire = (function (modules, cache, entry, globalName) {
+ // Save the require from previous bundle to this closure if any
+ var previousRequire = typeof parcelRequire === 'function' && parcelRequire;
+ var nodeRequire = typeof require === 'function' && require;
+
+ function newRequire(name, jumped) {
+ if (!cache[name]) {
+ if (!modules[name]) {
+ // if we cannot find the module within our internal map or
+ // cache jump to the current global require ie. the last bundle
+ // that was added to the page.
+ var currentRequire = typeof parcelRequire === 'function' && parcelRequire;
+ if (!jumped && currentRequire) {
+ return currentRequire(name, true);
+ }
+
+ // If there are other bundles on this page the require from the
+ // previous one is saved to 'previousRequire'. Repeat this as
+ // many times as there are bundles until the module is found or
+ // we exhaust the require chain.
+ if (previousRequire) {
+ return previousRequire(name, true);
+ }
+
+ // Try the node require function if it exists.
+ if (nodeRequire && typeof name === 'string') {
+ return nodeRequire(name);
+ }
+
+ var err = new Error('Cannot find module \'' + name + '\'');
+ err.code = 'MODULE_NOT_FOUND';
+ throw err;
+ }
+
+ localRequire.resolve = resolve;
+
+ var module = cache[name] = new newRequire.Module(name);
+
+ modules[name][0].call(module.exports, localRequire, module, module.exports, this);
+ }
+
+ return cache[name].exports;
+
+ function localRequire(x){
+ return newRequire(localRequire.resolve(x));
+ }
+
+ function resolve(x){
+ return modules[name][1][x] || x;
+ }
+ }
+
+ function Module(moduleName) {
+ this.id = moduleName;
+ this.bundle = newRequire;
+ this.exports = {};
+ }
+
+ newRequire.isParcelRequire = true;
+ newRequire.Module = Module;
+ newRequire.modules = modules;
+ newRequire.cache = cache;
+ newRequire.parent = previousRequire;
+ newRequire.register = function (id, exports) {
+ modules[id] = [function (require, module) {
+ module.exports = exports;
+ }, {}];
+ };
+
+ for (var i = 0; i < entry.length; i++) {
+ newRequire(entry[i]);
+ }
+
+ if (entry.length) {
+ // Expose entry point to Node, AMD or browser globals
+ // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js
+ var mainExports = newRequire(entry[entry.length - 1]);
+
+ // CommonJS
+ if (typeof exports === "object" && typeof module !== "undefined") {
+ module.exports = mainExports;
+
+ // RequireJS
+ } else if (typeof define === "function" && define.amd) {
+ define(function () {
+ return mainExports;
+ });
+
+ // <script>
+ } else if (globalName) {
+ this[globalName] = mainExports;
+ }
+ }
+
+ // Override the current require with this new one
+ return newRequire;
+})({"input.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = root;
+var _module = {};
+
+_module.exports = function (x) {
+ return x * 2;
+};
+
+function root() {
+ // This example is structures to look like CommonJS in order to replicate
+ // a previously-encountered bug.
+ _module.exports(4);
+}
+},{}]},{},["input.js"], "parcelWebpackFunctions")
+//# sourceMappingURL=webpack-functions.map
+;parcelWebpackFunctions = parcelWebpackFunctions.default; \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/webpack-functions.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/webpack-functions.map
new file mode 100644
index 0000000000..e381187e90
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/webpack-functions.map
@@ -0,0 +1 @@
+{"version":3,"sources":["parcel://./webpack-functions/input.js"],"names":["root","module","exports","x"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAOwBA;AAPxB,IAAIC,UAAS,EAAb;;AAEAA,QAAOC,OAAP,GAAiB,UAASC,CAAT,EAAY;AAC3B,SAAOA,IAAI,CAAX;AACD,CAFD;;AAKe,SAASH,IAAT,GAAgB;AAC7B;AACA;AACAC,UAAOC,OAAP,CAAe,CAAf;AACD","file":"webpack-functions.map","sourcesContent":["var module = {};\n\nmodule.exports = function(x) {\n return x * 2;\n};\n\n\nexport default function root() {\n // This example is structures to look like CommonJS in order to replicate\n // a previously-encountered bug.\n module.exports(4);\n}\n"]} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/webpack-line-mappings.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/webpack-line-mappings.js
new file mode 100644
index 0000000000..45db913a2a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/webpack-line-mappings.js
@@ -0,0 +1,147 @@
+// modules are defined as an array
+// [ module function, map of requires ]
+//
+// map of requires is short require name -> numeric require
+//
+// anything defined in a previous bundle is accessed via the
+// orig method which is the require for previous bundles
+
+// eslint-disable-next-line no-global-assign
+parcelRequire = (function (modules, cache, entry, globalName) {
+ // Save the require from previous bundle to this closure if any
+ var previousRequire = typeof parcelRequire === 'function' && parcelRequire;
+ var nodeRequire = typeof require === 'function' && require;
+
+ function newRequire(name, jumped) {
+ if (!cache[name]) {
+ if (!modules[name]) {
+ // if we cannot find the module within our internal map or
+ // cache jump to the current global require ie. the last bundle
+ // that was added to the page.
+ var currentRequire = typeof parcelRequire === 'function' && parcelRequire;
+ if (!jumped && currentRequire) {
+ return currentRequire(name, true);
+ }
+
+ // If there are other bundles on this page the require from the
+ // previous one is saved to 'previousRequire'. Repeat this as
+ // many times as there are bundles until the module is found or
+ // we exhaust the require chain.
+ if (previousRequire) {
+ return previousRequire(name, true);
+ }
+
+ // Try the node require function if it exists.
+ if (nodeRequire && typeof name === 'string') {
+ return nodeRequire(name);
+ }
+
+ var err = new Error('Cannot find module \'' + name + '\'');
+ err.code = 'MODULE_NOT_FOUND';
+ throw err;
+ }
+
+ localRequire.resolve = resolve;
+
+ var module = cache[name] = new newRequire.Module(name);
+
+ modules[name][0].call(module.exports, localRequire, module, module.exports, this);
+ }
+
+ return cache[name].exports;
+
+ function localRequire(x){
+ return newRequire(localRequire.resolve(x));
+ }
+
+ function resolve(x){
+ return modules[name][1][x] || x;
+ }
+ }
+
+ function Module(moduleName) {
+ this.id = moduleName;
+ this.bundle = newRequire;
+ this.exports = {};
+ }
+
+ newRequire.isParcelRequire = true;
+ newRequire.Module = Module;
+ newRequire.modules = modules;
+ newRequire.cache = cache;
+ newRequire.parent = previousRequire;
+ newRequire.register = function (id, exports) {
+ modules[id] = [function (require, module) {
+ module.exports = exports;
+ }, {}];
+ };
+
+ for (var i = 0; i < entry.length; i++) {
+ newRequire(entry[i]);
+ }
+
+ if (entry.length) {
+ // Expose entry point to Node, AMD or browser globals
+ // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js
+ var mainExports = newRequire(entry[entry.length - 1]);
+
+ // CommonJS
+ if (typeof exports === "object" && typeof module !== "undefined") {
+ module.exports = mainExports;
+
+ // RequireJS
+ } else if (typeof define === "function" && define.amd) {
+ define(function () {
+ return mainExports;
+ });
+
+ // <script>
+ } else if (globalName) {
+ this[globalName] = mainExports;
+ }
+ }
+
+ // Override the current require with this new one
+ return newRequire;
+})({"src/mod1.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = "a-default";
+},{}],"input.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = root;
+
+var _mod = require("./src/mod1");
+
+var _mod2 = _interopRequireDefault(_mod);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function root() {
+ let one = 1;
+
+ {
+ const two = 2;
+
+ var fn = function someName(arg) {
+ console.log(this, arguments);
+ console.log("pause here", _mod2.default, one, two, fn, arg);
+
+ var inner = arg => {
+ var body = "42";console.log("pause here", body, root);
+ };
+ inner();
+ };
+ fn.call("this-value", "arg-value");
+ }
+}
+},{"./src/mod1":"src/mod1.js"}]},{},["input.js"], "parcelWebpackLineMappings")
+//# sourceMappingURL=webpack-line-mappings.map
+;parcelWebpackLineMappings = parcelWebpackLineMappings.default; \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/webpack-line-mappings.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/webpack-line-mappings.map
new file mode 100644
index 0000000000..69f255ea9e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/parcel/webpack-line-mappings.map
@@ -0,0 +1 @@
+{"version":3,"sources":["parcel://./webpack-line-mappings/src/mod1.js","parcel://./webpack-line-mappings/input.js"],"names":["root","one","two","fn","someName","arg","console","log","arguments","aDefault","inner","body","call"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAAe;;;;;;;kBCESA;;AAFxB;;;;;;AAEe,SAASA,IAAT,GAAgB;AAC7B,MAAIC,MAAM,CAAV;;AAEA;AACE,UAAMC,MAAM,CAAZ;;AAEA,QAAIC,KAAK,SAASC,QAAT,CAAkBC,GAAlB,EAAuB;AAC9BC,cAAQC,GAAR,CAAY,IAAZ,EAAkBC,SAAlB;AACAF,cAAQC,GAAR,CAAY,YAAZ,EAA0BE,aAA1B,EAAoCR,GAApC,EAAyCC,GAAzC,EAA8CC,EAA9C,EAAkDE,GAAlD;;AAEA,UAAIK,QAASL,GAAD,IAAS;AAAE,YAAIM,OAAO,IAAX,CAAiBL,QAAQC,GAAR,CAAY,YAAZ,EAA0BI,IAA1B,EAAgCX,IAAhC;AAAwC,OAAhF;AACAU;AACD,KAND;AAOAP,OAAGS,IAAH,CAAQ,YAAR,EAAsB,WAAtB;AACD;AACF","file":"webpack-line-mappings.map","sourcesContent":["export default \"a-default\";\n","import aDefault from \"./src/mod1\";\n\nexport default function root() {\n let one = 1;\n\n {\n const two = 2;\n\n var fn = function someName(arg) {\n console.log(this, arguments);\n console.log(\"pause here\", aDefault, one, two, fn, arg);\n\n var inner = (arg) => { var body = \"42\"; console.log(\"pause here\", body, root); };\n inner();\n };\n fn.call(\"this-value\", \"arg-value\");\n }\n}\n"]} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/babel-bindings-with-flow.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/babel-bindings-with-flow.js
new file mode 100644
index 0000000000..cf266a0e3b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/babel-bindings-with-flow.js
@@ -0,0 +1,17 @@
+var rollupBabel6BabelBindingsWithFlow = (function () {
+ 'use strict';
+
+ var aNamed = "a-named";
+
+ // Webpack doesn't map import declarations well, so doing this forces binding
+
+ function root() {
+ var value = aNamed;
+
+ console.log("pause here", root, value);
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=babel-bindings-with-flow.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/babel-bindings-with-flow.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/babel-bindings-with-flow.js.map
new file mode 100644
index 0000000000..4bb4372f67
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/babel-bindings-with-flow.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"babel-bindings-with-flow.js","sources":["rollup-babel6://./babel-bindings-with-flow/src/mod.js","rollup-babel6://./babel-bindings-with-flow/input.js"],"sourcesContent":["export const aNamed = \"a-named\";\n","// Webpack doesn't map import declarations well, so doing this forces binding\n// processing to only process the binding being cast when searching for\n// matches. That way we can properly test if the flow cast causes problems.\nimport { aNamed } from \"./src/mod\";\n\nexport default function root() {\n var value = (aNamed: Array<string>);\n\n console.log(\"pause here\", root, value);\n}\n"],"names":["aNamed","root","value","console","log"],"mappings":";;;EAAO,IAAMA,SAAS,SAAf;;ECAP;AACA;AAIA,EAAe,SAASC,IAAT,GAAgB;EAC7B,MAAIC,QAASF,MAAb;;EAEAG,UAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B,EAAgCC,KAAhC;EACD;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/babel-classes.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/babel-classes.js
new file mode 100644
index 0000000000..c601cf6abf
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/babel-classes.js
@@ -0,0 +1,37 @@
+var rollupBabel6BabelClasses = (function () {
+ 'use strict';
+
+ var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+ function root() {
+ var Another = function () {
+ function Another() {
+ var _this = this;
+
+ _classCallCheck(this, Another);
+
+ this.bound = function () {
+ return _this;
+ };
+ }
+
+ _createClass(Another, [{
+ key: "method",
+ value: function method() {
+
+ console.log("pause here", Another, root);
+ }
+ }]);
+
+ return Another;
+ }();
+
+ new Another().method();
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=babel-classes.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/babel-classes.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/babel-classes.js.map
new file mode 100644
index 0000000000..e8d0601df1
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/babel-classes.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"babel-classes.js","sources":["rollup-babel6://./babel-classes/input.js"],"sourcesContent":["export default function root() {\n class Another {\n bound = () => {\n return this;\n }\n\n method() {\n let two = 2;\n\n console.log(\"pause here\", Another, root);\n }\n }\n\n new Another().method();\n}\n"],"names":["root","Another","bound","console","log","method"],"mappings":";;;;;;;AAAA,EAAe,SAASA,IAAT,GAAgB;EAAA,MACvBC,OADuB;EAAA;EAAA;;EAAA;;EAAA,WAE3BC,KAF2B,GAEnB,YAAM;EACZ,eAAO,KAAP;EACD,OAJ0B;EAAA;;EAAA;EAAA;EAAA,+BAMlB;AACP;EAEAC,gBAAQC,GAAR,CAAY,YAAZ,EAA0BH,OAA1B,EAAmCD,IAAnC;EACD;EAV0B;;EAAA;EAAA;;EAa7B,MAAIC,OAAJ,GAAcI,MAAd;EACD;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/babel-flowtype-bindings.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/babel-flowtype-bindings.js
new file mode 100644
index 0000000000..b1da45ae44
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/babel-flowtype-bindings.js
@@ -0,0 +1,15 @@
+var rollupBabel6BabelFlowtypeBindings = (function () {
+ 'use strict';
+
+ var Four = "one";
+
+ var aConst = "a-const";
+
+ function root() {
+ console.log("pause here", aConst, Four, root);
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=babel-flowtype-bindings.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/babel-flowtype-bindings.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/babel-flowtype-bindings.js.map
new file mode 100644
index 0000000000..af4a7ce951
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/babel-flowtype-bindings.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"babel-flowtype-bindings.js","sources":["rollup-babel6://./babel-flowtype-bindings/src/mod.js","rollup-babel6://./babel-flowtype-bindings/input.js"],"sourcesContent":["export default \"a-default\";\nexport const Four = \"one\";\n","import type { One, Two, Three } from \"./src/mod\";\nimport { Four, type Five, typeof Six } from \"./src/mod\";\n\ntype Other = {};\n\nconst aConst = \"a-const\";\n\nexport default function root() {\n console.log(\"pause here\", aConst, Four, root);\n}\n"],"names":["Four","aConst","root","console","log"],"mappings":";;;EACO,IAAMA,OAAO,KAAb;;ECIP,IAAMC,SAAS,SAAf;;AAEA,EAAe,SAASC,IAAT,GAAgB;EAC7BC,UAAQC,GAAR,CAAY,YAAZ,EAA0BH,MAA1B,EAAkCD,IAAlC,EAAwCE,IAAxC;EACD;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/classes.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/classes.js
new file mode 100644
index 0000000000..dbec2bd6ce
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/classes.js
@@ -0,0 +1,49 @@
+var rollupBabel6Classes = (function () {
+ 'use strict';
+
+ var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+ function root() {
+ var one = 1;
+
+ var Thing = function () {
+ function Thing() {
+ _classCallCheck(this, Thing);
+ }
+
+ _createClass(Thing, [{
+ key: "one",
+ value: function one() {
+ console.log("pause here");
+ }
+ }]);
+
+ return Thing;
+ }();
+
+ var Another = function () {
+ function Another() {
+ _classCallCheck(this, Another);
+ }
+
+ _createClass(Another, [{
+ key: "method",
+ value: function method() {
+
+ console.log("pause here", Another, one, Thing, root);
+ }
+ }]);
+
+ return Another;
+ }();
+
+ new Another().method();
+ new Thing().one();
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=classes.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/classes.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/classes.js.map
new file mode 100644
index 0000000000..bd90c8edf2
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/classes.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"classes.js","sources":["rollup-babel6://./classes/input.js"],"sourcesContent":["export default function root() {\n let one = 1;\n\n class Thing {\n one() {\n console.log(\"pause here\");\n }\n }\n\n class Another {\n method() {\n let two = 2;\n\n const three = 3;\n\n console.log(\"pause here\", Another, one, Thing, root);\n }\n }\n\n new Another().method();\n new Thing().one();\n}\n"],"names":["root","one","Thing","console","log","Another","method"],"mappings":";;;;;;;AAAA,EAAe,SAASA,IAAT,GAAgB;EAC7B,MAAIC,MAAM,CAAV;;EAD6B,MAGvBC,KAHuB;EAAA;EAAA;EAAA;;EAAA;EAAA;EAAA,4BAIrB;EACJC,gBAAQC,GAAR,CAAY,YAAZ;EACD;EAN0B;;EAAA;EAAA;;EAAA,MASvBC,OATuB;EAAA;EAAA;EAAA;;EAAA;EAAA;EAAA,+BAUlB;AACP;EAIAF,gBAAQC,GAAR,CAAY,YAAZ,EAA0BC,OAA1B,EAAmCJ,GAAnC,EAAwCC,KAAxC,EAA+CF,IAA/C;EACD;EAhB0B;;EAAA;EAAA;;EAmB7B,MAAIK,OAAJ,GAAcC,MAAd;EACA,MAAIJ,KAAJ,GAAYD,GAAZ;EACD;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/esmodules-es6.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/esmodules-es6.js
new file mode 100644
index 0000000000..5fd501a336
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/esmodules-es6.js
@@ -0,0 +1,57 @@
+var rollupBabel6EsmodulesEs6 = (function () {
+ 'use strict';
+
+ var aDefault = "a-default";
+
+ const aNamed = "a-named";
+
+ const original = "an-original";
+
+ var mod4 = "a-default";
+ const aNamed$1 = "a-named";
+
+ var aNamespace = /*#__PURE__*/Object.freeze({
+ default: mod4,
+ aNamed: aNamed$1
+ });
+
+ var aDefault2 = "a-default2";
+
+ const aNamed2 = "a-named2";
+
+ const original$1 = "an-original2";
+
+ var aDefault3 = "a-default3";
+
+ const aNamed3 = "a-named3";
+
+ const original$2 = "an-original3";
+
+ function root() {
+ console.log("pause here", root);
+
+ console.log(aDefault);
+ console.log(original);
+ console.log(aNamed);
+ console.log(aNamed);
+ console.log(aNamespace);
+
+ try {
+ // None of these are callable in this code, but we still want to make sure
+ // they map properly even if the only reference is in a call expressions.
+ console.log(aDefault2());
+ console.log(original$1());
+ console.log(aNamed2());
+ console.log(aNamed2());
+
+ console.log(new aDefault3());
+ console.log(new original$2());
+ console.log(new aNamed3());
+ console.log(new aNamed3());
+ } catch (e) {}
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=esmodules-es6.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/esmodules-es6.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/esmodules-es6.js.map
new file mode 100644
index 0000000000..3dbbc93f8d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/esmodules-es6.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"esmodules-es6.js","sources":["rollup-babel6://./esmodules-es6/src/mod1.js","rollup-babel6://./esmodules-es6/src/mod2.js","rollup-babel6://./esmodules-es6/src/mod3.js","rollup-babel6://./esmodules-es6/src/mod4.js","rollup-babel6://./esmodules-es6/src/mod5.js","rollup-babel6://./esmodules-es6/src/mod6.js","rollup-babel6://./esmodules-es6/src/mod7.js","rollup-babel6://./esmodules-es6/src/mod9.js","rollup-babel6://./esmodules-es6/src/mod10.js","rollup-babel6://./esmodules-es6/src/mod11.js","rollup-babel6://./esmodules-es6/input.js"],"sourcesContent":["export default \"a-default\";\n","export const aNamed = \"a-named\";\n","export const original = \"an-original\";\n","export default \"a-default\";\nexport const aNamed = \"a-named\";\n","export default \"a-default2\";\n","export const aNamed2 = \"a-named2\";\n","export const original = \"an-original2\";\n","export default \"a-default3\";\n","export const aNamed3 = \"a-named3\";\n","export const original = \"an-original3\";\n","import aDefault from \"./src/mod1\";\nimport { aNamed, aNamed as anotherNamed } from \"./src/mod2\";\nimport { original as anAliased } from \"./src/mod3\";\nimport * as aNamespace from \"./src/mod4\";\n\nimport aDefault2 from \"./src/mod5\";\nimport { aNamed2, aNamed2 as anotherNamed2 } from \"./src/mod6\";\nimport { original as anAliased2 } from \"./src/mod7\";\n\nimport aDefault3 from \"./src/mod9\";\nimport { aNamed3, aNamed3 as anotherNamed3 } from \"./src/mod10\";\nimport { original as anAliased3 } from \"./src/mod11\";\n\nimport optimizedOut from \"./src/optimized-out\";\noptimizedOut();\n\nexport default function root() {\n console.log(\"pause here\", root);\n\n console.log(aDefault);\n console.log(anAliased);\n console.log(aNamed);\n console.log(anotherNamed);\n console.log(aNamespace);\n\n try {\n // None of these are callable in this code, but we still want to make sure\n // they map properly even if the only reference is in a call expressions.\n console.log(aDefault2());\n console.log(anAliased2());\n console.log(aNamed2());\n console.log(anotherNamed2());\n\n console.log(new aDefault3());\n console.log(new anAliased3());\n console.log(new aNamed3());\n console.log(new anotherNamed3());\n } catch (e) {}\n}\n\nexport function example(){}\n"],"names":["aNamed","original","aNamed2","aNamed3","root","console","log","aDefault","anAliased","anotherNamed","aNamespace","aDefault2","anAliased2","anotherNamed2","aDefault3","anAliased3","anotherNamed3","e"],"mappings":";;;AAAA,iBAAe,WAAf;;ECAO,MAAMA,SAAS,SAAf;;ECAA,MAAMC,WAAW,aAAjB;;ACAP,aAAe,WAAf;AACA,EAAO,MAAMD,WAAS,SAAf;;;;;;;ACDP,kBAAe,YAAf;;ECAO,MAAME,UAAU,UAAhB;;ECAA,MAAMD,aAAW,cAAjB;;ACAP,kBAAe,YAAf;;ECAO,MAAME,UAAU,UAAhB;;ECAA,MAAMF,aAAW,cAAjB;;ECgBQ,SAASG,IAAT,GAAgB;EAC7BC,UAAQC,GAAR,CAAY,YAAZ,EAA0BF,IAA1B;;EAEAC,UAAQC,GAAR,CAAYC,QAAZ;EACAF,UAAQC,GAAR,CAAYE,QAAZ;EACAH,UAAQC,GAAR,CAAYN,MAAZ;EACAK,UAAQC,GAAR,CAAYG,MAAZ;EACAJ,UAAQC,GAAR,CAAYI,UAAZ;;EAEA,MAAI;EACF;EACA;EACAL,YAAQC,GAAR,CAAYK,WAAZ;EACAN,YAAQC,GAAR,CAAYM,YAAZ;EACAP,YAAQC,GAAR,CAAYJ,SAAZ;EACAG,YAAQC,GAAR,CAAYO,SAAZ;;EAEAR,YAAQC,GAAR,CAAY,IAAIQ,SAAJ,EAAZ;EACAT,YAAQC,GAAR,CAAY,IAAIS,UAAJ,EAAZ;EACAV,YAAQC,GAAR,CAAY,IAAIH,OAAJ,EAAZ;EACAE,YAAQC,GAAR,CAAY,IAAIU,OAAJ,EAAZ;EACD,GAZD,CAYE,OAAOC,CAAP,EAAU;EACb;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/esmodules.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/esmodules.js
new file mode 100644
index 0000000000..34319cd591
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/esmodules.js
@@ -0,0 +1,57 @@
+var rollupBabel6Esmodules = (function () {
+ 'use strict';
+
+ var aDefault = "a-default";
+
+ var aNamed = "a-named";
+
+ var original = "an-original";
+
+ var mod4 = "a-default";
+ var aNamed$1 = "a-named";
+
+ var aNamespace = /*#__PURE__*/Object.freeze({
+ default: mod4,
+ aNamed: aNamed$1
+ });
+
+ var aDefault2 = "a-default2";
+
+ var aNamed2 = "a-named2";
+
+ var original$1 = "an-original2";
+
+ var aDefault3 = "a-default3";
+
+ var aNamed3 = "a-named3";
+
+ var original$2 = "an-original3";
+
+ function root() {
+ console.log("pause here", root);
+
+ console.log(aDefault);
+ console.log(original);
+ console.log(aNamed);
+ console.log(aNamed);
+ console.log(aNamespace);
+
+ try {
+ // None of these are callable in this code, but we still want to make sure
+ // they map properly even if the only reference is in a call expressions.
+ console.log(aDefault2());
+ console.log(original$1());
+ console.log(aNamed2());
+ console.log(aNamed2());
+
+ console.log(new aDefault3());
+ console.log(new original$2());
+ console.log(new aNamed3());
+ console.log(new aNamed3());
+ } catch (e) {}
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=esmodules.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/esmodules.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/esmodules.js.map
new file mode 100644
index 0000000000..2140c2a0a8
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/esmodules.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"esmodules.js","sources":["rollup-babel6://./esmodules/src/mod1.js","rollup-babel6://./esmodules/src/mod2.js","rollup-babel6://./esmodules/src/mod3.js","rollup-babel6://./esmodules/src/mod4.js","rollup-babel6://./esmodules/src/mod5.js","rollup-babel6://./esmodules/src/mod6.js","rollup-babel6://./esmodules/src/mod7.js","rollup-babel6://./esmodules/src/mod9.js","rollup-babel6://./esmodules/src/mod10.js","rollup-babel6://./esmodules/src/mod11.js","rollup-babel6://./esmodules/input.js"],"sourcesContent":["export default \"a-default\";\n","export const aNamed = \"a-named\";\n","export const original = \"an-original\";\n","export default \"a-default\";\nexport const aNamed = \"a-named\";\n","export default \"a-default2\";\n","export const aNamed2 = \"a-named2\";\n","export const original = \"an-original2\";\n","export default \"a-default3\";\n","export const aNamed3 = \"a-named3\";\n","export const original = \"an-original3\";\n","import aDefault from \"./src/mod1\";\nimport { aNamed, aNamed as anotherNamed } from \"./src/mod2\";\nimport { original as anAliased } from \"./src/mod3\";\nimport * as aNamespace from \"./src/mod4\";\n\nimport aDefault2 from \"./src/mod5\";\nimport { aNamed2, aNamed2 as anotherNamed2 } from \"./src/mod6\";\nimport { original as anAliased2 } from \"./src/mod7\";\n\nimport aDefault3 from \"./src/mod9\";\nimport { aNamed3, aNamed3 as anotherNamed3 } from \"./src/mod10\";\nimport { original as anAliased3 } from \"./src/mod11\";\n\nimport optimizedOut from \"./src/optimized-out\";\noptimizedOut();\n\nexport default function root() {\n console.log(\"pause here\", root);\n\n console.log(aDefault);\n console.log(anAliased);\n console.log(aNamed);\n console.log(anotherNamed);\n console.log(aNamespace);\n\n try {\n // None of these are callable in this code, but we still want to make sure\n // they map properly even if the only reference is in a call expressions.\n console.log(aDefault2());\n console.log(anAliased2());\n console.log(aNamed2());\n console.log(anotherNamed2());\n\n console.log(new aDefault3());\n console.log(new anAliased3());\n console.log(new aNamed3());\n console.log(new anotherNamed3());\n } catch (e) {}\n}\n\nexport function example(){}\n"],"names":["aNamed","original","aNamed2","aNamed3","root","console","log","aDefault","anAliased","anotherNamed","aNamespace","aDefault2","anAliased2","anotherNamed2","aDefault3","anAliased3","anotherNamed3","e"],"mappings":";;;AAAA,iBAAe,WAAf;;ECAO,IAAMA,SAAS,SAAf;;ECAA,IAAMC,WAAW,aAAjB;;ACAP,aAAe,WAAf;AACA,EAAO,IAAMD,WAAS,SAAf;;;;;;;ACDP,kBAAe,YAAf;;ECAO,IAAME,UAAU,UAAhB;;ECAA,IAAMD,aAAW,cAAjB;;ACAP,kBAAe,YAAf;;ECAO,IAAME,UAAU,UAAhB;;ECAA,IAAMF,aAAW,cAAjB;;ECgBQ,SAASG,IAAT,GAAgB;EAC7BC,UAAQC,GAAR,CAAY,YAAZ,EAA0BF,IAA1B;;EAEAC,UAAQC,GAAR,CAAYC,QAAZ;EACAF,UAAQC,GAAR,CAAYE,QAAZ;EACAH,UAAQC,GAAR,CAAYN,MAAZ;EACAK,UAAQC,GAAR,CAAYG,MAAZ;EACAJ,UAAQC,GAAR,CAAYI,UAAZ;;EAEA,MAAI;EACF;EACA;EACAL,YAAQC,GAAR,CAAYK,WAAZ;EACAN,YAAQC,GAAR,CAAYM,YAAZ;EACAP,YAAQC,GAAR,CAAYJ,SAAZ;EACAG,YAAQC,GAAR,CAAYO,SAAZ;;EAEAR,YAAQC,GAAR,CAAY,IAAIQ,SAAJ,EAAZ;EACAT,YAAQC,GAAR,CAAY,IAAIS,UAAJ,EAAZ;EACAV,YAAQC,GAAR,CAAY,IAAIH,OAAJ,EAAZ;EACAE,YAAQC,GAAR,CAAY,IAAIU,OAAJ,EAAZ;EACD,GAZD,CAYE,OAAOC,CAAP,EAAU;EACb;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/eval-maps.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/eval-maps.js
new file mode 100644
index 0000000000..8400b3f5dc
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/eval-maps.js
@@ -0,0 +1,18 @@
+var rollupBabel6EvalMaps = (function () {
+ 'use strict';
+
+ function root() {
+ var one = 1;
+
+ {
+ var _two = 4;
+ var _three = 5;
+
+ console.log("pause here", one, _two, _three);
+ }
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=eval-maps.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/eval-maps.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/eval-maps.js.map
new file mode 100644
index 0000000000..c3bab526fd
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/eval-maps.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"eval-maps.js","sources":["rollup-babel6://./eval-maps/input.js"],"sourcesContent":["\nexport default function root() {\n var one = 1;\n let two = 2;\n const three = 3;\n\n one;\n two;\n\n {\n let two = 4;\n const three = 5;\n\n console.log(\"pause here\", one, two, three);\n }\n}\n"],"names":["root","one","two","three","console","log"],"mappings":";;;EACe,SAASA,IAAT,GAAgB;EAC7B,MAAIC,MAAM,CAAV;AACA;EAMA;EACE,QAAIC,OAAM,CAAV;EACA,QAAMC,SAAQ,CAAd;;EAEAC,YAAQC,GAAR,CAAY,YAAZ,EAA0BJ,GAA1B,EAA+BC,IAA/B,EAAoCC,MAApC;EACD;EACF;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/for-loops.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/for-loops.js
new file mode 100644
index 0000000000..543090c257
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/for-loops.js
@@ -0,0 +1,23 @@
+var rollupBabel6ForLoops = (function () {
+ 'use strict';
+
+ function root() {
+
+ for (var _i = 1; _i < 2; _i++) {
+ console.log("pause here", root);
+ }
+
+ for (var _i2 in { 2: "" }) {
+ console.log("pause here", root);
+ }
+
+ var _arr = [3];
+ for (var _i4 = 0; _i4 < _arr.length; _i4++) {
+ console.log("pause here", root);
+ }
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=for-loops.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/for-loops.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/for-loops.js.map
new file mode 100644
index 0000000000..473cebbe5f
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/for-loops.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"for-loops.js","sources":["rollup-babel6://./for-loops/input.js"],"sourcesContent":["export default function root() {\n let i = 0;\n\n for (let i = 1; i < 2; i++) {\n console.log(\"pause here\", root);\n }\n\n for (let i in { 2: \"\" }) {\n console.log(\"pause here\", root);\n }\n\n for (let i of [3]) {\n console.log(\"pause here\", root);\n }\n}\n"],"names":["root","i","console","log"],"mappings":";;;EAAe,SAASA,IAAT,GAAgB;AAC7B;EAEA,OAAK,IAAIC,KAAI,CAAb,EAAgBA,KAAI,CAApB,EAAuBA,IAAvB,EAA4B;EAC1BC,YAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B;EACD;;EAED,OAAK,IAAIC,GAAT,IAAc,EAAE,GAAG,EAAL,EAAd,EAAyB;EACvBC,YAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B;EACD;;EAT4B,aAWf,CAAC,CAAD,CAXe;EAW7B,8CAAmB;AAAd,EACHE,YAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B;EACD;EACF;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/for-of.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/for-of.js
new file mode 100644
index 0000000000..2cbb6b209d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/for-of.js
@@ -0,0 +1,21 @@
+var rollupBabel6ForOf = (function () {
+ 'use strict';
+
+ function forOf() {
+ var _arr = [1];
+
+ for (var _i = 0; _i < _arr.length; _i++) {
+ var x = _arr[_i];
+ doThing(x);
+ }
+
+ function doThing(arg) {
+ // Avoid optimize out
+ window.console;
+ }
+ }
+
+ return forOf;
+
+}());
+//# sourceMappingURL=for-of.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/for-of.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/for-of.js.map
new file mode 100644
index 0000000000..8e9ba8465e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/for-of.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"for-of.js","sources":["rollup-babel6://./for-of/input.js"],"sourcesContent":["const mod = \"module scoped\";\n\nexport default function forOf() {\n for (const x of [1]) {\n doThing(x);\n }\n\n function doThing(arg) {\n // Avoid optimize out\n window.console;\n }\n}\n"],"names":["forOf","x","doThing","arg","window","console"],"mappings":";;;EAEe,SAASA,KAAT,GAAiB;EAAA,aACd,CAAC,CAAD,CADc;;EAC9B,2CAAqB;EAAhB,QAAMC,YAAN;EACHC,YAAQD,CAAR;EACD;;EAED,WAASC,OAAT,CAAiBC,GAAjB,EAAsB;EACpB;EACAC,WAAOC,OAAP;EACD;EACF;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/functions.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/functions.js
new file mode 100644
index 0000000000..c29598adf9
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/functions.js
@@ -0,0 +1,22 @@
+var rollupBabel6Functions = (function () {
+ 'use strict';
+
+ function root() {
+
+ function decl(p1) {
+ var inner = function inner(p2) {
+ var arrow = function arrow(p3) {
+ console.log("pause here", p3, arrow, p2, inner, p1, decl, root);
+ };
+ arrow();
+ };
+ inner();
+ }
+
+ decl();
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=functions.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/functions.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/functions.js.map
new file mode 100644
index 0000000000..7b1185ae0c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/functions.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"functions.js","sources":["rollup-babel6://./functions/input.js"],"sourcesContent":["export default function root() {\n\n function decl(p1) {\n const inner = function inner(p2) {\n const arrow = (p3) => {\n console.log(\"pause here\", p3, arrow, p2, inner, p1, decl, root);\n };\n arrow();\n };\n inner();\n }\n\n decl();\n}\n"],"names":["root","decl","p1","inner","p2","arrow","p3","console","log"],"mappings":";;;EAAe,SAASA,IAAT,GAAgB;;EAE7B,WAASC,IAAT,CAAcC,EAAd,EAAkB;EAChB,QAAMC,QAAQ,SAASA,KAAT,CAAeC,EAAf,EAAmB;EAC/B,UAAMC,QAAQ,SAARA,KAAQ,CAACC,EAAD,EAAQ;EACpBC,gBAAQC,GAAR,CAAY,YAAZ,EAA0BF,EAA1B,EAA8BD,KAA9B,EAAqCD,EAArC,EAAyCD,KAAzC,EAAgDD,EAAhD,EAAoDD,IAApD,EAA0DD,IAA1D;EACD,OAFD;EAGAK;EACD,KALD;EAMAF;EACD;;EAEDF;EACD;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/lex-and-nonlex.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/lex-and-nonlex.js
new file mode 100644
index 0000000000..d57db06c50
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/lex-and-nonlex.js
@@ -0,0 +1,21 @@
+var rollupBabel6LexAndNonlex = (function () {
+ 'use strict';
+
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+ function root() {
+ function someHelper() {
+ console.log("pause here", root, Thing);
+ }
+
+ var Thing = function Thing() {
+ _classCallCheck(this, Thing);
+ };
+
+ someHelper();
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=lex-and-nonlex.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/lex-and-nonlex.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/lex-and-nonlex.js.map
new file mode 100644
index 0000000000..e196a1827a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/lex-and-nonlex.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lex-and-nonlex.js","sources":["rollup-babel6://./lex-and-nonlex/input.js"],"sourcesContent":["export default function root() {\n function someHelper(){\n console.log(\"pause here\", root, Thing);\n }\n\n class Thing {}\n\n someHelper();\n}\n"],"names":["root","someHelper","console","log","Thing"],"mappings":";;;;;AAAA,EAAe,SAASA,IAAT,GAAgB;EAC7B,WAASC,UAAT,GAAqB;EACnBC,YAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B,EAAgCI,KAAhC;EACD;;EAH4B,MAKvBA,KALuB;EAAA;EAAA;;EAO7BH;EACD;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/line-start-bindings-es6.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/line-start-bindings-es6.js
new file mode 100644
index 0000000000..da2010f0c8
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/line-start-bindings-es6.js
@@ -0,0 +1,20 @@
+var rollupBabel6LineStartBindingsEs6 = (function () {
+ 'use strict';
+
+ function root() {
+ function aFunc() {
+
+ // The 'this' binding here is also its own line, so the comment above
+ // applies here too.
+ this.thing = 4;
+
+ console.log("pause here", root);
+ }
+
+ aFunc.call({});
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=line-start-bindings-es6.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/line-start-bindings-es6.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/line-start-bindings-es6.js.map
new file mode 100644
index 0000000000..394631ed3a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/line-start-bindings-es6.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"line-start-bindings-es6.js","sources":["rollup-babel6://./line-start-bindings-es6/input.js"],"sourcesContent":["\nexport default function root() {\n function aFunc(){\n // Since these bindings are on their own linem, the mappings will\n // extend to the start of the line, rather than starting at the first\n // character of the binding.\n const {\n one,\n two\n } = {\n one: 1,\n two: 2,\n };\n\n // The 'this' binding here is also its own line, so the comment above\n // applies here too.\n this.thing = 4;\n\n console.log(\"pause here\", root);\n }\n\n aFunc.call({ });\n}\n"],"names":["root","aFunc","thing","console","log","call"],"mappings":";;;EACe,SAASA,IAAT,GAAgB;EAC7B,WAASC,KAAT,GAAgB;AACd;EAWA;EACA;EACA,SAAKC,KAAL,GAAa,CAAb;;EAEAC,YAAQC,GAAR,CAAY,YAAZ,EAA0BJ,IAA1B;EACD;;EAEDC,QAAMI,IAAN,CAAW,EAAX;EACD;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/shadowed-vars.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/shadowed-vars.js
new file mode 100644
index 0000000000..773df0dea2
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/shadowed-vars.js
@@ -0,0 +1,17 @@
+var rollupBabel6ShadowedVars = (function () {
+ 'use strict';
+
+ function test () {
+
+ {
+ {
+
+ console.log("pause here");
+ }
+ }
+ }
+
+ return test;
+
+}());
+//# sourceMappingURL=shadowed-vars.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/shadowed-vars.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/shadowed-vars.js.map
new file mode 100644
index 0000000000..64eeedab86
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/shadowed-vars.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"shadowed-vars.js","sources":["rollup-babel6://./shadowed-vars/input.js"],"sourcesContent":["export default function() {\n var aVar = \"var1\";\n let aLet = \"let1\";\n const aConst = \"const1\";\n\n class Outer {}\n {\n function Outer() {}\n\n var aVar = \"var2\";\n let aLet = \"let2\";\n const aConst = \"const2\";\n {\n var aVar = \"var3\";\n let aLet = \"let3\";\n const aConst = \"const3\";\n\n console.log(\"pause here\");\n }\n }\n}\n"],"names":["console","log"],"mappings":";;;EAAe,iBAAW;AACxB;EAKA;AAAA,EAME;AACE;EAIAA,cAAQC,GAAR,CAAY,YAAZ;EACD;EACF;EACF;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-for-of-array-closure.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-for-of-array-closure.js
new file mode 100644
index 0000000000..810873cebc
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-for-of-array-closure.js
@@ -0,0 +1,26 @@
+var rollupBabel6StepOverForOfArrayClosure = (function () {
+ 'use strict';
+
+ // Babel will optimize this for..of because it call tell the value is an array.
+ function root() {
+ console.log("pause here");
+
+ var _loop = function _loop(val) {
+ console.log("pause again", function () {
+ return val;
+ }());
+ };
+
+ var _arr = [1, 2];
+ for (var _i = 0; _i < _arr.length; _i++) {
+ var val = _arr[_i];
+ _loop(val);
+ }
+
+ console.log("done");
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=step-over-for-of-array-closure.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-for-of-array-closure.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-for-of-array-closure.js.map
new file mode 100644
index 0000000000..ea8f5686aa
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-for-of-array-closure.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"step-over-for-of-array-closure.js","sources":["rollup-babel6://./step-over-for-of-array-closure/input.js"],"sourcesContent":["// Babel will optimize this for..of because it call tell the value is an array.\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of [1, 2]) {\n console.log(\"pause again\", (() => val)());\n }\n\n console.log(\"done\");\n}\n"],"names":["root","console","log","val"],"mappings":";;;EAAA;AACA,EAAe,SAASA,IAAT,GAAgB;EAC7BC,UAAQC,GAAR,CAAY,YAAZ;;EAD6B,6BAGlBC,GAHkB;EAI3BF,YAAQC,GAAR,CAAY,aAAZ,EAA4B;EAAA,aAAMC,GAAN;EAAA,KAAD,EAA3B;EAJ2B;;EAAA,aAGX,CAAC,CAAD,EAAI,CAAJ,CAHW;EAG7B,2CAA0B;EAArB,QAAMA,cAAN;EAAqB,UAAfA,GAAe;EAEzB;;EAEDF,UAAQC,GAAR,CAAY,MAAZ;EACD;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-for-of-array.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-for-of-array.js
new file mode 100644
index 0000000000..7e830010ff
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-for-of-array.js
@@ -0,0 +1,20 @@
+var rollupBabel6StepOverForOfArray = (function () {
+ 'use strict';
+
+ // Babel will optimize this for..of because it call tell the value is an array.
+ function root() {
+ console.log("pause here");
+
+ var _arr = [1, 2];
+ for (var _i = 0; _i < _arr.length; _i++) {
+ var val = _arr[_i];
+ console.log("pause again", val);
+ }
+
+ console.log("done");
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=step-over-for-of-array.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-for-of-array.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-for-of-array.js.map
new file mode 100644
index 0000000000..142791409d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-for-of-array.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"step-over-for-of-array.js","sources":["rollup-babel6://./step-over-for-of-array/input.js"],"sourcesContent":["// Babel will optimize this for..of because it call tell the value is an array.\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of [1, 2]) {\n console.log(\"pause again\", val);\n }\n\n console.log(\"done\");\n}\n"],"names":["root","console","log","val"],"mappings":";;;EAAA;AACA,EAAe,SAASA,IAAT,GAAgB;EAC7BC,UAAQC,GAAR,CAAY,YAAZ;;EAD6B,aAGX,CAAC,CAAD,EAAI,CAAJ,CAHW;EAG7B,2CAA0B;EAArB,QAAMC,cAAN;EACHF,YAAQC,GAAR,CAAY,aAAZ,EAA2BC,GAA3B;EACD;;EAEDF,UAAQC,GAAR,CAAY,MAAZ;EACD;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-for-of-closure.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-for-of-closure.js
new file mode 100644
index 0000000000..f6d2e8c4f3
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-for-of-closure.js
@@ -0,0 +1,48 @@
+var rollupBabel6StepOverForOfClosure = (function () {
+ 'use strict';
+
+ // Babel will convert the loop body to a function to handle the 'val' lexical
+ // enclosure behavior.
+ var vals = [1, 2];
+
+ function root() {
+ console.log("pause here");
+
+ var _loop = function _loop(val) {
+ console.log("pause again", function () {
+ return val;
+ }());
+ };
+
+ var _iteratorNormalCompletion = true;
+ var _didIteratorError = false;
+ var _iteratorError = undefined;
+
+ try {
+ for (var _iterator = vals[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
+ var val = _step.value;
+
+ _loop(val);
+ }
+ } catch (err) {
+ _didIteratorError = true;
+ _iteratorError = err;
+ } finally {
+ try {
+ if (!_iteratorNormalCompletion && _iterator.return) {
+ _iterator.return();
+ }
+ } finally {
+ if (_didIteratorError) {
+ throw _iteratorError;
+ }
+ }
+ }
+
+ console.log("done");
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=step-over-for-of-closure.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-for-of-closure.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-for-of-closure.js.map
new file mode 100644
index 0000000000..dfbdaaf9a6
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-for-of-closure.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"step-over-for-of-closure.js","sources":["rollup-babel6://./step-over-for-of-closure/input.js"],"sourcesContent":["// Babel will convert the loop body to a function to handle the 'val' lexical\n// enclosure behavior.\nconst vals = [1, 2];\n\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of vals) {\n console.log(\"pause again\", (() => val)());\n }\n\n console.log(\"done\");\n}\n"],"names":["vals","root","console","log","val"],"mappings":";;;EAAA;EACA;EACA,IAAMA,OAAO,CAAC,CAAD,EAAI,CAAJ,CAAb;;AAEA,EAAe,SAASC,IAAT,GAAgB;EAC7BC,UAAQC,GAAR,CAAY,YAAZ;;EAD6B,6BAGlBC,GAHkB;EAI3BF,YAAQC,GAAR,CAAY,aAAZ,EAA4B;EAAA,aAAMC,GAAN;EAAA,KAAD,EAA3B;EAJ2B;;EAAA;EAAA;EAAA;;EAAA;EAG7B,yBAAkBJ,IAAlB,8HAAwB;EAAA,UAAbI,GAAa;;EAAA,YAAbA,GAAa;EAEvB;EAL4B;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;;EAO7BF,UAAQC,GAAR,CAAY,MAAZ;EACD;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-for-of.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-for-of.js
new file mode 100644
index 0000000000..48f2b07053
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-for-of.js
@@ -0,0 +1,40 @@
+var rollupBabel6StepOverForOf = (function () {
+ 'use strict';
+
+ var vals = [1, 2];
+
+ function root() {
+ console.log("pause here");
+
+ var _iteratorNormalCompletion = true;
+ var _didIteratorError = false;
+ var _iteratorError = undefined;
+
+ try {
+ for (var _iterator = vals[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
+ var val = _step.value;
+
+ console.log("pause again", val);
+ }
+ } catch (err) {
+ _didIteratorError = true;
+ _iteratorError = err;
+ } finally {
+ try {
+ if (!_iteratorNormalCompletion && _iterator.return) {
+ _iterator.return();
+ }
+ } finally {
+ if (_didIteratorError) {
+ throw _iteratorError;
+ }
+ }
+ }
+
+ console.log("done");
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=step-over-for-of.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-for-of.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-for-of.js.map
new file mode 100644
index 0000000000..006fd7a2d7
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-for-of.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"step-over-for-of.js","sources":["rollup-babel6://./step-over-for-of/input.js"],"sourcesContent":["const vals = [1, 2];\n\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of vals) {\n console.log(\"pause again\", val);\n }\n\n console.log(\"done\");\n}\n"],"names":["vals","root","console","log","val"],"mappings":";;;EAAA,IAAMA,OAAO,CAAC,CAAD,EAAI,CAAJ,CAAb;;AAEA,EAAe,SAASC,IAAT,GAAgB;EAC7BC,UAAQC,GAAR,CAAY,YAAZ;;EAD6B;EAAA;EAAA;;EAAA;EAG7B,yBAAkBH,IAAlB,8HAAwB;EAAA,UAAbI,GAAa;;EACtBF,cAAQC,GAAR,CAAY,aAAZ,EAA2BC,GAA3B;EACD;EAL4B;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;;EAO7BF,UAAQC,GAAR,CAAY,MAAZ;EACD;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-function-params.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-function-params.js
new file mode 100644
index 0000000000..d5cfd78675
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-function-params.js
@@ -0,0 +1,25 @@
+var rollupBabel6StepOverFunctionParams = (function () {
+ 'use strict';
+
+ function test(a1) {
+
+ var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
+ a3 = _ref.a3,
+ a4 = _ref.a4,
+ _ref$a = _ref.a5;
+
+ _ref$a = _ref$a === undefined ? {} : _ref$a;
+ var a7 = _ref$a.a6;
+
+ console.log("pause next here");
+ }
+
+ function fn() {
+ console.log("pause here");
+ test("1", undefined, { a3: "3", a4: "4", a5: { a6: "7" } });
+ }
+
+ return fn;
+
+}());
+//# sourceMappingURL=step-over-function-params.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-function-params.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-function-params.js.map
new file mode 100644
index 0000000000..9d295c9c03
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-function-params.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"step-over-function-params.js","sources":["rollup-babel6://./step-over-function-params/input.js"],"sourcesContent":["function test(a1, a2 = 45, { a3, a4, a5: { a6: a7 } = {} } = {}) {\n console.log(\"pause next here\");\n}\n\nexport default function fn() {\n console.log(\"pause here\");\n test(\"1\", undefined, { a3: \"3\", a4: \"4\", a5: { a6: \"7\" } });\n}\n"],"names":["test","a1","a3","a4","a5","a7","a6","console","log","fn","undefined"],"mappings":";;;EAAA,SAASA,IAAT,CAAcC,EAAd,EAAiE;AAAA;EAAA,iFAAJ,EAAI;EAAA,MAApCC,EAAoC,QAApCA,EAAoC;EAAA,MAAhCC,EAAgC,QAAhCA,EAAgC;EAAA,oBAA5BC,EAA4B;;EAAA,kCAAX,EAAW;EAAA,MAAlBC,EAAkB,UAAtBC,EAAsB;;EAC/DC,UAAQC,GAAR,CAAY,iBAAZ;EACD;;AAED,EAAe,SAASC,EAAT,GAAc;EAC3BF,UAAQC,GAAR,CAAY,YAAZ;EACAR,OAAK,GAAL,EAAUU,SAAV,EAAqB,EAAER,IAAI,GAAN,EAAWC,IAAI,GAAf,EAAoBC,IAAI,EAAEE,IAAI,GAAN,EAAxB,EAArB;EACD;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-regenerator-await.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-regenerator-await.js
new file mode 100644
index 0000000000..42d395dca3
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-regenerator-await.js
@@ -0,0 +1,47 @@
+var rollupBabel6StepOverRegeneratorAwait = (function () {
+ 'use strict';
+
+ function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
+
+ var fn = function () {
+ var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
+ return regeneratorRuntime.wrap(function _callee$(_context) {
+ while (1) {
+ switch (_context.prev = _context.next) {
+ case 0:
+ console.log("pause here");
+
+ _context.next = 3;
+ return doAsync();
+
+ case 3:
+
+ console.log("stopped here");
+
+ case 4:
+ case "end":
+ return _context.stop();
+ }
+ }
+ }, _callee, this);
+ }));
+
+ function fn() {
+ return _ref.apply(this, arguments);
+ }
+
+ return fn;
+ }();
+
+ function doAsync() {
+ return Promise.resolve();
+ }
+
+ function root() {
+ fn();
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=step-over-regenerator-await.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-regenerator-await.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-regenerator-await.js.map
new file mode 100644
index 0000000000..8c4733f075
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/step-over-regenerator-await.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"step-over-regenerator-await.js","sources":["rollup-babel6://./step-over-regenerator-await/input.js"],"sourcesContent":["var fn = async function fn() {\n console.log(\"pause here\");\n\n await doAsync();\n\n console.log(\"stopped here\");\n};\n\nfunction doAsync() {\n return Promise.resolve();\n}\n\nexport default function root() {\n fn();\n}\n"],"names":["fn","console","log","doAsync","Promise","resolve","root"],"mappings":";;;;;EAAA,IAAIA;EAAA,qEAAK;EAAA;EAAA;EAAA;EAAA;EACPC,oBAAQC,GAAR,CAAY,YAAZ;;EADO;EAAA,mBAGDC,SAHC;;EAAA;;EAKPF,oBAAQC,GAAR,CAAY,cAAZ;;EALO;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA,GAAL;;EAAA,WAAoBF,EAApB;EAAA;EAAA;;EAAA,SAAoBA,EAApB;EAAA,GAAJ;;EAQA,SAASG,OAAT,GAAmB;EACjB,SAAOC,QAAQC,OAAR,EAAP;EACD;;AAED,EAAe,SAASC,IAAT,GAAgB;EAC7BN;EACD;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/switches.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/switches.js
new file mode 100644
index 0000000000..092c9a90c0
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/switches.js
@@ -0,0 +1,19 @@
+var rollupBabel6Switches = (function () {
+ 'use strict';
+
+ function root() {
+
+ switch (true) {
+ case true:
+ console.log("pause here", root);
+ default:
+ {
+ console.log("pause here", root);
+ }
+ }
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=switches.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/switches.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/switches.js.map
new file mode 100644
index 0000000000..7f4da94fae
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/switches.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"switches.js","sources":["rollup-babel6://./switches/input.js"],"sourcesContent":["export default function root() {\n let val = 1;\n\n switch (true) {\n case true:\n let val = 2;\n console.log(\"pause here\", root);\n default: {\n let val = 3;\n console.log(\"pause here\", root);\n }\n }\n}\n"],"names":["root","console","log"],"mappings":";;;EAAe,SAASA,IAAT,GAAgB;AAC7B;EAEA,UAAQ,IAAR;EACE,SAAK,IAAL;AACE,EACAC,cAAQC,GAAR,CAAY,YAAZ,EAA0BF,IAA1B;EACF;EAAS;AACP,EACAC,gBAAQC,GAAR,CAAY,YAAZ,EAA0BF,IAA1B;EACD;EAPH;EASD;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/this-arguments-bindings.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/this-arguments-bindings.js
new file mode 100644
index 0000000000..22530cd47d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/this-arguments-bindings.js
@@ -0,0 +1,25 @@
+var rollupBabel6ThisArgumentsBindings = (function () {
+ 'use strict';
+
+ function root() {
+ function fn(arg) {
+ var _this = this,
+ _arguments = arguments;
+
+ console.log(this, arguments);
+ console.log("pause here", fn, root);
+
+ var arrow = function arrow(argArrow) {
+ console.log(_this, _arguments);
+ console.log("pause here", fn, root);
+ };
+ arrow("arrow-arg");
+ }
+
+ fn.call("this-value", "arg-value");
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=this-arguments-bindings.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/this-arguments-bindings.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/this-arguments-bindings.js.map
new file mode 100644
index 0000000000..2fded48fe0
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/this-arguments-bindings.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"this-arguments-bindings.js","sources":["rollup-babel6://./this-arguments-bindings/input.js"],"sourcesContent":["export default function root() {\n function fn(arg) {\n console.log(this, arguments);\n console.log(\"pause here\", fn, root);\n\n const arrow = argArrow => {\n console.log(this, arguments);\n console.log(\"pause here\", fn, root);\n };\n arrow(\"arrow-arg\");\n }\n\n fn.call(\"this-value\", \"arg-value\");\n}\n"],"names":["root","fn","arg","console","log","arguments","arrow","call"],"mappings":";;;EAAe,SAASA,IAAT,GAAgB;EAC7B,WAASC,EAAT,CAAYC,GAAZ,EAAiB;EAAA;EAAA;;EACfC,YAAQC,GAAR,CAAY,IAAZ,EAAkBC,SAAlB;EACAF,YAAQC,GAAR,CAAY,YAAZ,EAA0BH,EAA1B,EAA8BD,IAA9B;;EAEA,QAAMM,QAAQ,SAARA,KAAQ,WAAY;EACxBH,cAAQC,GAAR,CAAY,KAAZ,EAAkBC,UAAlB;EACAF,cAAQC,GAAR,CAAY,YAAZ,EAA0BH,EAA1B,EAA8BD,IAA9B;EACD,KAHD;EAIAM,UAAM,WAAN;EACD;;EAEDL,KAAGM,IAAH,CAAQ,YAAR,EAAsB,WAAtB;EACD;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/try-catches.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/try-catches.js
new file mode 100644
index 0000000000..94afe2079c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/try-catches.js
@@ -0,0 +1,16 @@
+var rollupBabel6TryCatches = (function () {
+ 'use strict';
+
+ function root() {
+
+ try {
+ throw "AnError";
+ } catch (err) {
+ console.log("pause here", root);
+ }
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=try-catches.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/try-catches.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/try-catches.js.map
new file mode 100644
index 0000000000..8d2514acf9
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/try-catches.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"try-catches.js","sources":["rollup-babel6://./try-catches/input.js"],"sourcesContent":["export default function root() {\n const one = 1;\n\n try {\n throw \"AnError\";\n } catch (err) {\n let two = 2;\n console.log(\"pause here\", root);\n }\n}\n"],"names":["root","err","console","log"],"mappings":";;;EAAe,SAASA,IAAT,GAAgB;AAC7B;EAEA,MAAI;EACF,UAAM,SAAN;EACD,GAFD,CAEE,OAAOC,GAAP,EAAY;AACZ,EACAC,YAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B;EACD;EACF;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/type-module.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/type-module.js
new file mode 100644
index 0000000000..28f1cbb315
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/type-module.js
@@ -0,0 +1,16 @@
+var rollupBabel6TypeModule = (function () {
+ 'use strict';
+
+ var moduleScoped = 1;
+ var alsoModuleScoped = 2;
+
+ function thirdModuleScoped() {}
+
+ function test () {
+ console.log("pause here", moduleScoped, alsoModuleScoped, thirdModuleScoped);
+ }
+
+ return test;
+
+}());
+//# sourceMappingURL=type-module.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/type-module.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/type-module.js.map
new file mode 100644
index 0000000000..8f71025582
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/type-module.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"type-module.js","sources":["rollup-babel6://./type-module/input.js"],"sourcesContent":["var moduleScoped = 1;\nlet alsoModuleScoped = 2;\n\nfunction thirdModuleScoped() {}\n\nexport default function() {\n console.log(\"pause here\", moduleScoped, alsoModuleScoped, thirdModuleScoped);\n}\n"],"names":["moduleScoped","alsoModuleScoped","thirdModuleScoped","console","log"],"mappings":";;;EAAA,IAAIA,eAAe,CAAnB;EACA,IAAIC,mBAAmB,CAAvB;;EAEA,SAASC,iBAAT,GAA6B;;AAE7B,EAAe,iBAAW;EACxBC,UAAQC,GAAR,CAAY,YAAZ,EAA0BJ,YAA1B,EAAwCC,gBAAxC,EAA0DC,iBAA1D;EACD;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/webpack-functions.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/webpack-functions.js
new file mode 100644
index 0000000000..e385eba841
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/webpack-functions.js
@@ -0,0 +1,19 @@
+var rollupBabel6WebpackFunctions = (function () {
+ 'use strict';
+
+ var module$1 = {};
+
+ module$1.exports = function (x) {
+ return x * 2;
+ };
+
+ function root() {
+ // This example is structures to look like CommonJS in order to replicate
+ // a previously-encountered bug.
+ module$1.exports(4);
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=webpack-functions.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/webpack-functions.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/webpack-functions.js.map
new file mode 100644
index 0000000000..d329c55696
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/webpack-functions.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"webpack-functions.js","sources":["rollup-babel6://./webpack-functions/input.js"],"sourcesContent":["var module = {};\n\nmodule.exports = function(x) {\n return x * 2;\n};\n\n\nexport default function root() {\n // This example is structures to look like CommonJS in order to replicate\n // a previously-encountered bug.\n module.exports(4);\n}\n"],"names":["module","exports","x","root"],"mappings":";;;EAAA,IAAIA,WAAS,EAAb;;AAEAA,WAAOC,OAAP,GAAiB,UAASC,CAAT,EAAY;EAC3B,SAAOA,IAAI,CAAX;EACD,CAFD;;AAKA,EAAe,SAASC,IAAT,GAAgB;EAC7B;EACA;EACAH,WAAOC,OAAP,CAAe,CAAf;EACD;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/webpack-line-mappings.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/webpack-line-mappings.js
new file mode 100644
index 0000000000..62f53668ee
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/webpack-line-mappings.js
@@ -0,0 +1,28 @@
+var rollupBabel6WebpackLineMappings = (function () {
+ 'use strict';
+
+ var aDefault = "a-default";
+
+ function root() {
+ var one = 1;
+
+ {
+ var two = 2;
+
+ var fn = function someName(arg) {
+ console.log(this, arguments);
+ console.log("pause here", aDefault, one, two, fn, arg);
+
+ var inner = function inner(arg) {
+ var body = "42";console.log("pause here", body, root);
+ };
+ inner();
+ };
+ fn.call("this-value", "arg-value");
+ }
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=webpack-line-mappings.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/webpack-line-mappings.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/webpack-line-mappings.js.map
new file mode 100644
index 0000000000..7915a337e1
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel6/webpack-line-mappings.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"webpack-line-mappings.js","sources":["rollup-babel6://./webpack-line-mappings/src/mod1.js","rollup-babel6://./webpack-line-mappings/input.js"],"sourcesContent":["export default \"a-default\";\n","import aDefault from \"./src/mod1\";\n\nexport default function root() {\n let one = 1;\n\n {\n const two = 2;\n\n var fn = function someName(arg) {\n console.log(this, arguments);\n console.log(\"pause here\", aDefault, one, two, fn, arg);\n\n var inner = (arg) => { var body = \"42\"; console.log(\"pause here\", body, root); };\n inner();\n };\n fn.call(\"this-value\", \"arg-value\");\n }\n}\n"],"names":["root","one","two","fn","someName","arg","console","log","arguments","aDefault","inner","body","call"],"mappings":";;;AAAA,iBAAe,WAAf;;ECEe,SAASA,IAAT,GAAgB;EAC7B,MAAIC,MAAM,CAAV;;EAEA;EACE,QAAMC,MAAM,CAAZ;;EAEA,QAAIC,KAAK,SAASC,QAAT,CAAkBC,GAAlB,EAAuB;EAC9BC,cAAQC,GAAR,CAAY,IAAZ,EAAkBC,SAAlB;EACAF,cAAQC,GAAR,CAAY,YAAZ,EAA0BE,QAA1B,EAAoCR,GAApC,EAAyCC,GAAzC,EAA8CC,EAA9C,EAAkDE,GAAlD;;EAEA,UAAIK,QAAQ,SAARA,KAAQ,CAACL,GAAD,EAAS;EAAE,YAAIM,OAAO,IAAX,CAAiBL,QAAQC,GAAR,CAAY,YAAZ,EAA0BI,IAA1B,EAAgCX,IAAhC;EAAwC,OAAhF;EACAU;EACD,KAND;EAOAP,OAAGS,IAAH,CAAQ,YAAR,EAAsB,WAAtB;EACD;EACF;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/babel-bindings-with-flow.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/babel-bindings-with-flow.js
new file mode 100644
index 0000000000..0eec8c7baf
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/babel-bindings-with-flow.js
@@ -0,0 +1,15 @@
+var rollupBabel7BabelBindingsWithFlow = (function () {
+ 'use strict';
+
+ var aNamed = "a-named";
+
+ // Webpack doesn't map import declarations well, so doing this forces binding
+ function root() {
+ var value = aNamed;
+ console.log("pause here", root, value);
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=babel-bindings-with-flow.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/babel-bindings-with-flow.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/babel-bindings-with-flow.js.map
new file mode 100644
index 0000000000..6cdbbb148d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/babel-bindings-with-flow.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"babel-bindings-with-flow.js","sources":["rollup-babel7://./babel-bindings-with-flow/src/mod.js","rollup-babel7://./babel-bindings-with-flow/input.js"],"sourcesContent":["export const aNamed = \"a-named\";\n","// Webpack doesn't map import declarations well, so doing this forces binding\n// processing to only process the binding being cast when searching for\n// matches. That way we can properly test if the flow cast causes problems.\nimport { aNamed } from \"./src/mod\";\n\nexport default function root() {\n var value = (aNamed: Array<string>);\n\n console.log(\"pause here\", root, value);\n}\n"],"names":["aNamed","root","value","console","log"],"mappings":";;;EAAO,IAAMA,SAAS,SAAf;;ECAP;AACA,EAIe,SAASC,IAAT,GAAgB;EAC7B,MAAIC,QAASF,MAAb;EAEAG,UAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B,EAAgCC,KAAhC;EACD;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/babel-classes.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/babel-classes.js
new file mode 100644
index 0000000000..74a7578849
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/babel-classes.js
@@ -0,0 +1,71 @@
+var rollupBabel7BabelClasses = (function () {
+ 'use strict';
+
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ function _defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || false;
+ descriptor.configurable = true;
+ if ("value" in descriptor) descriptor.writable = true;
+ Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+
+ function _createClass(Constructor, protoProps, staticProps) {
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
+ if (staticProps) _defineProperties(Constructor, staticProps);
+ return Constructor;
+ }
+
+ function _defineProperty(obj, key, value) {
+ if (key in obj) {
+ Object.defineProperty(obj, key, {
+ value: value,
+ enumerable: true,
+ configurable: true,
+ writable: true
+ });
+ } else {
+ obj[key] = value;
+ }
+
+ return obj;
+ }
+
+ function root() {
+ var Another =
+ /*#__PURE__*/
+ function () {
+ function Another() {
+ var _this = this;
+
+ _classCallCheck(this, Another);
+
+ _defineProperty(this, "bound", function () {
+ return _this;
+ });
+ }
+
+ _createClass(Another, [{
+ key: "method",
+ value: function method() {
+ console.log("pause here", Another, root);
+ }
+ }]);
+
+ return Another;
+ }();
+
+ new Another().method();
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=babel-classes.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/babel-classes.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/babel-classes.js.map
new file mode 100644
index 0000000000..d83dc68b9b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/babel-classes.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"babel-classes.js","sources":["rollup-babel7://./babel-classes/input.js"],"sourcesContent":["export default function root() {\n class Another {\n bound = () => {\n return this;\n }\n\n method() {\n let two = 2;\n\n console.log(\"pause here\", Another, root);\n }\n }\n\n new Another().method();\n}\n"],"names":["root","Another","console","log","method"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAe,SAASA,IAAT,GAAgB;EAAA,MACvBC,OADuB;EAAA;EAAA;EAAA;EAAA;;EAAA;;EAAA,qCAEnB,YAAM;EACZ,eAAO,KAAP;EACD,OAJ0B;EAAA;;EAAA;EAAA;EAAA,+BAMlB;AACP,EAEAC,gBAAQC,GAAR,CAAY,YAAZ,EAA0BF,OAA1B,EAAmCD,IAAnC;EACD;EAV0B;;EAAA;EAAA;;EAa7B,MAAIC,OAAJ,GAAcG,MAAd;EACD;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/babel-flowtype-bindings.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/babel-flowtype-bindings.js
new file mode 100644
index 0000000000..b4cc460849
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/babel-flowtype-bindings.js
@@ -0,0 +1,14 @@
+var rollupBabel7BabelFlowtypeBindings = (function () {
+ 'use strict';
+
+ var Four = "one";
+
+ var aConst = "a-const";
+ function root() {
+ console.log("pause here", aConst, Four, root);
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=babel-flowtype-bindings.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/babel-flowtype-bindings.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/babel-flowtype-bindings.js.map
new file mode 100644
index 0000000000..3e7ca4f909
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/babel-flowtype-bindings.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"babel-flowtype-bindings.js","sources":["rollup-babel7://./babel-flowtype-bindings/src/mod.js","rollup-babel7://./babel-flowtype-bindings/input.js"],"sourcesContent":["export default \"a-default\";\nexport const Four = \"one\";\n","import type { One, Two, Three } from \"./src/mod\";\nimport { Four, type Five, typeof Six } from \"./src/mod\";\n\ntype Other = {};\n\nconst aConst = \"a-const\";\n\nexport default function root() {\n console.log(\"pause here\", aConst, Four, root);\n}\n"],"names":["Four","aConst","root","console","log"],"mappings":";;;EACO,IAAMA,OAAO,KAAb;;ECIP,IAAMC,SAAS,SAAf;AAEA,EAAe,SAASC,IAAT,GAAgB;EAC7BC,UAAQC,GAAR,CAAY,YAAZ,EAA0BH,MAA1B,EAAkCD,IAAlC,EAAwCE,IAAxC;EACD;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/classes.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/classes.js
new file mode 100644
index 0000000000..d8105f59b5
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/classes.js
@@ -0,0 +1,70 @@
+var rollupBabel7Classes = (function () {
+ 'use strict';
+
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ function _defineProperties(target, props) {
+ for (var i = 0; i < props.length; i++) {
+ var descriptor = props[i];
+ descriptor.enumerable = descriptor.enumerable || false;
+ descriptor.configurable = true;
+ if ("value" in descriptor) descriptor.writable = true;
+ Object.defineProperty(target, descriptor.key, descriptor);
+ }
+ }
+
+ function _createClass(Constructor, protoProps, staticProps) {
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
+ if (staticProps) _defineProperties(Constructor, staticProps);
+ return Constructor;
+ }
+
+ function root() {
+ var one = 1;
+
+ var Thing =
+ /*#__PURE__*/
+ function () {
+ function Thing() {
+ _classCallCheck(this, Thing);
+ }
+
+ _createClass(Thing, [{
+ key: "one",
+ value: function one() {
+ console.log("pause here");
+ }
+ }]);
+
+ return Thing;
+ }();
+
+ var Another =
+ /*#__PURE__*/
+ function () {
+ function Another() {
+ _classCallCheck(this, Another);
+ }
+
+ _createClass(Another, [{
+ key: "method",
+ value: function method() {
+ console.log("pause here", Another, one, Thing, root);
+ }
+ }]);
+
+ return Another;
+ }();
+
+ new Another().method();
+ new Thing().one();
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=classes.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/classes.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/classes.js.map
new file mode 100644
index 0000000000..53a923b004
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/classes.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"classes.js","sources":["rollup-babel7://./classes/input.js"],"sourcesContent":["export default function root() {\n let one = 1;\n\n class Thing {\n one() {\n console.log(\"pause here\");\n }\n }\n\n class Another {\n method() {\n let two = 2;\n\n const three = 3;\n\n console.log(\"pause here\", Another, one, Thing, root);\n }\n }\n\n new Another().method();\n new Thing().one();\n}\n"],"names":["root","one","Thing","console","log","Another","method"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;EAAe,SAASA,IAAT,GAAgB;EAC7B,MAAIC,MAAM,CAAV;;EAD6B,MAGvBC,KAHuB;EAAA;EAAA;EAAA;EAAA;EAAA;;EAAA;EAAA;EAAA,4BAIrB;EACJC,gBAAQC,GAAR,CAAY,YAAZ;EACD;EAN0B;;EAAA;EAAA;;EAAA,MASvBC,OATuB;EAAA;EAAA;EAAA;EAAA;EAAA;;EAAA;EAAA;EAAA,+BAUlB;AACP,EAIAF,gBAAQC,GAAR,CAAY,YAAZ,EAA0BC,OAA1B,EAAmCJ,GAAnC,EAAwCC,KAAxC,EAA+CF,IAA/C;EACD;EAhB0B;;EAAA;EAAA;;EAmB7B,MAAIK,OAAJ,GAAcC,MAAd;EACA,MAAIJ,KAAJ,GAAYD,GAAZ;EACD;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/esmodules-es6.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/esmodules-es6.js
new file mode 100644
index 0000000000..c6259a711f
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/esmodules-es6.js
@@ -0,0 +1,55 @@
+var rollupBabel7EsmodulesEs6 = (function () {
+ 'use strict';
+
+ var aDefault = "a-default";
+
+ const aNamed = "a-named";
+
+ const original = "an-original";
+
+ var mod4 = "a-default";
+ const aNamed$1 = "a-named";
+
+ var aNamespace = /*#__PURE__*/Object.freeze({
+ default: mod4,
+ aNamed: aNamed$1
+ });
+
+ var aDefault2 = "a-default2";
+
+ const aNamed2 = "a-named2";
+
+ const original$1 = "an-original2";
+
+ var aDefault3 = "a-default3";
+
+ const aNamed3 = "a-named3";
+
+ const original$2 = "an-original3";
+
+ function root() {
+ console.log("pause here", root);
+ console.log(aDefault);
+ console.log(original);
+ console.log(aNamed);
+ console.log(aNamed);
+ console.log(aNamespace);
+
+ try {
+ // None of these are callable in this code, but we still want to make sure
+ // they map properly even if the only reference is in a call expressions.
+ console.log(aDefault2());
+ console.log(original$1());
+ console.log(aNamed2());
+ console.log(aNamed2());
+ console.log(new aDefault3());
+ console.log(new original$2());
+ console.log(new aNamed3());
+ console.log(new aNamed3());
+ } catch (e) {}
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=esmodules-es6.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/esmodules-es6.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/esmodules-es6.js.map
new file mode 100644
index 0000000000..d35810bce9
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/esmodules-es6.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"esmodules-es6.js","sources":["rollup-babel7://./esmodules-es6/src/mod1.js","rollup-babel7://./esmodules-es6/src/mod2.js","rollup-babel7://./esmodules-es6/src/mod3.js","rollup-babel7://./esmodules-es6/src/mod4.js","rollup-babel7://./esmodules-es6/src/mod5.js","rollup-babel7://./esmodules-es6/src/mod6.js","rollup-babel7://./esmodules-es6/src/mod7.js","rollup-babel7://./esmodules-es6/src/mod9.js","rollup-babel7://./esmodules-es6/src/mod10.js","rollup-babel7://./esmodules-es6/src/mod11.js","rollup-babel7://./esmodules-es6/input.js"],"sourcesContent":["export default \"a-default\";\n","export const aNamed = \"a-named\";\n","export const original = \"an-original\";\n","export default \"a-default\";\nexport const aNamed = \"a-named\";\n","export default \"a-default2\";\n","export const aNamed2 = \"a-named2\";\n","export const original = \"an-original2\";\n","export default \"a-default3\";\n","export const aNamed3 = \"a-named3\";\n","export const original = \"an-original3\";\n","import aDefault from \"./src/mod1\";\nimport { aNamed, aNamed as anotherNamed } from \"./src/mod2\";\nimport { original as anAliased } from \"./src/mod3\";\nimport * as aNamespace from \"./src/mod4\";\n\nimport aDefault2 from \"./src/mod5\";\nimport { aNamed2, aNamed2 as anotherNamed2 } from \"./src/mod6\";\nimport { original as anAliased2 } from \"./src/mod7\";\n\nimport aDefault3 from \"./src/mod9\";\nimport { aNamed3, aNamed3 as anotherNamed3 } from \"./src/mod10\";\nimport { original as anAliased3 } from \"./src/mod11\";\n\nimport optimizedOut from \"./src/optimized-out\";\noptimizedOut();\n\nexport default function root() {\n console.log(\"pause here\", root);\n\n console.log(aDefault);\n console.log(anAliased);\n console.log(aNamed);\n console.log(anotherNamed);\n console.log(aNamespace);\n\n try {\n // None of these are callable in this code, but we still want to make sure\n // they map properly even if the only reference is in a call expressions.\n console.log(aDefault2());\n console.log(anAliased2());\n console.log(aNamed2());\n console.log(anotherNamed2());\n\n console.log(new aDefault3());\n console.log(new anAliased3());\n console.log(new aNamed3());\n console.log(new anotherNamed3());\n } catch (e) {}\n}\n\nexport function example(){}\n"],"names":["aNamed","original","aNamed2","aNamed3","root","console","log","aDefault","anAliased","anotherNamed","aNamespace","aDefault2","anAliased2","anotherNamed2","aDefault3","anAliased3","anotherNamed3","e"],"mappings":";;;AAAA,iBAAe,WAAf;;ECAO,MAAMA,SAAS,SAAf;;ECAA,MAAMC,WAAW,aAAjB;;ACAP,aAAe,WAAf;AACA,EAAO,MAAMD,WAAS,SAAf;;;;;;;ACDP,kBAAe,YAAf;;ECAO,MAAME,UAAU,UAAhB;;ECAA,MAAMD,aAAW,cAAjB;;ACAP,kBAAe,YAAf;;ECAO,MAAME,UAAU,UAAhB;;ECAA,MAAMF,aAAW,cAAjB;;ECgBQ,SAASG,IAAT,GAAgB;EAC7BC,UAAQC,GAAR,CAAY,YAAZ,EAA0BF,IAA1B;EAEAC,UAAQC,GAAR,CAAYC,QAAZ;EACAF,UAAQC,GAAR,CAAYE,QAAZ;EACAH,UAAQC,GAAR,CAAYN,MAAZ;EACAK,UAAQC,GAAR,CAAYG,MAAZ;EACAJ,UAAQC,GAAR,CAAYI,UAAZ;;EAEA,MAAI;EACF;EACA;EACAL,YAAQC,GAAR,CAAYK,WAAZ;EACAN,YAAQC,GAAR,CAAYM,YAAZ;EACAP,YAAQC,GAAR,CAAYJ,SAAZ;EACAG,YAAQC,GAAR,CAAYO,SAAZ;EAEAR,YAAQC,GAAR,CAAY,IAAIQ,SAAJ,EAAZ;EACAT,YAAQC,GAAR,CAAY,IAAIS,UAAJ,EAAZ;EACAV,YAAQC,GAAR,CAAY,IAAIH,OAAJ,EAAZ;EACAE,YAAQC,GAAR,CAAY,IAAIU,OAAJ,EAAZ;EACD,GAZD,CAYE,OAAOC,CAAP,EAAU;EACb;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/esmodules.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/esmodules.js
new file mode 100644
index 0000000000..6fa02e0a14
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/esmodules.js
@@ -0,0 +1,55 @@
+var rollupBabel7Esmodules = (function () {
+ 'use strict';
+
+ var aDefault = "a-default";
+
+ var aNamed = "a-named";
+
+ var original = "an-original";
+
+ var mod4 = "a-default";
+ var aNamed$1 = "a-named";
+
+ var aNamespace = /*#__PURE__*/Object.freeze({
+ default: mod4,
+ aNamed: aNamed$1
+ });
+
+ var aDefault2 = "a-default2";
+
+ var aNamed2 = "a-named2";
+
+ var original$1 = "an-original2";
+
+ var aDefault3 = "a-default3";
+
+ var aNamed3 = "a-named3";
+
+ var original$2 = "an-original3";
+
+ function root() {
+ console.log("pause here", root);
+ console.log(aDefault);
+ console.log(original);
+ console.log(aNamed);
+ console.log(aNamed);
+ console.log(aNamespace);
+
+ try {
+ // None of these are callable in this code, but we still want to make sure
+ // they map properly even if the only reference is in a call expressions.
+ console.log(aDefault2());
+ console.log(original$1());
+ console.log(aNamed2());
+ console.log(aNamed2());
+ console.log(new aDefault3());
+ console.log(new original$2());
+ console.log(new aNamed3());
+ console.log(new aNamed3());
+ } catch (e) {}
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=esmodules.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/esmodules.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/esmodules.js.map
new file mode 100644
index 0000000000..d958f1955e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/esmodules.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"esmodules.js","sources":["rollup-babel7://./esmodules/src/mod1.js","rollup-babel7://./esmodules/src/mod2.js","rollup-babel7://./esmodules/src/mod3.js","rollup-babel7://./esmodules/src/mod4.js","rollup-babel7://./esmodules/src/mod5.js","rollup-babel7://./esmodules/src/mod6.js","rollup-babel7://./esmodules/src/mod7.js","rollup-babel7://./esmodules/src/mod9.js","rollup-babel7://./esmodules/src/mod10.js","rollup-babel7://./esmodules/src/mod11.js","rollup-babel7://./esmodules/input.js"],"sourcesContent":["export default \"a-default\";\n","export const aNamed = \"a-named\";\n","export const original = \"an-original\";\n","export default \"a-default\";\nexport const aNamed = \"a-named\";\n","export default \"a-default2\";\n","export const aNamed2 = \"a-named2\";\n","export const original = \"an-original2\";\n","export default \"a-default3\";\n","export const aNamed3 = \"a-named3\";\n","export const original = \"an-original3\";\n","import aDefault from \"./src/mod1\";\nimport { aNamed, aNamed as anotherNamed } from \"./src/mod2\";\nimport { original as anAliased } from \"./src/mod3\";\nimport * as aNamespace from \"./src/mod4\";\n\nimport aDefault2 from \"./src/mod5\";\nimport { aNamed2, aNamed2 as anotherNamed2 } from \"./src/mod6\";\nimport { original as anAliased2 } from \"./src/mod7\";\n\nimport aDefault3 from \"./src/mod9\";\nimport { aNamed3, aNamed3 as anotherNamed3 } from \"./src/mod10\";\nimport { original as anAliased3 } from \"./src/mod11\";\n\nimport optimizedOut from \"./src/optimized-out\";\noptimizedOut();\n\nexport default function root() {\n console.log(\"pause here\", root);\n\n console.log(aDefault);\n console.log(anAliased);\n console.log(aNamed);\n console.log(anotherNamed);\n console.log(aNamespace);\n\n try {\n // None of these are callable in this code, but we still want to make sure\n // they map properly even if the only reference is in a call expressions.\n console.log(aDefault2());\n console.log(anAliased2());\n console.log(aNamed2());\n console.log(anotherNamed2());\n\n console.log(new aDefault3());\n console.log(new anAliased3());\n console.log(new aNamed3());\n console.log(new anotherNamed3());\n } catch (e) {}\n}\n\nexport function example(){}\n"],"names":["aNamed","original","aNamed2","aNamed3","root","console","log","aDefault","anAliased","anotherNamed","aNamespace","aDefault2","anAliased2","anotherNamed2","aDefault3","anAliased3","anotherNamed3","e"],"mappings":";;;AAAA,iBAAe,WAAf;;ECAO,IAAMA,SAAS,SAAf;;ECAA,IAAMC,WAAW,aAAjB;;ACAP,aAAe,WAAf;AACA,EAAO,IAAMD,WAAS,SAAf;;;;;;;ACDP,kBAAe,YAAf;;ECAO,IAAME,UAAU,UAAhB;;ECAA,IAAMD,aAAW,cAAjB;;ACAP,kBAAe,YAAf;;ECAO,IAAME,UAAU,UAAhB;;ECAA,IAAMF,aAAW,cAAjB;;ECgBQ,SAASG,IAAT,GAAgB;EAC7BC,UAAQC,GAAR,CAAY,YAAZ,EAA0BF,IAA1B;EAEAC,UAAQC,GAAR,CAAYC,QAAZ;EACAF,UAAQC,GAAR,CAAYE,QAAZ;EACAH,UAAQC,GAAR,CAAYN,MAAZ;EACAK,UAAQC,GAAR,CAAYG,MAAZ;EACAJ,UAAQC,GAAR,CAAYI,UAAZ;;EAEA,MAAI;EACF;EACA;EACAL,YAAQC,GAAR,CAAYK,WAAZ;EACAN,YAAQC,GAAR,CAAYM,YAAZ;EACAP,YAAQC,GAAR,CAAYJ,SAAZ;EACAG,YAAQC,GAAR,CAAYO,SAAZ;EAEAR,YAAQC,GAAR,CAAY,IAAIQ,SAAJ,EAAZ;EACAT,YAAQC,GAAR,CAAY,IAAIS,UAAJ,EAAZ;EACAV,YAAQC,GAAR,CAAY,IAAIH,OAAJ,EAAZ;EACAE,YAAQC,GAAR,CAAY,IAAIU,OAAJ,EAAZ;EACD,GAZD,CAYE,OAAOC,CAAP,EAAU;EACb;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/eval-maps.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/eval-maps.js
new file mode 100644
index 0000000000..658a5afa69
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/eval-maps.js
@@ -0,0 +1,16 @@
+var rollupBabel7EvalMaps = (function () {
+ 'use strict';
+
+ function root() {
+ var one = 1;
+ {
+ var _two = 4;
+ var _three = 5;
+ console.log("pause here", one, _two, _three);
+ }
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=eval-maps.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/eval-maps.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/eval-maps.js.map
new file mode 100644
index 0000000000..a7b0fb06ba
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/eval-maps.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"eval-maps.js","sources":["rollup-babel7://./eval-maps/input.js"],"sourcesContent":["\nexport default function root() {\n var one = 1;\n let two = 2;\n const three = 3;\n\n one;\n two;\n\n {\n let two = 4;\n const three = 5;\n\n console.log(\"pause here\", one, two, three);\n }\n}\n"],"names":["root","one","two","three","console","log"],"mappings":";;;EACe,SAASA,IAAT,GAAgB;EAC7B,MAAIC,MAAM,CAAV;AACA,EAMA;EACE,QAAIC,OAAM,CAAV;EACA,QAAMC,SAAQ,CAAd;EAEAC,YAAQC,GAAR,CAAY,YAAZ,EAA0BJ,GAA1B,EAA+BC,IAA/B,EAAoCC,MAApC;EACD;EACF;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/for-loops.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/for-loops.js
new file mode 100644
index 0000000000..2f52b48a7f
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/for-loops.js
@@ -0,0 +1,26 @@
+var rollupBabel7ForLoops = (function () {
+ 'use strict';
+
+ function root() {
+
+ for (var _i = 1; _i < 2; _i++) {
+ console.log("pause here", root);
+ }
+
+ for (var _i2 in {
+ 2: ""
+ }) {
+ console.log("pause here", root);
+ }
+
+ var _arr = [3];
+
+ for (var _i3 = 0; _i3 < _arr.length; _i3++) {
+ console.log("pause here", root);
+ }
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=for-loops.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/for-loops.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/for-loops.js.map
new file mode 100644
index 0000000000..4d741af084
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/for-loops.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"for-loops.js","sources":["rollup-babel7://./for-loops/input.js"],"sourcesContent":["export default function root() {\n let i = 0;\n\n for (let i = 1; i < 2; i++) {\n console.log(\"pause here\", root);\n }\n\n for (let i in { 2: \"\" }) {\n console.log(\"pause here\", root);\n }\n\n for (let i of [3]) {\n console.log(\"pause here\", root);\n }\n}\n"],"names":["root","i","console","log"],"mappings":";;;EAAe,SAASA,IAAT,GAAgB;AAC7B;EAEA,OAAK,IAAIC,KAAI,CAAb,EAAgBA,KAAI,CAApB,EAAuBA,IAAvB,EAA4B;EAC1BC,YAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B;EACD;;EAED,OAAK,IAAIC,GAAT,IAAc;EAAE,OAAG;EAAL,GAAd,EAAyB;EACvBC,YAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B;EACD;;EAT4B,aAWf,CAAC,CAAD,CAXe;;EAW7B,8CAAmB;AAAd,EACHE,YAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B;EACD;EACF;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/for-of.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/for-of.js
new file mode 100644
index 0000000000..89a177ebd4
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/for-of.js
@@ -0,0 +1,21 @@
+var rollupBabel7ForOf = (function () {
+ 'use strict';
+
+ function forOf() {
+ var _arr = [1];
+
+ for (var _i = 0; _i < _arr.length; _i++) {
+ var x = _arr[_i];
+ doThing(x);
+ }
+
+ function doThing(arg) {
+ // Avoid optimize out
+ window.console;
+ }
+ }
+
+ return forOf;
+
+}());
+//# sourceMappingURL=for-of.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/for-of.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/for-of.js.map
new file mode 100644
index 0000000000..fb194da839
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/for-of.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"for-of.js","sources":["rollup-babel7://./for-of/input.js"],"sourcesContent":["const mod = \"module scoped\";\n\nexport default function forOf() {\n for (const x of [1]) {\n doThing(x);\n }\n\n function doThing(arg) {\n // Avoid optimize out\n window.console;\n }\n}\n"],"names":["forOf","x","doThing","arg","window","console"],"mappings":";;;EAEe,SAASA,KAAT,GAAiB;EAAA,aACd,CAAC,CAAD,CADc;;EAC9B,2CAAqB;EAAhB,QAAMC,YAAN;EACHC,YAAQD,CAAR;EACD;;EAED,WAASC,OAAT,CAAiBC,GAAjB,EAAsB;EACpB;EACAC,WAAOC,OAAP;EACD;EACF;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/functions.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/functions.js
new file mode 100644
index 0000000000..ef94a394e4
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/functions.js
@@ -0,0 +1,23 @@
+var rollupBabel7Functions = (function () {
+ 'use strict';
+
+ function root() {
+ function decl(p1) {
+ var inner = function inner(p2) {
+ var arrow = function arrow(p3) {
+ console.log("pause here", p3, arrow, p2, inner, p1, decl, root);
+ };
+
+ arrow();
+ };
+
+ inner();
+ }
+
+ decl();
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=functions.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/functions.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/functions.js.map
new file mode 100644
index 0000000000..eca0e059e8
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/functions.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"functions.js","sources":["rollup-babel7://./functions/input.js"],"sourcesContent":["export default function root() {\n\n function decl(p1) {\n const inner = function inner(p2) {\n const arrow = (p3) => {\n console.log(\"pause here\", p3, arrow, p2, inner, p1, decl, root);\n };\n arrow();\n };\n inner();\n }\n\n decl();\n}\n"],"names":["root","decl","p1","inner","p2","arrow","p3","console","log"],"mappings":";;;EAAe,SAASA,IAAT,GAAgB;EAE7B,WAASC,IAAT,CAAcC,EAAd,EAAkB;EAChB,QAAMC,QAAQ,SAASA,KAAT,CAAeC,EAAf,EAAmB;EAC/B,UAAMC,QAAQ,SAARA,KAAQ,CAACC,EAAD,EAAQ;EACpBC,gBAAQC,GAAR,CAAY,YAAZ,EAA0BF,EAA1B,EAA8BD,KAA9B,EAAqCD,EAArC,EAAyCD,KAAzC,EAAgDD,EAAhD,EAAoDD,IAApD,EAA0DD,IAA1D;EACD,OAFD;;EAGAK;EACD,KALD;;EAMAF;EACD;;EAEDF;EACD;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/lex-and-nonlex.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/lex-and-nonlex.js
new file mode 100644
index 0000000000..f070be36e9
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/lex-and-nonlex.js
@@ -0,0 +1,25 @@
+var rollupBabel7LexAndNonlex = (function () {
+ 'use strict';
+
+ function _classCallCheck(instance, Constructor) {
+ if (!(instance instanceof Constructor)) {
+ throw new TypeError("Cannot call a class as a function");
+ }
+ }
+
+ function root() {
+ function someHelper() {
+ console.log("pause here", root, Thing);
+ }
+
+ var Thing = function Thing() {
+ _classCallCheck(this, Thing);
+ };
+
+ someHelper();
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=lex-and-nonlex.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/lex-and-nonlex.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/lex-and-nonlex.js.map
new file mode 100644
index 0000000000..4af2eaac91
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/lex-and-nonlex.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lex-and-nonlex.js","sources":["rollup-babel7://./lex-and-nonlex/input.js"],"sourcesContent":["export default function root() {\n function someHelper(){\n console.log(\"pause here\", root, Thing);\n }\n\n class Thing {}\n\n someHelper();\n}\n"],"names":["root","someHelper","console","log","Thing"],"mappings":";;;;;;;;;EAAe,SAASA,IAAT,GAAgB;EAC7B,WAASC,UAAT,GAAqB;EACnBC,YAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B,EAAgCI,KAAhC;EACD;;EAH4B,MAKvBA,KALuB;EAAA;EAAA;;EAO7BH;EACD;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/line-start-bindings-es6.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/line-start-bindings-es6.js
new file mode 100644
index 0000000000..b169646bc1
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/line-start-bindings-es6.js
@@ -0,0 +1,18 @@
+var rollupBabel7LineStartBindingsEs6 = (function () {
+ 'use strict';
+
+ function root() {
+ function aFunc() {
+ // applies here too.
+
+ this.thing = 4;
+ console.log("pause here", root);
+ }
+
+ aFunc.call({});
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=line-start-bindings-es6.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/line-start-bindings-es6.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/line-start-bindings-es6.js.map
new file mode 100644
index 0000000000..ee2efcc853
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/line-start-bindings-es6.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"line-start-bindings-es6.js","sources":["rollup-babel7://./line-start-bindings-es6/input.js"],"sourcesContent":["\nexport default function root() {\n function aFunc(){\n // Since these bindings are on their own linem, the mappings will\n // extend to the start of the line, rather than starting at the first\n // character of the binding.\n const {\n one,\n two\n } = {\n one: 1,\n two: 2,\n };\n\n // The 'this' binding here is also its own line, so the comment above\n // applies here too.\n this.thing = 4;\n\n console.log(\"pause here\", root);\n }\n\n aFunc.call({ });\n}\n"],"names":["root","aFunc","thing","console","log","call"],"mappings":";;;EACe,SAASA,IAAT,GAAgB;EAC7B,WAASC,KAAT,GAAgB;AACd,EAYA;;EACA,SAAKC,KAAL,GAAa,CAAb;EAEAC,YAAQC,GAAR,CAAY,YAAZ,EAA0BJ,IAA1B;EACD;;EAEDC,QAAMI,IAAN,CAAW,EAAX;EACD;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/shadowed-vars.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/shadowed-vars.js
new file mode 100644
index 0000000000..1353c50cf3
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/shadowed-vars.js
@@ -0,0 +1,16 @@
+var rollupBabel7ShadowedVars = (function () {
+ 'use strict';
+
+ function test () {
+
+ {
+ {
+ console.log("pause here");
+ }
+ }
+ }
+
+ return test;
+
+}());
+//# sourceMappingURL=shadowed-vars.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/shadowed-vars.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/shadowed-vars.js.map
new file mode 100644
index 0000000000..33ece0ce7a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/shadowed-vars.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"shadowed-vars.js","sources":["rollup-babel7://./shadowed-vars/input.js"],"sourcesContent":["export default function() {\n var aVar = \"var1\";\n let aLet = \"let1\";\n const aConst = \"const1\";\n\n class Outer {}\n {\n function Outer() {}\n\n var aVar = \"var2\";\n let aLet = \"let2\";\n const aConst = \"const2\";\n {\n var aVar = \"var3\";\n let aLet = \"let3\";\n const aConst = \"const3\";\n\n console.log(\"pause here\");\n }\n }\n}\n"],"names":["console","log"],"mappings":";;;EAAe,iBAAW;AACxB;EAKA;AAAA,EAME;AACE,EAIAA,cAAQC,GAAR,CAAY,YAAZ;EACD;EACF;EACF;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-for-of-array-closure.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-for-of-array-closure.js
new file mode 100644
index 0000000000..2dd71a020d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-for-of-array-closure.js
@@ -0,0 +1,26 @@
+var rollupBabel7StepOverForOfArrayClosure = (function () {
+ 'use strict';
+
+ // Babel will optimize this for..of because it call tell the value is an array.
+ function root() {
+ console.log("pause here");
+ var _arr = [1, 2];
+
+ var _loop = function _loop() {
+ var val = _arr[_i];
+ console.log("pause again", function () {
+ return val;
+ }());
+ };
+
+ for (var _i = 0; _i < _arr.length; _i++) {
+ _loop();
+ }
+
+ console.log("done");
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=step-over-for-of-array-closure.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-for-of-array-closure.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-for-of-array-closure.js.map
new file mode 100644
index 0000000000..de19a7414f
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-for-of-array-closure.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"step-over-for-of-array-closure.js","sources":["rollup-babel7://./step-over-for-of-array-closure/input.js"],"sourcesContent":["// Babel will optimize this for..of because it call tell the value is an array.\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of [1, 2]) {\n console.log(\"pause again\", (() => val)());\n }\n\n console.log(\"done\");\n}\n"],"names":["root","console","log","val"],"mappings":";;;EAAA;AACA,EAAe,SAASA,IAAT,GAAgB;EAC7BC,UAAQC,GAAR,CAAY,YAAZ;EAD6B,aAGX,CAAC,CAAD,EAAI,CAAJ,CAHW;;EAAA;EAGxB,QAAMC,cAAN;EACHF,YAAQC,GAAR,CAAY,aAAZ,EAA4B;EAAA,aAAMC,GAAN;EAAA,KAAD,EAA3B;EAJ2B;;EAG7B,2CAA0B;EAAA;EAEzB;;EAEDF,UAAQC,GAAR,CAAY,MAAZ;EACD;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-for-of-array.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-for-of-array.js
new file mode 100644
index 0000000000..d421e70889
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-for-of-array.js
@@ -0,0 +1,20 @@
+var rollupBabel7StepOverForOfArray = (function () {
+ 'use strict';
+
+ // Babel will optimize this for..of because it call tell the value is an array.
+ function root() {
+ console.log("pause here");
+ var _arr = [1, 2];
+
+ for (var _i = 0; _i < _arr.length; _i++) {
+ var val = _arr[_i];
+ console.log("pause again", val);
+ }
+
+ console.log("done");
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=step-over-for-of-array.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-for-of-array.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-for-of-array.js.map
new file mode 100644
index 0000000000..cabde11c13
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-for-of-array.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"step-over-for-of-array.js","sources":["rollup-babel7://./step-over-for-of-array/input.js"],"sourcesContent":["// Babel will optimize this for..of because it call tell the value is an array.\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of [1, 2]) {\n console.log(\"pause again\", val);\n }\n\n console.log(\"done\");\n}\n"],"names":["root","console","log","val"],"mappings":";;;EAAA;AACA,EAAe,SAASA,IAAT,GAAgB;EAC7BC,UAAQC,GAAR,CAAY,YAAZ;EAD6B,aAGX,CAAC,CAAD,EAAI,CAAJ,CAHW;;EAG7B,2CAA0B;EAArB,QAAMC,cAAN;EACHF,YAAQC,GAAR,CAAY,aAAZ,EAA2BC,GAA3B;EACD;;EAEDF,UAAQC,GAAR,CAAY,MAAZ;EACD;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-for-of-closure.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-for-of-closure.js
new file mode 100644
index 0000000000..c0160c1529
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-for-of-closure.js
@@ -0,0 +1,27 @@
+var rollupBabel7StepOverForOfClosure = (function () {
+ 'use strict';
+
+ // Babel will convert the loop body to a function to handle the 'val' lexical
+ // enclosure behavior.
+ var vals = [1, 2];
+ function root() {
+ console.log("pause here");
+
+ var _loop = function _loop() {
+ var val = vals[_i];
+ console.log("pause again", function () {
+ return val;
+ }());
+ };
+
+ for (var _i = 0; _i < vals.length; _i++) {
+ _loop();
+ }
+
+ console.log("done");
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=step-over-for-of-closure.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-for-of-closure.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-for-of-closure.js.map
new file mode 100644
index 0000000000..b7d53520df
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-for-of-closure.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"step-over-for-of-closure.js","sources":["rollup-babel7://./step-over-for-of-closure/input.js"],"sourcesContent":["// Babel will convert the loop body to a function to handle the 'val' lexical\n// enclosure behavior.\nconst vals = [1, 2];\n\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of vals) {\n console.log(\"pause again\", (() => val)());\n }\n\n console.log(\"done\");\n}\n"],"names":["vals","root","console","log","val"],"mappings":";;;EAAA;EACA;EACA,IAAMA,OAAO,CAAC,CAAD,EAAI,CAAJ,CAAb;AAEA,EAAe,SAASC,IAAT,GAAgB;EAC7BC,UAAQC,GAAR,CAAY,YAAZ;;EAD6B;EAGxB,QAAMC,MAAOJ,IAAP,IAAN;EACHE,YAAQC,GAAR,CAAY,aAAZ,EAA4B;EAAA,aAAMC,GAAN;EAAA,KAAD,EAA3B;EAJ2B;;EAG7B,wBAAkBJ,IAAlB,eAAwB;EAAA;EAEvB;;EAEDE,UAAQC,GAAR,CAAY,MAAZ;EACD;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-for-of.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-for-of.js
new file mode 100644
index 0000000000..bb41970e5f
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-for-of.js
@@ -0,0 +1,19 @@
+var rollupBabel7StepOverForOf = (function () {
+ 'use strict';
+
+ var vals = [1, 2];
+ function root() {
+ console.log("pause here");
+
+ for (var _i = 0; _i < vals.length; _i++) {
+ var val = vals[_i];
+ console.log("pause again", val);
+ }
+
+ console.log("done");
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=step-over-for-of.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-for-of.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-for-of.js.map
new file mode 100644
index 0000000000..409e372ac2
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-for-of.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"step-over-for-of.js","sources":["rollup-babel7://./step-over-for-of/input.js"],"sourcesContent":["const vals = [1, 2];\n\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of vals) {\n console.log(\"pause again\", val);\n }\n\n console.log(\"done\");\n}\n"],"names":["vals","root","console","log","val"],"mappings":";;;EAAA,IAAMA,OAAO,CAAC,CAAD,EAAI,CAAJ,CAAb;AAEA,EAAe,SAASC,IAAT,GAAgB;EAC7BC,UAAQC,GAAR,CAAY,YAAZ;;EAEA,wBAAkBH,IAAlB,eAAwB;EAAnB,QAAMI,MAAOJ,IAAP,IAAN;EACHE,YAAQC,GAAR,CAAY,aAAZ,EAA2BC,GAA3B;EACD;;EAEDF,UAAQC,GAAR,CAAY,MAAZ;EACD;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-function-params.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-function-params.js
new file mode 100644
index 0000000000..f93cda8297
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-function-params.js
@@ -0,0 +1,30 @@
+var rollupBabel7StepOverFunctionParams = (function () {
+ 'use strict';
+
+ function test(a1) {
+
+ var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
+ a3 = _ref.a3,
+ a4 = _ref.a4,
+ _ref$a = _ref.a5;
+
+ _ref$a = _ref$a === void 0 ? {} : _ref$a;
+ var a7 = _ref$a.a6;
+ console.log("pause next here");
+ }
+
+ function fn() {
+ console.log("pause here");
+ test("1", undefined, {
+ a3: "3",
+ a4: "4",
+ a5: {
+ a6: "7"
+ }
+ });
+ }
+
+ return fn;
+
+}());
+//# sourceMappingURL=step-over-function-params.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-function-params.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-function-params.js.map
new file mode 100644
index 0000000000..67c0c0eaa9
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-function-params.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"step-over-function-params.js","sources":["rollup-babel7://./step-over-function-params/input.js"],"sourcesContent":["function test(a1, a2 = 45, { a3, a4, a5: { a6: a7 } = {} } = {}) {\n console.log(\"pause next here\");\n}\n\nexport default function fn() {\n console.log(\"pause here\");\n test(\"1\", undefined, { a3: \"3\", a4: \"4\", a5: { a6: \"7\" } });\n}\n"],"names":["test","a1","a3","a4","a5","a7","a6","console","log","fn","undefined"],"mappings":";;;EAAA,SAASA,IAAT,CAAcC,EAAd,EAAiE;AAAA;EAAA,iFAAJ,EAAI;EAAA,MAApCC,EAAoC,QAApCA,EAAoC;EAAA,MAAhCC,EAAgC,QAAhCA,EAAgC;EAAA,oBAA5BC,EAA4B;;EAAA,+BAAX,EAAW;EAAA,MAAlBC,EAAkB,UAAtBC,EAAsB;EAC/DC,UAAQC,GAAR,CAAY,iBAAZ;EACD;;AAED,EAAe,SAASC,EAAT,GAAc;EAC3BF,UAAQC,GAAR,CAAY,YAAZ;EACAR,OAAK,GAAL,EAAUU,SAAV,EAAqB;EAAER,QAAI,GAAN;EAAWC,QAAI,GAAf;EAAoBC,QAAI;EAAEE,UAAI;EAAN;EAAxB,GAArB;EACD;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-regenerator-await.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-regenerator-await.js
new file mode 100644
index 0000000000..0cc4b2579c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-regenerator-await.js
@@ -0,0 +1,81 @@
+var rollupBabel7StepOverRegeneratorAwait = (function () {
+ 'use strict';
+
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
+ try {
+ var info = gen[key](arg);
+ var value = info.value;
+ } catch (error) {
+ reject(error);
+ return;
+ }
+
+ if (info.done) {
+ resolve(value);
+ } else {
+ Promise.resolve(value).then(_next, _throw);
+ }
+ }
+
+ function _asyncToGenerator(fn) {
+ return function () {
+ var self = this,
+ args = arguments;
+ return new Promise(function (resolve, reject) {
+ var gen = fn.apply(self, args);
+
+ function _next(value) {
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
+ }
+
+ function _throw(err) {
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
+ }
+
+ _next(undefined);
+ });
+ };
+ }
+
+ var fn =
+ /*#__PURE__*/
+ function () {
+ var _fn = _asyncToGenerator(
+ /*#__PURE__*/
+ regeneratorRuntime.mark(function _callee() {
+ return regeneratorRuntime.wrap(function _callee$(_context) {
+ while (1) {
+ switch (_context.prev = _context.next) {
+ case 0:
+ console.log("pause here");
+ _context.next = 3;
+ return doAsync();
+
+ case 3:
+ console.log("stopped here");
+
+ case 4:
+ case "end":
+ return _context.stop();
+ }
+ }
+ }, _callee, this);
+ }));
+
+ return function fn() {
+ return _fn.apply(this, arguments);
+ };
+ }();
+
+ function doAsync() {
+ return Promise.resolve();
+ }
+
+ function root() {
+ fn();
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=step-over-regenerator-await.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-regenerator-await.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-regenerator-await.js.map
new file mode 100644
index 0000000000..b1e2c3d1b6
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/step-over-regenerator-await.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"step-over-regenerator-await.js","sources":["rollup-babel7://./step-over-regenerator-await/input.js"],"sourcesContent":["var fn = async function fn() {\n console.log(\"pause here\");\n\n await doAsync();\n\n console.log(\"stopped here\");\n};\n\nfunction doAsync() {\n return Promise.resolve();\n}\n\nexport default function root() {\n fn();\n}\n"],"names":["fn","console","log","doAsync","Promise","resolve","root"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAA,IAAIA;EAAA;EAAA;EAAA;EAAA;EAAA,0BAAK;EAAA;EAAA;EAAA;EAAA;EACPC,oBAAQC,GAAR,CAAY,YAAZ;EADO;EAAA,mBAGDC,SAHC;;EAAA;EAKPF,oBAAQC,GAAR,CAAY,cAAZ;;EALO;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA,GAAL;;EAAA,kBAAoBF,EAApB;EAAA;EAAA;EAAA,GAAJ;;EAQA,SAASG,OAAT,GAAmB;EACjB,SAAOC,QAAQC,OAAR,EAAP;EACD;;AAED,EAAe,SAASC,IAAT,GAAgB;EAC7BN;EACD;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/switches.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/switches.js
new file mode 100644
index 0000000000..32c22d2c91
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/switches.js
@@ -0,0 +1,20 @@
+var rollupBabel7Switches = (function () {
+ 'use strict';
+
+ function root() {
+
+ switch (true) {
+ case true:
+ console.log("pause here", root);
+
+ default:
+ {
+ console.log("pause here", root);
+ }
+ }
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=switches.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/switches.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/switches.js.map
new file mode 100644
index 0000000000..7dd80cf2ac
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/switches.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"switches.js","sources":["rollup-babel7://./switches/input.js"],"sourcesContent":["export default function root() {\n let val = 1;\n\n switch (true) {\n case true:\n let val = 2;\n console.log(\"pause here\", root);\n default: {\n let val = 3;\n console.log(\"pause here\", root);\n }\n }\n}\n"],"names":["root","console","log"],"mappings":";;;EAAe,SAASA,IAAT,GAAgB;AAC7B;EAEA,UAAQ,IAAR;EACE,SAAK,IAAL;AACE,EACAC,cAAQC,GAAR,CAAY,YAAZ,EAA0BF,IAA1B;;EACF;EAAS;AACP,EACAC,gBAAQC,GAAR,CAAY,YAAZ,EAA0BF,IAA1B;EACD;EAPH;EASD;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/this-arguments-bindings.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/this-arguments-bindings.js
new file mode 100644
index 0000000000..6c6b221779
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/this-arguments-bindings.js
@@ -0,0 +1,26 @@
+var rollupBabel7ThisArgumentsBindings = (function () {
+ 'use strict';
+
+ function root() {
+ function fn(arg) {
+ var _this = this,
+ _arguments = arguments;
+
+ console.log(this, arguments);
+ console.log("pause here", fn, root);
+
+ var arrow = function arrow(argArrow) {
+ console.log(_this, _arguments);
+ console.log("pause here", fn, root);
+ };
+
+ arrow("arrow-arg");
+ }
+
+ fn.call("this-value", "arg-value");
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=this-arguments-bindings.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/this-arguments-bindings.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/this-arguments-bindings.js.map
new file mode 100644
index 0000000000..a79c33f16a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/this-arguments-bindings.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"this-arguments-bindings.js","sources":["rollup-babel7://./this-arguments-bindings/input.js"],"sourcesContent":["export default function root() {\n function fn(arg) {\n console.log(this, arguments);\n console.log(\"pause here\", fn, root);\n\n const arrow = argArrow => {\n console.log(this, arguments);\n console.log(\"pause here\", fn, root);\n };\n arrow(\"arrow-arg\");\n }\n\n fn.call(\"this-value\", \"arg-value\");\n}\n"],"names":["root","fn","arg","console","log","arguments","arrow","call"],"mappings":";;;EAAe,SAASA,IAAT,GAAgB;EAC7B,WAASC,EAAT,CAAYC,GAAZ,EAAiB;EAAA;EAAA;;EACfC,YAAQC,GAAR,CAAY,IAAZ,EAAkBC,SAAlB;EACAF,YAAQC,GAAR,CAAY,YAAZ,EAA0BH,EAA1B,EAA8BD,IAA9B;;EAEA,QAAMM,QAAQ,SAARA,KAAQ,WAAY;EACxBH,cAAQC,GAAR,CAAY,KAAZ,EAAkBC,UAAlB;EACAF,cAAQC,GAAR,CAAY,YAAZ,EAA0BH,EAA1B,EAA8BD,IAA9B;EACD,KAHD;;EAIAM,UAAM,WAAN;EACD;;EAEDL,KAAGM,IAAH,CAAQ,YAAR,EAAsB,WAAtB;EACD;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/try-catches.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/try-catches.js
new file mode 100644
index 0000000000..67719e195d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/try-catches.js
@@ -0,0 +1,16 @@
+var rollupBabel7TryCatches = (function () {
+ 'use strict';
+
+ function root() {
+
+ try {
+ throw "AnError";
+ } catch (err) {
+ console.log("pause here", root);
+ }
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=try-catches.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/try-catches.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/try-catches.js.map
new file mode 100644
index 0000000000..adc760da8c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/try-catches.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"try-catches.js","sources":["rollup-babel7://./try-catches/input.js"],"sourcesContent":["export default function root() {\n const one = 1;\n\n try {\n throw \"AnError\";\n } catch (err) {\n let two = 2;\n console.log(\"pause here\", root);\n }\n}\n"],"names":["root","err","console","log"],"mappings":";;;EAAe,SAASA,IAAT,GAAgB;AAC7B;EAEA,MAAI;EACF,UAAM,SAAN;EACD,GAFD,CAEE,OAAOC,GAAP,EAAY;AACZ,EACAC,YAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B;EACD;EACF;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/type-module.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/type-module.js
new file mode 100644
index 0000000000..89e1c95746
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/type-module.js
@@ -0,0 +1,16 @@
+var rollupBabel7TypeModule = (function () {
+ 'use strict';
+
+ var moduleScoped = 1;
+ var alsoModuleScoped = 2;
+
+ function thirdModuleScoped() {}
+
+ function test () {
+ console.log("pause here", moduleScoped, alsoModuleScoped, thirdModuleScoped);
+ }
+
+ return test;
+
+}());
+//# sourceMappingURL=type-module.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/type-module.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/type-module.js.map
new file mode 100644
index 0000000000..7a3f4b3178
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/type-module.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"type-module.js","sources":["rollup-babel7://./type-module/input.js"],"sourcesContent":["var moduleScoped = 1;\nlet alsoModuleScoped = 2;\n\nfunction thirdModuleScoped() {}\n\nexport default function() {\n console.log(\"pause here\", moduleScoped, alsoModuleScoped, thirdModuleScoped);\n}\n"],"names":["moduleScoped","alsoModuleScoped","thirdModuleScoped","console","log"],"mappings":";;;EAAA,IAAIA,eAAe,CAAnB;EACA,IAAIC,mBAAmB,CAAvB;;EAEA,SAASC,iBAAT,GAA6B;;AAE7B,EAAe,iBAAW;EACxBC,UAAQC,GAAR,CAAY,YAAZ,EAA0BJ,YAA1B,EAAwCC,gBAAxC,EAA0DC,iBAA1D;EACD;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/webpack-functions.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/webpack-functions.js
new file mode 100644
index 0000000000..5af4d14588
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/webpack-functions.js
@@ -0,0 +1,19 @@
+var rollupBabel7WebpackFunctions = (function () {
+ 'use strict';
+
+ var module$1 = {};
+
+ module$1.exports = function (x) {
+ return x * 2;
+ };
+
+ function root() {
+ // This example is structures to look like CommonJS in order to replicate
+ // a previously-encountered bug.
+ module$1.exports(4);
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=webpack-functions.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/webpack-functions.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/webpack-functions.js.map
new file mode 100644
index 0000000000..9d4f243f5f
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/webpack-functions.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"webpack-functions.js","sources":["rollup-babel7://./webpack-functions/input.js"],"sourcesContent":["var module = {};\n\nmodule.exports = function(x) {\n return x * 2;\n};\n\n\nexport default function root() {\n // This example is structures to look like CommonJS in order to replicate\n // a previously-encountered bug.\n module.exports(4);\n}\n"],"names":["module","exports","x","root"],"mappings":";;;EAAA,IAAIA,WAAS,EAAb;;AAEAA,WAAOC,OAAP,GAAiB,UAASC,CAAT,EAAY;EAC3B,SAAOA,IAAI,CAAX;EACD,CAFD;;AAKA,EAAe,SAASC,IAAT,GAAgB;EAC7B;EACA;EACAH,WAAOC,OAAP,CAAe,CAAf;EACD;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/webpack-line-mappings.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/webpack-line-mappings.js
new file mode 100644
index 0000000000..3c135698a1
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/webpack-line-mappings.js
@@ -0,0 +1,30 @@
+var rollupBabel7WebpackLineMappings = (function () {
+ 'use strict';
+
+ var aDefault = "a-default";
+
+ function root() {
+ var one = 1;
+ {
+ var two = 2;
+
+ var fn = function someName(arg) {
+ console.log(this, arguments);
+ console.log("pause here", aDefault, one, two, fn, arg);
+
+ var inner = function inner(arg) {
+ var body = "42";
+ console.log("pause here", body, root);
+ };
+
+ inner();
+ };
+
+ fn.call("this-value", "arg-value");
+ }
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=webpack-line-mappings.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/webpack-line-mappings.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/webpack-line-mappings.js.map
new file mode 100644
index 0000000000..268f9a5a8b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup-babel7/webpack-line-mappings.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"webpack-line-mappings.js","sources":["rollup-babel7://./webpack-line-mappings/src/mod1.js","rollup-babel7://./webpack-line-mappings/input.js"],"sourcesContent":["export default \"a-default\";\n","import aDefault from \"./src/mod1\";\n\nexport default function root() {\n let one = 1;\n\n {\n const two = 2;\n\n var fn = function someName(arg) {\n console.log(this, arguments);\n console.log(\"pause here\", aDefault, one, two, fn, arg);\n\n var inner = (arg) => { var body = \"42\"; console.log(\"pause here\", body, root); };\n inner();\n };\n fn.call(\"this-value\", \"arg-value\");\n }\n}\n"],"names":["root","one","two","fn","someName","arg","console","log","arguments","aDefault","inner","body","call"],"mappings":";;;AAAA,iBAAe,WAAf;;ECEe,SAASA,IAAT,GAAgB;EAC7B,MAAIC,MAAM,CAAV;EAEA;EACE,QAAMC,MAAM,CAAZ;;EAEA,QAAIC,KAAK,SAASC,QAAT,CAAkBC,GAAlB,EAAuB;EAC9BC,cAAQC,GAAR,CAAY,IAAZ,EAAkBC,SAAlB;EACAF,cAAQC,GAAR,CAAY,YAAZ,EAA0BE,QAA1B,EAAoCR,GAApC,EAAyCC,GAAzC,EAA8CC,EAA9C,EAAkDE,GAAlD;;EAEA,UAAIK,QAAQ,SAARA,KAAQ,CAACL,GAAD,EAAS;EAAE,YAAIM,OAAO,IAAX;EAAiBL,gBAAQC,GAAR,CAAY,YAAZ,EAA0BI,IAA1B,EAAgCX,IAAhC;EAAwC,OAAhF;;EACAU;EACD,KAND;;EAOAP,OAAGS,IAAH,CAAQ,YAAR,EAAsB,WAAtB;EACD;EACF;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/classes.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/classes.js
new file mode 100644
index 0000000000..e5e9a4dae0
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/classes.js
@@ -0,0 +1,27 @@
+var rollupClasses = (function () {
+ 'use strict';
+
+ function root() {
+ let one = 1;
+
+ class Thing {
+ one() {
+ console.log("pause here");
+ }
+ }
+
+ class Another {
+ method() {
+
+ console.log("pause here", Another, one, Thing, root);
+ }
+ }
+
+ new Another().method();
+ new Thing().one();
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=classes.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/classes.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/classes.js.map
new file mode 100644
index 0000000000..630a09d6f2
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/classes.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"classes.js","sources":["rollup://./classes/input.js"],"sourcesContent":["export default function root() {\n let one = 1;\n\n class Thing {\n one() {\n console.log(\"pause here\");\n }\n }\n\n class Another {\n method() {\n let two = 2;\n\n const three = 3;\n\n console.log(\"pause here\", Another, one, Thing, root);\n }\n }\n\n new Another().method();\n new Thing().one();\n}\n"],"names":[],"mappings":";;;EAAe,SAAS,IAAI,GAAG;EAC/B,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC;;EAEd,EAAE,MAAM,KAAK,CAAC;EACd,IAAI,GAAG,GAAG;EACV,MAAM,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;EAChC,KAAK;EACL,GAAG;;EAEH,EAAE,MAAM,OAAO,CAAC;EAChB,IAAI,MAAM,GAAG;AACb,AAGA;EACA,MAAM,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;EAC3D,KAAK;EACL,GAAG;;EAEH,EAAE,IAAI,OAAO,EAAE,CAAC,MAAM,EAAE,CAAC;EACzB,EAAE,IAAI,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC;EACpB,CAAC;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/esmodules-es6.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/esmodules-es6.js
new file mode 100644
index 0000000000..af122c5593
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/esmodules-es6.js
@@ -0,0 +1,57 @@
+var rollupEsmodulesEs6 = (function () {
+ 'use strict';
+
+ var aDefault = "a-default";
+
+ const aNamed = "a-named";
+
+ const original = "an-original";
+
+ var mod4 = "a-default";
+ const aNamed$1 = "a-named";
+
+ var aNamespace = /*#__PURE__*/Object.freeze({
+ default: mod4,
+ aNamed: aNamed$1
+ });
+
+ var aDefault2 = "a-default2";
+
+ const aNamed2 = "a-named2";
+
+ const original$1 = "an-original2";
+
+ var aDefault3 = "a-default3";
+
+ const aNamed3 = "a-named3";
+
+ const original$2 = "an-original3";
+
+ function root() {
+ console.log("pause here", root);
+
+ console.log(aDefault);
+ console.log(original);
+ console.log(aNamed);
+ console.log(aNamed);
+ console.log(aNamespace);
+
+ try {
+ // None of these are callable in this code, but we still want to make sure
+ // they map properly even if the only reference is in a call expressions.
+ console.log(aDefault2());
+ console.log(original$1());
+ console.log(aNamed2());
+ console.log(aNamed2());
+
+ console.log(new aDefault3());
+ console.log(new original$2());
+ console.log(new aNamed3());
+ console.log(new aNamed3());
+ } catch (e) {}
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=esmodules-es6.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/esmodules-es6.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/esmodules-es6.js.map
new file mode 100644
index 0000000000..4d531fd823
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/esmodules-es6.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"esmodules-es6.js","sources":["rollup://./esmodules-es6/src/mod1.js","rollup://./esmodules-es6/src/mod2.js","rollup://./esmodules-es6/src/mod3.js","rollup://./esmodules-es6/src/mod4.js","rollup://./esmodules-es6/src/mod5.js","rollup://./esmodules-es6/src/mod6.js","rollup://./esmodules-es6/src/mod7.js","rollup://./esmodules-es6/src/mod9.js","rollup://./esmodules-es6/src/mod10.js","rollup://./esmodules-es6/src/mod11.js","rollup://./esmodules-es6/input.js"],"sourcesContent":["export default \"a-default\";\n","export const aNamed = \"a-named\";\n","export const original = \"an-original\";\n","export default \"a-default\";\nexport const aNamed = \"a-named\";\n","export default \"a-default2\";\n","export const aNamed2 = \"a-named2\";\n","export const original = \"an-original2\";\n","export default \"a-default3\";\n","export const aNamed3 = \"a-named3\";\n","export const original = \"an-original3\";\n","import aDefault from \"./src/mod1\";\nimport { aNamed, aNamed as anotherNamed } from \"./src/mod2\";\nimport { original as anAliased } from \"./src/mod3\";\nimport * as aNamespace from \"./src/mod4\";\n\nimport aDefault2 from \"./src/mod5\";\nimport { aNamed2, aNamed2 as anotherNamed2 } from \"./src/mod6\";\nimport { original as anAliased2 } from \"./src/mod7\";\n\nimport aDefault3 from \"./src/mod9\";\nimport { aNamed3, aNamed3 as anotherNamed3 } from \"./src/mod10\";\nimport { original as anAliased3 } from \"./src/mod11\";\n\nimport optimizedOut from \"./src/optimized-out\";\noptimizedOut();\n\nexport default function root() {\n console.log(\"pause here\", root);\n\n console.log(aDefault);\n console.log(anAliased);\n console.log(aNamed);\n console.log(anotherNamed);\n console.log(aNamespace);\n\n try {\n // None of these are callable in this code, but we still want to make sure\n // they map properly even if the only reference is in a call expressions.\n console.log(aDefault2());\n console.log(anAliased2());\n console.log(aNamed2());\n console.log(anotherNamed2());\n\n console.log(new aDefault3());\n console.log(new anAliased3());\n console.log(new aNamed3());\n console.log(new anotherNamed3());\n } catch (e) {}\n}\n\nexport function example(){}\n"],"names":["aNamed","original","anAliased","anotherNamed","anAliased2","anotherNamed2","anAliased3","anotherNamed3"],"mappings":";;;AAAA,iBAAe,WAAW,CAAC;;ECApB,MAAM,MAAM,GAAG,SAAS,CAAC;;ECAzB,MAAM,QAAQ,GAAG,aAAa,CAAC;;ACAtC,aAAe,WAAW,CAAC;AAC3B,EAAO,MAAMA,QAAM,GAAG,SAAS,CAAC;;;;;;;ACDhC,kBAAe,YAAY,CAAC;;ECArB,MAAM,OAAO,GAAG,UAAU,CAAC;;ECA3B,MAAMC,UAAQ,GAAG,cAAc,CAAC;;ACAvC,kBAAe,YAAY,CAAC;;ECArB,MAAM,OAAO,GAAG,UAAU,CAAC;;ECA3B,MAAMA,UAAQ,GAAG,cAAc,CAAC;;ECgBxB,SAAS,IAAI,GAAG;EAC/B,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;;EAElC,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;EACxB,EAAE,OAAO,CAAC,GAAG,CAACC,QAAS,CAAC,CAAC;EACzB,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;EACtB,EAAE,OAAO,CAAC,GAAG,CAACC,MAAY,CAAC,CAAC;EAC5B,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;;EAE1B,EAAE,IAAI;EACN;EACA;EACA,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;EAC7B,IAAI,OAAO,CAAC,GAAG,CAACC,UAAU,EAAE,CAAC,CAAC;EAC9B,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;EAC3B,IAAI,OAAO,CAAC,GAAG,CAACC,OAAa,EAAE,CAAC,CAAC;;EAEjC,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC;EACjC,IAAI,OAAO,CAAC,GAAG,CAAC,IAAIC,UAAU,EAAE,CAAC,CAAC;EAClC,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;EAC/B,IAAI,OAAO,CAAC,GAAG,CAAC,IAAIC,OAAa,EAAE,CAAC,CAAC;EACrC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE;EAChB,CAAC;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/esmodules.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/esmodules.js
new file mode 100644
index 0000000000..63962a37c1
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/esmodules.js
@@ -0,0 +1,57 @@
+var rollupEsmodules = (function () {
+ 'use strict';
+
+ var aDefault = "a-default";
+
+ const aNamed = "a-named";
+
+ const original = "an-original";
+
+ var mod4 = "a-default";
+ const aNamed$1 = "a-named";
+
+ var aNamespace = /*#__PURE__*/Object.freeze({
+ default: mod4,
+ aNamed: aNamed$1
+ });
+
+ var aDefault2 = "a-default2";
+
+ const aNamed2 = "a-named2";
+
+ const original$1 = "an-original2";
+
+ var aDefault3 = "a-default3";
+
+ const aNamed3 = "a-named3";
+
+ const original$2 = "an-original3";
+
+ function root() {
+ console.log("pause here", root);
+
+ console.log(aDefault);
+ console.log(original);
+ console.log(aNamed);
+ console.log(aNamed);
+ console.log(aNamespace);
+
+ try {
+ // None of these are callable in this code, but we still want to make sure
+ // they map properly even if the only reference is in a call expressions.
+ console.log(aDefault2());
+ console.log(original$1());
+ console.log(aNamed2());
+ console.log(aNamed2());
+
+ console.log(new aDefault3());
+ console.log(new original$2());
+ console.log(new aNamed3());
+ console.log(new aNamed3());
+ } catch (e) {}
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=esmodules.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/esmodules.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/esmodules.js.map
new file mode 100644
index 0000000000..cb63bbda98
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/esmodules.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"esmodules.js","sources":["rollup://./esmodules/src/mod1.js","rollup://./esmodules/src/mod2.js","rollup://./esmodules/src/mod3.js","rollup://./esmodules/src/mod4.js","rollup://./esmodules/src/mod5.js","rollup://./esmodules/src/mod6.js","rollup://./esmodules/src/mod7.js","rollup://./esmodules/src/mod9.js","rollup://./esmodules/src/mod10.js","rollup://./esmodules/src/mod11.js","rollup://./esmodules/input.js"],"sourcesContent":["export default \"a-default\";\n","export const aNamed = \"a-named\";\n","export const original = \"an-original\";\n","export default \"a-default\";\nexport const aNamed = \"a-named\";\n","export default \"a-default2\";\n","export const aNamed2 = \"a-named2\";\n","export const original = \"an-original2\";\n","export default \"a-default3\";\n","export const aNamed3 = \"a-named3\";\n","export const original = \"an-original3\";\n","import aDefault from \"./src/mod1\";\nimport { aNamed, aNamed as anotherNamed } from \"./src/mod2\";\nimport { original as anAliased } from \"./src/mod3\";\nimport * as aNamespace from \"./src/mod4\";\n\nimport aDefault2 from \"./src/mod5\";\nimport { aNamed2, aNamed2 as anotherNamed2 } from \"./src/mod6\";\nimport { original as anAliased2 } from \"./src/mod7\";\n\nimport aDefault3 from \"./src/mod9\";\nimport { aNamed3, aNamed3 as anotherNamed3 } from \"./src/mod10\";\nimport { original as anAliased3 } from \"./src/mod11\";\n\nimport optimizedOut from \"./src/optimized-out\";\noptimizedOut();\n\nexport default function root() {\n console.log(\"pause here\", root);\n\n console.log(aDefault);\n console.log(anAliased);\n console.log(aNamed);\n console.log(anotherNamed);\n console.log(aNamespace);\n\n try {\n // None of these are callable in this code, but we still want to make sure\n // they map properly even if the only reference is in a call expressions.\n console.log(aDefault2());\n console.log(anAliased2());\n console.log(aNamed2());\n console.log(anotherNamed2());\n\n console.log(new aDefault3());\n console.log(new anAliased3());\n console.log(new aNamed3());\n console.log(new anotherNamed3());\n } catch (e) {}\n}\n\nexport function example(){}\n"],"names":["aNamed","original","anAliased","anotherNamed","anAliased2","anotherNamed2","anAliased3","anotherNamed3"],"mappings":";;;AAAA,iBAAe,WAAW,CAAC;;ECApB,MAAM,MAAM,GAAG,SAAS,CAAC;;ECAzB,MAAM,QAAQ,GAAG,aAAa,CAAC;;ACAtC,aAAe,WAAW,CAAC;AAC3B,EAAO,MAAMA,QAAM,GAAG,SAAS,CAAC;;;;;;;ACDhC,kBAAe,YAAY,CAAC;;ECArB,MAAM,OAAO,GAAG,UAAU,CAAC;;ECA3B,MAAMC,UAAQ,GAAG,cAAc,CAAC;;ACAvC,kBAAe,YAAY,CAAC;;ECArB,MAAM,OAAO,GAAG,UAAU,CAAC;;ECA3B,MAAMA,UAAQ,GAAG,cAAc,CAAC;;ECgBxB,SAAS,IAAI,GAAG;EAC/B,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;;EAElC,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;EACxB,EAAE,OAAO,CAAC,GAAG,CAACC,QAAS,CAAC,CAAC;EACzB,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;EACtB,EAAE,OAAO,CAAC,GAAG,CAACC,MAAY,CAAC,CAAC;EAC5B,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;;EAE1B,EAAE,IAAI;EACN;EACA;EACA,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;EAC7B,IAAI,OAAO,CAAC,GAAG,CAACC,UAAU,EAAE,CAAC,CAAC;EAC9B,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;EAC3B,IAAI,OAAO,CAAC,GAAG,CAACC,OAAa,EAAE,CAAC,CAAC;;EAEjC,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC;EACjC,IAAI,OAAO,CAAC,GAAG,CAAC,IAAIC,UAAU,EAAE,CAAC,CAAC;EAClC,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;EAC/B,IAAI,OAAO,CAAC,GAAG,CAAC,IAAIC,OAAa,EAAE,CAAC,CAAC;EACrC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE;EAChB,CAAC;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/eval-maps.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/eval-maps.js
new file mode 100644
index 0000000000..00089daeb8
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/eval-maps.js
@@ -0,0 +1,18 @@
+var rollupEvalMaps = (function () {
+ 'use strict';
+
+ function root() {
+ var one = 1;
+
+ {
+ let two = 4;
+ const three = 5;
+
+ console.log("pause here", one, two, three);
+ }
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=eval-maps.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/eval-maps.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/eval-maps.js.map
new file mode 100644
index 0000000000..430d94cefc
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/eval-maps.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"eval-maps.js","sources":["rollup://./eval-maps/input.js"],"sourcesContent":["\nexport default function root() {\n var one = 1;\n let two = 2;\n const three = 3;\n\n one;\n two;\n\n {\n let two = 4;\n const three = 5;\n\n console.log(\"pause here\", one, two, three);\n }\n}\n"],"names":[],"mappings":";;;EACe,SAAS,IAAI,GAAG;EAC/B,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC;AACd,AAKA;EACA,EAAE;EACF,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC;EAChB,IAAI,MAAM,KAAK,GAAG,CAAC,CAAC;;EAEpB,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;EAC/C,GAAG;EACH,CAAC;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/for-loops.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/for-loops.js
new file mode 100644
index 0000000000..a815898dff
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/for-loops.js
@@ -0,0 +1,22 @@
+var rollupForLoops = (function () {
+ 'use strict';
+
+ function root() {
+
+ for (let i = 1; i < 2; i++) {
+ console.log("pause here", root);
+ }
+
+ for (let i in { 2: "" }) {
+ console.log("pause here", root);
+ }
+
+ for (let i of [3]) {
+ console.log("pause here", root);
+ }
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=for-loops.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/for-loops.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/for-loops.js.map
new file mode 100644
index 0000000000..8a5fed4e83
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/for-loops.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"for-loops.js","sources":["rollup://./for-loops/input.js"],"sourcesContent":["export default function root() {\n let i = 0;\n\n for (let i = 1; i < 2; i++) {\n console.log(\"pause here\", root);\n }\n\n for (let i in { 2: \"\" }) {\n console.log(\"pause here\", root);\n }\n\n for (let i of [3]) {\n console.log(\"pause here\", root);\n }\n}\n"],"names":[],"mappings":";;;EAAe,SAAS,IAAI,GAAG;AAC/B,AACA;EACA,EAAE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;EAC9B,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;EACpC,GAAG;;EAEH,EAAE,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE;EAC3B,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;EACpC,GAAG;;EAEH,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;EACrB,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;EACpC,GAAG;EACH,CAAC;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/for-of.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/for-of.js
new file mode 100644
index 0000000000..1c41f890de
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/for-of.js
@@ -0,0 +1,18 @@
+var rollupForOf = (function () {
+ 'use strict';
+
+ function forOf() {
+ for (const x of [1]) {
+ doThing(x);
+ }
+
+ function doThing(arg) {
+ // Avoid optimize out
+ window.console;
+ }
+ }
+
+ return forOf;
+
+}());
+//# sourceMappingURL=for-of.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/for-of.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/for-of.js.map
new file mode 100644
index 0000000000..a1dfed5718
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/for-of.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"for-of.js","sources":["rollup://./for-of/input.js"],"sourcesContent":["const mod = \"module scoped\";\n\nexport default function forOf() {\n for (const x of [1]) {\n doThing(x);\n }\n\n function doThing(arg) {\n // Avoid optimize out\n window.console;\n }\n}\n"],"names":[],"mappings":";;;EAEe,SAAS,KAAK,GAAG;EAChC,EAAE,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;EACvB,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;EACf,GAAG;;EAEH,EAAE,SAAS,OAAO,CAAC,GAAG,EAAE;EACxB;EACA,IAAI,MAAM,CAAC,OAAO,CAAC;EACnB,GAAG;EACH,CAAC;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/functions.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/functions.js
new file mode 100644
index 0000000000..4945fe07d8
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/functions.js
@@ -0,0 +1,22 @@
+var rollupFunctions = (function () {
+ 'use strict';
+
+ function root() {
+
+ function decl(p1) {
+ const inner = function inner(p2) {
+ const arrow = (p3) => {
+ console.log("pause here", p3, arrow, p2, inner, p1, decl, root);
+ };
+ arrow();
+ };
+ inner();
+ }
+
+ decl();
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=functions.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/functions.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/functions.js.map
new file mode 100644
index 0000000000..45082389ac
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/functions.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"functions.js","sources":["rollup://./functions/input.js"],"sourcesContent":["export default function root() {\n\n function decl(p1) {\n const inner = function inner(p2) {\n const arrow = (p3) => {\n console.log(\"pause here\", p3, arrow, p2, inner, p1, decl, root);\n };\n arrow();\n };\n inner();\n }\n\n decl();\n}\n"],"names":[],"mappings":";;;EAAe,SAAS,IAAI,GAAG;;EAE/B,EAAE,SAAS,IAAI,CAAC,EAAE,EAAE;EACpB,IAAI,MAAM,KAAK,GAAG,SAAS,KAAK,CAAC,EAAE,EAAE;EACrC,MAAM,MAAM,KAAK,GAAG,CAAC,EAAE,KAAK;EAC5B,QAAQ,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;EACxE,OAAO,CAAC;EACR,MAAM,KAAK,EAAE,CAAC;EACd,KAAK,CAAC;EACN,IAAI,KAAK,EAAE,CAAC;EACZ,GAAG;;EAEH,EAAE,IAAI,EAAE,CAAC;EACT,CAAC;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/lex-and-nonlex.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/lex-and-nonlex.js
new file mode 100644
index 0000000000..298131dc8d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/lex-and-nonlex.js
@@ -0,0 +1,17 @@
+var rollupLexAndNonlex = (function () {
+ 'use strict';
+
+ function root() {
+ function someHelper(){
+ console.log("pause here", root, Thing);
+ }
+
+ class Thing {}
+
+ someHelper();
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=lex-and-nonlex.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/lex-and-nonlex.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/lex-and-nonlex.js.map
new file mode 100644
index 0000000000..ff4dd74e2d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/lex-and-nonlex.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"lex-and-nonlex.js","sources":["rollup://./lex-and-nonlex/input.js"],"sourcesContent":["export default function root() {\n function someHelper(){\n console.log(\"pause here\", root, Thing);\n }\n\n class Thing {}\n\n someHelper();\n}\n"],"names":[],"mappings":";;;EAAe,SAAS,IAAI,GAAG;EAC/B,EAAE,SAAS,UAAU,EAAE;EACvB,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;EAC3C,GAAG;;EAEH,EAAE,MAAM,KAAK,CAAC,EAAE;;EAEhB,EAAE,UAAU,EAAE,CAAC;EACf,CAAC;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/line-start-bindings-es6.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/line-start-bindings-es6.js
new file mode 100644
index 0000000000..99e4713c0d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/line-start-bindings-es6.js
@@ -0,0 +1,20 @@
+var rollupLineStartBindingsEs6 = (function () {
+ 'use strict';
+
+ function root() {
+ function aFunc(){
+
+ // The 'this' binding here is also its own line, so the comment above
+ // applies here too.
+ this.thing = 4;
+
+ console.log("pause here", root);
+ }
+
+ aFunc.call({ });
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=line-start-bindings-es6.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/line-start-bindings-es6.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/line-start-bindings-es6.js.map
new file mode 100644
index 0000000000..3d2814ad78
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/line-start-bindings-es6.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"line-start-bindings-es6.js","sources":["rollup://./line-start-bindings-es6/input.js"],"sourcesContent":["\nexport default function root() {\n function aFunc(){\n // Since these bindings are on their own linem, the mappings will\n // extend to the start of the line, rather than starting at the first\n // character of the binding.\n const {\n one,\n two\n } = {\n one: 1,\n two: 2,\n };\n\n // The 'this' binding here is also its own line, so the comment above\n // applies here too.\n this.thing = 4;\n\n console.log(\"pause here\", root);\n }\n\n aFunc.call({ });\n}\n"],"names":[],"mappings":";;;EACe,SAAS,IAAI,GAAG;EAC/B,EAAE,SAAS,KAAK,EAAE;AAClB,AAUA;EACA;EACA;EACA,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;;EAEnB,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;EACpC,GAAG;;EAEH,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;EAClB,CAAC;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/shadowed-vars.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/shadowed-vars.js
new file mode 100644
index 0000000000..6001b6572c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/shadowed-vars.js
@@ -0,0 +1,16 @@
+var rollupShadowedVars = (function () {
+ 'use strict';
+
+ function test() {
+ {
+ {
+
+ console.log("pause here");
+ }
+ }
+ }
+
+ return test;
+
+}());
+//# sourceMappingURL=shadowed-vars.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/shadowed-vars.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/shadowed-vars.js.map
new file mode 100644
index 0000000000..f06d69ebdc
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/shadowed-vars.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"shadowed-vars.js","sources":["rollup://./shadowed-vars/input.js"],"sourcesContent":["export default function() {\n var aVar = \"var1\";\n let aLet = \"let1\";\n const aConst = \"const1\";\n\n class Outer {}\n {\n function Outer() {}\n\n var aVar = \"var2\";\n let aLet = \"let2\";\n const aConst = \"const2\";\n {\n var aVar = \"var3\";\n let aLet = \"let3\";\n const aConst = \"const3\";\n\n console.log(\"pause here\");\n }\n }\n}\n"],"names":[],"mappings":";;;EAAe,aAAQ,GAAG;AAC1B,EAKA,EAAE;AACF,EAKA,IAAI;AACJ,AAGA;EACA,MAAM,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;EAChC,KAAK;EACL,GAAG;EACH,CAAC;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-for-of-array-closure.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-for-of-array-closure.js
new file mode 100644
index 0000000000..f710f5e890
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-for-of-array-closure.js
@@ -0,0 +1,18 @@
+var rollupStepOverForOfArrayClosure = (function () {
+ 'use strict';
+
+ // Babel will optimize this for..of because it call tell the value is an array.
+ function root() {
+ console.log("pause here");
+
+ for (const val of [1, 2]) {
+ console.log("pause again", (() => val)());
+ }
+
+ console.log("done");
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=step-over-for-of-array-closure.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-for-of-array-closure.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-for-of-array-closure.js.map
new file mode 100644
index 0000000000..0b583651c2
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-for-of-array-closure.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"step-over-for-of-array-closure.js","sources":["rollup://./step-over-for-of-array-closure/input.js"],"sourcesContent":["// Babel will optimize this for..of because it call tell the value is an array.\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of [1, 2]) {\n console.log(\"pause again\", (() => val)());\n }\n\n console.log(\"done\");\n}\n"],"names":[],"mappings":";;;EAAA;AACA,EAAe,SAAS,IAAI,GAAG;EAC/B,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;;EAE5B,EAAE,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;EAC5B,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;EAC9C,GAAG;;EAEH,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;EACtB,CAAC;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-for-of-array.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-for-of-array.js
new file mode 100644
index 0000000000..53c8583c64
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-for-of-array.js
@@ -0,0 +1,18 @@
+var rollupStepOverForOfArray = (function () {
+ 'use strict';
+
+ // Babel will optimize this for..of because it call tell the value is an array.
+ function root() {
+ console.log("pause here");
+
+ for (const val of [1, 2]) {
+ console.log("pause again", val);
+ }
+
+ console.log("done");
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=step-over-for-of-array.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-for-of-array.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-for-of-array.js.map
new file mode 100644
index 0000000000..21ee08091d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-for-of-array.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"step-over-for-of-array.js","sources":["rollup://./step-over-for-of-array/input.js"],"sourcesContent":["// Babel will optimize this for..of because it call tell the value is an array.\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of [1, 2]) {\n console.log(\"pause again\", val);\n }\n\n console.log(\"done\");\n}\n"],"names":[],"mappings":";;;EAAA;AACA,EAAe,SAAS,IAAI,GAAG;EAC/B,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;;EAE5B,EAAE,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;EAC5B,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;EACpC,GAAG;;EAEH,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;EACtB,CAAC;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-for-of-closure.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-for-of-closure.js
new file mode 100644
index 0000000000..dcd77a6d18
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-for-of-closure.js
@@ -0,0 +1,21 @@
+var rollupStepOverForOfClosure = (function () {
+ 'use strict';
+
+ // Babel will convert the loop body to a function to handle the 'val' lexical
+ // enclosure behavior.
+ const vals = [1, 2];
+
+ function root() {
+ console.log("pause here");
+
+ for (const val of vals) {
+ console.log("pause again", (() => val)());
+ }
+
+ console.log("done");
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=step-over-for-of-closure.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-for-of-closure.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-for-of-closure.js.map
new file mode 100644
index 0000000000..2d85c2088e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-for-of-closure.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"step-over-for-of-closure.js","sources":["rollup://./step-over-for-of-closure/input.js"],"sourcesContent":["// Babel will convert the loop body to a function to handle the 'val' lexical\n// enclosure behavior.\nconst vals = [1, 2];\n\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of vals) {\n console.log(\"pause again\", (() => val)());\n }\n\n console.log(\"done\");\n}\n"],"names":[],"mappings":";;;EAAA;EACA;EACA,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;;AAEpB,EAAe,SAAS,IAAI,GAAG;EAC/B,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;;EAE5B,EAAE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;EAC1B,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;EAC9C,GAAG;;EAEH,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;EACtB,CAAC;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-for-of.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-for-of.js
new file mode 100644
index 0000000000..09c47a7ed4
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-for-of.js
@@ -0,0 +1,19 @@
+var rollupStepOverForOf = (function () {
+ 'use strict';
+
+ const vals = [1, 2];
+
+ function root() {
+ console.log("pause here");
+
+ for (const val of vals) {
+ console.log("pause again", val);
+ }
+
+ console.log("done");
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=step-over-for-of.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-for-of.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-for-of.js.map
new file mode 100644
index 0000000000..3eb7258dd8
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-for-of.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"step-over-for-of.js","sources":["rollup://./step-over-for-of/input.js"],"sourcesContent":["const vals = [1, 2];\n\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of vals) {\n console.log(\"pause again\", val);\n }\n\n console.log(\"done\");\n}\n"],"names":[],"mappings":";;;EAAA,MAAM,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;;AAEpB,EAAe,SAAS,IAAI,GAAG;EAC/B,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;;EAE5B,EAAE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;EAC1B,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;EACpC,GAAG;;EAEH,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;EACtB,CAAC;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-function-params.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-function-params.js
new file mode 100644
index 0000000000..fc581f83a4
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-function-params.js
@@ -0,0 +1,16 @@
+var rollupStepOverFunctionParams = (function () {
+ 'use strict';
+
+ function test(a1, a2 = 45, { a3, a4, a5: { a6: a7 } = {} } = {}) {
+ console.log("pause next here");
+ }
+
+ function fn() {
+ console.log("pause here");
+ test("1", undefined, { a3: "3", a4: "4", a5: { a6: "7" } });
+ }
+
+ return fn;
+
+}());
+//# sourceMappingURL=step-over-function-params.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-function-params.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-function-params.js.map
new file mode 100644
index 0000000000..37c1bb7abc
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-function-params.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"step-over-function-params.js","sources":["rollup://./step-over-function-params/input.js"],"sourcesContent":["function test(a1, a2 = 45, { a3, a4, a5: { a6: a7 } = {} } = {}) {\n console.log(\"pause next here\");\n}\n\nexport default function fn() {\n console.log(\"pause here\");\n test(\"1\", undefined, { a3: \"3\", a4: \"4\", a5: { a6: \"7\" } });\n}\n"],"names":[],"mappings":";;;EAAA,SAAS,IAAI,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,EAAE;EACjE,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;EACjC,CAAC;;AAED,EAAe,SAAS,EAAE,GAAG;EAC7B,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;EAC5B,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;EAC9D,CAAC;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-regenerator-await.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-regenerator-await.js
new file mode 100644
index 0000000000..874f36c69b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-regenerator-await.js
@@ -0,0 +1,23 @@
+var rollupStepOverRegeneratorAwait = (function () {
+ 'use strict';
+
+ var fn = async function fn() {
+ console.log("pause here");
+
+ await doAsync();
+
+ console.log("stopped here");
+ };
+
+ function doAsync() {
+ return Promise.resolve();
+ }
+
+ function root() {
+ fn();
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=step-over-regenerator-await.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-regenerator-await.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-regenerator-await.js.map
new file mode 100644
index 0000000000..8f6cbae72e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/step-over-regenerator-await.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"step-over-regenerator-await.js","sources":["rollup://./step-over-regenerator-await/input.js"],"sourcesContent":["var fn = async function fn() {\n console.log(\"pause here\");\n\n await doAsync();\n\n console.log(\"stopped here\");\n};\n\nfunction doAsync() {\n return Promise.resolve();\n}\n\nexport default function root() {\n fn();\n}\n"],"names":[],"mappings":";;;EAAA,IAAI,EAAE,GAAG,eAAe,EAAE,GAAG;EAC7B,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;;EAE5B,EAAE,MAAM,OAAO,EAAE,CAAC;;EAElB,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;EAC9B,CAAC,CAAC;;EAEF,SAAS,OAAO,GAAG;EACnB,EAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;EAC3B,CAAC;;AAED,EAAe,SAAS,IAAI,GAAG;EAC/B,EAAE,EAAE,EAAE,CAAC;EACP,CAAC;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/switches.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/switches.js
new file mode 100644
index 0000000000..dea2f46f06
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/switches.js
@@ -0,0 +1,18 @@
+var rollupSwitches = (function () {
+ 'use strict';
+
+ function root() {
+
+ switch (true) {
+ case true:
+ console.log("pause here", root);
+ default: {
+ console.log("pause here", root);
+ }
+ }
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=switches.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/switches.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/switches.js.map
new file mode 100644
index 0000000000..2e2049035f
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/switches.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"switches.js","sources":["rollup://./switches/input.js"],"sourcesContent":["export default function root() {\n let val = 1;\n\n switch (true) {\n case true:\n let val = 2;\n console.log(\"pause here\", root);\n default: {\n let val = 3;\n console.log(\"pause here\", root);\n }\n }\n}\n"],"names":[],"mappings":";;;EAAe,SAAS,IAAI,GAAG;AAC/B,AACA;EACA,EAAE,QAAQ,IAAI;EACd,IAAI,KAAK,IAAI;AACb,EACA,MAAM,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;EACtC,IAAI,SAAS;AACb,EACA,MAAM,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;EACtC,KAAK;EACL,GAAG;EACH,CAAC;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/this-arguments-bindings.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/this-arguments-bindings.js
new file mode 100644
index 0000000000..a164328369
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/this-arguments-bindings.js
@@ -0,0 +1,22 @@
+var rollupThisArgumentsBindings = (function () {
+ 'use strict';
+
+ function root() {
+ function fn(arg) {
+ console.log(this, arguments);
+ console.log("pause here", fn, root);
+
+ const arrow = argArrow => {
+ console.log(this, arguments);
+ console.log("pause here", fn, root);
+ };
+ arrow("arrow-arg");
+ }
+
+ fn.call("this-value", "arg-value");
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=this-arguments-bindings.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/this-arguments-bindings.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/this-arguments-bindings.js.map
new file mode 100644
index 0000000000..78be7e6076
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/this-arguments-bindings.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"this-arguments-bindings.js","sources":["rollup://./this-arguments-bindings/input.js"],"sourcesContent":["export default function root() {\n function fn(arg) {\n console.log(this, arguments);\n console.log(\"pause here\", fn, root);\n\n const arrow = argArrow => {\n console.log(this, arguments);\n console.log(\"pause here\", fn, root);\n };\n arrow(\"arrow-arg\");\n }\n\n fn.call(\"this-value\", \"arg-value\");\n}\n"],"names":[],"mappings":";;;EAAe,SAAS,IAAI,GAAG;EAC/B,EAAE,SAAS,EAAE,CAAC,GAAG,EAAE;EACnB,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;EACjC,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;;EAExC,IAAI,MAAM,KAAK,GAAG,QAAQ,IAAI;EAC9B,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;EACnC,MAAM,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;EAC1C,KAAK,CAAC;EACN,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;EACvB,GAAG;;EAEH,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;EACrC,CAAC;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/try-catches.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/try-catches.js
new file mode 100644
index 0000000000..91b15785c1
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/try-catches.js
@@ -0,0 +1,16 @@
+var rollupTryCatches = (function () {
+ 'use strict';
+
+ function root() {
+
+ try {
+ throw "AnError";
+ } catch (err) {
+ console.log("pause here", root);
+ }
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=try-catches.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/try-catches.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/try-catches.js.map
new file mode 100644
index 0000000000..e7d733f435
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/try-catches.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"try-catches.js","sources":["rollup://./try-catches/input.js"],"sourcesContent":["export default function root() {\n const one = 1;\n\n try {\n throw \"AnError\";\n } catch (err) {\n let two = 2;\n console.log(\"pause here\", root);\n }\n}\n"],"names":[],"mappings":";;;EAAe,SAAS,IAAI,GAAG;AAC/B,AACA;EACA,EAAE,IAAI;EACN,IAAI,MAAM,SAAS,CAAC;EACpB,GAAG,CAAC,OAAO,GAAG,EAAE;AAChB,EACA,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;EACpC,GAAG;EACH,CAAC;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/type-module.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/type-module.js
new file mode 100644
index 0000000000..16e20219af
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/type-module.js
@@ -0,0 +1,16 @@
+var rollupTypeModule = (function () {
+ 'use strict';
+
+ var moduleScoped = 1;
+ let alsoModuleScoped = 2;
+
+ function thirdModuleScoped() {}
+
+ function test() {
+ console.log("pause here", moduleScoped, alsoModuleScoped, thirdModuleScoped);
+ }
+
+ return test;
+
+}());
+//# sourceMappingURL=type-module.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/type-module.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/type-module.js.map
new file mode 100644
index 0000000000..e9a6f0dc99
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/type-module.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"type-module.js","sources":["rollup://./type-module/input.js"],"sourcesContent":["var moduleScoped = 1;\nlet alsoModuleScoped = 2;\n\nfunction thirdModuleScoped() {}\n\nexport default function() {\n console.log(\"pause here\", moduleScoped, alsoModuleScoped, thirdModuleScoped);\n}\n"],"names":[],"mappings":";;;EAAA,IAAI,YAAY,GAAG,CAAC,CAAC;EACrB,IAAI,gBAAgB,GAAG,CAAC,CAAC;;EAEzB,SAAS,iBAAiB,GAAG,EAAE;;AAE/B,EAAe,aAAQ,GAAG;EAC1B,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,CAAC;EAC/E,CAAC;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/typescript-classes.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/typescript-classes.js
new file mode 100644
index 0000000000..444286f62d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/typescript-classes.js
@@ -0,0 +1,97 @@
+var rollupTypescriptClasses = (function () {
+ 'use strict';
+
+ /*! *****************************************************************************
+ Copyright (c) Microsoft Corporation. All rights reserved.
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use
+ this file except in compliance with the License. You may obtain a copy of the
+ License at http://www.apache.org/licenses/LICENSE-2.0
+
+ THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
+ WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
+ MERCHANTABLITY OR NON-INFRINGEMENT.
+
+ See the Apache Version 2.0 License for specific language governing permissions
+ and limitations under the License.
+ ***************************************************************************** */
+ /* global Reflect, Promise */
+
+ var extendStatics = function(d, b) {
+ extendStatics = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+ return extendStatics(d, b);
+ };
+
+ function __extends(d, b) {
+ extendStatics(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ }
+
+ function __decorate(decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+ }
+
+ function decoratorFactory(opts) {
+ return function decorator(target) {
+ return target;
+ };
+ }
+
+ // This file essentially reproduces an example Angular component to map testing,
+ var AppComponent = /** @class */ (function () {
+ function AppComponent() {
+ this.title = 'app';
+ }
+ AppComponent = __decorate([
+ decoratorFactory({
+ selector: 'app-root'
+ })
+ ], AppComponent);
+ return AppComponent;
+ }());
+ var fn = function (arg) {
+ console.log("here");
+ };
+ fn("arg");
+ var AnotherThing = /** @class */ (function () {
+ function AnotherThing() {
+ this.prop = 4;
+ }
+ return AnotherThing;
+ }());
+ var SubDecl = /** @class */ (function (_super) {
+ __extends(SubDecl, _super);
+ function SubDecl() {
+ var _this = _super !== null && _super.apply(this, arguments) || this;
+ _this.prop = 4;
+ return _this;
+ }
+ return SubDecl;
+ }(AnotherThing));
+ var SubVar = /** @class */ (function (_super) {
+ __extends(SubExpr, _super);
+ function SubExpr() {
+ var _this = _super !== null && _super.apply(this, arguments) || this;
+ _this.prop = 4;
+ return _this;
+ }
+ return SubExpr;
+ }(AnotherThing));
+ function test () {
+ // This file is specifically for testing the mappings of classes and things
+ // above, which means we don't want to include _other_ references to then.
+ // To avoid having them be optimized out, we include a no-op eval.
+ eval("");
+ console.log("pause here");
+ }
+
+ return test;
+
+}());
+//# sourceMappingURL=typescript-classes.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/typescript-classes.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/typescript-classes.js.map
new file mode 100644
index 0000000000..9934d26f5a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/typescript-classes.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"typescript-classes.js","sources":["rollup://./typescript-classes/src/mod.ts","rollup://./typescript-classes/input.ts"],"sourcesContent":["\nexport function decoratorFactory(opts: { selector: string }) {\n return function decorator(target) {\n return <any>target;\n };\n}\n\nexport default function def() {}\n","// This file essentially reproduces an example Angular component to map testing,\n// among other typescript edge cases.\n\nimport def, { decoratorFactory } from './src/mod.ts';\n\nimport * as ns from './src/mod.ts';\n\n@decoratorFactory({\n selector: 'app-root',\n})\nexport class AppComponent {\n title = 'app';\n}\n\nconst fn = arg => {\n console.log(\"here\");\n};\nfn(\"arg\");\n\n// Un-decorated exported classes present a mapping challege because\n// the class name is mapped to an unhelpful export assignment.\nexport class ExportedOther {\n title = 'app';\n}\n\nclass AnotherThing {\n prop = 4;\n}\n\nconst ExpressionClass = class Foo {\n prop = 4;\n};\n\nclass SubDecl extends AnotherThing {\n prop = 4;\n}\n\nlet SubVar = class SubExpr extends AnotherThing {\n prop = 4;\n};\n\nns;\n\nexport default function(){\n // This file is specifically for testing the mappings of classes and things\n // above, which means we don't want to include _other_ references to then.\n // To avoid having them be optimized out, we include a no-op eval.\n eval(\"\");\n\n console.log(\"pause here\");\n}\n"],"names":["tslib_1.__extends"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8BACiC,IAA0B;QACzD,OAAO,mBAAmB,MAAM;YAC9B,OAAY,MAAM,CAAC;SACpB,CAAC;IACJ,CAAC;;ICLD;AACA,IASA;QAHA;YAIE,UAAK,GAAG,KAAK,CAAC;SACf;QAFY,YAAY;YAHxB,gBAAgB,CAAC;gBAChB,QAAQ,EAAE,UAAU;aACrB,CAAC;WACW,YAAY,CAExB;QAAD,mBAAC;KAFD,IAEC;IAED,IAAM,EAAE,GAAG,UAAA,GAAG;QACZ,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC,CAAC;IACF,EAAE,CAAC,KAAK,CAAC,CAAC;AAEV,IAMA;QAAA;YACE,SAAI,GAAG,CAAC,CAAC;SACV;QAAD,mBAAC;IAAD,CAAC,IAAA;AAED,IAIA;QAAsBA,2BAAY;QAAlC;YAAA,qEAEC;YADC,UAAI,GAAG,CAAC,CAAC;;SACV;QAAD,cAAC;IAAD,CAFA,CAAsB,YAAY,GAEjC;IAED,IAAI,MAAM;QAAyBA,2BAAY;QAAlC;YAAA,qEAEZ;YADC,UAAI,GAAG,CAAC,CAAC;;SACV;QAAD,cAAC;IAAD,CAAC,CAFkC,YAAY,EAE9C,CAAC;AAEF;;;;QAME,IAAI,CAAC,EAAE,CAAC,CAAC;QAET,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAC5B,CAAC;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/webpack-functions.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/webpack-functions.js
new file mode 100644
index 0000000000..f285718e0b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/webpack-functions.js
@@ -0,0 +1,20 @@
+var rollupWebpackFunctions = (function () {
+ 'use strict';
+
+ var module$1 = {};
+
+ module$1.exports = function(x) {
+ return x * 2;
+ };
+
+
+ function root() {
+ // This example is structures to look like CommonJS in order to replicate
+ // a previously-encountered bug.
+ module$1.exports(4);
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=webpack-functions.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/webpack-functions.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/webpack-functions.js.map
new file mode 100644
index 0000000000..d09ef973f9
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/webpack-functions.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"webpack-functions.js","sources":["rollup://./webpack-functions/input.js"],"sourcesContent":["var module = {};\n\nmodule.exports = function(x) {\n return x * 2;\n};\n\n\nexport default function root() {\n // This example is structures to look like CommonJS in order to replicate\n // a previously-encountered bug.\n module.exports(4);\n}\n"],"names":["module"],"mappings":";;;EAAA,IAAIA,QAAM,GAAG,EAAE,CAAC;;AAEhBA,UAAM,CAAC,OAAO,GAAG,SAAS,CAAC,EAAE;EAC7B,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;EACf,CAAC,CAAC;;;AAGF,EAAe,SAAS,IAAI,GAAG;EAC/B;EACA;EACA,EAAEA,QAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;EACpB,CAAC;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/webpack-line-mappings.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/webpack-line-mappings.js
new file mode 100644
index 0000000000..6bf7cbe837
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/webpack-line-mappings.js
@@ -0,0 +1,26 @@
+var rollupWebpackLineMappings = (function () {
+ 'use strict';
+
+ var aDefault = "a-default";
+
+ function root() {
+ let one = 1;
+
+ {
+ const two = 2;
+
+ var fn = function someName(arg) {
+ console.log(this, arguments);
+ console.log("pause here", aDefault, one, two, fn, arg);
+
+ var inner = (arg) => { var body = "42"; console.log("pause here", body, root); };
+ inner();
+ };
+ fn.call("this-value", "arg-value");
+ }
+ }
+
+ return root;
+
+}());
+//# sourceMappingURL=webpack-line-mappings.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/webpack-line-mappings.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/webpack-line-mappings.js.map
new file mode 100644
index 0000000000..b9b3907f07
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/rollup/webpack-line-mappings.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"webpack-line-mappings.js","sources":["rollup://./webpack-line-mappings/src/mod1.js","rollup://./webpack-line-mappings/input.js"],"sourcesContent":["export default \"a-default\";\n","import aDefault from \"./src/mod1\";\n\nexport default function root() {\n let one = 1;\n\n {\n const two = 2;\n\n var fn = function someName(arg) {\n console.log(this, arguments);\n console.log(\"pause here\", aDefault, one, two, fn, arg);\n\n var inner = (arg) => { var body = \"42\"; console.log(\"pause here\", body, root); };\n inner();\n };\n fn.call(\"this-value\", \"arg-value\");\n }\n}\n"],"names":[],"mappings":";;;AAAA,iBAAe,WAAW,CAAC;;ECEZ,SAAS,IAAI,GAAG;EAC/B,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC;;EAEd,EAAE;EACF,IAAI,MAAM,GAAG,GAAG,CAAC,CAAC;;EAElB,IAAI,IAAI,EAAE,GAAG,SAAS,QAAQ,CAAC,GAAG,EAAE;EACpC,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;EACnC,MAAM,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;;EAE7D,MAAM,IAAI,KAAK,GAAG,CAAC,GAAG,KAAK,EAAE,IAAI,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;EACvF,MAAM,KAAK,EAAE,CAAC;EACd,KAAK,CAAC;EACN,IAAI,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;EACvC,GAAG;EACH,CAAC;;;;;;;;"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/babel-bindings-with-flow.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/babel-bindings-with-flow.js
new file mode 100644
index 0000000000..b0c90f0836
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/babel-bindings-with-flow.js
@@ -0,0 +1,96 @@
+var webpack3Babel6BabelBindingsWithFlow =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_mod__ = __webpack_require__(1);
+// Webpack doesn't map import declarations well, so doing this forces binding
+// processing to only process the binding being cast when searching for
+// matches. That way we can properly test if the flow cast causes problems.
+
+
+function root() {
+ var value = __WEBPACK_IMPORTED_MODULE_0__src_mod__["a" /* aNamed */];
+
+ console.log("pause here", root, value);
+}
+
+/***/ }),
+/* 1 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return aNamed; });
+var aNamed = "a-named";
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=babel-bindings-with-flow.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/babel-bindings-with-flow.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/babel-bindings-with-flow.js.map
new file mode 100644
index 0000000000..9c20a446fa
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/babel-bindings-with-flow.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel6://./babel-bindings-with-flow/webpack/bootstrap 08ffe4d8a15700def144","webpack3-babel6://./babel-bindings-with-flow/./input.js","webpack3-babel6://./babel-bindings-with-flow/./src/mod.js"],"names":["root","value","console","log","aNamed"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;AC7DA;AAAA;AACA;AACA;AACA;;AAEe,SAASA,IAAT,GAAgB;AAC7B,MAAIC,QAAS,wDAAb;;AAEAC,UAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B,EAAgCC,KAAhC;AACD,C;;;;;;;;ACTM,IAAMG,SAAS,SAAf,C","file":"babel-bindings-with-flow.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 08ffe4d8a15700def144","// Webpack doesn't map import declarations well, so doing this forces binding\n// processing to only process the binding being cast when searching for\n// matches. That way we can properly test if the flow cast causes problems.\nimport { aNamed } from \"./src/mod\";\n\nexport default function root() {\n var value = (aNamed: Array<string>);\n\n console.log(\"pause here\", root, value);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js","export const aNamed = \"a-named\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/babel-classes.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/babel-classes.js
new file mode 100644
index 0000000000..185cc4e311
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/babel-classes.js
@@ -0,0 +1,107 @@
+var webpack3Babel6BabelClasses =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function root() {
+ var Another = function () {
+ function Another() {
+ var _this = this;
+
+ _classCallCheck(this, Another);
+
+ this.bound = function () {
+ return _this;
+ };
+ }
+
+ _createClass(Another, [{
+ key: "method",
+ value: function method() {
+ var two = 2;
+
+ console.log("pause here", Another, root);
+ }
+ }]);
+
+ return Another;
+ }();
+
+ new Another().method();
+}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=babel-classes.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/babel-classes.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/babel-classes.js.map
new file mode 100644
index 0000000000..1a4eb3884c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/babel-classes.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel6://./babel-classes/webpack/bootstrap 5a57728ea4dd6e4f4f6a","webpack3-babel6://./babel-classes/./input.js"],"names":["root","Another","bound","two","console","log","method"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;;;;AC7De,SAASA,IAAT,GAAgB;AAAA,MACvBC,OADuB;AAAA;AAAA;;AAAA;;AAAA,WAE3BC,KAF2B,GAEnB,YAAM;AACZ,eAAO,KAAP;AACD,OAJ0B;AAAA;;AAAA;AAAA;AAAA,+BAMlB;AACP,YAAIC,MAAM,CAAV;;AAEAC,gBAAQC,GAAR,CAAY,YAAZ,EAA0BJ,OAA1B,EAAmCD,IAAnC;AACD;AAV0B;;AAAA;AAAA;;AAa7B,MAAIC,OAAJ,GAAcK,MAAd;AACD,C","file":"babel-classes.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 5a57728ea4dd6e4f4f6a","export default function root() {\n class Another {\n bound = () => {\n return this;\n }\n\n method() {\n let two = 2;\n\n console.log(\"pause here\", Another, root);\n }\n }\n\n new Another().method();\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/babel-flowtype-bindings.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/babel-flowtype-bindings.js
new file mode 100644
index 0000000000..12f3d63152
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/babel-flowtype-bindings.js
@@ -0,0 +1,95 @@
+var webpack3Babel6BabelFlowtypeBindings =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_mod__ = __webpack_require__(1);
+
+
+
+var aConst = "a-const";
+
+function root() {
+ console.log("pause here", aConst, __WEBPACK_IMPORTED_MODULE_0__src_mod__["a" /* Four */], root);
+}
+
+/***/ }),
+/* 1 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Four; });
+/* unused harmony default export */ var _unused_webpack_default_export = ("a-default");
+var Four = "one";
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=babel-flowtype-bindings.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/babel-flowtype-bindings.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/babel-flowtype-bindings.js.map
new file mode 100644
index 0000000000..9c352584bd
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/babel-flowtype-bindings.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel6://./babel-flowtype-bindings/webpack/bootstrap 20634dc52bcb428d454d","webpack3-babel6://./babel-flowtype-bindings/./input.js","webpack3-babel6://./babel-flowtype-bindings/./src/mod.js"],"names":["aConst","root","console","log","Four"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;;AC5DA;;AAIA,IAAMA,SAAS,SAAf;;AAEe,SAASC,IAAT,GAAgB;AAC7BC,UAAQC,GAAR,CAAY,YAAZ,EAA0BH,MAA1B,EAAkC,sDAAlC,EAAwCC,IAAxC;AACD,C;;;;;;;;ACTD,0EAAe,WAAf;AACO,IAAMG,OAAO,KAAb,C","file":"babel-flowtype-bindings.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 20634dc52bcb428d454d","import type { One, Two, Three } from \"./src/mod\";\nimport { Four, type Five, typeof Six } from \"./src/mod\";\n\ntype Other = {};\n\nconst aConst = \"a-const\";\n\nexport default function root() {\n console.log(\"pause here\", aConst, Four, root);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js","export default \"a-default\";\nexport const Four = \"one\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/classes.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/classes.js
new file mode 100644
index 0000000000..2c0574289b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/classes.js
@@ -0,0 +1,121 @@
+var webpack3Babel6Classes =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function root() {
+ var one = 1;
+
+ var Thing = function () {
+ function Thing() {
+ _classCallCheck(this, Thing);
+ }
+
+ _createClass(Thing, [{
+ key: "one",
+ value: function one() {
+ console.log("pause here");
+ }
+ }]);
+
+ return Thing;
+ }();
+
+ var Another = function () {
+ function Another() {
+ _classCallCheck(this, Another);
+ }
+
+ _createClass(Another, [{
+ key: "method",
+ value: function method() {
+ var two = 2;
+
+ var three = 3;
+
+ console.log("pause here", Another, one, Thing, root);
+ }
+ }]);
+
+ return Another;
+ }();
+
+ new Another().method();
+ new Thing().one();
+}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=classes.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/classes.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/classes.js.map
new file mode 100644
index 0000000000..b897bbdac8
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/classes.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel6://./classes/webpack/bootstrap 64688195b293774f586a","webpack3-babel6://./classes/./input.js"],"names":["root","one","Thing","console","log","Another","two","three","method"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;;;;AC7De,SAASA,IAAT,GAAgB;AAC7B,MAAIC,MAAM,CAAV;;AAD6B,MAGvBC,KAHuB;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,4BAIrB;AACJC,gBAAQC,GAAR,CAAY,YAAZ;AACD;AAN0B;;AAAA;AAAA;;AAAA,MASvBC,OATuB;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,+BAUlB;AACP,YAAIC,MAAM,CAAV;;AAEA,YAAMC,QAAQ,CAAd;;AAEAJ,gBAAQC,GAAR,CAAY,YAAZ,EAA0BC,OAA1B,EAAmCJ,GAAnC,EAAwCC,KAAxC,EAA+CF,IAA/C;AACD;AAhB0B;;AAAA;AAAA;;AAmB7B,MAAIK,OAAJ,GAAcG,MAAd;AACA,MAAIN,KAAJ,GAAYD,GAAZ;AACD,C","file":"classes.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 64688195b293774f586a","export default function root() {\n let one = 1;\n\n class Thing {\n one() {\n console.log(\"pause here\");\n }\n }\n\n class Another {\n method() {\n let two = 2;\n\n const three = 3;\n\n console.log(\"pause here\", Another, one, Thing, root);\n }\n }\n\n new Another().method();\n new Thing().one();\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/esmodules-cjs.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/esmodules-cjs.js
new file mode 100644
index 0000000000..d0c651c474
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/esmodules-cjs.js
@@ -0,0 +1,280 @@
+var webpack3Babel6EsmodulesCjs =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = root;
+exports.example = example;
+
+var _mod = __webpack_require__(1);
+
+var _mod2 = _interopRequireDefault(_mod);
+
+var _mod3 = __webpack_require__(2);
+
+var _mod4 = __webpack_require__(3);
+
+var _mod5 = __webpack_require__(4);
+
+var aNamespace = _interopRequireWildcard(_mod5);
+
+var _mod6 = __webpack_require__(5);
+
+var _mod7 = _interopRequireDefault(_mod6);
+
+var _mod8 = __webpack_require__(6);
+
+var _mod9 = __webpack_require__(7);
+
+var _mod10 = __webpack_require__(8);
+
+var _mod11 = _interopRequireDefault(_mod10);
+
+var _mod12 = __webpack_require__(9);
+
+var _mod13 = __webpack_require__(10);
+
+var _optimizedOut = __webpack_require__(11);
+
+var _optimizedOut2 = _interopRequireDefault(_optimizedOut);
+
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+(0, _optimizedOut2.default)();
+
+function root() {
+ console.log("pause here", root);
+
+ console.log(_mod2.default);
+ console.log(_mod4.original);
+ console.log(_mod3.aNamed);
+ console.log(_mod3.aNamed);
+ console.log(aNamespace);
+
+ try {
+ // None of these are callable in this code, but we still want to make sure
+ // they map properly even if the only reference is in a call expressions.
+ console.log((0, _mod7.default)());
+ console.log((0, _mod9.original)());
+ console.log((0, _mod8.aNamed2)());
+ console.log((0, _mod8.aNamed2)());
+
+ console.log(new _mod11.default());
+ console.log(new _mod13.original());
+ console.log(new _mod12.aNamed3());
+ console.log(new _mod12.aNamed3());
+ } catch (e) {}
+}
+
+function example() {}
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = "a-default";
+
+/***/ }),
+/* 2 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+var aNamed = exports.aNamed = "a-named";
+
+/***/ }),
+/* 3 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+var original = exports.original = "an-original";
+
+/***/ }),
+/* 4 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = "a-default";
+var aNamed = exports.aNamed = "a-named";
+
+/***/ }),
+/* 5 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = "a-default2";
+
+/***/ }),
+/* 6 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+var aNamed2 = exports.aNamed2 = "a-named2";
+
+/***/ }),
+/* 7 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+var original = exports.original = "an-original2";
+
+/***/ }),
+/* 8 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = "a-default3";
+
+/***/ }),
+/* 9 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+var aNamed3 = exports.aNamed3 = "a-named3";
+
+/***/ }),
+/* 10 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+var original = exports.original = "an-original3";
+
+/***/ }),
+/* 11 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = optimizedOut;
+function optimizedOut() {}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=esmodules-cjs.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/esmodules-cjs.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/esmodules-cjs.js.map
new file mode 100644
index 0000000000..243f7a36d4
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/esmodules-cjs.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel6://./esmodules-cjs/webpack/bootstrap 87be6f8eadf700b4502c","webpack3-babel6://./esmodules-cjs/./input.js","webpack3-babel6://./esmodules-cjs/./src/mod1.js","webpack3-babel6://./esmodules-cjs/./src/mod2.js","webpack3-babel6://./esmodules-cjs/./src/mod3.js","webpack3-babel6://./esmodules-cjs/./src/mod4.js","webpack3-babel6://./esmodules-cjs/./src/mod5.js","webpack3-babel6://./esmodules-cjs/./src/mod6.js","webpack3-babel6://./esmodules-cjs/./src/mod7.js","webpack3-babel6://./esmodules-cjs/./src/mod9.js","webpack3-babel6://./esmodules-cjs/./src/mod10.js","webpack3-babel6://./esmodules-cjs/./src/mod11.js","webpack3-babel6://./esmodules-cjs/./src/optimized-out.js"],"names":["root","example","aNamespace","console","log","aDefault","anAliased","aNamed","anotherNamed","aDefault3","anAliased3","aNamed3","anotherNamed3","e","original","aNamed2","optimizedOut"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;;;kBC7CwBA,I;QAwBRC,O,GAAAA,O;;AAxChB;;;;AACA;;AACA;;AACA;;IAAYC,U;;AAEZ;;;;AACA;;AACA;;AAEA;;;;AACA;;AACA;;AAEA;;;;;;;;AACA;;AAEe,SAASF,IAAT,GAAgB;AAC7BG,UAAQC,GAAR,CAAY,YAAZ,EAA0BJ,IAA1B;;AAEAG,UAAQC,GAAR,CAAYC,aAAZ;AACAF,UAAQC,GAAR,CAAYE,cAAZ;AACAH,UAAQC,GAAR,CAAYG,YAAZ;AACAJ,UAAQC,GAAR,CAAYI,YAAZ;AACAL,UAAQC,GAAR,CAAYF,UAAZ;;AAEA,MAAI;AACF;AACA;AACAC,YAAQC,GAAR,CAAY,oBAAZ;AACAD,YAAQC,GAAR,CAAY,qBAAZ;AACAD,YAAQC,GAAR,CAAY,oBAAZ;AACAD,YAAQC,GAAR,CAAY,oBAAZ;;AAEAD,YAAQC,GAAR,CAAY,IAAIK,cAAJ,EAAZ;AACAN,YAAQC,GAAR,CAAY,IAAIM,eAAJ,EAAZ;AACAP,YAAQC,GAAR,CAAY,IAAIO,cAAJ,EAAZ;AACAR,YAAQC,GAAR,CAAY,IAAIQ,cAAJ,EAAZ;AACD,GAZD,CAYE,OAAOC,CAAP,EAAU,CAAE;AACf;;AAEM,SAASZ,OAAT,GAAkB,CAAE,C;;;;;;;;;;;;kBCxCZ,W;;;;;;;;;;;;ACAR,IAAMM,0BAAS,SAAf,C;;;;;;;;;;;;ACAA,IAAMO,8BAAW,aAAjB,C;;;;;;;;;;;;kBCAQ,W;AACR,IAAMP,0BAAS,SAAf,C;;;;;;;;;;;;kBCDQ,Y;;;;;;;;;;;;ACAR,IAAMQ,4BAAU,UAAhB,C;;;;;;;;;;;;ACAA,IAAMD,8BAAW,cAAjB,C;;;;;;;;;;;;kBCAQ,Y;;;;;;;;;;;;ACAR,IAAMH,4BAAU,UAAhB,C;;;;;;;;;;;;ACAA,IAAMG,8BAAW,cAAjB,C;;;;;;;;;;;;kBCAiBE,Y;AAAT,SAASA,YAAT,GAAwB,CAAE,C","file":"esmodules-cjs.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 87be6f8eadf700b4502c","import aDefault from \"./src/mod1\";\nimport { aNamed, aNamed as anotherNamed } from \"./src/mod2\";\nimport { original as anAliased } from \"./src/mod3\";\nimport * as aNamespace from \"./src/mod4\";\n\nimport aDefault2 from \"./src/mod5\";\nimport { aNamed2, aNamed2 as anotherNamed2 } from \"./src/mod6\";\nimport { original as anAliased2 } from \"./src/mod7\";\n\nimport aDefault3 from \"./src/mod9\";\nimport { aNamed3, aNamed3 as anotherNamed3 } from \"./src/mod10\";\nimport { original as anAliased3 } from \"./src/mod11\";\n\nimport optimizedOut from \"./src/optimized-out\";\noptimizedOut();\n\nexport default function root() {\n console.log(\"pause here\", root);\n\n console.log(aDefault);\n console.log(anAliased);\n console.log(aNamed);\n console.log(anotherNamed);\n console.log(aNamespace);\n\n try {\n // None of these are callable in this code, but we still want to make sure\n // they map properly even if the only reference is in a call expressions.\n console.log(aDefault2());\n console.log(anAliased2());\n console.log(aNamed2());\n console.log(anotherNamed2());\n\n console.log(new aDefault3());\n console.log(new anAliased3());\n console.log(new aNamed3());\n console.log(new anotherNamed3());\n } catch (e) {}\n}\n\nexport function example(){}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js","export default \"a-default\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod1.js","export const aNamed = \"a-named\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod2.js","export const original = \"an-original\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod3.js","export default \"a-default\";\nexport const aNamed = \"a-named\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod4.js","export default \"a-default2\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod5.js","export const aNamed2 = \"a-named2\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod6.js","export const original = \"an-original2\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod7.js","export default \"a-default3\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod9.js","export const aNamed3 = \"a-named3\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod10.js","export const original = \"an-original3\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod11.js","export default function optimizedOut() {}\n\n\n\n// WEBPACK FOOTER //\n// ./src/optimized-out.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/esmodules-es6.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/esmodules-es6.js
new file mode 100644
index 0000000000..adf9dc18a7
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/esmodules-es6.js
@@ -0,0 +1,224 @@
+var webpack3Babel6EsmodulesEs6 =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+/* harmony export (immutable) */ __webpack_exports__["example"] = example;
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_mod1__ = __webpack_require__(1);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__src_mod2__ = __webpack_require__(2);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__src_mod3__ = __webpack_require__(3);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__src_mod4__ = __webpack_require__(4);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__src_mod5__ = __webpack_require__(5);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__src_mod6__ = __webpack_require__(6);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__src_mod7__ = __webpack_require__(7);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__src_mod9__ = __webpack_require__(8);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__src_mod10__ = __webpack_require__(9);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__src_mod11__ = __webpack_require__(10);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__src_optimized_out__ = __webpack_require__(11);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Object(__WEBPACK_IMPORTED_MODULE_10__src_optimized_out__["a" /* default */])();
+
+function root() {
+ console.log("pause here", root);
+
+ console.log(__WEBPACK_IMPORTED_MODULE_0__src_mod1__["a" /* default */]);
+ console.log(__WEBPACK_IMPORTED_MODULE_2__src_mod3__["a" /* original */]);
+ console.log(__WEBPACK_IMPORTED_MODULE_1__src_mod2__["a" /* aNamed */]);
+ console.log(__WEBPACK_IMPORTED_MODULE_1__src_mod2__["a" /* aNamed */]);
+ console.log(__WEBPACK_IMPORTED_MODULE_3__src_mod4__);
+
+ try {
+ // None of these are callable in this code, but we still want to make sure
+ // they map properly even if the only reference is in a call expressions.
+ console.log(Object(__WEBPACK_IMPORTED_MODULE_4__src_mod5__["a" /* default */])());
+ console.log(Object(__WEBPACK_IMPORTED_MODULE_6__src_mod7__["a" /* original */])());
+ console.log(Object(__WEBPACK_IMPORTED_MODULE_5__src_mod6__["a" /* aNamed2 */])());
+ console.log(Object(__WEBPACK_IMPORTED_MODULE_5__src_mod6__["a" /* aNamed2 */])());
+
+ console.log(new __WEBPACK_IMPORTED_MODULE_7__src_mod9__["a" /* default */]());
+ console.log(new __WEBPACK_IMPORTED_MODULE_9__src_mod11__["a" /* original */]());
+ console.log(new __WEBPACK_IMPORTED_MODULE_8__src_mod10__["a" /* aNamed3 */]());
+ console.log(new __WEBPACK_IMPORTED_MODULE_8__src_mod10__["a" /* aNamed3 */]());
+ } catch (e) {}
+}
+
+function example() {}
+
+/***/ }),
+/* 1 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony default export */ __webpack_exports__["a"] = ("a-default");
+
+/***/ }),
+/* 2 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+const aNamed = "a-named";
+/* harmony export (immutable) */ __webpack_exports__["a"] = aNamed;
+
+
+/***/ }),
+/* 3 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+const original = "an-original";
+/* harmony export (immutable) */ __webpack_exports__["a"] = original;
+
+
+/***/ }),
+/* 4 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony default export */ __webpack_exports__["default"] = ("a-default");
+const aNamed = "a-named";
+/* harmony export (immutable) */ __webpack_exports__["aNamed"] = aNamed;
+
+
+/***/ }),
+/* 5 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony default export */ __webpack_exports__["a"] = ("a-default2");
+
+/***/ }),
+/* 6 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+const aNamed2 = "a-named2";
+/* harmony export (immutable) */ __webpack_exports__["a"] = aNamed2;
+
+
+/***/ }),
+/* 7 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+const original = "an-original2";
+/* harmony export (immutable) */ __webpack_exports__["a"] = original;
+
+
+/***/ }),
+/* 8 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony default export */ __webpack_exports__["a"] = ("a-default3");
+
+/***/ }),
+/* 9 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+const aNamed3 = "a-named3";
+/* harmony export (immutable) */ __webpack_exports__["a"] = aNamed3;
+
+
+/***/ }),
+/* 10 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+const original = "an-original3";
+/* harmony export (immutable) */ __webpack_exports__["a"] = original;
+
+
+/***/ }),
+/* 11 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (immutable) */ __webpack_exports__["a"] = optimizedOut;
+function optimizedOut() {}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=esmodules-es6.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/esmodules-es6.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/esmodules-es6.js.map
new file mode 100644
index 0000000000..d38c08359c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/esmodules-es6.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel6://./esmodules-es6/webpack/bootstrap 7efa15665ec1bdc68c68","webpack3-babel6://./esmodules-es6/./input.js","webpack3-babel6://./esmodules-es6/./src/mod1.js","webpack3-babel6://./esmodules-es6/./src/mod2.js","webpack3-babel6://./esmodules-es6/./src/mod3.js","webpack3-babel6://./esmodules-es6/./src/mod4.js","webpack3-babel6://./esmodules-es6/./src/mod5.js","webpack3-babel6://./esmodules-es6/./src/mod6.js","webpack3-babel6://./esmodules-es6/./src/mod7.js","webpack3-babel6://./esmodules-es6/./src/mod9.js","webpack3-babel6://./esmodules-es6/./src/mod10.js","webpack3-babel6://./esmodules-es6/./src/mod11.js","webpack3-babel6://./esmodules-es6/./src/optimized-out.js"],"names":["optimizedOut","root","console","log","aDefault2","anAliased2","aNamed2","anotherNamed2","e","example","aNamed","original","aNamed3"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;;;;;;;;;;;;AC7DA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,4EAAAA;;AAEe,SAASC,IAAT,GAAgB;AAC7BC,UAAQC,GAAR,CAAY,YAAZ,EAA0BF,IAA1B;;AAEAC,UAAQC,GAAR,CAAY,0DAAZ;AACAD,UAAQC,GAAR,CAAY,2DAAZ;AACAD,UAAQC,GAAR,CAAY,yDAAZ;AACAD,UAAQC,GAAR,CAAY,yDAAZ;AACAD,UAAQC,GAAR,CAAY,uCAAZ;;AAEA,MAAI;AACF;AACA;AACAD,YAAQC,GAAR,CAAY,kEAAAC,EAAZ;AACAF,YAAQC,GAAR,CAAY,mEAAAE,EAAZ;AACAH,YAAQC,GAAR,CAAY,kEAAAG,EAAZ;AACAJ,YAAQC,GAAR,CAAY,kEAAAI,EAAZ;;AAEAL,YAAQC,GAAR,CAAY,IAAI,0DAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,4DAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,2DAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,2DAAJ,EAAZ;AACD,GAZD,CAYE,OAAOK,CAAP,EAAU,CAAE;AACf;;AAEM,SAASC,OAAT,GAAkB,CAAE,C;;;;;;;ACxC3B,yDAAe,WAAf,E;;;;;;;ACAO,MAAMC,SAAS,SAAf,C;;;;;;;;;ACAA,MAAMC,WAAW,aAAjB,C;;;;;;;;;;ACAP,+DAAe,WAAf;AACO,MAAMD,SAAS,SAAf,C;;;;;;;;;ACDP,yDAAe,YAAf,E;;;;;;;ACAO,MAAMJ,UAAU,UAAhB,C;;;;;;;;;ACAA,MAAMK,WAAW,cAAjB,C;;;;;;;;;ACAP,yDAAe,YAAf,E;;;;;;;ACAO,MAAMC,UAAU,UAAhB,C;;;;;;;;;ACAA,MAAMD,WAAW,cAAjB,C;;;;;;;;;;ACAQ,SAASX,YAAT,GAAwB,CAAE,C","file":"esmodules-es6.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 7efa15665ec1bdc68c68","import aDefault from \"./src/mod1\";\nimport { aNamed, aNamed as anotherNamed } from \"./src/mod2\";\nimport { original as anAliased } from \"./src/mod3\";\nimport * as aNamespace from \"./src/mod4\";\n\nimport aDefault2 from \"./src/mod5\";\nimport { aNamed2, aNamed2 as anotherNamed2 } from \"./src/mod6\";\nimport { original as anAliased2 } from \"./src/mod7\";\n\nimport aDefault3 from \"./src/mod9\";\nimport { aNamed3, aNamed3 as anotherNamed3 } from \"./src/mod10\";\nimport { original as anAliased3 } from \"./src/mod11\";\n\nimport optimizedOut from \"./src/optimized-out\";\noptimizedOut();\n\nexport default function root() {\n console.log(\"pause here\", root);\n\n console.log(aDefault);\n console.log(anAliased);\n console.log(aNamed);\n console.log(anotherNamed);\n console.log(aNamespace);\n\n try {\n // None of these are callable in this code, but we still want to make sure\n // they map properly even if the only reference is in a call expressions.\n console.log(aDefault2());\n console.log(anAliased2());\n console.log(aNamed2());\n console.log(anotherNamed2());\n\n console.log(new aDefault3());\n console.log(new anAliased3());\n console.log(new aNamed3());\n console.log(new anotherNamed3());\n } catch (e) {}\n}\n\nexport function example(){}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js","export default \"a-default\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod1.js","export const aNamed = \"a-named\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod2.js","export const original = \"an-original\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod3.js","export default \"a-default\";\nexport const aNamed = \"a-named\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod4.js","export default \"a-default2\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod5.js","export const aNamed2 = \"a-named2\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod6.js","export const original = \"an-original2\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod7.js","export default \"a-default3\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod9.js","export const aNamed3 = \"a-named3\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod10.js","export const original = \"an-original3\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod11.js","export default function optimizedOut() {}\n\n\n\n// WEBPACK FOOTER //\n// ./src/optimized-out.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/esmodules.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/esmodules.js
new file mode 100644
index 0000000000..9e4b55caf1
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/esmodules.js
@@ -0,0 +1,217 @@
+var webpack3Babel6Esmodules =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+/* harmony export (immutable) */ __webpack_exports__["example"] = example;
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_mod1__ = __webpack_require__(1);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__src_mod2__ = __webpack_require__(2);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__src_mod3__ = __webpack_require__(3);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__src_mod4__ = __webpack_require__(4);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__src_mod5__ = __webpack_require__(5);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__src_mod6__ = __webpack_require__(6);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__src_mod7__ = __webpack_require__(7);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__src_mod9__ = __webpack_require__(8);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__src_mod10__ = __webpack_require__(9);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__src_mod11__ = __webpack_require__(10);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__src_optimized_out__ = __webpack_require__(11);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Object(__WEBPACK_IMPORTED_MODULE_10__src_optimized_out__["a" /* default */])();
+
+function root() {
+ console.log("pause here", root);
+
+ console.log(__WEBPACK_IMPORTED_MODULE_0__src_mod1__["a" /* default */]);
+ console.log(__WEBPACK_IMPORTED_MODULE_2__src_mod3__["a" /* original */]);
+ console.log(__WEBPACK_IMPORTED_MODULE_1__src_mod2__["a" /* aNamed */]);
+ console.log(__WEBPACK_IMPORTED_MODULE_1__src_mod2__["a" /* aNamed */]);
+ console.log(__WEBPACK_IMPORTED_MODULE_3__src_mod4__);
+
+ try {
+ // None of these are callable in this code, but we still want to make sure
+ // they map properly even if the only reference is in a call expressions.
+ console.log(Object(__WEBPACK_IMPORTED_MODULE_4__src_mod5__["a" /* default */])());
+ console.log(Object(__WEBPACK_IMPORTED_MODULE_6__src_mod7__["a" /* original */])());
+ console.log(Object(__WEBPACK_IMPORTED_MODULE_5__src_mod6__["a" /* aNamed2 */])());
+ console.log(Object(__WEBPACK_IMPORTED_MODULE_5__src_mod6__["a" /* aNamed2 */])());
+
+ console.log(new __WEBPACK_IMPORTED_MODULE_7__src_mod9__["a" /* default */]());
+ console.log(new __WEBPACK_IMPORTED_MODULE_9__src_mod11__["a" /* original */]());
+ console.log(new __WEBPACK_IMPORTED_MODULE_8__src_mod10__["a" /* aNamed3 */]());
+ console.log(new __WEBPACK_IMPORTED_MODULE_8__src_mod10__["a" /* aNamed3 */]());
+ } catch (e) {}
+}
+
+function example() {}
+
+/***/ }),
+/* 1 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony default export */ __webpack_exports__["a"] = ("a-default");
+
+/***/ }),
+/* 2 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return aNamed; });
+var aNamed = "a-named";
+
+/***/ }),
+/* 3 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return original; });
+var original = "an-original";
+
+/***/ }),
+/* 4 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "aNamed", function() { return aNamed; });
+/* harmony default export */ __webpack_exports__["default"] = ("a-default");
+var aNamed = "a-named";
+
+/***/ }),
+/* 5 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony default export */ __webpack_exports__["a"] = ("a-default2");
+
+/***/ }),
+/* 6 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return aNamed2; });
+var aNamed2 = "a-named2";
+
+/***/ }),
+/* 7 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return original; });
+var original = "an-original2";
+
+/***/ }),
+/* 8 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony default export */ __webpack_exports__["a"] = ("a-default3");
+
+/***/ }),
+/* 9 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return aNamed3; });
+var aNamed3 = "a-named3";
+
+/***/ }),
+/* 10 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return original; });
+var original = "an-original3";
+
+/***/ }),
+/* 11 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (immutable) */ __webpack_exports__["a"] = optimizedOut;
+function optimizedOut() {}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=esmodules.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/esmodules.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/esmodules.js.map
new file mode 100644
index 0000000000..05456c1deb
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/esmodules.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel6://./esmodules/webpack/bootstrap 924e39cb5848a9794b70","webpack3-babel6://./esmodules/./input.js","webpack3-babel6://./esmodules/./src/mod1.js","webpack3-babel6://./esmodules/./src/mod2.js","webpack3-babel6://./esmodules/./src/mod3.js","webpack3-babel6://./esmodules/./src/mod4.js","webpack3-babel6://./esmodules/./src/mod5.js","webpack3-babel6://./esmodules/./src/mod6.js","webpack3-babel6://./esmodules/./src/mod7.js","webpack3-babel6://./esmodules/./src/mod9.js","webpack3-babel6://./esmodules/./src/mod10.js","webpack3-babel6://./esmodules/./src/mod11.js","webpack3-babel6://./esmodules/./src/optimized-out.js"],"names":["optimizedOut","root","console","log","aDefault2","anAliased2","aNamed2","anotherNamed2","e","example","aNamed","original","aNamed3"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;;;;;;;;;;;;AC7DA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,4EAAAA;;AAEe,SAASC,IAAT,GAAgB;AAC7BC,UAAQC,GAAR,CAAY,YAAZ,EAA0BF,IAA1B;;AAEAC,UAAQC,GAAR,CAAY,0DAAZ;AACAD,UAAQC,GAAR,CAAY,2DAAZ;AACAD,UAAQC,GAAR,CAAY,yDAAZ;AACAD,UAAQC,GAAR,CAAY,yDAAZ;AACAD,UAAQC,GAAR,CAAY,uCAAZ;;AAEA,MAAI;AACF;AACA;AACAD,YAAQC,GAAR,CAAY,kEAAAC,EAAZ;AACAF,YAAQC,GAAR,CAAY,mEAAAE,EAAZ;AACAH,YAAQC,GAAR,CAAY,kEAAAG,EAAZ;AACAJ,YAAQC,GAAR,CAAY,kEAAAI,EAAZ;;AAEAL,YAAQC,GAAR,CAAY,IAAI,0DAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,4DAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,2DAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,2DAAJ,EAAZ;AACD,GAZD,CAYE,OAAOK,CAAP,EAAU,CAAE;AACf;;AAEM,SAASC,OAAT,GAAkB,CAAE,C;;;;;;;ACxC3B,yDAAe,WAAf,E;;;;;;;;ACAO,IAAMC,SAAS,SAAf,C;;;;;;;;ACAA,IAAMC,WAAW,aAAjB,C;;;;;;;;;ACAP,+DAAe,WAAf;AACO,IAAMD,SAAS,SAAf,C;;;;;;;ACDP,yDAAe,YAAf,E;;;;;;;;ACAO,IAAMJ,UAAU,UAAhB,C;;;;;;;;ACAA,IAAMK,WAAW,cAAjB,C;;;;;;;ACAP,yDAAe,YAAf,E;;;;;;;;ACAO,IAAMC,UAAU,UAAhB,C;;;;;;;;ACAA,IAAMD,WAAW,cAAjB,C;;;;;;;;ACAQ,SAASX,YAAT,GAAwB,CAAE,C","file":"esmodules.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 924e39cb5848a9794b70","import aDefault from \"./src/mod1\";\nimport { aNamed, aNamed as anotherNamed } from \"./src/mod2\";\nimport { original as anAliased } from \"./src/mod3\";\nimport * as aNamespace from \"./src/mod4\";\n\nimport aDefault2 from \"./src/mod5\";\nimport { aNamed2, aNamed2 as anotherNamed2 } from \"./src/mod6\";\nimport { original as anAliased2 } from \"./src/mod7\";\n\nimport aDefault3 from \"./src/mod9\";\nimport { aNamed3, aNamed3 as anotherNamed3 } from \"./src/mod10\";\nimport { original as anAliased3 } from \"./src/mod11\";\n\nimport optimizedOut from \"./src/optimized-out\";\noptimizedOut();\n\nexport default function root() {\n console.log(\"pause here\", root);\n\n console.log(aDefault);\n console.log(anAliased);\n console.log(aNamed);\n console.log(anotherNamed);\n console.log(aNamespace);\n\n try {\n // None of these are callable in this code, but we still want to make sure\n // they map properly even if the only reference is in a call expressions.\n console.log(aDefault2());\n console.log(anAliased2());\n console.log(aNamed2());\n console.log(anotherNamed2());\n\n console.log(new aDefault3());\n console.log(new anAliased3());\n console.log(new aNamed3());\n console.log(new anotherNamed3());\n } catch (e) {}\n}\n\nexport function example(){}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js","export default \"a-default\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod1.js","export const aNamed = \"a-named\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod2.js","export const original = \"an-original\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod3.js","export default \"a-default\";\nexport const aNamed = \"a-named\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod4.js","export default \"a-default2\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod5.js","export const aNamed2 = \"a-named2\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod6.js","export const original = \"an-original2\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod7.js","export default \"a-default3\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod9.js","export const aNamed3 = \"a-named3\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod10.js","export const original = \"an-original3\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod11.js","export default function optimizedOut() {}\n\n\n\n// WEBPACK FOOTER //\n// ./src/optimized-out.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/eval-maps.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/eval-maps.js
new file mode 100644
index 0000000000..2079712ffa
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/eval-maps.js
@@ -0,0 +1,93 @@
+var webpack3Babel6EvalMaps =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+
+function root() {
+ var one = 1;
+ var two = 2;
+ var three = 3;
+
+ one;
+ two;
+
+ {
+ var _two = 4;
+ var _three = 5;
+
+ console.log("pause here", one, _two, _three);
+ }
+}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=eval-maps.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/eval-maps.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/eval-maps.js.map
new file mode 100644
index 0000000000..128b06bd0c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/eval-maps.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel6://./eval-maps/webpack/bootstrap 45a6caef395c04b34a7a","webpack3-babel6://./eval-maps/./input.js"],"names":["root","one","two","three","console","log"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;AC5De,SAASA,IAAT,GAAgB;AAC7B,MAAIC,MAAM,CAAV;AACA,MAAIC,MAAM,CAAV;AACA,MAAMC,QAAQ,CAAd;;AAEAF;AACAC;;AAEA;AACE,QAAIA,OAAM,CAAV;AACA,QAAMC,SAAQ,CAAd;;AAEAC,YAAQC,GAAR,CAAY,YAAZ,EAA0BJ,GAA1B,EAA+BC,IAA/B,EAAoCC,MAApC;AACD;AACF,C","file":"eval-maps.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 45a6caef395c04b34a7a","\nexport default function root() {\n var one = 1;\n let two = 2;\n const three = 3;\n\n one;\n two;\n\n {\n let two = 4;\n const three = 5;\n\n console.log(\"pause here\", one, two, three);\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/for-loops.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/for-loops.js
new file mode 100644
index 0000000000..c157853f56
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/for-loops.js
@@ -0,0 +1,94 @@
+var webpack3Babel6ForLoops =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+function root() {
+ var i = 0;
+
+ for (var _i = 1; _i < 2; _i++) {
+ console.log("pause here", root);
+ }
+
+ for (var _i2 in { 2: "" }) {
+ console.log("pause here", root);
+ }
+
+ var _arr = [3];
+ for (var _i4 = 0; _i4 < _arr.length; _i4++) {
+ var _i3 = _arr[_i4];
+ console.log("pause here", root);
+ }
+}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=for-loops.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/for-loops.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/for-loops.js.map
new file mode 100644
index 0000000000..7ae7a929c3
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/for-loops.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel6://./for-loops/webpack/bootstrap 47975f77bc82f8a5e1c1","webpack3-babel6://./for-loops/./input.js"],"names":["root","i","console","log"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;AC7De,SAASA,IAAT,GAAgB;AAC7B,MAAIC,IAAI,CAAR;;AAEA,OAAK,IAAIA,KAAI,CAAb,EAAgBA,KAAI,CAApB,EAAuBA,IAAvB,EAA4B;AAC1BC,YAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B;AACD;;AAED,OAAK,IAAIC,GAAT,IAAc,EAAE,GAAG,EAAL,EAAd,EAAyB;AACvBC,YAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B;AACD;;AAT4B,aAWf,CAAC,CAAD,CAXe;AAW7B,8CAAmB;AAAd,QAAIC,eAAJ;AACHC,YAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B;AACD;AACF,C","file":"for-loops.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 47975f77bc82f8a5e1c1","export default function root() {\n let i = 0;\n\n for (let i = 1; i < 2; i++) {\n console.log(\"pause here\", root);\n }\n\n for (let i in { 2: \"\" }) {\n console.log(\"pause here\", root);\n }\n\n for (let i of [3]) {\n console.log(\"pause here\", root);\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/for-of.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/for-of.js
new file mode 100644
index 0000000000..28c75fc876
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/for-of.js
@@ -0,0 +1,92 @@
+var webpack3Babel6ForOf =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = forOf;
+var mod = "module scoped";
+
+function forOf() {
+ var _arr = [1];
+
+ for (var _i = 0; _i < _arr.length; _i++) {
+ var x = _arr[_i];
+ doThing(x);
+ }
+
+ function doThing(arg) {
+ // Avoid optimize out
+ window.console;
+ }
+}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=for-of.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/for-of.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/for-of.js.map
new file mode 100644
index 0000000000..5b1d6621fd
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/for-of.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel6://./for-of/webpack/bootstrap 00a4cdb6e983a991ca24","webpack3-babel6://./for-of/./input.js"],"names":["mod","forOf","x","doThing","arg","window","console"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;AC7DA;AAAA,IAAMA,MAAM,eAAZ;;AAEe,SAASC,KAAT,GAAiB;AAAA,aACd,CAAC,CAAD,CADc;;AAC9B,2CAAqB;AAAhB,QAAMC,YAAN;AACHC,YAAQD,CAAR;AACD;;AAED,WAASC,OAAT,CAAiBC,GAAjB,EAAsB;AACpB;AACAC,WAAOC,OAAP;AACD;AACF,C","file":"for-of.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 00a4cdb6e983a991ca24","const mod = \"module scoped\";\n\nexport default function forOf() {\n for (const x of [1]) {\n doThing(x);\n }\n\n function doThing(arg) {\n // Avoid optimize out\n window.console;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/functions.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/functions.js
new file mode 100644
index 0000000000..02804f5c8f
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/functions.js
@@ -0,0 +1,91 @@
+var webpack3Babel6Functions =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+function root() {
+
+ function decl(p1) {
+ var inner = function inner(p2) {
+ var arrow = function arrow(p3) {
+ console.log("pause here", p3, arrow, p2, inner, p1, decl, root);
+ };
+ arrow();
+ };
+ inner();
+ }
+
+ decl();
+}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=functions.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/functions.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/functions.js.map
new file mode 100644
index 0000000000..2492890039
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/functions.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel6://./functions/webpack/bootstrap 7e7395652531efa70d27","webpack3-babel6://./functions/./input.js"],"names":["root","decl","p1","inner","p2","arrow","p3","console","log"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;AC7De,SAASA,IAAT,GAAgB;;AAE7B,WAASC,IAAT,CAAcC,EAAd,EAAkB;AAChB,QAAMC,QAAQ,SAASA,KAAT,CAAeC,EAAf,EAAmB;AAC/B,UAAMC,QAAQ,SAARA,KAAQ,CAACC,EAAD,EAAQ;AACpBC,gBAAQC,GAAR,CAAY,YAAZ,EAA0BF,EAA1B,EAA8BD,KAA9B,EAAqCD,EAArC,EAAyCD,KAAzC,EAAgDD,EAAhD,EAAoDD,IAApD,EAA0DD,IAA1D;AACD,OAFD;AAGAK;AACD,KALD;AAMAF;AACD;;AAEDF;AACD,C","file":"functions.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 7e7395652531efa70d27","export default function root() {\n\n function decl(p1) {\n const inner = function inner(p2) {\n const arrow = (p3) => {\n console.log(\"pause here\", p3, arrow, p2, inner, p1, decl, root);\n };\n arrow();\n };\n inner();\n }\n\n decl();\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/lex-and-nonlex.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/lex-and-nonlex.js
new file mode 100644
index 0000000000..5c3e7621d8
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/lex-and-nonlex.js
@@ -0,0 +1,90 @@
+var webpack3Babel6LexAndNonlex =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function root() {
+ function someHelper() {
+ console.log("pause here", root, Thing);
+ }
+
+ var Thing = function Thing() {
+ _classCallCheck(this, Thing);
+ };
+
+ someHelper();
+}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=lex-and-nonlex.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/lex-and-nonlex.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/lex-and-nonlex.js.map
new file mode 100644
index 0000000000..c060bcc340
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/lex-and-nonlex.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel6://./lex-and-nonlex/webpack/bootstrap af881c4be0c863740c36","webpack3-babel6://./lex-and-nonlex/./input.js"],"names":["root","someHelper","console","log","Thing"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;;AC7De,SAASA,IAAT,GAAgB;AAC7B,WAASC,UAAT,GAAqB;AACnBC,YAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B,EAAgCI,KAAhC;AACD;;AAH4B,MAKvBA,KALuB;AAAA;AAAA;;AAO7BH;AACD,C","file":"lex-and-nonlex.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap af881c4be0c863740c36","export default function root() {\n function someHelper(){\n console.log(\"pause here\", root, Thing);\n }\n\n class Thing {}\n\n someHelper();\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/line-start-bindings-es6.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/line-start-bindings-es6.js
new file mode 100644
index 0000000000..05c1257b0b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/line-start-bindings-es6.js
@@ -0,0 +1,100 @@
+var webpack3Babel6LineStartBindingsEs6 =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+
+function root() {
+ function aFunc() {
+ // Since these bindings are on their own linem, the mappings will
+ // extend to the start of the line, rather than starting at the first
+ // character of the binding.
+ const {
+ one,
+ two
+ } = {
+ one: 1,
+ two: 2
+ };
+
+ // The 'this' binding here is also its own line, so the comment above
+ // applies here too.
+ this.thing = 4;
+
+ console.log("pause here", root);
+ }
+
+ aFunc.call({});
+}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=line-start-bindings-es6.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/line-start-bindings-es6.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/line-start-bindings-es6.js.map
new file mode 100644
index 0000000000..e1d825ea8c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/line-start-bindings-es6.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel6://./line-start-bindings-es6/webpack/bootstrap 5fb00f813ce3e4e4a849","webpack3-babel6://./line-start-bindings-es6/./input.js"],"names":["root","aFunc","one","two","thing","console","log","call"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;AC5De,SAASA,IAAT,GAAgB;AAC7B,WAASC,KAAT,GAAgB;AACd;AACA;AACA;AACA,UAAM;AACJC,SADI;AAEJC;AAFI,QAGF;AACFD,WAAK,CADH;AAEFC,WAAK;AAFH,KAHJ;;AAQA;AACA;AACA,SAAKC,KAAL,GAAa,CAAb;;AAEAC,YAAQC,GAAR,CAAY,YAAZ,EAA0BN,IAA1B;AACD;;AAEDC,QAAMM,IAAN,CAAW,EAAX;AACD,C","file":"line-start-bindings-es6.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 5fb00f813ce3e4e4a849","\nexport default function root() {\n function aFunc(){\n // Since these bindings are on their own linem, the mappings will\n // extend to the start of the line, rather than starting at the first\n // character of the binding.\n const {\n one,\n two\n } = {\n one: 1,\n two: 2,\n };\n\n // The 'this' binding here is also its own line, so the comment above\n // applies here too.\n this.thing = 4;\n\n console.log(\"pause here\", root);\n }\n\n aFunc.call({ });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/modules-cjs.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/modules-cjs.js
new file mode 100644
index 0000000000..258cf61814
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/modules-cjs.js
@@ -0,0 +1,85 @@
+var webpack3Babel6ModulesCjs =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var moduleScoped = 1;
+var alsoModuleScoped = 2;
+
+function thirdModuleScoped() {}
+
+exports.default = function () {
+ console.log("pause here", moduleScoped, alsoModuleScoped, thirdModuleScoped);
+};
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=modules-cjs.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/modules-cjs.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/modules-cjs.js.map
new file mode 100644
index 0000000000..65a3caf239
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/modules-cjs.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel6://./modules-cjs/webpack/bootstrap eb168c0493dcde43ca60","webpack3-babel6://./modules-cjs/./input.js"],"names":["moduleScoped","alsoModuleScoped","thirdModuleScoped","exports","default","console","log"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;AC7DA,IAAIA,eAAe,CAAnB;AACA,IAAIC,mBAAmB,CAAvB;;AAEA,SAASC,iBAAT,GAA6B,CAAE;;AAE/BC,QAAQC,OAAR,GAAkB,YAAW;AAC3BC,UAAQC,GAAR,CAAY,YAAZ,EAA0BN,YAA1B,EAAwCC,gBAAxC,EAA0DC,iBAA1D;AACD,CAFD,C","file":"modules-cjs.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap eb168c0493dcde43ca60","var moduleScoped = 1;\nlet alsoModuleScoped = 2;\n\nfunction thirdModuleScoped() {}\n\nexports.default = function() {\n console.log(\"pause here\", moduleScoped, alsoModuleScoped, thirdModuleScoped);\n};\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/out-of-order-declarations-cjs.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/out-of-order-declarations-cjs.js
new file mode 100644
index 0000000000..d1466d529e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/out-of-order-declarations-cjs.js
@@ -0,0 +1,115 @@
+var webpack3Babel6OutOfOrderDeclarationsCjs =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = root;
+
+var _mod = __webpack_require__(1);
+
+var _mod2 = _interopRequireDefault(_mod);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var val = "outer-value";
+
+function root() {
+ var val = "middle-value";
+ var fn = function outerFn(outer) {};
+
+ function callback() {
+ console.log("pause here", val, _mod2.default, fn);
+
+ var val = "inner-value";
+ function fn(inner) {};
+ }
+
+ callback();
+}
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = "a-default";
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=out-of-order-declarations-cjs.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/out-of-order-declarations-cjs.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/out-of-order-declarations-cjs.js.map
new file mode 100644
index 0000000000..873c2b1f01
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/out-of-order-declarations-cjs.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel6://./out-of-order-declarations-cjs/webpack/bootstrap 70c91d8ec37a8d68f372","webpack3-babel6://./out-of-order-declarations-cjs/./input.js","webpack3-babel6://./out-of-order-declarations-cjs/./src/mod.js"],"names":["root","val","fn","outerFn","outer","callback","console","log","aDefault","inner"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;;;kBC3DwBA,I;;AAcxB;;;;;;AAhBA,IAAIC,MAAM,aAAV;;AAEe,SAASD,IAAT,GAAgB;AAC7B,MAAIC,MAAM,cAAV;AACA,MAAIC,KAAK,SAASC,OAAT,CAAiBC,KAAjB,EAAuB,CAAE,CAAlC;;AAEA,WAASC,QAAT,GAAoB;AAClBC,YAAQC,GAAR,CAAY,YAAZ,EAA0BN,GAA1B,EAA+BO,aAA/B,EAAyCN,EAAzC;;AAEA,QAAID,MAAM,aAAV;AACA,aAASC,EAAT,CAAYO,KAAZ,EAAkB,CAAE;AACrB;;AAEDJ;AACD,C;;;;;;;;;;;;kBCdc,W","file":"out-of-order-declarations-cjs.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 70c91d8ec37a8d68f372","var val = \"outer-value\";\n\nexport default function root() {\n var val = \"middle-value\";\n var fn = function outerFn(outer){};\n\n function callback() {\n console.log(\"pause here\", val, aDefault, fn);\n\n var val = \"inner-value\";\n function fn(inner){};\n }\n\n callback();\n}\n\nimport aDefault from \"./src/mod\";\n\n\n\n// WEBPACK FOOTER //\n// ./input.js","export default \"a-default\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/shadowed-vars.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/shadowed-vars.js
new file mode 100644
index 0000000000..864ad13e24
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/shadowed-vars.js
@@ -0,0 +1,102 @@
+var webpack3Babel6ShadowedVars =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+/* harmony default export */ __webpack_exports__["default"] = (function () {
+ var aVar = "var1";
+ var aLet = "let1";
+ var aConst = "const1";
+
+ var Outer = function Outer() {
+ _classCallCheck(this, Outer);
+ };
+
+ {
+ var _Outer = function _Outer() {};
+
+ var aVar = "var2";
+ var _aLet = "let2";
+ var _aConst = "const2";
+ {
+ var aVar = "var3";
+ var _aLet2 = "let3";
+ var _aConst2 = "const3";
+
+ console.log("pause here");
+ }
+ }
+});
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=shadowed-vars.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/shadowed-vars.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/shadowed-vars.js.map
new file mode 100644
index 0000000000..c1021bc599
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/shadowed-vars.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel6://./shadowed-vars/webpack/bootstrap 4f14351e94f216e2c327","webpack3-babel6://./shadowed-vars/./input.js"],"names":["aVar","aLet","aConst","Outer","console","log"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;AC7DA,+DAAe,YAAW;AACxB,MAAIA,OAAO,MAAX;AACA,MAAIC,OAAO,MAAX;AACA,MAAMC,SAAS,QAAf;;AAHwB,MAKlBC,KALkB;AAAA;AAAA;;AAMxB;AAAA,QACWA,MADX,GACE,SAASA,MAAT,GAAiB,CAAE,CADrB;;AAGE,QAAIH,OAAO,MAAX;AACA,QAAIC,QAAO,MAAX;AACA,QAAMC,UAAS,QAAf;AACA;AACE,UAAIF,OAAO,MAAX;AACA,UAAIC,SAAO,MAAX;AACA,UAAMC,WAAS,QAAf;;AAEAE,cAAQC,GAAR,CAAY,YAAZ;AACD;AACF;AACF,C","file":"shadowed-vars.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 4f14351e94f216e2c327","export default function() {\n var aVar = \"var1\";\n let aLet = \"let1\";\n const aConst = \"const1\";\n\n class Outer {}\n {\n function Outer() {}\n\n var aVar = \"var2\";\n let aLet = \"let2\";\n const aConst = \"const2\";\n {\n var aVar = \"var3\";\n let aLet = \"let3\";\n const aConst = \"const3\";\n\n console.log(\"pause here\");\n }\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-for-of-array-closure.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-for-of-array-closure.js
new file mode 100644
index 0000000000..9d1177e477
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-for-of-array-closure.js
@@ -0,0 +1,95 @@
+var webpack3Babel6StepOverForOfArrayClosure =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+// Babel will optimize this for..of because it call tell the value is an array.
+function root() {
+ console.log("pause here");
+
+ var _loop = function _loop(val) {
+ console.log("pause again", function () {
+ return val;
+ }());
+ };
+
+ var _arr = [1, 2];
+ for (var _i = 0; _i < _arr.length; _i++) {
+ var val = _arr[_i];
+ _loop(val);
+ }
+
+ console.log("done");
+}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=step-over-for-of-array-closure.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-for-of-array-closure.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-for-of-array-closure.js.map
new file mode 100644
index 0000000000..ee091387fd
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-for-of-array-closure.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel6://./step-over-for-of-array-closure/webpack/bootstrap d704a323cecb25052fb7","webpack3-babel6://./step-over-for-of-array-closure/./input.js"],"names":["root","console","log","val"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;AC7DA;AAAA;AACe,SAASA,IAAT,GAAgB;AAC7BC,UAAQC,GAAR,CAAY,YAAZ;;AAD6B,6BAGlBC,GAHkB;AAI3BF,YAAQC,GAAR,CAAY,aAAZ,EAA4B;AAAA,aAAMC,GAAN;AAAA,KAAD,EAA3B;AAJ2B;;AAAA,aAGX,CAAC,CAAD,EAAI,CAAJ,CAHW;AAG7B,2CAA0B;AAArB,QAAMA,cAAN;AAAqB,UAAfA,GAAe;AAEzB;;AAEDF,UAAQC,GAAR,CAAY,MAAZ;AACD,C","file":"step-over-for-of-array-closure.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap d704a323cecb25052fb7","// Babel will optimize this for..of because it call tell the value is an array.\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of [1, 2]) {\n console.log(\"pause again\", (() => val)());\n }\n\n console.log(\"done\");\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-for-of-array.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-for-of-array.js
new file mode 100644
index 0000000000..c8efd4e152
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-for-of-array.js
@@ -0,0 +1,89 @@
+var webpack3Babel6StepOverForOfArray =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+// Babel will optimize this for..of because it call tell the value is an array.
+function root() {
+ console.log("pause here");
+
+ var _arr = [1, 2];
+ for (var _i = 0; _i < _arr.length; _i++) {
+ var val = _arr[_i];
+ console.log("pause again", val);
+ }
+
+ console.log("done");
+}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=step-over-for-of-array.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-for-of-array.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-for-of-array.js.map
new file mode 100644
index 0000000000..f65e06d978
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-for-of-array.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel6://./step-over-for-of-array/webpack/bootstrap 7aec685a57ba8bdaf1f1","webpack3-babel6://./step-over-for-of-array/./input.js"],"names":["root","console","log","val"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;AC7DA;AAAA;AACe,SAASA,IAAT,GAAgB;AAC7BC,UAAQC,GAAR,CAAY,YAAZ;;AAD6B,aAGX,CAAC,CAAD,EAAI,CAAJ,CAHW;AAG7B,2CAA0B;AAArB,QAAMC,cAAN;AACHF,YAAQC,GAAR,CAAY,aAAZ,EAA2BC,GAA3B;AACD;;AAEDF,UAAQC,GAAR,CAAY,MAAZ;AACD,C","file":"step-over-for-of-array.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 7aec685a57ba8bdaf1f1","// Babel will optimize this for..of because it call tell the value is an array.\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of [1, 2]) {\n console.log(\"pause again\", val);\n }\n\n console.log(\"done\");\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-for-of-closure.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-for-of-closure.js
new file mode 100644
index 0000000000..5dc6f4fd43
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-for-of-closure.js
@@ -0,0 +1,117 @@
+var webpack3Babel6StepOverForOfClosure =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+// Babel will convert the loop body to a function to handle the 'val' lexical
+// enclosure behavior.
+var vals = [1, 2];
+
+function root() {
+ console.log("pause here");
+
+ var _loop = function _loop(val) {
+ console.log("pause again", function () {
+ return val;
+ }());
+ };
+
+ var _iteratorNormalCompletion = true;
+ var _didIteratorError = false;
+ var _iteratorError = undefined;
+
+ try {
+ for (var _iterator = vals[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
+ var val = _step.value;
+
+ _loop(val);
+ }
+ } catch (err) {
+ _didIteratorError = true;
+ _iteratorError = err;
+ } finally {
+ try {
+ if (!_iteratorNormalCompletion && _iterator.return) {
+ _iterator.return();
+ }
+ } finally {
+ if (_didIteratorError) {
+ throw _iteratorError;
+ }
+ }
+ }
+
+ console.log("done");
+}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=step-over-for-of-closure.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-for-of-closure.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-for-of-closure.js.map
new file mode 100644
index 0000000000..bc6138d2ff
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-for-of-closure.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel6://./step-over-for-of-closure/webpack/bootstrap d613469b3275486d264a","webpack3-babel6://./step-over-for-of-closure/./input.js"],"names":["vals","root","console","log","val"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;AC7DA;AAAA;AACA;AACA,IAAMA,OAAO,CAAC,CAAD,EAAI,CAAJ,CAAb;;AAEe,SAASC,IAAT,GAAgB;AAC7BC,UAAQC,GAAR,CAAY,YAAZ;;AAD6B,6BAGlBC,GAHkB;AAI3BF,YAAQC,GAAR,CAAY,aAAZ,EAA4B;AAAA,aAAMC,GAAN;AAAA,KAAD,EAA3B;AAJ2B;;AAAA;AAAA;AAAA;;AAAA;AAG7B,yBAAkBJ,IAAlB,8HAAwB;AAAA,UAAbI,GAAa;;AAAA,YAAbA,GAAa;AAEvB;AAL4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAO7BF,UAAQC,GAAR,CAAY,MAAZ;AACD,C","file":"step-over-for-of-closure.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap d613469b3275486d264a","// Babel will convert the loop body to a function to handle the 'val' lexical\n// enclosure behavior.\nconst vals = [1, 2];\n\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of vals) {\n console.log(\"pause again\", (() => val)());\n }\n\n console.log(\"done\");\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-for-of.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-for-of.js
new file mode 100644
index 0000000000..8c8065c208
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-for-of.js
@@ -0,0 +1,109 @@
+var webpack3Babel6StepOverForOf =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+var vals = [1, 2];
+
+function root() {
+ console.log("pause here");
+
+ var _iteratorNormalCompletion = true;
+ var _didIteratorError = false;
+ var _iteratorError = undefined;
+
+ try {
+ for (var _iterator = vals[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
+ var val = _step.value;
+
+ console.log("pause again", val);
+ }
+ } catch (err) {
+ _didIteratorError = true;
+ _iteratorError = err;
+ } finally {
+ try {
+ if (!_iteratorNormalCompletion && _iterator.return) {
+ _iterator.return();
+ }
+ } finally {
+ if (_didIteratorError) {
+ throw _iteratorError;
+ }
+ }
+ }
+
+ console.log("done");
+}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=step-over-for-of.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-for-of.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-for-of.js.map
new file mode 100644
index 0000000000..30bff9c170
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-for-of.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel6://./step-over-for-of/webpack/bootstrap be57b6b3b04cfe9b8d83","webpack3-babel6://./step-over-for-of/./input.js"],"names":["vals","root","console","log","val"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;AC7DA;AAAA,IAAMA,OAAO,CAAC,CAAD,EAAI,CAAJ,CAAb;;AAEe,SAASC,IAAT,GAAgB;AAC7BC,UAAQC,GAAR,CAAY,YAAZ;;AAD6B;AAAA;AAAA;;AAAA;AAG7B,yBAAkBH,IAAlB,8HAAwB;AAAA,UAAbI,GAAa;;AACtBF,cAAQC,GAAR,CAAY,aAAZ,EAA2BC,GAA3B;AACD;AAL4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAO7BF,UAAQC,GAAR,CAAY,MAAZ;AACD,C","file":"step-over-for-of.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap be57b6b3b04cfe9b8d83","const vals = [1, 2];\n\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of vals) {\n console.log(\"pause again\", val);\n }\n\n console.log(\"done\");\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-function-params.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-function-params.js
new file mode 100644
index 0000000000..6188f2167e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-function-params.js
@@ -0,0 +1,95 @@
+var webpack3Babel6StepOverFunctionParams =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = fn;
+function test(a1) {
+ var a2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 45;
+
+ var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
+ a3 = _ref.a3,
+ a4 = _ref.a4,
+ _ref$a = _ref.a5;
+
+ _ref$a = _ref$a === undefined ? {} : _ref$a;
+ var a7 = _ref$a.a6;
+
+ console.log("pause next here");
+}
+
+function fn() {
+ console.log("pause here");
+ test("1", undefined, { a3: "3", a4: "4", a5: { a6: "7" } });
+}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=step-over-function-params.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-function-params.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-function-params.js.map
new file mode 100644
index 0000000000..fd6146909c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-function-params.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel6://./step-over-function-params/webpack/bootstrap 50ff7b3eb1daa37b50c5","webpack3-babel6://./step-over-function-params/./input.js"],"names":["test","a1","a2","a3","a4","a5","a7","a6","console","log","fn","undefined"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;AC7DA;AAAA,SAASA,IAAT,CAAcC,EAAd,EAAiE;AAAA,MAA/CC,EAA+C,uEAA1C,EAA0C;;AAAA,iFAAJ,EAAI;AAAA,MAApCC,EAAoC,QAApCA,EAAoC;AAAA,MAAhCC,EAAgC,QAAhCA,EAAgC;AAAA,oBAA5BC,EAA4B;;AAAA,kCAAX,EAAW;AAAA,MAAlBC,EAAkB,UAAtBC,EAAsB;;AAC/DC,UAAQC,GAAR,CAAY,iBAAZ;AACD;;AAEc,SAASC,EAAT,GAAc;AAC3BF,UAAQC,GAAR,CAAY,YAAZ;AACAT,OAAK,GAAL,EAAUW,SAAV,EAAqB,EAAER,IAAI,GAAN,EAAWC,IAAI,GAAf,EAAoBC,IAAI,EAAEE,IAAI,GAAN,EAAxB,EAArB;AACD,C","file":"step-over-function-params.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 50ff7b3eb1daa37b50c5","function test(a1, a2 = 45, { a3, a4, a5: { a6: a7 } = {} } = {}) {\n console.log(\"pause next here\");\n}\n\nexport default function fn() {\n console.log(\"pause here\");\n test(\"1\", undefined, { a3: \"3\", a4: \"4\", a5: { a6: \"7\" } });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-regenerator-await.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-regenerator-await.js
new file mode 100644
index 0000000000..a4dd55f1ec
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-regenerator-await.js
@@ -0,0 +1,116 @@
+var webpack3Babel6StepOverRegeneratorAwait =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
+
+var fn = function () {
+ var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
+ return regeneratorRuntime.wrap(function _callee$(_context) {
+ while (1) {
+ switch (_context.prev = _context.next) {
+ case 0:
+ console.log("pause here");
+
+ _context.next = 3;
+ return doAsync();
+
+ case 3:
+
+ console.log("stopped here");
+
+ case 4:
+ case "end":
+ return _context.stop();
+ }
+ }
+ }, _callee, this);
+ }));
+
+ function fn() {
+ return _ref.apply(this, arguments);
+ }
+
+ return fn;
+}();
+
+function doAsync() {
+ return Promise.resolve();
+}
+
+function root() {
+ fn();
+}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=step-over-regenerator-await.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-regenerator-await.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-regenerator-await.js.map
new file mode 100644
index 0000000000..836ba0aa46
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/step-over-regenerator-await.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel6://./step-over-regenerator-await/webpack/bootstrap 57eae5af19075dda4a15","webpack3-babel6://./step-over-regenerator-await/./input.js"],"names":["fn","console","log","doAsync","Promise","resolve","root"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;;AC7DA,IAAIA;AAAA,qEAAK;AAAA;AAAA;AAAA;AAAA;AACPC,oBAAQC,GAAR,CAAY,YAAZ;;AADO;AAAA,mBAGDC,SAHC;;AAAA;;AAKPF,oBAAQC,GAAR,CAAY,cAAZ;;AALO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAAL;;AAAA,WAAoBF,EAApB;AAAA;AAAA;;AAAA,SAAoBA,EAApB;AAAA,GAAJ;;AAQA,SAASG,OAAT,GAAmB;AACjB,SAAOC,QAAQC,OAAR,EAAP;AACD;;AAEc,SAASC,IAAT,GAAgB;AAC7BN;AACD,C","file":"step-over-regenerator-await.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 57eae5af19075dda4a15","var fn = async function fn() {\n console.log(\"pause here\");\n\n await doAsync();\n\n console.log(\"stopped here\");\n};\n\nfunction doAsync() {\n return Promise.resolve();\n}\n\nexport default function root() {\n fn();\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/switches.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/switches.js
new file mode 100644
index 0000000000..8366bcc646
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/switches.js
@@ -0,0 +1,91 @@
+var webpack3Babel6Switches =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+function root() {
+ var val = 1;
+
+ switch (true) {
+ case true:
+ var _val = 2;
+ console.log("pause here", root);
+ default:
+ {
+ var _val2 = 3;
+ console.log("pause here", root);
+ }
+ }
+}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=switches.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/switches.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/switches.js.map
new file mode 100644
index 0000000000..255576cff0
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/switches.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel6://./switches/webpack/bootstrap d8c7df51051aca8e072c","webpack3-babel6://./switches/./input.js"],"names":["root","val","console","log"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;AC7De,SAASA,IAAT,GAAgB;AAC7B,MAAIC,MAAM,CAAV;;AAEA,UAAQ,IAAR;AACE,SAAK,IAAL;AACE,UAAIA,OAAM,CAAV;AACAC,cAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B;AACF;AAAS;AACP,YAAIC,QAAM,CAAV;AACAC,gBAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B;AACD;AAPH;AASD,C","file":"switches.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap d8c7df51051aca8e072c","export default function root() {\n let val = 1;\n\n switch (true) {\n case true:\n let val = 2;\n console.log(\"pause here\", root);\n default: {\n let val = 3;\n console.log(\"pause here\", root);\n }\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/this-arguments-bindings.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/this-arguments-bindings.js
new file mode 100644
index 0000000000..63b6778d0b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/this-arguments-bindings.js
@@ -0,0 +1,94 @@
+var webpack3Babel6ThisArgumentsBindings =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+function root() {
+ function fn(arg) {
+ var _this = this,
+ _arguments = arguments;
+
+ console.log(this, arguments);
+ console.log("pause here", fn, root);
+
+ var arrow = function arrow(argArrow) {
+ console.log(_this, _arguments);
+ console.log("pause here", fn, root);
+ };
+ arrow("arrow-arg");
+ }
+
+ fn.call("this-value", "arg-value");
+}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=this-arguments-bindings.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/this-arguments-bindings.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/this-arguments-bindings.js.map
new file mode 100644
index 0000000000..6c0aae036c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/this-arguments-bindings.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel6://./this-arguments-bindings/webpack/bootstrap da47ecb0991a19c30a30","webpack3-babel6://./this-arguments-bindings/./input.js"],"names":["root","fn","arg","console","log","arguments","arrow","call"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;AC7De,SAASA,IAAT,GAAgB;AAC7B,WAASC,EAAT,CAAYC,GAAZ,EAAiB;AAAA;AAAA;;AACfC,YAAQC,GAAR,CAAY,IAAZ,EAAkBC,SAAlB;AACAF,YAAQC,GAAR,CAAY,YAAZ,EAA0BH,EAA1B,EAA8BD,IAA9B;;AAEA,QAAMM,QAAQ,SAARA,KAAQ,WAAY;AACxBH,cAAQC,GAAR,CAAY,KAAZ,EAAkBC,UAAlB;AACAF,cAAQC,GAAR,CAAY,YAAZ,EAA0BH,EAA1B,EAA8BD,IAA9B;AACD,KAHD;AAIAM,UAAM,WAAN;AACD;;AAEDL,KAAGM,IAAH,CAAQ,YAAR,EAAsB,WAAtB;AACD,C","file":"this-arguments-bindings.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap da47ecb0991a19c30a30","export default function root() {\n function fn(arg) {\n console.log(this, arguments);\n console.log(\"pause here\", fn, root);\n\n const arrow = argArrow => {\n console.log(this, arguments);\n console.log(\"pause here\", fn, root);\n };\n arrow(\"arrow-arg\");\n }\n\n fn.call(\"this-value\", \"arg-value\");\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/try-catches.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/try-catches.js
new file mode 100644
index 0000000000..d5835a616f
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/try-catches.js
@@ -0,0 +1,87 @@
+var webpack3Babel6TryCatches =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+function root() {
+ var one = 1;
+
+ try {
+ throw "AnError";
+ } catch (err) {
+ var two = 2;
+ console.log("pause here", root);
+ }
+}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=try-catches.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/try-catches.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/try-catches.js.map
new file mode 100644
index 0000000000..0bd38e41fc
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/try-catches.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel6://./try-catches/webpack/bootstrap b6d0a31d136cf61dfd0f","webpack3-babel6://./try-catches/./input.js"],"names":["root","one","err","two","console","log"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;AC7De,SAASA,IAAT,GAAgB;AAC7B,MAAMC,MAAM,CAAZ;;AAEA,MAAI;AACF,UAAM,SAAN;AACD,GAFD,CAEE,OAAOC,GAAP,EAAY;AACZ,QAAIC,MAAM,CAAV;AACAC,YAAQC,GAAR,CAAY,YAAZ,EAA0BL,IAA1B;AACD;AACF,C","file":"try-catches.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap b6d0a31d136cf61dfd0f","export default function root() {\n const one = 1;\n\n try {\n throw \"AnError\";\n } catch (err) {\n let two = 2;\n console.log(\"pause here\", root);\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/type-module.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/type-module.js
new file mode 100644
index 0000000000..f3eb966a8c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/type-module.js
@@ -0,0 +1,84 @@
+var webpack3Babel6TypeModule =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+var moduleScoped = 1;
+var alsoModuleScoped = 2;
+
+function thirdModuleScoped() {}
+
+/* harmony default export */ __webpack_exports__["default"] = (function () {
+ console.log("pause here", moduleScoped, alsoModuleScoped, thirdModuleScoped);
+});
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=type-module.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/type-module.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/type-module.js.map
new file mode 100644
index 0000000000..53372dde49
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/type-module.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel6://./type-module/webpack/bootstrap db411f8dc179567fc770","webpack3-babel6://./type-module/./input.js"],"names":["moduleScoped","alsoModuleScoped","thirdModuleScoped","console","log"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;AC7DA;AAAA,IAAIA,eAAe,CAAnB;AACA,IAAIC,mBAAmB,CAAvB;;AAEA,SAASC,iBAAT,GAA6B,CAAE;;AAE/B,+DAAe,YAAW;AACxBC,UAAQC,GAAR,CAAY,YAAZ,EAA0BJ,YAA1B,EAAwCC,gBAAxC,EAA0DC,iBAA1D;AACD,C","file":"type-module.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap db411f8dc179567fc770","var moduleScoped = 1;\nlet alsoModuleScoped = 2;\n\nfunction thirdModuleScoped() {}\n\nexport default function() {\n console.log(\"pause here\", moduleScoped, alsoModuleScoped, thirdModuleScoped);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/type-script-cjs.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/type-script-cjs.js
new file mode 100644
index 0000000000..05bde8e999
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/type-script-cjs.js
@@ -0,0 +1,87 @@
+var webpack3Babel6TypeScriptCjs =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var moduleScoped = 1;
+var alsoModuleScopes = 2;
+
+function thirdModuleScoped() {}
+
+function nonModules() {
+ console.log("pause here");
+}
+
+exports.default = nonModules;
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=type-script-cjs.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/type-script-cjs.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/type-script-cjs.js.map
new file mode 100644
index 0000000000..d3e562ddf0
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/type-script-cjs.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel6://./type-script-cjs/webpack/bootstrap 4f0d54c1745e30f374c6","webpack3-babel6://./type-script-cjs/./input.js"],"names":["moduleScoped","alsoModuleScopes","thirdModuleScoped","nonModules","console","log","exports","default"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;AC7DA,IAAIA,eAAe,CAAnB;AACA,IAAIC,mBAAmB,CAAvB;;AAEA,SAASC,iBAAT,GAA6B,CAAE;;AAE/B,SAASC,UAAT,GAAsB;AACpBC,UAAQC,GAAR,CAAY,YAAZ;AACD;;AAEDC,QAAQC,OAAR,GAAkBJ,UAAlB,C","file":"type-script-cjs.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 4f0d54c1745e30f374c6","var moduleScoped = 1;\nlet alsoModuleScopes = 2;\n\nfunction thirdModuleScoped() {}\n\nfunction nonModules() {\n console.log(\"pause here\");\n}\n\nexports.default = nonModules;\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/typescript-classes.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/typescript-classes.js
new file mode 100644
index 0000000000..ae0221da8d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/typescript-classes.js
@@ -0,0 +1,75 @@
+var webpack3Babel6TypescriptClasses =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports) {
+
+throw new Error("Module parse failed: Unexpected character '@' (8:0)\nYou may need an appropriate loader to handle this file type.\n| import * as ns from './src/mod.ts';\n| \n| @decoratorFactory({\n| selector: 'app-root',\n| })");
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=typescript-classes.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/typescript-classes.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/typescript-classes.js.map
new file mode 100644
index 0000000000..5695af9f34
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/typescript-classes.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel6://./typescript-classes/webpack/bootstrap 5a79a0dc2075d393b2d5"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA","file":"typescript-classes.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 5a79a0dc2075d393b2d5"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/webpack-functions.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/webpack-functions.js
new file mode 100644
index 0000000000..779dbf0ab9
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/webpack-functions.js
@@ -0,0 +1,88 @@
+var webpack3Babel6WebpackFunctions =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+var module = {};
+
+module.exports = function (x) {
+ return x * 2;
+};
+
+function root() {
+ // This example is structures to look like CommonJS in order to replicate
+ // a previously-encountered bug.
+ module.exports(4);
+}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=webpack-functions.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/webpack-functions.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/webpack-functions.js.map
new file mode 100644
index 0000000000..3fc087b1b6
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/webpack-functions.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel6://./webpack-functions/webpack/bootstrap 4996959c7ebc2d63fb36","webpack3-babel6://./webpack-functions/./input.js"],"names":["module","exports","x","root"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;AC7DA;AAAA,IAAIA,SAAS,EAAb;;AAEAA,OAAOC,OAAP,GAAiB,UAASC,CAAT,EAAY;AAC3B,SAAOA,IAAI,CAAX;AACD,CAFD;;AAKe,SAASC,IAAT,GAAgB;AAC7B;AACA;AACAH,SAAOC,OAAP,CAAe,CAAf;AACD,C","file":"webpack-functions.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 4996959c7ebc2d63fb36","var module = {};\n\nmodule.exports = function(x) {\n return x * 2;\n};\n\n\nexport default function root() {\n // This example is structures to look like CommonJS in order to replicate\n // a previously-encountered bug.\n module.exports(4);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/webpack-line-mappings.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/webpack-line-mappings.js
new file mode 100644
index 0000000000..5e1c9c6531
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/webpack-line-mappings.js
@@ -0,0 +1,105 @@
+var webpack3Babel6WebpackLineMappings =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_mod1__ = __webpack_require__(1);
+
+
+function root() {
+ var one = 1;
+
+ {
+ var two = 2;
+
+ var fn = function someName(arg) {
+ console.log(this, arguments);
+ console.log("pause here", __WEBPACK_IMPORTED_MODULE_0__src_mod1__["a" /* default */], one, two, fn, arg);
+
+ var inner = function inner(arg) {
+ var body = "42";console.log("pause here", body, root);
+ };
+ inner();
+ };
+ fn.call("this-value", "arg-value");
+ }
+}
+
+/***/ }),
+/* 1 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony default export */ __webpack_exports__["a"] = ("a-default");
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=webpack-line-mappings.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/webpack-line-mappings.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/webpack-line-mappings.js.map
new file mode 100644
index 0000000000..169b6d5e7c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel6/webpack-line-mappings.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel6://./webpack-line-mappings/webpack/bootstrap b36d367805d9f57737be","webpack3-babel6://./webpack-line-mappings/./input.js","webpack3-babel6://./webpack-line-mappings/./src/mod1.js"],"names":["root","one","two","fn","someName","arg","console","log","arguments","inner","body","call"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;AC7DA;;AAEe,SAASA,IAAT,GAAgB;AAC7B,MAAIC,MAAM,CAAV;;AAEA;AACE,QAAMC,MAAM,CAAZ;;AAEA,QAAIC,KAAK,SAASC,QAAT,CAAkBC,GAAlB,EAAuB;AAC9BC,cAAQC,GAAR,CAAY,IAAZ,EAAkBC,SAAlB;AACAF,cAAQC,GAAR,CAAY,YAAZ,EAA0B,0DAA1B,EAAoCN,GAApC,EAAyCC,GAAzC,EAA8CC,EAA9C,EAAkDE,GAAlD;;AAEA,UAAII,QAAQ,SAARA,KAAQ,CAACJ,GAAD,EAAS;AAAE,YAAIK,OAAO,IAAX,CAAiBJ,QAAQC,GAAR,CAAY,YAAZ,EAA0BG,IAA1B,EAAgCV,IAAhC;AAAwC,OAAhF;AACAS;AACD,KAND;AAOAN,OAAGQ,IAAH,CAAQ,YAAR,EAAsB,WAAtB;AACD;AACF,C;;;;;;;ACjBD,yDAAe,WAAf,E","file":"webpack-line-mappings.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap b36d367805d9f57737be","import aDefault from \"./src/mod1\";\n\nexport default function root() {\n let one = 1;\n\n {\n const two = 2;\n\n var fn = function someName(arg) {\n console.log(this, arguments);\n console.log(\"pause here\", aDefault, one, two, fn, arg);\n\n var inner = (arg) => { var body = \"42\"; console.log(\"pause here\", body, root); };\n inner();\n };\n fn.call(\"this-value\", \"arg-value\");\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js","export default \"a-default\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod1.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/babel-bindings-with-flow.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/babel-bindings-with-flow.js
new file mode 100644
index 0000000000..04ee928a70
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/babel-bindings-with-flow.js
@@ -0,0 +1,94 @@
+var webpack3Babel7BabelBindingsWithFlow =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_mod__ = __webpack_require__(1);
+// Webpack doesn't map import declarations well, so doing this forces binding
+// processing to only process the binding being cast when searching for
+// matches. That way we can properly test if the flow cast causes problems.
+
+function root() {
+ var value = __WEBPACK_IMPORTED_MODULE_0__src_mod__["a" /* aNamed */];
+ console.log("pause here", root, value);
+}
+
+/***/ }),
+/* 1 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return aNamed; });
+var aNamed = "a-named";
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=babel-bindings-with-flow.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/babel-bindings-with-flow.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/babel-bindings-with-flow.js.map
new file mode 100644
index 0000000000..1854e0523d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/babel-bindings-with-flow.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel7://./babel-bindings-with-flow/webpack/bootstrap d85ecacabd5c6cdc4cab","webpack3-babel7://./babel-bindings-with-flow/./input.js","webpack3-babel7://./babel-bindings-with-flow/./src/mod.js"],"names":["root","value","console","log","aNamed"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;AC7DA;AAAA;AACA;AACA;AACA;AAEe,SAASA,IAAT,GAAgB;AAC7B,MAAIC,QAAS,wDAAb;AAEAC,UAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B,EAAgCC,KAAhC;AACD,C;;;;;;;;ACTM,IAAMG,SAAS,SAAf,C","file":"babel-bindings-with-flow.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap d85ecacabd5c6cdc4cab","// Webpack doesn't map import declarations well, so doing this forces binding\n// processing to only process the binding being cast when searching for\n// matches. That way we can properly test if the flow cast causes problems.\nimport { aNamed } from \"./src/mod\";\n\nexport default function root() {\n var value = (aNamed: Array<string>);\n\n console.log(\"pause here\", root, value);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js","export const aNamed = \"a-named\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/babel-classes.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/babel-classes.js
new file mode 100644
index 0000000000..d10327e1cb
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/babel-classes.js
@@ -0,0 +1,112 @@
+var webpack3Babel7BabelClasses =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
+
+function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+function root() {
+ var Another =
+ /*#__PURE__*/
+ function () {
+ function Another() {
+ var _this = this;
+
+ _classCallCheck(this, Another);
+
+ _defineProperty(this, "bound", function () {
+ return _this;
+ });
+ }
+
+ _createClass(Another, [{
+ key: "method",
+ value: function method() {
+ var two = 2;
+ console.log("pause here", Another, root);
+ }
+ }]);
+
+ return Another;
+ }();
+
+ new Another().method();
+}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=babel-classes.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/babel-classes.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/babel-classes.js.map
new file mode 100644
index 0000000000..2adba98c6a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/babel-classes.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel7://./babel-classes/webpack/bootstrap 21c3483666431a1bbc91","webpack3-babel7://./babel-classes/./input.js"],"names":["root","Another","two","console","log","method"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;;;;;;;;AC7De,SAASA,IAAT,GAAgB;AAAA,MACvBC,OADuB;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA,qCAEnB,YAAM;AACZ,eAAO,KAAP;AACD,OAJ0B;AAAA;;AAAA;AAAA;AAAA,+BAMlB;AACP,YAAIC,MAAM,CAAV;AAEAC,gBAAQC,GAAR,CAAY,YAAZ,EAA0BH,OAA1B,EAAmCD,IAAnC;AACD;AAV0B;;AAAA;AAAA;;AAa7B,MAAIC,OAAJ,GAAcI,MAAd;AACD,C","file":"babel-classes.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 21c3483666431a1bbc91","export default function root() {\n class Another {\n bound = () => {\n return this;\n }\n\n method() {\n let two = 2;\n\n console.log(\"pause here\", Another, root);\n }\n }\n\n new Another().method();\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/babel-flowtype-bindings.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/babel-flowtype-bindings.js
new file mode 100644
index 0000000000..d333ffe472
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/babel-flowtype-bindings.js
@@ -0,0 +1,92 @@
+var webpack3Babel7BabelFlowtypeBindings =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_mod__ = __webpack_require__(1);
+
+var aConst = "a-const";
+function root() {
+ console.log("pause here", aConst, __WEBPACK_IMPORTED_MODULE_0__src_mod__["a" /* Four */], root);
+}
+
+/***/ }),
+/* 1 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return Four; });
+/* unused harmony default export */ var _unused_webpack_default_export = ("a-default");
+var Four = "one";
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=babel-flowtype-bindings.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/babel-flowtype-bindings.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/babel-flowtype-bindings.js.map
new file mode 100644
index 0000000000..23dccd4414
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/babel-flowtype-bindings.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel7://./babel-flowtype-bindings/webpack/bootstrap a5b9e4b853438d129efd","webpack3-babel7://./babel-flowtype-bindings/./input.js","webpack3-babel7://./babel-flowtype-bindings/./src/mod.js"],"names":["aConst","root","console","log","Four"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;AC5DA;AAIA,IAAMA,SAAS,SAAf;AAEe,SAASC,IAAT,GAAgB;AAC7BC,UAAQC,GAAR,CAAY,YAAZ,EAA0BH,MAA1B,EAAkC,sDAAlC,EAAwCC,IAAxC;AACD,C;;;;;;;;ACTD,0EAAe,WAAf;AACO,IAAMG,OAAO,KAAb,C","file":"babel-flowtype-bindings.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap a5b9e4b853438d129efd","import type { One, Two, Three } from \"./src/mod\";\nimport { Four, type Five, typeof Six } from \"./src/mod\";\n\ntype Other = {};\n\nconst aConst = \"a-const\";\n\nexport default function root() {\n console.log(\"pause here\", aConst, Four, root);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js","export default \"a-default\";\nexport const Four = \"one\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/classes.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/classes.js
new file mode 100644
index 0000000000..2ecfe4491f
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/classes.js
@@ -0,0 +1,125 @@
+var webpack3Babel7Classes =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
+
+function root() {
+ var one = 1;
+
+ var Thing =
+ /*#__PURE__*/
+ function () {
+ function Thing() {
+ _classCallCheck(this, Thing);
+ }
+
+ _createClass(Thing, [{
+ key: "one",
+ value: function one() {
+ console.log("pause here");
+ }
+ }]);
+
+ return Thing;
+ }();
+
+ var Another =
+ /*#__PURE__*/
+ function () {
+ function Another() {
+ _classCallCheck(this, Another);
+ }
+
+ _createClass(Another, [{
+ key: "method",
+ value: function method() {
+ var two = 2;
+ var three = 3;
+ console.log("pause here", Another, one, Thing, root);
+ }
+ }]);
+
+ return Another;
+ }();
+
+ new Another().method();
+ new Thing().one();
+}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=classes.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/classes.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/classes.js.map
new file mode 100644
index 0000000000..c9603c276d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/classes.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel7://./classes/webpack/bootstrap a1c68e53f1264caf06cf","webpack3-babel7://./classes/./input.js"],"names":["root","one","Thing","console","log","Another","two","three","method"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;;;;;;AC7De,SAASA,IAAT,GAAgB;AAC7B,MAAIC,MAAM,CAAV;;AAD6B,MAGvBC,KAHuB;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,4BAIrB;AACJC,gBAAQC,GAAR,CAAY,YAAZ;AACD;AAN0B;;AAAA;AAAA;;AAAA,MASvBC,OATuB;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,+BAUlB;AACP,YAAIC,MAAM,CAAV;AAEA,YAAMC,QAAQ,CAAd;AAEAJ,gBAAQC,GAAR,CAAY,YAAZ,EAA0BC,OAA1B,EAAmCJ,GAAnC,EAAwCC,KAAxC,EAA+CF,IAA/C;AACD;AAhB0B;;AAAA;AAAA;;AAmB7B,MAAIK,OAAJ,GAAcG,MAAd;AACA,MAAIN,KAAJ,GAAYD,GAAZ;AACD,C","file":"classes.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap a1c68e53f1264caf06cf","export default function root() {\n let one = 1;\n\n class Thing {\n one() {\n console.log(\"pause here\");\n }\n }\n\n class Another {\n method() {\n let two = 2;\n\n const three = 3;\n\n console.log(\"pause here\", Another, one, Thing, root);\n }\n }\n\n new Another().method();\n new Thing().one();\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/esmodules-cjs.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/esmodules-cjs.js
new file mode 100644
index 0000000000..731c9e9712
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/esmodules-cjs.js
@@ -0,0 +1,290 @@
+var webpack3Babel7EsmodulesCjs =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = root;
+exports.example = example;
+
+var _mod = _interopRequireDefault(__webpack_require__(1));
+
+var _mod2 = __webpack_require__(2);
+
+var _mod3 = __webpack_require__(3);
+
+var aNamespace = _interopRequireWildcard(__webpack_require__(4));
+
+var _mod5 = _interopRequireDefault(__webpack_require__(5));
+
+var _mod6 = __webpack_require__(6);
+
+var _mod7 = __webpack_require__(7);
+
+var _mod8 = _interopRequireDefault(__webpack_require__(8));
+
+var _mod9 = __webpack_require__(9);
+
+var _mod10 = __webpack_require__(10);
+
+var _optimizedOut = _interopRequireDefault(__webpack_require__(11));
+
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+(0, _optimizedOut.default)();
+
+function root() {
+ console.log("pause here", root);
+ console.log(_mod.default);
+ console.log(_mod3.original);
+ console.log(_mod2.aNamed);
+ console.log(_mod2.aNamed);
+ console.log(aNamespace);
+
+ try {
+ // None of these are callable in this code, but we still want to make sure
+ // they map properly even if the only reference is in a call expressions.
+ console.log((0, _mod5.default)());
+ console.log((0, _mod7.original)());
+ console.log((0, _mod6.aNamed2)());
+ console.log((0, _mod6.aNamed2)());
+ console.log(new _mod8.default());
+ console.log(new _mod10.original());
+ console.log(new _mod9.aNamed3());
+ console.log(new _mod9.aNamed3());
+ } catch (e) {}
+}
+
+function example() {}
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+var _default = "a-default";
+exports.default = _default;
+
+/***/ }),
+/* 2 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.aNamed = void 0;
+var aNamed = "a-named";
+exports.aNamed = aNamed;
+
+/***/ }),
+/* 3 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.original = void 0;
+var original = "an-original";
+exports.original = original;
+
+/***/ }),
+/* 4 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.aNamed = exports.default = void 0;
+var _default = "a-default";
+exports.default = _default;
+var aNamed = "a-named";
+exports.aNamed = aNamed;
+
+/***/ }),
+/* 5 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+var _default = "a-default2";
+exports.default = _default;
+
+/***/ }),
+/* 6 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.aNamed2 = void 0;
+var aNamed2 = "a-named2";
+exports.aNamed2 = aNamed2;
+
+/***/ }),
+/* 7 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.original = void 0;
+var original = "an-original2";
+exports.original = original;
+
+/***/ }),
+/* 8 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+var _default = "a-default3";
+exports.default = _default;
+
+/***/ }),
+/* 9 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.aNamed3 = void 0;
+var aNamed3 = "a-named3";
+exports.aNamed3 = aNamed3;
+
+/***/ }),
+/* 10 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.original = void 0;
+var original = "an-original3";
+exports.original = original;
+
+/***/ }),
+/* 11 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = optimizedOut;
+
+function optimizedOut() {}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=esmodules-cjs.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/esmodules-cjs.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/esmodules-cjs.js.map
new file mode 100644
index 0000000000..e5b84d103c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/esmodules-cjs.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel7://./esmodules-cjs/webpack/bootstrap 2e7cb6d934d81b77b959","webpack3-babel7://./esmodules-cjs/./input.js","webpack3-babel7://./esmodules-cjs/./src/mod1.js","webpack3-babel7://./esmodules-cjs/./src/mod2.js","webpack3-babel7://./esmodules-cjs/./src/mod3.js","webpack3-babel7://./esmodules-cjs/./src/mod4.js","webpack3-babel7://./esmodules-cjs/./src/mod5.js","webpack3-babel7://./esmodules-cjs/./src/mod6.js","webpack3-babel7://./esmodules-cjs/./src/mod7.js","webpack3-babel7://./esmodules-cjs/./src/mod9.js","webpack3-babel7://./esmodules-cjs/./src/mod10.js","webpack3-babel7://./esmodules-cjs/./src/mod11.js","webpack3-babel7://./esmodules-cjs/./src/optimized-out.js"],"names":["root","console","log","aDefault","anAliased","aNamed","anotherNamed","aNamespace","aDefault3","anAliased3","aNamed3","anotherNamed3","e","example","original","aNamed2","optimizedOut"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;;;;;;AC7DA;;AACA;;AACA;;AACA;;AAEA;;AACA;;AACA;;AAEA;;AACA;;AACA;;AAEA;;;;;;AACA;;AAEe,SAASA,IAAT,GAAgB;AAC7BC,UAAQC,GAAR,CAAY,YAAZ,EAA0BF,IAA1B;AAEAC,UAAQC,GAAR,CAAYC,YAAZ;AACAF,UAAQC,GAAR,CAAYE,cAAZ;AACAH,UAAQC,GAAR,CAAYG,YAAZ;AACAJ,UAAQC,GAAR,CAAYI,YAAZ;AACAL,UAAQC,GAAR,CAAYK,UAAZ;;AAEA,MAAI;AACF;AACA;AACAN,YAAQC,GAAR,CAAY,oBAAZ;AACAD,YAAQC,GAAR,CAAY,qBAAZ;AACAD,YAAQC,GAAR,CAAY,oBAAZ;AACAD,YAAQC,GAAR,CAAY,oBAAZ;AAEAD,YAAQC,GAAR,CAAY,IAAIM,aAAJ,EAAZ;AACAP,YAAQC,GAAR,CAAY,IAAIO,eAAJ,EAAZ;AACAR,YAAQC,GAAR,CAAY,IAAIQ,aAAJ,EAAZ;AACAT,YAAQC,GAAR,CAAY,IAAIS,aAAJ,EAAZ;AACD,GAZD,CAYE,OAAOC,CAAP,EAAU,CAAE;AACf;;AAEM,SAASC,OAAT,GAAkB,CAAE,C;;;;;;;;;;;;;eCxCZ,W;;;;;;;;;;;;;;ACAR,IAAMR,SAAS,SAAf;;;;;;;;;;;;;;ACAA,IAAMS,WAAW,aAAjB;;;;;;;;;;;;;;eCAQ,W;;AACR,IAAMT,SAAS,SAAf;;;;;;;;;;;;;;eCDQ,Y;;;;;;;;;;;;;;ACAR,IAAMU,UAAU,UAAhB;;;;;;;;;;;;;;ACAA,IAAMD,WAAW,cAAjB;;;;;;;;;;;;;;eCAQ,Y;;;;;;;;;;;;;;ACAR,IAAMJ,UAAU,UAAhB;;;;;;;;;;;;;;ACAA,IAAMI,WAAW,cAAjB;;;;;;;;;;;;;;;ACAQ,SAASE,YAAT,GAAwB,CAAE,C","file":"esmodules-cjs.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 2e7cb6d934d81b77b959","import aDefault from \"./src/mod1\";\nimport { aNamed, aNamed as anotherNamed } from \"./src/mod2\";\nimport { original as anAliased } from \"./src/mod3\";\nimport * as aNamespace from \"./src/mod4\";\n\nimport aDefault2 from \"./src/mod5\";\nimport { aNamed2, aNamed2 as anotherNamed2 } from \"./src/mod6\";\nimport { original as anAliased2 } from \"./src/mod7\";\n\nimport aDefault3 from \"./src/mod9\";\nimport { aNamed3, aNamed3 as anotherNamed3 } from \"./src/mod10\";\nimport { original as anAliased3 } from \"./src/mod11\";\n\nimport optimizedOut from \"./src/optimized-out\";\noptimizedOut();\n\nexport default function root() {\n console.log(\"pause here\", root);\n\n console.log(aDefault);\n console.log(anAliased);\n console.log(aNamed);\n console.log(anotherNamed);\n console.log(aNamespace);\n\n try {\n // None of these are callable in this code, but we still want to make sure\n // they map properly even if the only reference is in a call expressions.\n console.log(aDefault2());\n console.log(anAliased2());\n console.log(aNamed2());\n console.log(anotherNamed2());\n\n console.log(new aDefault3());\n console.log(new anAliased3());\n console.log(new aNamed3());\n console.log(new anotherNamed3());\n } catch (e) {}\n}\n\nexport function example(){}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js","export default \"a-default\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod1.js","export const aNamed = \"a-named\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod2.js","export const original = \"an-original\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod3.js","export default \"a-default\";\nexport const aNamed = \"a-named\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod4.js","export default \"a-default2\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod5.js","export const aNamed2 = \"a-named2\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod6.js","export const original = \"an-original2\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod7.js","export default \"a-default3\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod9.js","export const aNamed3 = \"a-named3\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod10.js","export const original = \"an-original3\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod11.js","export default function optimizedOut() {}\n\n\n\n// WEBPACK FOOTER //\n// ./src/optimized-out.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/esmodules-es6.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/esmodules-es6.js
new file mode 100644
index 0000000000..54ed6dad2f
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/esmodules-es6.js
@@ -0,0 +1,217 @@
+var webpack3Babel7EsmodulesEs6 =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+/* harmony export (immutable) */ __webpack_exports__["example"] = example;
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_mod1__ = __webpack_require__(1);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__src_mod2__ = __webpack_require__(2);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__src_mod3__ = __webpack_require__(3);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__src_mod4__ = __webpack_require__(4);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__src_mod5__ = __webpack_require__(5);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__src_mod6__ = __webpack_require__(6);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__src_mod7__ = __webpack_require__(7);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__src_mod9__ = __webpack_require__(8);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__src_mod10__ = __webpack_require__(9);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__src_mod11__ = __webpack_require__(10);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__src_optimized_out__ = __webpack_require__(11);
+
+
+
+
+
+
+
+
+
+
+
+Object(__WEBPACK_IMPORTED_MODULE_10__src_optimized_out__["a" /* default */])();
+function root() {
+ console.log("pause here", root);
+ console.log(__WEBPACK_IMPORTED_MODULE_0__src_mod1__["a" /* default */]);
+ console.log(__WEBPACK_IMPORTED_MODULE_2__src_mod3__["a" /* original */]);
+ console.log(__WEBPACK_IMPORTED_MODULE_1__src_mod2__["a" /* aNamed */]);
+ console.log(__WEBPACK_IMPORTED_MODULE_1__src_mod2__["a" /* aNamed */]);
+ console.log(__WEBPACK_IMPORTED_MODULE_3__src_mod4__);
+
+ try {
+ // None of these are callable in this code, but we still want to make sure
+ // they map properly even if the only reference is in a call expressions.
+ console.log(Object(__WEBPACK_IMPORTED_MODULE_4__src_mod5__["a" /* default */])());
+ console.log(Object(__WEBPACK_IMPORTED_MODULE_6__src_mod7__["a" /* original */])());
+ console.log(Object(__WEBPACK_IMPORTED_MODULE_5__src_mod6__["a" /* aNamed2 */])());
+ console.log(Object(__WEBPACK_IMPORTED_MODULE_5__src_mod6__["a" /* aNamed2 */])());
+ console.log(new __WEBPACK_IMPORTED_MODULE_7__src_mod9__["a" /* default */]());
+ console.log(new __WEBPACK_IMPORTED_MODULE_9__src_mod11__["a" /* original */]());
+ console.log(new __WEBPACK_IMPORTED_MODULE_8__src_mod10__["a" /* aNamed3 */]());
+ console.log(new __WEBPACK_IMPORTED_MODULE_8__src_mod10__["a" /* aNamed3 */]());
+ } catch (e) {}
+}
+function example() {}
+
+/***/ }),
+/* 1 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony default export */ __webpack_exports__["a"] = ("a-default");
+
+/***/ }),
+/* 2 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+const aNamed = "a-named";
+/* harmony export (immutable) */ __webpack_exports__["a"] = aNamed;
+
+
+/***/ }),
+/* 3 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+const original = "an-original";
+/* harmony export (immutable) */ __webpack_exports__["a"] = original;
+
+
+/***/ }),
+/* 4 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony default export */ __webpack_exports__["default"] = ("a-default");
+const aNamed = "a-named";
+/* harmony export (immutable) */ __webpack_exports__["aNamed"] = aNamed;
+
+
+/***/ }),
+/* 5 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony default export */ __webpack_exports__["a"] = ("a-default2");
+
+/***/ }),
+/* 6 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+const aNamed2 = "a-named2";
+/* harmony export (immutable) */ __webpack_exports__["a"] = aNamed2;
+
+
+/***/ }),
+/* 7 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+const original = "an-original2";
+/* harmony export (immutable) */ __webpack_exports__["a"] = original;
+
+
+/***/ }),
+/* 8 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony default export */ __webpack_exports__["a"] = ("a-default3");
+
+/***/ }),
+/* 9 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+const aNamed3 = "a-named3";
+/* harmony export (immutable) */ __webpack_exports__["a"] = aNamed3;
+
+
+/***/ }),
+/* 10 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+const original = "an-original3";
+/* harmony export (immutable) */ __webpack_exports__["a"] = original;
+
+
+/***/ }),
+/* 11 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (immutable) */ __webpack_exports__["a"] = optimizedOut;
+function optimizedOut() {}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=esmodules-es6.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/esmodules-es6.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/esmodules-es6.js.map
new file mode 100644
index 0000000000..bc99d11fe8
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/esmodules-es6.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel7://./esmodules-es6/webpack/bootstrap dc6228bd0964931d895b","webpack3-babel7://./esmodules-es6/./input.js","webpack3-babel7://./esmodules-es6/./src/mod1.js","webpack3-babel7://./esmodules-es6/./src/mod2.js","webpack3-babel7://./esmodules-es6/./src/mod3.js","webpack3-babel7://./esmodules-es6/./src/mod4.js","webpack3-babel7://./esmodules-es6/./src/mod5.js","webpack3-babel7://./esmodules-es6/./src/mod6.js","webpack3-babel7://./esmodules-es6/./src/mod7.js","webpack3-babel7://./esmodules-es6/./src/mod9.js","webpack3-babel7://./esmodules-es6/./src/mod10.js","webpack3-babel7://./esmodules-es6/./src/mod11.js","webpack3-babel7://./esmodules-es6/./src/optimized-out.js"],"names":["optimizedOut","root","console","log","aDefault2","anAliased2","aNamed2","anotherNamed2","e","example","aNamed","original","aNamed3"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;;;;;;;;;;;;AC7DA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA,4EAAAA;AAEe,SAASC,IAAT,GAAgB;AAC7BC,UAAQC,GAAR,CAAY,YAAZ,EAA0BF,IAA1B;AAEAC,UAAQC,GAAR,CAAY,0DAAZ;AACAD,UAAQC,GAAR,CAAY,2DAAZ;AACAD,UAAQC,GAAR,CAAY,yDAAZ;AACAD,UAAQC,GAAR,CAAY,yDAAZ;AACAD,UAAQC,GAAR,CAAY,uCAAZ;;AAEA,MAAI;AACF;AACA;AACAD,YAAQC,GAAR,CAAY,kEAAAC,EAAZ;AACAF,YAAQC,GAAR,CAAY,mEAAAE,EAAZ;AACAH,YAAQC,GAAR,CAAY,kEAAAG,EAAZ;AACAJ,YAAQC,GAAR,CAAY,kEAAAI,EAAZ;AAEAL,YAAQC,GAAR,CAAY,IAAI,0DAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,4DAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,2DAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,2DAAJ,EAAZ;AACD,GAZD,CAYE,OAAOK,CAAP,EAAU,CAAE;AACf;AAEM,SAASC,OAAT,GAAkB,CAAE,C;;;;;;;ACxC3B,yDAAe,WAAf,E;;;;;;;ACAO,MAAMC,SAAS,SAAf,C;;;;;;;;;ACAA,MAAMC,WAAW,aAAjB,C;;;;;;;;;;ACAP,+DAAe,WAAf;AACO,MAAMD,SAAS,SAAf,C;;;;;;;;;ACDP,yDAAe,YAAf,E;;;;;;;ACAO,MAAMJ,UAAU,UAAhB,C;;;;;;;;;ACAA,MAAMK,WAAW,cAAjB,C;;;;;;;;;ACAP,yDAAe,YAAf,E;;;;;;;ACAO,MAAMC,UAAU,UAAhB,C;;;;;;;;;ACAA,MAAMD,WAAW,cAAjB,C;;;;;;;;;;ACAQ,SAASX,YAAT,GAAwB,CAAE,C","file":"esmodules-es6.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap dc6228bd0964931d895b","import aDefault from \"./src/mod1\";\nimport { aNamed, aNamed as anotherNamed } from \"./src/mod2\";\nimport { original as anAliased } from \"./src/mod3\";\nimport * as aNamespace from \"./src/mod4\";\n\nimport aDefault2 from \"./src/mod5\";\nimport { aNamed2, aNamed2 as anotherNamed2 } from \"./src/mod6\";\nimport { original as anAliased2 } from \"./src/mod7\";\n\nimport aDefault3 from \"./src/mod9\";\nimport { aNamed3, aNamed3 as anotherNamed3 } from \"./src/mod10\";\nimport { original as anAliased3 } from \"./src/mod11\";\n\nimport optimizedOut from \"./src/optimized-out\";\noptimizedOut();\n\nexport default function root() {\n console.log(\"pause here\", root);\n\n console.log(aDefault);\n console.log(anAliased);\n console.log(aNamed);\n console.log(anotherNamed);\n console.log(aNamespace);\n\n try {\n // None of these are callable in this code, but we still want to make sure\n // they map properly even if the only reference is in a call expressions.\n console.log(aDefault2());\n console.log(anAliased2());\n console.log(aNamed2());\n console.log(anotherNamed2());\n\n console.log(new aDefault3());\n console.log(new anAliased3());\n console.log(new aNamed3());\n console.log(new anotherNamed3());\n } catch (e) {}\n}\n\nexport function example(){}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js","export default \"a-default\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod1.js","export const aNamed = \"a-named\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod2.js","export const original = \"an-original\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod3.js","export default \"a-default\";\nexport const aNamed = \"a-named\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod4.js","export default \"a-default2\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod5.js","export const aNamed2 = \"a-named2\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod6.js","export const original = \"an-original2\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod7.js","export default \"a-default3\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod9.js","export const aNamed3 = \"a-named3\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod10.js","export const original = \"an-original3\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod11.js","export default function optimizedOut() {}\n\n\n\n// WEBPACK FOOTER //\n// ./src/optimized-out.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/esmodules.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/esmodules.js
new file mode 100644
index 0000000000..c387c57206
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/esmodules.js
@@ -0,0 +1,210 @@
+var webpack3Babel7Esmodules =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+/* harmony export (immutable) */ __webpack_exports__["example"] = example;
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_mod1__ = __webpack_require__(1);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__src_mod2__ = __webpack_require__(2);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__src_mod3__ = __webpack_require__(3);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__src_mod4__ = __webpack_require__(4);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__src_mod5__ = __webpack_require__(5);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__src_mod6__ = __webpack_require__(6);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__src_mod7__ = __webpack_require__(7);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__src_mod9__ = __webpack_require__(8);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__src_mod10__ = __webpack_require__(9);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__src_mod11__ = __webpack_require__(10);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__src_optimized_out__ = __webpack_require__(11);
+
+
+
+
+
+
+
+
+
+
+
+Object(__WEBPACK_IMPORTED_MODULE_10__src_optimized_out__["a" /* default */])();
+function root() {
+ console.log("pause here", root);
+ console.log(__WEBPACK_IMPORTED_MODULE_0__src_mod1__["a" /* default */]);
+ console.log(__WEBPACK_IMPORTED_MODULE_2__src_mod3__["a" /* original */]);
+ console.log(__WEBPACK_IMPORTED_MODULE_1__src_mod2__["a" /* aNamed */]);
+ console.log(__WEBPACK_IMPORTED_MODULE_1__src_mod2__["a" /* aNamed */]);
+ console.log(__WEBPACK_IMPORTED_MODULE_3__src_mod4__);
+
+ try {
+ // None of these are callable in this code, but we still want to make sure
+ // they map properly even if the only reference is in a call expressions.
+ console.log(Object(__WEBPACK_IMPORTED_MODULE_4__src_mod5__["a" /* default */])());
+ console.log(Object(__WEBPACK_IMPORTED_MODULE_6__src_mod7__["a" /* original */])());
+ console.log(Object(__WEBPACK_IMPORTED_MODULE_5__src_mod6__["a" /* aNamed2 */])());
+ console.log(Object(__WEBPACK_IMPORTED_MODULE_5__src_mod6__["a" /* aNamed2 */])());
+ console.log(new __WEBPACK_IMPORTED_MODULE_7__src_mod9__["a" /* default */]());
+ console.log(new __WEBPACK_IMPORTED_MODULE_9__src_mod11__["a" /* original */]());
+ console.log(new __WEBPACK_IMPORTED_MODULE_8__src_mod10__["a" /* aNamed3 */]());
+ console.log(new __WEBPACK_IMPORTED_MODULE_8__src_mod10__["a" /* aNamed3 */]());
+ } catch (e) {}
+}
+function example() {}
+
+/***/ }),
+/* 1 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony default export */ __webpack_exports__["a"] = ("a-default");
+
+/***/ }),
+/* 2 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return aNamed; });
+var aNamed = "a-named";
+
+/***/ }),
+/* 3 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return original; });
+var original = "an-original";
+
+/***/ }),
+/* 4 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "aNamed", function() { return aNamed; });
+/* harmony default export */ __webpack_exports__["default"] = ("a-default");
+var aNamed = "a-named";
+
+/***/ }),
+/* 5 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony default export */ __webpack_exports__["a"] = ("a-default2");
+
+/***/ }),
+/* 6 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return aNamed2; });
+var aNamed2 = "a-named2";
+
+/***/ }),
+/* 7 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return original; });
+var original = "an-original2";
+
+/***/ }),
+/* 8 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony default export */ __webpack_exports__["a"] = ("a-default3");
+
+/***/ }),
+/* 9 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return aNamed3; });
+var aNamed3 = "a-named3";
+
+/***/ }),
+/* 10 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "a", function() { return original; });
+var original = "an-original3";
+
+/***/ }),
+/* 11 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (immutable) */ __webpack_exports__["a"] = optimizedOut;
+function optimizedOut() {}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=esmodules.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/esmodules.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/esmodules.js.map
new file mode 100644
index 0000000000..f4b91424f6
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/esmodules.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel7://./esmodules/webpack/bootstrap 9d51d7cd94bd76da017e","webpack3-babel7://./esmodules/./input.js","webpack3-babel7://./esmodules/./src/mod1.js","webpack3-babel7://./esmodules/./src/mod2.js","webpack3-babel7://./esmodules/./src/mod3.js","webpack3-babel7://./esmodules/./src/mod4.js","webpack3-babel7://./esmodules/./src/mod5.js","webpack3-babel7://./esmodules/./src/mod6.js","webpack3-babel7://./esmodules/./src/mod7.js","webpack3-babel7://./esmodules/./src/mod9.js","webpack3-babel7://./esmodules/./src/mod10.js","webpack3-babel7://./esmodules/./src/mod11.js","webpack3-babel7://./esmodules/./src/optimized-out.js"],"names":["optimizedOut","root","console","log","aDefault2","anAliased2","aNamed2","anotherNamed2","e","example","aNamed","original","aNamed3"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;;;;;;;;;;;;AC7DA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA,4EAAAA;AAEe,SAASC,IAAT,GAAgB;AAC7BC,UAAQC,GAAR,CAAY,YAAZ,EAA0BF,IAA1B;AAEAC,UAAQC,GAAR,CAAY,0DAAZ;AACAD,UAAQC,GAAR,CAAY,2DAAZ;AACAD,UAAQC,GAAR,CAAY,yDAAZ;AACAD,UAAQC,GAAR,CAAY,yDAAZ;AACAD,UAAQC,GAAR,CAAY,uCAAZ;;AAEA,MAAI;AACF;AACA;AACAD,YAAQC,GAAR,CAAY,kEAAAC,EAAZ;AACAF,YAAQC,GAAR,CAAY,mEAAAE,EAAZ;AACAH,YAAQC,GAAR,CAAY,kEAAAG,EAAZ;AACAJ,YAAQC,GAAR,CAAY,kEAAAI,EAAZ;AAEAL,YAAQC,GAAR,CAAY,IAAI,0DAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,4DAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,2DAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,2DAAJ,EAAZ;AACD,GAZD,CAYE,OAAOK,CAAP,EAAU,CAAE;AACf;AAEM,SAASC,OAAT,GAAkB,CAAE,C;;;;;;;ACxC3B,yDAAe,WAAf,E;;;;;;;;ACAO,IAAMC,SAAS,SAAf,C;;;;;;;;ACAA,IAAMC,WAAW,aAAjB,C;;;;;;;;;ACAP,+DAAe,WAAf;AACO,IAAMD,SAAS,SAAf,C;;;;;;;ACDP,yDAAe,YAAf,E;;;;;;;;ACAO,IAAMJ,UAAU,UAAhB,C;;;;;;;;ACAA,IAAMK,WAAW,cAAjB,C;;;;;;;ACAP,yDAAe,YAAf,E;;;;;;;;ACAO,IAAMC,UAAU,UAAhB,C;;;;;;;;ACAA,IAAMD,WAAW,cAAjB,C;;;;;;;;ACAQ,SAASX,YAAT,GAAwB,CAAE,C","file":"esmodules.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 9d51d7cd94bd76da017e","import aDefault from \"./src/mod1\";\nimport { aNamed, aNamed as anotherNamed } from \"./src/mod2\";\nimport { original as anAliased } from \"./src/mod3\";\nimport * as aNamespace from \"./src/mod4\";\n\nimport aDefault2 from \"./src/mod5\";\nimport { aNamed2, aNamed2 as anotherNamed2 } from \"./src/mod6\";\nimport { original as anAliased2 } from \"./src/mod7\";\n\nimport aDefault3 from \"./src/mod9\";\nimport { aNamed3, aNamed3 as anotherNamed3 } from \"./src/mod10\";\nimport { original as anAliased3 } from \"./src/mod11\";\n\nimport optimizedOut from \"./src/optimized-out\";\noptimizedOut();\n\nexport default function root() {\n console.log(\"pause here\", root);\n\n console.log(aDefault);\n console.log(anAliased);\n console.log(aNamed);\n console.log(anotherNamed);\n console.log(aNamespace);\n\n try {\n // None of these are callable in this code, but we still want to make sure\n // they map properly even if the only reference is in a call expressions.\n console.log(aDefault2());\n console.log(anAliased2());\n console.log(aNamed2());\n console.log(anotherNamed2());\n\n console.log(new aDefault3());\n console.log(new anAliased3());\n console.log(new aNamed3());\n console.log(new anotherNamed3());\n } catch (e) {}\n}\n\nexport function example(){}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js","export default \"a-default\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod1.js","export const aNamed = \"a-named\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod2.js","export const original = \"an-original\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod3.js","export default \"a-default\";\nexport const aNamed = \"a-named\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod4.js","export default \"a-default2\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod5.js","export const aNamed2 = \"a-named2\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod6.js","export const original = \"an-original2\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod7.js","export default \"a-default3\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod9.js","export const aNamed3 = \"a-named3\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod10.js","export const original = \"an-original3\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod11.js","export default function optimizedOut() {}\n\n\n\n// WEBPACK FOOTER //\n// ./src/optimized-out.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/eval-maps.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/eval-maps.js
new file mode 100644
index 0000000000..04f25944d8
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/eval-maps.js
@@ -0,0 +1,89 @@
+var webpack3Babel7EvalMaps =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+function root() {
+ var one = 1;
+ var two = 2;
+ var three = 3;
+ one;
+ two;
+ {
+ var _two = 4;
+ var _three = 5;
+ console.log("pause here", one, _two, _three);
+ }
+}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=eval-maps.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/eval-maps.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/eval-maps.js.map
new file mode 100644
index 0000000000..162db90b70
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/eval-maps.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel7://./eval-maps/webpack/bootstrap 876b476abe5055a7dbbd","webpack3-babel7://./eval-maps/./input.js"],"names":["root","one","two","three","console","log"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;AC5De,SAASA,IAAT,GAAgB;AAC7B,MAAIC,MAAM,CAAV;AACA,MAAIC,MAAM,CAAV;AACA,MAAMC,QAAQ,CAAd;AAEAF;AACAC;AAEA;AACE,QAAIA,OAAM,CAAV;AACA,QAAMC,SAAQ,CAAd;AAEAC,YAAQC,GAAR,CAAY,YAAZ,EAA0BJ,GAA1B,EAA+BC,IAA/B,EAAoCC,MAApC;AACD;AACF,C","file":"eval-maps.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 876b476abe5055a7dbbd","\nexport default function root() {\n var one = 1;\n let two = 2;\n const three = 3;\n\n one;\n two;\n\n {\n let two = 4;\n const three = 5;\n\n console.log(\"pause here\", one, two, three);\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/for-loops.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/for-loops.js
new file mode 100644
index 0000000000..b1a366ed13
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/for-loops.js
@@ -0,0 +1,97 @@
+var webpack3Babel7ForLoops =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+function root() {
+ var i = 0;
+
+ for (var _i = 1; _i < 2; _i++) {
+ console.log("pause here", root);
+ }
+
+ for (var _i2 in {
+ 2: ""
+ }) {
+ console.log("pause here", root);
+ }
+
+ var _arr = [3];
+
+ for (var _i3 = 0; _i3 < _arr.length; _i3++) {
+ var _i4 = _arr[_i3];
+ console.log("pause here", root);
+ }
+}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=for-loops.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/for-loops.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/for-loops.js.map
new file mode 100644
index 0000000000..e8b1337c84
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/for-loops.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel7://./for-loops/webpack/bootstrap 57a8aadac32d7d488675","webpack3-babel7://./for-loops/./input.js"],"names":["root","i","console","log"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;AC7De,SAASA,IAAT,GAAgB;AAC7B,MAAIC,IAAI,CAAR;;AAEA,OAAK,IAAIA,KAAI,CAAb,EAAgBA,KAAI,CAApB,EAAuBA,IAAvB,EAA4B;AAC1BC,YAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B;AACD;;AAED,OAAK,IAAIC,GAAT,IAAc;AAAE,OAAG;AAAL,GAAd,EAAyB;AACvBC,YAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B;AACD;;AAT4B,aAWf,CAAC,CAAD,CAXe;;AAW7B,8CAAmB;AAAd,QAAIC,eAAJ;AACHC,YAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B;AACD;AACF,C","file":"for-loops.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 57a8aadac32d7d488675","export default function root() {\n let i = 0;\n\n for (let i = 1; i < 2; i++) {\n console.log(\"pause here\", root);\n }\n\n for (let i in { 2: \"\" }) {\n console.log(\"pause here\", root);\n }\n\n for (let i of [3]) {\n console.log(\"pause here\", root);\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/for-of.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/for-of.js
new file mode 100644
index 0000000000..2d3367cd56
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/for-of.js
@@ -0,0 +1,91 @@
+var webpack3Babel7ForOf =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = forOf;
+var mod = "module scoped";
+function forOf() {
+ var _arr = [1];
+
+ for (var _i = 0; _i < _arr.length; _i++) {
+ var x = _arr[_i];
+ doThing(x);
+ }
+
+ function doThing(arg) {
+ // Avoid optimize out
+ window.console;
+ }
+}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=for-of.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/for-of.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/for-of.js.map
new file mode 100644
index 0000000000..27ea145d5d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/for-of.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel7://./for-of/webpack/bootstrap e0f2bb6ee43c0923e1f1","webpack3-babel7://./for-of/./input.js"],"names":["mod","forOf","x","doThing","arg","window","console"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;AC7DA;AAAA,IAAMA,MAAM,eAAZ;AAEe,SAASC,KAAT,GAAiB;AAAA,aACd,CAAC,CAAD,CADc;;AAC9B,2CAAqB;AAAhB,QAAMC,YAAN;AACHC,YAAQD,CAAR;AACD;;AAED,WAASC,OAAT,CAAiBC,GAAjB,EAAsB;AACpB;AACAC,WAAOC,OAAP;AACD;AACF,C","file":"for-of.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap e0f2bb6ee43c0923e1f1","const mod = \"module scoped\";\n\nexport default function forOf() {\n for (const x of [1]) {\n doThing(x);\n }\n\n function doThing(arg) {\n // Avoid optimize out\n window.console;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/functions.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/functions.js
new file mode 100644
index 0000000000..dcccf4d98b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/functions.js
@@ -0,0 +1,92 @@
+var webpack3Babel7Functions =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+function root() {
+ function decl(p1) {
+ var inner = function inner(p2) {
+ var arrow = function arrow(p3) {
+ console.log("pause here", p3, arrow, p2, inner, p1, decl, root);
+ };
+
+ arrow();
+ };
+
+ inner();
+ }
+
+ decl();
+}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=functions.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/functions.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/functions.js.map
new file mode 100644
index 0000000000..8ba0488f4a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/functions.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel7://./functions/webpack/bootstrap 9250891291123e4a01a9","webpack3-babel7://./functions/./input.js"],"names":["root","decl","p1","inner","p2","arrow","p3","console","log"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;AC7De,SAASA,IAAT,GAAgB;AAE7B,WAASC,IAAT,CAAcC,EAAd,EAAkB;AAChB,QAAMC,QAAQ,SAASA,KAAT,CAAeC,EAAf,EAAmB;AAC/B,UAAMC,QAAQ,SAARA,KAAQ,CAACC,EAAD,EAAQ;AACpBC,gBAAQC,GAAR,CAAY,YAAZ,EAA0BF,EAA1B,EAA8BD,KAA9B,EAAqCD,EAArC,EAAyCD,KAAzC,EAAgDD,EAAhD,EAAoDD,IAApD,EAA0DD,IAA1D;AACD,OAFD;;AAGAK;AACD,KALD;;AAMAF;AACD;;AAEDF;AACD,C","file":"functions.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 9250891291123e4a01a9","export default function root() {\n\n function decl(p1) {\n const inner = function inner(p2) {\n const arrow = (p3) => {\n console.log(\"pause here\", p3, arrow, p2, inner, p1, decl, root);\n };\n arrow();\n };\n inner();\n }\n\n decl();\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/lex-and-nonlex.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/lex-and-nonlex.js
new file mode 100644
index 0000000000..d6121bb1a3
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/lex-and-nonlex.js
@@ -0,0 +1,90 @@
+var webpack3Babel7LexAndNonlex =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function root() {
+ function someHelper() {
+ console.log("pause here", root, Thing);
+ }
+
+ var Thing = function Thing() {
+ _classCallCheck(this, Thing);
+ };
+
+ someHelper();
+}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=lex-and-nonlex.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/lex-and-nonlex.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/lex-and-nonlex.js.map
new file mode 100644
index 0000000000..0f281fb856
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/lex-and-nonlex.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel7://./lex-and-nonlex/webpack/bootstrap 16854af92368ac205364","webpack3-babel7://./lex-and-nonlex/./input.js"],"names":["root","someHelper","console","log","Thing"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;;AC7De,SAASA,IAAT,GAAgB;AAC7B,WAASC,UAAT,GAAqB;AACnBC,YAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B,EAAgCI,KAAhC;AACD;;AAH4B,MAKvBA,KALuB;AAAA;AAAA;;AAO7BH;AACD,C","file":"lex-and-nonlex.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 16854af92368ac205364","export default function root() {\n function someHelper(){\n console.log(\"pause here\", root, Thing);\n }\n\n class Thing {}\n\n someHelper();\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/line-start-bindings-es6.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/line-start-bindings-es6.js
new file mode 100644
index 0000000000..37d8f4fe11
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/line-start-bindings-es6.js
@@ -0,0 +1,97 @@
+var webpack3Babel7LineStartBindingsEs6 =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+function root() {
+ function aFunc() {
+ // Since these bindings are on their own linem, the mappings will
+ // extend to the start of the line, rather than starting at the first
+ // character of the binding.
+ const {
+ one,
+ two
+ } = {
+ one: 1,
+ two: 2
+ }; // The 'this' binding here is also its own line, so the comment above
+ // applies here too.
+
+ this.thing = 4;
+ console.log("pause here", root);
+ }
+
+ aFunc.call({});
+}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=line-start-bindings-es6.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/line-start-bindings-es6.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/line-start-bindings-es6.js.map
new file mode 100644
index 0000000000..9b432cc941
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/line-start-bindings-es6.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel7://./line-start-bindings-es6/webpack/bootstrap 2da60635bbaf4a452280","webpack3-babel7://./line-start-bindings-es6/./input.js"],"names":["root","aFunc","one","two","thing","console","log","call"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;AC5De,SAASA,IAAT,GAAgB;AAC7B,WAASC,KAAT,GAAgB;AACd;AACA;AACA;AACA,UAAM;AACJC,SADI;AAEJC;AAFI,QAGF;AACFD,WAAK,CADH;AAEFC,WAAK;AAFH,KAHJ,CAJc,CAYd;AACA;;AACA,SAAKC,KAAL,GAAa,CAAb;AAEAC,YAAQC,GAAR,CAAY,YAAZ,EAA0BN,IAA1B;AACD;;AAEDC,QAAMM,IAAN,CAAW,EAAX;AACD,C","file":"line-start-bindings-es6.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 2da60635bbaf4a452280","\nexport default function root() {\n function aFunc(){\n // Since these bindings are on their own linem, the mappings will\n // extend to the start of the line, rather than starting at the first\n // character of the binding.\n const {\n one,\n two\n } = {\n one: 1,\n two: 2,\n };\n\n // The 'this' binding here is also its own line, so the comment above\n // applies here too.\n this.thing = 4;\n\n console.log(\"pause here\", root);\n }\n\n aFunc.call({ });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/modules-cjs.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/modules-cjs.js
new file mode 100644
index 0000000000..484fed7fd2
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/modules-cjs.js
@@ -0,0 +1,85 @@
+var webpack3Babel7ModulesCjs =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var moduleScoped = 1;
+var alsoModuleScoped = 2;
+
+function thirdModuleScoped() {}
+
+exports.default = function () {
+ console.log("pause here", moduleScoped, alsoModuleScoped, thirdModuleScoped);
+};
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=modules-cjs.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/modules-cjs.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/modules-cjs.js.map
new file mode 100644
index 0000000000..069a89b5d7
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/modules-cjs.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel7://./modules-cjs/webpack/bootstrap ce3cd4b497725df1663e","webpack3-babel7://./modules-cjs/./input.js"],"names":["moduleScoped","alsoModuleScoped","thirdModuleScoped","exports","default","console","log"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;AC7DA,IAAIA,eAAe,CAAnB;AACA,IAAIC,mBAAmB,CAAvB;;AAEA,SAASC,iBAAT,GAA6B,CAAE;;AAE/BC,QAAQC,OAAR,GAAkB,YAAW;AAC3BC,UAAQC,GAAR,CAAY,YAAZ,EAA0BN,YAA1B,EAAwCC,gBAAxC,EAA0DC,iBAA1D;AACD,CAFD,C","file":"modules-cjs.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap ce3cd4b497725df1663e","var moduleScoped = 1;\nlet alsoModuleScoped = 2;\n\nfunction thirdModuleScoped() {}\n\nexports.default = function() {\n console.log(\"pause here\", moduleScoped, alsoModuleScoped, thirdModuleScoped);\n};\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/out-of-order-declarations-cjs.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/out-of-order-declarations-cjs.js
new file mode 100644
index 0000000000..990e6b10c8
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/out-of-order-declarations-cjs.js
@@ -0,0 +1,118 @@
+var webpack3Babel7OutOfOrderDeclarationsCjs =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = root;
+
+var _mod = _interopRequireDefault(__webpack_require__(1));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var val = "outer-value";
+
+function root() {
+ var val = "middle-value";
+
+ var fn = function outerFn(outer) {};
+
+ function callback() {
+ console.log("pause here", val, _mod.default, fn);
+ var val = "inner-value";
+
+ function fn(inner) {}
+
+ ;
+ }
+
+ callback();
+}
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+var _default = "a-default";
+exports.default = _default;
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=out-of-order-declarations-cjs.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/out-of-order-declarations-cjs.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/out-of-order-declarations-cjs.js.map
new file mode 100644
index 0000000000..9c74dd57ed
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/out-of-order-declarations-cjs.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel7://./out-of-order-declarations-cjs/webpack/bootstrap beddf19daac28b5a8d52","webpack3-babel7://./out-of-order-declarations-cjs/./input.js","webpack3-babel7://./out-of-order-declarations-cjs/./src/mod.js"],"names":["val","root","fn","outerFn","outer","callback","console","log","aDefault","inner"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;;;;;AC7CA;;;;AAhBA,IAAIA,MAAM,aAAV;;AAEe,SAASC,IAAT,GAAgB;AAC7B,MAAID,MAAM,cAAV;;AACA,MAAIE,KAAK,SAASC,OAAT,CAAiBC,KAAjB,EAAuB,CAAE,CAAlC;;AAEA,WAASC,QAAT,GAAoB;AAClBC,YAAQC,GAAR,CAAY,YAAZ,EAA0BP,GAA1B,EAA+BQ,YAA/B,EAAyCN,EAAzC;AAEA,QAAIF,MAAM,aAAV;;AACA,aAASE,EAAT,CAAYO,KAAZ,EAAkB,CAAE;;AAAA;AACrB;;AAEDJ;AACD,C;;;;;;;;;;;;;eCdc,W","file":"out-of-order-declarations-cjs.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap beddf19daac28b5a8d52","var val = \"outer-value\";\n\nexport default function root() {\n var val = \"middle-value\";\n var fn = function outerFn(outer){};\n\n function callback() {\n console.log(\"pause here\", val, aDefault, fn);\n\n var val = \"inner-value\";\n function fn(inner){};\n }\n\n callback();\n}\n\nimport aDefault from \"./src/mod\";\n\n\n\n// WEBPACK FOOTER //\n// ./input.js","export default \"a-default\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/shadowed-vars.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/shadowed-vars.js
new file mode 100644
index 0000000000..ea3cb89d61
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/shadowed-vars.js
@@ -0,0 +1,101 @@
+var webpack3Babel7ShadowedVars =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+/* harmony default export */ __webpack_exports__["default"] = (function () {
+ var aVar = "var1";
+ var aLet = "let1";
+ var aConst = "const1";
+
+ var Outer = function Outer() {
+ _classCallCheck(this, Outer);
+ };
+
+ {
+ var _Outer = function _Outer() {};
+
+ var aVar = "var2";
+ var _aLet = "let2";
+ var _aConst = "const2";
+ {
+ var aVar = "var3";
+ var _aLet2 = "let3";
+ var _aConst2 = "const3";
+ console.log("pause here");
+ }
+ }
+});
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=shadowed-vars.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/shadowed-vars.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/shadowed-vars.js.map
new file mode 100644
index 0000000000..8a69c642e8
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/shadowed-vars.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel7://./shadowed-vars/webpack/bootstrap 7c4cae2a3032e5d9939f","webpack3-babel7://./shadowed-vars/./input.js"],"names":["aVar","aLet","aConst","Outer","console","log"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;AC7DA,+DAAe,YAAW;AACxB,MAAIA,OAAO,MAAX;AACA,MAAIC,OAAO,MAAX;AACA,MAAMC,SAAS,QAAf;;AAHwB,MAKlBC,KALkB;AAAA;AAAA;;AAMxB;AAAA,QACWA,MADX,GACE,SAASA,MAAT,GAAiB,CAAE,CADrB;;AAGE,QAAIH,OAAO,MAAX;AACA,QAAIC,QAAO,MAAX;AACA,QAAMC,UAAS,QAAf;AACA;AACE,UAAIF,OAAO,MAAX;AACA,UAAIC,SAAO,MAAX;AACA,UAAMC,WAAS,QAAf;AAEAE,cAAQC,GAAR,CAAY,YAAZ;AACD;AACF;AACF,C","file":"shadowed-vars.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 7c4cae2a3032e5d9939f","export default function() {\n var aVar = \"var1\";\n let aLet = \"let1\";\n const aConst = \"const1\";\n\n class Outer {}\n {\n function Outer() {}\n\n var aVar = \"var2\";\n let aLet = \"let2\";\n const aConst = \"const2\";\n {\n var aVar = \"var3\";\n let aLet = \"let3\";\n const aConst = \"const3\";\n\n console.log(\"pause here\");\n }\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-for-of-array-closure.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-for-of-array-closure.js
new file mode 100644
index 0000000000..89ef383ad7
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-for-of-array-closure.js
@@ -0,0 +1,95 @@
+var webpack3Babel7StepOverForOfArrayClosure =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+// Babel will optimize this for..of because it call tell the value is an array.
+function root() {
+ console.log("pause here");
+ var _arr = [1, 2];
+
+ var _loop = function _loop() {
+ var val = _arr[_i];
+ console.log("pause again", function () {
+ return val;
+ }());
+ };
+
+ for (var _i = 0; _i < _arr.length; _i++) {
+ _loop();
+ }
+
+ console.log("done");
+}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=step-over-for-of-array-closure.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-for-of-array-closure.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-for-of-array-closure.js.map
new file mode 100644
index 0000000000..668827d393
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-for-of-array-closure.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel7://./step-over-for-of-array-closure/webpack/bootstrap 59372a9fc073a973662e","webpack3-babel7://./step-over-for-of-array-closure/./input.js"],"names":["root","console","log","val"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;AC7DA;AAAA;AACe,SAASA,IAAT,GAAgB;AAC7BC,UAAQC,GAAR,CAAY,YAAZ;AAD6B,aAGX,CAAC,CAAD,EAAI,CAAJ,CAHW;;AAAA;AAGxB,QAAMC,cAAN;AACHF,YAAQC,GAAR,CAAY,aAAZ,EAA4B;AAAA,aAAMC,GAAN;AAAA,KAAD,EAA3B;AAJ2B;;AAG7B,2CAA0B;AAAA;AAEzB;;AAEDF,UAAQC,GAAR,CAAY,MAAZ;AACD,C","file":"step-over-for-of-array-closure.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 59372a9fc073a973662e","// Babel will optimize this for..of because it call tell the value is an array.\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of [1, 2]) {\n console.log(\"pause again\", (() => val)());\n }\n\n console.log(\"done\");\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-for-of-array.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-for-of-array.js
new file mode 100644
index 0000000000..6277052e17
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-for-of-array.js
@@ -0,0 +1,89 @@
+var webpack3Babel7StepOverForOfArray =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+// Babel will optimize this for..of because it call tell the value is an array.
+function root() {
+ console.log("pause here");
+ var _arr = [1, 2];
+
+ for (var _i = 0; _i < _arr.length; _i++) {
+ var val = _arr[_i];
+ console.log("pause again", val);
+ }
+
+ console.log("done");
+}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=step-over-for-of-array.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-for-of-array.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-for-of-array.js.map
new file mode 100644
index 0000000000..4343c0a0ad
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-for-of-array.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel7://./step-over-for-of-array/webpack/bootstrap 48dce7d14dbf8d83d6a7","webpack3-babel7://./step-over-for-of-array/./input.js"],"names":["root","console","log","val"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;AC7DA;AAAA;AACe,SAASA,IAAT,GAAgB;AAC7BC,UAAQC,GAAR,CAAY,YAAZ;AAD6B,aAGX,CAAC,CAAD,EAAI,CAAJ,CAHW;;AAG7B,2CAA0B;AAArB,QAAMC,cAAN;AACHF,YAAQC,GAAR,CAAY,aAAZ,EAA2BC,GAA3B;AACD;;AAEDF,UAAQC,GAAR,CAAY,MAAZ;AACD,C","file":"step-over-for-of-array.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 48dce7d14dbf8d83d6a7","// Babel will optimize this for..of because it call tell the value is an array.\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of [1, 2]) {\n console.log(\"pause again\", val);\n }\n\n console.log(\"done\");\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-for-of-closure.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-for-of-closure.js
new file mode 100644
index 0000000000..222c37270a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-for-of-closure.js
@@ -0,0 +1,96 @@
+var webpack3Babel7StepOverForOfClosure =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+// Babel will convert the loop body to a function to handle the 'val' lexical
+// enclosure behavior.
+var vals = [1, 2];
+function root() {
+ console.log("pause here");
+
+ var _loop = function _loop() {
+ var val = vals[_i];
+ console.log("pause again", function () {
+ return val;
+ }());
+ };
+
+ for (var _i = 0; _i < vals.length; _i++) {
+ _loop();
+ }
+
+ console.log("done");
+}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=step-over-for-of-closure.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-for-of-closure.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-for-of-closure.js.map
new file mode 100644
index 0000000000..acc6caffba
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-for-of-closure.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel7://./step-over-for-of-closure/webpack/bootstrap bd758f1c75165d279669","webpack3-babel7://./step-over-for-of-closure/./input.js"],"names":["vals","root","console","log","val"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;AC7DA;AAAA;AACA;AACA,IAAMA,OAAO,CAAC,CAAD,EAAI,CAAJ,CAAb;AAEe,SAASC,IAAT,GAAgB;AAC7BC,UAAQC,GAAR,CAAY,YAAZ;;AAD6B;AAGxB,QAAMC,MAAOJ,IAAP,IAAN;AACHE,YAAQC,GAAR,CAAY,aAAZ,EAA4B;AAAA,aAAMC,GAAN;AAAA,KAAD,EAA3B;AAJ2B;;AAG7B,wBAAkBJ,IAAlB,eAAwB;AAAA;AAEvB;;AAEDE,UAAQC,GAAR,CAAY,MAAZ;AACD,C","file":"step-over-for-of-closure.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap bd758f1c75165d279669","// Babel will convert the loop body to a function to handle the 'val' lexical\n// enclosure behavior.\nconst vals = [1, 2];\n\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of vals) {\n console.log(\"pause again\", (() => val)());\n }\n\n console.log(\"done\");\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-for-of.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-for-of.js
new file mode 100644
index 0000000000..497ccdc241
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-for-of.js
@@ -0,0 +1,88 @@
+var webpack3Babel7StepOverForOf =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+var vals = [1, 2];
+function root() {
+ console.log("pause here");
+
+ for (var _i = 0; _i < vals.length; _i++) {
+ var val = vals[_i];
+ console.log("pause again", val);
+ }
+
+ console.log("done");
+}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=step-over-for-of.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-for-of.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-for-of.js.map
new file mode 100644
index 0000000000..10852ea0f3
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-for-of.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel7://./step-over-for-of/webpack/bootstrap b54e6627d56823ef4a1d","webpack3-babel7://./step-over-for-of/./input.js"],"names":["vals","root","console","log","val"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;AC7DA;AAAA,IAAMA,OAAO,CAAC,CAAD,EAAI,CAAJ,CAAb;AAEe,SAASC,IAAT,GAAgB;AAC7BC,UAAQC,GAAR,CAAY,YAAZ;;AAEA,wBAAkBH,IAAlB,eAAwB;AAAnB,QAAMI,MAAOJ,IAAP,IAAN;AACHE,YAAQC,GAAR,CAAY,aAAZ,EAA2BC,GAA3B;AACD;;AAEDF,UAAQC,GAAR,CAAY,MAAZ;AACD,C","file":"step-over-for-of.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap b54e6627d56823ef4a1d","const vals = [1, 2];\n\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of vals) {\n console.log(\"pause again\", val);\n }\n\n console.log(\"done\");\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-function-params.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-function-params.js
new file mode 100644
index 0000000000..ecf5690061
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-function-params.js
@@ -0,0 +1,100 @@
+var webpack3Babel7StepOverFunctionParams =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = fn;
+function test(a1) {
+ var a2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 45;
+
+ var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
+ a3 = _ref.a3,
+ a4 = _ref.a4,
+ _ref$a = _ref.a5;
+
+ _ref$a = _ref$a === void 0 ? {} : _ref$a;
+ var a7 = _ref$a.a6;
+ console.log("pause next here");
+}
+
+function fn() {
+ console.log("pause here");
+ test("1", undefined, {
+ a3: "3",
+ a4: "4",
+ a5: {
+ a6: "7"
+ }
+ });
+}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=step-over-function-params.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-function-params.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-function-params.js.map
new file mode 100644
index 0000000000..2ea1d9aba3
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-function-params.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel7://./step-over-function-params/webpack/bootstrap 799878959644509c0aa2","webpack3-babel7://./step-over-function-params/./input.js"],"names":["test","a1","a2","a3","a4","a5","a7","a6","console","log","fn","undefined"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;AC7DA;AAAA,SAASA,IAAT,CAAcC,EAAd,EAAiE;AAAA,MAA/CC,EAA+C,uEAA1C,EAA0C;;AAAA,iFAAJ,EAAI;AAAA,MAApCC,EAAoC,QAApCA,EAAoC;AAAA,MAAhCC,EAAgC,QAAhCA,EAAgC;AAAA,oBAA5BC,EAA4B;;AAAA,+BAAX,EAAW;AAAA,MAAlBC,EAAkB,UAAtBC,EAAsB;AAC/DC,UAAQC,GAAR,CAAY,iBAAZ;AACD;;AAEc,SAASC,EAAT,GAAc;AAC3BF,UAAQC,GAAR,CAAY,YAAZ;AACAT,OAAK,GAAL,EAAUW,SAAV,EAAqB;AAAER,QAAI,GAAN;AAAWC,QAAI,GAAf;AAAoBC,QAAI;AAAEE,UAAI;AAAN;AAAxB,GAArB;AACD,C","file":"step-over-function-params.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 799878959644509c0aa2","function test(a1, a2 = 45, { a3, a4, a5: { a6: a7 } = {} } = {}) {\n console.log(\"pause next here\");\n}\n\nexport default function fn() {\n console.log(\"pause here\");\n test(\"1\", undefined, { a3: \"3\", a4: \"4\", a5: { a6: \"7\" } });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-regenerator-await.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-regenerator-await.js
new file mode 100644
index 0000000000..0ea146c5c7
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-regenerator-await.js
@@ -0,0 +1,118 @@
+var webpack3Babel7StepOverRegeneratorAwait =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
+
+function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
+
+var fn =
+/*#__PURE__*/
+function () {
+ var _fn = _asyncToGenerator(
+ /*#__PURE__*/
+ regeneratorRuntime.mark(function _callee() {
+ return regeneratorRuntime.wrap(function _callee$(_context) {
+ while (1) {
+ switch (_context.prev = _context.next) {
+ case 0:
+ console.log("pause here");
+ _context.next = 3;
+ return doAsync();
+
+ case 3:
+ console.log("stopped here");
+
+ case 4:
+ case "end":
+ return _context.stop();
+ }
+ }
+ }, _callee, this);
+ }));
+
+ return function fn() {
+ return _fn.apply(this, arguments);
+ };
+}();
+
+function doAsync() {
+ return Promise.resolve();
+}
+
+function root() {
+ fn();
+}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=step-over-regenerator-await.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-regenerator-await.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-regenerator-await.js.map
new file mode 100644
index 0000000000..396d35332f
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/step-over-regenerator-await.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel7://./step-over-regenerator-await/webpack/bootstrap 43a4d522379431f43ed2","webpack3-babel7://./step-over-regenerator-await/./input.js"],"names":["fn","console","log","doAsync","Promise","resolve","root"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;;;;AC7DA,IAAIA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAAK;AAAA;AAAA;AAAA;AAAA;AACPC,oBAAQC,GAAR,CAAY,YAAZ;AADO;AAAA,mBAGDC,SAHC;;AAAA;AAKPF,oBAAQC,GAAR,CAAY,cAAZ;;AALO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAAL;;AAAA,kBAAoBF,EAApB;AAAA;AAAA;AAAA,GAAJ;;AAQA,SAASG,OAAT,GAAmB;AACjB,SAAOC,QAAQC,OAAR,EAAP;AACD;;AAEc,SAASC,IAAT,GAAgB;AAC7BN;AACD,C","file":"step-over-regenerator-await.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 43a4d522379431f43ed2","var fn = async function fn() {\n console.log(\"pause here\");\n\n await doAsync();\n\n console.log(\"stopped here\");\n};\n\nfunction doAsync() {\n return Promise.resolve();\n}\n\nexport default function root() {\n fn();\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/switches.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/switches.js
new file mode 100644
index 0000000000..da436d072c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/switches.js
@@ -0,0 +1,92 @@
+var webpack3Babel7Switches =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+function root() {
+ var val = 1;
+
+ switch (true) {
+ case true:
+ var _val = 2;
+ console.log("pause here", root);
+
+ default:
+ {
+ var _val2 = 3;
+ console.log("pause here", root);
+ }
+ }
+}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=switches.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/switches.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/switches.js.map
new file mode 100644
index 0000000000..6d547a87a2
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/switches.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel7://./switches/webpack/bootstrap 99626ff6d2f676baa37a","webpack3-babel7://./switches/./input.js"],"names":["root","val","console","log"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;AC7De,SAASA,IAAT,GAAgB;AAC7B,MAAIC,MAAM,CAAV;;AAEA,UAAQ,IAAR;AACE,SAAK,IAAL;AACE,UAAIA,OAAM,CAAV;AACAC,cAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B;;AACF;AAAS;AACP,YAAIC,QAAM,CAAV;AACAC,gBAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B;AACD;AAPH;AASD,C","file":"switches.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 99626ff6d2f676baa37a","export default function root() {\n let val = 1;\n\n switch (true) {\n case true:\n let val = 2;\n console.log(\"pause here\", root);\n default: {\n let val = 3;\n console.log(\"pause here\", root);\n }\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/this-arguments-bindings.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/this-arguments-bindings.js
new file mode 100644
index 0000000000..2cbfc06e70
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/this-arguments-bindings.js
@@ -0,0 +1,95 @@
+var webpack3Babel7ThisArgumentsBindings =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+function root() {
+ function fn(arg) {
+ var _this = this,
+ _arguments = arguments;
+
+ console.log(this, arguments);
+ console.log("pause here", fn, root);
+
+ var arrow = function arrow(argArrow) {
+ console.log(_this, _arguments);
+ console.log("pause here", fn, root);
+ };
+
+ arrow("arrow-arg");
+ }
+
+ fn.call("this-value", "arg-value");
+}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=this-arguments-bindings.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/this-arguments-bindings.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/this-arguments-bindings.js.map
new file mode 100644
index 0000000000..7b2856a26e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/this-arguments-bindings.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel7://./this-arguments-bindings/webpack/bootstrap 7549c17f3c5a977036bc","webpack3-babel7://./this-arguments-bindings/./input.js"],"names":["root","fn","arg","console","log","arguments","arrow","call"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;AC7De,SAASA,IAAT,GAAgB;AAC7B,WAASC,EAAT,CAAYC,GAAZ,EAAiB;AAAA;AAAA;;AACfC,YAAQC,GAAR,CAAY,IAAZ,EAAkBC,SAAlB;AACAF,YAAQC,GAAR,CAAY,YAAZ,EAA0BH,EAA1B,EAA8BD,IAA9B;;AAEA,QAAMM,QAAQ,SAARA,KAAQ,WAAY;AACxBH,cAAQC,GAAR,CAAY,KAAZ,EAAkBC,UAAlB;AACAF,cAAQC,GAAR,CAAY,YAAZ,EAA0BH,EAA1B,EAA8BD,IAA9B;AACD,KAHD;;AAIAM,UAAM,WAAN;AACD;;AAEDL,KAAGM,IAAH,CAAQ,YAAR,EAAsB,WAAtB;AACD,C","file":"this-arguments-bindings.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 7549c17f3c5a977036bc","export default function root() {\n function fn(arg) {\n console.log(this, arguments);\n console.log(\"pause here\", fn, root);\n\n const arrow = argArrow => {\n console.log(this, arguments);\n console.log(\"pause here\", fn, root);\n };\n arrow(\"arrow-arg\");\n }\n\n fn.call(\"this-value\", \"arg-value\");\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/try-catches.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/try-catches.js
new file mode 100644
index 0000000000..973c4e8176
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/try-catches.js
@@ -0,0 +1,87 @@
+var webpack3Babel7TryCatches =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+function root() {
+ var one = 1;
+
+ try {
+ throw "AnError";
+ } catch (err) {
+ var two = 2;
+ console.log("pause here", root);
+ }
+}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=try-catches.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/try-catches.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/try-catches.js.map
new file mode 100644
index 0000000000..04cd029bbf
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/try-catches.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel7://./try-catches/webpack/bootstrap a4afeebd3c6248c84cd6","webpack3-babel7://./try-catches/./input.js"],"names":["root","one","err","two","console","log"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;AC7De,SAASA,IAAT,GAAgB;AAC7B,MAAMC,MAAM,CAAZ;;AAEA,MAAI;AACF,UAAM,SAAN;AACD,GAFD,CAEE,OAAOC,GAAP,EAAY;AACZ,QAAIC,MAAM,CAAV;AACAC,YAAQC,GAAR,CAAY,YAAZ,EAA0BL,IAA1B;AACD;AACF,C","file":"try-catches.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap a4afeebd3c6248c84cd6","export default function root() {\n const one = 1;\n\n try {\n throw \"AnError\";\n } catch (err) {\n let two = 2;\n console.log(\"pause here\", root);\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/type-module.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/type-module.js
new file mode 100644
index 0000000000..fdd1310441
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/type-module.js
@@ -0,0 +1,84 @@
+var webpack3Babel7TypeModule =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+var moduleScoped = 1;
+var alsoModuleScoped = 2;
+
+function thirdModuleScoped() {}
+
+/* harmony default export */ __webpack_exports__["default"] = (function () {
+ console.log("pause here", moduleScoped, alsoModuleScoped, thirdModuleScoped);
+});
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=type-module.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/type-module.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/type-module.js.map
new file mode 100644
index 0000000000..679fdeff33
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/type-module.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel7://./type-module/webpack/bootstrap 4ca0a1e85534ef291a7b","webpack3-babel7://./type-module/./input.js"],"names":["moduleScoped","alsoModuleScoped","thirdModuleScoped","console","log"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;AC7DA;AAAA,IAAIA,eAAe,CAAnB;AACA,IAAIC,mBAAmB,CAAvB;;AAEA,SAASC,iBAAT,GAA6B,CAAE;;AAE/B,+DAAe,YAAW;AACxBC,UAAQC,GAAR,CAAY,YAAZ,EAA0BJ,YAA1B,EAAwCC,gBAAxC,EAA0DC,iBAA1D;AACD,C","file":"type-module.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 4ca0a1e85534ef291a7b","var moduleScoped = 1;\nlet alsoModuleScoped = 2;\n\nfunction thirdModuleScoped() {}\n\nexport default function() {\n console.log(\"pause here\", moduleScoped, alsoModuleScoped, thirdModuleScoped);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/type-script-cjs.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/type-script-cjs.js
new file mode 100644
index 0000000000..b0b5a3cc38
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/type-script-cjs.js
@@ -0,0 +1,87 @@
+var webpack3Babel7TypeScriptCjs =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var moduleScoped = 1;
+var alsoModuleScopes = 2;
+
+function thirdModuleScoped() {}
+
+function nonModules() {
+ console.log("pause here");
+}
+
+exports.default = nonModules;
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=type-script-cjs.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/type-script-cjs.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/type-script-cjs.js.map
new file mode 100644
index 0000000000..43c99421b8
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/type-script-cjs.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel7://./type-script-cjs/webpack/bootstrap c0a51f3dd36cc22df49a","webpack3-babel7://./type-script-cjs/./input.js"],"names":["moduleScoped","alsoModuleScopes","thirdModuleScoped","nonModules","console","log","exports","default"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;AC7DA,IAAIA,eAAe,CAAnB;AACA,IAAIC,mBAAmB,CAAvB;;AAEA,SAASC,iBAAT,GAA6B,CAAE;;AAE/B,SAASC,UAAT,GAAsB;AACpBC,UAAQC,GAAR,CAAY,YAAZ;AACD;;AAEDC,QAAQC,OAAR,GAAkBJ,UAAlB,C","file":"type-script-cjs.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap c0a51f3dd36cc22df49a","var moduleScoped = 1;\nlet alsoModuleScopes = 2;\n\nfunction thirdModuleScoped() {}\n\nfunction nonModules() {\n console.log(\"pause here\");\n}\n\nexports.default = nonModules;\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/webpack-functions.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/webpack-functions.js
new file mode 100644
index 0000000000..d77c9a23fc
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/webpack-functions.js
@@ -0,0 +1,88 @@
+var webpack3Babel7WebpackFunctions =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+var module = {};
+
+module.exports = function (x) {
+ return x * 2;
+};
+
+function root() {
+ // This example is structures to look like CommonJS in order to replicate
+ // a previously-encountered bug.
+ module.exports(4);
+}
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=webpack-functions.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/webpack-functions.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/webpack-functions.js.map
new file mode 100644
index 0000000000..4177d36a86
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/webpack-functions.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel7://./webpack-functions/webpack/bootstrap 14d3f4ce8a5311bc63a6","webpack3-babel7://./webpack-functions/./input.js"],"names":["module","exports","x","root"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;AC7DA;AAAA,IAAIA,SAAS,EAAb;;AAEAA,OAAOC,OAAP,GAAiB,UAASC,CAAT,EAAY;AAC3B,SAAOA,IAAI,CAAX;AACD,CAFD;;AAKe,SAASC,IAAT,GAAgB;AAC7B;AACA;AACAH,SAAOC,OAAP,CAAe,CAAf;AACD,C","file":"webpack-functions.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 14d3f4ce8a5311bc63a6","var module = {};\n\nmodule.exports = function(x) {\n return x * 2;\n};\n\n\nexport default function root() {\n // This example is structures to look like CommonJS in order to replicate\n // a previously-encountered bug.\n module.exports(4);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/webpack-line-mappings.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/webpack-line-mappings.js
new file mode 100644
index 0000000000..393f2606f6
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/webpack-line-mappings.js
@@ -0,0 +1,106 @@
+var webpack3Babel7WebpackLineMappings =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_mod1__ = __webpack_require__(1);
+
+function root() {
+ var one = 1;
+ {
+ var two = 2;
+
+ var fn = function someName(arg) {
+ console.log(this, arguments);
+ console.log("pause here", __WEBPACK_IMPORTED_MODULE_0__src_mod1__["a" /* default */], one, two, fn, arg);
+
+ var inner = function inner(arg) {
+ var body = "42";
+ console.log("pause here", body, root);
+ };
+
+ inner();
+ };
+
+ fn.call("this-value", "arg-value");
+ }
+}
+
+/***/ }),
+/* 1 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony default export */ __webpack_exports__["a"] = ("a-default");
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=webpack-line-mappings.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/webpack-line-mappings.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/webpack-line-mappings.js.map
new file mode 100644
index 0000000000..cba3d93671
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3-babel7/webpack-line-mappings.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3-babel7://./webpack-line-mappings/webpack/bootstrap 05c8ac3ed2f06e5ec654","webpack3-babel7://./webpack-line-mappings/./input.js","webpack3-babel7://./webpack-line-mappings/./src/mod1.js"],"names":["root","one","two","fn","someName","arg","console","log","arguments","inner","body","call"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;AC7DA;AAEe,SAASA,IAAT,GAAgB;AAC7B,MAAIC,MAAM,CAAV;AAEA;AACE,QAAMC,MAAM,CAAZ;;AAEA,QAAIC,KAAK,SAASC,QAAT,CAAkBC,GAAlB,EAAuB;AAC9BC,cAAQC,GAAR,CAAY,IAAZ,EAAkBC,SAAlB;AACAF,cAAQC,GAAR,CAAY,YAAZ,EAA0B,0DAA1B,EAAoCN,GAApC,EAAyCC,GAAzC,EAA8CC,EAA9C,EAAkDE,GAAlD;;AAEA,UAAII,QAAQ,SAARA,KAAQ,CAACJ,GAAD,EAAS;AAAE,YAAIK,OAAO,IAAX;AAAiBJ,gBAAQC,GAAR,CAAY,YAAZ,EAA0BG,IAA1B,EAAgCV,IAAhC;AAAwC,OAAhF;;AACAS;AACD,KAND;;AAOAN,OAAGQ,IAAH,CAAQ,YAAR,EAAsB,WAAtB;AACD;AACF,C;;;;;;;ACjBD,yDAAe,WAAf,E","file":"webpack-line-mappings.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 05c8ac3ed2f06e5ec654","import aDefault from \"./src/mod1\";\n\nexport default function root() {\n let one = 1;\n\n {\n const two = 2;\n\n var fn = function someName(arg) {\n console.log(this, arguments);\n console.log(\"pause here\", aDefault, one, two, fn, arg);\n\n var inner = (arg) => { var body = \"42\"; console.log(\"pause here\", body, root); };\n inner();\n };\n fn.call(\"this-value\", \"arg-value\");\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.js","export default \"a-default\";\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod1.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/classes.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/classes.js
new file mode 100644
index 0000000000..c70aa8249e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/classes.js
@@ -0,0 +1,100 @@
+var webpack3Classes =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+function root() {
+ let one = 1;
+
+ class Thing {
+ one() {
+ console.log("pause here");
+ }
+ }
+
+ class Another {
+ method() {
+ let two = 2;
+
+ const three = 3;
+
+ console.log("pause here", Another, one, Thing, root);
+ }
+ }
+
+ new Another().method();
+ new Thing().one();
+}
+
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=classes.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/classes.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/classes.js.map
new file mode 100644
index 0000000000..8fd596c8de
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/classes.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3://./classes/webpack/bootstrap 6c9ed61db28cf2b3ab7b","webpack3://./classes/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;AC7DA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA","file":"classes.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 6c9ed61db28cf2b3ab7b","export default function root() {\n let one = 1;\n\n class Thing {\n one() {\n console.log(\"pause here\");\n }\n }\n\n class Another {\n method() {\n let two = 2;\n\n const three = 3;\n\n console.log(\"pause here\", Another, one, Thing, root);\n }\n }\n\n new Another().method();\n new Thing().one();\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./input.js\n// module id = 0\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/esmodules-cjs.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/esmodules-cjs.js
new file mode 100644
index 0000000000..1ea7644d20
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/esmodules-cjs.js
@@ -0,0 +1,236 @@
+var webpack3EsmodulesCjs =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+/* harmony export (immutable) */ __webpack_exports__["example"] = example;
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_mod1__ = __webpack_require__(1);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__src_mod2__ = __webpack_require__(2);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__src_mod3__ = __webpack_require__(3);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__src_mod4__ = __webpack_require__(4);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__src_mod5__ = __webpack_require__(5);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__src_mod6__ = __webpack_require__(6);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__src_mod7__ = __webpack_require__(7);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__src_mod9__ = __webpack_require__(8);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__src_mod10__ = __webpack_require__(9);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__src_mod11__ = __webpack_require__(10);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__src_optimized_out__ = __webpack_require__(11);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Object(__WEBPACK_IMPORTED_MODULE_10__src_optimized_out__["a" /* default */])();
+
+function root() {
+ console.log("pause here", root);
+
+ console.log(__WEBPACK_IMPORTED_MODULE_0__src_mod1__["a" /* default */]);
+ console.log(__WEBPACK_IMPORTED_MODULE_2__src_mod3__["a" /* original */]);
+ console.log(__WEBPACK_IMPORTED_MODULE_1__src_mod2__["a" /* aNamed */]);
+ console.log(__WEBPACK_IMPORTED_MODULE_1__src_mod2__["a" /* aNamed */]);
+ console.log(__WEBPACK_IMPORTED_MODULE_3__src_mod4__);
+
+ try {
+ // None of these are callable in this code, but we still want to make sure
+ // they map properly even if the only reference is in a call expressions.
+ console.log(Object(__WEBPACK_IMPORTED_MODULE_4__src_mod5__["a" /* default */])());
+ console.log(Object(__WEBPACK_IMPORTED_MODULE_6__src_mod7__["a" /* original */])());
+ console.log(Object(__WEBPACK_IMPORTED_MODULE_5__src_mod6__["a" /* aNamed2 */])());
+ console.log(Object(__WEBPACK_IMPORTED_MODULE_5__src_mod6__["a" /* aNamed2 */])());
+
+ console.log(new __WEBPACK_IMPORTED_MODULE_7__src_mod9__["a" /* default */]());
+ console.log(new __WEBPACK_IMPORTED_MODULE_9__src_mod11__["a" /* original */]());
+ console.log(new __WEBPACK_IMPORTED_MODULE_8__src_mod10__["a" /* aNamed3 */]());
+ console.log(new __WEBPACK_IMPORTED_MODULE_8__src_mod10__["a" /* aNamed3 */]());
+ } catch (e) {}
+}
+
+function example(){}
+
+
+/***/ }),
+/* 1 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony default export */ __webpack_exports__["a"] = ("a-default");
+
+
+/***/ }),
+/* 2 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+const aNamed = "a-named";
+/* harmony export (immutable) */ __webpack_exports__["a"] = aNamed;
+
+
+
+/***/ }),
+/* 3 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+const original = "an-original";
+/* harmony export (immutable) */ __webpack_exports__["a"] = original;
+
+
+
+/***/ }),
+/* 4 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony default export */ __webpack_exports__["default"] = ("a-default");
+const aNamed = "a-named";
+/* harmony export (immutable) */ __webpack_exports__["aNamed"] = aNamed;
+
+
+
+/***/ }),
+/* 5 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony default export */ __webpack_exports__["a"] = ("a-default2");
+
+
+/***/ }),
+/* 6 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+const aNamed2 = "a-named2";
+/* harmony export (immutable) */ __webpack_exports__["a"] = aNamed2;
+
+
+
+/***/ }),
+/* 7 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+const original = "an-original2";
+/* harmony export (immutable) */ __webpack_exports__["a"] = original;
+
+
+
+/***/ }),
+/* 8 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony default export */ __webpack_exports__["a"] = ("a-default3");
+
+
+/***/ }),
+/* 9 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+const aNamed3 = "a-named3";
+/* harmony export (immutable) */ __webpack_exports__["a"] = aNamed3;
+
+
+
+/***/ }),
+/* 10 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+const original = "an-original3";
+/* harmony export (immutable) */ __webpack_exports__["a"] = original;
+
+
+
+/***/ }),
+/* 11 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (immutable) */ __webpack_exports__["a"] = optimizedOut;
+function optimizedOut() {}
+
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=esmodules-cjs.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/esmodules-cjs.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/esmodules-cjs.js.map
new file mode 100644
index 0000000000..63191bf0ce
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/esmodules-cjs.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3://./esmodules-cjs/webpack/bootstrap 2f9f9f67801819b55265","webpack3://./esmodules-cjs/./input.js","webpack3://./esmodules-cjs/./src/mod1.js","webpack3://./esmodules-cjs/./src/mod2.js","webpack3://./esmodules-cjs/./src/mod3.js","webpack3://./esmodules-cjs/./src/mod4.js","webpack3://./esmodules-cjs/./src/mod5.js","webpack3://./esmodules-cjs/./src/mod6.js","webpack3://./esmodules-cjs/./src/mod7.js","webpack3://./esmodules-cjs/./src/mod9.js","webpack3://./esmodules-cjs/./src/mod10.js","webpack3://./esmodules-cjs/./src/mod11.js","webpack3://./esmodules-cjs/./src/optimized-out.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;;;;;;;;;;;;AC7DA;AACyC;AACT;AAChC;;AAEA;AAC4C;AACX;;AAEjC;AAC4C;AACX;;AAEjC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;;;;;;;ACxCA;;;;;;;;ACAA;AAAA;AAAA;;;;;;;;ACAA;AAAA;AAAA;;;;;;;;;ACAA;AACA;AAAA;AAAA;;;;;;;;ACDA;;;;;;;;ACAA;AAAA;AAAA;;;;;;;;ACAA;AAAA;AAAA;;;;;;;;ACAA;;;;;;;;ACAA;AAAA;AAAA;;;;;;;;ACAA;AAAA;AAAA;;;;;;;;;ACAA","file":"esmodules-cjs.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 2f9f9f67801819b55265","import aDefault from \"./src/mod1\";\nimport { aNamed, aNamed as anotherNamed } from \"./src/mod2\";\nimport { original as anAliased } from \"./src/mod3\";\nimport * as aNamespace from \"./src/mod4\";\n\nimport aDefault2 from \"./src/mod5\";\nimport { aNamed2, aNamed2 as anotherNamed2 } from \"./src/mod6\";\nimport { original as anAliased2 } from \"./src/mod7\";\n\nimport aDefault3 from \"./src/mod9\";\nimport { aNamed3, aNamed3 as anotherNamed3 } from \"./src/mod10\";\nimport { original as anAliased3 } from \"./src/mod11\";\n\nimport optimizedOut from \"./src/optimized-out\";\noptimizedOut();\n\nexport default function root() {\n console.log(\"pause here\", root);\n\n console.log(aDefault);\n console.log(anAliased);\n console.log(aNamed);\n console.log(anotherNamed);\n console.log(aNamespace);\n\n try {\n // None of these are callable in this code, but we still want to make sure\n // they map properly even if the only reference is in a call expressions.\n console.log(aDefault2());\n console.log(anAliased2());\n console.log(aNamed2());\n console.log(anotherNamed2());\n\n console.log(new aDefault3());\n console.log(new anAliased3());\n console.log(new aNamed3());\n console.log(new anotherNamed3());\n } catch (e) {}\n}\n\nexport function example(){}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./input.js\n// module id = 0\n// module chunks = 0","export default \"a-default\";\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mod1.js\n// module id = 1\n// module chunks = 0","export const aNamed = \"a-named\";\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mod2.js\n// module id = 2\n// module chunks = 0","export const original = \"an-original\";\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mod3.js\n// module id = 3\n// module chunks = 0","export default \"a-default\";\nexport const aNamed = \"a-named\";\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mod4.js\n// module id = 4\n// module chunks = 0","export default \"a-default2\";\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mod5.js\n// module id = 5\n// module chunks = 0","export const aNamed2 = \"a-named2\";\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mod6.js\n// module id = 6\n// module chunks = 0","export const original = \"an-original2\";\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mod7.js\n// module id = 7\n// module chunks = 0","export default \"a-default3\";\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mod9.js\n// module id = 8\n// module chunks = 0","export const aNamed3 = \"a-named3\";\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mod10.js\n// module id = 9\n// module chunks = 0","export const original = \"an-original3\";\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mod11.js\n// module id = 10\n// module chunks = 0","export default function optimizedOut() {}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/optimized-out.js\n// module id = 11\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/esmodules-es6.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/esmodules-es6.js
new file mode 100644
index 0000000000..325e804324
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/esmodules-es6.js
@@ -0,0 +1,236 @@
+var webpack3EsmodulesEs6 =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+/* harmony export (immutable) */ __webpack_exports__["example"] = example;
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_mod1__ = __webpack_require__(1);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__src_mod2__ = __webpack_require__(2);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__src_mod3__ = __webpack_require__(3);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__src_mod4__ = __webpack_require__(4);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__src_mod5__ = __webpack_require__(5);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__src_mod6__ = __webpack_require__(6);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__src_mod7__ = __webpack_require__(7);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__src_mod9__ = __webpack_require__(8);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__src_mod10__ = __webpack_require__(9);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__src_mod11__ = __webpack_require__(10);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__src_optimized_out__ = __webpack_require__(11);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Object(__WEBPACK_IMPORTED_MODULE_10__src_optimized_out__["a" /* default */])();
+
+function root() {
+ console.log("pause here", root);
+
+ console.log(__WEBPACK_IMPORTED_MODULE_0__src_mod1__["a" /* default */]);
+ console.log(__WEBPACK_IMPORTED_MODULE_2__src_mod3__["a" /* original */]);
+ console.log(__WEBPACK_IMPORTED_MODULE_1__src_mod2__["a" /* aNamed */]);
+ console.log(__WEBPACK_IMPORTED_MODULE_1__src_mod2__["a" /* aNamed */]);
+ console.log(__WEBPACK_IMPORTED_MODULE_3__src_mod4__);
+
+ try {
+ // None of these are callable in this code, but we still want to make sure
+ // they map properly even if the only reference is in a call expressions.
+ console.log(Object(__WEBPACK_IMPORTED_MODULE_4__src_mod5__["a" /* default */])());
+ console.log(Object(__WEBPACK_IMPORTED_MODULE_6__src_mod7__["a" /* original */])());
+ console.log(Object(__WEBPACK_IMPORTED_MODULE_5__src_mod6__["a" /* aNamed2 */])());
+ console.log(Object(__WEBPACK_IMPORTED_MODULE_5__src_mod6__["a" /* aNamed2 */])());
+
+ console.log(new __WEBPACK_IMPORTED_MODULE_7__src_mod9__["a" /* default */]());
+ console.log(new __WEBPACK_IMPORTED_MODULE_9__src_mod11__["a" /* original */]());
+ console.log(new __WEBPACK_IMPORTED_MODULE_8__src_mod10__["a" /* aNamed3 */]());
+ console.log(new __WEBPACK_IMPORTED_MODULE_8__src_mod10__["a" /* aNamed3 */]());
+ } catch (e) {}
+}
+
+function example(){}
+
+
+/***/ }),
+/* 1 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony default export */ __webpack_exports__["a"] = ("a-default");
+
+
+/***/ }),
+/* 2 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+const aNamed = "a-named";
+/* harmony export (immutable) */ __webpack_exports__["a"] = aNamed;
+
+
+
+/***/ }),
+/* 3 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+const original = "an-original";
+/* harmony export (immutable) */ __webpack_exports__["a"] = original;
+
+
+
+/***/ }),
+/* 4 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony default export */ __webpack_exports__["default"] = ("a-default");
+const aNamed = "a-named";
+/* harmony export (immutable) */ __webpack_exports__["aNamed"] = aNamed;
+
+
+
+/***/ }),
+/* 5 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony default export */ __webpack_exports__["a"] = ("a-default2");
+
+
+/***/ }),
+/* 6 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+const aNamed2 = "a-named2";
+/* harmony export (immutable) */ __webpack_exports__["a"] = aNamed2;
+
+
+
+/***/ }),
+/* 7 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+const original = "an-original2";
+/* harmony export (immutable) */ __webpack_exports__["a"] = original;
+
+
+
+/***/ }),
+/* 8 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony default export */ __webpack_exports__["a"] = ("a-default3");
+
+
+/***/ }),
+/* 9 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+const aNamed3 = "a-named3";
+/* harmony export (immutable) */ __webpack_exports__["a"] = aNamed3;
+
+
+
+/***/ }),
+/* 10 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+const original = "an-original3";
+/* harmony export (immutable) */ __webpack_exports__["a"] = original;
+
+
+
+/***/ }),
+/* 11 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (immutable) */ __webpack_exports__["a"] = optimizedOut;
+function optimizedOut() {}
+
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=esmodules-es6.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/esmodules-es6.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/esmodules-es6.js.map
new file mode 100644
index 0000000000..bdea6527d8
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/esmodules-es6.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3://./esmodules-es6/webpack/bootstrap 8a9710b10f5b189da500","webpack3://./esmodules-es6/./input.js","webpack3://./esmodules-es6/./src/mod1.js","webpack3://./esmodules-es6/./src/mod2.js","webpack3://./esmodules-es6/./src/mod3.js","webpack3://./esmodules-es6/./src/mod4.js","webpack3://./esmodules-es6/./src/mod5.js","webpack3://./esmodules-es6/./src/mod6.js","webpack3://./esmodules-es6/./src/mod7.js","webpack3://./esmodules-es6/./src/mod9.js","webpack3://./esmodules-es6/./src/mod10.js","webpack3://./esmodules-es6/./src/mod11.js","webpack3://./esmodules-es6/./src/optimized-out.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;;;;;;;;;;;;AC7DA;AACyC;AACT;AAChC;;AAEA;AAC4C;AACX;;AAEjC;AAC4C;AACX;;AAEjC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;;;;;;;ACxCA;;;;;;;;ACAA;AAAA;AAAA;;;;;;;;ACAA;AAAA;AAAA;;;;;;;;;ACAA;AACA;AAAA;AAAA;;;;;;;;ACDA;;;;;;;;ACAA;AAAA;AAAA;;;;;;;;ACAA;AAAA;AAAA;;;;;;;;ACAA;;;;;;;;ACAA;AAAA;AAAA;;;;;;;;ACAA;AAAA;AAAA;;;;;;;;;ACAA","file":"esmodules-es6.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 8a9710b10f5b189da500","import aDefault from \"./src/mod1\";\nimport { aNamed, aNamed as anotherNamed } from \"./src/mod2\";\nimport { original as anAliased } from \"./src/mod3\";\nimport * as aNamespace from \"./src/mod4\";\n\nimport aDefault2 from \"./src/mod5\";\nimport { aNamed2, aNamed2 as anotherNamed2 } from \"./src/mod6\";\nimport { original as anAliased2 } from \"./src/mod7\";\n\nimport aDefault3 from \"./src/mod9\";\nimport { aNamed3, aNamed3 as anotherNamed3 } from \"./src/mod10\";\nimport { original as anAliased3 } from \"./src/mod11\";\n\nimport optimizedOut from \"./src/optimized-out\";\noptimizedOut();\n\nexport default function root() {\n console.log(\"pause here\", root);\n\n console.log(aDefault);\n console.log(anAliased);\n console.log(aNamed);\n console.log(anotherNamed);\n console.log(aNamespace);\n\n try {\n // None of these are callable in this code, but we still want to make sure\n // they map properly even if the only reference is in a call expressions.\n console.log(aDefault2());\n console.log(anAliased2());\n console.log(aNamed2());\n console.log(anotherNamed2());\n\n console.log(new aDefault3());\n console.log(new anAliased3());\n console.log(new aNamed3());\n console.log(new anotherNamed3());\n } catch (e) {}\n}\n\nexport function example(){}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./input.js\n// module id = 0\n// module chunks = 0","export default \"a-default\";\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mod1.js\n// module id = 1\n// module chunks = 0","export const aNamed = \"a-named\";\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mod2.js\n// module id = 2\n// module chunks = 0","export const original = \"an-original\";\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mod3.js\n// module id = 3\n// module chunks = 0","export default \"a-default\";\nexport const aNamed = \"a-named\";\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mod4.js\n// module id = 4\n// module chunks = 0","export default \"a-default2\";\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mod5.js\n// module id = 5\n// module chunks = 0","export const aNamed2 = \"a-named2\";\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mod6.js\n// module id = 6\n// module chunks = 0","export const original = \"an-original2\";\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mod7.js\n// module id = 7\n// module chunks = 0","export default \"a-default3\";\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mod9.js\n// module id = 8\n// module chunks = 0","export const aNamed3 = \"a-named3\";\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mod10.js\n// module id = 9\n// module chunks = 0","export const original = \"an-original3\";\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mod11.js\n// module id = 10\n// module chunks = 0","export default function optimizedOut() {}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/optimized-out.js\n// module id = 11\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/esmodules.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/esmodules.js
new file mode 100644
index 0000000000..f3ce29b678
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/esmodules.js
@@ -0,0 +1,236 @@
+var webpack3Esmodules =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+/* harmony export (immutable) */ __webpack_exports__["example"] = example;
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_mod1__ = __webpack_require__(1);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__src_mod2__ = __webpack_require__(2);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2__src_mod3__ = __webpack_require__(3);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3__src_mod4__ = __webpack_require__(4);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4__src_mod5__ = __webpack_require__(5);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_5__src_mod6__ = __webpack_require__(6);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_6__src_mod7__ = __webpack_require__(7);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_7__src_mod9__ = __webpack_require__(8);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_8__src_mod10__ = __webpack_require__(9);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_9__src_mod11__ = __webpack_require__(10);
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_10__src_optimized_out__ = __webpack_require__(11);
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Object(__WEBPACK_IMPORTED_MODULE_10__src_optimized_out__["a" /* default */])();
+
+function root() {
+ console.log("pause here", root);
+
+ console.log(__WEBPACK_IMPORTED_MODULE_0__src_mod1__["a" /* default */]);
+ console.log(__WEBPACK_IMPORTED_MODULE_2__src_mod3__["a" /* original */]);
+ console.log(__WEBPACK_IMPORTED_MODULE_1__src_mod2__["a" /* aNamed */]);
+ console.log(__WEBPACK_IMPORTED_MODULE_1__src_mod2__["a" /* aNamed */]);
+ console.log(__WEBPACK_IMPORTED_MODULE_3__src_mod4__);
+
+ try {
+ // None of these are callable in this code, but we still want to make sure
+ // they map properly even if the only reference is in a call expressions.
+ console.log(Object(__WEBPACK_IMPORTED_MODULE_4__src_mod5__["a" /* default */])());
+ console.log(Object(__WEBPACK_IMPORTED_MODULE_6__src_mod7__["a" /* original */])());
+ console.log(Object(__WEBPACK_IMPORTED_MODULE_5__src_mod6__["a" /* aNamed2 */])());
+ console.log(Object(__WEBPACK_IMPORTED_MODULE_5__src_mod6__["a" /* aNamed2 */])());
+
+ console.log(new __WEBPACK_IMPORTED_MODULE_7__src_mod9__["a" /* default */]());
+ console.log(new __WEBPACK_IMPORTED_MODULE_9__src_mod11__["a" /* original */]());
+ console.log(new __WEBPACK_IMPORTED_MODULE_8__src_mod10__["a" /* aNamed3 */]());
+ console.log(new __WEBPACK_IMPORTED_MODULE_8__src_mod10__["a" /* aNamed3 */]());
+ } catch (e) {}
+}
+
+function example(){}
+
+
+/***/ }),
+/* 1 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony default export */ __webpack_exports__["a"] = ("a-default");
+
+
+/***/ }),
+/* 2 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+const aNamed = "a-named";
+/* harmony export (immutable) */ __webpack_exports__["a"] = aNamed;
+
+
+
+/***/ }),
+/* 3 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+const original = "an-original";
+/* harmony export (immutable) */ __webpack_exports__["a"] = original;
+
+
+
+/***/ }),
+/* 4 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony default export */ __webpack_exports__["default"] = ("a-default");
+const aNamed = "a-named";
+/* harmony export (immutable) */ __webpack_exports__["aNamed"] = aNamed;
+
+
+
+/***/ }),
+/* 5 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony default export */ __webpack_exports__["a"] = ("a-default2");
+
+
+/***/ }),
+/* 6 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+const aNamed2 = "a-named2";
+/* harmony export (immutable) */ __webpack_exports__["a"] = aNamed2;
+
+
+
+/***/ }),
+/* 7 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+const original = "an-original2";
+/* harmony export (immutable) */ __webpack_exports__["a"] = original;
+
+
+
+/***/ }),
+/* 8 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony default export */ __webpack_exports__["a"] = ("a-default3");
+
+
+/***/ }),
+/* 9 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+const aNamed3 = "a-named3";
+/* harmony export (immutable) */ __webpack_exports__["a"] = aNamed3;
+
+
+
+/***/ }),
+/* 10 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+const original = "an-original3";
+/* harmony export (immutable) */ __webpack_exports__["a"] = original;
+
+
+
+/***/ }),
+/* 11 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony export (immutable) */ __webpack_exports__["a"] = optimizedOut;
+function optimizedOut() {}
+
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=esmodules.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/esmodules.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/esmodules.js.map
new file mode 100644
index 0000000000..649272808f
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/esmodules.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3://./esmodules/webpack/bootstrap 0ab3189dbc2e0da82c16","webpack3://./esmodules/./input.js","webpack3://./esmodules/./src/mod1.js","webpack3://./esmodules/./src/mod2.js","webpack3://./esmodules/./src/mod3.js","webpack3://./esmodules/./src/mod4.js","webpack3://./esmodules/./src/mod5.js","webpack3://./esmodules/./src/mod6.js","webpack3://./esmodules/./src/mod7.js","webpack3://./esmodules/./src/mod9.js","webpack3://./esmodules/./src/mod10.js","webpack3://./esmodules/./src/mod11.js","webpack3://./esmodules/./src/optimized-out.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;;;;;;;;;;;;AC7DA;AACyC;AACT;AAChC;;AAEA;AAC4C;AACX;;AAEjC;AAC4C;AACX;;AAEjC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;;;;;;;ACxCA;;;;;;;;ACAA;AAAA;AAAA;;;;;;;;ACAA;AAAA;AAAA;;;;;;;;;ACAA;AACA;AAAA;AAAA;;;;;;;;ACDA;;;;;;;;ACAA;AAAA;AAAA;;;;;;;;ACAA;AAAA;AAAA;;;;;;;;ACAA;;;;;;;;ACAA;AAAA;AAAA;;;;;;;;ACAA;AAAA;AAAA;;;;;;;;;ACAA","file":"esmodules.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 0ab3189dbc2e0da82c16","import aDefault from \"./src/mod1\";\nimport { aNamed, aNamed as anotherNamed } from \"./src/mod2\";\nimport { original as anAliased } from \"./src/mod3\";\nimport * as aNamespace from \"./src/mod4\";\n\nimport aDefault2 from \"./src/mod5\";\nimport { aNamed2, aNamed2 as anotherNamed2 } from \"./src/mod6\";\nimport { original as anAliased2 } from \"./src/mod7\";\n\nimport aDefault3 from \"./src/mod9\";\nimport { aNamed3, aNamed3 as anotherNamed3 } from \"./src/mod10\";\nimport { original as anAliased3 } from \"./src/mod11\";\n\nimport optimizedOut from \"./src/optimized-out\";\noptimizedOut();\n\nexport default function root() {\n console.log(\"pause here\", root);\n\n console.log(aDefault);\n console.log(anAliased);\n console.log(aNamed);\n console.log(anotherNamed);\n console.log(aNamespace);\n\n try {\n // None of these are callable in this code, but we still want to make sure\n // they map properly even if the only reference is in a call expressions.\n console.log(aDefault2());\n console.log(anAliased2());\n console.log(aNamed2());\n console.log(anotherNamed2());\n\n console.log(new aDefault3());\n console.log(new anAliased3());\n console.log(new aNamed3());\n console.log(new anotherNamed3());\n } catch (e) {}\n}\n\nexport function example(){}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./input.js\n// module id = 0\n// module chunks = 0","export default \"a-default\";\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mod1.js\n// module id = 1\n// module chunks = 0","export const aNamed = \"a-named\";\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mod2.js\n// module id = 2\n// module chunks = 0","export const original = \"an-original\";\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mod3.js\n// module id = 3\n// module chunks = 0","export default \"a-default\";\nexport const aNamed = \"a-named\";\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mod4.js\n// module id = 4\n// module chunks = 0","export default \"a-default2\";\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mod5.js\n// module id = 5\n// module chunks = 0","export const aNamed2 = \"a-named2\";\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mod6.js\n// module id = 6\n// module chunks = 0","export const original = \"an-original2\";\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mod7.js\n// module id = 7\n// module chunks = 0","export default \"a-default3\";\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mod9.js\n// module id = 8\n// module chunks = 0","export const aNamed3 = \"a-named3\";\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mod10.js\n// module id = 9\n// module chunks = 0","export const original = \"an-original3\";\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mod11.js\n// module id = 10\n// module chunks = 0","export default function optimizedOut() {}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/optimized-out.js\n// module id = 11\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/eval-maps.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/eval-maps.js
new file mode 100644
index 0000000000..a012c4c44e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/eval-maps.js
@@ -0,0 +1,94 @@
+var webpack3EvalMaps =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+
+function root() {
+ var one = 1;
+ let two = 2;
+ const three = 3;
+
+ one;
+ two;
+
+ {
+ let two = 4;
+ const three = 5;
+
+ console.log("pause here", one, two, three);
+ }
+}
+
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=eval-maps.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/eval-maps.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/eval-maps.js.map
new file mode 100644
index 0000000000..c80f957d0e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/eval-maps.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3://./eval-maps/webpack/bootstrap e630221540652dd2be2b","webpack3://./eval-maps/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;AC5DA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA","file":"eval-maps.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap e630221540652dd2be2b","\nexport default function root() {\n var one = 1;\n let two = 2;\n const three = 3;\n\n one;\n two;\n\n {\n let two = 4;\n const three = 5;\n\n console.log(\"pause here\", one, two, three);\n }\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./input.js\n// module id = 0\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/for-loops.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/for-loops.js
new file mode 100644
index 0000000000..e552afe46b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/for-loops.js
@@ -0,0 +1,93 @@
+var webpack3ForLoops =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+function root() {
+ let i = 0;
+
+ for (let i = 1; i < 2; i++) {
+ console.log("pause here", root);
+ }
+
+ for (let i in { 2: "" }) {
+ console.log("pause here", root);
+ }
+
+ for (let i of [3]) {
+ console.log("pause here", root);
+ }
+}
+
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=for-loops.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/for-loops.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/for-loops.js.map
new file mode 100644
index 0000000000..48ddffadc6
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/for-loops.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3://./for-loops/webpack/bootstrap 3ba251346f9cc42b8e32","webpack3://./for-loops/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;AC7DA;AACA;;AAEA,iBAAiB,OAAO;AACxB;AACA;;AAEA,iBAAiB,QAAQ;AACzB;AACA;;AAEA;AACA;AACA;AACA","file":"for-loops.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 3ba251346f9cc42b8e32","export default function root() {\n let i = 0;\n\n for (let i = 1; i < 2; i++) {\n console.log(\"pause here\", root);\n }\n\n for (let i in { 2: \"\" }) {\n console.log(\"pause here\", root);\n }\n\n for (let i of [3]) {\n console.log(\"pause here\", root);\n }\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./input.js\n// module id = 0\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/for-of.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/for-of.js
new file mode 100644
index 0000000000..20ed33c5da
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/for-of.js
@@ -0,0 +1,90 @@
+var webpack3ForOf =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = forOf;
+const mod = "module scoped";
+
+function forOf() {
+ for (const x of [1]) {
+ doThing(x);
+ }
+
+ function doThing(arg) {
+ // Avoid optimize out
+ window.console;
+ }
+}
+
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=for-of.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/for-of.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/for-of.js.map
new file mode 100644
index 0000000000..854380152b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/for-of.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3://./for-of/webpack/bootstrap 054ce9a6e0066cf71b81","webpack3://./for-of/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;AC7DA;AAAA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA","file":"for-of.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 054ce9a6e0066cf71b81","const mod = \"module scoped\";\n\nexport default function forOf() {\n for (const x of [1]) {\n doThing(x);\n }\n\n function doThing(arg) {\n // Avoid optimize out\n window.console;\n }\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./input.js\n// module id = 0\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/functions.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/functions.js
new file mode 100644
index 0000000000..2271891206
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/functions.js
@@ -0,0 +1,92 @@
+var webpack3Functions =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+function root() {
+
+ function decl(p1) {
+ const inner = function inner(p2) {
+ const arrow = (p3) => {
+ console.log("pause here", p3, arrow, p2, inner, p1, decl, root);
+ };
+ arrow();
+ };
+ inner();
+ }
+
+ decl();
+}
+
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=functions.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/functions.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/functions.js.map
new file mode 100644
index 0000000000..ae6e10222c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/functions.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3://./functions/webpack/bootstrap 6787b9b5cfd39e0a13cb","webpack3://./functions/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;AC7DA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA","file":"functions.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 6787b9b5cfd39e0a13cb","export default function root() {\n\n function decl(p1) {\n const inner = function inner(p2) {\n const arrow = (p3) => {\n console.log(\"pause here\", p3, arrow, p2, inner, p1, decl, root);\n };\n arrow();\n };\n inner();\n }\n\n decl();\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./input.js\n// module id = 0\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/lex-and-nonlex.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/lex-and-nonlex.js
new file mode 100644
index 0000000000..371f552587
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/lex-and-nonlex.js
@@ -0,0 +1,87 @@
+var webpack3LexAndNonlex =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+function root() {
+ function someHelper(){
+ console.log("pause here", root, Thing);
+ }
+
+ class Thing {}
+
+ someHelper();
+}
+
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=lex-and-nonlex.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/lex-and-nonlex.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/lex-and-nonlex.js.map
new file mode 100644
index 0000000000..92c2a4e161
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/lex-and-nonlex.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3://./lex-and-nonlex/webpack/bootstrap 20405560d773407a9ad0","webpack3://./lex-and-nonlex/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;AC7DA;AACA;AACA;AACA;;AAEA;;AAEA;AACA","file":"lex-and-nonlex.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 20405560d773407a9ad0","export default function root() {\n function someHelper(){\n console.log(\"pause here\", root, Thing);\n }\n\n class Thing {}\n\n someHelper();\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./input.js\n// module id = 0\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/line-start-bindings-es6.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/line-start-bindings-es6.js
new file mode 100644
index 0000000000..47806d1636
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/line-start-bindings-es6.js
@@ -0,0 +1,101 @@
+var webpack3LineStartBindingsEs6 =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+
+function root() {
+ function aFunc(){
+ // Since these bindings are on their own linem, the mappings will
+ // extend to the start of the line, rather than starting at the first
+ // character of the binding.
+ const {
+ one,
+ two
+ } = {
+ one: 1,
+ two: 2,
+ };
+
+ // The 'this' binding here is also its own line, so the comment above
+ // applies here too.
+ this.thing = 4;
+
+ console.log("pause here", root);
+ }
+
+ aFunc.call({ });
+}
+
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=line-start-bindings-es6.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/line-start-bindings-es6.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/line-start-bindings-es6.js.map
new file mode 100644
index 0000000000..917b734026
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/line-start-bindings-es6.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3://./line-start-bindings-es6/webpack/bootstrap d6c5b4b0bdd751d42d46","webpack3://./line-start-bindings-es6/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,cAAc,EAAE;AAChB","file":"line-start-bindings-es6.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap d6c5b4b0bdd751d42d46","\nexport default function root() {\n function aFunc(){\n // Since these bindings are on their own linem, the mappings will\n // extend to the start of the line, rather than starting at the first\n // character of the binding.\n const {\n one,\n two\n } = {\n one: 1,\n two: 2,\n };\n\n // The 'this' binding here is also its own line, so the comment above\n // applies here too.\n this.thing = 4;\n\n console.log(\"pause here\", root);\n }\n\n aFunc.call({ });\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./input.js\n// module id = 0\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/modules-cjs.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/modules-cjs.js
new file mode 100644
index 0000000000..4a3a29edd7
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/modules-cjs.js
@@ -0,0 +1,83 @@
+var webpack3ModulesCjs =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports) {
+
+var moduleScoped = 1;
+let alsoModuleScoped = 2;
+
+function thirdModuleScoped() {}
+
+exports.default = function() {
+ console.log("pause here", moduleScoped, alsoModuleScoped, thirdModuleScoped);
+};
+
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=modules-cjs.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/modules-cjs.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/modules-cjs.js.map
new file mode 100644
index 0000000000..7d2edcad58
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/modules-cjs.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3://./modules-cjs/webpack/bootstrap 22ed655ec921795da34e","webpack3://./modules-cjs/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;AC7DA;AACA;;AAEA;;AAEA;AACA;AACA","file":"modules-cjs.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 22ed655ec921795da34e","var moduleScoped = 1;\nlet alsoModuleScoped = 2;\n\nfunction thirdModuleScoped() {}\n\nexports.default = function() {\n console.log(\"pause here\", moduleScoped, alsoModuleScoped, thirdModuleScoped);\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./input.js\n// module id = 0\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/out-of-order-declarations-cjs.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/out-of-order-declarations-cjs.js
new file mode 100644
index 0000000000..10ab60cf61
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/out-of-order-declarations-cjs.js
@@ -0,0 +1,104 @@
+var webpack3OutOfOrderDeclarationsCjs =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_mod__ = __webpack_require__(1);
+var val = "outer-value";
+
+function root() {
+ var val = "middle-value";
+ var fn = function outerFn(outer){};
+
+ function callback() {
+ console.log("pause here", val, __WEBPACK_IMPORTED_MODULE_0__src_mod__["a" /* default */], fn);
+
+ var val = "inner-value";
+ function fn(inner){};
+ }
+
+ callback();
+}
+
+
+
+
+/***/ }),
+/* 1 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony default export */ __webpack_exports__["a"] = ("a-default");
+
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=out-of-order-declarations-cjs.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/out-of-order-declarations-cjs.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/out-of-order-declarations-cjs.js.map
new file mode 100644
index 0000000000..ac5f9e2342
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/out-of-order-declarations-cjs.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3://./out-of-order-declarations-cjs/webpack/bootstrap 81ffdad3f468fae4f800","webpack3://./out-of-order-declarations-cjs/./input.js","webpack3://./out-of-order-declarations-cjs/./src/mod.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;AC7DA;AAAA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;AChBA","file":"out-of-order-declarations-cjs.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 81ffdad3f468fae4f800","var val = \"outer-value\";\n\nexport default function root() {\n var val = \"middle-value\";\n var fn = function outerFn(outer){};\n\n function callback() {\n console.log(\"pause here\", val, aDefault, fn);\n\n var val = \"inner-value\";\n function fn(inner){};\n }\n\n callback();\n}\n\nimport aDefault from \"./src/mod\";\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./input.js\n// module id = 0\n// module chunks = 0","export default \"a-default\";\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mod.js\n// module id = 1\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/shadowed-vars.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/shadowed-vars.js
new file mode 100644
index 0000000000..4fa98377fa
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/shadowed-vars.js
@@ -0,0 +1,98 @@
+var webpack3ShadowedVars =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+ var aVar = "var1";
+ let aLet = "let1";
+ const aConst = "const1";
+
+ class Outer {}
+ {
+ function Outer() {}
+
+ var aVar = "var2";
+ let aLet = "let2";
+ const aConst = "const2";
+ {
+ var aVar = "var3";
+ let aLet = "let3";
+ const aConst = "const3";
+
+ console.log("pause here");
+ }
+ }
+});
+
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=shadowed-vars.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/shadowed-vars.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/shadowed-vars.js.map
new file mode 100644
index 0000000000..b8b93f0beb
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/shadowed-vars.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3://./shadowed-vars/webpack/bootstrap b59cc74f3e00ef3e991b","webpack3://./shadowed-vars/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;AC7DA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA","file":"shadowed-vars.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap b59cc74f3e00ef3e991b","export default function() {\n var aVar = \"var1\";\n let aLet = \"let1\";\n const aConst = \"const1\";\n\n class Outer {}\n {\n function Outer() {}\n\n var aVar = \"var2\";\n let aLet = \"let2\";\n const aConst = \"const2\";\n {\n var aVar = \"var3\";\n let aLet = \"let3\";\n const aConst = \"const3\";\n\n console.log(\"pause here\");\n }\n }\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./input.js\n// module id = 0\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-for-of-array-closure.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-for-of-array-closure.js
new file mode 100644
index 0000000000..60ab877c40
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-for-of-array-closure.js
@@ -0,0 +1,88 @@
+var webpack3StepOverForOfArrayClosure =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+// Babel will optimize this for..of because it call tell the value is an array.
+function root() {
+ console.log("pause here");
+
+ for (const val of [1, 2]) {
+ console.log("pause again", (() => val)());
+ }
+
+ console.log("done");
+}
+
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=step-over-for-of-array-closure.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-for-of-array-closure.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-for-of-array-closure.js.map
new file mode 100644
index 0000000000..bc36b24844
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-for-of-array-closure.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3://./step-over-for-of-array-closure/webpack/bootstrap d56899c376bc575b0135","webpack3://./step-over-for-of-array-closure/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;AC7DA;AAAA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA","file":"step-over-for-of-array-closure.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap d56899c376bc575b0135","// Babel will optimize this for..of because it call tell the value is an array.\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of [1, 2]) {\n console.log(\"pause again\", (() => val)());\n }\n\n console.log(\"done\");\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./input.js\n// module id = 0\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-for-of-array.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-for-of-array.js
new file mode 100644
index 0000000000..e55427c68c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-for-of-array.js
@@ -0,0 +1,88 @@
+var webpack3StepOverForOfArray =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+// Babel will optimize this for..of because it call tell the value is an array.
+function root() {
+ console.log("pause here");
+
+ for (const val of [1, 2]) {
+ console.log("pause again", val);
+ }
+
+ console.log("done");
+}
+
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=step-over-for-of-array.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-for-of-array.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-for-of-array.js.map
new file mode 100644
index 0000000000..c8cb967810
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-for-of-array.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3://./step-over-for-of-array/webpack/bootstrap a88a465a91dce0119ebb","webpack3://./step-over-for-of-array/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;AC7DA;AAAA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA","file":"step-over-for-of-array.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap a88a465a91dce0119ebb","// Babel will optimize this for..of because it call tell the value is an array.\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of [1, 2]) {\n console.log(\"pause again\", val);\n }\n\n console.log(\"done\");\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./input.js\n// module id = 0\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-for-of-closure.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-for-of-closure.js
new file mode 100644
index 0000000000..b3a54f5e4b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-for-of-closure.js
@@ -0,0 +1,91 @@
+var webpack3StepOverForOfClosure =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+// Babel will convert the loop body to a function to handle the 'val' lexical
+// enclosure behavior.
+const vals = [1, 2];
+
+function root() {
+ console.log("pause here");
+
+ for (const val of vals) {
+ console.log("pause again", (() => val)());
+ }
+
+ console.log("done");
+}
+
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=step-over-for-of-closure.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-for-of-closure.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-for-of-closure.js.map
new file mode 100644
index 0000000000..3195cee696
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-for-of-closure.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3://./step-over-for-of-closure/webpack/bootstrap 3d76d869e153d9d19619","webpack3://./step-over-for-of-closure/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;AC7DA;AAAA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA","file":"step-over-for-of-closure.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 3d76d869e153d9d19619","// Babel will convert the loop body to a function to handle the 'val' lexical\n// enclosure behavior.\nconst vals = [1, 2];\n\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of vals) {\n console.log(\"pause again\", (() => val)());\n }\n\n console.log(\"done\");\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./input.js\n// module id = 0\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-for-of.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-for-of.js
new file mode 100644
index 0000000000..d16f83f6d6
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-for-of.js
@@ -0,0 +1,89 @@
+var webpack3StepOverForOf =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+const vals = [1, 2];
+
+function root() {
+ console.log("pause here");
+
+ for (const val of vals) {
+ console.log("pause again", val);
+ }
+
+ console.log("done");
+}
+
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=step-over-for-of.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-for-of.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-for-of.js.map
new file mode 100644
index 0000000000..b7bc3a8c7b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-for-of.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3://./step-over-for-of/webpack/bootstrap de972c23efc1d819c8b5","webpack3://./step-over-for-of/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;AC7DA;AAAA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA","file":"step-over-for-of.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap de972c23efc1d819c8b5","const vals = [1, 2];\n\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of vals) {\n console.log(\"pause again\", val);\n }\n\n console.log(\"done\");\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./input.js\n// module id = 0\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-function-params.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-function-params.js
new file mode 100644
index 0000000000..7a25552e76
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-function-params.js
@@ -0,0 +1,86 @@
+var webpack3StepOverFunctionParams =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = fn;
+function test(a1, a2 = 45, { a3, a4, a5: { a6: a7 } = {} } = {}) {
+ console.log("pause next here");
+}
+
+function fn() {
+ console.log("pause here");
+ test("1", undefined, { a3: "3", a4: "4", a5: { a6: "7" } });
+}
+
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=step-over-function-params.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-function-params.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-function-params.js.map
new file mode 100644
index 0000000000..a34780f1d0
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-function-params.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3://./step-over-function-params/webpack/bootstrap 1a87c196c1d1c071e0ac","webpack3://./step-over-function-params/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;AC7DA;AAAA,4BAA4B,cAAc,SAAS,KAAK,EAAE,KAAK;AAC/D;AACA;;AAEA;AACA;AACA,wBAAwB,wBAAwB,UAAU,EAAE;AAC5D","file":"step-over-function-params.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 1a87c196c1d1c071e0ac","function test(a1, a2 = 45, { a3, a4, a5: { a6: a7 } = {} } = {}) {\n console.log(\"pause next here\");\n}\n\nexport default function fn() {\n console.log(\"pause here\");\n test(\"1\", undefined, { a3: \"3\", a4: \"4\", a5: { a6: \"7\" } });\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./input.js\n// module id = 0\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-regenerator-await.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-regenerator-await.js
new file mode 100644
index 0000000000..4a57fa7b43
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-regenerator-await.js
@@ -0,0 +1,93 @@
+var webpack3StepOverRegeneratorAwait =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+var fn = async function fn() {
+ console.log("pause here");
+
+ await doAsync();
+
+ console.log("stopped here");
+};
+
+function doAsync() {
+ return Promise.resolve();
+}
+
+function root() {
+ fn();
+}
+
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=step-over-regenerator-await.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-regenerator-await.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-regenerator-await.js.map
new file mode 100644
index 0000000000..e0f302829c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/step-over-regenerator-await.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3://./step-over-regenerator-await/webpack/bootstrap c258bfc410ca5b059b42","webpack3://./step-over-regenerator-await/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;AC7DA;AAAA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA","file":"step-over-regenerator-await.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap c258bfc410ca5b059b42","var fn = async function fn() {\n console.log(\"pause here\");\n\n await doAsync();\n\n console.log(\"stopped here\");\n};\n\nfunction doAsync() {\n return Promise.resolve();\n}\n\nexport default function root() {\n fn();\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./input.js\n// module id = 0\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/switches.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/switches.js
new file mode 100644
index 0000000000..e7b7a0777e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/switches.js
@@ -0,0 +1,91 @@
+var webpack3Switches =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+function root() {
+ let val = 1;
+
+ switch (true) {
+ case true:
+ let val = 2;
+ console.log("pause here", root);
+ default: {
+ let val = 3;
+ console.log("pause here", root);
+ }
+ }
+}
+
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=switches.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/switches.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/switches.js.map
new file mode 100644
index 0000000000..01a838e104
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/switches.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3://./switches/webpack/bootstrap 3f91842a318a307b2662","webpack3://./switches/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;AC7DA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"switches.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 3f91842a318a307b2662","export default function root() {\n let val = 1;\n\n switch (true) {\n case true:\n let val = 2;\n console.log(\"pause here\", root);\n default: {\n let val = 3;\n console.log(\"pause here\", root);\n }\n }\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./input.js\n// module id = 0\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/this-arguments-bindings.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/this-arguments-bindings.js
new file mode 100644
index 0000000000..0ab89d1b21
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/this-arguments-bindings.js
@@ -0,0 +1,92 @@
+var webpack3ThisArgumentsBindings =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+function root() {
+ function fn(arg) {
+ console.log(this, arguments);
+ console.log("pause here", fn, root);
+
+ const arrow = argArrow => {
+ console.log(this, arguments);
+ console.log("pause here", fn, root);
+ };
+ arrow("arrow-arg");
+ }
+
+ fn.call("this-value", "arg-value");
+}
+
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=this-arguments-bindings.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/this-arguments-bindings.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/this-arguments-bindings.js.map
new file mode 100644
index 0000000000..b54f4f7c6f
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/this-arguments-bindings.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3://./this-arguments-bindings/webpack/bootstrap 22b8fade351bddb8c6df","webpack3://./this-arguments-bindings/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;AC7DA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA","file":"this-arguments-bindings.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 22b8fade351bddb8c6df","export default function root() {\n function fn(arg) {\n console.log(this, arguments);\n console.log(\"pause here\", fn, root);\n\n const arrow = argArrow => {\n console.log(this, arguments);\n console.log(\"pause here\", fn, root);\n };\n arrow(\"arrow-arg\");\n }\n\n fn.call(\"this-value\", \"arg-value\");\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./input.js\n// module id = 0\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/try-catches.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/try-catches.js
new file mode 100644
index 0000000000..800cfdff4e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/try-catches.js
@@ -0,0 +1,88 @@
+var webpack3TryCatches =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+function root() {
+ const one = 1;
+
+ try {
+ throw "AnError";
+ } catch (err) {
+ let two = 2;
+ console.log("pause here", root);
+ }
+}
+
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=try-catches.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/try-catches.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/try-catches.js.map
new file mode 100644
index 0000000000..529f525350
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/try-catches.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3://./try-catches/webpack/bootstrap 77c723c41101dee40a35","webpack3://./try-catches/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;AC7DA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA","file":"try-catches.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 77c723c41101dee40a35","export default function root() {\n const one = 1;\n\n try {\n throw \"AnError\";\n } catch (err) {\n let two = 2;\n console.log(\"pause here\", root);\n }\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./input.js\n// module id = 0\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/type-module.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/type-module.js
new file mode 100644
index 0000000000..adf0eea0e3
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/type-module.js
@@ -0,0 +1,85 @@
+var webpack3TypeModule =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+var moduleScoped = 1;
+let alsoModuleScoped = 2;
+
+function thirdModuleScoped() {}
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+ console.log("pause here", moduleScoped, alsoModuleScoped, thirdModuleScoped);
+});
+
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=type-module.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/type-module.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/type-module.js.map
new file mode 100644
index 0000000000..811f7ec38e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/type-module.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3://./type-module/webpack/bootstrap 259ec2de2f0cd19f28f6","webpack3://./type-module/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;AC7DA;AAAA;AACA;;AAEA;;AAEA;AACA;AACA","file":"type-module.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 259ec2de2f0cd19f28f6","var moduleScoped = 1;\nlet alsoModuleScoped = 2;\n\nfunction thirdModuleScoped() {}\n\nexport default function() {\n console.log(\"pause here\", moduleScoped, alsoModuleScoped, thirdModuleScoped);\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./input.js\n// module id = 0\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/type-script-cjs.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/type-script-cjs.js
new file mode 100644
index 0000000000..6827736d6a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/type-script-cjs.js
@@ -0,0 +1,85 @@
+var webpack3TypeScriptCjs =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports) {
+
+var moduleScoped = 1;
+let alsoModuleScopes = 2;
+
+function thirdModuleScoped() {}
+
+function nonModules() {
+ console.log("pause here");
+}
+
+exports.default = nonModules;
+
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=type-script-cjs.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/type-script-cjs.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/type-script-cjs.js.map
new file mode 100644
index 0000000000..0d91284bc3
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/type-script-cjs.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3://./type-script-cjs/webpack/bootstrap 915e74a6b07896c0e2da","webpack3://./type-script-cjs/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;AC7DA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA","file":"type-script-cjs.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 915e74a6b07896c0e2da","var moduleScoped = 1;\nlet alsoModuleScopes = 2;\n\nfunction thirdModuleScoped() {}\n\nfunction nonModules() {\n console.log(\"pause here\");\n}\n\nexports.default = nonModules;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./input.js\n// module id = 0\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/typescript-classes.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/typescript-classes.js
new file mode 100644
index 0000000000..573cbb6fb7
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/typescript-classes.js
@@ -0,0 +1,179 @@
+var webpack3TypescriptClasses =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 1);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+exports.__esModule = true;
+function decoratorFactory(opts) {
+ return function decorator(target) {
+ return target;
+ };
+}
+exports.decoratorFactory = decoratorFactory;
+function def() { }
+exports["default"] = def;
+
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// This file essentially reproduces an example Angular component to map testing,
+// among other typescript edge cases.
+var __extends = (this && this.__extends) || (function () {
+ var extendStatics = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+ return function (d, b) {
+ extendStatics(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ };
+})();
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+exports.__esModule = true;
+var mod_ts_1 = __webpack_require__(0);
+var ns = __webpack_require__(0);
+var AppComponent = /** @class */ (function () {
+ function AppComponent() {
+ this.title = 'app';
+ }
+ AppComponent = __decorate([
+ mod_ts_1.decoratorFactory({
+ selector: 'app-root'
+ })
+ ], AppComponent);
+ return AppComponent;
+}());
+exports.AppComponent = AppComponent;
+var fn = function (arg) {
+ console.log("here");
+};
+fn("arg");
+// Un-decorated exported classes present a mapping challege because
+// the class name is mapped to an unhelpful export assignment.
+var ExportedOther = /** @class */ (function () {
+ function ExportedOther() {
+ this.title = 'app';
+ }
+ return ExportedOther;
+}());
+exports.ExportedOther = ExportedOther;
+var AnotherThing = /** @class */ (function () {
+ function AnotherThing() {
+ this.prop = 4;
+ }
+ return AnotherThing;
+}());
+var ExpressionClass = /** @class */ (function () {
+ function Foo() {
+ this.prop = 4;
+ }
+ return Foo;
+}());
+var SubDecl = /** @class */ (function (_super) {
+ __extends(SubDecl, _super);
+ function SubDecl() {
+ var _this = _super !== null && _super.apply(this, arguments) || this;
+ _this.prop = 4;
+ return _this;
+ }
+ return SubDecl;
+}(AnotherThing));
+var SubVar = /** @class */ (function (_super) {
+ __extends(SubExpr, _super);
+ function SubExpr() {
+ var _this = _super !== null && _super.apply(this, arguments) || this;
+ _this.prop = 4;
+ return _this;
+ }
+ return SubExpr;
+}(AnotherThing));
+ns;
+function default_1() {
+ // This file is specifically for testing the mappings of classes and things
+ // above, which means we don't want to include _other_ references to then.
+ // To avoid having them be optimized out, we include a no-op eval.
+ eval("");
+ console.log("pause here");
+}
+exports["default"] = default_1;
+
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=typescript-classes.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/typescript-classes.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/typescript-classes.js.map
new file mode 100644
index 0000000000..a4856e4f97
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/typescript-classes.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3://./typescript-classes/webpack/bootstrap 72affb70e005e17a24e0","webpack3://./typescript-classes/./src/mod.ts","webpack3://./typescript-classes/./input.ts"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;AC5DA,0BAAiC,IAA0B;IACzD,OAAO,mBAAmB,MAAM;QAC9B,OAAY,MAAM,CAAC;IACrB,CAAC,CAAC;AACJ,CAAC;AAJD,4CAIC;AAED,iBAA+B,CAAC;AAAhC,yBAAgC;;;;;;;;;ACPhC,gFAAgF;AAChF,qCAAqC;;;;;;;;;;;;;;;;;;AAErC,sCAAqD;AAErD,gCAAmC;AAKnC;IAHA;QAIE,UAAK,GAAG,KAAK,CAAC;IAChB,CAAC;IAFY,YAAY;QAHxB,yBAAgB,CAAC;YAChB,QAAQ,EAAE,UAAU;SACrB,CAAC;OACW,YAAY,CAExB;IAAD,mBAAC;CAAA;AAFY,oCAAY;AAIzB,IAAM,EAAE,GAAG,aAAG;IACZ,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC,CAAC;AACF,EAAE,CAAC,KAAK,CAAC,CAAC;AAEV,mEAAmE;AACnE,8DAA8D;AAC9D;IAAA;QACE,UAAK,GAAG,KAAK,CAAC;IAChB,CAAC;IAAD,oBAAC;AAAD,CAAC;AAFY,sCAAa;AAI1B;IAAA;QACE,SAAI,GAAG,CAAC,CAAC;IACX,CAAC;IAAD,mBAAC;AAAD,CAAC;AAED,IAAM,eAAe;IAAG;QACtB,SAAI,GAAG,CAAC,CAAC;IACX,CAAC;IAAD,UAAC;AAAD,CAAC,IAAC;AAEF;IAAsB,2BAAY;IAAlC;QAAA,qEAEC;QADC,UAAI,GAAG,CAAC,CAAC;;IACX,CAAC;IAAD,cAAC;AAAD,CAAC,CAFqB,YAAY,GAEjC;AAED,IAAI,MAAM;IAAyB,2BAAY;IAAlC;QAAA,qEAEZ;QADC,UAAI,GAAG,CAAC,CAAC;;IACX,CAAC;IAAD,cAAC;AAAD,CAAC,CAFkC,YAAY,EAE9C,CAAC;AAEF,EAAE,CAAC;AAEH;IACE,2EAA2E;IAC3E,0EAA0E;IAC1E,kEAAkE;IAClE,IAAI,CAAC,EAAE,CAAC,CAAC;IAET,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AAC5B,CAAC;AAPD,+BAOC","file":"typescript-classes.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 1);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 72affb70e005e17a24e0","\nexport function decoratorFactory(opts: { selector: string }) {\n return function decorator(target) {\n return <any>target;\n };\n}\n\nexport default function def() {}\n\n\n\n// WEBPACK FOOTER //\n// ./src/mod.ts","// This file essentially reproduces an example Angular component to map testing,\n// among other typescript edge cases.\n\nimport def, { decoratorFactory } from './src/mod.ts';\n\nimport * as ns from './src/mod.ts';\n\n@decoratorFactory({\n selector: 'app-root',\n})\nexport class AppComponent {\n title = 'app';\n}\n\nconst fn = arg => {\n console.log(\"here\");\n};\nfn(\"arg\");\n\n// Un-decorated exported classes present a mapping challege because\n// the class name is mapped to an unhelpful export assignment.\nexport class ExportedOther {\n title = 'app';\n}\n\nclass AnotherThing {\n prop = 4;\n}\n\nconst ExpressionClass = class Foo {\n prop = 4;\n};\n\nclass SubDecl extends AnotherThing {\n prop = 4;\n}\n\nlet SubVar = class SubExpr extends AnotherThing {\n prop = 4;\n};\n\nns;\n\nexport default function(){\n // This file is specifically for testing the mappings of classes and things\n // above, which means we don't want to include _other_ references to then.\n // To avoid having them be optimized out, we include a no-op eval.\n eval(\"\");\n\n console.log(\"pause here\");\n}\n\n\n\n// WEBPACK FOOTER //\n// ./input.ts"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/webpack-functions.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/webpack-functions.js
new file mode 100644
index 0000000000..fbfba795dc
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/webpack-functions.js
@@ -0,0 +1,90 @@
+var webpack3WebpackFunctions =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+var module = {};
+
+module.exports = function(x) {
+ return x * 2;
+};
+
+
+function root() {
+ // This example is structures to look like CommonJS in order to replicate
+ // a previously-encountered bug.
+ module.exports(4);
+}
+
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=webpack-functions.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/webpack-functions.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/webpack-functions.js.map
new file mode 100644
index 0000000000..5b31eae43d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/webpack-functions.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3://./webpack-functions/webpack/bootstrap bec9204ab06b585de903","webpack3://./webpack-functions/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;AC7DA;AAAA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA","file":"webpack-functions.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap bec9204ab06b585de903","var module = {};\n\nmodule.exports = function(x) {\n return x * 2;\n};\n\n\nexport default function root() {\n // This example is structures to look like CommonJS in order to replicate\n // a previously-encountered bug.\n module.exports(4);\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./input.js\n// module id = 0\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/webpack-line-mappings.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/webpack-line-mappings.js
new file mode 100644
index 0000000000..4422d837fe
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/webpack-line-mappings.js
@@ -0,0 +1,105 @@
+var webpack3WebpackLineMappings =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+Object.defineProperty(__webpack_exports__, "__esModule", { value: true });
+/* harmony export (immutable) */ __webpack_exports__["default"] = root;
+/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__src_mod1__ = __webpack_require__(1);
+
+
+function root() {
+ let one = 1;
+
+ {
+ const two = 2;
+
+ var fn = function someName(arg) {
+ console.log(this, arguments);
+ console.log("pause here", __WEBPACK_IMPORTED_MODULE_0__src_mod1__["a" /* default */], one, two, fn, arg);
+
+ var inner = (arg) => { var body = "42"; console.log("pause here", body, root); };
+ inner();
+ };
+ fn.call("this-value", "arg-value");
+ }
+}
+
+
+/***/ }),
+/* 1 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+/* harmony default export */ __webpack_exports__["a"] = ("a-default");
+
+
+/***/ })
+/******/ ])["default"];
+//# sourceMappingURL=webpack-line-mappings.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/webpack-line-mappings.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/webpack-line-mappings.js.map
new file mode 100644
index 0000000000..6921c7d031
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack3/webpack-line-mappings.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack3://./webpack-line-mappings/webpack/bootstrap c2d00cfd6674a456a027","webpack3://./webpack-line-mappings/./input.js","webpack3://./webpack-line-mappings/./src/mod1.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAK;AACL;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;AAEA;AACA;;;;;;;;;;;AC7DA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,4BAA4B,iBAAiB,uCAAuC;AACpF;AACA;AACA;AACA;AACA;;;;;;;;ACjBA","file":"webpack-line-mappings.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap c2d00cfd6674a456a027","import aDefault from \"./src/mod1\";\n\nexport default function root() {\n let one = 1;\n\n {\n const two = 2;\n\n var fn = function someName(arg) {\n console.log(this, arguments);\n console.log(\"pause here\", aDefault, one, two, fn, arg);\n\n var inner = (arg) => { var body = \"42\"; console.log(\"pause here\", body, root); };\n inner();\n };\n fn.call(\"this-value\", \"arg-value\");\n }\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./input.js\n// module id = 0\n// module chunks = 0","export default \"a-default\";\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/mod1.js\n// module id = 1\n// module chunks = 0"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/babel-bindings-with-flow.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/babel-bindings-with-flow.js
new file mode 100644
index 0000000000..3e55a5f6da
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/babel-bindings-with-flow.js
@@ -0,0 +1,129 @@
+var webpack4Babel6BabelBindingsWithFlow =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+/* harmony import */ var _src_mod__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/mod */ "./src/mod.js");
+// Webpack doesn't map import declarations well, so doing this forces binding
+// processing to only process the binding being cast when searching for
+// matches. That way we can properly test if the flow cast causes problems.
+
+
+function root() {
+ var value = _src_mod__WEBPACK_IMPORTED_MODULE_0__["aNamed"];
+
+ console.log("pause here", root, value);
+}
+
+/***/ }),
+
+/***/ "./src/mod.js":
+/*!********************!*\
+ !*** ./src/mod.js ***!
+ \********************/
+/*! exports provided: aNamed */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "aNamed", function() { return aNamed; });
+var aNamed = "a-named";
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=babel-bindings-with-flow.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/babel-bindings-with-flow.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/babel-bindings-with-flow.js.map
new file mode 100644
index 0000000000..bc028c783e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/babel-bindings-with-flow.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel6://./babel-bindings-with-flow/webpack/bootstrap","webpack4-babel6://./babel-bindings-with-flow/./input.js","webpack4-babel6://./babel-bindings-with-flow/./src/mod.js"],"names":["root","value","console","log","aNamed"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;AClFA;AAAA;AACA;AACA;AACA;;AAEe,SAASA,IAAT,GAAgB;AAC7B,MAAIC,QAAS,+CAAb;;AAEAC,UAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B,EAAgCC,KAAhC;AACD,C;;;;;;;;;;;;;;ACTM,IAAMG,SAAS,SAAf,C","file":"babel-bindings-with-flow.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","// Webpack doesn't map import declarations well, so doing this forces binding\n// processing to only process the binding being cast when searching for\n// matches. That way we can properly test if the flow cast causes problems.\nimport { aNamed } from \"./src/mod\";\n\nexport default function root() {\n var value = (aNamed: Array<string>);\n\n console.log(\"pause here\", root, value);\n}\n","export const aNamed = \"a-named\";\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/babel-classes.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/babel-classes.js
new file mode 100644
index 0000000000..84a9ce44af
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/babel-classes.js
@@ -0,0 +1,134 @@
+var webpack4Babel6BabelClasses =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function root() {
+ var Another = function () {
+ function Another() {
+ var _this = this;
+
+ _classCallCheck(this, Another);
+
+ this.bound = function () {
+ return _this;
+ };
+ }
+
+ _createClass(Another, [{
+ key: "method",
+ value: function method() {
+ var two = 2;
+
+ console.log("pause here", Another, root);
+ }
+ }]);
+
+ return Another;
+ }();
+
+ new Another().method();
+}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=babel-classes.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/babel-classes.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/babel-classes.js.map
new file mode 100644
index 0000000000..32d7b5872e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/babel-classes.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel6://./babel-classes/webpack/bootstrap","webpack4-babel6://./babel-classes/./input.js"],"names":["root","Another","bound","two","console","log","method"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;;;;;AClFe,SAASA,IAAT,GAAgB;AAAA,MACvBC,OADuB;AAAA;AAAA;;AAAA;;AAAA,WAE3BC,KAF2B,GAEnB,YAAM;AACZ,eAAO,KAAP;AACD,OAJ0B;AAAA;;AAAA;AAAA;AAAA,+BAMlB;AACP,YAAIC,MAAM,CAAV;;AAEAC,gBAAQC,GAAR,CAAY,YAAZ,EAA0BJ,OAA1B,EAAmCD,IAAnC;AACD;AAV0B;;AAAA;AAAA;;AAa7B,MAAIC,OAAJ,GAAcK,MAAd;AACD,C","file":"babel-classes.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","export default function root() {\n class Another {\n bound = () => {\n return this;\n }\n\n method() {\n let two = 2;\n\n console.log(\"pause here\", Another, root);\n }\n }\n\n new Another().method();\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/babel-flowtype-bindings.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/babel-flowtype-bindings.js
new file mode 100644
index 0000000000..4b0428a669
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/babel-flowtype-bindings.js
@@ -0,0 +1,128 @@
+var webpack4Babel6BabelFlowtypeBindings =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+/* harmony import */ var _src_mod__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/mod */ "./src/mod.js");
+
+
+
+var aConst = "a-const";
+
+function root() {
+ console.log("pause here", aConst, _src_mod__WEBPACK_IMPORTED_MODULE_0__["Four"], root);
+}
+
+/***/ }),
+
+/***/ "./src/mod.js":
+/*!********************!*\
+ !*** ./src/mod.js ***!
+ \********************/
+/*! exports provided: default, Four */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Four", function() { return Four; });
+/* harmony default export */ __webpack_exports__["default"] = ("a-default");
+var Four = "one";
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=babel-flowtype-bindings.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/babel-flowtype-bindings.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/babel-flowtype-bindings.js.map
new file mode 100644
index 0000000000..7eee210a14
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/babel-flowtype-bindings.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel6://./babel-flowtype-bindings/webpack/bootstrap","webpack4-babel6://./babel-flowtype-bindings/./input.js","webpack4-babel6://./babel-flowtype-bindings/./src/mod.js"],"names":["aConst","root","console","log","Four"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;;;ACjFA;;AAIA,IAAMA,SAAS,SAAf;;AAEe,SAASC,IAAT,GAAgB;AAC7BC,UAAQC,GAAR,CAAY,YAAZ,EAA0BH,MAA1B,EAAkC,6CAAlC,EAAwCC,IAAxC;AACD,C;;;;;;;;;;;;;;ACTD,+DAAe,WAAf;AACO,IAAMG,OAAO,KAAb,C","file":"babel-flowtype-bindings.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","import type { One, Two, Three } from \"./src/mod\";\nimport { Four, type Five, typeof Six } from \"./src/mod\";\n\ntype Other = {};\n\nconst aConst = \"a-const\";\n\nexport default function root() {\n console.log(\"pause here\", aConst, Four, root);\n}\n","export default \"a-default\";\nexport const Four = \"one\";\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/classes.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/classes.js
new file mode 100644
index 0000000000..e0479677ed
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/classes.js
@@ -0,0 +1,148 @@
+var webpack4Babel6Classes =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function root() {
+ var one = 1;
+
+ var Thing = function () {
+ function Thing() {
+ _classCallCheck(this, Thing);
+ }
+
+ _createClass(Thing, [{
+ key: "one",
+ value: function one() {
+ console.log("pause here");
+ }
+ }]);
+
+ return Thing;
+ }();
+
+ var Another = function () {
+ function Another() {
+ _classCallCheck(this, Another);
+ }
+
+ _createClass(Another, [{
+ key: "method",
+ value: function method() {
+ var two = 2;
+
+ var three = 3;
+
+ console.log("pause here", Another, one, Thing, root);
+ }
+ }]);
+
+ return Another;
+ }();
+
+ new Another().method();
+ new Thing().one();
+}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=classes.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/classes.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/classes.js.map
new file mode 100644
index 0000000000..459fd3205c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/classes.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel6://./classes/webpack/bootstrap","webpack4-babel6://./classes/./input.js"],"names":["root","one","Thing","console","log","Another","two","three","method"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;;;;;AClFe,SAASA,IAAT,GAAgB;AAC7B,MAAIC,MAAM,CAAV;;AAD6B,MAGvBC,KAHuB;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,4BAIrB;AACJC,gBAAQC,GAAR,CAAY,YAAZ;AACD;AAN0B;;AAAA;AAAA;;AAAA,MASvBC,OATuB;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,+BAUlB;AACP,YAAIC,MAAM,CAAV;;AAEA,YAAMC,QAAQ,CAAd;;AAEAJ,gBAAQC,GAAR,CAAY,YAAZ,EAA0BC,OAA1B,EAAmCJ,GAAnC,EAAwCC,KAAxC,EAA+CF,IAA/C;AACD;AAhB0B;;AAAA;AAAA;;AAmB7B,MAAIK,OAAJ,GAAcG,MAAd;AACA,MAAIN,KAAJ,GAAYD,GAAZ;AACD,C","file":"classes.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","export default function root() {\n let one = 1;\n\n class Thing {\n one() {\n console.log(\"pause here\");\n }\n }\n\n class Another {\n method() {\n let two = 2;\n\n const three = 3;\n\n console.log(\"pause here\", Another, one, Thing, root);\n }\n }\n\n new Another().method();\n new Thing().one();\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/esmodules-cjs.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/esmodules-cjs.js
new file mode 100644
index 0000000000..579e8a5650
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/esmodules-cjs.js
@@ -0,0 +1,362 @@
+var webpack4Babel6EsmodulesCjs =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = root;
+exports.example = example;
+
+var _mod = __webpack_require__(/*! ./src/mod1 */ "./src/mod1.js");
+
+var _mod2 = _interopRequireDefault(_mod);
+
+var _mod3 = __webpack_require__(/*! ./src/mod2 */ "./src/mod2.js");
+
+var _mod4 = __webpack_require__(/*! ./src/mod3 */ "./src/mod3.js");
+
+var _mod5 = __webpack_require__(/*! ./src/mod4 */ "./src/mod4.js");
+
+var aNamespace = _interopRequireWildcard(_mod5);
+
+var _mod6 = __webpack_require__(/*! ./src/mod5 */ "./src/mod5.js");
+
+var _mod7 = _interopRequireDefault(_mod6);
+
+var _mod8 = __webpack_require__(/*! ./src/mod6 */ "./src/mod6.js");
+
+var _mod9 = __webpack_require__(/*! ./src/mod7 */ "./src/mod7.js");
+
+var _mod10 = __webpack_require__(/*! ./src/mod9 */ "./src/mod9.js");
+
+var _mod11 = _interopRequireDefault(_mod10);
+
+var _mod12 = __webpack_require__(/*! ./src/mod10 */ "./src/mod10.js");
+
+var _mod13 = __webpack_require__(/*! ./src/mod11 */ "./src/mod11.js");
+
+var _optimizedOut = __webpack_require__(/*! ./src/optimized-out */ "./src/optimized-out.js");
+
+var _optimizedOut2 = _interopRequireDefault(_optimizedOut);
+
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+(0, _optimizedOut2.default)();
+
+function root() {
+ console.log("pause here", root);
+
+ console.log(_mod2.default);
+ console.log(_mod4.original);
+ console.log(_mod3.aNamed);
+ console.log(_mod3.aNamed);
+ console.log(aNamespace);
+
+ try {
+ // None of these are callable in this code, but we still want to make sure
+ // they map properly even if the only reference is in a call expressions.
+ console.log((0, _mod7.default)());
+ console.log((0, _mod9.original)());
+ console.log((0, _mod8.aNamed2)());
+ console.log((0, _mod8.aNamed2)());
+
+ console.log(new _mod11.default());
+ console.log(new _mod13.original());
+ console.log(new _mod12.aNamed3());
+ console.log(new _mod12.aNamed3());
+ } catch (e) {}
+}
+
+function example() {}
+
+/***/ }),
+
+/***/ "./src/mod1.js":
+/*!*********************!*\
+ !*** ./src/mod1.js ***!
+ \*********************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = "a-default";
+
+/***/ }),
+
+/***/ "./src/mod10.js":
+/*!**********************!*\
+ !*** ./src/mod10.js ***!
+ \**********************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+var aNamed3 = exports.aNamed3 = "a-named3";
+
+/***/ }),
+
+/***/ "./src/mod11.js":
+/*!**********************!*\
+ !*** ./src/mod11.js ***!
+ \**********************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+var original = exports.original = "an-original3";
+
+/***/ }),
+
+/***/ "./src/mod2.js":
+/*!*********************!*\
+ !*** ./src/mod2.js ***!
+ \*********************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+var aNamed = exports.aNamed = "a-named";
+
+/***/ }),
+
+/***/ "./src/mod3.js":
+/*!*********************!*\
+ !*** ./src/mod3.js ***!
+ \*********************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+var original = exports.original = "an-original";
+
+/***/ }),
+
+/***/ "./src/mod4.js":
+/*!*********************!*\
+ !*** ./src/mod4.js ***!
+ \*********************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = "a-default";
+var aNamed = exports.aNamed = "a-named";
+
+/***/ }),
+
+/***/ "./src/mod5.js":
+/*!*********************!*\
+ !*** ./src/mod5.js ***!
+ \*********************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = "a-default2";
+
+/***/ }),
+
+/***/ "./src/mod6.js":
+/*!*********************!*\
+ !*** ./src/mod6.js ***!
+ \*********************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+var aNamed2 = exports.aNamed2 = "a-named2";
+
+/***/ }),
+
+/***/ "./src/mod7.js":
+/*!*********************!*\
+ !*** ./src/mod7.js ***!
+ \*********************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+var original = exports.original = "an-original2";
+
+/***/ }),
+
+/***/ "./src/mod9.js":
+/*!*********************!*\
+ !*** ./src/mod9.js ***!
+ \*********************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = "a-default3";
+
+/***/ }),
+
+/***/ "./src/optimized-out.js":
+/*!******************************!*\
+ !*** ./src/optimized-out.js ***!
+ \******************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = optimizedOut;
+function optimizedOut() {}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=esmodules-cjs.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/esmodules-cjs.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/esmodules-cjs.js.map
new file mode 100644
index 0000000000..3633818ebc
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/esmodules-cjs.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel6://./esmodules-cjs/webpack/bootstrap","webpack4-babel6://./esmodules-cjs/./input.js","webpack4-babel6://./esmodules-cjs/./src/mod1.js","webpack4-babel6://./esmodules-cjs/./src/mod10.js","webpack4-babel6://./esmodules-cjs/./src/mod11.js","webpack4-babel6://./esmodules-cjs/./src/mod2.js","webpack4-babel6://./esmodules-cjs/./src/mod3.js","webpack4-babel6://./esmodules-cjs/./src/mod4.js","webpack4-babel6://./esmodules-cjs/./src/mod5.js","webpack4-babel6://./esmodules-cjs/./src/mod6.js","webpack4-babel6://./esmodules-cjs/./src/mod7.js","webpack4-babel6://./esmodules-cjs/./src/mod9.js","webpack4-babel6://./esmodules-cjs/./src/optimized-out.js"],"names":["root","example","aNamespace","console","log","aDefault","anAliased","aNamed","anotherNamed","aDefault3","anAliased3","aNamed3","anotherNamed3","e","original","aNamed2","optimizedOut"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;;;;kBClEwBA,I;QAwBRC,O,GAAAA,O;;AAxChB;;;;AACA;;AACA;;AACA;;IAAYC,U;;AAEZ;;;;AACA;;AACA;;AAEA;;;;AACA;;AACA;;AAEA;;;;;;;;AACA;;AAEe,SAASF,IAAT,GAAgB;AAC7BG,UAAQC,GAAR,CAAY,YAAZ,EAA0BJ,IAA1B;;AAEAG,UAAQC,GAAR,CAAYC,aAAZ;AACAF,UAAQC,GAAR,CAAYE,cAAZ;AACAH,UAAQC,GAAR,CAAYG,YAAZ;AACAJ,UAAQC,GAAR,CAAYI,YAAZ;AACAL,UAAQC,GAAR,CAAYF,UAAZ;;AAEA,MAAI;AACF;AACA;AACAC,YAAQC,GAAR,CAAY,oBAAZ;AACAD,YAAQC,GAAR,CAAY,qBAAZ;AACAD,YAAQC,GAAR,CAAY,oBAAZ;AACAD,YAAQC,GAAR,CAAY,oBAAZ;;AAEAD,YAAQC,GAAR,CAAY,IAAIK,cAAJ,EAAZ;AACAN,YAAQC,GAAR,CAAY,IAAIM,eAAJ,EAAZ;AACAP,YAAQC,GAAR,CAAY,IAAIO,cAAJ,EAAZ;AACAR,YAAQC,GAAR,CAAY,IAAIQ,cAAJ,EAAZ;AACD,GAZD,CAYE,OAAOC,CAAP,EAAU,CAAE;AACf;;AAEM,SAASZ,OAAT,GAAkB,CAAE,C;;;;;;;;;;;;;;;;;kBCxCZ,W;;;;;;;;;;;;;;;;;ACAR,IAAMU,4BAAU,UAAhB,C;;;;;;;;;;;;;;;;;ACAA,IAAMG,8BAAW,cAAjB,C;;;;;;;;;;;;;;;;;ACAA,IAAMP,0BAAS,SAAf,C;;;;;;;;;;;;;;;;;ACAA,IAAMO,8BAAW,aAAjB,C;;;;;;;;;;;;;;;;;kBCAQ,W;AACR,IAAMP,0BAAS,SAAf,C;;;;;;;;;;;;;;;;;kBCDQ,Y;;;;;;;;;;;;;;;;;ACAR,IAAMQ,4BAAU,UAAhB,C;;;;;;;;;;;;;;;;;ACAA,IAAMD,8BAAW,cAAjB,C;;;;;;;;;;;;;;;;;kBCAQ,Y;;;;;;;;;;;;;;;;;kBCASE,Y;AAAT,SAASA,YAAT,GAAwB,CAAE,C","file":"esmodules-cjs.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","import aDefault from \"./src/mod1\";\nimport { aNamed, aNamed as anotherNamed } from \"./src/mod2\";\nimport { original as anAliased } from \"./src/mod3\";\nimport * as aNamespace from \"./src/mod4\";\n\nimport aDefault2 from \"./src/mod5\";\nimport { aNamed2, aNamed2 as anotherNamed2 } from \"./src/mod6\";\nimport { original as anAliased2 } from \"./src/mod7\";\n\nimport aDefault3 from \"./src/mod9\";\nimport { aNamed3, aNamed3 as anotherNamed3 } from \"./src/mod10\";\nimport { original as anAliased3 } from \"./src/mod11\";\n\nimport optimizedOut from \"./src/optimized-out\";\noptimizedOut();\n\nexport default function root() {\n console.log(\"pause here\", root);\n\n console.log(aDefault);\n console.log(anAliased);\n console.log(aNamed);\n console.log(anotherNamed);\n console.log(aNamespace);\n\n try {\n // None of these are callable in this code, but we still want to make sure\n // they map properly even if the only reference is in a call expressions.\n console.log(aDefault2());\n console.log(anAliased2());\n console.log(aNamed2());\n console.log(anotherNamed2());\n\n console.log(new aDefault3());\n console.log(new anAliased3());\n console.log(new aNamed3());\n console.log(new anotherNamed3());\n } catch (e) {}\n}\n\nexport function example(){}\n","export default \"a-default\";\n","export const aNamed3 = \"a-named3\";\n","export const original = \"an-original3\";\n","export const aNamed = \"a-named\";\n","export const original = \"an-original\";\n","export default \"a-default\";\nexport const aNamed = \"a-named\";\n","export default \"a-default2\";\n","export const aNamed2 = \"a-named2\";\n","export const original = \"an-original2\";\n","export default \"a-default3\";\n","export default function optimizedOut() {}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/esmodules-es6.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/esmodules-es6.js
new file mode 100644
index 0000000000..c8a2925fb1
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/esmodules-es6.js
@@ -0,0 +1,309 @@
+var webpack4Babel6EsmodulesEs6 =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default, example */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "example", function() { return example; });
+/* harmony import */ var _src_mod1__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/mod1 */ "./src/mod1.js");
+/* harmony import */ var _src_mod2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./src/mod2 */ "./src/mod2.js");
+/* harmony import */ var _src_mod3__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./src/mod3 */ "./src/mod3.js");
+/* harmony import */ var _src_mod4__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./src/mod4 */ "./src/mod4.js");
+/* harmony import */ var _src_mod5__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./src/mod5 */ "./src/mod5.js");
+/* harmony import */ var _src_mod6__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./src/mod6 */ "./src/mod6.js");
+/* harmony import */ var _src_mod7__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./src/mod7 */ "./src/mod7.js");
+/* harmony import */ var _src_mod9__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./src/mod9 */ "./src/mod9.js");
+/* harmony import */ var _src_mod10__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./src/mod10 */ "./src/mod10.js");
+/* harmony import */ var _src_mod11__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./src/mod11 */ "./src/mod11.js");
+/* harmony import */ var _src_optimized_out__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./src/optimized-out */ "./src/optimized-out.js");
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Object(_src_optimized_out__WEBPACK_IMPORTED_MODULE_10__["default"])();
+
+function root() {
+ console.log("pause here", root);
+
+ console.log(_src_mod1__WEBPACK_IMPORTED_MODULE_0__["default"]);
+ console.log(_src_mod3__WEBPACK_IMPORTED_MODULE_2__["original"]);
+ console.log(_src_mod2__WEBPACK_IMPORTED_MODULE_1__["aNamed"]);
+ console.log(_src_mod2__WEBPACK_IMPORTED_MODULE_1__["aNamed"]);
+ console.log(_src_mod4__WEBPACK_IMPORTED_MODULE_3__);
+
+ try {
+ // None of these are callable in this code, but we still want to make sure
+ // they map properly even if the only reference is in a call expressions.
+ console.log(Object(_src_mod5__WEBPACK_IMPORTED_MODULE_4__["default"])());
+ console.log(Object(_src_mod7__WEBPACK_IMPORTED_MODULE_6__["original"])());
+ console.log(Object(_src_mod6__WEBPACK_IMPORTED_MODULE_5__["aNamed2"])());
+ console.log(Object(_src_mod6__WEBPACK_IMPORTED_MODULE_5__["aNamed2"])());
+
+ console.log(new _src_mod9__WEBPACK_IMPORTED_MODULE_7__["default"]());
+ console.log(new _src_mod11__WEBPACK_IMPORTED_MODULE_9__["original"]());
+ console.log(new _src_mod10__WEBPACK_IMPORTED_MODULE_8__["aNamed3"]());
+ console.log(new _src_mod10__WEBPACK_IMPORTED_MODULE_8__["aNamed3"]());
+ } catch (e) {}
+}
+
+function example() {}
+
+/***/ }),
+
+/***/ "./src/mod1.js":
+/*!*********************!*\
+ !*** ./src/mod1.js ***!
+ \*********************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = ("a-default");
+
+/***/ }),
+
+/***/ "./src/mod10.js":
+/*!**********************!*\
+ !*** ./src/mod10.js ***!
+ \**********************/
+/*! exports provided: aNamed3 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "aNamed3", function() { return aNamed3; });
+const aNamed3 = "a-named3";
+
+/***/ }),
+
+/***/ "./src/mod11.js":
+/*!**********************!*\
+ !*** ./src/mod11.js ***!
+ \**********************/
+/*! exports provided: original */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "original", function() { return original; });
+const original = "an-original3";
+
+/***/ }),
+
+/***/ "./src/mod2.js":
+/*!*********************!*\
+ !*** ./src/mod2.js ***!
+ \*********************/
+/*! exports provided: aNamed */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "aNamed", function() { return aNamed; });
+const aNamed = "a-named";
+
+/***/ }),
+
+/***/ "./src/mod3.js":
+/*!*********************!*\
+ !*** ./src/mod3.js ***!
+ \*********************/
+/*! exports provided: original */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "original", function() { return original; });
+const original = "an-original";
+
+/***/ }),
+
+/***/ "./src/mod4.js":
+/*!*********************!*\
+ !*** ./src/mod4.js ***!
+ \*********************/
+/*! exports provided: default, aNamed */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "aNamed", function() { return aNamed; });
+/* harmony default export */ __webpack_exports__["default"] = ("a-default");
+const aNamed = "a-named";
+
+/***/ }),
+
+/***/ "./src/mod5.js":
+/*!*********************!*\
+ !*** ./src/mod5.js ***!
+ \*********************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = ("a-default2");
+
+/***/ }),
+
+/***/ "./src/mod6.js":
+/*!*********************!*\
+ !*** ./src/mod6.js ***!
+ \*********************/
+/*! exports provided: aNamed2 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "aNamed2", function() { return aNamed2; });
+const aNamed2 = "a-named2";
+
+/***/ }),
+
+/***/ "./src/mod7.js":
+/*!*********************!*\
+ !*** ./src/mod7.js ***!
+ \*********************/
+/*! exports provided: original */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "original", function() { return original; });
+const original = "an-original2";
+
+/***/ }),
+
+/***/ "./src/mod9.js":
+/*!*********************!*\
+ !*** ./src/mod9.js ***!
+ \*********************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = ("a-default3");
+
+/***/ }),
+
+/***/ "./src/optimized-out.js":
+/*!******************************!*\
+ !*** ./src/optimized-out.js ***!
+ \******************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return optimizedOut; });
+function optimizedOut() {}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=esmodules-es6.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/esmodules-es6.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/esmodules-es6.js.map
new file mode 100644
index 0000000000..3b73db2cf8
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/esmodules-es6.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel6://./esmodules-es6/webpack/bootstrap","webpack4-babel6://./esmodules-es6/./input.js","webpack4-babel6://./esmodules-es6/./src/mod1.js","webpack4-babel6://./esmodules-es6/./src/mod10.js","webpack4-babel6://./esmodules-es6/./src/mod11.js","webpack4-babel6://./esmodules-es6/./src/mod2.js","webpack4-babel6://./esmodules-es6/./src/mod3.js","webpack4-babel6://./esmodules-es6/./src/mod4.js","webpack4-babel6://./esmodules-es6/./src/mod5.js","webpack4-babel6://./esmodules-es6/./src/mod6.js","webpack4-babel6://./esmodules-es6/./src/mod7.js","webpack4-babel6://./esmodules-es6/./src/mod9.js","webpack4-babel6://./esmodules-es6/./src/optimized-out.js"],"names":["optimizedOut","root","console","log","aDefault2","anAliased2","aNamed2","anotherNamed2","e","example","aNamed3","original","aNamed"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;AClFA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,mEAAAA;;AAEe,SAASC,IAAT,GAAgB;AAC7BC,UAAQC,GAAR,CAAY,YAAZ,EAA0BF,IAA1B;;AAEAC,UAAQC,GAAR,CAAY,iDAAZ;AACAD,UAAQC,GAAR,CAAY,kDAAZ;AACAD,UAAQC,GAAR,CAAY,gDAAZ;AACAD,UAAQC,GAAR,CAAY,gDAAZ;AACAD,UAAQC,GAAR,CAAY,sCAAZ;;AAEA,MAAI;AACF;AACA;AACAD,YAAQC,GAAR,CAAY,yDAAAC,EAAZ;AACAF,YAAQC,GAAR,CAAY,0DAAAE,EAAZ;AACAH,YAAQC,GAAR,CAAY,yDAAAG,EAAZ;AACAJ,YAAQC,GAAR,CAAY,yDAAAI,EAAZ;;AAEAL,YAAQC,GAAR,CAAY,IAAI,iDAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,mDAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,kDAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,kDAAJ,EAAZ;AACD,GAZD,CAYE,OAAOK,CAAP,EAAU,CAAE;AACf;;AAEM,SAASC,OAAT,GAAkB,CAAE,C;;;;;;;;;;;;;ACxC3B,+DAAe,WAAf,E;;;;;;;;;;;;;;ACAO,MAAMC,UAAU,UAAhB,C;;;;;;;;;;;;;;ACAA,MAAMC,WAAW,cAAjB,C;;;;;;;;;;;;;;ACAA,MAAMC,SAAS,SAAf,C;;;;;;;;;;;;;;ACAA,MAAMD,WAAW,aAAjB,C;;;;;;;;;;;;;;ACAP,+DAAe,WAAf;AACO,MAAMC,SAAS,SAAf,C;;;;;;;;;;;;;ACDP,+DAAe,YAAf,E;;;;;;;;;;;;;;ACAO,MAAMN,UAAU,UAAhB,C;;;;;;;;;;;;;;ACAA,MAAMK,WAAW,cAAjB,C;;;;;;;;;;;;;ACAP,+DAAe,YAAf,E;;;;;;;;;;;;;;ACAe,SAASX,YAAT,GAAwB,CAAE,C","file":"esmodules-es6.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","import aDefault from \"./src/mod1\";\nimport { aNamed, aNamed as anotherNamed } from \"./src/mod2\";\nimport { original as anAliased } from \"./src/mod3\";\nimport * as aNamespace from \"./src/mod4\";\n\nimport aDefault2 from \"./src/mod5\";\nimport { aNamed2, aNamed2 as anotherNamed2 } from \"./src/mod6\";\nimport { original as anAliased2 } from \"./src/mod7\";\n\nimport aDefault3 from \"./src/mod9\";\nimport { aNamed3, aNamed3 as anotherNamed3 } from \"./src/mod10\";\nimport { original as anAliased3 } from \"./src/mod11\";\n\nimport optimizedOut from \"./src/optimized-out\";\noptimizedOut();\n\nexport default function root() {\n console.log(\"pause here\", root);\n\n console.log(aDefault);\n console.log(anAliased);\n console.log(aNamed);\n console.log(anotherNamed);\n console.log(aNamespace);\n\n try {\n // None of these are callable in this code, but we still want to make sure\n // they map properly even if the only reference is in a call expressions.\n console.log(aDefault2());\n console.log(anAliased2());\n console.log(aNamed2());\n console.log(anotherNamed2());\n\n console.log(new aDefault3());\n console.log(new anAliased3());\n console.log(new aNamed3());\n console.log(new anotherNamed3());\n } catch (e) {}\n}\n\nexport function example(){}\n","export default \"a-default\";\n","export const aNamed3 = \"a-named3\";\n","export const original = \"an-original3\";\n","export const aNamed = \"a-named\";\n","export const original = \"an-original\";\n","export default \"a-default\";\nexport const aNamed = \"a-named\";\n","export default \"a-default2\";\n","export const aNamed2 = \"a-named2\";\n","export const original = \"an-original2\";\n","export default \"a-default3\";\n","export default function optimizedOut() {}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/esmodules.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/esmodules.js
new file mode 100644
index 0000000000..a52af796b4
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/esmodules.js
@@ -0,0 +1,309 @@
+var webpack4Babel6Esmodules =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default, example */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "example", function() { return example; });
+/* harmony import */ var _src_mod1__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/mod1 */ "./src/mod1.js");
+/* harmony import */ var _src_mod2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./src/mod2 */ "./src/mod2.js");
+/* harmony import */ var _src_mod3__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./src/mod3 */ "./src/mod3.js");
+/* harmony import */ var _src_mod4__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./src/mod4 */ "./src/mod4.js");
+/* harmony import */ var _src_mod5__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./src/mod5 */ "./src/mod5.js");
+/* harmony import */ var _src_mod6__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./src/mod6 */ "./src/mod6.js");
+/* harmony import */ var _src_mod7__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./src/mod7 */ "./src/mod7.js");
+/* harmony import */ var _src_mod9__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./src/mod9 */ "./src/mod9.js");
+/* harmony import */ var _src_mod10__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./src/mod10 */ "./src/mod10.js");
+/* harmony import */ var _src_mod11__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./src/mod11 */ "./src/mod11.js");
+/* harmony import */ var _src_optimized_out__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./src/optimized-out */ "./src/optimized-out.js");
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Object(_src_optimized_out__WEBPACK_IMPORTED_MODULE_10__["default"])();
+
+function root() {
+ console.log("pause here", root);
+
+ console.log(_src_mod1__WEBPACK_IMPORTED_MODULE_0__["default"]);
+ console.log(_src_mod3__WEBPACK_IMPORTED_MODULE_2__["original"]);
+ console.log(_src_mod2__WEBPACK_IMPORTED_MODULE_1__["aNamed"]);
+ console.log(_src_mod2__WEBPACK_IMPORTED_MODULE_1__["aNamed"]);
+ console.log(_src_mod4__WEBPACK_IMPORTED_MODULE_3__);
+
+ try {
+ // None of these are callable in this code, but we still want to make sure
+ // they map properly even if the only reference is in a call expressions.
+ console.log(Object(_src_mod5__WEBPACK_IMPORTED_MODULE_4__["default"])());
+ console.log(Object(_src_mod7__WEBPACK_IMPORTED_MODULE_6__["original"])());
+ console.log(Object(_src_mod6__WEBPACK_IMPORTED_MODULE_5__["aNamed2"])());
+ console.log(Object(_src_mod6__WEBPACK_IMPORTED_MODULE_5__["aNamed2"])());
+
+ console.log(new _src_mod9__WEBPACK_IMPORTED_MODULE_7__["default"]());
+ console.log(new _src_mod11__WEBPACK_IMPORTED_MODULE_9__["original"]());
+ console.log(new _src_mod10__WEBPACK_IMPORTED_MODULE_8__["aNamed3"]());
+ console.log(new _src_mod10__WEBPACK_IMPORTED_MODULE_8__["aNamed3"]());
+ } catch (e) {}
+}
+
+function example() {}
+
+/***/ }),
+
+/***/ "./src/mod1.js":
+/*!*********************!*\
+ !*** ./src/mod1.js ***!
+ \*********************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = ("a-default");
+
+/***/ }),
+
+/***/ "./src/mod10.js":
+/*!**********************!*\
+ !*** ./src/mod10.js ***!
+ \**********************/
+/*! exports provided: aNamed3 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "aNamed3", function() { return aNamed3; });
+var aNamed3 = "a-named3";
+
+/***/ }),
+
+/***/ "./src/mod11.js":
+/*!**********************!*\
+ !*** ./src/mod11.js ***!
+ \**********************/
+/*! exports provided: original */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "original", function() { return original; });
+var original = "an-original3";
+
+/***/ }),
+
+/***/ "./src/mod2.js":
+/*!*********************!*\
+ !*** ./src/mod2.js ***!
+ \*********************/
+/*! exports provided: aNamed */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "aNamed", function() { return aNamed; });
+var aNamed = "a-named";
+
+/***/ }),
+
+/***/ "./src/mod3.js":
+/*!*********************!*\
+ !*** ./src/mod3.js ***!
+ \*********************/
+/*! exports provided: original */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "original", function() { return original; });
+var original = "an-original";
+
+/***/ }),
+
+/***/ "./src/mod4.js":
+/*!*********************!*\
+ !*** ./src/mod4.js ***!
+ \*********************/
+/*! exports provided: default, aNamed */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "aNamed", function() { return aNamed; });
+/* harmony default export */ __webpack_exports__["default"] = ("a-default");
+var aNamed = "a-named";
+
+/***/ }),
+
+/***/ "./src/mod5.js":
+/*!*********************!*\
+ !*** ./src/mod5.js ***!
+ \*********************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = ("a-default2");
+
+/***/ }),
+
+/***/ "./src/mod6.js":
+/*!*********************!*\
+ !*** ./src/mod6.js ***!
+ \*********************/
+/*! exports provided: aNamed2 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "aNamed2", function() { return aNamed2; });
+var aNamed2 = "a-named2";
+
+/***/ }),
+
+/***/ "./src/mod7.js":
+/*!*********************!*\
+ !*** ./src/mod7.js ***!
+ \*********************/
+/*! exports provided: original */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "original", function() { return original; });
+var original = "an-original2";
+
+/***/ }),
+
+/***/ "./src/mod9.js":
+/*!*********************!*\
+ !*** ./src/mod9.js ***!
+ \*********************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = ("a-default3");
+
+/***/ }),
+
+/***/ "./src/optimized-out.js":
+/*!******************************!*\
+ !*** ./src/optimized-out.js ***!
+ \******************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return optimizedOut; });
+function optimizedOut() {}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=esmodules.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/esmodules.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/esmodules.js.map
new file mode 100644
index 0000000000..027d3789b4
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/esmodules.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel6://./esmodules/webpack/bootstrap","webpack4-babel6://./esmodules/./input.js","webpack4-babel6://./esmodules/./src/mod1.js","webpack4-babel6://./esmodules/./src/mod10.js","webpack4-babel6://./esmodules/./src/mod11.js","webpack4-babel6://./esmodules/./src/mod2.js","webpack4-babel6://./esmodules/./src/mod3.js","webpack4-babel6://./esmodules/./src/mod4.js","webpack4-babel6://./esmodules/./src/mod5.js","webpack4-babel6://./esmodules/./src/mod6.js","webpack4-babel6://./esmodules/./src/mod7.js","webpack4-babel6://./esmodules/./src/mod9.js","webpack4-babel6://./esmodules/./src/optimized-out.js"],"names":["optimizedOut","root","console","log","aDefault2","anAliased2","aNamed2","anotherNamed2","e","example","aNamed3","original","aNamed"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;AClFA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA,mEAAAA;;AAEe,SAASC,IAAT,GAAgB;AAC7BC,UAAQC,GAAR,CAAY,YAAZ,EAA0BF,IAA1B;;AAEAC,UAAQC,GAAR,CAAY,iDAAZ;AACAD,UAAQC,GAAR,CAAY,kDAAZ;AACAD,UAAQC,GAAR,CAAY,gDAAZ;AACAD,UAAQC,GAAR,CAAY,gDAAZ;AACAD,UAAQC,GAAR,CAAY,sCAAZ;;AAEA,MAAI;AACF;AACA;AACAD,YAAQC,GAAR,CAAY,yDAAAC,EAAZ;AACAF,YAAQC,GAAR,CAAY,0DAAAE,EAAZ;AACAH,YAAQC,GAAR,CAAY,yDAAAG,EAAZ;AACAJ,YAAQC,GAAR,CAAY,yDAAAI,EAAZ;;AAEAL,YAAQC,GAAR,CAAY,IAAI,iDAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,mDAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,kDAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,kDAAJ,EAAZ;AACD,GAZD,CAYE,OAAOK,CAAP,EAAU,CAAE;AACf;;AAEM,SAASC,OAAT,GAAkB,CAAE,C;;;;;;;;;;;;;ACxC3B,+DAAe,WAAf,E;;;;;;;;;;;;;;ACAO,IAAMC,UAAU,UAAhB,C;;;;;;;;;;;;;;ACAA,IAAMC,WAAW,cAAjB,C;;;;;;;;;;;;;;ACAA,IAAMC,SAAS,SAAf,C;;;;;;;;;;;;;;ACAA,IAAMD,WAAW,aAAjB,C;;;;;;;;;;;;;;ACAP,+DAAe,WAAf;AACO,IAAMC,SAAS,SAAf,C;;;;;;;;;;;;;ACDP,+DAAe,YAAf,E;;;;;;;;;;;;;;ACAO,IAAMN,UAAU,UAAhB,C;;;;;;;;;;;;;;ACAA,IAAMK,WAAW,cAAjB,C;;;;;;;;;;;;;ACAP,+DAAe,YAAf,E;;;;;;;;;;;;;;ACAe,SAASX,YAAT,GAAwB,CAAE,C","file":"esmodules.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","import aDefault from \"./src/mod1\";\nimport { aNamed, aNamed as anotherNamed } from \"./src/mod2\";\nimport { original as anAliased } from \"./src/mod3\";\nimport * as aNamespace from \"./src/mod4\";\n\nimport aDefault2 from \"./src/mod5\";\nimport { aNamed2, aNamed2 as anotherNamed2 } from \"./src/mod6\";\nimport { original as anAliased2 } from \"./src/mod7\";\n\nimport aDefault3 from \"./src/mod9\";\nimport { aNamed3, aNamed3 as anotherNamed3 } from \"./src/mod10\";\nimport { original as anAliased3 } from \"./src/mod11\";\n\nimport optimizedOut from \"./src/optimized-out\";\noptimizedOut();\n\nexport default function root() {\n console.log(\"pause here\", root);\n\n console.log(aDefault);\n console.log(anAliased);\n console.log(aNamed);\n console.log(anotherNamed);\n console.log(aNamespace);\n\n try {\n // None of these are callable in this code, but we still want to make sure\n // they map properly even if the only reference is in a call expressions.\n console.log(aDefault2());\n console.log(anAliased2());\n console.log(aNamed2());\n console.log(anotherNamed2());\n\n console.log(new aDefault3());\n console.log(new anAliased3());\n console.log(new aNamed3());\n console.log(new anotherNamed3());\n } catch (e) {}\n}\n\nexport function example(){}\n","export default \"a-default\";\n","export const aNamed3 = \"a-named3\";\n","export const original = \"an-original3\";\n","export const aNamed = \"a-named\";\n","export const original = \"an-original\";\n","export default \"a-default\";\nexport const aNamed = \"a-named\";\n","export default \"a-default2\";\n","export const aNamed2 = \"a-named2\";\n","export const original = \"an-original2\";\n","export default \"a-default3\";\n","export default function optimizedOut() {}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/eval-maps.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/eval-maps.js
new file mode 100644
index 0000000000..f78ada9483
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/eval-maps.js
@@ -0,0 +1,120 @@
+var webpack4Babel6EvalMaps =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+
+function root() {
+ var one = 1;
+ var two = 2;
+ var three = 3;
+
+ one;
+ two;
+
+ {
+ var _two = 4;
+ var _three = 5;
+
+ console.log("pause here", one, _two, _three);
+ }
+}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=eval-maps.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/eval-maps.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/eval-maps.js.map
new file mode 100644
index 0000000000..5598105cd5
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/eval-maps.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel6://./eval-maps/webpack/bootstrap","webpack4-babel6://./eval-maps/./input.js"],"names":["root","one","two","three","console","log"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;;ACjFe,SAASA,IAAT,GAAgB;AAC7B,MAAIC,MAAM,CAAV;AACA,MAAIC,MAAM,CAAV;AACA,MAAMC,QAAQ,CAAd;;AAEAF;AACAC;;AAEA;AACE,QAAIA,OAAM,CAAV;AACA,QAAMC,SAAQ,CAAd;;AAEAC,YAAQC,GAAR,CAAY,YAAZ,EAA0BJ,GAA1B,EAA+BC,IAA/B,EAAoCC,MAApC;AACD;AACF,C","file":"eval-maps.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","\nexport default function root() {\n var one = 1;\n let two = 2;\n const three = 3;\n\n one;\n two;\n\n {\n let two = 4;\n const three = 5;\n\n console.log(\"pause here\", one, two, three);\n }\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/for-loops.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/for-loops.js
new file mode 100644
index 0000000000..aa8fa566a0
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/for-loops.js
@@ -0,0 +1,121 @@
+var webpack4Babel6ForLoops =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+function root() {
+ var i = 0;
+
+ for (var _i = 1; _i < 2; _i++) {
+ console.log("pause here", root);
+ }
+
+ for (var _i2 in { 2: "" }) {
+ console.log("pause here", root);
+ }
+
+ var _arr = [3];
+ for (var _i4 = 0; _i4 < _arr.length; _i4++) {
+ var _i3 = _arr[_i4];
+ console.log("pause here", root);
+ }
+}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=for-loops.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/for-loops.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/for-loops.js.map
new file mode 100644
index 0000000000..10e5e0b391
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/for-loops.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel6://./for-loops/webpack/bootstrap","webpack4-babel6://./for-loops/./input.js"],"names":["root","i","console","log"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;AClFe,SAASA,IAAT,GAAgB;AAC7B,MAAIC,IAAI,CAAR;;AAEA,OAAK,IAAIA,KAAI,CAAb,EAAgBA,KAAI,CAApB,EAAuBA,IAAvB,EAA4B;AAC1BC,YAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B;AACD;;AAED,OAAK,IAAIC,GAAT,IAAc,EAAE,GAAG,EAAL,EAAd,EAAyB;AACvBC,YAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B;AACD;;AAT4B,aAWf,CAAC,CAAD,CAXe;AAW7B,8CAAmB;AAAd,QAAIC,eAAJ;AACHC,YAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B;AACD;AACF,C","file":"for-loops.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","export default function root() {\n let i = 0;\n\n for (let i = 1; i < 2; i++) {\n console.log(\"pause here\", root);\n }\n\n for (let i in { 2: \"\" }) {\n console.log(\"pause here\", root);\n }\n\n for (let i of [3]) {\n console.log(\"pause here\", root);\n }\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/for-of.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/for-of.js
new file mode 100644
index 0000000000..f806038091
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/for-of.js
@@ -0,0 +1,119 @@
+var webpack4Babel6ForOf =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return forOf; });
+var mod = "module scoped";
+
+function forOf() {
+ var _arr = [1];
+
+ for (var _i = 0; _i < _arr.length; _i++) {
+ var x = _arr[_i];
+ doThing(x);
+ }
+
+ function doThing(arg) {
+ // Avoid optimize out
+ window.console;
+ }
+}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=for-of.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/for-of.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/for-of.js.map
new file mode 100644
index 0000000000..338d33ab9c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/for-of.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel6://./for-of/webpack/bootstrap","webpack4-babel6://./for-of/./input.js"],"names":["mod","forOf","x","doThing","arg","window","console"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;AClFA;AAAA,IAAMA,MAAM,eAAZ;;AAEe,SAASC,KAAT,GAAiB;AAAA,aACd,CAAC,CAAD,CADc;;AAC9B,2CAAqB;AAAhB,QAAMC,YAAN;AACHC,YAAQD,CAAR;AACD;;AAED,WAASC,OAAT,CAAiBC,GAAjB,EAAsB;AACpB;AACAC,WAAOC,OAAP;AACD;AACF,C","file":"for-of.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","const mod = \"module scoped\";\n\nexport default function forOf() {\n for (const x of [1]) {\n doThing(x);\n }\n\n function doThing(arg) {\n // Avoid optimize out\n window.console;\n }\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/functions.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/functions.js
new file mode 100644
index 0000000000..c6291eae36
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/functions.js
@@ -0,0 +1,118 @@
+var webpack4Babel6Functions =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+function root() {
+
+ function decl(p1) {
+ var inner = function inner(p2) {
+ var arrow = function arrow(p3) {
+ console.log("pause here", p3, arrow, p2, inner, p1, decl, root);
+ };
+ arrow();
+ };
+ inner();
+ }
+
+ decl();
+}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=functions.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/functions.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/functions.js.map
new file mode 100644
index 0000000000..04cf0bfc55
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/functions.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel6://./functions/webpack/bootstrap","webpack4-babel6://./functions/./input.js"],"names":["root","decl","p1","inner","p2","arrow","p3","console","log"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;AClFe,SAASA,IAAT,GAAgB;;AAE7B,WAASC,IAAT,CAAcC,EAAd,EAAkB;AAChB,QAAMC,QAAQ,SAASA,KAAT,CAAeC,EAAf,EAAmB;AAC/B,UAAMC,QAAQ,SAARA,KAAQ,CAACC,EAAD,EAAQ;AACpBC,gBAAQC,GAAR,CAAY,YAAZ,EAA0BF,EAA1B,EAA8BD,KAA9B,EAAqCD,EAArC,EAAyCD,KAAzC,EAAgDD,EAAhD,EAAoDD,IAApD,EAA0DD,IAA1D;AACD,OAFD;AAGAK;AACD,KALD;AAMAF;AACD;;AAEDF;AACD,C","file":"functions.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","export default function root() {\n\n function decl(p1) {\n const inner = function inner(p2) {\n const arrow = (p3) => {\n console.log(\"pause here\", p3, arrow, p2, inner, p1, decl, root);\n };\n arrow();\n };\n inner();\n }\n\n decl();\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/lex-and-nonlex.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/lex-and-nonlex.js
new file mode 100644
index 0000000000..8ef6703360
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/lex-and-nonlex.js
@@ -0,0 +1,117 @@
+var webpack4Babel6LexAndNonlex =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function root() {
+ function someHelper() {
+ console.log("pause here", root, Thing);
+ }
+
+ var Thing = function Thing() {
+ _classCallCheck(this, Thing);
+ };
+
+ someHelper();
+}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=lex-and-nonlex.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/lex-and-nonlex.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/lex-and-nonlex.js.map
new file mode 100644
index 0000000000..175c420321
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/lex-and-nonlex.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel6://./lex-and-nonlex/webpack/bootstrap","webpack4-babel6://./lex-and-nonlex/./input.js"],"names":["root","someHelper","console","log","Thing"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;;;AClFe,SAASA,IAAT,GAAgB;AAC7B,WAASC,UAAT,GAAqB;AACnBC,YAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B,EAAgCI,KAAhC;AACD;;AAH4B,MAKvBA,KALuB;AAAA;AAAA;;AAO7BH;AACD,C","file":"lex-and-nonlex.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","export default function root() {\n function someHelper(){\n console.log(\"pause here\", root, Thing);\n }\n\n class Thing {}\n\n someHelper();\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/line-start-bindings-es6.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/line-start-bindings-es6.js
new file mode 100644
index 0000000000..4fa7a8a348
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/line-start-bindings-es6.js
@@ -0,0 +1,127 @@
+var webpack4Babel6LineStartBindingsEs6 =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+
+function root() {
+ function aFunc() {
+ // Since these bindings are on their own linem, the mappings will
+ // extend to the start of the line, rather than starting at the first
+ // character of the binding.
+ const {
+ one,
+ two
+ } = {
+ one: 1,
+ two: 2
+ };
+
+ // The 'this' binding here is also its own line, so the comment above
+ // applies here too.
+ this.thing = 4;
+
+ console.log("pause here", root);
+ }
+
+ aFunc.call({});
+}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=line-start-bindings-es6.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/line-start-bindings-es6.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/line-start-bindings-es6.js.map
new file mode 100644
index 0000000000..b565398309
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/line-start-bindings-es6.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel6://./line-start-bindings-es6/webpack/bootstrap","webpack4-babel6://./line-start-bindings-es6/./input.js"],"names":["root","aFunc","one","two","thing","console","log","call"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;;ACjFe,SAASA,IAAT,GAAgB;AAC7B,WAASC,KAAT,GAAgB;AACd;AACA;AACA;AACA,UAAM;AACJC,SADI;AAEJC;AAFI,QAGF;AACFD,WAAK,CADH;AAEFC,WAAK;AAFH,KAHJ;;AAQA;AACA;AACA,SAAKC,KAAL,GAAa,CAAb;;AAEAC,YAAQC,GAAR,CAAY,YAAZ,EAA0BN,IAA1B;AACD;;AAEDC,QAAMM,IAAN,CAAW,EAAX;AACD,C","file":"line-start-bindings-es6.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","\nexport default function root() {\n function aFunc(){\n // Since these bindings are on their own linem, the mappings will\n // extend to the start of the line, rather than starting at the first\n // character of the binding.\n const {\n one,\n two\n } = {\n one: 1,\n two: 2,\n };\n\n // The 'this' binding here is also its own line, so the comment above\n // applies here too.\n this.thing = 4;\n\n console.log(\"pause here\", root);\n }\n\n aFunc.call({ });\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/modules-cjs.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/modules-cjs.js
new file mode 100644
index 0000000000..3d3624c1de
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/modules-cjs.js
@@ -0,0 +1,112 @@
+var webpack4Babel6ModulesCjs =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var moduleScoped = 1;
+var alsoModuleScoped = 2;
+
+function thirdModuleScoped() {}
+
+exports.default = function () {
+ console.log("pause here", moduleScoped, alsoModuleScoped, thirdModuleScoped);
+};
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=modules-cjs.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/modules-cjs.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/modules-cjs.js.map
new file mode 100644
index 0000000000..bcd8156954
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/modules-cjs.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel6://./modules-cjs/webpack/bootstrap","webpack4-babel6://./modules-cjs/./input.js"],"names":["moduleScoped","alsoModuleScoped","thirdModuleScoped","exports","default","console","log"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;AClFA,IAAIA,eAAe,CAAnB;AACA,IAAIC,mBAAmB,CAAvB;;AAEA,SAASC,iBAAT,GAA6B,CAAE;;AAE/BC,QAAQC,OAAR,GAAkB,YAAW;AAC3BC,UAAQC,GAAR,CAAY,YAAZ,EAA0BN,YAA1B,EAAwCC,gBAAxC,EAA0DC,iBAA1D;AACD,CAFD,C","file":"modules-cjs.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","var moduleScoped = 1;\nlet alsoModuleScoped = 2;\n\nfunction thirdModuleScoped() {}\n\nexports.default = function() {\n console.log(\"pause here\", moduleScoped, alsoModuleScoped, thirdModuleScoped);\n};\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/out-of-order-declarations-cjs.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/out-of-order-declarations-cjs.js
new file mode 100644
index 0000000000..69354b7da7
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/out-of-order-declarations-cjs.js
@@ -0,0 +1,147 @@
+var webpack4Babel6OutOfOrderDeclarationsCjs =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = root;
+
+var _mod = __webpack_require__(/*! ./src/mod */ "./src/mod.js");
+
+var _mod2 = _interopRequireDefault(_mod);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var val = "outer-value";
+
+function root() {
+ var val = "middle-value";
+ var fn = function outerFn(outer) {};
+
+ function callback() {
+ console.log("pause here", val, _mod2.default, fn);
+
+ var val = "inner-value";
+ function fn(inner) {};
+ }
+
+ callback();
+}
+
+/***/ }),
+
+/***/ "./src/mod.js":
+/*!********************!*\
+ !*** ./src/mod.js ***!
+ \********************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = "a-default";
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=out-of-order-declarations-cjs.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/out-of-order-declarations-cjs.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/out-of-order-declarations-cjs.js.map
new file mode 100644
index 0000000000..200e61cd57
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/out-of-order-declarations-cjs.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel6://./out-of-order-declarations-cjs/webpack/bootstrap","webpack4-babel6://./out-of-order-declarations-cjs/./input.js","webpack4-babel6://./out-of-order-declarations-cjs/./src/mod.js"],"names":["root","val","fn","outerFn","outer","callback","console","log","aDefault","inner"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;;;;kBChFwBA,I;;AAcxB;;;;;;AAhBA,IAAIC,MAAM,aAAV;;AAEe,SAASD,IAAT,GAAgB;AAC7B,MAAIC,MAAM,cAAV;AACA,MAAIC,KAAK,SAASC,OAAT,CAAiBC,KAAjB,EAAuB,CAAE,CAAlC;;AAEA,WAASC,QAAT,GAAoB;AAClBC,YAAQC,GAAR,CAAY,YAAZ,EAA0BN,GAA1B,EAA+BO,aAA/B,EAAyCN,EAAzC;;AAEA,QAAID,MAAM,aAAV;AACA,aAASC,EAAT,CAAYO,KAAZ,EAAkB,CAAE;AACrB;;AAEDJ;AACD,C;;;;;;;;;;;;;;;;;kBCdc,W","file":"out-of-order-declarations-cjs.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","var val = \"outer-value\";\n\nexport default function root() {\n var val = \"middle-value\";\n var fn = function outerFn(outer){};\n\n function callback() {\n console.log(\"pause here\", val, aDefault, fn);\n\n var val = \"inner-value\";\n function fn(inner){};\n }\n\n callback();\n}\n\nimport aDefault from \"./src/mod\";\n","export default \"a-default\";\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/shadowed-vars.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/shadowed-vars.js
new file mode 100644
index 0000000000..50acc737c4
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/shadowed-vars.js
@@ -0,0 +1,129 @@
+var webpack4Babel6ShadowedVars =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+/* harmony default export */ __webpack_exports__["default"] = (function () {
+ var aVar = "var1";
+ var aLet = "let1";
+ var aConst = "const1";
+
+ var Outer = function Outer() {
+ _classCallCheck(this, Outer);
+ };
+
+ {
+ var _Outer = function _Outer() {};
+
+ var aVar = "var2";
+ var _aLet = "let2";
+ var _aConst = "const2";
+ {
+ var aVar = "var3";
+ var _aLet2 = "let3";
+ var _aConst2 = "const3";
+
+ console.log("pause here");
+ }
+ }
+});
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=shadowed-vars.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/shadowed-vars.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/shadowed-vars.js.map
new file mode 100644
index 0000000000..f1c64b9f1c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/shadowed-vars.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel6://./shadowed-vars/webpack/bootstrap","webpack4-babel6://./shadowed-vars/./input.js"],"names":["aVar","aLet","aConst","Outer","console","log"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;;AClFA,+DAAe,YAAW;AACxB,MAAIA,OAAO,MAAX;AACA,MAAIC,OAAO,MAAX;AACA,MAAMC,SAAS,QAAf;;AAHwB,MAKlBC,KALkB;AAAA;AAAA;;AAMxB;AAAA,QACWA,MADX,GACE,SAASA,MAAT,GAAiB,CAAE,CADrB;;AAGE,QAAIH,OAAO,MAAX;AACA,QAAIC,QAAO,MAAX;AACA,QAAMC,UAAS,QAAf;AACA;AACE,UAAIF,OAAO,MAAX;AACA,UAAIC,SAAO,MAAX;AACA,UAAMC,WAAS,QAAf;;AAEAE,cAAQC,GAAR,CAAY,YAAZ;AACD;AACF;AACF,C","file":"shadowed-vars.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","export default function() {\n var aVar = \"var1\";\n let aLet = \"let1\";\n const aConst = \"const1\";\n\n class Outer {}\n {\n function Outer() {}\n\n var aVar = \"var2\";\n let aLet = \"let2\";\n const aConst = \"const2\";\n {\n var aVar = \"var3\";\n let aLet = \"let3\";\n const aConst = \"const3\";\n\n console.log(\"pause here\");\n }\n }\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-for-of-array-closure.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-for-of-array-closure.js
new file mode 100644
index 0000000000..8db938a2c0
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-for-of-array-closure.js
@@ -0,0 +1,122 @@
+var webpack4Babel6StepOverForOfArrayClosure =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+// Babel will optimize this for..of because it call tell the value is an array.
+function root() {
+ console.log("pause here");
+
+ var _loop = function _loop(val) {
+ console.log("pause again", function () {
+ return val;
+ }());
+ };
+
+ var _arr = [1, 2];
+ for (var _i = 0; _i < _arr.length; _i++) {
+ var val = _arr[_i];
+ _loop(val);
+ }
+
+ console.log("done");
+}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=step-over-for-of-array-closure.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-for-of-array-closure.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-for-of-array-closure.js.map
new file mode 100644
index 0000000000..a361f71aab
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-for-of-array-closure.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel6://./step-over-for-of-array-closure/webpack/bootstrap","webpack4-babel6://./step-over-for-of-array-closure/./input.js"],"names":["root","console","log","val"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;AClFA;AAAA;AACe,SAASA,IAAT,GAAgB;AAC7BC,UAAQC,GAAR,CAAY,YAAZ;;AAD6B,6BAGlBC,GAHkB;AAI3BF,YAAQC,GAAR,CAAY,aAAZ,EAA4B;AAAA,aAAMC,GAAN;AAAA,KAAD,EAA3B;AAJ2B;;AAAA,aAGX,CAAC,CAAD,EAAI,CAAJ,CAHW;AAG7B,2CAA0B;AAArB,QAAMA,cAAN;AAAqB,UAAfA,GAAe;AAEzB;;AAEDF,UAAQC,GAAR,CAAY,MAAZ;AACD,C","file":"step-over-for-of-array-closure.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","// Babel will optimize this for..of because it call tell the value is an array.\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of [1, 2]) {\n console.log(\"pause again\", (() => val)());\n }\n\n console.log(\"done\");\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-for-of-array.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-for-of-array.js
new file mode 100644
index 0000000000..43415f0e09
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-for-of-array.js
@@ -0,0 +1,116 @@
+var webpack4Babel6StepOverForOfArray =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+// Babel will optimize this for..of because it call tell the value is an array.
+function root() {
+ console.log("pause here");
+
+ var _arr = [1, 2];
+ for (var _i = 0; _i < _arr.length; _i++) {
+ var val = _arr[_i];
+ console.log("pause again", val);
+ }
+
+ console.log("done");
+}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=step-over-for-of-array.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-for-of-array.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-for-of-array.js.map
new file mode 100644
index 0000000000..72ed79b5b0
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-for-of-array.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel6://./step-over-for-of-array/webpack/bootstrap","webpack4-babel6://./step-over-for-of-array/./input.js"],"names":["root","console","log","val"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;AClFA;AAAA;AACe,SAASA,IAAT,GAAgB;AAC7BC,UAAQC,GAAR,CAAY,YAAZ;;AAD6B,aAGX,CAAC,CAAD,EAAI,CAAJ,CAHW;AAG7B,2CAA0B;AAArB,QAAMC,cAAN;AACHF,YAAQC,GAAR,CAAY,aAAZ,EAA2BC,GAA3B;AACD;;AAEDF,UAAQC,GAAR,CAAY,MAAZ;AACD,C","file":"step-over-for-of-array.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","// Babel will optimize this for..of because it call tell the value is an array.\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of [1, 2]) {\n console.log(\"pause again\", val);\n }\n\n console.log(\"done\");\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-for-of-closure.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-for-of-closure.js
new file mode 100644
index 0000000000..b6dbe312cb
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-for-of-closure.js
@@ -0,0 +1,144 @@
+var webpack4Babel6StepOverForOfClosure =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+// Babel will convert the loop body to a function to handle the 'val' lexical
+// enclosure behavior.
+var vals = [1, 2];
+
+function root() {
+ console.log("pause here");
+
+ var _loop = function _loop(val) {
+ console.log("pause again", function () {
+ return val;
+ }());
+ };
+
+ var _iteratorNormalCompletion = true;
+ var _didIteratorError = false;
+ var _iteratorError = undefined;
+
+ try {
+ for (var _iterator = vals[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
+ var val = _step.value;
+
+ _loop(val);
+ }
+ } catch (err) {
+ _didIteratorError = true;
+ _iteratorError = err;
+ } finally {
+ try {
+ if (!_iteratorNormalCompletion && _iterator.return) {
+ _iterator.return();
+ }
+ } finally {
+ if (_didIteratorError) {
+ throw _iteratorError;
+ }
+ }
+ }
+
+ console.log("done");
+}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=step-over-for-of-closure.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-for-of-closure.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-for-of-closure.js.map
new file mode 100644
index 0000000000..9f496c9e9b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-for-of-closure.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel6://./step-over-for-of-closure/webpack/bootstrap","webpack4-babel6://./step-over-for-of-closure/./input.js"],"names":["vals","root","console","log","val"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;AClFA;AAAA;AACA;AACA,IAAMA,OAAO,CAAC,CAAD,EAAI,CAAJ,CAAb;;AAEe,SAASC,IAAT,GAAgB;AAC7BC,UAAQC,GAAR,CAAY,YAAZ;;AAD6B,6BAGlBC,GAHkB;AAI3BF,YAAQC,GAAR,CAAY,aAAZ,EAA4B;AAAA,aAAMC,GAAN;AAAA,KAAD,EAA3B;AAJ2B;;AAAA;AAAA;AAAA;;AAAA;AAG7B,yBAAkBJ,IAAlB,8HAAwB;AAAA,UAAbI,GAAa;;AAAA,YAAbA,GAAa;AAEvB;AAL4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAO7BF,UAAQC,GAAR,CAAY,MAAZ;AACD,C","file":"step-over-for-of-closure.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","// Babel will convert the loop body to a function to handle the 'val' lexical\n// enclosure behavior.\nconst vals = [1, 2];\n\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of vals) {\n console.log(\"pause again\", (() => val)());\n }\n\n console.log(\"done\");\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-for-of.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-for-of.js
new file mode 100644
index 0000000000..16d1a86e69
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-for-of.js
@@ -0,0 +1,136 @@
+var webpack4Babel6StepOverForOf =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+var vals = [1, 2];
+
+function root() {
+ console.log("pause here");
+
+ var _iteratorNormalCompletion = true;
+ var _didIteratorError = false;
+ var _iteratorError = undefined;
+
+ try {
+ for (var _iterator = vals[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
+ var val = _step.value;
+
+ console.log("pause again", val);
+ }
+ } catch (err) {
+ _didIteratorError = true;
+ _iteratorError = err;
+ } finally {
+ try {
+ if (!_iteratorNormalCompletion && _iterator.return) {
+ _iterator.return();
+ }
+ } finally {
+ if (_didIteratorError) {
+ throw _iteratorError;
+ }
+ }
+ }
+
+ console.log("done");
+}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=step-over-for-of.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-for-of.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-for-of.js.map
new file mode 100644
index 0000000000..74aad977a1
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-for-of.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel6://./step-over-for-of/webpack/bootstrap","webpack4-babel6://./step-over-for-of/./input.js"],"names":["vals","root","console","log","val"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;AClFA;AAAA,IAAMA,OAAO,CAAC,CAAD,EAAI,CAAJ,CAAb;;AAEe,SAASC,IAAT,GAAgB;AAC7BC,UAAQC,GAAR,CAAY,YAAZ;;AAD6B;AAAA;AAAA;;AAAA;AAG7B,yBAAkBH,IAAlB,8HAAwB;AAAA,UAAbI,GAAa;;AACtBF,cAAQC,GAAR,CAAY,aAAZ,EAA2BC,GAA3B;AACD;AAL4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAO7BF,UAAQC,GAAR,CAAY,MAAZ;AACD,C","file":"step-over-for-of.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","const vals = [1, 2];\n\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of vals) {\n console.log(\"pause again\", val);\n }\n\n console.log(\"done\");\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-function-params.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-function-params.js
new file mode 100644
index 0000000000..3d9f8f5ccf
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-function-params.js
@@ -0,0 +1,122 @@
+var webpack4Babel6StepOverFunctionParams =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return fn; });
+function test(a1) {
+ var a2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 45;
+
+ var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
+ a3 = _ref.a3,
+ a4 = _ref.a4,
+ _ref$a = _ref.a5;
+
+ _ref$a = _ref$a === undefined ? {} : _ref$a;
+ var a7 = _ref$a.a6;
+
+ console.log("pause next here");
+}
+
+function fn() {
+ console.log("pause here");
+ test("1", undefined, { a3: "3", a4: "4", a5: { a6: "7" } });
+}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=step-over-function-params.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-function-params.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-function-params.js.map
new file mode 100644
index 0000000000..4d766941e7
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-function-params.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel6://./step-over-function-params/webpack/bootstrap","webpack4-babel6://./step-over-function-params/./input.js"],"names":["test","a1","a2","a3","a4","a5","a7","a6","console","log","fn","undefined"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;AClFA;AAAA,SAASA,IAAT,CAAcC,EAAd,EAAiE;AAAA,MAA/CC,EAA+C,uEAA1C,EAA0C;;AAAA,iFAAJ,EAAI;AAAA,MAApCC,EAAoC,QAApCA,EAAoC;AAAA,MAAhCC,EAAgC,QAAhCA,EAAgC;AAAA,oBAA5BC,EAA4B;;AAAA,kCAAX,EAAW;AAAA,MAAlBC,EAAkB,UAAtBC,EAAsB;;AAC/DC,UAAQC,GAAR,CAAY,iBAAZ;AACD;;AAEc,SAASC,EAAT,GAAc;AAC3BF,UAAQC,GAAR,CAAY,YAAZ;AACAT,OAAK,GAAL,EAAUW,SAAV,EAAqB,EAAER,IAAI,GAAN,EAAWC,IAAI,GAAf,EAAoBC,IAAI,EAAEE,IAAI,GAAN,EAAxB,EAArB;AACD,C","file":"step-over-function-params.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","function test(a1, a2 = 45, { a3, a4, a5: { a6: a7 } = {} } = {}) {\n console.log(\"pause next here\");\n}\n\nexport default function fn() {\n console.log(\"pause here\");\n test(\"1\", undefined, { a3: \"3\", a4: \"4\", a5: { a6: \"7\" } });\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-regenerator-await.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-regenerator-await.js
new file mode 100644
index 0000000000..d9a0aafac1
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-regenerator-await.js
@@ -0,0 +1,143 @@
+var webpack4Babel6StepOverRegeneratorAwait =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
+
+var fn = function () {
+ var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
+ return regeneratorRuntime.wrap(function _callee$(_context) {
+ while (1) {
+ switch (_context.prev = _context.next) {
+ case 0:
+ console.log("pause here");
+
+ _context.next = 3;
+ return doAsync();
+
+ case 3:
+
+ console.log("stopped here");
+
+ case 4:
+ case "end":
+ return _context.stop();
+ }
+ }
+ }, _callee, this);
+ }));
+
+ function fn() {
+ return _ref.apply(this, arguments);
+ }
+
+ return fn;
+}();
+
+function doAsync() {
+ return Promise.resolve();
+}
+
+function root() {
+ fn();
+}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=step-over-regenerator-await.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-regenerator-await.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-regenerator-await.js.map
new file mode 100644
index 0000000000..a0de7de688
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/step-over-regenerator-await.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel6://./step-over-regenerator-await/webpack/bootstrap","webpack4-babel6://./step-over-regenerator-await/./input.js"],"names":["fn","console","log","doAsync","Promise","resolve","root"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;;;AClFA,IAAIA;AAAA,qEAAK;AAAA;AAAA;AAAA;AAAA;AACPC,oBAAQC,GAAR,CAAY,YAAZ;;AADO;AAAA,mBAGDC,SAHC;;AAAA;;AAKPF,oBAAQC,GAAR,CAAY,cAAZ;;AALO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAAL;;AAAA,WAAoBF,EAApB;AAAA;AAAA;;AAAA,SAAoBA,EAApB;AAAA,GAAJ;;AAQA,SAASG,OAAT,GAAmB;AACjB,SAAOC,QAAQC,OAAR,EAAP;AACD;;AAEc,SAASC,IAAT,GAAgB;AAC7BN;AACD,C","file":"step-over-regenerator-await.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","var fn = async function fn() {\n console.log(\"pause here\");\n\n await doAsync();\n\n console.log(\"stopped here\");\n};\n\nfunction doAsync() {\n return Promise.resolve();\n}\n\nexport default function root() {\n fn();\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/switches.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/switches.js
new file mode 100644
index 0000000000..ebd0e2d442
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/switches.js
@@ -0,0 +1,118 @@
+var webpack4Babel6Switches =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+function root() {
+ var val = 1;
+
+ switch (true) {
+ case true:
+ var _val = 2;
+ console.log("pause here", root);
+ default:
+ {
+ var _val2 = 3;
+ console.log("pause here", root);
+ }
+ }
+}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=switches.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/switches.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/switches.js.map
new file mode 100644
index 0000000000..9ae43a3fee
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/switches.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel6://./switches/webpack/bootstrap","webpack4-babel6://./switches/./input.js"],"names":["root","val","console","log"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;AClFe,SAASA,IAAT,GAAgB;AAC7B,MAAIC,MAAM,CAAV;;AAEA,UAAQ,IAAR;AACE,SAAK,IAAL;AACE,UAAIA,OAAM,CAAV;AACAC,cAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B;AACF;AAAS;AACP,YAAIC,QAAM,CAAV;AACAC,gBAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B;AACD;AAPH;AASD,C","file":"switches.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","export default function root() {\n let val = 1;\n\n switch (true) {\n case true:\n let val = 2;\n console.log(\"pause here\", root);\n default: {\n let val = 3;\n console.log(\"pause here\", root);\n }\n }\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/this-arguments-bindings.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/this-arguments-bindings.js
new file mode 100644
index 0000000000..a5bf941759
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/this-arguments-bindings.js
@@ -0,0 +1,121 @@
+var webpack4Babel6ThisArgumentsBindings =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+function root() {
+ function fn(arg) {
+ var _this = this,
+ _arguments = arguments;
+
+ console.log(this, arguments);
+ console.log("pause here", fn, root);
+
+ var arrow = function arrow(argArrow) {
+ console.log(_this, _arguments);
+ console.log("pause here", fn, root);
+ };
+ arrow("arrow-arg");
+ }
+
+ fn.call("this-value", "arg-value");
+}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=this-arguments-bindings.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/this-arguments-bindings.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/this-arguments-bindings.js.map
new file mode 100644
index 0000000000..28bc51f4ee
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/this-arguments-bindings.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel6://./this-arguments-bindings/webpack/bootstrap","webpack4-babel6://./this-arguments-bindings/./input.js"],"names":["root","fn","arg","console","log","arguments","arrow","call"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;AClFe,SAASA,IAAT,GAAgB;AAC7B,WAASC,EAAT,CAAYC,GAAZ,EAAiB;AAAA;AAAA;;AACfC,YAAQC,GAAR,CAAY,IAAZ,EAAkBC,SAAlB;AACAF,YAAQC,GAAR,CAAY,YAAZ,EAA0BH,EAA1B,EAA8BD,IAA9B;;AAEA,QAAMM,QAAQ,SAARA,KAAQ,WAAY;AACxBH,cAAQC,GAAR,CAAY,KAAZ,EAAkBC,UAAlB;AACAF,cAAQC,GAAR,CAAY,YAAZ,EAA0BH,EAA1B,EAA8BD,IAA9B;AACD,KAHD;AAIAM,UAAM,WAAN;AACD;;AAEDL,KAAGM,IAAH,CAAQ,YAAR,EAAsB,WAAtB;AACD,C","file":"this-arguments-bindings.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","export default function root() {\n function fn(arg) {\n console.log(this, arguments);\n console.log(\"pause here\", fn, root);\n\n const arrow = argArrow => {\n console.log(this, arguments);\n console.log(\"pause here\", fn, root);\n };\n arrow(\"arrow-arg\");\n }\n\n fn.call(\"this-value\", \"arg-value\");\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/try-catches.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/try-catches.js
new file mode 100644
index 0000000000..87f6a82acb
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/try-catches.js
@@ -0,0 +1,114 @@
+var webpack4Babel6TryCatches =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+function root() {
+ var one = 1;
+
+ try {
+ throw "AnError";
+ } catch (err) {
+ var two = 2;
+ console.log("pause here", root);
+ }
+}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=try-catches.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/try-catches.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/try-catches.js.map
new file mode 100644
index 0000000000..6369f47f5e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/try-catches.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel6://./try-catches/webpack/bootstrap","webpack4-babel6://./try-catches/./input.js"],"names":["root","one","err","two","console","log"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;AClFe,SAASA,IAAT,GAAgB;AAC7B,MAAMC,MAAM,CAAZ;;AAEA,MAAI;AACF,UAAM,SAAN;AACD,GAFD,CAEE,OAAOC,GAAP,EAAY;AACZ,QAAIC,MAAM,CAAV;AACAC,YAAQC,GAAR,CAAY,YAAZ,EAA0BL,IAA1B;AACD;AACF,C","file":"try-catches.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","export default function root() {\n const one = 1;\n\n try {\n throw \"AnError\";\n } catch (err) {\n let two = 2;\n console.log(\"pause here\", root);\n }\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/type-module.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/type-module.js
new file mode 100644
index 0000000000..502d421cd3
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/type-module.js
@@ -0,0 +1,111 @@
+var webpack4Babel6TypeModule =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+var moduleScoped = 1;
+var alsoModuleScoped = 2;
+
+function thirdModuleScoped() {}
+
+/* harmony default export */ __webpack_exports__["default"] = (function () {
+ console.log("pause here", moduleScoped, alsoModuleScoped, thirdModuleScoped);
+});
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=type-module.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/type-module.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/type-module.js.map
new file mode 100644
index 0000000000..bd606343ae
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/type-module.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel6://./type-module/webpack/bootstrap","webpack4-babel6://./type-module/./input.js"],"names":["moduleScoped","alsoModuleScoped","thirdModuleScoped","console","log"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;AClFA;AAAA,IAAIA,eAAe,CAAnB;AACA,IAAIC,mBAAmB,CAAvB;;AAEA,SAASC,iBAAT,GAA6B,CAAE;;AAE/B,+DAAe,YAAW;AACxBC,UAAQC,GAAR,CAAY,YAAZ,EAA0BJ,YAA1B,EAAwCC,gBAAxC,EAA0DC,iBAA1D;AACD,C","file":"type-module.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","var moduleScoped = 1;\nlet alsoModuleScoped = 2;\n\nfunction thirdModuleScoped() {}\n\nexport default function() {\n console.log(\"pause here\", moduleScoped, alsoModuleScoped, thirdModuleScoped);\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/type-script-cjs.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/type-script-cjs.js
new file mode 100644
index 0000000000..79eb5894c7
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/type-script-cjs.js
@@ -0,0 +1,114 @@
+var webpack4Babel6TypeScriptCjs =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var moduleScoped = 1;
+var alsoModuleScopes = 2;
+
+function thirdModuleScoped() {}
+
+function nonModules() {
+ console.log("pause here");
+}
+
+exports.default = nonModules;
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=type-script-cjs.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/type-script-cjs.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/type-script-cjs.js.map
new file mode 100644
index 0000000000..2b286231fb
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/type-script-cjs.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel6://./type-script-cjs/webpack/bootstrap","webpack4-babel6://./type-script-cjs/./input.js"],"names":["moduleScoped","alsoModuleScopes","thirdModuleScoped","nonModules","console","log","exports","default"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;AClFA,IAAIA,eAAe,CAAnB;AACA,IAAIC,mBAAmB,CAAvB;;AAEA,SAASC,iBAAT,GAA6B,CAAE;;AAE/B,SAASC,UAAT,GAAsB;AACpBC,UAAQC,GAAR,CAAY,YAAZ;AACD;;AAEDC,QAAQC,OAAR,GAAkBJ,UAAlB,C","file":"type-script-cjs.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","var moduleScoped = 1;\nlet alsoModuleScopes = 2;\n\nfunction thirdModuleScoped() {}\n\nfunction nonModules() {\n console.log(\"pause here\");\n}\n\nexports.default = nonModules;\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/webpack-functions.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/webpack-functions.js
new file mode 100644
index 0000000000..ed0361662f
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/webpack-functions.js
@@ -0,0 +1,115 @@
+var webpack4Babel6WebpackFunctions =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+var module = {};
+
+module.exports = function (x) {
+ return x * 2;
+};
+
+function root() {
+ // This example is structures to look like CommonJS in order to replicate
+ // a previously-encountered bug.
+ module.exports(4);
+}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=webpack-functions.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/webpack-functions.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/webpack-functions.js.map
new file mode 100644
index 0000000000..a7ee770b44
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/webpack-functions.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel6://./webpack-functions/webpack/bootstrap","webpack4-babel6://./webpack-functions/./input.js"],"names":["module","exports","x","root"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;AClFA;AAAA,IAAIA,SAAS,EAAb;;AAEAA,OAAOC,OAAP,GAAiB,UAASC,CAAT,EAAY;AAC3B,SAAOA,IAAI,CAAX;AACD,CAFD;;AAKe,SAASC,IAAT,GAAgB;AAC7B;AACA;AACAH,SAAOC,OAAP,CAAe,CAAf;AACD,C","file":"webpack-functions.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","var module = {};\n\nmodule.exports = function(x) {\n return x * 2;\n};\n\n\nexport default function root() {\n // This example is structures to look like CommonJS in order to replicate\n // a previously-encountered bug.\n module.exports(4);\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/webpack-line-mappings.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/webpack-line-mappings.js
new file mode 100644
index 0000000000..fcda2f0f5e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/webpack-line-mappings.js
@@ -0,0 +1,138 @@
+var webpack4Babel6WebpackLineMappings =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+/* harmony import */ var _src_mod1__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/mod1 */ "./src/mod1.js");
+
+
+function root() {
+ var one = 1;
+
+ {
+ var two = 2;
+
+ var fn = function someName(arg) {
+ console.log(this, arguments);
+ console.log("pause here", _src_mod1__WEBPACK_IMPORTED_MODULE_0__["default"], one, two, fn, arg);
+
+ var inner = function inner(arg) {
+ var body = "42";console.log("pause here", body, root);
+ };
+ inner();
+ };
+ fn.call("this-value", "arg-value");
+ }
+}
+
+/***/ }),
+
+/***/ "./src/mod1.js":
+/*!*********************!*\
+ !*** ./src/mod1.js ***!
+ \*********************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = ("a-default");
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=webpack-line-mappings.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/webpack-line-mappings.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/webpack-line-mappings.js.map
new file mode 100644
index 0000000000..43ff5d9469
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel6/webpack-line-mappings.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel6://./webpack-line-mappings/webpack/bootstrap","webpack4-babel6://./webpack-line-mappings/./input.js","webpack4-babel6://./webpack-line-mappings/./src/mod1.js"],"names":["root","one","two","fn","someName","arg","console","log","arguments","inner","body","call"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;;AClFA;;AAEe,SAASA,IAAT,GAAgB;AAC7B,MAAIC,MAAM,CAAV;;AAEA;AACE,QAAMC,MAAM,CAAZ;;AAEA,QAAIC,KAAK,SAASC,QAAT,CAAkBC,GAAlB,EAAuB;AAC9BC,cAAQC,GAAR,CAAY,IAAZ,EAAkBC,SAAlB;AACAF,cAAQC,GAAR,CAAY,YAAZ,EAA0B,iDAA1B,EAAoCN,GAApC,EAAyCC,GAAzC,EAA8CC,EAA9C,EAAkDE,GAAlD;;AAEA,UAAII,QAAQ,SAARA,KAAQ,CAACJ,GAAD,EAAS;AAAE,YAAIK,OAAO,IAAX,CAAiBJ,QAAQC,GAAR,CAAY,YAAZ,EAA0BG,IAA1B,EAAgCV,IAAhC;AAAwC,OAAhF;AACAS;AACD,KAND;AAOAN,OAAGQ,IAAH,CAAQ,YAAR,EAAsB,WAAtB;AACD;AACF,C;;;;;;;;;;;;;ACjBD,+DAAe,WAAf,E","file":"webpack-line-mappings.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","import aDefault from \"./src/mod1\";\n\nexport default function root() {\n let one = 1;\n\n {\n const two = 2;\n\n var fn = function someName(arg) {\n console.log(this, arguments);\n console.log(\"pause here\", aDefault, one, two, fn, arg);\n\n var inner = (arg) => { var body = \"42\"; console.log(\"pause here\", body, root); };\n inner();\n };\n fn.call(\"this-value\", \"arg-value\");\n }\n}\n","export default \"a-default\";\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/babel-bindings-with-flow.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/babel-bindings-with-flow.js
new file mode 100644
index 0000000000..60f0807ac9
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/babel-bindings-with-flow.js
@@ -0,0 +1,127 @@
+var webpack4Babel7BabelBindingsWithFlow =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+/* harmony import */ var _src_mod__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/mod */ "./src/mod.js");
+// Webpack doesn't map import declarations well, so doing this forces binding
+// processing to only process the binding being cast when searching for
+// matches. That way we can properly test if the flow cast causes problems.
+
+function root() {
+ var value = _src_mod__WEBPACK_IMPORTED_MODULE_0__["aNamed"];
+ console.log("pause here", root, value);
+}
+
+/***/ }),
+
+/***/ "./src/mod.js":
+/*!********************!*\
+ !*** ./src/mod.js ***!
+ \********************/
+/*! exports provided: aNamed */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "aNamed", function() { return aNamed; });
+var aNamed = "a-named";
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=babel-bindings-with-flow.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/babel-bindings-with-flow.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/babel-bindings-with-flow.js.map
new file mode 100644
index 0000000000..126bdd5340
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/babel-bindings-with-flow.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel7://./babel-bindings-with-flow/webpack/bootstrap","webpack4-babel7://./babel-bindings-with-flow/./input.js","webpack4-babel7://./babel-bindings-with-flow/./src/mod.js"],"names":["root","value","console","log","aNamed"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;AClFA;AAAA;AACA;AACA;AACA;AAEe,SAASA,IAAT,GAAgB;AAC7B,MAAIC,QAAS,+CAAb;AAEAC,UAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B,EAAgCC,KAAhC;AACD,C;;;;;;;;;;;;;;ACTM,IAAMG,SAAS,SAAf,C","file":"babel-bindings-with-flow.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","// Webpack doesn't map import declarations well, so doing this forces binding\n// processing to only process the binding being cast when searching for\n// matches. That way we can properly test if the flow cast causes problems.\nimport { aNamed } from \"./src/mod\";\n\nexport default function root() {\n var value = (aNamed: Array<string>);\n\n console.log(\"pause here\", root, value);\n}\n","export const aNamed = \"a-named\";\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/babel-classes.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/babel-classes.js
new file mode 100644
index 0000000000..d80c5e079a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/babel-classes.js
@@ -0,0 +1,139 @@
+var webpack4Babel7BabelClasses =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
+
+function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+function root() {
+ var Another =
+ /*#__PURE__*/
+ function () {
+ function Another() {
+ var _this = this;
+
+ _classCallCheck(this, Another);
+
+ _defineProperty(this, "bound", function () {
+ return _this;
+ });
+ }
+
+ _createClass(Another, [{
+ key: "method",
+ value: function method() {
+ var two = 2;
+ console.log("pause here", Another, root);
+ }
+ }]);
+
+ return Another;
+ }();
+
+ new Another().method();
+}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=babel-classes.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/babel-classes.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/babel-classes.js.map
new file mode 100644
index 0000000000..4d8db4dbc7
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/babel-classes.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel7://./babel-classes/webpack/bootstrap","webpack4-babel7://./babel-classes/./input.js"],"names":["root","Another","two","console","log","method"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;;;;;;;;;AClFe,SAASA,IAAT,GAAgB;AAAA,MACvBC,OADuB;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA,qCAEnB,YAAM;AACZ,eAAO,KAAP;AACD,OAJ0B;AAAA;;AAAA;AAAA;AAAA,+BAMlB;AACP,YAAIC,MAAM,CAAV;AAEAC,gBAAQC,GAAR,CAAY,YAAZ,EAA0BH,OAA1B,EAAmCD,IAAnC;AACD;AAV0B;;AAAA;AAAA;;AAa7B,MAAIC,OAAJ,GAAcI,MAAd;AACD,C","file":"babel-classes.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","export default function root() {\n class Another {\n bound = () => {\n return this;\n }\n\n method() {\n let two = 2;\n\n console.log(\"pause here\", Another, root);\n }\n }\n\n new Another().method();\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/babel-flowtype-bindings.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/babel-flowtype-bindings.js
new file mode 100644
index 0000000000..b0703ba8c0
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/babel-flowtype-bindings.js
@@ -0,0 +1,125 @@
+var webpack4Babel7BabelFlowtypeBindings =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+/* harmony import */ var _src_mod__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/mod */ "./src/mod.js");
+
+var aConst = "a-const";
+function root() {
+ console.log("pause here", aConst, _src_mod__WEBPACK_IMPORTED_MODULE_0__["Four"], root);
+}
+
+/***/ }),
+
+/***/ "./src/mod.js":
+/*!********************!*\
+ !*** ./src/mod.js ***!
+ \********************/
+/*! exports provided: default, Four */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Four", function() { return Four; });
+/* harmony default export */ __webpack_exports__["default"] = ("a-default");
+var Four = "one";
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=babel-flowtype-bindings.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/babel-flowtype-bindings.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/babel-flowtype-bindings.js.map
new file mode 100644
index 0000000000..ee128794ef
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/babel-flowtype-bindings.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel7://./babel-flowtype-bindings/webpack/bootstrap","webpack4-babel7://./babel-flowtype-bindings/./input.js","webpack4-babel7://./babel-flowtype-bindings/./src/mod.js"],"names":["aConst","root","console","log","Four"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;;ACjFA;AAIA,IAAMA,SAAS,SAAf;AAEe,SAASC,IAAT,GAAgB;AAC7BC,UAAQC,GAAR,CAAY,YAAZ,EAA0BH,MAA1B,EAAkC,6CAAlC,EAAwCC,IAAxC;AACD,C;;;;;;;;;;;;;;ACTD,+DAAe,WAAf;AACO,IAAMG,OAAO,KAAb,C","file":"babel-flowtype-bindings.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","import type { One, Two, Three } from \"./src/mod\";\nimport { Four, type Five, typeof Six } from \"./src/mod\";\n\ntype Other = {};\n\nconst aConst = \"a-const\";\n\nexport default function root() {\n console.log(\"pause here\", aConst, Four, root);\n}\n","export default \"a-default\";\nexport const Four = \"one\";\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/classes.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/classes.js
new file mode 100644
index 0000000000..498c6720d7
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/classes.js
@@ -0,0 +1,152 @@
+var webpack4Babel7Classes =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
+
+function root() {
+ var one = 1;
+
+ var Thing =
+ /*#__PURE__*/
+ function () {
+ function Thing() {
+ _classCallCheck(this, Thing);
+ }
+
+ _createClass(Thing, [{
+ key: "one",
+ value: function one() {
+ console.log("pause here");
+ }
+ }]);
+
+ return Thing;
+ }();
+
+ var Another =
+ /*#__PURE__*/
+ function () {
+ function Another() {
+ _classCallCheck(this, Another);
+ }
+
+ _createClass(Another, [{
+ key: "method",
+ value: function method() {
+ var two = 2;
+ var three = 3;
+ console.log("pause here", Another, one, Thing, root);
+ }
+ }]);
+
+ return Another;
+ }();
+
+ new Another().method();
+ new Thing().one();
+}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=classes.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/classes.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/classes.js.map
new file mode 100644
index 0000000000..0f1423e662
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/classes.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel7://./classes/webpack/bootstrap","webpack4-babel7://./classes/./input.js"],"names":["root","one","Thing","console","log","Another","two","three","method"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;;;;;;;AClFe,SAASA,IAAT,GAAgB;AAC7B,MAAIC,MAAM,CAAV;;AAD6B,MAGvBC,KAHuB;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,4BAIrB;AACJC,gBAAQC,GAAR,CAAY,YAAZ;AACD;AAN0B;;AAAA;AAAA;;AAAA,MASvBC,OATuB;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,+BAUlB;AACP,YAAIC,MAAM,CAAV;AAEA,YAAMC,QAAQ,CAAd;AAEAJ,gBAAQC,GAAR,CAAY,YAAZ,EAA0BC,OAA1B,EAAmCJ,GAAnC,EAAwCC,KAAxC,EAA+CF,IAA/C;AACD;AAhB0B;;AAAA;AAAA;;AAmB7B,MAAIK,OAAJ,GAAcG,MAAd;AACA,MAAIN,KAAJ,GAAYD,GAAZ;AACD,C","file":"classes.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","export default function root() {\n let one = 1;\n\n class Thing {\n one() {\n console.log(\"pause here\");\n }\n }\n\n class Another {\n method() {\n let two = 2;\n\n const three = 3;\n\n console.log(\"pause here\", Another, one, Thing, root);\n }\n }\n\n new Another().method();\n new Thing().one();\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/esmodules-cjs.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/esmodules-cjs.js
new file mode 100644
index 0000000000..a80f3606ac
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/esmodules-cjs.js
@@ -0,0 +1,372 @@
+var webpack4Babel7EsmodulesCjs =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = root;
+exports.example = example;
+
+var _mod = _interopRequireDefault(__webpack_require__(/*! ./src/mod1 */ "./src/mod1.js"));
+
+var _mod2 = __webpack_require__(/*! ./src/mod2 */ "./src/mod2.js");
+
+var _mod3 = __webpack_require__(/*! ./src/mod3 */ "./src/mod3.js");
+
+var aNamespace = _interopRequireWildcard(__webpack_require__(/*! ./src/mod4 */ "./src/mod4.js"));
+
+var _mod5 = _interopRequireDefault(__webpack_require__(/*! ./src/mod5 */ "./src/mod5.js"));
+
+var _mod6 = __webpack_require__(/*! ./src/mod6 */ "./src/mod6.js");
+
+var _mod7 = __webpack_require__(/*! ./src/mod7 */ "./src/mod7.js");
+
+var _mod8 = _interopRequireDefault(__webpack_require__(/*! ./src/mod9 */ "./src/mod9.js"));
+
+var _mod9 = __webpack_require__(/*! ./src/mod10 */ "./src/mod10.js");
+
+var _mod10 = __webpack_require__(/*! ./src/mod11 */ "./src/mod11.js");
+
+var _optimizedOut = _interopRequireDefault(__webpack_require__(/*! ./src/optimized-out */ "./src/optimized-out.js"));
+
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+(0, _optimizedOut.default)();
+
+function root() {
+ console.log("pause here", root);
+ console.log(_mod.default);
+ console.log(_mod3.original);
+ console.log(_mod2.aNamed);
+ console.log(_mod2.aNamed);
+ console.log(aNamespace);
+
+ try {
+ // None of these are callable in this code, but we still want to make sure
+ // they map properly even if the only reference is in a call expressions.
+ console.log((0, _mod5.default)());
+ console.log((0, _mod7.original)());
+ console.log((0, _mod6.aNamed2)());
+ console.log((0, _mod6.aNamed2)());
+ console.log(new _mod8.default());
+ console.log(new _mod10.original());
+ console.log(new _mod9.aNamed3());
+ console.log(new _mod9.aNamed3());
+ } catch (e) {}
+}
+
+function example() {}
+
+/***/ }),
+
+/***/ "./src/mod1.js":
+/*!*********************!*\
+ !*** ./src/mod1.js ***!
+ \*********************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+var _default = "a-default";
+exports.default = _default;
+
+/***/ }),
+
+/***/ "./src/mod10.js":
+/*!**********************!*\
+ !*** ./src/mod10.js ***!
+ \**********************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.aNamed3 = void 0;
+var aNamed3 = "a-named3";
+exports.aNamed3 = aNamed3;
+
+/***/ }),
+
+/***/ "./src/mod11.js":
+/*!**********************!*\
+ !*** ./src/mod11.js ***!
+ \**********************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.original = void 0;
+var original = "an-original3";
+exports.original = original;
+
+/***/ }),
+
+/***/ "./src/mod2.js":
+/*!*********************!*\
+ !*** ./src/mod2.js ***!
+ \*********************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.aNamed = void 0;
+var aNamed = "a-named";
+exports.aNamed = aNamed;
+
+/***/ }),
+
+/***/ "./src/mod3.js":
+/*!*********************!*\
+ !*** ./src/mod3.js ***!
+ \*********************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.original = void 0;
+var original = "an-original";
+exports.original = original;
+
+/***/ }),
+
+/***/ "./src/mod4.js":
+/*!*********************!*\
+ !*** ./src/mod4.js ***!
+ \*********************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.aNamed = exports.default = void 0;
+var _default = "a-default";
+exports.default = _default;
+var aNamed = "a-named";
+exports.aNamed = aNamed;
+
+/***/ }),
+
+/***/ "./src/mod5.js":
+/*!*********************!*\
+ !*** ./src/mod5.js ***!
+ \*********************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+var _default = "a-default2";
+exports.default = _default;
+
+/***/ }),
+
+/***/ "./src/mod6.js":
+/*!*********************!*\
+ !*** ./src/mod6.js ***!
+ \*********************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.aNamed2 = void 0;
+var aNamed2 = "a-named2";
+exports.aNamed2 = aNamed2;
+
+/***/ }),
+
+/***/ "./src/mod7.js":
+/*!*********************!*\
+ !*** ./src/mod7.js ***!
+ \*********************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.original = void 0;
+var original = "an-original2";
+exports.original = original;
+
+/***/ }),
+
+/***/ "./src/mod9.js":
+/*!*********************!*\
+ !*** ./src/mod9.js ***!
+ \*********************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+var _default = "a-default3";
+exports.default = _default;
+
+/***/ }),
+
+/***/ "./src/optimized-out.js":
+/*!******************************!*\
+ !*** ./src/optimized-out.js ***!
+ \******************************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = optimizedOut;
+
+function optimizedOut() {}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=esmodules-cjs.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/esmodules-cjs.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/esmodules-cjs.js.map
new file mode 100644
index 0000000000..7baf60f99e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/esmodules-cjs.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel7://./esmodules-cjs/webpack/bootstrap","webpack4-babel7://./esmodules-cjs/./input.js","webpack4-babel7://./esmodules-cjs/./src/mod1.js","webpack4-babel7://./esmodules-cjs/./src/mod10.js","webpack4-babel7://./esmodules-cjs/./src/mod11.js","webpack4-babel7://./esmodules-cjs/./src/mod2.js","webpack4-babel7://./esmodules-cjs/./src/mod3.js","webpack4-babel7://./esmodules-cjs/./src/mod4.js","webpack4-babel7://./esmodules-cjs/./src/mod5.js","webpack4-babel7://./esmodules-cjs/./src/mod6.js","webpack4-babel7://./esmodules-cjs/./src/mod7.js","webpack4-babel7://./esmodules-cjs/./src/mod9.js","webpack4-babel7://./esmodules-cjs/./src/optimized-out.js"],"names":["root","console","log","aDefault","anAliased","aNamed","anotherNamed","aNamespace","aDefault3","anAliased3","aNamed3","anotherNamed3","e","example","original","aNamed2","optimizedOut"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;;;;;;;AClFA;;AACA;;AACA;;AACA;;AAEA;;AACA;;AACA;;AAEA;;AACA;;AACA;;AAEA;;;;;;AACA;;AAEe,SAASA,IAAT,GAAgB;AAC7BC,UAAQC,GAAR,CAAY,YAAZ,EAA0BF,IAA1B;AAEAC,UAAQC,GAAR,CAAYC,YAAZ;AACAF,UAAQC,GAAR,CAAYE,cAAZ;AACAH,UAAQC,GAAR,CAAYG,YAAZ;AACAJ,UAAQC,GAAR,CAAYI,YAAZ;AACAL,UAAQC,GAAR,CAAYK,UAAZ;;AAEA,MAAI;AACF;AACA;AACAN,YAAQC,GAAR,CAAY,oBAAZ;AACAD,YAAQC,GAAR,CAAY,qBAAZ;AACAD,YAAQC,GAAR,CAAY,oBAAZ;AACAD,YAAQC,GAAR,CAAY,oBAAZ;AAEAD,YAAQC,GAAR,CAAY,IAAIM,aAAJ,EAAZ;AACAP,YAAQC,GAAR,CAAY,IAAIO,eAAJ,EAAZ;AACAR,YAAQC,GAAR,CAAY,IAAIQ,aAAJ,EAAZ;AACAT,YAAQC,GAAR,CAAY,IAAIS,aAAJ,EAAZ;AACD,GAZD,CAYE,OAAOC,CAAP,EAAU,CAAE;AACf;;AAEM,SAASC,OAAT,GAAkB,CAAE,C;;;;;;;;;;;;;;;;;;eCxCZ,W;;;;;;;;;;;;;;;;;;;ACAR,IAAMH,UAAU,UAAhB;;;;;;;;;;;;;;;;;;;ACAA,IAAMI,WAAW,cAAjB;;;;;;;;;;;;;;;;;;;ACAA,IAAMT,SAAS,SAAf;;;;;;;;;;;;;;;;;;;ACAA,IAAMS,WAAW,aAAjB;;;;;;;;;;;;;;;;;;;eCAQ,W;;AACR,IAAMT,SAAS,SAAf;;;;;;;;;;;;;;;;;;;eCDQ,Y;;;;;;;;;;;;;;;;;;;ACAR,IAAMU,UAAU,UAAhB;;;;;;;;;;;;;;;;;;;ACAA,IAAMD,WAAW,cAAjB;;;;;;;;;;;;;;;;;;;eCAQ,Y;;;;;;;;;;;;;;;;;;;;ACAA,SAASE,YAAT,GAAwB,CAAE,C","file":"esmodules-cjs.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","import aDefault from \"./src/mod1\";\nimport { aNamed, aNamed as anotherNamed } from \"./src/mod2\";\nimport { original as anAliased } from \"./src/mod3\";\nimport * as aNamespace from \"./src/mod4\";\n\nimport aDefault2 from \"./src/mod5\";\nimport { aNamed2, aNamed2 as anotherNamed2 } from \"./src/mod6\";\nimport { original as anAliased2 } from \"./src/mod7\";\n\nimport aDefault3 from \"./src/mod9\";\nimport { aNamed3, aNamed3 as anotherNamed3 } from \"./src/mod10\";\nimport { original as anAliased3 } from \"./src/mod11\";\n\nimport optimizedOut from \"./src/optimized-out\";\noptimizedOut();\n\nexport default function root() {\n console.log(\"pause here\", root);\n\n console.log(aDefault);\n console.log(anAliased);\n console.log(aNamed);\n console.log(anotherNamed);\n console.log(aNamespace);\n\n try {\n // None of these are callable in this code, but we still want to make sure\n // they map properly even if the only reference is in a call expressions.\n console.log(aDefault2());\n console.log(anAliased2());\n console.log(aNamed2());\n console.log(anotherNamed2());\n\n console.log(new aDefault3());\n console.log(new anAliased3());\n console.log(new aNamed3());\n console.log(new anotherNamed3());\n } catch (e) {}\n}\n\nexport function example(){}\n","export default \"a-default\";\n","export const aNamed3 = \"a-named3\";\n","export const original = \"an-original3\";\n","export const aNamed = \"a-named\";\n","export const original = \"an-original\";\n","export default \"a-default\";\nexport const aNamed = \"a-named\";\n","export default \"a-default2\";\n","export const aNamed2 = \"a-named2\";\n","export const original = \"an-original2\";\n","export default \"a-default3\";\n","export default function optimizedOut() {}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/esmodules-es6.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/esmodules-es6.js
new file mode 100644
index 0000000000..333fa3af4d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/esmodules-es6.js
@@ -0,0 +1,302 @@
+var webpack4Babel7EsmodulesEs6 =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default, example */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "example", function() { return example; });
+/* harmony import */ var _src_mod1__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/mod1 */ "./src/mod1.js");
+/* harmony import */ var _src_mod2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./src/mod2 */ "./src/mod2.js");
+/* harmony import */ var _src_mod3__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./src/mod3 */ "./src/mod3.js");
+/* harmony import */ var _src_mod4__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./src/mod4 */ "./src/mod4.js");
+/* harmony import */ var _src_mod5__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./src/mod5 */ "./src/mod5.js");
+/* harmony import */ var _src_mod6__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./src/mod6 */ "./src/mod6.js");
+/* harmony import */ var _src_mod7__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./src/mod7 */ "./src/mod7.js");
+/* harmony import */ var _src_mod9__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./src/mod9 */ "./src/mod9.js");
+/* harmony import */ var _src_mod10__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./src/mod10 */ "./src/mod10.js");
+/* harmony import */ var _src_mod11__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./src/mod11 */ "./src/mod11.js");
+/* harmony import */ var _src_optimized_out__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./src/optimized-out */ "./src/optimized-out.js");
+
+
+
+
+
+
+
+
+
+
+
+Object(_src_optimized_out__WEBPACK_IMPORTED_MODULE_10__["default"])();
+function root() {
+ console.log("pause here", root);
+ console.log(_src_mod1__WEBPACK_IMPORTED_MODULE_0__["default"]);
+ console.log(_src_mod3__WEBPACK_IMPORTED_MODULE_2__["original"]);
+ console.log(_src_mod2__WEBPACK_IMPORTED_MODULE_1__["aNamed"]);
+ console.log(_src_mod2__WEBPACK_IMPORTED_MODULE_1__["aNamed"]);
+ console.log(_src_mod4__WEBPACK_IMPORTED_MODULE_3__);
+
+ try {
+ // None of these are callable in this code, but we still want to make sure
+ // they map properly even if the only reference is in a call expressions.
+ console.log(Object(_src_mod5__WEBPACK_IMPORTED_MODULE_4__["default"])());
+ console.log(Object(_src_mod7__WEBPACK_IMPORTED_MODULE_6__["original"])());
+ console.log(Object(_src_mod6__WEBPACK_IMPORTED_MODULE_5__["aNamed2"])());
+ console.log(Object(_src_mod6__WEBPACK_IMPORTED_MODULE_5__["aNamed2"])());
+ console.log(new _src_mod9__WEBPACK_IMPORTED_MODULE_7__["default"]());
+ console.log(new _src_mod11__WEBPACK_IMPORTED_MODULE_9__["original"]());
+ console.log(new _src_mod10__WEBPACK_IMPORTED_MODULE_8__["aNamed3"]());
+ console.log(new _src_mod10__WEBPACK_IMPORTED_MODULE_8__["aNamed3"]());
+ } catch (e) {}
+}
+function example() {}
+
+/***/ }),
+
+/***/ "./src/mod1.js":
+/*!*********************!*\
+ !*** ./src/mod1.js ***!
+ \*********************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = ("a-default");
+
+/***/ }),
+
+/***/ "./src/mod10.js":
+/*!**********************!*\
+ !*** ./src/mod10.js ***!
+ \**********************/
+/*! exports provided: aNamed3 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "aNamed3", function() { return aNamed3; });
+const aNamed3 = "a-named3";
+
+/***/ }),
+
+/***/ "./src/mod11.js":
+/*!**********************!*\
+ !*** ./src/mod11.js ***!
+ \**********************/
+/*! exports provided: original */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "original", function() { return original; });
+const original = "an-original3";
+
+/***/ }),
+
+/***/ "./src/mod2.js":
+/*!*********************!*\
+ !*** ./src/mod2.js ***!
+ \*********************/
+/*! exports provided: aNamed */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "aNamed", function() { return aNamed; });
+const aNamed = "a-named";
+
+/***/ }),
+
+/***/ "./src/mod3.js":
+/*!*********************!*\
+ !*** ./src/mod3.js ***!
+ \*********************/
+/*! exports provided: original */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "original", function() { return original; });
+const original = "an-original";
+
+/***/ }),
+
+/***/ "./src/mod4.js":
+/*!*********************!*\
+ !*** ./src/mod4.js ***!
+ \*********************/
+/*! exports provided: default, aNamed */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "aNamed", function() { return aNamed; });
+/* harmony default export */ __webpack_exports__["default"] = ("a-default");
+const aNamed = "a-named";
+
+/***/ }),
+
+/***/ "./src/mod5.js":
+/*!*********************!*\
+ !*** ./src/mod5.js ***!
+ \*********************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = ("a-default2");
+
+/***/ }),
+
+/***/ "./src/mod6.js":
+/*!*********************!*\
+ !*** ./src/mod6.js ***!
+ \*********************/
+/*! exports provided: aNamed2 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "aNamed2", function() { return aNamed2; });
+const aNamed2 = "a-named2";
+
+/***/ }),
+
+/***/ "./src/mod7.js":
+/*!*********************!*\
+ !*** ./src/mod7.js ***!
+ \*********************/
+/*! exports provided: original */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "original", function() { return original; });
+const original = "an-original2";
+
+/***/ }),
+
+/***/ "./src/mod9.js":
+/*!*********************!*\
+ !*** ./src/mod9.js ***!
+ \*********************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = ("a-default3");
+
+/***/ }),
+
+/***/ "./src/optimized-out.js":
+/*!******************************!*\
+ !*** ./src/optimized-out.js ***!
+ \******************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return optimizedOut; });
+function optimizedOut() {}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=esmodules-es6.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/esmodules-es6.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/esmodules-es6.js.map
new file mode 100644
index 0000000000..8527da64e5
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/esmodules-es6.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel7://./esmodules-es6/webpack/bootstrap","webpack4-babel7://./esmodules-es6/./input.js","webpack4-babel7://./esmodules-es6/./src/mod1.js","webpack4-babel7://./esmodules-es6/./src/mod10.js","webpack4-babel7://./esmodules-es6/./src/mod11.js","webpack4-babel7://./esmodules-es6/./src/mod2.js","webpack4-babel7://./esmodules-es6/./src/mod3.js","webpack4-babel7://./esmodules-es6/./src/mod4.js","webpack4-babel7://./esmodules-es6/./src/mod5.js","webpack4-babel7://./esmodules-es6/./src/mod6.js","webpack4-babel7://./esmodules-es6/./src/mod7.js","webpack4-babel7://./esmodules-es6/./src/mod9.js","webpack4-babel7://./esmodules-es6/./src/optimized-out.js"],"names":["optimizedOut","root","console","log","aDefault2","anAliased2","aNamed2","anotherNamed2","e","example","aNamed3","original","aNamed"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;AClFA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA,mEAAAA;AAEe,SAASC,IAAT,GAAgB;AAC7BC,UAAQC,GAAR,CAAY,YAAZ,EAA0BF,IAA1B;AAEAC,UAAQC,GAAR,CAAY,iDAAZ;AACAD,UAAQC,GAAR,CAAY,kDAAZ;AACAD,UAAQC,GAAR,CAAY,gDAAZ;AACAD,UAAQC,GAAR,CAAY,gDAAZ;AACAD,UAAQC,GAAR,CAAY,sCAAZ;;AAEA,MAAI;AACF;AACA;AACAD,YAAQC,GAAR,CAAY,yDAAAC,EAAZ;AACAF,YAAQC,GAAR,CAAY,0DAAAE,EAAZ;AACAH,YAAQC,GAAR,CAAY,yDAAAG,EAAZ;AACAJ,YAAQC,GAAR,CAAY,yDAAAI,EAAZ;AAEAL,YAAQC,GAAR,CAAY,IAAI,iDAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,mDAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,kDAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,kDAAJ,EAAZ;AACD,GAZD,CAYE,OAAOK,CAAP,EAAU,CAAE;AACf;AAEM,SAASC,OAAT,GAAkB,CAAE,C;;;;;;;;;;;;;ACxC3B,+DAAe,WAAf,E;;;;;;;;;;;;;;ACAO,MAAMC,UAAU,UAAhB,C;;;;;;;;;;;;;;ACAA,MAAMC,WAAW,cAAjB,C;;;;;;;;;;;;;;ACAA,MAAMC,SAAS,SAAf,C;;;;;;;;;;;;;;ACAA,MAAMD,WAAW,aAAjB,C;;;;;;;;;;;;;;ACAP,+DAAe,WAAf;AACO,MAAMC,SAAS,SAAf,C;;;;;;;;;;;;;ACDP,+DAAe,YAAf,E;;;;;;;;;;;;;;ACAO,MAAMN,UAAU,UAAhB,C;;;;;;;;;;;;;;ACAA,MAAMK,WAAW,cAAjB,C;;;;;;;;;;;;;ACAP,+DAAe,YAAf,E;;;;;;;;;;;;;;ACAe,SAASX,YAAT,GAAwB,CAAE,C","file":"esmodules-es6.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","import aDefault from \"./src/mod1\";\nimport { aNamed, aNamed as anotherNamed } from \"./src/mod2\";\nimport { original as anAliased } from \"./src/mod3\";\nimport * as aNamespace from \"./src/mod4\";\n\nimport aDefault2 from \"./src/mod5\";\nimport { aNamed2, aNamed2 as anotherNamed2 } from \"./src/mod6\";\nimport { original as anAliased2 } from \"./src/mod7\";\n\nimport aDefault3 from \"./src/mod9\";\nimport { aNamed3, aNamed3 as anotherNamed3 } from \"./src/mod10\";\nimport { original as anAliased3 } from \"./src/mod11\";\n\nimport optimizedOut from \"./src/optimized-out\";\noptimizedOut();\n\nexport default function root() {\n console.log(\"pause here\", root);\n\n console.log(aDefault);\n console.log(anAliased);\n console.log(aNamed);\n console.log(anotherNamed);\n console.log(aNamespace);\n\n try {\n // None of these are callable in this code, but we still want to make sure\n // they map properly even if the only reference is in a call expressions.\n console.log(aDefault2());\n console.log(anAliased2());\n console.log(aNamed2());\n console.log(anotherNamed2());\n\n console.log(new aDefault3());\n console.log(new anAliased3());\n console.log(new aNamed3());\n console.log(new anotherNamed3());\n } catch (e) {}\n}\n\nexport function example(){}\n","export default \"a-default\";\n","export const aNamed3 = \"a-named3\";\n","export const original = \"an-original3\";\n","export const aNamed = \"a-named\";\n","export const original = \"an-original\";\n","export default \"a-default\";\nexport const aNamed = \"a-named\";\n","export default \"a-default2\";\n","export const aNamed2 = \"a-named2\";\n","export const original = \"an-original2\";\n","export default \"a-default3\";\n","export default function optimizedOut() {}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/esmodules.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/esmodules.js
new file mode 100644
index 0000000000..60399f7c6c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/esmodules.js
@@ -0,0 +1,302 @@
+var webpack4Babel7Esmodules =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default, example */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "example", function() { return example; });
+/* harmony import */ var _src_mod1__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/mod1 */ "./src/mod1.js");
+/* harmony import */ var _src_mod2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./src/mod2 */ "./src/mod2.js");
+/* harmony import */ var _src_mod3__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./src/mod3 */ "./src/mod3.js");
+/* harmony import */ var _src_mod4__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./src/mod4 */ "./src/mod4.js");
+/* harmony import */ var _src_mod5__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./src/mod5 */ "./src/mod5.js");
+/* harmony import */ var _src_mod6__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./src/mod6 */ "./src/mod6.js");
+/* harmony import */ var _src_mod7__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./src/mod7 */ "./src/mod7.js");
+/* harmony import */ var _src_mod9__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./src/mod9 */ "./src/mod9.js");
+/* harmony import */ var _src_mod10__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./src/mod10 */ "./src/mod10.js");
+/* harmony import */ var _src_mod11__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./src/mod11 */ "./src/mod11.js");
+/* harmony import */ var _src_optimized_out__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./src/optimized-out */ "./src/optimized-out.js");
+
+
+
+
+
+
+
+
+
+
+
+Object(_src_optimized_out__WEBPACK_IMPORTED_MODULE_10__["default"])();
+function root() {
+ console.log("pause here", root);
+ console.log(_src_mod1__WEBPACK_IMPORTED_MODULE_0__["default"]);
+ console.log(_src_mod3__WEBPACK_IMPORTED_MODULE_2__["original"]);
+ console.log(_src_mod2__WEBPACK_IMPORTED_MODULE_1__["aNamed"]);
+ console.log(_src_mod2__WEBPACK_IMPORTED_MODULE_1__["aNamed"]);
+ console.log(_src_mod4__WEBPACK_IMPORTED_MODULE_3__);
+
+ try {
+ // None of these are callable in this code, but we still want to make sure
+ // they map properly even if the only reference is in a call expressions.
+ console.log(Object(_src_mod5__WEBPACK_IMPORTED_MODULE_4__["default"])());
+ console.log(Object(_src_mod7__WEBPACK_IMPORTED_MODULE_6__["original"])());
+ console.log(Object(_src_mod6__WEBPACK_IMPORTED_MODULE_5__["aNamed2"])());
+ console.log(Object(_src_mod6__WEBPACK_IMPORTED_MODULE_5__["aNamed2"])());
+ console.log(new _src_mod9__WEBPACK_IMPORTED_MODULE_7__["default"]());
+ console.log(new _src_mod11__WEBPACK_IMPORTED_MODULE_9__["original"]());
+ console.log(new _src_mod10__WEBPACK_IMPORTED_MODULE_8__["aNamed3"]());
+ console.log(new _src_mod10__WEBPACK_IMPORTED_MODULE_8__["aNamed3"]());
+ } catch (e) {}
+}
+function example() {}
+
+/***/ }),
+
+/***/ "./src/mod1.js":
+/*!*********************!*\
+ !*** ./src/mod1.js ***!
+ \*********************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = ("a-default");
+
+/***/ }),
+
+/***/ "./src/mod10.js":
+/*!**********************!*\
+ !*** ./src/mod10.js ***!
+ \**********************/
+/*! exports provided: aNamed3 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "aNamed3", function() { return aNamed3; });
+var aNamed3 = "a-named3";
+
+/***/ }),
+
+/***/ "./src/mod11.js":
+/*!**********************!*\
+ !*** ./src/mod11.js ***!
+ \**********************/
+/*! exports provided: original */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "original", function() { return original; });
+var original = "an-original3";
+
+/***/ }),
+
+/***/ "./src/mod2.js":
+/*!*********************!*\
+ !*** ./src/mod2.js ***!
+ \*********************/
+/*! exports provided: aNamed */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "aNamed", function() { return aNamed; });
+var aNamed = "a-named";
+
+/***/ }),
+
+/***/ "./src/mod3.js":
+/*!*********************!*\
+ !*** ./src/mod3.js ***!
+ \*********************/
+/*! exports provided: original */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "original", function() { return original; });
+var original = "an-original";
+
+/***/ }),
+
+/***/ "./src/mod4.js":
+/*!*********************!*\
+ !*** ./src/mod4.js ***!
+ \*********************/
+/*! exports provided: default, aNamed */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "aNamed", function() { return aNamed; });
+/* harmony default export */ __webpack_exports__["default"] = ("a-default");
+var aNamed = "a-named";
+
+/***/ }),
+
+/***/ "./src/mod5.js":
+/*!*********************!*\
+ !*** ./src/mod5.js ***!
+ \*********************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = ("a-default2");
+
+/***/ }),
+
+/***/ "./src/mod6.js":
+/*!*********************!*\
+ !*** ./src/mod6.js ***!
+ \*********************/
+/*! exports provided: aNamed2 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "aNamed2", function() { return aNamed2; });
+var aNamed2 = "a-named2";
+
+/***/ }),
+
+/***/ "./src/mod7.js":
+/*!*********************!*\
+ !*** ./src/mod7.js ***!
+ \*********************/
+/*! exports provided: original */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "original", function() { return original; });
+var original = "an-original2";
+
+/***/ }),
+
+/***/ "./src/mod9.js":
+/*!*********************!*\
+ !*** ./src/mod9.js ***!
+ \*********************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = ("a-default3");
+
+/***/ }),
+
+/***/ "./src/optimized-out.js":
+/*!******************************!*\
+ !*** ./src/optimized-out.js ***!
+ \******************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return optimizedOut; });
+function optimizedOut() {}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=esmodules.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/esmodules.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/esmodules.js.map
new file mode 100644
index 0000000000..0d77462d3e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/esmodules.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel7://./esmodules/webpack/bootstrap","webpack4-babel7://./esmodules/./input.js","webpack4-babel7://./esmodules/./src/mod1.js","webpack4-babel7://./esmodules/./src/mod10.js","webpack4-babel7://./esmodules/./src/mod11.js","webpack4-babel7://./esmodules/./src/mod2.js","webpack4-babel7://./esmodules/./src/mod3.js","webpack4-babel7://./esmodules/./src/mod4.js","webpack4-babel7://./esmodules/./src/mod5.js","webpack4-babel7://./esmodules/./src/mod6.js","webpack4-babel7://./esmodules/./src/mod7.js","webpack4-babel7://./esmodules/./src/mod9.js","webpack4-babel7://./esmodules/./src/optimized-out.js"],"names":["optimizedOut","root","console","log","aDefault2","anAliased2","aNamed2","anotherNamed2","e","example","aNamed3","original","aNamed"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;AClFA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA,mEAAAA;AAEe,SAASC,IAAT,GAAgB;AAC7BC,UAAQC,GAAR,CAAY,YAAZ,EAA0BF,IAA1B;AAEAC,UAAQC,GAAR,CAAY,iDAAZ;AACAD,UAAQC,GAAR,CAAY,kDAAZ;AACAD,UAAQC,GAAR,CAAY,gDAAZ;AACAD,UAAQC,GAAR,CAAY,gDAAZ;AACAD,UAAQC,GAAR,CAAY,sCAAZ;;AAEA,MAAI;AACF;AACA;AACAD,YAAQC,GAAR,CAAY,yDAAAC,EAAZ;AACAF,YAAQC,GAAR,CAAY,0DAAAE,EAAZ;AACAH,YAAQC,GAAR,CAAY,yDAAAG,EAAZ;AACAJ,YAAQC,GAAR,CAAY,yDAAAI,EAAZ;AAEAL,YAAQC,GAAR,CAAY,IAAI,iDAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,mDAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,kDAAJ,EAAZ;AACAD,YAAQC,GAAR,CAAY,IAAI,kDAAJ,EAAZ;AACD,GAZD,CAYE,OAAOK,CAAP,EAAU,CAAE;AACf;AAEM,SAASC,OAAT,GAAkB,CAAE,C;;;;;;;;;;;;;ACxC3B,+DAAe,WAAf,E;;;;;;;;;;;;;;ACAO,IAAMC,UAAU,UAAhB,C;;;;;;;;;;;;;;ACAA,IAAMC,WAAW,cAAjB,C;;;;;;;;;;;;;;ACAA,IAAMC,SAAS,SAAf,C;;;;;;;;;;;;;;ACAA,IAAMD,WAAW,aAAjB,C;;;;;;;;;;;;;;ACAP,+DAAe,WAAf;AACO,IAAMC,SAAS,SAAf,C;;;;;;;;;;;;;ACDP,+DAAe,YAAf,E;;;;;;;;;;;;;;ACAO,IAAMN,UAAU,UAAhB,C;;;;;;;;;;;;;;ACAA,IAAMK,WAAW,cAAjB,C;;;;;;;;;;;;;ACAP,+DAAe,YAAf,E;;;;;;;;;;;;;;ACAe,SAASX,YAAT,GAAwB,CAAE,C","file":"esmodules.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","import aDefault from \"./src/mod1\";\nimport { aNamed, aNamed as anotherNamed } from \"./src/mod2\";\nimport { original as anAliased } from \"./src/mod3\";\nimport * as aNamespace from \"./src/mod4\";\n\nimport aDefault2 from \"./src/mod5\";\nimport { aNamed2, aNamed2 as anotherNamed2 } from \"./src/mod6\";\nimport { original as anAliased2 } from \"./src/mod7\";\n\nimport aDefault3 from \"./src/mod9\";\nimport { aNamed3, aNamed3 as anotherNamed3 } from \"./src/mod10\";\nimport { original as anAliased3 } from \"./src/mod11\";\n\nimport optimizedOut from \"./src/optimized-out\";\noptimizedOut();\n\nexport default function root() {\n console.log(\"pause here\", root);\n\n console.log(aDefault);\n console.log(anAliased);\n console.log(aNamed);\n console.log(anotherNamed);\n console.log(aNamespace);\n\n try {\n // None of these are callable in this code, but we still want to make sure\n // they map properly even if the only reference is in a call expressions.\n console.log(aDefault2());\n console.log(anAliased2());\n console.log(aNamed2());\n console.log(anotherNamed2());\n\n console.log(new aDefault3());\n console.log(new anAliased3());\n console.log(new aNamed3());\n console.log(new anotherNamed3());\n } catch (e) {}\n}\n\nexport function example(){}\n","export default \"a-default\";\n","export const aNamed3 = \"a-named3\";\n","export const original = \"an-original3\";\n","export const aNamed = \"a-named\";\n","export const original = \"an-original\";\n","export default \"a-default\";\nexport const aNamed = \"a-named\";\n","export default \"a-default2\";\n","export const aNamed2 = \"a-named2\";\n","export const original = \"an-original2\";\n","export default \"a-default3\";\n","export default function optimizedOut() {}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/eval-maps.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/eval-maps.js
new file mode 100644
index 0000000000..4493bd6cdb
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/eval-maps.js
@@ -0,0 +1,116 @@
+var webpack4Babel7EvalMaps =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+function root() {
+ var one = 1;
+ var two = 2;
+ var three = 3;
+ one;
+ two;
+ {
+ var _two = 4;
+ var _three = 5;
+ console.log("pause here", one, _two, _three);
+ }
+}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=eval-maps.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/eval-maps.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/eval-maps.js.map
new file mode 100644
index 0000000000..99ed41d4c7
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/eval-maps.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel7://./eval-maps/webpack/bootstrap","webpack4-babel7://./eval-maps/./input.js"],"names":["root","one","two","three","console","log"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;ACjFe,SAASA,IAAT,GAAgB;AAC7B,MAAIC,MAAM,CAAV;AACA,MAAIC,MAAM,CAAV;AACA,MAAMC,QAAQ,CAAd;AAEAF;AACAC;AAEA;AACE,QAAIA,OAAM,CAAV;AACA,QAAMC,SAAQ,CAAd;AAEAC,YAAQC,GAAR,CAAY,YAAZ,EAA0BJ,GAA1B,EAA+BC,IAA/B,EAAoCC,MAApC;AACD;AACF,C","file":"eval-maps.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","\nexport default function root() {\n var one = 1;\n let two = 2;\n const three = 3;\n\n one;\n two;\n\n {\n let two = 4;\n const three = 5;\n\n console.log(\"pause here\", one, two, three);\n }\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/for-loops.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/for-loops.js
new file mode 100644
index 0000000000..95e29e4a1e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/for-loops.js
@@ -0,0 +1,124 @@
+var webpack4Babel7ForLoops =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+function root() {
+ var i = 0;
+
+ for (var _i = 1; _i < 2; _i++) {
+ console.log("pause here", root);
+ }
+
+ for (var _i2 in {
+ 2: ""
+ }) {
+ console.log("pause here", root);
+ }
+
+ var _arr = [3];
+
+ for (var _i3 = 0; _i3 < _arr.length; _i3++) {
+ var _i4 = _arr[_i3];
+ console.log("pause here", root);
+ }
+}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=for-loops.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/for-loops.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/for-loops.js.map
new file mode 100644
index 0000000000..7b7c812292
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/for-loops.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel7://./for-loops/webpack/bootstrap","webpack4-babel7://./for-loops/./input.js"],"names":["root","i","console","log"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;AClFe,SAASA,IAAT,GAAgB;AAC7B,MAAIC,IAAI,CAAR;;AAEA,OAAK,IAAIA,KAAI,CAAb,EAAgBA,KAAI,CAApB,EAAuBA,IAAvB,EAA4B;AAC1BC,YAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B;AACD;;AAED,OAAK,IAAIC,GAAT,IAAc;AAAE,OAAG;AAAL,GAAd,EAAyB;AACvBC,YAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B;AACD;;AAT4B,aAWf,CAAC,CAAD,CAXe;;AAW7B,8CAAmB;AAAd,QAAIC,eAAJ;AACHC,YAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B;AACD;AACF,C","file":"for-loops.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","export default function root() {\n let i = 0;\n\n for (let i = 1; i < 2; i++) {\n console.log(\"pause here\", root);\n }\n\n for (let i in { 2: \"\" }) {\n console.log(\"pause here\", root);\n }\n\n for (let i of [3]) {\n console.log(\"pause here\", root);\n }\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/for-of.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/for-of.js
new file mode 100644
index 0000000000..9b24830677
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/for-of.js
@@ -0,0 +1,118 @@
+var webpack4Babel7ForOf =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return forOf; });
+var mod = "module scoped";
+function forOf() {
+ var _arr = [1];
+
+ for (var _i = 0; _i < _arr.length; _i++) {
+ var x = _arr[_i];
+ doThing(x);
+ }
+
+ function doThing(arg) {
+ // Avoid optimize out
+ window.console;
+ }
+}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=for-of.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/for-of.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/for-of.js.map
new file mode 100644
index 0000000000..736e616708
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/for-of.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel7://./for-of/webpack/bootstrap","webpack4-babel7://./for-of/./input.js"],"names":["mod","forOf","x","doThing","arg","window","console"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;AClFA;AAAA,IAAMA,MAAM,eAAZ;AAEe,SAASC,KAAT,GAAiB;AAAA,aACd,CAAC,CAAD,CADc;;AAC9B,2CAAqB;AAAhB,QAAMC,YAAN;AACHC,YAAQD,CAAR;AACD;;AAED,WAASC,OAAT,CAAiBC,GAAjB,EAAsB;AACpB;AACAC,WAAOC,OAAP;AACD;AACF,C","file":"for-of.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","const mod = \"module scoped\";\n\nexport default function forOf() {\n for (const x of [1]) {\n doThing(x);\n }\n\n function doThing(arg) {\n // Avoid optimize out\n window.console;\n }\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/functions.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/functions.js
new file mode 100644
index 0000000000..65562ca6d6
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/functions.js
@@ -0,0 +1,119 @@
+var webpack4Babel7Functions =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+function root() {
+ function decl(p1) {
+ var inner = function inner(p2) {
+ var arrow = function arrow(p3) {
+ console.log("pause here", p3, arrow, p2, inner, p1, decl, root);
+ };
+
+ arrow();
+ };
+
+ inner();
+ }
+
+ decl();
+}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=functions.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/functions.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/functions.js.map
new file mode 100644
index 0000000000..26e35dd38d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/functions.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel7://./functions/webpack/bootstrap","webpack4-babel7://./functions/./input.js"],"names":["root","decl","p1","inner","p2","arrow","p3","console","log"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;AClFe,SAASA,IAAT,GAAgB;AAE7B,WAASC,IAAT,CAAcC,EAAd,EAAkB;AAChB,QAAMC,QAAQ,SAASA,KAAT,CAAeC,EAAf,EAAmB;AAC/B,UAAMC,QAAQ,SAARA,KAAQ,CAACC,EAAD,EAAQ;AACpBC,gBAAQC,GAAR,CAAY,YAAZ,EAA0BF,EAA1B,EAA8BD,KAA9B,EAAqCD,EAArC,EAAyCD,KAAzC,EAAgDD,EAAhD,EAAoDD,IAApD,EAA0DD,IAA1D;AACD,OAFD;;AAGAK;AACD,KALD;;AAMAF;AACD;;AAEDF;AACD,C","file":"functions.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","export default function root() {\n\n function decl(p1) {\n const inner = function inner(p2) {\n const arrow = (p3) => {\n console.log(\"pause here\", p3, arrow, p2, inner, p1, decl, root);\n };\n arrow();\n };\n inner();\n }\n\n decl();\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/lex-and-nonlex.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/lex-and-nonlex.js
new file mode 100644
index 0000000000..2607efacba
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/lex-and-nonlex.js
@@ -0,0 +1,117 @@
+var webpack4Babel7LexAndNonlex =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function root() {
+ function someHelper() {
+ console.log("pause here", root, Thing);
+ }
+
+ var Thing = function Thing() {
+ _classCallCheck(this, Thing);
+ };
+
+ someHelper();
+}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=lex-and-nonlex.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/lex-and-nonlex.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/lex-and-nonlex.js.map
new file mode 100644
index 0000000000..9c9c2defd8
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/lex-and-nonlex.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel7://./lex-and-nonlex/webpack/bootstrap","webpack4-babel7://./lex-and-nonlex/./input.js"],"names":["root","someHelper","console","log","Thing"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;;;AClFe,SAASA,IAAT,GAAgB;AAC7B,WAASC,UAAT,GAAqB;AACnBC,YAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B,EAAgCI,KAAhC;AACD;;AAH4B,MAKvBA,KALuB;AAAA;AAAA;;AAO7BH;AACD,C","file":"lex-and-nonlex.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","export default function root() {\n function someHelper(){\n console.log(\"pause here\", root, Thing);\n }\n\n class Thing {}\n\n someHelper();\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/line-start-bindings-es6.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/line-start-bindings-es6.js
new file mode 100644
index 0000000000..845e93d527
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/line-start-bindings-es6.js
@@ -0,0 +1,124 @@
+var webpack4Babel7LineStartBindingsEs6 =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+function root() {
+ function aFunc() {
+ // Since these bindings are on their own linem, the mappings will
+ // extend to the start of the line, rather than starting at the first
+ // character of the binding.
+ const {
+ one,
+ two
+ } = {
+ one: 1,
+ two: 2
+ }; // The 'this' binding here is also its own line, so the comment above
+ // applies here too.
+
+ this.thing = 4;
+ console.log("pause here", root);
+ }
+
+ aFunc.call({});
+}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=line-start-bindings-es6.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/line-start-bindings-es6.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/line-start-bindings-es6.js.map
new file mode 100644
index 0000000000..5f0e7ec264
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/line-start-bindings-es6.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel7://./line-start-bindings-es6/webpack/bootstrap","webpack4-babel7://./line-start-bindings-es6/./input.js"],"names":["root","aFunc","one","two","thing","console","log","call"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;ACjFe,SAASA,IAAT,GAAgB;AAC7B,WAASC,KAAT,GAAgB;AACd;AACA;AACA;AACA,UAAM;AACJC,SADI;AAEJC;AAFI,QAGF;AACFD,WAAK,CADH;AAEFC,WAAK;AAFH,KAHJ,CAJc,CAYd;AACA;;AACA,SAAKC,KAAL,GAAa,CAAb;AAEAC,YAAQC,GAAR,CAAY,YAAZ,EAA0BN,IAA1B;AACD;;AAEDC,QAAMM,IAAN,CAAW,EAAX;AACD,C","file":"line-start-bindings-es6.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","\nexport default function root() {\n function aFunc(){\n // Since these bindings are on their own linem, the mappings will\n // extend to the start of the line, rather than starting at the first\n // character of the binding.\n const {\n one,\n two\n } = {\n one: 1,\n two: 2,\n };\n\n // The 'this' binding here is also its own line, so the comment above\n // applies here too.\n this.thing = 4;\n\n console.log(\"pause here\", root);\n }\n\n aFunc.call({ });\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/modules-cjs.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/modules-cjs.js
new file mode 100644
index 0000000000..152fa2c0ee
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/modules-cjs.js
@@ -0,0 +1,112 @@
+var webpack4Babel7ModulesCjs =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var moduleScoped = 1;
+var alsoModuleScoped = 2;
+
+function thirdModuleScoped() {}
+
+exports.default = function () {
+ console.log("pause here", moduleScoped, alsoModuleScoped, thirdModuleScoped);
+};
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=modules-cjs.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/modules-cjs.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/modules-cjs.js.map
new file mode 100644
index 0000000000..52658ebde7
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/modules-cjs.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel7://./modules-cjs/webpack/bootstrap","webpack4-babel7://./modules-cjs/./input.js"],"names":["moduleScoped","alsoModuleScoped","thirdModuleScoped","exports","default","console","log"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;AClFA,IAAIA,eAAe,CAAnB;AACA,IAAIC,mBAAmB,CAAvB;;AAEA,SAASC,iBAAT,GAA6B,CAAE;;AAE/BC,QAAQC,OAAR,GAAkB,YAAW;AAC3BC,UAAQC,GAAR,CAAY,YAAZ,EAA0BN,YAA1B,EAAwCC,gBAAxC,EAA0DC,iBAA1D;AACD,CAFD,C","file":"modules-cjs.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","var moduleScoped = 1;\nlet alsoModuleScoped = 2;\n\nfunction thirdModuleScoped() {}\n\nexports.default = function() {\n console.log(\"pause here\", moduleScoped, alsoModuleScoped, thirdModuleScoped);\n};\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/out-of-order-declarations-cjs.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/out-of-order-declarations-cjs.js
new file mode 100644
index 0000000000..f04b7c2989
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/out-of-order-declarations-cjs.js
@@ -0,0 +1,150 @@
+var webpack4Babel7OutOfOrderDeclarationsCjs =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = root;
+
+var _mod = _interopRequireDefault(__webpack_require__(/*! ./src/mod */ "./src/mod.js"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+var val = "outer-value";
+
+function root() {
+ var val = "middle-value";
+
+ var fn = function outerFn(outer) {};
+
+ function callback() {
+ console.log("pause here", val, _mod.default, fn);
+ var val = "inner-value";
+
+ function fn(inner) {}
+
+ ;
+ }
+
+ callback();
+}
+
+/***/ }),
+
+/***/ "./src/mod.js":
+/*!********************!*\
+ !*** ./src/mod.js ***!
+ \********************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+var _default = "a-default";
+exports.default = _default;
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=out-of-order-declarations-cjs.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/out-of-order-declarations-cjs.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/out-of-order-declarations-cjs.js.map
new file mode 100644
index 0000000000..e571a0bf1f
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/out-of-order-declarations-cjs.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel7://./out-of-order-declarations-cjs/webpack/bootstrap","webpack4-babel7://./out-of-order-declarations-cjs/./input.js","webpack4-babel7://./out-of-order-declarations-cjs/./src/mod.js"],"names":["val","root","fn","outerFn","outer","callback","console","log","aDefault","inner"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;;;;;;AClEA;;;;AAhBA,IAAIA,MAAM,aAAV;;AAEe,SAASC,IAAT,GAAgB;AAC7B,MAAID,MAAM,cAAV;;AACA,MAAIE,KAAK,SAASC,OAAT,CAAiBC,KAAjB,EAAuB,CAAE,CAAlC;;AAEA,WAASC,QAAT,GAAoB;AAClBC,YAAQC,GAAR,CAAY,YAAZ,EAA0BP,GAA1B,EAA+BQ,YAA/B,EAAyCN,EAAzC;AAEA,QAAIF,MAAM,aAAV;;AACA,aAASE,EAAT,CAAYO,KAAZ,EAAkB,CAAE;;AAAA;AACrB;;AAEDJ;AACD,C;;;;;;;;;;;;;;;;;;eCdc,W","file":"out-of-order-declarations-cjs.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","var val = \"outer-value\";\n\nexport default function root() {\n var val = \"middle-value\";\n var fn = function outerFn(outer){};\n\n function callback() {\n console.log(\"pause here\", val, aDefault, fn);\n\n var val = \"inner-value\";\n function fn(inner){};\n }\n\n callback();\n}\n\nimport aDefault from \"./src/mod\";\n","export default \"a-default\";\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/shadowed-vars.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/shadowed-vars.js
new file mode 100644
index 0000000000..2737148c2b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/shadowed-vars.js
@@ -0,0 +1,128 @@
+var webpack4Babel7ShadowedVars =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+/* harmony default export */ __webpack_exports__["default"] = (function () {
+ var aVar = "var1";
+ var aLet = "let1";
+ var aConst = "const1";
+
+ var Outer = function Outer() {
+ _classCallCheck(this, Outer);
+ };
+
+ {
+ var _Outer = function _Outer() {};
+
+ var aVar = "var2";
+ var _aLet = "let2";
+ var _aConst = "const2";
+ {
+ var aVar = "var3";
+ var _aLet2 = "let3";
+ var _aConst2 = "const3";
+ console.log("pause here");
+ }
+ }
+});
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=shadowed-vars.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/shadowed-vars.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/shadowed-vars.js.map
new file mode 100644
index 0000000000..90db6ae668
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/shadowed-vars.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel7://./shadowed-vars/webpack/bootstrap","webpack4-babel7://./shadowed-vars/./input.js"],"names":["aVar","aLet","aConst","Outer","console","log"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;;AClFA,+DAAe,YAAW;AACxB,MAAIA,OAAO,MAAX;AACA,MAAIC,OAAO,MAAX;AACA,MAAMC,SAAS,QAAf;;AAHwB,MAKlBC,KALkB;AAAA;AAAA;;AAMxB;AAAA,QACWA,MADX,GACE,SAASA,MAAT,GAAiB,CAAE,CADrB;;AAGE,QAAIH,OAAO,MAAX;AACA,QAAIC,QAAO,MAAX;AACA,QAAMC,UAAS,QAAf;AACA;AACE,UAAIF,OAAO,MAAX;AACA,UAAIC,SAAO,MAAX;AACA,UAAMC,WAAS,QAAf;AAEAE,cAAQC,GAAR,CAAY,YAAZ;AACD;AACF;AACF,C","file":"shadowed-vars.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","export default function() {\n var aVar = \"var1\";\n let aLet = \"let1\";\n const aConst = \"const1\";\n\n class Outer {}\n {\n function Outer() {}\n\n var aVar = \"var2\";\n let aLet = \"let2\";\n const aConst = \"const2\";\n {\n var aVar = \"var3\";\n let aLet = \"let3\";\n const aConst = \"const3\";\n\n console.log(\"pause here\");\n }\n }\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-for-of-array-closure.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-for-of-array-closure.js
new file mode 100644
index 0000000000..fdc5568c7d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-for-of-array-closure.js
@@ -0,0 +1,122 @@
+var webpack4Babel7StepOverForOfArrayClosure =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+// Babel will optimize this for..of because it call tell the value is an array.
+function root() {
+ console.log("pause here");
+ var _arr = [1, 2];
+
+ var _loop = function _loop() {
+ var val = _arr[_i];
+ console.log("pause again", function () {
+ return val;
+ }());
+ };
+
+ for (var _i = 0; _i < _arr.length; _i++) {
+ _loop();
+ }
+
+ console.log("done");
+}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=step-over-for-of-array-closure.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-for-of-array-closure.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-for-of-array-closure.js.map
new file mode 100644
index 0000000000..adffdab378
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-for-of-array-closure.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel7://./step-over-for-of-array-closure/webpack/bootstrap","webpack4-babel7://./step-over-for-of-array-closure/./input.js"],"names":["root","console","log","val"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;AClFA;AAAA;AACe,SAASA,IAAT,GAAgB;AAC7BC,UAAQC,GAAR,CAAY,YAAZ;AAD6B,aAGX,CAAC,CAAD,EAAI,CAAJ,CAHW;;AAAA;AAGxB,QAAMC,cAAN;AACHF,YAAQC,GAAR,CAAY,aAAZ,EAA4B;AAAA,aAAMC,GAAN;AAAA,KAAD,EAA3B;AAJ2B;;AAG7B,2CAA0B;AAAA;AAEzB;;AAEDF,UAAQC,GAAR,CAAY,MAAZ;AACD,C","file":"step-over-for-of-array-closure.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","// Babel will optimize this for..of because it call tell the value is an array.\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of [1, 2]) {\n console.log(\"pause again\", (() => val)());\n }\n\n console.log(\"done\");\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-for-of-array.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-for-of-array.js
new file mode 100644
index 0000000000..a39280c93c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-for-of-array.js
@@ -0,0 +1,116 @@
+var webpack4Babel7StepOverForOfArray =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+// Babel will optimize this for..of because it call tell the value is an array.
+function root() {
+ console.log("pause here");
+ var _arr = [1, 2];
+
+ for (var _i = 0; _i < _arr.length; _i++) {
+ var val = _arr[_i];
+ console.log("pause again", val);
+ }
+
+ console.log("done");
+}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=step-over-for-of-array.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-for-of-array.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-for-of-array.js.map
new file mode 100644
index 0000000000..e3a2d48a2d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-for-of-array.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel7://./step-over-for-of-array/webpack/bootstrap","webpack4-babel7://./step-over-for-of-array/./input.js"],"names":["root","console","log","val"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;AClFA;AAAA;AACe,SAASA,IAAT,GAAgB;AAC7BC,UAAQC,GAAR,CAAY,YAAZ;AAD6B,aAGX,CAAC,CAAD,EAAI,CAAJ,CAHW;;AAG7B,2CAA0B;AAArB,QAAMC,cAAN;AACHF,YAAQC,GAAR,CAAY,aAAZ,EAA2BC,GAA3B;AACD;;AAEDF,UAAQC,GAAR,CAAY,MAAZ;AACD,C","file":"step-over-for-of-array.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","// Babel will optimize this for..of because it call tell the value is an array.\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of [1, 2]) {\n console.log(\"pause again\", val);\n }\n\n console.log(\"done\");\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-for-of-closure.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-for-of-closure.js
new file mode 100644
index 0000000000..cbc8928b2c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-for-of-closure.js
@@ -0,0 +1,123 @@
+var webpack4Babel7StepOverForOfClosure =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+// Babel will convert the loop body to a function to handle the 'val' lexical
+// enclosure behavior.
+var vals = [1, 2];
+function root() {
+ console.log("pause here");
+
+ var _loop = function _loop() {
+ var val = vals[_i];
+ console.log("pause again", function () {
+ return val;
+ }());
+ };
+
+ for (var _i = 0; _i < vals.length; _i++) {
+ _loop();
+ }
+
+ console.log("done");
+}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=step-over-for-of-closure.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-for-of-closure.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-for-of-closure.js.map
new file mode 100644
index 0000000000..0baf26d862
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-for-of-closure.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel7://./step-over-for-of-closure/webpack/bootstrap","webpack4-babel7://./step-over-for-of-closure/./input.js"],"names":["vals","root","console","log","val"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;AClFA;AAAA;AACA;AACA,IAAMA,OAAO,CAAC,CAAD,EAAI,CAAJ,CAAb;AAEe,SAASC,IAAT,GAAgB;AAC7BC,UAAQC,GAAR,CAAY,YAAZ;;AAD6B;AAGxB,QAAMC,MAAOJ,IAAP,IAAN;AACHE,YAAQC,GAAR,CAAY,aAAZ,EAA4B;AAAA,aAAMC,GAAN;AAAA,KAAD,EAA3B;AAJ2B;;AAG7B,wBAAkBJ,IAAlB,eAAwB;AAAA;AAEvB;;AAEDE,UAAQC,GAAR,CAAY,MAAZ;AACD,C","file":"step-over-for-of-closure.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","// Babel will convert the loop body to a function to handle the 'val' lexical\n// enclosure behavior.\nconst vals = [1, 2];\n\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of vals) {\n console.log(\"pause again\", (() => val)());\n }\n\n console.log(\"done\");\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-for-of.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-for-of.js
new file mode 100644
index 0000000000..375c78d8b6
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-for-of.js
@@ -0,0 +1,115 @@
+var webpack4Babel7StepOverForOf =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+var vals = [1, 2];
+function root() {
+ console.log("pause here");
+
+ for (var _i = 0; _i < vals.length; _i++) {
+ var val = vals[_i];
+ console.log("pause again", val);
+ }
+
+ console.log("done");
+}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=step-over-for-of.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-for-of.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-for-of.js.map
new file mode 100644
index 0000000000..7032caf9b6
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-for-of.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel7://./step-over-for-of/webpack/bootstrap","webpack4-babel7://./step-over-for-of/./input.js"],"names":["vals","root","console","log","val"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;AClFA;AAAA,IAAMA,OAAO,CAAC,CAAD,EAAI,CAAJ,CAAb;AAEe,SAASC,IAAT,GAAgB;AAC7BC,UAAQC,GAAR,CAAY,YAAZ;;AAEA,wBAAkBH,IAAlB,eAAwB;AAAnB,QAAMI,MAAOJ,IAAP,IAAN;AACHE,YAAQC,GAAR,CAAY,aAAZ,EAA2BC,GAA3B;AACD;;AAEDF,UAAQC,GAAR,CAAY,MAAZ;AACD,C","file":"step-over-for-of.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","const vals = [1, 2];\n\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of vals) {\n console.log(\"pause again\", val);\n }\n\n console.log(\"done\");\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-function-params.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-function-params.js
new file mode 100644
index 0000000000..d69208a19a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-function-params.js
@@ -0,0 +1,127 @@
+var webpack4Babel7StepOverFunctionParams =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return fn; });
+function test(a1) {
+ var a2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 45;
+
+ var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
+ a3 = _ref.a3,
+ a4 = _ref.a4,
+ _ref$a = _ref.a5;
+
+ _ref$a = _ref$a === void 0 ? {} : _ref$a;
+ var a7 = _ref$a.a6;
+ console.log("pause next here");
+}
+
+function fn() {
+ console.log("pause here");
+ test("1", undefined, {
+ a3: "3",
+ a4: "4",
+ a5: {
+ a6: "7"
+ }
+ });
+}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=step-over-function-params.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-function-params.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-function-params.js.map
new file mode 100644
index 0000000000..a5040640eb
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-function-params.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel7://./step-over-function-params/webpack/bootstrap","webpack4-babel7://./step-over-function-params/./input.js"],"names":["test","a1","a2","a3","a4","a5","a7","a6","console","log","fn","undefined"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;AClFA;AAAA,SAASA,IAAT,CAAcC,EAAd,EAAiE;AAAA,MAA/CC,EAA+C,uEAA1C,EAA0C;;AAAA,iFAAJ,EAAI;AAAA,MAApCC,EAAoC,QAApCA,EAAoC;AAAA,MAAhCC,EAAgC,QAAhCA,EAAgC;AAAA,oBAA5BC,EAA4B;;AAAA,+BAAX,EAAW;AAAA,MAAlBC,EAAkB,UAAtBC,EAAsB;AAC/DC,UAAQC,GAAR,CAAY,iBAAZ;AACD;;AAEc,SAASC,EAAT,GAAc;AAC3BF,UAAQC,GAAR,CAAY,YAAZ;AACAT,OAAK,GAAL,EAAUW,SAAV,EAAqB;AAAER,QAAI,GAAN;AAAWC,QAAI,GAAf;AAAoBC,QAAI;AAAEE,UAAI;AAAN;AAAxB,GAArB;AACD,C","file":"step-over-function-params.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","function test(a1, a2 = 45, { a3, a4, a5: { a6: a7 } = {} } = {}) {\n console.log(\"pause next here\");\n}\n\nexport default function fn() {\n console.log(\"pause here\");\n test(\"1\", undefined, { a3: \"3\", a4: \"4\", a5: { a6: \"7\" } });\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-regenerator-await.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-regenerator-await.js
new file mode 100644
index 0000000000..3b12991604
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-regenerator-await.js
@@ -0,0 +1,145 @@
+var webpack4Babel7StepOverRegeneratorAwait =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
+
+function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
+
+var fn =
+/*#__PURE__*/
+function () {
+ var _fn = _asyncToGenerator(
+ /*#__PURE__*/
+ regeneratorRuntime.mark(function _callee() {
+ return regeneratorRuntime.wrap(function _callee$(_context) {
+ while (1) {
+ switch (_context.prev = _context.next) {
+ case 0:
+ console.log("pause here");
+ _context.next = 3;
+ return doAsync();
+
+ case 3:
+ console.log("stopped here");
+
+ case 4:
+ case "end":
+ return _context.stop();
+ }
+ }
+ }, _callee, this);
+ }));
+
+ return function fn() {
+ return _fn.apply(this, arguments);
+ };
+}();
+
+function doAsync() {
+ return Promise.resolve();
+}
+
+function root() {
+ fn();
+}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=step-over-regenerator-await.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-regenerator-await.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-regenerator-await.js.map
new file mode 100644
index 0000000000..ce285c27e6
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/step-over-regenerator-await.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel7://./step-over-regenerator-await/webpack/bootstrap","webpack4-babel7://./step-over-regenerator-await/./input.js"],"names":["fn","console","log","doAsync","Promise","resolve","root"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;;;;;AClFA,IAAIA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAAK;AAAA;AAAA;AAAA;AAAA;AACPC,oBAAQC,GAAR,CAAY,YAAZ;AADO;AAAA,mBAGDC,SAHC;;AAAA;AAKPF,oBAAQC,GAAR,CAAY,cAAZ;;AALO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAAL;;AAAA,kBAAoBF,EAApB;AAAA;AAAA;AAAA,GAAJ;;AAQA,SAASG,OAAT,GAAmB;AACjB,SAAOC,QAAQC,OAAR,EAAP;AACD;;AAEc,SAASC,IAAT,GAAgB;AAC7BN;AACD,C","file":"step-over-regenerator-await.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","var fn = async function fn() {\n console.log(\"pause here\");\n\n await doAsync();\n\n console.log(\"stopped here\");\n};\n\nfunction doAsync() {\n return Promise.resolve();\n}\n\nexport default function root() {\n fn();\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/switches.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/switches.js
new file mode 100644
index 0000000000..fd4b57a2ce
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/switches.js
@@ -0,0 +1,119 @@
+var webpack4Babel7Switches =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+function root() {
+ var val = 1;
+
+ switch (true) {
+ case true:
+ var _val = 2;
+ console.log("pause here", root);
+
+ default:
+ {
+ var _val2 = 3;
+ console.log("pause here", root);
+ }
+ }
+}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=switches.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/switches.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/switches.js.map
new file mode 100644
index 0000000000..e703ff624e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/switches.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel7://./switches/webpack/bootstrap","webpack4-babel7://./switches/./input.js"],"names":["root","val","console","log"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;AClFe,SAASA,IAAT,GAAgB;AAC7B,MAAIC,MAAM,CAAV;;AAEA,UAAQ,IAAR;AACE,SAAK,IAAL;AACE,UAAIA,OAAM,CAAV;AACAC,cAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B;;AACF;AAAS;AACP,YAAIC,QAAM,CAAV;AACAC,gBAAQC,GAAR,CAAY,YAAZ,EAA0BH,IAA1B;AACD;AAPH;AASD,C","file":"switches.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","export default function root() {\n let val = 1;\n\n switch (true) {\n case true:\n let val = 2;\n console.log(\"pause here\", root);\n default: {\n let val = 3;\n console.log(\"pause here\", root);\n }\n }\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/this-arguments-bindings.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/this-arguments-bindings.js
new file mode 100644
index 0000000000..1350f401f1
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/this-arguments-bindings.js
@@ -0,0 +1,122 @@
+var webpack4Babel7ThisArgumentsBindings =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+function root() {
+ function fn(arg) {
+ var _this = this,
+ _arguments = arguments;
+
+ console.log(this, arguments);
+ console.log("pause here", fn, root);
+
+ var arrow = function arrow(argArrow) {
+ console.log(_this, _arguments);
+ console.log("pause here", fn, root);
+ };
+
+ arrow("arrow-arg");
+ }
+
+ fn.call("this-value", "arg-value");
+}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=this-arguments-bindings.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/this-arguments-bindings.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/this-arguments-bindings.js.map
new file mode 100644
index 0000000000..ecb6de3906
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/this-arguments-bindings.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel7://./this-arguments-bindings/webpack/bootstrap","webpack4-babel7://./this-arguments-bindings/./input.js"],"names":["root","fn","arg","console","log","arguments","arrow","call"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;AClFe,SAASA,IAAT,GAAgB;AAC7B,WAASC,EAAT,CAAYC,GAAZ,EAAiB;AAAA;AAAA;;AACfC,YAAQC,GAAR,CAAY,IAAZ,EAAkBC,SAAlB;AACAF,YAAQC,GAAR,CAAY,YAAZ,EAA0BH,EAA1B,EAA8BD,IAA9B;;AAEA,QAAMM,QAAQ,SAARA,KAAQ,WAAY;AACxBH,cAAQC,GAAR,CAAY,KAAZ,EAAkBC,UAAlB;AACAF,cAAQC,GAAR,CAAY,YAAZ,EAA0BH,EAA1B,EAA8BD,IAA9B;AACD,KAHD;;AAIAM,UAAM,WAAN;AACD;;AAEDL,KAAGM,IAAH,CAAQ,YAAR,EAAsB,WAAtB;AACD,C","file":"this-arguments-bindings.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","export default function root() {\n function fn(arg) {\n console.log(this, arguments);\n console.log(\"pause here\", fn, root);\n\n const arrow = argArrow => {\n console.log(this, arguments);\n console.log(\"pause here\", fn, root);\n };\n arrow(\"arrow-arg\");\n }\n\n fn.call(\"this-value\", \"arg-value\");\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/try-catches.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/try-catches.js
new file mode 100644
index 0000000000..eacde77453
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/try-catches.js
@@ -0,0 +1,114 @@
+var webpack4Babel7TryCatches =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+function root() {
+ var one = 1;
+
+ try {
+ throw "AnError";
+ } catch (err) {
+ var two = 2;
+ console.log("pause here", root);
+ }
+}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=try-catches.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/try-catches.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/try-catches.js.map
new file mode 100644
index 0000000000..58a8c7b30b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/try-catches.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel7://./try-catches/webpack/bootstrap","webpack4-babel7://./try-catches/./input.js"],"names":["root","one","err","two","console","log"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;AClFe,SAASA,IAAT,GAAgB;AAC7B,MAAMC,MAAM,CAAZ;;AAEA,MAAI;AACF,UAAM,SAAN;AACD,GAFD,CAEE,OAAOC,GAAP,EAAY;AACZ,QAAIC,MAAM,CAAV;AACAC,YAAQC,GAAR,CAAY,YAAZ,EAA0BL,IAA1B;AACD;AACF,C","file":"try-catches.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","export default function root() {\n const one = 1;\n\n try {\n throw \"AnError\";\n } catch (err) {\n let two = 2;\n console.log(\"pause here\", root);\n }\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/type-module.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/type-module.js
new file mode 100644
index 0000000000..1343eb3285
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/type-module.js
@@ -0,0 +1,111 @@
+var webpack4Babel7TypeModule =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+var moduleScoped = 1;
+var alsoModuleScoped = 2;
+
+function thirdModuleScoped() {}
+
+/* harmony default export */ __webpack_exports__["default"] = (function () {
+ console.log("pause here", moduleScoped, alsoModuleScoped, thirdModuleScoped);
+});
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=type-module.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/type-module.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/type-module.js.map
new file mode 100644
index 0000000000..9fcb39c046
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/type-module.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel7://./type-module/webpack/bootstrap","webpack4-babel7://./type-module/./input.js"],"names":["moduleScoped","alsoModuleScoped","thirdModuleScoped","console","log"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;AClFA;AAAA,IAAIA,eAAe,CAAnB;AACA,IAAIC,mBAAmB,CAAvB;;AAEA,SAASC,iBAAT,GAA6B,CAAE;;AAE/B,+DAAe,YAAW;AACxBC,UAAQC,GAAR,CAAY,YAAZ,EAA0BJ,YAA1B,EAAwCC,gBAAxC,EAA0DC,iBAA1D;AACD,C","file":"type-module.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","var moduleScoped = 1;\nlet alsoModuleScoped = 2;\n\nfunction thirdModuleScoped() {}\n\nexport default function() {\n console.log(\"pause here\", moduleScoped, alsoModuleScoped, thirdModuleScoped);\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/type-script-cjs.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/type-script-cjs.js
new file mode 100644
index 0000000000..846617a5c7
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/type-script-cjs.js
@@ -0,0 +1,114 @@
+var webpack4Babel7TypeScriptCjs =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var moduleScoped = 1;
+var alsoModuleScopes = 2;
+
+function thirdModuleScoped() {}
+
+function nonModules() {
+ console.log("pause here");
+}
+
+exports.default = nonModules;
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=type-script-cjs.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/type-script-cjs.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/type-script-cjs.js.map
new file mode 100644
index 0000000000..69606f57d2
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/type-script-cjs.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel7://./type-script-cjs/webpack/bootstrap","webpack4-babel7://./type-script-cjs/./input.js"],"names":["moduleScoped","alsoModuleScopes","thirdModuleScoped","nonModules","console","log","exports","default"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;AClFA,IAAIA,eAAe,CAAnB;AACA,IAAIC,mBAAmB,CAAvB;;AAEA,SAASC,iBAAT,GAA6B,CAAE;;AAE/B,SAASC,UAAT,GAAsB;AACpBC,UAAQC,GAAR,CAAY,YAAZ;AACD;;AAEDC,QAAQC,OAAR,GAAkBJ,UAAlB,C","file":"type-script-cjs.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","var moduleScoped = 1;\nlet alsoModuleScopes = 2;\n\nfunction thirdModuleScoped() {}\n\nfunction nonModules() {\n console.log(\"pause here\");\n}\n\nexports.default = nonModules;\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/webpack-functions.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/webpack-functions.js
new file mode 100644
index 0000000000..d5d6810c53
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/webpack-functions.js
@@ -0,0 +1,115 @@
+var webpack4Babel7WebpackFunctions =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+var module = {};
+
+module.exports = function (x) {
+ return x * 2;
+};
+
+function root() {
+ // This example is structures to look like CommonJS in order to replicate
+ // a previously-encountered bug.
+ module.exports(4);
+}
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=webpack-functions.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/webpack-functions.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/webpack-functions.js.map
new file mode 100644
index 0000000000..fb9781eacf
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/webpack-functions.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel7://./webpack-functions/webpack/bootstrap","webpack4-babel7://./webpack-functions/./input.js"],"names":["module","exports","x","root"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;AClFA;AAAA,IAAIA,SAAS,EAAb;;AAEAA,OAAOC,OAAP,GAAiB,UAASC,CAAT,EAAY;AAC3B,SAAOA,IAAI,CAAX;AACD,CAFD;;AAKe,SAASC,IAAT,GAAgB;AAC7B;AACA;AACAH,SAAOC,OAAP,CAAe,CAAf;AACD,C","file":"webpack-functions.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","var module = {};\n\nmodule.exports = function(x) {\n return x * 2;\n};\n\n\nexport default function root() {\n // This example is structures to look like CommonJS in order to replicate\n // a previously-encountered bug.\n module.exports(4);\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/webpack-line-mappings.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/webpack-line-mappings.js
new file mode 100644
index 0000000000..b39d172f7a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/webpack-line-mappings.js
@@ -0,0 +1,139 @@
+var webpack4Babel7WebpackLineMappings =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+/* harmony import */ var _src_mod1__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/mod1 */ "./src/mod1.js");
+
+function root() {
+ var one = 1;
+ {
+ var two = 2;
+
+ var fn = function someName(arg) {
+ console.log(this, arguments);
+ console.log("pause here", _src_mod1__WEBPACK_IMPORTED_MODULE_0__["default"], one, two, fn, arg);
+
+ var inner = function inner(arg) {
+ var body = "42";
+ console.log("pause here", body, root);
+ };
+
+ inner();
+ };
+
+ fn.call("this-value", "arg-value");
+ }
+}
+
+/***/ }),
+
+/***/ "./src/mod1.js":
+/*!*********************!*\
+ !*** ./src/mod1.js ***!
+ \*********************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = ("a-default");
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=webpack-line-mappings.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/webpack-line-mappings.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/webpack-line-mappings.js.map
new file mode 100644
index 0000000000..2f64cc73de
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4-babel7/webpack-line-mappings.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4-babel7://./webpack-line-mappings/webpack/bootstrap","webpack4-babel7://./webpack-line-mappings/./input.js","webpack4-babel7://./webpack-line-mappings/./src/mod1.js"],"names":["root","one","two","fn","someName","arg","console","log","arguments","inner","body","call"],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;;AClFA;AAEe,SAASA,IAAT,GAAgB;AAC7B,MAAIC,MAAM,CAAV;AAEA;AACE,QAAMC,MAAM,CAAZ;;AAEA,QAAIC,KAAK,SAASC,QAAT,CAAkBC,GAAlB,EAAuB;AAC9BC,cAAQC,GAAR,CAAY,IAAZ,EAAkBC,SAAlB;AACAF,cAAQC,GAAR,CAAY,YAAZ,EAA0B,iDAA1B,EAAoCN,GAApC,EAAyCC,GAAzC,EAA8CC,EAA9C,EAAkDE,GAAlD;;AAEA,UAAII,QAAQ,SAARA,KAAQ,CAACJ,GAAD,EAAS;AAAE,YAAIK,OAAO,IAAX;AAAiBJ,gBAAQC,GAAR,CAAY,YAAZ,EAA0BG,IAA1B,EAAgCV,IAAhC;AAAwC,OAAhF;;AACAS;AACD,KAND;;AAOAN,OAAGQ,IAAH,CAAQ,YAAR,EAAsB,WAAtB;AACD;AACF,C;;;;;;;;;;;;;ACjBD,+DAAe,WAAf,E","file":"webpack-line-mappings.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","import aDefault from \"./src/mod1\";\n\nexport default function root() {\n let one = 1;\n\n {\n const two = 2;\n\n var fn = function someName(arg) {\n console.log(this, arguments);\n console.log(\"pause here\", aDefault, one, two, fn, arg);\n\n var inner = (arg) => { var body = \"42\"; console.log(\"pause here\", body, root); };\n inner();\n };\n fn.call(\"this-value\", \"arg-value\");\n }\n}\n","export default \"a-default\";\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/classes.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/classes.js
new file mode 100644
index 0000000000..4033314a54
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/classes.js
@@ -0,0 +1,127 @@
+var webpack4Classes =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+function root() {
+ let one = 1;
+
+ class Thing {
+ one() {
+ console.log("pause here");
+ }
+ }
+
+ class Another {
+ method() {
+ let two = 2;
+
+ const three = 3;
+
+ console.log("pause here", Another, one, Thing, root);
+ }
+ }
+
+ new Another().method();
+ new Thing().one();
+}
+
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=classes.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/classes.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/classes.js.map
new file mode 100644
index 0000000000..fbb6644046
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/classes.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4://./classes/webpack/bootstrap","webpack4://./classes/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;AClFA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA;AACA;AACA","file":"classes.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","export default function root() {\n let one = 1;\n\n class Thing {\n one() {\n console.log(\"pause here\");\n }\n }\n\n class Another {\n method() {\n let two = 2;\n\n const three = 3;\n\n console.log(\"pause here\", Another, one, Thing, root);\n }\n }\n\n new Another().method();\n new Thing().one();\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/esmodules-cjs.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/esmodules-cjs.js
new file mode 100644
index 0000000000..ddfe435b27
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/esmodules-cjs.js
@@ -0,0 +1,321 @@
+var webpack4EsmodulesCjs =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default, example */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "example", function() { return example; });
+/* harmony import */ var _src_mod1__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/mod1 */ "./src/mod1.js");
+/* harmony import */ var _src_mod2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./src/mod2 */ "./src/mod2.js");
+/* harmony import */ var _src_mod3__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./src/mod3 */ "./src/mod3.js");
+/* harmony import */ var _src_mod4__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./src/mod4 */ "./src/mod4.js");
+/* harmony import */ var _src_mod5__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./src/mod5 */ "./src/mod5.js");
+/* harmony import */ var _src_mod6__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./src/mod6 */ "./src/mod6.js");
+/* harmony import */ var _src_mod7__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./src/mod7 */ "./src/mod7.js");
+/* harmony import */ var _src_mod9__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./src/mod9 */ "./src/mod9.js");
+/* harmony import */ var _src_mod10__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./src/mod10 */ "./src/mod10.js");
+/* harmony import */ var _src_mod11__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./src/mod11 */ "./src/mod11.js");
+/* harmony import */ var _src_optimized_out__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./src/optimized-out */ "./src/optimized-out.js");
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Object(_src_optimized_out__WEBPACK_IMPORTED_MODULE_10__["default"])();
+
+function root() {
+ console.log("pause here", root);
+
+ console.log(_src_mod1__WEBPACK_IMPORTED_MODULE_0__["default"]);
+ console.log(_src_mod3__WEBPACK_IMPORTED_MODULE_2__["original"]);
+ console.log(_src_mod2__WEBPACK_IMPORTED_MODULE_1__["aNamed"]);
+ console.log(_src_mod2__WEBPACK_IMPORTED_MODULE_1__["aNamed"]);
+ console.log(_src_mod4__WEBPACK_IMPORTED_MODULE_3__);
+
+ try {
+ // None of these are callable in this code, but we still want to make sure
+ // they map properly even if the only reference is in a call expressions.
+ console.log(Object(_src_mod5__WEBPACK_IMPORTED_MODULE_4__["default"])());
+ console.log(Object(_src_mod7__WEBPACK_IMPORTED_MODULE_6__["original"])());
+ console.log(Object(_src_mod6__WEBPACK_IMPORTED_MODULE_5__["aNamed2"])());
+ console.log(Object(_src_mod6__WEBPACK_IMPORTED_MODULE_5__["aNamed2"])());
+
+ console.log(new _src_mod9__WEBPACK_IMPORTED_MODULE_7__["default"]());
+ console.log(new _src_mod11__WEBPACK_IMPORTED_MODULE_9__["original"]());
+ console.log(new _src_mod10__WEBPACK_IMPORTED_MODULE_8__["aNamed3"]());
+ console.log(new _src_mod10__WEBPACK_IMPORTED_MODULE_8__["aNamed3"]());
+ } catch (e) {}
+}
+
+function example(){}
+
+
+/***/ }),
+
+/***/ "./src/mod1.js":
+/*!*********************!*\
+ !*** ./src/mod1.js ***!
+ \*********************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = ("a-default");
+
+
+/***/ }),
+
+/***/ "./src/mod10.js":
+/*!**********************!*\
+ !*** ./src/mod10.js ***!
+ \**********************/
+/*! exports provided: aNamed3 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "aNamed3", function() { return aNamed3; });
+const aNamed3 = "a-named3";
+
+
+/***/ }),
+
+/***/ "./src/mod11.js":
+/*!**********************!*\
+ !*** ./src/mod11.js ***!
+ \**********************/
+/*! exports provided: original */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "original", function() { return original; });
+const original = "an-original3";
+
+
+/***/ }),
+
+/***/ "./src/mod2.js":
+/*!*********************!*\
+ !*** ./src/mod2.js ***!
+ \*********************/
+/*! exports provided: aNamed */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "aNamed", function() { return aNamed; });
+const aNamed = "a-named";
+
+
+/***/ }),
+
+/***/ "./src/mod3.js":
+/*!*********************!*\
+ !*** ./src/mod3.js ***!
+ \*********************/
+/*! exports provided: original */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "original", function() { return original; });
+const original = "an-original";
+
+
+/***/ }),
+
+/***/ "./src/mod4.js":
+/*!*********************!*\
+ !*** ./src/mod4.js ***!
+ \*********************/
+/*! exports provided: default, aNamed */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "aNamed", function() { return aNamed; });
+/* harmony default export */ __webpack_exports__["default"] = ("a-default");
+const aNamed = "a-named";
+
+
+/***/ }),
+
+/***/ "./src/mod5.js":
+/*!*********************!*\
+ !*** ./src/mod5.js ***!
+ \*********************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = ("a-default2");
+
+
+/***/ }),
+
+/***/ "./src/mod6.js":
+/*!*********************!*\
+ !*** ./src/mod6.js ***!
+ \*********************/
+/*! exports provided: aNamed2 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "aNamed2", function() { return aNamed2; });
+const aNamed2 = "a-named2";
+
+
+/***/ }),
+
+/***/ "./src/mod7.js":
+/*!*********************!*\
+ !*** ./src/mod7.js ***!
+ \*********************/
+/*! exports provided: original */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "original", function() { return original; });
+const original = "an-original2";
+
+
+/***/ }),
+
+/***/ "./src/mod9.js":
+/*!*********************!*\
+ !*** ./src/mod9.js ***!
+ \*********************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = ("a-default3");
+
+
+/***/ }),
+
+/***/ "./src/optimized-out.js":
+/*!******************************!*\
+ !*** ./src/optimized-out.js ***!
+ \******************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return optimizedOut; });
+function optimizedOut() {}
+
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=esmodules-cjs.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/esmodules-cjs.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/esmodules-cjs.js.map
new file mode 100644
index 0000000000..133617dfe9
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/esmodules-cjs.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4://./esmodules-cjs/webpack/bootstrap","webpack4://./esmodules-cjs/./input.js","webpack4://./esmodules-cjs/./src/mod1.js","webpack4://./esmodules-cjs/./src/mod10.js","webpack4://./esmodules-cjs/./src/mod11.js","webpack4://./esmodules-cjs/./src/mod2.js","webpack4://./esmodules-cjs/./src/mod3.js","webpack4://./esmodules-cjs/./src/mod4.js","webpack4://./esmodules-cjs/./src/mod5.js","webpack4://./esmodules-cjs/./src/mod6.js","webpack4://./esmodules-cjs/./src/mod7.js","webpack4://./esmodules-cjs/./src/mod9.js","webpack4://./esmodules-cjs/./src/optimized-out.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;AClFA;AACyC;AACT;AAChC;;AAEA;AAC4C;AACX;;AAEjC;AAC4C;AACX;;AAEjC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;;;;;;;;;;;;;ACxCA;;;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;ACAA;AACA;;;;;;;;;;;;;;ACDA;;;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;ACAA","file":"esmodules-cjs.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","import aDefault from \"./src/mod1\";\nimport { aNamed, aNamed as anotherNamed } from \"./src/mod2\";\nimport { original as anAliased } from \"./src/mod3\";\nimport * as aNamespace from \"./src/mod4\";\n\nimport aDefault2 from \"./src/mod5\";\nimport { aNamed2, aNamed2 as anotherNamed2 } from \"./src/mod6\";\nimport { original as anAliased2 } from \"./src/mod7\";\n\nimport aDefault3 from \"./src/mod9\";\nimport { aNamed3, aNamed3 as anotherNamed3 } from \"./src/mod10\";\nimport { original as anAliased3 } from \"./src/mod11\";\n\nimport optimizedOut from \"./src/optimized-out\";\noptimizedOut();\n\nexport default function root() {\n console.log(\"pause here\", root);\n\n console.log(aDefault);\n console.log(anAliased);\n console.log(aNamed);\n console.log(anotherNamed);\n console.log(aNamespace);\n\n try {\n // None of these are callable in this code, but we still want to make sure\n // they map properly even if the only reference is in a call expressions.\n console.log(aDefault2());\n console.log(anAliased2());\n console.log(aNamed2());\n console.log(anotherNamed2());\n\n console.log(new aDefault3());\n console.log(new anAliased3());\n console.log(new aNamed3());\n console.log(new anotherNamed3());\n } catch (e) {}\n}\n\nexport function example(){}\n","export default \"a-default\";\n","export const aNamed3 = \"a-named3\";\n","export const original = \"an-original3\";\n","export const aNamed = \"a-named\";\n","export const original = \"an-original\";\n","export default \"a-default\";\nexport const aNamed = \"a-named\";\n","export default \"a-default2\";\n","export const aNamed2 = \"a-named2\";\n","export const original = \"an-original2\";\n","export default \"a-default3\";\n","export default function optimizedOut() {}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/esmodules-es6.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/esmodules-es6.js
new file mode 100644
index 0000000000..f062d73133
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/esmodules-es6.js
@@ -0,0 +1,321 @@
+var webpack4EsmodulesEs6 =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default, example */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "example", function() { return example; });
+/* harmony import */ var _src_mod1__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/mod1 */ "./src/mod1.js");
+/* harmony import */ var _src_mod2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./src/mod2 */ "./src/mod2.js");
+/* harmony import */ var _src_mod3__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./src/mod3 */ "./src/mod3.js");
+/* harmony import */ var _src_mod4__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./src/mod4 */ "./src/mod4.js");
+/* harmony import */ var _src_mod5__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./src/mod5 */ "./src/mod5.js");
+/* harmony import */ var _src_mod6__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./src/mod6 */ "./src/mod6.js");
+/* harmony import */ var _src_mod7__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./src/mod7 */ "./src/mod7.js");
+/* harmony import */ var _src_mod9__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./src/mod9 */ "./src/mod9.js");
+/* harmony import */ var _src_mod10__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./src/mod10 */ "./src/mod10.js");
+/* harmony import */ var _src_mod11__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./src/mod11 */ "./src/mod11.js");
+/* harmony import */ var _src_optimized_out__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./src/optimized-out */ "./src/optimized-out.js");
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Object(_src_optimized_out__WEBPACK_IMPORTED_MODULE_10__["default"])();
+
+function root() {
+ console.log("pause here", root);
+
+ console.log(_src_mod1__WEBPACK_IMPORTED_MODULE_0__["default"]);
+ console.log(_src_mod3__WEBPACK_IMPORTED_MODULE_2__["original"]);
+ console.log(_src_mod2__WEBPACK_IMPORTED_MODULE_1__["aNamed"]);
+ console.log(_src_mod2__WEBPACK_IMPORTED_MODULE_1__["aNamed"]);
+ console.log(_src_mod4__WEBPACK_IMPORTED_MODULE_3__);
+
+ try {
+ // None of these are callable in this code, but we still want to make sure
+ // they map properly even if the only reference is in a call expressions.
+ console.log(Object(_src_mod5__WEBPACK_IMPORTED_MODULE_4__["default"])());
+ console.log(Object(_src_mod7__WEBPACK_IMPORTED_MODULE_6__["original"])());
+ console.log(Object(_src_mod6__WEBPACK_IMPORTED_MODULE_5__["aNamed2"])());
+ console.log(Object(_src_mod6__WEBPACK_IMPORTED_MODULE_5__["aNamed2"])());
+
+ console.log(new _src_mod9__WEBPACK_IMPORTED_MODULE_7__["default"]());
+ console.log(new _src_mod11__WEBPACK_IMPORTED_MODULE_9__["original"]());
+ console.log(new _src_mod10__WEBPACK_IMPORTED_MODULE_8__["aNamed3"]());
+ console.log(new _src_mod10__WEBPACK_IMPORTED_MODULE_8__["aNamed3"]());
+ } catch (e) {}
+}
+
+function example(){}
+
+
+/***/ }),
+
+/***/ "./src/mod1.js":
+/*!*********************!*\
+ !*** ./src/mod1.js ***!
+ \*********************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = ("a-default");
+
+
+/***/ }),
+
+/***/ "./src/mod10.js":
+/*!**********************!*\
+ !*** ./src/mod10.js ***!
+ \**********************/
+/*! exports provided: aNamed3 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "aNamed3", function() { return aNamed3; });
+const aNamed3 = "a-named3";
+
+
+/***/ }),
+
+/***/ "./src/mod11.js":
+/*!**********************!*\
+ !*** ./src/mod11.js ***!
+ \**********************/
+/*! exports provided: original */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "original", function() { return original; });
+const original = "an-original3";
+
+
+/***/ }),
+
+/***/ "./src/mod2.js":
+/*!*********************!*\
+ !*** ./src/mod2.js ***!
+ \*********************/
+/*! exports provided: aNamed */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "aNamed", function() { return aNamed; });
+const aNamed = "a-named";
+
+
+/***/ }),
+
+/***/ "./src/mod3.js":
+/*!*********************!*\
+ !*** ./src/mod3.js ***!
+ \*********************/
+/*! exports provided: original */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "original", function() { return original; });
+const original = "an-original";
+
+
+/***/ }),
+
+/***/ "./src/mod4.js":
+/*!*********************!*\
+ !*** ./src/mod4.js ***!
+ \*********************/
+/*! exports provided: default, aNamed */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "aNamed", function() { return aNamed; });
+/* harmony default export */ __webpack_exports__["default"] = ("a-default");
+const aNamed = "a-named";
+
+
+/***/ }),
+
+/***/ "./src/mod5.js":
+/*!*********************!*\
+ !*** ./src/mod5.js ***!
+ \*********************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = ("a-default2");
+
+
+/***/ }),
+
+/***/ "./src/mod6.js":
+/*!*********************!*\
+ !*** ./src/mod6.js ***!
+ \*********************/
+/*! exports provided: aNamed2 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "aNamed2", function() { return aNamed2; });
+const aNamed2 = "a-named2";
+
+
+/***/ }),
+
+/***/ "./src/mod7.js":
+/*!*********************!*\
+ !*** ./src/mod7.js ***!
+ \*********************/
+/*! exports provided: original */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "original", function() { return original; });
+const original = "an-original2";
+
+
+/***/ }),
+
+/***/ "./src/mod9.js":
+/*!*********************!*\
+ !*** ./src/mod9.js ***!
+ \*********************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = ("a-default3");
+
+
+/***/ }),
+
+/***/ "./src/optimized-out.js":
+/*!******************************!*\
+ !*** ./src/optimized-out.js ***!
+ \******************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return optimizedOut; });
+function optimizedOut() {}
+
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=esmodules-es6.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/esmodules-es6.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/esmodules-es6.js.map
new file mode 100644
index 0000000000..f05d5d3891
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/esmodules-es6.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4://./esmodules-es6/webpack/bootstrap","webpack4://./esmodules-es6/./input.js","webpack4://./esmodules-es6/./src/mod1.js","webpack4://./esmodules-es6/./src/mod10.js","webpack4://./esmodules-es6/./src/mod11.js","webpack4://./esmodules-es6/./src/mod2.js","webpack4://./esmodules-es6/./src/mod3.js","webpack4://./esmodules-es6/./src/mod4.js","webpack4://./esmodules-es6/./src/mod5.js","webpack4://./esmodules-es6/./src/mod6.js","webpack4://./esmodules-es6/./src/mod7.js","webpack4://./esmodules-es6/./src/mod9.js","webpack4://./esmodules-es6/./src/optimized-out.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;AClFA;AACyC;AACT;AAChC;;AAEA;AAC4C;AACX;;AAEjC;AAC4C;AACX;;AAEjC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;;;;;;;;;;;;;ACxCA;;;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;ACAA;AACA;;;;;;;;;;;;;;ACDA;;;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;ACAA","file":"esmodules-es6.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","import aDefault from \"./src/mod1\";\nimport { aNamed, aNamed as anotherNamed } from \"./src/mod2\";\nimport { original as anAliased } from \"./src/mod3\";\nimport * as aNamespace from \"./src/mod4\";\n\nimport aDefault2 from \"./src/mod5\";\nimport { aNamed2, aNamed2 as anotherNamed2 } from \"./src/mod6\";\nimport { original as anAliased2 } from \"./src/mod7\";\n\nimport aDefault3 from \"./src/mod9\";\nimport { aNamed3, aNamed3 as anotherNamed3 } from \"./src/mod10\";\nimport { original as anAliased3 } from \"./src/mod11\";\n\nimport optimizedOut from \"./src/optimized-out\";\noptimizedOut();\n\nexport default function root() {\n console.log(\"pause here\", root);\n\n console.log(aDefault);\n console.log(anAliased);\n console.log(aNamed);\n console.log(anotherNamed);\n console.log(aNamespace);\n\n try {\n // None of these are callable in this code, but we still want to make sure\n // they map properly even if the only reference is in a call expressions.\n console.log(aDefault2());\n console.log(anAliased2());\n console.log(aNamed2());\n console.log(anotherNamed2());\n\n console.log(new aDefault3());\n console.log(new anAliased3());\n console.log(new aNamed3());\n console.log(new anotherNamed3());\n } catch (e) {}\n}\n\nexport function example(){}\n","export default \"a-default\";\n","export const aNamed3 = \"a-named3\";\n","export const original = \"an-original3\";\n","export const aNamed = \"a-named\";\n","export const original = \"an-original\";\n","export default \"a-default\";\nexport const aNamed = \"a-named\";\n","export default \"a-default2\";\n","export const aNamed2 = \"a-named2\";\n","export const original = \"an-original2\";\n","export default \"a-default3\";\n","export default function optimizedOut() {}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/esmodules.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/esmodules.js
new file mode 100644
index 0000000000..8d9c392d71
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/esmodules.js
@@ -0,0 +1,321 @@
+var webpack4Esmodules =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default, example */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "example", function() { return example; });
+/* harmony import */ var _src_mod1__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/mod1 */ "./src/mod1.js");
+/* harmony import */ var _src_mod2__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./src/mod2 */ "./src/mod2.js");
+/* harmony import */ var _src_mod3__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./src/mod3 */ "./src/mod3.js");
+/* harmony import */ var _src_mod4__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./src/mod4 */ "./src/mod4.js");
+/* harmony import */ var _src_mod5__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./src/mod5 */ "./src/mod5.js");
+/* harmony import */ var _src_mod6__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./src/mod6 */ "./src/mod6.js");
+/* harmony import */ var _src_mod7__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./src/mod7 */ "./src/mod7.js");
+/* harmony import */ var _src_mod9__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./src/mod9 */ "./src/mod9.js");
+/* harmony import */ var _src_mod10__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./src/mod10 */ "./src/mod10.js");
+/* harmony import */ var _src_mod11__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./src/mod11 */ "./src/mod11.js");
+/* harmony import */ var _src_optimized_out__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./src/optimized-out */ "./src/optimized-out.js");
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Object(_src_optimized_out__WEBPACK_IMPORTED_MODULE_10__["default"])();
+
+function root() {
+ console.log("pause here", root);
+
+ console.log(_src_mod1__WEBPACK_IMPORTED_MODULE_0__["default"]);
+ console.log(_src_mod3__WEBPACK_IMPORTED_MODULE_2__["original"]);
+ console.log(_src_mod2__WEBPACK_IMPORTED_MODULE_1__["aNamed"]);
+ console.log(_src_mod2__WEBPACK_IMPORTED_MODULE_1__["aNamed"]);
+ console.log(_src_mod4__WEBPACK_IMPORTED_MODULE_3__);
+
+ try {
+ // None of these are callable in this code, but we still want to make sure
+ // they map properly even if the only reference is in a call expressions.
+ console.log(Object(_src_mod5__WEBPACK_IMPORTED_MODULE_4__["default"])());
+ console.log(Object(_src_mod7__WEBPACK_IMPORTED_MODULE_6__["original"])());
+ console.log(Object(_src_mod6__WEBPACK_IMPORTED_MODULE_5__["aNamed2"])());
+ console.log(Object(_src_mod6__WEBPACK_IMPORTED_MODULE_5__["aNamed2"])());
+
+ console.log(new _src_mod9__WEBPACK_IMPORTED_MODULE_7__["default"]());
+ console.log(new _src_mod11__WEBPACK_IMPORTED_MODULE_9__["original"]());
+ console.log(new _src_mod10__WEBPACK_IMPORTED_MODULE_8__["aNamed3"]());
+ console.log(new _src_mod10__WEBPACK_IMPORTED_MODULE_8__["aNamed3"]());
+ } catch (e) {}
+}
+
+function example(){}
+
+
+/***/ }),
+
+/***/ "./src/mod1.js":
+/*!*********************!*\
+ !*** ./src/mod1.js ***!
+ \*********************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = ("a-default");
+
+
+/***/ }),
+
+/***/ "./src/mod10.js":
+/*!**********************!*\
+ !*** ./src/mod10.js ***!
+ \**********************/
+/*! exports provided: aNamed3 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "aNamed3", function() { return aNamed3; });
+const aNamed3 = "a-named3";
+
+
+/***/ }),
+
+/***/ "./src/mod11.js":
+/*!**********************!*\
+ !*** ./src/mod11.js ***!
+ \**********************/
+/*! exports provided: original */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "original", function() { return original; });
+const original = "an-original3";
+
+
+/***/ }),
+
+/***/ "./src/mod2.js":
+/*!*********************!*\
+ !*** ./src/mod2.js ***!
+ \*********************/
+/*! exports provided: aNamed */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "aNamed", function() { return aNamed; });
+const aNamed = "a-named";
+
+
+/***/ }),
+
+/***/ "./src/mod3.js":
+/*!*********************!*\
+ !*** ./src/mod3.js ***!
+ \*********************/
+/*! exports provided: original */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "original", function() { return original; });
+const original = "an-original";
+
+
+/***/ }),
+
+/***/ "./src/mod4.js":
+/*!*********************!*\
+ !*** ./src/mod4.js ***!
+ \*********************/
+/*! exports provided: default, aNamed */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "aNamed", function() { return aNamed; });
+/* harmony default export */ __webpack_exports__["default"] = ("a-default");
+const aNamed = "a-named";
+
+
+/***/ }),
+
+/***/ "./src/mod5.js":
+/*!*********************!*\
+ !*** ./src/mod5.js ***!
+ \*********************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = ("a-default2");
+
+
+/***/ }),
+
+/***/ "./src/mod6.js":
+/*!*********************!*\
+ !*** ./src/mod6.js ***!
+ \*********************/
+/*! exports provided: aNamed2 */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "aNamed2", function() { return aNamed2; });
+const aNamed2 = "a-named2";
+
+
+/***/ }),
+
+/***/ "./src/mod7.js":
+/*!*********************!*\
+ !*** ./src/mod7.js ***!
+ \*********************/
+/*! exports provided: original */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "original", function() { return original; });
+const original = "an-original2";
+
+
+/***/ }),
+
+/***/ "./src/mod9.js":
+/*!*********************!*\
+ !*** ./src/mod9.js ***!
+ \*********************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = ("a-default3");
+
+
+/***/ }),
+
+/***/ "./src/optimized-out.js":
+/*!******************************!*\
+ !*** ./src/optimized-out.js ***!
+ \******************************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return optimizedOut; });
+function optimizedOut() {}
+
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=esmodules.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/esmodules.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/esmodules.js.map
new file mode 100644
index 0000000000..7498a9f27a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/esmodules.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4://./esmodules/webpack/bootstrap","webpack4://./esmodules/./input.js","webpack4://./esmodules/./src/mod1.js","webpack4://./esmodules/./src/mod10.js","webpack4://./esmodules/./src/mod11.js","webpack4://./esmodules/./src/mod2.js","webpack4://./esmodules/./src/mod3.js","webpack4://./esmodules/./src/mod4.js","webpack4://./esmodules/./src/mod5.js","webpack4://./esmodules/./src/mod6.js","webpack4://./esmodules/./src/mod7.js","webpack4://./esmodules/./src/mod9.js","webpack4://./esmodules/./src/optimized-out.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;AClFA;AACyC;AACT;AAChC;;AAEA;AAC4C;AACX;;AAEjC;AAC4C;AACX;;AAEjC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,GAAG;AACH;;AAEA;;;;;;;;;;;;;;ACxCA;;;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;ACAA;AACA;;;;;;;;;;;;;;ACDA;;;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;ACAA;;;;;;;;;;;;;;;ACAA","file":"esmodules.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","import aDefault from \"./src/mod1\";\nimport { aNamed, aNamed as anotherNamed } from \"./src/mod2\";\nimport { original as anAliased } from \"./src/mod3\";\nimport * as aNamespace from \"./src/mod4\";\n\nimport aDefault2 from \"./src/mod5\";\nimport { aNamed2, aNamed2 as anotherNamed2 } from \"./src/mod6\";\nimport { original as anAliased2 } from \"./src/mod7\";\n\nimport aDefault3 from \"./src/mod9\";\nimport { aNamed3, aNamed3 as anotherNamed3 } from \"./src/mod10\";\nimport { original as anAliased3 } from \"./src/mod11\";\n\nimport optimizedOut from \"./src/optimized-out\";\noptimizedOut();\n\nexport default function root() {\n console.log(\"pause here\", root);\n\n console.log(aDefault);\n console.log(anAliased);\n console.log(aNamed);\n console.log(anotherNamed);\n console.log(aNamespace);\n\n try {\n // None of these are callable in this code, but we still want to make sure\n // they map properly even if the only reference is in a call expressions.\n console.log(aDefault2());\n console.log(anAliased2());\n console.log(aNamed2());\n console.log(anotherNamed2());\n\n console.log(new aDefault3());\n console.log(new anAliased3());\n console.log(new aNamed3());\n console.log(new anotherNamed3());\n } catch (e) {}\n}\n\nexport function example(){}\n","export default \"a-default\";\n","export const aNamed3 = \"a-named3\";\n","export const original = \"an-original3\";\n","export const aNamed = \"a-named\";\n","export const original = \"an-original\";\n","export default \"a-default\";\nexport const aNamed = \"a-named\";\n","export default \"a-default2\";\n","export const aNamed2 = \"a-named2\";\n","export const original = \"an-original2\";\n","export default \"a-default3\";\n","export default function optimizedOut() {}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/eval-maps.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/eval-maps.js
new file mode 100644
index 0000000000..d6c9650588
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/eval-maps.js
@@ -0,0 +1,121 @@
+var webpack4EvalMaps =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+
+function root() {
+ var one = 1;
+ let two = 2;
+ const three = 3;
+
+ one;
+ two;
+
+ {
+ let two = 4;
+ const three = 5;
+
+ console.log("pause here", one, two, three);
+ }
+}
+
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=eval-maps.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/eval-maps.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/eval-maps.js.map
new file mode 100644
index 0000000000..5fa52ce2ad
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/eval-maps.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4://./eval-maps/webpack/bootstrap","webpack4://./eval-maps/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;;ACjFA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA","file":"eval-maps.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","\nexport default function root() {\n var one = 1;\n let two = 2;\n const three = 3;\n\n one;\n two;\n\n {\n let two = 4;\n const three = 5;\n\n console.log(\"pause here\", one, two, three);\n }\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/for-loops.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/for-loops.js
new file mode 100644
index 0000000000..40dfb95623
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/for-loops.js
@@ -0,0 +1,120 @@
+var webpack4ForLoops =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+function root() {
+ let i = 0;
+
+ for (let i = 1; i < 2; i++) {
+ console.log("pause here", root);
+ }
+
+ for (let i in { 2: "" }) {
+ console.log("pause here", root);
+ }
+
+ for (let i of [3]) {
+ console.log("pause here", root);
+ }
+}
+
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=for-loops.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/for-loops.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/for-loops.js.map
new file mode 100644
index 0000000000..61baa338e9
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/for-loops.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4://./for-loops/webpack/bootstrap","webpack4://./for-loops/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;AClFA;AACA;;AAEA,iBAAiB,OAAO;AACxB;AACA;;AAEA,iBAAiB,QAAQ;AACzB;AACA;;AAEA;AACA;AACA;AACA","file":"for-loops.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","export default function root() {\n let i = 0;\n\n for (let i = 1; i < 2; i++) {\n console.log(\"pause here\", root);\n }\n\n for (let i in { 2: \"\" }) {\n console.log(\"pause here\", root);\n }\n\n for (let i of [3]) {\n console.log(\"pause here\", root);\n }\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/for-of.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/for-of.js
new file mode 100644
index 0000000000..bcdba809fd
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/for-of.js
@@ -0,0 +1,117 @@
+var webpack4ForOf =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return forOf; });
+const mod = "module scoped";
+
+function forOf() {
+ for (const x of [1]) {
+ doThing(x);
+ }
+
+ function doThing(arg) {
+ // Avoid optimize out
+ window.console;
+ }
+}
+
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=for-of.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/for-of.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/for-of.js.map
new file mode 100644
index 0000000000..bcf8db679b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/for-of.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4://./for-of/webpack/bootstrap","webpack4://./for-of/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;AClFA;AAAA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA","file":"for-of.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","const mod = \"module scoped\";\n\nexport default function forOf() {\n for (const x of [1]) {\n doThing(x);\n }\n\n function doThing(arg) {\n // Avoid optimize out\n window.console;\n }\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/functions.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/functions.js
new file mode 100644
index 0000000000..b76a4807cb
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/functions.js
@@ -0,0 +1,119 @@
+var webpack4Functions =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+function root() {
+
+ function decl(p1) {
+ const inner = function inner(p2) {
+ const arrow = (p3) => {
+ console.log("pause here", p3, arrow, p2, inner, p1, decl, root);
+ };
+ arrow();
+ };
+ inner();
+ }
+
+ decl();
+}
+
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=functions.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/functions.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/functions.js.map
new file mode 100644
index 0000000000..de23726823
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/functions.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4://./functions/webpack/bootstrap","webpack4://./functions/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;AClFA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA","file":"functions.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","export default function root() {\n\n function decl(p1) {\n const inner = function inner(p2) {\n const arrow = (p3) => {\n console.log(\"pause here\", p3, arrow, p2, inner, p1, decl, root);\n };\n arrow();\n };\n inner();\n }\n\n decl();\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/lex-and-nonlex.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/lex-and-nonlex.js
new file mode 100644
index 0000000000..63137928cf
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/lex-and-nonlex.js
@@ -0,0 +1,114 @@
+var webpack4LexAndNonlex =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+function root() {
+ function someHelper(){
+ console.log("pause here", root, Thing);
+ }
+
+ class Thing {}
+
+ someHelper();
+}
+
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=lex-and-nonlex.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/lex-and-nonlex.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/lex-and-nonlex.js.map
new file mode 100644
index 0000000000..76ad02b1b9
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/lex-and-nonlex.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4://./lex-and-nonlex/webpack/bootstrap","webpack4://./lex-and-nonlex/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;AClFA;AACA;AACA;AACA;;AAEA;;AAEA;AACA","file":"lex-and-nonlex.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","export default function root() {\n function someHelper(){\n console.log(\"pause here\", root, Thing);\n }\n\n class Thing {}\n\n someHelper();\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/line-start-bindings-es6.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/line-start-bindings-es6.js
new file mode 100644
index 0000000000..0d1f2cdac7
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/line-start-bindings-es6.js
@@ -0,0 +1,128 @@
+var webpack4LineStartBindingsEs6 =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+
+function root() {
+ function aFunc(){
+ // Since these bindings are on their own linem, the mappings will
+ // extend to the start of the line, rather than starting at the first
+ // character of the binding.
+ const {
+ one,
+ two
+ } = {
+ one: 1,
+ two: 2,
+ };
+
+ // The 'this' binding here is also its own line, so the comment above
+ // applies here too.
+ this.thing = 4;
+
+ console.log("pause here", root);
+ }
+
+ aFunc.call({ });
+}
+
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=line-start-bindings-es6.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/line-start-bindings-es6.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/line-start-bindings-es6.js.map
new file mode 100644
index 0000000000..556ffd9937
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/line-start-bindings-es6.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4://./line-start-bindings-es6/webpack/bootstrap","webpack4://./line-start-bindings-es6/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;;ACjFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA,cAAc,EAAE;AAChB","file":"line-start-bindings-es6.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","\nexport default function root() {\n function aFunc(){\n // Since these bindings are on their own linem, the mappings will\n // extend to the start of the line, rather than starting at the first\n // character of the binding.\n const {\n one,\n two\n } = {\n one: 1,\n two: 2,\n };\n\n // The 'this' binding here is also its own line, so the comment above\n // applies here too.\n this.thing = 4;\n\n console.log(\"pause here\", root);\n }\n\n aFunc.call({ });\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/modules-cjs.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/modules-cjs.js
new file mode 100644
index 0000000000..874b83bce0
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/modules-cjs.js
@@ -0,0 +1,110 @@
+var webpack4ModulesCjs =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+var moduleScoped = 1;
+let alsoModuleScoped = 2;
+
+function thirdModuleScoped() {}
+
+exports.default = function() {
+ console.log("pause here", moduleScoped, alsoModuleScoped, thirdModuleScoped);
+};
+
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=modules-cjs.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/modules-cjs.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/modules-cjs.js.map
new file mode 100644
index 0000000000..a12e078047
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/modules-cjs.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4://./modules-cjs/webpack/bootstrap","webpack4://./modules-cjs/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;AClFA;AACA;;AAEA;;AAEA;AACA;AACA","file":"modules-cjs.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","var moduleScoped = 1;\nlet alsoModuleScoped = 2;\n\nfunction thirdModuleScoped() {}\n\nexports.default = function() {\n console.log(\"pause here\", moduleScoped, alsoModuleScoped, thirdModuleScoped);\n};\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/out-of-order-declarations-cjs.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/out-of-order-declarations-cjs.js
new file mode 100644
index 0000000000..b1882a18c3
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/out-of-order-declarations-cjs.js
@@ -0,0 +1,137 @@
+var webpack4OutOfOrderDeclarationsCjs =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+/* harmony import */ var _src_mod__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/mod */ "./src/mod.js");
+var val = "outer-value";
+
+function root() {
+ var val = "middle-value";
+ var fn = function outerFn(outer){};
+
+ function callback() {
+ console.log("pause here", val, _src_mod__WEBPACK_IMPORTED_MODULE_0__["default"], fn);
+
+ var val = "inner-value";
+ function fn(inner){};
+ }
+
+ callback();
+}
+
+
+
+
+/***/ }),
+
+/***/ "./src/mod.js":
+/*!********************!*\
+ !*** ./src/mod.js ***!
+ \********************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = ("a-default");
+
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=out-of-order-declarations-cjs.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/out-of-order-declarations-cjs.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/out-of-order-declarations-cjs.js.map
new file mode 100644
index 0000000000..3df8afcbda
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/out-of-order-declarations-cjs.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4://./out-of-order-declarations-cjs/webpack/bootstrap","webpack4://./out-of-order-declarations-cjs/./input.js","webpack4://./out-of-order-declarations-cjs/./src/mod.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;AClFA;AAAA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;;;;;;;;;;;;;;AChBA","file":"out-of-order-declarations-cjs.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","var val = \"outer-value\";\n\nexport default function root() {\n var val = \"middle-value\";\n var fn = function outerFn(outer){};\n\n function callback() {\n console.log(\"pause here\", val, aDefault, fn);\n\n var val = \"inner-value\";\n function fn(inner){};\n }\n\n callback();\n}\n\nimport aDefault from \"./src/mod\";\n","export default \"a-default\";\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/shadowed-vars.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/shadowed-vars.js
new file mode 100644
index 0000000000..cb58b3a623
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/shadowed-vars.js
@@ -0,0 +1,125 @@
+var webpack4ShadowedVars =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+ var aVar = "var1";
+ let aLet = "let1";
+ const aConst = "const1";
+
+ class Outer {}
+ {
+ function Outer() {}
+
+ var aVar = "var2";
+ let aLet = "let2";
+ const aConst = "const2";
+ {
+ var aVar = "var3";
+ let aLet = "let3";
+ const aConst = "const3";
+
+ console.log("pause here");
+ }
+ }
+});
+
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=shadowed-vars.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/shadowed-vars.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/shadowed-vars.js.map
new file mode 100644
index 0000000000..274a76b00f
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/shadowed-vars.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4://./shadowed-vars/webpack/bootstrap","webpack4://./shadowed-vars/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;AClFA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA","file":"shadowed-vars.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","export default function() {\n var aVar = \"var1\";\n let aLet = \"let1\";\n const aConst = \"const1\";\n\n class Outer {}\n {\n function Outer() {}\n\n var aVar = \"var2\";\n let aLet = \"let2\";\n const aConst = \"const2\";\n {\n var aVar = \"var3\";\n let aLet = \"let3\";\n const aConst = \"const3\";\n\n console.log(\"pause here\");\n }\n }\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-for-of-array-closure.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-for-of-array-closure.js
new file mode 100644
index 0000000000..79d5814b4b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-for-of-array-closure.js
@@ -0,0 +1,115 @@
+var webpack4StepOverForOfArrayClosure =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+// Babel will optimize this for..of because it call tell the value is an array.
+function root() {
+ console.log("pause here");
+
+ for (const val of [1, 2]) {
+ console.log("pause again", (() => val)());
+ }
+
+ console.log("done");
+}
+
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=step-over-for-of-array-closure.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-for-of-array-closure.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-for-of-array-closure.js.map
new file mode 100644
index 0000000000..613c11032d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-for-of-array-closure.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4://./step-over-for-of-array-closure/webpack/bootstrap","webpack4://./step-over-for-of-array-closure/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;AClFA;AAAA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA","file":"step-over-for-of-array-closure.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","// Babel will optimize this for..of because it call tell the value is an array.\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of [1, 2]) {\n console.log(\"pause again\", (() => val)());\n }\n\n console.log(\"done\");\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-for-of-array.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-for-of-array.js
new file mode 100644
index 0000000000..f233c31a7e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-for-of-array.js
@@ -0,0 +1,115 @@
+var webpack4StepOverForOfArray =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+// Babel will optimize this for..of because it call tell the value is an array.
+function root() {
+ console.log("pause here");
+
+ for (const val of [1, 2]) {
+ console.log("pause again", val);
+ }
+
+ console.log("done");
+}
+
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=step-over-for-of-array.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-for-of-array.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-for-of-array.js.map
new file mode 100644
index 0000000000..542a1c14c8
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-for-of-array.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4://./step-over-for-of-array/webpack/bootstrap","webpack4://./step-over-for-of-array/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;AClFA;AAAA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA","file":"step-over-for-of-array.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","// Babel will optimize this for..of because it call tell the value is an array.\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of [1, 2]) {\n console.log(\"pause again\", val);\n }\n\n console.log(\"done\");\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-for-of-closure.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-for-of-closure.js
new file mode 100644
index 0000000000..335d579f92
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-for-of-closure.js
@@ -0,0 +1,118 @@
+var webpack4StepOverForOfClosure =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+// Babel will convert the loop body to a function to handle the 'val' lexical
+// enclosure behavior.
+const vals = [1, 2];
+
+function root() {
+ console.log("pause here");
+
+ for (const val of vals) {
+ console.log("pause again", (() => val)());
+ }
+
+ console.log("done");
+}
+
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=step-over-for-of-closure.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-for-of-closure.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-for-of-closure.js.map
new file mode 100644
index 0000000000..8a44446b95
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-for-of-closure.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4://./step-over-for-of-closure/webpack/bootstrap","webpack4://./step-over-for-of-closure/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;AClFA;AAAA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA","file":"step-over-for-of-closure.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","// Babel will convert the loop body to a function to handle the 'val' lexical\n// enclosure behavior.\nconst vals = [1, 2];\n\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of vals) {\n console.log(\"pause again\", (() => val)());\n }\n\n console.log(\"done\");\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-for-of.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-for-of.js
new file mode 100644
index 0000000000..a92fa7fb83
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-for-of.js
@@ -0,0 +1,116 @@
+var webpack4StepOverForOf =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+const vals = [1, 2];
+
+function root() {
+ console.log("pause here");
+
+ for (const val of vals) {
+ console.log("pause again", val);
+ }
+
+ console.log("done");
+}
+
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=step-over-for-of.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-for-of.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-for-of.js.map
new file mode 100644
index 0000000000..61b3726c50
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-for-of.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4://./step-over-for-of/webpack/bootstrap","webpack4://./step-over-for-of/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;AClFA;AAAA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA","file":"step-over-for-of.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","const vals = [1, 2];\n\nexport default function root() {\n console.log(\"pause here\");\n\n for (const val of vals) {\n console.log(\"pause again\", val);\n }\n\n console.log(\"done\");\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-function-params.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-function-params.js
new file mode 100644
index 0000000000..6c8dec20cf
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-function-params.js
@@ -0,0 +1,113 @@
+var webpack4StepOverFunctionParams =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return fn; });
+function test(a1, a2 = 45, { a3, a4, a5: { a6: a7 } = {} } = {}) {
+ console.log("pause next here");
+}
+
+function fn() {
+ console.log("pause here");
+ test("1", undefined, { a3: "3", a4: "4", a5: { a6: "7" } });
+}
+
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=step-over-function-params.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-function-params.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-function-params.js.map
new file mode 100644
index 0000000000..ab3c6d10d2
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-function-params.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4://./step-over-function-params/webpack/bootstrap","webpack4://./step-over-function-params/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;AClFA;AAAA,4BAA4B,cAAc,SAAS,KAAK,EAAE,KAAK;AAC/D;AACA;;AAEA;AACA;AACA,wBAAwB,wBAAwB,UAAU,EAAE;AAC5D","file":"step-over-function-params.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","function test(a1, a2 = 45, { a3, a4, a5: { a6: a7 } = {} } = {}) {\n console.log(\"pause next here\");\n}\n\nexport default function fn() {\n console.log(\"pause here\");\n test(\"1\", undefined, { a3: \"3\", a4: \"4\", a5: { a6: \"7\" } });\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-regenerator-await.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-regenerator-await.js
new file mode 100644
index 0000000000..9315304853
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-regenerator-await.js
@@ -0,0 +1,120 @@
+var webpack4StepOverRegeneratorAwait =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+var fn = async function fn() {
+ console.log("pause here");
+
+ await doAsync();
+
+ console.log("stopped here");
+};
+
+function doAsync() {
+ return Promise.resolve();
+}
+
+function root() {
+ fn();
+}
+
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=step-over-regenerator-await.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-regenerator-await.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-regenerator-await.js.map
new file mode 100644
index 0000000000..c0fec8197c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/step-over-regenerator-await.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4://./step-over-regenerator-await/webpack/bootstrap","webpack4://./step-over-regenerator-await/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;AClFA;AAAA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA","file":"step-over-regenerator-await.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","var fn = async function fn() {\n console.log(\"pause here\");\n\n await doAsync();\n\n console.log(\"stopped here\");\n};\n\nfunction doAsync() {\n return Promise.resolve();\n}\n\nexport default function root() {\n fn();\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/switches.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/switches.js
new file mode 100644
index 0000000000..d0c3c8e7e4
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/switches.js
@@ -0,0 +1,118 @@
+var webpack4Switches =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+function root() {
+ let val = 1;
+
+ switch (true) {
+ case true:
+ let val = 2;
+ console.log("pause here", root);
+ default: {
+ let val = 3;
+ console.log("pause here", root);
+ }
+ }
+}
+
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=switches.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/switches.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/switches.js.map
new file mode 100644
index 0000000000..33a9f56d08
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/switches.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4://./switches/webpack/bootstrap","webpack4://./switches/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;AClFA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"switches.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","export default function root() {\n let val = 1;\n\n switch (true) {\n case true:\n let val = 2;\n console.log(\"pause here\", root);\n default: {\n let val = 3;\n console.log(\"pause here\", root);\n }\n }\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/this-arguments-bindings.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/this-arguments-bindings.js
new file mode 100644
index 0000000000..f395473149
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/this-arguments-bindings.js
@@ -0,0 +1,119 @@
+var webpack4ThisArgumentsBindings =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+function root() {
+ function fn(arg) {
+ console.log(this, arguments);
+ console.log("pause here", fn, root);
+
+ const arrow = argArrow => {
+ console.log(this, arguments);
+ console.log("pause here", fn, root);
+ };
+ arrow("arrow-arg");
+ }
+
+ fn.call("this-value", "arg-value");
+}
+
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=this-arguments-bindings.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/this-arguments-bindings.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/this-arguments-bindings.js.map
new file mode 100644
index 0000000000..232826233c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/this-arguments-bindings.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4://./this-arguments-bindings/webpack/bootstrap","webpack4://./this-arguments-bindings/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;AClFA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA","file":"this-arguments-bindings.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","export default function root() {\n function fn(arg) {\n console.log(this, arguments);\n console.log(\"pause here\", fn, root);\n\n const arrow = argArrow => {\n console.log(this, arguments);\n console.log(\"pause here\", fn, root);\n };\n arrow(\"arrow-arg\");\n }\n\n fn.call(\"this-value\", \"arg-value\");\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/try-catches.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/try-catches.js
new file mode 100644
index 0000000000..d3b3651b33
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/try-catches.js
@@ -0,0 +1,115 @@
+var webpack4TryCatches =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+function root() {
+ const one = 1;
+
+ try {
+ throw "AnError";
+ } catch (err) {
+ let two = 2;
+ console.log("pause here", root);
+ }
+}
+
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=try-catches.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/try-catches.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/try-catches.js.map
new file mode 100644
index 0000000000..03a6d5a5b8
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/try-catches.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4://./try-catches/webpack/bootstrap","webpack4://./try-catches/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;AClFA;AACA;;AAEA;AACA;AACA,GAAG;AACH;AACA;AACA;AACA","file":"try-catches.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","export default function root() {\n const one = 1;\n\n try {\n throw \"AnError\";\n } catch (err) {\n let two = 2;\n console.log(\"pause here\", root);\n }\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/type-module.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/type-module.js
new file mode 100644
index 0000000000..07787883f8
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/type-module.js
@@ -0,0 +1,112 @@
+var webpack4TypeModule =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+var moduleScoped = 1;
+let alsoModuleScoped = 2;
+
+function thirdModuleScoped() {}
+
+/* harmony default export */ __webpack_exports__["default"] = (function() {
+ console.log("pause here", moduleScoped, alsoModuleScoped, thirdModuleScoped);
+});
+
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=type-module.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/type-module.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/type-module.js.map
new file mode 100644
index 0000000000..7c1ba3b052
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/type-module.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4://./type-module/webpack/bootstrap","webpack4://./type-module/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;AClFA;AAAA;AACA;;AAEA;;AAEA;AACA;AACA","file":"type-module.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","var moduleScoped = 1;\nlet alsoModuleScoped = 2;\n\nfunction thirdModuleScoped() {}\n\nexport default function() {\n console.log(\"pause here\", moduleScoped, alsoModuleScoped, thirdModuleScoped);\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/type-script-cjs.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/type-script-cjs.js
new file mode 100644
index 0000000000..12fe5bdd11
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/type-script-cjs.js
@@ -0,0 +1,112 @@
+var webpack4TypeScriptCjs =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! no static exports found */
+/***/ (function(module, exports) {
+
+var moduleScoped = 1;
+let alsoModuleScopes = 2;
+
+function thirdModuleScoped() {}
+
+function nonModules() {
+ console.log("pause here");
+}
+
+exports.default = nonModules;
+
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=type-script-cjs.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/type-script-cjs.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/type-script-cjs.js.map
new file mode 100644
index 0000000000..6f72392550
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/type-script-cjs.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4://./type-script-cjs/webpack/bootstrap","webpack4://./type-script-cjs/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;AClFA;AACA;;AAEA;;AAEA;AACA;AACA;;AAEA","file":"type-script-cjs.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","var moduleScoped = 1;\nlet alsoModuleScopes = 2;\n\nfunction thirdModuleScoped() {}\n\nfunction nonModules() {\n console.log(\"pause here\");\n}\n\nexports.default = nonModules;\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/typescript-classes.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/typescript-classes.js
new file mode 100644
index 0000000000..c2290dd8e7
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/typescript-classes.js
@@ -0,0 +1,211 @@
+var webpack4TypescriptClasses =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.ts");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.ts":
+/*!******************!*\
+ !*** ./input.ts ***!
+ \******************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// This file essentially reproduces an example Angular component to map testing,
+// among other typescript edge cases.
+var __extends = (this && this.__extends) || (function () {
+ var extendStatics = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+ return function (d, b) {
+ extendStatics(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ };
+})();
+var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
+};
+exports.__esModule = true;
+var mod_ts_1 = __webpack_require__(/*! ./src/mod.ts */ "./src/mod.ts");
+var ns = __webpack_require__(/*! ./src/mod.ts */ "./src/mod.ts");
+var AppComponent = /** @class */ (function () {
+ function AppComponent() {
+ this.title = 'app';
+ }
+ AppComponent = __decorate([
+ mod_ts_1.decoratorFactory({
+ selector: 'app-root'
+ })
+ ], AppComponent);
+ return AppComponent;
+}());
+exports.AppComponent = AppComponent;
+var fn = function (arg) {
+ console.log("here");
+};
+fn("arg");
+// Un-decorated exported classes present a mapping challege because
+// the class name is mapped to an unhelpful export assignment.
+var ExportedOther = /** @class */ (function () {
+ function ExportedOther() {
+ this.title = 'app';
+ }
+ return ExportedOther;
+}());
+exports.ExportedOther = ExportedOther;
+var AnotherThing = /** @class */ (function () {
+ function AnotherThing() {
+ this.prop = 4;
+ }
+ return AnotherThing;
+}());
+var ExpressionClass = /** @class */ (function () {
+ function Foo() {
+ this.prop = 4;
+ }
+ return Foo;
+}());
+var SubDecl = /** @class */ (function (_super) {
+ __extends(SubDecl, _super);
+ function SubDecl() {
+ var _this = _super !== null && _super.apply(this, arguments) || this;
+ _this.prop = 4;
+ return _this;
+ }
+ return SubDecl;
+}(AnotherThing));
+var SubVar = /** @class */ (function (_super) {
+ __extends(SubExpr, _super);
+ function SubExpr() {
+ var _this = _super !== null && _super.apply(this, arguments) || this;
+ _this.prop = 4;
+ return _this;
+ }
+ return SubExpr;
+}(AnotherThing));
+ns;
+function default_1() {
+ // This file is specifically for testing the mappings of classes and things
+ // above, which means we don't want to include _other_ references to then.
+ // To avoid having them be optimized out, we include a no-op eval.
+ eval("");
+ console.log("pause here");
+}
+exports["default"] = default_1;
+
+
+/***/ }),
+
+/***/ "./src/mod.ts":
+/*!********************!*\
+ !*** ./src/mod.ts ***!
+ \********************/
+/*! no static exports found */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+exports.__esModule = true;
+function decoratorFactory(opts) {
+ return function decorator(target) {
+ return target;
+ };
+}
+exports.decoratorFactory = decoratorFactory;
+function def() { }
+exports["default"] = def;
+
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=typescript-classes.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/typescript-classes.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/typescript-classes.js.map
new file mode 100644
index 0000000000..657de694f3
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/typescript-classes.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4://./typescript-classes/webpack/bootstrap","webpack4://./typescript-classes/./input.ts","webpack4://./typescript-classes/./src/mod.ts"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;AClFA,gFAAgF;AAChF,qCAAqC;;;;;;;;;;;;;;;;;;AAErC,uEAAqD;AAErD,iEAAmC;AAKnC;IAHA;QAIE,UAAK,GAAG,KAAK,CAAC;IAChB,CAAC;IAFY,YAAY;QAHxB,yBAAgB,CAAC;YAChB,QAAQ,EAAE,UAAU;SACrB,CAAC;OACW,YAAY,CAExB;IAAD,mBAAC;CAAA;AAFY,oCAAY;AAIzB,IAAM,EAAE,GAAG,aAAG;IACZ,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC,CAAC;AACF,EAAE,CAAC,KAAK,CAAC,CAAC;AAEV,mEAAmE;AACnE,8DAA8D;AAC9D;IAAA;QACE,UAAK,GAAG,KAAK,CAAC;IAChB,CAAC;IAAD,oBAAC;AAAD,CAAC;AAFY,sCAAa;AAI1B;IAAA;QACE,SAAI,GAAG,CAAC,CAAC;IACX,CAAC;IAAD,mBAAC;AAAD,CAAC;AAED,IAAM,eAAe;IAAG;QACtB,SAAI,GAAG,CAAC,CAAC;IACX,CAAC;IAAD,UAAC;AAAD,CAAC,IAAC;AAEF;IAAsB,2BAAY;IAAlC;QAAA,qEAEC;QADC,UAAI,GAAG,CAAC,CAAC;;IACX,CAAC;IAAD,cAAC;AAAD,CAAC,CAFqB,YAAY,GAEjC;AAED,IAAI,MAAM;IAAyB,2BAAY;IAAlC;QAAA,qEAEZ;QADC,UAAI,GAAG,CAAC,CAAC;;IACX,CAAC;IAAD,cAAC;AAAD,CAAC,CAFkC,YAAY,EAE9C,CAAC;AAEF,EAAE,CAAC;AAEH;IACE,2EAA2E;IAC3E,0EAA0E;IAC1E,kEAAkE;IAClE,IAAI,CAAC,EAAE,CAAC,CAAC;IAET,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AAC5B,CAAC;AAPD,+BAOC;;;;;;;;;;;;;;;ACjDD,0BAAiC,IAA0B;IACzD,OAAO,mBAAmB,MAAM;QAC9B,OAAY,MAAM,CAAC;IACrB,CAAC,CAAC;AACJ,CAAC;AAJD,4CAIC;AAED,iBAA+B,CAAC;AAAhC,yBAAgC","file":"typescript-classes.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.ts\");\n","// This file essentially reproduces an example Angular component to map testing,\n// among other typescript edge cases.\n\nimport def, { decoratorFactory } from './src/mod.ts';\n\nimport * as ns from './src/mod.ts';\n\n@decoratorFactory({\n selector: 'app-root',\n})\nexport class AppComponent {\n title = 'app';\n}\n\nconst fn = arg => {\n console.log(\"here\");\n};\nfn(\"arg\");\n\n// Un-decorated exported classes present a mapping challege because\n// the class name is mapped to an unhelpful export assignment.\nexport class ExportedOther {\n title = 'app';\n}\n\nclass AnotherThing {\n prop = 4;\n}\n\nconst ExpressionClass = class Foo {\n prop = 4;\n};\n\nclass SubDecl extends AnotherThing {\n prop = 4;\n}\n\nlet SubVar = class SubExpr extends AnotherThing {\n prop = 4;\n};\n\nns;\n\nexport default function(){\n // This file is specifically for testing the mappings of classes and things\n // above, which means we don't want to include _other_ references to then.\n // To avoid having them be optimized out, we include a no-op eval.\n eval(\"\");\n\n console.log(\"pause here\");\n}\n","\nexport function decoratorFactory(opts: { selector: string }) {\n return function decorator(target) {\n return <any>target;\n };\n}\n\nexport default function def() {}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/webpack-functions.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/webpack-functions.js
new file mode 100644
index 0000000000..196ba02fee
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/webpack-functions.js
@@ -0,0 +1,117 @@
+var webpack4WebpackFunctions =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+var module = {};
+
+module.exports = function(x) {
+ return x * 2;
+};
+
+
+function root() {
+ // This example is structures to look like CommonJS in order to replicate
+ // a previously-encountered bug.
+ module.exports(4);
+}
+
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=webpack-functions.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/webpack-functions.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/webpack-functions.js.map
new file mode 100644
index 0000000000..35d6e1fd4c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/webpack-functions.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4://./webpack-functions/webpack/bootstrap","webpack4://./webpack-functions/./input.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;AClFA;AAAA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA","file":"webpack-functions.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","var module = {};\n\nmodule.exports = function(x) {\n return x * 2;\n};\n\n\nexport default function root() {\n // This example is structures to look like CommonJS in order to replicate\n // a previously-encountered bug.\n module.exports(4);\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/webpack-line-mappings.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/webpack-line-mappings.js
new file mode 100644
index 0000000000..09e95c7ab0
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/webpack-line-mappings.js
@@ -0,0 +1,138 @@
+var webpack4WebpackLineMappings =
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
+/******/ }
+/******/ };
+/******/
+/******/ // define __esModule on exports
+/******/ __webpack_require__.r = function(exports) {
+/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ }
+/******/ Object.defineProperty(exports, '__esModule', { value: true });
+/******/ };
+/******/
+/******/ // create a fake namespace object
+/******/ // mode & 1: value is a module id, require it
+/******/ // mode & 2: merge all properties of value into the ns
+/******/ // mode & 4: return value when already ns object
+/******/ // mode & 8|1: behave like require
+/******/ __webpack_require__.t = function(value, mode) {
+/******/ if(mode & 1) value = __webpack_require__(value);
+/******/ if(mode & 8) return value;
+/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
+/******/ var ns = Object.create(null);
+/******/ __webpack_require__.r(ns);
+/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
+/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
+/******/ return ns;
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = "./input.js");
+/******/ })
+/************************************************************************/
+/******/ ({
+
+/***/ "./input.js":
+/*!******************!*\
+ !*** ./input.js ***!
+ \******************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return root; });
+/* harmony import */ var _src_mod1__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./src/mod1 */ "./src/mod1.js");
+
+
+function root() {
+ let one = 1;
+
+ {
+ const two = 2;
+
+ var fn = function someName(arg) {
+ console.log(this, arguments);
+ console.log("pause here", _src_mod1__WEBPACK_IMPORTED_MODULE_0__["default"], one, two, fn, arg);
+
+ var inner = (arg) => { var body = "42"; console.log("pause here", body, root); };
+ inner();
+ };
+ fn.call("this-value", "arg-value");
+ }
+}
+
+
+/***/ }),
+
+/***/ "./src/mod1.js":
+/*!*********************!*\
+ !*** ./src/mod1.js ***!
+ \*********************/
+/*! exports provided: default */
+/***/ (function(module, __webpack_exports__, __webpack_require__) {
+
+"use strict";
+__webpack_require__.r(__webpack_exports__);
+/* harmony default export */ __webpack_exports__["default"] = ("a-default");
+
+
+/***/ })
+
+/******/ })["default"];
+//# sourceMappingURL=webpack-line-mappings.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/webpack-line-mappings.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/webpack-line-mappings.js.map
new file mode 100644
index 0000000000..6e9a56d2a7
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/output/webpack4/webpack-line-mappings.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack4://./webpack-line-mappings/webpack/bootstrap","webpack4://./webpack-line-mappings/./input.js","webpack4://./webpack-line-mappings/./src/mod1.js"],"names":[],"mappings":";;AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA,kDAA0C,gCAAgC;AAC1E;AACA;;AAEA;AACA;AACA;AACA,gEAAwD,kBAAkB;AAC1E;AACA,yDAAiD,cAAc;AAC/D;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iDAAyC,iCAAiC;AAC1E,wHAAgH,mBAAmB,EAAE;AACrI;AACA;;AAEA;AACA;AACA;AACA,mCAA2B,0BAA0B,EAAE;AACvD,yCAAiC,eAAe;AAChD;AACA;AACA;;AAEA;AACA,8DAAsD,+DAA+D;;AAErH;AACA;;;AAGA;AACA;;;;;;;;;;;;;;;;AClFA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA,4BAA4B,iBAAiB,uCAAuC;AACpF;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;ACjBA","file":"webpack-line-mappings.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = \"./input.js\");\n","import aDefault from \"./src/mod1\";\n\nexport default function root() {\n let one = 1;\n\n {\n const two = 2;\n\n var fn = function someName(arg) {\n console.log(this, arguments);\n console.log(\"pause here\", aDefault, one, two, fn, arg);\n\n var inner = (arg) => { var body = \"42\"; console.log(\"pause here\", body, root); };\n inner();\n };\n fn.call(\"this-value\", \"arg-value\");\n }\n}\n","export default \"a-default\";\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/package.json b/devtools/client/debugger/test/mochitest/examples/sourcemapped/package.json
new file mode 100644
index 0000000000..ea2db05544
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/package.json
@@ -0,0 +1,16 @@
+{
+ "name": "babel-sourcemaps",
+ "version": "1.0.0",
+ "description": "Rebuild assets for babel's test fixtures",
+ "scripts": {
+ "build": "node ./build.js"
+ },
+ "keywords": [],
+ "author": "",
+ "license": "MPL-2.0",
+ "dependencies": {
+ "babel-polyfill": "^6.26.0",
+ "lodash": "^4.17.5",
+ "webpack": "^3.7.1"
+ }
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/polyfill-bundle.js b/devtools/client/debugger/test/mochitest/examples/sourcemapped/polyfill-bundle.js
new file mode 100644
index 0000000000..60618578b9
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/polyfill-bundle.js
@@ -0,0 +1,9037 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 125);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(2);
+var core = __webpack_require__(18);
+var hide = __webpack_require__(11);
+var redefine = __webpack_require__(12);
+var ctx = __webpack_require__(19);
+var PROTOTYPE = 'prototype';
+
+var $export = function (type, name, source) {
+ var IS_FORCED = type & $export.F;
+ var IS_GLOBAL = type & $export.G;
+ var IS_STATIC = type & $export.S;
+ var IS_PROTO = type & $export.P;
+ var IS_BIND = type & $export.B;
+ var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];
+ var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});
+ var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});
+ var key, own, out, exp;
+ if (IS_GLOBAL) source = name;
+ for (key in source) {
+ // contains in native
+ own = !IS_FORCED && target && target[key] !== undefined;
+ // export native or passed
+ out = (own ? target : source)[key];
+ // bind timers to global for call from export context
+ exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
+ // extend global
+ if (target) redefine(target, key, out, type & $export.U);
+ // export
+ if (exports[key] != out) hide(exports, key, exp);
+ if (IS_PROTO && expProto[key] != out) expProto[key] = out;
+ }
+};
+global.core = core;
+// type bitmap
+$export.F = 1; // forced
+$export.G = 2; // global
+$export.S = 4; // static
+$export.P = 8; // proto
+$export.B = 16; // bind
+$export.W = 32; // wrap
+$export.U = 64; // safe
+$export.R = 128; // real proto method for `library`
+module.exports = $export;
+
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isObject = __webpack_require__(4);
+module.exports = function (it) {
+ if (!isObject(it)) throw TypeError(it + ' is not an object!');
+ return it;
+};
+
+
+/***/ }),
+/* 2 */
+/***/ (function(module, exports) {
+
+// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
+var global = module.exports = typeof window != 'undefined' && window.Math == Math
+ ? window : typeof self != 'undefined' && self.Math == Math ? self
+ // eslint-disable-next-line no-new-func
+ : Function('return this')();
+if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef
+
+
+/***/ }),
+/* 3 */
+/***/ (function(module, exports) {
+
+module.exports = function (exec) {
+ try {
+ return !!exec();
+ } catch (e) {
+ return true;
+ }
+};
+
+
+/***/ }),
+/* 4 */
+/***/ (function(module, exports) {
+
+module.exports = function (it) {
+ return typeof it === 'object' ? it !== null : typeof it === 'function';
+};
+
+
+/***/ }),
+/* 5 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var store = __webpack_require__(49)('wks');
+var uid = __webpack_require__(33);
+var Symbol = __webpack_require__(2).Symbol;
+var USE_SYMBOL = typeof Symbol == 'function';
+
+var $exports = module.exports = function (name) {
+ return store[name] || (store[name] =
+ USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));
+};
+
+$exports.store = store;
+
+
+/***/ }),
+/* 6 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// Thank's IE8 for his funny defineProperty
+module.exports = !__webpack_require__(3)(function () {
+ return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;
+});
+
+
+/***/ }),
+/* 7 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var anObject = __webpack_require__(1);
+var IE8_DOM_DEFINE = __webpack_require__(91);
+var toPrimitive = __webpack_require__(22);
+var dP = Object.defineProperty;
+
+exports.f = __webpack_require__(6) ? Object.defineProperty : function defineProperty(O, P, Attributes) {
+ anObject(O);
+ P = toPrimitive(P, true);
+ anObject(Attributes);
+ if (IE8_DOM_DEFINE) try {
+ return dP(O, P, Attributes);
+ } catch (e) { /* empty */ }
+ if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');
+ if ('value' in Attributes) O[P] = Attributes.value;
+ return O;
+};
+
+
+/***/ }),
+/* 8 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.1.15 ToLength
+var toInteger = __webpack_require__(24);
+var min = Math.min;
+module.exports = function (it) {
+ return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991
+};
+
+
+/***/ }),
+/* 9 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.1.13 ToObject(argument)
+var defined = __webpack_require__(23);
+module.exports = function (it) {
+ return Object(defined(it));
+};
+
+
+/***/ }),
+/* 10 */
+/***/ (function(module, exports) {
+
+module.exports = function (it) {
+ if (typeof it != 'function') throw TypeError(it + ' is not a function!');
+ return it;
+};
+
+
+/***/ }),
+/* 11 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var dP = __webpack_require__(7);
+var createDesc = __webpack_require__(32);
+module.exports = __webpack_require__(6) ? function (object, key, value) {
+ return dP.f(object, key, createDesc(1, value));
+} : function (object, key, value) {
+ object[key] = value;
+ return object;
+};
+
+
+/***/ }),
+/* 12 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(2);
+var hide = __webpack_require__(11);
+var has = __webpack_require__(14);
+var SRC = __webpack_require__(33)('src');
+var TO_STRING = 'toString';
+var $toString = Function[TO_STRING];
+var TPL = ('' + $toString).split(TO_STRING);
+
+__webpack_require__(18).inspectSource = function (it) {
+ return $toString.call(it);
+};
+
+(module.exports = function (O, key, val, safe) {
+ var isFunction = typeof val == 'function';
+ if (isFunction) has(val, 'name') || hide(val, 'name', key);
+ if (O[key] === val) return;
+ if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));
+ if (O === global) {
+ O[key] = val;
+ } else if (!safe) {
+ delete O[key];
+ hide(O, key, val);
+ } else if (O[key]) {
+ O[key] = val;
+ } else {
+ hide(O, key, val);
+ }
+// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative
+})(Function.prototype, TO_STRING, function toString() {
+ return typeof this == 'function' && this[SRC] || $toString.call(this);
+});
+
+
+/***/ }),
+/* 13 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $export = __webpack_require__(0);
+var fails = __webpack_require__(3);
+var defined = __webpack_require__(23);
+var quot = /"/g;
+// B.2.3.2.1 CreateHTML(string, tag, attribute, value)
+var createHTML = function (string, tag, attribute, value) {
+ var S = String(defined(string));
+ var p1 = '<' + tag;
+ if (attribute !== '') p1 += ' ' + attribute + '="' + String(value).replace(quot, '&quot;') + '"';
+ return p1 + '>' + S + '</' + tag + '>';
+};
+module.exports = function (NAME, exec) {
+ var O = {};
+ O[NAME] = exec(createHTML);
+ $export($export.P + $export.F * fails(function () {
+ var test = ''[NAME]('"');
+ return test !== test.toLowerCase() || test.split('"').length > 3;
+ }), 'String', O);
+};
+
+
+/***/ }),
+/* 14 */
+/***/ (function(module, exports) {
+
+var hasOwnProperty = {}.hasOwnProperty;
+module.exports = function (it, key) {
+ return hasOwnProperty.call(it, key);
+};
+
+
+/***/ }),
+/* 15 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// to indexed object, toObject with fallback for non-array-like ES3 strings
+var IObject = __webpack_require__(46);
+var defined = __webpack_require__(23);
+module.exports = function (it) {
+ return IObject(defined(it));
+};
+
+
+/***/ }),
+/* 16 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var pIE = __webpack_require__(47);
+var createDesc = __webpack_require__(32);
+var toIObject = __webpack_require__(15);
+var toPrimitive = __webpack_require__(22);
+var has = __webpack_require__(14);
+var IE8_DOM_DEFINE = __webpack_require__(91);
+var gOPD = Object.getOwnPropertyDescriptor;
+
+exports.f = __webpack_require__(6) ? gOPD : function getOwnPropertyDescriptor(O, P) {
+ O = toIObject(O);
+ P = toPrimitive(P, true);
+ if (IE8_DOM_DEFINE) try {
+ return gOPD(O, P);
+ } catch (e) { /* empty */ }
+ if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);
+};
+
+
+/***/ }),
+/* 17 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)
+var has = __webpack_require__(14);
+var toObject = __webpack_require__(9);
+var IE_PROTO = __webpack_require__(66)('IE_PROTO');
+var ObjectProto = Object.prototype;
+
+module.exports = Object.getPrototypeOf || function (O) {
+ O = toObject(O);
+ if (has(O, IE_PROTO)) return O[IE_PROTO];
+ if (typeof O.constructor == 'function' && O instanceof O.constructor) {
+ return O.constructor.prototype;
+ } return O instanceof Object ? ObjectProto : null;
+};
+
+
+/***/ }),
+/* 18 */
+/***/ (function(module, exports) {
+
+var core = module.exports = { version: '2.5.7' };
+if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef
+
+
+/***/ }),
+/* 19 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// optional / simple context binding
+var aFunction = __webpack_require__(10);
+module.exports = function (fn, that, length) {
+ aFunction(fn);
+ if (that === undefined) return fn;
+ switch (length) {
+ case 1: return function (a) {
+ return fn.call(that, a);
+ };
+ case 2: return function (a, b) {
+ return fn.call(that, a, b);
+ };
+ case 3: return function (a, b, c) {
+ return fn.call(that, a, b, c);
+ };
+ }
+ return function (/* ...args */) {
+ return fn.apply(that, arguments);
+ };
+};
+
+
+/***/ }),
+/* 20 */
+/***/ (function(module, exports) {
+
+var toString = {}.toString;
+
+module.exports = function (it) {
+ return toString.call(it).slice(8, -1);
+};
+
+
+/***/ }),
+/* 21 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var fails = __webpack_require__(3);
+
+module.exports = function (method, arg) {
+ return !!method && fails(function () {
+ // eslint-disable-next-line no-useless-call
+ arg ? method.call(null, function () { /* empty */ }, 1) : method.call(null);
+ });
+};
+
+
+/***/ }),
+/* 22 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.1.1 ToPrimitive(input [, PreferredType])
+var isObject = __webpack_require__(4);
+// instead of the ES6 spec version, we didn't implement @@toPrimitive case
+// and the second argument - flag - preferred type is a string
+module.exports = function (it, S) {
+ if (!isObject(it)) return it;
+ var fn, val;
+ if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
+ if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;
+ if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;
+ throw TypeError("Can't convert object to primitive value");
+};
+
+
+/***/ }),
+/* 23 */
+/***/ (function(module, exports) {
+
+// 7.2.1 RequireObjectCoercible(argument)
+module.exports = function (it) {
+ if (it == undefined) throw TypeError("Can't call method on " + it);
+ return it;
+};
+
+
+/***/ }),
+/* 24 */
+/***/ (function(module, exports) {
+
+// 7.1.4 ToInteger
+var ceil = Math.ceil;
+var floor = Math.floor;
+module.exports = function (it) {
+ return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
+};
+
+
+/***/ }),
+/* 25 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// most Object methods by ES6 should accept primitives
+var $export = __webpack_require__(0);
+var core = __webpack_require__(18);
+var fails = __webpack_require__(3);
+module.exports = function (KEY, exec) {
+ var fn = (core.Object || {})[KEY] || Object[KEY];
+ var exp = {};
+ exp[KEY] = exec(fn);
+ $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);
+};
+
+
+/***/ }),
+/* 26 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 0 -> Array#forEach
+// 1 -> Array#map
+// 2 -> Array#filter
+// 3 -> Array#some
+// 4 -> Array#every
+// 5 -> Array#find
+// 6 -> Array#findIndex
+var ctx = __webpack_require__(19);
+var IObject = __webpack_require__(46);
+var toObject = __webpack_require__(9);
+var toLength = __webpack_require__(8);
+var asc = __webpack_require__(83);
+module.exports = function (TYPE, $create) {
+ var IS_MAP = TYPE == 1;
+ var IS_FILTER = TYPE == 2;
+ var IS_SOME = TYPE == 3;
+ var IS_EVERY = TYPE == 4;
+ var IS_FIND_INDEX = TYPE == 6;
+ var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;
+ var create = $create || asc;
+ return function ($this, callbackfn, that) {
+ var O = toObject($this);
+ var self = IObject(O);
+ var f = ctx(callbackfn, that, 3);
+ var length = toLength(self.length);
+ var index = 0;
+ var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;
+ var val, res;
+ for (;length > index; index++) if (NO_HOLES || index in self) {
+ val = self[index];
+ res = f(val, index, O);
+ if (TYPE) {
+ if (IS_MAP) result[index] = res; // map
+ else if (res) switch (TYPE) {
+ case 3: return true; // some
+ case 5: return val; // find
+ case 6: return index; // findIndex
+ case 2: result.push(val); // filter
+ } else if (IS_EVERY) return false; // every
+ }
+ }
+ return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;
+ };
+};
+
+
+/***/ }),
+/* 27 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+if (__webpack_require__(6)) {
+ var LIBRARY = __webpack_require__(30);
+ var global = __webpack_require__(2);
+ var fails = __webpack_require__(3);
+ var $export = __webpack_require__(0);
+ var $typed = __webpack_require__(60);
+ var $buffer = __webpack_require__(89);
+ var ctx = __webpack_require__(19);
+ var anInstance = __webpack_require__(39);
+ var propertyDesc = __webpack_require__(32);
+ var hide = __webpack_require__(11);
+ var redefineAll = __webpack_require__(41);
+ var toInteger = __webpack_require__(24);
+ var toLength = __webpack_require__(8);
+ var toIndex = __webpack_require__(117);
+ var toAbsoluteIndex = __webpack_require__(35);
+ var toPrimitive = __webpack_require__(22);
+ var has = __webpack_require__(14);
+ var classof = __webpack_require__(48);
+ var isObject = __webpack_require__(4);
+ var toObject = __webpack_require__(9);
+ var isArrayIter = __webpack_require__(80);
+ var create = __webpack_require__(36);
+ var getPrototypeOf = __webpack_require__(17);
+ var gOPN = __webpack_require__(37).f;
+ var getIterFn = __webpack_require__(82);
+ var uid = __webpack_require__(33);
+ var wks = __webpack_require__(5);
+ var createArrayMethod = __webpack_require__(26);
+ var createArrayIncludes = __webpack_require__(50);
+ var speciesConstructor = __webpack_require__(57);
+ var ArrayIterators = __webpack_require__(85);
+ var Iterators = __webpack_require__(44);
+ var $iterDetect = __webpack_require__(54);
+ var setSpecies = __webpack_require__(38);
+ var arrayFill = __webpack_require__(84);
+ var arrayCopyWithin = __webpack_require__(107);
+ var $DP = __webpack_require__(7);
+ var $GOPD = __webpack_require__(16);
+ var dP = $DP.f;
+ var gOPD = $GOPD.f;
+ var RangeError = global.RangeError;
+ var TypeError = global.TypeError;
+ var Uint8Array = global.Uint8Array;
+ var ARRAY_BUFFER = 'ArrayBuffer';
+ var SHARED_BUFFER = 'Shared' + ARRAY_BUFFER;
+ var BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';
+ var PROTOTYPE = 'prototype';
+ var ArrayProto = Array[PROTOTYPE];
+ var $ArrayBuffer = $buffer.ArrayBuffer;
+ var $DataView = $buffer.DataView;
+ var arrayForEach = createArrayMethod(0);
+ var arrayFilter = createArrayMethod(2);
+ var arraySome = createArrayMethod(3);
+ var arrayEvery = createArrayMethod(4);
+ var arrayFind = createArrayMethod(5);
+ var arrayFindIndex = createArrayMethod(6);
+ var arrayIncludes = createArrayIncludes(true);
+ var arrayIndexOf = createArrayIncludes(false);
+ var arrayValues = ArrayIterators.values;
+ var arrayKeys = ArrayIterators.keys;
+ var arrayEntries = ArrayIterators.entries;
+ var arrayLastIndexOf = ArrayProto.lastIndexOf;
+ var arrayReduce = ArrayProto.reduce;
+ var arrayReduceRight = ArrayProto.reduceRight;
+ var arrayJoin = ArrayProto.join;
+ var arraySort = ArrayProto.sort;
+ var arraySlice = ArrayProto.slice;
+ var arrayToString = ArrayProto.toString;
+ var arrayToLocaleString = ArrayProto.toLocaleString;
+ var ITERATOR = wks('iterator');
+ var TAG = wks('toStringTag');
+ var TYPED_CONSTRUCTOR = uid('typed_constructor');
+ var DEF_CONSTRUCTOR = uid('def_constructor');
+ var ALL_CONSTRUCTORS = $typed.CONSTR;
+ var TYPED_ARRAY = $typed.TYPED;
+ var VIEW = $typed.VIEW;
+ var WRONG_LENGTH = 'Wrong length!';
+
+ var $map = createArrayMethod(1, function (O, length) {
+ return allocate(speciesConstructor(O, O[DEF_CONSTRUCTOR]), length);
+ });
+
+ var LITTLE_ENDIAN = fails(function () {
+ // eslint-disable-next-line no-undef
+ return new Uint8Array(new Uint16Array([1]).buffer)[0] === 1;
+ });
+
+ var FORCED_SET = !!Uint8Array && !!Uint8Array[PROTOTYPE].set && fails(function () {
+ new Uint8Array(1).set({});
+ });
+
+ var toOffset = function (it, BYTES) {
+ var offset = toInteger(it);
+ if (offset < 0 || offset % BYTES) throw RangeError('Wrong offset!');
+ return offset;
+ };
+
+ var validate = function (it) {
+ if (isObject(it) && TYPED_ARRAY in it) return it;
+ throw TypeError(it + ' is not a typed array!');
+ };
+
+ var allocate = function (C, length) {
+ if (!(isObject(C) && TYPED_CONSTRUCTOR in C)) {
+ throw TypeError('It is not a typed array constructor!');
+ } return new C(length);
+ };
+
+ var speciesFromList = function (O, list) {
+ return fromList(speciesConstructor(O, O[DEF_CONSTRUCTOR]), list);
+ };
+
+ var fromList = function (C, list) {
+ var index = 0;
+ var length = list.length;
+ var result = allocate(C, length);
+ while (length > index) result[index] = list[index++];
+ return result;
+ };
+
+ var addGetter = function (it, key, internal) {
+ dP(it, key, { get: function () { return this._d[internal]; } });
+ };
+
+ var $from = function from(source /* , mapfn, thisArg */) {
+ var O = toObject(source);
+ var aLen = arguments.length;
+ var mapfn = aLen > 1 ? arguments[1] : undefined;
+ var mapping = mapfn !== undefined;
+ var iterFn = getIterFn(O);
+ var i, length, values, result, step, iterator;
+ if (iterFn != undefined && !isArrayIter(iterFn)) {
+ for (iterator = iterFn.call(O), values = [], i = 0; !(step = iterator.next()).done; i++) {
+ values.push(step.value);
+ } O = values;
+ }
+ if (mapping && aLen > 2) mapfn = ctx(mapfn, arguments[2], 2);
+ for (i = 0, length = toLength(O.length), result = allocate(this, length); length > i; i++) {
+ result[i] = mapping ? mapfn(O[i], i) : O[i];
+ }
+ return result;
+ };
+
+ var $of = function of(/* ...items */) {
+ var index = 0;
+ var length = arguments.length;
+ var result = allocate(this, length);
+ while (length > index) result[index] = arguments[index++];
+ return result;
+ };
+
+ // iOS Safari 6.x fails here
+ var TO_LOCALE_BUG = !!Uint8Array && fails(function () { arrayToLocaleString.call(new Uint8Array(1)); });
+
+ var $toLocaleString = function toLocaleString() {
+ return arrayToLocaleString.apply(TO_LOCALE_BUG ? arraySlice.call(validate(this)) : validate(this), arguments);
+ };
+
+ var proto = {
+ copyWithin: function copyWithin(target, start /* , end */) {
+ return arrayCopyWithin.call(validate(this), target, start, arguments.length > 2 ? arguments[2] : undefined);
+ },
+ every: function every(callbackfn /* , thisArg */) {
+ return arrayEvery(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ },
+ fill: function fill(value /* , start, end */) { // eslint-disable-line no-unused-vars
+ return arrayFill.apply(validate(this), arguments);
+ },
+ filter: function filter(callbackfn /* , thisArg */) {
+ return speciesFromList(this, arrayFilter(validate(this), callbackfn,
+ arguments.length > 1 ? arguments[1] : undefined));
+ },
+ find: function find(predicate /* , thisArg */) {
+ return arrayFind(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);
+ },
+ findIndex: function findIndex(predicate /* , thisArg */) {
+ return arrayFindIndex(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);
+ },
+ forEach: function forEach(callbackfn /* , thisArg */) {
+ arrayForEach(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ },
+ indexOf: function indexOf(searchElement /* , fromIndex */) {
+ return arrayIndexOf(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);
+ },
+ includes: function includes(searchElement /* , fromIndex */) {
+ return arrayIncludes(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);
+ },
+ join: function join(separator) { // eslint-disable-line no-unused-vars
+ return arrayJoin.apply(validate(this), arguments);
+ },
+ lastIndexOf: function lastIndexOf(searchElement /* , fromIndex */) { // eslint-disable-line no-unused-vars
+ return arrayLastIndexOf.apply(validate(this), arguments);
+ },
+ map: function map(mapfn /* , thisArg */) {
+ return $map(validate(this), mapfn, arguments.length > 1 ? arguments[1] : undefined);
+ },
+ reduce: function reduce(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars
+ return arrayReduce.apply(validate(this), arguments);
+ },
+ reduceRight: function reduceRight(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars
+ return arrayReduceRight.apply(validate(this), arguments);
+ },
+ reverse: function reverse() {
+ var that = this;
+ var length = validate(that).length;
+ var middle = Math.floor(length / 2);
+ var index = 0;
+ var value;
+ while (index < middle) {
+ value = that[index];
+ that[index++] = that[--length];
+ that[length] = value;
+ } return that;
+ },
+ some: function some(callbackfn /* , thisArg */) {
+ return arraySome(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ },
+ sort: function sort(comparefn) {
+ return arraySort.call(validate(this), comparefn);
+ },
+ subarray: function subarray(begin, end) {
+ var O = validate(this);
+ var length = O.length;
+ var $begin = toAbsoluteIndex(begin, length);
+ return new (speciesConstructor(O, O[DEF_CONSTRUCTOR]))(
+ O.buffer,
+ O.byteOffset + $begin * O.BYTES_PER_ELEMENT,
+ toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - $begin)
+ );
+ }
+ };
+
+ var $slice = function slice(start, end) {
+ return speciesFromList(this, arraySlice.call(validate(this), start, end));
+ };
+
+ var $set = function set(arrayLike /* , offset */) {
+ validate(this);
+ var offset = toOffset(arguments[1], 1);
+ var length = this.length;
+ var src = toObject(arrayLike);
+ var len = toLength(src.length);
+ var index = 0;
+ if (len + offset > length) throw RangeError(WRONG_LENGTH);
+ while (index < len) this[offset + index] = src[index++];
+ };
+
+ var $iterators = {
+ entries: function entries() {
+ return arrayEntries.call(validate(this));
+ },
+ keys: function keys() {
+ return arrayKeys.call(validate(this));
+ },
+ values: function values() {
+ return arrayValues.call(validate(this));
+ }
+ };
+
+ var isTAIndex = function (target, key) {
+ return isObject(target)
+ && target[TYPED_ARRAY]
+ && typeof key != 'symbol'
+ && key in target
+ && String(+key) == String(key);
+ };
+ var $getDesc = function getOwnPropertyDescriptor(target, key) {
+ return isTAIndex(target, key = toPrimitive(key, true))
+ ? propertyDesc(2, target[key])
+ : gOPD(target, key);
+ };
+ var $setDesc = function defineProperty(target, key, desc) {
+ if (isTAIndex(target, key = toPrimitive(key, true))
+ && isObject(desc)
+ && has(desc, 'value')
+ && !has(desc, 'get')
+ && !has(desc, 'set')
+ // TODO: add validation descriptor w/o calling accessors
+ && !desc.configurable
+ && (!has(desc, 'writable') || desc.writable)
+ && (!has(desc, 'enumerable') || desc.enumerable)
+ ) {
+ target[key] = desc.value;
+ return target;
+ } return dP(target, key, desc);
+ };
+
+ if (!ALL_CONSTRUCTORS) {
+ $GOPD.f = $getDesc;
+ $DP.f = $setDesc;
+ }
+
+ $export($export.S + $export.F * !ALL_CONSTRUCTORS, 'Object', {
+ getOwnPropertyDescriptor: $getDesc,
+ defineProperty: $setDesc
+ });
+
+ if (fails(function () { arrayToString.call({}); })) {
+ arrayToString = arrayToLocaleString = function toString() {
+ return arrayJoin.call(this);
+ };
+ }
+
+ var $TypedArrayPrototype$ = redefineAll({}, proto);
+ redefineAll($TypedArrayPrototype$, $iterators);
+ hide($TypedArrayPrototype$, ITERATOR, $iterators.values);
+ redefineAll($TypedArrayPrototype$, {
+ slice: $slice,
+ set: $set,
+ constructor: function () { /* noop */ },
+ toString: arrayToString,
+ toLocaleString: $toLocaleString
+ });
+ addGetter($TypedArrayPrototype$, 'buffer', 'b');
+ addGetter($TypedArrayPrototype$, 'byteOffset', 'o');
+ addGetter($TypedArrayPrototype$, 'byteLength', 'l');
+ addGetter($TypedArrayPrototype$, 'length', 'e');
+ dP($TypedArrayPrototype$, TAG, {
+ get: function () { return this[TYPED_ARRAY]; }
+ });
+
+ // eslint-disable-next-line max-statements
+ module.exports = function (KEY, BYTES, wrapper, CLAMPED) {
+ CLAMPED = !!CLAMPED;
+ var NAME = KEY + (CLAMPED ? 'Clamped' : '') + 'Array';
+ var GETTER = 'get' + KEY;
+ var SETTER = 'set' + KEY;
+ var TypedArray = global[NAME];
+ var Base = TypedArray || {};
+ var TAC = TypedArray && getPrototypeOf(TypedArray);
+ var FORCED = !TypedArray || !$typed.ABV;
+ var O = {};
+ var TypedArrayPrototype = TypedArray && TypedArray[PROTOTYPE];
+ var getter = function (that, index) {
+ var data = that._d;
+ return data.v[GETTER](index * BYTES + data.o, LITTLE_ENDIAN);
+ };
+ var setter = function (that, index, value) {
+ var data = that._d;
+ if (CLAMPED) value = (value = Math.round(value)) < 0 ? 0 : value > 0xff ? 0xff : value & 0xff;
+ data.v[SETTER](index * BYTES + data.o, value, LITTLE_ENDIAN);
+ };
+ var addElement = function (that, index) {
+ dP(that, index, {
+ get: function () {
+ return getter(this, index);
+ },
+ set: function (value) {
+ return setter(this, index, value);
+ },
+ enumerable: true
+ });
+ };
+ if (FORCED) {
+ TypedArray = wrapper(function (that, data, $offset, $length) {
+ anInstance(that, TypedArray, NAME, '_d');
+ var index = 0;
+ var offset = 0;
+ var buffer, byteLength, length, klass;
+ if (!isObject(data)) {
+ length = toIndex(data);
+ byteLength = length * BYTES;
+ buffer = new $ArrayBuffer(byteLength);
+ } else if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {
+ buffer = data;
+ offset = toOffset($offset, BYTES);
+ var $len = data.byteLength;
+ if ($length === undefined) {
+ if ($len % BYTES) throw RangeError(WRONG_LENGTH);
+ byteLength = $len - offset;
+ if (byteLength < 0) throw RangeError(WRONG_LENGTH);
+ } else {
+ byteLength = toLength($length) * BYTES;
+ if (byteLength + offset > $len) throw RangeError(WRONG_LENGTH);
+ }
+ length = byteLength / BYTES;
+ } else if (TYPED_ARRAY in data) {
+ return fromList(TypedArray, data);
+ } else {
+ return $from.call(TypedArray, data);
+ }
+ hide(that, '_d', {
+ b: buffer,
+ o: offset,
+ l: byteLength,
+ e: length,
+ v: new $DataView(buffer)
+ });
+ while (index < length) addElement(that, index++);
+ });
+ TypedArrayPrototype = TypedArray[PROTOTYPE] = create($TypedArrayPrototype$);
+ hide(TypedArrayPrototype, 'constructor', TypedArray);
+ } else if (!fails(function () {
+ TypedArray(1);
+ }) || !fails(function () {
+ new TypedArray(-1); // eslint-disable-line no-new
+ }) || !$iterDetect(function (iter) {
+ new TypedArray(); // eslint-disable-line no-new
+ new TypedArray(null); // eslint-disable-line no-new
+ new TypedArray(1.5); // eslint-disable-line no-new
+ new TypedArray(iter); // eslint-disable-line no-new
+ }, true)) {
+ TypedArray = wrapper(function (that, data, $offset, $length) {
+ anInstance(that, TypedArray, NAME);
+ var klass;
+ // `ws` module bug, temporarily remove validation length for Uint8Array
+ // https://github.com/websockets/ws/pull/645
+ if (!isObject(data)) return new Base(toIndex(data));
+ if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {
+ return $length !== undefined
+ ? new Base(data, toOffset($offset, BYTES), $length)
+ : $offset !== undefined
+ ? new Base(data, toOffset($offset, BYTES))
+ : new Base(data);
+ }
+ if (TYPED_ARRAY in data) return fromList(TypedArray, data);
+ return $from.call(TypedArray, data);
+ });
+ arrayForEach(TAC !== Function.prototype ? gOPN(Base).concat(gOPN(TAC)) : gOPN(Base), function (key) {
+ if (!(key in TypedArray)) hide(TypedArray, key, Base[key]);
+ });
+ TypedArray[PROTOTYPE] = TypedArrayPrototype;
+ if (!LIBRARY) TypedArrayPrototype.constructor = TypedArray;
+ }
+ var $nativeIterator = TypedArrayPrototype[ITERATOR];
+ var CORRECT_ITER_NAME = !!$nativeIterator
+ && ($nativeIterator.name == 'values' || $nativeIterator.name == undefined);
+ var $iterator = $iterators.values;
+ hide(TypedArray, TYPED_CONSTRUCTOR, true);
+ hide(TypedArrayPrototype, TYPED_ARRAY, NAME);
+ hide(TypedArrayPrototype, VIEW, true);
+ hide(TypedArrayPrototype, DEF_CONSTRUCTOR, TypedArray);
+
+ if (CLAMPED ? new TypedArray(1)[TAG] != NAME : !(TAG in TypedArrayPrototype)) {
+ dP(TypedArrayPrototype, TAG, {
+ get: function () { return NAME; }
+ });
+ }
+
+ O[NAME] = TypedArray;
+
+ $export($export.G + $export.W + $export.F * (TypedArray != Base), O);
+
+ $export($export.S, NAME, {
+ BYTES_PER_ELEMENT: BYTES
+ });
+
+ $export($export.S + $export.F * fails(function () { Base.of.call(TypedArray, 1); }), NAME, {
+ from: $from,
+ of: $of
+ });
+
+ if (!(BYTES_PER_ELEMENT in TypedArrayPrototype)) hide(TypedArrayPrototype, BYTES_PER_ELEMENT, BYTES);
+
+ $export($export.P, NAME, proto);
+
+ setSpecies(NAME);
+
+ $export($export.P + $export.F * FORCED_SET, NAME, { set: $set });
+
+ $export($export.P + $export.F * !CORRECT_ITER_NAME, NAME, $iterators);
+
+ if (!LIBRARY && TypedArrayPrototype.toString != arrayToString) TypedArrayPrototype.toString = arrayToString;
+
+ $export($export.P + $export.F * fails(function () {
+ new TypedArray(1).slice();
+ }), NAME, { slice: $slice });
+
+ $export($export.P + $export.F * (fails(function () {
+ return [1, 2].toLocaleString() != new TypedArray([1, 2]).toLocaleString();
+ }) || !fails(function () {
+ TypedArrayPrototype.toLocaleString.call([1, 2]);
+ })), NAME, { toLocaleString: $toLocaleString });
+
+ Iterators[NAME] = CORRECT_ITER_NAME ? $nativeIterator : $iterator;
+ if (!LIBRARY && !CORRECT_ITER_NAME) hide(TypedArrayPrototype, ITERATOR, $iterator);
+ };
+} else module.exports = function () { /* empty */ };
+
+
+/***/ }),
+/* 28 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var Map = __webpack_require__(112);
+var $export = __webpack_require__(0);
+var shared = __webpack_require__(49)('metadata');
+var store = shared.store || (shared.store = new (__webpack_require__(115))());
+
+var getOrCreateMetadataMap = function (target, targetKey, create) {
+ var targetMetadata = store.get(target);
+ if (!targetMetadata) {
+ if (!create) return undefined;
+ store.set(target, targetMetadata = new Map());
+ }
+ var keyMetadata = targetMetadata.get(targetKey);
+ if (!keyMetadata) {
+ if (!create) return undefined;
+ targetMetadata.set(targetKey, keyMetadata = new Map());
+ } return keyMetadata;
+};
+var ordinaryHasOwnMetadata = function (MetadataKey, O, P) {
+ var metadataMap = getOrCreateMetadataMap(O, P, false);
+ return metadataMap === undefined ? false : metadataMap.has(MetadataKey);
+};
+var ordinaryGetOwnMetadata = function (MetadataKey, O, P) {
+ var metadataMap = getOrCreateMetadataMap(O, P, false);
+ return metadataMap === undefined ? undefined : metadataMap.get(MetadataKey);
+};
+var ordinaryDefineOwnMetadata = function (MetadataKey, MetadataValue, O, P) {
+ getOrCreateMetadataMap(O, P, true).set(MetadataKey, MetadataValue);
+};
+var ordinaryOwnMetadataKeys = function (target, targetKey) {
+ var metadataMap = getOrCreateMetadataMap(target, targetKey, false);
+ var keys = [];
+ if (metadataMap) metadataMap.forEach(function (_, key) { keys.push(key); });
+ return keys;
+};
+var toMetaKey = function (it) {
+ return it === undefined || typeof it == 'symbol' ? it : String(it);
+};
+var exp = function (O) {
+ $export($export.S, 'Reflect', O);
+};
+
+module.exports = {
+ store: store,
+ map: getOrCreateMetadataMap,
+ has: ordinaryHasOwnMetadata,
+ get: ordinaryGetOwnMetadata,
+ set: ordinaryDefineOwnMetadata,
+ keys: ordinaryOwnMetadataKeys,
+ key: toMetaKey,
+ exp: exp
+};
+
+
+/***/ }),
+/* 29 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var META = __webpack_require__(33)('meta');
+var isObject = __webpack_require__(4);
+var has = __webpack_require__(14);
+var setDesc = __webpack_require__(7).f;
+var id = 0;
+var isExtensible = Object.isExtensible || function () {
+ return true;
+};
+var FREEZE = !__webpack_require__(3)(function () {
+ return isExtensible(Object.preventExtensions({}));
+});
+var setMeta = function (it) {
+ setDesc(it, META, { value: {
+ i: 'O' + ++id, // object ID
+ w: {} // weak collections IDs
+ } });
+};
+var fastKey = function (it, create) {
+ // return primitive with prefix
+ if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;
+ if (!has(it, META)) {
+ // can't set metadata to uncaught frozen object
+ if (!isExtensible(it)) return 'F';
+ // not necessary to add metadata
+ if (!create) return 'E';
+ // add missing metadata
+ setMeta(it);
+ // return object ID
+ } return it[META].i;
+};
+var getWeak = function (it, create) {
+ if (!has(it, META)) {
+ // can't set metadata to uncaught frozen object
+ if (!isExtensible(it)) return true;
+ // not necessary to add metadata
+ if (!create) return false;
+ // add missing metadata
+ setMeta(it);
+ // return hash weak collections IDs
+ } return it[META].w;
+};
+// add metadata on freeze-family methods calling
+var onFreeze = function (it) {
+ if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);
+ return it;
+};
+var meta = module.exports = {
+ KEY: META,
+ NEED: false,
+ fastKey: fastKey,
+ getWeak: getWeak,
+ onFreeze: onFreeze
+};
+
+
+/***/ }),
+/* 30 */
+/***/ (function(module, exports) {
+
+module.exports = false;
+
+
+/***/ }),
+/* 31 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 22.1.3.31 Array.prototype[@@unscopables]
+var UNSCOPABLES = __webpack_require__(5)('unscopables');
+var ArrayProto = Array.prototype;
+if (ArrayProto[UNSCOPABLES] == undefined) __webpack_require__(11)(ArrayProto, UNSCOPABLES, {});
+module.exports = function (key) {
+ ArrayProto[UNSCOPABLES][key] = true;
+};
+
+
+/***/ }),
+/* 32 */
+/***/ (function(module, exports) {
+
+module.exports = function (bitmap, value) {
+ return {
+ enumerable: !(bitmap & 1),
+ configurable: !(bitmap & 2),
+ writable: !(bitmap & 4),
+ value: value
+ };
+};
+
+
+/***/ }),
+/* 33 */
+/***/ (function(module, exports) {
+
+var id = 0;
+var px = Math.random();
+module.exports = function (key) {
+ return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
+};
+
+
+/***/ }),
+/* 34 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.14 / 15.2.3.14 Object.keys(O)
+var $keys = __webpack_require__(93);
+var enumBugKeys = __webpack_require__(67);
+
+module.exports = Object.keys || function keys(O) {
+ return $keys(O, enumBugKeys);
+};
+
+
+/***/ }),
+/* 35 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var toInteger = __webpack_require__(24);
+var max = Math.max;
+var min = Math.min;
+module.exports = function (index, length) {
+ index = toInteger(index);
+ return index < 0 ? max(index + length, 0) : min(index, length);
+};
+
+
+/***/ }),
+/* 36 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
+var anObject = __webpack_require__(1);
+var dPs = __webpack_require__(94);
+var enumBugKeys = __webpack_require__(67);
+var IE_PROTO = __webpack_require__(66)('IE_PROTO');
+var Empty = function () { /* empty */ };
+var PROTOTYPE = 'prototype';
+
+// Create object with fake `null` prototype: use iframe Object with cleared prototype
+var createDict = function () {
+ // Thrash, waste and sodomy: IE GC bug
+ var iframe = __webpack_require__(64)('iframe');
+ var i = enumBugKeys.length;
+ var lt = '<';
+ var gt = '>';
+ var iframeDocument;
+ iframe.style.display = 'none';
+ __webpack_require__(68).appendChild(iframe);
+ iframe.src = 'javascript:'; // eslint-disable-line no-script-url
+ // createDict = iframe.contentWindow.Object;
+ // html.removeChild(iframe);
+ iframeDocument = iframe.contentWindow.document;
+ iframeDocument.open();
+ iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);
+ iframeDocument.close();
+ createDict = iframeDocument.F;
+ while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];
+ return createDict();
+};
+
+module.exports = Object.create || function create(O, Properties) {
+ var result;
+ if (O !== null) {
+ Empty[PROTOTYPE] = anObject(O);
+ result = new Empty();
+ Empty[PROTOTYPE] = null;
+ // add "__proto__" for Object.getPrototypeOf polyfill
+ result[IE_PROTO] = O;
+ } else result = createDict();
+ return Properties === undefined ? result : dPs(result, Properties);
+};
+
+
+/***/ }),
+/* 37 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)
+var $keys = __webpack_require__(93);
+var hiddenKeys = __webpack_require__(67).concat('length', 'prototype');
+
+exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {
+ return $keys(O, hiddenKeys);
+};
+
+
+/***/ }),
+/* 38 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var global = __webpack_require__(2);
+var dP = __webpack_require__(7);
+var DESCRIPTORS = __webpack_require__(6);
+var SPECIES = __webpack_require__(5)('species');
+
+module.exports = function (KEY) {
+ var C = global[KEY];
+ if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {
+ configurable: true,
+ get: function () { return this; }
+ });
+};
+
+
+/***/ }),
+/* 39 */
+/***/ (function(module, exports) {
+
+module.exports = function (it, Constructor, name, forbiddenField) {
+ if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {
+ throw TypeError(name + ': incorrect invocation!');
+ } return it;
+};
+
+
+/***/ }),
+/* 40 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var ctx = __webpack_require__(19);
+var call = __webpack_require__(105);
+var isArrayIter = __webpack_require__(80);
+var anObject = __webpack_require__(1);
+var toLength = __webpack_require__(8);
+var getIterFn = __webpack_require__(82);
+var BREAK = {};
+var RETURN = {};
+var exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {
+ var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);
+ var f = ctx(fn, that, entries ? 2 : 1);
+ var index = 0;
+ var length, step, iterator, result;
+ if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');
+ // fast case for arrays with default iterator
+ if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {
+ result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);
+ if (result === BREAK || result === RETURN) return result;
+ } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {
+ result = call(iterator, f, step.value, entries);
+ if (result === BREAK || result === RETURN) return result;
+ }
+};
+exports.BREAK = BREAK;
+exports.RETURN = RETURN;
+
+
+/***/ }),
+/* 41 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var redefine = __webpack_require__(12);
+module.exports = function (target, src, safe) {
+ for (var key in src) redefine(target, key, src[key], safe);
+ return target;
+};
+
+
+/***/ }),
+/* 42 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var def = __webpack_require__(7).f;
+var has = __webpack_require__(14);
+var TAG = __webpack_require__(5)('toStringTag');
+
+module.exports = function (it, tag, stat) {
+ if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });
+};
+
+
+/***/ }),
+/* 43 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $export = __webpack_require__(0);
+var defined = __webpack_require__(23);
+var fails = __webpack_require__(3);
+var spaces = __webpack_require__(70);
+var space = '[' + spaces + ']';
+var non = '\u200b\u0085';
+var ltrim = RegExp('^' + space + space + '*');
+var rtrim = RegExp(space + space + '*$');
+
+var exporter = function (KEY, exec, ALIAS) {
+ var exp = {};
+ var FORCE = fails(function () {
+ return !!spaces[KEY]() || non[KEY]() != non;
+ });
+ var fn = exp[KEY] = FORCE ? exec(trim) : spaces[KEY];
+ if (ALIAS) exp[ALIAS] = fn;
+ $export($export.P + $export.F * FORCE, 'String', exp);
+};
+
+// 1 -> String#trimLeft
+// 2 -> String#trimRight
+// 3 -> String#trim
+var trim = exporter.trim = function (string, TYPE) {
+ string = String(defined(string));
+ if (TYPE & 1) string = string.replace(ltrim, '');
+ if (TYPE & 2) string = string.replace(rtrim, '');
+ return string;
+};
+
+module.exports = exporter;
+
+
+/***/ }),
+/* 44 */
+/***/ (function(module, exports) {
+
+module.exports = {};
+
+
+/***/ }),
+/* 45 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isObject = __webpack_require__(4);
+module.exports = function (it, TYPE) {
+ if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');
+ return it;
+};
+
+
+/***/ }),
+/* 46 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// fallback for non-array-like ES3 and non-enumerable old V8 strings
+var cof = __webpack_require__(20);
+// eslint-disable-next-line no-prototype-builtins
+module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {
+ return cof(it) == 'String' ? it.split('') : Object(it);
+};
+
+
+/***/ }),
+/* 47 */
+/***/ (function(module, exports) {
+
+exports.f = {}.propertyIsEnumerable;
+
+
+/***/ }),
+/* 48 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// getting tag from 19.1.3.6 Object.prototype.toString()
+var cof = __webpack_require__(20);
+var TAG = __webpack_require__(5)('toStringTag');
+// ES3 wrong here
+var ARG = cof(function () { return arguments; }()) == 'Arguments';
+
+// fallback for IE11 Script Access Denied error
+var tryGet = function (it, key) {
+ try {
+ return it[key];
+ } catch (e) { /* empty */ }
+};
+
+module.exports = function (it) {
+ var O, T, B;
+ return it === undefined ? 'Undefined' : it === null ? 'Null'
+ // @@toStringTag case
+ : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T
+ // builtinTag case
+ : ARG ? cof(O)
+ // ES3 arguments fallback
+ : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;
+};
+
+
+/***/ }),
+/* 49 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var core = __webpack_require__(18);
+var global = __webpack_require__(2);
+var SHARED = '__core-js_shared__';
+var store = global[SHARED] || (global[SHARED] = {});
+
+(module.exports = function (key, value) {
+ return store[key] || (store[key] = value !== undefined ? value : {});
+})('versions', []).push({
+ version: core.version,
+ mode: __webpack_require__(30) ? 'pure' : 'global',
+ copyright: '© 2018 Denis Pushkarev (zloirock.ru)'
+});
+
+
+/***/ }),
+/* 50 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// false -> Array#indexOf
+// true -> Array#includes
+var toIObject = __webpack_require__(15);
+var toLength = __webpack_require__(8);
+var toAbsoluteIndex = __webpack_require__(35);
+module.exports = function (IS_INCLUDES) {
+ return function ($this, el, fromIndex) {
+ var O = toIObject($this);
+ var length = toLength(O.length);
+ var index = toAbsoluteIndex(fromIndex, length);
+ var value;
+ // Array#includes uses SameValueZero equality algorithm
+ // eslint-disable-next-line no-self-compare
+ if (IS_INCLUDES && el != el) while (length > index) {
+ value = O[index++];
+ // eslint-disable-next-line no-self-compare
+ if (value != value) return true;
+ // Array#indexOf ignores holes, Array#includes - not
+ } else for (;length > index; index++) if (IS_INCLUDES || index in O) {
+ if (O[index] === el) return IS_INCLUDES || index || 0;
+ } return !IS_INCLUDES && -1;
+ };
+};
+
+
+/***/ }),
+/* 51 */
+/***/ (function(module, exports) {
+
+exports.f = Object.getOwnPropertySymbols;
+
+
+/***/ }),
+/* 52 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.2.2 IsArray(argument)
+var cof = __webpack_require__(20);
+module.exports = Array.isArray || function isArray(arg) {
+ return cof(arg) == 'Array';
+};
+
+
+/***/ }),
+/* 53 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.2.8 IsRegExp(argument)
+var isObject = __webpack_require__(4);
+var cof = __webpack_require__(20);
+var MATCH = __webpack_require__(5)('match');
+module.exports = function (it) {
+ var isRegExp;
+ return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');
+};
+
+
+/***/ }),
+/* 54 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var ITERATOR = __webpack_require__(5)('iterator');
+var SAFE_CLOSING = false;
+
+try {
+ var riter = [7][ITERATOR]();
+ riter['return'] = function () { SAFE_CLOSING = true; };
+ // eslint-disable-next-line no-throw-literal
+ Array.from(riter, function () { throw 2; });
+} catch (e) { /* empty */ }
+
+module.exports = function (exec, skipClosing) {
+ if (!skipClosing && !SAFE_CLOSING) return false;
+ var safe = false;
+ try {
+ var arr = [7];
+ var iter = arr[ITERATOR]();
+ iter.next = function () { return { done: safe = true }; };
+ arr[ITERATOR] = function () { return iter; };
+ exec(arr);
+ } catch (e) { /* empty */ }
+ return safe;
+};
+
+
+/***/ }),
+/* 55 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// 21.2.5.3 get RegExp.prototype.flags
+var anObject = __webpack_require__(1);
+module.exports = function () {
+ var that = anObject(this);
+ var result = '';
+ if (that.global) result += 'g';
+ if (that.ignoreCase) result += 'i';
+ if (that.multiline) result += 'm';
+ if (that.unicode) result += 'u';
+ if (that.sticky) result += 'y';
+ return result;
+};
+
+
+/***/ }),
+/* 56 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var hide = __webpack_require__(11);
+var redefine = __webpack_require__(12);
+var fails = __webpack_require__(3);
+var defined = __webpack_require__(23);
+var wks = __webpack_require__(5);
+
+module.exports = function (KEY, length, exec) {
+ var SYMBOL = wks(KEY);
+ var fns = exec(defined, SYMBOL, ''[KEY]);
+ var strfn = fns[0];
+ var rxfn = fns[1];
+ if (fails(function () {
+ var O = {};
+ O[SYMBOL] = function () { return 7; };
+ return ''[KEY](O) != 7;
+ })) {
+ redefine(String.prototype, KEY, strfn);
+ hide(RegExp.prototype, SYMBOL, length == 2
+ // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)
+ // 21.2.5.11 RegExp.prototype[@@split](string, limit)
+ ? function (string, arg) { return rxfn.call(string, this, arg); }
+ // 21.2.5.6 RegExp.prototype[@@match](string)
+ // 21.2.5.9 RegExp.prototype[@@search](string)
+ : function (string) { return rxfn.call(string, this); }
+ );
+ }
+};
+
+
+/***/ }),
+/* 57 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 7.3.20 SpeciesConstructor(O, defaultConstructor)
+var anObject = __webpack_require__(1);
+var aFunction = __webpack_require__(10);
+var SPECIES = __webpack_require__(5)('species');
+module.exports = function (O, D) {
+ var C = anObject(O).constructor;
+ var S;
+ return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);
+};
+
+
+/***/ }),
+/* 58 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(2);
+var navigator = global.navigator;
+
+module.exports = navigator && navigator.userAgent || '';
+
+
+/***/ }),
+/* 59 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var global = __webpack_require__(2);
+var $export = __webpack_require__(0);
+var redefine = __webpack_require__(12);
+var redefineAll = __webpack_require__(41);
+var meta = __webpack_require__(29);
+var forOf = __webpack_require__(40);
+var anInstance = __webpack_require__(39);
+var isObject = __webpack_require__(4);
+var fails = __webpack_require__(3);
+var $iterDetect = __webpack_require__(54);
+var setToStringTag = __webpack_require__(42);
+var inheritIfRequired = __webpack_require__(71);
+
+module.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {
+ var Base = global[NAME];
+ var C = Base;
+ var ADDER = IS_MAP ? 'set' : 'add';
+ var proto = C && C.prototype;
+ var O = {};
+ var fixMethod = function (KEY) {
+ var fn = proto[KEY];
+ redefine(proto, KEY,
+ KEY == 'delete' ? function (a) {
+ return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);
+ } : KEY == 'has' ? function has(a) {
+ return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);
+ } : KEY == 'get' ? function get(a) {
+ return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);
+ } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; }
+ : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; }
+ );
+ };
+ if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {
+ new C().entries().next();
+ }))) {
+ // create collection constructor
+ C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);
+ redefineAll(C.prototype, methods);
+ meta.NEED = true;
+ } else {
+ var instance = new C();
+ // early implementations not supports chaining
+ var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;
+ // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false
+ var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });
+ // most early implementations doesn't supports iterables, most modern - not close it correctly
+ var ACCEPT_ITERABLES = $iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new
+ // for early implementations -0 and +0 not the same
+ var BUGGY_ZERO = !IS_WEAK && fails(function () {
+ // V8 ~ Chromium 42- fails only with 5+ elements
+ var $instance = new C();
+ var index = 5;
+ while (index--) $instance[ADDER](index, index);
+ return !$instance.has(-0);
+ });
+ if (!ACCEPT_ITERABLES) {
+ C = wrapper(function (target, iterable) {
+ anInstance(target, C, NAME);
+ var that = inheritIfRequired(new Base(), target, C);
+ if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);
+ return that;
+ });
+ C.prototype = proto;
+ proto.constructor = C;
+ }
+ if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {
+ fixMethod('delete');
+ fixMethod('has');
+ IS_MAP && fixMethod('get');
+ }
+ if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);
+ // weak collections should not contains .clear method
+ if (IS_WEAK && proto.clear) delete proto.clear;
+ }
+
+ setToStringTag(C, NAME);
+
+ O[NAME] = C;
+ $export($export.G + $export.W + $export.F * (C != Base), O);
+
+ if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);
+
+ return C;
+};
+
+
+/***/ }),
+/* 60 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(2);
+var hide = __webpack_require__(11);
+var uid = __webpack_require__(33);
+var TYPED = uid('typed_array');
+var VIEW = uid('view');
+var ABV = !!(global.ArrayBuffer && global.DataView);
+var CONSTR = ABV;
+var i = 0;
+var l = 9;
+var Typed;
+
+var TypedArrayConstructors = (
+ 'Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array'
+).split(',');
+
+while (i < l) {
+ if (Typed = global[TypedArrayConstructors[i++]]) {
+ hide(Typed.prototype, TYPED, true);
+ hide(Typed.prototype, VIEW, true);
+ } else CONSTR = false;
+}
+
+module.exports = {
+ ABV: ABV,
+ CONSTR: CONSTR,
+ TYPED: TYPED,
+ VIEW: VIEW
+};
+
+
+/***/ }),
+/* 61 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// Forced replacement prototype accessors methods
+module.exports = __webpack_require__(30) || !__webpack_require__(3)(function () {
+ var K = Math.random();
+ // In FF throws only define methods
+ // eslint-disable-next-line no-undef, no-useless-call
+ __defineSetter__.call(null, K, function () { /* empty */ });
+ delete __webpack_require__(2)[K];
+});
+
+
+/***/ }),
+/* 62 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// https://tc39.github.io/proposal-setmap-offrom/
+var $export = __webpack_require__(0);
+
+module.exports = function (COLLECTION) {
+ $export($export.S, COLLECTION, { of: function of() {
+ var length = arguments.length;
+ var A = new Array(length);
+ while (length--) A[length] = arguments[length];
+ return new this(A);
+ } });
+};
+
+
+/***/ }),
+/* 63 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// https://tc39.github.io/proposal-setmap-offrom/
+var $export = __webpack_require__(0);
+var aFunction = __webpack_require__(10);
+var ctx = __webpack_require__(19);
+var forOf = __webpack_require__(40);
+
+module.exports = function (COLLECTION) {
+ $export($export.S, COLLECTION, { from: function from(source /* , mapFn, thisArg */) {
+ var mapFn = arguments[1];
+ var mapping, A, n, cb;
+ aFunction(this);
+ mapping = mapFn !== undefined;
+ if (mapping) aFunction(mapFn);
+ if (source == undefined) return new this();
+ A = [];
+ if (mapping) {
+ n = 0;
+ cb = ctx(mapFn, arguments[2], 2);
+ forOf(source, false, function (nextItem) {
+ A.push(cb(nextItem, n++));
+ });
+ } else {
+ forOf(source, false, A.push, A);
+ }
+ return new this(A);
+ } });
+};
+
+
+/***/ }),
+/* 64 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isObject = __webpack_require__(4);
+var document = __webpack_require__(2).document;
+// typeof document.createElement is 'object' in old IE
+var is = isObject(document) && isObject(document.createElement);
+module.exports = function (it) {
+ return is ? document.createElement(it) : {};
+};
+
+
+/***/ }),
+/* 65 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(2);
+var core = __webpack_require__(18);
+var LIBRARY = __webpack_require__(30);
+var wksExt = __webpack_require__(92);
+var defineProperty = __webpack_require__(7).f;
+module.exports = function (name) {
+ var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});
+ if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });
+};
+
+
+/***/ }),
+/* 66 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var shared = __webpack_require__(49)('keys');
+var uid = __webpack_require__(33);
+module.exports = function (key) {
+ return shared[key] || (shared[key] = uid(key));
+};
+
+
+/***/ }),
+/* 67 */
+/***/ (function(module, exports) {
+
+// IE 8- don't enum bug keys
+module.exports = (
+ 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'
+).split(',');
+
+
+/***/ }),
+/* 68 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var document = __webpack_require__(2).document;
+module.exports = document && document.documentElement;
+
+
+/***/ }),
+/* 69 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// Works with __proto__ only. Old v8 can't work with null proto objects.
+/* eslint-disable no-proto */
+var isObject = __webpack_require__(4);
+var anObject = __webpack_require__(1);
+var check = function (O, proto) {
+ anObject(O);
+ if (!isObject(proto) && proto !== null) throw TypeError(proto + ": can't set as prototype!");
+};
+module.exports = {
+ set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line
+ function (test, buggy, set) {
+ try {
+ set = __webpack_require__(19)(Function.call, __webpack_require__(16).f(Object.prototype, '__proto__').set, 2);
+ set(test, []);
+ buggy = !(test instanceof Array);
+ } catch (e) { buggy = true; }
+ return function setPrototypeOf(O, proto) {
+ check(O, proto);
+ if (buggy) O.__proto__ = proto;
+ else set(O, proto);
+ return O;
+ };
+ }({}, false) : undefined),
+ check: check
+};
+
+
+/***/ }),
+/* 70 */
+/***/ (function(module, exports) {
+
+module.exports = '\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003' +
+ '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF';
+
+
+/***/ }),
+/* 71 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isObject = __webpack_require__(4);
+var setPrototypeOf = __webpack_require__(69).set;
+module.exports = function (that, target, C) {
+ var S = target.constructor;
+ var P;
+ if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {
+ setPrototypeOf(that, P);
+ } return that;
+};
+
+
+/***/ }),
+/* 72 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var toInteger = __webpack_require__(24);
+var defined = __webpack_require__(23);
+
+module.exports = function repeat(count) {
+ var str = String(defined(this));
+ var res = '';
+ var n = toInteger(count);
+ if (n < 0 || n == Infinity) throw RangeError("Count can't be negative");
+ for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) res += str;
+ return res;
+};
+
+
+/***/ }),
+/* 73 */
+/***/ (function(module, exports) {
+
+// 20.2.2.28 Math.sign(x)
+module.exports = Math.sign || function sign(x) {
+ // eslint-disable-next-line no-self-compare
+ return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;
+};
+
+
+/***/ }),
+/* 74 */
+/***/ (function(module, exports) {
+
+// 20.2.2.14 Math.expm1(x)
+var $expm1 = Math.expm1;
+module.exports = (!$expm1
+ // Old FF bug
+ || $expm1(10) > 22025.465794806719 || $expm1(10) < 22025.4657948067165168
+ // Tor Browser bug
+ || $expm1(-2e-17) != -2e-17
+) ? function expm1(x) {
+ return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1;
+} : $expm1;
+
+
+/***/ }),
+/* 75 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var toInteger = __webpack_require__(24);
+var defined = __webpack_require__(23);
+// true -> String#at
+// false -> String#codePointAt
+module.exports = function (TO_STRING) {
+ return function (that, pos) {
+ var s = String(defined(that));
+ var i = toInteger(pos);
+ var l = s.length;
+ var a, b;
+ if (i < 0 || i >= l) return TO_STRING ? '' : undefined;
+ a = s.charCodeAt(i);
+ return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff
+ ? TO_STRING ? s.charAt(i) : a
+ : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;
+ };
+};
+
+
+/***/ }),
+/* 76 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var LIBRARY = __webpack_require__(30);
+var $export = __webpack_require__(0);
+var redefine = __webpack_require__(12);
+var hide = __webpack_require__(11);
+var Iterators = __webpack_require__(44);
+var $iterCreate = __webpack_require__(77);
+var setToStringTag = __webpack_require__(42);
+var getPrototypeOf = __webpack_require__(17);
+var ITERATOR = __webpack_require__(5)('iterator');
+var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`
+var FF_ITERATOR = '@@iterator';
+var KEYS = 'keys';
+var VALUES = 'values';
+
+var returnThis = function () { return this; };
+
+module.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {
+ $iterCreate(Constructor, NAME, next);
+ var getMethod = function (kind) {
+ if (!BUGGY && kind in proto) return proto[kind];
+ switch (kind) {
+ case KEYS: return function keys() { return new Constructor(this, kind); };
+ case VALUES: return function values() { return new Constructor(this, kind); };
+ } return function entries() { return new Constructor(this, kind); };
+ };
+ var TAG = NAME + ' Iterator';
+ var DEF_VALUES = DEFAULT == VALUES;
+ var VALUES_BUG = false;
+ var proto = Base.prototype;
+ var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];
+ var $default = $native || getMethod(DEFAULT);
+ var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;
+ var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;
+ var methods, key, IteratorPrototype;
+ // Fix native
+ if ($anyNative) {
+ IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));
+ if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {
+ // Set @@toStringTag to native iterators
+ setToStringTag(IteratorPrototype, TAG, true);
+ // fix for some old engines
+ if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);
+ }
+ }
+ // fix Array#{values, @@iterator}.name in V8 / FF
+ if (DEF_VALUES && $native && $native.name !== VALUES) {
+ VALUES_BUG = true;
+ $default = function values() { return $native.call(this); };
+ }
+ // Define iterator
+ if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {
+ hide(proto, ITERATOR, $default);
+ }
+ // Plug for library
+ Iterators[NAME] = $default;
+ Iterators[TAG] = returnThis;
+ if (DEFAULT) {
+ methods = {
+ values: DEF_VALUES ? $default : getMethod(VALUES),
+ keys: IS_SET ? $default : getMethod(KEYS),
+ entries: $entries
+ };
+ if (FORCED) for (key in methods) {
+ if (!(key in proto)) redefine(proto, key, methods[key]);
+ } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);
+ }
+ return methods;
+};
+
+
+/***/ }),
+/* 77 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var create = __webpack_require__(36);
+var descriptor = __webpack_require__(32);
+var setToStringTag = __webpack_require__(42);
+var IteratorPrototype = {};
+
+// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()
+__webpack_require__(11)(IteratorPrototype, __webpack_require__(5)('iterator'), function () { return this; });
+
+module.exports = function (Constructor, NAME, next) {
+ Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });
+ setToStringTag(Constructor, NAME + ' Iterator');
+};
+
+
+/***/ }),
+/* 78 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// helper for String#{startsWith, endsWith, includes}
+var isRegExp = __webpack_require__(53);
+var defined = __webpack_require__(23);
+
+module.exports = function (that, searchString, NAME) {
+ if (isRegExp(searchString)) throw TypeError('String#' + NAME + " doesn't accept regex!");
+ return String(defined(that));
+};
+
+
+/***/ }),
+/* 79 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var MATCH = __webpack_require__(5)('match');
+module.exports = function (KEY) {
+ var re = /./;
+ try {
+ '/./'[KEY](re);
+ } catch (e) {
+ try {
+ re[MATCH] = false;
+ return !'/./'[KEY](re);
+ } catch (f) { /* empty */ }
+ } return true;
+};
+
+
+/***/ }),
+/* 80 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// check on default Array iterator
+var Iterators = __webpack_require__(44);
+var ITERATOR = __webpack_require__(5)('iterator');
+var ArrayProto = Array.prototype;
+
+module.exports = function (it) {
+ return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);
+};
+
+
+/***/ }),
+/* 81 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $defineProperty = __webpack_require__(7);
+var createDesc = __webpack_require__(32);
+
+module.exports = function (object, index, value) {
+ if (index in object) $defineProperty.f(object, index, createDesc(0, value));
+ else object[index] = value;
+};
+
+
+/***/ }),
+/* 82 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var classof = __webpack_require__(48);
+var ITERATOR = __webpack_require__(5)('iterator');
+var Iterators = __webpack_require__(44);
+module.exports = __webpack_require__(18).getIteratorMethod = function (it) {
+ if (it != undefined) return it[ITERATOR]
+ || it['@@iterator']
+ || Iterators[classof(it)];
+};
+
+
+/***/ }),
+/* 83 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 9.4.2.3 ArraySpeciesCreate(originalArray, length)
+var speciesConstructor = __webpack_require__(217);
+
+module.exports = function (original, length) {
+ return new (speciesConstructor(original))(length);
+};
+
+
+/***/ }),
+/* 84 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)
+
+var toObject = __webpack_require__(9);
+var toAbsoluteIndex = __webpack_require__(35);
+var toLength = __webpack_require__(8);
+module.exports = function fill(value /* , start = 0, end = @length */) {
+ var O = toObject(this);
+ var length = toLength(O.length);
+ var aLen = arguments.length;
+ var index = toAbsoluteIndex(aLen > 1 ? arguments[1] : undefined, length);
+ var end = aLen > 2 ? arguments[2] : undefined;
+ var endPos = end === undefined ? length : toAbsoluteIndex(end, length);
+ while (endPos > index) O[index++] = value;
+ return O;
+};
+
+
+/***/ }),
+/* 85 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var addToUnscopables = __webpack_require__(31);
+var step = __webpack_require__(108);
+var Iterators = __webpack_require__(44);
+var toIObject = __webpack_require__(15);
+
+// 22.1.3.4 Array.prototype.entries()
+// 22.1.3.13 Array.prototype.keys()
+// 22.1.3.29 Array.prototype.values()
+// 22.1.3.30 Array.prototype[@@iterator]()
+module.exports = __webpack_require__(76)(Array, 'Array', function (iterated, kind) {
+ this._t = toIObject(iterated); // target
+ this._i = 0; // next index
+ this._k = kind; // kind
+// 22.1.5.2.1 %ArrayIteratorPrototype%.next()
+}, function () {
+ var O = this._t;
+ var kind = this._k;
+ var index = this._i++;
+ if (!O || index >= O.length) {
+ this._t = undefined;
+ return step(1);
+ }
+ if (kind == 'keys') return step(0, index);
+ if (kind == 'values') return step(0, O[index]);
+ return step(0, [index, O[index]]);
+}, 'values');
+
+// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)
+Iterators.Arguments = Iterators.Array;
+
+addToUnscopables('keys');
+addToUnscopables('values');
+addToUnscopables('entries');
+
+
+/***/ }),
+/* 86 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var ctx = __webpack_require__(19);
+var invoke = __webpack_require__(98);
+var html = __webpack_require__(68);
+var cel = __webpack_require__(64);
+var global = __webpack_require__(2);
+var process = global.process;
+var setTask = global.setImmediate;
+var clearTask = global.clearImmediate;
+var MessageChannel = global.MessageChannel;
+var Dispatch = global.Dispatch;
+var counter = 0;
+var queue = {};
+var ONREADYSTATECHANGE = 'onreadystatechange';
+var defer, channel, port;
+var run = function () {
+ var id = +this;
+ // eslint-disable-next-line no-prototype-builtins
+ if (queue.hasOwnProperty(id)) {
+ var fn = queue[id];
+ delete queue[id];
+ fn();
+ }
+};
+var listener = function (event) {
+ run.call(event.data);
+};
+// Node.js 0.9+ & IE10+ has setImmediate, otherwise:
+if (!setTask || !clearTask) {
+ setTask = function setImmediate(fn) {
+ var args = [];
+ var i = 1;
+ while (arguments.length > i) args.push(arguments[i++]);
+ queue[++counter] = function () {
+ // eslint-disable-next-line no-new-func
+ invoke(typeof fn == 'function' ? fn : Function(fn), args);
+ };
+ defer(counter);
+ return counter;
+ };
+ clearTask = function clearImmediate(id) {
+ delete queue[id];
+ };
+ // Node.js 0.8-
+ if (__webpack_require__(20)(process) == 'process') {
+ defer = function (id) {
+ process.nextTick(ctx(run, id, 1));
+ };
+ // Sphere (JS game engine) Dispatch API
+ } else if (Dispatch && Dispatch.now) {
+ defer = function (id) {
+ Dispatch.now(ctx(run, id, 1));
+ };
+ // Browsers with MessageChannel, includes WebWorkers
+ } else if (MessageChannel) {
+ channel = new MessageChannel();
+ port = channel.port2;
+ channel.port1.onmessage = listener;
+ defer = ctx(port.postMessage, port, 1);
+ // Browsers with postMessage, skip WebWorkers
+ // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'
+ } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {
+ defer = function (id) {
+ global.postMessage(id + '', '*');
+ };
+ global.addEventListener('message', listener, false);
+ // IE8-
+ } else if (ONREADYSTATECHANGE in cel('script')) {
+ defer = function (id) {
+ html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {
+ html.removeChild(this);
+ run.call(id);
+ };
+ };
+ // Rest old browsers
+ } else {
+ defer = function (id) {
+ setTimeout(ctx(run, id, 1), 0);
+ };
+ }
+}
+module.exports = {
+ set: setTask,
+ clear: clearTask
+};
+
+
+/***/ }),
+/* 87 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(2);
+var macrotask = __webpack_require__(86).set;
+var Observer = global.MutationObserver || global.WebKitMutationObserver;
+var process = global.process;
+var Promise = global.Promise;
+var isNode = __webpack_require__(20)(process) == 'process';
+
+module.exports = function () {
+ var head, last, notify;
+
+ var flush = function () {
+ var parent, fn;
+ if (isNode && (parent = process.domain)) parent.exit();
+ while (head) {
+ fn = head.fn;
+ head = head.next;
+ try {
+ fn();
+ } catch (e) {
+ if (head) notify();
+ else last = undefined;
+ throw e;
+ }
+ } last = undefined;
+ if (parent) parent.enter();
+ };
+
+ // Node.js
+ if (isNode) {
+ notify = function () {
+ process.nextTick(flush);
+ };
+ // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339
+ } else if (Observer && !(global.navigator && global.navigator.standalone)) {
+ var toggle = true;
+ var node = document.createTextNode('');
+ new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new
+ notify = function () {
+ node.data = toggle = !toggle;
+ };
+ // environments with maybe non-completely correct, but existent Promise
+ } else if (Promise && Promise.resolve) {
+ // Promise.resolve without an argument throws an error in LG WebOS 2
+ var promise = Promise.resolve(undefined);
+ notify = function () {
+ promise.then(flush);
+ };
+ // for other environments - macrotask based on:
+ // - setImmediate
+ // - MessageChannel
+ // - window.postMessag
+ // - onreadystatechange
+ // - setTimeout
+ } else {
+ notify = function () {
+ // strange IE + webpack dev server bug - use .call(global)
+ macrotask.call(global, flush);
+ };
+ }
+
+ return function (fn) {
+ var task = { fn: fn, next: undefined };
+ if (last) last.next = task;
+ if (!head) {
+ head = task;
+ notify();
+ } last = task;
+ };
+};
+
+
+/***/ }),
+/* 88 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// 25.4.1.5 NewPromiseCapability(C)
+var aFunction = __webpack_require__(10);
+
+function PromiseCapability(C) {
+ var resolve, reject;
+ this.promise = new C(function ($$resolve, $$reject) {
+ if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');
+ resolve = $$resolve;
+ reject = $$reject;
+ });
+ this.resolve = aFunction(resolve);
+ this.reject = aFunction(reject);
+}
+
+module.exports.f = function (C) {
+ return new PromiseCapability(C);
+};
+
+
+/***/ }),
+/* 89 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var global = __webpack_require__(2);
+var DESCRIPTORS = __webpack_require__(6);
+var LIBRARY = __webpack_require__(30);
+var $typed = __webpack_require__(60);
+var hide = __webpack_require__(11);
+var redefineAll = __webpack_require__(41);
+var fails = __webpack_require__(3);
+var anInstance = __webpack_require__(39);
+var toInteger = __webpack_require__(24);
+var toLength = __webpack_require__(8);
+var toIndex = __webpack_require__(117);
+var gOPN = __webpack_require__(37).f;
+var dP = __webpack_require__(7).f;
+var arrayFill = __webpack_require__(84);
+var setToStringTag = __webpack_require__(42);
+var ARRAY_BUFFER = 'ArrayBuffer';
+var DATA_VIEW = 'DataView';
+var PROTOTYPE = 'prototype';
+var WRONG_LENGTH = 'Wrong length!';
+var WRONG_INDEX = 'Wrong index!';
+var $ArrayBuffer = global[ARRAY_BUFFER];
+var $DataView = global[DATA_VIEW];
+var Math = global.Math;
+var RangeError = global.RangeError;
+// eslint-disable-next-line no-shadow-restricted-names
+var Infinity = global.Infinity;
+var BaseBuffer = $ArrayBuffer;
+var abs = Math.abs;
+var pow = Math.pow;
+var floor = Math.floor;
+var log = Math.log;
+var LN2 = Math.LN2;
+var BUFFER = 'buffer';
+var BYTE_LENGTH = 'byteLength';
+var BYTE_OFFSET = 'byteOffset';
+var $BUFFER = DESCRIPTORS ? '_b' : BUFFER;
+var $LENGTH = DESCRIPTORS ? '_l' : BYTE_LENGTH;
+var $OFFSET = DESCRIPTORS ? '_o' : BYTE_OFFSET;
+
+// IEEE754 conversions based on https://github.com/feross/ieee754
+function packIEEE754(value, mLen, nBytes) {
+ var buffer = new Array(nBytes);
+ var eLen = nBytes * 8 - mLen - 1;
+ var eMax = (1 << eLen) - 1;
+ var eBias = eMax >> 1;
+ var rt = mLen === 23 ? pow(2, -24) - pow(2, -77) : 0;
+ var i = 0;
+ var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;
+ var e, m, c;
+ value = abs(value);
+ // eslint-disable-next-line no-self-compare
+ if (value != value || value === Infinity) {
+ // eslint-disable-next-line no-self-compare
+ m = value != value ? 1 : 0;
+ e = eMax;
+ } else {
+ e = floor(log(value) / LN2);
+ if (value * (c = pow(2, -e)) < 1) {
+ e--;
+ c *= 2;
+ }
+ if (e + eBias >= 1) {
+ value += rt / c;
+ } else {
+ value += rt * pow(2, 1 - eBias);
+ }
+ if (value * c >= 2) {
+ e++;
+ c /= 2;
+ }
+ if (e + eBias >= eMax) {
+ m = 0;
+ e = eMax;
+ } else if (e + eBias >= 1) {
+ m = (value * c - 1) * pow(2, mLen);
+ e = e + eBias;
+ } else {
+ m = value * pow(2, eBias - 1) * pow(2, mLen);
+ e = 0;
+ }
+ }
+ for (; mLen >= 8; buffer[i++] = m & 255, m /= 256, mLen -= 8);
+ e = e << mLen | m;
+ eLen += mLen;
+ for (; eLen > 0; buffer[i++] = e & 255, e /= 256, eLen -= 8);
+ buffer[--i] |= s * 128;
+ return buffer;
+}
+function unpackIEEE754(buffer, mLen, nBytes) {
+ var eLen = nBytes * 8 - mLen - 1;
+ var eMax = (1 << eLen) - 1;
+ var eBias = eMax >> 1;
+ var nBits = eLen - 7;
+ var i = nBytes - 1;
+ var s = buffer[i--];
+ var e = s & 127;
+ var m;
+ s >>= 7;
+ for (; nBits > 0; e = e * 256 + buffer[i], i--, nBits -= 8);
+ m = e & (1 << -nBits) - 1;
+ e >>= -nBits;
+ nBits += mLen;
+ for (; nBits > 0; m = m * 256 + buffer[i], i--, nBits -= 8);
+ if (e === 0) {
+ e = 1 - eBias;
+ } else if (e === eMax) {
+ return m ? NaN : s ? -Infinity : Infinity;
+ } else {
+ m = m + pow(2, mLen);
+ e = e - eBias;
+ } return (s ? -1 : 1) * m * pow(2, e - mLen);
+}
+
+function unpackI32(bytes) {
+ return bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0];
+}
+function packI8(it) {
+ return [it & 0xff];
+}
+function packI16(it) {
+ return [it & 0xff, it >> 8 & 0xff];
+}
+function packI32(it) {
+ return [it & 0xff, it >> 8 & 0xff, it >> 16 & 0xff, it >> 24 & 0xff];
+}
+function packF64(it) {
+ return packIEEE754(it, 52, 8);
+}
+function packF32(it) {
+ return packIEEE754(it, 23, 4);
+}
+
+function addGetter(C, key, internal) {
+ dP(C[PROTOTYPE], key, { get: function () { return this[internal]; } });
+}
+
+function get(view, bytes, index, isLittleEndian) {
+ var numIndex = +index;
+ var intIndex = toIndex(numIndex);
+ if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);
+ var store = view[$BUFFER]._b;
+ var start = intIndex + view[$OFFSET];
+ var pack = store.slice(start, start + bytes);
+ return isLittleEndian ? pack : pack.reverse();
+}
+function set(view, bytes, index, conversion, value, isLittleEndian) {
+ var numIndex = +index;
+ var intIndex = toIndex(numIndex);
+ if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);
+ var store = view[$BUFFER]._b;
+ var start = intIndex + view[$OFFSET];
+ var pack = conversion(+value);
+ for (var i = 0; i < bytes; i++) store[start + i] = pack[isLittleEndian ? i : bytes - i - 1];
+}
+
+if (!$typed.ABV) {
+ $ArrayBuffer = function ArrayBuffer(length) {
+ anInstance(this, $ArrayBuffer, ARRAY_BUFFER);
+ var byteLength = toIndex(length);
+ this._b = arrayFill.call(new Array(byteLength), 0);
+ this[$LENGTH] = byteLength;
+ };
+
+ $DataView = function DataView(buffer, byteOffset, byteLength) {
+ anInstance(this, $DataView, DATA_VIEW);
+ anInstance(buffer, $ArrayBuffer, DATA_VIEW);
+ var bufferLength = buffer[$LENGTH];
+ var offset = toInteger(byteOffset);
+ if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset!');
+ byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength);
+ if (offset + byteLength > bufferLength) throw RangeError(WRONG_LENGTH);
+ this[$BUFFER] = buffer;
+ this[$OFFSET] = offset;
+ this[$LENGTH] = byteLength;
+ };
+
+ if (DESCRIPTORS) {
+ addGetter($ArrayBuffer, BYTE_LENGTH, '_l');
+ addGetter($DataView, BUFFER, '_b');
+ addGetter($DataView, BYTE_LENGTH, '_l');
+ addGetter($DataView, BYTE_OFFSET, '_o');
+ }
+
+ redefineAll($DataView[PROTOTYPE], {
+ getInt8: function getInt8(byteOffset) {
+ return get(this, 1, byteOffset)[0] << 24 >> 24;
+ },
+ getUint8: function getUint8(byteOffset) {
+ return get(this, 1, byteOffset)[0];
+ },
+ getInt16: function getInt16(byteOffset /* , littleEndian */) {
+ var bytes = get(this, 2, byteOffset, arguments[1]);
+ return (bytes[1] << 8 | bytes[0]) << 16 >> 16;
+ },
+ getUint16: function getUint16(byteOffset /* , littleEndian */) {
+ var bytes = get(this, 2, byteOffset, arguments[1]);
+ return bytes[1] << 8 | bytes[0];
+ },
+ getInt32: function getInt32(byteOffset /* , littleEndian */) {
+ return unpackI32(get(this, 4, byteOffset, arguments[1]));
+ },
+ getUint32: function getUint32(byteOffset /* , littleEndian */) {
+ return unpackI32(get(this, 4, byteOffset, arguments[1])) >>> 0;
+ },
+ getFloat32: function getFloat32(byteOffset /* , littleEndian */) {
+ return unpackIEEE754(get(this, 4, byteOffset, arguments[1]), 23, 4);
+ },
+ getFloat64: function getFloat64(byteOffset /* , littleEndian */) {
+ return unpackIEEE754(get(this, 8, byteOffset, arguments[1]), 52, 8);
+ },
+ setInt8: function setInt8(byteOffset, value) {
+ set(this, 1, byteOffset, packI8, value);
+ },
+ setUint8: function setUint8(byteOffset, value) {
+ set(this, 1, byteOffset, packI8, value);
+ },
+ setInt16: function setInt16(byteOffset, value /* , littleEndian */) {
+ set(this, 2, byteOffset, packI16, value, arguments[2]);
+ },
+ setUint16: function setUint16(byteOffset, value /* , littleEndian */) {
+ set(this, 2, byteOffset, packI16, value, arguments[2]);
+ },
+ setInt32: function setInt32(byteOffset, value /* , littleEndian */) {
+ set(this, 4, byteOffset, packI32, value, arguments[2]);
+ },
+ setUint32: function setUint32(byteOffset, value /* , littleEndian */) {
+ set(this, 4, byteOffset, packI32, value, arguments[2]);
+ },
+ setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) {
+ set(this, 4, byteOffset, packF32, value, arguments[2]);
+ },
+ setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) {
+ set(this, 8, byteOffset, packF64, value, arguments[2]);
+ }
+ });
+} else {
+ if (!fails(function () {
+ $ArrayBuffer(1);
+ }) || !fails(function () {
+ new $ArrayBuffer(-1); // eslint-disable-line no-new
+ }) || fails(function () {
+ new $ArrayBuffer(); // eslint-disable-line no-new
+ new $ArrayBuffer(1.5); // eslint-disable-line no-new
+ new $ArrayBuffer(NaN); // eslint-disable-line no-new
+ return $ArrayBuffer.name != ARRAY_BUFFER;
+ })) {
+ $ArrayBuffer = function ArrayBuffer(length) {
+ anInstance(this, $ArrayBuffer);
+ return new BaseBuffer(toIndex(length));
+ };
+ var ArrayBufferProto = $ArrayBuffer[PROTOTYPE] = BaseBuffer[PROTOTYPE];
+ for (var keys = gOPN(BaseBuffer), j = 0, key; keys.length > j;) {
+ if (!((key = keys[j++]) in $ArrayBuffer)) hide($ArrayBuffer, key, BaseBuffer[key]);
+ }
+ if (!LIBRARY) ArrayBufferProto.constructor = $ArrayBuffer;
+ }
+ // iOS Safari 7.x bug
+ var view = new $DataView(new $ArrayBuffer(2));
+ var $setInt8 = $DataView[PROTOTYPE].setInt8;
+ view.setInt8(0, 2147483648);
+ view.setInt8(1, 2147483649);
+ if (view.getInt8(0) || !view.getInt8(1)) redefineAll($DataView[PROTOTYPE], {
+ setInt8: function setInt8(byteOffset, value) {
+ $setInt8.call(this, byteOffset, value << 24 >> 24);
+ },
+ setUint8: function setUint8(byteOffset, value) {
+ $setInt8.call(this, byteOffset, value << 24 >> 24);
+ }
+ }, true);
+}
+setToStringTag($ArrayBuffer, ARRAY_BUFFER);
+setToStringTag($DataView, DATA_VIEW);
+hide($DataView[PROTOTYPE], $typed.VIEW, true);
+exports[ARRAY_BUFFER] = $ArrayBuffer;
+exports[DATA_VIEW] = $DataView;
+
+
+/***/ }),
+/* 90 */
+/***/ (function(module, exports) {
+
+var g;
+
+// This works in non-strict mode
+g = (function() {
+ return this;
+})();
+
+try {
+ // This works if eval is allowed (see CSP)
+ g = g || Function("return this")() || (1,eval)("this");
+} catch(e) {
+ // This works if the window reference is available
+ if(typeof window === "object")
+ g = window;
+}
+
+// g can still be undefined, but nothing to do about it...
+// We return undefined, instead of nothing here, so it's
+// easier to handle this case. if(!global) { ...}
+
+module.exports = g;
+
+
+/***/ }),
+/* 91 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = !__webpack_require__(6) && !__webpack_require__(3)(function () {
+ return Object.defineProperty(__webpack_require__(64)('div'), 'a', { get: function () { return 7; } }).a != 7;
+});
+
+
+/***/ }),
+/* 92 */
+/***/ (function(module, exports, __webpack_require__) {
+
+exports.f = __webpack_require__(5);
+
+
+/***/ }),
+/* 93 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var has = __webpack_require__(14);
+var toIObject = __webpack_require__(15);
+var arrayIndexOf = __webpack_require__(50)(false);
+var IE_PROTO = __webpack_require__(66)('IE_PROTO');
+
+module.exports = function (object, names) {
+ var O = toIObject(object);
+ var i = 0;
+ var result = [];
+ var key;
+ for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);
+ // Don't enum bug & hidden keys
+ while (names.length > i) if (has(O, key = names[i++])) {
+ ~arrayIndexOf(result, key) || result.push(key);
+ }
+ return result;
+};
+
+
+/***/ }),
+/* 94 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var dP = __webpack_require__(7);
+var anObject = __webpack_require__(1);
+var getKeys = __webpack_require__(34);
+
+module.exports = __webpack_require__(6) ? Object.defineProperties : function defineProperties(O, Properties) {
+ anObject(O);
+ var keys = getKeys(Properties);
+ var length = keys.length;
+ var i = 0;
+ var P;
+ while (length > i) dP.f(O, P = keys[i++], Properties[P]);
+ return O;
+};
+
+
+/***/ }),
+/* 95 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window
+var toIObject = __webpack_require__(15);
+var gOPN = __webpack_require__(37).f;
+var toString = {}.toString;
+
+var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames
+ ? Object.getOwnPropertyNames(window) : [];
+
+var getWindowNames = function (it) {
+ try {
+ return gOPN(it);
+ } catch (e) {
+ return windowNames.slice();
+ }
+};
+
+module.exports.f = function getOwnPropertyNames(it) {
+ return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));
+};
+
+
+/***/ }),
+/* 96 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// 19.1.2.1 Object.assign(target, source, ...)
+var getKeys = __webpack_require__(34);
+var gOPS = __webpack_require__(51);
+var pIE = __webpack_require__(47);
+var toObject = __webpack_require__(9);
+var IObject = __webpack_require__(46);
+var $assign = Object.assign;
+
+// should work with symbols and should have deterministic property order (V8 bug)
+module.exports = !$assign || __webpack_require__(3)(function () {
+ var A = {};
+ var B = {};
+ // eslint-disable-next-line no-undef
+ var S = Symbol();
+ var K = 'abcdefghijklmnopqrst';
+ A[S] = 7;
+ K.split('').forEach(function (k) { B[k] = k; });
+ return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;
+}) ? function assign(target, source) { // eslint-disable-line no-unused-vars
+ var T = toObject(target);
+ var aLen = arguments.length;
+ var index = 1;
+ var getSymbols = gOPS.f;
+ var isEnum = pIE.f;
+ while (aLen > index) {
+ var S = IObject(arguments[index++]);
+ var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);
+ var length = keys.length;
+ var j = 0;
+ var key;
+ while (length > j) if (isEnum.call(S, key = keys[j++])) T[key] = S[key];
+ } return T;
+} : $assign;
+
+
+/***/ }),
+/* 97 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var aFunction = __webpack_require__(10);
+var isObject = __webpack_require__(4);
+var invoke = __webpack_require__(98);
+var arraySlice = [].slice;
+var factories = {};
+
+var construct = function (F, len, args) {
+ if (!(len in factories)) {
+ for (var n = [], i = 0; i < len; i++) n[i] = 'a[' + i + ']';
+ // eslint-disable-next-line no-new-func
+ factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')');
+ } return factories[len](F, args);
+};
+
+module.exports = Function.bind || function bind(that /* , ...args */) {
+ var fn = aFunction(this);
+ var partArgs = arraySlice.call(arguments, 1);
+ var bound = function (/* args... */) {
+ var args = partArgs.concat(arraySlice.call(arguments));
+ return this instanceof bound ? construct(fn, args.length, args) : invoke(fn, args, that);
+ };
+ if (isObject(fn.prototype)) bound.prototype = fn.prototype;
+ return bound;
+};
+
+
+/***/ }),
+/* 98 */
+/***/ (function(module, exports) {
+
+// fast apply, http://jsperf.lnkit.com/fast-apply/5
+module.exports = function (fn, args, that) {
+ var un = that === undefined;
+ switch (args.length) {
+ case 0: return un ? fn()
+ : fn.call(that);
+ case 1: return un ? fn(args[0])
+ : fn.call(that, args[0]);
+ case 2: return un ? fn(args[0], args[1])
+ : fn.call(that, args[0], args[1]);
+ case 3: return un ? fn(args[0], args[1], args[2])
+ : fn.call(that, args[0], args[1], args[2]);
+ case 4: return un ? fn(args[0], args[1], args[2], args[3])
+ : fn.call(that, args[0], args[1], args[2], args[3]);
+ } return fn.apply(that, args);
+};
+
+
+/***/ }),
+/* 99 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $parseInt = __webpack_require__(2).parseInt;
+var $trim = __webpack_require__(43).trim;
+var ws = __webpack_require__(70);
+var hex = /^[-+]?0[xX]/;
+
+module.exports = $parseInt(ws + '08') !== 8 || $parseInt(ws + '0x16') !== 22 ? function parseInt(str, radix) {
+ var string = $trim(String(str), 3);
+ return $parseInt(string, (radix >>> 0) || (hex.test(string) ? 16 : 10));
+} : $parseInt;
+
+
+/***/ }),
+/* 100 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $parseFloat = __webpack_require__(2).parseFloat;
+var $trim = __webpack_require__(43).trim;
+
+module.exports = 1 / $parseFloat(__webpack_require__(70) + '-0') !== -Infinity ? function parseFloat(str) {
+ var string = $trim(String(str), 3);
+ var result = $parseFloat(string);
+ return result === 0 && string.charAt(0) == '-' ? -0 : result;
+} : $parseFloat;
+
+
+/***/ }),
+/* 101 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var cof = __webpack_require__(20);
+module.exports = function (it, msg) {
+ if (typeof it != 'number' && cof(it) != 'Number') throw TypeError(msg);
+ return +it;
+};
+
+
+/***/ }),
+/* 102 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 20.1.2.3 Number.isInteger(number)
+var isObject = __webpack_require__(4);
+var floor = Math.floor;
+module.exports = function isInteger(it) {
+ return !isObject(it) && isFinite(it) && floor(it) === it;
+};
+
+
+/***/ }),
+/* 103 */
+/***/ (function(module, exports) {
+
+// 20.2.2.20 Math.log1p(x)
+module.exports = Math.log1p || function log1p(x) {
+ return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x);
+};
+
+
+/***/ }),
+/* 104 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 20.2.2.16 Math.fround(x)
+var sign = __webpack_require__(73);
+var pow = Math.pow;
+var EPSILON = pow(2, -52);
+var EPSILON32 = pow(2, -23);
+var MAX32 = pow(2, 127) * (2 - EPSILON32);
+var MIN32 = pow(2, -126);
+
+var roundTiesToEven = function (n) {
+ return n + 1 / EPSILON - 1 / EPSILON;
+};
+
+module.exports = Math.fround || function fround(x) {
+ var $abs = Math.abs(x);
+ var $sign = sign(x);
+ var a, result;
+ if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;
+ a = (1 + EPSILON32 / EPSILON) * $abs;
+ result = a - (a - $abs);
+ // eslint-disable-next-line no-self-compare
+ if (result > MAX32 || result != result) return $sign * Infinity;
+ return $sign * result;
+};
+
+
+/***/ }),
+/* 105 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// call something on iterator step with safe closing on error
+var anObject = __webpack_require__(1);
+module.exports = function (iterator, fn, value, entries) {
+ try {
+ return entries ? fn(anObject(value)[0], value[1]) : fn(value);
+ // 7.4.6 IteratorClose(iterator, completion)
+ } catch (e) {
+ var ret = iterator['return'];
+ if (ret !== undefined) anObject(ret.call(iterator));
+ throw e;
+ }
+};
+
+
+/***/ }),
+/* 106 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var aFunction = __webpack_require__(10);
+var toObject = __webpack_require__(9);
+var IObject = __webpack_require__(46);
+var toLength = __webpack_require__(8);
+
+module.exports = function (that, callbackfn, aLen, memo, isRight) {
+ aFunction(callbackfn);
+ var O = toObject(that);
+ var self = IObject(O);
+ var length = toLength(O.length);
+ var index = isRight ? length - 1 : 0;
+ var i = isRight ? -1 : 1;
+ if (aLen < 2) for (;;) {
+ if (index in self) {
+ memo = self[index];
+ index += i;
+ break;
+ }
+ index += i;
+ if (isRight ? index < 0 : length <= index) {
+ throw TypeError('Reduce of empty array with no initial value');
+ }
+ }
+ for (;isRight ? index >= 0 : length > index; index += i) if (index in self) {
+ memo = callbackfn(memo, self[index], index, O);
+ }
+ return memo;
+};
+
+
+/***/ }),
+/* 107 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)
+
+var toObject = __webpack_require__(9);
+var toAbsoluteIndex = __webpack_require__(35);
+var toLength = __webpack_require__(8);
+
+module.exports = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {
+ var O = toObject(this);
+ var len = toLength(O.length);
+ var to = toAbsoluteIndex(target, len);
+ var from = toAbsoluteIndex(start, len);
+ var end = arguments.length > 2 ? arguments[2] : undefined;
+ var count = Math.min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);
+ var inc = 1;
+ if (from < to && to < from + count) {
+ inc = -1;
+ from += count - 1;
+ to += count - 1;
+ }
+ while (count-- > 0) {
+ if (from in O) O[to] = O[from];
+ else delete O[to];
+ to += inc;
+ from += inc;
+ } return O;
+};
+
+
+/***/ }),
+/* 108 */
+/***/ (function(module, exports) {
+
+module.exports = function (done, value) {
+ return { value: value, done: !!done };
+};
+
+
+/***/ }),
+/* 109 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 21.2.5.3 get RegExp.prototype.flags()
+if (__webpack_require__(6) && /./g.flags != 'g') __webpack_require__(7).f(RegExp.prototype, 'flags', {
+ configurable: true,
+ get: __webpack_require__(55)
+});
+
+
+/***/ }),
+/* 110 */
+/***/ (function(module, exports) {
+
+module.exports = function (exec) {
+ try {
+ return { e: false, v: exec() };
+ } catch (e) {
+ return { e: true, v: e };
+ }
+};
+
+
+/***/ }),
+/* 111 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var anObject = __webpack_require__(1);
+var isObject = __webpack_require__(4);
+var newPromiseCapability = __webpack_require__(88);
+
+module.exports = function (C, x) {
+ anObject(C);
+ if (isObject(x) && x.constructor === C) return x;
+ var promiseCapability = newPromiseCapability.f(C);
+ var resolve = promiseCapability.resolve;
+ resolve(x);
+ return promiseCapability.promise;
+};
+
+
+/***/ }),
+/* 112 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var strong = __webpack_require__(113);
+var validate = __webpack_require__(45);
+var MAP = 'Map';
+
+// 23.1 Map Objects
+module.exports = __webpack_require__(59)(MAP, function (get) {
+ return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };
+}, {
+ // 23.1.3.6 Map.prototype.get(key)
+ get: function get(key) {
+ var entry = strong.getEntry(validate(this, MAP), key);
+ return entry && entry.v;
+ },
+ // 23.1.3.9 Map.prototype.set(key, value)
+ set: function set(key, value) {
+ return strong.def(validate(this, MAP), key === 0 ? 0 : key, value);
+ }
+}, strong, true);
+
+
+/***/ }),
+/* 113 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var dP = __webpack_require__(7).f;
+var create = __webpack_require__(36);
+var redefineAll = __webpack_require__(41);
+var ctx = __webpack_require__(19);
+var anInstance = __webpack_require__(39);
+var forOf = __webpack_require__(40);
+var $iterDefine = __webpack_require__(76);
+var step = __webpack_require__(108);
+var setSpecies = __webpack_require__(38);
+var DESCRIPTORS = __webpack_require__(6);
+var fastKey = __webpack_require__(29).fastKey;
+var validate = __webpack_require__(45);
+var SIZE = DESCRIPTORS ? '_s' : 'size';
+
+var getEntry = function (that, key) {
+ // fast case
+ var index = fastKey(key);
+ var entry;
+ if (index !== 'F') return that._i[index];
+ // frozen object case
+ for (entry = that._f; entry; entry = entry.n) {
+ if (entry.k == key) return entry;
+ }
+};
+
+module.exports = {
+ getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {
+ var C = wrapper(function (that, iterable) {
+ anInstance(that, C, NAME, '_i');
+ that._t = NAME; // collection type
+ that._i = create(null); // index
+ that._f = undefined; // first entry
+ that._l = undefined; // last entry
+ that[SIZE] = 0; // size
+ if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);
+ });
+ redefineAll(C.prototype, {
+ // 23.1.3.1 Map.prototype.clear()
+ // 23.2.3.2 Set.prototype.clear()
+ clear: function clear() {
+ for (var that = validate(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) {
+ entry.r = true;
+ if (entry.p) entry.p = entry.p.n = undefined;
+ delete data[entry.i];
+ }
+ that._f = that._l = undefined;
+ that[SIZE] = 0;
+ },
+ // 23.1.3.3 Map.prototype.delete(key)
+ // 23.2.3.4 Set.prototype.delete(value)
+ 'delete': function (key) {
+ var that = validate(this, NAME);
+ var entry = getEntry(that, key);
+ if (entry) {
+ var next = entry.n;
+ var prev = entry.p;
+ delete that._i[entry.i];
+ entry.r = true;
+ if (prev) prev.n = next;
+ if (next) next.p = prev;
+ if (that._f == entry) that._f = next;
+ if (that._l == entry) that._l = prev;
+ that[SIZE]--;
+ } return !!entry;
+ },
+ // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)
+ // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)
+ forEach: function forEach(callbackfn /* , that = undefined */) {
+ validate(this, NAME);
+ var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);
+ var entry;
+ while (entry = entry ? entry.n : this._f) {
+ f(entry.v, entry.k, this);
+ // revert to the last existing entry
+ while (entry && entry.r) entry = entry.p;
+ }
+ },
+ // 23.1.3.7 Map.prototype.has(key)
+ // 23.2.3.7 Set.prototype.has(value)
+ has: function has(key) {
+ return !!getEntry(validate(this, NAME), key);
+ }
+ });
+ if (DESCRIPTORS) dP(C.prototype, 'size', {
+ get: function () {
+ return validate(this, NAME)[SIZE];
+ }
+ });
+ return C;
+ },
+ def: function (that, key, value) {
+ var entry = getEntry(that, key);
+ var prev, index;
+ // change existing entry
+ if (entry) {
+ entry.v = value;
+ // create new entry
+ } else {
+ that._l = entry = {
+ i: index = fastKey(key, true), // <- index
+ k: key, // <- key
+ v: value, // <- value
+ p: prev = that._l, // <- previous entry
+ n: undefined, // <- next entry
+ r: false // <- removed
+ };
+ if (!that._f) that._f = entry;
+ if (prev) prev.n = entry;
+ that[SIZE]++;
+ // add to index
+ if (index !== 'F') that._i[index] = entry;
+ } return that;
+ },
+ getEntry: getEntry,
+ setStrong: function (C, NAME, IS_MAP) {
+ // add .keys, .values, .entries, [@@iterator]
+ // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11
+ $iterDefine(C, NAME, function (iterated, kind) {
+ this._t = validate(iterated, NAME); // target
+ this._k = kind; // kind
+ this._l = undefined; // previous
+ }, function () {
+ var that = this;
+ var kind = that._k;
+ var entry = that._l;
+ // revert to the last existing entry
+ while (entry && entry.r) entry = entry.p;
+ // get next entry
+ if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) {
+ // or finish the iteration
+ that._t = undefined;
+ return step(1);
+ }
+ // return step by kind
+ if (kind == 'keys') return step(0, entry.k);
+ if (kind == 'values') return step(0, entry.v);
+ return step(0, [entry.k, entry.v]);
+ }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);
+
+ // add [@@species], 23.1.2.2, 23.2.2.2
+ setSpecies(NAME);
+ }
+};
+
+
+/***/ }),
+/* 114 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var strong = __webpack_require__(113);
+var validate = __webpack_require__(45);
+var SET = 'Set';
+
+// 23.2 Set Objects
+module.exports = __webpack_require__(59)(SET, function (get) {
+ return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };
+}, {
+ // 23.2.3.1 Set.prototype.add(value)
+ add: function add(value) {
+ return strong.def(validate(this, SET), value = value === 0 ? 0 : value, value);
+ }
+}, strong);
+
+
+/***/ }),
+/* 115 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var each = __webpack_require__(26)(0);
+var redefine = __webpack_require__(12);
+var meta = __webpack_require__(29);
+var assign = __webpack_require__(96);
+var weak = __webpack_require__(116);
+var isObject = __webpack_require__(4);
+var fails = __webpack_require__(3);
+var validate = __webpack_require__(45);
+var WEAK_MAP = 'WeakMap';
+var getWeak = meta.getWeak;
+var isExtensible = Object.isExtensible;
+var uncaughtFrozenStore = weak.ufstore;
+var tmp = {};
+var InternalMap;
+
+var wrapper = function (get) {
+ return function WeakMap() {
+ return get(this, arguments.length > 0 ? arguments[0] : undefined);
+ };
+};
+
+var methods = {
+ // 23.3.3.3 WeakMap.prototype.get(key)
+ get: function get(key) {
+ if (isObject(key)) {
+ var data = getWeak(key);
+ if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key);
+ return data ? data[this._i] : undefined;
+ }
+ },
+ // 23.3.3.5 WeakMap.prototype.set(key, value)
+ set: function set(key, value) {
+ return weak.def(validate(this, WEAK_MAP), key, value);
+ }
+};
+
+// 23.3 WeakMap Objects
+var $WeakMap = module.exports = __webpack_require__(59)(WEAK_MAP, wrapper, methods, weak, true, true);
+
+// IE11 WeakMap frozen keys fix
+if (fails(function () { return new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7; })) {
+ InternalMap = weak.getConstructor(wrapper, WEAK_MAP);
+ assign(InternalMap.prototype, methods);
+ meta.NEED = true;
+ each(['delete', 'has', 'get', 'set'], function (key) {
+ var proto = $WeakMap.prototype;
+ var method = proto[key];
+ redefine(proto, key, function (a, b) {
+ // store frozen objects on internal weakmap shim
+ if (isObject(a) && !isExtensible(a)) {
+ if (!this._f) this._f = new InternalMap();
+ var result = this._f[key](a, b);
+ return key == 'set' ? this : result;
+ // store all the rest on native weakmap
+ } return method.call(this, a, b);
+ });
+ });
+}
+
+
+/***/ }),
+/* 116 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var redefineAll = __webpack_require__(41);
+var getWeak = __webpack_require__(29).getWeak;
+var anObject = __webpack_require__(1);
+var isObject = __webpack_require__(4);
+var anInstance = __webpack_require__(39);
+var forOf = __webpack_require__(40);
+var createArrayMethod = __webpack_require__(26);
+var $has = __webpack_require__(14);
+var validate = __webpack_require__(45);
+var arrayFind = createArrayMethod(5);
+var arrayFindIndex = createArrayMethod(6);
+var id = 0;
+
+// fallback for uncaught frozen keys
+var uncaughtFrozenStore = function (that) {
+ return that._l || (that._l = new UncaughtFrozenStore());
+};
+var UncaughtFrozenStore = function () {
+ this.a = [];
+};
+var findUncaughtFrozen = function (store, key) {
+ return arrayFind(store.a, function (it) {
+ return it[0] === key;
+ });
+};
+UncaughtFrozenStore.prototype = {
+ get: function (key) {
+ var entry = findUncaughtFrozen(this, key);
+ if (entry) return entry[1];
+ },
+ has: function (key) {
+ return !!findUncaughtFrozen(this, key);
+ },
+ set: function (key, value) {
+ var entry = findUncaughtFrozen(this, key);
+ if (entry) entry[1] = value;
+ else this.a.push([key, value]);
+ },
+ 'delete': function (key) {
+ var index = arrayFindIndex(this.a, function (it) {
+ return it[0] === key;
+ });
+ if (~index) this.a.splice(index, 1);
+ return !!~index;
+ }
+};
+
+module.exports = {
+ getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {
+ var C = wrapper(function (that, iterable) {
+ anInstance(that, C, NAME, '_i');
+ that._t = NAME; // collection type
+ that._i = id++; // collection id
+ that._l = undefined; // leak store for uncaught frozen objects
+ if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);
+ });
+ redefineAll(C.prototype, {
+ // 23.3.3.2 WeakMap.prototype.delete(key)
+ // 23.4.3.3 WeakSet.prototype.delete(value)
+ 'delete': function (key) {
+ if (!isObject(key)) return false;
+ var data = getWeak(key);
+ if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key);
+ return data && $has(data, this._i) && delete data[this._i];
+ },
+ // 23.3.3.4 WeakMap.prototype.has(key)
+ // 23.4.3.4 WeakSet.prototype.has(value)
+ has: function has(key) {
+ if (!isObject(key)) return false;
+ var data = getWeak(key);
+ if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key);
+ return data && $has(data, this._i);
+ }
+ });
+ return C;
+ },
+ def: function (that, key, value) {
+ var data = getWeak(anObject(key), true);
+ if (data === true) uncaughtFrozenStore(that).set(key, value);
+ else data[that._i] = value;
+ return that;
+ },
+ ufstore: uncaughtFrozenStore
+};
+
+
+/***/ }),
+/* 117 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// https://tc39.github.io/ecma262/#sec-toindex
+var toInteger = __webpack_require__(24);
+var toLength = __webpack_require__(8);
+module.exports = function (it) {
+ if (it === undefined) return 0;
+ var number = toInteger(it);
+ var length = toLength(number);
+ if (number !== length) throw RangeError('Wrong length!');
+ return length;
+};
+
+
+/***/ }),
+/* 118 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// all object keys, includes non-enumerable and symbols
+var gOPN = __webpack_require__(37);
+var gOPS = __webpack_require__(51);
+var anObject = __webpack_require__(1);
+var Reflect = __webpack_require__(2).Reflect;
+module.exports = Reflect && Reflect.ownKeys || function ownKeys(it) {
+ var keys = gOPN.f(anObject(it));
+ var getSymbols = gOPS.f;
+ return getSymbols ? keys.concat(getSymbols(it)) : keys;
+};
+
+
+/***/ }),
+/* 119 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// https://tc39.github.io/proposal-flatMap/#sec-FlattenIntoArray
+var isArray = __webpack_require__(52);
+var isObject = __webpack_require__(4);
+var toLength = __webpack_require__(8);
+var ctx = __webpack_require__(19);
+var IS_CONCAT_SPREADABLE = __webpack_require__(5)('isConcatSpreadable');
+
+function flattenIntoArray(target, original, source, sourceLen, start, depth, mapper, thisArg) {
+ var targetIndex = start;
+ var sourceIndex = 0;
+ var mapFn = mapper ? ctx(mapper, thisArg, 3) : false;
+ var element, spreadable;
+
+ while (sourceIndex < sourceLen) {
+ if (sourceIndex in source) {
+ element = mapFn ? mapFn(source[sourceIndex], sourceIndex, original) : source[sourceIndex];
+
+ spreadable = false;
+ if (isObject(element)) {
+ spreadable = element[IS_CONCAT_SPREADABLE];
+ spreadable = spreadable !== undefined ? !!spreadable : isArray(element);
+ }
+
+ if (spreadable && depth > 0) {
+ targetIndex = flattenIntoArray(target, original, element, toLength(element.length), targetIndex, depth - 1) - 1;
+ } else {
+ if (targetIndex >= 0x1fffffffffffff) throw TypeError();
+ target[targetIndex] = element;
+ }
+
+ targetIndex++;
+ }
+ sourceIndex++;
+ }
+ return targetIndex;
+}
+
+module.exports = flattenIntoArray;
+
+
+/***/ }),
+/* 120 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// https://github.com/tc39/proposal-string-pad-start-end
+var toLength = __webpack_require__(8);
+var repeat = __webpack_require__(72);
+var defined = __webpack_require__(23);
+
+module.exports = function (that, maxLength, fillString, left) {
+ var S = String(defined(that));
+ var stringLength = S.length;
+ var fillStr = fillString === undefined ? ' ' : String(fillString);
+ var intMaxLength = toLength(maxLength);
+ if (intMaxLength <= stringLength || fillStr == '') return S;
+ var fillLen = intMaxLength - stringLength;
+ var stringFiller = repeat.call(fillStr, Math.ceil(fillLen / fillStr.length));
+ if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);
+ return left ? stringFiller + S : S + stringFiller;
+};
+
+
+/***/ }),
+/* 121 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var getKeys = __webpack_require__(34);
+var toIObject = __webpack_require__(15);
+var isEnum = __webpack_require__(47).f;
+module.exports = function (isEntries) {
+ return function (it) {
+ var O = toIObject(it);
+ var keys = getKeys(O);
+ var length = keys.length;
+ var i = 0;
+ var result = [];
+ var key;
+ while (length > i) if (isEnum.call(O, key = keys[i++])) {
+ result.push(isEntries ? [key, O[key]] : O[key]);
+ } return result;
+ };
+};
+
+
+/***/ }),
+/* 122 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// https://github.com/DavidBruant/Map-Set.prototype.toJSON
+var classof = __webpack_require__(48);
+var from = __webpack_require__(123);
+module.exports = function (NAME) {
+ return function toJSON() {
+ if (classof(this) != NAME) throw TypeError(NAME + "#toJSON isn't generic");
+ return from(this);
+ };
+};
+
+
+/***/ }),
+/* 123 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var forOf = __webpack_require__(40);
+
+module.exports = function (iter, ITERATOR) {
+ var result = [];
+ forOf(iter, false, result.push, result, ITERATOR);
+ return result;
+};
+
+
+/***/ }),
+/* 124 */
+/***/ (function(module, exports) {
+
+// https://rwaldron.github.io/proposal-math-extensions/
+module.exports = Math.scale || function scale(x, inLow, inHigh, outLow, outHigh) {
+ if (
+ arguments.length === 0
+ // eslint-disable-next-line no-self-compare
+ || x != x
+ // eslint-disable-next-line no-self-compare
+ || inLow != inLow
+ // eslint-disable-next-line no-self-compare
+ || inHigh != inHigh
+ // eslint-disable-next-line no-self-compare
+ || outLow != outLow
+ // eslint-disable-next-line no-self-compare
+ || outHigh != outHigh
+ ) return NaN;
+ if (x === Infinity || x === -Infinity) return x;
+ return (x - inLow) * (outHigh - outLow) / (inHigh - inLow) + outLow;
+};
+
+
+/***/ }),
+/* 125 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function(global) {
+
+__webpack_require__(126);
+
+__webpack_require__(323);
+
+__webpack_require__(324);
+
+if (global._babelPolyfill) {
+ throw new Error("only one instance of babel-polyfill is allowed");
+}
+global._babelPolyfill = true;
+
+var DEFINE_PROPERTY = "defineProperty";
+function define(O, key, value) {
+ O[key] || Object[DEFINE_PROPERTY](O, key, {
+ writable: true,
+ configurable: true,
+ value: value
+ });
+}
+
+define(String.prototype, "padLeft", "".padStart);
+define(String.prototype, "padRight", "".padEnd);
+
+"pop,reverse,shift,keys,values,entries,indexOf,every,some,forEach,map,filter,find,findIndex,includes,join,slice,concat,push,splice,unshift,sort,lastIndexOf,reduce,reduceRight,copyWithin,fill".split(",").forEach(function (key) {
+ [][key] && define(Array, key, Function.call.bind([][key]));
+});
+/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(90)))
+
+/***/ }),
+/* 126 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(127);
+__webpack_require__(129);
+__webpack_require__(130);
+__webpack_require__(131);
+__webpack_require__(132);
+__webpack_require__(133);
+__webpack_require__(134);
+__webpack_require__(135);
+__webpack_require__(136);
+__webpack_require__(137);
+__webpack_require__(138);
+__webpack_require__(139);
+__webpack_require__(140);
+__webpack_require__(141);
+__webpack_require__(142);
+__webpack_require__(143);
+__webpack_require__(145);
+__webpack_require__(146);
+__webpack_require__(147);
+__webpack_require__(148);
+__webpack_require__(149);
+__webpack_require__(150);
+__webpack_require__(151);
+__webpack_require__(152);
+__webpack_require__(153);
+__webpack_require__(154);
+__webpack_require__(155);
+__webpack_require__(156);
+__webpack_require__(157);
+__webpack_require__(158);
+__webpack_require__(159);
+__webpack_require__(160);
+__webpack_require__(161);
+__webpack_require__(162);
+__webpack_require__(163);
+__webpack_require__(164);
+__webpack_require__(165);
+__webpack_require__(166);
+__webpack_require__(167);
+__webpack_require__(168);
+__webpack_require__(169);
+__webpack_require__(170);
+__webpack_require__(171);
+__webpack_require__(172);
+__webpack_require__(173);
+__webpack_require__(174);
+__webpack_require__(175);
+__webpack_require__(176);
+__webpack_require__(177);
+__webpack_require__(178);
+__webpack_require__(179);
+__webpack_require__(180);
+__webpack_require__(181);
+__webpack_require__(182);
+__webpack_require__(183);
+__webpack_require__(184);
+__webpack_require__(185);
+__webpack_require__(186);
+__webpack_require__(187);
+__webpack_require__(188);
+__webpack_require__(189);
+__webpack_require__(190);
+__webpack_require__(191);
+__webpack_require__(192);
+__webpack_require__(193);
+__webpack_require__(194);
+__webpack_require__(195);
+__webpack_require__(196);
+__webpack_require__(197);
+__webpack_require__(198);
+__webpack_require__(199);
+__webpack_require__(200);
+__webpack_require__(201);
+__webpack_require__(202);
+__webpack_require__(203);
+__webpack_require__(204);
+__webpack_require__(205);
+__webpack_require__(207);
+__webpack_require__(208);
+__webpack_require__(210);
+__webpack_require__(211);
+__webpack_require__(212);
+__webpack_require__(213);
+__webpack_require__(214);
+__webpack_require__(215);
+__webpack_require__(216);
+__webpack_require__(218);
+__webpack_require__(219);
+__webpack_require__(220);
+__webpack_require__(221);
+__webpack_require__(222);
+__webpack_require__(223);
+__webpack_require__(224);
+__webpack_require__(225);
+__webpack_require__(226);
+__webpack_require__(227);
+__webpack_require__(228);
+__webpack_require__(229);
+__webpack_require__(230);
+__webpack_require__(85);
+__webpack_require__(231);
+__webpack_require__(232);
+__webpack_require__(109);
+__webpack_require__(233);
+__webpack_require__(234);
+__webpack_require__(235);
+__webpack_require__(236);
+__webpack_require__(237);
+__webpack_require__(112);
+__webpack_require__(114);
+__webpack_require__(115);
+__webpack_require__(238);
+__webpack_require__(239);
+__webpack_require__(240);
+__webpack_require__(241);
+__webpack_require__(242);
+__webpack_require__(243);
+__webpack_require__(244);
+__webpack_require__(245);
+__webpack_require__(246);
+__webpack_require__(247);
+__webpack_require__(248);
+__webpack_require__(249);
+__webpack_require__(250);
+__webpack_require__(251);
+__webpack_require__(252);
+__webpack_require__(253);
+__webpack_require__(254);
+__webpack_require__(255);
+__webpack_require__(256);
+__webpack_require__(257);
+__webpack_require__(258);
+__webpack_require__(259);
+__webpack_require__(260);
+__webpack_require__(261);
+__webpack_require__(262);
+__webpack_require__(263);
+__webpack_require__(264);
+__webpack_require__(265);
+__webpack_require__(266);
+__webpack_require__(267);
+__webpack_require__(268);
+__webpack_require__(269);
+__webpack_require__(270);
+__webpack_require__(271);
+__webpack_require__(272);
+__webpack_require__(273);
+__webpack_require__(274);
+__webpack_require__(275);
+__webpack_require__(276);
+__webpack_require__(277);
+__webpack_require__(278);
+__webpack_require__(279);
+__webpack_require__(280);
+__webpack_require__(281);
+__webpack_require__(282);
+__webpack_require__(283);
+__webpack_require__(284);
+__webpack_require__(285);
+__webpack_require__(286);
+__webpack_require__(287);
+__webpack_require__(288);
+__webpack_require__(289);
+__webpack_require__(290);
+__webpack_require__(291);
+__webpack_require__(292);
+__webpack_require__(293);
+__webpack_require__(294);
+__webpack_require__(295);
+__webpack_require__(296);
+__webpack_require__(297);
+__webpack_require__(298);
+__webpack_require__(299);
+__webpack_require__(300);
+__webpack_require__(301);
+__webpack_require__(302);
+__webpack_require__(303);
+__webpack_require__(304);
+__webpack_require__(305);
+__webpack_require__(306);
+__webpack_require__(307);
+__webpack_require__(308);
+__webpack_require__(309);
+__webpack_require__(310);
+__webpack_require__(311);
+__webpack_require__(312);
+__webpack_require__(313);
+__webpack_require__(314);
+__webpack_require__(315);
+__webpack_require__(316);
+__webpack_require__(317);
+__webpack_require__(318);
+__webpack_require__(319);
+__webpack_require__(320);
+__webpack_require__(321);
+__webpack_require__(322);
+module.exports = __webpack_require__(18);
+
+
+/***/ }),
+/* 127 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// ECMAScript 6 symbols shim
+var global = __webpack_require__(2);
+var has = __webpack_require__(14);
+var DESCRIPTORS = __webpack_require__(6);
+var $export = __webpack_require__(0);
+var redefine = __webpack_require__(12);
+var META = __webpack_require__(29).KEY;
+var $fails = __webpack_require__(3);
+var shared = __webpack_require__(49);
+var setToStringTag = __webpack_require__(42);
+var uid = __webpack_require__(33);
+var wks = __webpack_require__(5);
+var wksExt = __webpack_require__(92);
+var wksDefine = __webpack_require__(65);
+var enumKeys = __webpack_require__(128);
+var isArray = __webpack_require__(52);
+var anObject = __webpack_require__(1);
+var isObject = __webpack_require__(4);
+var toIObject = __webpack_require__(15);
+var toPrimitive = __webpack_require__(22);
+var createDesc = __webpack_require__(32);
+var _create = __webpack_require__(36);
+var gOPNExt = __webpack_require__(95);
+var $GOPD = __webpack_require__(16);
+var $DP = __webpack_require__(7);
+var $keys = __webpack_require__(34);
+var gOPD = $GOPD.f;
+var dP = $DP.f;
+var gOPN = gOPNExt.f;
+var $Symbol = global.Symbol;
+var $JSON = global.JSON;
+var _stringify = $JSON && $JSON.stringify;
+var PROTOTYPE = 'prototype';
+var HIDDEN = wks('_hidden');
+var TO_PRIMITIVE = wks('toPrimitive');
+var isEnum = {}.propertyIsEnumerable;
+var SymbolRegistry = shared('symbol-registry');
+var AllSymbols = shared('symbols');
+var OPSymbols = shared('op-symbols');
+var ObjectProto = Object[PROTOTYPE];
+var USE_NATIVE = typeof $Symbol == 'function';
+var QObject = global.QObject;
+// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173
+var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;
+
+// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687
+var setSymbolDesc = DESCRIPTORS && $fails(function () {
+ return _create(dP({}, 'a', {
+ get: function () { return dP(this, 'a', { value: 7 }).a; }
+ })).a != 7;
+}) ? function (it, key, D) {
+ var protoDesc = gOPD(ObjectProto, key);
+ if (protoDesc) delete ObjectProto[key];
+ dP(it, key, D);
+ if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);
+} : dP;
+
+var wrap = function (tag) {
+ var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);
+ sym._k = tag;
+ return sym;
+};
+
+var isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {
+ return typeof it == 'symbol';
+} : function (it) {
+ return it instanceof $Symbol;
+};
+
+var $defineProperty = function defineProperty(it, key, D) {
+ if (it === ObjectProto) $defineProperty(OPSymbols, key, D);
+ anObject(it);
+ key = toPrimitive(key, true);
+ anObject(D);
+ if (has(AllSymbols, key)) {
+ if (!D.enumerable) {
+ if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));
+ it[HIDDEN][key] = true;
+ } else {
+ if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;
+ D = _create(D, { enumerable: createDesc(0, false) });
+ } return setSymbolDesc(it, key, D);
+ } return dP(it, key, D);
+};
+var $defineProperties = function defineProperties(it, P) {
+ anObject(it);
+ var keys = enumKeys(P = toIObject(P));
+ var i = 0;
+ var l = keys.length;
+ var key;
+ while (l > i) $defineProperty(it, key = keys[i++], P[key]);
+ return it;
+};
+var $create = function create(it, P) {
+ return P === undefined ? _create(it) : $defineProperties(_create(it), P);
+};
+var $propertyIsEnumerable = function propertyIsEnumerable(key) {
+ var E = isEnum.call(this, key = toPrimitive(key, true));
+ if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;
+ return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;
+};
+var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {
+ it = toIObject(it);
+ key = toPrimitive(key, true);
+ if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;
+ var D = gOPD(it, key);
+ if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;
+ return D;
+};
+var $getOwnPropertyNames = function getOwnPropertyNames(it) {
+ var names = gOPN(toIObject(it));
+ var result = [];
+ var i = 0;
+ var key;
+ while (names.length > i) {
+ if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);
+ } return result;
+};
+var $getOwnPropertySymbols = function getOwnPropertySymbols(it) {
+ var IS_OP = it === ObjectProto;
+ var names = gOPN(IS_OP ? OPSymbols : toIObject(it));
+ var result = [];
+ var i = 0;
+ var key;
+ while (names.length > i) {
+ if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);
+ } return result;
+};
+
+// 19.4.1.1 Symbol([description])
+if (!USE_NATIVE) {
+ $Symbol = function Symbol() {
+ if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');
+ var tag = uid(arguments.length > 0 ? arguments[0] : undefined);
+ var $set = function (value) {
+ if (this === ObjectProto) $set.call(OPSymbols, value);
+ if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;
+ setSymbolDesc(this, tag, createDesc(1, value));
+ };
+ if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });
+ return wrap(tag);
+ };
+ redefine($Symbol[PROTOTYPE], 'toString', function toString() {
+ return this._k;
+ });
+
+ $GOPD.f = $getOwnPropertyDescriptor;
+ $DP.f = $defineProperty;
+ __webpack_require__(37).f = gOPNExt.f = $getOwnPropertyNames;
+ __webpack_require__(47).f = $propertyIsEnumerable;
+ __webpack_require__(51).f = $getOwnPropertySymbols;
+
+ if (DESCRIPTORS && !__webpack_require__(30)) {
+ redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);
+ }
+
+ wksExt.f = function (name) {
+ return wrap(wks(name));
+ };
+}
+
+$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });
+
+for (var es6Symbols = (
+ // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14
+ 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'
+).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);
+
+for (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);
+
+$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {
+ // 19.4.2.1 Symbol.for(key)
+ 'for': function (key) {
+ return has(SymbolRegistry, key += '')
+ ? SymbolRegistry[key]
+ : SymbolRegistry[key] = $Symbol(key);
+ },
+ // 19.4.2.5 Symbol.keyFor(sym)
+ keyFor: function keyFor(sym) {
+ if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');
+ for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;
+ },
+ useSetter: function () { setter = true; },
+ useSimple: function () { setter = false; }
+});
+
+$export($export.S + $export.F * !USE_NATIVE, 'Object', {
+ // 19.1.2.2 Object.create(O [, Properties])
+ create: $create,
+ // 19.1.2.4 Object.defineProperty(O, P, Attributes)
+ defineProperty: $defineProperty,
+ // 19.1.2.3 Object.defineProperties(O, Properties)
+ defineProperties: $defineProperties,
+ // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
+ getOwnPropertyDescriptor: $getOwnPropertyDescriptor,
+ // 19.1.2.7 Object.getOwnPropertyNames(O)
+ getOwnPropertyNames: $getOwnPropertyNames,
+ // 19.1.2.8 Object.getOwnPropertySymbols(O)
+ getOwnPropertySymbols: $getOwnPropertySymbols
+});
+
+// 24.3.2 JSON.stringify(value [, replacer [, space]])
+$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {
+ var S = $Symbol();
+ // MS Edge converts symbol values to JSON as {}
+ // WebKit converts symbol values to JSON as null
+ // V8 throws on boxed symbols
+ return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';
+})), 'JSON', {
+ stringify: function stringify(it) {
+ var args = [it];
+ var i = 1;
+ var replacer, $replacer;
+ while (arguments.length > i) args.push(arguments[i++]);
+ $replacer = replacer = args[1];
+ if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined
+ if (!isArray(replacer)) replacer = function (key, value) {
+ if (typeof $replacer == 'function') value = $replacer.call(this, key, value);
+ if (!isSymbol(value)) return value;
+ };
+ args[1] = replacer;
+ return _stringify.apply($JSON, args);
+ }
+});
+
+// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)
+$Symbol[PROTOTYPE][TO_PRIMITIVE] || __webpack_require__(11)($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);
+// 19.4.3.5 Symbol.prototype[@@toStringTag]
+setToStringTag($Symbol, 'Symbol');
+// 20.2.1.9 Math[@@toStringTag]
+setToStringTag(Math, 'Math', true);
+// 24.3.3 JSON[@@toStringTag]
+setToStringTag(global.JSON, 'JSON', true);
+
+
+/***/ }),
+/* 128 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// all enumerable object keys, includes symbols
+var getKeys = __webpack_require__(34);
+var gOPS = __webpack_require__(51);
+var pIE = __webpack_require__(47);
+module.exports = function (it) {
+ var result = getKeys(it);
+ var getSymbols = gOPS.f;
+ if (getSymbols) {
+ var symbols = getSymbols(it);
+ var isEnum = pIE.f;
+ var i = 0;
+ var key;
+ while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);
+ } return result;
+};
+
+
+/***/ }),
+/* 129 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $export = __webpack_require__(0);
+// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])
+$export($export.S, 'Object', { create: __webpack_require__(36) });
+
+
+/***/ }),
+/* 130 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $export = __webpack_require__(0);
+// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)
+$export($export.S + $export.F * !__webpack_require__(6), 'Object', { defineProperty: __webpack_require__(7).f });
+
+
+/***/ }),
+/* 131 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $export = __webpack_require__(0);
+// 19.1.2.3 / 15.2.3.7 Object.defineProperties(O, Properties)
+$export($export.S + $export.F * !__webpack_require__(6), 'Object', { defineProperties: __webpack_require__(94) });
+
+
+/***/ }),
+/* 132 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)
+var toIObject = __webpack_require__(15);
+var $getOwnPropertyDescriptor = __webpack_require__(16).f;
+
+__webpack_require__(25)('getOwnPropertyDescriptor', function () {
+ return function getOwnPropertyDescriptor(it, key) {
+ return $getOwnPropertyDescriptor(toIObject(it), key);
+ };
+});
+
+
+/***/ }),
+/* 133 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.9 Object.getPrototypeOf(O)
+var toObject = __webpack_require__(9);
+var $getPrototypeOf = __webpack_require__(17);
+
+__webpack_require__(25)('getPrototypeOf', function () {
+ return function getPrototypeOf(it) {
+ return $getPrototypeOf(toObject(it));
+ };
+});
+
+
+/***/ }),
+/* 134 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.14 Object.keys(O)
+var toObject = __webpack_require__(9);
+var $keys = __webpack_require__(34);
+
+__webpack_require__(25)('keys', function () {
+ return function keys(it) {
+ return $keys(toObject(it));
+ };
+});
+
+
+/***/ }),
+/* 135 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.7 Object.getOwnPropertyNames(O)
+__webpack_require__(25)('getOwnPropertyNames', function () {
+ return __webpack_require__(95).f;
+});
+
+
+/***/ }),
+/* 136 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.5 Object.freeze(O)
+var isObject = __webpack_require__(4);
+var meta = __webpack_require__(29).onFreeze;
+
+__webpack_require__(25)('freeze', function ($freeze) {
+ return function freeze(it) {
+ return $freeze && isObject(it) ? $freeze(meta(it)) : it;
+ };
+});
+
+
+/***/ }),
+/* 137 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.17 Object.seal(O)
+var isObject = __webpack_require__(4);
+var meta = __webpack_require__(29).onFreeze;
+
+__webpack_require__(25)('seal', function ($seal) {
+ return function seal(it) {
+ return $seal && isObject(it) ? $seal(meta(it)) : it;
+ };
+});
+
+
+/***/ }),
+/* 138 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.15 Object.preventExtensions(O)
+var isObject = __webpack_require__(4);
+var meta = __webpack_require__(29).onFreeze;
+
+__webpack_require__(25)('preventExtensions', function ($preventExtensions) {
+ return function preventExtensions(it) {
+ return $preventExtensions && isObject(it) ? $preventExtensions(meta(it)) : it;
+ };
+});
+
+
+/***/ }),
+/* 139 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.12 Object.isFrozen(O)
+var isObject = __webpack_require__(4);
+
+__webpack_require__(25)('isFrozen', function ($isFrozen) {
+ return function isFrozen(it) {
+ return isObject(it) ? $isFrozen ? $isFrozen(it) : false : true;
+ };
+});
+
+
+/***/ }),
+/* 140 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.13 Object.isSealed(O)
+var isObject = __webpack_require__(4);
+
+__webpack_require__(25)('isSealed', function ($isSealed) {
+ return function isSealed(it) {
+ return isObject(it) ? $isSealed ? $isSealed(it) : false : true;
+ };
+});
+
+
+/***/ }),
+/* 141 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.2.11 Object.isExtensible(O)
+var isObject = __webpack_require__(4);
+
+__webpack_require__(25)('isExtensible', function ($isExtensible) {
+ return function isExtensible(it) {
+ return isObject(it) ? $isExtensible ? $isExtensible(it) : true : false;
+ };
+});
+
+
+/***/ }),
+/* 142 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.3.1 Object.assign(target, source)
+var $export = __webpack_require__(0);
+
+$export($export.S + $export.F, 'Object', { assign: __webpack_require__(96) });
+
+
+/***/ }),
+/* 143 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.3.10 Object.is(value1, value2)
+var $export = __webpack_require__(0);
+$export($export.S, 'Object', { is: __webpack_require__(144) });
+
+
+/***/ }),
+/* 144 */
+/***/ (function(module, exports) {
+
+// 7.2.9 SameValue(x, y)
+module.exports = Object.is || function is(x, y) {
+ // eslint-disable-next-line no-self-compare
+ return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;
+};
+
+
+/***/ }),
+/* 145 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.1.3.19 Object.setPrototypeOf(O, proto)
+var $export = __webpack_require__(0);
+$export($export.S, 'Object', { setPrototypeOf: __webpack_require__(69).set });
+
+
+/***/ }),
+/* 146 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// 19.1.3.6 Object.prototype.toString()
+var classof = __webpack_require__(48);
+var test = {};
+test[__webpack_require__(5)('toStringTag')] = 'z';
+if (test + '' != '[object z]') {
+ __webpack_require__(12)(Object.prototype, 'toString', function toString() {
+ return '[object ' + classof(this) + ']';
+ }, true);
+}
+
+
+/***/ }),
+/* 147 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 19.2.3.2 / 15.3.4.5 Function.prototype.bind(thisArg, args...)
+var $export = __webpack_require__(0);
+
+$export($export.P, 'Function', { bind: __webpack_require__(97) });
+
+
+/***/ }),
+/* 148 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var dP = __webpack_require__(7).f;
+var FProto = Function.prototype;
+var nameRE = /^\s*function ([^ (]*)/;
+var NAME = 'name';
+
+// 19.2.4.2 name
+NAME in FProto || __webpack_require__(6) && dP(FProto, NAME, {
+ configurable: true,
+ get: function () {
+ try {
+ return ('' + this).match(nameRE)[1];
+ } catch (e) {
+ return '';
+ }
+ }
+});
+
+
+/***/ }),
+/* 149 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var isObject = __webpack_require__(4);
+var getPrototypeOf = __webpack_require__(17);
+var HAS_INSTANCE = __webpack_require__(5)('hasInstance');
+var FunctionProto = Function.prototype;
+// 19.2.3.6 Function.prototype[@@hasInstance](V)
+if (!(HAS_INSTANCE in FunctionProto)) __webpack_require__(7).f(FunctionProto, HAS_INSTANCE, { value: function (O) {
+ if (typeof this != 'function' || !isObject(O)) return false;
+ if (!isObject(this.prototype)) return O instanceof this;
+ // for environment w/o native `@@hasInstance` logic enough `instanceof`, but add this:
+ while (O = getPrototypeOf(O)) if (this.prototype === O) return true;
+ return false;
+} });
+
+
+/***/ }),
+/* 150 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $export = __webpack_require__(0);
+var $parseInt = __webpack_require__(99);
+// 18.2.5 parseInt(string, radix)
+$export($export.G + $export.F * (parseInt != $parseInt), { parseInt: $parseInt });
+
+
+/***/ }),
+/* 151 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $export = __webpack_require__(0);
+var $parseFloat = __webpack_require__(100);
+// 18.2.4 parseFloat(string)
+$export($export.G + $export.F * (parseFloat != $parseFloat), { parseFloat: $parseFloat });
+
+
+/***/ }),
+/* 152 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var global = __webpack_require__(2);
+var has = __webpack_require__(14);
+var cof = __webpack_require__(20);
+var inheritIfRequired = __webpack_require__(71);
+var toPrimitive = __webpack_require__(22);
+var fails = __webpack_require__(3);
+var gOPN = __webpack_require__(37).f;
+var gOPD = __webpack_require__(16).f;
+var dP = __webpack_require__(7).f;
+var $trim = __webpack_require__(43).trim;
+var NUMBER = 'Number';
+var $Number = global[NUMBER];
+var Base = $Number;
+var proto = $Number.prototype;
+// Opera ~12 has broken Object#toString
+var BROKEN_COF = cof(__webpack_require__(36)(proto)) == NUMBER;
+var TRIM = 'trim' in String.prototype;
+
+// 7.1.3 ToNumber(argument)
+var toNumber = function (argument) {
+ var it = toPrimitive(argument, false);
+ if (typeof it == 'string' && it.length > 2) {
+ it = TRIM ? it.trim() : $trim(it, 3);
+ var first = it.charCodeAt(0);
+ var third, radix, maxCode;
+ if (first === 43 || first === 45) {
+ third = it.charCodeAt(2);
+ if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix
+ } else if (first === 48) {
+ switch (it.charCodeAt(1)) {
+ case 66: case 98: radix = 2; maxCode = 49; break; // fast equal /^0b[01]+$/i
+ case 79: case 111: radix = 8; maxCode = 55; break; // fast equal /^0o[0-7]+$/i
+ default: return +it;
+ }
+ for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) {
+ code = digits.charCodeAt(i);
+ // parseInt parses a string to a first unavailable symbol
+ // but ToNumber should return NaN if a string contains unavailable symbols
+ if (code < 48 || code > maxCode) return NaN;
+ } return parseInt(digits, radix);
+ }
+ } return +it;
+};
+
+if (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) {
+ $Number = function Number(value) {
+ var it = arguments.length < 1 ? 0 : value;
+ var that = this;
+ return that instanceof $Number
+ // check on 1..constructor(foo) case
+ && (BROKEN_COF ? fails(function () { proto.valueOf.call(that); }) : cof(that) != NUMBER)
+ ? inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it);
+ };
+ for (var keys = __webpack_require__(6) ? gOPN(Base) : (
+ // ES3:
+ 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +
+ // ES6 (in case, if modules with ES6 Number statics required before):
+ 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +
+ 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger'
+ ).split(','), j = 0, key; keys.length > j; j++) {
+ if (has(Base, key = keys[j]) && !has($Number, key)) {
+ dP($Number, key, gOPD(Base, key));
+ }
+ }
+ $Number.prototype = proto;
+ proto.constructor = $Number;
+ __webpack_require__(12)(global, NUMBER, $Number);
+}
+
+
+/***/ }),
+/* 153 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $export = __webpack_require__(0);
+var toInteger = __webpack_require__(24);
+var aNumberValue = __webpack_require__(101);
+var repeat = __webpack_require__(72);
+var $toFixed = 1.0.toFixed;
+var floor = Math.floor;
+var data = [0, 0, 0, 0, 0, 0];
+var ERROR = 'Number.toFixed: incorrect invocation!';
+var ZERO = '0';
+
+var multiply = function (n, c) {
+ var i = -1;
+ var c2 = c;
+ while (++i < 6) {
+ c2 += n * data[i];
+ data[i] = c2 % 1e7;
+ c2 = floor(c2 / 1e7);
+ }
+};
+var divide = function (n) {
+ var i = 6;
+ var c = 0;
+ while (--i >= 0) {
+ c += data[i];
+ data[i] = floor(c / n);
+ c = (c % n) * 1e7;
+ }
+};
+var numToString = function () {
+ var i = 6;
+ var s = '';
+ while (--i >= 0) {
+ if (s !== '' || i === 0 || data[i] !== 0) {
+ var t = String(data[i]);
+ s = s === '' ? t : s + repeat.call(ZERO, 7 - t.length) + t;
+ }
+ } return s;
+};
+var pow = function (x, n, acc) {
+ return n === 0 ? acc : n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc);
+};
+var log = function (x) {
+ var n = 0;
+ var x2 = x;
+ while (x2 >= 4096) {
+ n += 12;
+ x2 /= 4096;
+ }
+ while (x2 >= 2) {
+ n += 1;
+ x2 /= 2;
+ } return n;
+};
+
+$export($export.P + $export.F * (!!$toFixed && (
+ 0.00008.toFixed(3) !== '0.000' ||
+ 0.9.toFixed(0) !== '1' ||
+ 1.255.toFixed(2) !== '1.25' ||
+ 1000000000000000128.0.toFixed(0) !== '1000000000000000128'
+) || !__webpack_require__(3)(function () {
+ // V8 ~ Android 4.3-
+ $toFixed.call({});
+})), 'Number', {
+ toFixed: function toFixed(fractionDigits) {
+ var x = aNumberValue(this, ERROR);
+ var f = toInteger(fractionDigits);
+ var s = '';
+ var m = ZERO;
+ var e, z, j, k;
+ if (f < 0 || f > 20) throw RangeError(ERROR);
+ // eslint-disable-next-line no-self-compare
+ if (x != x) return 'NaN';
+ if (x <= -1e21 || x >= 1e21) return String(x);
+ if (x < 0) {
+ s = '-';
+ x = -x;
+ }
+ if (x > 1e-21) {
+ e = log(x * pow(2, 69, 1)) - 69;
+ z = e < 0 ? x * pow(2, -e, 1) : x / pow(2, e, 1);
+ z *= 0x10000000000000;
+ e = 52 - e;
+ if (e > 0) {
+ multiply(0, z);
+ j = f;
+ while (j >= 7) {
+ multiply(1e7, 0);
+ j -= 7;
+ }
+ multiply(pow(10, j, 1), 0);
+ j = e - 1;
+ while (j >= 23) {
+ divide(1 << 23);
+ j -= 23;
+ }
+ divide(1 << j);
+ multiply(1, 1);
+ divide(2);
+ m = numToString();
+ } else {
+ multiply(0, z);
+ multiply(1 << -e, 0);
+ m = numToString() + repeat.call(ZERO, f);
+ }
+ }
+ if (f > 0) {
+ k = m.length;
+ m = s + (k <= f ? '0.' + repeat.call(ZERO, f - k) + m : m.slice(0, k - f) + '.' + m.slice(k - f));
+ } else {
+ m = s + m;
+ } return m;
+ }
+});
+
+
+/***/ }),
+/* 154 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $export = __webpack_require__(0);
+var $fails = __webpack_require__(3);
+var aNumberValue = __webpack_require__(101);
+var $toPrecision = 1.0.toPrecision;
+
+$export($export.P + $export.F * ($fails(function () {
+ // IE7-
+ return $toPrecision.call(1, undefined) !== '1';
+}) || !$fails(function () {
+ // V8 ~ Android 4.3-
+ $toPrecision.call({});
+})), 'Number', {
+ toPrecision: function toPrecision(precision) {
+ var that = aNumberValue(this, 'Number#toPrecision: incorrect invocation!');
+ return precision === undefined ? $toPrecision.call(that) : $toPrecision.call(that, precision);
+ }
+});
+
+
+/***/ }),
+/* 155 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 20.1.2.1 Number.EPSILON
+var $export = __webpack_require__(0);
+
+$export($export.S, 'Number', { EPSILON: Math.pow(2, -52) });
+
+
+/***/ }),
+/* 156 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 20.1.2.2 Number.isFinite(number)
+var $export = __webpack_require__(0);
+var _isFinite = __webpack_require__(2).isFinite;
+
+$export($export.S, 'Number', {
+ isFinite: function isFinite(it) {
+ return typeof it == 'number' && _isFinite(it);
+ }
+});
+
+
+/***/ }),
+/* 157 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 20.1.2.3 Number.isInteger(number)
+var $export = __webpack_require__(0);
+
+$export($export.S, 'Number', { isInteger: __webpack_require__(102) });
+
+
+/***/ }),
+/* 158 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 20.1.2.4 Number.isNaN(number)
+var $export = __webpack_require__(0);
+
+$export($export.S, 'Number', {
+ isNaN: function isNaN(number) {
+ // eslint-disable-next-line no-self-compare
+ return number != number;
+ }
+});
+
+
+/***/ }),
+/* 159 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 20.1.2.5 Number.isSafeInteger(number)
+var $export = __webpack_require__(0);
+var isInteger = __webpack_require__(102);
+var abs = Math.abs;
+
+$export($export.S, 'Number', {
+ isSafeInteger: function isSafeInteger(number) {
+ return isInteger(number) && abs(number) <= 0x1fffffffffffff;
+ }
+});
+
+
+/***/ }),
+/* 160 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 20.1.2.6 Number.MAX_SAFE_INTEGER
+var $export = __webpack_require__(0);
+
+$export($export.S, 'Number', { MAX_SAFE_INTEGER: 0x1fffffffffffff });
+
+
+/***/ }),
+/* 161 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 20.1.2.10 Number.MIN_SAFE_INTEGER
+var $export = __webpack_require__(0);
+
+$export($export.S, 'Number', { MIN_SAFE_INTEGER: -0x1fffffffffffff });
+
+
+/***/ }),
+/* 162 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $export = __webpack_require__(0);
+var $parseFloat = __webpack_require__(100);
+// 20.1.2.12 Number.parseFloat(string)
+$export($export.S + $export.F * (Number.parseFloat != $parseFloat), 'Number', { parseFloat: $parseFloat });
+
+
+/***/ }),
+/* 163 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $export = __webpack_require__(0);
+var $parseInt = __webpack_require__(99);
+// 20.1.2.13 Number.parseInt(string, radix)
+$export($export.S + $export.F * (Number.parseInt != $parseInt), 'Number', { parseInt: $parseInt });
+
+
+/***/ }),
+/* 164 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 20.2.2.3 Math.acosh(x)
+var $export = __webpack_require__(0);
+var log1p = __webpack_require__(103);
+var sqrt = Math.sqrt;
+var $acosh = Math.acosh;
+
+$export($export.S + $export.F * !($acosh
+ // V8 bug: https://code.google.com/p/v8/issues/detail?id=3509
+ && Math.floor($acosh(Number.MAX_VALUE)) == 710
+ // Tor Browser bug: Math.acosh(Infinity) -> NaN
+ && $acosh(Infinity) == Infinity
+), 'Math', {
+ acosh: function acosh(x) {
+ return (x = +x) < 1 ? NaN : x > 94906265.62425156
+ ? Math.log(x) + Math.LN2
+ : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));
+ }
+});
+
+
+/***/ }),
+/* 165 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 20.2.2.5 Math.asinh(x)
+var $export = __webpack_require__(0);
+var $asinh = Math.asinh;
+
+function asinh(x) {
+ return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1));
+}
+
+// Tor Browser bug: Math.asinh(0) -> -0
+$export($export.S + $export.F * !($asinh && 1 / $asinh(0) > 0), 'Math', { asinh: asinh });
+
+
+/***/ }),
+/* 166 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 20.2.2.7 Math.atanh(x)
+var $export = __webpack_require__(0);
+var $atanh = Math.atanh;
+
+// Tor Browser bug: Math.atanh(-0) -> 0
+$export($export.S + $export.F * !($atanh && 1 / $atanh(-0) < 0), 'Math', {
+ atanh: function atanh(x) {
+ return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2;
+ }
+});
+
+
+/***/ }),
+/* 167 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 20.2.2.9 Math.cbrt(x)
+var $export = __webpack_require__(0);
+var sign = __webpack_require__(73);
+
+$export($export.S, 'Math', {
+ cbrt: function cbrt(x) {
+ return sign(x = +x) * Math.pow(Math.abs(x), 1 / 3);
+ }
+});
+
+
+/***/ }),
+/* 168 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 20.2.2.11 Math.clz32(x)
+var $export = __webpack_require__(0);
+
+$export($export.S, 'Math', {
+ clz32: function clz32(x) {
+ return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32;
+ }
+});
+
+
+/***/ }),
+/* 169 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 20.2.2.12 Math.cosh(x)
+var $export = __webpack_require__(0);
+var exp = Math.exp;
+
+$export($export.S, 'Math', {
+ cosh: function cosh(x) {
+ return (exp(x = +x) + exp(-x)) / 2;
+ }
+});
+
+
+/***/ }),
+/* 170 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 20.2.2.14 Math.expm1(x)
+var $export = __webpack_require__(0);
+var $expm1 = __webpack_require__(74);
+
+$export($export.S + $export.F * ($expm1 != Math.expm1), 'Math', { expm1: $expm1 });
+
+
+/***/ }),
+/* 171 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 20.2.2.16 Math.fround(x)
+var $export = __webpack_require__(0);
+
+$export($export.S, 'Math', { fround: __webpack_require__(104) });
+
+
+/***/ }),
+/* 172 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 20.2.2.17 Math.hypot([value1[, value2[, … ]]])
+var $export = __webpack_require__(0);
+var abs = Math.abs;
+
+$export($export.S, 'Math', {
+ hypot: function hypot(value1, value2) { // eslint-disable-line no-unused-vars
+ var sum = 0;
+ var i = 0;
+ var aLen = arguments.length;
+ var larg = 0;
+ var arg, div;
+ while (i < aLen) {
+ arg = abs(arguments[i++]);
+ if (larg < arg) {
+ div = larg / arg;
+ sum = sum * div * div + 1;
+ larg = arg;
+ } else if (arg > 0) {
+ div = arg / larg;
+ sum += div * div;
+ } else sum += arg;
+ }
+ return larg === Infinity ? Infinity : larg * Math.sqrt(sum);
+ }
+});
+
+
+/***/ }),
+/* 173 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 20.2.2.18 Math.imul(x, y)
+var $export = __webpack_require__(0);
+var $imul = Math.imul;
+
+// some WebKit versions fails with big numbers, some has wrong arity
+$export($export.S + $export.F * __webpack_require__(3)(function () {
+ return $imul(0xffffffff, 5) != -5 || $imul.length != 2;
+}), 'Math', {
+ imul: function imul(x, y) {
+ var UINT16 = 0xffff;
+ var xn = +x;
+ var yn = +y;
+ var xl = UINT16 & xn;
+ var yl = UINT16 & yn;
+ return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0);
+ }
+});
+
+
+/***/ }),
+/* 174 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 20.2.2.21 Math.log10(x)
+var $export = __webpack_require__(0);
+
+$export($export.S, 'Math', {
+ log10: function log10(x) {
+ return Math.log(x) * Math.LOG10E;
+ }
+});
+
+
+/***/ }),
+/* 175 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 20.2.2.20 Math.log1p(x)
+var $export = __webpack_require__(0);
+
+$export($export.S, 'Math', { log1p: __webpack_require__(103) });
+
+
+/***/ }),
+/* 176 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 20.2.2.22 Math.log2(x)
+var $export = __webpack_require__(0);
+
+$export($export.S, 'Math', {
+ log2: function log2(x) {
+ return Math.log(x) / Math.LN2;
+ }
+});
+
+
+/***/ }),
+/* 177 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 20.2.2.28 Math.sign(x)
+var $export = __webpack_require__(0);
+
+$export($export.S, 'Math', { sign: __webpack_require__(73) });
+
+
+/***/ }),
+/* 178 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 20.2.2.30 Math.sinh(x)
+var $export = __webpack_require__(0);
+var expm1 = __webpack_require__(74);
+var exp = Math.exp;
+
+// V8 near Chromium 38 has a problem with very small numbers
+$export($export.S + $export.F * __webpack_require__(3)(function () {
+ return !Math.sinh(-2e-17) != -2e-17;
+}), 'Math', {
+ sinh: function sinh(x) {
+ return Math.abs(x = +x) < 1
+ ? (expm1(x) - expm1(-x)) / 2
+ : (exp(x - 1) - exp(-x - 1)) * (Math.E / 2);
+ }
+});
+
+
+/***/ }),
+/* 179 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 20.2.2.33 Math.tanh(x)
+var $export = __webpack_require__(0);
+var expm1 = __webpack_require__(74);
+var exp = Math.exp;
+
+$export($export.S, 'Math', {
+ tanh: function tanh(x) {
+ var a = expm1(x = +x);
+ var b = expm1(-x);
+ return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp(x) + exp(-x));
+ }
+});
+
+
+/***/ }),
+/* 180 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 20.2.2.34 Math.trunc(x)
+var $export = __webpack_require__(0);
+
+$export($export.S, 'Math', {
+ trunc: function trunc(it) {
+ return (it > 0 ? Math.floor : Math.ceil)(it);
+ }
+});
+
+
+/***/ }),
+/* 181 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $export = __webpack_require__(0);
+var toAbsoluteIndex = __webpack_require__(35);
+var fromCharCode = String.fromCharCode;
+var $fromCodePoint = String.fromCodePoint;
+
+// length should be 1, old FF problem
+$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {
+ // 21.1.2.2 String.fromCodePoint(...codePoints)
+ fromCodePoint: function fromCodePoint(x) { // eslint-disable-line no-unused-vars
+ var res = [];
+ var aLen = arguments.length;
+ var i = 0;
+ var code;
+ while (aLen > i) {
+ code = +arguments[i++];
+ if (toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');
+ res.push(code < 0x10000
+ ? fromCharCode(code)
+ : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)
+ );
+ } return res.join('');
+ }
+});
+
+
+/***/ }),
+/* 182 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $export = __webpack_require__(0);
+var toIObject = __webpack_require__(15);
+var toLength = __webpack_require__(8);
+
+$export($export.S, 'String', {
+ // 21.1.2.4 String.raw(callSite, ...substitutions)
+ raw: function raw(callSite) {
+ var tpl = toIObject(callSite.raw);
+ var len = toLength(tpl.length);
+ var aLen = arguments.length;
+ var res = [];
+ var i = 0;
+ while (len > i) {
+ res.push(String(tpl[i++]));
+ if (i < aLen) res.push(String(arguments[i]));
+ } return res.join('');
+ }
+});
+
+
+/***/ }),
+/* 183 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// 21.1.3.25 String.prototype.trim()
+__webpack_require__(43)('trim', function ($trim) {
+ return function trim() {
+ return $trim(this, 3);
+ };
+});
+
+
+/***/ }),
+/* 184 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $at = __webpack_require__(75)(true);
+
+// 21.1.3.27 String.prototype[@@iterator]()
+__webpack_require__(76)(String, 'String', function (iterated) {
+ this._t = String(iterated); // target
+ this._i = 0; // next index
+// 21.1.5.2.1 %StringIteratorPrototype%.next()
+}, function () {
+ var O = this._t;
+ var index = this._i;
+ var point;
+ if (index >= O.length) return { value: undefined, done: true };
+ point = $at(O, index);
+ this._i += point.length;
+ return { value: point, done: false };
+});
+
+
+/***/ }),
+/* 185 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $export = __webpack_require__(0);
+var $at = __webpack_require__(75)(false);
+$export($export.P, 'String', {
+ // 21.1.3.3 String.prototype.codePointAt(pos)
+ codePointAt: function codePointAt(pos) {
+ return $at(this, pos);
+ }
+});
+
+
+/***/ }),
+/* 186 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+// 21.1.3.6 String.prototype.endsWith(searchString [, endPosition])
+
+var $export = __webpack_require__(0);
+var toLength = __webpack_require__(8);
+var context = __webpack_require__(78);
+var ENDS_WITH = 'endsWith';
+var $endsWith = ''[ENDS_WITH];
+
+$export($export.P + $export.F * __webpack_require__(79)(ENDS_WITH), 'String', {
+ endsWith: function endsWith(searchString /* , endPosition = @length */) {
+ var that = context(this, searchString, ENDS_WITH);
+ var endPosition = arguments.length > 1 ? arguments[1] : undefined;
+ var len = toLength(that.length);
+ var end = endPosition === undefined ? len : Math.min(toLength(endPosition), len);
+ var search = String(searchString);
+ return $endsWith
+ ? $endsWith.call(that, search, end)
+ : that.slice(end - search.length, end) === search;
+ }
+});
+
+
+/***/ }),
+/* 187 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+// 21.1.3.7 String.prototype.includes(searchString, position = 0)
+
+var $export = __webpack_require__(0);
+var context = __webpack_require__(78);
+var INCLUDES = 'includes';
+
+$export($export.P + $export.F * __webpack_require__(79)(INCLUDES), 'String', {
+ includes: function includes(searchString /* , position = 0 */) {
+ return !!~context(this, searchString, INCLUDES)
+ .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);
+ }
+});
+
+
+/***/ }),
+/* 188 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $export = __webpack_require__(0);
+
+$export($export.P, 'String', {
+ // 21.1.3.13 String.prototype.repeat(count)
+ repeat: __webpack_require__(72)
+});
+
+
+/***/ }),
+/* 189 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+// 21.1.3.18 String.prototype.startsWith(searchString [, position ])
+
+var $export = __webpack_require__(0);
+var toLength = __webpack_require__(8);
+var context = __webpack_require__(78);
+var STARTS_WITH = 'startsWith';
+var $startsWith = ''[STARTS_WITH];
+
+$export($export.P + $export.F * __webpack_require__(79)(STARTS_WITH), 'String', {
+ startsWith: function startsWith(searchString /* , position = 0 */) {
+ var that = context(this, searchString, STARTS_WITH);
+ var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));
+ var search = String(searchString);
+ return $startsWith
+ ? $startsWith.call(that, search, index)
+ : that.slice(index, index + search.length) === search;
+ }
+});
+
+
+/***/ }),
+/* 190 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// B.2.3.2 String.prototype.anchor(name)
+__webpack_require__(13)('anchor', function (createHTML) {
+ return function anchor(name) {
+ return createHTML(this, 'a', 'name', name);
+ };
+});
+
+
+/***/ }),
+/* 191 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// B.2.3.3 String.prototype.big()
+__webpack_require__(13)('big', function (createHTML) {
+ return function big() {
+ return createHTML(this, 'big', '', '');
+ };
+});
+
+
+/***/ }),
+/* 192 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// B.2.3.4 String.prototype.blink()
+__webpack_require__(13)('blink', function (createHTML) {
+ return function blink() {
+ return createHTML(this, 'blink', '', '');
+ };
+});
+
+
+/***/ }),
+/* 193 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// B.2.3.5 String.prototype.bold()
+__webpack_require__(13)('bold', function (createHTML) {
+ return function bold() {
+ return createHTML(this, 'b', '', '');
+ };
+});
+
+
+/***/ }),
+/* 194 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// B.2.3.6 String.prototype.fixed()
+__webpack_require__(13)('fixed', function (createHTML) {
+ return function fixed() {
+ return createHTML(this, 'tt', '', '');
+ };
+});
+
+
+/***/ }),
+/* 195 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// B.2.3.7 String.prototype.fontcolor(color)
+__webpack_require__(13)('fontcolor', function (createHTML) {
+ return function fontcolor(color) {
+ return createHTML(this, 'font', 'color', color);
+ };
+});
+
+
+/***/ }),
+/* 196 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// B.2.3.8 String.prototype.fontsize(size)
+__webpack_require__(13)('fontsize', function (createHTML) {
+ return function fontsize(size) {
+ return createHTML(this, 'font', 'size', size);
+ };
+});
+
+
+/***/ }),
+/* 197 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// B.2.3.9 String.prototype.italics()
+__webpack_require__(13)('italics', function (createHTML) {
+ return function italics() {
+ return createHTML(this, 'i', '', '');
+ };
+});
+
+
+/***/ }),
+/* 198 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// B.2.3.10 String.prototype.link(url)
+__webpack_require__(13)('link', function (createHTML) {
+ return function link(url) {
+ return createHTML(this, 'a', 'href', url);
+ };
+});
+
+
+/***/ }),
+/* 199 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// B.2.3.11 String.prototype.small()
+__webpack_require__(13)('small', function (createHTML) {
+ return function small() {
+ return createHTML(this, 'small', '', '');
+ };
+});
+
+
+/***/ }),
+/* 200 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// B.2.3.12 String.prototype.strike()
+__webpack_require__(13)('strike', function (createHTML) {
+ return function strike() {
+ return createHTML(this, 'strike', '', '');
+ };
+});
+
+
+/***/ }),
+/* 201 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// B.2.3.13 String.prototype.sub()
+__webpack_require__(13)('sub', function (createHTML) {
+ return function sub() {
+ return createHTML(this, 'sub', '', '');
+ };
+});
+
+
+/***/ }),
+/* 202 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// B.2.3.14 String.prototype.sup()
+__webpack_require__(13)('sup', function (createHTML) {
+ return function sup() {
+ return createHTML(this, 'sup', '', '');
+ };
+});
+
+
+/***/ }),
+/* 203 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 20.3.3.1 / 15.9.4.4 Date.now()
+var $export = __webpack_require__(0);
+
+$export($export.S, 'Date', { now: function () { return new Date().getTime(); } });
+
+
+/***/ }),
+/* 204 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $export = __webpack_require__(0);
+var toObject = __webpack_require__(9);
+var toPrimitive = __webpack_require__(22);
+
+$export($export.P + $export.F * __webpack_require__(3)(function () {
+ return new Date(NaN).toJSON() !== null
+ || Date.prototype.toJSON.call({ toISOString: function () { return 1; } }) !== 1;
+}), 'Date', {
+ // eslint-disable-next-line no-unused-vars
+ toJSON: function toJSON(key) {
+ var O = toObject(this);
+ var pv = toPrimitive(O);
+ return typeof pv == 'number' && !isFinite(pv) ? null : O.toISOString();
+ }
+});
+
+
+/***/ }),
+/* 205 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString()
+var $export = __webpack_require__(0);
+var toISOString = __webpack_require__(206);
+
+// PhantomJS / old WebKit has a broken implementations
+$export($export.P + $export.F * (Date.prototype.toISOString !== toISOString), 'Date', {
+ toISOString: toISOString
+});
+
+
+/***/ }),
+/* 206 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString()
+var fails = __webpack_require__(3);
+var getTime = Date.prototype.getTime;
+var $toISOString = Date.prototype.toISOString;
+
+var lz = function (num) {
+ return num > 9 ? num : '0' + num;
+};
+
+// PhantomJS / old WebKit has a broken implementations
+module.exports = (fails(function () {
+ return $toISOString.call(new Date(-5e13 - 1)) != '0385-07-25T07:06:39.999Z';
+}) || !fails(function () {
+ $toISOString.call(new Date(NaN));
+})) ? function toISOString() {
+ if (!isFinite(getTime.call(this))) throw RangeError('Invalid time value');
+ var d = this;
+ var y = d.getUTCFullYear();
+ var m = d.getUTCMilliseconds();
+ var s = y < 0 ? '-' : y > 9999 ? '+' : '';
+ return s + ('00000' + Math.abs(y)).slice(s ? -6 : -4) +
+ '-' + lz(d.getUTCMonth() + 1) + '-' + lz(d.getUTCDate()) +
+ 'T' + lz(d.getUTCHours()) + ':' + lz(d.getUTCMinutes()) +
+ ':' + lz(d.getUTCSeconds()) + '.' + (m > 99 ? m : '0' + lz(m)) + 'Z';
+} : $toISOString;
+
+
+/***/ }),
+/* 207 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var DateProto = Date.prototype;
+var INVALID_DATE = 'Invalid Date';
+var TO_STRING = 'toString';
+var $toString = DateProto[TO_STRING];
+var getTime = DateProto.getTime;
+if (new Date(NaN) + '' != INVALID_DATE) {
+ __webpack_require__(12)(DateProto, TO_STRING, function toString() {
+ var value = getTime.call(this);
+ // eslint-disable-next-line no-self-compare
+ return value === value ? $toString.call(this) : INVALID_DATE;
+ });
+}
+
+
+/***/ }),
+/* 208 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var TO_PRIMITIVE = __webpack_require__(5)('toPrimitive');
+var proto = Date.prototype;
+
+if (!(TO_PRIMITIVE in proto)) __webpack_require__(11)(proto, TO_PRIMITIVE, __webpack_require__(209));
+
+
+/***/ }),
+/* 209 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var anObject = __webpack_require__(1);
+var toPrimitive = __webpack_require__(22);
+var NUMBER = 'number';
+
+module.exports = function (hint) {
+ if (hint !== 'string' && hint !== NUMBER && hint !== 'default') throw TypeError('Incorrect hint');
+ return toPrimitive(anObject(this), hint != NUMBER);
+};
+
+
+/***/ }),
+/* 210 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 22.1.2.2 / 15.4.3.2 Array.isArray(arg)
+var $export = __webpack_require__(0);
+
+$export($export.S, 'Array', { isArray: __webpack_require__(52) });
+
+
+/***/ }),
+/* 211 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var ctx = __webpack_require__(19);
+var $export = __webpack_require__(0);
+var toObject = __webpack_require__(9);
+var call = __webpack_require__(105);
+var isArrayIter = __webpack_require__(80);
+var toLength = __webpack_require__(8);
+var createProperty = __webpack_require__(81);
+var getIterFn = __webpack_require__(82);
+
+$export($export.S + $export.F * !__webpack_require__(54)(function (iter) { Array.from(iter); }), 'Array', {
+ // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)
+ from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {
+ var O = toObject(arrayLike);
+ var C = typeof this == 'function' ? this : Array;
+ var aLen = arguments.length;
+ var mapfn = aLen > 1 ? arguments[1] : undefined;
+ var mapping = mapfn !== undefined;
+ var index = 0;
+ var iterFn = getIterFn(O);
+ var length, result, step, iterator;
+ if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);
+ // if object isn't iterable or it's array with default iterator - use simple case
+ if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {
+ for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {
+ createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);
+ }
+ } else {
+ length = toLength(O.length);
+ for (result = new C(length); length > index; index++) {
+ createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);
+ }
+ }
+ result.length = index;
+ return result;
+ }
+});
+
+
+/***/ }),
+/* 212 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $export = __webpack_require__(0);
+var createProperty = __webpack_require__(81);
+
+// WebKit Array.of isn't generic
+$export($export.S + $export.F * __webpack_require__(3)(function () {
+ function F() { /* empty */ }
+ return !(Array.of.call(F) instanceof F);
+}), 'Array', {
+ // 22.1.2.3 Array.of( ...items)
+ of: function of(/* ...args */) {
+ var index = 0;
+ var aLen = arguments.length;
+ var result = new (typeof this == 'function' ? this : Array)(aLen);
+ while (aLen > index) createProperty(result, index, arguments[index++]);
+ result.length = aLen;
+ return result;
+ }
+});
+
+
+/***/ }),
+/* 213 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// 22.1.3.13 Array.prototype.join(separator)
+var $export = __webpack_require__(0);
+var toIObject = __webpack_require__(15);
+var arrayJoin = [].join;
+
+// fallback for not array-like strings
+$export($export.P + $export.F * (__webpack_require__(46) != Object || !__webpack_require__(21)(arrayJoin)), 'Array', {
+ join: function join(separator) {
+ return arrayJoin.call(toIObject(this), separator === undefined ? ',' : separator);
+ }
+});
+
+
+/***/ }),
+/* 214 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $export = __webpack_require__(0);
+var html = __webpack_require__(68);
+var cof = __webpack_require__(20);
+var toAbsoluteIndex = __webpack_require__(35);
+var toLength = __webpack_require__(8);
+var arraySlice = [].slice;
+
+// fallback for not array-like ES3 strings and DOM objects
+$export($export.P + $export.F * __webpack_require__(3)(function () {
+ if (html) arraySlice.call(html);
+}), 'Array', {
+ slice: function slice(begin, end) {
+ var len = toLength(this.length);
+ var klass = cof(this);
+ end = end === undefined ? len : end;
+ if (klass == 'Array') return arraySlice.call(this, begin, end);
+ var start = toAbsoluteIndex(begin, len);
+ var upTo = toAbsoluteIndex(end, len);
+ var size = toLength(upTo - start);
+ var cloned = new Array(size);
+ var i = 0;
+ for (; i < size; i++) cloned[i] = klass == 'String'
+ ? this.charAt(start + i)
+ : this[start + i];
+ return cloned;
+ }
+});
+
+
+/***/ }),
+/* 215 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $export = __webpack_require__(0);
+var aFunction = __webpack_require__(10);
+var toObject = __webpack_require__(9);
+var fails = __webpack_require__(3);
+var $sort = [].sort;
+var test = [1, 2, 3];
+
+$export($export.P + $export.F * (fails(function () {
+ // IE8-
+ test.sort(undefined);
+}) || !fails(function () {
+ // V8 bug
+ test.sort(null);
+ // Old WebKit
+}) || !__webpack_require__(21)($sort)), 'Array', {
+ // 22.1.3.25 Array.prototype.sort(comparefn)
+ sort: function sort(comparefn) {
+ return comparefn === undefined
+ ? $sort.call(toObject(this))
+ : $sort.call(toObject(this), aFunction(comparefn));
+ }
+});
+
+
+/***/ }),
+/* 216 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $export = __webpack_require__(0);
+var $forEach = __webpack_require__(26)(0);
+var STRICT = __webpack_require__(21)([].forEach, true);
+
+$export($export.P + $export.F * !STRICT, 'Array', {
+ // 22.1.3.10 / 15.4.4.18 Array.prototype.forEach(callbackfn [, thisArg])
+ forEach: function forEach(callbackfn /* , thisArg */) {
+ return $forEach(this, callbackfn, arguments[1]);
+ }
+});
+
+
+/***/ }),
+/* 217 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var isObject = __webpack_require__(4);
+var isArray = __webpack_require__(52);
+var SPECIES = __webpack_require__(5)('species');
+
+module.exports = function (original) {
+ var C;
+ if (isArray(original)) {
+ C = original.constructor;
+ // cross-realm fallback
+ if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;
+ if (isObject(C)) {
+ C = C[SPECIES];
+ if (C === null) C = undefined;
+ }
+ } return C === undefined ? Array : C;
+};
+
+
+/***/ }),
+/* 218 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $export = __webpack_require__(0);
+var $map = __webpack_require__(26)(1);
+
+$export($export.P + $export.F * !__webpack_require__(21)([].map, true), 'Array', {
+ // 22.1.3.15 / 15.4.4.19 Array.prototype.map(callbackfn [, thisArg])
+ map: function map(callbackfn /* , thisArg */) {
+ return $map(this, callbackfn, arguments[1]);
+ }
+});
+
+
+/***/ }),
+/* 219 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $export = __webpack_require__(0);
+var $filter = __webpack_require__(26)(2);
+
+$export($export.P + $export.F * !__webpack_require__(21)([].filter, true), 'Array', {
+ // 22.1.3.7 / 15.4.4.20 Array.prototype.filter(callbackfn [, thisArg])
+ filter: function filter(callbackfn /* , thisArg */) {
+ return $filter(this, callbackfn, arguments[1]);
+ }
+});
+
+
+/***/ }),
+/* 220 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $export = __webpack_require__(0);
+var $some = __webpack_require__(26)(3);
+
+$export($export.P + $export.F * !__webpack_require__(21)([].some, true), 'Array', {
+ // 22.1.3.23 / 15.4.4.17 Array.prototype.some(callbackfn [, thisArg])
+ some: function some(callbackfn /* , thisArg */) {
+ return $some(this, callbackfn, arguments[1]);
+ }
+});
+
+
+/***/ }),
+/* 221 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $export = __webpack_require__(0);
+var $every = __webpack_require__(26)(4);
+
+$export($export.P + $export.F * !__webpack_require__(21)([].every, true), 'Array', {
+ // 22.1.3.5 / 15.4.4.16 Array.prototype.every(callbackfn [, thisArg])
+ every: function every(callbackfn /* , thisArg */) {
+ return $every(this, callbackfn, arguments[1]);
+ }
+});
+
+
+/***/ }),
+/* 222 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $export = __webpack_require__(0);
+var $reduce = __webpack_require__(106);
+
+$export($export.P + $export.F * !__webpack_require__(21)([].reduce, true), 'Array', {
+ // 22.1.3.18 / 15.4.4.21 Array.prototype.reduce(callbackfn [, initialValue])
+ reduce: function reduce(callbackfn /* , initialValue */) {
+ return $reduce(this, callbackfn, arguments.length, arguments[1], false);
+ }
+});
+
+
+/***/ }),
+/* 223 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $export = __webpack_require__(0);
+var $reduce = __webpack_require__(106);
+
+$export($export.P + $export.F * !__webpack_require__(21)([].reduceRight, true), 'Array', {
+ // 22.1.3.19 / 15.4.4.22 Array.prototype.reduceRight(callbackfn [, initialValue])
+ reduceRight: function reduceRight(callbackfn /* , initialValue */) {
+ return $reduce(this, callbackfn, arguments.length, arguments[1], true);
+ }
+});
+
+
+/***/ }),
+/* 224 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $export = __webpack_require__(0);
+var $indexOf = __webpack_require__(50)(false);
+var $native = [].indexOf;
+var NEGATIVE_ZERO = !!$native && 1 / [1].indexOf(1, -0) < 0;
+
+$export($export.P + $export.F * (NEGATIVE_ZERO || !__webpack_require__(21)($native)), 'Array', {
+ // 22.1.3.11 / 15.4.4.14 Array.prototype.indexOf(searchElement [, fromIndex])
+ indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {
+ return NEGATIVE_ZERO
+ // convert -0 to +0
+ ? $native.apply(this, arguments) || 0
+ : $indexOf(this, searchElement, arguments[1]);
+ }
+});
+
+
+/***/ }),
+/* 225 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $export = __webpack_require__(0);
+var toIObject = __webpack_require__(15);
+var toInteger = __webpack_require__(24);
+var toLength = __webpack_require__(8);
+var $native = [].lastIndexOf;
+var NEGATIVE_ZERO = !!$native && 1 / [1].lastIndexOf(1, -0) < 0;
+
+$export($export.P + $export.F * (NEGATIVE_ZERO || !__webpack_require__(21)($native)), 'Array', {
+ // 22.1.3.14 / 15.4.4.15 Array.prototype.lastIndexOf(searchElement [, fromIndex])
+ lastIndexOf: function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) {
+ // convert -0 to +0
+ if (NEGATIVE_ZERO) return $native.apply(this, arguments) || 0;
+ var O = toIObject(this);
+ var length = toLength(O.length);
+ var index = length - 1;
+ if (arguments.length > 1) index = Math.min(index, toInteger(arguments[1]));
+ if (index < 0) index = length + index;
+ for (;index >= 0; index--) if (index in O) if (O[index] === searchElement) return index || 0;
+ return -1;
+ }
+});
+
+
+/***/ }),
+/* 226 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)
+var $export = __webpack_require__(0);
+
+$export($export.P, 'Array', { copyWithin: __webpack_require__(107) });
+
+__webpack_require__(31)('copyWithin');
+
+
+/***/ }),
+/* 227 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)
+var $export = __webpack_require__(0);
+
+$export($export.P, 'Array', { fill: __webpack_require__(84) });
+
+__webpack_require__(31)('fill');
+
+
+/***/ }),
+/* 228 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)
+var $export = __webpack_require__(0);
+var $find = __webpack_require__(26)(5);
+var KEY = 'find';
+var forced = true;
+// Shouldn't skip holes
+if (KEY in []) Array(1)[KEY](function () { forced = false; });
+$export($export.P + $export.F * forced, 'Array', {
+ find: function find(callbackfn /* , that = undefined */) {
+ return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ }
+});
+__webpack_require__(31)(KEY);
+
+
+/***/ }),
+/* 229 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)
+var $export = __webpack_require__(0);
+var $find = __webpack_require__(26)(6);
+var KEY = 'findIndex';
+var forced = true;
+// Shouldn't skip holes
+if (KEY in []) Array(1)[KEY](function () { forced = false; });
+$export($export.P + $export.F * forced, 'Array', {
+ findIndex: function findIndex(callbackfn /* , that = undefined */) {
+ return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);
+ }
+});
+__webpack_require__(31)(KEY);
+
+
+/***/ }),
+/* 230 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(38)('Array');
+
+
+/***/ }),
+/* 231 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var global = __webpack_require__(2);
+var inheritIfRequired = __webpack_require__(71);
+var dP = __webpack_require__(7).f;
+var gOPN = __webpack_require__(37).f;
+var isRegExp = __webpack_require__(53);
+var $flags = __webpack_require__(55);
+var $RegExp = global.RegExp;
+var Base = $RegExp;
+var proto = $RegExp.prototype;
+var re1 = /a/g;
+var re2 = /a/g;
+// "new" creates a new object, old webkit buggy here
+var CORRECT_NEW = new $RegExp(re1) !== re1;
+
+if (__webpack_require__(6) && (!CORRECT_NEW || __webpack_require__(3)(function () {
+ re2[__webpack_require__(5)('match')] = false;
+ // RegExp constructor can alter flags and IsRegExp works correct with @@match
+ return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i';
+}))) {
+ $RegExp = function RegExp(p, f) {
+ var tiRE = this instanceof $RegExp;
+ var piRE = isRegExp(p);
+ var fiU = f === undefined;
+ return !tiRE && piRE && p.constructor === $RegExp && fiU ? p
+ : inheritIfRequired(CORRECT_NEW
+ ? new Base(piRE && !fiU ? p.source : p, f)
+ : Base((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? $flags.call(p) : f)
+ , tiRE ? this : proto, $RegExp);
+ };
+ var proxy = function (key) {
+ key in $RegExp || dP($RegExp, key, {
+ configurable: true,
+ get: function () { return Base[key]; },
+ set: function (it) { Base[key] = it; }
+ });
+ };
+ for (var keys = gOPN(Base), i = 0; keys.length > i;) proxy(keys[i++]);
+ proto.constructor = $RegExp;
+ $RegExp.prototype = proto;
+ __webpack_require__(12)(global, 'RegExp', $RegExp);
+}
+
+__webpack_require__(38)('RegExp');
+
+
+/***/ }),
+/* 232 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+__webpack_require__(109);
+var anObject = __webpack_require__(1);
+var $flags = __webpack_require__(55);
+var DESCRIPTORS = __webpack_require__(6);
+var TO_STRING = 'toString';
+var $toString = /./[TO_STRING];
+
+var define = function (fn) {
+ __webpack_require__(12)(RegExp.prototype, TO_STRING, fn, true);
+};
+
+// 21.2.5.14 RegExp.prototype.toString()
+if (__webpack_require__(3)(function () { return $toString.call({ source: 'a', flags: 'b' }) != '/a/b'; })) {
+ define(function toString() {
+ var R = anObject(this);
+ return '/'.concat(R.source, '/',
+ 'flags' in R ? R.flags : !DESCRIPTORS && R instanceof RegExp ? $flags.call(R) : undefined);
+ });
+// FF44- RegExp#toString has a wrong name
+} else if ($toString.name != TO_STRING) {
+ define(function toString() {
+ return $toString.call(this);
+ });
+}
+
+
+/***/ }),
+/* 233 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// @@match logic
+__webpack_require__(56)('match', 1, function (defined, MATCH, $match) {
+ // 21.1.3.11 String.prototype.match(regexp)
+ return [function match(regexp) {
+ 'use strict';
+ var O = defined(this);
+ var fn = regexp == undefined ? undefined : regexp[MATCH];
+ return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));
+ }, $match];
+});
+
+
+/***/ }),
+/* 234 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// @@replace logic
+__webpack_require__(56)('replace', 2, function (defined, REPLACE, $replace) {
+ // 21.1.3.14 String.prototype.replace(searchValue, replaceValue)
+ return [function replace(searchValue, replaceValue) {
+ 'use strict';
+ var O = defined(this);
+ var fn = searchValue == undefined ? undefined : searchValue[REPLACE];
+ return fn !== undefined
+ ? fn.call(searchValue, O, replaceValue)
+ : $replace.call(String(O), searchValue, replaceValue);
+ }, $replace];
+});
+
+
+/***/ }),
+/* 235 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// @@search logic
+__webpack_require__(56)('search', 1, function (defined, SEARCH, $search) {
+ // 21.1.3.15 String.prototype.search(regexp)
+ return [function search(regexp) {
+ 'use strict';
+ var O = defined(this);
+ var fn = regexp == undefined ? undefined : regexp[SEARCH];
+ return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));
+ }, $search];
+});
+
+
+/***/ }),
+/* 236 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// @@split logic
+__webpack_require__(56)('split', 2, function (defined, SPLIT, $split) {
+ 'use strict';
+ var isRegExp = __webpack_require__(53);
+ var _split = $split;
+ var $push = [].push;
+ var $SPLIT = 'split';
+ var LENGTH = 'length';
+ var LAST_INDEX = 'lastIndex';
+ if (
+ 'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||
+ 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||
+ 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||
+ '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||
+ '.'[$SPLIT](/()()/)[LENGTH] > 1 ||
+ ''[$SPLIT](/.?/)[LENGTH]
+ ) {
+ var NPCG = /()??/.exec('')[1] === undefined; // nonparticipating capturing group
+ // based on es5-shim implementation, need to rework it
+ $split = function (separator, limit) {
+ var string = String(this);
+ if (separator === undefined && limit === 0) return [];
+ // If `separator` is not a regex, use native split
+ if (!isRegExp(separator)) return _split.call(string, separator, limit);
+ var output = [];
+ var flags = (separator.ignoreCase ? 'i' : '') +
+ (separator.multiline ? 'm' : '') +
+ (separator.unicode ? 'u' : '') +
+ (separator.sticky ? 'y' : '');
+ var lastLastIndex = 0;
+ var splitLimit = limit === undefined ? 4294967295 : limit >>> 0;
+ // Make `global` and avoid `lastIndex` issues by working with a copy
+ var separatorCopy = new RegExp(separator.source, flags + 'g');
+ var separator2, match, lastIndex, lastLength, i;
+ // Doesn't need flags gy, but they don't hurt
+ if (!NPCG) separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\s)', flags);
+ while (match = separatorCopy.exec(string)) {
+ // `separatorCopy.lastIndex` is not reliable cross-browser
+ lastIndex = match.index + match[0][LENGTH];
+ if (lastIndex > lastLastIndex) {
+ output.push(string.slice(lastLastIndex, match.index));
+ // Fix browsers whose `exec` methods don't consistently return `undefined` for NPCG
+ // eslint-disable-next-line no-loop-func
+ if (!NPCG && match[LENGTH] > 1) match[0].replace(separator2, function () {
+ for (i = 1; i < arguments[LENGTH] - 2; i++) if (arguments[i] === undefined) match[i] = undefined;
+ });
+ if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));
+ lastLength = match[0][LENGTH];
+ lastLastIndex = lastIndex;
+ if (output[LENGTH] >= splitLimit) break;
+ }
+ if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop
+ }
+ if (lastLastIndex === string[LENGTH]) {
+ if (lastLength || !separatorCopy.test('')) output.push('');
+ } else output.push(string.slice(lastLastIndex));
+ return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;
+ };
+ // Chakra, V8
+ } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {
+ $split = function (separator, limit) {
+ return separator === undefined && limit === 0 ? [] : _split.call(this, separator, limit);
+ };
+ }
+ // 21.1.3.17 String.prototype.split(separator, limit)
+ return [function split(separator, limit) {
+ var O = defined(this);
+ var fn = separator == undefined ? undefined : separator[SPLIT];
+ return fn !== undefined ? fn.call(separator, O, limit) : $split.call(String(O), separator, limit);
+ }, $split];
+});
+
+
+/***/ }),
+/* 237 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var LIBRARY = __webpack_require__(30);
+var global = __webpack_require__(2);
+var ctx = __webpack_require__(19);
+var classof = __webpack_require__(48);
+var $export = __webpack_require__(0);
+var isObject = __webpack_require__(4);
+var aFunction = __webpack_require__(10);
+var anInstance = __webpack_require__(39);
+var forOf = __webpack_require__(40);
+var speciesConstructor = __webpack_require__(57);
+var task = __webpack_require__(86).set;
+var microtask = __webpack_require__(87)();
+var newPromiseCapabilityModule = __webpack_require__(88);
+var perform = __webpack_require__(110);
+var userAgent = __webpack_require__(58);
+var promiseResolve = __webpack_require__(111);
+var PROMISE = 'Promise';
+var TypeError = global.TypeError;
+var process = global.process;
+var versions = process && process.versions;
+var v8 = versions && versions.v8 || '';
+var $Promise = global[PROMISE];
+var isNode = classof(process) == 'process';
+var empty = function () { /* empty */ };
+var Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;
+var newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;
+
+var USE_NATIVE = !!function () {
+ try {
+ // correct subclassing with @@species support
+ var promise = $Promise.resolve(1);
+ var FakePromise = (promise.constructor = {})[__webpack_require__(5)('species')] = function (exec) {
+ exec(empty, empty);
+ };
+ // unhandled rejections tracking support, NodeJS Promise without it fails @@species test
+ return (isNode || typeof PromiseRejectionEvent == 'function')
+ && promise.then(empty) instanceof FakePromise
+ // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables
+ // https://bugs.chromium.org/p/chromium/issues/detail?id=830565
+ // we can't detect it synchronously, so just check versions
+ && v8.indexOf('6.6') !== 0
+ && userAgent.indexOf('Chrome/66') === -1;
+ } catch (e) { /* empty */ }
+}();
+
+// helpers
+var isThenable = function (it) {
+ var then;
+ return isObject(it) && typeof (then = it.then) == 'function' ? then : false;
+};
+var notify = function (promise, isReject) {
+ if (promise._n) return;
+ promise._n = true;
+ var chain = promise._c;
+ microtask(function () {
+ var value = promise._v;
+ var ok = promise._s == 1;
+ var i = 0;
+ var run = function (reaction) {
+ var handler = ok ? reaction.ok : reaction.fail;
+ var resolve = reaction.resolve;
+ var reject = reaction.reject;
+ var domain = reaction.domain;
+ var result, then, exited;
+ try {
+ if (handler) {
+ if (!ok) {
+ if (promise._h == 2) onHandleUnhandled(promise);
+ promise._h = 1;
+ }
+ if (handler === true) result = value;
+ else {
+ if (domain) domain.enter();
+ result = handler(value); // may throw
+ if (domain) {
+ domain.exit();
+ exited = true;
+ }
+ }
+ if (result === reaction.promise) {
+ reject(TypeError('Promise-chain cycle'));
+ } else if (then = isThenable(result)) {
+ then.call(result, resolve, reject);
+ } else resolve(result);
+ } else reject(value);
+ } catch (e) {
+ if (domain && !exited) domain.exit();
+ reject(e);
+ }
+ };
+ while (chain.length > i) run(chain[i++]); // variable length - can't use forEach
+ promise._c = [];
+ promise._n = false;
+ if (isReject && !promise._h) onUnhandled(promise);
+ });
+};
+var onUnhandled = function (promise) {
+ task.call(global, function () {
+ var value = promise._v;
+ var unhandled = isUnhandled(promise);
+ var result, handler, console;
+ if (unhandled) {
+ result = perform(function () {
+ if (isNode) {
+ process.emit('unhandledRejection', value, promise);
+ } else if (handler = global.onunhandledrejection) {
+ handler({ promise: promise, reason: value });
+ } else if ((console = global.console) && console.error) {
+ console.error('Unhandled promise rejection', value);
+ }
+ });
+ // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should
+ promise._h = isNode || isUnhandled(promise) ? 2 : 1;
+ } promise._a = undefined;
+ if (unhandled && result.e) throw result.v;
+ });
+};
+var isUnhandled = function (promise) {
+ return promise._h !== 1 && (promise._a || promise._c).length === 0;
+};
+var onHandleUnhandled = function (promise) {
+ task.call(global, function () {
+ var handler;
+ if (isNode) {
+ process.emit('rejectionHandled', promise);
+ } else if (handler = global.onrejectionhandled) {
+ handler({ promise: promise, reason: promise._v });
+ }
+ });
+};
+var $reject = function (value) {
+ var promise = this;
+ if (promise._d) return;
+ promise._d = true;
+ promise = promise._w || promise; // unwrap
+ promise._v = value;
+ promise._s = 2;
+ if (!promise._a) promise._a = promise._c.slice();
+ notify(promise, true);
+};
+var $resolve = function (value) {
+ var promise = this;
+ var then;
+ if (promise._d) return;
+ promise._d = true;
+ promise = promise._w || promise; // unwrap
+ try {
+ if (promise === value) throw TypeError("Promise can't be resolved itself");
+ if (then = isThenable(value)) {
+ microtask(function () {
+ var wrapper = { _w: promise, _d: false }; // wrap
+ try {
+ then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));
+ } catch (e) {
+ $reject.call(wrapper, e);
+ }
+ });
+ } else {
+ promise._v = value;
+ promise._s = 1;
+ notify(promise, false);
+ }
+ } catch (e) {
+ $reject.call({ _w: promise, _d: false }, e); // wrap
+ }
+};
+
+// constructor polyfill
+if (!USE_NATIVE) {
+ // 25.4.3.1 Promise(executor)
+ $Promise = function Promise(executor) {
+ anInstance(this, $Promise, PROMISE, '_h');
+ aFunction(executor);
+ Internal.call(this);
+ try {
+ executor(ctx($resolve, this, 1), ctx($reject, this, 1));
+ } catch (err) {
+ $reject.call(this, err);
+ }
+ };
+ // eslint-disable-next-line no-unused-vars
+ Internal = function Promise(executor) {
+ this._c = []; // <- awaiting reactions
+ this._a = undefined; // <- checked in isUnhandled reactions
+ this._s = 0; // <- state
+ this._d = false; // <- done
+ this._v = undefined; // <- value
+ this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled
+ this._n = false; // <- notify
+ };
+ Internal.prototype = __webpack_require__(41)($Promise.prototype, {
+ // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)
+ then: function then(onFulfilled, onRejected) {
+ var reaction = newPromiseCapability(speciesConstructor(this, $Promise));
+ reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;
+ reaction.fail = typeof onRejected == 'function' && onRejected;
+ reaction.domain = isNode ? process.domain : undefined;
+ this._c.push(reaction);
+ if (this._a) this._a.push(reaction);
+ if (this._s) notify(this, false);
+ return reaction.promise;
+ },
+ // 25.4.5.1 Promise.prototype.catch(onRejected)
+ 'catch': function (onRejected) {
+ return this.then(undefined, onRejected);
+ }
+ });
+ OwnPromiseCapability = function () {
+ var promise = new Internal();
+ this.promise = promise;
+ this.resolve = ctx($resolve, promise, 1);
+ this.reject = ctx($reject, promise, 1);
+ };
+ newPromiseCapabilityModule.f = newPromiseCapability = function (C) {
+ return C === $Promise || C === Wrapper
+ ? new OwnPromiseCapability(C)
+ : newGenericPromiseCapability(C);
+ };
+}
+
+$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise });
+__webpack_require__(42)($Promise, PROMISE);
+__webpack_require__(38)(PROMISE);
+Wrapper = __webpack_require__(18)[PROMISE];
+
+// statics
+$export($export.S + $export.F * !USE_NATIVE, PROMISE, {
+ // 25.4.4.5 Promise.reject(r)
+ reject: function reject(r) {
+ var capability = newPromiseCapability(this);
+ var $$reject = capability.reject;
+ $$reject(r);
+ return capability.promise;
+ }
+});
+$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {
+ // 25.4.4.6 Promise.resolve(x)
+ resolve: function resolve(x) {
+ return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);
+ }
+});
+$export($export.S + $export.F * !(USE_NATIVE && __webpack_require__(54)(function (iter) {
+ $Promise.all(iter)['catch'](empty);
+})), PROMISE, {
+ // 25.4.4.1 Promise.all(iterable)
+ all: function all(iterable) {
+ var C = this;
+ var capability = newPromiseCapability(C);
+ var resolve = capability.resolve;
+ var reject = capability.reject;
+ var result = perform(function () {
+ var values = [];
+ var index = 0;
+ var remaining = 1;
+ forOf(iterable, false, function (promise) {
+ var $index = index++;
+ var alreadyCalled = false;
+ values.push(undefined);
+ remaining++;
+ C.resolve(promise).then(function (value) {
+ if (alreadyCalled) return;
+ alreadyCalled = true;
+ values[$index] = value;
+ --remaining || resolve(values);
+ }, reject);
+ });
+ --remaining || resolve(values);
+ });
+ if (result.e) reject(result.v);
+ return capability.promise;
+ },
+ // 25.4.4.4 Promise.race(iterable)
+ race: function race(iterable) {
+ var C = this;
+ var capability = newPromiseCapability(C);
+ var reject = capability.reject;
+ var result = perform(function () {
+ forOf(iterable, false, function (promise) {
+ C.resolve(promise).then(capability.resolve, reject);
+ });
+ });
+ if (result.e) reject(result.v);
+ return capability.promise;
+ }
+});
+
+
+/***/ }),
+/* 238 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var weak = __webpack_require__(116);
+var validate = __webpack_require__(45);
+var WEAK_SET = 'WeakSet';
+
+// 23.4 WeakSet Objects
+__webpack_require__(59)(WEAK_SET, function (get) {
+ return function WeakSet() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };
+}, {
+ // 23.4.3.1 WeakSet.prototype.add(value)
+ add: function add(value) {
+ return weak.def(validate(this, WEAK_SET), value, true);
+ }
+}, weak, false, true);
+
+
+/***/ }),
+/* 239 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $export = __webpack_require__(0);
+var $typed = __webpack_require__(60);
+var buffer = __webpack_require__(89);
+var anObject = __webpack_require__(1);
+var toAbsoluteIndex = __webpack_require__(35);
+var toLength = __webpack_require__(8);
+var isObject = __webpack_require__(4);
+var ArrayBuffer = __webpack_require__(2).ArrayBuffer;
+var speciesConstructor = __webpack_require__(57);
+var $ArrayBuffer = buffer.ArrayBuffer;
+var $DataView = buffer.DataView;
+var $isView = $typed.ABV && ArrayBuffer.isView;
+var $slice = $ArrayBuffer.prototype.slice;
+var VIEW = $typed.VIEW;
+var ARRAY_BUFFER = 'ArrayBuffer';
+
+$export($export.G + $export.W + $export.F * (ArrayBuffer !== $ArrayBuffer), { ArrayBuffer: $ArrayBuffer });
+
+$export($export.S + $export.F * !$typed.CONSTR, ARRAY_BUFFER, {
+ // 24.1.3.1 ArrayBuffer.isView(arg)
+ isView: function isView(it) {
+ return $isView && $isView(it) || isObject(it) && VIEW in it;
+ }
+});
+
+$export($export.P + $export.U + $export.F * __webpack_require__(3)(function () {
+ return !new $ArrayBuffer(2).slice(1, undefined).byteLength;
+}), ARRAY_BUFFER, {
+ // 24.1.4.3 ArrayBuffer.prototype.slice(start, end)
+ slice: function slice(start, end) {
+ if ($slice !== undefined && end === undefined) return $slice.call(anObject(this), start); // FF fix
+ var len = anObject(this).byteLength;
+ var first = toAbsoluteIndex(start, len);
+ var fin = toAbsoluteIndex(end === undefined ? len : end, len);
+ var result = new (speciesConstructor(this, $ArrayBuffer))(toLength(fin - first));
+ var viewS = new $DataView(this);
+ var viewT = new $DataView(result);
+ var index = 0;
+ while (first < fin) {
+ viewT.setUint8(index++, viewS.getUint8(first++));
+ } return result;
+ }
+});
+
+__webpack_require__(38)(ARRAY_BUFFER);
+
+
+/***/ }),
+/* 240 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $export = __webpack_require__(0);
+$export($export.G + $export.W + $export.F * !__webpack_require__(60).ABV, {
+ DataView: __webpack_require__(89).DataView
+});
+
+
+/***/ }),
+/* 241 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(27)('Int8', 1, function (init) {
+ return function Int8Array(data, byteOffset, length) {
+ return init(this, data, byteOffset, length);
+ };
+});
+
+
+/***/ }),
+/* 242 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(27)('Uint8', 1, function (init) {
+ return function Uint8Array(data, byteOffset, length) {
+ return init(this, data, byteOffset, length);
+ };
+});
+
+
+/***/ }),
+/* 243 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(27)('Uint8', 1, function (init) {
+ return function Uint8ClampedArray(data, byteOffset, length) {
+ return init(this, data, byteOffset, length);
+ };
+}, true);
+
+
+/***/ }),
+/* 244 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(27)('Int16', 2, function (init) {
+ return function Int16Array(data, byteOffset, length) {
+ return init(this, data, byteOffset, length);
+ };
+});
+
+
+/***/ }),
+/* 245 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(27)('Uint16', 2, function (init) {
+ return function Uint16Array(data, byteOffset, length) {
+ return init(this, data, byteOffset, length);
+ };
+});
+
+
+/***/ }),
+/* 246 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(27)('Int32', 4, function (init) {
+ return function Int32Array(data, byteOffset, length) {
+ return init(this, data, byteOffset, length);
+ };
+});
+
+
+/***/ }),
+/* 247 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(27)('Uint32', 4, function (init) {
+ return function Uint32Array(data, byteOffset, length) {
+ return init(this, data, byteOffset, length);
+ };
+});
+
+
+/***/ }),
+/* 248 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(27)('Float32', 4, function (init) {
+ return function Float32Array(data, byteOffset, length) {
+ return init(this, data, byteOffset, length);
+ };
+});
+
+
+/***/ }),
+/* 249 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(27)('Float64', 8, function (init) {
+ return function Float64Array(data, byteOffset, length) {
+ return init(this, data, byteOffset, length);
+ };
+});
+
+
+/***/ }),
+/* 250 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 26.1.1 Reflect.apply(target, thisArgument, argumentsList)
+var $export = __webpack_require__(0);
+var aFunction = __webpack_require__(10);
+var anObject = __webpack_require__(1);
+var rApply = (__webpack_require__(2).Reflect || {}).apply;
+var fApply = Function.apply;
+// MS Edge argumentsList argument is optional
+$export($export.S + $export.F * !__webpack_require__(3)(function () {
+ rApply(function () { /* empty */ });
+}), 'Reflect', {
+ apply: function apply(target, thisArgument, argumentsList) {
+ var T = aFunction(target);
+ var L = anObject(argumentsList);
+ return rApply ? rApply(T, thisArgument, L) : fApply.call(T, thisArgument, L);
+ }
+});
+
+
+/***/ }),
+/* 251 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 26.1.2 Reflect.construct(target, argumentsList [, newTarget])
+var $export = __webpack_require__(0);
+var create = __webpack_require__(36);
+var aFunction = __webpack_require__(10);
+var anObject = __webpack_require__(1);
+var isObject = __webpack_require__(4);
+var fails = __webpack_require__(3);
+var bind = __webpack_require__(97);
+var rConstruct = (__webpack_require__(2).Reflect || {}).construct;
+
+// MS Edge supports only 2 arguments and argumentsList argument is optional
+// FF Nightly sets third argument as `new.target`, but does not create `this` from it
+var NEW_TARGET_BUG = fails(function () {
+ function F() { /* empty */ }
+ return !(rConstruct(function () { /* empty */ }, [], F) instanceof F);
+});
+var ARGS_BUG = !fails(function () {
+ rConstruct(function () { /* empty */ });
+});
+
+$export($export.S + $export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', {
+ construct: function construct(Target, args /* , newTarget */) {
+ aFunction(Target);
+ anObject(args);
+ var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]);
+ if (ARGS_BUG && !NEW_TARGET_BUG) return rConstruct(Target, args, newTarget);
+ if (Target == newTarget) {
+ // w/o altered newTarget, optimization for 0-4 arguments
+ switch (args.length) {
+ case 0: return new Target();
+ case 1: return new Target(args[0]);
+ case 2: return new Target(args[0], args[1]);
+ case 3: return new Target(args[0], args[1], args[2]);
+ case 4: return new Target(args[0], args[1], args[2], args[3]);
+ }
+ // w/o altered newTarget, lot of arguments case
+ var $args = [null];
+ $args.push.apply($args, args);
+ return new (bind.apply(Target, $args))();
+ }
+ // with altered newTarget, not support built-in constructors
+ var proto = newTarget.prototype;
+ var instance = create(isObject(proto) ? proto : Object.prototype);
+ var result = Function.apply.call(Target, instance, args);
+ return isObject(result) ? result : instance;
+ }
+});
+
+
+/***/ }),
+/* 252 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 26.1.3 Reflect.defineProperty(target, propertyKey, attributes)
+var dP = __webpack_require__(7);
+var $export = __webpack_require__(0);
+var anObject = __webpack_require__(1);
+var toPrimitive = __webpack_require__(22);
+
+// MS Edge has broken Reflect.defineProperty - throwing instead of returning false
+$export($export.S + $export.F * __webpack_require__(3)(function () {
+ // eslint-disable-next-line no-undef
+ Reflect.defineProperty(dP.f({}, 1, { value: 1 }), 1, { value: 2 });
+}), 'Reflect', {
+ defineProperty: function defineProperty(target, propertyKey, attributes) {
+ anObject(target);
+ propertyKey = toPrimitive(propertyKey, true);
+ anObject(attributes);
+ try {
+ dP.f(target, propertyKey, attributes);
+ return true;
+ } catch (e) {
+ return false;
+ }
+ }
+});
+
+
+/***/ }),
+/* 253 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 26.1.4 Reflect.deleteProperty(target, propertyKey)
+var $export = __webpack_require__(0);
+var gOPD = __webpack_require__(16).f;
+var anObject = __webpack_require__(1);
+
+$export($export.S, 'Reflect', {
+ deleteProperty: function deleteProperty(target, propertyKey) {
+ var desc = gOPD(anObject(target), propertyKey);
+ return desc && !desc.configurable ? false : delete target[propertyKey];
+ }
+});
+
+
+/***/ }),
+/* 254 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// 26.1.5 Reflect.enumerate(target)
+var $export = __webpack_require__(0);
+var anObject = __webpack_require__(1);
+var Enumerate = function (iterated) {
+ this._t = anObject(iterated); // target
+ this._i = 0; // next index
+ var keys = this._k = []; // keys
+ var key;
+ for (key in iterated) keys.push(key);
+};
+__webpack_require__(77)(Enumerate, 'Object', function () {
+ var that = this;
+ var keys = that._k;
+ var key;
+ do {
+ if (that._i >= keys.length) return { value: undefined, done: true };
+ } while (!((key = keys[that._i++]) in that._t));
+ return { value: key, done: false };
+});
+
+$export($export.S, 'Reflect', {
+ enumerate: function enumerate(target) {
+ return new Enumerate(target);
+ }
+});
+
+
+/***/ }),
+/* 255 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 26.1.6 Reflect.get(target, propertyKey [, receiver])
+var gOPD = __webpack_require__(16);
+var getPrototypeOf = __webpack_require__(17);
+var has = __webpack_require__(14);
+var $export = __webpack_require__(0);
+var isObject = __webpack_require__(4);
+var anObject = __webpack_require__(1);
+
+function get(target, propertyKey /* , receiver */) {
+ var receiver = arguments.length < 3 ? target : arguments[2];
+ var desc, proto;
+ if (anObject(target) === receiver) return target[propertyKey];
+ if (desc = gOPD.f(target, propertyKey)) return has(desc, 'value')
+ ? desc.value
+ : desc.get !== undefined
+ ? desc.get.call(receiver)
+ : undefined;
+ if (isObject(proto = getPrototypeOf(target))) return get(proto, propertyKey, receiver);
+}
+
+$export($export.S, 'Reflect', { get: get });
+
+
+/***/ }),
+/* 256 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey)
+var gOPD = __webpack_require__(16);
+var $export = __webpack_require__(0);
+var anObject = __webpack_require__(1);
+
+$export($export.S, 'Reflect', {
+ getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey) {
+ return gOPD.f(anObject(target), propertyKey);
+ }
+});
+
+
+/***/ }),
+/* 257 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 26.1.8 Reflect.getPrototypeOf(target)
+var $export = __webpack_require__(0);
+var getProto = __webpack_require__(17);
+var anObject = __webpack_require__(1);
+
+$export($export.S, 'Reflect', {
+ getPrototypeOf: function getPrototypeOf(target) {
+ return getProto(anObject(target));
+ }
+});
+
+
+/***/ }),
+/* 258 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 26.1.9 Reflect.has(target, propertyKey)
+var $export = __webpack_require__(0);
+
+$export($export.S, 'Reflect', {
+ has: function has(target, propertyKey) {
+ return propertyKey in target;
+ }
+});
+
+
+/***/ }),
+/* 259 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 26.1.10 Reflect.isExtensible(target)
+var $export = __webpack_require__(0);
+var anObject = __webpack_require__(1);
+var $isExtensible = Object.isExtensible;
+
+$export($export.S, 'Reflect', {
+ isExtensible: function isExtensible(target) {
+ anObject(target);
+ return $isExtensible ? $isExtensible(target) : true;
+ }
+});
+
+
+/***/ }),
+/* 260 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 26.1.11 Reflect.ownKeys(target)
+var $export = __webpack_require__(0);
+
+$export($export.S, 'Reflect', { ownKeys: __webpack_require__(118) });
+
+
+/***/ }),
+/* 261 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 26.1.12 Reflect.preventExtensions(target)
+var $export = __webpack_require__(0);
+var anObject = __webpack_require__(1);
+var $preventExtensions = Object.preventExtensions;
+
+$export($export.S, 'Reflect', {
+ preventExtensions: function preventExtensions(target) {
+ anObject(target);
+ try {
+ if ($preventExtensions) $preventExtensions(target);
+ return true;
+ } catch (e) {
+ return false;
+ }
+ }
+});
+
+
+/***/ }),
+/* 262 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 26.1.13 Reflect.set(target, propertyKey, V [, receiver])
+var dP = __webpack_require__(7);
+var gOPD = __webpack_require__(16);
+var getPrototypeOf = __webpack_require__(17);
+var has = __webpack_require__(14);
+var $export = __webpack_require__(0);
+var createDesc = __webpack_require__(32);
+var anObject = __webpack_require__(1);
+var isObject = __webpack_require__(4);
+
+function set(target, propertyKey, V /* , receiver */) {
+ var receiver = arguments.length < 4 ? target : arguments[3];
+ var ownDesc = gOPD.f(anObject(target), propertyKey);
+ var existingDescriptor, proto;
+ if (!ownDesc) {
+ if (isObject(proto = getPrototypeOf(target))) {
+ return set(proto, propertyKey, V, receiver);
+ }
+ ownDesc = createDesc(0);
+ }
+ if (has(ownDesc, 'value')) {
+ if (ownDesc.writable === false || !isObject(receiver)) return false;
+ if (existingDescriptor = gOPD.f(receiver, propertyKey)) {
+ if (existingDescriptor.get || existingDescriptor.set || existingDescriptor.writable === false) return false;
+ existingDescriptor.value = V;
+ dP.f(receiver, propertyKey, existingDescriptor);
+ } else dP.f(receiver, propertyKey, createDesc(0, V));
+ return true;
+ }
+ return ownDesc.set === undefined ? false : (ownDesc.set.call(receiver, V), true);
+}
+
+$export($export.S, 'Reflect', { set: set });
+
+
+/***/ }),
+/* 263 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// 26.1.14 Reflect.setPrototypeOf(target, proto)
+var $export = __webpack_require__(0);
+var setProto = __webpack_require__(69);
+
+if (setProto) $export($export.S, 'Reflect', {
+ setPrototypeOf: function setPrototypeOf(target, proto) {
+ setProto.check(target, proto);
+ try {
+ setProto.set(target, proto);
+ return true;
+ } catch (e) {
+ return false;
+ }
+ }
+});
+
+
+/***/ }),
+/* 264 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// https://github.com/tc39/Array.prototype.includes
+var $export = __webpack_require__(0);
+var $includes = __webpack_require__(50)(true);
+
+$export($export.P, 'Array', {
+ includes: function includes(el /* , fromIndex = 0 */) {
+ return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);
+ }
+});
+
+__webpack_require__(31)('includes');
+
+
+/***/ }),
+/* 265 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// https://tc39.github.io/proposal-flatMap/#sec-Array.prototype.flatMap
+var $export = __webpack_require__(0);
+var flattenIntoArray = __webpack_require__(119);
+var toObject = __webpack_require__(9);
+var toLength = __webpack_require__(8);
+var aFunction = __webpack_require__(10);
+var arraySpeciesCreate = __webpack_require__(83);
+
+$export($export.P, 'Array', {
+ flatMap: function flatMap(callbackfn /* , thisArg */) {
+ var O = toObject(this);
+ var sourceLen, A;
+ aFunction(callbackfn);
+ sourceLen = toLength(O.length);
+ A = arraySpeciesCreate(O, 0);
+ flattenIntoArray(A, O, O, sourceLen, 0, 1, callbackfn, arguments[1]);
+ return A;
+ }
+});
+
+__webpack_require__(31)('flatMap');
+
+
+/***/ }),
+/* 266 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// https://tc39.github.io/proposal-flatMap/#sec-Array.prototype.flatten
+var $export = __webpack_require__(0);
+var flattenIntoArray = __webpack_require__(119);
+var toObject = __webpack_require__(9);
+var toLength = __webpack_require__(8);
+var toInteger = __webpack_require__(24);
+var arraySpeciesCreate = __webpack_require__(83);
+
+$export($export.P, 'Array', {
+ flatten: function flatten(/* depthArg = 1 */) {
+ var depthArg = arguments[0];
+ var O = toObject(this);
+ var sourceLen = toLength(O.length);
+ var A = arraySpeciesCreate(O, 0);
+ flattenIntoArray(A, O, O, sourceLen, 0, depthArg === undefined ? 1 : toInteger(depthArg));
+ return A;
+ }
+});
+
+__webpack_require__(31)('flatten');
+
+
+/***/ }),
+/* 267 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// https://github.com/mathiasbynens/String.prototype.at
+var $export = __webpack_require__(0);
+var $at = __webpack_require__(75)(true);
+
+$export($export.P, 'String', {
+ at: function at(pos) {
+ return $at(this, pos);
+ }
+});
+
+
+/***/ }),
+/* 268 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// https://github.com/tc39/proposal-string-pad-start-end
+var $export = __webpack_require__(0);
+var $pad = __webpack_require__(120);
+var userAgent = __webpack_require__(58);
+
+// https://github.com/zloirock/core-js/issues/280
+$export($export.P + $export.F * /Version\/10\.\d+(\.\d+)? Safari\//.test(userAgent), 'String', {
+ padStart: function padStart(maxLength /* , fillString = ' ' */) {
+ return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);
+ }
+});
+
+
+/***/ }),
+/* 269 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// https://github.com/tc39/proposal-string-pad-start-end
+var $export = __webpack_require__(0);
+var $pad = __webpack_require__(120);
+var userAgent = __webpack_require__(58);
+
+// https://github.com/zloirock/core-js/issues/280
+$export($export.P + $export.F * /Version\/10\.\d+(\.\d+)? Safari\//.test(userAgent), 'String', {
+ padEnd: function padEnd(maxLength /* , fillString = ' ' */) {
+ return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);
+ }
+});
+
+
+/***/ }),
+/* 270 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// https://github.com/sebmarkbage/ecmascript-string-left-right-trim
+__webpack_require__(43)('trimLeft', function ($trim) {
+ return function trimLeft() {
+ return $trim(this, 1);
+ };
+}, 'trimStart');
+
+
+/***/ }),
+/* 271 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// https://github.com/sebmarkbage/ecmascript-string-left-right-trim
+__webpack_require__(43)('trimRight', function ($trim) {
+ return function trimRight() {
+ return $trim(this, 2);
+ };
+}, 'trimEnd');
+
+
+/***/ }),
+/* 272 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// https://tc39.github.io/String.prototype.matchAll/
+var $export = __webpack_require__(0);
+var defined = __webpack_require__(23);
+var toLength = __webpack_require__(8);
+var isRegExp = __webpack_require__(53);
+var getFlags = __webpack_require__(55);
+var RegExpProto = RegExp.prototype;
+
+var $RegExpStringIterator = function (regexp, string) {
+ this._r = regexp;
+ this._s = string;
+};
+
+__webpack_require__(77)($RegExpStringIterator, 'RegExp String', function next() {
+ var match = this._r.exec(this._s);
+ return { value: match, done: match === null };
+});
+
+$export($export.P, 'String', {
+ matchAll: function matchAll(regexp) {
+ defined(this);
+ if (!isRegExp(regexp)) throw TypeError(regexp + ' is not a regexp!');
+ var S = String(this);
+ var flags = 'flags' in RegExpProto ? String(regexp.flags) : getFlags.call(regexp);
+ var rx = new RegExp(regexp.source, ~flags.indexOf('g') ? flags : 'g' + flags);
+ rx.lastIndex = toLength(regexp.lastIndex);
+ return new $RegExpStringIterator(rx, S);
+ }
+});
+
+
+/***/ }),
+/* 273 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(65)('asyncIterator');
+
+
+/***/ }),
+/* 274 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(65)('observable');
+
+
+/***/ }),
+/* 275 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// https://github.com/tc39/proposal-object-getownpropertydescriptors
+var $export = __webpack_require__(0);
+var ownKeys = __webpack_require__(118);
+var toIObject = __webpack_require__(15);
+var gOPD = __webpack_require__(16);
+var createProperty = __webpack_require__(81);
+
+$export($export.S, 'Object', {
+ getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {
+ var O = toIObject(object);
+ var getDesc = gOPD.f;
+ var keys = ownKeys(O);
+ var result = {};
+ var i = 0;
+ var key, desc;
+ while (keys.length > i) {
+ desc = getDesc(O, key = keys[i++]);
+ if (desc !== undefined) createProperty(result, key, desc);
+ }
+ return result;
+ }
+});
+
+
+/***/ }),
+/* 276 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// https://github.com/tc39/proposal-object-values-entries
+var $export = __webpack_require__(0);
+var $values = __webpack_require__(121)(false);
+
+$export($export.S, 'Object', {
+ values: function values(it) {
+ return $values(it);
+ }
+});
+
+
+/***/ }),
+/* 277 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// https://github.com/tc39/proposal-object-values-entries
+var $export = __webpack_require__(0);
+var $entries = __webpack_require__(121)(true);
+
+$export($export.S, 'Object', {
+ entries: function entries(it) {
+ return $entries(it);
+ }
+});
+
+
+/***/ }),
+/* 278 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $export = __webpack_require__(0);
+var toObject = __webpack_require__(9);
+var aFunction = __webpack_require__(10);
+var $defineProperty = __webpack_require__(7);
+
+// B.2.2.2 Object.prototype.__defineGetter__(P, getter)
+__webpack_require__(6) && $export($export.P + __webpack_require__(61), 'Object', {
+ __defineGetter__: function __defineGetter__(P, getter) {
+ $defineProperty.f(toObject(this), P, { get: aFunction(getter), enumerable: true, configurable: true });
+ }
+});
+
+
+/***/ }),
+/* 279 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $export = __webpack_require__(0);
+var toObject = __webpack_require__(9);
+var aFunction = __webpack_require__(10);
+var $defineProperty = __webpack_require__(7);
+
+// B.2.2.3 Object.prototype.__defineSetter__(P, setter)
+__webpack_require__(6) && $export($export.P + __webpack_require__(61), 'Object', {
+ __defineSetter__: function __defineSetter__(P, setter) {
+ $defineProperty.f(toObject(this), P, { set: aFunction(setter), enumerable: true, configurable: true });
+ }
+});
+
+
+/***/ }),
+/* 280 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $export = __webpack_require__(0);
+var toObject = __webpack_require__(9);
+var toPrimitive = __webpack_require__(22);
+var getPrototypeOf = __webpack_require__(17);
+var getOwnPropertyDescriptor = __webpack_require__(16).f;
+
+// B.2.2.4 Object.prototype.__lookupGetter__(P)
+__webpack_require__(6) && $export($export.P + __webpack_require__(61), 'Object', {
+ __lookupGetter__: function __lookupGetter__(P) {
+ var O = toObject(this);
+ var K = toPrimitive(P, true);
+ var D;
+ do {
+ if (D = getOwnPropertyDescriptor(O, K)) return D.get;
+ } while (O = getPrototypeOf(O));
+ }
+});
+
+
+/***/ }),
+/* 281 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+var $export = __webpack_require__(0);
+var toObject = __webpack_require__(9);
+var toPrimitive = __webpack_require__(22);
+var getPrototypeOf = __webpack_require__(17);
+var getOwnPropertyDescriptor = __webpack_require__(16).f;
+
+// B.2.2.5 Object.prototype.__lookupSetter__(P)
+__webpack_require__(6) && $export($export.P + __webpack_require__(61), 'Object', {
+ __lookupSetter__: function __lookupSetter__(P) {
+ var O = toObject(this);
+ var K = toPrimitive(P, true);
+ var D;
+ do {
+ if (D = getOwnPropertyDescriptor(O, K)) return D.set;
+ } while (O = getPrototypeOf(O));
+ }
+});
+
+
+/***/ }),
+/* 282 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// https://github.com/DavidBruant/Map-Set.prototype.toJSON
+var $export = __webpack_require__(0);
+
+$export($export.P + $export.R, 'Map', { toJSON: __webpack_require__(122)('Map') });
+
+
+/***/ }),
+/* 283 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// https://github.com/DavidBruant/Map-Set.prototype.toJSON
+var $export = __webpack_require__(0);
+
+$export($export.P + $export.R, 'Set', { toJSON: __webpack_require__(122)('Set') });
+
+
+/***/ }),
+/* 284 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// https://tc39.github.io/proposal-setmap-offrom/#sec-map.of
+__webpack_require__(62)('Map');
+
+
+/***/ }),
+/* 285 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// https://tc39.github.io/proposal-setmap-offrom/#sec-set.of
+__webpack_require__(62)('Set');
+
+
+/***/ }),
+/* 286 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.of
+__webpack_require__(62)('WeakMap');
+
+
+/***/ }),
+/* 287 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// https://tc39.github.io/proposal-setmap-offrom/#sec-weakset.of
+__webpack_require__(62)('WeakSet');
+
+
+/***/ }),
+/* 288 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// https://tc39.github.io/proposal-setmap-offrom/#sec-map.from
+__webpack_require__(63)('Map');
+
+
+/***/ }),
+/* 289 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// https://tc39.github.io/proposal-setmap-offrom/#sec-set.from
+__webpack_require__(63)('Set');
+
+
+/***/ }),
+/* 290 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.from
+__webpack_require__(63)('WeakMap');
+
+
+/***/ }),
+/* 291 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// https://tc39.github.io/proposal-setmap-offrom/#sec-weakset.from
+__webpack_require__(63)('WeakSet');
+
+
+/***/ }),
+/* 292 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// https://github.com/tc39/proposal-global
+var $export = __webpack_require__(0);
+
+$export($export.G, { global: __webpack_require__(2) });
+
+
+/***/ }),
+/* 293 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// https://github.com/tc39/proposal-global
+var $export = __webpack_require__(0);
+
+$export($export.S, 'System', { global: __webpack_require__(2) });
+
+
+/***/ }),
+/* 294 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// https://github.com/ljharb/proposal-is-error
+var $export = __webpack_require__(0);
+var cof = __webpack_require__(20);
+
+$export($export.S, 'Error', {
+ isError: function isError(it) {
+ return cof(it) === 'Error';
+ }
+});
+
+
+/***/ }),
+/* 295 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// https://rwaldron.github.io/proposal-math-extensions/
+var $export = __webpack_require__(0);
+
+$export($export.S, 'Math', {
+ clamp: function clamp(x, lower, upper) {
+ return Math.min(upper, Math.max(lower, x));
+ }
+});
+
+
+/***/ }),
+/* 296 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// https://rwaldron.github.io/proposal-math-extensions/
+var $export = __webpack_require__(0);
+
+$export($export.S, 'Math', { DEG_PER_RAD: Math.PI / 180 });
+
+
+/***/ }),
+/* 297 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// https://rwaldron.github.io/proposal-math-extensions/
+var $export = __webpack_require__(0);
+var RAD_PER_DEG = 180 / Math.PI;
+
+$export($export.S, 'Math', {
+ degrees: function degrees(radians) {
+ return radians * RAD_PER_DEG;
+ }
+});
+
+
+/***/ }),
+/* 298 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// https://rwaldron.github.io/proposal-math-extensions/
+var $export = __webpack_require__(0);
+var scale = __webpack_require__(124);
+var fround = __webpack_require__(104);
+
+$export($export.S, 'Math', {
+ fscale: function fscale(x, inLow, inHigh, outLow, outHigh) {
+ return fround(scale(x, inLow, inHigh, outLow, outHigh));
+ }
+});
+
+
+/***/ }),
+/* 299 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// https://gist.github.com/BrendanEich/4294d5c212a6d2254703
+var $export = __webpack_require__(0);
+
+$export($export.S, 'Math', {
+ iaddh: function iaddh(x0, x1, y0, y1) {
+ var $x0 = x0 >>> 0;
+ var $x1 = x1 >>> 0;
+ var $y0 = y0 >>> 0;
+ return $x1 + (y1 >>> 0) + (($x0 & $y0 | ($x0 | $y0) & ~($x0 + $y0 >>> 0)) >>> 31) | 0;
+ }
+});
+
+
+/***/ }),
+/* 300 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// https://gist.github.com/BrendanEich/4294d5c212a6d2254703
+var $export = __webpack_require__(0);
+
+$export($export.S, 'Math', {
+ isubh: function isubh(x0, x1, y0, y1) {
+ var $x0 = x0 >>> 0;
+ var $x1 = x1 >>> 0;
+ var $y0 = y0 >>> 0;
+ return $x1 - (y1 >>> 0) - ((~$x0 & $y0 | ~($x0 ^ $y0) & $x0 - $y0 >>> 0) >>> 31) | 0;
+ }
+});
+
+
+/***/ }),
+/* 301 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// https://gist.github.com/BrendanEich/4294d5c212a6d2254703
+var $export = __webpack_require__(0);
+
+$export($export.S, 'Math', {
+ imulh: function imulh(u, v) {
+ var UINT16 = 0xffff;
+ var $u = +u;
+ var $v = +v;
+ var u0 = $u & UINT16;
+ var v0 = $v & UINT16;
+ var u1 = $u >> 16;
+ var v1 = $v >> 16;
+ var t = (u1 * v0 >>> 0) + (u0 * v0 >>> 16);
+ return u1 * v1 + (t >> 16) + ((u0 * v1 >>> 0) + (t & UINT16) >> 16);
+ }
+});
+
+
+/***/ }),
+/* 302 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// https://rwaldron.github.io/proposal-math-extensions/
+var $export = __webpack_require__(0);
+
+$export($export.S, 'Math', { RAD_PER_DEG: 180 / Math.PI });
+
+
+/***/ }),
+/* 303 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// https://rwaldron.github.io/proposal-math-extensions/
+var $export = __webpack_require__(0);
+var DEG_PER_RAD = Math.PI / 180;
+
+$export($export.S, 'Math', {
+ radians: function radians(degrees) {
+ return degrees * DEG_PER_RAD;
+ }
+});
+
+
+/***/ }),
+/* 304 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// https://rwaldron.github.io/proposal-math-extensions/
+var $export = __webpack_require__(0);
+
+$export($export.S, 'Math', { scale: __webpack_require__(124) });
+
+
+/***/ }),
+/* 305 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// https://gist.github.com/BrendanEich/4294d5c212a6d2254703
+var $export = __webpack_require__(0);
+
+$export($export.S, 'Math', {
+ umulh: function umulh(u, v) {
+ var UINT16 = 0xffff;
+ var $u = +u;
+ var $v = +v;
+ var u0 = $u & UINT16;
+ var v0 = $v & UINT16;
+ var u1 = $u >>> 16;
+ var v1 = $v >>> 16;
+ var t = (u1 * v0 >>> 0) + (u0 * v0 >>> 16);
+ return u1 * v1 + (t >>> 16) + ((u0 * v1 >>> 0) + (t & UINT16) >>> 16);
+ }
+});
+
+
+/***/ }),
+/* 306 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// http://jfbastien.github.io/papers/Math.signbit.html
+var $export = __webpack_require__(0);
+
+$export($export.S, 'Math', { signbit: function signbit(x) {
+ // eslint-disable-next-line no-self-compare
+ return (x = +x) != x ? x : x == 0 ? 1 / x == Infinity : x > 0;
+} });
+
+
+/***/ }),
+/* 307 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+// https://github.com/tc39/proposal-promise-finally
+
+var $export = __webpack_require__(0);
+var core = __webpack_require__(18);
+var global = __webpack_require__(2);
+var speciesConstructor = __webpack_require__(57);
+var promiseResolve = __webpack_require__(111);
+
+$export($export.P + $export.R, 'Promise', { 'finally': function (onFinally) {
+ var C = speciesConstructor(this, core.Promise || global.Promise);
+ var isFunction = typeof onFinally == 'function';
+ return this.then(
+ isFunction ? function (x) {
+ return promiseResolve(C, onFinally()).then(function () { return x; });
+ } : onFinally,
+ isFunction ? function (e) {
+ return promiseResolve(C, onFinally()).then(function () { throw e; });
+ } : onFinally
+ );
+} });
+
+
+/***/ }),
+/* 308 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// https://github.com/tc39/proposal-promise-try
+var $export = __webpack_require__(0);
+var newPromiseCapability = __webpack_require__(88);
+var perform = __webpack_require__(110);
+
+$export($export.S, 'Promise', { 'try': function (callbackfn) {
+ var promiseCapability = newPromiseCapability.f(this);
+ var result = perform(callbackfn);
+ (result.e ? promiseCapability.reject : promiseCapability.resolve)(result.v);
+ return promiseCapability.promise;
+} });
+
+
+/***/ }),
+/* 309 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var metadata = __webpack_require__(28);
+var anObject = __webpack_require__(1);
+var toMetaKey = metadata.key;
+var ordinaryDefineOwnMetadata = metadata.set;
+
+metadata.exp({ defineMetadata: function defineMetadata(metadataKey, metadataValue, target, targetKey) {
+ ordinaryDefineOwnMetadata(metadataKey, metadataValue, anObject(target), toMetaKey(targetKey));
+} });
+
+
+/***/ }),
+/* 310 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var metadata = __webpack_require__(28);
+var anObject = __webpack_require__(1);
+var toMetaKey = metadata.key;
+var getOrCreateMetadataMap = metadata.map;
+var store = metadata.store;
+
+metadata.exp({ deleteMetadata: function deleteMetadata(metadataKey, target /* , targetKey */) {
+ var targetKey = arguments.length < 3 ? undefined : toMetaKey(arguments[2]);
+ var metadataMap = getOrCreateMetadataMap(anObject(target), targetKey, false);
+ if (metadataMap === undefined || !metadataMap['delete'](metadataKey)) return false;
+ if (metadataMap.size) return true;
+ var targetMetadata = store.get(target);
+ targetMetadata['delete'](targetKey);
+ return !!targetMetadata.size || store['delete'](target);
+} });
+
+
+/***/ }),
+/* 311 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var metadata = __webpack_require__(28);
+var anObject = __webpack_require__(1);
+var getPrototypeOf = __webpack_require__(17);
+var ordinaryHasOwnMetadata = metadata.has;
+var ordinaryGetOwnMetadata = metadata.get;
+var toMetaKey = metadata.key;
+
+var ordinaryGetMetadata = function (MetadataKey, O, P) {
+ var hasOwn = ordinaryHasOwnMetadata(MetadataKey, O, P);
+ if (hasOwn) return ordinaryGetOwnMetadata(MetadataKey, O, P);
+ var parent = getPrototypeOf(O);
+ return parent !== null ? ordinaryGetMetadata(MetadataKey, parent, P) : undefined;
+};
+
+metadata.exp({ getMetadata: function getMetadata(metadataKey, target /* , targetKey */) {
+ return ordinaryGetMetadata(metadataKey, anObject(target), arguments.length < 3 ? undefined : toMetaKey(arguments[2]));
+} });
+
+
+/***/ }),
+/* 312 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var Set = __webpack_require__(114);
+var from = __webpack_require__(123);
+var metadata = __webpack_require__(28);
+var anObject = __webpack_require__(1);
+var getPrototypeOf = __webpack_require__(17);
+var ordinaryOwnMetadataKeys = metadata.keys;
+var toMetaKey = metadata.key;
+
+var ordinaryMetadataKeys = function (O, P) {
+ var oKeys = ordinaryOwnMetadataKeys(O, P);
+ var parent = getPrototypeOf(O);
+ if (parent === null) return oKeys;
+ var pKeys = ordinaryMetadataKeys(parent, P);
+ return pKeys.length ? oKeys.length ? from(new Set(oKeys.concat(pKeys))) : pKeys : oKeys;
+};
+
+metadata.exp({ getMetadataKeys: function getMetadataKeys(target /* , targetKey */) {
+ return ordinaryMetadataKeys(anObject(target), arguments.length < 2 ? undefined : toMetaKey(arguments[1]));
+} });
+
+
+/***/ }),
+/* 313 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var metadata = __webpack_require__(28);
+var anObject = __webpack_require__(1);
+var ordinaryGetOwnMetadata = metadata.get;
+var toMetaKey = metadata.key;
+
+metadata.exp({ getOwnMetadata: function getOwnMetadata(metadataKey, target /* , targetKey */) {
+ return ordinaryGetOwnMetadata(metadataKey, anObject(target)
+ , arguments.length < 3 ? undefined : toMetaKey(arguments[2]));
+} });
+
+
+/***/ }),
+/* 314 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var metadata = __webpack_require__(28);
+var anObject = __webpack_require__(1);
+var ordinaryOwnMetadataKeys = metadata.keys;
+var toMetaKey = metadata.key;
+
+metadata.exp({ getOwnMetadataKeys: function getOwnMetadataKeys(target /* , targetKey */) {
+ return ordinaryOwnMetadataKeys(anObject(target), arguments.length < 2 ? undefined : toMetaKey(arguments[1]));
+} });
+
+
+/***/ }),
+/* 315 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var metadata = __webpack_require__(28);
+var anObject = __webpack_require__(1);
+var getPrototypeOf = __webpack_require__(17);
+var ordinaryHasOwnMetadata = metadata.has;
+var toMetaKey = metadata.key;
+
+var ordinaryHasMetadata = function (MetadataKey, O, P) {
+ var hasOwn = ordinaryHasOwnMetadata(MetadataKey, O, P);
+ if (hasOwn) return true;
+ var parent = getPrototypeOf(O);
+ return parent !== null ? ordinaryHasMetadata(MetadataKey, parent, P) : false;
+};
+
+metadata.exp({ hasMetadata: function hasMetadata(metadataKey, target /* , targetKey */) {
+ return ordinaryHasMetadata(metadataKey, anObject(target), arguments.length < 3 ? undefined : toMetaKey(arguments[2]));
+} });
+
+
+/***/ }),
+/* 316 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var metadata = __webpack_require__(28);
+var anObject = __webpack_require__(1);
+var ordinaryHasOwnMetadata = metadata.has;
+var toMetaKey = metadata.key;
+
+metadata.exp({ hasOwnMetadata: function hasOwnMetadata(metadataKey, target /* , targetKey */) {
+ return ordinaryHasOwnMetadata(metadataKey, anObject(target)
+ , arguments.length < 3 ? undefined : toMetaKey(arguments[2]));
+} });
+
+
+/***/ }),
+/* 317 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $metadata = __webpack_require__(28);
+var anObject = __webpack_require__(1);
+var aFunction = __webpack_require__(10);
+var toMetaKey = $metadata.key;
+var ordinaryDefineOwnMetadata = $metadata.set;
+
+$metadata.exp({ metadata: function metadata(metadataKey, metadataValue) {
+ return function decorator(target, targetKey) {
+ ordinaryDefineOwnMetadata(
+ metadataKey, metadataValue,
+ (targetKey !== undefined ? anObject : aFunction)(target),
+ toMetaKey(targetKey)
+ );
+ };
+} });
+
+
+/***/ }),
+/* 318 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// https://github.com/rwaldron/tc39-notes/blob/master/es6/2014-09/sept-25.md#510-globalasap-for-enqueuing-a-microtask
+var $export = __webpack_require__(0);
+var microtask = __webpack_require__(87)();
+var process = __webpack_require__(2).process;
+var isNode = __webpack_require__(20)(process) == 'process';
+
+$export($export.G, {
+ asap: function asap(fn) {
+ var domain = isNode && process.domain;
+ microtask(domain ? domain.bind(fn) : fn);
+ }
+});
+
+
+/***/ }),
+/* 319 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+// https://github.com/zenparsing/es-observable
+var $export = __webpack_require__(0);
+var global = __webpack_require__(2);
+var core = __webpack_require__(18);
+var microtask = __webpack_require__(87)();
+var OBSERVABLE = __webpack_require__(5)('observable');
+var aFunction = __webpack_require__(10);
+var anObject = __webpack_require__(1);
+var anInstance = __webpack_require__(39);
+var redefineAll = __webpack_require__(41);
+var hide = __webpack_require__(11);
+var forOf = __webpack_require__(40);
+var RETURN = forOf.RETURN;
+
+var getMethod = function (fn) {
+ return fn == null ? undefined : aFunction(fn);
+};
+
+var cleanupSubscription = function (subscription) {
+ var cleanup = subscription._c;
+ if (cleanup) {
+ subscription._c = undefined;
+ cleanup();
+ }
+};
+
+var subscriptionClosed = function (subscription) {
+ return subscription._o === undefined;
+};
+
+var closeSubscription = function (subscription) {
+ if (!subscriptionClosed(subscription)) {
+ subscription._o = undefined;
+ cleanupSubscription(subscription);
+ }
+};
+
+var Subscription = function (observer, subscriber) {
+ anObject(observer);
+ this._c = undefined;
+ this._o = observer;
+ observer = new SubscriptionObserver(this);
+ try {
+ var cleanup = subscriber(observer);
+ var subscription = cleanup;
+ if (cleanup != null) {
+ if (typeof cleanup.unsubscribe === 'function') cleanup = function () { subscription.unsubscribe(); };
+ else aFunction(cleanup);
+ this._c = cleanup;
+ }
+ } catch (e) {
+ observer.error(e);
+ return;
+ } if (subscriptionClosed(this)) cleanupSubscription(this);
+};
+
+Subscription.prototype = redefineAll({}, {
+ unsubscribe: function unsubscribe() { closeSubscription(this); }
+});
+
+var SubscriptionObserver = function (subscription) {
+ this._s = subscription;
+};
+
+SubscriptionObserver.prototype = redefineAll({}, {
+ next: function next(value) {
+ var subscription = this._s;
+ if (!subscriptionClosed(subscription)) {
+ var observer = subscription._o;
+ try {
+ var m = getMethod(observer.next);
+ if (m) return m.call(observer, value);
+ } catch (e) {
+ try {
+ closeSubscription(subscription);
+ } finally {
+ throw e;
+ }
+ }
+ }
+ },
+ error: function error(value) {
+ var subscription = this._s;
+ if (subscriptionClosed(subscription)) throw value;
+ var observer = subscription._o;
+ subscription._o = undefined;
+ try {
+ var m = getMethod(observer.error);
+ if (!m) throw value;
+ value = m.call(observer, value);
+ } catch (e) {
+ try {
+ cleanupSubscription(subscription);
+ } finally {
+ throw e;
+ }
+ } cleanupSubscription(subscription);
+ return value;
+ },
+ complete: function complete(value) {
+ var subscription = this._s;
+ if (!subscriptionClosed(subscription)) {
+ var observer = subscription._o;
+ subscription._o = undefined;
+ try {
+ var m = getMethod(observer.complete);
+ value = m ? m.call(observer, value) : undefined;
+ } catch (e) {
+ try {
+ cleanupSubscription(subscription);
+ } finally {
+ throw e;
+ }
+ } cleanupSubscription(subscription);
+ return value;
+ }
+ }
+});
+
+var $Observable = function Observable(subscriber) {
+ anInstance(this, $Observable, 'Observable', '_f')._f = aFunction(subscriber);
+};
+
+redefineAll($Observable.prototype, {
+ subscribe: function subscribe(observer) {
+ return new Subscription(observer, this._f);
+ },
+ forEach: function forEach(fn) {
+ var that = this;
+ return new (core.Promise || global.Promise)(function (resolve, reject) {
+ aFunction(fn);
+ var subscription = that.subscribe({
+ next: function (value) {
+ try {
+ return fn(value);
+ } catch (e) {
+ reject(e);
+ subscription.unsubscribe();
+ }
+ },
+ error: reject,
+ complete: resolve
+ });
+ });
+ }
+});
+
+redefineAll($Observable, {
+ from: function from(x) {
+ var C = typeof this === 'function' ? this : $Observable;
+ var method = getMethod(anObject(x)[OBSERVABLE]);
+ if (method) {
+ var observable = anObject(method.call(x));
+ return observable.constructor === C ? observable : new C(function (observer) {
+ return observable.subscribe(observer);
+ });
+ }
+ return new C(function (observer) {
+ var done = false;
+ microtask(function () {
+ if (!done) {
+ try {
+ if (forOf(x, false, function (it) {
+ observer.next(it);
+ if (done) return RETURN;
+ }) === RETURN) return;
+ } catch (e) {
+ if (done) throw e;
+ observer.error(e);
+ return;
+ } observer.complete();
+ }
+ });
+ return function () { done = true; };
+ });
+ },
+ of: function of() {
+ for (var i = 0, l = arguments.length, items = new Array(l); i < l;) items[i] = arguments[i++];
+ return new (typeof this === 'function' ? this : $Observable)(function (observer) {
+ var done = false;
+ microtask(function () {
+ if (!done) {
+ for (var j = 0; j < items.length; ++j) {
+ observer.next(items[j]);
+ if (done) return;
+ } observer.complete();
+ }
+ });
+ return function () { done = true; };
+ });
+ }
+});
+
+hide($Observable.prototype, OBSERVABLE, function () { return this; });
+
+$export($export.G, { Observable: $Observable });
+
+__webpack_require__(38)('Observable');
+
+
+/***/ }),
+/* 320 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// ie9- setTimeout & setInterval additional parameters fix
+var global = __webpack_require__(2);
+var $export = __webpack_require__(0);
+var userAgent = __webpack_require__(58);
+var slice = [].slice;
+var MSIE = /MSIE .\./.test(userAgent); // <- dirty ie9- check
+var wrap = function (set) {
+ return function (fn, time /* , ...args */) {
+ var boundArgs = arguments.length > 2;
+ var args = boundArgs ? slice.call(arguments, 2) : false;
+ return set(boundArgs ? function () {
+ // eslint-disable-next-line no-new-func
+ (typeof fn == 'function' ? fn : Function(fn)).apply(this, args);
+ } : fn, time);
+ };
+};
+$export($export.G + $export.B + $export.F * MSIE, {
+ setTimeout: wrap(global.setTimeout),
+ setInterval: wrap(global.setInterval)
+});
+
+
+/***/ }),
+/* 321 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $export = __webpack_require__(0);
+var $task = __webpack_require__(86);
+$export($export.G + $export.B, {
+ setImmediate: $task.set,
+ clearImmediate: $task.clear
+});
+
+
+/***/ }),
+/* 322 */
+/***/ (function(module, exports, __webpack_require__) {
+
+var $iterators = __webpack_require__(85);
+var getKeys = __webpack_require__(34);
+var redefine = __webpack_require__(12);
+var global = __webpack_require__(2);
+var hide = __webpack_require__(11);
+var Iterators = __webpack_require__(44);
+var wks = __webpack_require__(5);
+var ITERATOR = wks('iterator');
+var TO_STRING_TAG = wks('toStringTag');
+var ArrayValues = Iterators.Array;
+
+var DOMIterables = {
+ CSSRuleList: true, // TODO: Not spec compliant, should be false.
+ CSSStyleDeclaration: false,
+ CSSValueList: false,
+ ClientRectList: false,
+ DOMRectList: false,
+ DOMStringList: false,
+ DOMTokenList: true,
+ DataTransferItemList: false,
+ FileList: false,
+ HTMLAllCollection: false,
+ HTMLCollection: false,
+ HTMLFormElement: false,
+ HTMLSelectElement: false,
+ MediaList: true, // TODO: Not spec compliant, should be false.
+ MimeTypeArray: false,
+ NamedNodeMap: false,
+ NodeList: true,
+ PaintRequestList: false,
+ Plugin: false,
+ PluginArray: false,
+ SVGLengthList: false,
+ SVGNumberList: false,
+ SVGPathSegList: false,
+ SVGPointList: false,
+ SVGStringList: false,
+ SVGTransformList: false,
+ SourceBufferList: false,
+ StyleSheetList: true, // TODO: Not spec compliant, should be false.
+ TextTrackCueList: false,
+ TextTrackList: false,
+ TouchList: false
+};
+
+for (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {
+ var NAME = collections[i];
+ var explicit = DOMIterables[NAME];
+ var Collection = global[NAME];
+ var proto = Collection && Collection.prototype;
+ var key;
+ if (proto) {
+ if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);
+ if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);
+ Iterators[NAME] = ArrayValues;
+ if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true);
+ }
+}
+
+
+/***/ }),
+/* 323 */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(global) {/**
+ * Copyright (c) 2014, Facebook, Inc.
+ * All rights reserved.
+ *
+ * This source code is licensed under the BSD-style license found in the
+ * https://raw.github.com/facebook/regenerator/master/LICENSE file. An
+ * additional grant of patent rights can be found in the PATENTS file in
+ * the same directory.
+ */
+
+!(function(global) {
+ "use strict";
+
+ var Op = Object.prototype;
+ var hasOwn = Op.hasOwnProperty;
+ var undefined; // More compressible than void 0.
+ var $Symbol = typeof Symbol === "function" ? Symbol : {};
+ var iteratorSymbol = $Symbol.iterator || "@@iterator";
+ var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
+ var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
+
+ var inModule = typeof module === "object";
+ var runtime = global.regeneratorRuntime;
+ if (runtime) {
+ if (inModule) {
+ // If regeneratorRuntime is defined globally and we're in a module,
+ // make the exports object identical to regeneratorRuntime.
+ module.exports = runtime;
+ }
+ // Don't bother evaluating the rest of this file if the runtime was
+ // already defined globally.
+ return;
+ }
+
+ // Define the runtime globally (as expected by generated code) as either
+ // module.exports (if we're in a module) or a new, empty object.
+ runtime = global.regeneratorRuntime = inModule ? module.exports : {};
+
+ function wrap(innerFn, outerFn, self, tryLocsList) {
+ // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.
+ var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
+ var generator = Object.create(protoGenerator.prototype);
+ var context = new Context(tryLocsList || []);
+
+ // The ._invoke method unifies the implementations of the .next,
+ // .throw, and .return methods.
+ generator._invoke = makeInvokeMethod(innerFn, self, context);
+
+ return generator;
+ }
+ runtime.wrap = wrap;
+
+ // Try/catch helper to minimize deoptimizations. Returns a completion
+ // record like context.tryEntries[i].completion. This interface could
+ // have been (and was previously) designed to take a closure to be
+ // invoked without arguments, but in all the cases we care about we
+ // already have an existing method we want to call, so there's no need
+ // to create a new function object. We can even get away with assuming
+ // the method takes exactly one argument, since that happens to be true
+ // in every case, so we don't have to touch the arguments object. The
+ // only additional allocation required is the completion record, which
+ // has a stable shape and so hopefully should be cheap to allocate.
+ function tryCatch(fn, obj, arg) {
+ try {
+ return { type: "normal", arg: fn.call(obj, arg) };
+ } catch (err) {
+ return { type: "throw", arg: err };
+ }
+ }
+
+ var GenStateSuspendedStart = "suspendedStart";
+ var GenStateSuspendedYield = "suspendedYield";
+ var GenStateExecuting = "executing";
+ var GenStateCompleted = "completed";
+
+ // Returning this object from the innerFn has the same effect as
+ // breaking out of the dispatch switch statement.
+ var ContinueSentinel = {};
+
+ // Dummy constructor functions that we use as the .constructor and
+ // .constructor.prototype properties for functions that return Generator
+ // objects. For full spec compliance, you may wish to configure your
+ // minifier not to mangle the names of these two functions.
+ function Generator() {}
+ function GeneratorFunction() {}
+ function GeneratorFunctionPrototype() {}
+
+ // This is a polyfill for %IteratorPrototype% for environments that
+ // don't natively support it.
+ var IteratorPrototype = {};
+ IteratorPrototype[iteratorSymbol] = function () {
+ return this;
+ };
+
+ var getProto = Object.getPrototypeOf;
+ var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
+ if (NativeIteratorPrototype &&
+ NativeIteratorPrototype !== Op &&
+ hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
+ // This environment has a native %IteratorPrototype%; use it instead
+ // of the polyfill.
+ IteratorPrototype = NativeIteratorPrototype;
+ }
+
+ var Gp = GeneratorFunctionPrototype.prototype =
+ Generator.prototype = Object.create(IteratorPrototype);
+ GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
+ GeneratorFunctionPrototype.constructor = GeneratorFunction;
+ GeneratorFunctionPrototype[toStringTagSymbol] =
+ GeneratorFunction.displayName = "GeneratorFunction";
+
+ // Helper for defining the .next, .throw, and .return methods of the
+ // Iterator interface in terms of a single ._invoke method.
+ function defineIteratorMethods(prototype) {
+ ["next", "throw", "return"].forEach(function(method) {
+ prototype[method] = function(arg) {
+ return this._invoke(method, arg);
+ };
+ });
+ }
+
+ runtime.isGeneratorFunction = function(genFun) {
+ var ctor = typeof genFun === "function" && genFun.constructor;
+ return ctor
+ ? ctor === GeneratorFunction ||
+ // For the native GeneratorFunction constructor, the best we can
+ // do is to check its .name property.
+ (ctor.displayName || ctor.name) === "GeneratorFunction"
+ : false;
+ };
+
+ runtime.mark = function(genFun) {
+ if (Object.setPrototypeOf) {
+ Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
+ } else {
+ genFun.__proto__ = GeneratorFunctionPrototype;
+ if (!(toStringTagSymbol in genFun)) {
+ genFun[toStringTagSymbol] = "GeneratorFunction";
+ }
+ }
+ genFun.prototype = Object.create(Gp);
+ return genFun;
+ };
+
+ // Within the body of any async function, `await x` is transformed to
+ // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
+ // `hasOwn.call(value, "__await")` to determine if the yielded value is
+ // meant to be awaited.
+ runtime.awrap = function(arg) {
+ return { __await: arg };
+ };
+
+ function AsyncIterator(generator) {
+ function invoke(method, arg, resolve, reject) {
+ var record = tryCatch(generator[method], generator, arg);
+ if (record.type === "throw") {
+ reject(record.arg);
+ } else {
+ var result = record.arg;
+ var value = result.value;
+ if (value &&
+ typeof value === "object" &&
+ hasOwn.call(value, "__await")) {
+ return Promise.resolve(value.__await).then(function(value) {
+ invoke("next", value, resolve, reject);
+ }, function(err) {
+ invoke("throw", err, resolve, reject);
+ });
+ }
+
+ return Promise.resolve(value).then(function(unwrapped) {
+ // When a yielded Promise is resolved, its final value becomes
+ // the .value of the Promise<{value,done}> result for the
+ // current iteration. If the Promise is rejected, however, the
+ // result for this iteration will be rejected with the same
+ // reason. Note that rejections of yielded Promises are not
+ // thrown back into the generator function, as is the case
+ // when an awaited Promise is rejected. This difference in
+ // behavior between yield and await is important, because it
+ // allows the consumer to decide what to do with the yielded
+ // rejection (swallow it and continue, manually .throw it back
+ // into the generator, abandon iteration, whatever). With
+ // await, by contrast, there is no opportunity to examine the
+ // rejection reason outside the generator function, so the
+ // only option is to throw it from the await expression, and
+ // let the generator function handle the exception.
+ result.value = unwrapped;
+ resolve(result);
+ }, reject);
+ }
+ }
+
+ if (typeof global.process === "object" && global.process.domain) {
+ invoke = global.process.domain.bind(invoke);
+ }
+
+ var previousPromise;
+
+ function enqueue(method, arg) {
+ function callInvokeWithMethodAndArg() {
+ return new Promise(function(resolve, reject) {
+ invoke(method, arg, resolve, reject);
+ });
+ }
+
+ return previousPromise =
+ // If enqueue has been called before, then we want to wait until
+ // all previous Promises have been resolved before calling invoke,
+ // so that results are always delivered in the correct order. If
+ // enqueue has not been called before, then it is important to
+ // call invoke immediately, without waiting on a callback to fire,
+ // so that the async generator function has the opportunity to do
+ // any necessary setup in a predictable way. This predictability
+ // is why the Promise constructor synchronously invokes its
+ // executor callback, and why async functions synchronously
+ // execute code before the first await. Since we implement simple
+ // async functions in terms of async generators, it is especially
+ // important to get this right, even though it requires care.
+ previousPromise ? previousPromise.then(
+ callInvokeWithMethodAndArg,
+ // Avoid propagating failures to Promises returned by later
+ // invocations of the iterator.
+ callInvokeWithMethodAndArg
+ ) : callInvokeWithMethodAndArg();
+ }
+
+ // Define the unified helper method that is used to implement .next,
+ // .throw, and .return (see defineIteratorMethods).
+ this._invoke = enqueue;
+ }
+
+ defineIteratorMethods(AsyncIterator.prototype);
+ AsyncIterator.prototype[asyncIteratorSymbol] = function () {
+ return this;
+ };
+ runtime.AsyncIterator = AsyncIterator;
+
+ // Note that simple async functions are implemented on top of
+ // AsyncIterator objects; they just return a Promise for the value of
+ // the final result produced by the iterator.
+ runtime.async = function(innerFn, outerFn, self, tryLocsList) {
+ var iter = new AsyncIterator(
+ wrap(innerFn, outerFn, self, tryLocsList)
+ );
+
+ return runtime.isGeneratorFunction(outerFn)
+ ? iter // If outerFn is a generator, return the full iterator.
+ : iter.next().then(function(result) {
+ return result.done ? result.value : iter.next();
+ });
+ };
+
+ function makeInvokeMethod(innerFn, self, context) {
+ var state = GenStateSuspendedStart;
+
+ return function invoke(method, arg) {
+ if (state === GenStateExecuting) {
+ throw new Error("Generator is already running");
+ }
+
+ if (state === GenStateCompleted) {
+ if (method === "throw") {
+ throw arg;
+ }
+
+ // Be forgiving, per 25.3.3.3.3 of the spec:
+ // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
+ return doneResult();
+ }
+
+ context.method = method;
+ context.arg = arg;
+
+ while (true) {
+ var delegate = context.delegate;
+ if (delegate) {
+ var delegateResult = maybeInvokeDelegate(delegate, context);
+ if (delegateResult) {
+ if (delegateResult === ContinueSentinel) continue;
+ return delegateResult;
+ }
+ }
+
+ if (context.method === "next") {
+ // Setting context._sent for legacy support of Babel's
+ // function.sent implementation.
+ context.sent = context._sent = context.arg;
+
+ } else if (context.method === "throw") {
+ if (state === GenStateSuspendedStart) {
+ state = GenStateCompleted;
+ throw context.arg;
+ }
+
+ context.dispatchException(context.arg);
+
+ } else if (context.method === "return") {
+ context.abrupt("return", context.arg);
+ }
+
+ state = GenStateExecuting;
+
+ var record = tryCatch(innerFn, self, context);
+ if (record.type === "normal") {
+ // If an exception is thrown from innerFn, we leave state ===
+ // GenStateExecuting and loop back for another invocation.
+ state = context.done
+ ? GenStateCompleted
+ : GenStateSuspendedYield;
+
+ if (record.arg === ContinueSentinel) {
+ continue;
+ }
+
+ return {
+ value: record.arg,
+ done: context.done
+ };
+
+ } else if (record.type === "throw") {
+ state = GenStateCompleted;
+ // Dispatch the exception by looping back around to the
+ // context.dispatchException(context.arg) call above.
+ context.method = "throw";
+ context.arg = record.arg;
+ }
+ }
+ };
+ }
+
+ // Call delegate.iterator[context.method](context.arg) and handle the
+ // result, either by returning a { value, done } result from the
+ // delegate iterator, or by modifying context.method and context.arg,
+ // setting context.delegate to null, and returning the ContinueSentinel.
+ function maybeInvokeDelegate(delegate, context) {
+ var method = delegate.iterator[context.method];
+ if (method === undefined) {
+ // A .throw or .return when the delegate iterator has no .throw
+ // method always terminates the yield* loop.
+ context.delegate = null;
+
+ if (context.method === "throw") {
+ if (delegate.iterator.return) {
+ // If the delegate iterator has a return method, give it a
+ // chance to clean up.
+ context.method = "return";
+ context.arg = undefined;
+ maybeInvokeDelegate(delegate, context);
+
+ if (context.method === "throw") {
+ // If maybeInvokeDelegate(context) changed context.method from
+ // "return" to "throw", let that override the TypeError below.
+ return ContinueSentinel;
+ }
+ }
+
+ context.method = "throw";
+ context.arg = new TypeError(
+ "The iterator does not provide a 'throw' method");
+ }
+
+ return ContinueSentinel;
+ }
+
+ var record = tryCatch(method, delegate.iterator, context.arg);
+
+ if (record.type === "throw") {
+ context.method = "throw";
+ context.arg = record.arg;
+ context.delegate = null;
+ return ContinueSentinel;
+ }
+
+ var info = record.arg;
+
+ if (! info) {
+ context.method = "throw";
+ context.arg = new TypeError("iterator result is not an object");
+ context.delegate = null;
+ return ContinueSentinel;
+ }
+
+ if (info.done) {
+ // Assign the result of the finished delegate to the temporary
+ // variable specified by delegate.resultName (see delegateYield).
+ context[delegate.resultName] = info.value;
+
+ // Resume execution at the desired location (see delegateYield).
+ context.next = delegate.nextLoc;
+
+ // If context.method was "throw" but the delegate handled the
+ // exception, let the outer generator proceed normally. If
+ // context.method was "next", forget context.arg since it has been
+ // "consumed" by the delegate iterator. If context.method was
+ // "return", allow the original .return call to continue in the
+ // outer generator.
+ if (context.method !== "return") {
+ context.method = "next";
+ context.arg = undefined;
+ }
+
+ } else {
+ // Re-yield the result returned by the delegate method.
+ return info;
+ }
+
+ // The delegate iterator is finished, so forget it and continue with
+ // the outer generator.
+ context.delegate = null;
+ return ContinueSentinel;
+ }
+
+ // Define Generator.prototype.{next,throw,return} in terms of the
+ // unified ._invoke helper method.
+ defineIteratorMethods(Gp);
+
+ Gp[toStringTagSymbol] = "Generator";
+
+ // A Generator should always return itself as the iterator object when the
+ // @@iterator function is called on it. Some browsers' implementations of the
+ // iterator prototype chain incorrectly implement this, causing the Generator
+ // object to not be returned from this call. This ensures that doesn't happen.
+ // See https://github.com/facebook/regenerator/issues/274 for more details.
+ Gp[iteratorSymbol] = function() {
+ return this;
+ };
+
+ Gp.toString = function() {
+ return "[object Generator]";
+ };
+
+ function pushTryEntry(locs) {
+ var entry = { tryLoc: locs[0] };
+
+ if (1 in locs) {
+ entry.catchLoc = locs[1];
+ }
+
+ if (2 in locs) {
+ entry.finallyLoc = locs[2];
+ entry.afterLoc = locs[3];
+ }
+
+ this.tryEntries.push(entry);
+ }
+
+ function resetTryEntry(entry) {
+ var record = entry.completion || {};
+ record.type = "normal";
+ delete record.arg;
+ entry.completion = record;
+ }
+
+ function Context(tryLocsList) {
+ // The root entry object (effectively a try statement without a catch
+ // or a finally block) gives us a place to store values thrown from
+ // locations where there is no enclosing try statement.
+ this.tryEntries = [{ tryLoc: "root" }];
+ tryLocsList.forEach(pushTryEntry, this);
+ this.reset(true);
+ }
+
+ runtime.keys = function(object) {
+ var keys = [];
+ for (var key in object) {
+ keys.push(key);
+ }
+ keys.reverse();
+
+ // Rather than returning an object with a next method, we keep
+ // things simple and return the next function itself.
+ return function next() {
+ while (keys.length) {
+ var key = keys.pop();
+ if (key in object) {
+ next.value = key;
+ next.done = false;
+ return next;
+ }
+ }
+
+ // To avoid creating an additional object, we just hang the .value
+ // and .done properties off the next function object itself. This
+ // also ensures that the minifier will not anonymize the function.
+ next.done = true;
+ return next;
+ };
+ };
+
+ function values(iterable) {
+ if (iterable) {
+ var iteratorMethod = iterable[iteratorSymbol];
+ if (iteratorMethod) {
+ return iteratorMethod.call(iterable);
+ }
+
+ if (typeof iterable.next === "function") {
+ return iterable;
+ }
+
+ if (!isNaN(iterable.length)) {
+ var i = -1, next = function next() {
+ while (++i < iterable.length) {
+ if (hasOwn.call(iterable, i)) {
+ next.value = iterable[i];
+ next.done = false;
+ return next;
+ }
+ }
+
+ next.value = undefined;
+ next.done = true;
+
+ return next;
+ };
+
+ return next.next = next;
+ }
+ }
+
+ // Return an iterator with no values.
+ return { next: doneResult };
+ }
+ runtime.values = values;
+
+ function doneResult() {
+ return { value: undefined, done: true };
+ }
+
+ Context.prototype = {
+ constructor: Context,
+
+ reset: function(skipTempReset) {
+ this.prev = 0;
+ this.next = 0;
+ // Resetting context._sent for legacy support of Babel's
+ // function.sent implementation.
+ this.sent = this._sent = undefined;
+ this.done = false;
+ this.delegate = null;
+
+ this.method = "next";
+ this.arg = undefined;
+
+ this.tryEntries.forEach(resetTryEntry);
+
+ if (!skipTempReset) {
+ for (var name in this) {
+ // Not sure about the optimal order of these conditions:
+ if (name.charAt(0) === "t" &&
+ hasOwn.call(this, name) &&
+ !isNaN(+name.slice(1))) {
+ this[name] = undefined;
+ }
+ }
+ }
+ },
+
+ stop: function() {
+ this.done = true;
+
+ var rootEntry = this.tryEntries[0];
+ var rootRecord = rootEntry.completion;
+ if (rootRecord.type === "throw") {
+ throw rootRecord.arg;
+ }
+
+ return this.rval;
+ },
+
+ dispatchException: function(exception) {
+ if (this.done) {
+ throw exception;
+ }
+
+ var context = this;
+ function handle(loc, caught) {
+ record.type = "throw";
+ record.arg = exception;
+ context.next = loc;
+
+ if (caught) {
+ // If the dispatched exception was caught by a catch block,
+ // then let that catch block handle the exception normally.
+ context.method = "next";
+ context.arg = undefined;
+ }
+
+ return !! caught;
+ }
+
+ for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+ var entry = this.tryEntries[i];
+ var record = entry.completion;
+
+ if (entry.tryLoc === "root") {
+ // Exception thrown outside of any try block that could handle
+ // it, so set the completion value of the entire function to
+ // throw the exception.
+ return handle("end");
+ }
+
+ if (entry.tryLoc <= this.prev) {
+ var hasCatch = hasOwn.call(entry, "catchLoc");
+ var hasFinally = hasOwn.call(entry, "finallyLoc");
+
+ if (hasCatch && hasFinally) {
+ if (this.prev < entry.catchLoc) {
+ return handle(entry.catchLoc, true);
+ } else if (this.prev < entry.finallyLoc) {
+ return handle(entry.finallyLoc);
+ }
+
+ } else if (hasCatch) {
+ if (this.prev < entry.catchLoc) {
+ return handle(entry.catchLoc, true);
+ }
+
+ } else if (hasFinally) {
+ if (this.prev < entry.finallyLoc) {
+ return handle(entry.finallyLoc);
+ }
+
+ } else {
+ throw new Error("try statement without catch or finally");
+ }
+ }
+ }
+ },
+
+ abrupt: function(type, arg) {
+ for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+ var entry = this.tryEntries[i];
+ if (entry.tryLoc <= this.prev &&
+ hasOwn.call(entry, "finallyLoc") &&
+ this.prev < entry.finallyLoc) {
+ var finallyEntry = entry;
+ break;
+ }
+ }
+
+ if (finallyEntry &&
+ (type === "break" ||
+ type === "continue") &&
+ finallyEntry.tryLoc <= arg &&
+ arg <= finallyEntry.finallyLoc) {
+ // Ignore the finally entry if control is not jumping to a
+ // location outside the try/catch block.
+ finallyEntry = null;
+ }
+
+ var record = finallyEntry ? finallyEntry.completion : {};
+ record.type = type;
+ record.arg = arg;
+
+ if (finallyEntry) {
+ this.method = "next";
+ this.next = finallyEntry.finallyLoc;
+ return ContinueSentinel;
+ }
+
+ return this.complete(record);
+ },
+
+ complete: function(record, afterLoc) {
+ if (record.type === "throw") {
+ throw record.arg;
+ }
+
+ if (record.type === "break" ||
+ record.type === "continue") {
+ this.next = record.arg;
+ } else if (record.type === "return") {
+ this.rval = this.arg = record.arg;
+ this.method = "return";
+ this.next = "end";
+ } else if (record.type === "normal" && afterLoc) {
+ this.next = afterLoc;
+ }
+
+ return ContinueSentinel;
+ },
+
+ finish: function(finallyLoc) {
+ for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+ var entry = this.tryEntries[i];
+ if (entry.finallyLoc === finallyLoc) {
+ this.complete(entry.completion, entry.afterLoc);
+ resetTryEntry(entry);
+ return ContinueSentinel;
+ }
+ }
+ },
+
+ "catch": function(tryLoc) {
+ for (var i = this.tryEntries.length - 1; i >= 0; --i) {
+ var entry = this.tryEntries[i];
+ if (entry.tryLoc === tryLoc) {
+ var record = entry.completion;
+ if (record.type === "throw") {
+ var thrown = record.arg;
+ resetTryEntry(entry);
+ }
+ return thrown;
+ }
+ }
+
+ // The context.catch method must only be called with a location
+ // argument that corresponds to a known catch block.
+ throw new Error("illegal catch attempt");
+ },
+
+ delegateYield: function(iterable, resultName, nextLoc) {
+ this.delegate = {
+ iterator: values(iterable),
+ resultName: resultName,
+ nextLoc: nextLoc
+ };
+
+ if (this.method === "next") {
+ // Deliberately forget the last sent value so that we don't
+ // accidentally pass it on to the delegate.
+ this.arg = undefined;
+ }
+
+ return ContinueSentinel;
+ }
+ };
+})(
+ // Among the various tricks for obtaining a reference to the global
+ // object, this seems to be the most reliable technique that does not
+ // use indirect eval (which violates Content Security Policy).
+ typeof global === "object" ? global :
+ typeof window === "object" ? window :
+ typeof self === "object" ? self : this
+);
+
+/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(90)))
+
+/***/ }),
+/* 324 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(325);
+module.exports = __webpack_require__(18).RegExp.escape;
+
+
+/***/ }),
+/* 325 */
+/***/ (function(module, exports, __webpack_require__) {
+
+// https://github.com/benjamingr/RexExp.escape
+var $export = __webpack_require__(0);
+var $re = __webpack_require__(326)(/[\\^$*+?.()|[\]{}]/g, '\\$&');
+
+$export($export.S, 'RegExp', { escape: function escape(it) { return $re(it); } });
+
+
+/***/ }),
+/* 326 */
+/***/ (function(module, exports) {
+
+module.exports = function (regExp, replace) {
+ var replacer = replace === Object(replace) ? function (part) {
+ return replace[part];
+ } : replace;
+ return function (it) {
+ return String(it).replace(regExp, replacer);
+ };
+};
+
+
+/***/ })
+/******/ ]); \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/tsconfig.json b/devtools/client/debugger/test/mochitest/examples/sourcemapped/tsconfig.json
new file mode 100644
index 0000000000..1a800b3d24
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/tsconfig.json
@@ -0,0 +1,10 @@
+{
+ "compilerOptions": {
+ "sourceMap": true,
+ "experimentalDecorators": true
+ },
+ "include": [
+ "fixtures/*/input.ts",
+ "fixtures/*/src/*.ts"
+ ]
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemapped/yarn.lock b/devtools/client/debugger/test/mochitest/examples/sourcemapped/yarn.lock
new file mode 100644
index 0000000000..0bcd635bf5
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemapped/yarn.lock
@@ -0,0 +1,2177 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+abbrev@1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+
+acorn-dynamic-import@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4"
+ dependencies:
+ acorn "^4.0.3"
+
+acorn@^4.0.3:
+ version "4.0.13"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
+
+acorn@^5.0.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.1.tgz#f095829297706a7c9776958c0afc8930a9b9d9d8"
+
+ajv-keywords@^3.1.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a"
+
+ajv@^6.1.0:
+ version "6.5.2"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.2.tgz#678495f9b82f7cca6be248dd92f59bff5e1f4360"
+ dependencies:
+ fast-deep-equal "^2.0.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.1"
+
+align-text@^0.1.1, align-text@^0.1.3:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
+ dependencies:
+ kind-of "^3.0.2"
+ longest "^1.0.1"
+ repeat-string "^1.5.2"
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+
+ansi-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
+
+anymatch@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
+ dependencies:
+ micromatch "^3.1.4"
+ normalize-path "^2.1.1"
+
+aproba@^1.0.3:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
+
+are-we-there-yet@~1.1.2:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21"
+ dependencies:
+ delegates "^1.0.0"
+ readable-stream "^2.0.6"
+
+arr-diff@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+
+arr-flatten@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+
+arr-union@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+
+array-unique@^0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
+
+asn1.js@^4.0.0:
+ version "4.10.1"
+ resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0"
+ dependencies:
+ bn.js "^4.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+assert@^1.1.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91"
+ dependencies:
+ util "0.10.3"
+
+assign-symbols@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+
+async-each@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d"
+
+async@^2.1.2:
+ version "2.6.1"
+ resolved "https://registry.yarnpkg.com/async/-/async-2.6.1.tgz#b245a23ca71930044ec53fa46aa00a3e87c6a610"
+ dependencies:
+ lodash "^4.17.10"
+
+atob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a"
+
+babel-polyfill@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153"
+ dependencies:
+ babel-runtime "^6.26.0"
+ core-js "^2.5.0"
+ regenerator-runtime "^0.10.5"
+
+babel-runtime@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
+ dependencies:
+ core-js "^2.4.0"
+ regenerator-runtime "^0.11.0"
+
+balanced-match@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
+
+base64-js@^1.0.2:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3"
+
+base@^0.11.1:
+ version "0.11.2"
+ resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+ dependencies:
+ cache-base "^1.0.1"
+ class-utils "^0.3.5"
+ component-emitter "^1.2.1"
+ define-property "^1.0.0"
+ isobject "^3.0.1"
+ mixin-deep "^1.2.0"
+ pascalcase "^0.1.1"
+
+big.js@^3.1.3:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
+
+binary-extensions@^1.0.0:
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205"
+
+bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0:
+ version "4.11.8"
+ resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f"
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+braces@^2.3.0, braces@^2.3.1:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+ dependencies:
+ arr-flatten "^1.1.0"
+ array-unique "^0.3.2"
+ extend-shallow "^2.0.1"
+ fill-range "^4.0.0"
+ isobject "^3.0.1"
+ repeat-element "^1.1.2"
+ snapdragon "^0.8.1"
+ snapdragon-node "^2.0.1"
+ split-string "^3.0.2"
+ to-regex "^3.0.1"
+
+brorand@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f"
+
+browserify-aes@^1.0.0, browserify-aes@^1.0.4:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
+ dependencies:
+ buffer-xor "^1.0.3"
+ cipher-base "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.3"
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+browserify-cipher@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
+ dependencies:
+ browserify-aes "^1.0.4"
+ browserify-des "^1.0.0"
+ evp_bytestokey "^1.0.0"
+
+browserify-des@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c"
+ dependencies:
+ cipher-base "^1.0.1"
+ des.js "^1.0.0"
+ inherits "^2.0.1"
+ safe-buffer "^5.1.2"
+
+browserify-rsa@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524"
+ dependencies:
+ bn.js "^4.1.0"
+ randombytes "^2.0.1"
+
+browserify-sign@^4.0.0:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298"
+ dependencies:
+ bn.js "^4.1.1"
+ browserify-rsa "^4.0.0"
+ create-hash "^1.1.0"
+ create-hmac "^1.1.2"
+ elliptic "^6.0.0"
+ inherits "^2.0.1"
+ parse-asn1 "^5.0.0"
+
+browserify-zlib@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f"
+ dependencies:
+ pako "~1.0.5"
+
+buffer-xor@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9"
+
+buffer@^4.3.0:
+ version "4.9.1"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298"
+ dependencies:
+ base64-js "^1.0.2"
+ ieee754 "^1.1.4"
+ isarray "^1.0.0"
+
+builtin-modules@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
+
+builtin-status-codes@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
+
+cache-base@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+ dependencies:
+ collection-visit "^1.0.0"
+ component-emitter "^1.2.1"
+ get-value "^2.0.6"
+ has-value "^1.0.0"
+ isobject "^3.0.1"
+ set-value "^2.0.0"
+ to-object-path "^0.3.0"
+ union-value "^1.0.0"
+ unset-value "^1.0.0"
+
+camelcase@^1.0.2:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
+
+camelcase@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
+
+center-align@^0.1.1:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
+ dependencies:
+ align-text "^0.1.3"
+ lazy-cache "^1.0.3"
+
+chokidar@^2.0.2:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26"
+ dependencies:
+ anymatch "^2.0.0"
+ async-each "^1.0.0"
+ braces "^2.3.0"
+ glob-parent "^3.1.0"
+ inherits "^2.0.1"
+ is-binary-path "^1.0.0"
+ is-glob "^4.0.0"
+ lodash.debounce "^4.0.8"
+ normalize-path "^2.1.1"
+ path-is-absolute "^1.0.0"
+ readdirp "^2.0.0"
+ upath "^1.0.5"
+ optionalDependencies:
+ fsevents "^1.2.2"
+
+chownr@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181"
+
+cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de"
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+class-utils@^0.3.5:
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+ dependencies:
+ arr-union "^3.1.0"
+ define-property "^0.2.5"
+ isobject "^3.0.0"
+ static-extend "^0.1.1"
+
+cliui@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
+ dependencies:
+ center-align "^0.1.1"
+ right-align "^0.1.1"
+ wordwrap "0.0.2"
+
+cliui@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wrap-ansi "^2.0.0"
+
+code-point-at@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+
+collection-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+ dependencies:
+ map-visit "^1.0.0"
+ object-visit "^1.0.0"
+
+component-emitter@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+
+console-browserify@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
+ dependencies:
+ date-now "^0.1.4"
+
+console-control-strings@^1.0.0, console-control-strings@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
+
+constants-browserify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75"
+
+copy-descriptor@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+
+core-js@^2.4.0, core-js@^2.5.0:
+ version "2.5.7"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e"
+
+core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+
+create-ecdh@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff"
+ dependencies:
+ bn.js "^4.1.0"
+ elliptic "^6.0.0"
+
+create-hash@^1.1.0, create-hash@^1.1.2:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196"
+ dependencies:
+ cipher-base "^1.0.1"
+ inherits "^2.0.1"
+ md5.js "^1.3.4"
+ ripemd160 "^2.0.1"
+ sha.js "^2.4.0"
+
+create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff"
+ dependencies:
+ cipher-base "^1.0.3"
+ create-hash "^1.1.0"
+ inherits "^2.0.1"
+ ripemd160 "^2.0.0"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+cross-spawn@^5.0.1:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449"
+ dependencies:
+ lru-cache "^4.0.1"
+ shebang-command "^1.2.0"
+ which "^1.2.9"
+
+crypto-browserify@^3.11.0:
+ version "3.12.0"
+ resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec"
+ dependencies:
+ browserify-cipher "^1.0.0"
+ browserify-sign "^4.0.0"
+ create-ecdh "^4.0.0"
+ create-hash "^1.1.0"
+ create-hmac "^1.1.0"
+ diffie-hellman "^5.0.0"
+ inherits "^2.0.1"
+ pbkdf2 "^3.0.3"
+ public-encrypt "^4.0.0"
+ randombytes "^2.0.0"
+ randomfill "^1.0.3"
+
+d@1:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f"
+ dependencies:
+ es5-ext "^0.10.9"
+
+date-now@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
+
+debug@^2.1.2, debug@^2.2.0, debug@^2.3.3:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ dependencies:
+ ms "2.0.0"
+
+decamelize@^1.0.0, decamelize@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+
+decode-uri-component@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+
+deep-extend@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
+
+define-property@^0.2.5:
+ version "0.2.5"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+ dependencies:
+ is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+ dependencies:
+ is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+ dependencies:
+ is-descriptor "^1.0.2"
+ isobject "^3.0.1"
+
+delegates@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+
+des.js@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc"
+ dependencies:
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+
+detect-libc@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
+
+diffie-hellman@^5.0.0:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
+ dependencies:
+ bn.js "^4.1.0"
+ miller-rabin "^4.0.0"
+ randombytes "^2.0.0"
+
+domain-browser@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
+
+elliptic@^6.0.0:
+ version "6.4.0"
+ resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df"
+ dependencies:
+ bn.js "^4.4.0"
+ brorand "^1.0.1"
+ hash.js "^1.0.0"
+ hmac-drbg "^1.0.0"
+ inherits "^2.0.1"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.0"
+
+emojis-list@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389"
+
+enhanced-resolve@^3.4.0:
+ version "3.4.1"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz#0421e339fd71419b3da13d129b3979040230476e"
+ dependencies:
+ graceful-fs "^4.1.2"
+ memory-fs "^0.4.0"
+ object-assign "^4.0.1"
+ tapable "^0.2.7"
+
+errno@^0.1.3:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
+ dependencies:
+ prr "~1.0.1"
+
+error-ex@^1.2.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+ dependencies:
+ is-arrayish "^0.2.1"
+
+es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14:
+ version "0.10.45"
+ resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.45.tgz#0bfdf7b473da5919d5adf3bd25ceb754fccc3653"
+ dependencies:
+ es6-iterator "~2.0.3"
+ es6-symbol "~3.1.1"
+ next-tick "1"
+
+es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@~2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
+ dependencies:
+ d "1"
+ es5-ext "^0.10.35"
+ es6-symbol "^3.1.1"
+
+es6-map@^0.1.3:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0"
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+ es6-iterator "~2.0.1"
+ es6-set "~0.1.5"
+ es6-symbol "~3.1.1"
+ event-emitter "~0.3.5"
+
+es6-set@~0.1.5:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1"
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+ es6-iterator "~2.0.1"
+ es6-symbol "3.1.1"
+ event-emitter "~0.3.5"
+
+es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+
+es6-weak-map@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f"
+ dependencies:
+ d "1"
+ es5-ext "^0.10.14"
+ es6-iterator "^2.0.1"
+ es6-symbol "^3.1.1"
+
+escope@^3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3"
+ dependencies:
+ es6-map "^0.1.3"
+ es6-weak-map "^2.0.1"
+ esrecurse "^4.1.0"
+ estraverse "^4.1.1"
+
+esrecurse@^4.1.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
+ dependencies:
+ estraverse "^4.1.0"
+
+estraverse@^4.1.0, estraverse@^4.1.1:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
+
+event-emitter@~0.3.5:
+ version "0.3.5"
+ resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
+ dependencies:
+ d "1"
+ es5-ext "~0.10.14"
+
+events@^1.0.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
+
+evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02"
+ dependencies:
+ md5.js "^1.3.4"
+ safe-buffer "^5.1.1"
+
+execa@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777"
+ dependencies:
+ cross-spawn "^5.0.1"
+ get-stream "^3.0.0"
+ is-stream "^1.1.0"
+ npm-run-path "^2.0.0"
+ p-finally "^1.0.0"
+ signal-exit "^3.0.0"
+ strip-eof "^1.0.0"
+
+expand-brackets@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+ dependencies:
+ debug "^2.3.3"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ posix-character-classes "^0.1.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+extend-shallow@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+ dependencies:
+ is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+ dependencies:
+ assign-symbols "^1.0.0"
+ is-extendable "^1.0.1"
+
+extglob@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+ dependencies:
+ array-unique "^0.3.2"
+ define-property "^1.0.0"
+ expand-brackets "^2.1.4"
+ extend-shallow "^2.0.1"
+ fragment-cache "^0.2.1"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+fast-deep-equal@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49"
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2"
+
+fill-range@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+ to-regex-range "^2.1.0"
+
+find-up@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+ dependencies:
+ locate-path "^2.0.0"
+
+for-in@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+
+fragment-cache@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+ dependencies:
+ map-cache "^0.2.2"
+
+fs-minipass@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d"
+ dependencies:
+ minipass "^2.2.1"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+
+fsevents@^1.2.2:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426"
+ dependencies:
+ nan "^2.9.2"
+ node-pre-gyp "^0.10.0"
+
+gauge@~2.7.3:
+ version "2.7.4"
+ resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
+ dependencies:
+ aproba "^1.0.3"
+ console-control-strings "^1.0.0"
+ has-unicode "^2.0.0"
+ object-assign "^4.1.0"
+ signal-exit "^3.0.0"
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wide-align "^1.1.0"
+
+get-caller-file@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
+
+get-stream@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
+
+get-value@^2.0.3, get-value@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+
+glob-parent@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae"
+ dependencies:
+ is-glob "^3.1.0"
+ path-dirname "^1.0.0"
+
+glob@^7.0.5:
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+graceful-fs@^4.1.2:
+ version "4.1.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
+
+has-flag@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51"
+
+has-unicode@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
+
+has-value@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+ dependencies:
+ get-value "^2.0.3"
+ has-values "^0.1.4"
+ isobject "^2.0.0"
+
+has-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+ dependencies:
+ get-value "^2.0.6"
+ has-values "^1.0.0"
+ isobject "^3.0.0"
+
+has-values@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+
+has-values@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+ dependencies:
+ is-number "^3.0.0"
+ kind-of "^4.0.0"
+
+hash-base@^3.0.0:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+hash.js@^1.0.0, hash.js@^1.0.3:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.5.tgz#e38ab4b85dfb1e0c40fe9265c0e9b54854c23812"
+ dependencies:
+ inherits "^2.0.3"
+ minimalistic-assert "^1.0.1"
+
+hmac-drbg@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
+ dependencies:
+ hash.js "^1.0.3"
+ minimalistic-assert "^1.0.0"
+ minimalistic-crypto-utils "^1.0.1"
+
+hosted-git-info@^2.1.4:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.7.1.tgz#97f236977bd6e125408930ff6de3eec6281ec047"
+
+https-browserify@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73"
+
+iconv-lite@^0.4.4:
+ version "0.4.23"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63"
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+ieee754@^1.1.4:
+ version "1.1.12"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b"
+
+ignore-walk@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8"
+ dependencies:
+ minimatch "^3.0.4"
+
+indexof@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d"
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+
+inherits@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1"
+
+ini@~1.3.0:
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
+
+interpret@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614"
+
+invert-kv@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
+
+is-accessor-descriptor@^0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-accessor-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
+ dependencies:
+ kind-of "^6.0.0"
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+
+is-binary-path@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
+ dependencies:
+ binary-extensions "^1.0.0"
+
+is-buffer@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+
+is-builtin-module@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe"
+ dependencies:
+ builtin-modules "^1.0.0"
+
+is-data-descriptor@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-data-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
+ dependencies:
+ kind-of "^6.0.0"
+
+is-descriptor@^0.1.0:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
+ dependencies:
+ is-accessor-descriptor "^0.1.6"
+ is-data-descriptor "^0.1.4"
+ kind-of "^5.0.0"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
+ dependencies:
+ is-accessor-descriptor "^1.0.0"
+ is-data-descriptor "^1.0.0"
+ kind-of "^6.0.2"
+
+is-extendable@^0.1.0, is-extendable@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+
+is-extendable@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+ dependencies:
+ is-plain-object "^2.0.4"
+
+is-extglob@^2.1.0, is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+
+is-fullwidth-code-point@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+
+is-glob@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a"
+ dependencies:
+ is-extglob "^2.1.0"
+
+is-glob@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0"
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-number@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
+ dependencies:
+ kind-of "^3.0.2"
+
+is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+ dependencies:
+ isobject "^3.0.1"
+
+is-stream@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
+
+is-windows@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+
+isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+
+isobject@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+ dependencies:
+ isarray "1.0.0"
+
+isobject@^3.0.0, isobject@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+
+json-loader@^0.5.4:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/json-loader/-/json-loader-0.5.7.tgz#dca14a70235ff82f0ac9a3abeb60d337a365185d"
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+
+json5@^0.5.0, json5@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
+
+kind-of@^6.0.0, kind-of@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
+
+lazy-cache@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
+
+lcid@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
+ dependencies:
+ invert-kv "^1.0.0"
+
+load-json-file@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8"
+ dependencies:
+ graceful-fs "^4.1.2"
+ parse-json "^2.2.0"
+ pify "^2.0.0"
+ strip-bom "^3.0.0"
+
+loader-runner@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2"
+
+loader-utils@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd"
+ dependencies:
+ big.js "^3.1.3"
+ emojis-list "^2.0.0"
+ json5 "^0.5.0"
+
+locate-path@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+ dependencies:
+ p-locate "^2.0.0"
+ path-exists "^3.0.0"
+
+lodash.debounce@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
+
+lodash@^4.17.10, lodash@^4.17.5:
+ version "4.17.10"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7"
+
+longest@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
+
+lru-cache@^4.0.1:
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c"
+ dependencies:
+ pseudomap "^1.0.2"
+ yallist "^2.1.2"
+
+map-cache@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+
+map-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+ dependencies:
+ object-visit "^1.0.0"
+
+md5.js@^1.3.4:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d"
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+
+mem@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76"
+ dependencies:
+ mimic-fn "^1.0.0"
+
+memory-fs@^0.4.0, memory-fs@~0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
+ dependencies:
+ errno "^0.1.3"
+ readable-stream "^2.0.1"
+
+micromatch@^3.1.4:
+ version "3.1.10"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ braces "^2.3.1"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ extglob "^2.0.4"
+ fragment-cache "^0.2.1"
+ kind-of "^6.0.2"
+ nanomatch "^1.2.9"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.2"
+
+miller-rabin@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d"
+ dependencies:
+ bn.js "^4.0.0"
+ brorand "^1.0.1"
+
+mimic-fn@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022"
+
+minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7"
+
+minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
+
+minimatch@^3.0.2, minimatch@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@0.0.8:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+
+minimist@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
+
+minipass@^2.2.1, minipass@^2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.3.tgz#a7dcc8b7b833f5d368759cce544dccb55f50f233"
+ dependencies:
+ safe-buffer "^5.1.2"
+ yallist "^3.0.0"
+
+minizlib@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb"
+ dependencies:
+ minipass "^2.2.1"
+
+mixin-deep@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe"
+ dependencies:
+ for-in "^1.0.2"
+ is-extendable "^1.0.1"
+
+mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+ dependencies:
+ minimist "0.0.8"
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+
+nan@^2.9.2:
+ version "2.10.0"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f"
+
+nanomatch@^1.2.9:
+ version "1.2.13"
+ resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ fragment-cache "^0.2.1"
+ is-windows "^1.0.2"
+ kind-of "^6.0.2"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+needle@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.1.tgz#b5e325bd3aae8c2678902fa296f729455d1d3a7d"
+ dependencies:
+ debug "^2.1.2"
+ iconv-lite "^0.4.4"
+ sax "^1.2.4"
+
+neo-async@^2.5.0:
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee"
+
+next-tick@1:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
+
+node-libs-browser@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df"
+ dependencies:
+ assert "^1.1.1"
+ browserify-zlib "^0.2.0"
+ buffer "^4.3.0"
+ console-browserify "^1.1.0"
+ constants-browserify "^1.0.0"
+ crypto-browserify "^3.11.0"
+ domain-browser "^1.1.1"
+ events "^1.0.0"
+ https-browserify "^1.0.0"
+ os-browserify "^0.3.0"
+ path-browserify "0.0.0"
+ process "^0.11.10"
+ punycode "^1.2.4"
+ querystring-es3 "^0.2.0"
+ readable-stream "^2.3.3"
+ stream-browserify "^2.0.1"
+ stream-http "^2.7.2"
+ string_decoder "^1.0.0"
+ timers-browserify "^2.0.4"
+ tty-browserify "0.0.0"
+ url "^0.11.0"
+ util "^0.10.3"
+ vm-browserify "0.0.4"
+
+node-pre-gyp@^0.10.0:
+ version "0.10.3"
+ resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc"
+ dependencies:
+ detect-libc "^1.0.2"
+ mkdirp "^0.5.1"
+ needle "^2.2.1"
+ nopt "^4.0.1"
+ npm-packlist "^1.1.6"
+ npmlog "^4.0.2"
+ rc "^1.2.7"
+ rimraf "^2.6.1"
+ semver "^5.3.0"
+ tar "^4"
+
+nopt@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
+ dependencies:
+ abbrev "1"
+ osenv "^0.1.4"
+
+normalize-package-data@^2.3.2:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f"
+ dependencies:
+ hosted-git-info "^2.1.4"
+ is-builtin-module "^1.0.0"
+ semver "2 || 3 || 4 || 5"
+ validate-npm-package-license "^3.0.1"
+
+normalize-path@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+ dependencies:
+ remove-trailing-separator "^1.0.1"
+
+npm-bundled@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308"
+
+npm-packlist@^1.1.6:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.11.tgz#84e8c683cbe7867d34b1d357d893ce29e28a02de"
+ dependencies:
+ ignore-walk "^3.0.1"
+ npm-bundled "^1.0.1"
+
+npm-run-path@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
+ dependencies:
+ path-key "^2.0.0"
+
+npmlog@^4.0.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
+ dependencies:
+ are-we-there-yet "~1.1.2"
+ console-control-strings "~1.1.0"
+ gauge "~2.7.3"
+ set-blocking "~2.0.0"
+
+number-is-nan@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+
+object-assign@^4.0.1, object-assign@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+
+object-copy@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+ dependencies:
+ copy-descriptor "^0.1.0"
+ define-property "^0.2.5"
+ kind-of "^3.0.3"
+
+object-visit@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+ dependencies:
+ isobject "^3.0.0"
+
+object.pick@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+ dependencies:
+ isobject "^3.0.1"
+
+once@^1.3.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ dependencies:
+ wrappy "1"
+
+os-browserify@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27"
+
+os-homedir@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
+
+os-locale@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2"
+ dependencies:
+ execa "^0.7.0"
+ lcid "^1.0.0"
+ mem "^1.1.0"
+
+os-tmpdir@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+
+osenv@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410"
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.0"
+
+p-finally@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+
+p-limit@^1.1.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
+ dependencies:
+ p-try "^1.0.0"
+
+p-locate@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+ dependencies:
+ p-limit "^1.1.0"
+
+p-try@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+
+pako@~1.0.5:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258"
+
+parse-asn1@^5.0.0:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8"
+ dependencies:
+ asn1.js "^4.0.0"
+ browserify-aes "^1.0.0"
+ create-hash "^1.1.0"
+ evp_bytestokey "^1.0.0"
+ pbkdf2 "^3.0.3"
+
+parse-json@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+ dependencies:
+ error-ex "^1.2.0"
+
+pascalcase@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+
+path-browserify@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a"
+
+path-dirname@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0"
+
+path-exists@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+
+path-key@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+
+path-type@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73"
+ dependencies:
+ pify "^2.0.0"
+
+pbkdf2@^3.0.3:
+ version "3.0.16"
+ resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c"
+ dependencies:
+ create-hash "^1.1.2"
+ create-hmac "^1.1.4"
+ ripemd160 "^2.0.1"
+ safe-buffer "^5.0.1"
+ sha.js "^2.4.8"
+
+pify@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+
+posix-character-classes@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+
+process-nextick-args@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa"
+
+process@^0.11.10:
+ version "0.11.10"
+ resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+
+prr@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
+
+pseudomap@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+
+public-encrypt@^4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994"
+ dependencies:
+ bn.js "^4.1.0"
+ browserify-rsa "^4.0.0"
+ create-hash "^1.1.0"
+ parse-asn1 "^5.0.0"
+ randombytes "^2.0.1"
+
+punycode@1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
+
+punycode@^1.2.4:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
+
+punycode@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+
+querystring-es3@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73"
+
+querystring@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
+
+randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80"
+ dependencies:
+ safe-buffer "^5.1.0"
+
+randomfill@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"
+ dependencies:
+ randombytes "^2.0.5"
+ safe-buffer "^5.1.0"
+
+rc@^1.2.7:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
+ dependencies:
+ deep-extend "^0.6.0"
+ ini "~1.3.0"
+ minimist "^1.2.0"
+ strip-json-comments "~2.0.1"
+
+read-pkg-up@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be"
+ dependencies:
+ find-up "^2.0.0"
+ read-pkg "^2.0.0"
+
+read-pkg@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8"
+ dependencies:
+ load-json-file "^2.0.0"
+ normalize-package-data "^2.3.2"
+ path-type "^2.0.0"
+
+readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.3.3, readable-stream@^2.3.6:
+ version "2.3.6"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.3"
+ isarray "~1.0.0"
+ process-nextick-args "~2.0.0"
+ safe-buffer "~5.1.1"
+ string_decoder "~1.1.1"
+ util-deprecate "~1.0.1"
+
+readdirp@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78"
+ dependencies:
+ graceful-fs "^4.1.2"
+ minimatch "^3.0.2"
+ readable-stream "^2.0.2"
+ set-immediate-shim "^1.0.1"
+
+regenerator-runtime@^0.10.5:
+ version "0.10.5"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658"
+
+regenerator-runtime@^0.11.0:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
+
+regex-not@^1.0.0, regex-not@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+ dependencies:
+ extend-shallow "^3.0.2"
+ safe-regex "^1.1.0"
+
+remove-trailing-separator@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+
+repeat-element@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a"
+
+repeat-string@^1.5.2, repeat-string@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+
+require-main-filename@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
+
+resolve-url@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+
+ret@~0.1.10:
+ version "0.1.15"
+ resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+
+right-align@^0.1.1:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
+ dependencies:
+ align-text "^0.1.1"
+
+rimraf@^2.6.1:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36"
+ dependencies:
+ glob "^7.0.5"
+
+ripemd160@^2.0.0, ripemd160@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
+ dependencies:
+ hash-base "^3.0.0"
+ inherits "^2.0.1"
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
+
+safe-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+ dependencies:
+ ret "~0.1.10"
+
+"safer-buffer@>= 2.1.2 < 3":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+
+sax@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
+
+"semver@2 || 3 || 4 || 5", semver@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab"
+
+set-blocking@^2.0.0, set-blocking@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+
+set-immediate-shim@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61"
+
+set-value@^0.4.3:
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1"
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.1"
+ to-object-path "^0.3.0"
+
+set-value@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274"
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.3"
+ split-string "^3.0.1"
+
+setimmediate@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285"
+
+sha.js@^2.4.0, sha.js@^2.4.8:
+ version "2.4.11"
+ resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
+ dependencies:
+ inherits "^2.0.1"
+ safe-buffer "^5.0.1"
+
+shebang-command@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+ dependencies:
+ shebang-regex "^1.0.0"
+
+shebang-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+
+signal-exit@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d"
+
+snapdragon-node@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+ dependencies:
+ define-property "^1.0.0"
+ isobject "^3.0.0"
+ snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+ dependencies:
+ kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
+ dependencies:
+ base "^0.11.1"
+ debug "^2.2.0"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ map-cache "^0.2.2"
+ source-map "^0.5.6"
+ source-map-resolve "^0.5.0"
+ use "^3.1.0"
+
+source-list-map@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085"
+
+source-map-resolve@^0.5.0:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259"
+ dependencies:
+ atob "^2.1.1"
+ decode-uri-component "^0.2.0"
+ resolve-url "^0.2.1"
+ source-map-url "^0.4.0"
+ urix "^0.1.0"
+
+source-map-url@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
+
+source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+
+source-map@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+
+spdx-correct@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82"
+ dependencies:
+ spdx-expression-parse "^3.0.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9"
+
+spdx-expression-parse@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0"
+ dependencies:
+ spdx-exceptions "^2.1.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87"
+
+split-string@^3.0.1, split-string@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+ dependencies:
+ extend-shallow "^3.0.0"
+
+static-extend@^0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+ dependencies:
+ define-property "^0.2.5"
+ object-copy "^0.1.0"
+
+stream-browserify@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db"
+ dependencies:
+ inherits "~2.0.1"
+ readable-stream "^2.0.2"
+
+stream-http@^2.7.2:
+ version "2.8.3"
+ resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc"
+ dependencies:
+ builtin-status-codes "^3.0.0"
+ inherits "^2.0.1"
+ readable-stream "^2.3.6"
+ to-arraybuffer "^1.0.0"
+ xtend "^4.0.0"
+
+string-width@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ strip-ansi "^3.0.0"
+
+"string-width@^1.0.2 || 2", string-width@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^4.0.0"
+
+string_decoder@^1.0.0, string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ dependencies:
+ safe-buffer "~5.1.0"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+ dependencies:
+ ansi-regex "^2.0.0"
+
+strip-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+ dependencies:
+ ansi-regex "^3.0.0"
+
+strip-bom@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+
+strip-eof@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
+
+strip-json-comments@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+
+supports-color@^4.2.1:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b"
+ dependencies:
+ has-flag "^2.0.0"
+
+tapable@^0.2.7:
+ version "0.2.8"
+ resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22"
+
+tar@^4:
+ version "4.4.4"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.4.tgz#ec8409fae9f665a4355cc3b4087d0820232bb8cd"
+ dependencies:
+ chownr "^1.0.1"
+ fs-minipass "^1.2.5"
+ minipass "^2.3.3"
+ minizlib "^1.1.0"
+ mkdirp "^0.5.0"
+ safe-buffer "^5.1.2"
+ yallist "^3.0.2"
+
+timers-browserify@^2.0.4:
+ version "2.0.10"
+ resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae"
+ dependencies:
+ setimmediate "^1.0.4"
+
+to-arraybuffer@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
+
+to-object-path@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+ dependencies:
+ kind-of "^3.0.2"
+
+to-regex-range@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+ dependencies:
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+
+to-regex@^3.0.1, to-regex@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+ dependencies:
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ regex-not "^1.0.2"
+ safe-regex "^1.1.0"
+
+tty-browserify@0.0.0:
+ version "0.0.0"
+ resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
+
+uglify-js@^2.8.29:
+ version "2.8.29"
+ resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd"
+ dependencies:
+ source-map "~0.5.1"
+ yargs "~3.10.0"
+ optionalDependencies:
+ uglify-to-browserify "~1.0.0"
+
+uglify-to-browserify@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
+
+uglifyjs-webpack-plugin@^0.4.6:
+ version "0.4.6"
+ resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz#b951f4abb6bd617e66f63eb891498e391763e309"
+ dependencies:
+ source-map "^0.5.6"
+ uglify-js "^2.8.29"
+ webpack-sources "^1.0.1"
+
+union-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4"
+ dependencies:
+ arr-union "^3.1.0"
+ get-value "^2.0.6"
+ is-extendable "^0.1.1"
+ set-value "^0.4.3"
+
+unset-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+ dependencies:
+ has-value "^0.3.1"
+ isobject "^3.0.0"
+
+upath@^1.0.5:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd"
+
+uri-js@^4.2.1:
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0"
+ dependencies:
+ punycode "^2.1.0"
+
+urix@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+
+url@^0.11.0:
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
+ dependencies:
+ punycode "1.3.2"
+ querystring "0.2.0"
+
+use@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
+
+util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+
+util@0.10.3:
+ version "0.10.3"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
+ dependencies:
+ inherits "2.0.1"
+
+util@^0.10.3:
+ version "0.10.4"
+ resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901"
+ dependencies:
+ inherits "2.0.3"
+
+validate-npm-package-license@^3.0.1:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338"
+ dependencies:
+ spdx-correct "^3.0.0"
+ spdx-expression-parse "^3.0.0"
+
+vm-browserify@0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
+ dependencies:
+ indexof "0.0.1"
+
+watchpack@^1.4.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00"
+ dependencies:
+ chokidar "^2.0.2"
+ graceful-fs "^4.1.2"
+ neo-async "^2.5.0"
+
+webpack-sources@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54"
+ dependencies:
+ source-list-map "^2.0.0"
+ source-map "~0.6.1"
+
+webpack@^3.7.1:
+ version "3.12.0"
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.12.0.tgz#3f9e34360370602fcf639e97939db486f4ec0d74"
+ dependencies:
+ acorn "^5.0.0"
+ acorn-dynamic-import "^2.0.0"
+ ajv "^6.1.0"
+ ajv-keywords "^3.1.0"
+ async "^2.1.2"
+ enhanced-resolve "^3.4.0"
+ escope "^3.6.0"
+ interpret "^1.0.0"
+ json-loader "^0.5.4"
+ json5 "^0.5.1"
+ loader-runner "^2.3.0"
+ loader-utils "^1.1.0"
+ memory-fs "~0.4.1"
+ mkdirp "~0.5.0"
+ node-libs-browser "^2.0.0"
+ source-map "^0.5.3"
+ supports-color "^4.2.1"
+ tapable "^0.2.7"
+ uglifyjs-webpack-plugin "^0.4.6"
+ watchpack "^1.4.0"
+ webpack-sources "^1.0.1"
+ yargs "^8.0.2"
+
+which-module@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
+
+which@^1.2.9:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+ dependencies:
+ isexe "^2.0.0"
+
+wide-align@^1.1.0:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457"
+ dependencies:
+ string-width "^1.0.2 || 2"
+
+window-size@0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
+
+wordwrap@0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
+
+wrap-ansi@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+
+xtend@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
+
+y18n@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41"
+
+yallist@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+
+yallist@^3.0.0, yallist@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9"
+
+yargs-parser@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9"
+ dependencies:
+ camelcase "^4.1.0"
+
+yargs@^8.0.2:
+ version "8.0.2"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360"
+ dependencies:
+ camelcase "^4.1.0"
+ cliui "^3.2.0"
+ decamelize "^1.1.1"
+ get-caller-file "^1.0.1"
+ os-locale "^2.0.0"
+ read-pkg-up "^2.0.0"
+ require-directory "^2.1.1"
+ require-main-filename "^1.0.1"
+ set-blocking "^2.0.0"
+ string-width "^2.0.0"
+ which-module "^2.0.0"
+ y18n "^3.2.1"
+ yargs-parser "^7.0.0"
+
+yargs@~3.10.0:
+ version "3.10.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
+ dependencies:
+ camelcase "^1.0.2"
+ cliui "^2.1.0"
+ decamelize "^1.0.0"
+ window-size "0.1.0"
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-indexed/main.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-indexed/main.js
new file mode 100644
index 0000000000..23fb2fabf1
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-indexed/main.js
@@ -0,0 +1,15 @@
+var message = document.getElementById('message');
+
+function logMessage() {
+ console.log('message is: ' + message.value);
+}
+
+message.addEventListener('focus', function() {
+ message.value = '';
+}, false);
+
+var logMessageButton = document.getElementById('log-message');
+
+logMessageButton.addEventListener('click', function() {
+ logMessage();
+}, false);
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-indexed/main.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemaps-indexed/main.js.map
new file mode 100644
index 0000000000..f9dca70ad8
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-indexed/main.js.map
@@ -0,0 +1,30 @@
+{
+ "version": 3,
+ "file": "main.js",
+ "sections": [
+ {
+ "offset": {
+ "line": 0,
+ "column": 0
+ },
+ "map": {
+ "version": 3,
+ "sources": [
+ "main.js"
+ ],
+ "names": [
+ "message",
+ "document",
+ "getElementById",
+ "logMessage",
+ "console",
+ "log",
+ "value",
+ "addEventListener",
+ "logMessageButton"
+ ],
+ "mappings": "AAAA,GAAIA,SAAUC,SAASC,eAAe,UAEtC,SAASC,cACPC,QAAQC,IAAI,eAAiBL,QAAQM,OAGvCN,QAAQO,iBAAiB,QAAS,WAChCP,QAAQM,MAAQ,IACf,MAEH,IAAIE,kBAAmBP,SAASC,eAAe,cAE/CM,kBAAiBD,iBAAiB,QAAS,WACzCJ,cACC"
+ }
+ }
+ ]
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-indexed/main.min.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-indexed/main.min.js
new file mode 100644
index 0000000000..718837f4b7
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-indexed/main.min.js
@@ -0,0 +1,2 @@
+var message=document.getElementById("message");function logMessage(){console.log("message is: "+message.value)}message.addEventListener("focus",function(){message.value=""},false);var logMessageButton=document.getElementById("log-message");logMessageButton.addEventListener("click",function(){logMessage()},false);
+//# sourceMappingURL=main.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/README.md b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/README.md
new file mode 100644
index 0000000000..1d71ab15a9
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/README.md
@@ -0,0 +1,6 @@
+### Steps to Rebuild
+
+1. /!\ ONLY DO CHANGES TO package.json /!\
+ All other files from v1, v2,... folders are automatically copied from ../sourcemaps-reload-uncompressed/ folder
+2. run `yarn` to install webpack & babel
+3. run `yarn run pack` to update everything
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/package.json b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/package.json
new file mode 100644
index 0000000000..30187c5de4
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/package.json
@@ -0,0 +1,20 @@
+{
+ "name": "sourcemaps-reload-compressed",
+ "version": "1.0.0",
+ "description": "Rebuild assets for sourcemaps-reload-compressed test, see README.md in the same folder",
+ "scripts": {
+ "pack": "cp -r ../sourcemaps-reload-uncompressed/v* ./ && cd v1 && webpack && cd ../v2 && webpack && cd ../v3 && webpack",
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "keywords": [],
+ "author": "",
+ "license": "MPL-2.0",
+ "dependencies": {},
+ "devDependencies": {
+ "babel-core": "^7.0.0-beta.3",
+ "babel-loader": "^7.1.2",
+ "babel-preset-es2015": "^6.24.1",
+ "webpack": "^4",
+ "webpack-cli": ""
+ }
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/bundle-with-another-original.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/bundle-with-another-original.js
new file mode 100644
index 0000000000..777750fa7c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/bundle-with-another-original.js
@@ -0,0 +1,2 @@
+!function(e){var n={};function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:r})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,n){if(1&n&&(e=t(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var o in e)t.d(r,o,function(n){return e[n]}.bind(null,o));return r},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p="",t(t.s=0)}([function(e,n,t){e.exports=t(1)},function(e,n){window.baabar=function(){return new Promise(e=>setTimeout(e,100))},window.foobar=async function(){await baabar(),console.log("YO")},foobar()}]);
+//# sourceMappingURL=bundle-with-another-original.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/bundle-with-another-original.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/bundle-with-another-original.js.map
new file mode 100644
index 0000000000..8eb982befc
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/bundle-with-another-original.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./original-with-no-update.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","window","baabar","Promise","resolve","setTimeout","foobar","async","console","log"],"mappings":"aACE,IAAIA,EAAmB,GAGvB,SAASC,EAAoBC,GAG5B,GAAGF,EAAiBE,GACnB,OAAOF,EAAiBE,GAAUC,QAGnC,IAAIC,EAASJ,EAAiBE,GAAY,CACzCG,EAAGH,EACHI,GAAG,EACHH,QAAS,IAUV,OANAI,EAAQL,GAAUM,KAAKJ,EAAOD,QAASC,EAAQA,EAAOD,QAASF,GAG/DG,EAAOE,GAAI,EAGJF,EAAOD,QAKfF,EAAoBQ,EAAIF,EAGxBN,EAAoBS,EAAIV,EAGxBC,EAAoBU,EAAI,SAASR,EAASS,EAAMC,GAC3CZ,EAAoBa,EAAEX,EAASS,IAClCG,OAAOC,eAAeb,EAASS,EAAM,CAAEK,YAAY,EAAMC,IAAKL,KAKhEZ,EAAoBkB,EAAI,SAAShB,GACX,oBAAXiB,QAA0BA,OAAOC,aAC1CN,OAAOC,eAAeb,EAASiB,OAAOC,YAAa,CAAEC,MAAO,WAE7DP,OAAOC,eAAeb,EAAS,aAAc,CAAEmB,OAAO,KAQvDrB,EAAoBsB,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQrB,EAAoBqB,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,iBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAKX,OAAOY,OAAO,MAGvB,GAFA1B,EAAoBkB,EAAEO,GACtBX,OAAOC,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOrB,EAAoBU,EAAEe,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIRzB,EAAoB6B,EAAI,SAAS1B,GAChC,IAAIS,EAAST,GAAUA,EAAOqB,WAC7B,WAAwB,OAAOrB,EAAgB,SAC/C,WAA8B,OAAOA,GAEtC,OADAH,EAAoBU,EAAEE,EAAQ,IAAKA,GAC5BA,GAIRZ,EAAoBa,EAAI,SAASiB,EAAQC,GAAY,OAAOjB,OAAOkB,UAAUC,eAAe1B,KAAKuB,EAAQC,IAGzG/B,EAAoBkC,EAAI,GAIjBlC,EAAoBA,EAAoBmC,EAAI,G,gDClFrDC,OAAOC,OAAS,WACd,OAAO,IAAIC,QAAQC,GAAWC,WAAWD,EAAS,OAGpDH,OAAOK,OAASC,uBACRL,SACNM,QAAQC,IAAI,OAEdH","file":"bundle-with-another-original.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","window.baabar = function baabar() {\n return new Promise(resolve => setTimeout(resolve, 100))\n}\n\nwindow.foobar = async function foobar() {\n await baabar();\n console.log(\"YO\")\n}\nfoobar();\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/bundle.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/bundle.js
new file mode 100644
index 0000000000..1498d04c78
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/bundle.js
@@ -0,0 +1,2 @@
+!function(e){var n={};function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:r})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,n){if(1&n&&(e=t(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var o in e)t.d(r,o,function(n){return e[n]}.bind(null,o));return r},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p="",t(t.s=0)}([function(e,n,t){e.exports=t(1)},function(e,n){window.bar=function(){return new Promise(e=>setTimeout(e,100))},window.foo=async function(){await nonSourceMappedFunction(),console.log("YO")}}]);
+//# sourceMappingURL=bundle.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/bundle.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/bundle.js.map
new file mode 100644
index 0000000000..25fc347d3a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/bundle.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./original.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","window","bar","Promise","resolve","setTimeout","foo","async","nonSourceMappedFunction","console","log"],"mappings":"aACE,IAAIA,EAAmB,GAGvB,SAASC,EAAoBC,GAG5B,GAAGF,EAAiBE,GACnB,OAAOF,EAAiBE,GAAUC,QAGnC,IAAIC,EAASJ,EAAiBE,GAAY,CACzCG,EAAGH,EACHI,GAAG,EACHH,QAAS,IAUV,OANAI,EAAQL,GAAUM,KAAKJ,EAAOD,QAASC,EAAQA,EAAOD,QAASF,GAG/DG,EAAOE,GAAI,EAGJF,EAAOD,QAKfF,EAAoBQ,EAAIF,EAGxBN,EAAoBS,EAAIV,EAGxBC,EAAoBU,EAAI,SAASR,EAASS,EAAMC,GAC3CZ,EAAoBa,EAAEX,EAASS,IAClCG,OAAOC,eAAeb,EAASS,EAAM,CAAEK,YAAY,EAAMC,IAAKL,KAKhEZ,EAAoBkB,EAAI,SAAShB,GACX,oBAAXiB,QAA0BA,OAAOC,aAC1CN,OAAOC,eAAeb,EAASiB,OAAOC,YAAa,CAAEC,MAAO,WAE7DP,OAAOC,eAAeb,EAAS,aAAc,CAAEmB,OAAO,KAQvDrB,EAAoBsB,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQrB,EAAoBqB,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,iBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAKX,OAAOY,OAAO,MAGvB,GAFA1B,EAAoBkB,EAAEO,GACtBX,OAAOC,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOrB,EAAoBU,EAAEe,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIRzB,EAAoB6B,EAAI,SAAS1B,GAChC,IAAIS,EAAST,GAAUA,EAAOqB,WAC7B,WAAwB,OAAOrB,EAAgB,SAC/C,WAA8B,OAAOA,GAEtC,OADAH,EAAoBU,EAAEE,EAAQ,IAAKA,GAC5BA,GAIRZ,EAAoBa,EAAI,SAASiB,EAAQC,GAAY,OAAOjB,OAAOkB,UAAUC,eAAe1B,KAAKuB,EAAQC,IAGzG/B,EAAoBkC,EAAI,GAIjBlC,EAAoBA,EAAoBmC,EAAI,G,gDClFrDC,OAAOC,IAAM,WACX,OAAO,IAAIC,QAAQC,GAAWC,WAAWD,EAAS,OAGpDH,OAAOK,IAAMC,uBAGLC,0BACNC,QAAQC,IAAI","file":"bundle.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","window.bar = function bar() {\n return new Promise(resolve => setTimeout(resolve, 100))\n}\n\nwindow.foo = async function foo() {\n // This will call a function from script.js, itself calling a function\n // from original-with-query.js\n await nonSourceMappedFunction();\n console.log(\"YO\")\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/iframe.html b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/iframe.html
new file mode 100644
index 0000000000..c86cfd167c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/iframe.html
@@ -0,0 +1,29 @@
+<!-- Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ -->
+<!doctype html>
+
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Iframe v1</title>
+ </head>
+
+ <body>
+ <!-- A simple inline script, that helps to cover breakable lines/columns -->
+ <!-- Have them define first, so that we avoid shifting lines when adding new scripts later in the html -->
+ <script>
+ // Comment
+ console.log('iframe breakable-line');
+ </script>
+
+ <!-- A second inline script, that helps cover bugs when having two distinct inline scripts -->
+ <script>
+ // Another comment
+ console.log("second iframe inline script");
+ </script>
+
+ <!-- A script whose URL is loaded in many different ways -->
+ <script src="same-url.sjs"></script>
+ </body>
+
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/index.html b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/index.html
new file mode 100644
index 0000000000..7fa9f4d306
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/index.html
@@ -0,0 +1,74 @@
+<!-- Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ -->
+<!doctype html>
+
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Empty test page 1</title>
+ </head>
+
+ <body>
+ <!-- A simple inline script, that helps to cover breakable lines/columns -->
+ <!-- Have them define first, so that we avoid shifting lines when adding new scripts later in the html -->
+ <script>
+ // Comment
+ console.log('breakable-line');
+ </script>
+
+ <!-- A second inline script, that helps cover bugs when having two distinct inline scripts -->
+ <!-- And also covers inline script with column indexes being offseted by the HTML content -->
+ <script>console.log("second inline script");</script>
+
+ <!-- Covers column index being shifted only for the first line and normal for the subsequent ones -->
+ <script>console.log("third inline script");
+ eval(`
+ function nameLessEval() {
+ console.log("name-less-eval");
+ }
+ `);
+ eval(`
+ function namedEval() {
+ console.log("named-eval");
+ }
+ //# sourceURL=named-eval.js
+ `);
+ </script>
+
+ <!-- Test JS file with encoded characters as well as custom protocol -->
+ <script>
+ //# sourceURL=foo://bar/%e6%96%87%e5%ad%97%e3%82%b3%e3%83%bc%e3%83%89.js
+ </script>
+
+ <!-- A simple script -->
+ <script src="script.js"></script>
+ <!-- A script whose URL is shared by many other sources -->
+ <script src="same-url.sjs"></script>
+ <!-- A script running some various code on page load -->
+ <script src="onload.js"></script>
+ <!-- Another script containing helper functions trigerred by the tests -->
+ <script src="test-functions.js"></script>
+
+ <!-- Scripts with query strings -->
+ <!-- * same file, distinct query -->
+ <script src="query.js?x=1"></script>
+ <script src="query.js?x=2"></script>
+ <!-- * unique file -->
+ <script src="query2.js?y=3"></script>
+
+ <!-- A javascript: URL, which should not be shown in the SourceTree -->
+ <script src="javascript:console.log('foo')"></script>
+
+ <!-- A bundle/generated source that contains original.js -->
+ <script src="bundle.js"></script>
+
+ <!-- A bundle/generated source that contains original-with-no-update.js -->
+ <script src="bundle-with-another-original.js"></script>
+
+ <!-- Another bundle/generated source that contains removed-original.js -->
+ <script src="replaced-bundle.js"></script>
+
+ <iframe src="iframe.html"></script>
+ </body>
+
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/onload.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/onload.js
new file mode 100644
index 0000000000..3e1ef7565d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/onload.js
@@ -0,0 +1,21 @@
+
+/**
+ * Load the same url in many ways
+ */
+// 1) Notice in index.html the:
+// <script src="same-url.sjs"></script>
+
+// 2) Also the similar <script> tag in iframe.html
+
+// 3) Via a Worker, in a distinct target
+const worker = new Worker("same-url.sjs");
+worker.postMessage("foo");
+
+// 4) Via a named eval, in the same target
+// Hold a global reference to this function to avoid it from being GC-ed.
+this.evaled = eval("function sameUrlEval() {}; console.log('eval script'); //# sourceURL=same-url.sjs");
+
+// 5) Via a dynamically inserted <script>, in the same target
+const script = document.createElement("script");
+script.src = "same-url.sjs";
+document.body.appendChild(script);
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/original-with-no-update.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/original-with-no-update.js
new file mode 100644
index 0000000000..9fd6ecf110
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/original-with-no-update.js
@@ -0,0 +1,9 @@
+window.baabar = function baabar() {
+ return new Promise(resolve => setTimeout(resolve, 100))
+}
+
+window.foobar = async function foobar() {
+ await baabar();
+ console.log("YO")
+}
+foobar();
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/original.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/original.js
new file mode 100644
index 0000000000..9fbbc80ad3
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/original.js
@@ -0,0 +1,10 @@
+window.bar = function bar() {
+ return new Promise(resolve => setTimeout(resolve, 100))
+}
+
+window.foo = async function foo() {
+ // This will call a function from script.js, itself calling a function
+ // from original-with-query.js
+ await nonSourceMappedFunction();
+ console.log("YO")
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/query.js.x=1 b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/query.js.x=1
new file mode 100644
index 0000000000..cee030ee1b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/query.js.x=1
@@ -0,0 +1 @@
+function query() {console.log("query x=1");}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/query.js.x=2 b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/query.js.x=2
new file mode 100644
index 0000000000..d1d76705dd
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/query.js.x=2
@@ -0,0 +1 @@
+function query() {console.log("query x=2");}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/query2.js.y=3 b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/query2.js.y=3
new file mode 100644
index 0000000000..73b89a8972
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/query2.js.y=3
@@ -0,0 +1 @@
+function query() {console.log("query2 y=3");}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/removed-original.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/removed-original.js
new file mode 100644
index 0000000000..df583abe4b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/removed-original.js
@@ -0,0 +1,5 @@
+// Add two comment lines, to match the one from v2/new-original.js and have same....
+// breakpoint column positions.......................
+window.removedOriginal = function removedOriginal() {
+ console.log("Removed original");
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/replaced-bundle.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/replaced-bundle.js
new file mode 100644
index 0000000000..0e3654072c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/replaced-bundle.js
@@ -0,0 +1,2 @@
+!function(e){var n={};function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:r})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,n){if(1&n&&(e=t(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var o in e)t.d(r,o,function(n){return e[n]}.bind(null,o));return r},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p="",t(t.s=0)}([function(e,n,t){e.exports=t(1)},function(e,n){window.removedOriginal=function(){console.log("Removed original")}}]);
+//# sourceMappingURL=replaced-bundle.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/replaced-bundle.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/replaced-bundle.js.map
new file mode 100644
index 0000000000..93e6472193
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/replaced-bundle.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./removed-original.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","window","removedOriginal","console","log"],"mappings":"aACE,IAAIA,EAAmB,GAGvB,SAASC,EAAoBC,GAG5B,GAAGF,EAAiBE,GACnB,OAAOF,EAAiBE,GAAUC,QAGnC,IAAIC,EAASJ,EAAiBE,GAAY,CACzCG,EAAGH,EACHI,GAAG,EACHH,QAAS,IAUV,OANAI,EAAQL,GAAUM,KAAKJ,EAAOD,QAASC,EAAQA,EAAOD,QAASF,GAG/DG,EAAOE,GAAI,EAGJF,EAAOD,QAKfF,EAAoBQ,EAAIF,EAGxBN,EAAoBS,EAAIV,EAGxBC,EAAoBU,EAAI,SAASR,EAASS,EAAMC,GAC3CZ,EAAoBa,EAAEX,EAASS,IAClCG,OAAOC,eAAeb,EAASS,EAAM,CAAEK,YAAY,EAAMC,IAAKL,KAKhEZ,EAAoBkB,EAAI,SAAShB,GACX,oBAAXiB,QAA0BA,OAAOC,aAC1CN,OAAOC,eAAeb,EAASiB,OAAOC,YAAa,CAAEC,MAAO,WAE7DP,OAAOC,eAAeb,EAAS,aAAc,CAAEmB,OAAO,KAQvDrB,EAAoBsB,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQrB,EAAoBqB,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,iBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAKX,OAAOY,OAAO,MAGvB,GAFA1B,EAAoBkB,EAAEO,GACtBX,OAAOC,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOrB,EAAoBU,EAAEe,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIRzB,EAAoB6B,EAAI,SAAS1B,GAChC,IAAIS,EAAST,GAAUA,EAAOqB,WAC7B,WAAwB,OAAOrB,EAAgB,SAC/C,WAA8B,OAAOA,GAEtC,OADAH,EAAoBU,EAAEE,EAAQ,IAAKA,GAC5BA,GAIRZ,EAAoBa,EAAI,SAASiB,EAAQC,GAAY,OAAOjB,OAAOkB,UAAUC,eAAe1B,KAAKuB,EAAQC,IAGzG/B,EAAoBkC,EAAI,GAIjBlC,EAAoBA,EAAoBmC,EAAI,G,gDChFrDC,OAAOC,gBAAkB,WACvBC,QAAQC,IAAI","file":"replaced-bundle.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","// Add two comment lines, to match the one from v2/new-original.js and have same....\n// breakpoint column positions.......................\nwindow.removedOriginal = function removedOriginal() {\n console.log(\"Removed original\");\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/same-url.sjs b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/same-url.sjs
new file mode 100644
index 0000000000..b7d7ea64cb
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/same-url.sjs
@@ -0,0 +1,20 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+/**
+ * Serve a different content, each time it is loaded
+ */
+const contents = `console.log("Same url script #COUNTER");`;
+
+function handleRequest(request, response) {
+ response.setHeader("Cache-Control", "no-store");
+ response.setHeader("Content-Type", "application/javascript");
+
+ let counter = 1 + parseInt(getState("counter") || 0);
+ setState("counter", "" + counter);
+
+ response.write(contents.replace(/COUNTER/g, counter));
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/script.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/script.js
new file mode 100644
index 0000000000..522fa404a0
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/script.js
@@ -0,0 +1,8 @@
+console.log("only one breakable line");
+// And one non-breakable line
+
+function nonSourceMappedFunction () {
+ console.log("non source mapped function");
+ // This will call a function from original-with-query.js
+ return originalWithQuery();
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/test-functions.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/test-functions.js
new file mode 100644
index 0000000000..d81399b3fe
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/test-functions.js
@@ -0,0 +1,14 @@
+/**
+ * This file contains various test functions called by the test script via `await invokeInTab("functionName");`.
+ */
+function breakInEval() {
+ eval(`
+ debugger;
+
+ window.evaledFunc = function() {
+ var foo = 1;
+ var bar = 2;
+ return foo + bar;
+ };
+ `);
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/webpack.config.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/webpack.config.js
new file mode 100644
index 0000000000..0c45c7e171
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v1/webpack.config.js
@@ -0,0 +1,49 @@
+const path = require("path");
+const webpack = require("webpack");
+
+const config = {
+ devtool: "sourcemap",
+};
+
+if (webpack.version && webpack.version[0] === "4") {
+ // Webpack 3, used in sourcemaps-reload-uncompressed, doesn't support mode attribute.
+ // Webpack 4, used in sourcemaps-reload-compressed we want production mode in order to compress the sources
+ config.mode = "production";
+} else {
+ // Also Webpack 4 doesn't support the module.loaders attribute
+ config.module = {
+ loaders: [
+ {
+ test: /\.js$/,
+ exclude: /node_modules/,
+ loader: "babel-loader",
+ },
+ ],
+ };
+}
+
+const originalBundle = Object.assign({}, config, {
+ entry: [path.join(__dirname, "original.js")],
+ output: {
+ path: __dirname,
+ filename: "bundle.js",
+ },
+});
+
+const bundleWithAnotherOriginalFile = Object.assign({}, config, {
+ entry: [path.join(__dirname, "original-with-no-update.js")],
+ output: {
+ path: __dirname,
+ filename: "bundle-with-another-original.js"
+ }
+});
+
+const replacedBundle = Object.assign({}, config, {
+ entry: [path.join(__dirname, "removed-original.js")],
+ output: {
+ path: __dirname,
+ filename: "replaced-bundle.js",
+ },
+});
+
+module.exports = [originalBundle, bundleWithAnotherOriginalFile, replacedBundle];
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/another-original.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/another-original.js
new file mode 100644
index 0000000000..790775ed99
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/another-original.js
@@ -0,0 +1,15 @@
+// This content of this file is added before that of original-with-no-update.js in the generated file
+// bundle-with-another-original.js, its main goal is to just cause the content of the generated file to change.
+function funcA() {
+ funcB();
+ funcC();
+}
+
+function funcB() {
+ console.log("Hello!");
+}
+
+function funcC() {
+ console.log("You made it!");
+}
+funcA();
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/bundle-with-another-original.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/bundle-with-another-original.js
new file mode 100644
index 0000000000..9688838a82
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/bundle-with-another-original.js
@@ -0,0 +1,2 @@
+!function(e){var n={};function o(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,o),r.l=!0,r.exports}o.m=e,o.c=n,o.d=function(e,n,t){o.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:t})},o.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.t=function(e,n){if(1&n&&(e=o(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(o.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var r in e)o.d(t,r,function(n){return e[n]}.bind(null,r));return t},o.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(n,"a",n),n},o.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},o.p="",o(o.s=0)}([function(e,n,o){o(1),e.exports=o(2)},function(e,n){console.log("Hello!"),console.log("You made it!")},function(e,n){window.baabar=function(){return new Promise(e=>setTimeout(e,100))},window.foobar=async function(){await baabar(),console.log("YO")},foobar()}]);
+//# sourceMappingURL=bundle-with-another-original.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/bundle-with-another-original.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/bundle-with-another-original.js.map
new file mode 100644
index 0000000000..f880838d8a
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/bundle-with-another-original.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./another-original.js","webpack:///./original-with-no-update.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","console","log","window","baabar","Promise","resolve","setTimeout","foobar","async"],"mappings":"aACE,IAAIA,EAAmB,GAGvB,SAASC,EAAoBC,GAG5B,GAAGF,EAAiBE,GACnB,OAAOF,EAAiBE,GAAUC,QAGnC,IAAIC,EAASJ,EAAiBE,GAAY,CACzCG,EAAGH,EACHI,GAAG,EACHH,QAAS,IAUV,OANAI,EAAQL,GAAUM,KAAKJ,EAAOD,QAASC,EAAQA,EAAOD,QAASF,GAG/DG,EAAOE,GAAI,EAGJF,EAAOD,QAKfF,EAAoBQ,EAAIF,EAGxBN,EAAoBS,EAAIV,EAGxBC,EAAoBU,EAAI,SAASR,EAASS,EAAMC,GAC3CZ,EAAoBa,EAAEX,EAASS,IAClCG,OAAOC,eAAeb,EAASS,EAAM,CAAEK,YAAY,EAAMC,IAAKL,KAKhEZ,EAAoBkB,EAAI,SAAShB,GACX,oBAAXiB,QAA0BA,OAAOC,aAC1CN,OAAOC,eAAeb,EAASiB,OAAOC,YAAa,CAAEC,MAAO,WAE7DP,OAAOC,eAAeb,EAAS,aAAc,CAAEmB,OAAO,KAQvDrB,EAAoBsB,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQrB,EAAoBqB,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,iBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAKX,OAAOY,OAAO,MAGvB,GAFA1B,EAAoBkB,EAAEO,GACtBX,OAAOC,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOrB,EAAoBU,EAAEe,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIRzB,EAAoB6B,EAAI,SAAS1B,GAChC,IAAIS,EAAST,GAAUA,EAAOqB,WAC7B,WAAwB,OAAOrB,EAAgB,SAC/C,WAA8B,OAAOA,GAEtC,OADAH,EAAoBU,EAAEE,EAAQ,IAAKA,GAC5BA,GAIRZ,EAAoBa,EAAI,SAASiB,EAAQC,GAAY,OAAOjB,OAAOkB,UAAUC,eAAe1B,KAAKuB,EAAQC,IAGzG/B,EAAoBkC,EAAI,GAIjBlC,EAAoBA,EAAoBmC,EAAI,G,qDC1EnDC,QAAQC,IAAI,UAIZD,QAAQC,IAAI,iB,cCZdC,OAAOC,OAAS,WACd,OAAO,IAAIC,QAAQC,GAAWC,WAAWD,EAAS,OAGpDH,OAAOK,OAASC,uBACRL,SACNH,QAAQC,IAAI,OAEdM","file":"bundle-with-another-original.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","// This content of this file is added before that of original-with-no-update.js in the generated file\n// bundle-with-another-original.js, its main goal is to just cause the content of the generated file to change.\nfunction funcA() {\n funcB();\n funcC();\n}\n\nfunction funcB() {\n console.log(\"Hello!\");\n}\n\nfunction funcC() {\n console.log(\"You made it!\");\n}\nfuncA();\n","window.baabar = function baabar() {\n return new Promise(resolve => setTimeout(resolve, 100))\n}\n\nwindow.foobar = async function foobar() {\n await baabar();\n console.log(\"YO\")\n}\nfoobar();\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/bundle.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/bundle.js
new file mode 100644
index 0000000000..9a067751d5
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/bundle.js
@@ -0,0 +1,2 @@
+!function(e){var n={};function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:r})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,n){if(1&n&&(e=t(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var o in e)t.d(r,o,function(n){return e[n]}.bind(null,o));return r},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p="",t(t.s=0)}([function(e,n,t){e.exports=t(1)},function(e,n){window.bar=function(){return new Promise(e=>setTimeout(e,100))},window.foo=async function(){await bar(),console.log("YO")},console.log("HEY")}]);
+//# sourceMappingURL=bundle.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/bundle.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/bundle.js.map
new file mode 100644
index 0000000000..780bf9fa62
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/bundle.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./original.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","window","bar","Promise","resolve","setTimeout","foo","async","console","log"],"mappings":"aACE,IAAIA,EAAmB,GAGvB,SAASC,EAAoBC,GAG5B,GAAGF,EAAiBE,GACnB,OAAOF,EAAiBE,GAAUC,QAGnC,IAAIC,EAASJ,EAAiBE,GAAY,CACzCG,EAAGH,EACHI,GAAG,EACHH,QAAS,IAUV,OANAI,EAAQL,GAAUM,KAAKJ,EAAOD,QAASC,EAAQA,EAAOD,QAASF,GAG/DG,EAAOE,GAAI,EAGJF,EAAOD,QAKfF,EAAoBQ,EAAIF,EAGxBN,EAAoBS,EAAIV,EAGxBC,EAAoBU,EAAI,SAASR,EAASS,EAAMC,GAC3CZ,EAAoBa,EAAEX,EAASS,IAClCG,OAAOC,eAAeb,EAASS,EAAM,CAAEK,YAAY,EAAMC,IAAKL,KAKhEZ,EAAoBkB,EAAI,SAAShB,GACX,oBAAXiB,QAA0BA,OAAOC,aAC1CN,OAAOC,eAAeb,EAASiB,OAAOC,YAAa,CAAEC,MAAO,WAE7DP,OAAOC,eAAeb,EAAS,aAAc,CAAEmB,OAAO,KAQvDrB,EAAoBsB,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQrB,EAAoBqB,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,iBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAKX,OAAOY,OAAO,MAGvB,GAFA1B,EAAoBkB,EAAEO,GACtBX,OAAOC,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOrB,EAAoBU,EAAEe,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIRzB,EAAoB6B,EAAI,SAAS1B,GAChC,IAAIS,EAAST,GAAUA,EAAOqB,WAC7B,WAAwB,OAAOrB,EAAgB,SAC/C,WAA8B,OAAOA,GAEtC,OADAH,EAAoBU,EAAEE,EAAQ,IAAKA,GAC5BA,GAIRZ,EAAoBa,EAAI,SAASiB,EAAQC,GAAY,OAAOjB,OAAOkB,UAAUC,eAAe1B,KAAKuB,EAAQC,IAGzG/B,EAAoBkC,EAAI,GAIjBlC,EAAoBA,EAAoBmC,EAAI,G,gDClFrDC,OAAOC,IAAM,WACX,OAAO,IAAIC,QAAQC,GAAWC,WAAWD,EAAS,OAMpDH,OAAOK,IAAMC,uBACLL,MACNM,QAAQC,IAAI,OAGdD,QAAQC,IAAI","file":"bundle.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","window.bar = function bar() {\n return new Promise(resolve => setTimeout(resolve, 100))\n}\n\n// New comment\n// to add some\n// non-breakable lines\nwindow.foo = async function foo() {\n await bar();\n console.log(\"YO\")\n}\n\nconsole.log(\"HEY\")\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/iframe.html b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/iframe.html
new file mode 100644
index 0000000000..04a2094e0d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/iframe.html
@@ -0,0 +1,29 @@
+<!-- Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ -->
+<!doctype html>
+
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Iframe v2</title>
+ </head>
+
+ <body>
+ <!-- A simple inline script, that helps to cover breakable lines/columns -->
+ <!-- Have them define first, so that we avoid shifting lines when adding new scripts later in the html -->
+ <script>
+ console.log('iframe breakable-line');
+ // Comment
+ </script>
+
+ <!-- A second inline script, that helps cover bugs when having two distinct inline scripts -->
+ <script>
+ console.log("second iframe inline script");
+ // Another comment
+ </script>
+
+ <!-- A script whose URL is loaded in many different ways -->
+ <script src="same-url.sjs"></script>
+ </body>
+
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/index.html b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/index.html
new file mode 100644
index 0000000000..7467a29687
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/index.html
@@ -0,0 +1,32 @@
+<!-- Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ -->
+<!doctype html>
+
+<html>
+ <!-- A simple script -->
+ <script src="script.js"></script>
+
+ <!-- A bundle/generated source that contains an updated version of original.js -->
+ <script src="bundle.js"></script>
+
+ <!-- A bundle/generated source that contains original-with-no-update.js as well as content from a newly added another-original.js -->
+ <script src="bundle-with-another-original.js"></script>
+
+ <!-- Another bundle/generated source that contains new-original.js which replaced the content of removed-original.js -->
+ <script src="replaced-bundle.js"></script>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Empty test page 2</title>
+ </head>
+
+ <body>
+ <!-- A simple inline script, that helps to cover breakable lines/columns -->
+ <script>
+ console.log('breakable-line');
+ // Comment
+ </script>
+
+ <iframe src="iframe.html"></script>
+ </body>
+
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/new-original.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/new-original.js
new file mode 100644
index 0000000000..4b67c21be1
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/new-original.js
@@ -0,0 +1,6 @@
+// Pad the name with "_" in order to match the same length as v1/removed-original.js
+// and set the column breakpoints on the same column!
+window.____newOriginal = function ____newOriginal() {
+ console.log("New original");
+}
+window.____newOriginal();
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/original-with-no-update.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/original-with-no-update.js
new file mode 100644
index 0000000000..9fd6ecf110
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/original-with-no-update.js
@@ -0,0 +1,9 @@
+window.baabar = function baabar() {
+ return new Promise(resolve => setTimeout(resolve, 100))
+}
+
+window.foobar = async function foobar() {
+ await baabar();
+ console.log("YO")
+}
+foobar();
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/original.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/original.js
new file mode 100644
index 0000000000..fd36b53b56
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/original.js
@@ -0,0 +1,13 @@
+window.bar = function bar() {
+ return new Promise(resolve => setTimeout(resolve, 100))
+}
+
+// New comment
+// to add some
+// non-breakable lines
+window.foo = async function foo() {
+ await bar();
+ console.log("YO")
+}
+
+console.log("HEY")
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/replaced-bundle.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/replaced-bundle.js
new file mode 100644
index 0000000000..a70d5adfd1
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/replaced-bundle.js
@@ -0,0 +1,2 @@
+!function(e){var n={};function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:r})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,n){if(1&n&&(e=t(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var o in e)t.d(r,o,function(n){return e[n]}.bind(null,o));return r},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p="",t(t.s=0)}([function(e,n,t){e.exports=t(1)},function(e,n){window.____newOriginal=function(){console.log("New original")},window.____newOriginal()}]);
+//# sourceMappingURL=replaced-bundle.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/replaced-bundle.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/replaced-bundle.js.map
new file mode 100644
index 0000000000..59fe219624
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/replaced-bundle.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./new-original.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","window","____newOriginal","console","log"],"mappings":"aACE,IAAIA,EAAmB,GAGvB,SAASC,EAAoBC,GAG5B,GAAGF,EAAiBE,GACnB,OAAOF,EAAiBE,GAAUC,QAGnC,IAAIC,EAASJ,EAAiBE,GAAY,CACzCG,EAAGH,EACHI,GAAG,EACHH,QAAS,IAUV,OANAI,EAAQL,GAAUM,KAAKJ,EAAOD,QAASC,EAAQA,EAAOD,QAASF,GAG/DG,EAAOE,GAAI,EAGJF,EAAOD,QAKfF,EAAoBQ,EAAIF,EAGxBN,EAAoBS,EAAIV,EAGxBC,EAAoBU,EAAI,SAASR,EAASS,EAAMC,GAC3CZ,EAAoBa,EAAEX,EAASS,IAClCG,OAAOC,eAAeb,EAASS,EAAM,CAAEK,YAAY,EAAMC,IAAKL,KAKhEZ,EAAoBkB,EAAI,SAAShB,GACX,oBAAXiB,QAA0BA,OAAOC,aAC1CN,OAAOC,eAAeb,EAASiB,OAAOC,YAAa,CAAEC,MAAO,WAE7DP,OAAOC,eAAeb,EAAS,aAAc,CAAEmB,OAAO,KAQvDrB,EAAoBsB,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQrB,EAAoBqB,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,iBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAKX,OAAOY,OAAO,MAGvB,GAFA1B,EAAoBkB,EAAEO,GACtBX,OAAOC,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOrB,EAAoBU,EAAEe,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIRzB,EAAoB6B,EAAI,SAAS1B,GAChC,IAAIS,EAAST,GAAUA,EAAOqB,WAC7B,WAAwB,OAAOrB,EAAgB,SAC/C,WAA8B,OAAOA,GAEtC,OADAH,EAAoBU,EAAEE,EAAQ,IAAKA,GAC5BA,GAIRZ,EAAoBa,EAAI,SAASiB,EAAQC,GAAY,OAAOjB,OAAOkB,UAAUC,eAAe1B,KAAKuB,EAAQC,IAGzG/B,EAAoBkC,EAAI,GAIjBlC,EAAoBA,EAAoBmC,EAAI,G,gDChFrDC,OAAOC,gBAAkB,WACvBC,QAAQC,IAAI,iBAEdH,OAAOC","file":"replaced-bundle.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","// Pad the name with \"_\" in order to match the same length as v1/removed-original.js\n// and set the column breakpoints on the same column!\nwindow.____newOriginal = function ____newOriginal() {\n console.log(\"New original\");\n}\nwindow.____newOriginal();\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/script.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/script.js
new file mode 100644
index 0000000000..5c55c1e859
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/script.js
@@ -0,0 +1,22 @@
+// Single line comment <<=== this is line 1
+console.log("body instruction");
+/* Multi
+* line
+* comment
+*/
+function bodyFunction() {
+ // Inline comment
+ /* Inline
+ * multiline comment
+ */
+ function inlineFunction() {
+ console.log("nested instruction");
+ }
+ const inlineCount = 1;
+ let inlineLet = 2;
+ var inlineVar = 3;
+ console.log("inline instruction");
+}
+const bodyCount = 1;
+let bodyLet = 2;
+var bodyVar = 3;
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/webpack.config.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/webpack.config.js
new file mode 100644
index 0000000000..88afb5b73e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v2/webpack.config.js
@@ -0,0 +1,54 @@
+const path = require("path");
+const webpack = require("webpack");
+
+const config = {
+ devtool: "sourcemap",
+};
+
+if (webpack.version && webpack.version[0] === "4") {
+ // Webpack 3, used in sourcemaps-reload-uncompressed, doesn't support mode attribute.
+ // Webpack 4, used in sourcemaps-reload-compressed we want production mode in order to compress the sources
+ config.mode = "production";
+} else {
+ // Also Webpack 4 doesn't support the module.loaders attribute
+ config.module = {
+ loaders: [
+ {
+ test: /\.js$/,
+ exclude: /node_modules/,
+ loader: "babel-loader",
+ },
+ ],
+ };
+}
+
+const originalBundle = Object.assign({}, config, {
+ entry: [path.join(__dirname, "original.js")],
+ output: {
+ path: __dirname,
+ filename: "bundle.js",
+ },
+});
+
+const bundleWithAnotherOriginalFile = Object.assign({}, config, {
+ entry: [
+ // This should cause the content of `original-with-no-update.js`
+ // to shift in the new `bundle-with-another-original.js` generated.
+ path.join(__dirname, "another-original.js"),
+ path.join(__dirname, "original-with-no-update.js")
+ ],
+ output: {
+ path: __dirname,
+ filename: "bundle-with-another-original.js"
+ }
+});
+
+const replacedBundle = Object.assign({}, config, {
+ entry: [path.join(__dirname, "new-original.js")],
+ output: {
+ path: __dirname,
+ filename: "replaced-bundle.js",
+ },
+});
+
+module.exports = [originalBundle, bundleWithAnotherOriginalFile, replacedBundle];
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v3/bundle.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v3/bundle.js
new file mode 100644
index 0000000000..de69b78072
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v3/bundle.js
@@ -0,0 +1,2 @@
+!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=0)}([function(e,t,n){e.exports=n(1)},function(e,t){window.bar=function(){return new Promise(e=>setTimeout(e,100))}}]);
+//# sourceMappingURL=bundle.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v3/bundle.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v3/bundle.js.map
new file mode 100644
index 0000000000..c690c9b9ce
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v3/bundle.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./original.js"],"names":["installedModules","__webpack_require__","moduleId","exports","module","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","window","bar","Promise","resolve","setTimeout"],"mappings":"aACE,IAAIA,EAAmB,GAGvB,SAASC,EAAoBC,GAG5B,GAAGF,EAAiBE,GACnB,OAAOF,EAAiBE,GAAUC,QAGnC,IAAIC,EAASJ,EAAiBE,GAAY,CACzCG,EAAGH,EACHI,GAAG,EACHH,QAAS,IAUV,OANAI,EAAQL,GAAUM,KAAKJ,EAAOD,QAASC,EAAQA,EAAOD,QAASF,GAG/DG,EAAOE,GAAI,EAGJF,EAAOD,QAKfF,EAAoBQ,EAAIF,EAGxBN,EAAoBS,EAAIV,EAGxBC,EAAoBU,EAAI,SAASR,EAASS,EAAMC,GAC3CZ,EAAoBa,EAAEX,EAASS,IAClCG,OAAOC,eAAeb,EAASS,EAAM,CAAEK,YAAY,EAAMC,IAAKL,KAKhEZ,EAAoBkB,EAAI,SAAShB,GACX,oBAAXiB,QAA0BA,OAAOC,aAC1CN,OAAOC,eAAeb,EAASiB,OAAOC,YAAa,CAAEC,MAAO,WAE7DP,OAAOC,eAAeb,EAAS,aAAc,CAAEmB,OAAO,KAQvDrB,EAAoBsB,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQrB,EAAoBqB,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,iBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAKX,OAAOY,OAAO,MAGvB,GAFA1B,EAAoBkB,EAAEO,GACtBX,OAAOC,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOrB,EAAoBU,EAAEe,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIRzB,EAAoB6B,EAAI,SAAS1B,GAChC,IAAIS,EAAST,GAAUA,EAAOqB,WAC7B,WAAwB,OAAOrB,EAAgB,SAC/C,WAA8B,OAAOA,GAEtC,OADAH,EAAoBU,EAAEE,EAAQ,IAAKA,GAC5BA,GAIRZ,EAAoBa,EAAI,SAASiB,EAAQC,GAAY,OAAOjB,OAAOkB,UAAUC,eAAe1B,KAAKuB,EAAQC,IAGzG/B,EAAoBkC,EAAI,GAIjBlC,EAAoBA,EAAoBmC,EAAI,G,gDClFrDC,OAAOC,IAAM,WACX,OAAO,IAAIC,QAAQC,GAAWC,WAAWD,EAAS","file":"bundle.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","window.bar = function bar() {\n return new Promise(resolve => setTimeout(resolve, 100))\n}\n"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v3/index.html b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v3/index.html
new file mode 100644
index 0000000000..112f73aff1
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v3/index.html
@@ -0,0 +1,17 @@
+<!-- Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ -->
+<!doctype html>
+
+<html>
+ <!-- A bundle/generated source that contains yet another version of original.js -->
+ <script src="bundle.js"></script>
+
+ <head>
+ <meta charset="utf-8"/>
+ <title>Empty test page 3</title>
+ </head>
+
+ <body>
+ </body>
+
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v3/original.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v3/original.js
new file mode 100644
index 0000000000..2268b51134
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v3/original.js
@@ -0,0 +1,3 @@
+window.bar = function bar() {
+ return new Promise(resolve => setTimeout(resolve, 100))
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v3/webpack.config.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v3/webpack.config.js
new file mode 100644
index 0000000000..df554beb0d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-compressed/v3/webpack.config.js
@@ -0,0 +1,31 @@
+const path = require("path");
+const webpack = require("webpack");
+
+const config = {
+ devtool: "sourcemap",
+};
+
+if (webpack.version && webpack.version[0] === "4") {
+ // Webpack 3, used in sourcemaps-reload-uncompressed, doesn't support mode attribute.
+ // Webpack 4, used in sourcemaps-reload-compressed we want production mode in order to compress the sources
+ config.mode = "production";
+} else {
+ // Also Webpack 4 doesn't support the module.loaders attribute
+ config.module = {
+ loaders: [
+ {
+ test: /\.js$/,
+ exclude: /node_modules/,
+ loader: "babel-loader",
+ },
+ ],
+ };
+}
+
+module.exports = Object.assign({}, config, {
+ entry: [path.join(__dirname, "original.js")],
+ output: {
+ path: __dirname,
+ filename: "bundle.js",
+ },
+});
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/README.md b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/README.md
new file mode 100644
index 0000000000..6c5368d26b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/README.md
@@ -0,0 +1,11 @@
+### Steps to Rebuild
+
+1. make changes to files within v1, v2, v3,... folders (update package.json if you add more folders/versions)
+2. run `yarn` to install webpack & babel
+3. run `yarn run pack`
+4. also go rebuild bundles in ../sourcemaps-reload-compressed/
+
+There are two distinct source folders as their package.json file is different.
+They use different webpack/babel versions.
+This also allows to detect the webpack version from webpack.config.js
+and use different settings in order to compress or not.
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/package.json b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/package.json
new file mode 100644
index 0000000000..68a5ec30cc
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/package.json
@@ -0,0 +1,19 @@
+{
+ "name": "sourcemaps-reload-uncompressed",
+ "version": "1.0.0",
+ "description": "Rebuild assets for sourcemaps-reload-uncompressed test, see README.md in the same folder",
+ "scripts": {
+ "pack": "cd v1 && webpack && cd ../v2 && webpack && cd ../v3 && webpack",
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "keywords": [],
+ "author": "",
+ "license": "MPL-2.0",
+ "dependencies": {},
+ "devDependencies": {
+ "babel-core": "^6.26.0",
+ "babel-loader": "^7.1.2",
+ "babel-preset-es2015": "^6.24.1",
+ "webpack": "^3.7.1"
+ }
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/bundle-with-another-original.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/bundle-with-another-original.js
new file mode 100644
index 0000000000..c95620a72c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/bundle-with-another-original.js
@@ -0,0 +1,89 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = __webpack_require__(1);
+
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports) {
+
+window.baabar = function baabar() {
+ return new Promise(resolve => setTimeout(resolve, 100));
+};
+
+window.foobar = async function foobar() {
+ await baabar();
+ console.log("YO");
+};
+foobar();
+
+/***/ })
+/******/ ]);
+//# sourceMappingURL=bundle-with-another-original.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/bundle-with-another-original.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/bundle-with-another-original.js.map
new file mode 100644
index 0000000000..84f22cdce0
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/bundle-with-another-original.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack:///webpack/bootstrap a1ecee2f86e1d0ea3fb5","webpack:///./original-with-no-update.js"],"names":["window","baabar","Promise","resolve","setTimeout","foobar","console","log"],"mappings":";QAAA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;;QAEA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;;;QAGA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA,KAAK;QACL;QACA;;QAEA;QACA;QACA;QACA,2BAA2B,0BAA0B,EAAE;QACvD,iCAAiC,eAAe;QAChD;QACA;QACA;;QAEA;QACA,sDAAsD,+DAA+D;;QAErH;QACA;;QAEA;QACA;;;;;;;;;;;;;;AC7DAA,OAAOC,MAAP,GAAgB,SAASA,MAAT,GAAkB;AAChC,SAAO,IAAIC,OAAJ,CAAYC,WAAWC,WAAWD,OAAX,EAAoB,GAApB,CAAvB,CAAP;AACD,CAFD;;AAIAH,OAAOK,MAAP,GAAgB,eAAeA,MAAf,GAAwB;AACtC,QAAMJ,QAAN;AACAK,UAAQC,GAAR,CAAY,IAAZ;AACD,CAHD;AAIAF,S","file":"bundle-with-another-original.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap a1ecee2f86e1d0ea3fb5","window.baabar = function baabar() {\n return new Promise(resolve => setTimeout(resolve, 100))\n}\n\nwindow.foobar = async function foobar() {\n await baabar();\n console.log(\"YO\")\n}\nfoobar();\n\n\n\n// WEBPACK FOOTER //\n// ./original-with-no-update.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/bundle.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/bundle.js
new file mode 100644
index 0000000000..57e2e9c5df
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/bundle.js
@@ -0,0 +1,90 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = __webpack_require__(1);
+
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports) {
+
+window.bar = function bar() {
+ return new Promise(resolve => setTimeout(resolve, 100));
+};
+
+window.foo = async function foo() {
+ // This will call a function from script.js, itself calling a function
+ // from original-with-query.js
+ await nonSourceMappedFunction();
+ console.log("YO");
+};
+
+/***/ })
+/******/ ]);
+//# sourceMappingURL=bundle.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/bundle.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/bundle.js.map
new file mode 100644
index 0000000000..a035b0174d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/bundle.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack:///webpack/bootstrap d343aa81956b90d9f67e","webpack:///./original.js"],"names":["window","bar","Promise","resolve","setTimeout","foo","nonSourceMappedFunction","console","log"],"mappings":";QAAA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;;QAEA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;;;QAGA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA,KAAK;QACL;QACA;;QAEA;QACA;QACA;QACA,2BAA2B,0BAA0B,EAAE;QACvD,iCAAiC,eAAe;QAChD;QACA;QACA;;QAEA;QACA,sDAAsD,+DAA+D;;QAErH;QACA;;QAEA;QACA;;;;;;;;;;;;;;AC7DAA,OAAOC,GAAP,GAAa,SAASA,GAAT,GAAe;AAC1B,SAAO,IAAIC,OAAJ,CAAYC,WAAWC,WAAWD,OAAX,EAAoB,GAApB,CAAvB,CAAP;AACD,CAFD;;AAIAH,OAAOK,GAAP,GAAa,eAAeA,GAAf,GAAqB;AAChC;AACA;AACA,QAAMC,yBAAN;AACAC,UAAQC,GAAR,CAAY,IAAZ;AACD,CALD,C","file":"bundle.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap d343aa81956b90d9f67e","window.bar = function bar() {\n return new Promise(resolve => setTimeout(resolve, 100))\n}\n\nwindow.foo = async function foo() {\n // This will call a function from script.js, itself calling a function\n // from original-with-query.js\n await nonSourceMappedFunction();\n console.log(\"YO\")\n}\n\n\n\n// WEBPACK FOOTER //\n// ./original.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/iframe.html b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/iframe.html
new file mode 100644
index 0000000000..c86cfd167c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/iframe.html
@@ -0,0 +1,29 @@
+<!-- Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ -->
+<!doctype html>
+
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Iframe v1</title>
+ </head>
+
+ <body>
+ <!-- A simple inline script, that helps to cover breakable lines/columns -->
+ <!-- Have them define first, so that we avoid shifting lines when adding new scripts later in the html -->
+ <script>
+ // Comment
+ console.log('iframe breakable-line');
+ </script>
+
+ <!-- A second inline script, that helps cover bugs when having two distinct inline scripts -->
+ <script>
+ // Another comment
+ console.log("second iframe inline script");
+ </script>
+
+ <!-- A script whose URL is loaded in many different ways -->
+ <script src="same-url.sjs"></script>
+ </body>
+
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/index.html b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/index.html
new file mode 100644
index 0000000000..56726c11e5
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/index.html
@@ -0,0 +1,77 @@
+<!-- Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ -->
+<!doctype html>
+
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Empty test page 1</title>
+ </head>
+
+ <body>
+ <!-- A simple inline script, that helps to cover breakable lines/columns -->
+ <!-- Have them define first, so that we avoid shifting lines when adding new scripts later in the html -->
+ <script>
+ // Comment
+ console.log('breakable-line');
+ </script>
+
+ <!-- A second inline script, that helps cover bugs when having two distinct inline scripts -->
+ <!-- And also covers inline script with column indexes being offseted by the HTML content -->
+ <script>console.log("second inline script");</script>
+
+ <!-- Covers column index being shifted only for the first line and normal for the subsequent ones -->
+ <script>console.log("third inline script");
+ eval(`
+ function nameLessEval() {
+ console.log("name-less-eval");
+ }
+ `);
+ eval(`
+ function namedEval() {
+ console.log("named-eval");
+ }
+ //# sourceURL=named-eval.js
+ `);
+ </script>
+
+ <!-- Test JS file with encoded characters as well as custom protocol -->
+ <script>
+ //# sourceURL=foo://bar/%e6%96%87%e5%ad%97%e3%82%b3%e3%83%bc%e3%83%89.js
+ </script>
+
+ <!-- A simple script -->
+ <script src="script.js"></script>
+ <!-- A script whose URL is shared by many other sources -->
+ <script src="same-url.sjs"></script>
+ <!-- A script running some various code on page load -->
+ <script src="onload.js"></script>
+ <!-- Another script containing helper functions trigerred by the tests -->
+ <script src="test-functions.js"></script>
+
+ <!-- Scripts with query strings -->
+ <!-- * same file, distinct query -->
+ <script src="query.js?x=1"></script>
+ <script src="query.js?x=2"></script>
+ <!-- * unique file -->
+ <script src="query2.js?y=3"></script>
+
+ <!-- A javascript: URL, which should not be shown in the SourceTree -->
+ <script src="javascript:console.log('foo')"></script>
+
+ <!-- A bundle/generated source that contains original.js -->
+ <script src="bundle.js"></script>
+
+ <!-- A bundle/generated source that contains original-with-no-update.js -->
+ <script src="bundle-with-another-original.js"></script>
+
+ <!-- Another bundle/generated source that contains removed-original.js -->
+ <script src="replaced-bundle.js"></script>
+
+ <!-- A script that looks like a react module -->
+ <script src="react-component-module.js"></script>
+
+ <iframe src="iframe.html"></script>
+ </body>
+
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/onload.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/onload.js
new file mode 100644
index 0000000000..3e1ef7565d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/onload.js
@@ -0,0 +1,21 @@
+
+/**
+ * Load the same url in many ways
+ */
+// 1) Notice in index.html the:
+// <script src="same-url.sjs"></script>
+
+// 2) Also the similar <script> tag in iframe.html
+
+// 3) Via a Worker, in a distinct target
+const worker = new Worker("same-url.sjs");
+worker.postMessage("foo");
+
+// 4) Via a named eval, in the same target
+// Hold a global reference to this function to avoid it from being GC-ed.
+this.evaled = eval("function sameUrlEval() {}; console.log('eval script'); //# sourceURL=same-url.sjs");
+
+// 5) Via a dynamically inserted <script>, in the same target
+const script = document.createElement("script");
+script.src = "same-url.sjs";
+document.body.appendChild(script);
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/original-with-no-update.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/original-with-no-update.js
new file mode 100644
index 0000000000..9fd6ecf110
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/original-with-no-update.js
@@ -0,0 +1,9 @@
+window.baabar = function baabar() {
+ return new Promise(resolve => setTimeout(resolve, 100))
+}
+
+window.foobar = async function foobar() {
+ await baabar();
+ console.log("YO")
+}
+foobar();
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/original.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/original.js
new file mode 100644
index 0000000000..9fbbc80ad3
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/original.js
@@ -0,0 +1,10 @@
+window.bar = function bar() {
+ return new Promise(resolve => setTimeout(resolve, 100))
+}
+
+window.foo = async function foo() {
+ // This will call a function from script.js, itself calling a function
+ // from original-with-query.js
+ await nonSourceMappedFunction();
+ console.log("YO")
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/query.js.x=1 b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/query.js.x=1
new file mode 100644
index 0000000000..cee030ee1b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/query.js.x=1
@@ -0,0 +1 @@
+function query() {console.log("query x=1");}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/query.js.x=2 b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/query.js.x=2
new file mode 100644
index 0000000000..d1d76705dd
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/query.js.x=2
@@ -0,0 +1 @@
+function query() {console.log("query x=2");}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/query2.js.y=3 b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/query2.js.y=3
new file mode 100644
index 0000000000..73b89a8972
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/query2.js.y=3
@@ -0,0 +1 @@
+function query() {console.log("query2 y=3");}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/react-component-module.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/react-component-module.js
new file mode 100644
index 0000000000..675b42b0a4
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/react-component-module.js
@@ -0,0 +1,2 @@
+// Use a code pattern identified by the parser worker to classify this module as a React Component
+var isReactComponent = true;
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/removed-original.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/removed-original.js
new file mode 100644
index 0000000000..df583abe4b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/removed-original.js
@@ -0,0 +1,5 @@
+// Add two comment lines, to match the one from v2/new-original.js and have same....
+// breakpoint column positions.......................
+window.removedOriginal = function removedOriginal() {
+ console.log("Removed original");
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/replaced-bundle.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/replaced-bundle.js
new file mode 100644
index 0000000000..a7b8680567
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/replaced-bundle.js
@@ -0,0 +1,85 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = __webpack_require__(1);
+
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports) {
+
+// Add two comment lines, to match the one from v2/new-original.js and have same....
+// breakpoint column positions.......................
+window.removedOriginal = function removedOriginal() {
+ console.log("Removed original");
+};
+
+/***/ })
+/******/ ]);
+//# sourceMappingURL=replaced-bundle.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/replaced-bundle.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/replaced-bundle.js.map
new file mode 100644
index 0000000000..4224c49dd5
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/replaced-bundle.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack:///webpack/bootstrap 3b1a221408fdde86aa49","webpack:///./removed-original.js"],"names":["window","removedOriginal","console","log"],"mappings":";QAAA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;;QAEA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;;;QAGA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA,KAAK;QACL;QACA;;QAEA;QACA;QACA;QACA,2BAA2B,0BAA0B,EAAE;QACvD,iCAAiC,eAAe;QAChD;QACA;QACA;;QAEA;QACA,sDAAsD,+DAA+D;;QAErH;QACA;;QAEA;QACA;;;;;;;;;;;;;;AC7DA;AACA;AACAA,OAAOC,eAAP,GAAyB,SAASA,eAAT,GAA2B;AAClDC,UAAQC,GAAR,CAAY,kBAAZ;AACD,CAFD,C","file":"replaced-bundle.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 3b1a221408fdde86aa49","// Add two comment lines, to match the one from v2/new-original.js and have same....\n// breakpoint column positions.......................\nwindow.removedOriginal = function removedOriginal() {\n console.log(\"Removed original\");\n}\n\n\n\n// WEBPACK FOOTER //\n// ./removed-original.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/same-url.sjs b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/same-url.sjs
new file mode 100644
index 0000000000..b7d7ea64cb
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/same-url.sjs
@@ -0,0 +1,20 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+/**
+ * Serve a different content, each time it is loaded
+ */
+const contents = `console.log("Same url script #COUNTER");`;
+
+function handleRequest(request, response) {
+ response.setHeader("Cache-Control", "no-store");
+ response.setHeader("Content-Type", "application/javascript");
+
+ let counter = 1 + parseInt(getState("counter") || 0);
+ setState("counter", "" + counter);
+
+ response.write(contents.replace(/COUNTER/g, counter));
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/script.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/script.js
new file mode 100644
index 0000000000..9306ac0eda
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/script.js
@@ -0,0 +1,8 @@
+console.log("only one breakable line");
+// And one non-breakable line
+
+function nonSourceMappedFunction () {
+ console.log("non source mapped function");
+ // This will call a function from removed-original.js
+ return removedOriginal();
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/test-functions.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/test-functions.js
new file mode 100644
index 0000000000..d81399b3fe
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/test-functions.js
@@ -0,0 +1,14 @@
+/**
+ * This file contains various test functions called by the test script via `await invokeInTab("functionName");`.
+ */
+function breakInEval() {
+ eval(`
+ debugger;
+
+ window.evaledFunc = function() {
+ var foo = 1;
+ var bar = 2;
+ return foo + bar;
+ };
+ `);
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/webpack.config.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/webpack.config.js
new file mode 100644
index 0000000000..0c45c7e171
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v1/webpack.config.js
@@ -0,0 +1,49 @@
+const path = require("path");
+const webpack = require("webpack");
+
+const config = {
+ devtool: "sourcemap",
+};
+
+if (webpack.version && webpack.version[0] === "4") {
+ // Webpack 3, used in sourcemaps-reload-uncompressed, doesn't support mode attribute.
+ // Webpack 4, used in sourcemaps-reload-compressed we want production mode in order to compress the sources
+ config.mode = "production";
+} else {
+ // Also Webpack 4 doesn't support the module.loaders attribute
+ config.module = {
+ loaders: [
+ {
+ test: /\.js$/,
+ exclude: /node_modules/,
+ loader: "babel-loader",
+ },
+ ],
+ };
+}
+
+const originalBundle = Object.assign({}, config, {
+ entry: [path.join(__dirname, "original.js")],
+ output: {
+ path: __dirname,
+ filename: "bundle.js",
+ },
+});
+
+const bundleWithAnotherOriginalFile = Object.assign({}, config, {
+ entry: [path.join(__dirname, "original-with-no-update.js")],
+ output: {
+ path: __dirname,
+ filename: "bundle-with-another-original.js"
+ }
+});
+
+const replacedBundle = Object.assign({}, config, {
+ entry: [path.join(__dirname, "removed-original.js")],
+ output: {
+ path: __dirname,
+ filename: "replaced-bundle.js",
+ },
+});
+
+module.exports = [originalBundle, bundleWithAnotherOriginalFile, replacedBundle];
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/another-original.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/another-original.js
new file mode 100644
index 0000000000..790775ed99
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/another-original.js
@@ -0,0 +1,15 @@
+// This content of this file is added before that of original-with-no-update.js in the generated file
+// bundle-with-another-original.js, its main goal is to just cause the content of the generated file to change.
+function funcA() {
+ funcB();
+ funcC();
+}
+
+function funcB() {
+ console.log("Hello!");
+}
+
+function funcC() {
+ console.log("You made it!");
+}
+funcA();
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/bundle-with-another-original.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/bundle-with-another-original.js
new file mode 100644
index 0000000000..a09b38f0d5
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/bundle-with-another-original.js
@@ -0,0 +1,110 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports, __webpack_require__) {
+
+__webpack_require__(1);
+module.exports = __webpack_require__(2);
+
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports) {
+
+// This content of this file is added before that of original-with-no-update.js in the generated file
+// bundle-with-another-original.js, its main goal is to just cause the content of the generated file to change.
+function funcA() {
+ funcB();
+ funcC();
+}
+
+function funcB() {
+ console.log("Hello!");
+}
+
+function funcC() {
+ console.log("You made it!");
+}
+funcA();
+
+/***/ }),
+/* 2 */
+/***/ (function(module, exports) {
+
+window.baabar = function baabar() {
+ return new Promise(resolve => setTimeout(resolve, 100));
+};
+
+window.foobar = async function foobar() {
+ await baabar();
+ console.log("YO");
+};
+foobar();
+
+/***/ })
+/******/ ]);
+//# sourceMappingURL=bundle-with-another-original.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/bundle-with-another-original.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/bundle-with-another-original.js.map
new file mode 100644
index 0000000000..9513b425bf
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/bundle-with-another-original.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack:///webpack/bootstrap 389a5d9f33df08ebbd6c","webpack:///./another-original.js","webpack:///./original-with-no-update.js"],"names":["funcA","funcB","funcC","console","log","window","baabar","Promise","resolve","setTimeout","foobar"],"mappings":";QAAA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;;QAEA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;;;QAGA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA,KAAK;QACL;QACA;;QAEA;QACA;QACA;QACA,2BAA2B,0BAA0B,EAAE;QACvD,iCAAiC,eAAe;QAChD;QACA;QACA;;QAEA;QACA,sDAAsD,+DAA+D;;QAErH;QACA;;QAEA;QACA;;;;;;;;;;;;;;;AC7DA;AACA;AACA,SAASA,KAAT,GAAiB;AACfC;AACAC;AACD;;AAED,SAASD,KAAT,GAAiB;AACfE,UAAQC,GAAR,CAAY,QAAZ;AACD;;AAED,SAASF,KAAT,GAAiB;AACfC,UAAQC,GAAR,CAAY,cAAZ;AACD;AACDJ,Q;;;;;;ACdAK,OAAOC,MAAP,GAAgB,SAASA,MAAT,GAAkB;AAChC,SAAO,IAAIC,OAAJ,CAAYC,WAAWC,WAAWD,OAAX,EAAoB,GAApB,CAAvB,CAAP;AACD,CAFD;;AAIAH,OAAOK,MAAP,GAAgB,eAAeA,MAAf,GAAwB;AACtC,QAAMJ,QAAN;AACAH,UAAQC,GAAR,CAAY,IAAZ;AACD,CAHD;AAIAM,S","file":"bundle-with-another-original.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 389a5d9f33df08ebbd6c","// This content of this file is added before that of original-with-no-update.js in the generated file\n// bundle-with-another-original.js, its main goal is to just cause the content of the generated file to change.\nfunction funcA() {\n funcB();\n funcC();\n}\n\nfunction funcB() {\n console.log(\"Hello!\");\n}\n\nfunction funcC() {\n console.log(\"You made it!\");\n}\nfuncA();\n\n\n\n// WEBPACK FOOTER //\n// ./another-original.js","window.baabar = function baabar() {\n return new Promise(resolve => setTimeout(resolve, 100))\n}\n\nwindow.foobar = async function foobar() {\n await baabar();\n console.log(\"YO\")\n}\nfoobar();\n\n\n\n// WEBPACK FOOTER //\n// ./original-with-no-update.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/bundle.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/bundle.js
new file mode 100644
index 0000000000..46b60e9164
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/bundle.js
@@ -0,0 +1,93 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = __webpack_require__(1);
+
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports) {
+
+window.bar = function bar() {
+ return new Promise(resolve => setTimeout(resolve, 100));
+};
+
+// New comment
+// to add some
+// non-breakable lines
+window.foo = async function foo() {
+ await bar();
+ console.log("YO");
+};
+
+console.log("HEY");
+
+/***/ })
+/******/ ]);
+//# sourceMappingURL=bundle.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/bundle.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/bundle.js.map
new file mode 100644
index 0000000000..75b4d8e101
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/bundle.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack:///webpack/bootstrap c1aed864c247e6fa3c67","webpack:///./original.js"],"names":["window","bar","Promise","resolve","setTimeout","foo","console","log"],"mappings":";QAAA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;;QAEA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;;;QAGA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA,KAAK;QACL;QACA;;QAEA;QACA;QACA;QACA,2BAA2B,0BAA0B,EAAE;QACvD,iCAAiC,eAAe;QAChD;QACA;QACA;;QAEA;QACA,sDAAsD,+DAA+D;;QAErH;QACA;;QAEA;QACA;;;;;;;;;;;;;;AC7DAA,OAAOC,GAAP,GAAa,SAASA,GAAT,GAAe;AAC1B,SAAO,IAAIC,OAAJ,CAAYC,WAAWC,WAAWD,OAAX,EAAoB,GAApB,CAAvB,CAAP;AACD,CAFD;;AAIA;AACA;AACA;AACAH,OAAOK,GAAP,GAAa,eAAeA,GAAf,GAAqB;AAChC,QAAMJ,KAAN;AACAK,UAAQC,GAAR,CAAY,IAAZ;AACD,CAHD;;AAKAD,QAAQC,GAAR,CAAY,KAAZ,E","file":"bundle.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap c1aed864c247e6fa3c67","window.bar = function bar() {\n return new Promise(resolve => setTimeout(resolve, 100))\n}\n\n// New comment\n// to add some\n// non-breakable lines\nwindow.foo = async function foo() {\n await bar();\n console.log(\"YO\")\n}\n\nconsole.log(\"HEY\")\n\n\n\n// WEBPACK FOOTER //\n// ./original.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/iframe.html b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/iframe.html
new file mode 100644
index 0000000000..04a2094e0d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/iframe.html
@@ -0,0 +1,29 @@
+<!-- Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ -->
+<!doctype html>
+
+<html>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Iframe v2</title>
+ </head>
+
+ <body>
+ <!-- A simple inline script, that helps to cover breakable lines/columns -->
+ <!-- Have them define first, so that we avoid shifting lines when adding new scripts later in the html -->
+ <script>
+ console.log('iframe breakable-line');
+ // Comment
+ </script>
+
+ <!-- A second inline script, that helps cover bugs when having two distinct inline scripts -->
+ <script>
+ console.log("second iframe inline script");
+ // Another comment
+ </script>
+
+ <!-- A script whose URL is loaded in many different ways -->
+ <script src="same-url.sjs"></script>
+ </body>
+
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/index.html b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/index.html
new file mode 100644
index 0000000000..7467a29687
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/index.html
@@ -0,0 +1,32 @@
+<!-- Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ -->
+<!doctype html>
+
+<html>
+ <!-- A simple script -->
+ <script src="script.js"></script>
+
+ <!-- A bundle/generated source that contains an updated version of original.js -->
+ <script src="bundle.js"></script>
+
+ <!-- A bundle/generated source that contains original-with-no-update.js as well as content from a newly added another-original.js -->
+ <script src="bundle-with-another-original.js"></script>
+
+ <!-- Another bundle/generated source that contains new-original.js which replaced the content of removed-original.js -->
+ <script src="replaced-bundle.js"></script>
+ <head>
+ <meta charset="utf-8"/>
+ <title>Empty test page 2</title>
+ </head>
+
+ <body>
+ <!-- A simple inline script, that helps to cover breakable lines/columns -->
+ <script>
+ console.log('breakable-line');
+ // Comment
+ </script>
+
+ <iframe src="iframe.html"></script>
+ </body>
+
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/new-original.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/new-original.js
new file mode 100644
index 0000000000..4b67c21be1
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/new-original.js
@@ -0,0 +1,6 @@
+// Pad the name with "_" in order to match the same length as v1/removed-original.js
+// and set the column breakpoints on the same column!
+window.____newOriginal = function ____newOriginal() {
+ console.log("New original");
+}
+window.____newOriginal();
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/original-with-no-update.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/original-with-no-update.js
new file mode 100644
index 0000000000..9fd6ecf110
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/original-with-no-update.js
@@ -0,0 +1,9 @@
+window.baabar = function baabar() {
+ return new Promise(resolve => setTimeout(resolve, 100))
+}
+
+window.foobar = async function foobar() {
+ await baabar();
+ console.log("YO")
+}
+foobar();
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/original.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/original.js
new file mode 100644
index 0000000000..fd36b53b56
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/original.js
@@ -0,0 +1,13 @@
+window.bar = function bar() {
+ return new Promise(resolve => setTimeout(resolve, 100))
+}
+
+// New comment
+// to add some
+// non-breakable lines
+window.foo = async function foo() {
+ await bar();
+ console.log("YO")
+}
+
+console.log("HEY")
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/replaced-bundle.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/replaced-bundle.js
new file mode 100644
index 0000000000..040909d520
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/replaced-bundle.js
@@ -0,0 +1,86 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = __webpack_require__(1);
+
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports) {
+
+// Pad the name with "_" in order to match the same length as v1/removed-original.js
+// and set the column breakpoints on the same column!
+window.____newOriginal = function ____newOriginal() {
+ console.log("New original");
+};
+window.____newOriginal();
+
+/***/ })
+/******/ ]);
+//# sourceMappingURL=replaced-bundle.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/replaced-bundle.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/replaced-bundle.js.map
new file mode 100644
index 0000000000..74cac8bb85
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/replaced-bundle.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack:///webpack/bootstrap 94a35eb61033f6e1078b","webpack:///./new-original.js"],"names":["window","____newOriginal","console","log"],"mappings":";QAAA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;;QAEA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;;;QAGA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA,KAAK;QACL;QACA;;QAEA;QACA;QACA;QACA,2BAA2B,0BAA0B,EAAE;QACvD,iCAAiC,eAAe;QAChD;QACA;QACA;;QAEA;QACA,sDAAsD,+DAA+D;;QAErH;QACA;;QAEA;QACA;;;;;;;;;;;;;;AC7DA;AACA;AACAA,OAAOC,eAAP,GAAyB,SAASA,eAAT,GAA2B;AAClDC,UAAQC,GAAR,CAAY,cAAZ;AACD,CAFD;AAGAH,OAAOC,eAAP,G","file":"replaced-bundle.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 94a35eb61033f6e1078b","// Pad the name with \"_\" in order to match the same length as v1/removed-original.js\n// and set the column breakpoints on the same column!\nwindow.____newOriginal = function ____newOriginal() {\n console.log(\"New original\");\n}\nwindow.____newOriginal();\n\n\n\n// WEBPACK FOOTER //\n// ./new-original.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/script.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/script.js
new file mode 100644
index 0000000000..5c55c1e859
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/script.js
@@ -0,0 +1,22 @@
+// Single line comment <<=== this is line 1
+console.log("body instruction");
+/* Multi
+* line
+* comment
+*/
+function bodyFunction() {
+ // Inline comment
+ /* Inline
+ * multiline comment
+ */
+ function inlineFunction() {
+ console.log("nested instruction");
+ }
+ const inlineCount = 1;
+ let inlineLet = 2;
+ var inlineVar = 3;
+ console.log("inline instruction");
+}
+const bodyCount = 1;
+let bodyLet = 2;
+var bodyVar = 3;
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/webpack.config.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/webpack.config.js
new file mode 100644
index 0000000000..88afb5b73e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v2/webpack.config.js
@@ -0,0 +1,54 @@
+const path = require("path");
+const webpack = require("webpack");
+
+const config = {
+ devtool: "sourcemap",
+};
+
+if (webpack.version && webpack.version[0] === "4") {
+ // Webpack 3, used in sourcemaps-reload-uncompressed, doesn't support mode attribute.
+ // Webpack 4, used in sourcemaps-reload-compressed we want production mode in order to compress the sources
+ config.mode = "production";
+} else {
+ // Also Webpack 4 doesn't support the module.loaders attribute
+ config.module = {
+ loaders: [
+ {
+ test: /\.js$/,
+ exclude: /node_modules/,
+ loader: "babel-loader",
+ },
+ ],
+ };
+}
+
+const originalBundle = Object.assign({}, config, {
+ entry: [path.join(__dirname, "original.js")],
+ output: {
+ path: __dirname,
+ filename: "bundle.js",
+ },
+});
+
+const bundleWithAnotherOriginalFile = Object.assign({}, config, {
+ entry: [
+ // This should cause the content of `original-with-no-update.js`
+ // to shift in the new `bundle-with-another-original.js` generated.
+ path.join(__dirname, "another-original.js"),
+ path.join(__dirname, "original-with-no-update.js")
+ ],
+ output: {
+ path: __dirname,
+ filename: "bundle-with-another-original.js"
+ }
+});
+
+const replacedBundle = Object.assign({}, config, {
+ entry: [path.join(__dirname, "new-original.js")],
+ output: {
+ path: __dirname,
+ filename: "replaced-bundle.js",
+ },
+});
+
+module.exports = [originalBundle, bundleWithAnotherOriginalFile, replacedBundle];
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v3/bundle.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v3/bundle.js
new file mode 100644
index 0000000000..b28b0517c8
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v3/bundle.js
@@ -0,0 +1,83 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports, __webpack_require__) {
+
+module.exports = __webpack_require__(1);
+
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports) {
+
+window.bar = function bar() {
+ return new Promise(resolve => setTimeout(resolve, 100));
+};
+
+/***/ })
+/******/ ]);
+//# sourceMappingURL=bundle.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v3/bundle.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v3/bundle.js.map
new file mode 100644
index 0000000000..417c3e42a8
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v3/bundle.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack:///webpack/bootstrap b429206701f1760b6d43","webpack:///./original.js"],"names":["window","bar","Promise","resolve","setTimeout"],"mappings":";QAAA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;;QAEA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;;;QAGA;QACA;;QAEA;QACA;;QAEA;QACA;QACA;QACA;QACA;QACA;QACA;QACA,KAAK;QACL;QACA;;QAEA;QACA;QACA;QACA,2BAA2B,0BAA0B,EAAE;QACvD,iCAAiC,eAAe;QAChD;QACA;QACA;;QAEA;QACA,sDAAsD,+DAA+D;;QAErH;QACA;;QAEA;QACA;;;;;;;;;;;;;;AC7DAA,OAAOC,GAAP,GAAa,SAASA,GAAT,GAAe;AAC1B,SAAO,IAAIC,OAAJ,CAAYC,WAAWC,WAAWD,OAAX,EAAoB,GAApB,CAAvB,CAAP;AACD,CAFD,C","file":"bundle.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap b429206701f1760b6d43","window.bar = function bar() {\n return new Promise(resolve => setTimeout(resolve, 100))\n}\n\n\n\n// WEBPACK FOOTER //\n// ./original.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v3/index.html b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v3/index.html
new file mode 100644
index 0000000000..112f73aff1
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v3/index.html
@@ -0,0 +1,17 @@
+<!-- Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ -->
+<!doctype html>
+
+<html>
+ <!-- A bundle/generated source that contains yet another version of original.js -->
+ <script src="bundle.js"></script>
+
+ <head>
+ <meta charset="utf-8"/>
+ <title>Empty test page 3</title>
+ </head>
+
+ <body>
+ </body>
+
+</html>
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v3/original.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v3/original.js
new file mode 100644
index 0000000000..2268b51134
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v3/original.js
@@ -0,0 +1,3 @@
+window.bar = function bar() {
+ return new Promise(resolve => setTimeout(resolve, 100))
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v3/webpack.config.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v3/webpack.config.js
new file mode 100644
index 0000000000..df554beb0d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-reload-uncompressed/v3/webpack.config.js
@@ -0,0 +1,31 @@
+const path = require("path");
+const webpack = require("webpack");
+
+const config = {
+ devtool: "sourcemap",
+};
+
+if (webpack.version && webpack.version[0] === "4") {
+ // Webpack 3, used in sourcemaps-reload-uncompressed, doesn't support mode attribute.
+ // Webpack 4, used in sourcemaps-reload-compressed we want production mode in order to compress the sources
+ config.mode = "production";
+} else {
+ // Also Webpack 4 doesn't support the module.loaders attribute
+ config.module = {
+ loaders: [
+ {
+ test: /\.js$/,
+ exclude: /node_modules/,
+ loader: "babel-loader",
+ },
+ ],
+ };
+}
+
+module.exports = Object.assign({}, config, {
+ entry: [path.join(__dirname, "original.js")],
+ output: {
+ path: __dirname,
+ filename: "bundle.js",
+ },
+});
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/bundle.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/bundle.js
new file mode 100644
index 0000000000..90d153a657
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/bundle.js
@@ -0,0 +1,35 @@
+(function () {
+ 'use strict';
+
+ function original1() {
+ debugger;
+ console.log("The first original source");
+ }
+
+ function original2() {
+ debugger;
+ console.log("The second original source");
+ }
+
+ function original3() {
+ debugger;
+ console.log("The third original source");
+ }
+
+ function original4() {
+ debugger;
+ console.log("The fourth original source");
+ }
+
+ function original5() {
+ console.log("The fifth original source");
+ }
+
+ original1();
+ original2();
+ original3();
+ original4();
+ original5();
+
+})();
+//# sourceMappingURL=bundle.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/bundle.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/bundle.js.map
new file mode 100644
index 0000000000..f4089bdc80
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/bundle.js.map
@@ -0,0 +1 @@
+{"version":3,"file":"bundle.js","sources":["src/original-1.js","src/original-2.js","src/original-3.js","src/original-4.js","src/original-5.js","src/index.js"],"sourcesContent":["export default function original1() {\n debugger;\n console.log(\"The first original source\");\n}","export default function original2() {\n debugger;\n console.log(\"The second original source\");\n}","export default function original3() {\n debugger;\n console.log(\"The third original source\");\n}","export default function original4() {\n debugger;\n console.log(\"The fourth original source\");\n}","export default function original5() {\n console.log(\"The fifth original source\");\n}","import original1 from \"./original-1\";\nimport original2 from \"./original-2\";\nimport original3 from \"./original-3\";\nimport original4 from \"./original-4\";\nimport original5 from \"./original-5\";\n\noriginal1();\noriginal2();\noriginal3();\noriginal4();\noriginal5();"],"names":[],"mappings":";;;EAAe,SAAS,SAAS,GAAG;EACpC,EAAE,SAAS;EACX,EAAE,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;EAC3C;;ECHe,SAAS,SAAS,GAAG;EACpC,EAAE,SAAS;EACX,EAAE,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;EAC5C;;ECHe,SAAS,SAAS,GAAG;EACpC,EAAE,SAAS;EACX,EAAE,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;EAC3C;;ECHe,SAAS,SAAS,GAAG;EACpC,EAAE,SAAS;EACX,EAAE,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;EAC5C;;ECHe,SAAS,SAAS,GAAG;EACpC,EAAE,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;EAC3C;;ECIA,SAAS,EAAE,CAAC;EACZ,SAAS,EAAE,CAAC;EACZ,SAAS,EAAE,CAAC;EACZ,SAAS,EAAE,CAAC;EACZ,SAAS,EAAE;;;;;;","x_google_ignoreList":[0,2]} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/package.json b/devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/package.json
new file mode 100644
index 0000000000..90faefd706
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/package.json
@@ -0,0 +1,15 @@
+{
+ "name": "sourcemaps-with-ignorelist",
+ "version": "1.0.0",
+ "description": "An example fixture used for testing sourcemaps with the ignorelist",
+ "main": "bundle.js",
+ "author": "Hubert B Manilla <hmanilla@mozilla.com>",
+ "license": "MIT",
+ "type": "module",
+ "scripts": {
+ "build": "rollup --config"
+ },
+ "devDependencies": {
+ "rollup": "^3.20.2"
+ }
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/rollup.config.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/rollup.config.js
new file mode 100644
index 0000000000..9da39d5be6
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/rollup.config.js
@@ -0,0 +1,14 @@
+
+export default {
+ input: 'src/index.js',
+ output: {
+ file: 'bundle.js',
+ format: 'iife',
+ sourcemap: true,
+ sourcemapIgnoreList: (relativeSourcePath) => {
+ // Adding original-1.js and original-3.js to the ignore list should cause these files to
+ // be ignored by the devtools and their debugger statements should not be hit.
+ return ['original-1', 'original-3'].some(fileName => relativeSourcePath.includes(fileName));
+ },
+ },
+}; \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/src/index.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/src/index.js
new file mode 100644
index 0000000000..272d4a4d77
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/src/index.js
@@ -0,0 +1,11 @@
+import original1 from "./original-1";
+import original2 from "./original-2";
+import original3 from "./original-3";
+import original4 from "./original-4";
+import original5 from "./original-5";
+
+original1();
+original2();
+original3();
+original4();
+original5(); \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/src/original-1.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/src/original-1.js
new file mode 100644
index 0000000000..8be0459aad
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/src/original-1.js
@@ -0,0 +1,4 @@
+export default function original1() {
+ debugger;
+ console.log("The first original source");
+} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/src/original-2.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/src/original-2.js
new file mode 100644
index 0000000000..6ee2549e71
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/src/original-2.js
@@ -0,0 +1,4 @@
+export default function original2() {
+ debugger;
+ console.log("The second original source");
+} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/src/original-3.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/src/original-3.js
new file mode 100644
index 0000000000..2bdf76627c
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/src/original-3.js
@@ -0,0 +1,4 @@
+export default function original3() {
+ debugger;
+ console.log("The third original source");
+} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/src/original-4.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/src/original-4.js
new file mode 100644
index 0000000000..080775cbaa
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/src/original-4.js
@@ -0,0 +1,4 @@
+export default function original4() {
+ debugger;
+ console.log("The fourth original source");
+} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/src/original-5.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/src/original-5.js
new file mode 100644
index 0000000000..cb2cb94f26
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-with-ignorelist/src/original-5.js
@@ -0,0 +1,3 @@
+export default function original5() {
+ console.log("The fifth original source");
+} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-with-sections/xbundle.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps-with-sections/xbundle.js
new file mode 100644
index 0000000000..f1024e2ef4
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-with-sections/xbundle.js
@@ -0,0 +1,7 @@
+"use strict";
+
+setInterval(function () {
+ console.log("about to throw");
+ throw new Error('error');
+}, 1000);
+//# sourceMappingURL=xbundle.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps-with-sections/xbundle.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemaps-with-sections/xbundle.js.map
new file mode 100644
index 0000000000..64da30fbb2
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps-with-sections/xbundle.js.map
@@ -0,0 +1,25 @@
+{
+ "version": 3,
+ "file": "xbundle.js",
+ "sections": [
+ {
+ "offset": {
+ "line": 0,
+ "column": 0
+ },
+ "map": {
+ "version": 3,
+ "sources": [
+ "xsource.js"
+ ],
+ "names": [],
+ "mappings": ";;AAAA,WAAW,CAAC,YAAK;AAChB,QAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AAC9B,OAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;CACzB,EAAE,IAAI,CAAC,CAAC",
+ "file": "xbundle.js",
+ "sourceRoot": "src",
+ "sourcesContent": [
+ "setInterval(() =>{\n\tconsole.log(\"about to throw\");\n\tthrow new Error('error');\n}, 1000);\n"
+ ]
+ }
+ }
+ ]
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps/bundle.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps/bundle.js
new file mode 100644
index 0000000000..a03ace9348
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps/bundle.js
@@ -0,0 +1,96 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId])
+/******/ return installedModules[moduleId].exports;
+/******/
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ exports: {},
+/******/ id: moduleId,
+/******/ loaded: false
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.loaded = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(0);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ function(module, exports, __webpack_require__) {
+
+ const times2 = __webpack_require__(1);
+ const { output } = __webpack_require__(2);
+ const opts = __webpack_require__(3);
+
+ output(times2(1));
+ output(times2(2));
+
+ if(opts.extra) {
+ output(times2(3));
+ }
+
+ window.keepMeAlive = function() {
+ // This function exists to make sure this script is never garbage
+ // collected. It is also callable from tests.
+ return times2(4);
+ }
+
+
+/***/ },
+/* 1 */
+/***/ function(module, exports) {
+
+ module.exports = function(x) {
+ return x * 2;
+ }
+
+
+/***/ },
+/* 2 */
+/***/ function(module, exports) {
+
+ function output(str) {
+ console.log(str);
+ }
+
+ module.exports = { output };
+
+
+/***/ },
+/* 3 */
+/***/ function(module, exports) {
+
+ module.exports = {
+ extra: true
+ };
+
+
+/***/ }
+/******/ ]);
+//# sourceMappingURL=bundle.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps/bundle.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemaps/bundle.js.map
new file mode 100644
index 0000000000..f53036cb8e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps/bundle.js.map
@@ -0,0 +1,21 @@
+{
+ "version": 3,
+ "sources": [
+ "webpack:///webpack/bootstrap 4ef8c7ec7c1df790781e",
+ "webpack:///./entry.js",
+ "webpack:///./times2.js",
+ "webpack:///./output.js",
+ "webpack:///./opts.js"
+ ],
+ "names": [],
+ "mappings": ";AAAA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;ACtCA;AACA,QAAO,SAAS;AAChB;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;;;;;ACfA;AACA;AACA;;;;;;;ACFA;AACA;AACA;;AAEA,mBAAkB;;;;;;;ACJlB;AACA;AACA",
+ "file": "bundle.js",
+ "sourcesContent": [
+ " \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 4ef8c7ec7c1df790781e",
+ "const times2 = require(\"./times2\");\nconst { output } = require(\"./output\");\nconst opts = require(\"./opts\");\n\noutput(times2(1));\noutput(times2(2));\n\nif(opts.extra) {\n output(times2(3));\n}\n\nwindow.keepMeAlive = function() {\n // This function exists to make sure this script is never garbage\n // collected. It is also callable from tests.\n return times2(4);\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./entry.js\n// module id = 0\n// module chunks = 0",
+ "module.exports = function(x) {\n return x * 2;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./times2.js\n// module id = 1\n// module chunks = 0",
+ "function output(str) {\n console.log(str);\n}\n\nmodule.exports = { output };\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./output.js\n// module id = 2\n// module chunks = 0",
+ "module.exports = {\n extra: true\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./opts.js\n// module id = 3\n// module chunks = 0"
+ ],
+ "sourceRoot": ""
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps2/main.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps2/main.js
new file mode 100644
index 0000000000..23fb2fabf1
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps2/main.js
@@ -0,0 +1,15 @@
+var message = document.getElementById('message');
+
+function logMessage() {
+ console.log('message is: ' + message.value);
+}
+
+message.addEventListener('focus', function() {
+ message.value = '';
+}, false);
+
+var logMessageButton = document.getElementById('log-message');
+
+logMessageButton.addEventListener('click', function() {
+ logMessage();
+}, false);
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps2/main.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemaps2/main.js.map
new file mode 100644
index 0000000000..647786d39b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps2/main.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["main.js"],"names":["message","document","getElementById","logMessage","console","log","value","addEventListener","logMessageButton"],"mappings":"AAAA,GAAIA,SAAUC,SAASC,eAAe,UAEtC,SAASC,cACPC,QAAQC,IAAI,eAAiBL,QAAQM,OAGvCN,QAAQO,iBAAiB,QAAS,WAChCP,QAAQM,MAAQ,IACf,MAEH,IAAIE,kBAAmBP,SAASC,eAAe,cAE/CM,kBAAiBD,iBAAiB,QAAS,WACzCJ,cACC"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps2/main.min.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps2/main.min.js
new file mode 100644
index 0000000000..718837f4b7
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps2/main.min.js
@@ -0,0 +1,2 @@
+var message=document.getElementById("message");function logMessage(){console.log("message is: "+message.value)}message.addEventListener("focus",function(){message.value=""},false);var logMessageButton=document.getElementById("log-message");logMessageButton.addEventListener("click",function(){logMessage()},false);
+//# sourceMappingURL=main.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps3/.babelrc b/devtools/client/debugger/test/mochitest/examples/sourcemaps3/.babelrc
new file mode 100644
index 0000000000..01fd19076e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps3/.babelrc
@@ -0,0 +1 @@
+ { "presets": [ "es2015" ] }
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps3/.gitignore b/devtools/client/debugger/test/mochitest/examples/sourcemaps3/.gitignore
new file mode 100644
index 0000000000..504afef81f
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps3/.gitignore
@@ -0,0 +1,2 @@
+node_modules/
+package-lock.json
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps3/README.md b/devtools/client/debugger/test/mochitest/examples/sourcemaps3/README.md
new file mode 100644
index 0000000000..71933217b0
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps3/README.md
@@ -0,0 +1,4 @@
+How to update?
+
+$ yarn
+$ yarn run webpack
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps3/bundle.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps3/bundle.js
new file mode 100644
index 0000000000..a16c05500d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps3/bundle.js
@@ -0,0 +1,2 @@
+!function(n){function e(t){if(r[t])return r[t].exports;var o=r[t]={i:t,l:!1,exports:{}};return n[t].call(o.exports,o,o.exports,e),o.l=!0,o.exports}var r={};e.m=n,e.c=r,e.d=function(n,r,t){e.o(n,r)||Object.defineProperty(n,r,{configurable:!1,enumerable:!0,get:t})},e.n=function(n){var r=n&&n.__esModule?function(){return n.default}:function(){return n};return e.d(r,"a",r),r},e.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},e.p="",e(e.s=0)}([function(n,e,r){"use strict";var t=r(1);window.test=function(){var n=["b (30)","a","b (5)","z"],e=(0,t.fancySort)(n);console.log(e)}},function(n,e,r){"use strict";function t(n,e){var r=/.(\d+)\W*$/.exec(n),t=/.(\d+)\W*$/.exec(e);if(null==r||null==t||r[1]==t[1])return n<e?-1:n>e?1:0;var o=+r[1],u=+t[1];return o<u?-1:o>u?1:0}function o(n,e,r){if(0==n.length)return{found:!1,index:0};for(var t=0,o=n.length-1;t<o;){var u=Math.floor((t+o)/2);r(n[u],e)<0?t=u+1:o=u}var c=r(n[t],e);return 0===c?{found:!0,index:t}:{found:!1,index:c<0?t+1:t}}function u(n){return n.reduce(function(n,e){var r=o(n,e,t),u=r.index;return n.splice(u,0,e),n},[])}Object.defineProperty(e,"__esModule",{value:!0}),e.fancySort=u}]);
+//# sourceMappingURL=bundle.js.map \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps3/bundle.js.map b/devtools/client/debugger/test/mochitest/examples/sourcemaps3/bundle.js.map
new file mode 100644
index 0000000000..1769f67f7d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps3/bundle.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack:///bundle.js","webpack:///webpack/bootstrap 24c582683c5b4b6a8192","webpack:///./test.js","webpack:///./sorted.js"],"names":["modules","__webpack_require__","moduleId","installedModules","exports","module","i","l","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","window","test","result","fancySort","console","log","comparer","a","b","ma","exec","mb","na","nb","binaryLookup","ar","length","found","index","r","mid","Math","floor","input","reduce","splice","value"],"mappings":"CAAS,SAAUA,GCIjB,QAASC,GAAoBC,GAG5B,GAAGC,EAAiBD,GACnB,MAAOC,GAAiBD,GAAUE,OAGnC,IAAIC,GAASF,EAAiBD,IAC7BI,EAAGJ,EACHK,GAAG,EACHH,WAUD,OANAJ,GAAQE,GAAUM,KAAKH,EAAOD,QAASC,EAAQA,EAAOD,QAASH,GAG/DI,EAAOE,GAAI,EAGJF,EAAOD,QAvBf,GAAID,KA4BJF,GAAoBQ,EAAIT,EAGxBC,EAAoBS,EAAIP,EAGxBF,EAAoBU,EAAI,SAASP,EAASQ,EAAMC,GAC3CZ,EAAoBa,EAAEV,EAASQ,IAClCG,OAAOC,eAAeZ,EAASQ,GAC9BK,cAAc,EACdC,YAAY,EACZC,IAAKN,KAMRZ,EAAoBmB,EAAI,SAASf,GAChC,GAAIQ,GAASR,GAAUA,EAAOgB,WAC7B,WAAwB,MAAOhB,GAAgB,SAC/C,WAA8B,MAAOA,GAEtC,OADAJ,GAAoBU,EAAEE,EAAQ,IAAKA,GAC5BA,GAIRZ,EAAoBa,EAAI,SAASQ,EAAQC,GAAY,MAAOR,QAAOS,UAAUC,eAAejB,KAAKc,EAAQC,IAGzGtB,EAAoByB,EAAI,GAGjBzB,EAAoBA,EAAoB0B,EAAI,KDM/C,SAAUtB,EAAQD,EAASH,GAEjC,YErEA,WAEA2B,QAAOC,KAAO,WACZ,GAAIA,IAAQ,SAAU,IAAK,QAAS,KAChCC,GAAS,IAAAC,WAAUF,EACvBG,SAAQC,IAAIH,KF6ER,SAAUzB,EAAQD,EAASH,GAEjC,YGpFA,SAASiC,GAASC,EAAGC,GACnB,GAAMC,GAAK,aAAaC,KAAKH,GACvBI,EAAK,aAAaD,KAAKF,EAC7B,IAAU,MAANC,GAAoB,MAANE,GAAcF,EAAG,IAAME,EAAG,GAC1C,MAAOJ,GAAIC,GAAK,EAAID,EAAIC,EAAI,EAAI,CAEhC,IAAMI,IAAMH,EAAG,GACbI,GAAMF,EAAG,EACX,OAAOC,GAAKC,GAAM,EAAID,EAAKC,EAAK,EAAI,EAIxC,QAASC,GAAaC,EAAIrC,EAAG4B,GAC3B,GAAiB,GAAbS,EAAGC,OACL,OAASC,OAAO,EAAOC,MAAO,EAIhC,KAFA,GAAIvC,GAAI,EACNwC,EAAIJ,EAAGC,OAAS,EACXrC,EAAIwC,GAAG,CACZ,GAAMC,GAAMC,KAAKC,OAAO3C,EAAIwC,GAAK,EAC7Bb,GAASS,EAAGK,GAAM1C,GAAK,EACzBC,EAAIyC,EAAM,EAEVD,EAAIC,EAGR,GAAMlB,GAASI,EAASS,EAAGpC,GAAID,EAC/B,OAAe,KAAXwB,GACOe,OAAO,EAAMC,MAAOvC,IAG7BsC,OAAO,EACPC,MAAOhB,EAAS,EAAIvB,EAAI,EAAIA,GAIzB,QAASwB,GAAUoB,GACxB,MAAOA,GAAMC,OAAO,SAACT,EAAIrC,GAAM,MACXoC,EAAaC,EAAIrC,EAAG4B,GAA9BY,EADqB,EACrBA,KAER,OADAH,GAAGU,OAAOP,EAAO,EAAGxC,GACbqC,OH+CX5B,OAAOC,eAAeZ,EAAS,cAC7BkD,OAAO,IAETlD,EGtDgB2B","file":"bundle.js","sourcesContent":["/******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 0);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar _sorted = __webpack_require__(1);\n\nwindow.test = function originalTestName() {\n var test = [\"b (30)\", \"a\", \"b (5)\", \"z\"];\n var result = (0, _sorted.fancySort)(test);\n console.log(result);\n};\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.fancySort = fancySort;\nfunction comparer(a, b) {\n var ma = /.(\\d+)\\W*$/.exec(a);\n var mb = /.(\\d+)\\W*$/.exec(b);\n if (ma == null || mb == null || ma[1] == mb[1]) {\n return a < b ? -1 : a > b ? 1 : 0;\n } else {\n var na = +ma[1],\n nb = +mb[1];\n return na < nb ? -1 : na > nb ? 1 : 0;\n }\n}\n\nfunction binaryLookup(ar, i, comparer) {\n if (ar.length == 0) {\n return { found: false, index: 0 };\n }\n var l = 0,\n r = ar.length - 1;\n while (l < r) {\n var mid = Math.floor((l + r) / 2);\n if (comparer(ar[mid], i) < 0) {\n l = mid + 1;\n } else {\n r = mid;\n }\n }\n var result = comparer(ar[l], i);\n if (result === 0) {\n return { found: true, index: l };\n }\n return {\n found: false,\n index: result < 0 ? l + 1 : l\n };\n}\n\nfunction fancySort(input) {\n return input.reduce(function (ar, i) {\n var _binaryLookup = binaryLookup(ar, i, comparer),\n index = _binaryLookup.index;\n\n ar.splice(index, 0, i);\n return ar;\n }, []);\n}\n\n/***/ })\n/******/ ]);\n\n\n// WEBPACK FOOTER //\n// bundle.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 24c582683c5b4b6a8192","import { fancySort } from \"./sorted.js\";\n\nwindow.test = function originalTestName() {\n let test = [\"b (30)\", \"a\", \"b (5)\", \"z\"];\n let result = fancySort(test);\n console.log(result);\n};\n\n\n\n// WEBPACK FOOTER //\n// ./test.js","function comparer(a, b) {\n const ma = /.(\\d+)\\W*$/.exec(a);\n const mb = /.(\\d+)\\W*$/.exec(b);\n if (ma == null || mb == null || ma[1] == mb[1]) {\n return a < b ? -1 : a > b ? 1 : 0;\n } else {\n const na = +ma[1],\n nb = +mb[1];\n return na < nb ? -1 : na > nb ? 1 : 0;\n }\n}\n\nfunction binaryLookup(ar, i, comparer) {\n if (ar.length == 0) {\n return { found: false, index: 0 };\n }\n let l = 0,\n r = ar.length - 1;\n while (l < r) {\n const mid = Math.floor((l + r) / 2);\n if (comparer(ar[mid], i) < 0) {\n l = mid + 1;\n } else {\n r = mid;\n }\n }\n const result = comparer(ar[l], i);\n if (result === 0) {\n return { found: true, index: l };\n }\n return {\n found: false,\n index: result < 0 ? l + 1 : l\n };\n}\n\nexport function fancySort(input) {\n return input.reduce((ar, i) => {\n const { index } = binaryLookup(ar, i, comparer);\n ar.splice(index, 0, i);\n return ar;\n }, []);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./sorted.js"],"sourceRoot":""} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps3/package.json b/devtools/client/debugger/test/mochitest/examples/sourcemaps3/package.json
new file mode 100644
index 0000000000..0e2e2bf9fc
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps3/package.json
@@ -0,0 +1,19 @@
+{
+ "name": "sorted-es6",
+ "version": "1.0.0",
+ "description": "Rebuild assets for sourcemaps3 test",
+ "main": "sorted.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "keywords": [],
+ "author": "",
+ "license": "MPL-2.0",
+ "dependencies": {},
+ "devDependencies": {
+ "babel-core": "^6.26.0",
+ "babel-loader": "^7.1.2",
+ "babel-preset-es2015": "^6.24.1",
+ "webpack": "^3.7.1"
+ }
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps3/sorted.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps3/sorted.js
new file mode 100644
index 0000000000..2621b8f5a4
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps3/sorted.js
@@ -0,0 +1,43 @@
+function comparer(a, b) {
+ const ma = /.(\d+)\W*$/.exec(a);
+ const mb = /.(\d+)\W*$/.exec(b);
+ if (ma == null || mb == null || ma[1] == mb[1]) {
+ return a < b ? -1 : a > b ? 1 : 0;
+ } else {
+ const na = +ma[1],
+ nb = +mb[1];
+ return na < nb ? -1 : na > nb ? 1 : 0;
+ }
+}
+
+function binaryLookup(ar, i, comparer) {
+ if (ar.length == 0) {
+ return { found: false, index: 0 };
+ }
+ let l = 0,
+ r = ar.length - 1;
+ while (l < r) {
+ const mid = Math.floor((l + r) / 2);
+ if (comparer(ar[mid], i) < 0) {
+ l = mid + 1;
+ } else {
+ r = mid;
+ }
+ }
+ const result = comparer(ar[l], i);
+ if (result === 0) {
+ return { found: true, index: l };
+ }
+ return {
+ found: false,
+ index: result < 0 ? l + 1 : l
+ };
+}
+
+export function fancySort(input) {
+ return input.reduce((ar, i) => {
+ const { index } = binaryLookup(ar, i, comparer);
+ ar.splice(index, 0, i);
+ return ar;
+ }, []);
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps3/test.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps3/test.js
new file mode 100644
index 0000000000..13e80e583d
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps3/test.js
@@ -0,0 +1,7 @@
+import { fancySort } from "./sorted.js";
+
+window.test = function originalTestName() {
+ let test = ["b (30)", "a", "b (5)", "z"];
+ let result = fancySort(test);
+ console.log(result);
+};
diff --git a/devtools/client/debugger/test/mochitest/examples/sourcemaps3/webpack.config.js b/devtools/client/debugger/test/mochitest/examples/sourcemaps3/webpack.config.js
new file mode 100644
index 0000000000..c4b5f486d1
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sourcemaps3/webpack.config.js
@@ -0,0 +1,31 @@
+const path = require("path");
+const webpack = require("webpack");
+
+module.exports = {
+ entry: "./test.js",
+ output: {
+ path: __dirname,
+ filename: "bundle.js"
+ },
+ devtool: "sourcemap",
+ module: {
+ loaders: [
+ {
+ test: /\.js$/,
+ exclude: /node_modules/,
+ loader: "babel-loader"
+ }
+ ]
+ },
+ plugins: [
+ new webpack.optimize.UglifyJsPlugin({
+ compress: {
+ warnings: false
+ },
+ sourceMap: true,
+ output: {
+ comments: false
+ }
+ })
+ ]
+};
diff --git a/devtools/client/debugger/test/mochitest/examples/sum/sum.js b/devtools/client/debugger/test/mochitest/examples/sum/sum.js
new file mode 100644
index 0000000000..300dcb12f5
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sum/sum.js
@@ -0,0 +1,3 @@
+function sum(first, second) {
+ return first + second;
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/sum/sum.min.js b/devtools/client/debugger/test/mochitest/examples/sum/sum.min.js
new file mode 100644
index 0000000000..6cfa6064a3
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sum/sum.min.js
@@ -0,0 +1,2 @@
+function sum(n,u){return n+u}
+//# sourceMappingURL=sum.min.js.map
diff --git a/devtools/client/debugger/test/mochitest/examples/sum/sum.min.js.map b/devtools/client/debugger/test/mochitest/examples/sum/sum.min.js.map
new file mode 100644
index 0000000000..69480d32b6
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/sum/sum.min.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["sum.js"],"names":["sum","first","second"],"mappings":"AAAA,SAASA,IAAIC,EAAOC,GAClB,OAAOD,EAAQC"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/times2.js b/devtools/client/debugger/test/mochitest/examples/times2.js
new file mode 100644
index 0000000000..2d51ed87a8
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/times2.js
@@ -0,0 +1,3 @@
+module.exports = function(x) {
+ return x * 2;
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/top-level.js b/devtools/client/debugger/test/mochitest/examples/top-level.js
new file mode 100644
index 0000000000..72344876aa
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/top-level.js
@@ -0,0 +1,3 @@
+var obj = { foo: 1, bar: 2 };
+var func = 3;
+debugger;
diff --git a/devtools/client/debugger/test/mochitest/examples/trigger-gc.js b/devtools/client/debugger/test/mochitest/examples/trigger-gc.js
new file mode 100644
index 0000000000..900581b062
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/trigger-gc.js
@@ -0,0 +1,4 @@
+setTimeout(() => {
+ console.log("GC Triggered");
+ SpecialPowers.gc();
+}, 0);
diff --git a/devtools/client/debugger/test/mochitest/examples/wasm-sourcemaps/README.md b/devtools/client/debugger/test/mochitest/examples/wasm-sourcemaps/README.md
new file mode 100644
index 0000000000..4b4c269f57
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/wasm-sourcemaps/README.md
@@ -0,0 +1,20 @@
+# Building WebAssembly source with source maps
+
+First download and install WASI SDK:
+https://github.com/WebAssembly/wasi-sdk/blob/47e5865191c02a8943a1ce2dfb202167219435b8/README.md
+```
+export WASI_VERSION=12
+export WASI_VERSION_FULL=${WASI_VERSION}.0
+wget https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-${WASI_VERSION}/wasi-sdk-${WASI_VERSION_FULL}-linux.tar.gz
+tar xvf wasi-sdk-${WASI_VERSION_FULL}-linux.tar.gz
+
+export WASI_SDK_PATH=`pwd`/wasi-sdk-${WASI_VERSION_FULL}
+CC="${WASI_SDK_PATH}/bin/clang --sysroot=${WASI_SDK_PATH}/share/wasi-sysroot"
+```
+
+Then, build the wasm file + its source map file
+```
+$CC --target=wasm32-unknown-unknown-wasm -nostartfiles -nostdlib -Wl,-no-entry,--export=fib -g fib.c -o fib.wasm
+
+python3 wasm-sourcemap.py fib.wasm -o fib.wasm.map --dwarfdump=$WASI_SDK_PATH/bin/llvm-dwarfdump --source-map-url=https://example.com/browser/devtools/client/debugger/test/mochitest/examples/wasm-sourcemaps/fib.wasm.map -w fib.wasm
+```
diff --git a/devtools/client/debugger/test/mochitest/examples/wasm-sourcemaps/fib.c b/devtools/client/debugger/test/mochitest/examples/wasm-sourcemaps/fib.c
new file mode 100644
index 0000000000..19afc33c60
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/wasm-sourcemaps/fib.c
@@ -0,0 +1,17 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+void swap(int* a, int* b) {
+ int t = *a;
+ *a = *b;
+ *b = t;
+}
+
+int fib(int n) {
+ int i, t, a = 0, b = 1;
+ for (i = 0; i < n; i++) {
+ a += b;
+ swap(&a, &b);
+ }
+ return b;
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/wasm-sourcemaps/fib.debug.wasm b/devtools/client/debugger/test/mochitest/examples/wasm-sourcemaps/fib.debug.wasm
new file mode 100644
index 0000000000..be261987ae
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/wasm-sourcemaps/fib.debug.wasm
Binary files differ
diff --git a/devtools/client/debugger/test/mochitest/examples/wasm-sourcemaps/fib.wasm b/devtools/client/debugger/test/mochitest/examples/wasm-sourcemaps/fib.wasm
new file mode 100644
index 0000000000..d4b5d33416
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/wasm-sourcemaps/fib.wasm
Binary files differ
diff --git a/devtools/client/debugger/test/mochitest/examples/wasm-sourcemaps/fib.wasm.map b/devtools/client/debugger/test/mochitest/examples/wasm-sourcemaps/fib.wasm.map
new file mode 100644
index 0000000000..32e295cf56
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/wasm-sourcemaps/fib.wasm.map
@@ -0,0 +1 @@
+{"version":3,"names":[],"sources":["fib.c"],"sourcesContent":null,"mappings":"uEAGA,oCACW,OAAD,OAAJ,OACE,OAAD,OAAJ,OAAE,OACE,OAAJ,OAAE,OACL,CAAA,GAEA,6CACY,OAAO,OACV,OAAK,WAAI,OAAF,eAAd,8CACO,OAAH,qBACF,UAFkB,yBAApB,EAAA,EAIO,OAAP,sBAAA"} \ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/examples/webpack.config.js b/devtools/client/debugger/test/mochitest/examples/webpack.config.js
new file mode 100644
index 0000000000..ff22342ce1
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/webpack.config.js
@@ -0,0 +1,8 @@
+
+module.exports = {
+ entry: "./entry.js",
+ output: {
+ filename: "bundle.js"
+ },
+ devtool: "sourcemap"
+}
diff --git a/devtools/client/debugger/test/mochitest/examples/worker-exception.js b/devtools/client/debugger/test/mochitest/examples/worker-exception.js
new file mode 100644
index 0000000000..e3bebfefb2
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/examples/worker-exception.js
@@ -0,0 +1,4 @@
+self.onmessage = () => {
+ throw new Error("OH NO!");
+}
+nofunc();
diff --git a/devtools/client/debugger/test/mochitest/head.js b/devtools/client/debugger/test/mochitest/head.js
new file mode 100644
index 0000000000..6130e02133
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/head.js
@@ -0,0 +1,300 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/* eslint-disable no-unused-vars */
+
+"use strict";
+
+// This head.js file is only imported by debugger mochitests.
+// Anything that is meant to be used by tests of other panels should be moved to shared-head.js
+// Also, any symbol that may conflict with other test symbols should stay in head.js
+// (like EXAMPLE_URL)
+
+const EXAMPLE_URL =
+ "https://example.com/browser/devtools/client/debugger/test/mochitest/examples/";
+
+// This URL is remote compared to EXAMPLE_URL, as one uses .com and the other uses .org
+// Note that this depends on initDebugger to always use EXAMPLE_URL
+const EXAMPLE_REMOTE_URL =
+ "https://example.org/browser/devtools/client/debugger/test/mochitest/examples/";
+
+const EXAMPLE_URL_WITH_PORT =
+ "http://mochi.test:8888/browser/devtools/client/debugger/test/mochitest/examples/";
+
+// shared-head.js handles imports, constants, and utility functions
+Services.scriptloader.loadSubScript(
+ "chrome://mochitests/content/browser/devtools/client/shared/test/shared-head.js",
+ this
+);
+
+Services.scriptloader.loadSubScript(
+ "chrome://mochitests/content/browser/devtools/client/debugger/test/mochitest/shared-head.js",
+ this
+);
+
+Services.scriptloader.loadSubScript(
+ "chrome://mochitests/content/browser/devtools/client/webconsole/test/browser/shared-head.js",
+ this
+);
+
+// Clear preferences that may be set during the course of tests.
+registerCleanupFunction(() => {
+ info("finish() was called, cleaning up and clearing debugger preferences...");
+ Services.prefs.clearUserPref("devtools.debugger.map-scopes-enabled");
+});
+
+/**
+ * Helper function for `_loadAllIntegrationTests`.
+ *
+ * Implements this as a global method in order to please eslint.
+ * This will be used by modules loaded from "integration-tests" folder
+ * in order to register a new integration task, ran when executing `runAllIntegrationTests`.
+ */
+const integrationTasks = [];
+function addIntegrationTask(fun) {
+ integrationTasks.push(fun);
+}
+
+/**
+ * Helper function for `runAllIntegrationTests`.
+ *
+ * Loads all the modules from "integration-tests" folder and return
+ * all the task they implemented and registered by calling `addIntegrationTask`.
+ */
+function _loadAllIntegrationTests() {
+ const testsDir = getChromeDir(getResolvedURI(gTestPath));
+ testsDir.append("integration-tests");
+ const entries = testsDir.directoryEntries;
+ const urls = [];
+ while (entries.hasMoreElements()) {
+ const file = entries.nextFile;
+ const url = Services.io.newFileURI(file).spec;
+ if (url.endsWith(".js")) {
+ urls.push(url);
+ }
+ }
+
+ // We need to sort in order to run the test in a reliable order
+ urls.sort();
+
+ for (const url of urls) {
+ Services.scriptloader.loadSubScript(url, this);
+ }
+ return integrationTasks;
+}
+
+/**
+ * Method to be called by each integration tests which will
+ * run all the "integration tasks" implemented in files from the "integration-tests" folder.
+ * These files should call the `addIntegrationTask()` method to register something to run.
+ *
+ * @param {String} testFolder
+ * Define what folder in "examples" folder to load before opening the debugger.
+ * This is meant to be a versionized test folder with v1, v2, v3 folders.
+ * (See createVersionizedHttpTestServer())
+ * @param {Object} env
+ * Environment object passed down to each task to better know
+ * which particular integration test is being run.
+ */
+async function runAllIntegrationTests(testFolder, env) {
+ const tasks = _loadAllIntegrationTests();
+
+ const testServer = createVersionizedHttpTestServer("examples/" + testFolder);
+ const testUrl = testServer.urlFor("index.html");
+
+ for (const task of tasks) {
+ info(` ==> Running integration task '${task.name}'`);
+ await task(testServer, testUrl, env);
+ }
+}
+
+const INTEGRATION_TEST_PAGE_SOURCES = [
+ "index.html",
+ "iframe.html",
+ "script.js",
+ "onload.js",
+ "test-functions.js",
+ "query.js?x=1",
+ "query.js?x=2",
+ "query2.js?y=3",
+ "bundle.js",
+ "original.js",
+ "bundle-with-another-original.js",
+ "original-with-no-update.js",
+ "replaced-bundle.js",
+ "removed-original.js",
+ "named-eval.js",
+ "react-component-module.js",
+ // This is the JS file with encoded characters and custom protocol
+ "文字コード.js",
+ // Webpack generated some extra sources:
+ "bootstrap 3b1a221408fdde86aa49",
+ "bootstrap a1ecee2f86e1d0ea3fb5",
+ "bootstrap d343aa81956b90d9f67e",
+ // There is 3 occurences, one per target (main thread, worker and iframe).
+ // But there is even more source actors (named evals and duplicated script tags).
+ "same-url.sjs",
+ "same-url.sjs",
+];
+// The iframe one is only available when fission is enabled, or EFT
+if (isFissionEnabled() || isEveryFrameTargetEnabled()) {
+ INTEGRATION_TEST_PAGE_SOURCES.push("same-url.sjs");
+}
+
+/**
+ * Install a Web Extension which will run a content script against any test page
+ * served from https://example.com
+ *
+ * This content script is meant to be debuggable when devtools.chrome.enabled is true.
+ */
+async function installAndStartContentScriptExtension() {
+ function contentScript() {
+ console.log("content script loads");
+
+ // This listener prevents the source from being garbage collected
+ // and be missing from the scripts returned by `dbg.findScripts()`
+ // in `ThreadActor._discoverSources`.
+ window.onload = () => {};
+ }
+
+ const extension = ExtensionTestUtils.loadExtension({
+ manifest: {
+ name: "Test content script extension",
+ content_scripts: [
+ {
+ js: ["content_script.js"],
+ matches: ["https://example.com/*"],
+ run_at: "document_start",
+ },
+ ],
+ },
+ files: {
+ "content_script.js": contentScript,
+ },
+ });
+
+ await extension.startup();
+
+ return extension;
+}
+
+/**
+ * Return the text content for a given line in the Source Tree.
+ *
+ * @param {Object} dbg
+ * @param {Number} index
+ * Line number in the source tree
+ */
+function getSourceTreeLabel(dbg, index) {
+ return (
+ findElement(dbg, "sourceNode", index)
+ .textContent.trim()
+ // There is some special whitespace character which aren't removed by trim()
+ .replace(/^[\s\u200b]*/g, "")
+ );
+}
+
+/**
+ * Find and assert the source tree node with the specified text
+ * exists on the source tree.
+ *
+ * @param {Object} dbg
+ * @param {String} text The node text displayed
+ */
+async function assertSourceTreeNode(dbg, text) {
+ let node = null;
+ await waitUntil(() => {
+ node = findSourceNodeWithText(dbg, text);
+ return !!node;
+ });
+ ok(!!node, `Source tree node with text "${text}" exists`);
+}
+
+/**
+ * Assert precisely the list of all breakable line for a given source
+ *
+ * @param {Object} dbg
+ * @param {Object|String} file
+ * The source name or source object to review
+ * @param {Number} numberOfLines
+ * The expected number of lines for this source.
+ * @param {Array<Number>} breakableLines
+ * This list of all breakable line numbers
+ */
+async function assertBreakableLines(
+ dbg,
+ source,
+ numberOfLines,
+ breakableLines
+) {
+ await selectSource(dbg, source);
+ is(
+ getCM(dbg).lineCount(),
+ numberOfLines,
+ `We show the expected number of lines in CodeMirror for ${source}`
+ );
+ for (let line = 1; line <= numberOfLines; line++) {
+ assertLineIsBreakable(dbg, source, line, breakableLines.includes(line));
+ }
+}
+
+/**
+ * Helper alongside assertBreakable lines to ease defining list of breakable lines.
+ *
+ * @param {Number} start
+ * @param {Number} end
+ * @return {Array<Number>}
+ * Returns an array of decimal numbers starting from `start` and ending with `end`.
+ */
+function getRange(start, end) {
+ const range = [];
+ for (let i = start; i <= end; i++) {
+ range.push(i);
+ }
+ return range;
+}
+
+/**
+ * Wait for CodeMirror to start searching
+ */
+function waitForSearchState(dbg) {
+ const cm = getCM(dbg);
+ return waitFor(() => cm.state.search);
+}
+
+/**
+ * Get the currently selected line number displayed in the editor's footer.
+ */
+function assertCursorPosition(dbg, expectedLine, expectedColumn, message) {
+ const cursorPosition = findElementWithSelector(dbg, ".cursor-position");
+ if (!cursorPosition) {
+ ok(false, message + " (no cursor displayed)");
+ }
+ // Cursor position text has the following shape: (L, C)
+ // where L is the line number, and C the column number
+ const match = cursorPosition.innerText.match(/\((\d+), (\d+)\)/);
+ if (!match) {
+ ok(
+ false,
+ message + ` (wrong cursor content : '${cursorPosition.innerText}')`
+ );
+ }
+ const [_, line, column] = match;
+ is(parseInt(line, 10), expectedLine, message + " (line)");
+ is(parseInt(column, 10), expectedColumn, message + " (column)");
+}
+
+async function waitForCursorPosition(dbg, expectedLine) {
+ return waitFor(() => {
+ const cursorPosition = findElementWithSelector(dbg, ".cursor-position");
+ if (!cursorPosition) {
+ return false;
+ }
+ const { innerText } = cursorPosition;
+ // Cursor position text has the following shape: (L, C)
+ // where L is the line number, and C the column number
+ const line = innerText.substring(1, innerText.indexOf(","));
+ return parseInt(line, 10) == expectedLine;
+ });
+}
diff --git a/devtools/client/debugger/test/mochitest/integration-tests/1-reload-same-original.js b/devtools/client/debugger/test/mochitest/integration-tests/1-reload-same-original.js
new file mode 100644
index 0000000000..57e65b9ea6
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/integration-tests/1-reload-same-original.js
@@ -0,0 +1,166 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/* import-globals-from ../head.js */
+
+/**
+ * This first test will focus on original.js file whose content changes
+ * which affects the related generated file: bundle.js
+ *
+ * In the first reload, v2/original.js will only change with new lines being added
+ * before the line where we set a breakpoint. So that the breakpoint, if not
+ * automatically shifted, will now be against an empty line.
+ *
+ * In the second reload, v3/original.js will be trimmed, so that the line
+ * where we set a breakpoint against, has been removed.
+ */
+
+"use strict";
+
+addIntegrationTask(async function testReloadingStableOriginalSource(
+ testServer,
+ testUrl,
+ { isCompressed }
+) {
+ info(" # Test reload a stable source whose content changes");
+ const dbg = await initDebuggerWithAbsoluteURL(testUrl, "original.js");
+
+ info("Add initial breakpoint");
+ await selectSource(dbg, "original.js");
+ await addBreakpoint(dbg, "original.js", 8);
+
+ info("Check that only one breakpoint is set");
+ is(dbg.selectors.getBreakpointCount(), 1, "Only one breakpoint exists");
+ is(
+ dbg.client.getServerBreakpointsList().length,
+ 1,
+ "One breakpoint exists on the server"
+ );
+
+ info("Check that the breakpoint location info is correct");
+ let breakpoint = dbg.selectors.getBreakpointsList(dbg)[0];
+ is(breakpoint.location.line, 8);
+ if (isCompressed) {
+ is(breakpoint.generatedLocation.line, 1);
+ is(breakpoint.generatedLocation.column, 1056);
+ } else {
+ is(breakpoint.generatedLocation.line, 84);
+ }
+
+ const expectedOriginalFileContentOnBreakpointLine =
+ "await nonSourceMappedFunction();";
+ const expectedGeneratedFileContentOnBreakpointLine =
+ "await nonSourceMappedFunction();";
+
+ info("Check that the breakpoint is displayed on the correct line in the ui");
+ await assertBreakpoint(dbg, 8);
+
+ info("Check that breakpoint is on the first line within the function `foo`");
+ assertTextContentOnLine(dbg, 8, expectedOriginalFileContentOnBreakpointLine);
+
+ info(
+ "Check that the source text snippet displayed in breakpoints panel is correct"
+ );
+ assertBreakpointSnippet(
+ dbg,
+ 1,
+ isCompressed
+ ? "nonSourceMappedFunction();"
+ : "await nonSourceMappedFunction();"
+ );
+
+ info(
+ "Check that the breakpoint is displayed in correct location in bundle.js (generated source)"
+ );
+ await selectSource(dbg, "bundle.js");
+ if (isCompressed) {
+ await assertBreakpoint(dbg, 1);
+ } else {
+ await assertBreakpoint(dbg, 84);
+ assertTextContentOnLine(
+ dbg,
+ 84,
+ expectedGeneratedFileContentOnBreakpointLine
+ );
+ }
+ info(
+ "The breakpoint snippet doesn't change when moving to generated content"
+ );
+ assertBreakpointSnippet(
+ dbg,
+ 1,
+ isCompressed
+ ? `nonSourceMappedFunction(),console.log("YO")}}]);`
+ : "await nonSourceMappedFunction();"
+ );
+
+ await closeTab(dbg, "bundle.js");
+
+ // This reload changes the content of the original file
+ // which will cause the location of the breakpoint to change
+ info("Reload with a new version of the file");
+ testServer.switchToNextVersion();
+ await reload(dbg, "bundle.js", "original.js");
+ await wait(1000);
+
+ info(
+ "Check that no breakpoint is restore as original line 6 is no longer breakable"
+ );
+ is(dbg.selectors.getBreakpointCount(), 0, "No breakpoint exists");
+
+ info("Invoke `foo` to trigger breakpoint");
+ invokeInTab("foo");
+ await wait(1000);
+
+ // TODO: Intermittently pauses (especially when in compressed)
+ // Need to investigate
+ if (isPaused(dbg)) {
+ await resume(dbg);
+ }
+ assertNotPaused(dbg);
+
+ await closeTab(dbg, "bundle.js");
+
+ info("Add a second breakpoint");
+ await addBreakpoint(dbg, "original.js", 13);
+
+ is(dbg.selectors.getBreakpointCount(dbg), 1, "The breakpoint exist");
+
+ info("Check that the original location of the new breakpoint is correct");
+ breakpoint = dbg.selectors.getBreakpointsList(dbg)[0];
+ is(breakpoint.location.line, 13);
+ if (isCompressed) {
+ is(breakpoint.generatedLocation.line, 1);
+ is(breakpoint.generatedLocation.column, 1089);
+ } else {
+ is(breakpoint.generatedLocation.line, 89);
+ }
+ assertBreakpointSnippet(
+ dbg,
+ 1,
+ isCompressed ? `log("HEY")` : `console.log("HEY")`
+ );
+
+ // This reload removes the content related to the lines in the original
+ // file where the breakpoints where set.
+ // NOTE: When we reload, the `foo` function no longer exists
+ // and the original.js file is now 3 lines long
+ info("Reload and observe no breakpoints");
+ testServer.switchToNextVersion();
+ await reload(dbg, "original.js");
+
+ // There will initially be zero breakpoints, but wait to make sure none are
+ // installed while syncing.
+ await wait(1000);
+
+ assertNotPaused(dbg);
+
+ is(dbg.selectors.getBreakpointCount(dbg), 0, "No breakpoints");
+ // TODO: fails intermitently, look to fix
+ /*is(
+ dbg.client.getServerBreakpointsList().length,
+ 2,
+ "No breakpoint exists on the server"
+ );*/
+});
diff --git a/devtools/client/debugger/test/mochitest/integration-tests/2-reload-replaced-original.js b/devtools/client/debugger/test/mochitest/integration-tests/2-reload-replaced-original.js
new file mode 100644
index 0000000000..d5fadff145
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/integration-tests/2-reload-replaced-original.js
@@ -0,0 +1,136 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/* import-globals-from ../head.js */
+
+/**
+ * This second test will focus on v1/removed-original.js which is an original source mapped file.
+ * This source is mapped to replaced-bundle.js.
+ * In the first reload (v2), this original source is removed and another original file: v2/new-original.js
+ * will replace the content of the removed-original.js in the replaced-bundle.js generated file.
+ * And finally, in the second reload (v3) everything is removed, both original and generated source.
+ *
+ * Note that great care is done to ensure that new-original replaces removed-original with the
+ * exact same breakable lines and columns. So that the breakpoint isn't simply removed
+ * because the location is no longer breakable.
+ */
+
+"use strict";
+
+addIntegrationTask(async function testReloadingRemovedOriginalSources(
+ testServer,
+ testUrl,
+ { isCompressed }
+) {
+ info(" # Test reloading a source that is replaced and then removed");
+ testServer.backToFirstVersion();
+
+ const dbg = await initDebuggerWithAbsoluteURL(testUrl, "removed-original.js");
+
+ info("Add initial breakpoint");
+ await selectSource(dbg, "removed-original.js");
+ await addBreakpoint(dbg, "removed-original.js", 4);
+
+ // Assert the precise behavior of the breakpoint before reloading
+ invokeInTab("removedOriginal");
+ await waitForPaused(dbg);
+ const replacedSource = findSource(dbg, "removed-original.js");
+ assertPausedAtSourceAndLine(dbg, replacedSource.id, 4);
+ assertTextContentOnLine(dbg, 4, 'console.log("Removed original");');
+ await assertBreakpoint(dbg, 4);
+
+ is(dbg.selectors.getBreakpointCount(), 1, "One breakpoint exists");
+ is(
+ dbg.client.getServerBreakpointsList().length,
+ 1,
+ "One breakpoint exists on the server"
+ );
+
+ let breakpoint = dbg.selectors.getBreakpointsList()[0];
+ is(breakpoint.location.source.url, replacedSource.url);
+ is(breakpoint.location.line, 4);
+ if (isCompressed) {
+ is(breakpoint.generatedLocation.line, 1);
+ is(breakpoint.generatedLocation.column, 992);
+ } else {
+ is(breakpoint.generatedLocation.line, 80);
+ }
+ info(
+ "Assert that the breakpoint snippet is originaly set to the to-be-removed original source content"
+ );
+ assertBreakpointSnippet(dbg, 1, `console.log("Removed original");`);
+
+ await resume(dbg);
+
+ info(
+ "Reload, which should remove the original file and a add a new original file which will replace its content in the generated file"
+ );
+ const syncBp = waitForDispatch(dbg.store, "SET_BREAKPOINT");
+ testServer.switchToNextVersion();
+ const onReloaded = reload(dbg, "new-original.js");
+ await syncBp;
+
+ // Assert the new breakpoint being created after reload
+ // For now, the current behavior of the debugger is that:
+ // the breakpoint is still hit based on the generated source/bundle file
+ // and the UI updates itself to mention the new original file.
+ await waitForPaused(dbg);
+ const newSource = findSource(dbg, "new-original.js");
+ assertPausedAtSourceAndLine(dbg, newSource.id, 4);
+ assertTextContentOnLine(dbg, 4, 'console.log("New original");');
+ await assertBreakpoint(dbg, 4);
+
+ is(dbg.selectors.getBreakpointCount(), 1, "One breakpoint exists");
+ is(
+ dbg.client.getServerBreakpointsList().length,
+ 1,
+ "One breakpoint exists on the server"
+ );
+
+ breakpoint = dbg.selectors.getBreakpointsList()[0];
+ is(breakpoint.location.source.url, newSource.url);
+ is(breakpoint.location.line, 4);
+ if (isCompressed) {
+ is(breakpoint.generatedLocation.line, 1);
+ is(breakpoint.generatedLocation.column, 992);
+ } else {
+ is(breakpoint.generatedLocation.line, 80);
+ }
+ info(
+ "Assert that the breakpoint snippet changed to the new original source content"
+ );
+ assertBreakpointSnippet(dbg, 1, `console.log("New original");`);
+
+ await resume(dbg);
+ info("Wait for reload to complete after resume");
+ await onReloaded;
+
+ info(
+ "Reload a last time to remove both original and generated sources entirely"
+ );
+ testServer.switchToNextVersion();
+ await reload(dbg);
+
+ // Let some time for breakpoint syncing to be buggy and recreated unexpected breakpoint
+ await wait(1000);
+ info("Assert that sources and breakpoints are gone and we aren't paused");
+ ok(
+ !sourceExists(dbg, "removed-original.js"),
+ "removed-original is not present"
+ );
+ ok(!sourceExists(dbg, "new-original.js"), "new-original is not present");
+ ok(
+ !sourceExists(dbg, "replaced-bundle.js"),
+ "replaced-bundle is not present"
+ );
+ assertNotPaused(dbg);
+ is(dbg.selectors.getBreakpointCount(), 0, "We no longer have any breakpoint");
+ // The breakpoint for the removed source still exists, atm this difficult to fix
+ // as the frontend never loads the source.
+ is(
+ dbg.client.getServerBreakpointsList().length,
+ 1,
+ "One breakpoint still exists on the server"
+ );
+});
diff --git a/devtools/client/debugger/test/mochitest/integration-tests/3-reload-changed-generated.js b/devtools/client/debugger/test/mochitest/integration-tests/3-reload-changed-generated.js
new file mode 100644
index 0000000000..90e060c66e
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/integration-tests/3-reload-changed-generated.js
@@ -0,0 +1,198 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/* import-globals-from ../head.js */
+
+/**
+ * This first test will focus on original-with-no-update.js file where the bundle-with-another-original.js file
+ * content changes because of another-original.js
+ */
+
+"use strict";
+
+addIntegrationTask(async function testReloadingChangedGeneratedSource(
+ testServer,
+ testUrl,
+ { isCompressed }
+) {
+ info(
+ " # Test reload an original source whose generated source content changes"
+ );
+ testServer.backToFirstVersion();
+ const dbg = await initDebuggerWithAbsoluteURL(
+ testUrl,
+ "original-with-no-update.js"
+ );
+
+ info("Add initial breakpoint");
+ await selectSource(dbg, "original-with-no-update.js");
+ await addBreakpoint(dbg, "original-with-no-update.js", 6);
+
+ info("Check that only one breakpoint is set");
+ is(dbg.selectors.getBreakpointCount(), 1, "Only one breakpoint exists");
+
+ info("Check that the breakpoint location info is correct");
+ let breakpoint = dbg.selectors.getBreakpointsList(dbg)[0];
+ is(breakpoint.location.line, 6);
+ if (isCompressed) {
+ is(breakpoint.generatedLocation.line, 1);
+ is(breakpoint.generatedLocation.column, 1062);
+ } else {
+ is(breakpoint.generatedLocation.line, 82);
+ }
+
+ const expectedOriginalFileContentOnBreakpointLine = "await baabar();";
+ const expectedGeneratedFileContentOnBreakpointLine = "await baabar();";
+
+ info("Check that the breakpoint is displayed on the correct line in the ui");
+ await assertBreakpoint(dbg, 6);
+
+ info("Check that breakpoint is on the first line within the function `foo`");
+ assertTextContentOnLine(dbg, 6, expectedOriginalFileContentOnBreakpointLine);
+
+ info(
+ "Check that the breakpoint is displayed in correct location in bundle-with-another-original.js (generated source)"
+ );
+ await selectSource(dbg, "bundle-with-another-original.js");
+ if (isCompressed) {
+ await assertBreakpoint(dbg, 1);
+ } else {
+ await assertBreakpoint(dbg, 82);
+ assertTextContentOnLine(
+ dbg,
+ 82,
+ expectedGeneratedFileContentOnBreakpointLine
+ );
+ }
+ info(
+ "Check that the source code snipper shown in the breakpoint panel is correct"
+ );
+ assertBreakpointSnippet(
+ dbg,
+ 1,
+ isCompressed
+ ? `baabar(),console.log("YO")},foobar()}]);`
+ : `await baabar();`
+ );
+
+ await closeTab(dbg, "bundle-with-another-original.js");
+
+ // This reload changes the content of the generated file
+ // which will cause the location of the breakpoint to change
+ info("Reload with a new version of the file");
+ const waitUntilNewBreakpointIsSet = waitForDispatch(
+ dbg.store,
+ "SET_BREAKPOINT"
+ );
+ testServer.switchToNextVersion();
+ const onReloaded = reload(
+ dbg,
+ "bundle-with-another-original.js",
+ "original-with-no-update.js"
+ );
+ await waitUntilNewBreakpointIsSet;
+
+ if (!isCompressed) {
+ await waitForPaused(dbg);
+
+ // This is a bug where the server does not recieve updates to breakpoints
+ // early, therefore is pauses at the old position, where no breakpoint is
+ // displayed in the UI
+ info("Assert that the breakpoint paused in the other original file");
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "another-original.js").id,
+ 5
+ );
+ await assertNoBreakpoint(dbg, 5);
+ assertTextContentOnLine(dbg, 5, "funcC();");
+
+ info("Switch to generated source and assert that the location is correct");
+ await dbg.actions.jumpToMappedSelectedLocation();
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "bundle-with-another-original.js").id,
+ 82
+ );
+ await assertNoBreakpoint(dbg, 82);
+ assertTextContentOnLine(dbg, 82, "funcC();");
+
+ info("Switch back to original location before resuming");
+ await dbg.actions.jumpToMappedSelectedLocation();
+ await resume(dbg);
+ await waitForPaused(dbg);
+
+ info(
+ "Check that the breakpoint is displayed and paused on the correct line"
+ );
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "original-with-no-update.js").id,
+ 6
+ );
+ } else {
+ await onReloaded;
+ // Assert that it does not pause in commpressed files
+ assertNotPaused(dbg);
+ }
+ await assertBreakpoint(dbg, 6);
+
+ info(
+ "Check that though the breakpoint has moved, it is still on the first line within the function `foo`"
+ );
+ assertTextContentOnLine(dbg, 6, expectedOriginalFileContentOnBreakpointLine);
+
+ info(
+ "Check that the breakpoint is displayed in correct location in bundle-with-another-original.js (generated source)"
+ );
+ await selectSource(dbg, "bundle-with-another-original.js");
+ // This scrolls the line into view so the content
+ // on the line is rendered and avaliable for dom querying.
+ getCM(dbg).scrollIntoView({ line: 103, ch: 0 });
+
+ if (isCompressed) {
+ await assertBreakpoint(dbg, 1);
+ } else {
+ assertPausedAtSourceAndLine(
+ dbg,
+ findSource(dbg, "bundle-with-another-original.js").id,
+ 103
+ );
+ await assertBreakpoint(dbg, 103);
+ assertTextContentOnLine(
+ dbg,
+ 103,
+ expectedGeneratedFileContentOnBreakpointLine
+ );
+ }
+
+ info("Check that only one breakpoint is still set");
+ is(dbg.selectors.getBreakpointCount(), 1, "Only one breakpoint exists");
+
+ info("Check that the original location has changed");
+ breakpoint = dbg.selectors.getBreakpointsList(dbg)[0];
+ is(breakpoint.location.line, 6);
+ if (isCompressed) {
+ is(breakpoint.generatedLocation.line, 1);
+ is(breakpoint.generatedLocation.column, 1132);
+ } else {
+ is(breakpoint.generatedLocation.line, 103);
+ }
+
+ info("Check that the breakpoint snippet is still the same");
+ assertBreakpointSnippet(
+ dbg,
+ 1,
+ isCompressed
+ ? `baabar(),console.log("YO")},foobar()}]);`
+ : `await baabar();`
+ );
+
+ if (!isCompressed) {
+ await resume(dbg);
+ info("Wait for reload to complete after resume");
+ await onReloaded;
+ }
+ await closeTab(dbg, "bundle-with-another-original.js");
+});
diff --git a/devtools/client/debugger/test/mochitest/integration-tests/README.md b/devtools/client/debugger/test/mochitest/integration-tests/README.md
new file mode 100644
index 0000000000..1816de0938
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/integration-tests/README.md
@@ -0,0 +1,29 @@
+# Integration tests folder
+
+This folder contains all the sub tests ran by the integration tests.
+The integration tests are in the parent folder and are named `browser_dbg-integration-*.js`.
+Each time you execute one of the integration tests, all the sub tests implemented in this folder will be ran.
+Sub tests will be ran in a precise order, this is why the module names are prefixed by a number.
+
+Sub tests are javascript files which have all typical test helpers available in their scope:
+* devtools/client/shared/test/shared-head.js
+* devtools/client/debugger/test/mochitest/shared-head.js
+
+They should call the `addIntegrationTask()` method to register a new sub test:
+```
+addIntegrationTask(async function testMyNewIntegrationSubTest(
+ testServer,
+ testUrl,
+ { isCompressed }
+) {
+ info("My new integration sub test");
+
+ // `testServer` is a reference to the fake http server returned by `createVersionizedHttpTestServer()`.
+ // This can be useful to better control the actual content delivered by the server.
+
+ // `testUrl` is the URL of the test page the the debugger currently inspects.
+
+ // The third argument is the environment object, that helps know which particular integration test currently runs.
+ // You may have different assertions based on the actual test that runs.
+});
+```
diff --git a/devtools/client/debugger/test/mochitest/shared-head.js b/devtools/client/debugger/test/mochitest/shared-head.js
new file mode 100644
index 0000000000..2466957044
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/shared-head.js
@@ -0,0 +1,3121 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/**
+ * Helper methods to drive with the debugger during mochitests. This file can be safely
+ * required from other panel test files.
+ */
+
+"use strict";
+
+/* eslint-disable no-unused-vars */
+
+// We can't use "import globals from head.js" because of bug 1395426.
+// So workaround by manually importing the few symbols we are using from it.
+// (Note that only ./mach eslint devtools/client fails while devtools/client/debugger passes)
+/* global EXAMPLE_URL, ContentTask */
+
+// Assume that shared-head is always imported before this file
+/* import-globals-from ../../../shared/test/shared-head.js */
+
+/**
+ * Helper method to create a "dbg" context for other tools to use
+ */
+function createDebuggerContext(toolbox) {
+ const panel = toolbox.getPanel("jsdebugger");
+ const win = panel.panelWin;
+
+ return {
+ ...win.dbg,
+ commands: toolbox.commands,
+ toolbox,
+ win,
+ panel,
+ };
+}
+
+var { Toolbox } = require("devtools/client/framework/toolbox");
+const asyncStorage = require("devtools/shared/async-storage");
+
+const {
+ getSelectedLocation,
+} = require("devtools/client/debugger/src/utils/selected-location");
+const {
+ createLocation,
+} = require("devtools/client/debugger/src/utils/location");
+
+const {
+ resetSchemaVersion,
+} = require("devtools/client/debugger/src/utils/prefs");
+
+const {
+ safeDecodeItemName,
+} = require("devtools/client/debugger/src/utils/sources-tree/utils");
+
+const {
+ isGeneratedId,
+} = require("devtools/client/shared/source-map-loader/index");
+
+const DEBUGGER_L10N = new LocalizationHelper(
+ "devtools/client/locales/debugger.properties"
+);
+
+/**
+ * Waits for `predicate()` to be true. `state` is the redux app state.
+ *
+ * @memberof mochitest/waits
+ * @param {Object} dbg
+ * @param {Function} predicate
+ * @return {Promise}
+ * @static
+ */
+function waitForState(dbg, predicate, msg) {
+ return new Promise(resolve => {
+ info(`Waiting for state change: ${msg || ""}`);
+ if (predicate(dbg.store.getState())) {
+ info(`Finished waiting for state change: ${msg || ""}`);
+ resolve();
+ return;
+ }
+
+ const unsubscribe = dbg.store.subscribe(() => {
+ const result = predicate(dbg.store.getState());
+ if (result) {
+ info(`Finished waiting for state change: ${msg || ""}`);
+ unsubscribe();
+ resolve(result);
+ }
+ });
+ });
+}
+
+/**
+ * Waits for sources to be loaded.
+ *
+ * @memberof mochitest/waits
+ * @param {Object} dbg
+ * @param {Array} sources
+ * @return {Promise}
+ * @static
+ */
+async function waitForSources(dbg, ...sources) {
+ if (sources.length === 0) {
+ return;
+ }
+
+ info(`Waiting on sources: ${sources.join(", ")}`);
+ await Promise.all(
+ sources.map(url => {
+ if (!sourceExists(dbg, url)) {
+ return waitForState(
+ dbg,
+ () => sourceExists(dbg, url),
+ `source ${url} exists`
+ );
+ }
+ return Promise.resolve();
+ })
+ );
+
+ info(`Finished waiting on sources: ${sources.join(", ")}`);
+}
+
+/**
+ * Waits for a source to be loaded.
+ *
+ * @memberof mochitest/waits
+ * @param {Object} dbg
+ * @param {String} source
+ * @return {Promise}
+ * @static
+ */
+function waitForSource(dbg, url) {
+ return waitForState(
+ dbg,
+ state => findSource(dbg, url, { silent: true }),
+ "source exists"
+ );
+}
+
+async function waitForElement(dbg, name, ...args) {
+ await waitUntil(() => findElement(dbg, name, ...args));
+ return findElement(dbg, name, ...args);
+}
+
+/**
+ * Wait for a count of given elements to be rendered on screen.
+ *
+ * @param {DebuggerPanel} dbg
+ * @param {String} name
+ * @param {Integer} count: Number of elements to match. Defaults to 1.
+ * @param {Boolean} countStrictlyEqual: When set to true, will wait until the exact number
+ * of elements is displayed on screen. When undefined or false, will wait
+ * until there's at least `${count}` elements on screen (e.g. if count
+ * is 1, it will resolve if there are 2 elements rendered).
+ */
+async function waitForAllElements(
+ dbg,
+ name,
+ count = 1,
+ countStrictlyEqual = false
+) {
+ await waitUntil(() => {
+ const elsCount = findAllElements(dbg, name).length;
+ return countStrictlyEqual ? elsCount === count : elsCount >= count;
+ });
+ return findAllElements(dbg, name);
+}
+
+async function waitForElementWithSelector(dbg, selector) {
+ await waitUntil(() => findElementWithSelector(dbg, selector));
+ return findElementWithSelector(dbg, selector);
+}
+
+function waitForRequestsToSettle(dbg) {
+ return dbg.commands.client.waitForRequestsToSettle();
+}
+
+function assertClass(el, className, exists = true) {
+ if (exists) {
+ ok(el.classList.contains(className), `${className} class exists`);
+ } else {
+ ok(!el.classList.contains(className), `${className} class does not exist`);
+ }
+}
+
+function waitForSelectedLocation(dbg, line, column) {
+ return waitForState(dbg, state => {
+ const location = dbg.selectors.getSelectedLocation();
+ return (
+ location &&
+ (line ? location.line == line : true) &&
+ (column ? location.column == column : true)
+ );
+ });
+}
+
+/**
+ * Wait for a given source to be selected and ready.
+ *
+ * @memberof mochitest/waits
+ * @param {Object} dbg
+ * @param {null|string|Source} sourceOrUrl Optional. Either a source URL (string) or a source object (typically fetched via `findSource`)
+ * @return {Promise}
+ * @static
+ */
+function waitForSelectedSource(dbg, sourceOrUrl) {
+ const {
+ getSelectedSourceTextContent,
+ getSymbols,
+ getBreakableLines,
+ getSourceActorsForSource,
+ getSourceActorBreakableLines,
+ getFirstSourceActorForGeneratedSource,
+ } = dbg.selectors;
+
+ return waitForState(
+ dbg,
+ state => {
+ const location = dbg.selectors.getSelectedLocation() || {};
+ const sourceTextContent = getSelectedSourceTextContent();
+ if (!sourceTextContent) {
+ return false;
+ }
+
+ if (sourceOrUrl) {
+ // Second argument is either a source URL (string)
+ // or a Source object.
+ if (typeof sourceOrUrl == "string") {
+ const url = location.source.url;
+ if (typeof url != "string" || !url.includes(encodeURI(sourceOrUrl))) {
+ return false;
+ }
+ } else if (location.source.id != sourceOrUrl.id) {
+ return false;
+ }
+ }
+
+ // Wait for symbols/AST to be parsed
+ if (!getSymbols(location) && !isWasmBinarySource(location.source)) {
+ return false;
+ }
+
+ // Finaly wait for breakable lines to be set
+ if (location.source.isHTML) {
+ // For HTML sources we need to wait for each source actor to be processed.
+ // getBreakableLines will return the aggregation without being able to know
+ // if that's complete, with all the source actors.
+ const sourceActors = getSourceActorsForSource(location.source.id);
+ const allSourceActorsProcessed = sourceActors.every(
+ sourceActor => !!getSourceActorBreakableLines(sourceActor.id)
+ );
+ return allSourceActorsProcessed;
+ }
+
+ if (!getBreakableLines(location.source.id)) {
+ return false;
+ }
+
+ // Also ensure that CodeMirror updated its content
+ return getCM(dbg).getValue() !== DEBUGGER_L10N.getStr("loadingText");
+ },
+ "selected source"
+ );
+}
+
+/**
+ * The generated source of WASM source are WASM binary file,
+ * which have many broken/disabled features in the debugger.
+ *
+ * They especially have a very special behavior in CodeMirror
+ * where line labels aren't line number, but hex addresses.
+ */
+function isWasmBinarySource(source) {
+ return source.isWasm && !source.isOriginal;
+}
+
+function getVisibleSelectedFrameLine(dbg) {
+ const frame = dbg.selectors.getVisibleSelectedFrame();
+ return frame?.location.line;
+}
+
+function getVisibleSelectedFrameColumn(dbg) {
+ const frame = dbg.selectors.getVisibleSelectedFrame();
+ return frame?.location.column;
+}
+
+/**
+ * Assert that a given line is breakable or not.
+ * Verify that CodeMirror gutter is grayed out via the empty line classname if not breakable.
+ */
+function assertLineIsBreakable(dbg, file, line, shouldBeBreakable) {
+ const lineInfo = getCM(dbg).lineInfo(line - 1);
+ const lineText = `${line}| ${lineInfo.text.substring(0, 50)}${
+ lineInfo.text.length > 50 ? "…" : ""
+ } — in ${file}`;
+ // When a line is not breakable, the "empty-line" class is added
+ // and the line is greyed out
+ if (shouldBeBreakable) {
+ ok(
+ !lineInfo.wrapClass?.includes("empty-line"),
+ `${lineText} should be breakable`
+ );
+ } else {
+ ok(
+ lineInfo?.wrapClass?.includes("empty-line"),
+ `${lineText} should NOT be breakable`
+ );
+ }
+}
+
+/**
+ * Assert that the debugger is highlighting the correct location.
+ *
+ * @memberof mochitest/asserts
+ * @param {Object} dbg
+ * @param {String} source
+ * @param {Number} line
+ * @static
+ */
+function assertHighlightLocation(dbg, source, line) {
+ source = findSource(dbg, source);
+
+ // Check the selected source
+ is(
+ dbg.selectors.getSelectedSource().url,
+ source.url,
+ "source url is correct"
+ );
+
+ // Check the highlight line
+ const lineEl = findElement(dbg, "highlightLine");
+ ok(lineEl, "Line is highlighted");
+
+ is(
+ findAllElements(dbg, "highlightLine").length,
+ 1,
+ "Only 1 line is highlighted"
+ );
+
+ ok(isVisibleInEditor(dbg, lineEl), "Highlighted line is visible");
+
+ const cm = getCM(dbg);
+ const lineInfo = cm.lineInfo(line - 1);
+ ok(lineInfo.wrapClass.includes("highlight-line"), "Line is highlighted");
+}
+
+/**
+ * Helper function for assertPausedAtSourceAndLine.
+ *
+ * Assert that CodeMirror reports to be paused at the given line/column.
+ */
+function _assertDebugLine(dbg, line, column) {
+ const source = dbg.selectors.getSelectedSource();
+ // WASM lines are hex addresses which have to be mapped to decimal line number
+ if (isWasmBinarySource(source)) {
+ line = dbg.wasmOffsetToLine(source.id, line) + 1;
+ }
+
+ // Check the debug line
+ const lineInfo = getCM(dbg).lineInfo(line - 1);
+ const sourceTextContent = dbg.selectors.getSelectedSourceTextContent();
+ if (source && !sourceTextContent) {
+ const url = source.url;
+ ok(
+ false,
+ `Looks like the source ${url} is still loading. Try adding waitForLoadedSource in the test.`
+ );
+ return;
+ }
+
+ // Scroll the line into view to make sure the content
+ // on the line is rendered and in the dom.
+ getCM(dbg).scrollIntoView({ line, ch: 0 });
+
+ if (!lineInfo.wrapClass) {
+ const pauseLine = getVisibleSelectedFrameLine(dbg);
+ ok(false, `Expected pause line on line ${line}, it is on ${pauseLine}`);
+ return;
+ }
+
+ ok(
+ lineInfo?.wrapClass.includes("new-debug-line"),
+ `Line ${line} is not highlighted as paused`
+ );
+
+ const debugLine =
+ findElement(dbg, "debugLine") || findElement(dbg, "debugErrorLine");
+
+ is(
+ findAllElements(dbg, "debugLine").length +
+ findAllElements(dbg, "debugErrorLine").length,
+ 1,
+ "There is only one line"
+ );
+
+ ok(isVisibleInEditor(dbg, debugLine), "debug line is visible");
+
+ const markedSpans = lineInfo.handle.markedSpans;
+ if (markedSpans && markedSpans.length && !isWasmBinarySource(source)) {
+ const hasExpectedDebugLine = markedSpans.some(
+ span =>
+ span.marker.className?.includes("debug-expression") &&
+ // When a precise column is expected, ensure that we have at least
+ // one "debug line" for the column we expect.
+ // (See the React Component: DebugLine.setDebugLine)
+ (!column || span.from == column)
+ );
+ ok(
+ hasExpectedDebugLine,
+ "Got the expected DebugLine. i.e. got the right marker in codemirror visualizing the breakpoint"
+ );
+ }
+ info(`Paused on line ${line}`);
+}
+
+/**
+ * Make sure the debugger is paused at a certain source ID and line.
+ *
+ * @param {Object} dbg
+ * @param {String} expectedSourceId
+ * @param {Number} expectedLine
+ * @param {Number} [expectedColumn]
+ */
+function assertPausedAtSourceAndLine(
+ dbg,
+ expectedSourceId,
+ expectedLine,
+ expectedColumn
+) {
+ // Check that the debugger is paused.
+ assertPaused(dbg);
+
+ // Check that the paused location is correctly rendered.
+ ok(isSelectedFrameSelected(dbg), "top frame's source is selected");
+
+ // Check the pause location
+ const pauseLine = getVisibleSelectedFrameLine(dbg);
+ is(
+ pauseLine,
+ expectedLine,
+ "Redux state for currently selected frame's line is correct"
+ );
+ const pauseColumn = getVisibleSelectedFrameColumn(dbg);
+ if (expectedColumn) {
+ // `pauseColumn` is 0-based, coming from internal state,
+ // while `expectedColumn` is manually passed from test scripts and so is 1-based.
+ is(
+ pauseColumn + 1,
+ expectedColumn,
+ "Redux state for currently selected frame's column is correct"
+ );
+ }
+ _assertDebugLine(dbg, pauseLine, pauseColumn);
+
+ ok(isVisibleInEditor(dbg, getCM(dbg).display.gutters), "gutter is visible");
+
+ const frames = dbg.selectors.getCurrentThreadFrames();
+ const selectedSource = dbg.selectors.getSelectedSource();
+
+ // WASM support is limited when we are on the generated binary source
+ if (isWasmBinarySource(selectedSource)) {
+ return;
+ }
+
+ ok(frames.length >= 1, "Got at least one frame");
+
+ // Lets make sure we can assert both original and generated file locations when needed
+ const { source, line, column } = isGeneratedId(expectedSourceId)
+ ? frames[0].generatedLocation
+ : frames[0].location;
+ is(source.id, expectedSourceId, "Frame has correct source");
+ is(
+ line,
+ expectedLine,
+ `Frame paused at line ${line}, but expected line ${expectedLine}`
+ );
+
+ if (expectedColumn) {
+ // `column` is 0-based, coming from internal state,
+ // while `expectedColumn` is manually passed from test scripts and so is 1-based.
+ is(
+ column + 1,
+ expectedColumn,
+ `Frame paused at column ${
+ column + 1
+ }, but expected column ${expectedColumn}`
+ );
+ }
+}
+
+async function waitForThreadCount(dbg, count) {
+ return waitForState(
+ dbg,
+ state => dbg.selectors.getThreads(state).length == count
+ );
+}
+
+async function waitForLoadedScopes(dbg) {
+ const scopes = await waitForElement(dbg, "scopes");
+ // Since scopes auto-expand, we can assume they are loaded when there is a tree node
+ // with the aria-level attribute equal to "2".
+ await waitUntil(() => scopes.querySelector('.tree-node[aria-level="2"]'));
+}
+
+function waitForBreakpointCount(dbg, count) {
+ return waitForState(
+ dbg,
+ state => dbg.selectors.getBreakpointCount() == count
+ );
+}
+
+function waitForBreakpoint(dbg, url, line) {
+ return waitForState(dbg, () => findBreakpoint(dbg, url, line));
+}
+
+function waitForBreakpointRemoved(dbg, url, line) {
+ return waitForState(dbg, () => !findBreakpoint(dbg, url, line));
+}
+
+/**
+ * Returns boolean for whether the debugger is paused.
+ *
+ * @param {Object} dbg
+ */
+function isPaused(dbg) {
+ return dbg.selectors.getIsCurrentThreadPaused();
+}
+
+/**
+ * Assert that the debugger is not currently paused.
+ *
+ * @param {Object} dbg
+ * @param {String} msg
+ * Optional assertion message
+ */
+function assertNotPaused(dbg, msg = "client is not paused") {
+ ok(!isPaused(dbg), msg);
+}
+
+/**
+ * Assert that the debugger is currently paused.
+ *
+ * @param {Object} dbg
+ */
+function assertPaused(dbg, msg = "client is paused") {
+ ok(isPaused(dbg), msg);
+}
+
+/**
+ * Waits for the debugger to be fully paused.
+ *
+ * @param {Object} dbg
+ * @param {String} url
+ * Optional URL of the script we should be pausing on.
+ * @param {Object} options
+ * {Boolean} shouldWaitForLoadScopes
+ * When paused in original files with original variable mapping disabled, scopes are
+ * not going to exist, lets not wait for it. defaults to true
+ */
+async function waitForPaused(
+ dbg,
+ url,
+ options = { shouldWaitForLoadedScopes: true }
+) {
+ info("Waiting for the debugger to pause");
+ const { getSelectedScope, getCurrentThread, getCurrentThreadFrames } =
+ dbg.selectors;
+
+ await waitForState(
+ dbg,
+ state => isPaused(dbg) && !!getSelectedScope(getCurrentThread()),
+ "paused"
+ );
+
+ await waitForState(dbg, getCurrentThreadFrames, "fetched frames");
+
+ if (options.shouldWaitForLoadedScopes) {
+ await waitForLoadedScopes(dbg);
+ }
+ await waitForSelectedSource(dbg, url);
+}
+
+/**
+ * Waits for the debugger to resume.
+ *
+ * @param {Objeect} dbg
+ */
+function waitForResumed(dbg) {
+ info("Waiting for the debugger to resume");
+ return waitForState(dbg, state => !dbg.selectors.getIsCurrentThreadPaused());
+}
+
+function waitForInlinePreviews(dbg) {
+ return waitForState(dbg, () => dbg.selectors.getSelectedInlinePreviews());
+}
+
+function waitForCondition(dbg, condition) {
+ return waitForState(dbg, state =>
+ dbg.selectors
+ .getBreakpointsList()
+ .find(bp => bp.options.condition == condition)
+ );
+}
+
+function waitForLog(dbg, logValue) {
+ return waitForState(dbg, state =>
+ dbg.selectors
+ .getBreakpointsList()
+ .find(bp => bp.options.logValue == logValue)
+ );
+}
+
+async function waitForPausedThread(dbg, thread) {
+ return waitForState(dbg, state => dbg.selectors.getIsPaused(thread));
+}
+
+function isSelectedFrameSelected(dbg, state) {
+ const frame = dbg.selectors.getVisibleSelectedFrame();
+
+ // Make sure the source text is completely loaded for the
+ // source we are paused in.
+ const source = dbg.selectors.getSelectedSource();
+ const sourceTextContent = dbg.selectors.getSelectedSourceTextContent();
+
+ if (!source || !sourceTextContent) {
+ return false;
+ }
+
+ return source.id == frame.location.source.id;
+}
+
+/**
+ * Checks to see if the frame is selected and the title is correct.
+ *
+ * @param {Object} dbg
+ * @param {Integer} index
+ * @param {String} title
+ */
+function isFrameSelected(dbg, index, title) {
+ const $frame = findElement(dbg, "frame", index);
+
+ const {
+ selectors: { getSelectedFrame, getCurrentThread },
+ } = dbg;
+
+ const frame = getSelectedFrame(getCurrentThread());
+
+ const elSelected = $frame.classList.contains("selected");
+ const titleSelected = frame.displayName == title;
+
+ return elSelected && titleSelected;
+}
+
+/**
+ * Clear all the debugger related preferences.
+ */
+async function clearDebuggerPreferences(prefs = []) {
+ resetSchemaVersion();
+ asyncStorage.clear();
+ Services.prefs.clearUserPref("devtools.debugger.alphabetize-outline");
+ Services.prefs.clearUserPref("devtools.debugger.pause-on-exceptions");
+ Services.prefs.clearUserPref("devtools.debugger.pause-on-caught-exceptions");
+ Services.prefs.clearUserPref("devtools.debugger.ignore-caught-exceptions");
+ Services.prefs.clearUserPref("devtools.debugger.pending-selected-location");
+ Services.prefs.clearUserPref("devtools.debugger.expressions");
+ Services.prefs.clearUserPref("devtools.debugger.breakpoints-visible");
+ Services.prefs.clearUserPref("devtools.debugger.call-stack-visible");
+ Services.prefs.clearUserPref("devtools.debugger.scopes-visible");
+ Services.prefs.clearUserPref("devtools.debugger.skip-pausing");
+
+ for (const pref of prefs) {
+ await pushPref(...pref);
+ }
+}
+
+/**
+ * Intilializes the debugger.
+ *
+ * @memberof mochitest
+ * @param {String} url
+ * @return {Promise} dbg
+ * @static
+ */
+
+async function initDebugger(url, ...sources) {
+ // We depend on EXAMPLE_URLs origin to do cross origin/process iframes via
+ // EXAMPLE_REMOTE_URL. If the top level document origin changes,
+ // we may break this. So be careful if you want to change EXAMPLE_URL.
+ return initDebuggerWithAbsoluteURL(EXAMPLE_URL + url, ...sources);
+}
+
+async function initDebuggerWithAbsoluteURL(url, ...sources) {
+ await clearDebuggerPreferences();
+ const toolbox = await openNewTabAndToolbox(url, "jsdebugger");
+ const dbg = createDebuggerContext(toolbox);
+
+ await waitForSources(dbg, ...sources);
+ return dbg;
+}
+
+async function initPane(url, pane, prefs) {
+ await clearDebuggerPreferences(prefs);
+ return openNewTabAndToolbox(EXAMPLE_URL + url, pane);
+}
+
+/**
+ * Returns a source that matches a given filename, or a URL.
+ * This also accept a source as input argument, in such case it just returns it.
+ *
+ * @param {Object} dbg
+ * @param {String} filenameOrUrlOrSource
+ * The typical case will be to pass only a filename,
+ * but you may also pass a full URL to match sources without filesnames like data: URL
+ * or pass the source itself, which is just returned.
+ * @param {Object} options
+ * @param {Boolean} options.silent
+ * If true, won't throw if the source is missing.
+ * @return {Object} source
+ */
+function findSource(
+ dbg,
+ filenameOrUrlOrSource,
+ { silent } = { silent: false }
+) {
+ if (typeof filenameOrUrlOrSource !== "string") {
+ // Support passing in a source object itself all APIs that use this
+ // function support both styles
+ return filenameOrUrlOrSource;
+ }
+
+ const sources = dbg.selectors.getSourceList();
+ const source = sources.find(s => {
+ // Sources don't have a file name attribute, we need to compute it here:
+ const sourceFileName = s.url
+ ? safeDecodeItemName(s.url.substring(s.url.lastIndexOf("/") + 1))
+ : "";
+
+ // The input argument may either be only the filename, or the complete URL
+ // This helps match sources whose URL doesn't contain a filename, like data: URLs
+ return (
+ sourceFileName == filenameOrUrlOrSource || s.url == filenameOrUrlOrSource
+ );
+ });
+
+ if (!source) {
+ if (silent) {
+ return false;
+ }
+
+ throw new Error(`Unable to find source: ${filenameOrUrlOrSource}`);
+ }
+
+ return source;
+}
+
+function findSourceContent(dbg, url, opts) {
+ const source = findSource(dbg, url, opts);
+
+ if (!source) {
+ return null;
+ }
+ const content = dbg.selectors.getSettledSourceTextContent(
+ createLocation({
+ source,
+ })
+ );
+
+ if (!content) {
+ return null;
+ }
+
+ if (content.state !== "fulfilled") {
+ throw new Error(`Expected loaded source, got${content.value}`);
+ }
+
+ return content.value;
+}
+
+function sourceExists(dbg, url) {
+ return !!findSource(dbg, url, { silent: true });
+}
+
+function waitForLoadedSource(dbg, url) {
+ return waitForState(
+ dbg,
+ state => {
+ const source = findSource(dbg, url, { silent: true });
+ return (
+ source &&
+ dbg.selectors.getSettledSourceTextContent(
+ createLocation({
+ source,
+ })
+ )
+ );
+ },
+ "loaded source"
+ );
+}
+
+/*
+ * Selects the source node for a specific source
+ * from the source tree.
+ *
+ * @param {Object} dbg
+ * @param {String} filename - The filename for the specific source
+ * @param {Number} sourcePosition - The source node postion in the tree
+ * @param {String} message - The info message to display
+ */
+async function selectSourceFromSourceTree(
+ dbg,
+ fileName,
+ sourcePosition,
+ message
+) {
+ info(message);
+ await clickElement(dbg, "sourceNode", sourcePosition);
+ await waitForSelectedSource(dbg, fileName);
+ await waitFor(
+ () => getCM(dbg).getValue() !== `Loading…`,
+ "Wait for source to completely load"
+ );
+}
+
+/*
+ * Trigger a context menu in the debugger source tree
+ *
+ * @param {Object} dbg
+ * @param {Obejct} sourceTreeNode - The node in the source tree which the context menu
+ * item needs to be triggered on.
+ * @param {String} contextMenuItem - The id for the context menu item to be selected
+ */
+async function triggerSourceTreeContextMenu(
+ dbg,
+ sourceTreeNode,
+ contextMenuItem
+) {
+ const onContextMenu = waitForContextMenu(dbg);
+ rightClickEl(dbg, sourceTreeNode);
+ const menupopup = await onContextMenu;
+ const onHidden = new Promise(resolve => {
+ menupopup.addEventListener("popuphidden", resolve, { once: true });
+ });
+ selectContextMenuItem(dbg, contextMenuItem);
+ await onHidden;
+}
+
+/**
+ * Selects the source.
+ *
+ * @memberof mochitest/actions
+ * @param {Object} dbg
+ * @param {String} url
+ * @param {Number} line
+ * @param {Number} column
+ * @return {Promise}
+ * @static
+ */
+async function selectSource(dbg, url, line, column) {
+ const source = findSource(dbg, url);
+
+ await dbg.actions.selectLocation(createLocation({ source, line, column }), {
+ keepContext: false,
+ });
+ return waitForSelectedSource(dbg, source);
+}
+
+async function closeTab(dbg, url) {
+ await dbg.actions.closeTab(findSource(dbg, url));
+}
+
+function countTabs(dbg) {
+ return findElement(dbg, "sourceTabs").children.length;
+}
+
+/**
+ * Steps over.
+ *
+ * @memberof mochitest/actions
+ * @param {Object} dbg
+ * @param {Object} pauseOptions
+ * @return {Promise}
+ * @static
+ */
+async function stepOver(dbg, pauseOptions) {
+ const pauseLine = getVisibleSelectedFrameLine(dbg);
+ info(`Stepping over from ${pauseLine}`);
+ await dbg.actions.stepOver();
+ return waitForPaused(dbg, null, pauseOptions);
+}
+
+/**
+ * Steps in.
+ *
+ * @memberof mochitest/actions
+ * @param {Object} dbg
+ * @return {Promise}
+ * @static
+ */
+async function stepIn(dbg) {
+ const pauseLine = getVisibleSelectedFrameLine(dbg);
+ info(`Stepping in from ${pauseLine}`);
+ await dbg.actions.stepIn();
+ return waitForPaused(dbg);
+}
+
+/**
+ * Steps out.
+ *
+ * @memberof mochitest/actions
+ * @param {Object} dbg
+ * @return {Promise}
+ * @static
+ */
+async function stepOut(dbg) {
+ const pauseLine = getVisibleSelectedFrameLine(dbg);
+ info(`Stepping out from ${pauseLine}`);
+ await dbg.actions.stepOut();
+ return waitForPaused(dbg);
+}
+
+/**
+ * Resumes.
+ *
+ * @memberof mochitest/actions
+ * @param {Object} dbg
+ * @return {Promise}
+ * @static
+ */
+async function resume(dbg) {
+ const pauseLine = getVisibleSelectedFrameLine(dbg);
+ info(`Resuming from ${pauseLine}`);
+ const onResumed = waitForResumed(dbg);
+ await dbg.actions.resume();
+ return onResumed;
+}
+
+function deleteExpression(dbg, input) {
+ info(`Delete expression "${input}"`);
+ return dbg.actions.deleteExpression({ input });
+}
+
+/**
+ * Reloads the debuggee.
+ *
+ * @memberof mochitest/actions
+ * @param {Object} dbg
+ * @param {Array} sources
+ * @return {Promise}
+ * @static
+ */
+async function reload(dbg, ...sources) {
+ await reloadBrowser();
+ return waitForSources(dbg, ...sources);
+}
+
+// Only use this method when the page is paused by the debugger
+// during page load and we navigate away without resuming.
+//
+// In this particular scenario, the page will never be "loaded".
+// i.e. emit DOCUMENT_EVENT's dom-complete
+// And consequently, debugger panel won't emit "reloaded" event.
+async function reloadWhenPausedBeforePageLoaded(dbg, ...sources) {
+ // But we can at least listen for the next DOCUMENT_EVENT's dom-loading,
+ // which should be fired even if the page is pause the earliest.
+ const { resourceCommand } = dbg.commands;
+ const { onResource: onTopLevelDomLoading } =
+ await resourceCommand.waitForNextResource(
+ resourceCommand.TYPES.DOCUMENT_EVENT,
+ {
+ ignoreExistingResources: true,
+ predicate: resource =>
+ resource.targetFront.isTopLevel && resource.name === "dom-loading",
+ }
+ );
+
+ gBrowser.reloadTab(gBrowser.selectedTab);
+
+ info("Wait for DOCUMENT_EVENT dom-loading after reload");
+ await onTopLevelDomLoading;
+ return waitForSources(dbg, ...sources);
+}
+
+/**
+ * Navigates the debuggee to another url.
+ *
+ * @memberof mochitest/actions
+ * @param {Object} dbg
+ * @param {String} url
+ * @param {Array} sources
+ * @return {Promise}
+ * @static
+ */
+async function navigate(dbg, url, ...sources) {
+ return navigateToAbsoluteURL(dbg, EXAMPLE_URL + url, ...sources);
+}
+
+/**
+ * Navigates the debuggee to another absolute url.
+ *
+ * @memberof mochitest/actions
+ * @param {Object} dbg
+ * @param {String} url
+ * @param {Array} sources
+ * @return {Promise}
+ * @static
+ */
+async function navigateToAbsoluteURL(dbg, url, ...sources) {
+ await navigateTo(url);
+ return waitForSources(dbg, ...sources);
+}
+
+function getFirstBreakpointColumn(dbg, source, line) {
+ const position = dbg.selectors.getFirstBreakpointPosition(
+ createLocation({
+ line,
+ source,
+ })
+ );
+
+ return getSelectedLocation(position, source).column;
+}
+
+function isMatchingLocation(location1, location2) {
+ return (
+ location1?.source.id == location2?.source.id &&
+ location1?.line == location2?.line &&
+ location1?.column == location2?.column
+ );
+}
+
+function getBreakpointForLocation(dbg, location) {
+ if (!location) {
+ return undefined;
+ }
+
+ const isGeneratedSource = isGeneratedId(location.source.id);
+ return dbg.selectors.getBreakpointsList().find(bp => {
+ const loc = isGeneratedSource ? bp.generatedLocation : bp.location;
+ return isMatchingLocation(loc, location);
+ });
+}
+
+/**
+ * Adds a breakpoint to a source at line/col.
+ *
+ * @memberof mochitest/actions
+ * @param {Object} dbg
+ * @param {String} source
+ * @param {Number} line
+ * @param {Number} col
+ * @return {Promise}
+ * @static
+ */
+async function addBreakpoint(dbg, source, line, column, options) {
+ source = findSource(dbg, source);
+ const bpCount = dbg.selectors.getBreakpointCount();
+ const onBreakpoint = waitForDispatch(dbg.store, "SET_BREAKPOINT");
+ await dbg.actions.addBreakpoint(
+ // column is 0-based internally, but tests are using 1-based.
+ createLocation({ source, line, column: column - 1 }),
+ options
+ );
+ await onBreakpoint;
+ is(
+ dbg.selectors.getBreakpointCount(),
+ bpCount + 1,
+ "a new breakpoint was created"
+ );
+}
+
+/**
+ * Similar to `addBreakpoint`, but uses the UI instead or calling
+ * the actions directly. This only support breakpoint on lines,
+ * not on a specific column.
+ */
+async function addBreakpointViaGutter(dbg, line) {
+ info(`Add breakpoint via the editor on line ${line}`);
+ await clickGutter(dbg, line);
+ return waitForDispatch(dbg.store, "SET_BREAKPOINT");
+}
+
+function disableBreakpoint(dbg, source, line, column) {
+ if (column === 0) {
+ throw new Error("disableBreakpoint expect a 1-based column argument");
+ }
+ // `internalColumn` is 0-based internally, while `column` manually defined in test scripts is 1-based.
+ const internalColumn = column
+ ? column - 1
+ : getFirstBreakpointColumn(dbg, source, line);
+ const location = createLocation({
+ source,
+ line,
+ column: internalColumn,
+ });
+ const bp = getBreakpointForLocation(dbg, location);
+ return dbg.actions.disableBreakpoint(bp);
+}
+
+function findBreakpoint(dbg, url, line) {
+ const source = findSource(dbg, url);
+ return dbg.selectors.getBreakpointsForSource(source, line)[0];
+}
+
+// helper for finding column breakpoints.
+function findColumnBreakpoint(dbg, url, line, column) {
+ const source = findSource(dbg, url);
+ const lineBreakpoints = dbg.selectors.getBreakpointsForSource(source, line);
+
+ return lineBreakpoints.find(bp => {
+ return source.isOriginal
+ ? bp.location.column === column
+ : bp.generatedLocation.column === column;
+ });
+}
+
+async function loadAndAddBreakpoint(dbg, filename, line, column) {
+ const {
+ selectors: { getBreakpoint, getBreakpointCount, getBreakpointsMap },
+ } = dbg;
+
+ await waitForSources(dbg, filename);
+
+ ok(true, "Original sources exist");
+ const source = findSource(dbg, filename);
+
+ await selectSource(dbg, source);
+
+ // Test that breakpoint is not off by a line.
+ await addBreakpoint(dbg, source, line, column);
+
+ is(getBreakpointCount(), 1, "One breakpoint exists");
+ // column is 0-based internally, but tests are using 1-based.
+ if (!getBreakpoint(createLocation({ source, line, column: column - 1 }))) {
+ const breakpoints = getBreakpointsMap();
+ const id = Object.keys(breakpoints).pop();
+ const loc = breakpoints[id].location;
+ ok(
+ false,
+ `Breakpoint has correct line ${line}, column ${column}, but was line ${
+ loc.line
+ } column ${loc.column + 1}`
+ );
+ }
+
+ return source;
+}
+
+async function invokeWithBreakpoint(
+ dbg,
+ fnName,
+ filename,
+ { line, column },
+ handler,
+ pauseOptions
+) {
+ const source = await loadAndAddBreakpoint(dbg, filename, line, column);
+
+ const invokeResult = invokeInTab(fnName);
+
+ const invokeFailed = await Promise.race([
+ waitForPaused(dbg, null, pauseOptions),
+ invokeResult.then(
+ () => new Promise(() => {}),
+ () => true
+ ),
+ ]);
+
+ if (invokeFailed) {
+ await invokeResult;
+ return;
+ }
+
+ assertPausedAtSourceAndLine(dbg, findSource(dbg, filename).id, line, column);
+
+ await removeBreakpoint(dbg, source.id, line, column);
+
+ is(dbg.selectors.getBreakpointCount(), 0, "Breakpoint reverted");
+
+ await handler(source);
+
+ await resume(dbg);
+
+ // eslint-disable-next-line max-len
+ // If the invoke errored later somehow, capture here so the error is reported nicely.
+ await invokeResult;
+}
+
+function prettyPrint(dbg) {
+ const source = dbg.selectors.getSelectedSource();
+ return dbg.actions.prettyPrintAndSelectSource(source);
+}
+
+async function expandAllScopes(dbg) {
+ const scopes = await waitForElement(dbg, "scopes");
+ const scopeElements = scopes.querySelectorAll(
+ '.tree-node[aria-level="1"][data-expandable="true"]:not([aria-expanded="true"])'
+ );
+ const indices = Array.from(scopeElements, el => {
+ return Array.prototype.indexOf.call(el.parentNode.childNodes, el);
+ }).reverse();
+
+ for (const index of indices) {
+ await toggleScopeNode(dbg, index + 1);
+ }
+}
+
+async function assertScopes(dbg, items) {
+ await expandAllScopes(dbg);
+
+ for (const [i, val] of items.entries()) {
+ if (Array.isArray(val)) {
+ is(getScopeNodeLabel(dbg, i + 1), val[0]);
+ is(
+ getScopeNodeValue(dbg, i + 1),
+ val[1],
+ `"${val[0]}" has the expected "${val[1]}" value`
+ );
+ } else {
+ is(getScopeNodeLabel(dbg, i + 1), val);
+ }
+ }
+
+ is(getScopeNodeLabel(dbg, items.length + 1), "Window");
+}
+
+function findSourceTreeThreadByName(dbg, name) {
+ return [...findAllElements(dbg, "sourceTreeThreads")].find(el => {
+ return el.textContent.includes(name);
+ });
+}
+
+function findSourceNodeWithText(dbg, text) {
+ return [...findAllElements(dbg, "sourceNodes")].find(el => {
+ return el.textContent.includes(text);
+ });
+}
+
+/**
+ * Assert the icon type used in the SourceTree for a given source
+ *
+ * @param {Object} dbg
+ * @param {String} sourceName
+ * Name of the source displayed in the source tree
+ * @param {String} icon
+ * Expected icon CSS classname
+ */
+function assertSourceIcon(dbg, sourceName, icon) {
+ const sourceItem = findSourceNodeWithText(dbg, sourceName);
+ ok(sourceItem, `Found the source item for ${sourceName}`);
+ is(
+ sourceItem.querySelector(".source-icon").className,
+ `img source-icon ${icon}`,
+ `The icon for ${sourceName} is correct`
+ );
+}
+
+async function expandSourceTree(dbg) {
+ // Click on expand all context menu for all top level "expandable items".
+ // If there is no project root, it will be thread items.
+ // But when there is a project root, it can be directory or group items.
+ // Select only expandable in order to ignore source items.
+ for (const rootNode of dbg.win.document.querySelectorAll(
+ ".sources-list > .tree > .tree-node[data-expandable=true]"
+ )) {
+ await expandAllSourceNodes(dbg, rootNode);
+ }
+}
+
+async function expandAllSourceNodes(dbg, treeNode) {
+ return triggerSourceTreeContextMenu(dbg, treeNode, "#node-menu-expand-all");
+}
+
+/**
+ * Removes a breakpoint from a source at line/col.
+ *
+ * @memberof mochitest/actions
+ * @param {Object} dbg
+ * @param {String} source
+ * @param {Number} line
+ * @param {Number} col
+ * @return {Promise}
+ * @static
+ */
+function removeBreakpoint(dbg, sourceId, line, column) {
+ const source = dbg.selectors.getSource(sourceId);
+ // column is 0-based internally, but tests are using 1-based.
+ column = column ? column - 1 : getFirstBreakpointColumn(dbg, source, line);
+ const location = createLocation({
+ source,
+ line,
+ column,
+ });
+ const bp = getBreakpointForLocation(dbg, location);
+ return dbg.actions.removeBreakpoint(bp);
+}
+
+/**
+ * Toggles the Pause on exceptions feature in the debugger.
+ *
+ * @memberof mochitest/actions
+ * @param {Object} dbg
+ * @param {Boolean} pauseOnExceptions
+ * @param {Boolean} pauseOnCaughtExceptions
+ * @return {Promise}
+ * @static
+ */
+async function togglePauseOnExceptions(
+ dbg,
+ pauseOnExceptions,
+ pauseOnCaughtExceptions
+) {
+ return dbg.actions.pauseOnExceptions(
+ pauseOnExceptions,
+ pauseOnCaughtExceptions
+ );
+}
+
+// Helpers
+
+/**
+ * Invokes a global function in the debuggee tab.
+ *
+ * @memberof mochitest/helpers
+ * @param {String} fnc The name of a global function on the content window to
+ * call. This is applied to structured clones of the
+ * remaining arguments to invokeInTab.
+ * @param {Any} ...args Remaining args to serialize and pass to fnc.
+ * @return {Promise}
+ * @static
+ */
+function invokeInTab(fnc, ...args) {
+ info(`Invoking in tab: ${fnc}(${args.map(uneval).join(",")})`);
+ return ContentTask.spawn(gBrowser.selectedBrowser, { fnc, args }, options =>
+ content.wrappedJSObject[options.fnc](...options.args)
+ );
+}
+
+function clickElementInTab(selector) {
+ info(`click element ${selector} in tab`);
+
+ return SpecialPowers.spawn(
+ gBrowser.selectedBrowser,
+ [selector],
+ function (_selector) {
+ const element = content.document.querySelector(_selector);
+ // Run the click in another event loop in order to immediately resolve spawn's promise.
+ // Otherwise if we pause on click and navigate, the JSWindowActor used by spawn will
+ // be destroyed while its query is still pending. And this would reject the promise.
+ content.setTimeout(() => {
+ element.click();
+ });
+ }
+ );
+}
+
+const isLinux = Services.appinfo.OS === "Linux";
+const isMac = Services.appinfo.OS === "Darwin";
+const cmdOrCtrl = isMac ? { metaKey: true } : { ctrlKey: true };
+const shiftOrAlt = isMac
+ ? { accelKey: true, shiftKey: true }
+ : { accelKey: true, altKey: true };
+
+const cmdShift = isMac
+ ? { accelKey: true, shiftKey: true, metaKey: true }
+ : { accelKey: true, shiftKey: true, ctrlKey: true };
+
+// On Mac, going to beginning/end only works with meta+left/right. On
+// Windows, it only works with home/end. On Linux, apparently, either
+// ctrl+left/right or home/end work.
+const endKey = isMac
+ ? { code: "VK_RIGHT", modifiers: cmdOrCtrl }
+ : { code: "VK_END" };
+const startKey = isMac
+ ? { code: "VK_LEFT", modifiers: cmdOrCtrl }
+ : { code: "VK_HOME" };
+
+const keyMappings = {
+ close: { code: "w", modifiers: cmdOrCtrl },
+ commandKeyDown: { code: "VK_META", modifiers: { type: "keydown" } },
+ commandKeyUp: { code: "VK_META", modifiers: { type: "keyup" } },
+ debugger: { code: "s", modifiers: shiftOrAlt },
+ // test conditional panel shortcut
+ toggleCondPanel: { code: "b", modifiers: cmdShift },
+ inspector: { code: "c", modifiers: shiftOrAlt },
+ quickOpen: { code: "p", modifiers: cmdOrCtrl },
+ quickOpenFunc: { code: "o", modifiers: cmdShift },
+ quickOpenLine: { code: ":", modifiers: cmdOrCtrl },
+ fileSearch: { code: "f", modifiers: cmdOrCtrl },
+ projectSearch: { code: "f", modifiers: cmdShift },
+ fileSearchNext: { code: "g", modifiers: { metaKey: true } },
+ fileSearchPrev: { code: "g", modifiers: cmdShift },
+ goToLine: { code: "g", modifiers: { ctrlKey: true } },
+ Enter: { code: "VK_RETURN" },
+ ShiftEnter: { code: "VK_RETURN", modifiers: { shiftKey: true } },
+ AltEnter: {
+ code: "VK_RETURN",
+ modifiers: { altKey: true },
+ },
+ Up: { code: "VK_UP" },
+ Down: { code: "VK_DOWN" },
+ Right: { code: "VK_RIGHT" },
+ Left: { code: "VK_LEFT" },
+ End: endKey,
+ Start: startKey,
+ Tab: { code: "VK_TAB" },
+ Escape: { code: "VK_ESCAPE" },
+ Delete: { code: "VK_DELETE" },
+ pauseKey: { code: "VK_F8" },
+ resumeKey: { code: "VK_F8" },
+ stepOverKey: { code: "VK_F10" },
+ stepInKey: { code: "VK_F11" },
+ stepOutKey: {
+ code: "VK_F11",
+ modifiers: { shiftKey: true },
+ },
+ Backspace: { code: "VK_BACK_SPACE" },
+};
+
+/**
+ * Simulates a key press in the debugger window.
+ *
+ * @memberof mochitest/helpers
+ * @param {Object} dbg
+ * @param {String} keyName
+ * @return {Promise}
+ * @static
+ */
+function pressKey(dbg, keyName) {
+ const keyEvent = keyMappings[keyName];
+ const { code, modifiers } = keyEvent;
+ info(`The ${keyName} key is pressed`);
+ return EventUtils.synthesizeKey(code, modifiers || {}, dbg.win);
+}
+
+function type(dbg, string) {
+ string.split("").forEach(char => EventUtils.synthesizeKey(char, {}, dbg.win));
+}
+
+/*
+ * Checks to see if the inner element is visible inside the editor.
+ *
+ * @memberof mochitest/helpers
+ * @param {Object} dbg
+ * @param {HTMLElement} inner element
+ * @return {boolean}
+ * @static
+ */
+
+function isVisibleInEditor(dbg, element) {
+ return isVisible(findElement(dbg, "codeMirror"), element);
+}
+
+/*
+ * Checks to see if the inner element is visible inside the
+ * outer element.
+ *
+ * Note, the inner element does not need to be entirely visible,
+ * it is possible for it to be somewhat clipped by the outer element's
+ * bounding element or for it to span the entire length, starting before the
+ * outer element and ending after.
+ *
+ * @memberof mochitest/helpers
+ * @param {HTMLElement} outer element
+ * @param {HTMLElement} inner element
+ * @return {boolean}
+ * @static
+ */
+function isVisible(outerEl, innerEl) {
+ if (!innerEl || !outerEl) {
+ return false;
+ }
+
+ const innerRect = innerEl.getBoundingClientRect();
+ const outerRect = outerEl.getBoundingClientRect();
+
+ const verticallyVisible =
+ innerRect.top >= outerRect.top ||
+ innerRect.bottom <= outerRect.bottom ||
+ (innerRect.top < outerRect.top && innerRect.bottom > outerRect.bottom);
+
+ const horizontallyVisible =
+ innerRect.left >= outerRect.left ||
+ innerRect.right <= outerRect.right ||
+ (innerRect.left < outerRect.left && innerRect.right > outerRect.right);
+
+ const visible = verticallyVisible && horizontallyVisible;
+ return visible;
+}
+
+async function getEditorLineGutter(dbg, line) {
+ const lineEl = await getEditorLineEl(dbg, line);
+ return lineEl.firstChild;
+}
+
+async function getEditorLineEl(dbg, line) {
+ let el = await codeMirrorGutterElement(dbg, line);
+ while (el && !el.matches(".CodeMirror-code > div")) {
+ el = el.parentElement;
+ }
+
+ return el;
+}
+
+/**
+ * Opens the debugger editor context menu in either codemirror or the
+ * the debugger gutter.
+ * @param {Object} dbg
+ * @param {String} elementName
+ * The element to select
+ * @param {Number} line
+ * The line to open the context menu on.
+ */
+async function openContextMenuInDebugger(dbg, elementName, line) {
+ const waitForOpen = waitForContextMenu(dbg);
+ info(`Open ${elementName} context menu on line ${line || ""}`);
+ rightClickElement(dbg, elementName, line);
+ return waitForOpen;
+}
+
+/**
+ * Select a range of lines in the editor and open the contextmenu
+ * @param {Object} dbg
+ * @param {Object} lines
+ * @returns
+ */
+async function selectEditorLinesAndOpenContextMenu(dbg, lines) {
+ const { startLine, endLine } = lines;
+ const elementName = "line";
+ if (!endLine) {
+ await clickElement(dbg, elementName, startLine);
+ } else {
+ getCM(dbg).setSelection(
+ { line: startLine - 1, ch: 0 },
+ { line: endLine, ch: 0 }
+ );
+ }
+ return openContextMenuInDebugger(dbg, elementName, startLine);
+}
+
+/**
+ * Asserts that the styling for ignored lines are applied
+ * @param {Object} dbg
+ * @param {Object} options
+ * lines {null | Number[]} [lines] Line(s) to assert.
+ * - If null is passed, the assertion is on all the blackboxed lines
+ * - If an array of one item (start line) is passed, the assertion is on the specified line
+ * - If an array (start and end lines) is passed, the assertion is on the multiple lines seelected
+ * hasBlackboxedLinesClass
+ * If `true` assert that style exist, else assert that style does not exist
+ */
+function assertIgnoredStyleInSourceLines(
+ dbg,
+ { lines, hasBlackboxedLinesClass }
+) {
+ if (lines) {
+ let currentLine = lines[0];
+ do {
+ const element = findElement(dbg, "line", currentLine);
+ const hasStyle = hasBlackboxedLinesClass
+ ? element.parentNode.classList.contains("blackboxed-line")
+ : !element.parentNode.classList.contains("blackboxed-line");
+ ok(
+ hasStyle,
+ `Line ${currentLine} ${
+ hasBlackboxedLinesClass ? "does not have" : "has"
+ } ignored styling`
+ );
+ currentLine = currentLine + 1;
+ } while (currentLine <= lines[1]);
+ } else {
+ const codeLines = findAllElementsWithSelector(
+ dbg,
+ ".CodeMirror-code .CodeMirror-line"
+ );
+ const blackboxedLines = findAllElementsWithSelector(
+ dbg,
+ ".CodeMirror-code .blackboxed-line"
+ );
+ is(
+ hasBlackboxedLinesClass ? codeLines.length : 0,
+ blackboxedLines.length,
+ `${blackboxedLines.length} of ${codeLines.length} lines are blackboxed`
+ );
+ }
+}
+
+/**
+ * Assert the text content on the line matches what is
+ * expected.
+ *
+ * @param {Object} dbg
+ * @param {Number} line
+ * @param {String} expectedTextContent
+ */
+function assertTextContentOnLine(dbg, line, expectedTextContent) {
+ const lineInfo = getCM(dbg).lineInfo(line - 1);
+ const textContent = lineInfo.text.trim();
+ is(textContent, expectedTextContent, `Expected text content on line ${line}`);
+}
+
+/*
+ * Assert that no breakpoint is set on a given line of
+ * the currently selected source in the editor.
+ *
+ * @memberof mochitest/helpers
+ * @param {Object} dbg
+ * @param {Number} line Line where to check for a breakpoint in the editor
+ * @static
+ */
+async function assertNoBreakpoint(dbg, line) {
+ const el = await getEditorLineEl(dbg, line);
+
+ const exists = !!el.querySelector(".new-breakpoint");
+ ok(!exists, `Breakpoint doesn't exists on line ${line}`);
+}
+
+/*
+ * Assert that a regular breakpoint is set in the currently
+ * selected source in the editor. (no conditional, nor log breakpoint)
+ *
+ * @memberof mochitest/helpers
+ * @param {Object} dbg
+ * @param {Number} line Line where to check for a breakpoint
+ * @static
+ */
+async function assertBreakpoint(dbg, line) {
+ const el = await getEditorLineEl(dbg, line);
+
+ const exists = !!el.querySelector(".new-breakpoint");
+ ok(exists, `Breakpoint exists on line ${line}`);
+
+ const hasConditionClass = el.classList.contains("has-condition");
+
+ ok(
+ !hasConditionClass,
+ `Regular breakpoint doesn't have condition on line ${line}`
+ );
+
+ const hasLogClass = el.classList.contains("has-log");
+
+ ok(!hasLogClass, `Regular breakpoint doesn't have log on line ${line}`);
+}
+
+/*
+ * Assert that a conditionnal breakpoint is set.
+ *
+ * @memberof mochitest/helpers
+ * @param {Object} dbg
+ * @param {Number} line Line where to check for a breakpoint
+ * @static
+ */
+async function assertConditionBreakpoint(dbg, line) {
+ const el = await getEditorLineEl(dbg, line);
+
+ const exists = !!el.querySelector(".new-breakpoint");
+ ok(exists, `Breakpoint exists on line ${line}`);
+
+ const hasConditionClass = el.classList.contains("has-condition");
+
+ ok(hasConditionClass, `Conditional breakpoint on line ${line}`);
+
+ const hasLogClass = el.classList.contains("has-log");
+
+ ok(
+ !hasLogClass,
+ `Conditional breakpoint doesn't have log breakpoint on line ${line}`
+ );
+}
+
+/*
+ * Assert that a log breakpoint is set.
+ *
+ * @memberof mochitest/helpers
+ * @param {Object} dbg
+ * @param {Number} line Line where to check for a breakpoint
+ * @static
+ */
+async function assertLogBreakpoint(dbg, line) {
+ const el = await getEditorLineEl(dbg, line);
+
+ const exists = !!el.querySelector(".new-breakpoint");
+ ok(exists, `Breakpoint exists on line ${line}`);
+
+ const hasConditionClass = el.classList.contains("has-condition");
+
+ ok(
+ !hasConditionClass,
+ `Log breakpoint doesn't have condition on line ${line}`
+ );
+
+ const hasLogClass = el.classList.contains("has-log");
+
+ ok(hasLogClass, `Log breakpoint on line ${line}`);
+}
+
+function assertBreakpointSnippet(dbg, index, expectedSnippet) {
+ const actualSnippet = findElement(dbg, "breakpointLabel", 2).innerText;
+ is(actualSnippet, expectedSnippet, `Breakpoint ${index} snippet`);
+}
+
+const selectors = {
+ callStackHeader: ".call-stack-pane ._header .header-label",
+ callStackBody: ".call-stack-pane .pane",
+ domMutationItem: ".dom-mutation-list li",
+ expressionNode: i =>
+ `.expressions-list .expression-container:nth-child(${i}) .object-label`,
+ expressionValue: i =>
+ // eslint-disable-next-line max-len
+ `.expressions-list .expression-container:nth-child(${i}) .object-delimiter + *`,
+ expressionClose: i =>
+ `.expressions-list .expression-container:nth-child(${i}) .close`,
+ expressionInput: ".watch-expressions-pane input.input-expression",
+ expressionNodes: ".expressions-list .tree-node",
+ expressionPlus: ".watch-expressions-pane button.plus",
+ expressionRefresh: ".watch-expressions-pane button.refresh",
+ expressionsHeader: ".watch-expressions-pane ._header .header-label",
+ scopesHeader: ".scopes-pane ._header .header-label",
+ breakpointItem: i => `.breakpoints-list div:nth-of-type(${i})`,
+ breakpointLabel: i => `${selectors.breakpointItem(i)} .breakpoint-label`,
+ breakpointHeadings: ".breakpoints-list .breakpoint-heading",
+ breakpointItems: ".breakpoints-list .breakpoint",
+ breakpointContextMenu: {
+ disableSelf: "#node-menu-disable-self",
+ disableAll: "#node-menu-disable-all",
+ disableOthers: "#node-menu-disable-others",
+ enableSelf: "#node-menu-enable-self",
+ enableOthers: "#node-menu-enable-others",
+ disableDbgStatement: "#node-menu-disable-dbgStatement",
+ enableDbgStatement: "#node-menu-enable-dbgStatement",
+ remove: "#node-menu-delete-self",
+ removeOthers: "#node-menu-delete-other",
+ removeCondition: "#node-menu-remove-condition",
+ },
+ editorContextMenu: {
+ continueToHere: "#node-menu-continue-to-here",
+ },
+ columnBreakpoints: ".column-breakpoint",
+ scopes: ".scopes-list",
+ scopeNodes: ".scopes-list .object-label",
+ scopeNode: i => `.scopes-list .tree-node:nth-child(${i}) .object-label`,
+ scopeValue: i =>
+ `.scopes-list .tree-node:nth-child(${i}) .object-delimiter + *`,
+ mapScopesCheckbox: ".map-scopes-header input",
+ frame: i => `.frames [role="list"] [role="listitem"]:nth-child(${i})`,
+ frames: '.frames [role="list"] [role="listitem"]',
+ gutter: i => `.CodeMirror-code *:nth-child(${i}) .CodeMirror-linenumber`,
+ line: i => `.CodeMirror-code div:nth-child(${i}) .CodeMirror-line`,
+ addConditionItem:
+ "#node-menu-add-condition, #node-menu-add-conditional-breakpoint",
+ editConditionItem:
+ "#node-menu-edit-condition, #node-menu-edit-conditional-breakpoint",
+ addLogItem: "#node-menu-add-log-point",
+ editLogItem: "#node-menu-edit-log-point",
+ disableItem: "#node-menu-disable-breakpoint",
+ menuitem: i => `menupopup menuitem:nth-child(${i})`,
+ pauseOnExceptions: ".pause-exceptions",
+ breakpoint: ".CodeMirror-code > .new-breakpoint",
+ highlightLine: ".CodeMirror-code > .highlight-line",
+ debugLine: ".new-debug-line",
+ debugErrorLine: ".new-debug-line-error",
+ codeMirror: ".CodeMirror",
+ resume: ".resume.active",
+ pause: ".pause.active",
+ sourceTabs: ".source-tabs",
+ activeTab: ".source-tab.active",
+ stepOver: ".stepOver.active",
+ stepOut: ".stepOut.active",
+ stepIn: ".stepIn.active",
+ trace: ".debugger-trace-menu-button",
+ prettyPrintButton: ".source-footer .prettyPrint",
+ mappedSourceLink: ".source-footer .mapped-source",
+ sourcesFooter: ".sources-panel .source-footer",
+ editorFooter: ".editor-pane .source-footer",
+ sourceNode: i => `.sources-list .tree-node:nth-child(${i}) .node`,
+ sourceNodes: ".sources-list .tree-node",
+ sourceTreeThreads: '.sources-list .tree-node[aria-level="1"]',
+ sourceTreeThreadsNodes:
+ '.sources-list .tree-node[aria-level="1"] > .node > span:nth-child(1)',
+ sourceTreeFiles: ".sources-list .tree-node[data-expandable=false]",
+ threadSourceTree: i => `.threads-list .sources-pane:nth-child(${i})`,
+ threadSourceTreeSourceNode: (i, j) =>
+ `${selectors.threadSourceTree(i)} .tree-node:nth-child(${j}) .node`,
+ sourceDirectoryLabel: i => `.sources-list .tree-node:nth-child(${i}) .label`,
+ resultItems: ".result-list .result-item",
+ resultItemName: (name, i) =>
+ `${selectors.resultItems}:nth-child(${i})[title$="${name}"]`,
+ fileMatch: ".project-text-search .line-value",
+ popup: ".popover",
+ previewPopup: ".preview-popup",
+ openInspector: "button.open-inspector",
+ outlineItem: i =>
+ `.outline-list__element:nth-child(${i}) .function-signature`,
+ outlineItems: ".outline-list__element",
+ conditionalPanel: ".conditional-breakpoint-panel",
+ conditionalPanelInput: ".conditional-breakpoint-panel textarea",
+ conditionalBreakpointInSecPane: ".breakpoint.is-conditional",
+ logPointPanel: ".conditional-breakpoint-panel.log-point",
+ logPointInSecPane: ".breakpoint.is-log",
+ searchField: ".search-field",
+ blackbox: ".action.black-box",
+ projectSearchSearchInput: ".project-text-search .search-field input",
+ projectSearchCollapsed: ".project-text-search .arrow:not(.expanded)",
+ projectSearchExpandedResults: ".project-text-search .result",
+ projectSearchFileResults: ".project-text-search .file-result",
+ projectSearchModifiersCaseSensitive:
+ ".project-text-search button.case-sensitive-btn",
+ projectSearchModifiersRegexMatch:
+ ".project-text-search button.regex-match-btn",
+ projectSearchModifiersWholeWordMatch:
+ ".project-text-search button.whole-word-btn",
+ projectSearchRefreshButton: ".project-text-search button.refresh-btn",
+ threadsPaneItems: ".threads-pane .thread",
+ threadsPaneItem: i => `.threads-pane .thread:nth-child(${i})`,
+ threadsPaneItemPause: i => `${selectors.threadsPaneItem(i)}.paused`,
+ CodeMirrorLines: ".CodeMirror-lines",
+ inlinePreviewLabels: ".inline-preview .inline-preview-label",
+ inlinePreviewValues: ".inline-preview .inline-preview-value",
+ inlinePreviewOpenInspector: ".inline-preview-value button.open-inspector",
+ watchpointsSubmenu: "#node-menu-watchpoints",
+ addGetWatchpoint: "#node-menu-add-get-watchpoint",
+ addSetWatchpoint: "#node-menu-add-set-watchpoint",
+ removeWatchpoint: "#node-menu-remove-watchpoint",
+ logEventsCheckbox: ".events-header input",
+ previewPopupInvokeGetterButton: ".preview-popup .invoke-getter",
+ previewPopupObjectNumber: ".preview-popup .objectBox-number",
+ previewPopupObjectObject: ".preview-popup .objectBox-object",
+ sourceTreeRootNode: ".sources-panel .node .window",
+ sourceTreeFolderNode: ".sources-panel .node .folder",
+ excludePatternsInput: ".project-text-search .exclude-patterns-field input",
+ fileSearchInput: ".search-bar input",
+ watchExpressionsHeader: ".watch-expressions-pane ._header .header-label",
+ watchExpressionsAddButton: ".watch-expressions-pane ._header .plus",
+ editorNotificationFooter: ".editor-notification-footer",
+};
+
+function getSelector(elementName, ...args) {
+ let selector = selectors[elementName];
+ if (!selector) {
+ throw new Error(`The selector ${elementName} is not defined`);
+ }
+
+ if (typeof selector == "function") {
+ selector = selector(...args);
+ }
+
+ return selector;
+}
+
+function findElement(dbg, elementName, ...args) {
+ const selector = getSelector(elementName, ...args);
+ return findElementWithSelector(dbg, selector);
+}
+
+function findElementWithSelector(dbg, selector) {
+ return dbg.win.document.querySelector(selector);
+}
+
+function findAllElements(dbg, elementName, ...args) {
+ const selector = getSelector(elementName, ...args);
+ return findAllElementsWithSelector(dbg, selector);
+}
+
+function findAllElementsWithSelector(dbg, selector) {
+ return dbg.win.document.querySelectorAll(selector);
+}
+
+function getSourceNodeLabel(dbg, index) {
+ return findElement(dbg, "sourceNode", index)
+ .textContent.trim()
+ .replace(/^[\s\u200b]*/g, "");
+}
+
+/**
+ * Simulates a mouse click in the debugger DOM.
+ *
+ * @memberof mochitest/helpers
+ * @param {Object} dbg
+ * @param {String} elementName
+ * @param {Array} args
+ * @return {Promise}
+ * @static
+ */
+async function clickElement(dbg, elementName, ...args) {
+ const selector = getSelector(elementName, ...args);
+ const el = await waitForElementWithSelector(dbg, selector);
+
+ el.scrollIntoView();
+
+ return clickElementWithSelector(dbg, selector);
+}
+
+function clickElementWithSelector(dbg, selector) {
+ clickDOMElement(dbg, findElementWithSelector(dbg, selector));
+}
+
+function clickDOMElement(dbg, element, options = {}) {
+ EventUtils.synthesizeMouseAtCenter(element, options, dbg.win);
+}
+
+function dblClickElement(dbg, elementName, ...args) {
+ const selector = getSelector(elementName, ...args);
+
+ return EventUtils.synthesizeMouseAtCenter(
+ findElementWithSelector(dbg, selector),
+ { clickCount: 2 },
+ dbg.win
+ );
+}
+
+function clickElementWithOptions(dbg, elementName, options, ...args) {
+ const selector = getSelector(elementName, ...args);
+ const el = findElementWithSelector(dbg, selector);
+ el.scrollIntoView();
+
+ return EventUtils.synthesizeMouseAtCenter(el, options, dbg.win);
+}
+
+function altClickElement(dbg, elementName, ...args) {
+ return clickElementWithOptions(dbg, elementName, { altKey: true }, ...args);
+}
+
+function shiftClickElement(dbg, elementName, ...args) {
+ return clickElementWithOptions(dbg, elementName, { shiftKey: true }, ...args);
+}
+
+function rightClickElement(dbg, elementName, ...args) {
+ const selector = getSelector(elementName, ...args);
+ const doc = dbg.win.document;
+ return rightClickEl(dbg, doc.querySelector(selector));
+}
+
+function rightClickEl(dbg, el) {
+ const doc = dbg.win.document;
+ el.scrollIntoView();
+ EventUtils.synthesizeMouseAtCenter(el, { type: "contextmenu" }, dbg.win);
+}
+
+async function clearElement(dbg, elementName) {
+ await clickElement(dbg, elementName);
+ await pressKey(dbg, "End");
+ const selector = getSelector(elementName);
+ const el = findElementWithSelector(dbg, getSelector(elementName));
+ let len = el.value.length;
+ while (len) {
+ pressKey(dbg, "Backspace");
+ len--;
+ }
+}
+
+async function clickGutter(dbg, line) {
+ const el = await codeMirrorGutterElement(dbg, line);
+ clickDOMElement(dbg, el);
+}
+
+async function cmdClickGutter(dbg, line) {
+ const el = await codeMirrorGutterElement(dbg, line);
+ clickDOMElement(dbg, el, cmdOrCtrl);
+}
+
+function findContextMenu(dbg, selector) {
+ // the context menu is in the toolbox window
+ const doc = dbg.toolbox.topDoc;
+
+ // there are several context menus, we want the one with the menu-api
+ const popup = doc.querySelector('menupopup[menu-api="true"]');
+
+ return popup.querySelector(selector);
+}
+
+// Waits for the context menu to exist and to fully open. Once this function
+// completes, selectContextMenuItem can be called.
+// waitForContextMenu must be called after menu opening has been triggered, e.g.
+// after synthesizing a right click / contextmenu event.
+async function waitForContextMenu(dbg) {
+ // the context menu is in the toolbox window
+ const doc = dbg.toolbox.topDoc;
+
+ // there are several context menus, we want the one with the menu-api
+ const popup = await waitFor(() =>
+ doc.querySelector('menupopup[menu-api="true"]')
+ );
+
+ if (popup.state == "open") {
+ return popup;
+ }
+
+ await new Promise(resolve => {
+ popup.addEventListener("popupshown", () => resolve(), { once: true });
+ });
+
+ return popup;
+}
+
+/**
+ * Closes and open context menu popup.
+ *
+ * @memberof mochitest/helpers
+ * @param {Object} dbg
+ * @param {String} popup - The currently opened popup returned by
+ * `waitForContextMenu`.
+ * @return {Promise}
+ */
+
+async function closeContextMenu(dbg, popup) {
+ const onHidden = new Promise(resolve => {
+ popup.addEventListener("popuphidden", resolve, { once: true });
+ });
+ popup.hidePopup();
+ return onHidden;
+}
+
+function selectContextMenuItem(dbg, selector) {
+ const item = findContextMenu(dbg, selector);
+ item.closest("menupopup").activateItem(item);
+}
+
+async function openContextMenuSubmenu(dbg, selector) {
+ const item = findContextMenu(dbg, selector);
+ const popup = item.menupopup;
+ const popupshown = new Promise(resolve => {
+ popup.addEventListener("popupshown", () => resolve(), { once: true });
+ });
+ item.openMenu(true);
+ await popupshown;
+ return popup;
+}
+
+async function assertContextMenuLabel(dbg, selector, expectedLabel) {
+ const item = await waitFor(() => findContextMenu(dbg, selector));
+ is(
+ item.label,
+ expectedLabel,
+ "The label of the context menu item shown to the user"
+ );
+}
+
+async function typeInPanel(dbg, text) {
+ await waitForElement(dbg, "conditionalPanelInput");
+ // Position cursor reliably at the end of the text.
+ pressKey(dbg, "End");
+ type(dbg, text);
+ pressKey(dbg, "Enter");
+}
+
+async function toggleMapScopes(dbg) {
+ info("Turn on original variable mapping");
+ const scopesLoaded = waitForLoadedScopes(dbg);
+ const onDispatch = waitForDispatch(dbg.store, "TOGGLE_MAP_SCOPES");
+ clickElement(dbg, "mapScopesCheckbox");
+ return Promise.all([onDispatch, scopesLoaded]);
+}
+
+async function waitForPausedInOriginalFileAndToggleMapScopes(
+ dbg,
+ expectedSelectedSource = null
+) {
+ // Original variable mapping is not switched on, so do not wait for any loaded scopes
+ await waitForPaused(dbg, expectedSelectedSource, {
+ shouldWaitForLoadedScopes: false,
+ });
+ await toggleMapScopes(dbg);
+}
+
+function toggleExpressions(dbg) {
+ return findElement(dbg, "expressionsHeader").click();
+}
+
+function toggleScopes(dbg) {
+ return findElement(dbg, "scopesHeader").click();
+}
+
+function toggleExpressionNode(dbg, index) {
+ return toggleObjectInspectorNode(findElement(dbg, "expressionNode", index));
+}
+
+function toggleScopeNode(dbg, index) {
+ return toggleObjectInspectorNode(findElement(dbg, "scopeNode", index));
+}
+
+function rightClickScopeNode(dbg, index) {
+ rightClickObjectInspectorNode(dbg, findElement(dbg, "scopeNode", index));
+}
+
+function getScopeNodeLabel(dbg, index) {
+ return findElement(dbg, "scopeNode", index).innerText;
+}
+
+function getScopeNodeValue(dbg, index) {
+ return findElement(dbg, "scopeValue", index).innerText;
+}
+
+function toggleObjectInspectorNode(node) {
+ const objectInspector = node.closest(".object-inspector");
+ const properties = objectInspector.querySelectorAll(".node").length;
+
+ info(`Toggling node ${node.innerText}`);
+ node.click();
+ return waitUntil(
+ () => objectInspector.querySelectorAll(".node").length !== properties
+ );
+}
+
+function rightClickObjectInspectorNode(dbg, node) {
+ const objectInspector = node.closest(".object-inspector");
+ const properties = objectInspector.querySelectorAll(".node").length;
+
+ info(`Right clicking node ${node.innerText}`);
+ rightClickEl(dbg, node);
+
+ return waitUntil(
+ () => objectInspector.querySelectorAll(".node").length !== properties
+ );
+}
+
+function getCM(dbg) {
+ const el = dbg.win.document.querySelector(".CodeMirror");
+ return el.CodeMirror;
+}
+
+function getCoordsFromPosition(cm, { line, ch }) {
+ return cm.charCoords({ line: ~~line, ch: ~~ch });
+}
+
+async function getTokenFromPosition(dbg, { line, column = 0 }) {
+ info(`Get token at ${line}:${column}`);
+ const cm = getCM(dbg);
+
+ // CodeMirror is 0-based while line and column arguments are 1-based.
+ // Pass "ch=-1" when there is no column argument passed.
+ const cmPosition = { line: line - 1, ch: column - 1 };
+
+ const onScrolled = waitForScrolling(cm);
+ cm.scrollIntoView(cmPosition, 0);
+
+ // Ensure the line is visible with margin because the bar at the bottom of
+ // the editor overlaps into what the editor thinks is its own space, blocking
+ // the click event below.
+ await onScrolled;
+
+ const { left, top } = getCoordsFromPosition(cm, cmPosition);
+
+ // Adds a vertical offset due to increased line height
+ // https://github.com/firefox-devtools/debugger/pull/7934
+ const lineHeightOffset = 3;
+
+ // Note that we might end up retrieving any popup if one is still shown over the expected token
+ return dbg.win.document.elementFromPoint(left, top + lineHeightOffset);
+}
+
+async function waitForScrolling(codeMirror) {
+ return new Promise(resolve => {
+ codeMirror.on("scroll", resolve);
+ setTimeout(resolve, 500);
+ });
+}
+
+async function codeMirrorGutterElement(dbg, line) {
+ info(`CodeMirror line ${line}`);
+ const cm = getCM(dbg);
+
+ const position = { line: line - 1, ch: 0 };
+ cm.scrollIntoView(position, 0);
+ await waitForScrolling(cm);
+
+ const coords = getCoordsFromPosition(cm, position);
+
+ const { left, top } = coords;
+
+ // Adds a vertical offset due to increased line height
+ // https://github.com/firefox-devtools/debugger/pull/7934
+ const lineHeightOffset = 3;
+
+ // Click in the center of the line/breakpoint
+ const leftOffset = 10;
+
+ const tokenEl = dbg.win.document.elementFromPoint(
+ left - leftOffset,
+ top + lineHeightOffset
+ );
+
+ if (!tokenEl) {
+ throw new Error(`Failed to find element for line ${line}`);
+ }
+ return tokenEl;
+}
+
+async function clickAtPos(dbg, pos) {
+ const tokenEl = await getTokenFromPosition(dbg, pos);
+
+ if (!tokenEl) {
+ return;
+ }
+
+ const { top, left } = tokenEl.getBoundingClientRect();
+ info(
+ `Clicking on token ${tokenEl.innerText} in line ${tokenEl.parentNode.innerText}`
+ );
+ tokenEl.dispatchEvent(
+ new MouseEvent("click", {
+ bubbles: true,
+ cancelable: true,
+ view: dbg.win,
+ clientX: left,
+ clientY: top,
+ })
+ );
+}
+
+async function rightClickAtPos(dbg, pos) {
+ const el = await getTokenFromPosition(dbg, pos);
+ if (!el) {
+ return;
+ }
+
+ EventUtils.synthesizeMouseAtCenter(el, { type: "contextmenu" }, dbg.win);
+}
+
+async function hoverAtPos(dbg, pos) {
+ const tokenEl = await getTokenFromPosition(dbg, pos);
+
+ if (!tokenEl) {
+ return;
+ }
+
+ hoverToken(tokenEl);
+}
+
+function hoverToken(tokenEl) {
+ info(`Hovering on token <${tokenEl.innerText}>`);
+
+ // We can't use synthesizeMouse(AtCenter) as it's using the element bounding client rect.
+ // But here, we might have a token that wraps on multiple line and the center of the
+ // bounding client rect won't actually hover the token.
+ // +───────────────────────+
+ // │ myLongVariableNa│
+ // │me + │
+ // +───────────────────────+
+
+ // Instead, we need to get the first quad.
+ const { p1, p2, p3 } = tokenEl.getBoxQuads()[0];
+ const x = p1.x + (p2.x - p1.x) / 2;
+ const y = p1.y + (p3.y - p1.y) / 2;
+
+ // This first event helps utils/editor/tokens.js to receive the right mouseover event
+ EventUtils.synthesizeMouseAtPoint(
+ x,
+ y,
+ {
+ type: "mouseover",
+ },
+ tokenEl.ownerGlobal
+ );
+
+ // This second event helps Popover to have :hover pseudoclass set on the token element
+ EventUtils.synthesizeMouseAtPoint(
+ x,
+ y,
+ {
+ type: "mousemove",
+ },
+ tokenEl.ownerGlobal
+ );
+}
+
+/**
+ * Helper to close a variable preview popup.
+ *
+ * @param {Object} dbg
+ * @param {DOM Element} tokenEl
+ * The DOM element on which we hovered to display the popup.
+ * @param {String} previewType
+ * Based on the actual JS value being hovered we may have two different kinds
+ * of popups: popup (for js objects) or previewPopup (for primitives)
+ */
+async function closePreviewForToken(
+ dbg,
+ tokenEl,
+ previewType = "previewPopup"
+) {
+ ok(
+ findElement(dbg, previewType),
+ "A preview was opened before trying to close it"
+ );
+
+ // Force "mousing out" from all elements.
+ //
+ // This helps utils/editor/tokens.js to receive the right mouseleave event.
+ // This is super important as it will then allow re-emitting a tokenenter event if you try to re-preview the same token!
+ // We can't use synthesizeMouse(AtCenter) as it's using the element bounding client rect.
+ // But here, we might have a token that wraps on multiple line and the center of the
+ // bounding client rect won't actually hover the token.
+ // +───────────────────────+
+ // │ myLongVariableNa│
+ // │me + │
+ // +───────────────────────+
+
+ // Instead, we need to get the first quad.
+ const { p1, p2, p3 } = tokenEl.getBoxQuads()[0];
+ const x = p1.x + (p2.x - p1.x) / 2;
+ const y = p1.y + (p3.y - p1.y) / 2;
+ EventUtils.synthesizeMouseAtPoint(
+ tokenEl,
+ x,
+ y,
+ {
+ type: "mouseout",
+ },
+ tokenEl.ownerGlobal
+ );
+
+ // This second event helps Popover to have :hover pseudoclass removed on the token element
+ //
+ // For some unexplained reason, the precise element onto which we emit mousemove is actually important.
+ // Emitting it on documentElement, or random other element within CodeMirror would cause
+ // a "mousemove" event to be emitted on preview-popup element instead and wouldn't cause :hover
+ // pseudoclass to be dropped.
+ const element = tokenEl.ownerDocument.querySelector(
+ ".debugger-settings-menu-button"
+ );
+ EventUtils.synthesizeMouseAtCenter(
+ element,
+ {
+ type: "mousemove",
+ },
+ element.ownerGlobal
+ );
+
+ await waitUntil(() => findElement(dbg, previewType) == null);
+ info("Preview closed");
+}
+
+/**
+ * Hover at a position until we see a preview element (popup, tooltip) appear.
+ * ⚠️ Note that this is using CodeMirror method to retrieve the token element
+ * and that could be subject to CodeMirror bugs / outdated internal state
+ *
+ * @param {Debugger} dbg
+ * @param {Integer} line: The line we want to hover over
+ * @param {Integer} column: The column we want to hover over
+ * @param {String} elementName: "Selector" string that will be passed to waitForElement,
+ * describing the element that should be displayed on hover.
+ * @returns Promise<{element, tokenEl}>
+ * element is the DOM element matching the passed elementName
+ * tokenEl is the DOM element for the token we hovered
+ */
+async function tryHovering(dbg, line, column, elementName) {
+ ok(
+ !findElement(dbg, elementName),
+ "The expected preview element on hover should not exist beforehand"
+ );
+
+ const tokenEl = await getTokenFromPosition(dbg, { line, column });
+ return tryHoverToken(dbg, tokenEl, elementName);
+}
+
+/**
+ * Retrieve the token element matching `expression` at line `line` and hover it.
+ * This is retrieving the token from the DOM, contrary to `tryHovering`, which calls
+ * CodeMirror internal method for this (and which might suffer from bugs / outdated internal state)
+ *
+ * @param {Debugger} dbg
+ * @param {String} expression: The text of the token we want to hover
+ * @param {Integer} line: The line the token should be at
+ * @param {Integer} column: The column the token should be at
+ * @param {String} elementName: "Selector" string that will be passed to waitForElement,
+ * describing the element that should be displayed on hover.
+ * @returns Promise<{element, tokenEl}>
+ * element is the DOM element matching the passed elementName
+ * tokenEl is the DOM element for the token we hovered
+ */
+async function tryHoverTokenAtLine(dbg, expression, line, column, elementName) {
+ info("Scroll codeMirror to make the token visible");
+ const cm = getCM(dbg);
+ const onScrolled = waitForScrolling(cm);
+ cm.scrollIntoView({ line: line - 1, ch: 0 }, 0);
+ await onScrolled;
+
+ // Lookup for the token matching the passed expression
+ const tokenEl = getTokenElAtLine(dbg, expression, line, column);
+ if (!tokenEl) {
+ throw new Error(
+ `Couldn't find token <${expression}> on ${line}:${column}\n`
+ );
+ }
+
+ ok(true, `Found token <${expression}> on ${line}:${column}`);
+
+ return tryHoverToken(dbg, tokenEl, elementName);
+}
+
+async function tryHoverToken(dbg, tokenEl, elementName) {
+ hoverToken(tokenEl);
+
+ // Wait for the preview element to be created
+ const element = await waitForElement(dbg, elementName);
+ return { element, tokenEl };
+}
+
+/**
+ * Retrieve the token element matching `expression` at line `line`, from the DOM.
+ *
+ * @param {Debugger} dbg
+ * @param {String} expression: The text of the token we want to hover
+ * @param {Integer} line: The line the token should be at
+ * @param {Integer} column: The column the token should be at
+ * @returns {Element} the token element, or null if not found
+ */
+function getTokenElAtLine(dbg, expression, line, column = 0) {
+ info(`Search for <${expression}> token on ${line}:${column}`);
+ // Get the line gutter element matching the passed line
+ const lineGutterEl = [
+ ...dbg.win.document.querySelectorAll(".CodeMirror-linenumber"),
+ ].find(el => el.textContent === `${line}`);
+
+ // Get the related editor line
+ const editorLineEl = lineGutterEl
+ .closest(".CodeMirror-gutter-wrapper")
+ .parentElement.querySelector(".CodeMirror-line");
+
+ // Lookup for the token matching the passed expression
+ let currentColumn = 1;
+ return Array.from(editorLineEl.childNodes[0].childNodes).find(child => {
+ const childText = child.textContent;
+ currentColumn += childText.length;
+
+ // Only consider elements that are after the passed column
+ if (currentColumn < column) {
+ return false;
+ }
+ return childText === expression;
+ });
+}
+
+/**
+ * Wait for a few ms and assert that a tooltip preview was not displayed.
+ * @param {*} dbg
+ */
+async function assertNoTooltip(dbg) {
+ await wait(200);
+ const el = findElement(dbg, "previewPopup");
+ is(el, null, "Tooltip should not exist");
+}
+
+/**
+ * Hovers and asserts tooltip previews with simple text expressions (i.e numbers and strings)
+ * @param {*} dbg
+ * @param {Number} line
+ * @param {Number} column
+ * @param {Object} options
+ * @param {String} options.result - Expected text shown in the preview
+ * @param {String} options.expression - The expression hovered over
+ * @param {Boolean} options.doNotClose - Set to true to not close the tooltip
+ */
+async function assertPreviewTextValue(
+ dbg,
+ line,
+ column,
+ { result, expression, doNotClose = false }
+) {
+ // CodeMirror refreshes after inline previews are displayed, so wait until they're rendered.
+ await waitForInlinePreviews(dbg);
+
+ const { element: previewEl, tokenEl } = await tryHoverTokenAtLine(
+ dbg,
+ expression,
+ line,
+ column,
+ "previewPopup"
+ );
+
+ ok(
+ previewEl.innerText.includes(result),
+ "Popup preview text shown to user. Got: " +
+ previewEl.innerText +
+ " Expected: " +
+ result
+ );
+
+ if (!doNotClose) {
+ await closePreviewForToken(dbg, tokenEl);
+ }
+}
+
+/**
+ * Asserts multiple previews
+ * @param {*} dbg
+ * @param {Array} previews
+ */
+async function assertPreviews(dbg, previews) {
+ // Move the cursor to the top left corner to have a clean state
+ EventUtils.synthesizeMouse(
+ findElement(dbg, "codeMirror"),
+ 0,
+ 0,
+ {
+ type: "mousemove",
+ },
+ dbg.win
+ );
+
+ // CodeMirror refreshes after inline previews are displayed, so wait until they're rendered.
+ await waitForInlinePreviews(dbg);
+
+ for (const { line, column, expression, result, header, fields } of previews) {
+ info(" # Assert preview on " + line + ":" + column);
+
+ if (result) {
+ await assertPreviewTextValue(dbg, line, column, {
+ expression,
+ result,
+ });
+ }
+
+ if (fields) {
+ const { element: popupEl, tokenEl } = expression
+ ? await tryHoverTokenAtLine(dbg, expression, line, column, "popup")
+ : await tryHovering(dbg, line, column, "popup");
+
+ info("Wait for child nodes to load");
+ await waitUntil(
+ () => popupEl.querySelectorAll(".preview-popup .node").length > 1
+ );
+ ok(true, "child nodes loaded");
+
+ const oiNodes = Array.from(
+ popupEl.querySelectorAll(".preview-popup .node")
+ );
+
+ if (header) {
+ is(
+ oiNodes[0].querySelector(".objectBox").textContent,
+ header,
+ "popup has expected value"
+ );
+ }
+
+ for (const [field, value] of fields) {
+ const node = oiNodes.find(
+ oiNode => oiNode.querySelector(".object-label")?.textContent === field
+ );
+ if (!node) {
+ ok(false, `The "${field}" property is not displayed in the popup`);
+ } else {
+ is(
+ node.querySelector(".object-label").textContent,
+ field,
+ `The "${field}" property is displayed in the popup`
+ );
+ if (value !== undefined) {
+ is(
+ node.querySelector(".objectBox").textContent,
+ value,
+ `The "${field}" property has the expected value`
+ );
+ }
+ }
+ }
+
+ await closePreviewForToken(dbg, tokenEl, "popup");
+ }
+ }
+}
+
+/**
+ * Asserts the inline expression preview value
+ * @param {*} dbg
+ * @param {Number} line
+ * @param {Number} column
+ * @param {Object} options
+ * @param {String} options.result - Expected text shown in the preview
+ * @param {String} options.expression - The expression hovered over
+ * @param {Array} options.fields - The expected stacktrace information
+ */
+async function assertInlineExceptionPreview(
+ dbg,
+ line,
+ column,
+ { expression, result, fields }
+) {
+ info(" # Assert preview on " + line + ":" + column);
+ const { element: popupEl, tokenEl } = await tryHovering(
+ dbg,
+ line,
+ column,
+ "previewPopup"
+ );
+
+ info("Wait for top level node to expand and child nodes to load");
+ await waitForElementWithSelector(
+ dbg,
+ ".exception-popup .exception-message .arrow.expanded"
+ );
+
+ is(
+ popupEl.querySelector(".preview-popup .exception-message .objectBox")
+ .textContent,
+ result,
+ "The correct result is not displayed in the popup"
+ );
+
+ await waitFor(() =>
+ popupEl.querySelectorAll(".preview-popup .exception-stacktrace .frame")
+ );
+ const stackFrameNodes = Array.from(
+ popupEl.querySelectorAll(".preview-popup .exception-stacktrace .frame")
+ );
+
+ for (const [field, value] of fields) {
+ const node = stackFrameNodes.find(
+ frameNode => frameNode.querySelector(".title")?.textContent === field
+ );
+ if (!node) {
+ ok(false, `The "${field}" property is not displayed in the popup`);
+ } else {
+ is(
+ node.querySelector(".location").textContent,
+ value,
+ `The "${field}" property has the expected value`
+ );
+ }
+ }
+
+ await closePreviewForToken(dbg, tokenEl, "previewPopup");
+}
+
+async function waitForBreakableLine(dbg, source, lineNumber) {
+ await waitForState(
+ dbg,
+ state => {
+ const currentSource = findSource(dbg, source);
+
+ const breakableLines =
+ currentSource && dbg.selectors.getBreakableLines(currentSource.id);
+
+ return breakableLines && breakableLines.includes(lineNumber);
+ },
+ `waiting for breakable line ${lineNumber}`
+ );
+}
+
+async function waitForSourceTreeThreadsCount(dbg, i) {
+ info(`waiting for ${i} threads in the source tree`);
+ await waitUntil(() => {
+ return findAllElements(dbg, "sourceTreeThreads").length === i;
+ });
+}
+
+async function waitForSourcesInSourceTree(
+ dbg,
+ sources,
+ { noExpand = false } = {}
+) {
+ info(`waiting for ${sources.length} files in the source tree`);
+ function getDisplayedSources() {
+ // Replace some non visible space characters that prevents Array.includes from working correctly
+ return [...findAllElements(dbg, "sourceTreeFiles")].map(e => {
+ return e.textContent.trim().replace(/^[\s\u200b]*/g, "");
+ });
+ }
+ try {
+ // Use custom timeout and retry count for waitFor as the test method is slow to resolve
+ // and default value makes the timeout unecessarily long
+ await waitFor(
+ async () => {
+ if (!noExpand) {
+ await expandSourceTree(dbg);
+ }
+ const displayedSources = getDisplayedSources();
+ return (
+ displayedSources.length == sources.length &&
+ sources.every(source => displayedSources.includes(source))
+ );
+ },
+ null,
+ 100,
+ 50
+ );
+ } catch (e) {
+ // Craft a custom error message to help understand what's wrong with the Source Tree content
+ const displayedSources = getDisplayedSources();
+ let msg = "Invalid Source Tree Content.\n";
+ const missingElements = [];
+ for (const source of sources) {
+ const idx = displayedSources.indexOf(source);
+ if (idx != -1) {
+ displayedSources.splice(idx, 1);
+ } else {
+ missingElements.push(source);
+ }
+ }
+ if (missingElements.length) {
+ msg += "Missing elements: " + missingElements.join(", ") + "\n";
+ }
+ if (displayedSources.length) {
+ msg += "Unexpected elements: " + displayedSources.join(", ");
+ }
+ throw new Error(msg);
+ }
+}
+
+async function waitForNodeToGainFocus(dbg, index) {
+ await waitUntil(() => {
+ const element = findElement(dbg, "sourceNode", index);
+
+ if (element) {
+ return element.classList.contains("focused");
+ }
+
+ return false;
+ }, `waiting for source node ${index} to be focused`);
+}
+
+async function assertNodeIsFocused(dbg, index) {
+ await waitForNodeToGainFocus(dbg, index);
+ const node = findElement(dbg, "sourceNode", index);
+ ok(node.classList.contains("focused"), `node ${index} is focused`);
+}
+
+/**
+ * Asserts that the debugger is paused and the debugger tab is
+ * highlighted.
+ * @param {*} toolbox
+ * @returns
+ */
+async function assertDebuggerIsHighlightedAndPaused(toolbox) {
+ info("Wait for the debugger to be automatically selected on pause");
+ await waitUntil(() => toolbox.currentToolId == "jsdebugger");
+ ok(true, "Debugger selected");
+
+ // Wait for the debugger to finish loading.
+ await toolbox.getPanelWhenReady("jsdebugger");
+
+ // And to be fully paused
+ const dbg = createDebuggerContext(toolbox);
+ await waitForPaused(dbg);
+
+ ok(toolbox.isHighlighted("jsdebugger"), "Debugger is highlighted");
+
+ return dbg;
+}
+
+async function addExpression(dbg, input) {
+ info("Adding an expression");
+
+ const plusIcon = findElementWithSelector(dbg, selectors.expressionPlus);
+ if (plusIcon) {
+ plusIcon.click();
+ }
+ findElementWithSelector(dbg, selectors.expressionInput).focus();
+ type(dbg, input);
+ const evaluated = waitForDispatch(dbg.store, "EVALUATE_EXPRESSION");
+ const clearAutocomplete = waitForDispatch(dbg.store, "CLEAR_AUTOCOMPLETE");
+ pressKey(dbg, "Enter");
+ await evaluated;
+ await clearAutocomplete;
+}
+
+async function editExpression(dbg, input) {
+ info("Updating the expression");
+ dblClickElement(dbg, "expressionNode", 1);
+ // Position cursor reliably at the end of the text.
+ pressKey(dbg, "End");
+ type(dbg, input);
+ const evaluated = waitForDispatch(dbg.store, "EVALUATE_EXPRESSIONS");
+ pressKey(dbg, "Enter");
+ await evaluated;
+}
+
+/**
+ * Get the text representation of a watch expression label given its position in the panel
+ *
+ * @param {Object} dbg
+ * @param {Number} index: Position in the panel of the expression we want the label of
+ * @returns {String}
+ */
+function getWatchExpressionLabel(dbg, index) {
+ return findElement(dbg, "expressionNode", index).innerText;
+}
+
+/**
+ * Get the text representation of a watch expression value given its position in the panel
+ *
+ * @param {Object} dbg
+ * @param {Number} index: Position in the panel of the expression we want the value of
+ * @returns {String}
+ */
+function getWatchExpressionValue(dbg, index) {
+ return findElement(dbg, "expressionValue", index).innerText;
+}
+
+// Return a promise with a reference to jsterm, opening the split
+// console if necessary. This cleans up the split console pref so
+// it won't pollute other tests.
+async function getDebuggerSplitConsole(dbg) {
+ let { toolbox, win } = dbg;
+
+ if (!win) {
+ win = toolbox.win;
+ }
+
+ if (!toolbox.splitConsole) {
+ pressKey(dbg, "Escape");
+ }
+
+ await toolbox.openSplitConsole();
+ return toolbox.getPanel("webconsole");
+}
+
+// Return a promise that resolves with the result of a thread evaluating a
+// string in the topmost frame.
+async function evaluateInTopFrame(dbg, text) {
+ const threadFront = dbg.toolbox.target.threadFront;
+ const { frames } = await threadFront.getFrames(0, 1);
+ ok(frames.length == 1, "Got one frame");
+ const response = await dbg.commands.scriptCommand.execute(text, {
+ frameActor: frames[0].actorID,
+ });
+ return response.result.type == "undefined" ? undefined : response.result;
+}
+
+// Return a promise that resolves when a thread evaluates a string in the
+// topmost frame, ensuring the result matches the expected value.
+async function checkEvaluateInTopFrame(dbg, text, expected) {
+ const rval = await evaluateInTopFrame(dbg, text);
+ ok(rval == expected, `Eval returned ${expected}`);
+}
+
+async function findConsoleMessage({ toolbox }, query) {
+ const [message] = await findConsoleMessages(toolbox, query);
+ const value = message.querySelector(".message-body").innerText;
+ // There are console messages which might not have a link e.g Error messages
+ const link = message.querySelector(".frame-link-source")?.innerText;
+ return { value, link };
+}
+
+async function findConsoleMessages(toolbox, query) {
+ const webConsole = await toolbox.getPanel("webconsole");
+ const win = webConsole._frameWindow;
+ return Array.prototype.filter.call(
+ win.document.querySelectorAll(".message"),
+ e => e.innerText.includes(query)
+ );
+}
+
+async function hasConsoleMessage({ toolbox }, msg) {
+ return waitFor(async () => {
+ const messages = await findConsoleMessages(toolbox, msg);
+ return !!messages.length;
+ });
+}
+
+function evaluateExpressionInConsole(
+ hud,
+ expression,
+ expectedClassName = "result"
+) {
+ const seenMessages = new Set(
+ JSON.parse(
+ hud.ui.outputNode
+ .querySelector("[data-visible-messages]")
+ .getAttribute("data-visible-messages")
+ )
+ );
+ const onResult = new Promise(res => {
+ const onNewMessage = messages => {
+ for (const message of messages) {
+ if (
+ message.node.classList.contains(expectedClassName) &&
+ !seenMessages.has(message.node.getAttribute("data-message-id"))
+ ) {
+ hud.ui.off("new-messages", onNewMessage);
+ res(message.node);
+ }
+ }
+ };
+ hud.ui.on("new-messages", onNewMessage);
+ });
+ hud.ui.wrapper.dispatchEvaluateExpression(expression);
+ return onResult;
+}
+
+function waitForInspectorPanelChange(dbg) {
+ return dbg.toolbox.getPanelWhenReady("inspector");
+}
+
+function getEagerEvaluationElement(hud) {
+ return hud.ui.outputNode.querySelector(".eager-evaluation-result");
+}
+
+async function waitForEagerEvaluationResult(hud, text) {
+ await waitUntil(() => {
+ const elem = getEagerEvaluationElement(hud);
+ if (elem) {
+ if (text instanceof RegExp) {
+ return text.test(elem.innerText);
+ }
+ return elem.innerText == text;
+ }
+ return false;
+ });
+ ok(true, `Got eager evaluation result ${text}`);
+}
+
+function setInputValue(hud, value) {
+ const onValueSet = hud.jsterm.once("set-input-value");
+ hud.jsterm._setValue(value);
+ return onValueSet;
+}
+
+function assertMenuItemChecked(menuItem, isChecked) {
+ is(
+ !!menuItem.getAttribute("aria-checked"),
+ isChecked,
+ `Item has expected state: ${isChecked ? "checked" : "unchecked"}`
+ );
+}
+
+async function toggleDebbuggerSettingsMenuItem(dbg, { className, isChecked }) {
+ const menuButton = findElementWithSelector(
+ dbg,
+ ".debugger-settings-menu-button"
+ );
+ const { parent } = dbg.panel.panelWin;
+ const { document } = parent;
+
+ menuButton.click();
+ // Waits for the debugger settings panel to appear.
+ await waitFor(() => {
+ const menuListEl = document.querySelector("#debugger-settings-menu-list");
+ // Lets check the offsetParent property to make sure the menu list is actually visible
+ // by its parents display property being no longer "none".
+ return menuListEl && menuListEl.offsetParent !== null;
+ });
+
+ const menuItem = document.querySelector(className);
+
+ assertMenuItemChecked(menuItem, isChecked);
+
+ menuItem.click();
+
+ // Waits for the debugger settings panel to disappear.
+ await waitFor(() => menuButton.getAttribute("aria-expanded") === "false");
+}
+
+async function setLogPoint(dbg, index, value) {
+ rightClickElement(dbg, "gutter", index);
+ await waitForContextMenu(dbg);
+ selectContextMenuItem(
+ dbg,
+ `${selectors.addLogItem},${selectors.editLogItem}`
+ );
+ const onBreakpointSet = waitForDispatch(dbg.store, "SET_BREAKPOINT");
+ await typeInPanel(dbg, value);
+ await onBreakpointSet;
+}
+/**
+ * Opens the project search panel
+ *
+ * @param {Object} dbg
+ * @return {Boolean} The project search is open
+ */
+function openProjectSearch(dbg) {
+ info("Opening the project search panel");
+ synthesizeKeyShortcut("CmdOrCtrl+Shift+F");
+ return waitForState(
+ dbg,
+ state => dbg.selectors.getActiveSearch() === "project"
+ );
+}
+
+/**
+ * Starts a project search based on the specified search term
+ *
+ * @param {Object} dbg
+ * @param {String} searchTerm - The test to search for
+ * @param {Number} expectedResults - The expected no of results to wait for.
+ * This is the number of file results and not the numer of matches in all files.
+ * When falsy value is passed, expects no match.
+ * @return {Array} List of search results element nodes
+ */
+async function doProjectSearch(dbg, searchTerm, expectedResults) {
+ await clearElement(dbg, "projectSearchSearchInput");
+ type(dbg, searchTerm);
+ pressKey(dbg, "Enter");
+ return waitForSearchResults(dbg, expectedResults);
+}
+
+/**
+ * Waits for the search resluts node to render
+ *
+ * @param {Object} dbg
+ * @param {Number} expectedResults - The expected no of results to wait for
+ * This is the number of file results and not the numer of matches in all files.
+ * @return (Array) List of search result element nodes
+ */
+async function waitForSearchResults(dbg, expectedResults) {
+ if (expectedResults) {
+ info(`Wait for ${expectedResults} project search results`);
+ await waitUntil(
+ () =>
+ findAllElements(dbg, "projectSearchFileResults").length ==
+ expectedResults
+ );
+ } else {
+ // If no results are expected, wait for the "no results" message to be displayed.
+ info("Wait for project search to complete with no results");
+ await waitUntil(() => {
+ const projectSearchResult = findElementWithSelector(
+ dbg,
+ ".no-result-msg"
+ );
+ return projectSearchResult
+ ? projectSearchResult.textContent ==
+ DEBUGGER_L10N.getStr("projectTextSearch.noResults")
+ : false;
+ });
+ }
+ return findAllElements(dbg, "projectSearchFileResults");
+}
+
+/**
+ * Get the no of expanded search results
+ *
+ * @param {Object} dbg
+ * @return {Number} No of expanded results
+ */
+function getExpandedResultsCount(dbg) {
+ return findAllElements(dbg, "projectSearchExpandedResults").length;
+}
+
+// This module is also loaded for Browser Toolbox tests, within the browser toolbox process
+// which doesn't contain mochitests resource://testing-common URL.
+// This isn't important to allow rejections in the context of the browser toolbox tests.
+const protocolHandler = Services.io
+ .getProtocolHandler("resource")
+ .QueryInterface(Ci.nsIResProtocolHandler);
+if (protocolHandler.hasSubstitution("testing-common")) {
+ const { PromiseTestUtils } = ChromeUtils.importESModule(
+ "resource://testing-common/PromiseTestUtils.sys.mjs"
+ );
+ PromiseTestUtils.allowMatchingRejectionsGlobally(/Connection closed/);
+ this.PromiseTestUtils = PromiseTestUtils;
+
+ // Debugger operations that are canceled because they were rendered obsolete by
+ // a navigation or pause/resume end up as uncaught rejections. These never
+ // indicate errors and are allowed in all debugger tests.
+ // All the following are related to context middleware throwing on obsolete async actions:
+ PromiseTestUtils.allowMatchingRejectionsGlobally(/DebuggerContextError/);
+}
+
+/**
+ * Selects the specific black box context menu item
+ * @param {Object} dbg
+ * @param {String} itemName
+ * The name of the context menu item.
+ */
+async function selectBlackBoxContextMenuItem(dbg, itemName) {
+ let wait = null;
+ if (itemName == "blackbox-line" || itemName == "blackbox-lines") {
+ wait = Promise.any([
+ waitForDispatch(dbg.store, "BLACKBOX_SOURCE_RANGES"),
+ waitForDispatch(dbg.store, "UNBLACKBOX_SOURCE_RANGES"),
+ ]);
+ } else if (itemName == "blackbox") {
+ wait = Promise.any([
+ waitForDispatch(dbg.store, "BLACKBOX_WHOLE_SOURCES"),
+ waitForDispatch(dbg.store, "UNBLACKBOX_WHOLE_SOURCES"),
+ ]);
+ }
+
+ info(`Select the ${itemName} context menu item`);
+ selectContextMenuItem(dbg, `#node-menu-${itemName}`);
+ return wait;
+}
+
+function openOutlinePanel(dbg, waitForOutlineList = true) {
+ const outlineTab = findElementWithSelector(dbg, ".outline-tab a");
+ EventUtils.synthesizeMouseAtCenter(outlineTab, {}, outlineTab.ownerGlobal);
+
+ if (!waitForOutlineList) {
+ return Promise.resolve();
+ }
+
+ return waitForElementWithSelector(dbg, ".outline-list");
+}
+
+// Test empty panel when source has not function or class symbols
+// Test that anonymous functions do not show in the outline panel
+function assertOutlineItems(dbg, expectedItems) {
+ const outlineItems = Array.from(
+ findAllElementsWithSelector(
+ dbg,
+ ".outline-list h2, .outline-list .outline-list__element"
+ )
+ );
+ SimpleTest.isDeeply(
+ outlineItems.map(i => i.innerText.trim()),
+ expectedItems,
+ "The expected items are displayed in the outline panel"
+ );
+}
+
+async function checkAdditionalThreadCount(dbg, count) {
+ await waitForState(
+ dbg,
+ state => {
+ return dbg.selectors.getThreads().length == count;
+ },
+ "Have the expected number of additional threads"
+ );
+ ok(true, `Have ${count} threads`);
+}
+
+/**
+ * Retrieve the text displayed as warning under the editor.
+ */
+function findFooterNotificationMessage(dbg) {
+ return findElement(dbg, "editorNotificationFooter")?.innerText;
+}
diff --git a/devtools/client/debugger/test/xpcshell/.eslintrc.js b/devtools/client/debugger/test/xpcshell/.eslintrc.js
new file mode 100644
index 0000000000..59cba1a072
--- /dev/null
+++ b/devtools/client/debugger/test/xpcshell/.eslintrc.js
@@ -0,0 +1,10 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+module.exports = {
+ // Extend from the common devtools xpcshell eslintrc config.
+ extends: "../../../../.eslintrc.xpcshell.js",
+};
diff --git a/devtools/client/debugger/test/xpcshell/test_sourcetree_utils_getRelativePath.js b/devtools/client/debugger/test/xpcshell/test_sourcetree_utils_getRelativePath.js
new file mode 100644
index 0000000000..e64daee773
--- /dev/null
+++ b/devtools/client/debugger/test/xpcshell/test_sourcetree_utils_getRelativePath.js
@@ -0,0 +1,70 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+"use strict";
+
+const { require } = ChromeUtils.importESModule(
+ "resource://devtools/shared/loader/Loader.sys.mjs"
+);
+const {
+ getRelativePath,
+} = require("devtools/client/debugger/src/utils/sources-tree/utils");
+
+function run_test() {
+ info("Test a url without any path");
+ equal(
+ getRelativePath("http://example.com/"),
+ "(index)",
+ "Returns a string representing the index file"
+ );
+
+ info("Test a url with directory path");
+ equal(
+ getRelativePath("http://example.com/path/"),
+ "path/",
+ "Returns the directory path"
+ );
+
+ info("Test a http url a simple file path with no extension");
+ equal(
+ getRelativePath("http://example.com/file"),
+ "file",
+ "Returns the simple path"
+ );
+
+ info("Test a file url with a multi directory file path with no extension");
+ equal(
+ getRelativePath("file:///path/to/file"),
+ "path/to/file",
+ "Returns the full file path"
+ );
+
+ info("Test a http url which is multi directory with html file path");
+ equal(
+ getRelativePath("http://example.com/path/to/file.html"),
+ "path/to/file.html",
+ "Returns the full html file path"
+ );
+
+ info("Test a http url which is multi directory with js file path");
+ equal(
+ getRelativePath("http://example.com/path/to/file.js"),
+ "path/to/file.js",
+ "Returns the full js file path"
+ );
+
+ info("Test a file url with path and query parameters");
+ equal(
+ getRelativePath("file:///path/to/file.js?bla=bla"),
+ "path/to/file.js",
+ "Returns the full path without the query params"
+ );
+
+ info("Test a webpack url with path and fragment");
+ equal(
+ getRelativePath("webpack:///path/to/file.js#bla"),
+ "path/to/file.js",
+ "Returns the full path without the query params"
+ );
+}
diff --git a/devtools/client/debugger/test/xpcshell/xpcshell.toml b/devtools/client/debugger/test/xpcshell/xpcshell.toml
new file mode 100644
index 0000000000..650ee0af8a
--- /dev/null
+++ b/devtools/client/debugger/test/xpcshell/xpcshell.toml
@@ -0,0 +1,7 @@
+[DEFAULT]
+tags = "devtools"
+firefox-appdir = "browser"
+skip-if = ["os == 'android'"]
+
+["test_sourcetree_utils_getRelativePath.js"]
+
diff --git a/devtools/client/debugger/yarn.lock b/devtools/client/debugger/yarn.lock
new file mode 100644
index 0000000000..5f893c7307
--- /dev/null
+++ b/devtools/client/debugger/yarn.lock
@@ -0,0 +1,5638 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@ampproject/remapping@^2.2.0":
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630"
+ integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.0"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.13":
+ version "7.22.13"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e"
+ integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==
+ dependencies:
+ "@babel/highlight" "^7.22.13"
+ chalk "^2.4.2"
+
+"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9", "@babel/compat-data@^7.23.2":
+ version "7.23.2"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.2.tgz#6a12ced93455827037bfb5ed8492820d60fc32cc"
+ integrity sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==
+
+"@babel/core@^7.0.0", "@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.23.2", "@babel/core@^7.7.2", "@babel/core@^7.8.0":
+ version "7.23.2"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.2.tgz#ed10df0d580fff67c5f3ee70fd22e2e4c90a9f94"
+ integrity sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==
+ dependencies:
+ "@ampproject/remapping" "^2.2.0"
+ "@babel/code-frame" "^7.22.13"
+ "@babel/generator" "^7.23.0"
+ "@babel/helper-compilation-targets" "^7.22.15"
+ "@babel/helper-module-transforms" "^7.23.0"
+ "@babel/helpers" "^7.23.2"
+ "@babel/parser" "^7.23.0"
+ "@babel/template" "^7.22.15"
+ "@babel/traverse" "^7.23.2"
+ "@babel/types" "^7.23.0"
+ convert-source-map "^2.0.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.2"
+ json5 "^2.2.3"
+ semver "^6.3.1"
+
+"@babel/generator@^7.23.0", "@babel/generator@^7.7.2":
+ version "7.23.0"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420"
+ integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==
+ dependencies:
+ "@babel/types" "^7.23.0"
+ "@jridgewell/gen-mapping" "^0.3.2"
+ "@jridgewell/trace-mapping" "^0.3.17"
+ jsesc "^2.5.1"
+
+"@babel/helper-annotate-as-pure@^7.18.6", "@babel/helper-annotate-as-pure@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882"
+ integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==
+ dependencies:
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956"
+ integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==
+ dependencies:
+ "@babel/types" "^7.22.15"
+
+"@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52"
+ integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==
+ dependencies:
+ "@babel/compat-data" "^7.22.9"
+ "@babel/helper-validator-option" "^7.22.15"
+ browserslist "^4.21.9"
+ lru-cache "^5.1.1"
+ semver "^6.3.1"
+
+"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0", "@babel/helper-create-class-features-plugin@^7.22.11", "@babel/helper-create-class-features-plugin@^7.22.5":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz#97a61b385e57fe458496fad19f8e63b63c867de4"
+ integrity sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.22.5"
+ "@babel/helper-environment-visitor" "^7.22.5"
+ "@babel/helper-function-name" "^7.22.5"
+ "@babel/helper-member-expression-to-functions" "^7.22.15"
+ "@babel/helper-optimise-call-expression" "^7.22.5"
+ "@babel/helper-replace-supers" "^7.22.9"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
+ "@babel/helper-split-export-declaration" "^7.22.6"
+ semver "^6.3.1"
+
+"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1"
+ integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.22.5"
+ regexpu-core "^5.3.1"
+ semver "^6.3.1"
+
+"@babel/helper-define-polyfill-provider@^0.4.3":
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz#a71c10f7146d809f4a256c373f462d9bba8cf6ba"
+ integrity sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug==
+ dependencies:
+ "@babel/helper-compilation-targets" "^7.22.6"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ debug "^4.1.1"
+ lodash.debounce "^4.0.8"
+ resolve "^1.14.2"
+
+"@babel/helper-environment-visitor@^7.22.20", "@babel/helper-environment-visitor@^7.22.5":
+ version "7.22.20"
+ resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167"
+ integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==
+
+"@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0":
+ version "7.23.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759"
+ integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==
+ dependencies:
+ "@babel/template" "^7.22.15"
+ "@babel/types" "^7.23.0"
+
+"@babel/helper-hoist-variables@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb"
+ integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==
+ dependencies:
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-member-expression-to-functions@^7.22.15":
+ version "7.23.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366"
+ integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==
+ dependencies:
+ "@babel/types" "^7.23.0"
+
+"@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.22.5":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0"
+ integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==
+ dependencies:
+ "@babel/types" "^7.22.15"
+
+"@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.23.0":
+ version "7.23.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e"
+ integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.22.20"
+ "@babel/helper-module-imports" "^7.22.15"
+ "@babel/helper-simple-access" "^7.22.5"
+ "@babel/helper-split-export-declaration" "^7.22.6"
+ "@babel/helper-validator-identifier" "^7.22.20"
+
+"@babel/helper-optimise-call-expression@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e"
+ integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==
+ dependencies:
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295"
+ integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==
+
+"@babel/helper-remap-async-to-generator@^7.22.20", "@babel/helper-remap-async-to-generator@^7.22.5":
+ version "7.22.20"
+ resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0"
+ integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.22.5"
+ "@babel/helper-environment-visitor" "^7.22.20"
+ "@babel/helper-wrap-function" "^7.22.20"
+
+"@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9":
+ version "7.22.20"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793"
+ integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.22.20"
+ "@babel/helper-member-expression-to-functions" "^7.22.15"
+ "@babel/helper-optimise-call-expression" "^7.22.5"
+
+"@babel/helper-simple-access@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de"
+ integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==
+ dependencies:
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847"
+ integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==
+ dependencies:
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-split-export-declaration@^7.22.6":
+ version "7.22.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c"
+ integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==
+ dependencies:
+ "@babel/types" "^7.22.5"
+
+"@babel/helper-string-parser@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f"
+ integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==
+
+"@babel/helper-validator-identifier@^7.22.20":
+ version "7.22.20"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0"
+ integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==
+
+"@babel/helper-validator-option@^7.14.5", "@babel/helper-validator-option@^7.22.15":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040"
+ integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==
+
+"@babel/helper-wrap-function@^7.22.20":
+ version "7.22.20"
+ resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569"
+ integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==
+ dependencies:
+ "@babel/helper-function-name" "^7.22.5"
+ "@babel/template" "^7.22.15"
+ "@babel/types" "^7.22.19"
+
+"@babel/helpers@^7.23.2":
+ version "7.23.2"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.2.tgz#2832549a6e37d484286e15ba36a5330483cac767"
+ integrity sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==
+ dependencies:
+ "@babel/template" "^7.22.15"
+ "@babel/traverse" "^7.23.2"
+ "@babel/types" "^7.23.0"
+
+"@babel/highlight@^7.22.13":
+ version "7.22.20"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54"
+ integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.22.20"
+ chalk "^2.4.2"
+ js-tokens "^4.0.0"
+
+"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.0":
+ version "7.23.0"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719"
+ integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==
+
+"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.15":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz#02dc8a03f613ed5fdc29fb2f728397c78146c962"
+ integrity sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.15":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz#2aeb91d337d4e1a1e7ce85b76a37f5301781200f"
+ integrity sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
+ "@babel/plugin-transform-optional-chaining" "^7.22.15"
+
+"@babel/plugin-proposal-class-properties@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3"
+ integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-proposal-class-static-block@^7.21.0":
+ version "7.21.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz#77bdd66fb7b605f3a61302d224bdfacf5547977d"
+ integrity sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.21.0"
+ "@babel/helper-plugin-utils" "^7.20.2"
+ "@babel/plugin-syntax-class-static-block" "^7.14.5"
+
+"@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1"
+ integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.18.6"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+
+"@babel/plugin-proposal-optional-chaining@^7.21.0":
+ version "7.21.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea"
+ integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.20.2"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+
+"@babel/plugin-proposal-private-methods@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea"
+ integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2":
+ version "7.21.0-placeholder-for-preset-env.2"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703"
+ integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==
+
+"@babel/plugin-proposal-private-property-in-object@^7.21.11":
+ version "7.21.11"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz#69d597086b6760c4126525cfa154f34631ff272c"
+ integrity sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.18.6"
+ "@babel/helper-create-class-features-plugin" "^7.21.0"
+ "@babel/helper-plugin-utils" "^7.20.2"
+ "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
+
+"@babel/plugin-proposal-unicode-sets-regex@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-sets-regex/-/plugin-proposal-unicode-sets-regex-7.18.6.tgz#fe65c43780b44795af4fadba41f5c939e52cd225"
+ integrity sha512-QE3KY5FtjQqToXYSdNVwHE3I1oCMsfIcQQJsvvr54+xdT6Jkpkzp2x+JHov12YVlJZTLoRNdjZSIYEOfmlundw==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-syntax-async-generators@^7.8.4":
+ version "7.8.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d"
+ integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-bigint@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea"
+ integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10"
+ integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-syntax-class-static-block@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406"
+ integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-dynamic-import@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3"
+ integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-export-namespace-from@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a"
+ integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.3"
+
+"@babel/plugin-syntax-import-assertions@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz#07d252e2aa0bc6125567f742cd58619cb14dce98"
+ integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-syntax-import-attributes@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz#ab840248d834410b829f569f5262b9e517555ecb"
+ integrity sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51"
+ integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-json-strings@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a"
+ integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-jsx@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz#a6b68e84fb76e759fc3b93e901876ffabbe1d918"
+ integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
+ integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9"
+ integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97"
+ integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-object-rest-spread@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871"
+ integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-catch-binding@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1"
+ integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-chaining@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a"
+ integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-private-property-in-object@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad"
+ integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c"
+ integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-typescript@^7.7.2":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz#aac8d383b062c5072c647a31ef990c1d0af90272"
+ integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-syntax-unicode-sets-regex@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357"
+ integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-transform-arrow-functions@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz#e5ba566d0c58a5b2ba2a8b795450641950b71958"
+ integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-async-generator-functions@^7.23.2":
+ version "7.23.2"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz#054afe290d64c6f576f371ccc321772c8ea87ebb"
+ integrity sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.22.20"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-remap-async-to-generator" "^7.22.20"
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
+
+"@babel/plugin-transform-async-to-generator@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz#c7a85f44e46f8952f6d27fe57c2ed3cc084c3775"
+ integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==
+ dependencies:
+ "@babel/helper-module-imports" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-remap-async-to-generator" "^7.22.5"
+
+"@babel/plugin-transform-block-scoped-functions@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz#27978075bfaeb9fa586d3cb63a3d30c1de580024"
+ integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-block-scoping@^7.23.0":
+ version "7.23.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz#8744d02c6c264d82e1a4bc5d2d501fd8aff6f022"
+ integrity sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-class-properties@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz#97a56e31ad8c9dc06a0b3710ce7803d5a48cca77"
+ integrity sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-class-static-block@^7.22.11":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz#dc8cc6e498f55692ac6b4b89e56d87cec766c974"
+ integrity sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.22.11"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/plugin-syntax-class-static-block" "^7.14.5"
+
+"@babel/plugin-transform-classes@^7.22.15":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz#aaf4753aee262a232bbc95451b4bdf9599c65a0b"
+ integrity sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.22.5"
+ "@babel/helper-compilation-targets" "^7.22.15"
+ "@babel/helper-environment-visitor" "^7.22.5"
+ "@babel/helper-function-name" "^7.22.5"
+ "@babel/helper-optimise-call-expression" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-replace-supers" "^7.22.9"
+ "@babel/helper-split-export-declaration" "^7.22.6"
+ globals "^11.1.0"
+
+"@babel/plugin-transform-computed-properties@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz#cd1e994bf9f316bd1c2dafcd02063ec261bb3869"
+ integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/template" "^7.22.5"
+
+"@babel/plugin-transform-destructuring@^7.23.0":
+ version "7.23.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz#6447aa686be48b32eaf65a73e0e2c0bd010a266c"
+ integrity sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-dotall-regex@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz#dbb4f0e45766eb544e193fb00e65a1dd3b2a4165"
+ integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-duplicate-keys@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz#b6e6428d9416f5f0bba19c70d1e6e7e0b88ab285"
+ integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-dynamic-import@^7.22.11":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz#2c7722d2a5c01839eaf31518c6ff96d408e447aa"
+ integrity sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/plugin-syntax-dynamic-import" "^7.8.3"
+
+"@babel/plugin-transform-exponentiation-operator@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz#402432ad544a1f9a480da865fda26be653e48f6a"
+ integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==
+ dependencies:
+ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-export-namespace-from@^7.22.11":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz#b3c84c8f19880b6c7440108f8929caf6056db26c"
+ integrity sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+
+"@babel/plugin-transform-for-of@^7.22.15":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz#f64b4ccc3a4f131a996388fae7680b472b306b29"
+ integrity sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-function-name@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz#935189af68b01898e0d6d99658db6b164205c143"
+ integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==
+ dependencies:
+ "@babel/helper-compilation-targets" "^7.22.5"
+ "@babel/helper-function-name" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-json-strings@^7.22.11":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz#689a34e1eed1928a40954e37f74509f48af67835"
+ integrity sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/plugin-syntax-json-strings" "^7.8.3"
+
+"@babel/plugin-transform-literals@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz#e9341f4b5a167952576e23db8d435849b1dd7920"
+ integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-logical-assignment-operators@^7.22.11":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz#24c522a61688bde045b7d9bc3c2597a4d948fc9c"
+ integrity sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+
+"@babel/plugin-transform-member-expression-literals@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz#4fcc9050eded981a468347dd374539ed3e058def"
+ integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-modules-amd@^7.23.0":
+ version "7.23.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz#05b2bc43373faa6d30ca89214731f76f966f3b88"
+ integrity sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.23.0"
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-modules-commonjs@^7.23.0":
+ version "7.23.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz#b3dba4757133b2762c00f4f94590cf6d52602481"
+ integrity sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.23.0"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-simple-access" "^7.22.5"
+
+"@babel/plugin-transform-modules-systemjs@^7.23.0":
+ version "7.23.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz#77591e126f3ff4132a40595a6cccd00a6b60d160"
+ integrity sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==
+ dependencies:
+ "@babel/helper-hoist-variables" "^7.22.5"
+ "@babel/helper-module-transforms" "^7.23.0"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-validator-identifier" "^7.22.20"
+
+"@babel/plugin-transform-modules-umd@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz#4694ae40a87b1745e3775b6a7fe96400315d4f98"
+ integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f"
+ integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-new-target@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz#1b248acea54ce44ea06dfd37247ba089fcf9758d"
+ integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-nullish-coalescing-operator@^7.22.11":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz#debef6c8ba795f5ac67cd861a81b744c5d38d9fc"
+ integrity sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+
+"@babel/plugin-transform-numeric-separator@^7.22.11":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz#498d77dc45a6c6db74bb829c02a01c1d719cbfbd"
+ integrity sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+
+"@babel/plugin-transform-object-rest-spread@^7.22.15":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz#21a95db166be59b91cde48775310c0df6e1da56f"
+ integrity sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==
+ dependencies:
+ "@babel/compat-data" "^7.22.9"
+ "@babel/helper-compilation-targets" "^7.22.15"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+ "@babel/plugin-transform-parameters" "^7.22.15"
+
+"@babel/plugin-transform-object-super@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz#794a8d2fcb5d0835af722173c1a9d704f44e218c"
+ integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-replace-supers" "^7.22.5"
+
+"@babel/plugin-transform-optional-catch-binding@^7.22.11":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz#461cc4f578a127bb055527b3e77404cad38c08e0"
+ integrity sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+
+"@babel/plugin-transform-optional-chaining@^7.22.15", "@babel/plugin-transform-optional-chaining@^7.23.0":
+ version "7.23.0"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz#73ff5fc1cf98f542f09f29c0631647d8ad0be158"
+ integrity sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+
+"@babel/plugin-transform-parameters@^7.22.15":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz#719ca82a01d177af358df64a514d64c2e3edb114"
+ integrity sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-private-methods@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz#21c8af791f76674420a147ae62e9935d790f8722"
+ integrity sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-private-property-in-object@^7.22.11":
+ version "7.22.11"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz#ad45c4fc440e9cb84c718ed0906d96cf40f9a4e1"
+ integrity sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.22.5"
+ "@babel/helper-create-class-features-plugin" "^7.22.11"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
+
+"@babel/plugin-transform-property-literals@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz#b5ddabd73a4f7f26cd0e20f5db48290b88732766"
+ integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-react-display-name@^7.14.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz#3c4326f9fce31c7968d6cb9debcaf32d9e279a2b"
+ integrity sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-react-jsx-development@^7.14.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz#e716b6edbef972a92165cd69d92f1255f7e73e87"
+ integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==
+ dependencies:
+ "@babel/plugin-transform-react-jsx" "^7.22.5"
+
+"@babel/plugin-transform-react-jsx@^7.14.5", "@babel/plugin-transform-react-jsx@^7.22.5":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz#7e6266d88705d7c49f11c98db8b9464531289cd6"
+ integrity sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.22.5"
+ "@babel/helper-module-imports" "^7.22.15"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/plugin-syntax-jsx" "^7.22.5"
+ "@babel/types" "^7.22.15"
+
+"@babel/plugin-transform-react-pure-annotations@^7.14.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz#1f58363eef6626d6fa517b95ac66fe94685e32c0"
+ integrity sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-regenerator@^7.22.10":
+ version "7.22.10"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz#8ceef3bd7375c4db7652878b0241b2be5d0c3cca"
+ integrity sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+ regenerator-transform "^0.15.2"
+
+"@babel/plugin-transform-reserved-words@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz#832cd35b81c287c4bcd09ce03e22199641f964fb"
+ integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-shorthand-properties@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz#6e277654be82b5559fc4b9f58088507c24f0c624"
+ integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-spread@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz#6487fd29f229c95e284ba6c98d65eafb893fea6b"
+ integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
+
+"@babel/plugin-transform-sticky-regex@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz#295aba1595bfc8197abd02eae5fc288c0deb26aa"
+ integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-template-literals@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz#8f38cf291e5f7a8e60e9f733193f0bcc10909bff"
+ integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-typeof-symbol@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz#5e2ba478da4b603af8673ff7c54f75a97b716b34"
+ integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-unicode-escapes@^7.22.10":
+ version "7.22.10"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz#c723f380f40a2b2f57a62df24c9005834c8616d9"
+ integrity sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-unicode-property-regex@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz#098898f74d5c1e86660dc112057b2d11227f1c81"
+ integrity sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-unicode-regex@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz#ce7e7bb3ef208c4ff67e02a22816656256d7a183"
+ integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-unicode-sets-regex@^7.22.5":
+ version "7.22.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz#77788060e511b708ffc7d42fdfbc5b37c3004e91"
+ integrity sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.22.5"
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/preset-env@^7.15.6":
+ version "7.23.2"
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.23.2.tgz#1f22be0ff0e121113260337dbc3e58fafce8d059"
+ integrity sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==
+ dependencies:
+ "@babel/compat-data" "^7.23.2"
+ "@babel/helper-compilation-targets" "^7.22.15"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-validator-option" "^7.22.15"
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.15"
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.15"
+ "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2"
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
+ "@babel/plugin-syntax-class-properties" "^7.12.13"
+ "@babel/plugin-syntax-class-static-block" "^7.14.5"
+ "@babel/plugin-syntax-dynamic-import" "^7.8.3"
+ "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+ "@babel/plugin-syntax-import-assertions" "^7.22.5"
+ "@babel/plugin-syntax-import-attributes" "^7.22.5"
+ "@babel/plugin-syntax-import-meta" "^7.10.4"
+ "@babel/plugin-syntax-json-strings" "^7.8.3"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+ "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+ "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
+ "@babel/plugin-syntax-top-level-await" "^7.14.5"
+ "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6"
+ "@babel/plugin-transform-arrow-functions" "^7.22.5"
+ "@babel/plugin-transform-async-generator-functions" "^7.23.2"
+ "@babel/plugin-transform-async-to-generator" "^7.22.5"
+ "@babel/plugin-transform-block-scoped-functions" "^7.22.5"
+ "@babel/plugin-transform-block-scoping" "^7.23.0"
+ "@babel/plugin-transform-class-properties" "^7.22.5"
+ "@babel/plugin-transform-class-static-block" "^7.22.11"
+ "@babel/plugin-transform-classes" "^7.22.15"
+ "@babel/plugin-transform-computed-properties" "^7.22.5"
+ "@babel/plugin-transform-destructuring" "^7.23.0"
+ "@babel/plugin-transform-dotall-regex" "^7.22.5"
+ "@babel/plugin-transform-duplicate-keys" "^7.22.5"
+ "@babel/plugin-transform-dynamic-import" "^7.22.11"
+ "@babel/plugin-transform-exponentiation-operator" "^7.22.5"
+ "@babel/plugin-transform-export-namespace-from" "^7.22.11"
+ "@babel/plugin-transform-for-of" "^7.22.15"
+ "@babel/plugin-transform-function-name" "^7.22.5"
+ "@babel/plugin-transform-json-strings" "^7.22.11"
+ "@babel/plugin-transform-literals" "^7.22.5"
+ "@babel/plugin-transform-logical-assignment-operators" "^7.22.11"
+ "@babel/plugin-transform-member-expression-literals" "^7.22.5"
+ "@babel/plugin-transform-modules-amd" "^7.23.0"
+ "@babel/plugin-transform-modules-commonjs" "^7.23.0"
+ "@babel/plugin-transform-modules-systemjs" "^7.23.0"
+ "@babel/plugin-transform-modules-umd" "^7.22.5"
+ "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5"
+ "@babel/plugin-transform-new-target" "^7.22.5"
+ "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.11"
+ "@babel/plugin-transform-numeric-separator" "^7.22.11"
+ "@babel/plugin-transform-object-rest-spread" "^7.22.15"
+ "@babel/plugin-transform-object-super" "^7.22.5"
+ "@babel/plugin-transform-optional-catch-binding" "^7.22.11"
+ "@babel/plugin-transform-optional-chaining" "^7.23.0"
+ "@babel/plugin-transform-parameters" "^7.22.15"
+ "@babel/plugin-transform-private-methods" "^7.22.5"
+ "@babel/plugin-transform-private-property-in-object" "^7.22.11"
+ "@babel/plugin-transform-property-literals" "^7.22.5"
+ "@babel/plugin-transform-regenerator" "^7.22.10"
+ "@babel/plugin-transform-reserved-words" "^7.22.5"
+ "@babel/plugin-transform-shorthand-properties" "^7.22.5"
+ "@babel/plugin-transform-spread" "^7.22.5"
+ "@babel/plugin-transform-sticky-regex" "^7.22.5"
+ "@babel/plugin-transform-template-literals" "^7.22.5"
+ "@babel/plugin-transform-typeof-symbol" "^7.22.5"
+ "@babel/plugin-transform-unicode-escapes" "^7.22.10"
+ "@babel/plugin-transform-unicode-property-regex" "^7.22.5"
+ "@babel/plugin-transform-unicode-regex" "^7.22.5"
+ "@babel/plugin-transform-unicode-sets-regex" "^7.22.5"
+ "@babel/preset-modules" "0.1.6-no-external-plugins"
+ "@babel/types" "^7.23.0"
+ babel-plugin-polyfill-corejs2 "^0.4.6"
+ babel-plugin-polyfill-corejs3 "^0.8.5"
+ babel-plugin-polyfill-regenerator "^0.5.3"
+ core-js-compat "^3.31.0"
+ semver "^6.3.1"
+
+"@babel/preset-modules@0.1.6-no-external-plugins":
+ version "0.1.6-no-external-plugins"
+ resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a"
+ integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@babel/types" "^7.4.4"
+ esutils "^2.0.2"
+
+"@babel/preset-react@7.14.5":
+ version "7.14.5"
+ resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.14.5.tgz#0fbb769513f899c2c56f3a882fa79673c2d4ab3c"
+ integrity sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+ "@babel/helper-validator-option" "^7.14.5"
+ "@babel/plugin-transform-react-display-name" "^7.14.5"
+ "@babel/plugin-transform-react-jsx" "^7.14.5"
+ "@babel/plugin-transform-react-jsx-development" "^7.14.5"
+ "@babel/plugin-transform-react-pure-annotations" "^7.14.5"
+
+"@babel/register@^7.0.0", "@babel/register@^7.15.3":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.22.15.tgz#c2c294a361d59f5fa7bcc8b97ef7319c32ecaec7"
+ integrity sha512-V3Q3EqoQdn65RCgTLwauZaTfd1ShhwPmbBv+1dkZV/HpCGMKVyn6oFcRlI7RaKqiDQjX2Qd3AuoEguBgdjIKlg==
+ dependencies:
+ clone-deep "^4.0.1"
+ find-cache-dir "^2.0.0"
+ make-dir "^2.1.0"
+ pirates "^4.0.5"
+ source-map-support "^0.5.16"
+
+"@babel/regjsgen@^0.8.0":
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310"
+ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==
+
+"@babel/runtime@^7.1.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2":
+ version "7.23.2"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.2.tgz#062b0ac103261d68a966c4c7baf2ae3e62ec3885"
+ integrity sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==
+ dependencies:
+ regenerator-runtime "^0.14.0"
+
+"@babel/template@^7.22.15", "@babel/template@^7.22.5", "@babel/template@^7.3.3":
+ version "7.22.15"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38"
+ integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==
+ dependencies:
+ "@babel/code-frame" "^7.22.13"
+ "@babel/parser" "^7.22.15"
+ "@babel/types" "^7.22.15"
+
+"@babel/traverse@^7.23.2", "@babel/traverse@^7.7.2":
+ version "7.23.2"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8"
+ integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==
+ dependencies:
+ "@babel/code-frame" "^7.22.13"
+ "@babel/generator" "^7.23.0"
+ "@babel/helper-environment-visitor" "^7.22.20"
+ "@babel/helper-function-name" "^7.23.0"
+ "@babel/helper-hoist-variables" "^7.22.5"
+ "@babel/helper-split-export-declaration" "^7.22.6"
+ "@babel/parser" "^7.23.0"
+ "@babel/types" "^7.23.0"
+ debug "^4.1.0"
+ globals "^11.1.0"
+
+"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4":
+ version "7.23.0"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb"
+ integrity sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==
+ dependencies:
+ "@babel/helper-string-parser" "^7.22.5"
+ "@babel/helper-validator-identifier" "^7.22.20"
+ to-fast-properties "^2.0.0"
+
+"@bcoe/v8-coverage@^0.2.3":
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
+ integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
+
+"@istanbuljs/load-nyc-config@^1.0.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced"
+ integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==
+ dependencies:
+ camelcase "^5.3.1"
+ find-up "^4.1.0"
+ get-package-type "^0.1.0"
+ js-yaml "^3.13.1"
+ resolve-from "^5.0.0"
+
+"@istanbuljs/schema@^0.1.2":
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98"
+ integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==
+
+"@jest/console@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.5.1.tgz#260fe7239602fe5130a94f1aa386eff54b014bba"
+ integrity sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ jest-message-util "^27.5.1"
+ jest-util "^27.5.1"
+ slash "^3.0.0"
+
+"@jest/core@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/core/-/core-27.5.1.tgz#267ac5f704e09dc52de2922cbf3af9edcd64b626"
+ integrity sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==
+ dependencies:
+ "@jest/console" "^27.5.1"
+ "@jest/reporters" "^27.5.1"
+ "@jest/test-result" "^27.5.1"
+ "@jest/transform" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ ansi-escapes "^4.2.1"
+ chalk "^4.0.0"
+ emittery "^0.8.1"
+ exit "^0.1.2"
+ graceful-fs "^4.2.9"
+ jest-changed-files "^27.5.1"
+ jest-config "^27.5.1"
+ jest-haste-map "^27.5.1"
+ jest-message-util "^27.5.1"
+ jest-regex-util "^27.5.1"
+ jest-resolve "^27.5.1"
+ jest-resolve-dependencies "^27.5.1"
+ jest-runner "^27.5.1"
+ jest-runtime "^27.5.1"
+ jest-snapshot "^27.5.1"
+ jest-util "^27.5.1"
+ jest-validate "^27.5.1"
+ jest-watcher "^27.5.1"
+ micromatch "^4.0.4"
+ rimraf "^3.0.0"
+ slash "^3.0.0"
+ strip-ansi "^6.0.0"
+
+"@jest/environment@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-27.5.1.tgz#d7425820511fe7158abbecc010140c3fd3be9c74"
+ integrity sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==
+ dependencies:
+ "@jest/fake-timers" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ jest-mock "^27.5.1"
+
+"@jest/fake-timers@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-27.5.1.tgz#76979745ce0579c8a94a4678af7a748eda8ada74"
+ integrity sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ "@sinonjs/fake-timers" "^8.0.1"
+ "@types/node" "*"
+ jest-message-util "^27.5.1"
+ jest-mock "^27.5.1"
+ jest-util "^27.5.1"
+
+"@jest/globals@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-27.5.1.tgz#7ac06ce57ab966566c7963431cef458434601b2b"
+ integrity sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==
+ dependencies:
+ "@jest/environment" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ expect "^27.5.1"
+
+"@jest/reporters@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-27.5.1.tgz#ceda7be96170b03c923c37987b64015812ffec04"
+ integrity sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==
+ dependencies:
+ "@bcoe/v8-coverage" "^0.2.3"
+ "@jest/console" "^27.5.1"
+ "@jest/test-result" "^27.5.1"
+ "@jest/transform" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ collect-v8-coverage "^1.0.0"
+ exit "^0.1.2"
+ glob "^7.1.2"
+ graceful-fs "^4.2.9"
+ istanbul-lib-coverage "^3.0.0"
+ istanbul-lib-instrument "^5.1.0"
+ istanbul-lib-report "^3.0.0"
+ istanbul-lib-source-maps "^4.0.0"
+ istanbul-reports "^3.1.3"
+ jest-haste-map "^27.5.1"
+ jest-resolve "^27.5.1"
+ jest-util "^27.5.1"
+ jest-worker "^27.5.1"
+ slash "^3.0.0"
+ source-map "^0.6.0"
+ string-length "^4.0.1"
+ terminal-link "^2.0.0"
+ v8-to-istanbul "^8.1.0"
+
+"@jest/source-map@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-27.5.1.tgz#6608391e465add4205eae073b55e7f279e04e8cf"
+ integrity sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==
+ dependencies:
+ callsites "^3.0.0"
+ graceful-fs "^4.2.9"
+ source-map "^0.6.0"
+
+"@jest/test-result@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-27.5.1.tgz#56a6585fa80f7cdab72b8c5fc2e871d03832f5bb"
+ integrity sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==
+ dependencies:
+ "@jest/console" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/istanbul-lib-coverage" "^2.0.0"
+ collect-v8-coverage "^1.0.0"
+
+"@jest/test-sequencer@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz#4057e0e9cea4439e544c6353c6affe58d095745b"
+ integrity sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==
+ dependencies:
+ "@jest/test-result" "^27.5.1"
+ graceful-fs "^4.2.9"
+ jest-haste-map "^27.5.1"
+ jest-runtime "^27.5.1"
+
+"@jest/transform@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-27.5.1.tgz#6c3501dcc00c4c08915f292a600ece5ecfe1f409"
+ integrity sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==
+ dependencies:
+ "@babel/core" "^7.1.0"
+ "@jest/types" "^27.5.1"
+ babel-plugin-istanbul "^6.1.1"
+ chalk "^4.0.0"
+ convert-source-map "^1.4.0"
+ fast-json-stable-stringify "^2.0.0"
+ graceful-fs "^4.2.9"
+ jest-haste-map "^27.5.1"
+ jest-regex-util "^27.5.1"
+ jest-util "^27.5.1"
+ micromatch "^4.0.4"
+ pirates "^4.0.4"
+ slash "^3.0.0"
+ source-map "^0.6.1"
+ write-file-atomic "^3.0.0"
+
+"@jest/types@^24.9.0":
+ version "24.9.0"
+ resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59"
+ integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==
+ dependencies:
+ "@types/istanbul-lib-coverage" "^2.0.0"
+ "@types/istanbul-reports" "^1.1.1"
+ "@types/yargs" "^13.0.0"
+
+"@jest/types@^27.5.1":
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80"
+ integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==
+ dependencies:
+ "@types/istanbul-lib-coverage" "^2.0.0"
+ "@types/istanbul-reports" "^3.0.0"
+ "@types/node" "*"
+ "@types/yargs" "^16.0.0"
+ chalk "^4.0.0"
+
+"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2":
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098"
+ integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==
+ dependencies:
+ "@jridgewell/set-array" "^1.0.1"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
+"@jridgewell/resolve-uri@^3.1.0":
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721"
+ integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==
+
+"@jridgewell/set-array@^1.0.1":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72"
+ integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
+
+"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.13", "@jridgewell/sourcemap-codec@^1.4.14":
+ version "1.4.15"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
+ integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
+
+"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9":
+ version "0.3.20"
+ resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f"
+ integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.1.0"
+ "@jridgewell/sourcemap-codec" "^1.4.14"
+
+"@rollup/plugin-commonjs@^24.0.1":
+ version "24.1.0"
+ resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-24.1.0.tgz#79e54bd83bb64396761431eee6c44152ef322100"
+ integrity sha512-eSL45hjhCWI0jCCXcNtLVqM5N1JlBGvlFfY0m6oOYnLCJ6N0qEXoZql4sY2MOUArzhH4SA/qBpTxvvZp2Sc+DQ==
+ dependencies:
+ "@rollup/pluginutils" "^5.0.1"
+ commondir "^1.0.1"
+ estree-walker "^2.0.2"
+ glob "^8.0.3"
+ is-reference "1.2.1"
+ magic-string "^0.27.0"
+
+"@rollup/plugin-node-resolve@^15.0.1":
+ version "15.2.3"
+ resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz#e5e0b059bd85ca57489492f295ce88c2d4b0daf9"
+ integrity sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==
+ dependencies:
+ "@rollup/pluginutils" "^5.0.1"
+ "@types/resolve" "1.20.2"
+ deepmerge "^4.2.2"
+ is-builtin-module "^3.2.1"
+ is-module "^1.0.0"
+ resolve "^1.22.1"
+
+"@rollup/pluginutils@^5.0.1":
+ version "5.0.5"
+ resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.0.5.tgz#bbb4c175e19ebfeeb8c132c2eea0ecb89941a66c"
+ integrity sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==
+ dependencies:
+ "@types/estree" "^1.0.0"
+ estree-walker "^2.0.2"
+ picomatch "^2.3.1"
+
+"@sinonjs/commons@^1.7.0":
+ version "1.8.6"
+ resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9"
+ integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==
+ dependencies:
+ type-detect "4.0.8"
+
+"@sinonjs/fake-timers@^8.0.1":
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz#3fdc2b6cb58935b21bfb8d1625eb1300484316e7"
+ integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==
+ dependencies:
+ "@sinonjs/commons" "^1.7.0"
+
+"@tootallnate/once@1":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82"
+ integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==
+
+"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14":
+ version "7.20.3"
+ resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.3.tgz#d5625a50b6f18244425a1359a858c73d70340778"
+ integrity sha512-54fjTSeSHwfan8AyHWrKbfBWiEUrNTZsUwPTDSNaaP1QDQIZbeNUg3a59E9D+375MzUw/x1vx2/0F5LBz+AeYA==
+ dependencies:
+ "@babel/parser" "^7.20.7"
+ "@babel/types" "^7.20.7"
+ "@types/babel__generator" "*"
+ "@types/babel__template" "*"
+ "@types/babel__traverse" "*"
+
+"@types/babel__generator@*":
+ version "7.6.6"
+ resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.6.tgz#676f89f67dc8ddaae923f70ebc5f1fa800c031a8"
+ integrity sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w==
+ dependencies:
+ "@babel/types" "^7.0.0"
+
+"@types/babel__template@*":
+ version "7.4.3"
+ resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.3.tgz#db9ac539a2fe05cfe9e168b24f360701bde41f5f"
+ integrity sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ==
+ dependencies:
+ "@babel/parser" "^7.1.0"
+ "@babel/types" "^7.0.0"
+
+"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6":
+ version "7.20.3"
+ resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.3.tgz#a971aa47441b28ef17884ff945d0551265a2d058"
+ integrity sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw==
+ dependencies:
+ "@babel/types" "^7.20.7"
+
+"@types/estree@*", "@types/estree@^1.0.0":
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.3.tgz#2be19e759a3dd18c79f9f436bd7363556c1a73dd"
+ integrity sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==
+
+"@types/graceful-fs@^4.1.2":
+ version "4.1.8"
+ resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.8.tgz#417e461e4dc79d957dc3107f45fe4973b09c2915"
+ integrity sha512-NhRH7YzWq8WiNKVavKPBmtLYZHxNY19Hh+az28O/phfp68CF45pMFud+ZzJ8ewnxnC5smIdF3dqFeiSUQ5I+pw==
+ dependencies:
+ "@types/node" "*"
+
+"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1":
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#fdfdd69fa16d530047d9963635bd77c71a08c068"
+ integrity sha512-zONci81DZYCZjiLe0r6equvZut0b+dBRPBN5kBDjsONnutYNtJMoWQ9uR2RkL1gLG9NMTzvf+29e5RFfPbeKhQ==
+
+"@types/istanbul-lib-report@*":
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.2.tgz#394798d5f727402eb5ec99eb9618ffcd2b7645a1"
+ integrity sha512-8toY6FgdltSdONav1XtUHl4LN1yTmLza+EuDazb/fEmRNCwjyqNVIQWs2IfC74IqjHkREs/nQ2FWq5kZU9IC0w==
+ dependencies:
+ "@types/istanbul-lib-coverage" "*"
+
+"@types/istanbul-reports@^1.1.1":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2"
+ integrity sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==
+ dependencies:
+ "@types/istanbul-lib-coverage" "*"
+ "@types/istanbul-lib-report" "*"
+
+"@types/istanbul-reports@^3.0.0":
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.3.tgz#0313e2608e6d6955d195f55361ddeebd4b74c6e7"
+ integrity sha512-1nESsePMBlf0RPRffLZi5ujYh7IH1BWL4y9pr+Bn3cJBdxz+RTP8bUFljLz9HvzhhOSWKdyBZ4DIivdL6rvgZg==
+ dependencies:
+ "@types/istanbul-lib-report" "*"
+
+"@types/json-schema@^7.0.5":
+ version "7.0.14"
+ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.14.tgz#74a97a5573980802f32c8e47b663530ab3b6b7d1"
+ integrity sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==
+
+"@types/node@*":
+ version "20.8.7"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.7.tgz#ad23827850843de973096edfc5abc9e922492a25"
+ integrity sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ==
+ dependencies:
+ undici-types "~5.25.1"
+
+"@types/node@^14.0.13":
+ version "14.18.63"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.63.tgz#1788fa8da838dbb5f9ea994b834278205db6ca2b"
+ integrity sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==
+
+"@types/prettier@^2.1.5":
+ version "2.7.3"
+ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f"
+ integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==
+
+"@types/resolve@1.20.2":
+ version "1.20.2"
+ resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975"
+ integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==
+
+"@types/stack-utils@^2.0.0":
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.2.tgz#01284dde9ef4e6d8cef6422798d9a3ad18a66f8b"
+ integrity sha512-g7CK9nHdwjK2n0ymT2CW698FuWJRIx+RP6embAzZ2Qi8/ilIrA1Imt2LVSeHUzKvpoi7BhmmQcXz95eS0f2JXw==
+
+"@types/yargs-parser@*":
+ version "21.0.2"
+ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.2.tgz#7bd04c5da378496ef1695a1008bf8f71847a8b8b"
+ integrity sha512-5qcvofLPbfjmBfKaLfj/+f+Sbd6pN4zl7w7VSVI5uz7m9QZTuB2aZAa2uo1wHFBNN2x6g/SoTkXmd8mQnQF2Cw==
+
+"@types/yargs@^13.0.0":
+ version "13.0.12"
+ resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.12.tgz#d895a88c703b78af0465a9de88aa92c61430b092"
+ integrity sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ==
+ dependencies:
+ "@types/yargs-parser" "*"
+
+"@types/yargs@^16.0.0":
+ version "16.0.7"
+ resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.7.tgz#b0d0502cb5f6c17994df72a600049f10bbf17203"
+ integrity sha512-lQcYmxWuOfJq4IncK88/nwud9rwr1F04CFc5xzk0k4oKVyz/AI35TfsXmhjf6t8zp8mpCOi17BfvuNWx+zrYkg==
+ dependencies:
+ "@types/yargs-parser" "*"
+
+abab@^2.0.3, abab@^2.0.5:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291"
+ integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==
+
+acorn-globals@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45"
+ integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==
+ dependencies:
+ acorn "^7.1.1"
+ acorn-walk "^7.1.1"
+
+acorn-walk@^7.1.1:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc"
+ integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==
+
+acorn@^7.1.1:
+ version "7.4.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
+ integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
+
+acorn@^8.2.4:
+ version "8.10.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5"
+ integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==
+
+acorn@~8.8.2:
+ version "8.8.2"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a"
+ integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==
+
+agent-base@6:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
+ integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
+ dependencies:
+ debug "4"
+
+airbnb-prop-types@^2.16.0:
+ version "2.16.0"
+ resolved "https://registry.yarnpkg.com/airbnb-prop-types/-/airbnb-prop-types-2.16.0.tgz#b96274cefa1abb14f623f804173ee97c13971dc2"
+ integrity sha512-7WHOFolP/6cS96PhKNrslCLMYAI8yB1Pp6u6XmxozQOiZbsI5ycglZr5cHhBFfuRcQQjzCMith5ZPZdYiJCxUg==
+ dependencies:
+ array.prototype.find "^2.1.1"
+ function.prototype.name "^1.1.2"
+ is-regex "^1.1.0"
+ object-is "^1.1.2"
+ object.assign "^4.1.0"
+ object.entries "^1.1.2"
+ prop-types "^15.7.2"
+ prop-types-exact "^1.2.0"
+ react-is "^16.13.1"
+
+ajv-keywords@^3.5.2:
+ version "3.5.2"
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d"
+ integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
+
+ajv@^6.12.4:
+ version "6.12.6"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+ansi-escapes@^4.2.1:
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
+ integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
+ dependencies:
+ type-fest "^0.21.3"
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+ integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==
+
+ansi-regex@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1"
+ integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==
+
+ansi-regex@^4.0.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed"
+ integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==
+
+ansi-regex@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
+ integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
+ansi-styles@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+ integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==
+
+ansi-styles@^3.0.0, ansi-styles@^3.2.0, ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+ansi-styles@^5.0.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b"
+ integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==
+
+anymatch@^3.0.3:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e"
+ integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
+argparse@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+ integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+ dependencies:
+ sprintf-js "~1.0.2"
+
+arr-diff@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf"
+ integrity sha512-dtXTVMkh6VkEEA7OhXnN1Ecb8aAGFdZ1LFxtOCoqj4qkyOJMt7+qs6Ahdy6p/NQCPYsRSXXivhSB/J5E9jmYKA==
+ dependencies:
+ arr-flatten "^1.0.1"
+
+arr-flatten@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+ integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
+
+array-buffer-byte-length@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead"
+ integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==
+ dependencies:
+ call-bind "^1.0.2"
+ is-array-buffer "^3.0.1"
+
+array-unique@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53"
+ integrity sha512-G2n5bG5fSUCpnsXz4+8FUkYsGPkNfLn9YvS66U5qbTIXI2Ynnlo4Bi42bWv+omKUCqz+ejzfClwne0alJWJPhg==
+
+array.prototype.filter@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz#423771edeb417ff5914111fff4277ea0624c0d0e"
+ integrity sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+ es-array-method-boxes-properly "^1.0.0"
+ is-string "^1.0.7"
+
+array.prototype.find@^2.1.1:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.2.2.tgz#e862cf891e725d8f2a10e5e42d750629faaabd32"
+ integrity sha512-DRumkfW97iZGOfn+lIXbkVrXL04sfYKX+EfOodo8XboR5sxPDVvOjZTF/rysusa9lmhmSOeD6Vp6RKQP+eP4Tg==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+ es-shim-unscopables "^1.0.0"
+
+array.prototype.flat@^1.2.3:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18"
+ integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+ es-shim-unscopables "^1.0.0"
+
+arraybuffer.prototype.slice@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12"
+ integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==
+ dependencies:
+ array-buffer-byte-length "^1.0.0"
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+ get-intrinsic "^1.2.1"
+ is-array-buffer "^3.0.2"
+ is-shared-array-buffer "^1.0.2"
+
+arrify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
+ integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==
+
+ast-pretty-print@^1.1.5:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/ast-pretty-print/-/ast-pretty-print-1.3.0.tgz#6654e50ee3de665c541fcf038ddbae5097ce8c43"
+ integrity sha512-AcqIAji4IYKassEgq0EyCouMVYIchN907jDBaaCb5WSPRuyr3I+Qnw6fnwhRLJYSRm7UYxuoSqtj9ZJOe+ynvg==
+ dependencies:
+ ansi-styles "^3.0.0"
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
+
+available-typed-arrays@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7"
+ integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==
+
+babel-code-frame@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
+ integrity sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==
+ dependencies:
+ chalk "^1.1.3"
+ esutils "^2.0.2"
+ js-tokens "^3.0.2"
+
+babel-generator@^6.18.0:
+ version "6.26.1"
+ resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90"
+ integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==
+ dependencies:
+ babel-messages "^6.23.0"
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ detect-indent "^4.0.0"
+ jsesc "^1.3.0"
+ lodash "^4.17.4"
+ source-map "^0.5.7"
+ trim-right "^1.0.1"
+
+babel-jest@^23.0.0:
+ version "23.6.0"
+ resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-23.6.0.tgz#a644232366557a2240a0c083da6b25786185a2f1"
+ integrity sha512-lqKGG6LYXYu+DQh/slrQ8nxXQkEkhugdXsU6St7GmhVS7Ilc/22ArwqXNJrf0QaOBjZB0360qZMwXqDYQHXaew==
+ dependencies:
+ babel-plugin-istanbul "^4.1.6"
+ babel-preset-jest "^23.2.0"
+
+babel-jest@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-27.5.1.tgz#a1bf8d61928edfefd21da27eb86a695bfd691444"
+ integrity sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==
+ dependencies:
+ "@jest/transform" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/babel__core" "^7.1.14"
+ babel-plugin-istanbul "^6.1.1"
+ babel-preset-jest "^27.5.1"
+ chalk "^4.0.0"
+ graceful-fs "^4.2.9"
+ slash "^3.0.0"
+
+babel-loader@^8.2.5:
+ version "8.3.0"
+ resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.3.0.tgz#124936e841ba4fe8176786d6ff28add1f134d6a8"
+ integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==
+ dependencies:
+ find-cache-dir "^3.3.1"
+ loader-utils "^2.0.0"
+ make-dir "^3.1.0"
+ schema-utils "^2.6.5"
+
+babel-messages@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
+ integrity sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w==
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-dynamic-import-node@^2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3"
+ integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==
+ dependencies:
+ object.assign "^4.1.0"
+
+babel-plugin-istanbul@^4.1.6:
+ version "4.1.6"
+ resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz#36c59b2192efce81c5b378321b74175add1c9a45"
+ integrity sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==
+ dependencies:
+ babel-plugin-syntax-object-rest-spread "^6.13.0"
+ find-up "^2.1.0"
+ istanbul-lib-instrument "^1.10.1"
+ test-exclude "^4.2.1"
+
+babel-plugin-istanbul@^6.1.1:
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73"
+ integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@istanbuljs/load-nyc-config" "^1.0.0"
+ "@istanbuljs/schema" "^0.1.2"
+ istanbul-lib-instrument "^5.0.4"
+ test-exclude "^6.0.0"
+
+babel-plugin-jest-hoist@^23.2.0:
+ version "23.2.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz#e61fae05a1ca8801aadee57a6d66b8cefaf44167"
+ integrity sha512-N0MlMjZtahXK0yb0K3V9hWPrq5e7tThbghvDr0k3X75UuOOqwsWW6mk8XHD2QvEC0Ca9dLIfTgNU36TeJD6Hnw==
+
+babel-plugin-jest-hoist@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz#9be98ecf28c331eb9f5df9c72d6f89deb8181c2e"
+ integrity sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==
+ dependencies:
+ "@babel/template" "^7.3.3"
+ "@babel/types" "^7.3.3"
+ "@types/babel__core" "^7.0.0"
+ "@types/babel__traverse" "^7.0.6"
+
+babel-plugin-module-resolver@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-4.1.0.tgz#22a4f32f7441727ec1fbf4967b863e1e3e9f33e2"
+ integrity sha512-MlX10UDheRr3lb3P0WcaIdtCSRlxdQsB1sBqL7W0raF070bGl1HQQq5K3T2vf2XAYie+ww+5AKC/WrkjRO2knA==
+ dependencies:
+ find-babel-config "^1.2.0"
+ glob "^7.1.6"
+ pkg-up "^3.1.0"
+ reselect "^4.0.0"
+ resolve "^1.13.1"
+
+babel-plugin-polyfill-corejs2@^0.4.6:
+ version "0.4.6"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz#b2df0251d8e99f229a8e60fc4efa9a68b41c8313"
+ integrity sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q==
+ dependencies:
+ "@babel/compat-data" "^7.22.6"
+ "@babel/helper-define-polyfill-provider" "^0.4.3"
+ semver "^6.3.1"
+
+babel-plugin-polyfill-corejs3@^0.8.5:
+ version "0.8.6"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz#25c2d20002da91fe328ff89095c85a391d6856cf"
+ integrity sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ==
+ dependencies:
+ "@babel/helper-define-polyfill-provider" "^0.4.3"
+ core-js-compat "^3.33.1"
+
+babel-plugin-polyfill-regenerator@^0.5.3:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz#d4c49e4b44614607c13fb769bcd85c72bb26a4a5"
+ integrity sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw==
+ dependencies:
+ "@babel/helper-define-polyfill-provider" "^0.4.3"
+
+babel-plugin-syntax-object-rest-spread@^6.13.0:
+ version "6.13.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
+ integrity sha512-C4Aq+GaAj83pRQ0EFgTvw5YO6T3Qz2KGrNRwIj9mSoNHVvdZY4KO2uA6HNtNXCw993iSZnckY1aLW8nOi8i4+w==
+
+babel-plugin-transform-amd-to-commonjs@1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-transform-amd-to-commonjs/-/babel-plugin-transform-amd-to-commonjs-1.4.0.tgz#d9bc5003eaa26dbdd4e854e453f84903852af2ca"
+ integrity sha512-Xx0kYPn0LPyms+8n2KLn9yd2R5XMb2P1sNe4qn64/UQY5F2KFYlhhhyYUNm/BThfODAzl7rbaOsEfpU2M8iDKQ==
+
+babel-preset-current-node-syntax@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b"
+ integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==
+ dependencies:
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
+ "@babel/plugin-syntax-bigint" "^7.8.3"
+ "@babel/plugin-syntax-class-properties" "^7.8.3"
+ "@babel/plugin-syntax-import-meta" "^7.8.3"
+ "@babel/plugin-syntax-json-strings" "^7.8.3"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+ "@babel/plugin-syntax-numeric-separator" "^7.8.3"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+ "@babel/plugin-syntax-top-level-await" "^7.8.3"
+
+babel-preset-jest@^23.2.0:
+ version "23.2.0"
+ resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz#8ec7a03a138f001a1a8fb1e8113652bf1a55da46"
+ integrity sha512-AdfWwc0PYvDtwr009yyVNh72Ev68os7SsPmOFVX7zSA+STXuk5CV2iMVazZU01bEoHCSwTkgv4E4HOOcODPkPg==
+ dependencies:
+ babel-plugin-jest-hoist "^23.2.0"
+ babel-plugin-syntax-object-rest-spread "^6.13.0"
+
+babel-preset-jest@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz#91f10f58034cb7989cb4f962b69fa6eef6a6bc81"
+ integrity sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==
+ dependencies:
+ babel-plugin-jest-hoist "^27.5.1"
+ babel-preset-current-node-syntax "^1.0.0"
+
+babel-runtime@^6.22.0, babel-runtime@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
+ integrity sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==
+ dependencies:
+ core-js "^2.4.0"
+ regenerator-runtime "^0.11.0"
+
+babel-template@^6.16.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
+ integrity sha512-PCOcLFW7/eazGUKIoqH97sO9A2UYMahsn/yRQ7uOk37iutwjq7ODtcTNF+iFDSHNfkctqsLRjLP7URnOx0T1fg==
+ dependencies:
+ babel-runtime "^6.26.0"
+ babel-traverse "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+ lodash "^4.17.4"
+
+babel-traverse@^6.18.0, babel-traverse@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
+ integrity sha512-iSxeXx7apsjCHe9c7n8VtRXGzI2Bk1rBSOJgCCjfyXb6v1aCqE1KSEpq/8SXuVN8Ka/Rh1WDTF0MDzkvTA4MIA==
+ dependencies:
+ babel-code-frame "^6.26.0"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+ debug "^2.6.8"
+ globals "^9.18.0"
+ invariant "^2.2.2"
+ lodash "^4.17.4"
+
+babel-types@^6.18.0, babel-types@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
+ integrity sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==
+ dependencies:
+ babel-runtime "^6.26.0"
+ esutils "^2.0.2"
+ lodash "^4.17.4"
+ to-fast-properties "^1.0.3"
+
+babylon@^6.18.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
+ integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+big.js@^5.2.2:
+ version "5.2.2"
+ resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
+ integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
+
+boolbase@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
+ integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+brace-expansion@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae"
+ integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==
+ dependencies:
+ balanced-match "^1.0.0"
+
+braces@^1.8.2:
+ version "1.8.5"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7"
+ integrity sha512-xU7bpz2ytJl1bH9cgIurjpg/n8Gohy9GTw81heDYLJQ4RU60dlyJsa+atVF2pI0yMMvKxI9HkKwjePCj5XI1hw==
+ dependencies:
+ expand-range "^1.8.1"
+ preserve "^0.2.0"
+ repeat-element "^1.1.2"
+
+braces@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
+ integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+ dependencies:
+ fill-range "^7.0.1"
+
+browser-process-hrtime@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626"
+ integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==
+
+browserslist@^4.21.9, browserslist@^4.22.1:
+ version "4.22.1"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.1.tgz#ba91958d1a59b87dab6fed8dfbcb3da5e2e9c619"
+ integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==
+ dependencies:
+ caniuse-lite "^1.0.30001541"
+ electron-to-chromium "^1.4.535"
+ node-releases "^2.0.13"
+ update-browserslist-db "^1.0.13"
+
+bser@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05"
+ integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==
+ dependencies:
+ node-int64 "^0.4.0"
+
+buffer-from@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
+ integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
+
+builtin-modules@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6"
+ integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==
+
+call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4, call-bind@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513"
+ integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==
+ dependencies:
+ function-bind "^1.1.2"
+ get-intrinsic "^1.2.1"
+ set-function-length "^1.1.1"
+
+callsites@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
+ integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+
+camelcase@^5.3.1:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
+ integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
+
+camelcase@^6.2.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
+ integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
+
+caniuse-lite@^1.0.30001541:
+ version "1.0.30001553"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001553.tgz#e64e7dc8fd4885cd246bb476471420beb5e474b5"
+ integrity sha512-N0ttd6TrFfuqKNi+pMgWJTb9qrdJu4JSpgPFLe/lrD19ugC6fZgF0pUewRowDwzdDnb9V41mFcdlYgl/PyKf4A==
+
+chalk@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+ integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==
+ dependencies:
+ ansi-styles "^2.2.1"
+ escape-string-regexp "^1.0.2"
+ has-ansi "^2.0.0"
+ strip-ansi "^3.0.0"
+ supports-color "^2.0.0"
+
+chalk@^2.0.1, chalk@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chalk@^4.0.0:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
+ integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+char-regex@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf"
+ integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==
+
+cheerio-select@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4"
+ integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==
+ dependencies:
+ boolbase "^1.0.0"
+ css-select "^5.1.0"
+ css-what "^6.1.0"
+ domelementtype "^2.3.0"
+ domhandler "^5.0.3"
+ domutils "^3.0.1"
+
+cheerio@^1.0.0-rc.3:
+ version "1.0.0-rc.12"
+ resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.12.tgz#788bf7466506b1c6bf5fae51d24a2c4d62e47683"
+ integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==
+ dependencies:
+ cheerio-select "^2.1.0"
+ dom-serializer "^2.0.0"
+ domhandler "^5.0.3"
+ domutils "^3.0.1"
+ htmlparser2 "^8.0.1"
+ parse5 "^7.0.0"
+ parse5-htmlparser2-tree-adapter "^7.0.0"
+
+ci-info@^3.2.0:
+ version "3.9.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4"
+ integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==
+
+cjs-module-lexer@^1.0.0:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107"
+ integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==
+
+cliui@^7.0.2:
+ version "7.0.4"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f"
+ integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.0"
+ wrap-ansi "^7.0.0"
+
+clone-deep@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387"
+ integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==
+ dependencies:
+ is-plain-object "^2.0.4"
+ kind-of "^6.0.2"
+ shallow-clone "^3.0.0"
+
+co@^4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+ integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==
+
+collect-v8-coverage@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9"
+ integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==
+
+color-convert@^1.9.0:
+ version "1.9.3"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
+ integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
+
+color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+combined-stream@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
+commander@^2.19.0:
+ version "2.20.3"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
+ integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
+
+commondir@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
+ integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
+
+convert-source-map@^1.4.0, convert-source-map@^1.6.0:
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f"
+ integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==
+
+convert-source-map@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a"
+ integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==
+
+core-js-compat@^3.31.0, core-js-compat@^3.33.1:
+ version "3.33.1"
+ resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.33.1.tgz#debe80464107d75419e00c2ee29f35982118ff84"
+ integrity sha512-6pYKNOgD/j/bkC5xS5IIg6bncid3rfrI42oBH1SQJbsmYPKF7rhzcFzYCcxYMmNQQ0rCEB8WqpW7QHndOggaeQ==
+ dependencies:
+ browserslist "^4.22.1"
+
+core-js@^2.4.0:
+ version "2.6.12"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec"
+ integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
+
+cross-spawn@^7.0.3:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
+ integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
+css-select@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6"
+ integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==
+ dependencies:
+ boolbase "^1.0.0"
+ css-what "^6.1.0"
+ domhandler "^5.0.2"
+ domutils "^3.0.1"
+ nth-check "^2.0.1"
+
+css-what@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4"
+ integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==
+
+cssom@^0.4.4:
+ version "0.4.4"
+ resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10"
+ integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==
+
+cssom@~0.3.6:
+ version "0.3.8"
+ resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a"
+ integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==
+
+cssstyle@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852"
+ integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==
+ dependencies:
+ cssom "~0.3.6"
+
+data-urls@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b"
+ integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==
+ dependencies:
+ abab "^2.0.3"
+ whatwg-mimetype "^2.3.0"
+ whatwg-url "^8.0.0"
+
+debug@4, debug@^4.1.0, debug@^4.1.1:
+ version "4.3.4"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
+ integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
+ dependencies:
+ ms "2.1.2"
+
+debug@^2.6.8:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
+decimal.js@^10.2.1:
+ version "10.4.3"
+ resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23"
+ integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==
+
+dedent@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
+ integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==
+
+deepmerge@^4.2.2:
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a"
+ integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==
+
+define-data-property@^1.0.1, define-data-property@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3"
+ integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==
+ dependencies:
+ get-intrinsic "^1.2.1"
+ gopd "^1.0.1"
+ has-property-descriptors "^1.0.0"
+
+define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c"
+ integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==
+ dependencies:
+ define-data-property "^1.0.1"
+ has-property-descriptors "^1.0.0"
+ object-keys "^1.1.1"
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
+
+detect-indent@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
+ integrity sha512-BDKtmHlOzwI7iRuEkhzsnPoi5ypEhWAJB5RvHWe1kMr06js3uK5B3734i3ui5Yd+wOJV1cpE4JnivPD283GU/A==
+ dependencies:
+ repeating "^2.0.0"
+
+detect-newline@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651"
+ integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==
+
+diff-sequences@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327"
+ integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==
+
+discontinuous-range@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a"
+ integrity sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==
+
+dom-serializer@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53"
+ integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==
+ dependencies:
+ domelementtype "^2.3.0"
+ domhandler "^5.0.2"
+ entities "^4.2.0"
+
+domelementtype@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d"
+ integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==
+
+domexception@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304"
+ integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==
+ dependencies:
+ webidl-conversions "^5.0.0"
+
+domhandler@^5.0.2, domhandler@^5.0.3:
+ version "5.0.3"
+ resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31"
+ integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==
+ dependencies:
+ domelementtype "^2.3.0"
+
+domutils@^3.0.1:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e"
+ integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==
+ dependencies:
+ dom-serializer "^2.0.0"
+ domelementtype "^2.3.0"
+ domhandler "^5.0.3"
+
+electron-to-chromium@^1.4.535:
+ version "1.4.564"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.564.tgz#9c6ada8ec7b43c65d8629300a0916a346ac5c0c2"
+ integrity sha512-bGAx9+teIzL5I4esQwCMtiXtb78Ysc8xOKTPOvmafbJZ4SQ40kDO1ym3yRcGSkfaBtV81fGgHOgPoe6DsmpmkA==
+
+emittery@^0.8.1:
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860"
+ integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==
+
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+emojis-list@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78"
+ integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==
+
+entities@^4.2.0, entities@^4.4.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
+ integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
+
+enzyme-adapter-react-16@^1.14.0:
+ version "1.15.7"
+ resolved "https://registry.yarnpkg.com/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.15.7.tgz#a737e6d8e2c147e9da5acf957755be7634f76201"
+ integrity sha512-LtjKgvlTc/H7adyQcj+aq0P0H07LDL480WQl1gU512IUyaDo/sbOaNDdZsJXYW2XaoPqrLLE9KbZS+X2z6BASw==
+ dependencies:
+ enzyme-adapter-utils "^1.14.1"
+ enzyme-shallow-equal "^1.0.5"
+ has "^1.0.3"
+ object.assign "^4.1.4"
+ object.values "^1.1.5"
+ prop-types "^15.8.1"
+ react-is "^16.13.1"
+ react-test-renderer "^16.0.0-0"
+ semver "^5.7.0"
+
+enzyme-adapter-utils@^1.14.1:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/enzyme-adapter-utils/-/enzyme-adapter-utils-1.14.1.tgz#f30db15dafc22e0ccd44f5acc8d93be29218cdcf"
+ integrity sha512-JZgMPF1QOI7IzBj24EZoDpaeG/p8Os7WeBZWTJydpsH7JRStc7jYbHE4CmNQaLqazaGFyLM8ALWA3IIZvxW3PQ==
+ dependencies:
+ airbnb-prop-types "^2.16.0"
+ function.prototype.name "^1.1.5"
+ has "^1.0.3"
+ object.assign "^4.1.4"
+ object.fromentries "^2.0.5"
+ prop-types "^15.8.1"
+ semver "^5.7.1"
+
+enzyme-shallow-equal@^1.0.1, enzyme-shallow-equal@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/enzyme-shallow-equal/-/enzyme-shallow-equal-1.0.5.tgz#5528a897a6ad2bdc417c7221a7db682cd01711ba"
+ integrity sha512-i6cwm7hN630JXenxxJFBKzgLC3hMTafFQXflvzHgPmDhOBhxUWDe8AeRv1qp2/uWJ2Y8z5yLWMzmAfkTOiOCZg==
+ dependencies:
+ has "^1.0.3"
+ object-is "^1.1.5"
+
+enzyme-to-json@3.3.5:
+ version "3.3.5"
+ resolved "https://registry.yarnpkg.com/enzyme-to-json/-/enzyme-to-json-3.3.5.tgz#f8eb82bd3d5941c9d8bc6fd9140030777d17d0af"
+ integrity sha512-DmH1wJ68HyPqKSYXdQqB33ZotwfUhwQZW3IGXaNXgR69Iodaoj8TF/D9RjLdz4pEhGq2Tx2zwNUIjBuqoZeTgA==
+ dependencies:
+ lodash "^4.17.4"
+
+enzyme@^3.10.0:
+ version "3.11.0"
+ resolved "https://registry.yarnpkg.com/enzyme/-/enzyme-3.11.0.tgz#71d680c580fe9349f6f5ac6c775bc3e6b7a79c28"
+ integrity sha512-Dw8/Gs4vRjxY6/6i9wU0V+utmQO9kvh9XLnz3LIudviOnVYDEe2ec+0k+NQoMamn1VrjKgCUOWj5jG/5M5M0Qw==
+ dependencies:
+ array.prototype.flat "^1.2.3"
+ cheerio "^1.0.0-rc.3"
+ enzyme-shallow-equal "^1.0.1"
+ function.prototype.name "^1.1.2"
+ has "^1.0.3"
+ html-element-map "^1.2.0"
+ is-boolean-object "^1.0.1"
+ is-callable "^1.1.5"
+ is-number-object "^1.0.4"
+ is-regex "^1.0.5"
+ is-string "^1.0.5"
+ is-subset "^0.1.1"
+ lodash.escape "^4.0.1"
+ lodash.isequal "^4.5.0"
+ object-inspect "^1.7.0"
+ object-is "^1.0.2"
+ object.assign "^4.1.0"
+ object.entries "^1.1.1"
+ object.values "^1.1.1"
+ raf "^3.4.1"
+ rst-selector-parser "^2.2.3"
+ string.prototype.trim "^1.2.1"
+
+error-ex@^1.2.0, error-ex@^1.3.1:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+ integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+ dependencies:
+ is-arrayish "^0.2.1"
+
+es-abstract@^1.22.1:
+ version "1.22.3"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.3.tgz#48e79f5573198de6dee3589195727f4f74bc4f32"
+ integrity sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==
+ dependencies:
+ array-buffer-byte-length "^1.0.0"
+ arraybuffer.prototype.slice "^1.0.2"
+ available-typed-arrays "^1.0.5"
+ call-bind "^1.0.5"
+ es-set-tostringtag "^2.0.1"
+ es-to-primitive "^1.2.1"
+ function.prototype.name "^1.1.6"
+ get-intrinsic "^1.2.2"
+ get-symbol-description "^1.0.0"
+ globalthis "^1.0.3"
+ gopd "^1.0.1"
+ has-property-descriptors "^1.0.0"
+ has-proto "^1.0.1"
+ has-symbols "^1.0.3"
+ hasown "^2.0.0"
+ internal-slot "^1.0.5"
+ is-array-buffer "^3.0.2"
+ is-callable "^1.2.7"
+ is-negative-zero "^2.0.2"
+ is-regex "^1.1.4"
+ is-shared-array-buffer "^1.0.2"
+ is-string "^1.0.7"
+ is-typed-array "^1.1.12"
+ is-weakref "^1.0.2"
+ object-inspect "^1.13.1"
+ object-keys "^1.1.1"
+ object.assign "^4.1.4"
+ regexp.prototype.flags "^1.5.1"
+ safe-array-concat "^1.0.1"
+ safe-regex-test "^1.0.0"
+ string.prototype.trim "^1.2.8"
+ string.prototype.trimend "^1.0.7"
+ string.prototype.trimstart "^1.0.7"
+ typed-array-buffer "^1.0.0"
+ typed-array-byte-length "^1.0.0"
+ typed-array-byte-offset "^1.0.0"
+ typed-array-length "^1.0.4"
+ unbox-primitive "^1.0.2"
+ which-typed-array "^1.1.13"
+
+es-array-method-boxes-properly@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e"
+ integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==
+
+es-set-tostringtag@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz#11f7cc9f63376930a5f20be4915834f4bc74f9c9"
+ integrity sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==
+ dependencies:
+ get-intrinsic "^1.2.2"
+ has-tostringtag "^1.0.0"
+ hasown "^2.0.0"
+
+es-shim-unscopables@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763"
+ integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==
+ dependencies:
+ hasown "^2.0.0"
+
+es-to-primitive@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
+ integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
+ dependencies:
+ is-callable "^1.1.4"
+ is-date-object "^1.0.1"
+ is-symbol "^1.0.2"
+
+escalade@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
+ integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
+
+escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
+
+escape-string-regexp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344"
+ integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==
+
+escodegen@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17"
+ integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==
+ dependencies:
+ esprima "^4.0.1"
+ estraverse "^5.2.0"
+ esutils "^2.0.2"
+ optionalDependencies:
+ source-map "~0.6.1"
+
+esprima@^4.0.0, esprima@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+estraverse@^5.2.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123"
+ integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
+
+estree-walker@^0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362"
+ integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==
+
+estree-walker@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac"
+ integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+execa@^5.0.0:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd"
+ integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==
+ dependencies:
+ cross-spawn "^7.0.3"
+ get-stream "^6.0.0"
+ human-signals "^2.1.0"
+ is-stream "^2.0.0"
+ merge-stream "^2.0.0"
+ npm-run-path "^4.0.1"
+ onetime "^5.1.2"
+ signal-exit "^3.0.3"
+ strip-final-newline "^2.0.0"
+
+exit@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
+ integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==
+
+expand-brackets@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b"
+ integrity sha512-hxx03P2dJxss6ceIeri9cmYOT4SRs3Zk3afZwWpOsRqLqprhTR8u++SlC+sFGsQr7WGFPdMF7Gjc1njDLDK6UA==
+ dependencies:
+ is-posix-bracket "^0.1.0"
+
+expand-range@^1.8.1:
+ version "1.8.2"
+ resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337"
+ integrity sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==
+ dependencies:
+ fill-range "^2.1.0"
+
+expect@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/expect/-/expect-27.5.1.tgz#83ce59f1e5bdf5f9d2b94b61d2050db48f3fef74"
+ integrity sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ jest-get-type "^27.5.1"
+ jest-matcher-utils "^27.5.1"
+ jest-message-util "^27.5.1"
+
+extglob@^0.3.1:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1"
+ integrity sha512-1FOj1LOwn42TMrruOHGt18HemVnbwAmAak7krWk+wa93KXxGbK+2jpezm+ytJYDaBX0/SPLZFHKM7m+tKobWGg==
+ dependencies:
+ is-extglob "^1.0.0"
+
+fast-deep-equal@^3.1.1:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fb-watchman@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c"
+ integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==
+ dependencies:
+ bser "2.1.1"
+
+filename-regex@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26"
+ integrity sha512-BTCqyBaWBTsauvnHiE8i562+EdJj+oUpkqWp2R1iCoR8f6oo8STRu3of7WJJ0TqWtxN50a5YFpzYK4Jj9esYfQ==
+
+fill-range@^2.1.0:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565"
+ integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==
+ dependencies:
+ is-number "^2.1.0"
+ isobject "^2.0.0"
+ randomatic "^3.0.0"
+ repeat-element "^1.1.2"
+ repeat-string "^1.5.2"
+
+fill-range@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
+ integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+find-babel-config@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/find-babel-config/-/find-babel-config-1.2.0.tgz#a9b7b317eb5b9860cda9d54740a8c8337a2283a2"
+ integrity sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA==
+ dependencies:
+ json5 "^0.5.1"
+ path-exists "^3.0.0"
+
+find-cache-dir@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7"
+ integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==
+ dependencies:
+ commondir "^1.0.1"
+ make-dir "^2.0.0"
+ pkg-dir "^3.0.0"
+
+find-cache-dir@^3.3.1:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b"
+ integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==
+ dependencies:
+ commondir "^1.0.1"
+ make-dir "^3.0.2"
+ pkg-dir "^4.1.0"
+
+find-up@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
+ integrity sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==
+ dependencies:
+ path-exists "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+find-up@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7"
+ integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==
+ dependencies:
+ locate-path "^2.0.0"
+
+find-up@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
+ integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
+ dependencies:
+ locate-path "^3.0.0"
+
+find-up@^4.0.0, find-up@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
+ integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
+ dependencies:
+ locate-path "^5.0.0"
+ path-exists "^4.0.0"
+
+for-each@^0.3.3:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e"
+ integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==
+ dependencies:
+ is-callable "^1.1.3"
+
+for-in@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
+ integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==
+
+for-own@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce"
+ integrity sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==
+ dependencies:
+ for-in "^1.0.1"
+
+form-data@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f"
+ integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
+
+fsevents@^2.3.2, fsevents@~2.3.2:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
+ integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
+
+function-bind@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
+ integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
+
+function.prototype.name@^1.1.2, function.prototype.name@^1.1.5, function.prototype.name@^1.1.6:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd"
+ integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+ functions-have-names "^1.2.3"
+
+functions-have-names@^1.2.3:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834"
+ integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
+
+gensync@^1.0.0-beta.2:
+ version "1.0.0-beta.2"
+ resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
+ integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
+
+get-caller-file@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
+ integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
+get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b"
+ integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==
+ dependencies:
+ function-bind "^1.1.2"
+ has-proto "^1.0.1"
+ has-symbols "^1.0.3"
+ hasown "^2.0.0"
+
+get-package-type@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a"
+ integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==
+
+get-stream@^6.0.0:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
+ integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
+
+get-symbol-description@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6"
+ integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.1.1"
+
+glob-base@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4"
+ integrity sha512-ab1S1g1EbO7YzauaJLkgLp7DZVAqj9M/dvKlTt8DkXA2tiOIcSMrlVI2J1RZyB5iJVccEscjGn+kpOG9788MHA==
+ dependencies:
+ glob-parent "^2.0.0"
+ is-glob "^2.0.0"
+
+glob-parent@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28"
+ integrity sha512-JDYOvfxio/t42HKdxkAYaCiBN7oYiuxykOxKxdaUW5Qn0zaYN3gRQWolrwdnf0shM9/EP0ebuuTmyoXNr1cC5w==
+ dependencies:
+ is-glob "^2.0.0"
+
+glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6:
+ version "7.2.3"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
+ integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.1.1"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+glob@^8.0.3:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e"
+ integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^5.0.1"
+ once "^1.3.0"
+
+globals@^11.1.0:
+ version "11.12.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
+ integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
+
+globals@^9.18.0:
+ version "9.18.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
+ integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==
+
+globalthis@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf"
+ integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==
+ dependencies:
+ define-properties "^1.1.3"
+
+gopd@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c"
+ integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==
+ dependencies:
+ get-intrinsic "^1.1.3"
+
+graceful-fs@^4.1.2, graceful-fs@^4.2.9:
+ version "4.2.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
+ integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
+
+has-ansi@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+ integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==
+ dependencies:
+ ansi-regex "^2.0.0"
+
+has-bigints@^1.0.1, has-bigints@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa"
+ integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-property-descriptors@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340"
+ integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==
+ dependencies:
+ get-intrinsic "^1.2.2"
+
+has-proto@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0"
+ integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==
+
+has-symbols@^1.0.2, has-symbols@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
+ integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
+
+has-tostringtag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25"
+ integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==
+ dependencies:
+ has-symbols "^1.0.2"
+
+has@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6"
+ integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==
+
+hasown@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c"
+ integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==
+ dependencies:
+ function-bind "^1.1.2"
+
+hoist-non-react-statics@^3.3.0:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45"
+ integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
+ dependencies:
+ react-is "^16.7.0"
+
+hosted-git-info@^2.1.4:
+ version "2.8.9"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9"
+ integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==
+
+html-element-map@^1.2.0:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/html-element-map/-/html-element-map-1.3.1.tgz#44b2cbcfa7be7aa4ff59779e47e51012e1c73c08"
+ integrity sha512-6XMlxrAFX4UEEGxctfFnmrFaaZFNf9i5fNuV5wZ3WWQ4FVaNP1aX1LkX9j2mfEx1NpjeE/rL3nmgEn23GdFmrg==
+ dependencies:
+ array.prototype.filter "^1.0.0"
+ call-bind "^1.0.2"
+
+html-encoding-sniffer@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3"
+ integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==
+ dependencies:
+ whatwg-encoding "^1.0.5"
+
+html-escaper@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453"
+ integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==
+
+htmlparser2@^8.0.1:
+ version "8.0.2"
+ resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21"
+ integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==
+ dependencies:
+ domelementtype "^2.3.0"
+ domhandler "^5.0.3"
+ domutils "^3.0.1"
+ entities "^4.4.0"
+
+http-proxy-agent@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a"
+ integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==
+ dependencies:
+ "@tootallnate/once" "1"
+ agent-base "6"
+ debug "4"
+
+https-proxy-agent@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6"
+ integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==
+ dependencies:
+ agent-base "6"
+ debug "4"
+
+human-signals@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
+ integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
+
+iconv-lite@0.4.24:
+ version "0.4.24"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+import-local@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4"
+ integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==
+ dependencies:
+ pkg-dir "^4.2.0"
+ resolve-cwd "^3.0.0"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+ integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+internal-slot@^1.0.5:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.6.tgz#37e756098c4911c5e912b8edbf71ed3aa116f930"
+ integrity sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==
+ dependencies:
+ get-intrinsic "^1.2.2"
+ hasown "^2.0.0"
+ side-channel "^1.0.4"
+
+invariant@^2.2.2, invariant@^2.2.4:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
+ integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
+ dependencies:
+ loose-envify "^1.0.0"
+
+is-array-buffer@^3.0.1, is-array-buffer@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe"
+ integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.2.0"
+ is-typed-array "^1.1.10"
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+ integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==
+
+is-bigint@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3"
+ integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==
+ dependencies:
+ has-bigints "^1.0.1"
+
+is-boolean-object@^1.0.1, is-boolean-object@^1.1.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719"
+ integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-buffer@^1.1.5:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
+ integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
+
+is-builtin-module@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.1.tgz#f03271717d8654cfcaf07ab0463faa3571581169"
+ integrity sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==
+ dependencies:
+ builtin-modules "^3.3.0"
+
+is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.1.5, is-callable@^1.2.7:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055"
+ integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
+
+is-core-module@^2.13.0:
+ version "2.13.1"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384"
+ integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==
+ dependencies:
+ hasown "^2.0.0"
+
+is-date-object@^1.0.1:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f"
+ integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-dotfile@^1.0.0:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
+ integrity sha512-9YclgOGtN/f8zx0Pr4FQYMdibBiTaH3sn52vjYip4ZSf6C4/6RfTEZ+MR4GvKhCxdPh21Bg42/WL55f6KSnKpg==
+
+is-equal-shallow@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534"
+ integrity sha512-0EygVC5qPvIyb+gSz7zdD5/AAoS6Qrx1e//6N4yv4oNm30kqvdmG66oZFWVlQHUWe5OjP08FuTw2IdT0EOTcYA==
+ dependencies:
+ is-primitive "^2.0.0"
+
+is-extendable@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
+ integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==
+
+is-extglob@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0"
+ integrity sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==
+
+is-finite@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3"
+ integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==
+
+is-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-generator-fn@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118"
+ integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==
+
+is-glob@^2.0.0, is-glob@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863"
+ integrity sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==
+ dependencies:
+ is-extglob "^1.0.0"
+
+is-module@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591"
+ integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==
+
+is-negative-zero@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150"
+ integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==
+
+is-number-object@^1.0.4:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc"
+ integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-number@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
+ integrity sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==
+ dependencies:
+ kind-of "^3.0.2"
+
+is-number@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff"
+ integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-plain-object@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+ integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
+ dependencies:
+ isobject "^3.0.1"
+
+is-posix-bracket@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4"
+ integrity sha512-Yu68oeXJ7LeWNmZ3Zov/xg/oDBnBK2RNxwYY1ilNJX+tKKZqgPK+qOn/Gs9jEu66KDY9Netf5XLKNGzas/vPfQ==
+
+is-potential-custom-element-name@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5"
+ integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==
+
+is-primitive@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
+ integrity sha512-N3w1tFaRfk3UrPfqeRyD+GYDASU3W5VinKhlORy8EWVf/sIdDL9GAcew85XmktCfH+ngG7SRXEVDoO18WMdB/Q==
+
+is-reference@1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7"
+ integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==
+ dependencies:
+ "@types/estree" "*"
+
+is-regex@^1.0.5, is-regex@^1.1.0, is-regex@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
+ integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-shared-array-buffer@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79"
+ integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==
+ dependencies:
+ call-bind "^1.0.2"
+
+is-stream@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
+ integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
+
+is-string@^1.0.5, is-string@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd"
+ integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-subset@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6"
+ integrity sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw==
+
+is-symbol@^1.0.2, is-symbol@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c"
+ integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
+ dependencies:
+ has-symbols "^1.0.2"
+
+is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.9:
+ version "1.1.12"
+ resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a"
+ integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==
+ dependencies:
+ which-typed-array "^1.1.11"
+
+is-typedarray@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+ integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==
+
+is-utf8@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
+ integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==
+
+is-weakref@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2"
+ integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==
+ dependencies:
+ call-bind "^1.0.2"
+
+isarray@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
+ integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==
+
+isarray@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723"
+ integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
+
+isobject@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
+ integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==
+ dependencies:
+ isarray "1.0.0"
+
+isobject@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+ integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==
+
+istanbul-lib-coverage@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz#ccf7edcd0a0bb9b8f729feeb0930470f9af664f0"
+ integrity sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==
+
+istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3"
+ integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==
+
+istanbul-lib-instrument@^1.10.1:
+ version "1.10.2"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz#1f55ed10ac3c47f2bdddd5307935126754d0a9ca"
+ integrity sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==
+ dependencies:
+ babel-generator "^6.18.0"
+ babel-template "^6.16.0"
+ babel-traverse "^6.18.0"
+ babel-types "^6.18.0"
+ babylon "^6.18.0"
+ istanbul-lib-coverage "^1.2.1"
+ semver "^5.3.0"
+
+istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d"
+ integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==
+ dependencies:
+ "@babel/core" "^7.12.3"
+ "@babel/parser" "^7.14.7"
+ "@istanbuljs/schema" "^0.1.2"
+ istanbul-lib-coverage "^3.2.0"
+ semver "^6.3.0"
+
+istanbul-lib-report@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d"
+ integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==
+ dependencies:
+ istanbul-lib-coverage "^3.0.0"
+ make-dir "^4.0.0"
+ supports-color "^7.1.0"
+
+istanbul-lib-source-maps@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551"
+ integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==
+ dependencies:
+ debug "^4.1.1"
+ istanbul-lib-coverage "^3.0.0"
+ source-map "^0.6.1"
+
+istanbul-reports@^3.1.3:
+ version "3.1.6"
+ resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.6.tgz#2544bcab4768154281a2f0870471902704ccaa1a"
+ integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==
+ dependencies:
+ html-escaper "^2.0.0"
+ istanbul-lib-report "^3.0.0"
+
+jest-changed-files@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-27.5.1.tgz#a348aed00ec9bf671cc58a66fcbe7c3dfd6a68f5"
+ integrity sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ execa "^5.0.0"
+ throat "^6.0.1"
+
+jest-circus@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-27.5.1.tgz#37a5a4459b7bf4406e53d637b49d22c65d125ecc"
+ integrity sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==
+ dependencies:
+ "@jest/environment" "^27.5.1"
+ "@jest/test-result" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ co "^4.6.0"
+ dedent "^0.7.0"
+ expect "^27.5.1"
+ is-generator-fn "^2.0.0"
+ jest-each "^27.5.1"
+ jest-matcher-utils "^27.5.1"
+ jest-message-util "^27.5.1"
+ jest-runtime "^27.5.1"
+ jest-snapshot "^27.5.1"
+ jest-util "^27.5.1"
+ pretty-format "^27.5.1"
+ slash "^3.0.0"
+ stack-utils "^2.0.3"
+ throat "^6.0.1"
+
+jest-cli@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-27.5.1.tgz#278794a6e6458ea8029547e6c6cbf673bd30b145"
+ integrity sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==
+ dependencies:
+ "@jest/core" "^27.5.1"
+ "@jest/test-result" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ chalk "^4.0.0"
+ exit "^0.1.2"
+ graceful-fs "^4.2.9"
+ import-local "^3.0.2"
+ jest-config "^27.5.1"
+ jest-util "^27.5.1"
+ jest-validate "^27.5.1"
+ prompts "^2.0.1"
+ yargs "^16.2.0"
+
+jest-config@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-27.5.1.tgz#5c387de33dca3f99ad6357ddeccd91bf3a0e4a41"
+ integrity sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==
+ dependencies:
+ "@babel/core" "^7.8.0"
+ "@jest/test-sequencer" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ babel-jest "^27.5.1"
+ chalk "^4.0.0"
+ ci-info "^3.2.0"
+ deepmerge "^4.2.2"
+ glob "^7.1.1"
+ graceful-fs "^4.2.9"
+ jest-circus "^27.5.1"
+ jest-environment-jsdom "^27.5.1"
+ jest-environment-node "^27.5.1"
+ jest-get-type "^27.5.1"
+ jest-jasmine2 "^27.5.1"
+ jest-regex-util "^27.5.1"
+ jest-resolve "^27.5.1"
+ jest-runner "^27.5.1"
+ jest-util "^27.5.1"
+ jest-validate "^27.5.1"
+ micromatch "^4.0.4"
+ parse-json "^5.2.0"
+ pretty-format "^27.5.1"
+ slash "^3.0.0"
+ strip-json-comments "^3.1.1"
+
+jest-diff@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def"
+ integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==
+ dependencies:
+ chalk "^4.0.0"
+ diff-sequences "^27.5.1"
+ jest-get-type "^27.5.1"
+ pretty-format "^27.5.1"
+
+jest-docblock@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-27.5.1.tgz#14092f364a42c6108d42c33c8cf30e058e25f6c0"
+ integrity sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==
+ dependencies:
+ detect-newline "^3.0.0"
+
+jest-each@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-27.5.1.tgz#5bc87016f45ed9507fed6e4702a5b468a5b2c44e"
+ integrity sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ chalk "^4.0.0"
+ jest-get-type "^27.5.1"
+ jest-util "^27.5.1"
+ pretty-format "^27.5.1"
+
+jest-environment-jsdom@^27.2.0, jest-environment-jsdom@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz#ea9ccd1fc610209655a77898f86b2b559516a546"
+ integrity sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==
+ dependencies:
+ "@jest/environment" "^27.5.1"
+ "@jest/fake-timers" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ jest-mock "^27.5.1"
+ jest-util "^27.5.1"
+ jsdom "^16.6.0"
+
+jest-environment-node@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-27.5.1.tgz#dedc2cfe52fab6b8f5714b4808aefa85357a365e"
+ integrity sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==
+ dependencies:
+ "@jest/environment" "^27.5.1"
+ "@jest/fake-timers" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ jest-mock "^27.5.1"
+ jest-util "^27.5.1"
+
+jest-get-type@^24.9.0:
+ version "24.9.0"
+ resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e"
+ integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==
+
+jest-get-type@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1"
+ integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==
+
+jest-haste-map@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-27.5.1.tgz#9fd8bd7e7b4fa502d9c6164c5640512b4e811e7f"
+ integrity sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ "@types/graceful-fs" "^4.1.2"
+ "@types/node" "*"
+ anymatch "^3.0.3"
+ fb-watchman "^2.0.0"
+ graceful-fs "^4.2.9"
+ jest-regex-util "^27.5.1"
+ jest-serializer "^27.5.1"
+ jest-util "^27.5.1"
+ jest-worker "^27.5.1"
+ micromatch "^4.0.4"
+ walker "^1.0.7"
+ optionalDependencies:
+ fsevents "^2.3.2"
+
+jest-in-case@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/jest-in-case/-/jest-in-case-1.0.2.tgz#56744b5af33222bd0abab70cf919f1d170ab75cc"
+ integrity sha512-2DE6Gdwnh5jkCYTePWoQinF+zne3lCADibXoYJEt8PS84JaRug0CyAOrEgzMxbzln3YcSY2PBeru7ct4tbflYA==
+
+jest-jasmine2@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz#a037b0034ef49a9f3d71c4375a796f3b230d1ac4"
+ integrity sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==
+ dependencies:
+ "@jest/environment" "^27.5.1"
+ "@jest/source-map" "^27.5.1"
+ "@jest/test-result" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ co "^4.6.0"
+ expect "^27.5.1"
+ is-generator-fn "^2.0.0"
+ jest-each "^27.5.1"
+ jest-matcher-utils "^27.5.1"
+ jest-message-util "^27.5.1"
+ jest-runtime "^27.5.1"
+ jest-snapshot "^27.5.1"
+ jest-util "^27.5.1"
+ pretty-format "^27.5.1"
+ throat "^6.0.1"
+
+jest-junit@^6.0.0:
+ version "6.4.0"
+ resolved "https://registry.yarnpkg.com/jest-junit/-/jest-junit-6.4.0.tgz#23e15c979fa6338afde46f2d2ac2a6b7e8cf0d9e"
+ integrity sha512-GXEZA5WBeUich94BARoEUccJumhCgCerg7mXDFLxWwI2P7wL3Z7sGWk+53x343YdBLjiMR9aD/gYMVKO+0pE4Q==
+ dependencies:
+ jest-validate "^24.0.0"
+ mkdirp "^0.5.1"
+ strip-ansi "^4.0.0"
+ xml "^1.0.1"
+
+jest-leak-detector@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz#6ec9d54c3579dd6e3e66d70e3498adf80fde3fb8"
+ integrity sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==
+ dependencies:
+ jest-get-type "^27.5.1"
+ pretty-format "^27.5.1"
+
+jest-localstorage-mock@^2.4.17:
+ version "2.4.26"
+ resolved "https://registry.yarnpkg.com/jest-localstorage-mock/-/jest-localstorage-mock-2.4.26.tgz#7d57fb3555f2ed5b7ed16fd8423fd81f95e9e8db"
+ integrity sha512-owAJrYnjulVlMIXOYQIPRCCn3MmqI3GzgfZCXdD3/pmwrIvFMXcKVWZ+aMc44IzaASapg0Z4SEFxR+v5qxDA2w==
+
+jest-matcher-utils@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab"
+ integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==
+ dependencies:
+ chalk "^4.0.0"
+ jest-diff "^27.5.1"
+ jest-get-type "^27.5.1"
+ pretty-format "^27.5.1"
+
+jest-message-util@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-27.5.1.tgz#bdda72806da10d9ed6425e12afff38cd1458b6cf"
+ integrity sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==
+ dependencies:
+ "@babel/code-frame" "^7.12.13"
+ "@jest/types" "^27.5.1"
+ "@types/stack-utils" "^2.0.0"
+ chalk "^4.0.0"
+ graceful-fs "^4.2.9"
+ micromatch "^4.0.4"
+ pretty-format "^27.5.1"
+ slash "^3.0.0"
+ stack-utils "^2.0.3"
+
+jest-mock@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-27.5.1.tgz#19948336d49ef4d9c52021d34ac7b5f36ff967d6"
+ integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+
+jest-pnp-resolver@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e"
+ integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==
+
+jest-regex-util@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95"
+ integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==
+
+jest-resolve-dependencies@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz#d811ecc8305e731cc86dd79741ee98fed06f1da8"
+ integrity sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ jest-regex-util "^27.5.1"
+ jest-snapshot "^27.5.1"
+
+jest-resolve@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-27.5.1.tgz#a2f1c5a0796ec18fe9eb1536ac3814c23617b384"
+ integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ chalk "^4.0.0"
+ graceful-fs "^4.2.9"
+ jest-haste-map "^27.5.1"
+ jest-pnp-resolver "^1.2.2"
+ jest-util "^27.5.1"
+ jest-validate "^27.5.1"
+ resolve "^1.20.0"
+ resolve.exports "^1.1.0"
+ slash "^3.0.0"
+
+jest-runner@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-27.5.1.tgz#071b27c1fa30d90540805c5645a0ec167c7b62e5"
+ integrity sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==
+ dependencies:
+ "@jest/console" "^27.5.1"
+ "@jest/environment" "^27.5.1"
+ "@jest/test-result" "^27.5.1"
+ "@jest/transform" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ emittery "^0.8.1"
+ graceful-fs "^4.2.9"
+ jest-docblock "^27.5.1"
+ jest-environment-jsdom "^27.5.1"
+ jest-environment-node "^27.5.1"
+ jest-haste-map "^27.5.1"
+ jest-leak-detector "^27.5.1"
+ jest-message-util "^27.5.1"
+ jest-resolve "^27.5.1"
+ jest-runtime "^27.5.1"
+ jest-util "^27.5.1"
+ jest-worker "^27.5.1"
+ source-map-support "^0.5.6"
+ throat "^6.0.1"
+
+jest-runtime@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-27.5.1.tgz#4896003d7a334f7e8e4a53ba93fb9bcd3db0a1af"
+ integrity sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==
+ dependencies:
+ "@jest/environment" "^27.5.1"
+ "@jest/fake-timers" "^27.5.1"
+ "@jest/globals" "^27.5.1"
+ "@jest/source-map" "^27.5.1"
+ "@jest/test-result" "^27.5.1"
+ "@jest/transform" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ chalk "^4.0.0"
+ cjs-module-lexer "^1.0.0"
+ collect-v8-coverage "^1.0.0"
+ execa "^5.0.0"
+ glob "^7.1.3"
+ graceful-fs "^4.2.9"
+ jest-haste-map "^27.5.1"
+ jest-message-util "^27.5.1"
+ jest-mock "^27.5.1"
+ jest-regex-util "^27.5.1"
+ jest-resolve "^27.5.1"
+ jest-snapshot "^27.5.1"
+ jest-util "^27.5.1"
+ slash "^3.0.0"
+ strip-bom "^4.0.0"
+
+jest-serializer-babel-ast@^0.0.5:
+ version "0.0.5"
+ resolved "https://registry.yarnpkg.com/jest-serializer-babel-ast/-/jest-serializer-babel-ast-0.0.5.tgz#3b63d98c10226814ea3ff9a016520c6267c4cc9b"
+ integrity sha512-m8G9d5hQigcBGkyGZ8XswG0wTzhLHcp+Q7s70RVzLR/2jVrBXGYwTePX0lP23LqV4SDHFZkUWHgLMhfSEtslcQ==
+ dependencies:
+ ast-pretty-print "^1.1.5"
+
+jest-serializer@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-27.5.1.tgz#81438410a30ea66fd57ff730835123dea1fb1f64"
+ integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==
+ dependencies:
+ "@types/node" "*"
+ graceful-fs "^4.2.9"
+
+jest-snapshot@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-27.5.1.tgz#b668d50d23d38054a51b42c4039cab59ae6eb6a1"
+ integrity sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==
+ dependencies:
+ "@babel/core" "^7.7.2"
+ "@babel/generator" "^7.7.2"
+ "@babel/plugin-syntax-typescript" "^7.7.2"
+ "@babel/traverse" "^7.7.2"
+ "@babel/types" "^7.0.0"
+ "@jest/transform" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/babel__traverse" "^7.0.4"
+ "@types/prettier" "^2.1.5"
+ babel-preset-current-node-syntax "^1.0.0"
+ chalk "^4.0.0"
+ expect "^27.5.1"
+ graceful-fs "^4.2.9"
+ jest-diff "^27.5.1"
+ jest-get-type "^27.5.1"
+ jest-haste-map "^27.5.1"
+ jest-matcher-utils "^27.5.1"
+ jest-message-util "^27.5.1"
+ jest-util "^27.5.1"
+ natural-compare "^1.4.0"
+ pretty-format "^27.5.1"
+ semver "^7.3.2"
+
+jest-util@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9"
+ integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ ci-info "^3.2.0"
+ graceful-fs "^4.2.9"
+ picomatch "^2.2.3"
+
+jest-validate@^24.0.0:
+ version "24.9.0"
+ resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-24.9.0.tgz#0775c55360d173cd854e40180756d4ff52def8ab"
+ integrity sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==
+ dependencies:
+ "@jest/types" "^24.9.0"
+ camelcase "^5.3.1"
+ chalk "^2.0.1"
+ jest-get-type "^24.9.0"
+ leven "^3.1.0"
+ pretty-format "^24.9.0"
+
+jest-validate@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-27.5.1.tgz#9197d54dc0bdb52260b8db40b46ae668e04df067"
+ integrity sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==
+ dependencies:
+ "@jest/types" "^27.5.1"
+ camelcase "^6.2.0"
+ chalk "^4.0.0"
+ jest-get-type "^27.5.1"
+ leven "^3.1.0"
+ pretty-format "^27.5.1"
+
+jest-watcher@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-27.5.1.tgz#71bd85fb9bde3a2c2ec4dc353437971c43c642a2"
+ integrity sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==
+ dependencies:
+ "@jest/test-result" "^27.5.1"
+ "@jest/types" "^27.5.1"
+ "@types/node" "*"
+ ansi-escapes "^4.2.1"
+ chalk "^4.0.0"
+ jest-util "^27.5.1"
+ string-length "^4.0.1"
+
+jest-worker@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0"
+ integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==
+ dependencies:
+ "@types/node" "*"
+ merge-stream "^2.0.0"
+ supports-color "^8.0.0"
+
+jest@^27.2.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest/-/jest-27.5.1.tgz#dadf33ba70a779be7a6fc33015843b51494f63fc"
+ integrity sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==
+ dependencies:
+ "@jest/core" "^27.5.1"
+ import-local "^3.0.2"
+ jest-cli "^27.5.1"
+
+"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-tokens@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
+ integrity sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==
+
+js-yaml@^3.13.1:
+ version "3.14.1"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
+ integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
+jsdom@^16.6.0:
+ version "16.7.0"
+ resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.7.0.tgz#918ae71965424b197c819f8183a754e18977b710"
+ integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==
+ dependencies:
+ abab "^2.0.5"
+ acorn "^8.2.4"
+ acorn-globals "^6.0.0"
+ cssom "^0.4.4"
+ cssstyle "^2.3.0"
+ data-urls "^2.0.0"
+ decimal.js "^10.2.1"
+ domexception "^2.0.1"
+ escodegen "^2.0.0"
+ form-data "^3.0.0"
+ html-encoding-sniffer "^2.0.1"
+ http-proxy-agent "^4.0.1"
+ https-proxy-agent "^5.0.0"
+ is-potential-custom-element-name "^1.0.1"
+ nwsapi "^2.2.0"
+ parse5 "6.0.1"
+ saxes "^5.0.1"
+ symbol-tree "^3.2.4"
+ tough-cookie "^4.0.0"
+ w3c-hr-time "^1.0.2"
+ w3c-xmlserializer "^2.0.0"
+ webidl-conversions "^6.1.0"
+ whatwg-encoding "^1.0.5"
+ whatwg-mimetype "^2.3.0"
+ whatwg-url "^8.5.0"
+ ws "^7.4.6"
+ xml-name-validator "^3.0.0"
+
+jsesc@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
+ integrity sha512-Mke0DA0QjUWuJlhsE0ZPPhYiJkRap642SmI/4ztCFaUs6V2AiH1sfecc+57NgaryfAA2VR3v6O+CSjC1jZJKOA==
+
+jsesc@^2.5.1:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
+ integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
+
+jsesc@~0.5.0:
+ version "0.5.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
+ integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==
+
+json-parse-even-better-errors@^2.3.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
+ integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json5@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
+ integrity sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==
+
+json5@^2.1.2, json5@^2.2.3:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
+ integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
+
+kind-of@^3.0.2:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
+ integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^6.0.0, kind-of@^6.0.2:
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
+ integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
+
+kleur@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
+ integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
+
+leven@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2"
+ integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==
+
+lines-and-columns@^1.1.6:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
+ integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==
+
+load-json-file@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
+ integrity sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==
+ dependencies:
+ graceful-fs "^4.1.2"
+ parse-json "^2.2.0"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+ strip-bom "^2.0.0"
+
+loader-utils@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c"
+ integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==
+ dependencies:
+ big.js "^5.2.2"
+ emojis-list "^3.0.0"
+ json5 "^2.1.2"
+
+locate-path@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
+ integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==
+ dependencies:
+ p-locate "^2.0.0"
+ path-exists "^3.0.0"
+
+locate-path@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
+ integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==
+ dependencies:
+ p-locate "^3.0.0"
+ path-exists "^3.0.0"
+
+locate-path@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
+ integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
+ dependencies:
+ p-locate "^4.1.0"
+
+lodash.debounce@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
+ integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==
+
+lodash.escape@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-4.0.1.tgz#c9044690c21e04294beaa517712fded1fa88de98"
+ integrity sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==
+
+lodash.flattendeep@^4.4.0:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2"
+ integrity sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==
+
+lodash.isequal@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
+ integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==
+
+lodash.isplainobject@^4.0.6:
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
+ integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==
+
+lodash@^4.17.4, lodash@^4.7.0:
+ version "4.17.21"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+ integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+lru-cache@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
+ integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
+ dependencies:
+ yallist "^3.0.2"
+
+lru-cache@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+ integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+ dependencies:
+ yallist "^4.0.0"
+
+magic-string@^0.25.3, magic-string@^0.25.7:
+ version "0.25.9"
+ resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c"
+ integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==
+ dependencies:
+ sourcemap-codec "^1.4.8"
+
+magic-string@^0.27.0:
+ version "0.27.0"
+ resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.27.0.tgz#e4a3413b4bab6d98d2becffd48b4a257effdbbf3"
+ integrity sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==
+ dependencies:
+ "@jridgewell/sourcemap-codec" "^1.4.13"
+
+make-dir@^2.0.0, make-dir@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
+ integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==
+ dependencies:
+ pify "^4.0.1"
+ semver "^5.6.0"
+
+make-dir@^3.0.2, make-dir@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
+ integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
+ dependencies:
+ semver "^6.0.0"
+
+make-dir@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e"
+ integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==
+ dependencies:
+ semver "^7.5.3"
+
+makeerror@1.0.12:
+ version "1.0.12"
+ resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a"
+ integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==
+ dependencies:
+ tmpl "1.0.5"
+
+math-random@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c"
+ integrity sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==
+
+merge-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
+ integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
+
+micromatch@^2.3.11:
+ version "2.3.11"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565"
+ integrity sha512-LnU2XFEk9xxSJ6rfgAry/ty5qwUTyHYOBU0g4R6tIw5ljwgGIBmiKhRWLw5NpMOnrgUNcDJ4WMp8rl3sYVHLNA==
+ dependencies:
+ arr-diff "^2.0.0"
+ array-unique "^0.2.1"
+ braces "^1.8.2"
+ expand-brackets "^0.1.4"
+ extglob "^0.3.1"
+ filename-regex "^2.0.0"
+ is-extglob "^1.0.0"
+ is-glob "^2.0.1"
+ kind-of "^3.0.2"
+ normalize-path "^2.0.1"
+ object.omit "^2.0.0"
+ parse-glob "^3.0.4"
+ regex-cache "^0.4.2"
+
+micromatch@^4.0.4:
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
+ integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
+ dependencies:
+ braces "^3.0.2"
+ picomatch "^2.3.1"
+
+mime-db@1.52.0:
+ version "1.52.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
+ integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+
+mime-types@^2.1.12:
+ version "2.1.35"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
+ integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
+ dependencies:
+ mime-db "1.52.0"
+
+mimic-fn@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
+ integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
+
+minimatch@^3.0.4, minimatch@^3.1.1:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
+ integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimatch@^5.0.1:
+ version "5.1.6"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96"
+ integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==
+ dependencies:
+ brace-expansion "^2.0.1"
+
+minimist@^1.2.6:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
+ integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
+
+mkdirp@^0.5.1:
+ version "0.5.6"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6"
+ integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==
+ dependencies:
+ minimist "^1.2.6"
+
+moo@^0.5.0:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/moo/-/moo-0.5.2.tgz#f9fe82473bc7c184b0d32e2215d3f6e67278733c"
+ integrity sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+ integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
+
+ms@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+ integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
+
+nearley@^2.7.10:
+ version "2.20.1"
+ resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.20.1.tgz#246cd33eff0d012faf197ff6774d7ac78acdd474"
+ integrity sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==
+ dependencies:
+ commander "^2.19.0"
+ moo "^0.5.0"
+ railroad-diagrams "^1.0.0"
+ randexp "0.4.6"
+
+node-int64@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
+ integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==
+
+node-releases@^2.0.13:
+ version "2.0.13"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d"
+ integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==
+
+normalize-package-data@^2.3.2:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
+ integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
+ dependencies:
+ hosted-git-info "^2.1.4"
+ resolve "^1.10.0"
+ semver "2 || 3 || 4 || 5"
+ validate-npm-package-license "^3.0.1"
+
+normalize-path@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+ integrity sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==
+ dependencies:
+ remove-trailing-separator "^1.0.1"
+
+normalize-path@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+npm-run-path@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
+ integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
+ dependencies:
+ path-key "^3.0.0"
+
+nth-check@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d"
+ integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==
+ dependencies:
+ boolbase "^1.0.0"
+
+nwsapi@^2.2.0:
+ version "2.2.7"
+ resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30"
+ integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==
+
+object-assign@^4.1.0, object-assign@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
+
+object-inspect@^1.13.1, object-inspect@^1.7.0, object-inspect@^1.9.0:
+ version "1.13.1"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2"
+ integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==
+
+object-is@^1.0.2, object-is@^1.1.2, object-is@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac"
+ integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+object-keys@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object.assign@^4.1.0, object.assign@^4.1.4:
+ version "4.1.4"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f"
+ integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ has-symbols "^1.0.3"
+ object-keys "^1.1.1"
+
+object.entries@^1.1.1, object.entries@^1.1.2:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.7.tgz#2b47760e2a2e3a752f39dd874655c61a7f03c131"
+ integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+
+object.fromentries@^2.0.5:
+ version "2.0.7"
+ resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616"
+ integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+
+object.omit@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
+ integrity sha512-UiAM5mhmIuKLsOvrL+B0U2d1hXHF3bFYWIuH1LMpuV2EJEHG1Ntz06PgLEHjm6VFd87NpH8rastvPoyv6UW2fA==
+ dependencies:
+ for-own "^0.1.4"
+ is-extendable "^0.1.1"
+
+object.values@^1.1.1, object.values@^1.1.5:
+ version "1.1.7"
+ resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a"
+ integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+
+once@^1.3.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
+ dependencies:
+ wrappy "1"
+
+onetime@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
+ integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
+ dependencies:
+ mimic-fn "^2.1.0"
+
+p-limit@^1.1.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8"
+ integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==
+ dependencies:
+ p-try "^1.0.0"
+
+p-limit@^2.0.0, p-limit@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
+ dependencies:
+ p-try "^2.0.0"
+
+p-locate@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43"
+ integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==
+ dependencies:
+ p-limit "^1.1.0"
+
+p-locate@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
+ integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==
+ dependencies:
+ p-limit "^2.0.0"
+
+p-locate@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
+ integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
+ dependencies:
+ p-limit "^2.2.0"
+
+p-try@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3"
+ integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==
+
+p-try@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
+ integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
+
+parse-glob@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
+ integrity sha512-FC5TeK0AwXzq3tUBFtH74naWkPQCEWs4K+xMxWZBlKDWu0bVHXGZa+KKqxKidd7xwhdZ19ZNuF2uO1M/r196HA==
+ dependencies:
+ glob-base "^0.3.0"
+ is-dotfile "^1.0.0"
+ is-extglob "^1.0.0"
+ is-glob "^2.0.0"
+
+parse-json@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+ integrity sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==
+ dependencies:
+ error-ex "^1.2.0"
+
+parse-json@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
+ integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ error-ex "^1.3.1"
+ json-parse-even-better-errors "^2.3.0"
+ lines-and-columns "^1.1.6"
+
+parse5-htmlparser2-tree-adapter@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz#23c2cc233bcf09bb7beba8b8a69d46b08c62c2f1"
+ integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==
+ dependencies:
+ domhandler "^5.0.2"
+ parse5 "^7.0.0"
+
+parse5@6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b"
+ integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==
+
+parse5@^7.0.0:
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32"
+ integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==
+ dependencies:
+ entities "^4.4.0"
+
+path-exists@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
+ integrity sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==
+ dependencies:
+ pinkie-promise "^2.0.0"
+
+path-exists@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
+ integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==
+
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
+
+path-key@^3.0.0, path-key@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+path-parse@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+path-type@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
+ integrity sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==
+ dependencies:
+ graceful-fs "^4.1.2"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+performance-now@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
+ integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==
+
+picocolors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
+ integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
+
+picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
+ integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+
+pify@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+ integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==
+
+pify@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
+ integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
+
+pinkie-promise@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+ integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==
+ dependencies:
+ pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+ integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==
+
+pirates@^4.0.4, pirates@^4.0.5:
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9"
+ integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==
+
+pkg-dir@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3"
+ integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==
+ dependencies:
+ find-up "^3.0.0"
+
+pkg-dir@^4.1.0, pkg-dir@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
+ integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
+ dependencies:
+ find-up "^4.0.0"
+
+pkg-up@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5"
+ integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==
+ dependencies:
+ find-up "^3.0.0"
+
+preserve@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
+ integrity sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ==
+
+pretty-format@^24.9.0:
+ version "24.9.0"
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9"
+ integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==
+ dependencies:
+ "@jest/types" "^24.9.0"
+ ansi-regex "^4.0.0"
+ ansi-styles "^3.2.0"
+ react-is "^16.8.4"
+
+pretty-format@^27.5.1:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e"
+ integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==
+ dependencies:
+ ansi-regex "^5.0.1"
+ ansi-styles "^5.0.0"
+ react-is "^17.0.1"
+
+prompts@^2.0.1:
+ version "2.4.2"
+ resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069"
+ integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==
+ dependencies:
+ kleur "^3.0.3"
+ sisteransi "^1.0.5"
+
+prop-types-exact@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/prop-types-exact/-/prop-types-exact-1.2.0.tgz#825d6be46094663848237e3925a98c6e944e9869"
+ integrity sha512-K+Tk3Kd9V0odiXFP9fwDHUYRyvK3Nun3GVyPapSIs5OBkITAm15W0CPFD/YKTkMUAbc0b9CUwRQp2ybiBIq+eA==
+ dependencies:
+ has "^1.0.3"
+ object.assign "^4.1.0"
+ reflect.ownkeys "^0.2.0"
+
+prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1:
+ version "15.8.1"
+ resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"
+ integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==
+ dependencies:
+ loose-envify "^1.4.0"
+ object-assign "^4.1.1"
+ react-is "^16.13.1"
+
+psl@^1.1.33:
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7"
+ integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==
+
+punycode@^2.1.0, punycode@^2.1.1:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f"
+ integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==
+
+querystringify@^2.1.1:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6"
+ integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==
+
+raf@^3.4.1:
+ version "3.4.1"
+ resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39"
+ integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==
+ dependencies:
+ performance-now "^2.1.0"
+
+railroad-diagrams@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz#eb7e6267548ddedfb899c1b90e57374559cddb7e"
+ integrity sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==
+
+randexp@0.4.6:
+ version "0.4.6"
+ resolved "https://registry.yarnpkg.com/randexp/-/randexp-0.4.6.tgz#e986ad5e5e31dae13ddd6f7b3019aa7c87f60ca3"
+ integrity sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==
+ dependencies:
+ discontinuous-range "1.0.0"
+ ret "~0.1.10"
+
+randomatic@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed"
+ integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==
+ dependencies:
+ is-number "^4.0.0"
+ kind-of "^6.0.0"
+ math-random "^1.0.1"
+
+react-dom@16.8.6:
+ version "16.8.6"
+ resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.8.6.tgz#71d6303f631e8b0097f56165ef608f051ff6e10f"
+ integrity sha512-1nL7PIq9LTL3fthPqwkvr2zY7phIPjYrT0jp4HjyEQrEROnw4dG41VVwi/wfoCneoleqrNX7iAD+pXebJZwrwA==
+ dependencies:
+ loose-envify "^1.1.0"
+ object-assign "^4.1.1"
+ prop-types "^15.6.2"
+ scheduler "^0.13.6"
+
+react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.4, react-is@^16.8.6:
+ version "16.13.1"
+ resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
+ integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
+
+react-is@^17.0.1:
+ version "17.0.2"
+ resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0"
+ integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==
+
+react-lifecycles-compat@^3.0.0:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362"
+ integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==
+
+react-redux@^5.0.7:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-5.1.2.tgz#b19cf9e21d694422727bf798e934a916c4080f57"
+ integrity sha512-Ns1G0XXc8hDyH/OcBHOxNgQx9ayH3SPxBnFCOidGKSle8pKihysQw2rG/PmciUQRoclhVBO8HMhiRmGXnDja9Q==
+ dependencies:
+ "@babel/runtime" "^7.1.2"
+ hoist-non-react-statics "^3.3.0"
+ invariant "^2.2.4"
+ loose-envify "^1.1.0"
+ prop-types "^15.6.1"
+ react-is "^16.6.0"
+ react-lifecycles-compat "^3.0.0"
+
+react-test-renderer@^16.0.0-0:
+ version "16.14.0"
+ resolved "https://registry.yarnpkg.com/react-test-renderer/-/react-test-renderer-16.14.0.tgz#e98360087348e260c56d4fe2315e970480c228ae"
+ integrity sha512-L8yPjqPE5CZO6rKsKXRO/rVPiaCOy0tQQJbC+UjPNlobl5mad59lvPjwFsQHTvL03caVDIVr9x9/OSgDe6I5Eg==
+ dependencies:
+ object-assign "^4.1.1"
+ prop-types "^15.6.2"
+ react-is "^16.8.6"
+ scheduler "^0.19.1"
+
+react@16.8.6:
+ version "16.8.6"
+ resolved "https://registry.yarnpkg.com/react/-/react-16.8.6.tgz#ad6c3a9614fd3a4e9ef51117f54d888da01f2bbe"
+ integrity sha512-pC0uMkhLaHm11ZSJULfOBqV4tIZkx87ZLvbbQYunNixAAvjnC+snJCg0XQXn9VIsttVsbZP/H/ewzgsd5fxKXw==
+ dependencies:
+ loose-envify "^1.1.0"
+ object-assign "^4.1.1"
+ prop-types "^15.6.2"
+ scheduler "^0.13.6"
+
+read-pkg-up@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
+ integrity sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==
+ dependencies:
+ find-up "^1.0.0"
+ read-pkg "^1.0.0"
+
+read-pkg@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
+ integrity sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==
+ dependencies:
+ load-json-file "^1.0.0"
+ normalize-package-data "^2.3.2"
+ path-type "^1.0.0"
+
+redux-mock-store@^1.5.4:
+ version "1.5.4"
+ resolved "https://registry.yarnpkg.com/redux-mock-store/-/redux-mock-store-1.5.4.tgz#90d02495fd918ddbaa96b83aef626287c9ab5872"
+ integrity sha512-xmcA0O/tjCLXhh9Fuiq6pMrJCwFRaouA8436zcikdIpYWWCjU76CRk+i2bHx8EeiSiMGnB85/lZdU3wIJVXHTA==
+ dependencies:
+ lodash.isplainobject "^4.0.6"
+
+redux@^4.0.5:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.1.tgz#c08f4306826c49b5e9dc901dee0452ea8fce6197"
+ integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==
+ dependencies:
+ "@babel/runtime" "^7.9.2"
+
+reflect.ownkeys@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz#749aceec7f3fdf8b63f927a04809e90c5c0b3460"
+ integrity sha512-qOLsBKHCpSOFKK1NUOCGC5VyeufB6lEsFe92AL2bhIJsacZS1qdoOZSbPk3MYKuT2cFlRDnulKXuuElIrMjGUg==
+
+regenerate-unicode-properties@^10.1.0:
+ version "10.1.1"
+ resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480"
+ integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==
+ dependencies:
+ regenerate "^1.4.2"
+
+regenerate@^1.4.2:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a"
+ integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==
+
+regenerator-runtime@^0.11.0:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
+ integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
+
+regenerator-runtime@^0.14.0:
+ version "0.14.0"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45"
+ integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==
+
+regenerator-transform@^0.15.2:
+ version "0.15.2"
+ resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4"
+ integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==
+ dependencies:
+ "@babel/runtime" "^7.8.4"
+
+regex-cache@^0.4.2:
+ version "0.4.4"
+ resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd"
+ integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==
+ dependencies:
+ is-equal-shallow "^0.1.3"
+
+regexp.prototype.flags@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e"
+ integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ set-function-name "^2.0.0"
+
+regexpu-core@^5.3.1:
+ version "5.3.2"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b"
+ integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==
+ dependencies:
+ "@babel/regjsgen" "^0.8.0"
+ regenerate "^1.4.2"
+ regenerate-unicode-properties "^10.1.0"
+ regjsparser "^0.9.1"
+ unicode-match-property-ecmascript "^2.0.0"
+ unicode-match-property-value-ecmascript "^2.1.0"
+
+regjsparser@^0.9.1:
+ version "0.9.1"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709"
+ integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==
+ dependencies:
+ jsesc "~0.5.0"
+
+remove-trailing-separator@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
+ integrity sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==
+
+repeat-element@^1.1.2:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9"
+ integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==
+
+repeat-string@^1.5.2:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+ integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==
+
+repeating@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
+ integrity sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==
+ dependencies:
+ is-finite "^1.0.0"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
+
+require-main-filename@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
+ integrity sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==
+
+requires-port@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
+ integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==
+
+reselect@4.1.5:
+ version "4.1.5"
+ resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.5.tgz#852c361247198da6756d07d9296c2b51eddb79f6"
+ integrity sha512-uVdlz8J7OO+ASpBYoz1Zypgx0KasCY20H+N8JD13oUMtPvSHQuscrHop4KbXrbsBcdB9Ds7lVK7eRkBIfO43vQ==
+
+reselect@^4.0.0:
+ version "4.1.8"
+ resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.8.tgz#3f5dc671ea168dccdeb3e141236f69f02eaec524"
+ integrity sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==
+
+resolve-cwd@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d"
+ integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==
+ dependencies:
+ resolve-from "^5.0.0"
+
+resolve-from@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
+ integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
+
+resolve.exports@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.1.tgz#05cfd5b3edf641571fd46fa608b610dda9ead999"
+ integrity sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==
+
+resolve@^1.10.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.1:
+ version "1.22.8"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d"
+ integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
+ dependencies:
+ is-core-module "^2.13.0"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+ret@~0.1.10:
+ version "0.1.15"
+ resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+ integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
+
+rimraf@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+ integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+ dependencies:
+ glob "^7.1.3"
+
+rollup-plugin-inject-process-env@^1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/rollup-plugin-inject-process-env/-/rollup-plugin-inject-process-env-1.3.1.tgz#2d7660fe76f2b221b976cb35597763ffcaad3db3"
+ integrity sha512-kKDoL30IZr0wxbNVJjq+OS92RJSKRbKV6B5eNW4q3mZTFqoWDh6lHy+mPDYuuGuERFNKXkG+AKxvYqC9+DRpKQ==
+ dependencies:
+ magic-string "^0.25.7"
+
+rollup-plugin-inject@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz#e4233855bfba6c0c12a312fd6649dff9a13ee9f4"
+ integrity sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==
+ dependencies:
+ estree-walker "^0.6.1"
+ magic-string "^0.25.3"
+ rollup-pluginutils "^2.8.1"
+
+rollup-plugin-node-polyfills@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz#53092a2744837164d5b8a28812ba5f3ff61109fd"
+ integrity sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==
+ dependencies:
+ rollup-plugin-inject "^3.0.0"
+
+rollup-pluginutils@^2.8.1:
+ version "2.8.2"
+ resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e"
+ integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==
+ dependencies:
+ estree-walker "^0.6.1"
+
+rollup@3.20.2:
+ version "3.20.2"
+ resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.20.2.tgz#f798c600317f216de2e4ad9f4d9ab30a89b690ff"
+ integrity sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+rst-selector-parser@^2.2.3:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz#81b230ea2fcc6066c89e3472de794285d9b03d91"
+ integrity sha512-nDG1rZeP6oFTLN6yNDV/uiAvs1+FS/KlrEwh7+y7dpuApDBy6bI2HTBcc0/V8lv9OTqfyD34eF7au2pm8aBbhA==
+ dependencies:
+ lodash.flattendeep "^4.4.0"
+ nearley "^2.7.10"
+
+safe-array-concat@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c"
+ integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.2.1"
+ has-symbols "^1.0.3"
+ isarray "^2.0.5"
+
+safe-regex-test@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295"
+ integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.1.3"
+ is-regex "^1.1.4"
+
+"safer-buffer@>= 2.1.2 < 3":
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+saxes@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d"
+ integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==
+ dependencies:
+ xmlchars "^2.2.0"
+
+scheduler@^0.13.6:
+ version "0.13.6"
+ resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.13.6.tgz#466a4ec332467b31a91b9bf74e5347072e4cd889"
+ integrity sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ==
+ dependencies:
+ loose-envify "^1.1.0"
+ object-assign "^4.1.1"
+
+scheduler@^0.19.1:
+ version "0.19.1"
+ resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196"
+ integrity sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==
+ dependencies:
+ loose-envify "^1.1.0"
+ object-assign "^4.1.1"
+
+schema-utils@^2.6.5:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7"
+ integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==
+ dependencies:
+ "@types/json-schema" "^7.0.5"
+ ajv "^6.12.4"
+ ajv-keywords "^3.5.2"
+
+"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1:
+ version "5.7.2"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8"
+ integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
+
+semver@^6.0.0, semver@^6.3.0, semver@^6.3.1:
+ version "6.3.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
+ integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
+
+semver@^7.3.2, semver@^7.5.3:
+ version "7.5.4"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e"
+ integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==
+ dependencies:
+ lru-cache "^6.0.0"
+
+set-function-length@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed"
+ integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==
+ dependencies:
+ define-data-property "^1.1.1"
+ get-intrinsic "^1.2.1"
+ gopd "^1.0.1"
+ has-property-descriptors "^1.0.0"
+
+set-function-name@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a"
+ integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==
+ dependencies:
+ define-data-property "^1.0.1"
+ functions-have-names "^1.2.3"
+ has-property-descriptors "^1.0.0"
+
+shallow-clone@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3"
+ integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==
+ dependencies:
+ kind-of "^6.0.2"
+
+shebang-command@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+ dependencies:
+ shebang-regex "^3.0.0"
+
+shebang-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+side-channel@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
+ integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
+ dependencies:
+ call-bind "^1.0.0"
+ get-intrinsic "^1.0.2"
+ object-inspect "^1.9.0"
+
+signal-exit@^3.0.2, signal-exit@^3.0.3:
+ version "3.0.7"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
+ integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
+
+sisteransi@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
+ integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==
+
+slash@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
+ integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
+source-map-support@^0.5.16, source-map-support@^0.5.6:
+ version "0.5.21"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
+ integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map@0.7.4, source-map@^0.7.3:
+ version "0.7.4"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656"
+ integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==
+
+source-map@^0.5.7:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+ integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==
+
+source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+sourcemap-codec@^1.4.8:
+ version "1.4.8"
+ resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4"
+ integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==
+
+spdx-correct@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c"
+ integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==
+ dependencies:
+ spdx-expression-parse "^3.0.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^2.1.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d"
+ integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==
+
+spdx-expression-parse@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679"
+ integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==
+ dependencies:
+ spdx-exceptions "^2.1.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+ version "3.0.16"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz#a14f64e0954f6e25cc6587bd4f392522db0d998f"
+ integrity sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+ integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==
+
+stack-utils@^2.0.3:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f"
+ integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==
+ dependencies:
+ escape-string-regexp "^2.0.0"
+
+string-length@^4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a"
+ integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==
+ dependencies:
+ char-regex "^1.0.2"
+ strip-ansi "^6.0.0"
+
+string-width@^4.1.0, string-width@^4.2.0:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
+
+string.prototype.trim@^1.2.1, string.prototype.trim@^1.2.8:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd"
+ integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+
+string.prototype.trimend@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e"
+ integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+
+string.prototype.trimstart@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298"
+ integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.2.0"
+ es-abstract "^1.22.1"
+
+strip-ansi@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+ integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==
+ dependencies:
+ ansi-regex "^2.0.0"
+
+strip-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f"
+ integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==
+ dependencies:
+ ansi-regex "^3.0.0"
+
+strip-ansi@^6.0.0, strip-ansi@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
+strip-bom@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
+ integrity sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==
+ dependencies:
+ is-utf8 "^0.2.0"
+
+strip-bom@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878"
+ integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==
+
+strip-final-newline@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
+ integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
+
+strip-json-comments@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
+ integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
+
+supports-color@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+ integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==
+
+supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^7.0.0, supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
+supports-color@^8.0.0:
+ version "8.1.1"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
+ integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
+ dependencies:
+ has-flag "^4.0.0"
+
+supports-hyperlinks@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz#3943544347c1ff90b15effb03fc14ae45ec10624"
+ integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==
+ dependencies:
+ has-flag "^4.0.0"
+ supports-color "^7.0.0"
+
+supports-preserve-symlinks-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
+ integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+
+symbol-tree@^3.2.4:
+ version "3.2.4"
+ resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
+ integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
+
+terminal-link@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994"
+ integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==
+ dependencies:
+ ansi-escapes "^4.2.1"
+ supports-hyperlinks "^2.0.0"
+
+test-exclude@^4.2.1:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.3.tgz#a9a5e64474e4398339245a0a769ad7c2f4a97c20"
+ integrity sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA==
+ dependencies:
+ arrify "^1.0.1"
+ micromatch "^2.3.11"
+ object-assign "^4.1.0"
+ read-pkg-up "^1.0.1"
+ require-main-filename "^1.0.1"
+
+test-exclude@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e"
+ integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==
+ dependencies:
+ "@istanbuljs/schema" "^0.1.2"
+ glob "^7.1.4"
+ minimatch "^3.0.4"
+
+throat@^6.0.1:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.2.tgz#51a3fbb5e11ae72e2cf74861ed5c8020f89f29fe"
+ integrity sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==
+
+tmpl@1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc"
+ integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==
+
+to-fast-properties@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
+ integrity sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==
+
+to-fast-properties@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
+ integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
+tough-cookie@^4.0.0:
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.3.tgz#97b9adb0728b42280aa3d814b6b999b2ff0318bf"
+ integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==
+ dependencies:
+ psl "^1.1.33"
+ punycode "^2.1.1"
+ universalify "^0.2.0"
+ url-parse "^1.5.3"
+
+tr46@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240"
+ integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==
+ dependencies:
+ punycode "^2.1.1"
+
+trim-right@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
+ integrity sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==
+
+type-detect@4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
+ integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
+
+type-fest@^0.21.3:
+ version "0.21.3"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
+ integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
+
+typed-array-buffer@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60"
+ integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.2.1"
+ is-typed-array "^1.1.10"
+
+typed-array-byte-length@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0"
+ integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==
+ dependencies:
+ call-bind "^1.0.2"
+ for-each "^0.3.3"
+ has-proto "^1.0.1"
+ is-typed-array "^1.1.10"
+
+typed-array-byte-offset@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b"
+ integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==
+ dependencies:
+ available-typed-arrays "^1.0.5"
+ call-bind "^1.0.2"
+ for-each "^0.3.3"
+ has-proto "^1.0.1"
+ is-typed-array "^1.1.10"
+
+typed-array-length@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb"
+ integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==
+ dependencies:
+ call-bind "^1.0.2"
+ for-each "^0.3.3"
+ is-typed-array "^1.1.9"
+
+typedarray-to-buffer@^3.1.5:
+ version "3.1.5"
+ resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
+ integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
+ dependencies:
+ is-typedarray "^1.0.0"
+
+unbox-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e"
+ integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==
+ dependencies:
+ call-bind "^1.0.2"
+ has-bigints "^1.0.2"
+ has-symbols "^1.0.3"
+ which-boxed-primitive "^1.0.2"
+
+undici-types@~5.25.1:
+ version "5.25.3"
+ resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.25.3.tgz#e044115914c85f0bcbb229f346ab739f064998c3"
+ integrity sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==
+
+unicode-canonical-property-names-ecmascript@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc"
+ integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==
+
+unicode-match-property-ecmascript@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3"
+ integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==
+ dependencies:
+ unicode-canonical-property-names-ecmascript "^2.0.0"
+ unicode-property-aliases-ecmascript "^2.0.0"
+
+unicode-match-property-value-ecmascript@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0"
+ integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==
+
+unicode-property-aliases-ecmascript@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd"
+ integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==
+
+universalify@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0"
+ integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==
+
+update-browserslist-db@^1.0.13:
+ version "1.0.13"
+ resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4"
+ integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==
+ dependencies:
+ escalade "^3.1.1"
+ picocolors "^1.0.0"
+
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
+url-parse@^1.5.3:
+ version "1.5.10"
+ resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1"
+ integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==
+ dependencies:
+ querystringify "^2.1.1"
+ requires-port "^1.0.0"
+
+v8-to-istanbul@^8.1.0:
+ version "8.1.1"
+ resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz#77b752fd3975e31bbcef938f85e9bd1c7a8d60ed"
+ integrity sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==
+ dependencies:
+ "@types/istanbul-lib-coverage" "^2.0.1"
+ convert-source-map "^1.6.0"
+ source-map "^0.7.3"
+
+validate-npm-package-license@^3.0.1:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
+ integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
+ dependencies:
+ spdx-correct "^3.0.0"
+ spdx-expression-parse "^3.0.0"
+
+w3c-hr-time@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd"
+ integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==
+ dependencies:
+ browser-process-hrtime "^1.0.0"
+
+w3c-xmlserializer@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a"
+ integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==
+ dependencies:
+ xml-name-validator "^3.0.0"
+
+walker@^1.0.7:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f"
+ integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==
+ dependencies:
+ makeerror "1.0.12"
+
+wasmparser@^3.1.1:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/wasmparser/-/wasmparser-3.3.1.tgz#7d4e8b00cc073d041a51decc2bbcde7b8727b33f"
+ integrity sha512-s83BYi/hNpDthj0C1btJFb5yPIM6wfMK6fcGd8VUqPPCOR0hWhN0ySkYLzwCLsOlfGpODLyBZFnvofP4cDa6Dg==
+ dependencies:
+ "@types/node" "^14.0.13"
+
+webidl-conversions@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff"
+ integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==
+
+webidl-conversions@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514"
+ integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==
+
+whatwg-encoding@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0"
+ integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==
+ dependencies:
+ iconv-lite "0.4.24"
+
+whatwg-mimetype@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf"
+ integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==
+
+whatwg-url@^8.0.0, whatwg-url@^8.5.0:
+ version "8.7.0"
+ resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.7.0.tgz#656a78e510ff8f3937bc0bcbe9f5c0ac35941b77"
+ integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==
+ dependencies:
+ lodash "^4.7.0"
+ tr46 "^2.1.0"
+ webidl-conversions "^6.1.0"
+
+which-boxed-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
+ integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
+ dependencies:
+ is-bigint "^1.0.1"
+ is-boolean-object "^1.1.0"
+ is-number-object "^1.0.4"
+ is-string "^1.0.5"
+ is-symbol "^1.0.3"
+
+which-typed-array@^1.1.11, which-typed-array@^1.1.13:
+ version "1.1.13"
+ resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36"
+ integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==
+ dependencies:
+ available-typed-arrays "^1.0.5"
+ call-bind "^1.0.4"
+ for-each "^0.3.3"
+ gopd "^1.0.1"
+ has-tostringtag "^1.0.0"
+
+which@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
+"workerjs@github:jasonLaster/workerjs#1944c8b753cc9e84b6ed0cb2fbcaa25600706446":
+ version "0.1.3"
+ resolved "https://codeload.github.com/jasonLaster/workerjs/tar.gz/1944c8b753cc9e84b6ed0cb2fbcaa25600706446"
+ dependencies:
+ "@babel/core" "^7.0.0"
+ "@babel/register" "^7.0.0"
+
+wrap-ansi@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
+
+write-file-atomic@^3.0.0:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8"
+ integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==
+ dependencies:
+ imurmurhash "^0.1.4"
+ is-typedarray "^1.0.0"
+ signal-exit "^3.0.2"
+ typedarray-to-buffer "^3.1.5"
+
+ws@^7.4.6:
+ version "7.5.9"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591"
+ integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==
+
+xml-name-validator@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
+ integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==
+
+xml@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/xml/-/xml-1.0.1.tgz#78ba72020029c5bc87b8a81a3cfcd74b4a2fc1e5"
+ integrity sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==
+
+xmlchars@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"
+ integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==
+
+y18n@^5.0.5:
+ version "5.0.8"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55"
+ integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==
+
+yallist@^3.0.2:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd"
+ integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==
+
+yallist@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+ integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+yargs-parser@^20.2.2:
+ version "20.2.9"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
+ integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
+
+yargs@^16.2.0:
+ version "16.2.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
+ integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==
+ dependencies:
+ cliui "^7.0.2"
+ escalade "^3.1.1"
+ get-caller-file "^2.0.5"
+ require-directory "^2.1.1"
+ string-width "^4.2.0"
+ y18n "^5.0.5"
+ yargs-parser "^20.2.2"